From 680f4ce11ad03e0ce3367f5bc7ee36871425f7b7 Mon Sep 17 00:00:00 2001 From: Yash Jha Date: Tue, 31 Oct 2023 11:40:07 -0600 Subject: [PATCH 1/3] changes to the python libraries --- dash/_callback.py | 12 +++++++++++- dash/_utils.py | 6 ++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/dash/_callback.py b/dash/_callback.py index db682fd808..4243716f4e 100644 --- a/dash/_callback.py +++ b/dash/_callback.py @@ -62,6 +62,7 @@ def callback( cancel=None, manager=None, cache_args_to_ignore=None, + force_no_output=False, **_kwargs, ): """ @@ -183,6 +184,7 @@ def callback( *_args, **_kwargs, long=long_spec, + force_no_output=force_no_output, manager=manager, ) @@ -224,6 +226,7 @@ def insert_callback( long=None, manager=None, dynamic_creator=False, + force_no_output=False ): if prevent_initial_call is None: prevent_initial_call = config_prevent_initial_callbacks @@ -246,6 +249,7 @@ def insert_callback( "interval": long["interval"], }, "dynamic_creator": dynamic_creator, + "force_no_output":force_no_output, } callback_map[callback_id] = { @@ -286,6 +290,7 @@ def register_callback( # pylint: disable=R0914 long = _kwargs.get("long") manager = _kwargs.get("manager") allow_dynamic_callbacks = _kwargs.get("_allow_dynamic_callbacks") + force_no_output = _kwargs.get("force_no_output") output_indices = make_grouping_by_index(output, list(range(grouping_len(output)))) callback_id = insert_callback( @@ -301,6 +306,7 @@ def register_callback( # pylint: disable=R0914 long=long, manager=manager, dynamic_creator=allow_dynamic_callbacks, + force_no_output=force_no_output ) # pylint: disable=too-many-locals @@ -455,7 +461,11 @@ def add_context(*args, **kwargs): # Flatten grouping and validate grouping structure flat_output_values = flatten_grouping(output_value, output) - + if len(output): + flat_output_values = flatten_grouping(output_value, output) + else: + # for no output callback + flat_output_values = [] _validate.validate_multi_return( output_spec, flat_output_values, callback_id ) diff --git a/dash/_utils.py b/dash/_utils.py index 5b3b1d62e1..03c67c2969 100644 --- a/dash/_utils.py +++ b/dash/_utils.py @@ -150,6 +150,12 @@ def _concat(x): return _id if isinstance(output, (list, tuple)): + if len(output) == 0: + if not hashed_inputs: + hashed_inputs = hashlib.md5( + ".".join(str(x) for x in inputs).encode("utf-8") + ).hexdigest() + return ".."+hashed_inputs+".." return ".." + "...".join(_concat(x) for x in output) + ".." return _concat(output) From ecaf448a9fcdf0329f6b47d903a3be98038de651 Mon Sep 17 00:00:00 2001 From: Yash Jha Date: Tue, 31 Oct 2023 11:45:49 -0600 Subject: [PATCH 2/3] force no-outputs in the dash-renderer --- dash/dash-renderer/src/actions/callbacks.ts | 3 +- .../dash-renderer/src/actions/dependencies.js | 32 ++++++++++++------- dash/dash-renderer/src/types/callbacks.ts | 2 ++ 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/dash/dash-renderer/src/actions/callbacks.ts b/dash/dash-renderer/src/actions/callbacks.ts index d936d6f915..4e3d6f4ca7 100644 --- a/dash/dash-renderer/src/actions/callbacks.ts +++ b/dash/dash-renderer/src/actions/callbacks.ts @@ -586,7 +586,7 @@ export function executeCallback( dispatch: any, getState: any ): IExecutingCallback { - const {output, inputs, state, clientside_function, long, dynamic_creator} = + const {output, inputs, state, clientside_function, long, dynamic_creator, force_no_output} = cb.callback; try { const inVals = fillVals(paths, layout, cb, inputs, 'Input', true); @@ -636,6 +636,7 @@ export function executeCallback( outputs: isMultiOutputProp(output) ? outputs : outputs[0], inputs: inVals, changedPropIds: keys(cb.changedPropIds), + force_no_output: force_no_output, state: cb.callback.state.length ? fillVals(paths, layout, cb, state, 'State') : undefined diff --git a/dash/dash-renderer/src/actions/dependencies.js b/dash/dash-renderer/src/actions/dependencies.js index 34f7a90f59..57f6baa468 100644 --- a/dash/dash-renderer/src/actions/dependencies.js +++ b/dash/dash-renderer/src/actions/dependencies.js @@ -191,10 +191,12 @@ function validateDependencies(parsedDependencies, dispatchError) { let hasOutputs = true; if (outputs.length === 1 && !outputs[0].id && !outputs[0].property) { hasOutputs = false; - dispatchError('A callback is missing Outputs', [ - 'Please provide an output for this callback:', - JSON.stringify(dep, null, 2) - ]); + if (!force_no_output) { + dispatchError('A callback is missing Outputs', [ + 'Please provide an output for this callback:', + JSON.stringify(dep, null, 2) + ]); + } } const head = @@ -239,7 +241,9 @@ function validateDependencies(parsedDependencies, dispatchError) { }); findDuplicateOutputs(outputs, head, dispatchError, outStrs, outObjs); - findMismatchedWildcards(outputs, inputs, state, head, dispatchError); + if (!force_no_output) { + findMismatchedWildcards(outputs, inputs, state, head, dispatchError); + } }); } @@ -605,12 +609,16 @@ export function computeGraphs(dependencies, dispatchError) { const fixIds = map(evolve({id: parseIfWildcard})); const parsedDependencies = map(dep => { - const {output} = dep; + const {output, force_no_output} = dep; const out = evolve({inputs: fixIds, state: fixIds}, dep); - out.outputs = map( - outi => assoc('out', true, splitIdAndProp(outi)), - isMultiOutputProp(output) ? parseMultipleOutputs(output) : [output] - ); + if(!force_no_output){ + out.outputs = map( + outi => assoc('out', true, splitIdAndProp(outi)), + isMultiOutputProp(output) ? parseMultipleOutputs(output) : [output] + ); + } else { + out.outputs = []; + } return out; }, dependencies); @@ -809,7 +817,7 @@ export function computeGraphs(dependencies, dispatchError) { // Also collect MATCH keys in the output (all outputs must share these) // and ALL keys in the first output (need not be shared but we'll use // the first output for calculations) for later convenience. - const {matchKeys} = findWildcardKeys(outputs[0].id); + const {matchKeys} = findWildcardKeys(outputs.length ? outputs[0].id : undefined); const firstSingleOutput = findIndex(o => !isMultiValued(o.id), outputs); const finalDependency = mergeRight( {matchKeys, firstSingleOutput, outputs}, @@ -1091,7 +1099,7 @@ export function addAllResolvedFromOutputs(resolve, paths, matches) { } } else { const cb = makeResolvedCallback(callback, resolve, ''); - if (flatten(cb.getOutputs(paths)).length) { + if (flatten(cb.getOutputs(paths)).length || callback.force_no_output) { matches.push(cb); } } diff --git a/dash/dash-renderer/src/types/callbacks.ts b/dash/dash-renderer/src/types/callbacks.ts index b98bfd6f00..387833539c 100644 --- a/dash/dash-renderer/src/types/callbacks.ts +++ b/dash/dash-renderer/src/types/callbacks.ts @@ -13,6 +13,7 @@ export interface ICallbackDefinition { state: ICallbackProperty[]; long?: LongCallbackInfo; dynamic_creator?: boolean; + force_no_output: boolean; } export interface ICallbackProperty { @@ -74,6 +75,7 @@ export interface ICallbackPayload { output: string; outputs: any[]; state?: any[] | null; + force_no_output: boolean; } export type CallbackResult = { From adfe700eff74edf8b2803d67e74e6fe514301bc6 Mon Sep 17 00:00:00 2001 From: Yash Jha Date: Tue, 31 Oct 2023 12:19:52 -0600 Subject: [PATCH 3/3] bypassing all warnings for callbacks without outputs --- dash/_callback.py | 1 - dash/dash-renderer/build/dash_renderer.dev.js | 105782 +++++++-------- dash/dash-renderer/build/dash_renderer.min.js | 2 +- .../dash-renderer/src/actions/dependencies.js | 10 +- dash/dash-renderer/webpack.base.config.js | 2 +- dash/dash.py | 31 +- 6 files changed, 46321 insertions(+), 59507 deletions(-) diff --git a/dash/_callback.py b/dash/_callback.py index 4243716f4e..59492697b7 100644 --- a/dash/_callback.py +++ b/dash/_callback.py @@ -460,7 +460,6 @@ def add_context(*args, **kwargs): output_value = list(output_value) # Flatten grouping and validate grouping structure - flat_output_values = flatten_grouping(output_value, output) if len(output): flat_output_values = flatten_grouping(output_value, output) else: diff --git a/dash/dash-renderer/build/dash_renderer.dev.js b/dash/dash-renderer/build/dash_renderer.dev.js index ac1d8ad0f5..cb0e426b75 100644 --- a/dash/dash-renderer/build/dash_renderer.dev.js +++ b/dash/dash-renderer/build/dash_renderer.dev.js @@ -205,6 +205,359 @@ var SvgOffIcon = function SvgOffIcon(props) { /***/ }), +/***/ "./src/APIController.react.js": +/*!************************************!*\ + !*** ./src/APIController.react.js ***! + \************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ DashContext: function() { return /* binding */ DashContext; } +/* harmony export */ }); +/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/includes.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/isEmpty.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "prop-types"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _TreeContainer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./TreeContainer */ "./src/TreeContainer.js"); +/* harmony import */ var _components_error_GlobalErrorContainer_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/error/GlobalErrorContainer.react */ "./src/components/error/GlobalErrorContainer.react.js"); +/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./actions */ "./src/actions/index.js"); +/* harmony import */ var _actions_paths__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./actions/paths */ "./src/actions/paths.js"); +/* harmony import */ var _actions_dependencies__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./actions/dependencies */ "./src/actions/dependencies.js"); +/* harmony import */ var _actions_api__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./actions/api */ "./src/actions/api.js"); +/* harmony import */ var _actions_utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./actions/utils */ "./src/actions/utils.js"); +/* harmony import */ var _persistence__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./persistence */ "./src/persistence.js"); +/* harmony import */ var _reducers_constants__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./reducers/constants */ "./src/reducers/constants.js"); +/* harmony import */ var _constants_constants__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./constants/constants */ "./src/constants/constants.js"); +/* harmony import */ var _utils_TreeContainer__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./utils/TreeContainer */ "./src/utils/TreeContainer.ts"); +/* harmony import */ var _utils_wait__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./utils/wait */ "./src/utils/wait.ts"); +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(typeof e + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + + + + + + + + + + + + + + + + +var DashContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_1__.createContext)({}); + +/** + * Fire off API calls for initialization + * @param {*} props props + * @returns {*} component + */ +var UnconnectedContainer = function UnconnectedContainer(props) { + var appLifecycle = props.appLifecycle, + config = props.config, + dependenciesRequest = props.dependenciesRequest, + error = props.error, + layoutRequest = props.layoutRequest, + layout = props.layout, + loadingMap = props.loadingMap; + var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false), + _useState2 = _slicedToArray(_useState, 2), + errorLoading = _useState2[0], + setErrorLoading = _useState2[1]; + var events = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); + if (!events.current) { + events.current = new _actions_utils__WEBPACK_IMPORTED_MODULE_9__.EventEmitter(); + } + var renderedTree = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(false); + var propsRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)({}); + propsRef.current = props; + var provider = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)({ + fn: function fn() { + return { + _dashprivate_config: propsRef.current.config, + _dashprivate_dispatch: propsRef.current.dispatch, + _dashprivate_graphs: propsRef.current.graphs, + _dashprivate_loadingMap: propsRef.current.loadingMap + }; + } + }); + (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(storeEffect.bind(null, props, events, setErrorLoading)); + (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { + if (renderedTree.current) { + _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + renderedTree.current = false; + _context.next = 3; + return (0,_utils_wait__WEBPACK_IMPORTED_MODULE_14__["default"])(0); + case 3: + events.current.emit('rendered'); + case 4: + case "end": + return _context.stop(); + } + }, _callee); + }))(); + } + }); + (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { + if (config.serve_locally) { + window._dashPlotlyJSURL = "".concat(config.requests_pathname_prefix, "_dash-component-suites/plotly/package_data/plotly.min.js"); + } else { + window._dashPlotlyJSURL = config.plotlyjs_url; + } + }, []); + var content; + if (layoutRequest.status && !(0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])(layoutRequest.status, [_constants_constants__WEBPACK_IMPORTED_MODULE_12__.STATUS.OK, 'loading'])) { + content = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { + className: "_dash-error" + }, "Error loading layout"); + } else if (errorLoading || dependenciesRequest.status && !(0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])(dependenciesRequest.status, [_constants_constants__WEBPACK_IMPORTED_MODULE_12__.STATUS.OK, 'loading'])) { + content = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { + className: "_dash-error" + }, "Error loading dependencies"); + } else if (appLifecycle === (0,_reducers_constants__WEBPACK_IMPORTED_MODULE_11__.getAppState)('HYDRATED')) { + renderedTree.current = true; + content = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(DashContext.Provider, { + value: provider.current + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_TreeContainer__WEBPACK_IMPORTED_MODULE_3__["default"], { + _dashprivate_error: error, + _dashprivate_layout: layout, + _dashprivate_loadingState: (0,_utils_TreeContainer__WEBPACK_IMPORTED_MODULE_13__.getLoadingState)(layout, [], loadingMap), + _dashprivate_loadingStateHash: (0,_utils_TreeContainer__WEBPACK_IMPORTED_MODULE_13__.getLoadingHash)([], loadingMap), + _dashprivate_path: JSON.stringify([]) + })); + } else { + content = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { + className: "_dash-loading" + }, "Loading..."); + } + return config && config.ui === true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_error_GlobalErrorContainer_react__WEBPACK_IMPORTED_MODULE_4__["default"], null, content) : content; +}; +function storeEffect(props, events, setErrorLoading) { + var appLifecycle = props.appLifecycle, + dependenciesRequest = props.dependenciesRequest, + dispatch = props.dispatch, + error = props.error, + graphs = props.graphs, + hooks = props.hooks, + layout = props.layout, + layoutRequest = props.layoutRequest; + (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.batch)(function () { + if ((0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(layoutRequest)) { + if (typeof hooks.layout_pre === 'function') { + hooks.layout_pre(); + } + dispatch((0,_actions_api__WEBPACK_IMPORTED_MODULE_8__["default"])('_dash-layout', 'GET', 'layoutRequest')); + } else if (layoutRequest.status === _constants_constants__WEBPACK_IMPORTED_MODULE_12__.STATUS.OK) { + if ((0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(layout)) { + if (typeof hooks.layout_post === 'function') { + hooks.layout_post(layoutRequest.content); + } + var finalLayout = (0,_persistence__WEBPACK_IMPORTED_MODULE_10__.applyPersistence)(layoutRequest.content, dispatch); + dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_5__.setPaths)((0,_actions_paths__WEBPACK_IMPORTED_MODULE_6__.computePaths)(finalLayout, [], null, events.current))); + dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_5__.setLayout)(finalLayout)); + } + } + if ((0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(dependenciesRequest)) { + dispatch((0,_actions_api__WEBPACK_IMPORTED_MODULE_8__["default"])('_dash-dependencies', 'GET', 'dependenciesRequest')); + } else if (dependenciesRequest.status === _constants_constants__WEBPACK_IMPORTED_MODULE_12__.STATUS.OK && (0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(graphs)) { + dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_5__.setGraphs)((0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_7__.computeGraphs)(dependenciesRequest.content, (0,_actions__WEBPACK_IMPORTED_MODULE_5__.dispatchError)(dispatch)))); + } + if ( + // dependenciesRequest and its computed stores + dependenciesRequest.status === _constants_constants__WEBPACK_IMPORTED_MODULE_12__.STATUS.OK && !(0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(graphs) && + // LayoutRequest and its computed stores + layoutRequest.status === _constants_constants__WEBPACK_IMPORTED_MODULE_12__.STATUS.OK && !(0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(layout) && + // Hasn't already hydrated + appLifecycle === (0,_reducers_constants__WEBPACK_IMPORTED_MODULE_11__.getAppState)('STARTED')) { + var hasError = false; + try { + dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_5__.hydrateInitialOutputs)((0,_actions__WEBPACK_IMPORTED_MODULE_5__.dispatchError)(dispatch))); + } catch (err) { + // Display this error in devtools, unless we have errors + // already, in which case we assume this new one is moot + if (!error.frontEnd.length && !error.backEnd.length) { + dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_5__.onError)({ + type: 'backEnd', + error: err + })); + } + hasError = true; + } finally { + setErrorLoading(hasError); + } + } + }); +} +UnconnectedContainer.propTypes = { + appLifecycle: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOf([(0,_reducers_constants__WEBPACK_IMPORTED_MODULE_11__.getAppState)('STARTED'), (0,_reducers_constants__WEBPACK_IMPORTED_MODULE_11__.getAppState)('HYDRATED'), (0,_reducers_constants__WEBPACK_IMPORTED_MODULE_11__.getAppState)('DESTROYED')]), + dispatch: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func), + dependenciesRequest: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object), + graphs: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object), + hooks: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object), + layoutRequest: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object), + layout: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object), + loadingMap: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().any), + history: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().any), + error: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object), + config: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object) +}; +var Container = (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)( +// map state to props +function (state) { + return { + appLifecycle: state.appLifecycle, + dependenciesRequest: state.dependenciesRequest, + hooks: state.hooks, + layoutRequest: state.layoutRequest, + layout: state.layout, + loadingMap: state.loadingMap, + graphs: state.graphs, + history: state.history, + error: state.error, + config: state.config + }; +}, function (dispatch) { + return { + dispatch + }; +})(UnconnectedContainer); +/* harmony default export */ __webpack_exports__["default"] = (Container); + +/***/ }), + +/***/ "./src/AppContainer.react.js": +/*!***********************************!*\ + !*** ./src/AppContainer.react.js ***! + \***********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "prop-types"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _APIController_react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./APIController.react */ "./src/APIController.react.js"); +/* harmony import */ var _components_core_Loading_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/core/Loading.react */ "./src/components/core/Loading.react.js"); +/* harmony import */ var _components_core_Toolbar_react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/core/Toolbar.react */ "./src/components/core/Toolbar.react.js"); +/* harmony import */ var _components_core_Reloader_react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/core/Reloader.react */ "./src/components/core/Reloader.react.js"); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./config */ "./src/config.ts"); +/* harmony import */ var _actions_index__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./actions/index */ "./src/actions/index.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/memoizeWith.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/identity.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/type.js"); +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + + + + + + + + + + +var UnconnectedAppContainer = /*#__PURE__*/function (_React$Component) { + _inherits(UnconnectedAppContainer, _React$Component); + var _super = _createSuper(UnconnectedAppContainer); + function UnconnectedAppContainer(props) { + var _this; + _classCallCheck(this, UnconnectedAppContainer); + _this = _super.call(this, props); + if (props.hooks.layout_pre !== null || props.hooks.layout_post !== null || props.hooks.request_pre !== null || props.hooks.request_post !== null || props.hooks.callback_resolved !== null || props.hooks.request_refresh_jwt !== null) { + var hooks = props.hooks; + if (hooks.request_refresh_jwt) { + hooks = _objectSpread(_objectSpread({}, hooks), {}, { + request_refresh_jwt: (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(ramda__WEBPACK_IMPORTED_MODULE_10__["default"], hooks.request_refresh_jwt) + }); + } + props.dispatch((0,_actions_index__WEBPACK_IMPORTED_MODULE_8__.setHooks)(hooks)); + } + return _this; + } + _createClass(UnconnectedAppContainer, [{ + key: "UNSAFE_componentWillMount", + value: function UNSAFE_componentWillMount() { + var dispatch = this.props.dispatch; + var config = (0,_config__WEBPACK_IMPORTED_MODULE_7__["default"])(); + + // preset common request params in the config + config.fetch = { + credentials: 'same-origin', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json' + } + }; + dispatch((0,_actions_index__WEBPACK_IMPORTED_MODULE_8__.setConfig)(config)); + } + }, { + key: "render", + value: function render() { + var config = this.props.config; + if ((0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(config) === 'Null') { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { + className: "_dash-loading" + }, "Loading..."); + } + var show_undo_redo = config.show_undo_redo; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement((react__WEBPACK_IMPORTED_MODULE_1___default().Fragment), null, show_undo_redo ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_core_Toolbar_react__WEBPACK_IMPORTED_MODULE_5__["default"], null) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_APIController_react__WEBPACK_IMPORTED_MODULE_3__["default"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_core_Loading_react__WEBPACK_IMPORTED_MODULE_4__["default"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_core_Reloader_react__WEBPACK_IMPORTED_MODULE_6__["default"], null)); + } + }]); + return UnconnectedAppContainer; +}((react__WEBPACK_IMPORTED_MODULE_1___default().Component)); +UnconnectedAppContainer.propTypes = { + hooks: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object), + dispatch: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func), + config: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object) +}; +var AppContainer = (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(function (state) { + return { + history: state.history, + config: state.config + }; +}, function (dispatch) { + return { + dispatch + }; +})(UnconnectedAppContainer); +/* harmony default export */ __webpack_exports__["default"] = (AppContainer); + +/***/ }), + /***/ "./src/AppProvider.react.tsx": /*!***********************************!*\ !*** ./src/AppProvider.react.tsx ***! @@ -266,6 +619,49 @@ AppProvider.defaultProps = { }; /* harmony default export */ __webpack_exports__["default"] = (AppProvider); +/***/ }), + +/***/ "./src/DashRenderer.js": +/*!*****************************!*\ + !*** ./src/DashRenderer.js ***! + \*****************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ DashRenderer: function() { return /* binding */ DashRenderer; } +/* harmony export */ }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ "react-dom"); +/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _AppProvider_react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AppProvider.react */ "./src/AppProvider.react.tsx"); +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + + +var DashRenderer = /*#__PURE__*/_createClass(function DashRenderer(hooks) { + _classCallCheck(this, DashRenderer); + // render Dash Renderer upon initialising! + var container = document.getElementById('react-entry-point'); + if ((react_dom__WEBPACK_IMPORTED_MODULE_1___default().createRoot)) { + var root = react_dom__WEBPACK_IMPORTED_MODULE_1___default().createRoot(container); + root.render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_AppProvider_react__WEBPACK_IMPORTED_MODULE_2__["default"], { + hooks: hooks + })); + } else { + react_dom__WEBPACK_IMPORTED_MODULE_1___default().render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_AppProvider_react__WEBPACK_IMPORTED_MODULE_2__["default"], { + hooks: hooks + }), container); + } +}); + + /***/ }), /***/ "./src/StoreObserver.ts": @@ -279,7 +675,10 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ StoreObserver; } /* harmony export */ }); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/map.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/filter.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/any.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -327,7 +726,7 @@ var StoreObserver = /*#__PURE__*/_createClass(function StoreObserver(_store) { }); _defineProperty(this, "add", function (observer, inputs) { return _this._observers.push({ - inputPaths: (0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (p) { + inputPaths: (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(function (p) { return p.split('.'); }, inputs), lastState: null, @@ -341,9 +740,9 @@ var StoreObserver = /*#__PURE__*/_createClass(function StoreObserver(_store) { return; } var state = store.getState(); - var triggered = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.filter)(function (o) { - return !o.triggered && (0,ramda__WEBPACK_IMPORTED_MODULE_0__.any)(function (i) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(i, state) !== (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(i, o.lastState); + var triggered = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(function (o) { + return !o.triggered && (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (i) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(i, state) !== (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(i, o.lastState); }, o.inputPaths); }, _this._observers); triggered.forEach(function (o) { @@ -366,62 +765,70 @@ var StoreObserver = /*#__PURE__*/_createClass(function StoreObserver(_store) { /***/ }), -/***/ "./src/actions/callbacks.ts": -/*!**********************************!*\ - !*** ./src/actions/callbacks.ts ***! - \**********************************/ +/***/ "./src/TreeContainer.js": +/*!******************************!*\ + !*** ./src/TreeContainer.js ***! + \******************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ addBlockedCallbacks: function() { return /* binding */ addBlockedCallbacks; }, -/* harmony export */ addCompletedCallbacks: function() { return /* binding */ addCompletedCallbacks; }, -/* harmony export */ addExecutedCallbacks: function() { return /* binding */ addExecutedCallbacks; }, -/* harmony export */ addExecutingCallbacks: function() { return /* binding */ addExecutingCallbacks; }, -/* harmony export */ addPrioritizedCallbacks: function() { return /* binding */ addPrioritizedCallbacks; }, -/* harmony export */ addRequestedCallbacks: function() { return /* binding */ addRequestedCallbacks; }, -/* harmony export */ addStoredCallbacks: function() { return /* binding */ addStoredCallbacks; }, -/* harmony export */ addWatchedCallbacks: function() { return /* binding */ addWatchedCallbacks; }, -/* harmony export */ aggregateCallbacks: function() { return /* binding */ aggregateCallbacks; }, -/* harmony export */ executeCallback: function() { return /* binding */ executeCallback; }, -/* harmony export */ removeBlockedCallbacks: function() { return /* binding */ removeBlockedCallbacks; }, -/* harmony export */ removeExecutedCallbacks: function() { return /* binding */ removeExecutedCallbacks; }, -/* harmony export */ removeExecutingCallbacks: function() { return /* binding */ removeExecutingCallbacks; }, -/* harmony export */ removePrioritizedCallbacks: function() { return /* binding */ removePrioritizedCallbacks; }, -/* harmony export */ removeRequestedCallbacks: function() { return /* binding */ removeRequestedCallbacks; }, -/* harmony export */ removeStoredCallbacks: function() { return /* binding */ removeStoredCallbacks; }, -/* harmony export */ removeWatchedCallbacks: function() { return /* binding */ removeWatchedCallbacks; } -/* harmony export */ }); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var _constants_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants/constants */ "./src/constants/constants.js"); -/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ "./src/actions/constants.js"); -/* harmony import */ var _reducers_callbacks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../reducers/callbacks */ "./src/reducers/callbacks.ts"); -/* harmony import */ var _dependencies__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dependencies */ "./src/actions/dependencies.js"); -/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils */ "./src/actions/utils.js"); -/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./index */ "./src/actions/index.js"); -/* harmony import */ var redux_actions__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! redux-actions */ "./node_modules/redux-actions/es/createAction.js"); -/* harmony import */ var _patch__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./patch */ "./src/actions/patch.ts"); -/* harmony import */ var _paths__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./paths */ "./src/actions/paths.js"); -/* harmony import */ var _requestDependencies__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./requestDependencies */ "./src/actions/requestDependencies.ts"); -function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(typeof e + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "prop-types"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _registry__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./registry */ "./src/registry.js"); +/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./exceptions */ "./src/exceptions.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mergeRight.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/type.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/has.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pickBy.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/equals.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/isEmpty.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/keys.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pick.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/isNil.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/addIndex.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/map.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/concat.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pathOr.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/dissoc.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mapObjIndexed.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assocPath.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assoc.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/propOr.js"); +/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./actions */ "./src/actions/index.js"); +/* harmony import */ var _isSimpleComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./isSimpleComponent */ "./src/isSimpleComponent.js"); +/* harmony import */ var _persistence__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./persistence */ "./src/persistence.js"); +/* harmony import */ var _components_error_ComponentErrorBoundary_react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/error/ComponentErrorBoundary.react */ "./src/components/error/ComponentErrorBoundary.react.js"); +/* harmony import */ var _checkPropTypes__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./checkPropTypes */ "./src/checkPropTypes.js"); +/* harmony import */ var _actions_dependencies__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./actions/dependencies */ "./src/actions/dependencies.js"); +/* harmony import */ var _utils_TreeContainer__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utils/TreeContainer */ "./src/utils/TreeContainer.ts"); +/* harmony import */ var _APIController_react__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./APIController.react */ "./src/APIController.react.js"); +/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } -function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } -function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } +function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } -function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } @@ -435,1331 +842,1417 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } -var addBlockedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_10__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_3__.CallbackActionType.AddBlocked); -var addCompletedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_10__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_3__.CallbackAggregateActionType.AddCompleted); -var addExecutedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_10__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_3__.CallbackActionType.AddExecuted); -var addExecutingCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_10__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_3__.CallbackActionType.AddExecuting); -var addPrioritizedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_10__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_3__.CallbackActionType.AddPrioritized); -var addRequestedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_10__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_3__.CallbackActionType.AddRequested); -var addStoredCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_10__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_3__.CallbackActionType.AddStored); -var addWatchedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_10__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_3__.CallbackActionType.AddWatched); -var removeExecutedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_10__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_3__.CallbackActionType.RemoveExecuted); -var removeBlockedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_10__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_3__.CallbackActionType.RemoveBlocked); -var removeExecutingCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_10__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_3__.CallbackActionType.RemoveExecuting); -var removePrioritizedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_10__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_3__.CallbackActionType.RemovePrioritized); -var removeRequestedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_10__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_3__.CallbackActionType.RemoveRequested); -var removeStoredCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_10__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_3__.CallbackActionType.RemoveStored); -var removeWatchedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_10__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_3__.CallbackActionType.RemoveWatched); -var aggregateCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_10__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_3__.CallbackAggregateActionType.Aggregate); -var updateResourceUsage = (0,redux_actions__WEBPACK_IMPORTED_MODULE_10__["default"])('UPDATE_RESOURCE_USAGE'); -var addCallbackJob = (0,redux_actions__WEBPACK_IMPORTED_MODULE_10__["default"])('ADD_CALLBACK_JOB'); -var removeCallbackJob = (0,redux_actions__WEBPACK_IMPORTED_MODULE_10__["default"])('REMOVE_CALLBACK_JOB'); -var setCallbackJobOutdated = (0,redux_actions__WEBPACK_IMPORTED_MODULE_10__["default"])('CALLBACK_JOB_OUTDATED'); -function unwrapIfNotMulti(paths, idProps, spec, anyVals, depType) { - var msg = ''; - if ((0,_dependencies__WEBPACK_IMPORTED_MODULE_4__.isMultiValued)(spec)) { - return [idProps, msg]; - } - if (idProps.length !== 1) { - if (!idProps.length) { - var isStr = typeof spec.id === 'string'; - msg = 'A nonexistent object was used in an `' + depType + '` of a Dash callback. The id of this object is ' + (isStr ? '`' + spec.id + '`' : JSON.stringify(spec.id) + (anyVals ? ' with MATCH values ' + anyVals : '')) + ' and the property is `' + spec.property + (isStr ? '`. The string ids in the current layout are: [' + (0,ramda__WEBPACK_IMPORTED_MODULE_0__.keys)(paths.strs).join(', ') + ']' : '`. The wildcard ids currently available are logged above.'); - } else { - msg = 'Multiple objects were found for an `' + depType + '` of a callback that only takes one value. The id spec is ' + JSON.stringify(spec.id) + (anyVals ? ' with MATCH values ' + anyVals : '') + ' and the property is `' + spec.property + '`. The objects we found are: ' + JSON.stringify((0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.pick)(['id', 'property']), idProps)); - } + +var NOT_LOADING = { + is_loading: false +}; +function CheckedComponent(p) { + var element = p.element, + extraProps = p.extraProps, + props = p.props, + children = p.children, + type = p.type; + var errorMessage = (0,_checkPropTypes__WEBPACK_IMPORTED_MODULE_8__["default"])(element.propTypes, props, 'component prop', element); + if (errorMessage) { + (0,_exceptions__WEBPACK_IMPORTED_MODULE_3__.propTypeErrorHandler)(errorMessage, props, type); } - return [idProps[0], msg]; + return createElement(element, props, extraProps, children); } -function fillVals(paths, layout, cb, specs, depType) { - var allowAllMissing = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false; - var getter = depType === 'Input' ? cb.getInputs : cb.getState; - var errors = []; - var emptyMultiValues = 0; - var inputVals = getter(paths).map(function (inputList, i) { - var _unwrapIfNotMulti = unwrapIfNotMulti(paths, inputList.map(function (_ref) { - var id = _ref.id, - property = _ref.property, - path_ = _ref.path; - return { - id, - property, - value: (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)([].concat(_toConsumableArray(path_), ['props', property]), layout) - }; - }), specs[i], cb.anyVals, depType), - _unwrapIfNotMulti2 = _slicedToArray(_unwrapIfNotMulti, 2), - inputs = _unwrapIfNotMulti2[0], - inputError = _unwrapIfNotMulti2[1]; - if ((0,_dependencies__WEBPACK_IMPORTED_MODULE_4__.isMultiValued)(specs[i]) && !inputs.length) { - emptyMultiValues++; - } - if (inputError) { - errors.push(inputError); - } - return inputs; - }); - if (errors.length) { - if (allowAllMissing && errors.length + emptyMultiValues === inputVals.length) { - // We have at least one non-multivalued input, but all simple and - // multi-valued inputs are missing. - // (if all inputs are multivalued and all missing we still return - // them as normal, and fire the callback.) - return null; - } - // If we get here we have some missing and some present inputs. - // Or all missing in a context that doesn't allow this. - // That's a real problem, so throw the first message as an error. - refErr(errors, paths); +CheckedComponent.propTypes = { + children: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().any), + element: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().any), + layout: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().any), + props: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().any), + extraProps: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().any), + id: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string) +}; +function createElement(element, props, extraProps, children) { + var allProps = (0,ramda__WEBPACK_IMPORTED_MODULE_13__["default"])(props, extraProps); + if (Array.isArray(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement.apply((react__WEBPACK_IMPORTED_MODULE_0___default()), [element, allProps].concat(_toConsumableArray(children))); } - return inputVals; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(element, allProps, children); } -function refErr(errors, paths) { - var err = errors[0]; - if (err.indexOf('logged above') !== -1) { - // Wildcard reference errors mention a list of wildcard specs logged - // TODO: unwrapped list of wildcard ids? - // eslint-disable-next-line no-console - console.error(paths.objs); - } - throw new ReferenceError(err); +function isDryComponent(obj) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_14__["default"])(obj) === 'Object' && (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])('type', obj) && (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])('namespace', obj) && (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])('props', obj); } -var getVals = function getVals(input) { - return Array.isArray(input) ? (0,ramda__WEBPACK_IMPORTED_MODULE_0__.pluck)('value', input) : input.value; -}; -var zipIfArray = function zipIfArray(a, b) { - return Array.isArray(a) ? (0,ramda__WEBPACK_IMPORTED_MODULE_0__.zip)(a, b) : [[a, b]]; +var DashWrapper = function DashWrapper(props) { + var context = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_APIController_react__WEBPACK_IMPORTED_MODULE_11__.DashContext); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(BaseTreeContainer, _extends({}, context.fn(), props, { + _dashprivate_path: JSON.parse(props._dashprivate_path) + })); }; -function cleanOutputProp(property) { - return property.split('@')[0]; -} -function handleClientside(_x, _x2, _x3, _x4) { - return _handleClientside.apply(this, arguments); -} -function _handleClientside() { - _handleClientside = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(dispatch, clientside_function, config, payload) { - var dc, inputs, outputs, state, requestTime, inputDict, stateDict, result, status, _dc$namespace, _returnValue, namespace, function_name, args, returnValue, totalTime, resources; - return _regeneratorRuntime().wrap(function _callee2$(_context3) { - while (1) switch (_context3.prev = _context3.next) { - case 0: - dc = window.dash_clientside = window.dash_clientside || {}; - if (!dc.no_update) { - Object.defineProperty(dc, 'no_update', { - value: { - description: 'Return to prevent updating an Output.' - }, - writable: false - }); - Object.defineProperty(dc, 'PreventUpdate', { - value: { - description: 'Throw to prevent updating all Outputs.' - }, - writable: false - }); - } - inputs = payload.inputs, outputs = payload.outputs, state = payload.state; - requestTime = Date.now(); - inputDict = inputsToDict(inputs); - stateDict = inputsToDict(state); - result = {}; - status = _constants_constants__WEBPACK_IMPORTED_MODULE_1__.STATUS.OK; - _context3.prev = 8; - namespace = clientside_function.namespace, function_name = clientside_function.function_name; - args = inputs.map(getVals); - if (state) { - args = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(args, state.map(getVals)); - } - // setup callback context - dc.callback_context = {}; - dc.callback_context.triggered = payload.changedPropIds.map(function (prop_id) { - return { - prop_id: prop_id, - value: inputDict[prop_id] - }; - }); - dc.callback_context.inputs_list = inputs; - dc.callback_context.inputs = inputDict; - dc.callback_context.states_list = state; - dc.callback_context.states = stateDict; - returnValue = (_dc$namespace = dc[namespace])[function_name].apply(_dc$namespace, _toConsumableArray(args)); - delete dc.callback_context; - if (!(typeof ((_returnValue = returnValue) === null || _returnValue === void 0 ? void 0 : _returnValue.then) === 'function')) { - _context3.next = 24; - break; - } - _context3.next = 23; - return returnValue; - case 23: - returnValue = _context3.sent; - case 24: - zipIfArray(outputs, returnValue).forEach(function (_ref10) { - var _ref11 = _slicedToArray(_ref10, 2), - outi = _ref11[0], - reti = _ref11[1]; - zipIfArray(outi, reti).forEach(function (_ref12) { - var _ref13 = _slicedToArray(_ref12, 2), - outij = _ref13[0], - retij = _ref13[1]; - var id = outij.id, - property = outij.property; - var idStr = (0,_dependencies__WEBPACK_IMPORTED_MODULE_4__.stringifyId)(id); - var dataForId = result[idStr] = result[idStr] || {}; - if (retij !== dc.no_update) { - dataForId[cleanOutputProp(property)] = retij; - } - }); - }); - _context3.next = 35; - break; - case 27: - _context3.prev = 27; - _context3.t0 = _context3["catch"](8); - if (!(_context3.t0 === dc.PreventUpdate)) { - _context3.next = 33; - break; - } - status = _constants_constants__WEBPACK_IMPORTED_MODULE_1__.STATUS.PREVENT_UPDATE; - _context3.next = 35; - break; - case 33: - status = _constants_constants__WEBPACK_IMPORTED_MODULE_1__.STATUS.CLIENTSIDE_ERROR; - throw _context3.t0; - case 35: - _context3.prev = 35; - delete dc.callback_context; - // Setting server = client forces network = 0 - totalTime = Date.now() - requestTime; - resources = { - __dash_server: totalTime, - __dash_client: totalTime, - __dash_upload: 0, - __dash_download: 0 - }; - if (config.ui) { - dispatch(updateResourceUsage({ - id: payload.output, - usage: resources, - status, - result, - inputs, - state - })); - } - return _context3.finish(35); - case 41: - return _context3.abrupt("return", result); - case 42: - case "end": - return _context3.stop(); - } - }, _callee2, null, [[8, 27, 35, 41]]); - })); - return _handleClientside.apply(this, arguments); -} -function sideUpdate(outputs, dispatch, paths) { - (0,ramda__WEBPACK_IMPORTED_MODULE_0__.toPairs)(outputs).forEach(function (_ref2) { - var _ref3 = _slicedToArray(_ref2, 2), - id = _ref3[0], - value = _ref3[1]; - var _id$split = id.split('.'), - _id$split2 = _slicedToArray(_id$split, 2), - componentId = _id$split2[0], - propName = _id$split2[1]; - var componentPath = paths.strs[componentId]; - dispatch((0,___WEBPACK_IMPORTED_MODULE_6__.updateProps)({ - props: { - [propName]: value - }, - itempath: componentPath - })); - dispatch((0,___WEBPACK_IMPORTED_MODULE_6__.notifyObservers)({ - id: componentId, - props: { - [propName]: value - } - })); - }); -} -function handleServerside(dispatch, hooks, config, payload, paths, long, additionalArgs, getState, output) { - if (hooks.request_pre) { - hooks.request_pre(payload); +var TreeContainer = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(DashWrapper); +var BaseTreeContainer = /*#__PURE__*/function (_Component) { + _inherits(BaseTreeContainer, _Component); + var _super = _createSuper(BaseTreeContainer); + function BaseTreeContainer(props) { + var _this; + _classCallCheck(this, BaseTreeContainer); + _this = _super.call(this, props); + _this.setProps = _this.setProps.bind(_assertThisInitialized(_this)); + return _this; } - var requestTime = Date.now(); - var body = JSON.stringify(payload); - var cacheKey; - var job; - var runningOff; - var progressDefault; - var moreArgs = additionalArgs; - var fetchCallback = function fetchCallback() { - var headers = (0,___WEBPACK_IMPORTED_MODULE_6__.getCSRFHeader)(); - var url = "".concat((0,_utils__WEBPACK_IMPORTED_MODULE_5__.urlBase)(config), "_dash-update-component"); - var addArg = function addArg(name, value) { - var delim = '?'; - if (url.includes('?')) { - delim = '&'; - } - url = "".concat(url).concat(delim).concat(name, "=").concat(value); - }; - if (cacheKey) { - addArg('cacheKey', cacheKey); - } - if (job) { - addArg('job', job); - } - if (moreArgs) { - moreArgs.forEach(function (_ref4) { - var _ref5 = _slicedToArray(_ref4, 2), - key = _ref5[0], - value = _ref5[1]; - return addArg(key, value); - }); - moreArgs = moreArgs.filter(function (_ref6) { - var _ref7 = _slicedToArray(_ref6, 3), - _ = _ref7[0], - __ = _ref7[1], - single = _ref7[2]; - return !single; + _createClass(BaseTreeContainer, [{ + key: "createContainer", + value: function createContainer(props, component, path) { + var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : undefined; + return (0,_isSimpleComponent__WEBPACK_IMPORTED_MODULE_5__["default"])(component) ? component : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(TreeContainer, { + key: component && component.props && (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_9__.stringifyId)(component.props.id) || key, + _dashprivate_error: props._dashprivate_error, + _dashprivate_layout: component, + _dashprivate_loadingState: (0,_utils_TreeContainer__WEBPACK_IMPORTED_MODULE_10__.getLoadingState)(component, path, props._dashprivate_loadingMap), + _dashprivate_loadingStateHash: (0,_utils_TreeContainer__WEBPACK_IMPORTED_MODULE_10__.getLoadingHash)(path, props._dashprivate_loadingMap), + _dashprivate_path: JSON.stringify(path) }); } - return fetch(url, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.mergeDeepRight)(config.fetch, { - method: 'POST', - headers, - body - })); - }; - return new Promise(function (resolve, reject) { - var handleOutput = function handleOutput(res) { - var status = res.status; - if (job) { - var callbackJob = getState().callbackJobs[job]; - if (callbackJob !== null && callbackJob !== void 0 && callbackJob.outdated) { - dispatch(removeCallbackJob({ - jobId: job - })); - return resolve({}); - } - } - function recordProfile(result) { - if (config.ui) { - // Callback profiling - only relevant if we're showing the debug ui - var resources = { - __dash_server: 0, - __dash_client: Date.now() - requestTime, - __dash_upload: body.length, - __dash_download: Number(res.headers.get('Content-Length')) - }; - var timingHeaders = res.headers.get('Server-Timing') || ''; - timingHeaders.split(',').forEach(function (header) { - var name = header.split(';')[0]; - var dur = header.match(/;dur=[0-9.]+/); - if (dur) { - resources[name] = Number(dur[0].slice(5)); + }, { + key: "setProps", + value: function setProps(newProps) { + var _this$props = this.props, + _dashprivate_dispatch = _this$props._dashprivate_dispatch, + _dashprivate_path = _this$props._dashprivate_path, + _dashprivate_layout = _this$props._dashprivate_layout; + var oldProps = this.getLayoutProps(); + var id = oldProps.id; + var changedProps = (0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(function (val, key) { + return !(0,ramda__WEBPACK_IMPORTED_MODULE_17__["default"])(val, oldProps[key]); + }, newProps); + if (!(0,ramda__WEBPACK_IMPORTED_MODULE_18__["default"])(changedProps)) { + _dashprivate_dispatch(function (dispatch, getState) { + var _getState = getState(), + graphs = _getState.graphs; + // Identify the modified props that are required for callbacks + var watchedKeys = (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_9__.getWatchedKeys)(id, (0,ramda__WEBPACK_IMPORTED_MODULE_19__["default"])(changedProps), graphs); + (0,react_redux__WEBPACK_IMPORTED_MODULE_12__.batch)(function () { + // setProps here is triggered by the UI - record these changes + // for persistence + (0,_persistence__WEBPACK_IMPORTED_MODULE_6__.recordUiEdit)(_dashprivate_layout, newProps, dispatch); + + // Only dispatch changes to Dash if a watched prop changed + if (watchedKeys.length) { + dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_4__.notifyObservers)({ + id, + props: (0,ramda__WEBPACK_IMPORTED_MODULE_20__["default"])(watchedKeys, changedProps) + })); } + + // Always update this component's props + dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_4__.updateProps)({ + props: changedProps, + itempath: _dashprivate_path + })); }); - dispatch(updateResourceUsage({ - id: payload.output, - usage: resources, - status, - result, - inputs: payload.inputs, - state: payload.state - })); - } - } - var finishLine = function finishLine(data) { - var multi = data.multi, - response = data.response; - if (hooks.request_post) { - hooks.request_post(payload, response); - } - var result; - if (multi) { - result = response; - } else { - var _output = payload.output; - var id = _output.substr(0, _output.lastIndexOf('.')); - result = { - [id]: response.props - }; - } - recordProfile(result); - resolve(result); - }; - var completeJob = function completeJob() { - if (job) { - dispatch(removeCallbackJob({ - jobId: job - })); - } - if (runningOff) { - sideUpdate(runningOff, dispatch, paths); - } - if (progressDefault) { - sideUpdate(progressDefault, dispatch, paths); - } - }; - if (status === _constants_constants__WEBPACK_IMPORTED_MODULE_1__.STATUS.OK) { - res.json().then(function (data) { - if (!cacheKey && data.cacheKey) { - cacheKey = data.cacheKey; - } - if (!job && data.job) { - var jobInfo = { - jobId: data.job, - cacheKey: data.cacheKey, - cancelInputs: data.cancel, - progressDefault: data.progressDefault, - output - }; - dispatch(addCallbackJob(jobInfo)); - job = data.job; - } - if (data.progress) { - sideUpdate(data.progress, dispatch, paths); - } - if (data.running) { - sideUpdate(data.running, dispatch, paths); - } - if (!runningOff && data.runningOff) { - runningOff = data.runningOff; - } - if (!progressDefault && data.progressDefault) { - progressDefault = data.progressDefault; - } - if (!long || data.response !== undefined) { - completeJob(); - finishLine(data); - } else { - // Poll chain. - setTimeout(handle, long.interval !== undefined ? long.interval : 500); - } }); - } else if (status === _constants_constants__WEBPACK_IMPORTED_MODULE_1__.STATUS.PREVENT_UPDATE) { - completeJob(); - recordProfile({}); - resolve({}); - } else { - completeJob(); - reject(res); - } - }; - var handleError = function handleError() { - if (config.ui) { - dispatch(updateResourceUsage({ - id: payload.output, - status: _constants_constants__WEBPACK_IMPORTED_MODULE_1__.STATUS.NO_RESPONSE, - result: {}, - inputs: payload.inputs, - state: payload.state - })); - } - reject(new Error('Callback failed: the server did not respond.')); - }; - var handle = function handle() { - fetchCallback().then(handleOutput, handleError); - }; - handle(); - }); -} -function inputsToDict(inputs_list) { - // Ported directly from _utils.py, inputs_to_dict - // takes an array of inputs (some inputs may be an array) - // returns an Object (map): - // keys of the form `id.property` or `{"id": 0}.property` - // values contain the property value - if (!inputs_list) { - return {}; - } - var inputs = {}; - for (var i = 0; i < inputs_list.length; i++) { - if (Array.isArray(inputs_list[i])) { - var inputsi = inputs_list[i]; - for (var ii = 0; ii < inputsi.length; ii++) { - var _inputsi$ii$value; - var id_str = "".concat((0,_dependencies__WEBPACK_IMPORTED_MODULE_4__.stringifyId)(inputsi[ii].id), ".").concat(inputsi[ii].property); - inputs[id_str] = (_inputsi$ii$value = inputsi[ii].value) !== null && _inputsi$ii$value !== void 0 ? _inputsi$ii$value : null; } - } else { - var _inputs_list$i$value; - var _id_str = "".concat((0,_dependencies__WEBPACK_IMPORTED_MODULE_4__.stringifyId)(inputs_list[i].id), ".").concat(inputs_list[i].property); - inputs[_id_str] = (_inputs_list$i$value = inputs_list[i].value) !== null && _inputs_list$i$value !== void 0 ? _inputs_list$i$value : null; } - } - return inputs; -} -function executeCallback(cb, config, hooks, paths, layout, _ref8, dispatch, getState) { - var allOutputs = _ref8.allOutputs; - var _cb$callback = cb.callback, - output = _cb$callback.output, - inputs = _cb$callback.inputs, - state = _cb$callback.state, - clientside_function = _cb$callback.clientside_function, - long = _cb$callback.long, - dynamic_creator = _cb$callback.dynamic_creator; - try { - var inVals = fillVals(paths, layout, cb, inputs, 'Input', true); - /* Prevent callback if there's no inputs */ - if (inVals === null) { - return _objectSpread(_objectSpread({}, cb), {}, { - executionPromise: null - }); + }, { + key: "getChildren", + value: function getChildren(components, path) { + var _this2 = this; + if ((0,ramda__WEBPACK_IMPORTED_MODULE_21__["default"])(components)) { + return null; + } + return Array.isArray(components) ? (0,ramda__WEBPACK_IMPORTED_MODULE_22__["default"])(ramda__WEBPACK_IMPORTED_MODULE_23__["default"])(function (component, i) { + return _this2.createContainer(_this2.props, component, (0,ramda__WEBPACK_IMPORTED_MODULE_24__["default"])(path, ['props', 'children', i])); + }, components) : this.createContainer(this.props, components, (0,ramda__WEBPACK_IMPORTED_MODULE_24__["default"])(path, ['props', 'children'])); } - var outputs = []; - var outputErrors = []; - allOutputs.forEach(function (out, i) { - var _unwrapIfNotMulti3 = unwrapIfNotMulti(paths, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.pick)(['id', 'property']), out), cb.callback.outputs[i], cb.anyVals, 'Output'), - _unwrapIfNotMulti4 = _slicedToArray(_unwrapIfNotMulti3, 2), - outi = _unwrapIfNotMulti4[0], - erri = _unwrapIfNotMulti4[1]; - outputs.push(outi); - if (erri) { - outputErrors.push(erri); + }, { + key: "wrapChildrenProp", + value: function wrapChildrenProp(node, childrenProp) { + var _this3 = this; + if (Array.isArray(node)) { + return node.map(function (n, i) { + return isDryComponent(n) ? _this3.createContainer(_this3.props, n, (0,ramda__WEBPACK_IMPORTED_MODULE_24__["default"])(_this3.props._dashprivate_path, ['props'].concat(_toConsumableArray(childrenProp), [i])), i) : n; + }); } - }); - if (outputErrors.length) { - if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)(inVals).length) { - refErr(outputErrors, paths); + if (!isDryComponent(node)) { + return node; } - // This case is all-empty multivalued wildcard inputs, - // which we would normally fire the callback for, except - // some outputs are missing. So instead we treat it like - // regular missing inputs and just silently prevent it. - return _objectSpread(_objectSpread({}, cb), {}, { - executionPromise: null - }); + return this.createContainer(this.props, node, (0,ramda__WEBPACK_IMPORTED_MODULE_24__["default"])(this.props._dashprivate_path, ['props'].concat(_toConsumableArray(childrenProp)))); } - var __execute = /*#__PURE__*/function () { - var _ref9 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { - var payload, data, newConfig, newHeaders, lastError, additionalArgs, _loop, _ret, retry; - return _regeneratorRuntime().wrap(function _callee$(_context2) { - while (1) switch (_context2.prev = _context2.next) { - case 0: - _context2.prev = 0; - payload = { - output, - outputs: (0,_dependencies__WEBPACK_IMPORTED_MODULE_4__.isMultiOutputProp)(output) ? outputs : outputs[0], - inputs: inVals, - changedPropIds: (0,ramda__WEBPACK_IMPORTED_MODULE_0__.keys)(cb.changedPropIds), - state: cb.callback.state.length ? fillVals(paths, layout, cb, state, 'State') : undefined - }; - if (!clientside_function) { - _context2.next = 13; - break; - } - _context2.prev = 3; - _context2.next = 6; - return handleClientside(dispatch, clientside_function, config, payload); - case 6: - data = _context2.sent; - return _context2.abrupt("return", { - data, - payload - }); - case 10: - _context2.prev = 10; - _context2.t0 = _context2["catch"](3); - return _context2.abrupt("return", { - error: _context2.t0, - payload - }); - case 13: - newConfig = config; - newHeaders = null; - additionalArgs = []; - (0,ramda__WEBPACK_IMPORTED_MODULE_0__.values)(getState().callbackJobs).forEach(function (job) { - if (cb.callback.output === job.output) { - // Terminate the old jobs that are not completed - // set as outdated for the callback promise to - // resolve and remove after. - additionalArgs.push(['oldJob', job.jobId, true]); - dispatch(setCallbackJobOutdated({ - jobId: job.jobId - })); - } - if (!job.cancelInputs) { - return; + }, { + key: "getComponent", + value: function getComponent(_dashprivate_layout, children, loading_state, setProps) { + var _this4 = this; + var _this$props2 = this.props, + _dashprivate_config = _this$props2._dashprivate_config, + _dashprivate_dispatch = _this$props2._dashprivate_dispatch, + _dashprivate_error = _this$props2._dashprivate_error; + if ((0,ramda__WEBPACK_IMPORTED_MODULE_18__["default"])(_dashprivate_layout)) { + return null; + } + if ((0,_isSimpleComponent__WEBPACK_IMPORTED_MODULE_5__["default"])(_dashprivate_layout)) { + return _dashprivate_layout; + } + (0,_utils_TreeContainer__WEBPACK_IMPORTED_MODULE_10__.validateComponent)(_dashprivate_layout); + var element = _registry__WEBPACK_IMPORTED_MODULE_2__["default"].resolve(_dashprivate_layout); + + // Hydrate components props + var childrenProps = (0,ramda__WEBPACK_IMPORTED_MODULE_25__["default"])([], ['children_props', _dashprivate_layout.namespace, _dashprivate_layout.type], _dashprivate_config); + var props = (0,ramda__WEBPACK_IMPORTED_MODULE_26__["default"])('children', _dashprivate_layout.props); + var _loop = function _loop() { + var childrenProp = childrenProps[i]; + var handleObject = function handleObject(obj, opath) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_27__["default"])(function (node, k) { + return _this4.wrapChildrenProp(node, [].concat(_toConsumableArray(opath), [k])); + }, obj); + }; + if (childrenProp.includes('.')) { + var path = childrenProp.split('.'); + var node; + var nodeValue; + if (childrenProp.includes('[]')) { + var frontPath = [], + backPath = [], + found = false, + hasObject = false; + path.forEach(function (p) { + if (!found) { + if (p.includes('[]')) { + found = true; + if (p.includes('{}')) { + hasObject = true; + frontPath.push(p.replace('{}', '').replace('[]', '')); + } else { + frontPath.push(p.replace('[]', '')); + } + } else if (p.includes('{}')) { + hasObject = true; + frontPath.push(p.replace('{}', '')); + } else { + frontPath.push(p); + } + } else { + if (p.includes('{}')) { + hasObject = true; + backPath.push(p.replace('{}', '')); + } else { + backPath.push(p); + } } - var inter = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.intersection)(job.cancelInputs, cb.callback.inputs); - if (inter.length) { - additionalArgs.push(['cancelJob', job.jobId]); - if (job.progressDefault) { - sideUpdate(job.progressDefault, dispatch, paths); + }); + node = (0,ramda__WEBPACK_IMPORTED_MODULE_28__["default"])(frontPath, props); + if (node === undefined || !node.length) { + return 0; // continue + } + var firstNode = (0,ramda__WEBPACK_IMPORTED_MODULE_28__["default"])(backPath, node[0]); + if (!firstNode) { + return 0; // continue + } + nodeValue = node.map(function (element, i) { + var elementPath = (0,ramda__WEBPACK_IMPORTED_MODULE_24__["default"])(frontPath, (0,ramda__WEBPACK_IMPORTED_MODULE_24__["default"])([i], backPath)); + var listValue; + if (hasObject) { + if (backPath.length) { + listValue = handleObject((0,ramda__WEBPACK_IMPORTED_MODULE_28__["default"])(backPath, element), elementPath); + } else { + listValue = handleObject(element, elementPath); } + } else { + listValue = _this4.wrapChildrenProp((0,ramda__WEBPACK_IMPORTED_MODULE_28__["default"])(backPath, element), elementPath); } + return (0,ramda__WEBPACK_IMPORTED_MODULE_29__["default"])(backPath, listValue, element); }); - _loop = /*#__PURE__*/_regeneratorRuntime().mark(function _loop() { - var _data, currentLayout, body, oldJwt, newJwt; - return _regeneratorRuntime().wrap(function _loop$(_context) { - while (1) switch (_context.prev = _context.next) { - case 0: - _context.prev = 0; - _context.next = 3; - return handleServerside(dispatch, hooks, newConfig, payload, paths, long, additionalArgs.length ? additionalArgs : undefined, getState, cb.callback.output); - case 3: - _data = _context.sent; - if (newHeaders) { - dispatch((0,___WEBPACK_IMPORTED_MODULE_6__.addHttpHeaders)(newHeaders)); - } - // Layout may have changed. - currentLayout = getState().layout; - (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)(outputs).forEach(function (out) { - var propName = cleanOutputProp(out.property); - var outputPath = (0,_paths__WEBPACK_IMPORTED_MODULE_8__.getPath)(paths, out.id); - var previousValue = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(outputPath.concat(['props', propName]), currentLayout); - var dataPath = [(0,_dependencies__WEBPACK_IMPORTED_MODULE_4__.stringifyId)(out.id), propName]; - var outputValue = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(dataPath, _data); - if ((0,_patch__WEBPACK_IMPORTED_MODULE_7__.isPatch)(outputValue)) { - if (previousValue === undefined) { - throw new Error('Cannot patch undefined'); - } - _data = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assocPath)(dataPath, (0,_patch__WEBPACK_IMPORTED_MODULE_7__.handlePatch)(previousValue, outputValue), _data); - } - }); - if (dynamic_creator) { - setTimeout(function () { - return dispatch((0,_requestDependencies__WEBPACK_IMPORTED_MODULE_9__.requestDependencies)()); - }, 0); - } - return _context.abrupt("return", { - v: { - data: _data, - payload - } - }); - case 11: - _context.prev = 11; - _context.t0 = _context["catch"](0); - lastError = _context.t0; - if (!(retry <= _constants__WEBPACK_IMPORTED_MODULE_2__.MAX_AUTH_RETRIES && (_context.t0.status === _constants_constants__WEBPACK_IMPORTED_MODULE_1__.STATUS.UNAUTHORIZED || _context.t0.status === _constants_constants__WEBPACK_IMPORTED_MODULE_1__.STATUS.BAD_REQUEST))) { - _context.next = 29; - break; - } - _context.next = 17; - return _context.t0.text(); - case 17: - body = _context.sent; - if (!body.includes(_constants_constants__WEBPACK_IMPORTED_MODULE_1__.JWT_EXPIRED_MESSAGE)) { - _context.next = 29; - break; - } - if (!(hooks.request_refresh_jwt !== null)) { - _context.next = 29; - break; - } - oldJwt = null; - if (config.fetch.headers.Authorization) { - oldJwt = config.fetch.headers.Authorization.substr('Bearer '.length); - } - _context.next = 24; - return hooks.request_refresh_jwt(oldJwt); - case 24: - newJwt = _context.sent; - if (!newJwt) { - _context.next = 29; - break; - } - newHeaders = { - Authorization: "Bearer ".concat(newJwt) - }; - newConfig = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.mergeDeepRight)(config, { - fetch: { - headers: newHeaders - } - }); - return _context.abrupt("return", 0); - case 29: - return _context.abrupt("return", 1); - case 30: - case "end": - return _context.stop(); + path = frontPath; + } else { + if (childrenProp.includes('{}')) { + // Only supports one level of nesting. + var front = []; + var dynamic = []; + var hasBack = false; + var _backPath = []; + for (var j = 0; j < path.length; j++) { + var cur = path[j]; + if (cur.includes('{}')) { + dynamic = (0,ramda__WEBPACK_IMPORTED_MODULE_24__["default"])(front, [cur.replace('{}', '')]); + if (j < path.length - 1) { + hasBack = true; + } + } else { + if (hasBack) { + _backPath.push(cur); + } else { + front.push(cur); + } } - }, _loop, null, [[0, 11]]); - }); - retry = 0; - case 19: - if (!(retry <= _constants__WEBPACK_IMPORTED_MODULE_2__.MAX_AUTH_RETRIES)) { - _context2.next = 31; - break; + } + var dynValue = (0,ramda__WEBPACK_IMPORTED_MODULE_28__["default"])(dynamic, props); + if (dynValue !== undefined) { + nodeValue = (0,ramda__WEBPACK_IMPORTED_MODULE_27__["default"])(function (d, k) { + return _this4.wrapChildrenProp(hasBack ? (0,ramda__WEBPACK_IMPORTED_MODULE_28__["default"])(_backPath, d) : d, hasBack ? (0,ramda__WEBPACK_IMPORTED_MODULE_24__["default"])(dynamic, (0,ramda__WEBPACK_IMPORTED_MODULE_24__["default"])([k], _backPath)) : (0,ramda__WEBPACK_IMPORTED_MODULE_24__["default"])(dynamic, [k])); + }, dynValue); + path = dynamic; + } + } else { + node = (0,ramda__WEBPACK_IMPORTED_MODULE_28__["default"])(path, props); + if (node === undefined) { + return 0; // continue + } + nodeValue = _this4.wrapChildrenProp(node, path); } - return _context2.delegateYield(_loop(), "t1", 21); - case 21: - _ret = _context2.t1; - if (!(_ret === 0)) { - _context2.next = 24; - break; + } + props = (0,ramda__WEBPACK_IMPORTED_MODULE_29__["default"])(path, nodeValue, props); + } else { + if (childrenProp.includes('{}')) { + var opath = childrenProp.replace('{}', ''); + var isArray = childrenProp.includes('[]'); + if (isArray) { + opath = opath.replace('[]', ''); } - return _context2.abrupt("continue", 28); - case 24: - if (!(_ret === 1)) { - _context2.next = 26; - break; + var _node = props[opath]; + if (_node !== undefined) { + if (isArray) { + for (var _j = 0; _j < _node.length; _j++) { + var aPath = (0,ramda__WEBPACK_IMPORTED_MODULE_24__["default"])([opath], [_j]); + props = (0,ramda__WEBPACK_IMPORTED_MODULE_29__["default"])(aPath, handleObject(_node[_j], aPath), props); + } + } else { + props = (0,ramda__WEBPACK_IMPORTED_MODULE_30__["default"])(opath, handleObject(_node, [opath]), props); + } } - return _context2.abrupt("break", 31); - case 26: - if (!_ret) { - _context2.next = 28; - break; + } else { + var _node2 = props[childrenProp]; + if (_node2 !== undefined) { + props = (0,ramda__WEBPACK_IMPORTED_MODULE_30__["default"])(childrenProp, _this4.wrapChildrenProp(_node2, [childrenProp]), props); } - return _context2.abrupt("return", _ret.v); - case 28: - retry++; - _context2.next = 19; - break; - case 31: - return _context2.abrupt("return", { - error: lastError, - payload: null - }); - case 34: - _context2.prev = 34; - _context2.t2 = _context2["catch"](0); - return _context2.abrupt("return", { - error: _context2.t2, - payload: null - }); - case 37: - case "end": - return _context2.stop(); + } } - }, _callee, null, [[0, 34], [3, 10]]); - })); - return function __execute() { - return _ref9.apply(this, arguments); - }; - }(); - var newCb = _objectSpread(_objectSpread({}, cb), {}, { - executionPromise: __execute() - }); - return newCb; - } catch (error) { - return _objectSpread(_objectSpread({}, cb), {}, { - executionPromise: { - error, - payload: null + }, + _ret; + for (var i = 0; i < childrenProps.length; i++) { + _ret = _loop(); + if (_ret === 0) continue; } - }); - } + if ((0,ramda__WEBPACK_IMPORTED_MODULE_14__["default"])(props.id) === 'Object') { + // Turn object ids (for wildcards) into unique strings. + // Because of the `dissoc` above we're not mutating the layout, + // just the id we pass on to the rendered component + props.id = (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_9__.stringifyId)(props.id); + } + var extraProps = { + loading_state: loading_state || NOT_LOADING, + setProps + }; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_error_ComponentErrorBoundary_react__WEBPACK_IMPORTED_MODULE_7__["default"], { + componentType: _dashprivate_layout.type, + componentId: props.id, + key: props.id, + dispatch: _dashprivate_dispatch, + error: _dashprivate_error + }, _dashprivate_config.props_check ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(CheckedComponent, { + children: children, + element: element, + props: props, + extraProps: extraProps, + type: _dashprivate_layout.type + }) : createElement(element, props, extraProps, children)); + } + }, { + key: "getLayoutProps", + value: function getLayoutProps() { + return (0,ramda__WEBPACK_IMPORTED_MODULE_31__["default"])({}, 'props', this.props._dashprivate_layout); + } + }, { + key: "render", + value: function render() { + var _this$props3 = this.props, + _dashprivate_layout = _this$props3._dashprivate_layout, + _dashprivate_loadingState = _this$props3._dashprivate_loadingState, + _dashprivate_path = _this$props3._dashprivate_path; + var layoutProps = this.getLayoutProps(); + var children = this.getChildren(layoutProps.children, _dashprivate_path); + return this.getComponent(_dashprivate_layout, children, _dashprivate_loadingState, this.setProps); + } + }]); + return BaseTreeContainer; +}(react__WEBPACK_IMPORTED_MODULE_0__.Component); +TreeContainer.propTypes = { + _dashprivate_error: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().any), + _dashprivate_layout: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), + _dashprivate_loadingState: prop_types__WEBPACK_IMPORTED_MODULE_1___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), (prop_types__WEBPACK_IMPORTED_MODULE_1___default().bool)]), + _dashprivate_loadingStateHash: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string), + _dashprivate_path: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string) +}; +BaseTreeContainer.propTypes = _objectSpread(_objectSpread({}, TreeContainer.propTypes), {}, { + _dashprivate_config: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), + _dashprivate_dispatch: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func), + _dashprivate_graphs: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().any), + _dashprivate_loadingMap: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().any), + _dashprivate_path: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().array) +}); +/* harmony default export */ __webpack_exports__["default"] = (TreeContainer); + +/***/ }), + +/***/ "./src/actions/api.js": +/*!****************************!*\ + !*** ./src/actions/api.js ***! + \****************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ apiThunk; } +/* harmony export */ }); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/once.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mergeDeepRight.js"); +/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../actions */ "./src/actions/index.js"); +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/actions/utils.js"); +/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ "./src/actions/constants.js"); +/* harmony import */ var _constants_constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../constants/constants */ "./src/constants/constants.js"); +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(typeof e + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + + + + + + +/* eslint-disable-next-line no-console */ +var logWarningOnce = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(console.warn); +function GET(path, fetchConfig) { + return fetch(path, (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(fetchConfig, { + method: 'GET', + headers: (0,_actions__WEBPACK_IMPORTED_MODULE_0__.getCSRFHeader)() + })); +} +function POST(path, fetchConfig) { + var body = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + return fetch(path, (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(fetchConfig, { + method: 'POST', + headers: (0,_actions__WEBPACK_IMPORTED_MODULE_0__.getCSRFHeader)(), + body: body ? JSON.stringify(body) : null + })); +} +var request = { + GET, + POST +}; +function apiThunk(endpoint, method, store, id, body) { + return /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(dispatch, getState) { + var _getState, config, hooks, newHeaders, url, setConnectionStatus, res, retry, _body, newJwt, contentType, message; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + setConnectionStatus = function _setConnectionStatus(connected) { + if (getState().error.backEndConnected !== connected) { + dispatch({ + type: 'SET_CONNECTION_STATUS', + payload: connected + }); + } + }; + _getState = getState(), config = _getState.config, hooks = _getState.hooks; + newHeaders = null; + url = "".concat((0,_utils__WEBPACK_IMPORTED_MODULE_1__.urlBase)(config)).concat(endpoint); + dispatch({ + type: store, + payload: { + id, + status: 'loading' + } + }); + _context.prev = 5; + retry = 0; + case 7: + if (!(retry <= _constants__WEBPACK_IMPORTED_MODULE_2__.MAX_AUTH_RETRIES)) { + _context.next = 36; + break; + } + _context.prev = 8; + _context.next = 11; + return request[method](url, config.fetch, body); + case 11: + res = _context.sent; + _context.next = 19; + break; + case 14: + _context.prev = 14; + _context.t0 = _context["catch"](8); + // fetch rejection - this means the request didn't return, + // we don't get here from 400/500 errors, only network + // errors or unresponsive servers. + // eslint-disable-next-line no-console + console.log('fetch error', res); + setConnectionStatus(false); + return _context.abrupt("return"); + case 19: + if (!(res.status === _constants_constants__WEBPACK_IMPORTED_MODULE_3__.STATUS.UNAUTHORIZED || res.status === _constants_constants__WEBPACK_IMPORTED_MODULE_3__.STATUS.BAD_REQUEST)) { + _context.next = 32; + break; + } + if (!hooks.request_refresh_jwt) { + _context.next = 32; + break; + } + _context.next = 23; + return res.text(); + case 23: + _body = _context.sent; + if (!_body.includes(_constants_constants__WEBPACK_IMPORTED_MODULE_3__.JWT_EXPIRED_MESSAGE)) { + _context.next = 32; + break; + } + _context.next = 27; + return hooks.request_refresh_jwt(config.fetch.headers.Authorization.substr('Bearer '.length)); + case 27: + newJwt = _context.sent; + if (!newJwt) { + _context.next = 32; + break; + } + newHeaders = { + Authorization: "Bearer ".concat(newJwt) + }; + config = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(config, { + fetch: { + headers: newHeaders + } + }); + return _context.abrupt("continue", 33); + case 32: + return _context.abrupt("break", 36); + case 33: + retry++; + _context.next = 7; + break; + case 36: + contentType = res.headers.get('content-type'); + if (newHeaders) { + dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_0__.addHttpHeaders)(newHeaders)); + } + setConnectionStatus(true); + if (!(contentType && contentType.indexOf('application/json') !== -1)) { + _context.next = 41; + break; + } + return _context.abrupt("return", res.json().then(function (json) { + dispatch({ + type: store, + payload: { + status: res.status, + content: json, + id + } + }); + return json; + })); + case 41: + logWarningOnce('Response is missing header: content-type: application/json'); + return _context.abrupt("return", dispatch({ + type: store, + payload: { + id, + status: res.status + } + })); + case 45: + _context.prev = 45; + _context.t1 = _context["catch"](5); + message = 'Error from API call: ' + endpoint; + (0,_actions__WEBPACK_IMPORTED_MODULE_0__.handleAsyncError)(_context.t1, message, dispatch); + case 49: + case "end": + return _context.stop(); + } + }, _callee, null, [[5, 45], [8, 14]]); + })); + return function (_x, _x2) { + return _ref.apply(this, arguments); + }; + }(); } /***/ }), -/***/ "./src/actions/dependencies_ts.ts": -/*!****************************************!*\ - !*** ./src/actions/dependencies_ts.ts ***! - \****************************************/ +/***/ "./src/actions/callbacks.ts": +/*!**********************************!*\ + !*** ./src/actions/callbacks.ts ***! + \**********************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ DIRECT: function() { return /* binding */ DIRECT; }, -/* harmony export */ INDIRECT: function() { return /* binding */ INDIRECT; }, -/* harmony export */ combineIdAndProp: function() { return /* binding */ combineIdAndProp; }, -/* harmony export */ getAllSubsequentOutputsForCallback: function() { return /* binding */ getAllSubsequentOutputsForCallback; }, -/* harmony export */ getCallbacksByInput: function() { return /* binding */ getCallbacksByInput; }, -/* harmony export */ getLayoutCallbacks: function() { return /* binding */ getLayoutCallbacks; }, -/* harmony export */ getPriority: function() { return /* binding */ getPriority; }, -/* harmony export */ getReadyCallbacks: function() { return /* binding */ getReadyCallbacks; }, -/* harmony export */ getUniqueIdentifier: function() { return /* binding */ getUniqueIdentifier; }, -/* harmony export */ includeObservers: function() { return /* binding */ includeObservers; }, -/* harmony export */ makeResolvedCallback: function() { return /* binding */ makeResolvedCallback; }, -/* harmony export */ mergeMax: function() { return /* binding */ mergeMax; }, -/* harmony export */ pruneCallbacks: function() { return /* binding */ pruneCallbacks; }, -/* harmony export */ resolveDeps: function() { return /* binding */ resolveDeps; } +/* harmony export */ addBlockedCallbacks: function() { return /* binding */ addBlockedCallbacks; }, +/* harmony export */ addCompletedCallbacks: function() { return /* binding */ addCompletedCallbacks; }, +/* harmony export */ addExecutedCallbacks: function() { return /* binding */ addExecutedCallbacks; }, +/* harmony export */ addExecutingCallbacks: function() { return /* binding */ addExecutingCallbacks; }, +/* harmony export */ addPrioritizedCallbacks: function() { return /* binding */ addPrioritizedCallbacks; }, +/* harmony export */ addRequestedCallbacks: function() { return /* binding */ addRequestedCallbacks; }, +/* harmony export */ addStoredCallbacks: function() { return /* binding */ addStoredCallbacks; }, +/* harmony export */ addWatchedCallbacks: function() { return /* binding */ addWatchedCallbacks; }, +/* harmony export */ aggregateCallbacks: function() { return /* binding */ aggregateCallbacks; }, +/* harmony export */ executeCallback: function() { return /* binding */ executeCallback; }, +/* harmony export */ removeBlockedCallbacks: function() { return /* binding */ removeBlockedCallbacks; }, +/* harmony export */ removeExecutedCallbacks: function() { return /* binding */ removeExecutedCallbacks; }, +/* harmony export */ removeExecutingCallbacks: function() { return /* binding */ removeExecutingCallbacks; }, +/* harmony export */ removePrioritizedCallbacks: function() { return /* binding */ removePrioritizedCallbacks; }, +/* harmony export */ removeRequestedCallbacks: function() { return /* binding */ removeRequestedCallbacks; }, +/* harmony export */ removeStoredCallbacks: function() { return /* binding */ removeStoredCallbacks; }, +/* harmony export */ removeWatchedCallbacks: function() { return /* binding */ removeWatchedCallbacks; } /* harmony export */ }); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var _dependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dependencies */ "./src/actions/dependencies.js"); -/* harmony import */ var _paths__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./paths */ "./src/actions/paths.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/keys.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/map.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pick.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pluck.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/zip.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/concat.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/toPairs.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mergeDeepRight.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/flatten.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/values.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/intersection.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assocPath.js"); +/* harmony import */ var _constants_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants/constants */ "./src/constants/constants.js"); +/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants */ "./src/actions/constants.js"); +/* harmony import */ var _reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../reducers/callbacks */ "./src/reducers/callbacks.ts"); +/* harmony import */ var _dependencies__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./dependencies */ "./src/actions/dependencies.js"); +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ "./src/actions/utils.js"); +/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./index */ "./src/actions/index.js"); +/* harmony import */ var redux_actions__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! redux-actions */ "./node_modules/redux-actions/es/createAction.js"); +/* harmony import */ var _patch__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./patch */ "./src/actions/patch.ts"); +/* harmony import */ var _paths__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./paths */ "./src/actions/paths.js"); +/* harmony import */ var _requestDependencies__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./requestDependencies */ "./src/actions/requestDependencies.ts"); +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(typeof e + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } -var DIRECT = 2; -var INDIRECT = 1; -var mergeMax = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.mergeWith)(Math.max); -var combineIdAndProp = function combineIdAndProp(_ref) { - var id = _ref.id, - property = _ref.property; - return "".concat((0,_dependencies__WEBPACK_IMPORTED_MODULE_1__.stringifyId)(id), ".").concat(property); -}; -function getCallbacksByInput(graphs, paths, id, prop, changeType) { - var withPriority = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; - var matches = []; - var idAndProp = combineIdAndProp({ - id, - property: prop - }); - if (typeof id === 'string') { - // standard id version - var callbacks = (graphs.inputMap[id] || {})[prop]; - if (!callbacks) { - return []; - } - callbacks.forEach((0,_dependencies__WEBPACK_IMPORTED_MODULE_1__.addAllResolvedFromOutputs)(resolveDeps(), paths, matches)); - } else { - // wildcard version - var _keys = Object.keys(id).sort(); - var vals = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.props)(_keys, id); - var keyStr = _keys.join(','); - var patterns = (graphs.inputPatterns[keyStr] || {})[prop]; - if (!patterns) { - return []; - } - patterns.forEach(function (pattern) { - if ((0,_dependencies__WEBPACK_IMPORTED_MODULE_1__.idMatch)(_keys, vals, pattern.values)) { - pattern.callbacks.forEach((0,_dependencies__WEBPACK_IMPORTED_MODULE_1__.addAllResolvedFromOutputs)(resolveDeps(_keys, vals, pattern.values), paths, matches)); - } - }); + + + + + + + + + + +var addBlockedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_9__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.AddBlocked); +var addCompletedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_9__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackAggregateActionType.AddCompleted); +var addExecutedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_9__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.AddExecuted); +var addExecutingCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_9__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.AddExecuting); +var addPrioritizedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_9__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.AddPrioritized); +var addRequestedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_9__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.AddRequested); +var addStoredCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_9__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.AddStored); +var addWatchedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_9__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.AddWatched); +var removeExecutedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_9__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.RemoveExecuted); +var removeBlockedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_9__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.RemoveBlocked); +var removeExecutingCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_9__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.RemoveExecuting); +var removePrioritizedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_9__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.RemovePrioritized); +var removeRequestedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_9__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.RemoveRequested); +var removeStoredCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_9__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.RemoveStored); +var removeWatchedCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_9__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackActionType.RemoveWatched); +var aggregateCallbacks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_9__["default"])(_reducers_callbacks__WEBPACK_IMPORTED_MODULE_2__.CallbackAggregateActionType.Aggregate); +var updateResourceUsage = (0,redux_actions__WEBPACK_IMPORTED_MODULE_9__["default"])('UPDATE_RESOURCE_USAGE'); +var addCallbackJob = (0,redux_actions__WEBPACK_IMPORTED_MODULE_9__["default"])('ADD_CALLBACK_JOB'); +var removeCallbackJob = (0,redux_actions__WEBPACK_IMPORTED_MODULE_9__["default"])('REMOVE_CALLBACK_JOB'); +var setCallbackJobOutdated = (0,redux_actions__WEBPACK_IMPORTED_MODULE_9__["default"])('CALLBACK_JOB_OUTDATED'); +function unwrapIfNotMulti(paths, idProps, spec, anyVals, depType) { + var msg = ''; + if ((0,_dependencies__WEBPACK_IMPORTED_MODULE_3__.isMultiValued)(spec)) { + return [idProps, msg]; } - matches.forEach(function (match) { - match.changedPropIds[idAndProp] = changeType || DIRECT; - if (withPriority) { - match.priority = getPriority(graphs, paths, match); + if (idProps.length !== 1) { + if (!idProps.length) { + var isStr = typeof spec.id === 'string'; + msg = 'A nonexistent object was used in an `' + depType + '` of a Dash callback. The id of this object is ' + (isStr ? '`' + spec.id + '`' : JSON.stringify(spec.id) + (anyVals ? ' with MATCH values ' + anyVals : '')) + ' and the property is `' + spec.property + (isStr ? '`. The string ids in the current layout are: [' + (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(paths.strs).join(', ') + ']' : '`. The wildcard ids currently available are logged above.'); + } else { + msg = 'Multiple objects were found for an `' + depType + '` of a callback that only takes one value. The id spec is ' + JSON.stringify(spec.id) + (anyVals ? ' with MATCH values ' + anyVals : '') + ' and the property is `' + spec.property + '`. The objects we found are: ' + JSON.stringify((0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])(['id', 'property']), idProps)); } - }); - return matches; + } + return [idProps[0], msg]; } -/* - * Builds a tree of all callbacks that can be triggered by the provided callback. - * Uses the number of callbacks at each tree depth and the total depth of the tree - * to create a sortable priority hash. - */ -function getPriority(graphs, paths, callback) { - var callbacks = [callback]; - var touchedOutputs = {}; - var touchedCbIds = {}; - var priority = []; - while (callbacks.length) { - callbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.filter)(function (c) { - var touched = touchedCbIds[c.resolvedId]; - touchedCbIds[c.resolvedId] = true; - return touched; - }, callbacks); - var outputs = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.filter)(function (o) { - return !touchedOutputs[combineIdAndProp(o)]; - }, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (cb) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)(cb.getOutputs(paths)); - }, callbacks))); - outputs.forEach(function (o) { - return touchedOutputs[combineIdAndProp(o)] = true; - }); - callbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (_ref2) { - var id = _ref2.id, - property = _ref2.property; - return getCallbacksByInput(graphs, paths, id, property, INDIRECT, false); - }, outputs)); - if (callbacks.length) { - priority.push(callbacks.length); +function fillVals(paths, layout, cb, specs, depType) { + var allowAllMissing = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false; + var getter = depType === 'Input' ? cb.getInputs : cb.getState; + var errors = []; + var emptyMultiValues = 0; + var inputVals = getter(paths).map(function (inputList, i) { + var _unwrapIfNotMulti = unwrapIfNotMulti(paths, inputList.map(function (_ref) { + var id = _ref.id, + property = _ref.property, + path_ = _ref.path; + return { + id, + property, + value: (0,ramda__WEBPACK_IMPORTED_MODULE_13__["default"])([].concat(_toConsumableArray(path_), ['props', property]), layout) + }; + }), specs[i], cb.anyVals, depType), + _unwrapIfNotMulti2 = _slicedToArray(_unwrapIfNotMulti, 2), + inputs = _unwrapIfNotMulti2[0], + inputError = _unwrapIfNotMulti2[1]; + if ((0,_dependencies__WEBPACK_IMPORTED_MODULE_3__.isMultiValued)(specs[i]) && !inputs.length) { + emptyMultiValues++; } - } - priority.unshift(priority.length); - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (i) { - return Math.min(i, 35).toString(36); - }, priority).join(''); -} -function getAllSubsequentOutputsForCallback(graphs, paths, callback) { - var callbacks = [callback]; - var touchedOutputs = {}; - // this traverses the graph all the way to the end - while (callbacks.length) { - // don't add it if it already exists based on id and props - var outputs = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.filter)(function (o) { - return !touchedOutputs[combineIdAndProp(o)]; - }, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (cb) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)(cb.getOutputs(paths)); - }, callbacks))); - touchedOutputs = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.reduce)(function (touched, o) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assoc)(combineIdAndProp(o), true, touched); - }, touchedOutputs, outputs); - callbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (_ref3) { - var id = _ref3.id, - property = _ref3.property; - return getCallbacksByInput(graphs, paths, id, property, INDIRECT, false); - }, outputs)); - } - return touchedOutputs; -} -var getReadyCallbacks = function getReadyCallbacks(paths, candidates) { - var callbacks = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : candidates; - var graphs = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - // Skip if there's no candidates - if (!candidates.length) { - return []; - } - // Find all outputs of all active callbacks - var outputs = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(combineIdAndProp, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.reduce)(function (o, cb) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(o, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)(cb.getOutputs(paths))); - }, [], callbacks)); - // Make `outputs` hash table for faster access - var outputsMap = {}; - outputs.forEach(function (output) { - return outputsMap[output] = true; - }); - // find all the outputs touched by activeCallbacks - // remove this check if graph is accessible all the time - if (Object.keys(graphs).length) { - //not sure if graph will be accessible all the time - var allTouchedOutputs = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (cb) { - return getAllSubsequentOutputsForCallback(graphs, paths, cb); - }, callbacks)); - // overrrides the outputsMap, will duplicate callbacks filtered - // this is only done to silence typescript errors - if (allTouchedOutputs.length > 0) { - outputsMap = Object.assign.apply(Object, [allTouchedOutputs[0]].concat(_toConsumableArray(allTouchedOutputs))); + if (inputError) { + errors.push(inputError); } - } - // Find `requested` callbacks that do not depend on a outstanding output (as either input or state) - // Outputs which overlap an input do not count as an outstanding output - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.filter)(function (cb) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.all)(function (cbp) { - return !outputsMap[combineIdAndProp(cbp)]; - }, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.difference)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)(cb.getInputs(paths)), (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)(cb.getOutputs(paths)))); - }, candidates); -}; -var getLayoutCallbacks = function getLayoutCallbacks(graphs, paths, layout, options) { - var exclusions = []; - var callbacks = (0,_dependencies__WEBPACK_IMPORTED_MODULE_1__.getUnfilteredLayoutCallbacks)(graphs, paths, layout, options); - /* - Remove from the initial callbacks those that are left with only excluded inputs. - Exclusion of inputs happens when: - - an input is missing - - an input in the initial callback chain depends only on excluded inputs - Further exclusion might happen after callbacks return with: - - PreventUpdate - - no_update - */ - while (true) { - // Find callbacks for which all inputs are missing or in the exclusions - var _partition = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.partition)(function (_ref4) { - var inputs = _ref4.callback.inputs, - getInputs = _ref4.getInputs; - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.all)(_dependencies__WEBPACK_IMPORTED_MODULE_1__.isMultiValued, inputs) || !(0,ramda__WEBPACK_IMPORTED_MODULE_0__.isEmpty)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.difference)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(combineIdAndProp, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)(getInputs(paths))), exclusions)); - }, callbacks), - _partition2 = _slicedToArray(_partition, 2), - included = _partition2[0], - excluded = _partition2[1]; - // If there's no additional exclusions, break loop - callbacks have been cleaned - if (!excluded.length) { - break; + return inputs; + }); + if (errors.length) { + if (allowAllMissing && errors.length + emptyMultiValues === inputVals.length) { + // We have at least one non-multivalued input, but all simple and + // multi-valued inputs are missing. + // (if all inputs are multivalued and all missing we still return + // them as normal, and fire the callback.) + return null; } - callbacks = included; - // update exclusions with all additional excluded outputs - exclusions = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(exclusions, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(combineIdAndProp, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (_ref5) { - var getOutputs = _ref5.getOutputs; - return getOutputs(paths); - }, excluded)))); + // If we get here we have some missing and some present inputs. + // Or all missing in a context that doesn't allow this. + // That's a real problem, so throw the first message as an error. + refErr(errors, paths); } - if (options.filterRoot) { - var rootId = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(['props', 'id'], layout); - if (rootId) { - rootId = (0,_dependencies__WEBPACK_IMPORTED_MODULE_1__.stringifyId)(rootId); - // Filter inputs that are not present in the response - callbacks = callbacks.filter(function (cb) { - return cb.callback.inputs.reduce(function (previous, input) { - return previous || (0,_dependencies__WEBPACK_IMPORTED_MODULE_1__.stringifyId)(input.id) == rootId && options.filterRoot.includes(input.property); - }, false); - }); - } + return inputVals; +} +function refErr(errors, paths) { + var err = errors[0]; + if (err.indexOf('logged above') !== -1) { + // Wildcard reference errors mention a list of wildcard specs logged + // TODO: unwrapped list of wildcard ids? + // eslint-disable-next-line no-console + console.error(paths.objs); } - /* - Return all callbacks with an `executionGroup` to allow group-processing - */ - var executionGroup = Math.random().toString(16); - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (cb) { - return _objectSpread(_objectSpread({}, cb), {}, { - executionGroup - }); - }, callbacks); -}; -var getUniqueIdentifier = function getUniqueIdentifier(_ref6) { - var anyVals = _ref6.anyVals, - _ref6$callback = _ref6.callback, - inputs = _ref6$callback.inputs, - outputs = _ref6$callback.outputs, - state = _ref6$callback.state; - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(combineIdAndProp, [].concat(_toConsumableArray(inputs), _toConsumableArray(outputs), _toConsumableArray(state))), Array.isArray(anyVals) ? anyVals : anyVals === '' ? [] : [anyVals]).join(','); -}; -function includeObservers(id, properties, graphs, paths) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (propName) { - return getCallbacksByInput(graphs, paths, id, propName); - }, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.keys)(properties))); + throw new ReferenceError(err); } -/* - * Create a pending callback object. Includes the original callback definition, - * its resolved ID (including the value of all MATCH wildcards), - * accessors to find all inputs, outputs, and state involved in this - * callback (lazy as not all users will want all of these). - */ -var makeResolvedCallback = function makeResolvedCallback(callback, resolve, anyVals) { - return { - callback, - anyVals, - resolvedId: callback.output + anyVals, - getOutputs: function getOutputs(paths) { - return callback.outputs.map(resolve(paths)); - }, - getInputs: function getInputs(paths) { - return callback.inputs.map(resolve(paths)); - }, - getState: function getState(paths) { - return callback.state.map(resolve(paths)); - }, - changedPropIds: {}, - initialCall: false - }; +var getVals = function getVals(input) { + return Array.isArray(input) ? (0,ramda__WEBPACK_IMPORTED_MODULE_14__["default"])('value', input) : input.value; }; -function pruneCallbacks(callbacks, paths) { - var _partition3 = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.partition)(function (_ref7) { - var getOutputs = _ref7.getOutputs, - outputs = _ref7.callback.outputs; - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)(getOutputs(paths)).length === outputs.length; - }, callbacks), - _partition4 = _slicedToArray(_partition3, 2), - removed = _partition4[1]; - var _partition5 = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.partition)(function (_ref8) { - var getOutputs = _ref8.getOutputs; - return !(0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)(getOutputs(paths)).length; - }, removed), - _partition6 = _slicedToArray(_partition5, 2), - modified = _partition6[1]; - var added = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (cb) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assoc)('changedPropIds', (0,ramda__WEBPACK_IMPORTED_MODULE_0__.pickBy)(function (_, propId) { - return (0,_paths__WEBPACK_IMPORTED_MODULE_2__.getPath)(paths, (0,_dependencies__WEBPACK_IMPORTED_MODULE_1__.splitIdAndProp)(propId).id); - }, cb.changedPropIds), cb); - }, modified); - return { - added, - removed - }; +var zipIfArray = function zipIfArray(a, b) { + return Array.isArray(a) ? (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])(a, b) : [[a, b]]; +}; +function cleanOutputProp(property) { + return property.split('@')[0]; } -function resolveDeps(refKeys, refVals, refPatternVals) { - return function (paths) { - return function (_ref9) { - var idPattern = _ref9.id, - property = _ref9.property; - if (typeof idPattern === 'string') { - var _path = (0,_paths__WEBPACK_IMPORTED_MODULE_2__.getPath)(paths, idPattern); - return _path ? [{ - id: idPattern, - property, - path: _path - }] : []; - } - var _keys = Object.keys(idPattern).sort(); - var patternVals = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.props)(_keys, idPattern); - var keyStr = _keys.join(','); - var keyPaths = paths.objs[keyStr]; - if (!keyPaths) { - return []; - } - var result = []; - keyPaths.forEach(function (_ref10) { - var vals = _ref10.values, - path = _ref10.path; - if ((0,_dependencies__WEBPACK_IMPORTED_MODULE_1__.idMatch)(_keys, vals, patternVals, refKeys, refVals, refPatternVals)) { - result.push({ - id: (0,ramda__WEBPACK_IMPORTED_MODULE_0__.zipObj)(_keys, vals), - property, - path - }); - } - }); - return result; - }; - }; +function handleClientside(_x, _x2, _x3, _x4) { + return _handleClientside.apply(this, arguments); } +function _handleClientside() { + _handleClientside = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(dispatch, clientside_function, config, payload) { + var dc, inputs, outputs, state, requestTime, inputDict, stateDict, result, status, _dc$namespace, _returnValue, namespace, function_name, args, returnValue, totalTime, resources; + return _regeneratorRuntime().wrap(function _callee2$(_context3) { + while (1) switch (_context3.prev = _context3.next) { + case 0: + dc = window.dash_clientside = window.dash_clientside || {}; + if (!dc.no_update) { + Object.defineProperty(dc, 'no_update', { + value: { + description: 'Return to prevent updating an Output.' + }, + writable: false + }); + Object.defineProperty(dc, 'PreventUpdate', { + value: { + description: 'Throw to prevent updating all Outputs.' + }, + writable: false + }); + } + inputs = payload.inputs, outputs = payload.outputs, state = payload.state; + requestTime = Date.now(); + inputDict = inputsToDict(inputs); + stateDict = inputsToDict(state); + result = {}; + status = _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUS.OK; + _context3.prev = 8; + namespace = clientside_function.namespace, function_name = clientside_function.function_name; + args = inputs.map(getVals); + if (state) { + args = (0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(args, state.map(getVals)); + } -/***/ }), - -/***/ "./src/actions/isLoading.ts": -/*!**********************************!*\ - !*** ./src/actions/isLoading.ts ***! - \**********************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ setIsLoading: function() { return /* binding */ setIsLoading; } -/* harmony export */ }); -/* harmony import */ var redux_actions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! redux-actions */ "./node_modules/redux-actions/es/createAction.js"); -/* harmony import */ var _reducers_isLoading__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../reducers/isLoading */ "./src/reducers/isLoading.ts"); - - -var setIsLoading = (0,redux_actions__WEBPACK_IMPORTED_MODULE_1__["default"])(_reducers_isLoading__WEBPACK_IMPORTED_MODULE_0__.IsLoadingActionType.Set); - -/***/ }), - -/***/ "./src/actions/loadingMap.ts": -/*!***********************************!*\ - !*** ./src/actions/loadingMap.ts ***! - \***********************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ setLoadingMap: function() { return /* binding */ setLoadingMap; } -/* harmony export */ }); -/* harmony import */ var redux_actions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! redux-actions */ "./node_modules/redux-actions/es/createAction.js"); -/* harmony import */ var _reducers_loadingMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../reducers/loadingMap */ "./src/reducers/loadingMap.ts"); - - -var setLoadingMap = (0,redux_actions__WEBPACK_IMPORTED_MODULE_1__["default"])(_reducers_loadingMap__WEBPACK_IMPORTED_MODULE_0__.LoadingMapActionType.Set); - -/***/ }), - -/***/ "./src/actions/patch.ts": -/*!******************************!*\ - !*** ./src/actions/patch.ts ***! - \******************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ handlePatch: function() { return /* binding */ handlePatch; }, -/* harmony export */ isPatch: function() { return /* binding */ isPatch; } -/* harmony export */ }); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } -function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } -function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } -function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } + // setup callback context + dc.callback_context = {}; + dc.callback_context.triggered = payload.changedPropIds.map(function (prop_id) { + return { + prop_id: prop_id, + value: inputDict[prop_id] + }; + }); + dc.callback_context.inputs_list = inputs; + dc.callback_context.inputs = inputDict; + dc.callback_context.states_list = state; + dc.callback_context.states = stateDict; + returnValue = (_dc$namespace = dc[namespace])[function_name].apply(_dc$namespace, _toConsumableArray(args)); + delete dc.callback_context; + if (!(typeof ((_returnValue = returnValue) === null || _returnValue === void 0 ? void 0 : _returnValue.then) === 'function')) { + _context3.next = 24; + break; + } + _context3.next = 23; + return returnValue; + case 23: + returnValue = _context3.sent; + case 24: + zipIfArray(outputs, returnValue).forEach(function (_ref10) { + var _ref11 = _slicedToArray(_ref10, 2), + outi = _ref11[0], + reti = _ref11[1]; + zipIfArray(outi, reti).forEach(function (_ref12) { + var _ref13 = _slicedToArray(_ref12, 2), + outij = _ref13[0], + retij = _ref13[1]; + var id = outij.id, + property = outij.property; + var idStr = (0,_dependencies__WEBPACK_IMPORTED_MODULE_3__.stringifyId)(id); + var dataForId = result[idStr] = result[idStr] || {}; + if (retij !== dc.no_update) { + dataForId[cleanOutputProp(property)] = retij; + } + }); + }); + _context3.next = 35; + break; + case 27: + _context3.prev = 27; + _context3.t0 = _context3["catch"](8); + if (!(_context3.t0 === dc.PreventUpdate)) { + _context3.next = 33; + break; + } + status = _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUS.PREVENT_UPDATE; + _context3.next = 35; + break; + case 33: + status = _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUS.CLIENTSIDE_ERROR; + throw _context3.t0; + case 35: + _context3.prev = 35; + delete dc.callback_context; -function isPatch(obj) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.has)('__dash_patch_update', obj); -} -function getLocationIndex(value, previous) { - if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__.is)(Number, value) && value < 0) { - return previous.length + value; - } - return value; + // Setting server = client forces network = 0 + totalTime = Date.now() - requestTime; + resources = { + __dash_server: totalTime, + __dash_client: totalTime, + __dash_upload: 0, + __dash_download: 0 + }; + if (config.ui) { + dispatch(updateResourceUsage({ + id: payload.output, + usage: resources, + status, + result, + inputs, + state + })); + } + return _context3.finish(35); + case 41: + return _context3.abrupt("return", result); + case 42: + case "end": + return _context3.stop(); + } + }, _callee2, null, [[8, 27, 35, 41]]); + })); + return _handleClientside.apply(this, arguments); } -function getLocationPath(location, obj) { - var current = []; - for (var i = 0; i < location.length; i++) { - var value = getLocationIndex(location[i], (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(current, obj)); - current.push(value); - } - return current; +function sideUpdate(outputs, dispatch, paths) { + (0,ramda__WEBPACK_IMPORTED_MODULE_17__["default"])(outputs).forEach(function (_ref2) { + var _ref3 = _slicedToArray(_ref2, 2), + id = _ref3[0], + value = _ref3[1]; + var _id$split = id.split('.'), + _id$split2 = _slicedToArray(_id$split, 2), + componentId = _id$split2[0], + propName = _id$split2[1]; + var componentPath = paths.strs[componentId]; + dispatch((0,___WEBPACK_IMPORTED_MODULE_5__.updateProps)({ + props: { + [propName]: value + }, + itempath: componentPath + })); + dispatch((0,___WEBPACK_IMPORTED_MODULE_5__.notifyObservers)({ + id: componentId, + props: { + [propName]: value + } + })); + }); } -var patchHandlers = { - Assign: function Assign(previous, patchOperation) { - var params = patchOperation.params, - location = patchOperation.location; - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assocPath)(location, params.value, previous); - }, - Merge: function Merge(previous, patchOperation) { - var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(patchOperation.location, previous); - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assocPath)(patchOperation.location, _objectSpread(_objectSpread({}, prev), patchOperation.params.value), previous); - }, - Extend: function Extend(previous, patchOperation) { - var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(patchOperation.location, previous); - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assocPath)(patchOperation.location, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(prev, patchOperation.params.value), previous); - }, - Delete: function Delete(previous, patchOperation) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.dissocPath)(patchOperation.location, previous); - }, - Insert: function Insert(previous, patchOperation) { - var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(patchOperation.location, previous); - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assocPath)(patchOperation.location, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.insert)(getLocationIndex(patchOperation.params.index, prev), patchOperation.params.value, prev), previous); - }, - Append: function Append(previous, patchOperation) { - var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(patchOperation.location, previous); - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assocPath)(patchOperation.location, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.append)(patchOperation.params.value, prev), previous); - }, - Prepend: function Prepend(previous, patchOperation) { - var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(patchOperation.location, previous); - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assocPath)(patchOperation.location, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.prepend)(patchOperation.params.value, prev), previous); - }, - Add: function Add(previous, patchOperation) { - var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(patchOperation.location, previous); - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assocPath)(patchOperation.location, prev + patchOperation.params.value, previous); - }, - Sub: function Sub(previous, patchOperation) { - var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(patchOperation.location, previous); - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assocPath)(patchOperation.location, prev - patchOperation.params.value, previous); - }, - Mul: function Mul(previous, patchOperation) { - var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(patchOperation.location, previous); - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assocPath)(patchOperation.location, prev * patchOperation.params.value, previous); - }, - Div: function Div(previous, patchOperation) { - var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(patchOperation.location, previous); - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assocPath)(patchOperation.location, prev / patchOperation.params.value, previous); - }, - Clear: function Clear(previous, patchOperation) { - var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(patchOperation.location, previous); - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assocPath)(patchOperation.location, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.empty)(prev), previous); - }, - Reverse: function Reverse(previous, patchOperation) { - var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(patchOperation.location, previous); - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assocPath)(patchOperation.location, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.reverse)(prev), previous); - }, - Remove: function Remove(previous, patchOperation) { - var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(patchOperation.location, previous); - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assocPath)(patchOperation.location, prev.filter(function (item) { - return !(0,ramda__WEBPACK_IMPORTED_MODULE_0__.equals)(item, patchOperation.params.value); - }), previous); - } -}; -function handlePatch(previousValue, patchValue) { - var reducedValue = previousValue; - for (var i = 0; i < patchValue.operations.length; i++) { - var patch = patchValue.operations[i]; - patch.location = getLocationPath(patch.location, reducedValue); - var handler = patchHandlers[patch.operation]; - if (!handler) { - throw new Error("Invalid Operation ".concat(patch.operation)); - } - reducedValue = handler(reducedValue, patch); +function handleServerside(dispatch, hooks, config, payload, paths, long, additionalArgs, getState, output) { + if (hooks.request_pre) { + hooks.request_pre(payload); } - return reducedValue; -} - -/***/ }), - -/***/ "./src/actions/requestDependencies.ts": -/*!********************************************!*\ - !*** ./src/actions/requestDependencies.ts ***! - \********************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ requestDependencies: function() { return /* binding */ requestDependencies; } -/* harmony export */ }); -/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); -/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index */ "./src/actions/index.js"); -/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./api */ "./src/actions/api.js"); - - + var requestTime = Date.now(); + var body = JSON.stringify(payload); + var cacheKey; + var job; + var runningOff; + var progressDefault; + var moreArgs = additionalArgs; + var fetchCallback = function fetchCallback() { + var headers = (0,___WEBPACK_IMPORTED_MODULE_5__.getCSRFHeader)(); + var url = "".concat((0,_utils__WEBPACK_IMPORTED_MODULE_4__.urlBase)(config), "_dash-update-component"); + var addArg = function addArg(name, value) { + var delim = '?'; + if (url.includes('?')) { + delim = '&'; + } + url = "".concat(url).concat(delim).concat(name, "=").concat(value); + }; + if (cacheKey) { + addArg('cacheKey', cacheKey); + } + if (job) { + addArg('job', job); + } + if (moreArgs) { + moreArgs.forEach(function (_ref4) { + var _ref5 = _slicedToArray(_ref4, 2), + key = _ref5[0], + value = _ref5[1]; + return addArg(key, value); + }); + moreArgs = moreArgs.filter(function (_ref6) { + var _ref7 = _slicedToArray(_ref6, 3), + _ = _ref7[0], + __ = _ref7[1], + single = _ref7[2]; + return !single; + }); + } + return fetch(url, (0,ramda__WEBPACK_IMPORTED_MODULE_18__["default"])(config.fetch, { + method: 'POST', + headers, + body + })); + }; + return new Promise(function (resolve, reject) { + var handleOutput = function handleOutput(res) { + var status = res.status; + if (job) { + var callbackJob = getState().callbackJobs[job]; + if (callbackJob !== null && callbackJob !== void 0 && callbackJob.outdated) { + dispatch(removeCallbackJob({ + jobId: job + })); + return resolve({}); + } + } + function recordProfile(result) { + if (config.ui) { + // Callback profiling - only relevant if we're showing the debug ui + var resources = { + __dash_server: 0, + __dash_client: Date.now() - requestTime, + __dash_upload: body.length, + __dash_download: Number(res.headers.get('Content-Length')) + }; + var timingHeaders = res.headers.get('Server-Timing') || ''; + timingHeaders.split(',').forEach(function (header) { + var name = header.split(';')[0]; + var dur = header.match(/;dur=[0-9.]+/); + if (dur) { + resources[name] = Number(dur[0].slice(5)); + } + }); + dispatch(updateResourceUsage({ + id: payload.output, + usage: resources, + status, + result, + inputs: payload.inputs, + state: payload.state + })); + } + } + var finishLine = function finishLine(data) { + var multi = data.multi, + response = data.response; + if (hooks.request_post) { + hooks.request_post(payload, response); + } + var result; + if (multi) { + result = response; + } else { + var _output = payload.output; + var id = _output.substr(0, _output.lastIndexOf('.')); + result = { + [id]: response.props + }; + } + recordProfile(result); + resolve(result); + }; + var completeJob = function completeJob() { + if (job) { + dispatch(removeCallbackJob({ + jobId: job + })); + } + if (runningOff) { + sideUpdate(runningOff, dispatch, paths); + } + if (progressDefault) { + sideUpdate(progressDefault, dispatch, paths); + } + }; + if (status === _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUS.OK) { + res.json().then(function (data) { + if (!cacheKey && data.cacheKey) { + cacheKey = data.cacheKey; + } + if (!job && data.job) { + var jobInfo = { + jobId: data.job, + cacheKey: data.cacheKey, + cancelInputs: data.cancel, + progressDefault: data.progressDefault, + output + }; + dispatch(addCallbackJob(jobInfo)); + job = data.job; + } + if (data.progress) { + sideUpdate(data.progress, dispatch, paths); + } + if (data.running) { + sideUpdate(data.running, dispatch, paths); + } + if (!runningOff && data.runningOff) { + runningOff = data.runningOff; + } + if (!progressDefault && data.progressDefault) { + progressDefault = data.progressDefault; + } + if (!long || data.response !== undefined) { + completeJob(); + finishLine(data); + } else { + // Poll chain. + setTimeout(handle, long.interval !== undefined ? long.interval : 500); + } + }); + } else if (status === _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUS.PREVENT_UPDATE) { + completeJob(); + recordProfile({}); + resolve({}); + } else { + completeJob(); + reject(res); + } + }; + var handleError = function handleError() { + if (config.ui) { + dispatch(updateResourceUsage({ + id: payload.output, + status: _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUS.NO_RESPONSE, + result: {}, + inputs: payload.inputs, + state: payload.state + })); + } + reject(new Error('Callback failed: the server did not respond.')); + }; + var handle = function handle() { + fetchCallback().then(handleOutput, handleError); + }; + handle(); + }); +} +function inputsToDict(inputs_list) { + // Ported directly from _utils.py, inputs_to_dict + // takes an array of inputs (some inputs may be an array) + // returns an Object (map): + // keys of the form `id.property` or `{"id": 0}.property` + // values contain the property value + if (!inputs_list) { + return {}; + } + var inputs = {}; + for (var i = 0; i < inputs_list.length; i++) { + if (Array.isArray(inputs_list[i])) { + var inputsi = inputs_list[i]; + for (var ii = 0; ii < inputsi.length; ii++) { + var _inputsi$ii$value; + var id_str = "".concat((0,_dependencies__WEBPACK_IMPORTED_MODULE_3__.stringifyId)(inputsi[ii].id), ".").concat(inputsi[ii].property); + inputs[id_str] = (_inputsi$ii$value = inputsi[ii].value) !== null && _inputsi$ii$value !== void 0 ? _inputsi$ii$value : null; + } + } else { + var _inputs_list$i$value; + var _id_str = "".concat((0,_dependencies__WEBPACK_IMPORTED_MODULE_3__.stringifyId)(inputs_list[i].id), ".").concat(inputs_list[i].property); + inputs[_id_str] = (_inputs_list$i$value = inputs_list[i].value) !== null && _inputs_list$i$value !== void 0 ? _inputs_list$i$value : null; + } + } + return inputs; +} +function executeCallback(cb, config, hooks, paths, layout, _ref8, dispatch, getState) { + var allOutputs = _ref8.allOutputs; + var _cb$callback = cb.callback, + output = _cb$callback.output, + inputs = _cb$callback.inputs, + state = _cb$callback.state, + clientside_function = _cb$callback.clientside_function, + long = _cb$callback.long, + dynamic_creator = _cb$callback.dynamic_creator, + force_no_output = _cb$callback.force_no_output; + try { + var inVals = fillVals(paths, layout, cb, inputs, 'Input', true); -function requestDependencies() { - return function (dispatch) { - (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.batch)(function () { - dispatch((0,_index__WEBPACK_IMPORTED_MODULE_1__.setGraphs)({})); - dispatch((0,_api__WEBPACK_IMPORTED_MODULE_2__["default"])('_dash-dependencies', 'GET', 'dependenciesRequest')); + /* Prevent callback if there's no inputs */ + if (inVals === null) { + return _objectSpread(_objectSpread({}, cb), {}, { + executionPromise: null + }); + } + var outputs = []; + var outputErrors = []; + allOutputs.forEach(function (out, i) { + var _unwrapIfNotMulti3 = unwrapIfNotMulti(paths, (0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])(['id', 'property']), out), cb.callback.outputs[i], cb.anyVals, 'Output'), + _unwrapIfNotMulti4 = _slicedToArray(_unwrapIfNotMulti3, 2), + outi = _unwrapIfNotMulti4[0], + erri = _unwrapIfNotMulti4[1]; + outputs.push(outi); + if (erri) { + outputErrors.push(erri); + } }); - }; + if (outputErrors.length) { + if ((0,ramda__WEBPACK_IMPORTED_MODULE_19__["default"])(inVals).length) { + refErr(outputErrors, paths); + } + // This case is all-empty multivalued wildcard inputs, + // which we would normally fire the callback for, except + // some outputs are missing. So instead we treat it like + // regular missing inputs and just silently prevent it. + return _objectSpread(_objectSpread({}, cb), {}, { + executionPromise: null + }); + } + var __execute = /*#__PURE__*/function () { + var _ref9 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { + var payload, data, newConfig, newHeaders, lastError, additionalArgs, _loop, _ret, retry; + return _regeneratorRuntime().wrap(function _callee$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + _context2.prev = 0; + payload = { + output, + outputs: (0,_dependencies__WEBPACK_IMPORTED_MODULE_3__.isMultiOutputProp)(output) ? outputs : outputs[0], + inputs: inVals, + changedPropIds: (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(cb.changedPropIds), + force_no_output: force_no_output, + state: cb.callback.state.length ? fillVals(paths, layout, cb, state, 'State') : undefined + }; + if (!clientside_function) { + _context2.next = 13; + break; + } + _context2.prev = 3; + _context2.next = 6; + return handleClientside(dispatch, clientside_function, config, payload); + case 6: + data = _context2.sent; + return _context2.abrupt("return", { + data, + payload + }); + case 10: + _context2.prev = 10; + _context2.t0 = _context2["catch"](3); + return _context2.abrupt("return", { + error: _context2.t0, + payload + }); + case 13: + newConfig = config; + newHeaders = null; + additionalArgs = []; + (0,ramda__WEBPACK_IMPORTED_MODULE_20__["default"])(getState().callbackJobs).forEach(function (job) { + if (cb.callback.output === job.output) { + // Terminate the old jobs that are not completed + // set as outdated for the callback promise to + // resolve and remove after. + additionalArgs.push(['oldJob', job.jobId, true]); + dispatch(setCallbackJobOutdated({ + jobId: job.jobId + })); + } + if (!job.cancelInputs) { + return; + } + var inter = (0,ramda__WEBPACK_IMPORTED_MODULE_21__["default"])(job.cancelInputs, cb.callback.inputs); + if (inter.length) { + additionalArgs.push(['cancelJob', job.jobId]); + if (job.progressDefault) { + sideUpdate(job.progressDefault, dispatch, paths); + } + } + }); + _loop = /*#__PURE__*/_regeneratorRuntime().mark(function _loop() { + var _data, currentLayout, body, oldJwt, newJwt; + return _regeneratorRuntime().wrap(function _loop$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return handleServerside(dispatch, hooks, newConfig, payload, paths, long, additionalArgs.length ? additionalArgs : undefined, getState, cb.callback.output); + case 3: + _data = _context.sent; + if (newHeaders) { + dispatch((0,___WEBPACK_IMPORTED_MODULE_5__.addHttpHeaders)(newHeaders)); + } + // Layout may have changed. + currentLayout = getState().layout; + (0,ramda__WEBPACK_IMPORTED_MODULE_19__["default"])(outputs).forEach(function (out) { + var propName = cleanOutputProp(out.property); + var outputPath = (0,_paths__WEBPACK_IMPORTED_MODULE_7__.getPath)(paths, out.id); + var previousValue = (0,ramda__WEBPACK_IMPORTED_MODULE_13__["default"])(outputPath.concat(['props', propName]), currentLayout); + var dataPath = [(0,_dependencies__WEBPACK_IMPORTED_MODULE_3__.stringifyId)(out.id), propName]; + var outputValue = (0,ramda__WEBPACK_IMPORTED_MODULE_13__["default"])(dataPath, _data); + if ((0,_patch__WEBPACK_IMPORTED_MODULE_6__.isPatch)(outputValue)) { + if (previousValue === undefined) { + throw new Error('Cannot patch undefined'); + } + _data = (0,ramda__WEBPACK_IMPORTED_MODULE_22__["default"])(dataPath, (0,_patch__WEBPACK_IMPORTED_MODULE_6__.handlePatch)(previousValue, outputValue), _data); + } + }); + if (dynamic_creator) { + setTimeout(function () { + return dispatch((0,_requestDependencies__WEBPACK_IMPORTED_MODULE_8__.requestDependencies)()); + }, 0); + } + return _context.abrupt("return", { + v: { + data: _data, + payload + } + }); + case 11: + _context.prev = 11; + _context.t0 = _context["catch"](0); + lastError = _context.t0; + if (!(retry <= _constants__WEBPACK_IMPORTED_MODULE_1__.MAX_AUTH_RETRIES && (_context.t0.status === _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUS.UNAUTHORIZED || _context.t0.status === _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUS.BAD_REQUEST))) { + _context.next = 29; + break; + } + _context.next = 17; + return _context.t0.text(); + case 17: + body = _context.sent; + if (!body.includes(_constants_constants__WEBPACK_IMPORTED_MODULE_0__.JWT_EXPIRED_MESSAGE)) { + _context.next = 29; + break; + } + if (!(hooks.request_refresh_jwt !== null)) { + _context.next = 29; + break; + } + oldJwt = null; + if (config.fetch.headers.Authorization) { + oldJwt = config.fetch.headers.Authorization.substr('Bearer '.length); + } + _context.next = 24; + return hooks.request_refresh_jwt(oldJwt); + case 24: + newJwt = _context.sent; + if (!newJwt) { + _context.next = 29; + break; + } + newHeaders = { + Authorization: "Bearer ".concat(newJwt) + }; + newConfig = (0,ramda__WEBPACK_IMPORTED_MODULE_18__["default"])(config, { + fetch: { + headers: newHeaders + } + }); + return _context.abrupt("return", 0); + case 29: + return _context.abrupt("return", 1); + case 30: + case "end": + return _context.stop(); + } + }, _loop, null, [[0, 11]]); + }); + retry = 0; + case 19: + if (!(retry <= _constants__WEBPACK_IMPORTED_MODULE_1__.MAX_AUTH_RETRIES)) { + _context2.next = 31; + break; + } + return _context2.delegateYield(_loop(), "t1", 21); + case 21: + _ret = _context2.t1; + if (!(_ret === 0)) { + _context2.next = 24; + break; + } + return _context2.abrupt("continue", 28); + case 24: + if (!(_ret === 1)) { + _context2.next = 26; + break; + } + return _context2.abrupt("break", 31); + case 26: + if (!_ret) { + _context2.next = 28; + break; + } + return _context2.abrupt("return", _ret.v); + case 28: + retry++; + _context2.next = 19; + break; + case 31: + return _context2.abrupt("return", { + error: lastError, + payload: null + }); + case 34: + _context2.prev = 34; + _context2.t2 = _context2["catch"](0); + return _context2.abrupt("return", { + error: _context2.t2, + payload: null + }); + case 37: + case "end": + return _context2.stop(); + } + }, _callee, null, [[0, 34], [3, 10]]); + })); + return function __execute() { + return _ref9.apply(this, arguments); + }; + }(); + var newCb = _objectSpread(_objectSpread({}, cb), {}, { + executionPromise: __execute() + }); + return newCb; + } catch (error) { + return _objectSpread(_objectSpread({}, cb), {}, { + executionPromise: { + error, + payload: null + } + }); + } } /***/ }), -/***/ "./src/config.ts": -/*!***********************!*\ - !*** ./src/config.ts ***! - \***********************/ +/***/ "./src/actions/constants.js": +/*!**********************************!*\ + !*** ./src/actions/constants.js ***! + \**********************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ getConfigFromDOM; } +/* harmony export */ MAX_AUTH_RETRIES: function() { return /* binding */ MAX_AUTH_RETRIES; }, +/* harmony export */ getAction: function() { return /* binding */ getAction; } /* harmony export */ }); -function getConfigFromDOM() { - var configElement = document.getElementById('_dash-config'); - return JSON.parse(configElement !== null && configElement !== void 0 && configElement.textContent ? configElement === null || configElement === void 0 ? void 0 : configElement.textContent : '{}'); -} +var actionList = { + ON_PROP_CHANGE: 1, + SET_REQUEST_QUEUE: 1, + SET_GRAPHS: 1, + SET_PATHS: 1, + SET_LAYOUT: 1, + SET_APP_LIFECYCLE: 1, + SET_CONFIG: 1, + ADD_HTTP_HEADERS: 1, + ON_ERROR: 1, + SET_HOOKS: 1 +}; +var getAction = function getAction(action) { + if (actionList[action]) { + return action; + } + throw new Error("".concat(action, " is not defined.")); +}; +var MAX_AUTH_RETRIES = 1; /***/ }), -/***/ "./src/observers/documentTitle.ts": -/*!****************************************!*\ - !*** ./src/observers/documentTitle.ts ***! - \****************************************/ +/***/ "./src/actions/dependencies.js": +/*!*************************************!*\ + !*** ./src/actions/dependencies.js ***! + \*************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -var updateTitle = function updateTitle(getState) { - var _getState = getState(), - config = _getState.config, - isLoading = _getState.isLoading; - var update_title = config === null || config === void 0 ? void 0 : config.update_title; - if (!update_title) { - return; - } - if (isLoading) { - if (document.title !== update_title) { - _observer.title = document.title; - document.title = update_title; - } - } else { - if (document.title === update_title) { - document.title = _observer.title; - } else { - _observer.title = document.title; - } - } -}; -var _observer = { - inputs: ['isLoading'], - mutationObserver: undefined, - observer: function observer(_ref) { - var getState = _ref.getState; - var _getState2 = getState(), - config = _getState2.config; - if (_observer.config !== config) { - var _observer$mutationObs; - _observer.config = config; - (_observer$mutationObs = _observer.mutationObserver) === null || _observer$mutationObs === void 0 || _observer$mutationObs.disconnect(); - _observer.mutationObserver = new MutationObserver(function () { - return updateTitle(getState); - }); - var title = document.querySelector('title'); - if (title) { - _observer.mutationObserver.observe(title, { - subtree: true, - childList: true, - attributes: true, - characterData: true - }); - } - } - updateTitle(getState); - } -}; -/* harmony default export */ __webpack_exports__["default"] = (_observer); - -/***/ }), - -/***/ "./src/observers/executedCallbacks.ts": -/*!********************************************!*\ - !*** ./src/observers/executedCallbacks.ts ***! - \********************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var _actions_callbacks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../actions/callbacks */ "./src/actions/callbacks.ts"); -/* harmony import */ var _actions_dependencies__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../actions/dependencies */ "./src/actions/dependencies.js"); -/* harmony import */ var _actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../actions/dependencies_ts */ "./src/actions/dependencies_ts.ts"); -/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../actions */ "./src/actions/index.js"); -/* harmony import */ var _actions_paths__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../actions/paths */ "./src/actions/paths.js"); -/* harmony import */ var _persistence__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../persistence */ "./src/persistence.js"); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ addAllResolvedFromOutputs: function() { return /* binding */ addAllResolvedFromOutputs; }, +/* harmony export */ computeGraphs: function() { return /* binding */ computeGraphs; }, +/* harmony export */ getUnfilteredLayoutCallbacks: function() { return /* binding */ getUnfilteredLayoutCallbacks; }, +/* harmony export */ getWatchedKeys: function() { return /* binding */ getWatchedKeys; }, +/* harmony export */ idMatch: function() { return /* binding */ idMatch; }, +/* harmony export */ isMultiOutputProp: function() { return /* binding */ isMultiOutputProp; }, +/* harmony export */ isMultiValued: function() { return /* binding */ isMultiValued; }, +/* harmony export */ parseIfWildcard: function() { return /* binding */ parseIfWildcard; }, +/* harmony export */ splitIdAndProp: function() { return /* binding */ splitIdAndProp; }, +/* harmony export */ stringifyId: function() { return /* binding */ stringifyId; }, +/* harmony export */ validateCallbacksToLayout: function() { return /* binding */ validateCallbacksToLayout; } +/* harmony export */ }); +/* harmony import */ var dependency_graph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! dependency-graph */ "./node_modules/dependency-graph/lib/dep_graph.js"); +/* harmony import */ var fast_isnumeric__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fast-isnumeric */ "./node_modules/fast-isnumeric/index.js"); +/* harmony import */ var fast_isnumeric__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fast_isnumeric__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/map.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/props.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/equals.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/isEmpty.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/forEachObjIndexed.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/keys.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/includes.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/difference.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/all.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/zip.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/intersection.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/values.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/flatten.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/zipObj.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/evolve.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assoc.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/ap.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/findIndex.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mergeRight.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/any.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/startsWith.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pluck.js"); +/* harmony import */ var _dependencies_ts__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dependencies_ts */ "./src/actions/dependencies_ts.ts"); +/* harmony import */ var _paths__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./paths */ "./src/actions/paths.js"); +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ "./src/actions/utils.js"); +/* harmony import */ var _registry__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../registry */ "./src/registry.js"); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } @@ -1773,1361 +2266,1547 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } -var observer = { - observer: function observer(_ref) { - var dispatch = _ref.dispatch, - getState = _ref.getState; - var _getState = getState(), - executed = _getState.callbacks.executed; - function applyProps(id, updatedProps) { - var _getState2 = getState(), - layout = _getState2.layout, - paths = _getState2.paths; - var itempath = (0,_actions_paths__WEBPACK_IMPORTED_MODULE_5__.getPath)(paths, id); - if (!itempath) { - return false; - } - // This is a callback-generated update. - // Check if this invalidates existing persisted prop values, - // or if persistence changed, whether this updates other props. - updatedProps = (0,_persistence__WEBPACK_IMPORTED_MODULE_6__.prunePersistence)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(itempath, layout), updatedProps, dispatch); - // In case the update contains whole components, see if any of - // those components have props to update to persist user edits. - var _applyPersistence = (0,_persistence__WEBPACK_IMPORTED_MODULE_6__.applyPersistence)({ - props: updatedProps - }, dispatch), - props = _applyPersistence.props; - dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_4__.updateProps)({ - itempath, - props, - source: 'response' - })); - return props; - } - var requestedCallbacks = []; - var storedCallbacks = []; - executed.forEach(function (cb) { - var _cb$predecessors; - var predecessors = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)((_cb$predecessors = cb.predecessors) !== null && _cb$predecessors !== void 0 ? _cb$predecessors : [], [cb.callback]); - var _cb$callback = cb.callback, - clientside_function = _cb$callback.clientside_function, - output = _cb$callback.output, - executionResult = cb.executionResult; - if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__.isNil)(executionResult)) { - return; - } - var data = executionResult.data, - error = executionResult.error, - payload = executionResult.payload; - if (data !== undefined) { - Object.entries(data).forEach(function (_ref2) { - var _ref3 = _slicedToArray(_ref2, 2), - id = _ref3[0], - props = _ref3[1]; - var parsedId = (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_2__.parseIfWildcard)(id); - var _getState3 = getState(), - graphs = _getState3.graphs, - oldLayout = _getState3.layout, - oldPaths = _getState3.paths; - // Components will trigger callbacks on their own as required (eg. derived) - var appliedProps = applyProps(parsedId, props); - // Add callbacks for modified inputs - requestedCallbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(requestedCallbacks, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (prop) { - return (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.getCallbacksByInput)(graphs, oldPaths, parsedId, prop, true); - }, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.keys)(props))).map(function (rcb) { - return _objectSpread(_objectSpread({}, rcb), {}, { - predecessors - }); - })); - var basePath = (0,_actions_paths__WEBPACK_IMPORTED_MODULE_5__.getPath)(oldPaths, parsedId); - if (!basePath) { - return; - } - var oldObj = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(basePath, oldLayout); - var childrenProps = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.pathOr)('defaultValue', [oldObj.namespace, oldObj.type], window.__dashprivate_childrenProps); - var handlePaths = function handlePaths(children, oldChildren, oldChildrenPath) { - var filterRoot = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; - var oPaths = getState().paths; - var paths = (0,_actions_paths__WEBPACK_IMPORTED_MODULE_5__.computePaths)(children, oldChildrenPath, oPaths); - dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_4__.setPaths)(paths)); - // Get callbacks for new layout (w/ execution group) - requestedCallbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(requestedCallbacks, (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.getLayoutCallbacks)(graphs, paths, children, { - chunkPath: oldChildrenPath, - filterRoot - }).map(function (rcb) { - return _objectSpread(_objectSpread({}, rcb), {}, { - predecessors - }); - })); - // Wildcard callbacks with array inputs (ALL / ALLSMALLER) need to trigger - // even due to the deletion of components - requestedCallbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(requestedCallbacks, (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.getLayoutCallbacks)(graphs, oldPaths, oldChildren, { - removedArrayInputsOnly: true, - newPaths: paths, - chunkPath: oldChildrenPath, - filterRoot - }).map(function (rcb) { - return _objectSpread(_objectSpread({}, rcb), {}, { - predecessors - }); - })); - }; - var recomputed = false; - ['children'].concat(childrenProps).forEach(function (childrenProp) { - if (recomputed) { - return; - } - if (childrenProp.includes('[]')) { - var _childrenProp$split$m = childrenProp.split('[]').map(function (p) { - return p.split('.').filter(function (e) { - return e; - }); - }), - _childrenProp$split$m2 = _slicedToArray(_childrenProp$split$m, 1), - frontPath = _childrenProp$split$m2[0]; - var frontObj = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(frontPath, appliedProps); - if (!frontObj) { - return; - } - // Crawl layout needs the ns/type - handlePaths(_objectSpread(_objectSpread({}, oldObj), {}, { - props: _objectSpread(_objectSpread({}, oldObj.props), appliedProps) - }), oldObj, basePath, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.keys)(appliedProps)); - // Only do it once for the component. - recomputed = true; - } else { - var childrenPropPath = childrenProp.split('.'); - var children = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(childrenPropPath, appliedProps); - if (!children) { - return; - } - var oldChildrenPath = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)((0,_actions_paths__WEBPACK_IMPORTED_MODULE_5__.getPath)(oldPaths, parsedId), ['props'].concat(childrenPropPath)); - var oldChildren = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(oldChildrenPath, oldLayout); - handlePaths(children, oldChildren, oldChildrenPath); - } - }); - // persistence edge case: if you explicitly update the - // persistence key, other props may change that require us - // to fire additional callbacks - var addedProps = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.pickBy)(function (_, k) { - return !(k in props); - }, appliedProps); - if (!(0,ramda__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(addedProps)) { - var _getState4 = getState(), - currentGraphs = _getState4.graphs, - paths = _getState4.paths; - requestedCallbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(requestedCallbacks, (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.includeObservers)(id, addedProps, currentGraphs, paths).map(function (rcb) { - return _objectSpread(_objectSpread({}, rcb), {}, { - predecessors - }); - })); - } - }); - // Add information about potentially updated outputs vs. updated outputs, - // this will be used to drop callbacks from execution groups when no output - // matching the downstream callback's inputs were modified - storedCallbacks.push(_objectSpread(_objectSpread({}, cb), {}, { - executionMeta: { - allProps: (0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.combineIdAndProp, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)(cb.getOutputs(getState().paths))), - updatedProps: (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (_ref4) { - var _ref5 = _slicedToArray(_ref4, 2), - id = _ref5[0], - value = _ref5[1]; - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (property) { - return (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.combineIdAndProp)({ - id, - property - }); - }, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.keys)(value)); - }, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.toPairs)(data))) - } - })); - } - if (error !== undefined) { - var outputs = payload ? (0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.combineIdAndProp, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)([payload.outputs])).join(', ') : output; - var message = "Callback error updating ".concat(outputs); - if (clientside_function) { - var ns = clientside_function.namespace, - fn = clientside_function.function_name; - message += " via clientside function ".concat(ns, ".").concat(fn); - } - (0,_actions__WEBPACK_IMPORTED_MODULE_4__.handleAsyncError)(error, message, dispatch); - storedCallbacks.push(_objectSpread(_objectSpread({}, cb), {}, { - executionMeta: { - allProps: (0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.combineIdAndProp, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)(cb.getOutputs(getState().paths))), - updatedProps: [] - } - })); - } - }); - dispatch((0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.aggregateCallbacks)([executed.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.removeExecutedCallbacks)(executed) : null, executed.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.addCompletedCallbacks)(executed.length) : null, storedCallbacks.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.addStoredCallbacks)(storedCallbacks) : null, requestedCallbacks.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.addRequestedCallbacks)(requestedCallbacks) : null])); - }, - inputs: ['callbacks.executed'] -}; -/* harmony default export */ __webpack_exports__["default"] = (observer); - -/***/ }), - -/***/ "./src/observers/executingCallbacks.ts": -/*!*********************************************!*\ - !*** ./src/observers/executingCallbacks.ts ***! - \*********************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var _actions_callbacks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../actions/callbacks */ "./src/actions/callbacks.ts"); -/* harmony import */ var _reducers_constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../reducers/constants */ "./src/reducers/constants.js"); -function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(typeof e + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } -function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } -function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } -function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } -function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } -function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } -function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } -function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - -var observer = { - observer: function observer(_ref) { - var dispatch = _ref.dispatch, - getState = _ref.getState; - var _getState = getState(), - executing = _getState.callbacks.executing; - var _partition = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.partition)(function (cb) { - return cb.executionPromise instanceof Promise; - }, executing), - _partition2 = _slicedToArray(_partition, 2), - deferred = _partition2[0], - skippedOrReady = _partition2[1]; - dispatch((0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.aggregateCallbacks)([executing.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.removeExecutingCallbacks)(executing) : null, deferred.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.addWatchedCallbacks)(deferred) : null, skippedOrReady.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.addExecutedCallbacks)(skippedOrReady.map(function (cb) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assoc)('executionResult', cb.executionPromise, cb); - })) : null])); - deferred.forEach( /*#__PURE__*/function () { - var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(cb) { - var result, _getState2, watched, appLifecycle, callback_resolved, currentCb; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) switch (_context.prev = _context.next) { - case 0: - _context.next = 2; - return cb.executionPromise; - case 2: - result = _context.sent; - _getState2 = getState(), watched = _getState2.callbacks.watched, appLifecycle = _getState2.appLifecycle, callback_resolved = _getState2.hooks.callback_resolved; - if (!(appLifecycle !== (0,_reducers_constants__WEBPACK_IMPORTED_MODULE_2__.getAppState)('HYDRATED'))) { - _context.next = 6; - break; - } - return _context.abrupt("return"); - case 6: - if (callback_resolved) { - callback_resolved(cb.callback, result); - } - // Check if it's been removed from the `watched` list since - on callback completion, another callback may be cancelled - // Find the callback instance or one that matches its promise (eg. could have been pruned) - currentCb = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.find)(function (_cb) { - return _cb === cb || _cb.executionPromise === cb.executionPromise; - }, watched); - if (currentCb) { - _context.next = 10; - break; - } - return _context.abrupt("return"); - case 10: - // Otherwise move to `executed` and remove from `watched` - dispatch((0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.aggregateCallbacks)([(0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.removeWatchedCallbacks)([currentCb]), (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.addExecutedCallbacks)([_objectSpread(_objectSpread({}, currentCb), {}, { - executionResult: result - })])])); - case 11: - case "end": - return _context.stop(); - } - }, _callee); - })); - return function (_x) { - return _ref2.apply(this, arguments); - }; - }()); +/* + * If this update is for multiple outputs, then it has + * starting & trailing `..` and each propId pair is separated + * by `...`, e.g. + * "..output-1.value...output-2.value...output-3.value...output-4.value.." + */ +var isMultiOutputProp = function isMultiOutputProp(idAndProp) { + return idAndProp.startsWith('..'); +}; +var ALL = { + wild: 'ALL', + multi: 1 +}; +var MATCH = { + wild: 'MATCH' +}; +var ALLSMALLER = { + wild: 'ALLSMALLER', + multi: 1, + expand: 1 +}; +var wildcards = { + ALL, + MATCH, + ALLSMALLER +}; +var allowedWildcards = { + Output: { + ALL, + MATCH }, - inputs: ['callbacks.executing'] + Input: wildcards, + State: wildcards }; -/* harmony default export */ __webpack_exports__["default"] = (observer); - -/***/ }), - -/***/ "./src/observers/isLoading.ts": -/*!************************************!*\ - !*** ./src/observers/isLoading.ts ***! - \************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _utils_callbacks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/callbacks */ "./src/utils/callbacks.ts"); -/* harmony import */ var _actions_isLoading__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../actions/isLoading */ "./src/actions/isLoading.ts"); - +var wildcardValTypes = ['string', 'number', 'boolean']; +var idInvalidChars = ['.', '{']; -var observer = { - observer: function observer(_ref) { - var dispatch = _ref.dispatch, - getState = _ref.getState; - var _getState = getState(), - callbacks = _getState.callbacks, - isLoading = _getState.isLoading; - var pendingCallbacks = (0,_utils_callbacks__WEBPACK_IMPORTED_MODULE_0__.getPendingCallbacks)(callbacks); - var next = Boolean(pendingCallbacks.length); - if (isLoading !== next) { - dispatch((0,_actions_isLoading__WEBPACK_IMPORTED_MODULE_1__.setIsLoading)(next)); - } - }, - inputs: ['callbacks'] +/* + * If this ID is a wildcard, it is a stringified JSON object + * the "{" character is disallowed from regular string IDs + */ +var isWildcardId = function isWildcardId(idStr) { + return idStr.startsWith('{'); }; -/* harmony default export */ __webpack_exports__["default"] = (observer); -/***/ }), +/* + * Turn stringified wildcard IDs into objects. + * Wildcards are encoded as single-item arrays containing the wildcard name + * as a string. + */ +function parseWildcardId(idStr) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(function (val) { + return Array.isArray(val) && wildcards[val[0]] || val; + }, JSON.parse(idStr)); +} -/***/ "./src/observers/loadingMap.ts": -/*!*************************************!*\ - !*** ./src/observers/loadingMap.ts ***! - \*************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/* + * If this update is for multiple outputs, then it has + * starting & trailing `..` and each propId pair is separated + * by `...`, e.g. + * "..output-1.value...output-2.value...output-3.value...output-4.value.." + */ +function parseMultipleOutputs(outputIdAndProp) { + return outputIdAndProp.substr(2, outputIdAndProp.length - 4).split('...'); +} +function splitIdAndProp(idAndProp) { + // since wildcard ids can have . in them but props can't, + // look for the last . in the string and split there + var dotPos = idAndProp.lastIndexOf('.'); + var idStr = idAndProp.substr(0, dotPos); + return { + id: parseIfWildcard(idStr), + property: idAndProp.substr(dotPos + 1) + }; +} -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var _actions_loadingMap__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../actions/loadingMap */ "./src/actions/loadingMap.ts"); -function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } -function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +/* + * Check if this ID is a stringified object, and if so parse it to that object + */ +function parseIfWildcard(idStr) { + return isWildcardId(idStr) ? parseWildcardId(idStr) : idStr; +} +/* + * JSON.stringify - for the object form - but ensuring keys are sorted + */ +function stringifyId(id) { + if (typeof id !== 'object') { + return id; + } + var stringifyVal = function stringifyVal(v) { + return v && v.wild || JSON.stringify(v); + }; + var parts = Object.keys(id).sort().map(function (k) { + return JSON.stringify(k) + ':' + stringifyVal(id[k]); + }); + return '{' + parts.join(',') + '}'; +} -var observer = { - observer: function observer(_ref) { - var dispatch = _ref.dispatch, - getState = _ref.getState; - var _getState = getState(), - _getState$callbacks = _getState.callbacks, - executing = _getState$callbacks.executing, - watched = _getState$callbacks.watched, - executed = _getState$callbacks.executed, - loadingMap = _getState.loadingMap, - paths = _getState.paths; - /* - Get the path of all components impacted by callbacks - with states: executing, watched, executed. - For each path, keep track of all (id,prop) tuples that - are impacted for this node and nested nodes. - */ - var loadingPaths = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (cb) { - return cb.getOutputs(paths); - }, [].concat(_toConsumableArray(executing), _toConsumableArray(watched), _toConsumableArray(executed)))); - var nextMap = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(loadingPaths) ? null : (0,ramda__WEBPACK_IMPORTED_MODULE_0__.reduce)(function (res, _ref2) { - var id = _ref2.id, - property = _ref2.property, - path = _ref2.path; - var target = res; - var idprop = { - id, - property - }; - // Assign all affected props for this path and nested paths - target.__dashprivate__idprops__ = target.__dashprivate__idprops__ || []; - target.__dashprivate__idprops__.push(idprop); - path.forEach(function (p, i) { - var _target$p; - target = target[p] = (_target$p = target[p]) !== null && _target$p !== void 0 ? _target$p : p === 'children' && typeof path[i + 1] === 'number' ? [] : {}; - target.__dashprivate__idprops__ = target.__dashprivate__idprops__ || []; - target.__dashprivate__idprops__.push(idprop); - }); - // Assign one affected prop for this path - target.__dashprivate__idprop__ = target.__dashprivate__idprop__ || idprop; - return res; - }, {}, loadingPaths); - if (!(0,ramda__WEBPACK_IMPORTED_MODULE_0__.equals)(nextMap, loadingMap)) { - dispatch((0,_actions_loadingMap__WEBPACK_IMPORTED_MODULE_1__.setLoadingMap)(nextMap)); +/* + * id dict values can be numbers, strings, and booleans. + * We need a definite ordering that will work across types, + * even if sane users would not mix types. + * - numeric strings are treated as numbers + * - booleans come after numbers, before strings. false, then true. + * - non-numeric strings come last + */ +function idValSort(a, b) { + var bIsNumeric = fast_isnumeric__WEBPACK_IMPORTED_MODULE_1___default()(b); + if (fast_isnumeric__WEBPACK_IMPORTED_MODULE_1___default()(a)) { + if (bIsNumeric) { + var aN = Number(a); + var bN = Number(b); + return aN > bN ? 1 : aN < bN ? -1 : 0; } - }, - inputs: ['callbacks.executing', 'callbacks.watched', 'callbacks.executed'] -}; -/* harmony default export */ __webpack_exports__["default"] = (observer); - -/***/ }), - -/***/ "./src/observers/prioritizedCallbacks.ts": -/*!***********************************************!*\ - !*** ./src/observers/prioritizedCallbacks.ts ***! - \***********************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + return -1; + } + if (bIsNumeric) { + return 1; + } + var aIsBool = typeof a === 'boolean'; + if (aIsBool !== (typeof b === 'boolean')) { + return aIsBool ? -1 : 1; + } + return a > b ? 1 : a < b ? -1 : 0; +} -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var _actions_callbacks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../actions/callbacks */ "./src/actions/callbacks.ts"); -/* harmony import */ var _actions_dependencies__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../actions/dependencies */ "./src/actions/dependencies.js"); -/* harmony import */ var _actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../actions/dependencies_ts */ "./src/actions/dependencies_ts.ts"); -/* harmony import */ var _actions_isAppReady__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../actions/isAppReady */ "./src/actions/isAppReady.js"); -/* harmony import */ var _reducers_constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../reducers/constants */ "./src/reducers/constants.js"); -function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(typeof e + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } -function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } -function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } -function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } -function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } -function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } -function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } -function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } -function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } - - - - - - -var sortPriority = function sortPriority(c1, c2) { - var _c1$priority, _c2$priority; - return ((_c1$priority = c1.priority) !== null && _c1$priority !== void 0 ? _c1$priority : '') > ((_c2$priority = c2.priority) !== null && _c2$priority !== void 0 ? _c2$priority : '') ? -1 : 1; -}; -var getStash = function getStash(cb, paths) { - var getOutputs = cb.getOutputs; - var allOutputs = getOutputs(paths); - var flatOutputs = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)(allOutputs); - var allPropIds = []; - var reqOut = {}; - flatOutputs.forEach(function (_ref) { - var id = _ref.id, - property = _ref.property; - var idStr = (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_2__.stringifyId)(id); - var idOut = reqOut[idStr] = reqOut[idStr] || []; - idOut.push(property); - allPropIds.push((0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.combineIdAndProp)({ - id: idStr, - property - })); - }); - return { - allOutputs, - allPropIds - }; +/* + * Provide a value known to be before or after v, according to idValSort + */ +var valBefore = function valBefore(v) { + return fast_isnumeric__WEBPACK_IMPORTED_MODULE_1___default()(v) ? v - 1 : 0; }; -var getIds = function getIds(cb, paths) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.uniq)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.pluck)('id', [].concat(_toConsumableArray((0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)(cb.getInputs(paths))), _toConsumableArray((0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)(cb.getState(paths)))))); +var valAfter = function valAfter(v) { + return typeof v === 'string' ? v + 'z' : 'z'; }; -var observer = { - observer: function () { - var _observer = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref2) { - var dispatch, getState, _getState, _getState$callbacks, executing, watched, config, hooks, layout, paths, appLifecycle, _getState2, prioritized, available, _partition, _partition2, syncCallbacks, asyncCallbacks, pickedSyncCallbacks, pickedAsyncCallbacks, deferred; - return _regeneratorRuntime().wrap(function _callee2$(_context2) { - while (1) switch (_context2.prev = _context2.next) { - case 0: - dispatch = _ref2.dispatch, getState = _ref2.getState; - _getState = getState(), _getState$callbacks = _getState.callbacks, executing = _getState$callbacks.executing, watched = _getState$callbacks.watched, config = _getState.config, hooks = _getState.hooks, layout = _getState.layout, paths = _getState.paths, appLifecycle = _getState.appLifecycle; - _getState2 = getState(), prioritized = _getState2.callbacks.prioritized; - if (!(appLifecycle !== (0,_reducers_constants__WEBPACK_IMPORTED_MODULE_5__.getAppState)('HYDRATED'))) { - _context2.next = 5; - break; - } - return _context2.abrupt("return"); - case 5: - available = Math.max(0, 12 - executing.length - watched.length); // Order prioritized callbacks based on depth and breadth of callback chain - prioritized = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.sort)(sortPriority, prioritized); - // Divide between sync and async - _partition = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.partition)(function (cb) { - return (0,_actions_isAppReady__WEBPACK_IMPORTED_MODULE_4__["default"])(layout, paths, getIds(cb, paths)) === true; - }, prioritized), _partition2 = _slicedToArray(_partition, 2), syncCallbacks = _partition2[0], asyncCallbacks = _partition2[1]; - pickedSyncCallbacks = syncCallbacks.slice(0, available); - pickedAsyncCallbacks = asyncCallbacks.slice(0, available - pickedSyncCallbacks.length); - if (pickedSyncCallbacks.length) { - dispatch((0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.aggregateCallbacks)([(0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.removePrioritizedCallbacks)(pickedSyncCallbacks), (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.addExecutingCallbacks)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (cb) { - return (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.executeCallback)(cb, config, hooks, paths, layout, getStash(cb, paths), dispatch, getState); - }, pickedSyncCallbacks))])); - } - if (pickedAsyncCallbacks.length) { - deferred = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (cb) { - return _objectSpread(_objectSpread(_objectSpread({}, cb), getStash(cb, paths)), {}, { - isReady: (0,_actions_isAppReady__WEBPACK_IMPORTED_MODULE_4__["default"])(layout, paths, getIds(cb, paths)) - }); - }, pickedAsyncCallbacks); - dispatch((0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.aggregateCallbacks)([(0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.removePrioritizedCallbacks)(pickedAsyncCallbacks), (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.addBlockedCallbacks)(deferred)])); - deferred.forEach( /*#__PURE__*/function () { - var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(cb) { - var _getState3, blocked, currentCb, executingCallback; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) switch (_context.prev = _context.next) { - case 0: - _context.next = 2; - return cb.isReady; - case 2: - _getState3 = getState(), blocked = _getState3.callbacks.blocked; // Check if it's been removed from the `blocked` list since - on - // callback completion, another callback may be cancelled - // Find the callback instance or one that matches its promise - // (eg. could have been pruned) - currentCb = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.find)(function (_cb) { - return _cb === cb || _cb.isReady === cb.isReady; - }, blocked); - if (currentCb) { - _context.next = 6; - break; - } - return _context.abrupt("return"); - case 6: - executingCallback = (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.executeCallback)(cb, config, hooks, paths, layout, cb, dispatch, getState); - dispatch((0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.aggregateCallbacks)([(0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.removeBlockedCallbacks)([cb]), (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.addExecutingCallbacks)([executingCallback])])); - case 8: - case "end": - return _context.stop(); - } - }, _callee); - })); - return function (_x2) { - return _ref3.apply(this, arguments); - }; - }()); - } - case 12: - case "end": - return _context2.stop(); +function addMap(depMap, id, prop, dependency) { + var idMap = depMap[id] = depMap[id] || {}; + var callbacks = idMap[prop] = idMap[prop] || []; + callbacks.push(dependency); +} +function addPattern(depMap, idSpec, prop, dependency) { + var keys = Object.keys(idSpec).sort(); + var keyStr = keys.join(','); + var values = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(keys, idSpec); + var keyCallbacks = depMap[keyStr] = depMap[keyStr] || {}; + var propCallbacks = keyCallbacks[prop] = keyCallbacks[prop] || []; + var valMatch = false; + for (var i = 0; i < propCallbacks.length; i++) { + if ((0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(values, propCallbacks[i].values)) { + valMatch = propCallbacks[i]; + break; + } + } + if (!valMatch) { + valMatch = { + keys, + values, + callbacks: [] + }; + propCallbacks.push(valMatch); + } + valMatch.callbacks.push(dependency); +} +function validateDependencies(parsedDependencies, dispatchError) { + var outStrs = {}; + var outObjs = []; + parsedDependencies.forEach(function (dep) { + var inputs = dep.inputs, + outputs = dep.outputs, + state = dep.state, + force_no_output = dep.force_no_output; + var hasOutputs = true; + if (outputs.length === 1 && !outputs[0].id && !outputs[0].property) { + hasOutputs = false; + if (!force_no_output) { + dispatchError('A callback is missing Outputs', ['Please provide an output for this callback:', JSON.stringify(dep, null, 2)]); + } + } + var head = 'In the callback for output(s):\n ' + outputs.map(_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.combineIdAndProp).join('\n '); + if (!inputs.length) { + dispatchError('A callback is missing Inputs', [head, 'there are no `Input` elements.', 'Without `Input` elements, it will never get called.', '', 'Subscribing to `Input` components will cause the', 'callback to be called whenever their values change.']); + } + var spec = [[outputs, 'Output'], [inputs, 'Input'], [state, 'State']]; + spec.forEach(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + args = _ref2[0], + cls = _ref2[1]; + if (cls === 'Output' && !hasOutputs) { + // just a quirk of how we pass & parse outputs - if you don't + // provide one, it looks like a single blank output. This is + // actually useful for graceful failure, so we work around it. + return; + } + if (!Array.isArray(args)) { + dispatchError("Callback ".concat(cls, "(s) must be an Array"), [head, "For ".concat(cls, "(s) we found:"), JSON.stringify(args), 'but we expected an Array.']); + } + args.forEach(function (idProp, i) { + validateArg(idProp, head, cls, i, dispatchError, force_no_output); + }); + }); + findDuplicateOutputs(outputs, head, dispatchError, outStrs, outObjs); + if (!force_no_output) { + findMismatchedWildcards(outputs, inputs, state, head, dispatchError); + } + }); +} +function validateArg(_ref3, head, cls, i, dispatchError, force_no_output) { + var id = _ref3.id, + property = _ref3.property; + if (typeof property !== 'string' || !property) { + dispatchError('Callback property error', [head, "".concat(cls, "[").concat(i, "].property = ").concat(JSON.stringify(property)), 'but we expected `property` to be a non-empty string.']); + } + if (typeof id === 'object') { + if ((0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(id) && !force_no_output) { + dispatchError('Callback item missing ID', [head, "".concat(cls, "[").concat(i, "].id = {}"), 'Every item linked to a callback needs an ID']); + } + (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function (v, k) { + if (!k) { + dispatchError('Callback wildcard ID error', [head, "".concat(cls, "[").concat(i, "].id has key \"").concat(k, "\""), 'Keys must be non-empty strings.']); + } + if (typeof v === 'object' && v.wild) { + if (allowedWildcards[cls][v.wild] !== v) { + dispatchError('Callback wildcard ID error', [head, "".concat(cls, "[").concat(i, "].id[\"").concat(k, "\"] = ").concat(v.wild), "Allowed wildcards for ".concat(cls, "s are:"), (0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(allowedWildcards[cls]).join(', ')]); } - }, _callee2); - })); - function observer(_x) { - return _observer.apply(this, arguments); + } else if (!(0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])(typeof v, wildcardValTypes)) { + dispatchError('Callback wildcard ID error', [head, "".concat(cls, "[").concat(i, "].id[\"").concat(k, "\"] = ").concat(JSON.stringify(v)), 'Wildcard callback ID values must be either wildcards', 'or constants of one of these types:', wildcardValTypes.join(', ')]); + } + }, id); + } else if (typeof id === 'string') { + if (!id && !force_no_output) { + dispatchError('Callback item missing ID', [head, "".concat(cls, "[").concat(i, "].id = \"").concat(id, "\""), 'Every item linked to a callback needs an ID']); } - return observer; - }(), - inputs: ['callbacks.prioritized', 'callbacks.completed'] + var invalidChars = idInvalidChars.filter(function (c) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])(c, id); + }); + if (invalidChars.length) { + dispatchError('Callback invalid ID string', [head, "".concat(cls, "[").concat(i, "].id = '").concat(id, "'"), "characters '".concat(invalidChars.join("', '"), "' are not allowed.")]); + } + } else { + dispatchError('Callback ID type error', [head, "".concat(cls, "[").concat(i, "].id = ").concat(JSON.stringify(id)), 'IDs must be strings or wildcard-compatible objects.']); + } +} +function findDuplicateOutputs(outputs, head, dispatchError, outStrs, outObjs) { + var newOutputStrs = {}; + var newOutputObjs = []; + outputs.forEach(function (_ref4, i) { + var id = _ref4.id, + property = _ref4.property; + if (typeof id === 'string') { + var idProp = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.combineIdAndProp)({ + id, + property + }); + if (newOutputStrs[idProp]) { + dispatchError('Duplicate callback Outputs', [head, "Output ".concat(i, " (").concat(idProp, ") is already used by this callback.")]); + } else if (outStrs[idProp]) { + dispatchError('Duplicate callback outputs', [head, "Output ".concat(i, " (").concat(idProp, ") is already in use."), 'To resolve this, set `allow_duplicate=True` on', 'duplicate outputs, or combine the outputs into', 'one callback function, distinguishing the trigger', 'by using `dash.callback_context` if necessary.']); + } else { + newOutputStrs[idProp] = 1; + } + } else { + var idObj = { + id, + property + }; + var selfOverlap = wildcardOverlap(idObj, newOutputObjs); + var otherOverlap = selfOverlap || wildcardOverlap(idObj, outObjs); + if (selfOverlap || otherOverlap) { + var _idProp = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.combineIdAndProp)(idObj); + var idProp2 = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.combineIdAndProp)(selfOverlap || otherOverlap); + dispatchError('Overlapping wildcard callback outputs', [head, "Output ".concat(i, " (").concat(_idProp, ")"), "overlaps another output (".concat(idProp2, ")"), "used in ".concat(selfOverlap ? 'this' : 'a different', " callback.")]); + } else { + newOutputObjs.push(idObj); + } + } + }); + (0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(newOutputStrs).forEach(function (k) { + outStrs[k] = 1; + }); + newOutputObjs.forEach(function (idObj) { + outObjs.push(idObj); + }); +} +function checkInOutOverlap(out, inputs) { + var outId = out.id, + outProp = out.property; + return inputs.some(function (in_) { + var inId = in_.id, + inProp = in_.property; + if (outProp !== inProp || typeof outId !== typeof inId) { + return false; + } + if (typeof outId === 'string') { + if (outId === inId) { + return true; + } + } else if (wildcardOverlap(in_, [out])) { + return true; + } + return false; + }); +} +function findMismatchedWildcards(outputs, inputs, state, head, dispatchError) { + var _findWildcardKeys = findWildcardKeys(outputs[0].id), + out0MatchKeys = _findWildcardKeys.matchKeys; + outputs.forEach(function (out, i) { + if (i && !(0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(findWildcardKeys(out.id).matchKeys, out0MatchKeys)) { + dispatchError('Mismatched `MATCH` wildcards across `Output`s', [head, "Output ".concat(i, " (").concat((0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.combineIdAndProp)(out), ")"), 'does not have MATCH wildcards on the same keys as', "Output 0 (".concat((0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.combineIdAndProp)(outputs[0]), ")."), 'MATCH wildcards must be on the same keys for all Outputs.', 'ALL wildcards need not match, only MATCH.']); + } + }); + [[inputs, 'Input'], [state, 'State']].forEach(function (_ref5) { + var _ref6 = _slicedToArray(_ref5, 2), + args = _ref6[0], + cls = _ref6[1]; + args.forEach(function (arg, i) { + var _findWildcardKeys2 = findWildcardKeys(arg.id), + matchKeys = _findWildcardKeys2.matchKeys, + allsmallerKeys = _findWildcardKeys2.allsmallerKeys; + var allWildcardKeys = matchKeys.concat(allsmallerKeys); + var diff = (0,ramda__WEBPACK_IMPORTED_MODULE_13__["default"])(allWildcardKeys, out0MatchKeys); + if (diff.length) { + diff.sort(); + dispatchError('`Input` / `State` wildcards not in `Output`s', [head, "".concat(cls, " ").concat(i, " (").concat((0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.combineIdAndProp)(arg), ")"), "has MATCH or ALLSMALLER on key(s) ".concat(diff.join(', ')), "where Output 0 (".concat((0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.combineIdAndProp)(outputs[0]), ")"), 'does not have a MATCH wildcard. Inputs and State do not', 'need every MATCH from the Output(s), but they cannot have', 'extras beyond the Output(s).']); + } + }); + }); +} +var matchWildKeys = function matchWildKeys(_ref7) { + var _ref8 = _slicedToArray(_ref7, 2), + a = _ref8[0], + b = _ref8[1]; + var aWild = a && a.wild; + var bWild = b && b.wild; + if (aWild && bWild) { + // Every wildcard combination overlaps except MATCH<->ALLSMALLER + return !(a === MATCH && b === ALLSMALLER || a === ALLSMALLER && b === MATCH); + } + return a === b || aWild || bWild; }; -/* harmony default export */ __webpack_exports__["default"] = (observer); - -/***/ }), - -/***/ "./src/observers/requestedCallbacks.ts": -/*!*********************************************!*\ - !*** ./src/observers/requestedCallbacks.ts ***! - \*********************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var _actions_callbacks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../actions/callbacks */ "./src/actions/callbacks.ts"); -/* harmony import */ var _actions_dependencies__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../actions/dependencies */ "./src/actions/dependencies.js"); -/* harmony import */ var _actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../actions/dependencies_ts */ "./src/actions/dependencies_ts.ts"); -/* harmony import */ var _utils_wait__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../utils/wait */ "./src/utils/wait.ts"); -/* harmony import */ var _utils_callbacks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/callbacks */ "./src/utils/callbacks.ts"); -function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(typeof e + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } -function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } -function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } -function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } -function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } -function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } -function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } - - - +function wildcardOverlap(_ref9, objs) { + var id = _ref9.id, + property = _ref9.property; + var idKeys = (0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(id).sort(); + var idVals = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(idKeys, id); + var _iterator = _createForOfIteratorHelper(objs), + _step; + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var obj = _step.value; + var id2 = obj.id, + property2 = obj.property; + if (property2 === property && typeof id2 !== 'string' && (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(id2).sort(), idKeys) && (0,ramda__WEBPACK_IMPORTED_MODULE_14__["default"])(matchWildKeys, (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])(idVals, (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(idKeys, id2)))) { + return obj; + } + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + return false; +} +function validateCallbacksToLayout(state_, dispatchError) { + var config = state_.config, + graphs = state_.graphs, + layout_ = state_.layout, + paths_ = state_.paths; + var validateIds = !config.suppress_callback_exceptions; + var layout, paths; + if (validateIds && config.validation_layout) { + layout = config.validation_layout; + paths = (0,_paths__WEBPACK_IMPORTED_MODULE_3__.computePaths)(layout, [], null, paths_.events); + } else { + layout = layout_; + paths = paths_; + } + var outputMap = graphs.outputMap, + inputMap = graphs.inputMap, + outputPatterns = graphs.outputPatterns, + inputPatterns = graphs.inputPatterns; + function tail(callbacks) { + return 'This ID was used in the callback(s) for Output(s):\n ' + callbacks.map(function (_ref10) { + var outputs = _ref10.outputs; + return outputs.map(_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.combineIdAndProp).join(', '); + }).join('\n '); + } + function missingId(id, cls, callbacks) { + dispatchError('ID not found in layout', ["Attempting to connect a callback ".concat(cls, " item to component:"), " \"".concat(stringifyId(id), "\""), 'but no components with that id exist in the layout.', '', 'If you are assigning callbacks to components that are', 'generated by other callbacks (and therefore not in the', 'initial layout), you can suppress this exception by setting', '`suppress_callback_exceptions=True`.', tail(callbacks)]); + } + function validateProp(id, idPath, rawProp, cls, callbacks) { + var prop = rawProp.split('@')[0]; + var component = (0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(idPath, layout); + var element = _registry__WEBPACK_IMPORTED_MODULE_5__["default"].resolve(component); + // note: Flow components do not have propTypes, so we can't validate. + if (element && element.propTypes && !element.propTypes[prop]) { + // look for wildcard props (ie data-* etc) + for (var propName in element.propTypes) { + var last = propName.length - 1; + if (propName.charAt(last) === '*' && prop.substr(0, last) === propName.substr(0, last)) { + return; + } + } + var type = component.type, + namespace = component.namespace; + dispatchError('Invalid prop for this component', ["Property \"".concat(prop, "\" was used with component ID:"), " ".concat(JSON.stringify(id)), "in one of the ".concat(cls, " items of a callback."), "This ID is assigned to a ".concat(namespace, ".").concat(type, " component"), 'in the layout, which does not support this property.', tail(callbacks)]); + } + } + function validateIdPatternProp(id, property, cls, callbacks) { + (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.resolveDeps)()(paths)({ + id, + property + }).forEach(function (dep) { + var idResolved = dep.id, + idPath = dep.path; + validateProp(idResolved, idPath, property, cls, callbacks); + }); + } + var callbackIdsCheckedForState = {}; + function validateState(callback) { + var state = callback.state, + output = callback.output; + // ensure we don't check the same callback for state multiple times + if (callbackIdsCheckedForState[output]) { + return; + } + callbackIdsCheckedForState[output] = 1; + var cls = 'State'; + state.forEach(function (_ref11) { + var id = _ref11.id, + property = _ref11.property; + if (typeof id === 'string') { + var idPath = (0,_paths__WEBPACK_IMPORTED_MODULE_3__.getPath)(paths, id); + if (!idPath) { + if (validateIds) { + missingId(id, cls, [callback]); + } + } else { + validateProp(id, idPath, property, cls, [callback]); + } + } + // Only validate props for State object ids that we don't need to + // resolve them to specific inputs or outputs + else if (!(0,ramda__WEBPACK_IMPORTED_MODULE_17__["default"])([MATCH, ALLSMALLER], (0,ramda__WEBPACK_IMPORTED_MODULE_18__["default"])(id)).length) { + validateIdPatternProp(id, property, cls, [callback]); + } + }); + } + function validateMap(map, cls, doState) { + for (var id in map) { + var idProps = map[id]; + var idPath = (0,_paths__WEBPACK_IMPORTED_MODULE_3__.getPath)(paths, id); + if (!idPath) { + if (validateIds) { + missingId(id, cls, (0,ramda__WEBPACK_IMPORTED_MODULE_19__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_18__["default"])(idProps))); + } + } else { + for (var property in idProps) { + var callbacks = idProps[property]; + validateProp(id, idPath, property, cls, callbacks); + if (doState) { + // It would be redundant to check state on both inputs + // and outputs - so only set doState for outputs. + callbacks.forEach(validateState); + } + } + } + } + } + validateMap(outputMap, 'Output', true); + validateMap(inputMap, 'Input'); + function validatePatterns(patterns, cls, doState) { + for (var keyStr in patterns) { + var keyPatterns = patterns[keyStr]; + var _loop = function _loop(property) { + keyPatterns[property].forEach(function (_ref12) { + var keys = _ref12.keys, + values = _ref12.values, + callbacks = _ref12.callbacks; + var id = (0,ramda__WEBPACK_IMPORTED_MODULE_20__["default"])(keys, values); + validateIdPatternProp(id, property, cls, callbacks); + if (doState) { + callbacks.forEach(validateState); + } + }); + }; + for (var property in keyPatterns) { + _loop(property); + } + } + } + validatePatterns(outputPatterns, 'Output', true); + validatePatterns(inputPatterns, 'Input'); +} +function computeGraphs(dependencies, dispatchError) { + // multiGraph is just for finding circular deps + var multiGraph = new dependency_graph__WEBPACK_IMPORTED_MODULE_0__.DepGraph(); + var wildcardPlaceholders = {}; + var fixIds = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_21__["default"])({ + id: parseIfWildcard + })); + var parsedDependencies = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(function (dep) { + var output = dep.output, + force_no_output = dep.force_no_output; + var out = (0,ramda__WEBPACK_IMPORTED_MODULE_21__["default"])({ + inputs: fixIds, + state: fixIds + }, dep); + if (!force_no_output) { + out.outputs = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(function (outi) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_22__["default"])('out', true, splitIdAndProp(outi)); + }, isMultiOutputProp(output) ? parseMultipleOutputs(output) : [output]); + } else { + out.outputs = []; + } + return out; + }, dependencies); + var hasError = false; + var wrappedDE = function wrappedDE(message, lines) { + hasError = true; + dispatchError(message, lines); + }; + validateDependencies(parsedDependencies, wrappedDE); -var observer = { - observer: function () { - var _observer = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) { - var dispatch, getState, _getState, callbacks, _getState$callbacks, prioritized, blocked, executing, watched, stored, paths, graphs, _getState2, requested, initialRequested, pendingCallbacks, rCirculars, rDuplicates, rMergedDuplicates, pDuplicates, bDuplicates, eDuplicates, wDuplicates, _pruneCallbacks, rAdded, rRemoved, _pruneCallbacks2, pAdded, pRemoved, _pruneCallbacks3, bAdded, bRemoved, _pruneCallbacks4, eAdded, eRemoved, _pruneCallbacks5, wAdded, wRemoved, readyCallbacks, oldBlocked, newBlocked, candidates, _loop, pendingGroups, dropped, added, removed; - return _regeneratorRuntime().wrap(function _callee$(_context2) { - while (1) switch (_context2.prev = _context2.next) { - case 0: - dispatch = _ref.dispatch, getState = _ref.getState; - _context2.next = 3; - return (0,_utils_wait__WEBPACK_IMPORTED_MODULE_4__["default"])(0); - case 3: - _getState = getState(), callbacks = _getState.callbacks, _getState$callbacks = _getState.callbacks, prioritized = _getState$callbacks.prioritized, blocked = _getState$callbacks.blocked, executing = _getState$callbacks.executing, watched = _getState$callbacks.watched, stored = _getState$callbacks.stored, paths = _getState.paths, graphs = _getState.graphs; - _getState2 = getState(), requested = _getState2.callbacks.requested; - initialRequested = requested.slice(0); - pendingCallbacks = (0,_utils_callbacks__WEBPACK_IMPORTED_MODULE_5__.getPendingCallbacks)(callbacks); - /* - 0. Prune circular callbacks that have completed the loop - - cb.callback included in cb.predecessors - */ - rCirculars = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.filter)(function (cb) { - var _cb$predecessors; - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.includes)(cb.callback, (_cb$predecessors = cb.predecessors) !== null && _cb$predecessors !== void 0 ? _cb$predecessors : []); - }, requested); - /* - TODO? - Clean up the `requested` list - during the dispatch phase, - circulars will be removed for real - */ - requested = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.difference)(requested, rCirculars); - /* - 1. Remove duplicated `requested` callbacks - give precedence to newer callbacks over older ones - */ - rDuplicates = []; - rMergedDuplicates = []; - (0,ramda__WEBPACK_IMPORTED_MODULE_0__.values)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.groupBy)(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.getUniqueIdentifier, requested)).forEach(function (group) { - if (group.length === 1) { - // keep callback if its the only one of its kind - rMergedDuplicates.push(group[0]); - } else { - var initial = group.find(function (cb) { - return cb.initialCall; - }); - if (initial) { - // drop the initial callback if it's not alone - rDuplicates.push(initial); - } - var groupWithoutInitial = group.filter(function (cb) { - return cb !== initial; - }); - if (groupWithoutInitial.length === 1) { - // if there's only one callback beside the initial one, keep that callback - rMergedDuplicates.push(groupWithoutInitial[0]); - } else { - // otherwise merge all remaining callbacks together - rDuplicates = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(rDuplicates, groupWithoutInitial); - rMergedDuplicates.push((0,ramda__WEBPACK_IMPORTED_MODULE_0__.mergeLeft)({ - changedPropIds: (0,ramda__WEBPACK_IMPORTED_MODULE_0__.reduce)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.mergeWith)(Math.max), {}, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.pluck)('changedPropIds', groupWithoutInitial)), - executionGroup: (0,ramda__WEBPACK_IMPORTED_MODULE_0__.filter)(function (exg) { - return Boolean(exg); - }, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.pluck)('executionGroup', groupWithoutInitial)).slice(-1)[0] - }, groupWithoutInitial.slice(-1)[0])); - } - } - }); - /* - TODO? - Clean up the `requested` list - during the dispatch phase, - duplicates will be removed for real - */ - requested = rMergedDuplicates; - /* - 2. Remove duplicated `prioritized`, `executing` and `watching` callbacks - */ - /* - Extract all but the first callback from each IOS-key group - these callbacks are `prioritized` and duplicates. - */ - pDuplicates = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (group) { - return group.slice(0, -1); - }, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.values)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.groupBy)(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.getUniqueIdentifier, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(prioritized, requested))))); - bDuplicates = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (group) { - return group.slice(0, -1); - }, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.values)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.groupBy)(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.getUniqueIdentifier, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(blocked, requested))))); - eDuplicates = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (group) { - return group.slice(0, -1); - }, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.values)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.groupBy)(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.getUniqueIdentifier, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(executing, requested))))); - wDuplicates = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (group) { - return group.slice(0, -1); - }, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.values)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.groupBy)(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.getUniqueIdentifier, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(watched, requested))))); - /* - 3. Modify or remove callbacks that are outputting to non-existing layout `id`. - */ - _pruneCallbacks = (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.pruneCallbacks)(requested, paths), rAdded = _pruneCallbacks.added, rRemoved = _pruneCallbacks.removed; - _pruneCallbacks2 = (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.pruneCallbacks)(prioritized, paths), pAdded = _pruneCallbacks2.added, pRemoved = _pruneCallbacks2.removed; - _pruneCallbacks3 = (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.pruneCallbacks)(blocked, paths), bAdded = _pruneCallbacks3.added, bRemoved = _pruneCallbacks3.removed; - _pruneCallbacks4 = (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.pruneCallbacks)(executing, paths), eAdded = _pruneCallbacks4.added, eRemoved = _pruneCallbacks4.removed; - _pruneCallbacks5 = (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.pruneCallbacks)(watched, paths), wAdded = _pruneCallbacks5.added, wRemoved = _pruneCallbacks5.removed; - /* - TODO? - Clean up the `requested` list - during the dispatch phase, - it will be updated for real - */ - requested = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.difference)(requested, rRemoved), rAdded); - /* - 4. Find `requested` callbacks that do not depend on a outstanding output (as either input or state) - */ - readyCallbacks = (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.getReadyCallbacks)(paths, requested, pendingCallbacks, graphs); - oldBlocked = []; - newBlocked = []; - /** - * If there is : - * - no ready callbacks - * - at least one requested callback - * - no additional pending callbacks - * - * can assume: - * - the requested callbacks are part of a circular dependency loop - * - * then recursively: - * - assume the first callback in the list is ready (the entry point for the loop) - * - check what callbacks are blocked / ready with the assumption - * - update the missing predecessors based on assumptions - * - continue until there are no remaining candidates - * - */ - if (!(!readyCallbacks.length && requested.length && requested.length === pendingCallbacks.length)) { - _context2.next = 33; - break; - } - candidates = requested.slice(0); - _loop = /*#__PURE__*/_regeneratorRuntime().mark(function _loop() { - var readyCallback, blockedByAssumptions, modified; - return _regeneratorRuntime().wrap(function _loop$(_context) { - while (1) switch (_context.prev = _context.next) { - case 0: - // Assume 1st callback is ready and - // update candidates / readyCallbacks accordingly - readyCallback = candidates[0]; - readyCallbacks.push(readyCallback); - candidates = candidates.slice(1); - // Remaining candidates are not blocked by current assumptions - candidates = (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.getReadyCallbacks)(paths, candidates, readyCallbacks); - // Blocked requests need to make sure they have the callback as a predecessor - blockedByAssumptions = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.difference)(candidates, candidates); - modified = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.filter)(function (cb) { - return !cb.predecessors || !(0,ramda__WEBPACK_IMPORTED_MODULE_0__.includes)(readyCallback.callback, cb.predecessors); - }, blockedByAssumptions); - oldBlocked = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(oldBlocked, modified); - newBlocked = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(newBlocked, modified.map(function (cb) { - var _cb$predecessors2; - return _objectSpread(_objectSpread({}, cb), {}, { - predecessors: (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)((_cb$predecessors2 = cb.predecessors) !== null && _cb$predecessors2 !== void 0 ? _cb$predecessors2 : [], [readyCallback.callback]) - }); - })); - case 8: - case "end": - return _context.stop(); - } - }, _loop); - }); - case 29: - if (!candidates.length) { - _context2.next = 33; - break; + /* + * For regular ids, outputMap and inputMap are: + * {[id]: {[prop]: [callback, ...]}} + * where callbacks are the matching specs from the original + * dependenciesRequest, but with outputs parsed to look like inputs, + * and a list matchKeys added if the outputs have MATCH wildcards. + * For outputMap there should only ever be one callback per id/prop + * but for inputMap there may be many. + * + * For wildcard ids, outputPatterns and inputPatterns are: + * { + * [keystr]: { + * [prop]: [ + * {keys: [...], values: [...], callbacks: [callback, ...]}, + * {...} + * ] + * } + * } + * keystr is a stringified ordered list of keys in the id + * keys is the same ordered list (just copied for convenience) + * values is an array of explicit or wildcard values for each key in keys + */ + var outputMap = {}; + var inputMap = {}; + var outputPatterns = {}; + var inputPatterns = {}; + var finalGraphs = { + MultiGraph: multiGraph, + outputMap, + inputMap, + outputPatterns, + inputPatterns, + callbacks: parsedDependencies + }; + if (hasError) { + // leave the graphs empty if we found an error, so we don't try to + // execute the broken callbacks. + return finalGraphs; + } + parsedDependencies.forEach(function (dependency) { + var outputs = dependency.outputs, + inputs = dependency.inputs; + outputs.concat(inputs).forEach(function (item) { + var id = item.id; + if (typeof id === 'object') { + (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function (val, key) { + if (!wildcardPlaceholders[key]) { + wildcardPlaceholders[key] = { + exact: [], + expand: 0 + }; + } + var keyPlaceholders = wildcardPlaceholders[key]; + if (val && val.wild) { + if (val.expand) { + keyPlaceholders.expand += 1; } - return _context2.delegateYield(_loop(), "t0", 31); - case 31: - _context2.next = 29; - break; - case 33: - /* - TODO? - Clean up the `requested` list - during the dispatch phase, - it will be updated for real - */ - requested = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.difference)(requested, oldBlocked), newBlocked); - /* - 5. Prune callbacks that became irrelevant in their `executionGroup` - */ - // Group by executionGroup, drop non-executionGroup callbacks - // those were not triggered by layout changes and don't have "strong" interdependency for - // callback chain completion - pendingGroups = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.groupBy)(function (cb) { - return cb.executionGroup; - }, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.filter)(function (cb) { - return !(0,ramda__WEBPACK_IMPORTED_MODULE_0__.isNil)(cb.executionGroup); - }, stored)); - dropped = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.filter)(function (cb) { - // If there is no `stored` callback for the group, no outputs were dropped -> `cb` is kept - if (!cb.executionGroup || !pendingGroups[cb.executionGroup] || !pendingGroups[cb.executionGroup].length) { - return false; - } - // Get all inputs for `cb` - var inputs = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.combineIdAndProp, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)(cb.getInputs(paths))); - // Get all the potentially updated props for the group so far - var allProps = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (gcb) { - return gcb.executionMeta.allProps; - }, pendingGroups[cb.executionGroup])); - // Get all the updated props for the group so far - var updated = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.flatten)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.map)(function (gcb) { - return gcb.executionMeta.updatedProps; - }, pendingGroups[cb.executionGroup])); - // If there's no overlap between the updated props and the inputs, - // + there's no props that aren't covered by the potentially updated props, - // and not all inputs are multi valued - // -> drop `cb` - var res = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.isEmpty)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.intersection)(inputs, updated)) && (0,ramda__WEBPACK_IMPORTED_MODULE_0__.isEmpty)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.difference)(inputs, allProps)) && !(0,ramda__WEBPACK_IMPORTED_MODULE_0__.all)(_actions_dependencies__WEBPACK_IMPORTED_MODULE_2__.isMultiValued, cb.callback.inputs); - return res; - }, readyCallbacks); - /* - TODO? - Clean up the `requested` list - during the dispatch phase, - it will be updated for real - */ - requested = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.difference)(requested, dropped); - readyCallbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.difference)(readyCallbacks, dropped); - requested = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.difference)(requested, readyCallbacks); - added = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.difference)(requested, initialRequested); - removed = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.difference)(initialRequested, requested); - dispatch((0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.aggregateCallbacks)([ - // Clean up requested callbacks - added.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.addRequestedCallbacks)(added) : null, removed.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.removeRequestedCallbacks)(removed) : null, - // Clean up duplicated callbacks - pDuplicates.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.removePrioritizedCallbacks)(pDuplicates) : null, bDuplicates.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.removeBlockedCallbacks)(bDuplicates) : null, eDuplicates.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.removeExecutingCallbacks)(eDuplicates) : null, wDuplicates.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.removeWatchedCallbacks)(wDuplicates) : null, - // Prune callbacks - pRemoved.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.removePrioritizedCallbacks)(pRemoved) : null, pAdded.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.addPrioritizedCallbacks)(pAdded) : null, bRemoved.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.removeBlockedCallbacks)(bRemoved) : null, bAdded.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.addBlockedCallbacks)(bAdded) : null, eRemoved.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.removeExecutingCallbacks)(eRemoved) : null, eAdded.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.addExecutingCallbacks)(eAdded) : null, wRemoved.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.removeWatchedCallbacks)(wRemoved) : null, wAdded.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.addWatchedCallbacks)(wAdded) : null, - // Promote callbacks - readyCallbacks.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.addPrioritizedCallbacks)(readyCallbacks) : null])); - case 42: - case "end": - return _context2.stop(); + } else if (keyPlaceholders.exact.indexOf(val) === -1) { + keyPlaceholders.exact.push(val); + } + }, id); + } + }); + }); + (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function (keyPlaceholders) { + var exact = keyPlaceholders.exact, + expand = keyPlaceholders.expand; + var vals = exact.slice().sort(idValSort); + if (expand) { + for (var i = 0; i < expand; i++) { + if (exact.length) { + vals.splice(0, 0, [valBefore(vals[0])]); + vals.push(valAfter(vals[vals.length - 1])); + } else { + vals.push(i); } - }, _callee); - })); - function observer(_x) { - return _observer.apply(this, arguments); + } + } else if (!exact.length) { + // only MATCH/ALL - still need a value + vals.push(0); } - return observer; - }(), - inputs: ['callbacks.requested', 'callbacks.completed'] -}; -/* harmony default export */ __webpack_exports__["default"] = (observer); - -/***/ }), - -/***/ "./src/observers/storedCallbacks.ts": -/*!******************************************!*\ - !*** ./src/observers/storedCallbacks.ts ***! - \******************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var _actions_callbacks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../actions/callbacks */ "./src/actions/callbacks.ts"); -/* harmony import */ var _utils_callbacks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/callbacks */ "./src/utils/callbacks.ts"); -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } -function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - + keyPlaceholders.vals = vals; + }, wildcardPlaceholders); + function makeAllIds(idSpec, outIdFinal) { + var idList = [{}]; + (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function (val, key) { + var testVals = wildcardPlaceholders[key].vals; + var outValIndex = testVals.indexOf(outIdFinal[key]); + var newVals = [val]; + if (val && val.wild) { + if (val === ALLSMALLER) { + if (outValIndex > 0) { + newVals = testVals.slice(0, outValIndex); + } else { + // no smaller items - delete all outputs. + newVals = []; + } + } else { + // MATCH or ALL + // MATCH *is* ALL for outputs, ie we don't already have a + // value specified in `outIdFinal` + newVals = outValIndex === -1 || val === ALL ? testVals : [outIdFinal[key]]; + } + } + // replicates everything in idList once for each item in + // newVals, attaching each value at key. + idList = (0,ramda__WEBPACK_IMPORTED_MODULE_23__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_23__["default"])([(0,ramda__WEBPACK_IMPORTED_MODULE_22__["default"])(key)], newVals), idList); + }, idSpec); + return idList; + } -var observer = { - observer: function observer(_ref) { - var dispatch = _ref.dispatch, - getState = _ref.getState; - var _getState = getState(), - callbacks = _getState.callbacks; - var pendingCallbacks = (0,_utils_callbacks__WEBPACK_IMPORTED_MODULE_2__.getPendingCallbacks)(callbacks); - var _getState2 = getState(), - stored = _getState2.callbacks.stored; - var _partition = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.partition)(function (cb) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.isNil)(cb.executionGroup); - }, stored), - _partition2 = _slicedToArray(_partition, 2), - nullGroupCallbacks = _partition2[0], - groupCallbacks = _partition2[1]; - var executionGroups = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.groupBy)(function (cb) { - return cb.executionGroup; - }, groupCallbacks); - var pendingGroups = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.groupBy)(function (cb) { - return cb.executionGroup; - }, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.filter)(function (cb) { - return !(0,ramda__WEBPACK_IMPORTED_MODULE_0__.isNil)(cb.executionGroup); - }, pendingCallbacks)); - var dropped = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.reduce)(function (res, _ref2) { - var _ref3 = _slicedToArray(_ref2, 2), - executionGroup = _ref3[0], - executionGroupCallbacks = _ref3[1]; - return !pendingGroups[executionGroup] ? (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(res, executionGroupCallbacks) : res; - }, [], (0,ramda__WEBPACK_IMPORTED_MODULE_0__.toPairs)(executionGroups)); - dispatch((0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.aggregateCallbacks)([nullGroupCallbacks.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.removeStoredCallbacks)(nullGroupCallbacks) : null, dropped.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_1__.removeStoredCallbacks)(dropped) : null])); - }, - inputs: ['callbacks.stored', 'callbacks.completed'] -}; -/* harmony default export */ __webpack_exports__["default"] = (observer); + /* multiGraph is used only for testing circularity + * + * Each component+property that is used as an input or output is added as a node + * to a directed graph with a dependency from each input to each output. The + * function triggerDefaultState in index.js then checks this graph for circularity. + * + * In order to allow the same component+property to be both an input and output + * of the same callback, a two pass approach is used. + * + * In the first pass, the graph is built up normally with the exception that + * in cases where an output is also an input to the same callback a special + * "output" node is added and the dependencies target this output node instead. + * For example, if `slider.value` is both an input and an output, then the a new + * node `slider.value__output` will be added with a dependency from `slider.value` + * to `slider.value__output`. Splitting the input and output into separate nodes + * removes the circularity. + * + * In order to still detect other forms of circularity, it is necessary to do a + * second pass and add the new output nodes as a dependency in any *other* callbacks + * where the original node was an input. Continuing the example, any other callback + * that had `slider.value` as an input dependency also needs to have + * `slider.value__output` as a dependency. To make this efficient, all the inputs + * and outputs for each callback are stored during the first pass. + */ -/***/ }), + var outputTag = '__output'; + var duplicateOutputs = []; + var cbIn = []; + var cbOut = []; + function addInputToMulti(inIdProp, outIdProp) { + var firstPass = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + multiGraph.addNode(inIdProp); + multiGraph.addDependency(inIdProp, outIdProp); + // only store callback inputs and outputs during the first pass + if (firstPass) { + cbIn[cbIn.length - 1].push(inIdProp); + cbOut[cbOut.length - 1].push(outIdProp); + } + } + parsedDependencies.forEach(function (dependency) { + var outputs = dependency.outputs, + inputs = dependency.inputs; -/***/ "./src/reducers/callbackJobs.ts": -/*!**************************************!*\ - !*** ./src/reducers/callbackJobs.ts ***! - \**************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + // new callback, add an empty array for its inputs and outputs + cbIn.push([]); + cbOut.push([]); + function addOutputToMulti(outIdFinal, outIdProp) { + multiGraph.addNode(outIdProp); + inputs.forEach(function (inObj) { + var inId = inObj.id, + property = inObj.property; + if (typeof inId === 'object') { + var inIdList = makeAllIds(inId, outIdFinal); + inIdList.forEach(function (id) { + addInputToMulti((0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.combineIdAndProp)({ + id, + property + }), outIdProp); + }); + } else { + addInputToMulti((0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.combineIdAndProp)(inObj), outIdProp); + } + }); + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } -/* harmony export */ }); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); + // We'll continue to use dep.output as its id, but add outputs as well + // for convenience and symmetry with the structure of inputs and state. + // Also collect MATCH keys in the output (all outputs must share these) + // and ALL keys in the first output (need not be shared but we'll use + // the first output for calculations) for later convenience. + var _findWildcardKeys3 = findWildcardKeys(outputs.length ? outputs[0].id : undefined), + matchKeys = _findWildcardKeys3.matchKeys; + var firstSingleOutput = (0,ramda__WEBPACK_IMPORTED_MODULE_24__["default"])(function (o) { + return !isMultiValued(o.id); + }, outputs); + var finalDependency = (0,ramda__WEBPACK_IMPORTED_MODULE_25__["default"])({ + matchKeys, + firstSingleOutput, + outputs + }, dependency); + outputs.forEach(function (outIdProp) { + var outId = outIdProp.id, + property = outIdProp.property; + // check if this output is also an input to the same callback + var alsoInput = checkInOutOverlap(outIdProp, inputs); + if (typeof outId === 'object') { + var outIdList = makeAllIds(outId, {}); + outIdList.forEach(function (id) { + var tempOutIdProp = { + id, + property + }; + var outIdName = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.combineIdAndProp)(tempOutIdProp); + // if this output is also an input, add `outputTag` to the name + if (alsoInput) { + duplicateOutputs.push(tempOutIdProp); + outIdName += outputTag; + } + addOutputToMulti(id, outIdName); + }); + addPattern(outputPatterns, outId, property, finalDependency); + } else { + var outIdName = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.combineIdAndProp)(outIdProp); + // if this output is also an input, add `outputTag` to the name + if (alsoInput) { + duplicateOutputs.push(outIdProp); + outIdName += outputTag; + } + addOutputToMulti({}, outIdName); + addMap(outputMap, outId, property, finalDependency); + } + }); + inputs.forEach(function (inputObject) { + var inId = inputObject.id, + inProp = inputObject.property; + if (typeof inId === 'object') { + addPattern(inputPatterns, inId, inProp, finalDependency); + } else { + addMap(inputMap, inId, inProp, finalDependency); + } + }); + }); -var setJob = function setJob(job, state) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assoc)(job.jobId, job, state); -}; -var removeJob = function removeJob(jobId, state) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.dissoc)(jobId, state); -}; -var setOutdated = function setOutdated(jobId, state) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assocPath)([jobId, 'outdated'], true, state); -}; -/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { - var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var action = arguments.length > 1 ? arguments[1] : undefined; - switch (action.type) { - case 'ADD_CALLBACK_JOB': - return setJob(action.payload, state); - case 'REMOVE_CALLBACK_JOB': - return removeJob(action.payload.jobId, state); - case 'CALLBACK_JOB_OUTDATED': - return setOutdated(action.payload.jobId, state); - default: - return state; + // second pass for adding new output nodes as dependencies where needed + duplicateOutputs.forEach(function (dupeOutIdProp) { + var originalName = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.combineIdAndProp)(dupeOutIdProp); + var newName = originalName.concat(outputTag); + for (var cnt = 0; cnt < cbIn.length; cnt++) { + // check if input to the callback + if (cbIn[cnt].some(function (inName) { + return inName === originalName; + })) { + /* make sure it's not also an output of the callback + * (this will be the original callback) + */ + if (!cbOut[cnt].some(function (outName) { + return outName === newName; + })) { + cbOut[cnt].forEach(function (outName) { + addInputToMulti(newName, outName, false); + }); + } + } + } + }); + return finalGraphs; +} +function findWildcardKeys(id) { + var matchKeys = []; + var allsmallerKeys = []; + if (typeof id === 'object') { + (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function (val, key) { + if (val === MATCH) { + matchKeys.push(key); + } else if (val === ALLSMALLER) { + allsmallerKeys.push(key); + } + }, id); + matchKeys.sort(); + allsmallerKeys.sort(); } + return { + matchKeys, + allsmallerKeys + }; } -/***/ }), - -/***/ "./src/reducers/callbacks.ts": -/*!***********************************!*\ - !*** ./src/reducers/callbacks.ts ***! - \***********************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ CallbackActionType: function() { return /* binding */ CallbackActionType; }, -/* harmony export */ CallbackAggregateActionType: function() { return /* binding */ CallbackAggregateActionType; } -/* harmony export */ }); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } -function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } -function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } -function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } - -var CallbackActionType; -(function (CallbackActionType) { - CallbackActionType["AddBlocked"] = "Callbacks.AddBlocked"; - CallbackActionType["AddExecuted"] = "Callbacks.AddExecuted"; - CallbackActionType["AddExecuting"] = "Callbacks.AddExecuting"; - CallbackActionType["AddPrioritized"] = "Callbacks.AddPrioritized"; - CallbackActionType["AddRequested"] = "Callbacks.AddRequested"; - CallbackActionType["AddStored"] = "Callbacks.AddStored"; - CallbackActionType["AddWatched"] = "Callbacks.AddWatched"; - CallbackActionType["RemoveBlocked"] = "Callbacks.RemoveBlocked"; - CallbackActionType["RemoveExecuted"] = "Callbacks.RemoveExecuted"; - CallbackActionType["RemoveExecuting"] = "Callbacks.RemoveExecuting"; - CallbackActionType["RemovePrioritized"] = "Callbacks.RemovePrioritized"; - CallbackActionType["RemoveRequested"] = "Callbacks.RemoveRequested"; - CallbackActionType["RemoveStored"] = "Callbacks.RemoveStored"; - CallbackActionType["RemoveWatched"] = "Callbacks.RemoveWatched"; -})(CallbackActionType || (CallbackActionType = {})); -var CallbackAggregateActionType; -(function (CallbackAggregateActionType) { - CallbackAggregateActionType["AddCompleted"] = "Callbacks.Completed"; - CallbackAggregateActionType["Aggregate"] = "Callbacks.Aggregate"; -})(CallbackAggregateActionType || (CallbackAggregateActionType = {})); -var DEFAULT_STATE = { - blocked: [], - executed: [], - executing: [], - prioritized: [], - requested: [], - stored: [], - watched: [], - completed: 0 -}; -var transforms = { - [CallbackActionType.AddBlocked]: ramda__WEBPACK_IMPORTED_MODULE_0__.concat, - [CallbackActionType.AddExecuted]: ramda__WEBPACK_IMPORTED_MODULE_0__.concat, - [CallbackActionType.AddExecuting]: ramda__WEBPACK_IMPORTED_MODULE_0__.concat, - [CallbackActionType.AddPrioritized]: ramda__WEBPACK_IMPORTED_MODULE_0__.concat, - [CallbackActionType.AddRequested]: ramda__WEBPACK_IMPORTED_MODULE_0__.concat, - [CallbackActionType.AddStored]: ramda__WEBPACK_IMPORTED_MODULE_0__.concat, - [CallbackActionType.AddWatched]: ramda__WEBPACK_IMPORTED_MODULE_0__.concat, - [CallbackActionType.RemoveBlocked]: ramda__WEBPACK_IMPORTED_MODULE_0__.difference, - [CallbackActionType.RemoveExecuted]: ramda__WEBPACK_IMPORTED_MODULE_0__.difference, - [CallbackActionType.RemoveExecuting]: ramda__WEBPACK_IMPORTED_MODULE_0__.difference, - [CallbackActionType.RemovePrioritized]: ramda__WEBPACK_IMPORTED_MODULE_0__.difference, - [CallbackActionType.RemoveRequested]: ramda__WEBPACK_IMPORTED_MODULE_0__.difference, - [CallbackActionType.RemoveStored]: ramda__WEBPACK_IMPORTED_MODULE_0__.difference, - [CallbackActionType.RemoveWatched]: ramda__WEBPACK_IMPORTED_MODULE_0__.difference -}; -var fields = { - [CallbackActionType.AddBlocked]: 'blocked', - [CallbackActionType.AddExecuted]: 'executed', - [CallbackActionType.AddExecuting]: 'executing', - [CallbackActionType.AddPrioritized]: 'prioritized', - [CallbackActionType.AddRequested]: 'requested', - [CallbackActionType.AddStored]: 'stored', - [CallbackActionType.AddWatched]: 'watched', - [CallbackActionType.RemoveBlocked]: 'blocked', - [CallbackActionType.RemoveExecuted]: 'executed', - [CallbackActionType.RemoveExecuting]: 'executing', - [CallbackActionType.RemovePrioritized]: 'prioritized', - [CallbackActionType.RemoveRequested]: 'requested', - [CallbackActionType.RemoveStored]: 'stored', - [CallbackActionType.RemoveWatched]: 'watched' -}; -var mutateCompleted = function mutateCompleted(state, action) { - return _objectSpread(_objectSpread({}, state), {}, { - completed: state.completed + action.payload - }); -}; -var mutateCallbacks = function mutateCallbacks(state, action) { - var transform = transforms[action.type]; - var field = fields[action.type]; - return !transform || !field || action.payload.length === 0 ? state : _objectSpread(_objectSpread({}, state), {}, { - [field]: transform(state[field], action.payload) - }); -}; -/* harmony default export */ __webpack_exports__["default"] = (function () { - var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_STATE; - var action = arguments.length > 1 ? arguments[1] : undefined; - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.reduce)(function (s, a) { - if (a === null) { - return s; - } else if (a.type === CallbackAggregateActionType.AddCompleted) { - return mutateCompleted(s, a); +/* + * Do the given id values `vals` match the pattern `patternVals`? + * `keys`, `patternVals`, and `vals` are all arrays, and we already know that + * we're only looking at ids with the same keys as the pattern. + * + * Optionally, include another reference set of the same - to ensure the + * correct matching of MATCH or ALLSMALLER between input and output items. + */ +function idMatch(keys, vals, patternVals, refKeys, refVals, refPatternVals) { + for (var i = 0; i < keys.length; i++) { + var val = vals[i]; + var patternVal = patternVals[i]; + if (patternVal.wild) { + // If we have a second id, compare the wildcard values. + // Without a second id, all wildcards pass at this stage. + if (refKeys && patternVal !== ALL) { + var refIndex = refKeys.indexOf(keys[i]); + var refPatternVal = refPatternVals[refIndex]; + // Sanity check. Shouldn't ever fail this, if the back end + // did its job validating callbacks. + // You can't resolve an input against an input, because + // two ALLSMALLER's wouldn't make sense! + if (patternVal === ALLSMALLER && refPatternVal === ALLSMALLER) { + throw new Error('invalid wildcard id pair: ' + JSON.stringify({ + keys, + patternVals, + vals, + refKeys, + refPatternVals, + refVals + })); + } + if (idValSort(val, refVals[refIndex]) !== (patternVal === ALLSMALLER ? -1 : refPatternVal === ALLSMALLER ? 1 : 0)) { + return false; + } + } + } else if (val !== patternVal) { + return false; } - return mutateCallbacks(s, a); - }, state, action.type === CallbackAggregateActionType.Aggregate ? action.payload : [action]); -}); - -/***/ }), - -/***/ "./src/reducers/isLoading.ts": -/*!***********************************!*\ - !*** ./src/reducers/isLoading.ts ***! - \***********************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + } + return true; +} +function getAnyVals(patternVals, vals) { + var matches = []; + for (var i = 0; i < patternVals.length; i++) { + if (patternVals[i] === MATCH) { + matches.push(vals[i]); + } + } + return matches.length ? JSON.stringify(matches) : ''; +} -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ IsLoadingActionType: function() { return /* binding */ IsLoadingActionType; } -/* harmony export */ }); -var IsLoadingActionType; -(function (IsLoadingActionType) { - IsLoadingActionType["Set"] = "IsLoading.Set"; -})(IsLoadingActionType || (IsLoadingActionType = {})); -var DEFAULT_STATE = true; -/* harmony default export */ __webpack_exports__["default"] = (function () { - var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_STATE; - var action = arguments.length > 1 ? arguments[1] : undefined; - return action.type === IsLoadingActionType.Set ? action.payload : state; -}); +/* + * Does this item (input / output / state) support multiple values? + * string IDs do not; wildcard IDs only do if they contain ALL or ALLSMALLER + */ +function isMultiValued(_ref13) { + var id = _ref13.id; + return typeof id === 'object' && (0,ramda__WEBPACK_IMPORTED_MODULE_26__["default"])(function (v) { + return v.multi; + }, (0,ramda__WEBPACK_IMPORTED_MODULE_18__["default"])(id)); +} -/***/ }), +/* + * For a given output id and prop, find the callback generating it. + * If no callback is found, returns false. + * If one is found, returns: + * { + * callback: the callback spec {outputs, inputs, state etc} + * anyVals: stringified list of resolved MATCH keys we matched + * resolvedId: the "outputs" id string plus MATCH values we matched + * getOutputs: accessor function to give all resolved outputs of this + * callback. Takes `paths` as argument to apply when the callback is + * dispatched, in case a previous callback has altered the layout. + * The result is a list of {id (string or object), property (string)} + * getInputs: same for inputs + * getState: same for state + * changedPropIds: an object of {[idAndProp]: v} triggering this callback + * v = DIRECT (2): the prop was changed in the front end, so dependent + * callbacks *MUST* be executed. + * v = INDIRECT (1): the prop is expected to be changed by a callback, + * but if this is prevented, dependent callbacks may be pruned. + * initialCall: boolean, if true we don't require any changedPropIds + * to keep this callback around, as it's the initial call to populate + * this value on page load or changing part of the layout. + * By default this is true for callbacks generated by + * getCallbackByOutput, false from getCallbacksByInput. + * } + */ +function getCallbackByOutput(graphs, paths, id, prop) { + var resolve; + var callback; + var anyVals = ''; + if (typeof id === 'string') { + // standard id version + var callbacks = (graphs.outputMap[id] || {})[prop]; + if (callbacks) { + callback = callbacks[0]; + resolve = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.resolveDeps)(); + } + } else { + // wildcard version + var _keys = Object.keys(id).sort(); + var vals = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(_keys, id); + var keyStr = _keys.join(','); + var patterns = (graphs.outputPatterns[keyStr] || {})[prop]; + if (patterns) { + for (var i = 0; i < patterns.length; i++) { + var patternVals = patterns[i].values; + if (idMatch(_keys, vals, patternVals)) { + callback = patterns[i].callbacks[0]; + resolve = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.resolveDeps)(_keys, vals, patternVals); + anyVals = getAnyVals(patternVals, vals); + break; + } + } + } + } + if (!resolve) { + return false; + } + return (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.makeResolvedCallback)(callback, resolve, anyVals); +} +function addResolvedFromOutputs(callback, outPattern, outs, matches) { + var out0Keys = Object.keys(outPattern.id).sort(); + var out0PatternVals = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(out0Keys, outPattern.id); + var foundCbIds = {}; + outs.forEach(function (_ref14) { + var outId = _ref14.id; + var outVals = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(out0Keys, outId); + var resolved = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.makeResolvedCallback)(callback, (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.resolveDeps)(out0Keys, outVals, out0PatternVals), getAnyVals(out0PatternVals, outVals)); + var resolvedId = resolved.resolvedId; + if (!foundCbIds[resolvedId]) { + matches.push(resolved); + foundCbIds[resolvedId] = true; + } + }); +} +function addAllResolvedFromOutputs(resolve, paths, matches) { + return function (callback) { + var matchKeys = callback.matchKeys, + firstSingleOutput = callback.firstSingleOutput, + outputs = callback.outputs; + if (matchKeys.length) { + var singleOutPattern = outputs[firstSingleOutput]; + if (singleOutPattern) { + addResolvedFromOutputs(callback, singleOutPattern, resolve(paths)(singleOutPattern), matches); + } else { + /* + * If every output has ALL we need to reduce resolved set + * to one item per combination of MATCH values. + * That will give one result per callback invocation. + */ + var anySeen = {}; + outputs.forEach(function (outPattern) { + var outSet = resolve(paths)(outPattern).filter(function (i) { + var matchStr = JSON.stringify((0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(matchKeys, i.id)); + if (!anySeen[matchStr]) { + anySeen[matchStr] = 1; + return true; + } + return false; + }); + addResolvedFromOutputs(callback, outPattern, outSet, matches); + }); + } + } else { + var cb = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.makeResolvedCallback)(callback, resolve, ''); + if ((0,ramda__WEBPACK_IMPORTED_MODULE_19__["default"])(cb.getOutputs(paths)).length || callback.force_no_output) { + matches.push(cb); + } + } + }; +} -/***/ "./src/reducers/loadingMap.ts": -/*!************************************!*\ - !*** ./src/reducers/loadingMap.ts ***! - \************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/* + * For a given id and prop find all callbacks it's an input of. + * + * Returns an array of objects: + * {callback, resolvedId, getOutputs, getInputs, getState} + * See getCallbackByOutput for details. + * + * Note that if the original input contains an ALLSMALLER wildcard, + * there may be many entries for the same callback, but any given output + * (with an MATCH corresponding to the input's ALLSMALLER) will only appear + * in one entry. + */ +function getWatchedKeys(id, newProps, graphs) { + if (!(id && graphs && newProps.length)) { + return []; + } + if (typeof id === 'string') { + var inputs = graphs.inputMap[id]; + return inputs ? newProps.filter(function (newProp) { + return inputs[newProp]; + }) : []; + } + var keys = Object.keys(id).sort(); + var vals = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(keys, id); + var keyStr = keys.join(','); + var keyPatterns = graphs.inputPatterns[keyStr]; + if (!keyPatterns) { + return []; + } + return newProps.filter(function (prop) { + var patterns = keyPatterns[prop]; + return patterns && patterns.some(function (pattern) { + return idMatch(keys, vals, pattern.values); + }); + }); +} -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ LoadingMapActionType: function() { return /* binding */ LoadingMapActionType; } -/* harmony export */ }); -var LoadingMapActionType; -(function (LoadingMapActionType) { - LoadingMapActionType["Set"] = "LoadingMap.Set"; -})(LoadingMapActionType || (LoadingMapActionType = {})); -var DEFAULT_STATE = {}; -/* harmony default export */ __webpack_exports__["default"] = (function () { - var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_STATE; - var action = arguments.length > 1 ? arguments[1] : undefined; - return action.type === LoadingMapActionType.Set ? action.payload : state; -}); +/* + * Return a list of all callbacks referencing a chunk of the layout, + * either as inputs or outputs. + * + * opts.outputsOnly: boolean, set true when crawling the *whole* layout, + * because outputs are enough to get everything. + * opts.removedArrayInputsOnly: boolean, set true to only look for inputs in + * wildcard arrays (ALL or ALLSMALLER), no outputs. This gets used to tell + * when the new *absence* of a given component should trigger a callback. + * opts.newPaths: paths object after the edit - to be used with + * removedArrayInputsOnly to determine if the callback still has its outputs + * opts.chunkPath: path to the new chunk - used to determine if any outputs are + * outside of this chunk, because this determines whether inputs inside the + * chunk count as having changed + * + * Returns an array of objects: + * {callback, resolvedId, getOutputs, getInputs, getState, ...etc} + * See getCallbackByOutput for details. + */ +function getUnfilteredLayoutCallbacks(graphs, paths, layoutChunk, opts) { + var outputsOnly = opts.outputsOnly, + removedArrayInputsOnly = opts.removedArrayInputsOnly, + newPaths = opts.newPaths, + chunkPath = opts.chunkPath; + var foundCbIds = {}; + var callbacks = []; + function addCallback(callback) { + if (callback) { + var foundIndex = foundCbIds[callback.resolvedId]; + if (foundIndex !== undefined) { + var foundCb = callbacks[foundIndex]; + foundCb.changedPropIds = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.mergeMax)(foundCb.changedPropIds, callback.changedPropIds); + if (callback.initialCall) { + foundCb.initialCall = true; + } + } else { + foundCbIds[callback.resolvedId] = callbacks.length; + callbacks.push(callback); + } + } + } + function addCallbackIfArray(idStr) { + return function (cb) { + return cb.getInputs(paths).some(function (ini) { + if (Array.isArray(ini) && ini.some(function (inij) { + return stringifyId(inij.id) === idStr; + })) { + // This callback should trigger even with no changedProps, + // since the props that changed no longer exist. + // We're kind of abusing the `initialCall` flag here, it's + // more like a "final call" for the removed inputs, but + // this case is not subject to `prevent_initial_call`. + if ((0,ramda__WEBPACK_IMPORTED_MODULE_19__["default"])(cb.getOutputs(newPaths)).length) { + cb.initialCall = true; + cb.changedPropIds = {}; + addCallback(cb); + } + return true; + } + return false; + }); + }; + } + function handleOneId(id, outIdCallbacks, inIdCallbacks) { + if (outIdCallbacks) { + for (var property in outIdCallbacks) { + var cb = getCallbackByOutput(graphs, paths, id, property); + if (cb) { + // callbacks found in the layout by output should always run + // unless specifically requested not to. + // ie this is the initial call of this callback even if it's + // not the page initialization but just a new layout chunk + if (!cb.callback.prevent_initial_call) { + cb.initialCall = true; + addCallback(cb); + } + } + } + } + if (!outputsOnly && inIdCallbacks) { + var maybeAddCallback = removedArrayInputsOnly ? addCallbackIfArray(stringifyId(id)) : addCallback; + var handleThisCallback = maybeAddCallback; + if (chunkPath) { + handleThisCallback = function handleThisCallback(cb) { + if (!(0,ramda__WEBPACK_IMPORTED_MODULE_14__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_27__["default"])(chunkPath), (0,ramda__WEBPACK_IMPORTED_MODULE_28__["default"])('path', (0,ramda__WEBPACK_IMPORTED_MODULE_19__["default"])(cb.getOutputs(paths))))) { + maybeAddCallback(cb); + } + }; + } + for (var _property in inIdCallbacks) { + (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.getCallbacksByInput)(graphs, paths, id, _property, _dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.INDIRECT).forEach(handleThisCallback); + } + } + } + (0,_utils__WEBPACK_IMPORTED_MODULE_4__.crawlLayout)(layoutChunk, function (child) { + var id = (0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(['props', 'id'], child); + if (id) { + if (typeof id === 'string' && !removedArrayInputsOnly) { + handleOneId(id, graphs.outputMap[id], graphs.inputMap[id]); + } else { + var keyStr = Object.keys(id).sort().join(','); + handleOneId(id, !removedArrayInputsOnly && graphs.outputPatterns[keyStr], graphs.inputPatterns[keyStr]); + } + } + }); + return (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(function (cb) { + return _objectSpread(_objectSpread({}, cb), {}, { + priority: (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.getPriority)(graphs, paths, cb) + }); + }, callbacks); +} /***/ }), -/***/ "./src/store.ts": -/*!**********************!*\ - !*** ./src/store.ts ***! - \**********************/ +/***/ "./src/actions/dependencies_ts.ts": +/*!****************************************!*\ + !*** ./src/actions/dependencies_ts.ts ***! + \****************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ RendererStore; } +/* harmony export */ DIRECT: function() { return /* binding */ DIRECT; }, +/* harmony export */ INDIRECT: function() { return /* binding */ INDIRECT; }, +/* harmony export */ combineIdAndProp: function() { return /* binding */ combineIdAndProp; }, +/* harmony export */ getAllSubsequentOutputsForCallback: function() { return /* binding */ getAllSubsequentOutputsForCallback; }, +/* harmony export */ getCallbacksByInput: function() { return /* binding */ getCallbacksByInput; }, +/* harmony export */ getLayoutCallbacks: function() { return /* binding */ getLayoutCallbacks; }, +/* harmony export */ getPriority: function() { return /* binding */ getPriority; }, +/* harmony export */ getReadyCallbacks: function() { return /* binding */ getReadyCallbacks; }, +/* harmony export */ getUniqueIdentifier: function() { return /* binding */ getUniqueIdentifier; }, +/* harmony export */ includeObservers: function() { return /* binding */ includeObservers; }, +/* harmony export */ makeResolvedCallback: function() { return /* binding */ makeResolvedCallback; }, +/* harmony export */ mergeMax: function() { return /* binding */ mergeMax; }, +/* harmony export */ pruneCallbacks: function() { return /* binding */ pruneCallbacks; }, +/* harmony export */ resolveDeps: function() { return /* binding */ resolveDeps; } /* harmony export */ }); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! redux */ "./node_modules/redux/es/redux.js"); -/* harmony import */ var redux_thunk__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! redux-thunk */ "./node_modules/redux-thunk/es/index.js"); -/* harmony import */ var _reducers_reducer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./reducers/reducer */ "./src/reducers/reducer.js"); -/* harmony import */ var _StoreObserver__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./StoreObserver */ "./src/StoreObserver.ts"); -/* harmony import */ var _observers_documentTitle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./observers/documentTitle */ "./src/observers/documentTitle.ts"); -/* harmony import */ var _observers_executedCallbacks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./observers/executedCallbacks */ "./src/observers/executedCallbacks.ts"); -/* harmony import */ var _observers_executingCallbacks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./observers/executingCallbacks */ "./src/observers/executingCallbacks.ts"); -/* harmony import */ var _observers_isLoading__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./observers/isLoading */ "./src/observers/isLoading.ts"); -/* harmony import */ var _observers_loadingMap__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./observers/loadingMap */ "./src/observers/loadingMap.ts"); -/* harmony import */ var _observers_prioritizedCallbacks__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./observers/prioritizedCallbacks */ "./src/observers/prioritizedCallbacks.ts"); -/* harmony import */ var _observers_requestedCallbacks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./observers/requestedCallbacks */ "./src/observers/requestedCallbacks.ts"); -/* harmony import */ var _observers_storedCallbacks__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./observers/storedCallbacks */ "./src/observers/storedCallbacks.ts"); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mergeWith.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/props.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/filter.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/flatten.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/map.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/reduce.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assoc.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/concat.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/all.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/difference.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/partition.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/isEmpty.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/keys.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pickBy.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/zipObj.js"); +/* harmony import */ var _dependencies__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dependencies */ "./src/actions/dependencies.js"); +/* harmony import */ var _paths__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./paths */ "./src/actions/paths.js"); +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } +function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } +function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } - - - - - - - - - - -var RendererStore = /*#__PURE__*/function () { - function RendererStore() { - var _this = this; - _classCallCheck(this, RendererStore); - _defineProperty(this, "__store", void 0); - _defineProperty(this, "storeObserver", new _StoreObserver__WEBPACK_IMPORTED_MODULE_2__["default"]()); - _defineProperty(this, "setObservers", (0,ramda__WEBPACK_IMPORTED_MODULE_0__.once)(function () { - var observe = _this.storeObserver.observe; - observe(_observers_documentTitle__WEBPACK_IMPORTED_MODULE_3__["default"]); - observe(_observers_isLoading__WEBPACK_IMPORTED_MODULE_6__["default"]); - observe(_observers_loadingMap__WEBPACK_IMPORTED_MODULE_7__["default"]); - observe(_observers_requestedCallbacks__WEBPACK_IMPORTED_MODULE_9__["default"]); - observe(_observers_prioritizedCallbacks__WEBPACK_IMPORTED_MODULE_8__["default"]); - observe(_observers_executingCallbacks__WEBPACK_IMPORTED_MODULE_5__["default"]); - observe(_observers_executedCallbacks__WEBPACK_IMPORTED_MODULE_4__["default"]); - observe(_observers_storedCallbacks__WEBPACK_IMPORTED_MODULE_10__["default"]); - })); - _defineProperty(this, "createAppStore", function (reducer, middleware) { - _this.__store = (0,redux__WEBPACK_IMPORTED_MODULE_11__.createStore)(reducer, middleware); - _this.storeObserver.setStore(_this.__store); - _this.setObservers(); - }); - /** - * Initialize a Redux store with thunk, plus logging (only in development mode) middleware - * - * @param {bool} reset: discard any previous store - * - * @returns {Store} - * An initialized redux store with middleware and possible hot reloading of reducers - */ - _defineProperty(this, "initializeStore", function (reset) { - if (_this.__store && !reset) { - return _this.__store; - } - var reducer = (0,_reducers_reducer__WEBPACK_IMPORTED_MODULE_1__.createReducer)(); - // eslint-disable-next-line no-process-env - if (false) {} else { - // only attach logger to middleware in non-production mode - var reduxDTEC = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__; - if (reduxDTEC) { - _this.createAppStore(reducer, reduxDTEC({ - actionsDenylist: ['reloadRequest'] - })((0,redux__WEBPACK_IMPORTED_MODULE_11__.applyMiddleware)(redux_thunk__WEBPACK_IMPORTED_MODULE_12__["default"]))); - } else { - _this.createAppStore(reducer, (0,redux__WEBPACK_IMPORTED_MODULE_11__.applyMiddleware)(redux_thunk__WEBPACK_IMPORTED_MODULE_12__["default"])); - } - } - if (!reset) { - // TODO - Protect this under a debug mode? - window.store = _this.__store; +var DIRECT = 2; +var INDIRECT = 1; +var mergeMax = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(Math.max); +var combineIdAndProp = function combineIdAndProp(_ref) { + var id = _ref.id, + property = _ref.property; + return "".concat((0,_dependencies__WEBPACK_IMPORTED_MODULE_0__.stringifyId)(id), ".").concat(property); +}; +function getCallbacksByInput(graphs, paths, id, prop, changeType) { + var withPriority = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; + var matches = []; + var idAndProp = combineIdAndProp({ + id, + property: prop + }); + if (typeof id === 'string') { + // standard id version + var callbacks = (graphs.inputMap[id] || {})[prop]; + if (!callbacks) { + return []; + } + callbacks.forEach((0,_dependencies__WEBPACK_IMPORTED_MODULE_0__.addAllResolvedFromOutputs)(resolveDeps(), paths, matches)); + } else { + // wildcard version + var _keys = Object.keys(id).sort(); + var vals = (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(_keys, id); + var keyStr = _keys.join(','); + var patterns = (graphs.inputPatterns[keyStr] || {})[prop]; + if (!patterns) { + return []; + } + patterns.forEach(function (pattern) { + if ((0,_dependencies__WEBPACK_IMPORTED_MODULE_0__.idMatch)(_keys, vals, pattern.values)) { + pattern.callbacks.forEach((0,_dependencies__WEBPACK_IMPORTED_MODULE_0__.addAllResolvedFromOutputs)(resolveDeps(_keys, vals, pattern.values), paths, matches)); } - if (false) {} - return _this.__store; }); - this.__store = this.initializeStore(); } - _createClass(RendererStore, [{ - key: "store", - get: function get() { - return this.__store; + matches.forEach(function (match) { + match.changedPropIds[idAndProp] = changeType || DIRECT; + if (withPriority) { + match.priority = getPriority(graphs, paths, match); } - }]); - return RendererStore; -}(); + }); + return matches; +} +/* + * Builds a tree of all callbacks that can be triggered by the provided callback. + * Uses the number of callbacks at each tree depth and the total depth of the tree + * to create a sortable priority hash. + */ +function getPriority(graphs, paths, callback) { + var callbacks = [callback]; + var touchedOutputs = {}; + var touchedCbIds = {}; + var priority = []; + while (callbacks.length) { + callbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(function (c) { + var touched = touchedCbIds[c.resolvedId]; + touchedCbIds[c.resolvedId] = true; + return touched; + }, callbacks); + var outputs = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(function (o) { + return !touchedOutputs[combineIdAndProp(o)]; + }, (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(function (cb) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb.getOutputs(paths)); + }, callbacks))); + outputs.forEach(function (o) { + return touchedOutputs[combineIdAndProp(o)] = true; + }); + callbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(function (_ref2) { + var id = _ref2.id, + property = _ref2.property; + return getCallbacksByInput(graphs, paths, id, property, INDIRECT, false); + }, outputs)); + if (callbacks.length) { + priority.push(callbacks.length); + } + } + priority.unshift(priority.length); + return (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(function (i) { + return Math.min(i, 35).toString(36); + }, priority).join(''); +} +function getAllSubsequentOutputsForCallback(graphs, paths, callback) { + var callbacks = [callback]; + var touchedOutputs = {}; -/***/ }), + // this traverses the graph all the way to the end + while (callbacks.length) { + // don't add it if it already exists based on id and props + var outputs = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(function (o) { + return !touchedOutputs[combineIdAndProp(o)]; + }, (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(function (cb) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb.getOutputs(paths)); + }, callbacks))); + touchedOutputs = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(function (touched, o) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(combineIdAndProp(o), true, touched); + }, touchedOutputs, outputs); + callbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(function (_ref3) { + var id = _ref3.id, + property = _ref3.property; + return getCallbacksByInput(graphs, paths, id, property, INDIRECT, false); + }, outputs)); + } + return touchedOutputs; +} +var getReadyCallbacks = function getReadyCallbacks(paths, candidates) { + var callbacks = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : candidates; + var graphs = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + // Skip if there's no candidates + if (!candidates.length) { + return []; + } -/***/ "./src/utils/TreeContainer.ts": -/*!************************************!*\ - !*** ./src/utils/TreeContainer.ts ***! - \************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + // Find all outputs of all active callbacks + var outputs = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(combineIdAndProp, (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(function (o, cb) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(o, (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb.getOutputs(paths))); + }, [], callbacks)); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ getLoadingHash: function() { return /* binding */ getLoadingHash; }, -/* harmony export */ getLoadingState: function() { return /* binding */ getLoadingState; }, -/* harmony export */ validateComponent: function() { return /* binding */ validateComponent; } -/* harmony export */ }); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var _registry__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../registry */ "./src/registry.js"); -/* harmony import */ var _actions_dependencies__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../actions/dependencies */ "./src/actions/dependencies.js"); + // Make `outputs` hash table for faster access + var outputsMap = {}; + outputs.forEach(function (output) { + return outputsMap[output] = true; + }); + // find all the outputs touched by activeCallbacks + // remove this check if graph is accessible all the time + if (Object.keys(graphs).length) { + //not sure if graph will be accessible all the time + var allTouchedOutputs = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(function (cb) { + return getAllSubsequentOutputsForCallback(graphs, paths, cb); + }, callbacks)); -function isLoadingComponent(layout) { - validateComponent(layout); - return _registry__WEBPACK_IMPORTED_MODULE_1__["default"].resolve(layout)._dashprivate_isLoadingComponent; -} -var NULL_LOADING_STATE = false; -function getLoadingState(componentLayout, componentPath, loadingMap) { - var _loadingFragment$__da; - if (!loadingMap) { - return NULL_LOADING_STATE; - } - var loadingFragment = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(componentPath, loadingMap); - // Component and children are not loading if there's no loading fragment - // for the component's path in the layout. - if (!loadingFragment) { - return NULL_LOADING_STATE; - } - var idprop = loadingFragment.__dashprivate__idprop__; - if (idprop) { - return { - is_loading: true, - prop_name: idprop.property, - component_name: (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_2__.stringifyId)(idprop.id) - }; - } - var idprops = (_loadingFragment$__da = loadingFragment.__dashprivate__idprops__) === null || _loadingFragment$__da === void 0 ? void 0 : _loadingFragment$__da[0]; - if (idprops && isLoadingComponent(componentLayout)) { - return { - is_loading: true, - prop_name: idprops.property, - component_name: (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_2__.stringifyId)(idprops.id) - }; + // overrrides the outputsMap, will duplicate callbacks filtered + // this is only done to silence typescript errors + if (allTouchedOutputs.length > 0) { + outputsMap = Object.assign.apply(Object, [allTouchedOutputs[0]].concat(_toConsumableArray(allTouchedOutputs))); + } } - return NULL_LOADING_STATE; -} -var getLoadingHash = function getLoadingHash(componentPath, loadingMap) { - var _ref, _path; - return ((_ref = loadingMap && ((_path = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(componentPath, loadingMap)) === null || _path === void 0 ? void 0 : _path.__dashprivate__idprops__)) !== null && _ref !== void 0 ? _ref : []).map(function (_ref2) { - var id = _ref2.id, - property = _ref2.property; - return "".concat(id, ".").concat(property); - }).join(','); + + // Find `requested` callbacks that do not depend on a outstanding output (as either input or state) + // Outputs which overlap an input do not count as an outstanding output + return (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(function (cb) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function (cbp) { + return !outputsMap[combineIdAndProp(cbp)]; + }, (0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb.getInputs(paths)), (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb.getOutputs(paths)))); + }, candidates); }; -function validateComponent(componentDefinition) { - if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__.type)(componentDefinition) === 'Array') { - throw new Error('The children property of a component is a list of lists, instead ' + 'of just a list. ' + 'Check the component that has the following contents, ' + 'and remove one of the levels of nesting: \n' + JSON.stringify(componentDefinition, null, 2)); - } - if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__.type)(componentDefinition) === 'Object' && !((0,ramda__WEBPACK_IMPORTED_MODULE_0__.has)('namespace', componentDefinition) && (0,ramda__WEBPACK_IMPORTED_MODULE_0__.has)('type', componentDefinition) && (0,ramda__WEBPACK_IMPORTED_MODULE_0__.has)('props', componentDefinition))) { - throw new Error('An object was provided as `children` instead of a component, ' + 'string, or number (or list of those). ' + 'Check the children property that looks something like:\n' + JSON.stringify(componentDefinition, null, 2)); - } -} +var getLayoutCallbacks = function getLayoutCallbacks(graphs, paths, layout, options) { + var exclusions = []; + var callbacks = (0,_dependencies__WEBPACK_IMPORTED_MODULE_0__.getUnfilteredLayoutCallbacks)(graphs, paths, layout, options); -/***/ }), + /* + Remove from the initial callbacks those that are left with only excluded inputs. + Exclusion of inputs happens when: + - an input is missing + - an input in the initial callback chain depends only on excluded inputs + Further exclusion might happen after callbacks return with: + - PreventUpdate + - no_update + */ + while (true) { + // Find callbacks for which all inputs are missing or in the exclusions + var _partition = (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])(function (_ref4) { + var inputs = _ref4.callback.inputs, + getInputs = _ref4.getInputs; + return (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(_dependencies__WEBPACK_IMPORTED_MODULE_0__.isMultiValued, inputs) || !(0,ramda__WEBPACK_IMPORTED_MODULE_13__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(combineIdAndProp, (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(getInputs(paths))), exclusions)); + }, callbacks), + _partition2 = _slicedToArray(_partition, 2), + included = _partition2[0], + excluded = _partition2[1]; -/***/ "./src/utils/callbacks.ts": -/*!********************************!*\ - !*** ./src/utils/callbacks.ts ***! - \********************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + // If there's no additional exclusions, break loop - callbacks have been cleaned + if (!excluded.length) { + break; + } + callbacks = included; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ getPendingCallbacks: function() { return /* binding */ getPendingCallbacks; } -/* harmony export */ }); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } -function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } + // update exclusions with all additional excluded outputs + exclusions = (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(exclusions, (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(combineIdAndProp, (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(function (_ref5) { + var getOutputs = _ref5.getOutputs; + return getOutputs(paths); + }, excluded)))); + } + if (options.filterRoot) { + var rootId = (0,ramda__WEBPACK_IMPORTED_MODULE_14__["default"])(['props', 'id'], layout); + if (rootId) { + rootId = (0,_dependencies__WEBPACK_IMPORTED_MODULE_0__.stringifyId)(rootId); + // Filter inputs that are not present in the response + callbacks = callbacks.filter(function (cb) { + return cb.callback.inputs.reduce(function (previous, input) { + return previous || (0,_dependencies__WEBPACK_IMPORTED_MODULE_0__.stringifyId)(input.id) == rootId && options.filterRoot.includes(input.property); + }, false); + }); + } + } -var getPendingCallbacks = function getPendingCallbacks(state) { - var _Array; - return (_Array = Array()).concat.apply(_Array, _toConsumableArray((0,ramda__WEBPACK_IMPORTED_MODULE_0__.values)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.omit)(['stored', 'completed'], state)))); + /* + Return all callbacks with an `executionGroup` to allow group-processing + */ + var executionGroup = Math.random().toString(16); + return (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(function (cb) { + return _objectSpread(_objectSpread({}, cb), {}, { + executionGroup + }); + }, callbacks); }; +var getUniqueIdentifier = function getUniqueIdentifier(_ref6) { + var anyVals = _ref6.anyVals, + _ref6$callback = _ref6.callback, + inputs = _ref6$callback.inputs, + outputs = _ref6$callback.outputs, + state = _ref6$callback.state; + return (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(combineIdAndProp, [].concat(_toConsumableArray(inputs), _toConsumableArray(outputs), _toConsumableArray(state))), Array.isArray(anyVals) ? anyVals : anyVals === '' ? [] : [anyVals]).join(','); +}; +function includeObservers(id, properties, graphs, paths) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(function (propName) { + return getCallbacksByInput(graphs, paths, id, propName); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])(properties))); +} -/***/ }), - -/***/ "./src/utils/wait.ts": -/*!***************************!*\ - !*** ./src/utils/wait.ts ***! - \***************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(typeof e + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } -function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } -function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } -/* harmony default export */ __webpack_exports__["default"] = (/*#__PURE__*/(function () { - var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(duration) { - var _resolve, p; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) switch (_context.prev = _context.next) { - case 0: - p = new Promise(function (resolve) { - return _resolve = resolve; - }); - setTimeout(_resolve, duration); - return _context.abrupt("return", p); - case 3: - case "end": - return _context.stop(); +/* + * Create a pending callback object. Includes the original callback definition, + * its resolved ID (including the value of all MATCH wildcards), + * accessors to find all inputs, outputs, and state involved in this + * callback (lazy as not all users will want all of these). + */ +var makeResolvedCallback = function makeResolvedCallback(callback, resolve, anyVals) { + return { + callback, + anyVals, + resolvedId: callback.output + anyVals, + getOutputs: function getOutputs(paths) { + return callback.outputs.map(resolve(paths)); + }, + getInputs: function getInputs(paths) { + return callback.inputs.map(resolve(paths)); + }, + getState: function getState(paths) { + return callback.state.map(resolve(paths)); + }, + changedPropIds: {}, + initialCall: false + }; +}; +function pruneCallbacks(callbacks, paths) { + var _partition3 = (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])(function (_ref7) { + var getOutputs = _ref7.getOutputs, + outputs = _ref7.callback.outputs; + return (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(getOutputs(paths)).length === outputs.length; + }, callbacks), + _partition4 = _slicedToArray(_partition3, 2), + removed = _partition4[1]; + var _partition5 = (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])(function (_ref8) { + var getOutputs = _ref8.getOutputs; + return !(0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(getOutputs(paths)).length; + }, removed), + _partition6 = _slicedToArray(_partition5, 2), + modified = _partition6[1]; + var added = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(function (cb) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])('changedPropIds', (0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(function (_, propId) { + return (0,_paths__WEBPACK_IMPORTED_MODULE_1__.getPath)(paths, (0,_dependencies__WEBPACK_IMPORTED_MODULE_0__.splitIdAndProp)(propId).id); + }, cb.changedPropIds), cb); + }, modified); + return { + added, + removed + }; +} +function resolveDeps(refKeys, refVals, refPatternVals) { + return function (paths) { + return function (_ref9) { + var idPattern = _ref9.id, + property = _ref9.property; + if (typeof idPattern === 'string') { + var _path = (0,_paths__WEBPACK_IMPORTED_MODULE_1__.getPath)(paths, idPattern); + return _path ? [{ + id: idPattern, + property, + path: _path + }] : []; } - }, _callee); - })); - return function (_x) { - return _ref.apply(this, arguments); + var _keys = Object.keys(idPattern).sort(); + var patternVals = (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(_keys, idPattern); + var keyStr = _keys.join(','); + var keyPaths = paths.objs[keyStr]; + if (!keyPaths) { + return []; + } + var result = []; + keyPaths.forEach(function (_ref10) { + var vals = _ref10.values, + path = _ref10.path; + if ((0,_dependencies__WEBPACK_IMPORTED_MODULE_0__.idMatch)(_keys, vals, patternVals, refKeys, refVals, refPatternVals)) { + result.push({ + id: (0,ramda__WEBPACK_IMPORTED_MODULE_17__["default"])(_keys, vals), + property, + path + }); + } + }); + return result; + }; }; -})()); +} /***/ }), -/***/ "./src/APIController.react.js": -/*!************************************!*\ - !*** ./src/APIController.react.js ***! - \************************************/ +/***/ "./src/actions/index.js": +/*!******************************!*\ + !*** ./src/actions/index.js ***! + \******************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ DashContext: function() { return /* binding */ DashContext; } +/* harmony export */ addHttpHeaders: function() { return /* binding */ addHttpHeaders; }, +/* harmony export */ dispatchError: function() { return /* binding */ dispatchError; }, +/* harmony export */ getCSRFHeader: function() { return /* binding */ getCSRFHeader; }, +/* harmony export */ handleAsyncError: function() { return /* binding */ handleAsyncError; }, +/* harmony export */ hydrateInitialOutputs: function() { return /* binding */ hydrateInitialOutputs; }, +/* harmony export */ notifyObservers: function() { return /* binding */ notifyObservers; }, +/* harmony export */ onError: function() { return /* binding */ onError; }, +/* harmony export */ redo: function() { return /* binding */ redo; }, +/* harmony export */ revert: function() { return /* binding */ revert; }, +/* harmony export */ setAppLifecycle: function() { return /* binding */ setAppLifecycle; }, +/* harmony export */ setConfig: function() { return /* binding */ setConfig; }, +/* harmony export */ setGraphs: function() { return /* binding */ setGraphs; }, +/* harmony export */ setHooks: function() { return /* binding */ setHooks; }, +/* harmony export */ setLayout: function() { return /* binding */ setLayout; }, +/* harmony export */ setPaths: function() { return /* binding */ setPaths; }, +/* harmony export */ setRequestQueue: function() { return /* binding */ setRequestQueue; }, +/* harmony export */ undo: function() { return /* binding */ undo; }, +/* harmony export */ updateProps: function() { return /* binding */ updateProps; } /* harmony export */ }); -/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "prop-types"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _TreeContainer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./TreeContainer */ "./src/TreeContainer.js"); -/* harmony import */ var _components_error_GlobalErrorContainer_react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/error/GlobalErrorContainer.react */ "./src/components/error/GlobalErrorContainer.react.js"); -/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./actions */ "./src/actions/index.js"); -/* harmony import */ var _actions_paths__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./actions/paths */ "./src/actions/paths.js"); -/* harmony import */ var _actions_dependencies__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./actions/dependencies */ "./src/actions/dependencies.js"); -/* harmony import */ var _actions_api__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./actions/api */ "./src/actions/api.js"); -/* harmony import */ var _actions_utils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./actions/utils */ "./src/actions/utils.js"); -/* harmony import */ var _persistence__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./persistence */ "./src/persistence.js"); -/* harmony import */ var _reducers_constants__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./reducers/constants */ "./src/reducers/constants.js"); -/* harmony import */ var _constants_constants__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./constants/constants */ "./src/constants/constants.js"); -/* harmony import */ var _utils_TreeContainer__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./utils/TreeContainer */ "./src/utils/TreeContainer.ts"); -/* harmony import */ var _utils_wait__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./utils/wait */ "./src/utils/wait.ts"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/once.js"); +/* harmony import */ var redux_actions__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! redux-actions */ "./node_modules/redux-actions/es/createAction.js"); +/* harmony import */ var _callbacks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./callbacks */ "./src/actions/callbacks.ts"); +/* harmony import */ var _reducers_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../reducers/constants */ "./src/reducers/constants.js"); +/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ "./src/actions/constants.js"); +/* harmony import */ var cookie__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! cookie */ "./node_modules/cookie/index.js"); +/* harmony import */ var _dependencies__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dependencies */ "./src/actions/dependencies.js"); +/* harmony import */ var _dependencies_ts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./dependencies_ts */ "./src/actions/dependencies_ts.ts"); +/* harmony import */ var _paths__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./paths */ "./src/actions/paths.js"); function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(typeof e + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } -function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } @@ -3137,1012 +3816,1173 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } +var onError = (0,redux_actions__WEBPACK_IMPORTED_MODULE_7__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('ON_ERROR')); +var setAppLifecycle = (0,redux_actions__WEBPACK_IMPORTED_MODULE_7__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('SET_APP_LIFECYCLE')); +var setConfig = (0,redux_actions__WEBPACK_IMPORTED_MODULE_7__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('SET_CONFIG')); +var addHttpHeaders = (0,redux_actions__WEBPACK_IMPORTED_MODULE_7__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('ADD_HTTP_HEADERS')); +var setGraphs = (0,redux_actions__WEBPACK_IMPORTED_MODULE_7__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('SET_GRAPHS')); +var setHooks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_7__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('SET_HOOKS')); +var setLayout = (0,redux_actions__WEBPACK_IMPORTED_MODULE_7__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('SET_LAYOUT')); +var setPaths = (0,redux_actions__WEBPACK_IMPORTED_MODULE_7__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('SET_PATHS')); +var setRequestQueue = (0,redux_actions__WEBPACK_IMPORTED_MODULE_7__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('SET_REQUEST_QUEUE')); +var updateProps = (0,redux_actions__WEBPACK_IMPORTED_MODULE_7__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_2__.getAction)('ON_PROP_CHANGE')); +var dispatchError = function dispatchError(dispatch) { + return function (message, lines) { + return dispatch(onError({ + type: 'backEnd', + error: { + message, + html: lines.join('\n') + } + })); + }; +}; +function hydrateInitialOutputs() { + return function (dispatch, getState) { + (0,_dependencies__WEBPACK_IMPORTED_MODULE_4__.validateCallbacksToLayout)(getState(), dispatchError(dispatch)); + triggerDefaultState(dispatch, getState); + dispatch(setAppLifecycle((0,_reducers_constants__WEBPACK_IMPORTED_MODULE_1__.getAppState)('HYDRATED'))); + }; +} + +/* eslint-disable-next-line no-console */ +var logWarningOnce = (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(console.warn); +function getCSRFHeader() { + try { + return { + 'X-CSRFToken': cookie__WEBPACK_IMPORTED_MODULE_3__.parse(document.cookie)._csrf_token + }; + } catch (e) { + logWarningOnce(e); + return {}; + } +} +function triggerDefaultState(dispatch, getState) { + var _getState = getState(), + graphs = _getState.graphs, + paths = _getState.paths, + layout = _getState.layout; + + // overallOrder will assert circular dependencies for multi output. + try { + graphs.MultiGraph.overallOrder(); + } catch (err) { + dispatch(onError({ + type: 'backEnd', + error: { + message: 'Circular Dependencies', + html: err.toString() + } + })); + } + dispatch((0,_callbacks__WEBPACK_IMPORTED_MODULE_0__.addRequestedCallbacks)((0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_5__.getLayoutCallbacks)(graphs, paths, layout, { + outputsOnly: true + }))); +} +var redo = moveHistory('REDO'); +var undo = moveHistory('UNDO'); +var revert = moveHistory('REVERT'); +function moveHistory(changeType) { + return function (dispatch, getState) { + var _getState2 = getState(), + history = _getState2.history, + paths = _getState2.paths; + dispatch((0,redux_actions__WEBPACK_IMPORTED_MODULE_7__["default"])(changeType)()); + var _ref = (changeType === 'REDO' ? history.future[0] : history.past[history.past.length - 1]) || {}, + id = _ref.id, + props = _ref.props; + if (id) { + // Update props + dispatch((0,redux_actions__WEBPACK_IMPORTED_MODULE_7__["default"])('UNDO_PROP_CHANGE')({ + itempath: (0,_paths__WEBPACK_IMPORTED_MODULE_6__.getPath)(paths, id), + props + })); + dispatch(notifyObservers({ + id, + props + })); + } + }; +} +function notifyObservers(_ref2) { + var id = _ref2.id, + props = _ref2.props; + return /*#__PURE__*/function () { + var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(dispatch, getState) { + var _getState3, graphs, paths; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + _getState3 = getState(), graphs = _getState3.graphs, paths = _getState3.paths; + dispatch((0,_callbacks__WEBPACK_IMPORTED_MODULE_0__.addRequestedCallbacks)((0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_5__.includeObservers)(id, props, graphs, paths))); + case 2: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function (_x, _x2) { + return _ref3.apply(this, arguments); + }; + }(); +} +function handleAsyncError(err, message, dispatch) { + // Handle html error responses + if (err && typeof err.text === 'function') { + err.text().then(function (text) { + var error = { + message, + html: text + }; + dispatch(onError({ + type: 'backEnd', + error + })); + }); + } else { + var error = err instanceof Error ? err : { + message, + html: err + }; + dispatch(onError({ + type: 'backEnd', + error + })); + } +} +/***/ }), +/***/ "./src/actions/isAppReady.js": +/*!***********************************!*\ + !*** ./src/actions/isAppReady.js ***! + \***********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); +/* harmony import */ var _plotly_dash_component_plugins__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @plotly/dash-component-plugins */ "./node_modules/@plotly/dash-component-plugins/dist/index.js"); +/* harmony import */ var _plotly_dash_component_plugins__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_plotly_dash_component_plugins__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _registry__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../registry */ "./src/registry.js"); +/* harmony import */ var _paths__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./paths */ "./src/actions/paths.js"); +/* harmony import */ var _dependencies__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./dependencies */ "./src/actions/dependencies.js"); -var DashContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_2__.createContext)({}); -/** - * Fire off API calls for initialization - * @param {*} props props - * @returns {*} component - */ -var UnconnectedContainer = function UnconnectedContainer(props) { - var appLifecycle = props.appLifecycle, - config = props.config, - dependenciesRequest = props.dependenciesRequest, - error = props.error, - layoutRequest = props.layoutRequest, - layout = props.layout, - loadingMap = props.loadingMap; - var _useState = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)(false), - _useState2 = _slicedToArray(_useState, 2), - errorLoading = _useState2[0], - setErrorLoading = _useState2[1]; - var events = (0,react__WEBPACK_IMPORTED_MODULE_2__.useRef)(null); - if (!events.current) { - events.current = new _actions_utils__WEBPACK_IMPORTED_MODULE_10__.EventEmitter(); +/* harmony default export */ __webpack_exports__["default"] = (function (layout, paths, targets) { + if (!targets.length) { + return true; } - var renderedTree = (0,react__WEBPACK_IMPORTED_MODULE_2__.useRef)(false); - var propsRef = (0,react__WEBPACK_IMPORTED_MODULE_2__.useRef)({}); - propsRef.current = props; - var provider = (0,react__WEBPACK_IMPORTED_MODULE_2__.useRef)({ - fn: function fn() { - return { - _dashprivate_config: propsRef.current.config, - _dashprivate_dispatch: propsRef.current.dispatch, - _dashprivate_graphs: propsRef.current.graphs, - _dashprivate_loadingMap: propsRef.current.loadingMap - }; - } + var promises = []; + var events = paths.events; + var rendered = new Promise(function (resolveRendered) { + events.once('rendered', resolveRendered); }); - (0,react__WEBPACK_IMPORTED_MODULE_2__.useEffect)(storeEffect.bind(null, props, events, setErrorLoading)); - (0,react__WEBPACK_IMPORTED_MODULE_2__.useEffect)(function () { - if (renderedTree.current) { - _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) switch (_context.prev = _context.next) { - case 0: - renderedTree.current = false; - _context.next = 3; - return (0,_utils_wait__WEBPACK_IMPORTED_MODULE_15__["default"])(0); - case 3: - events.current.emit('rendered'); - case 4: - case "end": - return _context.stop(); - } - }, _callee); - }))(); - } - }); - (0,react__WEBPACK_IMPORTED_MODULE_2__.useEffect)(function () { - if (config.serve_locally) { - window._dashPlotlyJSURL = "".concat(config.requests_pathname_prefix, "_dash-component-suites/plotly/package_data/plotly.min.js"); - } else { - window._dashPlotlyJSURL = config.plotlyjs_url; - } - }, []); - var content; - if (layoutRequest.status && !(0,ramda__WEBPACK_IMPORTED_MODULE_1__.includes)(layoutRequest.status, [_constants_constants__WEBPACK_IMPORTED_MODULE_13__.STATUS.OK, 'loading'])) { - content = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", { - className: "_dash-error" - }, "Error loading layout"); - } else if (errorLoading || dependenciesRequest.status && !(0,ramda__WEBPACK_IMPORTED_MODULE_1__.includes)(dependenciesRequest.status, [_constants_constants__WEBPACK_IMPORTED_MODULE_13__.STATUS.OK, 'loading'])) { - content = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", { - className: "_dash-error" - }, "Error loading dependencies"); - } else if (appLifecycle === (0,_reducers_constants__WEBPACK_IMPORTED_MODULE_12__.getAppState)('HYDRATED')) { - renderedTree.current = true; - content = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(DashContext.Provider, { - value: provider.current - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_TreeContainer__WEBPACK_IMPORTED_MODULE_4__["default"], { - _dashprivate_error: error, - _dashprivate_layout: layout, - _dashprivate_loadingState: (0,_utils_TreeContainer__WEBPACK_IMPORTED_MODULE_14__.getLoadingState)(layout, [], loadingMap), - _dashprivate_loadingStateHash: (0,_utils_TreeContainer__WEBPACK_IMPORTED_MODULE_14__.getLoadingHash)([], loadingMap), - _dashprivate_path: JSON.stringify([]) - })); - } else { - content = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", { - className: "_dash-loading" - }, "Loading..."); - } - return config && config.ui === true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_components_error_GlobalErrorContainer_react__WEBPACK_IMPORTED_MODULE_5__["default"], null, content) : content; -}; -function storeEffect(props, events, setErrorLoading) { - var appLifecycle = props.appLifecycle, - dependenciesRequest = props.dependenciesRequest, - dispatch = props.dispatch, - error = props.error, - graphs = props.graphs, - hooks = props.hooks, - layout = props.layout, - layoutRequest = props.layoutRequest; - (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.batch)(function () { - if ((0,ramda__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(layoutRequest)) { - if (typeof hooks.layout_pre === 'function') { - hooks.layout_pre(); - } - dispatch((0,_actions_api__WEBPACK_IMPORTED_MODULE_9__["default"])('_dash-layout', 'GET', 'layoutRequest')); - } else if (layoutRequest.status === _constants_constants__WEBPACK_IMPORTED_MODULE_13__.STATUS.OK) { - if ((0,ramda__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(layout)) { - if (typeof hooks.layout_post === 'function') { - hooks.layout_post(layoutRequest.content); - } - var finalLayout = (0,_persistence__WEBPACK_IMPORTED_MODULE_11__.applyPersistence)(layoutRequest.content, dispatch); - dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_6__.setPaths)((0,_actions_paths__WEBPACK_IMPORTED_MODULE_7__.computePaths)(finalLayout, [], null, events.current))); - dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_6__.setLayout)(finalLayout)); - } + targets.forEach(function (id) { + var pathOfId = (0,_paths__WEBPACK_IMPORTED_MODULE_2__.getPath)(paths, id); + if (!pathOfId) { + return; } - if ((0,ramda__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(dependenciesRequest)) { - dispatch((0,_actions_api__WEBPACK_IMPORTED_MODULE_9__["default"])('_dash-dependencies', 'GET', 'dependenciesRequest')); - } else if (dependenciesRequest.status === _constants_constants__WEBPACK_IMPORTED_MODULE_13__.STATUS.OK && (0,ramda__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(graphs)) { - dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_6__.setGraphs)((0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_8__.computeGraphs)(dependenciesRequest.content, (0,_actions__WEBPACK_IMPORTED_MODULE_6__.dispatchError)(dispatch)))); + var target = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(pathOfId, layout); + if (!target) { + return; } - if ( - // dependenciesRequest and its computed stores - dependenciesRequest.status === _constants_constants__WEBPACK_IMPORTED_MODULE_13__.STATUS.OK && !(0,ramda__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(graphs) && - // LayoutRequest and its computed stores - layoutRequest.status === _constants_constants__WEBPACK_IMPORTED_MODULE_13__.STATUS.OK && !(0,ramda__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(layout) && - // Hasn't already hydrated - appLifecycle === (0,_reducers_constants__WEBPACK_IMPORTED_MODULE_12__.getAppState)('STARTED')) { - var hasError = false; - try { - dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_6__.hydrateInitialOutputs)((0,_actions__WEBPACK_IMPORTED_MODULE_6__.dispatchError)(dispatch))); - } catch (err) { - // Display this error in devtools, unless we have errors - // already, in which case we assume this new one is moot - if (!error.frontEnd.length && !error.backEnd.length) { - dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_6__.onError)({ - type: 'backEnd', - error: err - })); - } - hasError = true; - } finally { - setErrorLoading(hasError); - } + var component = _registry__WEBPACK_IMPORTED_MODULE_1__["default"].resolve(target); + var ready = (0,_plotly_dash_component_plugins__WEBPACK_IMPORTED_MODULE_0__.isReady)(component); + if (ready && typeof ready.then === 'function') { + promises.push(Promise.race([ready, rendered.then(function () { + return document.getElementById((0,_dependencies__WEBPACK_IMPORTED_MODULE_3__.stringifyId)(id)) && ready; + })])); } }); -} -UnconnectedContainer.propTypes = { - appLifecycle: prop_types__WEBPACK_IMPORTED_MODULE_3___default().oneOf([(0,_reducers_constants__WEBPACK_IMPORTED_MODULE_12__.getAppState)('STARTED'), (0,_reducers_constants__WEBPACK_IMPORTED_MODULE_12__.getAppState)('HYDRATED'), (0,_reducers_constants__WEBPACK_IMPORTED_MODULE_12__.getAppState)('DESTROYED')]), - dispatch: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func), - dependenciesRequest: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object), - graphs: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object), - hooks: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object), - layoutRequest: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object), - layout: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object), - loadingMap: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any), - history: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any), - error: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object), - config: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object) -}; -var Container = (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)( -// map state to props -function (state) { - return { - appLifecycle: state.appLifecycle, - dependenciesRequest: state.dependenciesRequest, - hooks: state.hooks, - layoutRequest: state.layoutRequest, - layout: state.layout, - loadingMap: state.loadingMap, - graphs: state.graphs, - history: state.history, - error: state.error, - config: state.config - }; -}, function (dispatch) { - return { - dispatch - }; -})(UnconnectedContainer); -/* harmony default export */ __webpack_exports__["default"] = (Container); + return promises.length ? Promise.all(promises) : true; +}); /***/ }), -/***/ "./src/AppContainer.react.js": +/***/ "./src/actions/isLoading.ts": +/*!**********************************!*\ + !*** ./src/actions/isLoading.ts ***! + \**********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ setIsLoading: function() { return /* binding */ setIsLoading; } +/* harmony export */ }); +/* harmony import */ var redux_actions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! redux-actions */ "./node_modules/redux-actions/es/createAction.js"); +/* harmony import */ var _reducers_isLoading__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../reducers/isLoading */ "./src/reducers/isLoading.ts"); + + +var setIsLoading = (0,redux_actions__WEBPACK_IMPORTED_MODULE_1__["default"])(_reducers_isLoading__WEBPACK_IMPORTED_MODULE_0__.IsLoadingActionType.Set); + +/***/ }), + +/***/ "./src/actions/loadingMap.ts": /*!***********************************!*\ - !*** ./src/AppContainer.react.js ***! + !*** ./src/actions/loadingMap.ts ***! \***********************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "prop-types"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _APIController_react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./APIController.react */ "./src/APIController.react.js"); -/* harmony import */ var _components_core_Loading_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/core/Loading.react */ "./src/components/core/Loading.react.js"); -/* harmony import */ var _components_core_Toolbar_react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/core/Toolbar.react */ "./src/components/core/Toolbar.react.js"); -/* harmony import */ var _components_core_Reloader_react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/core/Reloader.react */ "./src/components/core/Reloader.react.js"); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./config */ "./src/config.ts"); -/* harmony import */ var _actions_index__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./actions/index */ "./src/actions/index.js"); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ setLoadingMap: function() { return /* binding */ setLoadingMap; } +/* harmony export */ }); +/* harmony import */ var redux_actions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! redux-actions */ "./node_modules/redux-actions/es/createAction.js"); +/* harmony import */ var _reducers_loadingMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../reducers/loadingMap */ "./src/reducers/loadingMap.ts"); + + +var setLoadingMap = (0,redux_actions__WEBPACK_IMPORTED_MODULE_1__["default"])(_reducers_loadingMap__WEBPACK_IMPORTED_MODULE_0__.LoadingMapActionType.Set); + +/***/ }), + +/***/ "./src/actions/patch.ts": +/*!******************************!*\ + !*** ./src/actions/patch.ts ***! + \******************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ handlePatch: function() { return /* binding */ handlePatch; }, +/* harmony export */ isPatch: function() { return /* binding */ isPatch; } +/* harmony export */ }); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/has.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/is.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assocPath.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/concat.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/dissocPath.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/insert.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/append.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/prepend.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/empty.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/reverse.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/equals.js"); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } -function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } -function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } -function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } -function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } - - +function isPatch(obj) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])('__dash_patch_update', obj); +} +function getLocationIndex(value, previous) { + if ((0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(Number, value) && value < 0) { + return previous.length + value; + } + return value; +} +function getLocationPath(location, obj) { + var current = []; + for (var i = 0; i < location.length; i++) { + var value = getLocationIndex(location[i], (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(current, obj)); + current.push(value); + } + return current; +} +var patchHandlers = { + Assign: function Assign(previous, patchOperation) { + var params = patchOperation.params, + location = patchOperation.location; + return (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(location, params.value, previous); + }, + Merge: function Merge(previous, patchOperation) { + var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(patchOperation.location, previous); + return (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(patchOperation.location, _objectSpread(_objectSpread({}, prev), patchOperation.params.value), previous); + }, + Extend: function Extend(previous, patchOperation) { + var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(patchOperation.location, previous); + return (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(patchOperation.location, (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(prev, patchOperation.params.value), previous); + }, + Delete: function Delete(previous, patchOperation) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(patchOperation.location, previous); + }, + Insert: function Insert(previous, patchOperation) { + var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(patchOperation.location, previous); + return (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(patchOperation.location, (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(getLocationIndex(patchOperation.params.index, prev), patchOperation.params.value, prev), previous); + }, + Append: function Append(previous, patchOperation) { + var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(patchOperation.location, previous); + return (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(patchOperation.location, (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(patchOperation.params.value, prev), previous); + }, + Prepend: function Prepend(previous, patchOperation) { + var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(patchOperation.location, previous); + return (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(patchOperation.location, (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(patchOperation.params.value, prev), previous); + }, + Add: function Add(previous, patchOperation) { + var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(patchOperation.location, previous); + return (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(patchOperation.location, prev + patchOperation.params.value, previous); + }, + Sub: function Sub(previous, patchOperation) { + var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(patchOperation.location, previous); + return (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(patchOperation.location, prev - patchOperation.params.value, previous); + }, + Mul: function Mul(previous, patchOperation) { + var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(patchOperation.location, previous); + return (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(patchOperation.location, prev * patchOperation.params.value, previous); + }, + Div: function Div(previous, patchOperation) { + var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(patchOperation.location, previous); + return (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(patchOperation.location, prev / patchOperation.params.value, previous); + }, + Clear: function Clear(previous, patchOperation) { + var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(patchOperation.location, previous); + return (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(patchOperation.location, (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(prev), previous); + }, + Reverse: function Reverse(previous, patchOperation) { + var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(patchOperation.location, previous); + return (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(patchOperation.location, (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(prev), previous); + }, + Remove: function Remove(previous, patchOperation) { + var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(patchOperation.location, previous); + return (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(patchOperation.location, prev.filter(function (item) { + return !(0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(item, patchOperation.params.value); + }), previous); + } +}; +function handlePatch(previousValue, patchValue) { + var reducedValue = previousValue; + for (var i = 0; i < patchValue.operations.length; i++) { + var patch = patchValue.operations[i]; + patch.location = getLocationPath(patch.location, reducedValue); + var handler = patchHandlers[patch.operation]; + if (!handler) { + throw new Error("Invalid Operation ".concat(patch.operation)); + } + reducedValue = handler(reducedValue, patch); + } + return reducedValue; +} +/***/ }), +/***/ "./src/actions/paths.js": +/*!******************************!*\ + !*** ./src/actions/paths.js ***! + \******************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ computePaths: function() { return /* binding */ computePaths; }, +/* harmony export */ getPath: function() { return /* binding */ getPath; } +/* harmony export */ }); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/filter.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/forEachObjIndexed.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/props.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/concat.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/indexOf.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/insert.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/find.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/propEq.js"); +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/actions/utils.js"); +/* + * state.paths has structure: + * { + * strs: {[id]: path} // for regular string ids + * objs: {[keyStr]: [{values, path}]} // for wildcard ids + * } + * keyStr: sorted keys of the id, joined with ',' into one string + * values: array of values in the id, in order of keys + */ -var UnconnectedAppContainer = /*#__PURE__*/function (_React$Component) { - _inherits(UnconnectedAppContainer, _React$Component); - var _super = _createSuper(UnconnectedAppContainer); - function UnconnectedAppContainer(props) { - var _this; - _classCallCheck(this, UnconnectedAppContainer); - _this = _super.call(this, props); - if (props.hooks.layout_pre !== null || props.hooks.layout_post !== null || props.hooks.request_pre !== null || props.hooks.request_post !== null || props.hooks.callback_resolved !== null || props.hooks.request_refresh_jwt !== null) { - var hooks = props.hooks; - if (hooks.request_refresh_jwt) { - hooks = _objectSpread(_objectSpread({}, hooks), {}, { - request_refresh_jwt: (0,ramda__WEBPACK_IMPORTED_MODULE_9__.memoizeWith)(ramda__WEBPACK_IMPORTED_MODULE_9__.identity, hooks.request_refresh_jwt) - }); +function computePaths(subTree, startingPath, oldPaths, events) { + var _ref = oldPaths || { + strs: {}, + objs: {} + }, + oldStrs = _ref.strs, + oldObjs = _ref.objs; + var diffHead = function diffHead(path) { + return startingPath.some(function (v, i) { + return path[i] !== v; + }); + }; + var spLen = startingPath.length; + // if we're updating a subtree, clear out all of the existing items + var strs = spLen ? (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(diffHead, oldStrs) : {}; + var objs = {}; + if (spLen) { + (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (oldValPaths, oldKeys) { + var newVals = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(function (_ref2) { + var path = _ref2.path; + return diffHead(path); + }, oldValPaths); + if (newVals.length) { + objs[oldKeys] = newVals; } - props.dispatch((0,_actions_index__WEBPACK_IMPORTED_MODULE_8__.setHooks)(hooks)); - } - return _this; + }, oldObjs); } - _createClass(UnconnectedAppContainer, [{ - key: "UNSAFE_componentWillMount", - value: function UNSAFE_componentWillMount() { - var dispatch = this.props.dispatch; - var config = (0,_config__WEBPACK_IMPORTED_MODULE_7__["default"])(); - - // preset common request params in the config - config.fetch = { - credentials: 'same-origin', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json' + (0,_utils__WEBPACK_IMPORTED_MODULE_0__.crawlLayout)(subTree, function (child, itempath) { + var id = (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(['props', 'id'], child); + if (id) { + if (typeof id === 'object') { + var keys = Object.keys(id).sort(); + var values = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(keys, id); + var keyStr = keys.join(','); + var paths = objs[keyStr] = objs[keyStr] || []; + var oldie = oldObjs[keyStr] || []; + var item = { + values, + path: (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(startingPath, itempath) + }; + var index = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(item, oldie); + if (index === -1) { + paths.push(item); + } else { + objs[keyStr] = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(index, item, paths); } - }; - dispatch((0,_actions_index__WEBPACK_IMPORTED_MODULE_8__.setConfig)(config)); - } - }, { - key: "render", - value: function render() { - var config = this.props.config; - if ((0,ramda__WEBPACK_IMPORTED_MODULE_9__.type)(config) === 'Null') { - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { - className: "_dash-loading" - }, "Loading..."); + } else { + strs[id] = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(startingPath, itempath); } - var show_undo_redo = config.show_undo_redo; - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement((react__WEBPACK_IMPORTED_MODULE_1___default().Fragment), null, show_undo_redo ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_core_Toolbar_react__WEBPACK_IMPORTED_MODULE_5__["default"], null) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_APIController_react__WEBPACK_IMPORTED_MODULE_3__["default"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_core_Loading_react__WEBPACK_IMPORTED_MODULE_4__["default"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_core_Reloader_react__WEBPACK_IMPORTED_MODULE_6__["default"], null)); } - }]); - return UnconnectedAppContainer; -}((react__WEBPACK_IMPORTED_MODULE_1___default().Component)); -UnconnectedAppContainer.propTypes = { - hooks: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object), - dispatch: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func), - config: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object) -}; -var AppContainer = (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(function (state) { - return { - history: state.history, - config: state.config - }; -}, function (dispatch) { + }); + + // We include an event emitter here because it will be used along with + // paths to determine when the app is ready for callbacks. return { - dispatch + strs, + objs, + events: events || oldPaths.events }; -})(UnconnectedAppContainer); -/* harmony default export */ __webpack_exports__["default"] = (AppContainer); +} +function getPath(paths, id) { + if (typeof id === 'object') { + var keys = Object.keys(id).sort(); + var keyStr = keys.join(','); + var keyPaths = paths.objs[keyStr]; + if (!keyPaths) { + return false; + } + var values = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(keys, id); + var pathObj = (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(values, 'values'), keyPaths); + return pathObj && pathObj.path; + } + return paths.strs[id]; +} /***/ }), -/***/ "./src/DashRenderer.js": -/*!*****************************!*\ - !*** ./src/DashRenderer.js ***! - \*****************************/ +/***/ "./src/actions/requestDependencies.ts": +/*!********************************************!*\ + !*** ./src/actions/requestDependencies.ts ***! + \********************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ DashRenderer: function() { return /* binding */ DashRenderer; } +/* harmony export */ requestDependencies: function() { return /* binding */ requestDependencies; } /* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ "react-dom"); -/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _AppProvider_react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AppProvider.react */ "./src/AppProvider.react.tsx"); -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } -function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - +/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); +/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index */ "./src/actions/index.js"); +/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./api */ "./src/actions/api.js"); -var DashRenderer = /*#__PURE__*/_createClass(function DashRenderer(hooks) { - _classCallCheck(this, DashRenderer); - // render Dash Renderer upon initialising! - var container = document.getElementById('react-entry-point'); - if ((react_dom__WEBPACK_IMPORTED_MODULE_1___default().createRoot)) { - var root = react_dom__WEBPACK_IMPORTED_MODULE_1___default().createRoot(container); - root.render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_AppProvider_react__WEBPACK_IMPORTED_MODULE_2__["default"], { - hooks: hooks - })); - } else { - react_dom__WEBPACK_IMPORTED_MODULE_1___default().render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_AppProvider_react__WEBPACK_IMPORTED_MODULE_2__["default"], { - hooks: hooks - }), container); - } -}); +function requestDependencies() { + return function (dispatch) { + (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.batch)(function () { + dispatch((0,_index__WEBPACK_IMPORTED_MODULE_1__.setGraphs)({})); + dispatch((0,_api__WEBPACK_IMPORTED_MODULE_2__["default"])('_dash-dependencies', 'GET', 'dependenciesRequest')); + }); + }; +} /***/ }), -/***/ "./src/TreeContainer.js": +/***/ "./src/actions/utils.js": /*!******************************!*\ - !*** ./src/TreeContainer.js ***! + !*** ./src/actions/utils.js ***! \******************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "prop-types"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _registry__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./registry */ "./src/registry.js"); -/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./exceptions */ "./src/exceptions.js"); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./actions */ "./src/actions/index.js"); -/* harmony import */ var _isSimpleComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./isSimpleComponent */ "./src/isSimpleComponent.js"); -/* harmony import */ var _persistence__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./persistence */ "./src/persistence.js"); -/* harmony import */ var _components_error_ComponentErrorBoundary_react__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./components/error/ComponentErrorBoundary.react */ "./src/components/error/ComponentErrorBoundary.react.js"); -/* harmony import */ var _checkPropTypes__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./checkPropTypes */ "./src/checkPropTypes.js"); -/* harmony import */ var _actions_dependencies__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./actions/dependencies */ "./src/actions/dependencies.js"); -/* harmony import */ var _utils_TreeContainer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./utils/TreeContainer */ "./src/utils/TreeContainer.ts"); -/* harmony import */ var _APIController_react__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./APIController.react */ "./src/APIController.react.js"); -/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); -function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } -function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } -function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ EventEmitter: function() { return /* binding */ EventEmitter; }, +/* harmony export */ crawlLayout: function() { return /* binding */ crawlLayout; }, +/* harmony export */ urlBase: function() { return /* binding */ urlBase; } +/* harmony export */ }); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/has.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/type.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/findIndex.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/includes.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/slice.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/concat.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/append.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pathOr.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } -function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } -function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } -function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } -function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } -function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - - - - - - - - - - - -var NOT_LOADING = { - is_loading: false -}; -function CheckedComponent(p) { - var element = p.element, - extraProps = p.extraProps, - props = p.props, - children = p.children, - type = p.type; - var errorMessage = (0,_checkPropTypes__WEBPACK_IMPORTED_MODULE_9__["default"])(element.propTypes, props, 'component prop', element); - if (errorMessage) { - (0,_exceptions__WEBPACK_IMPORTED_MODULE_3__.propTypeErrorHandler)(errorMessage, props, type); - } - return createElement(element, props, extraProps, children); -} -CheckedComponent.propTypes = { - children: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().any), - element: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().any), - layout: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().any), - props: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().any), - extraProps: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().any), - id: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string) -}; -function createElement(element, props, extraProps, children) { - var allProps = (0,ramda__WEBPACK_IMPORTED_MODULE_4__.mergeRight)(props, extraProps); - if (Array.isArray(children)) { - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement.apply((react__WEBPACK_IMPORTED_MODULE_0___default()), [element, allProps].concat(_toConsumableArray(children))); +/* + * requests_pathname_prefix is the new config parameter introduced in + * dash==0.18.0. The previous versions just had url_base_pathname + */ +function urlBase(config) { + var hasUrlBase = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])('url_base_pathname', config); + var hasReqPrefix = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])('requests_pathname_prefix', config); + if ((0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(config) !== 'Object' || !hasUrlBase && !hasReqPrefix) { + throw new Error("\n Trying to make an API request but neither\n \"url_base_pathname\" nor \"requests_pathname_prefix\"\n is in `config`. `config` is: ", config); } - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(element, allProps, children); -} -function isDryComponent(obj) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_4__.type)(obj) === 'Object' && (0,ramda__WEBPACK_IMPORTED_MODULE_4__.has)('type', obj) && (0,ramda__WEBPACK_IMPORTED_MODULE_4__.has)('namespace', obj) && (0,ramda__WEBPACK_IMPORTED_MODULE_4__.has)('props', obj); + var base = hasReqPrefix ? config.requests_pathname_prefix : config.url_base_pathname; + return base.charAt(base.length - 1) === '/' ? base : base + '/'; } -var DashWrapper = function DashWrapper(props) { - var context = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_APIController_react__WEBPACK_IMPORTED_MODULE_12__.DashContext); - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(BaseTreeContainer, _extends({}, context.fn(), props, { - _dashprivate_path: JSON.parse(props._dashprivate_path) - })); -}; -var TreeContainer = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(DashWrapper); -var BaseTreeContainer = /*#__PURE__*/function (_Component) { - _inherits(BaseTreeContainer, _Component); - var _super = _createSuper(BaseTreeContainer); - function BaseTreeContainer(props) { - var _this; - _classCallCheck(this, BaseTreeContainer); - _this = _super.call(this, props); - _this.setProps = _this.setProps.bind(_assertThisInitialized(_this)); - return _this; - } - _createClass(BaseTreeContainer, [{ - key: "createContainer", - value: function createContainer(props, component, path) { - var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : undefined; - return (0,_isSimpleComponent__WEBPACK_IMPORTED_MODULE_6__["default"])(component) ? component : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(TreeContainer, { - key: component && component.props && (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_10__.stringifyId)(component.props.id) || key, - _dashprivate_error: props._dashprivate_error, - _dashprivate_layout: component, - _dashprivate_loadingState: (0,_utils_TreeContainer__WEBPACK_IMPORTED_MODULE_11__.getLoadingState)(component, path, props._dashprivate_loadingMap), - _dashprivate_loadingStateHash: (0,_utils_TreeContainer__WEBPACK_IMPORTED_MODULE_11__.getLoadingHash)(path, props._dashprivate_loadingMap), - _dashprivate_path: JSON.stringify(path) - }); - } - }, { - key: "setProps", - value: function setProps(newProps) { - var _this$props = this.props, - _dashprivate_dispatch = _this$props._dashprivate_dispatch, - _dashprivate_path = _this$props._dashprivate_path, - _dashprivate_layout = _this$props._dashprivate_layout; - var oldProps = this.getLayoutProps(); - var id = oldProps.id; - var changedProps = (0,ramda__WEBPACK_IMPORTED_MODULE_4__.pickBy)(function (val, key) { - return !(0,ramda__WEBPACK_IMPORTED_MODULE_4__.equals)(val, oldProps[key]); - }, newProps); - if (!(0,ramda__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(changedProps)) { - _dashprivate_dispatch(function (dispatch, getState) { - var _getState = getState(), - graphs = _getState.graphs; - // Identify the modified props that are required for callbacks - var watchedKeys = (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_10__.getWatchedKeys)(id, (0,ramda__WEBPACK_IMPORTED_MODULE_4__.keys)(changedProps), graphs); - (0,react_redux__WEBPACK_IMPORTED_MODULE_13__.batch)(function () { - // setProps here is triggered by the UI - record these changes - // for persistence - (0,_persistence__WEBPACK_IMPORTED_MODULE_7__.recordUiEdit)(_dashprivate_layout, newProps, dispatch); +var propsChildren = ['props', 'children']; - // Only dispatch changes to Dash if a watched prop changed - if (watchedKeys.length) { - dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_5__.notifyObservers)({ - id, - props: (0,ramda__WEBPACK_IMPORTED_MODULE_4__.pick)(watchedKeys, changedProps) - })); +// crawl a layout object or children array, apply a function on every object +var crawlLayout = function crawlLayout(object, func) { + var currentPath = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; + var extraPath = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : undefined; + if (Array.isArray(object)) { + // children array + object.forEach(function (child, i) { + if (extraPath) { + var objOf = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (p) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])('{}', p); + }, extraPath); + if (objOf !== -1) { + var front = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(0, objOf, extraPath); + var back = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(objOf, extraPath.length, extraPath); + if (front.length) { + crawlLayout((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(front, child), func, (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(currentPath, (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])([i], front)), back); + } else { + var backPath = back.map(function (p) { + return p.replace('{}', ''); + }).filter(function (e) { + return e; + }); + var childObj, + childPath = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])([i], backPath); + if (backPath.length) { + childObj = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(backPath, child); + } else { + childObj = child; } - - // Always update this component's props - dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_5__.updateProps)({ - props: changedProps, - itempath: _dashprivate_path - })); - }); - }); - } - } - }, { - key: "getChildren", - value: function getChildren(components, path) { - var _this2 = this; - if ((0,ramda__WEBPACK_IMPORTED_MODULE_4__.isNil)(components)) { - return null; - } - return Array.isArray(components) ? (0,ramda__WEBPACK_IMPORTED_MODULE_4__.addIndex)(ramda__WEBPACK_IMPORTED_MODULE_4__.map)(function (component, i) { - return _this2.createContainer(_this2.props, component, (0,ramda__WEBPACK_IMPORTED_MODULE_4__.concat)(path, ['props', 'children', i])); - }, components) : this.createContainer(this.props, components, (0,ramda__WEBPACK_IMPORTED_MODULE_4__.concat)(path, ['props', 'children'])); - } - }, { - key: "wrapChildrenProp", - value: function wrapChildrenProp(node, childrenProp) { - var _this3 = this; - if (Array.isArray(node)) { - return node.map(function (n, i) { - return isDryComponent(n) ? _this3.createContainer(_this3.props, n, (0,ramda__WEBPACK_IMPORTED_MODULE_4__.concat)(_this3.props._dashprivate_path, ['props'].concat(_toConsumableArray(childrenProp), [i])), i) : n; - }); - } - if (!isDryComponent(node)) { - return node; + for (var key in childObj) { + var value = childObj[key]; + crawlLayout(value, func, (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(currentPath, childPath.concat([key]))); + } + } + } else { + crawlLayout((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(extraPath, child), func, (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(currentPath, (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])([i], extraPath))); + } + } else { + crawlLayout(child, func, (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(i, currentPath)); } - return this.createContainer(this.props, node, (0,ramda__WEBPACK_IMPORTED_MODULE_4__.concat)(this.props._dashprivate_path, ['props'].concat(_toConsumableArray(childrenProp)))); + }); + } else if ((0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(object) === 'Object') { + func(object, currentPath); + var children = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(propsChildren, object); + if (children) { + var newPath = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(currentPath, propsChildren); + crawlLayout(children, func, newPath); } - }, { - key: "getComponent", - value: function getComponent(_dashprivate_layout, children, loading_state, setProps) { - var _this4 = this; - var _this$props2 = this.props, - _dashprivate_config = _this$props2._dashprivate_config, - _dashprivate_dispatch = _this$props2._dashprivate_dispatch, - _dashprivate_error = _this$props2._dashprivate_error; - if ((0,ramda__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(_dashprivate_layout)) { - return null; - } - if ((0,_isSimpleComponent__WEBPACK_IMPORTED_MODULE_6__["default"])(_dashprivate_layout)) { - return _dashprivate_layout; - } - (0,_utils_TreeContainer__WEBPACK_IMPORTED_MODULE_11__.validateComponent)(_dashprivate_layout); - var element = _registry__WEBPACK_IMPORTED_MODULE_2__["default"].resolve(_dashprivate_layout); - - // Hydrate components props - var childrenProps = (0,ramda__WEBPACK_IMPORTED_MODULE_4__.pathOr)([], ['children_props', _dashprivate_layout.namespace, _dashprivate_layout.type], _dashprivate_config); - var props = (0,ramda__WEBPACK_IMPORTED_MODULE_4__.dissoc)('children', _dashprivate_layout.props); - var _loop = function _loop() { - var childrenProp = childrenProps[i]; - var handleObject = function handleObject(obj, opath) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_4__.mapObjIndexed)(function (node, k) { - return _this4.wrapChildrenProp(node, [].concat(_toConsumableArray(opath), [k])); - }, obj); - }; - if (childrenProp.includes('.')) { - var path = childrenProp.split('.'); - var node; - var nodeValue; - if (childrenProp.includes('[]')) { - var frontPath = [], - backPath = [], - found = false, - hasObject = false; - path.forEach(function (p) { - if (!found) { - if (p.includes('[]')) { - found = true; - if (p.includes('{}')) { - hasObject = true; - frontPath.push(p.replace('{}', '').replace('[]', '')); - } else { - frontPath.push(p.replace('[]', '')); - } - } else if (p.includes('{}')) { - hasObject = true; - frontPath.push(p.replace('{}', '')); - } else { - frontPath.push(p); - } - } else { - if (p.includes('{}')) { - hasObject = true; - backPath.push(p.replace('{}', '')); - } else { - backPath.push(p); - } - } - }); - node = (0,ramda__WEBPACK_IMPORTED_MODULE_4__.path)(frontPath, props); - if (node === undefined || !node.length) { - return 0; // continue - } - var firstNode = (0,ramda__WEBPACK_IMPORTED_MODULE_4__.path)(backPath, node[0]); - if (!firstNode) { - return 0; // continue - } - nodeValue = node.map(function (element, i) { - var elementPath = (0,ramda__WEBPACK_IMPORTED_MODULE_4__.concat)(frontPath, (0,ramda__WEBPACK_IMPORTED_MODULE_4__.concat)([i], backPath)); - var listValue; - if (hasObject) { - if (backPath.length) { - listValue = handleObject((0,ramda__WEBPACK_IMPORTED_MODULE_4__.path)(backPath, element), elementPath); - } else { - listValue = handleObject(element, elementPath); - } - } else { - listValue = _this4.wrapChildrenProp((0,ramda__WEBPACK_IMPORTED_MODULE_4__.path)(backPath, element), elementPath); - } - return (0,ramda__WEBPACK_IMPORTED_MODULE_4__.assocPath)(backPath, listValue, element); - }); - path = frontPath; + var childrenProps = (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])([], [object.namespace, object.type], window.__dashprivate_childrenProps); + childrenProps.forEach(function (childrenProp) { + if (childrenProp.includes('[]')) { + var _childrenProp$split$m = childrenProp.split('[]').map(function (p) { + return p.split('.').filter(function (e) { + return e; + }); + }), + _childrenProp$split$m2 = _slicedToArray(_childrenProp$split$m, 2), + frontPath = _childrenProp$split$m2[0], + backPath = _childrenProp$split$m2[1]; + var front = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(['props'], frontPath); + var basePath = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(currentPath, front); + crawlLayout((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(front, object), func, basePath, backPath); + } else { + if (childrenProp.includes('{}')) { + var opath = childrenProp.split('.'); + var _frontPath = []; + var _backPath = []; + var found = false; + for (var i = 0; i < opath.length; i++) { + var curPath = opath[i]; + if (!found && curPath.includes('{}')) { + found = true; + _frontPath.push(curPath.replace('{}', '')); } else { - if (childrenProp.includes('{}')) { - // Only supports one level of nesting. - var front = []; - var dynamic = []; - var hasBack = false; - var _backPath = []; - for (var j = 0; j < path.length; j++) { - var cur = path[j]; - if (cur.includes('{}')) { - dynamic = (0,ramda__WEBPACK_IMPORTED_MODULE_4__.concat)(front, [cur.replace('{}', '')]); - if (j < path.length - 1) { - hasBack = true; - } - } else { - if (hasBack) { - _backPath.push(cur); - } else { - front.push(cur); - } - } - } - var dynValue = (0,ramda__WEBPACK_IMPORTED_MODULE_4__.path)(dynamic, props); - if (dynValue !== undefined) { - nodeValue = (0,ramda__WEBPACK_IMPORTED_MODULE_4__.mapObjIndexed)(function (d, k) { - return _this4.wrapChildrenProp(hasBack ? (0,ramda__WEBPACK_IMPORTED_MODULE_4__.path)(_backPath, d) : d, hasBack ? (0,ramda__WEBPACK_IMPORTED_MODULE_4__.concat)(dynamic, (0,ramda__WEBPACK_IMPORTED_MODULE_4__.concat)([k], _backPath)) : (0,ramda__WEBPACK_IMPORTED_MODULE_4__.concat)(dynamic, [k])); - }, dynValue); - path = dynamic; - } + if (found) { + _backPath.push(curPath); } else { - node = (0,ramda__WEBPACK_IMPORTED_MODULE_4__.path)(path, props); - if (node === undefined) { - return 0; // continue - } - nodeValue = _this4.wrapChildrenProp(node, path); + _frontPath.push(curPath); } } - props = (0,ramda__WEBPACK_IMPORTED_MODULE_4__.assocPath)(path, nodeValue, props); - } else { - if (childrenProp.includes('{}')) { - var opath = childrenProp.replace('{}', ''); - var isArray = childrenProp.includes('[]'); - if (isArray) { - opath = opath.replace('[]', ''); - } - var _node = props[opath]; - if (_node !== undefined) { - if (isArray) { - for (var _j = 0; _j < _node.length; _j++) { - var aPath = (0,ramda__WEBPACK_IMPORTED_MODULE_4__.concat)([opath], [_j]); - props = (0,ramda__WEBPACK_IMPORTED_MODULE_4__.assocPath)(aPath, handleObject(_node[_j], aPath), props); - } - } else { - props = (0,ramda__WEBPACK_IMPORTED_MODULE_4__.assoc)(opath, handleObject(_node, [opath]), props); - } - } - } else { - var _node2 = props[childrenProp]; - if (_node2 !== undefined) { - props = (0,ramda__WEBPACK_IMPORTED_MODULE_4__.assoc)(childrenProp, _this4.wrapChildrenProp(_node2, [childrenProp]), props); + } + var _newPath = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(currentPath, ['props'].concat(_frontPath)); + var oValue = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(['props'].concat(_frontPath), object); + if (oValue !== undefined) { + for (var key in oValue) { + var value = oValue[key]; + if (_backPath.length) { + crawlLayout((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(_backPath, value), func, (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(_newPath, [key].concat(_backPath))); + } else { + crawlLayout(value, func, [].concat(_toConsumableArray(_newPath), [key])); } } } - }, - _ret; - for (var i = 0; i < childrenProps.length; i++) { - _ret = _loop(); - if (_ret === 0) continue; - } - if ((0,ramda__WEBPACK_IMPORTED_MODULE_4__.type)(props.id) === 'Object') { - // Turn object ids (for wildcards) into unique strings. - // Because of the `dissoc` above we're not mutating the layout, - // just the id we pass on to the rendered component - props.id = (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_10__.stringifyId)(props.id); + } else { + var _newPath2 = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(currentPath, ['props'].concat(_toConsumableArray(childrenProp.split('.')))); + crawlLayout((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(['props'].concat(_toConsumableArray(childrenProp.split('.'))), object), func, _newPath2); + } } - var extraProps = { - loading_state: loading_state || NOT_LOADING, - setProps + }); + } +}; + +// There are packages for this but it's simple enough, I just +// adapted it from https://gist.github.com/mudge/5830382 +var EventEmitter = /*#__PURE__*/function () { + function EventEmitter() { + _classCallCheck(this, EventEmitter); + this._ev = {}; + } + _createClass(EventEmitter, [{ + key: "on", + value: function on(event, listener) { + var _this = this; + var events = this._ev[event] = this._ev[event] || []; + events.push(listener); + return function () { + return _this.removeListener(event, listener); }; - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_error_ComponentErrorBoundary_react__WEBPACK_IMPORTED_MODULE_8__["default"], { - componentType: _dashprivate_layout.type, - componentId: props.id, - key: props.id, - dispatch: _dashprivate_dispatch, - error: _dashprivate_error - }, _dashprivate_config.props_check ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(CheckedComponent, { - children: children, - element: element, - props: props, - extraProps: extraProps, - type: _dashprivate_layout.type - }) : createElement(element, props, extraProps, children)); } }, { - key: "getLayoutProps", - value: function getLayoutProps() { - return (0,ramda__WEBPACK_IMPORTED_MODULE_4__.propOr)({}, 'props', this.props._dashprivate_layout); + key: "removeListener", + value: function removeListener(event, listener) { + var events = this._ev[event]; + if (events) { + var idx = events.indexOf(listener); + if (idx > -1) { + events.splice(idx, 1); + } + } } }, { - key: "render", - value: function render() { - var _this$props3 = this.props, - _dashprivate_layout = _this$props3._dashprivate_layout, - _dashprivate_loadingState = _this$props3._dashprivate_loadingState, - _dashprivate_path = _this$props3._dashprivate_path; - var layoutProps = this.getLayoutProps(); - var children = this.getChildren(layoutProps.children, _dashprivate_path); - return this.getComponent(_dashprivate_layout, children, _dashprivate_loadingState, this.setProps); + key: "emit", + value: function emit(event) { + var _this2 = this; + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + var events = this._ev[event]; + if (events) { + events.forEach(function (listener) { + return listener.apply(_this2, args); + }); + } + } + }, { + key: "once", + value: function once(event, listener) { + var _this3 = this; + var remove = this.on(event, function () { + remove(); + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + listener.apply(_this3, args); + }); } }]); - return BaseTreeContainer; -}(react__WEBPACK_IMPORTED_MODULE_0__.Component); -TreeContainer.propTypes = { - _dashprivate_error: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().any), - _dashprivate_layout: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), - _dashprivate_loadingState: prop_types__WEBPACK_IMPORTED_MODULE_1___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), (prop_types__WEBPACK_IMPORTED_MODULE_1___default().bool)]), - _dashprivate_loadingStateHash: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string), - _dashprivate_path: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string) -}; -BaseTreeContainer.propTypes = _objectSpread(_objectSpread({}, TreeContainer.propTypes), {}, { - _dashprivate_config: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), - _dashprivate_dispatch: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func), - _dashprivate_graphs: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().any), - _dashprivate_loadingMap: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().any), - _dashprivate_path: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().array) -}); -/* harmony default export */ __webpack_exports__["default"] = (TreeContainer); + return EventEmitter; +}(); /***/ }), -/***/ "./src/actions/api.js": -/*!****************************!*\ - !*** ./src/actions/api.js ***! - \****************************/ +/***/ "./src/checkPropTypes.js": +/*!*******************************!*\ + !*** ./src/checkPropTypes.js ***! + \*******************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ apiThunk; } +/* harmony export */ "default": function() { return /* binding */ checkPropTypes; } /* harmony export */ }); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../actions */ "./src/actions/index.js"); -/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/actions/utils.js"); -/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants */ "./src/actions/constants.js"); -/* harmony import */ var _constants_constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants/constants */ "./src/constants/constants.js"); -function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(typeof e + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } -function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } -function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } +/* harmony import */ var prop_types_lib_ReactPropTypesSecret__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types/lib/ReactPropTypesSecret */ "./node_modules/prop-types/lib/ReactPropTypesSecret.js"); +/* harmony import */ var prop_types_lib_ReactPropTypesSecret__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types_lib_ReactPropTypesSecret__WEBPACK_IMPORTED_MODULE_0__); +/* + * Copied out of prop-types and modified - inspired by check-prop-types, but + * simplified and tweaked to our needs: we don't need the NODE_ENV check, + * we report all errors, not just the first one, and we don't need the throwing + * variant `assertPropTypes`. + */ + + +/** + * Assert that the values match with the type specs. + * + * @param {object} typeSpecs Map of name to a ReactPropType + * @param {object} values Runtime values that need to be type-checked + * @param {string} location e.g. "prop", "context", "child context" + * @param {string} componentName Name of the component for error messages. + * @param {?Function} getStack Returns the component stack. + * @return {string} Any error message resulting from checking the types + */ +function checkPropTypes(typeSpecs, values, location, componentName) { + var getStack = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null; + var errors = []; + for (var typeSpecName in typeSpecs) { + if (typeSpecs.hasOwnProperty(typeSpecName)) { + var error = void 0; + // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + if (typeof typeSpecs[typeSpecName] !== 'function') { + error = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'); + error.name = 'Invariant Violation'; + } else { + error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, (prop_types_lib_ReactPropTypesSecret__WEBPACK_IMPORTED_MODULE_0___default())); + } + } catch (ex) { + error = ex; + } + if (error && !(error instanceof Error)) { + errors.push((componentName || 'React class') + ': type specification of ' + location + ' `' + typeSpecName + '` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).'); + } + if (error instanceof Error) { + var stack = getStack && getStack() || ''; + errors.push('Failed ' + location + ' type: ' + error.message + stack); + } + } + } + return errors.join('\n\n'); +} +/***/ }), +/***/ "./src/components/core/Loading.react.js": +/*!**********************************************!*\ + !*** ./src/components/core/Loading.react.js ***! + \**********************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "prop-types"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); -/* eslint-disable-next-line no-console */ -var logWarningOnce = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.once)(console.warn); -function GET(path, fetchConfig) { - return fetch(path, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.mergeDeepRight)(fetchConfig, { - method: 'GET', - headers: (0,_actions__WEBPACK_IMPORTED_MODULE_1__.getCSRFHeader)() - })); -} -function POST(path, fetchConfig) { - var body = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - return fetch(path, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.mergeDeepRight)(fetchConfig, { - method: 'POST', - headers: (0,_actions__WEBPACK_IMPORTED_MODULE_1__.getCSRFHeader)(), - body: body ? JSON.stringify(body) : null - })); +function Loading(props) { + if (props.isLoading) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { + className: "_dash-loading-callback" + }); + } + return null; } -var request = { - GET, - POST +Loading.propTypes = { + isLoading: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired }; -function apiThunk(endpoint, method, store, id, body) { - return /*#__PURE__*/function () { - var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(dispatch, getState) { - var _getState, config, hooks, newHeaders, url, setConnectionStatus, res, retry, _body, newJwt, contentType, message; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) switch (_context.prev = _context.next) { - case 0: - setConnectionStatus = function _setConnectionStatus(connected) { - if (getState().error.backEndConnected !== connected) { - dispatch({ - type: 'SET_CONNECTION_STATUS', - payload: connected - }); - } - }; - _getState = getState(), config = _getState.config, hooks = _getState.hooks; - newHeaders = null; - url = "".concat((0,_utils__WEBPACK_IMPORTED_MODULE_2__.urlBase)(config)).concat(endpoint); - dispatch({ - type: store, - payload: { - id, - status: 'loading' - } - }); - _context.prev = 5; - retry = 0; - case 7: - if (!(retry <= _constants__WEBPACK_IMPORTED_MODULE_3__.MAX_AUTH_RETRIES)) { - _context.next = 36; - break; - } - _context.prev = 8; - _context.next = 11; - return request[method](url, config.fetch, body); - case 11: - res = _context.sent; - _context.next = 19; - break; - case 14: - _context.prev = 14; - _context.t0 = _context["catch"](8); - // fetch rejection - this means the request didn't return, - // we don't get here from 400/500 errors, only network - // errors or unresponsive servers. - // eslint-disable-next-line no-console - console.log('fetch error', res); - setConnectionStatus(false); - return _context.abrupt("return"); - case 19: - if (!(res.status === _constants_constants__WEBPACK_IMPORTED_MODULE_4__.STATUS.UNAUTHORIZED || res.status === _constants_constants__WEBPACK_IMPORTED_MODULE_4__.STATUS.BAD_REQUEST)) { - _context.next = 32; - break; - } - if (!hooks.request_refresh_jwt) { - _context.next = 32; - break; - } - _context.next = 23; - return res.text(); - case 23: - _body = _context.sent; - if (!_body.includes(_constants_constants__WEBPACK_IMPORTED_MODULE_4__.JWT_EXPIRED_MESSAGE)) { - _context.next = 32; - break; - } - _context.next = 27; - return hooks.request_refresh_jwt(config.fetch.headers.Authorization.substr('Bearer '.length)); - case 27: - newJwt = _context.sent; - if (!newJwt) { - _context.next = 32; - break; - } - newHeaders = { - Authorization: "Bearer ".concat(newJwt) - }; - config = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.mergeDeepRight)(config, { - fetch: { - headers: newHeaders - } - }); - return _context.abrupt("continue", 33); - case 32: - return _context.abrupt("break", 36); - case 33: - retry++; - _context.next = 7; - break; - case 36: - contentType = res.headers.get('content-type'); - if (newHeaders) { - dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_1__.addHttpHeaders)(newHeaders)); - } - setConnectionStatus(true); - if (!(contentType && contentType.indexOf('application/json') !== -1)) { - _context.next = 41; - break; - } - return _context.abrupt("return", res.json().then(function (json) { - dispatch({ - type: store, - payload: { - status: res.status, - content: json, - id +/* harmony default export */ __webpack_exports__["default"] = ((0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(function (state) { + return { + isLoading: state.isLoading + }; +})(Loading)); + +/***/ }), + +/***/ "./src/components/core/Reloader.react.js": +/*!***********************************************!*\ + !*** ./src/components/core/Reloader.react.js ***! + \***********************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/has.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/equals.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pathOr.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/sort.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/comparator.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/lt.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/forEach.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/isEmpty.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "prop-types"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); +/* harmony import */ var _actions_api__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../actions/api */ "./src/actions/api.js"); +function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + + + + + +var Reloader = /*#__PURE__*/function (_React$Component) { + _inherits(Reloader, _React$Component); + var _super = _createSuper(Reloader); + function Reloader(props) { + var _this; + _classCallCheck(this, Reloader); + _this = _super.call(this, props); + if (props.config.hot_reload) { + var _props$config$hot_rel = props.config.hot_reload, + interval = _props$config$hot_rel.interval, + max_retry = _props$config$hot_rel.max_retry; + _this.state = { + interval, + disabled: false, + intervalId: null, + packages: null, + max_retry + }; + } else { + _this.state = { + disabled: true + }; + } + _this._retry = 0; + _this._head = document.querySelector('head'); + _this.clearInterval = _this.clearInterval.bind(_assertThisInitialized(_this)); + return _this; + } + _createClass(Reloader, [{ + key: "clearInterval", + value: function clearInterval() { + window.clearInterval(this.state.intervalId); + this.setState({ + intervalId: null + }); + } + }, { + key: "componentDidUpdate", + value: function componentDidUpdate(prevProps, prevState) { + var reloadRequest = this.state.reloadRequest; + var dispatch = this.props.dispatch; + + // In the beginning, reloadRequest won't be defined + if (!reloadRequest) { + return; + } + + /* + * When reloadRequest is first defined, prevState won't be defined + * for one render loop. + * The first reloadRequest defines the initial/baseline hash - + * it doesn't require a reload + */ + if (!(0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])('reloadRequest', prevState)) { + return; + } + if (reloadRequest.status === 200 && (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(['content', 'reloadHash'], reloadRequest) !== (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(['reloadRequest', 'content', 'reloadHash'], prevState)) { + // Check for CSS (!content.hard) or new package assets + if (reloadRequest.content.hard || !(0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(reloadRequest.content.packages.length, (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])([], ['reloadRequest', 'content', 'packages'], prevState).length) || !(0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(ramda__WEBPACK_IMPORTED_MODULE_10__["default"]), reloadRequest.content.packages), (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(ramda__WEBPACK_IMPORTED_MODULE_10__["default"]), (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])([], ['reloadRequest', 'content', 'packages'], prevState)))) { + // Look if it was a css file. + var was_css = false; + // eslint-disable-next-line prefer-const + var _iterator = _createForOfIteratorHelper(reloadRequest.content.files), + _step; + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var a = _step.value; + if (a.is_css) { + was_css = true; + var nodesToDisable = []; + + // Search for the old file by xpath. + var it = document.evaluate("//link[contains(@href, \"".concat(a.url, "\")]"), this._head); + var node = it.iterateNext(); + while (node) { + nodesToDisable.push(node); + node = it.iterateNext(); } - }); - return json; - })); - case 41: - logWarningOnce('Response is missing header: content-type: application/json'); - return _context.abrupt("return", dispatch({ - type: store, - payload: { - id, - status: res.status + (0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(function (n) { + return n.setAttribute('disabled', 'disabled'); + }, nodesToDisable); + if (a.modified > 0) { + var link = document.createElement('link'); + link.href = "".concat(a.url, "?m=").concat(a.modified); + link.type = 'text/css'; + link.rel = 'stylesheet'; + this._head.appendChild(link); + // Else the file was deleted. + } + } else { + // If there's another kind of file here do a hard reload. + was_css = false; + break; } - })); - case 45: - _context.prev = 45; - _context.t1 = _context["catch"](5); - message = 'Error from API call: ' + endpoint; - (0,_actions__WEBPACK_IMPORTED_MODULE_1__.handleAsyncError)(_context.t1, message, dispatch); - case 49: - case "end": - return _context.stop(); + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + if (!was_css) { + // Assets file have changed + // or a component lib has been added/removed - + // Must do a hard reload + window.location.reload(); + } + } else { + // Backend code changed - can do a soft reload in place + dispatch({ + type: 'RELOAD' + }); } - }, _callee, null, [[5, 45], [8, 14]]); - })); - return function (_x, _x2) { - return _ref.apply(this, arguments); - }; - }(); -} + } else if (this.state.intervalId !== null && reloadRequest.status === 500) { + if (this._retry > this.state.max_retry) { + this.clearInterval(); + // Integrate with dev tools ui?! + window.alert("Hot reloading is disabled after failing ".concat(this._retry, " times. ") + 'Please check your application for errors, then refresh the page.'); + } + this._retry++; + } + } + }, { + key: "componentDidMount", + value: function componentDidMount() { + var _this$props = this.props, + dispatch = _this$props.dispatch, + reloadRequest = _this$props.reloadRequest; + var _this$state = this.state, + disabled = _this$state.disabled, + interval = _this$state.interval; + if (!disabled && !this.state.intervalId) { + var intervalId = window.setInterval(function () { + // Prevent requests from piling up - reloading can take + // many seconds (10-30) and the interval is 3s by default + if (reloadRequest.status !== 'loading') { + dispatch((0,_actions_api__WEBPACK_IMPORTED_MODULE_3__["default"])('_reload-hash', 'GET', 'reloadRequest')); + } + }, interval); + this.setState({ + intervalId + }); + } + } + }, { + key: "componentWillUnmount", + value: function componentWillUnmount() { + if (!this.state.disabled && this.state.intervalId) { + this.clearInterval(); + } + } + }, { + key: "render", + value: function render() { + return null; + } + }], [{ + key: "getDerivedStateFromProps", + value: function getDerivedStateFromProps(props) { + /* + * Save the non-loading requests in the state in order to compare + * current hashes with previous hashes. + * Note that if there wasn't a "loading" state for the requests, + * then we could simply compare `props` with `prevProps` in + * `componentDidUpdate`. + */ + if (!(0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])(props.reloadRequest) && props.reloadRequest.status !== 'loading') { + return { + reloadRequest: props.reloadRequest + }; + } + return null; + } + }]); + return Reloader; +}((react__WEBPACK_IMPORTED_MODULE_0___default().Component)); +Reloader.defaultProps = {}; +Reloader.propTypes = { + id: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string), + config: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), + reloadRequest: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), + dispatch: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func), + interval: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().number) +}; +/* harmony default export */ __webpack_exports__["default"] = ((0,react_redux__WEBPACK_IMPORTED_MODULE_2__.connect)(function (state) { + return { + config: state.config, + reloadRequest: state.reloadRequest + }; +}, function (dispatch) { + return { + dispatch + }; +})(Reloader)); /***/ }), -/***/ "./src/actions/constants.js": -/*!**********************************!*\ - !*** ./src/actions/constants.js ***! - \**********************************/ +/***/ "./src/components/core/Toolbar.react.js": +/*!**********************************************!*\ + !*** ./src/components/core/Toolbar.react.js ***! + \**********************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ MAX_AUTH_RETRIES: function() { return /* binding */ MAX_AUTH_RETRIES; }, -/* harmony export */ getAction: function() { return /* binding */ getAction; } -/* harmony export */ }); -var actionList = { - ON_PROP_CHANGE: 1, - SET_REQUEST_QUEUE: 1, - SET_GRAPHS: 1, - SET_PATHS: 1, - SET_LAYOUT: 1, - SET_APP_LIFECYCLE: 1, - SET_CONFIG: 1, - ADD_HTTP_HEADERS: 1, - ON_ERROR: 1, - SET_HOOKS: 1 -}; -var getAction = function getAction(action) { - if (actionList[action]) { - return action; - } - throw new Error("".concat(action, " is not defined.")); +/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "prop-types"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _actions_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../actions/index.js */ "./src/actions/index.js"); +/* harmony import */ var _Toolbar_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Toolbar.css */ "./src/components/core/Toolbar.css"); + + + + + +function UnconnectedToolbar(props) { + var dispatch = props.dispatch, + history = props.history; + var undoLink = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("span", { + key: "undoLink", + className: "_dash-undo-redo-link", + onClick: function onClick() { + return dispatch(_actions_index_js__WEBPACK_IMPORTED_MODULE_3__.undo); + } + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { + className: "_dash-icon-undo" + }, "\u21BA"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { + className: "_dash-undo-redo-label" + }, "undo")); + var redoLink = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("span", { + key: "redoLink", + className: "_dash-undo-redo-link", + onClick: function onClick() { + return dispatch(_actions_index_js__WEBPACK_IMPORTED_MODULE_3__.redo); + } + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { + className: "_dash-icon-redo" + }, "\u21BB"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { + className: "_dash-undo-redo-label" + }, "redo")); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { + className: "_dash-undo-redo" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", null, history.past.length > 0 ? undoLink : null, history.future.length > 0 ? redoLink : null)); +} +UnconnectedToolbar.propTypes = { + history: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object), + dispatch: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func) }; -var MAX_AUTH_RETRIES = 1; +var Toolbar = (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(function (state) { + return { + history: state.history + }; +}, function (dispatch) { + return { + dispatch + }; +})(UnconnectedToolbar); +/* harmony default export */ __webpack_exports__["default"] = (Toolbar); /***/ }), -/***/ "./src/actions/dependencies.js": -/*!*************************************!*\ - !*** ./src/actions/dependencies.js ***! - \*************************************/ +/***/ "./src/components/error/CallbackGraph/CallbackGraphContainer.react.js": +/*!****************************************************************************!*\ + !*** ./src/components/error/CallbackGraph/CallbackGraphContainer.react.js ***! + \****************************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ addAllResolvedFromOutputs: function() { return /* binding */ addAllResolvedFromOutputs; }, -/* harmony export */ computeGraphs: function() { return /* binding */ computeGraphs; }, -/* harmony export */ getUnfilteredLayoutCallbacks: function() { return /* binding */ getUnfilteredLayoutCallbacks; }, -/* harmony export */ getWatchedKeys: function() { return /* binding */ getWatchedKeys; }, -/* harmony export */ idMatch: function() { return /* binding */ idMatch; }, -/* harmony export */ isMultiOutputProp: function() { return /* binding */ isMultiOutputProp; }, -/* harmony export */ isMultiValued: function() { return /* binding */ isMultiValued; }, -/* harmony export */ parseIfWildcard: function() { return /* binding */ parseIfWildcard; }, -/* harmony export */ splitIdAndProp: function() { return /* binding */ splitIdAndProp; }, -/* harmony export */ stringifyId: function() { return /* binding */ stringifyId; }, -/* harmony export */ validateCallbacksToLayout: function() { return /* binding */ validateCallbacksToLayout; } +/* harmony export */ CallbackGraphContainer: function() { return /* binding */ CallbackGraphContainer; } /* harmony export */ }); -/* harmony import */ var dependency_graph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! dependency-graph */ "./node_modules/dependency-graph/lib/dep_graph.js"); -/* harmony import */ var fast_isnumeric__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fast-isnumeric */ "./node_modules/fast-isnumeric/index.js"); -/* harmony import */ var fast_isnumeric__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fast_isnumeric__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var _dependencies_ts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./dependencies_ts */ "./src/actions/dependencies_ts.ts"); -/* harmony import */ var _paths__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./paths */ "./src/actions/paths.js"); -/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils */ "./src/actions/utils.js"); -/* harmony import */ var _registry__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../registry */ "./src/registry.js"); -function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } -function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } -function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } -function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } -function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "prop-types"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); +/* harmony import */ var cytoscape__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! cytoscape */ "./node_modules/cytoscape/dist/cytoscape.cjs.js"); +/* harmony import */ var cytoscape__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(cytoscape__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react_cytoscapejs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-cytoscapejs */ "./node_modules/react-cytoscapejs/dist/react-cytoscape.modern.js"); +/* harmony import */ var cytoscape_dagre__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! cytoscape-dagre */ "./node_modules/cytoscape-dagre/cytoscape-dagre.js"); +/* harmony import */ var cytoscape_dagre__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(cytoscape_dagre__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var cytoscape_fcose__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! cytoscape-fcose */ "./node_modules/cytoscape-fcose/cytoscape-fcose.js"); +/* harmony import */ var cytoscape_fcose__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(cytoscape_fcose__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var react_json_tree__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! react-json-tree */ "./node_modules/react-json-tree/lib/esm/index.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/values.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/keys.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/omit.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mergeRight.js"); +/* harmony import */ var _actions_paths__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../actions/paths */ "./src/actions/paths.js"); +/* harmony import */ var _actions_dependencies__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../actions/dependencies */ "./src/actions/dependencies.js"); +/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../actions */ "./src/actions/index.js"); +/* harmony import */ var _CallbackGraphContainer_css__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./CallbackGraphContainer.css */ "./src/components/error/CallbackGraph/CallbackGraphContainer.css"); +/* harmony import */ var _CallbackGraphContainerStylesheet__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./CallbackGraphContainerStylesheet */ "./src/components/error/CallbackGraph/CallbackGraphContainerStylesheet.js"); +/* harmony import */ var _CallbackGraphEffects__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./CallbackGraphEffects */ "./src/components/error/CallbackGraph/CallbackGraphEffects.js"); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } + @@ -4151,1793 +4991,1334 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } -/* - * If this update is for multiple outputs, then it has - * starting & trailing `..` and each propId pair is separated - * by `...`, e.g. - * "..output-1.value...output-2.value...output-3.value...output-4.value.." - */ -var isMultiOutputProp = function isMultiOutputProp(idAndProp) { - return idAndProp.startsWith('..'); -}; -var ALL = { - wild: 'ALL', - multi: 1 -}; -var MATCH = { - wild: 'MATCH' -}; -var ALLSMALLER = { - wild: 'ALLSMALLER', - multi: 1, - expand: 1 -}; -var wildcards = { - ALL, - MATCH, - ALLSMALLER -}; -var allowedWildcards = { - Output: { - ALL, - MATCH - }, - Input: wildcards, - State: wildcards -}; -var wildcardValTypes = ['string', 'number', 'boolean']; -var idInvalidChars = ['.', '{']; -/* - * If this ID is a wildcard, it is a stringified JSON object - * the "{" character is disallowed from regular string IDs - */ -var isWildcardId = function isWildcardId(idStr) { - return idStr.startsWith('{'); -}; -/* - * Turn stringified wildcard IDs into objects. - * Wildcards are encoded as single-item arrays containing the wildcard name - * as a string. - */ -function parseWildcardId(idStr) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_2__.map)(function (val) { - return Array.isArray(val) && wildcards[val[0]] || val; - }, JSON.parse(idStr)); -} -/* - * If this update is for multiple outputs, then it has - * starting & trailing `..` and each propId pair is separated - * by `...`, e.g. - * "..output-1.value...output-2.value...output-3.value...output-4.value.." - */ -function parseMultipleOutputs(outputIdAndProp) { - return outputIdAndProp.substr(2, outputIdAndProp.length - 4).split('...'); -} -function splitIdAndProp(idAndProp) { - // since wildcard ids can have . in them but props can't, - // look for the last . in the string and split there - var dotPos = idAndProp.lastIndexOf('.'); - var idStr = idAndProp.substr(0, dotPos); - return { - id: parseIfWildcard(idStr), - property: idAndProp.substr(dotPos + 1) - }; -} -/* - * Check if this ID is a stringified object, and if so parse it to that object - */ -function parseIfWildcard(idStr) { - return isWildcardId(idStr) ? parseWildcardId(idStr) : idStr; -} + + +cytoscape__WEBPACK_IMPORTED_MODULE_3___default().use((cytoscape_dagre__WEBPACK_IMPORTED_MODULE_5___default())); +cytoscape__WEBPACK_IMPORTED_MODULE_3___default().use((cytoscape_fcose__WEBPACK_IMPORTED_MODULE_6___default())); /* - * JSON.stringify - for the object form - but ensuring keys are sorted + * Generates all the elements (nodes, edges) for the dependency graph. */ -function stringifyId(id) { - if (typeof id !== 'object') { - return id; - } - var stringifyVal = function stringifyVal(v) { - return v && v.wild || JSON.stringify(v); - }; - var parts = Object.keys(id).sort().map(function (k) { - return JSON.stringify(k) + ':' + stringifyVal(id[k]); - }); - return '{' + parts.join(',') + '}'; -} +function generateElements(graphs, profile, extraLinks) { + var consumed = []; + var elements = []; + var structure = {}; + function recordNode(id, rawProperty) { + var property = rawProperty.split('@')[0]; + var idStr = (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_8__.stringifyId)(id); + var idType = typeof id === 'object' ? 'wildcard' : 'component'; -/* - * id dict values can be numbers, strings, and booleans. - * We need a definite ordering that will work across types, - * even if sane users would not mix types. - * - numeric strings are treated as numbers - * - booleans come after numbers, before strings. false, then true. - * - non-numeric strings come last - */ -function idValSort(a, b) { - var bIsNumeric = fast_isnumeric__WEBPACK_IMPORTED_MODULE_1___default()(b); - if (fast_isnumeric__WEBPACK_IMPORTED_MODULE_1___default()(a)) { - if (bIsNumeric) { - var aN = Number(a); - var bN = Number(b); - return aN > bN ? 1 : aN < bN ? -1 : 0; + // dagre layout has problems with eg `width` property - so prepend an X + var parentId = idStr; + var childId = "".concat(parentId, ".X").concat(property); + if (!consumed.includes(parentId)) { + consumed.push(parentId); + elements.push({ + data: { + id: parentId, + label: idStr, + type: idType + } + }); + structure[parentId] = []; } - return -1; - } - if (bIsNumeric) { - return 1; - } - var aIsBool = typeof a === 'boolean'; - if (aIsBool !== (typeof b === 'boolean')) { - return aIsBool ? -1 : 1; - } - return a > b ? 1 : a < b ? -1 : 0; -} - -/* - * Provide a value known to be before or after v, according to idValSort - */ -var valBefore = function valBefore(v) { - return fast_isnumeric__WEBPACK_IMPORTED_MODULE_1___default()(v) ? v - 1 : 0; -}; -var valAfter = function valAfter(v) { - return typeof v === 'string' ? v + 'z' : 'z'; -}; -function addMap(depMap, id, prop, dependency) { - var idMap = depMap[id] = depMap[id] || {}; - var callbacks = idMap[prop] = idMap[prop] || []; - callbacks.push(dependency); -} -function addPattern(depMap, idSpec, prop, dependency) { - var keys = Object.keys(idSpec).sort(); - var keyStr = keys.join(','); - var values = (0,ramda__WEBPACK_IMPORTED_MODULE_2__.props)(keys, idSpec); - var keyCallbacks = depMap[keyStr] = depMap[keyStr] || {}; - var propCallbacks = keyCallbacks[prop] = keyCallbacks[prop] || []; - var valMatch = false; - for (var i = 0; i < propCallbacks.length; i++) { - if ((0,ramda__WEBPACK_IMPORTED_MODULE_2__.equals)(values, propCallbacks[i].values)) { - valMatch = propCallbacks[i]; - break; + if (!consumed.includes(childId)) { + consumed.push(childId); + elements.push({ + data: { + id: childId, + label: property, + parent: parentId, + type: 'property' + } + }); + structure[parentId].push(childId); } + return childId; } - if (!valMatch) { - valMatch = { - keys, - values, - callbacks: [] - }; - propCallbacks.push(valMatch); - } - valMatch.callbacks.push(dependency); -} -function validateDependencies(parsedDependencies, dispatchError) { - var outStrs = {}; - var outObjs = []; - parsedDependencies.forEach(function (dep) { - var inputs = dep.inputs, - outputs = dep.outputs, - state = dep.state; - var hasOutputs = true; - if (outputs.length === 1 && !outputs[0].id && !outputs[0].property) { - hasOutputs = false; - dispatchError('A callback is missing Outputs', ['Please provide an output for this callback:', JSON.stringify(dep, null, 2)]); - } - var head = 'In the callback for output(s):\n ' + outputs.map(_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.combineIdAndProp).join('\n '); - if (!inputs.length) { - dispatchError('A callback is missing Inputs', [head, 'there are no `Input` elements.', 'Without `Input` elements, it will never get called.', '', 'Subscribing to `Input` components will cause the', 'callback to be called whenever their values change.']); - } - var spec = [[outputs, 'Output'], [inputs, 'Input'], [state, 'State']]; - spec.forEach(function (_ref) { - var _ref2 = _slicedToArray(_ref, 2), - args = _ref2[0], - cls = _ref2[1]; - if (cls === 'Output' && !hasOutputs) { - // just a quirk of how we pass & parse outputs - if you don't - // provide one, it looks like a single blank output. This is - // actually useful for graceful failure, so we work around it. - return; + function recordEdge(source, target, type) { + elements.push({ + data: { + source: source, + target: target, + type: type } - if (!Array.isArray(args)) { - dispatchError("Callback ".concat(cls, "(s) must be an Array"), [head, "For ".concat(cls, "(s) we found:"), JSON.stringify(args), 'but we expected an Array.']); + }); + } + (graphs.callbacks || []).forEach(function (callback, i) { + var cb = "__dash_callback__.".concat(callback.output); + var cbProfile = profile.callbacks[callback.output] || {}; + var count = cbProfile.count || 0; + var time = cbProfile.total || 0; + elements.push({ + data: { + id: cb, + label: "callback.".concat(i), + type: 'callback', + mode: callback.clientside_function ? 'client' : 'server', + count: count, + time: count > 0 ? Math.round(time / count) : 0, + loadingSet: Date.now(), + errorSet: Date.now() } - args.forEach(function (idProp, i) { - validateArg(idProp, head, cls, i, dispatchError); - }); }); - findDuplicateOutputs(outputs, head, dispatchError, outStrs, outObjs); - findMismatchedWildcards(outputs, inputs, state, head, dispatchError); + callback.outputs.map(function (_ref) { + var id = _ref.id, + property = _ref.property; + var nodeId = recordNode(id, property); + recordEdge(cb, nodeId, 'output'); + }); + callback.inputs.map(function (_ref2) { + var id = _ref2.id, + property = _ref2.property; + var nodeId = recordNode(id, property); + recordEdge(nodeId, cb, 'input'); + }); + callback.state.map(function (_ref3) { + var id = _ref3.id, + property = _ref3.property; + var nodeId = recordNode(id, property); + recordEdge(nodeId, cb, 'state'); + }); }); + + // pull together props in the same component + if (extraLinks) { + (0,ramda__WEBPACK_IMPORTED_MODULE_13__["default"])(structure).forEach(function (childIds) { + childIds.forEach(function (childFrom) { + childIds.forEach(function (childTo) { + if (childFrom !== childTo) { + recordEdge(childFrom, childTo, 'hidden'); + } + }); + }); + }); + } + return elements; } -function validateArg(_ref3, head, cls, i, dispatchError) { - var id = _ref3.id, - property = _ref3.property; - if (typeof property !== 'string' || !property) { - dispatchError('Callback property error', [head, "".concat(cls, "[").concat(i, "].property = ").concat(JSON.stringify(property)), 'but we expected `property` to be a non-empty string.']); +function reduceStatus(status) { + if ((0,ramda__WEBPACK_IMPORTED_MODULE_14__["default"])(status).length === 2) { + return status.latest; } - if (typeof id === 'object') { - if ((0,ramda__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(id)) { - dispatchError('Callback item missing ID', [head, "".concat(cls, "[").concat(i, "].id = {}"), 'Every item linked to a callback needs an ID']); - } - (0,ramda__WEBPACK_IMPORTED_MODULE_2__.forEachObjIndexed)(function (v, k) { - if (!k) { - dispatchError('Callback wildcard ID error', [head, "".concat(cls, "[").concat(i, "].id has key \"").concat(k, "\""), 'Keys must be non-empty strings.']); - } - if (typeof v === 'object' && v.wild) { - if (allowedWildcards[cls][v.wild] !== v) { - dispatchError('Callback wildcard ID error', [head, "".concat(cls, "[").concat(i, "].id[\"").concat(k, "\"] = ").concat(v.wild), "Allowed wildcards for ".concat(cls, "s are:"), (0,ramda__WEBPACK_IMPORTED_MODULE_2__.keys)(allowedWildcards[cls]).join(', ')]); - } - } else if (!(0,ramda__WEBPACK_IMPORTED_MODULE_2__.includes)(typeof v, wildcardValTypes)) { - dispatchError('Callback wildcard ID error', [head, "".concat(cls, "[").concat(i, "].id[\"").concat(k, "\"] = ").concat(JSON.stringify(v)), 'Wildcard callback ID values must be either wildcards', 'or constants of one of these types:', wildcardValTypes.join(', ')]); - } - }, id); - } else if (typeof id === 'string') { - if (!id) { - dispatchError('Callback item missing ID', [head, "".concat(cls, "[").concat(i, "].id = \"").concat(id, "\""), 'Every item linked to a callback needs an ID']); - } - var invalidChars = idInvalidChars.filter(function (c) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_2__.includes)(c, id); - }); - if (invalidChars.length) { - dispatchError('Callback invalid ID string', [head, "".concat(cls, "[").concat(i, "].id = '").concat(id, "'"), "characters '".concat(invalidChars.join("', '"), "' are not allowed.")]); + return status; +} +function flattenOutputs(res) { + var outputs = {}; + for (var idStr in res) { + for (var prop in res[idStr]) { + outputs[idStr + '.' + prop] = res[idStr][prop]; } - } else { - dispatchError('Callback ID type error', [head, "".concat(cls, "[").concat(i, "].id = ").concat(JSON.stringify(id)), 'IDs must be strings or wildcard-compatible objects.']); } + return outputs; } -function findDuplicateOutputs(outputs, head, dispatchError, outStrs, outObjs) { - var newOutputStrs = {}; - var newOutputObjs = []; - outputs.forEach(function (_ref4, i) { - var id = _ref4.id, - property = _ref4.property; - if (typeof id === 'string') { - var idProp = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.combineIdAndProp)({ - id, - property - }); - if (newOutputStrs[idProp]) { - dispatchError('Duplicate callback Outputs', [head, "Output ".concat(i, " (").concat(idProp, ") is already used by this callback.")]); - } else if (outStrs[idProp]) { - dispatchError('Duplicate callback outputs', [head, "Output ".concat(i, " (").concat(idProp, ") is already in use."), 'To resolve this, set `allow_duplicate=True` on', 'duplicate outputs, or combine the outputs into', 'one callback function, distinguishing the trigger', 'by using `dash.callback_context` if necessary.']); - } else { - newOutputStrs[idProp] = 1; - } +function flattenInputs(inArray, final) { + (inArray || []).forEach(function (inItem) { + if (Array.isArray(inItem)) { + flattenInputs(inItem, final); } else { - var idObj = { - id, - property - }; - var selfOverlap = wildcardOverlap(idObj, newOutputObjs); - var otherOverlap = selfOverlap || wildcardOverlap(idObj, outObjs); - if (selfOverlap || otherOverlap) { - var _idProp = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.combineIdAndProp)(idObj); - var idProp2 = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.combineIdAndProp)(selfOverlap || otherOverlap); - dispatchError('Overlapping wildcard callback outputs', [head, "Output ".concat(i, " (").concat(_idProp, ")"), "overlaps another output (".concat(idProp2, ")"), "used in ".concat(selfOverlap ? 'this' : 'a different', " callback.")]); - } else { - newOutputObjs.push(idObj); - } + var id = inItem.id, + property = inItem.property, + value = inItem.value; + final[(0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_8__.stringifyId)(id) + '.' + property] = value; } }); - (0,ramda__WEBPACK_IMPORTED_MODULE_2__.keys)(newOutputStrs).forEach(function (k) { - outStrs[k] = 1; + return final; +} +function cleanOutputId(outputId) { + return outputId.replace(/(^\.\.|\.\.$)/g, '').split('...').reduce(function (agg, next) { + return agg.concat(next.replace(/(.*\..*)(@.+)$/, function (a, b) { + return b + ' (Duplicate)'; + })); + }, []).join('...'); +} + +// len('__dash_callback__.') +var cbPrefixLen = 18; +var dagreLayout = { + name: 'dagre', + padding: 10, + ranker: 'tight-tree' +}; +var forceLayout = { + name: 'fcose', + padding: 10, + animate: false +}; +var layouts = { + 'top-down': _objectSpread(_objectSpread({}, dagreLayout), {}, { + spacingFactor: 0.8 + }), + 'left-right': _objectSpread(_objectSpread({}, dagreLayout), {}, { + nodeSep: 0, + rankSep: 80, + rankDir: 'LR' + }), + force: forceLayout, + 'force-loose': forceLayout +}; +function CallbackGraph() { + // Grab items from the redux store. + var paths = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(function (state) { + return state.paths; }); - newOutputObjs.forEach(function (idObj) { - outObjs.push(idObj); + var layout = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(function (state) { + return state.layout; }); -} -function checkInOutOverlap(out, inputs) { - var outId = out.id, - outProp = out.property; - return inputs.some(function (in_) { - var inId = in_.id, - inProp = in_.property; - if (outProp !== inProp || typeof outId !== typeof inId) { - return false; - } - if (typeof outId === 'string') { - if (outId === inId) { - return true; - } - } else if (wildcardOverlap(in_, [out])) { - return true; - } - return false; + var graphs = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(function (state) { + return state.graphs; }); -} -function findMismatchedWildcards(outputs, inputs, state, head, dispatchError) { - var _findWildcardKeys = findWildcardKeys(outputs[0].id), - out0MatchKeys = _findWildcardKeys.matchKeys; - outputs.forEach(function (out, i) { - if (i && !(0,ramda__WEBPACK_IMPORTED_MODULE_2__.equals)(findWildcardKeys(out.id).matchKeys, out0MatchKeys)) { - dispatchError('Mismatched `MATCH` wildcards across `Output`s', [head, "Output ".concat(i, " (").concat((0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.combineIdAndProp)(out), ")"), 'does not have MATCH wildcards on the same keys as', "Output 0 (".concat((0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.combineIdAndProp)(outputs[0]), ")."), 'MATCH wildcards must be on the same keys for all Outputs.', 'ALL wildcards need not match, only MATCH.']); - } + var profile = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(function (state) { + return state.profile; }); - [[inputs, 'Input'], [state, 'State']].forEach(function (_ref5) { - var _ref6 = _slicedToArray(_ref5, 2), - args = _ref6[0], - cls = _ref6[1]; - args.forEach(function (arg, i) { - var _findWildcardKeys2 = findWildcardKeys(arg.id), - matchKeys = _findWildcardKeys2.matchKeys, - allsmallerKeys = _findWildcardKeys2.allsmallerKeys; - var allWildcardKeys = matchKeys.concat(allsmallerKeys); - var diff = (0,ramda__WEBPACK_IMPORTED_MODULE_2__.difference)(allWildcardKeys, out0MatchKeys); - if (diff.length) { - diff.sort(); - dispatchError('`Input` / `State` wildcards not in `Output`s', [head, "".concat(cls, " ").concat(i, " (").concat((0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.combineIdAndProp)(arg), ")"), "has MATCH or ALLSMALLER on key(s) ".concat(diff.join(', ')), "where Output 0 (".concat((0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.combineIdAndProp)(outputs[0]), ")"), 'does not have a MATCH wildcard. Inputs and State do not', 'need every MATCH from the Output(s), but they cannot have', 'extras beyond the Output(s).']); - } - }); + var changed = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(function (state) { + return state.changed; }); -} -var matchWildKeys = function matchWildKeys(_ref7) { - var _ref8 = _slicedToArray(_ref7, 2), - a = _ref8[0], - b = _ref8[1]; - var aWild = a && a.wild; - var bWild = b && b.wild; - if (aWild && bWild) { - // Every wildcard combination overlaps except MATCH<->ALLSMALLER - return !(a === MATCH && b === ALLSMALLER || a === ALLSMALLER && b === MATCH); - } - return a === b || aWild || bWild; -}; -function wildcardOverlap(_ref9, objs) { - var id = _ref9.id, - property = _ref9.property; - var idKeys = (0,ramda__WEBPACK_IMPORTED_MODULE_2__.keys)(id).sort(); - var idVals = (0,ramda__WEBPACK_IMPORTED_MODULE_2__.props)(idKeys, id); - var _iterator = _createForOfIteratorHelper(objs), - _step; - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var obj = _step.value; - var id2 = obj.id, - property2 = obj.property; - if (property2 === property && typeof id2 !== 'string' && (0,ramda__WEBPACK_IMPORTED_MODULE_2__.equals)((0,ramda__WEBPACK_IMPORTED_MODULE_2__.keys)(id2).sort(), idKeys) && (0,ramda__WEBPACK_IMPORTED_MODULE_2__.all)(matchWildKeys, (0,ramda__WEBPACK_IMPORTED_MODULE_2__.zip)(idVals, (0,ramda__WEBPACK_IMPORTED_MODULE_2__.props)(idKeys, id2)))) { - return obj; - } + var lifecycleState = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(function (state) { + return state.appLifecycle; + }); + + // Keep track of cytoscape reference and user selected items. + var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), + _useState2 = _slicedToArray(_useState, 2), + selected = _useState2[0], + setSelected = _useState2[1]; + var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), + _useState4 = _slicedToArray(_useState3, 2), + cytoscape = _useState4[0], + setCytoscape = _useState4[1]; + var graphLayout = profile.graphLayout; + var chosenType = graphLayout === null || graphLayout === void 0 ? void 0 : graphLayout._chosenType; + var layoutSelector = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null); + var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(chosenType || 'top-down'), + _useState6 = _slicedToArray(_useState5, 2), + layoutType = _useState6[0], + setLayoutType = _useState6[1]; + + // Generate and memoize the elements. + var elements = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function () { + return generateElements(graphs, profile, layoutType === 'force'); + }, [graphs, layoutType]); + + // Custom hook to make sure cytoscape is loaded. + var useCytoscapeEffect = function useCytoscapeEffect(effect, condition) { + (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { + return cytoscape && effect(cytoscape) || undefined; + }, condition); + }; + function getComponent(id) { + // for now ignore pattern-matching IDs + // to do better we may need to store the *actual* IDs used for each + // callback invocation, since they need not match what's on the page now. + if (id.charAt(0) === '{') { + hasPatterns = true; + return undefined; } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); + var idPath = (0,_actions_paths__WEBPACK_IMPORTED_MODULE_7__.getPath)(paths, id); + return idPath ? (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])(idPath, layout) : undefined; } - return false; -} -function validateCallbacksToLayout(state_, dispatchError) { - var config = state_.config, - graphs = state_.graphs, - layout_ = state_.layout, - paths_ = state_.paths; - var validateIds = !config.suppress_callback_exceptions; - var layout, paths; - if (validateIds && config.validation_layout) { - layout = config.validation_layout; - paths = (0,_paths__WEBPACK_IMPORTED_MODULE_4__.computePaths)(layout, [], null, paths_.events); - } else { - layout = layout_; - paths = paths_; - } - var outputMap = graphs.outputMap, - inputMap = graphs.inputMap, - outputPatterns = graphs.outputPatterns, - inputPatterns = graphs.inputPatterns; - function tail(callbacks) { - return 'This ID was used in the callback(s) for Output(s):\n ' + callbacks.map(function (_ref10) { - var outputs = _ref10.outputs; - return outputs.map(_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.combineIdAndProp).join(', '); - }).join('\n '); + function getPropValue(data) { + var parent = getComponent(data.parent); + return parent ? parent.props[data.label] : undefined; } - function missingId(id, cls, callbacks) { - dispatchError('ID not found in layout', ["Attempting to connect a callback ".concat(cls, " item to component:"), " \"".concat(stringifyId(id), "\""), 'but no components with that id exist in the layout.', '', 'If you are assigning callbacks to components that are', 'generated by other callbacks (and therefore not in the', 'initial layout), you can suppress this exception by setting', '`suppress_callback_exceptions=True`.', tail(callbacks)]); + function setPresetLayout(_ref4) { + var _layoutSelector$curre; + var cy = _ref4.cy; + var positions = {}; + cy.nodes().each(function (n) { + positions[n.id()] = n.position(); + }); + + // Hack! We're mutating the redux store directly here, rather than + // dispatching an action, because we don't want this to trigger a + // rerender, we just want the layout to persist when the callback graph + // is rerendered - either because there's new profile information to + // display or because the graph was closed and reopened. The latter is + // the reason we're not using component state to store the layout. + profile.graphLayout = { + name: 'preset', + fit: false, + positions, + zoom: cy.zoom(), + pan: cy.pan(), + _chosenType: (_layoutSelector$curre = layoutSelector.current) === null || _layoutSelector$curre === void 0 ? void 0 : _layoutSelector$curre.value + }; } - function validateProp(id, idPath, rawProp, cls, callbacks) { - var prop = rawProp.split('@')[0]; - var component = (0,ramda__WEBPACK_IMPORTED_MODULE_2__.path)(idPath, layout); - var element = _registry__WEBPACK_IMPORTED_MODULE_6__["default"].resolve(component); - // note: Flow components do not have propTypes, so we can't validate. - if (element && element.propTypes && !element.propTypes[prop]) { - // look for wildcard props (ie data-* etc) - for (var propName in element.propTypes) { - var last = propName.length - 1; - if (propName.charAt(last) === '*' && prop.substr(0, last) === propName.substr(0, last)) { - return; - } + // Adds callbacks once cyctoscape is initialized. + useCytoscapeEffect(function (cy) { + cytoscape.on('tap', 'node', function (e) { + return setSelected(e.target); + }); + cytoscape.on('tap', function (e) { + if (e.target === cy) { + setSelected(null); } - var type = component.type, - namespace = component.namespace; - dispatchError('Invalid prop for this component', ["Property \"".concat(prop, "\" was used with component ID:"), " ".concat(JSON.stringify(id)), "in one of the ".concat(cls, " items of a callback."), "This ID is assigned to a ".concat(namespace, ".").concat(type, " component"), 'in the layout, which does not support this property.', tail(callbacks)]); - } - } - function validateIdPatternProp(id, property, cls, callbacks) { - (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.resolveDeps)()(paths)({ - id, - property - }).forEach(function (dep) { - var idResolved = dep.id, - idPath = dep.path; - validateProp(idResolved, idPath, property, cls, callbacks); }); + cytoscape.on('zoom', setPresetLayout); + cytoscape.on('pan', setPresetLayout); + cytoscape.nodes().on('position', setPresetLayout); + }, [cytoscape]); + + // Set node classes on selected. + useCytoscapeEffect(function (cy) { + return selected && (0,_CallbackGraphEffects__WEBPACK_IMPORTED_MODULE_12__.updateSelectedNode)(cy, selected.data().id); + }, [selected]); + + // Flash classes when props change. Uses changed as a trigger. Also + // flash all input edges originating from this node and highlight + // the subtree that contains the selected node. + useCytoscapeEffect(function (cy) { + return changed && (0,_CallbackGraphEffects__WEBPACK_IMPORTED_MODULE_12__.updateChangedProps)(cy, changed.id, changed.props); + }, [changed]); + + // Update callbacks from profiling information. + useCytoscapeEffect(function (cy) { + return profile.updated.forEach(function (cb) { + return (0,_CallbackGraphEffects__WEBPACK_IMPORTED_MODULE_12__.updateCallback)(cy, cb, profile.callbacks[cb]); + }); + }, [profile.updated]); + if (lifecycleState !== 'HYDRATED') { + // If we get here too early - most likely during hot reloading - then + // we need to bail out and wait for the full state to be available + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-callback-dag--container" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-callback-dag--message" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "Waiting for app to be ready..."))); } - var callbackIdsCheckedForState = {}; - function validateState(callback) { - var state = callback.state, - output = callback.output; - // ensure we don't check the same callback for state multiple times - if (callbackIdsCheckedForState[output]) { - return; - } - callbackIdsCheckedForState[output] = 1; - var cls = 'State'; - state.forEach(function (_ref11) { - var id = _ref11.id, - property = _ref11.property; - if (typeof id === 'string') { - var idPath = (0,_paths__WEBPACK_IMPORTED_MODULE_4__.getPath)(paths, id); - if (!idPath) { - if (validateIds) { - missingId(id, cls, [callback]); - } - } else { - validateProp(id, idPath, property, cls, [callback]); - } - } - // Only validate props for State object ids that we don't need to - // resolve them to specific inputs or outputs - else if (!(0,ramda__WEBPACK_IMPORTED_MODULE_2__.intersection)([MATCH, ALLSMALLER], (0,ramda__WEBPACK_IMPORTED_MODULE_2__.values)(id)).length) { - validateIdPatternProp(id, property, cls, [callback]); - } - }); - } - function validateMap(map, cls, doState) { - for (var id in map) { - var idProps = map[id]; - var idPath = (0,_paths__WEBPACK_IMPORTED_MODULE_4__.getPath)(paths, id); - if (!idPath) { - if (validateIds) { - missingId(id, cls, (0,ramda__WEBPACK_IMPORTED_MODULE_2__.flatten)((0,ramda__WEBPACK_IMPORTED_MODULE_2__.values)(idProps))); + // FIXME: Move to a new component? + // Generate the element introspection data. + var elementName = ''; + var elementInfo = {}; + var hasPatterns = false; + if (selected) { + var data = selected.data(); + switch (data.type) { + case 'component': + { + var _getComponent; + var rest = (0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(['id'], (_getComponent = getComponent(data.id)) === null || _getComponent === void 0 ? void 0 : _getComponent.props); + elementInfo = rest; + elementName = data.id; + break; } - } else { - for (var property in idProps) { - var callbacks = idProps[property]; - validateProp(id, idPath, property, cls, callbacks); - if (doState) { - // It would be redundant to check state on both inputs - // and outputs - so only set doState for outputs. - callbacks.forEach(validateState); - } + case 'property': + { + elementName = data.parent; + elementInfo[data.label] = getPropValue(data); + break; } - } - } - } - validateMap(outputMap, 'Output', true); - validateMap(inputMap, 'Input'); - function validatePatterns(patterns, cls, doState) { - for (var keyStr in patterns) { - var keyPatterns = patterns[keyStr]; - var _loop = function _loop(property) { - keyPatterns[property].forEach(function (_ref12) { - var keys = _ref12.keys, - values = _ref12.values, - callbacks = _ref12.callbacks; - var id = (0,ramda__WEBPACK_IMPORTED_MODULE_2__.zipObj)(keys, values); - validateIdPatternProp(id, property, cls, callbacks); - if (doState) { - callbacks.forEach(validateState); - } - }); - }; - for (var property in keyPatterns) { - _loop(property); - } - } - } - validatePatterns(outputPatterns, 'Output', true); - validatePatterns(inputPatterns, 'Input'); -} -function computeGraphs(dependencies, dispatchError) { - // multiGraph is just for finding circular deps - var multiGraph = new dependency_graph__WEBPACK_IMPORTED_MODULE_0__.DepGraph(); - var wildcardPlaceholders = {}; - var fixIds = (0,ramda__WEBPACK_IMPORTED_MODULE_2__.map)((0,ramda__WEBPACK_IMPORTED_MODULE_2__.evolve)({ - id: parseIfWildcard - })); - var parsedDependencies = (0,ramda__WEBPACK_IMPORTED_MODULE_2__.map)(function (dep) { - var output = dep.output; - var out = (0,ramda__WEBPACK_IMPORTED_MODULE_2__.evolve)({ - inputs: fixIds, - state: fixIds - }, dep); - out.outputs = (0,ramda__WEBPACK_IMPORTED_MODULE_2__.map)(function (outi) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_2__.assoc)('out', true, splitIdAndProp(outi)); - }, isMultiOutputProp(output) ? parseMultipleOutputs(output) : [output]); - return out; - }, dependencies); - var hasError = false; - var wrappedDE = function wrappedDE(message, lines) { - hasError = true; - dispatchError(message, lines); - }; - validateDependencies(parsedDependencies, wrappedDE); - /* - * For regular ids, outputMap and inputMap are: - * {[id]: {[prop]: [callback, ...]}} - * where callbacks are the matching specs from the original - * dependenciesRequest, but with outputs parsed to look like inputs, - * and a list matchKeys added if the outputs have MATCH wildcards. - * For outputMap there should only ever be one callback per id/prop - * but for inputMap there may be many. - * - * For wildcard ids, outputPatterns and inputPatterns are: - * { - * [keystr]: { - * [prop]: [ - * {keys: [...], values: [...], callbacks: [callback, ...]}, - * {...} - * ] - * } - * } - * keystr is a stringified ordered list of keys in the id - * keys is the same ordered list (just copied for convenience) - * values is an array of explicit or wildcard values for each key in keys - */ - var outputMap = {}; - var inputMap = {}; - var outputPatterns = {}; - var inputPatterns = {}; - var finalGraphs = { - MultiGraph: multiGraph, - outputMap, - inputMap, - outputPatterns, - inputPatterns, - callbacks: parsedDependencies - }; - if (hasError) { - // leave the graphs empty if we found an error, so we don't try to - // execute the broken callbacks. - return finalGraphs; - } - parsedDependencies.forEach(function (dependency) { - var outputs = dependency.outputs, - inputs = dependency.inputs; - outputs.concat(inputs).forEach(function (item) { - var id = item.id; - if (typeof id === 'object') { - (0,ramda__WEBPACK_IMPORTED_MODULE_2__.forEachObjIndexed)(function (val, key) { - if (!wildcardPlaceholders[key]) { - wildcardPlaceholders[key] = { - exact: [], - expand: 0 + // callback + default: + { + elementInfo.type = data.mode; + + // Remove uid and set profile. + var callbackOutputId = data.id.slice(cbPrefixLen); + elementName = cleanOutputId(callbackOutputId); + var cbProfile = profile.callbacks[callbackOutputId]; + if (cbProfile) { + var count = cbProfile.count, + status = cbProfile.status, + network = cbProfile.network, + resources = cbProfile.resources, + total = cbProfile.total, + compute = cbProfile.compute, + result = cbProfile.result, + inputs = cbProfile.inputs, + state = cbProfile.state; + var avg = function avg(v) { + return Math.round(v / (count || 1)); }; - } - var keyPlaceholders = wildcardPlaceholders[key]; - if (val && val.wild) { - if (val.expand) { - keyPlaceholders.expand += 1; + elementInfo['call count'] = count; + elementInfo.status = reduceStatus(status); + var timing = elementInfo['time (avg milliseconds)'] = { + total: avg(total), + compute: avg(compute) + }; + if (data.mode === 'server') { + timing.network = avg(network.time); + elementInfo['data transfer (avg bytes)'] = { + download: avg(network.download), + upload: avg(network.upload) + }; } - } else if (keyPlaceholders.exact.indexOf(val) === -1) { - keyPlaceholders.exact.push(val); - } - }, id); - } - }); - }); - (0,ramda__WEBPACK_IMPORTED_MODULE_2__.forEachObjIndexed)(function (keyPlaceholders) { - var exact = keyPlaceholders.exact, - expand = keyPlaceholders.expand; - var vals = exact.slice().sort(idValSort); - if (expand) { - for (var i = 0; i < expand; i++) { - if (exact.length) { - vals.splice(0, 0, [valBefore(vals[0])]); - vals.push(valAfter(vals[vals.length - 1])); - } else { - vals.push(i); - } - } - } else if (!exact.length) { - // only MATCH/ALL - still need a value - vals.push(0); - } - keyPlaceholders.vals = vals; - }, wildcardPlaceholders); - function makeAllIds(idSpec, outIdFinal) { - var idList = [{}]; - (0,ramda__WEBPACK_IMPORTED_MODULE_2__.forEachObjIndexed)(function (val, key) { - var testVals = wildcardPlaceholders[key].vals; - var outValIndex = testVals.indexOf(outIdFinal[key]); - var newVals = [val]; - if (val && val.wild) { - if (val === ALLSMALLER) { - if (outValIndex > 0) { - newVals = testVals.slice(0, outValIndex); + for (var key in resources) { + timing['user: ' + key] = avg(resources[key]); + } + elementInfo.outputs = flattenOutputs(result); + elementInfo.inputs = flattenInputs(inputs, {}); + elementInfo.state = flattenInputs(state, {}); } else { - // no smaller items - delete all outputs. - newVals = []; + elementInfo['call count'] = 0; } - } else { - // MATCH or ALL - // MATCH *is* ALL for outputs, ie we don't already have a - // value specified in `outIdFinal` - newVals = outValIndex === -1 || val === ALL ? testVals : [outIdFinal[key]]; } - } - // replicates everything in idList once for each item in - // newVals, attaching each value at key. - idList = (0,ramda__WEBPACK_IMPORTED_MODULE_2__.ap)((0,ramda__WEBPACK_IMPORTED_MODULE_2__.ap)([(0,ramda__WEBPACK_IMPORTED_MODULE_2__.assoc)(key)], newVals), idList); - }, idSpec); - return idList; - } - - /* multiGraph is used only for testing circularity - * - * Each component+property that is used as an input or output is added as a node - * to a directed graph with a dependency from each input to each output. The - * function triggerDefaultState in index.js then checks this graph for circularity. - * - * In order to allow the same component+property to be both an input and output - * of the same callback, a two pass approach is used. - * - * In the first pass, the graph is built up normally with the exception that - * in cases where an output is also an input to the same callback a special - * "output" node is added and the dependencies target this output node instead. - * For example, if `slider.value` is both an input and an output, then the a new - * node `slider.value__output` will be added with a dependency from `slider.value` - * to `slider.value__output`. Splitting the input and output into separate nodes - * removes the circularity. - * - * In order to still detect other forms of circularity, it is necessary to do a - * second pass and add the new output nodes as a dependency in any *other* callbacks - * where the original node was an input. Continuing the example, any other callback - * that had `slider.value` as an input dependency also needs to have - * `slider.value__output` as a dependency. To make this efficient, all the inputs - * and outputs for each callback are stored during the first pass. - */ - - var outputTag = '__output'; - var duplicateOutputs = []; - var cbIn = []; - var cbOut = []; - function addInputToMulti(inIdProp, outIdProp) { - var firstPass = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; - multiGraph.addNode(inIdProp); - multiGraph.addDependency(inIdProp, outIdProp); - // only store callback inputs and outputs during the first pass - if (firstPass) { - cbIn[cbIn.length - 1].push(inIdProp); - cbOut[cbOut.length - 1].push(outIdProp); } } - parsedDependencies.forEach(function (dependency) { - var outputs = dependency.outputs, - inputs = dependency.inputs; - - // new callback, add an empty array for its inputs and outputs - cbIn.push([]); - cbOut.push([]); - function addOutputToMulti(outIdFinal, outIdProp) { - multiGraph.addNode(outIdProp); - inputs.forEach(function (inObj) { - var inId = inObj.id, - property = inObj.property; - if (typeof inId === 'object') { - var inIdList = makeAllIds(inId, outIdFinal); - inIdList.forEach(function (id) { - addInputToMulti((0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.combineIdAndProp)({ - id, - property - }), outIdProp); - }); - } else { - addInputToMulti((0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.combineIdAndProp)(inObj), outIdProp); - } - }); - } - - // We'll continue to use dep.output as its id, but add outputs as well - // for convenience and symmetry with the structure of inputs and state. - // Also collect MATCH keys in the output (all outputs must share these) - // and ALL keys in the first output (need not be shared but we'll use - // the first output for calculations) for later convenience. - var _findWildcardKeys3 = findWildcardKeys(outputs[0].id), - matchKeys = _findWildcardKeys3.matchKeys; - var firstSingleOutput = (0,ramda__WEBPACK_IMPORTED_MODULE_2__.findIndex)(function (o) { - return !isMultiValued(o.id); - }, outputs); - var finalDependency = (0,ramda__WEBPACK_IMPORTED_MODULE_2__.mergeRight)({ - matchKeys, - firstSingleOutput, - outputs - }, dependency); - outputs.forEach(function (outIdProp) { - var outId = outIdProp.id, - property = outIdProp.property; - // check if this output is also an input to the same callback - var alsoInput = checkInOutOverlap(outIdProp, inputs); - if (typeof outId === 'object') { - var outIdList = makeAllIds(outId, {}); - outIdList.forEach(function (id) { - var tempOutIdProp = { - id, - property - }; - var outIdName = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.combineIdAndProp)(tempOutIdProp); - // if this output is also an input, add `outputTag` to the name - if (alsoInput) { - duplicateOutputs.push(tempOutIdProp); - outIdName += outputTag; - } - addOutputToMulti(id, outIdName); - }); - addPattern(outputPatterns, outId, property, finalDependency); - } else { - var outIdName = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.combineIdAndProp)(outIdProp); - // if this output is also an input, add `outputTag` to the name - if (alsoInput) { - duplicateOutputs.push(outIdProp); - outIdName += outputTag; - } - addOutputToMulti({}, outIdName); - addMap(outputMap, outId, property, finalDependency); - } - }); - inputs.forEach(function (inputObject) { - var inId = inputObject.id, - inProp = inputObject.property; - if (typeof inId === 'object') { - addPattern(inputPatterns, inId, inProp, finalDependency); - } else { - addMap(inputMap, inId, inProp, finalDependency); - } - }); + var cyLayout = chosenType === layoutType ? graphLayout : (0,ramda__WEBPACK_IMPORTED_MODULE_17__["default"])(layouts[layoutType], { + ready: setPresetLayout }); - - // second pass for adding new output nodes as dependencies where needed - duplicateOutputs.forEach(function (dupeOutIdProp) { - var originalName = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.combineIdAndProp)(dupeOutIdProp); - var newName = originalName.concat(outputTag); - for (var cnt = 0; cnt < cbIn.length; cnt++) { - // check if input to the callback - if (cbIn[cnt].some(function (inName) { - return inName === originalName; - })) { - /* make sure it's not also an output of the callback - * (this will be the original callback) - */ - if (!cbOut[cnt].some(function (outName) { - return outName === newName; - })) { - cbOut[cnt].forEach(function (outName) { - addInputToMulti(newName, outName, false); - }); - } - } + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-callback-dag--container" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_cytoscapejs__WEBPACK_IMPORTED_MODULE_4__["default"], { + style: { + width: '100%', + height: '100%' + }, + cy: setCytoscape, + elements: elements, + layout: cyLayout, + stylesheet: _CallbackGraphContainerStylesheet__WEBPACK_IMPORTED_MODULE_11__["default"] + }), selected ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-callback-dag--info" + }, hasPatterns ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "Info isn't supported for pattern-matching IDs at this time") : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_json_tree__WEBPACK_IMPORTED_MODULE_18__.JSONTree, { + data: elementInfo, + theme: "summerfruit", + labelRenderer: function labelRenderer(_keys) { + return _keys.length === 1 ? elementName : _keys[0]; + }, + getItemString: function getItemString(type, data, itemType) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, itemType); + }, + shouldExpandNode: function shouldExpandNode(keyName, data, level) { + return level < 1; } - }); - return finalGraphs; + })) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("select", { + className: "dash-callback-dag--layoutSelector", + onChange: function onChange(e) { + return setLayoutType(e.target.value); + }, + value: layoutType, + ref: layoutSelector + }, (0,ramda__WEBPACK_IMPORTED_MODULE_14__["default"])(layouts).map(function (k) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("option", { + value: k, + key: k + }, k); + }))); } -function findWildcardKeys(id) { - var matchKeys = []; - var allsmallerKeys = []; - if (typeof id === 'object') { - (0,ramda__WEBPACK_IMPORTED_MODULE_2__.forEachObjIndexed)(function (val, key) { - if (val === MATCH) { - matchKeys.push(key); - } else if (val === ALLSMALLER) { - allsmallerKeys.push(key); - } - }, id); - matchKeys.sort(); - allsmallerKeys.sort(); +CallbackGraph.propTypes = {}; +var UnconnectedCallbackGraphContainer = /*#__PURE__*/function (_Component) { + _inherits(UnconnectedCallbackGraphContainer, _Component); + var _super = _createSuper(UnconnectedCallbackGraphContainer); + function UnconnectedCallbackGraphContainer(props) { + var _this; + _classCallCheck(this, UnconnectedCallbackGraphContainer); + _this = _super.call(this, props); + _this.state = { + hasError: false + }; + return _this; } + _createClass(UnconnectedCallbackGraphContainer, [{ + key: "componentDidCatch", + value: function componentDidCatch(error, info) { + var dispatch = this.props.dispatch; + dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_9__.onError)({ + myID: this.state.myID, + type: 'frontEnd', + error, + info + })); + } + }, { + key: "render", + value: function render() { + return this.state.hasError ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-callback-dag--container" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-callback-dag--message" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "Oops! The callback graph threw an error."), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "Check the error list for details."))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(CallbackGraph, null); + } + }], [{ + key: "getDerivedStateFromError", + value: function getDerivedStateFromError(_) { + return { + hasError: true + }; + } + }]); + return UnconnectedCallbackGraphContainer; +}(react__WEBPACK_IMPORTED_MODULE_0__.Component); +UnconnectedCallbackGraphContainer.propTypes = { + dispatch: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func) +}; +var CallbackGraphContainer = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.connect)(null, function (dispatch) { return { - matchKeys, - allsmallerKeys + dispatch }; -} +})(UnconnectedCallbackGraphContainer); -/* - * Do the given id values `vals` match the pattern `patternVals`? - * `keys`, `patternVals`, and `vals` are all arrays, and we already know that - * we're only looking at ids with the same keys as the pattern. - * - * Optionally, include another reference set of the same - to ensure the - * correct matching of MATCH or ALLSMALLER between input and output items. - */ -function idMatch(keys, vals, patternVals, refKeys, refVals, refPatternVals) { - for (var i = 0; i < keys.length; i++) { - var val = vals[i]; - var patternVal = patternVals[i]; - if (patternVal.wild) { - // If we have a second id, compare the wildcard values. - // Without a second id, all wildcards pass at this stage. - if (refKeys && patternVal !== ALL) { - var refIndex = refKeys.indexOf(keys[i]); - var refPatternVal = refPatternVals[refIndex]; - // Sanity check. Shouldn't ever fail this, if the back end - // did its job validating callbacks. - // You can't resolve an input against an input, because - // two ALLSMALLER's wouldn't make sense! - if (patternVal === ALLSMALLER && refPatternVal === ALLSMALLER) { - throw new Error('invalid wildcard id pair: ' + JSON.stringify({ - keys, - patternVals, - vals, - refKeys, - refPatternVals, - refVals - })); - } - if (idValSort(val, refVals[refIndex]) !== (patternVal === ALLSMALLER ? -1 : refPatternVal === ALLSMALLER ? 1 : 0)) { - return false; - } - } - } else if (val !== patternVal) { - return false; - } - } - return true; -} -function getAnyVals(patternVals, vals) { - var matches = []; - for (var i = 0; i < patternVals.length; i++) { - if (patternVals[i] === MATCH) { - matches.push(vals[i]); - } - } - return matches.length ? JSON.stringify(matches) : ''; -} -/* - * Does this item (input / output / state) support multiple values? - * string IDs do not; wildcard IDs only do if they contain ALL or ALLSMALLER - */ -function isMultiValued(_ref13) { - var id = _ref13.id; - return typeof id === 'object' && (0,ramda__WEBPACK_IMPORTED_MODULE_2__.any)(function (v) { - return v.multi; - }, (0,ramda__WEBPACK_IMPORTED_MODULE_2__.values)(id)); -} +/***/ }), -/* - * For a given output id and prop, find the callback generating it. - * If no callback is found, returns false. - * If one is found, returns: - * { - * callback: the callback spec {outputs, inputs, state etc} - * anyVals: stringified list of resolved MATCH keys we matched - * resolvedId: the "outputs" id string plus MATCH values we matched - * getOutputs: accessor function to give all resolved outputs of this - * callback. Takes `paths` as argument to apply when the callback is - * dispatched, in case a previous callback has altered the layout. - * The result is a list of {id (string or object), property (string)} - * getInputs: same for inputs - * getState: same for state - * changedPropIds: an object of {[idAndProp]: v} triggering this callback - * v = DIRECT (2): the prop was changed in the front end, so dependent - * callbacks *MUST* be executed. - * v = INDIRECT (1): the prop is expected to be changed by a callback, - * but if this is prevented, dependent callbacks may be pruned. - * initialCall: boolean, if true we don't require any changedPropIds - * to keep this callback around, as it's the initial call to populate - * this value on page load or changing part of the layout. - * By default this is true for callbacks generated by - * getCallbackByOutput, false from getCallbacksByInput. - * } - */ -function getCallbackByOutput(graphs, paths, id, prop) { - var resolve; - var callback; - var anyVals = ''; - if (typeof id === 'string') { - // standard id version - var callbacks = (graphs.outputMap[id] || {})[prop]; - if (callbacks) { - callback = callbacks[0]; - resolve = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.resolveDeps)(); - } - } else { - // wildcard version - var _keys = Object.keys(id).sort(); - var vals = (0,ramda__WEBPACK_IMPORTED_MODULE_2__.props)(_keys, id); - var keyStr = _keys.join(','); - var patterns = (graphs.outputPatterns[keyStr] || {})[prop]; - if (patterns) { - for (var i = 0; i < patterns.length; i++) { - var patternVals = patterns[i].values; - if (idMatch(_keys, vals, patternVals)) { - callback = patterns[i].callbacks[0]; - resolve = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.resolveDeps)(_keys, vals, patternVals); - anyVals = getAnyVals(patternVals, vals); - break; - } - } - } +/***/ "./src/components/error/CallbackGraph/CallbackGraphContainerStylesheet.js": +/*!********************************************************************************!*\ + !*** ./src/components/error/CallbackGraph/CallbackGraphContainerStylesheet.js ***! + \********************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +var stylesheet = [{ + selector: '*', + style: { + 'font-size': 12, + 'font-family': '"Arial", sans-serif' } - if (!resolve) { - return false; +}, { + selector: 'edge', + style: { + width: 2, + 'line-color': '#888888', + 'target-arrow-color': '#888888', + 'target-arrow-shape': 'triangle', + 'target-arrow-fill': 'filled', + 'arrow-scale': 1, + 'curve-style': 'bezier', + 'control-point-step-size': 40, + 'transition-property': 'line-color, target-arrow-color', + 'transition-duration': '0.25s', + 'transition-timing-function': 'ease-in-out-sine' } - return (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.makeResolvedCallback)(callback, resolve, anyVals); -} -function addResolvedFromOutputs(callback, outPattern, outs, matches) { - var out0Keys = Object.keys(outPattern.id).sort(); - var out0PatternVals = (0,ramda__WEBPACK_IMPORTED_MODULE_2__.props)(out0Keys, outPattern.id); - var foundCbIds = {}; - outs.forEach(function (_ref14) { - var outId = _ref14.id; - var outVals = (0,ramda__WEBPACK_IMPORTED_MODULE_2__.props)(out0Keys, outId); - var resolved = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.makeResolvedCallback)(callback, (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.resolveDeps)(out0Keys, outVals, out0PatternVals), getAnyVals(out0PatternVals, outVals)); - var resolvedId = resolved.resolvedId; - if (!foundCbIds[resolvedId]) { - matches.push(resolved); - foundCbIds[resolvedId] = true; - } - }); -} -function addAllResolvedFromOutputs(resolve, paths, matches) { - return function (callback) { - var matchKeys = callback.matchKeys, - firstSingleOutput = callback.firstSingleOutput, - outputs = callback.outputs; - if (matchKeys.length) { - var singleOutPattern = outputs[firstSingleOutput]; - if (singleOutPattern) { - addResolvedFromOutputs(callback, singleOutPattern, resolve(paths)(singleOutPattern), matches); - } else { - /* - * If every output has ALL we need to reduce resolved set - * to one item per combination of MATCH values. - * That will give one result per callback invocation. - */ - var anySeen = {}; - outputs.forEach(function (outPattern) { - var outSet = resolve(paths)(outPattern).filter(function (i) { - var matchStr = JSON.stringify((0,ramda__WEBPACK_IMPORTED_MODULE_2__.props)(matchKeys, i.id)); - if (!anySeen[matchStr]) { - anySeen[matchStr] = 1; - return true; - } - return false; - }); - addResolvedFromOutputs(callback, outPattern, outSet, matches); - }); - } - } else { - var cb = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.makeResolvedCallback)(callback, resolve, ''); - if ((0,ramda__WEBPACK_IMPORTED_MODULE_2__.flatten)(cb.getOutputs(paths)).length) { - matches.push(cb); - } - } - }; -} - -/* - * For a given id and prop find all callbacks it's an input of. - * - * Returns an array of objects: - * {callback, resolvedId, getOutputs, getInputs, getState} - * See getCallbackByOutput for details. - * - * Note that if the original input contains an ALLSMALLER wildcard, - * there may be many entries for the same callback, but any given output - * (with an MATCH corresponding to the input's ALLSMALLER) will only appear - * in one entry. - */ -function getWatchedKeys(id, newProps, graphs) { - if (!(id && graphs && newProps.length)) { - return []; +}, { + selector: 'edge[type="hidden"]', + style: { + display: 'none' } - if (typeof id === 'string') { - var inputs = graphs.inputMap[id]; - return inputs ? newProps.filter(function (newProp) { - return inputs[newProp]; - }) : []; +}, { + selector: 'edge[type="output"]', + style: { + 'line-color': '#0080D0', + 'target-arrow-color': '#0080D0' } - var keys = Object.keys(id).sort(); - var vals = (0,ramda__WEBPACK_IMPORTED_MODULE_2__.props)(keys, id); - var keyStr = keys.join(','); - var keyPatterns = graphs.inputPatterns[keyStr]; - if (!keyPatterns) { - return []; +}, { + selector: 'edge[type="state"]', + style: { + 'line-style': 'dashed' } - return newProps.filter(function (prop) { - var patterns = keyPatterns[prop]; - return patterns && patterns.some(function (pattern) { - return idMatch(keys, vals, pattern.values); - }); - }); -} - -/* - * Return a list of all callbacks referencing a chunk of the layout, - * either as inputs or outputs. - * - * opts.outputsOnly: boolean, set true when crawling the *whole* layout, - * because outputs are enough to get everything. - * opts.removedArrayInputsOnly: boolean, set true to only look for inputs in - * wildcard arrays (ALL or ALLSMALLER), no outputs. This gets used to tell - * when the new *absence* of a given component should trigger a callback. - * opts.newPaths: paths object after the edit - to be used with - * removedArrayInputsOnly to determine if the callback still has its outputs - * opts.chunkPath: path to the new chunk - used to determine if any outputs are - * outside of this chunk, because this determines whether inputs inside the - * chunk count as having changed - * - * Returns an array of objects: - * {callback, resolvedId, getOutputs, getInputs, getState, ...etc} - * See getCallbackByOutput for details. - */ -function getUnfilteredLayoutCallbacks(graphs, paths, layoutChunk, opts) { - var outputsOnly = opts.outputsOnly, - removedArrayInputsOnly = opts.removedArrayInputsOnly, - newPaths = opts.newPaths, - chunkPath = opts.chunkPath; - var foundCbIds = {}; - var callbacks = []; - function addCallback(callback) { - if (callback) { - var foundIndex = foundCbIds[callback.resolvedId]; - if (foundIndex !== undefined) { - var foundCb = callbacks[foundIndex]; - foundCb.changedPropIds = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.mergeMax)(foundCb.changedPropIds, callback.changedPropIds); - if (callback.initialCall) { - foundCb.initialCall = true; - } - } else { - foundCbIds[callback.resolvedId] = callbacks.length; - callbacks.push(callback); - } - } +}, { + selector: 'node', + style: { + color: '#333333', + padding: 6, + 'text-valign': 'center', + 'text-halign': 'center', + 'border-width': 2, + 'border-opacity': 0, + 'border-style': 'solid', + 'border-color': '#888888', + 'transition-property': 'border-opacity', + 'transition-duration': '0.25s', + 'transition-timing-function': 'ease-in-out-sine' } - function addCallbackIfArray(idStr) { - return function (cb) { - return cb.getInputs(paths).some(function (ini) { - if (Array.isArray(ini) && ini.some(function (inij) { - return stringifyId(inij.id) === idStr; - })) { - // This callback should trigger even with no changedProps, - // since the props that changed no longer exist. - // We're kind of abusing the `initialCall` flag here, it's - // more like a "final call" for the removed inputs, but - // this case is not subject to `prevent_initial_call`. - if ((0,ramda__WEBPACK_IMPORTED_MODULE_2__.flatten)(cb.getOutputs(newPaths)).length) { - cb.initialCall = true; - cb.changedPropIds = {}; - addCallback(cb); - } - return true; - } - return false; - }); - }; +}, { + selector: 'node[type="callback"]', + style: { + width: 35, + height: 25, + shape: 'round-rectangle', + label: function label(e) { + return "".concat(e.data().count, "\n").concat(e.data().time, " ms"); + }, + 'text-wrap': 'wrap', + 'text-justification': 'center' } - function handleOneId(id, outIdCallbacks, inIdCallbacks) { - if (outIdCallbacks) { - for (var property in outIdCallbacks) { - var cb = getCallbackByOutput(graphs, paths, id, property); - if (cb) { - // callbacks found in the layout by output should always run - // unless specifically requested not to. - // ie this is the initial call of this callback even if it's - // not the page initialization but just a new layout chunk - if (!cb.callback.prevent_initial_call) { - cb.initialCall = true; - addCallback(cb); - } - } - } - } - if (!outputsOnly && inIdCallbacks) { - var maybeAddCallback = removedArrayInputsOnly ? addCallbackIfArray(stringifyId(id)) : addCallback; - var handleThisCallback = maybeAddCallback; - if (chunkPath) { - handleThisCallback = function handleThisCallback(cb) { - if (!(0,ramda__WEBPACK_IMPORTED_MODULE_2__.all)((0,ramda__WEBPACK_IMPORTED_MODULE_2__.startsWith)(chunkPath), (0,ramda__WEBPACK_IMPORTED_MODULE_2__.pluck)('path', (0,ramda__WEBPACK_IMPORTED_MODULE_2__.flatten)(cb.getOutputs(paths))))) { - maybeAddCallback(cb); - } - }; - } - for (var _property in inIdCallbacks) { - (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.getCallbacksByInput)(graphs, paths, id, _property, _dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.INDIRECT).forEach(handleThisCallback); - } - } +}, { + selector: 'node[type="callback"][mode="client"]', + style: { + color: '#323330', + 'background-color': '#F0DB4F' } - (0,_utils__WEBPACK_IMPORTED_MODULE_5__.crawlLayout)(layoutChunk, function (child) { - var id = (0,ramda__WEBPACK_IMPORTED_MODULE_2__.path)(['props', 'id'], child); - if (id) { - if (typeof id === 'string' && !removedArrayInputsOnly) { - handleOneId(id, graphs.outputMap[id], graphs.inputMap[id]); - } else { - var keyStr = Object.keys(id).sort().join(','); - handleOneId(id, !removedArrayInputsOnly && graphs.outputPatterns[keyStr], graphs.inputPatterns[keyStr]); - } - } - }); - return (0,ramda__WEBPACK_IMPORTED_MODULE_2__.map)(function (cb) { - return _objectSpread(_objectSpread({}, cb), {}, { - priority: (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__.getPriority)(graphs, paths, cb) - }); - }, callbacks); -} +}, { + selector: 'node[type="callback"][mode="server"]', + style: { + color: '#323330', + 'background-color': '#00CC96' + } +}, { + selector: 'node[type="component"], node[type="wildcard"]', + style: { + width: 'label', + // height: 'label', + shape: 'rectangle', + content: function content(e) { + return e.data().label.replace(/"/g, ''); + }, + 'text-valign': 'top', + 'background-color': '#B9C2CE' + } +}, { + selector: 'node[type="property"]', + style: { + width: 'label', + height: 20, + shape: 'rectangle', + content: 'data(label)', + color: 'white', + 'background-color': '#109DFF' + } +}, { + selector: '.selected-node', + style: { + ghost: 'yes', + 'ghost-offset-x': 2, + 'ghost-offset-y': 2, + 'ghost-opacity': 0.25, + 'border-opacity': 1 + } +}, { + selector: '.prop-changed, .callback-loading', + style: { + 'border-color': '#CC43B7', + 'border-width': 2, + 'border-opacity': 1 + } +}, { + selector: '.callback-error', + style: { + 'background-color': '#E1332E' + } +}, { + selector: '.triggered', + style: { + 'line-color': '#CC43B7', + 'target-arrow-color': '#CC43B7' + } +}, { + selector: '.inactive', + style: { + opacity: 0.5 + } +}]; +/* harmony default export */ __webpack_exports__["default"] = (stylesheet); /***/ }), -/***/ "./src/actions/index.js": -/*!******************************!*\ - !*** ./src/actions/index.js ***! - \******************************/ +/***/ "./src/components/error/CallbackGraph/CallbackGraphEffects.js": +/*!********************************************************************!*\ + !*** ./src/components/error/CallbackGraph/CallbackGraphEffects.js ***! + \********************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ addHttpHeaders: function() { return /* binding */ addHttpHeaders; }, -/* harmony export */ dispatchError: function() { return /* binding */ dispatchError; }, -/* harmony export */ getCSRFHeader: function() { return /* binding */ getCSRFHeader; }, -/* harmony export */ handleAsyncError: function() { return /* binding */ handleAsyncError; }, -/* harmony export */ hydrateInitialOutputs: function() { return /* binding */ hydrateInitialOutputs; }, -/* harmony export */ notifyObservers: function() { return /* binding */ notifyObservers; }, -/* harmony export */ onError: function() { return /* binding */ onError; }, -/* harmony export */ redo: function() { return /* binding */ redo; }, -/* harmony export */ revert: function() { return /* binding */ revert; }, -/* harmony export */ setAppLifecycle: function() { return /* binding */ setAppLifecycle; }, -/* harmony export */ setConfig: function() { return /* binding */ setConfig; }, -/* harmony export */ setGraphs: function() { return /* binding */ setGraphs; }, -/* harmony export */ setHooks: function() { return /* binding */ setHooks; }, -/* harmony export */ setLayout: function() { return /* binding */ setLayout; }, -/* harmony export */ setPaths: function() { return /* binding */ setPaths; }, -/* harmony export */ setRequestQueue: function() { return /* binding */ setRequestQueue; }, -/* harmony export */ undo: function() { return /* binding */ undo; }, -/* harmony export */ updateProps: function() { return /* binding */ updateProps; } +/* harmony export */ updateCallback: function() { return /* binding */ updateCallback; }, +/* harmony export */ updateChangedProps: function() { return /* binding */ updateChangedProps; }, +/* harmony export */ updateSelectedNode: function() { return /* binding */ updateSelectedNode; } /* harmony export */ }); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var redux_actions__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! redux-actions */ "./node_modules/redux-actions/es/createAction.js"); -/* harmony import */ var _callbacks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./callbacks */ "./src/actions/callbacks.ts"); -/* harmony import */ var _reducers_constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../reducers/constants */ "./src/reducers/constants.js"); -/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants */ "./src/actions/constants.js"); -/* harmony import */ var cookie__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! cookie */ "./node_modules/cookie/index.js"); -/* harmony import */ var _dependencies__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./dependencies */ "./src/actions/dependencies.js"); -/* harmony import */ var _dependencies_ts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dependencies_ts */ "./src/actions/dependencies_ts.ts"); -/* harmony import */ var _paths__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./paths */ "./src/actions/paths.js"); -function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(typeof e + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } -function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } -function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } - +/* harmony import */ var _constants_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../constants/constants */ "./src/constants/constants.js"); +/** + * getEdgeTypes + * + * Finds all edges connected to a node and splits them by type. + * + * @param {Object} node - Cytoscape node. + * @returns {Object} - Object containing the edges, sorted by type. + */ +function getEdgeTypes(node) { + var elements = node.connectedEdges(); + return { + input: elements.filter('[type = "input"]'), + state: elements.filter('[type = "state"]'), + output: elements.filter('[type = "output"]') + }; +} +/** + * updateSelected + * + * Updates the classes of the selected node and recenters the viewport. + * + * @param {Object} cy - Reference to the cytoscape instance. + * @param {String} id - The id of the selected node. + * @returns {function} - cleanup function, for useEffect hook + */ +function updateSelectedNode(cy, id) { + function ascend(node, collection) { + // FIXME: Should we include State parents but non-recursively? + var type = node.data().type === 'callback' ? 'input' : 'output'; + var edges = getEdgeTypes(node)[type]; + var parents = edges.sources(); + collection.merge(edges); + collection.merge(parents); + if (node.data().type === 'property') { + collection.merge(node.ancestors()); + } + parents.forEach(function (node) { + return ascend(node, collection); + }); + } + function descend(node, collection) { + var type = node.data().type === 'callback' ? 'output' : 'input'; + var edges = getEdgeTypes(node)[type]; + var children = edges.targets(); + collection.merge(edges); + collection.merge(children); + if (node.data().type === 'property') { + collection.merge(node.ancestors()); + } + children.forEach(function (node) { + return descend(node, collection); + }); + } + if (id) { + var node = cy.getElementById(id); + // Highlight the selected node. + node.addClass('selected-node'); + // Find the subtree that the node belongs to. A subtree contains + // all all ancestors and descendants that are connected via Inputs + // or Outputs (but not State). + // WARNING: No cycle detection! -var onError = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_3__.getAction)('ON_ERROR')); -var setAppLifecycle = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_3__.getAction)('SET_APP_LIFECYCLE')); -var setConfig = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_3__.getAction)('SET_CONFIG')); -var addHttpHeaders = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_3__.getAction)('ADD_HTTP_HEADERS')); -var setGraphs = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_3__.getAction)('SET_GRAPHS')); -var setHooks = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_3__.getAction)('SET_HOOKS')); -var setLayout = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_3__.getAction)('SET_LAYOUT')); -var setPaths = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_3__.getAction)('SET_PATHS')); -var setRequestQueue = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_3__.getAction)('SET_REQUEST_QUEUE')); -var updateProps = (0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_3__.getAction)('ON_PROP_CHANGE')); -var dispatchError = function dispatchError(dispatch) { - return function (message, lines) { - return dispatch(onError({ - type: 'backEnd', - error: { - message, - html: lines.join('\n') - } - })); - }; -}; -function hydrateInitialOutputs() { - return function (dispatch, getState) { - (0,_dependencies__WEBPACK_IMPORTED_MODULE_5__.validateCallbacksToLayout)(getState(), dispatchError(dispatch)); - triggerDefaultState(dispatch, getState); - dispatch(setAppLifecycle((0,_reducers_constants__WEBPACK_IMPORTED_MODULE_2__.getAppState)('HYDRATED'))); - }; + var subtree = cy.collection(); + subtree.merge(node); + ascend(node, subtree); + descend(node, subtree); + var other = subtree.absoluteComplement(); + other.addClass('inactive'); + return function () { + node.removeClass('selected-node'); + other.removeClass('inactive'); + }; + } + return undefined; } -/* eslint-disable-next-line no-console */ -var logWarningOnce = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.once)(console.warn); -function getCSRFHeader() { - try { - return { - 'X-CSRFToken': cookie__WEBPACK_IMPORTED_MODULE_4__.parse(document.cookie)._csrf_token - }; - } catch (e) { - logWarningOnce(e); - return {}; - } +/** + * updateChangedProp + * + * Flashes property nodes that updated and any inputs they are connected to. + * + * @param {Object} cy - Reference to the cytoscape instance. + * @param {String} id - The component id which updated. + * @param {Object} props - The props that updated. + * @param {Number} flashTime - The time to flash classes for in ms. + * @returns {undefined} + */ +function updateChangedProps(cy, id, props) { + var flashTime = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 500; + Object.keys(props).forEach(function (prop) { + var node = cy.getElementById("".concat(id, ".").concat(prop)); + node.flashClass('prop-changed', flashTime); + node.edgesTo('*').filter('[type = "input"]').flashClass('triggered', flashTime); + }); } -function triggerDefaultState(dispatch, getState) { - var _getState = getState(), - graphs = _getState.graphs, - paths = _getState.paths, - layout = _getState.layout; - // overallOrder will assert circular dependencies for multi output. - try { - graphs.MultiGraph.overallOrder(); - } catch (err) { - dispatch(onError({ - type: 'backEnd', - error: { - message: 'Circular Dependencies', - html: err.toString() - } - })); +/** + * updateCallback + * + * Updates a callback node with profiling information (call count, avg time) + * and adds or removes classes as necessary. Classes are always assert for + * at least flashTime ms so that they can be visually observed. When callbacks + * resolve, all output edges are flashed. + * + * @param {Object} cy - Reference to the cytoscape instance. + * @param {String} id - The id of the callback (i.e., it's output identifier) + * @param {Object} profile - The callback profiling information. + * @param {Number} flashTime - The time to flash classes for in ms. + * @returns {undefined} + */ +function updateCallback(cy, id, profile) { + var flashTime = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 500; + var node = cy.getElementById("__dash_callback__.".concat(id)); + var count = profile.count, + total = profile.total, + status = profile.status; + var latest = status.latest; + + // Update data. + var avgTime = count > 0 ? total / count : 0; + node.data('count', count); + node.data('time', Math.round(avgTime)); + + // Either flash the classes OR maintain it for long callbacks. + if (latest === 'loading') { + node.data('loadingSet', Date.now()); + node.addClass('callback-loading'); + } else if (node.hasClass('callback-loading')) { + var timeLeft = node.data('loadingSet') + flashTime - Date.now(); + setTimeout(function () { + return node.removeClass('callback-loading'); + }, Math.max(timeLeft, 0)); } - dispatch((0,_callbacks__WEBPACK_IMPORTED_MODULE_1__.addRequestedCallbacks)((0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_6__.getLayoutCallbacks)(graphs, paths, layout, { - outputsOnly: true - }))); -} -var redo = moveHistory('REDO'); -var undo = moveHistory('UNDO'); -var revert = moveHistory('REVERT'); -function moveHistory(changeType) { - return function (dispatch, getState) { - var _getState2 = getState(), - history = _getState2.history, - paths = _getState2.paths; - dispatch((0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])(changeType)()); - var _ref = (changeType === 'REDO' ? history.future[0] : history.past[history.past.length - 1]) || {}, - id = _ref.id, - props = _ref.props; - if (id) { - // Update props - dispatch((0,redux_actions__WEBPACK_IMPORTED_MODULE_8__["default"])('UNDO_PROP_CHANGE')({ - itempath: (0,_paths__WEBPACK_IMPORTED_MODULE_7__.getPath)(paths, id), - props - })); - dispatch(notifyObservers({ - id, - props - })); - } - }; -} -function notifyObservers(_ref2) { - var id = _ref2.id, - props = _ref2.props; - return /*#__PURE__*/function () { - var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(dispatch, getState) { - var _getState3, graphs, paths; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) switch (_context.prev = _context.next) { - case 0: - _getState3 = getState(), graphs = _getState3.graphs, paths = _getState3.paths; - dispatch((0,_callbacks__WEBPACK_IMPORTED_MODULE_1__.addRequestedCallbacks)((0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_6__.includeObservers)(id, props, graphs, paths))); - case 2: - case "end": - return _context.stop(); - } - }, _callee); - })); - return function (_x, _x2) { - return _ref3.apply(this, arguments); - }; - }(); -} -function handleAsyncError(err, message, dispatch) { - // Handle html error responses - if (err && typeof err.text === 'function') { - err.text().then(function (text) { - var error = { - message, - html: text - }; - dispatch(onError({ - type: 'backEnd', - error - })); - }); - } else { - var error = err instanceof Error ? err : { - message, - html: err - }; - dispatch(onError({ - type: 'backEnd', - error - })); + if (latest !== 'loading' && latest !== _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUSMAP[_constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUS.OK] && latest !== _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUSMAP[_constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUS.PREVENT_UPDATE]) { + node.data('errorSet', Date.now()); + node.addClass('callback-error'); + } else if (node.hasClass('callback-error')) { + var _timeLeft = node.data('errorSet') + flashTime - Date.now(); + setTimeout(function () { + return node.removeClass('callback-error'); + }, Math.max(_timeLeft, 0)); + } + + // FIXME: This will flash branches that return no_update!! + // If the callback resolved properly, flash the outputs. + if (latest === _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUSMAP[_constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUS.OK]) { + node.edgesTo('*').flashClass('triggered', flashTime); } } /***/ }), -/***/ "./src/actions/isAppReady.js": -/*!***********************************!*\ - !*** ./src/actions/isAppReady.js ***! - \***********************************/ +/***/ "./src/components/error/ComponentErrorBoundary.react.js": +/*!**************************************************************!*\ + !*** ./src/components/error/ComponentErrorBoundary.react.js ***! + \**************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var _plotly_dash_component_plugins__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @plotly/dash-component-plugins */ "./node_modules/@plotly/dash-component-plugins/dist/index.js"); -/* harmony import */ var _plotly_dash_component_plugins__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_plotly_dash_component_plugins__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _registry__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../registry */ "./src/registry.js"); -/* harmony import */ var _paths__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./paths */ "./src/actions/paths.js"); -/* harmony import */ var _dependencies__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dependencies */ "./src/actions/dependencies.js"); - - +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "prop-types"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../actions */ "./src/actions/index.js"); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } -/* harmony default export */ __webpack_exports__["default"] = (function (layout, paths, targets) { - if (!targets.length) { - return true; +var ComponentErrorBoundary = /*#__PURE__*/function (_Component) { + _inherits(ComponentErrorBoundary, _Component); + var _super = _createSuper(ComponentErrorBoundary); + function ComponentErrorBoundary(props) { + var _this; + _classCallCheck(this, ComponentErrorBoundary); + _this = _super.call(this, props); + _this.state = { + myID: props.componentId, + oldChildren: null, + hasError: false + }; + return _this; } - var promises = []; - var events = paths.events; - var rendered = new Promise(function (resolveRendered) { - events.once('rendered', resolveRendered); - }); - targets.forEach(function (id) { - var pathOfId = (0,_paths__WEBPACK_IMPORTED_MODULE_3__.getPath)(paths, id); - if (!pathOfId) { - return; + _createClass(ComponentErrorBoundary, [{ + key: "componentDidCatch", + value: function componentDidCatch(error, info) { + var dispatch = this.props.dispatch; + dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_2__.onError)({ + myID: this.state.myID, + type: 'frontEnd', + error, + info + })); + dispatch(_actions__WEBPACK_IMPORTED_MODULE_2__.revert); } - var target = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(pathOfId, layout); - if (!target) { - return; + }, { + key: "componentDidUpdate", + value: function componentDidUpdate(prevProps, prevState) { + var prevChildren = prevProps.children; + if (!this.state.hasError && prevChildren !== prevState.oldChildren && prevChildren !== this.props.children) { + /* eslint-disable-next-line react/no-did-update-set-state */ + this.setState({ + oldChildren: prevChildren + }); + } } - var component = _registry__WEBPACK_IMPORTED_MODULE_2__["default"].resolve(target); - var ready = (0,_plotly_dash_component_plugins__WEBPACK_IMPORTED_MODULE_1__.isReady)(component); - if (ready && typeof ready.then === 'function') { - promises.push(Promise.race([ready, rendered.then(function () { - return document.getElementById((0,_dependencies__WEBPACK_IMPORTED_MODULE_4__.stringifyId)(id)) && ready; - })])); + }, { + key: "render", + value: function render() { + var _this$state = this.state, + hasError = _this$state.hasError, + oldChildren = _this$state.oldChildren; + return hasError ? oldChildren : this.props.children; } - }); - return promises.length ? Promise.all(promises) : true; -}); + }], [{ + key: "getDerivedStateFromError", + value: function getDerivedStateFromError(_) { + return { + hasError: true + }; + } + }]); + return ComponentErrorBoundary; +}(react__WEBPACK_IMPORTED_MODULE_0__.Component); +ComponentErrorBoundary.propTypes = { + children: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), + componentId: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string), + error: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), + dispatch: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func) +}; +/* harmony default export */ __webpack_exports__["default"] = (ComponentErrorBoundary); /***/ }), -/***/ "./src/actions/paths.js": -/*!******************************!*\ - !*** ./src/actions/paths.js ***! - \******************************/ +/***/ "./src/components/error/FrontEnd/FrontEndError.react.js": +/*!**************************************************************!*\ + !*** ./src/components/error/FrontEnd/FrontEndError.react.js ***! + \**************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ computePaths: function() { return /* binding */ computePaths; }, -/* harmony export */ getPath: function() { return /* binding */ getPath; } +/* harmony export */ FrontEndError: function() { return /* binding */ FrontEndError; } /* harmony export */ }); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/actions/utils.js"); +/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); +/* harmony import */ var _FrontEndError_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FrontEndError.css */ "./src/components/error/FrontEnd/FrontEndError.css"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _icons_CollapseIcon_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../icons/CollapseIcon.svg */ "./src/components/error/icons/CollapseIcon.svg"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ "prop-types"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _Percy_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Percy.css */ "./src/components/error/Percy.css"); +/* harmony import */ var _actions_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../actions/utils */ "./src/actions/utils.js"); +/* harmony import */ var _werkzeugcss__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../werkzeugcss */ "./src/components/error/werkzeugcss.js"); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } -/* - * state.paths has structure: - * { - * strs: {[id]: path} // for regular string ids - * objs: {[keyStr]: [{values, path}]} // for wildcard ids - * } - * keyStr: sorted keys of the id, joined with ',' into one string - * values: array of values in the id, in order of keys - */ -function computePaths(subTree, startingPath, oldPaths, events) { - var _ref = oldPaths || { - strs: {}, - objs: {} - }, - oldStrs = _ref.strs, - oldObjs = _ref.objs; - var diffHead = function diffHead(path) { - return startingPath.some(function (v, i) { - return path[i] !== v; - }); - }; - var spLen = startingPath.length; - // if we're updating a subtree, clear out all of the existing items - var strs = spLen ? (0,ramda__WEBPACK_IMPORTED_MODULE_0__.filter)(diffHead, oldStrs) : {}; - var objs = {}; - if (spLen) { - (0,ramda__WEBPACK_IMPORTED_MODULE_0__.forEachObjIndexed)(function (oldValPaths, oldKeys) { - var newVals = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.filter)(function (_ref2) { - var path = _ref2.path; - return diffHead(path); - }, oldValPaths); - if (newVals.length) { - objs[oldKeys] = newVals; - } - }, oldObjs); + + + + +var FrontEndError = /*#__PURE__*/function (_Component) { + _inherits(FrontEndError, _Component); + var _super = _createSuper(FrontEndError); + function FrontEndError(props) { + var _this; + _classCallCheck(this, FrontEndError); + _this = _super.call(this, props); + _this.state = { + collapsed: _this.props.isListItem + }; + return _this; } - (0,_utils__WEBPACK_IMPORTED_MODULE_1__.crawlLayout)(subTree, function (child, itempath) { - var id = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(['props', 'id'], child); - if (id) { - if (typeof id === 'object') { - var keys = Object.keys(id).sort(); - var values = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.props)(keys, id); - var keyStr = keys.join(','); - var paths = objs[keyStr] = objs[keyStr] || []; - var oldie = oldObjs[keyStr] || []; - var item = { - values, - path: (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(startingPath, itempath) - }; - var index = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.indexOf)(item, oldie); - if (index === -1) { - paths.push(item); - } else { - objs[keyStr] = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.insert)(index, item, paths); + _createClass(FrontEndError, [{ + key: "render", + value: function render() { + var _this2 = this; + var _this$props = this.props, + e = _this$props.e, + inAlertsTray = _this$props.inAlertsTray; + var collapsed = this.state.collapsed; + var cardClasses = 'dash-error-card__content' + (inAlertsTray ? ' dash-error-card--alerts-tray' : ''); + + /* eslint-disable no-inline-comments */ + var errorHeader = /*#__PURE__*/React.createElement("div", { + className: "dash-fe-error-top test-devtools-error-toggle", + onClick: function onClick() { + return _this2.setState({ + collapsed: !collapsed + }); } - } else { - strs[id] = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(startingPath, itempath); - } + }, /*#__PURE__*/React.createElement("span", { + className: "dash-fe-error-top__group" + }, "\u26D1\uFE0F", /*#__PURE__*/React.createElement("span", { + className: "dash-fe-error__title" + }, e.error.message || 'Error')), /*#__PURE__*/React.createElement("span", { + className: "dash-fe-error-top__group" + }, /*#__PURE__*/React.createElement("span", { + className: "dash-fe-error__timestamp percy-hide" + }, "".concat(e.timestamp.toLocaleTimeString())), /*#__PURE__*/React.createElement("span", { + className: "dash-fe-error__timestamp percy-show" + }, "00:00:00 PM"), /*#__PURE__*/React.createElement(_icons_CollapseIcon_svg__WEBPACK_IMPORTED_MODULE_3__["default"], { + className: "dash-fe-error__collapse ".concat(collapsed ? 'dash-fe-error__collapse--flipped' : ''), + onClick: function onClick() { + return _this2.setState({ + collapsed: !collapsed + }); + } + }))); + /* eslint-enable no-inline-comments */ + + return collapsed ? /*#__PURE__*/React.createElement("div", { + className: "dash-error-card__list-item" + }, errorHeader) : /*#__PURE__*/React.createElement("div", { + className: cardClasses + }, errorHeader, /*#__PURE__*/React.createElement(ErrorContent, { + error: e.error + })); } - }); + }]); + return FrontEndError; +}(react__WEBPACK_IMPORTED_MODULE_2__.Component); +var MAX_MESSAGE_LENGTH = 40; +/* eslint-disable no-inline-comments */ +function UnconnectedErrorContent(_ref) { + var error = _ref.error, + base = _ref.base; + return /*#__PURE__*/React.createElement("div", { + className: "error-container" + }, typeof error.message !== 'string' || error.message.length < MAX_MESSAGE_LENGTH ? null : /*#__PURE__*/React.createElement("div", { + className: "dash-fe-error__st" + }, /*#__PURE__*/React.createElement("div", { + className: "dash-fe-error__info dash-fe-error__curved" + }, error.message)), typeof error.stack !== 'string' ? null : /*#__PURE__*/React.createElement("div", { + className: "dash-fe-error__st" + }, /*#__PURE__*/React.createElement("div", { + className: "dash-fe-error__info" + }, /*#__PURE__*/React.createElement("details", null, /*#__PURE__*/React.createElement("summary", null, /*#__PURE__*/React.createElement("i", null, "(This error originated from the built-in JavaScript code that runs Dash apps. Click to see the full stack trace or open your browser's console.)")), error.stack.split('\n').map(function (line, i) { + return /*#__PURE__*/React.createElement("p", { + key: i + }, line); + })))), typeof error.html !== 'string' ? null : error.html.substring(0, '', "")).replace('="?__debugger__', "=\"".concat(base, "?__debugger__")), + style: { + /* + * 67px of padding and margin between this + * iframe and the parent container. + * 67 was determined manually in the + * browser's dev tools. + */ + width: 'calc(600px - 67px)', + height: '75vh', + border: 'none' + } + }))) : /*#__PURE__*/React.createElement("div", { + className: "dash-be-error__str" + }, /*#__PURE__*/React.createElement("div", { + className: "dash-backend-error" + }, error.html))); +} +/* eslint-enable no-inline-comments */ - // We include an event emitter here because it will be used along with - // paths to determine when the app is ready for callbacks. +var errorPropTypes = prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({ + message: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string), + /* front-end error messages */ + stack: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string), + /* backend error messages */ + html: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string) +}); +UnconnectedErrorContent.propTypes = { + error: errorPropTypes, + base: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string) +}; +var ErrorContent = (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(function (state) { return { - strs, - objs, - events: events || oldPaths.events + base: (0,_actions_utils__WEBPACK_IMPORTED_MODULE_6__.urlBase)(state.config) }; -} -function getPath(paths, id) { - if (typeof id === 'object') { - var keys = Object.keys(id).sort(); - var keyStr = keys.join(','); - var keyPaths = paths.objs[keyStr]; - if (!keyPaths) { - return false; - } - var values = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.props)(keys, id); - var pathObj = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.find)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.propEq)(values, 'values'), keyPaths); - return pathObj && pathObj.path; - } - return paths.strs[id]; -} +})(UnconnectedErrorContent); +FrontEndError.propTypes = { + e: prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({ + timestamp: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().object), + error: errorPropTypes + }), + inAlertsTray: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().bool), + isListItem: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().bool) +}; +FrontEndError.defaultProps = { + inAlertsTray: false, + isListItem: false +}; + /***/ }), -/***/ "./src/actions/utils.js": -/*!******************************!*\ - !*** ./src/actions/utils.js ***! - \******************************/ +/***/ "./src/components/error/FrontEnd/FrontEndErrorContainer.react.js": +/*!***********************************************************************!*\ + !*** ./src/components/error/FrontEnd/FrontEndErrorContainer.react.js ***! + \***********************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ EventEmitter: function() { return /* binding */ EventEmitter; }, -/* harmony export */ crawlLayout: function() { return /* binding */ crawlLayout; }, -/* harmony export */ urlBase: function() { return /* binding */ urlBase; } +/* harmony export */ FrontEndErrorContainer: function() { return /* binding */ FrontEndErrorContainer; } /* harmony export */ }); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _FrontEndError_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FrontEndError.css */ "./src/components/error/FrontEnd/FrontEndError.css"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "prop-types"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _FrontEndError_react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FrontEndError.react */ "./src/components/error/FrontEnd/FrontEndError.react.js"); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } -function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } -function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } -function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } -/* - * requests_pathname_prefix is the new config parameter introduced in - * dash==0.18.0. The previous versions just had url_base_pathname - */ -function urlBase(config) { - var hasUrlBase = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.has)('url_base_pathname', config); - var hasReqPrefix = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.has)('requests_pathname_prefix', config); - if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__.type)(config) !== 'Object' || !hasUrlBase && !hasReqPrefix) { - throw new Error("\n Trying to make an API request but neither\n \"url_base_pathname\" nor \"requests_pathname_prefix\"\n is in `config`. `config` is: ", config); - } - var base = hasReqPrefix ? config.requests_pathname_prefix : config.url_base_pathname; - return base.charAt(base.length - 1) === '/' ? base : base + '/'; -} -var propsChildren = ['props', 'children']; -// crawl a layout object or children array, apply a function on every object -var crawlLayout = function crawlLayout(object, func) { - var currentPath = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; - var extraPath = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : undefined; - if (Array.isArray(object)) { - // children array - object.forEach(function (child, i) { - if (extraPath) { - var objOf = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.findIndex)(function (p) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.includes)('{}', p); - }, extraPath); - if (objOf !== -1) { - var front = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.slice)(0, objOf, extraPath); - var back = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.slice)(objOf, extraPath.length, extraPath); - if (front.length) { - crawlLayout((0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(front, child), func, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(currentPath, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)([i], front)), back); - } else { - var backPath = back.map(function (p) { - return p.replace('{}', ''); - }).filter(function (e) { - return e; - }); - var childObj, - childPath = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)([i], backPath); - if (backPath.length) { - childObj = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(backPath, child); - } else { - childObj = child; - } - for (var key in childObj) { - var value = childObj[key]; - crawlLayout(value, func, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(currentPath, childPath.concat([key]))); - } - } - } else { - crawlLayout((0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(extraPath, child), func, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(currentPath, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)([i], extraPath))); - } - } else { - crawlLayout(child, func, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.append)(i, currentPath)); - } - }); - } else if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__.type)(object) === 'Object') { - func(object, currentPath); - var children = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(propsChildren, object); - if (children) { - var newPath = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(currentPath, propsChildren); - crawlLayout(children, func, newPath); - } - var childrenProps = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.pathOr)([], [object.namespace, object.type], window.__dashprivate_childrenProps); - childrenProps.forEach(function (childrenProp) { - if (childrenProp.includes('[]')) { - var _childrenProp$split$m = childrenProp.split('[]').map(function (p) { - return p.split('.').filter(function (e) { - return e; - }); - }), - _childrenProp$split$m2 = _slicedToArray(_childrenProp$split$m, 2), - frontPath = _childrenProp$split$m2[0], - backPath = _childrenProp$split$m2[1]; - var front = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(['props'], frontPath); - var basePath = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(currentPath, front); - crawlLayout((0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(front, object), func, basePath, backPath); - } else { - if (childrenProp.includes('{}')) { - var opath = childrenProp.split('.'); - var _frontPath = []; - var _backPath = []; - var found = false; - for (var i = 0; i < opath.length; i++) { - var curPath = opath[i]; - if (!found && curPath.includes('{}')) { - found = true; - _frontPath.push(curPath.replace('{}', '')); - } else { - if (found) { - _backPath.push(curPath); - } else { - _frontPath.push(curPath); - } - } - } - var _newPath = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(currentPath, ['props'].concat(_frontPath)); - var oValue = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(['props'].concat(_frontPath), object); - if (oValue !== undefined) { - for (var key in oValue) { - var value = oValue[key]; - if (_backPath.length) { - crawlLayout((0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(_backPath, value), func, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(_newPath, [key].concat(_backPath))); - } else { - crawlLayout(value, func, [].concat(_toConsumableArray(_newPath), [key])); - } - } - } - } else { - var _newPath2 = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.concat)(currentPath, ['props'].concat(_toConsumableArray(childrenProp.split('.')))); - crawlLayout((0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(['props'].concat(_toConsumableArray(childrenProp.split('.'))), object), func, _newPath2); - } - } - }); - } -}; -// There are packages for this but it's simple enough, I just -// adapted it from https://gist.github.com/mudge/5830382 -var EventEmitter = /*#__PURE__*/function () { - function EventEmitter() { - _classCallCheck(this, EventEmitter); - this._ev = {}; +var FrontEndErrorContainer = /*#__PURE__*/function (_Component) { + _inherits(FrontEndErrorContainer, _Component); + var _super = _createSuper(FrontEndErrorContainer); + function FrontEndErrorContainer(props) { + _classCallCheck(this, FrontEndErrorContainer); + return _super.call(this, props); } - _createClass(EventEmitter, [{ - key: "on", - value: function on(event, listener) { - var _this = this; - var events = this._ev[event] = this._ev[event] || []; - events.push(listener); - return function () { - return _this.removeListener(event, listener); - }; - } - }, { - key: "removeListener", - value: function removeListener(event, listener) { - var events = this._ev[event]; - if (events) { - var idx = events.indexOf(listener); - if (idx > -1) { - events.splice(idx, 1); - } - } - } - }, { - key: "emit", - value: function emit(event) { - var _this2 = this; - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; + _createClass(FrontEndErrorContainer, [{ + key: "render", + value: function render() { + var _this$props = this.props, + errors = _this$props.errors, + connected = _this$props.connected, + errorsOpened = _this$props.errorsOpened, + clickHandler = _this$props.clickHandler; + var errorsLength = errors.length; + if (errorsLength === 0 || !errorsOpened) { + return null; } - var events = this._ev[event]; - if (events) { - events.forEach(function (listener) { - return listener.apply(_this2, args); + var inAlertsTray = this.props.inAlertsTray; + var cardClasses = 'dash-error-card dash-error-card--container'; + var errorElements = errors.map(function (error, i) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FrontEndError_react__WEBPACK_IMPORTED_MODULE_3__.FrontEndError, { + e: error, + isListItem: true, + key: i }); + }); + if (inAlertsTray) { + cardClasses += ' dash-error-card--alerts-tray'; } - } - }, { - key: "once", - value: function once(event, listener) { - var _this3 = this; - var remove = this.on(event, function () { - remove(); - for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: cardClasses + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-error-card__topbar" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-error-card__message" + }, "\uD83D\uDED1 Errors (", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("strong", { + className: "test-devtools-error-count" + }, errorsLength), ")", connected ? null : "\xA0 \uD83D\uDEAB Server Unavailable"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-fe-error__icon-x", + onClick: function onClick() { + return clickHandler(); } - listener.apply(_this3, args); - }); + }, "\xD7")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-error-card__list" + }, errorElements)); } }]); - return EventEmitter; -}(); + return FrontEndErrorContainer; +}(react__WEBPACK_IMPORTED_MODULE_0__.Component); +FrontEndErrorContainer.propTypes = { + id: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string), + errors: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array), + connected: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool), + inAlertsTray: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().any), + errorsOpened: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().any), + clickHandler: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func) +}; +FrontEndErrorContainer.propTypes = { + inAlertsTray: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().any) +}; + /***/ }), -/***/ "./src/checkPropTypes.js": -/*!*******************************!*\ - !*** ./src/checkPropTypes.js ***! - \*******************************/ +/***/ "./src/components/error/GlobalErrorContainer.react.js": +/*!************************************************************!*\ + !*** ./src/components/error/GlobalErrorContainer.react.js ***! + \************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ checkPropTypes; } -/* harmony export */ }); -/* harmony import */ var prop_types_lib_ReactPropTypesSecret__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types/lib/ReactPropTypesSecret */ "./node_modules/prop-types/lib/ReactPropTypesSecret.js"); -/* harmony import */ var prop_types_lib_ReactPropTypesSecret__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types_lib_ReactPropTypesSecret__WEBPACK_IMPORTED_MODULE_0__); -/* - * Copied out of prop-types and modified - inspired by check-prop-types, but - * simplified and tweaked to our needs: we don't need the NODE_ENV check, - * we report all errors, not just the first one, and we don't need the throwing - * variant `assertPropTypes`. - */ +/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "prop-types"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _menu_DebugMenu_react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./menu/DebugMenu.react */ "./src/components/error/menu/DebugMenu.react.js"); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } -/** - * Assert that the values match with the type specs. - * - * @param {object} typeSpecs Map of name to a ReactPropType - * @param {object} values Runtime values that need to be type-checked - * @param {string} location e.g. "prop", "context", "child context" - * @param {string} componentName Name of the component for error messages. - * @param {?Function} getStack Returns the component stack. - * @return {string} Any error message resulting from checking the types - */ -function checkPropTypes(typeSpecs, values, location, componentName) { - var getStack = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null; - var errors = []; - for (var typeSpecName in typeSpecs) { - if (typeSpecs.hasOwnProperty(typeSpecName)) { - var error = void 0; - // Prop type validation may throw. In case they do, we don't want to - // fail the render phase where it didn't fail before. So we log it. - // After these have been cleaned up, we'll let them throw. - try { - // This is intentionally an invariant that gets caught. It's the same - // behavior as without this statement except with a better message. - if (typeof typeSpecs[typeSpecName] !== 'function') { - error = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'); - error.name = 'Invariant Violation'; - } else { - error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, (prop_types_lib_ReactPropTypesSecret__WEBPACK_IMPORTED_MODULE_0___default())); - } - } catch (ex) { - error = ex; - } - if (error && !(error instanceof Error)) { - errors.push((componentName || 'React class') + ': type specification of ' + location + ' `' + typeSpecName + '` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).'); - } - if (error instanceof Error) { - var stack = getStack && getStack() || ''; - errors.push('Failed ' + location + ' type: ' + error.message + stack); - } - } + + +var UnconnectedGlobalErrorContainer = /*#__PURE__*/function (_Component) { + _inherits(UnconnectedGlobalErrorContainer, _Component); + var _super = _createSuper(UnconnectedGlobalErrorContainer); + function UnconnectedGlobalErrorContainer(props) { + _classCallCheck(this, UnconnectedGlobalErrorContainer); + return _super.call(this, props); } - return errors.join('\n\n'); -} + _createClass(UnconnectedGlobalErrorContainer, [{ + key: "render", + value: function render() { + var _this$props = this.props, + config = _this$props.config, + error = _this$props.error, + children = _this$props.children; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { + id: "_dash-global-error-container" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_menu_DebugMenu_react__WEBPACK_IMPORTED_MODULE_3__.DebugMenu, { + error: error, + hotReload: Boolean(config.hot_reload) + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { + id: "_dash-app-content" + }, children))); + } + }]); + return UnconnectedGlobalErrorContainer; +}(react__WEBPACK_IMPORTED_MODULE_1__.Component); +UnconnectedGlobalErrorContainer.propTypes = { + children: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object), + config: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object), + error: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object) +}; +var GlobalErrorContainer = (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(function (state) { + return { + config: state.config, + error: state.error + }; +})(UnconnectedGlobalErrorContainer); +/* harmony default export */ __webpack_exports__["default"] = (GlobalErrorContainer); /***/ }), -/***/ "./src/components/core/Loading.react.js": -/*!**********************************************!*\ - !*** ./src/components/core/Loading.react.js ***! - \**********************************************/ +/***/ "./src/components/error/GlobalErrorOverlay.react.js": +/*!**********************************************************!*\ + !*** ./src/components/error/GlobalErrorOverlay.react.js ***! + \**********************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "prop-types"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ GlobalErrorOverlay; } +/* harmony export */ }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "prop-types"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/concat.js"); +/* harmony import */ var _GlobalErrorOverlay_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./GlobalErrorOverlay.css */ "./src/components/error/GlobalErrorOverlay.css"); +/* harmony import */ var _FrontEnd_FrontEndErrorContainer_react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FrontEnd/FrontEndErrorContainer.react */ "./src/components/error/FrontEnd/FrontEndErrorContainer.react.js"); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } -function Loading(props) { - if (props.isLoading) { - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { - className: "_dash-loading-callback" - }); + + +var GlobalErrorOverlay = /*#__PURE__*/function (_Component) { + _inherits(GlobalErrorOverlay, _Component); + var _super = _createSuper(GlobalErrorOverlay); + function GlobalErrorOverlay(props) { + _classCallCheck(this, GlobalErrorOverlay); + return _super.call(this, props); } - return null; -} -Loading.propTypes = { - isLoading: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired + _createClass(GlobalErrorOverlay, [{ + key: "render", + value: function render() { + var _this$props = this.props, + visible = _this$props.visible, + error = _this$props.error, + errorsOpened = _this$props.errorsOpened, + clickHandler = _this$props.clickHandler; + var frontEndErrors; + if (errorsOpened) { + var errors = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(error.frontEnd, error.backEnd); + frontEndErrors = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FrontEnd_FrontEndErrorContainer_react__WEBPACK_IMPORTED_MODULE_3__.FrontEndErrorContainer, { + errors: errors, + connected: error.backEndConnected, + errorsOpened: errorsOpened, + clickHandler: clickHandler + }); + } + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, this.props.children), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-error-menu" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: visible ? 'dash-fe-errors' : '' + }, frontEndErrors))); + } + }]); + return GlobalErrorOverlay; +}(react__WEBPACK_IMPORTED_MODULE_0__.Component); + +GlobalErrorOverlay.propTypes = { + children: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), + visible: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().bool), + error: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), + errorsOpened: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().any), + clickHandler: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func) }; -/* harmony default export */ __webpack_exports__["default"] = ((0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(function (state) { - return { - isLoading: state.isLoading - }; -})(Loading)); /***/ }), -/***/ "./src/components/core/Reloader.react.js": -/*!***********************************************!*\ - !*** ./src/components/core/Reloader.react.js ***! - \***********************************************/ +/***/ "./src/components/error/menu/DebugMenu.react.js": +/*!******************************************************!*\ + !*** ./src/components/error/menu/DebugMenu.react.js ***! + \******************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "prop-types"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); -/* harmony import */ var _actions_api__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../actions/api */ "./src/actions/api.js"); -function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ DebugMenu: function() { return /* binding */ DebugMenu; } +/* harmony export */ }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "prop-types"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _DebugMenu_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./DebugMenu.css */ "./src/components/error/menu/DebugMenu.css"); +/* harmony import */ var _icons_BellIcon_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../icons/BellIcon.svg */ "./src/components/error/icons/BellIcon.svg"); +/* harmony import */ var _icons_CheckIcon_svg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../icons/CheckIcon.svg */ "./src/components/error/icons/CheckIcon.svg"); +/* harmony import */ var _icons_ClockIcon_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../icons/ClockIcon.svg */ "./src/components/error/icons/ClockIcon.svg"); +/* harmony import */ var _icons_DebugIcon_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../icons/DebugIcon.svg */ "./src/components/error/icons/DebugIcon.svg"); +/* harmony import */ var _icons_GraphIcon_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../icons/GraphIcon.svg */ "./src/components/error/icons/GraphIcon.svg"); +/* harmony import */ var _icons_OffIcon_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../icons/OffIcon.svg */ "./src/components/error/icons/OffIcon.svg"); +/* harmony import */ var _GlobalErrorOverlay_react__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../GlobalErrorOverlay.react */ "./src/components/error/GlobalErrorOverlay.react.js"); +/* harmony import */ var _CallbackGraph_CallbackGraphContainer_react__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../CallbackGraph/CallbackGraphContainer.react */ "./src/components/error/CallbackGraph/CallbackGraphContainer.react.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } @@ -5955,1984 +6336,1382 @@ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.g -var Reloader = /*#__PURE__*/function (_React$Component) { - _inherits(Reloader, _React$Component); - var _super = _createSuper(Reloader); - function Reloader(props) { + + + + + + +var classes = function classes(base, variant, variant2) { + return "".concat(base, " ").concat(base, "--").concat(variant) + (variant2 ? " ".concat(base, "--").concat(variant2) : ''); +}; +var buttonFactory = function buttonFactory(enabled, buttonVariant, toggle, _Icon, iconVariant, label) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-debug-menu__button-container" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: classes('dash-debug-menu__button', buttonVariant, enabled && 'enabled'), + onClick: toggle + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Icon, { + className: classes('dash-debug-menu__icon', iconVariant) + }), label ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { + className: "dash-debug-menu__button-label" + }, label) : null)); +}; +var DebugMenu = /*#__PURE__*/function (_Component) { + _inherits(DebugMenu, _Component); + var _super = _createSuper(DebugMenu); + function DebugMenu(props) { var _this; - _classCallCheck(this, Reloader); + _classCallCheck(this, DebugMenu); _this = _super.call(this, props); - if (props.config.hot_reload) { - var _props$config$hot_rel = props.config.hot_reload, - interval = _props$config$hot_rel.interval, - max_retry = _props$config$hot_rel.max_retry; - _this.state = { - interval, - disabled: false, - intervalId: null, - packages: null, - max_retry - }; - } else { - _this.state = { - disabled: true - }; - } - _this._retry = 0; - _this._head = document.querySelector('head'); - _this.clearInterval = _this.clearInterval.bind(_assertThisInitialized(_this)); + _this.state = { + opened: false, + callbackGraphOpened: false, + errorsOpened: true + }; return _this; } - _createClass(Reloader, [{ - key: "clearInterval", - value: function clearInterval() { - window.clearInterval(this.state.intervalId); - this.setState({ - intervalId: null + _createClass(DebugMenu, [{ + key: "render", + value: function render() { + var _this2 = this; + var _this$state = this.state, + opened = _this$state.opened, + errorsOpened = _this$state.errorsOpened, + callbackGraphOpened = _this$state.callbackGraphOpened; + var _this$props = this.props, + error = _this$props.error, + hotReload = _this$props.hotReload; + var errCount = error.frontEnd.length + error.backEnd.length; + var connected = error.backEndConnected; + var toggleErrors = function toggleErrors() { + _this2.setState({ + errorsOpened: !errorsOpened + }); + }; + var status = hotReload ? connected ? 'available' : 'unavailable' : 'cold'; + var _StatusIcon = hotReload ? connected ? _icons_CheckIcon_svg__WEBPACK_IMPORTED_MODULE_4__["default"] : _icons_OffIcon_svg__WEBPACK_IMPORTED_MODULE_8__["default"] : _icons_ClockIcon_svg__WEBPACK_IMPORTED_MODULE_5__["default"]; + var menuContent = opened ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-debug-menu__content" + }, callbackGraphOpened ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_CallbackGraph_CallbackGraphContainer_react__WEBPACK_IMPORTED_MODULE_10__.CallbackGraphContainer, null) : null, buttonFactory(callbackGraphOpened, 'callbacks', function () { + _this2.setState({ + callbackGraphOpened: !callbackGraphOpened + }); + }, _icons_GraphIcon_svg__WEBPACK_IMPORTED_MODULE_7__["default"], 'graph', 'Callbacks'), buttonFactory(errorsOpened, 'errors', toggleErrors, _icons_BellIcon_svg__WEBPACK_IMPORTED_MODULE_3__["default"], 'bell', errCount + ' Error' + (errCount === 1 ? '' : 's')), buttonFactory(false, status, null, _StatusIcon, 'indicator', 'Server')) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-debug-menu__content" }); - } - }, { - key: "componentDidUpdate", - value: function componentDidUpdate(prevProps, prevState) { - var reloadRequest = this.state.reloadRequest; - var dispatch = this.props.dispatch; - - // In the beginning, reloadRequest won't be defined - if (!reloadRequest) { - return; - } - - /* - * When reloadRequest is first defined, prevState won't be defined - * for one render loop. - * The first reloadRequest defines the initial/baseline hash - - * it doesn't require a reload - */ - if (!(0,ramda__WEBPACK_IMPORTED_MODULE_0__.has)('reloadRequest', prevState)) { - return; - } - if (reloadRequest.status === 200 && (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(['content', 'reloadHash'], reloadRequest) !== (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(['reloadRequest', 'content', 'reloadHash'], prevState)) { - // Check for CSS (!content.hard) or new package assets - if (reloadRequest.content.hard || !(0,ramda__WEBPACK_IMPORTED_MODULE_0__.equals)(reloadRequest.content.packages.length, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.pathOr)([], ['reloadRequest', 'content', 'packages'], prevState).length) || !(0,ramda__WEBPACK_IMPORTED_MODULE_0__.equals)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.sort)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.comparator)(ramda__WEBPACK_IMPORTED_MODULE_0__.lt), reloadRequest.content.packages), (0,ramda__WEBPACK_IMPORTED_MODULE_0__.sort)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.comparator)(ramda__WEBPACK_IMPORTED_MODULE_0__.lt), (0,ramda__WEBPACK_IMPORTED_MODULE_0__.pathOr)([], ['reloadRequest', 'content', 'packages'], prevState)))) { - // Look if it was a css file. - var was_css = false; - // eslint-disable-next-line prefer-const - var _iterator = _createForOfIteratorHelper(reloadRequest.content.files), - _step; - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var a = _step.value; - if (a.is_css) { - was_css = true; - var nodesToDisable = []; - - // Search for the old file by xpath. - var it = document.evaluate("//link[contains(@href, \"".concat(a.url, "\")]"), this._head); - var node = it.iterateNext(); - while (node) { - nodesToDisable.push(node); - node = it.iterateNext(); - } - (0,ramda__WEBPACK_IMPORTED_MODULE_0__.forEach)(function (n) { - return n.setAttribute('disabled', 'disabled'); - }, nodesToDisable); - if (a.modified > 0) { - var link = document.createElement('link'); - link.href = "".concat(a.url, "?m=").concat(a.modified); - link.type = 'text/css'; - link.rel = 'stylesheet'; - this._head.appendChild(link); - // Else the file was deleted. - } - } else { - // If there's another kind of file here do a hard reload. - was_css = false; - break; - } - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - if (!was_css) { - // Assets file have changed - // or a component lib has been added/removed - - // Must do a hard reload - window.location.reload(); - } - } else { - // Backend code changed - can do a soft reload in place - dispatch({ - type: 'RELOAD' + var alertsLabel = (errCount || !connected) && !opened ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-debug-alert-label" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-debug-alert", + onClick: toggleErrors + }, errCount ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-debug-error-count" + }, '🛑 ' + errCount) : null, connected ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-debug-disconnected" + }, "\uD83D\uDEAB"))) : null; + var openVariant = opened ? 'open' : 'closed'; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, alertsLabel, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: classes('dash-debug-menu__outer', openVariant) + }, menuContent), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: classes('dash-debug-menu', openVariant), + onClick: function onClick() { + _this2.setState({ + opened: !opened }); } - } else if (this.state.intervalId !== null && reloadRequest.status === 500) { - if (this._retry > this.state.max_retry) { - this.clearInterval(); - // Integrate with dev tools ui?! - window.alert("Hot reloading is disabled after failing ".concat(this._retry, " times. ") + 'Please check your application for errors, then refresh the page.'); - } - this._retry++; - } - } - }, { - key: "componentDidMount", - value: function componentDidMount() { - var _this$props = this.props, - dispatch = _this$props.dispatch, - reloadRequest = _this$props.reloadRequest; - var _this$state = this.state, - disabled = _this$state.disabled, - interval = _this$state.interval; - if (!disabled && !this.state.intervalId) { - var intervalId = window.setInterval(function () { - // Prevent requests from piling up - reloading can take - // many seconds (10-30) and the interval is 3s by default - if (reloadRequest.status !== 'loading') { - dispatch((0,_actions_api__WEBPACK_IMPORTED_MODULE_4__["default"])('_reload-hash', 'GET', 'reloadRequest')); - } - }, interval); - this.setState({ - intervalId - }); - } - } - }, { - key: "componentWillUnmount", - value: function componentWillUnmount() { - if (!this.state.disabled && this.state.intervalId) { - this.clearInterval(); - } - } - }, { - key: "render", - value: function render() { - return null; - } - }], [{ - key: "getDerivedStateFromProps", - value: function getDerivedStateFromProps(props) { - /* - * Save the non-loading requests in the state in order to compare - * current hashes with previous hashes. - * Note that if there wasn't a "loading" state for the requests, - * then we could simply compare `props` with `prevProps` in - * `componentDidUpdate`. - */ - if (!(0,ramda__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(props.reloadRequest) && props.reloadRequest.status !== 'loading') { - return { - reloadRequest: props.reloadRequest - }; - } - return null; + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_DebugIcon_svg__WEBPACK_IMPORTED_MODULE_6__["default"], { + className: classes('dash-debug-menu__icon', 'debug') + })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_GlobalErrorOverlay_react__WEBPACK_IMPORTED_MODULE_9__["default"], { + error: error, + visible: errCount > 0, + errorsOpened: errorsOpened, + clickHandler: toggleErrors + }, this.props.children)); } }]); - return Reloader; -}((react__WEBPACK_IMPORTED_MODULE_1___default().Component)); -Reloader.defaultProps = {}; -Reloader.propTypes = { - id: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string), - config: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object), - reloadRequest: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object), - dispatch: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func), - interval: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number) + return DebugMenu; +}(react__WEBPACK_IMPORTED_MODULE_0__.Component); +DebugMenu.propTypes = { + children: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), + error: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), + hotReload: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().bool) }; -/* harmony default export */ __webpack_exports__["default"] = ((0,react_redux__WEBPACK_IMPORTED_MODULE_3__.connect)(function (state) { - return { - config: state.config, - reloadRequest: state.reloadRequest - }; -}, function (dispatch) { - return { - dispatch - }; -})(Reloader)); + /***/ }), -/***/ "./src/components/core/Toolbar.react.js": -/*!**********************************************!*\ - !*** ./src/components/core/Toolbar.react.js ***! - \**********************************************/ +/***/ "./src/components/error/werkzeugcss.js": +/*!*********************************************!*\ + !*** ./src/components/error/werkzeugcss.js ***! + \*********************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "prop-types"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _actions_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../actions/index.js */ "./src/actions/index.js"); -/* harmony import */ var _Toolbar_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Toolbar.css */ "./src/components/core/Toolbar.css"); - +// Werkzeug css included as a string, because we want to inject +// it into an iframe srcDoc +/* harmony default export */ __webpack_exports__["default"] = ("\nbody {\n margin: 0px;\n margin-top: 10px;\n}\n\n.error-container {\n font-family: Roboto;\n}\n\n.traceback {\n background-color: white;\n border: 2px solid #dfe8f3;\n border-radius: 0px 0px 4px 4px;\n color: #506784;\n}\n\nh2.traceback {\n background-color: #f3f6fa;\n border: 2px solid #dfe8f3;\n border-bottom: 0px;\n box-sizing: border-box;\n border-radius: 4px 4px 0px 0px;\n color: #506784;\n}\n\nh2.traceback em {\n color: #506784;\n font-weight: 100;\n}\n\n.traceback pre, .debugger textarea {\n background-color: #F3F6FA;\n}\n\n.debugger h1 {\n color: #506784;\n font-family: Roboto;\n}\n\n.explanation {\n color: #A2B1C6;\n}\n\n/* Hide the Don't Panic! footer */\n.debugger .footer {\n display: none;\n}\n\n/* Hide all of the Dash traceback stuff that leads up to the call */\n.line.before {\n display: none;\n}\n\ndiv.debugger {\n padding: 0px;\n}\n\n.debugger h1 {\n display: none;\n}\n\n.debugger .errormsg {\n margin: 0;\n color: #506784;\n font-size: 16px;\n background-color: #f3f6fa;\n border: 2px solid #dfe8f3;\n box-sizing: border-box;\n border-radius: 4px;\n padding: 10px;\n}\n\n.debugger .pastemessage input {\n display: none;\n}\n\n.debugger .explanation {\n display: none;\n}\n\n.debugger div.plain {\n border-radius: 4px;\n border-width: 2px;\n color: #506784;\n}\n\n.plain {\n display: block !important;\n}\n.plain > form > p {\n display: none;\n}\n.plain pre {\n padding: 15px !important;\n overflow-x: scroll;\n}\n\n.debugger div.traceback pre {\n cursor: default;\n}\n\n.debugger .traceback .source pre.line img {\n display: none;\n}\n"); +/***/ }), +/***/ "./src/config.ts": +/*!***********************!*\ + !*** ./src/config.ts ***! + \***********************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { -function UnconnectedToolbar(props) { - var dispatch = props.dispatch, - history = props.history; - var undoLink = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("span", { - key: "undoLink", - className: "_dash-undo-redo-link", - onClick: function onClick() { - return dispatch(_actions_index_js__WEBPACK_IMPORTED_MODULE_3__.undo); - } - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { - className: "_dash-icon-undo" - }, "\u21BA"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { - className: "_dash-undo-redo-label" - }, "undo")); - var redoLink = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("span", { - key: "redoLink", - className: "_dash-undo-redo-link", - onClick: function onClick() { - return dispatch(_actions_index_js__WEBPACK_IMPORTED_MODULE_3__.redo); - } - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { - className: "_dash-icon-redo" - }, "\u21BB"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { - className: "_dash-undo-redo-label" - }, "redo")); - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { - className: "_dash-undo-redo" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", null, history.past.length > 0 ? undoLink : null, history.future.length > 0 ? redoLink : null)); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ getConfigFromDOM; } +/* harmony export */ }); +function getConfigFromDOM() { + var configElement = document.getElementById('_dash-config'); + return JSON.parse(configElement !== null && configElement !== void 0 && configElement.textContent ? configElement === null || configElement === void 0 ? void 0 : configElement.textContent : '{}'); } -UnconnectedToolbar.propTypes = { - history: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object), - dispatch: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func) -}; -var Toolbar = (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(function (state) { - return { - history: state.history - }; -}, function (dispatch) { - return { - dispatch - }; -})(UnconnectedToolbar); -/* harmony default export */ __webpack_exports__["default"] = (Toolbar); /***/ }), -/***/ "./src/components/error/CallbackGraph/CallbackGraphContainer.react.js": -/*!****************************************************************************!*\ - !*** ./src/components/error/CallbackGraph/CallbackGraphContainer.react.js ***! - \****************************************************************************/ +/***/ "./src/constants/constants.js": +/*!************************************!*\ + !*** ./src/constants/constants.js ***! + \************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ CallbackGraphContainer: function() { return /* binding */ CallbackGraphContainer; } +/* harmony export */ JWT_EXPIRED_MESSAGE: function() { return /* binding */ JWT_EXPIRED_MESSAGE; }, +/* harmony export */ OAUTH_COOKIE_NAME: function() { return /* binding */ OAUTH_COOKIE_NAME; }, +/* harmony export */ REDIRECT_URI_PATHNAME: function() { return /* binding */ REDIRECT_URI_PATHNAME; }, +/* harmony export */ STATUS: function() { return /* binding */ STATUS; }, +/* harmony export */ STATUSMAP: function() { return /* binding */ STATUSMAP; } /* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "prop-types"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); -/* harmony import */ var cytoscape__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! cytoscape */ "./node_modules/cytoscape/dist/cytoscape.cjs.js"); -/* harmony import */ var cytoscape__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(cytoscape__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var react_cytoscapejs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-cytoscapejs */ "./node_modules/react-cytoscapejs/dist/react-cytoscape.modern.js"); -/* harmony import */ var cytoscape_dagre__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! cytoscape-dagre */ "./node_modules/cytoscape-dagre/cytoscape-dagre.js"); -/* harmony import */ var cytoscape_dagre__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(cytoscape_dagre__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var cytoscape_fcose__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! cytoscape-fcose */ "./node_modules/cytoscape-fcose/cytoscape-fcose.js"); -/* harmony import */ var cytoscape_fcose__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(cytoscape_fcose__WEBPACK_IMPORTED_MODULE_6__); -/* harmony import */ var react_json_tree__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! react-json-tree */ "./node_modules/react-json-tree/lib/esm/index.js"); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var _actions_paths__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../actions/paths */ "./src/actions/paths.js"); -/* harmony import */ var _actions_dependencies__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../actions/dependencies */ "./src/actions/dependencies.js"); -/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../actions */ "./src/actions/index.js"); -/* harmony import */ var _CallbackGraphContainer_css__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./CallbackGraphContainer.css */ "./src/components/error/CallbackGraph/CallbackGraphContainer.css"); -/* harmony import */ var _CallbackGraphContainerStylesheet__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./CallbackGraphContainerStylesheet */ "./src/components/error/CallbackGraph/CallbackGraphContainerStylesheet.js"); -/* harmony import */ var _CallbackGraphEffects__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./CallbackGraphEffects */ "./src/components/error/CallbackGraph/CallbackGraphEffects.js"); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } -function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } -function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } -function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } -function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } -function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } -function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } -function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } -function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } -function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } - - - +var REDIRECT_URI_PATHNAME = '/_oauth2/callback'; +var OAUTH_COOKIE_NAME = 'plotly_oauth_token'; +var JWT_EXPIRED_MESSAGE = 'JWT Expired'; +var STATUS = { + OK: 200, + PREVENT_UPDATE: 204, + // We accept both 400 and 401 for JWT token expiry responses. + // Some servers use code 400 for expired tokens, because + // they reserve 401 for cases that require user action + BAD_REQUEST: 400, + UNAUTHORIZED: 401, + CLIENTSIDE_ERROR: 'CLIENTSIDE_ERROR', + NO_RESPONSE: 'NO_RESPONSE' +}; +var STATUSMAP = { + [STATUS.OK]: 'SUCCESS', + [STATUS.PREVENT_UPDATE]: 'NO_UPDATE' +}; +/***/ }), +/***/ "./src/exceptions.js": +/*!***************************!*\ + !*** ./src/exceptions.js ***! + \***************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ propTypeErrorHandler: function() { return /* binding */ propTypeErrorHandler; } +/* harmony export */ }); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/includes.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/has.js"); +function propTypeErrorHandler(message, props, type) { + /* + * propType error messages are constructed in + * https://github.com/facebook/prop-types/blob/v15.7.2/factoryWithTypeCheckers.js + * (Version 15.7.2) + * + * Parse these exception objects to remove JS source code and improve + * the clarity. + * + * If wrong prop type was passed in, message looks like: + * + * Error: "Failed component prop type: Invalid component prop `animate` of type `number` supplied to `function GraphWithDefaults(props) { + * var id = props.id ? props.id : generateId(); + * return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(PlotlyGraph, _extends({}, props, { + * id: id + * })); + * }`, expected `boolean`." + * + * + * If a required prop type was omitted, message looks like: + * + * "Failed component prop type: The component prop `options[0].value` is marked as required in `function Checklist(props) { + * var _this; + * + * _classCallCheck(this, Checklist); + * + * _this = _possibleConstructorReturn(this, _getPrototypeOf(Checklist).call(this, props)); + * _this.state = { + * values: props.values + * }; + * return _this; + * }`, but its value is `undefined`." + * + */ + var messageParts = message.split('`'); + var errorMessage; + if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])('is marked as required', message)) { + var invalidPropPath = messageParts[1]; + errorMessage = "".concat(invalidPropPath, " in ").concat(type); + if (props.id) { + errorMessage += " with ID \"".concat(props.id, "\""); + } + errorMessage += ' is required but it was not provided.'; + } else if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])('Bad object', message)) { + /* + * Handle .exact errors + * https://github.com/facebook/prop-types/blob/v15.7.2/factoryWithTypeCheckers.js#L438-L442 + */ + errorMessage = message.split('supplied to ')[0] + "supplied to ".concat(type) + '.\nBad' + message.split('.\nBad')[1]; + } else if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])('Invalid ', message) && (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(' supplied to ', message)) { + var _invalidPropPath = messageParts[1]; + errorMessage = "Invalid argument `".concat(_invalidPropPath, "` passed into ").concat(type); + if (props.id) { + errorMessage += " with ID \"".concat(props.id, "\""); + } + errorMessage += '.'; + /* + * Not all error messages include the expected value. + * In particular, oneOfType. + * https://github.com/facebook/prop-types/blob/v15.7.2/factoryWithTypeCheckers.js#L388 + */ + if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(', expected ', message)) { + var expectedPropType = message.split(', expected ')[1]; + errorMessage += "\nExpected ".concat(expectedPropType); + } + /* + * Not all error messages include the type + * In particular, oneOfType. + * https://github.com/facebook/prop-types/blob/v15.7.2/factoryWithTypeCheckers.js#L388 + */ + if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(' of type `', message)) { + var invalidPropTypeProvided = message.split(' of type `')[1].split('`')[0]; + errorMessage += "\nWas supplied type `".concat(invalidPropTypeProvided, "`."); + } + if ((0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(_invalidPropPath, props)) { + /* + * invalidPropPath may be nested like `options[0].value`. + * For now, we won't try to unpack these nested options + * but we could in the future. + */ + var jsonSuppliedValue = JSON.stringify(props[_invalidPropPath], null, 2); + if (jsonSuppliedValue) { + if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])('\n', jsonSuppliedValue)) { + errorMessage += "\nValue provided: \n".concat(jsonSuppliedValue); + } else { + errorMessage += "\nValue provided: ".concat(jsonSuppliedValue); + } + } + } + } else { + /* + * Not aware of other prop type warning messages. + * But, if they exist, then at least throw the default + * react prop types error + */ + throw new Error(message); + } + throw new Error(errorMessage); +} +/***/ }), +/***/ "./src/isSimpleComponent.js": +/*!**********************************!*\ + !*** ./src/isSimpleComponent.js ***! + \**********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/includes.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/type.js"); +var SIMPLE_COMPONENT_TYPES = ['String', 'Number', 'Null', 'Boolean']; +/* harmony default export */ __webpack_exports__["default"] = (function (component) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(component), SIMPLE_COMPONENT_TYPES); +}); -cytoscape__WEBPACK_IMPORTED_MODULE_3___default().use((cytoscape_dagre__WEBPACK_IMPORTED_MODULE_5___default())); -cytoscape__WEBPACK_IMPORTED_MODULE_3___default().use((cytoscape_fcose__WEBPACK_IMPORTED_MODULE_6___default())); +/***/ }), -/* - * Generates all the elements (nodes, edges) for the dependency graph. - */ -function generateElements(graphs, profile, extraLinks) { - var consumed = []; - var elements = []; - var structure = {}; - function recordNode(id, rawProperty) { - var property = rawProperty.split('@')[0]; - var idStr = (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_9__.stringifyId)(id); - var idType = typeof id === 'object' ? 'wildcard' : 'component'; +/***/ "./src/observers/documentTitle.ts": +/*!****************************************!*\ + !*** ./src/observers/documentTitle.ts ***! + \****************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - // dagre layout has problems with eg `width` property - so prepend an X - var parentId = idStr; - var childId = "".concat(parentId, ".X").concat(property); - if (!consumed.includes(parentId)) { - consumed.push(parentId); - elements.push({ - data: { - id: parentId, - label: idStr, - type: idType - } - }); - structure[parentId] = []; - } - if (!consumed.includes(childId)) { - consumed.push(childId); - elements.push({ - data: { - id: childId, - label: property, - parent: parentId, - type: 'property' - } - }); - structure[parentId].push(childId); - } - return childId; - } - function recordEdge(source, target, type) { - elements.push({ - data: { - source: source, - target: target, - type: type - } - }); - } - (graphs.callbacks || []).forEach(function (callback, i) { - var cb = "__dash_callback__.".concat(callback.output); - var cbProfile = profile.callbacks[callback.output] || {}; - var count = cbProfile.count || 0; - var time = cbProfile.total || 0; - elements.push({ - data: { - id: cb, - label: "callback.".concat(i), - type: 'callback', - mode: callback.clientside_function ? 'client' : 'server', - count: count, - time: count > 0 ? Math.round(time / count) : 0, - loadingSet: Date.now(), - errorSet: Date.now() - } - }); - callback.outputs.map(function (_ref) { - var id = _ref.id, - property = _ref.property; - var nodeId = recordNode(id, property); - recordEdge(cb, nodeId, 'output'); - }); - callback.inputs.map(function (_ref2) { - var id = _ref2.id, - property = _ref2.property; - var nodeId = recordNode(id, property); - recordEdge(nodeId, cb, 'input'); - }); - callback.state.map(function (_ref3) { - var id = _ref3.id, - property = _ref3.property; - var nodeId = recordNode(id, property); - recordEdge(nodeId, cb, 'state'); - }); - }); - - // pull together props in the same component - if (extraLinks) { - (0,ramda__WEBPACK_IMPORTED_MODULE_7__.values)(structure).forEach(function (childIds) { - childIds.forEach(function (childFrom) { - childIds.forEach(function (childTo) { - if (childFrom !== childTo) { - recordEdge(childFrom, childTo, 'hidden'); - } - }); - }); - }); - } - return elements; -} -function reduceStatus(status) { - if ((0,ramda__WEBPACK_IMPORTED_MODULE_7__.keys)(status).length === 2) { - return status.latest; +"use strict"; +__webpack_require__.r(__webpack_exports__); +var updateTitle = function updateTitle(getState) { + var _getState = getState(), + config = _getState.config, + isLoading = _getState.isLoading; + var update_title = config === null || config === void 0 ? void 0 : config.update_title; + if (!update_title) { + return; } - return status; -} -function flattenOutputs(res) { - var outputs = {}; - for (var idStr in res) { - for (var prop in res[idStr]) { - outputs[idStr + '.' + prop] = res[idStr][prop]; + if (isLoading) { + if (document.title !== update_title) { + _observer.title = document.title; + document.title = update_title; } - } - return outputs; -} -function flattenInputs(inArray, final) { - (inArray || []).forEach(function (inItem) { - if (Array.isArray(inItem)) { - flattenInputs(inItem, final); + } else { + if (document.title === update_title) { + document.title = _observer.title; } else { - var id = inItem.id, - property = inItem.property, - value = inItem.value; - final[(0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_9__.stringifyId)(id) + '.' + property] = value; + _observer.title = document.title; } - }); - return final; -} -function cleanOutputId(outputId) { - return outputId.replace(/(^\.\.|\.\.$)/g, '').split('...').reduce(function (agg, next) { - return agg.concat(next.replace(/(.*\..*)(@.+)$/, function (a, b) { - return b + ' (Duplicate)'; - })); - }, []).join('...'); -} - -// len('__dash_callback__.') -var cbPrefixLen = 18; -var dagreLayout = { - name: 'dagre', - padding: 10, - ranker: 'tight-tree' -}; -var forceLayout = { - name: 'fcose', - padding: 10, - animate: false + } }; -var layouts = { - 'top-down': _objectSpread(_objectSpread({}, dagreLayout), {}, { - spacingFactor: 0.8 - }), - 'left-right': _objectSpread(_objectSpread({}, dagreLayout), {}, { - nodeSep: 0, - rankSep: 80, - rankDir: 'LR' - }), - force: forceLayout, - 'force-loose': forceLayout +var _observer = { + inputs: ['isLoading'], + mutationObserver: undefined, + observer: function observer(_ref) { + var getState = _ref.getState; + var _getState2 = getState(), + config = _getState2.config; + if (_observer.config !== config) { + var _observer$mutationObs; + _observer.config = config; + (_observer$mutationObs = _observer.mutationObserver) === null || _observer$mutationObs === void 0 || _observer$mutationObs.disconnect(); + _observer.mutationObserver = new MutationObserver(function () { + return updateTitle(getState); + }); + var title = document.querySelector('title'); + if (title) { + _observer.mutationObserver.observe(title, { + subtree: true, + childList: true, + attributes: true, + characterData: true + }); + } + } + updateTitle(getState); + } }; -function CallbackGraph() { - // Grab items from the redux store. - var paths = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(function (state) { - return state.paths; - }); - var layout = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(function (state) { - return state.layout; - }); - var graphs = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(function (state) { - return state.graphs; - }); - var profile = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(function (state) { - return state.profile; - }); - var changed = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(function (state) { - return state.changed; - }); - var lifecycleState = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(function (state) { - return state.appLifecycle; - }); +/* harmony default export */ __webpack_exports__["default"] = (_observer); - // Keep track of cytoscape reference and user selected items. - var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), - _useState2 = _slicedToArray(_useState, 2), - selected = _useState2[0], - setSelected = _useState2[1]; - var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), - _useState4 = _slicedToArray(_useState3, 2), - cytoscape = _useState4[0], - setCytoscape = _useState4[1]; - var graphLayout = profile.graphLayout; - var chosenType = graphLayout === null || graphLayout === void 0 ? void 0 : graphLayout._chosenType; - var layoutSelector = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null); - var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(chosenType || 'top-down'), - _useState6 = _slicedToArray(_useState5, 2), - layoutType = _useState6[0], - setLayoutType = _useState6[1]; +/***/ }), - // Generate and memoize the elements. - var elements = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function () { - return generateElements(graphs, profile, layoutType === 'force'); - }, [graphs, layoutType]); +/***/ "./src/observers/executedCallbacks.ts": +/*!********************************************!*\ + !*** ./src/observers/executedCallbacks.ts ***! + \********************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - // Custom hook to make sure cytoscape is loaded. - var useCytoscapeEffect = function useCytoscapeEffect(effect, condition) { - (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { - return cytoscape && effect(cytoscape) || undefined; - }, condition); - }; - function getComponent(id) { - // for now ignore pattern-matching IDs - // to do better we may need to store the *actual* IDs used for each - // callback invocation, since they need not match what's on the page now. - if (id.charAt(0) === '{') { - hasPatterns = true; - return undefined; - } - var idPath = (0,_actions_paths__WEBPACK_IMPORTED_MODULE_8__.getPath)(paths, id); - return idPath ? (0,ramda__WEBPACK_IMPORTED_MODULE_7__.path)(idPath, layout) : undefined; - } - function getPropValue(data) { - var parent = getComponent(data.parent); - return parent ? parent.props[data.label] : undefined; - } - function setPresetLayout(_ref4) { - var _layoutSelector$curre; - var cy = _ref4.cy; - var positions = {}; - cy.nodes().each(function (n) { - positions[n.id()] = n.position(); - }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/concat.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/isNil.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/flatten.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/map.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/keys.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pathOr.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pickBy.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/isEmpty.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/toPairs.js"); +/* harmony import */ var _actions_callbacks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../actions/callbacks */ "./src/actions/callbacks.ts"); +/* harmony import */ var _actions_dependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../actions/dependencies */ "./src/actions/dependencies.js"); +/* harmony import */ var _actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../actions/dependencies_ts */ "./src/actions/dependencies_ts.ts"); +/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../actions */ "./src/actions/index.js"); +/* harmony import */ var _actions_paths__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../actions/paths */ "./src/actions/paths.js"); +/* harmony import */ var _persistence__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../persistence */ "./src/persistence.js"); +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - // Hack! We're mutating the redux store directly here, rather than - // dispatching an action, because we don't want this to trigger a - // rerender, we just want the layout to persist when the callback graph - // is rerendered - either because there's new profile information to - // display or because the graph was closed and reopened. The latter is - // the reason we're not using component state to store the layout. - profile.graphLayout = { - name: 'preset', - fit: false, - positions, - zoom: cy.zoom(), - pan: cy.pan(), - _chosenType: (_layoutSelector$curre = layoutSelector.current) === null || _layoutSelector$curre === void 0 ? void 0 : _layoutSelector$curre.value - }; - } - // Adds callbacks once cyctoscape is initialized. - useCytoscapeEffect(function (cy) { - cytoscape.on('tap', 'node', function (e) { - return setSelected(e.target); - }); - cytoscape.on('tap', function (e) { - if (e.target === cy) { - setSelected(null); - } - }); - cytoscape.on('zoom', setPresetLayout); - cytoscape.on('pan', setPresetLayout); - cytoscape.nodes().on('position', setPresetLayout); - }, [cytoscape]); - // Set node classes on selected. - useCytoscapeEffect(function (cy) { - return selected && (0,_CallbackGraphEffects__WEBPACK_IMPORTED_MODULE_13__.updateSelectedNode)(cy, selected.data().id); - }, [selected]); - // Flash classes when props change. Uses changed as a trigger. Also - // flash all input edges originating from this node and highlight - // the subtree that contains the selected node. - useCytoscapeEffect(function (cy) { - return changed && (0,_CallbackGraphEffects__WEBPACK_IMPORTED_MODULE_13__.updateChangedProps)(cy, changed.id, changed.props); - }, [changed]); - // Update callbacks from profiling information. - useCytoscapeEffect(function (cy) { - return profile.updated.forEach(function (cb) { - return (0,_CallbackGraphEffects__WEBPACK_IMPORTED_MODULE_13__.updateCallback)(cy, cb, profile.callbacks[cb]); - }); - }, [profile.updated]); - if (lifecycleState !== 'HYDRATED') { - // If we get here too early - most likely during hot reloading - then - // we need to bail out and wait for the full state to be available - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-callback-dag--container" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-callback-dag--message" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "Waiting for app to be ready..."))); - } - // FIXME: Move to a new component? - // Generate the element introspection data. - var elementName = ''; - var elementInfo = {}; - var hasPatterns = false; - if (selected) { - var data = selected.data(); - switch (data.type) { - case 'component': - { - var _getComponent; - var rest = (0,ramda__WEBPACK_IMPORTED_MODULE_7__.omit)(['id'], (_getComponent = getComponent(data.id)) === null || _getComponent === void 0 ? void 0 : _getComponent.props); - elementInfo = rest; - elementName = data.id; - break; - } - case 'property': - { - elementName = data.parent; - elementInfo[data.label] = getPropValue(data); - break; - } - // callback - default: - { - elementInfo.type = data.mode; +var observer = { + observer: function observer(_ref) { + var dispatch = _ref.dispatch, + getState = _ref.getState; + var _getState = getState(), + executed = _getState.callbacks.executed; + function applyProps(id, updatedProps) { + var _getState2 = getState(), + layout = _getState2.layout, + paths = _getState2.paths; + var itempath = (0,_actions_paths__WEBPACK_IMPORTED_MODULE_4__.getPath)(paths, id); + if (!itempath) { + return false; + } - // Remove uid and set profile. - var callbackOutputId = data.id.slice(cbPrefixLen); - elementName = cleanOutputId(callbackOutputId); - var cbProfile = profile.callbacks[callbackOutputId]; - if (cbProfile) { - var count = cbProfile.count, - status = cbProfile.status, - network = cbProfile.network, - resources = cbProfile.resources, - total = cbProfile.total, - compute = cbProfile.compute, - result = cbProfile.result, - inputs = cbProfile.inputs, - state = cbProfile.state; - var avg = function avg(v) { - return Math.round(v / (count || 1)); - }; - elementInfo['call count'] = count; - elementInfo.status = reduceStatus(status); - var timing = elementInfo['time (avg milliseconds)'] = { - total: avg(total), - compute: avg(compute) - }; - if (data.mode === 'server') { - timing.network = avg(network.time); - elementInfo['data transfer (avg bytes)'] = { - download: avg(network.download), - upload: avg(network.upload) - }; - } - for (var key in resources) { - timing['user: ' + key] = avg(resources[key]); - } - elementInfo.outputs = flattenOutputs(result); - elementInfo.inputs = flattenInputs(inputs, {}); - elementInfo.state = flattenInputs(state, {}); - } else { - elementInfo['call count'] = 0; - } - } - } - } - var cyLayout = chosenType === layoutType ? graphLayout : (0,ramda__WEBPACK_IMPORTED_MODULE_7__.mergeRight)(layouts[layoutType], { - ready: setPresetLayout - }); - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-callback-dag--container" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_cytoscapejs__WEBPACK_IMPORTED_MODULE_4__["default"], { - style: { - width: '100%', - height: '100%' - }, - cy: setCytoscape, - elements: elements, - layout: cyLayout, - stylesheet: _CallbackGraphContainerStylesheet__WEBPACK_IMPORTED_MODULE_12__["default"] - }), selected ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-callback-dag--info" - }, hasPatterns ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "Info isn't supported for pattern-matching IDs at this time") : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_json_tree__WEBPACK_IMPORTED_MODULE_14__.JSONTree, { - data: elementInfo, - theme: "summerfruit", - labelRenderer: function labelRenderer(_keys) { - return _keys.length === 1 ? elementName : _keys[0]; - }, - getItemString: function getItemString(type, data, itemType) { - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, itemType); - }, - shouldExpandNode: function shouldExpandNode(keyName, data, level) { - return level < 1; - } - })) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("select", { - className: "dash-callback-dag--layoutSelector", - onChange: function onChange(e) { - return setLayoutType(e.target.value); - }, - value: layoutType, - ref: layoutSelector - }, (0,ramda__WEBPACK_IMPORTED_MODULE_7__.keys)(layouts).map(function (k) { - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("option", { - value: k, - key: k - }, k); - }))); -} -CallbackGraph.propTypes = {}; -var UnconnectedCallbackGraphContainer = /*#__PURE__*/function (_Component) { - _inherits(UnconnectedCallbackGraphContainer, _Component); - var _super = _createSuper(UnconnectedCallbackGraphContainer); - function UnconnectedCallbackGraphContainer(props) { - var _this; - _classCallCheck(this, UnconnectedCallbackGraphContainer); - _this = _super.call(this, props); - _this.state = { - hasError: false - }; - return _this; - } - _createClass(UnconnectedCallbackGraphContainer, [{ - key: "componentDidCatch", - value: function componentDidCatch(error, info) { - var dispatch = this.props.dispatch; - dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_10__.onError)({ - myID: this.state.myID, - type: 'frontEnd', - error, - info + // This is a callback-generated update. + // Check if this invalidates existing persisted prop values, + // or if persistence changed, whether this updates other props. + updatedProps = (0,_persistence__WEBPACK_IMPORTED_MODULE_5__.prunePersistence)((0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(itempath, layout), updatedProps, dispatch); + + // In case the update contains whole components, see if any of + // those components have props to update to persist user edits. + var _applyPersistence = (0,_persistence__WEBPACK_IMPORTED_MODULE_5__.applyPersistence)({ + props: updatedProps + }, dispatch), + props = _applyPersistence.props; + dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_3__.updateProps)({ + itempath, + props, + source: 'response' })); + return props; } - }, { - key: "render", - value: function render() { - return this.state.hasError ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-callback-dag--container" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-callback-dag--message" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "Oops! The callback graph threw an error."), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "Check the error list for details."))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(CallbackGraph, null); - } - }], [{ - key: "getDerivedStateFromError", - value: function getDerivedStateFromError(_) { - return { - hasError: true - }; - } - }]); - return UnconnectedCallbackGraphContainer; -}(react__WEBPACK_IMPORTED_MODULE_0__.Component); -UnconnectedCallbackGraphContainer.propTypes = { - dispatch: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func) -}; -var CallbackGraphContainer = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.connect)(null, function (dispatch) { - return { - dispatch - }; -})(UnconnectedCallbackGraphContainer); + var requestedCallbacks = []; + var storedCallbacks = []; + executed.forEach(function (cb) { + var _cb$predecessors; + var predecessors = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])((_cb$predecessors = cb.predecessors) !== null && _cb$predecessors !== void 0 ? _cb$predecessors : [], [cb.callback]); + var _cb$callback = cb.callback, + clientside_function = _cb$callback.clientside_function, + output = _cb$callback.output, + executionResult = cb.executionResult; + if ((0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(executionResult)) { + return; + } + var data = executionResult.data, + error = executionResult.error, + payload = executionResult.payload; + if (data !== undefined) { + Object.entries(data).forEach(function (_ref2) { + var _ref3 = _slicedToArray(_ref2, 2), + id = _ref3[0], + props = _ref3[1]; + var parsedId = (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_1__.parseIfWildcard)(id); + var _getState3 = getState(), + graphs = _getState3.graphs, + oldLayout = _getState3.layout, + oldPaths = _getState3.paths; + // Components will trigger callbacks on their own as required (eg. derived) + var appliedProps = applyProps(parsedId, props); -/***/ }), + // Add callbacks for modified inputs + requestedCallbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(requestedCallbacks, (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function (prop) { + return (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.getCallbacksByInput)(graphs, oldPaths, parsedId, prop, true); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(props))).map(function (rcb) { + return _objectSpread(_objectSpread({}, rcb), {}, { + predecessors + }); + })); + var basePath = (0,_actions_paths__WEBPACK_IMPORTED_MODULE_4__.getPath)(oldPaths, parsedId); + if (!basePath) { + return; + } + var oldObj = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(basePath, oldLayout); + var childrenProps = (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])('defaultValue', [oldObj.namespace, oldObj.type], window.__dashprivate_childrenProps); + var handlePaths = function handlePaths(children, oldChildren, oldChildrenPath) { + var filterRoot = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + var oPaths = getState().paths; + var paths = (0,_actions_paths__WEBPACK_IMPORTED_MODULE_4__.computePaths)(children, oldChildrenPath, oPaths); + dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_3__.setPaths)(paths)); -/***/ "./src/components/error/CallbackGraph/CallbackGraphContainerStylesheet.js": -/*!********************************************************************************!*\ - !*** ./src/components/error/CallbackGraph/CallbackGraphContainerStylesheet.js ***! - \********************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + // Get callbacks for new layout (w/ execution group) + requestedCallbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(requestedCallbacks, (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.getLayoutCallbacks)(graphs, paths, children, { + chunkPath: oldChildrenPath, + filterRoot + }).map(function (rcb) { + return _objectSpread(_objectSpread({}, rcb), {}, { + predecessors + }); + })); -"use strict"; -__webpack_require__.r(__webpack_exports__); -var stylesheet = [{ - selector: '*', - style: { - 'font-size': 12, - 'font-family': '"Arial", sans-serif' - } -}, { - selector: 'edge', - style: { - width: 2, - 'line-color': '#888888', - 'target-arrow-color': '#888888', - 'target-arrow-shape': 'triangle', - 'target-arrow-fill': 'filled', - 'arrow-scale': 1, - 'curve-style': 'bezier', - 'control-point-step-size': 40, - 'transition-property': 'line-color, target-arrow-color', - 'transition-duration': '0.25s', - 'transition-timing-function': 'ease-in-out-sine' - } -}, { - selector: 'edge[type="hidden"]', - style: { - display: 'none' - } -}, { - selector: 'edge[type="output"]', - style: { - 'line-color': '#0080D0', - 'target-arrow-color': '#0080D0' - } -}, { - selector: 'edge[type="state"]', - style: { - 'line-style': 'dashed' - } -}, { - selector: 'node', - style: { - color: '#333333', - padding: 6, - 'text-valign': 'center', - 'text-halign': 'center', - 'border-width': 2, - 'border-opacity': 0, - 'border-style': 'solid', - 'border-color': '#888888', - 'transition-property': 'border-opacity', - 'transition-duration': '0.25s', - 'transition-timing-function': 'ease-in-out-sine' - } -}, { - selector: 'node[type="callback"]', - style: { - width: 35, - height: 25, - shape: 'round-rectangle', - label: function label(e) { - return "".concat(e.data().count, "\n").concat(e.data().time, " ms"); - }, - 'text-wrap': 'wrap', - 'text-justification': 'center' - } -}, { - selector: 'node[type="callback"][mode="client"]', - style: { - color: '#323330', - 'background-color': '#F0DB4F' - } -}, { - selector: 'node[type="callback"][mode="server"]', - style: { - color: '#323330', - 'background-color': '#00CC96' - } -}, { - selector: 'node[type="component"], node[type="wildcard"]', - style: { - width: 'label', - // height: 'label', - shape: 'rectangle', - content: function content(e) { - return e.data().label.replace(/"/g, ''); - }, - 'text-valign': 'top', - 'background-color': '#B9C2CE' - } -}, { - selector: 'node[type="property"]', - style: { - width: 'label', - height: 20, - shape: 'rectangle', - content: 'data(label)', - color: 'white', - 'background-color': '#109DFF' - } -}, { - selector: '.selected-node', - style: { - ghost: 'yes', - 'ghost-offset-x': 2, - 'ghost-offset-y': 2, - 'ghost-opacity': 0.25, - 'border-opacity': 1 - } -}, { - selector: '.prop-changed, .callback-loading', - style: { - 'border-color': '#CC43B7', - 'border-width': 2, - 'border-opacity': 1 - } -}, { - selector: '.callback-error', - style: { - 'background-color': '#E1332E' - } -}, { - selector: '.triggered', - style: { - 'line-color': '#CC43B7', - 'target-arrow-color': '#CC43B7' - } -}, { - selector: '.inactive', - style: { - opacity: 0.5 - } -}]; -/* harmony default export */ __webpack_exports__["default"] = (stylesheet); + // Wildcard callbacks with array inputs (ALL / ALLSMALLER) need to trigger + // even due to the deletion of components + requestedCallbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(requestedCallbacks, (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.getLayoutCallbacks)(graphs, oldPaths, oldChildren, { + removedArrayInputsOnly: true, + newPaths: paths, + chunkPath: oldChildrenPath, + filterRoot + }).map(function (rcb) { + return _objectSpread(_objectSpread({}, rcb), {}, { + predecessors + }); + })); + }; + var recomputed = false; + ['children'].concat(childrenProps).forEach(function (childrenProp) { + if (recomputed) { + return; + } + if (childrenProp.includes('[]')) { + var _childrenProp$split$m = childrenProp.split('[]').map(function (p) { + return p.split('.').filter(function (e) { + return e; + }); + }), + _childrenProp$split$m2 = _slicedToArray(_childrenProp$split$m, 1), + frontPath = _childrenProp$split$m2[0]; + var frontObj = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(frontPath, appliedProps); + if (!frontObj) { + return; + } + + // Crawl layout needs the ns/type + handlePaths(_objectSpread(_objectSpread({}, oldObj), {}, { + props: _objectSpread(_objectSpread({}, oldObj.props), appliedProps) + }), oldObj, basePath, (0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(appliedProps)); + // Only do it once for the component. + recomputed = true; + } else { + var childrenPropPath = childrenProp.split('.'); + var children = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(childrenPropPath, appliedProps); + if (!children) { + return; + } + var oldChildrenPath = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])((0,_actions_paths__WEBPACK_IMPORTED_MODULE_4__.getPath)(oldPaths, parsedId), ['props'].concat(childrenPropPath)); + var oldChildren = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(oldChildrenPath, oldLayout); + handlePaths(children, oldChildren, oldChildrenPath); + } + }); + + // persistence edge case: if you explicitly update the + // persistence key, other props may change that require us + // to fire additional callbacks + var addedProps = (0,ramda__WEBPACK_IMPORTED_MODULE_13__["default"])(function (_, k) { + return !(k in props); + }, appliedProps); + if (!(0,ramda__WEBPACK_IMPORTED_MODULE_14__["default"])(addedProps)) { + var _getState4 = getState(), + currentGraphs = _getState4.graphs, + paths = _getState4.paths; + requestedCallbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(requestedCallbacks, (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.includeObservers)(id, addedProps, currentGraphs, paths).map(function (rcb) { + return _objectSpread(_objectSpread({}, rcb), {}, { + predecessors + }); + })); + } + }); + + // Add information about potentially updated outputs vs. updated outputs, + // this will be used to drop callbacks from execution groups when no output + // matching the downstream callback's inputs were modified + storedCallbacks.push(_objectSpread(_objectSpread({}, cb), {}, { + executionMeta: { + allProps: (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.combineIdAndProp, (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(cb.getOutputs(getState().paths))), + updatedProps: (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function (_ref4) { + var _ref5 = _slicedToArray(_ref4, 2), + id = _ref5[0], + value = _ref5[1]; + return (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function (property) { + return (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.combineIdAndProp)({ + id, + property + }); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(value)); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])(data))) + } + })); + } + if (error !== undefined) { + var outputs = payload ? (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.combineIdAndProp, (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])([payload.outputs])).join(', ') : output; + var message = "Callback error updating ".concat(outputs); + if (clientside_function) { + var ns = clientside_function.namespace, + fn = clientside_function.function_name; + message += " via clientside function ".concat(ns, ".").concat(fn); + } + (0,_actions__WEBPACK_IMPORTED_MODULE_3__.handleAsyncError)(error, message, dispatch); + storedCallbacks.push(_objectSpread(_objectSpread({}, cb), {}, { + executionMeta: { + allProps: (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.combineIdAndProp, (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(cb.getOutputs(getState().paths))), + updatedProps: [] + } + })); + } + }); + dispatch((0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.aggregateCallbacks)([executed.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.removeExecutedCallbacks)(executed) : null, executed.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.addCompletedCallbacks)(executed.length) : null, storedCallbacks.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.addStoredCallbacks)(storedCallbacks) : null, requestedCallbacks.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.addRequestedCallbacks)(requestedCallbacks) : null])); + }, + inputs: ['callbacks.executed'] +}; +/* harmony default export */ __webpack_exports__["default"] = (observer); /***/ }), -/***/ "./src/components/error/CallbackGraph/CallbackGraphEffects.js": -/*!********************************************************************!*\ - !*** ./src/components/error/CallbackGraph/CallbackGraphEffects.js ***! - \********************************************************************/ +/***/ "./src/observers/executingCallbacks.ts": +/*!*********************************************!*\ + !*** ./src/observers/executingCallbacks.ts ***! + \*********************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ updateCallback: function() { return /* binding */ updateCallback; }, -/* harmony export */ updateChangedProps: function() { return /* binding */ updateChangedProps; }, -/* harmony export */ updateSelectedNode: function() { return /* binding */ updateSelectedNode; } -/* harmony export */ }); -/* harmony import */ var _constants_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../constants/constants */ "./src/constants/constants.js"); - - -/** - * getEdgeTypes - * - * Finds all edges connected to a node and splits them by type. - * - * @param {Object} node - Cytoscape node. - * @returns {Object} - Object containing the edges, sorted by type. - */ -function getEdgeTypes(node) { - var elements = node.connectedEdges(); - return { - input: elements.filter('[type = "input"]'), - state: elements.filter('[type = "state"]'), - output: elements.filter('[type = "output"]') - }; -} - -/** - * updateSelected - * - * Updates the classes of the selected node and recenters the viewport. - * - * @param {Object} cy - Reference to the cytoscape instance. - * @param {String} id - The id of the selected node. - * @returns {function} - cleanup function, for useEffect hook - */ -function updateSelectedNode(cy, id) { - function ascend(node, collection) { - // FIXME: Should we include State parents but non-recursively? - var type = node.data().type === 'callback' ? 'input' : 'output'; - var edges = getEdgeTypes(node)[type]; - var parents = edges.sources(); - collection.merge(edges); - collection.merge(parents); - if (node.data().type === 'property') { - collection.merge(node.ancestors()); - } - parents.forEach(function (node) { - return ascend(node, collection); - }); - } - function descend(node, collection) { - var type = node.data().type === 'callback' ? 'output' : 'input'; - var edges = getEdgeTypes(node)[type]; - var children = edges.targets(); - collection.merge(edges); - collection.merge(children); - if (node.data().type === 'property') { - collection.merge(node.ancestors()); - } - children.forEach(function (node) { - return descend(node, collection); - }); - } - if (id) { - var node = cy.getElementById(id); - - // Highlight the selected node. +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/partition.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assoc.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/find.js"); +/* harmony import */ var _actions_callbacks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../actions/callbacks */ "./src/actions/callbacks.ts"); +/* harmony import */ var _reducers_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../reducers/constants */ "./src/reducers/constants.js"); +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(typeof e + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - node.addClass('selected-node'); - // Find the subtree that the node belongs to. A subtree contains - // all all ancestors and descendants that are connected via Inputs - // or Outputs (but not State). - // WARNING: No cycle detection! +var observer = { + observer: function observer(_ref) { + var dispatch = _ref.dispatch, + getState = _ref.getState; + var _getState = getState(), + executing = _getState.callbacks.executing; + var _partition = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (cb) { + return cb.executionPromise instanceof Promise; + }, executing), + _partition2 = _slicedToArray(_partition, 2), + deferred = _partition2[0], + skippedOrReady = _partition2[1]; + dispatch((0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.aggregateCallbacks)([executing.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.removeExecutingCallbacks)(executing) : null, deferred.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.addWatchedCallbacks)(deferred) : null, skippedOrReady.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.addExecutedCallbacks)(skippedOrReady.map(function (cb) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])('executionResult', cb.executionPromise, cb); + })) : null])); + deferred.forEach( /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(cb) { + var result, _getState2, watched, appLifecycle, callback_resolved, currentCb; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + _context.next = 2; + return cb.executionPromise; + case 2: + result = _context.sent; + _getState2 = getState(), watched = _getState2.callbacks.watched, appLifecycle = _getState2.appLifecycle, callback_resolved = _getState2.hooks.callback_resolved; + if (!(appLifecycle !== (0,_reducers_constants__WEBPACK_IMPORTED_MODULE_1__.getAppState)('HYDRATED'))) { + _context.next = 6; + break; + } + return _context.abrupt("return"); + case 6: + if (callback_resolved) { + callback_resolved(cb.callback, result); + } - var subtree = cy.collection(); - subtree.merge(node); - ascend(node, subtree); - descend(node, subtree); - var other = subtree.absoluteComplement(); - other.addClass('inactive'); - return function () { - node.removeClass('selected-node'); - other.removeClass('inactive'); - }; - } - return undefined; -} + // Check if it's been removed from the `watched` list since - on callback completion, another callback may be cancelled + // Find the callback instance or one that matches its promise (eg. could have been pruned) + currentCb = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(function (_cb) { + return _cb === cb || _cb.executionPromise === cb.executionPromise; + }, watched); + if (currentCb) { + _context.next = 10; + break; + } + return _context.abrupt("return"); + case 10: + // Otherwise move to `executed` and remove from `watched` + dispatch((0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.aggregateCallbacks)([(0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.removeWatchedCallbacks)([currentCb]), (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.addExecutedCallbacks)([_objectSpread(_objectSpread({}, currentCb), {}, { + executionResult: result + })])])); + case 11: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function (_x) { + return _ref2.apply(this, arguments); + }; + }()); + }, + inputs: ['callbacks.executing'] +}; +/* harmony default export */ __webpack_exports__["default"] = (observer); -/** - * updateChangedProp - * - * Flashes property nodes that updated and any inputs they are connected to. - * - * @param {Object} cy - Reference to the cytoscape instance. - * @param {String} id - The component id which updated. - * @param {Object} props - The props that updated. - * @param {Number} flashTime - The time to flash classes for in ms. - * @returns {undefined} - */ -function updateChangedProps(cy, id, props) { - var flashTime = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 500; - Object.keys(props).forEach(function (prop) { - var node = cy.getElementById("".concat(id, ".").concat(prop)); - node.flashClass('prop-changed', flashTime); - node.edgesTo('*').filter('[type = "input"]').flashClass('triggered', flashTime); - }); -} +/***/ }), -/** - * updateCallback - * - * Updates a callback node with profiling information (call count, avg time) - * and adds or removes classes as necessary. Classes are always assert for - * at least flashTime ms so that they can be visually observed. When callbacks - * resolve, all output edges are flashed. - * - * @param {Object} cy - Reference to the cytoscape instance. - * @param {String} id - The id of the callback (i.e., it's output identifier) - * @param {Object} profile - The callback profiling information. - * @param {Number} flashTime - The time to flash classes for in ms. - * @returns {undefined} - */ -function updateCallback(cy, id, profile) { - var flashTime = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 500; - var node = cy.getElementById("__dash_callback__.".concat(id)); - var count = profile.count, - total = profile.total, - status = profile.status; - var latest = status.latest; +/***/ "./src/observers/isLoading.ts": +/*!************************************!*\ + !*** ./src/observers/isLoading.ts ***! + \************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - // Update data. - var avgTime = count > 0 ? total / count : 0; - node.data('count', count); - node.data('time', Math.round(avgTime)); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _utils_callbacks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/callbacks */ "./src/utils/callbacks.ts"); +/* harmony import */ var _actions_isLoading__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../actions/isLoading */ "./src/actions/isLoading.ts"); - // Either flash the classes OR maintain it for long callbacks. - if (latest === 'loading') { - node.data('loadingSet', Date.now()); - node.addClass('callback-loading'); - } else if (node.hasClass('callback-loading')) { - var timeLeft = node.data('loadingSet') + flashTime - Date.now(); - setTimeout(function () { - return node.removeClass('callback-loading'); - }, Math.max(timeLeft, 0)); - } - if (latest !== 'loading' && latest !== _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUSMAP[_constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUS.OK] && latest !== _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUSMAP[_constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUS.PREVENT_UPDATE]) { - node.data('errorSet', Date.now()); - node.addClass('callback-error'); - } else if (node.hasClass('callback-error')) { - var _timeLeft = node.data('errorSet') + flashTime - Date.now(); - setTimeout(function () { - return node.removeClass('callback-error'); - }, Math.max(_timeLeft, 0)); - } - // FIXME: This will flash branches that return no_update!! - // If the callback resolved properly, flash the outputs. - if (latest === _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUSMAP[_constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUS.OK]) { - node.edgesTo('*').flashClass('triggered', flashTime); - } -} +var observer = { + observer: function observer(_ref) { + var dispatch = _ref.dispatch, + getState = _ref.getState; + var _getState = getState(), + callbacks = _getState.callbacks, + isLoading = _getState.isLoading; + var pendingCallbacks = (0,_utils_callbacks__WEBPACK_IMPORTED_MODULE_0__.getPendingCallbacks)(callbacks); + var next = Boolean(pendingCallbacks.length); + if (isLoading !== next) { + dispatch((0,_actions_isLoading__WEBPACK_IMPORTED_MODULE_1__.setIsLoading)(next)); + } + }, + inputs: ['callbacks'] +}; +/* harmony default export */ __webpack_exports__["default"] = (observer); /***/ }), -/***/ "./src/components/error/ComponentErrorBoundary.react.js": -/*!**************************************************************!*\ - !*** ./src/components/error/ComponentErrorBoundary.react.js ***! - \**************************************************************/ +/***/ "./src/observers/loadingMap.ts": +/*!*************************************!*\ + !*** ./src/observers/loadingMap.ts ***! + \*************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "prop-types"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../actions */ "./src/actions/index.js"); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } -function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } -function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } -function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } -function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } -function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/flatten.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/map.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/isEmpty.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/reduce.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/equals.js"); +/* harmony import */ var _actions_loadingMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../actions/loadingMap */ "./src/actions/loadingMap.ts"); +function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } +function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +var observer = { + observer: function observer(_ref) { + var dispatch = _ref.dispatch, + getState = _ref.getState; + var _getState = getState(), + _getState$callbacks = _getState.callbacks, + executing = _getState$callbacks.executing, + watched = _getState$callbacks.watched, + executed = _getState$callbacks.executed, + loadingMap = _getState.loadingMap, + paths = _getState.paths; -var ComponentErrorBoundary = /*#__PURE__*/function (_Component) { - _inherits(ComponentErrorBoundary, _Component); - var _super = _createSuper(ComponentErrorBoundary); - function ComponentErrorBoundary(props) { - var _this; - _classCallCheck(this, ComponentErrorBoundary); - _this = _super.call(this, props); - _this.state = { - myID: props.componentId, - oldChildren: null, - hasError: false - }; - return _this; - } - _createClass(ComponentErrorBoundary, [{ - key: "componentDidCatch", - value: function componentDidCatch(error, info) { - var dispatch = this.props.dispatch; - dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_2__.onError)({ - myID: this.state.myID, - type: 'frontEnd', - error, - info - })); - dispatch(_actions__WEBPACK_IMPORTED_MODULE_2__.revert); - } - }, { - key: "componentDidUpdate", - value: function componentDidUpdate(prevProps, prevState) { - var prevChildren = prevProps.children; - if (!this.state.hasError && prevChildren !== prevState.oldChildren && prevChildren !== this.props.children) { - /* eslint-disable-next-line react/no-did-update-set-state */ - this.setState({ - oldChildren: prevChildren - }); - } - } - }, { - key: "render", - value: function render() { - var _this$state = this.state, - hasError = _this$state.hasError, - oldChildren = _this$state.oldChildren; - return hasError ? oldChildren : this.props.children; - } - }], [{ - key: "getDerivedStateFromError", - value: function getDerivedStateFromError(_) { - return { - hasError: true + /* + Get the path of all components impacted by callbacks + with states: executing, watched, executed. + For each path, keep track of all (id,prop) tuples that + are impacted for this node and nested nodes. + */ + + var loadingPaths = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (cb) { + return cb.getOutputs(paths); + }, [].concat(_toConsumableArray(executing), _toConsumableArray(watched), _toConsumableArray(executed)))); + var nextMap = (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(loadingPaths) ? null : (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(function (res, _ref2) { + var id = _ref2.id, + property = _ref2.property, + path = _ref2.path; + var target = res; + var idprop = { + id, + property }; + + // Assign all affected props for this path and nested paths + target.__dashprivate__idprops__ = target.__dashprivate__idprops__ || []; + target.__dashprivate__idprops__.push(idprop); + path.forEach(function (p, i) { + var _target$p; + target = target[p] = (_target$p = target[p]) !== null && _target$p !== void 0 ? _target$p : p === 'children' && typeof path[i + 1] === 'number' ? [] : {}; + target.__dashprivate__idprops__ = target.__dashprivate__idprops__ || []; + target.__dashprivate__idprops__.push(idprop); + }); + + // Assign one affected prop for this path + target.__dashprivate__idprop__ = target.__dashprivate__idprop__ || idprop; + return res; + }, {}, loadingPaths); + if (!(0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(nextMap, loadingMap)) { + dispatch((0,_actions_loadingMap__WEBPACK_IMPORTED_MODULE_0__.setLoadingMap)(nextMap)); } - }]); - return ComponentErrorBoundary; -}(react__WEBPACK_IMPORTED_MODULE_0__.Component); -ComponentErrorBoundary.propTypes = { - children: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), - componentId: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string), - error: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), - dispatch: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func) + }, + inputs: ['callbacks.executing', 'callbacks.watched', 'callbacks.executed'] }; -/* harmony default export */ __webpack_exports__["default"] = (ComponentErrorBoundary); +/* harmony default export */ __webpack_exports__["default"] = (observer); /***/ }), -/***/ "./src/components/error/FrontEnd/FrontEndError.react.js": -/*!**************************************************************!*\ - !*** ./src/components/error/FrontEnd/FrontEndError.react.js ***! - \**************************************************************/ +/***/ "./src/observers/prioritizedCallbacks.ts": +/*!***********************************************!*\ + !*** ./src/observers/prioritizedCallbacks.ts ***! + \***********************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ FrontEndError: function() { return /* binding */ FrontEndError; } -/* harmony export */ }); -/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); -/* harmony import */ var _FrontEndError_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FrontEndError.css */ "./src/components/error/FrontEnd/FrontEndError.css"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _icons_CollapseIcon_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../icons/CollapseIcon.svg */ "./src/components/error/icons/CollapseIcon.svg"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ "prop-types"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _Percy_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Percy.css */ "./src/components/error/Percy.css"); -/* harmony import */ var _actions_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../actions/utils */ "./src/actions/utils.js"); -/* harmony import */ var _werkzeugcss__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../werkzeugcss */ "./src/components/error/werkzeugcss.js"); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/flatten.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/uniq.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pluck.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/sort.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/partition.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/map.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/find.js"); +/* harmony import */ var _actions_callbacks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../actions/callbacks */ "./src/actions/callbacks.ts"); +/* harmony import */ var _actions_dependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../actions/dependencies */ "./src/actions/dependencies.js"); +/* harmony import */ var _actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../actions/dependencies_ts */ "./src/actions/dependencies_ts.ts"); +/* harmony import */ var _actions_isAppReady__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../actions/isAppReady */ "./src/actions/isAppReady.js"); +/* harmony import */ var _reducers_constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../reducers/constants */ "./src/reducers/constants.js"); +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(typeof e + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } -function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } -function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } -function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } -function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } - - - - - +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } +function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } +function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } -var FrontEndError = /*#__PURE__*/function (_Component) { - _inherits(FrontEndError, _Component); - var _super = _createSuper(FrontEndError); - function FrontEndError(props) { - var _this; - _classCallCheck(this, FrontEndError); - _this = _super.call(this, props); - _this.state = { - collapsed: _this.props.isListItem - }; - return _this; - } - _createClass(FrontEndError, [{ - key: "render", - value: function render() { - var _this2 = this; - var _this$props = this.props, - e = _this$props.e, - inAlertsTray = _this$props.inAlertsTray; - var collapsed = this.state.collapsed; - var cardClasses = 'dash-error-card__content' + (inAlertsTray ? ' dash-error-card--alerts-tray' : ''); - /* eslint-disable no-inline-comments */ - var errorHeader = /*#__PURE__*/React.createElement("div", { - className: "dash-fe-error-top test-devtools-error-toggle", - onClick: function onClick() { - return _this2.setState({ - collapsed: !collapsed - }); - } - }, /*#__PURE__*/React.createElement("span", { - className: "dash-fe-error-top__group" - }, "\u26D1\uFE0F", /*#__PURE__*/React.createElement("span", { - className: "dash-fe-error__title" - }, e.error.message || 'Error')), /*#__PURE__*/React.createElement("span", { - className: "dash-fe-error-top__group" - }, /*#__PURE__*/React.createElement("span", { - className: "dash-fe-error__timestamp percy-hide" - }, "".concat(e.timestamp.toLocaleTimeString())), /*#__PURE__*/React.createElement("span", { - className: "dash-fe-error__timestamp percy-show" - }, "00:00:00 PM"), /*#__PURE__*/React.createElement(_icons_CollapseIcon_svg__WEBPACK_IMPORTED_MODULE_3__["default"], { - className: "dash-fe-error__collapse ".concat(collapsed ? 'dash-fe-error__collapse--flipped' : ''), - onClick: function onClick() { - return _this2.setState({ - collapsed: !collapsed - }); - } - }))); - /* eslint-enable no-inline-comments */ - return collapsed ? /*#__PURE__*/React.createElement("div", { - className: "dash-error-card__list-item" - }, errorHeader) : /*#__PURE__*/React.createElement("div", { - className: cardClasses - }, errorHeader, /*#__PURE__*/React.createElement(ErrorContent, { - error: e.error - })); - } - }]); - return FrontEndError; -}(react__WEBPACK_IMPORTED_MODULE_2__.Component); -var MAX_MESSAGE_LENGTH = 40; -/* eslint-disable no-inline-comments */ -function UnconnectedErrorContent(_ref) { - var error = _ref.error, - base = _ref.base; - return /*#__PURE__*/React.createElement("div", { - className: "error-container" - }, typeof error.message !== 'string' || error.message.length < MAX_MESSAGE_LENGTH ? null : /*#__PURE__*/React.createElement("div", { - className: "dash-fe-error__st" - }, /*#__PURE__*/React.createElement("div", { - className: "dash-fe-error__info dash-fe-error__curved" - }, error.message)), typeof error.stack !== 'string' ? null : /*#__PURE__*/React.createElement("div", { - className: "dash-fe-error__st" - }, /*#__PURE__*/React.createElement("div", { - className: "dash-fe-error__info" - }, /*#__PURE__*/React.createElement("details", null, /*#__PURE__*/React.createElement("summary", null, /*#__PURE__*/React.createElement("i", null, "(This error originated from the built-in JavaScript code that runs Dash apps. Click to see the full stack trace or open your browser's console.)")), error.stack.split('\n').map(function (line, i) { - return /*#__PURE__*/React.createElement("p", { - key: i - }, line); - })))), typeof error.html !== 'string' ? null : error.html.substring(0, '', "")).replace('="?__debugger__', "=\"".concat(base, "?__debugger__")), - style: { - /* - * 67px of padding and margin between this - * iframe and the parent container. - * 67 was determined manually in the - * browser's dev tools. - */ - width: 'calc(600px - 67px)', - height: '75vh', - border: 'none' - } - }))) : /*#__PURE__*/React.createElement("div", { - className: "dash-be-error__str" - }, /*#__PURE__*/React.createElement("div", { - className: "dash-backend-error" - }, error.html))); -} -/* eslint-enable no-inline-comments */ -var errorPropTypes = prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({ - message: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string), - /* front-end error messages */ - stack: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string), - /* backend error messages */ - html: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string) -}); -UnconnectedErrorContent.propTypes = { - error: errorPropTypes, - base: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string) +var sortPriority = function sortPriority(c1, c2) { + var _c1$priority, _c2$priority; + return ((_c1$priority = c1.priority) !== null && _c1$priority !== void 0 ? _c1$priority : '') > ((_c2$priority = c2.priority) !== null && _c2$priority !== void 0 ? _c2$priority : '') ? -1 : 1; }; -var ErrorContent = (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(function (state) { +var getStash = function getStash(cb, paths) { + var getOutputs = cb.getOutputs; + var allOutputs = getOutputs(paths); + var flatOutputs = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(allOutputs); + var allPropIds = []; + var reqOut = {}; + flatOutputs.forEach(function (_ref) { + var id = _ref.id, + property = _ref.property; + var idStr = (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_1__.stringifyId)(id); + var idOut = reqOut[idStr] = reqOut[idStr] || []; + idOut.push(property); + allPropIds.push((0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.combineIdAndProp)({ + id: idStr, + property + })); + }); return { - base: (0,_actions_utils__WEBPACK_IMPORTED_MODULE_6__.urlBase)(state.config) + allOutputs, + allPropIds }; -})(UnconnectedErrorContent); -FrontEndError.propTypes = { - e: prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({ - timestamp: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().object), - error: errorPropTypes - }), - inAlertsTray: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().bool), - isListItem: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().bool) }; -FrontEndError.defaultProps = { - inAlertsTray: false, - isListItem: false +var getIds = function getIds(cb, paths) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])('id', [].concat(_toConsumableArray((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb.getInputs(paths))), _toConsumableArray((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb.getState(paths)))))); }; +var observer = { + observer: function () { + var _observer = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref2) { + var dispatch, getState, _getState, _getState$callbacks, executing, watched, config, hooks, layout, paths, appLifecycle, _getState2, prioritized, available, _partition, _partition2, syncCallbacks, asyncCallbacks, pickedSyncCallbacks, pickedAsyncCallbacks, deferred; + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + dispatch = _ref2.dispatch, getState = _ref2.getState; + _getState = getState(), _getState$callbacks = _getState.callbacks, executing = _getState$callbacks.executing, watched = _getState$callbacks.watched, config = _getState.config, hooks = _getState.hooks, layout = _getState.layout, paths = _getState.paths, appLifecycle = _getState.appLifecycle; + _getState2 = getState(), prioritized = _getState2.callbacks.prioritized; + if (!(appLifecycle !== (0,_reducers_constants__WEBPACK_IMPORTED_MODULE_4__.getAppState)('HYDRATED'))) { + _context2.next = 5; + break; + } + return _context2.abrupt("return"); + case 5: + available = Math.max(0, 12 - executing.length - watched.length); // Order prioritized callbacks based on depth and breadth of callback chain + prioritized = (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(sortPriority, prioritized); - -/***/ }), - -/***/ "./src/components/error/FrontEnd/FrontEndErrorContainer.react.js": -/*!***********************************************************************!*\ - !*** ./src/components/error/FrontEnd/FrontEndErrorContainer.react.js ***! - \***********************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ FrontEndErrorContainer: function() { return /* binding */ FrontEndErrorContainer; } -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _FrontEndError_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FrontEndError.css */ "./src/components/error/FrontEnd/FrontEndError.css"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "prop-types"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _FrontEndError_react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FrontEndError.react */ "./src/components/error/FrontEnd/FrontEndError.react.js"); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } -function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } -function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } -function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } -function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } -function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } - - - - -var FrontEndErrorContainer = /*#__PURE__*/function (_Component) { - _inherits(FrontEndErrorContainer, _Component); - var _super = _createSuper(FrontEndErrorContainer); - function FrontEndErrorContainer(props) { - _classCallCheck(this, FrontEndErrorContainer); - return _super.call(this, props); - } - _createClass(FrontEndErrorContainer, [{ - key: "render", - value: function render() { - var _this$props = this.props, - errors = _this$props.errors, - connected = _this$props.connected, - errorsOpened = _this$props.errorsOpened, - clickHandler = _this$props.clickHandler; - var errorsLength = errors.length; - if (errorsLength === 0 || !errorsOpened) { - return null; - } - var inAlertsTray = this.props.inAlertsTray; - var cardClasses = 'dash-error-card dash-error-card--container'; - var errorElements = errors.map(function (error, i) { - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FrontEndError_react__WEBPACK_IMPORTED_MODULE_3__.FrontEndError, { - e: error, - isListItem: true, - key: i - }); - }); - if (inAlertsTray) { - cardClasses += ' dash-error-card--alerts-tray'; - } - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: cardClasses - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-error-card__topbar" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-error-card__message" - }, "\uD83D\uDED1 Errors (", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("strong", { - className: "test-devtools-error-count" - }, errorsLength), ")", connected ? null : "\xA0 \uD83D\uDEAB Server Unavailable"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-fe-error__icon-x", - onClick: function onClick() { - return clickHandler(); + // Divide between sync and async + _partition = (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(function (cb) { + return (0,_actions_isAppReady__WEBPACK_IMPORTED_MODULE_3__["default"])(layout, paths, getIds(cb, paths)) === true; + }, prioritized), _partition2 = _slicedToArray(_partition, 2), syncCallbacks = _partition2[0], asyncCallbacks = _partition2[1]; + pickedSyncCallbacks = syncCallbacks.slice(0, available); + pickedAsyncCallbacks = asyncCallbacks.slice(0, available - pickedSyncCallbacks.length); + if (pickedSyncCallbacks.length) { + dispatch((0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.aggregateCallbacks)([(0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.removePrioritizedCallbacks)(pickedSyncCallbacks), (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.addExecutingCallbacks)((0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function (cb) { + return (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.executeCallback)(cb, config, hooks, paths, layout, getStash(cb, paths), dispatch, getState); + }, pickedSyncCallbacks))])); + } + if (pickedAsyncCallbacks.length) { + deferred = (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function (cb) { + return _objectSpread(_objectSpread(_objectSpread({}, cb), getStash(cb, paths)), {}, { + isReady: (0,_actions_isAppReady__WEBPACK_IMPORTED_MODULE_3__["default"])(layout, paths, getIds(cb, paths)) + }); + }, pickedAsyncCallbacks); + dispatch((0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.aggregateCallbacks)([(0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.removePrioritizedCallbacks)(pickedAsyncCallbacks), (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.addBlockedCallbacks)(deferred)])); + deferred.forEach( /*#__PURE__*/function () { + var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(cb) { + var _getState3, blocked, currentCb, executingCallback; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + _context.next = 2; + return cb.isReady; + case 2: + _getState3 = getState(), blocked = _getState3.callbacks.blocked; // Check if it's been removed from the `blocked` list since - on + // callback completion, another callback may be cancelled + // Find the callback instance or one that matches its promise + // (eg. could have been pruned) + currentCb = (0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(function (_cb) { + return _cb === cb || _cb.isReady === cb.isReady; + }, blocked); + if (currentCb) { + _context.next = 6; + break; + } + return _context.abrupt("return"); + case 6: + executingCallback = (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.executeCallback)(cb, config, hooks, paths, layout, cb, dispatch, getState); + dispatch((0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.aggregateCallbacks)([(0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.removeBlockedCallbacks)([cb]), (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.addExecutingCallbacks)([executingCallback])])); + case 8: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function (_x2) { + return _ref3.apply(this, arguments); + }; + }()); + } + case 12: + case "end": + return _context2.stop(); } - }, "\xD7")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-error-card__list" - }, errorElements)); + }, _callee2); + })); + function observer(_x) { + return _observer.apply(this, arguments); } - }]); - return FrontEndErrorContainer; -}(react__WEBPACK_IMPORTED_MODULE_0__.Component); -FrontEndErrorContainer.propTypes = { - id: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string), - errors: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array), - connected: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool), - inAlertsTray: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().any), - errorsOpened: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().any), - clickHandler: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func) -}; -FrontEndErrorContainer.propTypes = { - inAlertsTray: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().any) + return observer; + }(), + inputs: ['callbacks.prioritized', 'callbacks.completed'] }; - +/* harmony default export */ __webpack_exports__["default"] = (observer); /***/ }), -/***/ "./src/components/error/GlobalErrorContainer.react.js": -/*!************************************************************!*\ - !*** ./src/components/error/GlobalErrorContainer.react.js ***! - \************************************************************/ +/***/ "./src/observers/requestedCallbacks.ts": +/*!*********************************************!*\ + !*** ./src/observers/requestedCallbacks.ts ***! + \*********************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "prop-types"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _menu_DebugMenu_react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./menu/DebugMenu.react */ "./src/components/error/menu/DebugMenu.react.js"); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/filter.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/includes.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/difference.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/values.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/groupBy.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/concat.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mergeLeft.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/reduce.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mergeWith.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pluck.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/flatten.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/map.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/isNil.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/isEmpty.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/intersection.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/all.js"); +/* harmony import */ var _actions_callbacks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../actions/callbacks */ "./src/actions/callbacks.ts"); +/* harmony import */ var _actions_dependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../actions/dependencies */ "./src/actions/dependencies.js"); +/* harmony import */ var _actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../actions/dependencies_ts */ "./src/actions/dependencies_ts.ts"); +/* harmony import */ var _utils_wait__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../utils/wait */ "./src/utils/wait.ts"); +/* harmony import */ var _utils_callbacks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/callbacks */ "./src/utils/callbacks.ts"); +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(typeof e + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } -function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } -function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } -function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } -function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } -var UnconnectedGlobalErrorContainer = /*#__PURE__*/function (_Component) { - _inherits(UnconnectedGlobalErrorContainer, _Component); - var _super = _createSuper(UnconnectedGlobalErrorContainer); - function UnconnectedGlobalErrorContainer(props) { - _classCallCheck(this, UnconnectedGlobalErrorContainer); - return _super.call(this, props); - } - _createClass(UnconnectedGlobalErrorContainer, [{ - key: "render", - value: function render() { - var _this$props = this.props, - config = _this$props.config, - error = _this$props.error, - children = _this$props.children; - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { - id: "_dash-global-error-container" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_menu_DebugMenu_react__WEBPACK_IMPORTED_MODULE_3__.DebugMenu, { - error: error, - hotReload: Boolean(config.hot_reload) - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { - id: "_dash-app-content" - }, children))); - } - }]); - return UnconnectedGlobalErrorContainer; -}(react__WEBPACK_IMPORTED_MODULE_1__.Component); -UnconnectedGlobalErrorContainer.propTypes = { - children: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object), - config: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object), - error: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object) -}; -var GlobalErrorContainer = (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(function (state) { - return { - config: state.config, - error: state.error - }; -})(UnconnectedGlobalErrorContainer); -/* harmony default export */ __webpack_exports__["default"] = (GlobalErrorContainer); - -/***/ }), - -/***/ "./src/components/error/GlobalErrorOverlay.react.js": -/*!**********************************************************!*\ - !*** ./src/components/error/GlobalErrorOverlay.react.js ***! - \**********************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ GlobalErrorOverlay; } -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "prop-types"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var _GlobalErrorOverlay_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GlobalErrorOverlay.css */ "./src/components/error/GlobalErrorOverlay.css"); -/* harmony import */ var _FrontEnd_FrontEndErrorContainer_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./FrontEnd/FrontEndErrorContainer.react */ "./src/components/error/FrontEnd/FrontEndErrorContainer.react.js"); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } -function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } -function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } -function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } -function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } -function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } - - - - - -var GlobalErrorOverlay = /*#__PURE__*/function (_Component) { - _inherits(GlobalErrorOverlay, _Component); - var _super = _createSuper(GlobalErrorOverlay); - function GlobalErrorOverlay(props) { - _classCallCheck(this, GlobalErrorOverlay); - return _super.call(this, props); - } - _createClass(GlobalErrorOverlay, [{ - key: "render", - value: function render() { - var _this$props = this.props, - visible = _this$props.visible, - error = _this$props.error, - errorsOpened = _this$props.errorsOpened, - clickHandler = _this$props.clickHandler; - var frontEndErrors; - if (errorsOpened) { - var errors = (0,ramda__WEBPACK_IMPORTED_MODULE_2__.concat)(error.frontEnd, error.backEnd); - frontEndErrors = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FrontEnd_FrontEndErrorContainer_react__WEBPACK_IMPORTED_MODULE_4__.FrontEndErrorContainer, { - errors: errors, - connected: error.backEndConnected, - errorsOpened: errorsOpened, - clickHandler: clickHandler - }); - } - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, this.props.children), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-error-menu" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: visible ? 'dash-fe-errors' : '' - }, frontEndErrors))); - } - }]); - return GlobalErrorOverlay; -}(react__WEBPACK_IMPORTED_MODULE_0__.Component); -GlobalErrorOverlay.propTypes = { - children: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), - visible: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().bool), - error: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), - errorsOpened: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().any), - clickHandler: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func) -}; -/***/ }), +var observer = { + observer: function () { + var _observer = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) { + var dispatch, getState, _getState, callbacks, _getState$callbacks, prioritized, blocked, executing, watched, stored, paths, graphs, _getState2, requested, initialRequested, pendingCallbacks, rCirculars, rDuplicates, rMergedDuplicates, pDuplicates, bDuplicates, eDuplicates, wDuplicates, _pruneCallbacks, rAdded, rRemoved, _pruneCallbacks2, pAdded, pRemoved, _pruneCallbacks3, bAdded, bRemoved, _pruneCallbacks4, eAdded, eRemoved, _pruneCallbacks5, wAdded, wRemoved, readyCallbacks, oldBlocked, newBlocked, candidates, _loop, pendingGroups, dropped, added, removed; + return _regeneratorRuntime().wrap(function _callee$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + dispatch = _ref.dispatch, getState = _ref.getState; + _context2.next = 3; + return (0,_utils_wait__WEBPACK_IMPORTED_MODULE_3__["default"])(0); + case 3: + _getState = getState(), callbacks = _getState.callbacks, _getState$callbacks = _getState.callbacks, prioritized = _getState$callbacks.prioritized, blocked = _getState$callbacks.blocked, executing = _getState$callbacks.executing, watched = _getState$callbacks.watched, stored = _getState$callbacks.stored, paths = _getState.paths, graphs = _getState.graphs; + _getState2 = getState(), requested = _getState2.callbacks.requested; + initialRequested = requested.slice(0); + pendingCallbacks = (0,_utils_callbacks__WEBPACK_IMPORTED_MODULE_4__.getPendingCallbacks)(callbacks); + /* + 0. Prune circular callbacks that have completed the loop + - cb.callback included in cb.predecessors + */ + rCirculars = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(function (cb) { + var _cb$predecessors; + return (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(cb.callback, (_cb$predecessors = cb.predecessors) !== null && _cb$predecessors !== void 0 ? _cb$predecessors : []); + }, requested); + /* + TODO? + Clean up the `requested` list - during the dispatch phase, + circulars will be removed for real + */ + requested = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(requested, rCirculars); -/***/ "./src/components/error/menu/DebugMenu.react.js": -/*!******************************************************!*\ - !*** ./src/components/error/menu/DebugMenu.react.js ***! - \******************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + /* + 1. Remove duplicated `requested` callbacks - give precedence to newer callbacks over older ones + */ + rDuplicates = []; + rMergedDuplicates = []; + (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.getUniqueIdentifier, requested)).forEach(function (group) { + if (group.length === 1) { + // keep callback if its the only one of its kind + rMergedDuplicates.push(group[0]); + } else { + var initial = group.find(function (cb) { + return cb.initialCall; + }); + if (initial) { + // drop the initial callback if it's not alone + rDuplicates.push(initial); + } + var groupWithoutInitial = group.filter(function (cb) { + return cb !== initial; + }); + if (groupWithoutInitial.length === 1) { + // if there's only one callback beside the initial one, keep that callback + rMergedDuplicates.push(groupWithoutInitial[0]); + } else { + // otherwise merge all remaining callbacks together + rDuplicates = (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(rDuplicates, groupWithoutInitial); + rMergedDuplicates.push((0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])({ + changedPropIds: (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_13__["default"])(Math.max), {}, (0,ramda__WEBPACK_IMPORTED_MODULE_14__["default"])('changedPropIds', groupWithoutInitial)), + executionGroup: (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(function (exg) { + return Boolean(exg); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_14__["default"])('executionGroup', groupWithoutInitial)).slice(-1)[0] + }, groupWithoutInitial.slice(-1)[0])); + } + } + }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ DebugMenu: function() { return /* binding */ DebugMenu; } -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "prop-types"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _DebugMenu_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./DebugMenu.css */ "./src/components/error/menu/DebugMenu.css"); -/* harmony import */ var _icons_BellIcon_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../icons/BellIcon.svg */ "./src/components/error/icons/BellIcon.svg"); -/* harmony import */ var _icons_CheckIcon_svg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../icons/CheckIcon.svg */ "./src/components/error/icons/CheckIcon.svg"); -/* harmony import */ var _icons_ClockIcon_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../icons/ClockIcon.svg */ "./src/components/error/icons/ClockIcon.svg"); -/* harmony import */ var _icons_DebugIcon_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../icons/DebugIcon.svg */ "./src/components/error/icons/DebugIcon.svg"); -/* harmony import */ var _icons_GraphIcon_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../icons/GraphIcon.svg */ "./src/components/error/icons/GraphIcon.svg"); -/* harmony import */ var _icons_OffIcon_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../icons/OffIcon.svg */ "./src/components/error/icons/OffIcon.svg"); -/* harmony import */ var _GlobalErrorOverlay_react__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../GlobalErrorOverlay.react */ "./src/components/error/GlobalErrorOverlay.react.js"); -/* harmony import */ var _CallbackGraph_CallbackGraphContainer_react__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../CallbackGraph/CallbackGraphContainer.react */ "./src/components/error/CallbackGraph/CallbackGraphContainer.react.js"); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } -function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } -function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } -function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } -function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } -function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + /* + TODO? + Clean up the `requested` list - during the dispatch phase, + duplicates will be removed for real + */ + requested = rMergedDuplicates; + /* + 2. Remove duplicated `prioritized`, `executing` and `watching` callbacks + */ + /* + Extract all but the first callback from each IOS-key group + these callbacks are `prioritized` and duplicates. + */ + pDuplicates = (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(function (group) { + return group.slice(0, -1); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.getUniqueIdentifier, (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(prioritized, requested))))); + bDuplicates = (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(function (group) { + return group.slice(0, -1); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.getUniqueIdentifier, (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(blocked, requested))))); + eDuplicates = (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(function (group) { + return group.slice(0, -1); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.getUniqueIdentifier, (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(executing, requested))))); + wDuplicates = (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(function (group) { + return group.slice(0, -1); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.getUniqueIdentifier, (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(watched, requested))))); + /* + 3. Modify or remove callbacks that are outputting to non-existing layout `id`. + */ + _pruneCallbacks = (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.pruneCallbacks)(requested, paths), rAdded = _pruneCallbacks.added, rRemoved = _pruneCallbacks.removed; + _pruneCallbacks2 = (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.pruneCallbacks)(prioritized, paths), pAdded = _pruneCallbacks2.added, pRemoved = _pruneCallbacks2.removed; + _pruneCallbacks3 = (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.pruneCallbacks)(blocked, paths), bAdded = _pruneCallbacks3.added, bRemoved = _pruneCallbacks3.removed; + _pruneCallbacks4 = (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.pruneCallbacks)(executing, paths), eAdded = _pruneCallbacks4.added, eRemoved = _pruneCallbacks4.removed; + _pruneCallbacks5 = (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.pruneCallbacks)(watched, paths), wAdded = _pruneCallbacks5.added, wRemoved = _pruneCallbacks5.removed; + /* + TODO? + Clean up the `requested` list - during the dispatch phase, + it will be updated for real + */ + requested = (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(requested, rRemoved), rAdded); + /* + 4. Find `requested` callbacks that do not depend on a outstanding output (as either input or state) + */ + readyCallbacks = (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.getReadyCallbacks)(paths, requested, pendingCallbacks, graphs); + oldBlocked = []; + newBlocked = []; + /** + * If there is : + * - no ready callbacks + * - at least one requested callback + * - no additional pending callbacks + * + * can assume: + * - the requested callbacks are part of a circular dependency loop + * + * then recursively: + * - assume the first callback in the list is ready (the entry point for the loop) + * - check what callbacks are blocked / ready with the assumption + * - update the missing predecessors based on assumptions + * - continue until there are no remaining candidates + * + */ + if (!(!readyCallbacks.length && requested.length && requested.length === pendingCallbacks.length)) { + _context2.next = 33; + break; + } + candidates = requested.slice(0); + _loop = /*#__PURE__*/_regeneratorRuntime().mark(function _loop() { + var readyCallback, blockedByAssumptions, modified; + return _regeneratorRuntime().wrap(function _loop$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + // Assume 1st callback is ready and + // update candidates / readyCallbacks accordingly + readyCallback = candidates[0]; + readyCallbacks.push(readyCallback); + candidates = candidates.slice(1); + // Remaining candidates are not blocked by current assumptions + candidates = (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.getReadyCallbacks)(paths, candidates, readyCallbacks); + // Blocked requests need to make sure they have the callback as a predecessor + blockedByAssumptions = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(candidates, candidates); + modified = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(function (cb) { + return !cb.predecessors || !(0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(readyCallback.callback, cb.predecessors); + }, blockedByAssumptions); + oldBlocked = (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(oldBlocked, modified); + newBlocked = (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(newBlocked, modified.map(function (cb) { + var _cb$predecessors2; + return _objectSpread(_objectSpread({}, cb), {}, { + predecessors: (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])((_cb$predecessors2 = cb.predecessors) !== null && _cb$predecessors2 !== void 0 ? _cb$predecessors2 : [], [readyCallback.callback]) + }); + })); + case 8: + case "end": + return _context.stop(); + } + }, _loop); + }); + case 29: + if (!candidates.length) { + _context2.next = 33; + break; + } + return _context2.delegateYield(_loop(), "t0", 31); + case 31: + _context2.next = 29; + break; + case 33: + /* + TODO? + Clean up the `requested` list - during the dispatch phase, + it will be updated for real + */ + requested = (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(requested, oldBlocked), newBlocked); + /* + 5. Prune callbacks that became irrelevant in their `executionGroup` + */ + // Group by executionGroup, drop non-executionGroup callbacks + // those were not triggered by layout changes and don't have "strong" interdependency for + // callback chain completion + pendingGroups = (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(function (cb) { + return cb.executionGroup; + }, (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(function (cb) { + return !(0,ramda__WEBPACK_IMPORTED_MODULE_17__["default"])(cb.executionGroup); + }, stored)); + dropped = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(function (cb) { + // If there is no `stored` callback for the group, no outputs were dropped -> `cb` is kept + if (!cb.executionGroup || !pendingGroups[cb.executionGroup] || !pendingGroups[cb.executionGroup].length) { + return false; + } + // Get all inputs for `cb` + var inputs = (0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_2__.combineIdAndProp, (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])(cb.getInputs(paths))); + // Get all the potentially updated props for the group so far + var allProps = (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(function (gcb) { + return gcb.executionMeta.allProps; + }, pendingGroups[cb.executionGroup])); + // Get all the updated props for the group so far + var updated = (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(function (gcb) { + return gcb.executionMeta.updatedProps; + }, pendingGroups[cb.executionGroup])); -var classes = function classes(base, variant, variant2) { - return "".concat(base, " ").concat(base, "--").concat(variant) + (variant2 ? " ".concat(base, "--").concat(variant2) : ''); -}; -var buttonFactory = function buttonFactory(enabled, buttonVariant, toggle, _Icon, iconVariant, label) { - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-debug-menu__button-container" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: classes('dash-debug-menu__button', buttonVariant, enabled && 'enabled'), - onClick: toggle - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Icon, { - className: classes('dash-debug-menu__icon', iconVariant) - }), label ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { - className: "dash-debug-menu__button-label" - }, label) : null)); -}; -var DebugMenu = /*#__PURE__*/function (_Component) { - _inherits(DebugMenu, _Component); - var _super = _createSuper(DebugMenu); - function DebugMenu(props) { - var _this; - _classCallCheck(this, DebugMenu); - _this = _super.call(this, props); - _this.state = { - opened: false, - callbackGraphOpened: false, - errorsOpened: true - }; - return _this; - } - _createClass(DebugMenu, [{ - key: "render", - value: function render() { - var _this2 = this; - var _this$state = this.state, - opened = _this$state.opened, - errorsOpened = _this$state.errorsOpened, - callbackGraphOpened = _this$state.callbackGraphOpened; - var _this$props = this.props, - error = _this$props.error, - hotReload = _this$props.hotReload; - var errCount = error.frontEnd.length + error.backEnd.length; - var connected = error.backEndConnected; - var toggleErrors = function toggleErrors() { - _this2.setState({ - errorsOpened: !errorsOpened - }); - }; - var status = hotReload ? connected ? 'available' : 'unavailable' : 'cold'; - var _StatusIcon = hotReload ? connected ? _icons_CheckIcon_svg__WEBPACK_IMPORTED_MODULE_4__["default"] : _icons_OffIcon_svg__WEBPACK_IMPORTED_MODULE_8__["default"] : _icons_ClockIcon_svg__WEBPACK_IMPORTED_MODULE_5__["default"]; - var menuContent = opened ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-debug-menu__content" - }, callbackGraphOpened ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_CallbackGraph_CallbackGraphContainer_react__WEBPACK_IMPORTED_MODULE_10__.CallbackGraphContainer, null) : null, buttonFactory(callbackGraphOpened, 'callbacks', function () { - _this2.setState({ - callbackGraphOpened: !callbackGraphOpened - }); - }, _icons_GraphIcon_svg__WEBPACK_IMPORTED_MODULE_7__["default"], 'graph', 'Callbacks'), buttonFactory(errorsOpened, 'errors', toggleErrors, _icons_BellIcon_svg__WEBPACK_IMPORTED_MODULE_3__["default"], 'bell', errCount + ' Error' + (errCount === 1 ? '' : 's')), buttonFactory(false, status, null, _StatusIcon, 'indicator', 'Server')) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-debug-menu__content" - }); - var alertsLabel = (errCount || !connected) && !opened ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-debug-alert-label" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-debug-alert", - onClick: toggleErrors - }, errCount ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-debug-error-count" - }, '🛑 ' + errCount) : null, connected ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-debug-disconnected" - }, "\uD83D\uDEAB"))) : null; - var openVariant = opened ? 'open' : 'closed'; - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, alertsLabel, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: classes('dash-debug-menu__outer', openVariant) - }, menuContent), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: classes('dash-debug-menu', openVariant), - onClick: function onClick() { - _this2.setState({ - opened: !opened - }); + // If there's no overlap between the updated props and the inputs, + // + there's no props that aren't covered by the potentially updated props, + // and not all inputs are multi valued + // -> drop `cb` + var res = (0,ramda__WEBPACK_IMPORTED_MODULE_18__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_19__["default"])(inputs, updated)) && (0,ramda__WEBPACK_IMPORTED_MODULE_18__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(inputs, allProps)) && !(0,ramda__WEBPACK_IMPORTED_MODULE_20__["default"])(_actions_dependencies__WEBPACK_IMPORTED_MODULE_1__.isMultiValued, cb.callback.inputs); + return res; + }, readyCallbacks); + /* + TODO? + Clean up the `requested` list - during the dispatch phase, + it will be updated for real + */ + requested = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(requested, dropped); + readyCallbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(readyCallbacks, dropped); + requested = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(requested, readyCallbacks); + added = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(requested, initialRequested); + removed = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(initialRequested, requested); + dispatch((0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.aggregateCallbacks)([ + // Clean up requested callbacks + added.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.addRequestedCallbacks)(added) : null, removed.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.removeRequestedCallbacks)(removed) : null, + // Clean up duplicated callbacks + pDuplicates.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.removePrioritizedCallbacks)(pDuplicates) : null, bDuplicates.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.removeBlockedCallbacks)(bDuplicates) : null, eDuplicates.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.removeExecutingCallbacks)(eDuplicates) : null, wDuplicates.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.removeWatchedCallbacks)(wDuplicates) : null, + // Prune callbacks + pRemoved.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.removePrioritizedCallbacks)(pRemoved) : null, pAdded.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.addPrioritizedCallbacks)(pAdded) : null, bRemoved.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.removeBlockedCallbacks)(bRemoved) : null, bAdded.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.addBlockedCallbacks)(bAdded) : null, eRemoved.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.removeExecutingCallbacks)(eRemoved) : null, eAdded.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.addExecutingCallbacks)(eAdded) : null, wRemoved.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.removeWatchedCallbacks)(wRemoved) : null, wAdded.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.addWatchedCallbacks)(wAdded) : null, + // Promote callbacks + readyCallbacks.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.addPrioritizedCallbacks)(readyCallbacks) : null])); + case 42: + case "end": + return _context2.stop(); } - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_DebugIcon_svg__WEBPACK_IMPORTED_MODULE_6__["default"], { - className: classes('dash-debug-menu__icon', 'debug') - })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_GlobalErrorOverlay_react__WEBPACK_IMPORTED_MODULE_9__["default"], { - error: error, - visible: errCount > 0, - errorsOpened: errorsOpened, - clickHandler: toggleErrors - }, this.props.children)); + }, _callee); + })); + function observer(_x) { + return _observer.apply(this, arguments); } - }]); - return DebugMenu; -}(react__WEBPACK_IMPORTED_MODULE_0__.Component); -DebugMenu.propTypes = { - children: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), - error: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), - hotReload: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().bool) + return observer; + }(), + inputs: ['callbacks.requested', 'callbacks.completed'] }; - +/* harmony default export */ __webpack_exports__["default"] = (observer); /***/ }), -/***/ "./src/components/error/werkzeugcss.js": -/*!*********************************************!*\ - !*** ./src/components/error/werkzeugcss.js ***! - \*********************************************/ +/***/ "./src/observers/storedCallbacks.ts": +/*!******************************************!*\ + !*** ./src/observers/storedCallbacks.ts ***! + \******************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -// Werkzeug css included as a string, because we want to inject -// it into an iframe srcDoc - -/* harmony default export */ __webpack_exports__["default"] = ("\nbody {\n margin: 0px;\n margin-top: 10px;\n}\n\n.error-container {\n font-family: Roboto;\n}\n\n.traceback {\n background-color: white;\n border: 2px solid #dfe8f3;\n border-radius: 0px 0px 4px 4px;\n color: #506784;\n}\n\nh2.traceback {\n background-color: #f3f6fa;\n border: 2px solid #dfe8f3;\n border-bottom: 0px;\n box-sizing: border-box;\n border-radius: 4px 4px 0px 0px;\n color: #506784;\n}\n\nh2.traceback em {\n color: #506784;\n font-weight: 100;\n}\n\n.traceback pre, .debugger textarea {\n background-color: #F3F6FA;\n}\n\n.debugger h1 {\n color: #506784;\n font-family: Roboto;\n}\n\n.explanation {\n color: #A2B1C6;\n}\n\n/* Hide the Don't Panic! footer */\n.debugger .footer {\n display: none;\n}\n\n/* Hide all of the Dash traceback stuff that leads up to the call */\n.line.before {\n display: none;\n}\n\ndiv.debugger {\n padding: 0px;\n}\n\n.debugger h1 {\n display: none;\n}\n\n.debugger .errormsg {\n margin: 0;\n color: #506784;\n font-size: 16px;\n background-color: #f3f6fa;\n border: 2px solid #dfe8f3;\n box-sizing: border-box;\n border-radius: 4px;\n padding: 10px;\n}\n\n.debugger .pastemessage input {\n display: none;\n}\n\n.debugger .explanation {\n display: none;\n}\n\n.debugger div.plain {\n border-radius: 4px;\n border-width: 2px;\n color: #506784;\n}\n\n.plain {\n display: block !important;\n}\n.plain > form > p {\n display: none;\n}\n.plain pre {\n padding: 15px !important;\n overflow-x: scroll;\n}\n\n.debugger div.traceback pre {\n cursor: default;\n}\n\n.debugger .traceback .source pre.line img {\n display: none;\n}\n"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/partition.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/isNil.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/groupBy.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/filter.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/reduce.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/concat.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/toPairs.js"); +/* harmony import */ var _actions_callbacks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../actions/callbacks */ "./src/actions/callbacks.ts"); +/* harmony import */ var _utils_callbacks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/callbacks */ "./src/utils/callbacks.ts"); +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } -/***/ }), -/***/ "./src/constants/constants.js": -/*!************************************!*\ - !*** ./src/constants/constants.js ***! - \************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ JWT_EXPIRED_MESSAGE: function() { return /* binding */ JWT_EXPIRED_MESSAGE; }, -/* harmony export */ OAUTH_COOKIE_NAME: function() { return /* binding */ OAUTH_COOKIE_NAME; }, -/* harmony export */ REDIRECT_URI_PATHNAME: function() { return /* binding */ REDIRECT_URI_PATHNAME; }, -/* harmony export */ STATUS: function() { return /* binding */ STATUS; }, -/* harmony export */ STATUSMAP: function() { return /* binding */ STATUSMAP; } -/* harmony export */ }); -var REDIRECT_URI_PATHNAME = '/_oauth2/callback'; -var OAUTH_COOKIE_NAME = 'plotly_oauth_token'; -var JWT_EXPIRED_MESSAGE = 'JWT Expired'; -var STATUS = { - OK: 200, - PREVENT_UPDATE: 204, - // We accept both 400 and 401 for JWT token expiry responses. - // Some servers use code 400 for expired tokens, because - // they reserve 401 for cases that require user action - BAD_REQUEST: 400, - UNAUTHORIZED: 401, - CLIENTSIDE_ERROR: 'CLIENTSIDE_ERROR', - NO_RESPONSE: 'NO_RESPONSE' -}; -var STATUSMAP = { - [STATUS.OK]: 'SUCCESS', - [STATUS.PREVENT_UPDATE]: 'NO_UPDATE' +var observer = { + observer: function observer(_ref) { + var dispatch = _ref.dispatch, + getState = _ref.getState; + var _getState = getState(), + callbacks = _getState.callbacks; + var pendingCallbacks = (0,_utils_callbacks__WEBPACK_IMPORTED_MODULE_1__.getPendingCallbacks)(callbacks); + var _getState2 = getState(), + stored = _getState2.callbacks.stored; + var _partition = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (cb) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(cb.executionGroup); + }, stored), + _partition2 = _slicedToArray(_partition, 2), + nullGroupCallbacks = _partition2[0], + groupCallbacks = _partition2[1]; + var executionGroups = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(function (cb) { + return cb.executionGroup; + }, groupCallbacks); + var pendingGroups = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(function (cb) { + return cb.executionGroup; + }, (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(function (cb) { + return !(0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(cb.executionGroup); + }, pendingCallbacks)); + var dropped = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(function (res, _ref2) { + var _ref3 = _slicedToArray(_ref2, 2), + executionGroup = _ref3[0], + executionGroupCallbacks = _ref3[1]; + return !pendingGroups[executionGroup] ? (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(res, executionGroupCallbacks) : res; + }, [], (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(executionGroups)); + dispatch((0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.aggregateCallbacks)([nullGroupCallbacks.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.removeStoredCallbacks)(nullGroupCallbacks) : null, dropped.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_0__.removeStoredCallbacks)(dropped) : null])); + }, + inputs: ['callbacks.stored', 'callbacks.completed'] }; +/* harmony default export */ __webpack_exports__["default"] = (observer); /***/ }), -/***/ "./src/exceptions.js": -/*!***************************!*\ - !*** ./src/exceptions.js ***! - \***************************/ +/***/ "./src/persistence.js": +/*!****************************!*\ + !*** ./src/persistence.js ***! + \****************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ propTypeErrorHandler: function() { return /* binding */ propTypeErrorHandler; } +/* harmony export */ applyPersistence: function() { return /* binding */ applyPersistence; }, +/* harmony export */ prunePersistence: function() { return /* binding */ prunePersistence; }, +/* harmony export */ recordUiEdit: function() { return /* binding */ recordUiEdit; }, +/* harmony export */ storePrefix: function() { return /* binding */ storePrefix; }, +/* harmony export */ stores: function() { return /* binding */ stores; } /* harmony export */ }); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); - -function propTypeErrorHandler(message, props, type) { - /* - * propType error messages are constructed in - * https://github.com/facebook/prop-types/blob/v15.7.2/factoryWithTypeCheckers.js - * (Version 15.7.2) - * - * Parse these exception objects to remove JS source code and improve - * the clarity. - * - * If wrong prop type was passed in, message looks like: - * - * Error: "Failed component prop type: Invalid component prop `animate` of type `number` supplied to `function GraphWithDefaults(props) { - * var id = props.id ? props.id : generateId(); - * return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(PlotlyGraph, _extends({}, props, { - * id: id - * })); - * }`, expected `boolean`." - * - * - * If a required prop type was omitted, message looks like: - * - * "Failed component prop type: The component prop `options[0].value` is marked as required in `function Checklist(props) { - * var _this; - * - * _classCallCheck(this, Checklist); - * - * _this = _possibleConstructorReturn(this, _getPrototypeOf(Checklist).call(this, props)); - * _this.state = { - * values: props.values - * }; - * return _this; - * }`, but its value is `undefined`." - * - */ - - var messageParts = message.split('`'); - var errorMessage; - if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__.includes)('is marked as required', message)) { - var invalidPropPath = messageParts[1]; - errorMessage = "".concat(invalidPropPath, " in ").concat(type); - if (props.id) { - errorMessage += " with ID \"".concat(props.id, "\""); - } - errorMessage += ' is required but it was not provided.'; - } else if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__.includes)('Bad object', message)) { - /* - * Handle .exact errors - * https://github.com/facebook/prop-types/blob/v15.7.2/factoryWithTypeCheckers.js#L438-L442 - */ - errorMessage = message.split('supplied to ')[0] + "supplied to ".concat(type) + '.\nBad' + message.split('.\nBad')[1]; - } else if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__.includes)('Invalid ', message) && (0,ramda__WEBPACK_IMPORTED_MODULE_0__.includes)(' supplied to ', message)) { - var _invalidPropPath = messageParts[1]; - errorMessage = "Invalid argument `".concat(_invalidPropPath, "` passed into ").concat(type); - if (props.id) { - errorMessage += " with ID \"".concat(props.id, "\""); - } - errorMessage += '.'; - - /* - * Not all error messages include the expected value. - * In particular, oneOfType. - * https://github.com/facebook/prop-types/blob/v15.7.2/factoryWithTypeCheckers.js#L388 - */ - if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__.includes)(', expected ', message)) { - var expectedPropType = message.split(', expected ')[1]; - errorMessage += "\nExpected ".concat(expectedPropType); - } - - /* - * Not all error messages include the type - * In particular, oneOfType. - * https://github.com/facebook/prop-types/blob/v15.7.2/factoryWithTypeCheckers.js#L388 - */ - if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__.includes)(' of type `', message)) { - var invalidPropTypeProvided = message.split(' of type `')[1].split('`')[0]; - errorMessage += "\nWas supplied type `".concat(invalidPropTypeProvided, "`."); - } - if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__.has)(_invalidPropPath, props)) { - /* - * invalidPropPath may be nested like `options[0].value`. - * For now, we won't try to unpack these nested options - * but we could in the future. - */ - var jsonSuppliedValue = JSON.stringify(props[_invalidPropPath], null, 2); - if (jsonSuppliedValue) { - if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__.includes)('\n', jsonSuppliedValue)) { - errorMessage += "\nValue provided: \n".concat(jsonSuppliedValue); - } else { - errorMessage += "\nValue provided: ".concat(jsonSuppliedValue); - } - } - } - } else { - /* - * Not aware of other prop type warning messages. - * But, if they exist, then at least throw the default - * react prop types error - */ - throw new Error(message); - } - throw new Error(errorMessage); -} - -/***/ }), - -/***/ "./src/isSimpleComponent.js": -/*!**********************************!*\ - !*** ./src/isSimpleComponent.js ***! - \**********************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); - -var SIMPLE_COMPONENT_TYPES = ['String', 'Number', 'Null', 'Boolean']; -/* harmony default export */ __webpack_exports__["default"] = (function (component) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.includes)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.type)(component), SIMPLE_COMPONENT_TYPES); -}); - -/***/ }), - -/***/ "./src/persistence.js": -/*!****************************!*\ - !*** ./src/persistence.js ***! - \****************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ applyPersistence: function() { return /* binding */ applyPersistence; }, -/* harmony export */ prunePersistence: function() { return /* binding */ prunePersistence; }, -/* harmony export */ recordUiEdit: function() { return /* binding */ recordUiEdit; }, -/* harmony export */ storePrefix: function() { return /* binding */ storePrefix; }, -/* harmony export */ stores: function() { return /* binding */ stores; } -/* harmony export */ }); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var redux_actions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! redux-actions */ "./node_modules/redux-actions/es/createAction.js"); -/* harmony import */ var _registry__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./registry */ "./src/registry.js"); -/* harmony import */ var _actions_dependencies__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./actions/dependencies */ "./src/actions/dependencies.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/forEach.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/filter.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/keys.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/type.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/equals.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/set.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/lensPath.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mergeRight.js"); +/* harmony import */ var redux_actions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! redux-actions */ "./node_modules/redux-actions/es/createAction.js"); +/* harmony import */ var _registry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./registry */ "./src/registry.js"); +/* harmony import */ var _actions_dependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./actions/dependencies */ "./src/actions/dependencies.js"); function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } @@ -8009,7 +7788,7 @@ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === var storePrefix = '_dash_persistence.'; function err(e) { var error = typeof e === 'string' ? new Error(e) : e; - return (0,redux_actions__WEBPACK_IMPORTED_MODULE_3__["default"])('ON_ERROR')({ + return (0,redux_actions__WEBPACK_IMPORTED_MODULE_2__["default"])('ON_ERROR')({ type: 'frontEnd', error }); @@ -8099,7 +7878,7 @@ var WebStore = /*#__PURE__*/function () { keysToRemove.push(fullKey); } } - (0,ramda__WEBPACK_IMPORTED_MODULE_0__.forEach)(function (k) { + (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(function (k) { return _this._storage.removeItem(k); }, keysToRemove); } @@ -8138,9 +7917,9 @@ var MemStore = /*#__PURE__*/function () { value: function clear(keyPrefix) { var _this2 = this; if (keyPrefix) { - (0,ramda__WEBPACK_IMPORTED_MODULE_0__.forEach)(function (key) { + (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(function (key) { return delete _this2._data[key]; - }, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.filter)(keyPrefixMatch(keyPrefix, '.'), (0,ramda__WEBPACK_IMPORTED_MODULE_0__.keys)(this._data))); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(keyPrefixMatch(keyPrefix, '.'), (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(this._data))); } else { this._data = {}; } @@ -8222,7 +8001,7 @@ var getTransform = function getTransform(element, propName, propPart) { return noopTransform; }; var getValsKey = function getValsKey(id, persistedProp, persistence) { - return "".concat((0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_2__.stringifyId)(id), ".").concat(persistedProp, ".").concat(JSON.stringify(persistence)); + return "".concat((0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_1__.stringifyId)(id), ".").concat(persistedProp, ".").concat(JSON.stringify(persistence)); }; var getProps = function getProps(layout) { var props = layout.props, @@ -8236,7 +8015,7 @@ var getProps = function getProps(layout) { } var id = props.id, persistence = props.persistence; - var element = _registry__WEBPACK_IMPORTED_MODULE_1__["default"].resolve(layout); + var element = _registry__WEBPACK_IMPORTED_MODULE_0__["default"].resolve(layout); var getVal = function getVal(prop) { return props[prop] || (element.defaultProps || {})[prop]; }; @@ -8265,7 +8044,7 @@ function recordUiEdit(layout, newProps, dispatch) { if (!canPersist || !persistence) { return; } - (0,ramda__WEBPACK_IMPORTED_MODULE_0__.forEach)(function (persistedProp) { + (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(function (persistedProp) { var _persistedProp$split = persistedProp.split('.'), _persistedProp$split2 = _slicedToArray(_persistedProp$split, 2), propName = _persistedProp$split2[0], @@ -8297,7 +8076,7 @@ function recordUiEdit(layout, newProps, dispatch) { * callbacks) to apply previously-stored UI edits to components */ function applyPersistence(layout, dispatch) { - if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__.type)(layout) !== 'Object' || !layout.props) { + if ((0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(layout) !== 'Object' || !layout.props) { return layout; } return persistenceMods(layout, layout, [], dispatch); @@ -8316,7 +8095,7 @@ function modProp(key, storage, element, props, persistedProp, update, undo) { propName = _persistedProp$split4[0], propPart = _persistedProp$split4[1]; var transform = getTransform(element, propName, propPart); - if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__.equals)(fromVal, transform.extract(props[propName]))) { + if ((0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(fromVal, transform.extract(props[propName]))) { update[propName] = transform.apply(toVal, propName in update ? update[propName] : props[propName]); } else { // clear this saved edit - we've started with the wrong @@ -8338,11 +8117,11 @@ function persistenceMods(layout, component, path, dispatch) { if (canPersist && persistence) { var storage = getStore(persistence_type, dispatch); var update = {}; - (0,ramda__WEBPACK_IMPORTED_MODULE_0__.forEach)(function (persistedProp) { + (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(function (persistedProp) { return modProp(getValsKey(id, persistedProp, persistence), storage, element, props, persistedProp, update); }, persisted_props); for (var propName in update) { - layoutOut = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.set)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.lensPath)(path.concat('props', propName)), update[propName], layoutOut); + layoutOut = (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(path.concat('props', propName)), update[propName], layoutOut); } } @@ -8350,11 +8129,11 @@ function persistenceMods(layout, component, path, dispatch) { var children = props.children; if (Array.isArray(children)) { children.forEach(function (child, i) { - if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__.type)(child) === 'Object' && child.props) { + if ((0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(child) === 'Object' && child.props) { layoutOut = persistenceMods(layoutOut, child, path.concat('props', 'children', i), dispatch); } }); - } else if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__.type)(children) === 'Object' && children.props) { + } else if ((0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(children) === 'Object' && children.props) { layoutOut = persistenceMods(layoutOut, children, path.concat('props', 'children'), dispatch); } return layoutOut; @@ -8392,18 +8171,18 @@ function prunePersistence(layout, newProps, dispatch) { if (persistenceChanged && persistence) { // clear previously-applied persistence var storage = getStore(persistence_type, dispatch); - (0,ramda__WEBPACK_IMPORTED_MODULE_0__.forEach)(function (persistedProp) { + (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(function (persistedProp) { return modProp(getValsKey(id, persistedProp, persistence), storage, element, props, persistedProp, update, UNDO); - }, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.filter)(notInNewProps, persisted_props)); - depersistedProps = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.mergeRight)(props, update); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(notInNewProps, persisted_props)); + depersistedProps = (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(props, update); } if (finalPersistence) { var finalStorage = getStore(finalPersistenceType, dispatch); if (persistenceChanged) { // apply new persistence - (0,ramda__WEBPACK_IMPORTED_MODULE_0__.forEach)(function (persistedProp) { + (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(function (persistedProp) { return modProp(getValsKey(id, persistedProp, finalPersistence), finalStorage, element, depersistedProps, persistedProp, update); - }, (0,ramda__WEBPACK_IMPORTED_MODULE_0__.filter)(notInNewProps, finalPersistedProps)); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(notInNewProps, finalPersistedProps)); } // now the main point - clear any edit of a prop that changed @@ -8420,7 +8199,7 @@ function prunePersistence(layout, newProps, dispatch) { } } } - return persistenceChanged ? (0,ramda__WEBPACK_IMPORTED_MODULE_0__.mergeRight)(newProps, update) : newProps; + return persistenceChanged ? (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(newProps, update) : newProps; } /***/ }), @@ -8436,7 +8215,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ createApiReducer; } /* harmony export */ }); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assocPath.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assoc.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mergeRight.js"); function createApiReducer(store) { return function ApiReducer() { @@ -8453,11 +8234,11 @@ function createApiReducer(store) { content }; if (Array.isArray(id)) { - newState = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assocPath)(id, newRequest, state); + newState = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(id, newRequest, state); } else if (id) { - newState = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assoc)(id, newRequest, state); + newState = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(id, newRequest, state); } else { - newState = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.mergeRight)(state, newRequest); + newState = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(state, newRequest); } } return newState; @@ -8492,6 +8273,159 @@ function appLifecycle() { /***/ }), +/***/ "./src/reducers/callbackJobs.ts": +/*!**************************************!*\ + !*** ./src/reducers/callbackJobs.ts ***! + \**************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } +/* harmony export */ }); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assoc.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/dissoc.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assocPath.js"); + +var setJob = function setJob(job, state) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(job.jobId, job, state); +}; +var removeJob = function removeJob(jobId, state) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(jobId, state); +}; +var setOutdated = function setOutdated(jobId, state) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])([jobId, 'outdated'], true, state); +}; +/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var action = arguments.length > 1 ? arguments[1] : undefined; + switch (action.type) { + case 'ADD_CALLBACK_JOB': + return setJob(action.payload, state); + case 'REMOVE_CALLBACK_JOB': + return removeJob(action.payload.jobId, state); + case 'CALLBACK_JOB_OUTDATED': + return setOutdated(action.payload.jobId, state); + default: + return state; + } +} + +/***/ }), + +/***/ "./src/reducers/callbacks.ts": +/*!***********************************!*\ + !*** ./src/reducers/callbacks.ts ***! + \***********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ CallbackActionType: function() { return /* binding */ CallbackActionType; }, +/* harmony export */ CallbackAggregateActionType: function() { return /* binding */ CallbackAggregateActionType; } +/* harmony export */ }); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/concat.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/difference.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/reduce.js"); +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } + +var CallbackActionType = /*#__PURE__*/function (CallbackActionType) { + CallbackActionType["AddBlocked"] = "Callbacks.AddBlocked"; + CallbackActionType["AddExecuted"] = "Callbacks.AddExecuted"; + CallbackActionType["AddExecuting"] = "Callbacks.AddExecuting"; + CallbackActionType["AddPrioritized"] = "Callbacks.AddPrioritized"; + CallbackActionType["AddRequested"] = "Callbacks.AddRequested"; + CallbackActionType["AddStored"] = "Callbacks.AddStored"; + CallbackActionType["AddWatched"] = "Callbacks.AddWatched"; + CallbackActionType["RemoveBlocked"] = "Callbacks.RemoveBlocked"; + CallbackActionType["RemoveExecuted"] = "Callbacks.RemoveExecuted"; + CallbackActionType["RemoveExecuting"] = "Callbacks.RemoveExecuting"; + CallbackActionType["RemovePrioritized"] = "Callbacks.RemovePrioritized"; + CallbackActionType["RemoveRequested"] = "Callbacks.RemoveRequested"; + CallbackActionType["RemoveStored"] = "Callbacks.RemoveStored"; + CallbackActionType["RemoveWatched"] = "Callbacks.RemoveWatched"; + return CallbackActionType; +}({}); +var CallbackAggregateActionType = /*#__PURE__*/function (CallbackAggregateActionType) { + CallbackAggregateActionType["AddCompleted"] = "Callbacks.Completed"; + CallbackAggregateActionType["Aggregate"] = "Callbacks.Aggregate"; + return CallbackAggregateActionType; +}({}); +var DEFAULT_STATE = { + blocked: [], + executed: [], + executing: [], + prioritized: [], + requested: [], + stored: [], + watched: [], + completed: 0 +}; +var transforms = { + [CallbackActionType.AddBlocked]: ramda__WEBPACK_IMPORTED_MODULE_0__["default"], + [CallbackActionType.AddExecuted]: ramda__WEBPACK_IMPORTED_MODULE_0__["default"], + [CallbackActionType.AddExecuting]: ramda__WEBPACK_IMPORTED_MODULE_0__["default"], + [CallbackActionType.AddPrioritized]: ramda__WEBPACK_IMPORTED_MODULE_0__["default"], + [CallbackActionType.AddRequested]: ramda__WEBPACK_IMPORTED_MODULE_0__["default"], + [CallbackActionType.AddStored]: ramda__WEBPACK_IMPORTED_MODULE_0__["default"], + [CallbackActionType.AddWatched]: ramda__WEBPACK_IMPORTED_MODULE_0__["default"], + [CallbackActionType.RemoveBlocked]: ramda__WEBPACK_IMPORTED_MODULE_1__["default"], + [CallbackActionType.RemoveExecuted]: ramda__WEBPACK_IMPORTED_MODULE_1__["default"], + [CallbackActionType.RemoveExecuting]: ramda__WEBPACK_IMPORTED_MODULE_1__["default"], + [CallbackActionType.RemovePrioritized]: ramda__WEBPACK_IMPORTED_MODULE_1__["default"], + [CallbackActionType.RemoveRequested]: ramda__WEBPACK_IMPORTED_MODULE_1__["default"], + [CallbackActionType.RemoveStored]: ramda__WEBPACK_IMPORTED_MODULE_1__["default"], + [CallbackActionType.RemoveWatched]: ramda__WEBPACK_IMPORTED_MODULE_1__["default"] +}; +var fields = { + [CallbackActionType.AddBlocked]: 'blocked', + [CallbackActionType.AddExecuted]: 'executed', + [CallbackActionType.AddExecuting]: 'executing', + [CallbackActionType.AddPrioritized]: 'prioritized', + [CallbackActionType.AddRequested]: 'requested', + [CallbackActionType.AddStored]: 'stored', + [CallbackActionType.AddWatched]: 'watched', + [CallbackActionType.RemoveBlocked]: 'blocked', + [CallbackActionType.RemoveExecuted]: 'executed', + [CallbackActionType.RemoveExecuting]: 'executing', + [CallbackActionType.RemovePrioritized]: 'prioritized', + [CallbackActionType.RemoveRequested]: 'requested', + [CallbackActionType.RemoveStored]: 'stored', + [CallbackActionType.RemoveWatched]: 'watched' +}; +var mutateCompleted = function mutateCompleted(state, action) { + return _objectSpread(_objectSpread({}, state), {}, { + completed: state.completed + action.payload + }); +}; +var mutateCallbacks = function mutateCallbacks(state, action) { + var transform = transforms[action.type]; + var field = fields[action.type]; + return !transform || !field || action.payload.length === 0 ? state : _objectSpread(_objectSpread({}, state), {}, { + [field]: transform(state[field], action.payload) + }); +}; +/* harmony default export */ __webpack_exports__["default"] = (function () { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_STATE; + var action = arguments.length > 1 ? arguments[1] : undefined; + return (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (s, a) { + if (a === null) { + return s; + } else if (a.type === CallbackAggregateActionType.AddCompleted) { + return mutateCompleted(s, a); + } + return mutateCallbacks(s, a); + }, state, action.type === CallbackAggregateActionType.Aggregate ? action.payload : [action]); +}); + +/***/ }), + /***/ "./src/reducers/changed.js": /*!*********************************!*\ !*** ./src/reducers/changed.js ***! @@ -8527,7 +8461,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ "default": function() { return /* binding */ config; } /* harmony export */ }); /* harmony import */ var _actions_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../actions/constants */ "./src/actions/constants.js"); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mergeDeepRight.js"); function config() { @@ -8535,10 +8469,10 @@ function config() { var action = arguments.length > 1 ? arguments[1] : undefined; if (action.type === (0,_actions_constants__WEBPACK_IMPORTED_MODULE_0__.getAction)('SET_CONFIG')) { // Put the components childrenProps in windows for side usage. - window.__dashprivate_childrenProps = (0,ramda__WEBPACK_IMPORTED_MODULE_1__.mergeDeepRight)(window.__dashprivate_childrenProps || {}, action.payload.children_props); + window.__dashprivate_childrenProps = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(window.__dashprivate_childrenProps || {}, action.payload.children_props); return action.payload; } else if (action.type === (0,_actions_constants__WEBPACK_IMPORTED_MODULE_0__.getAction)('ADD_HTTP_HEADERS')) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_1__.mergeDeepRight)(state, { + return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(state, { fetch: { headers: action.payload } @@ -8606,7 +8540,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ error; } /* harmony export */ }); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mergeRight.js"); function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } @@ -8634,7 +8568,7 @@ function error() { console.error(action.payload.error); if (action.payload.type === 'frontEnd') { return { - frontEnd: [(0,ramda__WEBPACK_IMPORTED_MODULE_0__.mergeRight)(action.payload, { + frontEnd: [(0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(action.payload, { timestamp: new Date() })].concat(_toConsumableArray(frontEnd)), backEnd, @@ -8643,7 +8577,7 @@ function error() { } else if (action.payload.type === 'backEnd') { return { frontEnd, - backEnd: [(0,ramda__WEBPACK_IMPORTED_MODULE_0__.mergeRight)(action.payload, { + backEnd: [(0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(action.payload, { timestamp: new Date() })].concat(_toConsumableArray(backEnd)), backEndConnected @@ -8653,7 +8587,7 @@ function error() { } case 'SET_CONNECTION_STATUS': { - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.mergeRight)(state, { + return (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(state, { backEndConnected: action.payload }); } @@ -8767,6 +8701,30 @@ var customHooks = function customHooks() { /***/ }), +/***/ "./src/reducers/isLoading.ts": +/*!***********************************!*\ + !*** ./src/reducers/isLoading.ts ***! + \***********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ IsLoadingActionType: function() { return /* binding */ IsLoadingActionType; } +/* harmony export */ }); +var IsLoadingActionType = /*#__PURE__*/function (IsLoadingActionType) { + IsLoadingActionType["Set"] = "IsLoading.Set"; + return IsLoadingActionType; +}({}); +var DEFAULT_STATE = true; +/* harmony default export */ __webpack_exports__["default"] = (function () { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_STATE; + var action = arguments.length > 1 ? arguments[1] : undefined; + return action.type === IsLoadingActionType.Set ? action.payload : state; +}); + +/***/ }), + /***/ "./src/reducers/layout.js": /*!********************************!*\ !*** ./src/reducers/layout.js ***! @@ -8775,20 +8733,25 @@ var customHooks = function customHooks() { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var _actions_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../actions/constants */ "./src/actions/constants.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/includes.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/append.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/view.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/lensPath.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mergeRight.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assocPath.js"); +/* harmony import */ var _actions_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../actions/constants */ "./src/actions/constants.js"); var layout = function layout() { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var action = arguments.length > 1 ? arguments[1] : undefined; - if (action.type === (0,_actions_constants__WEBPACK_IMPORTED_MODULE_1__.getAction)('SET_LAYOUT')) { + if (action.type === (0,_actions_constants__WEBPACK_IMPORTED_MODULE_0__.getAction)('SET_LAYOUT')) { return action.payload; - } else if ((0,ramda__WEBPACK_IMPORTED_MODULE_0__.includes)(action.type, ['UNDO_PROP_CHANGE', 'REDO_PROP_CHANGE', (0,_actions_constants__WEBPACK_IMPORTED_MODULE_1__.getAction)('ON_PROP_CHANGE')])) { - var propPath = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.append)('props', action.payload.itempath); - var existingProps = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.view)((0,ramda__WEBPACK_IMPORTED_MODULE_0__.lensPath)(propPath), state); - var mergedProps = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.mergeRight)(existingProps, action.payload.props); - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__.assocPath)(propPath, mergedProps, state); + } else if ((0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(action.type, ['UNDO_PROP_CHANGE', 'REDO_PROP_CHANGE', (0,_actions_constants__WEBPACK_IMPORTED_MODULE_0__.getAction)('ON_PROP_CHANGE')])) { + var propPath = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])('props', action.payload.itempath); + var existingProps = (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(propPath), state); + var mergedProps = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(existingProps, action.payload.props); + return (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(propPath, mergedProps, state); } return state; }; @@ -8796,6 +8759,30 @@ var layout = function layout() { /***/ }), +/***/ "./src/reducers/loadingMap.ts": +/*!************************************!*\ + !*** ./src/reducers/loadingMap.ts ***! + \************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ LoadingMapActionType: function() { return /* binding */ LoadingMapActionType; } +/* harmony export */ }); +var LoadingMapActionType = /*#__PURE__*/function (LoadingMapActionType) { + LoadingMapActionType["Set"] = "LoadingMap.Set"; + return LoadingMapActionType; +}({}); +var DEFAULT_STATE = {}; +/* harmony default export */ __webpack_exports__["default"] = (function () { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_STATE; + var action = arguments.length > 1 ? arguments[1] : undefined; + return action.type === LoadingMapActionType.Set ? action.payload : state; +}); + +/***/ }), + /***/ "./src/reducers/paths.js": /*!*******************************!*\ !*** ./src/reducers/paths.js ***! @@ -8830,8 +8817,8 @@ var paths = function paths() { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); -/* harmony import */ var _constants_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants/constants */ "./src/constants/constants.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/clone.js"); +/* harmony import */ var _constants_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants/constants */ "./src/constants/constants.js"); var _excluded = ["__dash_client", "__dash_server", "__dash_upload", "__dash_download"]; function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } @@ -8869,7 +8856,7 @@ var profile = function profile() { id = _action$payload.id, usage = _action$payload.usage, status = _action$payload.status; - var statusMapped = _constants_constants__WEBPACK_IMPORTED_MODULE_1__.STATUSMAP[status] || status; + var statusMapped = _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUSMAP[status] || status; // Keep track of the callback that actually changed. var newState = { @@ -8881,7 +8868,7 @@ var profile = function profile() { // See CallbackGraphContainer.react graphLayout: state.graphLayout }; - newState.callbacks[id] = newState.callbacks[id] || (0,ramda__WEBPACK_IMPORTED_MODULE_0__.clone)(defaultProfile); + newState.callbacks[id] = newState.callbacks[id] || (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(defaultProfile); var cb = newState.callbacks[id]; var cbResources = cb.resources; var totalResources = newState.resources; @@ -8931,24 +8918,27 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ apiRequests: function() { return /* binding */ apiRequests; }, /* harmony export */ createReducer: function() { return /* binding */ createReducer; } /* harmony export */ }); -/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/index.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/forEach.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/keys.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/isEmpty.js"); /* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! redux */ "./node_modules/redux/es/redux.js"); -/* harmony import */ var _actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../actions/dependencies_ts */ "./src/actions/dependencies_ts.ts"); -/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./api */ "./src/reducers/api.js"); -/* harmony import */ var _appLifecycle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./appLifecycle */ "./src/reducers/appLifecycle.js"); -/* harmony import */ var _callbacks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./callbacks */ "./src/reducers/callbacks.ts"); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./config */ "./src/reducers/config.js"); -/* harmony import */ var _dependencyGraph__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dependencyGraph */ "./src/reducers/dependencyGraph.js"); -/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./error */ "./src/reducers/error.js"); -/* harmony import */ var _history__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./history */ "./src/reducers/history.js"); -/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./hooks */ "./src/reducers/hooks.js"); -/* harmony import */ var _profile__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./profile */ "./src/reducers/profile.js"); -/* harmony import */ var _changed__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./changed */ "./src/reducers/changed.js"); -/* harmony import */ var _isLoading__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./isLoading */ "./src/reducers/isLoading.ts"); -/* harmony import */ var _layout__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./layout */ "./src/reducers/layout.js"); -/* harmony import */ var _loadingMap__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./loadingMap */ "./src/reducers/loadingMap.ts"); -/* harmony import */ var _paths__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./paths */ "./src/reducers/paths.js"); -/* harmony import */ var _callbackJobs__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./callbackJobs */ "./src/reducers/callbackJobs.ts"); +/* harmony import */ var _actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../actions/dependencies_ts */ "./src/actions/dependencies_ts.ts"); +/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./api */ "./src/reducers/api.js"); +/* harmony import */ var _appLifecycle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./appLifecycle */ "./src/reducers/appLifecycle.js"); +/* harmony import */ var _callbacks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./callbacks */ "./src/reducers/callbacks.ts"); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./config */ "./src/reducers/config.js"); +/* harmony import */ var _dependencyGraph__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./dependencyGraph */ "./src/reducers/dependencyGraph.js"); +/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./error */ "./src/reducers/error.js"); +/* harmony import */ var _history__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./history */ "./src/reducers/history.js"); +/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./hooks */ "./src/reducers/hooks.js"); +/* harmony import */ var _profile__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./profile */ "./src/reducers/profile.js"); +/* harmony import */ var _changed__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./changed */ "./src/reducers/changed.js"); +/* harmony import */ var _isLoading__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./isLoading */ "./src/reducers/isLoading.ts"); +/* harmony import */ var _layout__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./layout */ "./src/reducers/layout.js"); +/* harmony import */ var _loadingMap__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./loadingMap */ "./src/reducers/loadingMap.ts"); +/* harmony import */ var _paths__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./paths */ "./src/reducers/paths.js"); +/* harmony import */ var _callbackJobs__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./callbackJobs */ "./src/reducers/callbackJobs.ts"); function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } @@ -8976,24 +8966,24 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len var apiRequests = ['dependenciesRequest', 'layoutRequest', 'reloadRequest', 'loginRequest']; function mainReducer() { var parts = { - appLifecycle: _appLifecycle__WEBPACK_IMPORTED_MODULE_3__["default"], - callbacks: _callbacks__WEBPACK_IMPORTED_MODULE_4__["default"], - config: _config__WEBPACK_IMPORTED_MODULE_5__["default"], - error: _error__WEBPACK_IMPORTED_MODULE_7__["default"], - graphs: _dependencyGraph__WEBPACK_IMPORTED_MODULE_6__["default"], - history: _history__WEBPACK_IMPORTED_MODULE_8__["default"], - hooks: _hooks__WEBPACK_IMPORTED_MODULE_9__["default"], - profile: _profile__WEBPACK_IMPORTED_MODULE_10__["default"], - changed: _changed__WEBPACK_IMPORTED_MODULE_11__["default"], - isLoading: _isLoading__WEBPACK_IMPORTED_MODULE_12__["default"], - layout: _layout__WEBPACK_IMPORTED_MODULE_13__["default"], - loadingMap: _loadingMap__WEBPACK_IMPORTED_MODULE_14__["default"], - paths: _paths__WEBPACK_IMPORTED_MODULE_15__["default"] + appLifecycle: _appLifecycle__WEBPACK_IMPORTED_MODULE_2__["default"], + callbacks: _callbacks__WEBPACK_IMPORTED_MODULE_3__["default"], + config: _config__WEBPACK_IMPORTED_MODULE_4__["default"], + error: _error__WEBPACK_IMPORTED_MODULE_6__["default"], + graphs: _dependencyGraph__WEBPACK_IMPORTED_MODULE_5__["default"], + history: _history__WEBPACK_IMPORTED_MODULE_7__["default"], + hooks: _hooks__WEBPACK_IMPORTED_MODULE_8__["default"], + profile: _profile__WEBPACK_IMPORTED_MODULE_9__["default"], + changed: _changed__WEBPACK_IMPORTED_MODULE_10__["default"], + isLoading: _isLoading__WEBPACK_IMPORTED_MODULE_11__["default"], + layout: _layout__WEBPACK_IMPORTED_MODULE_12__["default"], + loadingMap: _loadingMap__WEBPACK_IMPORTED_MODULE_13__["default"], + paths: _paths__WEBPACK_IMPORTED_MODULE_14__["default"] }; - (0,ramda__WEBPACK_IMPORTED_MODULE_0__.forEach)(function (r) { - parts[r] = (0,_api__WEBPACK_IMPORTED_MODULE_2__["default"])(r); + (0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(function (r) { + parts[r] = (0,_api__WEBPACK_IMPORTED_MODULE_1__["default"])(r); }, apiRequests); - parts.callbackJobs = _callbackJobs__WEBPACK_IMPORTED_MODULE_16__["default"]; + parts.callbackJobs = _callbackJobs__WEBPACK_IMPORTED_MODULE_15__["default"]; return (0,redux__WEBPACK_IMPORTED_MODULE_17__.combineReducers)(parts); } function getInputHistoryState(payload, state, recordChanges) { @@ -9002,7 +8992,7 @@ function getInputHistoryState(payload, state, recordChanges) { layout = state.layout; var itempath = payload.itempath, props = payload.props; - var refProps = (0,ramda__WEBPACK_IMPORTED_MODULE_0__.path)(itempath.concat(['props']), layout) || {}; + var refProps = (0,ramda__WEBPACK_IMPORTED_MODULE_18__["default"])(itempath.concat(['props']), layout) || {}; var id = refProps.id; var historyEntry; if (id) { @@ -9016,8 +9006,8 @@ function getInputHistoryState(payload, state, recordChanges) { id, props: {} }; - (0,ramda__WEBPACK_IMPORTED_MODULE_0__.keys)(props).forEach(function (propKey) { - if ((0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_1__.getCallbacksByInput)(graphs, paths, id, propKey).length) { + (0,ramda__WEBPACK_IMPORTED_MODULE_19__["default"])(props).forEach(function (propKey) { + if ((0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_0__.getCallbacksByInput)(graphs, paths, id, propKey).length) { historyEntry.props[propKey] = refProps[propKey]; } }); @@ -9032,7 +9022,7 @@ function recordHistory(reducer) { if (type === 'ON_PROP_CHANGE') { // history records all prop changes that are inputs. var historyEntry = getInputHistoryState(payload, state, true); - if (historyEntry && !(0,ramda__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(historyEntry.props)) { + if (historyEntry && !(0,ramda__WEBPACK_IMPORTED_MODULE_20__["default"])(historyEntry.props)) { state.history.present = historyEntry; } } @@ -9043,7 +9033,7 @@ function recordHistory(reducer) { * record it so that it can be played back */ var _historyEntry = getInputHistoryState(payload, nextState); - if (_historyEntry && !(0,ramda__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(_historyEntry.props)) { + if (_historyEntry && !(0,ramda__WEBPACK_IMPORTED_MODULE_20__["default"])(_historyEntry.props)) { nextState.history = { past: [].concat(_toConsumableArray(nextState.history.past), [state.history.present]), present: _historyEntry, @@ -9109,6 +9099,254 @@ __webpack_require__.r(__webpack_exports__); /***/ }), +/***/ "./src/store.ts": +/*!**********************!*\ + !*** ./src/store.ts ***! + \**********************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ RendererStore; } +/* harmony export */ }); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/once.js"); +/* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! redux */ "./node_modules/redux/es/redux.js"); +/* harmony import */ var redux_thunk__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! redux-thunk */ "./node_modules/redux-thunk/es/index.js"); +/* harmony import */ var _reducers_reducer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./reducers/reducer */ "./src/reducers/reducer.js"); +/* harmony import */ var _StoreObserver__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./StoreObserver */ "./src/StoreObserver.ts"); +/* harmony import */ var _observers_documentTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./observers/documentTitle */ "./src/observers/documentTitle.ts"); +/* harmony import */ var _observers_executedCallbacks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./observers/executedCallbacks */ "./src/observers/executedCallbacks.ts"); +/* harmony import */ var _observers_executingCallbacks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./observers/executingCallbacks */ "./src/observers/executingCallbacks.ts"); +/* harmony import */ var _observers_isLoading__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./observers/isLoading */ "./src/observers/isLoading.ts"); +/* harmony import */ var _observers_loadingMap__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./observers/loadingMap */ "./src/observers/loadingMap.ts"); +/* harmony import */ var _observers_prioritizedCallbacks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./observers/prioritizedCallbacks */ "./src/observers/prioritizedCallbacks.ts"); +/* harmony import */ var _observers_requestedCallbacks__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./observers/requestedCallbacks */ "./src/observers/requestedCallbacks.ts"); +/* harmony import */ var _observers_storedCallbacks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./observers/storedCallbacks */ "./src/observers/storedCallbacks.ts"); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } + + + + + + + + + + + + + +var RendererStore = /*#__PURE__*/function () { + function RendererStore() { + var _this = this; + _classCallCheck(this, RendererStore); + _defineProperty(this, "__store", void 0); + _defineProperty(this, "storeObserver", new _StoreObserver__WEBPACK_IMPORTED_MODULE_1__["default"]()); + _defineProperty(this, "setObservers", (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function () { + var observe = _this.storeObserver.observe; + observe(_observers_documentTitle__WEBPACK_IMPORTED_MODULE_2__["default"]); + observe(_observers_isLoading__WEBPACK_IMPORTED_MODULE_5__["default"]); + observe(_observers_loadingMap__WEBPACK_IMPORTED_MODULE_6__["default"]); + observe(_observers_requestedCallbacks__WEBPACK_IMPORTED_MODULE_8__["default"]); + observe(_observers_prioritizedCallbacks__WEBPACK_IMPORTED_MODULE_7__["default"]); + observe(_observers_executingCallbacks__WEBPACK_IMPORTED_MODULE_4__["default"]); + observe(_observers_executedCallbacks__WEBPACK_IMPORTED_MODULE_3__["default"]); + observe(_observers_storedCallbacks__WEBPACK_IMPORTED_MODULE_9__["default"]); + })); + _defineProperty(this, "createAppStore", function (reducer, middleware) { + _this.__store = (0,redux__WEBPACK_IMPORTED_MODULE_11__.createStore)(reducer, middleware); + _this.storeObserver.setStore(_this.__store); + _this.setObservers(); + }); + /** + * Initialize a Redux store with thunk, plus logging (only in development mode) middleware + * + * @param {bool} reset: discard any previous store + * + * @returns {Store} + * An initialized redux store with middleware and possible hot reloading of reducers + */ + _defineProperty(this, "initializeStore", function (reset) { + if (_this.__store && !reset) { + return _this.__store; + } + var reducer = (0,_reducers_reducer__WEBPACK_IMPORTED_MODULE_0__.createReducer)(); + + // eslint-disable-next-line no-process-env + if (false) {} else { + // only attach logger to middleware in non-production mode + var reduxDTEC = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__; + if (reduxDTEC) { + _this.createAppStore(reducer, reduxDTEC({ + actionsDenylist: ['reloadRequest'] + })((0,redux__WEBPACK_IMPORTED_MODULE_11__.applyMiddleware)(redux_thunk__WEBPACK_IMPORTED_MODULE_12__["default"]))); + } else { + _this.createAppStore(reducer, (0,redux__WEBPACK_IMPORTED_MODULE_11__.applyMiddleware)(redux_thunk__WEBPACK_IMPORTED_MODULE_12__["default"])); + } + } + if (!reset) { + // TODO - Protect this under a debug mode? + window.store = _this.__store; + } + if (false) {} + return _this.__store; + }); + this.__store = this.initializeStore(); + } + _createClass(RendererStore, [{ + key: "store", + get: function get() { + return this.__store; + } + }]); + return RendererStore; +}(); + + +/***/ }), + +/***/ "./src/utils/TreeContainer.ts": +/*!************************************!*\ + !*** ./src/utils/TreeContainer.ts ***! + \************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getLoadingHash: function() { return /* binding */ getLoadingHash; }, +/* harmony export */ getLoadingState: function() { return /* binding */ getLoadingState; }, +/* harmony export */ validateComponent: function() { return /* binding */ validateComponent; } +/* harmony export */ }); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/type.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/has.js"); +/* harmony import */ var _registry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../registry */ "./src/registry.js"); +/* harmony import */ var _actions_dependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../actions/dependencies */ "./src/actions/dependencies.js"); + + + +function isLoadingComponent(layout) { + validateComponent(layout); + return _registry__WEBPACK_IMPORTED_MODULE_0__["default"].resolve(layout)._dashprivate_isLoadingComponent; +} +var NULL_LOADING_STATE = false; +function getLoadingState(componentLayout, componentPath, loadingMap) { + var _loadingFragment$__da; + if (!loadingMap) { + return NULL_LOADING_STATE; + } + var loadingFragment = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(componentPath, loadingMap); + // Component and children are not loading if there's no loading fragment + // for the component's path in the layout. + if (!loadingFragment) { + return NULL_LOADING_STATE; + } + var idprop = loadingFragment.__dashprivate__idprop__; + if (idprop) { + return { + is_loading: true, + prop_name: idprop.property, + component_name: (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_1__.stringifyId)(idprop.id) + }; + } + var idprops = (_loadingFragment$__da = loadingFragment.__dashprivate__idprops__) === null || _loadingFragment$__da === void 0 ? void 0 : _loadingFragment$__da[0]; + if (idprops && isLoadingComponent(componentLayout)) { + return { + is_loading: true, + prop_name: idprops.property, + component_name: (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_1__.stringifyId)(idprops.id) + }; + } + return NULL_LOADING_STATE; +} +var getLoadingHash = function getLoadingHash(componentPath, loadingMap) { + var _ref, _path; + return ((_ref = loadingMap && ((_path = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(componentPath, loadingMap)) === null || _path === void 0 ? void 0 : _path.__dashprivate__idprops__)) !== null && _ref !== void 0 ? _ref : []).map(function (_ref2) { + var id = _ref2.id, + property = _ref2.property; + return "".concat(id, ".").concat(property); + }).join(','); +}; +function validateComponent(componentDefinition) { + if ((0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(componentDefinition) === 'Array') { + throw new Error('The children property of a component is a list of lists, instead ' + 'of just a list. ' + 'Check the component that has the following contents, ' + 'and remove one of the levels of nesting: \n' + JSON.stringify(componentDefinition, null, 2)); + } + if ((0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(componentDefinition) === 'Object' && !((0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])('namespace', componentDefinition) && (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])('type', componentDefinition) && (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])('props', componentDefinition))) { + throw new Error('An object was provided as `children` instead of a component, ' + 'string, or number (or list of those). ' + 'Check the children property that looks something like:\n' + JSON.stringify(componentDefinition, null, 2)); + } +} + +/***/ }), + +/***/ "./src/utils/callbacks.ts": +/*!********************************!*\ + !*** ./src/utils/callbacks.ts ***! + \********************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getPendingCallbacks: function() { return /* binding */ getPendingCallbacks; } +/* harmony export */ }); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/values.js"); +/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/omit.js"); +function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } +function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } + +var getPendingCallbacks = function getPendingCallbacks(state) { + var _Array; + return (_Array = Array()).concat.apply(_Array, _toConsumableArray((0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(['stored', 'completed'], state)))); +}; + +/***/ }), + +/***/ "./src/utils/wait.ts": +/*!***************************!*\ + !*** ./src/utils/wait.ts ***! + \***************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(typeof e + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } +/* harmony default export */ __webpack_exports__["default"] = (/*#__PURE__*/(function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(duration) { + var _resolve, p; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + p = new Promise(function (resolve) { + return _resolve = resolve; + }); + setTimeout(_resolve, duration); + return _context.abrupt("return", p); + case 3: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function (_x) { + return _ref.apply(this, arguments); + }; +})()); + +/***/ }), + /***/ "./node_modules/cytoscape-fcose/cytoscape-fcose.js": /*!*********************************************************!*\ !*** ./node_modules/cytoscape-fcose/cytoscape-fcose.js ***! @@ -10952,10 +11190,24 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -var ReactReduxContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(null); -if (true) { - ReactReduxContext.displayName = 'ReactRedux'; +var ContextKey = Symbol.for("react-redux-context"); +var gT = typeof globalThis !== "undefined" ? globalThis : /* fall back to a per-module scope (pre-8.1 behaviour) if `globalThis` is not available */ +{}; +function getContext() { + var _gT$ContextKey; + if (!react__WEBPACK_IMPORTED_MODULE_0__.createContext) return {}; + var contextMap = (_gT$ContextKey = gT[ContextKey]) != null ? _gT$ContextKey : gT[ContextKey] = new Map(); + var realContext = contextMap.get(react__WEBPACK_IMPORTED_MODULE_0__.createContext); + if (!realContext) { + realContext = react__WEBPACK_IMPORTED_MODULE_0__.createContext(null); + if (true) { + realContext.displayName = 'ReactRedux'; + } + contextMap.set(react__WEBPACK_IMPORTED_MODULE_0__.createContext, realContext); + } + return realContext; } +var ReactReduxContext = /*#__PURE__*/getContext(); /* harmony default export */ __webpack_exports__["default"] = (ReactReduxContext); /***/ }), @@ -10981,18 +11233,24 @@ function Provider(_ref) { var store = _ref.store, context = _ref.context, children = _ref.children, - serverState = _ref.serverState; - var contextValue = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function () { + serverState = _ref.serverState, + _ref$stabilityCheck = _ref.stabilityCheck, + stabilityCheck = _ref$stabilityCheck === void 0 ? 'once' : _ref$stabilityCheck, + _ref$noopCheck = _ref.noopCheck, + noopCheck = _ref$noopCheck === void 0 ? 'once' : _ref$noopCheck; + var contextValue = react__WEBPACK_IMPORTED_MODULE_0__.useMemo(function () { var subscription = (0,_utils_Subscription__WEBPACK_IMPORTED_MODULE_2__.createSubscription)(store); return { store, subscription, getServerState: serverState ? function () { return serverState; - } : undefined + } : undefined, + stabilityCheck, + noopCheck }; - }, [store, serverState]); - var previousState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function () { + }, [store, serverState, stabilityCheck, noopCheck]); + var previousState = react__WEBPACK_IMPORTED_MODULE_0__.useMemo(function () { return store.getState(); }, [store]); (0,_utils_useIsomorphicLayoutEffect__WEBPACK_IMPORTED_MODULE_3__.useIsomorphicLayoutEffect)(function () { @@ -11009,7 +11267,7 @@ function Provider(_ref) { }, [contextValue, previousState]); var Context = context || _Context__WEBPACK_IMPORTED_MODULE_1__.ReactReduxContext; // @ts-ignore 'AnyAction' is assignable to the constraint of type 'A', but 'A' could be instantiated with a different subtype - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Context.Provider, { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(Context.Provider, { value: contextValue }, children); } @@ -11263,7 +11521,7 @@ function connect(mapStateToProps, mapDispatchToProps, mergeProps) { areMergedPropsEqual }; function ConnectFunction(props) { - var _useMemo = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(function () { + var _React$useMemo = react__WEBPACK_IMPORTED_MODULE_3__.useMemo(function () { // Distinguish between actual "data" props that were passed to the wrapper component, // and values needed to control behavior (forwarded refs, alternate context instances). // To maintain the wrapperProps object reference, memoize this destructuring. @@ -11271,19 +11529,19 @@ function connect(mapStateToProps, mapDispatchToProps, mergeProps) { wrapperProps = (0,_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(props, _excluded); return [props.context, reactReduxForwardedRef, wrapperProps]; }, [props]), - _useMemo2 = _slicedToArray(_useMemo, 3), - propsContext = _useMemo2[0], - reactReduxForwardedRef = _useMemo2[1], - wrapperProps = _useMemo2[2]; - var ContextToUse = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(function () { + _React$useMemo2 = _slicedToArray(_React$useMemo, 3), + propsContext = _React$useMemo2[0], + reactReduxForwardedRef = _React$useMemo2[1], + wrapperProps = _React$useMemo2[2]; + var ContextToUse = react__WEBPACK_IMPORTED_MODULE_3__.useMemo(function () { // Users may optionally pass in a custom context instance to use instead of our ReactReduxContext. // Memoize the check that determines which context instance we should use. return propsContext && propsContext.Consumer && // @ts-ignore - (0,react_is__WEBPACK_IMPORTED_MODULE_4__.isContextConsumer)( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(propsContext.Consumer, null)) ? propsContext : Context; + (0,react_is__WEBPACK_IMPORTED_MODULE_4__.isContextConsumer)( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(propsContext.Consumer, null)) ? propsContext : Context; }, [propsContext, Context]); // Retrieve the store and ancestor subscription via context, if available - var contextValue = (0,react__WEBPACK_IMPORTED_MODULE_3__.useContext)(ContextToUse); // The store _must_ exist as either a prop or in context. + var contextValue = react__WEBPACK_IMPORTED_MODULE_3__.useContext(ContextToUse); // The store _must_ exist as either a prop or in context. // We'll check to see if it _looks_ like a Redux store first. // This allows us to pass through a `store` prop that is just a plain value. @@ -11295,12 +11553,12 @@ function connect(mapStateToProps, mapDispatchToProps, mergeProps) { var store = didStoreComeFromProps ? props.store : contextValue.store; var getServerState = didStoreComeFromContext ? contextValue.getServerState : store.getState; - var childPropsSelector = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(function () { + var childPropsSelector = react__WEBPACK_IMPORTED_MODULE_3__.useMemo(function () { // The child props selector needs the store reference as an input. // Re-create this selector whenever the store changes. return (0,_connect_selectorFactory__WEBPACK_IMPORTED_MODULE_5__["default"])(store.dispatch, selectorFactoryOptions); }, [store]); - var _useMemo3 = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(function () { + var _React$useMemo3 = react__WEBPACK_IMPORTED_MODULE_3__.useMemo(function () { if (!shouldHandleStateChanges) return NO_SUBSCRIPTION_ARRAY; // This Subscription's source should match where store came from: props vs. context. A component // connected to the store via props shouldn't use subscription from context, or vice versa. @@ -11312,12 +11570,12 @@ function connect(mapStateToProps, mapDispatchToProps, mergeProps) { var notifyNestedSubs = subscription.notifyNestedSubs.bind(subscription); return [subscription, notifyNestedSubs]; }, [store, didStoreComeFromProps, contextValue]), - _useMemo4 = _slicedToArray(_useMemo3, 2), - subscription = _useMemo4[0], - notifyNestedSubs = _useMemo4[1]; // Determine what {store, subscription} value should be put into nested context, if necessary, + _React$useMemo4 = _slicedToArray(_React$useMemo3, 2), + subscription = _React$useMemo4[0], + notifyNestedSubs = _React$useMemo4[1]; // Determine what {store, subscription} value should be put into nested context, if necessary, // and memoize that value to avoid unnecessary context updates. - var overriddenContextValue = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(function () { + var overriddenContextValue = react__WEBPACK_IMPORTED_MODULE_3__.useMemo(function () { if (didStoreComeFromProps) { // This component is directly subscribed to a store from props. // We don't want descendants reading from this store - pass down whatever @@ -11331,20 +11589,20 @@ function connect(mapStateToProps, mapDispatchToProps, mergeProps) { }); }, [didStoreComeFromProps, contextValue, subscription]); // Set up refs to coordinate values between the subscription effect and the render logic - var lastChildProps = (0,react__WEBPACK_IMPORTED_MODULE_3__.useRef)(); - var lastWrapperProps = (0,react__WEBPACK_IMPORTED_MODULE_3__.useRef)(wrapperProps); - var childPropsFromStoreUpdate = (0,react__WEBPACK_IMPORTED_MODULE_3__.useRef)(); - var renderIsScheduled = (0,react__WEBPACK_IMPORTED_MODULE_3__.useRef)(false); - var isProcessingDispatch = (0,react__WEBPACK_IMPORTED_MODULE_3__.useRef)(false); - var isMounted = (0,react__WEBPACK_IMPORTED_MODULE_3__.useRef)(false); - var latestSubscriptionCallbackError = (0,react__WEBPACK_IMPORTED_MODULE_3__.useRef)(); + var lastChildProps = react__WEBPACK_IMPORTED_MODULE_3__.useRef(); + var lastWrapperProps = react__WEBPACK_IMPORTED_MODULE_3__.useRef(wrapperProps); + var childPropsFromStoreUpdate = react__WEBPACK_IMPORTED_MODULE_3__.useRef(); + var renderIsScheduled = react__WEBPACK_IMPORTED_MODULE_3__.useRef(false); + var isProcessingDispatch = react__WEBPACK_IMPORTED_MODULE_3__.useRef(false); + var isMounted = react__WEBPACK_IMPORTED_MODULE_3__.useRef(false); + var latestSubscriptionCallbackError = react__WEBPACK_IMPORTED_MODULE_3__.useRef(); (0,_utils_useIsomorphicLayoutEffect__WEBPACK_IMPORTED_MODULE_10__.useIsomorphicLayoutEffect)(function () { isMounted.current = true; return function () { isMounted.current = false; }; }, []); - var actualChildPropsSelector = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(function () { + var actualChildPropsSelector = react__WEBPACK_IMPORTED_MODULE_3__.useMemo(function () { var selector = function selector() { // Tricky logic here: // - This render may have been triggered by a Redux store update that produced new child props @@ -11366,7 +11624,7 @@ function connect(mapStateToProps, mapDispatchToProps, mergeProps) { // about useLayoutEffect in SSR, so we try to detect environment and fall back to // just useEffect instead to avoid the warning, since neither will run anyway. - var subscribeForReact = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(function () { + var subscribeForReact = react__WEBPACK_IMPORTED_MODULE_3__.useMemo(function () { var subscribe = function subscribe(reactListener) { if (!subscription) { return function () {}; @@ -11402,22 +11660,22 @@ function connect(mapStateToProps, mapDispatchToProps, mergeProps) { }); // Now that all that's done, we can finally try to actually render the child component. // We memoize the elements for the rendered child component as an optimization. - var renderedWrappedComponent = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(function () { + var renderedWrappedComponent = react__WEBPACK_IMPORTED_MODULE_3__.useMemo(function () { return /*#__PURE__*/( // @ts-ignore - react__WEBPACK_IMPORTED_MODULE_3___default().createElement(WrappedComponent, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, actualChildProps, { + react__WEBPACK_IMPORTED_MODULE_3__.createElement(WrappedComponent, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, actualChildProps, { ref: reactReduxForwardedRef })) ); }, [reactReduxForwardedRef, WrappedComponent, actualChildProps]); // If React sees the exact same element reference as last time, it bails out of re-rendering // that child, same as if it was wrapped in React.memo() or returned false from shouldComponentUpdate. - var renderedChild = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(function () { + var renderedChild = react__WEBPACK_IMPORTED_MODULE_3__.useMemo(function () { if (shouldHandleStateChanges) { // If this component is subscribed to store updates, we need to pass its own // subscription instance down to our descendants. That means rendering the same // Context instance, and putting a different value into the context. - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(ContextToUse.Provider, { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(ContextToUse.Provider, { value: overriddenContextValue }, renderedWrappedComponent); } @@ -11425,16 +11683,16 @@ function connect(mapStateToProps, mapDispatchToProps, mergeProps) { }, [ContextToUse, renderedWrappedComponent, overriddenContextValue]); return renderedChild; } - var _Connect = react__WEBPACK_IMPORTED_MODULE_3___default().memo(ConnectFunction); + var _Connect = react__WEBPACK_IMPORTED_MODULE_3__.memo(ConnectFunction); // Add a hacky cast to get the right output type var Connect = _Connect; Connect.WrappedComponent = WrappedComponent; Connect.displayName = ConnectFunction.displayName = displayName; if (forwardRef) { - var _forwarded = react__WEBPACK_IMPORTED_MODULE_3___default().forwardRef(function forwardConnectRef(props, ref) { + var _forwarded = react__WEBPACK_IMPORTED_MODULE_3__.forwardRef(function forwardConnectRef(props, ref) { // @ts-ignore - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(Connect, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, props, { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(Connect, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, props, { reactReduxForwardedRef: ref })); }); @@ -11887,6 +12145,7 @@ var useDispatch = /*#__PURE__*/createDispatchHook(); "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ createReduxContextHook: function() { return /* binding */ createReduxContextHook; }, /* harmony export */ useReduxContext: function() { return /* binding */ useReduxContext; } /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); @@ -11895,6 +12154,23 @@ __webpack_require__.r(__webpack_exports__); +/** + * Hook factory, which creates a `useReduxContext` hook bound to a given context. This is a low-level + * hook that you should usually not need to call directly. + * + * @param {React.Context} [context=ReactReduxContext] Context passed to your ``. + * @returns {Function} A `useReduxContext` hook bound to the specified context. + */ +function createReduxContextHook() { + var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _components_Context__WEBPACK_IMPORTED_MODULE_1__.ReactReduxContext; + return function useReduxContext() { + var contextValue = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(context); + if ( true && !contextValue) { + throw new Error('could not find react-redux context value; please ensure the component is wrapped in a '); + } + return contextValue; + }; +} /** * A hook to access the value of the `ReactReduxContext`. This is a low-level * hook that you should usually not need to call directly. @@ -11911,13 +12187,8 @@ __webpack_require__.r(__webpack_exports__); * return
{store.getState()}
* } */ -function useReduxContext() { - var contextValue = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_components_Context__WEBPACK_IMPORTED_MODULE_1__.ReactReduxContext); - if ( true && !contextValue) { - throw new Error('could not find react-redux context value; please ensure the component is wrapped in a '); - } - return contextValue; -} + +var useReduxContext = /*#__PURE__*/createReduxContextHook(); /***/ }), @@ -11959,11 +12230,18 @@ var refEquality = function refEquality(a, b) { function createSelectorHook() { var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _components_Context__WEBPACK_IMPORTED_MODULE_2__.ReactReduxContext; - var useReduxContext = context === _components_Context__WEBPACK_IMPORTED_MODULE_2__.ReactReduxContext ? _useReduxContext__WEBPACK_IMPORTED_MODULE_1__.useReduxContext : function () { - return (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(context); - }; + var useReduxContext = context === _components_Context__WEBPACK_IMPORTED_MODULE_2__.ReactReduxContext ? _useReduxContext__WEBPACK_IMPORTED_MODULE_1__.useReduxContext : (0,_useReduxContext__WEBPACK_IMPORTED_MODULE_1__.createReduxContextHook)(context); return function useSelector(selector) { - var equalityFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : refEquality; + var equalityFnOrOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var _ref = typeof equalityFnOrOptions === 'function' ? { + equalityFn: equalityFnOrOptions + } : equalityFnOrOptions, + _ref$equalityFn = _ref.equalityFn, + equalityFn = _ref$equalityFn === void 0 ? refEquality : _ref$equalityFn, + _ref$stabilityCheck = _ref.stabilityCheck, + stabilityCheck = _ref$stabilityCheck === void 0 ? undefined : _ref$stabilityCheck, + _ref$noopCheck = _ref.noopCheck, + noopCheck = _ref$noopCheck === void 0 ? undefined : _ref$noopCheck; if (true) { if (!selector) { throw new Error("You must pass a selector to useSelector"); @@ -11978,8 +12256,55 @@ function createSelectorHook() { var _useReduxContext = useReduxContext(), store = _useReduxContext.store, subscription = _useReduxContext.subscription, - getServerState = _useReduxContext.getServerState; - var selectedState = useSyncExternalStoreWithSelector(subscription.addNestedSub, store.getState, getServerState || store.getState, selector, equalityFn); + getServerState = _useReduxContext.getServerState, + globalStabilityCheck = _useReduxContext.stabilityCheck, + globalNoopCheck = _useReduxContext.noopCheck; + var firstRun = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(true); + var wrappedSelector = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)({ + [selector.name](state) { + var selected = selector(state); + if (true) { + var finalStabilityCheck = typeof stabilityCheck === 'undefined' ? globalStabilityCheck : stabilityCheck; + if (finalStabilityCheck === 'always' || finalStabilityCheck === 'once' && firstRun.current) { + var toCompare = selector(state); + if (!equalityFn(selected, toCompare)) { + var stack = undefined; + try { + throw new Error(); + } catch (e) { + ; + stack = e.stack; + } + console.warn('Selector ' + (selector.name || 'unknown') + ' returned a different result when called with the same parameters. This can lead to unnecessary rerenders.' + '\nSelectors that return a new reference (such as an object or an array) should be memoized: https://redux.js.org/usage/deriving-data-selectors#optimizing-selectors-with-memoization', { + state, + selected, + selected2: toCompare, + stack + }); + } + } + var finalNoopCheck = typeof noopCheck === 'undefined' ? globalNoopCheck : noopCheck; + if (finalNoopCheck === 'always' || finalNoopCheck === 'once' && firstRun.current) { + // @ts-ignore + if (selected === state) { + var _stack = undefined; + try { + throw new Error(); + } catch (e) { + ; + _stack = e.stack; + } + console.warn('Selector ' + (selector.name || 'unknown') + ' returned the root state when called. This can lead to unnecessary rerenders.' + '\nSelectors that return the entire state are almost certainly a mistake, as they will cause a rerender whenever *anything* in state changes.', { + stack: _stack + }); + } + } + if (firstRun.current) firstRun.current = false; + } + return selected; + } + }[selector.name], [selector, globalStabilityCheck, stabilityCheck]); + var selectedState = useSyncExternalStoreWithSelector(subscription.addNestedSub, store.getState, getServerState || store.getState, wrappedSelector, equalityFn); (0,react__WEBPACK_IMPORTED_MODULE_0__.useDebugValue)(selectedState); return selectedState; }; @@ -12024,11 +12349,8 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ createStoreHook: function() { return /* binding */ createStoreHook; }, /* harmony export */ useStore: function() { return /* binding */ useStore; } /* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _components_Context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/Context */ "./node_modules/react-redux/es/components/Context.js"); -/* harmony import */ var _useReduxContext__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./useReduxContext */ "./node_modules/react-redux/es/hooks/useReduxContext.js"); - +/* harmony import */ var _components_Context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/Context */ "./node_modules/react-redux/es/components/Context.js"); +/* harmony import */ var _useReduxContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./useReduxContext */ "./node_modules/react-redux/es/hooks/useReduxContext.js"); /** @@ -12039,12 +12361,12 @@ __webpack_require__.r(__webpack_exports__); */ function createStoreHook() { - var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _components_Context__WEBPACK_IMPORTED_MODULE_1__.ReactReduxContext; + var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _components_Context__WEBPACK_IMPORTED_MODULE_0__.ReactReduxContext; var useReduxContext = // @ts-ignore - context === _components_Context__WEBPACK_IMPORTED_MODULE_1__.ReactReduxContext ? _useReduxContext__WEBPACK_IMPORTED_MODULE_2__.useReduxContext : function () { - return (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(context); - }; + context === _components_Context__WEBPACK_IMPORTED_MODULE_0__.ReactReduxContext ? _useReduxContext__WEBPACK_IMPORTED_MODULE_1__.useReduxContext : + // @ts-ignore + (0,_useReduxContext__WEBPACK_IMPORTED_MODULE_1__.createReduxContextHook)(context); return function useStore() { var _useReduxContext = useReduxContext(), store = _useReduxContext.store; // @ts-ignore @@ -12211,10 +12533,23 @@ var nullListeners = { }; function createSubscription(store, parentSub) { var unsubscribe; - var listeners = nullListeners; + var listeners = nullListeners; // Reasons to keep the subscription active + + var subscriptionsAmount = 0; // Is this specific subscription subscribed (or only nested ones?) + + var selfSubscribed = false; function addNestedSub(listener) { trySubscribe(); - return listeners.subscribe(listener); + var cleanupListener = listeners.subscribe(listener); // cleanup nested sub + + var removed = false; + return function () { + if (!removed) { + removed = true; + cleanupListener(); + tryUnsubscribe(); + } + }; } function notifyNestedSubs() { listeners.notify(); @@ -12225,29 +12560,43 @@ function createSubscription(store, parentSub) { } } function isSubscribed() { - return Boolean(unsubscribe); + return selfSubscribed; } function trySubscribe() { + subscriptionsAmount++; if (!unsubscribe) { unsubscribe = parentSub ? parentSub.addNestedSub(handleChangeWrapper) : store.subscribe(handleChangeWrapper); listeners = createListenerCollection(); } } function tryUnsubscribe() { - if (unsubscribe) { + subscriptionsAmount--; + if (unsubscribe && subscriptionsAmount === 0) { unsubscribe(); unsubscribe = undefined; listeners.clear(); listeners = nullListeners; } } + function trySubscribeSelf() { + if (!selfSubscribed) { + selfSubscribed = true; + trySubscribe(); + } + } + function tryUnsubscribeSelf() { + if (selfSubscribed) { + selfSubscribed = false; + tryUnsubscribe(); + } + } var subscription = { addNestedSub, notifyNestedSubs, handleChangeWrapper, isSubscribed, - trySubscribe, - tryUnsubscribe, + trySubscribe: trySubscribeSelf, + tryUnsubscribe: tryUnsubscribeSelf, getListeners: function getListeners() { return listeners; } @@ -14158,7 +14507,7 @@ module.exports = exports['default']; /***/ (function(module, __unused_webpack_exports, __webpack_require__) { /* MIT license */ -var cssKeywords = __webpack_require__(/*! color-name */ "./node_modules/color-name/index.js"); +var cssKeywords = __webpack_require__(/*! color-name */ "./node_modules/color-convert/node_modules/color-name/index.js"); // NOTE: conversions should only return primitive values (i.e. arrays, or // values that give correct `typeof` results). @@ -15115,6 +15464,169 @@ models.forEach(function (fromModel) { module.exports = convert; +/***/ }), + +/***/ "./node_modules/color-convert/node_modules/color-name/index.js": +/*!*********************************************************************!*\ + !*** ./node_modules/color-convert/node_modules/color-name/index.js ***! + \*********************************************************************/ +/***/ (function(module) { + +"use strict"; + + +module.exports = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] +}; + + /***/ }), /***/ "./node_modules/color-convert/route.js": @@ -20866,13 +21378,11 @@ function _typeof(obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; @@ -20882,7 +21392,6 @@ function _defineProperties(target, props) { Object.defineProperty(target, descriptor.key, descriptor); } } - function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); @@ -20891,7 +21400,6 @@ function _createClass(Constructor, protoProps, staticProps) { }); return Constructor; } - function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { @@ -20903,32 +21411,24 @@ function _defineProperty(obj, key, value) { } else { obj[key] = value; } - return obj; } - function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; - if (_i == null) return; var _arr = []; var _n = true; var _d = false; - var _s, _e; - try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); - if (i && _arr.length === i) break; } } catch (err) { @@ -20941,10 +21441,8 @@ function _iterableToArrayLimit(arr, i) { if (_d) throw _e; } } - return _arr; } - function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); @@ -20953,32 +21451,23 @@ function _unsupportedIterableToArray(o, minLen) { if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - return arr2; } - function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -var window$1 = typeof window === 'undefined' ? null : window; // eslint-disable-line no-undef - -var navigator = window$1 ? window$1.navigator : null; -window$1 ? window$1.document : null; +var _window = typeof window === 'undefined' ? null : window; // eslint-disable-line no-undef +var navigator = _window ? _window.navigator : null; +_window ? _window.document : null; var typeofstr = _typeof(''); - var typeofobj = _typeof({}); - var typeoffn = _typeof(function () {}); - var typeofhtmlele = typeof HTMLElement === "undefined" ? "undefined" : _typeof(HTMLElement); - var instanceStr = function instanceStr(obj) { return obj && obj.instanceString && fn$6(obj.instanceString) ? obj.instanceString() : null; }; @@ -21064,31 +21553,24 @@ var memoize = function memoize(fn, keyFn) { } else if (arguments.length === 0) { return 'undefined'; } - var args = []; - for (var i = 0; i < arguments.length; i++) { args.push(arguments[i]); } - return args.join('$'); }; } - var memoizedFn = function memoizedFn() { var self = this; var args = arguments; var ret; var k = keyFn.apply(self, args); var cache = memoizedFn.cache; - if (!(ret = cache[k])) { ret = cache[k] = fn.apply(self, args); } - return ret; }; - memoizedFn.cache = {}; return memoizedFn; }; @@ -21112,7 +21594,6 @@ var capitalize = function capitalize(str) { if (emptyString(str)) { return str; } - return str.charAt(0).toUpperCase() + str.substring(1); }; @@ -21139,34 +21620,28 @@ var descending = function descending(a, b) { var extend = Object.assign != null ? Object.assign.bind(Object) : function (tgt) { var args = arguments; - for (var i = 1; i < args.length; i++) { var obj = args[i]; - if (obj == null) { continue; } - var keys = Object.keys(obj); - for (var j = 0; j < keys.length; j++) { var k = keys[j]; tgt[k] = obj[k]; } } - return tgt; }; +// get [r, g, b] from #abc or #aabbcc var hex2tuple = function hex2tuple(hex) { if (!(hex.length === 4 || hex.length === 7) || hex[0] !== '#') { return; } - var shortHex = hex.length === 4; var r, g, b; var base = 16; - if (shortHex) { r = parseInt(hex[1] + hex[1], base); g = parseInt(hex[2] + hex[2], base); @@ -21176,14 +21651,13 @@ var hex2tuple = function hex2tuple(hex) { g = parseInt(hex[3] + hex[4], base); b = parseInt(hex[5] + hex[6], base); } - return [r, g, b]; -}; // get [r, g, b, a] from hsl(0, 0, 0) or hsla(0, 0, 0, 0) +}; +// get [r, g, b, a] from hsl(0, 0, 0) or hsla(0, 0, 0, 0) var hsl2tuple = function hsl2tuple(hsl) { var ret; var h, s, l, a, r, g, b; - function hue2rgb(p, q, t) { if (t < 0) t += 1; if (t > 1) t -= 1; @@ -21192,52 +21666,39 @@ var hsl2tuple = function hsl2tuple(hsl) { if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; return p; } - var m = new RegExp('^' + hsla + '$').exec(hsl); - if (m) { // get hue h = parseInt(m[1]); - if (h < 0) { h = (360 - -1 * h % 360) % 360; } else if (h > 360) { h = h % 360; } - h /= 360; // normalise on [0, 1] s = parseFloat(m[2]); - if (s < 0 || s > 100) { return; } // saturation is [0, 100] - - s = s / 100; // normalise on [0, 1] l = parseFloat(m[3]); - if (l < 0 || l > 100) { return; } // lightness is [0, 100] - - l = l / 100; // normalise on [0, 1] a = m[4]; - if (a !== undefined) { a = parseFloat(a); - if (a < 0 || a > 1) { return; } // alpha is [0, 1] + } - } // now, convert to rgb + // now, convert to rgb // code from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript - - if (s === 0) { r = g = b = Math.round(l * 255); // achromatic } else { @@ -21247,30 +21708,24 @@ var hsl2tuple = function hsl2tuple(hsl) { g = Math.round(255 * hue2rgb(p, q, h)); b = Math.round(255 * hue2rgb(p, q, h - 1 / 3)); } - ret = [r, g, b, a]; } - return ret; -}; // get [r, g, b, a] from rgb(0, 0, 0) or rgba(0, 0, 0, 0) +}; +// get [r, g, b, a] from rgb(0, 0, 0) or rgba(0, 0, 0, 0) var rgb2tuple = function rgb2tuple(rgb) { var ret; var m = new RegExp('^' + rgba + '$').exec(rgb); - if (m) { ret = []; var isPct = []; - for (var i = 1; i <= 3; i++) { var channel = m[i]; - if (channel[channel.length - 1] === '%') { isPct[i] = true; } - channel = parseFloat(channel); - if (isPct[i]) { channel = channel / 100 * 255; // normalise to [0, 255] } @@ -21279,32 +21734,24 @@ var rgb2tuple = function rgb2tuple(rgb) { return; } // invalid channel value - ret.push(Math.floor(channel)); } - var atLeastOneIsPct = isPct[1] || isPct[2] || isPct[3]; var allArePct = isPct[1] && isPct[2] && isPct[3]; - if (atLeastOneIsPct && !allArePct) { return; } // must all be percent values if one is - var alpha = m[4]; - if (alpha !== undefined) { alpha = parseFloat(alpha); - if (alpha < 0 || alpha > 1) { return; } // invalid alpha value - ret.push(alpha); } } - return ret; }; var colorname2tuple = function colorname2tuple(color) { @@ -21317,6 +21764,7 @@ var colors = { // special colour names transparent: [0, 0, 0, 0], // NB alpha === 0 + // regular colours aliceblue: [240, 248, 255], antiquewhite: [250, 235, 215], @@ -21467,82 +21915,73 @@ var colors = { yellowgreen: [154, 205, 50] }; +// sets the value in a map (map may not be built) var setMap = function setMap(options) { var obj = options.map; var keys = options.keys; var l = keys.length; - for (var i = 0; i < l; i++) { var key = keys[i]; - if (plainObject(key)) { throw Error('Tried to set map with object key'); } - if (i < keys.length - 1) { // extend the map if necessary if (obj[key] == null) { obj[key] = {}; } - obj = obj[key]; } else { // set the value obj[key] = options.value; } } -}; // gets the value in a map even if it's not built in places +}; +// gets the value in a map even if it's not built in places var getMap = function getMap(options) { var obj = options.map; var keys = options.keys; var l = keys.length; - for (var i = 0; i < l; i++) { var key = keys[i]; - if (plainObject(key)) { throw Error('Tried to get map with object key'); } - obj = obj[key]; - if (obj == null) { return obj; } } - return obj; -}; // deletes the entry in the map +}; -var performance = window$1 ? window$1.performance : null; +var performance = _window ? _window.performance : null; var pnow = performance && performance.now ? function () { return performance.now(); } : function () { return Date.now(); }; - var raf = function () { - if (window$1) { - if (window$1.requestAnimationFrame) { + if (_window) { + if (_window.requestAnimationFrame) { return function (fn) { - window$1.requestAnimationFrame(fn); + _window.requestAnimationFrame(fn); }; - } else if (window$1.mozRequestAnimationFrame) { + } else if (_window.mozRequestAnimationFrame) { return function (fn) { - window$1.mozRequestAnimationFrame(fn); + _window.mozRequestAnimationFrame(fn); }; - } else if (window$1.webkitRequestAnimationFrame) { + } else if (_window.webkitRequestAnimationFrame) { return function (fn) { - window$1.webkitRequestAnimationFrame(fn); + _window.webkitRequestAnimationFrame(fn); }; - } else if (window$1.msRequestAnimationFrame) { + } else if (_window.msRequestAnimationFrame) { return function (fn) { - window$1.msRequestAnimationFrame(fn); + _window.msRequestAnimationFrame(fn); }; } } - return function (fn) { if (fn) { setTimeout(function () { @@ -21551,7 +21990,6 @@ var raf = function () { } }; }(); - var requestAnimationFrame = function requestAnimationFrame(fn) { return raf(fn); }; @@ -21559,24 +21997,19 @@ var performanceNow = pnow; var DEFAULT_HASH_SEED = 9261; var K = 65599; // 37 also works pretty well - var DEFAULT_HASH_SEED_ALT = 5381; var hashIterableInts = function hashIterableInts(iterator) { var seed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_HASH_SEED; // sdbm/string-hash var hash = seed; var entry; - for (;;) { entry = iterator.next(); - if (entry.done) { break; } - hash = hash * K + entry.value | 0; } - return hash; }; var hashInt = function hashInt(num) { @@ -21612,7 +22045,6 @@ var hashIntsArray = function hashIntsArray(ints, seed) { } else { entry.done = true; } - return entry; } }; @@ -21632,7 +22064,6 @@ var hashString = function hashString(str, seed) { } else { entry.done = true; } - return entry; } }; @@ -21643,24 +22074,20 @@ var hashStrings = function hashStrings() { }; var hashStringsArray = function hashStringsArray(strs) { var hash; - for (var i = 0; i < strs.length; i++) { var str = strs[i]; - if (i === 0) { hash = hashString(str); } else { hash = hashString(str, hash); } } - return hash; }; /*global console */ var warningsEnabled = true; var warnSupported = console.warn != null; // eslint-disable-line no-console - var traceSupported = console.trace != null; // eslint-disable-line no-console var MAX_INT$1 = Number.MAX_SAFE_INTEGER || 9007199254740991; @@ -21689,28 +22116,25 @@ var warn = function warn(msg) { if (!warnings()) { return; } - if (warnSupported) { console.warn(msg); } else { console.log(msg); - if (traceSupported) { console.trace(); } } -}; -/* eslint-enable */ +}; /* eslint-enable */ var clone = function clone(obj) { return extend({}, obj); -}; // gets a shallow copy of the argument +}; +// gets a shallow copy of the argument var copy = function copy(obj) { if (obj == null) { return obj; } - if (array(obj)) { return obj.slice(); } else if (plainObject(obj)) { @@ -21722,22 +22146,24 @@ var copy = function copy(obj) { var copyArray = function copyArray(arr) { return arr.slice(); }; -var uuid = function uuid(a, b -/* placeholders */ -) { - for ( // loop :) - b = a = ''; // b - result , a - numeric letiable - a++ < 36; // +var uuid = function uuid(a, b /* placeholders */) { + for ( + // loop :) + b = a = ''; + // b - result , a - numeric letiable + a++ < 36; + // b += a * 51 & 52 // if "a" is not 9 or 14 or 19 or 24 - ? // return a random number or 4 + ? + // return a random number or 4 (a ^ 15 // if "a" is not 15 - ? // generate a random number from 0 to 15 + ? + // generate a random number from 0 to 15 8 ^ Math.random() * (a ^ 20 ? 16 : 4) // unless "a" is 20, in which case a random number from 8 to 11 : 4 // otherwise 4 ).toString(16) : '-' // in other cases (if "a" is 9,14,19,24) insert "-" ) { } - return b; }; var _staticEmptyObject = {}; @@ -21748,13 +22174,11 @@ var defaults$g = function defaults(_defaults) { var keys = Object.keys(_defaults); return function (opts) { var filledOpts = {}; - for (var i = 0; i < keys.length; i++) { var key = keys[i]; var optVal = opts == null ? undefined : opts[key]; filledOpts[key] = optVal === undefined ? _defaults[key] : optVal; } - return filledOpts; }; }; @@ -21762,7 +22186,6 @@ var removeFromArray = function removeFromArray(arr, ele, oneCopy) { for (var i = arr.length - 1; i >= 0; i--) { if (arr[i] === ele) { arr.splice(i, 1); - if (oneCopy) { break; } @@ -21797,10 +22220,8 @@ var setPrefixedProperty = function setPrefixedProperty(obj, propName, prefix, va var ObjectMap = /*#__PURE__*/function () { function ObjectMap() { _classCallCheck(this, ObjectMap); - this._obj = {}; } - _createClass(ObjectMap, [{ key: "set", value: function set(key, val) { @@ -21829,37 +22250,30 @@ var ObjectMap = /*#__PURE__*/function () { return this._obj[key]; } }]); - return ObjectMap; }(); - var Map$1 = typeof Map !== 'undefined' ? Map : ObjectMap; /* global Set */ -var undef = "undefined" ; +var undef = "undefined" ; var ObjectSet = /*#__PURE__*/function () { function ObjectSet(arrayOrObjectSet) { _classCallCheck(this, ObjectSet); - this._obj = Object.create(null); this.size = 0; - if (arrayOrObjectSet != null) { var arr; - if (arrayOrObjectSet.instanceString != null && arrayOrObjectSet.instanceString() === this.instanceString()) { arr = arrayOrObjectSet.toArray(); } else { arr = arrayOrObjectSet; } - for (var i = 0; i < arr.length; i++) { this.add(arr[i]); } } } - _createClass(ObjectSet, [{ key: "instanceString", value: function instanceString() { @@ -21869,7 +22283,6 @@ var ObjectSet = /*#__PURE__*/function () { key: "add", value: function add(val) { var o = this._obj; - if (o[val] !== 1) { o[val] = 1; this.size++; @@ -21879,7 +22292,6 @@ var ObjectSet = /*#__PURE__*/function () { key: "delete", value: function _delete(val) { var o = this._obj; - if (o[val] === 1) { o[val] = 0; this.size--; @@ -21899,7 +22311,6 @@ var ObjectSet = /*#__PURE__*/function () { key: "toArray", value: function toArray() { var _this = this; - return Object.keys(this._obj).filter(function (key) { return _this.has(key); }); @@ -21910,40 +22321,39 @@ var ObjectSet = /*#__PURE__*/function () { return this.toArray().forEach(callback, thisArg); } }]); - return ObjectSet; }(); - var Set$1 = (typeof Set === "undefined" ? "undefined" : _typeof(Set)) !== undef ? Set : ObjectSet; +// represents a node or an edge var Element = function Element(cy, params) { var restore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; - if (cy === undefined || params === undefined || !core(cy)) { error('An element must have a core reference and parameters set'); return; } + var group = params.group; - var group = params.group; // try to automatically infer the group if unspecified - + // try to automatically infer the group if unspecified if (group == null) { if (params.data && params.data.source != null && params.data.target != null) { group = 'edges'; } else { group = 'nodes'; } - } // validate group - + } + // validate group if (group !== 'nodes' && group !== 'edges') { error('An element must be of type `nodes` or `edges`; you specified `' + group + '`'); return; - } // make the element array-like, just like a collection - + } + // make the element array-like, just like a collection this.length = 1; - this[0] = this; // NOTE: when something is added here, add also to ele.json() + this[0] = this; + // NOTE: when something is added here, add also to ele.json() var _p = this._private = { cy: cy, single: true, @@ -22036,16 +22446,14 @@ var Element = function Element(cy, params) { 'mid-target': null } }; - if (_p.position.x == null) { _p.position.x = 0; } - if (_p.position.y == null) { _p.position.y = 0; - } // renderedPosition overrides if specified - + } + // renderedPosition overrides if specified if (params.renderedPosition) { var rpos = params.renderedPosition; var pan = cy.pan(); @@ -22055,33 +22463,25 @@ var Element = function Element(cy, params) { y: (rpos.y - pan.y) / zoom }; } - var classes = []; - if (array(params.classes)) { classes = params.classes; } else if (string(params.classes)) { classes = params.classes.split(/\s+/); } - for (var i = 0, l = classes.length; i < l; i++) { var cls = classes[i]; - if (!cls || cls === '') { continue; } - _p.classes.add(cls); } - this.createEmitter(); var bypass = params.style || params.css; - if (bypass) { warn('Setting a `style` bypass at element creation should be done only when absolutely necessary. Try to use the stylesheet instead.'); this.style(bypass); } - if (restore === undefined || restore) { this.restore(); } @@ -22091,18 +22491,17 @@ var defineSearch = function defineSearch(params) { params = { bfs: params.bfs || !params.dfs, dfs: params.dfs || !params.bfs - }; // from pseudocode on wikipedia + }; + // from pseudocode on wikipedia return function searchFn(roots, fn, directed) { var options; - if (plainObject(roots) && !elementOrCollection(roots)) { options = roots; roots = options.roots || options.root; fn = options.visit; directed = options.directed; } - directed = arguments.length === 2 && !fn$6(fn) ? fn : directed; fn = fn$6(fn) ? fn : function () {}; var cy = this._private.cy; @@ -22114,41 +22513,33 @@ var defineSearch = function defineSearch(params) { var V = {}; var j = 0; var found; - var _this$byGroup = this.byGroup(), - nodes = _this$byGroup.nodes, - edges = _this$byGroup.edges; // enqueue v - + nodes = _this$byGroup.nodes, + edges = _this$byGroup.edges; + // enqueue v for (var i = 0; i < v.length; i++) { var vi = v[i]; var viId = vi.id(); - if (vi.isNode()) { Q.unshift(vi); - if (params.bfs) { V[viId] = true; connectedNodes.push(vi); } - id2depth[viId] = 0; } } - var _loop = function _loop() { var v = params.bfs ? Q.shift() : Q.pop(); var vId = v.id(); - if (params.dfs) { if (V[vId]) { return "continue"; } - V[vId] = true; connectedNodes.push(v); } - var depth = id2depth[vId]; var prevEdge = connectedBy[vId]; var src = prevEdge != null ? prevEdge.source() : null; @@ -22156,70 +22547,56 @@ var defineSearch = function defineSearch(params) { var prevNode = prevEdge == null ? undefined : v.same(src) ? tgt[0] : src[0]; var ret = void 0; ret = fn(v, prevEdge, prevNode, j++, depth); - if (ret === true) { found = v; return "break"; } - if (ret === false) { return "break"; } - var vwEdges = v.connectedEdges().filter(function (e) { return (!directed || e.source().same(v)) && edges.has(e); }); - for (var _i2 = 0; _i2 < vwEdges.length; _i2++) { var e = vwEdges[_i2]; var w = e.connectedNodes().filter(function (n) { return !n.same(v) && nodes.has(n); }); var wId = w.id(); - if (w.length !== 0 && !V[wId]) { w = w[0]; Q.push(w); - if (params.bfs) { V[wId] = true; connectedNodes.push(w); } - connectedBy[wId] = e; id2depth[wId] = id2depth[vId] + 1; } } }; - while (Q.length !== 0) { var _ret = _loop(); - if (_ret === "continue") continue; if (_ret === "break") break; } - var connectedEles = cy.collection(); - for (var _i = 0; _i < connectedNodes.length; _i++) { var node = connectedNodes[_i]; var edge = connectedBy[node.id()]; - if (edge != null) { connectedEles.push(edge); } - connectedEles.push(node); } - return { path: cy.collection(connectedEles), found: cy.collection(found) }; }; -}; // search, spanning trees, etc - +}; +// search, spanning trees, etc var elesfn$v = { breadthFirstSearch: defineSearch({ bfs: true @@ -22227,8 +22604,9 @@ var elesfn$v = { depthFirstSearch: defineSearch({ dfs: true }) -}; // nice, short mathematical alias +}; +// nice, short mathematical alias elesfn$v.bfs = elesfn$v.breadthFirstSearch; elesfn$v.dfs = elesfn$v.depthFirstSearch; @@ -22249,86 +22627,68 @@ var elesfn$u = { directed: args[2] }; } - var _dijkstraDefaults = dijkstraDefaults(options), - root = _dijkstraDefaults.root, - weight = _dijkstraDefaults.weight, - directed = _dijkstraDefaults.directed; - + root = _dijkstraDefaults.root, + weight = _dijkstraDefaults.weight, + directed = _dijkstraDefaults.directed; var eles = this; var weightFn = weight; var source = string(root) ? this.filter(root)[0] : root[0]; var dist = {}; var prev = {}; var knownDist = {}; - var _this$byGroup = this.byGroup(), - nodes = _this$byGroup.nodes, - edges = _this$byGroup.edges; - + nodes = _this$byGroup.nodes, + edges = _this$byGroup.edges; edges.unmergeBy(function (ele) { return ele.isLoop(); }); - var getDist = function getDist(node) { return dist[node.id()]; }; - var setDist = function setDist(node, d) { dist[node.id()] = d; Q.updateItem(node); }; - var Q = new Heap__default["default"](function (a, b) { return getDist(a) - getDist(b); }); - for (var i = 0; i < nodes.length; i++) { var node = nodes[i]; dist[node.id()] = node.same(source) ? 0 : Infinity; Q.push(node); } - var distBetween = function distBetween(u, v) { var uvs = (directed ? u.edgesTo(v) : u.edgesWith(v)).intersect(edges); var smallestDistance = Infinity; var smallestEdge; - for (var _i = 0; _i < uvs.length; _i++) { var edge = uvs[_i]; - var _weight = weightFn(edge); - if (_weight < smallestDistance || !smallestEdge) { smallestDistance = _weight; smallestEdge = edge; } } - return { edge: smallestEdge, dist: smallestDistance }; }; - while (Q.size() > 0) { var u = Q.pop(); var smalletsDist = getDist(u); var uid = u.id(); knownDist[uid] = smalletsDist; - if (smalletsDist === Infinity) { continue; } - var neighbors = u.neighborhood().intersect(nodes); - for (var _i2 = 0; _i2 < neighbors.length; _i2++) { var v = neighbors[_i2]; var vid = v.id(); var vDist = distBetween(u, v); var alt = smalletsDist + vDist.dist; - if (alt < getDist(v)) { setDist(v, alt); prev[vid] = { @@ -22337,10 +22697,8 @@ var elesfn$u = { }; } } // for - } // while - return { distanceTo: function distanceTo(node) { var target = string(node) ? nodes.filter(node)[0] : node[0]; @@ -22351,10 +22709,8 @@ var elesfn$u = { var S = []; var u = target; var uid = u.id(); - if (target.length > 0) { S.unshift(target); - while (prev[uid]) { var p = prev[uid]; S.unshift(p.edge); @@ -22363,7 +22719,6 @@ var elesfn$u = { uid = u.id(); } } - return eles.spawn(S); } }; @@ -22377,11 +22732,9 @@ var elesfn$t = { weightFn = weightFn || function (edge) { return 1; }; - var _this$byGroup = this.byGroup(), - nodes = _this$byGroup.nodes, - edges = _this$byGroup.edges; - + nodes = _this$byGroup.nodes, + edges = _this$byGroup.edges; var numNodes = nodes.length; var forest = new Array(numNodes); var A = nodes; // assumes byGroup() creates new collections that can be safely mutated @@ -22389,22 +22742,19 @@ var elesfn$t = { var findSetIndex = function findSetIndex(ele) { for (var i = 0; i < forest.length; i++) { var eles = forest[i]; - if (eles.has(ele)) { return i; } } - }; // start with one forest per node - + }; + // start with one forest per node for (var i = 0; i < numNodes; i++) { forest[i] = this.spawn(nodes[i]); } - var S = edges.sort(function (a, b) { return weightFn(a) - weightFn(b); }); - for (var _i = 0; _i < S.length; _i++) { var edge = S[_i]; var u = edge.source()[0]; @@ -22413,15 +22763,14 @@ var elesfn$t = { var setVIndex = findSetIndex(v); var setU = forest[setUIndex]; var setV = forest[setVIndex]; - if (setUIndex !== setVIndex) { - A.merge(edge); // combine forests for u and v + A.merge(edge); + // combine forests for u and v setU.merge(setV); forest.splice(setVIndex, 1); } } - return A; } }; @@ -22441,14 +22790,12 @@ var elesfn$s = { // Implemented from pseudocode from wikipedia aStar: function aStar(options) { var cy = this.cy(); - var _aStarDefaults = aStarDefaults(options), - root = _aStarDefaults.root, - goal = _aStarDefaults.goal, - heuristic = _aStarDefaults.heuristic, - directed = _aStarDefaults.directed, - weight = _aStarDefaults.weight; - + root = _aStarDefaults.root, + goal = _aStarDefaults.goal, + heuristic = _aStarDefaults.heuristic, + directed = _aStarDefaults.directed, + weight = _aStarDefaults.weight; root = cy.collection(root)[0]; goal = cy.collection(goal)[0]; var sid = root.id(); @@ -22462,104 +22809,99 @@ var elesfn$s = { var openSetIds = new Set$1(); var cameFrom = {}; var cameFromEdge = {}; - var addToOpenSet = function addToOpenSet(ele, id) { openSet.push(ele); openSetIds.add(id); }; - var cMin, cMinId; - var popFromOpenSet = function popFromOpenSet() { cMin = openSet.pop(); cMinId = cMin.id(); openSetIds["delete"](cMinId); }; - var isInOpenSet = function isInOpenSet(id) { return openSetIds.has(id); }; - addToOpenSet(root, sid); gScore[sid] = 0; - fScore[sid] = heuristic(root); // Counter + fScore[sid] = heuristic(root); - var steps = 0; // Main loop + // Counter + var steps = 0; + // Main loop while (openSet.size() > 0) { popFromOpenSet(); - steps++; // If we've found our goal, then we are done + steps++; + // If we've found our goal, then we are done if (cMinId === tid) { var path = []; var pathNode = goal; var pathNodeId = tid; var pathEdge = cameFromEdge[pathNodeId]; - for (;;) { path.unshift(pathNode); - if (pathEdge != null) { path.unshift(pathEdge); } - pathNode = cameFrom[pathNodeId]; - if (pathNode == null) { break; } - pathNodeId = pathNode.id(); pathEdge = cameFromEdge[pathNodeId]; } - return { found: true, distance: gScore[cMinId], path: this.spawn(path), steps: steps }; - } // Add cMin to processed nodes + } + // Add cMin to processed nodes + closedSetIds[cMinId] = true; - closedSetIds[cMinId] = true; // Update scores for neighbors of cMin + // Update scores for neighbors of cMin // Take into account if graph is directed or not - var vwEdges = cMin._private.edges; - for (var i = 0; i < vwEdges.length; i++) { - var e = vwEdges[i]; // edge must be in set of calling eles + var e = vwEdges[i]; + // edge must be in set of calling eles if (!this.hasElementWithId(e.id())) { continue; - } // cMin must be the source of edge if directed - + } + // cMin must be the source of edge if directed if (directed && e.data('source') !== cMinId) { continue; } - var wSrc = e.source(); var wTgt = e.target(); var w = wSrc.id() !== cMinId ? wSrc : wTgt; - var wid = w.id(); // node must be in set of calling eles + var wid = w.id(); + // node must be in set of calling eles if (!this.hasElementWithId(wid)) { continue; - } // if node is in closedSet, ignore it - + } + // if node is in closedSet, ignore it if (closedSetIds[wid]) { continue; - } // New tentative score for node w + } + // New tentative score for node w + var tempScore = gScore[cMinId] + weight(e); - var tempScore = gScore[cMinId] + weight(e); // Update gScore for node w if: + // Update gScore for node w if: // w not present in openSet // OR // tentative gScore is less than previous value - // w not in openSet + // w not in openSet if (!isInOpenSet(wid)) { gScore[wid] = tempScore; fScore[wid] = tempScore + heuristic(w); @@ -22567,9 +22909,9 @@ var elesfn$s = { cameFrom[wid] = cMin; cameFromEdge[wid] = e; continue; - } // w already in openSet, but with greater gScore - + } + // w already in openSet, but with greater gScore if (tempScore < gScore[wid]) { gScore[wid] = tempScore; fScore[wid] = tempScore + heuristic(w); @@ -22577,11 +22919,9 @@ var elesfn$s = { cameFromEdge[wid] = e; } } // End of neighbors update - } // End of main loop - // If we've reached here, then we've not reached our goal - + // If we've reached here, then we've not reached our goal return { found: false, distance: undefined, @@ -22601,71 +22941,61 @@ var elesfn$r = { // Implemented from pseudocode from wikipedia floydWarshall: function floydWarshall(options) { var cy = this.cy(); - var _floydWarshallDefault = floydWarshallDefaults(options), - weight = _floydWarshallDefault.weight, - directed = _floydWarshallDefault.directed; - + weight = _floydWarshallDefault.weight, + directed = _floydWarshallDefault.directed; var weightFn = weight; - var _this$byGroup = this.byGroup(), - nodes = _this$byGroup.nodes, - edges = _this$byGroup.edges; - + nodes = _this$byGroup.nodes, + edges = _this$byGroup.edges; var N = nodes.length; var Nsq = N * N; - var indexOf = function indexOf(node) { return nodes.indexOf(node); }; - var atIndex = function atIndex(i) { return nodes[i]; - }; // Initialize distance matrix - + }; + // Initialize distance matrix var dist = new Array(Nsq); - for (var n = 0; n < Nsq; n++) { var j = n % N; var i = (n - j) / N; - if (i === j) { dist[n] = 0; } else { dist[n] = Infinity; } - } // Initialize matrix used for path reconstruction - // Initialize distance matrix - + } + // Initialize matrix used for path reconstruction + // Initialize distance matrix var next = new Array(Nsq); - var edgeNext = new Array(Nsq); // Process edges + var edgeNext = new Array(Nsq); + // Process edges for (var _i = 0; _i < edges.length; _i++) { var edge = edges[_i]; var src = edge.source()[0]; var tgt = edge.target()[0]; - if (src === tgt) { continue; } // exclude loops - var s = indexOf(src); var t = indexOf(tgt); var st = s * N + t; // source to target index + var _weight = weightFn(edge); - var _weight = weightFn(edge); // Check if already process another edge between same 2 nodes - - + // Check if already process another edge between same 2 nodes if (dist[st] > _weight) { dist[st] = _weight; next[st] = t; edgeNext[st] = edge; - } // If undirected graph, process 'reversed' edge - + } + // If undirected graph, process 'reversed' edge if (!directed) { var ts = t * N + s; // target to source index @@ -22675,17 +23005,15 @@ var elesfn$r = { edgeNext[ts] = edge; } } - } // Main loop - + } + // Main loop for (var k = 0; k < N; k++) { for (var _i2 = 0; _i2 < N; _i2++) { var ik = _i2 * N + k; - for (var _j = 0; _j < N; _j++) { var ij = _i2 * N + _j; var kj = k * N + _j; - if (dist[ik] + dist[kj] < dist[ij]) { dist[ij] = dist[ik] + dist[kj]; next[ij] = next[ik]; @@ -22693,15 +23021,12 @@ var elesfn$r = { } } } - var getArgEle = function getArgEle(ele) { return (string(ele) ? cy.filter(ele) : ele)[0]; }; - var indexOfArgEle = function indexOfArgEle(ele) { return indexOf(getArgEle(ele)); }; - var res = { distance: function distance(from, to) { var i = indexOfArgEle(from); @@ -22712,20 +23037,16 @@ var elesfn$r = { var i = indexOfArgEle(from); var j = indexOfArgEle(to); var fromNode = atIndex(i); - if (i === j) { return fromNode.collection(); } - if (next[i * N + j] == null) { return cy.collection(); } - var path = cy.collection(); var prev = i; var edge; path.merge(fromNode); - while (i !== j) { prev = i; i = next[i * N + j]; @@ -22733,13 +23054,11 @@ var elesfn$r = { path.merge(edge); path.merge(atIndex(i)); } - return path; } }; return res; } // floydWarshall - }; // elesfn var bellmanFordDefaults = defaults$g({ @@ -22753,20 +23072,16 @@ var elesfn$q = { // Implemented from pseudocode from wikipedia bellmanFord: function bellmanFord(options) { var _this = this; - var _bellmanFordDefaults = bellmanFordDefaults(options), - weight = _bellmanFordDefaults.weight, - directed = _bellmanFordDefaults.directed, - root = _bellmanFordDefaults.root; - + weight = _bellmanFordDefaults.weight, + directed = _bellmanFordDefaults.directed, + root = _bellmanFordDefaults.root; var weightFn = weight; var eles = this; var cy = this.cy(); - var _this$byGroup = this.byGroup(), - edges = _this$byGroup.edges, - nodes = _this$byGroup.nodes; - + edges = _this$byGroup.edges, + nodes = _this$byGroup.nodes; var numNodes = nodes.length; var infoMap = new Map$1(); var hasNegativeWeightCycle = false; @@ -22777,78 +23092,61 @@ var elesfn$q = { return edge.isLoop(); }); var numEdges = edges.length; - var getInfo = function getInfo(node) { var obj = infoMap.get(node.id()); - if (!obj) { obj = {}; infoMap.set(node.id(), obj); } - return obj; }; - var getNodeFromTo = function getNodeFromTo(to) { return (string(to) ? cy.$(to) : to)[0]; }; - var distanceTo = function distanceTo(to) { return getInfo(getNodeFromTo(to)).dist; }; - var pathTo = function pathTo(to) { var thisStart = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : root; var end = getNodeFromTo(to); var path = []; var node = end; - for (;;) { if (node == null) { return _this.spawn(); } - var _getInfo = getInfo(node), - edge = _getInfo.edge, - pred = _getInfo.pred; - + edge = _getInfo.edge, + pred = _getInfo.pred; path.unshift(node[0]); - if (node.same(thisStart) && path.length > 0) { break; } - if (edge != null) { path.unshift(edge); } - node = pred; } - return eles.spawn(path); - }; // Initializations { dist, pred, edge } - + }; + // Initializations { dist, pred, edge } for (var i = 0; i < numNodes; i++) { var node = nodes[i]; var info = getInfo(node); - if (node.same(root)) { info.dist = 0; } else { info.dist = Infinity; } - info.pred = null; info.edge = null; - } // Edges relaxation - + } + // Edges relaxation var replacedEdge = false; - var checkForEdgeReplacement = function checkForEdgeReplacement(node1, node2, edge, info1, info2, weight) { var dist = info1.dist + weight; - if (dist < info2.dist && !edge.same(info1.edge)) { info2.dist = dist; info2.pred = node1; @@ -22856,95 +23154,74 @@ var elesfn$q = { replacedEdge = true; } }; - for (var _i = 1; _i < numNodes; _i++) { replacedEdge = false; - for (var e = 0; e < numEdges; e++) { var edge = edges[e]; var src = edge.source(); var tgt = edge.target(); - var _weight = weightFn(edge); - var srcInfo = getInfo(src); var tgtInfo = getInfo(tgt); - checkForEdgeReplacement(src, tgt, edge, srcInfo, tgtInfo, _weight); // If undirected graph, we need to take into account the 'reverse' edge + checkForEdgeReplacement(src, tgt, edge, srcInfo, tgtInfo, _weight); + // If undirected graph, we need to take into account the 'reverse' edge if (!directed) { checkForEdgeReplacement(tgt, src, edge, tgtInfo, srcInfo, _weight); } } - if (!replacedEdge) { break; } } - if (replacedEdge) { // Check for negative weight cycles var negativeWeightCycleIds = []; - for (var _e = 0; _e < numEdges; _e++) { var _edge = edges[_e]; - var _src = _edge.source(); - var _tgt = _edge.target(); - var _weight2 = weightFn(_edge); - var srcDist = getInfo(_src).dist; var tgtDist = getInfo(_tgt).dist; - if (srcDist + _weight2 < tgtDist || !directed && tgtDist + _weight2 < srcDist) { if (!hasNegativeWeightCycle) { warn('Graph contains a negative weight cycle for Bellman-Ford'); hasNegativeWeightCycle = true; } - if (options.findNegativeWeightCycles !== false) { var negativeNodes = []; - if (srcDist + _weight2 < tgtDist) { negativeNodes.push(_src); } - if (!directed && tgtDist + _weight2 < srcDist) { negativeNodes.push(_tgt); } - var numNegativeNodes = negativeNodes.length; - for (var n = 0; n < numNegativeNodes; n++) { var start = negativeNodes[n]; var cycle = [start]; cycle.push(getInfo(start).edge); var _node = getInfo(start).pred; - while (cycle.indexOf(_node) === -1) { cycle.push(_node); cycle.push(getInfo(_node).edge); _node = getInfo(_node).pred; } - cycle = cycle.slice(cycle.indexOf(_node)); var smallestId = cycle[0].id(); var smallestIndex = 0; - for (var c = 2; c < cycle.length; c += 2) { if (cycle[c].id() < smallestId) { smallestId = cycle[c].id(); smallestIndex = c; } } - cycle = cycle.slice(smallestIndex).concat(cycle.slice(0, smallestIndex)); cycle.push(cycle[0]); var cycleId = cycle.map(function (el) { return el.id(); }).join(","); - if (negativeWeightCycleIds.indexOf(cycleId) === -1) { negativeWeightCycles.push(eles.spawn(cycle)); negativeWeightCycleIds.push(cycleId); @@ -22956,7 +23233,6 @@ var elesfn$q = { } } } - return { distanceTo: distanceTo, pathTo: pathTo, @@ -22964,86 +23240,77 @@ var elesfn$q = { negativeWeightCycles: negativeWeightCycles }; } // bellmanFord - }; // elesfn -var sqrt2 = Math.sqrt(2); // Function which colapses 2 (meta) nodes into one +var sqrt2 = Math.sqrt(2); + +// Function which colapses 2 (meta) nodes into one // Updates the remaining edge lists // Receives as a paramater the edge which causes the collapse - var collapse = function collapse(edgeIndex, nodeMap, remainingEdges) { if (remainingEdges.length === 0) { error("Karger-Stein must be run on a connected (sub)graph"); } - var edgeInfo = remainingEdges[edgeIndex]; var sourceIn = edgeInfo[1]; var targetIn = edgeInfo[2]; var partition1 = nodeMap[sourceIn]; var partition2 = nodeMap[targetIn]; var newEdges = remainingEdges; // re-use array - // Delete all edges between partition1 and partition2 + // Delete all edges between partition1 and partition2 for (var i = newEdges.length - 1; i >= 0; i--) { var edge = newEdges[i]; var src = edge[1]; var tgt = edge[2]; - if (nodeMap[src] === partition1 && nodeMap[tgt] === partition2 || nodeMap[src] === partition2 && nodeMap[tgt] === partition1) { newEdges.splice(i, 1); } - } // All edges pointing to partition2 should now point to partition1 - + } + // All edges pointing to partition2 should now point to partition1 for (var _i = 0; _i < newEdges.length; _i++) { var _edge = newEdges[_i]; - if (_edge[1] === partition2) { // Check source newEdges[_i] = _edge.slice(); // copy - newEdges[_i][1] = partition1; } else if (_edge[2] === partition2) { // Check target newEdges[_i] = _edge.slice(); // copy - newEdges[_i][2] = partition1; } - } // Move all nodes from partition2 to partition1 - + } + // Move all nodes from partition2 to partition1 for (var _i2 = 0; _i2 < nodeMap.length; _i2++) { if (nodeMap[_i2] === partition2) { nodeMap[_i2] = partition1; } } - return newEdges; -}; // Contracts a graph until we reach a certain number of meta nodes - +}; +// Contracts a graph until we reach a certain number of meta nodes var contractUntil = function contractUntil(metaNodeMap, remainingEdges, size, sizeLimit) { while (size > sizeLimit) { // Choose an edge randomly - var edgeIndex = Math.floor(Math.random() * remainingEdges.length); // Collapse graph based on edge + var edgeIndex = Math.floor(Math.random() * remainingEdges.length); + // Collapse graph based on edge remainingEdges = collapse(edgeIndex, metaNodeMap, remainingEdges); size--; } - return remainingEdges; }; - var elesfn$p = { // Computes the minimum cut of an undirected graph // Returns the correct answer with high probability kargerStein: function kargerStein() { var _this = this; - var _this$byGroup = this.byGroup(), - nodes = _this$byGroup.nodes, - edges = _this$byGroup.edges; - + nodes = _this$byGroup.nodes, + edges = _this$byGroup.edges; edges.unmergeBy(function (edge) { return edge.isLoop(); }); @@ -23051,52 +23318,52 @@ var elesfn$p = { var numEdges = edges.length; var numIter = Math.ceil(Math.pow(Math.log(numNodes) / Math.LN2, 2)); var stopSize = Math.floor(numNodes / sqrt2); - if (numNodes < 2) { error('At least 2 nodes are required for Karger-Stein algorithm'); return undefined; - } // Now store edge destination as indexes - // Format for each edge (edge index, source node index, target node index) - + } + // Now store edge destination as indexes + // Format for each edge (edge index, source node index, target node index) var edgeIndexes = []; - for (var i = 0; i < numEdges; i++) { var e = edges[i]; edgeIndexes.push([i, nodes.indexOf(e.source()), nodes.indexOf(e.target())]); - } // We will store the best cut found here - + } + // We will store the best cut found here var minCutSize = Infinity; var minCutEdgeIndexes = []; - var minCutNodeMap = new Array(numNodes); // Initial meta node partition + var minCutNodeMap = new Array(numNodes); + // Initial meta node partition var metaNodeMap = new Array(numNodes); var metaNodeMap2 = new Array(numNodes); - var copyNodesMap = function copyNodesMap(from, to) { for (var _i3 = 0; _i3 < numNodes; _i3++) { to[_i3] = from[_i3]; } - }; // Main loop - + }; + // Main loop for (var iter = 0; iter <= numIter; iter++) { // Reset meta node partition for (var _i4 = 0; _i4 < numNodes; _i4++) { metaNodeMap[_i4] = _i4; - } // Contract until stop point (stopSize nodes) - + } + // Contract until stop point (stopSize nodes) var edgesState = contractUntil(metaNodeMap, edgeIndexes.slice(), numNodes, stopSize); var edgesState2 = edgesState.slice(); // copy - // Create a copy of the colapsed nodes state - copyNodesMap(metaNodeMap, metaNodeMap2); // Run 2 iterations starting in the stop state + // Create a copy of the colapsed nodes state + copyNodesMap(metaNodeMap, metaNodeMap2); + // Run 2 iterations starting in the stop state var res1 = contractUntil(metaNodeMap, edgesState, stopSize, 2); - var res2 = contractUntil(metaNodeMap2, edgesState2, stopSize, 2); // Is any of the 2 results the best cut so far? + var res2 = contractUntil(metaNodeMap2, edgesState2, stopSize, 2); + // Is any of the 2 results the best cut so far? if (res1.length <= res2.length && res1.length < minCutSize) { minCutSize = res1.length; minCutEdgeIndexes = res1; @@ -23107,32 +23374,29 @@ var elesfn$p = { copyNodesMap(metaNodeMap2, minCutNodeMap); } } // end of main loop - // Construct result - + // Construct result var cut = this.spawn(minCutEdgeIndexes.map(function (e) { return edges[e[0]]; })); var partition1 = this.spawn(); - var partition2 = this.spawn(); // traverse metaNodeMap for best cut + var partition2 = this.spawn(); + // traverse metaNodeMap for best cut var witnessNodePartition = minCutNodeMap[0]; - for (var _i5 = 0; _i5 < minCutNodeMap.length; _i5++) { var partitionId = minCutNodeMap[_i5]; var node = nodes[_i5]; - if (partitionId === witnessNodePartition) { partition1.merge(node); } else { partition2.merge(node); } - } // construct components corresponding to each disjoint subset of nodes - + } + // construct components corresponding to each disjoint subset of nodes var constructComponent = function constructComponent(subset) { var component = _this.spawn(); - subset.forEach(function (node) { component.merge(node); node.connectedEdges().forEach(function (edge) { @@ -23144,7 +23408,6 @@ var elesfn$p = { }); return component; }; - var components = [constructComponent(partition1), constructComponent(partition2)]; var ret = { cut: cut, @@ -23186,30 +23449,24 @@ var min = function min(arr) { var begin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : arr.length; var min = Infinity; - for (var i = begin; i < end; i++) { var val = arr[i]; - if (isFinite(val)) { min = Math.min(val, min); } } - return min; }; var max = function max(arr) { var begin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : arr.length; var max = -Infinity; - for (var i = begin; i < end; i++) { var val = arr[i]; - if (isFinite(val)) { max = Math.max(val, max); } } - return max; }; var mean = function mean(arr) { @@ -23217,16 +23474,13 @@ var mean = function mean(arr) { var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : arr.length; var total = 0; var n = 0; - for (var i = begin; i < end; i++) { var val = arr[i]; - if (isFinite(val)) { total += val; n++; } } - return total / n; }; var median = function median(arr) { @@ -23235,25 +23489,21 @@ var median = function median(arr) { var copy = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; var sort = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; var includeHoles = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; - if (copy) { arr = arr.slice(begin, end); } else { if (end < arr.length) { arr.splice(end, arr.length - end); } - if (begin > 0) { arr.splice(0, begin); } - } // all non finite (e.g. Infinity, NaN) elements must be -Infinity so they go to the start - + } + // all non finite (e.g. Infinity, NaN) elements must be -Infinity so they go to the start var off = 0; // offset from non-finite values - for (var i = arr.length - 1; i >= 0; i--) { var v = arr[i]; - if (includeHoles) { if (!isFinite(v)) { arr[i] = -Infinity; @@ -23264,7 +23514,6 @@ var median = function median(arr) { arr.splice(i, 1); } } - if (sort) { arr.sort(function (a, b) { return a - b; @@ -23273,7 +23522,6 @@ var median = function median(arr) { var len = arr.length; var mid = Math.floor(len / 2); - if (len % 2 !== 0) { return arr[mid + 1 + off]; } else { @@ -23307,22 +23555,22 @@ var sqdist = function sqdist(p1, p2) { return dx * dx + dy * dy; }; var inPlaceSumNormalize = function inPlaceSumNormalize(v) { - var length = v.length; // First, get sum of all elements + var length = v.length; + // First, get sum of all elements var total = 0; - for (var i = 0; i < length; i++) { total += v[i]; - } // Now, divide each by the sum of all elements - + } + // Now, divide each by the sum of all elements for (var _i = 0; _i < length; _i++) { v[_i] = v[_i] / total; } - return v; }; +// from http://en.wikipedia.org/wiki/Bézier_curve#Quadratic_curves var qbezierAt = function qbezierAt(p0, p1, p2, t) { return (1 - t) * (1 - t) * p0 + 2 * (1 - t) * t * p1 + t * t * p2; }; @@ -23351,8 +23599,9 @@ var lineAt = function lineAt(p0, p1, t, d) { }; var bound = function bound(min, val, max) { return Math.max(min, Math.min(max, val)); -}; // makes a full bb (x1, y1, x2, y2, w, h) from implicit params +}; +// makes a full bb (x1, y1, x2, y2, w, h) from implicit params var makeBoundingBox = function makeBoundingBox(bb) { if (bb == null) { return { @@ -23405,6 +23654,7 @@ var clearBoundingBox = function clearBoundingBox(bb) { }; var updateBoundingBox = function updateBoundingBox(bb1, bb2) { // update bb1 with bb2 bounds + bb1.x1 = Math.min(bb1.x1, bb2.x1); bb1.x2 = Math.max(bb1.x2, bb2.x2); bb1.w = bb1.x2 - bb1.x1; @@ -23433,7 +23683,6 @@ var expandBoundingBox = function expandBoundingBox(bb) { var expandBoundingBoxSides = function expandBoundingBoxSides(bb) { var padding = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [0]; var top, right, bottom, left; - if (padding.length === 1) { top = right = bottom = left = padding[0]; } else if (padding.length === 2) { @@ -23441,13 +23690,11 @@ var expandBoundingBoxSides = function expandBoundingBoxSides(bb) { left = right = padding[1]; } else if (padding.length === 4) { var _padding = _slicedToArray(padding, 4); - top = _padding[0]; right = _padding[1]; bottom = _padding[2]; left = _padding[3]; } - bb.x1 -= left; bb.x2 += right; bb.y1 -= top; @@ -23457,6 +23704,7 @@ var expandBoundingBoxSides = function expandBoundingBoxSides(bb) { return bb; }; +// assign the values of bb2 into bb1 var assignBoundingBox = function assignBoundingBox(bb1, bb2) { bb1.x1 = bb2.x1; bb1.y1 = bb2.y1; @@ -23470,39 +23718,35 @@ var boundingBoxesIntersect = function boundingBoxesIntersect(bb1, bb2) { if (bb1.x1 > bb2.x2) { return false; } - if (bb2.x1 > bb1.x2) { return false; - } // case: one bb to left of other - + } + // case: one bb to left of other if (bb1.x2 < bb2.x1) { return false; } - if (bb2.x2 < bb1.x1) { return false; - } // case: one bb above other - + } + // case: one bb above other if (bb1.y2 < bb2.y1) { return false; } - if (bb2.y2 < bb1.y1) { return false; - } // case: one bb below other - + } + // case: one bb below other if (bb1.y1 > bb2.y2) { return false; } - if (bb2.y1 > bb1.y2) { return false; - } // otherwise, must have some overlap - + } + // otherwise, must have some overlap return true; }; var inBoundingBox = function inBoundingBox(bb, x, y) { @@ -23517,101 +23761,112 @@ var boundingBoxInBoundingBox = function boundingBoxInBoundingBox(bb1, bb2) { var roundRectangleIntersectLine = function roundRectangleIntersectLine(x, y, nodeX, nodeY, width, height, padding) { var cornerRadius = getRoundRectangleRadius(width, height); var halfWidth = width / 2; - var halfHeight = height / 2; // Check intersections with straight line segments + var halfHeight = height / 2; - var straightLineIntersections; // Top segment, left to right + // Check intersections with straight line segments + var straightLineIntersections; + // Top segment, left to right { var topStartX = nodeX - halfWidth + cornerRadius - padding; var topStartY = nodeY - halfHeight - padding; var topEndX = nodeX + halfWidth - cornerRadius + padding; var topEndY = topStartY; straightLineIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, topStartX, topStartY, topEndX, topEndY, false); - if (straightLineIntersections.length > 0) { return straightLineIntersections; } - } // Right segment, top to bottom + } + // Right segment, top to bottom { var rightStartX = nodeX + halfWidth + padding; var rightStartY = nodeY - halfHeight + cornerRadius - padding; var rightEndX = rightStartX; var rightEndY = nodeY + halfHeight - cornerRadius + padding; straightLineIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, rightStartX, rightStartY, rightEndX, rightEndY, false); - if (straightLineIntersections.length > 0) { return straightLineIntersections; } - } // Bottom segment, left to right + } + // Bottom segment, left to right { var bottomStartX = nodeX - halfWidth + cornerRadius - padding; var bottomStartY = nodeY + halfHeight + padding; var bottomEndX = nodeX + halfWidth - cornerRadius + padding; var bottomEndY = bottomStartY; straightLineIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, bottomStartX, bottomStartY, bottomEndX, bottomEndY, false); - if (straightLineIntersections.length > 0) { return straightLineIntersections; } - } // Left segment, top to bottom + } + // Left segment, top to bottom { var leftStartX = nodeX - halfWidth - padding; var leftStartY = nodeY - halfHeight + cornerRadius - padding; var leftEndX = leftStartX; var leftEndY = nodeY + halfHeight - cornerRadius + padding; straightLineIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, leftStartX, leftStartY, leftEndX, leftEndY, false); - if (straightLineIntersections.length > 0) { return straightLineIntersections; } - } // Check intersections with arc segments + } - var arcIntersections; // Top Left + // Check intersections with arc segments + var arcIntersections; + // Top Left { var topLeftCenterX = nodeX - halfWidth + cornerRadius; var topLeftCenterY = nodeY - halfHeight + cornerRadius; - arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, topLeftCenterX, topLeftCenterY, cornerRadius + padding); // Ensure the intersection is on the desired quarter of the circle + arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, topLeftCenterX, topLeftCenterY, cornerRadius + padding); + // Ensure the intersection is on the desired quarter of the circle if (arcIntersections.length > 0 && arcIntersections[0] <= topLeftCenterX && arcIntersections[1] <= topLeftCenterY) { return [arcIntersections[0], arcIntersections[1]]; } - } // Top Right + } + // Top Right { var topRightCenterX = nodeX + halfWidth - cornerRadius; var topRightCenterY = nodeY - halfHeight + cornerRadius; - arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, topRightCenterX, topRightCenterY, cornerRadius + padding); // Ensure the intersection is on the desired quarter of the circle + arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, topRightCenterX, topRightCenterY, cornerRadius + padding); + // Ensure the intersection is on the desired quarter of the circle if (arcIntersections.length > 0 && arcIntersections[0] >= topRightCenterX && arcIntersections[1] <= topRightCenterY) { return [arcIntersections[0], arcIntersections[1]]; } - } // Bottom Right + } + // Bottom Right { var bottomRightCenterX = nodeX + halfWidth - cornerRadius; var bottomRightCenterY = nodeY + halfHeight - cornerRadius; - arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, bottomRightCenterX, bottomRightCenterY, cornerRadius + padding); // Ensure the intersection is on the desired quarter of the circle + arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, bottomRightCenterX, bottomRightCenterY, cornerRadius + padding); + // Ensure the intersection is on the desired quarter of the circle if (arcIntersections.length > 0 && arcIntersections[0] >= bottomRightCenterX && arcIntersections[1] >= bottomRightCenterY) { return [arcIntersections[0], arcIntersections[1]]; } - } // Bottom Left + } + // Bottom Left { var bottomLeftCenterX = nodeX - halfWidth + cornerRadius; var bottomLeftCenterY = nodeY + halfHeight - cornerRadius; - arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, bottomLeftCenterX, bottomLeftCenterY, cornerRadius + padding); // Ensure the intersection is on the desired quarter of the circle + arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, bottomLeftCenterX, bottomLeftCenterY, cornerRadius + padding); + // Ensure the intersection is on the desired quarter of the circle if (arcIntersections.length > 0 && arcIntersections[0] <= bottomLeftCenterX && arcIntersections[1] >= bottomLeftCenterY) { return [arcIntersections[0], arcIntersections[1]]; } } return []; // if nothing }; + var inLineVicinity = function inLineVicinity(x, y, lx1, ly1, lx2, ly2, tolerance) { var t = tolerance; var x1 = Math.min(lx1, lx2); @@ -23626,8 +23881,9 @@ var inBezierVicinity = function inBezierVicinity(x, y, x1, y1, x2, y2, x3, y3, t x2: Math.max(x1, x3, x2) + tolerance, y1: Math.min(y1, y3, y2) - tolerance, y2: Math.max(y1, y3, y2) + tolerance - }; // if outside the rough bounding box for the bezier, then it can't be a hit + }; + // if outside the rough bounding box for the bezier, then it can't be a hit if (x < bb.x1 || x > bb.x2 || y < bb.y1 || y > bb.y2) { // console.log('bezier out of rough bb') return false; @@ -23639,11 +23895,9 @@ var inBezierVicinity = function inBezierVicinity(x, y, x1, y1, x2, y2, x3, y3, t var solveQuadratic = function solveQuadratic(a, b, c, val) { c -= val; var r = b * b - 4 * a * c; - if (r < 0) { return []; } - var sqrtR = Math.sqrt(r); var denom = 2 * a; var root1 = (-b + sqrtR) / denom; @@ -23653,14 +23907,16 @@ var solveQuadratic = function solveQuadratic(a, b, c, val) { var solveCubic = function solveCubic(a, b, c, d, result) { // Solves a cubic function, returns root in form [r1, i1, r2, i2, r3, i3], where // r is the real component, i is the imaginary component + // An implementation of the Cardano method from the year 1545 // http://en.wikipedia.org/wiki/Cubic_function#The_nature_of_the_roots - var epsilon = 0.00001; // avoid division by zero while keeping the overall expression close in value + var epsilon = 0.00001; + + // avoid division by zero while keeping the overall expression close in value if (a === 0) { a = epsilon; } - b /= a; c /= a; d /= a; @@ -23671,7 +23927,6 @@ var solveCubic = function solveCubic(a, b, c, d, result) { discriminant = q * q * q + r * r; result[1] = 0; term1 = b / 3.0; - if (discriminant > 0) { s = r + Math.sqrt(discriminant); s = s < 0 ? -Math.pow(-s, 1.0 / 3.0) : Math.pow(s, 1.0 / 3.0); @@ -23685,16 +23940,13 @@ var solveCubic = function solveCubic(a, b, c, d, result) { result[5] = -term1; return; } - result[5] = result[3] = 0; - if (discriminant === 0) { r13 = r < 0 ? -Math.pow(-r, 1.0 / 3.0) : Math.pow(r, 1.0 / 3.0); result[0] = -term1 + 2.0 * r13; result[4] = result[2] = -(r13 + term1); return; } - q = -q; dum1 = q * q * q; dum1 = Math.acos(r / Math.sqrt(dum1)); @@ -23707,36 +23959,38 @@ var solveCubic = function solveCubic(a, b, c, d, result) { var sqdistToQuadraticBezier = function sqdistToQuadraticBezier(x, y, x1, y1, x2, y2, x3, y3) { // Find minimum distance by using the minimum of the distance // function between the given point and the curve + // This gives the coefficients of the resulting cubic equation // whose roots tell us where a possible minimum is // (Coefficients are divided by 4) + var a = 1.0 * x1 * x1 - 4 * x1 * x2 + 2 * x1 * x3 + 4 * x2 * x2 - 4 * x2 * x3 + x3 * x3 + y1 * y1 - 4 * y1 * y2 + 2 * y1 * y3 + 4 * y2 * y2 - 4 * y2 * y3 + y3 * y3; var b = 1.0 * 9 * x1 * x2 - 3 * x1 * x1 - 3 * x1 * x3 - 6 * x2 * x2 + 3 * x2 * x3 + 9 * y1 * y2 - 3 * y1 * y1 - 3 * y1 * y3 - 6 * y2 * y2 + 3 * y2 * y3; var c = 1.0 * 3 * x1 * x1 - 6 * x1 * x2 + x1 * x3 - x1 * x + 2 * x2 * x2 + 2 * x2 * x - x3 * x + 3 * y1 * y1 - 6 * y1 * y2 + y1 * y3 - y1 * y + 2 * y2 * y2 + 2 * y2 * y - y3 * y; - var d = 1.0 * x1 * x2 - x1 * x1 + x1 * x - x2 * x + y1 * y2 - y1 * y1 + y1 * y - y2 * y; // debug("coefficients: " + a / a + ", " + b / a + ", " + c / a + ", " + d / a); + var d = 1.0 * x1 * x2 - x1 * x1 + x1 * x - x2 * x + y1 * y2 - y1 * y1 + y1 * y - y2 * y; + + // debug("coefficients: " + a / a + ", " + b / a + ", " + c / a + ", " + d / a); - var roots = []; // Use the cubic solving algorithm + var roots = []; + // Use the cubic solving algorithm solveCubic(a, b, c, d, roots); var zeroThreshold = 0.0000001; var params = []; - for (var index = 0; index < 6; index += 2) { if (Math.abs(roots[index + 1]) < zeroThreshold && roots[index] >= 0 && roots[index] <= 1.0) { params.push(roots[index]); } } - params.push(1.0); params.push(0.0); var minDistanceSquared = -1; var curX, curY, distSquared; - for (var i = 0; i < params.length; i++) { curX = Math.pow(1.0 - params[i], 2.0) * x1 + 2.0 * (1 - params[i]) * params[i] * x2 + params[i] * params[i] * x3; curY = Math.pow(1 - params[i], 2.0) * y1 + 2 * (1.0 - params[i]) * params[i] * y2 + params[i] * params[i] * y3; - distSquared = Math.pow(curX - x, 2) + Math.pow(curY - y, 2); // debug('distance for param ' + params[i] + ": " + Math.sqrt(distSquared)); - + distSquared = Math.pow(curX - x, 2) + Math.pow(curY - y, 2); + // debug('distance for param ' + params[i] + ": " + Math.sqrt(distSquared)); if (minDistanceSquared >= 0) { if (distSquared < minDistanceSquared) { minDistanceSquared = distSquared; @@ -23745,7 +23999,6 @@ var sqdistToQuadraticBezier = function sqdistToQuadraticBezier(x, y, x1, y1, x2, minDistanceSquared = distSquared; } } - return minDistanceSquared; }; var sqdistToFiniteLine = function sqdistToFiniteLine(x, y, x1, y1, x2, y2) { @@ -23755,27 +24008,24 @@ var sqdistToFiniteLine = function sqdistToFiniteLine(x, y, x1, y1, x2, y2) { var hypSq = offset[0] * offset[0] + offset[1] * offset[1]; var dotProduct = offset[0] * line[0] + offset[1] * line[1]; var adjSq = dotProduct * dotProduct / lineSq; - if (dotProduct < 0) { return hypSq; } - if (adjSq > lineSq) { return (x - x2) * (x - x2) + (y - y2) * (y - y2); } - return hypSq - adjSq; }; var pointInsidePolygonPoints = function pointInsidePolygonPoints(x, y, points) { var x1, y1, x2, y2; - var y3; // Intersect with vertical line through (x, y) - - var up = 0; // let down = 0; + var y3; + // Intersect with vertical line through (x, y) + var up = 0; + // let down = 0; for (var i = 0; i < points.length / 2; i++) { x1 = points[i * 2]; y1 = points[i * 2 + 1]; - if (i + 1 < points.length / 2) { x2 = points[(i + 1) * 2]; y2 = points[(i + 1) * 2 + 1]; @@ -23783,21 +24033,19 @@ var pointInsidePolygonPoints = function pointInsidePolygonPoints(x, y, points) { x2 = points[(i + 1 - points.length / 2) * 2]; y2 = points[(i + 1 - points.length / 2) * 2 + 1]; } - if (x1 == x && x2 == x) ; else if (x1 >= x && x >= x2 || x1 <= x && x <= x2) { y3 = (x - x1) / (x2 - x1) * (y2 - y1) + y1; - if (y3 > y) { up++; - } // if( y3 < y ){ + } + + // if( y3 < y ){ // down++; // } - } else { continue; } } - if (up % 2 === 0) { return false; } else { @@ -23805,13 +24053,12 @@ var pointInsidePolygonPoints = function pointInsidePolygonPoints(x, y, points) { } }; var pointInsidePolygon = function pointInsidePolygon(x, y, basePoints, centerX, centerY, width, height, direction, padding) { - var transformedPoints = new Array(basePoints.length); // Gives negative angle + var transformedPoints = new Array(basePoints.length); + // Gives negative angle var angle; - if (direction[0] != null) { angle = Math.atan(direction[1] / direction[0]); - if (direction[0] < 0) { angle = angle + Math.PI / 2; } else { @@ -23820,26 +24067,23 @@ var pointInsidePolygon = function pointInsidePolygon(x, y, basePoints, centerX, } else { angle = direction; } - var cos = Math.cos(-angle); - var sin = Math.sin(-angle); // console.log("base: " + basePoints); + var sin = Math.sin(-angle); + // console.log("base: " + basePoints); for (var i = 0; i < transformedPoints.length / 2; i++) { transformedPoints[i * 2] = width / 2 * (basePoints[i * 2] * cos - basePoints[i * 2 + 1] * sin); transformedPoints[i * 2 + 1] = height / 2 * (basePoints[i * 2 + 1] * cos + basePoints[i * 2] * sin); transformedPoints[i * 2] += centerX; transformedPoints[i * 2 + 1] += centerY; } - var points; - if (padding > 0) { var expandedLineSet = expandPolygon(transformedPoints, -padding); points = joinLines(expandedLineSet); } else { points = transformedPoints; } - return pointInsidePolygonPoints(x, y, points); }; var pointInsideRoundPolygon = function pointInsideRoundPolygon(x, y, basePoints, centerX, centerY, width, height) { @@ -23848,17 +24092,14 @@ var pointInsideRoundPolygon = function pointInsideRoundPolygon(x, y, basePoints, var halfH = height / 2; var cornerRadius = getRoundPolygonRadius(width, height); var squaredCornerRadius = cornerRadius * cornerRadius; - for (var i = 0; i < basePoints.length / 4; i++) { var sourceUv = void 0, - destUv = void 0; - + destUv = void 0; if (i === 0) { sourceUv = basePoints.length - 2; } else { sourceUv = i * 4 - 2; } - destUv = i * 4 + 2; var px = centerX + halfW * basePoints[i * 4]; var py = centerY + halfH * basePoints[i * 4 + 1]; @@ -23875,34 +24116,28 @@ var pointInsideRoundPolygon = function pointInsideRoundPolygon(x, y, basePoints, var orthx = basePoints[sourceUv + 1]; var orthy = -basePoints[sourceUv]; var cosAlpha = orthx * basePoints[destUv] + orthy * basePoints[destUv + 1]; - if (cosAlpha < 0) { orthx *= -1; orthy *= -1; } - var cx = cp0x + orthx * cornerRadius; var cy = cp0y + orthy * cornerRadius; var squaredDistance = Math.pow(cx - x, 2) + Math.pow(cy - y, 2); - if (squaredDistance <= squaredCornerRadius) { return true; } } - return pointInsidePolygonPoints(x, y, cutPolygonPoints); }; var joinLines = function joinLines(lineSet) { var vertices = new Array(lineSet.length / 2); var currentLineStartX, currentLineStartY, currentLineEndX, currentLineEndY; var nextLineStartX, nextLineStartY, nextLineEndX, nextLineEndY; - for (var i = 0; i < lineSet.length / 4; i++) { currentLineStartX = lineSet[i * 4]; currentLineStartY = lineSet[i * 4 + 1]; currentLineEndX = lineSet[i * 4 + 2]; currentLineEndY = lineSet[i * 4 + 3]; - if (i < lineSet.length / 4 - 1) { nextLineStartX = lineSet[(i + 1) * 4]; nextLineStartY = lineSet[(i + 1) * 4 + 1]; @@ -23914,35 +24149,34 @@ var joinLines = function joinLines(lineSet) { nextLineEndX = lineSet[2]; nextLineEndY = lineSet[3]; } - var intersection = finiteLinesIntersect(currentLineStartX, currentLineStartY, currentLineEndX, currentLineEndY, nextLineStartX, nextLineStartY, nextLineEndX, nextLineEndY, true); vertices[i * 2] = intersection[0]; vertices[i * 2 + 1] = intersection[1]; } - return vertices; }; var expandPolygon = function expandPolygon(points, pad) { var expandedLineSet = new Array(points.length * 2); var currentPointX, currentPointY, nextPointX, nextPointY; - for (var i = 0; i < points.length / 2; i++) { currentPointX = points[i * 2]; currentPointY = points[i * 2 + 1]; - if (i < points.length / 2 - 1) { nextPointX = points[(i + 1) * 2]; nextPointY = points[(i + 1) * 2 + 1]; } else { nextPointX = points[0]; nextPointY = points[1]; - } // Current line: [currentPointX, currentPointY] to [nextPointX, nextPointY] - // Assume CCW polygon winding + } + // Current line: [currentPointX, currentPointY] to [nextPointX, nextPointY] + + // Assume CCW polygon winding var offsetX = nextPointY - currentPointY; - var offsetY = -(nextPointX - currentPointX); // Normalize + var offsetY = -(nextPointX - currentPointX); + // Normalize var offsetLength = Math.sqrt(offsetX * offsetX + offsetY * offsetY); var normalizedOffsetX = offsetX / offsetLength; var normalizedOffsetY = offsetY / offsetLength; @@ -23951,7 +24185,6 @@ var expandPolygon = function expandPolygon(points, pad) { expandedLineSet[i * 4 + 2] = nextPointX + normalizedOffsetX * pad; expandedLineSet[i * 4 + 3] = nextPointY + normalizedOffsetY * pad; } - return expandedLineSet; }; var intersectLineEllipse = function intersectLineEllipse(x, y, centerX, centerY, ellipseWradius, ellipseHradius) { @@ -23961,11 +24194,9 @@ var intersectLineEllipse = function intersectLineEllipse(x, y, centerX, centerY, dispY /= ellipseHradius; var len = Math.sqrt(dispX * dispX + dispY * dispY); var newLength = len - 1; - if (newLength < 0) { return []; } - var lenProportion = newLength / len; return [(centerX - x) * lenProportion + x, (centerY - y) * lenProportion + y]; }; @@ -23975,43 +24206,36 @@ var checkInEllipse = function checkInEllipse(x, y, width, height, centerX, cente x /= width / 2 + padding; y /= height / 2 + padding; return x * x + y * y <= 1; -}; // Returns intersections of increasing distance from line's start point +}; +// Returns intersections of increasing distance from line's start point var intersectLineCircle = function intersectLineCircle(x1, y1, x2, y2, centerX, centerY, radius) { // Calculate d, direction vector of line var d = [x2 - x1, y2 - y1]; // Direction vector of line - var f = [x1 - centerX, y1 - centerY]; var a = d[0] * d[0] + d[1] * d[1]; var b = 2 * (f[0] * d[0] + f[1] * d[1]); var c = f[0] * f[0] + f[1] * f[1] - radius * radius; var discriminant = b * b - 4 * a * c; - if (discriminant < 0) { return []; } - var t1 = (-b + Math.sqrt(discriminant)) / (2 * a); var t2 = (-b - Math.sqrt(discriminant)) / (2 * a); var tMin = Math.min(t1, t2); var tMax = Math.max(t1, t2); var inRangeParams = []; - if (tMin >= 0 && tMin <= 1) { inRangeParams.push(tMin); } - if (tMax >= 0 && tMax <= 1) { inRangeParams.push(tMax); } - if (inRangeParams.length === 0) { return []; } - var nearIntersectionX = inRangeParams[0] * d[0] + x1; var nearIntersectionY = inRangeParams[0] * d[1] + y1; - if (inRangeParams.length > 1) { if (inRangeParams[0] == inRangeParams[1]) { return [nearIntersectionX, nearIntersectionY]; @@ -24032,8 +24256,9 @@ var midOfThree = function midOfThree(a, b, c) { } else { return c; } -}; // (x1,y1)=>(x2,y2) intersect with (x3,y3)=>(x4,y4) +}; +// (x1,y1)=>(x2,y2) intersect with (x3,y3)=>(x4,y4) var finiteLinesIntersect = function finiteLinesIntersect(x1, y1, x2, y2, x3, y3, x4, y4, infiniteLines) { var dx13 = x1 - x3; var dx21 = x2 - x1; @@ -24044,16 +24269,12 @@ var finiteLinesIntersect = function finiteLinesIntersect(x1, y1, x2, y2, x3, y3, var ua_t = dx43 * dy13 - dy43 * dx13; var ub_t = dx21 * dy13 - dy21 * dx13; var u_b = dy43 * dx21 - dx43 * dy21; - if (u_b !== 0) { var ua = ua_t / u_b; var ub = ub_t / u_b; var flptThreshold = 0.001; - var _min = 0 - flptThreshold; - var _max = 1 + flptThreshold; - if (_min <= ua && ua <= _max && _min <= ub && ub <= _max) { return [x1 + ua * dx21, y1 + ua * dy21]; } else { @@ -24066,51 +24287,48 @@ var finiteLinesIntersect = function finiteLinesIntersect(x1, y1, x2, y2, x3, y3, } else { if (ua_t === 0 || ub_t === 0) { // Parallel, coincident lines. Check if overlap + // Check endpoint of second line if (midOfThree(x1, x2, x4) === x4) { return [x4, y4]; - } // Check start point of second line - + } + // Check start point of second line if (midOfThree(x1, x2, x3) === x3) { return [x3, y3]; - } // Endpoint of first line - + } + // Endpoint of first line if (midOfThree(x3, x4, x2) === x2) { return [x2, y2]; } - return []; } else { // Parallel, non-coincident return []; } } -}; // math.polygonIntersectLine( x, y, basePoints, centerX, centerY, width, height, padding ) +}; + +// math.polygonIntersectLine( x, y, basePoints, centerX, centerY, width, height, padding ) // intersect a node polygon (pts transformed) // // math.polygonIntersectLine( x, y, basePoints, centerX, centerY ) // intersect the points (no transform) - var polygonIntersectLine = function polygonIntersectLine(x, y, basePoints, centerX, centerY, width, height, padding) { var intersections = []; var intersection; var transformedPoints = new Array(basePoints.length); var doTransform = true; - if (width == null) { doTransform = false; } - var points; - if (doTransform) { for (var i = 0; i < transformedPoints.length / 2; i++) { transformedPoints[i * 2] = basePoints[i * 2] * width + centerX; transformedPoints[i * 2 + 1] = basePoints[i * 2 + 1] * height + centerY; } - if (padding > 0) { var expandedLineSet = expandPolygon(transformedPoints, -padding); points = joinLines(expandedLineSet); @@ -24120,13 +24338,10 @@ var polygonIntersectLine = function polygonIntersectLine(x, y, basePoints, cente } else { points = basePoints; } - var currentX, currentY, nextX, nextY; - for (var _i2 = 0; _i2 < points.length / 2; _i2++) { currentX = points[_i2 * 2]; currentY = points[_i2 * 2 + 1]; - if (_i2 < points.length / 2 - 1) { nextX = points[(_i2 + 1) * 2]; nextY = points[(_i2 + 1) * 2 + 1]; @@ -24134,14 +24349,11 @@ var polygonIntersectLine = function polygonIntersectLine(x, y, basePoints, cente nextX = points[0]; nextY = points[1]; } - intersection = finiteLinesIntersect(x, y, centerX, centerY, currentX, currentY, nextX, nextY); - if (intersection.length !== 0) { intersections.push(intersection[0], intersection[1]); } } - return intersections; }; var roundPolygonIntersectLine = function roundPolygonIntersectLine(x, y, basePoints, centerX, centerY, width, height, padding) { @@ -24151,17 +24363,14 @@ var roundPolygonIntersectLine = function roundPolygonIntersectLine(x, y, basePoi var halfW = width / 2; var halfH = height / 2; var cornerRadius = getRoundPolygonRadius(width, height); - for (var i = 0; i < basePoints.length / 4; i++) { var sourceUv = void 0, - destUv = void 0; - + destUv = void 0; if (i === 0) { sourceUv = basePoints.length - 2; } else { sourceUv = i * 4 - 2; } - destUv = i * 4 + 2; var px = centerX + halfW * basePoints[i * 4]; var py = centerY + halfH * basePoints[i * 4 + 1]; @@ -24171,7 +24380,6 @@ var roundPolygonIntersectLine = function roundPolygonIntersectLine(x, y, basePoi var cp0y = py - offset * basePoints[sourceUv + 1]; var cp1x = px + offset * basePoints[destUv]; var cp1y = py + offset * basePoints[destUv + 1]; - if (i === 0) { lines[basePoints.length - 2] = cp0x; lines[basePoints.length - 1] = cp0y; @@ -24179,63 +24387,50 @@ var roundPolygonIntersectLine = function roundPolygonIntersectLine(x, y, basePoi lines[i * 4 - 2] = cp0x; lines[i * 4 - 1] = cp0y; } - lines[i * 4] = cp1x; lines[i * 4 + 1] = cp1y; var orthx = basePoints[sourceUv + 1]; var orthy = -basePoints[sourceUv]; var cosAlpha = orthx * basePoints[destUv] + orthy * basePoints[destUv + 1]; - if (cosAlpha < 0) { orthx *= -1; orthy *= -1; } - var cx = cp0x + orthx * cornerRadius; var cy = cp0y + orthy * cornerRadius; intersection = intersectLineCircle(x, y, centerX, centerY, cx, cy, cornerRadius); - if (intersection.length !== 0) { intersections.push(intersection[0], intersection[1]); } } - for (var _i3 = 0; _i3 < lines.length / 4; _i3++) { intersection = finiteLinesIntersect(x, y, centerX, centerY, lines[_i3 * 4], lines[_i3 * 4 + 1], lines[_i3 * 4 + 2], lines[_i3 * 4 + 3], false); - if (intersection.length !== 0) { intersections.push(intersection[0], intersection[1]); } } - if (intersections.length > 2) { var lowestIntersection = [intersections[0], intersections[1]]; var lowestSquaredDistance = Math.pow(lowestIntersection[0] - x, 2) + Math.pow(lowestIntersection[1] - y, 2); - for (var _i4 = 1; _i4 < intersections.length / 2; _i4++) { var squaredDistance = Math.pow(intersections[_i4 * 2] - x, 2) + Math.pow(intersections[_i4 * 2 + 1] - y, 2); - if (squaredDistance <= lowestSquaredDistance) { lowestIntersection[0] = intersections[_i4 * 2]; lowestIntersection[1] = intersections[_i4 * 2 + 1]; lowestSquaredDistance = squaredDistance; } } - return lowestIntersection; } - return intersections; }; var shortenIntersection = function shortenIntersection(intersection, offset, amount) { var disp = [intersection[0] - offset[0], intersection[1] - offset[1]]; var length = Math.sqrt(disp[0] * disp[0] + disp[1] * disp[1]); var lenRatio = (length - amount) / length; - if (lenRatio < 0) { lenRatio = 0.00001; } - return [offset[0] + lenRatio * disp[0], offset[1] + lenRatio * disp[1]]; }; var generateUnitNgonPointsFitToSquare = function generateUnitNgonPointsFitToSquare(sides, rotationRadians) { @@ -24247,10 +24442,9 @@ var fitPolygonToSquare = function fitPolygonToSquare(points) { var x, y; var sides = points.length / 2; var minX = Infinity, - minY = Infinity, - maxX = -Infinity, - maxY = -Infinity; - + minY = Infinity, + maxX = -Infinity, + maxY = -Infinity; for (var i = 0; i < sides; i++) { x = points[2 * i]; y = points[2 * i + 1]; @@ -24258,12 +24452,11 @@ var fitPolygonToSquare = function fitPolygonToSquare(points) { maxX = Math.max(maxX, x); minY = Math.min(minY, y); maxY = Math.max(maxY, y); - } // stretch factors - + } + // stretch factors var sx = 2 / (maxX - minX); var sy = 2 / (maxY - minY); - for (var _i5 = 0; _i5 < sides; _i5++) { x = points[2 * _i5] = points[2 * _i5] * sx; y = points[2 * _i5 + 1] = points[2 * _i5 + 1] * sy; @@ -24272,13 +24465,11 @@ var fitPolygonToSquare = function fitPolygonToSquare(points) { minY = Math.min(minY, y); maxY = Math.max(maxY, y); } - if (minY < -1) { for (var _i6 = 0; _i6 < sides; _i6++) { y = points[2 * _i6 + 1] = points[2 * _i6 + 1] + (-1 - minY); } } - return points; }; var generateUnitNgonPoints = function generateUnitNgonPoints(sides, rotationRadians) { @@ -24287,21 +24478,21 @@ var generateUnitNgonPoints = function generateUnitNgonPoints(sides, rotationRadi startAngle += rotationRadians; var points = new Array(sides * 2); var currentAngle; - for (var i = 0; i < sides; i++) { currentAngle = i * increment + startAngle; points[2 * i] = Math.cos(currentAngle); // x - points[2 * i + 1] = Math.sin(-currentAngle); // y } return points; -}; // Set the default radius, unless half of width or height is smaller than default +}; +// Set the default radius, unless half of width or height is smaller than default var getRoundRectangleRadius = function getRoundRectangleRadius(width, height) { return Math.min(width / 4, height / 4, 8); -}; // Set the default radius +}; +// Set the default radius var getRoundPolygonRadius = function getRoundPolygonRadius(width, height) { return Math.min(width / 10, height / 10, 8); }; @@ -24310,8 +24501,9 @@ var getCutRectangleCornerLength = function getCutRectangleCornerLength() { }; var bezierPtsToQuadCoeff = function bezierPtsToQuadCoeff(p0, p1, p2) { return [p0 - 2 * p1 + p2, 2 * (p1 - p0), p0]; -}; // get curve width, height, and control point position offsets as a percentage of node height / width +}; +// get curve width, height, and control point position offsets as a percentage of node height / width var getBarrelCurveConstants = function getBarrelCurveConstants(width, height) { return { heightOffset: Math.min(15, 0.05 * height), @@ -24331,124 +24523,118 @@ var pageRankDefaults = defaults$g({ var elesfn$o = { pageRank: function pageRank(options) { var _pageRankDefaults = pageRankDefaults(options), - dampingFactor = _pageRankDefaults.dampingFactor, - precision = _pageRankDefaults.precision, - iterations = _pageRankDefaults.iterations, - weight = _pageRankDefaults.weight; - + dampingFactor = _pageRankDefaults.dampingFactor, + precision = _pageRankDefaults.precision, + iterations = _pageRankDefaults.iterations, + weight = _pageRankDefaults.weight; var cy = this._private.cy; - var _this$byGroup = this.byGroup(), - nodes = _this$byGroup.nodes, - edges = _this$byGroup.edges; - + nodes = _this$byGroup.nodes, + edges = _this$byGroup.edges; var numNodes = nodes.length; var numNodesSqd = numNodes * numNodes; - var numEdges = edges.length; // Construct transposed adjacency matrix + var numEdges = edges.length; + + // Construct transposed adjacency matrix // First lets have a zeroed matrix of the right size // We'll also keep track of the sum of each column - var matrix = new Array(numNodesSqd); var columnSum = new Array(numNodes); - var additionalProb = (1 - dampingFactor) / numNodes; // Create null matrix + var additionalProb = (1 - dampingFactor) / numNodes; + // Create null matrix for (var i = 0; i < numNodes; i++) { for (var j = 0; j < numNodes; j++) { var n = i * numNodes + j; matrix[n] = 0; } - columnSum[i] = 0; - } // Now, process edges - + } + // Now, process edges for (var _i = 0; _i < numEdges; _i++) { var edge = edges[_i]; var srcId = edge.data('source'); - var tgtId = edge.data('target'); // Don't include loops in the matrix + var tgtId = edge.data('target'); + // Don't include loops in the matrix if (srcId === tgtId) { continue; } - var s = nodes.indexOfId(srcId); var t = nodes.indexOfId(tgtId); var w = weight(edge); + var _n = t * numNodes + s; - var _n = t * numNodes + s; // Update matrix - - - matrix[_n] += w; // Update column sum + // Update matrix + matrix[_n] += w; + // Update column sum columnSum[s] += w; - } // Add additional probability based on damping factor - // Also, take into account columns that have sum = 0 - + } + // Add additional probability based on damping factor + // Also, take into account columns that have sum = 0 var p = 1.0 / numNodes + additionalProb; // Shorthand - // Traverse matrix, column by column + // Traverse matrix, column by column for (var _j = 0; _j < numNodes; _j++) { if (columnSum[_j] === 0) { // No 'links' out from node jth, assume equal probability for each possible node for (var _i2 = 0; _i2 < numNodes; _i2++) { var _n2 = _i2 * numNodes + _j; - matrix[_n2] = p; } } else { // Node jth has outgoing link, compute normalized probabilities for (var _i3 = 0; _i3 < numNodes; _i3++) { var _n3 = _i3 * numNodes + _j; - matrix[_n3] = matrix[_n3] / columnSum[_j] + additionalProb; } } - } // Compute dominant eigenvector using power method - + } + // Compute dominant eigenvector using power method var eigenvector = new Array(numNodes); var temp = new Array(numNodes); - var previous; // Start with a vector of all 1's - // Also, initialize a null vector which will be used as shorthand + var previous; + // Start with a vector of all 1's + // Also, initialize a null vector which will be used as shorthand for (var _i4 = 0; _i4 < numNodes; _i4++) { eigenvector[_i4] = 1; } - for (var iter = 0; iter < iterations; iter++) { // Temp array with all 0's for (var _i5 = 0; _i5 < numNodes; _i5++) { temp[_i5] = 0; - } // Multiply matrix with previous result - + } + // Multiply matrix with previous result for (var _i6 = 0; _i6 < numNodes; _i6++) { for (var _j2 = 0; _j2 < numNodes; _j2++) { var _n4 = _i6 * numNodes + _j2; - temp[_i6] += matrix[_n4] * eigenvector[_j2]; } } - inPlaceSumNormalize(temp); previous = eigenvector; eigenvector = temp; temp = previous; - var diff = 0; // Compute difference (squared module) of both vectors - + var diff = 0; + // Compute difference (squared module) of both vectors for (var _i7 = 0; _i7 < numNodes; _i7++) { var delta = previous[_i7] - eigenvector[_i7]; diff += delta * delta; - } // If difference is less than the desired threshold, stop iterating - + } + // If difference is less than the desired threshold, stop iterating if (diff < precision) { break; } - } // Construct result - + } + // Construct result var res = { rank: function rank(node) { node = cy.collection(node)[0]; @@ -24457,7 +24643,6 @@ var elesfn$o = { }; return res; } // pageRank - }; // elesfn var defaults$f = defaults$g({ @@ -24474,35 +24659,29 @@ var elesfn$n = { var cy = this.cy(); var nodes = this.nodes(); var numNodes = nodes.length; - if (!options.directed) { var degrees = {}; var maxDegree = 0; - for (var i = 0; i < numNodes; i++) { - var node = nodes[i]; // add current node to the current options object and call degreeCentrality + var node = nodes[i]; + // add current node to the current options object and call degreeCentrality options.root = node; var currDegree = this.degreeCentrality(options); - if (maxDegree < currDegree.degree) { maxDegree = currDegree.degree; } - degrees[node.id()] = currDegree.degree; } - return { degree: function degree(node) { if (maxDegree === 0) { return 0; } - if (string(node)) { // from is a selector string node = cy.filter(node); } - return degrees[node.id()] / maxDegree; } }; @@ -24511,52 +24690,44 @@ var elesfn$n = { var outdegrees = {}; var maxIndegree = 0; var maxOutdegree = 0; - for (var _i = 0; _i < numNodes; _i++) { var _node = nodes[_i]; + var id = _node.id(); - var id = _node.id(); // add current node to the current options object and call degreeCentrality - - + // add current node to the current options object and call degreeCentrality options.root = _node; - var _currDegree = this.degreeCentrality(options); - if (maxIndegree < _currDegree.indegree) maxIndegree = _currDegree.indegree; if (maxOutdegree < _currDegree.outdegree) maxOutdegree = _currDegree.outdegree; indegrees[id] = _currDegree.indegree; outdegrees[id] = _currDegree.outdegree; } - return { indegree: function indegree(node) { if (maxIndegree == 0) { return 0; } - if (string(node)) { // from is a selector string node = cy.filter(node); } - return indegrees[node.id()] / maxIndegree; }, outdegree: function outdegree(node) { if (maxOutdegree === 0) { return 0; } - if (string(node)) { // from is a selector string node = cy.filter(node); } - return outdegrees[node.id()] / maxOutdegree; } }; } }, // degreeCentralityNormalized + // Implemented from the algorithm in Opsahl's paper // "Node centrality in weighted networks: Generalizing degree and shortest paths" // check the heading 2 "Degree" @@ -24565,21 +24736,20 @@ var elesfn$n = { var cy = this.cy(); var callingEles = this; var _options = options, - root = _options.root, - weight = _options.weight, - directed = _options.directed, - alpha = _options.alpha; + root = _options.root, + weight = _options.weight, + directed = _options.directed, + alpha = _options.alpha; root = cy.collection(root)[0]; - if (!directed) { var connEdges = root.connectedEdges().intersection(callingEles); var k = connEdges.length; - var s = 0; // Now, sum edge weights + var s = 0; + // Now, sum edge weights for (var i = 0; i < connEdges.length; i++) { s += weight(connEdges[i]); } - return { degree: Math.pow(k, 1 - alpha) * Math.pow(s, alpha) }; @@ -24594,27 +24764,26 @@ var elesfn$n = { var k_in = incoming.length; var k_out = outgoing.length; var s_in = 0; - var s_out = 0; // Now, sum incoming edge weights + var s_out = 0; + // Now, sum incoming edge weights for (var _i2 = 0; _i2 < incoming.length; _i2++) { s_in += weight(incoming[_i2]); - } // Now, sum outgoing edge weights - + } + // Now, sum outgoing edge weights for (var _i3 = 0; _i3 < outgoing.length; _i3++) { s_out += weight(outgoing[_i3]); } - return { indegree: Math.pow(k_in, 1 - alpha) * Math.pow(s_in, alpha), outdegree: Math.pow(k_out, 1 - alpha) * Math.pow(s_out, alpha) }; } } // degreeCentrality - }; // elesfn -// nice, short mathematical alias +// nice, short mathematical alias elesfn$n.dc = elesfn$n.degreeCentrality; elesfn$n.dcn = elesfn$n.degreeCentralityNormalised = elesfn$n.degreeCentralityNormalized; @@ -24629,10 +24798,9 @@ var defaults$e = defaults$g({ var elesfn$m = { closenessCentralityNormalized: function closenessCentralityNormalized(options) { var _defaults = defaults$e(options), - harmonic = _defaults.harmonic, - weight = _defaults.weight, - directed = _defaults.directed; - + harmonic = _defaults.harmonic, + weight = _defaults.weight, + directed = _defaults.directed; var cy = this.cy(); var closenesses = {}; var maxCloseness = 0; @@ -24640,16 +24808,15 @@ var elesfn$m = { var fw = this.floydWarshall({ weight: weight, directed: directed - }); // Compute closeness for every node and find the maximum closeness + }); + // Compute closeness for every node and find the maximum closeness for (var i = 0; i < nodes.length; i++) { var currCloseness = 0; var node_i = nodes[i]; - for (var j = 0; j < nodes.length; j++) { if (i !== j) { var d = fw.distance(node_i, nodes[j]); - if (harmonic) { currCloseness += 1 / d; } else { @@ -24657,24 +24824,19 @@ var elesfn$m = { } } } - if (!harmonic) { currCloseness = 1 / currCloseness; } - if (maxCloseness < currCloseness) { maxCloseness = currCloseness; } - closenesses[node_i.id()] = currCloseness; } - return { closeness: function closeness(node) { if (maxCloseness == 0) { return 0; } - if (string(node)) { // from is a selector string node = cy.filter(node)[0].id(); @@ -24682,7 +24844,6 @@ var elesfn$m = { // from is a node node = node.id(); } - return closenesses[node] / maxCloseness; } }; @@ -24690,13 +24851,13 @@ var elesfn$m = { // Implemented from pseudocode from wikipedia closenessCentrality: function closenessCentrality(options) { var _defaults2 = defaults$e(options), - root = _defaults2.root, - weight = _defaults2.weight, - directed = _defaults2.directed, - harmonic = _defaults2.harmonic; - - root = this.filter(root)[0]; // we need distance from this node to every other node + root = _defaults2.root, + weight = _defaults2.weight, + directed = _defaults2.directed, + harmonic = _defaults2.harmonic; + root = this.filter(root)[0]; + // we need distance from this node to every other node var dijkstra = this.dijkstra({ root: root, weight: weight, @@ -24704,13 +24865,10 @@ var elesfn$m = { }); var totalDistance = 0; var nodes = this.nodes(); - for (var i = 0; i < nodes.length; i++) { var n = nodes[i]; - if (!n.same(root)) { var d = dijkstra.distanceTo(n); - if (harmonic) { totalDistance += 1 / d; } else { @@ -24718,13 +24876,11 @@ var elesfn$m = { } } } - return harmonic ? totalDistance : 1 / totalDistance; } // closenessCentrality - }; // elesfn -// nice, short mathematical alias +// nice, short mathematical alias elesfn$m.cc = elesfn$m.closenessCentrality; elesfn$m.ccn = elesfn$m.closenessCentralityNormalised = elesfn$m.closenessCentralityNormalized; @@ -24736,12 +24892,12 @@ var elesfn$l = { // Implemented from the algorithm in the paper "On Variants of Shortest-Path Betweenness Centrality and their Generic Computation" by Ulrik Brandes betweennessCentrality: function betweennessCentrality(options) { var _defaults = defaults$d(options), - directed = _defaults.directed, - weight = _defaults.weight; - + directed = _defaults.directed, + weight = _defaults.weight; var weighted = weight != null; - var cy = this.cy(); // starting + var cy = this.cy(); + // starting var V = this.nodes(); var A = {}; var _C = {}; @@ -24749,7 +24905,6 @@ var elesfn$l = { var C = { set: function set(key, val) { _C[key] = val; - if (val > max) { max = val; } @@ -24757,12 +24912,12 @@ var elesfn$l = { get: function get(key) { return _C[key]; } - }; // A contains the neighborhoods of every node + }; + // A contains the neighborhoods of every node for (var i = 0; i < V.length; i++) { var v = V[i]; var vid = v.id(); - if (directed) { A[vid] = v.outgoers().nodes(); // get outgoers of every node } else { @@ -24771,56 +24926,44 @@ var elesfn$l = { C.set(vid, 0); } - var _loop = function _loop(s) { var sid = V[s].id(); var S = []; // stack - var P = {}; var g = {}; var d = {}; var Q = new Heap__default["default"](function (a, b) { return d[a] - d[b]; }); // queue - // init dictionaries + // init dictionaries for (var _i = 0; _i < V.length; _i++) { var _vid = V[_i].id(); - P[_vid] = []; g[_vid] = 0; d[_vid] = Infinity; } - g[sid] = 1; // sigma - d[sid] = 0; // distance to s Q.push(sid); - while (!Q.empty()) { var _v = Q.pop(); - S.push(_v); - if (weighted) { for (var j = 0; j < A[_v].length; j++) { var w = A[_v][j]; var vEle = cy.getElementById(_v); var edge = void 0; - if (vEle.edgesTo(w).length > 0) { edge = vEle.edgesTo(w)[0]; } else { edge = w.edgesTo(vEle)[0]; } - var edgeWeight = weight(edge); w = w.id(); - if (d[w] > d[_v] + edgeWeight) { d[w] = d[_v] + edgeWeight; - if (Q.nodes.indexOf(w) < 0) { //if w is not in Q Q.push(w); @@ -24828,11 +24971,9 @@ var elesfn$l = { // update position if w is in Q Q.updateItem(w); } - g[w] = 0; P[w] = []; } - if (d[w] == d[_v] + edgeWeight) { g[w] = g[w] + g[_v]; P[w].push(_v); @@ -24841,45 +24982,35 @@ var elesfn$l = { } else { for (var _j = 0; _j < A[_v].length; _j++) { var _w = A[_v][_j].id(); - if (d[_w] == Infinity) { Q.push(_w); d[_w] = d[_v] + 1; } - if (d[_w] == d[_v] + 1) { g[_w] = g[_w] + g[_v]; - P[_w].push(_v); } } } } - var e = {}; - for (var _i2 = 0; _i2 < V.length; _i2++) { e[V[_i2].id()] = 0; } - while (S.length > 0) { var _w2 = S.pop(); - for (var _j2 = 0; _j2 < P[_w2].length; _j2++) { var _v2 = P[_w2][_j2]; e[_v2] = e[_v2] + g[_v2] / g[_w2] * (1 + e[_w2]); } - if (_w2 != V[s].id()) { C.set(_w2, C.get(_w2) + e[_w2]); } } }; - for (var s = 0; s < V.length; s++) { _loop(s); } - var ret = { betweenness: function betweenness(node) { var id = cy.collection(node).id(); @@ -24889,24 +25020,23 @@ var elesfn$l = { if (max == 0) { return 0; } - var id = cy.collection(node).id(); return C.get(id) / max; } - }; // alias + }; + // alias ret.betweennessNormalised = ret.betweennessNormalized; return ret; } // betweennessCentrality - }; // elesfn -// nice, short mathematical alias +// nice, short mathematical alias elesfn$l.bc = elesfn$l.betweennessCentrality; // Implemented by Zoe Xi @zoexi for GSOC 2016 -/* eslint-disable no-unused-vars */ +/* eslint-disable no-unused-vars */ var defaults$c = defaults$g({ expandFactor: 2, // affects time of computation and cluster granularity to some extent: M * M @@ -24916,7 +25046,8 @@ var defaults$c = defaults$g({ // optional self loops for each node. Use a neutral value to improve cluster computations. maxIterations: 20, // maximum number of iterations of the MCL algorithm in a single run - attributes: [// attributes/features used to group nodes, ie. similarity values between nodes + attributes: [ + // attributes/features used to group nodes, ie. similarity values between nodes function (edge) { return 1; }] @@ -24928,130 +25059,98 @@ var setOptions$3 = function setOptions(options) { }; /* eslint-enable */ - var getSimilarity$1 = function getSimilarity(edge, attributes) { var total = 0; - for (var i = 0; i < attributes.length; i++) { total += attributes[i](edge); } - return total; }; - var addLoops = function addLoops(M, n, val) { for (var i = 0; i < n; i++) { M[i * n + i] = val; } }; - var normalize = function normalize(M, n) { var sum; - for (var col = 0; col < n; col++) { sum = 0; - for (var row = 0; row < n; row++) { sum += M[row * n + col]; } - for (var _row = 0; _row < n; _row++) { M[_row * n + col] = M[_row * n + col] / sum; } } -}; // TODO: blocked matrix multiplication? - +}; +// TODO: blocked matrix multiplication? var mmult = function mmult(A, B, n) { var C = new Array(n * n); - for (var i = 0; i < n; i++) { for (var j = 0; j < n; j++) { C[i * n + j] = 0; } - for (var k = 0; k < n; k++) { for (var _j = 0; _j < n; _j++) { C[i * n + _j] += A[i * n + k] * B[k * n + _j]; } } } - return C; }; - -var expand = function expand(M, n, expandFactor -/** power **/ -) { +var expand = function expand(M, n, expandFactor /** power **/) { var _M = M.slice(0); - for (var p = 1; p < expandFactor; p++) { M = mmult(M, _M, n); } - return M; }; +var inflate = function inflate(M, n, inflateFactor /** r **/) { + var _M = new Array(n * n); -var inflate = function inflate(M, n, inflateFactor -/** r **/ -) { - var _M = new Array(n * n); // M(i,j) ^ inflatePower - - + // M(i,j) ^ inflatePower for (var i = 0; i < n * n; i++) { _M[i] = Math.pow(M[i], inflateFactor); } - normalize(_M, n); return _M; }; - var hasConverged = function hasConverged(M, _M, n2, roundFactor) { // Check that both matrices have the same elements (i,j) for (var i = 0; i < n2; i++) { var v1 = Math.round(M[i] * Math.pow(10, roundFactor)) / Math.pow(10, roundFactor); // truncate to 'roundFactor' decimal places - var v2 = Math.round(_M[i] * Math.pow(10, roundFactor)) / Math.pow(10, roundFactor); - if (v1 !== v2) { return false; } } - return true; }; - var assign$2 = function assign(M, n, nodes, cy) { var clusters = []; - for (var i = 0; i < n; i++) { var cluster = []; - for (var j = 0; j < n; j++) { // Row-wise attractors and elements that they attract belong in same cluster if (Math.round(M[i * n + j] * 1000) / 1000 > 0) { cluster.push(nodes[j]); } } - if (cluster.length !== 0) { clusters.push(cy.collection(cluster)); } } - return clusters; }; - var isDuplicate = function isDuplicate(c1, c2) { for (var i = 0; i < c1.length; i++) { if (!c2[i] || c1[i].id() !== c2[i].id()) { return false; } } - return true; }; - var removeDuplicates = function removeDuplicates(clusters) { for (var i = 0; i < clusters.length; i++) { for (var j = 0; j < clusters.length; j++) { @@ -25060,118 +25159,106 @@ var removeDuplicates = function removeDuplicates(clusters) { } } } - return clusters; }; - var markovClustering = function markovClustering(options) { var nodes = this.nodes(); var edges = this.edges(); - var cy = this.cy(); // Set parameters of algorithm: + var cy = this.cy(); - var opts = setOptions$3(options); // Map each node to its position in node array + // Set parameters of algorithm: + var opts = setOptions$3(options); + // Map each node to its position in node array var id2position = {}; - for (var i = 0; i < nodes.length; i++) { id2position[nodes[i].id()] = i; - } // Generate stochastic matrix M from input graph G (should be symmetric/undirected) - + } + // Generate stochastic matrix M from input graph G (should be symmetric/undirected) var n = nodes.length, - n2 = n * n; - + n2 = n * n; var M = new Array(n2), - _M; - + _M; for (var _i = 0; _i < n2; _i++) { M[_i] = 0; } - for (var e = 0; e < edges.length; e++) { var edge = edges[e]; var _i2 = id2position[edge.source().id()]; var j = id2position[edge.target().id()]; var sim = getSimilarity$1(edge, opts.attributes); M[_i2 * n + j] += sim; // G should be symmetric and undirected - M[j * n + _i2] += sim; - } // Begin Markov cluster algorithm - // Step 1: Add self loops to each node, ie. add multFactor to matrix diagonal + } + // Begin Markov cluster algorithm - addLoops(M, n, opts.multFactor); // Step 2: M = normalize( M ); + // Step 1: Add self loops to each node, ie. add multFactor to matrix diagonal + addLoops(M, n, opts.multFactor); + // Step 2: M = normalize( M ); normalize(M, n); var isStillMoving = true; var iterations = 0; - while (isStillMoving && iterations < opts.maxIterations) { - isStillMoving = false; // Step 3: + isStillMoving = false; - _M = expand(M, n, opts.expandFactor); // Step 4: + // Step 3: + _M = expand(M, n, opts.expandFactor); - M = inflate(_M, n, opts.inflateFactor); // Step 5: check to see if ~steady state has been reached + // Step 4: + M = inflate(_M, n, opts.inflateFactor); + // Step 5: check to see if ~steady state has been reached if (!hasConverged(M, _M, n2, 4)) { isStillMoving = true; } - iterations++; - } // Build clusters from matrix - + } - var clusters = assign$2(M, n, nodes, cy); // Remove duplicate clusters due to symmetry of graph and M matrix + // Build clusters from matrix + var clusters = assign$2(M, n, nodes, cy); + // Remove duplicate clusters due to symmetry of graph and M matrix clusters = removeDuplicates(clusters); return clusters; }; - var markovClustering$1 = { markovClustering: markovClustering, mcl: markovClustering }; // Common distance metrics for clustering algorithms - var identity = function identity(x) { return x; }; - var absDiff = function absDiff(p, q) { return Math.abs(q - p); }; - var addAbsDiff = function addAbsDiff(total, p, q) { return total + absDiff(p, q); }; - var addSquaredDiff = function addSquaredDiff(total, p, q) { return total + Math.pow(q - p, 2); }; - var sqrt = function sqrt(x) { return Math.sqrt(x); }; - var maxAbsDiff = function maxAbsDiff(currentMax, p, q) { return Math.max(currentMax, absDiff(p, q)); }; - var getDistance = function getDistance(length, getP, getQ, init, visit) { var post = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : identity; var ret = init; var p, q; - for (var dim = 0; dim < length; dim++) { p = getP(dim); q = getQ(dim); ret = visit(ret, p, q); } - return post(ret); }; - var distances = { euclidean: function euclidean(length, getP, getQ) { if (length >= 2) { @@ -25190,19 +25277,18 @@ var distances = { max: function max(length, getP, getQ) { return getDistance(length, getP, getQ, -Infinity, maxAbsDiff); } -}; // in case the user accidentally doesn't use camel case +}; +// in case the user accidentally doesn't use camel case distances['squared-euclidean'] = distances['squaredEuclidean']; distances['squaredeuclidean'] = distances['squaredEuclidean']; function clusteringDistance (method, length, getP, getQ, nodeP, nodeQ) { var impl; - if (fn$6(method)) { impl = method; } else { impl = distances[method] || distances.euclidean; } - if (length === 0 && fn$6(method)) { return impl(nodeP, nodeQ); } else { @@ -25220,12 +25306,9 @@ var defaults$b = defaults$g({ testMode: false, testCentroids: null }); - var setOptions$2 = function setOptions(options) { return defaults$b(options); }; -/* eslint-enable */ - var getDist = function getDist(type, node, centroid, attributes, mode) { var noNodeP = mode !== 'kMedoids'; @@ -25234,114 +25317,96 @@ var getDist = function getDist(type, node, centroid, attributes, mode) { } : function (i) { return attributes[i](centroid); }; - var getQ = function getQ(i) { return attributes[i](node); }; - var nodeP = centroid; var nodeQ = node; return clusteringDistance(type, attributes.length, getP, getQ, nodeP, nodeQ); }; - var randomCentroids = function randomCentroids(nodes, k, attributes) { var ndim = attributes.length; var min = new Array(ndim); var max = new Array(ndim); var centroids = new Array(k); - var centroid = null; // Find min, max values for each attribute dimension + var centroid = null; + // Find min, max values for each attribute dimension for (var i = 0; i < ndim; i++) { min[i] = nodes.min(attributes[i]).value; max[i] = nodes.max(attributes[i]).value; - } // Build k centroids, each represented as an n-dim feature vector - + } + // Build k centroids, each represented as an n-dim feature vector for (var c = 0; c < k; c++) { centroid = []; - for (var _i = 0; _i < ndim; _i++) { centroid[_i] = Math.random() * (max[_i] - min[_i]) + min[_i]; // random initial value } centroids[c] = centroid; } - return centroids; }; - var classify = function classify(node, centroids, distance, attributes, type) { var min = Infinity; var index = 0; - for (var i = 0; i < centroids.length; i++) { var dist = getDist(distance, node, centroids[i], attributes, type); - if (dist < min) { min = dist; index = i; } } - return index; }; - var buildCluster = function buildCluster(centroid, nodes, assignment) { var cluster = []; var node = null; - for (var n = 0; n < nodes.length; n++) { node = nodes[n]; - if (assignment[node.id()] === centroid) { //console.log("Node " + node.id() + " is associated with medoid #: " + m); cluster.push(node); } } - return cluster; }; - var haveValuesConverged = function haveValuesConverged(v1, v2, sensitivityThreshold) { return Math.abs(v2 - v1) <= sensitivityThreshold; }; - var haveMatricesConverged = function haveMatricesConverged(v1, v2, sensitivityThreshold) { for (var i = 0; i < v1.length; i++) { for (var j = 0; j < v1[i].length; j++) { var diff = Math.abs(v1[i][j] - v2[i][j]); - if (diff > sensitivityThreshold) { return false; } } } - return true; }; - var seenBefore = function seenBefore(node, medoids, n) { for (var i = 0; i < n; i++) { if (node === medoids[i]) return true; } - return false; }; - var randomMedoids = function randomMedoids(nodes, k) { - var medoids = new Array(k); // For small data sets, the probability of medoid conflict is greater, - // so we need to check to see if we've already seen or chose this node before. + var medoids = new Array(k); + // For small data sets, the probability of medoid conflict is greater, + // so we need to check to see if we've already seen or chose this node before. if (nodes.length < 50) { // Randomly select k medoids from the n nodes for (var i = 0; i < k; i++) { - var node = nodes[Math.floor(Math.random() * nodes.length)]; // If we've already chosen this node to be a medoid, don't choose it again (for small data sets). - // Instead choose a different random node. + var node = nodes[Math.floor(Math.random() * nodes.length)]; + // If we've already chosen this node to be a medoid, don't choose it again (for small data sets). + // Instead choose a different random node. while (seenBefore(node, medoids, i)) { node = nodes[Math.floor(Math.random() * nodes.length)]; } - medoids[i] = node; } } else { @@ -25350,31 +25415,29 @@ var randomMedoids = function randomMedoids(nodes, k) { medoids[_i2] = nodes[Math.floor(Math.random() * nodes.length)]; } } - return medoids; }; - var findCost = function findCost(potentialNewMedoid, cluster, attributes) { var cost = 0; - for (var n = 0; n < cluster.length; n++) { cost += getDist('manhattan', cluster[n], potentialNewMedoid, attributes, 'kMedoids'); } - return cost; }; - var kMeans = function kMeans(options) { var cy = this.cy(); var nodes = this.nodes(); - var node = null; // Set parameters of algorithm: # of clusters, distance metric, etc. + var node = null; - var opts = setOptions$2(options); // Begin k-means algorithm + // Set parameters of algorithm: # of clusters, distance metric, etc. + var opts = setOptions$2(options); + // Begin k-means algorithm var clusters = new Array(opts.k); var assignment = {}; - var centroids; // Step 1: Initialize centroid positions + var centroids; + // Step 1: Initialize centroid positions if (opts.testMode) { if (typeof opts.testCentroids === 'number') { // TODO: implement a seeded random number generator. @@ -25388,75 +25451,65 @@ var kMeans = function kMeans(options) { } else { centroids = randomCentroids(nodes, opts.k, opts.attributes); } - var isStillMoving = true; var iterations = 0; - while (isStillMoving && iterations < opts.maxIterations) { // Step 2: Assign nodes to the nearest centroid for (var n = 0; n < nodes.length; n++) { - node = nodes[n]; // Determine which cluster this node belongs to: node id => cluster # - + node = nodes[n]; + // Determine which cluster this node belongs to: node id => cluster # assignment[node.id()] = classify(node, centroids, opts.distance, opts.attributes, 'kMeans'); - } // Step 3: For each of the k clusters, update its centroid - + } + // Step 3: For each of the k clusters, update its centroid isStillMoving = false; - for (var c = 0; c < opts.k; c++) { // Get all nodes that belong to this cluster var cluster = buildCluster(c, nodes, assignment); - if (cluster.length === 0) { // If cluster is empty, break out early & move to next cluster continue; - } // Update centroids by calculating avg of all nodes within the cluster. - + } + // Update centroids by calculating avg of all nodes within the cluster. var ndim = opts.attributes.length; var centroid = centroids[c]; // [ dim_1, dim_2, dim_3, ... , dim_n ] - var newCentroid = new Array(ndim); var sum = new Array(ndim); - for (var d = 0; d < ndim; d++) { sum[d] = 0.0; - for (var i = 0; i < cluster.length; i++) { node = cluster[i]; sum[d] += opts.attributes[d](node); } + newCentroid[d] = sum[d] / cluster.length; - newCentroid[d] = sum[d] / cluster.length; // Check to see if algorithm has converged, i.e. when centroids no longer change - + // Check to see if algorithm has converged, i.e. when centroids no longer change if (!haveValuesConverged(newCentroid[d], centroid[d], opts.sensitivityThreshold)) { isStillMoving = true; } } - centroids[c] = newCentroid; clusters[c] = cy.collection(cluster); } - iterations++; } - return clusters; }; - var kMedoids = function kMedoids(options) { var cy = this.cy(); var nodes = this.nodes(); var node = null; - var opts = setOptions$2(options); // Begin k-medoids algorithm + var opts = setOptions$2(options); + // Begin k-medoids algorithm var clusters = new Array(opts.k); var medoids; var assignment = {}; var curCost; var minCosts = new Array(opts.k); // minimum cost configuration for each cluster - // Step 1: Initialize k medoids + // Step 1: Initialize k medoids if (opts.testMode) { if (typeof opts.testCentroids === 'number') ; else if (_typeof(opts.testCentroids) === 'object') { medoids = opts.testCentroids; @@ -25466,213 +25519,177 @@ var kMedoids = function kMedoids(options) { } else { medoids = randomMedoids(nodes, opts.k); } - var isStillMoving = true; var iterations = 0; - while (isStillMoving && iterations < opts.maxIterations) { // Step 2: Assign nodes to the nearest medoid for (var n = 0; n < nodes.length; n++) { - node = nodes[n]; // Determine which cluster this node belongs to: node id => cluster # - + node = nodes[n]; + // Determine which cluster this node belongs to: node id => cluster # assignment[node.id()] = classify(node, medoids, opts.distance, opts.attributes, 'kMedoids'); } - - isStillMoving = false; // Step 3: For each medoid m, and for each node associated with mediod m, + isStillMoving = false; + // Step 3: For each medoid m, and for each node associated with mediod m, // select the node with the lowest configuration cost as new medoid. - for (var m = 0; m < medoids.length; m++) { // Get all nodes that belong to this medoid var cluster = buildCluster(m, nodes, assignment); - if (cluster.length === 0) { // If cluster is empty, break out early & move to next cluster continue; } - minCosts[m] = findCost(medoids[m], cluster, opts.attributes); // original cost - // Select different medoid if its configuration has the lowest cost + // Select different medoid if its configuration has the lowest cost for (var _n = 0; _n < cluster.length; _n++) { curCost = findCost(cluster[_n], cluster, opts.attributes); - if (curCost < minCosts[m]) { minCosts[m] = curCost; medoids[m] = cluster[_n]; isStillMoving = true; } } - clusters[m] = cy.collection(cluster); } - iterations++; } - return clusters; }; - var updateCentroids = function updateCentroids(centroids, nodes, U, weight, opts) { var numerator, denominator; - for (var n = 0; n < nodes.length; n++) { for (var c = 0; c < centroids.length; c++) { weight[n][c] = Math.pow(U[n][c], opts.m); } } - for (var _c = 0; _c < centroids.length; _c++) { for (var dim = 0; dim < opts.attributes.length; dim++) { numerator = 0; denominator = 0; - for (var _n2 = 0; _n2 < nodes.length; _n2++) { numerator += weight[_n2][_c] * opts.attributes[dim](nodes[_n2]); denominator += weight[_n2][_c]; } - centroids[_c][dim] = numerator / denominator; } } }; - var updateMembership = function updateMembership(U, _U, centroids, nodes, opts) { // Save previous step for (var i = 0; i < U.length; i++) { _U[i] = U[i].slice(); } - var sum, numerator, denominator; var pow = 2 / (opts.m - 1); - for (var c = 0; c < centroids.length; c++) { for (var n = 0; n < nodes.length; n++) { sum = 0; - for (var k = 0; k < centroids.length; k++) { // against all other centroids numerator = getDist(opts.distance, nodes[n], centroids[c], opts.attributes, 'cmeans'); denominator = getDist(opts.distance, nodes[n], centroids[k], opts.attributes, 'cmeans'); sum += Math.pow(numerator / denominator, pow); } - U[n][c] = 1 / sum; } } }; - var assign$1 = function assign(nodes, U, opts, cy) { var clusters = new Array(opts.k); - for (var c = 0; c < clusters.length; c++) { clusters[c] = []; } - var max; var index; - for (var n = 0; n < U.length; n++) { // for each node (U is N x C matrix) max = -Infinity; - index = -1; // Determine which cluster the node is most likely to belong in - + index = -1; + // Determine which cluster the node is most likely to belong in for (var _c2 = 0; _c2 < U[0].length; _c2++) { if (U[n][_c2] > max) { max = U[n][_c2]; index = _c2; } } - clusters[index].push(nodes[n]); - } // Turn every array into a collection of nodes - + } + // Turn every array into a collection of nodes for (var _c3 = 0; _c3 < clusters.length; _c3++) { clusters[_c3] = cy.collection(clusters[_c3]); } - return clusters; }; - var fuzzyCMeans = function fuzzyCMeans(options) { var cy = this.cy(); var nodes = this.nodes(); - var opts = setOptions$2(options); // Begin fuzzy c-means algorithm + var opts = setOptions$2(options); + // Begin fuzzy c-means algorithm var clusters; var centroids; var U; - var _U; + var weight; - var weight; // Step 1: Initialize letiables. - + // Step 1: Initialize letiables. _U = new Array(nodes.length); - for (var i = 0; i < nodes.length; i++) { // N x C matrix _U[i] = new Array(opts.k); } - U = new Array(nodes.length); - for (var _i3 = 0; _i3 < nodes.length; _i3++) { // N x C matrix U[_i3] = new Array(opts.k); } - for (var _i4 = 0; _i4 < nodes.length; _i4++) { var total = 0; - for (var j = 0; j < opts.k; j++) { U[_i4][j] = Math.random(); total += U[_i4][j]; } - for (var _j = 0; _j < opts.k; _j++) { U[_i4][_j] = U[_i4][_j] / total; } } - centroids = new Array(opts.k); - for (var _i5 = 0; _i5 < opts.k; _i5++) { centroids[_i5] = new Array(opts.attributes.length); } - weight = new Array(nodes.length); - for (var _i6 = 0; _i6 < nodes.length; _i6++) { // N x C matrix weight[_i6] = new Array(opts.k); - } // end init FCM - + } + // end init FCM var isStillMoving = true; var iterations = 0; - while (isStillMoving && iterations < opts.maxIterations) { - isStillMoving = false; // Step 2: Calculate the centroids for each step. + isStillMoving = false; - updateCentroids(centroids, nodes, U, weight, opts); // Step 3: Update the partition matrix U. + // Step 2: Calculate the centroids for each step. + updateCentroids(centroids, nodes, U, weight, opts); - updateMembership(U, _U, centroids, nodes, opts); // Step 4: Check for convergence. + // Step 3: Update the partition matrix U. + updateMembership(U, _U, centroids, nodes, opts); + // Step 4: Check for convergence. if (!haveMatricesConverged(U, _U, opts.sensitivityThreshold)) { isStillMoving = true; } - iterations++; - } // Assign nodes to clusters with highest probability. - + } + // Assign nodes to clusters with highest probability. clusters = assign$1(nodes, U, opts, cy); return { clusters: clusters, degreeOfMembership: U }; }; - var kClustering = { kMeans: kMeans, kMedoids: kMedoids, @@ -25696,31 +25713,26 @@ var defaults$a = defaults$g({ dendrogramDepth: 0, // depth at which dendrogram branches are merged into the returned clusters attributes: [] // array of attr functions - }); + var linkageAliases = { 'single': 'min', 'complete': 'max' }; - var setOptions$1 = function setOptions(options) { var opts = defaults$a(options); var preferredAlias = linkageAliases[opts.linkage]; - if (preferredAlias != null) { opts.linkage = preferredAlias; } - return opts; }; - var mergeClosest = function mergeClosest(clusters, index, dists, mins, opts) { // Find two closest clusters from cached mins var minKey = 0; var min = Infinity; var dist; var attrs = opts.attributes; - var getDist = function getDist(n1, n2) { return clusteringDistance(opts.distance, attrs.length, function (i) { return attrs[i](n1); @@ -25728,25 +25740,22 @@ var mergeClosest = function mergeClosest(clusters, index, dists, mins, opts) { return attrs[i](n2); }, n1, n2); }; - for (var i = 0; i < clusters.length; i++) { var key = clusters[i].key; var _dist = dists[key][mins[key]]; - if (_dist < min) { minKey = key; min = _dist; } } - if (opts.mode === 'threshold' && min >= opts.threshold || opts.mode === 'dendrogram' && clusters.length === 1) { return false; } - var c1 = index[minKey]; var c2 = index[mins[minKey]]; - var merged; // Merge two closest clusters + var merged; + // Merge two closest clusters if (opts.mode === 'dendrogram') { merged = { left: c1, @@ -25759,25 +25768,22 @@ var mergeClosest = function mergeClosest(clusters, index, dists, mins, opts) { key: c1.key }; } - clusters[c1.index] = merged; clusters.splice(c2.index, 1); - index[c1.key] = merged; // Update distances with new merged cluster + index[c1.key] = merged; + // Update distances with new merged cluster for (var _i = 0; _i < clusters.length; _i++) { var cur = clusters[_i]; - if (c1.key === cur.key) { dist = Infinity; } else if (opts.linkage === 'min') { dist = dists[c1.key][cur.key]; - if (dists[c1.key][cur.key] > dists[c2.key][cur.key]) { dist = dists[c2.key][cur.key]; } } else if (opts.linkage === 'max') { dist = dists[c1.key][cur.key]; - if (dists[c1.key][cur.key] < dists[c2.key][cur.key]) { dist = dists[c2.key][cur.key]; } @@ -25786,39 +25792,31 @@ var mergeClosest = function mergeClosest(clusters, index, dists, mins, opts) { } else { if (opts.mode === 'dendrogram') dist = getDist(cur.value, c1.value);else dist = getDist(cur.value[0], c1.value[0]); } - dists[c1.key][cur.key] = dists[cur.key][c1.key] = dist; // distance matrix is symmetric - } // Update cached mins - + } + // Update cached mins for (var _i2 = 0; _i2 < clusters.length; _i2++) { var key1 = clusters[_i2].key; - if (mins[key1] === c1.key || mins[key1] === c2.key) { var _min = key1; - for (var j = 0; j < clusters.length; j++) { var key2 = clusters[j].key; - if (dists[key1][key2] < dists[key1][_min]) { _min = key2; } } - mins[key1] = _min; } - clusters[_i2].index = _i2; - } // Clean up meta data used for clustering - + } + // Clean up meta data used for clustering c1.key = c2.key = c1.index = c2.index = null; return true; }; - var getAllChildren = function getAllChildren(root, arr, cy) { if (!root) return; - if (root.value) { arr.push(root.value); } else { @@ -25826,10 +25824,8 @@ var getAllChildren = function getAllChildren(root, arr, cy) { if (root.right) getAllChildren(root.right, arr); } }; - var buildDendrogram = function buildDendrogram(root, cy) { if (!root) return ''; - if (root.left && root.right) { var leftStr = buildDendrogram(root.left, cy); var rightStr = buildDendrogram(root.right, cy); @@ -25858,13 +25854,11 @@ var buildDendrogram = function buildDendrogram(root, cy) { return root.value.id(); } }; - var buildClustersFromTree = function buildClustersFromTree(root, k, cy) { if (!root) return []; var left = [], - right = [], - leaves = []; - + right = [], + leaves = []; if (k === 0) { // don't cut tree, simply return all nodes as 1 single cluster if (root.left) getAllChildren(root.left, left); @@ -25873,6 +25867,7 @@ var buildClustersFromTree = function buildClustersFromTree(root, k, cy) { return [cy.collection(leaves)]; } else if (k === 1) { // cut at root + if (root.value) { // leaf node return [cy.collection(root.value)]; @@ -25891,33 +25886,29 @@ var buildClustersFromTree = function buildClustersFromTree(root, k, cy) { } } }; -/* eslint-enable */ - var hierarchicalClustering = function hierarchicalClustering(options) { var cy = this.cy(); - var nodes = this.nodes(); // Set parameters of algorithm: linkage type, distance metric, etc. + var nodes = this.nodes(); + // Set parameters of algorithm: linkage type, distance metric, etc. var opts = setOptions$1(options); var attrs = opts.attributes; - var getDist = function getDist(n1, n2) { return clusteringDistance(opts.distance, attrs.length, function (i) { return attrs[i](n1); }, function (i) { return attrs[i](n2); }, n1, n2); - }; // Begin hierarchical algorithm - + }; + // Begin hierarchical algorithm var clusters = []; var dists = []; // distances between each pair of clusters - var mins = []; // closest cluster for each cluster - var index = []; // hash of all clusters by key - // In agglomerative (bottom-up) clustering, each node starts as its own cluster + // In agglomerative (bottom-up) clustering, each node starts as its own cluster for (var n = 0; n < nodes.length; n++) { var cluster = { value: opts.mode === 'dendrogram' ? nodes[n] : [nodes[n]], @@ -25928,45 +25919,42 @@ var hierarchicalClustering = function hierarchicalClustering(options) { index[n] = cluster; dists[n] = []; mins[n] = 0; - } // Calculate the distance between each pair of clusters - + } + // Calculate the distance between each pair of clusters for (var i = 0; i < clusters.length; i++) { for (var j = 0; j <= i; j++) { var dist = void 0; - if (opts.mode === 'dendrogram') { // modes store cluster values differently dist = i === j ? Infinity : getDist(clusters[i].value, clusters[j].value); } else { dist = i === j ? Infinity : getDist(clusters[i].value[0], clusters[j].value[0]); } - dists[i][j] = dist; dists[j][i] = dist; - if (dist < dists[i][mins[i]]) { mins[i] = j; // Cache mins: closest cluster to cluster i is cluster j } } - } // Find the closest pair of clusters and merge them into a single cluster. - // Update distances between new cluster and each of the old clusters, and loop until threshold reached. - + } + // Find the closest pair of clusters and merge them into a single cluster. + // Update distances between new cluster and each of the old clusters, and loop until threshold reached. var merged = mergeClosest(clusters, index, dists, mins, opts); - while (merged) { merged = mergeClosest(clusters, index, dists, mins, opts); } + var retClusters; - var retClusters; // Dendrogram mode builds the hierarchy and adds intermediary nodes + edges + // Dendrogram mode builds the hierarchy and adds intermediary nodes + edges // in addition to returning the clusters. - if (opts.mode === 'dendrogram') { retClusters = buildClustersFromTree(clusters[0], opts.dendrogramDepth, cy); if (opts.addDendrogram) buildDendrogram(clusters[0], cy); } else { // Regular mode simply returns the clusters + retClusters = new Array(clusters.length); clusters.forEach(function (cluster, i) { // Clean up meta data used for clustering @@ -25974,10 +25962,8 @@ var hierarchicalClustering = function hierarchicalClustering(options) { retClusters[i] = cy.collection(cluster.value); }); } - return retClusters; }; - var hierarchicalClustering$1 = { hierarchicalClustering: hierarchicalClustering, hca: hierarchicalClustering @@ -25999,17 +25985,13 @@ var defaults$9 = defaults$g({ // e.g. node => node.data('weight') ] }); - var setOptions = function setOptions(options) { var dmp = options.damping; var pref = options.preference; - if (!(0.5 <= dmp && dmp < 1)) { error("Damping must range on [0.5, 1). Got: ".concat(dmp)); } - var validPrefs = ['median', 'mean', 'min', 'max']; - if (!(validPrefs.some(function (v) { return v === pref; }) || number$1(pref))) { @@ -26017,29 +25999,24 @@ var setOptions = function setOptions(options) { return "'".concat(p, "'"); }).join(', '), "] or a number. Got: ").concat(pref)); } - return defaults$9(options); }; -/* eslint-enable */ - var getSimilarity = function getSimilarity(type, n1, n2, attributes) { var attr = function attr(n, i) { return attributes[i](n); - }; // nb negative because similarity should have an inverse relationship to distance - + }; + // nb negative because similarity should have an inverse relationship to distance return -clusteringDistance(type, attributes.length, function (i) { return attr(n1, i); }, function (i) { return attr(n2, i); }, n1, n2); }; - var getPreference = function getPreference(S, preference) { // larger preference = greater # of clusters var p = null; - if (preference === 'median') { p = median(S); } else if (preference === 'mean') { @@ -26052,114 +26029,89 @@ var getPreference = function getPreference(S, preference) { // Custom preference number, as set by user p = preference; } - return p; }; - var findExemplars = function findExemplars(n, R, A) { var indices = []; - for (var i = 0; i < n; i++) { if (R[i * n + i] + A[i * n + i] > 0) { indices.push(i); } } - return indices; }; - var assignClusters = function assignClusters(n, S, exemplars) { var clusters = []; - for (var i = 0; i < n; i++) { var index = -1; var max = -Infinity; - for (var ei = 0; ei < exemplars.length; ei++) { var e = exemplars[ei]; - if (S[i * n + e] > max) { index = e; max = S[i * n + e]; } } - if (index > 0) { clusters.push(index); } } - for (var _ei = 0; _ei < exemplars.length; _ei++) { clusters[exemplars[_ei]] = exemplars[_ei]; } - return clusters; }; - var assign = function assign(n, S, exemplars) { var clusters = assignClusters(n, S, exemplars); - for (var ei = 0; ei < exemplars.length; ei++) { var ii = []; - for (var c = 0; c < clusters.length; c++) { if (clusters[c] === exemplars[ei]) { ii.push(c); } } - var maxI = -1; var maxSum = -Infinity; - for (var i = 0; i < ii.length; i++) { var sum = 0; - for (var j = 0; j < ii.length; j++) { sum += S[ii[j] * n + ii[i]]; } - if (sum > maxSum) { maxI = i; maxSum = sum; } } - exemplars[ei] = ii[maxI]; } - clusters = assignClusters(n, S, exemplars); return clusters; }; - var affinityPropagation = function affinityPropagation(options) { var cy = this.cy(); var nodes = this.nodes(); - var opts = setOptions(options); // Map each node to its position in node array + var opts = setOptions(options); + // Map each node to its position in node array var id2position = {}; - for (var i = 0; i < nodes.length; i++) { id2position[nodes[i].id()] = i; - } // Begin affinity propagation algorithm + } + // Begin affinity propagation algorithm var n; // number of data points - var n2; // size of matrices - var S; // similarity matrix (1D array) - var p; // preference/suitability of a data point to serve as an exemplar - var R; // responsibility matrix (1D array) - var A; // availability matrix (1D array) n = nodes.length; - n2 = n * n; // Initialize and build S similarity matrix + n2 = n * n; + // Initialize and build S similarity matrix S = new Array(n2); - for (var _i = 0; _i < n2; _i++) { S[_i] = -Infinity; // for cases where two data points shouldn't be linked together } @@ -26170,60 +26122,50 @@ var affinityPropagation = function affinityPropagation(options) { S[_i2 * n + j] = getSimilarity(opts.distance, nodes[_i2], nodes[j], opts.attributes); } } - } // Place preferences on the diagonal of S - + } + // Place preferences on the diagonal of S p = getPreference(S, opts.preference); - for (var _i3 = 0; _i3 < n; _i3++) { S[_i3 * n + _i3] = p; - } // Initialize R responsibility matrix - + } + // Initialize R responsibility matrix R = new Array(n2); - for (var _i4 = 0; _i4 < n2; _i4++) { R[_i4] = 0.0; - } // Initialize A availability matrix - + } + // Initialize A availability matrix A = new Array(n2); - for (var _i5 = 0; _i5 < n2; _i5++) { A[_i5] = 0.0; } - var old = new Array(n); var Rp = new Array(n); var se = new Array(n); - for (var _i6 = 0; _i6 < n; _i6++) { old[_i6] = 0.0; Rp[_i6] = 0.0; se[_i6] = 0; } - var e = new Array(n * opts.minIterations); - for (var _i7 = 0; _i7 < e.length; _i7++) { e[_i7] = 0; } - var iter; - for (iter = 0; iter < opts.maxIterations; iter++) { // main algorithmic loop + // Update R responsibility matrix for (var _i8 = 0; _i8 < n; _i8++) { var max = -Infinity, - max2 = -Infinity, - maxI = -1, - AS = 0.0; - + max2 = -Infinity, + maxI = -1, + AS = 0.0; for (var _j = 0; _j < n; _j++) { old[_j] = R[_i8 * n + _j]; AS = A[_i8 * n + _j] + S[_i8 * n + _j]; - if (AS >= max) { max2 = max; max = AS; @@ -26232,96 +26174,77 @@ var affinityPropagation = function affinityPropagation(options) { max2 = AS; } } - for (var _j2 = 0; _j2 < n; _j2++) { R[_i8 * n + _j2] = (1 - opts.damping) * (S[_i8 * n + _j2] - max) + opts.damping * old[_j2]; } - R[_i8 * n + maxI] = (1 - opts.damping) * (S[_i8 * n + maxI] - max2) + opts.damping * old[maxI]; - } // Update A availability matrix - + } + // Update A availability matrix for (var _i9 = 0; _i9 < n; _i9++) { var sum = 0; - for (var _j3 = 0; _j3 < n; _j3++) { old[_j3] = A[_j3 * n + _i9]; Rp[_j3] = Math.max(0, R[_j3 * n + _i9]); sum += Rp[_j3]; } - sum -= Rp[_i9]; Rp[_i9] = R[_i9 * n + _i9]; sum += Rp[_i9]; - for (var _j4 = 0; _j4 < n; _j4++) { A[_j4 * n + _i9] = (1 - opts.damping) * Math.min(0, sum - Rp[_j4]) + opts.damping * old[_j4]; } - A[_i9 * n + _i9] = (1 - opts.damping) * (sum - Rp[_i9]) + opts.damping * old[_i9]; - } // Check for convergence - + } + // Check for convergence var K = 0; - for (var _i10 = 0; _i10 < n; _i10++) { var E = A[_i10 * n + _i10] + R[_i10 * n + _i10] > 0 ? 1 : 0; e[iter % opts.minIterations * n + _i10] = E; K += E; } - if (K > 0 && (iter >= opts.minIterations - 1 || iter == opts.maxIterations - 1)) { var _sum = 0; - for (var _i11 = 0; _i11 < n; _i11++) { se[_i11] = 0; - for (var _j5 = 0; _j5 < opts.minIterations; _j5++) { se[_i11] += e[_j5 * n + _i11]; } - if (se[_i11] === 0 || se[_i11] === opts.minIterations) { _sum++; } } - if (_sum === n) { // then we have convergence break; } } - } // Identify exemplars (cluster centers) - + } - var exemplarsIndices = findExemplars(n, R, A); // Assign nodes to clusters + // Identify exemplars (cluster centers) + var exemplarsIndices = findExemplars(n, R, A); + // Assign nodes to clusters var clusterIndices = assign(n, S, exemplarsIndices); var clusters = {}; - for (var c = 0; c < exemplarsIndices.length; c++) { clusters[exemplarsIndices[c]] = []; } - for (var _i12 = 0; _i12 < nodes.length; _i12++) { var pos = id2position[nodes[_i12].id()]; - var clusterIndex = clusterIndices[pos]; - if (clusterIndex != null) { // the node may have not been assigned a cluster if no valid attributes were specified clusters[clusterIndex].push(nodes[_i12]); } } - var retClusters = new Array(exemplarsIndices.length); - for (var _c = 0; _c < exemplarsIndices.length; _c++) { retClusters[_c] = cy.collection(clusters[exemplarsIndices[_c]]); } - return retClusters; }; - var affinityPropagation$1 = { affinityPropagation: affinityPropagation, ap: affinityPropagation @@ -26340,11 +26263,9 @@ var elesfn$k = { directed: args[1] }; } - var _hierholzerDefaults = hierholzerDefaults(options), - root = _hierholzerDefaults.root, - directed = _hierholzerDefaults.directed; - + root = _hierholzerDefaults.root, + directed = _hierholzerDefaults.directed; var eles = this; var dflag = false; var oddIn; @@ -26353,17 +26274,14 @@ var elesfn$k = { if (root) startVertex = string(root) ? this.filter(root)[0].id() : root[0].id(); var nodes = {}; var edges = {}; - if (directed) { eles.forEach(function (ele) { var id = ele.id(); - if (ele.isNode()) { var ind = ele.indegree(true); var outd = ele.outdegree(true); var d1 = ind - outd; var d2 = outd - ind; - if (d1 == 1) { if (oddIn) dflag = true;else oddIn = id; } else if (d2 == 1) { @@ -26371,7 +26289,6 @@ var elesfn$k = { } else if (d2 > 1 || d1 > 1) { dflag = true; } - nodes[id] = []; ele.outgoers().forEach(function (e) { if (e.isEdge()) nodes[id].push(e.id()); @@ -26383,14 +26300,11 @@ var elesfn$k = { } else { eles.forEach(function (ele) { var id = ele.id(); - if (ele.isNode()) { var d = ele.degree(true); - if (d % 2) { if (!oddIn) oddIn = id;else if (!oddOut) oddOut = id;else dflag = true; } - nodes[id] = []; ele.connectedEdges().forEach(function (e) { return nodes[id].push(e.id()); @@ -26400,7 +26314,6 @@ var elesfn$k = { } }); } - var result = { found: false, trail: undefined @@ -26410,7 +26323,6 @@ var elesfn$k = { if (startVertex && oddOut != startVertex) { return result; } - startVertex = oddOut; } else { if (startVertex && oddOut != startVertex && oddIn != startVertex) { @@ -26422,17 +26334,14 @@ var elesfn$k = { } else { if (!startVertex) startVertex = eles[0].id(); } - var walk = function walk(v) { var currentNode = v; var subtour = [v]; var adj, adjTail, adjHead; - while (nodes[currentNode].length) { adj = nodes[currentNode].shift(); adjTail = edges[adj][0]; adjHead = edges[adj][1]; - if (currentNode != adjHead) { nodes[adjHead] = nodes[adjHead].filter(function (e) { return e != adj; @@ -26444,18 +26353,14 @@ var elesfn$k = { }); currentNode = adjTail; } - subtour.unshift(adj); subtour.unshift(currentNode); } - return subtour; }; - var trail = []; var subtour = []; subtour = walk(startVertex); - while (subtour.length != 1) { if (nodes[subtour[0]].length == 0) { trail.unshift(eles.getElementById(subtour.shift())); @@ -26464,7 +26369,6 @@ var elesfn$k = { subtour = walk(subtour.shift()).concat(subtour); } } - trail.unshift(eles.getElementById(subtour.shift())); // final node for (var d in nodes) { @@ -26472,7 +26376,6 @@ var elesfn$k = { return result; } } - result.found = true; result.trail = this.spawn(trail, true); return result; @@ -26487,17 +26390,14 @@ var hopcroftTarjanBiconnected = function hopcroftTarjanBiconnected() { var components = []; var stack = []; var visitedEdges = {}; - var buildComponent = function buildComponent(x, y) { var i = stack.length - 1; var cutset = []; var component = eles.spawn(); - while (stack[i].x != x || stack[i].y != y) { cutset.push(stack.pop().edge); i--; } - cutset.push(stack.pop().edge); cutset.forEach(function (edge) { var connectedNodes = edge.connectedNodes().intersection(eles); @@ -26506,7 +26406,6 @@ var hopcroftTarjanBiconnected = function hopcroftTarjanBiconnected() { var nodeId = node.id(); var connectedEdges = node.connectedEdges().intersection(eles); component.merge(node); - if (!nodes[nodeId].cutVertex) { component.merge(connectedEdges); } else { @@ -26518,7 +26417,6 @@ var hopcroftTarjanBiconnected = function hopcroftTarjanBiconnected() { }); components.push(component); }; - var biconnectedSearch = function biconnectedSearch(root, currentNode, parent) { if (root === parent) edgeCount += 1; nodes[currentNode] = { @@ -26527,7 +26425,6 @@ var hopcroftTarjanBiconnected = function hopcroftTarjanBiconnected() { cutVertex: false }; var edges = eles.getElementById(currentNode).connectedEdges().intersection(eles); - if (edges.size() === 0) { components.push(eles.spawn(eles.getElementById(currentNode))); } else { @@ -26536,10 +26433,8 @@ var hopcroftTarjanBiconnected = function hopcroftTarjanBiconnected() { sourceId = edge.source().id(); targetId = edge.target().id(); otherNodeId = sourceId === currentNode ? targetId : sourceId; - if (otherNodeId !== parent) { edgeId = edge.id(); - if (!visitedEdges[edgeId]) { visitedEdges[edgeId] = true; stack.push({ @@ -26548,11 +26443,9 @@ var hopcroftTarjanBiconnected = function hopcroftTarjanBiconnected() { edge: edge }); } - if (!(otherNodeId in nodes)) { biconnectedSearch(root, otherNodeId, currentNode); nodes[currentNode].low = Math.min(nodes[currentNode].low, nodes[otherNodeId].low); - if (nodes[currentNode].id <= nodes[otherNodeId].low) { nodes[currentNode].cutVertex = true; buildComponent(currentNode, otherNodeId); @@ -26564,11 +26457,9 @@ var hopcroftTarjanBiconnected = function hopcroftTarjanBiconnected() { }); } }; - eles.forEach(function (ele) { if (ele.isNode()) { var nodeId = ele.id(); - if (!(nodeId in nodes)) { edgeCount = 0; biconnectedSearch(nodeId, nodeId); @@ -26586,7 +26477,6 @@ var hopcroftTarjanBiconnected = function hopcroftTarjanBiconnected() { components: components }; }; - var hopcroftTarjanBiconnected$1 = { hopcroftTarjanBiconnected: hopcroftTarjanBiconnected, htbc: hopcroftTarjanBiconnected, @@ -26601,7 +26491,6 @@ var tarjanStronglyConnected = function tarjanStronglyConnected() { var components = []; var stack = []; var cut = eles.spawn(eles); - var stronglyConnectedSearch = function stronglyConnectedSearch(sourceNodeId) { stack.push(sourceNodeId); nodes[sourceNodeId] = { @@ -26612,43 +26501,35 @@ var tarjanStronglyConnected = function tarjanStronglyConnected() { var connectedEdges = eles.getElementById(sourceNodeId).connectedEdges().intersection(eles); connectedEdges.forEach(function (edge) { var targetNodeId = edge.target().id(); - if (targetNodeId !== sourceNodeId) { if (!(targetNodeId in nodes)) { stronglyConnectedSearch(targetNodeId); } - if (!nodes[targetNodeId].explored) { nodes[sourceNodeId].low = Math.min(nodes[sourceNodeId].low, nodes[targetNodeId].low); } } }); - if (nodes[sourceNodeId].index === nodes[sourceNodeId].low) { var componentNodes = eles.spawn(); - for (;;) { var nodeId = stack.pop(); componentNodes.merge(eles.getElementById(nodeId)); nodes[nodeId].low = nodes[sourceNodeId].index; nodes[nodeId].explored = true; - if (nodeId === sourceNodeId) { break; } } - var componentEdges = componentNodes.edgesWith(componentNodes); var component = componentNodes.merge(componentEdges); components.push(component); cut = cut.difference(component); } }; - eles.forEach(function (ele) { if (ele.isNode()) { var nodeId = ele.id(); - if (!(nodeId in nodes)) { stronglyConnectedSearch(nodeId); } @@ -26659,7 +26540,6 @@ var tarjanStronglyConnected = function tarjanStronglyConnected() { components: components }; }; - var tarjanStronglyConnected$1 = { tarjanStronglyConnected: tarjanStronglyConnected, tsc: tarjanStronglyConnected, @@ -26679,54 +26559,33 @@ Licensed under The MIT License (http://opensource.org/licenses/MIT) */ /* promise states [Promises/A+ 2.1] */ -var STATE_PENDING = 0; -/* [Promises/A+ 2.1.1] */ - -var STATE_FULFILLED = 1; -/* [Promises/A+ 2.1.2] */ - -var STATE_REJECTED = 2; -/* [Promises/A+ 2.1.3] */ +var STATE_PENDING = 0; /* [Promises/A+ 2.1.1] */ +var STATE_FULFILLED = 1; /* [Promises/A+ 2.1.2] */ +var STATE_REJECTED = 2; /* [Promises/A+ 2.1.3] */ /* promise object constructor */ - var api = function api(executor) { /* optionally support non-constructor/plain-function call */ if (!(this instanceof api)) return new api(executor); - /* initialize object */ + /* initialize object */ this.id = 'Thenable/1.0.7'; - this.state = STATE_PENDING; - /* initial state */ - - this.fulfillValue = undefined; - /* initial value */ - - /* [Promises/A+ 1.3, 2.1.2.2] */ - - this.rejectReason = undefined; - /* initial reason */ - - /* [Promises/A+ 1.5, 2.1.3.2] */ - - this.onFulfilled = []; - /* initial handlers */ - - this.onRejected = []; - /* initial handlers */ + this.state = STATE_PENDING; /* initial state */ + this.fulfillValue = undefined; /* initial value */ /* [Promises/A+ 1.3, 2.1.2.2] */ + this.rejectReason = undefined; /* initial reason */ /* [Promises/A+ 1.5, 2.1.3.2] */ + this.onFulfilled = []; /* initial handlers */ + this.onRejected = []; /* initial handlers */ /* provide optional information-hiding proxy */ - this.proxy = { then: this.then.bind(this) }; - /* support optional executor function */ + /* support optional executor function */ if (typeof executor === 'function') executor.call(this, this.fulfill.bind(this), this.reject.bind(this)); }; -/* promise API methods */ - +/* promise API methods */ api.prototype = { /* promise resolving methods */ fulfill: function fulfill(value) { @@ -26735,204 +26594,136 @@ api.prototype = { reject: function reject(value) { return deliver(this, STATE_REJECTED, 'rejectReason', value); }, - /* "The then Method" [Promises/A+ 1.1, 1.2, 2.2] */ then: function then(onFulfilled, onRejected) { var curr = this; - var next = new api(); - /* [Promises/A+ 2.2.7] */ - - curr.onFulfilled.push(resolver(onFulfilled, next, 'fulfill')); - /* [Promises/A+ 2.2.2/2.2.6] */ - - curr.onRejected.push(resolver(onRejected, next, 'reject')); - /* [Promises/A+ 2.2.3/2.2.6] */ - + var next = new api(); /* [Promises/A+ 2.2.7] */ + curr.onFulfilled.push(resolver(onFulfilled, next, 'fulfill')); /* [Promises/A+ 2.2.2/2.2.6] */ + curr.onRejected.push(resolver(onRejected, next, 'reject')); /* [Promises/A+ 2.2.3/2.2.6] */ execute(curr); - return next.proxy; - /* [Promises/A+ 2.2.7, 3.3] */ + return next.proxy; /* [Promises/A+ 2.2.7, 3.3] */ } }; -/* deliver an action */ +/* deliver an action */ var deliver = function deliver(curr, state, name, value) { if (curr.state === STATE_PENDING) { - curr.state = state; - /* [Promises/A+ 2.1.2.1, 2.1.3.1] */ - - curr[name] = value; - /* [Promises/A+ 2.1.2.2, 2.1.3.2] */ - + curr.state = state; /* [Promises/A+ 2.1.2.1, 2.1.3.1] */ + curr[name] = value; /* [Promises/A+ 2.1.2.2, 2.1.3.2] */ execute(curr); } - return curr; }; -/* execute all handlers */ - +/* execute all handlers */ var execute = function execute(curr) { if (curr.state === STATE_FULFILLED) execute_handlers(curr, 'onFulfilled', curr.fulfillValue);else if (curr.state === STATE_REJECTED) execute_handlers(curr, 'onRejected', curr.rejectReason); }; -/* execute particular set of handlers */ - +/* execute particular set of handlers */ var execute_handlers = function execute_handlers(curr, name, value) { /* global setImmediate: true */ - /* global setTimeout: true */ /* short-circuit processing */ if (curr[name].length === 0) return; - /* iterate over all handlers, exactly once */ + /* iterate over all handlers, exactly once */ var handlers = curr[name]; - curr[name] = []; - /* [Promises/A+ 2.2.2.3, 2.2.3.3] */ - + curr[name] = []; /* [Promises/A+ 2.2.2.3, 2.2.3.3] */ var func = function func() { for (var i = 0; i < handlers.length; i++) { handlers[i](value); - } - /* [Promises/A+ 2.2.5] */ - + } /* [Promises/A+ 2.2.5] */ }; - /* execute procedure asynchronously */ - - /* [Promises/A+ 2.2.4, 3.1] */ - + /* execute procedure asynchronously */ /* [Promises/A+ 2.2.4, 3.1] */ if (typeof setImmediate === 'function') setImmediate(func);else setTimeout(func, 0); }; -/* generate a resolver function */ - +/* generate a resolver function */ var resolver = function resolver(cb, next, method) { return function (value) { - if (typeof cb !== 'function') - /* [Promises/A+ 2.2.1, 2.2.7.3, 2.2.7.4] */ - next[method].call(next, value); - /* [Promises/A+ 2.2.7.3, 2.2.7.4] */ - else { + if (typeof cb !== 'function') /* [Promises/A+ 2.2.1, 2.2.7.3, 2.2.7.4] */ + next[method].call(next, value); /* [Promises/A+ 2.2.7.3, 2.2.7.4] */else { var result; - try { result = cb(value); - } - /* [Promises/A+ 2.2.2.1, 2.2.3.1, 2.2.5, 3.2] */ - catch (e) { - next.reject(e); - /* [Promises/A+ 2.2.7.2] */ - + } /* [Promises/A+ 2.2.2.1, 2.2.3.1, 2.2.5, 3.2] */ catch (e) { + next.reject(e); /* [Promises/A+ 2.2.7.2] */ return; } - - resolve(next, result); - /* [Promises/A+ 2.2.7.1] */ + resolve(next, result); /* [Promises/A+ 2.2.7.1] */ } }; }; -/* "Promise Resolution Procedure" */ - -/* [Promises/A+ 2.3] */ - +/* "Promise Resolution Procedure" */ /* [Promises/A+ 2.3] */ var resolve = function resolve(promise, x) { - /* sanity check arguments */ - - /* [Promises/A+ 2.3.1] */ + /* sanity check arguments */ /* [Promises/A+ 2.3.1] */ if (promise === x || promise.proxy === x) { promise.reject(new TypeError('cannot resolve promise with itself')); return; } + /* surgically check for a "then" method (mainly to just call the "getter" of "then" only once) */ - - var then; - if (_typeof(x) === 'object' && x !== null || typeof x === 'function') { try { then = x.then; - } - /* [Promises/A+ 2.3.3.1, 3.5] */ - catch (e) { - promise.reject(e); - /* [Promises/A+ 2.3.3.2] */ - + } /* [Promises/A+ 2.3.3.1, 3.5] */ catch (e) { + promise.reject(e); /* [Promises/A+ 2.3.3.2] */ return; } } + /* handle own Thenables [Promises/A+ 2.3.2] and similar "thenables" [Promises/A+ 2.3.3] */ - - if (typeof then === 'function') { var resolved = false; - try { - /* call retrieved "then" method */ - - /* [Promises/A+ 2.3.3.3] */ - then.call(x, - /* resolvePromise */ - - /* [Promises/A+ 2.3.3.3.1] */ + /* call retrieved "then" method */ /* [Promises/A+ 2.3.3.3] */ + then.call(x, /* resolvePromise */ /* [Promises/A+ 2.3.3.3.1] */ function (y) { if (resolved) return; - resolved = true; - /* [Promises/A+ 2.3.3.3.3] */ - - if (y === x) - /* [Promises/A+ 3.6] */ + resolved = true; /* [Promises/A+ 2.3.3.3.3] */ + if (y === x) /* [Promises/A+ 3.6] */ promise.reject(new TypeError('circular thenable chain'));else resolve(promise, y); - }, - /* rejectPromise */ - - /* [Promises/A+ 2.3.3.3.2] */ + }, /* rejectPromise */ /* [Promises/A+ 2.3.3.3.2] */ function (r) { if (resolved) return; - resolved = true; - /* [Promises/A+ 2.3.3.3.3] */ - + resolved = true; /* [Promises/A+ 2.3.3.3.3] */ promise.reject(r); }); } catch (e) { - if (!resolved) - /* [Promises/A+ 2.3.3.3.3] */ - promise.reject(e); - /* [Promises/A+ 2.3.3.3.4] */ + if (!resolved) /* [Promises/A+ 2.3.3.3.3] */ + promise.reject(e); /* [Promises/A+ 2.3.3.3.4] */ } return; } - /* handle other values */ - - - promise.fulfill(x); - /* [Promises/A+ 2.3.4, 2.3.3.4] */ -}; // so we always have Promise.all() + /* handle other values */ + promise.fulfill(x); /* [Promises/A+ 2.3.4, 2.3.3.4] */ +}; +// so we always have Promise.all() api.all = function (ps) { return new api(function (resolveAll, rejectAll) { var vals = new Array(ps.length); var doneCount = 0; - var fulfill = function fulfill(i, val) { vals[i] = val; doneCount++; - if (doneCount === ps.length) { resolveAll(vals); } }; - for (var i = 0; i < ps.length; i++) { (function (i) { var p = ps[i]; var isPromise = p != null && p.then != null; - if (isPromise) { p.then(function (val) { fulfill(i, val); @@ -26947,29 +26738,24 @@ api.all = function (ps) { } }); }; - api.resolve = function (val) { return new api(function (resolve, reject) { resolve(val); }); }; - api.reject = function (val) { return new api(function (resolve, reject) { reject(val); }); }; - var Promise$1 = typeof Promise !== 'undefined' ? Promise : api; // eslint-disable-line no-undef var Animation = function Animation(target, opts, opts2) { var isCore = core(target); var isEle = !isCore; - var _p = this._private = extend({ duration: 1000 }, opts, opts2); - _p.target = target; _p.style = _p.style || _p.css; _p.started = false; @@ -26979,11 +26765,9 @@ var Animation = function Animation(target, opts, opts2) { _p.progress = 0; _p.completes = []; _p.frames = []; - if (_p.complete && fn$6(_p.complete)) { _p.completes.push(_p.complete); } - if (isEle) { var pos = target.position(); _p.startPosition = _p.startPosition || { @@ -26992,7 +26776,6 @@ var Animation = function Animation(target, opts, opts2) { }; _p.startStyle = _p.startStyle || target.cy().style().getAnimationStartStyle(target, _p.style); } - if (isCore) { var pan = target.pan(); _p.startPan = { @@ -27000,13 +26783,12 @@ var Animation = function Animation(target, opts, opts2) { y: pan.y }; _p.startZoom = target.zoom(); - } // for future timeline/animations impl - + } + // for future timeline/animations impl this.length = 1; this[0] = this; }; - var anifn = Animation.prototype; extend(anifn, { instanceString: function instanceString() { @@ -27014,41 +26796,38 @@ extend(anifn, { }, hook: function hook() { var _p = this._private; - if (!_p.hooked) { // add to target's animation queue var q; var tAni = _p.target._private.animation; - if (_p.queue) { q = tAni.queue; } else { q = tAni.current; } + q.push(this); - q.push(this); // add to the animation loop pool - + // add to the animation loop pool if (elementOrCollection(_p.target)) { _p.target.cy().addToAnimationPool(_p.target); } - _p.hooked = true; } - return this; }, play: function play() { - var _p = this._private; // autorewind + var _p = this._private; + // autorewind if (_p.progress === 1) { _p.progress = 0; } - _p.playing = true; _p.started = false; // needs to be started by animation loop - _p.stopped = false; - this.hook(); // the animation loop will start the animation... + this.hook(); + + // the animation loop will start the animation... return this; }, @@ -27059,9 +26838,10 @@ extend(anifn, { var _p = this._private; _p.applying = true; _p.started = false; // needs to be started by animation loop - _p.stopped = false; - this.hook(); // the animation loop will apply the animation at this progress + this.hook(); + + // the animation loop will apply the animation at this progress return this; }, @@ -27090,7 +26870,6 @@ extend(anifn, { }, time: function time(t) { var _p = this._private; - if (t === undefined) { return _p.progress * _p.duration; } else { @@ -27100,22 +26879,18 @@ extend(anifn, { progress: function progress(p) { var _p = this._private; var wasPlaying = _p.playing; - if (p === undefined) { return _p.progress; } else { if (wasPlaying) { this.pause(); } - _p.progress = p; _p.started = false; - if (wasPlaying) { this.play(); } } - return this; }, completed: function completed() { @@ -27124,29 +26899,24 @@ extend(anifn, { reverse: function reverse() { var _p = this._private; var wasPlaying = _p.playing; - if (wasPlaying) { this.pause(); } - _p.progress = 1 - _p.progress; _p.started = false; - var swap = function swap(a, b) { var _pa = _p[a]; - if (_pa == null) { return; } - _p[a] = _p[b]; _p[b] = _pa; }; - swap('zoom', 'startZoom'); swap('pan', 'startPan'); - swap('position', 'startPosition'); // swap styles + swap('position', 'startPosition'); + // swap styles if (_p.style) { for (var i = 0; i < _p.style.length; i++) { var prop = _p.style[i]; @@ -27156,28 +26926,23 @@ extend(anifn, { _p.style[i] = startStyleProp; } } - if (wasPlaying) { this.play(); } - return this; }, promise: function promise(type) { var _p = this._private; var arr; - switch (type) { case 'frame': arr = _p.frames; break; - default: case 'complete': case 'completed': arr = _p.completes; } - return new Promise$1(function (resolve, reject) { arr.push(function () { resolve(); @@ -27195,50 +26960,42 @@ var define$3 = { var self = this; var selfIsArrayLike = self.length !== undefined; var all = selfIsArrayLike ? self : [self]; // put in array if not array-like - var cy = this._private.cy || this; - if (!cy.styleEnabled()) { return false; } - var ele = all[0]; - if (ele) { return ele._private.animation.current.length > 0; } }; }, // animated + clearQueue: function clearQueue() { return function clearQueueImpl() { var self = this; var selfIsArrayLike = self.length !== undefined; var all = selfIsArrayLike ? self : [self]; // put in array if not array-like - var cy = this._private.cy || this; - if (!cy.styleEnabled()) { return this; } - for (var i = 0; i < all.length; i++) { var ele = all[i]; ele._private.animation.queue = []; } - return this; }; }, // clearQueue + delay: function delay() { return function delayImpl(time, complete) { var cy = this._private.cy || this; - if (!cy.styleEnabled()) { return this; } - return this.animate({ delay: time, duration: time, @@ -27247,14 +27004,13 @@ var define$3 = { }; }, // delay + delayAnimation: function delayAnimation() { return function delayAnimationImpl(time, complete) { var cy = this._private.cy || this; - if (!cy.styleEnabled()) { return this; } - return this.animation({ delay: time, duration: time, @@ -27263,24 +27019,21 @@ var define$3 = { }; }, // delay + animation: function animation() { return function animationImpl(properties, params) { var self = this; var selfIsArrayLike = self.length !== undefined; var all = selfIsArrayLike ? self : [self]; // put in array if not array-like - var cy = this._private.cy || this; var isCore = !selfIsArrayLike; var isEles = !isCore; - if (!cy.styleEnabled()) { return this; } - var style = cy.style(); properties = extend({}, properties, params); var propertiesEmpty = Object.keys(properties).length === 0; - if (propertiesEmpty) { return new Animation(all[0], properties); // nothing to animate } @@ -27288,30 +27041,26 @@ var define$3 = { if (properties.duration === undefined) { properties.duration = 400; } - switch (properties.duration) { case 'slow': properties.duration = 600; break; - case 'fast': properties.duration = 200; break; } - if (isEles) { properties.style = style.getPropsList(properties.style || properties.css); properties.css = undefined; } - if (isEles && properties.renderedPosition != null) { var rpos = properties.renderedPosition; var pan = cy.pan(); var zoom = cy.zoom(); properties.position = renderedToModelPosition(rpos, zoom, pan); - } // override pan w/ panBy if set - + } + // override pan w/ panBy if set if (isCore && properties.panBy != null) { var panBy = properties.panBy; var cyPan = cy.pan(); @@ -27319,39 +27068,34 @@ var define$3 = { x: cyPan.x + panBy.x, y: cyPan.y + panBy.y }; - } // override pan w/ center if set - + } + // override pan w/ center if set var center = properties.center || properties.centre; - if (isCore && center != null) { var centerPan = cy.getCenterPan(center.eles, properties.zoom); - if (centerPan != null) { properties.pan = centerPan; } - } // override pan & zoom w/ fit if set - + } + // override pan & zoom w/ fit if set if (isCore && properties.fit != null) { var fit = properties.fit; var fitVp = cy.getFitViewport(fit.eles || fit.boundingBox, fit.padding); - if (fitVp != null) { properties.pan = fitVp.pan; properties.zoom = fitVp.zoom; } - } // override zoom (& potentially pan) w/ zoom obj if set - + } + // override zoom (& potentially pan) w/ zoom obj if set if (isCore && plainObject(properties.zoom)) { var vp = cy.getZoomedViewport(properties.zoom); - if (vp != null) { if (vp.zoomed) { properties.zoom = vp.zoom; } - if (vp.panned) { properties.pan = vp.pan; } @@ -27364,23 +27108,21 @@ var define$3 = { }; }, // animate + animate: function animate() { return function animateImpl(properties, params) { var self = this; var selfIsArrayLike = self.length !== undefined; var all = selfIsArrayLike ? self : [self]; // put in array if not array-like - var cy = this._private.cy || this; - if (!cy.styleEnabled()) { return this; } - if (params) { properties = extend({}, properties, params); - } // manually hook and run the animation - + } + // manually hook and run the animation for (var i = 0; i < all.length; i++) { var ele = all[i]; var queue = ele.animated() && (properties.queue === undefined || properties.queue); @@ -27389,55 +27131,49 @@ var define$3 = { } : undefined); ani.play(); } - return this; // chaining }; }, + // animate + stop: function stop() { return function stopImpl(clearQueue, jumpToEnd) { var self = this; var selfIsArrayLike = self.length !== undefined; var all = selfIsArrayLike ? self : [self]; // put in array if not array-like - var cy = this._private.cy || this; - if (!cy.styleEnabled()) { return this; } - for (var i = 0; i < all.length; i++) { var ele = all[i]; var _p = ele._private; var anis = _p.animation.current; - for (var j = 0; j < anis.length; j++) { var ani = anis[j]; var ani_p = ani._private; - if (jumpToEnd) { // next iteration of the animation loop, the animation // will go straight to the end and be removed ani_p.duration = 0; } - } // clear the queue of future animations - + } + // clear the queue of future animations if (clearQueue) { _p.animation.queue = []; } - if (!jumpToEnd) { _p.animation.current = []; } - } // we have to notify (the animation loop doesn't do it for us on `stop`) - + } + // we have to notify (the animation loop doesn't do it for us on `stop`) cy.notify('draw'); return this; }; } // stop - }; // define var define$2 = { @@ -27468,42 +27204,40 @@ var define$2 = { var self = this; var selfIsArrayLike = self.length !== undefined; var all = selfIsArrayLike ? self : [self]; // put in array if not array-like + var single = selfIsArrayLike ? self[0] : self; - var single = selfIsArrayLike ? self[0] : self; // .data('foo', ...) - + // .data('foo', ...) if (string(name)) { // set or get property var isPathLike = name.indexOf('.') !== -1; // there might be a normal field with a dot + var path = isPathLike && toPath__default["default"](name); - var path = isPathLike && toPath__default["default"](name); // .data('foo') - + // .data('foo') if (p.allowGetting && value === undefined) { // get - var ret; + var ret; if (single) { - p.beforeGet(single); // check if it's path and a field with the same name doesn't exist + p.beforeGet(single); + // check if it's path and a field with the same name doesn't exist if (path && single._private[p.field][name] === undefined) { ret = get__default["default"](single._private[p.field], path); } else { ret = single._private[p.field][name]; } } + return ret; - return ret; // .data('foo', 'bar') + // .data('foo', 'bar') } else if (p.allowSetting && value !== undefined) { // set var valid = !p.immutableKeys[name]; - if (valid) { var change = _defineProperty({}, name, value); - p.beforeSet(self, change); - for (var i = 0, l = all.length; i < l; i++) { var ele = all[i]; - if (p.canSet(ele)) { if (path && single._private[p.field][name] === undefined) { set__default["default"](ele._private[p.field], path, value); @@ -27511,78 +27245,75 @@ var define$2 = { ele._private[p.field][name] = value; } } - } // update mappers if asked - + } + // update mappers if asked if (p.updateStyle) { self.updateStyle(); - } // call onSet callback - + } + // call onSet callback p.onSet(self); - if (p.settingTriggersEvent) { self[p.triggerFnName](p.settingEvent); } } - } // .data({ 'foo': 'bar' }) + } + // .data({ 'foo': 'bar' }) } else if (p.allowSetting && plainObject(name)) { // extend var obj = name; var k, v; var keys = Object.keys(obj); p.beforeSet(self, obj); - for (var _i = 0; _i < keys.length; _i++) { k = keys[_i]; v = obj[k]; - var _valid = !p.immutableKeys[k]; - if (_valid) { for (var j = 0; j < all.length; j++) { var _ele = all[j]; - if (p.canSet(_ele)) { _ele._private[p.field][k] = v; } } } - } // update mappers if asked - + } + // update mappers if asked if (p.updateStyle) { self.updateStyle(); - } // call onSet callback - + } + // call onSet callback p.onSet(self); - if (p.settingTriggersEvent) { self[p.triggerFnName](p.settingEvent); - } // .data(function(){ ... }) + } + // .data(function(){ ... }) } else if (p.allowBinding && fn$6(name)) { // bind to event var fn = name; - self.on(p.bindingEvent, fn); // .data() + self.on(p.bindingEvent, fn); + + // .data() } else if (p.allowGetting && name === undefined) { // get whole object var _ret; - if (single) { p.beforeGet(single); _ret = single._private[p.field]; } - return _ret; } - return self; // maintain chainability }; // function }, + // data + // remove data field removeData: function removeData(params) { var defaults = { @@ -27591,68 +27322,59 @@ var define$2 = { triggerFnName: 'trigger', triggerEvent: false, immutableKeys: {} // key => true if immutable - }; + params = extend({}, defaults, params); return function removeDataImpl(names) { var p = params; var self = this; var selfIsArrayLike = self.length !== undefined; var all = selfIsArrayLike ? self : [self]; // put in array if not array-like - // .removeData('foo bar') + // .removeData('foo bar') if (string(names)) { // then get the list of keys, and delete them var keys = names.split(/\s+/); var l = keys.length; - for (var i = 0; i < l; i++) { // delete each non-empty key var key = keys[i]; - if (emptyString(key)) { continue; } - var valid = !p.immutableKeys[key]; // not valid if immutable - if (valid) { for (var i_a = 0, l_a = all.length; i_a < l_a; i_a++) { all[i_a]._private[p.field][key] = undefined; } } } - if (p.triggerEvent) { self[p.triggerFnName](p.event); - } // .removeData() + } + // .removeData() } else if (names === undefined) { // then delete all keys + for (var _i_a = 0, _l_a = all.length; _i_a < _l_a; _i_a++) { var _privateFields = all[_i_a]._private[p.field]; - var _keys = Object.keys(_privateFields); - for (var _i2 = 0; _i2 < _keys.length; _i2++) { var _key = _keys[_i2]; var validKeyToDelete = !p.immutableKeys[_key]; - if (validKeyToDelete) { _privateFields[_key] = undefined; } } } - if (p.triggerEvent) { self[p.triggerFnName](p.event); } } - return self; // maintain chaining }; // function } // removeData - }; // define var define$1 = { @@ -27660,8 +27382,9 @@ var define$1 = { var p = proto; p.addListener = p.listen = p.bind = p.on; p.unlisten = p.unbind = p.off = p.removeListener; - p.trigger = p.emit; // this is just a wrapper alias of .on() + p.trigger = p.emit; + // this is just a wrapper alias of .on() p.pon = p.promiseOn = function (events, selector) { var self = this; var args = Array.prototype.slice.call(arguments, 0); @@ -27670,7 +27393,6 @@ var define$1 = { self.off.apply(self, offArgs); resolve(e); }; - var onArgs = args.concat([callback]); var offArgs = onArgs.concat([]); self.on.apply(self, onArgs); @@ -27698,55 +27420,50 @@ var elesfn$i = { var elesfn$h = { classes: function classes(_classes) { var self = this; - if (_classes === undefined) { var ret = []; - self[0]._private.classes.forEach(function (cls) { return ret.push(cls); }); - return ret; } else if (!array(_classes)) { // extract classes from string _classes = (_classes || '').match(/\S+/g) || []; } - var changed = []; - var classesSet = new Set$1(_classes); // check and update each ele + var classesSet = new Set$1(_classes); + // check and update each ele for (var j = 0; j < self.length; j++) { var ele = self[j]; var _p = ele._private; var eleClasses = _p.classes; - var changedEle = false; // check if ele has all of the passed classes + var changedEle = false; + // check if ele has all of the passed classes for (var i = 0; i < _classes.length; i++) { var cls = _classes[i]; var eleHasClass = eleClasses.has(cls); - if (!eleHasClass) { changedEle = true; break; } - } // check if ele has classes outside of those passed - + } + // check if ele has classes outside of those passed if (!changedEle) { changedEle = eleClasses.size !== _classes.length; } - if (changedEle) { _p.classes = classesSet; changed.push(ele); } - } // trigger update style on those eles that had class changes - + } + // trigger update style on those eles that had class changes if (changed.length > 0) { this.spawn(changed).updateStyle().emit('class'); } - return self; }, addClass: function addClass(classes) { @@ -27761,7 +27478,6 @@ var elesfn$h = { // extract classes from string classes = classes.match(/\S+/g) || []; } - var self = this; var toggleUndefd = toggle === undefined; var changed = []; // eles who had classes changed @@ -27770,12 +27486,10 @@ var elesfn$h = { var ele = self[i]; var eleClasses = ele._private.classes; var changedEle = false; - for (var j = 0; j < classes.length; j++) { var cls = classes[j]; var hasClass = eleClasses.has(cls); var changedNow = false; - if (toggle || toggleUndefd && !hasClass) { eleClasses.add(cls); changedNow = true; @@ -27783,21 +27497,17 @@ var elesfn$h = { eleClasses["delete"](cls); changedNow = true; } - if (!changedEle && changedNow) { changed.push(ele); changedEle = true; } } // for j classes - } // for i eles - // trigger update style on those eles that had class changes - + // trigger update style on those eles that had class changes if (changed.length > 0) { this.spawn(changed).updateStyle().emit('class'); } - return self; }, removeClass: function removeClass(classes) { @@ -27805,7 +27515,6 @@ var elesfn$h = { }, flashClass: function flashClass(classes, duration) { var self = this; - if (duration == null) { duration = 250; } else if (duration === 0) { @@ -27821,6 +27530,7 @@ var elesfn$h = { }; elesfn$h.className = elesfn$h.classNames = elesfn$h.classes; +// tokens in the query language var tokens = { metaChar: '[\\!\\"\\#\\$\\%\\&\\\'\\(\\)\\*\\+\\,\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]', // chars we need to escape in let names, etc @@ -27844,39 +27554,31 @@ var tokens = { undirectedEdge: '\\s+<->\\s+' }; tokens.variable = '(?:[\\w-.]|(?:\\\\' + tokens.metaChar + '))+'; // a variable name can have letters, numbers, dashes, and periods - tokens.className = '(?:[\\w-]|(?:\\\\' + tokens.metaChar + '))+'; // a class name has the same rules as a variable except it can't have a '.' in the name - tokens.value = tokens.string + '|' + tokens.number; // a value literal, either a string or number - tokens.id = tokens.variable; // an element id (follows variable conventions) (function () { - var ops, op, i; // add @ variants to comparatorOp + var ops, op, i; + // add @ variants to comparatorOp ops = tokens.comparatorOp.split('|'); - for (i = 0; i < ops.length; i++) { op = ops[i]; tokens.comparatorOp += '|@' + op; - } // add ! variants to comparatorOp - + } + // add ! variants to comparatorOp ops = tokens.comparatorOp.split('|'); - for (i = 0; i < ops.length; i++) { op = ops[i]; - if (op.indexOf('!') >= 0) { continue; } // skip ops that explicitly contain ! - - if (op === '=') { continue; } // skip = b/c != is explicitly defined - tokens.comparatorOp += '|\\!' + op; } })(); @@ -27900,64 +27602,44 @@ var newQuery = function newQuery() { var Type = { /** E.g. node */ GROUP: 0, - /** A collection of elements */ COLLECTION: 1, - /** A filter(ele) function */ FILTER: 2, - /** E.g. [foo > 1] */ DATA_COMPARE: 3, - /** E.g. [foo] */ DATA_EXIST: 4, - /** E.g. [?foo] */ DATA_BOOL: 5, - /** E.g. [[degree > 2]] */ META_COMPARE: 6, - /** E.g. :selected */ STATE: 7, - /** E.g. #foo */ ID: 8, - /** E.g. .foo */ CLASS: 9, - /** E.g. #foo <-> #bar */ UNDIRECTED_EDGE: 10, - /** E.g. #foo -> #bar */ DIRECTED_EDGE: 11, - /** E.g. $#foo -> #bar */ NODE_SOURCE: 12, - /** E.g. #foo -> $#bar */ NODE_TARGET: 13, - /** E.g. $#foo <-> #bar */ NODE_NEIGHBOR: 14, - /** E.g. #foo > #bar */ CHILD: 15, - /** E.g. #foo #bar */ DESCENDANT: 16, - /** E.g. $#foo > #bar */ PARENT: 17, - /** E.g. $#foo #bar */ ANCESTOR: 18, - /** E.g. #foo > $bar > #baz */ COMPOUND_SPLIT: 19, - /** Always matches, useful placeholder for subject in `COMPOUND_SPLIT` */ TRUE: 20 }; @@ -28115,19 +27797,15 @@ var stateSelectors = [{ // n.b. selectors that are starting substrings of others must have the longer ones first return descending(a.selector, b.selector); }); - var lookup = function () { var selToFn = {}; var s; - for (var i = 0; i < stateSelectors.length; i++) { s = stateSelectors[i]; selToFn[s.selector] = s.matches; } - return selToFn; }(); - var stateSelectorMatches = function stateSelectorMatches(sel, ele) { return lookup[sel](ele); }; @@ -28135,22 +27813,21 @@ var stateSelectorRegex = '(' + stateSelectors.map(function (s) { return s.selector; }).join('|') + ')'; +// when a token like a variable has escaped meta characters, we need to clean the backslashes out // so that values get compared properly in Selector.filter() - var cleanMetaChars = function cleanMetaChars(str) { return str.replace(new RegExp('\\\\(' + tokens.metaChar + ')', 'g'), function (match, $1) { return $1; }); }; - var replaceLastQuery = function replaceLastQuery(selector, examiningQuery, replacementQuery) { selector[selector.length - 1] = replacementQuery; -}; // NOTE: add new expression syntax here to have it recognised by the parser; +}; + +// NOTE: add new expression syntax here to have it recognised by the parser; // - a query contains all adjacent (i.e. no separator in between) expressions; // - the current query is stored in selector[i] // - you need to check the query objects in match() for it actually filter properly, but that's pretty straight forward - - var exprs = [{ name: 'group', // just used for identifying when debugging @@ -28158,8 +27835,7 @@ var exprs = [{ regex: '(' + tokens.group + ')', populate: function populate(selector, query, _ref) { var _ref2 = _slicedToArray(_ref, 1), - group = _ref2[0]; - + group = _ref2[0]; query.checks.push({ type: Type.GROUP, value: group === '*' ? group : group + 's' @@ -28171,8 +27847,7 @@ var exprs = [{ regex: stateSelectorRegex, populate: function populate(selector, query, _ref3) { var _ref4 = _slicedToArray(_ref3, 1), - state = _ref4[0]; - + state = _ref4[0]; query.checks.push({ type: Type.STATE, value: state @@ -28184,8 +27859,7 @@ var exprs = [{ regex: '\\#(' + tokens.id + ')', populate: function populate(selector, query, _ref5) { var _ref6 = _slicedToArray(_ref5, 1), - id = _ref6[0]; - + id = _ref6[0]; query.checks.push({ type: Type.ID, value: cleanMetaChars(id) @@ -28197,8 +27871,7 @@ var exprs = [{ regex: '\\.(' + tokens.className + ')', populate: function populate(selector, query, _ref7) { var _ref8 = _slicedToArray(_ref7, 1), - className = _ref8[0]; - + className = _ref8[0]; query.checks.push({ type: Type.CLASS, value: cleanMetaChars(className) @@ -28210,8 +27883,7 @@ var exprs = [{ regex: '\\[\\s*(' + tokens.variable + ')\\s*\\]', populate: function populate(selector, query, _ref9) { var _ref10 = _slicedToArray(_ref9, 1), - variable = _ref10[0]; - + variable = _ref10[0]; query.checks.push({ type: Type.DATA_EXIST, field: cleanMetaChars(variable) @@ -28223,18 +27895,15 @@ var exprs = [{ regex: '\\[\\s*(' + tokens.variable + ')\\s*(' + tokens.comparatorOp + ')\\s*(' + tokens.value + ')\\s*\\]', populate: function populate(selector, query, _ref11) { var _ref12 = _slicedToArray(_ref11, 3), - variable = _ref12[0], - comparatorOp = _ref12[1], - value = _ref12[2]; - + variable = _ref12[0], + comparatorOp = _ref12[1], + value = _ref12[2]; var valueIsString = new RegExp('^' + tokens.string + '$').exec(value) != null; - if (valueIsString) { value = value.substring(1, value.length - 1); } else { value = parseFloat(value); } - query.checks.push({ type: Type.DATA_COMPARE, field: cleanMetaChars(variable), @@ -28248,9 +27917,8 @@ var exprs = [{ regex: '\\[\\s*(' + tokens.boolOp + ')\\s*(' + tokens.variable + ')\\s*\\]', populate: function populate(selector, query, _ref13) { var _ref14 = _slicedToArray(_ref13, 2), - boolOp = _ref14[0], - variable = _ref14[1]; - + boolOp = _ref14[0], + variable = _ref14[1]; query.checks.push({ type: Type.DATA_BOOL, field: cleanMetaChars(variable), @@ -28263,10 +27931,9 @@ var exprs = [{ regex: '\\[\\[\\s*(' + tokens.meta + ')\\s*(' + tokens.comparatorOp + ')\\s*(' + tokens.number + ')\\s*\\]\\]', populate: function populate(selector, query, _ref15) { var _ref16 = _slicedToArray(_ref15, 3), - meta = _ref16[0], - comparatorOp = _ref16[1], - number = _ref16[2]; - + meta = _ref16[0], + comparatorOp = _ref16[1], + number = _ref16[2]; query.checks.push({ type: Type.META_COMPARE, field: cleanMetaChars(meta), @@ -28283,17 +27950,16 @@ var exprs = [{ var edgeCount = selector.edgeCount; var compoundCount = selector.compoundCount; var lastQ = selector[selector.length - 1]; - if (currentSubject != null) { lastQ.subject = currentSubject; selector.currentSubject = null; } - lastQ.edgeCount = edgeCount; lastQ.compoundCount = compoundCount; selector.edgeCount = 0; - selector.compoundCount = 0; // go on to next query + selector.compoundCount = 0; + // go on to next query var nextQuery = selector[selector.length++] = newQuery(); return nextQuery; // this is the new query to be filled by the following exprs } @@ -28311,25 +27977,26 @@ var exprs = [{ type: Type.DIRECTED_EDGE, source: source, target: target - }); // the query in the selector should be the edge rather than the source + }); + // the query in the selector should be the edge rather than the source replaceLastQuery(selector, query, edgeQuery); - selector.edgeCount++; // we're now populating the target query with expressions that follow + selector.edgeCount++; + // we're now populating the target query with expressions that follow return target; } else { // source/target var srcTgtQ = newQuery(); var _source = query; - var _target = newQuery(); - srcTgtQ.checks.push({ type: Type.NODE_SOURCE, source: _source, target: _target - }); // the query in the selector should be the neighbourhood rather than the node + }); + // the query in the selector should be the neighbourhood rather than the node replaceLastQuery(selector, query, srcTgtQ); selector.edgeCount++; return _target; // now populating the target with the following expressions @@ -28348,11 +28015,13 @@ var exprs = [{ edgeQuery.checks.push({ type: Type.UNDIRECTED_EDGE, nodes: [source, target] - }); // the query in the selector should be the edge rather than the source + }); + // the query in the selector should be the edge rather than the source replaceLastQuery(selector, query, edgeQuery); - selector.edgeCount++; // we're now populating the target query with expressions that follow + selector.edgeCount++; + // we're now populating the target query with expressions that follow return target; } else { // neighbourhood @@ -28363,8 +28032,9 @@ var exprs = [{ type: Type.NODE_NEIGHBOR, node: node, neighbor: neighbor - }); // the query in the selector should be the neighbourhood rather than the node + }); + // the query in the selector should be the neighbourhood rather than the node replaceLastQuery(selector, query, nhoodQ); return neighbor; // now populating the neighbor with following expressions } @@ -28383,11 +28053,13 @@ var exprs = [{ type: Type.CHILD, parent: parent, child: child - }); // the query in the selector should be the '>' itself + }); + // the query in the selector should be the '>' itself replaceLastQuery(selector, query, parentChildQuery); - selector.compoundCount++; // we're now populating the child query with expressions that follow + selector.compoundCount++; + // we're now populating the child query with expressions that follow return child; } else if (selector.currentSubject === query) { // compound split query @@ -28395,40 +28067,37 @@ var exprs = [{ var left = selector[selector.length - 1]; var right = newQuery(); var subject = newQuery(); - var _child = newQuery(); + var _parent = newQuery(); - var _parent = newQuery(); // set up the root compound q - - + // set up the root compound q compound.checks.push({ type: Type.COMPOUND_SPLIT, left: left, right: right, subject: subject - }); // populate the subject and replace the q at the old spot (within left) with TRUE + }); + // populate the subject and replace the q at the old spot (within left) with TRUE subject.checks = query.checks; // take the checks from the left - query.checks = [{ type: Type.TRUE }]; // checks under left refs the subject implicitly - // set up the right q + // set up the right q _parent.checks.push({ type: Type.TRUE }); // parent implicitly refs the subject - - right.checks.push({ type: Type.PARENT, // type is swapped on right side queries parent: _parent, child: _child // empty for now - }); - replaceLastQuery(selector, left, compound); // update the ref since we moved things around for `query` + replaceLastQuery(selector, left, compound); + + // update the ref since we moved things around for `query` selector.currentSubject = subject; selector.compoundCount++; return _child; // now populating the right side's child @@ -28436,17 +28105,15 @@ var exprs = [{ // parent query // info for parent query var _parent2 = newQuery(); - var _child2 = newQuery(); - var pcQChecks = [{ type: Type.PARENT, parent: _parent2, child: _child2 - }]; // the parent-child query takes the place of the query previously being populated + }]; + // the parent-child query takes the place of the query previously being populated _parent2.checks = query.checks; // the previous query contains the checks for the parent - query.checks = pcQChecks; // pc query takes over selector.compoundCount++; @@ -28467,11 +28134,13 @@ var exprs = [{ type: Type.DESCENDANT, ancestor: ancestor, descendant: descendant - }); // the query in the selector should be the '>' itself + }); + // the query in the selector should be the '>' itself replaceLastQuery(selector, query, ancChQuery); - selector.compoundCount++; // we're now populating the descendant query with expressions that follow + selector.compoundCount++; + // we're now populating the descendant query with expressions that follow return descendant; } else if (selector.currentSubject === query) { // compound split query @@ -28479,40 +28148,37 @@ var exprs = [{ var left = selector[selector.length - 1]; var right = newQuery(); var subject = newQuery(); - var _descendant = newQuery(); + var _ancestor = newQuery(); - var _ancestor = newQuery(); // set up the root compound q - - + // set up the root compound q compound.checks.push({ type: Type.COMPOUND_SPLIT, left: left, right: right, subject: subject - }); // populate the subject and replace the q at the old spot (within left) with TRUE + }); + // populate the subject and replace the q at the old spot (within left) with TRUE subject.checks = query.checks; // take the checks from the left - query.checks = [{ type: Type.TRUE }]; // checks under left refs the subject implicitly - // set up the right q + // set up the right q _ancestor.checks.push({ type: Type.TRUE }); // ancestor implicitly refs the subject - - right.checks.push({ type: Type.ANCESTOR, // type is swapped on right side queries ancestor: _ancestor, descendant: _descendant // empty for now - }); - replaceLastQuery(selector, left, compound); // update the ref since we moved things around for `query` + replaceLastQuery(selector, left, compound); + + // update the ref since we moved things around for `query` selector.currentSubject = subject; selector.compoundCount++; return _descendant; // now populating the right side's descendant @@ -28520,17 +28186,15 @@ var exprs = [{ // ancestor query // info for parent query var _ancestor2 = newQuery(); - var _descendant2 = newQuery(); - var adQChecks = [{ type: Type.ANCESTOR, ancestor: _ancestor2, descendant: _descendant2 - }]; // the parent-child query takes the place of the query previously being populated + }]; + // the parent-child query takes the place of the query previously being populated _ancestor2.checks = query.checks; // the previous query contains the checks for the parent - query.checks = adQChecks; // pc query takes over selector.compoundCount++; @@ -28546,24 +28210,24 @@ var exprs = [{ warn('Redefinition of subject in selector `' + selector.toString() + '`'); return false; } - selector.currentSubject = query; var topQ = selector[selector.length - 1]; var topChk = topQ.checks[0]; var topType = topChk == null ? null : topChk.type; - if (topType === Type.DIRECTED_EDGE) { // directed edge with subject on the target + // change to target node check topChk.type = Type.NODE_TARGET; } else if (topType === Type.UNDIRECTED_EDGE) { // undirected edge with subject on the second node + // change to neighbor check topChk.type = Type.NODE_NEIGHBOR; topChk.node = topChk.nodes[1]; // second node is subject + topChk.neighbor = topChk.nodes[0]; - topChk.neighbor = topChk.nodes[0]; // clean up unused fields for new type - + // clean up unused fields for new type topChk.nodes = null; } } @@ -28577,17 +28241,14 @@ exprs.forEach(function (e) { * @param {string} remaining The remaining text to parse * @returns The matched expression and the newly remaining text `{ expr, match, name, remaining }` */ - var consumeExpr = function consumeExpr(remaining) { var expr; var match; var name; - for (var j = 0; j < exprs.length; j++) { var e = exprs[j]; var n = e.name; var m = remaining.match(e.regexObj); - if (m != null) { match = m; expr = e; @@ -28605,30 +28266,26 @@ var consumeExpr = function consumeExpr(remaining) { remaining: remaining }; }; + /** * Consume all the leading whitespace * @param {string} remaining The text to consume * @returns The text with the leading whitespace removed */ - - var consumeWhitespace = function consumeWhitespace(remaining) { var match = remaining.match(/^\s+/); - if (match) { var consumed = match[0]; remaining = remaining.substring(consumed.length); } - return remaining; }; + /** * Parse the string and store the parsed representation in the Selector. * @param {string} selector The selector string * @returns `true` if the selector was successfully parsed, `false` otherwise */ - - var parse = function parse(selector) { var self = this; var remaining = self.inputText = selector; @@ -28638,15 +28295,14 @@ var parse = function parse(selector) { for (;;) { var exprInfo = consumeExpr(remaining); - if (exprInfo.expr == null) { warn('The selector `' + selector + '`is invalid'); return false; } else { - var args = exprInfo.match.slice(1); // let the token populate the selector object in currentQuery + var args = exprInfo.match.slice(1); + // let the token populate the selector object in currentQuery var ret = exprInfo.expr.populate(self, currentQuery, args); - if (ret === false) { return false; // exit if population failed } else if (ret != null) { @@ -28654,30 +28310,27 @@ var parse = function parse(selector) { } } - remaining = exprInfo.remaining; // we're done when there's nothing left to parse + remaining = exprInfo.remaining; + // we're done when there's nothing left to parse if (remaining.match(/^\s*$/)) { break; } } - var lastQ = self[self.length - 1]; - if (self.currentSubject != null) { lastQ.subject = self.currentSubject; } - lastQ.edgeCount = self.edgeCount; lastQ.compoundCount = self.compoundCount; - for (var i = 0; i < self.length; i++) { - var q = self[i]; // in future, this could potentially be allowed if there were operator precedence and detection of invalid combinations + var q = self[i]; + // in future, this could potentially be allowed if there were operator precedence and detection of invalid combinations if (q.compoundCount > 0 && q.edgeCount > 0) { warn('The selector `' + selector + '` is invalid because it uses both a compound selector and an edge selector'); return false; } - if (q.edgeCount > 1) { warn('The selector `' + selector + '` is invalid because it uses multiple edge selectors'); return false; @@ -28685,21 +28338,18 @@ var parse = function parse(selector) { warn('The selector `' + selector + '` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.'); } } - return true; // success }; + /** * Get the selector represented as a string. This value uses default formatting, * so things like spacing may differ from the input text passed to the constructor. * @returns {string} The selector string */ - - var toString = function toString() { if (this.toStringCache != null) { return this.toStringCache; } - var clean = function clean(obj) { if (obj == null) { return ''; @@ -28707,7 +28357,6 @@ var toString = function toString() { return obj; } }; - var cleanVal = function cleanVal(val) { if (string(val)) { return '"' + val + '"'; @@ -28715,76 +28364,63 @@ var toString = function toString() { return clean(val); } }; - var space = function space(val) { return ' ' + val + ' '; }; - var checkToString = function checkToString(check, subject) { var type = check.type, - value = check.value; - + value = check.value; switch (type) { case Type.GROUP: { var group = clean(value); return group.substring(0, group.length - 1); } - case Type.DATA_COMPARE: { var field = check.field, - operator = check.operator; + operator = check.operator; return '[' + field + space(clean(operator)) + cleanVal(value) + ']'; } - case Type.DATA_BOOL: { var _operator = check.operator, - _field = check.field; + _field = check.field; return '[' + clean(_operator) + _field + ']'; } - case Type.DATA_EXIST: { var _field2 = check.field; return '[' + _field2 + ']'; } - case Type.META_COMPARE: { var _operator2 = check.operator, - _field3 = check.field; + _field3 = check.field; return '[[' + _field3 + space(clean(_operator2)) + cleanVal(value) + ']]'; } - case Type.STATE: { return value; } - case Type.ID: { return '#' + value; } - case Type.CLASS: { return '.' + value; } - case Type.PARENT: case Type.CHILD: { return queryToString(check.parent, subject) + space('>') + queryToString(check.child, subject); } - case Type.ANCESTOR: case Type.DESCENDANT: { return queryToString(check.ancestor, subject) + ' ' + queryToString(check.descendant, subject); } - case Type.COMPOUND_SPLIT: { var lhs = queryToString(check.left, subject); @@ -28792,31 +28428,25 @@ var toString = function toString() { var rhs = queryToString(check.right, subject); return lhs + (lhs.length > 0 ? ' ' : '') + sub + rhs; } - case Type.TRUE: { return ''; } } }; - var queryToString = function queryToString(query, subject) { return query.checks.reduce(function (str, chk, i) { return str + (subject === query && i === 0 ? '$' : '') + checkToString(chk, subject); }, ''); }; - var str = ''; - for (var i = 0; i < this.length; i++) { var query = this[i]; str += queryToString(query, query.subject); - if (this.length > 1 && i < this.length - 1) { str += ', '; } } - this.toStringCache = str; return str; }; @@ -28834,86 +28464,71 @@ var valCmp = function valCmp(fieldVal, operator, value) { var caseInsensitive = false; var notExpr = false; var isIneqCmp = false; - if (operator.indexOf('!') >= 0) { operator = operator.replace('!', ''); notExpr = true; } - if (operator.indexOf('@') >= 0) { operator = operator.replace('@', ''); caseInsensitive = true; } - if (isFieldStr || isValStr || caseInsensitive) { fieldStr = !isFieldStr && !isFieldNum ? '' : '' + fieldVal; valStr = '' + value; - } // if we're doing a case insensitive comparison, then we're using a STRING comparison - // even if we're comparing numbers - + } + // if we're doing a case insensitive comparison, then we're using a STRING comparison + // even if we're comparing numbers if (caseInsensitive) { fieldVal = fieldStr = fieldStr.toLowerCase(); value = valStr = valStr.toLowerCase(); } - switch (operator) { case '*=': matches = fieldStr.indexOf(valStr) >= 0; break; - case '$=': matches = fieldStr.indexOf(valStr, fieldStr.length - valStr.length) >= 0; break; - case '^=': matches = fieldStr.indexOf(valStr) === 0; break; - case '=': matches = fieldVal === value; break; - case '>': isIneqCmp = true; matches = fieldVal > value; break; - case '>=': isIneqCmp = true; matches = fieldVal >= value; break; - case '<': isIneqCmp = true; matches = fieldVal < value; break; - case '<=': isIneqCmp = true; matches = fieldVal <= value; break; - default: matches = false; break; - } // apply the not op, but null vals for inequalities should always stay non-matching - + } + // apply the not op, but null vals for inequalities should always stay non-matching if (notExpr && (fieldVal != null || !isIneqCmp)) { matches = !matches; } - return matches; }; var boolCmp = function boolCmp(fieldVal, operator) { switch (operator) { case '?': return fieldVal ? true : false; - case '!': return fieldVal ? false : true; - case '^': return fieldVal === undefined; } @@ -28929,66 +28544,56 @@ var meta = function meta(ele, field) { }; /** A lookup of `match(check, ele)` functions by `Type` int */ - var match = []; + /** * Returns whether the query matches for the element * @param query The `{ type, value, ... }` query object * @param ele The element to compare against */ - var matches$1 = function matches(query, ele) { return query.checks.every(function (chk) { return match[chk.type](chk, ele); }); }; - match[Type.GROUP] = function (check, ele) { var group = check.value; return group === '*' || group === ele.group(); }; - match[Type.STATE] = function (check, ele) { var stateSelector = check.value; return stateSelectorMatches(stateSelector, ele); }; - match[Type.ID] = function (check, ele) { var id = check.value; return ele.id() === id; }; - match[Type.CLASS] = function (check, ele) { var cls = check.value; return ele.hasClass(cls); }; - match[Type.META_COMPARE] = function (check, ele) { var field = check.field, - operator = check.operator, - value = check.value; + operator = check.operator, + value = check.value; return valCmp(meta(ele, field), operator, value); }; - match[Type.DATA_COMPARE] = function (check, ele) { var field = check.field, - operator = check.operator, - value = check.value; + operator = check.operator, + value = check.value; return valCmp(data$1(ele, field), operator, value); }; - match[Type.DATA_BOOL] = function (check, ele) { var field = check.field, - operator = check.operator; + operator = check.operator; return boolCmp(data$1(ele, field), operator); }; - match[Type.DATA_EXIST] = function (check, ele) { var field = check.field; - check.operator; + check.operator; return existCmp(data$1(ele, field)); }; - match[Type.UNDIRECTED_EDGE] = function (check, ele) { var qA = check.nodes[0]; var qB = check.nodes[1]; @@ -28996,114 +28601,94 @@ match[Type.UNDIRECTED_EDGE] = function (check, ele) { var tgt = ele.target(); return matches$1(qA, src) && matches$1(qB, tgt) || matches$1(qB, src) && matches$1(qA, tgt); }; - match[Type.NODE_NEIGHBOR] = function (check, ele) { return matches$1(check.node, ele) && ele.neighborhood().some(function (n) { return n.isNode() && matches$1(check.neighbor, n); }); }; - match[Type.DIRECTED_EDGE] = function (check, ele) { return matches$1(check.source, ele.source()) && matches$1(check.target, ele.target()); }; - match[Type.NODE_SOURCE] = function (check, ele) { return matches$1(check.source, ele) && ele.outgoers().some(function (n) { return n.isNode() && matches$1(check.target, n); }); }; - match[Type.NODE_TARGET] = function (check, ele) { return matches$1(check.target, ele) && ele.incomers().some(function (n) { return n.isNode() && matches$1(check.source, n); }); }; - match[Type.CHILD] = function (check, ele) { return matches$1(check.child, ele) && matches$1(check.parent, ele.parent()); }; - match[Type.PARENT] = function (check, ele) { return matches$1(check.parent, ele) && ele.children().some(function (c) { return matches$1(check.child, c); }); }; - match[Type.DESCENDANT] = function (check, ele) { return matches$1(check.descendant, ele) && ele.ancestors().some(function (a) { return matches$1(check.ancestor, a); }); }; - match[Type.ANCESTOR] = function (check, ele) { return matches$1(check.ancestor, ele) && ele.descendants().some(function (d) { return matches$1(check.descendant, d); }); }; - match[Type.COMPOUND_SPLIT] = function (check, ele) { return matches$1(check.subject, ele) && matches$1(check.left, ele) && matches$1(check.right, ele); }; - match[Type.TRUE] = function () { return true; }; - match[Type.COLLECTION] = function (check, ele) { var collection = check.value; return collection.has(ele); }; - match[Type.FILTER] = function (check, ele) { var filter = check.value; return filter(ele); }; +// filter an existing collection var filter = function filter(collection) { - var self = this; // for 1 id #foo queries, just get the element + var self = this; + // for 1 id #foo queries, just get the element if (self.length === 1 && self[0].checks.length === 1 && self[0].checks[0].type === Type.ID) { return collection.getElementById(self[0].checks[0].value).collection(); } - var selectorFunction = function selectorFunction(element) { for (var j = 0; j < self.length; j++) { var query = self[j]; - if (matches$1(query, element)) { return true; } } - return false; }; - if (self.text() == null) { selectorFunction = function selectorFunction() { return true; }; } - return collection.filter(selectorFunction); }; // filter -// does selector match a single element? - +// does selector match a single element? var matches = function matches(ele) { var self = this; - for (var j = 0; j < self.length; j++) { var query = self[j]; - if (matches$1(query, ele)) { return true; } } - return false; }; // matches - var matching = { matches: matches, filter: filter @@ -29115,7 +28700,6 @@ var Selector = function Selector(selector) { this.compoundCount = 0; this.edgeCount = 0; this.length = 0; - if (selector == null || string(selector) && selector.match(/^\s*$/)) ; else if (elementOrCollection(selector)) { this.addQuery({ checks: [{ @@ -29138,32 +28722,25 @@ var Selector = function Selector(selector) { error('A selector must be created from a string; found '); } }; - var selfn = Selector.prototype; [parse$1, matching].forEach(function (p) { return extend(selfn, p); }); - selfn.text = function () { return this.inputText; }; - selfn.size = function () { return this.length; }; - selfn.eq = function (i) { return this[i]; }; - selfn.sameText = function (otherSel) { return !this.invalid && !otherSel.invalid && this.text() === otherSel.text(); }; - selfn.addQuery = function (q) { this[this.length++] = q; }; - selfn.selector = selfn.toString; var elesfn$g = { @@ -29182,23 +28759,19 @@ var elesfn$g = { some: function some(fn, thisArg) { for (var i = 0; i < this.length; i++) { var ret = !thisArg ? fn(this[i], i, this) : fn.apply(thisArg, [this[i], i, this]); - if (ret) { return true; } } - return false; }, every: function every(fn, thisArg) { for (var i = 0; i < this.length; i++) { var ret = !thisArg ? fn(this[i], i, this) : fn.apply(thisArg, [this[i], i, this]); - if (!ret) { return false; } } - return true; }, same: function same(collection) { @@ -29206,20 +28779,19 @@ var elesfn$g = { if (this === collection) { return true; } - collection = this.cy().collection(collection); var thisLength = this.length; - var collectionLength = collection.length; // cheap length check + var collectionLength = collection.length; + // cheap length check if (thisLength !== collectionLength) { return false; - } // cheap element ref check - + } + // cheap element ref check if (thisLength === 1) { return this[0] === collection[0]; } - return this.every(function (ele) { return collection.hasElementWithId(ele.id()); }); @@ -29254,20 +28826,17 @@ var cache = function cache(fn, name) { var selectorOrEles = arg1; var eles = this; var key; - if (selectorOrEles == null) { key = ''; } else if (elementOrCollection(selectorOrEles) && selectorOrEles.length === 1) { key = selectorOrEles.id(); } - if (eles.length === 1 && key) { var _p = eles[0]._private; var tch = _p.traversalCache = _p.traversalCache || {}; var ch = tch[name] = tch[name] || []; var hash = hashString(key); var cacheHit = ch[hash]; - if (cacheHit) { return cacheHit; } else { @@ -29281,45 +28850,38 @@ var cache = function cache(fn, name) { var elesfn$f = { parent: function parent(selector) { - var parents = []; // optimisation for single ele call + var parents = []; + // optimisation for single ele call if (this.length === 1) { var parent = this[0]._private.parent; - if (parent) { return parent; } } - for (var i = 0; i < this.length; i++) { var ele = this[i]; var _parent = ele._private.parent; - if (_parent) { parents.push(_parent); } } - return this.spawn(parents, true).filter(selector); }, parents: function parents(selector) { var parents = []; var eles = this.parent(); - while (eles.nonempty()) { for (var i = 0; i < eles.length; i++) { var ele = eles[i]; parents.push(ele); } - eles = eles.parent(); } - return this.spawn(parents, true).filter(selector); }, commonAncestors: function commonAncestors(selector) { var ancestors; - for (var i = 0; i < this.length; i++) { var ele = this[i]; var parents = ele.parents(); @@ -29341,16 +28903,13 @@ var elesfn$f = { }, children: cache(function (selector) { var children = []; - for (var i = 0; i < this.length; i++) { var ele = this[i]; var eleChildren = ele._private.children; - for (var j = 0; j < eleChildren.length; j++) { children.push(eleChildren[j]); } } - return this.spawn(children, true).filter(selector); }, 'children'), siblings: function siblings(selector) { @@ -29358,128 +28917,106 @@ var elesfn$f = { }, isParent: function isParent() { var ele = this[0]; - if (ele) { return ele.isNode() && ele._private.children.length !== 0; } }, isChildless: function isChildless() { var ele = this[0]; - if (ele) { return ele.isNode() && ele._private.children.length === 0; } }, isChild: function isChild() { var ele = this[0]; - if (ele) { return ele.isNode() && ele._private.parent != null; } }, isOrphan: function isOrphan() { var ele = this[0]; - if (ele) { return ele.isNode() && ele._private.parent == null; } }, descendants: function descendants(selector) { var elements = []; - function add(eles) { for (var i = 0; i < eles.length; i++) { var ele = eles[i]; elements.push(ele); - if (ele.children().nonempty()) { add(ele.children()); } } } - add(this.children()); return this.spawn(elements, true).filter(selector); } }; - function forEachCompound(eles, fn, includeSelf, recursiveStep) { var q = []; var did = new Set$1(); var cy = eles.cy(); var hasCompounds = cy.hasCompoundNodes(); - for (var i = 0; i < eles.length; i++) { var ele = eles[i]; - if (includeSelf) { q.push(ele); } else if (hasCompounds) { recursiveStep(q, did, ele); } } - while (q.length > 0) { var _ele = q.shift(); - fn(_ele); did.add(_ele.id()); - if (hasCompounds) { recursiveStep(q, did, _ele); } } - return eles; } - function addChildren(q, did, ele) { if (ele.isParent()) { var children = ele._private.children; - for (var i = 0; i < children.length; i++) { var child = children[i]; - if (!did.has(child.id())) { q.push(child); } } } -} // very efficient version of eles.add( eles.descendants() ).forEach() -// for internal use - +} +// very efficient version of eles.add( eles.descendants() ).forEach() +// for internal use elesfn$f.forEachDown = function (fn) { var includeSelf = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; return forEachCompound(this, fn, includeSelf, addChildren); }; - function addParent(q, did, ele) { if (ele.isChild()) { var parent = ele._private.parent; - if (!did.has(parent.id())) { q.push(parent); } } } - elesfn$f.forEachUp = function (fn) { var includeSelf = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; return forEachCompound(this, fn, includeSelf, addParent); }; - function addParentAndChildren(q, did, ele) { addParent(q, did, ele); addChildren(q, did, ele); } - elesfn$f.forEachUpAndDown = function (fn) { var includeSelf = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; return forEachCompound(this, fn, includeSelf, addParentAndChildren); -}; // aliases - +}; +// aliases elesfn$f.ancestors = elesfn$f.parents; var fn$5, elesfn$e; @@ -29545,53 +29082,44 @@ fn$5 = elesfn$e = { }), id: function id() { var ele = this[0]; - if (ele) { return ele._private.data.id; } } -}; // aliases +}; +// aliases fn$5.attr = fn$5.data; fn$5.removeAttr = fn$5.removeData; var data = elesfn$e; var elesfn$d = {}; - function defineDegreeFunction(callback) { return function (includeLoops) { var self = this; - if (includeLoops === undefined) { includeLoops = true; } - if (self.length === 0) { return; } - if (self.isNode() && !self.removed()) { var degree = 0; var node = self[0]; var connectedEdges = node._private.edges; - for (var i = 0; i < connectedEdges.length; i++) { var edge = connectedEdges[i]; - if (!includeLoops && edge.isLoop()) { continue; } - degree += callback(node, edge); } - return degree; } else { return; } }; } - extend(elesfn$d, { degree: defineDegreeFunction(function (node, edge) { if (edge.source().same(edge.target())) { @@ -29615,25 +29143,20 @@ extend(elesfn$d, { } }) }); - function defineDegreeBoundsFunction(degreeFn, callback) { return function (includeLoops) { var ret; var nodes = this.nodes(); - for (var i = 0; i < nodes.length; i++) { var ele = nodes[i]; var degree = ele[degreeFn](includeLoops); - if (degree !== undefined && (ret === undefined || callback(degree, ret))) { ret = degree; } } - return ret; }; } - extend(elesfn$d, { minDegree: defineDegreeBoundsFunction('degree', function (degree, min) { return degree < min; @@ -29658,37 +29181,30 @@ extend(elesfn$d, { totalDegree: function totalDegree(includeLoops) { var total = 0; var nodes = this.nodes(); - for (var i = 0; i < nodes.length; i++) { total += nodes[i].degree(includeLoops); } - return total; } }); var fn$4, elesfn$c; - var beforePositionSet = function beforePositionSet(eles, newPos, silent) { for (var i = 0; i < eles.length; i++) { var ele = eles[i]; - if (!ele.locked()) { var oldPos = ele._private.position; var delta = { x: newPos.x != null ? newPos.x - oldPos.x : 0, y: newPos.y != null ? newPos.y - oldPos.y : 0 }; - if (ele.isParent() && !(delta.x === 0 && delta.y === 0)) { ele.children().shift(delta, silent); } - ele.dirtyBoundingBoxCache(); } } }; - var positionDef = { field: 'position', bindingEvent: 'position', @@ -29738,12 +29254,9 @@ fn$4 = elesfn$c = { var _fn = pos; var cy = this.cy(); cy.startBatch(); - for (var i = 0; i < this.length; i++) { var ele = this[i]; - var _pos = void 0; - if (_pos = _fn(ele, i)) { if (silent) { ele.silentPosition(_pos); @@ -29752,18 +29265,16 @@ fn$4 = elesfn$c = { } } } - cy.endBatch(); } - return this; // chaining }, + silentPositions: function silentPositions(pos) { return this.positions(pos, true); }, shift: function shift(dim, val, silent) { var delta; - if (plainObject(dim)) { delta = { x: number$1(dim.x) ? dim.x : 0, @@ -29777,34 +29288,29 @@ fn$4 = elesfn$c = { }; delta[dim] = val; } - if (delta != null) { var cy = this.cy(); cy.startBatch(); - for (var i = 0; i < this.length; i++) { - var ele = this[i]; // exclude any node that is a descendant of the calling collection + var ele = this[i]; + // exclude any node that is a descendant of the calling collection if (cy.hasCompoundNodes() && ele.isChild() && ele.ancestors().anySame(this)) { continue; } - var pos = ele.position(); var newPos = { x: pos.x + delta.x, y: pos.y + delta.y }; - if (silent) { ele.silentPosition(newPos); } else { ele.position(newPos); } } - cy.endBatch(); } - return this; }, silentShift: function silentShift(dim, val) { @@ -29813,7 +29319,6 @@ fn$4 = elesfn$c = { } else if (string(dim) && number$1(val)) { this.shift(dim, val, true); } - return this; }, // get/set the rendered (i.e. on screen) positon of the element @@ -29824,13 +29329,11 @@ fn$4 = elesfn$c = { var pan = cy.pan(); var rpos = plainObject(dim) ? dim : undefined; var setting = rpos !== undefined || val !== undefined && string(dim); - if (ele && ele.isNode()) { // must have an element and must be a node to return position if (setting) { for (var i = 0; i < this.length; i++) { var _ele = this[i]; - if (val !== undefined) { // set one dimension _ele.position(dim, (val - pan[dim]) / zoom); @@ -29843,7 +29346,6 @@ fn$4 = elesfn$c = { // getting var pos = ele.position(); rpos = modelToRenderedPosition(pos, zoom, pan); - if (dim === undefined) { // then return the whole rendered position return rpos; @@ -29858,6 +29360,7 @@ fn$4 = elesfn$c = { return this; // chaining }, + // get/set the position relative to the parent relativePosition: function relativePosition(dim, val) { var ele = this[0]; @@ -29865,7 +29368,6 @@ fn$4 = elesfn$c = { var ppos = plainObject(dim) ? dim : undefined; var setting = ppos !== undefined || val !== undefined && string(dim); var hasCompoundNodes = cy.hasCompoundNodes(); - if (ele && ele.isNode()) { // must have an element and must be a node to return position if (setting) { @@ -29874,16 +29376,13 @@ fn$4 = elesfn$c = { var parent = hasCompoundNodes ? _ele2.parent() : null; var hasParent = parent && parent.length > 0; var relativeToParent = hasParent; - if (hasParent) { parent = parent[0]; } - var origin = relativeToParent ? parent.position() : { x: 0, y: 0 }; - if (val !== undefined) { // set one dimension _ele2.position(dim, val + origin[dim]); @@ -29898,27 +29397,20 @@ fn$4 = elesfn$c = { } else { // getting var pos = ele.position(); - var _parent = hasCompoundNodes ? ele.parent() : null; - var _hasParent = _parent && _parent.length > 0; - var _relativeToParent = _hasParent; - if (_hasParent) { _parent = _parent[0]; } - var _origin = _relativeToParent ? _parent.position() : { x: 0, y: 0 }; - ppos = { x: pos.x - _origin.x, y: pos.y - _origin.y }; - if (dim === undefined) { // then return the whole rendered position return ppos; @@ -29933,8 +29425,9 @@ fn$4 = elesfn$c = { return this; // chaining } -}; // aliases +}; +// aliases fn$4.modelPosition = fn$4.point = fn$4.position; fn$4.modelPositions = fn$4.points = fn$4.positions; fn$4.renderedPoint = fn$4.renderedPosition; @@ -29943,7 +29436,6 @@ var position = elesfn$c; var fn$3, elesfn$b; fn$3 = elesfn$b = {}; - elesfn$b.renderedBoundingBox = function (options) { var bb = this.boundingBox(options); var cy = this.cy(); @@ -29962,21 +29454,17 @@ elesfn$b.renderedBoundingBox = function (options) { h: y2 - y1 }; }; - elesfn$b.dirtyCompoundBoundsCache = function () { var silent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var cy = this.cy(); - if (!cy.styleEnabled() || !cy.hasCompoundNodes()) { return this; } - this.forEachUp(function (ele) { if (ele.isParent()) { var _p = ele._private; _p.compoundBoundsClean = false; _p.bbCache = null; - if (!silent) { ele.emitAndNotify('bounds'); } @@ -29984,25 +29472,23 @@ elesfn$b.dirtyCompoundBoundsCache = function () { }); return this; }; - elesfn$b.updateCompoundBounds = function () { var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - var cy = this.cy(); // not possible to do on non-compound graphs or with the style disabled + var cy = this.cy(); + // not possible to do on non-compound graphs or with the style disabled if (!cy.styleEnabled() || !cy.hasCompoundNodes()) { return this; - } // save cycles when batching -- but bounds will be stale (or not exist yet) - + } + // save cycles when batching -- but bounds will be stale (or not exist yet) if (!force && cy.batching()) { return this; } - function update(parent) { if (!parent.isParent()) { return; } - var _p = parent._private; var children = parent.children(); var includeLabels = parent.pstyle('compound-sizing-wrt-labels').value === 'include'; @@ -30025,8 +29511,9 @@ elesfn$b.updateCompoundBounds = function () { // cache cycle (i.e. before fired events) useCache: false }); - var pos = _p.position; // if children take up zero area then keep position and fall back on stylesheet w/h + var pos = _p.position; + // if children take up zero area then keep position and fall back on stylesheet w/h if (bb.w === 0 || bb.h === 0) { bb = { w: parent.pstyle('width').pfValue, @@ -30037,42 +29524,33 @@ elesfn$b.updateCompoundBounds = function () { bb.y1 = pos.y - bb.h / 2; bb.y2 = pos.y + bb.h / 2; } - function computeBiasValues(propDiff, propBias, propBiasComplement) { var biasDiff = 0; var biasComplementDiff = 0; var biasTotal = propBias + propBiasComplement; - if (propDiff > 0 && biasTotal > 0) { biasDiff = propBias / biasTotal * propDiff; biasComplementDiff = propBiasComplement / biasTotal * propDiff; } - return { biasDiff: biasDiff, biasComplementDiff: biasComplementDiff }; } - function computePaddingValues(width, height, paddingObject, relativeTo) { // Assuming percentage is number from 0 to 1 if (paddingObject.units === '%') { switch (relativeTo) { case 'width': return width > 0 ? paddingObject.pfValue * width : 0; - case 'height': return height > 0 ? paddingObject.pfValue * height : 0; - case 'average': return width > 0 && height > 0 ? paddingObject.pfValue * (width + height) / 2 : 0; - case 'min': return width > 0 && height > 0 ? width > height ? paddingObject.pfValue * height : paddingObject.pfValue * width : 0; - case 'max': return width > 0 && height > 0 ? width > height ? paddingObject.pfValue * width : paddingObject.pfValue * height : 0; - default: return 0; } @@ -30082,31 +29560,22 @@ elesfn$b.updateCompoundBounds = function () { return 0; } } - var leftVal = min.width.left.value; - if (min.width.left.units === 'px' && min.width.val > 0) { leftVal = leftVal * 100 / min.width.val; } - var rightVal = min.width.right.value; - if (min.width.right.units === 'px' && min.width.val > 0) { rightVal = rightVal * 100 / min.width.val; } - var topVal = min.height.top.value; - if (min.height.top.units === 'px' && min.height.val > 0) { topVal = topVal * 100 / min.height.val; } - var bottomVal = min.height.bottom.value; - if (min.height.bottom.units === 'px' && min.height.val > 0) { bottomVal = bottomVal * 100 / min.height.val; } - var widthBiasDiffs = computeBiasValues(min.width.val - bb.w, leftVal, rightVal); var diffLeft = widthBiasDiffs.biasDiff; var diffRight = widthBiasDiffs.biasComplementDiff; @@ -30119,42 +29588,34 @@ elesfn$b.updateCompoundBounds = function () { _p.autoHeight = Math.max(bb.h, min.height.val); pos.y = (-diffTop + bb.y1 + bb.y2 + diffBottom) / 2; } - for (var i = 0; i < this.length; i++) { var ele = this[i]; var _p = ele._private; - if (!_p.compoundBoundsClean || force) { update(ele); - if (!cy.batching()) { _p.compoundBoundsClean = true; } } } - return this; }; - var noninf = function noninf(x) { if (x === Infinity || x === -Infinity) { return 0; } - return x; }; - var updateBounds = function updateBounds(b, x1, y1, x2, y2) { // don't update with zero area boxes if (x2 - x1 === 0 || y2 - y1 === 0) { return; - } // don't update with null dim - + } + // don't update with null dim if (x1 == null || y1 == null || x2 == null || y2 == null) { return; } - b.x1 = x1 < b.x1 ? x1 : b.x1; b.x2 = x2 > b.x2 ? x2 : b.x2; b.y1 = y1 < b.y1 ? y1 : b.y1; @@ -30162,31 +29623,25 @@ var updateBounds = function updateBounds(b, x1, y1, x2, y2) { b.w = b.x2 - b.x1; b.h = b.y2 - b.y1; }; - var updateBoundsFromBox = function updateBoundsFromBox(b, b2) { if (b2 == null) { return b; } - return updateBounds(b, b2.x1, b2.y1, b2.x2, b2.y2); }; - var prefixedProperty = function prefixedProperty(obj, field, prefix) { return getPrefixedProperty(obj, field, prefix); }; - var updateBoundsFromArrow = function updateBoundsFromArrow(bounds, ele, prefix) { if (ele.cy().headless()) { return; } - var _p = ele._private; var rstyle = _p.rstyle; var halfArW = rstyle.arrowWidth / 2; var arrowType = ele.pstyle(prefix + '-arrow-shape').value; var x; var y; - if (arrowType !== 'none') { if (prefix === 'source') { x = rstyle.srcX; @@ -30197,9 +29652,9 @@ var updateBoundsFromArrow = function updateBoundsFromArrow(bounds, ele, prefix) } else { x = rstyle.midX; y = rstyle.midY; - } // always store the individual arrow bounds - + } + // always store the individual arrow bounds var bbs = _p.arrowBounds = _p.arrowBounds || {}; var bb = bbs[prefix] = bbs[prefix] || {}; bb.x1 = x - halfArW; @@ -30212,24 +29667,19 @@ var updateBoundsFromArrow = function updateBoundsFromArrow(bounds, ele, prefix) updateBounds(bounds, bb.x1, bb.y1, bb.x2, bb.y2); } }; - var updateBoundsFromLabel = function updateBoundsFromLabel(bounds, ele, prefix) { if (ele.cy().headless()) { return; } - var prefixDash; - if (prefix) { prefixDash = prefix + '-'; } else { prefixDash = ''; } - var _p = ele._private; var rstyle = _p.rstyle; var label = ele.pstyle(prefixDash + 'label').strValue; - if (label) { var halign = ele.pstyle('text-halign'); var valign = ele.pstyle('text-valign'); @@ -30252,7 +29702,6 @@ var updateBoundsFromLabel = function updateBoundsFromLabel(bounds, ele, prefix) var lw_2 = lw / 2; var lh_2 = lh / 2; var lx1, lx2, ly1, ly2; - if (isEdge) { lx1 = labelX - lw_2; lx2 = labelX + lw_2; @@ -30264,42 +29713,38 @@ var updateBoundsFromLabel = function updateBoundsFromLabel(bounds, ele, prefix) lx1 = labelX - lw; lx2 = labelX; break; - case 'center': lx1 = labelX - lw_2; lx2 = labelX + lw_2; break; - case 'right': lx1 = labelX; lx2 = labelX + lw; break; } - switch (valign.value) { case 'top': ly1 = labelY - lh; ly2 = labelY; break; - case 'center': ly1 = labelY - lh_2; ly2 = labelY + lh_2; break; - case 'bottom': ly1 = labelY; ly2 = labelY + lh; break; } - } // shift by margin and expand by outline and border - + } + // shift by margin and expand by outline and border lx1 += marginX - Math.max(outlineWidth, halfBorderWidth) - padding - marginOfError; lx2 += marginX + Math.max(outlineWidth, halfBorderWidth) + padding + marginOfError; ly1 += marginY - Math.max(outlineWidth, halfBorderWidth) - padding - marginOfError; - ly2 += marginY + Math.max(outlineWidth, halfBorderWidth) + padding + marginOfError; // always store the unrotated label bounds separately + ly2 += marginY + Math.max(outlineWidth, halfBorderWidth) + padding + marginOfError; + // always store the unrotated label bounds separately var bbPrefix = prefix || 'main'; var bbs = _p.labelBounds; var bb = bbs[bbPrefix] = bbs[bbPrefix] || {}; @@ -30311,37 +29756,32 @@ var updateBoundsFromLabel = function updateBoundsFromLabel(bounds, ele, prefix) bb.h = ly2 - ly1; var isAutorotate = isEdge && rotation.strValue === 'autorotate'; var isPfValue = rotation.pfValue != null && rotation.pfValue !== 0; - if (isAutorotate || isPfValue) { var theta = isAutorotate ? prefixedProperty(_p.rstyle, 'labelAngle', prefix) : rotation.pfValue; var cos = Math.cos(theta); - var sin = Math.sin(theta); // rotation point (default value for center-center) + var sin = Math.sin(theta); + // rotation point (default value for center-center) var xo = (lx1 + lx2) / 2; var yo = (ly1 + ly2) / 2; - if (!isEdge) { switch (halign.value) { case 'left': xo = lx2; break; - case 'right': xo = lx1; break; } - switch (valign.value) { case 'top': yo = ly2; break; - case 'bottom': yo = ly1; break; } } - var rotate = function rotate(x, y) { x = x - xo; y = y - yo; @@ -30350,7 +29790,6 @@ var updateBoundsFromLabel = function updateBoundsFromLabel(bounds, ele, prefix) y: x * sin + y * cos + yo }; }; - var px1y1 = rotate(lx1, ly1); var px1y2 = rotate(lx1, ly2); var px2y1 = rotate(lx2, ly1); @@ -30360,7 +29799,6 @@ var updateBoundsFromLabel = function updateBoundsFromLabel(bounds, ele, prefix) ly1 = Math.min(px1y1.y, px1y2.y, px2y1.y, px2y2.y); ly2 = Math.max(px1y1.y, px1y2.y, px2y1.y, px2y2.y); } - var bbPrefixRot = bbPrefix + 'Rot'; var bbRot = bbs[bbPrefixRot] = bbs[bbPrefixRot] || {}; bbRot.x1 = lx1; @@ -30372,11 +29810,10 @@ var updateBoundsFromLabel = function updateBoundsFromLabel(bounds, ele, prefix) updateBounds(bounds, lx1, ly1, lx2, ly2); updateBounds(_p.labelBounds.all, lx1, ly1, lx2, ly2); } - return bounds; -}; // get the bounding box of the elements (in raw model position) - +}; +// get the bounding box of the elements (in raw model position) var boundingBoxImpl = function boundingBoxImpl(ele, options) { var cy = ele._private.cy; var styleEnabled = cy.styleEnabled(); @@ -30386,63 +29823,54 @@ var boundingBoxImpl = function boundingBoxImpl(ele, options) { var isNode = ele.isNode(); var isEdge = ele.isEdge(); var ex1, ex2, ey1, ey2; // extrema of body / lines - var x, y; // node pos - var rstyle = _p.rstyle; - var manualExpansion = isNode && styleEnabled ? ele.pstyle('bounds-expansion').pfValue : [0]; // must use `display` prop only, as reading `compound.width()` causes recursion - // (other factors like width values will be considered later in this function anyway) + var manualExpansion = isNode && styleEnabled ? ele.pstyle('bounds-expansion').pfValue : [0]; + // must use `display` prop only, as reading `compound.width()` causes recursion + // (other factors like width values will be considered later in this function anyway) var isDisplayed = function isDisplayed(ele) { return ele.pstyle('display').value !== 'none'; }; + var displayed = !styleEnabled || isDisplayed(ele) - var displayed = !styleEnabled || isDisplayed(ele) // must take into account connected nodes b/c of implicit edge hiding on display:none node + // must take into account connected nodes b/c of implicit edge hiding on display:none node && (!isEdge || isDisplayed(ele.source()) && isDisplayed(ele.target())); - if (displayed) { // displayed suffices, since we will find zero area eles anyway var overlayOpacity = 0; var overlayPadding = 0; - if (styleEnabled && options.includeOverlays) { overlayOpacity = ele.pstyle('overlay-opacity').value; - if (overlayOpacity !== 0) { overlayPadding = ele.pstyle('overlay-padding').value; } } - var underlayOpacity = 0; var underlayPadding = 0; - if (styleEnabled && options.includeUnderlays) { underlayOpacity = ele.pstyle('underlay-opacity').value; - if (underlayOpacity !== 0) { underlayPadding = ele.pstyle('underlay-padding').value; } } - var padding = Math.max(overlayPadding, underlayPadding); var w = 0; var wHalf = 0; - if (styleEnabled) { w = ele.pstyle('width').pfValue; wHalf = w / 2; } - if (isNode && options.includeNodes) { var pos = ele.position(); x = pos.x; y = pos.y; - var _w = ele.outerWidth(); - var halfW = _w / 2; var h = ele.outerHeight(); - var halfH = h / 2; // handle node dimensions + var halfH = h / 2; + + // handle node dimensions ///////////////////////// ex1 = x - halfW; @@ -30452,59 +29880,57 @@ var boundingBoxImpl = function boundingBoxImpl(ele, options) { updateBounds(bounds, ex1, ey1, ex2, ey2); } else if (isEdge && options.includeEdges) { if (styleEnabled && !headless) { - var curveStyle = ele.pstyle('curve-style').strValue; // handle edge dimensions (rough box estimate) + var curveStyle = ele.pstyle('curve-style').strValue; + + // handle edge dimensions (rough box estimate) ////////////////////////////////////////////// ex1 = Math.min(rstyle.srcX, rstyle.midX, rstyle.tgtX); ex2 = Math.max(rstyle.srcX, rstyle.midX, rstyle.tgtX); ey1 = Math.min(rstyle.srcY, rstyle.midY, rstyle.tgtY); - ey2 = Math.max(rstyle.srcY, rstyle.midY, rstyle.tgtY); // take into account edge width + ey2 = Math.max(rstyle.srcY, rstyle.midY, rstyle.tgtY); + // take into account edge width ex1 -= wHalf; ex2 += wHalf; ey1 -= wHalf; ey2 += wHalf; - updateBounds(bounds, ex1, ey1, ex2, ey2); // precise edges + updateBounds(bounds, ex1, ey1, ex2, ey2); + + // precise edges //////////////// if (curveStyle === 'haystack') { var hpts = rstyle.haystackPts; - if (hpts && hpts.length === 2) { ex1 = hpts[0].x; ey1 = hpts[0].y; ex2 = hpts[1].x; ey2 = hpts[1].y; - if (ex1 > ex2) { var temp = ex1; ex1 = ex2; ex2 = temp; } - if (ey1 > ey2) { var _temp = ey1; ey1 = ey2; ey2 = _temp; } - updateBounds(bounds, ex1 - wHalf, ey1 - wHalf, ex2 + wHalf, ey2 + wHalf); } } else if (curveStyle === 'bezier' || curveStyle === 'unbundled-bezier' || curveStyle === 'segments' || curveStyle === 'taxi') { var pts; - switch (curveStyle) { case 'bezier': case 'unbundled-bezier': pts = rstyle.bezierPts; break; - case 'segments': case 'taxi': pts = rstyle.linePts; break; } - if (pts != null) { for (var j = 0; j < pts.length; j++) { var pt = pts[j]; @@ -30516,11 +29942,12 @@ var boundingBoxImpl = function boundingBoxImpl(ele, options) { } } } // bezier-like or segment-like edge - } else { // headless or style disabled + // fallback on source and target positions ////////////////////////////////////////// + var n1 = ele.source(); var n1pos = n1.position(); var n2 = ele.target(); @@ -30529,56 +29956,54 @@ var boundingBoxImpl = function boundingBoxImpl(ele, options) { ex2 = n2pos.x; ey1 = n1pos.y; ey2 = n2pos.y; - if (ex1 > ex2) { var _temp2 = ex1; ex1 = ex2; ex2 = _temp2; } - if (ey1 > ey2) { var _temp3 = ey1; ey1 = ey2; ey2 = _temp3; - } // take into account edge width - + } + // take into account edge width ex1 -= wHalf; ex2 += wHalf; ey1 -= wHalf; ey2 += wHalf; updateBounds(bounds, ex1, ey1, ex2, ey2); } // headless or style disabled - } // edges + // handle edge arrow size ///////////////////////// - if (styleEnabled && options.includeEdges && isEdge) { updateBoundsFromArrow(bounds, ele, 'mid-source'); updateBoundsFromArrow(bounds, ele, 'mid-target'); updateBoundsFromArrow(bounds, ele, 'source'); updateBoundsFromArrow(bounds, ele, 'target'); - } // ghost - //////// + } + // ghost + //////// if (styleEnabled) { var ghost = ele.pstyle('ghost').value === 'yes'; - if (ghost) { var gx = ele.pstyle('ghost-offset-x').pfValue; var gy = ele.pstyle('ghost-offset-y').pfValue; updateBounds(bounds, bounds.x1 + gx, bounds.y1 + gy, bounds.x2 + gx, bounds.y2 + gy); } - } // always store the body bounds separately from the labels - + } + // always store the body bounds separately from the labels var bbBody = _p.bodyBounds = _p.bodyBounds || {}; assignBoundingBox(bbBody, bounds); expandBoundingBoxSides(bbBody, manualExpansion); expandBoundingBox(bbBody, 1); // expand to work around browser dimension inaccuracies + // overlay ////////// @@ -30588,66 +30013,57 @@ var boundingBoxImpl = function boundingBoxImpl(ele, options) { ey1 = bounds.y1; ey2 = bounds.y2; updateBounds(bounds, ex1 - padding, ey1 - padding, ex2 + padding, ey2 + padding); - } // always store the body bounds separately from the labels - + } + // always store the body bounds separately from the labels var bbOverlay = _p.overlayBounds = _p.overlayBounds || {}; assignBoundingBox(bbOverlay, bounds); expandBoundingBoxSides(bbOverlay, manualExpansion); expandBoundingBox(bbOverlay, 1); // expand to work around browser dimension inaccuracies + // handle label dimensions ////////////////////////// var bbLabels = _p.labelBounds = _p.labelBounds || {}; - if (bbLabels.all != null) { clearBoundingBox(bbLabels.all); } else { bbLabels.all = makeBoundingBox(); } - if (styleEnabled && options.includeLabels) { if (options.includeMainLabels) { updateBoundsFromLabel(bounds, ele, null); } - if (isEdge) { if (options.includeSourceLabels) { updateBoundsFromLabel(bounds, ele, 'source'); } - if (options.includeTargetLabels) { updateBoundsFromLabel(bounds, ele, 'target'); } } } // style enabled for labels - } // if displayed - bounds.x1 = noninf(bounds.x1); bounds.y1 = noninf(bounds.y1); bounds.x2 = noninf(bounds.x2); bounds.y2 = noninf(bounds.y2); bounds.w = noninf(bounds.x2 - bounds.x1); bounds.h = noninf(bounds.y2 - bounds.y1); - if (bounds.w > 0 && bounds.h > 0 && displayed) { - expandBoundingBoxSides(bounds, manualExpansion); // expand bounds by 1 because antialiasing can increase the visual/effective size by 1 on all sides + expandBoundingBoxSides(bounds, manualExpansion); + // expand bounds by 1 because antialiasing can increase the visual/effective size by 1 on all sides expandBoundingBox(bounds, 1); } - return bounds; }; - var getKey = function getKey(opts) { var i = 0; - var tf = function tf(val) { return (val ? 1 : 0) << i++; }; - var key = 0; key += tf(opts.incudeNodes); key += tf(opts.includeEdges); @@ -30658,22 +30074,18 @@ var getKey = function getKey(opts) { key += tf(opts.includeOverlays); return key; }; - var getBoundingBoxPosKey = function getBoundingBoxPosKey(ele) { if (ele.isEdge()) { var p1 = ele.source().position(); var p2 = ele.target().position(); - var r = function r(x) { return Math.round(x); }; - return hashIntsArray([r(p1.x), r(p1.y), r(p2.x), r(p2.y)]); } else { return 0; } }; - var cachedBoundingBoxImpl = function cachedBoundingBoxImpl(ele, opts) { var _p = ele._private; var bb; @@ -30683,30 +30095,25 @@ var cachedBoundingBoxImpl = function cachedBoundingBoxImpl(ele, opts) { var currPosKey = getBoundingBoxPosKey(ele); var isPosKeySame = _p.bbCachePosKey === currPosKey; var useCache = opts.useCache && isPosKeySame; - var isDirty = function isDirty(ele) { return ele._private.bbCache == null || ele._private.styleDirty; }; - var needRecalc = !useCache || isDirty(ele) || isEdge && isDirty(ele.source()) || isDirty(ele.target()); - if (needRecalc) { if (!isPosKeySame) { ele.recalculateRenderedStyle(useCache); } - bb = boundingBoxImpl(ele, defBbOpts); _p.bbCache = bb; _p.bbCachePosKey = currPosKey; } else { bb = _p.bbCache; - } // not using def opts => need to build up bb from combination of sub bbs - + } + // not using def opts => need to build up bb from combination of sub bbs if (!usingDefOpts) { var isNode = ele.isNode(); bb = makeBoundingBox(); - if (opts.includeNodes && isNode || opts.includeEdges && !isNode) { if (opts.includeOverlays) { updateBoundsFromBox(bb, _p.overlayBounds); @@ -30714,7 +30121,6 @@ var cachedBoundingBoxImpl = function cachedBoundingBoxImpl(ele, opts) { updateBoundsFromBox(bb, _p.bodyBounds); } } - if (opts.includeLabels) { if (opts.includeMainLabels && (!isEdge || opts.includeSourceLabels && opts.includeTargetLabels)) { updateBoundsFromBox(bb, _p.labelBounds.all); @@ -30722,24 +30128,19 @@ var cachedBoundingBoxImpl = function cachedBoundingBoxImpl(ele, opts) { if (opts.includeMainLabels) { updateBoundsFromBox(bb, _p.labelBounds.mainRot); } - if (opts.includeSourceLabels) { updateBoundsFromBox(bb, _p.labelBounds.sourceRot); } - if (opts.includeTargetLabels) { updateBoundsFromBox(bb, _p.labelBounds.targetRot); } } } - bb.w = bb.x2 - bb.x1; bb.h = bb.y2 - bb.y1; } - return bb; }; - var defBbOpts = { includeNodes: true, includeEdges: true, @@ -30753,19 +30154,18 @@ var defBbOpts = { }; var defBbOptsKey = getKey(defBbOpts); var filledBbOpts = defaults$g(defBbOpts); - elesfn$b.boundingBox = function (options) { - var bounds; // the main usecase is ele.boundingBox() for a single element with no/def options + var bounds; + + // the main usecase is ele.boundingBox() for a single element with no/def options // specified s.t. the cache is used, so check for this case to make it faster by // avoiding the overhead of the rest of the function - if (this.length === 1 && this[0]._private.bbCache != null && !this[0]._private.styleDirty && (options === undefined || options.useCache === undefined || options.useCache === true)) { if (options === undefined) { options = defBbOpts; } else { options = filledBbOpts(options); } - bounds = cachedBoundingBoxImpl(this[0], options); } else { bounds = makeBoundingBox(); @@ -30774,7 +30174,6 @@ elesfn$b.boundingBox = function (options) { var eles = this; var cy = eles.cy(); var styleEnabled = cy.styleEnabled(); - if (styleEnabled) { for (var i = 0; i < eles.length; i++) { var ele = eles[i]; @@ -30785,15 +30184,12 @@ elesfn$b.boundingBox = function (options) { ele.recalculateRenderedStyle(useCache); } } - this.updateCompoundBounds(!options.useCache); - for (var _i = 0; _i < eles.length; _i++) { var _ele = eles[_i]; updateBoundsFromBox(bounds, cachedBoundingBoxImpl(_ele, opts)); } } - bounds.x1 = noninf(bounds.x1); bounds.y1 = noninf(bounds.y1); bounds.x2 = noninf(bounds.x2); @@ -30802,7 +30198,6 @@ elesfn$b.boundingBox = function (options) { bounds.h = noninf(bounds.y2 - bounds.y1); return bounds; }; - elesfn$b.dirtyBoundingBoxCache = function () { for (var i = 0; i < this.length; i++) { var _p = this[i]._private; @@ -30822,47 +30217,39 @@ elesfn$b.dirtyBoundingBoxCache = function () { _p.arrowBounds['mid-source'] = null; _p.arrowBounds['mid-target'] = null; } - this.emitAndNotify('bounds'); return this; -}; // private helper to get bounding box for custom node positions +}; + +// private helper to get bounding box for custom node positions // - good for perf in certain cases but currently requires dirtying the rendered style // - would be better to not modify the nodes but the nodes are read directly everywhere in the renderer... // - try to use for only things like discrete layouts where the node position would change anyway - - elesfn$b.boundingBoxAt = function (fn) { var nodes = this.nodes(); var cy = this.cy(); var hasCompoundNodes = cy.hasCompoundNodes(); var parents = cy.collection(); - if (hasCompoundNodes) { parents = nodes.filter(function (node) { return node.isParent(); }); nodes = nodes.not(parents); } - if (plainObject(fn)) { var obj = fn; - fn = function fn() { return obj; }; } - var storeOldPos = function storeOldPos(node, i) { return node._private.bbAtOldPos = fn(node, i); }; - var getOldPos = function getOldPos(node) { return node._private.bbAtOldPos; }; - cy.startBatch(); nodes.forEach(storeOldPos).silentPositions(fn); - if (hasCompoundNodes) { parents.dirtyCompoundBoundsCache(); parents.dirtyBoundingBoxCache(); @@ -30873,7 +30260,6 @@ elesfn$b.boundingBoxAt = function (fn) { useCache: false })); nodes.silentPositions(getOldPos); - if (hasCompoundNodes) { parents.dirtyCompoundBoundsCache(); parents.dirtyBoundingBoxCache(); @@ -30883,41 +30269,34 @@ elesfn$b.boundingBoxAt = function (fn) { cy.endBatch(); return bb; }; - fn$3.boundingbox = fn$3.bb = fn$3.boundingBox; fn$3.renderedBoundingbox = fn$3.renderedBoundingBox; var bounds = elesfn$b; var fn$2, elesfn$a; fn$2 = elesfn$a = {}; - var defineDimFns = function defineDimFns(opts) { opts.uppercaseName = capitalize(opts.name); opts.autoName = 'auto' + opts.uppercaseName; opts.labelName = 'label' + opts.uppercaseName; opts.outerName = 'outer' + opts.uppercaseName; opts.uppercaseOuterName = capitalize(opts.outerName); - fn$2[opts.name] = function dimImpl() { var ele = this[0]; var _p = ele._private; var cy = _p.cy; var styleEnabled = cy._private.styleEnabled; - if (ele) { if (styleEnabled) { if (ele.isParent()) { ele.updateCompoundBounds(); return _p[opts.autoName] || 0; } - var d = ele.pstyle(opts.name); - switch (d.strValue) { case 'label': ele.recalculateRenderedStyle(); return _p.rstyle[opts.labelName] || 0; - default: return d.pfValue; } @@ -30926,18 +30305,15 @@ var defineDimFns = function defineDimFns(opts) { } } }; - fn$2['outer' + opts.uppercaseName] = function outerDimImpl() { var ele = this[0]; var _p = ele._private; var cy = _p.cy; var styleEnabled = cy._private.styleEnabled; - if (ele) { if (styleEnabled) { var dim = ele[opts.name](); var border = ele.pstyle('border-width').pfValue; // n.b. 1/2 each side - var padding = 2 * ele.padding(); return dim + border + padding; } else { @@ -30945,40 +30321,32 @@ var defineDimFns = function defineDimFns(opts) { } } }; - fn$2['rendered' + opts.uppercaseName] = function renderedDimImpl() { var ele = this[0]; - if (ele) { var d = ele[opts.name](); return d * this.cy().zoom(); } }; - fn$2['rendered' + opts.uppercaseOuterName] = function renderedOuterDimImpl() { var ele = this[0]; - if (ele) { var od = ele[opts.outerName](); return od * this.cy().zoom(); } }; }; - defineDimFns({ name: 'width' }); defineDimFns({ name: 'height' }); - elesfn$a.padding = function () { var ele = this[0]; var _p = ele._private; - if (ele.isParent()) { ele.updateCompoundBounds(); - if (_p.autoPadding !== undefined) { return _p.autoPadding; } else { @@ -30988,17 +30356,14 @@ elesfn$a.padding = function () { return ele.pstyle('padding').pfValue; } }; - elesfn$a.paddedHeight = function () { var ele = this[0]; return ele.height() + 2 * ele.padding(); }; - elesfn$a.paddedWidth = function () { var ele = this[0]; return ele.width() + 2 * ele.padding(); }; - var widthHeight = elesfn$a; var ifEdge = function ifEdge(ele, getValue) { @@ -31006,14 +30371,12 @@ var ifEdge = function ifEdge(ele, getValue) { return getValue(ele); } }; - var ifEdgeRenderedPosition = function ifEdgeRenderedPosition(ele, getPoint) { if (ele.isEdge()) { var cy = ele.cy(); return modelToRenderedPosition(getPoint(ele), cy.zoom(), cy.pan()); } }; - var ifEdgeRenderedPositions = function ifEdgeRenderedPositions(ele, getPoints) { if (ele.isEdge()) { var cy = ele.cy(); @@ -31024,27 +30387,21 @@ var ifEdgeRenderedPositions = function ifEdgeRenderedPositions(ele, getPoints) { }); } }; - var controlPoints = function controlPoints(ele) { return ele.renderer().getControlPoints(ele); }; - var segmentPoints = function segmentPoints(ele) { return ele.renderer().getSegmentPoints(ele); }; - var sourceEndpoint = function sourceEndpoint(ele) { return ele.renderer().getSourceEndpoint(ele); }; - var targetEndpoint = function targetEndpoint(ele) { return ele.renderer().getTargetEndpoint(ele); }; - var midpoint = function midpoint(ele) { return ele.renderer().getEdgeMidpoint(ele); }; - var pts = { controlPoints: { get: controlPoints, @@ -31064,19 +30421,15 @@ var pts = { get: midpoint } }; - var renderedName = function renderedName(name) { return 'rendered' + name[0].toUpperCase() + name.substr(1); }; - var edgePoints = Object.keys(pts).reduce(function (obj, name) { var spec = pts[name]; var rName = renderedName(name); - obj[name] = function () { return ifEdge(this, spec.get); }; - if (spec.mult) { obj[rName] = function () { return ifEdgeRenderedPositions(this, spec.get); @@ -31086,7 +30439,6 @@ var edgePoints = Object.keys(pts).reduce(function (obj, name) { return ifEdgeRenderedPosition(this, spec.get); }; } - return obj; }, {}); @@ -31099,31 +30451,30 @@ https://jquery.org/license/ https://tldrlegal.com/license/mit-license https://github.com/jquery/jquery/blob/master/src/event.js */ + var Event = function Event(src, props) { this.recycle(src, props); }; - function returnFalse() { return false; } - function returnTrue() { return true; -} // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html - +} +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html Event.prototype = { instanceString: function instanceString() { return 'event'; }, recycle: function recycle(src, props) { this.isImmediatePropagationStopped = this.isPropagationStopped = this.isDefaultPrevented = returnFalse; - if (src != null && src.preventDefault) { // Browser Event object - this.type = src.type; // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. + this.type = src.type; + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = src.defaultPrevented ? returnTrue : returnFalse; } else if (src != null && src.type) { // Plain object containing all event details @@ -31131,9 +30482,9 @@ Event.prototype = { } else { // Event string this.type = src; - } // Put explicitly provided properties onto the event object - + } + // Put explicitly provided properties onto the event object if (props != null) { // more efficient to manually copy fields we use this.originalEvent = props.originalEvent; @@ -31145,7 +30496,6 @@ Event.prototype = { this.namespace = props.namespace; this.layout = props.layout; } - if (this.cy != null && this.position != null && this.renderedPosition == null) { // create a rendered position based on the passed position var pos = this.position; @@ -31155,20 +30505,19 @@ Event.prototype = { x: pos.x * zoom + pan.x, y: pos.y * zoom + pan.y }; - } // Create a timestamp if incoming event doesn't have one - + } + // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || Date.now(); }, preventDefault: function preventDefault() { this.isDefaultPrevented = returnTrue; var e = this.originalEvent; - if (!e) { return; - } // if preventDefault exists run it on the original event - + } + // if preventDefault exists run it on the original event if (e.preventDefault) { e.preventDefault(); } @@ -31176,12 +30525,11 @@ Event.prototype = { stopPropagation: function stopPropagation() { this.isPropagationStopped = returnTrue; var e = this.originalEvent; - if (!e) { return; - } // if stopPropagation exists run it on the original event - + } + // if stopPropagation exists run it on the original event if (e.stopPropagation) { e.stopPropagation(); } @@ -31196,70 +30544,55 @@ Event.prototype = { }; var eventRegex = /^([^.]+)(\.(?:[^.]+))?$/; // regex for matching event strings (e.g. "click.namespace") - var universalNamespace = '.*'; // matches as if no namespace specified and prevents users from unbinding accidentally var defaults$8 = { qualifierCompare: function qualifierCompare(q1, q2) { return q1 === q2; }, - eventMatches: function - /*context, listener, eventObj*/ - eventMatches() { + eventMatches: function eventMatches( /*context, listener, eventObj*/ + ) { return true; }, - addEventFields: function - /*context, evt*/ - addEventFields() {}, - callbackContext: function callbackContext(context - /*, listener, eventObj*/ - ) { + addEventFields: function addEventFields( /*context, evt*/ + ) {}, + callbackContext: function callbackContext(context /*, listener, eventObj*/) { return context; }, - beforeEmit: function - /* context, listener, eventObj */ - beforeEmit() {}, - afterEmit: function - /* context, listener, eventObj */ - afterEmit() {}, - bubble: function - /*context*/ - bubble() { + beforeEmit: function beforeEmit( /* context, listener, eventObj */ + ) {}, + afterEmit: function afterEmit( /* context, listener, eventObj */ + ) {}, + bubble: function bubble( /*context*/ + ) { return false; }, - parent: function - /*context*/ - parent() { + parent: function parent( /*context*/ + ) { return null; }, context: null }; var defaultsKeys = Object.keys(defaults$8); var emptyOpts = {}; - function Emitter() { var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : emptyOpts; var context = arguments.length > 1 ? arguments[1] : undefined; - // micro-optimisation vs Object.assign() -- reduces Element instantiation time for (var i = 0; i < defaultsKeys.length; i++) { var key = defaultsKeys[i]; this[key] = opts[key] || defaults$8[key]; } - this.context = context || this.context; this.listeners = []; this.emitting = 0; } - var p = Emitter.prototype; - var forEachEvent = function forEachEvent(self, handler, events, qualifier, callback, conf, confOverrides) { if (fn$6(qualifier)) { callback = qualifier; qualifier = null; } - if (confOverrides) { if (conf == null) { conf = confOverrides; @@ -31267,27 +30600,21 @@ var forEachEvent = function forEachEvent(self, handler, events, qualifier, callb conf = extend({}, conf, confOverrides); } } - var eventList = array(events) ? events : events.split(/\s+/); - for (var i = 0; i < eventList.length; i++) { var evt = eventList[i]; - if (emptyString(evt)) { continue; } - var match = evt.match(eventRegex); // type[.namespace] if (match) { var type = match[1]; var namespace = match[2] ? match[2] : null; var ret = handler(self, evt, type, namespace, qualifier, callback, conf); - if (ret === false) { break; } // allow exiting early - } } }; @@ -31296,7 +30623,6 @@ var makeEventObj = function makeEventObj(self, obj) { self.addEventFields(self.context, obj); return new Event(obj.type, obj); }; - var forEachEventObj = function forEachEventObj(self, handler, events) { if (event(events)) { handler(self, events); @@ -31305,16 +30631,12 @@ var forEachEventObj = function forEachEventObj(self, handler, events) { handler(self, makeEventObj(self, events)); return; } - var eventList = array(events) ? events : events.split(/\s+/); - for (var i = 0; i < eventList.length; i++) { var evt = eventList[i]; - if (emptyString(evt)) { continue; } - var match = evt.match(eventRegex); // type[.namespace] if (match) { @@ -31329,7 +30651,6 @@ var forEachEventObj = function forEachEventObj(self, handler, events) { } } }; - p.on = p.addListener = function (events, qualifier, callback, conf, confOverrides) { forEachEvent(this, function (self, event, type, namespace, qualifier, callback, conf) { if (fn$6(callback)) { @@ -31345,60 +30666,46 @@ p.on = p.addListener = function (events, qualifier, callback, conf, confOverride qualifier: qualifier, // a restriction on whether to match this emitter conf: conf // additional configuration - }); } }, events, qualifier, callback, conf, confOverrides); return this; }; - p.one = function (events, qualifier, callback, conf) { return this.on(events, qualifier, callback, conf, { one: true }); }; - p.removeListener = p.off = function (events, qualifier, callback, conf) { var _this = this; - if (this.emitting !== 0) { this.listeners = copyArray(this.listeners); } - var listeners = this.listeners; - var _loop = function _loop(i) { var listener = listeners[i]; - forEachEvent(_this, function (self, event, type, namespace, qualifier, callback - /*, conf*/ - ) { + forEachEvent(_this, function (self, event, type, namespace, qualifier, callback /*, conf*/) { if ((listener.type === type || events === '*') && (!namespace && listener.namespace !== '.*' || listener.namespace === namespace) && (!qualifier || self.qualifierCompare(listener.qualifier, qualifier)) && (!callback || listener.callback === callback)) { listeners.splice(i, 1); return false; } }, events, qualifier, callback, conf); }; - for (var i = listeners.length - 1; i >= 0; i--) { _loop(i); } - return this; }; - p.removeAllListeners = function () { return this.removeListener('*'); }; - p.emit = p.trigger = function (events, extraParams, manualCallback) { var listeners = this.listeners; var numListenersBeforeEmit = listeners.length; this.emitting++; - if (!array(extraParams)) { extraParams = [extraParams]; } - forEachEventObj(this, function (self, eventObj) { if (manualCallback != null) { listeners = [{ @@ -31409,42 +30716,32 @@ p.emit = p.trigger = function (events, extraParams, manualCallback) { }]; numListenersBeforeEmit = listeners.length; } - var _loop2 = function _loop2(i) { var listener = listeners[i]; - if (listener.type === eventObj.type && (!listener.namespace || listener.namespace === eventObj.namespace || listener.namespace === universalNamespace) && self.eventMatches(self.context, listener, eventObj)) { var args = [eventObj]; - if (extraParams != null) { push(args, extraParams); } - self.beforeEmit(self.context, listener, eventObj); - if (listener.conf && listener.conf.one) { self.listeners = self.listeners.filter(function (l) { return l !== listener; }); } - var context = self.callbackContext(self.context, listener, eventObj); var ret = listener.callback.apply(context, args); self.afterEmit(self.context, listener, eventObj); - if (ret === false) { eventObj.stopPropagation(); eventObj.preventDefault(); } } // if listener matches - }; - for (var i = 0; i < numListenersBeforeEmit; i++) { _loop2(i); } // for listener - if (self.bubble(self.context) && !eventObj.isPropagationStopped()) { self.parent(self.context).emit(eventObj, extraParams); } @@ -31463,11 +30760,9 @@ var emitterOptions$1 = { }, eventMatches: function eventMatches(ele, listener, eventObj) { var selector = listener.qualifier; - if (selector != null) { return ele !== eventObj.target && element(eventObj.target) && selector.matches(eventObj.target); } - return true; }, addEventFields: function addEventFields(ele, evt) { @@ -31477,9 +30772,7 @@ var emitterOptions$1 = { callbackContext: function callbackContext(ele, listener, eventObj) { return listener.qualifier != null ? eventObj.target : ele; }, - beforeEmit: function beforeEmit(context, listener - /*, eventObj*/ - ) { + beforeEmit: function beforeEmit(context, listener /*, eventObj*/) { if (listener.conf && listener.conf.once) { listener.conf.onceCollection.removeListener(listener.event, listener.qualifier, listener.callback); } @@ -31491,7 +30784,6 @@ var emitterOptions$1 = { return ele.isChild() ? ele.parent() : ele.cy(); } }; - var argSelector$1 = function argSelector(arg) { if (string(arg)) { return new Selector(arg); @@ -31499,18 +30791,15 @@ var argSelector$1 = function argSelector(arg) { return arg; } }; - var elesfn$9 = { createEmitter: function createEmitter() { for (var i = 0; i < this.length; i++) { var ele = this[i]; var _p = ele._private; - if (!_p.emitter) { _p.emitter = new Emitter(emitterOptions$1, ele); } } - return this; }, emitter: function emitter() { @@ -31518,22 +30807,18 @@ var elesfn$9 = { }, on: function on(events, selector, callback) { var argSel = argSelector$1(selector); - for (var i = 0; i < this.length; i++) { var ele = this[i]; ele.emitter().on(events, argSel, callback); } - return this; }, removeListener: function removeListener(events, selector, callback) { var argSel = argSelector$1(selector); - for (var i = 0; i < this.length; i++) { var ele = this[i]; ele.emitter().removeListener(events, argSel, callback); } - return this; }, removeAllListeners: function removeAllListeners() { @@ -31541,22 +30826,18 @@ var elesfn$9 = { var ele = this[i]; ele.emitter().removeAllListeners(); } - return this; }, one: function one(events, selector, callback) { var argSel = argSelector$1(selector); - for (var i = 0; i < this.length; i++) { var ele = this[i]; ele.emitter().one(events, argSel, callback); } - return this; }, once: function once(events, selector, callback) { var argSel = argSelector$1(selector); - for (var i = 0; i < this.length; i++) { var ele = this[i]; ele.emitter().on(events, argSel, callback, { @@ -31570,7 +30851,6 @@ var elesfn$9 = { var ele = this[i]; ele.emitter().emit(events, extraParams); } - return this; }, emitAndNotify: function emitAndNotify(event, extraParams) { @@ -31578,9 +30858,8 @@ var elesfn$9 = { if (this.length === 0) { return; } // empty collections don't need to notify anything - // notify renderer - + // notify renderer this.cy().notify(event, this); this.emit(event, extraParams); return this; @@ -31603,17 +30882,14 @@ var elesfn$8 = { byGroup: function byGroup() { var nodes = this.spawn(); var edges = this.spawn(); - for (var i = 0; i < this.length; i++) { var ele = this[i]; - if (ele.isNode()) { nodes.push(ele); } else { edges.push(ele); } } - return { nodes: nodes, edges: edges @@ -31628,21 +30904,18 @@ var elesfn$8 = { } else if (fn$6(_filter)) { var filterEles = this.spawn(); var eles = this; - for (var i = 0; i < eles.length; i++) { var ele = eles[i]; var include = thisArg ? _filter.apply(thisArg, [ele, i, eles]) : _filter(ele, i, eles); - if (include) { filterEles.push(ele); } } - return filterEles; } - return this.spawn(); // if not handled by above, give 'em an empty collection }, + not: function not(toRemove) { if (!toRemove) { return this; @@ -31650,18 +30923,14 @@ var elesfn$8 = { if (string(toRemove)) { toRemove = this.filter(toRemove); } - var elements = this.spawn(); - for (var i = 0; i < this.length; i++) { var element = this[i]; var remove = toRemove.has(element); - if (!remove) { elements.push(element); } } - return elements; } }, @@ -31675,70 +30944,57 @@ var elesfn$8 = { var selector = other; return this.filter(selector); } - var elements = this.spawn(); var col1 = this; var col2 = other; var col1Smaller = this.length < other.length; var colS = col1Smaller ? col1 : col2; var colL = col1Smaller ? col2 : col1; - for (var i = 0; i < colS.length; i++) { var ele = colS[i]; - if (colL.has(ele)) { elements.push(ele); } } - return elements; }, xor: function xor(other) { var cy = this._private.cy; - if (string(other)) { other = cy.$(other); } - var elements = this.spawn(); var col1 = this; var col2 = other; - var add = function add(col, other) { for (var i = 0; i < col.length; i++) { var ele = col[i]; var id = ele._private.data.id; var inOther = other.hasElementWithId(id); - if (!inOther) { elements.push(ele); } } }; - add(col1, col2); add(col2, col1); return elements; }, diff: function diff(other) { var cy = this._private.cy; - if (string(other)) { other = cy.$(other); } - var left = this.spawn(); var right = this.spawn(); var both = this.spawn(); var col1 = this; var col2 = other; - var add = function add(col, other, retEles) { for (var i = 0; i < col.length; i++) { var ele = col[i]; var id = ele._private.data.id; var inOther = other.hasElementWithId(id); - if (inOther) { both.merge(ele); } else { @@ -31746,7 +31002,6 @@ var elesfn$8 = { } } }; - add(col1, col2, left); add(col2, col1, right); return { @@ -31757,50 +31012,39 @@ var elesfn$8 = { }, add: function add(toAdd) { var cy = this._private.cy; - if (!toAdd) { return this; } - if (string(toAdd)) { var selector = toAdd; toAdd = cy.mutableElements().filter(selector); } - var elements = this.spawnSelf(); - for (var i = 0; i < toAdd.length; i++) { var ele = toAdd[i]; var add = !this.has(ele); - if (add) { elements.push(ele); } } - return elements; }, // in place merge on calling collection merge: function merge(toAdd) { var _p = this._private; var cy = _p.cy; - if (!toAdd) { return this; } - if (toAdd && string(toAdd)) { var selector = toAdd; toAdd = cy.mutableElements().filter(selector); } - var map = _p.map; - for (var i = 0; i < toAdd.length; i++) { var toAddEle = toAdd[i]; var id = toAddEle._private.data.id; var add = !map.has(id); - if (add) { var index = this.length++; this[index] = toAddEle; @@ -31810,19 +31054,21 @@ var elesfn$8 = { }); } } - return this; // chaining }, + unmergeAt: function unmergeAt(i) { var ele = this[i]; var id = ele.id(); var _p = this._private; - var map = _p.map; // remove ele + var map = _p.map; + // remove ele this[i] = undefined; map["delete"](id); - var unmergedLastEle = i === this.length - 1; // replace empty spot with last ele in collection + var unmergedLastEle = i === this.length - 1; + // replace empty spot with last ele in collection if (this.length > 1 && !unmergedLastEle) { var lastEleI = this.length - 1; var lastEle = this[lastEleI]; @@ -31833,9 +31079,9 @@ var elesfn$8 = { ele: lastEle, index: i }); - } // the collection is now 1 ele smaller - + } + // the collection is now 1 ele smaller this.length--; return this; }, @@ -31846,7 +31092,6 @@ var elesfn$8 = { var id = ele._private.data.id; var map = _p.map; var entry = map.get(id); - if (!entry) { return this; // no need to remove } @@ -31858,70 +31103,58 @@ var elesfn$8 = { // remove eles in place on calling collection unmerge: function unmerge(toRemove) { var cy = this._private.cy; - if (!toRemove) { return this; } - if (toRemove && string(toRemove)) { var selector = toRemove; toRemove = cy.mutableElements().filter(selector); } - for (var i = 0; i < toRemove.length; i++) { this.unmergeOne(toRemove[i]); } - return this; // chaining }, + unmergeBy: function unmergeBy(toRmFn) { for (var i = this.length - 1; i >= 0; i--) { var ele = this[i]; - if (toRmFn(ele)) { this.unmergeAt(i); } } - return this; }, map: function map(mapFn, thisArg) { var arr = []; var eles = this; - for (var i = 0; i < eles.length; i++) { var ele = eles[i]; var ret = thisArg ? mapFn.apply(thisArg, [ele, i, eles]) : mapFn(ele, i, eles); arr.push(ret); } - return arr; }, reduce: function reduce(fn, initialValue) { var val = initialValue; var eles = this; - for (var i = 0; i < eles.length; i++) { val = fn(val, eles[i], i, eles); } - return val; }, max: function max(valFn, thisArg) { var max = -Infinity; var maxEle; var eles = this; - for (var i = 0; i < eles.length; i++) { var ele = eles[i]; var val = thisArg ? valFn.apply(thisArg, [ele, i, eles]) : valFn(ele, i, eles); - if (val > max) { max = val; maxEle = ele; } } - return { value: max, ele: maxEle @@ -31931,24 +31164,22 @@ var elesfn$8 = { var min = Infinity; var minEle; var eles = this; - for (var i = 0; i < eles.length; i++) { var ele = eles[i]; var val = thisArg ? valFn.apply(thisArg, [ele, i, eles]) : valFn(ele, i, eles); - if (val < min) { min = val; minEle = ele; } } - return { value: min, ele: minEle }; } -}; // aliases +}; +// aliases var fn$1 = elesfn$8; fn$1['u'] = fn$1['|'] = fn$1['+'] = fn$1.union = fn$1.or = fn$1.add; fn$1['\\'] = fn$1['!'] = fn$1['-'] = fn$1.difference = fn$1.relativeComplement = fn$1.subtract = fn$1.not; @@ -31972,7 +31203,6 @@ var elesfn$7 = { }, group: function group() { var ele = this[0]; - if (ele) { return ele._private.group; } @@ -31991,56 +31221,42 @@ var elesfn$7 = { * z-index: An integer value that affects the relative draw order of elements. In general, an element with a higher * `z-index` will be drawn on top of an element with a lower `z-index`. */ - var zIndexSort = function zIndexSort(a, b) { var cy = a.cy(); var hasCompoundNodes = cy.hasCompoundNodes(); - function getDepth(ele) { var style = ele.pstyle('z-compound-depth'); - if (style.value === 'auto') { return hasCompoundNodes ? ele.zDepth() : 0; } else if (style.value === 'bottom') { return -1; } else if (style.value === 'top') { return MAX_INT$1; - } // 'orphan' - - + } + // 'orphan' return 0; } - var depthDiff = getDepth(a) - getDepth(b); - if (depthDiff !== 0) { return depthDiff; } - function getEleDepth(ele) { var style = ele.pstyle('z-index-compare'); - if (style.value === 'auto') { return ele.isNode() ? 1 : 0; - } // 'manual' - - + } + // 'manual' return 0; } - var eleDiff = getEleDepth(a) - getEleDepth(b); - if (eleDiff !== 0) { return eleDiff; } - var zDiff = a.pstyle('z-index').value - b.pstyle('z-index').value; - if (zDiff !== 0) { return zDiff; - } // compare indices in the core (order added to graph w/ last on top) - - + } + // compare indices in the core (order added to graph w/ last on top) return a.poolIndex() - b.poolIndex(); }; @@ -32048,15 +31264,12 @@ var elesfn$6 = { forEach: function forEach(fn, thisArg) { if (fn$6(fn)) { var N = this.length; - for (var i = 0; i < N; i++) { var ele = this[i]; var ret = thisArg ? fn.apply(thisArg, [ele, i, this]) : fn(ele, i, this); - if (ret === false) { break; } // exit each early on return false - } } @@ -32064,37 +31277,29 @@ var elesfn$6 = { }, toArray: function toArray() { var array = []; - for (var i = 0; i < this.length; i++) { array.push(this[i]); } - return array; }, slice: function slice(start, end) { var array = []; var thisSize = this.length; - if (end == null) { end = thisSize; } - if (start == null) { start = 0; } - if (start < 0) { start = thisSize + start; } - if (end < 0) { end = thisSize + end; } - for (var i = start; i >= 0 && i < end && i < thisSize; i++) { array.push(this[i]); } - return this.spawn(array); }, size: function size() { @@ -32119,7 +31324,6 @@ var elesfn$6 = { if (!fn$6(sortFn)) { return this; } - var sorted = this.toArray().sort(sortFn); return this.spawn(sorted); }, @@ -32128,18 +31332,15 @@ var elesfn$6 = { }, zDepth: function zDepth() { var ele = this[0]; - if (!ele) { return undefined; - } // let cy = ele.cy(); - + } + // let cy = ele.cy(); var _p = ele._private; var group = _p.group; - if (group === 'nodes') { var depth = _p.data.parent ? ele.parents().size() : 0; - if (!ele.isParent()) { return MAX_INT$1 - 1; // childless nodes always on top } @@ -32154,8 +31355,8 @@ var elesfn$6 = { } } }; -elesfn$6.each = elesfn$6.forEach; +elesfn$6.each = elesfn$6.forEach; var defineSymbolIterator = function defineSymbolIterator() { var typeofUndef = "undefined" ; var isIteratorSupported = (typeof Symbol === "undefined" ? "undefined" : _typeof(Symbol)) != typeofUndef && _typeof(Symbol.iterator) != typeofUndef; // eslint-disable-line no-undef @@ -32163,7 +31364,6 @@ var defineSymbolIterator = function defineSymbolIterator() { if (isIteratorSupported) { elesfn$6[Symbol.iterator] = function () { var _this = this; - // eslint-disable-line no-undef var entry = { value: undefined, @@ -32179,7 +31379,6 @@ var defineSymbolIterator = function defineSymbolIterator() { entry.value = undefined; entry.done = true; } - return entry; } }, Symbol.iterator, function () { @@ -32189,7 +31388,6 @@ var defineSymbolIterator = function defineSymbolIterator() { }; } }; - defineSymbolIterator(); var getLayoutDimensionOptions = defaults$g({ @@ -32200,7 +31398,6 @@ var elesfn$5 = { layoutDimensions: function layoutDimensions(options) { options = getLayoutDimensionOptions(options); var dims; - if (!this.takesUpSpace()) { dims = { w: 0, @@ -32217,13 +31414,12 @@ var elesfn$5 = { w: this.outerWidth(), h: this.outerHeight() }; - } // sanitise the dimensions for external layouts (avoid division by zero) - + } + // sanitise the dimensions for external layouts (avoid division by zero) if (dims.w === 0 || dims.h === 0) { dims.w = dims.h = 1; } - return dims; }, // using standard layout options, apply position function (w/ or w/o animation) @@ -32233,11 +31429,9 @@ var elesfn$5 = { }); var cy = this.cy(); var layoutEles = options.eles; // nodes & edges - var getMemoizeKey = function getMemoizeKey(node) { return node.id(); }; - var fnMem = memoize(fn, getMemoizeKey); // memoized version of position function layout.emit({ @@ -32245,7 +31439,6 @@ var elesfn$5 = { layout: layout }); layout.animations = []; - var calculateSpacing = function calculateSpacing(spacing, nodesBb, pos) { var center = { x: nodesBb.x1 + nodesBb.w / 2, @@ -32261,47 +31454,36 @@ var elesfn$5 = { y: center.y + spacingVector.y }; }; - var useSpacingFactor = options.spacingFactor && options.spacingFactor !== 1; - var spacingBb = function spacingBb() { if (!useSpacingFactor) { return null; } - var bb = makeBoundingBox(); - for (var i = 0; i < nodes.length; i++) { var node = nodes[i]; var pos = fnMem(node, i); expandBoundingBoxByPoint(bb, pos.x, pos.y); } - return bb; }; - var bb = spacingBb(); var getFinalPos = memoize(function (node, i) { var newPos = fnMem(node, i); - if (useSpacingFactor) { var spacing = Math.abs(options.spacingFactor); newPos = calculateSpacing(spacing, bb, newPos); } - if (options.transform != null) { newPos = options.transform(node, newPos); } - return newPos; }, getMemoizeKey); - if (options.animate) { for (var i = 0; i < nodes.length; i++) { var node = nodes[i]; var newPos = getFinalPos(node, i); var animateNode = options.animateFilter == null || options.animateFilter(node, i); - if (animateNode) { var ani = node.animation({ position: newPos, @@ -32313,7 +31495,6 @@ var elesfn$5 = { node.position(newPos); } } - if (options.fit) { var fitAni = cy.animation({ fit: { @@ -32333,7 +31514,6 @@ var elesfn$5 = { }); layout.animations.push(zoomPanAni); } - layout.animations.forEach(function (ani) { return ani.play(); }); @@ -32353,19 +31533,15 @@ var elesfn$5 = { }); } else { nodes.positions(getFinalPos); - if (options.fit) { cy.fit(options.eles, options.padding); } - if (options.zoom != null) { cy.zoom(options.zoom); } - if (options.pan) { cy.pan(options.pan); } - layout.one('layoutready', options.ready); layout.emit({ type: 'layoutready', @@ -32377,24 +31553,24 @@ var elesfn$5 = { layout: layout }); } - return this; // chaining }, + layout: function layout(options) { var cy = this.cy(); return cy.makeLayout(extend({}, options, { eles: this })); } -}; // aliases: +}; +// aliases: elesfn$5.createLayout = elesfn$5.makeLayout = elesfn$5.layout; function styleCache(key, fn, ele) { var _p = ele._private; var cache = _p.styleCache = _p.styleCache || []; var val; - if ((val = cache[key]) != null) { return val; } else { @@ -32402,49 +31578,39 @@ function styleCache(key, fn, ele) { return val; } } - function cacheStyleFunction(key, fn) { key = hashString(key); return function cachedStyleFunction(ele) { return styleCache(key, fn, ele); }; } - function cachePrototypeStyleFunction(key, fn) { key = hashString(key); - var selfFn = function selfFn(ele) { return fn.call(ele); }; - return function cachedPrototypeStyleFunction() { var ele = this[0]; - if (ele) { return styleCache(key, selfFn, ele); } }; } - var elesfn$4 = { recalculateRenderedStyle: function recalculateRenderedStyle(useCache) { var cy = this.cy(); var renderer = cy.renderer(); var styleEnabled = cy.styleEnabled(); - if (renderer && styleEnabled) { renderer.recalculateRenderedStyle(this, useCache); } - return this; }, dirtyStyleCache: function dirtyStyleCache() { var cy = this.cy(); - var dirty = function dirty(ele) { return ele._private.styleCache = null; }; - if (cy.hasCompoundNodes()) { var eles; eles = this.spawnSelf().merge(this.descendants()).merge(this.parents()); @@ -32456,17 +31622,14 @@ var elesfn$4 = { ele.connectedEdges().forEach(dirty); }); } - return this; }, // fully updates (recalculates) the style for the elements updateStyle: function updateStyle(notifyRenderer) { var cy = this._private.cy; - if (!cy.styleEnabled()) { return this; } - if (cy.batching()) { var bEles = cy._private.batchStyleEles; bEles.merge(this); @@ -32476,15 +31639,13 @@ var elesfn$4 = { var hasCompounds = cy.hasCompoundNodes(); var updatedEles = this; notifyRenderer = notifyRenderer || notifyRenderer === undefined ? true : false; - if (hasCompounds) { // then add everything up and down for compound selector checks updatedEles = this.spawnSelf().merge(this.descendants()).merge(this.parents()); - } // let changedEles = style.apply( updatedEles ); - + } + // let changedEles = style.apply( updatedEles ); var changedEles = updatedEles; - if (notifyRenderer) { changedEles.emitAndNotify('style'); // let renderer know we changed style } else { @@ -32496,17 +31657,15 @@ var elesfn$4 = { }); return this; // chaining }, + // private: clears dirty flag and recalculates style cleanStyle: function cleanStyle() { var cy = this.cy(); - if (!cy.styleEnabled()) { return; } - for (var i = 0; i < this.length; i++) { var ele = this[i]; - if (ele._private.styleDirty) { // n.b. this flag should be set before apply() to avoid potential infinite recursion ele._private.styleDirty = false; @@ -32519,15 +31678,12 @@ var elesfn$4 = { var includeNonDefault = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; var ele = this[0]; var cy = ele.cy(); - if (!cy.styleEnabled()) { return; } - if (ele) { this.cleanStyle(); var overriddenStyle = ele._private.style[property]; - if (overriddenStyle != null) { return overriddenStyle; } else if (includeNonDefault) { @@ -32539,11 +31695,9 @@ var elesfn$4 = { }, numericStyle: function numericStyle(property) { var ele = this[0]; - if (!ele.cy().styleEnabled()) { return; } - if (ele) { var pstyle = ele.pstyle(property); return pstyle.pfValue !== undefined ? pstyle.pfValue : pstyle.value; @@ -32551,11 +31705,9 @@ var elesfn$4 = { }, numericStyleUnits: function numericStyleUnits(property) { var ele = this[0]; - if (!ele.cy().styleEnabled()) { return; } - if (ele) { return ele.pstyle(property).units; } @@ -32564,13 +31716,10 @@ var elesfn$4 = { // or get the whole rendered style if no property specified (NB doesn't allow setting) renderedStyle: function renderedStyle(property) { var cy = this.cy(); - if (!cy.styleEnabled()) { return this; } - var ele = this[0]; - if (ele) { return cy.style().getRenderedStyle(ele, property); } @@ -32578,14 +31727,11 @@ var elesfn$4 = { // read the calculated css style of the element or override the style (via a bypass) style: function style(name, value) { var cy = this.cy(); - if (!cy.styleEnabled()) { return this; } - var updateTransitions = false; var style = cy.style(); - if (plainObject(name)) { // then extend the bypass var props = name; @@ -32595,7 +31741,6 @@ var elesfn$4 = { if (value === undefined) { // then get the property from the style var ele = this[0]; - if (ele) { return style.getStylePropertyValue(ele, name); } else { @@ -32609,7 +31754,6 @@ var elesfn$4 = { } } else if (name === undefined) { var _ele = this[0]; - if (_ele) { return style.getRawStyle(_ele); } else { @@ -32617,20 +31761,17 @@ var elesfn$4 = { return; } } - return this; // chaining }, + removeStyle: function removeStyle(names) { var cy = this.cy(); - if (!cy.styleEnabled()) { return this; } - var updateTransitions = false; var style = cy.style(); var eles = this; - if (names === undefined) { for (var i = 0; i < eles.length; i++) { var ele = eles[i]; @@ -32638,45 +31779,40 @@ var elesfn$4 = { } } else { names = names.split(/\s+/); - for (var _i = 0; _i < eles.length; _i++) { var _ele2 = eles[_i]; style.removeBypasses(_ele2, names, updateTransitions); } } - this.emitAndNotify('style'); // let the renderer know we've updated style return this; // chaining }, + show: function show() { this.css('display', 'element'); return this; // chaining }, + hide: function hide() { this.css('display', 'none'); return this; // chaining }, + effectiveOpacity: function effectiveOpacity() { var cy = this.cy(); - if (!cy.styleEnabled()) { return 1; } - var hasCompoundNodes = cy.hasCompoundNodes(); var ele = this[0]; - if (ele) { var _p = ele._private; var parentOpacity = ele.pstyle('opacity').value; - if (!hasCompoundNodes) { return parentOpacity; } - var parents = !_p.data.parent ? null : ele.parents(); - if (parents) { for (var i = 0; i < parents.length; i++) { var parent = parents[i]; @@ -32684,20 +31820,16 @@ var elesfn$4 = { parentOpacity = opacity * parentOpacity; } } - return parentOpacity; } }, transparent: function transparent() { var cy = this.cy(); - if (!cy.styleEnabled()) { return false; } - var ele = this[0]; var hasCompoundNodes = ele.cy().hasCompoundNodes(); - if (ele) { if (!hasCompoundNodes) { return ele.pstyle('opacity').value === 0; @@ -32708,54 +31840,42 @@ var elesfn$4 = { }, backgrounding: function backgrounding() { var cy = this.cy(); - if (!cy.styleEnabled()) { return false; } - var ele = this[0]; return ele._private.backgrounding ? true : false; } }; - function checkCompound(ele, parentOk) { var _p = ele._private; var parents = _p.data.parent ? ele.parents() : null; - if (parents) { for (var i = 0; i < parents.length; i++) { var parent = parents[i]; - if (!parentOk(parent)) { return false; } } } - return true; } - function defineDerivedStateFunction(specs) { var ok = specs.ok; var edgeOkViaNode = specs.edgeOkViaNode || specs.ok; var parentOk = specs.parentOk || specs.ok; return function () { var cy = this.cy(); - if (!cy.styleEnabled()) { return true; } - var ele = this[0]; var hasCompoundNodes = cy.hasCompoundNodes(); - if (ele) { var _p = ele._private; - if (!ok(ele)) { return false; } - if (ele.isNode()) { return !hasCompoundNodes || checkCompound(ele, parentOk); } else { @@ -32766,7 +31886,6 @@ function defineDerivedStateFunction(specs) { } }; } - var eleTakesUpSpace = cacheStyleFunction('eleTakesUpSpace', function (ele) { return ele.pstyle('display').value === 'element' && ele.width() !== 0 && (ele.isNode() ? ele.height() !== 0 : true); }); @@ -32784,15 +31903,12 @@ elesfn$4.interactive = cachePrototypeStyleFunction('interactive', defineDerivedS parentOk: parentInteractive, edgeOkViaNode: eleTakesUpSpace })); - elesfn$4.noninteractive = function () { var ele = this[0]; - if (ele) { return !ele.interactive(); } }; - var eleVisible = cacheStyleFunction('eleVisible', function (ele) { return ele.pstyle('visibility').value === 'visible' && ele.pstyle('opacity').pfValue !== 0 && eleTakesUpSpace(ele); }); @@ -32801,20 +31917,16 @@ elesfn$4.visible = cachePrototypeStyleFunction('visible', defineDerivedStateFunc ok: eleVisible, edgeOkViaNode: edgeVisibleViaNode })); - elesfn$4.hidden = function () { var ele = this[0]; - if (ele) { return !ele.visible(); } }; - elesfn$4.isBundledBezier = cachePrototypeStyleFunction('isBundledBezier', function () { if (!this.cy().styleEnabled()) { return false; } - return !this.removed() && this.pstyle('curve-style').value === 'bezier' && this.takesUpSpace(); }); elesfn$4.bypass = elesfn$4.css = elesfn$4.style; @@ -32823,83 +31935,72 @@ elesfn$4.removeBypass = elesfn$4.removeCss = elesfn$4.removeStyle; elesfn$4.pstyle = elesfn$4.parsedStyle; var elesfn$3 = {}; - function defineSwitchFunction(params) { return function () { var args = arguments; - var changedEles = []; // e.g. cy.nodes().select( data, handler ) + var changedEles = []; + // e.g. cy.nodes().select( data, handler ) if (args.length === 2) { var data = args[0]; var handler = args[1]; this.on(params.event, data, handler); - } // e.g. cy.nodes().select( handler ) + } + + // e.g. cy.nodes().select( handler ) else if (args.length === 1 && fn$6(args[0])) { var _handler = args[0]; this.on(params.event, _handler); - } // e.g. cy.nodes().select() + } + + // e.g. cy.nodes().select() // e.g. (private) cy.nodes().select(['tapselect']) else if (args.length === 0 || args.length === 1 && array(args[0])) { var addlEvents = args.length === 1 ? args[0] : null; - for (var i = 0; i < this.length; i++) { var ele = this[i]; var able = !params.ableField || ele._private[params.ableField]; var changed = ele._private[params.field] != params.value; - if (params.overrideAble) { var overrideAble = params.overrideAble(ele); - if (overrideAble !== undefined) { able = overrideAble; - if (!overrideAble) { return this; } // to save cycles assume not able for all on override - } } if (able) { ele._private[params.field] = params.value; - if (changed) { changedEles.push(ele); } } } - var changedColl = this.spawn(changedEles); changedColl.updateStyle(); // change of state => possible change of style - changedColl.emit(params.event); - if (addlEvents) { changedColl.emit(addlEvents); } } - return this; }; } - function defineSwitchSet(params) { elesfn$3[params.field] = function () { var ele = this[0]; - if (ele) { if (params.overrideField) { var val = params.overrideField(ele); - if (val !== undefined) { return val; } } - return ele._private[params.field]; } }; - elesfn$3[params.on] = defineSwitchFunction({ event: params.on, field: params.field, @@ -32915,7 +32016,6 @@ function defineSwitchSet(params) { value: false }); } - defineSwitchSet({ field: 'locked', overrideField: function overrideField(ele) { @@ -32950,15 +32050,12 @@ defineSwitchSet({ off: 'unselectify' }); elesfn$3.deselect = elesfn$3.unselect; - elesfn$3.grabbed = function () { var ele = this[0]; - if (ele) { return ele._private.grabbed; } }; - defineSwitchSet({ field: 'active', on: 'activate', @@ -32969,72 +32066,59 @@ defineSwitchSet({ on: 'panify', off: 'unpanify' }); - elesfn$3.inactive = function () { var ele = this[0]; - if (ele) { return !ele._private.active; } }; -var elesfn$2 = {}; // DAG functions +var elesfn$2 = {}; + +// DAG functions //////////////// var defineDagExtremity = function defineDagExtremity(params) { return function dagExtremityImpl(selector) { var eles = this; var ret = []; - for (var i = 0; i < eles.length; i++) { var ele = eles[i]; - if (!ele.isNode()) { continue; } - var disqualified = false; var edges = ele.connectedEdges(); - for (var j = 0; j < edges.length; j++) { var edge = edges[j]; var src = edge.source(); var tgt = edge.target(); - if (params.noIncomingEdges && tgt === ele && src !== ele || params.noOutgoingEdges && src === ele && tgt !== ele) { disqualified = true; break; } } - if (!disqualified) { ret.push(ele); } } - return this.spawn(ret, true).filter(selector); }; }; - var defineDagOneHop = function defineDagOneHop(params) { return function (selector) { var eles = this; var oEles = []; - for (var i = 0; i < eles.length; i++) { var ele = eles[i]; - if (!ele.isNode()) { continue; } - var edges = ele.connectedEdges(); - for (var j = 0; j < edges.length; j++) { var edge = edges[j]; var src = edge.source(); var tgt = edge.target(); - if (params.outgoing && src === ele) { oEles.push(edge); oEles.push(tgt); @@ -33044,56 +32128,44 @@ var defineDagOneHop = function defineDagOneHop(params) { } } } - return this.spawn(oEles, true).filter(selector); }; }; - var defineDagAllHops = function defineDagAllHops(params) { return function (selector) { var eles = this; var sEles = []; var sElesIds = {}; - for (;;) { var next = params.outgoing ? eles.outgoers() : eles.incomers(); - if (next.length === 0) { break; } // done if none left - var newNext = false; - for (var i = 0; i < next.length; i++) { var n = next[i]; var nid = n.id(); - if (!sElesIds[nid]) { sElesIds[nid] = true; sEles.push(n); newNext = true; } } - if (!newNext) { break; } // done if touched all outgoers already - eles = next; } - return this.spawn(sEles, true).filter(selector); }; }; - elesfn$2.clearTraversalCache = function () { for (var i = 0; i < this.length; i++) { this[i]._private.traversalCache = null; } }; - extend(elesfn$2, { // get the root nodes in the DAG roots: defineDagExtremity({ @@ -33121,34 +32193,36 @@ extend(elesfn$2, { predecessors: defineDagAllHops({ incoming: true }) -}); // Neighbourhood functions +}); + +// Neighbourhood functions ////////////////////////// extend(elesfn$2, { neighborhood: cache(function (selector) { var elements = []; var nodes = this.nodes(); - for (var i = 0; i < nodes.length; i++) { // for all nodes var node = nodes[i]; - var connectedEdges = node.connectedEdges(); // for each connected edge, add the edge and the other node + var connectedEdges = node.connectedEdges(); + // for each connected edge, add the edge and the other node for (var j = 0; j < connectedEdges.length; j++) { var edge = connectedEdges[j]; var src = edge.source(); var tgt = edge.target(); - var otherNode = node === src ? tgt : src; // need check in case of loop + var otherNode = node === src ? tgt : src; + // need check in case of loop if (otherNode.length > 0) { elements.push(otherNode[0]); // add node 1 hop away - } // add connected edge - + } + // add connected edge elements.push(edge[0]); } } - return this.spawn(elements, true).filter(selector); }, 'neighborhood'), closedNeighborhood: function closedNeighborhood(selector) { @@ -33157,32 +32231,31 @@ extend(elesfn$2, { openNeighborhood: function openNeighborhood(selector) { return this.neighborhood(selector); } -}); // aliases +}); +// aliases elesfn$2.neighbourhood = elesfn$2.neighborhood; elesfn$2.closedNeighbourhood = elesfn$2.closedNeighborhood; -elesfn$2.openNeighbourhood = elesfn$2.openNeighborhood; // Edge functions +elesfn$2.openNeighbourhood = elesfn$2.openNeighborhood; + +// Edge functions ///////////////// extend(elesfn$2, { source: cache(function sourceImpl(selector) { var ele = this[0]; var src; - if (ele) { src = ele._private.source || ele.cy().collection(); } - return src && selector ? src.filter(selector) : src; }, 'source'), target: cache(function targetImpl(selector) { var ele = this[0]; var tgt; - if (ele) { tgt = ele._private.target || ele.cy().collection(); } - return tgt && selector ? tgt.filter(selector) : tgt; }, 'target'), sources: defineSourceFunction({ @@ -33192,110 +32265,88 @@ extend(elesfn$2, { attr: 'target' }) }); - function defineSourceFunction(params) { return function sourceImpl(selector) { var sources = []; - for (var i = 0; i < this.length; i++) { var ele = this[i]; var src = ele._private[params.attr]; - if (src) { sources.push(src); } } - return this.spawn(sources, true).filter(selector); }; } - extend(elesfn$2, { edgesWith: cache(defineEdgesWithFunction(), 'edgesWith'), edgesTo: cache(defineEdgesWithFunction({ thisIsSrc: true }), 'edgesTo') }); - function defineEdgesWithFunction(params) { return function edgesWithImpl(otherNodes) { var elements = []; var cy = this._private.cy; - var p = params || {}; // get elements if a selector is specified + var p = params || {}; + // get elements if a selector is specified if (string(otherNodes)) { otherNodes = cy.$(otherNodes); } - for (var h = 0; h < otherNodes.length; h++) { var edges = otherNodes[h]._private.edges; - for (var i = 0; i < edges.length; i++) { var edge = edges[i]; var edgeData = edge._private.data; var thisToOther = this.hasElementWithId(edgeData.source) && otherNodes.hasElementWithId(edgeData.target); var otherToThis = otherNodes.hasElementWithId(edgeData.source) && this.hasElementWithId(edgeData.target); var edgeConnectsThisAndOther = thisToOther || otherToThis; - if (!edgeConnectsThisAndOther) { continue; } - if (p.thisIsSrc || p.thisIsTgt) { if (p.thisIsSrc && !thisToOther) { continue; } - if (p.thisIsTgt && !otherToThis) { continue; } } - elements.push(edge); } } - return this.spawn(elements, true); }; } - extend(elesfn$2, { connectedEdges: cache(function (selector) { var retEles = []; var eles = this; - for (var i = 0; i < eles.length; i++) { var node = eles[i]; - if (!node.isNode()) { continue; } - var edges = node._private.edges; - for (var j = 0; j < edges.length; j++) { var edge = edges[j]; retEles.push(edge); } } - return this.spawn(retEles, true).filter(selector); }, 'connectedEdges'), connectedNodes: cache(function (selector) { var retEles = []; var eles = this; - for (var i = 0; i < eles.length; i++) { var edge = eles[i]; - if (!edge.isEdge()) { continue; } - retEles.push(edge.source()[0]); retEles.push(edge.target()[0]); } - return this.spawn(retEles, true).filter(selector); }, 'connectedNodes'), parallelEdges: cache(defineParallelEdgesFunction(), 'parallelEdges'), @@ -33303,7 +32354,6 @@ extend(elesfn$2, { codirected: true }), 'codirectedEdges') }); - function defineParallelEdgesFunction(params) { var defaults = { codirected: false @@ -33313,16 +32363,18 @@ function defineParallelEdgesFunction(params) { // micro-optimised for renderer var elements = []; var edges = this.edges(); - var p = params; // look at all the edges in the collection + var p = params; + // look at all the edges in the collection for (var i = 0; i < edges.length; i++) { var edge1 = edges[i]; var edge1_p = edge1._private; var src1 = edge1_p.source; var srcid1 = src1._private.data.id; var tgtid1 = edge1_p.data.target; - var srcEdges1 = src1._private.edges; // look at edges connected to the src node of this edge + var srcEdges1 = src1._private.edges; + // look at edges connected to the src node of this edge for (var j = 0; j < srcEdges1.length; j++) { var edge2 = srcEdges1[j]; var edge2data = edge2._private.data; @@ -33330,18 +32382,17 @@ function defineParallelEdgesFunction(params) { var srcid2 = edge2data.source; var codirected = tgtid2 === tgtid1 && srcid2 === srcid1; var oppdirected = srcid1 === tgtid2 && tgtid1 === srcid2; - if (p.codirected && codirected || !p.codirected && (codirected || oppdirected)) { elements.push(edge2); } } } - return this.spawn(elements, true).filter(selector); }; -} // Misc functions -///////////////// +} +// Misc functions +///////////////// extend(elesfn$2, { components: function components(root) { @@ -33350,7 +32401,6 @@ extend(elesfn$2, { var visited = cy.collection(); var unvisited = root == null ? self.nodes() : root.nodes(); var components = []; - if (root != null && unvisited.empty()) { // root may contain only edges unvisited = root.sources(); // doesn't matter which node to use (undirected), so just use the source sides @@ -33361,11 +32411,9 @@ extend(elesfn$2, { unvisited.unmerge(node); component.merge(node); }; - if (unvisited.empty()) { return self.spawn(); } - var _loop = function _loop() { // each iteration yields a component var cmpt = cy.collection(); @@ -33389,11 +32437,9 @@ extend(elesfn$2, { }); }); }; - do { _loop(); } while (unvisited.length > 0); - return components; }, component: function component() { @@ -33403,35 +32449,32 @@ extend(elesfn$2, { }); elesfn$2.componentsOf = elesfn$2.components; +// represents a set of nodes, edges, or both together var Collection = function Collection(cy, elements) { var unique = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var removed = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; - if (cy === undefined) { error('A collection must have a reference to the core'); return; } - var map = new Map$1(); var createdElements = false; - if (!elements) { elements = []; } else if (elements.length > 0 && plainObject(elements[0]) && !element(elements[0])) { - createdElements = true; // make elements from json and restore all at once later + createdElements = true; + // make elements from json and restore all at once later var eles = []; var elesIds = new Set$1(); - for (var i = 0, l = elements.length; i < l; i++) { var json = elements[i]; - if (json.data == null) { json.data = {}; } + var _data = json.data; - var _data = json.data; // make sure newly created elements have valid ids - + // make sure newly created elements have valid ids if (_data.id == null) { _data.id = uuid(); } else if (cy.hasElementWithId(_data.id) || elesIds.has(_data.id)) { @@ -33442,21 +32485,15 @@ var Collection = function Collection(cy, elements) { eles.push(ele); elesIds.add(_data.id); } - elements = eles; } - this.length = 0; - for (var _i = 0, _l = elements.length; _i < _l; _i++) { var element$1 = elements[_i][0]; // [0] in case elements is an array of collections, rather than array of elements - if (element$1 == null) { continue; } - var id = element$1._private.data.id; - if (!unique || !map.has(id)) { if (unique) { map.set(id, { @@ -33464,32 +32501,25 @@ var Collection = function Collection(cy, elements) { ele: element$1 }); } - this[this.length] = element$1; this.length++; } } - this._private = { eles: this, cy: cy, - get map() { if (this.lazyMap == null) { this.rebuildMap(); } - return this.lazyMap; }, - set map(m) { this.lazyMap = m; }, - rebuildMap: function rebuildMap() { var m = this.lazyMap = new Map$1(); var eles = this.eles; - for (var _i2 = 0; _i2 < eles.length; _i2++) { var _ele = eles[_i2]; m.set(_ele.id(), { @@ -33499,47 +32529,40 @@ var Collection = function Collection(cy, elements) { } } }; - if (unique) { this._private.map = map; - } // restore the elements if we created them from json - + } + // restore the elements if we created them from json if (createdElements && !removed) { this.restore(); } -}; // Functions +}; + +// Functions //////////////////////////////////////////////////////////////////////////////////////////////////// + // keep the prototypes in sync (an element has the same functions as a collection) // and use elefn and elesfn as shorthands to the prototypes - - var elesfn$1 = Element.prototype = Collection.prototype = Object.create(Array.prototype); - elesfn$1.instanceString = function () { return 'collection'; }; - elesfn$1.spawn = function (eles, unique) { return new Collection(this.cy(), eles, unique); }; - elesfn$1.spawnSelf = function () { return this.spawn(this); }; - elesfn$1.cy = function () { return this._private.cy; }; - elesfn$1.renderer = function () { return this._private.cy.renderer(); }; - elesfn$1.element = function () { return this[0]; }; - elesfn$1.collection = function () { if (collection(this)) { return this; @@ -33548,90 +32571,71 @@ elesfn$1.collection = function () { return new Collection(this._private.cy, [this]); } }; - elesfn$1.unique = function () { return new Collection(this._private.cy, this, true); }; - elesfn$1.hasElementWithId = function (id) { id = '' + id; // id must be string return this._private.map.has(id); }; - elesfn$1.getElementById = function (id) { id = '' + id; // id must be string var cy = this._private.cy; - var entry = this._private.map.get(id); - return entry ? entry.ele : new Collection(cy); // get ele or empty collection }; elesfn$1.$id = elesfn$1.getElementById; - elesfn$1.poolIndex = function () { var cy = this._private.cy; var eles = cy._private.elements; var id = this[0]._private.data.id; return eles._private.map.get(id).index; }; - elesfn$1.indexOf = function (ele) { var id = ele[0]._private.data.id; return this._private.map.get(id).index; }; - elesfn$1.indexOfId = function (id) { id = '' + id; // id must be string return this._private.map.get(id).index; }; - elesfn$1.json = function (obj) { var ele = this.element(); var cy = this.cy(); - if (ele == null && obj) { return this; } // can't set to no eles - if (ele == null) { return undefined; } // can't get from no eles - var p = ele._private; - if (plainObject(obj)) { // set - cy.startBatch(); + cy.startBatch(); if (obj.data) { ele.data(obj.data); var _data2 = p.data; - if (ele.isEdge()) { // source and target are immutable via data() var move = false; var spec = {}; var src = obj.data.source; var tgt = obj.data.target; - if (src != null && src != _data2.source) { spec.source = '' + src; // id must be string - move = true; } - if (tgt != null && tgt != _data2.target) { spec.target = '' + tgt; // id must be string - move = true; } - if (move) { ele = ele.move(spec); } @@ -33639,13 +32643,11 @@ elesfn$1.json = function (obj) { // parent is immutable via data() var newParentValSpecd = ('parent' in obj.data); var parent = obj.data.parent; - if (newParentValSpecd && (parent != null || _data2.parent != null) && parent != _data2.parent) { if (parent === undefined) { // can't set undefined imperatively, so use null parent = null; } - if (parent != null) { parent = '' + parent; // id must be string } @@ -33656,15 +32658,14 @@ elesfn$1.json = function (obj) { } } } - if (obj.position) { ele.position(obj.position); - } // ignore group -- immutable + } + // ignore group -- immutable var checkSwitch = function checkSwitch(k, trueFnName, falseFnName) { var obj_k = obj[k]; - if (obj_k != null && obj_k !== p[k]) { if (obj_k) { ele[trueFnName](); @@ -33673,22 +32674,20 @@ elesfn$1.json = function (obj) { } } }; - checkSwitch('removed', 'remove', 'restore'); checkSwitch('selected', 'select', 'unselect'); checkSwitch('selectable', 'selectify', 'unselectify'); checkSwitch('locked', 'lock', 'unlock'); checkSwitch('grabbable', 'grabify', 'ungrabify'); checkSwitch('pannable', 'panify', 'unpanify'); - if (obj.classes != null) { ele.classes(obj.classes); } - cy.endBatch(); return this; } else if (obj === undefined) { // get + var json = { data: copy(p.data), position: copy(p.position), @@ -33709,23 +32708,18 @@ elesfn$1.json = function (obj) { return json; } }; - elesfn$1.jsons = function () { var jsons = []; - for (var i = 0; i < this.length; i++) { var ele = this[i]; var json = ele.json(); jsons.push(json); } - return jsons; }; - elesfn$1.clone = function () { var cy = this.cy(); var elesArr = []; - for (var i = 0; i < this.length; i++) { var ele = this[i]; var json = ele.json(); @@ -33733,33 +32727,29 @@ elesfn$1.clone = function () { elesArr.push(clone); } - return new Collection(cy, elesArr); }; - elesfn$1.copy = elesfn$1.clone; - elesfn$1.restore = function () { var notifyRenderer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; var addToPool = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; var self = this; var cy = self.cy(); - var cy_p = cy._private; // create arrays of nodes and edges, since we need to - // restore the nodes first + var cy_p = cy._private; + // create arrays of nodes and edges, since we need to + // restore the nodes first var nodes = []; var edges = []; var elements; - for (var _i3 = 0, l = self.length; _i3 < l; _i3++) { var ele = self[_i3]; - if (addToPool && !ele.removed()) { // don't need to handle this ele continue; - } // keep nodes first in the array and edges after - + } + // keep nodes first in the array and edges after if (ele.isNode()) { // put to front of array if node nodes.push(ele); @@ -33768,66 +32758,65 @@ elesfn$1.restore = function () { edges.push(ele); } } - elements = nodes.concat(edges); var i; - var removeFromElements = function removeFromElements() { elements.splice(i, 1); i--; - }; // now, restore each element - + }; + // now, restore each element for (i = 0; i < elements.length; i++) { var _ele2 = elements[i]; var _private = _ele2._private; - var _data3 = _private.data; // the traversal cache should start fresh when ele is added - - _ele2.clearTraversalCache(); // set id and validate + var _data3 = _private.data; + // the traversal cache should start fresh when ele is added + _ele2.clearTraversalCache(); + // set id and validate if (!addToPool && !_private.removed) ; else if (_data3.id === undefined) { _data3.id = uuid(); } else if (number$1(_data3.id)) { _data3.id = '' + _data3.id; // now it's a string } else if (emptyString(_data3.id) || !string(_data3.id)) { - error('Can not create element with invalid string ID `' + _data3.id + '`'); // can't create element if it has empty string as id or non-string id + error('Can not create element with invalid string ID `' + _data3.id + '`'); + // can't create element if it has empty string as id or non-string id removeFromElements(); continue; } else if (cy.hasElementWithId(_data3.id)) { - error('Can not create second element with ID `' + _data3.id + '`'); // can't create element if one already has that id + error('Can not create second element with ID `' + _data3.id + '`'); + // can't create element if one already has that id removeFromElements(); continue; } - var id = _data3.id; // id is finalised, now let's keep a ref if (_ele2.isNode()) { // extra checks for nodes - var pos = _private.position; // make sure the nodes have a defined position + var pos = _private.position; + + // make sure the nodes have a defined position if (pos.x == null) { pos.x = 0; } - if (pos.y == null) { pos.y = 0; } } - if (_ele2.isEdge()) { // extra checks for edges + var edge = _ele2; var fields = ['source', 'target']; var fieldsLength = fields.length; var badSourceOrTarget = false; - for (var j = 0; j < fieldsLength; j++) { var field = fields[j]; var val = _data3[field]; - if (number$1(val)) { val = _data3[field] = '' + _data3[field]; // now string } @@ -33842,62 +32831,50 @@ elesfn$1.restore = function () { badSourceOrTarget = true; } } - if (badSourceOrTarget) { removeFromElements(); continue; } // can't create this - var src = cy.getElementById(_data3.source); - var tgt = cy.getElementById(_data3.target); // only one edge in node if loop + var tgt = cy.getElementById(_data3.target); + // only one edge in node if loop if (src.same(tgt)) { src._private.edges.push(edge); } else { src._private.edges.push(edge); - tgt._private.edges.push(edge); } - edge._private.source = src; edge._private.target = tgt; } // if is edge - // create mock ids / indexes maps for element so it can be used like collections - + // create mock ids / indexes maps for element so it can be used like collections _private.map = new Map$1(); - _private.map.set(id, { ele: _ele2, index: 0 }); - _private.removed = false; - if (addToPool) { cy.addToPool(_ele2); } } // for each element - // do compound node sanity checks - + // do compound node sanity checks for (var _i4 = 0; _i4 < nodes.length; _i4++) { // each node var node = nodes[_i4]; var _data4 = node._private.data; - if (number$1(_data4.parent)) { // then automake string _data4.parent = '' + _data4.parent; } - var parentId = _data4.parent; var specifiedParent = parentId != null; - if (specifiedParent || node._private.parent) { var parent = node._private.parent ? cy.collection().merge(node._private.parent) : cy.getElementById(parentId); - if (parent.empty()) { // non-existant parent; just remove it _data4.parent = undefined; @@ -33908,71 +32885,57 @@ elesfn$1.restore = function () { } else { var selfAsParent = false; var ancestor = parent; - while (!ancestor.empty()) { if (node.same(ancestor)) { // mark self as parent and remove from data selfAsParent = true; _data4.parent = undefined; // remove parent reference - // exit or we loop forever + // exit or we loop forever break; } - ancestor = ancestor.parent(); } - if (!selfAsParent) { // connect with children parent[0]._private.children.push(node); + node._private.parent = parent[0]; - node._private.parent = parent[0]; // let the core know we have a compound graph - + // let the core know we have a compound graph cy_p.hasCompoundNodes = true; } } // else - } // if specified parent - } // for each node - if (elements.length > 0) { var restored = elements.length === self.length ? self : new Collection(cy, elements); - for (var _i5 = 0; _i5 < restored.length; _i5++) { var _ele3 = restored[_i5]; - if (_ele3.isNode()) { continue; - } // adding an edge invalidates the traversal caches for the parallel edges - - - _ele3.parallelEdges().clearTraversalCache(); // adding an edge invalidates the traversal cache for the connected nodes + } + // adding an edge invalidates the traversal caches for the parallel edges + _ele3.parallelEdges().clearTraversalCache(); + // adding an edge invalidates the traversal cache for the connected nodes _ele3.source().clearTraversalCache(); - _ele3.target().clearTraversalCache(); } - var toUpdateStyle; - if (cy_p.hasCompoundNodes) { toUpdateStyle = cy.collection().merge(restored).merge(restored.connectedNodes()).merge(restored.parent()); } else { toUpdateStyle = restored; } - toUpdateStyle.dirtyCompoundBoundsCache().dirtyBoundingBoxCache().updateStyle(notifyRenderer); - if (notifyRenderer) { restored.emitAndNotify('add'); } else if (addToPool) { restored.emit('add'); } } - return self; // chainability }; @@ -33980,46 +32943,40 @@ elesfn$1.removed = function () { var ele = this[0]; return ele && ele._private.removed; }; - elesfn$1.inside = function () { var ele = this[0]; return ele && !ele._private.removed; }; - elesfn$1.remove = function () { var notifyRenderer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; var removeFromPool = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; var self = this; var elesToRemove = []; var elesToRemoveIds = {}; - var cy = self._private.cy; // add connected edges + var cy = self._private.cy; + // add connected edges function addConnectedEdges(node) { var edges = node._private.edges; - for (var i = 0; i < edges.length; i++) { add(edges[i]); } - } // add descendant nodes - + } + // add descendant nodes function addChildren(node) { var children = node._private.children; - for (var i = 0; i < children.length; i++) { add(children[i]); } } - function add(ele) { var alreadyAdded = elesToRemoveIds[ele.id()]; - if (removeFromPool && ele.removed() || alreadyAdded) { return; } else { elesToRemoveIds[ele.id()] = true; } - if (ele.isNode()) { elesToRemove.push(ele); // nodes are removed last @@ -34028,30 +32985,28 @@ elesfn$1.remove = function () { } else { elesToRemove.unshift(ele); // edges are removed first } - } // make the list of elements to remove - // (may be removing more than specified due to connected edges etc) + } + // make the list of elements to remove + // (may be removing more than specified due to connected edges etc) for (var i = 0, l = self.length; i < l; i++) { var ele = self[i]; add(ele); } - function removeEdgeRef(node, edge) { var connectedEdges = node._private.edges; - removeFromArray(connectedEdges, edge); // removing an edges invalidates the traversal cache for its nodes + removeFromArray(connectedEdges, edge); + // removing an edges invalidates the traversal cache for its nodes node.clearTraversalCache(); } - function removeParallelRef(pllEdge) { // removing an edge invalidates the traversal caches for the parallel edges pllEdge.clearTraversalCache(); } - var alteredParents = []; alteredParents.ids = {}; - function removeChildRef(parent, ele) { ele = ele[0]; parent = parent[0]; @@ -34066,31 +33021,23 @@ elesfn$1.remove = function () { alteredParents.push(parent); } } - self.dirtyCompoundBoundsCache(); - if (removeFromPool) { cy.removeFromPool(elesToRemove); // remove from core pool } for (var _i6 = 0; _i6 < elesToRemove.length; _i6++) { var _ele4 = elesToRemove[_i6]; - if (_ele4.isEdge()) { // remove references to this edge in its connected nodes var src = _ele4.source()[0]; - var tgt = _ele4.target()[0]; - removeEdgeRef(src, _ele4); removeEdgeRef(tgt, _ele4); - var pllEdges = _ele4.parallelEdges(); - for (var j = 0; j < pllEdges.length; j++) { var pllEdge = pllEdges[j]; removeParallelRef(pllEdge); - if (pllEdge.isBundledBezier()) { pllEdge.dirtyBoundingBoxCache(); } @@ -34098,130 +33045,110 @@ elesfn$1.remove = function () { } else { // remove reference to parent var parent = _ele4.parent(); - if (parent.length !== 0) { removeChildRef(parent, _ele4); } } - if (removeFromPool) { // mark as removed _ele4._private.removed = true; } - } // check to see if we have a compound graph or not - + } + // check to see if we have a compound graph or not var elesStillInside = cy._private.elements; cy._private.hasCompoundNodes = false; - for (var _i7 = 0; _i7 < elesStillInside.length; _i7++) { var _ele5 = elesStillInside[_i7]; - if (_ele5.isParent()) { cy._private.hasCompoundNodes = true; break; } } - var removedElements = new Collection(this.cy(), elesToRemove); - if (removedElements.size() > 0) { // must manually notify since trigger won't do this automatically once removed + if (notifyRenderer) { removedElements.emitAndNotify('remove'); } else if (removeFromPool) { removedElements.emit('remove'); } - } // the parents who were modified by the removal need their style updated - + } + // the parents who were modified by the removal need their style updated for (var _i8 = 0; _i8 < alteredParents.length; _i8++) { var _ele6 = alteredParents[_i8]; - if (!removeFromPool || !_ele6.removed()) { _ele6.updateStyle(); } } - return removedElements; }; - elesfn$1.move = function (struct) { var cy = this._private.cy; - var eles = this; // just clean up refs, caches, etc. in the same way as when removing and then restoring - // (our calls to remove/restore do not remove from the graph or make events) + var eles = this; + // just clean up refs, caches, etc. in the same way as when removing and then restoring + // (our calls to remove/restore do not remove from the graph or make events) var notifyRenderer = false; var modifyPool = false; - var toString = function toString(id) { return id == null ? id : '' + id; }; // id must be string - if (struct.source !== undefined || struct.target !== undefined) { var srcId = toString(struct.source); var tgtId = toString(struct.target); var srcExists = srcId != null && cy.hasElementWithId(srcId); var tgtExists = tgtId != null && cy.hasElementWithId(tgtId); - if (srcExists || tgtExists) { cy.batch(function () { // avoid duplicate style updates eles.remove(notifyRenderer, modifyPool); // clean up refs etc. - eles.emitAndNotify('moveout'); - for (var i = 0; i < eles.length; i++) { var ele = eles[i]; var _data5 = ele._private.data; - if (ele.isEdge()) { if (srcExists) { _data5.source = srcId; } - if (tgtExists) { _data5.target = tgtId; } } } - eles.restore(notifyRenderer, modifyPool); // make new refs, style, etc. }); + eles.emitAndNotify('move'); } } else if (struct.parent !== undefined) { // move node to new parent var parentId = toString(struct.parent); var parentExists = parentId === null || cy.hasElementWithId(parentId); - if (parentExists) { var pidToAssign = parentId === null ? undefined : parentId; cy.batch(function () { // avoid duplicate style updates var updated = eles.remove(notifyRenderer, modifyPool); // clean up refs etc. - updated.emitAndNotify('moveout'); - for (var i = 0; i < eles.length; i++) { var ele = eles[i]; var _data6 = ele._private.data; - if (ele.isNode()) { _data6.parent = pidToAssign; } } - updated.restore(notifyRenderer, modifyPool); // make new refs, style, etc. }); + eles.emitAndNotify('move'); } } - return this; }; - [elesfn$j, elesfn$i, elesfn$h, elesfn$g, elesfn$f, data, elesfn$d, dimensions, elesfn$9, elesfn$8, elesfn$7, elesfn$6, elesfn$5, elesfn$4, elesfn$3, elesfn$2].forEach(function (props) { extend(elesfn$1, props); }); @@ -34229,57 +33156,56 @@ elesfn$1.move = function (struct) { var corefn$9 = { add: function add(opts) { var elements; - var cy = this; // add the elements + var cy = this; + // add the elements if (elementOrCollection(opts)) { var eles = opts; - if (eles._private.cy === cy) { // same instance => just restore elements = eles.restore(); } else { // otherwise, copy from json var jsons = []; - for (var i = 0; i < eles.length; i++) { var ele = eles[i]; jsons.push(ele.json()); } - elements = new Collection(cy, jsons); } - } // specify an array of options + } + + // specify an array of options else if (array(opts)) { var _jsons = opts; elements = new Collection(cy, _jsons); - } // specify via opts.nodes and opts.edges + } + + // specify via opts.nodes and opts.edges else if (plainObject(opts) && (array(opts.nodes) || array(opts.edges))) { var elesByGroup = opts; var _jsons2 = []; var grs = ['nodes', 'edges']; - for (var _i = 0, il = grs.length; _i < il; _i++) { var group = grs[_i]; var elesArray = elesByGroup[group]; - if (array(elesArray)) { for (var j = 0, jl = elesArray.length; j < jl; j++) { var json = extend({ group: group }, elesArray[j]); - _jsons2.push(json); } } } - elements = new Collection(cy, _jsons2); - } // specify options for one element + } + + // specify options for one element else { var _json = opts; elements = new Element(cy, _json).collection(); } - return elements; }, remove: function remove(collection) { @@ -34287,7 +33213,6 @@ var corefn$9 = { var selector = collection; collection = this.$(selector); } - return collection.remove(); } }; @@ -34297,108 +33222,88 @@ var corefn$9 = { /*! Bezier curve function generator. Copyright Gaetan Renaudeau. MIT License: http://en.wikipedia.org/wiki/MIT_License */ function generateCubicBezier(mX1, mY1, mX2, mY2) { var NEWTON_ITERATIONS = 4, - NEWTON_MIN_SLOPE = 0.001, - SUBDIVISION_PRECISION = 0.0000001, - SUBDIVISION_MAX_ITERATIONS = 10, - kSplineTableSize = 11, - kSampleStepSize = 1.0 / (kSplineTableSize - 1.0), - float32ArraySupported = typeof Float32Array !== 'undefined'; - /* Must contain four arguments. */ + NEWTON_MIN_SLOPE = 0.001, + SUBDIVISION_PRECISION = 0.0000001, + SUBDIVISION_MAX_ITERATIONS = 10, + kSplineTableSize = 11, + kSampleStepSize = 1.0 / (kSplineTableSize - 1.0), + float32ArraySupported = typeof Float32Array !== 'undefined'; + /* Must contain four arguments. */ if (arguments.length !== 4) { return false; } - /* Arguments must be numbers. */ - + /* Arguments must be numbers. */ for (var i = 0; i < 4; ++i) { if (typeof arguments[i] !== "number" || isNaN(arguments[i]) || !isFinite(arguments[i])) { return false; } } - /* X values must be in the [0, 1] range. */ - + /* X values must be in the [0, 1] range. */ mX1 = Math.min(mX1, 1); mX2 = Math.min(mX2, 1); mX1 = Math.max(mX1, 0); mX2 = Math.max(mX2, 0); var mSampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize); - function A(aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; } - function B(aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; } - function C(aA1) { return 3.0 * aA1; } - function calcBezier(aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; } - function getSlope(aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); } - function newtonRaphsonIterate(aX, aGuessT) { for (var _i = 0; _i < NEWTON_ITERATIONS; ++_i) { var currentSlope = getSlope(aGuessT, mX1, mX2); - if (currentSlope === 0.0) { return aGuessT; } - var currentX = calcBezier(aGuessT, mX1, mX2) - aX; aGuessT -= currentX / currentSlope; } - return aGuessT; } - function calcSampleValues() { for (var _i2 = 0; _i2 < kSplineTableSize; ++_i2) { mSampleValues[_i2] = calcBezier(_i2 * kSampleStepSize, mX1, mX2); } } - function binarySubdivide(aX, aA, aB) { var currentX, - currentT, - i = 0; - + currentT, + i = 0; do { currentT = aA + (aB - aA) / 2.0; currentX = calcBezier(currentT, mX1, mX2) - aX; - if (currentX > 0.0) { aB = currentT; } else { aA = currentT; } } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS); - return currentT; } - function getTForX(aX) { var intervalStart = 0.0, - currentSample = 1, - lastSample = kSplineTableSize - 1; - + currentSample = 1, + lastSample = kSplineTableSize - 1; for (; currentSample !== lastSample && mSampleValues[currentSample] <= aX; ++currentSample) { intervalStart += kSampleStepSize; } - --currentSample; var dist = (aX - mSampleValues[currentSample]) / (mSampleValues[currentSample + 1] - mSampleValues[currentSample]), - guessForT = intervalStart + dist * kSampleStepSize, - initialSlope = getSlope(guessForT, mX1, mX2); - + guessForT = intervalStart + dist * kSampleStepSize, + initialSlope = getSlope(guessForT, mX1, mX2); if (initialSlope >= NEWTON_MIN_SLOPE) { return newtonRaphsonIterate(aX, guessForT); } else if (initialSlope === 0.0) { @@ -34407,37 +33312,28 @@ function generateCubicBezier(mX1, mY1, mX2, mY2) { return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize); } } - var _precomputed = false; - function precompute() { _precomputed = true; - if (mX1 !== mY1 || mX2 !== mY2) { calcSampleValues(); } } - var f = function f(aX) { if (!_precomputed) { precompute(); } - if (mX1 === mY1 && mX2 === mY2) { return aX; } - if (aX === 0) { return 0; } - if (aX === 1) { return 1; } - return calcBezier(getTForX(aX), mY1, mY2); }; - f.getControlPoints = function () { return [{ x: mX1, @@ -34447,25 +33343,20 @@ function generateCubicBezier(mX1, mY1, mX2, mY2) { y: mY2 }]; }; - var str = "generateBezier(" + [mX1, mY1, mX2, mY2] + ")"; - f.toString = function () { return str; }; - return f; } /*! Runge-Kutta spring physics function generator. Adapted from Framer.js, copyright Koen Bok. MIT License: http://en.wikipedia.org/wiki/MIT_License */ - /* Given a tension, friction, and duration, a simulation at 60FPS will first run without a defined duration in order to calculate the full path. A second pass then adjusts the time delta -- using the relation between actual time and duration -- to calculate the path for the duration-constrained animation. */ var generateSpringRK4 = function () { function springAccelerationForState(state) { return -state.tension * state.x - state.friction * state.v; } - function springEvaluateStateWithDerivative(initialState, dt, derivative) { var state = { x: initialState.x + derivative.dx * dt, @@ -34478,71 +33369,64 @@ var generateSpringRK4 = function () { dv: springAccelerationForState(state) }; } - function springIntegrateState(state, dt) { var a = { - dx: state.v, - dv: springAccelerationForState(state) - }, - b = springEvaluateStateWithDerivative(state, dt * 0.5, a), - c = springEvaluateStateWithDerivative(state, dt * 0.5, b), - d = springEvaluateStateWithDerivative(state, dt, c), - dxdt = 1.0 / 6.0 * (a.dx + 2.0 * (b.dx + c.dx) + d.dx), - dvdt = 1.0 / 6.0 * (a.dv + 2.0 * (b.dv + c.dv) + d.dv); + dx: state.v, + dv: springAccelerationForState(state) + }, + b = springEvaluateStateWithDerivative(state, dt * 0.5, a), + c = springEvaluateStateWithDerivative(state, dt * 0.5, b), + d = springEvaluateStateWithDerivative(state, dt, c), + dxdt = 1.0 / 6.0 * (a.dx + 2.0 * (b.dx + c.dx) + d.dx), + dvdt = 1.0 / 6.0 * (a.dv + 2.0 * (b.dv + c.dv) + d.dv); state.x = state.x + dxdt * dt; state.v = state.v + dvdt * dt; return state; } - return function springRK4Factory(tension, friction, duration) { var initState = { - x: -1, - v: 0, - tension: null, - friction: null - }, - path = [0], - time_lapsed = 0, - tolerance = 1 / 10000, - DT = 16 / 1000, - have_duration, - dt, - last_state; + x: -1, + v: 0, + tension: null, + friction: null + }, + path = [0], + time_lapsed = 0, + tolerance = 1 / 10000, + DT = 16 / 1000, + have_duration, + dt, + last_state; tension = parseFloat(tension) || 500; friction = parseFloat(friction) || 20; duration = duration || null; initState.tension = tension; initState.friction = friction; have_duration = duration !== null; - /* Calculate the actual time it takes for this animation to complete with the provided conditions. */ + /* Calculate the actual time it takes for this animation to complete with the provided conditions. */ if (have_duration) { /* Run the simulation without a duration. */ time_lapsed = springRK4Factory(tension, friction); /* Compute the adjusted time delta. */ - dt = time_lapsed / duration * DT; } else { dt = DT; } - for (;;) { /* Next/step function .*/ last_state = springIntegrateState(last_state || initState, dt); /* Store the position. */ - path.push(1 + last_state.x); time_lapsed += 16; /* If the change threshold is reached, break. */ - if (!(Math.abs(last_state.x) > tolerance && Math.abs(last_state.v) > tolerance)) { break; } } + /* If duration is not defined, return the actual time required for completing this animation. Otherwise, return a closure that holds the computed path and returns a snapshot of the position according to a given percentComplete. */ - - return !have_duration ? time_lapsed : function (percentComplete) { return path[percentComplete * (path.length - 1) | 0]; }; @@ -34555,7 +33439,6 @@ var cubicBezier = function cubicBezier(t1, p1, t2, p2) { return start + (end - start) * bezier(percent); }; }; - var easings = { 'linear': function linear(start, end, percent) { return start + (end - start) * percent; @@ -34594,6 +33477,7 @@ var easings = { 'ease-out-circ': cubicBezier(0.075, 0.82, 0.165, 1), 'ease-in-out-circ': cubicBezier(0.785, 0.135, 0.15, 0.86), // user param easings... + 'spring': function spring(tension, friction, duration) { if (duration === 0) { // can't get a spring w/ duration 0 @@ -34612,32 +33496,24 @@ function getEasedValue(type, start, end, percent, easingFn) { if (percent === 1) { return end; } - if (start === end) { return end; } - var val = easingFn(start, end, percent); - if (type == null) { return val; } - if (type.roundValue || type.color) { val = Math.round(val); } - if (type.min !== undefined) { val = Math.max(val, type.min); } - if (type.max !== undefined) { val = Math.min(val, type.max); } - return val; } - function getValue(prop, spec) { if (prop.pfValue != null || prop.value != null) { if (prop.pfValue != null && (spec == null || spec.type.units !== '%')) { @@ -34649,28 +33525,22 @@ function getValue(prop, spec) { return prop; } } - function ease(startProp, endProp, percent, easingFn, propSpec) { var type = propSpec != null ? propSpec.type : null; - if (percent < 0) { percent = 0; } else if (percent > 1) { percent = 1; } - var start = getValue(startProp, propSpec); var end = getValue(endProp, propSpec); - if (number$1(start) && number$1(end)) { return getEasedValue(type, start, end, percent, easingFn); } else if (array(start) && array(end)) { var easedArr = []; - for (var i = 0; i < end.length; i++) { var si = start[i]; var ei = end[i]; - if (si != null && ei != null) { var val = getEasedValue(type, si, ei, percent, easingFn); easedArr.push(val); @@ -34678,10 +33548,8 @@ function ease(startProp, endProp, percent, easingFn, propSpec) { easedArr.push(ei); } } - return easedArr; } - return undefined; } @@ -34693,7 +33561,6 @@ function step$1(self, ani, now, isCore) { var startTime = ani_p.startTime; var cy = isCore ? self : self.cy(); var style = cy.style(); - if (!ani_p.easingImpl) { if (pEasing == null) { // use default @@ -34701,7 +33568,6 @@ function step$1(self, ani, now, isCore) { } else { // then define w/ name var easingVals; - if (string(pEasing)) { var easingProp = style.parse('transition-timing-function', pEasing); easingVals = easingProp.value; @@ -34709,9 +33575,7 @@ function step$1(self, ani, now, isCore) { // then assume preparsed array easingVals = pEasing; } - var name, args; - if (string(easingVals)) { name = easingVals; args = []; @@ -34721,7 +33585,6 @@ function step$1(self, ani, now, isCore) { return +n; }); } - if (args.length > 0) { // create with args if (name === 'spring') { @@ -34735,80 +33598,62 @@ function step$1(self, ani, now, isCore) { } } } - var easing = ani_p.easingImpl; var percent; - if (ani_p.duration === 0) { percent = 1; } else { percent = (now - startTime) / ani_p.duration; } - if (ani_p.applying) { percent = ani_p.progress; } - if (percent < 0) { percent = 0; } else if (percent > 1) { percent = 1; } - if (ani_p.delay == null) { // then update + var startPos = ani_p.startPosition; var endPos = ani_p.position; - if (endPos && isEles && !self.locked()) { var newPos = {}; - if (valid(startPos.x, endPos.x)) { newPos.x = ease(startPos.x, endPos.x, percent, easing); } - if (valid(startPos.y, endPos.y)) { newPos.y = ease(startPos.y, endPos.y, percent, easing); } - self.position(newPos); } - var startPan = ani_p.startPan; var endPan = ani_p.pan; var pan = _p.pan; var animatingPan = endPan != null && isCore; - if (animatingPan) { if (valid(startPan.x, endPan.x)) { pan.x = ease(startPan.x, endPan.x, percent, easing); } - if (valid(startPan.y, endPan.y)) { pan.y = ease(startPan.y, endPan.y, percent, easing); } - self.emit('pan'); } - var startZoom = ani_p.startZoom; var endZoom = ani_p.zoom; var animatingZoom = endZoom != null && isCore; - if (animatingZoom) { if (valid(startZoom, endZoom)) { _p.zoom = bound(_p.minZoom, ease(startZoom, endZoom, percent, easing), _p.maxZoom); } - self.emit('zoom'); } - if (animatingPan || animatingZoom) { self.emit('viewport'); } - var props = ani_p.style; - if (props && props.length > 0 && isEles) { for (var i = 0; i < props.length; i++) { var prop = props[i]; @@ -34820,27 +33665,22 @@ function step$1(self, ani, now, isCore) { style.overrideBypass(self, _name, easedVal); } // for props - self.emit('style'); } // if - } ani_p.progress = percent; return percent; } - function valid(start, end) { if (start == null || end == null) { return false; } - if (number$1(start) && number$1(end)) { return true; } else if (start && end) { return true; } - return false; } @@ -34853,35 +33693,31 @@ function startAnimation(self, ani, now, isCore) { function stepAll(now, cy) { var eles = cy._private.aniEles; var doneEles = []; - function stepOne(ele, isCore) { var _p = ele._private; var current = _p.animation.current; var queue = _p.animation.queue; - var ranAnis = false; // if nothing currently animating, get something from the queue + var ranAnis = false; + // if nothing currently animating, get something from the queue if (current.length === 0) { var next = queue.shift(); - if (next) { current.push(next); } } - var callbacks = function callbacks(_callbacks) { for (var j = _callbacks.length - 1; j >= 0; j--) { var cb = _callbacks[j]; cb(); } - _callbacks.splice(0, _callbacks.length); - }; // step and remove if done - + }; + // step and remove if done for (var i = current.length - 1; i >= 0; i--) { var ani = current[i]; var ani_p = ani._private; - if (ani_p.stopped) { current.splice(i, 1); ani_p.hooked = false; @@ -34890,32 +33726,25 @@ function stepAll(now, cy) { callbacks(ani_p.frames); continue; } - if (!ani_p.playing && !ani_p.applying) { continue; - } // an apply() while playing shouldn't do anything - + } + // an apply() while playing shouldn't do anything if (ani_p.playing && ani_p.applying) { ani_p.applying = false; } - if (!ani_p.started) { startAnimation(ele, ani, now); } - step$1(ele, ani, now, isCore); - if (ani_p.applying) { ani_p.applying = false; } - callbacks(ani_p.frames); - if (ani_p.step != null) { ani_p.step(now); } - if (ani.completed()) { current.splice(i, 1); ani_p.hooked = false; @@ -34923,39 +33752,34 @@ function stepAll(now, cy) { ani_p.started = false; callbacks(ani_p.completes); } - ranAnis = true; } - if (!isCore && current.length === 0 && queue.length === 0) { doneEles.push(ele); } - return ranAnis; } // stepElement - // handle all eles - + // handle all eles var ranEleAni = false; - for (var e = 0; e < eles.length; e++) { var ele = eles[e]; var handledThisEle = stepOne(ele); ranEleAni = ranEleAni || handledThisEle; } // each element + var ranCoreAni = stepOne(cy, true); - var ranCoreAni = stepOne(cy, true); // notify renderer - + // notify renderer if (ranEleAni || ranCoreAni) { if (eles.length > 0) { cy.notify('draw', eles); } else { cy.notify('draw'); } - } // remove elements from list of currently animating if its queues are empty - + } + // remove elements from list of currently animating if its queues are empty eles.unmerge(doneEles); cy.emit('step'); } // stepAll @@ -34971,12 +33795,10 @@ var corefn$8 = { stop: define.stop(), addToAnimationPool: function addToAnimationPool(eles) { var cy = this; - if (!cy.styleEnabled()) { return; } // save cycles when no style used - cy._private.aniEles.merge(eles); }, stopAnimationLoop: function stopAnimationLoop() { @@ -34985,27 +33807,23 @@ var corefn$8 = { startAnimationLoop: function startAnimationLoop() { var cy = this; cy._private.animationsRunning = true; - if (!cy.styleEnabled()) { return; } // save cycles when no style used + // NB the animation loop will exec in headless environments if style enabled // and explicit cy.destroy() is necessary to stop the loop - function headlessStep() { if (!cy._private.animationsRunning) { return; } - requestAnimationFrame(function animationStep(now) { stepAll(now, cy); headlessStep(); }); } - var renderer = cy.renderer(); - if (renderer && renderer.beforeRender) { // let the renderer schedule animations renderer.beforeRender(function rendererAnimationStep(willDraw, now) { @@ -35028,11 +33846,9 @@ var emitterOptions = { }, eventMatches: function eventMatches(cy, listener, eventObj) { var selector = listener.qualifier; - if (selector != null) { return cy !== eventObj.target && element(eventObj.target) && selector.matches(eventObj.target); } - return true; }, addEventFields: function addEventFields(cy, evt) { @@ -35043,7 +33859,6 @@ var emitterOptions = { return listener.qualifier != null ? eventObj.target : cy; } }; - var argSelector = function argSelector(arg) { if (string(arg)) { return new Selector(arg); @@ -35051,15 +33866,12 @@ var argSelector = function argSelector(arg) { return arg; } }; - var elesfn = { createEmitter: function createEmitter() { var _p = this._private; - if (!_p.emitter) { _p.emitter = new Emitter(emitterOptions, this); } - return this; }, emitter: function emitter() { @@ -35115,33 +33927,26 @@ corefn$7.jpeg = corefn$7.jpg; var corefn$6 = { layout: function layout(options) { var cy = this; - if (options == null) { error('Layout options must be specified to make a layout'); return; } - if (options.name == null) { error('A `name` must be specified to make a layout'); return; } - var name = options.name; var Layout = cy.extension('layout', name); - if (Layout == null) { error('No such layout `' + name + '` found. Did you forget to import it and `cytoscape.use()` it?'); return; } - var eles; - if (string(options.eles)) { eles = cy.$(options.eles); } else { eles = options.eles != null ? options.eles : cy.$(); } - var layout = new Layout(extend({}, options, { cy: cy, eles: eles @@ -35154,15 +33959,12 @@ corefn$6.createLayout = corefn$6.makeLayout = corefn$6.layout; var corefn$5 = { notify: function notify(eventName, eventEles) { var _p = this._private; - if (this.batching()) { _p.batchNotifications = _p.batchNotifications || {}; var eles = _p.batchNotifications[eventName] = _p.batchNotifications[eventName] || this.collection(); - if (eventEles != null) { eles.merge(eventEles); } - return; // notifications are disabled during batching } @@ -35170,24 +33972,21 @@ var corefn$5 = { return; } // exit on disabled + var renderer = this.renderer(); - var renderer = this.renderer(); // exit if destroy() called on core or renderer in between frames #1499 #1528 - + // exit if destroy() called on core or renderer in between frames #1499 #1528 if (this.destroyed() || !renderer) { return; } - renderer.notify(eventName, eventEles); }, notifications: function notifications(bool) { var p = this._private; - if (bool === undefined) { return p.notificationsEnabled; } else { p.notificationsEnabled = bool ? true : false; } - return this; }, noNotifications: function noNotifications(callback) { @@ -35200,37 +33999,30 @@ var corefn$5 = { }, startBatch: function startBatch() { var _p = this._private; - if (_p.batchCount == null) { _p.batchCount = 0; } - if (_p.batchCount === 0) { _p.batchStyleEles = this.collection(); _p.batchNotifications = {}; } - _p.batchCount++; return this; }, endBatch: function endBatch() { var _p = this._private; - if (_p.batchCount === 0) { return this; } - _p.batchCount--; - if (_p.batchCount === 0) { // update style for dirty eles _p.batchStyleEles.updateStyle(); + var renderer = this.renderer(); - var renderer = this.renderer(); // notify the renderer of queued eles and event types - + // notify the renderer of queued eles and event types Object.keys(_p.batchNotifications).forEach(function (eventName) { var eles = _p.batchNotifications[eventName]; - if (eles.empty()) { renderer.notify(eventName); } else { @@ -35238,7 +34030,6 @@ var corefn$5 = { } }); } - return this; }, batch: function batch(callback) { @@ -35252,7 +34043,6 @@ var corefn$5 = { var cy = this; return this.batch(function () { var ids = Object.keys(map); - for (var i = 0; i < ids.length; i++) { var id = ids[i]; var data = map[id]; @@ -35296,16 +34086,13 @@ var corefn$4 = { initRenderer: function initRenderer(options) { var cy = this; var RendererProto = cy.extension('renderer', options.name); - if (RendererProto == null) { error("Can not initialise: No such renderer `".concat(options.name, "` found. Did you forget to import it and `cytoscape.use()` it?")); return; } - if (options.wheelSensitivity !== undefined) { warn("You have set a custom wheel sensitivity. This will make your app zoom unnaturally when using mainstream mice. You should change this value from the default only if you can guarantee that all your users will use the same hardware and OS configuration as your current machine."); } - var rOpts = rendererDefaults(options); rOpts.cy = cy; cy._private.renderer = new RendererProto(rOpts); @@ -35316,17 +34103,13 @@ var corefn$4 = { cy.notify('destroy'); // destroy the renderer var domEle = cy.container(); - if (domEle) { domEle._cyreg = null; - while (domEle.childNodes.length > 0) { domEle.removeChild(domEle.childNodes[0]); } } - cy._private.renderer = null; // to be extra safe, remove the ref - cy.mutableElements().forEach(function (ele) { var _p = ele._private; _p.rscratch = {}; @@ -35358,38 +34141,31 @@ var corefn$3 = { if (!opts) { opts = {}; } - return new Collection(this, eles, opts.unique, opts.removed); } - return new Collection(this); }, nodes: function nodes(selector) { var nodes = this.$(function (ele) { return ele.isNode(); }); - if (selector) { return nodes.filter(selector); } - return nodes; }, edges: function edges(selector) { var edges = this.$(function (ele) { return ele.isEdge(); }); - if (selector) { return edges.filter(selector); } - return edges; }, // search the graph like jQuery $: function $(selector) { var eles = this._private.elements; - if (selector) { return eles.filter(selector); } else { @@ -35399,75 +34175,65 @@ var corefn$3 = { mutableElements: function mutableElements() { return this._private.elements; } -}; // aliases +}; +// aliases corefn$3.elements = corefn$3.filter = corefn$3.$; -var styfn$8 = {}; // keys for style blocks, e.g. ttfftt +var styfn$8 = {}; +// keys for style blocks, e.g. ttfftt var TRUE = 't'; -var FALSE = 'f'; // (potentially expensive calculation) +var FALSE = 'f'; + +// (potentially expensive calculation) // apply the style to the element based on // - its bypass // - what selectors match it - styfn$8.apply = function (eles) { var self = this; var _p = self._private; var cy = _p.cy; var updatedEles = cy.collection(); - for (var ie = 0; ie < eles.length; ie++) { var ele = eles[ie]; var cxtMeta = self.getContextMeta(ele); - if (cxtMeta.empty) { continue; } - var cxtStyle = self.getContextStyle(cxtMeta); var app = self.applyContextStyle(cxtMeta, cxtStyle, ele); - if (ele._private.appliedInitStyle) { self.updateTransitions(ele, app.diffProps); } else { ele._private.appliedInitStyle = true; } - var hintsDiff = self.updateStyleHints(ele); - if (hintsDiff) { updatedEles.push(ele); } } // for elements - return updatedEles; }; - styfn$8.getPropertiesDiff = function (oldCxtKey, newCxtKey) { var self = this; var cache = self._private.propDiffs = self._private.propDiffs || {}; var dualCxtKey = oldCxtKey + '-' + newCxtKey; var cachedVal = cache[dualCxtKey]; - if (cachedVal) { return cachedVal; } - var diffProps = []; var addedProp = {}; - for (var i = 0; i < self.length; i++) { var cxt = self[i]; var oldHasCxt = oldCxtKey[i] === TRUE; var newHasCxt = newCxtKey[i] === TRUE; var cxtHasDiffed = oldHasCxt !== newHasCxt; var cxtHasMappedProps = cxt.mappedProperties.length > 0; - if (cxtHasDiffed || newHasCxt && cxtHasMappedProps) { var props = void 0; - if (cxtHasDiffed && cxtHasMappedProps) { props = cxt.properties; // suffices b/c mappedProperties is a subset of properties } else if (cxtHasDiffed) { @@ -35478,27 +34244,23 @@ styfn$8.getPropertiesDiff = function (oldCxtKey, newCxtKey) { for (var j = 0; j < props.length; j++) { var prop = props[j]; - var name = prop.name; // if a later context overrides this property, then the fact that this context has switched/diffed doesn't matter + var name = prop.name; + + // if a later context overrides this property, then the fact that this context has switched/diffed doesn't matter // (semi expensive check since it makes this function O(n^2) on context length, but worth it since overall result // is cached) - var laterCxtOverrides = false; - for (var k = i + 1; k < self.length; k++) { var laterCxt = self[k]; var hasLaterCxt = newCxtKey[k] === TRUE; - if (!hasLaterCxt) { continue; } // can't override unless the context is active - laterCxtOverrides = laterCxt.properties[prop.name] != null; - if (laterCxtOverrides) { break; } // exit early as long as one later context overrides - } if (!addedProp[name] && !laterCxtOverrides) { @@ -35506,22 +34268,19 @@ styfn$8.getPropertiesDiff = function (oldCxtKey, newCxtKey) { diffProps.push(name); } } // for props - } // if - } // for contexts - cache[dualCxtKey] = diffProps; return diffProps; }; - styfn$8.getContextMeta = function (ele) { var self = this; var cxtKey = ''; var diffProps; - var prevKey = ele._private.styleCxtKey || ''; // get the cxt key + var prevKey = ele._private.styleCxtKey || ''; + // get the cxt key for (var i = 0; i < self.length; i++) { var context = self[i]; var contextSelectorMatches = context.selector && context.selector.matches(ele); // NB: context.selector may be null for 'core' @@ -35533,7 +34292,6 @@ styfn$8.getContextMeta = function (ele) { } } // for context - diffProps = self.getPropertiesDiff(prevKey, cxtKey); ele._private.styleCxtKey = cxtKey; return { @@ -35541,53 +34299,46 @@ styfn$8.getContextMeta = function (ele) { diffPropNames: diffProps, empty: diffProps.length === 0 }; -}; // gets a computed ele style object based on matched contexts - +}; +// gets a computed ele style object based on matched contexts styfn$8.getContextStyle = function (cxtMeta) { var cxtKey = cxtMeta.key; var self = this; - var cxtStyles = this._private.contextStyles = this._private.contextStyles || {}; // if already computed style, returned cached copy + var cxtStyles = this._private.contextStyles = this._private.contextStyles || {}; + // if already computed style, returned cached copy if (cxtStyles[cxtKey]) { return cxtStyles[cxtKey]; } - var style = { _private: { key: cxtKey } }; - for (var i = 0; i < self.length; i++) { var cxt = self[i]; var hasCxt = cxtKey[i] === TRUE; - if (!hasCxt) { continue; } - for (var j = 0; j < cxt.properties.length; j++) { var prop = cxt.properties[j]; style[prop.name] = prop; } } - cxtStyles[cxtKey] = style; return style; }; - styfn$8.applyContextStyle = function (cxtMeta, cxtStyle, ele) { var self = this; var diffProps = cxtMeta.diffPropNames; var retDiffProps = {}; var types = self.types; - for (var i = 0; i < diffProps.length; i++) { var diffPropName = diffProps[i]; var cxtProp = cxtStyle[diffPropName]; var eleProp = ele.pstyle(diffPropName); - if (!cxtProp) { // no context prop means delete if (!eleProp) { @@ -35604,14 +34355,14 @@ styfn$8.applyContextStyle = function (cxtMeta, cxtStyle, ele) { "delete": true }; } - } // save cycles when the context prop doesn't need to be applied - + } + // save cycles when the context prop doesn't need to be applied if (eleProp === cxtProp) { continue; - } // save cycles when a mapped context prop doesn't need to be applied - + } + // save cycles when a mapped context prop doesn't need to be applied if (cxtProp.mapped === types.fn // context prop is function mapper && eleProp != null // some props can be null even by default (e.g. a prop that overrides another one) && eleProp.mapping != null // ele prop is a concrete value from from a mapper @@ -35619,141 +34370,125 @@ styfn$8.applyContextStyle = function (cxtMeta, cxtStyle, ele) { ) { // NB don't write to cxtProp, as it's shared among eles (stored in stylesheet) var mapping = eleProp.mapping; // can write to mapping, as it's a per-ele copy - var fnValue = mapping.fnValue = cxtProp.value(ele); // temporarily cache the value in case of a miss if (fnValue === mapping.prevFnValue) { continue; } } - var retDiffProp = retDiffProps[diffPropName] = { prev: eleProp }; self.applyParsedProperty(ele, cxtProp); retDiffProp.next = ele.pstyle(diffPropName); - if (retDiffProp.next && retDiffProp.next.bypass) { retDiffProp.next = retDiffProp.next.bypassed; } } - return { diffProps: retDiffProps }; }; - styfn$8.updateStyleHints = function (ele) { var _p = ele._private; var self = this; var propNames = self.propertyGroupNames; var propGrKeys = self.propertyGroupKeys; - var propHash = function propHash(ele, propNames, seedKey) { return self.getPropertiesHash(ele, propNames, seedKey); }; - var oldStyleKey = _p.styleKey; - if (ele.removed()) { return false; } + var isNode = _p.group === 'nodes'; - var isNode = _p.group === 'nodes'; // get the style key hashes per prop group + // get the style key hashes per prop group // but lazily -- only use non-default prop values to reduce the number of hashes // var overriddenStyles = ele._private.style; propNames = Object.keys(overriddenStyles); - for (var i = 0; i < propGrKeys.length; i++) { var grKey = propGrKeys[i]; _p.styleKeys[grKey] = [DEFAULT_HASH_SEED, DEFAULT_HASH_SEED_ALT]; } - var updateGrKey1 = function updateGrKey1(val, grKey) { return _p.styleKeys[grKey][0] = hashInt(val, _p.styleKeys[grKey][0]); }; - var updateGrKey2 = function updateGrKey2(val, grKey) { return _p.styleKeys[grKey][1] = hashIntAlt(val, _p.styleKeys[grKey][1]); }; - var updateGrKey = function updateGrKey(val, grKey) { updateGrKey1(val, grKey); updateGrKey2(val, grKey); }; - var updateGrKeyWStr = function updateGrKeyWStr(strVal, grKey) { for (var j = 0; j < strVal.length; j++) { var ch = strVal.charCodeAt(j); updateGrKey1(ch, grKey); updateGrKey2(ch, grKey); } - }; // - hashing works on 32 bit ints b/c we use bitwise ops + }; + + // - hashing works on 32 bit ints b/c we use bitwise ops // - small numbers get cut off (e.g. 0.123 is seen as 0 by the hashing function) // - raise up small numbers so more significant digits are seen by hashing // - make small numbers larger than a normal value to avoid collisions // - works in practice and it's relatively cheap - - var N = 2000000000; - var cleanNum = function cleanNum(val) { return -128 < val && val < 128 && Math.floor(val) !== val ? N - (val * 1024 | 0) : val; }; - for (var _i = 0; _i < propNames.length; _i++) { var name = propNames[_i]; var parsedProp = overriddenStyles[name]; - if (parsedProp == null) { continue; } - var propInfo = this.properties[name]; var type = propInfo.type; var _grKey = propInfo.groupKey; var normalizedNumberVal = void 0; - if (propInfo.hashOverride != null) { normalizedNumberVal = propInfo.hashOverride(ele, parsedProp); } else if (parsedProp.pfValue != null) { normalizedNumberVal = parsedProp.pfValue; - } // might not be a number if it allows enums - + } + // might not be a number if it allows enums var numberVal = propInfo.enums == null ? parsedProp.value : null; var haveNormNum = normalizedNumberVal != null; var haveUnitedNum = numberVal != null; var haveNum = haveNormNum || haveUnitedNum; - var units = parsedProp.units; // numbers are cheaper to hash than strings - // 1 hash op vs n hash ops (for length n string) + var units = parsedProp.units; + // numbers are cheaper to hash than strings + // 1 hash op vs n hash ops (for length n string) if (type.number && haveNum && !type.multiple) { var v = haveNormNum ? normalizedNumberVal : numberVal; updateGrKey(cleanNum(v), _grKey); - if (!haveNormNum && units != null) { updateGrKeyWStr(units, _grKey); } } else { updateGrKeyWStr(parsedProp.strValue, _grKey); } - } // overall style key - // + } + // overall style key + // var hash = [DEFAULT_HASH_SEED, DEFAULT_HASH_SEED_ALT]; - for (var _i2 = 0; _i2 < propGrKeys.length; _i2++) { var _grKey2 = propGrKeys[_i2]; var grHash = _p.styleKeys[_grKey2]; hash[0] = hashInt(grHash[0], hash[0]); hash[1] = hashIntAlt(grHash[1], hash[1]); } + _p.styleKey = combineHashes(hash[0], hash[1]); - _p.styleKey = combineHashes(hash[0], hash[1]); // label dims + // label dims // var sk = _p.styleKeys; @@ -35761,7 +34496,6 @@ styfn$8.updateStyleHints = function (ele) { var labelKeys = propHash(ele, ['label'], sk.labelDimensions); _p.labelKey = combineHashesArray(labelKeys); _p.labelStyleKey = combineHashesArray(hashArrays(sk.commonLabel, labelKeys)); - if (!isNode) { var sourceLabelKeys = propHash(ele, ['source-label'], sk.labelDimensions); _p.sourceLabelKey = combineHashesArray(sourceLabelKeys); @@ -35769,27 +34503,26 @@ styfn$8.updateStyleHints = function (ele) { var targetLabelKeys = propHash(ele, ['target-label'], sk.labelDimensions); _p.targetLabelKey = combineHashesArray(targetLabelKeys); _p.targetLabelStyleKey = combineHashesArray(hashArrays(sk.commonLabel, targetLabelKeys)); - } // node - // + } + // node + // if (isNode) { var _p$styleKeys = _p.styleKeys, - nodeBody = _p$styleKeys.nodeBody, - nodeBorder = _p$styleKeys.nodeBorder, - backgroundImage = _p$styleKeys.backgroundImage, - compound = _p$styleKeys.compound, - pie = _p$styleKeys.pie; + nodeBody = _p$styleKeys.nodeBody, + nodeBorder = _p$styleKeys.nodeBorder, + backgroundImage = _p$styleKeys.backgroundImage, + compound = _p$styleKeys.compound, + pie = _p$styleKeys.pie; var nodeKeys = [nodeBody, nodeBorder, backgroundImage, compound, pie].filter(function (k) { return k != null; }).reduce(hashArrays, [DEFAULT_HASH_SEED, DEFAULT_HASH_SEED_ALT]); _p.nodeKey = combineHashesArray(nodeKeys); _p.hasPie = pie != null && pie[0] !== DEFAULT_HASH_SEED && pie[1] !== DEFAULT_HASH_SEED_ALT; } - return oldStyleKey !== _p.styleKey; }; - styfn$8.clearStyleHints = function (ele) { var _p = ele._private; _p.styleCxtKey = ''; @@ -35803,7 +34536,9 @@ styfn$8.clearStyleHints = function (ele) { _p.targetLabelStyleKey = null; _p.nodeKey = null; _p.hasPie = null; -}; // apply a property to the style (for internal use) +}; + +// apply a property to the style (for internal use) // returns whether application was successful // // now, this function flattens the property, and here's how: @@ -35819,8 +34554,6 @@ styfn$8.clearStyleHints = function (ele) { // // for parsedProp:{ bypass: true } // the generated flattenedProp:{ bypassed: parsedProp } - - styfn$8.applyParsedProperty = function (ele, parsedProp) { var self = this; var prop = parsedProp; @@ -35833,7 +34566,6 @@ styfn$8.applyParsedProperty = function (ele, parsedProp) { var origPropIsBypass = origProp && origProp.bypass; var _p = ele._private; var flatPropMapping = 'mapping'; - var getVal = function getVal(p) { if (p == null) { return null; @@ -35843,31 +34575,29 @@ styfn$8.applyParsedProperty = function (ele, parsedProp) { return p.value; } }; - var checkTriggers = function checkTriggers() { var fromVal = getVal(origProp); var toVal = getVal(prop); self.checkTriggers(ele, prop.name, fromVal, toVal); }; - if (prop && prop.name.substr(0, 3) === 'pie') { warn('The pie style properties are deprecated. Create charts using background images instead.'); - } // edge sanity checks to prevent the client from making serious mistakes - + } - if (parsedProp.name === 'curve-style' && ele.isEdge() && ( // loops must be bundled beziers - parsedProp.value !== 'bezier' && ele.isLoop() || // edges connected to compound nodes can not be haystacks + // edge sanity checks to prevent the client from making serious mistakes + if (parsedProp.name === 'curve-style' && ele.isEdge() && ( + // loops must be bundled beziers + parsedProp.value !== 'bezier' && ele.isLoop() || + // edges connected to compound nodes can not be haystacks parsedProp.value === 'haystack' && (ele.source().isParent() || ele.target().isParent()))) { prop = parsedProp = this.parse(parsedProp.name, 'bezier', propIsBypass); } - if (prop["delete"]) { // delete the property and use the default value on falsey value style[prop.name] = undefined; checkTriggers(); return true; } - if (prop.deleteBypassed) { // delete the property that the if (!origProp) { @@ -35881,9 +34611,9 @@ styfn$8.applyParsedProperty = function (ele, parsedProp) { } else { return false; // we're unsuccessful deleting the bypassed } - } // check if we need to delete the current bypass - + } + // check if we need to delete the current bypass if (prop.deleteBypass) { // then this property is just here to indicate we need to delete if (!origProp) { @@ -35902,9 +34632,9 @@ styfn$8.applyParsedProperty = function (ele, parsedProp) { var printMappingErr = function printMappingErr() { warn('Do not assign mappings to elements without corresponding data (i.e. ele `' + ele.id() + '` has no mapping for property `' + prop.name + '` with data field `' + prop.field + '`); try a `[' + prop.field + ']` selector to limit scope to elements with `' + prop.field + '` defined'); - }; // put the property in the style objects - + }; + // put the property in the style objects switch (prop.mapped) { // flatten the property if mapped case types.mapData: @@ -35912,41 +34642,35 @@ styfn$8.applyParsedProperty = function (ele, parsedProp) { // flatten the field (e.g. data.foo.bar) var fields = prop.field.split('.'); var fieldVal = _p.data; - for (var i = 0; i < fields.length && fieldVal; i++) { var field = fields[i]; fieldVal = fieldVal[field]; } - if (fieldVal == null) { printMappingErr(); return false; } - var percent; - if (!number$1(fieldVal)) { // then don't apply and fall back on the existing style warn('Do not use continuous mappers without specifying numeric data (i.e. `' + prop.field + ': ' + fieldVal + '` for `' + ele.id() + '` is non-numeric)'); return false; } else { var fieldWidth = prop.fieldMax - prop.fieldMin; - if (fieldWidth === 0) { // safety check -- not strictly necessary as no props of zero range should be passed here percent = 0; } else { percent = (fieldVal - prop.fieldMin) / fieldWidth; } - } // make sure to bound percent value - + } + // make sure to bound percent value if (percent < 0) { percent = 0; } else if (percent > 1) { percent = 1; } - if (type.color) { var r1 = prop.valueMin[0]; var r2 = prop.valueMax[0]; @@ -35977,70 +34701,55 @@ styfn$8.applyParsedProperty = function (ele, parsedProp) { printMappingErr(); return false; } - flatProp.mapping = prop; // keep a reference to the mapping - prop = flatProp; // the flattened (mapped) property is the one we want break; } - // direct mapping + // direct mapping case types.data: { // flatten the field (e.g. data.foo.bar) var _fields = prop.field.split('.'); - var _fieldVal = _p.data; - for (var _i3 = 0; _i3 < _fields.length && _fieldVal; _i3++) { var _field = _fields[_i3]; _fieldVal = _fieldVal[_field]; } - if (_fieldVal != null) { flatProp = this.parse(prop.name, _fieldVal, prop.bypass, flatPropMapping); } - if (!flatProp) { // if we can't flatten the property, then don't apply and fall back on the existing style printMappingErr(); return false; } - flatProp.mapping = prop; // keep a reference to the mapping - prop = flatProp; // the flattened (mapped) property is the one we want break; } - case types.fn: { var fn = prop.value; var fnRetVal = prop.fnValue != null ? prop.fnValue : fn(ele); // check for cached value before calling function prop.prevFnValue = fnRetVal; - if (fnRetVal == null) { warn('Custom function mappers may not return null (i.e. `' + prop.name + '` for ele `' + ele.id() + '` is null)'); return false; } - flatProp = this.parse(prop.name, fnRetVal, prop.bypass, flatPropMapping); - if (!flatProp) { warn('Custom function mappers may not return invalid values for the property type (i.e. `' + prop.name + '` for ele `' + ele.id() + '` is invalid)'); return false; } - flatProp.mapping = copy(prop); // keep a reference to the mapping - prop = flatProp; // the flattened (mapped) property is the one we want break; } - case undefined: break; // just set the property @@ -36048,9 +34757,9 @@ styfn$8.applyParsedProperty = function (ele, parsedProp) { default: return false; // not a valid mapping - } // if the property is a bypass property, then link the resultant property to the original one - + } + // if the property is a bypass property, then link the resultant property to the original one if (propIsBypass) { if (origPropIsBypass) { // then this bypass overrides the existing one @@ -36059,7 +34768,6 @@ styfn$8.applyParsedProperty = function (ele, parsedProp) { // then link the orig prop to the new bypass prop.bypassed = origProp; } - style[prop.name] = prop; // and set } else { // prop is not bypass @@ -36071,28 +34779,23 @@ styfn$8.applyParsedProperty = function (ele, parsedProp) { style[prop.name] = prop; } } - checkTriggers(); return true; }; - styfn$8.cleanElements = function (eles, keepBypasses) { for (var i = 0; i < eles.length; i++) { var ele = eles[i]; this.clearStyleHints(ele); ele.dirtyCompoundBoundsCache(); ele.dirtyBoundingBoxCache(); - if (!keepBypasses) { ele._private.style = {}; } else { var style = ele._private.style; var propNames = Object.keys(style); - for (var j = 0; j < propNames.length; j++) { var propName = propNames[j]; var eleProp = style[propName]; - if (eleProp != null) { if (eleProp.bypass) { eleProp.bypassed = null; @@ -36103,37 +34806,34 @@ styfn$8.cleanElements = function (eles, keepBypasses) { } } } -}; // updates the visual style for all elements (useful for manual style modification after init) - +}; +// updates the visual style for all elements (useful for manual style modification after init) styfn$8.update = function () { var cy = this._private.cy; var eles = cy.mutableElements(); eles.updateStyle(); -}; // diffProps : { name => { prev, next } } - +}; +// diffProps : { name => { prev, next } } styfn$8.updateTransitions = function (ele, diffProps) { var self = this; var _p = ele._private; var props = ele.pstyle('transition-property').value; var duration = ele.pstyle('transition-duration').pfValue; var delay = ele.pstyle('transition-delay').pfValue; - if (props.length > 0 && duration > 0) { - var style = {}; // build up the style to animate towards + var style = {}; + // build up the style to animate towards var anyPrev = false; - for (var i = 0; i < props.length; i++) { var prop = props[i]; var styProp = ele.pstyle(prop); var diffProp = diffProps[prop]; - if (!diffProp) { continue; } - var prevProp = diffProp.prev; var fromProp = prevProp; var toProp = diffProp.next != null ? diffProp.next : styProp; @@ -36143,38 +34843,36 @@ styfn$8.updateTransitions = function (ele, diffProps) { if (!fromProp) { continue; - } // consider px values - + } + // consider px values if (number$1(fromProp.pfValue) && number$1(toProp.pfValue)) { diff = toProp.pfValue - fromProp.pfValue; // nonzero is truthy + initVal = fromProp.pfValue + initDt * diff; - initVal = fromProp.pfValue + initDt * diff; // consider numerical values + // consider numerical values } else if (number$1(fromProp.value) && number$1(toProp.value)) { diff = toProp.value - fromProp.value; // nonzero is truthy + initVal = fromProp.value + initDt * diff; - initVal = fromProp.value + initDt * diff; // consider colour values + // consider colour values } else if (array(fromProp.value) && array(toProp.value)) { diff = fromProp.value[0] !== toProp.value[0] || fromProp.value[1] !== toProp.value[1] || fromProp.value[2] !== toProp.value[2]; initVal = fromProp.strValue; - } // the previous value is good for an animation only if it's different - + } + // the previous value is good for an animation only if it's different if (diff) { style[prop] = toProp.strValue; // to val - this.applyBypass(ele, prop, initVal); // from val - anyPrev = true; } } // end if props allow ani - // can't transition if there's nothing previous to transition from - + // can't transition if there's nothing previous to transition from if (!anyPrev) { return; } - _p.transitioning = true; new Promise$1(function (resolve) { if (delay > 0) { @@ -36192,7 +34890,8 @@ styfn$8.updateTransitions = function (ele, diffProps) { }).then(function () { // if( !isBypass ){ self.removeBypasses(ele, props); - ele.emitAndNotify('style'); // } + ele.emitAndNotify('style'); + // } _p.transitioning = false; }); @@ -36202,35 +34901,32 @@ styfn$8.updateTransitions = function (ele, diffProps) { _p.transitioning = false; } }; - styfn$8.checkTrigger = function (ele, name, fromValue, toValue, getTrigger, onTrigger) { var prop = this.properties[name]; var triggerCheck = getTrigger(prop); - if (triggerCheck != null && triggerCheck(fromValue, toValue)) { onTrigger(prop); } }; - styfn$8.checkZOrderTrigger = function (ele, name, fromValue, toValue) { var _this = this; - this.checkTrigger(ele, name, fromValue, toValue, function (prop) { return prop.triggersZOrder; }, function () { _this._private.cy.notify('zorder', ele); }); }; - styfn$8.checkBoundsTrigger = function (ele, name, fromValue, toValue) { this.checkTrigger(ele, name, fromValue, toValue, function (prop) { return prop.triggersBounds; }, function (prop) { ele.dirtyCompoundBoundsCache(); - ele.dirtyBoundingBoxCache(); // if the prop change makes the bb of pll bezier edges invalid, - // then dirty the pll edge bb cache as well + ele.dirtyBoundingBoxCache(); - if ( // only for beziers -- so performance of other edges isn't affected + // if the prop change makes the bb of pll bezier edges invalid, + // then dirty the pll edge bb cache as well + if ( + // only for beziers -- so performance of other edges isn't affected prop.triggersBoundsOfParallelBeziers && (name === 'curve-style' && (fromValue === 'bezier' || toValue === 'bezier') || name === 'display' && (fromValue === 'none' || toValue === 'none'))) { ele.parallelEdges().forEach(function (pllEdge) { if (pllEdge.isBundledBezier()) { @@ -36240,29 +34936,30 @@ styfn$8.checkBoundsTrigger = function (ele, name, fromValue, toValue) { } }); }; - styfn$8.checkTriggers = function (ele, name, fromValue, toValue) { ele.dirtyStyleCache(); this.checkZOrderTrigger(ele, name, fromValue, toValue); this.checkBoundsTrigger(ele, name, fromValue, toValue); }; -var styfn$7 = {}; // bypasses are applied to an existing style on an element, and just tacked on temporarily -// returns true iff application was successful for at least 1 specified property +var styfn$7 = {}; +// bypasses are applied to an existing style on an element, and just tacked on temporarily +// returns true iff application was successful for at least 1 specified property styfn$7.applyBypass = function (eles, name, value, updateTransitions) { var self = this; var props = []; - var isBypass = true; // put all the properties (can specify one or many) in an array after parsing them + var isBypass = true; + // put all the properties (can specify one or many) in an array after parsing them if (name === '*' || name === '**') { // apply to all property names + if (value !== undefined) { for (var i = 0; i < self.properties.length; i++) { var prop = self.properties[i]; var _name = prop.name; var parsedProp = this.parse(_name, value, true); - if (parsedProp) { props.push(parsedProp); } @@ -36271,7 +34968,6 @@ styfn$7.applyBypass = function (eles, name, value, updateTransitions) { } else if (string(name)) { // then parse the single property var _parsedProp = this.parse(name, value, true); - if (_parsedProp) { props.push(_parsedProp); } @@ -36280,19 +34976,15 @@ styfn$7.applyBypass = function (eles, name, value, updateTransitions) { var specifiedProps = name; updateTransitions = value; var names = Object.keys(specifiedProps); - for (var _i = 0; _i < names.length; _i++) { var _name2 = names[_i]; var _value = specifiedProps[_name2]; - if (_value === undefined) { // try camel case name too _value = specifiedProps[dash2camel(_name2)]; } - if (_value !== undefined) { var _parsedProp2 = this.parse(_name2, _value, true); - if (_parsedProp2) { props.push(_parsedProp2); } @@ -36301,58 +34993,49 @@ styfn$7.applyBypass = function (eles, name, value, updateTransitions) { } else { // can't do anything without well defined properties return false; - } // we've failed if there are no valid properties - + } + // we've failed if there are no valid properties if (props.length === 0) { return false; - } // now, apply the bypass properties on the elements - + } + // now, apply the bypass properties on the elements var ret = false; // return true if at least one succesful bypass applied - for (var _i2 = 0; _i2 < eles.length; _i2++) { // for each ele var ele = eles[_i2]; var diffProps = {}; var diffProp = void 0; - for (var j = 0; j < props.length; j++) { // for each prop var _prop = props[j]; - if (updateTransitions) { var prevProp = ele.pstyle(_prop.name); diffProp = diffProps[_prop.name] = { prev: prevProp }; } - ret = this.applyParsedProperty(ele, copy(_prop)) || ret; - if (updateTransitions) { diffProp.next = ele.pstyle(_prop.name); } } // for props - if (ret) { this.updateStyleHints(ele); } - if (updateTransitions) { this.updateTransitions(ele, diffProps, isBypass); } } // for eles - return ret; -}; // only useful in specific cases like animation - +}; +// only useful in specific cases like animation styfn$7.overrideBypass = function (eles, name, value) { name = camel2dash(name); - for (var i = 0; i < eles.length; i++) { var ele = eles[i]; var prop = ele._private.style[name]; @@ -36360,17 +35043,14 @@ styfn$7.overrideBypass = function (eles, name, value) { var isColor = type.color; var isMulti = type.mutiple; var oldValue = !prop ? null : prop.pfValue != null ? prop.pfValue : prop.value; - if (!prop || !prop.bypass) { // need a bypass if one doesn't exist this.applyBypass(ele, name, value); } else { prop.value = value; - if (prop.pfValue != null) { prop.pfValue = value; } - if (isColor) { prop.strValue = 'rgb(' + value.join(',') + ')'; } else if (isMulti) { @@ -36378,37 +35058,28 @@ styfn$7.overrideBypass = function (eles, name, value) { } else { prop.strValue = '' + value; } - this.updateStyleHints(ele); } - this.checkTriggers(ele, name, oldValue, value); } }; - styfn$7.removeAllBypasses = function (eles, updateTransitions) { return this.removeBypasses(eles, this.propertyNames, updateTransitions); }; - styfn$7.removeBypasses = function (eles, props, updateTransitions) { var isBypass = true; - for (var j = 0; j < eles.length; j++) { var ele = eles[j]; var diffProps = {}; - for (var i = 0; i < props.length; i++) { var name = props[i]; var prop = this.properties[name]; var prevProp = ele.pstyle(prop.name); - if (!prevProp || !prevProp.bypass) { // if a bypass doesn't exist for the prop, nothing needs to be removed continue; } - var value = ''; // empty => remove bypass - var parsedProp = this.parse(name, value, true); var diffProp = diffProps[prop.name] = { prev: prevProp @@ -36417,110 +35088,95 @@ styfn$7.removeBypasses = function (eles, props, updateTransitions) { diffProp.next = ele.pstyle(prop.name); } // for props - this.updateStyleHints(ele); - if (updateTransitions) { this.updateTransitions(ele, diffProps, isBypass); } } // for eles - }; -var styfn$6 = {}; // gets what an em size corresponds to in pixels relative to a dom element +var styfn$6 = {}; +// gets what an em size corresponds to in pixels relative to a dom element styfn$6.getEmSizeInPixels = function () { var px = this.containerCss('font-size'); - if (px != null) { return parseFloat(px); } else { return 1; // for headless } -}; // gets css property from the core container - +}; +// gets css property from the core container styfn$6.containerCss = function (propName) { var cy = this._private.cy; var domElement = cy.container(); - - if (window$1 && domElement && window$1.getComputedStyle) { - return window$1.getComputedStyle(domElement).getPropertyValue(propName); + var containerWindow = cy.window(); + if (containerWindow && domElement && containerWindow.getComputedStyle) { + return containerWindow.getComputedStyle(domElement).getPropertyValue(propName); } }; -var styfn$5 = {}; // gets the rendered style for an element +var styfn$5 = {}; +// gets the rendered style for an element styfn$5.getRenderedStyle = function (ele, prop) { if (prop) { return this.getStylePropertyValue(ele, prop, true); } else { return this.getRawStyle(ele, true); } -}; // gets the raw style for an element - +}; +// gets the raw style for an element styfn$5.getRawStyle = function (ele, isRenderedVal) { var self = this; ele = ele[0]; // insure it's an element if (ele) { var rstyle = {}; - for (var i = 0; i < self.properties.length; i++) { var prop = self.properties[i]; var val = self.getStylePropertyValue(ele, prop.name, isRenderedVal); - if (val != null) { rstyle[prop.name] = val; rstyle[dash2camel(prop.name)] = val; } } - return rstyle; } }; - styfn$5.getIndexedStyle = function (ele, property, subproperty, index) { var pstyle = ele.pstyle(property)[subproperty][index]; return pstyle != null ? pstyle : ele.cy().style().getDefaultProperty(property)[subproperty][0]; }; - styfn$5.getStylePropertyValue = function (ele, propName, isRenderedVal) { var self = this; ele = ele[0]; // insure it's an element if (ele) { var prop = self.properties[propName]; - if (prop.alias) { prop = prop.pointsTo; } - var type = prop.type; var styleProp = ele.pstyle(prop.name); - if (styleProp) { var value = styleProp.value, - units = styleProp.units, - strValue = styleProp.strValue; - + units = styleProp.units, + strValue = styleProp.strValue; if (isRenderedVal && type.number && value != null && number$1(value)) { var zoom = ele.cy().zoom(); - var getRenderedValue = function getRenderedValue(val) { return val * zoom; }; - var getValueStringWithUnits = function getValueStringWithUnits(val, units) { return getRenderedValue(val) + units; }; - var isArrayValue = array(value); var haveUnits = isArrayValue ? units.every(function (u) { return u != null; }) : units != null; - if (haveUnits) { if (isArrayValue) { return value.map(function (v, i) { @@ -36542,19 +35198,15 @@ styfn$5.getStylePropertyValue = function (ele, propName, isRenderedVal) { return strValue; } } - return null; } }; - styfn$5.getAnimationStartStyle = function (ele, aniProps) { var rstyle = {}; - for (var i = 0; i < aniProps.length; i++) { var aniProp = aniProps[i]; var name = aniProp.name; var styleProp = ele.pstyle(name); - if (styleProp !== undefined) { // then make a prop of it if (plainObject(styleProp)) { @@ -36563,48 +35215,38 @@ styfn$5.getAnimationStartStyle = function (ele, aniProps) { styleProp = this.parse(name, styleProp); } } - if (styleProp) { rstyle[name] = styleProp; } } - return rstyle; }; - styfn$5.getPropsList = function (propsObj) { var self = this; var rstyle = []; var style = propsObj; var props = self.properties; - if (style) { var names = Object.keys(style); - for (var i = 0; i < names.length; i++) { var name = names[i]; var val = style[name]; var prop = props[name] || props[camel2dash(name)]; var styleProp = this.parse(prop.name, val); - if (styleProp) { rstyle.push(styleProp); } } } - return rstyle; }; - styfn$5.getNonDefaultPropertiesHash = function (ele, propNames, seed) { var hash = seed.slice(); var name, val, strVal, chVal; var i, j; - for (i = 0; i < propNames.length; i++) { name = propNames[i]; val = ele.pstyle(name, false); - if (val == null) { continue; } else if (val.pfValue != null) { @@ -36612,7 +35254,6 @@ styfn$5.getNonDefaultPropertiesHash = function (ele, propNames, seed) { hash[1] = hashIntAlt(chVal, hash[1]); } else { strVal = val.strValue; - for (j = 0; j < strVal.length; j++) { chVal = strVal.charCodeAt(j); hash[0] = hashInt(chVal, hash[0]); @@ -36620,17 +35261,13 @@ styfn$5.getNonDefaultPropertiesHash = function (ele, propNames, seed) { } } } - return hash; }; - styfn$5.getPropertiesHash = styfn$5.getNonDefaultPropertiesHash; var styfn$4 = {}; - styfn$4.appendFromJson = function (json) { var style = this; - for (var i = 0; i < json.length; i++) { var context = json[i]; var selector = context.selector; @@ -36646,52 +35283,47 @@ styfn$4.appendFromJson = function (json) { } return style; -}; // accessible cy.style() function - +}; +// accessible cy.style() function styfn$4.fromJson = function (json) { var style = this; style.resetToDefault(); style.appendFromJson(json); return style; -}; // get json from cy.style() api - +}; +// get json from cy.style() api styfn$4.json = function () { var json = []; - for (var i = this.defaultLength; i < this.length; i++) { var cxt = this[i]; var selector = cxt.selector; var props = cxt.properties; var css = {}; - for (var j = 0; j < props.length; j++) { var prop = props[j]; css[prop.name] = prop.strValue; } - json.push({ selector: !selector ? 'core' : selector.toString(), style: css }); } - return json; }; var styfn$3 = {}; - styfn$3.appendFromString = function (string) { var self = this; var style = this; var remaining = '' + string; var selAndBlockStr; var blockRem; - var propAndValStr; // remove comments from the style string + var propAndValStr; + // remove comments from the style string remaining = remaining.replace(/[/][*](\s|.)+?[*][/]/g, ''); - function removeSelAndBlockFromRemaining() { // remove the parsed selector and block from the remaining text to parse if (remaining.length > selAndBlockStr.length) { @@ -36700,7 +35332,6 @@ styfn$3.appendFromString = function (string) { remaining = ''; } } - function removePropAndValFromRem() { // remove the parsed property and value from the remaining block text to parse if (blockRem.length > propAndValStr.length) { @@ -36709,104 +35340,87 @@ styfn$3.appendFromString = function (string) { blockRem = ''; } } - for (;;) { var nothingLeftToParse = remaining.match(/^\s*$/); - if (nothingLeftToParse) { break; } - var selAndBlock = remaining.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/); - if (!selAndBlock) { warn('Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: ' + remaining); break; } + selAndBlockStr = selAndBlock[0]; - selAndBlockStr = selAndBlock[0]; // parse the selector - + // parse the selector var selectorStr = selAndBlock[1]; - if (selectorStr !== 'core') { var selector = new Selector(selectorStr); - if (selector.invalid) { - warn('Skipping parsing of block: Invalid selector found in string stylesheet: ' + selectorStr); // skip this selector and block + warn('Skipping parsing of block: Invalid selector found in string stylesheet: ' + selectorStr); + // skip this selector and block removeSelAndBlockFromRemaining(); continue; } - } // parse the block of properties and values - + } + // parse the block of properties and values var blockStr = selAndBlock[2]; var invalidBlock = false; blockRem = blockStr; var props = []; - for (;;) { var _nothingLeftToParse = blockRem.match(/^\s*$/); - if (_nothingLeftToParse) { break; } - var propAndVal = blockRem.match(/^\s*(.+?)\s*:\s*(.+?)(?:\s*;|\s*$)/); - if (!propAndVal) { warn('Skipping parsing of block: Invalid formatting of style property and value definitions found in:' + blockStr); invalidBlock = true; break; } - propAndValStr = propAndVal[0]; var propStr = propAndVal[1]; var valStr = propAndVal[2]; var prop = self.properties[propStr]; - if (!prop) { - warn('Skipping property: Invalid property name in: ' + propAndValStr); // skip this property in the block + warn('Skipping property: Invalid property name in: ' + propAndValStr); + // skip this property in the block removePropAndValFromRem(); continue; } - var parsedProp = style.parse(propStr, valStr); - if (!parsedProp) { - warn('Skipping property: Invalid property definition in: ' + propAndValStr); // skip this property in the block + warn('Skipping property: Invalid property definition in: ' + propAndValStr); + // skip this property in the block removePropAndValFromRem(); continue; } - props.push({ name: propStr, val: valStr }); removePropAndValFromRem(); } - if (invalidBlock) { removeSelAndBlockFromRemaining(); break; - } // put the parsed block in the style - + } + // put the parsed block in the style style.selector(selectorStr); - for (var i = 0; i < props.length; i++) { var _prop = props[i]; style.css(_prop.name, _prop.val); } - removeSelAndBlockFromRemaining(); } - return style; }; - styfn$3.fromString = function (string) { var style = this; style.resetToDefault(); @@ -36815,25 +35429,22 @@ styfn$3.fromString = function (string) { }; var styfn$2 = {}; - (function () { var number$1 = number; var rgba = rgbaNoBackRefs; var hsla = hslaNoBackRefs; var hex3$1 = hex3; var hex6$1 = hex6; - var data = function data(prefix) { return '^' + prefix + '\\s*\\(\\s*([\\w\\.]+)\\s*\\)$'; }; - var mapData = function mapData(prefix) { var mapArg = number$1 + '|\\w+|' + rgba + '|' + hsla + '|' + hex3$1 + '|' + hex6$1; return '^' + prefix + '\\s*\\(([\\w\\.]+)\\s*\\,\\s*(' + number$1 + ')\\s*\\,\\s*(' + number$1 + ')\\s*,\\s*(' + mapArg + ')\\s*\\,\\s*(' + mapArg + ')\\)$'; }; + var urlRegexes = ['^url\\s*\\(\\s*[\'"]?(.+?)[\'"]?\\s*\\)$', '^(none)$', '^(.+)$']; - var urlRegexes = ['^url\\s*\\(\\s*[\'"]?(.+?)[\'"]?\\s*\\)$', '^(none)$', '^(.+)$']; // each visual style property has a type and needs to be validated according to it - + // each visual style property has a type and needs to be validated according to it styfn$2.types = { time: { number: true, @@ -36881,6 +35492,11 @@ var styfn$2 = {}; integer: true, unitless: true }, + nonNegativeNumber: { + number: true, + min: 0, + unitless: true + }, position: { enums: ['parent', 'origin'] }, @@ -37121,7 +35737,7 @@ var styfn$2 = {}; unitless: true }, edgeDistances: { - enums: ['intersection', 'node-position'] + enums: ['intersection', 'node-position', 'endpoints'] }, edgeEndpoint: { number: true, @@ -37135,11 +35751,9 @@ var styfn$2 = {}; case 2: // can be % or px only return unitsArr[0] !== 'deg' && unitsArr[0] !== 'rad' && unitsArr[1] !== 'deg' && unitsArr[1] !== 'rad'; - case 1: // can be enum, deg, or rad only return string(valArr[0]) || unitsArr[0] === 'deg' || unitsArr[0] === 'rad'; - default: return false; } @@ -37153,6 +35767,7 @@ var styfn$2 = {}; enums: ['to-bottom', 'to-top', 'to-left', 'to-right', 'to-bottom-right', 'to-bottom-left', 'to-top-right', 'to-top-left', 'to-right-bottom', 'to-left-bottom', 'to-right-top', 'to-left-top' // different order ] }, + boundsExpansion: { number: true, multiple: true, @@ -37168,7 +35783,6 @@ var styfn$2 = {}; if ((val1 == null || val2 == null) && val1 !== val2) { return true; // null cases could represent any value } - if (val1 == 0 && val2 != 0) { return true; } else if (val1 != 0 && val2 == 0) { @@ -37185,7 +35799,9 @@ var styfn$2 = {}; var empty2 = emptyString(str2); return empty1 && !empty2 || !empty1 && empty2; } - }; // define visual style properties + }; + + // define visual style properties // // - n.b. adding a new group of props may require updates to updateStyleHints() // - adding new props to an existing group gets handled automatically @@ -37343,10 +35959,12 @@ var styfn$2 = {}; }]; var behavior = [{ name: 'events', - type: t.bool + type: t.bool, + triggersZOrder: diff.any }, { name: 'text-events', - type: t.bool + type: t.bool, + triggersZOrder: diff.any }]; var visibility = [{ name: 'display', @@ -37378,7 +35996,7 @@ var styfn$2 = {}; triggersZOrder: diff.any }, { name: 'z-index', - type: t.nonNegativeInt, + type: t.number, triggersZOrder: diff.any }]; var overlay = [{ @@ -37426,7 +36044,6 @@ var styfn$2 = {}; name: 'transition-timing-function', type: t.easing }]; - var nodeSizeHashOverride = function nodeSizeHashOverride(ele, parsedProp) { if (parsedProp.value === 'label') { return -ele.poolIndex(); // no hash key hits is using label size (hitrate for perf probably low anyway) @@ -37434,7 +36051,6 @@ var styfn$2 = {}; return parsedProp.pfValue; } }; - var nodeBody = [{ name: 'height', type: t.nodeSize, @@ -37727,16 +36343,15 @@ var styfn$2 = {}; }, { name: 'outside-texture-bg-opacity', type: t.zeroOneNumber - }]; // pie backgrounds for nodes + }]; + // pie backgrounds for nodes var pie = []; styfn$2.pieBackgroundN = 16; // because the pie properties are numbered, give access to a constant N (for renderer use) - pie.push({ name: 'pie-size', type: t.sizeMaybePercent }); - for (var i = 1; i <= styfn$2.pieBackgroundN; i++) { pie.push({ name: 'pie-' + i + '-background-color', @@ -37750,9 +36365,9 @@ var styfn$2 = {}; name: 'pie-' + i + '-background-opacity', type: t.zeroOneNumber }); - } // edge arrows - + } + // edge arrows var edgeArrow = []; var arrowPrefixes = styfn$2.arrowPrefixes = ['source', 'mid-source', 'target', 'mid-target']; [{ @@ -37769,34877 +36384,25428 @@ var styfn$2 = {}; arrowPrefixes.forEach(function (prefix) { var name = prefix + '-' + prop.name; var type = prop.type, - triggersBounds = prop.triggersBounds; - edgeArrow.push({ - name: name, - type: type, - triggersBounds: triggersBounds - }); - }); - }, {}); - var props = styfn$2.properties = [].concat(behavior, transition, visibility, overlay, underlay, ghost, commonLabel, labelDimensions, mainLabel, sourceLabel, targetLabel, nodeBody, nodeBorder, backgroundImage, pie, compound, edgeLine, edgeArrow, core); - var propGroups = styfn$2.propertyGroups = { - // common to all eles - behavior: behavior, - transition: transition, - visibility: visibility, - overlay: overlay, - underlay: underlay, - ghost: ghost, - // labels - commonLabel: commonLabel, - labelDimensions: labelDimensions, - mainLabel: mainLabel, - sourceLabel: sourceLabel, - targetLabel: targetLabel, - // node props - nodeBody: nodeBody, - nodeBorder: nodeBorder, - backgroundImage: backgroundImage, - pie: pie, - compound: compound, - // edge props - edgeLine: edgeLine, - edgeArrow: edgeArrow, - core: core - }; - var propGroupNames = styfn$2.propertyGroupNames = {}; - var propGroupKeys = styfn$2.propertyGroupKeys = Object.keys(propGroups); - propGroupKeys.forEach(function (key) { - propGroupNames[key] = propGroups[key].map(function (prop) { - return prop.name; - }); - propGroups[key].forEach(function (prop) { - return prop.groupKey = key; - }); - }); // define aliases - - var aliases = styfn$2.aliases = [{ - name: 'content', - pointsTo: 'label' - }, { - name: 'control-point-distance', - pointsTo: 'control-point-distances' - }, { - name: 'control-point-weight', - pointsTo: 'control-point-weights' - }, { - name: 'edge-text-rotation', - pointsTo: 'text-rotation' - }, { - name: 'padding-left', - pointsTo: 'padding' - }, { - name: 'padding-right', - pointsTo: 'padding' - }, { - name: 'padding-top', - pointsTo: 'padding' - }, { - name: 'padding-bottom', - pointsTo: 'padding' - }]; // list of property names - - styfn$2.propertyNames = props.map(function (p) { - return p.name; - }); // allow access of properties by name ( e.g. style.properties.height ) - - for (var _i = 0; _i < props.length; _i++) { - var prop = props[_i]; - props[prop.name] = prop; // allow lookup by name - } // map aliases - - - for (var _i2 = 0; _i2 < aliases.length; _i2++) { - var alias = aliases[_i2]; - var pointsToProp = props[alias.pointsTo]; - var aliasProp = { - name: alias.name, - alias: true, - pointsTo: pointsToProp - }; // add alias prop for parsing - - props.push(aliasProp); - props[alias.name] = aliasProp; // allow lookup by name - } -})(); - -styfn$2.getDefaultProperty = function (name) { - return this.getDefaultProperties()[name]; -}; - -styfn$2.getDefaultProperties = function () { - var _p = this._private; - - if (_p.defaultProperties != null) { - return _p.defaultProperties; - } - - var rawProps = extend({ - // core props - 'selection-box-color': '#ddd', - 'selection-box-opacity': 0.65, - 'selection-box-border-color': '#aaa', - 'selection-box-border-width': 1, - 'active-bg-color': 'black', - 'active-bg-opacity': 0.15, - 'active-bg-size': 30, - 'outside-texture-bg-color': '#000', - 'outside-texture-bg-opacity': 0.125, - // common node/edge props - 'events': 'yes', - 'text-events': 'no', - 'text-valign': 'top', - 'text-halign': 'center', - 'text-justification': 'auto', - 'line-height': 1, - 'color': '#000', - 'text-outline-color': '#000', - 'text-outline-width': 0, - 'text-outline-opacity': 1, - 'text-opacity': 1, - 'text-decoration': 'none', - 'text-transform': 'none', - 'text-wrap': 'none', - 'text-overflow-wrap': 'whitespace', - 'text-max-width': 9999, - 'text-background-color': '#000', - 'text-background-opacity': 0, - 'text-background-shape': 'rectangle', - 'text-background-padding': 0, - 'text-border-opacity': 0, - 'text-border-width': 0, - 'text-border-style': 'solid', - 'text-border-color': '#000', - 'font-family': 'Helvetica Neue, Helvetica, sans-serif', - 'font-style': 'normal', - 'font-weight': 'normal', - 'font-size': 16, - 'min-zoomed-font-size': 0, - 'text-rotation': 'none', - 'source-text-rotation': 'none', - 'target-text-rotation': 'none', - 'visibility': 'visible', - 'display': 'element', - 'opacity': 1, - 'z-compound-depth': 'auto', - 'z-index-compare': 'auto', - 'z-index': 0, - 'label': '', - 'text-margin-x': 0, - 'text-margin-y': 0, - 'source-label': '', - 'source-text-offset': 0, - 'source-text-margin-x': 0, - 'source-text-margin-y': 0, - 'target-label': '', - 'target-text-offset': 0, - 'target-text-margin-x': 0, - 'target-text-margin-y': 0, - 'overlay-opacity': 0, - 'overlay-color': '#000', - 'overlay-padding': 10, - 'overlay-shape': 'round-rectangle', - 'underlay-opacity': 0, - 'underlay-color': '#000', - 'underlay-padding': 10, - 'underlay-shape': 'round-rectangle', - 'transition-property': 'none', - 'transition-duration': 0, - 'transition-delay': 0, - 'transition-timing-function': 'linear', - // node props - 'background-blacken': 0, - 'background-color': '#999', - 'background-fill': 'solid', - 'background-opacity': 1, - 'background-image': 'none', - 'background-image-crossorigin': 'anonymous', - 'background-image-opacity': 1, - 'background-image-containment': 'inside', - 'background-image-smoothing': 'yes', - 'background-position-x': '50%', - 'background-position-y': '50%', - 'background-offset-x': 0, - 'background-offset-y': 0, - 'background-width-relative-to': 'include-padding', - 'background-height-relative-to': 'include-padding', - 'background-repeat': 'no-repeat', - 'background-fit': 'none', - 'background-clip': 'node', - 'background-width': 'auto', - 'background-height': 'auto', - 'border-color': '#000', - 'border-opacity': 1, - 'border-width': 0, - 'border-style': 'solid', - 'height': 30, - 'width': 30, - 'shape': 'ellipse', - 'shape-polygon-points': '-1, -1, 1, -1, 1, 1, -1, 1', - 'bounds-expansion': 0, - // node gradient - 'background-gradient-direction': 'to-bottom', - 'background-gradient-stop-colors': '#999', - 'background-gradient-stop-positions': '0%', - // ghost props - 'ghost': 'no', - 'ghost-offset-y': 0, - 'ghost-offset-x': 0, - 'ghost-opacity': 0, - // compound props - 'padding': 0, - 'padding-relative-to': 'width', - 'position': 'origin', - 'compound-sizing-wrt-labels': 'include', - 'min-width': 0, - 'min-width-bias-left': 0, - 'min-width-bias-right': 0, - 'min-height': 0, - 'min-height-bias-top': 0, - 'min-height-bias-bottom': 0 - }, { - // node pie bg - 'pie-size': '100%' - }, [{ - name: 'pie-{{i}}-background-color', - value: 'black' - }, { - name: 'pie-{{i}}-background-size', - value: '0%' - }, { - name: 'pie-{{i}}-background-opacity', - value: 1 - }].reduce(function (css, prop) { - for (var i = 1; i <= styfn$2.pieBackgroundN; i++) { - var name = prop.name.replace('{{i}}', i); - var val = prop.value; - css[name] = val; - } - - return css; - }, {}), { - // edge props - 'line-style': 'solid', - 'line-color': '#999', - 'line-fill': 'solid', - 'line-cap': 'butt', - 'line-opacity': 1, - 'line-gradient-stop-colors': '#999', - 'line-gradient-stop-positions': '0%', - 'control-point-step-size': 40, - 'control-point-weights': 0.5, - 'segment-weights': 0.5, - 'segment-distances': 20, - 'taxi-turn': '50%', - 'taxi-turn-min-distance': 10, - 'taxi-direction': 'auto', - 'edge-distances': 'intersection', - 'curve-style': 'haystack', - 'haystack-radius': 0, - 'arrow-scale': 1, - 'loop-direction': '-45deg', - 'loop-sweep': '-90deg', - 'source-distance-from-node': 0, - 'target-distance-from-node': 0, - 'source-endpoint': 'outside-to-node', - 'target-endpoint': 'outside-to-node', - 'line-dash-pattern': [6, 3], - 'line-dash-offset': 0 - }, [{ - name: 'arrow-shape', - value: 'none' - }, { - name: 'arrow-color', - value: '#999' - }, { - name: 'arrow-fill', - value: 'filled' - }].reduce(function (css, prop) { - styfn$2.arrowPrefixes.forEach(function (prefix) { - var name = prefix + '-' + prop.name; - var val = prop.value; - css[name] = val; - }); - return css; - }, {})); - var parsedProps = {}; - - for (var i = 0; i < this.properties.length; i++) { - var prop = this.properties[i]; - - if (prop.pointsTo) { - continue; - } - - var name = prop.name; - var val = rawProps[name]; - var parsedProp = this.parse(name, val); - parsedProps[name] = parsedProp; - } - - _p.defaultProperties = parsedProps; - return _p.defaultProperties; -}; - -styfn$2.addDefaultStylesheet = function () { - this.selector(':parent').css({ - 'shape': 'rectangle', - 'padding': 10, - 'background-color': '#eee', - 'border-color': '#ccc', - 'border-width': 1 - }).selector('edge').css({ - 'width': 3 - }).selector(':loop').css({ - 'curve-style': 'bezier' - }).selector('edge:compound').css({ - 'curve-style': 'bezier', - 'source-endpoint': 'outside-to-line', - 'target-endpoint': 'outside-to-line' - }).selector(':selected').css({ - 'background-color': '#0169D9', - 'line-color': '#0169D9', - 'source-arrow-color': '#0169D9', - 'target-arrow-color': '#0169D9', - 'mid-source-arrow-color': '#0169D9', - 'mid-target-arrow-color': '#0169D9' - }).selector(':parent:selected').css({ - 'background-color': '#CCE1F9', - 'border-color': '#aec8e5' - }).selector(':active').css({ - 'overlay-color': 'black', - 'overlay-padding': 10, - 'overlay-opacity': 0.25 - }); - this.defaultLength = this.length; -}; - -var styfn$1 = {}; // a caching layer for property parsing - -styfn$1.parse = function (name, value, propIsBypass, propIsFlat) { - var self = this; // function values can't be cached in all cases, and there isn't much benefit of caching them anyway - - if (fn$6(value)) { - return self.parseImplWarn(name, value, propIsBypass, propIsFlat); - } - - var flatKey = propIsFlat === 'mapping' || propIsFlat === true || propIsFlat === false || propIsFlat == null ? 'dontcare' : propIsFlat; - var bypassKey = propIsBypass ? 't' : 'f'; - var valueKey = '' + value; - var argHash = hashStrings(name, valueKey, bypassKey, flatKey); - var propCache = self.propCache = self.propCache || []; - var ret; - - if (!(ret = propCache[argHash])) { - ret = propCache[argHash] = self.parseImplWarn(name, value, propIsBypass, propIsFlat); - } // - bypasses can't be shared b/c the value can be changed by animations or otherwise overridden - // - mappings can't be shared b/c mappings are per-element - - - if (propIsBypass || propIsFlat === 'mapping') { - // need a copy since props are mutated later in their lifecycles - ret = copy(ret); - - if (ret) { - ret.value = copy(ret.value); // because it could be an array, e.g. colour - } - } - - return ret; -}; - -styfn$1.parseImplWarn = function (name, value, propIsBypass, propIsFlat) { - var prop = this.parseImpl(name, value, propIsBypass, propIsFlat); - - if (!prop && value != null) { - warn("The style property `".concat(name, ": ").concat(value, "` is invalid")); - } - - if (prop && (prop.name === 'width' || prop.name === 'height') && value === 'label') { - warn('The style value of `label` is deprecated for `' + prop.name + '`'); - } - - return prop; -}; // parse a property; return null on invalid; return parsed property otherwise -// fields : -// - name : the name of the property -// - value : the parsed, native-typed value of the property -// - strValue : a string value that represents the property value in valid css -// - bypass : true iff the property is a bypass property - - -styfn$1.parseImpl = function (name, value, propIsBypass, propIsFlat) { - var self = this; - name = camel2dash(name); // make sure the property name is in dash form (e.g. 'property-name' not 'propertyName') - - var property = self.properties[name]; - var passedValue = value; - var types = self.types; - - if (!property) { - return null; - } // return null on property of unknown name - - - if (value === undefined) { - return null; - } // can't assign undefined - // the property may be an alias - - - if (property.alias) { - property = property.pointsTo; - name = property.name; - } - - var valueIsString = string(value); - - if (valueIsString) { - // trim the value to make parsing easier - value = value.trim(); - } - - var type = property.type; - - if (!type) { - return null; - } // no type, no luck - // check if bypass is null or empty string (i.e. indication to delete bypass property) - - - if (propIsBypass && (value === '' || value === null)) { - return { - name: name, - value: value, - bypass: true, - deleteBypass: true - }; - } // check if value is a function used as a mapper - - - if (fn$6(value)) { - return { - name: name, - value: value, - strValue: 'fn', - mapped: types.fn, - bypass: propIsBypass - }; - } // check if value is mapped - - - var data, mapData; - - if (!valueIsString || propIsFlat || value.length < 7 || value[1] !== 'a') ; else if (value.length >= 7 && value[0] === 'd' && (data = new RegExp(types.data.regex).exec(value))) { - if (propIsBypass) { - return false; - } // mappers not allowed in bypass - - - var mapped = types.data; - return { - name: name, - value: data, - strValue: '' + value, - mapped: mapped, - field: data[1], - bypass: propIsBypass - }; - } else if (value.length >= 10 && value[0] === 'm' && (mapData = new RegExp(types.mapData.regex).exec(value))) { - if (propIsBypass) { - return false; - } // mappers not allowed in bypass - - - if (type.multiple) { - return false; - } // impossible to map to num - - - var _mapped = types.mapData; // we can map only if the type is a colour or a number - - if (!(type.color || type.number)) { - return false; - } - - var valueMin = this.parse(name, mapData[4]); // parse to validate - - if (!valueMin || valueMin.mapped) { - return false; - } // can't be invalid or mapped - - - var valueMax = this.parse(name, mapData[5]); // parse to validate - - if (!valueMax || valueMax.mapped) { - return false; - } // can't be invalid or mapped - // check if valueMin and valueMax are the same - - - if (valueMin.pfValue === valueMax.pfValue || valueMin.strValue === valueMax.strValue) { - warn('`' + name + ': ' + value + '` is not a valid mapper because the output range is zero; converting to `' + name + ': ' + valueMin.strValue + '`'); - return this.parse(name, valueMin.strValue); // can't make much of a mapper without a range - } else if (type.color) { - var c1 = valueMin.value; - var c2 = valueMax.value; - var same = c1[0] === c2[0] // red - && c1[1] === c2[1] // green - && c1[2] === c2[2] // blue - && ( // optional alpha - c1[3] === c2[3] // same alpha outright - || (c1[3] == null || c1[3] === 1 // full opacity for colour 1? - ) && (c2[3] == null || c2[3] === 1) // full opacity for colour 2? - ); - - if (same) { - return false; - } // can't make a mapper without a range - - } - - return { - name: name, - value: mapData, - strValue: '' + value, - mapped: _mapped, - field: mapData[1], - fieldMin: parseFloat(mapData[2]), - // min & max are numeric - fieldMax: parseFloat(mapData[3]), - valueMin: valueMin.value, - valueMax: valueMax.value, - bypass: propIsBypass - }; - } - - if (type.multiple && propIsFlat !== 'multiple') { - var vals; - - if (valueIsString) { - vals = value.split(/\s+/); - } else if (array(value)) { - vals = value; - } else { - vals = [value]; - } - - if (type.evenMultiple && vals.length % 2 !== 0) { - return null; - } - - var valArr = []; - var unitsArr = []; - var pfValArr = []; - var strVal = ''; - var hasEnum = false; - - for (var i = 0; i < vals.length; i++) { - var p = self.parse(name, vals[i], propIsBypass, 'multiple'); - hasEnum = hasEnum || string(p.value); - valArr.push(p.value); - pfValArr.push(p.pfValue != null ? p.pfValue : p.value); - unitsArr.push(p.units); - strVal += (i > 0 ? ' ' : '') + p.strValue; - } - - if (type.validate && !type.validate(valArr, unitsArr)) { - return null; - } - - if (type.singleEnum && hasEnum) { - if (valArr.length === 1 && string(valArr[0])) { - return { - name: name, - value: valArr[0], - strValue: valArr[0], - bypass: propIsBypass - }; - } else { - return null; - } - } - - return { - name: name, - value: valArr, - pfValue: pfValArr, - strValue: strVal, - bypass: propIsBypass, - units: unitsArr - }; - } // several types also allow enums - - - var checkEnums = function checkEnums() { - for (var _i = 0; _i < type.enums.length; _i++) { - var en = type.enums[_i]; - - if (en === value) { - return { - name: name, - value: value, - strValue: '' + value, - bypass: propIsBypass - }; - } - } - - return null; - }; // check the type and return the appropriate object - - - if (type.number) { - var units; - var implicitUnits = 'px'; // not set => px - - if (type.units) { - // use specified units if set - units = type.units; - } - - if (type.implicitUnits) { - implicitUnits = type.implicitUnits; - } - - if (!type.unitless) { - if (valueIsString) { - var unitsRegex = 'px|em' + (type.allowPercent ? '|\\%' : ''); - - if (units) { - unitsRegex = units; - } // only allow explicit units if so set - - - var match = value.match('^(' + number + ')(' + unitsRegex + ')?' + '$'); - - if (match) { - value = match[1]; - units = match[2] || implicitUnits; - } - } else if (!units || type.implicitUnits) { - units = implicitUnits; // implicitly px if unspecified - } - } - - value = parseFloat(value); // if not a number and enums not allowed, then the value is invalid - - if (isNaN(value) && type.enums === undefined) { - return null; - } // check if this number type also accepts special keywords in place of numbers - // (i.e. `left`, `auto`, etc) - - - if (isNaN(value) && type.enums !== undefined) { - value = passedValue; - return checkEnums(); - } // check if value must be an integer - - - if (type.integer && !integer(value)) { - return null; - } // check value is within range - - - if (type.min !== undefined && (value < type.min || type.strictMin && value === type.min) || type.max !== undefined && (value > type.max || type.strictMax && value === type.max)) { - return null; - } - - var ret = { - name: name, - value: value, - strValue: '' + value + (units ? units : ''), - units: units, - bypass: propIsBypass - }; // normalise value in pixels - - if (type.unitless || units !== 'px' && units !== 'em') { - ret.pfValue = value; - } else { - ret.pfValue = units === 'px' || !units ? value : this.getEmSizeInPixels() * value; - } // normalise value in ms - - - if (units === 'ms' || units === 's') { - ret.pfValue = units === 'ms' ? value : 1000 * value; - } // normalise value in rad - - - if (units === 'deg' || units === 'rad') { - ret.pfValue = units === 'rad' ? value : deg2rad(value); - } // normalize value in % - - - if (units === '%') { - ret.pfValue = value / 100; - } - - return ret; - } else if (type.propList) { - var props = []; - var propsStr = '' + value; - - if (propsStr === 'none') ; else { - // go over each prop - var propsSplit = propsStr.split(/\s*,\s*|\s+/); - - for (var _i2 = 0; _i2 < propsSplit.length; _i2++) { - var propName = propsSplit[_i2].trim(); - - if (self.properties[propName]) { - props.push(propName); - } else { - warn('`' + propName + '` is not a valid property name'); - } - } - - if (props.length === 0) { - return null; - } - } - - return { - name: name, - value: props, - strValue: props.length === 0 ? 'none' : props.join(' '), - bypass: propIsBypass - }; - } else if (type.color) { - var tuple = color2tuple(value); - - if (!tuple) { - return null; - } - - return { - name: name, - value: tuple, - pfValue: tuple, - strValue: 'rgb(' + tuple[0] + ',' + tuple[1] + ',' + tuple[2] + ')', - // n.b. no spaces b/c of multiple support - bypass: propIsBypass - }; - } else if (type.regex || type.regexes) { - // first check enums - if (type.enums) { - var enumProp = checkEnums(); - - if (enumProp) { - return enumProp; - } - } - - var regexes = type.regexes ? type.regexes : [type.regex]; - - for (var _i3 = 0; _i3 < regexes.length; _i3++) { - var regex = new RegExp(regexes[_i3]); // make a regex from the type string - - var m = regex.exec(value); - - if (m) { - // regex matches - return { - name: name, - value: type.singleRegexMatchValue ? m[1] : m, - strValue: '' + value, - bypass: propIsBypass - }; - } - } - - return null; // didn't match any - } else if (type.string) { - // just return - return { - name: name, - value: '' + value, - strValue: '' + value, - bypass: propIsBypass - }; - } else if (type.enums) { - // check enums last because it's a combo type in others - return checkEnums(); - } else { - return null; // not a type we can handle - } -}; - -var Style = function Style(cy) { - if (!(this instanceof Style)) { - return new Style(cy); - } - - if (!core(cy)) { - error('A style must have a core reference'); - return; - } - - this._private = { - cy: cy, - coreStyle: {} - }; - this.length = 0; - this.resetToDefault(); -}; - -var styfn = Style.prototype; - -styfn.instanceString = function () { - return 'style'; -}; // remove all contexts - - -styfn.clear = function () { - var _p = this._private; - var cy = _p.cy; - var eles = cy.elements(); - - for (var i = 0; i < this.length; i++) { - this[i] = undefined; - } - - this.length = 0; - _p.contextStyles = {}; - _p.propDiffs = {}; - this.cleanElements(eles, true); - eles.forEach(function (ele) { - var ele_p = ele[0]._private; - ele_p.styleDirty = true; - ele_p.appliedInitStyle = false; - }); - return this; // chaining -}; - -styfn.resetToDefault = function () { - this.clear(); - this.addDefaultStylesheet(); - return this; -}; // builds a style object for the 'core' selector - - -styfn.core = function (propName) { - return this._private.coreStyle[propName] || this.getDefaultProperty(propName); -}; // create a new context from the specified selector string and switch to that context - - -styfn.selector = function (selectorStr) { - // 'core' is a special case and does not need a selector - var selector = selectorStr === 'core' ? null : new Selector(selectorStr); - var i = this.length++; // new context means new index - - this[i] = { - selector: selector, - properties: [], - mappedProperties: [], - index: i - }; - return this; // chaining -}; // add one or many css rules to the current context - - -styfn.css = function () { - var self = this; - var args = arguments; - - if (args.length === 1) { - var map = args[0]; - - for (var i = 0; i < self.properties.length; i++) { - var prop = self.properties[i]; - var mapVal = map[prop.name]; - - if (mapVal === undefined) { - mapVal = map[dash2camel(prop.name)]; - } - - if (mapVal !== undefined) { - this.cssRule(prop.name, mapVal); - } - } - } else if (args.length === 2) { - this.cssRule(args[0], args[1]); - } // do nothing if args are invalid - - - return this; // chaining -}; - -styfn.style = styfn.css; // add a single css rule to the current context - -styfn.cssRule = function (name, value) { - // name-value pair - var property = this.parse(name, value); // add property to current context if valid - - if (property) { - var i = this.length - 1; - this[i].properties.push(property); - this[i].properties[property.name] = property; // allow access by name as well - - if (property.name.match(/pie-(\d+)-background-size/) && property.value) { - this._private.hasPie = true; - } - - if (property.mapped) { - this[i].mappedProperties.push(property); - } // add to core style if necessary - - - var currentSelectorIsCore = !this[i].selector; - - if (currentSelectorIsCore) { - this._private.coreStyle[property.name] = property; - } - } - - return this; // chaining -}; - -styfn.append = function (style) { - if (stylesheet(style)) { - style.appendToStyle(this); - } else if (array(style)) { - this.appendFromJson(style); - } else if (string(style)) { - this.appendFromString(style); - } // you probably wouldn't want to append a Style, since you'd duplicate the default parts - - - return this; -}; // static function - - -Style.fromJson = function (cy, json) { - var style = new Style(cy); - style.fromJson(json); - return style; -}; - -Style.fromString = function (cy, string) { - return new Style(cy).fromString(string); -}; - -[styfn$8, styfn$7, styfn$6, styfn$5, styfn$4, styfn$3, styfn$2, styfn$1].forEach(function (props) { - extend(styfn, props); -}); -Style.types = styfn.types; -Style.properties = styfn.properties; -Style.propertyGroups = styfn.propertyGroups; -Style.propertyGroupNames = styfn.propertyGroupNames; -Style.propertyGroupKeys = styfn.propertyGroupKeys; - -var corefn$2 = { - style: function style(newStyle) { - if (newStyle) { - var s = this.setStyle(newStyle); - s.update(); - } - - return this._private.style; - }, - setStyle: function setStyle(style) { - var _p = this._private; - - if (stylesheet(style)) { - _p.style = style.generateStyle(this); - } else if (array(style)) { - _p.style = Style.fromJson(this, style); - } else if (string(style)) { - _p.style = Style.fromString(this, style); - } else { - _p.style = Style(this); - } - - return _p.style; - }, - // e.g. cy.data() changed => recalc ele mappers - updateStyle: function updateStyle() { - this.mutableElements().updateStyle(); // just send to all eles - } -}; - -var defaultSelectionType = 'single'; -var corefn$1 = { - autolock: function autolock(bool) { - if (bool !== undefined) { - this._private.autolock = bool ? true : false; - } else { - return this._private.autolock; - } - - return this; // chaining - }, - autoungrabify: function autoungrabify(bool) { - if (bool !== undefined) { - this._private.autoungrabify = bool ? true : false; - } else { - return this._private.autoungrabify; - } - - return this; // chaining - }, - autounselectify: function autounselectify(bool) { - if (bool !== undefined) { - this._private.autounselectify = bool ? true : false; - } else { - return this._private.autounselectify; - } - - return this; // chaining - }, - selectionType: function selectionType(selType) { - var _p = this._private; - - if (_p.selectionType == null) { - _p.selectionType = defaultSelectionType; - } - - if (selType !== undefined) { - if (selType === 'additive' || selType === 'single') { - _p.selectionType = selType; - } - } else { - return _p.selectionType; - } - - return this; - }, - panningEnabled: function panningEnabled(bool) { - if (bool !== undefined) { - this._private.panningEnabled = bool ? true : false; - } else { - return this._private.panningEnabled; - } - - return this; // chaining - }, - userPanningEnabled: function userPanningEnabled(bool) { - if (bool !== undefined) { - this._private.userPanningEnabled = bool ? true : false; - } else { - return this._private.userPanningEnabled; - } - - return this; // chaining - }, - zoomingEnabled: function zoomingEnabled(bool) { - if (bool !== undefined) { - this._private.zoomingEnabled = bool ? true : false; - } else { - return this._private.zoomingEnabled; - } - - return this; // chaining - }, - userZoomingEnabled: function userZoomingEnabled(bool) { - if (bool !== undefined) { - this._private.userZoomingEnabled = bool ? true : false; - } else { - return this._private.userZoomingEnabled; - } - - return this; // chaining - }, - boxSelectionEnabled: function boxSelectionEnabled(bool) { - if (bool !== undefined) { - this._private.boxSelectionEnabled = bool ? true : false; - } else { - return this._private.boxSelectionEnabled; - } - - return this; // chaining - }, - pan: function pan() { - var args = arguments; - var pan = this._private.pan; - var dim, val, dims, x, y; - - switch (args.length) { - case 0: - // .pan() - return pan; - - case 1: - if (string(args[0])) { - // .pan('x') - dim = args[0]; - return pan[dim]; - } else if (plainObject(args[0])) { - // .pan({ x: 0, y: 100 }) - if (!this._private.panningEnabled) { - return this; - } - - dims = args[0]; - x = dims.x; - y = dims.y; - - if (number$1(x)) { - pan.x = x; - } - - if (number$1(y)) { - pan.y = y; - } - - this.emit('pan viewport'); - } - - break; - - case 2: - // .pan('x', 100) - if (!this._private.panningEnabled) { - return this; - } - - dim = args[0]; - val = args[1]; - - if ((dim === 'x' || dim === 'y') && number$1(val)) { - pan[dim] = val; - } - - this.emit('pan viewport'); - break; - // invalid - } - - this.notify('viewport'); - return this; // chaining - }, - panBy: function panBy(arg0, arg1) { - var args = arguments; - var pan = this._private.pan; - var dim, val, dims, x, y; - - if (!this._private.panningEnabled) { - return this; - } - - switch (args.length) { - case 1: - if (plainObject(arg0)) { - // .panBy({ x: 0, y: 100 }) - dims = args[0]; - x = dims.x; - y = dims.y; - - if (number$1(x)) { - pan.x += x; - } - - if (number$1(y)) { - pan.y += y; - } - - this.emit('pan viewport'); - } - - break; - - case 2: - // .panBy('x', 100) - dim = arg0; - val = arg1; - - if ((dim === 'x' || dim === 'y') && number$1(val)) { - pan[dim] += val; - } - - this.emit('pan viewport'); - break; - // invalid - } - - this.notify('viewport'); - return this; // chaining - }, - fit: function fit(elements, padding) { - var viewportState = this.getFitViewport(elements, padding); - - if (viewportState) { - var _p = this._private; - _p.zoom = viewportState.zoom; - _p.pan = viewportState.pan; - this.emit('pan zoom viewport'); - this.notify('viewport'); - } - - return this; // chaining - }, - getFitViewport: function getFitViewport(elements, padding) { - if (number$1(elements) && padding === undefined) { - // elements is optional - padding = elements; - elements = undefined; - } - - if (!this._private.panningEnabled || !this._private.zoomingEnabled) { - return; - } - - var bb; - - if (string(elements)) { - var sel = elements; - elements = this.$(sel); - } else if (boundingBox(elements)) { - // assume bb - var bbe = elements; - bb = { - x1: bbe.x1, - y1: bbe.y1, - x2: bbe.x2, - y2: bbe.y2 - }; - bb.w = bb.x2 - bb.x1; - bb.h = bb.y2 - bb.y1; - } else if (!elementOrCollection(elements)) { - elements = this.mutableElements(); - } - - if (elementOrCollection(elements) && elements.empty()) { - return; - } // can't fit to nothing - - - bb = bb || elements.boundingBox(); - var w = this.width(); - var h = this.height(); - var zoom; - padding = number$1(padding) ? padding : 0; - - if (!isNaN(w) && !isNaN(h) && w > 0 && h > 0 && !isNaN(bb.w) && !isNaN(bb.h) && bb.w > 0 && bb.h > 0) { - zoom = Math.min((w - 2 * padding) / bb.w, (h - 2 * padding) / bb.h); // crop zoom - - zoom = zoom > this._private.maxZoom ? this._private.maxZoom : zoom; - zoom = zoom < this._private.minZoom ? this._private.minZoom : zoom; - var pan = { - // now pan to middle - x: (w - zoom * (bb.x1 + bb.x2)) / 2, - y: (h - zoom * (bb.y1 + bb.y2)) / 2 - }; - return { - zoom: zoom, - pan: pan - }; - } - - return; - }, - zoomRange: function zoomRange(min, max) { - var _p = this._private; - - if (max == null) { - var opts = min; - min = opts.min; - max = opts.max; - } - - if (number$1(min) && number$1(max) && min <= max) { - _p.minZoom = min; - _p.maxZoom = max; - } else if (number$1(min) && max === undefined && min <= _p.maxZoom) { - _p.minZoom = min; - } else if (number$1(max) && min === undefined && max >= _p.minZoom) { - _p.maxZoom = max; - } - - return this; - }, - minZoom: function minZoom(zoom) { - if (zoom === undefined) { - return this._private.minZoom; - } else { - return this.zoomRange({ - min: zoom - }); - } - }, - maxZoom: function maxZoom(zoom) { - if (zoom === undefined) { - return this._private.maxZoom; - } else { - return this.zoomRange({ - max: zoom - }); - } - }, - getZoomedViewport: function getZoomedViewport(params) { - var _p = this._private; - var currentPan = _p.pan; - var currentZoom = _p.zoom; - var pos; // in rendered px - - var zoom; - var bail = false; - - if (!_p.zoomingEnabled) { - // zooming disabled - bail = true; - } - - if (number$1(params)) { - // then set the zoom - zoom = params; - } else if (plainObject(params)) { - // then zoom about a point - zoom = params.level; - - if (params.position != null) { - pos = modelToRenderedPosition(params.position, currentZoom, currentPan); - } else if (params.renderedPosition != null) { - pos = params.renderedPosition; - } - - if (pos != null && !_p.panningEnabled) { - // panning disabled - bail = true; - } - } // crop zoom - - - zoom = zoom > _p.maxZoom ? _p.maxZoom : zoom; - zoom = zoom < _p.minZoom ? _p.minZoom : zoom; // can't zoom with invalid params - - if (bail || !number$1(zoom) || zoom === currentZoom || pos != null && (!number$1(pos.x) || !number$1(pos.y))) { - return null; - } - - if (pos != null) { - // set zoom about position - var pan1 = currentPan; - var zoom1 = currentZoom; - var zoom2 = zoom; - var pan2 = { - x: -zoom2 / zoom1 * (pos.x - pan1.x) + pos.x, - y: -zoom2 / zoom1 * (pos.y - pan1.y) + pos.y - }; - return { - zoomed: true, - panned: true, - zoom: zoom2, - pan: pan2 - }; - } else { - // just set the zoom - return { - zoomed: true, - panned: false, - zoom: zoom, - pan: currentPan - }; - } - }, - zoom: function zoom(params) { - if (params === undefined) { - // get - return this._private.zoom; - } else { - // set - var vp = this.getZoomedViewport(params); - var _p = this._private; - - if (vp == null || !vp.zoomed) { - return this; - } - - _p.zoom = vp.zoom; - - if (vp.panned) { - _p.pan.x = vp.pan.x; - _p.pan.y = vp.pan.y; - } - - this.emit('zoom' + (vp.panned ? ' pan' : '') + ' viewport'); - this.notify('viewport'); - return this; // chaining - } - }, - viewport: function viewport(opts) { - var _p = this._private; - var zoomDefd = true; - var panDefd = true; - var events = []; // to trigger - - var zoomFailed = false; - var panFailed = false; - - if (!opts) { - return this; - } - - if (!number$1(opts.zoom)) { - zoomDefd = false; - } - - if (!plainObject(opts.pan)) { - panDefd = false; - } - - if (!zoomDefd && !panDefd) { - return this; - } - - if (zoomDefd) { - var z = opts.zoom; - - if (z < _p.minZoom || z > _p.maxZoom || !_p.zoomingEnabled) { - zoomFailed = true; - } else { - _p.zoom = z; - events.push('zoom'); - } - } - - if (panDefd && (!zoomFailed || !opts.cancelOnFailedZoom) && _p.panningEnabled) { - var p = opts.pan; - - if (number$1(p.x)) { - _p.pan.x = p.x; - panFailed = false; - } - - if (number$1(p.y)) { - _p.pan.y = p.y; - panFailed = false; - } - - if (!panFailed) { - events.push('pan'); - } - } - - if (events.length > 0) { - events.push('viewport'); - this.emit(events.join(' ')); - this.notify('viewport'); - } - - return this; // chaining - }, - center: function center(elements) { - var pan = this.getCenterPan(elements); - - if (pan) { - this._private.pan = pan; - this.emit('pan viewport'); - this.notify('viewport'); - } - - return this; // chaining - }, - getCenterPan: function getCenterPan(elements, zoom) { - if (!this._private.panningEnabled) { - return; - } - - if (string(elements)) { - var selector = elements; - elements = this.mutableElements().filter(selector); - } else if (!elementOrCollection(elements)) { - elements = this.mutableElements(); - } - - if (elements.length === 0) { - return; - } // can't centre pan to nothing - - - var bb = elements.boundingBox(); - var w = this.width(); - var h = this.height(); - zoom = zoom === undefined ? this._private.zoom : zoom; - var pan = { - // middle - x: (w - zoom * (bb.x1 + bb.x2)) / 2, - y: (h - zoom * (bb.y1 + bb.y2)) / 2 - }; - return pan; - }, - reset: function reset() { - if (!this._private.panningEnabled || !this._private.zoomingEnabled) { - return this; - } - - this.viewport({ - pan: { - x: 0, - y: 0 - }, - zoom: 1 - }); - return this; // chaining - }, - invalidateSize: function invalidateSize() { - this._private.sizeCache = null; - }, - size: function size() { - var _p = this._private; - var container = _p.container; - return _p.sizeCache = _p.sizeCache || (container ? function () { - var style = window$1.getComputedStyle(container); - - var val = function val(name) { - return parseFloat(style.getPropertyValue(name)); - }; - - return { - width: container.clientWidth - val('padding-left') - val('padding-right'), - height: container.clientHeight - val('padding-top') - val('padding-bottom') - }; - }() : { - // fallback if no container (not 0 b/c can be used for dividing etc) - width: 1, - height: 1 - }); - }, - width: function width() { - return this.size().width; - }, - height: function height() { - return this.size().height; - }, - extent: function extent() { - var pan = this._private.pan; - var zoom = this._private.zoom; - var rb = this.renderedExtent(); - var b = { - x1: (rb.x1 - pan.x) / zoom, - x2: (rb.x2 - pan.x) / zoom, - y1: (rb.y1 - pan.y) / zoom, - y2: (rb.y2 - pan.y) / zoom - }; - b.w = b.x2 - b.x1; - b.h = b.y2 - b.y1; - return b; - }, - renderedExtent: function renderedExtent() { - var width = this.width(); - var height = this.height(); - return { - x1: 0, - y1: 0, - x2: width, - y2: height, - w: width, - h: height - }; - }, - multiClickDebounceTime: function multiClickDebounceTime(_int) { - if (_int) this._private.multiClickDebounceTime = _int;else return this._private.multiClickDebounceTime; - return this; // chaining - } -}; // aliases - -corefn$1.centre = corefn$1.center; // backwards compatibility - -corefn$1.autolockNodes = corefn$1.autolock; -corefn$1.autoungrabifyNodes = corefn$1.autoungrabify; - -var fn = { - data: define.data({ - field: 'data', - bindingEvent: 'data', - allowBinding: true, - allowSetting: true, - settingEvent: 'data', - settingTriggersEvent: true, - triggerFnName: 'trigger', - allowGetting: true, - updateStyle: true - }), - removeData: define.removeData({ - field: 'data', - event: 'data', - triggerFnName: 'trigger', - triggerEvent: true, - updateStyle: true - }), - scratch: define.data({ - field: 'scratch', - bindingEvent: 'scratch', - allowBinding: true, - allowSetting: true, - settingEvent: 'scratch', - settingTriggersEvent: true, - triggerFnName: 'trigger', - allowGetting: true, - updateStyle: true - }), - removeScratch: define.removeData({ - field: 'scratch', - event: 'scratch', - triggerFnName: 'trigger', - triggerEvent: true, - updateStyle: true - }) -}; // aliases - -fn.attr = fn.data; -fn.removeAttr = fn.removeData; - -var Core = function Core(opts) { - var cy = this; - opts = extend({}, opts); - var container = opts.container; // allow for passing a wrapped jquery object - // e.g. cytoscape({ container: $('#cy') }) - - if (container && !htmlElement(container) && htmlElement(container[0])) { - container = container[0]; - } - - var reg = container ? container._cyreg : null; // e.g. already registered some info (e.g. readies) via jquery - - reg = reg || {}; - - if (reg && reg.cy) { - reg.cy.destroy(); - reg = {}; // old instance => replace reg completely - } - - var readies = reg.readies = reg.readies || []; - - if (container) { - container._cyreg = reg; - } // make sure container assoc'd reg points to this cy - - - reg.cy = cy; - var head = window$1 !== undefined && container !== undefined && !opts.headless; - var options = opts; - options.layout = extend({ - name: head ? 'grid' : 'null' - }, options.layout); - options.renderer = extend({ - name: head ? 'canvas' : 'null' - }, options.renderer); - - var defVal = function defVal(def, val, altVal) { - if (val !== undefined) { - return val; - } else if (altVal !== undefined) { - return altVal; - } else { - return def; - } - }; - - var _p = this._private = { - container: container, - // html dom ele container - ready: false, - // whether ready has been triggered - options: options, - // cached options - elements: new Collection(this), - // elements in the graph - listeners: [], - // list of listeners - aniEles: new Collection(this), - // elements being animated - data: options.data || {}, - // data for the core - scratch: {}, - // scratch object for core - layout: null, - renderer: null, - destroyed: false, - // whether destroy was called - notificationsEnabled: true, - // whether notifications are sent to the renderer - minZoom: 1e-50, - maxZoom: 1e50, - zoomingEnabled: defVal(true, options.zoomingEnabled), - userZoomingEnabled: defVal(true, options.userZoomingEnabled), - panningEnabled: defVal(true, options.panningEnabled), - userPanningEnabled: defVal(true, options.userPanningEnabled), - boxSelectionEnabled: defVal(true, options.boxSelectionEnabled), - autolock: defVal(false, options.autolock, options.autolockNodes), - autoungrabify: defVal(false, options.autoungrabify, options.autoungrabifyNodes), - autounselectify: defVal(false, options.autounselectify), - styleEnabled: options.styleEnabled === undefined ? head : options.styleEnabled, - zoom: number$1(options.zoom) ? options.zoom : 1, - pan: { - x: plainObject(options.pan) && number$1(options.pan.x) ? options.pan.x : 0, - y: plainObject(options.pan) && number$1(options.pan.y) ? options.pan.y : 0 - }, - animation: { - // object for currently-running animations - current: [], - queue: [] - }, - hasCompoundNodes: false, - multiClickDebounceTime: defVal(250, options.multiClickDebounceTime) - }; - - this.createEmitter(); // set selection type - - this.selectionType(options.selectionType); // init zoom bounds - - this.zoomRange({ - min: options.minZoom, - max: options.maxZoom - }); - - var loadExtData = function loadExtData(extData, next) { - var anyIsPromise = extData.some(promise); - - if (anyIsPromise) { - return Promise$1.all(extData).then(next); // load all data asynchronously, then exec rest of init - } else { - next(extData); // exec synchronously for convenience - } - }; // start with the default stylesheet so we have something before loading an external stylesheet - - - if (_p.styleEnabled) { - cy.setStyle([]); - } // create the renderer - - - var rendererOptions = extend({}, options, options.renderer); // allow rendering hints in top level options - - cy.initRenderer(rendererOptions); - - var setElesAndLayout = function setElesAndLayout(elements, onload, ondone) { - cy.notifications(false); // remove old elements - - var oldEles = cy.mutableElements(); - - if (oldEles.length > 0) { - oldEles.remove(); - } - - if (elements != null) { - if (plainObject(elements) || array(elements)) { - cy.add(elements); - } - } - - cy.one('layoutready', function (e) { - cy.notifications(true); - cy.emit(e); // we missed this event by turning notifications off, so pass it on - - cy.one('load', onload); - cy.emitAndNotify('load'); - }).one('layoutstop', function () { - cy.one('done', ondone); - cy.emit('done'); - }); - var layoutOpts = extend({}, cy._private.options.layout); - layoutOpts.eles = cy.elements(); - cy.layout(layoutOpts).run(); - }; - - loadExtData([options.style, options.elements], function (thens) { - var initStyle = thens[0]; - var initEles = thens[1]; // init style - - if (_p.styleEnabled) { - cy.style().append(initStyle); - } // initial load - - - setElesAndLayout(initEles, function () { - // onready - cy.startAnimationLoop(); - _p.ready = true; // if a ready callback is specified as an option, the bind it - - if (fn$6(options.ready)) { - cy.on('ready', options.ready); - } // bind all the ready handlers registered before creating this instance - - - for (var i = 0; i < readies.length; i++) { - var fn = readies[i]; - cy.on('ready', fn); - } - - if (reg) { - reg.readies = []; - } // clear b/c we've bound them all and don't want to keep it around in case a new core uses the same div etc - - - cy.emit('ready'); - }, options.done); - }); -}; - -var corefn = Core.prototype; // short alias - -extend(corefn, { - instanceString: function instanceString() { - return 'core'; - }, - isReady: function isReady() { - return this._private.ready; - }, - destroyed: function destroyed() { - return this._private.destroyed; - }, - ready: function ready(fn) { - if (this.isReady()) { - this.emitter().emit('ready', [], fn); // just calls fn as though triggered via ready event - } else { - this.on('ready', fn); - } - - return this; - }, - destroy: function destroy() { - var cy = this; - if (cy.destroyed()) return; - cy.stopAnimationLoop(); - cy.destroyRenderer(); - this.emit('destroy'); - cy._private.destroyed = true; - return cy; - }, - hasElementWithId: function hasElementWithId(id) { - return this._private.elements.hasElementWithId(id); - }, - getElementById: function getElementById(id) { - return this._private.elements.getElementById(id); - }, - hasCompoundNodes: function hasCompoundNodes() { - return this._private.hasCompoundNodes; - }, - headless: function headless() { - return this._private.renderer.isHeadless(); - }, - styleEnabled: function styleEnabled() { - return this._private.styleEnabled; - }, - addToPool: function addToPool(eles) { - this._private.elements.merge(eles); - - return this; // chaining - }, - removeFromPool: function removeFromPool(eles) { - this._private.elements.unmerge(eles); - - return this; - }, - container: function container() { - return this._private.container || null; - }, - mount: function mount(container) { - if (container == null) { - return; - } - - var cy = this; - var _p = cy._private; - var options = _p.options; - - if (!htmlElement(container) && htmlElement(container[0])) { - container = container[0]; - } - - cy.stopAnimationLoop(); - cy.destroyRenderer(); - _p.container = container; - _p.styleEnabled = true; - cy.invalidateSize(); - cy.initRenderer(extend({}, options, options.renderer, { - // allow custom renderer name to be re-used, otherwise use canvas - name: options.renderer.name === 'null' ? 'canvas' : options.renderer.name - })); - cy.startAnimationLoop(); - cy.style(options.style); - cy.emit('mount'); - return cy; - }, - unmount: function unmount() { - var cy = this; - cy.stopAnimationLoop(); - cy.destroyRenderer(); - cy.initRenderer({ - name: 'null' - }); - cy.emit('unmount'); - return cy; - }, - options: function options() { - return copy(this._private.options); - }, - json: function json(obj) { - var cy = this; - var _p = cy._private; - var eles = cy.mutableElements(); - - var getFreshRef = function getFreshRef(ele) { - return cy.getElementById(ele.id()); - }; - - if (plainObject(obj)) { - // set - cy.startBatch(); - - if (obj.elements) { - var idInJson = {}; - - var updateEles = function updateEles(jsons, gr) { - var toAdd = []; - var toMod = []; - - for (var i = 0; i < jsons.length; i++) { - var json = jsons[i]; - - if (!json.data.id) { - warn('cy.json() cannot handle elements without an ID attribute'); - continue; - } - - var id = '' + json.data.id; // id must be string - - var ele = cy.getElementById(id); - idInJson[id] = true; - - if (ele.length !== 0) { - // existing element should be updated - toMod.push({ - ele: ele, - json: json - }); - } else { - // otherwise should be added - if (gr) { - json.group = gr; - toAdd.push(json); - } else { - toAdd.push(json); - } - } - } - - cy.add(toAdd); - - for (var _i = 0; _i < toMod.length; _i++) { - var _toMod$_i = toMod[_i], - _ele = _toMod$_i.ele, - _json = _toMod$_i.json; - - _ele.json(_json); - } - }; - - if (array(obj.elements)) { - // elements: [] - updateEles(obj.elements); - } else { - // elements: { nodes: [], edges: [] } - var grs = ['nodes', 'edges']; - - for (var i = 0; i < grs.length; i++) { - var gr = grs[i]; - var elements = obj.elements[gr]; - - if (array(elements)) { - updateEles(elements, gr); - } - } - } - - var parentsToRemove = cy.collection(); - eles.filter(function (ele) { - return !idInJson[ele.id()]; - }).forEach(function (ele) { - if (ele.isParent()) { - parentsToRemove.merge(ele); - } else { - ele.remove(); - } - }); // so that children are not removed w/parent - - parentsToRemove.forEach(function (ele) { - return ele.children().move({ - parent: null - }); - }); // intermediate parents may be moved by prior line, so make sure we remove by fresh refs - - parentsToRemove.forEach(function (ele) { - return getFreshRef(ele).remove(); - }); - } - - if (obj.style) { - cy.style(obj.style); - } - - if (obj.zoom != null && obj.zoom !== _p.zoom) { - cy.zoom(obj.zoom); - } - - if (obj.pan) { - if (obj.pan.x !== _p.pan.x || obj.pan.y !== _p.pan.y) { - cy.pan(obj.pan); - } - } - - if (obj.data) { - cy.data(obj.data); - } - - var fields = ['minZoom', 'maxZoom', 'zoomingEnabled', 'userZoomingEnabled', 'panningEnabled', 'userPanningEnabled', 'boxSelectionEnabled', 'autolock', 'autoungrabify', 'autounselectify', 'multiClickDebounceTime']; - - for (var _i2 = 0; _i2 < fields.length; _i2++) { - var f = fields[_i2]; - - if (obj[f] != null) { - cy[f](obj[f]); - } - } - - cy.endBatch(); - return this; // chaining - } else { - // get - var flat = !!obj; - var json = {}; - - if (flat) { - json.elements = this.elements().map(function (ele) { - return ele.json(); - }); - } else { - json.elements = {}; - eles.forEach(function (ele) { - var group = ele.group(); - - if (!json.elements[group]) { - json.elements[group] = []; - } - - json.elements[group].push(ele.json()); - }); - } - - if (this._private.styleEnabled) { - json.style = cy.style().json(); - } - - json.data = copy(cy.data()); - var options = _p.options; - json.zoomingEnabled = _p.zoomingEnabled; - json.userZoomingEnabled = _p.userZoomingEnabled; - json.zoom = _p.zoom; - json.minZoom = _p.minZoom; - json.maxZoom = _p.maxZoom; - json.panningEnabled = _p.panningEnabled; - json.userPanningEnabled = _p.userPanningEnabled; - json.pan = copy(_p.pan); - json.boxSelectionEnabled = _p.boxSelectionEnabled; - json.renderer = copy(options.renderer); - json.hideEdgesOnViewport = options.hideEdgesOnViewport; - json.textureOnViewport = options.textureOnViewport; - json.wheelSensitivity = options.wheelSensitivity; - json.motionBlur = options.motionBlur; - json.multiClickDebounceTime = options.multiClickDebounceTime; - return json; - } - } -}); -corefn.$id = corefn.getElementById; -[corefn$9, corefn$8, elesfn, corefn$7, corefn$6, corefn$5, corefn$4, corefn$3, corefn$2, corefn$1, fn].forEach(function (props) { - extend(corefn, props); -}); - -/* eslint-disable no-unused-vars */ - -var defaults$7 = { - fit: true, - // whether to fit the viewport to the graph - directed: false, - // whether the tree is directed downwards (or edges can point in any direction if false) - padding: 30, - // padding on fit - circle: false, - // put depths in concentric circles if true, put depths top down if false - grid: false, - // whether to create an even grid into which the DAG is placed (circle:false only) - spacingFactor: 1.75, - // positive spacing factor, larger => more space between nodes (N.B. n/a if causes overlap) - boundingBox: undefined, - // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } - avoidOverlap: true, - // prevents node overlap, may overflow boundingBox if not enough space - nodeDimensionsIncludeLabels: false, - // Excludes the label when calculating node bounding boxes for the layout algorithm - roots: undefined, - // the roots of the trees - depthSort: undefined, - // a sorting function to order nodes at equal depth. e.g. function(a, b){ return a.data('weight') - b.data('weight') } - animate: false, - // whether to transition the node positions - animationDuration: 500, - // duration of animation in ms if enabled - animationEasing: undefined, - // easing of animation if enabled, - animateFilter: function animateFilter(node, i) { - return true; - }, - // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts - ready: undefined, - // callback on layoutready - stop: undefined, - // callback on layoutstop - transform: function transform(node, position) { - return position; - } // transform a given node position. Useful for changing flow direction in discrete layouts - -}; -var deprecatedOptionDefaults = { - maximal: false, - // whether to shift nodes down their natural BFS depths in order to avoid upwards edges (DAGS only); setting acyclic to true sets maximal to true also - acyclic: false // whether the tree is acyclic and thus a node could be shifted (due to the maximal option) multiple times without causing an infinite loop; setting to true sets maximal to true also; if you are uncertain whether a tree is acyclic, set to false to avoid potential infinite loops - -}; -/* eslint-enable */ - -var getInfo = function getInfo(ele) { - return ele.scratch('breadthfirst'); -}; - -var setInfo = function setInfo(ele, obj) { - return ele.scratch('breadthfirst', obj); -}; - -function BreadthFirstLayout(options) { - this.options = extend({}, defaults$7, deprecatedOptionDefaults, options); -} - -BreadthFirstLayout.prototype.run = function () { - var params = this.options; - var options = params; - var cy = params.cy; - var eles = options.eles; - var nodes = eles.nodes().filter(function (n) { - return !n.isParent(); - }); - var graph = eles; - var directed = options.directed; - var maximal = options.acyclic || options.maximal || options.maximalAdjustments > 0; // maximalAdjustments for compat. w/ old code; also, setting acyclic to true sets maximal to true - - var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { - x1: 0, - y1: 0, - w: cy.width(), - h: cy.height() - }); - var roots; - - if (elementOrCollection(options.roots)) { - roots = options.roots; - } else if (array(options.roots)) { - var rootsArray = []; - - for (var i = 0; i < options.roots.length; i++) { - var id = options.roots[i]; - var ele = cy.getElementById(id); - rootsArray.push(ele); - } - - roots = cy.collection(rootsArray); - } else if (string(options.roots)) { - roots = cy.$(options.roots); - } else { - if (directed) { - roots = nodes.roots(); - } else { - var components = eles.components(); - roots = cy.collection(); - - var _loop = function _loop(_i) { - var comp = components[_i]; - var maxDegree = comp.maxDegree(false); - var compRoots = comp.filter(function (ele) { - return ele.degree(false) === maxDegree; - }); - roots = roots.add(compRoots); - }; - - for (var _i = 0; _i < components.length; _i++) { - _loop(_i); - } - } - } - - var depths = []; - var foundByBfs = {}; - - var addToDepth = function addToDepth(ele, d) { - if (depths[d] == null) { - depths[d] = []; - } - - var i = depths[d].length; - depths[d].push(ele); - setInfo(ele, { - index: i, - depth: d - }); - }; - - var changeDepth = function changeDepth(ele, newDepth) { - var _getInfo = getInfo(ele), - depth = _getInfo.depth, - index = _getInfo.index; - - depths[depth][index] = null; - addToDepth(ele, newDepth); - }; // find the depths of the nodes - - - graph.bfs({ - roots: roots, - directed: options.directed, - visit: function visit(node, edge, pNode, i, depth) { - var ele = node[0]; - var id = ele.id(); - addToDepth(ele, depth); - foundByBfs[id] = true; - } - }); // check for nodes not found by bfs - - var orphanNodes = []; - - for (var _i2 = 0; _i2 < nodes.length; _i2++) { - var _ele = nodes[_i2]; - - if (foundByBfs[_ele.id()]) { - continue; - } else { - orphanNodes.push(_ele); - } - } // assign the nodes a depth and index - - - var assignDepthsAt = function assignDepthsAt(i) { - var eles = depths[i]; - - for (var j = 0; j < eles.length; j++) { - var _ele2 = eles[j]; - - if (_ele2 == null) { - eles.splice(j, 1); - j--; - continue; - } - - setInfo(_ele2, { - depth: i, - index: j - }); - } - }; - - var assignDepths = function assignDepths() { - for (var _i3 = 0; _i3 < depths.length; _i3++) { - assignDepthsAt(_i3); - } - }; - - var adjustMaximally = function adjustMaximally(ele, shifted) { - var eInfo = getInfo(ele); - var incomers = ele.incomers().filter(function (el) { - return el.isNode() && eles.has(el); - }); - var maxDepth = -1; - var id = ele.id(); - - for (var k = 0; k < incomers.length; k++) { - var incmr = incomers[k]; - var iInfo = getInfo(incmr); - maxDepth = Math.max(maxDepth, iInfo.depth); - } - - if (eInfo.depth <= maxDepth) { - if (!options.acyclic && shifted[id]) { - return null; - } - - var newDepth = maxDepth + 1; - changeDepth(ele, newDepth); - shifted[id] = newDepth; - return true; - } - - return false; - }; // for the directed case, try to make the edges all go down (i.e. depth i => depth i + 1) - - - if (directed && maximal) { - var Q = []; - var shifted = {}; - - var enqueue = function enqueue(n) { - return Q.push(n); - }; - - var dequeue = function dequeue() { - return Q.shift(); - }; - - nodes.forEach(function (n) { - return Q.push(n); - }); - - while (Q.length > 0) { - var _ele3 = dequeue(); - - var didShift = adjustMaximally(_ele3, shifted); - - if (didShift) { - _ele3.outgoers().filter(function (el) { - return el.isNode() && eles.has(el); - }).forEach(enqueue); - } else if (didShift === null) { - warn('Detected double maximal shift for node `' + _ele3.id() + '`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.'); - break; // exit on failure - } - } - } - - assignDepths(); // clear holes - // find min distance we need to leave between nodes - - var minDistance = 0; - - if (options.avoidOverlap) { - for (var _i4 = 0; _i4 < nodes.length; _i4++) { - var n = nodes[_i4]; - var nbb = n.layoutDimensions(options); - var w = nbb.w; - var h = nbb.h; - minDistance = Math.max(minDistance, w, h); - } - } // get the weighted percent for an element based on its connectivity to other levels - - - var cachedWeightedPercent = {}; - - var getWeightedPercent = function getWeightedPercent(ele) { - if (cachedWeightedPercent[ele.id()]) { - return cachedWeightedPercent[ele.id()]; - } - - var eleDepth = getInfo(ele).depth; - var neighbors = ele.neighborhood(); - var percent = 0; - var samples = 0; - - for (var _i5 = 0; _i5 < neighbors.length; _i5++) { - var neighbor = neighbors[_i5]; - - if (neighbor.isEdge() || neighbor.isParent() || !nodes.has(neighbor)) { - continue; - } - - var bf = getInfo(neighbor); - - if (bf == null) { - continue; - } - - var index = bf.index; - var depth = bf.depth; // unassigned neighbours shouldn't affect the ordering - - if (index == null || depth == null) { - continue; - } - - var nDepth = depths[depth].length; - - if (depth < eleDepth) { - // only get influenced by elements above - percent += index / nDepth; - samples++; - } - } - - samples = Math.max(1, samples); - percent = percent / samples; - - if (samples === 0) { - // put lone nodes at the start - percent = 0; - } - - cachedWeightedPercent[ele.id()] = percent; - return percent; - }; // rearrange the indices in each depth level based on connectivity - - - var sortFn = function sortFn(a, b) { - var apct = getWeightedPercent(a); - var bpct = getWeightedPercent(b); - var diff = apct - bpct; - - if (diff === 0) { - return ascending(a.id(), b.id()); // make sure sort doesn't have don't-care comparisons - } else { - return diff; - } - }; - - if (options.depthSort !== undefined) { - sortFn = options.depthSort; - } // sort each level to make connected nodes closer - - - for (var _i6 = 0; _i6 < depths.length; _i6++) { - depths[_i6].sort(sortFn); - - assignDepthsAt(_i6); - } // assign orphan nodes to a new top-level depth - - - var orphanDepth = []; - - for (var _i7 = 0; _i7 < orphanNodes.length; _i7++) { - orphanDepth.push(orphanNodes[_i7]); - } - - depths.unshift(orphanDepth); - assignDepths(); - var biggestDepthSize = 0; - - for (var _i8 = 0; _i8 < depths.length; _i8++) { - biggestDepthSize = Math.max(depths[_i8].length, biggestDepthSize); - } - - var center = { - x: bb.x1 + bb.w / 2, - y: bb.x1 + bb.h / 2 - }; - var maxDepthSize = depths.reduce(function (max, eles) { - return Math.max(max, eles.length); - }, 0); - - var getPosition = function getPosition(ele) { - var _getInfo2 = getInfo(ele), - depth = _getInfo2.depth, - index = _getInfo2.index; - - var depthSize = depths[depth].length; - var distanceX = Math.max(bb.w / ((options.grid ? maxDepthSize : depthSize) + 1), minDistance); - var distanceY = Math.max(bb.h / (depths.length + 1), minDistance); - var radiusStepSize = Math.min(bb.w / 2 / depths.length, bb.h / 2 / depths.length); - radiusStepSize = Math.max(radiusStepSize, minDistance); - - if (!options.circle) { - var epos = { - x: center.x + (index + 1 - (depthSize + 1) / 2) * distanceX, - y: (depth + 1) * distanceY - }; - return epos; - } else { - var radius = radiusStepSize * depth + radiusStepSize - (depths.length > 0 && depths[0].length <= 3 ? radiusStepSize / 2 : 0); - var theta = 2 * Math.PI / depths[depth].length * index; - - if (depth === 0 && depths[0].length === 1) { - radius = 1; - } - - return { - x: center.x + radius * Math.cos(theta), - y: center.y + radius * Math.sin(theta) - }; - } - }; - - eles.nodes().layoutPositions(this, options, getPosition); - return this; // chaining -}; - -var defaults$6 = { - fit: true, - // whether to fit the viewport to the graph - padding: 30, - // the padding on fit - boundingBox: undefined, - // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } - avoidOverlap: true, - // prevents node overlap, may overflow boundingBox and radius if not enough space - nodeDimensionsIncludeLabels: false, - // Excludes the label when calculating node bounding boxes for the layout algorithm - spacingFactor: undefined, - // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up - radius: undefined, - // the radius of the circle - startAngle: 3 / 2 * Math.PI, - // where nodes start in radians - sweep: undefined, - // how many radians should be between the first and last node (defaults to full circle) - clockwise: true, - // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false) - sort: undefined, - // a sorting function to order the nodes; e.g. function(a, b){ return a.data('weight') - b.data('weight') } - animate: false, - // whether to transition the node positions - animationDuration: 500, - // duration of animation in ms if enabled - animationEasing: undefined, - // easing of animation if enabled - animateFilter: function animateFilter(node, i) { - return true; - }, - // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts - ready: undefined, - // callback on layoutready - stop: undefined, - // callback on layoutstop - transform: function transform(node, position) { - return position; - } // transform a given node position. Useful for changing flow direction in discrete layouts - -}; - -function CircleLayout(options) { - this.options = extend({}, defaults$6, options); -} - -CircleLayout.prototype.run = function () { - var params = this.options; - var options = params; - var cy = params.cy; - var eles = options.eles; - var clockwise = options.counterclockwise !== undefined ? !options.counterclockwise : options.clockwise; - var nodes = eles.nodes().not(':parent'); - - if (options.sort) { - nodes = nodes.sort(options.sort); - } - - var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { - x1: 0, - y1: 0, - w: cy.width(), - h: cy.height() - }); - var center = { - x: bb.x1 + bb.w / 2, - y: bb.y1 + bb.h / 2 - }; - var sweep = options.sweep === undefined ? 2 * Math.PI - 2 * Math.PI / nodes.length : options.sweep; - var dTheta = sweep / Math.max(1, nodes.length - 1); - var r; - var minDistance = 0; - - for (var i = 0; i < nodes.length; i++) { - var n = nodes[i]; - var nbb = n.layoutDimensions(options); - var w = nbb.w; - var h = nbb.h; - minDistance = Math.max(minDistance, w, h); - } - - if (number$1(options.radius)) { - r = options.radius; - } else if (nodes.length <= 1) { - r = 0; - } else { - r = Math.min(bb.h, bb.w) / 2 - minDistance; - } // calculate the radius - - - if (nodes.length > 1 && options.avoidOverlap) { - // but only if more than one node (can't overlap) - minDistance *= 1.75; // just to have some nice spacing - - var dcos = Math.cos(dTheta) - Math.cos(0); - var dsin = Math.sin(dTheta) - Math.sin(0); - var rMin = Math.sqrt(minDistance * minDistance / (dcos * dcos + dsin * dsin)); // s.t. no nodes overlapping - - r = Math.max(rMin, r); - } - - var getPos = function getPos(ele, i) { - var theta = options.startAngle + i * dTheta * (clockwise ? 1 : -1); - var rx = r * Math.cos(theta); - var ry = r * Math.sin(theta); - var pos = { - x: center.x + rx, - y: center.y + ry - }; - return pos; - }; - - eles.nodes().layoutPositions(this, options, getPos); - return this; // chaining -}; - -var defaults$5 = { - fit: true, - // whether to fit the viewport to the graph - padding: 30, - // the padding on fit - startAngle: 3 / 2 * Math.PI, - // where nodes start in radians - sweep: undefined, - // how many radians should be between the first and last node (defaults to full circle) - clockwise: true, - // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false) - equidistant: false, - // whether levels have an equal radial distance betwen them, may cause bounding box overflow - minNodeSpacing: 10, - // min spacing between outside of nodes (used for radius adjustment) - boundingBox: undefined, - // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } - avoidOverlap: true, - // prevents node overlap, may overflow boundingBox if not enough space - nodeDimensionsIncludeLabels: false, - // Excludes the label when calculating node bounding boxes for the layout algorithm - height: undefined, - // height of layout area (overrides container height) - width: undefined, - // width of layout area (overrides container width) - spacingFactor: undefined, - // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up - concentric: function concentric(node) { - // returns numeric value for each node, placing higher nodes in levels towards the centre - return node.degree(); - }, - levelWidth: function levelWidth(nodes) { - // the variation of concentric values in each level - return nodes.maxDegree() / 4; - }, - animate: false, - // whether to transition the node positions - animationDuration: 500, - // duration of animation in ms if enabled - animationEasing: undefined, - // easing of animation if enabled - animateFilter: function animateFilter(node, i) { - return true; - }, - // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts - ready: undefined, - // callback on layoutready - stop: undefined, - // callback on layoutstop - transform: function transform(node, position) { - return position; - } // transform a given node position. Useful for changing flow direction in discrete layouts - -}; - -function ConcentricLayout(options) { - this.options = extend({}, defaults$5, options); -} - -ConcentricLayout.prototype.run = function () { - var params = this.options; - var options = params; - var clockwise = options.counterclockwise !== undefined ? !options.counterclockwise : options.clockwise; - var cy = params.cy; - var eles = options.eles; - var nodes = eles.nodes().not(':parent'); - var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { - x1: 0, - y1: 0, - w: cy.width(), - h: cy.height() - }); - var center = { - x: bb.x1 + bb.w / 2, - y: bb.y1 + bb.h / 2 - }; - var nodeValues = []; // { node, value } - - var maxNodeSize = 0; - - for (var i = 0; i < nodes.length; i++) { - var node = nodes[i]; - var value = void 0; // calculate the node value - - value = options.concentric(node); - nodeValues.push({ - value: value, - node: node - }); // for style mapping - - node._private.scratch.concentric = value; - } // in case we used the `concentric` in style - - - nodes.updateStyle(); // calculate max size now based on potentially updated mappers - - for (var _i = 0; _i < nodes.length; _i++) { - var _node = nodes[_i]; - - var nbb = _node.layoutDimensions(options); - - maxNodeSize = Math.max(maxNodeSize, nbb.w, nbb.h); - } // sort node values in descreasing order - - - nodeValues.sort(function (a, b) { - return b.value - a.value; - }); - var levelWidth = options.levelWidth(nodes); // put the values into levels - - var levels = [[]]; - var currentLevel = levels[0]; - - for (var _i2 = 0; _i2 < nodeValues.length; _i2++) { - var val = nodeValues[_i2]; - - if (currentLevel.length > 0) { - var diff = Math.abs(currentLevel[0].value - val.value); - - if (diff >= levelWidth) { - currentLevel = []; - levels.push(currentLevel); - } - } - - currentLevel.push(val); - } // create positions from levels - - - var minDist = maxNodeSize + options.minNodeSpacing; // min dist between nodes - - if (!options.avoidOverlap) { - // then strictly constrain to bb - var firstLvlHasMulti = levels.length > 0 && levels[0].length > 1; - var maxR = Math.min(bb.w, bb.h) / 2 - minDist; - var rStep = maxR / (levels.length + firstLvlHasMulti ? 1 : 0); - minDist = Math.min(minDist, rStep); - } // find the metrics for each level - - - var r = 0; - - for (var _i3 = 0; _i3 < levels.length; _i3++) { - var level = levels[_i3]; - var sweep = options.sweep === undefined ? 2 * Math.PI - 2 * Math.PI / level.length : options.sweep; - var dTheta = level.dTheta = sweep / Math.max(1, level.length - 1); // calculate the radius - - if (level.length > 1 && options.avoidOverlap) { - // but only if more than one node (can't overlap) - var dcos = Math.cos(dTheta) - Math.cos(0); - var dsin = Math.sin(dTheta) - Math.sin(0); - var rMin = Math.sqrt(minDist * minDist / (dcos * dcos + dsin * dsin)); // s.t. no nodes overlapping - - r = Math.max(rMin, r); - } - - level.r = r; - r += minDist; - } - - if (options.equidistant) { - var rDeltaMax = 0; - var _r = 0; - - for (var _i4 = 0; _i4 < levels.length; _i4++) { - var _level = levels[_i4]; - var rDelta = _level.r - _r; - rDeltaMax = Math.max(rDeltaMax, rDelta); - } - - _r = 0; - - for (var _i5 = 0; _i5 < levels.length; _i5++) { - var _level2 = levels[_i5]; - - if (_i5 === 0) { - _r = _level2.r; - } - - _level2.r = _r; - _r += rDeltaMax; - } - } // calculate the node positions - - - var pos = {}; // id => position - - for (var _i6 = 0; _i6 < levels.length; _i6++) { - var _level3 = levels[_i6]; - var _dTheta = _level3.dTheta; - var _r2 = _level3.r; - - for (var j = 0; j < _level3.length; j++) { - var _val = _level3[j]; - var theta = options.startAngle + (clockwise ? 1 : -1) * _dTheta * j; - var p = { - x: center.x + _r2 * Math.cos(theta), - y: center.y + _r2 * Math.sin(theta) - }; - pos[_val.node.id()] = p; - } - } // position the nodes - - - eles.nodes().layoutPositions(this, options, function (ele) { - var id = ele.id(); - return pos[id]; - }); - return this; // chaining -}; - -/* -The CoSE layout was written by Gerardo Huck. -https://www.linkedin.com/in/gerardohuck/ - -Based on the following article: -http://dl.acm.org/citation.cfm?id=1498047 - -Modifications tracked on Github. -*/ -var DEBUG; -/** - * @brief : default layout options - */ - -var defaults$4 = { - // Called on `layoutready` - ready: function ready() {}, - // Called on `layoutstop` - stop: function stop() {}, - // Whether to animate while running the layout - // true : Animate continuously as the layout is running - // false : Just show the end result - // 'end' : Animate with the end result, from the initial positions to the end positions - animate: true, - // Easing of the animation for animate:'end' - animationEasing: undefined, - // The duration of the animation for animate:'end' - animationDuration: undefined, - // A function that determines whether the node should be animated - // All nodes animated by default on animate enabled - // Non-animated nodes are positioned immediately when the layout starts - animateFilter: function animateFilter(node, i) { - return true; - }, - // The layout animates only after this many milliseconds for animate:true - // (prevents flashing on fast runs) - animationThreshold: 250, - // Number of iterations between consecutive screen positions update - refresh: 20, - // Whether to fit the network view after when done - fit: true, - // Padding on fit - padding: 30, - // Constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } - boundingBox: undefined, - // Excludes the label when calculating node bounding boxes for the layout algorithm - nodeDimensionsIncludeLabels: false, - // Randomize the initial positions of the nodes (true) or use existing positions (false) - randomize: false, - // Extra spacing between components in non-compound graphs - componentSpacing: 40, - // Node repulsion (non overlapping) multiplier - nodeRepulsion: function nodeRepulsion(node) { - return 2048; - }, - // Node repulsion (overlapping) multiplier - nodeOverlap: 4, - // Ideal edge (non nested) length - idealEdgeLength: function idealEdgeLength(edge) { - return 32; - }, - // Divisor to compute edge forces - edgeElasticity: function edgeElasticity(edge) { - return 32; - }, - // Nesting factor (multiplier) to compute ideal edge length for nested edges - nestingFactor: 1.2, - // Gravity force (constant) - gravity: 1, - // Maximum number of iterations to perform - numIter: 1000, - // Initial temperature (maximum node displacement) - initialTemp: 1000, - // Cooling factor (how the temperature is reduced between consecutive iterations - coolingFactor: 0.99, - // Lower temperature threshold (below this point the layout will end) - minTemp: 1.0 -}; -/** - * @brief : constructor - * @arg options : object containing layout options - */ - -function CoseLayout(options) { - this.options = extend({}, defaults$4, options); - this.options.layout = this; -} -/** - * @brief : runs the layout - */ - - -CoseLayout.prototype.run = function () { - var options = this.options; - var cy = options.cy; - var layout = this; - layout.stopped = false; - - if (options.animate === true || options.animate === false) { - layout.emit({ - type: 'layoutstart', - layout: layout - }); - } // Set DEBUG - Global variable - - - if (true === options.debug) { - DEBUG = true; - } else { - DEBUG = false; - } // Initialize layout info - - - var layoutInfo = createLayoutInfo(cy, layout, options); // Show LayoutInfo contents if debugging - - if (DEBUG) { - printLayoutInfo(layoutInfo); - } // If required, randomize node positions - - - if (options.randomize) { - randomizePositions(layoutInfo); - } - - var startTime = performanceNow(); - - var refresh = function refresh() { - refreshPositions(layoutInfo, cy, options); // Fit the graph if necessary - - if (true === options.fit) { - cy.fit(options.padding); - } - }; - - var mainLoop = function mainLoop(i) { - if (layout.stopped || i >= options.numIter) { - // logDebug("Layout manually stopped. Stopping computation in step " + i); - return false; - } // Do one step in the phisical simulation - - - step(layoutInfo, options); // Update temperature - - layoutInfo.temperature = layoutInfo.temperature * options.coolingFactor; // logDebug("New temperature: " + layoutInfo.temperature); - - if (layoutInfo.temperature < options.minTemp) { - // logDebug("Temperature drop below minimum threshold. Stopping computation in step " + i); - return false; - } - - return true; - }; - - var done = function done() { - if (options.animate === true || options.animate === false) { - refresh(); // Layout has finished - - layout.one('layoutstop', options.stop); - layout.emit({ - type: 'layoutstop', - layout: layout - }); - } else { - var nodes = options.eles.nodes(); - var getScaledPos = getScaleInBoundsFn(layoutInfo, options, nodes); - nodes.layoutPositions(layout, options, getScaledPos); - } - }; - - var i = 0; - var loopRet = true; - - if (options.animate === true) { - var frame = function frame() { - var f = 0; - - while (loopRet && f < options.refresh) { - loopRet = mainLoop(i); - i++; - f++; - } - - if (!loopRet) { - // it's done - separateComponents(layoutInfo, options); - done(); - } else { - var now = performanceNow(); - - if (now - startTime >= options.animationThreshold) { - refresh(); - } - - requestAnimationFrame(frame); - } - }; - - frame(); - } else { - while (loopRet) { - loopRet = mainLoop(i); - i++; - } - - separateComponents(layoutInfo, options); - done(); - } - - return this; // chaining -}; -/** - * @brief : called on continuous layouts to stop them before they finish - */ - - -CoseLayout.prototype.stop = function () { - this.stopped = true; - - if (this.thread) { - this.thread.stop(); - } - - this.emit('layoutstop'); - return this; // chaining -}; - -CoseLayout.prototype.destroy = function () { - if (this.thread) { - this.thread.stop(); - } - - return this; // chaining -}; -/** - * @brief : Creates an object which is contains all the data - * used in the layout process - * @arg cy : cytoscape.js object - * @return : layoutInfo object initialized - */ - - -var createLayoutInfo = function createLayoutInfo(cy, layout, options) { - // Shortcut - var edges = options.eles.edges(); - var nodes = options.eles.nodes(); - var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { - x1: 0, - y1: 0, - w: cy.width(), - h: cy.height() - }); - var layoutInfo = { - isCompound: cy.hasCompoundNodes(), - layoutNodes: [], - idToIndex: {}, - nodeSize: nodes.size(), - graphSet: [], - indexToGraph: [], - layoutEdges: [], - edgeSize: edges.size(), - temperature: options.initialTemp, - clientWidth: bb.w, - clientHeight: bb.h, - boundingBox: bb - }; - var components = options.eles.components(); - var id2cmptId = {}; - - for (var i = 0; i < components.length; i++) { - var component = components[i]; - - for (var j = 0; j < component.length; j++) { - var node = component[j]; - id2cmptId[node.id()] = i; - } - } // Iterate over all nodes, creating layout nodes - - - for (var i = 0; i < layoutInfo.nodeSize; i++) { - var n = nodes[i]; - var nbb = n.layoutDimensions(options); - var tempNode = {}; - tempNode.isLocked = n.locked(); - tempNode.id = n.data('id'); - tempNode.parentId = n.data('parent'); - tempNode.cmptId = id2cmptId[n.id()]; - tempNode.children = []; - tempNode.positionX = n.position('x'); - tempNode.positionY = n.position('y'); - tempNode.offsetX = 0; - tempNode.offsetY = 0; - tempNode.height = nbb.w; - tempNode.width = nbb.h; - tempNode.maxX = tempNode.positionX + tempNode.width / 2; - tempNode.minX = tempNode.positionX - tempNode.width / 2; - tempNode.maxY = tempNode.positionY + tempNode.height / 2; - tempNode.minY = tempNode.positionY - tempNode.height / 2; - tempNode.padLeft = parseFloat(n.style('padding')); - tempNode.padRight = parseFloat(n.style('padding')); - tempNode.padTop = parseFloat(n.style('padding')); - tempNode.padBottom = parseFloat(n.style('padding')); // forces - - tempNode.nodeRepulsion = fn$6(options.nodeRepulsion) ? options.nodeRepulsion(n) : options.nodeRepulsion; // Add new node - - layoutInfo.layoutNodes.push(tempNode); // Add entry to id-index map - - layoutInfo.idToIndex[tempNode.id] = i; - } // Inline implementation of a queue, used for traversing the graph in BFS order - - - var queue = []; - var start = 0; // Points to the start the queue - - var end = -1; // Points to the end of the queue - - var tempGraph = []; // Second pass to add child information and - // initialize queue for hierarchical traversal - - for (var i = 0; i < layoutInfo.nodeSize; i++) { - var n = layoutInfo.layoutNodes[i]; - var p_id = n.parentId; // Check if node n has a parent node - - if (null != p_id) { - // Add node Id to parent's list of children - layoutInfo.layoutNodes[layoutInfo.idToIndex[p_id]].children.push(n.id); - } else { - // If a node doesn't have a parent, then it's in the root graph - queue[++end] = n.id; - tempGraph.push(n.id); - } - } // Add root graph to graphSet - - - layoutInfo.graphSet.push(tempGraph); // Traverse the graph, level by level, - - while (start <= end) { - // Get the node to visit and remove it from queue - var node_id = queue[start++]; - var node_ix = layoutInfo.idToIndex[node_id]; - var node = layoutInfo.layoutNodes[node_ix]; - var children = node.children; - - if (children.length > 0) { - // Add children nodes as a new graph to graph set - layoutInfo.graphSet.push(children); // Add children to que queue to be visited - - for (var i = 0; i < children.length; i++) { - queue[++end] = children[i]; - } - } - } // Create indexToGraph map - - - for (var i = 0; i < layoutInfo.graphSet.length; i++) { - var graph = layoutInfo.graphSet[i]; - - for (var j = 0; j < graph.length; j++) { - var index = layoutInfo.idToIndex[graph[j]]; - layoutInfo.indexToGraph[index] = i; - } - } // Iterate over all edges, creating Layout Edges - - - for (var i = 0; i < layoutInfo.edgeSize; i++) { - var e = edges[i]; - var tempEdge = {}; - tempEdge.id = e.data('id'); - tempEdge.sourceId = e.data('source'); - tempEdge.targetId = e.data('target'); // Compute ideal length - - var idealLength = fn$6(options.idealEdgeLength) ? options.idealEdgeLength(e) : options.idealEdgeLength; - var elasticity = fn$6(options.edgeElasticity) ? options.edgeElasticity(e) : options.edgeElasticity; // Check if it's an inter graph edge - - var sourceIx = layoutInfo.idToIndex[tempEdge.sourceId]; - var targetIx = layoutInfo.idToIndex[tempEdge.targetId]; - var sourceGraph = layoutInfo.indexToGraph[sourceIx]; - var targetGraph = layoutInfo.indexToGraph[targetIx]; - - if (sourceGraph != targetGraph) { - // Find lowest common graph ancestor - var lca = findLCA(tempEdge.sourceId, tempEdge.targetId, layoutInfo); // Compute sum of node depths, relative to lca graph - - var lcaGraph = layoutInfo.graphSet[lca]; - var depth = 0; // Source depth - - var tempNode = layoutInfo.layoutNodes[sourceIx]; - - while (-1 === lcaGraph.indexOf(tempNode.id)) { - tempNode = layoutInfo.layoutNodes[layoutInfo.idToIndex[tempNode.parentId]]; - depth++; - } // Target depth - - - tempNode = layoutInfo.layoutNodes[targetIx]; - - while (-1 === lcaGraph.indexOf(tempNode.id)) { - tempNode = layoutInfo.layoutNodes[layoutInfo.idToIndex[tempNode.parentId]]; - depth++; - } // logDebug('LCA of nodes ' + tempEdge.sourceId + ' and ' + tempEdge.targetId + - // ". Index: " + lca + " Contents: " + lcaGraph.toString() + - // ". Depth: " + depth); - // Update idealLength - - - idealLength *= depth * options.nestingFactor; - } - - tempEdge.idealLength = idealLength; - tempEdge.elasticity = elasticity; - layoutInfo.layoutEdges.push(tempEdge); - } // Finally, return layoutInfo object - - - return layoutInfo; -}; -/** - * @brief : This function finds the index of the lowest common - * graph ancestor between 2 nodes in the subtree - * (from the graph hierarchy induced tree) whose - * root is graphIx - * - * @arg node1: node1's ID - * @arg node2: node2's ID - * @arg layoutInfo: layoutInfo object - * - */ - - -var findLCA = function findLCA(node1, node2, layoutInfo) { - // Find their common ancester, starting from the root graph - var res = findLCA_aux(node1, node2, 0, layoutInfo); - - if (2 > res.count) { - // If aux function couldn't find the common ancester, - // then it is the root graph - return 0; - } else { - return res.graph; - } -}; -/** - * @brief : Auxiliary function used for LCA computation - * - * @arg node1 : node1's ID - * @arg node2 : node2's ID - * @arg graphIx : subgraph index - * @arg layoutInfo : layoutInfo object - * - * @return : object of the form {count: X, graph: Y}, where: - * X is the number of ancestors (max: 2) found in - * graphIx (and it's subgraphs), - * Y is the graph index of the lowest graph containing - * all X nodes - */ - - -var findLCA_aux = function findLCA_aux(node1, node2, graphIx, layoutInfo) { - var graph = layoutInfo.graphSet[graphIx]; // If both nodes belongs to graphIx - - if (-1 < graph.indexOf(node1) && -1 < graph.indexOf(node2)) { - return { - count: 2, - graph: graphIx - }; - } // Make recursive calls for all subgraphs - - - var c = 0; - - for (var i = 0; i < graph.length; i++) { - var nodeId = graph[i]; - var nodeIx = layoutInfo.idToIndex[nodeId]; - var children = layoutInfo.layoutNodes[nodeIx].children; // If the node has no child, skip it - - if (0 === children.length) { - continue; - } - - var childGraphIx = layoutInfo.indexToGraph[layoutInfo.idToIndex[children[0]]]; - var result = findLCA_aux(node1, node2, childGraphIx, layoutInfo); - - if (0 === result.count) { - // Neither node1 nor node2 are present in this subgraph - continue; - } else if (1 === result.count) { - // One of (node1, node2) is present in this subgraph - c++; - - if (2 === c) { - // We've already found both nodes, no need to keep searching - break; - } - } else { - // Both nodes are present in this subgraph - return result; - } - } - - return { - count: c, - graph: graphIx - }; -}; -/** - * @brief: printsLayoutInfo into js console - * Only used for debbuging - */ - - -var printLayoutInfo; -/** - * @brief : Randomizes the position of all nodes - */ - - -var randomizePositions = function randomizePositions(layoutInfo, cy) { - var width = layoutInfo.clientWidth; - var height = layoutInfo.clientHeight; - - for (var i = 0; i < layoutInfo.nodeSize; i++) { - var n = layoutInfo.layoutNodes[i]; // No need to randomize compound nodes or locked nodes - - if (0 === n.children.length && !n.isLocked) { - n.positionX = Math.random() * width; - n.positionY = Math.random() * height; - } - } -}; - -var getScaleInBoundsFn = function getScaleInBoundsFn(layoutInfo, options, nodes) { - var bb = layoutInfo.boundingBox; - var coseBB = { - x1: Infinity, - x2: -Infinity, - y1: Infinity, - y2: -Infinity - }; - - if (options.boundingBox) { - nodes.forEach(function (node) { - var lnode = layoutInfo.layoutNodes[layoutInfo.idToIndex[node.data('id')]]; - coseBB.x1 = Math.min(coseBB.x1, lnode.positionX); - coseBB.x2 = Math.max(coseBB.x2, lnode.positionX); - coseBB.y1 = Math.min(coseBB.y1, lnode.positionY); - coseBB.y2 = Math.max(coseBB.y2, lnode.positionY); - }); - coseBB.w = coseBB.x2 - coseBB.x1; - coseBB.h = coseBB.y2 - coseBB.y1; - } - - return function (ele, i) { - var lnode = layoutInfo.layoutNodes[layoutInfo.idToIndex[ele.data('id')]]; - - if (options.boundingBox) { - // then add extra bounding box constraint - var pctX = (lnode.positionX - coseBB.x1) / coseBB.w; - var pctY = (lnode.positionY - coseBB.y1) / coseBB.h; - return { - x: bb.x1 + pctX * bb.w, - y: bb.y1 + pctY * bb.h - }; - } else { - return { - x: lnode.positionX, - y: lnode.positionY - }; - } - }; -}; -/** - * @brief : Updates the positions of nodes in the network - * @arg layoutInfo : LayoutInfo object - * @arg cy : Cytoscape object - * @arg options : Layout options - */ - - -var refreshPositions = function refreshPositions(layoutInfo, cy, options) { - // var s = 'Refreshing positions'; - // logDebug(s); - var layout = options.layout; - var nodes = options.eles.nodes(); - var getScaledPos = getScaleInBoundsFn(layoutInfo, options, nodes); - nodes.positions(getScaledPos); // Trigger layoutReady only on first call - - if (true !== layoutInfo.ready) { - // s = 'Triggering layoutready'; - // logDebug(s); - layoutInfo.ready = true; - layout.one('layoutready', options.ready); - layout.emit({ - type: 'layoutready', - layout: this - }); - } -}; -/** - * @brief : Logs a debug message in JS console, if DEBUG is ON - */ -// var logDebug = function(text) { -// if (DEBUG) { -// console.debug(text); -// } -// }; - -/** - * @brief : Performs one iteration of the physical simulation - * @arg layoutInfo : LayoutInfo object already initialized - * @arg cy : Cytoscape object - * @arg options : Layout options - */ - - -var step = function step(layoutInfo, options, _step) { - // var s = "\n\n###############################"; - // s += "\nSTEP: " + step; - // s += "\n###############################\n"; - // logDebug(s); - // Calculate node repulsions - calculateNodeForces(layoutInfo, options); // Calculate edge forces - - calculateEdgeForces(layoutInfo); // Calculate gravity forces - - calculateGravityForces(layoutInfo, options); // Propagate forces from parent to child - - propagateForces(layoutInfo); // Update positions based on calculated forces - - updatePositions(layoutInfo); -}; -/** - * @brief : Computes the node repulsion forces - */ - - -var calculateNodeForces = function calculateNodeForces(layoutInfo, options) { - // Go through each of the graphs in graphSet - // Nodes only repel each other if they belong to the same graph - // var s = 'calculateNodeForces'; - // logDebug(s); - for (var i = 0; i < layoutInfo.graphSet.length; i++) { - var graph = layoutInfo.graphSet[i]; - var numNodes = graph.length; // s = "Set: " + graph.toString(); - // logDebug(s); - // Now get all the pairs of nodes - // Only get each pair once, (A, B) = (B, A) - - for (var j = 0; j < numNodes; j++) { - var node1 = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[j]]]; - - for (var k = j + 1; k < numNodes; k++) { - var node2 = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[k]]]; - nodeRepulsion(node1, node2, layoutInfo, options); - } - } - } -}; - -var randomDistance = function randomDistance(max) { - return -max + 2 * max * Math.random(); -}; -/** - * @brief : Compute the node repulsion forces between a pair of nodes - */ - - -var nodeRepulsion = function nodeRepulsion(node1, node2, layoutInfo, options) { - // var s = "Node repulsion. Node1: " + node1.id + " Node2: " + node2.id; - var cmptId1 = node1.cmptId; - var cmptId2 = node2.cmptId; - - if (cmptId1 !== cmptId2 && !layoutInfo.isCompound) { - return; - } // Get direction of line connecting both node centers - - - var directionX = node2.positionX - node1.positionX; - var directionY = node2.positionY - node1.positionY; - var maxRandDist = 1; // s += "\ndirectionX: " + directionX + ", directionY: " + directionY; - // If both centers are the same, apply a random force - - if (0 === directionX && 0 === directionY) { - directionX = randomDistance(maxRandDist); - directionY = randomDistance(maxRandDist); - } - - var overlap = nodesOverlap(node1, node2, directionX, directionY); - - if (overlap > 0) { - // s += "\nNodes DO overlap."; - // s += "\nOverlap: " + overlap; - // If nodes overlap, repulsion force is proportional - // to the overlap - var force = options.nodeOverlap * overlap; // Compute the module and components of the force vector - - var distance = Math.sqrt(directionX * directionX + directionY * directionY); // s += "\nDistance: " + distance; - - var forceX = force * directionX / distance; - var forceY = force * directionY / distance; - } else { - // s += "\nNodes do NOT overlap."; - // If there's no overlap, force is inversely proportional - // to squared distance - // Get clipping points for both nodes - var point1 = findClippingPoint(node1, directionX, directionY); - var point2 = findClippingPoint(node2, -1 * directionX, -1 * directionY); // Use clipping points to compute distance - - var distanceX = point2.x - point1.x; - var distanceY = point2.y - point1.y; - var distanceSqr = distanceX * distanceX + distanceY * distanceY; - var distance = Math.sqrt(distanceSqr); // s += "\nDistance: " + distance; - // Compute the module and components of the force vector - - var force = (node1.nodeRepulsion + node2.nodeRepulsion) / distanceSqr; - var forceX = force * distanceX / distance; - var forceY = force * distanceY / distance; - } // Apply force - - - if (!node1.isLocked) { - node1.offsetX -= forceX; - node1.offsetY -= forceY; - } - - if (!node2.isLocked) { - node2.offsetX += forceX; - node2.offsetY += forceY; - } // s += "\nForceX: " + forceX + " ForceY: " + forceY; - // logDebug(s); - - - return; -}; -/** - * @brief : Determines whether two nodes overlap or not - * @return : Amount of overlapping (0 => no overlap) - */ - - -var nodesOverlap = function nodesOverlap(node1, node2, dX, dY) { - if (dX > 0) { - var overlapX = node1.maxX - node2.minX; - } else { - var overlapX = node2.maxX - node1.minX; - } - - if (dY > 0) { - var overlapY = node1.maxY - node2.minY; - } else { - var overlapY = node2.maxY - node1.minY; - } - - if (overlapX >= 0 && overlapY >= 0) { - return Math.sqrt(overlapX * overlapX + overlapY * overlapY); - } else { - return 0; - } -}; -/** - * @brief : Finds the point in which an edge (direction dX, dY) intersects - * the rectangular bounding box of it's source/target node - */ - - -var findClippingPoint = function findClippingPoint(node, dX, dY) { - // Shorcuts - var X = node.positionX; - var Y = node.positionY; - var H = node.height || 1; - var W = node.width || 1; - var dirSlope = dY / dX; - var nodeSlope = H / W; // var s = 'Computing clipping point of node ' + node.id + - // " . Height: " + H + ", Width: " + W + - // "\nDirection " + dX + ", " + dY; - // - // Compute intersection - - var res = {}; // Case: Vertical direction (up) - - if (0 === dX && 0 < dY) { - res.x = X; // s += "\nUp direction"; - - res.y = Y + H / 2; - return res; - } // Case: Vertical direction (down) - - - if (0 === dX && 0 > dY) { - res.x = X; - res.y = Y + H / 2; // s += "\nDown direction"; - - return res; - } // Case: Intersects the right border - - - if (0 < dX && -1 * nodeSlope <= dirSlope && dirSlope <= nodeSlope) { - res.x = X + W / 2; - res.y = Y + W * dY / 2 / dX; // s += "\nRightborder"; - - return res; - } // Case: Intersects the left border - - - if (0 > dX && -1 * nodeSlope <= dirSlope && dirSlope <= nodeSlope) { - res.x = X - W / 2; - res.y = Y - W * dY / 2 / dX; // s += "\nLeftborder"; - - return res; - } // Case: Intersects the top border - - - if (0 < dY && (dirSlope <= -1 * nodeSlope || dirSlope >= nodeSlope)) { - res.x = X + H * dX / 2 / dY; - res.y = Y + H / 2; // s += "\nTop border"; - - return res; - } // Case: Intersects the bottom border - - - if (0 > dY && (dirSlope <= -1 * nodeSlope || dirSlope >= nodeSlope)) { - res.x = X - H * dX / 2 / dY; - res.y = Y - H / 2; // s += "\nBottom border"; - - return res; - } // s += "\nClipping point found at " + res.x + ", " + res.y; - // logDebug(s); - - - return res; -}; -/** - * @brief : Calculates all edge forces - */ - - -var calculateEdgeForces = function calculateEdgeForces(layoutInfo, options) { - // Iterate over all edges - for (var i = 0; i < layoutInfo.edgeSize; i++) { - // Get edge, source & target nodes - var edge = layoutInfo.layoutEdges[i]; - var sourceIx = layoutInfo.idToIndex[edge.sourceId]; - var source = layoutInfo.layoutNodes[sourceIx]; - var targetIx = layoutInfo.idToIndex[edge.targetId]; - var target = layoutInfo.layoutNodes[targetIx]; // Get direction of line connecting both node centers - - var directionX = target.positionX - source.positionX; - var directionY = target.positionY - source.positionY; // If both centers are the same, do nothing. - // A random force has already been applied as node repulsion - - if (0 === directionX && 0 === directionY) { - continue; - } // Get clipping points for both nodes - - - var point1 = findClippingPoint(source, directionX, directionY); - var point2 = findClippingPoint(target, -1 * directionX, -1 * directionY); - var lx = point2.x - point1.x; - var ly = point2.y - point1.y; - var l = Math.sqrt(lx * lx + ly * ly); - var force = Math.pow(edge.idealLength - l, 2) / edge.elasticity; - - if (0 !== l) { - var forceX = force * lx / l; - var forceY = force * ly / l; - } else { - var forceX = 0; - var forceY = 0; - } // Add this force to target and source nodes - - - if (!source.isLocked) { - source.offsetX += forceX; - source.offsetY += forceY; - } - - if (!target.isLocked) { - target.offsetX -= forceX; - target.offsetY -= forceY; - } // var s = 'Edge force between nodes ' + source.id + ' and ' + target.id; - // s += "\nDistance: " + l + " Force: (" + forceX + ", " + forceY + ")"; - // logDebug(s); - - } -}; -/** - * @brief : Computes gravity forces for all nodes - */ - - -var calculateGravityForces = function calculateGravityForces(layoutInfo, options) { - if (options.gravity === 0) { - return; - } - - var distThreshold = 1; // var s = 'calculateGravityForces'; - // logDebug(s); - - for (var i = 0; i < layoutInfo.graphSet.length; i++) { - var graph = layoutInfo.graphSet[i]; - var numNodes = graph.length; // s = "Set: " + graph.toString(); - // logDebug(s); - // Compute graph center - - if (0 === i) { - var centerX = layoutInfo.clientHeight / 2; - var centerY = layoutInfo.clientWidth / 2; - } else { - // Get Parent node for this graph, and use its position as center - var temp = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[0]]]; - var parent = layoutInfo.layoutNodes[layoutInfo.idToIndex[temp.parentId]]; - var centerX = parent.positionX; - var centerY = parent.positionY; - } // s = "Center found at: " + centerX + ", " + centerY; - // logDebug(s); - // Apply force to all nodes in graph - - - for (var j = 0; j < numNodes; j++) { - var node = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[j]]]; // s = "Node: " + node.id; - - if (node.isLocked) { - continue; - } - - var dx = centerX - node.positionX; - var dy = centerY - node.positionY; - var d = Math.sqrt(dx * dx + dy * dy); - - if (d > distThreshold) { - var fx = options.gravity * dx / d; - var fy = options.gravity * dy / d; - node.offsetX += fx; - node.offsetY += fy; // s += ": Applied force: " + fx + ", " + fy; - } // logDebug(s); - - } - } -}; -/** - * @brief : This function propagates the existing offsets from - * parent nodes to its descendents. - * @arg layoutInfo : layoutInfo Object - * @arg cy : cytoscape Object - * @arg options : Layout options - */ - - -var propagateForces = function propagateForces(layoutInfo, options) { - // Inline implementation of a queue, used for traversing the graph in BFS order - var queue = []; - var start = 0; // Points to the start the queue - - var end = -1; // Points to the end of the queue - // logDebug('propagateForces'); - // Start by visiting the nodes in the root graph - - queue.push.apply(queue, layoutInfo.graphSet[0]); - end += layoutInfo.graphSet[0].length; // Traverse the graph, level by level, - - while (start <= end) { - // Get the node to visit and remove it from queue - var nodeId = queue[start++]; - var nodeIndex = layoutInfo.idToIndex[nodeId]; - var node = layoutInfo.layoutNodes[nodeIndex]; - var children = node.children; // We only need to process the node if it's compound - - if (0 < children.length && !node.isLocked) { - var offX = node.offsetX; - var offY = node.offsetY; // var s = "Propagating offset from parent node : " + node.id + - // ". OffsetX: " + offX + ". OffsetY: " + offY; - // s += "\n Children: " + children.toString(); - // logDebug(s); - - for (var i = 0; i < children.length; i++) { - var childNode = layoutInfo.layoutNodes[layoutInfo.idToIndex[children[i]]]; // Propagate offset - - childNode.offsetX += offX; - childNode.offsetY += offY; // Add children to queue to be visited - - queue[++end] = children[i]; - } // Reset parent offsets - - - node.offsetX = 0; - node.offsetY = 0; - } - } -}; -/** - * @brief : Updates the layout model positions, based on - * the accumulated forces - */ - - -var updatePositions = function updatePositions(layoutInfo, options) { - // var s = 'Updating positions'; - // logDebug(s); - // Reset boundaries for compound nodes - for (var i = 0; i < layoutInfo.nodeSize; i++) { - var n = layoutInfo.layoutNodes[i]; - - if (0 < n.children.length) { - // logDebug("Resetting boundaries of compound node: " + n.id); - n.maxX = undefined; - n.minX = undefined; - n.maxY = undefined; - n.minY = undefined; - } - } - - for (var i = 0; i < layoutInfo.nodeSize; i++) { - var n = layoutInfo.layoutNodes[i]; - - if (0 < n.children.length || n.isLocked) { - // No need to set compound or locked node position - // logDebug("Skipping position update of node: " + n.id); - continue; - } // s = "Node: " + n.id + " Previous position: (" + - // n.positionX + ", " + n.positionY + ")."; - // Limit displacement in order to improve stability - - - var tempForce = limitForce(n.offsetX, n.offsetY, layoutInfo.temperature); - n.positionX += tempForce.x; - n.positionY += tempForce.y; - n.offsetX = 0; - n.offsetY = 0; - n.minX = n.positionX - n.width; - n.maxX = n.positionX + n.width; - n.minY = n.positionY - n.height; - n.maxY = n.positionY + n.height; // s += " New Position: (" + n.positionX + ", " + n.positionY + ")."; - // logDebug(s); - // Update ancestry boudaries - - updateAncestryBoundaries(n, layoutInfo); - } // Update size, position of compund nodes - - - for (var i = 0; i < layoutInfo.nodeSize; i++) { - var n = layoutInfo.layoutNodes[i]; - - if (0 < n.children.length && !n.isLocked) { - n.positionX = (n.maxX + n.minX) / 2; - n.positionY = (n.maxY + n.minY) / 2; - n.width = n.maxX - n.minX; - n.height = n.maxY - n.minY; // s = "Updating position, size of compound node " + n.id; - // s += "\nPositionX: " + n.positionX + ", PositionY: " + n.positionY; - // s += "\nWidth: " + n.width + ", Height: " + n.height; - // logDebug(s); - } - } -}; -/** - * @brief : Limits a force (forceX, forceY) to be not - * greater (in modulo) than max. - 8 Preserves force direction. - */ - - -var limitForce = function limitForce(forceX, forceY, max) { - // var s = "Limiting force: (" + forceX + ", " + forceY + "). Max: " + max; - var force = Math.sqrt(forceX * forceX + forceY * forceY); - - if (force > max) { - var res = { - x: max * forceX / force, - y: max * forceY / force - }; - } else { - var res = { - x: forceX, - y: forceY - }; - } // s += ".\nResult: (" + res.x + ", " + res.y + ")"; - // logDebug(s); - - - return res; -}; -/** - * @brief : Function used for keeping track of compound node - * sizes, since they should bound all their subnodes. - */ - - -var updateAncestryBoundaries = function updateAncestryBoundaries(node, layoutInfo) { - // var s = "Propagating new position/size of node " + node.id; - var parentId = node.parentId; - - if (null == parentId) { - // If there's no parent, we are done - // s += ". No parent node."; - // logDebug(s); - return; - } // Get Parent Node - - - var p = layoutInfo.layoutNodes[layoutInfo.idToIndex[parentId]]; - var flag = false; // MaxX - - if (null == p.maxX || node.maxX + p.padRight > p.maxX) { - p.maxX = node.maxX + p.padRight; - flag = true; // s += "\nNew maxX for parent node " + p.id + ": " + p.maxX; - } // MinX - - - if (null == p.minX || node.minX - p.padLeft < p.minX) { - p.minX = node.minX - p.padLeft; - flag = true; // s += "\nNew minX for parent node " + p.id + ": " + p.minX; - } // MaxY - - - if (null == p.maxY || node.maxY + p.padBottom > p.maxY) { - p.maxY = node.maxY + p.padBottom; - flag = true; // s += "\nNew maxY for parent node " + p.id + ": " + p.maxY; - } // MinY - - - if (null == p.minY || node.minY - p.padTop < p.minY) { - p.minY = node.minY - p.padTop; - flag = true; // s += "\nNew minY for parent node " + p.id + ": " + p.minY; - } // If updated boundaries, propagate changes upward - - - if (flag) { - // logDebug(s); - return updateAncestryBoundaries(p, layoutInfo); - } // s += ". No changes in boundaries/position of parent node " + p.id; - // logDebug(s); - - - return; -}; - -var separateComponents = function separateComponents(layoutInfo, options) { - var nodes = layoutInfo.layoutNodes; - var components = []; - - for (var i = 0; i < nodes.length; i++) { - var node = nodes[i]; - var cid = node.cmptId; - var component = components[cid] = components[cid] || []; - component.push(node); - } - - var totalA = 0; - - for (var i = 0; i < components.length; i++) { - var c = components[i]; - - if (!c) { - continue; - } - - c.x1 = Infinity; - c.x2 = -Infinity; - c.y1 = Infinity; - c.y2 = -Infinity; - - for (var j = 0; j < c.length; j++) { - var n = c[j]; - c.x1 = Math.min(c.x1, n.positionX - n.width / 2); - c.x2 = Math.max(c.x2, n.positionX + n.width / 2); - c.y1 = Math.min(c.y1, n.positionY - n.height / 2); - c.y2 = Math.max(c.y2, n.positionY + n.height / 2); - } - - c.w = c.x2 - c.x1; - c.h = c.y2 - c.y1; - totalA += c.w * c.h; - } - - components.sort(function (c1, c2) { - return c2.w * c2.h - c1.w * c1.h; - }); - var x = 0; - var y = 0; - var usedW = 0; - var rowH = 0; - var maxRowW = Math.sqrt(totalA) * layoutInfo.clientWidth / layoutInfo.clientHeight; - - for (var i = 0; i < components.length; i++) { - var c = components[i]; - - if (!c) { - continue; - } - - for (var j = 0; j < c.length; j++) { - var n = c[j]; - - if (!n.isLocked) { - n.positionX += x - c.x1; - n.positionY += y - c.y1; - } - } - - x += c.w + options.componentSpacing; - usedW += c.w + options.componentSpacing; - rowH = Math.max(rowH, c.h); - - if (usedW > maxRowW) { - y += rowH + options.componentSpacing; - x = 0; - usedW = 0; - rowH = 0; - } - } -}; - -var defaults$3 = { - fit: true, - // whether to fit the viewport to the graph - padding: 30, - // padding used on fit - boundingBox: undefined, - // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } - avoidOverlap: true, - // prevents node overlap, may overflow boundingBox if not enough space - avoidOverlapPadding: 10, - // extra spacing around nodes when avoidOverlap: true - nodeDimensionsIncludeLabels: false, - // Excludes the label when calculating node bounding boxes for the layout algorithm - spacingFactor: undefined, - // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up - condense: false, - // uses all available space on false, uses minimal space on true - rows: undefined, - // force num of rows in the grid - cols: undefined, - // force num of columns in the grid - position: function position(node) {}, - // returns { row, col } for element - sort: undefined, - // a sorting function to order the nodes; e.g. function(a, b){ return a.data('weight') - b.data('weight') } - animate: false, - // whether to transition the node positions - animationDuration: 500, - // duration of animation in ms if enabled - animationEasing: undefined, - // easing of animation if enabled - animateFilter: function animateFilter(node, i) { - return true; - }, - // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts - ready: undefined, - // callback on layoutready - stop: undefined, - // callback on layoutstop - transform: function transform(node, position) { - return position; - } // transform a given node position. Useful for changing flow direction in discrete layouts - -}; - -function GridLayout(options) { - this.options = extend({}, defaults$3, options); -} - -GridLayout.prototype.run = function () { - var params = this.options; - var options = params; - var cy = params.cy; - var eles = options.eles; - var nodes = eles.nodes().not(':parent'); - - if (options.sort) { - nodes = nodes.sort(options.sort); - } - - var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { - x1: 0, - y1: 0, - w: cy.width(), - h: cy.height() - }); - - if (bb.h === 0 || bb.w === 0) { - eles.nodes().layoutPositions(this, options, function (ele) { - return { - x: bb.x1, - y: bb.y1 - }; - }); - } else { - // width/height * splits^2 = cells where splits is number of times to split width - var cells = nodes.size(); - var splits = Math.sqrt(cells * bb.h / bb.w); - var rows = Math.round(splits); - var cols = Math.round(bb.w / bb.h * splits); - - var small = function small(val) { - if (val == null) { - return Math.min(rows, cols); - } else { - var min = Math.min(rows, cols); - - if (min == rows) { - rows = val; - } else { - cols = val; - } - } - }; - - var large = function large(val) { - if (val == null) { - return Math.max(rows, cols); - } else { - var max = Math.max(rows, cols); - - if (max == rows) { - rows = val; - } else { - cols = val; - } - } - }; - - var oRows = options.rows; - var oCols = options.cols != null ? options.cols : options.columns; // if rows or columns were set in options, use those values - - if (oRows != null && oCols != null) { - rows = oRows; - cols = oCols; - } else if (oRows != null && oCols == null) { - rows = oRows; - cols = Math.ceil(cells / rows); - } else if (oRows == null && oCols != null) { - cols = oCols; - rows = Math.ceil(cells / cols); - } // otherwise use the automatic values and adjust accordingly - // if rounding was up, see if we can reduce rows or columns - else if (cols * rows > cells) { - var sm = small(); - var lg = large(); // reducing the small side takes away the most cells, so try it first - - if ((sm - 1) * lg >= cells) { - small(sm - 1); - } else if ((lg - 1) * sm >= cells) { - large(lg - 1); - } - } else { - // if rounding was too low, add rows or columns - while (cols * rows < cells) { - var _sm = small(); - - var _lg = large(); // try to add to larger side first (adds less in multiplication) - - - if ((_lg + 1) * _sm >= cells) { - large(_lg + 1); - } else { - small(_sm + 1); - } - } - } - - var cellWidth = bb.w / cols; - var cellHeight = bb.h / rows; - - if (options.condense) { - cellWidth = 0; - cellHeight = 0; - } - - if (options.avoidOverlap) { - for (var i = 0; i < nodes.length; i++) { - var node = nodes[i]; - var pos = node._private.position; - - if (pos.x == null || pos.y == null) { - // for bb - pos.x = 0; - pos.y = 0; - } - - var nbb = node.layoutDimensions(options); - var p = options.avoidOverlapPadding; - var w = nbb.w + p; - var h = nbb.h + p; - cellWidth = Math.max(cellWidth, w); - cellHeight = Math.max(cellHeight, h); - } - } - - var cellUsed = {}; // e.g. 'c-0-2' => true - - var used = function used(row, col) { - return cellUsed['c-' + row + '-' + col] ? true : false; - }; - - var use = function use(row, col) { - cellUsed['c-' + row + '-' + col] = true; - }; // to keep track of current cell position - - - var row = 0; - var col = 0; - - var moveToNextCell = function moveToNextCell() { - col++; - - if (col >= cols) { - col = 0; - row++; - } - }; // get a cache of all the manual positions - - - var id2manPos = {}; - - for (var _i = 0; _i < nodes.length; _i++) { - var _node = nodes[_i]; - var rcPos = options.position(_node); - - if (rcPos && (rcPos.row !== undefined || rcPos.col !== undefined)) { - // must have at least row or col def'd - var _pos = { - row: rcPos.row, - col: rcPos.col - }; - - if (_pos.col === undefined) { - // find unused col - _pos.col = 0; - - while (used(_pos.row, _pos.col)) { - _pos.col++; - } - } else if (_pos.row === undefined) { - // find unused row - _pos.row = 0; - - while (used(_pos.row, _pos.col)) { - _pos.row++; - } - } - - id2manPos[_node.id()] = _pos; - use(_pos.row, _pos.col); - } - } - - var getPos = function getPos(element, i) { - var x, y; - - if (element.locked() || element.isParent()) { - return false; - } // see if we have a manual position set - - - var rcPos = id2manPos[element.id()]; - - if (rcPos) { - x = rcPos.col * cellWidth + cellWidth / 2 + bb.x1; - y = rcPos.row * cellHeight + cellHeight / 2 + bb.y1; - } else { - // otherwise set automatically - while (used(row, col)) { - moveToNextCell(); - } - - x = col * cellWidth + cellWidth / 2 + bb.x1; - y = row * cellHeight + cellHeight / 2 + bb.y1; - use(row, col); - moveToNextCell(); - } - - return { - x: x, - y: y - }; - }; - - nodes.layoutPositions(this, options, getPos); - } - - return this; // chaining -}; - -var defaults$2 = { - ready: function ready() {}, - // on layoutready - stop: function stop() {} // on layoutstop - -}; // constructor -// options : object containing layout options - -function NullLayout(options) { - this.options = extend({}, defaults$2, options); -} // runs the layout - - -NullLayout.prototype.run = function () { - var options = this.options; - var eles = options.eles; // elements to consider in the layout - - var layout = this; // cy is automatically populated for us in the constructor - // (disable eslint for next line as this serves as example layout code to external developers) - // eslint-disable-next-line no-unused-vars - - options.cy; - layout.emit('layoutstart'); // puts all nodes at (0, 0) - // n.b. most layouts would use layoutPositions(), instead of positions() and manual events - - eles.nodes().positions(function () { - return { - x: 0, - y: 0 - }; - }); // trigger layoutready when each node has had its position set at least once - - layout.one('layoutready', options.ready); - layout.emit('layoutready'); // trigger layoutstop when the layout stops (e.g. finishes) - - layout.one('layoutstop', options.stop); - layout.emit('layoutstop'); - return this; // chaining -}; // called on continuous layouts to stop them before they finish - - -NullLayout.prototype.stop = function () { - return this; // chaining -}; - -var defaults$1 = { - positions: undefined, - // map of (node id) => (position obj); or function(node){ return somPos; } - zoom: undefined, - // the zoom level to set (prob want fit = false if set) - pan: undefined, - // the pan level to set (prob want fit = false if set) - fit: true, - // whether to fit to viewport - padding: 30, - // padding on fit - animate: false, - // whether to transition the node positions - animationDuration: 500, - // duration of animation in ms if enabled - animationEasing: undefined, - // easing of animation if enabled - animateFilter: function animateFilter(node, i) { - return true; - }, - // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts - ready: undefined, - // callback on layoutready - stop: undefined, - // callback on layoutstop - transform: function transform(node, position) { - return position; - } // transform a given node position. Useful for changing flow direction in discrete layouts - -}; - -function PresetLayout(options) { - this.options = extend({}, defaults$1, options); -} - -PresetLayout.prototype.run = function () { - var options = this.options; - var eles = options.eles; - var nodes = eles.nodes(); - var posIsFn = fn$6(options.positions); - - function getPosition(node) { - if (options.positions == null) { - return copyPosition(node.position()); - } - - if (posIsFn) { - return options.positions(node); - } - - var pos = options.positions[node._private.data.id]; - - if (pos == null) { - return null; - } - - return pos; - } - - nodes.layoutPositions(this, options, function (node, i) { - var position = getPosition(node); - - if (node.locked() || position == null) { - return false; - } - - return position; - }); - return this; // chaining -}; - -var defaults = { - fit: true, - // whether to fit to viewport - padding: 30, - // fit padding - boundingBox: undefined, - // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } - animate: false, - // whether to transition the node positions - animationDuration: 500, - // duration of animation in ms if enabled - animationEasing: undefined, - // easing of animation if enabled - animateFilter: function animateFilter(node, i) { - return true; - }, - // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts - ready: undefined, - // callback on layoutready - stop: undefined, - // callback on layoutstop - transform: function transform(node, position) { - return position; - } // transform a given node position. Useful for changing flow direction in discrete layouts - -}; - -function RandomLayout(options) { - this.options = extend({}, defaults, options); -} - -RandomLayout.prototype.run = function () { - var options = this.options; - var cy = options.cy; - var eles = options.eles; - var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { - x1: 0, - y1: 0, - w: cy.width(), - h: cy.height() - }); - - var getPos = function getPos(node, i) { - return { - x: bb.x1 + Math.round(Math.random() * bb.w), - y: bb.y1 + Math.round(Math.random() * bb.h) - }; - }; - - eles.nodes().layoutPositions(this, options, getPos); - return this; // chaining -}; - -var layout = [{ - name: 'breadthfirst', - impl: BreadthFirstLayout -}, { - name: 'circle', - impl: CircleLayout -}, { - name: 'concentric', - impl: ConcentricLayout -}, { - name: 'cose', - impl: CoseLayout -}, { - name: 'grid', - impl: GridLayout -}, { - name: 'null', - impl: NullLayout -}, { - name: 'preset', - impl: PresetLayout -}, { - name: 'random', - impl: RandomLayout -}]; - -function NullRenderer(options) { - this.options = options; - this.notifications = 0; // for testing -} - -var noop = function noop() {}; - -var throwImgErr = function throwImgErr() { - throw new Error('A headless instance can not render images'); -}; - -NullRenderer.prototype = { - recalculateRenderedStyle: noop, - notify: function notify() { - this.notifications++; - }, - init: noop, - isHeadless: function isHeadless() { - return true; - }, - png: throwImgErr, - jpg: throwImgErr -}; - -var BRp$f = {}; -BRp$f.arrowShapeWidth = 0.3; - -BRp$f.registerArrowShapes = function () { - var arrowShapes = this.arrowShapes = {}; - var renderer = this; // Contract for arrow shapes: - // 0, 0 is arrow tip - // (0, 1) is direction towards node - // (1, 0) is right - // - // functional api: - // collide: check x, y in shape - // roughCollide: called before collide, no false negatives - // draw: draw - // spacing: dist(arrowTip, nodeBoundary) - // gap: dist(edgeTip, nodeBoundary), edgeTip may != arrowTip - - var bbCollide = function bbCollide(x, y, size, angle, translation, edgeWidth, padding) { - var x1 = translation.x - size / 2 - padding; - var x2 = translation.x + size / 2 + padding; - var y1 = translation.y - size / 2 - padding; - var y2 = translation.y + size / 2 + padding; - var inside = x1 <= x && x <= x2 && y1 <= y && y <= y2; - return inside; - }; - - var transform = function transform(x, y, size, angle, translation) { - var xRotated = x * Math.cos(angle) - y * Math.sin(angle); - var yRotated = x * Math.sin(angle) + y * Math.cos(angle); - var xScaled = xRotated * size; - var yScaled = yRotated * size; - var xTranslated = xScaled + translation.x; - var yTranslated = yScaled + translation.y; - return { - x: xTranslated, - y: yTranslated - }; - }; - - var transformPoints = function transformPoints(pts, size, angle, translation) { - var retPts = []; - - for (var i = 0; i < pts.length; i += 2) { - var x = pts[i]; - var y = pts[i + 1]; - retPts.push(transform(x, y, size, angle, translation)); - } - - return retPts; - }; - - var pointsToArr = function pointsToArr(pts) { - var ret = []; - - for (var i = 0; i < pts.length; i++) { - var p = pts[i]; - ret.push(p.x, p.y); - } - - return ret; - }; - - var standardGap = function standardGap(edge) { - return edge.pstyle('width').pfValue * edge.pstyle('arrow-scale').pfValue * 2; - }; - - var defineArrowShape = function defineArrowShape(name, defn) { - if (string(defn)) { - defn = arrowShapes[defn]; - } - - arrowShapes[name] = extend({ - name: name, - points: [-0.15, -0.3, 0.15, -0.3, 0.15, 0.3, -0.15, 0.3], - collide: function collide(x, y, size, angle, translation, padding) { - var points = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation)); - var inside = pointInsidePolygonPoints(x, y, points); - return inside; - }, - roughCollide: bbCollide, - draw: function draw(context, size, angle, translation) { - var points = transformPoints(this.points, size, angle, translation); - renderer.arrowShapeImpl('polygon')(context, points); - }, - spacing: function spacing(edge) { - return 0; - }, - gap: standardGap - }, defn); - }; - - defineArrowShape('none', { - collide: falsify, - roughCollide: falsify, - draw: noop$1, - spacing: zeroify, - gap: zeroify - }); - defineArrowShape('triangle', { - points: [-0.15, -0.3, 0, 0, 0.15, -0.3] - }); - defineArrowShape('arrow', 'triangle'); - defineArrowShape('triangle-backcurve', { - points: arrowShapes['triangle'].points, - controlPoint: [0, -0.15], - roughCollide: bbCollide, - draw: function draw(context, size, angle, translation, edgeWidth) { - var ptsTrans = transformPoints(this.points, size, angle, translation); - var ctrlPt = this.controlPoint; - var ctrlPtTrans = transform(ctrlPt[0], ctrlPt[1], size, angle, translation); - renderer.arrowShapeImpl(this.name)(context, ptsTrans, ctrlPtTrans); - }, - gap: function gap(edge) { - return standardGap(edge) * 0.8; - } - }); - defineArrowShape('triangle-tee', { - points: [0, 0, 0.15, -0.3, -0.15, -0.3, 0, 0], - pointsTee: [-0.15, -0.4, -0.15, -0.5, 0.15, -0.5, 0.15, -0.4], - collide: function collide(x, y, size, angle, translation, edgeWidth, padding) { - var triPts = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation)); - var teePts = pointsToArr(transformPoints(this.pointsTee, size + 2 * padding, angle, translation)); - var inside = pointInsidePolygonPoints(x, y, triPts) || pointInsidePolygonPoints(x, y, teePts); - return inside; - }, - draw: function draw(context, size, angle, translation, edgeWidth) { - var triPts = transformPoints(this.points, size, angle, translation); - var teePts = transformPoints(this.pointsTee, size, angle, translation); - renderer.arrowShapeImpl(this.name)(context, triPts, teePts); - } - }); - defineArrowShape('circle-triangle', { - radius: 0.15, - pointsTr: [0, -0.15, 0.15, -0.45, -0.15, -0.45, 0, -0.15], - collide: function collide(x, y, size, angle, translation, edgeWidth, padding) { - var t = translation; - var circleInside = Math.pow(t.x - x, 2) + Math.pow(t.y - y, 2) <= Math.pow((size + 2 * padding) * this.radius, 2); - var triPts = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation)); - return pointInsidePolygonPoints(x, y, triPts) || circleInside; - }, - draw: function draw(context, size, angle, translation, edgeWidth) { - var triPts = transformPoints(this.pointsTr, size, angle, translation); - renderer.arrowShapeImpl(this.name)(context, triPts, translation.x, translation.y, this.radius * size); - }, - spacing: function spacing(edge) { - return renderer.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.radius; - } - }); - defineArrowShape('triangle-cross', { - points: [0, 0, 0.15, -0.3, -0.15, -0.3, 0, 0], - baseCrossLinePts: [-0.15, -0.4, // first half of the rectangle - -0.15, -0.4, 0.15, -0.4, // second half of the rectangle - 0.15, -0.4], - crossLinePts: function crossLinePts(size, edgeWidth) { - // shift points so that the distance between the cross points matches edge width - var p = this.baseCrossLinePts.slice(); - var shiftFactor = edgeWidth / size; - var y0 = 3; - var y1 = 5; - p[y0] = p[y0] - shiftFactor; - p[y1] = p[y1] - shiftFactor; - return p; - }, - collide: function collide(x, y, size, angle, translation, edgeWidth, padding) { - var triPts = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation)); - var teePts = pointsToArr(transformPoints(this.crossLinePts(size, edgeWidth), size + 2 * padding, angle, translation)); - var inside = pointInsidePolygonPoints(x, y, triPts) || pointInsidePolygonPoints(x, y, teePts); - return inside; - }, - draw: function draw(context, size, angle, translation, edgeWidth) { - var triPts = transformPoints(this.points, size, angle, translation); - var crossLinePts = transformPoints(this.crossLinePts(size, edgeWidth), size, angle, translation); - renderer.arrowShapeImpl(this.name)(context, triPts, crossLinePts); - } - }); - defineArrowShape('vee', { - points: [-0.15, -0.3, 0, 0, 0.15, -0.3, 0, -0.15], - gap: function gap(edge) { - return standardGap(edge) * 0.525; - } - }); - defineArrowShape('circle', { - radius: 0.15, - collide: function collide(x, y, size, angle, translation, edgeWidth, padding) { - var t = translation; - var inside = Math.pow(t.x - x, 2) + Math.pow(t.y - y, 2) <= Math.pow((size + 2 * padding) * this.radius, 2); - return inside; - }, - draw: function draw(context, size, angle, translation, edgeWidth) { - renderer.arrowShapeImpl(this.name)(context, translation.x, translation.y, this.radius * size); - }, - spacing: function spacing(edge) { - return renderer.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.radius; - } - }); - defineArrowShape('tee', { - points: [-0.15, 0, -0.15, -0.1, 0.15, -0.1, 0.15, 0], - spacing: function spacing(edge) { - return 1; - }, - gap: function gap(edge) { - return 1; - } - }); - defineArrowShape('square', { - points: [-0.15, 0.00, 0.15, 0.00, 0.15, -0.3, -0.15, -0.3] - }); - defineArrowShape('diamond', { - points: [-0.15, -0.15, 0, -0.3, 0.15, -0.15, 0, 0], - gap: function gap(edge) { - return edge.pstyle('width').pfValue * edge.pstyle('arrow-scale').value; - } - }); - defineArrowShape('chevron', { - points: [0, 0, -0.15, -0.15, -0.1, -0.2, 0, -0.1, 0.1, -0.2, 0.15, -0.15], - gap: function gap(edge) { - return 0.95 * edge.pstyle('width').pfValue * edge.pstyle('arrow-scale').value; - } - }); -}; - -var BRp$e = {}; // Project mouse - -BRp$e.projectIntoViewport = function (clientX, clientY) { - var cy = this.cy; - var offsets = this.findContainerClientCoords(); - var offsetLeft = offsets[0]; - var offsetTop = offsets[1]; - var scale = offsets[4]; - var pan = cy.pan(); - var zoom = cy.zoom(); - var x = ((clientX - offsetLeft) / scale - pan.x) / zoom; - var y = ((clientY - offsetTop) / scale - pan.y) / zoom; - return [x, y]; -}; - -BRp$e.findContainerClientCoords = function () { - if (this.containerBB) { - return this.containerBB; - } - - var container = this.container; - var rect = container.getBoundingClientRect(); - var style = window$1.getComputedStyle(container); - - var styleValue = function styleValue(name) { - return parseFloat(style.getPropertyValue(name)); - }; - - var padding = { - left: styleValue('padding-left'), - right: styleValue('padding-right'), - top: styleValue('padding-top'), - bottom: styleValue('padding-bottom') - }; - var border = { - left: styleValue('border-left-width'), - right: styleValue('border-right-width'), - top: styleValue('border-top-width'), - bottom: styleValue('border-bottom-width') - }; - var clientWidth = container.clientWidth; - var clientHeight = container.clientHeight; - var paddingHor = padding.left + padding.right; - var paddingVer = padding.top + padding.bottom; - var borderHor = border.left + border.right; - var scale = rect.width / (clientWidth + borderHor); - var unscaledW = clientWidth - paddingHor; - var unscaledH = clientHeight - paddingVer; - var left = rect.left + padding.left + border.left; - var top = rect.top + padding.top + border.top; - return this.containerBB = [left, top, unscaledW, unscaledH, scale]; -}; - -BRp$e.invalidateContainerClientCoordsCache = function () { - this.containerBB = null; -}; - -BRp$e.findNearestElement = function (x, y, interactiveElementsOnly, isTouch) { - return this.findNearestElements(x, y, interactiveElementsOnly, isTouch)[0]; -}; - -BRp$e.findNearestElements = function (x, y, interactiveElementsOnly, isTouch) { - var self = this; - var r = this; - var eles = r.getCachedZSortedEles(); - var near = []; // 1 node max, 1 edge max - - var zoom = r.cy.zoom(); - var hasCompounds = r.cy.hasCompoundNodes(); - var edgeThreshold = (isTouch ? 24 : 8) / zoom; - var nodeThreshold = (isTouch ? 8 : 2) / zoom; - var labelThreshold = (isTouch ? 8 : 2) / zoom; - var minSqDist = Infinity; - var nearEdge; - var nearNode; - - if (interactiveElementsOnly) { - eles = eles.interactive; - } - - function addEle(ele, sqDist) { - if (ele.isNode()) { - if (nearNode) { - return; // can't replace node - } else { - nearNode = ele; - near.push(ele); - } - } - - if (ele.isEdge() && (sqDist == null || sqDist < minSqDist)) { - if (nearEdge) { - // then replace existing edge - // can replace only if same z-index - if (nearEdge.pstyle('z-compound-depth').value === ele.pstyle('z-compound-depth').value && nearEdge.pstyle('z-compound-depth').value === ele.pstyle('z-compound-depth').value) { - for (var i = 0; i < near.length; i++) { - if (near[i].isEdge()) { - near[i] = ele; - nearEdge = ele; - minSqDist = sqDist != null ? sqDist : minSqDist; - break; - } - } - } - } else { - near.push(ele); - nearEdge = ele; - minSqDist = sqDist != null ? sqDist : minSqDist; - } - } - } - - function checkNode(node) { - var width = node.outerWidth() + 2 * nodeThreshold; - var height = node.outerHeight() + 2 * nodeThreshold; - var hw = width / 2; - var hh = height / 2; - var pos = node.position(); - - if (pos.x - hw <= x && x <= pos.x + hw // bb check x - && pos.y - hh <= y && y <= pos.y + hh // bb check y - ) { - var shape = r.nodeShapes[self.getNodeShape(node)]; - - if (shape.checkPoint(x, y, 0, width, height, pos.x, pos.y)) { - addEle(node, 0); - return true; - } - } - } - - function checkEdge(edge) { - var _p = edge._private; - var rs = _p.rscratch; - var styleWidth = edge.pstyle('width').pfValue; - var scale = edge.pstyle('arrow-scale').value; - var width = styleWidth / 2 + edgeThreshold; // more like a distance radius from centre - - var widthSq = width * width; - var width2 = width * 2; - var src = _p.source; - var tgt = _p.target; - var sqDist; - - if (rs.edgeType === 'segments' || rs.edgeType === 'straight' || rs.edgeType === 'haystack') { - var pts = rs.allpts; - - for (var i = 0; i + 3 < pts.length; i += 2) { - if (inLineVicinity(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3], width2) && widthSq > (sqDist = sqdistToFiniteLine(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3]))) { - addEle(edge, sqDist); - return true; - } - } - } else if (rs.edgeType === 'bezier' || rs.edgeType === 'multibezier' || rs.edgeType === 'self' || rs.edgeType === 'compound') { - var pts = rs.allpts; - - for (var i = 0; i + 5 < rs.allpts.length; i += 4) { - if (inBezierVicinity(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3], pts[i + 4], pts[i + 5], width2) && widthSq > (sqDist = sqdistToQuadraticBezier(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3], pts[i + 4], pts[i + 5]))) { - addEle(edge, sqDist); - return true; - } - } - } // if we're close to the edge but didn't hit it, maybe we hit its arrows - - - var src = src || _p.source; - var tgt = tgt || _p.target; - var arSize = self.getArrowWidth(styleWidth, scale); - var arrows = [{ - name: 'source', - x: rs.arrowStartX, - y: rs.arrowStartY, - angle: rs.srcArrowAngle - }, { - name: 'target', - x: rs.arrowEndX, - y: rs.arrowEndY, - angle: rs.tgtArrowAngle - }, { - name: 'mid-source', - x: rs.midX, - y: rs.midY, - angle: rs.midsrcArrowAngle - }, { - name: 'mid-target', - x: rs.midX, - y: rs.midY, - angle: rs.midtgtArrowAngle - }]; - - for (var i = 0; i < arrows.length; i++) { - var ar = arrows[i]; - var shape = r.arrowShapes[edge.pstyle(ar.name + '-arrow-shape').value]; - var edgeWidth = edge.pstyle('width').pfValue; - - if (shape.roughCollide(x, y, arSize, ar.angle, { - x: ar.x, - y: ar.y - }, edgeWidth, edgeThreshold) && shape.collide(x, y, arSize, ar.angle, { - x: ar.x, - y: ar.y - }, edgeWidth, edgeThreshold)) { - addEle(edge); - return true; - } - } // for compound graphs, hitting edge may actually want a connected node instead (b/c edge may have greater z-index precedence) - - - if (hasCompounds && near.length > 0) { - checkNode(src); - checkNode(tgt); - } - } - - function preprop(obj, name, pre) { - return getPrefixedProperty(obj, name, pre); - } - - function checkLabel(ele, prefix) { - var _p = ele._private; - var th = labelThreshold; - var prefixDash; - - if (prefix) { - prefixDash = prefix + '-'; - } else { - prefixDash = ''; - } - - ele.boundingBox(); - var bb = _p.labelBounds[prefix || 'main']; - var text = ele.pstyle(prefixDash + 'label').value; - var eventsEnabled = ele.pstyle('text-events').strValue === 'yes'; - - if (!eventsEnabled || !text) { - return; - } - - var lx = preprop(_p.rscratch, 'labelX', prefix); - var ly = preprop(_p.rscratch, 'labelY', prefix); - var theta = preprop(_p.rscratch, 'labelAngle', prefix); - var ox = ele.pstyle(prefixDash + 'text-margin-x').pfValue; - var oy = ele.pstyle(prefixDash + 'text-margin-y').pfValue; - var lx1 = bb.x1 - th - ox; // (-ox, -oy) as bb already includes margin - - var lx2 = bb.x2 + th - ox; // and rotation is about (lx, ly) - - var ly1 = bb.y1 - th - oy; - var ly2 = bb.y2 + th - oy; - - if (theta) { - var cos = Math.cos(theta); - var sin = Math.sin(theta); - - var rotate = function rotate(x, y) { - x = x - lx; - y = y - ly; - return { - x: x * cos - y * sin + lx, - y: x * sin + y * cos + ly - }; - }; - - var px1y1 = rotate(lx1, ly1); - var px1y2 = rotate(lx1, ly2); - var px2y1 = rotate(lx2, ly1); - var px2y2 = rotate(lx2, ly2); - var points = [// with the margin added after the rotation is applied - px1y1.x + ox, px1y1.y + oy, px2y1.x + ox, px2y1.y + oy, px2y2.x + ox, px2y2.y + oy, px1y2.x + ox, px1y2.y + oy]; - - if (pointInsidePolygonPoints(x, y, points)) { - addEle(ele); - return true; - } - } else { - // do a cheaper bb check - if (inBoundingBox(bb, x, y)) { - addEle(ele); - return true; - } - } - } - - for (var i = eles.length - 1; i >= 0; i--) { - // reverse order for precedence - var ele = eles[i]; - - if (ele.isNode()) { - checkNode(ele) || checkLabel(ele); - } else { - // then edge - checkEdge(ele) || checkLabel(ele) || checkLabel(ele, 'source') || checkLabel(ele, 'target'); - } - } - - return near; -}; // 'Give me everything from this box' - - -BRp$e.getAllInBox = function (x1, y1, x2, y2) { - var eles = this.getCachedZSortedEles().interactive; - var box = []; - var x1c = Math.min(x1, x2); - var x2c = Math.max(x1, x2); - var y1c = Math.min(y1, y2); - var y2c = Math.max(y1, y2); - x1 = x1c; - x2 = x2c; - y1 = y1c; - y2 = y2c; - var boxBb = makeBoundingBox({ - x1: x1, - y1: y1, - x2: x2, - y2: y2 - }); - - for (var e = 0; e < eles.length; e++) { - var ele = eles[e]; - - if (ele.isNode()) { - var node = ele; - var nodeBb = node.boundingBox({ - includeNodes: true, - includeEdges: false, - includeLabels: false - }); - - if (boundingBoxesIntersect(boxBb, nodeBb) && !boundingBoxInBoundingBox(nodeBb, boxBb)) { - box.push(node); - } - } else { - var edge = ele; - var _p = edge._private; - var rs = _p.rscratch; - - if (rs.startX != null && rs.startY != null && !inBoundingBox(boxBb, rs.startX, rs.startY)) { - continue; - } - - if (rs.endX != null && rs.endY != null && !inBoundingBox(boxBb, rs.endX, rs.endY)) { - continue; - } - - if (rs.edgeType === 'bezier' || rs.edgeType === 'multibezier' || rs.edgeType === 'self' || rs.edgeType === 'compound' || rs.edgeType === 'segments' || rs.edgeType === 'haystack') { - var pts = _p.rstyle.bezierPts || _p.rstyle.linePts || _p.rstyle.haystackPts; - var allInside = true; - - for (var i = 0; i < pts.length; i++) { - if (!pointInBoundingBox(boxBb, pts[i])) { - allInside = false; - break; - } - } - - if (allInside) { - box.push(edge); - } - } else if (rs.edgeType === 'haystack' || rs.edgeType === 'straight') { - box.push(edge); - } - } - } - - return box; -}; - -var BRp$d = {}; - -BRp$d.calculateArrowAngles = function (edge) { - var rs = edge._private.rscratch; - var isHaystack = rs.edgeType === 'haystack'; - var isBezier = rs.edgeType === 'bezier'; - var isMultibezier = rs.edgeType === 'multibezier'; - var isSegments = rs.edgeType === 'segments'; - var isCompound = rs.edgeType === 'compound'; - var isSelf = rs.edgeType === 'self'; // Displacement gives direction for arrowhead orientation - - var dispX, dispY; - var startX, startY, endX, endY, midX, midY; - - if (isHaystack) { - startX = rs.haystackPts[0]; - startY = rs.haystackPts[1]; - endX = rs.haystackPts[2]; - endY = rs.haystackPts[3]; - } else { - startX = rs.arrowStartX; - startY = rs.arrowStartY; - endX = rs.arrowEndX; - endY = rs.arrowEndY; - } - - midX = rs.midX; - midY = rs.midY; // source - // - - if (isSegments) { - dispX = startX - rs.segpts[0]; - dispY = startY - rs.segpts[1]; - } else if (isMultibezier || isCompound || isSelf || isBezier) { - var pts = rs.allpts; - var bX = qbezierAt(pts[0], pts[2], pts[4], 0.1); - var bY = qbezierAt(pts[1], pts[3], pts[5], 0.1); - dispX = startX - bX; - dispY = startY - bY; - } else { - dispX = startX - midX; - dispY = startY - midY; - } - - rs.srcArrowAngle = getAngleFromDisp(dispX, dispY); // mid target - // - - var midX = rs.midX; - var midY = rs.midY; - - if (isHaystack) { - midX = (startX + endX) / 2; - midY = (startY + endY) / 2; - } - - dispX = endX - startX; - dispY = endY - startY; - - if (isSegments) { - var pts = rs.allpts; - - if (pts.length / 2 % 2 === 0) { - var i2 = pts.length / 2; - var i1 = i2 - 2; - dispX = pts[i2] - pts[i1]; - dispY = pts[i2 + 1] - pts[i1 + 1]; - } else { - var i2 = pts.length / 2 - 1; - var i1 = i2 - 2; - var i3 = i2 + 2; - dispX = pts[i2] - pts[i1]; - dispY = pts[i2 + 1] - pts[i1 + 1]; - } - } else if (isMultibezier || isCompound || isSelf) { - var pts = rs.allpts; - var cpts = rs.ctrlpts; - var bp0x, bp0y; - var bp1x, bp1y; - - if (cpts.length / 2 % 2 === 0) { - var p0 = pts.length / 2 - 1; // startpt - - var ic = p0 + 2; - var p1 = ic + 2; - bp0x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.0); - bp0y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.0); - bp1x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.0001); - bp1y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.0001); - } else { - var ic = pts.length / 2 - 1; // ctrpt - - var p0 = ic - 2; // startpt - - var p1 = ic + 2; // endpt - - bp0x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.4999); - bp0y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.4999); - bp1x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.5); - bp1y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.5); - } - - dispX = bp1x - bp0x; - dispY = bp1y - bp0y; - } - - rs.midtgtArrowAngle = getAngleFromDisp(dispX, dispY); - rs.midDispX = dispX; - rs.midDispY = dispY; // mid source - // - - dispX *= -1; - dispY *= -1; - - if (isSegments) { - var pts = rs.allpts; - - if (pts.length / 2 % 2 === 0) ; else { - var i2 = pts.length / 2 - 1; - var i3 = i2 + 2; - dispX = -(pts[i3] - pts[i2]); - dispY = -(pts[i3 + 1] - pts[i2 + 1]); - } - } - - rs.midsrcArrowAngle = getAngleFromDisp(dispX, dispY); // target - // - - if (isSegments) { - dispX = endX - rs.segpts[rs.segpts.length - 2]; - dispY = endY - rs.segpts[rs.segpts.length - 1]; - } else if (isMultibezier || isCompound || isSelf || isBezier) { - var pts = rs.allpts; - var l = pts.length; - var bX = qbezierAt(pts[l - 6], pts[l - 4], pts[l - 2], 0.9); - var bY = qbezierAt(pts[l - 5], pts[l - 3], pts[l - 1], 0.9); - dispX = endX - bX; - dispY = endY - bY; - } else { - dispX = endX - midX; - dispY = endY - midY; - } - - rs.tgtArrowAngle = getAngleFromDisp(dispX, dispY); -}; - -BRp$d.getArrowWidth = BRp$d.getArrowHeight = function (edgeWidth, scale) { - var cache = this.arrowWidthCache = this.arrowWidthCache || {}; - var cachedVal = cache[edgeWidth + ', ' + scale]; - - if (cachedVal) { - return cachedVal; - } - - cachedVal = Math.max(Math.pow(edgeWidth * 13.37, 0.9), 29) * scale; - cache[edgeWidth + ', ' + scale] = cachedVal; - return cachedVal; -}; - -var BRp$c = {}; - -BRp$c.findHaystackPoints = function (edges) { - for (var i = 0; i < edges.length; i++) { - var edge = edges[i]; - var _p = edge._private; - var rs = _p.rscratch; - - if (!rs.haystack) { - var angle = Math.random() * 2 * Math.PI; - rs.source = { - x: Math.cos(angle), - y: Math.sin(angle) - }; - angle = Math.random() * 2 * Math.PI; - rs.target = { - x: Math.cos(angle), - y: Math.sin(angle) - }; - } - - var src = _p.source; - var tgt = _p.target; - var srcPos = src.position(); - var tgtPos = tgt.position(); - var srcW = src.width(); - var tgtW = tgt.width(); - var srcH = src.height(); - var tgtH = tgt.height(); - var radius = edge.pstyle('haystack-radius').value; - var halfRadius = radius / 2; // b/c have to half width/height - - rs.haystackPts = rs.allpts = [rs.source.x * srcW * halfRadius + srcPos.x, rs.source.y * srcH * halfRadius + srcPos.y, rs.target.x * tgtW * halfRadius + tgtPos.x, rs.target.y * tgtH * halfRadius + tgtPos.y]; - rs.midX = (rs.allpts[0] + rs.allpts[2]) / 2; - rs.midY = (rs.allpts[1] + rs.allpts[3]) / 2; // always override as haystack in case set to different type previously - - rs.edgeType = 'haystack'; - rs.haystack = true; - this.storeEdgeProjections(edge); - this.calculateArrowAngles(edge); - this.recalculateEdgeLabelProjections(edge); - this.calculateLabelAngles(edge); - } -}; - -BRp$c.findSegmentsPoints = function (edge, pairInfo) { - // Segments (multiple straight lines) - var rs = edge._private.rscratch; - var posPts = pairInfo.posPts, - intersectionPts = pairInfo.intersectionPts, - vectorNormInverse = pairInfo.vectorNormInverse; - var edgeDistances = edge.pstyle('edge-distances').value; - var segmentWs = edge.pstyle('segment-weights'); - var segmentDs = edge.pstyle('segment-distances'); - var segmentsN = Math.min(segmentWs.pfValue.length, segmentDs.pfValue.length); - rs.edgeType = 'segments'; - rs.segpts = []; - - for (var s = 0; s < segmentsN; s++) { - var w = segmentWs.pfValue[s]; - var d = segmentDs.pfValue[s]; - var w1 = 1 - w; - var w2 = w; - var midptPts = edgeDistances === 'node-position' ? posPts : intersectionPts; - var adjustedMidpt = { - x: midptPts.x1 * w1 + midptPts.x2 * w2, - y: midptPts.y1 * w1 + midptPts.y2 * w2 - }; - rs.segpts.push(adjustedMidpt.x + vectorNormInverse.x * d, adjustedMidpt.y + vectorNormInverse.y * d); - } -}; - -BRp$c.findLoopPoints = function (edge, pairInfo, i, edgeIsUnbundled) { - // Self-edge - var rs = edge._private.rscratch; - var dirCounts = pairInfo.dirCounts, - srcPos = pairInfo.srcPos; - var ctrlptDists = edge.pstyle('control-point-distances'); - var ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[0] : undefined; - var loopDir = edge.pstyle('loop-direction').pfValue; - var loopSwp = edge.pstyle('loop-sweep').pfValue; - var stepSize = edge.pstyle('control-point-step-size').pfValue; - rs.edgeType = 'self'; - var j = i; - var loopDist = stepSize; - - if (edgeIsUnbundled) { - j = 0; - loopDist = ctrlptDist; - } - - var loopAngle = loopDir - Math.PI / 2; - var outAngle = loopAngle - loopSwp / 2; - var inAngle = loopAngle + loopSwp / 2; // increase by step size for overlapping loops, keyed on direction and sweep values - - var dc = String(loopDir + '_' + loopSwp); - j = dirCounts[dc] === undefined ? dirCounts[dc] = 0 : ++dirCounts[dc]; - rs.ctrlpts = [srcPos.x + Math.cos(outAngle) * 1.4 * loopDist * (j / 3 + 1), srcPos.y + Math.sin(outAngle) * 1.4 * loopDist * (j / 3 + 1), srcPos.x + Math.cos(inAngle) * 1.4 * loopDist * (j / 3 + 1), srcPos.y + Math.sin(inAngle) * 1.4 * loopDist * (j / 3 + 1)]; -}; - -BRp$c.findCompoundLoopPoints = function (edge, pairInfo, i, edgeIsUnbundled) { - // Compound edge - var rs = edge._private.rscratch; - rs.edgeType = 'compound'; - var srcPos = pairInfo.srcPos, - tgtPos = pairInfo.tgtPos, - srcW = pairInfo.srcW, - srcH = pairInfo.srcH, - tgtW = pairInfo.tgtW, - tgtH = pairInfo.tgtH; - var stepSize = edge.pstyle('control-point-step-size').pfValue; - var ctrlptDists = edge.pstyle('control-point-distances'); - var ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[0] : undefined; - var j = i; - var loopDist = stepSize; - - if (edgeIsUnbundled) { - j = 0; - loopDist = ctrlptDist; - } - - var loopW = 50; - var loopaPos = { - x: srcPos.x - srcW / 2, - y: srcPos.y - srcH / 2 - }; - var loopbPos = { - x: tgtPos.x - tgtW / 2, - y: tgtPos.y - tgtH / 2 - }; - var loopPos = { - x: Math.min(loopaPos.x, loopbPos.x), - y: Math.min(loopaPos.y, loopbPos.y) - }; // avoids cases with impossible beziers - - var minCompoundStretch = 0.5; - var compoundStretchA = Math.max(minCompoundStretch, Math.log(srcW * 0.01)); - var compoundStretchB = Math.max(minCompoundStretch, Math.log(tgtW * 0.01)); - rs.ctrlpts = [loopPos.x, loopPos.y - (1 + Math.pow(loopW, 1.12) / 100) * loopDist * (j / 3 + 1) * compoundStretchA, loopPos.x - (1 + Math.pow(loopW, 1.12) / 100) * loopDist * (j / 3 + 1) * compoundStretchB, loopPos.y]; -}; - -BRp$c.findStraightEdgePoints = function (edge) { - // Straight edge within bundle - edge._private.rscratch.edgeType = 'straight'; -}; - -BRp$c.findBezierPoints = function (edge, pairInfo, i, edgeIsUnbundled, edgeIsSwapped) { - var rs = edge._private.rscratch; - var vectorNormInverse = pairInfo.vectorNormInverse, - posPts = pairInfo.posPts, - intersectionPts = pairInfo.intersectionPts; - var edgeDistances = edge.pstyle('edge-distances').value; - var stepSize = edge.pstyle('control-point-step-size').pfValue; - var ctrlptDists = edge.pstyle('control-point-distances'); - var ctrlptWs = edge.pstyle('control-point-weights'); - var bezierN = ctrlptDists && ctrlptWs ? Math.min(ctrlptDists.value.length, ctrlptWs.value.length) : 1; - var ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[0] : undefined; - var ctrlptWeight = ctrlptWs.value[0]; // (Multi)bezier - - var multi = edgeIsUnbundled; - rs.edgeType = multi ? 'multibezier' : 'bezier'; - rs.ctrlpts = []; - - for (var b = 0; b < bezierN; b++) { - var normctrlptDist = (0.5 - pairInfo.eles.length / 2 + i) * stepSize * (edgeIsSwapped ? -1 : 1); - var manctrlptDist = void 0; - var sign = signum(normctrlptDist); - - if (multi) { - ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[b] : stepSize; // fall back on step size - - ctrlptWeight = ctrlptWs.value[b]; - } - - if (edgeIsUnbundled) { - // multi or single unbundled - manctrlptDist = ctrlptDist; - } else { - manctrlptDist = ctrlptDist !== undefined ? sign * ctrlptDist : undefined; - } - - var distanceFromMidpoint = manctrlptDist !== undefined ? manctrlptDist : normctrlptDist; - var w1 = 1 - ctrlptWeight; - var w2 = ctrlptWeight; - var midptPts = edgeDistances === 'node-position' ? posPts : intersectionPts; - var adjustedMidpt = { - x: midptPts.x1 * w1 + midptPts.x2 * w2, - y: midptPts.y1 * w1 + midptPts.y2 * w2 - }; - rs.ctrlpts.push(adjustedMidpt.x + vectorNormInverse.x * distanceFromMidpoint, adjustedMidpt.y + vectorNormInverse.y * distanceFromMidpoint); - } -}; - -BRp$c.findTaxiPoints = function (edge, pairInfo) { - // Taxicab geometry with two turns maximum - var rs = edge._private.rscratch; - rs.edgeType = 'segments'; - var VERTICAL = 'vertical'; - var HORIZONTAL = 'horizontal'; - var LEFTWARD = 'leftward'; - var RIGHTWARD = 'rightward'; - var DOWNWARD = 'downward'; - var UPWARD = 'upward'; - var AUTO = 'auto'; - var posPts = pairInfo.posPts, - srcW = pairInfo.srcW, - srcH = pairInfo.srcH, - tgtW = pairInfo.tgtW, - tgtH = pairInfo.tgtH; - var edgeDistances = edge.pstyle('edge-distances').value; - var dIncludesNodeBody = edgeDistances !== 'node-position'; - var taxiDir = edge.pstyle('taxi-direction').value; - var rawTaxiDir = taxiDir; // unprocessed value - - var taxiTurn = edge.pstyle('taxi-turn'); - var turnIsPercent = taxiTurn.units === '%'; - var taxiTurnPfVal = taxiTurn.pfValue; - var turnIsNegative = taxiTurnPfVal < 0; // i.e. from target side - - var minD = edge.pstyle('taxi-turn-min-distance').pfValue; - var dw = dIncludesNodeBody ? (srcW + tgtW) / 2 : 0; - var dh = dIncludesNodeBody ? (srcH + tgtH) / 2 : 0; - var pdx = posPts.x2 - posPts.x1; - var pdy = posPts.y2 - posPts.y1; // take away the effective w/h from the magnitude of the delta value - - var subDWH = function subDWH(dxy, dwh) { - if (dxy > 0) { - return Math.max(dxy - dwh, 0); - } else { - return Math.min(dxy + dwh, 0); - } - }; - - var dx = subDWH(pdx, dw); - var dy = subDWH(pdy, dh); - var isExplicitDir = false; - - if (rawTaxiDir === AUTO) { - taxiDir = Math.abs(dx) > Math.abs(dy) ? HORIZONTAL : VERTICAL; - } else if (rawTaxiDir === UPWARD || rawTaxiDir === DOWNWARD) { - taxiDir = VERTICAL; - isExplicitDir = true; - } else if (rawTaxiDir === LEFTWARD || rawTaxiDir === RIGHTWARD) { - taxiDir = HORIZONTAL; - isExplicitDir = true; - } - - var isVert = taxiDir === VERTICAL; - var l = isVert ? dy : dx; - var pl = isVert ? pdy : pdx; - var sgnL = signum(pl); - var forcedDir = false; - - if (!(isExplicitDir && (turnIsPercent || turnIsNegative)) // forcing in this case would cause weird growing in the opposite direction - && (rawTaxiDir === DOWNWARD && pl < 0 || rawTaxiDir === UPWARD && pl > 0 || rawTaxiDir === LEFTWARD && pl > 0 || rawTaxiDir === RIGHTWARD && pl < 0)) { - sgnL *= -1; - l = sgnL * Math.abs(l); - forcedDir = true; - } - - var d; - - if (turnIsPercent) { - var p = taxiTurnPfVal < 0 ? 1 + taxiTurnPfVal : taxiTurnPfVal; - d = p * l; - } else { - var k = taxiTurnPfVal < 0 ? l : 0; - d = k + taxiTurnPfVal * sgnL; - } - - var getIsTooClose = function getIsTooClose(d) { - return Math.abs(d) < minD || Math.abs(d) >= Math.abs(l); - }; - - var isTooCloseSrc = getIsTooClose(d); - var isTooCloseTgt = getIsTooClose(Math.abs(l) - Math.abs(d)); - var isTooClose = isTooCloseSrc || isTooCloseTgt; - - if (isTooClose && !forcedDir) { - // non-ideal routing - if (isVert) { - // vertical fallbacks - var lShapeInsideSrc = Math.abs(pl) <= srcH / 2; - var lShapeInsideTgt = Math.abs(pdx) <= tgtW / 2; - - if (lShapeInsideSrc) { - // horizontal Z-shape (direction not respected) - var x = (posPts.x1 + posPts.x2) / 2; - var y1 = posPts.y1, - y2 = posPts.y2; - rs.segpts = [x, y1, x, y2]; - } else if (lShapeInsideTgt) { - // vertical Z-shape (distance not respected) - var y = (posPts.y1 + posPts.y2) / 2; - var x1 = posPts.x1, - x2 = posPts.x2; - rs.segpts = [x1, y, x2, y]; - } else { - // L-shape fallback (turn distance not respected, but works well with tree siblings) - rs.segpts = [posPts.x1, posPts.y2]; - } - } else { - // horizontal fallbacks - var _lShapeInsideSrc = Math.abs(pl) <= srcW / 2; - - var _lShapeInsideTgt = Math.abs(pdy) <= tgtH / 2; - - if (_lShapeInsideSrc) { - // vertical Z-shape (direction not respected) - var _y = (posPts.y1 + posPts.y2) / 2; - - var _x = posPts.x1, - _x2 = posPts.x2; - rs.segpts = [_x, _y, _x2, _y]; - } else if (_lShapeInsideTgt) { - // horizontal Z-shape (turn distance not respected) - var _x3 = (posPts.x1 + posPts.x2) / 2; - - var _y2 = posPts.y1, - _y3 = posPts.y2; - rs.segpts = [_x3, _y2, _x3, _y3]; - } else { - // L-shape (turn distance not respected, but works well for tree siblings) - rs.segpts = [posPts.x2, posPts.y1]; - } - } - } else { - // ideal routing - if (isVert) { - var _y4 = posPts.y1 + d + (dIncludesNodeBody ? srcH / 2 * sgnL : 0); - - var _x4 = posPts.x1, - _x5 = posPts.x2; - rs.segpts = [_x4, _y4, _x5, _y4]; - } else { - // horizontal - var _x6 = posPts.x1 + d + (dIncludesNodeBody ? srcW / 2 * sgnL : 0); - - var _y5 = posPts.y1, - _y6 = posPts.y2; - rs.segpts = [_x6, _y5, _x6, _y6]; - } - } -}; - -BRp$c.tryToCorrectInvalidPoints = function (edge, pairInfo) { - var rs = edge._private.rscratch; // can only correct beziers for now... - - if (rs.edgeType === 'bezier') { - var srcPos = pairInfo.srcPos, - tgtPos = pairInfo.tgtPos, - srcW = pairInfo.srcW, - srcH = pairInfo.srcH, - tgtW = pairInfo.tgtW, - tgtH = pairInfo.tgtH, - srcShape = pairInfo.srcShape, - tgtShape = pairInfo.tgtShape; - var badStart = !number$1(rs.startX) || !number$1(rs.startY); - var badAStart = !number$1(rs.arrowStartX) || !number$1(rs.arrowStartY); - var badEnd = !number$1(rs.endX) || !number$1(rs.endY); - var badAEnd = !number$1(rs.arrowEndX) || !number$1(rs.arrowEndY); - var minCpADistFactor = 3; - var arrowW = this.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.arrowShapeWidth; - var minCpADist = minCpADistFactor * arrowW; - var startACpDist = dist({ - x: rs.ctrlpts[0], - y: rs.ctrlpts[1] - }, { - x: rs.startX, - y: rs.startY - }); - var closeStartACp = startACpDist < minCpADist; - var endACpDist = dist({ - x: rs.ctrlpts[0], - y: rs.ctrlpts[1] - }, { - x: rs.endX, - y: rs.endY - }); - var closeEndACp = endACpDist < minCpADist; - var overlapping = false; - - if (badStart || badAStart || closeStartACp) { - overlapping = true; // project control point along line from src centre to outside the src shape - // (otherwise intersection will yield nothing) - - var cpD = { - // delta - x: rs.ctrlpts[0] - srcPos.x, - y: rs.ctrlpts[1] - srcPos.y - }; - var cpL = Math.sqrt(cpD.x * cpD.x + cpD.y * cpD.y); // length of line - - var cpM = { - // normalised delta - x: cpD.x / cpL, - y: cpD.y / cpL - }; - var radius = Math.max(srcW, srcH); - var cpProj = { - // *2 radius guarantees outside shape - x: rs.ctrlpts[0] + cpM.x * 2 * radius, - y: rs.ctrlpts[1] + cpM.y * 2 * radius - }; - var srcCtrlPtIntn = srcShape.intersectLine(srcPos.x, srcPos.y, srcW, srcH, cpProj.x, cpProj.y, 0); - - if (closeStartACp) { - rs.ctrlpts[0] = rs.ctrlpts[0] + cpM.x * (minCpADist - startACpDist); - rs.ctrlpts[1] = rs.ctrlpts[1] + cpM.y * (minCpADist - startACpDist); - } else { - rs.ctrlpts[0] = srcCtrlPtIntn[0] + cpM.x * minCpADist; - rs.ctrlpts[1] = srcCtrlPtIntn[1] + cpM.y * minCpADist; - } - } - - if (badEnd || badAEnd || closeEndACp) { - overlapping = true; // project control point along line from tgt centre to outside the tgt shape - // (otherwise intersection will yield nothing) - - var _cpD = { - // delta - x: rs.ctrlpts[0] - tgtPos.x, - y: rs.ctrlpts[1] - tgtPos.y - }; - - var _cpL = Math.sqrt(_cpD.x * _cpD.x + _cpD.y * _cpD.y); // length of line - - - var _cpM = { - // normalised delta - x: _cpD.x / _cpL, - y: _cpD.y / _cpL - }; - - var _radius = Math.max(srcW, srcH); - - var _cpProj = { - // *2 radius guarantees outside shape - x: rs.ctrlpts[0] + _cpM.x * 2 * _radius, - y: rs.ctrlpts[1] + _cpM.y * 2 * _radius - }; - var tgtCtrlPtIntn = tgtShape.intersectLine(tgtPos.x, tgtPos.y, tgtW, tgtH, _cpProj.x, _cpProj.y, 0); - - if (closeEndACp) { - rs.ctrlpts[0] = rs.ctrlpts[0] + _cpM.x * (minCpADist - endACpDist); - rs.ctrlpts[1] = rs.ctrlpts[1] + _cpM.y * (minCpADist - endACpDist); - } else { - rs.ctrlpts[0] = tgtCtrlPtIntn[0] + _cpM.x * minCpADist; - rs.ctrlpts[1] = tgtCtrlPtIntn[1] + _cpM.y * minCpADist; - } - } - - if (overlapping) { - // recalc endpts - this.findEndpoints(edge); - } - } -}; - -BRp$c.storeAllpts = function (edge) { - var rs = edge._private.rscratch; - - if (rs.edgeType === 'multibezier' || rs.edgeType === 'bezier' || rs.edgeType === 'self' || rs.edgeType === 'compound') { - rs.allpts = []; - rs.allpts.push(rs.startX, rs.startY); - - for (var b = 0; b + 1 < rs.ctrlpts.length; b += 2) { - // ctrl pt itself - rs.allpts.push(rs.ctrlpts[b], rs.ctrlpts[b + 1]); // the midpt between ctrlpts as intermediate destination pts - - if (b + 3 < rs.ctrlpts.length) { - rs.allpts.push((rs.ctrlpts[b] + rs.ctrlpts[b + 2]) / 2, (rs.ctrlpts[b + 1] + rs.ctrlpts[b + 3]) / 2); - } - } - - rs.allpts.push(rs.endX, rs.endY); - var m, mt; - - if (rs.ctrlpts.length / 2 % 2 === 0) { - m = rs.allpts.length / 2 - 1; - rs.midX = rs.allpts[m]; - rs.midY = rs.allpts[m + 1]; - } else { - m = rs.allpts.length / 2 - 3; - mt = 0.5; - rs.midX = qbezierAt(rs.allpts[m], rs.allpts[m + 2], rs.allpts[m + 4], mt); - rs.midY = qbezierAt(rs.allpts[m + 1], rs.allpts[m + 3], rs.allpts[m + 5], mt); - } - } else if (rs.edgeType === 'straight') { - // need to calc these after endpts - rs.allpts = [rs.startX, rs.startY, rs.endX, rs.endY]; // default midpt for labels etc - - rs.midX = (rs.startX + rs.endX + rs.arrowStartX + rs.arrowEndX) / 4; - rs.midY = (rs.startY + rs.endY + rs.arrowStartY + rs.arrowEndY) / 4; - } else if (rs.edgeType === 'segments') { - rs.allpts = []; - rs.allpts.push(rs.startX, rs.startY); - rs.allpts.push.apply(rs.allpts, rs.segpts); - rs.allpts.push(rs.endX, rs.endY); - - if (rs.segpts.length % 4 === 0) { - var i2 = rs.segpts.length / 2; - var i1 = i2 - 2; - rs.midX = (rs.segpts[i1] + rs.segpts[i2]) / 2; - rs.midY = (rs.segpts[i1 + 1] + rs.segpts[i2 + 1]) / 2; - } else { - var _i = rs.segpts.length / 2 - 1; - - rs.midX = rs.segpts[_i]; - rs.midY = rs.segpts[_i + 1]; - } - } -}; - -BRp$c.checkForInvalidEdgeWarning = function (edge) { - var rs = edge[0]._private.rscratch; - - if (rs.nodesOverlap || number$1(rs.startX) && number$1(rs.startY) && number$1(rs.endX) && number$1(rs.endY)) { - rs.loggedErr = false; - } else { - if (!rs.loggedErr) { - rs.loggedErr = true; - warn('Edge `' + edge.id() + '` has invalid endpoints and so it is impossible to draw. Adjust your edge style (e.g. control points) accordingly or use an alternative edge type. This is expected behaviour when the source node and the target node overlap.'); - } - } -}; - -BRp$c.findEdgeControlPoints = function (edges) { - var _this = this; - - if (!edges || edges.length === 0) { - return; - } - - var r = this; - var cy = r.cy; - var hasCompounds = cy.hasCompoundNodes(); - var hashTable = { - map: new Map$1(), - get: function get(pairId) { - var map2 = this.map.get(pairId[0]); - - if (map2 != null) { - return map2.get(pairId[1]); - } else { - return null; - } - }, - set: function set(pairId, val) { - var map2 = this.map.get(pairId[0]); - - if (map2 == null) { - map2 = new Map$1(); - this.map.set(pairId[0], map2); - } - - map2.set(pairId[1], val); - } - }; - var pairIds = []; - var haystackEdges = []; // create a table of edge (src, tgt) => list of edges between them - - for (var i = 0; i < edges.length; i++) { - var edge = edges[i]; - var _p = edge._private; - var curveStyle = edge.pstyle('curve-style').value; // ignore edges who are not to be displayed - // they shouldn't take up space - - if (edge.removed() || !edge.takesUpSpace()) { - continue; - } - - if (curveStyle === 'haystack') { - haystackEdges.push(edge); - continue; - } - - var edgeIsUnbundled = curveStyle === 'unbundled-bezier' || curveStyle === 'segments' || curveStyle === 'straight' || curveStyle === 'straight-triangle' || curveStyle === 'taxi'; - var edgeIsBezier = curveStyle === 'unbundled-bezier' || curveStyle === 'bezier'; - var src = _p.source; - var tgt = _p.target; - var srcIndex = src.poolIndex(); - var tgtIndex = tgt.poolIndex(); - var pairId = [srcIndex, tgtIndex].sort(); - var tableEntry = hashTable.get(pairId); - - if (tableEntry == null) { - tableEntry = { - eles: [] - }; - hashTable.set(pairId, tableEntry); - pairIds.push(pairId); - } - - tableEntry.eles.push(edge); - - if (edgeIsUnbundled) { - tableEntry.hasUnbundled = true; - } - - if (edgeIsBezier) { - tableEntry.hasBezier = true; - } - } // for each pair (src, tgt), create the ctrl pts - // Nested for loop is OK; total number of iterations for both loops = edgeCount - - - var _loop = function _loop(p) { - var pairId = pairIds[p]; - var pairInfo = hashTable.get(pairId); - var swappedpairInfo = void 0; - - if (!pairInfo.hasUnbundled) { - var pllEdges = pairInfo.eles[0].parallelEdges().filter(function (e) { - return e.isBundledBezier(); - }); - clearArray(pairInfo.eles); - pllEdges.forEach(function (edge) { - return pairInfo.eles.push(edge); - }); // for each pair id, the edges should be sorted by index - - pairInfo.eles.sort(function (edge1, edge2) { - return edge1.poolIndex() - edge2.poolIndex(); - }); - } - - var firstEdge = pairInfo.eles[0]; - var src = firstEdge.source(); - var tgt = firstEdge.target(); // make sure src/tgt distinction is consistent w.r.t. pairId - - if (src.poolIndex() > tgt.poolIndex()) { - var temp = src; - src = tgt; - tgt = temp; - } - - var srcPos = pairInfo.srcPos = src.position(); - var tgtPos = pairInfo.tgtPos = tgt.position(); - var srcW = pairInfo.srcW = src.outerWidth(); - var srcH = pairInfo.srcH = src.outerHeight(); - var tgtW = pairInfo.tgtW = tgt.outerWidth(); - var tgtH = pairInfo.tgtH = tgt.outerHeight(); - - var srcShape = pairInfo.srcShape = r.nodeShapes[_this.getNodeShape(src)]; - - var tgtShape = pairInfo.tgtShape = r.nodeShapes[_this.getNodeShape(tgt)]; - - pairInfo.dirCounts = { - 'north': 0, - 'west': 0, - 'south': 0, - 'east': 0, - 'northwest': 0, - 'southwest': 0, - 'northeast': 0, - 'southeast': 0 - }; - - for (var _i2 = 0; _i2 < pairInfo.eles.length; _i2++) { - var _edge = pairInfo.eles[_i2]; - var rs = _edge[0]._private.rscratch; - - var _curveStyle = _edge.pstyle('curve-style').value; - - var _edgeIsUnbundled = _curveStyle === 'unbundled-bezier' || _curveStyle === 'segments' || _curveStyle === 'taxi'; // whether the normalised pair order is the reverse of the edge's src-tgt order - - - var edgeIsSwapped = !src.same(_edge.source()); - - if (!pairInfo.calculatedIntersection && src !== tgt && (pairInfo.hasBezier || pairInfo.hasUnbundled)) { - pairInfo.calculatedIntersection = true; // pt outside src shape to calc distance/displacement from src to tgt - - var srcOutside = srcShape.intersectLine(srcPos.x, srcPos.y, srcW, srcH, tgtPos.x, tgtPos.y, 0); - var srcIntn = pairInfo.srcIntn = srcOutside; // pt outside tgt shape to calc distance/displacement from src to tgt - - var tgtOutside = tgtShape.intersectLine(tgtPos.x, tgtPos.y, tgtW, tgtH, srcPos.x, srcPos.y, 0); - var tgtIntn = pairInfo.tgtIntn = tgtOutside; - var intersectionPts = pairInfo.intersectionPts = { - x1: srcOutside[0], - x2: tgtOutside[0], - y1: srcOutside[1], - y2: tgtOutside[1] - }; - var posPts = pairInfo.posPts = { - x1: srcPos.x, - x2: tgtPos.x, - y1: srcPos.y, - y2: tgtPos.y - }; - var dy = tgtOutside[1] - srcOutside[1]; - var dx = tgtOutside[0] - srcOutside[0]; - var l = Math.sqrt(dx * dx + dy * dy); - var vector = pairInfo.vector = { - x: dx, - y: dy - }; - var vectorNorm = pairInfo.vectorNorm = { - x: vector.x / l, - y: vector.y / l - }; - var vectorNormInverse = { - x: -vectorNorm.y, - y: vectorNorm.x - }; // if node shapes overlap, then no ctrl pts to draw - - pairInfo.nodesOverlap = !number$1(l) || tgtShape.checkPoint(srcOutside[0], srcOutside[1], 0, tgtW, tgtH, tgtPos.x, tgtPos.y) || srcShape.checkPoint(tgtOutside[0], tgtOutside[1], 0, srcW, srcH, srcPos.x, srcPos.y); - pairInfo.vectorNormInverse = vectorNormInverse; - swappedpairInfo = { - nodesOverlap: pairInfo.nodesOverlap, - dirCounts: pairInfo.dirCounts, - calculatedIntersection: true, - hasBezier: pairInfo.hasBezier, - hasUnbundled: pairInfo.hasUnbundled, - eles: pairInfo.eles, - srcPos: tgtPos, - tgtPos: srcPos, - srcW: tgtW, - srcH: tgtH, - tgtW: srcW, - tgtH: srcH, - srcIntn: tgtIntn, - tgtIntn: srcIntn, - srcShape: tgtShape, - tgtShape: srcShape, - posPts: { - x1: posPts.x2, - y1: posPts.y2, - x2: posPts.x1, - y2: posPts.y1 - }, - intersectionPts: { - x1: intersectionPts.x2, - y1: intersectionPts.y2, - x2: intersectionPts.x1, - y2: intersectionPts.y1 - }, - vector: { - x: -vector.x, - y: -vector.y - }, - vectorNorm: { - x: -vectorNorm.x, - y: -vectorNorm.y - }, - vectorNormInverse: { - x: -vectorNormInverse.x, - y: -vectorNormInverse.y - } - }; - } - - var passedPairInfo = edgeIsSwapped ? swappedpairInfo : pairInfo; - rs.nodesOverlap = passedPairInfo.nodesOverlap; - rs.srcIntn = passedPairInfo.srcIntn; - rs.tgtIntn = passedPairInfo.tgtIntn; - - if (hasCompounds && (src.isParent() || src.isChild() || tgt.isParent() || tgt.isChild()) && (src.parents().anySame(tgt) || tgt.parents().anySame(src) || src.same(tgt) && src.isParent())) { - _this.findCompoundLoopPoints(_edge, passedPairInfo, _i2, _edgeIsUnbundled); - } else if (src === tgt) { - _this.findLoopPoints(_edge, passedPairInfo, _i2, _edgeIsUnbundled); - } else if (_curveStyle === 'segments') { - _this.findSegmentsPoints(_edge, passedPairInfo); - } else if (_curveStyle === 'taxi') { - _this.findTaxiPoints(_edge, passedPairInfo); - } else if (_curveStyle === 'straight' || !_edgeIsUnbundled && pairInfo.eles.length % 2 === 1 && _i2 === Math.floor(pairInfo.eles.length / 2)) { - _this.findStraightEdgePoints(_edge); - } else { - _this.findBezierPoints(_edge, passedPairInfo, _i2, _edgeIsUnbundled, edgeIsSwapped); - } - - _this.findEndpoints(_edge); - - _this.tryToCorrectInvalidPoints(_edge, passedPairInfo); - - _this.checkForInvalidEdgeWarning(_edge); - - _this.storeAllpts(_edge); - - _this.storeEdgeProjections(_edge); - - _this.calculateArrowAngles(_edge); - - _this.recalculateEdgeLabelProjections(_edge); - - _this.calculateLabelAngles(_edge); - } // for pair edges - - }; - - for (var p = 0; p < pairIds.length; p++) { - _loop(p); - } // for pair ids - // haystacks avoid the expense of pairInfo stuff (intersections etc.) - - - this.findHaystackPoints(haystackEdges); -}; - -function getPts(pts) { - var retPts = []; - - if (pts == null) { - return; - } - - for (var i = 0; i < pts.length; i += 2) { - var x = pts[i]; - var y = pts[i + 1]; - retPts.push({ - x: x, - y: y - }); - } - - return retPts; -} - -BRp$c.getSegmentPoints = function (edge) { - var rs = edge[0]._private.rscratch; - var type = rs.edgeType; - - if (type === 'segments') { - this.recalculateRenderedStyle(edge); - return getPts(rs.segpts); - } -}; - -BRp$c.getControlPoints = function (edge) { - var rs = edge[0]._private.rscratch; - var type = rs.edgeType; - - if (type === 'bezier' || type === 'multibezier' || type === 'self' || type === 'compound') { - this.recalculateRenderedStyle(edge); - return getPts(rs.ctrlpts); - } -}; - -BRp$c.getEdgeMidpoint = function (edge) { - var rs = edge[0]._private.rscratch; - this.recalculateRenderedStyle(edge); - return { - x: rs.midX, - y: rs.midY - }; -}; - -var BRp$b = {}; - -BRp$b.manualEndptToPx = function (node, prop) { - var r = this; - var npos = node.position(); - var w = node.outerWidth(); - var h = node.outerHeight(); - - if (prop.value.length === 2) { - var p = [prop.pfValue[0], prop.pfValue[1]]; - - if (prop.units[0] === '%') { - p[0] = p[0] * w; - } - - if (prop.units[1] === '%') { - p[1] = p[1] * h; - } - - p[0] += npos.x; - p[1] += npos.y; - return p; - } else { - var angle = prop.pfValue[0]; - angle = -Math.PI / 2 + angle; // start at 12 o'clock - - var l = 2 * Math.max(w, h); - var _p = [npos.x + Math.cos(angle) * l, npos.y + Math.sin(angle) * l]; - return r.nodeShapes[this.getNodeShape(node)].intersectLine(npos.x, npos.y, w, h, _p[0], _p[1], 0); - } -}; - -BRp$b.findEndpoints = function (edge) { - var r = this; - var intersect; - var source = edge.source()[0]; - var target = edge.target()[0]; - var srcPos = source.position(); - var tgtPos = target.position(); - var tgtArShape = edge.pstyle('target-arrow-shape').value; - var srcArShape = edge.pstyle('source-arrow-shape').value; - var tgtDist = edge.pstyle('target-distance-from-node').pfValue; - var srcDist = edge.pstyle('source-distance-from-node').pfValue; - var curveStyle = edge.pstyle('curve-style').value; - var rs = edge._private.rscratch; - var et = rs.edgeType; - var taxi = curveStyle === 'taxi'; - var self = et === 'self' || et === 'compound'; - var bezier = et === 'bezier' || et === 'multibezier' || self; - var multi = et !== 'bezier'; - var lines = et === 'straight' || et === 'segments'; - var segments = et === 'segments'; - var hasEndpts = bezier || multi || lines; - var overrideEndpts = self || taxi; - var srcManEndpt = edge.pstyle('source-endpoint'); - var srcManEndptVal = overrideEndpts ? 'outside-to-node' : srcManEndpt.value; - var tgtManEndpt = edge.pstyle('target-endpoint'); - var tgtManEndptVal = overrideEndpts ? 'outside-to-node' : tgtManEndpt.value; - rs.srcManEndpt = srcManEndpt; - rs.tgtManEndpt = tgtManEndpt; - var p1; // last known point of edge on target side - - var p2; // last known point of edge on source side - - var p1_i; // point to intersect with target shape - - var p2_i; // point to intersect with source shape - - if (bezier) { - var cpStart = [rs.ctrlpts[0], rs.ctrlpts[1]]; - var cpEnd = multi ? [rs.ctrlpts[rs.ctrlpts.length - 2], rs.ctrlpts[rs.ctrlpts.length - 1]] : cpStart; - p1 = cpEnd; - p2 = cpStart; - } else if (lines) { - var srcArrowFromPt = !segments ? [tgtPos.x, tgtPos.y] : rs.segpts.slice(0, 2); - var tgtArrowFromPt = !segments ? [srcPos.x, srcPos.y] : rs.segpts.slice(rs.segpts.length - 2); - p1 = tgtArrowFromPt; - p2 = srcArrowFromPt; - } - - if (tgtManEndptVal === 'inside-to-node') { - intersect = [tgtPos.x, tgtPos.y]; - } else if (tgtManEndpt.units) { - intersect = this.manualEndptToPx(target, tgtManEndpt); - } else if (tgtManEndptVal === 'outside-to-line') { - intersect = rs.tgtIntn; // use cached value from ctrlpt calc - } else { - if (tgtManEndptVal === 'outside-to-node' || tgtManEndptVal === 'outside-to-node-or-label') { - p1_i = p1; - } else if (tgtManEndptVal === 'outside-to-line' || tgtManEndptVal === 'outside-to-line-or-label') { - p1_i = [srcPos.x, srcPos.y]; - } - - intersect = r.nodeShapes[this.getNodeShape(target)].intersectLine(tgtPos.x, tgtPos.y, target.outerWidth(), target.outerHeight(), p1_i[0], p1_i[1], 0); - - if (tgtManEndptVal === 'outside-to-node-or-label' || tgtManEndptVal === 'outside-to-line-or-label') { - var trs = target._private.rscratch; - var lw = trs.labelWidth; - var lh = trs.labelHeight; - var lx = trs.labelX; - var ly = trs.labelY; - var lw2 = lw / 2; - var lh2 = lh / 2; - var va = target.pstyle('text-valign').value; - - if (va === 'top') { - ly -= lh2; - } else if (va === 'bottom') { - ly += lh2; - } - - var ha = target.pstyle('text-halign').value; - - if (ha === 'left') { - lx -= lw2; - } else if (ha === 'right') { - lx += lw2; - } - - var labelIntersect = polygonIntersectLine(p1_i[0], p1_i[1], [lx - lw2, ly - lh2, lx + lw2, ly - lh2, lx + lw2, ly + lh2, lx - lw2, ly + lh2], tgtPos.x, tgtPos.y); - - if (labelIntersect.length > 0) { - var refPt = srcPos; - var intSqdist = sqdist(refPt, array2point(intersect)); - var labIntSqdist = sqdist(refPt, array2point(labelIntersect)); - var minSqDist = intSqdist; - - if (labIntSqdist < intSqdist) { - intersect = labelIntersect; - minSqDist = labIntSqdist; - } - - if (labelIntersect.length > 2) { - var labInt2SqDist = sqdist(refPt, { - x: labelIntersect[2], - y: labelIntersect[3] - }); - - if (labInt2SqDist < minSqDist) { - intersect = [labelIntersect[2], labelIntersect[3]]; - } - } - } - } - } - - var arrowEnd = shortenIntersection(intersect, p1, r.arrowShapes[tgtArShape].spacing(edge) + tgtDist); - var edgeEnd = shortenIntersection(intersect, p1, r.arrowShapes[tgtArShape].gap(edge) + tgtDist); - rs.endX = edgeEnd[0]; - rs.endY = edgeEnd[1]; - rs.arrowEndX = arrowEnd[0]; - rs.arrowEndY = arrowEnd[1]; - - if (srcManEndptVal === 'inside-to-node') { - intersect = [srcPos.x, srcPos.y]; - } else if (srcManEndpt.units) { - intersect = this.manualEndptToPx(source, srcManEndpt); - } else if (srcManEndptVal === 'outside-to-line') { - intersect = rs.srcIntn; // use cached value from ctrlpt calc - } else { - if (srcManEndptVal === 'outside-to-node' || srcManEndptVal === 'outside-to-node-or-label') { - p2_i = p2; - } else if (srcManEndptVal === 'outside-to-line' || srcManEndptVal === 'outside-to-line-or-label') { - p2_i = [tgtPos.x, tgtPos.y]; - } - - intersect = r.nodeShapes[this.getNodeShape(source)].intersectLine(srcPos.x, srcPos.y, source.outerWidth(), source.outerHeight(), p2_i[0], p2_i[1], 0); - - if (srcManEndptVal === 'outside-to-node-or-label' || srcManEndptVal === 'outside-to-line-or-label') { - var srs = source._private.rscratch; - var _lw = srs.labelWidth; - var _lh = srs.labelHeight; - var _lx = srs.labelX; - var _ly = srs.labelY; - - var _lw2 = _lw / 2; - - var _lh2 = _lh / 2; - - var _va = source.pstyle('text-valign').value; - - if (_va === 'top') { - _ly -= _lh2; - } else if (_va === 'bottom') { - _ly += _lh2; - } - - var _ha = source.pstyle('text-halign').value; - - if (_ha === 'left') { - _lx -= _lw2; - } else if (_ha === 'right') { - _lx += _lw2; - } - - var _labelIntersect = polygonIntersectLine(p2_i[0], p2_i[1], [_lx - _lw2, _ly - _lh2, _lx + _lw2, _ly - _lh2, _lx + _lw2, _ly + _lh2, _lx - _lw2, _ly + _lh2], srcPos.x, srcPos.y); - - if (_labelIntersect.length > 0) { - var _refPt = tgtPos; - - var _intSqdist = sqdist(_refPt, array2point(intersect)); - - var _labIntSqdist = sqdist(_refPt, array2point(_labelIntersect)); - - var _minSqDist = _intSqdist; - - if (_labIntSqdist < _intSqdist) { - intersect = [_labelIntersect[0], _labelIntersect[1]]; - _minSqDist = _labIntSqdist; - } - - if (_labelIntersect.length > 2) { - var _labInt2SqDist = sqdist(_refPt, { - x: _labelIntersect[2], - y: _labelIntersect[3] - }); - - if (_labInt2SqDist < _minSqDist) { - intersect = [_labelIntersect[2], _labelIntersect[3]]; - } - } - } - } - } - - var arrowStart = shortenIntersection(intersect, p2, r.arrowShapes[srcArShape].spacing(edge) + srcDist); - var edgeStart = shortenIntersection(intersect, p2, r.arrowShapes[srcArShape].gap(edge) + srcDist); - rs.startX = edgeStart[0]; - rs.startY = edgeStart[1]; - rs.arrowStartX = arrowStart[0]; - rs.arrowStartY = arrowStart[1]; - - if (hasEndpts) { - if (!number$1(rs.startX) || !number$1(rs.startY) || !number$1(rs.endX) || !number$1(rs.endY)) { - rs.badLine = true; - } else { - rs.badLine = false; - } - } -}; - -BRp$b.getSourceEndpoint = function (edge) { - var rs = edge[0]._private.rscratch; - this.recalculateRenderedStyle(edge); - - switch (rs.edgeType) { - case 'haystack': - return { - x: rs.haystackPts[0], - y: rs.haystackPts[1] - }; - - default: - return { - x: rs.arrowStartX, - y: rs.arrowStartY - }; - } -}; - -BRp$b.getTargetEndpoint = function (edge) { - var rs = edge[0]._private.rscratch; - this.recalculateRenderedStyle(edge); - - switch (rs.edgeType) { - case 'haystack': - return { - x: rs.haystackPts[2], - y: rs.haystackPts[3] - }; - - default: - return { - x: rs.arrowEndX, - y: rs.arrowEndY - }; - } -}; - -var BRp$a = {}; - -function pushBezierPts(r, edge, pts) { - var qbezierAt$1 = function qbezierAt$1(p1, p2, p3, t) { - return qbezierAt(p1, p2, p3, t); - }; - - var _p = edge._private; - var bpts = _p.rstyle.bezierPts; - - for (var i = 0; i < r.bezierProjPcts.length; i++) { - var p = r.bezierProjPcts[i]; - bpts.push({ - x: qbezierAt$1(pts[0], pts[2], pts[4], p), - y: qbezierAt$1(pts[1], pts[3], pts[5], p) - }); - } -} - -BRp$a.storeEdgeProjections = function (edge) { - var _p = edge._private; - var rs = _p.rscratch; - var et = rs.edgeType; // clear the cached points state - - _p.rstyle.bezierPts = null; - _p.rstyle.linePts = null; - _p.rstyle.haystackPts = null; - - if (et === 'multibezier' || et === 'bezier' || et === 'self' || et === 'compound') { - _p.rstyle.bezierPts = []; - - for (var i = 0; i + 5 < rs.allpts.length; i += 4) { - pushBezierPts(this, edge, rs.allpts.slice(i, i + 6)); - } - } else if (et === 'segments') { - var lpts = _p.rstyle.linePts = []; - - for (var i = 0; i + 1 < rs.allpts.length; i += 2) { - lpts.push({ - x: rs.allpts[i], - y: rs.allpts[i + 1] - }); - } - } else if (et === 'haystack') { - var hpts = rs.haystackPts; - _p.rstyle.haystackPts = [{ - x: hpts[0], - y: hpts[1] - }, { - x: hpts[2], - y: hpts[3] - }]; - } - - _p.rstyle.arrowWidth = this.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.arrowShapeWidth; -}; - -BRp$a.recalculateEdgeProjections = function (edges) { - this.findEdgeControlPoints(edges); -}; - -/* global document */ - -var BRp$9 = {}; - -BRp$9.recalculateNodeLabelProjection = function (node) { - var content = node.pstyle('label').strValue; - - if (emptyString(content)) { - return; - } - - var textX, textY; - var _p = node._private; - var nodeWidth = node.width(); - var nodeHeight = node.height(); - var padding = node.padding(); - var nodePos = node.position(); - var textHalign = node.pstyle('text-halign').strValue; - var textValign = node.pstyle('text-valign').strValue; - var rs = _p.rscratch; - var rstyle = _p.rstyle; - - switch (textHalign) { - case 'left': - textX = nodePos.x - nodeWidth / 2 - padding; - break; - - case 'right': - textX = nodePos.x + nodeWidth / 2 + padding; - break; - - default: - // e.g. center - textX = nodePos.x; - } - - switch (textValign) { - case 'top': - textY = nodePos.y - nodeHeight / 2 - padding; - break; - - case 'bottom': - textY = nodePos.y + nodeHeight / 2 + padding; - break; - - default: - // e.g. middle - textY = nodePos.y; - } - - rs.labelX = textX; - rs.labelY = textY; - rstyle.labelX = textX; - rstyle.labelY = textY; - this.calculateLabelAngles(node); - this.applyLabelDimensions(node); -}; - -var lineAngleFromDelta = function lineAngleFromDelta(dx, dy) { - var angle = Math.atan(dy / dx); - - if (dx === 0 && angle < 0) { - angle = angle * -1; - } - - return angle; -}; - -var lineAngle = function lineAngle(p0, p1) { - var dx = p1.x - p0.x; - var dy = p1.y - p0.y; - return lineAngleFromDelta(dx, dy); -}; - -var bezierAngle = function bezierAngle(p0, p1, p2, t) { - var t0 = bound(0, t - 0.001, 1); - var t1 = bound(0, t + 0.001, 1); - var lp0 = qbezierPtAt(p0, p1, p2, t0); - var lp1 = qbezierPtAt(p0, p1, p2, t1); - return lineAngle(lp0, lp1); -}; - -BRp$9.recalculateEdgeLabelProjections = function (edge) { - var p; - var _p = edge._private; - var rs = _p.rscratch; - var r = this; - var content = { - mid: edge.pstyle('label').strValue, - source: edge.pstyle('source-label').strValue, - target: edge.pstyle('target-label').strValue - }; - - if (content.mid || content.source || content.target) ; else { - return; // no labels => no calcs - } // add center point to style so bounding box calculations can use it - // - - - p = { - x: rs.midX, - y: rs.midY - }; - - var setRs = function setRs(propName, prefix, value) { - setPrefixedProperty(_p.rscratch, propName, prefix, value); - setPrefixedProperty(_p.rstyle, propName, prefix, value); - }; - - setRs('labelX', null, p.x); - setRs('labelY', null, p.y); - var midAngle = lineAngleFromDelta(rs.midDispX, rs.midDispY); - setRs('labelAutoAngle', null, midAngle); - - var createControlPointInfo = function createControlPointInfo() { - if (createControlPointInfo.cache) { - return createControlPointInfo.cache; - } // use cache so only 1x per edge - - - var ctrlpts = []; // store each ctrlpt info init - - for (var i = 0; i + 5 < rs.allpts.length; i += 4) { - var p0 = { - x: rs.allpts[i], - y: rs.allpts[i + 1] - }; - var p1 = { - x: rs.allpts[i + 2], - y: rs.allpts[i + 3] - }; // ctrlpt - - var p2 = { - x: rs.allpts[i + 4], - y: rs.allpts[i + 5] - }; - ctrlpts.push({ - p0: p0, - p1: p1, - p2: p2, - startDist: 0, - length: 0, - segments: [] - }); - } - - var bpts = _p.rstyle.bezierPts; - var nProjs = r.bezierProjPcts.length; - - function addSegment(cp, p0, p1, t0, t1) { - var length = dist(p0, p1); - var prevSegment = cp.segments[cp.segments.length - 1]; - var segment = { - p0: p0, - p1: p1, - t0: t0, - t1: t1, - startDist: prevSegment ? prevSegment.startDist + prevSegment.length : 0, - length: length - }; - cp.segments.push(segment); - cp.length += length; - } // update each ctrlpt with segment info - - - for (var _i = 0; _i < ctrlpts.length; _i++) { - var cp = ctrlpts[_i]; - var prevCp = ctrlpts[_i - 1]; - - if (prevCp) { - cp.startDist = prevCp.startDist + prevCp.length; - } - - addSegment(cp, cp.p0, bpts[_i * nProjs], 0, r.bezierProjPcts[0]); // first - - for (var j = 0; j < nProjs - 1; j++) { - addSegment(cp, bpts[_i * nProjs + j], bpts[_i * nProjs + j + 1], r.bezierProjPcts[j], r.bezierProjPcts[j + 1]); - } - - addSegment(cp, bpts[_i * nProjs + nProjs - 1], cp.p2, r.bezierProjPcts[nProjs - 1], 1); // last - } - - return createControlPointInfo.cache = ctrlpts; - }; - - var calculateEndProjection = function calculateEndProjection(prefix) { - var angle; - var isSrc = prefix === 'source'; - - if (!content[prefix]) { - return; - } - - var offset = edge.pstyle(prefix + '-text-offset').pfValue; - - switch (rs.edgeType) { - case 'self': - case 'compound': - case 'bezier': - case 'multibezier': - { - var cps = createControlPointInfo(); - var selected; - var startDist = 0; - var totalDist = 0; // find the segment we're on - - for (var i = 0; i < cps.length; i++) { - var _cp = cps[isSrc ? i : cps.length - 1 - i]; - - for (var j = 0; j < _cp.segments.length; j++) { - var _seg = _cp.segments[isSrc ? j : _cp.segments.length - 1 - j]; - var lastSeg = i === cps.length - 1 && j === _cp.segments.length - 1; - startDist = totalDist; - totalDist += _seg.length; - - if (totalDist >= offset || lastSeg) { - selected = { - cp: _cp, - segment: _seg - }; - break; - } - } - - if (selected) { - break; - } - } - - var cp = selected.cp; - var seg = selected.segment; - var tSegment = (offset - startDist) / seg.length; - var segDt = seg.t1 - seg.t0; - var t = isSrc ? seg.t0 + segDt * tSegment : seg.t1 - segDt * tSegment; - t = bound(0, t, 1); - p = qbezierPtAt(cp.p0, cp.p1, cp.p2, t); - angle = bezierAngle(cp.p0, cp.p1, cp.p2, t); - break; - } - - case 'straight': - case 'segments': - case 'haystack': - { - var d = 0, - di, - d0; - var p0, p1; - var l = rs.allpts.length; - - for (var _i2 = 0; _i2 + 3 < l; _i2 += 2) { - if (isSrc) { - p0 = { - x: rs.allpts[_i2], - y: rs.allpts[_i2 + 1] - }; - p1 = { - x: rs.allpts[_i2 + 2], - y: rs.allpts[_i2 + 3] - }; - } else { - p0 = { - x: rs.allpts[l - 2 - _i2], - y: rs.allpts[l - 1 - _i2] - }; - p1 = { - x: rs.allpts[l - 4 - _i2], - y: rs.allpts[l - 3 - _i2] - }; - } - - di = dist(p0, p1); - d0 = d; - d += di; - - if (d >= offset) { - break; - } - } - - var pD = offset - d0; - - var _t = pD / di; - - _t = bound(0, _t, 1); - p = lineAt(p0, p1, _t); - angle = lineAngle(p0, p1); - break; - } - } - - setRs('labelX', prefix, p.x); - setRs('labelY', prefix, p.y); - setRs('labelAutoAngle', prefix, angle); - }; - - calculateEndProjection('source'); - calculateEndProjection('target'); - this.applyLabelDimensions(edge); -}; - -BRp$9.applyLabelDimensions = function (ele) { - this.applyPrefixedLabelDimensions(ele); - - if (ele.isEdge()) { - this.applyPrefixedLabelDimensions(ele, 'source'); - this.applyPrefixedLabelDimensions(ele, 'target'); - } -}; - -BRp$9.applyPrefixedLabelDimensions = function (ele, prefix) { - var _p = ele._private; - var text = this.getLabelText(ele, prefix); - var labelDims = this.calculateLabelDimensions(ele, text); - var lineHeight = ele.pstyle('line-height').pfValue; - var textWrap = ele.pstyle('text-wrap').strValue; - var lines = getPrefixedProperty(_p.rscratch, 'labelWrapCachedLines', prefix) || []; - var numLines = textWrap !== 'wrap' ? 1 : Math.max(lines.length, 1); - var normPerLineHeight = labelDims.height / numLines; - var labelLineHeight = normPerLineHeight * lineHeight; - var width = labelDims.width; - var height = labelDims.height + (numLines - 1) * (lineHeight - 1) * normPerLineHeight; - setPrefixedProperty(_p.rstyle, 'labelWidth', prefix, width); - setPrefixedProperty(_p.rscratch, 'labelWidth', prefix, width); - setPrefixedProperty(_p.rstyle, 'labelHeight', prefix, height); - setPrefixedProperty(_p.rscratch, 'labelHeight', prefix, height); - setPrefixedProperty(_p.rscratch, 'labelLineHeight', prefix, labelLineHeight); -}; - -BRp$9.getLabelText = function (ele, prefix) { - var _p = ele._private; - var pfd = prefix ? prefix + '-' : ''; - var text = ele.pstyle(pfd + 'label').strValue; - var textTransform = ele.pstyle('text-transform').value; - - var rscratch = function rscratch(propName, value) { - if (value) { - setPrefixedProperty(_p.rscratch, propName, prefix, value); - return value; - } else { - return getPrefixedProperty(_p.rscratch, propName, prefix); - } - }; // for empty text, skip all processing - - - if (!text) { - return ''; - } - - if (textTransform == 'none') ; else if (textTransform == 'uppercase') { - text = text.toUpperCase(); - } else if (textTransform == 'lowercase') { - text = text.toLowerCase(); - } - - var wrapStyle = ele.pstyle('text-wrap').value; - - if (wrapStyle === 'wrap') { - var labelKey = rscratch('labelKey'); // save recalc if the label is the same as before - - if (labelKey != null && rscratch('labelWrapKey') === labelKey) { - return rscratch('labelWrapCachedText'); - } - - var zwsp = "\u200B"; - var lines = text.split('\n'); - var maxW = ele.pstyle('text-max-width').pfValue; - var overflow = ele.pstyle('text-overflow-wrap').value; - var overflowAny = overflow === 'anywhere'; - var wrappedLines = []; - var wordsRegex = /[\s\u200b]+/; - var wordSeparator = overflowAny ? '' : ' '; - - for (var l = 0; l < lines.length; l++) { - var line = lines[l]; - var lineDims = this.calculateLabelDimensions(ele, line); - var lineW = lineDims.width; - - if (overflowAny) { - var processedLine = line.split('').join(zwsp); - line = processedLine; - } - - if (lineW > maxW) { - // line is too long - var words = line.split(wordsRegex); - var subline = ''; - - for (var w = 0; w < words.length; w++) { - var word = words[w]; - var testLine = subline.length === 0 ? word : subline + wordSeparator + word; - var testDims = this.calculateLabelDimensions(ele, testLine); - var testW = testDims.width; - - if (testW <= maxW) { - // word fits on current line - subline += word + wordSeparator; - } else { - // word starts new line - if (subline) { - wrappedLines.push(subline); - } - - subline = word + wordSeparator; - } - } // if there's remaining text, put it in a wrapped line - - - if (!subline.match(/^[\s\u200b]+$/)) { - wrappedLines.push(subline); - } - } else { - // line is already short enough - wrappedLines.push(line); - } - } // for - - - rscratch('labelWrapCachedLines', wrappedLines); - text = rscratch('labelWrapCachedText', wrappedLines.join('\n')); - rscratch('labelWrapKey', labelKey); - } else if (wrapStyle === 'ellipsis') { - var _maxW = ele.pstyle('text-max-width').pfValue; - var ellipsized = ''; - var ellipsis = "\u2026"; - var incLastCh = false; - - if (this.calculateLabelDimensions(ele, text).width < _maxW) { - // the label already fits - return text; - } - - for (var i = 0; i < text.length; i++) { - var widthWithNextCh = this.calculateLabelDimensions(ele, ellipsized + text[i] + ellipsis).width; - - if (widthWithNextCh > _maxW) { - break; - } - - ellipsized += text[i]; - - if (i === text.length - 1) { - incLastCh = true; - } - } - - if (!incLastCh) { - ellipsized += ellipsis; - } - - return ellipsized; - } // if ellipsize - - - return text; -}; - -BRp$9.getLabelJustification = function (ele) { - var justification = ele.pstyle('text-justification').strValue; - var textHalign = ele.pstyle('text-halign').strValue; - - if (justification === 'auto') { - if (ele.isNode()) { - switch (textHalign) { - case 'left': - return 'right'; - - case 'right': - return 'left'; - - default: - return 'center'; - } - } else { - return 'center'; - } - } else { - return justification; - } -}; - -BRp$9.calculateLabelDimensions = function (ele, text) { - var r = this; - var cacheKey = hashString(text, ele._private.labelDimsKey); - var cache = r.labelDimCache || (r.labelDimCache = []); - var existingVal = cache[cacheKey]; - - if (existingVal != null) { - return existingVal; - } - - var padding = 0; // add padding around text dims, as the measurement isn't that accurate - - var fStyle = ele.pstyle('font-style').strValue; - var size = ele.pstyle('font-size').pfValue; - var family = ele.pstyle('font-family').strValue; - var weight = ele.pstyle('font-weight').strValue; - var canvas = this.labelCalcCanvas; - var c2d = this.labelCalcCanvasContext; - - if (!canvas) { - canvas = this.labelCalcCanvas = document.createElement('canvas'); - c2d = this.labelCalcCanvasContext = canvas.getContext('2d'); - var ds = canvas.style; - ds.position = 'absolute'; - ds.left = '-9999px'; - ds.top = '-9999px'; - ds.zIndex = '-1'; - ds.visibility = 'hidden'; - ds.pointerEvents = 'none'; - } - - c2d.font = "".concat(fStyle, " ").concat(weight, " ").concat(size, "px ").concat(family); - var width = 0; - var height = 0; - var lines = text.split('\n'); - - for (var i = 0; i < lines.length; i++) { - var line = lines[i]; - var metrics = c2d.measureText(line); - var w = Math.ceil(metrics.width); - var h = size; - width = Math.max(w, width); - height += h; - } - - width += padding; - height += padding; - return cache[cacheKey] = { - width: width, - height: height - }; -}; - -BRp$9.calculateLabelAngle = function (ele, prefix) { - var _p = ele._private; - var rs = _p.rscratch; - var isEdge = ele.isEdge(); - var prefixDash = prefix ? prefix + '-' : ''; - var rot = ele.pstyle(prefixDash + 'text-rotation'); - var rotStr = rot.strValue; - - if (rotStr === 'none') { - return 0; - } else if (isEdge && rotStr === 'autorotate') { - return rs.labelAutoAngle; - } else if (rotStr === 'autorotate') { - return 0; - } else { - return rot.pfValue; - } -}; - -BRp$9.calculateLabelAngles = function (ele) { - var r = this; - var isEdge = ele.isEdge(); - var _p = ele._private; - var rs = _p.rscratch; - rs.labelAngle = r.calculateLabelAngle(ele); - - if (isEdge) { - rs.sourceLabelAngle = r.calculateLabelAngle(ele, 'source'); - rs.targetLabelAngle = r.calculateLabelAngle(ele, 'target'); - } -}; - -var BRp$8 = {}; -var TOO_SMALL_CUT_RECT = 28; -var warnedCutRect = false; - -BRp$8.getNodeShape = function (node) { - var r = this; - var shape = node.pstyle('shape').value; - - if (shape === 'cutrectangle' && (node.width() < TOO_SMALL_CUT_RECT || node.height() < TOO_SMALL_CUT_RECT)) { - if (!warnedCutRect) { - warn('The `cutrectangle` node shape can not be used at small sizes so `rectangle` is used instead'); - warnedCutRect = true; - } - - return 'rectangle'; - } - - if (node.isParent()) { - if (shape === 'rectangle' || shape === 'roundrectangle' || shape === 'round-rectangle' || shape === 'cutrectangle' || shape === 'cut-rectangle' || shape === 'barrel') { - return shape; - } else { - return 'rectangle'; - } - } - - if (shape === 'polygon') { - var points = node.pstyle('shape-polygon-points').value; - return r.nodeShapes.makePolygon(points).name; - } - - return shape; -}; - -var BRp$7 = {}; - -BRp$7.registerCalculationListeners = function () { - var cy = this.cy; - var elesToUpdate = cy.collection(); - var r = this; - - var enqueue = function enqueue(eles) { - var dirtyStyleCaches = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - elesToUpdate.merge(eles); - - if (dirtyStyleCaches) { - for (var i = 0; i < eles.length; i++) { - var ele = eles[i]; - var _p = ele._private; - var rstyle = _p.rstyle; - rstyle.clean = false; - rstyle.cleanConnected = false; - } - } - }; - - r.binder(cy).on('bounds.* dirty.*', function onDirtyBounds(e) { - var ele = e.target; - enqueue(ele); - }).on('style.* background.*', function onDirtyStyle(e) { - var ele = e.target; - enqueue(ele, false); - }); - - var updateEleCalcs = function updateEleCalcs(willDraw) { - if (willDraw) { - var fns = r.onUpdateEleCalcsFns; // because we need to have up-to-date style (e.g. stylesheet mappers) - // before calculating rendered style (and pstyle might not be called yet) - - elesToUpdate.cleanStyle(); - - for (var i = 0; i < elesToUpdate.length; i++) { - var ele = elesToUpdate[i]; - var rstyle = ele._private.rstyle; - - if (ele.isNode() && !rstyle.cleanConnected) { - enqueue(ele.connectedEdges()); - rstyle.cleanConnected = true; - } - } - - if (fns) { - for (var _i = 0; _i < fns.length; _i++) { - var fn = fns[_i]; - fn(willDraw, elesToUpdate); - } - } - - r.recalculateRenderedStyle(elesToUpdate); - elesToUpdate = cy.collection(); - } - }; - - r.flushRenderedStyleQueue = function () { - updateEleCalcs(true); - }; - - r.beforeRender(updateEleCalcs, r.beforeRenderPriorities.eleCalcs); -}; - -BRp$7.onUpdateEleCalcs = function (fn) { - var fns = this.onUpdateEleCalcsFns = this.onUpdateEleCalcsFns || []; - fns.push(fn); -}; - -BRp$7.recalculateRenderedStyle = function (eles, useCache) { - var isCleanConnected = function isCleanConnected(ele) { - return ele._private.rstyle.cleanConnected; - }; - - var edges = []; - var nodes = []; // the renderer can't be used for calcs when destroyed, e.g. ele.boundingBox() - - if (this.destroyed) { - return; - } // use cache by default for perf - - - if (useCache === undefined) { - useCache = true; - } - - for (var i = 0; i < eles.length; i++) { - var ele = eles[i]; - var _p = ele._private; - var rstyle = _p.rstyle; // an edge may be implicitly dirty b/c of one of its connected nodes - // (and a request for recalc may come in between frames) - - if (ele.isEdge() && (!isCleanConnected(ele.source()) || !isCleanConnected(ele.target()))) { - rstyle.clean = false; - } // only update if dirty and in graph - - - if (useCache && rstyle.clean || ele.removed()) { - continue; - } // only update if not display: none - - - if (ele.pstyle('display').value === 'none') { - continue; - } - - if (_p.group === 'nodes') { - nodes.push(ele); - } else { - // edges - edges.push(ele); - } - - rstyle.clean = true; - } // update node data from projections - - - for (var _i2 = 0; _i2 < nodes.length; _i2++) { - var _ele = nodes[_i2]; - var _p2 = _ele._private; - var _rstyle = _p2.rstyle; - - var pos = _ele.position(); - - this.recalculateNodeLabelProjection(_ele); - _rstyle.nodeX = pos.x; - _rstyle.nodeY = pos.y; - _rstyle.nodeW = _ele.pstyle('width').pfValue; - _rstyle.nodeH = _ele.pstyle('height').pfValue; - } - - this.recalculateEdgeProjections(edges); // update edge data from projections - - for (var _i3 = 0; _i3 < edges.length; _i3++) { - var _ele2 = edges[_i3]; - var _p3 = _ele2._private; - var _rstyle2 = _p3.rstyle; - var rs = _p3.rscratch; // update rstyle positions - - _rstyle2.srcX = rs.arrowStartX; - _rstyle2.srcY = rs.arrowStartY; - _rstyle2.tgtX = rs.arrowEndX; - _rstyle2.tgtY = rs.arrowEndY; - _rstyle2.midX = rs.midX; - _rstyle2.midY = rs.midY; - _rstyle2.labelAngle = rs.labelAngle; - _rstyle2.sourceLabelAngle = rs.sourceLabelAngle; - _rstyle2.targetLabelAngle = rs.targetLabelAngle; - } -}; - -var BRp$6 = {}; - -BRp$6.updateCachedGrabbedEles = function () { - var eles = this.cachedZSortedEles; - - if (!eles) { - // just let this be recalculated on the next z sort tick - return; - } - - eles.drag = []; - eles.nondrag = []; - var grabTargets = []; - - for (var i = 0; i < eles.length; i++) { - var ele = eles[i]; - var rs = ele._private.rscratch; - - if (ele.grabbed() && !ele.isParent()) { - grabTargets.push(ele); - } else if (rs.inDragLayer) { - eles.drag.push(ele); - } else { - eles.nondrag.push(ele); - } - } // put the grab target nodes last so it's on top of its neighbourhood - - - for (var i = 0; i < grabTargets.length; i++) { - var ele = grabTargets[i]; - eles.drag.push(ele); - } -}; - -BRp$6.invalidateCachedZSortedEles = function () { - this.cachedZSortedEles = null; -}; - -BRp$6.getCachedZSortedEles = function (forceRecalc) { - if (forceRecalc || !this.cachedZSortedEles) { - var eles = this.cy.mutableElements().toArray(); - eles.sort(zIndexSort); - eles.interactive = eles.filter(function (ele) { - return ele.interactive(); - }); - this.cachedZSortedEles = eles; - this.updateCachedGrabbedEles(); - } else { - eles = this.cachedZSortedEles; - } - - return eles; -}; - -var BRp$5 = {}; -[BRp$e, BRp$d, BRp$c, BRp$b, BRp$a, BRp$9, BRp$8, BRp$7, BRp$6].forEach(function (props) { - extend(BRp$5, props); -}); - -var BRp$4 = {}; - -BRp$4.getCachedImage = function (url, crossOrigin, onLoad) { - var r = this; - var imageCache = r.imageCache = r.imageCache || {}; - var cache = imageCache[url]; - - if (cache) { - if (!cache.image.complete) { - cache.image.addEventListener('load', onLoad); - } - - return cache.image; - } else { - cache = imageCache[url] = imageCache[url] || {}; - var image = cache.image = new Image(); // eslint-disable-line no-undef - - image.addEventListener('load', onLoad); - image.addEventListener('error', function () { - image.error = true; - }); // #1582 safari doesn't load data uris with crossOrigin properly - // https://bugs.webkit.org/show_bug.cgi?id=123978 - - var dataUriPrefix = 'data:'; - var isDataUri = url.substring(0, dataUriPrefix.length).toLowerCase() === dataUriPrefix; - - if (!isDataUri) { - // if crossorigin is 'null'(stringified), then manually set it to null - crossOrigin = crossOrigin === 'null' ? null : crossOrigin; - image.crossOrigin = crossOrigin; // prevent tainted canvas - } - - image.src = url; - return image; - } -}; - -var BRp$3 = {}; -/* global document, window, ResizeObserver, MutationObserver */ - -BRp$3.registerBinding = function (target, event, handler, useCapture) { - // eslint-disable-line no-unused-vars - var args = Array.prototype.slice.apply(arguments, [1]); // copy - - var b = this.binder(target); - return b.on.apply(b, args); -}; - -BRp$3.binder = function (tgt) { - var r = this; - var tgtIsDom = tgt === window || tgt === document || tgt === document.body || domElement(tgt); - - if (r.supportsPassiveEvents == null) { - // from https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection - var supportsPassive = false; - - try { - var opts = Object.defineProperty({}, 'passive', { - get: function get() { - supportsPassive = true; - return true; - } - }); - window.addEventListener('test', null, opts); - } catch (err) {// not supported - } - - r.supportsPassiveEvents = supportsPassive; - } - - var on = function on(event, handler, useCapture) { - var args = Array.prototype.slice.call(arguments); - - if (tgtIsDom && r.supportsPassiveEvents) { - // replace useCapture w/ opts obj - args[2] = { - capture: useCapture != null ? useCapture : false, - passive: false, - once: false - }; - } - - r.bindings.push({ - target: tgt, - args: args - }); - (tgt.addEventListener || tgt.on).apply(tgt, args); - return this; - }; - - return { - on: on, - addEventListener: on, - addListener: on, - bind: on - }; -}; - -BRp$3.nodeIsDraggable = function (node) { - return node && node.isNode() && !node.locked() && node.grabbable(); -}; - -BRp$3.nodeIsGrabbable = function (node) { - return this.nodeIsDraggable(node) && node.interactive(); -}; - -BRp$3.load = function () { - var r = this; - - var isSelected = function isSelected(ele) { - return ele.selected(); - }; - - var triggerEvents = function triggerEvents(target, names, e, position) { - if (target == null) { - target = r.cy; - } - - for (var i = 0; i < names.length; i++) { - var name = names[i]; - target.emit({ - originalEvent: e, - type: name, - position: position - }); - } - }; - - var isMultSelKeyDown = function isMultSelKeyDown(e) { - return e.shiftKey || e.metaKey || e.ctrlKey; // maybe e.altKey - }; - - var allowPanningPassthrough = function allowPanningPassthrough(down, downs) { - var allowPassthrough = true; - - if (r.cy.hasCompoundNodes() && down && down.pannable()) { - // a grabbable compound node below the ele => no passthrough panning - for (var i = 0; downs && i < downs.length; i++) { - var down = downs[i]; //if any parent node in event hierarchy isn't pannable, reject passthrough - - if (down.isNode() && down.isParent() && !down.pannable()) { - allowPassthrough = false; - break; - } - } - } else { - allowPassthrough = true; - } - - return allowPassthrough; - }; - - var setGrabbed = function setGrabbed(ele) { - ele[0]._private.grabbed = true; - }; - - var setFreed = function setFreed(ele) { - ele[0]._private.grabbed = false; - }; - - var setInDragLayer = function setInDragLayer(ele) { - ele[0]._private.rscratch.inDragLayer = true; - }; - - var setOutDragLayer = function setOutDragLayer(ele) { - ele[0]._private.rscratch.inDragLayer = false; - }; - - var setGrabTarget = function setGrabTarget(ele) { - ele[0]._private.rscratch.isGrabTarget = true; - }; - - var removeGrabTarget = function removeGrabTarget(ele) { - ele[0]._private.rscratch.isGrabTarget = false; - }; - - var addToDragList = function addToDragList(ele, opts) { - var list = opts.addToList; - var listHasEle = list.has(ele); - - if (!listHasEle && ele.grabbable() && !ele.locked()) { - list.merge(ele); - setGrabbed(ele); - } - }; // helper function to determine which child nodes and inner edges - // of a compound node to be dragged as well as the grabbed and selected nodes - - - var addDescendantsToDrag = function addDescendantsToDrag(node, opts) { - if (!node.cy().hasCompoundNodes()) { - return; - } - - if (opts.inDragLayer == null && opts.addToList == null) { - return; - } // nothing to do - - - var innerNodes = node.descendants(); - - if (opts.inDragLayer) { - innerNodes.forEach(setInDragLayer); - innerNodes.connectedEdges().forEach(setInDragLayer); - } - - if (opts.addToList) { - addToDragList(innerNodes, opts); - } - }; // adds the given nodes and its neighbourhood to the drag layer - - - var addNodesToDrag = function addNodesToDrag(nodes, opts) { - opts = opts || {}; - var hasCompoundNodes = nodes.cy().hasCompoundNodes(); - - if (opts.inDragLayer) { - nodes.forEach(setInDragLayer); - nodes.neighborhood().stdFilter(function (ele) { - return !hasCompoundNodes || ele.isEdge(); - }).forEach(setInDragLayer); - } - - if (opts.addToList) { - nodes.forEach(function (ele) { - addToDragList(ele, opts); - }); - } - - addDescendantsToDrag(nodes, opts); // always add to drag - // also add nodes and edges related to the topmost ancestor - - updateAncestorsInDragLayer(nodes, { - inDragLayer: opts.inDragLayer - }); - r.updateCachedGrabbedEles(); - }; - - var addNodeToDrag = addNodesToDrag; - - var freeDraggedElements = function freeDraggedElements(grabbedEles) { - if (!grabbedEles) { - return; - } // just go over all elements rather than doing a bunch of (possibly expensive) traversals - - - r.getCachedZSortedEles().forEach(function (ele) { - setFreed(ele); - setOutDragLayer(ele); - removeGrabTarget(ele); - }); - r.updateCachedGrabbedEles(); - }; // helper function to determine which ancestor nodes and edges should go - // to the drag layer (or should be removed from drag layer). - - - var updateAncestorsInDragLayer = function updateAncestorsInDragLayer(node, opts) { - if (opts.inDragLayer == null && opts.addToList == null) { - return; - } // nothing to do - - - if (!node.cy().hasCompoundNodes()) { - return; - } // find top-level parent - - - var parent = node.ancestors().orphans(); // no parent node: no nodes to add to the drag layer - - if (parent.same(node)) { - return; - } - - var nodes = parent.descendants().spawnSelf().merge(parent).unmerge(node).unmerge(node.descendants()); - var edges = nodes.connectedEdges(); - - if (opts.inDragLayer) { - edges.forEach(setInDragLayer); - nodes.forEach(setInDragLayer); - } - - if (opts.addToList) { - nodes.forEach(function (ele) { - addToDragList(ele, opts); - }); - } - }; - - var blurActiveDomElement = function blurActiveDomElement() { - if (document.activeElement != null && document.activeElement.blur != null) { - document.activeElement.blur(); - } - }; - - var haveMutationsApi = typeof MutationObserver !== 'undefined'; - var haveResizeObserverApi = typeof ResizeObserver !== 'undefined'; // watch for when the cy container is removed from the dom - - if (haveMutationsApi) { - r.removeObserver = new MutationObserver(function (mutns) { - // eslint-disable-line no-undef - for (var i = 0; i < mutns.length; i++) { - var mutn = mutns[i]; - var rNodes = mutn.removedNodes; - - if (rNodes) { - for (var j = 0; j < rNodes.length; j++) { - var rNode = rNodes[j]; - - if (rNode === r.container) { - r.destroy(); - break; - } - } - } - } - }); - - if (r.container.parentNode) { - r.removeObserver.observe(r.container.parentNode, { - childList: true - }); - } - } else { - r.registerBinding(r.container, 'DOMNodeRemoved', function (e) { - // eslint-disable-line no-unused-vars - r.destroy(); - }); - } - - var onResize = debounce__default["default"](function () { - r.cy.resize(); - }, 100); - - if (haveMutationsApi) { - r.styleObserver = new MutationObserver(onResize); // eslint-disable-line no-undef - - r.styleObserver.observe(r.container, { - attributes: true - }); - } // auto resize - - - r.registerBinding(window, 'resize', onResize); // eslint-disable-line no-undef - - if (haveResizeObserverApi) { - r.resizeObserver = new ResizeObserver(onResize); // eslint-disable-line no-undef - - r.resizeObserver.observe(r.container); - } - - var forEachUp = function forEachUp(domEle, fn) { - while (domEle != null) { - fn(domEle); - domEle = domEle.parentNode; - } - }; - - var invalidateCoords = function invalidateCoords() { - r.invalidateContainerClientCoordsCache(); - }; - - forEachUp(r.container, function (domEle) { - r.registerBinding(domEle, 'transitionend', invalidateCoords); - r.registerBinding(domEle, 'animationend', invalidateCoords); - r.registerBinding(domEle, 'scroll', invalidateCoords); - }); // stop right click menu from appearing on cy - - r.registerBinding(r.container, 'contextmenu', function (e) { - e.preventDefault(); - }); - - var inBoxSelection = function inBoxSelection() { - return r.selection[4] !== 0; - }; - - var eventInContainer = function eventInContainer(e) { - // save cycles if mouse events aren't to be captured - var containerPageCoords = r.findContainerClientCoords(); - var x = containerPageCoords[0]; - var y = containerPageCoords[1]; - var width = containerPageCoords[2]; - var height = containerPageCoords[3]; - var positions = e.touches ? e.touches : [e]; - var atLeastOnePosInside = false; - - for (var i = 0; i < positions.length; i++) { - var p = positions[i]; - - if (x <= p.clientX && p.clientX <= x + width && y <= p.clientY && p.clientY <= y + height) { - atLeastOnePosInside = true; - break; - } - } - - if (!atLeastOnePosInside) { - return false; - } - - var container = r.container; - var target = e.target; - var tParent = target.parentNode; - var containerIsTarget = false; - - while (tParent) { - if (tParent === container) { - containerIsTarget = true; - break; - } - - tParent = tParent.parentNode; - } - - if (!containerIsTarget) { - return false; - } // if target is outisde cy container, then this event is not for us - - - return true; - }; // Primary key - - - r.registerBinding(r.container, 'mousedown', function mousedownHandler(e) { - if (!eventInContainer(e)) { - return; - } - - e.preventDefault(); - blurActiveDomElement(); - r.hoverData.capture = true; - r.hoverData.which = e.which; - var cy = r.cy; - var gpos = [e.clientX, e.clientY]; - var pos = r.projectIntoViewport(gpos[0], gpos[1]); - var select = r.selection; - var nears = r.findNearestElements(pos[0], pos[1], true, false); - var near = nears[0]; - var draggedElements = r.dragData.possibleDragElements; - r.hoverData.mdownPos = pos; - r.hoverData.mdownGPos = gpos; - - var checkForTaphold = function checkForTaphold() { - r.hoverData.tapholdCancelled = false; - clearTimeout(r.hoverData.tapholdTimeout); - r.hoverData.tapholdTimeout = setTimeout(function () { - if (r.hoverData.tapholdCancelled) { - return; - } else { - var ele = r.hoverData.down; - - if (ele) { - ele.emit({ - originalEvent: e, - type: 'taphold', - position: { - x: pos[0], - y: pos[1] - } - }); - } else { - cy.emit({ - originalEvent: e, - type: 'taphold', - position: { - x: pos[0], - y: pos[1] - } - }); - } - } - }, r.tapholdDuration); - }; // Right click button - - - if (e.which == 3) { - r.hoverData.cxtStarted = true; - var cxtEvt = { - originalEvent: e, - type: 'cxttapstart', - position: { - x: pos[0], - y: pos[1] - } - }; - - if (near) { - near.activate(); - near.emit(cxtEvt); - r.hoverData.down = near; - } else { - cy.emit(cxtEvt); - } - - r.hoverData.downTime = new Date().getTime(); - r.hoverData.cxtDragged = false; // Primary button - } else if (e.which == 1) { - if (near) { - near.activate(); - } // Element dragging - - - { - // If something is under the cursor and it is draggable, prepare to grab it - if (near != null) { - if (r.nodeIsGrabbable(near)) { - var makeEvent = function makeEvent(type) { - return { - originalEvent: e, - type: type, - position: { - x: pos[0], - y: pos[1] - } - }; - }; - - var triggerGrab = function triggerGrab(ele) { - ele.emit(makeEvent('grab')); - }; - - setGrabTarget(near); - - if (!near.selected()) { - draggedElements = r.dragData.possibleDragElements = cy.collection(); - addNodeToDrag(near, { - addToList: draggedElements - }); - near.emit(makeEvent('grabon')).emit(makeEvent('grab')); - } else { - draggedElements = r.dragData.possibleDragElements = cy.collection(); - var selectedNodes = cy.$(function (ele) { - return ele.isNode() && ele.selected() && r.nodeIsGrabbable(ele); - }); - addNodesToDrag(selectedNodes, { - addToList: draggedElements - }); - near.emit(makeEvent('grabon')); - selectedNodes.forEach(triggerGrab); - } - - r.redrawHint('eles', true); - r.redrawHint('drag', true); - } - } - - r.hoverData.down = near; - r.hoverData.downs = nears; - r.hoverData.downTime = new Date().getTime(); - } - triggerEvents(near, ['mousedown', 'tapstart', 'vmousedown'], e, { - x: pos[0], - y: pos[1] - }); - - if (near == null) { - select[4] = 1; - r.data.bgActivePosistion = { - x: pos[0], - y: pos[1] - }; - r.redrawHint('select', true); - r.redraw(); - } else if (near.pannable()) { - select[4] = 1; // for future pan - } - - checkForTaphold(); - } // Initialize selection box coordinates - - - select[0] = select[2] = pos[0]; - select[1] = select[3] = pos[1]; - }, false); - r.registerBinding(window, 'mousemove', function mousemoveHandler(e) { - // eslint-disable-line no-undef - var capture = r.hoverData.capture; - - if (!capture && !eventInContainer(e)) { - return; - } - - var preventDefault = false; - var cy = r.cy; - var zoom = cy.zoom(); - var gpos = [e.clientX, e.clientY]; - var pos = r.projectIntoViewport(gpos[0], gpos[1]); - var mdownPos = r.hoverData.mdownPos; - var mdownGPos = r.hoverData.mdownGPos; - var select = r.selection; - var near = null; - - if (!r.hoverData.draggingEles && !r.hoverData.dragging && !r.hoverData.selecting) { - near = r.findNearestElement(pos[0], pos[1], true, false); - } - - var last = r.hoverData.last; - var down = r.hoverData.down; - var disp = [pos[0] - select[2], pos[1] - select[3]]; - var draggedElements = r.dragData.possibleDragElements; - var isOverThresholdDrag; - - if (mdownGPos) { - var dx = gpos[0] - mdownGPos[0]; - var dx2 = dx * dx; - var dy = gpos[1] - mdownGPos[1]; - var dy2 = dy * dy; - var dist2 = dx2 + dy2; - r.hoverData.isOverThresholdDrag = isOverThresholdDrag = dist2 >= r.desktopTapThreshold2; - } - - var multSelKeyDown = isMultSelKeyDown(e); - - if (isOverThresholdDrag) { - r.hoverData.tapholdCancelled = true; - } - - var updateDragDelta = function updateDragDelta() { - var dragDelta = r.hoverData.dragDelta = r.hoverData.dragDelta || []; - - if (dragDelta.length === 0) { - dragDelta.push(disp[0]); - dragDelta.push(disp[1]); - } else { - dragDelta[0] += disp[0]; - dragDelta[1] += disp[1]; - } - }; - - preventDefault = true; - triggerEvents(near, ['mousemove', 'vmousemove', 'tapdrag'], e, { - x: pos[0], - y: pos[1] - }); - - var goIntoBoxMode = function goIntoBoxMode() { - r.data.bgActivePosistion = undefined; - - if (!r.hoverData.selecting) { - cy.emit({ - originalEvent: e, - type: 'boxstart', - position: { - x: pos[0], - y: pos[1] - } - }); - } - - select[4] = 1; - r.hoverData.selecting = true; - r.redrawHint('select', true); - r.redraw(); - }; // trigger context drag if rmouse down - - - if (r.hoverData.which === 3) { - // but only if over threshold - if (isOverThresholdDrag) { - var cxtEvt = { - originalEvent: e, - type: 'cxtdrag', - position: { - x: pos[0], - y: pos[1] - } - }; - - if (down) { - down.emit(cxtEvt); - } else { - cy.emit(cxtEvt); - } - - r.hoverData.cxtDragged = true; - - if (!r.hoverData.cxtOver || near !== r.hoverData.cxtOver) { - if (r.hoverData.cxtOver) { - r.hoverData.cxtOver.emit({ - originalEvent: e, - type: 'cxtdragout', - position: { - x: pos[0], - y: pos[1] - } - }); - } - - r.hoverData.cxtOver = near; - - if (near) { - near.emit({ - originalEvent: e, - type: 'cxtdragover', - position: { - x: pos[0], - y: pos[1] - } - }); - } - } - } // Check if we are drag panning the entire graph - - } else if (r.hoverData.dragging) { - preventDefault = true; - - if (cy.panningEnabled() && cy.userPanningEnabled()) { - var deltaP; - - if (r.hoverData.justStartedPan) { - var mdPos = r.hoverData.mdownPos; - deltaP = { - x: (pos[0] - mdPos[0]) * zoom, - y: (pos[1] - mdPos[1]) * zoom - }; - r.hoverData.justStartedPan = false; - } else { - deltaP = { - x: disp[0] * zoom, - y: disp[1] * zoom - }; - } - - cy.panBy(deltaP); - cy.emit('dragpan'); - r.hoverData.dragged = true; - } // Needs reproject due to pan changing viewport - - - pos = r.projectIntoViewport(e.clientX, e.clientY); // Checks primary button down & out of time & mouse not moved much - } else if (select[4] == 1 && (down == null || down.pannable())) { - if (isOverThresholdDrag) { - if (!r.hoverData.dragging && cy.boxSelectionEnabled() && (multSelKeyDown || !cy.panningEnabled() || !cy.userPanningEnabled())) { - goIntoBoxMode(); - } else if (!r.hoverData.selecting && cy.panningEnabled() && cy.userPanningEnabled()) { - var allowPassthrough = allowPanningPassthrough(down, r.hoverData.downs); - - if (allowPassthrough) { - r.hoverData.dragging = true; - r.hoverData.justStartedPan = true; - select[4] = 0; - r.data.bgActivePosistion = array2point(mdownPos); - r.redrawHint('select', true); - r.redraw(); - } - } - - if (down && down.pannable() && down.active()) { - down.unactivate(); - } - } - } else { - if (down && down.pannable() && down.active()) { - down.unactivate(); - } - - if ((!down || !down.grabbed()) && near != last) { - if (last) { - triggerEvents(last, ['mouseout', 'tapdragout'], e, { - x: pos[0], - y: pos[1] - }); - } - - if (near) { - triggerEvents(near, ['mouseover', 'tapdragover'], e, { - x: pos[0], - y: pos[1] - }); - } - - r.hoverData.last = near; - } - - if (down) { - if (isOverThresholdDrag) { - // then we can take action - if (cy.boxSelectionEnabled() && multSelKeyDown) { - // then selection overrides - if (down && down.grabbed()) { - freeDraggedElements(draggedElements); - down.emit('freeon'); - draggedElements.emit('free'); - - if (r.dragData.didDrag) { - down.emit('dragfreeon'); - draggedElements.emit('dragfree'); - } - } - - goIntoBoxMode(); - } else if (down && down.grabbed() && r.nodeIsDraggable(down)) { - // drag node - var justStartedDrag = !r.dragData.didDrag; - - if (justStartedDrag) { - r.redrawHint('eles', true); - } - - r.dragData.didDrag = true; // indicate that we actually did drag the node - // now, add the elements to the drag layer if not done already - - if (!r.hoverData.draggingEles) { - addNodesToDrag(draggedElements, { - inDragLayer: true - }); - } - - var totalShift = { - x: 0, - y: 0 - }; - - if (number$1(disp[0]) && number$1(disp[1])) { - totalShift.x += disp[0]; - totalShift.y += disp[1]; - - if (justStartedDrag) { - var dragDelta = r.hoverData.dragDelta; - - if (dragDelta && number$1(dragDelta[0]) && number$1(dragDelta[1])) { - totalShift.x += dragDelta[0]; - totalShift.y += dragDelta[1]; - } - } - } - - r.hoverData.draggingEles = true; - draggedElements.silentShift(totalShift).emit('position drag'); - r.redrawHint('drag', true); - r.redraw(); - } - } else { - // otherwise save drag delta for when we actually start dragging so the relative grab pos is constant - updateDragDelta(); - } - } // prevent the dragging from triggering text selection on the page - - - preventDefault = true; - } - - select[2] = pos[0]; - select[3] = pos[1]; - - if (preventDefault) { - if (e.stopPropagation) e.stopPropagation(); - if (e.preventDefault) e.preventDefault(); - return false; - } - }, false); - var clickTimeout, didDoubleClick, prevClickTimeStamp; - r.registerBinding(window, 'mouseup', function mouseupHandler(e) { - // eslint-disable-line no-undef - var capture = r.hoverData.capture; - - if (!capture) { - return; - } - - r.hoverData.capture = false; - var cy = r.cy; - var pos = r.projectIntoViewport(e.clientX, e.clientY); - var select = r.selection; - var near = r.findNearestElement(pos[0], pos[1], true, false); - var draggedElements = r.dragData.possibleDragElements; - var down = r.hoverData.down; - var multSelKeyDown = isMultSelKeyDown(e); - - if (r.data.bgActivePosistion) { - r.redrawHint('select', true); - r.redraw(); - } - - r.hoverData.tapholdCancelled = true; - r.data.bgActivePosistion = undefined; // not active bg now - - if (down) { - down.unactivate(); - } - - if (r.hoverData.which === 3) { - var cxtEvt = { - originalEvent: e, - type: 'cxttapend', - position: { - x: pos[0], - y: pos[1] - } - }; - - if (down) { - down.emit(cxtEvt); - } else { - cy.emit(cxtEvt); - } - - if (!r.hoverData.cxtDragged) { - var cxtTap = { - originalEvent: e, - type: 'cxttap', - position: { - x: pos[0], - y: pos[1] - } - }; - - if (down) { - down.emit(cxtTap); - } else { - cy.emit(cxtTap); - } - } - - r.hoverData.cxtDragged = false; - r.hoverData.which = null; - } else if (r.hoverData.which === 1) { - triggerEvents(near, ['mouseup', 'tapend', 'vmouseup'], e, { - x: pos[0], - y: pos[1] - }); - - if (!r.dragData.didDrag && // didn't move a node around - !r.hoverData.dragged && // didn't pan - !r.hoverData.selecting && // not box selection - !r.hoverData.isOverThresholdDrag // didn't move too much - ) { - triggerEvents(down, ["click", "tap", "vclick"], e, { - x: pos[0], - y: pos[1] - }); - didDoubleClick = false; - - if (e.timeStamp - prevClickTimeStamp <= cy.multiClickDebounceTime()) { - clickTimeout && clearTimeout(clickTimeout); - didDoubleClick = true; - prevClickTimeStamp = null; - triggerEvents(down, ["dblclick", "dbltap", "vdblclick"], e, { - x: pos[0], - y: pos[1] - }); - } else { - clickTimeout = setTimeout(function () { - if (didDoubleClick) return; - triggerEvents(down, ["oneclick", "onetap", "voneclick"], e, { - x: pos[0], - y: pos[1] - }); - }, cy.multiClickDebounceTime()); - prevClickTimeStamp = e.timeStamp; - } - } // Deselect all elements if nothing is currently under the mouse cursor and we aren't dragging something - - - if (down == null // not mousedown on node - && !r.dragData.didDrag // didn't move the node around - && !r.hoverData.selecting // not box selection - && !r.hoverData.dragged // didn't pan - && !isMultSelKeyDown(e)) { - cy.$(isSelected).unselect(['tapunselect']); - - if (draggedElements.length > 0) { - r.redrawHint('eles', true); - } - - r.dragData.possibleDragElements = draggedElements = cy.collection(); - } // Single selection - - - if (near == down && !r.dragData.didDrag && !r.hoverData.selecting) { - if (near != null && near._private.selectable) { - if (r.hoverData.dragging) ; else if (cy.selectionType() === 'additive' || multSelKeyDown) { - if (near.selected()) { - near.unselect(['tapunselect']); - } else { - near.select(['tapselect']); - } - } else { - if (!multSelKeyDown) { - cy.$(isSelected).unmerge(near).unselect(['tapunselect']); - near.select(['tapselect']); - } - } - - r.redrawHint('eles', true); - } - } - - if (r.hoverData.selecting) { - var box = cy.collection(r.getAllInBox(select[0], select[1], select[2], select[3])); - r.redrawHint('select', true); - - if (box.length > 0) { - r.redrawHint('eles', true); - } - - cy.emit({ - type: 'boxend', - originalEvent: e, - position: { - x: pos[0], - y: pos[1] - } - }); - - var eleWouldBeSelected = function eleWouldBeSelected(ele) { - return ele.selectable() && !ele.selected(); - }; - - if (cy.selectionType() === 'additive') { - box.emit('box').stdFilter(eleWouldBeSelected).select().emit('boxselect'); - } else { - if (!multSelKeyDown) { - cy.$(isSelected).unmerge(box).unselect(); - } - - box.emit('box').stdFilter(eleWouldBeSelected).select().emit('boxselect'); - } // always need redraw in case eles unselectable - - - r.redraw(); - } // Cancel drag pan - - - if (r.hoverData.dragging) { - r.hoverData.dragging = false; - r.redrawHint('select', true); - r.redrawHint('eles', true); - r.redraw(); - } - - if (!select[4]) { - r.redrawHint('drag', true); - r.redrawHint('eles', true); - var downWasGrabbed = down && down.grabbed(); - freeDraggedElements(draggedElements); - - if (downWasGrabbed) { - down.emit('freeon'); - draggedElements.emit('free'); - - if (r.dragData.didDrag) { - down.emit('dragfreeon'); - draggedElements.emit('dragfree'); - } - } - } - } // else not right mouse - - - select[4] = 0; - r.hoverData.down = null; - r.hoverData.cxtStarted = false; - r.hoverData.draggingEles = false; - r.hoverData.selecting = false; - r.hoverData.isOverThresholdDrag = false; - r.dragData.didDrag = false; - r.hoverData.dragged = false; - r.hoverData.dragDelta = []; - r.hoverData.mdownPos = null; - r.hoverData.mdownGPos = null; - }, false); - - var wheelHandler = function wheelHandler(e) { - if (r.scrollingPage) { - return; - } // while scrolling, ignore wheel-to-zoom - - - var cy = r.cy; - var zoom = cy.zoom(); - var pan = cy.pan(); - var pos = r.projectIntoViewport(e.clientX, e.clientY); - var rpos = [pos[0] * zoom + pan.x, pos[1] * zoom + pan.y]; - - if (r.hoverData.draggingEles || r.hoverData.dragging || r.hoverData.cxtStarted || inBoxSelection()) { - // if pan dragging or cxt dragging, wheel movements make no zoom - e.preventDefault(); - return; - } - - if (cy.panningEnabled() && cy.userPanningEnabled() && cy.zoomingEnabled() && cy.userZoomingEnabled()) { - e.preventDefault(); - r.data.wheelZooming = true; - clearTimeout(r.data.wheelTimeout); - r.data.wheelTimeout = setTimeout(function () { - r.data.wheelZooming = false; - r.redrawHint('eles', true); - r.redraw(); - }, 150); - var diff; - - if (e.deltaY != null) { - diff = e.deltaY / -250; - } else if (e.wheelDeltaY != null) { - diff = e.wheelDeltaY / 1000; - } else { - diff = e.wheelDelta / 1000; - } - - diff = diff * r.wheelSensitivity; - var needsWheelFix = e.deltaMode === 1; - - if (needsWheelFix) { - // fixes slow wheel events on ff/linux and ff/windows - diff *= 33; - } - - var newZoom = cy.zoom() * Math.pow(10, diff); - - if (e.type === 'gesturechange') { - newZoom = r.gestureStartZoom * e.scale; - } - - cy.zoom({ - level: newZoom, - renderedPosition: { - x: rpos[0], - y: rpos[1] - } - }); - cy.emit(e.type === 'gesturechange' ? 'pinchzoom' : 'scrollzoom'); - } - }; // Functions to help with whether mouse wheel should trigger zooming - // -- - - - r.registerBinding(r.container, 'wheel', wheelHandler, true); // disable nonstandard wheel events - // r.registerBinding(r.container, 'mousewheel', wheelHandler, true); - // r.registerBinding(r.container, 'DOMMouseScroll', wheelHandler, true); - // r.registerBinding(r.container, 'MozMousePixelScroll', wheelHandler, true); // older firefox - - r.registerBinding(window, 'scroll', function scrollHandler(e) { - // eslint-disable-line no-unused-vars - r.scrollingPage = true; - clearTimeout(r.scrollingPageTimeout); - r.scrollingPageTimeout = setTimeout(function () { - r.scrollingPage = false; - }, 250); - }, true); // desktop safari pinch to zoom start - - r.registerBinding(r.container, 'gesturestart', function gestureStartHandler(e) { - r.gestureStartZoom = r.cy.zoom(); - - if (!r.hasTouchStarted) { - // don't affect touch devices like iphone - e.preventDefault(); - } - }, true); - r.registerBinding(r.container, 'gesturechange', function (e) { - if (!r.hasTouchStarted) { - // don't affect touch devices like iphone - wheelHandler(e); - } - }, true); // Functions to help with handling mouseout/mouseover on the Cytoscape container - // Handle mouseout on Cytoscape container - - r.registerBinding(r.container, 'mouseout', function mouseOutHandler(e) { - var pos = r.projectIntoViewport(e.clientX, e.clientY); - r.cy.emit({ - originalEvent: e, - type: 'mouseout', - position: { - x: pos[0], - y: pos[1] - } - }); - }, false); - r.registerBinding(r.container, 'mouseover', function mouseOverHandler(e) { - var pos = r.projectIntoViewport(e.clientX, e.clientY); - r.cy.emit({ - originalEvent: e, - type: 'mouseover', - position: { - x: pos[0], - y: pos[1] - } - }); - }, false); - var f1x1, f1y1, f2x1, f2y1; // starting points for pinch-to-zoom - - var distance1, distance1Sq; // initial distance between finger 1 and finger 2 for pinch-to-zoom - - var center1, modelCenter1; // center point on start pinch to zoom - - var offsetLeft, offsetTop; - var containerWidth, containerHeight; - var twoFingersStartInside; - - var distance = function distance(x1, y1, x2, y2) { - return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); - }; - - var distanceSq = function distanceSq(x1, y1, x2, y2) { - return (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1); - }; - - var touchstartHandler; - r.registerBinding(r.container, 'touchstart', touchstartHandler = function touchstartHandler(e) { - r.hasTouchStarted = true; - - if (!eventInContainer(e)) { - return; - } - - blurActiveDomElement(); - r.touchData.capture = true; - r.data.bgActivePosistion = undefined; - var cy = r.cy; - var now = r.touchData.now; - var earlier = r.touchData.earlier; - - if (e.touches[0]) { - var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY); - now[0] = pos[0]; - now[1] = pos[1]; - } - - if (e.touches[1]) { - var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY); - now[2] = pos[0]; - now[3] = pos[1]; - } - - if (e.touches[2]) { - var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY); - now[4] = pos[0]; - now[5] = pos[1]; - } // record starting points for pinch-to-zoom - - - if (e.touches[1]) { - r.touchData.singleTouchMoved = true; - freeDraggedElements(r.dragData.touchDragEles); - var offsets = r.findContainerClientCoords(); - offsetLeft = offsets[0]; - offsetTop = offsets[1]; - containerWidth = offsets[2]; - containerHeight = offsets[3]; - f1x1 = e.touches[0].clientX - offsetLeft; - f1y1 = e.touches[0].clientY - offsetTop; - f2x1 = e.touches[1].clientX - offsetLeft; - f2y1 = e.touches[1].clientY - offsetTop; - twoFingersStartInside = 0 <= f1x1 && f1x1 <= containerWidth && 0 <= f2x1 && f2x1 <= containerWidth && 0 <= f1y1 && f1y1 <= containerHeight && 0 <= f2y1 && f2y1 <= containerHeight; - var pan = cy.pan(); - var zoom = cy.zoom(); - distance1 = distance(f1x1, f1y1, f2x1, f2y1); - distance1Sq = distanceSq(f1x1, f1y1, f2x1, f2y1); - center1 = [(f1x1 + f2x1) / 2, (f1y1 + f2y1) / 2]; - modelCenter1 = [(center1[0] - pan.x) / zoom, (center1[1] - pan.y) / zoom]; // consider context tap - - var cxtDistThreshold = 200; - var cxtDistThresholdSq = cxtDistThreshold * cxtDistThreshold; - - if (distance1Sq < cxtDistThresholdSq && !e.touches[2]) { - var near1 = r.findNearestElement(now[0], now[1], true, true); - var near2 = r.findNearestElement(now[2], now[3], true, true); - - if (near1 && near1.isNode()) { - near1.activate().emit({ - originalEvent: e, - type: 'cxttapstart', - position: { - x: now[0], - y: now[1] - } - }); - r.touchData.start = near1; - } else if (near2 && near2.isNode()) { - near2.activate().emit({ - originalEvent: e, - type: 'cxttapstart', - position: { - x: now[0], - y: now[1] - } - }); - r.touchData.start = near2; - } else { - cy.emit({ - originalEvent: e, - type: 'cxttapstart', - position: { - x: now[0], - y: now[1] - } - }); - } - - if (r.touchData.start) { - r.touchData.start._private.grabbed = false; - } - - r.touchData.cxt = true; - r.touchData.cxtDragged = false; - r.data.bgActivePosistion = undefined; - r.redraw(); - return; - } - } - - if (e.touches[2]) { - // ignore - // safari on ios pans the page otherwise (normally you should be able to preventdefault on touchmove...) - if (cy.boxSelectionEnabled()) { - e.preventDefault(); - } - } else if (e.touches[1]) ; else if (e.touches[0]) { - var nears = r.findNearestElements(now[0], now[1], true, true); - var near = nears[0]; - - if (near != null) { - near.activate(); - r.touchData.start = near; - r.touchData.starts = nears; - - if (r.nodeIsGrabbable(near)) { - var draggedEles = r.dragData.touchDragEles = cy.collection(); - var selectedNodes = null; - r.redrawHint('eles', true); - r.redrawHint('drag', true); - - if (near.selected()) { - // reset drag elements, since near will be added again - selectedNodes = cy.$(function (ele) { - return ele.selected() && r.nodeIsGrabbable(ele); - }); - addNodesToDrag(selectedNodes, { - addToList: draggedEles - }); - } else { - addNodeToDrag(near, { - addToList: draggedEles - }); - } - - setGrabTarget(near); - - var makeEvent = function makeEvent(type) { - return { - originalEvent: e, - type: type, - position: { - x: now[0], - y: now[1] - } - }; - }; - - near.emit(makeEvent('grabon')); - - if (selectedNodes) { - selectedNodes.forEach(function (n) { - n.emit(makeEvent('grab')); - }); - } else { - near.emit(makeEvent('grab')); - } - } - } - - triggerEvents(near, ['touchstart', 'tapstart', 'vmousedown'], e, { - x: now[0], - y: now[1] - }); - - if (near == null) { - r.data.bgActivePosistion = { - x: pos[0], - y: pos[1] - }; - r.redrawHint('select', true); - r.redraw(); - } // Tap, taphold - // ----- - - - r.touchData.singleTouchMoved = false; - r.touchData.singleTouchStartTime = +new Date(); - clearTimeout(r.touchData.tapholdTimeout); - r.touchData.tapholdTimeout = setTimeout(function () { - if (r.touchData.singleTouchMoved === false && !r.pinching // if pinching, then taphold unselect shouldn't take effect - && !r.touchData.selecting // box selection shouldn't allow taphold through - ) { - triggerEvents(r.touchData.start, ['taphold'], e, { - x: now[0], - y: now[1] - }); - } - }, r.tapholdDuration); - } - - if (e.touches.length >= 1) { - var sPos = r.touchData.startPosition = []; - - for (var i = 0; i < now.length; i++) { - sPos[i] = earlier[i] = now[i]; - } - - var touch0 = e.touches[0]; - r.touchData.startGPosition = [touch0.clientX, touch0.clientY]; - } - }, false); - var touchmoveHandler; - r.registerBinding(window, 'touchmove', touchmoveHandler = function touchmoveHandler(e) { - // eslint-disable-line no-undef - var capture = r.touchData.capture; - - if (!capture && !eventInContainer(e)) { - return; - } - - var select = r.selection; - var cy = r.cy; - var now = r.touchData.now; - var earlier = r.touchData.earlier; - var zoom = cy.zoom(); - - if (e.touches[0]) { - var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY); - now[0] = pos[0]; - now[1] = pos[1]; - } - - if (e.touches[1]) { - var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY); - now[2] = pos[0]; - now[3] = pos[1]; - } - - if (e.touches[2]) { - var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY); - now[4] = pos[0]; - now[5] = pos[1]; - } - - var startGPos = r.touchData.startGPosition; - var isOverThresholdDrag; - - if (capture && e.touches[0] && startGPos) { - var disp = []; - - for (var j = 0; j < now.length; j++) { - disp[j] = now[j] - earlier[j]; - } - - var dx = e.touches[0].clientX - startGPos[0]; - var dx2 = dx * dx; - var dy = e.touches[0].clientY - startGPos[1]; - var dy2 = dy * dy; - var dist2 = dx2 + dy2; - isOverThresholdDrag = dist2 >= r.touchTapThreshold2; - } // context swipe cancelling - - - if (capture && r.touchData.cxt) { - e.preventDefault(); - var f1x2 = e.touches[0].clientX - offsetLeft, - f1y2 = e.touches[0].clientY - offsetTop; - var f2x2 = e.touches[1].clientX - offsetLeft, - f2y2 = e.touches[1].clientY - offsetTop; // var distance2 = distance( f1x2, f1y2, f2x2, f2y2 ); - - var distance2Sq = distanceSq(f1x2, f1y2, f2x2, f2y2); - var factorSq = distance2Sq / distance1Sq; - var distThreshold = 150; - var distThresholdSq = distThreshold * distThreshold; - var factorThreshold = 1.5; - var factorThresholdSq = factorThreshold * factorThreshold; // cancel ctx gestures if the distance b/t the fingers increases - - if (factorSq >= factorThresholdSq || distance2Sq >= distThresholdSq) { - r.touchData.cxt = false; - r.data.bgActivePosistion = undefined; - r.redrawHint('select', true); - var cxtEvt = { - originalEvent: e, - type: 'cxttapend', - position: { - x: now[0], - y: now[1] - } - }; - - if (r.touchData.start) { - r.touchData.start.unactivate().emit(cxtEvt); - r.touchData.start = null; - } else { - cy.emit(cxtEvt); - } - } - } // context swipe - - - if (capture && r.touchData.cxt) { - var cxtEvt = { - originalEvent: e, - type: 'cxtdrag', - position: { - x: now[0], - y: now[1] - } - }; - r.data.bgActivePosistion = undefined; - r.redrawHint('select', true); - - if (r.touchData.start) { - r.touchData.start.emit(cxtEvt); - } else { - cy.emit(cxtEvt); - } - - if (r.touchData.start) { - r.touchData.start._private.grabbed = false; - } - - r.touchData.cxtDragged = true; - var near = r.findNearestElement(now[0], now[1], true, true); - - if (!r.touchData.cxtOver || near !== r.touchData.cxtOver) { - if (r.touchData.cxtOver) { - r.touchData.cxtOver.emit({ - originalEvent: e, - type: 'cxtdragout', - position: { - x: now[0], - y: now[1] - } - }); - } - - r.touchData.cxtOver = near; - - if (near) { - near.emit({ - originalEvent: e, - type: 'cxtdragover', - position: { - x: now[0], - y: now[1] - } - }); - } - } // box selection - - } else if (capture && e.touches[2] && cy.boxSelectionEnabled()) { - e.preventDefault(); - r.data.bgActivePosistion = undefined; - this.lastThreeTouch = +new Date(); - - if (!r.touchData.selecting) { - cy.emit({ - originalEvent: e, - type: 'boxstart', - position: { - x: now[0], - y: now[1] - } - }); - } - - r.touchData.selecting = true; - r.touchData.didSelect = true; - select[4] = 1; - - if (!select || select.length === 0 || select[0] === undefined) { - select[0] = (now[0] + now[2] + now[4]) / 3; - select[1] = (now[1] + now[3] + now[5]) / 3; - select[2] = (now[0] + now[2] + now[4]) / 3 + 1; - select[3] = (now[1] + now[3] + now[5]) / 3 + 1; - } else { - select[2] = (now[0] + now[2] + now[4]) / 3; - select[3] = (now[1] + now[3] + now[5]) / 3; - } - - r.redrawHint('select', true); - r.redraw(); // pinch to zoom - } else if (capture && e.touches[1] && !r.touchData.didSelect // don't allow box selection to degrade to pinch-to-zoom - && cy.zoomingEnabled() && cy.panningEnabled() && cy.userZoomingEnabled() && cy.userPanningEnabled()) { - // two fingers => pinch to zoom - e.preventDefault(); - r.data.bgActivePosistion = undefined; - r.redrawHint('select', true); - var draggedEles = r.dragData.touchDragEles; - - if (draggedEles) { - r.redrawHint('drag', true); - - for (var i = 0; i < draggedEles.length; i++) { - var de_p = draggedEles[i]._private; - de_p.grabbed = false; - de_p.rscratch.inDragLayer = false; - } - } - - var _start = r.touchData.start; // (x2, y2) for fingers 1 and 2 - - var f1x2 = e.touches[0].clientX - offsetLeft, - f1y2 = e.touches[0].clientY - offsetTop; - var f2x2 = e.touches[1].clientX - offsetLeft, - f2y2 = e.touches[1].clientY - offsetTop; - var distance2 = distance(f1x2, f1y2, f2x2, f2y2); // var distance2Sq = distanceSq( f1x2, f1y2, f2x2, f2y2 ); - // var factor = Math.sqrt( distance2Sq ) / Math.sqrt( distance1Sq ); - - var factor = distance2 / distance1; - - if (twoFingersStartInside) { - // delta finger1 - var df1x = f1x2 - f1x1; - var df1y = f1y2 - f1y1; // delta finger 2 - - var df2x = f2x2 - f2x1; - var df2y = f2y2 - f2y1; // translation is the normalised vector of the two fingers movement - // i.e. so pinching cancels out and moving together pans - - var tx = (df1x + df2x) / 2; - var ty = (df1y + df2y) / 2; // now calculate the zoom - - var zoom1 = cy.zoom(); - var zoom2 = zoom1 * factor; - var pan1 = cy.pan(); // the model center point converted to the current rendered pos - - var ctrx = modelCenter1[0] * zoom1 + pan1.x; - var ctry = modelCenter1[1] * zoom1 + pan1.y; - var pan2 = { - x: -zoom2 / zoom1 * (ctrx - pan1.x - tx) + ctrx, - y: -zoom2 / zoom1 * (ctry - pan1.y - ty) + ctry - }; // remove dragged eles - - if (_start && _start.active()) { - var draggedEles = r.dragData.touchDragEles; - freeDraggedElements(draggedEles); - r.redrawHint('drag', true); - r.redrawHint('eles', true); - - _start.unactivate().emit('freeon'); - - draggedEles.emit('free'); - - if (r.dragData.didDrag) { - _start.emit('dragfreeon'); - - draggedEles.emit('dragfree'); - } - } - - cy.viewport({ - zoom: zoom2, - pan: pan2, - cancelOnFailedZoom: true - }); - cy.emit('pinchzoom'); - distance1 = distance2; - f1x1 = f1x2; - f1y1 = f1y2; - f2x1 = f2x2; - f2y1 = f2y2; - r.pinching = true; - } // Re-project - - - if (e.touches[0]) { - var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY); - now[0] = pos[0]; - now[1] = pos[1]; - } - - if (e.touches[1]) { - var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY); - now[2] = pos[0]; - now[3] = pos[1]; - } - - if (e.touches[2]) { - var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY); - now[4] = pos[0]; - now[5] = pos[1]; - } - } else if (e.touches[0] && !r.touchData.didSelect // don't allow box selection to degrade to single finger events like panning - ) { - var start = r.touchData.start; - var last = r.touchData.last; - var near; - - if (!r.hoverData.draggingEles && !r.swipePanning) { - near = r.findNearestElement(now[0], now[1], true, true); - } - - if (capture && start != null) { - e.preventDefault(); - } // dragging nodes - - - if (capture && start != null && r.nodeIsDraggable(start)) { - if (isOverThresholdDrag) { - // then dragging can happen - var draggedEles = r.dragData.touchDragEles; - var justStartedDrag = !r.dragData.didDrag; - - if (justStartedDrag) { - addNodesToDrag(draggedEles, { - inDragLayer: true - }); - } - - r.dragData.didDrag = true; - var totalShift = { - x: 0, - y: 0 - }; - - if (number$1(disp[0]) && number$1(disp[1])) { - totalShift.x += disp[0]; - totalShift.y += disp[1]; - - if (justStartedDrag) { - r.redrawHint('eles', true); - var dragDelta = r.touchData.dragDelta; - - if (dragDelta && number$1(dragDelta[0]) && number$1(dragDelta[1])) { - totalShift.x += dragDelta[0]; - totalShift.y += dragDelta[1]; - } - } - } - - r.hoverData.draggingEles = true; - draggedEles.silentShift(totalShift).emit('position drag'); - r.redrawHint('drag', true); - - if (r.touchData.startPosition[0] == earlier[0] && r.touchData.startPosition[1] == earlier[1]) { - r.redrawHint('eles', true); - } - - r.redraw(); - } else { - // otherwise keep track of drag delta for later - var dragDelta = r.touchData.dragDelta = r.touchData.dragDelta || []; - - if (dragDelta.length === 0) { - dragDelta.push(disp[0]); - dragDelta.push(disp[1]); - } else { - dragDelta[0] += disp[0]; - dragDelta[1] += disp[1]; - } - } - } // touchmove - - - { - triggerEvents(start || near, ['touchmove', 'tapdrag', 'vmousemove'], e, { - x: now[0], - y: now[1] - }); - - if ((!start || !start.grabbed()) && near != last) { - if (last) { - last.emit({ - originalEvent: e, - type: 'tapdragout', - position: { - x: now[0], - y: now[1] - } - }); - } - - if (near) { - near.emit({ - originalEvent: e, - type: 'tapdragover', - position: { - x: now[0], - y: now[1] - } - }); - } - } - - r.touchData.last = near; - } // check to cancel taphold - - if (capture) { - for (var i = 0; i < now.length; i++) { - if (now[i] && r.touchData.startPosition[i] && isOverThresholdDrag) { - r.touchData.singleTouchMoved = true; - } - } - } // panning - - - if (capture && (start == null || start.pannable()) && cy.panningEnabled() && cy.userPanningEnabled()) { - var allowPassthrough = allowPanningPassthrough(start, r.touchData.starts); - - if (allowPassthrough) { - e.preventDefault(); - - if (!r.data.bgActivePosistion) { - r.data.bgActivePosistion = array2point(r.touchData.startPosition); - } - - if (r.swipePanning) { - cy.panBy({ - x: disp[0] * zoom, - y: disp[1] * zoom - }); - cy.emit('dragpan'); - } else if (isOverThresholdDrag) { - r.swipePanning = true; - cy.panBy({ - x: dx * zoom, - y: dy * zoom - }); - cy.emit('dragpan'); - - if (start) { - start.unactivate(); - r.redrawHint('select', true); - r.touchData.start = null; - } - } - } // Re-project - - - var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY); - now[0] = pos[0]; - now[1] = pos[1]; - } - } - - for (var j = 0; j < now.length; j++) { - earlier[j] = now[j]; - } // the active bg indicator should be removed when making a swipe that is neither for dragging nodes or panning - - - if (capture && e.touches.length > 0 && !r.hoverData.draggingEles && !r.swipePanning && r.data.bgActivePosistion != null) { - r.data.bgActivePosistion = undefined; - r.redrawHint('select', true); - r.redraw(); - } - }, false); - var touchcancelHandler; - r.registerBinding(window, 'touchcancel', touchcancelHandler = function touchcancelHandler(e) { - // eslint-disable-line no-unused-vars - var start = r.touchData.start; - r.touchData.capture = false; - - if (start) { - start.unactivate(); - } - }); - var touchendHandler, didDoubleTouch, touchTimeout, prevTouchTimeStamp; - r.registerBinding(window, 'touchend', touchendHandler = function touchendHandler(e) { - // eslint-disable-line no-unused-vars - var start = r.touchData.start; - var capture = r.touchData.capture; - - if (capture) { - if (e.touches.length === 0) { - r.touchData.capture = false; - } - - e.preventDefault(); - } else { - return; - } - - var select = r.selection; - r.swipePanning = false; - r.hoverData.draggingEles = false; - var cy = r.cy; - var zoom = cy.zoom(); - var now = r.touchData.now; - var earlier = r.touchData.earlier; - - if (e.touches[0]) { - var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY); - now[0] = pos[0]; - now[1] = pos[1]; - } - - if (e.touches[1]) { - var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY); - now[2] = pos[0]; - now[3] = pos[1]; - } - - if (e.touches[2]) { - var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY); - now[4] = pos[0]; - now[5] = pos[1]; - } - - if (start) { - start.unactivate(); - } - - var ctxTapend; - - if (r.touchData.cxt) { - ctxTapend = { - originalEvent: e, - type: 'cxttapend', - position: { - x: now[0], - y: now[1] - } - }; - - if (start) { - start.emit(ctxTapend); - } else { - cy.emit(ctxTapend); - } - - if (!r.touchData.cxtDragged) { - var ctxTap = { - originalEvent: e, - type: 'cxttap', - position: { - x: now[0], - y: now[1] - } - }; - - if (start) { - start.emit(ctxTap); - } else { - cy.emit(ctxTap); - } - } - - if (r.touchData.start) { - r.touchData.start._private.grabbed = false; - } - - r.touchData.cxt = false; - r.touchData.start = null; - r.redraw(); - return; - } // no more box selection if we don't have three fingers - - - if (!e.touches[2] && cy.boxSelectionEnabled() && r.touchData.selecting) { - r.touchData.selecting = false; - var box = cy.collection(r.getAllInBox(select[0], select[1], select[2], select[3])); - select[0] = undefined; - select[1] = undefined; - select[2] = undefined; - select[3] = undefined; - select[4] = 0; - r.redrawHint('select', true); - cy.emit({ - type: 'boxend', - originalEvent: e, - position: { - x: now[0], - y: now[1] - } - }); - - var eleWouldBeSelected = function eleWouldBeSelected(ele) { - return ele.selectable() && !ele.selected(); - }; - - box.emit('box').stdFilter(eleWouldBeSelected).select().emit('boxselect'); - - if (box.nonempty()) { - r.redrawHint('eles', true); - } - - r.redraw(); - } - - if (start != null) { - start.unactivate(); - } - - if (e.touches[2]) { - r.data.bgActivePosistion = undefined; - r.redrawHint('select', true); - } else if (e.touches[1]) ; else if (e.touches[0]) ; else if (!e.touches[0]) { - r.data.bgActivePosistion = undefined; - r.redrawHint('select', true); - var draggedEles = r.dragData.touchDragEles; - - if (start != null) { - var startWasGrabbed = start._private.grabbed; - freeDraggedElements(draggedEles); - r.redrawHint('drag', true); - r.redrawHint('eles', true); - - if (startWasGrabbed) { - start.emit('freeon'); - draggedEles.emit('free'); - - if (r.dragData.didDrag) { - start.emit('dragfreeon'); - draggedEles.emit('dragfree'); - } - } - - triggerEvents(start, ['touchend', 'tapend', 'vmouseup', 'tapdragout'], e, { - x: now[0], - y: now[1] - }); - start.unactivate(); - r.touchData.start = null; - } else { - var near = r.findNearestElement(now[0], now[1], true, true); - triggerEvents(near, ['touchend', 'tapend', 'vmouseup', 'tapdragout'], e, { - x: now[0], - y: now[1] - }); - } - - var dx = r.touchData.startPosition[0] - now[0]; - var dx2 = dx * dx; - var dy = r.touchData.startPosition[1] - now[1]; - var dy2 = dy * dy; - var dist2 = dx2 + dy2; - var rdist2 = dist2 * zoom * zoom; // Tap event, roughly same as mouse click event for touch - - if (!r.touchData.singleTouchMoved) { - if (!start) { - cy.$(':selected').unselect(['tapunselect']); - } - - triggerEvents(start, ['tap', 'vclick'], e, { - x: now[0], - y: now[1] - }); - didDoubleTouch = false; - - if (e.timeStamp - prevTouchTimeStamp <= cy.multiClickDebounceTime()) { - touchTimeout && clearTimeout(touchTimeout); - didDoubleTouch = true; - prevTouchTimeStamp = null; - triggerEvents(start, ['dbltap', 'vdblclick'], e, { - x: now[0], - y: now[1] - }); - } else { - touchTimeout = setTimeout(function () { - if (didDoubleTouch) return; - triggerEvents(start, ['onetap', 'voneclick'], e, { - x: now[0], - y: now[1] - }); - }, cy.multiClickDebounceTime()); - prevTouchTimeStamp = e.timeStamp; - } - } // Prepare to select the currently touched node, only if it hasn't been dragged past a certain distance - - - if (start != null && !r.dragData.didDrag // didn't drag nodes around - && start._private.selectable && rdist2 < r.touchTapThreshold2 && !r.pinching // pinch to zoom should not affect selection - ) { - if (cy.selectionType() === 'single') { - cy.$(isSelected).unmerge(start).unselect(['tapunselect']); - start.select(['tapselect']); - } else { - if (start.selected()) { - start.unselect(['tapunselect']); - } else { - start.select(['tapselect']); - } - } - - r.redrawHint('eles', true); - } - - r.touchData.singleTouchMoved = true; - } - - for (var j = 0; j < now.length; j++) { - earlier[j] = now[j]; - } - - r.dragData.didDrag = false; // reset for next touchstart - - if (e.touches.length === 0) { - r.touchData.dragDelta = []; - r.touchData.startPosition = null; - r.touchData.startGPosition = null; - r.touchData.didSelect = false; - } - - if (e.touches.length < 2) { - if (e.touches.length === 1) { - // the old start global pos'n may not be the same finger that remains - r.touchData.startGPosition = [e.touches[0].clientX, e.touches[0].clientY]; - } - - r.pinching = false; - r.redrawHint('eles', true); - r.redraw(); - } //r.redraw(); - - }, false); // fallback compatibility layer for ms pointer events - - if (typeof TouchEvent === 'undefined') { - var pointers = []; - - var makeTouch = function makeTouch(e) { - return { - clientX: e.clientX, - clientY: e.clientY, - force: 1, - identifier: e.pointerId, - pageX: e.pageX, - pageY: e.pageY, - radiusX: e.width / 2, - radiusY: e.height / 2, - screenX: e.screenX, - screenY: e.screenY, - target: e.target - }; - }; - - var makePointer = function makePointer(e) { - return { - event: e, - touch: makeTouch(e) - }; - }; - - var addPointer = function addPointer(e) { - pointers.push(makePointer(e)); - }; - - var removePointer = function removePointer(e) { - for (var i = 0; i < pointers.length; i++) { - var p = pointers[i]; - - if (p.event.pointerId === e.pointerId) { - pointers.splice(i, 1); - return; - } - } - }; - - var updatePointer = function updatePointer(e) { - var p = pointers.filter(function (p) { - return p.event.pointerId === e.pointerId; - })[0]; - p.event = e; - p.touch = makeTouch(e); - }; - - var addTouchesToEvent = function addTouchesToEvent(e) { - e.touches = pointers.map(function (p) { - return p.touch; - }); - }; - - var pointerIsMouse = function pointerIsMouse(e) { - return e.pointerType === 'mouse' || e.pointerType === 4; - }; - - r.registerBinding(r.container, 'pointerdown', function (e) { - if (pointerIsMouse(e)) { - return; - } // mouse already handled - - - e.preventDefault(); - addPointer(e); - addTouchesToEvent(e); - touchstartHandler(e); - }); - r.registerBinding(r.container, 'pointerup', function (e) { - if (pointerIsMouse(e)) { - return; - } // mouse already handled - - - removePointer(e); - addTouchesToEvent(e); - touchendHandler(e); - }); - r.registerBinding(r.container, 'pointercancel', function (e) { - if (pointerIsMouse(e)) { - return; - } // mouse already handled - - - removePointer(e); - addTouchesToEvent(e); - touchcancelHandler(e); - }); - r.registerBinding(r.container, 'pointermove', function (e) { - if (pointerIsMouse(e)) { - return; - } // mouse already handled - - - e.preventDefault(); - updatePointer(e); - addTouchesToEvent(e); - touchmoveHandler(e); - }); - } -}; - -var BRp$2 = {}; - -BRp$2.generatePolygon = function (name, points) { - return this.nodeShapes[name] = { - renderer: this, - name: name, - points: points, - draw: function draw(context, centerX, centerY, width, height) { - this.renderer.nodeShapeImpl('polygon', context, centerX, centerY, width, height, this.points); - }, - intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { - return polygonIntersectLine(x, y, this.points, nodeX, nodeY, width / 2, height / 2, padding); - }, - checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { - return pointInsidePolygon(x, y, this.points, centerX, centerY, width, height, [0, -1], padding); - } - }; -}; - -BRp$2.generateEllipse = function () { - return this.nodeShapes['ellipse'] = { - renderer: this, - name: 'ellipse', - draw: function draw(context, centerX, centerY, width, height) { - this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); - }, - intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { - return intersectLineEllipse(x, y, nodeX, nodeY, width / 2 + padding, height / 2 + padding); - }, - checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { - return checkInEllipse(x, y, width, height, centerX, centerY, padding); - } - }; -}; - -BRp$2.generateRoundPolygon = function (name, points) { - // Pre-compute control points - // Since these points depend on the radius length (which in turns depend on the width/height of the node) we will only pre-compute - // the unit vectors. - // For simplicity the layout will be: - // [ p0, UnitVectorP0P1, p1, UniVectorP1P2, ..., pn, UnitVectorPnP0 ] - var allPoints = new Array(points.length * 2); - - for (var i = 0; i < points.length / 2; i++) { - var sourceIndex = i * 2; - var destIndex = void 0; - - if (i < points.length / 2 - 1) { - destIndex = (i + 1) * 2; - } else { - destIndex = 0; - } - - allPoints[i * 4] = points[sourceIndex]; - allPoints[i * 4 + 1] = points[sourceIndex + 1]; - var xDest = points[destIndex] - points[sourceIndex]; - var yDest = points[destIndex + 1] - points[sourceIndex + 1]; - var norm = Math.sqrt(xDest * xDest + yDest * yDest); - allPoints[i * 4 + 2] = xDest / norm; - allPoints[i * 4 + 3] = yDest / norm; - } - - return this.nodeShapes[name] = { - renderer: this, - name: name, - points: allPoints, - draw: function draw(context, centerX, centerY, width, height) { - this.renderer.nodeShapeImpl('round-polygon', context, centerX, centerY, width, height, this.points); - }, - intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { - return roundPolygonIntersectLine(x, y, this.points, nodeX, nodeY, width, height); - }, - checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { - return pointInsideRoundPolygon(x, y, this.points, centerX, centerY, width, height); - } - }; -}; - -BRp$2.generateRoundRectangle = function () { - return this.nodeShapes['round-rectangle'] = this.nodeShapes['roundrectangle'] = { - renderer: this, - name: 'round-rectangle', - points: generateUnitNgonPointsFitToSquare(4, 0), - draw: function draw(context, centerX, centerY, width, height) { - this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); - }, - intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { - return roundRectangleIntersectLine(x, y, nodeX, nodeY, width, height, padding); - }, - checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { - var cornerRadius = getRoundRectangleRadius(width, height); - var diam = cornerRadius * 2; // Check hBox - - if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - diam, [0, -1], padding)) { - return true; - } // Check vBox - - - if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - diam, height, [0, -1], padding)) { - return true; - } // Check top left quarter circle - - - if (checkInEllipse(x, y, diam, diam, centerX - width / 2 + cornerRadius, centerY - height / 2 + cornerRadius, padding)) { - return true; - } // Check top right quarter circle - - - if (checkInEllipse(x, y, diam, diam, centerX + width / 2 - cornerRadius, centerY - height / 2 + cornerRadius, padding)) { - return true; - } // Check bottom right quarter circle - - - if (checkInEllipse(x, y, diam, diam, centerX + width / 2 - cornerRadius, centerY + height / 2 - cornerRadius, padding)) { - return true; - } // Check bottom left quarter circle - - - if (checkInEllipse(x, y, diam, diam, centerX - width / 2 + cornerRadius, centerY + height / 2 - cornerRadius, padding)) { - return true; - } - - return false; - } - }; -}; - -BRp$2.generateCutRectangle = function () { - return this.nodeShapes['cut-rectangle'] = this.nodeShapes['cutrectangle'] = { - renderer: this, - name: 'cut-rectangle', - cornerLength: getCutRectangleCornerLength(), - points: generateUnitNgonPointsFitToSquare(4, 0), - draw: function draw(context, centerX, centerY, width, height) { - this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); - }, - generateCutTrianglePts: function generateCutTrianglePts(width, height, centerX, centerY) { - var cl = this.cornerLength; - var hh = height / 2; - var hw = width / 2; - var xBegin = centerX - hw; - var xEnd = centerX + hw; - var yBegin = centerY - hh; - var yEnd = centerY + hh; // points are in clockwise order, inner (imaginary) triangle pt on [4, 5] - - return { - topLeft: [xBegin, yBegin + cl, xBegin + cl, yBegin, xBegin + cl, yBegin + cl], - topRight: [xEnd - cl, yBegin, xEnd, yBegin + cl, xEnd - cl, yBegin + cl], - bottomRight: [xEnd, yEnd - cl, xEnd - cl, yEnd, xEnd - cl, yEnd - cl], - bottomLeft: [xBegin + cl, yEnd, xBegin, yEnd - cl, xBegin + cl, yEnd - cl] - }; - }, - intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { - var cPts = this.generateCutTrianglePts(width + 2 * padding, height + 2 * padding, nodeX, nodeY); - var pts = [].concat.apply([], [cPts.topLeft.splice(0, 4), cPts.topRight.splice(0, 4), cPts.bottomRight.splice(0, 4), cPts.bottomLeft.splice(0, 4)]); - return polygonIntersectLine(x, y, pts, nodeX, nodeY); - }, - checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { - // Check hBox - if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - 2 * this.cornerLength, [0, -1], padding)) { - return true; - } // Check vBox - - - if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - 2 * this.cornerLength, height, [0, -1], padding)) { - return true; - } - - var cutTrianglePts = this.generateCutTrianglePts(width, height, centerX, centerY); - return pointInsidePolygonPoints(x, y, cutTrianglePts.topLeft) || pointInsidePolygonPoints(x, y, cutTrianglePts.topRight) || pointInsidePolygonPoints(x, y, cutTrianglePts.bottomRight) || pointInsidePolygonPoints(x, y, cutTrianglePts.bottomLeft); - } - }; -}; - -BRp$2.generateBarrel = function () { - return this.nodeShapes['barrel'] = { - renderer: this, - name: 'barrel', - points: generateUnitNgonPointsFitToSquare(4, 0), - draw: function draw(context, centerX, centerY, width, height) { - this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); - }, - intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { - // use two fixed t values for the bezier curve approximation - var t0 = 0.15; - var t1 = 0.5; - var t2 = 0.85; - var bPts = this.generateBarrelBezierPts(width + 2 * padding, height + 2 * padding, nodeX, nodeY); - - var approximateBarrelCurvePts = function approximateBarrelCurvePts(pts) { - // approximate curve pts based on the two t values - var m0 = qbezierPtAt({ - x: pts[0], - y: pts[1] - }, { - x: pts[2], - y: pts[3] - }, { - x: pts[4], - y: pts[5] - }, t0); - var m1 = qbezierPtAt({ - x: pts[0], - y: pts[1] - }, { - x: pts[2], - y: pts[3] - }, { - x: pts[4], - y: pts[5] - }, t1); - var m2 = qbezierPtAt({ - x: pts[0], - y: pts[1] - }, { - x: pts[2], - y: pts[3] - }, { - x: pts[4], - y: pts[5] - }, t2); - return [pts[0], pts[1], m0.x, m0.y, m1.x, m1.y, m2.x, m2.y, pts[4], pts[5]]; - }; - - var pts = [].concat(approximateBarrelCurvePts(bPts.topLeft), approximateBarrelCurvePts(bPts.topRight), approximateBarrelCurvePts(bPts.bottomRight), approximateBarrelCurvePts(bPts.bottomLeft)); - return polygonIntersectLine(x, y, pts, nodeX, nodeY); - }, - generateBarrelBezierPts: function generateBarrelBezierPts(width, height, centerX, centerY) { - var hh = height / 2; - var hw = width / 2; - var xBegin = centerX - hw; - var xEnd = centerX + hw; - var yBegin = centerY - hh; - var yEnd = centerY + hh; - var curveConstants = getBarrelCurveConstants(width, height); - var hOffset = curveConstants.heightOffset; - var wOffset = curveConstants.widthOffset; - var ctrlPtXOffset = curveConstants.ctrlPtOffsetPct * width; // points are in clockwise order, inner (imaginary) control pt on [4, 5] - - var pts = { - topLeft: [xBegin, yBegin + hOffset, xBegin + ctrlPtXOffset, yBegin, xBegin + wOffset, yBegin], - topRight: [xEnd - wOffset, yBegin, xEnd - ctrlPtXOffset, yBegin, xEnd, yBegin + hOffset], - bottomRight: [xEnd, yEnd - hOffset, xEnd - ctrlPtXOffset, yEnd, xEnd - wOffset, yEnd], - bottomLeft: [xBegin + wOffset, yEnd, xBegin + ctrlPtXOffset, yEnd, xBegin, yEnd - hOffset] - }; - pts.topLeft.isTop = true; - pts.topRight.isTop = true; - pts.bottomLeft.isBottom = true; - pts.bottomRight.isBottom = true; - return pts; - }, - checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { - var curveConstants = getBarrelCurveConstants(width, height); - var hOffset = curveConstants.heightOffset; - var wOffset = curveConstants.widthOffset; // Check hBox - - if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - 2 * hOffset, [0, -1], padding)) { - return true; - } // Check vBox - - - if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - 2 * wOffset, height, [0, -1], padding)) { - return true; - } - - var barrelCurvePts = this.generateBarrelBezierPts(width, height, centerX, centerY); - - var getCurveT = function getCurveT(x, y, curvePts) { - var x0 = curvePts[4]; - var x1 = curvePts[2]; - var x2 = curvePts[0]; - var y0 = curvePts[5]; // var y1 = curvePts[ 3 ]; - - var y2 = curvePts[1]; - var xMin = Math.min(x0, x2); - var xMax = Math.max(x0, x2); - var yMin = Math.min(y0, y2); - var yMax = Math.max(y0, y2); - - if (xMin <= x && x <= xMax && yMin <= y && y <= yMax) { - var coeff = bezierPtsToQuadCoeff(x0, x1, x2); - var roots = solveQuadratic(coeff[0], coeff[1], coeff[2], x); - var validRoots = roots.filter(function (r) { - return 0 <= r && r <= 1; - }); - - if (validRoots.length > 0) { - return validRoots[0]; - } - } - - return null; - }; - - var curveRegions = Object.keys(barrelCurvePts); - - for (var i = 0; i < curveRegions.length; i++) { - var corner = curveRegions[i]; - var cornerPts = barrelCurvePts[corner]; - var t = getCurveT(x, y, cornerPts); - - if (t == null) { - continue; - } - - var y0 = cornerPts[5]; - var y1 = cornerPts[3]; - var y2 = cornerPts[1]; - var bezY = qbezierAt(y0, y1, y2, t); - - if (cornerPts.isTop && bezY <= y) { - return true; - } - - if (cornerPts.isBottom && y <= bezY) { - return true; - } - } - - return false; - } - }; -}; - -BRp$2.generateBottomRoundrectangle = function () { - return this.nodeShapes['bottom-round-rectangle'] = this.nodeShapes['bottomroundrectangle'] = { - renderer: this, - name: 'bottom-round-rectangle', - points: generateUnitNgonPointsFitToSquare(4, 0), - draw: function draw(context, centerX, centerY, width, height) { - this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); - }, - intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { - var topStartX = nodeX - (width / 2 + padding); - var topStartY = nodeY - (height / 2 + padding); - var topEndY = topStartY; - var topEndX = nodeX + (width / 2 + padding); - var topIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, topStartX, topStartY, topEndX, topEndY, false); - - if (topIntersections.length > 0) { - return topIntersections; - } - - return roundRectangleIntersectLine(x, y, nodeX, nodeY, width, height, padding); - }, - checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { - var cornerRadius = getRoundRectangleRadius(width, height); - var diam = 2 * cornerRadius; // Check hBox - - if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - diam, [0, -1], padding)) { - return true; - } // Check vBox - - - if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - diam, height, [0, -1], padding)) { - return true; - } // check non-rounded top side - - - var outerWidth = width / 2 + 2 * padding; - var outerHeight = height / 2 + 2 * padding; - var points = [centerX - outerWidth, centerY - outerHeight, centerX - outerWidth, centerY, centerX + outerWidth, centerY, centerX + outerWidth, centerY - outerHeight]; - - if (pointInsidePolygonPoints(x, y, points)) { - return true; - } // Check bottom right quarter circle - - - if (checkInEllipse(x, y, diam, diam, centerX + width / 2 - cornerRadius, centerY + height / 2 - cornerRadius, padding)) { - return true; - } // Check bottom left quarter circle - - - if (checkInEllipse(x, y, diam, diam, centerX - width / 2 + cornerRadius, centerY + height / 2 - cornerRadius, padding)) { - return true; - } - - return false; - } - }; -}; - -BRp$2.registerNodeShapes = function () { - var nodeShapes = this.nodeShapes = {}; - var renderer = this; - this.generateEllipse(); - this.generatePolygon('triangle', generateUnitNgonPointsFitToSquare(3, 0)); - this.generateRoundPolygon('round-triangle', generateUnitNgonPointsFitToSquare(3, 0)); - this.generatePolygon('rectangle', generateUnitNgonPointsFitToSquare(4, 0)); - nodeShapes['square'] = nodeShapes['rectangle']; - this.generateRoundRectangle(); - this.generateCutRectangle(); - this.generateBarrel(); - this.generateBottomRoundrectangle(); - { - var diamondPoints = [0, 1, 1, 0, 0, -1, -1, 0]; - this.generatePolygon('diamond', diamondPoints); - this.generateRoundPolygon('round-diamond', diamondPoints); - } - this.generatePolygon('pentagon', generateUnitNgonPointsFitToSquare(5, 0)); - this.generateRoundPolygon('round-pentagon', generateUnitNgonPointsFitToSquare(5, 0)); - this.generatePolygon('hexagon', generateUnitNgonPointsFitToSquare(6, 0)); - this.generateRoundPolygon('round-hexagon', generateUnitNgonPointsFitToSquare(6, 0)); - this.generatePolygon('heptagon', generateUnitNgonPointsFitToSquare(7, 0)); - this.generateRoundPolygon('round-heptagon', generateUnitNgonPointsFitToSquare(7, 0)); - this.generatePolygon('octagon', generateUnitNgonPointsFitToSquare(8, 0)); - this.generateRoundPolygon('round-octagon', generateUnitNgonPointsFitToSquare(8, 0)); - var star5Points = new Array(20); - { - var outerPoints = generateUnitNgonPoints(5, 0); - var innerPoints = generateUnitNgonPoints(5, Math.PI / 5); // Outer radius is 1; inner radius of star is smaller - - var innerRadius = 0.5 * (3 - Math.sqrt(5)); - innerRadius *= 1.57; - - for (var i = 0; i < innerPoints.length / 2; i++) { - innerPoints[i * 2] *= innerRadius; - innerPoints[i * 2 + 1] *= innerRadius; - } - - for (var i = 0; i < 20 / 4; i++) { - star5Points[i * 4] = outerPoints[i * 2]; - star5Points[i * 4 + 1] = outerPoints[i * 2 + 1]; - star5Points[i * 4 + 2] = innerPoints[i * 2]; - star5Points[i * 4 + 3] = innerPoints[i * 2 + 1]; - } - } - star5Points = fitPolygonToSquare(star5Points); - this.generatePolygon('star', star5Points); - this.generatePolygon('vee', [-1, -1, 0, -0.333, 1, -1, 0, 1]); - this.generatePolygon('rhomboid', [-1, -1, 0.333, -1, 1, 1, -0.333, 1]); - this.generatePolygon('right-rhomboid', [-0.333, -1, 1, -1, 0.333, 1, -1, 1]); - this.nodeShapes['concavehexagon'] = this.generatePolygon('concave-hexagon', [-1, -0.95, -0.75, 0, -1, 0.95, 1, 0.95, 0.75, 0, 1, -0.95]); - { - var tagPoints = [-1, -1, 0.25, -1, 1, 0, 0.25, 1, -1, 1]; - this.generatePolygon('tag', tagPoints); - this.generateRoundPolygon('round-tag', tagPoints); - } - - nodeShapes.makePolygon = function (points) { - // use caching on user-specified polygons so they are as fast as native shapes - var key = points.join('$'); - var name = 'polygon-' + key; - var shape; - - if (shape = this[name]) { - // got cached shape - return shape; - } // create and cache new shape - - - return renderer.generatePolygon(name, points); - }; -}; - -var BRp$1 = {}; - -BRp$1.timeToRender = function () { - return this.redrawTotalTime / this.redrawCount; -}; - -BRp$1.redraw = function (options) { - options = options || staticEmptyObject(); - var r = this; - - if (r.averageRedrawTime === undefined) { - r.averageRedrawTime = 0; - } - - if (r.lastRedrawTime === undefined) { - r.lastRedrawTime = 0; - } - - if (r.lastDrawTime === undefined) { - r.lastDrawTime = 0; - } - - r.requestedFrame = true; - r.renderOptions = options; -}; - -BRp$1.beforeRender = function (fn, priority) { - // the renderer can't add tick callbacks when destroyed - if (this.destroyed) { - return; - } - - if (priority == null) { - error('Priority is not optional for beforeRender'); - } - - var cbs = this.beforeRenderCallbacks; - cbs.push({ - fn: fn, - priority: priority - }); // higher priority callbacks executed first - - cbs.sort(function (a, b) { - return b.priority - a.priority; - }); -}; - -var beforeRenderCallbacks = function beforeRenderCallbacks(r, willDraw, startTime) { - var cbs = r.beforeRenderCallbacks; - - for (var i = 0; i < cbs.length; i++) { - cbs[i].fn(willDraw, startTime); - } -}; - -BRp$1.startRenderLoop = function () { - var r = this; - var cy = r.cy; - - if (r.renderLoopStarted) { - return; - } else { - r.renderLoopStarted = true; - } - - var renderFn = function renderFn(requestTime) { - if (r.destroyed) { - return; - } - - if (cy.batching()) ; else if (r.requestedFrame && !r.skipFrame) { - beforeRenderCallbacks(r, true, requestTime); - var startTime = performanceNow(); - r.render(r.renderOptions); - var endTime = r.lastDrawTime = performanceNow(); - - if (r.averageRedrawTime === undefined) { - r.averageRedrawTime = endTime - startTime; - } - - if (r.redrawCount === undefined) { - r.redrawCount = 0; - } - - r.redrawCount++; - - if (r.redrawTotalTime === undefined) { - r.redrawTotalTime = 0; - } - - var duration = endTime - startTime; - r.redrawTotalTime += duration; - r.lastRedrawTime = duration; // use a weighted average with a bias from the previous average so we don't spike so easily - - r.averageRedrawTime = r.averageRedrawTime / 2 + duration / 2; - r.requestedFrame = false; - } else { - beforeRenderCallbacks(r, false, requestTime); - } - - r.skipFrame = false; - requestAnimationFrame(renderFn); - }; - - requestAnimationFrame(renderFn); -}; - -var BaseRenderer = function BaseRenderer(options) { - this.init(options); -}; - -var BR = BaseRenderer; -var BRp = BR.prototype; -BRp.clientFunctions = ['redrawHint', 'render', 'renderTo', 'matchCanvasSize', 'nodeShapeImpl', 'arrowShapeImpl']; - -BRp.init = function (options) { - var r = this; - r.options = options; - r.cy = options.cy; - var ctr = r.container = options.cy.container(); // prepend a stylesheet in the head such that - - if (window$1) { - var document = window$1.document; - var head = document.head; - var stylesheetId = '__________cytoscape_stylesheet'; - var className = '__________cytoscape_container'; - var stylesheetAlreadyExists = document.getElementById(stylesheetId) != null; - - if (ctr.className.indexOf(className) < 0) { - ctr.className = (ctr.className || '') + ' ' + className; - } - - if (!stylesheetAlreadyExists) { - var stylesheet = document.createElement('style'); - stylesheet.id = stylesheetId; - stylesheet.textContent = '.' + className + ' { position: relative; }'; - head.insertBefore(stylesheet, head.children[0]); // first so lowest priority - } - - var computedStyle = window$1.getComputedStyle(ctr); - var position = computedStyle.getPropertyValue('position'); - - if (position === 'static') { - warn('A Cytoscape container has style position:static and so can not use UI extensions properly'); - } - } - - r.selection = [undefined, undefined, undefined, undefined, 0]; // Coordinates for selection box, plus enabled flag - - r.bezierProjPcts = [0.05, 0.225, 0.4, 0.5, 0.6, 0.775, 0.95]; //--Pointer-related data - - r.hoverData = { - down: null, - last: null, - downTime: null, - triggerMode: null, - dragging: false, - initialPan: [null, null], - capture: false - }; - r.dragData = { - possibleDragElements: [] - }; - r.touchData = { - start: null, - capture: false, - // These 3 fields related to tap, taphold events - startPosition: [null, null, null, null, null, null], - singleTouchStartTime: null, - singleTouchMoved: true, - now: [null, null, null, null, null, null], - earlier: [null, null, null, null, null, null] - }; - r.redraws = 0; - r.showFps = options.showFps; - r.debug = options.debug; - r.hideEdgesOnViewport = options.hideEdgesOnViewport; - r.textureOnViewport = options.textureOnViewport; - r.wheelSensitivity = options.wheelSensitivity; - r.motionBlurEnabled = options.motionBlur; // on by default - - r.forcedPixelRatio = number$1(options.pixelRatio) ? options.pixelRatio : null; - r.motionBlur = options.motionBlur; // for initial kick off - - r.motionBlurOpacity = options.motionBlurOpacity; - r.motionBlurTransparency = 1 - r.motionBlurOpacity; - r.motionBlurPxRatio = 1; - r.mbPxRBlurry = 1; //0.8; - - r.minMbLowQualFrames = 4; - r.fullQualityMb = false; - r.clearedForMotionBlur = []; - r.desktopTapThreshold = options.desktopTapThreshold; - r.desktopTapThreshold2 = options.desktopTapThreshold * options.desktopTapThreshold; - r.touchTapThreshold = options.touchTapThreshold; - r.touchTapThreshold2 = options.touchTapThreshold * options.touchTapThreshold; - r.tapholdDuration = 500; - r.bindings = []; - r.beforeRenderCallbacks = []; - r.beforeRenderPriorities = { - // higher priority execs before lower one - animations: 400, - eleCalcs: 300, - eleTxrDeq: 200, - lyrTxrDeq: 150, - lyrTxrSkip: 100 - }; - r.registerNodeShapes(); - r.registerArrowShapes(); - r.registerCalculationListeners(); -}; - -BRp.notify = function (eventName, eles) { - var r = this; - var cy = r.cy; // the renderer can't be notified after it's destroyed - - if (this.destroyed) { - return; - } - - if (eventName === 'init') { - r.load(); - return; - } - - if (eventName === 'destroy') { - r.destroy(); - return; - } - - if (eventName === 'add' || eventName === 'remove' || eventName === 'move' && cy.hasCompoundNodes() || eventName === 'load' || eventName === 'zorder' || eventName === 'mount') { - r.invalidateCachedZSortedEles(); - } - - if (eventName === 'viewport') { - r.redrawHint('select', true); - } - - if (eventName === 'load' || eventName === 'resize' || eventName === 'mount') { - r.invalidateContainerClientCoordsCache(); - r.matchCanvasSize(r.container); - } - - r.redrawHint('eles', true); - r.redrawHint('drag', true); - this.startRenderLoop(); - this.redraw(); -}; - -BRp.destroy = function () { - var r = this; - r.destroyed = true; - r.cy.stopAnimationLoop(); - - for (var i = 0; i < r.bindings.length; i++) { - var binding = r.bindings[i]; - var b = binding; - var tgt = b.target; - (tgt.off || tgt.removeEventListener).apply(tgt, b.args); - } - - r.bindings = []; - r.beforeRenderCallbacks = []; - r.onUpdateEleCalcsFns = []; - - if (r.removeObserver) { - r.removeObserver.disconnect(); - } - - if (r.styleObserver) { - r.styleObserver.disconnect(); - } - - if (r.resizeObserver) { - r.resizeObserver.disconnect(); - } - - if (r.labelCalcDiv) { - try { - document.body.removeChild(r.labelCalcDiv); // eslint-disable-line no-undef - } catch (e) {// ie10 issue #1014 - } - } -}; - -BRp.isHeadless = function () { - return false; -}; - -[BRp$f, BRp$5, BRp$4, BRp$3, BRp$2, BRp$1].forEach(function (props) { - extend(BRp, props); -}); - -var fullFpsTime = 1000 / 60; // assume 60 frames per second - -var defs = { - setupDequeueing: function setupDequeueing(opts) { - return function setupDequeueingImpl() { - var self = this; - var r = this.renderer; - - if (self.dequeueingSetup) { - return; - } else { - self.dequeueingSetup = true; - } - - var queueRedraw = debounce__default["default"](function () { - r.redrawHint('eles', true); - r.redrawHint('drag', true); - r.redraw(); - }, opts.deqRedrawThreshold); - - var dequeue = function dequeue(willDraw, frameStartTime) { - var startTime = performanceNow(); - var avgRenderTime = r.averageRedrawTime; - var renderTime = r.lastRedrawTime; - var deqd = []; - var extent = r.cy.extent(); - var pixelRatio = r.getPixelRatio(); // if we aren't in a tick that causes a draw, then the rendered style - // queue won't automatically be flushed before dequeueing starts - - if (!willDraw) { - r.flushRenderedStyleQueue(); - } - - while (true) { - // eslint-disable-line no-constant-condition - var now = performanceNow(); - var duration = now - startTime; - var frameDuration = now - frameStartTime; - - if (renderTime < fullFpsTime) { - // if we're rendering faster than the ideal fps, then do dequeueing - // during all of the remaining frame time - var timeAvailable = fullFpsTime - (willDraw ? avgRenderTime : 0); - - if (frameDuration >= opts.deqFastCost * timeAvailable) { - break; - } - } else { - if (willDraw) { - if (duration >= opts.deqCost * renderTime || duration >= opts.deqAvgCost * avgRenderTime) { - break; - } - } else if (frameDuration >= opts.deqNoDrawCost * fullFpsTime) { - break; - } - } - - var thisDeqd = opts.deq(self, pixelRatio, extent); - - if (thisDeqd.length > 0) { - for (var i = 0; i < thisDeqd.length; i++) { - deqd.push(thisDeqd[i]); - } - } else { - break; - } - } // callbacks on dequeue - - - if (deqd.length > 0) { - opts.onDeqd(self, deqd); - - if (!willDraw && opts.shouldRedraw(self, deqd, pixelRatio, extent)) { - queueRedraw(); - } - } - }; - - var priority = opts.priority || noop$1; - r.beforeRender(dequeue, priority(self)); - }; - } -}; - -// Uses keys so elements may share the same cache. - -var ElementTextureCacheLookup = /*#__PURE__*/function () { - function ElementTextureCacheLookup(getKey) { - var doesEleInvalidateKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : falsify; - - _classCallCheck(this, ElementTextureCacheLookup); - - this.idsByKey = new Map$1(); - this.keyForId = new Map$1(); - this.cachesByLvl = new Map$1(); - this.lvls = []; - this.getKey = getKey; - this.doesEleInvalidateKey = doesEleInvalidateKey; - } - - _createClass(ElementTextureCacheLookup, [{ - key: "getIdsFor", - value: function getIdsFor(key) { - if (key == null) { - error("Can not get id list for null key"); - } - - var idsByKey = this.idsByKey; - var ids = this.idsByKey.get(key); - - if (!ids) { - ids = new Set$1(); - idsByKey.set(key, ids); - } - - return ids; - } - }, { - key: "addIdForKey", - value: function addIdForKey(key, id) { - if (key != null) { - this.getIdsFor(key).add(id); - } - } - }, { - key: "deleteIdForKey", - value: function deleteIdForKey(key, id) { - if (key != null) { - this.getIdsFor(key)["delete"](id); - } - } - }, { - key: "getNumberOfIdsForKey", - value: function getNumberOfIdsForKey(key) { - if (key == null) { - return 0; - } else { - return this.getIdsFor(key).size; - } - } - }, { - key: "updateKeyMappingFor", - value: function updateKeyMappingFor(ele) { - var id = ele.id(); - var prevKey = this.keyForId.get(id); - var currKey = this.getKey(ele); - this.deleteIdForKey(prevKey, id); - this.addIdForKey(currKey, id); - this.keyForId.set(id, currKey); - } - }, { - key: "deleteKeyMappingFor", - value: function deleteKeyMappingFor(ele) { - var id = ele.id(); - var prevKey = this.keyForId.get(id); - this.deleteIdForKey(prevKey, id); - this.keyForId["delete"](id); - } - }, { - key: "keyHasChangedFor", - value: function keyHasChangedFor(ele) { - var id = ele.id(); - var prevKey = this.keyForId.get(id); - var newKey = this.getKey(ele); - return prevKey !== newKey; - } - }, { - key: "isInvalid", - value: function isInvalid(ele) { - return this.keyHasChangedFor(ele) || this.doesEleInvalidateKey(ele); - } - }, { - key: "getCachesAt", - value: function getCachesAt(lvl) { - var cachesByLvl = this.cachesByLvl, - lvls = this.lvls; - var caches = cachesByLvl.get(lvl); - - if (!caches) { - caches = new Map$1(); - cachesByLvl.set(lvl, caches); - lvls.push(lvl); - } - - return caches; - } - }, { - key: "getCache", - value: function getCache(key, lvl) { - return this.getCachesAt(lvl).get(key); - } - }, { - key: "get", - value: function get(ele, lvl) { - var key = this.getKey(ele); - var cache = this.getCache(key, lvl); // getting for an element may need to add to the id list b/c eles can share keys - - if (cache != null) { - this.updateKeyMappingFor(ele); - } - - return cache; - } - }, { - key: "getForCachedKey", - value: function getForCachedKey(ele, lvl) { - var key = this.keyForId.get(ele.id()); // n.b. use cached key, not newly computed key - - var cache = this.getCache(key, lvl); - return cache; - } - }, { - key: "hasCache", - value: function hasCache(key, lvl) { - return this.getCachesAt(lvl).has(key); - } - }, { - key: "has", - value: function has(ele, lvl) { - var key = this.getKey(ele); - return this.hasCache(key, lvl); - } - }, { - key: "setCache", - value: function setCache(key, lvl, cache) { - cache.key = key; - this.getCachesAt(lvl).set(key, cache); - } - }, { - key: "set", - value: function set(ele, lvl, cache) { - var key = this.getKey(ele); - this.setCache(key, lvl, cache); - this.updateKeyMappingFor(ele); - } - }, { - key: "deleteCache", - value: function deleteCache(key, lvl) { - this.getCachesAt(lvl)["delete"](key); - } - }, { - key: "delete", - value: function _delete(ele, lvl) { - var key = this.getKey(ele); - this.deleteCache(key, lvl); - } - }, { - key: "invalidateKey", - value: function invalidateKey(key) { - var _this = this; - - this.lvls.forEach(function (lvl) { - return _this.deleteCache(key, lvl); - }); - } // returns true if no other eles reference the invalidated cache (n.b. other eles may need the cache with the same key) - - }, { - key: "invalidate", - value: function invalidate(ele) { - var id = ele.id(); - var key = this.keyForId.get(id); // n.b. use stored key rather than current (potential key) - - this.deleteKeyMappingFor(ele); - var entireKeyInvalidated = this.doesEleInvalidateKey(ele); - - if (entireKeyInvalidated) { - // clear mapping for current key - this.invalidateKey(key); - } - - return entireKeyInvalidated || this.getNumberOfIdsForKey(key) === 0; - } - }]); - - return ElementTextureCacheLookup; -}(); - -var minTxrH = 25; // the size of the texture cache for small height eles (special case) - -var txrStepH = 50; // the min size of the regular cache, and the size it increases with each step up - -var minLvl$1 = -4; // when scaling smaller than that we don't need to re-render - -var maxLvl$1 = 3; // when larger than this scale just render directly (caching is not helpful) - -var maxZoom$1 = 7.99; // beyond this zoom level, layered textures are not used - -var eleTxrSpacing = 8; // spacing between elements on textures to avoid blitting overlaps - -var defTxrWidth = 1024; // default/minimum texture width - -var maxTxrW = 1024; // the maximum width of a texture - -var maxTxrH = 1024; // the maximum height of a texture - -var minUtility = 0.2; // if usage of texture is less than this, it is retired - -var maxFullness = 0.8; // fullness of texture after which queue removal is checked - -var maxFullnessChecks = 10; // dequeued after this many checks - -var deqCost$1 = 0.15; // % of add'l rendering cost allowed for dequeuing ele caches each frame - -var deqAvgCost$1 = 0.1; // % of add'l rendering cost compared to average overall redraw time - -var deqNoDrawCost$1 = 0.9; // % of avg frame time that can be used for dequeueing when not drawing - -var deqFastCost$1 = 0.9; // % of frame time to be used when >60fps - -var deqRedrawThreshold$1 = 100; // time to batch redraws together from dequeueing to allow more dequeueing calcs to happen in the meanwhile - -var maxDeqSize$1 = 1; // number of eles to dequeue and render at higher texture in each batch - -var getTxrReasons = { - dequeue: 'dequeue', - downscale: 'downscale', - highQuality: 'highQuality' -}; -var initDefaults = defaults$g({ - getKey: null, - doesEleInvalidateKey: falsify, - drawElement: null, - getBoundingBox: null, - getRotationPoint: null, - getRotationOffset: null, - isVisible: trueify, - allowEdgeTxrCaching: true, - allowParentTxrCaching: true -}); - -var ElementTextureCache = function ElementTextureCache(renderer, initOptions) { - var self = this; - self.renderer = renderer; - self.onDequeues = []; - var opts = initDefaults(initOptions); - extend(self, opts); - self.lookup = new ElementTextureCacheLookup(opts.getKey, opts.doesEleInvalidateKey); - self.setupDequeueing(); -}; - -var ETCp = ElementTextureCache.prototype; -ETCp.reasons = getTxrReasons; // the list of textures in which new subtextures for elements can be placed - -ETCp.getTextureQueue = function (txrH) { - var self = this; - self.eleImgCaches = self.eleImgCaches || {}; - return self.eleImgCaches[txrH] = self.eleImgCaches[txrH] || []; -}; // the list of usused textures which can be recycled (in use in texture queue) - - -ETCp.getRetiredTextureQueue = function (txrH) { - var self = this; - var rtxtrQs = self.eleImgCaches.retired = self.eleImgCaches.retired || {}; - var rtxtrQ = rtxtrQs[txrH] = rtxtrQs[txrH] || []; - return rtxtrQ; -}; // queue of element draw requests at different scale levels - - -ETCp.getElementQueue = function () { - var self = this; - var q = self.eleCacheQueue = self.eleCacheQueue || new Heap__default["default"](function (a, b) { - return b.reqs - a.reqs; - }); - return q; -}; // queue of element draw requests at different scale levels (element id lookup) - - -ETCp.getElementKeyToQueue = function () { - var self = this; - var k2q = self.eleKeyToCacheQueue = self.eleKeyToCacheQueue || {}; - return k2q; -}; - -ETCp.getElement = function (ele, bb, pxRatio, lvl, reason) { - var self = this; - var r = this.renderer; - var zoom = r.cy.zoom(); - var lookup = this.lookup; - - if (!bb || bb.w === 0 || bb.h === 0 || isNaN(bb.w) || isNaN(bb.h) || !ele.visible() || ele.removed()) { - return null; - } - - if (!self.allowEdgeTxrCaching && ele.isEdge() || !self.allowParentTxrCaching && ele.isParent()) { - return null; - } - - if (lvl == null) { - lvl = Math.ceil(log2(zoom * pxRatio)); - } - - if (lvl < minLvl$1) { - lvl = minLvl$1; - } else if (zoom >= maxZoom$1 || lvl > maxLvl$1) { - return null; - } - - var scale = Math.pow(2, lvl); - var eleScaledH = bb.h * scale; - var eleScaledW = bb.w * scale; - var scaledLabelShown = r.eleTextBiggerThanMin(ele, scale); - - if (!this.isVisible(ele, scaledLabelShown)) { - return null; - } - - var eleCache = lookup.get(ele, lvl); // if this get was on an unused/invalidated cache, then restore the texture usage metric - - if (eleCache && eleCache.invalidated) { - eleCache.invalidated = false; - eleCache.texture.invalidatedWidth -= eleCache.width; - } - - if (eleCache) { - return eleCache; - } - - var txrH; // which texture height this ele belongs to - - if (eleScaledH <= minTxrH) { - txrH = minTxrH; - } else if (eleScaledH <= txrStepH) { - txrH = txrStepH; - } else { - txrH = Math.ceil(eleScaledH / txrStepH) * txrStepH; - } - - if (eleScaledH > maxTxrH || eleScaledW > maxTxrW) { - return null; // caching large elements is not efficient - } - - var txrQ = self.getTextureQueue(txrH); // first try the second last one in case it has space at the end - - var txr = txrQ[txrQ.length - 2]; - - var addNewTxr = function addNewTxr() { - return self.recycleTexture(txrH, eleScaledW) || self.addTexture(txrH, eleScaledW); - }; // try the last one if there is no second last one - - - if (!txr) { - txr = txrQ[txrQ.length - 1]; - } // if the last one doesn't exist, we need a first one - - - if (!txr) { - txr = addNewTxr(); - } // if there's no room in the current texture, we need a new one - - - if (txr.width - txr.usedWidth < eleScaledW) { - txr = addNewTxr(); - } - - var scalableFrom = function scalableFrom(otherCache) { - return otherCache && otherCache.scaledLabelShown === scaledLabelShown; - }; - - var deqing = reason && reason === getTxrReasons.dequeue; - var highQualityReq = reason && reason === getTxrReasons.highQuality; - var downscaleReq = reason && reason === getTxrReasons.downscale; - var higherCache; // the nearest cache with a higher level - - for (var l = lvl + 1; l <= maxLvl$1; l++) { - var c = lookup.get(ele, l); - - if (c) { - higherCache = c; - break; - } - } - - var oneUpCache = higherCache && higherCache.level === lvl + 1 ? higherCache : null; - - var downscale = function downscale() { - txr.context.drawImage(oneUpCache.texture.canvas, oneUpCache.x, 0, oneUpCache.width, oneUpCache.height, txr.usedWidth, 0, eleScaledW, eleScaledH); - }; // reset ele area in texture - - - txr.context.setTransform(1, 0, 0, 1, 0, 0); - txr.context.clearRect(txr.usedWidth, 0, eleScaledW, txrH); - - if (scalableFrom(oneUpCache)) { - // then we can relatively cheaply rescale the existing image w/o rerendering - downscale(); - } else if (scalableFrom(higherCache)) { - // then use the higher cache for now and queue the next level down - // to cheaply scale towards the smaller level - if (highQualityReq) { - for (var _l = higherCache.level; _l > lvl; _l--) { - oneUpCache = self.getElement(ele, bb, pxRatio, _l, getTxrReasons.downscale); - } - - downscale(); - } else { - self.queueElement(ele, higherCache.level - 1); - return higherCache; - } - } else { - var lowerCache; // the nearest cache with a lower level - - if (!deqing && !highQualityReq && !downscaleReq) { - for (var _l2 = lvl - 1; _l2 >= minLvl$1; _l2--) { - var _c = lookup.get(ele, _l2); - - if (_c) { - lowerCache = _c; - break; - } - } - } - - if (scalableFrom(lowerCache)) { - // then use the lower quality cache for now and queue the better one for later - self.queueElement(ele, lvl); - return lowerCache; - } - - txr.context.translate(txr.usedWidth, 0); - txr.context.scale(scale, scale); - this.drawElement(txr.context, ele, bb, scaledLabelShown, false); - txr.context.scale(1 / scale, 1 / scale); - txr.context.translate(-txr.usedWidth, 0); - } - - eleCache = { - x: txr.usedWidth, - texture: txr, - level: lvl, - scale: scale, - width: eleScaledW, - height: eleScaledH, - scaledLabelShown: scaledLabelShown - }; - txr.usedWidth += Math.ceil(eleScaledW + eleTxrSpacing); - txr.eleCaches.push(eleCache); - lookup.set(ele, lvl, eleCache); - self.checkTextureFullness(txr); - return eleCache; -}; - -ETCp.invalidateElements = function (eles) { - for (var i = 0; i < eles.length; i++) { - this.invalidateElement(eles[i]); - } -}; - -ETCp.invalidateElement = function (ele) { - var self = this; - var lookup = self.lookup; - var caches = []; - var invalid = lookup.isInvalid(ele); - - if (!invalid) { - return; // override the invalidation request if the element key has not changed - } - - for (var lvl = minLvl$1; lvl <= maxLvl$1; lvl++) { - var cache = lookup.getForCachedKey(ele, lvl); - - if (cache) { - caches.push(cache); - } - } - - var noOtherElesUseCache = lookup.invalidate(ele); - - if (noOtherElesUseCache) { - for (var i = 0; i < caches.length; i++) { - var _cache = caches[i]; - var txr = _cache.texture; // remove space from the texture it belongs to - - txr.invalidatedWidth += _cache.width; // mark the cache as invalidated - - _cache.invalidated = true; // retire the texture if its utility is low - - self.checkTextureUtility(txr); - } - } // remove from queue since the old req was for the old state - - - self.removeFromQueue(ele); -}; - -ETCp.checkTextureUtility = function (txr) { - // invalidate all entries in the cache if the cache size is small - if (txr.invalidatedWidth >= minUtility * txr.width) { - this.retireTexture(txr); - } -}; - -ETCp.checkTextureFullness = function (txr) { - // if texture has been mostly filled and passed over several times, remove - // it from the queue so we don't need to waste time looking at it to put new things - var self = this; - var txrQ = self.getTextureQueue(txr.height); - - if (txr.usedWidth / txr.width > maxFullness && txr.fullnessChecks >= maxFullnessChecks) { - removeFromArray(txrQ, txr); - } else { - txr.fullnessChecks++; - } -}; - -ETCp.retireTexture = function (txr) { - var self = this; - var txrH = txr.height; - var txrQ = self.getTextureQueue(txrH); - var lookup = this.lookup; // retire the texture from the active / searchable queue: - - removeFromArray(txrQ, txr); - txr.retired = true; // remove the refs from the eles to the caches: - - var eleCaches = txr.eleCaches; - - for (var i = 0; i < eleCaches.length; i++) { - var eleCache = eleCaches[i]; - lookup.deleteCache(eleCache.key, eleCache.level); - } - - clearArray(eleCaches); // add the texture to a retired queue so it can be recycled in future: - - var rtxtrQ = self.getRetiredTextureQueue(txrH); - rtxtrQ.push(txr); -}; - -ETCp.addTexture = function (txrH, minW) { - var self = this; - var txrQ = self.getTextureQueue(txrH); - var txr = {}; - txrQ.push(txr); - txr.eleCaches = []; - txr.height = txrH; - txr.width = Math.max(defTxrWidth, minW); - txr.usedWidth = 0; - txr.invalidatedWidth = 0; - txr.fullnessChecks = 0; - txr.canvas = self.renderer.makeOffscreenCanvas(txr.width, txr.height); - txr.context = txr.canvas.getContext('2d'); - return txr; -}; - -ETCp.recycleTexture = function (txrH, minW) { - var self = this; - var txrQ = self.getTextureQueue(txrH); - var rtxtrQ = self.getRetiredTextureQueue(txrH); - - for (var i = 0; i < rtxtrQ.length; i++) { - var txr = rtxtrQ[i]; - - if (txr.width >= minW) { - txr.retired = false; - txr.usedWidth = 0; - txr.invalidatedWidth = 0; - txr.fullnessChecks = 0; - clearArray(txr.eleCaches); - txr.context.setTransform(1, 0, 0, 1, 0, 0); - txr.context.clearRect(0, 0, txr.width, txr.height); - removeFromArray(rtxtrQ, txr); - txrQ.push(txr); - return txr; - } - } -}; - -ETCp.queueElement = function (ele, lvl) { - var self = this; - var q = self.getElementQueue(); - var k2q = self.getElementKeyToQueue(); - var key = this.getKey(ele); - var existingReq = k2q[key]; - - if (existingReq) { - // use the max lvl b/c in between lvls are cheap to make - existingReq.level = Math.max(existingReq.level, lvl); - existingReq.eles.merge(ele); - existingReq.reqs++; - q.updateItem(existingReq); - } else { - var req = { - eles: ele.spawn().merge(ele), - level: lvl, - reqs: 1, - key: key - }; - q.push(req); - k2q[key] = req; - } -}; - -ETCp.dequeue = function (pxRatio -/*, extent*/ -) { - var self = this; - var q = self.getElementQueue(); - var k2q = self.getElementKeyToQueue(); - var dequeued = []; - var lookup = self.lookup; - - for (var i = 0; i < maxDeqSize$1; i++) { - if (q.size() > 0) { - var req = q.pop(); - var key = req.key; - var ele = req.eles[0]; // all eles have the same key - - var cacheExists = lookup.hasCache(ele, req.level); // clear out the key to req lookup - - k2q[key] = null; // dequeueing isn't necessary with an existing cache - - if (cacheExists) { - continue; - } - - dequeued.push(req); - var bb = self.getBoundingBox(ele); - self.getElement(ele, bb, pxRatio, req.level, getTxrReasons.dequeue); - } else { - break; - } - } - - return dequeued; -}; - -ETCp.removeFromQueue = function (ele) { - var self = this; - var q = self.getElementQueue(); - var k2q = self.getElementKeyToQueue(); - var key = this.getKey(ele); - var req = k2q[key]; - - if (req != null) { - if (req.eles.length === 1) { - // remove if last ele in the req - // bring to front of queue - req.reqs = MAX_INT$1; - q.updateItem(req); - q.pop(); // remove from queue - - k2q[key] = null; // remove from lookup map - } else { - // otherwise just remove ele from req - req.eles.unmerge(ele); - } - } -}; - -ETCp.onDequeue = function (fn) { - this.onDequeues.push(fn); -}; - -ETCp.offDequeue = function (fn) { - removeFromArray(this.onDequeues, fn); -}; - -ETCp.setupDequeueing = defs.setupDequeueing({ - deqRedrawThreshold: deqRedrawThreshold$1, - deqCost: deqCost$1, - deqAvgCost: deqAvgCost$1, - deqNoDrawCost: deqNoDrawCost$1, - deqFastCost: deqFastCost$1, - deq: function deq(self, pxRatio, extent) { - return self.dequeue(pxRatio, extent); - }, - onDeqd: function onDeqd(self, deqd) { - for (var i = 0; i < self.onDequeues.length; i++) { - var fn = self.onDequeues[i]; - fn(deqd); - } - }, - shouldRedraw: function shouldRedraw(self, deqd, pxRatio, extent) { - for (var i = 0; i < deqd.length; i++) { - var eles = deqd[i].eles; - - for (var j = 0; j < eles.length; j++) { - var bb = eles[j].boundingBox(); - - if (boundingBoxesIntersect(bb, extent)) { - return true; - } - } - } - - return false; - }, - priority: function priority(self) { - return self.renderer.beforeRenderPriorities.eleTxrDeq; - } -}); - -var defNumLayers = 1; // default number of layers to use - -var minLvl = -4; // when scaling smaller than that we don't need to re-render - -var maxLvl = 2; // when larger than this scale just render directly (caching is not helpful) - -var maxZoom = 3.99; // beyond this zoom level, layered textures are not used - -var deqRedrawThreshold = 50; // time to batch redraws together from dequeueing to allow more dequeueing calcs to happen in the meanwhile - -var refineEleDebounceTime = 50; // time to debounce sharper ele texture updates - -var deqCost = 0.15; // % of add'l rendering cost allowed for dequeuing ele caches each frame - -var deqAvgCost = 0.1; // % of add'l rendering cost compared to average overall redraw time - -var deqNoDrawCost = 0.9; // % of avg frame time that can be used for dequeueing when not drawing - -var deqFastCost = 0.9; // % of frame time to be used when >60fps - -var maxDeqSize = 1; // number of eles to dequeue and render at higher texture in each batch - -var invalidThreshold = 250; // time threshold for disabling b/c of invalidations - -var maxLayerArea = 4000 * 4000; // layers can't be bigger than this - -var useHighQualityEleTxrReqs = true; // whether to use high quality ele txr requests (generally faster and cheaper in the longterm) -// var log = function(){ console.log.apply( console, arguments ); }; - -var LayeredTextureCache = function LayeredTextureCache(renderer) { - var self = this; - var r = self.renderer = renderer; - var cy = r.cy; - self.layersByLevel = {}; // e.g. 2 => [ layer1, layer2, ..., layerN ] - - self.firstGet = true; - self.lastInvalidationTime = performanceNow() - 2 * invalidThreshold; - self.skipping = false; - self.eleTxrDeqs = cy.collection(); - self.scheduleElementRefinement = debounce__default["default"](function () { - self.refineElementTextures(self.eleTxrDeqs); - self.eleTxrDeqs.unmerge(self.eleTxrDeqs); - }, refineEleDebounceTime); - r.beforeRender(function (willDraw, now) { - if (now - self.lastInvalidationTime <= invalidThreshold) { - self.skipping = true; - } else { - self.skipping = false; - } - }, r.beforeRenderPriorities.lyrTxrSkip); - - var qSort = function qSort(a, b) { - return b.reqs - a.reqs; - }; - - self.layersQueue = new Heap__default["default"](qSort); - self.setupDequeueing(); -}; - -var LTCp = LayeredTextureCache.prototype; -var layerIdPool = 0; -var MAX_INT = Math.pow(2, 53) - 1; - -LTCp.makeLayer = function (bb, lvl) { - var scale = Math.pow(2, lvl); - var w = Math.ceil(bb.w * scale); - var h = Math.ceil(bb.h * scale); - var canvas = this.renderer.makeOffscreenCanvas(w, h); - var layer = { - id: layerIdPool = ++layerIdPool % MAX_INT, - bb: bb, - level: lvl, - width: w, - height: h, - canvas: canvas, - context: canvas.getContext('2d'), - eles: [], - elesQueue: [], - reqs: 0 - }; // log('make layer %s with w %s and h %s and lvl %s', layer.id, layer.width, layer.height, layer.level); - - var cxt = layer.context; - var dx = -layer.bb.x1; - var dy = -layer.bb.y1; // do the transform on creation to save cycles (it's the same for all eles) - - cxt.scale(scale, scale); - cxt.translate(dx, dy); - return layer; -}; - -LTCp.getLayers = function (eles, pxRatio, lvl) { - var self = this; - var r = self.renderer; - var cy = r.cy; - var zoom = cy.zoom(); - var firstGet = self.firstGet; - self.firstGet = false; // log('--\nget layers with %s eles', eles.length); - //log eles.map(function(ele){ return ele.id() }) ); - - if (lvl == null) { - lvl = Math.ceil(log2(zoom * pxRatio)); - - if (lvl < minLvl) { - lvl = minLvl; - } else if (zoom >= maxZoom || lvl > maxLvl) { - return null; - } - } - - self.validateLayersElesOrdering(lvl, eles); - var layersByLvl = self.layersByLevel; - var scale = Math.pow(2, lvl); - var layers = layersByLvl[lvl] = layersByLvl[lvl] || []; - var bb; - var lvlComplete = self.levelIsComplete(lvl, eles); - var tmpLayers; - - var checkTempLevels = function checkTempLevels() { - var canUseAsTmpLvl = function canUseAsTmpLvl(l) { - self.validateLayersElesOrdering(l, eles); - - if (self.levelIsComplete(l, eles)) { - tmpLayers = layersByLvl[l]; - return true; - } - }; - - var checkLvls = function checkLvls(dir) { - if (tmpLayers) { - return; - } - - for (var l = lvl + dir; minLvl <= l && l <= maxLvl; l += dir) { - if (canUseAsTmpLvl(l)) { - break; - } - } - }; - - checkLvls(+1); - checkLvls(-1); // remove the invalid layers; they will be replaced as needed later in this function - - for (var i = layers.length - 1; i >= 0; i--) { - var layer = layers[i]; - - if (layer.invalid) { - removeFromArray(layers, layer); - } - } - }; - - if (!lvlComplete) { - // if the current level is incomplete, then use the closest, best quality layerset temporarily - // and later queue the current layerset so we can get the proper quality level soon - checkTempLevels(); - } else { - // log('level complete, using existing layers\n--'); - return layers; - } - - var getBb = function getBb() { - if (!bb) { - bb = makeBoundingBox(); - - for (var i = 0; i < eles.length; i++) { - updateBoundingBox(bb, eles[i].boundingBox()); - } - } - - return bb; - }; - - var makeLayer = function makeLayer(opts) { - opts = opts || {}; - var after = opts.after; - getBb(); - var area = bb.w * scale * (bb.h * scale); - - if (area > maxLayerArea) { - return null; - } - - var layer = self.makeLayer(bb, lvl); - - if (after != null) { - var index = layers.indexOf(after) + 1; - layers.splice(index, 0, layer); - } else if (opts.insert === undefined || opts.insert) { - // no after specified => first layer made so put at start - layers.unshift(layer); - } // if( tmpLayers ){ - //self.queueLayer( layer ); - // } - - - return layer; - }; - - if (self.skipping && !firstGet) { - // log('skip layers'); - return null; - } // log('do layers'); - - - var layer = null; - var maxElesPerLayer = eles.length / defNumLayers; - var allowLazyQueueing = !firstGet; - - for (var i = 0; i < eles.length; i++) { - var ele = eles[i]; - var rs = ele._private.rscratch; - var caches = rs.imgLayerCaches = rs.imgLayerCaches || {}; // log('look at ele', ele.id()); - - var existingLayer = caches[lvl]; - - if (existingLayer) { - // reuse layer for later eles - // log('reuse layer for', ele.id()); - layer = existingLayer; - continue; - } - - if (!layer || layer.eles.length >= maxElesPerLayer || !boundingBoxInBoundingBox(layer.bb, ele.boundingBox())) { - // log('make new layer for ele %s', ele.id()); - layer = makeLayer({ - insert: true, - after: layer - }); // if now layer can be built then we can't use layers at this level - - if (!layer) { - return null; - } // log('new layer with id %s', layer.id); - - } - - if (tmpLayers || allowLazyQueueing) { - // log('queue ele %s in layer %s', ele.id(), layer.id); - self.queueLayer(layer, ele); - } else { - // log('draw ele %s in layer %s', ele.id(), layer.id); - self.drawEleInLayer(layer, ele, lvl, pxRatio); - } - - layer.eles.push(ele); - caches[lvl] = layer; - } // log('--'); - - - if (tmpLayers) { - // then we only queued the current layerset and can't draw it yet - return tmpLayers; - } - - if (allowLazyQueueing) { - // log('lazy queue level', lvl); - return null; - } - - return layers; -}; // a layer may want to use an ele cache of a higher level to avoid blurriness -// so the layer level might not equal the ele level - - -LTCp.getEleLevelForLayerLevel = function (lvl, pxRatio) { - return lvl; -}; - -LTCp.drawEleInLayer = function (layer, ele, lvl, pxRatio) { - var self = this; - var r = this.renderer; - var context = layer.context; - var bb = ele.boundingBox(); - - if (bb.w === 0 || bb.h === 0 || !ele.visible()) { - return; - } - - lvl = self.getEleLevelForLayerLevel(lvl, pxRatio); - - { - r.setImgSmoothing(context, false); - } - - { - r.drawCachedElement(context, ele, null, null, lvl, useHighQualityEleTxrReqs); - } - - { - r.setImgSmoothing(context, true); - } -}; - -LTCp.levelIsComplete = function (lvl, eles) { - var self = this; - var layers = self.layersByLevel[lvl]; - - if (!layers || layers.length === 0) { - return false; - } - - var numElesInLayers = 0; - - for (var i = 0; i < layers.length; i++) { - var layer = layers[i]; // if there are any eles needed to be drawn yet, the level is not complete - - if (layer.reqs > 0) { - return false; - } // if the layer is invalid, the level is not complete - - - if (layer.invalid) { - return false; - } - - numElesInLayers += layer.eles.length; - } // we should have exactly the number of eles passed in to be complete - - - if (numElesInLayers !== eles.length) { - return false; - } - - return true; -}; - -LTCp.validateLayersElesOrdering = function (lvl, eles) { - var layers = this.layersByLevel[lvl]; - - if (!layers) { - return; - } // if in a layer the eles are not in the same order, then the layer is invalid - // (i.e. there is an ele in between the eles in the layer) - - - for (var i = 0; i < layers.length; i++) { - var layer = layers[i]; - var offset = -1; // find the offset - - for (var j = 0; j < eles.length; j++) { - if (layer.eles[0] === eles[j]) { - offset = j; - break; - } - } - - if (offset < 0) { - // then the layer has nonexistent elements and is invalid - this.invalidateLayer(layer); - continue; - } // the eles in the layer must be in the same continuous order, else the layer is invalid - - - var o = offset; - - for (var j = 0; j < layer.eles.length; j++) { - if (layer.eles[j] !== eles[o + j]) { - // log('invalidate based on ordering', layer.id); - this.invalidateLayer(layer); - break; - } - } - } -}; - -LTCp.updateElementsInLayers = function (eles, update) { - var self = this; - var isEles = element(eles[0]); // collect udpated elements (cascaded from the layers) and update each - // layer itself along the way - - for (var i = 0; i < eles.length; i++) { - var req = isEles ? null : eles[i]; - var ele = isEles ? eles[i] : eles[i].ele; - var rs = ele._private.rscratch; - var caches = rs.imgLayerCaches = rs.imgLayerCaches || {}; - - for (var l = minLvl; l <= maxLvl; l++) { - var layer = caches[l]; - - if (!layer) { - continue; - } // if update is a request from the ele cache, then it affects only - // the matching level - - - if (req && self.getEleLevelForLayerLevel(layer.level) !== req.level) { - continue; - } - - update(layer, ele, req); - } - } -}; - -LTCp.haveLayers = function () { - var self = this; - var haveLayers = false; - - for (var l = minLvl; l <= maxLvl; l++) { - var layers = self.layersByLevel[l]; - - if (layers && layers.length > 0) { - haveLayers = true; - break; - } - } - - return haveLayers; -}; - -LTCp.invalidateElements = function (eles) { - var self = this; - - if (eles.length === 0) { - return; - } - - self.lastInvalidationTime = performanceNow(); // log('update invalidate layer time from eles'); - - if (eles.length === 0 || !self.haveLayers()) { - return; - } - - self.updateElementsInLayers(eles, function invalAssocLayers(layer, ele, req) { - self.invalidateLayer(layer); - }); -}; - -LTCp.invalidateLayer = function (layer) { - // log('update invalidate layer time'); - this.lastInvalidationTime = performanceNow(); - - if (layer.invalid) { - return; - } // save cycles - - - var lvl = layer.level; - var eles = layer.eles; - var layers = this.layersByLevel[lvl]; // log('invalidate layer', layer.id ); - - removeFromArray(layers, layer); // layer.eles = []; - - layer.elesQueue = []; - layer.invalid = true; - - if (layer.replacement) { - layer.replacement.invalid = true; - } - - for (var i = 0; i < eles.length; i++) { - var caches = eles[i]._private.rscratch.imgLayerCaches; - - if (caches) { - caches[lvl] = null; - } - } -}; - -LTCp.refineElementTextures = function (eles) { - var self = this; // log('refine', eles.length); - - self.updateElementsInLayers(eles, function refineEachEle(layer, ele, req) { - var rLyr = layer.replacement; - - if (!rLyr) { - rLyr = layer.replacement = self.makeLayer(layer.bb, layer.level); - rLyr.replaces = layer; - rLyr.eles = layer.eles; // log('make replacement layer %s for %s with level %s', rLyr.id, layer.id, rLyr.level); - } - - if (!rLyr.reqs) { - for (var i = 0; i < rLyr.eles.length; i++) { - self.queueLayer(rLyr, rLyr.eles[i]); - } // log('queue replacement layer refinement', rLyr.id); - - } - }); -}; - -LTCp.enqueueElementRefinement = function (ele) { - - this.eleTxrDeqs.merge(ele); - this.scheduleElementRefinement(); -}; - -LTCp.queueLayer = function (layer, ele) { - var self = this; - var q = self.layersQueue; - var elesQ = layer.elesQueue; - var hasId = elesQ.hasId = elesQ.hasId || {}; // if a layer is going to be replaced, queuing is a waste of time - - if (layer.replacement) { - return; - } - - if (ele) { - if (hasId[ele.id()]) { - return; - } - - elesQ.push(ele); - hasId[ele.id()] = true; - } - - if (layer.reqs) { - layer.reqs++; - q.updateItem(layer); - } else { - layer.reqs = 1; - q.push(layer); - } -}; - -LTCp.dequeue = function (pxRatio) { - var self = this; - var q = self.layersQueue; - var deqd = []; - var eleDeqs = 0; - - while (eleDeqs < maxDeqSize) { - if (q.size() === 0) { - break; - } - - var layer = q.peek(); // if a layer has been or will be replaced, then don't waste time with it - - if (layer.replacement) { - // log('layer %s in queue skipped b/c it already has a replacement', layer.id); - q.pop(); - continue; - } // if this is a replacement layer that has been superceded, then forget it - - - if (layer.replaces && layer !== layer.replaces.replacement) { - // log('layer is no longer the most uptodate replacement; dequeued', layer.id) - q.pop(); - continue; - } - - if (layer.invalid) { - // log('replacement layer %s is invalid; dequeued', layer.id); - q.pop(); - continue; - } - - var ele = layer.elesQueue.shift(); - - if (ele) { - // log('dequeue layer %s', layer.id); - self.drawEleInLayer(layer, ele, layer.level, pxRatio); - eleDeqs++; - } - - if (deqd.length === 0) { - // we need only one entry in deqd to queue redrawing etc - deqd.push(true); - } // if the layer has all its eles done, then remove from the queue - - - if (layer.elesQueue.length === 0) { - q.pop(); - layer.reqs = 0; // log('dequeue of layer %s complete', layer.id); - // when a replacement layer is dequeued, it replaces the old layer in the level - - if (layer.replaces) { - self.applyLayerReplacement(layer); - } - - self.requestRedraw(); - } - } - - return deqd; -}; - -LTCp.applyLayerReplacement = function (layer) { - var self = this; - var layersInLevel = self.layersByLevel[layer.level]; - var replaced = layer.replaces; - var index = layersInLevel.indexOf(replaced); // if the replaced layer is not in the active list for the level, then replacing - // refs would be a mistake (i.e. overwriting the true active layer) - - if (index < 0 || replaced.invalid) { - // log('replacement layer would have no effect', layer.id); - return; - } - - layersInLevel[index] = layer; // replace level ref - // replace refs in eles - - for (var i = 0; i < layer.eles.length; i++) { - var _p = layer.eles[i]._private; - var cache = _p.imgLayerCaches = _p.imgLayerCaches || {}; - - if (cache) { - cache[layer.level] = layer; - } - } // log('apply replacement layer %s over %s', layer.id, replaced.id); - - - self.requestRedraw(); -}; - -LTCp.requestRedraw = debounce__default["default"](function () { - var r = this.renderer; - r.redrawHint('eles', true); - r.redrawHint('drag', true); - r.redraw(); -}, 100); -LTCp.setupDequeueing = defs.setupDequeueing({ - deqRedrawThreshold: deqRedrawThreshold, - deqCost: deqCost, - deqAvgCost: deqAvgCost, - deqNoDrawCost: deqNoDrawCost, - deqFastCost: deqFastCost, - deq: function deq(self, pxRatio) { - return self.dequeue(pxRatio); - }, - onDeqd: noop$1, - shouldRedraw: trueify, - priority: function priority(self) { - return self.renderer.beforeRenderPriorities.lyrTxrDeq; - } -}); - -var CRp$a = {}; -var impl; - -function polygon(context, points) { - for (var i = 0; i < points.length; i++) { - var pt = points[i]; - context.lineTo(pt.x, pt.y); - } -} - -function triangleBackcurve(context, points, controlPoint) { - var firstPt; - - for (var i = 0; i < points.length; i++) { - var pt = points[i]; - - if (i === 0) { - firstPt = pt; - } - - context.lineTo(pt.x, pt.y); - } - - context.quadraticCurveTo(controlPoint.x, controlPoint.y, firstPt.x, firstPt.y); -} - -function triangleTee(context, trianglePoints, teePoints) { - if (context.beginPath) { - context.beginPath(); - } - - var triPts = trianglePoints; - - for (var i = 0; i < triPts.length; i++) { - var pt = triPts[i]; - context.lineTo(pt.x, pt.y); - } - - var teePts = teePoints; - var firstTeePt = teePoints[0]; - context.moveTo(firstTeePt.x, firstTeePt.y); - - for (var i = 1; i < teePts.length; i++) { - var pt = teePts[i]; - context.lineTo(pt.x, pt.y); - } - - if (context.closePath) { - context.closePath(); - } -} - -function circleTriangle(context, trianglePoints, rx, ry, r) { - if (context.beginPath) { - context.beginPath(); - } - - context.arc(rx, ry, r, 0, Math.PI * 2, false); - var triPts = trianglePoints; - var firstTrPt = triPts[0]; - context.moveTo(firstTrPt.x, firstTrPt.y); - - for (var i = 0; i < triPts.length; i++) { - var pt = triPts[i]; - context.lineTo(pt.x, pt.y); - } - - if (context.closePath) { - context.closePath(); - } -} - -function circle(context, rx, ry, r) { - context.arc(rx, ry, r, 0, Math.PI * 2, false); -} - -CRp$a.arrowShapeImpl = function (name) { - return (impl || (impl = { - 'polygon': polygon, - 'triangle-backcurve': triangleBackcurve, - 'triangle-tee': triangleTee, - 'circle-triangle': circleTriangle, - 'triangle-cross': triangleTee, - 'circle': circle - }))[name]; -}; - -var CRp$9 = {}; - -CRp$9.drawElement = function (context, ele, shiftToOriginWithBb, showLabel, showOverlay, showOpacity) { - var r = this; - - if (ele.isNode()) { - r.drawNode(context, ele, shiftToOriginWithBb, showLabel, showOverlay, showOpacity); - } else { - r.drawEdge(context, ele, shiftToOriginWithBb, showLabel, showOverlay, showOpacity); - } -}; - -CRp$9.drawElementOverlay = function (context, ele) { - var r = this; - - if (ele.isNode()) { - r.drawNodeOverlay(context, ele); - } else { - r.drawEdgeOverlay(context, ele); - } -}; - -CRp$9.drawElementUnderlay = function (context, ele) { - var r = this; - - if (ele.isNode()) { - r.drawNodeUnderlay(context, ele); - } else { - r.drawEdgeUnderlay(context, ele); - } -}; - -CRp$9.drawCachedElementPortion = function (context, ele, eleTxrCache, pxRatio, lvl, reason, getRotation, getOpacity) { - var r = this; - var bb = eleTxrCache.getBoundingBox(ele); - - if (bb.w === 0 || bb.h === 0) { - return; - } // ignore zero size case - - - var eleCache = eleTxrCache.getElement(ele, bb, pxRatio, lvl, reason); - - if (eleCache != null) { - var opacity = getOpacity(r, ele); - - if (opacity === 0) { - return; - } - - var theta = getRotation(r, ele); - var x1 = bb.x1, - y1 = bb.y1, - w = bb.w, - h = bb.h; - var x, y, sx, sy, smooth; - - if (theta !== 0) { - var rotPt = eleTxrCache.getRotationPoint(ele); - sx = rotPt.x; - sy = rotPt.y; - context.translate(sx, sy); - context.rotate(theta); - smooth = r.getImgSmoothing(context); - - if (!smooth) { - r.setImgSmoothing(context, true); - } - - var off = eleTxrCache.getRotationOffset(ele); - x = off.x; - y = off.y; - } else { - x = x1; - y = y1; - } - - var oldGlobalAlpha; - - if (opacity !== 1) { - oldGlobalAlpha = context.globalAlpha; - context.globalAlpha = oldGlobalAlpha * opacity; - } - - context.drawImage(eleCache.texture.canvas, eleCache.x, 0, eleCache.width, eleCache.height, x, y, w, h); - - if (opacity !== 1) { - context.globalAlpha = oldGlobalAlpha; - } - - if (theta !== 0) { - context.rotate(-theta); - context.translate(-sx, -sy); - - if (!smooth) { - r.setImgSmoothing(context, false); - } - } - } else { - eleTxrCache.drawElement(context, ele); // direct draw fallback - } -}; - -var getZeroRotation = function getZeroRotation() { - return 0; -}; - -var getLabelRotation = function getLabelRotation(r, ele) { - return r.getTextAngle(ele, null); -}; - -var getSourceLabelRotation = function getSourceLabelRotation(r, ele) { - return r.getTextAngle(ele, 'source'); -}; - -var getTargetLabelRotation = function getTargetLabelRotation(r, ele) { - return r.getTextAngle(ele, 'target'); -}; - -var getOpacity = function getOpacity(r, ele) { - return ele.effectiveOpacity(); -}; - -var getTextOpacity = function getTextOpacity(e, ele) { - return ele.pstyle('text-opacity').pfValue * ele.effectiveOpacity(); -}; - -CRp$9.drawCachedElement = function (context, ele, pxRatio, extent, lvl, requestHighQuality) { - var r = this; - var _r$data = r.data, - eleTxrCache = _r$data.eleTxrCache, - lblTxrCache = _r$data.lblTxrCache, - slbTxrCache = _r$data.slbTxrCache, - tlbTxrCache = _r$data.tlbTxrCache; - var bb = ele.boundingBox(); - var reason = requestHighQuality === true ? eleTxrCache.reasons.highQuality : null; - - if (bb.w === 0 || bb.h === 0 || !ele.visible()) { - return; - } - - if (!extent || boundingBoxesIntersect(bb, extent)) { - var isEdge = ele.isEdge(); - - var badLine = ele.element()._private.rscratch.badLine; - - r.drawElementUnderlay(context, ele); - r.drawCachedElementPortion(context, ele, eleTxrCache, pxRatio, lvl, reason, getZeroRotation, getOpacity); - - if (!isEdge || !badLine) { - r.drawCachedElementPortion(context, ele, lblTxrCache, pxRatio, lvl, reason, getLabelRotation, getTextOpacity); - } - - if (isEdge && !badLine) { - r.drawCachedElementPortion(context, ele, slbTxrCache, pxRatio, lvl, reason, getSourceLabelRotation, getTextOpacity); - r.drawCachedElementPortion(context, ele, tlbTxrCache, pxRatio, lvl, reason, getTargetLabelRotation, getTextOpacity); - } - - r.drawElementOverlay(context, ele); - } -}; - -CRp$9.drawElements = function (context, eles) { - var r = this; - - for (var i = 0; i < eles.length; i++) { - var ele = eles[i]; - r.drawElement(context, ele); - } -}; - -CRp$9.drawCachedElements = function (context, eles, pxRatio, extent) { - var r = this; - - for (var i = 0; i < eles.length; i++) { - var ele = eles[i]; - r.drawCachedElement(context, ele, pxRatio, extent); - } -}; - -CRp$9.drawCachedNodes = function (context, eles, pxRatio, extent) { - var r = this; - - for (var i = 0; i < eles.length; i++) { - var ele = eles[i]; - - if (!ele.isNode()) { - continue; - } - - r.drawCachedElement(context, ele, pxRatio, extent); - } -}; - -CRp$9.drawLayeredElements = function (context, eles, pxRatio, extent) { - var r = this; - var layers = r.data.lyrTxrCache.getLayers(eles, pxRatio); - - if (layers) { - for (var i = 0; i < layers.length; i++) { - var layer = layers[i]; - var bb = layer.bb; - - if (bb.w === 0 || bb.h === 0) { - continue; - } - - context.drawImage(layer.canvas, bb.x1, bb.y1, bb.w, bb.h); - } - } else { - // fall back on plain caching if no layers - r.drawCachedElements(context, eles, pxRatio, extent); - } -}; - -/* global Path2D */ -var CRp$8 = {}; - -CRp$8.drawEdge = function (context, edge, shiftToOriginWithBb) { - var drawLabel = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - var shouldDrawOverlay = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; - var shouldDrawOpacity = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; - var r = this; - var rs = edge._private.rscratch; - - if (shouldDrawOpacity && !edge.visible()) { - return; - } // if bezier ctrl pts can not be calculated, then die - - - if (rs.badLine || rs.allpts == null || isNaN(rs.allpts[0])) { - // isNaN in case edge is impossible and browser bugs (e.g. safari) - return; - } - - var bb; - - if (shiftToOriginWithBb) { - bb = shiftToOriginWithBb; - context.translate(-bb.x1, -bb.y1); - } - - var opacity = shouldDrawOpacity ? edge.pstyle('opacity').value : 1; - var lineOpacity = shouldDrawOpacity ? edge.pstyle('line-opacity').value : 1; - var curveStyle = edge.pstyle('curve-style').value; - var lineStyle = edge.pstyle('line-style').value; - var edgeWidth = edge.pstyle('width').pfValue; - var lineCap = edge.pstyle('line-cap').value; - var effectiveLineOpacity = opacity * lineOpacity; // separate arrow opacity would require arrow-opacity property - - var effectiveArrowOpacity = opacity * lineOpacity; - - var drawLine = function drawLine() { - var strokeOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : effectiveLineOpacity; - - if (curveStyle === 'straight-triangle') { - r.eleStrokeStyle(context, edge, strokeOpacity); - r.drawEdgeTrianglePath(edge, context, rs.allpts); - } else { - context.lineWidth = edgeWidth; - context.lineCap = lineCap; - r.eleStrokeStyle(context, edge, strokeOpacity); - r.drawEdgePath(edge, context, rs.allpts, lineStyle); - context.lineCap = 'butt'; // reset for other drawing functions - } - }; - - var drawOverlay = function drawOverlay() { - if (!shouldDrawOverlay) { - return; - } - - r.drawEdgeOverlay(context, edge); - }; - - var drawUnderlay = function drawUnderlay() { - if (!shouldDrawOverlay) { - return; - } - - r.drawEdgeUnderlay(context, edge); - }; - - var drawArrows = function drawArrows() { - var arrowOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : effectiveArrowOpacity; - r.drawArrowheads(context, edge, arrowOpacity); - }; - - var drawText = function drawText() { - r.drawElementText(context, edge, null, drawLabel); - }; - - context.lineJoin = 'round'; - var ghost = edge.pstyle('ghost').value === 'yes'; - - if (ghost) { - var gx = edge.pstyle('ghost-offset-x').pfValue; - var gy = edge.pstyle('ghost-offset-y').pfValue; - var ghostOpacity = edge.pstyle('ghost-opacity').value; - var effectiveGhostOpacity = effectiveLineOpacity * ghostOpacity; - context.translate(gx, gy); - drawLine(effectiveGhostOpacity); - drawArrows(effectiveGhostOpacity); - context.translate(-gx, -gy); - } - - drawUnderlay(); - drawLine(); - drawArrows(); - drawOverlay(); - drawText(); - - if (shiftToOriginWithBb) { - context.translate(bb.x1, bb.y1); - } -}; - -var drawEdgeOverlayUnderlay = function drawEdgeOverlayUnderlay(overlayOrUnderlay) { - if (!['overlay', 'underlay'].includes(overlayOrUnderlay)) { - throw new Error('Invalid state'); - } - - return function (context, edge) { - if (!edge.visible()) { - return; - } - - var opacity = edge.pstyle("".concat(overlayOrUnderlay, "-opacity")).value; - - if (opacity === 0) { - return; - } - - var r = this; - var usePaths = r.usePaths(); - var rs = edge._private.rscratch; - var padding = edge.pstyle("".concat(overlayOrUnderlay, "-padding")).pfValue; - var width = 2 * padding; - var color = edge.pstyle("".concat(overlayOrUnderlay, "-color")).value; - context.lineWidth = width; - - if (rs.edgeType === 'self' && !usePaths) { - context.lineCap = 'butt'; - } else { - context.lineCap = 'round'; - } - - r.colorStrokeStyle(context, color[0], color[1], color[2], opacity); - r.drawEdgePath(edge, context, rs.allpts, 'solid'); - }; -}; - -CRp$8.drawEdgeOverlay = drawEdgeOverlayUnderlay('overlay'); -CRp$8.drawEdgeUnderlay = drawEdgeOverlayUnderlay('underlay'); - -CRp$8.drawEdgePath = function (edge, context, pts, type) { - var rs = edge._private.rscratch; - var canvasCxt = context; - var path; - var pathCacheHit = false; - var usePaths = this.usePaths(); - var lineDashPattern = edge.pstyle('line-dash-pattern').pfValue; - var lineDashOffset = edge.pstyle('line-dash-offset').pfValue; - - if (usePaths) { - var pathCacheKey = pts.join('$'); - var keyMatches = rs.pathCacheKey && rs.pathCacheKey === pathCacheKey; - - if (keyMatches) { - path = context = rs.pathCache; - pathCacheHit = true; - } else { - path = context = new Path2D(); - rs.pathCacheKey = pathCacheKey; - rs.pathCache = path; - } - } - - if (canvasCxt.setLineDash) { - // for very outofdate browsers - switch (type) { - case 'dotted': - canvasCxt.setLineDash([1, 1]); - break; - - case 'dashed': - canvasCxt.setLineDash(lineDashPattern); - canvasCxt.lineDashOffset = lineDashOffset; - break; - - case 'solid': - canvasCxt.setLineDash([]); - break; - } - } - - if (!pathCacheHit && !rs.badLine) { - if (context.beginPath) { - context.beginPath(); - } - - context.moveTo(pts[0], pts[1]); - - switch (rs.edgeType) { - case 'bezier': - case 'self': - case 'compound': - case 'multibezier': - for (var i = 2; i + 3 < pts.length; i += 4) { - context.quadraticCurveTo(pts[i], pts[i + 1], pts[i + 2], pts[i + 3]); - } - - break; - - case 'straight': - case 'segments': - case 'haystack': - for (var _i = 2; _i + 1 < pts.length; _i += 2) { - context.lineTo(pts[_i], pts[_i + 1]); - } - - break; - } - } - - context = canvasCxt; - - if (usePaths) { - context.stroke(path); - } else { - context.stroke(); - } // reset any line dashes - - - if (context.setLineDash) { - // for very outofdate browsers - context.setLineDash([]); - } -}; - -CRp$8.drawEdgeTrianglePath = function (edge, context, pts) { - // use line stroke style for triangle fill style - context.fillStyle = context.strokeStyle; - var edgeWidth = edge.pstyle('width').pfValue; - - for (var i = 0; i + 1 < pts.length; i += 2) { - var vector = [pts[i + 2] - pts[i], pts[i + 3] - pts[i + 1]]; - var length = Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1]); - var normal = [vector[1] / length, -vector[0] / length]; - var triangleHead = [normal[0] * edgeWidth / 2, normal[1] * edgeWidth / 2]; - context.beginPath(); - context.moveTo(pts[i] - triangleHead[0], pts[i + 1] - triangleHead[1]); - context.lineTo(pts[i] + triangleHead[0], pts[i + 1] + triangleHead[1]); - context.lineTo(pts[i + 2], pts[i + 3]); - context.closePath(); - context.fill(); - } -}; - -CRp$8.drawArrowheads = function (context, edge, opacity) { - var rs = edge._private.rscratch; - var isHaystack = rs.edgeType === 'haystack'; - - if (!isHaystack) { - this.drawArrowhead(context, edge, 'source', rs.arrowStartX, rs.arrowStartY, rs.srcArrowAngle, opacity); - } - - this.drawArrowhead(context, edge, 'mid-target', rs.midX, rs.midY, rs.midtgtArrowAngle, opacity); - this.drawArrowhead(context, edge, 'mid-source', rs.midX, rs.midY, rs.midsrcArrowAngle, opacity); - - if (!isHaystack) { - this.drawArrowhead(context, edge, 'target', rs.arrowEndX, rs.arrowEndY, rs.tgtArrowAngle, opacity); - } -}; - -CRp$8.drawArrowhead = function (context, edge, prefix, x, y, angle, opacity) { - if (isNaN(x) || x == null || isNaN(y) || y == null || isNaN(angle) || angle == null) { - return; - } - - var self = this; - var arrowShape = edge.pstyle(prefix + '-arrow-shape').value; - - if (arrowShape === 'none') { - return; - } - - var arrowClearFill = edge.pstyle(prefix + '-arrow-fill').value === 'hollow' ? 'both' : 'filled'; - var arrowFill = edge.pstyle(prefix + '-arrow-fill').value; - var edgeWidth = edge.pstyle('width').pfValue; - var edgeOpacity = edge.pstyle('opacity').value; - - if (opacity === undefined) { - opacity = edgeOpacity; - } - - var gco = context.globalCompositeOperation; - - if (opacity !== 1 || arrowFill === 'hollow') { - // then extra clear is needed - context.globalCompositeOperation = 'destination-out'; - self.colorFillStyle(context, 255, 255, 255, 1); - self.colorStrokeStyle(context, 255, 255, 255, 1); - self.drawArrowShape(edge, context, arrowClearFill, edgeWidth, arrowShape, x, y, angle); - context.globalCompositeOperation = gco; - } // otherwise, the opaque arrow clears it for free :) - - - var color = edge.pstyle(prefix + '-arrow-color').value; - self.colorFillStyle(context, color[0], color[1], color[2], opacity); - self.colorStrokeStyle(context, color[0], color[1], color[2], opacity); - self.drawArrowShape(edge, context, arrowFill, edgeWidth, arrowShape, x, y, angle); -}; - -CRp$8.drawArrowShape = function (edge, context, fill, edgeWidth, shape, x, y, angle) { - var r = this; - var usePaths = this.usePaths() && shape !== 'triangle-cross'; - var pathCacheHit = false; - var path; - var canvasContext = context; - var translation = { - x: x, - y: y - }; - var scale = edge.pstyle('arrow-scale').value; - var size = this.getArrowWidth(edgeWidth, scale); - var shapeImpl = r.arrowShapes[shape]; - - if (usePaths) { - var cache = r.arrowPathCache = r.arrowPathCache || []; - var key = hashString(shape); - var cachedPath = cache[key]; - - if (cachedPath != null) { - path = context = cachedPath; - pathCacheHit = true; - } else { - path = context = new Path2D(); - cache[key] = path; - } - } - - if (!pathCacheHit) { - if (context.beginPath) { - context.beginPath(); - } - - if (usePaths) { - // store in the path cache with values easily manipulated later - shapeImpl.draw(context, 1, 0, { - x: 0, - y: 0 - }, 1); - } else { - shapeImpl.draw(context, size, angle, translation, edgeWidth); - } - - if (context.closePath) { - context.closePath(); - } - } - - context = canvasContext; - - if (usePaths) { - // set transform to arrow position/orientation - context.translate(x, y); - context.rotate(angle); - context.scale(size, size); - } - - if (fill === 'filled' || fill === 'both') { - if (usePaths) { - context.fill(path); - } else { - context.fill(); - } - } - - if (fill === 'hollow' || fill === 'both') { - context.lineWidth = (shapeImpl.matchEdgeWidth ? edgeWidth : 1) / (usePaths ? size : 1); - context.lineJoin = 'miter'; - - if (usePaths) { - context.stroke(path); - } else { - context.stroke(); - } - } - - if (usePaths) { - // reset transform by applying inverse - context.scale(1 / size, 1 / size); - context.rotate(-angle); - context.translate(-x, -y); - } -}; - -var CRp$7 = {}; - -CRp$7.safeDrawImage = function (context, img, ix, iy, iw, ih, x, y, w, h) { - // detect problematic cases for old browsers with bad images (cheaper than try-catch) - if (iw <= 0 || ih <= 0 || w <= 0 || h <= 0) { - return; - } - - try { - context.drawImage(img, ix, iy, iw, ih, x, y, w, h); - } catch (e) { - warn(e); - } -}; - -CRp$7.drawInscribedImage = function (context, img, node, index, nodeOpacity) { - var r = this; - var pos = node.position(); - var nodeX = pos.x; - var nodeY = pos.y; - var styleObj = node.cy().style(); - var getIndexedStyle = styleObj.getIndexedStyle.bind(styleObj); - var fit = getIndexedStyle(node, 'background-fit', 'value', index); - var repeat = getIndexedStyle(node, 'background-repeat', 'value', index); - var nodeW = node.width(); - var nodeH = node.height(); - var paddingX2 = node.padding() * 2; - var nodeTW = nodeW + (getIndexedStyle(node, 'background-width-relative-to', 'value', index) === 'inner' ? 0 : paddingX2); - var nodeTH = nodeH + (getIndexedStyle(node, 'background-height-relative-to', 'value', index) === 'inner' ? 0 : paddingX2); - var rs = node._private.rscratch; - var clip = getIndexedStyle(node, 'background-clip', 'value', index); - var shouldClip = clip === 'node'; - var imgOpacity = getIndexedStyle(node, 'background-image-opacity', 'value', index) * nodeOpacity; - var smooth = getIndexedStyle(node, 'background-image-smoothing', 'value', index); - var imgW = img.width || img.cachedW; - var imgH = img.height || img.cachedH; // workaround for broken browsers like ie - - if (null == imgW || null == imgH) { - document.body.appendChild(img); // eslint-disable-line no-undef - - imgW = img.cachedW = img.width || img.offsetWidth; - imgH = img.cachedH = img.height || img.offsetHeight; - document.body.removeChild(img); // eslint-disable-line no-undef - } - - var w = imgW; - var h = imgH; - - if (getIndexedStyle(node, 'background-width', 'value', index) !== 'auto') { - if (getIndexedStyle(node, 'background-width', 'units', index) === '%') { - w = getIndexedStyle(node, 'background-width', 'pfValue', index) * nodeTW; - } else { - w = getIndexedStyle(node, 'background-width', 'pfValue', index); - } - } - - if (getIndexedStyle(node, 'background-height', 'value', index) !== 'auto') { - if (getIndexedStyle(node, 'background-height', 'units', index) === '%') { - h = getIndexedStyle(node, 'background-height', 'pfValue', index) * nodeTH; - } else { - h = getIndexedStyle(node, 'background-height', 'pfValue', index); - } - } - - if (w === 0 || h === 0) { - return; // no point in drawing empty image (and chrome is broken in this case) - } - - if (fit === 'contain') { - var scale = Math.min(nodeTW / w, nodeTH / h); - w *= scale; - h *= scale; - } else if (fit === 'cover') { - var scale = Math.max(nodeTW / w, nodeTH / h); - w *= scale; - h *= scale; - } - - var x = nodeX - nodeTW / 2; // left - - var posXUnits = getIndexedStyle(node, 'background-position-x', 'units', index); - var posXPfVal = getIndexedStyle(node, 'background-position-x', 'pfValue', index); - - if (posXUnits === '%') { - x += (nodeTW - w) * posXPfVal; - } else { - x += posXPfVal; - } - - var offXUnits = getIndexedStyle(node, 'background-offset-x', 'units', index); - var offXPfVal = getIndexedStyle(node, 'background-offset-x', 'pfValue', index); - - if (offXUnits === '%') { - x += (nodeTW - w) * offXPfVal; - } else { - x += offXPfVal; - } - - var y = nodeY - nodeTH / 2; // top - - var posYUnits = getIndexedStyle(node, 'background-position-y', 'units', index); - var posYPfVal = getIndexedStyle(node, 'background-position-y', 'pfValue', index); - - if (posYUnits === '%') { - y += (nodeTH - h) * posYPfVal; - } else { - y += posYPfVal; - } - - var offYUnits = getIndexedStyle(node, 'background-offset-y', 'units', index); - var offYPfVal = getIndexedStyle(node, 'background-offset-y', 'pfValue', index); - - if (offYUnits === '%') { - y += (nodeTH - h) * offYPfVal; - } else { - y += offYPfVal; - } - - if (rs.pathCache) { - x -= nodeX; - y -= nodeY; - nodeX = 0; - nodeY = 0; - } - - var gAlpha = context.globalAlpha; - context.globalAlpha = imgOpacity; - var smoothingEnabled = r.getImgSmoothing(context); - var isSmoothingSwitched = false; - - if (smooth === 'no' && smoothingEnabled) { - r.setImgSmoothing(context, false); - isSmoothingSwitched = true; - } else if (smooth === 'yes' && !smoothingEnabled) { - r.setImgSmoothing(context, true); - isSmoothingSwitched = true; - } - - if (repeat === 'no-repeat') { - if (shouldClip) { - context.save(); - - if (rs.pathCache) { - context.clip(rs.pathCache); - } else { - r.nodeShapes[r.getNodeShape(node)].draw(context, nodeX, nodeY, nodeTW, nodeTH); - context.clip(); - } - } - - r.safeDrawImage(context, img, 0, 0, imgW, imgH, x, y, w, h); - - if (shouldClip) { - context.restore(); - } - } else { - var pattern = context.createPattern(img, repeat); - context.fillStyle = pattern; - r.nodeShapes[r.getNodeShape(node)].draw(context, nodeX, nodeY, nodeTW, nodeTH); - context.translate(x, y); - context.fill(); - context.translate(-x, -y); - } - - context.globalAlpha = gAlpha; - - if (isSmoothingSwitched) { - r.setImgSmoothing(context, smoothingEnabled); - } -}; - -var CRp$6 = {}; - -CRp$6.eleTextBiggerThanMin = function (ele, scale) { - if (!scale) { - var zoom = ele.cy().zoom(); - var pxRatio = this.getPixelRatio(); - var lvl = Math.ceil(log2(zoom * pxRatio)); // the effective texture level - - scale = Math.pow(2, lvl); - } - - var computedSize = ele.pstyle('font-size').pfValue * scale; - var minSize = ele.pstyle('min-zoomed-font-size').pfValue; - - if (computedSize < minSize) { - return false; - } - - return true; -}; - -CRp$6.drawElementText = function (context, ele, shiftToOriginWithBb, force, prefix) { - var useEleOpacity = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; - var r = this; - - if (force == null) { - if (useEleOpacity && !r.eleTextBiggerThanMin(ele)) { - return; - } - } else if (force === false) { - return; - } - - if (ele.isNode()) { - var label = ele.pstyle('label'); - - if (!label || !label.value) { - return; - } - - var justification = r.getLabelJustification(ele); - context.textAlign = justification; - context.textBaseline = 'bottom'; - } else { - var badLine = ele.element()._private.rscratch.badLine; - - var _label = ele.pstyle('label'); - - var srcLabel = ele.pstyle('source-label'); - var tgtLabel = ele.pstyle('target-label'); - - if (badLine || (!_label || !_label.value) && (!srcLabel || !srcLabel.value) && (!tgtLabel || !tgtLabel.value)) { - return; - } - - context.textAlign = 'center'; - context.textBaseline = 'bottom'; - } - - var applyRotation = !shiftToOriginWithBb; - var bb; - - if (shiftToOriginWithBb) { - bb = shiftToOriginWithBb; - context.translate(-bb.x1, -bb.y1); - } - - if (prefix == null) { - r.drawText(context, ele, null, applyRotation, useEleOpacity); - - if (ele.isEdge()) { - r.drawText(context, ele, 'source', applyRotation, useEleOpacity); - r.drawText(context, ele, 'target', applyRotation, useEleOpacity); - } - } else { - r.drawText(context, ele, prefix, applyRotation, useEleOpacity); - } - - if (shiftToOriginWithBb) { - context.translate(bb.x1, bb.y1); - } -}; - -CRp$6.getFontCache = function (context) { - var cache; - this.fontCaches = this.fontCaches || []; - - for (var i = 0; i < this.fontCaches.length; i++) { - cache = this.fontCaches[i]; - - if (cache.context === context) { - return cache; - } - } - - cache = { - context: context - }; - this.fontCaches.push(cache); - return cache; -}; // set up canvas context with font -// returns transformed text string - - -CRp$6.setupTextStyle = function (context, ele) { - var useEleOpacity = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; - // Font style - var labelStyle = ele.pstyle('font-style').strValue; - var labelSize = ele.pstyle('font-size').pfValue + 'px'; - var labelFamily = ele.pstyle('font-family').strValue; - var labelWeight = ele.pstyle('font-weight').strValue; - var opacity = useEleOpacity ? ele.effectiveOpacity() * ele.pstyle('text-opacity').value : 1; - var outlineOpacity = ele.pstyle('text-outline-opacity').value * opacity; - var color = ele.pstyle('color').value; - var outlineColor = ele.pstyle('text-outline-color').value; - context.font = labelStyle + ' ' + labelWeight + ' ' + labelSize + ' ' + labelFamily; - context.lineJoin = 'round'; // so text outlines aren't jagged - - this.colorFillStyle(context, color[0], color[1], color[2], opacity); - this.colorStrokeStyle(context, outlineColor[0], outlineColor[1], outlineColor[2], outlineOpacity); -}; // TODO ensure re-used - - -function roundRect(ctx, x, y, width, height) { - var radius = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 5; - ctx.beginPath(); - ctx.moveTo(x + radius, y); - ctx.lineTo(x + width - radius, y); - ctx.quadraticCurveTo(x + width, y, x + width, y + radius); - ctx.lineTo(x + width, y + height - radius); - ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); - ctx.lineTo(x + radius, y + height); - ctx.quadraticCurveTo(x, y + height, x, y + height - radius); - ctx.lineTo(x, y + radius); - ctx.quadraticCurveTo(x, y, x + radius, y); - ctx.closePath(); - ctx.fill(); -} - -CRp$6.getTextAngle = function (ele, prefix) { - var theta; - var _p = ele._private; - var rscratch = _p.rscratch; - var pdash = prefix ? prefix + '-' : ''; - var rotation = ele.pstyle(pdash + 'text-rotation'); - var textAngle = getPrefixedProperty(rscratch, 'labelAngle', prefix); - - if (rotation.strValue === 'autorotate') { - theta = ele.isEdge() ? textAngle : 0; - } else if (rotation.strValue === 'none') { - theta = 0; - } else { - theta = rotation.pfValue; - } - - return theta; -}; - -CRp$6.drawText = function (context, ele, prefix) { - var applyRotation = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - var useEleOpacity = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; - var _p = ele._private; - var rscratch = _p.rscratch; - var parentOpacity = useEleOpacity ? ele.effectiveOpacity() : 1; - - if (useEleOpacity && (parentOpacity === 0 || ele.pstyle('text-opacity').value === 0)) { - return; - } // use 'main' as an alias for the main label (i.e. null prefix) - - - if (prefix === 'main') { - prefix = null; - } - - var textX = getPrefixedProperty(rscratch, 'labelX', prefix); - var textY = getPrefixedProperty(rscratch, 'labelY', prefix); - var orgTextX, orgTextY; // used for rotation - - var text = this.getLabelText(ele, prefix); - - if (text != null && text !== '' && !isNaN(textX) && !isNaN(textY)) { - this.setupTextStyle(context, ele, useEleOpacity); - var pdash = prefix ? prefix + '-' : ''; - var textW = getPrefixedProperty(rscratch, 'labelWidth', prefix); - var textH = getPrefixedProperty(rscratch, 'labelHeight', prefix); - var marginX = ele.pstyle(pdash + 'text-margin-x').pfValue; - var marginY = ele.pstyle(pdash + 'text-margin-y').pfValue; - var isEdge = ele.isEdge(); - var halign = ele.pstyle('text-halign').value; - var valign = ele.pstyle('text-valign').value; - - if (isEdge) { - halign = 'center'; - valign = 'center'; - } - - textX += marginX; - textY += marginY; - var theta; - - if (!applyRotation) { - theta = 0; - } else { - theta = this.getTextAngle(ele, prefix); - } - - if (theta !== 0) { - orgTextX = textX; - orgTextY = textY; - context.translate(orgTextX, orgTextY); - context.rotate(theta); - textX = 0; - textY = 0; - } - - switch (valign) { - case 'top': - break; - - case 'center': - textY += textH / 2; - break; - - case 'bottom': - textY += textH; - break; - } - - var backgroundOpacity = ele.pstyle('text-background-opacity').value; - var borderOpacity = ele.pstyle('text-border-opacity').value; - var textBorderWidth = ele.pstyle('text-border-width').pfValue; - var backgroundPadding = ele.pstyle('text-background-padding').pfValue; - - if (backgroundOpacity > 0 || textBorderWidth > 0 && borderOpacity > 0) { - var bgX = textX - backgroundPadding; - - switch (halign) { - case 'left': - bgX -= textW; - break; - - case 'center': - bgX -= textW / 2; - break; - } - - var bgY = textY - textH - backgroundPadding; - var bgW = textW + 2 * backgroundPadding; - var bgH = textH + 2 * backgroundPadding; - - if (backgroundOpacity > 0) { - var textFill = context.fillStyle; - var textBackgroundColor = ele.pstyle('text-background-color').value; - context.fillStyle = 'rgba(' + textBackgroundColor[0] + ',' + textBackgroundColor[1] + ',' + textBackgroundColor[2] + ',' + backgroundOpacity * parentOpacity + ')'; - var styleShape = ele.pstyle('text-background-shape').strValue; - - if (styleShape.indexOf('round') === 0) { - roundRect(context, bgX, bgY, bgW, bgH, 2); - } else { - context.fillRect(bgX, bgY, bgW, bgH); - } - - context.fillStyle = textFill; - } - - if (textBorderWidth > 0 && borderOpacity > 0) { - var textStroke = context.strokeStyle; - var textLineWidth = context.lineWidth; - var textBorderColor = ele.pstyle('text-border-color').value; - var textBorderStyle = ele.pstyle('text-border-style').value; - context.strokeStyle = 'rgba(' + textBorderColor[0] + ',' + textBorderColor[1] + ',' + textBorderColor[2] + ',' + borderOpacity * parentOpacity + ')'; - context.lineWidth = textBorderWidth; - - if (context.setLineDash) { - // for very outofdate browsers - switch (textBorderStyle) { - case 'dotted': - context.setLineDash([1, 1]); - break; - - case 'dashed': - context.setLineDash([4, 2]); - break; - - case 'double': - context.lineWidth = textBorderWidth / 4; // 50% reserved for white between the two borders - - context.setLineDash([]); - break; - - case 'solid': - context.setLineDash([]); - break; - } - } - - context.strokeRect(bgX, bgY, bgW, bgH); - - if (textBorderStyle === 'double') { - var whiteWidth = textBorderWidth / 2; - context.strokeRect(bgX + whiteWidth, bgY + whiteWidth, bgW - whiteWidth * 2, bgH - whiteWidth * 2); - } - - if (context.setLineDash) { - // for very outofdate browsers - context.setLineDash([]); - } - - context.lineWidth = textLineWidth; - context.strokeStyle = textStroke; - } - } - - var lineWidth = 2 * ele.pstyle('text-outline-width').pfValue; // *2 b/c the stroke is drawn centred on the middle - - if (lineWidth > 0) { - context.lineWidth = lineWidth; - } - - if (ele.pstyle('text-wrap').value === 'wrap') { - var lines = getPrefixedProperty(rscratch, 'labelWrapCachedLines', prefix); - var lineHeight = getPrefixedProperty(rscratch, 'labelLineHeight', prefix); - var halfTextW = textW / 2; - var justification = this.getLabelJustification(ele); - - if (justification === 'auto') ; else if (halign === 'left') { - // auto justification : right - if (justification === 'left') { - textX += -textW; - } else if (justification === 'center') { - textX += -halfTextW; - } // else same as auto - - } else if (halign === 'center') { - // auto justfication : center - if (justification === 'left') { - textX += -halfTextW; - } else if (justification === 'right') { - textX += halfTextW; - } // else same as auto - - } else if (halign === 'right') { - // auto justification : left - if (justification === 'center') { - textX += halfTextW; - } else if (justification === 'right') { - textX += textW; - } // else same as auto - - } - - switch (valign) { - case 'top': - textY -= (lines.length - 1) * lineHeight; - break; - - case 'center': - case 'bottom': - textY -= (lines.length - 1) * lineHeight; - break; - } - - for (var l = 0; l < lines.length; l++) { - if (lineWidth > 0) { - context.strokeText(lines[l], textX, textY); - } - - context.fillText(lines[l], textX, textY); - textY += lineHeight; - } - } else { - if (lineWidth > 0) { - context.strokeText(text, textX, textY); - } - - context.fillText(text, textX, textY); - } - - if (theta !== 0) { - context.rotate(-theta); - context.translate(-orgTextX, -orgTextY); - } - } -}; - -/* global Path2D */ -var CRp$5 = {}; - -CRp$5.drawNode = function (context, node, shiftToOriginWithBb) { - var drawLabel = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - var shouldDrawOverlay = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; - var shouldDrawOpacity = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; - var r = this; - var nodeWidth, nodeHeight; - var _p = node._private; - var rs = _p.rscratch; - var pos = node.position(); - - if (!number$1(pos.x) || !number$1(pos.y)) { - return; // can't draw node with undefined position - } - - if (shouldDrawOpacity && !node.visible()) { - return; - } - - var eleOpacity = shouldDrawOpacity ? node.effectiveOpacity() : 1; - var usePaths = r.usePaths(); - var path; - var pathCacheHit = false; - var padding = node.padding(); - nodeWidth = node.width() + 2 * padding; - nodeHeight = node.height() + 2 * padding; // - // setup shift - - var bb; - - if (shiftToOriginWithBb) { - bb = shiftToOriginWithBb; - context.translate(-bb.x1, -bb.y1); - } // - // load bg image - - - var bgImgProp = node.pstyle('background-image'); - var urls = bgImgProp.value; - var urlDefined = new Array(urls.length); - var image = new Array(urls.length); - var numImages = 0; - - for (var i = 0; i < urls.length; i++) { - var url = urls[i]; - var defd = urlDefined[i] = url != null && url !== 'none'; - - if (defd) { - var bgImgCrossOrigin = node.cy().style().getIndexedStyle(node, 'background-image-crossorigin', 'value', i); - numImages++; // get image, and if not loaded then ask to redraw when later loaded - - image[i] = r.getCachedImage(url, bgImgCrossOrigin, function () { - _p.backgroundTimestamp = Date.now(); - node.emitAndNotify('background'); - }); - } - } // - // setup styles - - - var darkness = node.pstyle('background-blacken').value; - var borderWidth = node.pstyle('border-width').pfValue; - var bgOpacity = node.pstyle('background-opacity').value * eleOpacity; - var borderColor = node.pstyle('border-color').value; - var borderStyle = node.pstyle('border-style').value; - var borderOpacity = node.pstyle('border-opacity').value * eleOpacity; - context.lineJoin = 'miter'; // so borders are square with the node shape - - var setupShapeColor = function setupShapeColor() { - var bgOpy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : bgOpacity; - r.eleFillStyle(context, node, bgOpy); - }; - - var setupBorderColor = function setupBorderColor() { - var bdrOpy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : borderOpacity; - r.colorStrokeStyle(context, borderColor[0], borderColor[1], borderColor[2], bdrOpy); - }; // - // setup shape - - - var styleShape = node.pstyle('shape').strValue; - var shapePts = node.pstyle('shape-polygon-points').pfValue; - - if (usePaths) { - context.translate(pos.x, pos.y); - var pathCache = r.nodePathCache = r.nodePathCache || []; - var key = hashStrings(styleShape === 'polygon' ? styleShape + ',' + shapePts.join(',') : styleShape, '' + nodeHeight, '' + nodeWidth); - var cachedPath = pathCache[key]; - - if (cachedPath != null) { - path = cachedPath; - pathCacheHit = true; - rs.pathCache = path; - } else { - path = new Path2D(); - pathCache[key] = rs.pathCache = path; - } - } - - var drawShape = function drawShape() { - if (!pathCacheHit) { - var npos = pos; - - if (usePaths) { - npos = { - x: 0, - y: 0 - }; - } - - r.nodeShapes[r.getNodeShape(node)].draw(path || context, npos.x, npos.y, nodeWidth, nodeHeight); - } - - if (usePaths) { - context.fill(path); - } else { - context.fill(); - } - }; - - var drawImages = function drawImages() { - var nodeOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : eleOpacity; - var inside = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - var prevBging = _p.backgrounding; - var totalCompleted = 0; - - for (var _i = 0; _i < image.length; _i++) { - var bgContainment = node.cy().style().getIndexedStyle(node, 'background-image-containment', 'value', _i); - - if (inside && bgContainment === 'over' || !inside && bgContainment === 'inside') { - totalCompleted++; - continue; - } - - if (urlDefined[_i] && image[_i].complete && !image[_i].error) { - totalCompleted++; - r.drawInscribedImage(context, image[_i], node, _i, nodeOpacity); - } - } - - _p.backgrounding = !(totalCompleted === numImages); - - if (prevBging !== _p.backgrounding) { - // update style b/c :backgrounding state changed - node.updateStyle(false); - } - }; - - var drawPie = function drawPie() { - var redrawShape = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - var pieOpacity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : eleOpacity; - - if (r.hasPie(node)) { - r.drawPie(context, node, pieOpacity); // redraw/restore path if steps after pie need it - - if (redrawShape) { - if (!usePaths) { - r.nodeShapes[r.getNodeShape(node)].draw(context, pos.x, pos.y, nodeWidth, nodeHeight); - } - } - } - }; - - var darken = function darken() { - var darkenOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : eleOpacity; - var opacity = (darkness > 0 ? darkness : -darkness) * darkenOpacity; - var c = darkness > 0 ? 0 : 255; - - if (darkness !== 0) { - r.colorFillStyle(context, c, c, c, opacity); - - if (usePaths) { - context.fill(path); - } else { - context.fill(); - } - } - }; - - var drawBorder = function drawBorder() { - if (borderWidth > 0) { - context.lineWidth = borderWidth; - context.lineCap = 'butt'; - - if (context.setLineDash) { - // for very outofdate browsers - switch (borderStyle) { - case 'dotted': - context.setLineDash([1, 1]); - break; - - case 'dashed': - context.setLineDash([4, 2]); - break; - - case 'solid': - case 'double': - context.setLineDash([]); - break; - } - } - - if (usePaths) { - context.stroke(path); - } else { - context.stroke(); - } - - if (borderStyle === 'double') { - context.lineWidth = borderWidth / 3; - var gco = context.globalCompositeOperation; - context.globalCompositeOperation = 'destination-out'; - - if (usePaths) { - context.stroke(path); - } else { - context.stroke(); - } - - context.globalCompositeOperation = gco; - } // reset in case we changed the border style - - - if (context.setLineDash) { - // for very outofdate browsers - context.setLineDash([]); - } - } - }; - - var drawOverlay = function drawOverlay() { - if (shouldDrawOverlay) { - r.drawNodeOverlay(context, node, pos, nodeWidth, nodeHeight); - } - }; - - var drawUnderlay = function drawUnderlay() { - if (shouldDrawOverlay) { - r.drawNodeUnderlay(context, node, pos, nodeWidth, nodeHeight); - } - }; - - var drawText = function drawText() { - r.drawElementText(context, node, null, drawLabel); - }; - - var ghost = node.pstyle('ghost').value === 'yes'; - - if (ghost) { - var gx = node.pstyle('ghost-offset-x').pfValue; - var gy = node.pstyle('ghost-offset-y').pfValue; - var ghostOpacity = node.pstyle('ghost-opacity').value; - var effGhostOpacity = ghostOpacity * eleOpacity; - context.translate(gx, gy); - setupShapeColor(ghostOpacity * bgOpacity); - drawShape(); - drawImages(effGhostOpacity, true); - setupBorderColor(ghostOpacity * borderOpacity); - drawBorder(); - drawPie(darkness !== 0 || borderWidth !== 0); - drawImages(effGhostOpacity, false); - darken(effGhostOpacity); - context.translate(-gx, -gy); - } - - if (usePaths) { - context.translate(-pos.x, -pos.y); - } - - drawUnderlay(); - - if (usePaths) { - context.translate(pos.x, pos.y); - } - - setupShapeColor(); - drawShape(); - drawImages(eleOpacity, true); - setupBorderColor(); - drawBorder(); - drawPie(darkness !== 0 || borderWidth !== 0); - drawImages(eleOpacity, false); - darken(); - - if (usePaths) { - context.translate(-pos.x, -pos.y); - } - - drawText(); - drawOverlay(); // - // clean up shift - - if (shiftToOriginWithBb) { - context.translate(bb.x1, bb.y1); - } -}; - -var drawNodeOverlayUnderlay = function drawNodeOverlayUnderlay(overlayOrUnderlay) { - if (!['overlay', 'underlay'].includes(overlayOrUnderlay)) { - throw new Error('Invalid state'); - } - - return function (context, node, pos, nodeWidth, nodeHeight) { - var r = this; - - if (!node.visible()) { - return; - } - - var padding = node.pstyle("".concat(overlayOrUnderlay, "-padding")).pfValue; - var opacity = node.pstyle("".concat(overlayOrUnderlay, "-opacity")).value; - var color = node.pstyle("".concat(overlayOrUnderlay, "-color")).value; - var shape = node.pstyle("".concat(overlayOrUnderlay, "-shape")).value; - - if (opacity > 0) { - pos = pos || node.position(); - - if (nodeWidth == null || nodeHeight == null) { - var _padding = node.padding(); - - nodeWidth = node.width() + 2 * _padding; - nodeHeight = node.height() + 2 * _padding; - } - - r.colorFillStyle(context, color[0], color[1], color[2], opacity); - r.nodeShapes[shape].draw(context, pos.x, pos.y, nodeWidth + padding * 2, nodeHeight + padding * 2); - context.fill(); - } - }; -}; - -CRp$5.drawNodeOverlay = drawNodeOverlayUnderlay('overlay'); -CRp$5.drawNodeUnderlay = drawNodeOverlayUnderlay('underlay'); // does the node have at least one pie piece? - -CRp$5.hasPie = function (node) { - node = node[0]; // ensure ele ref - - return node._private.hasPie; -}; - -CRp$5.drawPie = function (context, node, nodeOpacity, pos) { - node = node[0]; // ensure ele ref - - pos = pos || node.position(); - var cyStyle = node.cy().style(); - var pieSize = node.pstyle('pie-size'); - var x = pos.x; - var y = pos.y; - var nodeW = node.width(); - var nodeH = node.height(); - var radius = Math.min(nodeW, nodeH) / 2; // must fit in node - - var lastPercent = 0; // what % to continue drawing pie slices from on [0, 1] - - var usePaths = this.usePaths(); - - if (usePaths) { - x = 0; - y = 0; - } - - if (pieSize.units === '%') { - radius = radius * pieSize.pfValue; - } else if (pieSize.pfValue !== undefined) { - radius = pieSize.pfValue / 2; - } - - for (var i = 1; i <= cyStyle.pieBackgroundN; i++) { - // 1..N - var size = node.pstyle('pie-' + i + '-background-size').value; - var color = node.pstyle('pie-' + i + '-background-color').value; - var opacity = node.pstyle('pie-' + i + '-background-opacity').value * nodeOpacity; - var percent = size / 100; // map integer range [0, 100] to [0, 1] - // percent can't push beyond 1 - - if (percent + lastPercent > 1) { - percent = 1 - lastPercent; - } - - var angleStart = 1.5 * Math.PI + 2 * Math.PI * lastPercent; // start at 12 o'clock and go clockwise - - var angleDelta = 2 * Math.PI * percent; - var angleEnd = angleStart + angleDelta; // ignore if - // - zero size - // - we're already beyond the full circle - // - adding the current slice would go beyond the full circle - - if (size === 0 || lastPercent >= 1 || lastPercent + percent > 1) { - continue; - } - - context.beginPath(); - context.moveTo(x, y); - context.arc(x, y, radius, angleStart, angleEnd); - context.closePath(); - this.colorFillStyle(context, color[0], color[1], color[2], opacity); - context.fill(); - lastPercent += percent; - } -}; - -var CRp$4 = {}; -var motionBlurDelay = 100; // var isFirefox = typeof InstallTrigger !== 'undefined'; - -CRp$4.getPixelRatio = function () { - var context = this.data.contexts[0]; - - if (this.forcedPixelRatio != null) { - return this.forcedPixelRatio; - } - - var backingStore = context.backingStorePixelRatio || context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || context.backingStorePixelRatio || 1; - return (window.devicePixelRatio || 1) / backingStore; // eslint-disable-line no-undef -}; - -CRp$4.paintCache = function (context) { - var caches = this.paintCaches = this.paintCaches || []; - var needToCreateCache = true; - var cache; - - for (var i = 0; i < caches.length; i++) { - cache = caches[i]; - - if (cache.context === context) { - needToCreateCache = false; - break; - } - } - - if (needToCreateCache) { - cache = { - context: context - }; - caches.push(cache); - } - - return cache; -}; - -CRp$4.createGradientStyleFor = function (context, shapeStyleName, ele, fill, opacity) { - var gradientStyle; - var usePaths = this.usePaths(); - var colors = ele.pstyle(shapeStyleName + '-gradient-stop-colors').value, - positions = ele.pstyle(shapeStyleName + '-gradient-stop-positions').pfValue; - - if (fill === 'radial-gradient') { - if (ele.isEdge()) { - var start = ele.sourceEndpoint(), - end = ele.targetEndpoint(), - mid = ele.midpoint(); - var d1 = dist(start, mid); - var d2 = dist(end, mid); - gradientStyle = context.createRadialGradient(mid.x, mid.y, 0, mid.x, mid.y, Math.max(d1, d2)); - } else { - var pos = usePaths ? { - x: 0, - y: 0 - } : ele.position(), - width = ele.paddedWidth(), - height = ele.paddedHeight(); - gradientStyle = context.createRadialGradient(pos.x, pos.y, 0, pos.x, pos.y, Math.max(width, height)); - } - } else { - if (ele.isEdge()) { - var _start = ele.sourceEndpoint(), - _end = ele.targetEndpoint(); - - gradientStyle = context.createLinearGradient(_start.x, _start.y, _end.x, _end.y); - } else { - var _pos = usePaths ? { - x: 0, - y: 0 - } : ele.position(), - _width = ele.paddedWidth(), - _height = ele.paddedHeight(), - halfWidth = _width / 2, - halfHeight = _height / 2; - - var direction = ele.pstyle('background-gradient-direction').value; - - switch (direction) { - case 'to-bottom': - gradientStyle = context.createLinearGradient(_pos.x, _pos.y - halfHeight, _pos.x, _pos.y + halfHeight); - break; - - case 'to-top': - gradientStyle = context.createLinearGradient(_pos.x, _pos.y + halfHeight, _pos.x, _pos.y - halfHeight); - break; - - case 'to-left': - gradientStyle = context.createLinearGradient(_pos.x + halfWidth, _pos.y, _pos.x - halfWidth, _pos.y); - break; - - case 'to-right': - gradientStyle = context.createLinearGradient(_pos.x - halfWidth, _pos.y, _pos.x + halfWidth, _pos.y); - break; - - case 'to-bottom-right': - case 'to-right-bottom': - gradientStyle = context.createLinearGradient(_pos.x - halfWidth, _pos.y - halfHeight, _pos.x + halfWidth, _pos.y + halfHeight); - break; - - case 'to-top-right': - case 'to-right-top': - gradientStyle = context.createLinearGradient(_pos.x - halfWidth, _pos.y + halfHeight, _pos.x + halfWidth, _pos.y - halfHeight); - break; - - case 'to-bottom-left': - case 'to-left-bottom': - gradientStyle = context.createLinearGradient(_pos.x + halfWidth, _pos.y - halfHeight, _pos.x - halfWidth, _pos.y + halfHeight); - break; - - case 'to-top-left': - case 'to-left-top': - gradientStyle = context.createLinearGradient(_pos.x + halfWidth, _pos.y + halfHeight, _pos.x - halfWidth, _pos.y - halfHeight); - break; - } - } - } - - if (!gradientStyle) return null; // invalid gradient style - - var hasPositions = positions.length === colors.length; - var length = colors.length; - - for (var i = 0; i < length; i++) { - gradientStyle.addColorStop(hasPositions ? positions[i] : i / (length - 1), 'rgba(' + colors[i][0] + ',' + colors[i][1] + ',' + colors[i][2] + ',' + opacity + ')'); - } - - return gradientStyle; -}; - -CRp$4.gradientFillStyle = function (context, ele, fill, opacity) { - var gradientStyle = this.createGradientStyleFor(context, 'background', ele, fill, opacity); - if (!gradientStyle) return null; // error - - context.fillStyle = gradientStyle; -}; - -CRp$4.colorFillStyle = function (context, r, g, b, a) { - context.fillStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; // turn off for now, seems context does its own caching - // var cache = this.paintCache(context); - // var fillStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; - // if( cache.fillStyle !== fillStyle ){ - // context.fillStyle = cache.fillStyle = fillStyle; - // } -}; - -CRp$4.eleFillStyle = function (context, ele, opacity) { - var backgroundFill = ele.pstyle('background-fill').value; - - if (backgroundFill === 'linear-gradient' || backgroundFill === 'radial-gradient') { - this.gradientFillStyle(context, ele, backgroundFill, opacity); - } else { - var backgroundColor = ele.pstyle('background-color').value; - this.colorFillStyle(context, backgroundColor[0], backgroundColor[1], backgroundColor[2], opacity); - } -}; - -CRp$4.gradientStrokeStyle = function (context, ele, fill, opacity) { - var gradientStyle = this.createGradientStyleFor(context, 'line', ele, fill, opacity); - if (!gradientStyle) return null; // error - - context.strokeStyle = gradientStyle; -}; - -CRp$4.colorStrokeStyle = function (context, r, g, b, a) { - context.strokeStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; // turn off for now, seems context does its own caching - // var cache = this.paintCache(context); - // var strokeStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; - // if( cache.strokeStyle !== strokeStyle ){ - // context.strokeStyle = cache.strokeStyle = strokeStyle; - // } -}; - -CRp$4.eleStrokeStyle = function (context, ele, opacity) { - var lineFill = ele.pstyle('line-fill').value; - - if (lineFill === 'linear-gradient' || lineFill === 'radial-gradient') { - this.gradientStrokeStyle(context, ele, lineFill, opacity); - } else { - var lineColor = ele.pstyle('line-color').value; - this.colorStrokeStyle(context, lineColor[0], lineColor[1], lineColor[2], opacity); - } -}; // Resize canvas - - -CRp$4.matchCanvasSize = function (container) { - var r = this; - var data = r.data; - var bb = r.findContainerClientCoords(); - var width = bb[2]; - var height = bb[3]; - var pixelRatio = r.getPixelRatio(); - var mbPxRatio = r.motionBlurPxRatio; - - if (container === r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_NODE] || container === r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_DRAG]) { - pixelRatio = mbPxRatio; - } - - var canvasWidth = width * pixelRatio; - var canvasHeight = height * pixelRatio; - var canvas; - - if (canvasWidth === r.canvasWidth && canvasHeight === r.canvasHeight) { - return; // save cycles if same - } - - r.fontCaches = null; // resizing resets the style - - var canvasContainer = data.canvasContainer; - canvasContainer.style.width = width + 'px'; - canvasContainer.style.height = height + 'px'; - - for (var i = 0; i < r.CANVAS_LAYERS; i++) { - canvas = data.canvases[i]; - canvas.width = canvasWidth; - canvas.height = canvasHeight; - canvas.style.width = width + 'px'; - canvas.style.height = height + 'px'; - } - - for (var i = 0; i < r.BUFFER_COUNT; i++) { - canvas = data.bufferCanvases[i]; - canvas.width = canvasWidth; - canvas.height = canvasHeight; - canvas.style.width = width + 'px'; - canvas.style.height = height + 'px'; - } - - r.textureMult = 1; - - if (pixelRatio <= 1) { - canvas = data.bufferCanvases[r.TEXTURE_BUFFER]; - r.textureMult = 2; - canvas.width = canvasWidth * r.textureMult; - canvas.height = canvasHeight * r.textureMult; - } - - r.canvasWidth = canvasWidth; - r.canvasHeight = canvasHeight; -}; - -CRp$4.renderTo = function (cxt, zoom, pan, pxRatio) { - this.render({ - forcedContext: cxt, - forcedZoom: zoom, - forcedPan: pan, - drawAllLayers: true, - forcedPxRatio: pxRatio - }); -}; - -CRp$4.render = function (options) { - options = options || staticEmptyObject(); - var forcedContext = options.forcedContext; - var drawAllLayers = options.drawAllLayers; - var drawOnlyNodeLayer = options.drawOnlyNodeLayer; - var forcedZoom = options.forcedZoom; - var forcedPan = options.forcedPan; - var r = this; - var pixelRatio = options.forcedPxRatio === undefined ? this.getPixelRatio() : options.forcedPxRatio; - var cy = r.cy; - var data = r.data; - var needDraw = data.canvasNeedsRedraw; - var textureDraw = r.textureOnViewport && !forcedContext && (r.pinching || r.hoverData.dragging || r.swipePanning || r.data.wheelZooming); - var motionBlur = options.motionBlur !== undefined ? options.motionBlur : r.motionBlur; - var mbPxRatio = r.motionBlurPxRatio; - var hasCompoundNodes = cy.hasCompoundNodes(); - var inNodeDragGesture = r.hoverData.draggingEles; - var inBoxSelection = r.hoverData.selecting || r.touchData.selecting ? true : false; - motionBlur = motionBlur && !forcedContext && r.motionBlurEnabled && !inBoxSelection; - var motionBlurFadeEffect = motionBlur; - - if (!forcedContext) { - if (r.prevPxRatio !== pixelRatio) { - r.invalidateContainerClientCoordsCache(); - r.matchCanvasSize(r.container); - r.redrawHint('eles', true); - r.redrawHint('drag', true); - } - - r.prevPxRatio = pixelRatio; - } - - if (!forcedContext && r.motionBlurTimeout) { - clearTimeout(r.motionBlurTimeout); - } - - if (motionBlur) { - if (r.mbFrames == null) { - r.mbFrames = 0; - } - - r.mbFrames++; - - if (r.mbFrames < 3) { - // need several frames before even high quality motionblur - motionBlurFadeEffect = false; - } // go to lower quality blurry frames when several m/b frames have been rendered (avoids flashing) - - - if (r.mbFrames > r.minMbLowQualFrames) { - //r.fullQualityMb = false; - r.motionBlurPxRatio = r.mbPxRBlurry; - } - } - - if (r.clearingMotionBlur) { - r.motionBlurPxRatio = 1; - } // b/c drawToContext() may be async w.r.t. redraw(), keep track of last texture frame - // because a rogue async texture frame would clear needDraw - - - if (r.textureDrawLastFrame && !textureDraw) { - needDraw[r.NODE] = true; - needDraw[r.SELECT_BOX] = true; - } - - var style = cy.style(); - var zoom = cy.zoom(); - var effectiveZoom = forcedZoom !== undefined ? forcedZoom : zoom; - var pan = cy.pan(); - var effectivePan = { - x: pan.x, - y: pan.y - }; - var vp = { - zoom: zoom, - pan: { - x: pan.x, - y: pan.y - } - }; - var prevVp = r.prevViewport; - var viewportIsDiff = prevVp === undefined || vp.zoom !== prevVp.zoom || vp.pan.x !== prevVp.pan.x || vp.pan.y !== prevVp.pan.y; // we want the low quality motionblur only when the viewport is being manipulated etc (where it's not noticed) - - if (!viewportIsDiff && !(inNodeDragGesture && !hasCompoundNodes)) { - r.motionBlurPxRatio = 1; - } - - if (forcedPan) { - effectivePan = forcedPan; - } // apply pixel ratio - - - effectiveZoom *= pixelRatio; - effectivePan.x *= pixelRatio; - effectivePan.y *= pixelRatio; - var eles = r.getCachedZSortedEles(); - - function mbclear(context, x, y, w, h) { - var gco = context.globalCompositeOperation; - context.globalCompositeOperation = 'destination-out'; - r.colorFillStyle(context, 255, 255, 255, r.motionBlurTransparency); - context.fillRect(x, y, w, h); - context.globalCompositeOperation = gco; - } - - function setContextTransform(context, clear) { - var ePan, eZoom, w, h; - - if (!r.clearingMotionBlur && (context === data.bufferContexts[r.MOTIONBLUR_BUFFER_NODE] || context === data.bufferContexts[r.MOTIONBLUR_BUFFER_DRAG])) { - ePan = { - x: pan.x * mbPxRatio, - y: pan.y * mbPxRatio - }; - eZoom = zoom * mbPxRatio; - w = r.canvasWidth * mbPxRatio; - h = r.canvasHeight * mbPxRatio; - } else { - ePan = effectivePan; - eZoom = effectiveZoom; - w = r.canvasWidth; - h = r.canvasHeight; - } - - context.setTransform(1, 0, 0, 1, 0, 0); - - if (clear === 'motionBlur') { - mbclear(context, 0, 0, w, h); - } else if (!forcedContext && (clear === undefined || clear)) { - context.clearRect(0, 0, w, h); - } - - if (!drawAllLayers) { - context.translate(ePan.x, ePan.y); - context.scale(eZoom, eZoom); - } - - if (forcedPan) { - context.translate(forcedPan.x, forcedPan.y); - } - - if (forcedZoom) { - context.scale(forcedZoom, forcedZoom); - } - } - - if (!textureDraw) { - r.textureDrawLastFrame = false; - } - - if (textureDraw) { - r.textureDrawLastFrame = true; - - if (!r.textureCache) { - r.textureCache = {}; - r.textureCache.bb = cy.mutableElements().boundingBox(); - r.textureCache.texture = r.data.bufferCanvases[r.TEXTURE_BUFFER]; - var cxt = r.data.bufferContexts[r.TEXTURE_BUFFER]; - cxt.setTransform(1, 0, 0, 1, 0, 0); - cxt.clearRect(0, 0, r.canvasWidth * r.textureMult, r.canvasHeight * r.textureMult); - r.render({ - forcedContext: cxt, - drawOnlyNodeLayer: true, - forcedPxRatio: pixelRatio * r.textureMult - }); - var vp = r.textureCache.viewport = { - zoom: cy.zoom(), - pan: cy.pan(), - width: r.canvasWidth, - height: r.canvasHeight - }; - vp.mpan = { - x: (0 - vp.pan.x) / vp.zoom, - y: (0 - vp.pan.y) / vp.zoom - }; - } - - needDraw[r.DRAG] = false; - needDraw[r.NODE] = false; - var context = data.contexts[r.NODE]; - var texture = r.textureCache.texture; - var vp = r.textureCache.viewport; - context.setTransform(1, 0, 0, 1, 0, 0); - - if (motionBlur) { - mbclear(context, 0, 0, vp.width, vp.height); - } else { - context.clearRect(0, 0, vp.width, vp.height); - } - - var outsideBgColor = style.core('outside-texture-bg-color').value; - var outsideBgOpacity = style.core('outside-texture-bg-opacity').value; - r.colorFillStyle(context, outsideBgColor[0], outsideBgColor[1], outsideBgColor[2], outsideBgOpacity); - context.fillRect(0, 0, vp.width, vp.height); - var zoom = cy.zoom(); - setContextTransform(context, false); - context.clearRect(vp.mpan.x, vp.mpan.y, vp.width / vp.zoom / pixelRatio, vp.height / vp.zoom / pixelRatio); - context.drawImage(texture, vp.mpan.x, vp.mpan.y, vp.width / vp.zoom / pixelRatio, vp.height / vp.zoom / pixelRatio); - } else if (r.textureOnViewport && !forcedContext) { - // clear the cache since we don't need it - r.textureCache = null; - } - - var extent = cy.extent(); - var vpManip = r.pinching || r.hoverData.dragging || r.swipePanning || r.data.wheelZooming || r.hoverData.draggingEles || r.cy.animated(); - var hideEdges = r.hideEdgesOnViewport && vpManip; - var needMbClear = []; - needMbClear[r.NODE] = !needDraw[r.NODE] && motionBlur && !r.clearedForMotionBlur[r.NODE] || r.clearingMotionBlur; - - if (needMbClear[r.NODE]) { - r.clearedForMotionBlur[r.NODE] = true; - } - - needMbClear[r.DRAG] = !needDraw[r.DRAG] && motionBlur && !r.clearedForMotionBlur[r.DRAG] || r.clearingMotionBlur; - - if (needMbClear[r.DRAG]) { - r.clearedForMotionBlur[r.DRAG] = true; - } - - if (needDraw[r.NODE] || drawAllLayers || drawOnlyNodeLayer || needMbClear[r.NODE]) { - var useBuffer = motionBlur && !needMbClear[r.NODE] && mbPxRatio !== 1; - var context = forcedContext || (useBuffer ? r.data.bufferContexts[r.MOTIONBLUR_BUFFER_NODE] : data.contexts[r.NODE]); - var clear = motionBlur && !useBuffer ? 'motionBlur' : undefined; - setContextTransform(context, clear); - - if (hideEdges) { - r.drawCachedNodes(context, eles.nondrag, pixelRatio, extent); - } else { - r.drawLayeredElements(context, eles.nondrag, pixelRatio, extent); - } - - if (r.debug) { - r.drawDebugPoints(context, eles.nondrag); - } - - if (!drawAllLayers && !motionBlur) { - needDraw[r.NODE] = false; - } - } - - if (!drawOnlyNodeLayer && (needDraw[r.DRAG] || drawAllLayers || needMbClear[r.DRAG])) { - var useBuffer = motionBlur && !needMbClear[r.DRAG] && mbPxRatio !== 1; - var context = forcedContext || (useBuffer ? r.data.bufferContexts[r.MOTIONBLUR_BUFFER_DRAG] : data.contexts[r.DRAG]); - setContextTransform(context, motionBlur && !useBuffer ? 'motionBlur' : undefined); - - if (hideEdges) { - r.drawCachedNodes(context, eles.drag, pixelRatio, extent); - } else { - r.drawCachedElements(context, eles.drag, pixelRatio, extent); - } - - if (r.debug) { - r.drawDebugPoints(context, eles.drag); - } - - if (!drawAllLayers && !motionBlur) { - needDraw[r.DRAG] = false; - } - } - - if (r.showFps || !drawOnlyNodeLayer && needDraw[r.SELECT_BOX] && !drawAllLayers) { - var context = forcedContext || data.contexts[r.SELECT_BOX]; - setContextTransform(context); - - if (r.selection[4] == 1 && (r.hoverData.selecting || r.touchData.selecting)) { - var zoom = r.cy.zoom(); - var borderWidth = style.core('selection-box-border-width').value / zoom; - context.lineWidth = borderWidth; - context.fillStyle = 'rgba(' + style.core('selection-box-color').value[0] + ',' + style.core('selection-box-color').value[1] + ',' + style.core('selection-box-color').value[2] + ',' + style.core('selection-box-opacity').value + ')'; - context.fillRect(r.selection[0], r.selection[1], r.selection[2] - r.selection[0], r.selection[3] - r.selection[1]); - - if (borderWidth > 0) { - context.strokeStyle = 'rgba(' + style.core('selection-box-border-color').value[0] + ',' + style.core('selection-box-border-color').value[1] + ',' + style.core('selection-box-border-color').value[2] + ',' + style.core('selection-box-opacity').value + ')'; - context.strokeRect(r.selection[0], r.selection[1], r.selection[2] - r.selection[0], r.selection[3] - r.selection[1]); - } - } - - if (data.bgActivePosistion && !r.hoverData.selecting) { - var zoom = r.cy.zoom(); - var pos = data.bgActivePosistion; - context.fillStyle = 'rgba(' + style.core('active-bg-color').value[0] + ',' + style.core('active-bg-color').value[1] + ',' + style.core('active-bg-color').value[2] + ',' + style.core('active-bg-opacity').value + ')'; - context.beginPath(); - context.arc(pos.x, pos.y, style.core('active-bg-size').pfValue / zoom, 0, 2 * Math.PI); - context.fill(); - } - - var timeToRender = r.lastRedrawTime; - - if (r.showFps && timeToRender) { - timeToRender = Math.round(timeToRender); - var fps = Math.round(1000 / timeToRender); - context.setTransform(1, 0, 0, 1, 0, 0); - context.fillStyle = 'rgba(255, 0, 0, 0.75)'; - context.strokeStyle = 'rgba(255, 0, 0, 0.75)'; - context.lineWidth = 1; - context.fillText('1 frame = ' + timeToRender + ' ms = ' + fps + ' fps', 0, 20); - var maxFps = 60; - context.strokeRect(0, 30, 250, 20); - context.fillRect(0, 30, 250 * Math.min(fps / maxFps, 1), 20); - } - - if (!drawAllLayers) { - needDraw[r.SELECT_BOX] = false; - } - } // motionblur: blit rendered blurry frames - - - if (motionBlur && mbPxRatio !== 1) { - var cxtNode = data.contexts[r.NODE]; - var txtNode = r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_NODE]; - var cxtDrag = data.contexts[r.DRAG]; - var txtDrag = r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_DRAG]; - - var drawMotionBlur = function drawMotionBlur(cxt, txt, needClear) { - cxt.setTransform(1, 0, 0, 1, 0, 0); - - if (needClear || !motionBlurFadeEffect) { - cxt.clearRect(0, 0, r.canvasWidth, r.canvasHeight); - } else { - mbclear(cxt, 0, 0, r.canvasWidth, r.canvasHeight); - } - - var pxr = mbPxRatio; - cxt.drawImage(txt, // img - 0, 0, // sx, sy - r.canvasWidth * pxr, r.canvasHeight * pxr, // sw, sh - 0, 0, // x, y - r.canvasWidth, r.canvasHeight // w, h - ); - }; - - if (needDraw[r.NODE] || needMbClear[r.NODE]) { - drawMotionBlur(cxtNode, txtNode, needMbClear[r.NODE]); - needDraw[r.NODE] = false; - } - - if (needDraw[r.DRAG] || needMbClear[r.DRAG]) { - drawMotionBlur(cxtDrag, txtDrag, needMbClear[r.DRAG]); - needDraw[r.DRAG] = false; - } - } - - r.prevViewport = vp; - - if (r.clearingMotionBlur) { - r.clearingMotionBlur = false; - r.motionBlurCleared = true; - r.motionBlur = true; - } - - if (motionBlur) { - r.motionBlurTimeout = setTimeout(function () { - r.motionBlurTimeout = null; - r.clearedForMotionBlur[r.NODE] = false; - r.clearedForMotionBlur[r.DRAG] = false; - r.motionBlur = false; - r.clearingMotionBlur = !textureDraw; - r.mbFrames = 0; - needDraw[r.NODE] = true; - needDraw[r.DRAG] = true; - r.redraw(); - }, motionBlurDelay); - } - - if (!forcedContext) { - cy.emit('render'); - } -}; - -var CRp$3 = {}; // @O Polygon drawing - -CRp$3.drawPolygonPath = function (context, x, y, width, height, points) { - var halfW = width / 2; - var halfH = height / 2; - - if (context.beginPath) { - context.beginPath(); - } - - context.moveTo(x + halfW * points[0], y + halfH * points[1]); - - for (var i = 1; i < points.length / 2; i++) { - context.lineTo(x + halfW * points[i * 2], y + halfH * points[i * 2 + 1]); - } - - context.closePath(); -}; - -CRp$3.drawRoundPolygonPath = function (context, x, y, width, height, points) { - var halfW = width / 2; - var halfH = height / 2; - var cornerRadius = getRoundPolygonRadius(width, height); - - if (context.beginPath) { - context.beginPath(); - } - - for (var _i = 0; _i < points.length / 4; _i++) { - var sourceUv = void 0, - destUv = void 0; - - if (_i === 0) { - sourceUv = points.length - 2; - } else { - sourceUv = _i * 4 - 2; - } - - destUv = _i * 4 + 2; - var px = x + halfW * points[_i * 4]; - var py = y + halfH * points[_i * 4 + 1]; - var cosTheta = -points[sourceUv] * points[destUv] - points[sourceUv + 1] * points[destUv + 1]; - var offset = cornerRadius / Math.tan(Math.acos(cosTheta) / 2); - var cp0x = px - offset * points[sourceUv]; - var cp0y = py - offset * points[sourceUv + 1]; - var cp1x = px + offset * points[destUv]; - var cp1y = py + offset * points[destUv + 1]; - - if (_i === 0) { - context.moveTo(cp0x, cp0y); - } else { - context.lineTo(cp0x, cp0y); - } - - context.arcTo(px, py, cp1x, cp1y, cornerRadius); - } - - context.closePath(); -}; // Round rectangle drawing - - -CRp$3.drawRoundRectanglePath = function (context, x, y, width, height) { - var halfWidth = width / 2; - var halfHeight = height / 2; - var cornerRadius = getRoundRectangleRadius(width, height); - - if (context.beginPath) { - context.beginPath(); - } // Start at top middle - - - context.moveTo(x, y - halfHeight); // Arc from middle top to right side - - context.arcTo(x + halfWidth, y - halfHeight, x + halfWidth, y, cornerRadius); // Arc from right side to bottom - - context.arcTo(x + halfWidth, y + halfHeight, x, y + halfHeight, cornerRadius); // Arc from bottom to left side - - context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius); // Arc from left side to topBorder - - context.arcTo(x - halfWidth, y - halfHeight, x, y - halfHeight, cornerRadius); // Join line - - context.lineTo(x, y - halfHeight); - context.closePath(); -}; - -CRp$3.drawBottomRoundRectanglePath = function (context, x, y, width, height) { - var halfWidth = width / 2; - var halfHeight = height / 2; - var cornerRadius = getRoundRectangleRadius(width, height); - - if (context.beginPath) { - context.beginPath(); - } // Start at top middle - - - context.moveTo(x, y - halfHeight); - context.lineTo(x + halfWidth, y - halfHeight); - context.lineTo(x + halfWidth, y); - context.arcTo(x + halfWidth, y + halfHeight, x, y + halfHeight, cornerRadius); - context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius); - context.lineTo(x - halfWidth, y - halfHeight); - context.lineTo(x, y - halfHeight); - context.closePath(); -}; - -CRp$3.drawCutRectanglePath = function (context, x, y, width, height) { - var halfWidth = width / 2; - var halfHeight = height / 2; - var cornerLength = getCutRectangleCornerLength(); - - if (context.beginPath) { - context.beginPath(); - } - - context.moveTo(x - halfWidth + cornerLength, y - halfHeight); - context.lineTo(x + halfWidth - cornerLength, y - halfHeight); - context.lineTo(x + halfWidth, y - halfHeight + cornerLength); - context.lineTo(x + halfWidth, y + halfHeight - cornerLength); - context.lineTo(x + halfWidth - cornerLength, y + halfHeight); - context.lineTo(x - halfWidth + cornerLength, y + halfHeight); - context.lineTo(x - halfWidth, y + halfHeight - cornerLength); - context.lineTo(x - halfWidth, y - halfHeight + cornerLength); - context.closePath(); -}; - -CRp$3.drawBarrelPath = function (context, x, y, width, height) { - var halfWidth = width / 2; - var halfHeight = height / 2; - var xBegin = x - halfWidth; - var xEnd = x + halfWidth; - var yBegin = y - halfHeight; - var yEnd = y + halfHeight; - var barrelCurveConstants = getBarrelCurveConstants(width, height); - var wOffset = barrelCurveConstants.widthOffset; - var hOffset = barrelCurveConstants.heightOffset; - var ctrlPtXOffset = barrelCurveConstants.ctrlPtOffsetPct * wOffset; - - if (context.beginPath) { - context.beginPath(); - } - - context.moveTo(xBegin, yBegin + hOffset); - context.lineTo(xBegin, yEnd - hOffset); - context.quadraticCurveTo(xBegin + ctrlPtXOffset, yEnd, xBegin + wOffset, yEnd); - context.lineTo(xEnd - wOffset, yEnd); - context.quadraticCurveTo(xEnd - ctrlPtXOffset, yEnd, xEnd, yEnd - hOffset); - context.lineTo(xEnd, yBegin + hOffset); - context.quadraticCurveTo(xEnd - ctrlPtXOffset, yBegin, xEnd - wOffset, yBegin); - context.lineTo(xBegin + wOffset, yBegin); - context.quadraticCurveTo(xBegin + ctrlPtXOffset, yBegin, xBegin, yBegin + hOffset); - context.closePath(); -}; - -var sin0 = Math.sin(0); -var cos0 = Math.cos(0); -var sin = {}; -var cos = {}; -var ellipseStepSize = Math.PI / 40; - -for (var i = 0 * Math.PI; i < 2 * Math.PI; i += ellipseStepSize) { - sin[i] = Math.sin(i); - cos[i] = Math.cos(i); -} - -CRp$3.drawEllipsePath = function (context, centerX, centerY, width, height) { - if (context.beginPath) { - context.beginPath(); - } - - if (context.ellipse) { - context.ellipse(centerX, centerY, width / 2, height / 2, 0, 0, 2 * Math.PI); - } else { - var xPos, yPos; - var rw = width / 2; - var rh = height / 2; - - for (var i = 0 * Math.PI; i < 2 * Math.PI; i += ellipseStepSize) { - xPos = centerX - rw * sin[i] * sin0 + rw * cos[i] * cos0; - yPos = centerY + rh * cos[i] * sin0 + rh * sin[i] * cos0; - - if (i === 0) { - context.moveTo(xPos, yPos); - } else { - context.lineTo(xPos, yPos); - } - } - } - - context.closePath(); -}; - -/* global atob, ArrayBuffer, Uint8Array, Blob */ -var CRp$2 = {}; - -CRp$2.createBuffer = function (w, h) { - var buffer = document.createElement('canvas'); // eslint-disable-line no-undef - - buffer.width = w; - buffer.height = h; - return [buffer, buffer.getContext('2d')]; -}; - -CRp$2.bufferCanvasImage = function (options) { - var cy = this.cy; - var eles = cy.mutableElements(); - var bb = eles.boundingBox(); - var ctrRect = this.findContainerClientCoords(); - var width = options.full ? Math.ceil(bb.w) : ctrRect[2]; - var height = options.full ? Math.ceil(bb.h) : ctrRect[3]; - var specdMaxDims = number$1(options.maxWidth) || number$1(options.maxHeight); - var pxRatio = this.getPixelRatio(); - var scale = 1; - - if (options.scale !== undefined) { - width *= options.scale; - height *= options.scale; - scale = options.scale; - } else if (specdMaxDims) { - var maxScaleW = Infinity; - var maxScaleH = Infinity; - - if (number$1(options.maxWidth)) { - maxScaleW = scale * options.maxWidth / width; - } - - if (number$1(options.maxHeight)) { - maxScaleH = scale * options.maxHeight / height; - } - - scale = Math.min(maxScaleW, maxScaleH); - width *= scale; - height *= scale; - } - - if (!specdMaxDims) { - width *= pxRatio; - height *= pxRatio; - scale *= pxRatio; - } - - var buffCanvas = document.createElement('canvas'); // eslint-disable-line no-undef - - buffCanvas.width = width; - buffCanvas.height = height; - buffCanvas.style.width = width + 'px'; - buffCanvas.style.height = height + 'px'; - var buffCxt = buffCanvas.getContext('2d'); // Rasterize the layers, but only if container has nonzero size - - if (width > 0 && height > 0) { - buffCxt.clearRect(0, 0, width, height); - buffCxt.globalCompositeOperation = 'source-over'; - var zsortedEles = this.getCachedZSortedEles(); - - if (options.full) { - // draw the full bounds of the graph - buffCxt.translate(-bb.x1 * scale, -bb.y1 * scale); - buffCxt.scale(scale, scale); - this.drawElements(buffCxt, zsortedEles); - buffCxt.scale(1 / scale, 1 / scale); - buffCxt.translate(bb.x1 * scale, bb.y1 * scale); - } else { - // draw the current view - var pan = cy.pan(); - var translation = { - x: pan.x * scale, - y: pan.y * scale - }; - scale *= cy.zoom(); - buffCxt.translate(translation.x, translation.y); - buffCxt.scale(scale, scale); - this.drawElements(buffCxt, zsortedEles); - buffCxt.scale(1 / scale, 1 / scale); - buffCxt.translate(-translation.x, -translation.y); - } // need to fill bg at end like this in order to fill cleared transparent pixels in jpgs - - - if (options.bg) { - buffCxt.globalCompositeOperation = 'destination-over'; - buffCxt.fillStyle = options.bg; - buffCxt.rect(0, 0, width, height); - buffCxt.fill(); - } - } - - return buffCanvas; -}; - -function b64ToBlob(b64, mimeType) { - var bytes = atob(b64); - var buff = new ArrayBuffer(bytes.length); - var buffUint8 = new Uint8Array(buff); - - for (var i = 0; i < bytes.length; i++) { - buffUint8[i] = bytes.charCodeAt(i); - } - - return new Blob([buff], { - type: mimeType - }); -} - -function b64UriToB64(b64uri) { - var i = b64uri.indexOf(','); - return b64uri.substr(i + 1); -} - -function output(options, canvas, mimeType) { - var getB64Uri = function getB64Uri() { - return canvas.toDataURL(mimeType, options.quality); - }; - - switch (options.output) { - case 'blob-promise': - return new Promise$1(function (resolve, reject) { - try { - canvas.toBlob(function (blob) { - if (blob != null) { - resolve(blob); - } else { - reject(new Error('`canvas.toBlob()` sent a null value in its callback')); - } - }, mimeType, options.quality); - } catch (err) { - reject(err); - } - }); - - case 'blob': - return b64ToBlob(b64UriToB64(getB64Uri()), mimeType); - - case 'base64': - return b64UriToB64(getB64Uri()); - - case 'base64uri': - default: - return getB64Uri(); - } -} - -CRp$2.png = function (options) { - return output(options, this.bufferCanvasImage(options), 'image/png'); -}; - -CRp$2.jpg = function (options) { - return output(options, this.bufferCanvasImage(options), 'image/jpeg'); -}; - -var CRp$1 = {}; - -CRp$1.nodeShapeImpl = function (name, context, centerX, centerY, width, height, points) { - switch (name) { - case 'ellipse': - return this.drawEllipsePath(context, centerX, centerY, width, height); - - case 'polygon': - return this.drawPolygonPath(context, centerX, centerY, width, height, points); - - case 'round-polygon': - return this.drawRoundPolygonPath(context, centerX, centerY, width, height, points); - - case 'roundrectangle': - case 'round-rectangle': - return this.drawRoundRectanglePath(context, centerX, centerY, width, height); - - case 'cutrectangle': - case 'cut-rectangle': - return this.drawCutRectanglePath(context, centerX, centerY, width, height); - - case 'bottomroundrectangle': - case 'bottom-round-rectangle': - return this.drawBottomRoundRectanglePath(context, centerX, centerY, width, height); - - case 'barrel': - return this.drawBarrelPath(context, centerX, centerY, width, height); - } -}; - -var CR = CanvasRenderer; -var CRp = CanvasRenderer.prototype; -CRp.CANVAS_LAYERS = 3; // - -CRp.SELECT_BOX = 0; -CRp.DRAG = 1; -CRp.NODE = 2; -CRp.BUFFER_COUNT = 3; // - -CRp.TEXTURE_BUFFER = 0; -CRp.MOTIONBLUR_BUFFER_NODE = 1; -CRp.MOTIONBLUR_BUFFER_DRAG = 2; - -function CanvasRenderer(options) { - var r = this; - r.data = { - canvases: new Array(CRp.CANVAS_LAYERS), - contexts: new Array(CRp.CANVAS_LAYERS), - canvasNeedsRedraw: new Array(CRp.CANVAS_LAYERS), - bufferCanvases: new Array(CRp.BUFFER_COUNT), - bufferContexts: new Array(CRp.CANVAS_LAYERS) - }; - var tapHlOffAttr = '-webkit-tap-highlight-color'; - var tapHlOffStyle = 'rgba(0,0,0,0)'; - r.data.canvasContainer = document.createElement('div'); // eslint-disable-line no-undef - - var containerStyle = r.data.canvasContainer.style; - r.data.canvasContainer.style[tapHlOffAttr] = tapHlOffStyle; - containerStyle.position = 'relative'; - containerStyle.zIndex = '0'; - containerStyle.overflow = 'hidden'; - var container = options.cy.container(); - container.appendChild(r.data.canvasContainer); - container.style[tapHlOffAttr] = tapHlOffStyle; - var styleMap = { - '-webkit-user-select': 'none', - '-moz-user-select': '-moz-none', - 'user-select': 'none', - '-webkit-tap-highlight-color': 'rgba(0,0,0,0)', - 'outline-style': 'none' - }; - - if (ms()) { - styleMap['-ms-touch-action'] = 'none'; - styleMap['touch-action'] = 'none'; - } - - for (var i = 0; i < CRp.CANVAS_LAYERS; i++) { - var canvas = r.data.canvases[i] = document.createElement('canvas'); // eslint-disable-line no-undef - - r.data.contexts[i] = canvas.getContext('2d'); - Object.keys(styleMap).forEach(function (k) { - canvas.style[k] = styleMap[k]; - }); - canvas.style.position = 'absolute'; - canvas.setAttribute('data-id', 'layer' + i); - canvas.style.zIndex = String(CRp.CANVAS_LAYERS - i); - r.data.canvasContainer.appendChild(canvas); - r.data.canvasNeedsRedraw[i] = false; - } - - r.data.topCanvas = r.data.canvases[0]; - r.data.canvases[CRp.NODE].setAttribute('data-id', 'layer' + CRp.NODE + '-node'); - r.data.canvases[CRp.SELECT_BOX].setAttribute('data-id', 'layer' + CRp.SELECT_BOX + '-selectbox'); - r.data.canvases[CRp.DRAG].setAttribute('data-id', 'layer' + CRp.DRAG + '-drag'); - - for (var i = 0; i < CRp.BUFFER_COUNT; i++) { - r.data.bufferCanvases[i] = document.createElement('canvas'); // eslint-disable-line no-undef - - r.data.bufferContexts[i] = r.data.bufferCanvases[i].getContext('2d'); - r.data.bufferCanvases[i].style.position = 'absolute'; - r.data.bufferCanvases[i].setAttribute('data-id', 'buffer' + i); - r.data.bufferCanvases[i].style.zIndex = String(-i - 1); - r.data.bufferCanvases[i].style.visibility = 'hidden'; //r.data.canvasContainer.appendChild(r.data.bufferCanvases[i]); - } - - r.pathsEnabled = true; - var emptyBb = makeBoundingBox(); - - var getBoxCenter = function getBoxCenter(bb) { - return { - x: (bb.x1 + bb.x2) / 2, - y: (bb.y1 + bb.y2) / 2 - }; - }; - - var getCenterOffset = function getCenterOffset(bb) { - return { - x: -bb.w / 2, - y: -bb.h / 2 - }; - }; - - var backgroundTimestampHasChanged = function backgroundTimestampHasChanged(ele) { - var _p = ele[0]._private; - var same = _p.oldBackgroundTimestamp === _p.backgroundTimestamp; - return !same; - }; - - var getStyleKey = function getStyleKey(ele) { - return ele[0]._private.nodeKey; - }; - - var getLabelKey = function getLabelKey(ele) { - return ele[0]._private.labelStyleKey; - }; - - var getSourceLabelKey = function getSourceLabelKey(ele) { - return ele[0]._private.sourceLabelStyleKey; - }; - - var getTargetLabelKey = function getTargetLabelKey(ele) { - return ele[0]._private.targetLabelStyleKey; - }; - - var drawElement = function drawElement(context, ele, bb, scaledLabelShown, useEleOpacity) { - return r.drawElement(context, ele, bb, false, false, useEleOpacity); - }; - - var drawLabel = function drawLabel(context, ele, bb, scaledLabelShown, useEleOpacity) { - return r.drawElementText(context, ele, bb, scaledLabelShown, 'main', useEleOpacity); - }; - - var drawSourceLabel = function drawSourceLabel(context, ele, bb, scaledLabelShown, useEleOpacity) { - return r.drawElementText(context, ele, bb, scaledLabelShown, 'source', useEleOpacity); - }; - - var drawTargetLabel = function drawTargetLabel(context, ele, bb, scaledLabelShown, useEleOpacity) { - return r.drawElementText(context, ele, bb, scaledLabelShown, 'target', useEleOpacity); - }; - - var getElementBox = function getElementBox(ele) { - ele.boundingBox(); - return ele[0]._private.bodyBounds; - }; - - var getLabelBox = function getLabelBox(ele) { - ele.boundingBox(); - return ele[0]._private.labelBounds.main || emptyBb; - }; - - var getSourceLabelBox = function getSourceLabelBox(ele) { - ele.boundingBox(); - return ele[0]._private.labelBounds.source || emptyBb; - }; - - var getTargetLabelBox = function getTargetLabelBox(ele) { - ele.boundingBox(); - return ele[0]._private.labelBounds.target || emptyBb; - }; - - var isLabelVisibleAtScale = function isLabelVisibleAtScale(ele, scaledLabelShown) { - return scaledLabelShown; - }; - - var getElementRotationPoint = function getElementRotationPoint(ele) { - return getBoxCenter(getElementBox(ele)); - }; - - var addTextMargin = function addTextMargin(prefix, pt, ele) { - var pre = prefix ? prefix + '-' : ''; - return { - x: pt.x + ele.pstyle(pre + 'text-margin-x').pfValue, - y: pt.y + ele.pstyle(pre + 'text-margin-y').pfValue - }; - }; - - var getRsPt = function getRsPt(ele, x, y) { - var rs = ele[0]._private.rscratch; - return { - x: rs[x], - y: rs[y] - }; - }; - - var getLabelRotationPoint = function getLabelRotationPoint(ele) { - return addTextMargin('', getRsPt(ele, 'labelX', 'labelY'), ele); - }; - - var getSourceLabelRotationPoint = function getSourceLabelRotationPoint(ele) { - return addTextMargin('source', getRsPt(ele, 'sourceLabelX', 'sourceLabelY'), ele); - }; - - var getTargetLabelRotationPoint = function getTargetLabelRotationPoint(ele) { - return addTextMargin('target', getRsPt(ele, 'targetLabelX', 'targetLabelY'), ele); - }; - - var getElementRotationOffset = function getElementRotationOffset(ele) { - return getCenterOffset(getElementBox(ele)); - }; - - var getSourceLabelRotationOffset = function getSourceLabelRotationOffset(ele) { - return getCenterOffset(getSourceLabelBox(ele)); - }; - - var getTargetLabelRotationOffset = function getTargetLabelRotationOffset(ele) { - return getCenterOffset(getTargetLabelBox(ele)); - }; - - var getLabelRotationOffset = function getLabelRotationOffset(ele) { - var bb = getLabelBox(ele); - var p = getCenterOffset(getLabelBox(ele)); - - if (ele.isNode()) { - switch (ele.pstyle('text-halign').value) { - case 'left': - p.x = -bb.w; - break; - - case 'right': - p.x = 0; - break; - } - - switch (ele.pstyle('text-valign').value) { - case 'top': - p.y = -bb.h; - break; - - case 'bottom': - p.y = 0; - break; - } - } - - return p; - }; - - var eleTxrCache = r.data.eleTxrCache = new ElementTextureCache(r, { - getKey: getStyleKey, - doesEleInvalidateKey: backgroundTimestampHasChanged, - drawElement: drawElement, - getBoundingBox: getElementBox, - getRotationPoint: getElementRotationPoint, - getRotationOffset: getElementRotationOffset, - allowEdgeTxrCaching: false, - allowParentTxrCaching: false - }); - var lblTxrCache = r.data.lblTxrCache = new ElementTextureCache(r, { - getKey: getLabelKey, - drawElement: drawLabel, - getBoundingBox: getLabelBox, - getRotationPoint: getLabelRotationPoint, - getRotationOffset: getLabelRotationOffset, - isVisible: isLabelVisibleAtScale - }); - var slbTxrCache = r.data.slbTxrCache = new ElementTextureCache(r, { - getKey: getSourceLabelKey, - drawElement: drawSourceLabel, - getBoundingBox: getSourceLabelBox, - getRotationPoint: getSourceLabelRotationPoint, - getRotationOffset: getSourceLabelRotationOffset, - isVisible: isLabelVisibleAtScale - }); - var tlbTxrCache = r.data.tlbTxrCache = new ElementTextureCache(r, { - getKey: getTargetLabelKey, - drawElement: drawTargetLabel, - getBoundingBox: getTargetLabelBox, - getRotationPoint: getTargetLabelRotationPoint, - getRotationOffset: getTargetLabelRotationOffset, - isVisible: isLabelVisibleAtScale - }); - var lyrTxrCache = r.data.lyrTxrCache = new LayeredTextureCache(r); - r.onUpdateEleCalcs(function invalidateTextureCaches(willDraw, eles) { - // each cache should check for sub-key diff to see that the update affects that cache particularly - eleTxrCache.invalidateElements(eles); - lblTxrCache.invalidateElements(eles); - slbTxrCache.invalidateElements(eles); - tlbTxrCache.invalidateElements(eles); // any change invalidates the layers - - lyrTxrCache.invalidateElements(eles); // update the old bg timestamp so diffs can be done in the ele txr caches - - for (var _i = 0; _i < eles.length; _i++) { - var _p = eles[_i]._private; - _p.oldBackgroundTimestamp = _p.backgroundTimestamp; - } - }); - - var refineInLayers = function refineInLayers(reqs) { - for (var i = 0; i < reqs.length; i++) { - lyrTxrCache.enqueueElementRefinement(reqs[i].ele); - } - }; - - eleTxrCache.onDequeue(refineInLayers); - lblTxrCache.onDequeue(refineInLayers); - slbTxrCache.onDequeue(refineInLayers); - tlbTxrCache.onDequeue(refineInLayers); -} - -CRp.redrawHint = function (group, bool) { - var r = this; - - switch (group) { - case 'eles': - r.data.canvasNeedsRedraw[CRp.NODE] = bool; - break; - - case 'drag': - r.data.canvasNeedsRedraw[CRp.DRAG] = bool; - break; - - case 'select': - r.data.canvasNeedsRedraw[CRp.SELECT_BOX] = bool; - break; - } -}; // whether to use Path2D caching for drawing - - -var pathsImpld = typeof Path2D !== 'undefined'; - -CRp.path2dEnabled = function (on) { - if (on === undefined) { - return this.pathsEnabled; - } - - this.pathsEnabled = on ? true : false; -}; - -CRp.usePaths = function () { - return pathsImpld && this.pathsEnabled; -}; - -CRp.setImgSmoothing = function (context, bool) { - if (context.imageSmoothingEnabled != null) { - context.imageSmoothingEnabled = bool; - } else { - context.webkitImageSmoothingEnabled = bool; - context.mozImageSmoothingEnabled = bool; - context.msImageSmoothingEnabled = bool; - } -}; - -CRp.getImgSmoothing = function (context) { - if (context.imageSmoothingEnabled != null) { - return context.imageSmoothingEnabled; - } else { - return context.webkitImageSmoothingEnabled || context.mozImageSmoothingEnabled || context.msImageSmoothingEnabled; - } -}; - -CRp.makeOffscreenCanvas = function (width, height) { - var canvas; - - if ((typeof OffscreenCanvas === "undefined" ? "undefined" : _typeof(OffscreenCanvas)) !== ("undefined" )) { - canvas = new OffscreenCanvas(width, height); - } else { - canvas = document.createElement('canvas'); // eslint-disable-line no-undef - - canvas.width = width; - canvas.height = height; - } - - return canvas; -}; - -[CRp$a, CRp$9, CRp$8, CRp$7, CRp$6, CRp$5, CRp$4, CRp$3, CRp$2, CRp$1].forEach(function (props) { - extend(CRp, props); -}); - -var renderer = [{ - name: 'null', - impl: NullRenderer -}, { - name: 'base', - impl: BR -}, { - name: 'canvas', - impl: CR -}]; - -var incExts = [{ - type: 'layout', - extensions: layout -}, { - type: 'renderer', - extensions: renderer -}]; - -var extensions = {}; // registered modules for extensions, indexed by name - -var modules = {}; - -function setExtension(type, name, registrant) { - var ext = registrant; - - var overrideErr = function overrideErr(field) { - warn('Can not register `' + name + '` for `' + type + '` since `' + field + '` already exists in the prototype and can not be overridden'); - }; - - if (type === 'core') { - if (Core.prototype[name]) { - return overrideErr(name); - } else { - Core.prototype[name] = registrant; - } - } else if (type === 'collection') { - if (Collection.prototype[name]) { - return overrideErr(name); - } else { - Collection.prototype[name] = registrant; - } - } else if (type === 'layout') { - // fill in missing layout functions in the prototype - var Layout = function Layout(options) { - this.options = options; - registrant.call(this, options); // make sure layout has _private for use w/ std apis like .on() - - if (!plainObject(this._private)) { - this._private = {}; - } - - this._private.cy = options.cy; - this._private.listeners = []; - this.createEmitter(); - }; - - var layoutProto = Layout.prototype = Object.create(registrant.prototype); - var optLayoutFns = []; - - for (var i = 0; i < optLayoutFns.length; i++) { - var fnName = optLayoutFns[i]; - - layoutProto[fnName] = layoutProto[fnName] || function () { - return this; - }; - } // either .start() or .run() is defined, so autogen the other - - - if (layoutProto.start && !layoutProto.run) { - layoutProto.run = function () { - this.start(); - return this; - }; - } else if (!layoutProto.start && layoutProto.run) { - layoutProto.start = function () { - this.run(); - return this; - }; - } - - var regStop = registrant.prototype.stop; - - layoutProto.stop = function () { - var opts = this.options; - - if (opts && opts.animate) { - var anis = this.animations; - - if (anis) { - for (var _i = 0; _i < anis.length; _i++) { - anis[_i].stop(); - } - } - } - - if (regStop) { - regStop.call(this); - } else { - this.emit('layoutstop'); - } - - return this; - }; - - if (!layoutProto.destroy) { - layoutProto.destroy = function () { - return this; - }; - } - - layoutProto.cy = function () { - return this._private.cy; - }; - - var getCy = function getCy(layout) { - return layout._private.cy; - }; - - var emitterOpts = { - addEventFields: function addEventFields(layout, evt) { - evt.layout = layout; - evt.cy = getCy(layout); - evt.target = layout; - }, - bubble: function bubble() { - return true; - }, - parent: function parent(layout) { - return getCy(layout); - } - }; - extend(layoutProto, { - createEmitter: function createEmitter() { - this._private.emitter = new Emitter(emitterOpts, this); - return this; - }, - emitter: function emitter() { - return this._private.emitter; - }, - on: function on(evt, cb) { - this.emitter().on(evt, cb); - return this; - }, - one: function one(evt, cb) { - this.emitter().one(evt, cb); - return this; - }, - once: function once(evt, cb) { - this.emitter().one(evt, cb); - return this; - }, - removeListener: function removeListener(evt, cb) { - this.emitter().removeListener(evt, cb); - return this; - }, - removeAllListeners: function removeAllListeners() { - this.emitter().removeAllListeners(); - return this; - }, - emit: function emit(evt, params) { - this.emitter().emit(evt, params); - return this; - } - }); - define.eventAliasesOn(layoutProto); - ext = Layout; // replace with our wrapped layout - } else if (type === 'renderer' && name !== 'null' && name !== 'base') { - // user registered renderers inherit from base - var BaseRenderer = getExtension('renderer', 'base'); - var bProto = BaseRenderer.prototype; - var RegistrantRenderer = registrant; - var rProto = registrant.prototype; - - var Renderer = function Renderer() { - BaseRenderer.apply(this, arguments); - RegistrantRenderer.apply(this, arguments); - }; - - var proto = Renderer.prototype; - - for (var pName in bProto) { - var pVal = bProto[pName]; - var existsInR = rProto[pName] != null; - - if (existsInR) { - return overrideErr(pName); - } - - proto[pName] = pVal; // take impl from base - } - - for (var _pName in rProto) { - proto[_pName] = rProto[_pName]; // take impl from registrant - } - - bProto.clientFunctions.forEach(function (name) { - proto[name] = proto[name] || function () { - error('Renderer does not implement `renderer.' + name + '()` on its prototype'); - }; - }); - ext = Renderer; - } else if (type === '__proto__' || type === 'constructor' || type === 'prototype') { - // to avoid potential prototype pollution - return error(type + ' is an illegal type to be registered, possibly lead to prototype pollutions'); - } - - return setMap({ - map: extensions, - keys: [type, name], - value: ext - }); -} - -function getExtension(type, name) { - return getMap({ - map: extensions, - keys: [type, name] - }); -} - -function setModule(type, name, moduleType, moduleName, registrant) { - return setMap({ - map: modules, - keys: [type, name, moduleType, moduleName], - value: registrant - }); -} - -function getModule(type, name, moduleType, moduleName) { - return getMap({ - map: modules, - keys: [type, name, moduleType, moduleName] - }); -} - -var extension = function extension() { - // e.g. extension('renderer', 'svg') - if (arguments.length === 2) { - return getExtension.apply(null, arguments); - } // e.g. extension('renderer', 'svg', { ... }) - else if (arguments.length === 3) { - return setExtension.apply(null, arguments); - } // e.g. extension('renderer', 'svg', 'nodeShape', 'ellipse') - else if (arguments.length === 4) { - return getModule.apply(null, arguments); - } // e.g. extension('renderer', 'svg', 'nodeShape', 'ellipse', { ... }) - else if (arguments.length === 5) { - return setModule.apply(null, arguments); - } else { - error('Invalid extension access syntax'); - } -}; // allows a core instance to access extensions internally - - -Core.prototype.extension = extension; // included extensions - -incExts.forEach(function (group) { - group.extensions.forEach(function (ext) { - setExtension(group.type, ext.name, ext.impl); - }); -}); - -// (useful for init) - -var Stylesheet = function Stylesheet() { - if (!(this instanceof Stylesheet)) { - return new Stylesheet(); - } - - this.length = 0; -}; - -var sheetfn = Stylesheet.prototype; - -sheetfn.instanceString = function () { - return 'stylesheet'; -}; // just store the selector to be parsed later - - -sheetfn.selector = function (selector) { - var i = this.length++; - this[i] = { - selector: selector, - properties: [] - }; - return this; // chaining -}; // just store the property to be parsed later - - -sheetfn.css = function (name, value) { - var i = this.length - 1; - - if (string(name)) { - this[i].properties.push({ - name: name, - value: value - }); - } else if (plainObject(name)) { - var map = name; - var propNames = Object.keys(map); - - for (var j = 0; j < propNames.length; j++) { - var key = propNames[j]; - var mapVal = map[key]; - - if (mapVal == null) { - continue; - } - - var prop = Style.properties[key] || Style.properties[dash2camel(key)]; - - if (prop == null) { - continue; - } - - var _name = prop.name; - var _value = mapVal; - this[i].properties.push({ - name: _name, - value: _value - }); - } - } - - return this; // chaining -}; - -sheetfn.style = sheetfn.css; // generate a real style object from the dummy stylesheet - -sheetfn.generateStyle = function (cy) { - var style = new Style(cy); - return this.appendToStyle(style); -}; // append a dummy stylesheet object on a real style object - - -sheetfn.appendToStyle = function (style) { - for (var i = 0; i < this.length; i++) { - var context = this[i]; - var selector = context.selector; - var props = context.properties; - style.selector(selector); // apply selector - - for (var j = 0; j < props.length; j++) { - var prop = props[j]; - style.css(prop.name, prop.value); // apply property - } - } - - return style; -}; - -var version = "3.25.0"; - -var cytoscape = function cytoscape(options) { - // if no options specified, use default - if (options === undefined) { - options = {}; - } // create instance - - - if (plainObject(options)) { - return new Core(options); - } // allow for registration of extensions - else if (string(options)) { - return extension.apply(extension, arguments); - } -}; // e.g. cytoscape.use( require('cytoscape-foo'), bar ) - - -cytoscape.use = function (ext) { - var args = Array.prototype.slice.call(arguments, 1); // args to pass to ext - - args.unshift(cytoscape); // cytoscape is first arg to ext - - ext.apply(null, args); - return this; -}; - -cytoscape.warnings = function (bool) { - return warnings(bool); -}; // replaced by build system - - -cytoscape.version = version; // expose public apis (mostly for extensions) - -cytoscape.stylesheet = cytoscape.Stylesheet = Stylesheet; - -module.exports = cytoscape; - - -/***/ }), - -/***/ "./node_modules/dagre/index.js": -/*!*************************************!*\ - !*** ./node_modules/dagre/index.js ***! - \*************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -/* -Copyright (c) 2012-2014 Chris Pettitt - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -module.exports = { - graphlib: __webpack_require__(/*! ./lib/graphlib */ "./node_modules/dagre/lib/graphlib.js"), - - layout: __webpack_require__(/*! ./lib/layout */ "./node_modules/dagre/lib/layout.js"), - debug: __webpack_require__(/*! ./lib/debug */ "./node_modules/dagre/lib/debug.js"), - util: { - time: (__webpack_require__(/*! ./lib/util */ "./node_modules/dagre/lib/util.js").time), - notime: (__webpack_require__(/*! ./lib/util */ "./node_modules/dagre/lib/util.js").notime) - }, - version: __webpack_require__(/*! ./lib/version */ "./node_modules/dagre/lib/version.js") -}; - - -/***/ }), - -/***/ "./node_modules/dagre/lib/acyclic.js": -/*!*******************************************!*\ - !*** ./node_modules/dagre/lib/acyclic.js ***! - \*******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -"use strict"; - - -var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); -var greedyFAS = __webpack_require__(/*! ./greedy-fas */ "./node_modules/dagre/lib/greedy-fas.js"); - -module.exports = { - run: run, - undo: undo -}; - -function run(g) { - var fas = (g.graph().acyclicer === "greedy" - ? greedyFAS(g, weightFn(g)) - : dfsFAS(g)); - _.forEach(fas, function(e) { - var label = g.edge(e); - g.removeEdge(e); - label.forwardName = e.name; - label.reversed = true; - g.setEdge(e.w, e.v, label, _.uniqueId("rev")); - }); - - function weightFn(g) { - return function(e) { - return g.edge(e).weight; - }; - } -} - -function dfsFAS(g) { - var fas = []; - var stack = {}; - var visited = {}; - - function dfs(v) { - if (_.has(visited, v)) { - return; - } - visited[v] = true; - stack[v] = true; - _.forEach(g.outEdges(v), function(e) { - if (_.has(stack, e.w)) { - fas.push(e); - } else { - dfs(e.w); - } - }); - delete stack[v]; - } - - _.forEach(g.nodes(), dfs); - return fas; -} - -function undo(g) { - _.forEach(g.edges(), function(e) { - var label = g.edge(e); - if (label.reversed) { - g.removeEdge(e); - - var forwardName = label.forwardName; - delete label.reversed; - delete label.forwardName; - g.setEdge(e.w, e.v, label, forwardName); - } - }); -} - - -/***/ }), - -/***/ "./node_modules/dagre/lib/add-border-segments.js": -/*!*******************************************************!*\ - !*** ./node_modules/dagre/lib/add-border-segments.js ***! - \*******************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); -var util = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js"); - -module.exports = addBorderSegments; - -function addBorderSegments(g) { - function dfs(v) { - var children = g.children(v); - var node = g.node(v); - if (children.length) { - _.forEach(children, dfs); - } - - if (_.has(node, "minRank")) { - node.borderLeft = []; - node.borderRight = []; - for (var rank = node.minRank, maxRank = node.maxRank + 1; - rank < maxRank; - ++rank) { - addBorderNode(g, "borderLeft", "_bl", v, node, rank); - addBorderNode(g, "borderRight", "_br", v, node, rank); - } - } - } - - _.forEach(g.children(), dfs); -} - -function addBorderNode(g, prop, prefix, sg, sgNode, rank) { - var label = { width: 0, height: 0, rank: rank, borderType: prop }; - var prev = sgNode[prop][rank - 1]; - var curr = util.addDummyNode(g, "border", label, prefix); - sgNode[prop][rank] = curr; - g.setParent(curr, sg); - if (prev) { - g.setEdge(prev, curr, { weight: 1 }); - } -} - - -/***/ }), - -/***/ "./node_modules/dagre/lib/coordinate-system.js": -/*!*****************************************************!*\ - !*** ./node_modules/dagre/lib/coordinate-system.js ***! - \*****************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -"use strict"; - - -var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); - -module.exports = { - adjust: adjust, - undo: undo -}; - -function adjust(g) { - var rankDir = g.graph().rankdir.toLowerCase(); - if (rankDir === "lr" || rankDir === "rl") { - swapWidthHeight(g); - } -} - -function undo(g) { - var rankDir = g.graph().rankdir.toLowerCase(); - if (rankDir === "bt" || rankDir === "rl") { - reverseY(g); - } - - if (rankDir === "lr" || rankDir === "rl") { - swapXY(g); - swapWidthHeight(g); - } -} - -function swapWidthHeight(g) { - _.forEach(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); }); - _.forEach(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); }); -} - -function swapWidthHeightOne(attrs) { - var w = attrs.width; - attrs.width = attrs.height; - attrs.height = w; -} - -function reverseY(g) { - _.forEach(g.nodes(), function(v) { reverseYOne(g.node(v)); }); - - _.forEach(g.edges(), function(e) { - var edge = g.edge(e); - _.forEach(edge.points, reverseYOne); - if (_.has(edge, "y")) { - reverseYOne(edge); - } - }); -} - -function reverseYOne(attrs) { - attrs.y = -attrs.y; -} - -function swapXY(g) { - _.forEach(g.nodes(), function(v) { swapXYOne(g.node(v)); }); - - _.forEach(g.edges(), function(e) { - var edge = g.edge(e); - _.forEach(edge.points, swapXYOne); - if (_.has(edge, "x")) { - swapXYOne(edge); - } - }); -} - -function swapXYOne(attrs) { - var x = attrs.x; - attrs.x = attrs.y; - attrs.y = x; -} - - -/***/ }), - -/***/ "./node_modules/dagre/lib/data/list.js": -/*!*********************************************!*\ - !*** ./node_modules/dagre/lib/data/list.js ***! - \*********************************************/ -/***/ (function(module) { - -/* - * Simple doubly linked list implementation derived from Cormen, et al., - * "Introduction to Algorithms". - */ - -module.exports = List; - -function List() { - var sentinel = {}; - sentinel._next = sentinel._prev = sentinel; - this._sentinel = sentinel; -} - -List.prototype.dequeue = function() { - var sentinel = this._sentinel; - var entry = sentinel._prev; - if (entry !== sentinel) { - unlink(entry); - return entry; - } -}; - -List.prototype.enqueue = function(entry) { - var sentinel = this._sentinel; - if (entry._prev && entry._next) { - unlink(entry); - } - entry._next = sentinel._next; - sentinel._next._prev = entry; - sentinel._next = entry; - entry._prev = sentinel; -}; - -List.prototype.toString = function() { - var strs = []; - var sentinel = this._sentinel; - var curr = sentinel._prev; - while (curr !== sentinel) { - strs.push(JSON.stringify(curr, filterOutLinks)); - curr = curr._prev; - } - return "[" + strs.join(", ") + "]"; -}; - -function unlink(entry) { - entry._prev._next = entry._next; - entry._next._prev = entry._prev; - delete entry._next; - delete entry._prev; -} - -function filterOutLinks(k, v) { - if (k !== "_next" && k !== "_prev") { - return v; - } -} - - -/***/ }), - -/***/ "./node_modules/dagre/lib/debug.js": -/*!*****************************************!*\ - !*** ./node_modules/dagre/lib/debug.js ***! - \*****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); -var util = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js"); -var Graph = (__webpack_require__(/*! ./graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph); - -module.exports = { - debugOrdering: debugOrdering -}; - -/* istanbul ignore next */ -function debugOrdering(g) { - var layerMatrix = util.buildLayerMatrix(g); - - var h = new Graph({ compound: true, multigraph: true }).setGraph({}); - - _.forEach(g.nodes(), function(v) { - h.setNode(v, { label: v }); - h.setParent(v, "layer" + g.node(v).rank); - }); - - _.forEach(g.edges(), function(e) { - h.setEdge(e.v, e.w, {}, e.name); - }); - - _.forEach(layerMatrix, function(layer, i) { - var layerV = "layer" + i; - h.setNode(layerV, { rank: "same" }); - _.reduce(layer, function(u, v) { - h.setEdge(u, v, { style: "invis" }); - return v; - }); - }); - - return h; -} - - -/***/ }), - -/***/ "./node_modules/dagre/lib/graphlib.js": -/*!********************************************!*\ - !*** ./node_modules/dagre/lib/graphlib.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -/* global window */ - -var graphlib; - -if (true) { - try { - graphlib = __webpack_require__(/*! graphlib */ "./node_modules/graphlib/index.js"); - } catch (e) { - // continue regardless of error - } -} - -if (!graphlib) { - graphlib = window.graphlib; -} - -module.exports = graphlib; - - -/***/ }), - -/***/ "./node_modules/dagre/lib/greedy-fas.js": -/*!**********************************************!*\ - !*** ./node_modules/dagre/lib/greedy-fas.js ***! - \**********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); -var Graph = (__webpack_require__(/*! ./graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph); -var List = __webpack_require__(/*! ./data/list */ "./node_modules/dagre/lib/data/list.js"); - -/* - * A greedy heuristic for finding a feedback arc set for a graph. A feedback - * arc set is a set of edges that can be removed to make a graph acyclic. - * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, "A fast and - * effective heuristic for the feedback arc set problem." This implementation - * adjusts that from the paper to allow for weighted edges. - */ -module.exports = greedyFAS; - -var DEFAULT_WEIGHT_FN = _.constant(1); - -function greedyFAS(g, weightFn) { - if (g.nodeCount() <= 1) { - return []; - } - var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN); - var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx); - - // Expand multi-edges - return _.flatten(_.map(results, function(e) { - return g.outEdges(e.v, e.w); - }), true); -} - -function doGreedyFAS(g, buckets, zeroIdx) { - var results = []; - var sources = buckets[buckets.length - 1]; - var sinks = buckets[0]; - - var entry; - while (g.nodeCount()) { - while ((entry = sinks.dequeue())) { removeNode(g, buckets, zeroIdx, entry); } - while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); } - if (g.nodeCount()) { - for (var i = buckets.length - 2; i > 0; --i) { - entry = buckets[i].dequeue(); - if (entry) { - results = results.concat(removeNode(g, buckets, zeroIdx, entry, true)); - break; - } - } - } - } - - return results; -} - -function removeNode(g, buckets, zeroIdx, entry, collectPredecessors) { - var results = collectPredecessors ? [] : undefined; - - _.forEach(g.inEdges(entry.v), function(edge) { - var weight = g.edge(edge); - var uEntry = g.node(edge.v); - - if (collectPredecessors) { - results.push({ v: edge.v, w: edge.w }); - } - - uEntry.out -= weight; - assignBucket(buckets, zeroIdx, uEntry); - }); - - _.forEach(g.outEdges(entry.v), function(edge) { - var weight = g.edge(edge); - var w = edge.w; - var wEntry = g.node(w); - wEntry["in"] -= weight; - assignBucket(buckets, zeroIdx, wEntry); - }); - - g.removeNode(entry.v); - - return results; -} - -function buildState(g, weightFn) { - var fasGraph = new Graph(); - var maxIn = 0; - var maxOut = 0; - - _.forEach(g.nodes(), function(v) { - fasGraph.setNode(v, { v: v, "in": 0, out: 0 }); - }); - - // Aggregate weights on nodes, but also sum the weights across multi-edges - // into a single edge for the fasGraph. - _.forEach(g.edges(), function(e) { - var prevWeight = fasGraph.edge(e.v, e.w) || 0; - var weight = weightFn(e); - var edgeWeight = prevWeight + weight; - fasGraph.setEdge(e.v, e.w, edgeWeight); - maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight); - maxIn = Math.max(maxIn, fasGraph.node(e.w)["in"] += weight); - }); - - var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); }); - var zeroIdx = maxIn + 1; - - _.forEach(fasGraph.nodes(), function(v) { - assignBucket(buckets, zeroIdx, fasGraph.node(v)); - }); - - return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx }; -} - -function assignBucket(buckets, zeroIdx, entry) { - if (!entry.out) { - buckets[0].enqueue(entry); - } else if (!entry["in"]) { - buckets[buckets.length - 1].enqueue(entry); - } else { - buckets[entry.out - entry["in"] + zeroIdx].enqueue(entry); - } -} - - -/***/ }), - -/***/ "./node_modules/dagre/lib/layout.js": -/*!******************************************!*\ - !*** ./node_modules/dagre/lib/layout.js ***! - \******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -"use strict"; - - -var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); -var acyclic = __webpack_require__(/*! ./acyclic */ "./node_modules/dagre/lib/acyclic.js"); -var normalize = __webpack_require__(/*! ./normalize */ "./node_modules/dagre/lib/normalize.js"); -var rank = __webpack_require__(/*! ./rank */ "./node_modules/dagre/lib/rank/index.js"); -var normalizeRanks = (__webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js").normalizeRanks); -var parentDummyChains = __webpack_require__(/*! ./parent-dummy-chains */ "./node_modules/dagre/lib/parent-dummy-chains.js"); -var removeEmptyRanks = (__webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js").removeEmptyRanks); -var nestingGraph = __webpack_require__(/*! ./nesting-graph */ "./node_modules/dagre/lib/nesting-graph.js"); -var addBorderSegments = __webpack_require__(/*! ./add-border-segments */ "./node_modules/dagre/lib/add-border-segments.js"); -var coordinateSystem = __webpack_require__(/*! ./coordinate-system */ "./node_modules/dagre/lib/coordinate-system.js"); -var order = __webpack_require__(/*! ./order */ "./node_modules/dagre/lib/order/index.js"); -var position = __webpack_require__(/*! ./position */ "./node_modules/dagre/lib/position/index.js"); -var util = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js"); -var Graph = (__webpack_require__(/*! ./graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph); - -module.exports = layout; - -function layout(g, opts) { - var time = opts && opts.debugTiming ? util.time : util.notime; - time("layout", function() { - var layoutGraph = - time(" buildLayoutGraph", function() { return buildLayoutGraph(g); }); - time(" runLayout", function() { runLayout(layoutGraph, time); }); - time(" updateInputGraph", function() { updateInputGraph(g, layoutGraph); }); - }); -} - -function runLayout(g, time) { - time(" makeSpaceForEdgeLabels", function() { makeSpaceForEdgeLabels(g); }); - time(" removeSelfEdges", function() { removeSelfEdges(g); }); - time(" acyclic", function() { acyclic.run(g); }); - time(" nestingGraph.run", function() { nestingGraph.run(g); }); - time(" rank", function() { rank(util.asNonCompoundGraph(g)); }); - time(" injectEdgeLabelProxies", function() { injectEdgeLabelProxies(g); }); - time(" removeEmptyRanks", function() { removeEmptyRanks(g); }); - time(" nestingGraph.cleanup", function() { nestingGraph.cleanup(g); }); - time(" normalizeRanks", function() { normalizeRanks(g); }); - time(" assignRankMinMax", function() { assignRankMinMax(g); }); - time(" removeEdgeLabelProxies", function() { removeEdgeLabelProxies(g); }); - time(" normalize.run", function() { normalize.run(g); }); - time(" parentDummyChains", function() { parentDummyChains(g); }); - time(" addBorderSegments", function() { addBorderSegments(g); }); - time(" order", function() { order(g); }); - time(" insertSelfEdges", function() { insertSelfEdges(g); }); - time(" adjustCoordinateSystem", function() { coordinateSystem.adjust(g); }); - time(" position", function() { position(g); }); - time(" positionSelfEdges", function() { positionSelfEdges(g); }); - time(" removeBorderNodes", function() { removeBorderNodes(g); }); - time(" normalize.undo", function() { normalize.undo(g); }); - time(" fixupEdgeLabelCoords", function() { fixupEdgeLabelCoords(g); }); - time(" undoCoordinateSystem", function() { coordinateSystem.undo(g); }); - time(" translateGraph", function() { translateGraph(g); }); - time(" assignNodeIntersects", function() { assignNodeIntersects(g); }); - time(" reversePoints", function() { reversePointsForReversedEdges(g); }); - time(" acyclic.undo", function() { acyclic.undo(g); }); -} - -/* - * Copies final layout information from the layout graph back to the input - * graph. This process only copies whitelisted attributes from the layout graph - * to the input graph, so it serves as a good place to determine what - * attributes can influence layout. - */ -function updateInputGraph(inputGraph, layoutGraph) { - _.forEach(inputGraph.nodes(), function(v) { - var inputLabel = inputGraph.node(v); - var layoutLabel = layoutGraph.node(v); - - if (inputLabel) { - inputLabel.x = layoutLabel.x; - inputLabel.y = layoutLabel.y; - - if (layoutGraph.children(v).length) { - inputLabel.width = layoutLabel.width; - inputLabel.height = layoutLabel.height; - } - } - }); - - _.forEach(inputGraph.edges(), function(e) { - var inputLabel = inputGraph.edge(e); - var layoutLabel = layoutGraph.edge(e); - - inputLabel.points = layoutLabel.points; - if (_.has(layoutLabel, "x")) { - inputLabel.x = layoutLabel.x; - inputLabel.y = layoutLabel.y; - } - }); - - inputGraph.graph().width = layoutGraph.graph().width; - inputGraph.graph().height = layoutGraph.graph().height; -} - -var graphNumAttrs = ["nodesep", "edgesep", "ranksep", "marginx", "marginy"]; -var graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: "tb" }; -var graphAttrs = ["acyclicer", "ranker", "rankdir", "align"]; -var nodeNumAttrs = ["width", "height"]; -var nodeDefaults = { width: 0, height: 0 }; -var edgeNumAttrs = ["minlen", "weight", "width", "height", "labeloffset"]; -var edgeDefaults = { - minlen: 1, weight: 1, width: 0, height: 0, - labeloffset: 10, labelpos: "r" -}; -var edgeAttrs = ["labelpos"]; - -/* - * Constructs a new graph from the input graph, which can be used for layout. - * This process copies only whitelisted attributes from the input graph to the - * layout graph. Thus this function serves as a good place to determine what - * attributes can influence layout. - */ -function buildLayoutGraph(inputGraph) { - var g = new Graph({ multigraph: true, compound: true }); - var graph = canonicalize(inputGraph.graph()); - - g.setGraph(_.merge({}, - graphDefaults, - selectNumberAttrs(graph, graphNumAttrs), - _.pick(graph, graphAttrs))); - - _.forEach(inputGraph.nodes(), function(v) { - var node = canonicalize(inputGraph.node(v)); - g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults)); - g.setParent(v, inputGraph.parent(v)); - }); - - _.forEach(inputGraph.edges(), function(e) { - var edge = canonicalize(inputGraph.edge(e)); - g.setEdge(e, _.merge({}, - edgeDefaults, - selectNumberAttrs(edge, edgeNumAttrs), - _.pick(edge, edgeAttrs))); - }); - - return g; -} - -/* - * This idea comes from the Gansner paper: to account for edge labels in our - * layout we split each rank in half by doubling minlen and halving ranksep. - * Then we can place labels at these mid-points between nodes. - * - * We also add some minimal padding to the width to push the label for the edge - * away from the edge itself a bit. - */ -function makeSpaceForEdgeLabels(g) { - var graph = g.graph(); - graph.ranksep /= 2; - _.forEach(g.edges(), function(e) { - var edge = g.edge(e); - edge.minlen *= 2; - if (edge.labelpos.toLowerCase() !== "c") { - if (graph.rankdir === "TB" || graph.rankdir === "BT") { - edge.width += edge.labeloffset; - } else { - edge.height += edge.labeloffset; - } - } - }); -} - -/* - * Creates temporary dummy nodes that capture the rank in which each edge's - * label is going to, if it has one of non-zero width and height. We do this - * so that we can safely remove empty ranks while preserving balance for the - * label's position. - */ -function injectEdgeLabelProxies(g) { - _.forEach(g.edges(), function(e) { - var edge = g.edge(e); - if (edge.width && edge.height) { - var v = g.node(e.v); - var w = g.node(e.w); - var label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e }; - util.addDummyNode(g, "edge-proxy", label, "_ep"); - } - }); -} - -function assignRankMinMax(g) { - var maxRank = 0; - _.forEach(g.nodes(), function(v) { - var node = g.node(v); - if (node.borderTop) { - node.minRank = g.node(node.borderTop).rank; - node.maxRank = g.node(node.borderBottom).rank; - maxRank = _.max(maxRank, node.maxRank); - } - }); - g.graph().maxRank = maxRank; -} - -function removeEdgeLabelProxies(g) { - _.forEach(g.nodes(), function(v) { - var node = g.node(v); - if (node.dummy === "edge-proxy") { - g.edge(node.e).labelRank = node.rank; - g.removeNode(v); - } - }); -} - -function translateGraph(g) { - var minX = Number.POSITIVE_INFINITY; - var maxX = 0; - var minY = Number.POSITIVE_INFINITY; - var maxY = 0; - var graphLabel = g.graph(); - var marginX = graphLabel.marginx || 0; - var marginY = graphLabel.marginy || 0; - - function getExtremes(attrs) { - var x = attrs.x; - var y = attrs.y; - var w = attrs.width; - var h = attrs.height; - minX = Math.min(minX, x - w / 2); - maxX = Math.max(maxX, x + w / 2); - minY = Math.min(minY, y - h / 2); - maxY = Math.max(maxY, y + h / 2); - } - - _.forEach(g.nodes(), function(v) { getExtremes(g.node(v)); }); - _.forEach(g.edges(), function(e) { - var edge = g.edge(e); - if (_.has(edge, "x")) { - getExtremes(edge); - } - }); - - minX -= marginX; - minY -= marginY; - - _.forEach(g.nodes(), function(v) { - var node = g.node(v); - node.x -= minX; - node.y -= minY; - }); - - _.forEach(g.edges(), function(e) { - var edge = g.edge(e); - _.forEach(edge.points, function(p) { - p.x -= minX; - p.y -= minY; - }); - if (_.has(edge, "x")) { edge.x -= minX; } - if (_.has(edge, "y")) { edge.y -= minY; } - }); - - graphLabel.width = maxX - minX + marginX; - graphLabel.height = maxY - minY + marginY; -} - -function assignNodeIntersects(g) { - _.forEach(g.edges(), function(e) { - var edge = g.edge(e); - var nodeV = g.node(e.v); - var nodeW = g.node(e.w); - var p1, p2; - if (!edge.points) { - edge.points = []; - p1 = nodeW; - p2 = nodeV; - } else { - p1 = edge.points[0]; - p2 = edge.points[edge.points.length - 1]; - } - edge.points.unshift(util.intersectRect(nodeV, p1)); - edge.points.push(util.intersectRect(nodeW, p2)); - }); -} - -function fixupEdgeLabelCoords(g) { - _.forEach(g.edges(), function(e) { - var edge = g.edge(e); - if (_.has(edge, "x")) { - if (edge.labelpos === "l" || edge.labelpos === "r") { - edge.width -= edge.labeloffset; - } - switch (edge.labelpos) { - case "l": edge.x -= edge.width / 2 + edge.labeloffset; break; - case "r": edge.x += edge.width / 2 + edge.labeloffset; break; - } - } - }); -} - -function reversePointsForReversedEdges(g) { - _.forEach(g.edges(), function(e) { - var edge = g.edge(e); - if (edge.reversed) { - edge.points.reverse(); - } - }); -} - -function removeBorderNodes(g) { - _.forEach(g.nodes(), function(v) { - if (g.children(v).length) { - var node = g.node(v); - var t = g.node(node.borderTop); - var b = g.node(node.borderBottom); - var l = g.node(_.last(node.borderLeft)); - var r = g.node(_.last(node.borderRight)); - - node.width = Math.abs(r.x - l.x); - node.height = Math.abs(b.y - t.y); - node.x = l.x + node.width / 2; - node.y = t.y + node.height / 2; - } - }); - - _.forEach(g.nodes(), function(v) { - if (g.node(v).dummy === "border") { - g.removeNode(v); - } - }); -} - -function removeSelfEdges(g) { - _.forEach(g.edges(), function(e) { - if (e.v === e.w) { - var node = g.node(e.v); - if (!node.selfEdges) { - node.selfEdges = []; - } - node.selfEdges.push({ e: e, label: g.edge(e) }); - g.removeEdge(e); - } - }); -} - -function insertSelfEdges(g) { - var layers = util.buildLayerMatrix(g); - _.forEach(layers, function(layer) { - var orderShift = 0; - _.forEach(layer, function(v, i) { - var node = g.node(v); - node.order = i + orderShift; - _.forEach(node.selfEdges, function(selfEdge) { - util.addDummyNode(g, "selfedge", { - width: selfEdge.label.width, - height: selfEdge.label.height, - rank: node.rank, - order: i + (++orderShift), - e: selfEdge.e, - label: selfEdge.label - }, "_se"); + triggersBounds = prop.triggersBounds; + edgeArrow.push({ + name: name, + type: type, + triggersBounds: triggersBounds }); - delete node.selfEdges; + }); + }, {}); + var props = styfn$2.properties = [].concat(behavior, transition, visibility, overlay, underlay, ghost, commonLabel, labelDimensions, mainLabel, sourceLabel, targetLabel, nodeBody, nodeBorder, backgroundImage, pie, compound, edgeLine, edgeArrow, core); + var propGroups = styfn$2.propertyGroups = { + // common to all eles + behavior: behavior, + transition: transition, + visibility: visibility, + overlay: overlay, + underlay: underlay, + ghost: ghost, + // labels + commonLabel: commonLabel, + labelDimensions: labelDimensions, + mainLabel: mainLabel, + sourceLabel: sourceLabel, + targetLabel: targetLabel, + // node props + nodeBody: nodeBody, + nodeBorder: nodeBorder, + backgroundImage: backgroundImage, + pie: pie, + compound: compound, + // edge props + edgeLine: edgeLine, + edgeArrow: edgeArrow, + core: core + }; + var propGroupNames = styfn$2.propertyGroupNames = {}; + var propGroupKeys = styfn$2.propertyGroupKeys = Object.keys(propGroups); + propGroupKeys.forEach(function (key) { + propGroupNames[key] = propGroups[key].map(function (prop) { + return prop.name; + }); + propGroups[key].forEach(function (prop) { + return prop.groupKey = key; }); }); -} - -function positionSelfEdges(g) { - _.forEach(g.nodes(), function(v) { - var node = g.node(v); - if (node.dummy === "selfedge") { - var selfNode = g.node(node.e.v); - var x = selfNode.x + selfNode.width / 2; - var y = selfNode.y; - var dx = node.x - x; - var dy = selfNode.height / 2; - g.setEdge(node.e, node.label); - g.removeNode(v); - node.label.points = [ - { x: x + 2 * dx / 3, y: y - dy }, - { x: x + 5 * dx / 6, y: y - dy }, - { x: x + dx , y: y }, - { x: x + 5 * dx / 6, y: y + dy }, - { x: x + 2 * dx / 3, y: y + dy } - ]; - node.label.x = node.x; - node.label.y = node.y; - } - }); -} -function selectNumberAttrs(obj, attrs) { - return _.mapValues(_.pick(obj, attrs), Number); -} + // define aliases + var aliases = styfn$2.aliases = [{ + name: 'content', + pointsTo: 'label' + }, { + name: 'control-point-distance', + pointsTo: 'control-point-distances' + }, { + name: 'control-point-weight', + pointsTo: 'control-point-weights' + }, { + name: 'edge-text-rotation', + pointsTo: 'text-rotation' + }, { + name: 'padding-left', + pointsTo: 'padding' + }, { + name: 'padding-right', + pointsTo: 'padding' + }, { + name: 'padding-top', + pointsTo: 'padding' + }, { + name: 'padding-bottom', + pointsTo: 'padding' + }]; -function canonicalize(attrs) { - var newAttrs = {}; - _.forEach(attrs, function(v, k) { - newAttrs[k.toLowerCase()] = v; + // list of property names + styfn$2.propertyNames = props.map(function (p) { + return p.name; }); - return newAttrs; -} - - -/***/ }), - -/***/ "./node_modules/dagre/lib/lodash.js": -/*!******************************************!*\ - !*** ./node_modules/dagre/lib/lodash.js ***! - \******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -/* global window */ - -var lodash; -if (true) { - try { - lodash = { - cloneDeep: __webpack_require__(/*! lodash/cloneDeep */ "./node_modules/lodash/cloneDeep.js"), - constant: __webpack_require__(/*! lodash/constant */ "./node_modules/lodash/constant.js"), - defaults: __webpack_require__(/*! lodash/defaults */ "./node_modules/lodash/defaults.js"), - each: __webpack_require__(/*! lodash/each */ "./node_modules/lodash/each.js"), - filter: __webpack_require__(/*! lodash/filter */ "./node_modules/lodash/filter.js"), - find: __webpack_require__(/*! lodash/find */ "./node_modules/lodash/find.js"), - flatten: __webpack_require__(/*! lodash/flatten */ "./node_modules/lodash/flatten.js"), - forEach: __webpack_require__(/*! lodash/forEach */ "./node_modules/lodash/forEach.js"), - forIn: __webpack_require__(/*! lodash/forIn */ "./node_modules/lodash/forIn.js"), - has: __webpack_require__(/*! lodash/has */ "./node_modules/lodash/has.js"), - isUndefined: __webpack_require__(/*! lodash/isUndefined */ "./node_modules/lodash/isUndefined.js"), - last: __webpack_require__(/*! lodash/last */ "./node_modules/lodash/last.js"), - map: __webpack_require__(/*! lodash/map */ "./node_modules/lodash/map.js"), - mapValues: __webpack_require__(/*! lodash/mapValues */ "./node_modules/lodash/mapValues.js"), - max: __webpack_require__(/*! lodash/max */ "./node_modules/lodash/max.js"), - merge: __webpack_require__(/*! lodash/merge */ "./node_modules/lodash/merge.js"), - min: __webpack_require__(/*! lodash/min */ "./node_modules/lodash/min.js"), - minBy: __webpack_require__(/*! lodash/minBy */ "./node_modules/lodash/minBy.js"), - now: __webpack_require__(/*! lodash/now */ "./node_modules/lodash/now.js"), - pick: __webpack_require__(/*! lodash/pick */ "./node_modules/lodash/pick.js"), - range: __webpack_require__(/*! lodash/range */ "./node_modules/lodash/range.js"), - reduce: __webpack_require__(/*! lodash/reduce */ "./node_modules/lodash/reduce.js"), - sortBy: __webpack_require__(/*! lodash/sortBy */ "./node_modules/lodash/sortBy.js"), - uniqueId: __webpack_require__(/*! lodash/uniqueId */ "./node_modules/lodash/uniqueId.js"), - values: __webpack_require__(/*! lodash/values */ "./node_modules/lodash/values.js"), - zipObject: __webpack_require__(/*! lodash/zipObject */ "./node_modules/lodash/zipObject.js"), - }; - } catch (e) { - // continue regardless of error + // allow access of properties by name ( e.g. style.properties.height ) + for (var _i = 0; _i < props.length; _i++) { + var prop = props[_i]; + props[prop.name] = prop; // allow lookup by name } -} - -if (!lodash) { - lodash = window._; -} - -module.exports = lodash; - - -/***/ }), -/***/ "./node_modules/dagre/lib/nesting-graph.js": -/*!*************************************************!*\ - !*** ./node_modules/dagre/lib/nesting-graph.js ***! - \*************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // map aliases + for (var _i2 = 0; _i2 < aliases.length; _i2++) { + var alias = aliases[_i2]; + var pointsToProp = props[alias.pointsTo]; + var aliasProp = { + name: alias.name, + alias: true, + pointsTo: pointsToProp + }; -var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); -var util = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js"); + // add alias prop for parsing + props.push(aliasProp); + props[alias.name] = aliasProp; // allow lookup by name + } +})(); -module.exports = { - run: run, - cleanup: cleanup +styfn$2.getDefaultProperty = function (name) { + return this.getDefaultProperties()[name]; }; - -/* - * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs, - * adds appropriate edges to ensure that all cluster nodes are placed between - * these boundries, and ensures that the graph is connected. - * - * In addition we ensure, through the use of the minlen property, that nodes - * and subgraph border nodes to not end up on the same rank. - * - * Preconditions: - * - * 1. Input graph is a DAG - * 2. Nodes in the input graph has a minlen attribute - * - * Postconditions: - * - * 1. Input graph is connected. - * 2. Dummy nodes are added for the tops and bottoms of subgraphs. - * 3. The minlen attribute for nodes is adjusted to ensure nodes do not - * get placed on the same rank as subgraph border nodes. - * - * The nesting graph idea comes from Sander, "Layout of Compound Directed - * Graphs." - */ -function run(g) { - var root = util.addDummyNode(g, "root", {}, "_root"); - var depths = treeDepths(g); - var height = _.max(_.values(depths)) - 1; // Note: depths is an Object not an array - var nodeSep = 2 * height + 1; - - g.graph().nestingRoot = root; - - // Multiply minlen by nodeSep to align nodes on non-border ranks. - _.forEach(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; }); - - // Calculate a weight that is sufficient to keep subgraphs vertically compact - var weight = sumWeights(g) + 1; - - // Create border nodes and link them up - _.forEach(g.children(), function(child) { - dfs(g, root, nodeSep, weight, height, depths, child); - }); - - // Save the multiplier for node layers for later removal of empty border - // layers. - g.graph().nodeRankFactor = nodeSep; -} - -function dfs(g, root, nodeSep, weight, height, depths, v) { - var children = g.children(v); - if (!children.length) { - if (v !== root) { - g.setEdge(root, v, { weight: 0, minlen: nodeSep }); +styfn$2.getDefaultProperties = function () { + var _p = this._private; + if (_p.defaultProperties != null) { + return _p.defaultProperties; + } + var rawProps = extend({ + // core props + 'selection-box-color': '#ddd', + 'selection-box-opacity': 0.65, + 'selection-box-border-color': '#aaa', + 'selection-box-border-width': 1, + 'active-bg-color': 'black', + 'active-bg-opacity': 0.15, + 'active-bg-size': 30, + 'outside-texture-bg-color': '#000', + 'outside-texture-bg-opacity': 0.125, + // common node/edge props + 'events': 'yes', + 'text-events': 'no', + 'text-valign': 'top', + 'text-halign': 'center', + 'text-justification': 'auto', + 'line-height': 1, + 'color': '#000', + 'text-outline-color': '#000', + 'text-outline-width': 0, + 'text-outline-opacity': 1, + 'text-opacity': 1, + 'text-decoration': 'none', + 'text-transform': 'none', + 'text-wrap': 'none', + 'text-overflow-wrap': 'whitespace', + 'text-max-width': 9999, + 'text-background-color': '#000', + 'text-background-opacity': 0, + 'text-background-shape': 'rectangle', + 'text-background-padding': 0, + 'text-border-opacity': 0, + 'text-border-width': 0, + 'text-border-style': 'solid', + 'text-border-color': '#000', + 'font-family': 'Helvetica Neue, Helvetica, sans-serif', + 'font-style': 'normal', + 'font-weight': 'normal', + 'font-size': 16, + 'min-zoomed-font-size': 0, + 'text-rotation': 'none', + 'source-text-rotation': 'none', + 'target-text-rotation': 'none', + 'visibility': 'visible', + 'display': 'element', + 'opacity': 1, + 'z-compound-depth': 'auto', + 'z-index-compare': 'auto', + 'z-index': 0, + 'label': '', + 'text-margin-x': 0, + 'text-margin-y': 0, + 'source-label': '', + 'source-text-offset': 0, + 'source-text-margin-x': 0, + 'source-text-margin-y': 0, + 'target-label': '', + 'target-text-offset': 0, + 'target-text-margin-x': 0, + 'target-text-margin-y': 0, + 'overlay-opacity': 0, + 'overlay-color': '#000', + 'overlay-padding': 10, + 'overlay-shape': 'round-rectangle', + 'underlay-opacity': 0, + 'underlay-color': '#000', + 'underlay-padding': 10, + 'underlay-shape': 'round-rectangle', + 'transition-property': 'none', + 'transition-duration': 0, + 'transition-delay': 0, + 'transition-timing-function': 'linear', + // node props + 'background-blacken': 0, + 'background-color': '#999', + 'background-fill': 'solid', + 'background-opacity': 1, + 'background-image': 'none', + 'background-image-crossorigin': 'anonymous', + 'background-image-opacity': 1, + 'background-image-containment': 'inside', + 'background-image-smoothing': 'yes', + 'background-position-x': '50%', + 'background-position-y': '50%', + 'background-offset-x': 0, + 'background-offset-y': 0, + 'background-width-relative-to': 'include-padding', + 'background-height-relative-to': 'include-padding', + 'background-repeat': 'no-repeat', + 'background-fit': 'none', + 'background-clip': 'node', + 'background-width': 'auto', + 'background-height': 'auto', + 'border-color': '#000', + 'border-opacity': 1, + 'border-width': 0, + 'border-style': 'solid', + 'height': 30, + 'width': 30, + 'shape': 'ellipse', + 'shape-polygon-points': '-1, -1, 1, -1, 1, 1, -1, 1', + 'bounds-expansion': 0, + // node gradient + 'background-gradient-direction': 'to-bottom', + 'background-gradient-stop-colors': '#999', + 'background-gradient-stop-positions': '0%', + // ghost props + 'ghost': 'no', + 'ghost-offset-y': 0, + 'ghost-offset-x': 0, + 'ghost-opacity': 0, + // compound props + 'padding': 0, + 'padding-relative-to': 'width', + 'position': 'origin', + 'compound-sizing-wrt-labels': 'include', + 'min-width': 0, + 'min-width-bias-left': 0, + 'min-width-bias-right': 0, + 'min-height': 0, + 'min-height-bias-top': 0, + 'min-height-bias-bottom': 0 + }, { + // node pie bg + 'pie-size': '100%' + }, [{ + name: 'pie-{{i}}-background-color', + value: 'black' + }, { + name: 'pie-{{i}}-background-size', + value: '0%' + }, { + name: 'pie-{{i}}-background-opacity', + value: 1 + }].reduce(function (css, prop) { + for (var i = 1; i <= styfn$2.pieBackgroundN; i++) { + var name = prop.name.replace('{{i}}', i); + var val = prop.value; + css[name] = val; } - return; + return css; + }, {}), { + // edge props + 'line-style': 'solid', + 'line-color': '#999', + 'line-fill': 'solid', + 'line-cap': 'butt', + 'line-opacity': 1, + 'line-gradient-stop-colors': '#999', + 'line-gradient-stop-positions': '0%', + 'control-point-step-size': 40, + 'control-point-weights': 0.5, + 'segment-weights': 0.5, + 'segment-distances': 20, + 'taxi-turn': '50%', + 'taxi-turn-min-distance': 10, + 'taxi-direction': 'auto', + 'edge-distances': 'intersection', + 'curve-style': 'haystack', + 'haystack-radius': 0, + 'arrow-scale': 1, + 'loop-direction': '-45deg', + 'loop-sweep': '-90deg', + 'source-distance-from-node': 0, + 'target-distance-from-node': 0, + 'source-endpoint': 'outside-to-node', + 'target-endpoint': 'outside-to-node', + 'line-dash-pattern': [6, 3], + 'line-dash-offset': 0 + }, [{ + name: 'arrow-shape', + value: 'none' + }, { + name: 'arrow-color', + value: '#999' + }, { + name: 'arrow-fill', + value: 'filled' + }].reduce(function (css, prop) { + styfn$2.arrowPrefixes.forEach(function (prefix) { + var name = prefix + '-' + prop.name; + var val = prop.value; + css[name] = val; + }); + return css; + }, {})); + var parsedProps = {}; + for (var i = 0; i < this.properties.length; i++) { + var prop = this.properties[i]; + if (prop.pointsTo) { + continue; + } + var name = prop.name; + var val = rawProps[name]; + var parsedProp = this.parse(name, val); + parsedProps[name] = parsedProp; } + _p.defaultProperties = parsedProps; + return _p.defaultProperties; +}; +styfn$2.addDefaultStylesheet = function () { + this.selector(':parent').css({ + 'shape': 'rectangle', + 'padding': 10, + 'background-color': '#eee', + 'border-color': '#ccc', + 'border-width': 1 + }).selector('edge').css({ + 'width': 3 + }).selector(':loop').css({ + 'curve-style': 'bezier' + }).selector('edge:compound').css({ + 'curve-style': 'bezier', + 'source-endpoint': 'outside-to-line', + 'target-endpoint': 'outside-to-line' + }).selector(':selected').css({ + 'background-color': '#0169D9', + 'line-color': '#0169D9', + 'source-arrow-color': '#0169D9', + 'target-arrow-color': '#0169D9', + 'mid-source-arrow-color': '#0169D9', + 'mid-target-arrow-color': '#0169D9' + }).selector(':parent:selected').css({ + 'background-color': '#CCE1F9', + 'border-color': '#aec8e5' + }).selector(':active').css({ + 'overlay-color': 'black', + 'overlay-padding': 10, + 'overlay-opacity': 0.25 + }); + this.defaultLength = this.length; +}; - var top = util.addBorderNode(g, "_bt"); - var bottom = util.addBorderNode(g, "_bb"); - var label = g.node(v); - - g.setParent(top, v); - label.borderTop = top; - g.setParent(bottom, v); - label.borderBottom = bottom; - - _.forEach(children, function(child) { - dfs(g, root, nodeSep, weight, height, depths, child); - - var childNode = g.node(child); - var childTop = childNode.borderTop ? childNode.borderTop : child; - var childBottom = childNode.borderBottom ? childNode.borderBottom : child; - var thisWeight = childNode.borderTop ? weight : 2 * weight; - var minlen = childTop !== childBottom ? 1 : height - depths[v] + 1; - - g.setEdge(top, childTop, { - weight: thisWeight, - minlen: minlen, - nestingEdge: true - }); +var styfn$1 = {}; - g.setEdge(childBottom, bottom, { - weight: thisWeight, - minlen: minlen, - nestingEdge: true - }); - }); +// a caching layer for property parsing +styfn$1.parse = function (name, value, propIsBypass, propIsFlat) { + var self = this; - if (!g.parent(v)) { - g.setEdge(root, top, { weight: 0, minlen: height + depths[v] }); + // function values can't be cached in all cases, and there isn't much benefit of caching them anyway + if (fn$6(value)) { + return self.parseImplWarn(name, value, propIsBypass, propIsFlat); + } + var flatKey = propIsFlat === 'mapping' || propIsFlat === true || propIsFlat === false || propIsFlat == null ? 'dontcare' : propIsFlat; + var bypassKey = propIsBypass ? 't' : 'f'; + var valueKey = '' + value; + var argHash = hashStrings(name, valueKey, bypassKey, flatKey); + var propCache = self.propCache = self.propCache || []; + var ret; + if (!(ret = propCache[argHash])) { + ret = propCache[argHash] = self.parseImplWarn(name, value, propIsBypass, propIsFlat); } -} -function treeDepths(g) { - var depths = {}; - function dfs(v, depth) { - var children = g.children(v); - if (children && children.length) { - _.forEach(children, function(child) { - dfs(child, depth + 1); - }); + // - bypasses can't be shared b/c the value can be changed by animations or otherwise overridden + // - mappings can't be shared b/c mappings are per-element + if (propIsBypass || propIsFlat === 'mapping') { + // need a copy since props are mutated later in their lifecycles + ret = copy(ret); + if (ret) { + ret.value = copy(ret.value); // because it could be an array, e.g. colour } - depths[v] = depth; } - _.forEach(g.children(), function(v) { dfs(v, 1); }); - return depths; -} -function sumWeights(g) { - return _.reduce(g.edges(), function(acc, e) { - return acc + g.edge(e).weight; - }, 0); -} + return ret; +}; +styfn$1.parseImplWarn = function (name, value, propIsBypass, propIsFlat) { + var prop = this.parseImpl(name, value, propIsBypass, propIsFlat); + if (!prop && value != null) { + warn("The style property `".concat(name, ": ").concat(value, "` is invalid")); + } + if (prop && (prop.name === 'width' || prop.name === 'height') && value === 'label') { + warn('The style value of `label` is deprecated for `' + prop.name + '`'); + } + return prop; +}; -function cleanup(g) { - var graphLabel = g.graph(); - g.removeNode(graphLabel.nestingRoot); - delete graphLabel.nestingRoot; - _.forEach(g.edges(), function(e) { - var edge = g.edge(e); - if (edge.nestingEdge) { - g.removeEdge(e); - } - }); -} +// parse a property; return null on invalid; return parsed property otherwise +// fields : +// - name : the name of the property +// - value : the parsed, native-typed value of the property +// - strValue : a string value that represents the property value in valid css +// - bypass : true iff the property is a bypass property +styfn$1.parseImpl = function (name, value, propIsBypass, propIsFlat) { + var self = this; + name = camel2dash(name); // make sure the property name is in dash form (e.g. 'property-name' not 'propertyName') + var property = self.properties[name]; + var passedValue = value; + var types = self.types; + if (!property) { + return null; + } // return null on property of unknown name + if (value === undefined) { + return null; + } // can't assign undefined -/***/ }), + // the property may be an alias + if (property.alias) { + property = property.pointsTo; + name = property.name; + } + var valueIsString = string(value); + if (valueIsString) { + // trim the value to make parsing easier + value = value.trim(); + } + var type = property.type; + if (!type) { + return null; + } // no type, no luck -/***/ "./node_modules/dagre/lib/normalize.js": -/*!*********************************************!*\ - !*** ./node_modules/dagre/lib/normalize.js ***! - \*********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // check if bypass is null or empty string (i.e. indication to delete bypass property) + if (propIsBypass && (value === '' || value === null)) { + return { + name: name, + value: value, + bypass: true, + deleteBypass: true + }; + } -"use strict"; + // check if value is a function used as a mapper + if (fn$6(value)) { + return { + name: name, + value: value, + strValue: 'fn', + mapped: types.fn, + bypass: propIsBypass + }; + } + // check if value is mapped + var data, mapData; + if (!valueIsString || propIsFlat || value.length < 7 || value[1] !== 'a') ; else if (value.length >= 7 && value[0] === 'd' && (data = new RegExp(types.data.regex).exec(value))) { + if (propIsBypass) { + return false; + } // mappers not allowed in bypass -var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); -var util = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js"); + var mapped = types.data; + return { + name: name, + value: data, + strValue: '' + value, + mapped: mapped, + field: data[1], + bypass: propIsBypass + }; + } else if (value.length >= 10 && value[0] === 'm' && (mapData = new RegExp(types.mapData.regex).exec(value))) { + if (propIsBypass) { + return false; + } // mappers not allowed in bypass + if (type.multiple) { + return false; + } // impossible to map to num -module.exports = { - run: run, - undo: undo -}; + var _mapped = types.mapData; -/* - * Breaks any long edges in the graph into short segments that span 1 layer - * each. This operation is undoable with the denormalize function. - * - * Pre-conditions: - * - * 1. The input graph is a DAG. - * 2. Each node in the graph has a "rank" property. - * - * Post-condition: - * - * 1. All edges in the graph have a length of 1. - * 2. Dummy nodes are added where edges have been split into segments. - * 3. The graph is augmented with a "dummyChains" attribute which contains - * the first dummy in each chain of dummy nodes produced. - */ -function run(g) { - g.graph().dummyChains = []; - _.forEach(g.edges(), function(edge) { normalizeEdge(g, edge); }); -} + // we can map only if the type is a colour or a number + if (!(type.color || type.number)) { + return false; + } + var valueMin = this.parse(name, mapData[4]); // parse to validate + if (!valueMin || valueMin.mapped) { + return false; + } // can't be invalid or mapped -function normalizeEdge(g, e) { - var v = e.v; - var vRank = g.node(v).rank; - var w = e.w; - var wRank = g.node(w).rank; - var name = e.name; - var edgeLabel = g.edge(e); - var labelRank = edgeLabel.labelRank; + var valueMax = this.parse(name, mapData[5]); // parse to validate + if (!valueMax || valueMax.mapped) { + return false; + } // can't be invalid or mapped - if (wRank === vRank + 1) return; + // check if valueMin and valueMax are the same + if (valueMin.pfValue === valueMax.pfValue || valueMin.strValue === valueMax.strValue) { + warn('`' + name + ': ' + value + '` is not a valid mapper because the output range is zero; converting to `' + name + ': ' + valueMin.strValue + '`'); + return this.parse(name, valueMin.strValue); // can't make much of a mapper without a range + } else if (type.color) { + var c1 = valueMin.value; + var c2 = valueMax.value; + var same = c1[0] === c2[0] // red + && c1[1] === c2[1] // green + && c1[2] === c2[2] // blue + && ( + // optional alpha + c1[3] === c2[3] // same alpha outright + || (c1[3] == null || c1[3] === 1 // full opacity for colour 1? + ) && (c2[3] == null || c2[3] === 1) // full opacity for colour 2? + ); - g.removeEdge(e); + if (same) { + return false; + } // can't make a mapper without a range + } - var dummy, attrs, i; - for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) { - edgeLabel.points = []; - attrs = { - width: 0, height: 0, - edgeLabel: edgeLabel, edgeObj: e, - rank: vRank + return { + name: name, + value: mapData, + strValue: '' + value, + mapped: _mapped, + field: mapData[1], + fieldMin: parseFloat(mapData[2]), + // min & max are numeric + fieldMax: parseFloat(mapData[3]), + valueMin: valueMin.value, + valueMax: valueMax.value, + bypass: propIsBypass }; - dummy = util.addDummyNode(g, "edge", attrs, "_d"); - if (vRank === labelRank) { - attrs.width = edgeLabel.width; - attrs.height = edgeLabel.height; - attrs.dummy = "edge-label"; - attrs.labelpos = edgeLabel.labelpos; + } + if (type.multiple && propIsFlat !== 'multiple') { + var vals; + if (valueIsString) { + vals = value.split(/\s+/); + } else if (array(value)) { + vals = value; + } else { + vals = [value]; } - g.setEdge(v, dummy, { weight: edgeLabel.weight }, name); - if (i === 0) { - g.graph().dummyChains.push(dummy); + if (type.evenMultiple && vals.length % 2 !== 0) { + return null; } - v = dummy; + var valArr = []; + var unitsArr = []; + var pfValArr = []; + var strVal = ''; + var hasEnum = false; + for (var i = 0; i < vals.length; i++) { + var p = self.parse(name, vals[i], propIsBypass, 'multiple'); + hasEnum = hasEnum || string(p.value); + valArr.push(p.value); + pfValArr.push(p.pfValue != null ? p.pfValue : p.value); + unitsArr.push(p.units); + strVal += (i > 0 ? ' ' : '') + p.strValue; + } + if (type.validate && !type.validate(valArr, unitsArr)) { + return null; + } + if (type.singleEnum && hasEnum) { + if (valArr.length === 1 && string(valArr[0])) { + return { + name: name, + value: valArr[0], + strValue: valArr[0], + bypass: propIsBypass + }; + } else { + return null; + } + } + return { + name: name, + value: valArr, + pfValue: pfValArr, + strValue: strVal, + bypass: propIsBypass, + units: unitsArr + }; } - g.setEdge(v, w, { weight: edgeLabel.weight }, name); -} - -function undo(g) { - _.forEach(g.graph().dummyChains, function(v) { - var node = g.node(v); - var origLabel = node.edgeLabel; - var w; - g.setEdge(node.edgeObj, origLabel); - while (node.dummy) { - w = g.successors(v)[0]; - g.removeNode(v); - origLabel.points.push({ x: node.x, y: node.y }); - if (node.dummy === "edge-label") { - origLabel.x = node.x; - origLabel.y = node.y; - origLabel.width = node.width; - origLabel.height = node.height; + // several types also allow enums + var checkEnums = function checkEnums() { + for (var _i = 0; _i < type.enums.length; _i++) { + var en = type.enums[_i]; + if (en === value) { + return { + name: name, + value: value, + strValue: '' + value, + bypass: propIsBypass + }; } - v = w; - node = g.node(v); } - }); -} - - -/***/ }), + return null; + }; -/***/ "./node_modules/dagre/lib/order/add-subgraph-constraints.js": -/*!******************************************************************!*\ - !*** ./node_modules/dagre/lib/order/add-subgraph-constraints.js ***! - \******************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // check the type and return the appropriate object + if (type.number) { + var units; + var implicitUnits = 'px'; // not set => px -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); + if (type.units) { + // use specified units if set + units = type.units; + } + if (type.implicitUnits) { + implicitUnits = type.implicitUnits; + } + if (!type.unitless) { + if (valueIsString) { + var unitsRegex = 'px|em' + (type.allowPercent ? '|\\%' : ''); + if (units) { + unitsRegex = units; + } // only allow explicit units if so set + var match = value.match('^(' + number + ')(' + unitsRegex + ')?' + '$'); + if (match) { + value = match[1]; + units = match[2] || implicitUnits; + } + } else if (!units || type.implicitUnits) { + units = implicitUnits; // implicitly px if unspecified + } + } -module.exports = addSubgraphConstraints; + value = parseFloat(value); -function addSubgraphConstraints(g, cg, vs) { - var prev = {}, - rootPrev; + // if not a number and enums not allowed, then the value is invalid + if (isNaN(value) && type.enums === undefined) { + return null; + } - _.forEach(vs, function(v) { - var child = g.parent(v), - parent, - prevChild; - while (child) { - parent = g.parent(child); - if (parent) { - prevChild = prev[parent]; - prev[parent] = child; - } else { - prevChild = rootPrev; - rootPrev = child; - } - if (prevChild && prevChild !== child) { - cg.setEdge(prevChild, child); - return; - } - child = parent; + // check if this number type also accepts special keywords in place of numbers + // (i.e. `left`, `auto`, etc) + if (isNaN(value) && type.enums !== undefined) { + value = passedValue; + return checkEnums(); } - }); - /* - function dfs(v) { - var children = v ? g.children(v) : g.children(); - if (children.length) { - var min = Number.POSITIVE_INFINITY, - subgraphs = []; - _.each(children, function(child) { - var childMin = dfs(child); - if (g.children(child).length) { - subgraphs.push({ v: child, order: childMin }); - } - min = Math.min(min, childMin); - }); - _.reduce(_.sortBy(subgraphs, "order"), function(prev, curr) { - cg.setEdge(prev.v, curr.v); - return curr; - }); - return min; + // check if value must be an integer + if (type.integer && !integer(value)) { + return null; } - return g.node(v).order; - } - dfs(undefined); - */ -} + // check value is within range + if (type.min !== undefined && (value < type.min || type.strictMin && value === type.min) || type.max !== undefined && (value > type.max || type.strictMax && value === type.max)) { + return null; + } + var ret = { + name: name, + value: value, + strValue: '' + value + (units ? units : ''), + units: units, + bypass: propIsBypass + }; -/***/ }), + // normalise value in pixels + if (type.unitless || units !== 'px' && units !== 'em') { + ret.pfValue = value; + } else { + ret.pfValue = units === 'px' || !units ? value : this.getEmSizeInPixels() * value; + } -/***/ "./node_modules/dagre/lib/order/barycenter.js": -/*!****************************************************!*\ - !*** ./node_modules/dagre/lib/order/barycenter.js ***! - \****************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // normalise value in ms + if (units === 'ms' || units === 's') { + ret.pfValue = units === 'ms' ? value : 1000 * value; + } -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); + // normalise value in rad + if (units === 'deg' || units === 'rad') { + ret.pfValue = units === 'rad' ? value : deg2rad(value); + } -module.exports = barycenter; + // normalize value in % + if (units === '%') { + ret.pfValue = value / 100; + } + return ret; + } else if (type.propList) { + var props = []; + var propsStr = '' + value; + if (propsStr === 'none') ; else { + // go over each prop -function barycenter(g, movable) { - return _.map(movable, function(v) { - var inV = g.inEdges(v); - if (!inV.length) { - return { v: v }; - } else { - var result = _.reduce(inV, function(acc, e) { - var edge = g.edge(e), - nodeU = g.node(e.v); + var propsSplit = propsStr.split(/\s*,\s*|\s+/); + for (var _i2 = 0; _i2 < propsSplit.length; _i2++) { + var propName = propsSplit[_i2].trim(); + if (self.properties[propName]) { + props.push(propName); + } else { + warn('`' + propName + '` is not a valid property name'); + } + } + if (props.length === 0) { + return null; + } + } + return { + name: name, + value: props, + strValue: props.length === 0 ? 'none' : props.join(' '), + bypass: propIsBypass + }; + } else if (type.color) { + var tuple = color2tuple(value); + if (!tuple) { + return null; + } + return { + name: name, + value: tuple, + pfValue: tuple, + strValue: 'rgb(' + tuple[0] + ',' + tuple[1] + ',' + tuple[2] + ')', + // n.b. no spaces b/c of multiple support + bypass: propIsBypass + }; + } else if (type.regex || type.regexes) { + // first check enums + if (type.enums) { + var enumProp = checkEnums(); + if (enumProp) { + return enumProp; + } + } + var regexes = type.regexes ? type.regexes : [type.regex]; + for (var _i3 = 0; _i3 < regexes.length; _i3++) { + var regex = new RegExp(regexes[_i3]); // make a regex from the type string + var m = regex.exec(value); + if (m) { + // regex matches return { - sum: acc.sum + (edge.weight * nodeU.order), - weight: acc.weight + edge.weight + name: name, + value: type.singleRegexMatchValue ? m[1] : m, + strValue: '' + value, + bypass: propIsBypass }; - }, { sum: 0, weight: 0 }); + } + } + return null; // didn't match any + } else if (type.string) { + // just return + return { + name: name, + value: '' + value, + strValue: '' + value, + bypass: propIsBypass + }; + } else if (type.enums) { + // check enums last because it's a combo type in others + return checkEnums(); + } else { + return null; // not a type we can handle + } +}; - return { - v: v, - barycenter: result.sum / result.weight, - weight: result.weight - }; - } - }); -} +var Style = function Style(cy) { + if (!(this instanceof Style)) { + return new Style(cy); + } + if (!core(cy)) { + error('A style must have a core reference'); + return; + } + this._private = { + cy: cy, + coreStyle: {} + }; + this.length = 0; + this.resetToDefault(); +}; +var styfn = Style.prototype; +styfn.instanceString = function () { + return 'style'; +}; +// remove all contexts +styfn.clear = function () { + var _p = this._private; + var cy = _p.cy; + var eles = cy.elements(); + for (var i = 0; i < this.length; i++) { + this[i] = undefined; + } + this.length = 0; + _p.contextStyles = {}; + _p.propDiffs = {}; + this.cleanElements(eles, true); + eles.forEach(function (ele) { + var ele_p = ele[0]._private; + ele_p.styleDirty = true; + ele_p.appliedInitStyle = false; + }); + return this; // chaining +}; +styfn.resetToDefault = function () { + this.clear(); + this.addDefaultStylesheet(); + return this; +}; -/***/ }), +// builds a style object for the 'core' selector +styfn.core = function (propName) { + return this._private.coreStyle[propName] || this.getDefaultProperty(propName); +}; -/***/ "./node_modules/dagre/lib/order/build-layer-graph.js": -/*!***********************************************************!*\ - !*** ./node_modules/dagre/lib/order/build-layer-graph.js ***! - \***********************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +// create a new context from the specified selector string and switch to that context +styfn.selector = function (selectorStr) { + // 'core' is a special case and does not need a selector + var selector = selectorStr === 'core' ? null : new Selector(selectorStr); + var i = this.length++; // new context means new index + this[i] = { + selector: selector, + properties: [], + mappedProperties: [], + index: i + }; + return this; // chaining +}; -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); -var Graph = (__webpack_require__(/*! ../graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph); +// add one or many css rules to the current context +styfn.css = function () { + var self = this; + var args = arguments; + if (args.length === 1) { + var map = args[0]; + for (var i = 0; i < self.properties.length; i++) { + var prop = self.properties[i]; + var mapVal = map[prop.name]; + if (mapVal === undefined) { + mapVal = map[dash2camel(prop.name)]; + } + if (mapVal !== undefined) { + this.cssRule(prop.name, mapVal); + } + } + } else if (args.length === 2) { + this.cssRule(args[0], args[1]); + } -module.exports = buildLayerGraph; + // do nothing if args are invalid -/* - * Constructs a graph that can be used to sort a layer of nodes. The graph will - * contain all base and subgraph nodes from the request layer in their original - * hierarchy and any edges that are incident on these nodes and are of the type - * requested by the "relationship" parameter. - * - * Nodes from the requested rank that do not have parents are assigned a root - * node in the output graph, which is set in the root graph attribute. This - * makes it easy to walk the hierarchy of movable nodes during ordering. - * - * Pre-conditions: - * - * 1. Input graph is a DAG - * 2. Base nodes in the input graph have a rank attribute - * 3. Subgraph nodes in the input graph has minRank and maxRank attributes - * 4. Edges have an assigned weight - * - * Post-conditions: - * - * 1. Output graph has all nodes in the movable rank with preserved - * hierarchy. - * 2. Root nodes in the movable layer are made children of the node - * indicated by the root attribute of the graph. - * 3. Non-movable nodes incident on movable nodes, selected by the - * relationship parameter, are included in the graph (without hierarchy). - * 4. Edges incident on movable nodes, selected by the relationship - * parameter, are added to the output graph. - * 5. The weights for copied edges are aggregated as need, since the output - * graph is not a multi-graph. - */ -function buildLayerGraph(g, rank, relationship) { - var root = createRootNode(g), - result = new Graph({ compound: true }).setGraph({ root: root }) - .setDefaultNodeLabel(function(v) { return g.node(v); }); + return this; // chaining +}; - _.forEach(g.nodes(), function(v) { - var node = g.node(v), - parent = g.parent(v); +styfn.style = styfn.css; - if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) { - result.setNode(v); - result.setParent(v, parent || root); +// add a single css rule to the current context +styfn.cssRule = function (name, value) { + // name-value pair + var property = this.parse(name, value); - // This assumes we have only short edges! - _.forEach(g[relationship](v), function(e) { - var u = e.v === v ? e.w : e.v, - edge = result.edge(u, v), - weight = !_.isUndefined(edge) ? edge.weight : 0; - result.setEdge(u, v, { weight: g.edge(e).weight + weight }); - }); + // add property to current context if valid + if (property) { + var i = this.length - 1; + this[i].properties.push(property); + this[i].properties[property.name] = property; // allow access by name as well - if (_.has(node, "minRank")) { - result.setNode(v, { - borderLeft: node.borderLeft[rank], - borderRight: node.borderRight[rank] - }); - } + if (property.name.match(/pie-(\d+)-background-size/) && property.value) { + this._private.hasPie = true; + } + if (property.mapped) { + this[i].mappedProperties.push(property); } - }); - - return result; -} - -function createRootNode(g) { - var v; - while (g.hasNode((v = _.uniqueId("_root")))); - return v; -} + // add to core style if necessary + var currentSelectorIsCore = !this[i].selector; + if (currentSelectorIsCore) { + this._private.coreStyle[property.name] = property; + } + } + return this; // chaining +}; -/***/ }), +styfn.append = function (style) { + if (stylesheet(style)) { + style.appendToStyle(this); + } else if (array(style)) { + this.appendFromJson(style); + } else if (string(style)) { + this.appendFromString(style); + } // you probably wouldn't want to append a Style, since you'd duplicate the default parts -/***/ "./node_modules/dagre/lib/order/cross-count.js": -/*!*****************************************************!*\ - !*** ./node_modules/dagre/lib/order/cross-count.js ***! - \*****************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + return this; +}; -"use strict"; +// static function +Style.fromJson = function (cy, json) { + var style = new Style(cy); + style.fromJson(json); + return style; +}; +Style.fromString = function (cy, string) { + return new Style(cy).fromString(string); +}; +[styfn$8, styfn$7, styfn$6, styfn$5, styfn$4, styfn$3, styfn$2, styfn$1].forEach(function (props) { + extend(styfn, props); +}); +Style.types = styfn.types; +Style.properties = styfn.properties; +Style.propertyGroups = styfn.propertyGroups; +Style.propertyGroupNames = styfn.propertyGroupNames; +Style.propertyGroupKeys = styfn.propertyGroupKeys; +var corefn$2 = { + style: function style(newStyle) { + if (newStyle) { + var s = this.setStyle(newStyle); + s.update(); + } + return this._private.style; + }, + setStyle: function setStyle(style) { + var _p = this._private; + if (stylesheet(style)) { + _p.style = style.generateStyle(this); + } else if (array(style)) { + _p.style = Style.fromJson(this, style); + } else if (string(style)) { + _p.style = Style.fromString(this, style); + } else { + _p.style = Style(this); + } + return _p.style; + }, + // e.g. cy.data() changed => recalc ele mappers + updateStyle: function updateStyle() { + this.mutableElements().updateStyle(); // just send to all eles + } +}; -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); +var defaultSelectionType = 'single'; +var corefn$1 = { + autolock: function autolock(bool) { + if (bool !== undefined) { + this._private.autolock = bool ? true : false; + } else { + return this._private.autolock; + } + return this; // chaining + }, -module.exports = crossCount; + autoungrabify: function autoungrabify(bool) { + if (bool !== undefined) { + this._private.autoungrabify = bool ? true : false; + } else { + return this._private.autoungrabify; + } + return this; // chaining + }, -/* - * A function that takes a layering (an array of layers, each with an array of - * ordererd nodes) and a graph and returns a weighted crossing count. - * - * Pre-conditions: - * - * 1. Input graph must be simple (not a multigraph), directed, and include - * only simple edges. - * 2. Edges in the input graph must have assigned weights. - * - * Post-conditions: - * - * 1. The graph and layering matrix are left unchanged. - * - * This algorithm is derived from Barth, et al., "Bilayer Cross Counting." - */ -function crossCount(g, layering) { - var cc = 0; - for (var i = 1; i < layering.length; ++i) { - cc += twoLayerCrossCount(g, layering[i-1], layering[i]); - } - return cc; -} + autounselectify: function autounselectify(bool) { + if (bool !== undefined) { + this._private.autounselectify = bool ? true : false; + } else { + return this._private.autounselectify; + } + return this; // chaining + }, -function twoLayerCrossCount(g, northLayer, southLayer) { - // Sort all of the edges between the north and south layers by their position - // in the north layer and then the south. Map these edges to the position of - // their head in the south layer. - var southPos = _.zipObject(southLayer, - _.map(southLayer, function (v, i) { return i; })); - var southEntries = _.flatten(_.map(northLayer, function(v) { - return _.sortBy(_.map(g.outEdges(v), function(e) { - return { pos: southPos[e.w], weight: g.edge(e).weight }; - }), "pos"); - }), true); + selectionType: function selectionType(selType) { + var _p = this._private; + if (_p.selectionType == null) { + _p.selectionType = defaultSelectionType; + } + if (selType !== undefined) { + if (selType === 'additive' || selType === 'single') { + _p.selectionType = selType; + } + } else { + return _p.selectionType; + } + return this; + }, + panningEnabled: function panningEnabled(bool) { + if (bool !== undefined) { + this._private.panningEnabled = bool ? true : false; + } else { + return this._private.panningEnabled; + } + return this; // chaining + }, - // Build the accumulator tree - var firstIndex = 1; - while (firstIndex < southLayer.length) firstIndex <<= 1; - var treeSize = 2 * firstIndex - 1; - firstIndex -= 1; - var tree = _.map(new Array(treeSize), function() { return 0; }); + userPanningEnabled: function userPanningEnabled(bool) { + if (bool !== undefined) { + this._private.userPanningEnabled = bool ? true : false; + } else { + return this._private.userPanningEnabled; + } + return this; // chaining + }, - // Calculate the weighted crossings - var cc = 0; - _.forEach(southEntries.forEach(function(entry) { - var index = entry.pos + firstIndex; - tree[index] += entry.weight; - var weightSum = 0; - while (index > 0) { - if (index % 2) { - weightSum += tree[index + 1]; - } - index = (index - 1) >> 1; - tree[index] += entry.weight; + zoomingEnabled: function zoomingEnabled(bool) { + if (bool !== undefined) { + this._private.zoomingEnabled = bool ? true : false; + } else { + return this._private.zoomingEnabled; } - cc += entry.weight * weightSum; - })); + return this; // chaining + }, - return cc; -} + userZoomingEnabled: function userZoomingEnabled(bool) { + if (bool !== undefined) { + this._private.userZoomingEnabled = bool ? true : false; + } else { + return this._private.userZoomingEnabled; + } + return this; // chaining + }, + boxSelectionEnabled: function boxSelectionEnabled(bool) { + if (bool !== undefined) { + this._private.boxSelectionEnabled = bool ? true : false; + } else { + return this._private.boxSelectionEnabled; + } + return this; // chaining + }, -/***/ }), + pan: function pan() { + var args = arguments; + var pan = this._private.pan; + var dim, val, dims, x, y; + switch (args.length) { + case 0: + // .pan() + return pan; + case 1: + if (string(args[0])) { + // .pan('x') + dim = args[0]; + return pan[dim]; + } else if (plainObject(args[0])) { + // .pan({ x: 0, y: 100 }) + if (!this._private.panningEnabled) { + return this; + } + dims = args[0]; + x = dims.x; + y = dims.y; + if (number$1(x)) { + pan.x = x; + } + if (number$1(y)) { + pan.y = y; + } + this.emit('pan viewport'); + } + break; + case 2: + // .pan('x', 100) + if (!this._private.panningEnabled) { + return this; + } + dim = args[0]; + val = args[1]; + if ((dim === 'x' || dim === 'y') && number$1(val)) { + pan[dim] = val; + } + this.emit('pan viewport'); + break; + // invalid + } -/***/ "./node_modules/dagre/lib/order/index.js": -/*!***********************************************!*\ - !*** ./node_modules/dagre/lib/order/index.js ***! - \***********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + this.notify('viewport'); + return this; // chaining + }, -"use strict"; + panBy: function panBy(arg0, arg1) { + var args = arguments; + var pan = this._private.pan; + var dim, val, dims, x, y; + if (!this._private.panningEnabled) { + return this; + } + switch (args.length) { + case 1: + if (plainObject(arg0)) { + // .panBy({ x: 0, y: 100 }) + dims = args[0]; + x = dims.x; + y = dims.y; + if (number$1(x)) { + pan.x += x; + } + if (number$1(y)) { + pan.y += y; + } + this.emit('pan viewport'); + } + break; + case 2: + // .panBy('x', 100) + dim = arg0; + val = arg1; + if ((dim === 'x' || dim === 'y') && number$1(val)) { + pan[dim] += val; + } + this.emit('pan viewport'); + break; + // invalid + } + this.notify('viewport'); + return this; // chaining + }, -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); -var initOrder = __webpack_require__(/*! ./init-order */ "./node_modules/dagre/lib/order/init-order.js"); -var crossCount = __webpack_require__(/*! ./cross-count */ "./node_modules/dagre/lib/order/cross-count.js"); -var sortSubgraph = __webpack_require__(/*! ./sort-subgraph */ "./node_modules/dagre/lib/order/sort-subgraph.js"); -var buildLayerGraph = __webpack_require__(/*! ./build-layer-graph */ "./node_modules/dagre/lib/order/build-layer-graph.js"); -var addSubgraphConstraints = __webpack_require__(/*! ./add-subgraph-constraints */ "./node_modules/dagre/lib/order/add-subgraph-constraints.js"); -var Graph = (__webpack_require__(/*! ../graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph); -var util = __webpack_require__(/*! ../util */ "./node_modules/dagre/lib/util.js"); + fit: function fit(elements, padding) { + var viewportState = this.getFitViewport(elements, padding); + if (viewportState) { + var _p = this._private; + _p.zoom = viewportState.zoom; + _p.pan = viewportState.pan; + this.emit('pan zoom viewport'); + this.notify('viewport'); + } + return this; // chaining + }, -module.exports = order; + getFitViewport: function getFitViewport(elements, padding) { + if (number$1(elements) && padding === undefined) { + // elements is optional + padding = elements; + elements = undefined; + } + if (!this._private.panningEnabled || !this._private.zoomingEnabled) { + return; + } + var bb; + if (string(elements)) { + var sel = elements; + elements = this.$(sel); + } else if (boundingBox(elements)) { + // assume bb + var bbe = elements; + bb = { + x1: bbe.x1, + y1: bbe.y1, + x2: bbe.x2, + y2: bbe.y2 + }; + bb.w = bb.x2 - bb.x1; + bb.h = bb.y2 - bb.y1; + } else if (!elementOrCollection(elements)) { + elements = this.mutableElements(); + } + if (elementOrCollection(elements) && elements.empty()) { + return; + } // can't fit to nothing -/* - * Applies heuristics to minimize edge crossings in the graph and sets the best - * order solution as an order attribute on each node. - * - * Pre-conditions: - * - * 1. Graph must be DAG - * 2. Graph nodes must be objects with a "rank" attribute - * 3. Graph edges must have the "weight" attribute - * - * Post-conditions: - * - * 1. Graph nodes will have an "order" attribute based on the results of the - * algorithm. - */ -function order(g) { - var maxRank = util.maxRank(g), - downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), "inEdges"), - upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), "outEdges"); + bb = bb || elements.boundingBox(); + var w = this.width(); + var h = this.height(); + var zoom; + padding = number$1(padding) ? padding : 0; + if (!isNaN(w) && !isNaN(h) && w > 0 && h > 0 && !isNaN(bb.w) && !isNaN(bb.h) && bb.w > 0 && bb.h > 0) { + zoom = Math.min((w - 2 * padding) / bb.w, (h - 2 * padding) / bb.h); - var layering = initOrder(g); - assignOrder(g, layering); + // crop zoom + zoom = zoom > this._private.maxZoom ? this._private.maxZoom : zoom; + zoom = zoom < this._private.minZoom ? this._private.minZoom : zoom; + var pan = { + // now pan to middle + x: (w - zoom * (bb.x1 + bb.x2)) / 2, + y: (h - zoom * (bb.y1 + bb.y2)) / 2 + }; + return { + zoom: zoom, + pan: pan + }; + } + return; + }, + zoomRange: function zoomRange(min, max) { + var _p = this._private; + if (max == null) { + var opts = min; + min = opts.min; + max = opts.max; + } + if (number$1(min) && number$1(max) && min <= max) { + _p.minZoom = min; + _p.maxZoom = max; + } else if (number$1(min) && max === undefined && min <= _p.maxZoom) { + _p.minZoom = min; + } else if (number$1(max) && min === undefined && max >= _p.minZoom) { + _p.maxZoom = max; + } + return this; + }, + minZoom: function minZoom(zoom) { + if (zoom === undefined) { + return this._private.minZoom; + } else { + return this.zoomRange({ + min: zoom + }); + } + }, + maxZoom: function maxZoom(zoom) { + if (zoom === undefined) { + return this._private.maxZoom; + } else { + return this.zoomRange({ + max: zoom + }); + } + }, + getZoomedViewport: function getZoomedViewport(params) { + var _p = this._private; + var currentPan = _p.pan; + var currentZoom = _p.zoom; + var pos; // in rendered px + var zoom; + var bail = false; + if (!_p.zoomingEnabled) { + // zooming disabled + bail = true; + } + if (number$1(params)) { + // then set the zoom + zoom = params; + } else if (plainObject(params)) { + // then zoom about a point + zoom = params.level; + if (params.position != null) { + pos = modelToRenderedPosition(params.position, currentZoom, currentPan); + } else if (params.renderedPosition != null) { + pos = params.renderedPosition; + } + if (pos != null && !_p.panningEnabled) { + // panning disabled + bail = true; + } + } - var bestCC = Number.POSITIVE_INFINITY, - best; + // crop zoom + zoom = zoom > _p.maxZoom ? _p.maxZoom : zoom; + zoom = zoom < _p.minZoom ? _p.minZoom : zoom; - for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) { - sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2); + // can't zoom with invalid params + if (bail || !number$1(zoom) || zoom === currentZoom || pos != null && (!number$1(pos.x) || !number$1(pos.y))) { + return null; + } + if (pos != null) { + // set zoom about position + var pan1 = currentPan; + var zoom1 = currentZoom; + var zoom2 = zoom; + var pan2 = { + x: -zoom2 / zoom1 * (pos.x - pan1.x) + pos.x, + y: -zoom2 / zoom1 * (pos.y - pan1.y) + pos.y + }; + return { + zoomed: true, + panned: true, + zoom: zoom2, + pan: pan2 + }; + } else { + // just set the zoom + return { + zoomed: true, + panned: false, + zoom: zoom, + pan: currentPan + }; + } + }, + zoom: function zoom(params) { + if (params === undefined) { + // get + return this._private.zoom; + } else { + // set + var vp = this.getZoomedViewport(params); + var _p = this._private; + if (vp == null || !vp.zoomed) { + return this; + } + _p.zoom = vp.zoom; + if (vp.panned) { + _p.pan.x = vp.pan.x; + _p.pan.y = vp.pan.y; + } + this.emit('zoom' + (vp.panned ? ' pan' : '') + ' viewport'); + this.notify('viewport'); + return this; // chaining + } + }, - layering = util.buildLayerMatrix(g); - var cc = crossCount(g, layering); - if (cc < bestCC) { - lastBest = 0; - best = _.cloneDeep(layering); - bestCC = cc; + viewport: function viewport(opts) { + var _p = this._private; + var zoomDefd = true; + var panDefd = true; + var events = []; // to trigger + var zoomFailed = false; + var panFailed = false; + if (!opts) { + return this; } - } + if (!number$1(opts.zoom)) { + zoomDefd = false; + } + if (!plainObject(opts.pan)) { + panDefd = false; + } + if (!zoomDefd && !panDefd) { + return this; + } + if (zoomDefd) { + var z = opts.zoom; + if (z < _p.minZoom || z > _p.maxZoom || !_p.zoomingEnabled) { + zoomFailed = true; + } else { + _p.zoom = z; + events.push('zoom'); + } + } + if (panDefd && (!zoomFailed || !opts.cancelOnFailedZoom) && _p.panningEnabled) { + var p = opts.pan; + if (number$1(p.x)) { + _p.pan.x = p.x; + panFailed = false; + } + if (number$1(p.y)) { + _p.pan.y = p.y; + panFailed = false; + } + if (!panFailed) { + events.push('pan'); + } + } + if (events.length > 0) { + events.push('viewport'); + this.emit(events.join(' ')); + this.notify('viewport'); + } + return this; // chaining + }, - assignOrder(g, best); -} + center: function center(elements) { + var pan = this.getCenterPan(elements); + if (pan) { + this._private.pan = pan; + this.emit('pan viewport'); + this.notify('viewport'); + } + return this; // chaining + }, -function buildLayerGraphs(g, ranks, relationship) { - return _.map(ranks, function(rank) { - return buildLayerGraph(g, rank, relationship); - }); -} + getCenterPan: function getCenterPan(elements, zoom) { + if (!this._private.panningEnabled) { + return; + } + if (string(elements)) { + var selector = elements; + elements = this.mutableElements().filter(selector); + } else if (!elementOrCollection(elements)) { + elements = this.mutableElements(); + } + if (elements.length === 0) { + return; + } // can't centre pan to nothing -function sweepLayerGraphs(layerGraphs, biasRight) { - var cg = new Graph(); - _.forEach(layerGraphs, function(lg) { - var root = lg.graph().root; - var sorted = sortSubgraph(lg, root, cg, biasRight); - _.forEach(sorted.vs, function(v, i) { - lg.node(v).order = i; + var bb = elements.boundingBox(); + var w = this.width(); + var h = this.height(); + zoom = zoom === undefined ? this._private.zoom : zoom; + var pan = { + // middle + x: (w - zoom * (bb.x1 + bb.x2)) / 2, + y: (h - zoom * (bb.y1 + bb.y2)) / 2 + }; + return pan; + }, + reset: function reset() { + if (!this._private.panningEnabled || !this._private.zoomingEnabled) { + return this; + } + this.viewport({ + pan: { + x: 0, + y: 0 + }, + zoom: 1 }); - addSubgraphConstraints(lg, cg, sorted.vs); - }); -} + return this; // chaining + }, -function assignOrder(g, layering) { - _.forEach(layering, function(layer) { - _.forEach(layer, function(v, i) { - g.node(v).order = i; + invalidateSize: function invalidateSize() { + this._private.sizeCache = null; + }, + size: function size() { + var _p = this._private; + var container = _p.container; + var cy = this; + return _p.sizeCache = _p.sizeCache || (container ? function () { + var style = cy.window().getComputedStyle(container); + var val = function val(name) { + return parseFloat(style.getPropertyValue(name)); + }; + return { + width: container.clientWidth - val('padding-left') - val('padding-right'), + height: container.clientHeight - val('padding-top') - val('padding-bottom') + }; + }() : { + // fallback if no container (not 0 b/c can be used for dividing etc) + width: 1, + height: 1 }); - }); -} - + }, + width: function width() { + return this.size().width; + }, + height: function height() { + return this.size().height; + }, + extent: function extent() { + var pan = this._private.pan; + var zoom = this._private.zoom; + var rb = this.renderedExtent(); + var b = { + x1: (rb.x1 - pan.x) / zoom, + x2: (rb.x2 - pan.x) / zoom, + y1: (rb.y1 - pan.y) / zoom, + y2: (rb.y2 - pan.y) / zoom + }; + b.w = b.x2 - b.x1; + b.h = b.y2 - b.y1; + return b; + }, + renderedExtent: function renderedExtent() { + var width = this.width(); + var height = this.height(); + return { + x1: 0, + y1: 0, + x2: width, + y2: height, + w: width, + h: height + }; + }, + multiClickDebounceTime: function multiClickDebounceTime(_int) { + if (_int) this._private.multiClickDebounceTime = _int;else return this._private.multiClickDebounceTime; + return this; // chaining + } +}; -/***/ }), +// aliases +corefn$1.centre = corefn$1.center; -/***/ "./node_modules/dagre/lib/order/init-order.js": -/*!****************************************************!*\ - !*** ./node_modules/dagre/lib/order/init-order.js ***! - \****************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +// backwards compatibility +corefn$1.autolockNodes = corefn$1.autolock; +corefn$1.autoungrabifyNodes = corefn$1.autoungrabify; -"use strict"; +var fn = { + data: define.data({ + field: 'data', + bindingEvent: 'data', + allowBinding: true, + allowSetting: true, + settingEvent: 'data', + settingTriggersEvent: true, + triggerFnName: 'trigger', + allowGetting: true, + updateStyle: true + }), + removeData: define.removeData({ + field: 'data', + event: 'data', + triggerFnName: 'trigger', + triggerEvent: true, + updateStyle: true + }), + scratch: define.data({ + field: 'scratch', + bindingEvent: 'scratch', + allowBinding: true, + allowSetting: true, + settingEvent: 'scratch', + settingTriggersEvent: true, + triggerFnName: 'trigger', + allowGetting: true, + updateStyle: true + }), + removeScratch: define.removeData({ + field: 'scratch', + event: 'scratch', + triggerFnName: 'trigger', + triggerEvent: true, + updateStyle: true + }) +}; +// aliases +fn.attr = fn.data; +fn.removeAttr = fn.removeData; -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); +var Core = function Core(opts) { + var cy = this; + opts = extend({}, opts); + var container = opts.container; -module.exports = initOrder; + // allow for passing a wrapped jquery object + // e.g. cytoscape({ container: $('#cy') }) + if (container && !htmlElement(container) && htmlElement(container[0])) { + container = container[0]; + } + var reg = container ? container._cyreg : null; // e.g. already registered some info (e.g. readies) via jquery + reg = reg || {}; + if (reg && reg.cy) { + reg.cy.destroy(); + reg = {}; // old instance => replace reg completely + } -/* - * Assigns an initial order value for each node by performing a DFS search - * starting from nodes in the first rank. Nodes are assigned an order in their - * rank as they are first visited. - * - * This approach comes from Gansner, et al., "A Technique for Drawing Directed - * Graphs." - * - * Returns a layering matrix with an array per layer and each layer sorted by - * the order of its nodes. - */ -function initOrder(g) { - var visited = {}; - var simpleNodes = _.filter(g.nodes(), function(v) { - return !g.children(v).length; - }); - var maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })); - var layers = _.map(_.range(maxRank + 1), function() { return []; }); + var readies = reg.readies = reg.readies || []; + if (container) { + container._cyreg = reg; + } // make sure container assoc'd reg points to this cy + reg.cy = cy; + var head = _window !== undefined && container !== undefined && !opts.headless; + var options = opts; + options.layout = extend({ + name: head ? 'grid' : 'null' + }, options.layout); + options.renderer = extend({ + name: head ? 'canvas' : 'null' + }, options.renderer); + var defVal = function defVal(def, val, altVal) { + if (val !== undefined) { + return val; + } else if (altVal !== undefined) { + return altVal; + } else { + return def; + } + }; + var _p = this._private = { + container: container, + // html dom ele container + ready: false, + // whether ready has been triggered + options: options, + // cached options + elements: new Collection(this), + // elements in the graph + listeners: [], + // list of listeners + aniEles: new Collection(this), + // elements being animated + data: options.data || {}, + // data for the core + scratch: {}, + // scratch object for core + layout: null, + renderer: null, + destroyed: false, + // whether destroy was called + notificationsEnabled: true, + // whether notifications are sent to the renderer + minZoom: 1e-50, + maxZoom: 1e50, + zoomingEnabled: defVal(true, options.zoomingEnabled), + userZoomingEnabled: defVal(true, options.userZoomingEnabled), + panningEnabled: defVal(true, options.panningEnabled), + userPanningEnabled: defVal(true, options.userPanningEnabled), + boxSelectionEnabled: defVal(true, options.boxSelectionEnabled), + autolock: defVal(false, options.autolock, options.autolockNodes), + autoungrabify: defVal(false, options.autoungrabify, options.autoungrabifyNodes), + autounselectify: defVal(false, options.autounselectify), + styleEnabled: options.styleEnabled === undefined ? head : options.styleEnabled, + zoom: number$1(options.zoom) ? options.zoom : 1, + pan: { + x: plainObject(options.pan) && number$1(options.pan.x) ? options.pan.x : 0, + y: plainObject(options.pan) && number$1(options.pan.y) ? options.pan.y : 0 + }, + animation: { + // object for currently-running animations + current: [], + queue: [] + }, + hasCompoundNodes: false, + multiClickDebounceTime: defVal(250, options.multiClickDebounceTime) + }; + this.createEmitter(); - function dfs(v) { - if (_.has(visited, v)) return; - visited[v] = true; - var node = g.node(v); - layers[node.rank].push(v); - _.forEach(g.successors(v), dfs); - } + // set selection type + this.selectionType(options.selectionType); - var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; }); - _.forEach(orderedVs, dfs); + // init zoom bounds + this.zoomRange({ + min: options.minZoom, + max: options.maxZoom + }); + var loadExtData = function loadExtData(extData, next) { + var anyIsPromise = extData.some(promise); + if (anyIsPromise) { + return Promise$1.all(extData).then(next); // load all data asynchronously, then exec rest of init + } else { + next(extData); // exec synchronously for convenience + } + }; - return layers; -} + // start with the default stylesheet so we have something before loading an external stylesheet + if (_p.styleEnabled) { + cy.setStyle([]); + } + // create the renderer + var rendererOptions = extend({}, options, options.renderer); // allow rendering hints in top level options + cy.initRenderer(rendererOptions); + var setElesAndLayout = function setElesAndLayout(elements, onload, ondone) { + cy.notifications(false); -/***/ }), + // remove old elements + var oldEles = cy.mutableElements(); + if (oldEles.length > 0) { + oldEles.remove(); + } + if (elements != null) { + if (plainObject(elements) || array(elements)) { + cy.add(elements); + } + } + cy.one('layoutready', function (e) { + cy.notifications(true); + cy.emit(e); // we missed this event by turning notifications off, so pass it on -/***/ "./node_modules/dagre/lib/order/resolve-conflicts.js": -/*!***********************************************************!*\ - !*** ./node_modules/dagre/lib/order/resolve-conflicts.js ***! - \***********************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + cy.one('load', onload); + cy.emitAndNotify('load'); + }).one('layoutstop', function () { + cy.one('done', ondone); + cy.emit('done'); + }); + var layoutOpts = extend({}, cy._private.options.layout); + layoutOpts.eles = cy.elements(); + cy.layout(layoutOpts).run(); + }; + loadExtData([options.style, options.elements], function (thens) { + var initStyle = thens[0]; + var initEles = thens[1]; -"use strict"; + // init style + if (_p.styleEnabled) { + cy.style().append(initStyle); + } + // initial load + setElesAndLayout(initEles, function () { + // onready + cy.startAnimationLoop(); + _p.ready = true; -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); + // if a ready callback is specified as an option, the bind it + if (fn$6(options.ready)) { + cy.on('ready', options.ready); + } -module.exports = resolveConflicts; + // bind all the ready handlers registered before creating this instance + for (var i = 0; i < readies.length; i++) { + var fn = readies[i]; + cy.on('ready', fn); + } + if (reg) { + reg.readies = []; + } // clear b/c we've bound them all and don't want to keep it around in case a new core uses the same div etc -/* - * Given a list of entries of the form {v, barycenter, weight} and a - * constraint graph this function will resolve any conflicts between the - * constraint graph and the barycenters for the entries. If the barycenters for - * an entry would violate a constraint in the constraint graph then we coalesce - * the nodes in the conflict into a new node that respects the contraint and - * aggregates barycenter and weight information. - * - * This implementation is based on the description in Forster, "A Fast and - * Simple Hueristic for Constrained Two-Level Crossing Reduction," thought it - * differs in some specific details. - * - * Pre-conditions: - * - * 1. Each entry has the form {v, barycenter, weight}, or if the node has - * no barycenter, then {v}. - * - * Returns: - * - * A new list of entries of the form {vs, i, barycenter, weight}. The list - * `vs` may either be a singleton or it may be an aggregation of nodes - * ordered such that they do not violate constraints from the constraint - * graph. The property `i` is the lowest original index of any of the - * elements in `vs`. - */ -function resolveConflicts(entries, cg) { - var mappedEntries = {}; - _.forEach(entries, function(entry, i) { - var tmp = mappedEntries[entry.v] = { - indegree: 0, - "in": [], - out: [], - vs: [entry.v], - i: i - }; - if (!_.isUndefined(entry.barycenter)) { - tmp.barycenter = entry.barycenter; - tmp.weight = entry.weight; - } + cy.emit('ready'); + }, options.done); }); +}; +var corefn = Core.prototype; // short alias - _.forEach(cg.edges(), function(e) { - var entryV = mappedEntries[e.v]; - var entryW = mappedEntries[e.w]; - if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) { - entryW.indegree++; - entryV.out.push(mappedEntries[e.w]); +extend(corefn, { + instanceString: function instanceString() { + return 'core'; + }, + isReady: function isReady() { + return this._private.ready; + }, + destroyed: function destroyed() { + return this._private.destroyed; + }, + ready: function ready(fn) { + if (this.isReady()) { + this.emitter().emit('ready', [], fn); // just calls fn as though triggered via ready event + } else { + this.on('ready', fn); } - }); + return this; + }, + destroy: function destroy() { + var cy = this; + if (cy.destroyed()) return; + cy.stopAnimationLoop(); + cy.destroyRenderer(); + this.emit('destroy'); + cy._private.destroyed = true; + return cy; + }, + hasElementWithId: function hasElementWithId(id) { + return this._private.elements.hasElementWithId(id); + }, + getElementById: function getElementById(id) { + return this._private.elements.getElementById(id); + }, + hasCompoundNodes: function hasCompoundNodes() { + return this._private.hasCompoundNodes; + }, + headless: function headless() { + return this._private.renderer.isHeadless(); + }, + styleEnabled: function styleEnabled() { + return this._private.styleEnabled; + }, + addToPool: function addToPool(eles) { + this._private.elements.merge(eles); + return this; // chaining + }, - var sourceSet = _.filter(mappedEntries, function(entry) { - return !entry.indegree; - }); + removeFromPool: function removeFromPool(eles) { + this._private.elements.unmerge(eles); + return this; + }, + container: function container() { + return this._private.container || null; + }, + window: function window() { + var container = this._private.container; + if (container == null) return _window; + var ownerDocument = this._private.container.ownerDocument; + if (ownerDocument === undefined || ownerDocument == null) { + return _window; + } + return ownerDocument.defaultView || _window; + }, + mount: function mount(container) { + if (container == null) { + return; + } + var cy = this; + var _p = cy._private; + var options = _p.options; + if (!htmlElement(container) && htmlElement(container[0])) { + container = container[0]; + } + cy.stopAnimationLoop(); + cy.destroyRenderer(); + _p.container = container; + _p.styleEnabled = true; + cy.invalidateSize(); + cy.initRenderer(extend({}, options, options.renderer, { + // allow custom renderer name to be re-used, otherwise use canvas + name: options.renderer.name === 'null' ? 'canvas' : options.renderer.name + })); + cy.startAnimationLoop(); + cy.style(options.style); + cy.emit('mount'); + return cy; + }, + unmount: function unmount() { + var cy = this; + cy.stopAnimationLoop(); + cy.destroyRenderer(); + cy.initRenderer({ + name: 'null' + }); + cy.emit('unmount'); + return cy; + }, + options: function options() { + return copy(this._private.options); + }, + json: function json(obj) { + var cy = this; + var _p = cy._private; + var eles = cy.mutableElements(); + var getFreshRef = function getFreshRef(ele) { + return cy.getElementById(ele.id()); + }; + if (plainObject(obj)) { + // set - return doResolveConflicts(sourceSet); -} + cy.startBatch(); + if (obj.elements) { + var idInJson = {}; + var updateEles = function updateEles(jsons, gr) { + var toAdd = []; + var toMod = []; + for (var i = 0; i < jsons.length; i++) { + var json = jsons[i]; + if (!json.data.id) { + warn('cy.json() cannot handle elements without an ID attribute'); + continue; + } + var id = '' + json.data.id; // id must be string + var ele = cy.getElementById(id); + idInJson[id] = true; + if (ele.length !== 0) { + // existing element should be updated + toMod.push({ + ele: ele, + json: json + }); + } else { + // otherwise should be added + if (gr) { + json.group = gr; + toAdd.push(json); + } else { + toAdd.push(json); + } + } + } + cy.add(toAdd); + for (var _i = 0; _i < toMod.length; _i++) { + var _toMod$_i = toMod[_i], + _ele = _toMod$_i.ele, + _json = _toMod$_i.json; + _ele.json(_json); + } + }; + if (array(obj.elements)) { + // elements: [] + updateEles(obj.elements); + } else { + // elements: { nodes: [], edges: [] } + var grs = ['nodes', 'edges']; + for (var i = 0; i < grs.length; i++) { + var gr = grs[i]; + var elements = obj.elements[gr]; + if (array(elements)) { + updateEles(elements, gr); + } + } + } + var parentsToRemove = cy.collection(); + eles.filter(function (ele) { + return !idInJson[ele.id()]; + }).forEach(function (ele) { + if (ele.isParent()) { + parentsToRemove.merge(ele); + } else { + ele.remove(); + } + }); -function doResolveConflicts(sourceSet) { - var entries = []; + // so that children are not removed w/parent + parentsToRemove.forEach(function (ele) { + return ele.children().move({ + parent: null + }); + }); - function handleIn(vEntry) { - return function(uEntry) { - if (uEntry.merged) { - return; + // intermediate parents may be moved by prior line, so make sure we remove by fresh refs + parentsToRemove.forEach(function (ele) { + return getFreshRef(ele).remove(); + }); } - if (_.isUndefined(uEntry.barycenter) || - _.isUndefined(vEntry.barycenter) || - uEntry.barycenter >= vEntry.barycenter) { - mergeEntries(vEntry, uEntry); + if (obj.style) { + cy.style(obj.style); } - }; - } - - function handleOut(vEntry) { - return function(wEntry) { - wEntry["in"].push(vEntry); - if (--wEntry.indegree === 0) { - sourceSet.push(wEntry); + if (obj.zoom != null && obj.zoom !== _p.zoom) { + cy.zoom(obj.zoom); } - }; - } - - while (sourceSet.length) { - var entry = sourceSet.pop(); - entries.push(entry); - _.forEach(entry["in"].reverse(), handleIn(entry)); - _.forEach(entry.out, handleOut(entry)); + if (obj.pan) { + if (obj.pan.x !== _p.pan.x || obj.pan.y !== _p.pan.y) { + cy.pan(obj.pan); + } + } + if (obj.data) { + cy.data(obj.data); + } + var fields = ['minZoom', 'maxZoom', 'zoomingEnabled', 'userZoomingEnabled', 'panningEnabled', 'userPanningEnabled', 'boxSelectionEnabled', 'autolock', 'autoungrabify', 'autounselectify', 'multiClickDebounceTime']; + for (var _i2 = 0; _i2 < fields.length; _i2++) { + var f = fields[_i2]; + if (obj[f] != null) { + cy[f](obj[f]); + } + } + cy.endBatch(); + return this; // chaining + } else { + // get + var flat = !!obj; + var json = {}; + if (flat) { + json.elements = this.elements().map(function (ele) { + return ele.json(); + }); + } else { + json.elements = {}; + eles.forEach(function (ele) { + var group = ele.group(); + if (!json.elements[group]) { + json.elements[group] = []; + } + json.elements[group].push(ele.json()); + }); + } + if (this._private.styleEnabled) { + json.style = cy.style().json(); + } + json.data = copy(cy.data()); + var options = _p.options; + json.zoomingEnabled = _p.zoomingEnabled; + json.userZoomingEnabled = _p.userZoomingEnabled; + json.zoom = _p.zoom; + json.minZoom = _p.minZoom; + json.maxZoom = _p.maxZoom; + json.panningEnabled = _p.panningEnabled; + json.userPanningEnabled = _p.userPanningEnabled; + json.pan = copy(_p.pan); + json.boxSelectionEnabled = _p.boxSelectionEnabled; + json.renderer = copy(options.renderer); + json.hideEdgesOnViewport = options.hideEdgesOnViewport; + json.textureOnViewport = options.textureOnViewport; + json.wheelSensitivity = options.wheelSensitivity; + json.motionBlur = options.motionBlur; + json.multiClickDebounceTime = options.multiClickDebounceTime; + return json; + } } +}); +corefn.$id = corefn.getElementById; +[corefn$9, corefn$8, elesfn, corefn$7, corefn$6, corefn$5, corefn$4, corefn$3, corefn$2, corefn$1, fn].forEach(function (props) { + extend(corefn, props); +}); - return _.map(_.filter(entries, function(entry) { return !entry.merged; }), - function(entry) { - return _.pick(entry, ["vs", "i", "barycenter", "weight"]); - }); - -} - -function mergeEntries(target, source) { - var sum = 0; - var weight = 0; +/* eslint-disable no-unused-vars */ +var defaults$7 = { + fit: true, + // whether to fit the viewport to the graph + directed: false, + // whether the tree is directed downwards (or edges can point in any direction if false) + padding: 30, + // padding on fit + circle: false, + // put depths in concentric circles if true, put depths top down if false + grid: false, + // whether to create an even grid into which the DAG is placed (circle:false only) + spacingFactor: 1.75, + // positive spacing factor, larger => more space between nodes (N.B. n/a if causes overlap) + boundingBox: undefined, + // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } + avoidOverlap: true, + // prevents node overlap, may overflow boundingBox if not enough space + nodeDimensionsIncludeLabels: false, + // Excludes the label when calculating node bounding boxes for the layout algorithm + roots: undefined, + // the roots of the trees + depthSort: undefined, + // a sorting function to order nodes at equal depth. e.g. function(a, b){ return a.data('weight') - b.data('weight') } + animate: false, + // whether to transition the node positions + animationDuration: 500, + // duration of animation in ms if enabled + animationEasing: undefined, + // easing of animation if enabled, + animateFilter: function animateFilter(node, i) { + return true; + }, + // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts + ready: undefined, + // callback on layoutready + stop: undefined, + // callback on layoutstop + transform: function transform(node, position) { + return position; + } // transform a given node position. Useful for changing flow direction in discrete layouts +}; - if (target.weight) { - sum += target.barycenter * target.weight; - weight += target.weight; - } +var deprecatedOptionDefaults = { + maximal: false, + // whether to shift nodes down their natural BFS depths in order to avoid upwards edges (DAGS only); setting acyclic to true sets maximal to true also + acyclic: false // whether the tree is acyclic and thus a node could be shifted (due to the maximal option) multiple times without causing an infinite loop; setting to true sets maximal to true also; if you are uncertain whether a tree is acyclic, set to false to avoid potential infinite loops +}; - if (source.weight) { - sum += source.barycenter * source.weight; - weight += source.weight; - } +/* eslint-enable */ - target.vs = source.vs.concat(target.vs); - target.barycenter = sum / weight; - target.weight = weight; - target.i = Math.min(source.i, target.i); - source.merged = true; +var getInfo = function getInfo(ele) { + return ele.scratch('breadthfirst'); +}; +var setInfo = function setInfo(ele, obj) { + return ele.scratch('breadthfirst', obj); +}; +function BreadthFirstLayout(options) { + this.options = extend({}, defaults$7, deprecatedOptionDefaults, options); } +BreadthFirstLayout.prototype.run = function () { + var params = this.options; + var options = params; + var cy = params.cy; + var eles = options.eles; + var nodes = eles.nodes().filter(function (n) { + return !n.isParent(); + }); + var graph = eles; + var directed = options.directed; + var maximal = options.acyclic || options.maximal || options.maximalAdjustments > 0; // maximalAdjustments for compat. w/ old code; also, setting acyclic to true sets maximal to true + var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { + x1: 0, + y1: 0, + w: cy.width(), + h: cy.height() + }); + var roots; + if (elementOrCollection(options.roots)) { + roots = options.roots; + } else if (array(options.roots)) { + var rootsArray = []; + for (var i = 0; i < options.roots.length; i++) { + var id = options.roots[i]; + var ele = cy.getElementById(id); + rootsArray.push(ele); + } + roots = cy.collection(rootsArray); + } else if (string(options.roots)) { + roots = cy.$(options.roots); + } else { + if (directed) { + roots = nodes.roots(); + } else { + var components = eles.components(); + roots = cy.collection(); + var _loop = function _loop(_i) { + var comp = components[_i]; + var maxDegree = comp.maxDegree(false); + var compRoots = comp.filter(function (ele) { + return ele.degree(false) === maxDegree; + }); + roots = roots.add(compRoots); + }; + for (var _i = 0; _i < components.length; _i++) { + _loop(_i); + } + } + } + var depths = []; + var foundByBfs = {}; + var addToDepth = function addToDepth(ele, d) { + if (depths[d] == null) { + depths[d] = []; + } + var i = depths[d].length; + depths[d].push(ele); + setInfo(ele, { + index: i, + depth: d + }); + }; + var changeDepth = function changeDepth(ele, newDepth) { + var _getInfo = getInfo(ele), + depth = _getInfo.depth, + index = _getInfo.index; + depths[depth][index] = null; + addToDepth(ele, newDepth); + }; -/***/ }), - -/***/ "./node_modules/dagre/lib/order/sort-subgraph.js": -/*!*******************************************************!*\ - !*** ./node_modules/dagre/lib/order/sort-subgraph.js ***! - \*******************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); -var barycenter = __webpack_require__(/*! ./barycenter */ "./node_modules/dagre/lib/order/barycenter.js"); -var resolveConflicts = __webpack_require__(/*! ./resolve-conflicts */ "./node_modules/dagre/lib/order/resolve-conflicts.js"); -var sort = __webpack_require__(/*! ./sort */ "./node_modules/dagre/lib/order/sort.js"); + // find the depths of the nodes + graph.bfs({ + roots: roots, + directed: options.directed, + visit: function visit(node, edge, pNode, i, depth) { + var ele = node[0]; + var id = ele.id(); + addToDepth(ele, depth); + foundByBfs[id] = true; + } + }); -module.exports = sortSubgraph; + // check for nodes not found by bfs + var orphanNodes = []; + for (var _i2 = 0; _i2 < nodes.length; _i2++) { + var _ele = nodes[_i2]; + if (foundByBfs[_ele.id()]) { + continue; + } else { + orphanNodes.push(_ele); + } + } -function sortSubgraph(g, v, cg, biasRight) { - var movable = g.children(v); - var node = g.node(v); - var bl = node ? node.borderLeft : undefined; - var br = node ? node.borderRight: undefined; - var subgraphs = {}; + // assign the nodes a depth and index - if (bl) { - movable = _.filter(movable, function(w) { - return w !== bl && w !== br; + var assignDepthsAt = function assignDepthsAt(i) { + var eles = depths[i]; + for (var j = 0; j < eles.length; j++) { + var _ele2 = eles[j]; + if (_ele2 == null) { + eles.splice(j, 1); + j--; + continue; + } + setInfo(_ele2, { + depth: i, + index: j + }); + } + }; + var assignDepths = function assignDepths() { + for (var _i3 = 0; _i3 < depths.length; _i3++) { + assignDepthsAt(_i3); + } + }; + var adjustMaximally = function adjustMaximally(ele, shifted) { + var eInfo = getInfo(ele); + var incomers = ele.incomers().filter(function (el) { + return el.isNode() && eles.has(el); }); - } - - var barycenters = barycenter(g, movable); - _.forEach(barycenters, function(entry) { - if (g.children(entry.v).length) { - var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight); - subgraphs[entry.v] = subgraphResult; - if (_.has(subgraphResult, "barycenter")) { - mergeBarycenters(entry, subgraphResult); + var maxDepth = -1; + var id = ele.id(); + for (var k = 0; k < incomers.length; k++) { + var incmr = incomers[k]; + var iInfo = getInfo(incmr); + maxDepth = Math.max(maxDepth, iInfo.depth); + } + if (eInfo.depth <= maxDepth) { + if (!options.acyclic && shifted[id]) { + return null; } + var newDepth = maxDepth + 1; + changeDepth(ele, newDepth); + shifted[id] = newDepth; + return true; } - }); - - var entries = resolveConflicts(barycenters, cg); - expandSubgraphs(entries, subgraphs); - - var result = sort(entries, biasRight); + return false; + }; - if (bl) { - result.vs = _.flatten([bl, result.vs, br], true); - if (g.predecessors(bl).length) { - var blPred = g.node(g.predecessors(bl)[0]), - brPred = g.node(g.predecessors(br)[0]); - if (!_.has(result, "barycenter")) { - result.barycenter = 0; - result.weight = 0; + // for the directed case, try to make the edges all go down (i.e. depth i => depth i + 1) + if (directed && maximal) { + var Q = []; + var shifted = {}; + var enqueue = function enqueue(n) { + return Q.push(n); + }; + var dequeue = function dequeue() { + return Q.shift(); + }; + nodes.forEach(function (n) { + return Q.push(n); + }); + while (Q.length > 0) { + var _ele3 = dequeue(); + var didShift = adjustMaximally(_ele3, shifted); + if (didShift) { + _ele3.outgoers().filter(function (el) { + return el.isNode() && eles.has(el); + }).forEach(enqueue); + } else if (didShift === null) { + warn('Detected double maximal shift for node `' + _ele3.id() + '`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.'); + break; // exit on failure } - result.barycenter = (result.barycenter * result.weight + - blPred.order + brPred.order) / (result.weight + 2); - result.weight += 2; } } - return result; -} - -function expandSubgraphs(entries, subgraphs) { - _.forEach(entries, function(entry) { - entry.vs = _.flatten(entry.vs.map(function(v) { - if (subgraphs[v]) { - return subgraphs[v].vs; - } - return v; - }), true); - }); -} + assignDepths(); // clear holes -function mergeBarycenters(target, other) { - if (!_.isUndefined(target.barycenter)) { - target.barycenter = (target.barycenter * target.weight + - other.barycenter * other.weight) / - (target.weight + other.weight); - target.weight += other.weight; - } else { - target.barycenter = other.barycenter; - target.weight = other.weight; + // find min distance we need to leave between nodes + var minDistance = 0; + if (options.avoidOverlap) { + for (var _i4 = 0; _i4 < nodes.length; _i4++) { + var n = nodes[_i4]; + var nbb = n.layoutDimensions(options); + var w = nbb.w; + var h = nbb.h; + minDistance = Math.max(minDistance, w, h); + } } -} - -/***/ }), + // get the weighted percent for an element based on its connectivity to other levels + var cachedWeightedPercent = {}; + var getWeightedPercent = function getWeightedPercent(ele) { + if (cachedWeightedPercent[ele.id()]) { + return cachedWeightedPercent[ele.id()]; + } + var eleDepth = getInfo(ele).depth; + var neighbors = ele.neighborhood(); + var percent = 0; + var samples = 0; + for (var _i5 = 0; _i5 < neighbors.length; _i5++) { + var neighbor = neighbors[_i5]; + if (neighbor.isEdge() || neighbor.isParent() || !nodes.has(neighbor)) { + continue; + } + var bf = getInfo(neighbor); + if (bf == null) { + continue; + } + var index = bf.index; + var depth = bf.depth; -/***/ "./node_modules/dagre/lib/order/sort.js": -/*!**********************************************!*\ - !*** ./node_modules/dagre/lib/order/sort.js ***! - \**********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // unassigned neighbours shouldn't affect the ordering + if (index == null || depth == null) { + continue; + } + var nDepth = depths[depth].length; + if (depth < eleDepth) { + // only get influenced by elements above + percent += index / nDepth; + samples++; + } + } + samples = Math.max(1, samples); + percent = percent / samples; + if (samples === 0) { + // put lone nodes at the start + percent = 0; + } + cachedWeightedPercent[ele.id()] = percent; + return percent; + }; -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); -var util = __webpack_require__(/*! ../util */ "./node_modules/dagre/lib/util.js"); + // rearrange the indices in each depth level based on connectivity -module.exports = sort; + var sortFn = function sortFn(a, b) { + var apct = getWeightedPercent(a); + var bpct = getWeightedPercent(b); + var diff = apct - bpct; + if (diff === 0) { + return ascending(a.id(), b.id()); // make sure sort doesn't have don't-care comparisons + } else { + return diff; + } + }; + if (options.depthSort !== undefined) { + sortFn = options.depthSort; + } -function sort(entries, biasRight) { - var parts = util.partition(entries, function(entry) { - return _.has(entry, "barycenter"); - }); - var sortable = parts.lhs, - unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }), - vs = [], - sum = 0, - weight = 0, - vsIndex = 0; + // sort each level to make connected nodes closer + for (var _i6 = 0; _i6 < depths.length; _i6++) { + depths[_i6].sort(sortFn); + assignDepthsAt(_i6); + } - sortable.sort(compareWithBias(!!biasRight)); + // assign orphan nodes to a new top-level depth + var orphanDepth = []; + for (var _i7 = 0; _i7 < orphanNodes.length; _i7++) { + orphanDepth.push(orphanNodes[_i7]); + } + depths.unshift(orphanDepth); + assignDepths(); + var biggestDepthSize = 0; + for (var _i8 = 0; _i8 < depths.length; _i8++) { + biggestDepthSize = Math.max(depths[_i8].length, biggestDepthSize); + } + var center = { + x: bb.x1 + bb.w / 2, + y: bb.x1 + bb.h / 2 + }; + var maxDepthSize = depths.reduce(function (max, eles) { + return Math.max(max, eles.length); + }, 0); + var getPosition = function getPosition(ele) { + var _getInfo2 = getInfo(ele), + depth = _getInfo2.depth, + index = _getInfo2.index; + var depthSize = depths[depth].length; + var distanceX = Math.max(bb.w / ((options.grid ? maxDepthSize : depthSize) + 1), minDistance); + var distanceY = Math.max(bb.h / (depths.length + 1), minDistance); + var radiusStepSize = Math.min(bb.w / 2 / depths.length, bb.h / 2 / depths.length); + radiusStepSize = Math.max(radiusStepSize, minDistance); + if (!options.circle) { + var epos = { + x: center.x + (index + 1 - (depthSize + 1) / 2) * distanceX, + y: (depth + 1) * distanceY + }; + return epos; + } else { + var radius = radiusStepSize * depth + radiusStepSize - (depths.length > 0 && depths[0].length <= 3 ? radiusStepSize / 2 : 0); + var theta = 2 * Math.PI / depths[depth].length * index; + if (depth === 0 && depths[0].length === 1) { + radius = 1; + } + return { + x: center.x + radius * Math.cos(theta), + y: center.y + radius * Math.sin(theta) + }; + } + }; + eles.nodes().layoutPositions(this, options, getPosition); + return this; // chaining +}; - vsIndex = consumeUnsortable(vs, unsortable, vsIndex); +var defaults$6 = { + fit: true, + // whether to fit the viewport to the graph + padding: 30, + // the padding on fit + boundingBox: undefined, + // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } + avoidOverlap: true, + // prevents node overlap, may overflow boundingBox and radius if not enough space + nodeDimensionsIncludeLabels: false, + // Excludes the label when calculating node bounding boxes for the layout algorithm + spacingFactor: undefined, + // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up + radius: undefined, + // the radius of the circle + startAngle: 3 / 2 * Math.PI, + // where nodes start in radians + sweep: undefined, + // how many radians should be between the first and last node (defaults to full circle) + clockwise: true, + // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false) + sort: undefined, + // a sorting function to order the nodes; e.g. function(a, b){ return a.data('weight') - b.data('weight') } + animate: false, + // whether to transition the node positions + animationDuration: 500, + // duration of animation in ms if enabled + animationEasing: undefined, + // easing of animation if enabled + animateFilter: function animateFilter(node, i) { + return true; + }, + // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts + ready: undefined, + // callback on layoutready + stop: undefined, + // callback on layoutstop + transform: function transform(node, position) { + return position; + } // transform a given node position. Useful for changing flow direction in discrete layouts +}; - _.forEach(sortable, function (entry) { - vsIndex += entry.vs.length; - vs.push(entry.vs); - sum += entry.barycenter * entry.weight; - weight += entry.weight; - vsIndex = consumeUnsortable(vs, unsortable, vsIndex); +function CircleLayout(options) { + this.options = extend({}, defaults$6, options); +} +CircleLayout.prototype.run = function () { + var params = this.options; + var options = params; + var cy = params.cy; + var eles = options.eles; + var clockwise = options.counterclockwise !== undefined ? !options.counterclockwise : options.clockwise; + var nodes = eles.nodes().not(':parent'); + if (options.sort) { + nodes = nodes.sort(options.sort); + } + var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { + x1: 0, + y1: 0, + w: cy.width(), + h: cy.height() }); - - var result = { vs: _.flatten(vs, true) }; - if (weight) { - result.barycenter = sum / weight; - result.weight = weight; + var center = { + x: bb.x1 + bb.w / 2, + y: bb.y1 + bb.h / 2 + }; + var sweep = options.sweep === undefined ? 2 * Math.PI - 2 * Math.PI / nodes.length : options.sweep; + var dTheta = sweep / Math.max(1, nodes.length - 1); + var r; + var minDistance = 0; + for (var i = 0; i < nodes.length; i++) { + var n = nodes[i]; + var nbb = n.layoutDimensions(options); + var w = nbb.w; + var h = nbb.h; + minDistance = Math.max(minDistance, w, h); } - return result; -} - -function consumeUnsortable(vs, unsortable, index) { - var last; - while (unsortable.length && (last = _.last(unsortable)).i <= index) { - unsortable.pop(); - vs.push(last.vs); - index++; + if (number$1(options.radius)) { + r = options.radius; + } else if (nodes.length <= 1) { + r = 0; + } else { + r = Math.min(bb.h, bb.w) / 2 - minDistance; } - return index; -} -function compareWithBias(bias) { - return function(entryV, entryW) { - if (entryV.barycenter < entryW.barycenter) { - return -1; - } else if (entryV.barycenter > entryW.barycenter) { - return 1; - } + // calculate the radius + if (nodes.length > 1 && options.avoidOverlap) { + // but only if more than one node (can't overlap) + minDistance *= 1.75; // just to have some nice spacing - return !bias ? entryV.i - entryW.i : entryW.i - entryV.i; + var dcos = Math.cos(dTheta) - Math.cos(0); + var dsin = Math.sin(dTheta) - Math.sin(0); + var rMin = Math.sqrt(minDistance * minDistance / (dcos * dcos + dsin * dsin)); // s.t. no nodes overlapping + r = Math.max(rMin, r); + } + var getPos = function getPos(ele, i) { + var theta = options.startAngle + i * dTheta * (clockwise ? 1 : -1); + var rx = r * Math.cos(theta); + var ry = r * Math.sin(theta); + var pos = { + x: center.x + rx, + y: center.y + ry + }; + return pos; }; -} - - -/***/ }), - -/***/ "./node_modules/dagre/lib/parent-dummy-chains.js": -/*!*******************************************************!*\ - !*** ./node_modules/dagre/lib/parent-dummy-chains.js ***! - \*******************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + eles.nodes().layoutPositions(this, options, getPos); + return this; // chaining +}; -var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); +var defaults$5 = { + fit: true, + // whether to fit the viewport to the graph + padding: 30, + // the padding on fit + startAngle: 3 / 2 * Math.PI, + // where nodes start in radians + sweep: undefined, + // how many radians should be between the first and last node (defaults to full circle) + clockwise: true, + // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false) + equidistant: false, + // whether levels have an equal radial distance betwen them, may cause bounding box overflow + minNodeSpacing: 10, + // min spacing between outside of nodes (used for radius adjustment) + boundingBox: undefined, + // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } + avoidOverlap: true, + // prevents node overlap, may overflow boundingBox if not enough space + nodeDimensionsIncludeLabels: false, + // Excludes the label when calculating node bounding boxes for the layout algorithm + height: undefined, + // height of layout area (overrides container height) + width: undefined, + // width of layout area (overrides container width) + spacingFactor: undefined, + // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up + concentric: function concentric(node) { + // returns numeric value for each node, placing higher nodes in levels towards the centre + return node.degree(); + }, + levelWidth: function levelWidth(nodes) { + // the variation of concentric values in each level + return nodes.maxDegree() / 4; + }, + animate: false, + // whether to transition the node positions + animationDuration: 500, + // duration of animation in ms if enabled + animationEasing: undefined, + // easing of animation if enabled + animateFilter: function animateFilter(node, i) { + return true; + }, + // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts + ready: undefined, + // callback on layoutready + stop: undefined, + // callback on layoutstop + transform: function transform(node, position) { + return position; + } // transform a given node position. Useful for changing flow direction in discrete layouts +}; -module.exports = parentDummyChains; +function ConcentricLayout(options) { + this.options = extend({}, defaults$5, options); +} +ConcentricLayout.prototype.run = function () { + var params = this.options; + var options = params; + var clockwise = options.counterclockwise !== undefined ? !options.counterclockwise : options.clockwise; + var cy = params.cy; + var eles = options.eles; + var nodes = eles.nodes().not(':parent'); + var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { + x1: 0, + y1: 0, + w: cy.width(), + h: cy.height() + }); + var center = { + x: bb.x1 + bb.w / 2, + y: bb.y1 + bb.h / 2 + }; + var nodeValues = []; // { node, value } + var maxNodeSize = 0; + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + var value = void 0; -function parentDummyChains(g) { - var postorderNums = postorder(g); + // calculate the node value + value = options.concentric(node); + nodeValues.push({ + value: value, + node: node + }); - _.forEach(g.graph().dummyChains, function(v) { - var node = g.node(v); - var edgeObj = node.edgeObj; - var pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w); - var path = pathData.path; - var lca = pathData.lca; - var pathIdx = 0; - var pathV = path[pathIdx]; - var ascending = true; + // for style mapping + node._private.scratch.concentric = value; + } - while (v !== edgeObj.w) { - node = g.node(v); + // in case we used the `concentric` in style + nodes.updateStyle(); - if (ascending) { - while ((pathV = path[pathIdx]) !== lca && - g.node(pathV).maxRank < node.rank) { - pathIdx++; - } + // calculate max size now based on potentially updated mappers + for (var _i = 0; _i < nodes.length; _i++) { + var _node = nodes[_i]; + var nbb = _node.layoutDimensions(options); + maxNodeSize = Math.max(maxNodeSize, nbb.w, nbb.h); + } - if (pathV === lca) { - ascending = false; - } - } + // sort node values in descreasing order + nodeValues.sort(function (a, b) { + return b.value - a.value; + }); + var levelWidth = options.levelWidth(nodes); - if (!ascending) { - while (pathIdx < path.length - 1 && - g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) { - pathIdx++; - } - pathV = path[pathIdx]; + // put the values into levels + var levels = [[]]; + var currentLevel = levels[0]; + for (var _i2 = 0; _i2 < nodeValues.length; _i2++) { + var val = nodeValues[_i2]; + if (currentLevel.length > 0) { + var diff = Math.abs(currentLevel[0].value - val.value); + if (diff >= levelWidth) { + currentLevel = []; + levels.push(currentLevel); } - - g.setParent(v, pathV); - v = g.successors(v)[0]; } - }); -} + currentLevel.push(val); + } -// Find a path from v to w through the lowest common ancestor (LCA). Return the -// full path and the LCA. -function findPath(g, postorderNums, v, w) { - var vPath = []; - var wPath = []; - var low = Math.min(postorderNums[v].low, postorderNums[w].low); - var lim = Math.max(postorderNums[v].lim, postorderNums[w].lim); - var parent; - var lca; + // create positions from levels - // Traverse up from v to find the LCA - parent = v; - do { - parent = g.parent(parent); - vPath.push(parent); - } while (parent && - (postorderNums[parent].low > low || lim > postorderNums[parent].lim)); - lca = parent; + var minDist = maxNodeSize + options.minNodeSpacing; // min dist between nodes - // Traverse from w to LCA - parent = w; - while ((parent = g.parent(parent)) !== lca) { - wPath.push(parent); + if (!options.avoidOverlap) { + // then strictly constrain to bb + var firstLvlHasMulti = levels.length > 0 && levels[0].length > 1; + var maxR = Math.min(bb.w, bb.h) / 2 - minDist; + var rStep = maxR / (levels.length + firstLvlHasMulti ? 1 : 0); + minDist = Math.min(minDist, rStep); } - return { path: vPath.concat(wPath.reverse()), lca: lca }; -} + // find the metrics for each level + var r = 0; + for (var _i3 = 0; _i3 < levels.length; _i3++) { + var level = levels[_i3]; + var sweep = options.sweep === undefined ? 2 * Math.PI - 2 * Math.PI / level.length : options.sweep; + var dTheta = level.dTheta = sweep / Math.max(1, level.length - 1); -function postorder(g) { - var result = {}; - var lim = 0; + // calculate the radius + if (level.length > 1 && options.avoidOverlap) { + // but only if more than one node (can't overlap) + var dcos = Math.cos(dTheta) - Math.cos(0); + var dsin = Math.sin(dTheta) - Math.sin(0); + var rMin = Math.sqrt(minDist * minDist / (dcos * dcos + dsin * dsin)); // s.t. no nodes overlapping - function dfs(v) { - var low = lim; - _.forEach(g.children(v), dfs); - result[v] = { low: low, lim: lim++ }; + r = Math.max(rMin, r); + } + level.r = r; + r += minDist; + } + if (options.equidistant) { + var rDeltaMax = 0; + var _r = 0; + for (var _i4 = 0; _i4 < levels.length; _i4++) { + var _level = levels[_i4]; + var rDelta = _level.r - _r; + rDeltaMax = Math.max(rDeltaMax, rDelta); + } + _r = 0; + for (var _i5 = 0; _i5 < levels.length; _i5++) { + var _level2 = levels[_i5]; + if (_i5 === 0) { + _r = _level2.r; + } + _level2.r = _r; + _r += rDeltaMax; + } } - _.forEach(g.children(), dfs); - - return result; -} - -/***/ }), + // calculate the node positions + var pos = {}; // id => position + for (var _i6 = 0; _i6 < levels.length; _i6++) { + var _level3 = levels[_i6]; + var _dTheta = _level3.dTheta; + var _r2 = _level3.r; + for (var j = 0; j < _level3.length; j++) { + var _val = _level3[j]; + var theta = options.startAngle + (clockwise ? 1 : -1) * _dTheta * j; + var p = { + x: center.x + _r2 * Math.cos(theta), + y: center.y + _r2 * Math.sin(theta) + }; + pos[_val.node.id()] = p; + } + } -/***/ "./node_modules/dagre/lib/position/bk.js": -/*!***********************************************!*\ - !*** ./node_modules/dagre/lib/position/bk.js ***! - \***********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // position the nodes + eles.nodes().layoutPositions(this, options, function (ele) { + var id = ele.id(); + return pos[id]; + }); + return this; // chaining +}; -"use strict"; +/* +The CoSE layout was written by Gerardo Huck. +https://www.linkedin.com/in/gerardohuck/ +Based on the following article: +http://dl.acm.org/citation.cfm?id=1498047 -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); -var Graph = (__webpack_require__(/*! ../graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph); -var util = __webpack_require__(/*! ../util */ "./node_modules/dagre/lib/util.js"); +Modifications tracked on Github. +*/ +var DEBUG; -/* - * This module provides coordinate assignment based on Brandes and Köpf, "Fast - * and Simple Horizontal Coordinate Assignment." +/** + * @brief : default layout options */ - -module.exports = { - positionX: positionX, - findType1Conflicts: findType1Conflicts, - findType2Conflicts: findType2Conflicts, - addConflict: addConflict, - hasConflict: hasConflict, - verticalAlignment: verticalAlignment, - horizontalCompaction: horizontalCompaction, - alignCoordinates: alignCoordinates, - findSmallestWidthAlignment: findSmallestWidthAlignment, - balance: balance +var defaults$4 = { + // Called on `layoutready` + ready: function ready() {}, + // Called on `layoutstop` + stop: function stop() {}, + // Whether to animate while running the layout + // true : Animate continuously as the layout is running + // false : Just show the end result + // 'end' : Animate with the end result, from the initial positions to the end positions + animate: true, + // Easing of the animation for animate:'end' + animationEasing: undefined, + // The duration of the animation for animate:'end' + animationDuration: undefined, + // A function that determines whether the node should be animated + // All nodes animated by default on animate enabled + // Non-animated nodes are positioned immediately when the layout starts + animateFilter: function animateFilter(node, i) { + return true; + }, + // The layout animates only after this many milliseconds for animate:true + // (prevents flashing on fast runs) + animationThreshold: 250, + // Number of iterations between consecutive screen positions update + refresh: 20, + // Whether to fit the network view after when done + fit: true, + // Padding on fit + padding: 30, + // Constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } + boundingBox: undefined, + // Excludes the label when calculating node bounding boxes for the layout algorithm + nodeDimensionsIncludeLabels: false, + // Randomize the initial positions of the nodes (true) or use existing positions (false) + randomize: false, + // Extra spacing between components in non-compound graphs + componentSpacing: 40, + // Node repulsion (non overlapping) multiplier + nodeRepulsion: function nodeRepulsion(node) { + return 2048; + }, + // Node repulsion (overlapping) multiplier + nodeOverlap: 4, + // Ideal edge (non nested) length + idealEdgeLength: function idealEdgeLength(edge) { + return 32; + }, + // Divisor to compute edge forces + edgeElasticity: function edgeElasticity(edge) { + return 32; + }, + // Nesting factor (multiplier) to compute ideal edge length for nested edges + nestingFactor: 1.2, + // Gravity force (constant) + gravity: 1, + // Maximum number of iterations to perform + numIter: 1000, + // Initial temperature (maximum node displacement) + initialTemp: 1000, + // Cooling factor (how the temperature is reduced between consecutive iterations + coolingFactor: 0.99, + // Lower temperature threshold (below this point the layout will end) + minTemp: 1.0 }; -/* - * Marks all edges in the graph with a type-1 conflict with the "type1Conflict" - * property. A type-1 conflict is one where a non-inner segment crosses an - * inner segment. An inner segment is an edge with both incident nodes marked - * with the "dummy" property. - * - * This algorithm scans layer by layer, starting with the second, for type-1 - * conflicts between the current layer and the previous layer. For each layer - * it scans the nodes from left to right until it reaches one that is incident - * on an inner segment. It then scans predecessors to determine if they have - * edges that cross that inner segment. At the end a final scan is done for all - * nodes on the current rank to see if they cross the last visited inner - * segment. - * - * This algorithm (safely) assumes that a dummy node will only be incident on a - * single node in the layers being scanned. +/** + * @brief : constructor + * @arg options : object containing layout options */ -function findType1Conflicts(g, layering) { - var conflicts = {}; - - function visitLayer(prevLayer, layer) { - var - // last visited node in the previous layer that is incident on an inner - // segment. - k0 = 0, - // Tracks the last node in this layer scanned for crossings with a type-1 - // segment. - scanPos = 0, - prevLayerLength = prevLayer.length, - lastNode = _.last(layer); +function CoseLayout(options) { + this.options = extend({}, defaults$4, options); + this.options.layout = this; - _.forEach(layer, function(v, i) { - var w = findOtherInnerSegmentNode(g, v), - k1 = w ? g.node(w).order : prevLayerLength; + // Exclude any edge that has a source or target node that is not in the set of passed-in nodes + var nodes = this.options.eles.nodes(); + var edges = this.options.eles.edges(); + var notEdges = edges.filter(function (e) { + var sourceId = e.source().data('id'); + var targetId = e.target().data('id'); + var hasSource = nodes.some(function (n) { + return n.data('id') === sourceId; + }); + var hasTarget = nodes.some(function (n) { + return n.data('id') === targetId; + }); + return !hasSource || !hasTarget; + }); + this.options.eles = this.options.eles.not(notEdges); +} - if (w || v === lastNode) { - _.forEach(layer.slice(scanPos, i +1), function(scanNode) { - _.forEach(g.predecessors(scanNode), function(u) { - var uLabel = g.node(u), - uPos = uLabel.order; - if ((uPos < k0 || k1 < uPos) && - !(uLabel.dummy && g.node(scanNode).dummy)) { - addConflict(conflicts, u, scanNode); - } - }); - }); - scanPos = i + 1; - k0 = k1; - } +/** + * @brief : runs the layout + */ +CoseLayout.prototype.run = function () { + var options = this.options; + var cy = options.cy; + var layout = this; + layout.stopped = false; + if (options.animate === true || options.animate === false) { + layout.emit({ + type: 'layoutstart', + layout: layout }); + } - return layer; + // Set DEBUG - Global variable + if (true === options.debug) { + DEBUG = true; + } else { + DEBUG = false; } - _.reduce(layering, visitLayer); - return conflicts; -} + // Initialize layout info + var layoutInfo = createLayoutInfo(cy, layout, options); -function findType2Conflicts(g, layering) { - var conflicts = {}; + // Show LayoutInfo contents if debugging + if (DEBUG) { + printLayoutInfo(layoutInfo); + } - function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) { - var v; - _.forEach(_.range(southPos, southEnd), function(i) { - v = south[i]; - if (g.node(v).dummy) { - _.forEach(g.predecessors(v), function(u) { - var uNode = g.node(u); - if (uNode.dummy && - (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) { - addConflict(conflicts, u, v); - } - }); - } - }); + // If required, randomize node positions + if (options.randomize) { + randomizePositions(layoutInfo); } + var startTime = performanceNow(); + var refresh = function refresh() { + refreshPositions(layoutInfo, cy, options); + + // Fit the graph if necessary + if (true === options.fit) { + cy.fit(options.padding); + } + }; + var mainLoop = function mainLoop(i) { + if (layout.stopped || i >= options.numIter) { + // logDebug("Layout manually stopped. Stopping computation in step " + i); + return false; + } + // Do one step in the phisical simulation + step(layoutInfo, options); - function visitLayer(north, south) { - var prevNorthPos = -1, - nextNorthPos, - southPos = 0; + // Update temperature + layoutInfo.temperature = layoutInfo.temperature * options.coolingFactor; + // logDebug("New temperature: " + layoutInfo.temperature); - _.forEach(south, function(v, southLookahead) { - if (g.node(v).dummy === "border") { - var predecessors = g.predecessors(v); - if (predecessors.length) { - nextNorthPos = g.node(predecessors[0]).order; - scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos); - southPos = southLookahead; - prevNorthPos = nextNorthPos; + if (layoutInfo.temperature < options.minTemp) { + // logDebug("Temperature drop below minimum threshold. Stopping computation in step " + i); + return false; + } + return true; + }; + var done = function done() { + if (options.animate === true || options.animate === false) { + refresh(); + + // Layout has finished + layout.one('layoutstop', options.stop); + layout.emit({ + type: 'layoutstop', + layout: layout + }); + } else { + var nodes = options.eles.nodes(); + var getScaledPos = getScaleInBoundsFn(layoutInfo, options, nodes); + nodes.layoutPositions(layout, options, getScaledPos); + } + }; + var i = 0; + var loopRet = true; + if (options.animate === true) { + var frame = function frame() { + var f = 0; + while (loopRet && f < options.refresh) { + loopRet = mainLoop(i); + i++; + f++; + } + if (!loopRet) { + // it's done + separateComponents(layoutInfo, options); + done(); + } else { + var now = performanceNow(); + if (now - startTime >= options.animationThreshold) { + refresh(); } + requestAnimationFrame(frame); } - scan(south, southPos, south.length, nextNorthPos, north.length); - }); - - return south; + }; + frame(); + } else { + while (loopRet) { + loopRet = mainLoop(i); + i++; + } + separateComponents(layoutInfo, options); + done(); } + return this; // chaining +}; - _.reduce(layering, visitLayer); - return conflicts; -} +/** + * @brief : called on continuous layouts to stop them before they finish + */ +CoseLayout.prototype.stop = function () { + this.stopped = true; + if (this.thread) { + this.thread.stop(); + } + this.emit('layoutstop'); + return this; // chaining +}; -function findOtherInnerSegmentNode(g, v) { - if (g.node(v).dummy) { - return _.find(g.predecessors(v), function(u) { - return g.node(u).dummy; - }); +CoseLayout.prototype.destroy = function () { + if (this.thread) { + this.thread.stop(); } -} + return this; // chaining +}; -function addConflict(conflicts, v, w) { - if (v > w) { - var tmp = v; - v = w; - w = tmp; +/** + * @brief : Creates an object which is contains all the data + * used in the layout process + * @arg cy : cytoscape.js object + * @return : layoutInfo object initialized + */ +var createLayoutInfo = function createLayoutInfo(cy, layout, options) { + // Shortcut + var edges = options.eles.edges(); + var nodes = options.eles.nodes(); + var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { + x1: 0, + y1: 0, + w: cy.width(), + h: cy.height() + }); + var layoutInfo = { + isCompound: cy.hasCompoundNodes(), + layoutNodes: [], + idToIndex: {}, + nodeSize: nodes.size(), + graphSet: [], + indexToGraph: [], + layoutEdges: [], + edgeSize: edges.size(), + temperature: options.initialTemp, + clientWidth: bb.w, + clientHeight: bb.h, + boundingBox: bb + }; + var components = options.eles.components(); + var id2cmptId = {}; + for (var i = 0; i < components.length; i++) { + var component = components[i]; + for (var j = 0; j < component.length; j++) { + var node = component[j]; + id2cmptId[node.id()] = i; + } } - var conflictsV = conflicts[v]; - if (!conflictsV) { - conflicts[v] = conflictsV = {}; - } - conflictsV[w] = true; -} + // Iterate over all nodes, creating layout nodes + for (var i = 0; i < layoutInfo.nodeSize; i++) { + var n = nodes[i]; + var nbb = n.layoutDimensions(options); + var tempNode = {}; + tempNode.isLocked = n.locked(); + tempNode.id = n.data('id'); + tempNode.parentId = n.data('parent'); + tempNode.cmptId = id2cmptId[n.id()]; + tempNode.children = []; + tempNode.positionX = n.position('x'); + tempNode.positionY = n.position('y'); + tempNode.offsetX = 0; + tempNode.offsetY = 0; + tempNode.height = nbb.w; + tempNode.width = nbb.h; + tempNode.maxX = tempNode.positionX + tempNode.width / 2; + tempNode.minX = tempNode.positionX - tempNode.width / 2; + tempNode.maxY = tempNode.positionY + tempNode.height / 2; + tempNode.minY = tempNode.positionY - tempNode.height / 2; + tempNode.padLeft = parseFloat(n.style('padding')); + tempNode.padRight = parseFloat(n.style('padding')); + tempNode.padTop = parseFloat(n.style('padding')); + tempNode.padBottom = parseFloat(n.style('padding')); + + // forces + tempNode.nodeRepulsion = fn$6(options.nodeRepulsion) ? options.nodeRepulsion(n) : options.nodeRepulsion; -function hasConflict(conflicts, v, w) { - if (v > w) { - var tmp = v; - v = w; - w = tmp; + // Add new node + layoutInfo.layoutNodes.push(tempNode); + // Add entry to id-index map + layoutInfo.idToIndex[tempNode.id] = i; } - return _.has(conflicts[v], w); -} - -/* - * Try to align nodes into vertical "blocks" where possible. This algorithm - * attempts to align a node with one of its median neighbors. If the edge - * connecting a neighbor is a type-1 conflict then we ignore that possibility. - * If a previous node has already formed a block with a node after the node - * we're trying to form a block with, we also ignore that possibility - our - * blocks would be split in that scenario. - */ -function verticalAlignment(g, layering, conflicts, neighborFn) { - var root = {}, - align = {}, - pos = {}; - // We cache the position here based on the layering because the graph and - // layering may be out of sync. The layering matrix is manipulated to - // generate different extreme alignments. - _.forEach(layering, function(layer) { - _.forEach(layer, function(v, order) { - root[v] = v; - align[v] = v; - pos[v] = order; - }); - }); + // Inline implementation of a queue, used for traversing the graph in BFS order + var queue = []; + var start = 0; // Points to the start the queue + var end = -1; // Points to the end of the queue - _.forEach(layering, function(layer) { - var prevIdx = -1; - _.forEach(layer, function(v) { - var ws = neighborFn(v); - if (ws.length) { - ws = _.sortBy(ws, function(w) { return pos[w]; }); - var mp = (ws.length - 1) / 2; - for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) { - var w = ws[i]; - if (align[v] === v && - prevIdx < pos[w] && - !hasConflict(conflicts, v, w)) { - align[w] = v; - align[v] = root[v] = root[w]; - prevIdx = pos[w]; - } - } - } - }); - }); + var tempGraph = []; - return { root: root, align: align }; -} + // Second pass to add child information and + // initialize queue for hierarchical traversal + for (var i = 0; i < layoutInfo.nodeSize; i++) { + var n = layoutInfo.layoutNodes[i]; + var p_id = n.parentId; + // Check if node n has a parent node + if (null != p_id) { + // Add node Id to parent's list of children + layoutInfo.layoutNodes[layoutInfo.idToIndex[p_id]].children.push(n.id); + } else { + // If a node doesn't have a parent, then it's in the root graph + queue[++end] = n.id; + tempGraph.push(n.id); + } + } -function horizontalCompaction(g, layering, root, align, reverseSep) { - // This portion of the algorithm differs from BK due to a number of problems. - // Instead of their algorithm we construct a new block graph and do two - // sweeps. The first sweep places blocks with the smallest possible - // coordinates. The second sweep removes unused space by moving blocks to the - // greatest coordinates without violating separation. - var xs = {}, - blockG = buildBlockGraph(g, layering, root, reverseSep), - borderType = reverseSep ? "borderLeft" : "borderRight"; + // Add root graph to graphSet + layoutInfo.graphSet.push(tempGraph); - function iterate(setXsFunc, nextNodesFunc) { - var stack = blockG.nodes(); - var elem = stack.pop(); - var visited = {}; - while (elem) { - if (visited[elem]) { - setXsFunc(elem); - } else { - visited[elem] = true; - stack.push(elem); - stack = stack.concat(nextNodesFunc(elem)); + // Traverse the graph, level by level, + while (start <= end) { + // Get the node to visit and remove it from queue + var node_id = queue[start++]; + var node_ix = layoutInfo.idToIndex[node_id]; + var node = layoutInfo.layoutNodes[node_ix]; + var children = node.children; + if (children.length > 0) { + // Add children nodes as a new graph to graph set + layoutInfo.graphSet.push(children); + // Add children to que queue to be visited + for (var i = 0; i < children.length; i++) { + queue[++end] = children[i]; } - - elem = stack.pop(); } } - // First pass, assign smallest coordinates - function pass1(elem) { - xs[elem] = blockG.inEdges(elem).reduce(function(acc, e) { - return Math.max(acc, xs[e.v] + blockG.edge(e)); - }, 0); - } - - // Second pass, assign greatest coordinates - function pass2(elem) { - var min = blockG.outEdges(elem).reduce(function(acc, e) { - return Math.min(acc, xs[e.w] - blockG.edge(e)); - }, Number.POSITIVE_INFINITY); - - var node = g.node(elem); - if (min !== Number.POSITIVE_INFINITY && node.borderType !== borderType) { - xs[elem] = Math.max(xs[elem], min); + // Create indexToGraph map + for (var i = 0; i < layoutInfo.graphSet.length; i++) { + var graph = layoutInfo.graphSet[i]; + for (var j = 0; j < graph.length; j++) { + var index = layoutInfo.idToIndex[graph[j]]; + layoutInfo.indexToGraph[index] = i; } } - iterate(pass1, blockG.predecessors.bind(blockG)); - iterate(pass2, blockG.successors.bind(blockG)); - - // Assign x coordinates to all nodes - _.forEach(align, function(v) { - xs[v] = xs[root[v]]; - }); + // Iterate over all edges, creating Layout Edges + for (var i = 0; i < layoutInfo.edgeSize; i++) { + var e = edges[i]; + var tempEdge = {}; + tempEdge.id = e.data('id'); + tempEdge.sourceId = e.data('source'); + tempEdge.targetId = e.data('target'); - return xs; -} + // Compute ideal length + var idealLength = fn$6(options.idealEdgeLength) ? options.idealEdgeLength(e) : options.idealEdgeLength; + var elasticity = fn$6(options.edgeElasticity) ? options.edgeElasticity(e) : options.edgeElasticity; + // Check if it's an inter graph edge + var sourceIx = layoutInfo.idToIndex[tempEdge.sourceId]; + var targetIx = layoutInfo.idToIndex[tempEdge.targetId]; + var sourceGraph = layoutInfo.indexToGraph[sourceIx]; + var targetGraph = layoutInfo.indexToGraph[targetIx]; + if (sourceGraph != targetGraph) { + // Find lowest common graph ancestor + var lca = findLCA(tempEdge.sourceId, tempEdge.targetId, layoutInfo); -function buildBlockGraph(g, layering, root, reverseSep) { - var blockGraph = new Graph(), - graphLabel = g.graph(), - sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep); + // Compute sum of node depths, relative to lca graph + var lcaGraph = layoutInfo.graphSet[lca]; + var depth = 0; - _.forEach(layering, function(layer) { - var u; - _.forEach(layer, function(v) { - var vRoot = root[v]; - blockGraph.setNode(vRoot); - if (u) { - var uRoot = root[u], - prevMax = blockGraph.edge(uRoot, vRoot); - blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0)); + // Source depth + var tempNode = layoutInfo.layoutNodes[sourceIx]; + while (-1 === lcaGraph.indexOf(tempNode.id)) { + tempNode = layoutInfo.layoutNodes[layoutInfo.idToIndex[tempNode.parentId]]; + depth++; } - u = v; - }); - }); - - return blockGraph; -} -/* - * Returns the alignment that has the smallest width of the given alignments. - */ -function findSmallestWidthAlignment(g, xss) { - return _.minBy(_.values(xss), function (xs) { - var max = Number.NEGATIVE_INFINITY; - var min = Number.POSITIVE_INFINITY; + // Target depth + tempNode = layoutInfo.layoutNodes[targetIx]; + while (-1 === lcaGraph.indexOf(tempNode.id)) { + tempNode = layoutInfo.layoutNodes[layoutInfo.idToIndex[tempNode.parentId]]; + depth++; + } - _.forIn(xs, function (x, v) { - var halfWidth = width(g, v) / 2; + // logDebug('LCA of nodes ' + tempEdge.sourceId + ' and ' + tempEdge.targetId + + // ". Index: " + lca + " Contents: " + lcaGraph.toString() + + // ". Depth: " + depth); - max = Math.max(x + halfWidth, max); - min = Math.min(x - halfWidth, min); - }); + // Update idealLength + idealLength *= depth * options.nestingFactor; + } + tempEdge.idealLength = idealLength; + tempEdge.elasticity = elasticity; + layoutInfo.layoutEdges.push(tempEdge); + } - return max - min; - }); -} + // Finally, return layoutInfo object + return layoutInfo; +}; -/* - * Align the coordinates of each of the layout alignments such that - * left-biased alignments have their minimum coordinate at the same point as - * the minimum coordinate of the smallest width alignment and right-biased - * alignments have their maximum coordinate at the same point as the maximum - * coordinate of the smallest width alignment. +/** + * @brief : This function finds the index of the lowest common + * graph ancestor between 2 nodes in the subtree + * (from the graph hierarchy induced tree) whose + * root is graphIx + * + * @arg node1: node1's ID + * @arg node2: node2's ID + * @arg layoutInfo: layoutInfo object + * */ -function alignCoordinates(xss, alignTo) { - var alignToVals = _.values(alignTo), - alignToMin = _.min(alignToVals), - alignToMax = _.max(alignToVals); +var findLCA = function findLCA(node1, node2, layoutInfo) { + // Find their common ancester, starting from the root graph + var res = findLCA_aux(node1, node2, 0, layoutInfo); + if (2 > res.count) { + // If aux function couldn't find the common ancester, + // then it is the root graph + return 0; + } else { + return res.graph; + } +}; - _.forEach(["u", "d"], function(vert) { - _.forEach(["l", "r"], function(horiz) { - var alignment = vert + horiz, - xs = xss[alignment], - delta; - if (xs === alignTo) return; +/** + * @brief : Auxiliary function used for LCA computation + * + * @arg node1 : node1's ID + * @arg node2 : node2's ID + * @arg graphIx : subgraph index + * @arg layoutInfo : layoutInfo object + * + * @return : object of the form {count: X, graph: Y}, where: + * X is the number of ancestors (max: 2) found in + * graphIx (and it's subgraphs), + * Y is the graph index of the lowest graph containing + * all X nodes + */ +var findLCA_aux = function findLCA_aux(node1, node2, graphIx, layoutInfo) { + var graph = layoutInfo.graphSet[graphIx]; + // If both nodes belongs to graphIx + if (-1 < graph.indexOf(node1) && -1 < graph.indexOf(node2)) { + return { + count: 2, + graph: graphIx + }; + } - var xsVals = _.values(xs); - delta = horiz === "l" ? alignToMin - _.min(xsVals) : alignToMax - _.max(xsVals); + // Make recursive calls for all subgraphs + var c = 0; + for (var i = 0; i < graph.length; i++) { + var nodeId = graph[i]; + var nodeIx = layoutInfo.idToIndex[nodeId]; + var children = layoutInfo.layoutNodes[nodeIx].children; - if (delta) { - xss[alignment] = _.mapValues(xs, function(x) { return x + delta; }); + // If the node has no child, skip it + if (0 === children.length) { + continue; + } + var childGraphIx = layoutInfo.indexToGraph[layoutInfo.idToIndex[children[0]]]; + var result = findLCA_aux(node1, node2, childGraphIx, layoutInfo); + if (0 === result.count) { + // Neither node1 nor node2 are present in this subgraph + continue; + } else if (1 === result.count) { + // One of (node1, node2) is present in this subgraph + c++; + if (2 === c) { + // We've already found both nodes, no need to keep searching + break; } - }); - }); -} - -function balance(xss, align) { - return _.mapValues(xss.ul, function(ignore, v) { - if (align) { - return xss[align.toLowerCase()][v]; } else { - var xs = _.sortBy(_.map(xss, v)); - return (xs[1] + xs[2]) / 2; + // Both nodes are present in this subgraph + return result; } - }); -} - -function positionX(g) { - var layering = util.buildLayerMatrix(g); - var conflicts = _.merge( - findType1Conflicts(g, layering), - findType2Conflicts(g, layering)); - - var xss = {}; - var adjustedLayering; - _.forEach(["u", "d"], function(vert) { - adjustedLayering = vert === "u" ? layering : _.values(layering).reverse(); - _.forEach(["l", "r"], function(horiz) { - if (horiz === "r") { - adjustedLayering = _.map(adjustedLayering, function(inner) { - return _.values(inner).reverse(); - }); - } - - var neighborFn = (vert === "u" ? g.predecessors : g.successors).bind(g); - var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn); - var xs = horizontalCompaction(g, adjustedLayering, - align.root, align.align, horiz === "r"); - if (horiz === "r") { - xs = _.mapValues(xs, function(x) { return -x; }); - } - xss[vert + horiz] = xs; - }); - }); + } + return { + count: c, + graph: graphIx + }; +}; - var smallestWidth = findSmallestWidthAlignment(g, xss); - alignCoordinates(xss, smallestWidth); - return balance(xss, g.graph().align); -} +/** + * @brief: printsLayoutInfo into js console + * Only used for debbuging + */ +var printLayoutInfo; -function sep(nodeSep, edgeSep, reverseSep) { - return function(g, v, w) { - var vLabel = g.node(v); - var wLabel = g.node(w); - var sum = 0; - var delta; +/** + * @brief : Randomizes the position of all nodes + */ +var randomizePositions = function randomizePositions(layoutInfo, cy) { + var width = layoutInfo.clientWidth; + var height = layoutInfo.clientHeight; + for (var i = 0; i < layoutInfo.nodeSize; i++) { + var n = layoutInfo.layoutNodes[i]; - sum += vLabel.width / 2; - if (_.has(vLabel, "labelpos")) { - switch (vLabel.labelpos.toLowerCase()) { - case "l": delta = -vLabel.width / 2; break; - case "r": delta = vLabel.width / 2; break; - } + // No need to randomize compound nodes or locked nodes + if (0 === n.children.length && !n.isLocked) { + n.positionX = Math.random() * width; + n.positionY = Math.random() * height; } - if (delta) { - sum += reverseSep ? delta : -delta; + } +}; +var getScaleInBoundsFn = function getScaleInBoundsFn(layoutInfo, options, nodes) { + var bb = layoutInfo.boundingBox; + var coseBB = { + x1: Infinity, + x2: -Infinity, + y1: Infinity, + y2: -Infinity + }; + if (options.boundingBox) { + nodes.forEach(function (node) { + var lnode = layoutInfo.layoutNodes[layoutInfo.idToIndex[node.data('id')]]; + coseBB.x1 = Math.min(coseBB.x1, lnode.positionX); + coseBB.x2 = Math.max(coseBB.x2, lnode.positionX); + coseBB.y1 = Math.min(coseBB.y1, lnode.positionY); + coseBB.y2 = Math.max(coseBB.y2, lnode.positionY); + }); + coseBB.w = coseBB.x2 - coseBB.x1; + coseBB.h = coseBB.y2 - coseBB.y1; + } + return function (ele, i) { + var lnode = layoutInfo.layoutNodes[layoutInfo.idToIndex[ele.data('id')]]; + if (options.boundingBox) { + // then add extra bounding box constraint + var pctX = (lnode.positionX - coseBB.x1) / coseBB.w; + var pctY = (lnode.positionY - coseBB.y1) / coseBB.h; + return { + x: bb.x1 + pctX * bb.w, + y: bb.y1 + pctY * bb.h + }; + } else { + return { + x: lnode.positionX, + y: lnode.positionY + }; } - delta = 0; - - sum += (vLabel.dummy ? edgeSep : nodeSep) / 2; - sum += (wLabel.dummy ? edgeSep : nodeSep) / 2; + }; +}; - sum += wLabel.width / 2; - if (_.has(wLabel, "labelpos")) { - switch (wLabel.labelpos.toLowerCase()) { - case "l": delta = wLabel.width / 2; break; - case "r": delta = -wLabel.width / 2; break; - } - } - if (delta) { - sum += reverseSep ? delta : -delta; - } - delta = 0; +/** + * @brief : Updates the positions of nodes in the network + * @arg layoutInfo : LayoutInfo object + * @arg cy : Cytoscape object + * @arg options : Layout options + */ +var refreshPositions = function refreshPositions(layoutInfo, cy, options) { + // var s = 'Refreshing positions'; + // logDebug(s); - return sum; - }; -} + var layout = options.layout; + var nodes = options.eles.nodes(); + var getScaledPos = getScaleInBoundsFn(layoutInfo, options, nodes); + nodes.positions(getScaledPos); -function width(g, v) { - return g.node(v).width; -} + // Trigger layoutReady only on first call + if (true !== layoutInfo.ready) { + // s = 'Triggering layoutready'; + // logDebug(s); + layoutInfo.ready = true; + layout.one('layoutready', options.ready); + layout.emit({ + type: 'layoutready', + layout: this + }); + } +}; +/** + * @brief : Logs a debug message in JS console, if DEBUG is ON + */ +// var logDebug = function(text) { +// if (DEBUG) { +// console.debug(text); +// } +// }; -/***/ }), +/** + * @brief : Performs one iteration of the physical simulation + * @arg layoutInfo : LayoutInfo object already initialized + * @arg cy : Cytoscape object + * @arg options : Layout options + */ +var step = function step(layoutInfo, options, _step) { + // var s = "\n\n###############################"; + // s += "\nSTEP: " + step; + // s += "\n###############################\n"; + // logDebug(s); -/***/ "./node_modules/dagre/lib/position/index.js": -/*!**************************************************!*\ - !*** ./node_modules/dagre/lib/position/index.js ***! - \**************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // Calculate node repulsions + calculateNodeForces(layoutInfo, options); + // Calculate edge forces + calculateEdgeForces(layoutInfo); + // Calculate gravity forces + calculateGravityForces(layoutInfo, options); + // Propagate forces from parent to child + propagateForces(layoutInfo); + // Update positions based on calculated forces + updatePositions(layoutInfo); +}; -"use strict"; +/** + * @brief : Computes the node repulsion forces + */ +var calculateNodeForces = function calculateNodeForces(layoutInfo, options) { + // Go through each of the graphs in graphSet + // Nodes only repel each other if they belong to the same graph + // var s = 'calculateNodeForces'; + // logDebug(s); + for (var i = 0; i < layoutInfo.graphSet.length; i++) { + var graph = layoutInfo.graphSet[i]; + var numNodes = graph.length; + // s = "Set: " + graph.toString(); + // logDebug(s); -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); -var util = __webpack_require__(/*! ../util */ "./node_modules/dagre/lib/util.js"); -var positionX = (__webpack_require__(/*! ./bk */ "./node_modules/dagre/lib/position/bk.js").positionX); + // Now get all the pairs of nodes + // Only get each pair once, (A, B) = (B, A) + for (var j = 0; j < numNodes; j++) { + var node1 = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[j]]]; + for (var k = j + 1; k < numNodes; k++) { + var node2 = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[k]]]; + nodeRepulsion(node1, node2, layoutInfo, options); + } + } + } +}; +var randomDistance = function randomDistance(max) { + return -max + 2 * max * Math.random(); +}; -module.exports = position; +/** + * @brief : Compute the node repulsion forces between a pair of nodes + */ +var nodeRepulsion = function nodeRepulsion(node1, node2, layoutInfo, options) { + // var s = "Node repulsion. Node1: " + node1.id + " Node2: " + node2.id; -function position(g) { - g = util.asNonCompoundGraph(g); + var cmptId1 = node1.cmptId; + var cmptId2 = node2.cmptId; + if (cmptId1 !== cmptId2 && !layoutInfo.isCompound) { + return; + } - positionY(g); - _.forEach(positionX(g), function(x, v) { - g.node(v).x = x; - }); -} + // Get direction of line connecting both node centers + var directionX = node2.positionX - node1.positionX; + var directionY = node2.positionY - node1.positionY; + var maxRandDist = 1; + // s += "\ndirectionX: " + directionX + ", directionY: " + directionY; -function positionY(g) { - var layering = util.buildLayerMatrix(g); - var rankSep = g.graph().ranksep; - var prevY = 0; - _.forEach(layering, function(layer) { - var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; })); - _.forEach(layer, function(v) { - g.node(v).y = prevY + maxHeight / 2; - }); - prevY += maxHeight + rankSep; - }); -} + // If both centers are the same, apply a random force + if (0 === directionX && 0 === directionY) { + directionX = randomDistance(maxRandDist); + directionY = randomDistance(maxRandDist); + } + var overlap = nodesOverlap(node1, node2, directionX, directionY); + if (overlap > 0) { + // s += "\nNodes DO overlap."; + // s += "\nOverlap: " + overlap; + // If nodes overlap, repulsion force is proportional + // to the overlap + var force = options.nodeOverlap * overlap; + // Compute the module and components of the force vector + var distance = Math.sqrt(directionX * directionX + directionY * directionY); + // s += "\nDistance: " + distance; + var forceX = force * directionX / distance; + var forceY = force * directionY / distance; + } else { + // s += "\nNodes do NOT overlap."; + // If there's no overlap, force is inversely proportional + // to squared distance + // Get clipping points for both nodes + var point1 = findClippingPoint(node1, directionX, directionY); + var point2 = findClippingPoint(node2, -1 * directionX, -1 * directionY); -/***/ }), + // Use clipping points to compute distance + var distanceX = point2.x - point1.x; + var distanceY = point2.y - point1.y; + var distanceSqr = distanceX * distanceX + distanceY * distanceY; + var distance = Math.sqrt(distanceSqr); + // s += "\nDistance: " + distance; -/***/ "./node_modules/dagre/lib/rank/feasible-tree.js": -/*!******************************************************!*\ - !*** ./node_modules/dagre/lib/rank/feasible-tree.js ***! - \******************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // Compute the module and components of the force vector + var force = (node1.nodeRepulsion + node2.nodeRepulsion) / distanceSqr; + var forceX = force * distanceX / distance; + var forceY = force * distanceY / distance; + } -"use strict"; + // Apply force + if (!node1.isLocked) { + node1.offsetX -= forceX; + node1.offsetY -= forceY; + } + if (!node2.isLocked) { + node2.offsetX += forceX; + node2.offsetY += forceY; + } + // s += "\nForceX: " + forceX + " ForceY: " + forceY; + // logDebug(s); -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); -var Graph = (__webpack_require__(/*! ../graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph); -var slack = (__webpack_require__(/*! ./util */ "./node_modules/dagre/lib/rank/util.js").slack); + return; +}; -module.exports = feasibleTree; +/** + * @brief : Determines whether two nodes overlap or not + * @return : Amount of overlapping (0 => no overlap) + */ +var nodesOverlap = function nodesOverlap(node1, node2, dX, dY) { + if (dX > 0) { + var overlapX = node1.maxX - node2.minX; + } else { + var overlapX = node2.maxX - node1.minX; + } + if (dY > 0) { + var overlapY = node1.maxY - node2.minY; + } else { + var overlapY = node2.maxY - node1.minY; + } + if (overlapX >= 0 && overlapY >= 0) { + return Math.sqrt(overlapX * overlapX + overlapY * overlapY); + } else { + return 0; + } +}; -/* - * Constructs a spanning tree with tight edges and adjusted the input node's - * ranks to achieve this. A tight edge is one that is has a length that matches - * its "minlen" attribute. - * - * The basic structure for this function is derived from Gansner, et al., "A - * Technique for Drawing Directed Graphs." - * - * Pre-conditions: - * - * 1. Graph must be a DAG. - * 2. Graph must be connected. - * 3. Graph must have at least one node. - * 5. Graph nodes must have been previously assigned a "rank" property that - * respects the "minlen" property of incident edges. - * 6. Graph edges must have a "minlen" property. - * - * Post-conditions: - * - * - Graph nodes will have their rank adjusted to ensure that all edges are - * tight. - * - * Returns a tree (undirected graph) that is constructed using only "tight" - * edges. +/** + * @brief : Finds the point in which an edge (direction dX, dY) intersects + * the rectangular bounding box of it's source/target node */ -function feasibleTree(g) { - var t = new Graph({ directed: false }); +var findClippingPoint = function findClippingPoint(node, dX, dY) { + // Shorcuts + var X = node.positionX; + var Y = node.positionY; + var H = node.height || 1; + var W = node.width || 1; + var dirSlope = dY / dX; + var nodeSlope = H / W; - // Choose arbitrary node from which to start our tree - var start = g.nodes()[0]; - var size = g.nodeCount(); - t.setNode(start, {}); + // var s = 'Computing clipping point of node ' + node.id + + // " . Height: " + H + ", Width: " + W + + // "\nDirection " + dX + ", " + dY; + // + // Compute intersection + var res = {}; - var edge, delta; - while (tightTree(t, g) < size) { - edge = findMinSlackEdge(t, g); - delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge); - shiftRanks(t, g, delta); + // Case: Vertical direction (up) + if (0 === dX && 0 < dY) { + res.x = X; + // s += "\nUp direction"; + res.y = Y + H / 2; + return res; } - return t; -} + // Case: Vertical direction (down) + if (0 === dX && 0 > dY) { + res.x = X; + res.y = Y + H / 2; + // s += "\nDown direction"; -/* - * Finds a maximal tree of tight edges and returns the number of nodes in the - * tree. - */ -function tightTree(t, g) { - function dfs(v) { - _.forEach(g.nodeEdges(v), function(e) { - var edgeV = e.v, - w = (v === edgeV) ? e.w : edgeV; - if (!t.hasNode(w) && !slack(g, e)) { - t.setNode(w, {}); - t.setEdge(v, w, {}); - dfs(w); - } - }); + return res; } - _.forEach(t.nodes(), dfs); - return t.nodeCount(); -} - -/* - * Finds the edge with the smallest slack that is incident on tree and returns - * it. - */ -function findMinSlackEdge(t, g) { - return _.minBy(g.edges(), function(e) { - if (t.hasNode(e.v) !== t.hasNode(e.w)) { - return slack(g, e); - } - }); -} + // Case: Intersects the right border + if (0 < dX && -1 * nodeSlope <= dirSlope && dirSlope <= nodeSlope) { + res.x = X + W / 2; + res.y = Y + W * dY / 2 / dX; + // s += "\nRightborder"; -function shiftRanks(t, g, delta) { - _.forEach(t.nodes(), function(v) { - g.node(v).rank += delta; - }); -} + return res; + } + // Case: Intersects the left border + if (0 > dX && -1 * nodeSlope <= dirSlope && dirSlope <= nodeSlope) { + res.x = X - W / 2; + res.y = Y - W * dY / 2 / dX; + // s += "\nLeftborder"; -/***/ }), + return res; + } -/***/ "./node_modules/dagre/lib/rank/index.js": -/*!**********************************************!*\ - !*** ./node_modules/dagre/lib/rank/index.js ***! - \**********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // Case: Intersects the top border + if (0 < dY && (dirSlope <= -1 * nodeSlope || dirSlope >= nodeSlope)) { + res.x = X + H * dX / 2 / dY; + res.y = Y + H / 2; + // s += "\nTop border"; -"use strict"; + return res; + } + // Case: Intersects the bottom border + if (0 > dY && (dirSlope <= -1 * nodeSlope || dirSlope >= nodeSlope)) { + res.x = X - H * dX / 2 / dY; + res.y = Y - H / 2; + // s += "\nBottom border"; -var rankUtil = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/rank/util.js"); -var longestPath = rankUtil.longestPath; -var feasibleTree = __webpack_require__(/*! ./feasible-tree */ "./node_modules/dagre/lib/rank/feasible-tree.js"); -var networkSimplex = __webpack_require__(/*! ./network-simplex */ "./node_modules/dagre/lib/rank/network-simplex.js"); + return res; + } -module.exports = rank; + // s += "\nClipping point found at " + res.x + ", " + res.y; + // logDebug(s); + return res; +}; -/* - * Assigns a rank to each node in the input graph that respects the "minlen" - * constraint specified on edges between nodes. - * - * This basic structure is derived from Gansner, et al., "A Technique for - * Drawing Directed Graphs." - * - * Pre-conditions: - * - * 1. Graph must be a connected DAG - * 2. Graph nodes must be objects - * 3. Graph edges must have "weight" and "minlen" attributes - * - * Post-conditions: - * - * 1. Graph nodes will have a "rank" attribute based on the results of the - * algorithm. Ranks can start at any index (including negative), we'll - * fix them up later. +/** + * @brief : Calculates all edge forces */ -function rank(g) { - switch(g.graph().ranker) { - case "network-simplex": networkSimplexRanker(g); break; - case "tight-tree": tightTreeRanker(g); break; - case "longest-path": longestPathRanker(g); break; - default: networkSimplexRanker(g); - } -} +var calculateEdgeForces = function calculateEdgeForces(layoutInfo, options) { + // Iterate over all edges + for (var i = 0; i < layoutInfo.edgeSize; i++) { + // Get edge, source & target nodes + var edge = layoutInfo.layoutEdges[i]; + var sourceIx = layoutInfo.idToIndex[edge.sourceId]; + var source = layoutInfo.layoutNodes[sourceIx]; + var targetIx = layoutInfo.idToIndex[edge.targetId]; + var target = layoutInfo.layoutNodes[targetIx]; -// A fast and simple ranker, but results are far from optimal. -var longestPathRanker = longestPath; + // Get direction of line connecting both node centers + var directionX = target.positionX - source.positionX; + var directionY = target.positionY - source.positionY; -function tightTreeRanker(g) { - longestPath(g); - feasibleTree(g); -} + // If both centers are the same, do nothing. + // A random force has already been applied as node repulsion + if (0 === directionX && 0 === directionY) { + continue; + } -function networkSimplexRanker(g) { - networkSimplex(g); -} + // Get clipping points for both nodes + var point1 = findClippingPoint(source, directionX, directionY); + var point2 = findClippingPoint(target, -1 * directionX, -1 * directionY); + var lx = point2.x - point1.x; + var ly = point2.y - point1.y; + var l = Math.sqrt(lx * lx + ly * ly); + var force = Math.pow(edge.idealLength - l, 2) / edge.elasticity; + if (0 !== l) { + var forceX = force * lx / l; + var forceY = force * ly / l; + } else { + var forceX = 0; + var forceY = 0; + } + // Add this force to target and source nodes + if (!source.isLocked) { + source.offsetX += forceX; + source.offsetY += forceY; + } + if (!target.isLocked) { + target.offsetX -= forceX; + target.offsetY -= forceY; + } -/***/ }), + // var s = 'Edge force between nodes ' + source.id + ' and ' + target.id; + // s += "\nDistance: " + l + " Force: (" + forceX + ", " + forceY + ")"; + // logDebug(s); + } +}; -/***/ "./node_modules/dagre/lib/rank/network-simplex.js": -/*!********************************************************!*\ - !*** ./node_modules/dagre/lib/rank/network-simplex.js ***! - \********************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +/** + * @brief : Computes gravity forces for all nodes + */ +var calculateGravityForces = function calculateGravityForces(layoutInfo, options) { + if (options.gravity === 0) { + return; + } + var distThreshold = 1; -"use strict"; + // var s = 'calculateGravityForces'; + // logDebug(s); + for (var i = 0; i < layoutInfo.graphSet.length; i++) { + var graph = layoutInfo.graphSet[i]; + var numNodes = graph.length; + // s = "Set: " + graph.toString(); + // logDebug(s); -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); -var feasibleTree = __webpack_require__(/*! ./feasible-tree */ "./node_modules/dagre/lib/rank/feasible-tree.js"); -var slack = (__webpack_require__(/*! ./util */ "./node_modules/dagre/lib/rank/util.js").slack); -var initRank = (__webpack_require__(/*! ./util */ "./node_modules/dagre/lib/rank/util.js").longestPath); -var preorder = (__webpack_require__(/*! ../graphlib */ "./node_modules/dagre/lib/graphlib.js").alg.preorder); -var postorder = (__webpack_require__(/*! ../graphlib */ "./node_modules/dagre/lib/graphlib.js").alg.postorder); -var simplify = (__webpack_require__(/*! ../util */ "./node_modules/dagre/lib/util.js").simplify); + // Compute graph center + if (0 === i) { + var centerX = layoutInfo.clientHeight / 2; + var centerY = layoutInfo.clientWidth / 2; + } else { + // Get Parent node for this graph, and use its position as center + var temp = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[0]]]; + var parent = layoutInfo.layoutNodes[layoutInfo.idToIndex[temp.parentId]]; + var centerX = parent.positionX; + var centerY = parent.positionY; + } + // s = "Center found at: " + centerX + ", " + centerY; + // logDebug(s); -module.exports = networkSimplex; + // Apply force to all nodes in graph + for (var j = 0; j < numNodes; j++) { + var node = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[j]]]; + // s = "Node: " + node.id; -// Expose some internals for testing purposes -networkSimplex.initLowLimValues = initLowLimValues; -networkSimplex.initCutValues = initCutValues; -networkSimplex.calcCutValue = calcCutValue; -networkSimplex.leaveEdge = leaveEdge; -networkSimplex.enterEdge = enterEdge; -networkSimplex.exchangeEdges = exchangeEdges; + if (node.isLocked) { + continue; + } + var dx = centerX - node.positionX; + var dy = centerY - node.positionY; + var d = Math.sqrt(dx * dx + dy * dy); + if (d > distThreshold) { + var fx = options.gravity * dx / d; + var fy = options.gravity * dy / d; + node.offsetX += fx; + node.offsetY += fy; + // s += ": Applied force: " + fx + ", " + fy; + } + // logDebug(s); + } + } +}; -/* - * The network simplex algorithm assigns ranks to each node in the input graph - * and iteratively improves the ranking to reduce the length of edges. - * - * Preconditions: - * - * 1. The input graph must be a DAG. - * 2. All nodes in the graph must have an object value. - * 3. All edges in the graph must have "minlen" and "weight" attributes. - * - * Postconditions: - * - * 1. All nodes in the graph will have an assigned "rank" attribute that has - * been optimized by the network simplex algorithm. Ranks start at 0. - * - * - * A rough sketch of the algorithm is as follows: - * - * 1. Assign initial ranks to each node. We use the longest path algorithm, - * which assigns ranks to the lowest position possible. In general this - * leads to very wide bottom ranks and unnecessarily long edges. - * 2. Construct a feasible tight tree. A tight tree is one such that all - * edges in the tree have no slack (difference between length of edge - * and minlen for the edge). This by itself greatly improves the assigned - * rankings by shorting edges. - * 3. Iteratively find edges that have negative cut values. Generally a - * negative cut value indicates that the edge could be removed and a new - * tree edge could be added to produce a more compact graph. - * - * Much of the algorithms here are derived from Gansner, et al., "A Technique - * for Drawing Directed Graphs." The structure of the file roughly follows the - * structure of the overall algorithm. +/** + * @brief : This function propagates the existing offsets from + * parent nodes to its descendents. + * @arg layoutInfo : layoutInfo Object + * @arg cy : cytoscape Object + * @arg options : Layout options */ -function networkSimplex(g) { - g = simplify(g); - initRank(g); - var t = feasibleTree(g); - initLowLimValues(t); - initCutValues(t, g); +var propagateForces = function propagateForces(layoutInfo, options) { + // Inline implementation of a queue, used for traversing the graph in BFS order + var queue = []; + var start = 0; // Points to the start the queue + var end = -1; // Points to the end of the queue - var e, f; - while ((e = leaveEdge(t))) { - f = enterEdge(t, g, e); - exchangeEdges(t, g, e, f); - } -} + // logDebug('propagateForces'); -/* - * Initializes cut values for all edges in the tree. - */ -function initCutValues(t, g) { - var vs = postorder(t, t.nodes()); - vs = vs.slice(0, vs.length - 1); - _.forEach(vs, function(v) { - assignCutValue(t, g, v); - }); -} + // Start by visiting the nodes in the root graph + queue.push.apply(queue, layoutInfo.graphSet[0]); + end += layoutInfo.graphSet[0].length; -function assignCutValue(t, g, child) { - var childLab = t.node(child); - var parent = childLab.parent; - t.edge(child, parent).cutvalue = calcCutValue(t, g, child); -} + // Traverse the graph, level by level, + while (start <= end) { + // Get the node to visit and remove it from queue + var nodeId = queue[start++]; + var nodeIndex = layoutInfo.idToIndex[nodeId]; + var node = layoutInfo.layoutNodes[nodeIndex]; + var children = node.children; -/* - * Given the tight tree, its graph, and a child in the graph calculate and - * return the cut value for the edge between the child and its parent. - */ -function calcCutValue(t, g, child) { - var childLab = t.node(child); - var parent = childLab.parent; - // True if the child is on the tail end of the edge in the directed graph - var childIsTail = true; - // The graph's view of the tree edge we're inspecting - var graphEdge = g.edge(child, parent); - // The accumulated cut value for the edge between this node and its parent - var cutValue = 0; + // We only need to process the node if it's compound + if (0 < children.length && !node.isLocked) { + var offX = node.offsetX; + var offY = node.offsetY; - if (!graphEdge) { - childIsTail = false; - graphEdge = g.edge(parent, child); - } + // var s = "Propagating offset from parent node : " + node.id + + // ". OffsetX: " + offX + ". OffsetY: " + offY; + // s += "\n Children: " + children.toString(); + // logDebug(s); - cutValue = graphEdge.weight; + for (var i = 0; i < children.length; i++) { + var childNode = layoutInfo.layoutNodes[layoutInfo.idToIndex[children[i]]]; + // Propagate offset + childNode.offsetX += offX; + childNode.offsetY += offY; + // Add children to queue to be visited + queue[++end] = children[i]; + } - _.forEach(g.nodeEdges(child), function(e) { - var isOutEdge = e.v === child, - other = isOutEdge ? e.w : e.v; + // Reset parent offsets + node.offsetX = 0; + node.offsetY = 0; + } + } +}; - if (other !== parent) { - var pointsToHead = isOutEdge === childIsTail, - otherWeight = g.edge(e).weight; +/** + * @brief : Updates the layout model positions, based on + * the accumulated forces + */ +var updatePositions = function updatePositions(layoutInfo, options) { + // var s = 'Updating positions'; + // logDebug(s); - cutValue += pointsToHead ? otherWeight : -otherWeight; - if (isTreeEdge(t, child, other)) { - var otherCutValue = t.edge(child, other).cutvalue; - cutValue += pointsToHead ? -otherCutValue : otherCutValue; - } + // Reset boundaries for compound nodes + for (var i = 0; i < layoutInfo.nodeSize; i++) { + var n = layoutInfo.layoutNodes[i]; + if (0 < n.children.length) { + // logDebug("Resetting boundaries of compound node: " + n.id); + n.maxX = undefined; + n.minX = undefined; + n.maxY = undefined; + n.minY = undefined; } - }); + } + for (var i = 0; i < layoutInfo.nodeSize; i++) { + var n = layoutInfo.layoutNodes[i]; + if (0 < n.children.length || n.isLocked) { + // No need to set compound or locked node position + // logDebug("Skipping position update of node: " + n.id); + continue; + } + // s = "Node: " + n.id + " Previous position: (" + + // n.positionX + ", " + n.positionY + ")."; - return cutValue; -} + // Limit displacement in order to improve stability + var tempForce = limitForce(n.offsetX, n.offsetY, layoutInfo.temperature); + n.positionX += tempForce.x; + n.positionY += tempForce.y; + n.offsetX = 0; + n.offsetY = 0; + n.minX = n.positionX - n.width; + n.maxX = n.positionX + n.width; + n.minY = n.positionY - n.height; + n.maxY = n.positionY + n.height; + // s += " New Position: (" + n.positionX + ", " + n.positionY + ")."; + // logDebug(s); -function initLowLimValues(tree, root) { - if (arguments.length < 2) { - root = tree.nodes()[0]; + // Update ancestry boudaries + updateAncestryBoundaries(n, layoutInfo); } - dfsAssignLowLim(tree, {}, 1, root); -} - -function dfsAssignLowLim(tree, visited, nextLim, v, parent) { - var low = nextLim; - var label = tree.node(v); - visited[v] = true; - _.forEach(tree.neighbors(v), function(w) { - if (!_.has(visited, w)) { - nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v); + // Update size, position of compund nodes + for (var i = 0; i < layoutInfo.nodeSize; i++) { + var n = layoutInfo.layoutNodes[i]; + if (0 < n.children.length && !n.isLocked) { + n.positionX = (n.maxX + n.minX) / 2; + n.positionY = (n.maxY + n.minY) / 2; + n.width = n.maxX - n.minX; + n.height = n.maxY - n.minY; + // s = "Updating position, size of compound node " + n.id; + // s += "\nPositionX: " + n.positionX + ", PositionY: " + n.positionY; + // s += "\nWidth: " + n.width + ", Height: " + n.height; + // logDebug(s); } - }); + } +}; - label.low = low; - label.lim = nextLim++; - if (parent) { - label.parent = parent; +/** + * @brief : Limits a force (forceX, forceY) to be not + * greater (in modulo) than max. + 8 Preserves force direction. + */ +var limitForce = function limitForce(forceX, forceY, max) { + // var s = "Limiting force: (" + forceX + ", " + forceY + "). Max: " + max; + var force = Math.sqrt(forceX * forceX + forceY * forceY); + if (force > max) { + var res = { + x: max * forceX / force, + y: max * forceY / force + }; } else { - // TODO should be able to remove this when we incrementally update low lim - delete label.parent; + var res = { + x: forceX, + y: forceY + }; } - return nextLim; -} - -function leaveEdge(tree) { - return _.find(tree.edges(), function(e) { - return tree.edge(e).cutvalue < 0; - }); -} + // s += ".\nResult: (" + res.x + ", " + res.y + ")"; + // logDebug(s); -function enterEdge(t, g, edge) { - var v = edge.v; - var w = edge.w; + return res; +}; - // For the rest of this function we assume that v is the tail and w is the - // head, so if we don't have this edge in the graph we should flip it to - // match the correct orientation. - if (!g.hasEdge(v, w)) { - v = edge.w; - w = edge.v; +/** + * @brief : Function used for keeping track of compound node + * sizes, since they should bound all their subnodes. + */ +var updateAncestryBoundaries = function updateAncestryBoundaries(node, layoutInfo) { + // var s = "Propagating new position/size of node " + node.id; + var parentId = node.parentId; + if (null == parentId) { + // If there's no parent, we are done + // s += ". No parent node."; + // logDebug(s); + return; } - var vLabel = t.node(v); - var wLabel = t.node(w); - var tailLabel = vLabel; - var flip = false; + // Get Parent Node + var p = layoutInfo.layoutNodes[layoutInfo.idToIndex[parentId]]; + var flag = false; - // If the root is in the tail of the edge then we need to flip the logic that - // checks for the head and tail nodes in the candidates function below. - if (vLabel.lim > wLabel.lim) { - tailLabel = wLabel; - flip = true; + // MaxX + if (null == p.maxX || node.maxX + p.padRight > p.maxX) { + p.maxX = node.maxX + p.padRight; + flag = true; + // s += "\nNew maxX for parent node " + p.id + ": " + p.maxX; } - var candidates = _.filter(g.edges(), function(edge) { - return flip === isDescendant(t, t.node(edge.v), tailLabel) && - flip !== isDescendant(t, t.node(edge.w), tailLabel); - }); + // MinX + if (null == p.minX || node.minX - p.padLeft < p.minX) { + p.minX = node.minX - p.padLeft; + flag = true; + // s += "\nNew minX for parent node " + p.id + ": " + p.minX; + } - return _.minBy(candidates, function(edge) { return slack(g, edge); }); -} + // MaxY + if (null == p.maxY || node.maxY + p.padBottom > p.maxY) { + p.maxY = node.maxY + p.padBottom; + flag = true; + // s += "\nNew maxY for parent node " + p.id + ": " + p.maxY; + } -function exchangeEdges(t, g, e, f) { - var v = e.v; - var w = e.w; - t.removeEdge(v, w); - t.setEdge(f.v, f.w, {}); - initLowLimValues(t); - initCutValues(t, g); - updateRanks(t, g); -} + // MinY + if (null == p.minY || node.minY - p.padTop < p.minY) { + p.minY = node.minY - p.padTop; + flag = true; + // s += "\nNew minY for parent node " + p.id + ": " + p.minY; + } -function updateRanks(t, g) { - var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }); - var vs = preorder(t, root); - vs = vs.slice(1); - _.forEach(vs, function(v) { - var parent = t.node(v).parent, - edge = g.edge(v, parent), - flipped = false; + // If updated boundaries, propagate changes upward + if (flag) { + // logDebug(s); + return updateAncestryBoundaries(p, layoutInfo); + } - if (!edge) { - edge = g.edge(parent, v); - flipped = true; + // s += ". No changes in boundaries/position of parent node " + p.id; + // logDebug(s); + return; +}; +var separateComponents = function separateComponents(layoutInfo, options) { + var nodes = layoutInfo.layoutNodes; + var components = []; + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + var cid = node.cmptId; + var component = components[cid] = components[cid] || []; + component.push(node); + } + var totalA = 0; + for (var i = 0; i < components.length; i++) { + var c = components[i]; + if (!c) { + continue; } - - g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen); + c.x1 = Infinity; + c.x2 = -Infinity; + c.y1 = Infinity; + c.y2 = -Infinity; + for (var j = 0; j < c.length; j++) { + var n = c[j]; + c.x1 = Math.min(c.x1, n.positionX - n.width / 2); + c.x2 = Math.max(c.x2, n.positionX + n.width / 2); + c.y1 = Math.min(c.y1, n.positionY - n.height / 2); + c.y2 = Math.max(c.y2, n.positionY + n.height / 2); + } + c.w = c.x2 - c.x1; + c.h = c.y2 - c.y1; + totalA += c.w * c.h; + } + components.sort(function (c1, c2) { + return c2.w * c2.h - c1.w * c1.h; }); -} + var x = 0; + var y = 0; + var usedW = 0; + var rowH = 0; + var maxRowW = Math.sqrt(totalA) * layoutInfo.clientWidth / layoutInfo.clientHeight; + for (var i = 0; i < components.length; i++) { + var c = components[i]; + if (!c) { + continue; + } + for (var j = 0; j < c.length; j++) { + var n = c[j]; + if (!n.isLocked) { + n.positionX += x - c.x1; + n.positionY += y - c.y1; + } + } + x += c.w + options.componentSpacing; + usedW += c.w + options.componentSpacing; + rowH = Math.max(rowH, c.h); + if (usedW > maxRowW) { + y += rowH + options.componentSpacing; + x = 0; + usedW = 0; + rowH = 0; + } + } +}; -/* - * Returns true if the edge is in the tree. - */ -function isTreeEdge(tree, u, v) { - return tree.hasEdge(u, v); -} +var defaults$3 = { + fit: true, + // whether to fit the viewport to the graph + padding: 30, + // padding used on fit + boundingBox: undefined, + // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } + avoidOverlap: true, + // prevents node overlap, may overflow boundingBox if not enough space + avoidOverlapPadding: 10, + // extra spacing around nodes when avoidOverlap: true + nodeDimensionsIncludeLabels: false, + // Excludes the label when calculating node bounding boxes for the layout algorithm + spacingFactor: undefined, + // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up + condense: false, + // uses all available space on false, uses minimal space on true + rows: undefined, + // force num of rows in the grid + cols: undefined, + // force num of columns in the grid + position: function position(node) {}, + // returns { row, col } for element + sort: undefined, + // a sorting function to order the nodes; e.g. function(a, b){ return a.data('weight') - b.data('weight') } + animate: false, + // whether to transition the node positions + animationDuration: 500, + // duration of animation in ms if enabled + animationEasing: undefined, + // easing of animation if enabled + animateFilter: function animateFilter(node, i) { + return true; + }, + // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts + ready: undefined, + // callback on layoutready + stop: undefined, + // callback on layoutstop + transform: function transform(node, position) { + return position; + } // transform a given node position. Useful for changing flow direction in discrete layouts +}; -/* - * Returns true if the specified node is descendant of the root node per the - * assigned low and lim attributes in the tree. - */ -function isDescendant(tree, vLabel, rootLabel) { - return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim; +function GridLayout(options) { + this.options = extend({}, defaults$3, options); } +GridLayout.prototype.run = function () { + var params = this.options; + var options = params; + var cy = params.cy; + var eles = options.eles; + var nodes = eles.nodes().not(':parent'); + if (options.sort) { + nodes = nodes.sort(options.sort); + } + var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { + x1: 0, + y1: 0, + w: cy.width(), + h: cy.height() + }); + if (bb.h === 0 || bb.w === 0) { + eles.nodes().layoutPositions(this, options, function (ele) { + return { + x: bb.x1, + y: bb.y1 + }; + }); + } else { + // width/height * splits^2 = cells where splits is number of times to split width + var cells = nodes.size(); + var splits = Math.sqrt(cells * bb.h / bb.w); + var rows = Math.round(splits); + var cols = Math.round(bb.w / bb.h * splits); + var small = function small(val) { + if (val == null) { + return Math.min(rows, cols); + } else { + var min = Math.min(rows, cols); + if (min == rows) { + rows = val; + } else { + cols = val; + } + } + }; + var large = function large(val) { + if (val == null) { + return Math.max(rows, cols); + } else { + var max = Math.max(rows, cols); + if (max == rows) { + rows = val; + } else { + cols = val; + } + } + }; + var oRows = options.rows; + var oCols = options.cols != null ? options.cols : options.columns; + // if rows or columns were set in options, use those values + if (oRows != null && oCols != null) { + rows = oRows; + cols = oCols; + } else if (oRows != null && oCols == null) { + rows = oRows; + cols = Math.ceil(cells / rows); + } else if (oRows == null && oCols != null) { + cols = oCols; + rows = Math.ceil(cells / cols); + } -/***/ }), - -/***/ "./node_modules/dagre/lib/rank/util.js": -/*!*********************************************!*\ - !*** ./node_modules/dagre/lib/rank/util.js ***! - \*********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // otherwise use the automatic values and adjust accordingly -"use strict"; + // if rounding was up, see if we can reduce rows or columns + else if (cols * rows > cells) { + var sm = small(); + var lg = large(); + // reducing the small side takes away the most cells, so try it first + if ((sm - 1) * lg >= cells) { + small(sm - 1); + } else if ((lg - 1) * sm >= cells) { + large(lg - 1); + } + } else { + // if rounding was too low, add rows or columns + while (cols * rows < cells) { + var _sm = small(); + var _lg = large(); -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); + // try to add to larger side first (adds less in multiplication) + if ((_lg + 1) * _sm >= cells) { + large(_lg + 1); + } else { + small(_sm + 1); + } + } + } + var cellWidth = bb.w / cols; + var cellHeight = bb.h / rows; + if (options.condense) { + cellWidth = 0; + cellHeight = 0; + } + if (options.avoidOverlap) { + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + var pos = node._private.position; + if (pos.x == null || pos.y == null) { + // for bb + pos.x = 0; + pos.y = 0; + } + var nbb = node.layoutDimensions(options); + var p = options.avoidOverlapPadding; + var w = nbb.w + p; + var h = nbb.h + p; + cellWidth = Math.max(cellWidth, w); + cellHeight = Math.max(cellHeight, h); + } + } + var cellUsed = {}; // e.g. 'c-0-2' => true -module.exports = { - longestPath: longestPath, - slack: slack -}; + var used = function used(row, col) { + return cellUsed['c-' + row + '-' + col] ? true : false; + }; + var use = function use(row, col) { + cellUsed['c-' + row + '-' + col] = true; + }; -/* - * Initializes ranks for the input graph using the longest path algorithm. This - * algorithm scales well and is fast in practice, it yields rather poor - * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom - * ranks wide and leaving edges longer than necessary. However, due to its - * speed, this algorithm is good for getting an initial ranking that can be fed - * into other algorithms. - * - * This algorithm does not normalize layers because it will be used by other - * algorithms in most cases. If using this algorithm directly, be sure to - * run normalize at the end. - * - * Pre-conditions: - * - * 1. Input graph is a DAG. - * 2. Input graph node labels can be assigned properties. - * - * Post-conditions: - * - * 1. Each node will be assign an (unnormalized) "rank" property. - */ -function longestPath(g) { - var visited = {}; + // to keep track of current cell position + var row = 0; + var col = 0; + var moveToNextCell = function moveToNextCell() { + col++; + if (col >= cols) { + col = 0; + row++; + } + }; - function dfs(v) { - var label = g.node(v); - if (_.has(visited, v)) { - return label.rank; + // get a cache of all the manual positions + var id2manPos = {}; + for (var _i = 0; _i < nodes.length; _i++) { + var _node = nodes[_i]; + var rcPos = options.position(_node); + if (rcPos && (rcPos.row !== undefined || rcPos.col !== undefined)) { + // must have at least row or col def'd + var _pos = { + row: rcPos.row, + col: rcPos.col + }; + if (_pos.col === undefined) { + // find unused col + _pos.col = 0; + while (used(_pos.row, _pos.col)) { + _pos.col++; + } + } else if (_pos.row === undefined) { + // find unused row + _pos.row = 0; + while (used(_pos.row, _pos.col)) { + _pos.row++; + } + } + id2manPos[_node.id()] = _pos; + use(_pos.row, _pos.col); + } } - visited[v] = true; - - var rank = _.min(_.map(g.outEdges(v), function(e) { - return dfs(e.w) - g.edge(e).minlen; - })); + var getPos = function getPos(element, i) { + var x, y; + if (element.locked() || element.isParent()) { + return false; + } - if (rank === Number.POSITIVE_INFINITY || // return value of _.map([]) for Lodash 3 - rank === undefined || // return value of _.map([]) for Lodash 4 - rank === null) { // return value of _.map([null]) - rank = 0; - } + // see if we have a manual position set + var rcPos = id2manPos[element.id()]; + if (rcPos) { + x = rcPos.col * cellWidth + cellWidth / 2 + bb.x1; + y = rcPos.row * cellHeight + cellHeight / 2 + bb.y1; + } else { + // otherwise set automatically - return (label.rank = rank); + while (used(row, col)) { + moveToNextCell(); + } + x = col * cellWidth + cellWidth / 2 + bb.x1; + y = row * cellHeight + cellHeight / 2 + bb.y1; + use(row, col); + moveToNextCell(); + } + return { + x: x, + y: y + }; + }; + nodes.layoutPositions(this, options, getPos); } + return this; // chaining +}; - _.forEach(g.sources(), dfs); -} +// default layout options +var defaults$2 = { + ready: function ready() {}, + // on layoutready + stop: function stop() {} // on layoutstop +}; -/* - * Returns the amount of slack for the given edge. The slack is defined as the - * difference between the length of the edge and its minimum length. - */ -function slack(g, e) { - return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen; +// constructor +// options : object containing layout options +function NullLayout(options) { + this.options = extend({}, defaults$2, options); } +// runs the layout +NullLayout.prototype.run = function () { + var options = this.options; + var eles = options.eles; // elements to consider in the layout + var layout = this; -/***/ }), - -/***/ "./node_modules/dagre/lib/util.js": -/*!****************************************!*\ - !*** ./node_modules/dagre/lib/util.js ***! - \****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -"use strict"; -/* eslint "no-console": off */ - + // cy is automatically populated for us in the constructor + // (disable eslint for next line as this serves as example layout code to external developers) + // eslint-disable-next-line no-unused-vars + options.cy; + layout.emit('layoutstart'); + // puts all nodes at (0, 0) + // n.b. most layouts would use layoutPositions(), instead of positions() and manual events + eles.nodes().positions(function () { + return { + x: 0, + y: 0 + }; + }); -var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); -var Graph = (__webpack_require__(/*! ./graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph); + // trigger layoutready when each node has had its position set at least once + layout.one('layoutready', options.ready); + layout.emit('layoutready'); -module.exports = { - addDummyNode: addDummyNode, - simplify: simplify, - asNonCompoundGraph: asNonCompoundGraph, - successorWeights: successorWeights, - predecessorWeights: predecessorWeights, - intersectRect: intersectRect, - buildLayerMatrix: buildLayerMatrix, - normalizeRanks: normalizeRanks, - removeEmptyRanks: removeEmptyRanks, - addBorderNode: addBorderNode, - maxRank: maxRank, - partition: partition, - time: time, - notime: notime + // trigger layoutstop when the layout stops (e.g. finishes) + layout.one('layoutstop', options.stop); + layout.emit('layoutstop'); + return this; // chaining }; -/* - * Adds a dummy node to the graph and return v. - */ -function addDummyNode(g, type, attrs, name) { - var v; - do { - v = _.uniqueId(name); - } while (g.hasNode(v)); +// called on continuous layouts to stop them before they finish +NullLayout.prototype.stop = function () { + return this; // chaining +}; - attrs.dummy = type; - g.setNode(v, attrs); - return v; -} +var defaults$1 = { + positions: undefined, + // map of (node id) => (position obj); or function(node){ return somPos; } + zoom: undefined, + // the zoom level to set (prob want fit = false if set) + pan: undefined, + // the pan level to set (prob want fit = false if set) + fit: true, + // whether to fit to viewport + padding: 30, + // padding on fit + spacingFactor: undefined, + // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up + animate: false, + // whether to transition the node positions + animationDuration: 500, + // duration of animation in ms if enabled + animationEasing: undefined, + // easing of animation if enabled + animateFilter: function animateFilter(node, i) { + return true; + }, + // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts + ready: undefined, + // callback on layoutready + stop: undefined, + // callback on layoutstop + transform: function transform(node, position) { + return position; + } // transform a given node position. Useful for changing flow direction in discrete layouts +}; -/* - * Returns a new graph with only simple edges. Handles aggregation of data - * associated with multi-edges. - */ -function simplify(g) { - var simplified = new Graph().setGraph(g.graph()); - _.forEach(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); }); - _.forEach(g.edges(), function(e) { - var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 }; - var label = g.edge(e); - simplified.setEdge(e.v, e.w, { - weight: simpleLabel.weight + label.weight, - minlen: Math.max(simpleLabel.minlen, label.minlen) - }); - }); - return simplified; +function PresetLayout(options) { + this.options = extend({}, defaults$1, options); } - -function asNonCompoundGraph(g) { - var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph()); - _.forEach(g.nodes(), function(v) { - if (!g.children(v).length) { - simplified.setNode(v, g.node(v)); +PresetLayout.prototype.run = function () { + var options = this.options; + var eles = options.eles; + var nodes = eles.nodes(); + var posIsFn = fn$6(options.positions); + function getPosition(node) { + if (options.positions == null) { + return copyPosition(node.position()); } + if (posIsFn) { + return options.positions(node); + } + var pos = options.positions[node._private.data.id]; + if (pos == null) { + return null; + } + return pos; + } + nodes.layoutPositions(this, options, function (node, i) { + var position = getPosition(node); + if (node.locked() || position == null) { + return false; + } + return position; }); - _.forEach(g.edges(), function(e) { - simplified.setEdge(e, g.edge(e)); - }); - return simplified; -} + return this; // chaining +}; -function successorWeights(g) { - var weightMap = _.map(g.nodes(), function(v) { - var sucs = {}; - _.forEach(g.outEdges(v), function(e) { - sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight; - }); - return sucs; - }); - return _.zipObject(g.nodes(), weightMap); -} +var defaults = { + fit: true, + // whether to fit to viewport + padding: 30, + // fit padding + boundingBox: undefined, + // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } + animate: false, + // whether to transition the node positions + animationDuration: 500, + // duration of animation in ms if enabled + animationEasing: undefined, + // easing of animation if enabled + animateFilter: function animateFilter(node, i) { + return true; + }, + // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts + ready: undefined, + // callback on layoutready + stop: undefined, + // callback on layoutstop + transform: function transform(node, position) { + return position; + } // transform a given node position. Useful for changing flow direction in discrete layouts +}; -function predecessorWeights(g) { - var weightMap = _.map(g.nodes(), function(v) { - var preds = {}; - _.forEach(g.inEdges(v), function(e) { - preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight; - }); - return preds; +function RandomLayout(options) { + this.options = extend({}, defaults, options); +} +RandomLayout.prototype.run = function () { + var options = this.options; + var cy = options.cy; + var eles = options.eles; + var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { + x1: 0, + y1: 0, + w: cy.width(), + h: cy.height() }); - return _.zipObject(g.nodes(), weightMap); + var getPos = function getPos(node, i) { + return { + x: bb.x1 + Math.round(Math.random() * bb.w), + y: bb.y1 + Math.round(Math.random() * bb.h) + }; + }; + eles.nodes().layoutPositions(this, options, getPos); + return this; // chaining +}; + +var layout = [{ + name: 'breadthfirst', + impl: BreadthFirstLayout +}, { + name: 'circle', + impl: CircleLayout +}, { + name: 'concentric', + impl: ConcentricLayout +}, { + name: 'cose', + impl: CoseLayout +}, { + name: 'grid', + impl: GridLayout +}, { + name: 'null', + impl: NullLayout +}, { + name: 'preset', + impl: PresetLayout +}, { + name: 'random', + impl: RandomLayout +}]; + +function NullRenderer(options) { + this.options = options; + this.notifications = 0; // for testing } -/* - * Finds where a line starting at point ({x, y}) would intersect a rectangle - * ({x, y, width, height}) if it were pointing at the rectangle's center. - */ -function intersectRect(rect, point) { - var x = rect.x; - var y = rect.y; +var noop = function noop() {}; +var throwImgErr = function throwImgErr() { + throw new Error('A headless instance can not render images'); +}; +NullRenderer.prototype = { + recalculateRenderedStyle: noop, + notify: function notify() { + this.notifications++; + }, + init: noop, + isHeadless: function isHeadless() { + return true; + }, + png: throwImgErr, + jpg: throwImgErr +}; - // Rectangle intersection algorithm from: - // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes - var dx = point.x - x; - var dy = point.y - y; - var w = rect.width / 2; - var h = rect.height / 2; +var BRp$f = {}; +BRp$f.arrowShapeWidth = 0.3; +BRp$f.registerArrowShapes = function () { + var arrowShapes = this.arrowShapes = {}; + var renderer = this; - if (!dx && !dy) { - throw new Error("Not possible to find intersection inside of the rectangle"); - } + // Contract for arrow shapes: + // 0, 0 is arrow tip + // (0, 1) is direction towards node + // (1, 0) is right + // + // functional api: + // collide: check x, y in shape + // roughCollide: called before collide, no false negatives + // draw: draw + // spacing: dist(arrowTip, nodeBoundary) + // gap: dist(edgeTip, nodeBoundary), edgeTip may != arrowTip - var sx, sy; - if (Math.abs(dy) * w > Math.abs(dx) * h) { - // Intersection is top or bottom of rect. - if (dy < 0) { - h = -h; + var bbCollide = function bbCollide(x, y, size, angle, translation, edgeWidth, padding) { + var x1 = translation.x - size / 2 - padding; + var x2 = translation.x + size / 2 + padding; + var y1 = translation.y - size / 2 - padding; + var y2 = translation.y + size / 2 + padding; + var inside = x1 <= x && x <= x2 && y1 <= y && y <= y2; + return inside; + }; + var transform = function transform(x, y, size, angle, translation) { + var xRotated = x * Math.cos(angle) - y * Math.sin(angle); + var yRotated = x * Math.sin(angle) + y * Math.cos(angle); + var xScaled = xRotated * size; + var yScaled = yRotated * size; + var xTranslated = xScaled + translation.x; + var yTranslated = yScaled + translation.y; + return { + x: xTranslated, + y: yTranslated + }; + }; + var transformPoints = function transformPoints(pts, size, angle, translation) { + var retPts = []; + for (var i = 0; i < pts.length; i += 2) { + var x = pts[i]; + var y = pts[i + 1]; + retPts.push(transform(x, y, size, angle, translation)); } - sx = h * dx / dy; - sy = h; - } else { - // Intersection is left or right of rect. - if (dx < 0) { - w = -w; + return retPts; + }; + var pointsToArr = function pointsToArr(pts) { + var ret = []; + for (var i = 0; i < pts.length; i++) { + var p = pts[i]; + ret.push(p.x, p.y); } - sx = w; - sy = w * dy / dx; - } - - return { x: x + sx, y: y + sy }; -} - -/* - * Given a DAG with each node assigned "rank" and "order" properties, this - * function will produce a matrix with the ids of each node. - */ -function buildLayerMatrix(g) { - var layering = _.map(_.range(maxRank(g) + 1), function() { return []; }); - _.forEach(g.nodes(), function(v) { - var node = g.node(v); - var rank = node.rank; - if (!_.isUndefined(rank)) { - layering[rank][node.order] = v; + return ret; + }; + var standardGap = function standardGap(edge) { + return edge.pstyle('width').pfValue * edge.pstyle('arrow-scale').pfValue * 2; + }; + var defineArrowShape = function defineArrowShape(name, defn) { + if (string(defn)) { + defn = arrowShapes[defn]; } + arrowShapes[name] = extend({ + name: name, + points: [-0.15, -0.3, 0.15, -0.3, 0.15, 0.3, -0.15, 0.3], + collide: function collide(x, y, size, angle, translation, padding) { + var points = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation)); + var inside = pointInsidePolygonPoints(x, y, points); + return inside; + }, + roughCollide: bbCollide, + draw: function draw(context, size, angle, translation) { + var points = transformPoints(this.points, size, angle, translation); + renderer.arrowShapeImpl('polygon')(context, points); + }, + spacing: function spacing(edge) { + return 0; + }, + gap: standardGap + }, defn); + }; + defineArrowShape('none', { + collide: falsify, + roughCollide: falsify, + draw: noop$1, + spacing: zeroify, + gap: zeroify }); - return layering; -} - -/* - * Adjusts the ranks for all nodes in the graph such that all nodes v have - * rank(v) >= 0 and at least one node w has rank(w) = 0. - */ -function normalizeRanks(g) { - var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; })); - _.forEach(g.nodes(), function(v) { - var node = g.node(v); - if (_.has(node, "rank")) { - node.rank -= min; + defineArrowShape('triangle', { + points: [-0.15, -0.3, 0, 0, 0.15, -0.3] + }); + defineArrowShape('arrow', 'triangle'); + defineArrowShape('triangle-backcurve', { + points: arrowShapes['triangle'].points, + controlPoint: [0, -0.15], + roughCollide: bbCollide, + draw: function draw(context, size, angle, translation, edgeWidth) { + var ptsTrans = transformPoints(this.points, size, angle, translation); + var ctrlPt = this.controlPoint; + var ctrlPtTrans = transform(ctrlPt[0], ctrlPt[1], size, angle, translation); + renderer.arrowShapeImpl(this.name)(context, ptsTrans, ctrlPtTrans); + }, + gap: function gap(edge) { + return standardGap(edge) * 0.8; } }); -} - -function removeEmptyRanks(g) { - // Ranks may not start at 0, so we need to offset them - var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; })); - - var layers = []; - _.forEach(g.nodes(), function(v) { - var rank = g.node(v).rank - offset; - if (!layers[rank]) { - layers[rank] = []; + defineArrowShape('triangle-tee', { + points: [0, 0, 0.15, -0.3, -0.15, -0.3, 0, 0], + pointsTee: [-0.15, -0.4, -0.15, -0.5, 0.15, -0.5, 0.15, -0.4], + collide: function collide(x, y, size, angle, translation, edgeWidth, padding) { + var triPts = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation)); + var teePts = pointsToArr(transformPoints(this.pointsTee, size + 2 * padding, angle, translation)); + var inside = pointInsidePolygonPoints(x, y, triPts) || pointInsidePolygonPoints(x, y, teePts); + return inside; + }, + draw: function draw(context, size, angle, translation, edgeWidth) { + var triPts = transformPoints(this.points, size, angle, translation); + var teePts = transformPoints(this.pointsTee, size, angle, translation); + renderer.arrowShapeImpl(this.name)(context, triPts, teePts); } - layers[rank].push(v); }); - - var delta = 0; - var nodeRankFactor = g.graph().nodeRankFactor; - _.forEach(layers, function(vs, i) { - if (_.isUndefined(vs) && i % nodeRankFactor !== 0) { - --delta; - } else if (delta) { - _.forEach(vs, function(v) { g.node(v).rank += delta; }); + defineArrowShape('circle-triangle', { + radius: 0.15, + pointsTr: [0, -0.15, 0.15, -0.45, -0.15, -0.45, 0, -0.15], + collide: function collide(x, y, size, angle, translation, edgeWidth, padding) { + var t = translation; + var circleInside = Math.pow(t.x - x, 2) + Math.pow(t.y - y, 2) <= Math.pow((size + 2 * padding) * this.radius, 2); + var triPts = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation)); + return pointInsidePolygonPoints(x, y, triPts) || circleInside; + }, + draw: function draw(context, size, angle, translation, edgeWidth) { + var triPts = transformPoints(this.pointsTr, size, angle, translation); + renderer.arrowShapeImpl(this.name)(context, triPts, translation.x, translation.y, this.radius * size); + }, + spacing: function spacing(edge) { + return renderer.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.radius; } }); -} - -function addBorderNode(g, prefix, rank, order) { - var node = { - width: 0, - height: 0 - }; - if (arguments.length >= 4) { - node.rank = rank; - node.order = order; - } - return addDummyNode(g, "border", node, prefix); -} - -function maxRank(g) { - return _.max(_.map(g.nodes(), function(v) { - var rank = g.node(v).rank; - if (!_.isUndefined(rank)) { - return rank; + defineArrowShape('triangle-cross', { + points: [0, 0, 0.15, -0.3, -0.15, -0.3, 0, 0], + baseCrossLinePts: [-0.15, -0.4, + // first half of the rectangle + -0.15, -0.4, 0.15, -0.4, + // second half of the rectangle + 0.15, -0.4], + crossLinePts: function crossLinePts(size, edgeWidth) { + // shift points so that the distance between the cross points matches edge width + var p = this.baseCrossLinePts.slice(); + var shiftFactor = edgeWidth / size; + var y0 = 3; + var y1 = 5; + p[y0] = p[y0] - shiftFactor; + p[y1] = p[y1] - shiftFactor; + return p; + }, + collide: function collide(x, y, size, angle, translation, edgeWidth, padding) { + var triPts = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation)); + var teePts = pointsToArr(transformPoints(this.crossLinePts(size, edgeWidth), size + 2 * padding, angle, translation)); + var inside = pointInsidePolygonPoints(x, y, triPts) || pointInsidePolygonPoints(x, y, teePts); + return inside; + }, + draw: function draw(context, size, angle, translation, edgeWidth) { + var triPts = transformPoints(this.points, size, angle, translation); + var crossLinePts = transformPoints(this.crossLinePts(size, edgeWidth), size, angle, translation); + renderer.arrowShapeImpl(this.name)(context, triPts, crossLinePts); + } + }); + defineArrowShape('vee', { + points: [-0.15, -0.3, 0, 0, 0.15, -0.3, 0, -0.15], + gap: function gap(edge) { + return standardGap(edge) * 0.525; + } + }); + defineArrowShape('circle', { + radius: 0.15, + collide: function collide(x, y, size, angle, translation, edgeWidth, padding) { + var t = translation; + var inside = Math.pow(t.x - x, 2) + Math.pow(t.y - y, 2) <= Math.pow((size + 2 * padding) * this.radius, 2); + return inside; + }, + draw: function draw(context, size, angle, translation, edgeWidth) { + renderer.arrowShapeImpl(this.name)(context, translation.x, translation.y, this.radius * size); + }, + spacing: function spacing(edge) { + return renderer.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.radius; } - })); -} - -/* - * Partition a collection into two groups: `lhs` and `rhs`. If the supplied - * function returns true for an entry it goes into `lhs`. Otherwise it goes - * into `rhs. - */ -function partition(collection, fn) { - var result = { lhs: [], rhs: [] }; - _.forEach(collection, function(value) { - if (fn(value)) { - result.lhs.push(value); - } else { - result.rhs.push(value); + }); + defineArrowShape('tee', { + points: [-0.15, 0, -0.15, -0.1, 0.15, -0.1, 0.15, 0], + spacing: function spacing(edge) { + return 1; + }, + gap: function gap(edge) { + return 1; } }); - return result; -} - -/* - * Returns a new function that wraps `fn` with a timer. The wrapper logs the - * time it takes to execute the function. - */ -function time(name, fn) { - var start = _.now(); - try { - return fn(); - } finally { - console.log(name + " time: " + (_.now() - start) + "ms"); - } -} - -function notime(name, fn) { - return fn(); -} - - -/***/ }), - -/***/ "./node_modules/dagre/lib/version.js": -/*!*******************************************!*\ - !*** ./node_modules/dagre/lib/version.js ***! - \*******************************************/ -/***/ (function(module) { - -module.exports = "0.8.5"; - - -/***/ }), - -/***/ "./node_modules/dependency-graph/lib/dep_graph.js": -/*!********************************************************!*\ - !*** ./node_modules/dependency-graph/lib/dep_graph.js ***! - \********************************************************/ -/***/ (function(__unused_webpack_module, exports) { + defineArrowShape('square', { + points: [-0.15, 0.00, 0.15, 0.00, 0.15, -0.3, -0.15, -0.3] + }); + defineArrowShape('diamond', { + points: [-0.15, -0.15, 0, -0.3, 0.15, -0.15, 0, 0], + gap: function gap(edge) { + return edge.pstyle('width').pfValue * edge.pstyle('arrow-scale').value; + } + }); + defineArrowShape('chevron', { + points: [0, 0, -0.15, -0.15, -0.1, -0.2, 0, -0.1, 0.1, -0.2, 0.15, -0.15], + gap: function gap(edge) { + return 0.95 * edge.pstyle('width').pfValue * edge.pstyle('arrow-scale').value; + } + }); +}; -/** - * A simple dependency graph - */ +var BRp$e = {}; -/** - * Helper for creating a Topological Sort using Depth-First-Search on a set of edges. - * - * Detects cycles and throws an Error if one is detected (unless the "circular" - * parameter is "true" in which case it ignores them). - * - * @param edges The set of edges to DFS through - * @param leavesOnly Whether to only return "leaf" nodes (ones who have no edges) - * @param result An array in which the results will be populated - * @param circular A boolean to allow circular dependencies - */ -function createDFS(edges, leavesOnly, result, circular) { - var visited = {}; - return function (start) { - if (visited[start]) { - return; +// Project mouse +BRp$e.projectIntoViewport = function (clientX, clientY) { + var cy = this.cy; + var offsets = this.findContainerClientCoords(); + var offsetLeft = offsets[0]; + var offsetTop = offsets[1]; + var scale = offsets[4]; + var pan = cy.pan(); + var zoom = cy.zoom(); + var x = ((clientX - offsetLeft) / scale - pan.x) / zoom; + var y = ((clientY - offsetTop) / scale - pan.y) / zoom; + return [x, y]; +}; +BRp$e.findContainerClientCoords = function () { + if (this.containerBB) { + return this.containerBB; + } + var container = this.container; + var rect = container.getBoundingClientRect(); + var style = this.cy.window().getComputedStyle(container); + var styleValue = function styleValue(name) { + return parseFloat(style.getPropertyValue(name)); + }; + var padding = { + left: styleValue('padding-left'), + right: styleValue('padding-right'), + top: styleValue('padding-top'), + bottom: styleValue('padding-bottom') + }; + var border = { + left: styleValue('border-left-width'), + right: styleValue('border-right-width'), + top: styleValue('border-top-width'), + bottom: styleValue('border-bottom-width') + }; + var clientWidth = container.clientWidth; + var clientHeight = container.clientHeight; + var paddingHor = padding.left + padding.right; + var paddingVer = padding.top + padding.bottom; + var borderHor = border.left + border.right; + var scale = rect.width / (clientWidth + borderHor); + var unscaledW = clientWidth - paddingHor; + var unscaledH = clientHeight - paddingVer; + var left = rect.left + padding.left + border.left; + var top = rect.top + padding.top + border.top; + return this.containerBB = [left, top, unscaledW, unscaledH, scale]; +}; +BRp$e.invalidateContainerClientCoordsCache = function () { + this.containerBB = null; +}; +BRp$e.findNearestElement = function (x, y, interactiveElementsOnly, isTouch) { + return this.findNearestElements(x, y, interactiveElementsOnly, isTouch)[0]; +}; +BRp$e.findNearestElements = function (x, y, interactiveElementsOnly, isTouch) { + var self = this; + var r = this; + var eles = r.getCachedZSortedEles(); + var near = []; // 1 node max, 1 edge max + var zoom = r.cy.zoom(); + var hasCompounds = r.cy.hasCompoundNodes(); + var edgeThreshold = (isTouch ? 24 : 8) / zoom; + var nodeThreshold = (isTouch ? 8 : 2) / zoom; + var labelThreshold = (isTouch ? 8 : 2) / zoom; + var minSqDist = Infinity; + var nearEdge; + var nearNode; + if (interactiveElementsOnly) { + eles = eles.interactive; + } + function addEle(ele, sqDist) { + if (ele.isNode()) { + if (nearNode) { + return; // can't replace node + } else { + nearNode = ele; + near.push(ele); + } } - var inCurrentPath = {}; - var currentPath = []; - var todo = []; // used as a stack - todo.push({ node: start, processed: false }); - while (todo.length > 0) { - var current = todo[todo.length - 1]; // peek at the todo stack - var processed = current.processed; - var node = current.node; - if (!processed) { - // Haven't visited edges yet (visiting phase) - if (visited[node]) { - todo.pop(); - continue; - } else if (inCurrentPath[node]) { - // It's not a DAG - if (circular) { - todo.pop(); - // If we're tolerating cycles, don't revisit the node - continue; + if (ele.isEdge() && (sqDist == null || sqDist < minSqDist)) { + if (nearEdge) { + // then replace existing edge + // can replace only if same z-index + if (nearEdge.pstyle('z-compound-depth').value === ele.pstyle('z-compound-depth').value && nearEdge.pstyle('z-compound-depth').value === ele.pstyle('z-compound-depth').value) { + for (var i = 0; i < near.length; i++) { + if (near[i].isEdge()) { + near[i] = ele; + nearEdge = ele; + minSqDist = sqDist != null ? sqDist : minSqDist; + break; + } } - currentPath.push(node); - throw new DepGraphCycleError(currentPath); - } - - inCurrentPath[node] = true; - currentPath.push(node); - var nodeEdges = edges[node]; - // (push edges onto the todo stack in reverse order to be order-compatible with the old DFS implementation) - for (var i = nodeEdges.length - 1; i >= 0; i--) { - todo.push({ node: nodeEdges[i], processed: false }); } - current.processed = true; } else { - // Have visited edges (stack unrolling phase) - todo.pop(); - currentPath.pop(); - inCurrentPath[node] = false; - visited[node] = true; - if (!leavesOnly || edges[node].length === 0) { - result.push(node); - } + near.push(ele); + nearEdge = ele; + minSqDist = sqDist != null ? sqDist : minSqDist; } } - }; -} - -/** - * Simple Dependency Graph - */ -var DepGraph = (exports.DepGraph = function DepGraph(opts) { - this.nodes = {}; // Node -> Node/Data (treated like a Set) - this.outgoingEdges = {}; // Node -> [Dependency Node] - this.incomingEdges = {}; // Node -> [Dependant Node] - this.circular = opts && !!opts.circular; // Allows circular deps -}); -DepGraph.prototype = { - /** - * The number of nodes in the graph. - */ - size: function () { - return Object.keys(this.nodes).length; - }, - /** - * Add a node to the dependency graph. If a node already exists, this method will do nothing. - */ - addNode: function (node, data) { - if (!this.hasNode(node)) { - // Checking the arguments length allows the user to add a node with undefined data - if (arguments.length === 2) { - this.nodes[node] = data; - } else { - this.nodes[node] = node; + } + function checkNode(node) { + var width = node.outerWidth() + 2 * nodeThreshold; + var height = node.outerHeight() + 2 * nodeThreshold; + var hw = width / 2; + var hh = height / 2; + var pos = node.position(); + if (pos.x - hw <= x && x <= pos.x + hw // bb check x + && pos.y - hh <= y && y <= pos.y + hh // bb check y + ) { + var shape = r.nodeShapes[self.getNodeShape(node)]; + if (shape.checkPoint(x, y, 0, width, height, pos.x, pos.y)) { + addEle(node, 0); + return true; } - this.outgoingEdges[node] = []; - this.incomingEdges[node] = []; - } - }, - /** - * Remove a node from the dependency graph. If a node does not exist, this method will do nothing. - */ - removeNode: function (node) { - if (this.hasNode(node)) { - delete this.nodes[node]; - delete this.outgoingEdges[node]; - delete this.incomingEdges[node]; - [this.incomingEdges, this.outgoingEdges].forEach(function (edgeList) { - Object.keys(edgeList).forEach(function (key) { - var idx = edgeList[key].indexOf(node); - if (idx >= 0) { - edgeList[key].splice(idx, 1); - } - }, this); - }); - } - }, - /** - * Check if a node exists in the graph - */ - hasNode: function (node) { - return this.nodes.hasOwnProperty(node); - }, - /** - * Get the data associated with a node name - */ - getNodeData: function (node) { - if (this.hasNode(node)) { - return this.nodes[node]; - } else { - throw new Error("Node does not exist: " + node); - } - }, - /** - * Set the associated data for a given node name. If the node does not exist, this method will throw an error - */ - setNodeData: function (node, data) { - if (this.hasNode(node)) { - this.nodes[node] = data; - } else { - throw new Error("Node does not exist: " + node); - } - }, - /** - * Add a dependency between two nodes. If either of the nodes does not exist, - * an Error will be thrown. - */ - addDependency: function (from, to) { - if (!this.hasNode(from)) { - throw new Error("Node does not exist: " + from); - } - if (!this.hasNode(to)) { - throw new Error("Node does not exist: " + to); - } - if (this.outgoingEdges[from].indexOf(to) === -1) { - this.outgoingEdges[from].push(to); - } - if (this.incomingEdges[to].indexOf(from) === -1) { - this.incomingEdges[to].push(from); } - return true; - }, - /** - * Remove a dependency between two nodes. - */ - removeDependency: function (from, to) { - var idx; - if (this.hasNode(from)) { - idx = this.outgoingEdges[from].indexOf(to); - if (idx >= 0) { - this.outgoingEdges[from].splice(idx, 1); + } + function checkEdge(edge) { + var _p = edge._private; + var rs = _p.rscratch; + var styleWidth = edge.pstyle('width').pfValue; + var scale = edge.pstyle('arrow-scale').value; + var width = styleWidth / 2 + edgeThreshold; // more like a distance radius from centre + var widthSq = width * width; + var width2 = width * 2; + var src = _p.source; + var tgt = _p.target; + var sqDist; + if (rs.edgeType === 'segments' || rs.edgeType === 'straight' || rs.edgeType === 'haystack') { + var pts = rs.allpts; + for (var i = 0; i + 3 < pts.length; i += 2) { + if (inLineVicinity(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3], width2) && widthSq > (sqDist = sqdistToFiniteLine(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3]))) { + addEle(edge, sqDist); + return true; + } + } + } else if (rs.edgeType === 'bezier' || rs.edgeType === 'multibezier' || rs.edgeType === 'self' || rs.edgeType === 'compound') { + var pts = rs.allpts; + for (var i = 0; i + 5 < rs.allpts.length; i += 4) { + if (inBezierVicinity(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3], pts[i + 4], pts[i + 5], width2) && widthSq > (sqDist = sqdistToQuadraticBezier(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3], pts[i + 4], pts[i + 5]))) { + addEle(edge, sqDist); + return true; + } } } - if (this.hasNode(to)) { - idx = this.incomingEdges[to].indexOf(from); - if (idx >= 0) { - this.incomingEdges[to].splice(idx, 1); + // if we're close to the edge but didn't hit it, maybe we hit its arrows + + var src = src || _p.source; + var tgt = tgt || _p.target; + var arSize = self.getArrowWidth(styleWidth, scale); + var arrows = [{ + name: 'source', + x: rs.arrowStartX, + y: rs.arrowStartY, + angle: rs.srcArrowAngle + }, { + name: 'target', + x: rs.arrowEndX, + y: rs.arrowEndY, + angle: rs.tgtArrowAngle + }, { + name: 'mid-source', + x: rs.midX, + y: rs.midY, + angle: rs.midsrcArrowAngle + }, { + name: 'mid-target', + x: rs.midX, + y: rs.midY, + angle: rs.midtgtArrowAngle + }]; + for (var i = 0; i < arrows.length; i++) { + var ar = arrows[i]; + var shape = r.arrowShapes[edge.pstyle(ar.name + '-arrow-shape').value]; + var edgeWidth = edge.pstyle('width').pfValue; + if (shape.roughCollide(x, y, arSize, ar.angle, { + x: ar.x, + y: ar.y + }, edgeWidth, edgeThreshold) && shape.collide(x, y, arSize, ar.angle, { + x: ar.x, + y: ar.y + }, edgeWidth, edgeThreshold)) { + addEle(edge); + return true; } } - }, - /** - * Return a clone of the dependency graph. If any custom data is attached - * to the nodes, it will only be shallow copied. - */ - clone: function () { - var source = this; - var result = new DepGraph(); - var keys = Object.keys(source.nodes); - keys.forEach(function (n) { - result.nodes[n] = source.nodes[n]; - result.outgoingEdges[n] = source.outgoingEdges[n].slice(0); - result.incomingEdges[n] = source.incomingEdges[n].slice(0); - }); - return result; - }, - /** - * Get an array containing the direct dependencies of the specified node. - * - * Throws an Error if the specified node does not exist. - */ - directDependenciesOf: function (node) { - if (this.hasNode(node)) { - return this.outgoingEdges[node].slice(0); - } else { - throw new Error("Node does not exist: " + node); + + // for compound graphs, hitting edge may actually want a connected node instead (b/c edge may have greater z-index precedence) + if (hasCompounds && near.length > 0) { + checkNode(src); + checkNode(tgt); } - }, - /** - * Get an array containing the nodes that directly depend on the specified node. - * - * Throws an Error if the specified node does not exist. - */ - directDependantsOf: function (node) { - if (this.hasNode(node)) { - return this.incomingEdges[node].slice(0); + } + function preprop(obj, name, pre) { + return getPrefixedProperty(obj, name, pre); + } + function checkLabel(ele, prefix) { + var _p = ele._private; + var th = labelThreshold; + var prefixDash; + if (prefix) { + prefixDash = prefix + '-'; } else { - throw new Error("Node does not exist: " + node); + prefixDash = ''; } - }, - /** - * Get an array containing the nodes that the specified node depends on (transitively). - * - * Throws an Error if the graph has a cycle, or the specified node does not exist. - * - * If `leavesOnly` is true, only nodes that do not depend on any other nodes will be returned - * in the array. - */ - dependenciesOf: function (node, leavesOnly) { - if (this.hasNode(node)) { - var result = []; - var DFS = createDFS( - this.outgoingEdges, - leavesOnly, - result, - this.circular - ); - DFS(node); - var idx = result.indexOf(node); - if (idx >= 0) { - result.splice(idx, 1); + ele.boundingBox(); + var bb = _p.labelBounds[prefix || 'main']; + var text = ele.pstyle(prefixDash + 'label').value; + var eventsEnabled = ele.pstyle('text-events').strValue === 'yes'; + if (!eventsEnabled || !text) { + return; + } + var lx = preprop(_p.rscratch, 'labelX', prefix); + var ly = preprop(_p.rscratch, 'labelY', prefix); + var theta = preprop(_p.rscratch, 'labelAngle', prefix); + var ox = ele.pstyle(prefixDash + 'text-margin-x').pfValue; + var oy = ele.pstyle(prefixDash + 'text-margin-y').pfValue; + var lx1 = bb.x1 - th - ox; // (-ox, -oy) as bb already includes margin + var lx2 = bb.x2 + th - ox; // and rotation is about (lx, ly) + var ly1 = bb.y1 - th - oy; + var ly2 = bb.y2 + th - oy; + if (theta) { + var cos = Math.cos(theta); + var sin = Math.sin(theta); + var rotate = function rotate(x, y) { + x = x - lx; + y = y - ly; + return { + x: x * cos - y * sin + lx, + y: x * sin + y * cos + ly + }; + }; + var px1y1 = rotate(lx1, ly1); + var px1y2 = rotate(lx1, ly2); + var px2y1 = rotate(lx2, ly1); + var px2y2 = rotate(lx2, ly2); + var points = [ + // with the margin added after the rotation is applied + px1y1.x + ox, px1y1.y + oy, px2y1.x + ox, px2y1.y + oy, px2y2.x + ox, px2y2.y + oy, px1y2.x + ox, px1y2.y + oy]; + if (pointInsidePolygonPoints(x, y, points)) { + addEle(ele); + return true; } - return result; } else { - throw new Error("Node does not exist: " + node); - } - }, - /** - * get an array containing the nodes that depend on the specified node (transitively). - * - * Throws an Error if the graph has a cycle, or the specified node does not exist. - * - * If `leavesOnly` is true, only nodes that do not have any dependants will be returned in the array. - */ - dependantsOf: function (node, leavesOnly) { - if (this.hasNode(node)) { - var result = []; - var DFS = createDFS( - this.incomingEdges, - leavesOnly, - result, - this.circular - ); - DFS(node); - var idx = result.indexOf(node); - if (idx >= 0) { - result.splice(idx, 1); + // do a cheaper bb check + if (inBoundingBox(bb, x, y)) { + addEle(ele); + return true; } - return result; + } + } + for (var i = eles.length - 1; i >= 0; i--) { + // reverse order for precedence + var ele = eles[i]; + if (ele.isNode()) { + checkNode(ele) || checkLabel(ele); } else { - throw new Error("Node does not exist: " + node); + // then edge + checkEdge(ele) || checkLabel(ele) || checkLabel(ele, 'source') || checkLabel(ele, 'target'); } - }, - /** - * Construct the overall processing order for the dependency graph. - * - * Throws an Error if the graph has a cycle. - * - * If `leavesOnly` is true, only nodes that do not depend on any other nodes will be returned. - */ - overallOrder: function (leavesOnly) { - var self = this; - var result = []; - var keys = Object.keys(this.nodes); - if (keys.length === 0) { - return result; // Empty graph + } + return near; +}; + +// 'Give me everything from this box' +BRp$e.getAllInBox = function (x1, y1, x2, y2) { + var eles = this.getCachedZSortedEles().interactive; + var box = []; + var x1c = Math.min(x1, x2); + var x2c = Math.max(x1, x2); + var y1c = Math.min(y1, y2); + var y2c = Math.max(y1, y2); + x1 = x1c; + x2 = x2c; + y1 = y1c; + y2 = y2c; + var boxBb = makeBoundingBox({ + x1: x1, + y1: y1, + x2: x2, + y2: y2 + }); + for (var e = 0; e < eles.length; e++) { + var ele = eles[e]; + if (ele.isNode()) { + var node = ele; + var nodeBb = node.boundingBox({ + includeNodes: true, + includeEdges: false, + includeLabels: false + }); + if (boundingBoxesIntersect(boxBb, nodeBb) && !boundingBoxInBoundingBox(nodeBb, boxBb)) { + box.push(node); + } } else { - if (!this.circular) { - // Look for cycles - we run the DFS starting at all the nodes in case there - // are several disconnected subgraphs inside this dependency graph. - var CycleDFS = createDFS(this.outgoingEdges, false, [], this.circular); - keys.forEach(function (n) { - CycleDFS(n); - }); + var edge = ele; + var _p = edge._private; + var rs = _p.rscratch; + if (rs.startX != null && rs.startY != null && !inBoundingBox(boxBb, rs.startX, rs.startY)) { + continue; } - - var DFS = createDFS( - this.outgoingEdges, - leavesOnly, - result, - this.circular - ); - // Find all potential starting points (nodes with nothing depending on them) an - // run a DFS starting at these points to get the order - keys - .filter(function (node) { - return self.incomingEdges[node].length === 0; - }) - .forEach(function (n) { - DFS(n); - }); - - // If we're allowing cycles - we need to run the DFS against any remaining - // nodes that did not end up in the initial result (as they are part of a - // subgraph that does not have a clear starting point) - if (this.circular) { - keys - .filter(function (node) { - return result.indexOf(node) === -1; - }) - .forEach(function (n) { - DFS(n); - }); + if (rs.endX != null && rs.endY != null && !inBoundingBox(boxBb, rs.endX, rs.endY)) { + continue; + } + if (rs.edgeType === 'bezier' || rs.edgeType === 'multibezier' || rs.edgeType === 'self' || rs.edgeType === 'compound' || rs.edgeType === 'segments' || rs.edgeType === 'haystack') { + var pts = _p.rstyle.bezierPts || _p.rstyle.linePts || _p.rstyle.haystackPts; + var allInside = true; + for (var i = 0; i < pts.length; i++) { + if (!pointInBoundingBox(boxBb, pts[i])) { + allInside = false; + break; + } + } + if (allInside) { + box.push(edge); + } + } else if (rs.edgeType === 'haystack' || rs.edgeType === 'straight') { + box.push(edge); } - - return result; } - }, - /** - * Get an array of nodes that have no dependants (i.e. nothing depends on them). - */ - entryNodes: function () { - var self = this; - return Object.keys(this.nodes).filter(function (node) { - return self.incomingEdges[node].length === 0; - }); } + return box; }; -// Create some aliases -DepGraph.prototype.directDependentsOf = DepGraph.prototype.directDependantsOf; -DepGraph.prototype.dependentsOf = DepGraph.prototype.dependantsOf; +var BRp$d = {}; +BRp$d.calculateArrowAngles = function (edge) { + var rs = edge._private.rscratch; + var isHaystack = rs.edgeType === 'haystack'; + var isBezier = rs.edgeType === 'bezier'; + var isMultibezier = rs.edgeType === 'multibezier'; + var isSegments = rs.edgeType === 'segments'; + var isCompound = rs.edgeType === 'compound'; + var isSelf = rs.edgeType === 'self'; -/** - * Cycle error, including the path of the cycle. - */ -var DepGraphCycleError = (exports.DepGraphCycleError = function (cyclePath) { - var message = "Dependency Cycle Found: " + cyclePath.join(" -> "); - var instance = new Error(message); - instance.cyclePath = cyclePath; - Object.setPrototypeOf(instance, Object.getPrototypeOf(this)); - if (Error.captureStackTrace) { - Error.captureStackTrace(instance, DepGraphCycleError); - } - return instance; -}); -DepGraphCycleError.prototype = Object.create(Error.prototype, { - constructor: { - value: Error, - enumerable: false, - writable: true, - configurable: true + // Displacement gives direction for arrowhead orientation + var dispX, dispY; + var startX, startY, endX, endY, midX, midY; + if (isHaystack) { + startX = rs.haystackPts[0]; + startY = rs.haystackPts[1]; + endX = rs.haystackPts[2]; + endY = rs.haystackPts[3]; + } else { + startX = rs.arrowStartX; + startY = rs.arrowStartY; + endX = rs.arrowEndX; + endY = rs.arrowEndY; } -}); -Object.setPrototypeOf(DepGraphCycleError, Error); - - -/***/ }), - -/***/ "./node_modules/fast-isnumeric/index.js": -/*!**********************************************!*\ - !*** ./node_modules/fast-isnumeric/index.js ***! - \**********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -"use strict"; -/** - * inspired by is-number - * but significantly simplified and sped up by ignoring number and string constructors - * ie these return false: - * new Number(1) - * new String('1') - */ - - - -var allBlankCharCodes = __webpack_require__(/*! is-string-blank */ "./node_modules/is-string-blank/index.js"); - -module.exports = function(n) { - var type = typeof n; - if(type === 'string') { - var original = n; - n = +n; - // whitespace strings cast to zero - filter them out - if(n===0 && allBlankCharCodes(original)) return false; - } - else if(type !== 'number') return false; - - return n - n < 1; -}; - - -/***/ }), - -/***/ "./node_modules/graphlib/index.js": -/*!****************************************!*\ - !*** ./node_modules/graphlib/index.js ***! - \****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -/** - * Copyright (c) 2014, Chris Pettitt - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its contributors - * may be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -var lib = __webpack_require__(/*! ./lib */ "./node_modules/graphlib/lib/index.js"); - -module.exports = { - Graph: lib.Graph, - json: __webpack_require__(/*! ./lib/json */ "./node_modules/graphlib/lib/json.js"), - alg: __webpack_require__(/*! ./lib/alg */ "./node_modules/graphlib/lib/alg/index.js"), - version: lib.version -}; - - -/***/ }), - -/***/ "./node_modules/graphlib/lib/alg/components.js": -/*!*****************************************************!*\ - !*** ./node_modules/graphlib/lib/alg/components.js ***! - \*****************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + midX = rs.midX; + midY = rs.midY; -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); + // source + // -module.exports = components; + if (isSegments) { + dispX = startX - rs.segpts[0]; + dispY = startY - rs.segpts[1]; + } else if (isMultibezier || isCompound || isSelf || isBezier) { + var pts = rs.allpts; + var bX = qbezierAt(pts[0], pts[2], pts[4], 0.1); + var bY = qbezierAt(pts[1], pts[3], pts[5], 0.1); + dispX = startX - bX; + dispY = startY - bY; + } else { + dispX = startX - midX; + dispY = startY - midY; + } + rs.srcArrowAngle = getAngleFromDisp(dispX, dispY); -function components(g) { - var visited = {}; - var cmpts = []; - var cmpt; + // mid target + // - function dfs(v) { - if (_.has(visited, v)) return; - visited[v] = true; - cmpt.push(v); - _.each(g.successors(v), dfs); - _.each(g.predecessors(v), dfs); + var midX = rs.midX; + var midY = rs.midY; + if (isHaystack) { + midX = (startX + endX) / 2; + midY = (startY + endY) / 2; } - - _.each(g.nodes(), function(v) { - cmpt = []; - dfs(v); - if (cmpt.length) { - cmpts.push(cmpt); + dispX = endX - startX; + dispY = endY - startY; + if (isSegments) { + var pts = rs.allpts; + if (pts.length / 2 % 2 === 0) { + var i2 = pts.length / 2; + var i1 = i2 - 2; + dispX = pts[i2] - pts[i1]; + dispY = pts[i2 + 1] - pts[i1 + 1]; + } else { + var i2 = pts.length / 2 - 1; + var i1 = i2 - 2; + var i3 = i2 + 2; + dispX = pts[i2] - pts[i1]; + dispY = pts[i2 + 1] - pts[i1 + 1]; } - }); - - return cmpts; -} - - -/***/ }), - -/***/ "./node_modules/graphlib/lib/alg/dfs.js": -/*!**********************************************!*\ - !*** ./node_modules/graphlib/lib/alg/dfs.js ***! - \**********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); - -module.exports = dfs; + } else if (isMultibezier || isCompound || isSelf) { + var pts = rs.allpts; + var cpts = rs.ctrlpts; + var bp0x, bp0y; + var bp1x, bp1y; + if (cpts.length / 2 % 2 === 0) { + var p0 = pts.length / 2 - 1; // startpt + var ic = p0 + 2; + var p1 = ic + 2; + bp0x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.0); + bp0y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.0); + bp1x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.0001); + bp1y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.0001); + } else { + var ic = pts.length / 2 - 1; // ctrpt + var p0 = ic - 2; // startpt + var p1 = ic + 2; // endpt -/* - * A helper that preforms a pre- or post-order traversal on the input graph - * and returns the nodes in the order they were visited. If the graph is - * undirected then this algorithm will navigate using neighbors. If the graph - * is directed then this algorithm will navigate using successors. - * - * Order must be one of "pre" or "post". - */ -function dfs(g, vs, order) { - if (!_.isArray(vs)) { - vs = [vs]; + bp0x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.4999); + bp0y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.4999); + bp1x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.5); + bp1y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.5); + } + dispX = bp1x - bp0x; + dispY = bp1y - bp0y; } + rs.midtgtArrowAngle = getAngleFromDisp(dispX, dispY); + rs.midDispX = dispX; + rs.midDispY = dispY; - var navigation = (g.isDirected() ? g.successors : g.neighbors).bind(g); + // mid source + // - var acc = []; - var visited = {}; - _.each(vs, function(v) { - if (!g.hasNode(v)) { - throw new Error("Graph does not have node: " + v); + dispX *= -1; + dispY *= -1; + if (isSegments) { + var pts = rs.allpts; + if (pts.length / 2 % 2 === 0) ; else { + var i2 = pts.length / 2 - 1; + var i3 = i2 + 2; + dispX = -(pts[i3] - pts[i2]); + dispY = -(pts[i3 + 1] - pts[i2 + 1]); } - - doDfs(g, v, order === "post", visited, navigation, acc); - }); - return acc; -} - -function doDfs(g, v, postorder, visited, navigation, acc) { - if (!_.has(visited, v)) { - visited[v] = true; - - if (!postorder) { acc.push(v); } - _.each(navigation(v), function(w) { - doDfs(g, w, postorder, visited, navigation, acc); - }); - if (postorder) { acc.push(v); } } -} - - -/***/ }), - -/***/ "./node_modules/graphlib/lib/alg/dijkstra-all.js": -/*!*******************************************************!*\ - !*** ./node_modules/graphlib/lib/alg/dijkstra-all.js ***! - \*******************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + rs.midsrcArrowAngle = getAngleFromDisp(dispX, dispY); -var dijkstra = __webpack_require__(/*! ./dijkstra */ "./node_modules/graphlib/lib/alg/dijkstra.js"); -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); - -module.exports = dijkstraAll; - -function dijkstraAll(g, weightFunc, edgeFunc) { - return _.transform(g.nodes(), function(acc, v) { - acc[v] = dijkstra(g, v, weightFunc, edgeFunc); - }, {}); -} - - -/***/ }), - -/***/ "./node_modules/graphlib/lib/alg/dijkstra.js": -/*!***************************************************!*\ - !*** ./node_modules/graphlib/lib/alg/dijkstra.js ***! - \***************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); -var PriorityQueue = __webpack_require__(/*! ../data/priority-queue */ "./node_modules/graphlib/lib/data/priority-queue.js"); - -module.exports = dijkstra; - -var DEFAULT_WEIGHT_FUNC = _.constant(1); - -function dijkstra(g, source, weightFn, edgeFn) { - return runDijkstra(g, String(source), - weightFn || DEFAULT_WEIGHT_FUNC, - edgeFn || function(v) { return g.outEdges(v); }); -} - -function runDijkstra(g, source, weightFn, edgeFn) { - var results = {}; - var pq = new PriorityQueue(); - var v, vEntry; + // target + // - var updateNeighbors = function(edge) { - var w = edge.v !== v ? edge.v : edge.w; - var wEntry = results[w]; - var weight = weightFn(edge); - var distance = vEntry.distance + weight; + if (isSegments) { + dispX = endX - rs.segpts[rs.segpts.length - 2]; + dispY = endY - rs.segpts[rs.segpts.length - 1]; + } else if (isMultibezier || isCompound || isSelf || isBezier) { + var pts = rs.allpts; + var l = pts.length; + var bX = qbezierAt(pts[l - 6], pts[l - 4], pts[l - 2], 0.9); + var bY = qbezierAt(pts[l - 5], pts[l - 3], pts[l - 1], 0.9); + dispX = endX - bX; + dispY = endY - bY; + } else { + dispX = endX - midX; + dispY = endY - midY; + } + rs.tgtArrowAngle = getAngleFromDisp(dispX, dispY); +}; +BRp$d.getArrowWidth = BRp$d.getArrowHeight = function (edgeWidth, scale) { + var cache = this.arrowWidthCache = this.arrowWidthCache || {}; + var cachedVal = cache[edgeWidth + ', ' + scale]; + if (cachedVal) { + return cachedVal; + } + cachedVal = Math.max(Math.pow(edgeWidth * 13.37, 0.9), 29) * scale; + cache[edgeWidth + ', ' + scale] = cachedVal; + return cachedVal; +}; - if (weight < 0) { - throw new Error("dijkstra does not allow negative edge weights. " + - "Bad edge: " + edge + " Weight: " + weight); - } +var BRp$c = {}; +BRp$c.findMidptPtsEtc = function (edge, pairInfo) { + var posPts = pairInfo.posPts, + intersectionPts = pairInfo.intersectionPts, + vectorNormInverse = pairInfo.vectorNormInverse; + var midptPts; - if (distance < wEntry.distance) { - wEntry.distance = distance; - wEntry.predecessor = v; - pq.decrease(w, distance); - } + // n.b. assumes all edges in bezier bundle have same endpoints specified + var srcManEndpt = edge.pstyle('source-endpoint'); + var tgtManEndpt = edge.pstyle('target-endpoint'); + var haveManualEndPts = srcManEndpt.units != null && tgtManEndpt.units != null; + var recalcVectorNormInverse = function recalcVectorNormInverse(x1, y1, x2, y2) { + var dy = y2 - y1; + var dx = x2 - x1; + var l = Math.sqrt(dx * dx + dy * dy); + return { + x: -dy / l, + y: dx / l + }; }; - - g.nodes().forEach(function(v) { - var distance = v === source ? 0 : Number.POSITIVE_INFINITY; - results[v] = { distance: distance }; - pq.add(v, distance); - }); - - while (pq.size() > 0) { - v = pq.removeMin(); - vEntry = results[v]; - if (vEntry.distance === Number.POSITIVE_INFINITY) { + var edgeDistances = edge.pstyle('edge-distances').value; + switch (edgeDistances) { + case 'node-position': + midptPts = posPts; break; - } + case 'intersection': + midptPts = intersectionPts; + break; + case 'endpoints': + { + if (haveManualEndPts) { + var _this$manualEndptToPx = this.manualEndptToPx(edge.source()[0], srcManEndpt), + _this$manualEndptToPx2 = _slicedToArray(_this$manualEndptToPx, 2), + x1 = _this$manualEndptToPx2[0], + y1 = _this$manualEndptToPx2[1]; + var _this$manualEndptToPx3 = this.manualEndptToPx(edge.target()[0], tgtManEndpt), + _this$manualEndptToPx4 = _slicedToArray(_this$manualEndptToPx3, 2), + x2 = _this$manualEndptToPx4[0], + y2 = _this$manualEndptToPx4[1]; + var endPts = { + x1: x1, + y1: y1, + x2: x2, + y2: y2 + }; + vectorNormInverse = recalcVectorNormInverse(x1, y1, x2, y2); + midptPts = endPts; + } else { + warn("Edge ".concat(edge.id(), " has edge-distances:endpoints specified without manual endpoints specified via source-endpoint and target-endpoint. Falling back on edge-distances:intersection (default).")); + midptPts = intersectionPts; // back to default + } - edgeFn(v).forEach(updateNeighbors); + break; + } } + return { + midptPts: midptPts, + vectorNormInverse: vectorNormInverse + }; +}; +BRp$c.findHaystackPoints = function (edges) { + for (var i = 0; i < edges.length; i++) { + var edge = edges[i]; + var _p = edge._private; + var rs = _p.rscratch; + if (!rs.haystack) { + var angle = Math.random() * 2 * Math.PI; + rs.source = { + x: Math.cos(angle), + y: Math.sin(angle) + }; + angle = Math.random() * 2 * Math.PI; + rs.target = { + x: Math.cos(angle), + y: Math.sin(angle) + }; + } + var src = _p.source; + var tgt = _p.target; + var srcPos = src.position(); + var tgtPos = tgt.position(); + var srcW = src.width(); + var tgtW = tgt.width(); + var srcH = src.height(); + var tgtH = tgt.height(); + var radius = edge.pstyle('haystack-radius').value; + var halfRadius = radius / 2; // b/c have to half width/height - return results; -} - - -/***/ }), - -/***/ "./node_modules/graphlib/lib/alg/find-cycles.js": -/*!******************************************************!*\ - !*** ./node_modules/graphlib/lib/alg/find-cycles.js ***! - \******************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); -var tarjan = __webpack_require__(/*! ./tarjan */ "./node_modules/graphlib/lib/alg/tarjan.js"); + rs.haystackPts = rs.allpts = [rs.source.x * srcW * halfRadius + srcPos.x, rs.source.y * srcH * halfRadius + srcPos.y, rs.target.x * tgtW * halfRadius + tgtPos.x, rs.target.y * tgtH * halfRadius + tgtPos.y]; + rs.midX = (rs.allpts[0] + rs.allpts[2]) / 2; + rs.midY = (rs.allpts[1] + rs.allpts[3]) / 2; -module.exports = findCycles; + // always override as haystack in case set to different type previously + rs.edgeType = 'haystack'; + rs.haystack = true; + this.storeEdgeProjections(edge); + this.calculateArrowAngles(edge); + this.recalculateEdgeLabelProjections(edge); + this.calculateLabelAngles(edge); + } +}; +BRp$c.findSegmentsPoints = function (edge, pairInfo) { + // Segments (multiple straight lines) -function findCycles(g) { - return _.filter(tarjan(g), function(cmpt) { - return cmpt.length > 1 || (cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0])); - }); -} + var rs = edge._private.rscratch; + var segmentWs = edge.pstyle('segment-weights'); + var segmentDs = edge.pstyle('segment-distances'); + var segmentsN = Math.min(segmentWs.pfValue.length, segmentDs.pfValue.length); + rs.edgeType = 'segments'; + rs.segpts = []; + for (var s = 0; s < segmentsN; s++) { + var w = segmentWs.pfValue[s]; + var d = segmentDs.pfValue[s]; + var w1 = 1 - w; + var w2 = w; + var _this$findMidptPtsEtc = this.findMidptPtsEtc(edge, pairInfo), + midptPts = _this$findMidptPtsEtc.midptPts, + vectorNormInverse = _this$findMidptPtsEtc.vectorNormInverse; + var adjustedMidpt = { + x: midptPts.x1 * w1 + midptPts.x2 * w2, + y: midptPts.y1 * w1 + midptPts.y2 * w2 + }; + rs.segpts.push(adjustedMidpt.x + vectorNormInverse.x * d, adjustedMidpt.y + vectorNormInverse.y * d); + } +}; +BRp$c.findLoopPoints = function (edge, pairInfo, i, edgeIsUnbundled) { + // Self-edge + var rs = edge._private.rscratch; + var dirCounts = pairInfo.dirCounts, + srcPos = pairInfo.srcPos; + var ctrlptDists = edge.pstyle('control-point-distances'); + var ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[0] : undefined; + var loopDir = edge.pstyle('loop-direction').pfValue; + var loopSwp = edge.pstyle('loop-sweep').pfValue; + var stepSize = edge.pstyle('control-point-step-size').pfValue; + rs.edgeType = 'self'; + var j = i; + var loopDist = stepSize; + if (edgeIsUnbundled) { + j = 0; + loopDist = ctrlptDist; + } + var loopAngle = loopDir - Math.PI / 2; + var outAngle = loopAngle - loopSwp / 2; + var inAngle = loopAngle + loopSwp / 2; -/***/ }), + // increase by step size for overlapping loops, keyed on direction and sweep values + var dc = String(loopDir + '_' + loopSwp); + j = dirCounts[dc] === undefined ? dirCounts[dc] = 0 : ++dirCounts[dc]; + rs.ctrlpts = [srcPos.x + Math.cos(outAngle) * 1.4 * loopDist * (j / 3 + 1), srcPos.y + Math.sin(outAngle) * 1.4 * loopDist * (j / 3 + 1), srcPos.x + Math.cos(inAngle) * 1.4 * loopDist * (j / 3 + 1), srcPos.y + Math.sin(inAngle) * 1.4 * loopDist * (j / 3 + 1)]; +}; +BRp$c.findCompoundLoopPoints = function (edge, pairInfo, i, edgeIsUnbundled) { + // Compound edge -/***/ "./node_modules/graphlib/lib/alg/floyd-warshall.js": -/*!*********************************************************!*\ - !*** ./node_modules/graphlib/lib/alg/floyd-warshall.js ***! - \*********************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + var rs = edge._private.rscratch; + rs.edgeType = 'compound'; + var srcPos = pairInfo.srcPos, + tgtPos = pairInfo.tgtPos, + srcW = pairInfo.srcW, + srcH = pairInfo.srcH, + tgtW = pairInfo.tgtW, + tgtH = pairInfo.tgtH; + var stepSize = edge.pstyle('control-point-step-size').pfValue; + var ctrlptDists = edge.pstyle('control-point-distances'); + var ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[0] : undefined; + var j = i; + var loopDist = stepSize; + if (edgeIsUnbundled) { + j = 0; + loopDist = ctrlptDist; + } + var loopW = 50; + var loopaPos = { + x: srcPos.x - srcW / 2, + y: srcPos.y - srcH / 2 + }; + var loopbPos = { + x: tgtPos.x - tgtW / 2, + y: tgtPos.y - tgtH / 2 + }; + var loopPos = { + x: Math.min(loopaPos.x, loopbPos.x), + y: Math.min(loopaPos.y, loopbPos.y) + }; -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); + // avoids cases with impossible beziers + var minCompoundStretch = 0.5; + var compoundStretchA = Math.max(minCompoundStretch, Math.log(srcW * 0.01)); + var compoundStretchB = Math.max(minCompoundStretch, Math.log(tgtW * 0.01)); + rs.ctrlpts = [loopPos.x, loopPos.y - (1 + Math.pow(loopW, 1.12) / 100) * loopDist * (j / 3 + 1) * compoundStretchA, loopPos.x - (1 + Math.pow(loopW, 1.12) / 100) * loopDist * (j / 3 + 1) * compoundStretchB, loopPos.y]; +}; +BRp$c.findStraightEdgePoints = function (edge) { + // Straight edge within bundle -module.exports = floydWarshall; + edge._private.rscratch.edgeType = 'straight'; +}; +BRp$c.findBezierPoints = function (edge, pairInfo, i, edgeIsUnbundled, edgeIsSwapped) { + var rs = edge._private.rscratch; + var stepSize = edge.pstyle('control-point-step-size').pfValue; + var ctrlptDists = edge.pstyle('control-point-distances'); + var ctrlptWs = edge.pstyle('control-point-weights'); + var bezierN = ctrlptDists && ctrlptWs ? Math.min(ctrlptDists.value.length, ctrlptWs.value.length) : 1; + var ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[0] : undefined; + var ctrlptWeight = ctrlptWs.value[0]; -var DEFAULT_WEIGHT_FUNC = _.constant(1); + // (Multi)bezier -function floydWarshall(g, weightFn, edgeFn) { - return runFloydWarshall(g, - weightFn || DEFAULT_WEIGHT_FUNC, - edgeFn || function(v) { return g.outEdges(v); }); -} + var multi = edgeIsUnbundled; + rs.edgeType = multi ? 'multibezier' : 'bezier'; + rs.ctrlpts = []; + for (var b = 0; b < bezierN; b++) { + var normctrlptDist = (0.5 - pairInfo.eles.length / 2 + i) * stepSize * (edgeIsSwapped ? -1 : 1); + var manctrlptDist = void 0; + var sign = signum(normctrlptDist); + if (multi) { + ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[b] : stepSize; // fall back on step size + ctrlptWeight = ctrlptWs.value[b]; + } + if (edgeIsUnbundled) { + // multi or single unbundled + manctrlptDist = ctrlptDist; + } else { + manctrlptDist = ctrlptDist !== undefined ? sign * ctrlptDist : undefined; + } + var distanceFromMidpoint = manctrlptDist !== undefined ? manctrlptDist : normctrlptDist; + var w1 = 1 - ctrlptWeight; + var w2 = ctrlptWeight; + var _this$findMidptPtsEtc2 = this.findMidptPtsEtc(edge, pairInfo), + midptPts = _this$findMidptPtsEtc2.midptPts, + vectorNormInverse = _this$findMidptPtsEtc2.vectorNormInverse; + var adjustedMidpt = { + x: midptPts.x1 * w1 + midptPts.x2 * w2, + y: midptPts.y1 * w1 + midptPts.y2 * w2 + }; + rs.ctrlpts.push(adjustedMidpt.x + vectorNormInverse.x * distanceFromMidpoint, adjustedMidpt.y + vectorNormInverse.y * distanceFromMidpoint); + } +}; +BRp$c.findTaxiPoints = function (edge, pairInfo) { + // Taxicab geometry with two turns maximum -function runFloydWarshall(g, weightFn, edgeFn) { - var results = {}; - var nodes = g.nodes(); + var rs = edge._private.rscratch; + rs.edgeType = 'segments'; + var VERTICAL = 'vertical'; + var HORIZONTAL = 'horizontal'; + var LEFTWARD = 'leftward'; + var RIGHTWARD = 'rightward'; + var DOWNWARD = 'downward'; + var UPWARD = 'upward'; + var AUTO = 'auto'; + var posPts = pairInfo.posPts, + srcW = pairInfo.srcW, + srcH = pairInfo.srcH, + tgtW = pairInfo.tgtW, + tgtH = pairInfo.tgtH; + var edgeDistances = edge.pstyle('edge-distances').value; + var dIncludesNodeBody = edgeDistances !== 'node-position'; + var taxiDir = edge.pstyle('taxi-direction').value; + var rawTaxiDir = taxiDir; // unprocessed value + var taxiTurn = edge.pstyle('taxi-turn'); + var turnIsPercent = taxiTurn.units === '%'; + var taxiTurnPfVal = taxiTurn.pfValue; + var turnIsNegative = taxiTurnPfVal < 0; // i.e. from target side + var minD = edge.pstyle('taxi-turn-min-distance').pfValue; + var dw = dIncludesNodeBody ? (srcW + tgtW) / 2 : 0; + var dh = dIncludesNodeBody ? (srcH + tgtH) / 2 : 0; + var pdx = posPts.x2 - posPts.x1; + var pdy = posPts.y2 - posPts.y1; - nodes.forEach(function(v) { - results[v] = {}; - results[v][v] = { distance: 0 }; - nodes.forEach(function(w) { - if (v !== w) { - results[v][w] = { distance: Number.POSITIVE_INFINITY }; + // take away the effective w/h from the magnitude of the delta value + var subDWH = function subDWH(dxy, dwh) { + if (dxy > 0) { + return Math.max(dxy - dwh, 0); + } else { + return Math.min(dxy + dwh, 0); + } + }; + var dx = subDWH(pdx, dw); + var dy = subDWH(pdy, dh); + var isExplicitDir = false; + if (rawTaxiDir === AUTO) { + taxiDir = Math.abs(dx) > Math.abs(dy) ? HORIZONTAL : VERTICAL; + } else if (rawTaxiDir === UPWARD || rawTaxiDir === DOWNWARD) { + taxiDir = VERTICAL; + isExplicitDir = true; + } else if (rawTaxiDir === LEFTWARD || rawTaxiDir === RIGHTWARD) { + taxiDir = HORIZONTAL; + isExplicitDir = true; + } + var isVert = taxiDir === VERTICAL; + var l = isVert ? dy : dx; + var pl = isVert ? pdy : pdx; + var sgnL = signum(pl); + var forcedDir = false; + if (!(isExplicitDir && (turnIsPercent || turnIsNegative)) // forcing in this case would cause weird growing in the opposite direction + && (rawTaxiDir === DOWNWARD && pl < 0 || rawTaxiDir === UPWARD && pl > 0 || rawTaxiDir === LEFTWARD && pl > 0 || rawTaxiDir === RIGHTWARD && pl < 0)) { + sgnL *= -1; + l = sgnL * Math.abs(l); + forcedDir = true; + } + var d; + if (turnIsPercent) { + var p = taxiTurnPfVal < 0 ? 1 + taxiTurnPfVal : taxiTurnPfVal; + d = p * l; + } else { + var k = taxiTurnPfVal < 0 ? l : 0; + d = k + taxiTurnPfVal * sgnL; + } + var getIsTooClose = function getIsTooClose(d) { + return Math.abs(d) < minD || Math.abs(d) >= Math.abs(l); + }; + var isTooCloseSrc = getIsTooClose(d); + var isTooCloseTgt = getIsTooClose(Math.abs(l) - Math.abs(d)); + var isTooClose = isTooCloseSrc || isTooCloseTgt; + if (isTooClose && !forcedDir) { + // non-ideal routing + if (isVert) { + // vertical fallbacks + var lShapeInsideSrc = Math.abs(pl) <= srcH / 2; + var lShapeInsideTgt = Math.abs(pdx) <= tgtW / 2; + if (lShapeInsideSrc) { + // horizontal Z-shape (direction not respected) + var x = (posPts.x1 + posPts.x2) / 2; + var y1 = posPts.y1, + y2 = posPts.y2; + rs.segpts = [x, y1, x, y2]; + } else if (lShapeInsideTgt) { + // vertical Z-shape (distance not respected) + var y = (posPts.y1 + posPts.y2) / 2; + var x1 = posPts.x1, + x2 = posPts.x2; + rs.segpts = [x1, y, x2, y]; + } else { + // L-shape fallback (turn distance not respected, but works well with tree siblings) + rs.segpts = [posPts.x1, posPts.y2]; } - }); - edgeFn(v).forEach(function(edge) { - var w = edge.v === v ? edge.w : edge.v; - var d = weightFn(edge); - results[v][w] = { distance: d, predecessor: v }; - }); - }); + } else { + // horizontal fallbacks + var _lShapeInsideSrc = Math.abs(pl) <= srcW / 2; + var _lShapeInsideTgt = Math.abs(pdy) <= tgtH / 2; + if (_lShapeInsideSrc) { + // vertical Z-shape (direction not respected) + var _y = (posPts.y1 + posPts.y2) / 2; + var _x = posPts.x1, + _x2 = posPts.x2; + rs.segpts = [_x, _y, _x2, _y]; + } else if (_lShapeInsideTgt) { + // horizontal Z-shape (turn distance not respected) + var _x3 = (posPts.x1 + posPts.x2) / 2; + var _y2 = posPts.y1, + _y3 = posPts.y2; + rs.segpts = [_x3, _y2, _x3, _y3]; + } else { + // L-shape (turn distance not respected, but works well for tree siblings) + rs.segpts = [posPts.x2, posPts.y1]; + } + } + } else { + // ideal routing + if (isVert) { + var _y4 = posPts.y1 + d + (dIncludesNodeBody ? srcH / 2 * sgnL : 0); + var _x4 = posPts.x1, + _x5 = posPts.x2; + rs.segpts = [_x4, _y4, _x5, _y4]; + } else { + // horizontal + var _x6 = posPts.x1 + d + (dIncludesNodeBody ? srcW / 2 * sgnL : 0); + var _y5 = posPts.y1, + _y6 = posPts.y2; + rs.segpts = [_x6, _y5, _x6, _y6]; + } + } +}; +BRp$c.tryToCorrectInvalidPoints = function (edge, pairInfo) { + var rs = edge._private.rscratch; - nodes.forEach(function(k) { - var rowK = results[k]; - nodes.forEach(function(i) { - var rowI = results[i]; - nodes.forEach(function(j) { - var ik = rowI[k]; - var kj = rowK[j]; - var ij = rowI[j]; - var altDistance = ik.distance + kj.distance; - if (altDistance < ij.distance) { - ij.distance = altDistance; - ij.predecessor = kj.predecessor; - } - }); + // can only correct beziers for now... + if (rs.edgeType === 'bezier') { + var srcPos = pairInfo.srcPos, + tgtPos = pairInfo.tgtPos, + srcW = pairInfo.srcW, + srcH = pairInfo.srcH, + tgtW = pairInfo.tgtW, + tgtH = pairInfo.tgtH, + srcShape = pairInfo.srcShape, + tgtShape = pairInfo.tgtShape; + var badStart = !number$1(rs.startX) || !number$1(rs.startY); + var badAStart = !number$1(rs.arrowStartX) || !number$1(rs.arrowStartY); + var badEnd = !number$1(rs.endX) || !number$1(rs.endY); + var badAEnd = !number$1(rs.arrowEndX) || !number$1(rs.arrowEndY); + var minCpADistFactor = 3; + var arrowW = this.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.arrowShapeWidth; + var minCpADist = minCpADistFactor * arrowW; + var startACpDist = dist({ + x: rs.ctrlpts[0], + y: rs.ctrlpts[1] + }, { + x: rs.startX, + y: rs.startY }); - }); - - return results; -} - - -/***/ }), + var closeStartACp = startACpDist < minCpADist; + var endACpDist = dist({ + x: rs.ctrlpts[0], + y: rs.ctrlpts[1] + }, { + x: rs.endX, + y: rs.endY + }); + var closeEndACp = endACpDist < minCpADist; + var overlapping = false; + if (badStart || badAStart || closeStartACp) { + overlapping = true; -/***/ "./node_modules/graphlib/lib/alg/index.js": -/*!************************************************!*\ - !*** ./node_modules/graphlib/lib/alg/index.js ***! - \************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // project control point along line from src centre to outside the src shape + // (otherwise intersection will yield nothing) + var cpD = { + // delta + x: rs.ctrlpts[0] - srcPos.x, + y: rs.ctrlpts[1] - srcPos.y + }; + var cpL = Math.sqrt(cpD.x * cpD.x + cpD.y * cpD.y); // length of line + var cpM = { + // normalised delta + x: cpD.x / cpL, + y: cpD.y / cpL + }; + var radius = Math.max(srcW, srcH); + var cpProj = { + // *2 radius guarantees outside shape + x: rs.ctrlpts[0] + cpM.x * 2 * radius, + y: rs.ctrlpts[1] + cpM.y * 2 * radius + }; + var srcCtrlPtIntn = srcShape.intersectLine(srcPos.x, srcPos.y, srcW, srcH, cpProj.x, cpProj.y, 0); + if (closeStartACp) { + rs.ctrlpts[0] = rs.ctrlpts[0] + cpM.x * (minCpADist - startACpDist); + rs.ctrlpts[1] = rs.ctrlpts[1] + cpM.y * (minCpADist - startACpDist); + } else { + rs.ctrlpts[0] = srcCtrlPtIntn[0] + cpM.x * minCpADist; + rs.ctrlpts[1] = srcCtrlPtIntn[1] + cpM.y * minCpADist; + } + } + if (badEnd || badAEnd || closeEndACp) { + overlapping = true; -module.exports = { - components: __webpack_require__(/*! ./components */ "./node_modules/graphlib/lib/alg/components.js"), - dijkstra: __webpack_require__(/*! ./dijkstra */ "./node_modules/graphlib/lib/alg/dijkstra.js"), - dijkstraAll: __webpack_require__(/*! ./dijkstra-all */ "./node_modules/graphlib/lib/alg/dijkstra-all.js"), - findCycles: __webpack_require__(/*! ./find-cycles */ "./node_modules/graphlib/lib/alg/find-cycles.js"), - floydWarshall: __webpack_require__(/*! ./floyd-warshall */ "./node_modules/graphlib/lib/alg/floyd-warshall.js"), - isAcyclic: __webpack_require__(/*! ./is-acyclic */ "./node_modules/graphlib/lib/alg/is-acyclic.js"), - postorder: __webpack_require__(/*! ./postorder */ "./node_modules/graphlib/lib/alg/postorder.js"), - preorder: __webpack_require__(/*! ./preorder */ "./node_modules/graphlib/lib/alg/preorder.js"), - prim: __webpack_require__(/*! ./prim */ "./node_modules/graphlib/lib/alg/prim.js"), - tarjan: __webpack_require__(/*! ./tarjan */ "./node_modules/graphlib/lib/alg/tarjan.js"), - topsort: __webpack_require__(/*! ./topsort */ "./node_modules/graphlib/lib/alg/topsort.js") + // project control point along line from tgt centre to outside the tgt shape + // (otherwise intersection will yield nothing) + var _cpD = { + // delta + x: rs.ctrlpts[0] - tgtPos.x, + y: rs.ctrlpts[1] - tgtPos.y + }; + var _cpL = Math.sqrt(_cpD.x * _cpD.x + _cpD.y * _cpD.y); // length of line + var _cpM = { + // normalised delta + x: _cpD.x / _cpL, + y: _cpD.y / _cpL + }; + var _radius = Math.max(srcW, srcH); + var _cpProj = { + // *2 radius guarantees outside shape + x: rs.ctrlpts[0] + _cpM.x * 2 * _radius, + y: rs.ctrlpts[1] + _cpM.y * 2 * _radius + }; + var tgtCtrlPtIntn = tgtShape.intersectLine(tgtPos.x, tgtPos.y, tgtW, tgtH, _cpProj.x, _cpProj.y, 0); + if (closeEndACp) { + rs.ctrlpts[0] = rs.ctrlpts[0] + _cpM.x * (minCpADist - endACpDist); + rs.ctrlpts[1] = rs.ctrlpts[1] + _cpM.y * (minCpADist - endACpDist); + } else { + rs.ctrlpts[0] = tgtCtrlPtIntn[0] + _cpM.x * minCpADist; + rs.ctrlpts[1] = tgtCtrlPtIntn[1] + _cpM.y * minCpADist; + } + } + if (overlapping) { + // recalc endpts + this.findEndpoints(edge); + } + } }; +BRp$c.storeAllpts = function (edge) { + var rs = edge._private.rscratch; + if (rs.edgeType === 'multibezier' || rs.edgeType === 'bezier' || rs.edgeType === 'self' || rs.edgeType === 'compound') { + rs.allpts = []; + rs.allpts.push(rs.startX, rs.startY); + for (var b = 0; b + 1 < rs.ctrlpts.length; b += 2) { + // ctrl pt itself + rs.allpts.push(rs.ctrlpts[b], rs.ctrlpts[b + 1]); + // the midpt between ctrlpts as intermediate destination pts + if (b + 3 < rs.ctrlpts.length) { + rs.allpts.push((rs.ctrlpts[b] + rs.ctrlpts[b + 2]) / 2, (rs.ctrlpts[b + 1] + rs.ctrlpts[b + 3]) / 2); + } + } + rs.allpts.push(rs.endX, rs.endY); + var m, mt; + if (rs.ctrlpts.length / 2 % 2 === 0) { + m = rs.allpts.length / 2 - 1; + rs.midX = rs.allpts[m]; + rs.midY = rs.allpts[m + 1]; + } else { + m = rs.allpts.length / 2 - 3; + mt = 0.5; + rs.midX = qbezierAt(rs.allpts[m], rs.allpts[m + 2], rs.allpts[m + 4], mt); + rs.midY = qbezierAt(rs.allpts[m + 1], rs.allpts[m + 3], rs.allpts[m + 5], mt); + } + } else if (rs.edgeType === 'straight') { + // need to calc these after endpts + rs.allpts = [rs.startX, rs.startY, rs.endX, rs.endY]; -/***/ }), - -/***/ "./node_modules/graphlib/lib/alg/is-acyclic.js": -/*!*****************************************************!*\ - !*** ./node_modules/graphlib/lib/alg/is-acyclic.js ***! - \*****************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var topsort = __webpack_require__(/*! ./topsort */ "./node_modules/graphlib/lib/alg/topsort.js"); - -module.exports = isAcyclic; - -function isAcyclic(g) { - try { - topsort(g); - } catch (e) { - if (e instanceof topsort.CycleException) { - return false; + // default midpt for labels etc + rs.midX = (rs.startX + rs.endX + rs.arrowStartX + rs.arrowEndX) / 4; + rs.midY = (rs.startY + rs.endY + rs.arrowStartY + rs.arrowEndY) / 4; + } else if (rs.edgeType === 'segments') { + rs.allpts = []; + rs.allpts.push(rs.startX, rs.startY); + rs.allpts.push.apply(rs.allpts, rs.segpts); + rs.allpts.push(rs.endX, rs.endY); + if (rs.segpts.length % 4 === 0) { + var i2 = rs.segpts.length / 2; + var i1 = i2 - 2; + rs.midX = (rs.segpts[i1] + rs.segpts[i2]) / 2; + rs.midY = (rs.segpts[i1 + 1] + rs.segpts[i2 + 1]) / 2; + } else { + var _i = rs.segpts.length / 2 - 1; + rs.midX = rs.segpts[_i]; + rs.midY = rs.segpts[_i + 1]; } - throw e; } - return true; -} - - -/***/ }), +}; +BRp$c.checkForInvalidEdgeWarning = function (edge) { + var rs = edge[0]._private.rscratch; + if (rs.nodesOverlap || number$1(rs.startX) && number$1(rs.startY) && number$1(rs.endX) && number$1(rs.endY)) { + rs.loggedErr = false; + } else { + if (!rs.loggedErr) { + rs.loggedErr = true; + warn('Edge `' + edge.id() + '` has invalid endpoints and so it is impossible to draw. Adjust your edge style (e.g. control points) accordingly or use an alternative edge type. This is expected behaviour when the source node and the target node overlap.'); + } + } +}; +BRp$c.findEdgeControlPoints = function (edges) { + var _this = this; + if (!edges || edges.length === 0) { + return; + } + var r = this; + var cy = r.cy; + var hasCompounds = cy.hasCompoundNodes(); + var hashTable = { + map: new Map$1(), + get: function get(pairId) { + var map2 = this.map.get(pairId[0]); + if (map2 != null) { + return map2.get(pairId[1]); + } else { + return null; + } + }, + set: function set(pairId, val) { + var map2 = this.map.get(pairId[0]); + if (map2 == null) { + map2 = new Map$1(); + this.map.set(pairId[0], map2); + } + map2.set(pairId[1], val); + } + }; + var pairIds = []; + var haystackEdges = []; -/***/ "./node_modules/graphlib/lib/alg/postorder.js": -/*!****************************************************!*\ - !*** ./node_modules/graphlib/lib/alg/postorder.js ***! - \****************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // create a table of edge (src, tgt) => list of edges between them + for (var i = 0; i < edges.length; i++) { + var edge = edges[i]; + var _p = edge._private; + var curveStyle = edge.pstyle('curve-style').value; -var dfs = __webpack_require__(/*! ./dfs */ "./node_modules/graphlib/lib/alg/dfs.js"); + // ignore edges who are not to be displayed + // they shouldn't take up space + if (edge.removed() || !edge.takesUpSpace()) { + continue; + } + if (curveStyle === 'haystack') { + haystackEdges.push(edge); + continue; + } + var edgeIsUnbundled = curveStyle === 'unbundled-bezier' || curveStyle === 'segments' || curveStyle === 'straight' || curveStyle === 'straight-triangle' || curveStyle === 'taxi'; + var edgeIsBezier = curveStyle === 'unbundled-bezier' || curveStyle === 'bezier'; + var src = _p.source; + var tgt = _p.target; + var srcIndex = src.poolIndex(); + var tgtIndex = tgt.poolIndex(); + var pairId = [srcIndex, tgtIndex].sort(); + var tableEntry = hashTable.get(pairId); + if (tableEntry == null) { + tableEntry = { + eles: [] + }; + hashTable.set(pairId, tableEntry); + pairIds.push(pairId); + } + tableEntry.eles.push(edge); + if (edgeIsUnbundled) { + tableEntry.hasUnbundled = true; + } + if (edgeIsBezier) { + tableEntry.hasBezier = true; + } + } -module.exports = postorder; + // for each pair (src, tgt), create the ctrl pts + // Nested for loop is OK; total number of iterations for both loops = edgeCount + var _loop = function _loop(p) { + var pairId = pairIds[p]; + var pairInfo = hashTable.get(pairId); + var swappedpairInfo = void 0; + if (!pairInfo.hasUnbundled) { + var pllEdges = pairInfo.eles[0].parallelEdges().filter(function (e) { + return e.isBundledBezier(); + }); + clearArray(pairInfo.eles); + pllEdges.forEach(function (edge) { + return pairInfo.eles.push(edge); + }); -function postorder(g, vs) { - return dfs(g, vs, "post"); -} + // for each pair id, the edges should be sorted by index + pairInfo.eles.sort(function (edge1, edge2) { + return edge1.poolIndex() - edge2.poolIndex(); + }); + } + var firstEdge = pairInfo.eles[0]; + var src = firstEdge.source(); + var tgt = firstEdge.target(); + // make sure src/tgt distinction is consistent w.r.t. pairId + if (src.poolIndex() > tgt.poolIndex()) { + var temp = src; + src = tgt; + tgt = temp; + } + var srcPos = pairInfo.srcPos = src.position(); + var tgtPos = pairInfo.tgtPos = tgt.position(); + var srcW = pairInfo.srcW = src.outerWidth(); + var srcH = pairInfo.srcH = src.outerHeight(); + var tgtW = pairInfo.tgtW = tgt.outerWidth(); + var tgtH = pairInfo.tgtH = tgt.outerHeight(); + var srcShape = pairInfo.srcShape = r.nodeShapes[_this.getNodeShape(src)]; + var tgtShape = pairInfo.tgtShape = r.nodeShapes[_this.getNodeShape(tgt)]; + pairInfo.dirCounts = { + 'north': 0, + 'west': 0, + 'south': 0, + 'east': 0, + 'northwest': 0, + 'southwest': 0, + 'northeast': 0, + 'southeast': 0 + }; + for (var _i2 = 0; _i2 < pairInfo.eles.length; _i2++) { + var _edge = pairInfo.eles[_i2]; + var rs = _edge[0]._private.rscratch; + var _curveStyle = _edge.pstyle('curve-style').value; + var _edgeIsUnbundled = _curveStyle === 'unbundled-bezier' || _curveStyle === 'segments' || _curveStyle === 'taxi'; -/***/ }), + // whether the normalised pair order is the reverse of the edge's src-tgt order + var edgeIsSwapped = !src.same(_edge.source()); + if (!pairInfo.calculatedIntersection && src !== tgt && (pairInfo.hasBezier || pairInfo.hasUnbundled)) { + pairInfo.calculatedIntersection = true; -/***/ "./node_modules/graphlib/lib/alg/preorder.js": -/*!***************************************************!*\ - !*** ./node_modules/graphlib/lib/alg/preorder.js ***! - \***************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // pt outside src shape to calc distance/displacement from src to tgt + var srcOutside = srcShape.intersectLine(srcPos.x, srcPos.y, srcW, srcH, tgtPos.x, tgtPos.y, 0); + var srcIntn = pairInfo.srcIntn = srcOutside; -var dfs = __webpack_require__(/*! ./dfs */ "./node_modules/graphlib/lib/alg/dfs.js"); + // pt outside tgt shape to calc distance/displacement from src to tgt + var tgtOutside = tgtShape.intersectLine(tgtPos.x, tgtPos.y, tgtW, tgtH, srcPos.x, srcPos.y, 0); + var tgtIntn = pairInfo.tgtIntn = tgtOutside; + var intersectionPts = pairInfo.intersectionPts = { + x1: srcOutside[0], + x2: tgtOutside[0], + y1: srcOutside[1], + y2: tgtOutside[1] + }; + var posPts = pairInfo.posPts = { + x1: srcPos.x, + x2: tgtPos.x, + y1: srcPos.y, + y2: tgtPos.y + }; + var dy = tgtOutside[1] - srcOutside[1]; + var dx = tgtOutside[0] - srcOutside[0]; + var l = Math.sqrt(dx * dx + dy * dy); + var vector = pairInfo.vector = { + x: dx, + y: dy + }; + var vectorNorm = pairInfo.vectorNorm = { + x: vector.x / l, + y: vector.y / l + }; + var vectorNormInverse = { + x: -vectorNorm.y, + y: vectorNorm.x + }; -module.exports = preorder; + // if node shapes overlap, then no ctrl pts to draw + pairInfo.nodesOverlap = !number$1(l) || tgtShape.checkPoint(srcOutside[0], srcOutside[1], 0, tgtW, tgtH, tgtPos.x, tgtPos.y) || srcShape.checkPoint(tgtOutside[0], tgtOutside[1], 0, srcW, srcH, srcPos.x, srcPos.y); + pairInfo.vectorNormInverse = vectorNormInverse; + swappedpairInfo = { + nodesOverlap: pairInfo.nodesOverlap, + dirCounts: pairInfo.dirCounts, + calculatedIntersection: true, + hasBezier: pairInfo.hasBezier, + hasUnbundled: pairInfo.hasUnbundled, + eles: pairInfo.eles, + srcPos: tgtPos, + tgtPos: srcPos, + srcW: tgtW, + srcH: tgtH, + tgtW: srcW, + tgtH: srcH, + srcIntn: tgtIntn, + tgtIntn: srcIntn, + srcShape: tgtShape, + tgtShape: srcShape, + posPts: { + x1: posPts.x2, + y1: posPts.y2, + x2: posPts.x1, + y2: posPts.y1 + }, + intersectionPts: { + x1: intersectionPts.x2, + y1: intersectionPts.y2, + x2: intersectionPts.x1, + y2: intersectionPts.y1 + }, + vector: { + x: -vector.x, + y: -vector.y + }, + vectorNorm: { + x: -vectorNorm.x, + y: -vectorNorm.y + }, + vectorNormInverse: { + x: -vectorNormInverse.x, + y: -vectorNormInverse.y + } + }; + } + var passedPairInfo = edgeIsSwapped ? swappedpairInfo : pairInfo; + rs.nodesOverlap = passedPairInfo.nodesOverlap; + rs.srcIntn = passedPairInfo.srcIntn; + rs.tgtIntn = passedPairInfo.tgtIntn; + if (hasCompounds && (src.isParent() || src.isChild() || tgt.isParent() || tgt.isChild()) && (src.parents().anySame(tgt) || tgt.parents().anySame(src) || src.same(tgt) && src.isParent())) { + _this.findCompoundLoopPoints(_edge, passedPairInfo, _i2, _edgeIsUnbundled); + } else if (src === tgt) { + _this.findLoopPoints(_edge, passedPairInfo, _i2, _edgeIsUnbundled); + } else if (_curveStyle === 'segments') { + _this.findSegmentsPoints(_edge, passedPairInfo); + } else if (_curveStyle === 'taxi') { + _this.findTaxiPoints(_edge, passedPairInfo); + } else if (_curveStyle === 'straight' || !_edgeIsUnbundled && pairInfo.eles.length % 2 === 1 && _i2 === Math.floor(pairInfo.eles.length / 2)) { + _this.findStraightEdgePoints(_edge); + } else { + _this.findBezierPoints(_edge, passedPairInfo, _i2, _edgeIsUnbundled, edgeIsSwapped); + } + _this.findEndpoints(_edge); + _this.tryToCorrectInvalidPoints(_edge, passedPairInfo); + _this.checkForInvalidEdgeWarning(_edge); + _this.storeAllpts(_edge); + _this.storeEdgeProjections(_edge); + _this.calculateArrowAngles(_edge); + _this.recalculateEdgeLabelProjections(_edge); + _this.calculateLabelAngles(_edge); + } // for pair edges + }; + for (var p = 0; p < pairIds.length; p++) { + _loop(p); + } // for pair ids -function preorder(g, vs) { - return dfs(g, vs, "pre"); + // haystacks avoid the expense of pairInfo stuff (intersections etc.) + this.findHaystackPoints(haystackEdges); +}; +function getPts(pts) { + var retPts = []; + if (pts == null) { + return; + } + for (var i = 0; i < pts.length; i += 2) { + var x = pts[i]; + var y = pts[i + 1]; + retPts.push({ + x: x, + y: y + }); + } + return retPts; } +BRp$c.getSegmentPoints = function (edge) { + var rs = edge[0]._private.rscratch; + var type = rs.edgeType; + if (type === 'segments') { + this.recalculateRenderedStyle(edge); + return getPts(rs.segpts); + } +}; +BRp$c.getControlPoints = function (edge) { + var rs = edge[0]._private.rscratch; + var type = rs.edgeType; + if (type === 'bezier' || type === 'multibezier' || type === 'self' || type === 'compound') { + this.recalculateRenderedStyle(edge); + return getPts(rs.ctrlpts); + } +}; +BRp$c.getEdgeMidpoint = function (edge) { + var rs = edge[0]._private.rscratch; + this.recalculateRenderedStyle(edge); + return { + x: rs.midX, + y: rs.midY + }; +}; +var BRp$b = {}; +BRp$b.manualEndptToPx = function (node, prop) { + var r = this; + var npos = node.position(); + var w = node.outerWidth(); + var h = node.outerHeight(); + if (prop.value.length === 2) { + var p = [prop.pfValue[0], prop.pfValue[1]]; + if (prop.units[0] === '%') { + p[0] = p[0] * w; + } + if (prop.units[1] === '%') { + p[1] = p[1] * h; + } + p[0] += npos.x; + p[1] += npos.y; + return p; + } else { + var angle = prop.pfValue[0]; + angle = -Math.PI / 2 + angle; // start at 12 o'clock -/***/ }), - -/***/ "./node_modules/graphlib/lib/alg/prim.js": -/*!***********************************************!*\ - !*** ./node_modules/graphlib/lib/alg/prim.js ***! - \***********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); -var Graph = __webpack_require__(/*! ../graph */ "./node_modules/graphlib/lib/graph.js"); -var PriorityQueue = __webpack_require__(/*! ../data/priority-queue */ "./node_modules/graphlib/lib/data/priority-queue.js"); - -module.exports = prim; + var l = 2 * Math.max(w, h); + var _p = [npos.x + Math.cos(angle) * l, npos.y + Math.sin(angle) * l]; + return r.nodeShapes[this.getNodeShape(node)].intersectLine(npos.x, npos.y, w, h, _p[0], _p[1], 0); + } +}; +BRp$b.findEndpoints = function (edge) { + var r = this; + var intersect; + var source = edge.source()[0]; + var target = edge.target()[0]; + var srcPos = source.position(); + var tgtPos = target.position(); + var tgtArShape = edge.pstyle('target-arrow-shape').value; + var srcArShape = edge.pstyle('source-arrow-shape').value; + var tgtDist = edge.pstyle('target-distance-from-node').pfValue; + var srcDist = edge.pstyle('source-distance-from-node').pfValue; + var curveStyle = edge.pstyle('curve-style').value; + var rs = edge._private.rscratch; + var et = rs.edgeType; + var taxi = curveStyle === 'taxi'; + var self = et === 'self' || et === 'compound'; + var bezier = et === 'bezier' || et === 'multibezier' || self; + var multi = et !== 'bezier'; + var lines = et === 'straight' || et === 'segments'; + var segments = et === 'segments'; + var hasEndpts = bezier || multi || lines; + var overrideEndpts = self || taxi; + var srcManEndpt = edge.pstyle('source-endpoint'); + var srcManEndptVal = overrideEndpts ? 'outside-to-node' : srcManEndpt.value; + var tgtManEndpt = edge.pstyle('target-endpoint'); + var tgtManEndptVal = overrideEndpts ? 'outside-to-node' : tgtManEndpt.value; + rs.srcManEndpt = srcManEndpt; + rs.tgtManEndpt = tgtManEndpt; + var p1; // last known point of edge on target side + var p2; // last known point of edge on source side -function prim(g, weightFunc) { - var result = new Graph(); - var parents = {}; - var pq = new PriorityQueue(); - var v; + var p1_i; // point to intersect with target shape + var p2_i; // point to intersect with source shape - function updateNeighbors(edge) { - var w = edge.v === v ? edge.w : edge.v; - var pri = pq.priority(w); - if (pri !== undefined) { - var edgeWeight = weightFunc(edge); - if (edgeWeight < pri) { - parents[w] = v; - pq.decrease(w, edgeWeight); + if (bezier) { + var cpStart = [rs.ctrlpts[0], rs.ctrlpts[1]]; + var cpEnd = multi ? [rs.ctrlpts[rs.ctrlpts.length - 2], rs.ctrlpts[rs.ctrlpts.length - 1]] : cpStart; + p1 = cpEnd; + p2 = cpStart; + } else if (lines) { + var srcArrowFromPt = !segments ? [tgtPos.x, tgtPos.y] : rs.segpts.slice(0, 2); + var tgtArrowFromPt = !segments ? [srcPos.x, srcPos.y] : rs.segpts.slice(rs.segpts.length - 2); + p1 = tgtArrowFromPt; + p2 = srcArrowFromPt; + } + if (tgtManEndptVal === 'inside-to-node') { + intersect = [tgtPos.x, tgtPos.y]; + } else if (tgtManEndpt.units) { + intersect = this.manualEndptToPx(target, tgtManEndpt); + } else if (tgtManEndptVal === 'outside-to-line') { + intersect = rs.tgtIntn; // use cached value from ctrlpt calc + } else { + if (tgtManEndptVal === 'outside-to-node' || tgtManEndptVal === 'outside-to-node-or-label') { + p1_i = p1; + } else if (tgtManEndptVal === 'outside-to-line' || tgtManEndptVal === 'outside-to-line-or-label') { + p1_i = [srcPos.x, srcPos.y]; + } + intersect = r.nodeShapes[this.getNodeShape(target)].intersectLine(tgtPos.x, tgtPos.y, target.outerWidth(), target.outerHeight(), p1_i[0], p1_i[1], 0); + if (tgtManEndptVal === 'outside-to-node-or-label' || tgtManEndptVal === 'outside-to-line-or-label') { + var trs = target._private.rscratch; + var lw = trs.labelWidth; + var lh = trs.labelHeight; + var lx = trs.labelX; + var ly = trs.labelY; + var lw2 = lw / 2; + var lh2 = lh / 2; + var va = target.pstyle('text-valign').value; + if (va === 'top') { + ly -= lh2; + } else if (va === 'bottom') { + ly += lh2; + } + var ha = target.pstyle('text-halign').value; + if (ha === 'left') { + lx -= lw2; + } else if (ha === 'right') { + lx += lw2; + } + var labelIntersect = polygonIntersectLine(p1_i[0], p1_i[1], [lx - lw2, ly - lh2, lx + lw2, ly - lh2, lx + lw2, ly + lh2, lx - lw2, ly + lh2], tgtPos.x, tgtPos.y); + if (labelIntersect.length > 0) { + var refPt = srcPos; + var intSqdist = sqdist(refPt, array2point(intersect)); + var labIntSqdist = sqdist(refPt, array2point(labelIntersect)); + var minSqDist = intSqdist; + if (labIntSqdist < intSqdist) { + intersect = labelIntersect; + minSqDist = labIntSqdist; + } + if (labelIntersect.length > 2) { + var labInt2SqDist = sqdist(refPt, { + x: labelIntersect[2], + y: labelIntersect[3] + }); + if (labInt2SqDist < minSqDist) { + intersect = [labelIntersect[2], labelIntersect[3]]; + } + } + } + } + } + var arrowEnd = shortenIntersection(intersect, p1, r.arrowShapes[tgtArShape].spacing(edge) + tgtDist); + var edgeEnd = shortenIntersection(intersect, p1, r.arrowShapes[tgtArShape].gap(edge) + tgtDist); + rs.endX = edgeEnd[0]; + rs.endY = edgeEnd[1]; + rs.arrowEndX = arrowEnd[0]; + rs.arrowEndY = arrowEnd[1]; + if (srcManEndptVal === 'inside-to-node') { + intersect = [srcPos.x, srcPos.y]; + } else if (srcManEndpt.units) { + intersect = this.manualEndptToPx(source, srcManEndpt); + } else if (srcManEndptVal === 'outside-to-line') { + intersect = rs.srcIntn; // use cached value from ctrlpt calc + } else { + if (srcManEndptVal === 'outside-to-node' || srcManEndptVal === 'outside-to-node-or-label') { + p2_i = p2; + } else if (srcManEndptVal === 'outside-to-line' || srcManEndptVal === 'outside-to-line-or-label') { + p2_i = [tgtPos.x, tgtPos.y]; + } + intersect = r.nodeShapes[this.getNodeShape(source)].intersectLine(srcPos.x, srcPos.y, source.outerWidth(), source.outerHeight(), p2_i[0], p2_i[1], 0); + if (srcManEndptVal === 'outside-to-node-or-label' || srcManEndptVal === 'outside-to-line-or-label') { + var srs = source._private.rscratch; + var _lw = srs.labelWidth; + var _lh = srs.labelHeight; + var _lx = srs.labelX; + var _ly = srs.labelY; + var _lw2 = _lw / 2; + var _lh2 = _lh / 2; + var _va = source.pstyle('text-valign').value; + if (_va === 'top') { + _ly -= _lh2; + } else if (_va === 'bottom') { + _ly += _lh2; + } + var _ha = source.pstyle('text-halign').value; + if (_ha === 'left') { + _lx -= _lw2; + } else if (_ha === 'right') { + _lx += _lw2; + } + var _labelIntersect = polygonIntersectLine(p2_i[0], p2_i[1], [_lx - _lw2, _ly - _lh2, _lx + _lw2, _ly - _lh2, _lx + _lw2, _ly + _lh2, _lx - _lw2, _ly + _lh2], srcPos.x, srcPos.y); + if (_labelIntersect.length > 0) { + var _refPt = tgtPos; + var _intSqdist = sqdist(_refPt, array2point(intersect)); + var _labIntSqdist = sqdist(_refPt, array2point(_labelIntersect)); + var _minSqDist = _intSqdist; + if (_labIntSqdist < _intSqdist) { + intersect = [_labelIntersect[0], _labelIntersect[1]]; + _minSqDist = _labIntSqdist; + } + if (_labelIntersect.length > 2) { + var _labInt2SqDist = sqdist(_refPt, { + x: _labelIntersect[2], + y: _labelIntersect[3] + }); + if (_labInt2SqDist < _minSqDist) { + intersect = [_labelIntersect[2], _labelIntersect[3]]; + } + } } } } - - if (g.nodeCount() === 0) { - return result; - } - - _.each(g.nodes(), function(v) { - pq.add(v, Number.POSITIVE_INFINITY); - result.setNode(v); - }); - - // Start from an arbitrary node - pq.decrease(g.nodes()[0], 0); - - var init = false; - while (pq.size() > 0) { - v = pq.removeMin(); - if (_.has(parents, v)) { - result.setEdge(v, parents[v]); - } else if (init) { - throw new Error("Input graph is not connected: " + g); + var arrowStart = shortenIntersection(intersect, p2, r.arrowShapes[srcArShape].spacing(edge) + srcDist); + var edgeStart = shortenIntersection(intersect, p2, r.arrowShapes[srcArShape].gap(edge) + srcDist); + rs.startX = edgeStart[0]; + rs.startY = edgeStart[1]; + rs.arrowStartX = arrowStart[0]; + rs.arrowStartY = arrowStart[1]; + if (hasEndpts) { + if (!number$1(rs.startX) || !number$1(rs.startY) || !number$1(rs.endX) || !number$1(rs.endY)) { + rs.badLine = true; } else { - init = true; + rs.badLine = false; } - - g.nodeEdges(v).forEach(updateNeighbors); } +}; +BRp$b.getSourceEndpoint = function (edge) { + var rs = edge[0]._private.rscratch; + this.recalculateRenderedStyle(edge); + switch (rs.edgeType) { + case 'haystack': + return { + x: rs.haystackPts[0], + y: rs.haystackPts[1] + }; + default: + return { + x: rs.arrowStartX, + y: rs.arrowStartY + }; + } +}; +BRp$b.getTargetEndpoint = function (edge) { + var rs = edge[0]._private.rscratch; + this.recalculateRenderedStyle(edge); + switch (rs.edgeType) { + case 'haystack': + return { + x: rs.haystackPts[2], + y: rs.haystackPts[3] + }; + default: + return { + x: rs.arrowEndX, + y: rs.arrowEndY + }; + } +}; - return result; -} - - -/***/ }), - -/***/ "./node_modules/graphlib/lib/alg/tarjan.js": -/*!*************************************************!*\ - !*** ./node_modules/graphlib/lib/alg/tarjan.js ***! - \*************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); - -module.exports = tarjan; - -function tarjan(g) { - var index = 0; - var stack = []; - var visited = {}; // node id -> { onStack, lowlink, index } - var results = []; - - function dfs(v) { - var entry = visited[v] = { - onStack: true, - lowlink: index, - index: index++ - }; - stack.push(v); - - g.successors(v).forEach(function(w) { - if (!_.has(visited, w)) { - dfs(w); - entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink); - } else if (visited[w].onStack) { - entry.lowlink = Math.min(entry.lowlink, visited[w].index); - } +var BRp$a = {}; +function pushBezierPts(r, edge, pts) { + var qbezierAt$1 = function qbezierAt$1(p1, p2, p3, t) { + return qbezierAt(p1, p2, p3, t); + }; + var _p = edge._private; + var bpts = _p.rstyle.bezierPts; + for (var i = 0; i < r.bezierProjPcts.length; i++) { + var p = r.bezierProjPcts[i]; + bpts.push({ + x: qbezierAt$1(pts[0], pts[2], pts[4], p), + y: qbezierAt$1(pts[1], pts[3], pts[5], p) }); - - if (entry.lowlink === entry.index) { - var cmpt = []; - var w; - do { - w = stack.pop(); - visited[w].onStack = false; - cmpt.push(w); - } while (v !== w); - results.push(cmpt); - } } - - g.nodes().forEach(function(v) { - if (!_.has(visited, v)) { - dfs(v); - } - }); - - return results; } +BRp$a.storeEdgeProjections = function (edge) { + var _p = edge._private; + var rs = _p.rscratch; + var et = rs.edgeType; - -/***/ }), - -/***/ "./node_modules/graphlib/lib/alg/topsort.js": -/*!**************************************************!*\ - !*** ./node_modules/graphlib/lib/alg/topsort.js ***! - \**************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); - -module.exports = topsort; -topsort.CycleException = CycleException; - -function topsort(g) { - var visited = {}; - var stack = {}; - var results = []; - - function visit(node) { - if (_.has(stack, node)) { - throw new CycleException(); + // clear the cached points state + _p.rstyle.bezierPts = null; + _p.rstyle.linePts = null; + _p.rstyle.haystackPts = null; + if (et === 'multibezier' || et === 'bezier' || et === 'self' || et === 'compound') { + _p.rstyle.bezierPts = []; + for (var i = 0; i + 5 < rs.allpts.length; i += 4) { + pushBezierPts(this, edge, rs.allpts.slice(i, i + 6)); } - - if (!_.has(visited, node)) { - stack[node] = true; - visited[node] = true; - _.each(g.predecessors(node), visit); - delete stack[node]; - results.push(node); + } else if (et === 'segments') { + var lpts = _p.rstyle.linePts = []; + for (var i = 0; i + 1 < rs.allpts.length; i += 2) { + lpts.push({ + x: rs.allpts[i], + y: rs.allpts[i + 1] + }); } + } else if (et === 'haystack') { + var hpts = rs.haystackPts; + _p.rstyle.haystackPts = [{ + x: hpts[0], + y: hpts[1] + }, { + x: hpts[2], + y: hpts[3] + }]; } - - _.each(g.sinks(), visit); - - if (_.size(visited) !== g.nodeCount()) { - throw new CycleException(); - } - - return results; -} - -function CycleException() {} -CycleException.prototype = new Error(); // must be an instance of Error to pass testing - -/***/ }), - -/***/ "./node_modules/graphlib/lib/data/priority-queue.js": -/*!**********************************************************!*\ - !*** ./node_modules/graphlib/lib/data/priority-queue.js ***! - \**********************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); - -module.exports = PriorityQueue; - -/** - * A min-priority queue data structure. This algorithm is derived from Cormen, - * et al., "Introduction to Algorithms". The basic idea of a min-priority - * queue is that you can efficiently (in O(1) time) get the smallest key in - * the queue. Adding and removing elements takes O(log n) time. A key can - * have its priority decreased in O(log n) time. - */ -function PriorityQueue() { - this._arr = []; - this._keyIndices = {}; -} - -/** - * Returns the number of elements in the queue. Takes `O(1)` time. - */ -PriorityQueue.prototype.size = function() { - return this._arr.length; -}; - -/** - * Returns the keys that are in the queue. Takes `O(n)` time. - */ -PriorityQueue.prototype.keys = function() { - return this._arr.map(function(x) { return x.key; }); + _p.rstyle.arrowWidth = this.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.arrowShapeWidth; }; - -/** - * Returns `true` if **key** is in the queue and `false` if not. - */ -PriorityQueue.prototype.has = function(key) { - return _.has(this._keyIndices, key); +BRp$a.recalculateEdgeProjections = function (edges) { + this.findEdgeControlPoints(edges); }; -/** - * Returns the priority for **key**. If **key** is not present in the queue - * then this function returns `undefined`. Takes `O(1)` time. - * - * @param {Object} key - */ -PriorityQueue.prototype.priority = function(key) { - var index = this._keyIndices[key]; - if (index !== undefined) { - return this._arr[index].priority; - } -}; +/* global document */ -/** - * Returns the key for the minimum element in this queue. If the queue is - * empty this function throws an Error. Takes `O(1)` time. - */ -PriorityQueue.prototype.min = function() { - if (this.size() === 0) { - throw new Error("Queue underflow"); +var BRp$9 = {}; +BRp$9.recalculateNodeLabelProjection = function (node) { + var content = node.pstyle('label').strValue; + if (emptyString(content)) { + return; } - return this._arr[0].key; -}; - -/** - * Inserts a new key into the priority queue. If the key already exists in - * the queue this function returns `false`; otherwise it will return `true`. - * Takes `O(n)` time. - * - * @param {Object} key the key to add - * @param {Number} priority the initial priority for the key - */ -PriorityQueue.prototype.add = function(key, priority) { - var keyIndices = this._keyIndices; - key = String(key); - if (!_.has(keyIndices, key)) { - var arr = this._arr; - var index = arr.length; - keyIndices[key] = index; - arr.push({key: key, priority: priority}); - this._decrease(index); - return true; + var textX, textY; + var _p = node._private; + var nodeWidth = node.width(); + var nodeHeight = node.height(); + var padding = node.padding(); + var nodePos = node.position(); + var textHalign = node.pstyle('text-halign').strValue; + var textValign = node.pstyle('text-valign').strValue; + var rs = _p.rscratch; + var rstyle = _p.rstyle; + switch (textHalign) { + case 'left': + textX = nodePos.x - nodeWidth / 2 - padding; + break; + case 'right': + textX = nodePos.x + nodeWidth / 2 + padding; + break; + default: + // e.g. center + textX = nodePos.x; } - return false; -}; - -/** - * Removes and returns the smallest key in the queue. Takes `O(log n)` time. - */ -PriorityQueue.prototype.removeMin = function() { - this._swap(0, this._arr.length - 1); - var min = this._arr.pop(); - delete this._keyIndices[min.key]; - this._heapify(0); - return min.key; -}; - -/** - * Decreases the priority for **key** to **priority**. If the new priority is - * greater than the previous priority, this function will throw an Error. - * - * @param {Object} key the key for which to raise priority - * @param {Number} priority the new priority for the key - */ -PriorityQueue.prototype.decrease = function(key, priority) { - var index = this._keyIndices[key]; - if (priority > this._arr[index].priority) { - throw new Error("New priority is greater than current priority. " + - "Key: " + key + " Old: " + this._arr[index].priority + " New: " + priority); + switch (textValign) { + case 'top': + textY = nodePos.y - nodeHeight / 2 - padding; + break; + case 'bottom': + textY = nodePos.y + nodeHeight / 2 + padding; + break; + default: + // e.g. middle + textY = nodePos.y; } - this._arr[index].priority = priority; - this._decrease(index); + rs.labelX = textX; + rs.labelY = textY; + rstyle.labelX = textX; + rstyle.labelY = textY; + this.calculateLabelAngles(node); + this.applyLabelDimensions(node); }; - -PriorityQueue.prototype._heapify = function(i) { - var arr = this._arr; - var l = 2 * i; - var r = l + 1; - var largest = i; - if (l < arr.length) { - largest = arr[l].priority < arr[largest].priority ? l : largest; - if (r < arr.length) { - largest = arr[r].priority < arr[largest].priority ? r : largest; - } - if (largest !== i) { - this._swap(i, largest); - this._heapify(largest); - } +var lineAngleFromDelta = function lineAngleFromDelta(dx, dy) { + var angle = Math.atan(dy / dx); + if (dx === 0 && angle < 0) { + angle = angle * -1; } + return angle; }; - -PriorityQueue.prototype._decrease = function(index) { - var arr = this._arr; - var priority = arr[index].priority; - var parent; - while (index !== 0) { - parent = index >> 1; - if (arr[parent].priority < priority) { - break; - } - this._swap(index, parent); - index = parent; - } +var lineAngle = function lineAngle(p0, p1) { + var dx = p1.x - p0.x; + var dy = p1.y - p0.y; + return lineAngleFromDelta(dx, dy); }; - -PriorityQueue.prototype._swap = function(i, j) { - var arr = this._arr; - var keyIndices = this._keyIndices; - var origArrI = arr[i]; - var origArrJ = arr[j]; - arr[i] = origArrJ; - arr[j] = origArrI; - keyIndices[origArrJ.key] = i; - keyIndices[origArrI.key] = j; +var bezierAngle = function bezierAngle(p0, p1, p2, t) { + var t0 = bound(0, t - 0.001, 1); + var t1 = bound(0, t + 0.001, 1); + var lp0 = qbezierPtAt(p0, p1, p2, t0); + var lp1 = qbezierPtAt(p0, p1, p2, t1); + return lineAngle(lp0, lp1); }; +BRp$9.recalculateEdgeLabelProjections = function (edge) { + var p; + var _p = edge._private; + var rs = _p.rscratch; + var r = this; + var content = { + mid: edge.pstyle('label').strValue, + source: edge.pstyle('source-label').strValue, + target: edge.pstyle('target-label').strValue + }; + if (content.mid || content.source || content.target) ; else { + return; // no labels => no calcs + } + // add center point to style so bounding box calculations can use it + // + p = { + x: rs.midX, + y: rs.midY + }; + var setRs = function setRs(propName, prefix, value) { + setPrefixedProperty(_p.rscratch, propName, prefix, value); + setPrefixedProperty(_p.rstyle, propName, prefix, value); + }; + setRs('labelX', null, p.x); + setRs('labelY', null, p.y); + var midAngle = lineAngleFromDelta(rs.midDispX, rs.midDispY); + setRs('labelAutoAngle', null, midAngle); + var createControlPointInfo = function createControlPointInfo() { + if (createControlPointInfo.cache) { + return createControlPointInfo.cache; + } // use cache so only 1x per edge -/***/ }), - -/***/ "./node_modules/graphlib/lib/graph.js": -/*!********************************************!*\ - !*** ./node_modules/graphlib/lib/graph.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -"use strict"; - - -var _ = __webpack_require__(/*! ./lodash */ "./node_modules/graphlib/lib/lodash.js"); - -module.exports = Graph; - -var DEFAULT_EDGE_NAME = "\x00"; -var GRAPH_NODE = "\x00"; -var EDGE_KEY_DELIM = "\x01"; - -// Implementation notes: -// -// * Node id query functions should return string ids for the nodes -// * Edge id query functions should return an "edgeObj", edge object, that is -// composed of enough information to uniquely identify an edge: {v, w, name}. -// * Internally we use an "edgeId", a stringified form of the edgeObj, to -// reference edges. This is because we need a performant way to look these -// edges up and, object properties, which have string keys, are the closest -// we're going to get to a performant hashtable in JavaScript. - -function Graph(opts) { - this._isDirected = _.has(opts, "directed") ? opts.directed : true; - this._isMultigraph = _.has(opts, "multigraph") ? opts.multigraph : false; - this._isCompound = _.has(opts, "compound") ? opts.compound : false; - - // Label for the graph itself - this._label = undefined; - - // Defaults to be set when creating a new node - this._defaultNodeLabelFn = _.constant(undefined); - - // Defaults to be set when creating a new edge - this._defaultEdgeLabelFn = _.constant(undefined); - - // v -> label - this._nodes = {}; - - if (this._isCompound) { - // v -> parent - this._parent = {}; - - // v -> children - this._children = {}; - this._children[GRAPH_NODE] = {}; - } - - // v -> edgeObj - this._in = {}; - - // u -> v -> Number - this._preds = {}; - - // v -> edgeObj - this._out = {}; - - // v -> w -> Number - this._sucs = {}; - - // e -> edgeObj - this._edgeObjs = {}; - - // e -> label - this._edgeLabels = {}; -} + var ctrlpts = []; -/* Number of nodes in the graph. Should only be changed by the implementation. */ -Graph.prototype._nodeCount = 0; + // store each ctrlpt info init + for (var i = 0; i + 5 < rs.allpts.length; i += 4) { + var p0 = { + x: rs.allpts[i], + y: rs.allpts[i + 1] + }; + var p1 = { + x: rs.allpts[i + 2], + y: rs.allpts[i + 3] + }; // ctrlpt + var p2 = { + x: rs.allpts[i + 4], + y: rs.allpts[i + 5] + }; + ctrlpts.push({ + p0: p0, + p1: p1, + p2: p2, + startDist: 0, + length: 0, + segments: [] + }); + } + var bpts = _p.rstyle.bezierPts; + var nProjs = r.bezierProjPcts.length; + function addSegment(cp, p0, p1, t0, t1) { + var length = dist(p0, p1); + var prevSegment = cp.segments[cp.segments.length - 1]; + var segment = { + p0: p0, + p1: p1, + t0: t0, + t1: t1, + startDist: prevSegment ? prevSegment.startDist + prevSegment.length : 0, + length: length + }; + cp.segments.push(segment); + cp.length += length; + } -/* Number of edges in the graph. Should only be changed by the implementation. */ -Graph.prototype._edgeCount = 0; + // update each ctrlpt with segment info + for (var _i = 0; _i < ctrlpts.length; _i++) { + var cp = ctrlpts[_i]; + var prevCp = ctrlpts[_i - 1]; + if (prevCp) { + cp.startDist = prevCp.startDist + prevCp.length; + } + addSegment(cp, cp.p0, bpts[_i * nProjs], 0, r.bezierProjPcts[0]); // first + for (var j = 0; j < nProjs - 1; j++) { + addSegment(cp, bpts[_i * nProjs + j], bpts[_i * nProjs + j + 1], r.bezierProjPcts[j], r.bezierProjPcts[j + 1]); + } + addSegment(cp, bpts[_i * nProjs + nProjs - 1], cp.p2, r.bezierProjPcts[nProjs - 1], 1); // last + } -/* === Graph functions ========= */ + return createControlPointInfo.cache = ctrlpts; + }; + var calculateEndProjection = function calculateEndProjection(prefix) { + var angle; + var isSrc = prefix === 'source'; + if (!content[prefix]) { + return; + } + var offset = edge.pstyle(prefix + '-text-offset').pfValue; + switch (rs.edgeType) { + case 'self': + case 'compound': + case 'bezier': + case 'multibezier': + { + var cps = createControlPointInfo(); + var selected; + var startDist = 0; + var totalDist = 0; -Graph.prototype.isDirected = function() { - return this._isDirected; + // find the segment we're on + for (var i = 0; i < cps.length; i++) { + var _cp = cps[isSrc ? i : cps.length - 1 - i]; + for (var j = 0; j < _cp.segments.length; j++) { + var _seg = _cp.segments[isSrc ? j : _cp.segments.length - 1 - j]; + var lastSeg = i === cps.length - 1 && j === _cp.segments.length - 1; + startDist = totalDist; + totalDist += _seg.length; + if (totalDist >= offset || lastSeg) { + selected = { + cp: _cp, + segment: _seg + }; + break; + } + } + if (selected) { + break; + } + } + var cp = selected.cp; + var seg = selected.segment; + var tSegment = (offset - startDist) / seg.length; + var segDt = seg.t1 - seg.t0; + var t = isSrc ? seg.t0 + segDt * tSegment : seg.t1 - segDt * tSegment; + t = bound(0, t, 1); + p = qbezierPtAt(cp.p0, cp.p1, cp.p2, t); + angle = bezierAngle(cp.p0, cp.p1, cp.p2, t); + break; + } + case 'straight': + case 'segments': + case 'haystack': + { + var d = 0, + di, + d0; + var p0, p1; + var l = rs.allpts.length; + for (var _i2 = 0; _i2 + 3 < l; _i2 += 2) { + if (isSrc) { + p0 = { + x: rs.allpts[_i2], + y: rs.allpts[_i2 + 1] + }; + p1 = { + x: rs.allpts[_i2 + 2], + y: rs.allpts[_i2 + 3] + }; + } else { + p0 = { + x: rs.allpts[l - 2 - _i2], + y: rs.allpts[l - 1 - _i2] + }; + p1 = { + x: rs.allpts[l - 4 - _i2], + y: rs.allpts[l - 3 - _i2] + }; + } + di = dist(p0, p1); + d0 = d; + d += di; + if (d >= offset) { + break; + } + } + var pD = offset - d0; + var _t = pD / di; + _t = bound(0, _t, 1); + p = lineAt(p0, p1, _t); + angle = lineAngle(p0, p1); + break; + } + } + setRs('labelX', prefix, p.x); + setRs('labelY', prefix, p.y); + setRs('labelAutoAngle', prefix, angle); + }; + calculateEndProjection('source'); + calculateEndProjection('target'); + this.applyLabelDimensions(edge); }; - -Graph.prototype.isMultigraph = function() { - return this._isMultigraph; +BRp$9.applyLabelDimensions = function (ele) { + this.applyPrefixedLabelDimensions(ele); + if (ele.isEdge()) { + this.applyPrefixedLabelDimensions(ele, 'source'); + this.applyPrefixedLabelDimensions(ele, 'target'); + } }; - -Graph.prototype.isCompound = function() { - return this._isCompound; +BRp$9.applyPrefixedLabelDimensions = function (ele, prefix) { + var _p = ele._private; + var text = this.getLabelText(ele, prefix); + var labelDims = this.calculateLabelDimensions(ele, text); + var lineHeight = ele.pstyle('line-height').pfValue; + var textWrap = ele.pstyle('text-wrap').strValue; + var lines = getPrefixedProperty(_p.rscratch, 'labelWrapCachedLines', prefix) || []; + var numLines = textWrap !== 'wrap' ? 1 : Math.max(lines.length, 1); + var normPerLineHeight = labelDims.height / numLines; + var labelLineHeight = normPerLineHeight * lineHeight; + var width = labelDims.width; + var height = labelDims.height + (numLines - 1) * (lineHeight - 1) * normPerLineHeight; + setPrefixedProperty(_p.rstyle, 'labelWidth', prefix, width); + setPrefixedProperty(_p.rscratch, 'labelWidth', prefix, width); + setPrefixedProperty(_p.rstyle, 'labelHeight', prefix, height); + setPrefixedProperty(_p.rscratch, 'labelHeight', prefix, height); + setPrefixedProperty(_p.rscratch, 'labelLineHeight', prefix, labelLineHeight); }; +BRp$9.getLabelText = function (ele, prefix) { + var _p = ele._private; + var pfd = prefix ? prefix + '-' : ''; + var text = ele.pstyle(pfd + 'label').strValue; + var textTransform = ele.pstyle('text-transform').value; + var rscratch = function rscratch(propName, value) { + if (value) { + setPrefixedProperty(_p.rscratch, propName, prefix, value); + return value; + } else { + return getPrefixedProperty(_p.rscratch, propName, prefix); + } + }; -Graph.prototype.setGraph = function(label) { - this._label = label; - return this; -}; + // for empty text, skip all processing + if (!text) { + return ''; + } + if (textTransform == 'none') ; else if (textTransform == 'uppercase') { + text = text.toUpperCase(); + } else if (textTransform == 'lowercase') { + text = text.toLowerCase(); + } + var wrapStyle = ele.pstyle('text-wrap').value; + if (wrapStyle === 'wrap') { + var labelKey = rscratch('labelKey'); -Graph.prototype.graph = function() { - return this._label; -}; + // save recalc if the label is the same as before + if (labelKey != null && rscratch('labelWrapKey') === labelKey) { + return rscratch('labelWrapCachedText'); + } + var zwsp = "\u200B"; + var lines = text.split('\n'); + var maxW = ele.pstyle('text-max-width').pfValue; + var overflow = ele.pstyle('text-overflow-wrap').value; + var overflowAny = overflow === 'anywhere'; + var wrappedLines = []; + var wordsRegex = /[\s\u200b]+/; + var wordSeparator = overflowAny ? '' : ' '; + for (var l = 0; l < lines.length; l++) { + var line = lines[l]; + var lineDims = this.calculateLabelDimensions(ele, line); + var lineW = lineDims.width; + if (overflowAny) { + var processedLine = line.split('').join(zwsp); + line = processedLine; + } + if (lineW > maxW) { + // line is too long + var words = line.split(wordsRegex); + var subline = ''; + for (var w = 0; w < words.length; w++) { + var word = words[w]; + var testLine = subline.length === 0 ? word : subline + wordSeparator + word; + var testDims = this.calculateLabelDimensions(ele, testLine); + var testW = testDims.width; + if (testW <= maxW) { + // word fits on current line + subline += word + wordSeparator; + } else { + // word starts new line + if (subline) { + wrappedLines.push(subline); + } + subline = word + wordSeparator; + } + } + // if there's remaining text, put it in a wrapped line + if (!subline.match(/^[\s\u200b]+$/)) { + wrappedLines.push(subline); + } + } else { + // line is already short enough + wrappedLines.push(line); + } + } // for -/* === Node functions ========== */ + rscratch('labelWrapCachedLines', wrappedLines); + text = rscratch('labelWrapCachedText', wrappedLines.join('\n')); + rscratch('labelWrapKey', labelKey); + } else if (wrapStyle === 'ellipsis') { + var _maxW = ele.pstyle('text-max-width').pfValue; + var ellipsized = ''; + var ellipsis = "\u2026"; + var incLastCh = false; + if (this.calculateLabelDimensions(ele, text).width < _maxW) { + // the label already fits + return text; + } + for (var i = 0; i < text.length; i++) { + var widthWithNextCh = this.calculateLabelDimensions(ele, ellipsized + text[i] + ellipsis).width; + if (widthWithNextCh > _maxW) { + break; + } + ellipsized += text[i]; + if (i === text.length - 1) { + incLastCh = true; + } + } + if (!incLastCh) { + ellipsized += ellipsis; + } + return ellipsized; + } // if ellipsize -Graph.prototype.setDefaultNodeLabel = function(newDefault) { - if (!_.isFunction(newDefault)) { - newDefault = _.constant(newDefault); + return text; +}; +BRp$9.getLabelJustification = function (ele) { + var justification = ele.pstyle('text-justification').strValue; + var textHalign = ele.pstyle('text-halign').strValue; + if (justification === 'auto') { + if (ele.isNode()) { + switch (textHalign) { + case 'left': + return 'right'; + case 'right': + return 'left'; + default: + return 'center'; + } + } else { + return 'center'; + } + } else { + return justification; } - this._defaultNodeLabelFn = newDefault; - return this; }; - -Graph.prototype.nodeCount = function() { - return this._nodeCount; +BRp$9.calculateLabelDimensions = function (ele, text) { + var r = this; + var cacheKey = hashString(text, ele._private.labelDimsKey); + var cache = r.labelDimCache || (r.labelDimCache = []); + var existingVal = cache[cacheKey]; + if (existingVal != null) { + return existingVal; + } + var padding = 0; // add padding around text dims, as the measurement isn't that accurate + var fStyle = ele.pstyle('font-style').strValue; + var size = ele.pstyle('font-size').pfValue; + var family = ele.pstyle('font-family').strValue; + var weight = ele.pstyle('font-weight').strValue; + var canvas = this.labelCalcCanvas; + var c2d = this.labelCalcCanvasContext; + if (!canvas) { + canvas = this.labelCalcCanvas = document.createElement('canvas'); + c2d = this.labelCalcCanvasContext = canvas.getContext('2d'); + var ds = canvas.style; + ds.position = 'absolute'; + ds.left = '-9999px'; + ds.top = '-9999px'; + ds.zIndex = '-1'; + ds.visibility = 'hidden'; + ds.pointerEvents = 'none'; + } + c2d.font = "".concat(fStyle, " ").concat(weight, " ").concat(size, "px ").concat(family); + var width = 0; + var height = 0; + var lines = text.split('\n'); + for (var i = 0; i < lines.length; i++) { + var line = lines[i]; + var metrics = c2d.measureText(line); + var w = Math.ceil(metrics.width); + var h = size; + width = Math.max(w, width); + height += h; + } + width += padding; + height += padding; + return cache[cacheKey] = { + width: width, + height: height + }; }; - -Graph.prototype.nodes = function() { - return _.keys(this._nodes); +BRp$9.calculateLabelAngle = function (ele, prefix) { + var _p = ele._private; + var rs = _p.rscratch; + var isEdge = ele.isEdge(); + var prefixDash = prefix ? prefix + '-' : ''; + var rot = ele.pstyle(prefixDash + 'text-rotation'); + var rotStr = rot.strValue; + if (rotStr === 'none') { + return 0; + } else if (isEdge && rotStr === 'autorotate') { + return rs.labelAutoAngle; + } else if (rotStr === 'autorotate') { + return 0; + } else { + return rot.pfValue; + } }; - -Graph.prototype.sources = function() { - var self = this; - return _.filter(this.nodes(), function(v) { - return _.isEmpty(self._in[v]); - }); +BRp$9.calculateLabelAngles = function (ele) { + var r = this; + var isEdge = ele.isEdge(); + var _p = ele._private; + var rs = _p.rscratch; + rs.labelAngle = r.calculateLabelAngle(ele); + if (isEdge) { + rs.sourceLabelAngle = r.calculateLabelAngle(ele, 'source'); + rs.targetLabelAngle = r.calculateLabelAngle(ele, 'target'); + } }; -Graph.prototype.sinks = function() { - var self = this; - return _.filter(this.nodes(), function(v) { - return _.isEmpty(self._out[v]); - }); +var BRp$8 = {}; +var TOO_SMALL_CUT_RECT = 28; +var warnedCutRect = false; +BRp$8.getNodeShape = function (node) { + var r = this; + var shape = node.pstyle('shape').value; + if (shape === 'cutrectangle' && (node.width() < TOO_SMALL_CUT_RECT || node.height() < TOO_SMALL_CUT_RECT)) { + if (!warnedCutRect) { + warn('The `cutrectangle` node shape can not be used at small sizes so `rectangle` is used instead'); + warnedCutRect = true; + } + return 'rectangle'; + } + if (node.isParent()) { + if (shape === 'rectangle' || shape === 'roundrectangle' || shape === 'round-rectangle' || shape === 'cutrectangle' || shape === 'cut-rectangle' || shape === 'barrel') { + return shape; + } else { + return 'rectangle'; + } + } + if (shape === 'polygon') { + var points = node.pstyle('shape-polygon-points').value; + return r.nodeShapes.makePolygon(points).name; + } + return shape; }; -Graph.prototype.setNodes = function(vs, value) { - var args = arguments; - var self = this; - _.each(vs, function(v) { - if (args.length > 1) { - self.setNode(v, value); - } else { - self.setNode(v); +var BRp$7 = {}; +BRp$7.registerCalculationListeners = function () { + var cy = this.cy; + var elesToUpdate = cy.collection(); + var r = this; + var enqueue = function enqueue(eles) { + var dirtyStyleCaches = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + elesToUpdate.merge(eles); + if (dirtyStyleCaches) { + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var _p = ele._private; + var rstyle = _p.rstyle; + rstyle.clean = false; + rstyle.cleanConnected = false; + } } + }; + r.binder(cy).on('bounds.* dirty.*', function onDirtyBounds(e) { + var ele = e.target; + enqueue(ele); + }).on('style.* background.*', function onDirtyStyle(e) { + var ele = e.target; + enqueue(ele, false); }); - return this; -}; + var updateEleCalcs = function updateEleCalcs(willDraw) { + if (willDraw) { + var fns = r.onUpdateEleCalcsFns; -Graph.prototype.setNode = function(v, value) { - if (_.has(this._nodes, v)) { - if (arguments.length > 1) { - this._nodes[v] = value; + // because we need to have up-to-date style (e.g. stylesheet mappers) + // before calculating rendered style (and pstyle might not be called yet) + elesToUpdate.cleanStyle(); + for (var i = 0; i < elesToUpdate.length; i++) { + var ele = elesToUpdate[i]; + var rstyle = ele._private.rstyle; + if (ele.isNode() && !rstyle.cleanConnected) { + enqueue(ele.connectedEdges()); + rstyle.cleanConnected = true; + } + } + if (fns) { + for (var _i = 0; _i < fns.length; _i++) { + var fn = fns[_i]; + fn(willDraw, elesToUpdate); + } + } + r.recalculateRenderedStyle(elesToUpdate); + elesToUpdate = cy.collection(); } - return this; - } - - this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v); - if (this._isCompound) { - this._parent[v] = GRAPH_NODE; - this._children[v] = {}; - this._children[GRAPH_NODE][v] = true; - } - this._in[v] = {}; - this._preds[v] = {}; - this._out[v] = {}; - this._sucs[v] = {}; - ++this._nodeCount; - return this; -}; - -Graph.prototype.node = function(v) { - return this._nodes[v]; + }; + r.flushRenderedStyleQueue = function () { + updateEleCalcs(true); + }; + r.beforeRender(updateEleCalcs, r.beforeRenderPriorities.eleCalcs); }; - -Graph.prototype.hasNode = function(v) { - return _.has(this._nodes, v); +BRp$7.onUpdateEleCalcs = function (fn) { + var fns = this.onUpdateEleCalcsFns = this.onUpdateEleCalcsFns || []; + fns.push(fn); }; +BRp$7.recalculateRenderedStyle = function (eles, useCache) { + var isCleanConnected = function isCleanConnected(ele) { + return ele._private.rstyle.cleanConnected; + }; + var edges = []; + var nodes = []; -Graph.prototype.removeNode = function(v) { - var self = this; - if (_.has(this._nodes, v)) { - var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); }; - delete this._nodes[v]; - if (this._isCompound) { - this._removeFromParentsChildList(v); - delete this._parent[v]; - _.each(this.children(v), function(child) { - self.setParent(child); - }); - delete this._children[v]; - } - _.each(_.keys(this._in[v]), removeEdge); - delete this._in[v]; - delete this._preds[v]; - _.each(_.keys(this._out[v]), removeEdge); - delete this._out[v]; - delete this._sucs[v]; - --this._nodeCount; + // the renderer can't be used for calcs when destroyed, e.g. ele.boundingBox() + if (this.destroyed) { + return; } - return this; -}; -Graph.prototype.setParent = function(v, parent) { - if (!this._isCompound) { - throw new Error("Cannot set parent in a non-compound graph"); + // use cache by default for perf + if (useCache === undefined) { + useCache = true; } + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var _p = ele._private; + var rstyle = _p.rstyle; - if (_.isUndefined(parent)) { - parent = GRAPH_NODE; - } else { - // Coerce parent to string - parent += ""; - for (var ancestor = parent; - !_.isUndefined(ancestor); - ancestor = this.parent(ancestor)) { - if (ancestor === v) { - throw new Error("Setting " + parent+ " as parent of " + v + - " would create a cycle"); - } + // an edge may be implicitly dirty b/c of one of its connected nodes + // (and a request for recalc may come in between frames) + if (ele.isEdge() && (!isCleanConnected(ele.source()) || !isCleanConnected(ele.target()))) { + rstyle.clean = false; } - this.setNode(parent); - } - - this.setNode(v); - this._removeFromParentsChildList(v); - this._parent[v] = parent; - this._children[parent][v] = true; - return this; -}; - -Graph.prototype._removeFromParentsChildList = function(v) { - delete this._children[this._parent[v]][v]; -}; + // only update if dirty and in graph + if (useCache && rstyle.clean || ele.removed()) { + continue; + } -Graph.prototype.parent = function(v) { - if (this._isCompound) { - var parent = this._parent[v]; - if (parent !== GRAPH_NODE) { - return parent; + // only update if not display: none + if (ele.pstyle('display').value === 'none') { + continue; + } + if (_p.group === 'nodes') { + nodes.push(ele); + } else { + // edges + edges.push(ele); } + rstyle.clean = true; } -}; -Graph.prototype.children = function(v) { - if (_.isUndefined(v)) { - v = GRAPH_NODE; + // update node data from projections + for (var _i2 = 0; _i2 < nodes.length; _i2++) { + var _ele = nodes[_i2]; + var _p2 = _ele._private; + var _rstyle = _p2.rstyle; + var pos = _ele.position(); + this.recalculateNodeLabelProjection(_ele); + _rstyle.nodeX = pos.x; + _rstyle.nodeY = pos.y; + _rstyle.nodeW = _ele.pstyle('width').pfValue; + _rstyle.nodeH = _ele.pstyle('height').pfValue; } + this.recalculateEdgeProjections(edges); - if (this._isCompound) { - var children = this._children[v]; - if (children) { - return _.keys(children); - } - } else if (v === GRAPH_NODE) { - return this.nodes(); - } else if (this.hasNode(v)) { - return []; - } -}; + // update edge data from projections + for (var _i3 = 0; _i3 < edges.length; _i3++) { + var _ele2 = edges[_i3]; + var _p3 = _ele2._private; + var _rstyle2 = _p3.rstyle; + var rs = _p3.rscratch; -Graph.prototype.predecessors = function(v) { - var predsV = this._preds[v]; - if (predsV) { - return _.keys(predsV); + // update rstyle positions + _rstyle2.srcX = rs.arrowStartX; + _rstyle2.srcY = rs.arrowStartY; + _rstyle2.tgtX = rs.arrowEndX; + _rstyle2.tgtY = rs.arrowEndY; + _rstyle2.midX = rs.midX; + _rstyle2.midY = rs.midY; + _rstyle2.labelAngle = rs.labelAngle; + _rstyle2.sourceLabelAngle = rs.sourceLabelAngle; + _rstyle2.targetLabelAngle = rs.targetLabelAngle; } }; -Graph.prototype.successors = function(v) { - var sucsV = this._sucs[v]; - if (sucsV) { - return _.keys(sucsV); +var BRp$6 = {}; +BRp$6.updateCachedGrabbedEles = function () { + var eles = this.cachedZSortedEles; + if (!eles) { + // just let this be recalculated on the next z sort tick + return; + } + eles.drag = []; + eles.nondrag = []; + var grabTargets = []; + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var rs = ele._private.rscratch; + if (ele.grabbed() && !ele.isParent()) { + grabTargets.push(ele); + } else if (rs.inDragLayer) { + eles.drag.push(ele); + } else { + eles.nondrag.push(ele); + } } -}; -Graph.prototype.neighbors = function(v) { - var preds = this.predecessors(v); - if (preds) { - return _.union(preds, this.successors(v)); + // put the grab target nodes last so it's on top of its neighbourhood + for (var i = 0; i < grabTargets.length; i++) { + var ele = grabTargets[i]; + eles.drag.push(ele); } }; - -Graph.prototype.isLeaf = function (v) { - var neighbors; - if (this.isDirected()) { - neighbors = this.successors(v); +BRp$6.invalidateCachedZSortedEles = function () { + this.cachedZSortedEles = null; +}; +BRp$6.getCachedZSortedEles = function (forceRecalc) { + if (forceRecalc || !this.cachedZSortedEles) { + var eles = this.cy.mutableElements().toArray(); + eles.sort(zIndexSort); + eles.interactive = eles.filter(function (ele) { + return ele.interactive(); + }); + this.cachedZSortedEles = eles; + this.updateCachedGrabbedEles(); } else { - neighbors = this.neighbors(v); + eles = this.cachedZSortedEles; } - return neighbors.length === 0; + return eles; }; -Graph.prototype.filterNodes = function(filter) { - var copy = new this.constructor({ - directed: this._isDirected, - multigraph: this._isMultigraph, - compound: this._isCompound - }); - - copy.setGraph(this.graph()); +var BRp$5 = {}; +[BRp$e, BRp$d, BRp$c, BRp$b, BRp$a, BRp$9, BRp$8, BRp$7, BRp$6].forEach(function (props) { + extend(BRp$5, props); +}); - var self = this; - _.each(this._nodes, function(value, v) { - if (filter(v)) { - copy.setNode(v, value); +var BRp$4 = {}; +BRp$4.getCachedImage = function (url, crossOrigin, onLoad) { + var r = this; + var imageCache = r.imageCache = r.imageCache || {}; + var cache = imageCache[url]; + if (cache) { + if (!cache.image.complete) { + cache.image.addEventListener('load', onLoad); } - }); + return cache.image; + } else { + cache = imageCache[url] = imageCache[url] || {}; + var image = cache.image = new Image(); // eslint-disable-line no-undef - _.each(this._edgeObjs, function(e) { - if (copy.hasNode(e.v) && copy.hasNode(e.w)) { - copy.setEdge(e, self.edge(e)); - } - }); + image.addEventListener('load', onLoad); + image.addEventListener('error', function () { + image.error = true; + }); - var parents = {}; - function findParent(v) { - var parent = self.parent(v); - if (parent === undefined || copy.hasNode(parent)) { - parents[v] = parent; - return parent; - } else if (parent in parents) { - return parents[parent]; - } else { - return findParent(parent); + // #1582 safari doesn't load data uris with crossOrigin properly + // https://bugs.webkit.org/show_bug.cgi?id=123978 + var dataUriPrefix = 'data:'; + var isDataUri = url.substring(0, dataUriPrefix.length).toLowerCase() === dataUriPrefix; + if (!isDataUri) { + // if crossorigin is 'null'(stringified), then manually set it to null + crossOrigin = crossOrigin === 'null' ? null : crossOrigin; + image.crossOrigin = crossOrigin; // prevent tainted canvas } - } - if (this._isCompound) { - _.each(copy.nodes(), function(v) { - copy.setParent(v, findParent(v)); - }); + image.src = url; + return image; } - - return copy; }; -/* === Edge functions ========== */ +var BRp$3 = {}; -Graph.prototype.setDefaultEdgeLabel = function(newDefault) { - if (!_.isFunction(newDefault)) { - newDefault = _.constant(newDefault); +/* global document, window, ResizeObserver, MutationObserver */ + +BRp$3.registerBinding = function (target, event, handler, useCapture) { + // eslint-disable-line no-unused-vars + var args = Array.prototype.slice.apply(arguments, [1]); // copy + var b = this.binder(target); + return b.on.apply(b, args); +}; +BRp$3.binder = function (tgt) { + var r = this; + var containerWindow = r.cy.window(); + var tgtIsDom = tgt === containerWindow || tgt === containerWindow.document || tgt === containerWindow.document.body || domElement(tgt); + if (r.supportsPassiveEvents == null) { + // from https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection + var supportsPassive = false; + try { + var opts = Object.defineProperty({}, 'passive', { + get: function get() { + supportsPassive = true; + return true; + } + }); + containerWindow.addEventListener('test', null, opts); + } catch (err) { + // not supported + } + r.supportsPassiveEvents = supportsPassive; } - this._defaultEdgeLabelFn = newDefault; - return this; + var on = function on(event, handler, useCapture) { + var args = Array.prototype.slice.call(arguments); + if (tgtIsDom && r.supportsPassiveEvents) { + // replace useCapture w/ opts obj + args[2] = { + capture: useCapture != null ? useCapture : false, + passive: false, + once: false + }; + } + r.bindings.push({ + target: tgt, + args: args + }); + (tgt.addEventListener || tgt.on).apply(tgt, args); + return this; + }; + return { + on: on, + addEventListener: on, + addListener: on, + bind: on + }; }; - -Graph.prototype.edgeCount = function() { - return this._edgeCount; +BRp$3.nodeIsDraggable = function (node) { + return node && node.isNode() && !node.locked() && node.grabbable(); }; - -Graph.prototype.edges = function() { - return _.values(this._edgeObjs); +BRp$3.nodeIsGrabbable = function (node) { + return this.nodeIsDraggable(node) && node.interactive(); }; - -Graph.prototype.setPath = function(vs, value) { - var self = this; - var args = arguments; - _.reduce(vs, function(v, w) { - if (args.length > 1) { - self.setEdge(v, w, value); - } else { - self.setEdge(v, w); +BRp$3.load = function () { + var r = this; + var containerWindow = r.cy.window(); + var isSelected = function isSelected(ele) { + return ele.selected(); + }; + var triggerEvents = function triggerEvents(target, names, e, position) { + if (target == null) { + target = r.cy; } - return w; - }); - return this; -}; + for (var i = 0; i < names.length; i++) { + var name = names[i]; + target.emit({ + originalEvent: e, + type: name, + position: position + }); + } + }; + var isMultSelKeyDown = function isMultSelKeyDown(e) { + return e.shiftKey || e.metaKey || e.ctrlKey; // maybe e.altKey + }; -/* - * setEdge(v, w, [value, [name]]) - * setEdge({ v, w, [name] }, [value]) - */ -Graph.prototype.setEdge = function() { - var v, w, name, value; - var valueSpecified = false; - var arg0 = arguments[0]; + var allowPanningPassthrough = function allowPanningPassthrough(down, downs) { + var allowPassthrough = true; + if (r.cy.hasCompoundNodes() && down && down.pannable()) { + // a grabbable compound node below the ele => no passthrough panning + for (var i = 0; downs && i < downs.length; i++) { + var down = downs[i]; - if (typeof arg0 === "object" && arg0 !== null && "v" in arg0) { - v = arg0.v; - w = arg0.w; - name = arg0.name; - if (arguments.length === 2) { - value = arguments[1]; - valueSpecified = true; + //if any parent node in event hierarchy isn't pannable, reject passthrough + if (down.isNode() && down.isParent() && !down.pannable()) { + allowPassthrough = false; + break; + } + } + } else { + allowPassthrough = true; } - } else { - v = arg0; - w = arguments[1]; - name = arguments[3]; - if (arguments.length > 2) { - value = arguments[2]; - valueSpecified = true; + return allowPassthrough; + }; + var setGrabbed = function setGrabbed(ele) { + ele[0]._private.grabbed = true; + }; + var setFreed = function setFreed(ele) { + ele[0]._private.grabbed = false; + }; + var setInDragLayer = function setInDragLayer(ele) { + ele[0]._private.rscratch.inDragLayer = true; + }; + var setOutDragLayer = function setOutDragLayer(ele) { + ele[0]._private.rscratch.inDragLayer = false; + }; + var setGrabTarget = function setGrabTarget(ele) { + ele[0]._private.rscratch.isGrabTarget = true; + }; + var removeGrabTarget = function removeGrabTarget(ele) { + ele[0]._private.rscratch.isGrabTarget = false; + }; + var addToDragList = function addToDragList(ele, opts) { + var list = opts.addToList; + var listHasEle = list.has(ele); + if (!listHasEle && ele.grabbable() && !ele.locked()) { + list.merge(ele); + setGrabbed(ele); } - } - - v = "" + v; - w = "" + w; - if (!_.isUndefined(name)) { - name = "" + name; - } + }; - var e = edgeArgsToId(this._isDirected, v, w, name); - if (_.has(this._edgeLabels, e)) { - if (valueSpecified) { - this._edgeLabels[e] = value; + // helper function to determine which child nodes and inner edges + // of a compound node to be dragged as well as the grabbed and selected nodes + var addDescendantsToDrag = function addDescendantsToDrag(node, opts) { + if (!node.cy().hasCompoundNodes()) { + return; } - return this; - } - - if (!_.isUndefined(name) && !this._isMultigraph) { - throw new Error("Cannot set a named edge when isMultigraph = false"); - } + if (opts.inDragLayer == null && opts.addToList == null) { + return; + } // nothing to do - // It didn't exist, so we need to create it. - // First ensure the nodes exist. - this.setNode(v); - this.setNode(w); + var innerNodes = node.descendants(); + if (opts.inDragLayer) { + innerNodes.forEach(setInDragLayer); + innerNodes.connectedEdges().forEach(setInDragLayer); + } + if (opts.addToList) { + addToDragList(innerNodes, opts); + } + }; - this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name); + // adds the given nodes and its neighbourhood to the drag layer + var addNodesToDrag = function addNodesToDrag(nodes, opts) { + opts = opts || {}; + var hasCompoundNodes = nodes.cy().hasCompoundNodes(); + if (opts.inDragLayer) { + nodes.forEach(setInDragLayer); + nodes.neighborhood().stdFilter(function (ele) { + return !hasCompoundNodes || ele.isEdge(); + }).forEach(setInDragLayer); + } + if (opts.addToList) { + nodes.forEach(function (ele) { + addToDragList(ele, opts); + }); + } + addDescendantsToDrag(nodes, opts); // always add to drag - var edgeObj = edgeArgsToObj(this._isDirected, v, w, name); - // Ensure we add undirected edges in a consistent way. - v = edgeObj.v; - w = edgeObj.w; + // also add nodes and edges related to the topmost ancestor + updateAncestorsInDragLayer(nodes, { + inDragLayer: opts.inDragLayer + }); + r.updateCachedGrabbedEles(); + }; + var addNodeToDrag = addNodesToDrag; + var freeDraggedElements = function freeDraggedElements(grabbedEles) { + if (!grabbedEles) { + return; + } - Object.freeze(edgeObj); - this._edgeObjs[e] = edgeObj; - incrementOrInitEntry(this._preds[w], v); - incrementOrInitEntry(this._sucs[v], w); - this._in[w][e] = edgeObj; - this._out[v][e] = edgeObj; - this._edgeCount++; - return this; -}; + // just go over all elements rather than doing a bunch of (possibly expensive) traversals + r.getCachedZSortedEles().forEach(function (ele) { + setFreed(ele); + setOutDragLayer(ele); + removeGrabTarget(ele); + }); + r.updateCachedGrabbedEles(); + }; -Graph.prototype.edge = function(v, w, name) { - var e = (arguments.length === 1 - ? edgeObjToId(this._isDirected, arguments[0]) - : edgeArgsToId(this._isDirected, v, w, name)); - return this._edgeLabels[e]; -}; + // helper function to determine which ancestor nodes and edges should go + // to the drag layer (or should be removed from drag layer). + var updateAncestorsInDragLayer = function updateAncestorsInDragLayer(node, opts) { + if (opts.inDragLayer == null && opts.addToList == null) { + return; + } // nothing to do -Graph.prototype.hasEdge = function(v, w, name) { - var e = (arguments.length === 1 - ? edgeObjToId(this._isDirected, arguments[0]) - : edgeArgsToId(this._isDirected, v, w, name)); - return _.has(this._edgeLabels, e); -}; + if (!node.cy().hasCompoundNodes()) { + return; + } -Graph.prototype.removeEdge = function(v, w, name) { - var e = (arguments.length === 1 - ? edgeObjToId(this._isDirected, arguments[0]) - : edgeArgsToId(this._isDirected, v, w, name)); - var edge = this._edgeObjs[e]; - if (edge) { - v = edge.v; - w = edge.w; - delete this._edgeLabels[e]; - delete this._edgeObjs[e]; - decrementOrRemoveEntry(this._preds[w], v); - decrementOrRemoveEntry(this._sucs[v], w); - delete this._in[w][e]; - delete this._out[v][e]; - this._edgeCount--; - } - return this; -}; + // find top-level parent + var parent = node.ancestors().orphans(); -Graph.prototype.inEdges = function(v, u) { - var inV = this._in[v]; - if (inV) { - var edges = _.values(inV); - if (!u) { - return edges; + // no parent node: no nodes to add to the drag layer + if (parent.same(node)) { + return; } - return _.filter(edges, function(edge) { return edge.v === u; }); - } -}; + var nodes = parent.descendants().spawnSelf().merge(parent).unmerge(node).unmerge(node.descendants()); + var edges = nodes.connectedEdges(); + if (opts.inDragLayer) { + edges.forEach(setInDragLayer); + nodes.forEach(setInDragLayer); + } + if (opts.addToList) { + nodes.forEach(function (ele) { + addToDragList(ele, opts); + }); + } + }; + var blurActiveDomElement = function blurActiveDomElement() { + if (document.activeElement != null && document.activeElement.blur != null) { + document.activeElement.blur(); + } + }; + var haveMutationsApi = typeof MutationObserver !== 'undefined'; + var haveResizeObserverApi = typeof ResizeObserver !== 'undefined'; -Graph.prototype.outEdges = function(v, w) { - var outV = this._out[v]; - if (outV) { - var edges = _.values(outV); - if (!w) { - return edges; + // watch for when the cy container is removed from the dom + if (haveMutationsApi) { + r.removeObserver = new MutationObserver(function (mutns) { + // eslint-disable-line no-undef + for (var i = 0; i < mutns.length; i++) { + var mutn = mutns[i]; + var rNodes = mutn.removedNodes; + if (rNodes) { + for (var j = 0; j < rNodes.length; j++) { + var rNode = rNodes[j]; + if (rNode === r.container) { + r.destroy(); + break; + } + } + } + } + }); + if (r.container.parentNode) { + r.removeObserver.observe(r.container.parentNode, { + childList: true + }); } - return _.filter(edges, function(edge) { return edge.w === w; }); + } else { + r.registerBinding(r.container, 'DOMNodeRemoved', function (e) { + // eslint-disable-line no-unused-vars + r.destroy(); + }); } -}; + var onResize = debounce__default["default"](function () { + r.cy.resize(); + }, 100); + if (haveMutationsApi) { + r.styleObserver = new MutationObserver(onResize); // eslint-disable-line no-undef -Graph.prototype.nodeEdges = function(v, w) { - var inEdges = this.inEdges(v, w); - if (inEdges) { - return inEdges.concat(this.outEdges(v, w)); + r.styleObserver.observe(r.container, { + attributes: true + }); } -}; -function incrementOrInitEntry(map, k) { - if (map[k]) { - map[k]++; - } else { - map[k] = 1; - } -} + // auto resize + r.registerBinding(containerWindow, 'resize', onResize); // eslint-disable-line no-undef -function decrementOrRemoveEntry(map, k) { - if (!--map[k]) { delete map[k]; } -} + if (haveResizeObserverApi) { + r.resizeObserver = new ResizeObserver(onResize); // eslint-disable-line no-undef -function edgeArgsToId(isDirected, v_, w_, name) { - var v = "" + v_; - var w = "" + w_; - if (!isDirected && v > w) { - var tmp = v; - v = w; - w = tmp; + r.resizeObserver.observe(r.container); } - return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + - (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name); -} + var forEachUp = function forEachUp(domEle, fn) { + while (domEle != null) { + fn(domEle); + domEle = domEle.parentNode; + } + }; + var invalidateCoords = function invalidateCoords() { + r.invalidateContainerClientCoordsCache(); + }; + forEachUp(r.container, function (domEle) { + r.registerBinding(domEle, 'transitionend', invalidateCoords); + r.registerBinding(domEle, 'animationend', invalidateCoords); + r.registerBinding(domEle, 'scroll', invalidateCoords); + }); -function edgeArgsToObj(isDirected, v_, w_, name) { - var v = "" + v_; - var w = "" + w_; - if (!isDirected && v > w) { - var tmp = v; - v = w; - w = tmp; - } - var edgeObj = { v: v, w: w }; - if (name) { - edgeObj.name = name; - } - return edgeObj; -} + // stop right click menu from appearing on cy + r.registerBinding(r.container, 'contextmenu', function (e) { + e.preventDefault(); + }); + var inBoxSelection = function inBoxSelection() { + return r.selection[4] !== 0; + }; + var eventInContainer = function eventInContainer(e) { + // save cycles if mouse events aren't to be captured + var containerPageCoords = r.findContainerClientCoords(); + var x = containerPageCoords[0]; + var y = containerPageCoords[1]; + var width = containerPageCoords[2]; + var height = containerPageCoords[3]; + var positions = e.touches ? e.touches : [e]; + var atLeastOnePosInside = false; + for (var i = 0; i < positions.length; i++) { + var p = positions[i]; + if (x <= p.clientX && p.clientX <= x + width && y <= p.clientY && p.clientY <= y + height) { + atLeastOnePosInside = true; + break; + } + } + if (!atLeastOnePosInside) { + return false; + } + var container = r.container; + var target = e.target; + var tParent = target.parentNode; + var containerIsTarget = false; + while (tParent) { + if (tParent === container) { + containerIsTarget = true; + break; + } + tParent = tParent.parentNode; + } + if (!containerIsTarget) { + return false; + } // if target is outisde cy container, then this event is not for us -function edgeObjToId(isDirected, edgeObj) { - return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name); -} + return true; + }; + + // Primary key + r.registerBinding(r.container, 'mousedown', function mousedownHandler(e) { + if (!eventInContainer(e)) { + return; + } + e.preventDefault(); + blurActiveDomElement(); + r.hoverData.capture = true; + r.hoverData.which = e.which; + var cy = r.cy; + var gpos = [e.clientX, e.clientY]; + var pos = r.projectIntoViewport(gpos[0], gpos[1]); + var select = r.selection; + var nears = r.findNearestElements(pos[0], pos[1], true, false); + var near = nears[0]; + var draggedElements = r.dragData.possibleDragElements; + r.hoverData.mdownPos = pos; + r.hoverData.mdownGPos = gpos; + var checkForTaphold = function checkForTaphold() { + r.hoverData.tapholdCancelled = false; + clearTimeout(r.hoverData.tapholdTimeout); + r.hoverData.tapholdTimeout = setTimeout(function () { + if (r.hoverData.tapholdCancelled) { + return; + } else { + var ele = r.hoverData.down; + if (ele) { + ele.emit({ + originalEvent: e, + type: 'taphold', + position: { + x: pos[0], + y: pos[1] + } + }); + } else { + cy.emit({ + originalEvent: e, + type: 'taphold', + position: { + x: pos[0], + y: pos[1] + } + }); + } + } + }, r.tapholdDuration); + }; + // Right click button + if (e.which == 3) { + r.hoverData.cxtStarted = true; + var cxtEvt = { + originalEvent: e, + type: 'cxttapstart', + position: { + x: pos[0], + y: pos[1] + } + }; + if (near) { + near.activate(); + near.emit(cxtEvt); + r.hoverData.down = near; + } else { + cy.emit(cxtEvt); + } + r.hoverData.downTime = new Date().getTime(); + r.hoverData.cxtDragged = false; -/***/ }), + // Primary button + } else if (e.which == 1) { + if (near) { + near.activate(); + } -/***/ "./node_modules/graphlib/lib/index.js": -/*!********************************************!*\ - !*** ./node_modules/graphlib/lib/index.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // Element dragging + { + // If something is under the cursor and it is draggable, prepare to grab it + if (near != null) { + if (r.nodeIsGrabbable(near)) { + var makeEvent = function makeEvent(type) { + return { + originalEvent: e, + type: type, + position: { + x: pos[0], + y: pos[1] + } + }; + }; + var triggerGrab = function triggerGrab(ele) { + ele.emit(makeEvent('grab')); + }; + setGrabTarget(near); + if (!near.selected()) { + draggedElements = r.dragData.possibleDragElements = cy.collection(); + addNodeToDrag(near, { + addToList: draggedElements + }); + near.emit(makeEvent('grabon')).emit(makeEvent('grab')); + } else { + draggedElements = r.dragData.possibleDragElements = cy.collection(); + var selectedNodes = cy.$(function (ele) { + return ele.isNode() && ele.selected() && r.nodeIsGrabbable(ele); + }); + addNodesToDrag(selectedNodes, { + addToList: draggedElements + }); + near.emit(makeEvent('grabon')); + selectedNodes.forEach(triggerGrab); + } + r.redrawHint('eles', true); + r.redrawHint('drag', true); + } + } + r.hoverData.down = near; + r.hoverData.downs = nears; + r.hoverData.downTime = new Date().getTime(); + } + triggerEvents(near, ['mousedown', 'tapstart', 'vmousedown'], e, { + x: pos[0], + y: pos[1] + }); + if (near == null) { + select[4] = 1; + r.data.bgActivePosistion = { + x: pos[0], + y: pos[1] + }; + r.redrawHint('select', true); + r.redraw(); + } else if (near.pannable()) { + select[4] = 1; // for future pan + } -// Includes only the "core" of graphlib -module.exports = { - Graph: __webpack_require__(/*! ./graph */ "./node_modules/graphlib/lib/graph.js"), - version: __webpack_require__(/*! ./version */ "./node_modules/graphlib/lib/version.js") -}; + checkForTaphold(); + } + + // Initialize selection box coordinates + select[0] = select[2] = pos[0]; + select[1] = select[3] = pos[1]; + }, false); + r.registerBinding(containerWindow, 'mousemove', function mousemoveHandler(e) { + // eslint-disable-line no-undef + var capture = r.hoverData.capture; + if (!capture && !eventInContainer(e)) { + return; + } + var preventDefault = false; + var cy = r.cy; + var zoom = cy.zoom(); + var gpos = [e.clientX, e.clientY]; + var pos = r.projectIntoViewport(gpos[0], gpos[1]); + var mdownPos = r.hoverData.mdownPos; + var mdownGPos = r.hoverData.mdownGPos; + var select = r.selection; + var near = null; + if (!r.hoverData.draggingEles && !r.hoverData.dragging && !r.hoverData.selecting) { + near = r.findNearestElement(pos[0], pos[1], true, false); + } + var last = r.hoverData.last; + var down = r.hoverData.down; + var disp = [pos[0] - select[2], pos[1] - select[3]]; + var draggedElements = r.dragData.possibleDragElements; + var isOverThresholdDrag; + if (mdownGPos) { + var dx = gpos[0] - mdownGPos[0]; + var dx2 = dx * dx; + var dy = gpos[1] - mdownGPos[1]; + var dy2 = dy * dy; + var dist2 = dx2 + dy2; + r.hoverData.isOverThresholdDrag = isOverThresholdDrag = dist2 >= r.desktopTapThreshold2; + } + var multSelKeyDown = isMultSelKeyDown(e); + if (isOverThresholdDrag) { + r.hoverData.tapholdCancelled = true; + } + var updateDragDelta = function updateDragDelta() { + var dragDelta = r.hoverData.dragDelta = r.hoverData.dragDelta || []; + if (dragDelta.length === 0) { + dragDelta.push(disp[0]); + dragDelta.push(disp[1]); + } else { + dragDelta[0] += disp[0]; + dragDelta[1] += disp[1]; + } + }; + preventDefault = true; + triggerEvents(near, ['mousemove', 'vmousemove', 'tapdrag'], e, { + x: pos[0], + y: pos[1] + }); + var goIntoBoxMode = function goIntoBoxMode() { + r.data.bgActivePosistion = undefined; + if (!r.hoverData.selecting) { + cy.emit({ + originalEvent: e, + type: 'boxstart', + position: { + x: pos[0], + y: pos[1] + } + }); + } + select[4] = 1; + r.hoverData.selecting = true; + r.redrawHint('select', true); + r.redraw(); + }; + // trigger context drag if rmouse down + if (r.hoverData.which === 3) { + // but only if over threshold + if (isOverThresholdDrag) { + var cxtEvt = { + originalEvent: e, + type: 'cxtdrag', + position: { + x: pos[0], + y: pos[1] + } + }; + if (down) { + down.emit(cxtEvt); + } else { + cy.emit(cxtEvt); + } + r.hoverData.cxtDragged = true; + if (!r.hoverData.cxtOver || near !== r.hoverData.cxtOver) { + if (r.hoverData.cxtOver) { + r.hoverData.cxtOver.emit({ + originalEvent: e, + type: 'cxtdragout', + position: { + x: pos[0], + y: pos[1] + } + }); + } + r.hoverData.cxtOver = near; + if (near) { + near.emit({ + originalEvent: e, + type: 'cxtdragover', + position: { + x: pos[0], + y: pos[1] + } + }); + } + } + } -/***/ }), + // Check if we are drag panning the entire graph + } else if (r.hoverData.dragging) { + preventDefault = true; + if (cy.panningEnabled() && cy.userPanningEnabled()) { + var deltaP; + if (r.hoverData.justStartedPan) { + var mdPos = r.hoverData.mdownPos; + deltaP = { + x: (pos[0] - mdPos[0]) * zoom, + y: (pos[1] - mdPos[1]) * zoom + }; + r.hoverData.justStartedPan = false; + } else { + deltaP = { + x: disp[0] * zoom, + y: disp[1] * zoom + }; + } + cy.panBy(deltaP); + cy.emit('dragpan'); + r.hoverData.dragged = true; + } -/***/ "./node_modules/graphlib/lib/json.js": -/*!*******************************************!*\ - !*** ./node_modules/graphlib/lib/json.js ***! - \*******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // Needs reproject due to pan changing viewport + pos = r.projectIntoViewport(e.clientX, e.clientY); -var _ = __webpack_require__(/*! ./lodash */ "./node_modules/graphlib/lib/lodash.js"); -var Graph = __webpack_require__(/*! ./graph */ "./node_modules/graphlib/lib/graph.js"); + // Checks primary button down & out of time & mouse not moved much + } else if (select[4] == 1 && (down == null || down.pannable())) { + if (isOverThresholdDrag) { + if (!r.hoverData.dragging && cy.boxSelectionEnabled() && (multSelKeyDown || !cy.panningEnabled() || !cy.userPanningEnabled())) { + goIntoBoxMode(); + } else if (!r.hoverData.selecting && cy.panningEnabled() && cy.userPanningEnabled()) { + var allowPassthrough = allowPanningPassthrough(down, r.hoverData.downs); + if (allowPassthrough) { + r.hoverData.dragging = true; + r.hoverData.justStartedPan = true; + select[4] = 0; + r.data.bgActivePosistion = array2point(mdownPos); + r.redrawHint('select', true); + r.redraw(); + } + } + if (down && down.pannable() && down.active()) { + down.unactivate(); + } + } + } else { + if (down && down.pannable() && down.active()) { + down.unactivate(); + } + if ((!down || !down.grabbed()) && near != last) { + if (last) { + triggerEvents(last, ['mouseout', 'tapdragout'], e, { + x: pos[0], + y: pos[1] + }); + } + if (near) { + triggerEvents(near, ['mouseover', 'tapdragover'], e, { + x: pos[0], + y: pos[1] + }); + } + r.hoverData.last = near; + } + if (down) { + if (isOverThresholdDrag) { + // then we can take action -module.exports = { - write: write, - read: read -}; + if (cy.boxSelectionEnabled() && multSelKeyDown) { + // then selection overrides + if (down && down.grabbed()) { + freeDraggedElements(draggedElements); + down.emit('freeon'); + draggedElements.emit('free'); + if (r.dragData.didDrag) { + down.emit('dragfreeon'); + draggedElements.emit('dragfree'); + } + } + goIntoBoxMode(); + } else if (down && down.grabbed() && r.nodeIsDraggable(down)) { + // drag node + var justStartedDrag = !r.dragData.didDrag; + if (justStartedDrag) { + r.redrawHint('eles', true); + } + r.dragData.didDrag = true; // indicate that we actually did drag the node -function write(g) { - var json = { - options: { - directed: g.isDirected(), - multigraph: g.isMultigraph(), - compound: g.isCompound() - }, - nodes: writeNodes(g), - edges: writeEdges(g) - }; - if (!_.isUndefined(g.graph())) { - json.value = _.clone(g.graph()); - } - return json; -} + // now, add the elements to the drag layer if not done already + if (!r.hoverData.draggingEles) { + addNodesToDrag(draggedElements, { + inDragLayer: true + }); + } + var totalShift = { + x: 0, + y: 0 + }; + if (number$1(disp[0]) && number$1(disp[1])) { + totalShift.x += disp[0]; + totalShift.y += disp[1]; + if (justStartedDrag) { + var dragDelta = r.hoverData.dragDelta; + if (dragDelta && number$1(dragDelta[0]) && number$1(dragDelta[1])) { + totalShift.x += dragDelta[0]; + totalShift.y += dragDelta[1]; + } + } + } + r.hoverData.draggingEles = true; + draggedElements.silentShift(totalShift).emit('position drag'); + r.redrawHint('drag', true); + r.redraw(); + } + } else { + // otherwise save drag delta for when we actually start dragging so the relative grab pos is constant + updateDragDelta(); + } + } -function writeNodes(g) { - return _.map(g.nodes(), function(v) { - var nodeValue = g.node(v); - var parent = g.parent(v); - var node = { v: v }; - if (!_.isUndefined(nodeValue)) { - node.value = nodeValue; + // prevent the dragging from triggering text selection on the page + preventDefault = true; } - if (!_.isUndefined(parent)) { - node.parent = parent; + select[2] = pos[0]; + select[3] = pos[1]; + if (preventDefault) { + if (e.stopPropagation) e.stopPropagation(); + if (e.preventDefault) e.preventDefault(); + return false; } - return node; - }); -} - -function writeEdges(g) { - return _.map(g.edges(), function(e) { - var edgeValue = g.edge(e); - var edge = { v: e.v, w: e.w }; - if (!_.isUndefined(e.name)) { - edge.name = e.name; + }, false); + var clickTimeout, didDoubleClick, prevClickTimeStamp; + r.registerBinding(containerWindow, 'mouseup', function mouseupHandler(e) { + // eslint-disable-line no-undef + var capture = r.hoverData.capture; + if (!capture) { + return; } - if (!_.isUndefined(edgeValue)) { - edge.value = edgeValue; + r.hoverData.capture = false; + var cy = r.cy; + var pos = r.projectIntoViewport(e.clientX, e.clientY); + var select = r.selection; + var near = r.findNearestElement(pos[0], pos[1], true, false); + var draggedElements = r.dragData.possibleDragElements; + var down = r.hoverData.down; + var multSelKeyDown = isMultSelKeyDown(e); + if (r.data.bgActivePosistion) { + r.redrawHint('select', true); + r.redraw(); } - return edge; - }); -} + r.hoverData.tapholdCancelled = true; + r.data.bgActivePosistion = undefined; // not active bg now -function read(json) { - var g = new Graph(json.options).setGraph(json.value); - _.each(json.nodes, function(entry) { - g.setNode(entry.v, entry.value); - if (entry.parent) { - g.setParent(entry.v, entry.parent); + if (down) { + down.unactivate(); } - }); - _.each(json.edges, function(entry) { - g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value); - }); - return g; -} - - -/***/ }), - -/***/ "./node_modules/graphlib/lib/lodash.js": -/*!*********************************************!*\ - !*** ./node_modules/graphlib/lib/lodash.js ***! - \*********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -/* global window */ - -var lodash; - -if (true) { - try { - lodash = { - clone: __webpack_require__(/*! lodash/clone */ "./node_modules/lodash/clone.js"), - constant: __webpack_require__(/*! lodash/constant */ "./node_modules/lodash/constant.js"), - each: __webpack_require__(/*! lodash/each */ "./node_modules/lodash/each.js"), - filter: __webpack_require__(/*! lodash/filter */ "./node_modules/lodash/filter.js"), - has: __webpack_require__(/*! lodash/has */ "./node_modules/lodash/has.js"), - isArray: __webpack_require__(/*! lodash/isArray */ "./node_modules/lodash/isArray.js"), - isEmpty: __webpack_require__(/*! lodash/isEmpty */ "./node_modules/lodash/isEmpty.js"), - isFunction: __webpack_require__(/*! lodash/isFunction */ "./node_modules/lodash/isFunction.js"), - isUndefined: __webpack_require__(/*! lodash/isUndefined */ "./node_modules/lodash/isUndefined.js"), - keys: __webpack_require__(/*! lodash/keys */ "./node_modules/lodash/keys.js"), - map: __webpack_require__(/*! lodash/map */ "./node_modules/lodash/map.js"), - reduce: __webpack_require__(/*! lodash/reduce */ "./node_modules/lodash/reduce.js"), - size: __webpack_require__(/*! lodash/size */ "./node_modules/lodash/size.js"), - transform: __webpack_require__(/*! lodash/transform */ "./node_modules/lodash/transform.js"), - union: __webpack_require__(/*! lodash/union */ "./node_modules/lodash/union.js"), - values: __webpack_require__(/*! lodash/values */ "./node_modules/lodash/values.js") - }; - } catch (e) { - // continue regardless of error - } -} - -if (!lodash) { - lodash = window._; -} + if (r.hoverData.which === 3) { + var cxtEvt = { + originalEvent: e, + type: 'cxttapend', + position: { + x: pos[0], + y: pos[1] + } + }; + if (down) { + down.emit(cxtEvt); + } else { + cy.emit(cxtEvt); + } + if (!r.hoverData.cxtDragged) { + var cxtTap = { + originalEvent: e, + type: 'cxttap', + position: { + x: pos[0], + y: pos[1] + } + }; + if (down) { + down.emit(cxtTap); + } else { + cy.emit(cxtTap); + } + } + r.hoverData.cxtDragged = false; + r.hoverData.which = null; + } else if (r.hoverData.which === 1) { + triggerEvents(near, ['mouseup', 'tapend', 'vmouseup'], e, { + x: pos[0], + y: pos[1] + }); + if (!r.dragData.didDrag && + // didn't move a node around + !r.hoverData.dragged && + // didn't pan + !r.hoverData.selecting && + // not box selection + !r.hoverData.isOverThresholdDrag // didn't move too much + ) { + triggerEvents(down, ["click", "tap", "vclick"], e, { + x: pos[0], + y: pos[1] + }); + didDoubleClick = false; + if (e.timeStamp - prevClickTimeStamp <= cy.multiClickDebounceTime()) { + clickTimeout && clearTimeout(clickTimeout); + didDoubleClick = true; + prevClickTimeStamp = null; + triggerEvents(down, ["dblclick", "dbltap", "vdblclick"], e, { + x: pos[0], + y: pos[1] + }); + } else { + clickTimeout = setTimeout(function () { + if (didDoubleClick) return; + triggerEvents(down, ["oneclick", "onetap", "voneclick"], e, { + x: pos[0], + y: pos[1] + }); + }, cy.multiClickDebounceTime()); + prevClickTimeStamp = e.timeStamp; + } + } -module.exports = lodash; + // Deselect all elements if nothing is currently under the mouse cursor and we aren't dragging something + if (down == null // not mousedown on node + && !r.dragData.didDrag // didn't move the node around + && !r.hoverData.selecting // not box selection + && !r.hoverData.dragged // didn't pan + && !isMultSelKeyDown(e)) { + cy.$(isSelected).unselect(['tapunselect']); + if (draggedElements.length > 0) { + r.redrawHint('eles', true); + } + r.dragData.possibleDragElements = draggedElements = cy.collection(); + } + // Single selection + if (near == down && !r.dragData.didDrag && !r.hoverData.selecting) { + if (near != null && near._private.selectable) { + if (r.hoverData.dragging) ; else if (cy.selectionType() === 'additive' || multSelKeyDown) { + if (near.selected()) { + near.unselect(['tapunselect']); + } else { + near.select(['tapselect']); + } + } else { + if (!multSelKeyDown) { + cy.$(isSelected).unmerge(near).unselect(['tapunselect']); + near.select(['tapselect']); + } + } + r.redrawHint('eles', true); + } + } + if (r.hoverData.selecting) { + var box = cy.collection(r.getAllInBox(select[0], select[1], select[2], select[3])); + r.redrawHint('select', true); + if (box.length > 0) { + r.redrawHint('eles', true); + } + cy.emit({ + type: 'boxend', + originalEvent: e, + position: { + x: pos[0], + y: pos[1] + } + }); + var eleWouldBeSelected = function eleWouldBeSelected(ele) { + return ele.selectable() && !ele.selected(); + }; + if (cy.selectionType() === 'additive') { + box.emit('box').stdFilter(eleWouldBeSelected).select().emit('boxselect'); + } else { + if (!multSelKeyDown) { + cy.$(isSelected).unmerge(box).unselect(); + } + box.emit('box').stdFilter(eleWouldBeSelected).select().emit('boxselect'); + } -/***/ }), + // always need redraw in case eles unselectable + r.redraw(); + } -/***/ "./node_modules/graphlib/lib/version.js": -/*!**********************************************!*\ - !*** ./node_modules/graphlib/lib/version.js ***! - \**********************************************/ -/***/ (function(module) { + // Cancel drag pan + if (r.hoverData.dragging) { + r.hoverData.dragging = false; + r.redrawHint('select', true); + r.redrawHint('eles', true); + r.redraw(); + } + if (!select[4]) { + r.redrawHint('drag', true); + r.redrawHint('eles', true); + var downWasGrabbed = down && down.grabbed(); + freeDraggedElements(draggedElements); + if (downWasGrabbed) { + down.emit('freeon'); + draggedElements.emit('free'); + if (r.dragData.didDrag) { + down.emit('dragfreeon'); + draggedElements.emit('dragfree'); + } + } + } + } // else not right mouse -module.exports = '2.1.8'; + select[4] = 0; + r.hoverData.down = null; + r.hoverData.cxtStarted = false; + r.hoverData.draggingEles = false; + r.hoverData.selecting = false; + r.hoverData.isOverThresholdDrag = false; + r.dragData.didDrag = false; + r.hoverData.dragged = false; + r.hoverData.dragDelta = []; + r.hoverData.mdownPos = null; + r.hoverData.mdownGPos = null; + }, false); + var wheelHandler = function wheelHandler(e) { + if (r.scrollingPage) { + return; + } // while scrolling, ignore wheel-to-zoom + var cy = r.cy; + var zoom = cy.zoom(); + var pan = cy.pan(); + var pos = r.projectIntoViewport(e.clientX, e.clientY); + var rpos = [pos[0] * zoom + pan.x, pos[1] * zoom + pan.y]; + if (r.hoverData.draggingEles || r.hoverData.dragging || r.hoverData.cxtStarted || inBoxSelection()) { + // if pan dragging or cxt dragging, wheel movements make no zoom + e.preventDefault(); + return; + } + if (cy.panningEnabled() && cy.userPanningEnabled() && cy.zoomingEnabled() && cy.userZoomingEnabled()) { + e.preventDefault(); + r.data.wheelZooming = true; + clearTimeout(r.data.wheelTimeout); + r.data.wheelTimeout = setTimeout(function () { + r.data.wheelZooming = false; + r.redrawHint('eles', true); + r.redraw(); + }, 150); + var diff; + if (e.deltaY != null) { + diff = e.deltaY / -250; + } else if (e.wheelDeltaY != null) { + diff = e.wheelDeltaY / 1000; + } else { + diff = e.wheelDelta / 1000; + } + diff = diff * r.wheelSensitivity; + var needsWheelFix = e.deltaMode === 1; + if (needsWheelFix) { + // fixes slow wheel events on ff/linux and ff/windows + diff *= 33; + } + var newZoom = cy.zoom() * Math.pow(10, diff); + if (e.type === 'gesturechange') { + newZoom = r.gestureStartZoom * e.scale; + } + cy.zoom({ + level: newZoom, + renderedPosition: { + x: rpos[0], + y: rpos[1] + } + }); + cy.emit(e.type === 'gesturechange' ? 'pinchzoom' : 'scrollzoom'); + } + }; -/***/ }), + // Functions to help with whether mouse wheel should trigger zooming + // -- + r.registerBinding(r.container, 'wheel', wheelHandler, true); -/***/ "./node_modules/heap/index.js": -/*!************************************!*\ - !*** ./node_modules/heap/index.js ***! - \************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // disable nonstandard wheel events + // r.registerBinding(r.container, 'mousewheel', wheelHandler, true); + // r.registerBinding(r.container, 'DOMMouseScroll', wheelHandler, true); + // r.registerBinding(r.container, 'MozMousePixelScroll', wheelHandler, true); // older firefox -module.exports = __webpack_require__(/*! ./lib/heap */ "./node_modules/heap/lib/heap.js"); + r.registerBinding(containerWindow, 'scroll', function scrollHandler(e) { + // eslint-disable-line no-unused-vars + r.scrollingPage = true; + clearTimeout(r.scrollingPageTimeout); + r.scrollingPageTimeout = setTimeout(function () { + r.scrollingPage = false; + }, 250); + }, true); + // desktop safari pinch to zoom start + r.registerBinding(r.container, 'gesturestart', function gestureStartHandler(e) { + r.gestureStartZoom = r.cy.zoom(); + if (!r.hasTouchStarted) { + // don't affect touch devices like iphone + e.preventDefault(); + } + }, true); + r.registerBinding(r.container, 'gesturechange', function (e) { + if (!r.hasTouchStarted) { + // don't affect touch devices like iphone + wheelHandler(e); + } + }, true); -/***/ }), + // Functions to help with handling mouseout/mouseover on the Cytoscape container + // Handle mouseout on Cytoscape container + r.registerBinding(r.container, 'mouseout', function mouseOutHandler(e) { + var pos = r.projectIntoViewport(e.clientX, e.clientY); + r.cy.emit({ + originalEvent: e, + type: 'mouseout', + position: { + x: pos[0], + y: pos[1] + } + }); + }, false); + r.registerBinding(r.container, 'mouseover', function mouseOverHandler(e) { + var pos = r.projectIntoViewport(e.clientX, e.clientY); + r.cy.emit({ + originalEvent: e, + type: 'mouseover', + position: { + x: pos[0], + y: pos[1] + } + }); + }, false); + var f1x1, f1y1, f2x1, f2y1; // starting points for pinch-to-zoom + var distance1, distance1Sq; // initial distance between finger 1 and finger 2 for pinch-to-zoom + var center1, modelCenter1; // center point on start pinch to zoom + var offsetLeft, offsetTop; + var containerWidth, containerHeight; + var twoFingersStartInside; + var distance = function distance(x1, y1, x2, y2) { + return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); + }; + var distanceSq = function distanceSq(x1, y1, x2, y2) { + return (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1); + }; + var touchstartHandler; + r.registerBinding(r.container, 'touchstart', touchstartHandler = function touchstartHandler(e) { + r.hasTouchStarted = true; + if (!eventInContainer(e)) { + return; + } + blurActiveDomElement(); + r.touchData.capture = true; + r.data.bgActivePosistion = undefined; + var cy = r.cy; + var now = r.touchData.now; + var earlier = r.touchData.earlier; + if (e.touches[0]) { + var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY); + now[0] = pos[0]; + now[1] = pos[1]; + } + if (e.touches[1]) { + var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY); + now[2] = pos[0]; + now[3] = pos[1]; + } + if (e.touches[2]) { + var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY); + now[4] = pos[0]; + now[5] = pos[1]; + } -/***/ "./node_modules/heap/lib/heap.js": -/*!***************************************!*\ - !*** ./node_modules/heap/lib/heap.js ***! - \***************************************/ -/***/ (function(module, exports) { + // record starting points for pinch-to-zoom + if (e.touches[1]) { + r.touchData.singleTouchMoved = true; + freeDraggedElements(r.dragData.touchDragEles); + var offsets = r.findContainerClientCoords(); + offsetLeft = offsets[0]; + offsetTop = offsets[1]; + containerWidth = offsets[2]; + containerHeight = offsets[3]; + f1x1 = e.touches[0].clientX - offsetLeft; + f1y1 = e.touches[0].clientY - offsetTop; + f2x1 = e.touches[1].clientX - offsetLeft; + f2y1 = e.touches[1].clientY - offsetTop; + twoFingersStartInside = 0 <= f1x1 && f1x1 <= containerWidth && 0 <= f2x1 && f2x1 <= containerWidth && 0 <= f1y1 && f1y1 <= containerHeight && 0 <= f2y1 && f2y1 <= containerHeight; + var pan = cy.pan(); + var zoom = cy.zoom(); + distance1 = distance(f1x1, f1y1, f2x1, f2y1); + distance1Sq = distanceSq(f1x1, f1y1, f2x1, f2y1); + center1 = [(f1x1 + f2x1) / 2, (f1y1 + f2y1) / 2]; + modelCenter1 = [(center1[0] - pan.x) / zoom, (center1[1] - pan.y) / zoom]; -var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Generated by CoffeeScript 1.8.0 -(function() { - var Heap, defaultCmp, floor, heapify, heappop, heappush, heappushpop, heapreplace, insort, min, nlargest, nsmallest, updateItem, _siftdown, _siftup; + // consider context tap + var cxtDistThreshold = 200; + var cxtDistThresholdSq = cxtDistThreshold * cxtDistThreshold; + if (distance1Sq < cxtDistThresholdSq && !e.touches[2]) { + var near1 = r.findNearestElement(now[0], now[1], true, true); + var near2 = r.findNearestElement(now[2], now[3], true, true); + if (near1 && near1.isNode()) { + near1.activate().emit({ + originalEvent: e, + type: 'cxttapstart', + position: { + x: now[0], + y: now[1] + } + }); + r.touchData.start = near1; + } else if (near2 && near2.isNode()) { + near2.activate().emit({ + originalEvent: e, + type: 'cxttapstart', + position: { + x: now[0], + y: now[1] + } + }); + r.touchData.start = near2; + } else { + cy.emit({ + originalEvent: e, + type: 'cxttapstart', + position: { + x: now[0], + y: now[1] + } + }); + } + if (r.touchData.start) { + r.touchData.start._private.grabbed = false; + } + r.touchData.cxt = true; + r.touchData.cxtDragged = false; + r.data.bgActivePosistion = undefined; + r.redraw(); + return; + } + } + if (e.touches[2]) { + // ignore - floor = Math.floor, min = Math.min; + // safari on ios pans the page otherwise (normally you should be able to preventdefault on touchmove...) + if (cy.boxSelectionEnabled()) { + e.preventDefault(); + } + } else if (e.touches[1]) ; else if (e.touches[0]) { + var nears = r.findNearestElements(now[0], now[1], true, true); + var near = nears[0]; + if (near != null) { + near.activate(); + r.touchData.start = near; + r.touchData.starts = nears; + if (r.nodeIsGrabbable(near)) { + var draggedEles = r.dragData.touchDragEles = cy.collection(); + var selectedNodes = null; + r.redrawHint('eles', true); + r.redrawHint('drag', true); + if (near.selected()) { + // reset drag elements, since near will be added again + selectedNodes = cy.$(function (ele) { + return ele.selected() && r.nodeIsGrabbable(ele); + }); + addNodesToDrag(selectedNodes, { + addToList: draggedEles + }); + } else { + addNodeToDrag(near, { + addToList: draggedEles + }); + } + setGrabTarget(near); + var makeEvent = function makeEvent(type) { + return { + originalEvent: e, + type: type, + position: { + x: now[0], + y: now[1] + } + }; + }; + near.emit(makeEvent('grabon')); + if (selectedNodes) { + selectedNodes.forEach(function (n) { + n.emit(makeEvent('grab')); + }); + } else { + near.emit(makeEvent('grab')); + } + } + } + triggerEvents(near, ['touchstart', 'tapstart', 'vmousedown'], e, { + x: now[0], + y: now[1] + }); + if (near == null) { + r.data.bgActivePosistion = { + x: pos[0], + y: pos[1] + }; + r.redrawHint('select', true); + r.redraw(); + } - /* - Default comparison function to be used - */ + // Tap, taphold + // ----- - defaultCmp = function(x, y) { - if (x < y) { - return -1; + r.touchData.singleTouchMoved = false; + r.touchData.singleTouchStartTime = +new Date(); + clearTimeout(r.touchData.tapholdTimeout); + r.touchData.tapholdTimeout = setTimeout(function () { + if (r.touchData.singleTouchMoved === false && !r.pinching // if pinching, then taphold unselect shouldn't take effect + && !r.touchData.selecting // box selection shouldn't allow taphold through + ) { + triggerEvents(r.touchData.start, ['taphold'], e, { + x: now[0], + y: now[1] + }); + } + }, r.tapholdDuration); } - if (x > y) { - return 1; + if (e.touches.length >= 1) { + var sPos = r.touchData.startPosition = [null, null, null, null, null, null]; + for (var i = 0; i < now.length; i++) { + sPos[i] = earlier[i] = now[i]; + } + var touch0 = e.touches[0]; + r.touchData.startGPosition = [touch0.clientX, touch0.clientY]; } - return 0; - }; - - - /* - Insert item x in list a, and keep it sorted assuming a is sorted. - - If x is already in a, insert it to the right of the rightmost x. - - Optional args lo (default 0) and hi (default a.length) bound the slice - of a to be searched. - */ - - insort = function(a, x, lo, hi, cmp) { - var mid; - if (lo == null) { - lo = 0; + }, false); + var touchmoveHandler; + r.registerBinding(window, 'touchmove', touchmoveHandler = function touchmoveHandler(e) { + // eslint-disable-line no-undef + var capture = r.touchData.capture; + if (!capture && !eventInContainer(e)) { + return; } - if (cmp == null) { - cmp = defaultCmp; + var select = r.selection; + var cy = r.cy; + var now = r.touchData.now; + var earlier = r.touchData.earlier; + var zoom = cy.zoom(); + if (e.touches[0]) { + var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY); + now[0] = pos[0]; + now[1] = pos[1]; } - if (lo < 0) { - throw new Error('lo must be non-negative'); + if (e.touches[1]) { + var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY); + now[2] = pos[0]; + now[3] = pos[1]; } - if (hi == null) { - hi = a.length; + if (e.touches[2]) { + var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY); + now[4] = pos[0]; + now[5] = pos[1]; } - while (lo < hi) { - mid = floor((lo + hi) / 2); - if (cmp(x, a[mid]) < 0) { - hi = mid; - } else { - lo = mid + 1; + var startGPos = r.touchData.startGPosition; + var isOverThresholdDrag; + if (capture && e.touches[0] && startGPos) { + var disp = []; + for (var j = 0; j < now.length; j++) { + disp[j] = now[j] - earlier[j]; } + var dx = e.touches[0].clientX - startGPos[0]; + var dx2 = dx * dx; + var dy = e.touches[0].clientY - startGPos[1]; + var dy2 = dy * dy; + var dist2 = dx2 + dy2; + isOverThresholdDrag = dist2 >= r.touchTapThreshold2; } - return ([].splice.apply(a, [lo, lo - lo].concat(x)), x); - }; + // context swipe cancelling + if (capture && r.touchData.cxt) { + e.preventDefault(); + var f1x2 = e.touches[0].clientX - offsetLeft, + f1y2 = e.touches[0].clientY - offsetTop; + var f2x2 = e.touches[1].clientX - offsetLeft, + f2y2 = e.touches[1].clientY - offsetTop; + // var distance2 = distance( f1x2, f1y2, f2x2, f2y2 ); + var distance2Sq = distanceSq(f1x2, f1y2, f2x2, f2y2); + var factorSq = distance2Sq / distance1Sq; + var distThreshold = 150; + var distThresholdSq = distThreshold * distThreshold; + var factorThreshold = 1.5; + var factorThresholdSq = factorThreshold * factorThreshold; - /* - Push item onto heap, maintaining the heap invariant. - */ - - heappush = function(array, item, cmp) { - if (cmp == null) { - cmp = defaultCmp; + // cancel ctx gestures if the distance b/t the fingers increases + if (factorSq >= factorThresholdSq || distance2Sq >= distThresholdSq) { + r.touchData.cxt = false; + r.data.bgActivePosistion = undefined; + r.redrawHint('select', true); + var cxtEvt = { + originalEvent: e, + type: 'cxttapend', + position: { + x: now[0], + y: now[1] + } + }; + if (r.touchData.start) { + r.touchData.start.unactivate().emit(cxtEvt); + r.touchData.start = null; + } else { + cy.emit(cxtEvt); + } + } } - array.push(item); - return _siftdown(array, 0, array.length - 1, cmp); - }; + // context swipe + if (capture && r.touchData.cxt) { + var cxtEvt = { + originalEvent: e, + type: 'cxtdrag', + position: { + x: now[0], + y: now[1] + } + }; + r.data.bgActivePosistion = undefined; + r.redrawHint('select', true); + if (r.touchData.start) { + r.touchData.start.emit(cxtEvt); + } else { + cy.emit(cxtEvt); + } + if (r.touchData.start) { + r.touchData.start._private.grabbed = false; + } + r.touchData.cxtDragged = true; + var near = r.findNearestElement(now[0], now[1], true, true); + if (!r.touchData.cxtOver || near !== r.touchData.cxtOver) { + if (r.touchData.cxtOver) { + r.touchData.cxtOver.emit({ + originalEvent: e, + type: 'cxtdragout', + position: { + x: now[0], + y: now[1] + } + }); + } + r.touchData.cxtOver = near; + if (near) { + near.emit({ + originalEvent: e, + type: 'cxtdragover', + position: { + x: now[0], + y: now[1] + } + }); + } + } - /* - Pop the smallest item off the heap, maintaining the heap invariant. - */ + // box selection + } else if (capture && e.touches[2] && cy.boxSelectionEnabled()) { + e.preventDefault(); + r.data.bgActivePosistion = undefined; + this.lastThreeTouch = +new Date(); + if (!r.touchData.selecting) { + cy.emit({ + originalEvent: e, + type: 'boxstart', + position: { + x: now[0], + y: now[1] + } + }); + } + r.touchData.selecting = true; + r.touchData.didSelect = true; + select[4] = 1; + if (!select || select.length === 0 || select[0] === undefined) { + select[0] = (now[0] + now[2] + now[4]) / 3; + select[1] = (now[1] + now[3] + now[5]) / 3; + select[2] = (now[0] + now[2] + now[4]) / 3 + 1; + select[3] = (now[1] + now[3] + now[5]) / 3 + 1; + } else { + select[2] = (now[0] + now[2] + now[4]) / 3; + select[3] = (now[1] + now[3] + now[5]) / 3; + } + r.redrawHint('select', true); + r.redraw(); - heappop = function(array, cmp) { - var lastelt, returnitem; - if (cmp == null) { - cmp = defaultCmp; - } - lastelt = array.pop(); - if (array.length) { - returnitem = array[0]; - array[0] = lastelt; - _siftup(array, 0, cmp); - } else { - returnitem = lastelt; - } - return returnitem; - }; + // pinch to zoom + } else if (capture && e.touches[1] && !r.touchData.didSelect // don't allow box selection to degrade to pinch-to-zoom + && cy.zoomingEnabled() && cy.panningEnabled() && cy.userZoomingEnabled() && cy.userPanningEnabled()) { + // two fingers => pinch to zoom + e.preventDefault(); + r.data.bgActivePosistion = undefined; + r.redrawHint('select', true); + var draggedEles = r.dragData.touchDragEles; + if (draggedEles) { + r.redrawHint('drag', true); + for (var i = 0; i < draggedEles.length; i++) { + var de_p = draggedEles[i]._private; + de_p.grabbed = false; + de_p.rscratch.inDragLayer = false; + } + } + var _start = r.touchData.start; + // (x2, y2) for fingers 1 and 2 + var f1x2 = e.touches[0].clientX - offsetLeft, + f1y2 = e.touches[0].clientY - offsetTop; + var f2x2 = e.touches[1].clientX - offsetLeft, + f2y2 = e.touches[1].clientY - offsetTop; + var distance2 = distance(f1x2, f1y2, f2x2, f2y2); + // var distance2Sq = distanceSq( f1x2, f1y2, f2x2, f2y2 ); + // var factor = Math.sqrt( distance2Sq ) / Math.sqrt( distance1Sq ); + var factor = distance2 / distance1; + if (twoFingersStartInside) { + // delta finger1 + var df1x = f1x2 - f1x1; + var df1y = f1y2 - f1y1; - /* - Pop and return the current smallest value, and add the new item. - - This is more efficient than heappop() followed by heappush(), and can be - more appropriate when using a fixed size heap. Note that the value - returned may be larger than item! That constrains reasonable use of - this routine unless written as part of a conditional replacement: - if item > array[0] - item = heapreplace(array, item) - */ + // delta finger 2 + var df2x = f2x2 - f2x1; + var df2y = f2y2 - f2y1; - heapreplace = function(array, item, cmp) { - var returnitem; - if (cmp == null) { - cmp = defaultCmp; - } - returnitem = array[0]; - array[0] = item; - _siftup(array, 0, cmp); - return returnitem; - }; + // translation is the normalised vector of the two fingers movement + // i.e. so pinching cancels out and moving together pans + var tx = (df1x + df2x) / 2; + var ty = (df1y + df2y) / 2; + + // now calculate the zoom + var zoom1 = cy.zoom(); + var zoom2 = zoom1 * factor; + var pan1 = cy.pan(); + + // the model center point converted to the current rendered pos + var ctrx = modelCenter1[0] * zoom1 + pan1.x; + var ctry = modelCenter1[1] * zoom1 + pan1.y; + var pan2 = { + x: -zoom2 / zoom1 * (ctrx - pan1.x - tx) + ctrx, + y: -zoom2 / zoom1 * (ctry - pan1.y - ty) + ctry + }; + + // remove dragged eles + if (_start && _start.active()) { + var draggedEles = r.dragData.touchDragEles; + freeDraggedElements(draggedEles); + r.redrawHint('drag', true); + r.redrawHint('eles', true); + _start.unactivate().emit('freeon'); + draggedEles.emit('free'); + if (r.dragData.didDrag) { + _start.emit('dragfreeon'); + draggedEles.emit('dragfree'); + } + } + cy.viewport({ + zoom: zoom2, + pan: pan2, + cancelOnFailedZoom: true + }); + cy.emit('pinchzoom'); + distance1 = distance2; + f1x1 = f1x2; + f1y1 = f1y2; + f2x1 = f2x2; + f2y1 = f2y2; + r.pinching = true; + } + + // Re-project + if (e.touches[0]) { + var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY); + now[0] = pos[0]; + now[1] = pos[1]; + } + if (e.touches[1]) { + var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY); + now[2] = pos[0]; + now[3] = pos[1]; + } + if (e.touches[2]) { + var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY); + now[4] = pos[0]; + now[5] = pos[1]; + } + } else if (e.touches[0] && !r.touchData.didSelect // don't allow box selection to degrade to single finger events like panning + ) { + var start = r.touchData.start; + var last = r.touchData.last; + var near; + if (!r.hoverData.draggingEles && !r.swipePanning) { + near = r.findNearestElement(now[0], now[1], true, true); + } + if (capture && start != null) { + e.preventDefault(); + } + + // dragging nodes + if (capture && start != null && r.nodeIsDraggable(start)) { + if (isOverThresholdDrag) { + // then dragging can happen + var draggedEles = r.dragData.touchDragEles; + var justStartedDrag = !r.dragData.didDrag; + if (justStartedDrag) { + addNodesToDrag(draggedEles, { + inDragLayer: true + }); + } + r.dragData.didDrag = true; + var totalShift = { + x: 0, + y: 0 + }; + if (number$1(disp[0]) && number$1(disp[1])) { + totalShift.x += disp[0]; + totalShift.y += disp[1]; + if (justStartedDrag) { + r.redrawHint('eles', true); + var dragDelta = r.touchData.dragDelta; + if (dragDelta && number$1(dragDelta[0]) && number$1(dragDelta[1])) { + totalShift.x += dragDelta[0]; + totalShift.y += dragDelta[1]; + } + } + } + r.hoverData.draggingEles = true; + draggedEles.silentShift(totalShift).emit('position drag'); + r.redrawHint('drag', true); + if (r.touchData.startPosition[0] == earlier[0] && r.touchData.startPosition[1] == earlier[1]) { + r.redrawHint('eles', true); + } + r.redraw(); + } else { + // otherwise keep track of drag delta for later + var dragDelta = r.touchData.dragDelta = r.touchData.dragDelta || []; + if (dragDelta.length === 0) { + dragDelta.push(disp[0]); + dragDelta.push(disp[1]); + } else { + dragDelta[0] += disp[0]; + dragDelta[1] += disp[1]; + } + } + } + + // touchmove + { + triggerEvents(start || near, ['touchmove', 'tapdrag', 'vmousemove'], e, { + x: now[0], + y: now[1] + }); + if ((!start || !start.grabbed()) && near != last) { + if (last) { + last.emit({ + originalEvent: e, + type: 'tapdragout', + position: { + x: now[0], + y: now[1] + } + }); + } + if (near) { + near.emit({ + originalEvent: e, + type: 'tapdragover', + position: { + x: now[0], + y: now[1] + } + }); + } + } + r.touchData.last = near; + } + // check to cancel taphold + if (capture) { + for (var i = 0; i < now.length; i++) { + if (now[i] && r.touchData.startPosition[i] && isOverThresholdDrag) { + r.touchData.singleTouchMoved = true; + } + } + } - /* - Fast version of a heappush followed by a heappop. - */ + // panning + if (capture && (start == null || start.pannable()) && cy.panningEnabled() && cy.userPanningEnabled()) { + var allowPassthrough = allowPanningPassthrough(start, r.touchData.starts); + if (allowPassthrough) { + e.preventDefault(); + if (!r.data.bgActivePosistion) { + r.data.bgActivePosistion = array2point(r.touchData.startPosition); + } + if (r.swipePanning) { + cy.panBy({ + x: disp[0] * zoom, + y: disp[1] * zoom + }); + cy.emit('dragpan'); + } else if (isOverThresholdDrag) { + r.swipePanning = true; + cy.panBy({ + x: dx * zoom, + y: dy * zoom + }); + cy.emit('dragpan'); + if (start) { + start.unactivate(); + r.redrawHint('select', true); + r.touchData.start = null; + } + } + } - heappushpop = function(array, item, cmp) { - var _ref; - if (cmp == null) { - cmp = defaultCmp; + // Re-project + var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY); + now[0] = pos[0]; + now[1] = pos[1]; + } } - if (array.length && cmp(array[0], item) < 0) { - _ref = [array[0], item], item = _ref[0], array[0] = _ref[1]; - _siftup(array, 0, cmp); + for (var j = 0; j < now.length; j++) { + earlier[j] = now[j]; } - return item; - }; - - /* - Transform list into a heap, in-place, in O(array.length) time. - */ - - heapify = function(array, cmp) { - var i, _i, _j, _len, _ref, _ref1, _results, _results1; - if (cmp == null) { - cmp = defaultCmp; - } - _ref1 = (function() { - _results1 = []; - for (var _j = 0, _ref = floor(array.length / 2); 0 <= _ref ? _j < _ref : _j > _ref; 0 <= _ref ? _j++ : _j--){ _results1.push(_j); } - return _results1; - }).apply(this).reverse(); - _results = []; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - i = _ref1[_i]; - _results.push(_siftup(array, i, cmp)); + // the active bg indicator should be removed when making a swipe that is neither for dragging nodes or panning + if (capture && e.touches.length > 0 && !r.hoverData.draggingEles && !r.swipePanning && r.data.bgActivePosistion != null) { + r.data.bgActivePosistion = undefined; + r.redrawHint('select', true); + r.redraw(); } - return _results; - }; - - - /* - Update the position of the given item in the heap. - This function should be called every time the item is being modified. - */ - - updateItem = function(array, item, cmp) { - var pos; - if (cmp == null) { - cmp = defaultCmp; + }, false); + var touchcancelHandler; + r.registerBinding(containerWindow, 'touchcancel', touchcancelHandler = function touchcancelHandler(e) { + // eslint-disable-line no-unused-vars + var start = r.touchData.start; + r.touchData.capture = false; + if (start) { + start.unactivate(); } - pos = array.indexOf(item); - if (pos === -1) { + }); + var touchendHandler, didDoubleTouch, touchTimeout, prevTouchTimeStamp; + r.registerBinding(containerWindow, 'touchend', touchendHandler = function touchendHandler(e) { + // eslint-disable-line no-unused-vars + var start = r.touchData.start; + var capture = r.touchData.capture; + if (capture) { + if (e.touches.length === 0) { + r.touchData.capture = false; + } + e.preventDefault(); + } else { return; } - _siftdown(array, 0, pos, cmp); - return _siftup(array, pos, cmp); - }; - - - /* - Find the n largest elements in a dataset. - */ - - nlargest = function(array, n, cmp) { - var elem, result, _i, _len, _ref; - if (cmp == null) { - cmp = defaultCmp; + var select = r.selection; + r.swipePanning = false; + r.hoverData.draggingEles = false; + var cy = r.cy; + var zoom = cy.zoom(); + var now = r.touchData.now; + var earlier = r.touchData.earlier; + if (e.touches[0]) { + var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY); + now[0] = pos[0]; + now[1] = pos[1]; } - result = array.slice(0, n); - if (!result.length) { - return result; + if (e.touches[1]) { + var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY); + now[2] = pos[0]; + now[3] = pos[1]; } - heapify(result, cmp); - _ref = array.slice(n); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - elem = _ref[_i]; - heappushpop(result, elem, cmp); + if (e.touches[2]) { + var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY); + now[4] = pos[0]; + now[5] = pos[1]; } - return result.sort(cmp).reverse(); - }; - - - /* - Find the n smallest elements in a dataset. - */ - - nsmallest = function(array, n, cmp) { - var elem, i, los, result, _i, _j, _len, _ref, _ref1, _results; - if (cmp == null) { - cmp = defaultCmp; + if (start) { + start.unactivate(); } - if (n * 10 <= array.length) { - result = array.slice(0, n).sort(cmp); - if (!result.length) { - return result; + var ctxTapend; + if (r.touchData.cxt) { + ctxTapend = { + originalEvent: e, + type: 'cxttapend', + position: { + x: now[0], + y: now[1] + } + }; + if (start) { + start.emit(ctxTapend); + } else { + cy.emit(ctxTapend); } - los = result[result.length - 1]; - _ref = array.slice(n); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - elem = _ref[_i]; - if (cmp(elem, los) < 0) { - insort(result, elem, 0, null, cmp); - result.pop(); - los = result[result.length - 1]; + if (!r.touchData.cxtDragged) { + var ctxTap = { + originalEvent: e, + type: 'cxttap', + position: { + x: now[0], + y: now[1] + } + }; + if (start) { + start.emit(ctxTap); + } else { + cy.emit(ctxTap); } } - return result; - } - heapify(array, cmp); - _results = []; - for (i = _j = 0, _ref1 = min(n, array.length); 0 <= _ref1 ? _j < _ref1 : _j > _ref1; i = 0 <= _ref1 ? ++_j : --_j) { - _results.push(heappop(array, cmp)); - } - return _results; - }; - - _siftdown = function(array, startpos, pos, cmp) { - var newitem, parent, parentpos; - if (cmp == null) { - cmp = defaultCmp; - } - newitem = array[pos]; - while (pos > startpos) { - parentpos = (pos - 1) >> 1; - parent = array[parentpos]; - if (cmp(newitem, parent) < 0) { - array[pos] = parent; - pos = parentpos; - continue; + if (r.touchData.start) { + r.touchData.start._private.grabbed = false; } - break; + r.touchData.cxt = false; + r.touchData.start = null; + r.redraw(); + return; } - return array[pos] = newitem; - }; - _siftup = function(array, pos, cmp) { - var childpos, endpos, newitem, rightpos, startpos; - if (cmp == null) { - cmp = defaultCmp; - } - endpos = array.length; - startpos = pos; - newitem = array[pos]; - childpos = 2 * pos + 1; - while (childpos < endpos) { - rightpos = childpos + 1; - if (rightpos < endpos && !(cmp(array[childpos], array[rightpos]) < 0)) { - childpos = rightpos; + // no more box selection if we don't have three fingers + if (!e.touches[2] && cy.boxSelectionEnabled() && r.touchData.selecting) { + r.touchData.selecting = false; + var box = cy.collection(r.getAllInBox(select[0], select[1], select[2], select[3])); + select[0] = undefined; + select[1] = undefined; + select[2] = undefined; + select[3] = undefined; + select[4] = 0; + r.redrawHint('select', true); + cy.emit({ + type: 'boxend', + originalEvent: e, + position: { + x: now[0], + y: now[1] + } + }); + var eleWouldBeSelected = function eleWouldBeSelected(ele) { + return ele.selectable() && !ele.selected(); + }; + box.emit('box').stdFilter(eleWouldBeSelected).select().emit('boxselect'); + if (box.nonempty()) { + r.redrawHint('eles', true); } - array[pos] = array[childpos]; - pos = childpos; - childpos = 2 * pos + 1; + r.redraw(); } - array[pos] = newitem; - return _siftdown(array, startpos, pos, cmp); - }; - - Heap = (function() { - Heap.push = heappush; - - Heap.pop = heappop; - - Heap.replace = heapreplace; - - Heap.pushpop = heappushpop; - - Heap.heapify = heapify; - - Heap.updateItem = updateItem; - - Heap.nlargest = nlargest; - - Heap.nsmallest = nsmallest; - - function Heap(cmp) { - this.cmp = cmp != null ? cmp : defaultCmp; - this.nodes = []; + if (start != null) { + start.unactivate(); } - - Heap.prototype.push = function(x) { - return heappush(this.nodes, x, this.cmp); - }; - - Heap.prototype.pop = function() { - return heappop(this.nodes, this.cmp); - }; - - Heap.prototype.peek = function() { - return this.nodes[0]; - }; - - Heap.prototype.contains = function(x) { - return this.nodes.indexOf(x) !== -1; - }; - - Heap.prototype.replace = function(x) { - return heapreplace(this.nodes, x, this.cmp); - }; - - Heap.prototype.pushpop = function(x) { - return heappushpop(this.nodes, x, this.cmp); - }; - - Heap.prototype.heapify = function() { - return heapify(this.nodes, this.cmp); - }; - - Heap.prototype.updateItem = function(x) { - return updateItem(this.nodes, x, this.cmp); - }; - - Heap.prototype.clear = function() { - return this.nodes = []; - }; - - Heap.prototype.empty = function() { - return this.nodes.length === 0; - }; - - Heap.prototype.size = function() { - return this.nodes.length; - }; - - Heap.prototype.clone = function() { - var heap; - heap = new Heap(); - heap.nodes = this.nodes.slice(0); - return heap; - }; - - Heap.prototype.toArray = function() { - return this.nodes.slice(0); - }; - - Heap.prototype.insert = Heap.prototype.push; - - Heap.prototype.top = Heap.prototype.peek; - - Heap.prototype.front = Heap.prototype.peek; - - Heap.prototype.has = Heap.prototype.contains; - - Heap.prototype.copy = Heap.prototype.clone; - - return Heap; - - })(); - - (function(root, factory) { - if (true) { - return !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), - __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? - (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), - __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - } else {} - })(this, function() { - return Heap; - }); - -}).call(this); - - -/***/ }), - -/***/ "./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js ***! - \**********************************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -"use strict"; - - -var reactIs = __webpack_require__(/*! react-is */ "./node_modules/react-is/index.js"); - -/** - * Copyright 2015, Yahoo! Inc. - * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. - */ -var REACT_STATICS = { - childContextTypes: true, - contextType: true, - contextTypes: true, - defaultProps: true, - displayName: true, - getDefaultProps: true, - getDerivedStateFromError: true, - getDerivedStateFromProps: true, - mixins: true, - propTypes: true, - type: true -}; -var KNOWN_STATICS = { - name: true, - length: true, - prototype: true, - caller: true, - callee: true, - arguments: true, - arity: true -}; -var FORWARD_REF_STATICS = { - '$$typeof': true, - render: true, - defaultProps: true, - displayName: true, - propTypes: true -}; -var MEMO_STATICS = { - '$$typeof': true, - compare: true, - defaultProps: true, - displayName: true, - propTypes: true, - type: true -}; -var TYPE_STATICS = {}; -TYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS; -TYPE_STATICS[reactIs.Memo] = MEMO_STATICS; - -function getStatics(component) { - // React v16.11 and below - if (reactIs.isMemo(component)) { - return MEMO_STATICS; - } // React v16.12 and above - - - return TYPE_STATICS[component['$$typeof']] || REACT_STATICS; -} - -var defineProperty = Object.defineProperty; -var getOwnPropertyNames = Object.getOwnPropertyNames; -var getOwnPropertySymbols = Object.getOwnPropertySymbols; -var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; -var getPrototypeOf = Object.getPrototypeOf; -var objectPrototype = Object.prototype; -function hoistNonReactStatics(targetComponent, sourceComponent, blacklist) { - if (typeof sourceComponent !== 'string') { - // don't hoist over string (html) components - if (objectPrototype) { - var inheritedComponent = getPrototypeOf(sourceComponent); - - if (inheritedComponent && inheritedComponent !== objectPrototype) { - hoistNonReactStatics(targetComponent, inheritedComponent, blacklist); + if (e.touches[2]) { + r.data.bgActivePosistion = undefined; + r.redrawHint('select', true); + } else if (e.touches[1]) ; else if (e.touches[0]) ; else if (!e.touches[0]) { + r.data.bgActivePosistion = undefined; + r.redrawHint('select', true); + var draggedEles = r.dragData.touchDragEles; + if (start != null) { + var startWasGrabbed = start._private.grabbed; + freeDraggedElements(draggedEles); + r.redrawHint('drag', true); + r.redrawHint('eles', true); + if (startWasGrabbed) { + start.emit('freeon'); + draggedEles.emit('free'); + if (r.dragData.didDrag) { + start.emit('dragfreeon'); + draggedEles.emit('dragfree'); + } + } + triggerEvents(start, ['touchend', 'tapend', 'vmouseup', 'tapdragout'], e, { + x: now[0], + y: now[1] + }); + start.unactivate(); + r.touchData.start = null; + } else { + var near = r.findNearestElement(now[0], now[1], true, true); + triggerEvents(near, ['touchend', 'tapend', 'vmouseup', 'tapdragout'], e, { + x: now[0], + y: now[1] + }); } - } + var dx = r.touchData.startPosition[0] - now[0]; + var dx2 = dx * dx; + var dy = r.touchData.startPosition[1] - now[1]; + var dy2 = dy * dy; + var dist2 = dx2 + dy2; + var rdist2 = dist2 * zoom * zoom; - var keys = getOwnPropertyNames(sourceComponent); + // Tap event, roughly same as mouse click event for touch + if (!r.touchData.singleTouchMoved) { + if (!start) { + cy.$(':selected').unselect(['tapunselect']); + } + triggerEvents(start, ['tap', 'vclick'], e, { + x: now[0], + y: now[1] + }); + didDoubleTouch = false; + if (e.timeStamp - prevTouchTimeStamp <= cy.multiClickDebounceTime()) { + touchTimeout && clearTimeout(touchTimeout); + didDoubleTouch = true; + prevTouchTimeStamp = null; + triggerEvents(start, ['dbltap', 'vdblclick'], e, { + x: now[0], + y: now[1] + }); + } else { + touchTimeout = setTimeout(function () { + if (didDoubleTouch) return; + triggerEvents(start, ['onetap', 'voneclick'], e, { + x: now[0], + y: now[1] + }); + }, cy.multiClickDebounceTime()); + prevTouchTimeStamp = e.timeStamp; + } + } - if (getOwnPropertySymbols) { - keys = keys.concat(getOwnPropertySymbols(sourceComponent)); + // Prepare to select the currently touched node, only if it hasn't been dragged past a certain distance + if (start != null && !r.dragData.didDrag // didn't drag nodes around + && start._private.selectable && rdist2 < r.touchTapThreshold2 && !r.pinching // pinch to zoom should not affect selection + ) { + if (cy.selectionType() === 'single') { + cy.$(isSelected).unmerge(start).unselect(['tapunselect']); + start.select(['tapselect']); + } else { + if (start.selected()) { + start.unselect(['tapunselect']); + } else { + start.select(['tapselect']); + } + } + r.redrawHint('eles', true); + } + r.touchData.singleTouchMoved = true; } + for (var j = 0; j < now.length; j++) { + earlier[j] = now[j]; + } + r.dragData.didDrag = false; // reset for next touchstart - var targetStatics = getStatics(targetComponent); - var sourceStatics = getStatics(sourceComponent); - - for (var i = 0; i < keys.length; ++i) { - var key = keys[i]; - - if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) { - var descriptor = getOwnPropertyDescriptor(sourceComponent, key); - - try { - // Avoid failures from read-only properties - defineProperty(targetComponent, key, descriptor); - } catch (e) {} + if (e.touches.length === 0) { + r.touchData.dragDelta = []; + r.touchData.startPosition = [null, null, null, null, null, null]; + r.touchData.startGPosition = null; + r.touchData.didSelect = false; + } + if (e.touches.length < 2) { + if (e.touches.length === 1) { + // the old start global pos'n may not be the same finger that remains + r.touchData.startGPosition = [e.touches[0].clientX, e.touches[0].clientY]; } + r.pinching = false; + r.redrawHint('eles', true); + r.redraw(); } - } - - return targetComponent; -} - -module.exports = hoistNonReactStatics; + //r.redraw(); + }, false); -/***/ }), - -/***/ "./node_modules/invariant/browser.js": -/*!*******************************************!*\ - !*** ./node_modules/invariant/browser.js ***! - \*******************************************/ -/***/ (function(module) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ + // fallback compatibility layer for ms pointer events + if (typeof TouchEvent === 'undefined') { + var pointers = []; + var makeTouch = function makeTouch(e) { + return { + clientX: e.clientX, + clientY: e.clientY, + force: 1, + identifier: e.pointerId, + pageX: e.pageX, + pageY: e.pageY, + radiusX: e.width / 2, + radiusY: e.height / 2, + screenX: e.screenX, + screenY: e.screenY, + target: e.target + }; + }; + var makePointer = function makePointer(e) { + return { + event: e, + touch: makeTouch(e) + }; + }; + var addPointer = function addPointer(e) { + pointers.push(makePointer(e)); + }; + var removePointer = function removePointer(e) { + for (var i = 0; i < pointers.length; i++) { + var p = pointers[i]; + if (p.event.pointerId === e.pointerId) { + pointers.splice(i, 1); + return; + } + } + }; + var updatePointer = function updatePointer(e) { + var p = pointers.filter(function (p) { + return p.event.pointerId === e.pointerId; + })[0]; + p.event = e; + p.touch = makeTouch(e); + }; + var addTouchesToEvent = function addTouchesToEvent(e) { + e.touches = pointers.map(function (p) { + return p.touch; + }); + }; + var pointerIsMouse = function pointerIsMouse(e) { + return e.pointerType === 'mouse' || e.pointerType === 4; + }; + r.registerBinding(r.container, 'pointerdown', function (e) { + if (pointerIsMouse(e)) { + return; + } // mouse already handled + e.preventDefault(); + addPointer(e); + addTouchesToEvent(e); + touchstartHandler(e); + }); + r.registerBinding(r.container, 'pointerup', function (e) { + if (pointerIsMouse(e)) { + return; + } // mouse already handled + removePointer(e); + addTouchesToEvent(e); + touchendHandler(e); + }); + r.registerBinding(r.container, 'pointercancel', function (e) { + if (pointerIsMouse(e)) { + return; + } // mouse already handled -/** - * Use invariant() to assert state which your program assumes to be true. - * - * Provide sprintf-style format (only %s is supported) and arguments - * to provide information about what broke and what you were - * expecting. - * - * The invariant message will be stripped in production, but the invariant - * will remain to ensure logic does not differ in production. - */ + removePointer(e); + addTouchesToEvent(e); + touchcancelHandler(e); + }); + r.registerBinding(r.container, 'pointermove', function (e) { + if (pointerIsMouse(e)) { + return; + } // mouse already handled -var invariant = function(condition, format, a, b, c, d, e, f) { - if (true) { - if (format === undefined) { - throw new Error('invariant requires an error message argument'); - } + e.preventDefault(); + updatePointer(e); + addTouchesToEvent(e); + touchmoveHandler(e); + }); } +}; - if (!condition) { - var error; - if (format === undefined) { - error = new Error( - 'Minified exception occurred; use the non-minified dev environment ' + - 'for the full error message and additional helpful warnings.' - ); +var BRp$2 = {}; +BRp$2.generatePolygon = function (name, points) { + return this.nodeShapes[name] = { + renderer: this, + name: name, + points: points, + draw: function draw(context, centerX, centerY, width, height) { + this.renderer.nodeShapeImpl('polygon', context, centerX, centerY, width, height, this.points); + }, + intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { + return polygonIntersectLine(x, y, this.points, nodeX, nodeY, width / 2, height / 2, padding); + }, + checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { + return pointInsidePolygon(x, y, this.points, centerX, centerY, width, height, [0, -1], padding); + } + }; +}; +BRp$2.generateEllipse = function () { + return this.nodeShapes['ellipse'] = { + renderer: this, + name: 'ellipse', + draw: function draw(context, centerX, centerY, width, height) { + this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); + }, + intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { + return intersectLineEllipse(x, y, nodeX, nodeY, width / 2 + padding, height / 2 + padding); + }, + checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { + return checkInEllipse(x, y, width, height, centerX, centerY, padding); + } + }; +}; +BRp$2.generateRoundPolygon = function (name, points) { + // Pre-compute control points + // Since these points depend on the radius length (which in turns depend on the width/height of the node) we will only pre-compute + // the unit vectors. + // For simplicity the layout will be: + // [ p0, UnitVectorP0P1, p1, UniVectorP1P2, ..., pn, UnitVectorPnP0 ] + var allPoints = new Array(points.length * 2); + for (var i = 0; i < points.length / 2; i++) { + var sourceIndex = i * 2; + var destIndex = void 0; + if (i < points.length / 2 - 1) { + destIndex = (i + 1) * 2; } else { - var args = [a, b, c, d, e, f]; - var argIndex = 0; - error = new Error( - format.replace(/%s/g, function() { return args[argIndex++]; }) - ); - error.name = 'Invariant Violation'; + destIndex = 0; } - - error.framesToPop = 1; // we don't care about invariant's own frame - throw error; + allPoints[i * 4] = points[sourceIndex]; + allPoints[i * 4 + 1] = points[sourceIndex + 1]; + var xDest = points[destIndex] - points[sourceIndex]; + var yDest = points[destIndex + 1] - points[sourceIndex + 1]; + var norm = Math.sqrt(xDest * xDest + yDest * yDest); + allPoints[i * 4 + 2] = xDest / norm; + allPoints[i * 4 + 3] = yDest / norm; } + return this.nodeShapes[name] = { + renderer: this, + name: name, + points: allPoints, + draw: function draw(context, centerX, centerY, width, height) { + this.renderer.nodeShapeImpl('round-polygon', context, centerX, centerY, width, height, this.points); + }, + intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { + return roundPolygonIntersectLine(x, y, this.points, nodeX, nodeY, width, height); + }, + checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { + return pointInsideRoundPolygon(x, y, this.points, centerX, centerY, width, height); + } + }; }; +BRp$2.generateRoundRectangle = function () { + return this.nodeShapes['round-rectangle'] = this.nodeShapes['roundrectangle'] = { + renderer: this, + name: 'round-rectangle', + points: generateUnitNgonPointsFitToSquare(4, 0), + draw: function draw(context, centerX, centerY, width, height) { + this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); + }, + intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { + return roundRectangleIntersectLine(x, y, nodeX, nodeY, width, height, padding); + }, + checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { + var cornerRadius = getRoundRectangleRadius(width, height); + var diam = cornerRadius * 2; -module.exports = invariant; + // Check hBox + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - diam, [0, -1], padding)) { + return true; + } + // Check vBox + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - diam, height, [0, -1], padding)) { + return true; + } -/***/ }), + // Check top left quarter circle + if (checkInEllipse(x, y, diam, diam, centerX - width / 2 + cornerRadius, centerY - height / 2 + cornerRadius, padding)) { + return true; + } -/***/ "./node_modules/is-string-blank/index.js": -/*!***********************************************!*\ - !*** ./node_modules/is-string-blank/index.js ***! - \***********************************************/ -/***/ (function(module) { + // Check top right quarter circle + if (checkInEllipse(x, y, diam, diam, centerX + width / 2 - cornerRadius, centerY - height / 2 + cornerRadius, padding)) { + return true; + } -"use strict"; - - -/** - * Is this string all whitespace? - * This solution kind of makes my brain hurt, but it's significantly faster - * than !str.trim() or any other solution I could find. - * - * whitespace codes from: http://en.wikipedia.org/wiki/Whitespace_character - * and verified with: - * - * for(var i = 0; i < 65536; i++) { - * var s = String.fromCharCode(i); - * if(+s===0 && !s.trim()) console.log(i, s); - * } - * - * which counts a couple of these as *not* whitespace, but finds nothing else - * that *is* whitespace. Note that charCodeAt stops at 16 bits, but it appears - * that there are no whitespace characters above this, and code points above - * this do not map onto white space characters. - */ - -module.exports = function(str){ - var l = str.length, - a; - for(var i = 0; i < l; i++) { - a = str.charCodeAt(i); - if((a < 9 || a > 13) && (a !== 32) && (a !== 133) && (a !== 160) && - (a !== 5760) && (a !== 6158) && (a < 8192 || a > 8205) && - (a !== 8232) && (a !== 8233) && (a !== 8239) && (a !== 8287) && - (a !== 8288) && (a !== 12288) && (a !== 65279)) { - return false; - } - } - return true; -} + // Check bottom right quarter circle + if (checkInEllipse(x, y, diam, diam, centerX + width / 2 - cornerRadius, centerY + height / 2 - cornerRadius, padding)) { + return true; + } + + // Check bottom left quarter circle + if (checkInEllipse(x, y, diam, diam, centerX - width / 2 + cornerRadius, centerY + height / 2 - cornerRadius, padding)) { + return true; + } + return false; + } + }; +}; +BRp$2.generateCutRectangle = function () { + return this.nodeShapes['cut-rectangle'] = this.nodeShapes['cutrectangle'] = { + renderer: this, + name: 'cut-rectangle', + cornerLength: getCutRectangleCornerLength(), + points: generateUnitNgonPointsFitToSquare(4, 0), + draw: function draw(context, centerX, centerY, width, height) { + this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); + }, + generateCutTrianglePts: function generateCutTrianglePts(width, height, centerX, centerY) { + var cl = this.cornerLength; + var hh = height / 2; + var hw = width / 2; + var xBegin = centerX - hw; + var xEnd = centerX + hw; + var yBegin = centerY - hh; + var yEnd = centerY + hh; + // points are in clockwise order, inner (imaginary) triangle pt on [4, 5] + return { + topLeft: [xBegin, yBegin + cl, xBegin + cl, yBegin, xBegin + cl, yBegin + cl], + topRight: [xEnd - cl, yBegin, xEnd, yBegin + cl, xEnd - cl, yBegin + cl], + bottomRight: [xEnd, yEnd - cl, xEnd - cl, yEnd, xEnd - cl, yEnd - cl], + bottomLeft: [xBegin + cl, yEnd, xBegin, yEnd - cl, xBegin + cl, yEnd - cl] + }; + }, + intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { + var cPts = this.generateCutTrianglePts(width + 2 * padding, height + 2 * padding, nodeX, nodeY); + var pts = [].concat.apply([], [cPts.topLeft.splice(0, 4), cPts.topRight.splice(0, 4), cPts.bottomRight.splice(0, 4), cPts.bottomLeft.splice(0, 4)]); + return polygonIntersectLine(x, y, pts, nodeX, nodeY); + }, + checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { + // Check hBox + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - 2 * this.cornerLength, [0, -1], padding)) { + return true; + } -/***/ }), + // Check vBox + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - 2 * this.cornerLength, height, [0, -1], padding)) { + return true; + } + var cutTrianglePts = this.generateCutTrianglePts(width, height, centerX, centerY); + return pointInsidePolygonPoints(x, y, cutTrianglePts.topLeft) || pointInsidePolygonPoints(x, y, cutTrianglePts.topRight) || pointInsidePolygonPoints(x, y, cutTrianglePts.bottomRight) || pointInsidePolygonPoints(x, y, cutTrianglePts.bottomLeft); + } + }; +}; +BRp$2.generateBarrel = function () { + return this.nodeShapes['barrel'] = { + renderer: this, + name: 'barrel', + points: generateUnitNgonPointsFitToSquare(4, 0), + draw: function draw(context, centerX, centerY, width, height) { + this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); + }, + intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { + // use two fixed t values for the bezier curve approximation -/***/ "./node_modules/layout-base/layout-base.js": -/*!*************************************************!*\ - !*** ./node_modules/layout-base/layout-base.js ***! - \*************************************************/ -/***/ (function(module) { + var t0 = 0.15; + var t1 = 0.5; + var t2 = 0.85; + var bPts = this.generateBarrelBezierPts(width + 2 * padding, height + 2 * padding, nodeX, nodeY); + var approximateBarrelCurvePts = function approximateBarrelCurvePts(pts) { + // approximate curve pts based on the two t values + var m0 = qbezierPtAt({ + x: pts[0], + y: pts[1] + }, { + x: pts[2], + y: pts[3] + }, { + x: pts[4], + y: pts[5] + }, t0); + var m1 = qbezierPtAt({ + x: pts[0], + y: pts[1] + }, { + x: pts[2], + y: pts[3] + }, { + x: pts[4], + y: pts[5] + }, t1); + var m2 = qbezierPtAt({ + x: pts[0], + y: pts[1] + }, { + x: pts[2], + y: pts[3] + }, { + x: pts[4], + y: pts[5] + }, t2); + return [pts[0], pts[1], m0.x, m0.y, m1.x, m1.y, m2.x, m2.y, pts[4], pts[5]]; + }; + var pts = [].concat(approximateBarrelCurvePts(bPts.topLeft), approximateBarrelCurvePts(bPts.topRight), approximateBarrelCurvePts(bPts.bottomRight), approximateBarrelCurvePts(bPts.bottomLeft)); + return polygonIntersectLine(x, y, pts, nodeX, nodeY); + }, + generateBarrelBezierPts: function generateBarrelBezierPts(width, height, centerX, centerY) { + var hh = height / 2; + var hw = width / 2; + var xBegin = centerX - hw; + var xEnd = centerX + hw; + var yBegin = centerY - hh; + var yEnd = centerY + hh; + var curveConstants = getBarrelCurveConstants(width, height); + var hOffset = curveConstants.heightOffset; + var wOffset = curveConstants.widthOffset; + var ctrlPtXOffset = curveConstants.ctrlPtOffsetPct * width; + + // points are in clockwise order, inner (imaginary) control pt on [4, 5] + var pts = { + topLeft: [xBegin, yBegin + hOffset, xBegin + ctrlPtXOffset, yBegin, xBegin + wOffset, yBegin], + topRight: [xEnd - wOffset, yBegin, xEnd - ctrlPtXOffset, yBegin, xEnd, yBegin + hOffset], + bottomRight: [xEnd, yEnd - hOffset, xEnd - ctrlPtXOffset, yEnd, xEnd - wOffset, yEnd], + bottomLeft: [xBegin + wOffset, yEnd, xBegin + ctrlPtXOffset, yEnd, xBegin, yEnd - hOffset] + }; + pts.topLeft.isTop = true; + pts.topRight.isTop = true; + pts.bottomLeft.isBottom = true; + pts.bottomRight.isBottom = true; + return pts; + }, + checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { + var curveConstants = getBarrelCurveConstants(width, height); + var hOffset = curveConstants.heightOffset; + var wOffset = curveConstants.widthOffset; + + // Check hBox + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - 2 * hOffset, [0, -1], padding)) { + return true; + } + + // Check vBox + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - 2 * wOffset, height, [0, -1], padding)) { + return true; + } + var barrelCurvePts = this.generateBarrelBezierPts(width, height, centerX, centerY); + var getCurveT = function getCurveT(x, y, curvePts) { + var x0 = curvePts[4]; + var x1 = curvePts[2]; + var x2 = curvePts[0]; + var y0 = curvePts[5]; + // var y1 = curvePts[ 3 ]; + var y2 = curvePts[1]; + var xMin = Math.min(x0, x2); + var xMax = Math.max(x0, x2); + var yMin = Math.min(y0, y2); + var yMax = Math.max(y0, y2); + if (xMin <= x && x <= xMax && yMin <= y && y <= yMax) { + var coeff = bezierPtsToQuadCoeff(x0, x1, x2); + var roots = solveQuadratic(coeff[0], coeff[1], coeff[2], x); + var validRoots = roots.filter(function (r) { + return 0 <= r && r <= 1; + }); + if (validRoots.length > 0) { + return validRoots[0]; + } + } + return null; + }; + var curveRegions = Object.keys(barrelCurvePts); + for (var i = 0; i < curveRegions.length; i++) { + var corner = curveRegions[i]; + var cornerPts = barrelCurvePts[corner]; + var t = getCurveT(x, y, cornerPts); + if (t == null) { + continue; + } + var y0 = cornerPts[5]; + var y1 = cornerPts[3]; + var y2 = cornerPts[1]; + var bezY = qbezierAt(y0, y1, y2, t); + if (cornerPts.isTop && bezY <= y) { + return true; + } + if (cornerPts.isBottom && y <= bezY) { + return true; + } + } + return false; + } + }; +}; +BRp$2.generateBottomRoundrectangle = function () { + return this.nodeShapes['bottom-round-rectangle'] = this.nodeShapes['bottomroundrectangle'] = { + renderer: this, + name: 'bottom-round-rectangle', + points: generateUnitNgonPointsFitToSquare(4, 0), + draw: function draw(context, centerX, centerY, width, height) { + this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); + }, + intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { + var topStartX = nodeX - (width / 2 + padding); + var topStartY = nodeY - (height / 2 + padding); + var topEndY = topStartY; + var topEndX = nodeX + (width / 2 + padding); + var topIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, topStartX, topStartY, topEndX, topEndY, false); + if (topIntersections.length > 0) { + return topIntersections; + } + return roundRectangleIntersectLine(x, y, nodeX, nodeY, width, height, padding); + }, + checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { + var cornerRadius = getRoundRectangleRadius(width, height); + var diam = 2 * cornerRadius; -(function webpackUniversalModuleDefinition(root, factory) { - if(true) - module.exports = factory(); - else {} -})(this, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __nested_webpack_require_543__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_543__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __nested_webpack_require_543__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __nested_webpack_require_543__.c = installedModules; -/******/ -/******/ // identity function for calling harmony imports with the correct context -/******/ __nested_webpack_require_543__.i = function(value) { return value; }; -/******/ -/******/ // define getter function for harmony exports -/******/ __nested_webpack_require_543__.d = function(exports, name, getter) { -/******/ if(!__nested_webpack_require_543__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { -/******/ configurable: false, -/******/ enumerable: true, -/******/ get: getter -/******/ }); -/******/ } -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __nested_webpack_require_543__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __nested_webpack_require_543__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __nested_webpack_require_543__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __nested_webpack_require_543__.p = ""; -/******/ -/******/ // Load entry module and return exports -/******/ return __nested_webpack_require_543__(__nested_webpack_require_543__.s = 28); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { + // Check hBox + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - diam, [0, -1], padding)) { + return true; + } -"use strict"; + // Check vBox + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - diam, height, [0, -1], padding)) { + return true; + } + // check non-rounded top side + var outerWidth = width / 2 + 2 * padding; + var outerHeight = height / 2 + 2 * padding; + var points = [centerX - outerWidth, centerY - outerHeight, centerX - outerWidth, centerY, centerX + outerWidth, centerY, centerX + outerWidth, centerY - outerHeight]; + if (pointInsidePolygonPoints(x, y, points)) { + return true; + } -function LayoutConstants() {} + // Check bottom right quarter circle + if (checkInEllipse(x, y, diam, diam, centerX + width / 2 - cornerRadius, centerY + height / 2 - cornerRadius, padding)) { + return true; + } -/** - * Layout Quality: 0:draft, 1:default, 2:proof - */ -LayoutConstants.QUALITY = 1; + // Check bottom left quarter circle + if (checkInEllipse(x, y, diam, diam, centerX - width / 2 + cornerRadius, centerY + height / 2 - cornerRadius, padding)) { + return true; + } + return false; + } + }; +}; +BRp$2.registerNodeShapes = function () { + var nodeShapes = this.nodeShapes = {}; + var renderer = this; + this.generateEllipse(); + this.generatePolygon('triangle', generateUnitNgonPointsFitToSquare(3, 0)); + this.generateRoundPolygon('round-triangle', generateUnitNgonPointsFitToSquare(3, 0)); + this.generatePolygon('rectangle', generateUnitNgonPointsFitToSquare(4, 0)); + nodeShapes['square'] = nodeShapes['rectangle']; + this.generateRoundRectangle(); + this.generateCutRectangle(); + this.generateBarrel(); + this.generateBottomRoundrectangle(); + { + var diamondPoints = [0, 1, 1, 0, 0, -1, -1, 0]; + this.generatePolygon('diamond', diamondPoints); + this.generateRoundPolygon('round-diamond', diamondPoints); + } + this.generatePolygon('pentagon', generateUnitNgonPointsFitToSquare(5, 0)); + this.generateRoundPolygon('round-pentagon', generateUnitNgonPointsFitToSquare(5, 0)); + this.generatePolygon('hexagon', generateUnitNgonPointsFitToSquare(6, 0)); + this.generateRoundPolygon('round-hexagon', generateUnitNgonPointsFitToSquare(6, 0)); + this.generatePolygon('heptagon', generateUnitNgonPointsFitToSquare(7, 0)); + this.generateRoundPolygon('round-heptagon', generateUnitNgonPointsFitToSquare(7, 0)); + this.generatePolygon('octagon', generateUnitNgonPointsFitToSquare(8, 0)); + this.generateRoundPolygon('round-octagon', generateUnitNgonPointsFitToSquare(8, 0)); + var star5Points = new Array(20); + { + var outerPoints = generateUnitNgonPoints(5, 0); + var innerPoints = generateUnitNgonPoints(5, Math.PI / 5); -/** - * Default parameters - */ -LayoutConstants.DEFAULT_CREATE_BENDS_AS_NEEDED = false; -LayoutConstants.DEFAULT_INCREMENTAL = false; -LayoutConstants.DEFAULT_ANIMATION_ON_LAYOUT = true; -LayoutConstants.DEFAULT_ANIMATION_DURING_LAYOUT = false; -LayoutConstants.DEFAULT_ANIMATION_PERIOD = 50; -LayoutConstants.DEFAULT_UNIFORM_LEAF_NODE_SIZES = false; + // Outer radius is 1; inner radius of star is smaller + var innerRadius = 0.5 * (3 - Math.sqrt(5)); + innerRadius *= 1.57; + for (var i = 0; i < innerPoints.length / 2; i++) { + innerPoints[i * 2] *= innerRadius; + innerPoints[i * 2 + 1] *= innerRadius; + } + for (var i = 0; i < 20 / 4; i++) { + star5Points[i * 4] = outerPoints[i * 2]; + star5Points[i * 4 + 1] = outerPoints[i * 2 + 1]; + star5Points[i * 4 + 2] = innerPoints[i * 2]; + star5Points[i * 4 + 3] = innerPoints[i * 2 + 1]; + } + } + star5Points = fitPolygonToSquare(star5Points); + this.generatePolygon('star', star5Points); + this.generatePolygon('vee', [-1, -1, 0, -0.333, 1, -1, 0, 1]); + this.generatePolygon('rhomboid', [-1, -1, 0.333, -1, 1, 1, -0.333, 1]); + this.generatePolygon('right-rhomboid', [-0.333, -1, 1, -1, 0.333, 1, -1, 1]); + this.nodeShapes['concavehexagon'] = this.generatePolygon('concave-hexagon', [-1, -0.95, -0.75, 0, -1, 0.95, 1, 0.95, 0.75, 0, 1, -0.95]); + { + var tagPoints = [-1, -1, 0.25, -1, 1, 0, 0.25, 1, -1, 1]; + this.generatePolygon('tag', tagPoints); + this.generateRoundPolygon('round-tag', tagPoints); + } + nodeShapes.makePolygon = function (points) { + // use caching on user-specified polygons so they are as fast as native shapes -// ----------------------------------------------------------------------------- -// Section: General other constants -// ----------------------------------------------------------------------------- -/* - * Margins of a graph to be applied on bouding rectangle of its contents. We - * assume margins on all four sides to be uniform. - */ -LayoutConstants.DEFAULT_GRAPH_MARGIN = 15; + var key = points.join('$'); + var name = 'polygon-' + key; + var shape; + if (shape = this[name]) { + // got cached shape + return shape; + } -/* - * Whether to consider labels in node dimensions or not - */ -LayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS = false; + // create and cache new shape + return renderer.generatePolygon(name, points); + }; +}; -/* - * Default dimension of a non-compound node. - */ -LayoutConstants.SIMPLE_NODE_SIZE = 40; +var BRp$1 = {}; +BRp$1.timeToRender = function () { + return this.redrawTotalTime / this.redrawCount; +}; +BRp$1.redraw = function (options) { + options = options || staticEmptyObject(); + var r = this; + if (r.averageRedrawTime === undefined) { + r.averageRedrawTime = 0; + } + if (r.lastRedrawTime === undefined) { + r.lastRedrawTime = 0; + } + if (r.lastDrawTime === undefined) { + r.lastDrawTime = 0; + } + r.requestedFrame = true; + r.renderOptions = options; +}; +BRp$1.beforeRender = function (fn, priority) { + // the renderer can't add tick callbacks when destroyed + if (this.destroyed) { + return; + } + if (priority == null) { + error('Priority is not optional for beforeRender'); + } + var cbs = this.beforeRenderCallbacks; + cbs.push({ + fn: fn, + priority: priority + }); -/* - * Default dimension of a non-compound node. - */ -LayoutConstants.SIMPLE_NODE_HALF_SIZE = LayoutConstants.SIMPLE_NODE_SIZE / 2; + // higher priority callbacks executed first + cbs.sort(function (a, b) { + return b.priority - a.priority; + }); +}; +var beforeRenderCallbacks = function beforeRenderCallbacks(r, willDraw, startTime) { + var cbs = r.beforeRenderCallbacks; + for (var i = 0; i < cbs.length; i++) { + cbs[i].fn(willDraw, startTime); + } +}; +BRp$1.startRenderLoop = function () { + var r = this; + var cy = r.cy; + if (r.renderLoopStarted) { + return; + } else { + r.renderLoopStarted = true; + } + var renderFn = function renderFn(requestTime) { + if (r.destroyed) { + return; + } + if (cy.batching()) ; else if (r.requestedFrame && !r.skipFrame) { + beforeRenderCallbacks(r, true, requestTime); + var startTime = performanceNow(); + r.render(r.renderOptions); + var endTime = r.lastDrawTime = performanceNow(); + if (r.averageRedrawTime === undefined) { + r.averageRedrawTime = endTime - startTime; + } + if (r.redrawCount === undefined) { + r.redrawCount = 0; + } + r.redrawCount++; + if (r.redrawTotalTime === undefined) { + r.redrawTotalTime = 0; + } + var duration = endTime - startTime; + r.redrawTotalTime += duration; + r.lastRedrawTime = duration; -/* - * Empty compound node size. When a compound node is empty, its both - * dimensions should be of this value. - */ -LayoutConstants.EMPTY_COMPOUND_NODE_SIZE = 40; + // use a weighted average with a bias from the previous average so we don't spike so easily + r.averageRedrawTime = r.averageRedrawTime / 2 + duration / 2; + r.requestedFrame = false; + } else { + beforeRenderCallbacks(r, false, requestTime); + } + r.skipFrame = false; + requestAnimationFrame(renderFn); + }; + requestAnimationFrame(renderFn); +}; -/* - * Minimum length that an edge should take during layout - */ -LayoutConstants.MIN_EDGE_LENGTH = 1; +var BaseRenderer = function BaseRenderer(options) { + this.init(options); +}; +var BR = BaseRenderer; +var BRp = BR.prototype; +BRp.clientFunctions = ['redrawHint', 'render', 'renderTo', 'matchCanvasSize', 'nodeShapeImpl', 'arrowShapeImpl']; +BRp.init = function (options) { + var r = this; + r.options = options; + r.cy = options.cy; + var ctr = r.container = options.cy.container(); + var containerWindow = r.cy.window(); -/* - * World boundaries that layout operates on - */ -LayoutConstants.WORLD_BOUNDARY = 1000000; + // prepend a stylesheet in the head such that + if (containerWindow) { + var document = containerWindow.document; + var head = document.head; + var stylesheetId = '__________cytoscape_stylesheet'; + var className = '__________cytoscape_container'; + var stylesheetAlreadyExists = document.getElementById(stylesheetId) != null; + if (ctr.className.indexOf(className) < 0) { + ctr.className = (ctr.className || '') + ' ' + className; + } + if (!stylesheetAlreadyExists) { + var stylesheet = document.createElement('style'); + stylesheet.id = stylesheetId; + stylesheet.textContent = '.' + className + ' { position: relative; }'; + head.insertBefore(stylesheet, head.children[0]); // first so lowest priority + } -/* - * World boundaries that random positioning can be performed with - */ -LayoutConstants.INITIAL_WORLD_BOUNDARY = LayoutConstants.WORLD_BOUNDARY / 1000; + var computedStyle = containerWindow.getComputedStyle(ctr); + var position = computedStyle.getPropertyValue('position'); + if (position === 'static') { + warn('A Cytoscape container has style position:static and so can not use UI extensions properly'); + } + } + r.selection = [undefined, undefined, undefined, undefined, 0]; // Coordinates for selection box, plus enabled flag -/* - * Coordinates of the world center - */ -LayoutConstants.WORLD_CENTER_X = 1200; -LayoutConstants.WORLD_CENTER_Y = 900; + r.bezierProjPcts = [0.05, 0.225, 0.4, 0.5, 0.6, 0.775, 0.95]; -module.exports = LayoutConstants; + //--Pointer-related data + r.hoverData = { + down: null, + last: null, + downTime: null, + triggerMode: null, + dragging: false, + initialPan: [null, null], + capture: false + }; + r.dragData = { + possibleDragElements: [] + }; + r.touchData = { + start: null, + capture: false, + // These 3 fields related to tap, taphold events + startPosition: [null, null, null, null, null, null], + singleTouchStartTime: null, + singleTouchMoved: true, + now: [null, null, null, null, null, null], + earlier: [null, null, null, null, null, null] + }; + r.redraws = 0; + r.showFps = options.showFps; + r.debug = options.debug; + r.hideEdgesOnViewport = options.hideEdgesOnViewport; + r.textureOnViewport = options.textureOnViewport; + r.wheelSensitivity = options.wheelSensitivity; + r.motionBlurEnabled = options.motionBlur; // on by default + r.forcedPixelRatio = number$1(options.pixelRatio) ? options.pixelRatio : null; + r.motionBlur = options.motionBlur; // for initial kick off + r.motionBlurOpacity = options.motionBlurOpacity; + r.motionBlurTransparency = 1 - r.motionBlurOpacity; + r.motionBlurPxRatio = 1; + r.mbPxRBlurry = 1; //0.8; + r.minMbLowQualFrames = 4; + r.fullQualityMb = false; + r.clearedForMotionBlur = []; + r.desktopTapThreshold = options.desktopTapThreshold; + r.desktopTapThreshold2 = options.desktopTapThreshold * options.desktopTapThreshold; + r.touchTapThreshold = options.touchTapThreshold; + r.touchTapThreshold2 = options.touchTapThreshold * options.touchTapThreshold; + r.tapholdDuration = 500; + r.bindings = []; + r.beforeRenderCallbacks = []; + r.beforeRenderPriorities = { + // higher priority execs before lower one + animations: 400, + eleCalcs: 300, + eleTxrDeq: 200, + lyrTxrDeq: 150, + lyrTxrSkip: 100 + }; + r.registerNodeShapes(); + r.registerArrowShapes(); + r.registerCalculationListeners(); +}; +BRp.notify = function (eventName, eles) { + var r = this; + var cy = r.cy; -/***/ }), -/* 1 */ -/***/ (function(module, exports, __nested_webpack_require_4947__) { + // the renderer can't be notified after it's destroyed + if (this.destroyed) { + return; + } + if (eventName === 'init') { + r.load(); + return; + } + if (eventName === 'destroy') { + r.destroy(); + return; + } + if (eventName === 'add' || eventName === 'remove' || eventName === 'move' && cy.hasCompoundNodes() || eventName === 'load' || eventName === 'zorder' || eventName === 'mount') { + r.invalidateCachedZSortedEles(); + } + if (eventName === 'viewport') { + r.redrawHint('select', true); + } + if (eventName === 'load' || eventName === 'resize' || eventName === 'mount') { + r.invalidateContainerClientCoordsCache(); + r.matchCanvasSize(r.container); + } + r.redrawHint('eles', true); + r.redrawHint('drag', true); + this.startRenderLoop(); + this.redraw(); +}; +BRp.destroy = function () { + var r = this; + r.destroyed = true; + r.cy.stopAnimationLoop(); + for (var i = 0; i < r.bindings.length; i++) { + var binding = r.bindings[i]; + var b = binding; + var tgt = b.target; + (tgt.off || tgt.removeEventListener).apply(tgt, b.args); + } + r.bindings = []; + r.beforeRenderCallbacks = []; + r.onUpdateEleCalcsFns = []; + if (r.removeObserver) { + r.removeObserver.disconnect(); + } + if (r.styleObserver) { + r.styleObserver.disconnect(); + } + if (r.resizeObserver) { + r.resizeObserver.disconnect(); + } + if (r.labelCalcDiv) { + try { + document.body.removeChild(r.labelCalcDiv); // eslint-disable-line no-undef + } catch (e) { + // ie10 issue #1014 + } + } +}; +BRp.isHeadless = function () { + return false; +}; +[BRp$f, BRp$5, BRp$4, BRp$3, BRp$2, BRp$1].forEach(function (props) { + extend(BRp, props); +}); -"use strict"; +var fullFpsTime = 1000 / 60; // assume 60 frames per second +var defs = { + setupDequeueing: function setupDequeueing(opts) { + return function setupDequeueingImpl() { + var self = this; + var r = this.renderer; + if (self.dequeueingSetup) { + return; + } else { + self.dequeueingSetup = true; + } + var queueRedraw = debounce__default["default"](function () { + r.redrawHint('eles', true); + r.redrawHint('drag', true); + r.redraw(); + }, opts.deqRedrawThreshold); + var dequeue = function dequeue(willDraw, frameStartTime) { + var startTime = performanceNow(); + var avgRenderTime = r.averageRedrawTime; + var renderTime = r.lastRedrawTime; + var deqd = []; + var extent = r.cy.extent(); + var pixelRatio = r.getPixelRatio(); -var LGraphObject = __nested_webpack_require_4947__(2); -var IGeometry = __nested_webpack_require_4947__(8); -var IMath = __nested_webpack_require_4947__(9); + // if we aren't in a tick that causes a draw, then the rendered style + // queue won't automatically be flushed before dequeueing starts + if (!willDraw) { + r.flushRenderedStyleQueue(); + } + while (true) { + // eslint-disable-line no-constant-condition + var now = performanceNow(); + var duration = now - startTime; + var frameDuration = now - frameStartTime; + if (renderTime < fullFpsTime) { + // if we're rendering faster than the ideal fps, then do dequeueing + // during all of the remaining frame time -function LEdge(source, target, vEdge) { - LGraphObject.call(this, vEdge); + var timeAvailable = fullFpsTime - (willDraw ? avgRenderTime : 0); + if (frameDuration >= opts.deqFastCost * timeAvailable) { + break; + } + } else { + if (willDraw) { + if (duration >= opts.deqCost * renderTime || duration >= opts.deqAvgCost * avgRenderTime) { + break; + } + } else if (frameDuration >= opts.deqNoDrawCost * fullFpsTime) { + break; + } + } + var thisDeqd = opts.deq(self, pixelRatio, extent); + if (thisDeqd.length > 0) { + for (var i = 0; i < thisDeqd.length; i++) { + deqd.push(thisDeqd[i]); + } + } else { + break; + } + } - this.isOverlapingSourceAndTarget = false; - this.vGraphObject = vEdge; - this.bendpoints = []; - this.source = source; - this.target = target; -} + // callbacks on dequeue + if (deqd.length > 0) { + opts.onDeqd(self, deqd); + if (!willDraw && opts.shouldRedraw(self, deqd, pixelRatio, extent)) { + queueRedraw(); + } + } + }; + var priority = opts.priority || noop$1; + r.beforeRender(dequeue, priority(self)); + }; + } +}; -LEdge.prototype = Object.create(LGraphObject.prototype); +// Allows lookups for (ele, lvl) => cache. +// Uses keys so elements may share the same cache. +var ElementTextureCacheLookup = /*#__PURE__*/function () { + function ElementTextureCacheLookup(getKey) { + var doesEleInvalidateKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : falsify; + _classCallCheck(this, ElementTextureCacheLookup); + this.idsByKey = new Map$1(); + this.keyForId = new Map$1(); + this.cachesByLvl = new Map$1(); + this.lvls = []; + this.getKey = getKey; + this.doesEleInvalidateKey = doesEleInvalidateKey; + } + _createClass(ElementTextureCacheLookup, [{ + key: "getIdsFor", + value: function getIdsFor(key) { + if (key == null) { + error("Can not get id list for null key"); + } + var idsByKey = this.idsByKey; + var ids = this.idsByKey.get(key); + if (!ids) { + ids = new Set$1(); + idsByKey.set(key, ids); + } + return ids; + } + }, { + key: "addIdForKey", + value: function addIdForKey(key, id) { + if (key != null) { + this.getIdsFor(key).add(id); + } + } + }, { + key: "deleteIdForKey", + value: function deleteIdForKey(key, id) { + if (key != null) { + this.getIdsFor(key)["delete"](id); + } + } + }, { + key: "getNumberOfIdsForKey", + value: function getNumberOfIdsForKey(key) { + if (key == null) { + return 0; + } else { + return this.getIdsFor(key).size; + } + } + }, { + key: "updateKeyMappingFor", + value: function updateKeyMappingFor(ele) { + var id = ele.id(); + var prevKey = this.keyForId.get(id); + var currKey = this.getKey(ele); + this.deleteIdForKey(prevKey, id); + this.addIdForKey(currKey, id); + this.keyForId.set(id, currKey); + } + }, { + key: "deleteKeyMappingFor", + value: function deleteKeyMappingFor(ele) { + var id = ele.id(); + var prevKey = this.keyForId.get(id); + this.deleteIdForKey(prevKey, id); + this.keyForId["delete"](id); + } + }, { + key: "keyHasChangedFor", + value: function keyHasChangedFor(ele) { + var id = ele.id(); + var prevKey = this.keyForId.get(id); + var newKey = this.getKey(ele); + return prevKey !== newKey; + } + }, { + key: "isInvalid", + value: function isInvalid(ele) { + return this.keyHasChangedFor(ele) || this.doesEleInvalidateKey(ele); + } + }, { + key: "getCachesAt", + value: function getCachesAt(lvl) { + var cachesByLvl = this.cachesByLvl, + lvls = this.lvls; + var caches = cachesByLvl.get(lvl); + if (!caches) { + caches = new Map$1(); + cachesByLvl.set(lvl, caches); + lvls.push(lvl); + } + return caches; + } + }, { + key: "getCache", + value: function getCache(key, lvl) { + return this.getCachesAt(lvl).get(key); + } + }, { + key: "get", + value: function get(ele, lvl) { + var key = this.getKey(ele); + var cache = this.getCache(key, lvl); -for (var prop in LGraphObject) { - LEdge[prop] = LGraphObject[prop]; -} + // getting for an element may need to add to the id list b/c eles can share keys + if (cache != null) { + this.updateKeyMappingFor(ele); + } + return cache; + } + }, { + key: "getForCachedKey", + value: function getForCachedKey(ele, lvl) { + var key = this.keyForId.get(ele.id()); // n.b. use cached key, not newly computed key + var cache = this.getCache(key, lvl); + return cache; + } + }, { + key: "hasCache", + value: function hasCache(key, lvl) { + return this.getCachesAt(lvl).has(key); + } + }, { + key: "has", + value: function has(ele, lvl) { + var key = this.getKey(ele); + return this.hasCache(key, lvl); + } + }, { + key: "setCache", + value: function setCache(key, lvl, cache) { + cache.key = key; + this.getCachesAt(lvl).set(key, cache); + } + }, { + key: "set", + value: function set(ele, lvl, cache) { + var key = this.getKey(ele); + this.setCache(key, lvl, cache); + this.updateKeyMappingFor(ele); + } + }, { + key: "deleteCache", + value: function deleteCache(key, lvl) { + this.getCachesAt(lvl)["delete"](key); + } + }, { + key: "delete", + value: function _delete(ele, lvl) { + var key = this.getKey(ele); + this.deleteCache(key, lvl); + } + }, { + key: "invalidateKey", + value: function invalidateKey(key) { + var _this = this; + this.lvls.forEach(function (lvl) { + return _this.deleteCache(key, lvl); + }); + } -LEdge.prototype.getSource = function () { - return this.source; -}; + // returns true if no other eles reference the invalidated cache (n.b. other eles may need the cache with the same key) + }, { + key: "invalidate", + value: function invalidate(ele) { + var id = ele.id(); + var key = this.keyForId.get(id); // n.b. use stored key rather than current (potential key) -LEdge.prototype.getTarget = function () { - return this.target; -}; + this.deleteKeyMappingFor(ele); + var entireKeyInvalidated = this.doesEleInvalidateKey(ele); + if (entireKeyInvalidated) { + // clear mapping for current key + this.invalidateKey(key); + } + return entireKeyInvalidated || this.getNumberOfIdsForKey(key) === 0; + } + }]); + return ElementTextureCacheLookup; +}(); -LEdge.prototype.isInterGraph = function () { - return this.isInterGraph; -}; +var minTxrH = 25; // the size of the texture cache for small height eles (special case) +var txrStepH = 50; // the min size of the regular cache, and the size it increases with each step up +var minLvl$1 = -4; // when scaling smaller than that we don't need to re-render +var maxLvl$1 = 3; // when larger than this scale just render directly (caching is not helpful) +var maxZoom$1 = 7.99; // beyond this zoom level, layered textures are not used +var eleTxrSpacing = 8; // spacing between elements on textures to avoid blitting overlaps +var defTxrWidth = 1024; // default/minimum texture width +var maxTxrW = 1024; // the maximum width of a texture +var maxTxrH = 1024; // the maximum height of a texture +var minUtility = 0.2; // if usage of texture is less than this, it is retired +var maxFullness = 0.8; // fullness of texture after which queue removal is checked +var maxFullnessChecks = 10; // dequeued after this many checks +var deqCost$1 = 0.15; // % of add'l rendering cost allowed for dequeuing ele caches each frame +var deqAvgCost$1 = 0.1; // % of add'l rendering cost compared to average overall redraw time +var deqNoDrawCost$1 = 0.9; // % of avg frame time that can be used for dequeueing when not drawing +var deqFastCost$1 = 0.9; // % of frame time to be used when >60fps +var deqRedrawThreshold$1 = 100; // time to batch redraws together from dequeueing to allow more dequeueing calcs to happen in the meanwhile +var maxDeqSize$1 = 1; // number of eles to dequeue and render at higher texture in each batch -LEdge.prototype.getLength = function () { - return this.length; +var getTxrReasons = { + dequeue: 'dequeue', + downscale: 'downscale', + highQuality: 'highQuality' }; - -LEdge.prototype.isOverlapingSourceAndTarget = function () { - return this.isOverlapingSourceAndTarget; +var initDefaults = defaults$g({ + getKey: null, + doesEleInvalidateKey: falsify, + drawElement: null, + getBoundingBox: null, + getRotationPoint: null, + getRotationOffset: null, + isVisible: trueify, + allowEdgeTxrCaching: true, + allowParentTxrCaching: true +}); +var ElementTextureCache = function ElementTextureCache(renderer, initOptions) { + var self = this; + self.renderer = renderer; + self.onDequeues = []; + var opts = initDefaults(initOptions); + extend(self, opts); + self.lookup = new ElementTextureCacheLookup(opts.getKey, opts.doesEleInvalidateKey); + self.setupDequeueing(); }; +var ETCp = ElementTextureCache.prototype; +ETCp.reasons = getTxrReasons; -LEdge.prototype.getBendpoints = function () { - return this.bendpoints; +// the list of textures in which new subtextures for elements can be placed +ETCp.getTextureQueue = function (txrH) { + var self = this; + self.eleImgCaches = self.eleImgCaches || {}; + return self.eleImgCaches[txrH] = self.eleImgCaches[txrH] || []; }; -LEdge.prototype.getLca = function () { - return this.lca; +// the list of usused textures which can be recycled (in use in texture queue) +ETCp.getRetiredTextureQueue = function (txrH) { + var self = this; + var rtxtrQs = self.eleImgCaches.retired = self.eleImgCaches.retired || {}; + var rtxtrQ = rtxtrQs[txrH] = rtxtrQs[txrH] || []; + return rtxtrQ; }; -LEdge.prototype.getSourceInLca = function () { - return this.sourceInLca; +// queue of element draw requests at different scale levels +ETCp.getElementQueue = function () { + var self = this; + var q = self.eleCacheQueue = self.eleCacheQueue || new Heap__default["default"](function (a, b) { + return b.reqs - a.reqs; + }); + return q; }; -LEdge.prototype.getTargetInLca = function () { - return this.targetInLca; +// queue of element draw requests at different scale levels (element id lookup) +ETCp.getElementKeyToQueue = function () { + var self = this; + var k2q = self.eleKeyToCacheQueue = self.eleKeyToCacheQueue || {}; + return k2q; }; - -LEdge.prototype.getOtherEnd = function (node) { - if (this.source === node) { - return this.target; - } else if (this.target === node) { - return this.source; - } else { - throw "Node is not incident with this edge"; +ETCp.getElement = function (ele, bb, pxRatio, lvl, reason) { + var self = this; + var r = this.renderer; + var zoom = r.cy.zoom(); + var lookup = this.lookup; + if (!bb || bb.w === 0 || bb.h === 0 || isNaN(bb.w) || isNaN(bb.h) || !ele.visible() || ele.removed()) { + return null; } -}; - -LEdge.prototype.getOtherEndInGraph = function (node, graph) { - var otherEnd = this.getOtherEnd(node); - var root = graph.getGraphManager().getRoot(); - - while (true) { - if (otherEnd.getOwner() == graph) { - return otherEnd; - } - - if (otherEnd.getOwner() == root) { - break; - } - - otherEnd = otherEnd.getOwner().getParent(); + if (!self.allowEdgeTxrCaching && ele.isEdge() || !self.allowParentTxrCaching && ele.isParent()) { + return null; } - - return null; -}; - -LEdge.prototype.updateLength = function () { - var clipPointCoordinates = new Array(4); - - this.isOverlapingSourceAndTarget = IGeometry.getIntersection(this.target.getRect(), this.source.getRect(), clipPointCoordinates); - - if (!this.isOverlapingSourceAndTarget) { - this.lengthX = clipPointCoordinates[0] - clipPointCoordinates[2]; - this.lengthY = clipPointCoordinates[1] - clipPointCoordinates[3]; - - if (Math.abs(this.lengthX) < 1.0) { - this.lengthX = IMath.sign(this.lengthX); - } - - if (Math.abs(this.lengthY) < 1.0) { - this.lengthY = IMath.sign(this.lengthY); - } - - this.length = Math.sqrt(this.lengthX * this.lengthX + this.lengthY * this.lengthY); + if (lvl == null) { + lvl = Math.ceil(log2(zoom * pxRatio)); } -}; - -LEdge.prototype.updateLengthSimple = function () { - this.lengthX = this.target.getCenterX() - this.source.getCenterX(); - this.lengthY = this.target.getCenterY() - this.source.getCenterY(); - - if (Math.abs(this.lengthX) < 1.0) { - this.lengthX = IMath.sign(this.lengthX); + if (lvl < minLvl$1) { + lvl = minLvl$1; + } else if (zoom >= maxZoom$1 || lvl > maxLvl$1) { + return null; } - - if (Math.abs(this.lengthY) < 1.0) { - this.lengthY = IMath.sign(this.lengthY); + var scale = Math.pow(2, lvl); + var eleScaledH = bb.h * scale; + var eleScaledW = bb.w * scale; + var scaledLabelShown = r.eleTextBiggerThanMin(ele, scale); + if (!this.isVisible(ele, scaledLabelShown)) { + return null; } + var eleCache = lookup.get(ele, lvl); - this.length = Math.sqrt(this.lengthX * this.lengthX + this.lengthY * this.lengthY); -}; - -module.exports = LEdge; - -/***/ }), -/* 2 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -function LGraphObject(vGraphObject) { - this.vGraphObject = vGraphObject; -} - -module.exports = LGraphObject; - -/***/ }), -/* 3 */ -/***/ (function(module, exports, __nested_webpack_require_8167__) { - -"use strict"; - - -var LGraphObject = __nested_webpack_require_8167__(2); -var Integer = __nested_webpack_require_8167__(10); -var RectangleD = __nested_webpack_require_8167__(13); -var LayoutConstants = __nested_webpack_require_8167__(0); -var RandomSeed = __nested_webpack_require_8167__(16); -var PointD = __nested_webpack_require_8167__(5); - -function LNode(gm, loc, size, vNode) { - //Alternative constructor 1 : LNode(LGraphManager gm, Point loc, Dimension size, Object vNode) - if (size == null && vNode == null) { - vNode = loc; + // if this get was on an unused/invalidated cache, then restore the texture usage metric + if (eleCache && eleCache.invalidated) { + eleCache.invalidated = false; + eleCache.texture.invalidatedWidth -= eleCache.width; + } + if (eleCache) { + return eleCache; } + var txrH; // which texture height this ele belongs to - LGraphObject.call(this, vNode); + if (eleScaledH <= minTxrH) { + txrH = minTxrH; + } else if (eleScaledH <= txrStepH) { + txrH = txrStepH; + } else { + txrH = Math.ceil(eleScaledH / txrStepH) * txrStepH; + } + if (eleScaledH > maxTxrH || eleScaledW > maxTxrW) { + return null; // caching large elements is not efficient + } - //Alternative constructor 2 : LNode(Layout layout, Object vNode) - if (gm.graphManager != null) gm = gm.graphManager; + var txrQ = self.getTextureQueue(txrH); - this.estimatedSize = Integer.MIN_VALUE; - this.inclusionTreeDepth = Integer.MAX_VALUE; - this.vGraphObject = vNode; - this.edges = []; - this.graphManager = gm; + // first try the second last one in case it has space at the end + var txr = txrQ[txrQ.length - 2]; + var addNewTxr = function addNewTxr() { + return self.recycleTexture(txrH, eleScaledW) || self.addTexture(txrH, eleScaledW); + }; - if (size != null && loc != null) this.rect = new RectangleD(loc.x, loc.y, size.width, size.height);else this.rect = new RectangleD(); -} + // try the last one if there is no second last one + if (!txr) { + txr = txrQ[txrQ.length - 1]; + } -LNode.prototype = Object.create(LGraphObject.prototype); -for (var prop in LGraphObject) { - LNode[prop] = LGraphObject[prop]; -} + // if the last one doesn't exist, we need a first one + if (!txr) { + txr = addNewTxr(); + } -LNode.prototype.getEdges = function () { - return this.edges; -}; + // if there's no room in the current texture, we need a new one + if (txr.width - txr.usedWidth < eleScaledW) { + txr = addNewTxr(); + } + var scalableFrom = function scalableFrom(otherCache) { + return otherCache && otherCache.scaledLabelShown === scaledLabelShown; + }; + var deqing = reason && reason === getTxrReasons.dequeue; + var highQualityReq = reason && reason === getTxrReasons.highQuality; + var downscaleReq = reason && reason === getTxrReasons.downscale; + var higherCache; // the nearest cache with a higher level + for (var l = lvl + 1; l <= maxLvl$1; l++) { + var c = lookup.get(ele, l); + if (c) { + higherCache = c; + break; + } + } + var oneUpCache = higherCache && higherCache.level === lvl + 1 ? higherCache : null; + var downscale = function downscale() { + txr.context.drawImage(oneUpCache.texture.canvas, oneUpCache.x, 0, oneUpCache.width, oneUpCache.height, txr.usedWidth, 0, eleScaledW, eleScaledH); + }; -LNode.prototype.getChild = function () { - return this.child; -}; + // reset ele area in texture + txr.context.setTransform(1, 0, 0, 1, 0, 0); + txr.context.clearRect(txr.usedWidth, 0, eleScaledW, txrH); + if (scalableFrom(oneUpCache)) { + // then we can relatively cheaply rescale the existing image w/o rerendering + downscale(); + } else if (scalableFrom(higherCache)) { + // then use the higher cache for now and queue the next level down + // to cheaply scale towards the smaller level -LNode.prototype.getOwner = function () { - // if (this.owner != null) { - // if (!(this.owner == null || this.owner.getNodes().indexOf(this) > -1)) { - // throw "assert failed"; - // } - // } + if (highQualityReq) { + for (var _l = higherCache.level; _l > lvl; _l--) { + oneUpCache = self.getElement(ele, bb, pxRatio, _l, getTxrReasons.downscale); + } + downscale(); + } else { + self.queueElement(ele, higherCache.level - 1); + return higherCache; + } + } else { + var lowerCache; // the nearest cache with a lower level + if (!deqing && !highQualityReq && !downscaleReq) { + for (var _l2 = lvl - 1; _l2 >= minLvl$1; _l2--) { + var _c = lookup.get(ele, _l2); + if (_c) { + lowerCache = _c; + break; + } + } + } + if (scalableFrom(lowerCache)) { + // then use the lower quality cache for now and queue the better one for later - return this.owner; + self.queueElement(ele, lvl); + return lowerCache; + } + txr.context.translate(txr.usedWidth, 0); + txr.context.scale(scale, scale); + this.drawElement(txr.context, ele, bb, scaledLabelShown, false); + txr.context.scale(1 / scale, 1 / scale); + txr.context.translate(-txr.usedWidth, 0); + } + eleCache = { + x: txr.usedWidth, + texture: txr, + level: lvl, + scale: scale, + width: eleScaledW, + height: eleScaledH, + scaledLabelShown: scaledLabelShown + }; + txr.usedWidth += Math.ceil(eleScaledW + eleTxrSpacing); + txr.eleCaches.push(eleCache); + lookup.set(ele, lvl, eleCache); + self.checkTextureFullness(txr); + return eleCache; }; - -LNode.prototype.getWidth = function () { - return this.rect.width; +ETCp.invalidateElements = function (eles) { + for (var i = 0; i < eles.length; i++) { + this.invalidateElement(eles[i]); + } }; +ETCp.invalidateElement = function (ele) { + var self = this; + var lookup = self.lookup; + var caches = []; + var invalid = lookup.isInvalid(ele); + if (!invalid) { + return; // override the invalidation request if the element key has not changed + } -LNode.prototype.setWidth = function (width) { - this.rect.width = width; -}; + for (var lvl = minLvl$1; lvl <= maxLvl$1; lvl++) { + var cache = lookup.getForCachedKey(ele, lvl); + if (cache) { + caches.push(cache); + } + } + var noOtherElesUseCache = lookup.invalidate(ele); + if (noOtherElesUseCache) { + for (var i = 0; i < caches.length; i++) { + var _cache = caches[i]; + var txr = _cache.texture; -LNode.prototype.getHeight = function () { - return this.rect.height; -}; + // remove space from the texture it belongs to + txr.invalidatedWidth += _cache.width; -LNode.prototype.setHeight = function (height) { - this.rect.height = height; -}; + // mark the cache as invalidated + _cache.invalidated = true; -LNode.prototype.getCenterX = function () { - return this.rect.x + this.rect.width / 2; -}; + // retire the texture if its utility is low + self.checkTextureUtility(txr); + } + } -LNode.prototype.getCenterY = function () { - return this.rect.y + this.rect.height / 2; + // remove from queue since the old req was for the old state + self.removeFromQueue(ele); }; - -LNode.prototype.getCenter = function () { - return new PointD(this.rect.x + this.rect.width / 2, this.rect.y + this.rect.height / 2); +ETCp.checkTextureUtility = function (txr) { + // invalidate all entries in the cache if the cache size is small + if (txr.invalidatedWidth >= minUtility * txr.width) { + this.retireTexture(txr); + } }; +ETCp.checkTextureFullness = function (txr) { + // if texture has been mostly filled and passed over several times, remove + // it from the queue so we don't need to waste time looking at it to put new things -LNode.prototype.getLocation = function () { - return new PointD(this.rect.x, this.rect.y); + var self = this; + var txrQ = self.getTextureQueue(txr.height); + if (txr.usedWidth / txr.width > maxFullness && txr.fullnessChecks >= maxFullnessChecks) { + removeFromArray(txrQ, txr); + } else { + txr.fullnessChecks++; + } }; +ETCp.retireTexture = function (txr) { + var self = this; + var txrH = txr.height; + var txrQ = self.getTextureQueue(txrH); + var lookup = this.lookup; -LNode.prototype.getRect = function () { - return this.rect; -}; + // retire the texture from the active / searchable queue: -LNode.prototype.getDiagonal = function () { - return Math.sqrt(this.rect.width * this.rect.width + this.rect.height * this.rect.height); -}; + removeFromArray(txrQ, txr); + txr.retired = true; -/** - * This method returns half the diagonal length of this node. - */ -LNode.prototype.getHalfTheDiagonal = function () { - return Math.sqrt(this.rect.height * this.rect.height + this.rect.width * this.rect.width) / 2; -}; + // remove the refs from the eles to the caches: -LNode.prototype.setRect = function (upperLeft, dimension) { - this.rect.x = upperLeft.x; - this.rect.y = upperLeft.y; - this.rect.width = dimension.width; - this.rect.height = dimension.height; -}; + var eleCaches = txr.eleCaches; + for (var i = 0; i < eleCaches.length; i++) { + var eleCache = eleCaches[i]; + lookup.deleteCache(eleCache.key, eleCache.level); + } + clearArray(eleCaches); -LNode.prototype.setCenter = function (cx, cy) { - this.rect.x = cx - this.rect.width / 2; - this.rect.y = cy - this.rect.height / 2; -}; + // add the texture to a retired queue so it can be recycled in future: -LNode.prototype.setLocation = function (x, y) { - this.rect.x = x; - this.rect.y = y; + var rtxtrQ = self.getRetiredTextureQueue(txrH); + rtxtrQ.push(txr); }; - -LNode.prototype.moveBy = function (dx, dy) { - this.rect.x += dx; - this.rect.y += dy; +ETCp.addTexture = function (txrH, minW) { + var self = this; + var txrQ = self.getTextureQueue(txrH); + var txr = {}; + txrQ.push(txr); + txr.eleCaches = []; + txr.height = txrH; + txr.width = Math.max(defTxrWidth, minW); + txr.usedWidth = 0; + txr.invalidatedWidth = 0; + txr.fullnessChecks = 0; + txr.canvas = self.renderer.makeOffscreenCanvas(txr.width, txr.height); + txr.context = txr.canvas.getContext('2d'); + return txr; }; - -LNode.prototype.getEdgeListToNode = function (to) { - var edgeList = []; - var edge; +ETCp.recycleTexture = function (txrH, minW) { var self = this; - - self.edges.forEach(function (edge) { - - if (edge.target == to) { - if (edge.source != self) throw "Incorrect edge source!"; - - edgeList.push(edge); + var txrQ = self.getTextureQueue(txrH); + var rtxtrQ = self.getRetiredTextureQueue(txrH); + for (var i = 0; i < rtxtrQ.length; i++) { + var txr = rtxtrQ[i]; + if (txr.width >= minW) { + txr.retired = false; + txr.usedWidth = 0; + txr.invalidatedWidth = 0; + txr.fullnessChecks = 0; + clearArray(txr.eleCaches); + txr.context.setTransform(1, 0, 0, 1, 0, 0); + txr.context.clearRect(0, 0, txr.width, txr.height); + removeFromArray(rtxtrQ, txr); + txrQ.push(txr); + return txr; } - }); - - return edgeList; + } }; - -LNode.prototype.getEdgesBetween = function (other) { - var edgeList = []; - var edge; - +ETCp.queueElement = function (ele, lvl) { var self = this; - self.edges.forEach(function (edge) { + var q = self.getElementQueue(); + var k2q = self.getElementKeyToQueue(); + var key = this.getKey(ele); + var existingReq = k2q[key]; + if (existingReq) { + // use the max lvl b/c in between lvls are cheap to make + existingReq.level = Math.max(existingReq.level, lvl); + existingReq.eles.merge(ele); + existingReq.reqs++; + q.updateItem(existingReq); + } else { + var req = { + eles: ele.spawn().merge(ele), + level: lvl, + reqs: 1, + key: key + }; + q.push(req); + k2q[key] = req; + } +}; +ETCp.dequeue = function (pxRatio /*, extent*/) { + var self = this; + var q = self.getElementQueue(); + var k2q = self.getElementKeyToQueue(); + var dequeued = []; + var lookup = self.lookup; + for (var i = 0; i < maxDeqSize$1; i++) { + if (q.size() > 0) { + var req = q.pop(); + var key = req.key; + var ele = req.eles[0]; // all eles have the same key + var cacheExists = lookup.hasCache(ele, req.level); - if (!(edge.source == self || edge.target == self)) throw "Incorrect edge source and/or target"; + // clear out the key to req lookup + k2q[key] = null; - if (edge.target == other || edge.source == other) { - edgeList.push(edge); + // dequeueing isn't necessary with an existing cache + if (cacheExists) { + continue; + } + dequeued.push(req); + var bb = self.getBoundingBox(ele); + self.getElement(ele, bb, pxRatio, req.level, getTxrReasons.dequeue); + } else { + break; } - }); - - return edgeList; + } + return dequeued; }; - -LNode.prototype.getNeighborsList = function () { - var neighbors = new Set(); - +ETCp.removeFromQueue = function (ele) { var self = this; - self.edges.forEach(function (edge) { + var q = self.getElementQueue(); + var k2q = self.getElementKeyToQueue(); + var key = this.getKey(ele); + var req = k2q[key]; + if (req != null) { + if (req.eles.length === 1) { + // remove if last ele in the req + // bring to front of queue + req.reqs = MAX_INT$1; + q.updateItem(req); + q.pop(); // remove from queue - if (edge.source == self) { - neighbors.add(edge.target); + k2q[key] = null; // remove from lookup map } else { - if (edge.target != self) { - throw "Incorrect incidency!"; - } - - neighbors.add(edge.source); + // otherwise just remove ele from req + req.eles.unmerge(ele); } - }); - - return neighbors; + } }; - -LNode.prototype.withChildren = function () { - var withNeighborsList = new Set(); - var childNode; - var children; - - withNeighborsList.add(this); - - if (this.child != null) { - var nodes = this.child.getNodes(); - for (var i = 0; i < nodes.length; i++) { - childNode = nodes[i]; - children = childNode.withChildren(); - children.forEach(function (node) { - withNeighborsList.add(node); - }); +ETCp.onDequeue = function (fn) { + this.onDequeues.push(fn); +}; +ETCp.offDequeue = function (fn) { + removeFromArray(this.onDequeues, fn); +}; +ETCp.setupDequeueing = defs.setupDequeueing({ + deqRedrawThreshold: deqRedrawThreshold$1, + deqCost: deqCost$1, + deqAvgCost: deqAvgCost$1, + deqNoDrawCost: deqNoDrawCost$1, + deqFastCost: deqFastCost$1, + deq: function deq(self, pxRatio, extent) { + return self.dequeue(pxRatio, extent); + }, + onDeqd: function onDeqd(self, deqd) { + for (var i = 0; i < self.onDequeues.length; i++) { + var fn = self.onDequeues[i]; + fn(deqd); + } + }, + shouldRedraw: function shouldRedraw(self, deqd, pxRatio, extent) { + for (var i = 0; i < deqd.length; i++) { + var eles = deqd[i].eles; + for (var j = 0; j < eles.length; j++) { + var bb = eles[j].boundingBox(); + if (boundingBoxesIntersect(bb, extent)) { + return true; + } + } } + return false; + }, + priority: function priority(self) { + return self.renderer.beforeRenderPriorities.eleTxrDeq; } +}); - return withNeighborsList; -}; +var defNumLayers = 1; // default number of layers to use +var minLvl = -4; // when scaling smaller than that we don't need to re-render +var maxLvl = 2; // when larger than this scale just render directly (caching is not helpful) +var maxZoom = 3.99; // beyond this zoom level, layered textures are not used +var deqRedrawThreshold = 50; // time to batch redraws together from dequeueing to allow more dequeueing calcs to happen in the meanwhile +var refineEleDebounceTime = 50; // time to debounce sharper ele texture updates +var deqCost = 0.15; // % of add'l rendering cost allowed for dequeuing ele caches each frame +var deqAvgCost = 0.1; // % of add'l rendering cost compared to average overall redraw time +var deqNoDrawCost = 0.9; // % of avg frame time that can be used for dequeueing when not drawing +var deqFastCost = 0.9; // % of frame time to be used when >60fps +var maxDeqSize = 1; // number of eles to dequeue and render at higher texture in each batch +var invalidThreshold = 250; // time threshold for disabling b/c of invalidations +var maxLayerArea = 4000 * 4000; // layers can't be bigger than this +var useHighQualityEleTxrReqs = true; // whether to use high quality ele txr requests (generally faster and cheaper in the longterm) -LNode.prototype.getNoOfChildren = function () { - var noOfChildren = 0; - var childNode; +// var log = function(){ console.log.apply( console, arguments ); }; - if (this.child == null) { - noOfChildren = 1; - } else { - var nodes = this.child.getNodes(); - for (var i = 0; i < nodes.length; i++) { - childNode = nodes[i]; +var LayeredTextureCache = function LayeredTextureCache(renderer) { + var self = this; + var r = self.renderer = renderer; + var cy = r.cy; + self.layersByLevel = {}; // e.g. 2 => [ layer1, layer2, ..., layerN ] - noOfChildren += childNode.getNoOfChildren(); + self.firstGet = true; + self.lastInvalidationTime = performanceNow() - 2 * invalidThreshold; + self.skipping = false; + self.eleTxrDeqs = cy.collection(); + self.scheduleElementRefinement = debounce__default["default"](function () { + self.refineElementTextures(self.eleTxrDeqs); + self.eleTxrDeqs.unmerge(self.eleTxrDeqs); + }, refineEleDebounceTime); + r.beforeRender(function (willDraw, now) { + if (now - self.lastInvalidationTime <= invalidThreshold) { + self.skipping = true; + } else { + self.skipping = false; } - } - - if (noOfChildren == 0) { - noOfChildren = 1; - } - return noOfChildren; + }, r.beforeRenderPriorities.lyrTxrSkip); + var qSort = function qSort(a, b) { + return b.reqs - a.reqs; + }; + self.layersQueue = new Heap__default["default"](qSort); + self.setupDequeueing(); }; +var LTCp = LayeredTextureCache.prototype; +var layerIdPool = 0; +var MAX_INT = Math.pow(2, 53) - 1; +LTCp.makeLayer = function (bb, lvl) { + var scale = Math.pow(2, lvl); + var w = Math.ceil(bb.w * scale); + var h = Math.ceil(bb.h * scale); + var canvas = this.renderer.makeOffscreenCanvas(w, h); + var layer = { + id: layerIdPool = ++layerIdPool % MAX_INT, + bb: bb, + level: lvl, + width: w, + height: h, + canvas: canvas, + context: canvas.getContext('2d'), + eles: [], + elesQueue: [], + reqs: 0 + }; -LNode.prototype.getEstimatedSize = function () { - if (this.estimatedSize == Integer.MIN_VALUE) { - throw "assert failed"; - } - return this.estimatedSize; -}; + // log('make layer %s with w %s and h %s and lvl %s', layer.id, layer.width, layer.height, layer.level); -LNode.prototype.calcEstimatedSize = function () { - if (this.child == null) { - return this.estimatedSize = (this.rect.width + this.rect.height) / 2; - } else { - this.estimatedSize = this.child.calcEstimatedSize(); - this.rect.width = this.estimatedSize; - this.rect.height = this.estimatedSize; + var cxt = layer.context; + var dx = -layer.bb.x1; + var dy = -layer.bb.y1; - return this.estimatedSize; - } + // do the transform on creation to save cycles (it's the same for all eles) + cxt.scale(scale, scale); + cxt.translate(dx, dy); + return layer; }; +LTCp.getLayers = function (eles, pxRatio, lvl) { + var self = this; + var r = self.renderer; + var cy = r.cy; + var zoom = cy.zoom(); + var firstGet = self.firstGet; + self.firstGet = false; -LNode.prototype.scatter = function () { - var randomCenterX; - var randomCenterY; + // log('--\nget layers with %s eles', eles.length); + //log eles.map(function(ele){ return ele.id() }) ); - var minX = -LayoutConstants.INITIAL_WORLD_BOUNDARY; - var maxX = LayoutConstants.INITIAL_WORLD_BOUNDARY; - randomCenterX = LayoutConstants.WORLD_CENTER_X + RandomSeed.nextDouble() * (maxX - minX) + minX; + if (lvl == null) { + lvl = Math.ceil(log2(zoom * pxRatio)); + if (lvl < minLvl) { + lvl = minLvl; + } else if (zoom >= maxZoom || lvl > maxLvl) { + return null; + } + } + self.validateLayersElesOrdering(lvl, eles); + var layersByLvl = self.layersByLevel; + var scale = Math.pow(2, lvl); + var layers = layersByLvl[lvl] = layersByLvl[lvl] || []; + var bb; + var lvlComplete = self.levelIsComplete(lvl, eles); + var tmpLayers; + var checkTempLevels = function checkTempLevels() { + var canUseAsTmpLvl = function canUseAsTmpLvl(l) { + self.validateLayersElesOrdering(l, eles); + if (self.levelIsComplete(l, eles)) { + tmpLayers = layersByLvl[l]; + return true; + } + }; + var checkLvls = function checkLvls(dir) { + if (tmpLayers) { + return; + } + for (var l = lvl + dir; minLvl <= l && l <= maxLvl; l += dir) { + if (canUseAsTmpLvl(l)) { + break; + } + } + }; + checkLvls(+1); + checkLvls(-1); + + // remove the invalid layers; they will be replaced as needed later in this function + for (var i = layers.length - 1; i >= 0; i--) { + var layer = layers[i]; + if (layer.invalid) { + removeFromArray(layers, layer); + } + } + }; + if (!lvlComplete) { + // if the current level is incomplete, then use the closest, best quality layerset temporarily + // and later queue the current layerset so we can get the proper quality level soon - var minY = -LayoutConstants.INITIAL_WORLD_BOUNDARY; - var maxY = LayoutConstants.INITIAL_WORLD_BOUNDARY; - randomCenterY = LayoutConstants.WORLD_CENTER_Y + RandomSeed.nextDouble() * (maxY - minY) + minY; + checkTempLevels(); + } else { + // log('level complete, using existing layers\n--'); + return layers; + } + var getBb = function getBb() { + if (!bb) { + bb = makeBoundingBox(); + for (var i = 0; i < eles.length; i++) { + updateBoundingBox(bb, eles[i].boundingBox()); + } + } + return bb; + }; + var makeLayer = function makeLayer(opts) { + opts = opts || {}; + var after = opts.after; + getBb(); + var area = bb.w * scale * (bb.h * scale); + if (area > maxLayerArea) { + return null; + } + var layer = self.makeLayer(bb, lvl); + if (after != null) { + var index = layers.indexOf(after) + 1; + layers.splice(index, 0, layer); + } else if (opts.insert === undefined || opts.insert) { + // no after specified => first layer made so put at start + layers.unshift(layer); + } - this.rect.x = randomCenterX; - this.rect.y = randomCenterY; -}; + // if( tmpLayers ){ + //self.queueLayer( layer ); + // } -LNode.prototype.updateBounds = function () { - if (this.getChild() == null) { - throw "assert failed"; + return layer; + }; + if (self.skipping && !firstGet) { + // log('skip layers'); + return null; } - if (this.getChild().getNodes().length != 0) { - // wrap the children nodes by re-arranging the boundaries - var childGraph = this.getChild(); - childGraph.updateBounds(true); - this.rect.x = childGraph.getLeft(); - this.rect.y = childGraph.getTop(); + // log('do layers'); - this.setWidth(childGraph.getRight() - childGraph.getLeft()); - this.setHeight(childGraph.getBottom() - childGraph.getTop()); + var layer = null; + var maxElesPerLayer = eles.length / defNumLayers; + var allowLazyQueueing = !firstGet; + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var rs = ele._private.rscratch; + var caches = rs.imgLayerCaches = rs.imgLayerCaches || {}; - // Update compound bounds considering its label properties - if (LayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS) { + // log('look at ele', ele.id()); - var width = childGraph.getRight() - childGraph.getLeft(); - var height = childGraph.getBottom() - childGraph.getTop(); + var existingLayer = caches[lvl]; + if (existingLayer) { + // reuse layer for later eles + // log('reuse layer for', ele.id()); + layer = existingLayer; + continue; + } + if (!layer || layer.eles.length >= maxElesPerLayer || !boundingBoxInBoundingBox(layer.bb, ele.boundingBox())) { + // log('make new layer for ele %s', ele.id()); - if (this.labelWidth) { - if (this.labelPosHorizontal == "left") { - this.rect.x -= this.labelWidth; - this.setWidth(width + this.labelWidth); - } else if (this.labelPosHorizontal == "center" && this.labelWidth > width) { - this.rect.x -= (this.labelWidth - width) / 2; - this.setWidth(this.labelWidth); - } else if (this.labelPosHorizontal == "right") { - this.setWidth(width + this.labelWidth); - } - } + layer = makeLayer({ + insert: true, + after: layer + }); - if (this.labelHeight) { - if (this.labelPosVertical == "top") { - this.rect.y -= this.labelHeight; - this.setHeight(height + this.labelHeight); - } else if (this.labelPosVertical == "center" && this.labelHeight > height) { - this.rect.y -= (this.labelHeight - height) / 2; - this.setHeight(this.labelHeight); - } else if (this.labelPosVertical == "bottom") { - this.setHeight(height + this.labelHeight); - } + // if now layer can be built then we can't use layers at this level + if (!layer) { + return null; } + + // log('new layer with id %s', layer.id); } - } -}; -LNode.prototype.getInclusionTreeDepth = function () { - if (this.inclusionTreeDepth == Integer.MAX_VALUE) { - throw "assert failed"; + if (tmpLayers || allowLazyQueueing) { + // log('queue ele %s in layer %s', ele.id(), layer.id); + self.queueLayer(layer, ele); + } else { + // log('draw ele %s in layer %s', ele.id(), layer.id); + self.drawEleInLayer(layer, ele, lvl, pxRatio); + } + layer.eles.push(ele); + caches[lvl] = layer; } - return this.inclusionTreeDepth; -}; -LNode.prototype.transform = function (trans) { - var left = this.rect.x; + // log('--'); - if (left > LayoutConstants.WORLD_BOUNDARY) { - left = LayoutConstants.WORLD_BOUNDARY; - } else if (left < -LayoutConstants.WORLD_BOUNDARY) { - left = -LayoutConstants.WORLD_BOUNDARY; + if (tmpLayers) { + // then we only queued the current layerset and can't draw it yet + return tmpLayers; } - - var top = this.rect.y; - - if (top > LayoutConstants.WORLD_BOUNDARY) { - top = LayoutConstants.WORLD_BOUNDARY; - } else if (top < -LayoutConstants.WORLD_BOUNDARY) { - top = -LayoutConstants.WORLD_BOUNDARY; + if (allowLazyQueueing) { + // log('lazy queue level', lvl); + return null; } - - var leftTop = new PointD(left, top); - var vLeftTop = trans.inverseTransformPoint(leftTop); - - this.setLocation(vLeftTop.x, vLeftTop.y); -}; - -LNode.prototype.getLeft = function () { - return this.rect.x; + return layers; }; -LNode.prototype.getRight = function () { - return this.rect.x + this.rect.width; +// a layer may want to use an ele cache of a higher level to avoid blurriness +// so the layer level might not equal the ele level +LTCp.getEleLevelForLayerLevel = function (lvl, pxRatio) { + return lvl; }; - -LNode.prototype.getTop = function () { - return this.rect.y; +LTCp.drawEleInLayer = function (layer, ele, lvl, pxRatio) { + var self = this; + var r = this.renderer; + var context = layer.context; + var bb = ele.boundingBox(); + if (bb.w === 0 || bb.h === 0 || !ele.visible()) { + return; + } + lvl = self.getEleLevelForLayerLevel(lvl, pxRatio); + { + r.setImgSmoothing(context, false); + } + { + r.drawCachedElement(context, ele, null, null, lvl, useHighQualityEleTxrReqs); + } + { + r.setImgSmoothing(context, true); + } }; +LTCp.levelIsComplete = function (lvl, eles) { + var self = this; + var layers = self.layersByLevel[lvl]; + if (!layers || layers.length === 0) { + return false; + } + var numElesInLayers = 0; + for (var i = 0; i < layers.length; i++) { + var layer = layers[i]; -LNode.prototype.getBottom = function () { - return this.rect.y + this.rect.height; -}; + // if there are any eles needed to be drawn yet, the level is not complete + if (layer.reqs > 0) { + return false; + } -LNode.prototype.getParent = function () { - if (this.owner == null) { - return null; + // if the layer is invalid, the level is not complete + if (layer.invalid) { + return false; + } + numElesInLayers += layer.eles.length; } - return this.owner.getParent(); + // we should have exactly the number of eles passed in to be complete + if (numElesInLayers !== eles.length) { + return false; + } + return true; }; +LTCp.validateLayersElesOrdering = function (lvl, eles) { + var layers = this.layersByLevel[lvl]; + if (!layers) { + return; + } -module.exports = LNode; - -/***/ }), -/* 4 */ -/***/ (function(module, exports, __nested_webpack_require_17290__) { - -"use strict"; - - -var LayoutConstants = __nested_webpack_require_17290__(0); - -function FDLayoutConstants() {} - -//FDLayoutConstants inherits static props in LayoutConstants -for (var prop in LayoutConstants) { - FDLayoutConstants[prop] = LayoutConstants[prop]; -} - -FDLayoutConstants.MAX_ITERATIONS = 2500; - -FDLayoutConstants.DEFAULT_EDGE_LENGTH = 50; -FDLayoutConstants.DEFAULT_SPRING_STRENGTH = 0.45; -FDLayoutConstants.DEFAULT_REPULSION_STRENGTH = 4500.0; -FDLayoutConstants.DEFAULT_GRAVITY_STRENGTH = 0.4; -FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH = 1.0; -FDLayoutConstants.DEFAULT_GRAVITY_RANGE_FACTOR = 3.8; -FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR = 1.5; -FDLayoutConstants.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION = true; -FDLayoutConstants.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION = true; -FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL = 0.3; -FDLayoutConstants.COOLING_ADAPTATION_FACTOR = 0.33; -FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT = 1000; -FDLayoutConstants.ADAPTATION_UPPER_NODE_LIMIT = 5000; -FDLayoutConstants.MAX_NODE_DISPLACEMENT_INCREMENTAL = 100.0; -FDLayoutConstants.MAX_NODE_DISPLACEMENT = FDLayoutConstants.MAX_NODE_DISPLACEMENT_INCREMENTAL * 3; -FDLayoutConstants.MIN_REPULSION_DIST = FDLayoutConstants.DEFAULT_EDGE_LENGTH / 10.0; -FDLayoutConstants.CONVERGENCE_CHECK_PERIOD = 100; -FDLayoutConstants.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR = 0.1; -FDLayoutConstants.MIN_EDGE_LENGTH = 1; -FDLayoutConstants.GRID_CALCULATION_CHECK_PERIOD = 10; + // if in a layer the eles are not in the same order, then the layer is invalid + // (i.e. there is an ele in between the eles in the layer) -module.exports = FDLayoutConstants; + for (var i = 0; i < layers.length; i++) { + var layer = layers[i]; + var offset = -1; -/***/ }), -/* 5 */ -/***/ (function(module, exports, __webpack_require__) { + // find the offset + for (var j = 0; j < eles.length; j++) { + if (layer.eles[0] === eles[j]) { + offset = j; + break; + } + } + if (offset < 0) { + // then the layer has nonexistent elements and is invalid + this.invalidateLayer(layer); + continue; + } -"use strict"; + // the eles in the layer must be in the same continuous order, else the layer is invalid + var o = offset; + for (var j = 0; j < layer.eles.length; j++) { + if (layer.eles[j] !== eles[o + j]) { + // log('invalidate based on ordering', layer.id); -function PointD(x, y) { - if (x == null && y == null) { - this.x = 0; - this.y = 0; - } else { - this.x = x; - this.y = y; + this.invalidateLayer(layer); + break; + } + } } -} - -PointD.prototype.getX = function () { - return this.x; -}; - -PointD.prototype.getY = function () { - return this.y; }; +LTCp.updateElementsInLayers = function (eles, update) { + var self = this; + var isEles = element(eles[0]); -PointD.prototype.setX = function (x) { - this.x = x; -}; + // collect udpated elements (cascaded from the layers) and update each + // layer itself along the way + for (var i = 0; i < eles.length; i++) { + var req = isEles ? null : eles[i]; + var ele = isEles ? eles[i] : eles[i].ele; + var rs = ele._private.rscratch; + var caches = rs.imgLayerCaches = rs.imgLayerCaches || {}; + for (var l = minLvl; l <= maxLvl; l++) { + var layer = caches[l]; + if (!layer) { + continue; + } -PointD.prototype.setY = function (y) { - this.y = y; + // if update is a request from the ele cache, then it affects only + // the matching level + if (req && self.getEleLevelForLayerLevel(layer.level) !== req.level) { + continue; + } + update(layer, ele, req); + } + } }; - -PointD.prototype.getDifference = function (pt) { - return new DimensionD(this.x - pt.x, this.y - pt.y); +LTCp.haveLayers = function () { + var self = this; + var haveLayers = false; + for (var l = minLvl; l <= maxLvl; l++) { + var layers = self.layersByLevel[l]; + if (layers && layers.length > 0) { + haveLayers = true; + break; + } + } + return haveLayers; }; +LTCp.invalidateElements = function (eles) { + var self = this; + if (eles.length === 0) { + return; + } + self.lastInvalidationTime = performanceNow(); -PointD.prototype.getCopy = function () { - return new PointD(this.x, this.y); -}; + // log('update invalidate layer time from eles'); -PointD.prototype.translate = function (dim) { - this.x += dim.width; - this.y += dim.height; - return this; + if (eles.length === 0 || !self.haveLayers()) { + return; + } + self.updateElementsInLayers(eles, function invalAssocLayers(layer, ele, req) { + self.invalidateLayer(layer); + }); }; +LTCp.invalidateLayer = function (layer) { + // log('update invalidate layer time'); -module.exports = PointD; - -/***/ }), -/* 6 */ -/***/ (function(module, exports, __nested_webpack_require_19670__) { - -"use strict"; + this.lastInvalidationTime = performanceNow(); + if (layer.invalid) { + return; + } // save cycles + var lvl = layer.level; + var eles = layer.eles; + var layers = this.layersByLevel[lvl]; -var LGraphObject = __nested_webpack_require_19670__(2); -var Integer = __nested_webpack_require_19670__(10); -var LayoutConstants = __nested_webpack_require_19670__(0); -var LGraphManager = __nested_webpack_require_19670__(7); -var LNode = __nested_webpack_require_19670__(3); -var LEdge = __nested_webpack_require_19670__(1); -var RectangleD = __nested_webpack_require_19670__(13); -var Point = __nested_webpack_require_19670__(12); -var LinkedList = __nested_webpack_require_19670__(11); + // log('invalidate layer', layer.id ); -function LGraph(parent, obj2, vGraph) { - LGraphObject.call(this, vGraph); - this.estimatedSize = Integer.MIN_VALUE; - this.margin = LayoutConstants.DEFAULT_GRAPH_MARGIN; - this.edges = []; - this.nodes = []; - this.isConnected = false; - this.parent = parent; + removeFromArray(layers, layer); + // layer.eles = []; - if (obj2 != null && obj2 instanceof LGraphManager) { - this.graphManager = obj2; - } else if (obj2 != null && obj2 instanceof Layout) { - this.graphManager = obj2.graphManager; + layer.elesQueue = []; + layer.invalid = true; + if (layer.replacement) { + layer.replacement.invalid = true; + } + for (var i = 0; i < eles.length; i++) { + var caches = eles[i]._private.rscratch.imgLayerCaches; + if (caches) { + caches[lvl] = null; + } } -} - -LGraph.prototype = Object.create(LGraphObject.prototype); -for (var prop in LGraphObject) { - LGraph[prop] = LGraphObject[prop]; -} - -LGraph.prototype.getNodes = function () { - return this.nodes; -}; - -LGraph.prototype.getEdges = function () { - return this.edges; -}; - -LGraph.prototype.getGraphManager = function () { - return this.graphManager; }; +LTCp.refineElementTextures = function (eles) { + var self = this; -LGraph.prototype.getParent = function () { - return this.parent; -}; + // log('refine', eles.length); -LGraph.prototype.getLeft = function () { - return this.left; -}; + self.updateElementsInLayers(eles, function refineEachEle(layer, ele, req) { + var rLyr = layer.replacement; + if (!rLyr) { + rLyr = layer.replacement = self.makeLayer(layer.bb, layer.level); + rLyr.replaces = layer; + rLyr.eles = layer.eles; -LGraph.prototype.getRight = function () { - return this.right; -}; + // log('make replacement layer %s for %s with level %s', rLyr.id, layer.id, rLyr.level); + } -LGraph.prototype.getTop = function () { - return this.top; -}; + if (!rLyr.reqs) { + for (var i = 0; i < rLyr.eles.length; i++) { + self.queueLayer(rLyr, rLyr.eles[i]); + } -LGraph.prototype.getBottom = function () { - return this.bottom; + // log('queue replacement layer refinement', rLyr.id); + } + }); }; -LGraph.prototype.isConnected = function () { - return this.isConnected; +LTCp.enqueueElementRefinement = function (ele) { + this.eleTxrDeqs.merge(ele); + this.scheduleElementRefinement(); }; +LTCp.queueLayer = function (layer, ele) { + var self = this; + var q = self.layersQueue; + var elesQ = layer.elesQueue; + var hasId = elesQ.hasId = elesQ.hasId || {}; -LGraph.prototype.add = function (obj1, sourceNode, targetNode) { - if (sourceNode == null && targetNode == null) { - var newNode = obj1; - if (this.graphManager == null) { - throw "Graph has no graph mgr!"; + // if a layer is going to be replaced, queuing is a waste of time + if (layer.replacement) { + return; + } + if (ele) { + if (hasId[ele.id()]) { + return; } - if (this.getNodes().indexOf(newNode) > -1) { - throw "Node already in graph!"; + elesQ.push(ele); + hasId[ele.id()] = true; + } + if (layer.reqs) { + layer.reqs++; + q.updateItem(layer); + } else { + layer.reqs = 1; + q.push(layer); + } +}; +LTCp.dequeue = function (pxRatio) { + var self = this; + var q = self.layersQueue; + var deqd = []; + var eleDeqs = 0; + while (eleDeqs < maxDeqSize) { + if (q.size() === 0) { + break; } - newNode.owner = this; - this.getNodes().push(newNode); + var layer = q.peek(); - return newNode; - } else { - var newEdge = obj1; - if (!(this.getNodes().indexOf(sourceNode) > -1 && this.getNodes().indexOf(targetNode) > -1)) { - throw "Source or target not in graph!"; + // if a layer has been or will be replaced, then don't waste time with it + if (layer.replacement) { + // log('layer %s in queue skipped b/c it already has a replacement', layer.id); + q.pop(); + continue; } - if (!(sourceNode.owner == targetNode.owner && sourceNode.owner == this)) { - throw "Both owners must be this graph!"; + // if this is a replacement layer that has been superceded, then forget it + if (layer.replaces && layer !== layer.replaces.replacement) { + // log('layer is no longer the most uptodate replacement; dequeued', layer.id) + q.pop(); + continue; } + if (layer.invalid) { + // log('replacement layer %s is invalid; dequeued', layer.id); + q.pop(); + continue; + } + var ele = layer.elesQueue.shift(); + if (ele) { + // log('dequeue layer %s', layer.id); - if (sourceNode.owner != targetNode.owner) { - return null; + self.drawEleInLayer(layer, ele, layer.level, pxRatio); + eleDeqs++; + } + if (deqd.length === 0) { + // we need only one entry in deqd to queue redrawing etc + deqd.push(true); } - // set source and target - newEdge.source = sourceNode; - newEdge.target = targetNode; + // if the layer has all its eles done, then remove from the queue + if (layer.elesQueue.length === 0) { + q.pop(); + layer.reqs = 0; - // set as intra-graph edge - newEdge.isInterGraph = false; + // log('dequeue of layer %s complete', layer.id); - // add to graph edge list - this.getEdges().push(newEdge); + // when a replacement layer is dequeued, it replaces the old layer in the level + if (layer.replaces) { + self.applyLayerReplacement(layer); + } + self.requestRedraw(); + } + } + return deqd; +}; +LTCp.applyLayerReplacement = function (layer) { + var self = this; + var layersInLevel = self.layersByLevel[layer.level]; + var replaced = layer.replaces; + var index = layersInLevel.indexOf(replaced); - // add to incidency lists - sourceNode.edges.push(newEdge); + // if the replaced layer is not in the active list for the level, then replacing + // refs would be a mistake (i.e. overwriting the true active layer) + if (index < 0 || replaced.invalid) { + // log('replacement layer would have no effect', layer.id); + return; + } + layersInLevel[index] = layer; // replace level ref - if (targetNode != sourceNode) { - targetNode.edges.push(newEdge); + // replace refs in eles + for (var i = 0; i < layer.eles.length; i++) { + var _p = layer.eles[i]._private; + var cache = _p.imgLayerCaches = _p.imgLayerCaches || {}; + if (cache) { + cache[layer.level] = layer; } - - return newEdge; } + + // log('apply replacement layer %s over %s', layer.id, replaced.id); + + self.requestRedraw(); }; +LTCp.requestRedraw = debounce__default["default"](function () { + var r = this.renderer; + r.redrawHint('eles', true); + r.redrawHint('drag', true); + r.redraw(); +}, 100); +LTCp.setupDequeueing = defs.setupDequeueing({ + deqRedrawThreshold: deqRedrawThreshold, + deqCost: deqCost, + deqAvgCost: deqAvgCost, + deqNoDrawCost: deqNoDrawCost, + deqFastCost: deqFastCost, + deq: function deq(self, pxRatio) { + return self.dequeue(pxRatio); + }, + onDeqd: noop$1, + shouldRedraw: trueify, + priority: function priority(self) { + return self.renderer.beforeRenderPriorities.lyrTxrDeq; + } +}); -LGraph.prototype.remove = function (obj) { - var node = obj; - if (obj instanceof LNode) { - if (node == null) { - throw "Node is null!"; - } - if (!(node.owner != null && node.owner == this)) { - throw "Owner graph is invalid!"; - } - if (this.graphManager == null) { - throw "Owner graph manager is invalid!"; +var CRp$a = {}; +var impl; +function polygon(context, points) { + for (var i = 0; i < points.length; i++) { + var pt = points[i]; + context.lineTo(pt.x, pt.y); + } +} +function triangleBackcurve(context, points, controlPoint) { + var firstPt; + for (var i = 0; i < points.length; i++) { + var pt = points[i]; + if (i === 0) { + firstPt = pt; } - // remove incident edges first (make a copy to do it safely) - var edgesToBeRemoved = node.edges.slice(); - var edge; - var s = edgesToBeRemoved.length; - for (var i = 0; i < s; i++) { - edge = edgesToBeRemoved[i]; + context.lineTo(pt.x, pt.y); + } + context.quadraticCurveTo(controlPoint.x, controlPoint.y, firstPt.x, firstPt.y); +} +function triangleTee(context, trianglePoints, teePoints) { + if (context.beginPath) { + context.beginPath(); + } + var triPts = trianglePoints; + for (var i = 0; i < triPts.length; i++) { + var pt = triPts[i]; + context.lineTo(pt.x, pt.y); + } + var teePts = teePoints; + var firstTeePt = teePoints[0]; + context.moveTo(firstTeePt.x, firstTeePt.y); + for (var i = 1; i < teePts.length; i++) { + var pt = teePts[i]; + context.lineTo(pt.x, pt.y); + } + if (context.closePath) { + context.closePath(); + } +} +function circleTriangle(context, trianglePoints, rx, ry, r) { + if (context.beginPath) { + context.beginPath(); + } + context.arc(rx, ry, r, 0, Math.PI * 2, false); + var triPts = trianglePoints; + var firstTrPt = triPts[0]; + context.moveTo(firstTrPt.x, firstTrPt.y); + for (var i = 0; i < triPts.length; i++) { + var pt = triPts[i]; + context.lineTo(pt.x, pt.y); + } + if (context.closePath) { + context.closePath(); + } +} +function circle(context, rx, ry, r) { + context.arc(rx, ry, r, 0, Math.PI * 2, false); +} +CRp$a.arrowShapeImpl = function (name) { + return (impl || (impl = { + 'polygon': polygon, + 'triangle-backcurve': triangleBackcurve, + 'triangle-tee': triangleTee, + 'circle-triangle': circleTriangle, + 'triangle-cross': triangleTee, + 'circle': circle + }))[name]; +}; - if (edge.isInterGraph) { - this.graphManager.remove(edge); - } else { - edge.source.owner.remove(edge); - } - } +var CRp$9 = {}; +CRp$9.drawElement = function (context, ele, shiftToOriginWithBb, showLabel, showOverlay, showOpacity) { + var r = this; + if (ele.isNode()) { + r.drawNode(context, ele, shiftToOriginWithBb, showLabel, showOverlay, showOpacity); + } else { + r.drawEdge(context, ele, shiftToOriginWithBb, showLabel, showOverlay, showOpacity); + } +}; +CRp$9.drawElementOverlay = function (context, ele) { + var r = this; + if (ele.isNode()) { + r.drawNodeOverlay(context, ele); + } else { + r.drawEdgeOverlay(context, ele); + } +}; +CRp$9.drawElementUnderlay = function (context, ele) { + var r = this; + if (ele.isNode()) { + r.drawNodeUnderlay(context, ele); + } else { + r.drawEdgeUnderlay(context, ele); + } +}; +CRp$9.drawCachedElementPortion = function (context, ele, eleTxrCache, pxRatio, lvl, reason, getRotation, getOpacity) { + var r = this; + var bb = eleTxrCache.getBoundingBox(ele); + if (bb.w === 0 || bb.h === 0) { + return; + } // ignore zero size case - // now the node itself - var index = this.nodes.indexOf(node); - if (index == -1) { - throw "Node not in owner node list!"; + var eleCache = eleTxrCache.getElement(ele, bb, pxRatio, lvl, reason); + if (eleCache != null) { + var opacity = getOpacity(r, ele); + if (opacity === 0) { + return; } - - this.nodes.splice(index, 1); - } else if (obj instanceof LEdge) { - var edge = obj; - if (edge == null) { - throw "Edge is null!"; + var theta = getRotation(r, ele); + var x1 = bb.x1, + y1 = bb.y1, + w = bb.w, + h = bb.h; + var x, y, sx, sy, smooth; + if (theta !== 0) { + var rotPt = eleTxrCache.getRotationPoint(ele); + sx = rotPt.x; + sy = rotPt.y; + context.translate(sx, sy); + context.rotate(theta); + smooth = r.getImgSmoothing(context); + if (!smooth) { + r.setImgSmoothing(context, true); + } + var off = eleTxrCache.getRotationOffset(ele); + x = off.x; + y = off.y; + } else { + x = x1; + y = y1; } - if (!(edge.source != null && edge.target != null)) { - throw "Source and/or target is null!"; + var oldGlobalAlpha; + if (opacity !== 1) { + oldGlobalAlpha = context.globalAlpha; + context.globalAlpha = oldGlobalAlpha * opacity; } - if (!(edge.source.owner != null && edge.target.owner != null && edge.source.owner == this && edge.target.owner == this)) { - throw "Source and/or target owner is invalid!"; + context.drawImage(eleCache.texture.canvas, eleCache.x, 0, eleCache.width, eleCache.height, x, y, w, h); + if (opacity !== 1) { + context.globalAlpha = oldGlobalAlpha; } - - var sourceIndex = edge.source.edges.indexOf(edge); - var targetIndex = edge.target.edges.indexOf(edge); - if (!(sourceIndex > -1 && targetIndex > -1)) { - throw "Source and/or target doesn't know this edge!"; + if (theta !== 0) { + context.rotate(-theta); + context.translate(-sx, -sy); + if (!smooth) { + r.setImgSmoothing(context, false); + } } + } else { + eleTxrCache.drawElement(context, ele); // direct draw fallback + } +}; - edge.source.edges.splice(sourceIndex, 1); - - if (edge.target != edge.source) { - edge.target.edges.splice(targetIndex, 1); +var getZeroRotation = function getZeroRotation() { + return 0; +}; +var getLabelRotation = function getLabelRotation(r, ele) { + return r.getTextAngle(ele, null); +}; +var getSourceLabelRotation = function getSourceLabelRotation(r, ele) { + return r.getTextAngle(ele, 'source'); +}; +var getTargetLabelRotation = function getTargetLabelRotation(r, ele) { + return r.getTextAngle(ele, 'target'); +}; +var getOpacity = function getOpacity(r, ele) { + return ele.effectiveOpacity(); +}; +var getTextOpacity = function getTextOpacity(e, ele) { + return ele.pstyle('text-opacity').pfValue * ele.effectiveOpacity(); +}; +CRp$9.drawCachedElement = function (context, ele, pxRatio, extent, lvl, requestHighQuality) { + var r = this; + var _r$data = r.data, + eleTxrCache = _r$data.eleTxrCache, + lblTxrCache = _r$data.lblTxrCache, + slbTxrCache = _r$data.slbTxrCache, + tlbTxrCache = _r$data.tlbTxrCache; + var bb = ele.boundingBox(); + var reason = requestHighQuality === true ? eleTxrCache.reasons.highQuality : null; + if (bb.w === 0 || bb.h === 0 || !ele.visible()) { + return; + } + if (!extent || boundingBoxesIntersect(bb, extent)) { + var isEdge = ele.isEdge(); + var badLine = ele.element()._private.rscratch.badLine; + r.drawElementUnderlay(context, ele); + r.drawCachedElementPortion(context, ele, eleTxrCache, pxRatio, lvl, reason, getZeroRotation, getOpacity); + if (!isEdge || !badLine) { + r.drawCachedElementPortion(context, ele, lblTxrCache, pxRatio, lvl, reason, getLabelRotation, getTextOpacity); } - - var index = edge.source.owner.getEdges().indexOf(edge); - if (index == -1) { - throw "Not in owner's edge list!"; + if (isEdge && !badLine) { + r.drawCachedElementPortion(context, ele, slbTxrCache, pxRatio, lvl, reason, getSourceLabelRotation, getTextOpacity); + r.drawCachedElementPortion(context, ele, tlbTxrCache, pxRatio, lvl, reason, getTargetLabelRotation, getTextOpacity); } - - edge.source.owner.getEdges().splice(index, 1); + r.drawElementOverlay(context, ele); } }; - -LGraph.prototype.updateLeftTop = function () { - var top = Integer.MAX_VALUE; - var left = Integer.MAX_VALUE; - var nodeTop; - var nodeLeft; - var margin; - - var nodes = this.getNodes(); - var s = nodes.length; - - for (var i = 0; i < s; i++) { - var lNode = nodes[i]; - nodeTop = lNode.getTop(); - nodeLeft = lNode.getLeft(); - - if (top > nodeTop) { - top = nodeTop; +CRp$9.drawElements = function (context, eles) { + var r = this; + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + r.drawElement(context, ele); + } +}; +CRp$9.drawCachedElements = function (context, eles, pxRatio, extent) { + var r = this; + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + r.drawCachedElement(context, ele, pxRatio, extent); + } +}; +CRp$9.drawCachedNodes = function (context, eles, pxRatio, extent) { + var r = this; + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + if (!ele.isNode()) { + continue; } - - if (left > nodeLeft) { - left = nodeLeft; + r.drawCachedElement(context, ele, pxRatio, extent); + } +}; +CRp$9.drawLayeredElements = function (context, eles, pxRatio, extent) { + var r = this; + var layers = r.data.lyrTxrCache.getLayers(eles, pxRatio); + if (layers) { + for (var i = 0; i < layers.length; i++) { + var layer = layers[i]; + var bb = layer.bb; + if (bb.w === 0 || bb.h === 0) { + continue; + } + context.drawImage(layer.canvas, bb.x1, bb.y1, bb.w, bb.h); } + } else { + // fall back on plain caching if no layers + r.drawCachedElements(context, eles, pxRatio, extent); } +}; - // Do we have any nodes in this graph? - if (top == Integer.MAX_VALUE) { - return null; +/* global Path2D */ +var CRp$8 = {}; +CRp$8.drawEdge = function (context, edge, shiftToOriginWithBb) { + var drawLabel = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var shouldDrawOverlay = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; + var shouldDrawOpacity = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; + var r = this; + var rs = edge._private.rscratch; + if (shouldDrawOpacity && !edge.visible()) { + return; } - if (nodes[0].getParent().paddingLeft != undefined) { - margin = nodes[0].getParent().paddingLeft; - } else { - margin = this.margin; + // if bezier ctrl pts can not be calculated, then die + if (rs.badLine || rs.allpts == null || isNaN(rs.allpts[0])) { + // isNaN in case edge is impossible and browser bugs (e.g. safari) + return; } + var bb; + if (shiftToOriginWithBb) { + bb = shiftToOriginWithBb; + context.translate(-bb.x1, -bb.y1); + } + var opacity = shouldDrawOpacity ? edge.pstyle('opacity').value : 1; + var lineOpacity = shouldDrawOpacity ? edge.pstyle('line-opacity').value : 1; + var curveStyle = edge.pstyle('curve-style').value; + var lineStyle = edge.pstyle('line-style').value; + var edgeWidth = edge.pstyle('width').pfValue; + var lineCap = edge.pstyle('line-cap').value; + var effectiveLineOpacity = opacity * lineOpacity; + // separate arrow opacity would require arrow-opacity property + var effectiveArrowOpacity = opacity * lineOpacity; + var drawLine = function drawLine() { + var strokeOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : effectiveLineOpacity; + if (curveStyle === 'straight-triangle') { + r.eleStrokeStyle(context, edge, strokeOpacity); + r.drawEdgeTrianglePath(edge, context, rs.allpts); + } else { + context.lineWidth = edgeWidth; + context.lineCap = lineCap; + r.eleStrokeStyle(context, edge, strokeOpacity); + r.drawEdgePath(edge, context, rs.allpts, lineStyle); + context.lineCap = 'butt'; // reset for other drawing functions + } + }; - this.left = left - margin; - this.top = top - margin; - - // Apply the margins and return the result - return new Point(this.left, this.top); + var drawOverlay = function drawOverlay() { + if (!shouldDrawOverlay) { + return; + } + r.drawEdgeOverlay(context, edge); + }; + var drawUnderlay = function drawUnderlay() { + if (!shouldDrawOverlay) { + return; + } + r.drawEdgeUnderlay(context, edge); + }; + var drawArrows = function drawArrows() { + var arrowOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : effectiveArrowOpacity; + r.drawArrowheads(context, edge, arrowOpacity); + }; + var drawText = function drawText() { + r.drawElementText(context, edge, null, drawLabel); + }; + context.lineJoin = 'round'; + var ghost = edge.pstyle('ghost').value === 'yes'; + if (ghost) { + var gx = edge.pstyle('ghost-offset-x').pfValue; + var gy = edge.pstyle('ghost-offset-y').pfValue; + var ghostOpacity = edge.pstyle('ghost-opacity').value; + var effectiveGhostOpacity = effectiveLineOpacity * ghostOpacity; + context.translate(gx, gy); + drawLine(effectiveGhostOpacity); + drawArrows(effectiveGhostOpacity); + context.translate(-gx, -gy); + } + drawUnderlay(); + drawLine(); + drawArrows(); + drawOverlay(); + drawText(); + if (shiftToOriginWithBb) { + context.translate(bb.x1, bb.y1); + } }; - -LGraph.prototype.updateBounds = function (recursive) { - // calculate bounds - var left = Integer.MAX_VALUE; - var right = -Integer.MAX_VALUE; - var top = Integer.MAX_VALUE; - var bottom = -Integer.MAX_VALUE; - var nodeLeft; - var nodeRight; - var nodeTop; - var nodeBottom; - var margin; - - var nodes = this.nodes; - var s = nodes.length; - for (var i = 0; i < s; i++) { - var lNode = nodes[i]; - - if (recursive && lNode.child != null) { - lNode.updateBounds(); +var drawEdgeOverlayUnderlay = function drawEdgeOverlayUnderlay(overlayOrUnderlay) { + if (!['overlay', 'underlay'].includes(overlayOrUnderlay)) { + throw new Error('Invalid state'); + } + return function (context, edge) { + if (!edge.visible()) { + return; } - nodeLeft = lNode.getLeft(); - nodeRight = lNode.getRight(); - nodeTop = lNode.getTop(); - nodeBottom = lNode.getBottom(); - - if (left > nodeLeft) { - left = nodeLeft; + var opacity = edge.pstyle("".concat(overlayOrUnderlay, "-opacity")).value; + if (opacity === 0) { + return; + } + var r = this; + var usePaths = r.usePaths(); + var rs = edge._private.rscratch; + var padding = edge.pstyle("".concat(overlayOrUnderlay, "-padding")).pfValue; + var width = 2 * padding; + var color = edge.pstyle("".concat(overlayOrUnderlay, "-color")).value; + context.lineWidth = width; + if (rs.edgeType === 'self' && !usePaths) { + context.lineCap = 'butt'; + } else { + context.lineCap = 'round'; + } + r.colorStrokeStyle(context, color[0], color[1], color[2], opacity); + r.drawEdgePath(edge, context, rs.allpts, 'solid'); + }; +}; +CRp$8.drawEdgeOverlay = drawEdgeOverlayUnderlay('overlay'); +CRp$8.drawEdgeUnderlay = drawEdgeOverlayUnderlay('underlay'); +CRp$8.drawEdgePath = function (edge, context, pts, type) { + var rs = edge._private.rscratch; + var canvasCxt = context; + var path; + var pathCacheHit = false; + var usePaths = this.usePaths(); + var lineDashPattern = edge.pstyle('line-dash-pattern').pfValue; + var lineDashOffset = edge.pstyle('line-dash-offset').pfValue; + if (usePaths) { + var pathCacheKey = pts.join('$'); + var keyMatches = rs.pathCacheKey && rs.pathCacheKey === pathCacheKey; + if (keyMatches) { + path = context = rs.pathCache; + pathCacheHit = true; + } else { + path = context = new Path2D(); + rs.pathCacheKey = pathCacheKey; + rs.pathCache = path; } - - if (right < nodeRight) { - right = nodeRight; + } + if (canvasCxt.setLineDash) { + // for very outofdate browsers + switch (type) { + case 'dotted': + canvasCxt.setLineDash([1, 1]); + break; + case 'dashed': + canvasCxt.setLineDash(lineDashPattern); + canvasCxt.lineDashOffset = lineDashOffset; + break; + case 'solid': + canvasCxt.setLineDash([]); + break; } - - if (top > nodeTop) { - top = nodeTop; + } + if (!pathCacheHit && !rs.badLine) { + if (context.beginPath) { + context.beginPath(); } - - if (bottom < nodeBottom) { - bottom = nodeBottom; + context.moveTo(pts[0], pts[1]); + switch (rs.edgeType) { + case 'bezier': + case 'self': + case 'compound': + case 'multibezier': + for (var i = 2; i + 3 < pts.length; i += 4) { + context.quadraticCurveTo(pts[i], pts[i + 1], pts[i + 2], pts[i + 3]); + } + break; + case 'straight': + case 'segments': + case 'haystack': + for (var _i = 2; _i + 1 < pts.length; _i += 2) { + context.lineTo(pts[_i], pts[_i + 1]); + } + break; } } - - var boundingRect = new RectangleD(left, top, right - left, bottom - top); - if (left == Integer.MAX_VALUE) { - this.left = this.parent.getLeft(); - this.right = this.parent.getRight(); - this.top = this.parent.getTop(); - this.bottom = this.parent.getBottom(); - } - - if (nodes[0].getParent().paddingLeft != undefined) { - margin = nodes[0].getParent().paddingLeft; + context = canvasCxt; + if (usePaths) { + context.stroke(path); } else { - margin = this.margin; - } - - this.left = boundingRect.x - margin; - this.right = boundingRect.x + boundingRect.width + margin; - this.top = boundingRect.y - margin; - this.bottom = boundingRect.y + boundingRect.height + margin; -}; - -LGraph.calculateBounds = function (nodes) { - var left = Integer.MAX_VALUE; - var right = -Integer.MAX_VALUE; - var top = Integer.MAX_VALUE; - var bottom = -Integer.MAX_VALUE; - var nodeLeft; - var nodeRight; - var nodeTop; - var nodeBottom; - - var s = nodes.length; - - for (var i = 0; i < s; i++) { - var lNode = nodes[i]; - nodeLeft = lNode.getLeft(); - nodeRight = lNode.getRight(); - nodeTop = lNode.getTop(); - nodeBottom = lNode.getBottom(); - - if (left > nodeLeft) { - left = nodeLeft; - } - - if (right < nodeRight) { - right = nodeRight; - } - - if (top > nodeTop) { - top = nodeTop; - } - - if (bottom < nodeBottom) { - bottom = nodeBottom; - } + context.stroke(); } - var boundingRect = new RectangleD(left, top, right - left, bottom - top); - - return boundingRect; -}; - -LGraph.prototype.getInclusionTreeDepth = function () { - if (this == this.graphManager.getRoot()) { - return 1; - } else { - return this.parent.getInclusionTreeDepth(); + // reset any line dashes + if (context.setLineDash) { + // for very outofdate browsers + context.setLineDash([]); } }; - -LGraph.prototype.getEstimatedSize = function () { - if (this.estimatedSize == Integer.MIN_VALUE) { - throw "assert failed"; +CRp$8.drawEdgeTrianglePath = function (edge, context, pts) { + // use line stroke style for triangle fill style + context.fillStyle = context.strokeStyle; + var edgeWidth = edge.pstyle('width').pfValue; + for (var i = 0; i + 1 < pts.length; i += 2) { + var vector = [pts[i + 2] - pts[i], pts[i + 3] - pts[i + 1]]; + var length = Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1]); + var normal = [vector[1] / length, -vector[0] / length]; + var triangleHead = [normal[0] * edgeWidth / 2, normal[1] * edgeWidth / 2]; + context.beginPath(); + context.moveTo(pts[i] - triangleHead[0], pts[i + 1] - triangleHead[1]); + context.lineTo(pts[i] + triangleHead[0], pts[i + 1] + triangleHead[1]); + context.lineTo(pts[i + 2], pts[i + 3]); + context.closePath(); + context.fill(); } - return this.estimatedSize; }; - -LGraph.prototype.calcEstimatedSize = function () { - var size = 0; - var nodes = this.nodes; - var s = nodes.length; - - for (var i = 0; i < s; i++) { - var lNode = nodes[i]; - size += lNode.calcEstimatedSize(); +CRp$8.drawArrowheads = function (context, edge, opacity) { + var rs = edge._private.rscratch; + var isHaystack = rs.edgeType === 'haystack'; + if (!isHaystack) { + this.drawArrowhead(context, edge, 'source', rs.arrowStartX, rs.arrowStartY, rs.srcArrowAngle, opacity); } - - if (size == 0) { - this.estimatedSize = LayoutConstants.EMPTY_COMPOUND_NODE_SIZE; - } else { - this.estimatedSize = size / Math.sqrt(this.nodes.length); + this.drawArrowhead(context, edge, 'mid-target', rs.midX, rs.midY, rs.midtgtArrowAngle, opacity); + this.drawArrowhead(context, edge, 'mid-source', rs.midX, rs.midY, rs.midsrcArrowAngle, opacity); + if (!isHaystack) { + this.drawArrowhead(context, edge, 'target', rs.arrowEndX, rs.arrowEndY, rs.tgtArrowAngle, opacity); } - - return this.estimatedSize; }; - -LGraph.prototype.updateConnected = function () { +CRp$8.drawArrowhead = function (context, edge, prefix, x, y, angle, opacity) { + if (isNaN(x) || x == null || isNaN(y) || y == null || isNaN(angle) || angle == null) { + return; + } var self = this; - if (this.nodes.length == 0) { - this.isConnected = true; + var arrowShape = edge.pstyle(prefix + '-arrow-shape').value; + if (arrowShape === 'none') { return; } - - var queue = new LinkedList(); - var visited = new Set(); - var currentNode = this.nodes[0]; - var neighborEdges; - var currentNeighbor; - var childrenOfNode = currentNode.withChildren(); - childrenOfNode.forEach(function (node) { - queue.push(node); - visited.add(node); - }); - - while (queue.length !== 0) { - currentNode = queue.shift(); - - // Traverse all neighbors of this node - neighborEdges = currentNode.getEdges(); - var size = neighborEdges.length; - for (var i = 0; i < size; i++) { - var neighborEdge = neighborEdges[i]; - currentNeighbor = neighborEdge.getOtherEndInGraph(currentNode, this); - - // Add unvisited neighbors to the list to visit - if (currentNeighbor != null && !visited.has(currentNeighbor)) { - var childrenOfNeighbor = currentNeighbor.withChildren(); - - childrenOfNeighbor.forEach(function (node) { - queue.push(node); - visited.add(node); - }); - } - } + var arrowClearFill = edge.pstyle(prefix + '-arrow-fill').value === 'hollow' ? 'both' : 'filled'; + var arrowFill = edge.pstyle(prefix + '-arrow-fill').value; + var edgeWidth = edge.pstyle('width').pfValue; + var edgeOpacity = edge.pstyle('opacity').value; + if (opacity === undefined) { + opacity = edgeOpacity; } + var gco = context.globalCompositeOperation; + if (opacity !== 1 || arrowFill === 'hollow') { + // then extra clear is needed + context.globalCompositeOperation = 'destination-out'; + self.colorFillStyle(context, 255, 255, 255, 1); + self.colorStrokeStyle(context, 255, 255, 255, 1); + self.drawArrowShape(edge, context, arrowClearFill, edgeWidth, arrowShape, x, y, angle); + context.globalCompositeOperation = gco; + } // otherwise, the opaque arrow clears it for free :) - this.isConnected = false; - - if (visited.size >= this.nodes.length) { - var noOfVisitedInThisGraph = 0; - - visited.forEach(function (visitedNode) { - if (visitedNode.owner == self) { - noOfVisitedInThisGraph++; - } - }); - - if (noOfVisitedInThisGraph == this.nodes.length) { - this.isConnected = true; + var color = edge.pstyle(prefix + '-arrow-color').value; + self.colorFillStyle(context, color[0], color[1], color[2], opacity); + self.colorStrokeStyle(context, color[0], color[1], color[2], opacity); + self.drawArrowShape(edge, context, arrowFill, edgeWidth, arrowShape, x, y, angle); +}; +CRp$8.drawArrowShape = function (edge, context, fill, edgeWidth, shape, x, y, angle) { + var r = this; + var usePaths = this.usePaths() && shape !== 'triangle-cross'; + var pathCacheHit = false; + var path; + var canvasContext = context; + var translation = { + x: x, + y: y + }; + var scale = edge.pstyle('arrow-scale').value; + var size = this.getArrowWidth(edgeWidth, scale); + var shapeImpl = r.arrowShapes[shape]; + if (usePaths) { + var cache = r.arrowPathCache = r.arrowPathCache || []; + var key = hashString(shape); + var cachedPath = cache[key]; + if (cachedPath != null) { + path = context = cachedPath; + pathCacheHit = true; + } else { + path = context = new Path2D(); + cache[key] = path; } } -}; - -module.exports = LGraph; - -/***/ }), -/* 7 */ -/***/ (function(module, exports, __nested_webpack_require_29738__) { - -"use strict"; - - -var LGraph; -var LEdge = __nested_webpack_require_29738__(1); - -function LGraphManager(layout) { - LGraph = __nested_webpack_require_29738__(6); // It may be better to initilize this out of this function but it gives an error (Right-hand side of 'instanceof' is not callable) now. - this.layout = layout; - - this.graphs = []; - this.edges = []; -} - -LGraphManager.prototype.addRoot = function () { - var ngraph = this.layout.newGraph(); - var nnode = this.layout.newNode(null); - var root = this.add(ngraph, nnode); - this.setRootGraph(root); - return this.rootGraph; -}; - -LGraphManager.prototype.add = function (newGraph, parentNode, newEdge, sourceNode, targetNode) { - //there are just 2 parameters are passed then it adds an LGraph else it adds an LEdge - if (newEdge == null && sourceNode == null && targetNode == null) { - if (newGraph == null) { - throw "Graph is null!"; + if (!pathCacheHit) { + if (context.beginPath) { + context.beginPath(); } - if (parentNode == null) { - throw "Parent node is null!"; + if (usePaths) { + // store in the path cache with values easily manipulated later + shapeImpl.draw(context, 1, 0, { + x: 0, + y: 0 + }, 1); + } else { + shapeImpl.draw(context, size, angle, translation, edgeWidth); } - if (this.graphs.indexOf(newGraph) > -1) { - throw "Graph already in this graph mgr!"; + if (context.closePath) { + context.closePath(); } - - this.graphs.push(newGraph); - - if (newGraph.parent != null) { - throw "Already has a parent!"; + } + context = canvasContext; + if (usePaths) { + // set transform to arrow position/orientation + context.translate(x, y); + context.rotate(angle); + context.scale(size, size); + } + if (fill === 'filled' || fill === 'both') { + if (usePaths) { + context.fill(path); + } else { + context.fill(); } - if (parentNode.child != null) { - throw "Already has a child!"; + } + if (fill === 'hollow' || fill === 'both') { + context.lineWidth = (shapeImpl.matchEdgeWidth ? edgeWidth : 1) / (usePaths ? size : 1); + context.lineJoin = 'miter'; + if (usePaths) { + context.stroke(path); + } else { + context.stroke(); } + } + if (usePaths) { + // reset transform by applying inverse + context.scale(1 / size, 1 / size); + context.rotate(-angle); + context.translate(-x, -y); + } +}; - newGraph.parent = parentNode; - parentNode.child = newGraph; +var CRp$7 = {}; +CRp$7.safeDrawImage = function (context, img, ix, iy, iw, ih, x, y, w, h) { + // detect problematic cases for old browsers with bad images (cheaper than try-catch) + if (iw <= 0 || ih <= 0 || w <= 0 || h <= 0) { + return; + } + try { + context.drawImage(img, ix, iy, iw, ih, x, y, w, h); + } catch (e) { + warn(e); + } +}; +CRp$7.drawInscribedImage = function (context, img, node, index, nodeOpacity) { + var r = this; + var pos = node.position(); + var nodeX = pos.x; + var nodeY = pos.y; + var styleObj = node.cy().style(); + var getIndexedStyle = styleObj.getIndexedStyle.bind(styleObj); + var fit = getIndexedStyle(node, 'background-fit', 'value', index); + var repeat = getIndexedStyle(node, 'background-repeat', 'value', index); + var nodeW = node.width(); + var nodeH = node.height(); + var paddingX2 = node.padding() * 2; + var nodeTW = nodeW + (getIndexedStyle(node, 'background-width-relative-to', 'value', index) === 'inner' ? 0 : paddingX2); + var nodeTH = nodeH + (getIndexedStyle(node, 'background-height-relative-to', 'value', index) === 'inner' ? 0 : paddingX2); + var rs = node._private.rscratch; + var clip = getIndexedStyle(node, 'background-clip', 'value', index); + var shouldClip = clip === 'node'; + var imgOpacity = getIndexedStyle(node, 'background-image-opacity', 'value', index) * nodeOpacity; + var smooth = getIndexedStyle(node, 'background-image-smoothing', 'value', index); + var imgW = img.width || img.cachedW; + var imgH = img.height || img.cachedH; - return newGraph; - } else { - //change the order of the parameters - targetNode = newEdge; - sourceNode = parentNode; - newEdge = newGraph; - var sourceGraph = sourceNode.getOwner(); - var targetGraph = targetNode.getOwner(); + // workaround for broken browsers like ie + if (null == imgW || null == imgH) { + document.body.appendChild(img); // eslint-disable-line no-undef - if (!(sourceGraph != null && sourceGraph.getGraphManager() == this)) { - throw "Source not in this graph mgr!"; - } - if (!(targetGraph != null && targetGraph.getGraphManager() == this)) { - throw "Target not in this graph mgr!"; - } + imgW = img.cachedW = img.width || img.offsetWidth; + imgH = img.cachedH = img.height || img.offsetHeight; + document.body.removeChild(img); // eslint-disable-line no-undef + } - if (sourceGraph == targetGraph) { - newEdge.isInterGraph = false; - return sourceGraph.add(newEdge, sourceNode, targetNode); + var w = imgW; + var h = imgH; + if (getIndexedStyle(node, 'background-width', 'value', index) !== 'auto') { + if (getIndexedStyle(node, 'background-width', 'units', index) === '%') { + w = getIndexedStyle(node, 'background-width', 'pfValue', index) * nodeTW; } else { - newEdge.isInterGraph = true; - - // set source and target - newEdge.source = sourceNode; - newEdge.target = targetNode; - - // add edge to inter-graph edge list - if (this.edges.indexOf(newEdge) > -1) { - throw "Edge already in inter-graph edge list!"; - } - - this.edges.push(newEdge); - - // add edge to source and target incidency lists - if (!(newEdge.source != null && newEdge.target != null)) { - throw "Edge source and/or target is null!"; - } - - if (!(newEdge.source.edges.indexOf(newEdge) == -1 && newEdge.target.edges.indexOf(newEdge) == -1)) { - throw "Edge already in source and/or target incidency list!"; - } - - newEdge.source.edges.push(newEdge); - newEdge.target.edges.push(newEdge); + w = getIndexedStyle(node, 'background-width', 'pfValue', index); + } + } + if (getIndexedStyle(node, 'background-height', 'value', index) !== 'auto') { + if (getIndexedStyle(node, 'background-height', 'units', index) === '%') { + h = getIndexedStyle(node, 'background-height', 'pfValue', index) * nodeTH; + } else { + h = getIndexedStyle(node, 'background-height', 'pfValue', index); + } + } + if (w === 0 || h === 0) { + return; // no point in drawing empty image (and chrome is broken in this case) + } - return newEdge; + if (fit === 'contain') { + var scale = Math.min(nodeTW / w, nodeTH / h); + w *= scale; + h *= scale; + } else if (fit === 'cover') { + var scale = Math.max(nodeTW / w, nodeTH / h); + w *= scale; + h *= scale; + } + var x = nodeX - nodeTW / 2; // left + var posXUnits = getIndexedStyle(node, 'background-position-x', 'units', index); + var posXPfVal = getIndexedStyle(node, 'background-position-x', 'pfValue', index); + if (posXUnits === '%') { + x += (nodeTW - w) * posXPfVal; + } else { + x += posXPfVal; + } + var offXUnits = getIndexedStyle(node, 'background-offset-x', 'units', index); + var offXPfVal = getIndexedStyle(node, 'background-offset-x', 'pfValue', index); + if (offXUnits === '%') { + x += (nodeTW - w) * offXPfVal; + } else { + x += offXPfVal; + } + var y = nodeY - nodeTH / 2; // top + var posYUnits = getIndexedStyle(node, 'background-position-y', 'units', index); + var posYPfVal = getIndexedStyle(node, 'background-position-y', 'pfValue', index); + if (posYUnits === '%') { + y += (nodeTH - h) * posYPfVal; + } else { + y += posYPfVal; + } + var offYUnits = getIndexedStyle(node, 'background-offset-y', 'units', index); + var offYPfVal = getIndexedStyle(node, 'background-offset-y', 'pfValue', index); + if (offYUnits === '%') { + y += (nodeTH - h) * offYPfVal; + } else { + y += offYPfVal; + } + if (rs.pathCache) { + x -= nodeX; + y -= nodeY; + nodeX = 0; + nodeY = 0; + } + var gAlpha = context.globalAlpha; + context.globalAlpha = imgOpacity; + var smoothingEnabled = r.getImgSmoothing(context); + var isSmoothingSwitched = false; + if (smooth === 'no' && smoothingEnabled) { + r.setImgSmoothing(context, false); + isSmoothingSwitched = true; + } else if (smooth === 'yes' && !smoothingEnabled) { + r.setImgSmoothing(context, true); + isSmoothingSwitched = true; + } + if (repeat === 'no-repeat') { + if (shouldClip) { + context.save(); + if (rs.pathCache) { + context.clip(rs.pathCache); + } else { + r.nodeShapes[r.getNodeShape(node)].draw(context, nodeX, nodeY, nodeTW, nodeTH); + context.clip(); + } + } + r.safeDrawImage(context, img, 0, 0, imgW, imgH, x, y, w, h); + if (shouldClip) { + context.restore(); } + } else { + var pattern = context.createPattern(img, repeat); + context.fillStyle = pattern; + r.nodeShapes[r.getNodeShape(node)].draw(context, nodeX, nodeY, nodeTW, nodeTH); + context.translate(x, y); + context.fill(); + context.translate(-x, -y); + } + context.globalAlpha = gAlpha; + if (isSmoothingSwitched) { + r.setImgSmoothing(context, smoothingEnabled); } }; -LGraphManager.prototype.remove = function (lObj) { - if (lObj instanceof LGraph) { - var graph = lObj; - if (graph.getGraphManager() != this) { - throw "Graph not in this graph mgr"; - } - if (!(graph == this.rootGraph || graph.parent != null && graph.parent.graphManager == this)) { - throw "Invalid parent node!"; - } - - // first the edges (make a copy to do it safely) - var edgesToBeRemoved = []; - - edgesToBeRemoved = edgesToBeRemoved.concat(graph.getEdges()); - - var edge; - var s = edgesToBeRemoved.length; - for (var i = 0; i < s; i++) { - edge = edgesToBeRemoved[i]; - graph.remove(edge); - } - - // then the nodes (make a copy to do it safely) - var nodesToBeRemoved = []; - - nodesToBeRemoved = nodesToBeRemoved.concat(graph.getNodes()); - - var node; - s = nodesToBeRemoved.length; - for (var i = 0; i < s; i++) { - node = nodesToBeRemoved[i]; - graph.remove(node); - } - - // check if graph is the root - if (graph == this.rootGraph) { - this.setRootGraph(null); - } - - // now remove the graph itself - var index = this.graphs.indexOf(graph); - this.graphs.splice(index, 1); - - // also reset the parent of the graph - graph.parent = null; - } else if (lObj instanceof LEdge) { - edge = lObj; - if (edge == null) { - throw "Edge is null!"; - } - if (!edge.isInterGraph) { - throw "Not an inter-graph edge!"; - } - if (!(edge.source != null && edge.target != null)) { - throw "Source and/or target is null!"; - } - - // remove edge from source and target nodes' incidency lists +var CRp$6 = {}; +CRp$6.eleTextBiggerThanMin = function (ele, scale) { + if (!scale) { + var zoom = ele.cy().zoom(); + var pxRatio = this.getPixelRatio(); + var lvl = Math.ceil(log2(zoom * pxRatio)); // the effective texture level - if (!(edge.source.edges.indexOf(edge) != -1 && edge.target.edges.indexOf(edge) != -1)) { - throw "Source and/or target doesn't know this edge!"; + scale = Math.pow(2, lvl); + } + var computedSize = ele.pstyle('font-size').pfValue * scale; + var minSize = ele.pstyle('min-zoomed-font-size').pfValue; + if (computedSize < minSize) { + return false; + } + return true; +}; +CRp$6.drawElementText = function (context, ele, shiftToOriginWithBb, force, prefix) { + var useEleOpacity = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; + var r = this; + if (force == null) { + if (useEleOpacity && !r.eleTextBiggerThanMin(ele)) { + return; } - - var index = edge.source.edges.indexOf(edge); - edge.source.edges.splice(index, 1); - index = edge.target.edges.indexOf(edge); - edge.target.edges.splice(index, 1); - - // remove edge from owner graph manager's inter-graph edge list - - if (!(edge.source.owner != null && edge.source.owner.getGraphManager() != null)) { - throw "Edge owner graph or owner graph manager is null!"; + } else if (force === false) { + return; + } + if (ele.isNode()) { + var label = ele.pstyle('label'); + if (!label || !label.value) { + return; } - if (edge.source.owner.getGraphManager().edges.indexOf(edge) == -1) { - throw "Not in owner graph manager's edge list!"; + var justification = r.getLabelJustification(ele); + context.textAlign = justification; + context.textBaseline = 'bottom'; + } else { + var badLine = ele.element()._private.rscratch.badLine; + var _label = ele.pstyle('label'); + var srcLabel = ele.pstyle('source-label'); + var tgtLabel = ele.pstyle('target-label'); + if (badLine || (!_label || !_label.value) && (!srcLabel || !srcLabel.value) && (!tgtLabel || !tgtLabel.value)) { + return; } - - var index = edge.source.owner.getGraphManager().edges.indexOf(edge); - edge.source.owner.getGraphManager().edges.splice(index, 1); + context.textAlign = 'center'; + context.textBaseline = 'bottom'; } -}; - -LGraphManager.prototype.updateBounds = function () { - this.rootGraph.updateBounds(true); -}; - -LGraphManager.prototype.getGraphs = function () { - return this.graphs; -}; - -LGraphManager.prototype.getAllNodes = function () { - if (this.allNodes == null) { - var nodeList = []; - var graphs = this.getGraphs(); - var s = graphs.length; - for (var i = 0; i < s; i++) { - nodeList = nodeList.concat(graphs[i].getNodes()); + var applyRotation = !shiftToOriginWithBb; + var bb; + if (shiftToOriginWithBb) { + bb = shiftToOriginWithBb; + context.translate(-bb.x1, -bb.y1); + } + if (prefix == null) { + r.drawText(context, ele, null, applyRotation, useEleOpacity); + if (ele.isEdge()) { + r.drawText(context, ele, 'source', applyRotation, useEleOpacity); + r.drawText(context, ele, 'target', applyRotation, useEleOpacity); } - this.allNodes = nodeList; + } else { + r.drawText(context, ele, prefix, applyRotation, useEleOpacity); + } + if (shiftToOriginWithBb) { + context.translate(bb.x1, bb.y1); } - return this.allNodes; -}; - -LGraphManager.prototype.resetAllNodes = function () { - this.allNodes = null; -}; - -LGraphManager.prototype.resetAllEdges = function () { - this.allEdges = null; -}; - -LGraphManager.prototype.resetAllNodesToApplyGravitation = function () { - this.allNodesToApplyGravitation = null; }; - -LGraphManager.prototype.getAllEdges = function () { - if (this.allEdges == null) { - var edgeList = []; - var graphs = this.getGraphs(); - var s = graphs.length; - for (var i = 0; i < graphs.length; i++) { - edgeList = edgeList.concat(graphs[i].getEdges()); +CRp$6.getFontCache = function (context) { + var cache; + this.fontCaches = this.fontCaches || []; + for (var i = 0; i < this.fontCaches.length; i++) { + cache = this.fontCaches[i]; + if (cache.context === context) { + return cache; } - - edgeList = edgeList.concat(this.edges); - - this.allEdges = edgeList; } - return this.allEdges; -}; - -LGraphManager.prototype.getAllNodesToApplyGravitation = function () { - return this.allNodesToApplyGravitation; + cache = { + context: context + }; + this.fontCaches.push(cache); + return cache; }; -LGraphManager.prototype.setAllNodesToApplyGravitation = function (nodeList) { - if (this.allNodesToApplyGravitation != null) { - throw "assert failed"; - } - - this.allNodesToApplyGravitation = nodeList; -}; +// set up canvas context with font +// returns transformed text string +CRp$6.setupTextStyle = function (context, ele) { + var useEleOpacity = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + // Font style + var labelStyle = ele.pstyle('font-style').strValue; + var labelSize = ele.pstyle('font-size').pfValue + 'px'; + var labelFamily = ele.pstyle('font-family').strValue; + var labelWeight = ele.pstyle('font-weight').strValue; + var opacity = useEleOpacity ? ele.effectiveOpacity() * ele.pstyle('text-opacity').value : 1; + var outlineOpacity = ele.pstyle('text-outline-opacity').value * opacity; + var color = ele.pstyle('color').value; + var outlineColor = ele.pstyle('text-outline-color').value; + context.font = labelStyle + ' ' + labelWeight + ' ' + labelSize + ' ' + labelFamily; + context.lineJoin = 'round'; // so text outlines aren't jagged -LGraphManager.prototype.getRoot = function () { - return this.rootGraph; + this.colorFillStyle(context, color[0], color[1], color[2], opacity); + this.colorStrokeStyle(context, outlineColor[0], outlineColor[1], outlineColor[2], outlineOpacity); }; -LGraphManager.prototype.setRootGraph = function (graph) { - if (graph.getGraphManager() != this) { - throw "Root not in this graph mgr!"; - } - - this.rootGraph = graph; - // root graph must have a root node associated with it for convenience - if (graph.parent == null) { - graph.parent = this.layout.newNode("Root node"); +// TODO ensure re-used +function roundRect(ctx, x, y, width, height) { + var radius = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 5; + ctx.beginPath(); + ctx.moveTo(x + radius, y); + ctx.lineTo(x + width - radius, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + radius); + ctx.lineTo(x + width, y + height - radius); + ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); + ctx.lineTo(x + radius, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - radius); + ctx.lineTo(x, y + radius); + ctx.quadraticCurveTo(x, y, x + radius, y); + ctx.closePath(); + ctx.fill(); +} +CRp$6.getTextAngle = function (ele, prefix) { + var theta; + var _p = ele._private; + var rscratch = _p.rscratch; + var pdash = prefix ? prefix + '-' : ''; + var rotation = ele.pstyle(pdash + 'text-rotation'); + var textAngle = getPrefixedProperty(rscratch, 'labelAngle', prefix); + if (rotation.strValue === 'autorotate') { + theta = ele.isEdge() ? textAngle : 0; + } else if (rotation.strValue === 'none') { + theta = 0; + } else { + theta = rotation.pfValue; } + return theta; }; - -LGraphManager.prototype.getLayout = function () { - return this.layout; -}; - -LGraphManager.prototype.isOneAncestorOfOther = function (firstNode, secondNode) { - if (!(firstNode != null && secondNode != null)) { - throw "assert failed"; +CRp$6.drawText = function (context, ele, prefix) { + var applyRotation = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var useEleOpacity = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; + var _p = ele._private; + var rscratch = _p.rscratch; + var parentOpacity = useEleOpacity ? ele.effectiveOpacity() : 1; + if (useEleOpacity && (parentOpacity === 0 || ele.pstyle('text-opacity').value === 0)) { + return; } - if (firstNode == secondNode) { - return true; + // use 'main' as an alias for the main label (i.e. null prefix) + if (prefix === 'main') { + prefix = null; } - // Is second node an ancestor of the first one? - var ownerGraph = firstNode.getOwner(); - var parentNode; - - do { - parentNode = ownerGraph.getParent(); - - if (parentNode == null) { - break; - } - - if (parentNode == secondNode) { - return true; + var textX = getPrefixedProperty(rscratch, 'labelX', prefix); + var textY = getPrefixedProperty(rscratch, 'labelY', prefix); + var orgTextX, orgTextY; // used for rotation + var text = this.getLabelText(ele, prefix); + if (text != null && text !== '' && !isNaN(textX) && !isNaN(textY)) { + this.setupTextStyle(context, ele, useEleOpacity); + var pdash = prefix ? prefix + '-' : ''; + var textW = getPrefixedProperty(rscratch, 'labelWidth', prefix); + var textH = getPrefixedProperty(rscratch, 'labelHeight', prefix); + var marginX = ele.pstyle(pdash + 'text-margin-x').pfValue; + var marginY = ele.pstyle(pdash + 'text-margin-y').pfValue; + var isEdge = ele.isEdge(); + var halign = ele.pstyle('text-halign').value; + var valign = ele.pstyle('text-valign').value; + if (isEdge) { + halign = 'center'; + valign = 'center'; } - - ownerGraph = parentNode.getOwner(); - if (ownerGraph == null) { - break; + textX += marginX; + textY += marginY; + var theta; + if (!applyRotation) { + theta = 0; + } else { + theta = this.getTextAngle(ele, prefix); } - } while (true); - // Is first node an ancestor of the second one? - ownerGraph = secondNode.getOwner(); - - do { - parentNode = ownerGraph.getParent(); - - if (parentNode == null) { - break; + if (theta !== 0) { + orgTextX = textX; + orgTextY = textY; + context.translate(orgTextX, orgTextY); + context.rotate(theta); + textX = 0; + textY = 0; } - - if (parentNode == firstNode) { - return true; + switch (valign) { + case 'top': + break; + case 'center': + textY += textH / 2; + break; + case 'bottom': + textY += textH; + break; } - - ownerGraph = parentNode.getOwner(); - if (ownerGraph == null) { - break; + var backgroundOpacity = ele.pstyle('text-background-opacity').value; + var borderOpacity = ele.pstyle('text-border-opacity').value; + var textBorderWidth = ele.pstyle('text-border-width').pfValue; + var backgroundPadding = ele.pstyle('text-background-padding').pfValue; + if (backgroundOpacity > 0 || textBorderWidth > 0 && borderOpacity > 0) { + var bgX = textX - backgroundPadding; + switch (halign) { + case 'left': + bgX -= textW; + break; + case 'center': + bgX -= textW / 2; + break; + } + var bgY = textY - textH - backgroundPadding; + var bgW = textW + 2 * backgroundPadding; + var bgH = textH + 2 * backgroundPadding; + if (backgroundOpacity > 0) { + var textFill = context.fillStyle; + var textBackgroundColor = ele.pstyle('text-background-color').value; + context.fillStyle = 'rgba(' + textBackgroundColor[0] + ',' + textBackgroundColor[1] + ',' + textBackgroundColor[2] + ',' + backgroundOpacity * parentOpacity + ')'; + var styleShape = ele.pstyle('text-background-shape').strValue; + if (styleShape.indexOf('round') === 0) { + roundRect(context, bgX, bgY, bgW, bgH, 2); + } else { + context.fillRect(bgX, bgY, bgW, bgH); + } + context.fillStyle = textFill; + } + if (textBorderWidth > 0 && borderOpacity > 0) { + var textStroke = context.strokeStyle; + var textLineWidth = context.lineWidth; + var textBorderColor = ele.pstyle('text-border-color').value; + var textBorderStyle = ele.pstyle('text-border-style').value; + context.strokeStyle = 'rgba(' + textBorderColor[0] + ',' + textBorderColor[1] + ',' + textBorderColor[2] + ',' + borderOpacity * parentOpacity + ')'; + context.lineWidth = textBorderWidth; + if (context.setLineDash) { + // for very outofdate browsers + switch (textBorderStyle) { + case 'dotted': + context.setLineDash([1, 1]); + break; + case 'dashed': + context.setLineDash([4, 2]); + break; + case 'double': + context.lineWidth = textBorderWidth / 4; // 50% reserved for white between the two borders + context.setLineDash([]); + break; + case 'solid': + context.setLineDash([]); + break; + } + } + context.strokeRect(bgX, bgY, bgW, bgH); + if (textBorderStyle === 'double') { + var whiteWidth = textBorderWidth / 2; + context.strokeRect(bgX + whiteWidth, bgY + whiteWidth, bgW - whiteWidth * 2, bgH - whiteWidth * 2); + } + if (context.setLineDash) { + // for very outofdate browsers + context.setLineDash([]); + } + context.lineWidth = textLineWidth; + context.strokeStyle = textStroke; + } } - } while (true); - - return false; -}; - -LGraphManager.prototype.calcLowestCommonAncestors = function () { - var edge; - var sourceNode; - var targetNode; - var sourceAncestorGraph; - var targetAncestorGraph; - - var edges = this.getAllEdges(); - var s = edges.length; - for (var i = 0; i < s; i++) { - edge = edges[i]; - - sourceNode = edge.source; - targetNode = edge.target; - edge.lca = null; - edge.sourceInLca = sourceNode; - edge.targetInLca = targetNode; + var lineWidth = 2 * ele.pstyle('text-outline-width').pfValue; // *2 b/c the stroke is drawn centred on the middle - if (sourceNode == targetNode) { - edge.lca = sourceNode.getOwner(); - continue; + if (lineWidth > 0) { + context.lineWidth = lineWidth; } + if (ele.pstyle('text-wrap').value === 'wrap') { + var lines = getPrefixedProperty(rscratch, 'labelWrapCachedLines', prefix); + var lineHeight = getPrefixedProperty(rscratch, 'labelLineHeight', prefix); + var halfTextW = textW / 2; + var justification = this.getLabelJustification(ele); + if (justification === 'auto') ; else if (halign === 'left') { + // auto justification : right + if (justification === 'left') { + textX += -textW; + } else if (justification === 'center') { + textX += -halfTextW; + } // else same as auto + } else if (halign === 'center') { + // auto justfication : center + if (justification === 'left') { + textX += -halfTextW; + } else if (justification === 'right') { + textX += halfTextW; + } // else same as auto + } else if (halign === 'right') { + // auto justification : left + if (justification === 'center') { + textX += halfTextW; + } else if (justification === 'right') { + textX += textW; + } // else same as auto + } - sourceAncestorGraph = sourceNode.getOwner(); - - while (edge.lca == null) { - edge.targetInLca = targetNode; - targetAncestorGraph = targetNode.getOwner(); - - while (edge.lca == null) { - if (targetAncestorGraph == sourceAncestorGraph) { - edge.lca = targetAncestorGraph; + switch (valign) { + case 'top': + textY -= (lines.length - 1) * lineHeight; break; - } - - if (targetAncestorGraph == this.rootGraph) { + case 'center': + case 'bottom': + textY -= (lines.length - 1) * lineHeight; break; - } - - if (edge.lca != null) { - throw "assert failed"; - } - edge.targetInLca = targetAncestorGraph.getParent(); - targetAncestorGraph = edge.targetInLca.getOwner(); } - - if (sourceAncestorGraph == this.rootGraph) { - break; + for (var l = 0; l < lines.length; l++) { + if (lineWidth > 0) { + context.strokeText(lines[l], textX, textY); + } + context.fillText(lines[l], textX, textY); + textY += lineHeight; } - - if (edge.lca == null) { - edge.sourceInLca = sourceAncestorGraph.getParent(); - sourceAncestorGraph = edge.sourceInLca.getOwner(); + } else { + if (lineWidth > 0) { + context.strokeText(text, textX, textY); } + context.fillText(text, textX, textY); } - - if (edge.lca == null) { - throw "assert failed"; + if (theta !== 0) { + context.rotate(-theta); + context.translate(-orgTextX, -orgTextY); } } }; -LGraphManager.prototype.calcLowestCommonAncestor = function (firstNode, secondNode) { - if (firstNode == secondNode) { - return firstNode.getOwner(); +/* global Path2D */ +var CRp$5 = {}; +CRp$5.drawNode = function (context, node, shiftToOriginWithBb) { + var drawLabel = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var shouldDrawOverlay = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; + var shouldDrawOpacity = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; + var r = this; + var nodeWidth, nodeHeight; + var _p = node._private; + var rs = _p.rscratch; + var pos = node.position(); + if (!number$1(pos.x) || !number$1(pos.y)) { + return; // can't draw node with undefined position } - var firstOwnerGraph = firstNode.getOwner(); - - do { - if (firstOwnerGraph == null) { - break; - } - var secondOwnerGraph = secondNode.getOwner(); - - do { - if (secondOwnerGraph == null) { - break; - } - if (secondOwnerGraph == firstOwnerGraph) { - return secondOwnerGraph; - } - secondOwnerGraph = secondOwnerGraph.getParent().getOwner(); - } while (true); - - firstOwnerGraph = firstOwnerGraph.getParent().getOwner(); - } while (true); - - return firstOwnerGraph; -}; - -LGraphManager.prototype.calcInclusionTreeDepths = function (graph, depth) { - if (graph == null && depth == null) { - graph = this.rootGraph; - depth = 1; + if (shouldDrawOpacity && !node.visible()) { + return; } - var node; + var eleOpacity = shouldDrawOpacity ? node.effectiveOpacity() : 1; + var usePaths = r.usePaths(); + var path; + var pathCacheHit = false; + var padding = node.padding(); + nodeWidth = node.width() + 2 * padding; + nodeHeight = node.height() + 2 * padding; - var nodes = graph.getNodes(); - var s = nodes.length; - for (var i = 0; i < s; i++) { - node = nodes[i]; - node.inclusionTreeDepth = depth; + // + // setup shift - if (node.child != null) { - this.calcInclusionTreeDepths(node.child, depth + 1); - } + var bb; + if (shiftToOriginWithBb) { + bb = shiftToOriginWithBb; + context.translate(-bb.x1, -bb.y1); } -}; -LGraphManager.prototype.includesInvalidEdge = function () { - var edge; - var edgesToRemove = []; + // + // load bg image - var s = this.edges.length; - for (var i = 0; i < s; i++) { - edge = this.edges[i]; + var bgImgProp = node.pstyle('background-image'); + var urls = bgImgProp.value; + var urlDefined = new Array(urls.length); + var image = new Array(urls.length); + var numImages = 0; + for (var i = 0; i < urls.length; i++) { + var url = urls[i]; + var defd = urlDefined[i] = url != null && url !== 'none'; + if (defd) { + var bgImgCrossOrigin = node.cy().style().getIndexedStyle(node, 'background-image-crossorigin', 'value', i); + numImages++; - if (this.isOneAncestorOfOther(edge.source, edge.target)) { - edgesToRemove.push(edge); + // get image, and if not loaded then ask to redraw when later loaded + image[i] = r.getCachedImage(url, bgImgCrossOrigin, function () { + _p.backgroundTimestamp = Date.now(); + node.emitAndNotify('background'); + }); } } - // Remove invalid edges from graph manager - for (var i = 0; i < edgesToRemove.length; i++) { - this.remove(edgesToRemove[i]); - } - - // Invalid edges are cleared, so return false - return false; -}; - -module.exports = LGraphManager; - -/***/ }), -/* 8 */ -/***/ (function(module, exports, __nested_webpack_require_41052__) { - -"use strict"; - - -/** - * This class maintains a list of static geometry related utility methods. - * - * - * Copyright: i-Vis Research Group, Bilkent University, 2007 - present - */ - -var Point = __nested_webpack_require_41052__(12); - -function IGeometry() {} - -/** - * This method calculates *half* the amount in x and y directions of the two - * input rectangles needed to separate them keeping their respective - * positioning, and returns the result in the input array. An input - * separation buffer added to the amount in both directions. We assume that - * the two rectangles do intersect. - */ -IGeometry.calcSeparationAmount = function (rectA, rectB, overlapAmount, separationBuffer) { - if (!rectA.intersects(rectB)) { - throw "assert failed"; - } - - var directions = new Array(2); - - this.decideDirectionsForOverlappingNodes(rectA, rectB, directions); - - overlapAmount[0] = Math.min(rectA.getRight(), rectB.getRight()) - Math.max(rectA.x, rectB.x); - overlapAmount[1] = Math.min(rectA.getBottom(), rectB.getBottom()) - Math.max(rectA.y, rectB.y); - - // update the overlapping amounts for the following cases: - if (rectA.getX() <= rectB.getX() && rectA.getRight() >= rectB.getRight()) { - /* Case x.1: - * - * rectA - * | | - * | _________ | - * | | | | - * |________|_______|______| - * | | - * | | - * rectB - */ - overlapAmount[0] += Math.min(rectB.getX() - rectA.getX(), rectA.getRight() - rectB.getRight()); - } else if (rectB.getX() <= rectA.getX() && rectB.getRight() >= rectA.getRight()) { - /* Case x.2: - * - * rectB - * | | - * | _________ | - * | | | | - * |________|_______|______| - * | | - * | | - * rectA - */ - overlapAmount[0] += Math.min(rectA.getX() - rectB.getX(), rectB.getRight() - rectA.getRight()); - } - if (rectA.getY() <= rectB.getY() && rectA.getBottom() >= rectB.getBottom()) { - /* Case y.1: - * ________ rectA - * | - * | - * ______|____ rectB - * | | - * | | - * ______|____| - * | - * | - * |________ - * - */ - overlapAmount[1] += Math.min(rectB.getY() - rectA.getY(), rectA.getBottom() - rectB.getBottom()); - } else if (rectB.getY() <= rectA.getY() && rectB.getBottom() >= rectA.getBottom()) { - /* Case y.2: - * ________ rectB - * | - * | - * ______|____ rectA - * | | - * | | - * ______|____| - * | - * | - * |________ - * - */ - overlapAmount[1] += Math.min(rectA.getY() - rectB.getY(), rectB.getBottom() - rectA.getBottom()); - } - - // find slope of the line passes two centers - var slope = Math.abs((rectB.getCenterY() - rectA.getCenterY()) / (rectB.getCenterX() - rectA.getCenterX())); - // if centers are overlapped - if (rectB.getCenterY() === rectA.getCenterY() && rectB.getCenterX() === rectA.getCenterX()) { - // assume the slope is 1 (45 degree) - slope = 1.0; - } - - var moveByY = slope * overlapAmount[0]; - var moveByX = overlapAmount[1] / slope; - if (overlapAmount[0] < moveByX) { - moveByX = overlapAmount[0]; - } else { - moveByY = overlapAmount[1]; - } - // return half the amount so that if each rectangle is moved by these - // amounts in opposite directions, overlap will be resolved - overlapAmount[0] = -1 * directions[0] * (moveByX / 2 + separationBuffer); - overlapAmount[1] = -1 * directions[1] * (moveByY / 2 + separationBuffer); -}; - -/** - * This method decides the separation direction of overlapping nodes - * - * if directions[0] = -1, then rectA goes left - * if directions[0] = 1, then rectA goes right - * if directions[1] = -1, then rectA goes up - * if directions[1] = 1, then rectA goes down - */ -IGeometry.decideDirectionsForOverlappingNodes = function (rectA, rectB, directions) { - if (rectA.getCenterX() < rectB.getCenterX()) { - directions[0] = -1; - } else { - directions[0] = 1; - } - - if (rectA.getCenterY() < rectB.getCenterY()) { - directions[1] = -1; - } else { - directions[1] = 1; - } -}; + // + // setup styles -/** - * This method calculates the intersection (clipping) points of the two - * input rectangles with line segment defined by the centers of these two - * rectangles. The clipping points are saved in the input double array and - * whether or not the two rectangles overlap is returned. - */ -IGeometry.getIntersection2 = function (rectA, rectB, result) { - //result[0-1] will contain clipPoint of rectA, result[2-3] will contain clipPoint of rectB - var p1x = rectA.getCenterX(); - var p1y = rectA.getCenterY(); - var p2x = rectB.getCenterX(); - var p2y = rectB.getCenterY(); + var darkness = node.pstyle('background-blacken').value; + var borderWidth = node.pstyle('border-width').pfValue; + var bgOpacity = node.pstyle('background-opacity').value * eleOpacity; + var borderColor = node.pstyle('border-color').value; + var borderStyle = node.pstyle('border-style').value; + var borderOpacity = node.pstyle('border-opacity').value * eleOpacity; + context.lineJoin = 'miter'; // so borders are square with the node shape - //if two rectangles intersect, then clipping points are centers - if (rectA.intersects(rectB)) { - result[0] = p1x; - result[1] = p1y; - result[2] = p2x; - result[3] = p2y; - return true; - } - //variables for rectA - var topLeftAx = rectA.getX(); - var topLeftAy = rectA.getY(); - var topRightAx = rectA.getRight(); - var bottomLeftAx = rectA.getX(); - var bottomLeftAy = rectA.getBottom(); - var bottomRightAx = rectA.getRight(); - var halfWidthA = rectA.getWidthHalf(); - var halfHeightA = rectA.getHeightHalf(); - //variables for rectB - var topLeftBx = rectB.getX(); - var topLeftBy = rectB.getY(); - var topRightBx = rectB.getRight(); - var bottomLeftBx = rectB.getX(); - var bottomLeftBy = rectB.getBottom(); - var bottomRightBx = rectB.getRight(); - var halfWidthB = rectB.getWidthHalf(); - var halfHeightB = rectB.getHeightHalf(); + var setupShapeColor = function setupShapeColor() { + var bgOpy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : bgOpacity; + r.eleFillStyle(context, node, bgOpy); + }; + var setupBorderColor = function setupBorderColor() { + var bdrOpy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : borderOpacity; + r.colorStrokeStyle(context, borderColor[0], borderColor[1], borderColor[2], bdrOpy); + }; - //flag whether clipping points are found - var clipPointAFound = false; - var clipPointBFound = false; + // + // setup shape - // line is vertical - if (p1x === p2x) { - if (p1y > p2y) { - result[0] = p1x; - result[1] = topLeftAy; - result[2] = p2x; - result[3] = bottomLeftBy; - return false; - } else if (p1y < p2y) { - result[0] = p1x; - result[1] = bottomLeftAy; - result[2] = p2x; - result[3] = topLeftBy; - return false; + var styleShape = node.pstyle('shape').strValue; + var shapePts = node.pstyle('shape-polygon-points').pfValue; + if (usePaths) { + context.translate(pos.x, pos.y); + var pathCache = r.nodePathCache = r.nodePathCache || []; + var key = hashStrings(styleShape === 'polygon' ? styleShape + ',' + shapePts.join(',') : styleShape, '' + nodeHeight, '' + nodeWidth); + var cachedPath = pathCache[key]; + if (cachedPath != null) { + path = cachedPath; + pathCacheHit = true; + rs.pathCache = path; } else { - //not line, return null; + path = new Path2D(); + pathCache[key] = rs.pathCache = path; } } - // line is horizontal - else if (p1y === p2y) { - if (p1x > p2x) { - result[0] = topLeftAx; - result[1] = p1y; - result[2] = topRightBx; - result[3] = p2y; - return false; - } else if (p1x < p2x) { - result[0] = topRightAx; - result[1] = p1y; - result[2] = topLeftBx; - result[3] = p2y; - return false; - } else { - //not valid line, return null; + var drawShape = function drawShape() { + if (!pathCacheHit) { + var npos = pos; + if (usePaths) { + npos = { + x: 0, + y: 0 + }; } + r.nodeShapes[r.getNodeShape(node)].draw(path || context, npos.x, npos.y, nodeWidth, nodeHeight); + } + if (usePaths) { + context.fill(path); } else { - //slopes of rectA's and rectB's diagonals - var slopeA = rectA.height / rectA.width; - var slopeB = rectB.height / rectB.width; - - //slope of line between center of rectA and center of rectB - var slopePrime = (p2y - p1y) / (p2x - p1x); - var cardinalDirectionA = void 0; - var cardinalDirectionB = void 0; - var tempPointAx = void 0; - var tempPointAy = void 0; - var tempPointBx = void 0; - var tempPointBy = void 0; - - //determine whether clipping point is the corner of nodeA - if (-slopeA === slopePrime) { - if (p1x > p2x) { - result[0] = bottomLeftAx; - result[1] = bottomLeftAy; - clipPointAFound = true; - } else { - result[0] = topRightAx; - result[1] = topLeftAy; - clipPointAFound = true; - } - } else if (slopeA === slopePrime) { - if (p1x > p2x) { - result[0] = topLeftAx; - result[1] = topLeftAy; - clipPointAFound = true; - } else { - result[0] = bottomRightAx; - result[1] = bottomLeftAy; - clipPointAFound = true; - } - } - - //determine whether clipping point is the corner of nodeB - if (-slopeB === slopePrime) { - if (p2x > p1x) { - result[2] = bottomLeftBx; - result[3] = bottomLeftBy; - clipPointBFound = true; - } else { - result[2] = topRightBx; - result[3] = topLeftBy; - clipPointBFound = true; - } - } else if (slopeB === slopePrime) { - if (p2x > p1x) { - result[2] = topLeftBx; - result[3] = topLeftBy; - clipPointBFound = true; - } else { - result[2] = bottomRightBx; - result[3] = bottomLeftBy; - clipPointBFound = true; - } + context.fill(); + } + }; + var drawImages = function drawImages() { + var nodeOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : eleOpacity; + var inside = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var prevBging = _p.backgrounding; + var totalCompleted = 0; + for (var _i = 0; _i < image.length; _i++) { + var bgContainment = node.cy().style().getIndexedStyle(node, 'background-image-containment', 'value', _i); + if (inside && bgContainment === 'over' || !inside && bgContainment === 'inside') { + totalCompleted++; + continue; } - - //if both clipping points are corners - if (clipPointAFound && clipPointBFound) { - return false; + if (urlDefined[_i] && image[_i].complete && !image[_i].error) { + totalCompleted++; + r.drawInscribedImage(context, image[_i], node, _i, nodeOpacity); } + } + _p.backgrounding = !(totalCompleted === numImages); + if (prevBging !== _p.backgrounding) { + // update style b/c :backgrounding state changed + node.updateStyle(false); + } + }; + var drawPie = function drawPie() { + var redrawShape = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var pieOpacity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : eleOpacity; + if (r.hasPie(node)) { + r.drawPie(context, node, pieOpacity); - //determine Cardinal Direction of rectangles - if (p1x > p2x) { - if (p1y > p2y) { - cardinalDirectionA = this.getCardinalDirection(slopeA, slopePrime, 4); - cardinalDirectionB = this.getCardinalDirection(slopeB, slopePrime, 2); - } else { - cardinalDirectionA = this.getCardinalDirection(-slopeA, slopePrime, 3); - cardinalDirectionB = this.getCardinalDirection(-slopeB, slopePrime, 1); + // redraw/restore path if steps after pie need it + if (redrawShape) { + if (!usePaths) { + r.nodeShapes[r.getNodeShape(node)].draw(context, pos.x, pos.y, nodeWidth, nodeHeight); } + } + } + }; + var darken = function darken() { + var darkenOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : eleOpacity; + var opacity = (darkness > 0 ? darkness : -darkness) * darkenOpacity; + var c = darkness > 0 ? 0 : 255; + if (darkness !== 0) { + r.colorFillStyle(context, c, c, c, opacity); + if (usePaths) { + context.fill(path); } else { - if (p1y > p2y) { - cardinalDirectionA = this.getCardinalDirection(-slopeA, slopePrime, 1); - cardinalDirectionB = this.getCardinalDirection(-slopeB, slopePrime, 3); - } else { - cardinalDirectionA = this.getCardinalDirection(slopeA, slopePrime, 2); - cardinalDirectionB = this.getCardinalDirection(slopeB, slopePrime, 4); - } + context.fill(); } - //calculate clipping Point if it is not found before - if (!clipPointAFound) { - switch (cardinalDirectionA) { - case 1: - tempPointAy = topLeftAy; - tempPointAx = p1x + -halfHeightA / slopePrime; - result[0] = tempPointAx; - result[1] = tempPointAy; - break; - case 2: - tempPointAx = bottomRightAx; - tempPointAy = p1y + halfWidthA * slopePrime; - result[0] = tempPointAx; - result[1] = tempPointAy; + } + }; + var drawBorder = function drawBorder() { + if (borderWidth > 0) { + context.lineWidth = borderWidth; + context.lineCap = 'butt'; + if (context.setLineDash) { + // for very outofdate browsers + switch (borderStyle) { + case 'dotted': + context.setLineDash([1, 1]); break; - case 3: - tempPointAy = bottomLeftAy; - tempPointAx = p1x + halfHeightA / slopePrime; - result[0] = tempPointAx; - result[1] = tempPointAy; + case 'dashed': + context.setLineDash([4, 2]); break; - case 4: - tempPointAx = bottomLeftAx; - tempPointAy = p1y + -halfWidthA * slopePrime; - result[0] = tempPointAx; - result[1] = tempPointAy; + case 'solid': + case 'double': + context.setLineDash([]); break; } } - if (!clipPointBFound) { - switch (cardinalDirectionB) { - case 1: - tempPointBy = topLeftBy; - tempPointBx = p2x + -halfHeightB / slopePrime; - result[2] = tempPointBx; - result[3] = tempPointBy; - break; - case 2: - tempPointBx = bottomRightBx; - tempPointBy = p2y + halfWidthB * slopePrime; - result[2] = tempPointBx; - result[3] = tempPointBy; - break; - case 3: - tempPointBy = bottomLeftBy; - tempPointBx = p2x + halfHeightB / slopePrime; - result[2] = tempPointBx; - result[3] = tempPointBy; - break; - case 4: - tempPointBx = bottomLeftBx; - tempPointBy = p2y + -halfWidthB * slopePrime; - result[2] = tempPointBx; - result[3] = tempPointBy; - break; + if (usePaths) { + context.stroke(path); + } else { + context.stroke(); + } + if (borderStyle === 'double') { + context.lineWidth = borderWidth / 3; + var gco = context.globalCompositeOperation; + context.globalCompositeOperation = 'destination-out'; + if (usePaths) { + context.stroke(path); + } else { + context.stroke(); } + context.globalCompositeOperation = gco; } - } - return false; -}; -/** - * This method returns in which cardinal direction does input point stays - * 1: North - * 2: East - * 3: South - * 4: West - */ -IGeometry.getCardinalDirection = function (slope, slopePrime, line) { - if (slope > slopePrime) { - return line; - } else { - return 1 + line % 4; + // reset in case we changed the border style + if (context.setLineDash) { + // for very outofdate browsers + context.setLineDash([]); + } + } + }; + var drawOverlay = function drawOverlay() { + if (shouldDrawOverlay) { + r.drawNodeOverlay(context, node, pos, nodeWidth, nodeHeight); + } + }; + var drawUnderlay = function drawUnderlay() { + if (shouldDrawOverlay) { + r.drawNodeUnderlay(context, node, pos, nodeWidth, nodeHeight); + } + }; + var drawText = function drawText() { + r.drawElementText(context, node, null, drawLabel); + }; + var ghost = node.pstyle('ghost').value === 'yes'; + if (ghost) { + var gx = node.pstyle('ghost-offset-x').pfValue; + var gy = node.pstyle('ghost-offset-y').pfValue; + var ghostOpacity = node.pstyle('ghost-opacity').value; + var effGhostOpacity = ghostOpacity * eleOpacity; + context.translate(gx, gy); + setupShapeColor(ghostOpacity * bgOpacity); + drawShape(); + drawImages(effGhostOpacity, true); + setupBorderColor(ghostOpacity * borderOpacity); + drawBorder(); + drawPie(darkness !== 0 || borderWidth !== 0); + drawImages(effGhostOpacity, false); + darken(effGhostOpacity); + context.translate(-gx, -gy); } -}; - -/** - * This method calculates the intersection of the two lines defined by - * point pairs (s1,s2) and (f1,f2). - */ -IGeometry.getIntersection = function (s1, s2, f1, f2) { - if (f2 == null) { - return this.getIntersection2(s1, s2, f1); + if (usePaths) { + context.translate(-pos.x, -pos.y); } - - var x1 = s1.x; - var y1 = s1.y; - var x2 = s2.x; - var y2 = s2.y; - var x3 = f1.x; - var y3 = f1.y; - var x4 = f2.x; - var y4 = f2.y; - var x = void 0, - y = void 0; // intersection point - var a1 = void 0, - a2 = void 0, - b1 = void 0, - b2 = void 0, - c1 = void 0, - c2 = void 0; // coefficients of line eqns. - var denom = void 0; - - a1 = y2 - y1; - b1 = x1 - x2; - c1 = x2 * y1 - x1 * y2; // { a1*x + b1*y + c1 = 0 is line 1 } - - a2 = y4 - y3; - b2 = x3 - x4; - c2 = x4 * y3 - x3 * y4; // { a2*x + b2*y + c2 = 0 is line 2 } - - denom = a1 * b2 - a2 * b1; - - if (denom === 0) { - return null; + drawUnderlay(); + if (usePaths) { + context.translate(pos.x, pos.y); } - - x = (b1 * c2 - b2 * c1) / denom; - y = (a2 * c1 - a1 * c2) / denom; - - return new Point(x, y); -}; - -/** - * This method finds and returns the angle of the vector from the + x-axis - * in clockwise direction (compatible w/ Java coordinate system!). - */ -IGeometry.angleOfVector = function (Cx, Cy, Nx, Ny) { - var C_angle = void 0; - - if (Cx !== Nx) { - C_angle = Math.atan((Ny - Cy) / (Nx - Cx)); - - if (Nx < Cx) { - C_angle += Math.PI; - } else if (Ny < Cy) { - C_angle += this.TWO_PI; - } - } else if (Ny < Cy) { - C_angle = this.ONE_AND_HALF_PI; // 270 degrees - } else { - C_angle = this.HALF_PI; // 90 degrees + setupShapeColor(); + drawShape(); + drawImages(eleOpacity, true); + setupBorderColor(); + drawBorder(); + drawPie(darkness !== 0 || borderWidth !== 0); + drawImages(eleOpacity, false); + darken(); + if (usePaths) { + context.translate(-pos.x, -pos.y); } + drawText(); + drawOverlay(); - return C_angle; -}; - -/** - * This method checks whether the given two line segments (one with point - * p1 and p2, the other with point p3 and p4) intersect at a point other - * than these points. - */ -IGeometry.doIntersect = function (p1, p2, p3, p4) { - var a = p1.x; - var b = p1.y; - var c = p2.x; - var d = p2.y; - var p = p3.x; - var q = p3.y; - var r = p4.x; - var s = p4.y; - var det = (c - a) * (s - q) - (r - p) * (d - b); + // + // clean up shift - if (det === 0) { - return false; - } else { - var lambda = ((s - q) * (r - a) + (p - r) * (s - b)) / det; - var gamma = ((b - d) * (r - a) + (c - a) * (s - b)) / det; - return 0 < lambda && lambda < 1 && 0 < gamma && gamma < 1; + if (shiftToOriginWithBb) { + context.translate(bb.x1, bb.y1); } }; - -/** - * This method checks and calculates the intersection of - * a line segment and a circle. - */ -IGeometry.findCircleLineIntersections = function (Ex, Ey, Lx, Ly, Cx, Cy, r) { - - // E is the starting point of the ray, - // L is the end point of the ray, - // C is the center of sphere you're testing against - // r is the radius of that sphere - - // Compute: - // d = L - E ( Direction vector of ray, from start to end ) - // f = E - C ( Vector from center sphere to ray start ) - - // Then the intersection is found by.. - // P = E + t * d - // This is a parametric equation: - // Px = Ex + tdx - // Py = Ey + tdy - - // get a, b, c values - var a = (Lx - Ex) * (Lx - Ex) + (Ly - Ey) * (Ly - Ey); - var b = 2 * ((Ex - Cx) * (Lx - Ex) + (Ey - Cy) * (Ly - Ey)); - var c = (Ex - Cx) * (Ex - Cx) + (Ey - Cy) * (Ey - Cy) - r * r; - - // get discriminant - var disc = b * b - 4 * a * c; - if (disc >= 0) { - // insert into quadratic formula - var t1 = (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a); - var t2 = (-b - Math.sqrt(b * b - 4 * a * c)) / (2 * a); - var intersections = null; - if (t1 >= 0 && t1 <= 1) { - // t1 is the intersection, and it's closer than t2 - // (since t1 uses -b - discriminant) - // Impale, Poke - return [t1]; +var drawNodeOverlayUnderlay = function drawNodeOverlayUnderlay(overlayOrUnderlay) { + if (!['overlay', 'underlay'].includes(overlayOrUnderlay)) { + throw new Error('Invalid state'); + } + return function (context, node, pos, nodeWidth, nodeHeight) { + var r = this; + if (!node.visible()) { + return; } - - // here t1 didn't intersect so we are either started - // inside the sphere or completely past it - if (t2 >= 0 && t2 <= 1) { - // ExitWound - return [t2]; + var padding = node.pstyle("".concat(overlayOrUnderlay, "-padding")).pfValue; + var opacity = node.pstyle("".concat(overlayOrUnderlay, "-opacity")).value; + var color = node.pstyle("".concat(overlayOrUnderlay, "-color")).value; + var shape = node.pstyle("".concat(overlayOrUnderlay, "-shape")).value; + if (opacity > 0) { + pos = pos || node.position(); + if (nodeWidth == null || nodeHeight == null) { + var _padding = node.padding(); + nodeWidth = node.width() + 2 * _padding; + nodeHeight = node.height() + 2 * _padding; + } + r.colorFillStyle(context, color[0], color[1], color[2], opacity); + r.nodeShapes[shape].draw(context, pos.x, pos.y, nodeWidth + padding * 2, nodeHeight + padding * 2); + context.fill(); } - - return intersections; - } else return null; + }; }; +CRp$5.drawNodeOverlay = drawNodeOverlayUnderlay('overlay'); +CRp$5.drawNodeUnderlay = drawNodeOverlayUnderlay('underlay'); -// ----------------------------------------------------------------------------- -// Section: Class Constants -// ----------------------------------------------------------------------------- -/** - * Some useful pre-calculated constants - */ -IGeometry.HALF_PI = 0.5 * Math.PI; -IGeometry.ONE_AND_HALF_PI = 1.5 * Math.PI; -IGeometry.TWO_PI = 2.0 * Math.PI; -IGeometry.THREE_PI = 3.0 * Math.PI; - -module.exports = IGeometry; - -/***/ }), -/* 9 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -function IMath() {} +// does the node have at least one pie piece? +CRp$5.hasPie = function (node) { + node = node[0]; // ensure ele ref -/** - * This method returns the sign of the input value. - */ -IMath.sign = function (value) { - if (value > 0) { - return 1; - } else if (value < 0) { - return -1; - } else { - return 0; - } + return node._private.hasPie; }; +CRp$5.drawPie = function (context, node, nodeOpacity, pos) { + node = node[0]; // ensure ele ref + pos = pos || node.position(); + var cyStyle = node.cy().style(); + var pieSize = node.pstyle('pie-size'); + var x = pos.x; + var y = pos.y; + var nodeW = node.width(); + var nodeH = node.height(); + var radius = Math.min(nodeW, nodeH) / 2; // must fit in node + var lastPercent = 0; // what % to continue drawing pie slices from on [0, 1] + var usePaths = this.usePaths(); + if (usePaths) { + x = 0; + y = 0; + } + if (pieSize.units === '%') { + radius = radius * pieSize.pfValue; + } else if (pieSize.pfValue !== undefined) { + radius = pieSize.pfValue / 2; + } + for (var i = 1; i <= cyStyle.pieBackgroundN; i++) { + // 1..N + var size = node.pstyle('pie-' + i + '-background-size').value; + var color = node.pstyle('pie-' + i + '-background-color').value; + var opacity = node.pstyle('pie-' + i + '-background-opacity').value * nodeOpacity; + var percent = size / 100; // map integer range [0, 100] to [0, 1] -IMath.floor = function (value) { - return value < 0 ? Math.ceil(value) : Math.floor(value); -}; + // percent can't push beyond 1 + if (percent + lastPercent > 1) { + percent = 1 - lastPercent; + } + var angleStart = 1.5 * Math.PI + 2 * Math.PI * lastPercent; // start at 12 o'clock and go clockwise + var angleDelta = 2 * Math.PI * percent; + var angleEnd = angleStart + angleDelta; -IMath.ceil = function (value) { - return value < 0 ? Math.floor(value) : Math.ceil(value); + // ignore if + // - zero size + // - we're already beyond the full circle + // - adding the current slice would go beyond the full circle + if (size === 0 || lastPercent >= 1 || lastPercent + percent > 1) { + continue; + } + context.beginPath(); + context.moveTo(x, y); + context.arc(x, y, radius, angleStart, angleEnd); + context.closePath(); + this.colorFillStyle(context, color[0], color[1], color[2], opacity); + context.fill(); + lastPercent += percent; + } }; -module.exports = IMath; - -/***/ }), -/* 10 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -function Integer() {} - -Integer.MAX_VALUE = 2147483647; -Integer.MIN_VALUE = -2147483648; - -module.exports = Integer; - -/***/ }), -/* 11 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); +var CRp$4 = {}; +var motionBlurDelay = 100; -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +// var isFirefox = typeof InstallTrigger !== 'undefined'; -var nodeFrom = function nodeFrom(value) { - return { value: value, next: null, prev: null }; +CRp$4.getPixelRatio = function () { + var context = this.data.contexts[0]; + if (this.forcedPixelRatio != null) { + return this.forcedPixelRatio; + } + var backingStore = context.backingStorePixelRatio || context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || context.backingStorePixelRatio || 1; + return (window.devicePixelRatio || 1) / backingStore; // eslint-disable-line no-undef }; -var add = function add(prev, node, next, list) { - if (prev !== null) { - prev.next = node; - } else { - list.head = node; +CRp$4.paintCache = function (context) { + var caches = this.paintCaches = this.paintCaches || []; + var needToCreateCache = true; + var cache; + for (var i = 0; i < caches.length; i++) { + cache = caches[i]; + if (cache.context === context) { + needToCreateCache = false; + break; + } } - - if (next !== null) { - next.prev = node; + if (needToCreateCache) { + cache = { + context: context + }; + caches.push(cache); + } + return cache; +}; +CRp$4.createGradientStyleFor = function (context, shapeStyleName, ele, fill, opacity) { + var gradientStyle; + var usePaths = this.usePaths(); + var colors = ele.pstyle(shapeStyleName + '-gradient-stop-colors').value, + positions = ele.pstyle(shapeStyleName + '-gradient-stop-positions').pfValue; + if (fill === 'radial-gradient') { + if (ele.isEdge()) { + var start = ele.sourceEndpoint(), + end = ele.targetEndpoint(), + mid = ele.midpoint(); + var d1 = dist(start, mid); + var d2 = dist(end, mid); + gradientStyle = context.createRadialGradient(mid.x, mid.y, 0, mid.x, mid.y, Math.max(d1, d2)); + } else { + var pos = usePaths ? { + x: 0, + y: 0 + } : ele.position(), + width = ele.paddedWidth(), + height = ele.paddedHeight(); + gradientStyle = context.createRadialGradient(pos.x, pos.y, 0, pos.x, pos.y, Math.max(width, height)); + } } else { - list.tail = node; + if (ele.isEdge()) { + var _start = ele.sourceEndpoint(), + _end = ele.targetEndpoint(); + gradientStyle = context.createLinearGradient(_start.x, _start.y, _end.x, _end.y); + } else { + var _pos = usePaths ? { + x: 0, + y: 0 + } : ele.position(), + _width = ele.paddedWidth(), + _height = ele.paddedHeight(), + halfWidth = _width / 2, + halfHeight = _height / 2; + var direction = ele.pstyle('background-gradient-direction').value; + switch (direction) { + case 'to-bottom': + gradientStyle = context.createLinearGradient(_pos.x, _pos.y - halfHeight, _pos.x, _pos.y + halfHeight); + break; + case 'to-top': + gradientStyle = context.createLinearGradient(_pos.x, _pos.y + halfHeight, _pos.x, _pos.y - halfHeight); + break; + case 'to-left': + gradientStyle = context.createLinearGradient(_pos.x + halfWidth, _pos.y, _pos.x - halfWidth, _pos.y); + break; + case 'to-right': + gradientStyle = context.createLinearGradient(_pos.x - halfWidth, _pos.y, _pos.x + halfWidth, _pos.y); + break; + case 'to-bottom-right': + case 'to-right-bottom': + gradientStyle = context.createLinearGradient(_pos.x - halfWidth, _pos.y - halfHeight, _pos.x + halfWidth, _pos.y + halfHeight); + break; + case 'to-top-right': + case 'to-right-top': + gradientStyle = context.createLinearGradient(_pos.x - halfWidth, _pos.y + halfHeight, _pos.x + halfWidth, _pos.y - halfHeight); + break; + case 'to-bottom-left': + case 'to-left-bottom': + gradientStyle = context.createLinearGradient(_pos.x + halfWidth, _pos.y - halfHeight, _pos.x - halfWidth, _pos.y + halfHeight); + break; + case 'to-top-left': + case 'to-left-top': + gradientStyle = context.createLinearGradient(_pos.x + halfWidth, _pos.y + halfHeight, _pos.x - halfWidth, _pos.y - halfHeight); + break; + } + } } + if (!gradientStyle) return null; // invalid gradient style - node.prev = prev; - node.next = next; - - list.length++; - - return node; + var hasPositions = positions.length === colors.length; + var length = colors.length; + for (var i = 0; i < length; i++) { + gradientStyle.addColorStop(hasPositions ? positions[i] : i / (length - 1), 'rgba(' + colors[i][0] + ',' + colors[i][1] + ',' + colors[i][2] + ',' + opacity + ')'); + } + return gradientStyle; +}; +CRp$4.gradientFillStyle = function (context, ele, fill, opacity) { + var gradientStyle = this.createGradientStyleFor(context, 'background', ele, fill, opacity); + if (!gradientStyle) return null; // error + context.fillStyle = gradientStyle; }; +CRp$4.colorFillStyle = function (context, r, g, b, a) { + context.fillStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; + // turn off for now, seems context does its own caching -var _remove = function _remove(node, list) { - var prev = node.prev, - next = node.next; + // var cache = this.paintCache(context); + // var fillStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; - if (prev !== null) { - prev.next = next; - } else { - list.head = next; - } + // if( cache.fillStyle !== fillStyle ){ + // context.fillStyle = cache.fillStyle = fillStyle; + // } +}; - if (next !== null) { - next.prev = prev; +CRp$4.eleFillStyle = function (context, ele, opacity) { + var backgroundFill = ele.pstyle('background-fill').value; + if (backgroundFill === 'linear-gradient' || backgroundFill === 'radial-gradient') { + this.gradientFillStyle(context, ele, backgroundFill, opacity); } else { - list.tail = prev; + var backgroundColor = ele.pstyle('background-color').value; + this.colorFillStyle(context, backgroundColor[0], backgroundColor[1], backgroundColor[2], opacity); } +}; +CRp$4.gradientStrokeStyle = function (context, ele, fill, opacity) { + var gradientStyle = this.createGradientStyleFor(context, 'line', ele, fill, opacity); + if (!gradientStyle) return null; // error + context.strokeStyle = gradientStyle; +}; +CRp$4.colorStrokeStyle = function (context, r, g, b, a) { + context.strokeStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; + // turn off for now, seems context does its own caching - node.prev = node.next = null; + // var cache = this.paintCache(context); - list.length--; + // var strokeStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; - return node; + // if( cache.strokeStyle !== strokeStyle ){ + // context.strokeStyle = cache.strokeStyle = strokeStyle; + // } }; -var LinkedList = function () { - function LinkedList(vals) { - var _this = this; +CRp$4.eleStrokeStyle = function (context, ele, opacity) { + var lineFill = ele.pstyle('line-fill').value; + if (lineFill === 'linear-gradient' || lineFill === 'radial-gradient') { + this.gradientStrokeStyle(context, ele, lineFill, opacity); + } else { + var lineColor = ele.pstyle('line-color').value; + this.colorStrokeStyle(context, lineColor[0], lineColor[1], lineColor[2], opacity); + } +}; - _classCallCheck(this, LinkedList); +// Resize canvas +CRp$4.matchCanvasSize = function (container) { + var r = this; + var data = r.data; + var bb = r.findContainerClientCoords(); + var width = bb[2]; + var height = bb[3]; + var pixelRatio = r.getPixelRatio(); + var mbPxRatio = r.motionBlurPxRatio; + if (container === r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_NODE] || container === r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_DRAG]) { + pixelRatio = mbPxRatio; + } + var canvasWidth = width * pixelRatio; + var canvasHeight = height * pixelRatio; + var canvas; + if (canvasWidth === r.canvasWidth && canvasHeight === r.canvasHeight) { + return; // save cycles if same + } - this.length = 0; - this.head = null; - this.tail = null; + r.fontCaches = null; // resizing resets the style - if (vals != null) { - vals.forEach(function (v) { - return _this.push(v); - }); + var canvasContainer = data.canvasContainer; + canvasContainer.style.width = width + 'px'; + canvasContainer.style.height = height + 'px'; + for (var i = 0; i < r.CANVAS_LAYERS; i++) { + canvas = data.canvases[i]; + canvas.width = canvasWidth; + canvas.height = canvasHeight; + canvas.style.width = width + 'px'; + canvas.style.height = height + 'px'; + } + for (var i = 0; i < r.BUFFER_COUNT; i++) { + canvas = data.bufferCanvases[i]; + canvas.width = canvasWidth; + canvas.height = canvasHeight; + canvas.style.width = width + 'px'; + canvas.style.height = height + 'px'; + } + r.textureMult = 1; + if (pixelRatio <= 1) { + canvas = data.bufferCanvases[r.TEXTURE_BUFFER]; + r.textureMult = 2; + canvas.width = canvasWidth * r.textureMult; + canvas.height = canvasHeight * r.textureMult; + } + r.canvasWidth = canvasWidth; + r.canvasHeight = canvasHeight; +}; +CRp$4.renderTo = function (cxt, zoom, pan, pxRatio) { + this.render({ + forcedContext: cxt, + forcedZoom: zoom, + forcedPan: pan, + drawAllLayers: true, + forcedPxRatio: pxRatio + }); +}; +CRp$4.render = function (options) { + options = options || staticEmptyObject(); + var forcedContext = options.forcedContext; + var drawAllLayers = options.drawAllLayers; + var drawOnlyNodeLayer = options.drawOnlyNodeLayer; + var forcedZoom = options.forcedZoom; + var forcedPan = options.forcedPan; + var r = this; + var pixelRatio = options.forcedPxRatio === undefined ? this.getPixelRatio() : options.forcedPxRatio; + var cy = r.cy; + var data = r.data; + var needDraw = data.canvasNeedsRedraw; + var textureDraw = r.textureOnViewport && !forcedContext && (r.pinching || r.hoverData.dragging || r.swipePanning || r.data.wheelZooming); + var motionBlur = options.motionBlur !== undefined ? options.motionBlur : r.motionBlur; + var mbPxRatio = r.motionBlurPxRatio; + var hasCompoundNodes = cy.hasCompoundNodes(); + var inNodeDragGesture = r.hoverData.draggingEles; + var inBoxSelection = r.hoverData.selecting || r.touchData.selecting ? true : false; + motionBlur = motionBlur && !forcedContext && r.motionBlurEnabled && !inBoxSelection; + var motionBlurFadeEffect = motionBlur; + if (!forcedContext) { + if (r.prevPxRatio !== pixelRatio) { + r.invalidateContainerClientCoordsCache(); + r.matchCanvasSize(r.container); + r.redrawHint('eles', true); + r.redrawHint('drag', true); } + r.prevPxRatio = pixelRatio; } - - _createClass(LinkedList, [{ - key: "size", - value: function size() { - return this.length; + if (!forcedContext && r.motionBlurTimeout) { + clearTimeout(r.motionBlurTimeout); + } + if (motionBlur) { + if (r.mbFrames == null) { + r.mbFrames = 0; } - }, { - key: "insertBefore", - value: function insertBefore(val, otherNode) { - return add(otherNode.prev, nodeFrom(val), otherNode, this); + r.mbFrames++; + if (r.mbFrames < 3) { + // need several frames before even high quality motionblur + motionBlurFadeEffect = false; } - }, { - key: "insertAfter", - value: function insertAfter(val, otherNode) { - return add(otherNode, nodeFrom(val), otherNode.next, this); + + // go to lower quality blurry frames when several m/b frames have been rendered (avoids flashing) + if (r.mbFrames > r.minMbLowQualFrames) { + //r.fullQualityMb = false; + r.motionBlurPxRatio = r.mbPxRBlurry; } - }, { - key: "insertNodeBefore", - value: function insertNodeBefore(newNode, otherNode) { - return add(otherNode.prev, newNode, otherNode, this); + } + if (r.clearingMotionBlur) { + r.motionBlurPxRatio = 1; + } + + // b/c drawToContext() may be async w.r.t. redraw(), keep track of last texture frame + // because a rogue async texture frame would clear needDraw + if (r.textureDrawLastFrame && !textureDraw) { + needDraw[r.NODE] = true; + needDraw[r.SELECT_BOX] = true; + } + var style = cy.style(); + var zoom = cy.zoom(); + var effectiveZoom = forcedZoom !== undefined ? forcedZoom : zoom; + var pan = cy.pan(); + var effectivePan = { + x: pan.x, + y: pan.y + }; + var vp = { + zoom: zoom, + pan: { + x: pan.x, + y: pan.y } - }, { - key: "insertNodeAfter", - value: function insertNodeAfter(newNode, otherNode) { - return add(otherNode, newNode, otherNode.next, this); + }; + var prevVp = r.prevViewport; + var viewportIsDiff = prevVp === undefined || vp.zoom !== prevVp.zoom || vp.pan.x !== prevVp.pan.x || vp.pan.y !== prevVp.pan.y; + + // we want the low quality motionblur only when the viewport is being manipulated etc (where it's not noticed) + if (!viewportIsDiff && !(inNodeDragGesture && !hasCompoundNodes)) { + r.motionBlurPxRatio = 1; + } + if (forcedPan) { + effectivePan = forcedPan; + } + + // apply pixel ratio + + effectiveZoom *= pixelRatio; + effectivePan.x *= pixelRatio; + effectivePan.y *= pixelRatio; + var eles = r.getCachedZSortedEles(); + function mbclear(context, x, y, w, h) { + var gco = context.globalCompositeOperation; + context.globalCompositeOperation = 'destination-out'; + r.colorFillStyle(context, 255, 255, 255, r.motionBlurTransparency); + context.fillRect(x, y, w, h); + context.globalCompositeOperation = gco; + } + function setContextTransform(context, clear) { + var ePan, eZoom, w, h; + if (!r.clearingMotionBlur && (context === data.bufferContexts[r.MOTIONBLUR_BUFFER_NODE] || context === data.bufferContexts[r.MOTIONBLUR_BUFFER_DRAG])) { + ePan = { + x: pan.x * mbPxRatio, + y: pan.y * mbPxRatio + }; + eZoom = zoom * mbPxRatio; + w = r.canvasWidth * mbPxRatio; + h = r.canvasHeight * mbPxRatio; + } else { + ePan = effectivePan; + eZoom = effectiveZoom; + w = r.canvasWidth; + h = r.canvasHeight; } - }, { - key: "push", - value: function push(val) { - return add(this.tail, nodeFrom(val), null, this); + context.setTransform(1, 0, 0, 1, 0, 0); + if (clear === 'motionBlur') { + mbclear(context, 0, 0, w, h); + } else if (!forcedContext && (clear === undefined || clear)) { + context.clearRect(0, 0, w, h); } - }, { - key: "unshift", - value: function unshift(val) { - return add(null, nodeFrom(val), this.head, this); + if (!drawAllLayers) { + context.translate(ePan.x, ePan.y); + context.scale(eZoom, eZoom); } - }, { - key: "remove", - value: function remove(node) { - return _remove(node, this); + if (forcedPan) { + context.translate(forcedPan.x, forcedPan.y); } - }, { - key: "pop", - value: function pop() { - return _remove(this.tail, this).value; + if (forcedZoom) { + context.scale(forcedZoom, forcedZoom); } - }, { - key: "popNode", - value: function popNode() { - return _remove(this.tail, this); + } + if (!textureDraw) { + r.textureDrawLastFrame = false; + } + if (textureDraw) { + r.textureDrawLastFrame = true; + if (!r.textureCache) { + r.textureCache = {}; + r.textureCache.bb = cy.mutableElements().boundingBox(); + r.textureCache.texture = r.data.bufferCanvases[r.TEXTURE_BUFFER]; + var cxt = r.data.bufferContexts[r.TEXTURE_BUFFER]; + cxt.setTransform(1, 0, 0, 1, 0, 0); + cxt.clearRect(0, 0, r.canvasWidth * r.textureMult, r.canvasHeight * r.textureMult); + r.render({ + forcedContext: cxt, + drawOnlyNodeLayer: true, + forcedPxRatio: pixelRatio * r.textureMult + }); + var vp = r.textureCache.viewport = { + zoom: cy.zoom(), + pan: cy.pan(), + width: r.canvasWidth, + height: r.canvasHeight + }; + vp.mpan = { + x: (0 - vp.pan.x) / vp.zoom, + y: (0 - vp.pan.y) / vp.zoom + }; } - }, { - key: "shift", - value: function shift() { - return _remove(this.head, this).value; + needDraw[r.DRAG] = false; + needDraw[r.NODE] = false; + var context = data.contexts[r.NODE]; + var texture = r.textureCache.texture; + var vp = r.textureCache.viewport; + context.setTransform(1, 0, 0, 1, 0, 0); + if (motionBlur) { + mbclear(context, 0, 0, vp.width, vp.height); + } else { + context.clearRect(0, 0, vp.width, vp.height); } - }, { - key: "shiftNode", - value: function shiftNode() { - return _remove(this.head, this); + var outsideBgColor = style.core('outside-texture-bg-color').value; + var outsideBgOpacity = style.core('outside-texture-bg-opacity').value; + r.colorFillStyle(context, outsideBgColor[0], outsideBgColor[1], outsideBgColor[2], outsideBgOpacity); + context.fillRect(0, 0, vp.width, vp.height); + var zoom = cy.zoom(); + setContextTransform(context, false); + context.clearRect(vp.mpan.x, vp.mpan.y, vp.width / vp.zoom / pixelRatio, vp.height / vp.zoom / pixelRatio); + context.drawImage(texture, vp.mpan.x, vp.mpan.y, vp.width / vp.zoom / pixelRatio, vp.height / vp.zoom / pixelRatio); + } else if (r.textureOnViewport && !forcedContext) { + // clear the cache since we don't need it + r.textureCache = null; + } + var extent = cy.extent(); + var vpManip = r.pinching || r.hoverData.dragging || r.swipePanning || r.data.wheelZooming || r.hoverData.draggingEles || r.cy.animated(); + var hideEdges = r.hideEdgesOnViewport && vpManip; + var needMbClear = []; + needMbClear[r.NODE] = !needDraw[r.NODE] && motionBlur && !r.clearedForMotionBlur[r.NODE] || r.clearingMotionBlur; + if (needMbClear[r.NODE]) { + r.clearedForMotionBlur[r.NODE] = true; + } + needMbClear[r.DRAG] = !needDraw[r.DRAG] && motionBlur && !r.clearedForMotionBlur[r.DRAG] || r.clearingMotionBlur; + if (needMbClear[r.DRAG]) { + r.clearedForMotionBlur[r.DRAG] = true; + } + if (needDraw[r.NODE] || drawAllLayers || drawOnlyNodeLayer || needMbClear[r.NODE]) { + var useBuffer = motionBlur && !needMbClear[r.NODE] && mbPxRatio !== 1; + var context = forcedContext || (useBuffer ? r.data.bufferContexts[r.MOTIONBLUR_BUFFER_NODE] : data.contexts[r.NODE]); + var clear = motionBlur && !useBuffer ? 'motionBlur' : undefined; + setContextTransform(context, clear); + if (hideEdges) { + r.drawCachedNodes(context, eles.nondrag, pixelRatio, extent); + } else { + r.drawLayeredElements(context, eles.nondrag, pixelRatio, extent); } - }, { - key: "get_object_at", - value: function get_object_at(index) { - if (index <= this.length()) { - var i = 1; - var current = this.head; - while (i < index) { - current = current.next; - i++; - } - return current.value; - } + if (r.debug) { + r.drawDebugPoints(context, eles.nondrag); } - }, { - key: "set_object_at", - value: function set_object_at(index, value) { - if (index <= this.length()) { - var i = 1; - var current = this.head; - while (i < index) { - current = current.next; - i++; - } - current.value = value; - } + if (!drawAllLayers && !motionBlur) { + needDraw[r.NODE] = false; } - }]); - - return LinkedList; -}(); - -module.exports = LinkedList; - -/***/ }), -/* 12 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -/* - *This class is the javascript implementation of the Point.java class in jdk - */ -function Point(x, y, p) { - this.x = null; - this.y = null; - if (x == null && y == null && p == null) { - this.x = 0; - this.y = 0; - } else if (typeof x == 'number' && typeof y == 'number' && p == null) { - this.x = x; - this.y = y; - } else if (x.constructor.name == 'Point' && y == null && p == null) { - p = x; - this.x = p.x; - this.y = p.y; } -} - -Point.prototype.getX = function () { - return this.x; -}; - -Point.prototype.getY = function () { - return this.y; -}; - -Point.prototype.getLocation = function () { - return new Point(this.x, this.y); -}; - -Point.prototype.setLocation = function (x, y, p) { - if (x.constructor.name == 'Point' && y == null && p == null) { - p = x; - this.setLocation(p.x, p.y); - } else if (typeof x == 'number' && typeof y == 'number' && p == null) { - //if both parameters are integer just move (x,y) location - if (parseInt(x) == x && parseInt(y) == y) { - this.move(x, y); + if (!drawOnlyNodeLayer && (needDraw[r.DRAG] || drawAllLayers || needMbClear[r.DRAG])) { + var useBuffer = motionBlur && !needMbClear[r.DRAG] && mbPxRatio !== 1; + var context = forcedContext || (useBuffer ? r.data.bufferContexts[r.MOTIONBLUR_BUFFER_DRAG] : data.contexts[r.DRAG]); + setContextTransform(context, motionBlur && !useBuffer ? 'motionBlur' : undefined); + if (hideEdges) { + r.drawCachedNodes(context, eles.drag, pixelRatio, extent); } else { - this.x = Math.floor(x + 0.5); - this.y = Math.floor(y + 0.5); + r.drawCachedElements(context, eles.drag, pixelRatio, extent); + } + if (r.debug) { + r.drawDebugPoints(context, eles.drag); + } + if (!drawAllLayers && !motionBlur) { + needDraw[r.DRAG] = false; } } -}; - -Point.prototype.move = function (x, y) { - this.x = x; - this.y = y; -}; - -Point.prototype.translate = function (dx, dy) { - this.x += dx; - this.y += dy; -}; - -Point.prototype.equals = function (obj) { - if (obj.constructor.name == "Point") { - var pt = obj; - return this.x == pt.x && this.y == pt.y; - } - return this == obj; -}; - -Point.prototype.toString = function () { - return new Point().constructor.name + "[x=" + this.x + ",y=" + this.y + "]"; -}; - -module.exports = Point; - -/***/ }), -/* 13 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -function RectangleD(x, y, width, height) { - this.x = 0; - this.y = 0; - this.width = 0; - this.height = 0; - - if (x != null && y != null && width != null && height != null) { - this.x = x; - this.y = y; - this.width = width; - this.height = height; + if (r.showFps || !drawOnlyNodeLayer && needDraw[r.SELECT_BOX] && !drawAllLayers) { + var context = forcedContext || data.contexts[r.SELECT_BOX]; + setContextTransform(context); + if (r.selection[4] == 1 && (r.hoverData.selecting || r.touchData.selecting)) { + var zoom = r.cy.zoom(); + var borderWidth = style.core('selection-box-border-width').value / zoom; + context.lineWidth = borderWidth; + context.fillStyle = 'rgba(' + style.core('selection-box-color').value[0] + ',' + style.core('selection-box-color').value[1] + ',' + style.core('selection-box-color').value[2] + ',' + style.core('selection-box-opacity').value + ')'; + context.fillRect(r.selection[0], r.selection[1], r.selection[2] - r.selection[0], r.selection[3] - r.selection[1]); + if (borderWidth > 0) { + context.strokeStyle = 'rgba(' + style.core('selection-box-border-color').value[0] + ',' + style.core('selection-box-border-color').value[1] + ',' + style.core('selection-box-border-color').value[2] + ',' + style.core('selection-box-opacity').value + ')'; + context.strokeRect(r.selection[0], r.selection[1], r.selection[2] - r.selection[0], r.selection[3] - r.selection[1]); + } + } + if (data.bgActivePosistion && !r.hoverData.selecting) { + var zoom = r.cy.zoom(); + var pos = data.bgActivePosistion; + context.fillStyle = 'rgba(' + style.core('active-bg-color').value[0] + ',' + style.core('active-bg-color').value[1] + ',' + style.core('active-bg-color').value[2] + ',' + style.core('active-bg-opacity').value + ')'; + context.beginPath(); + context.arc(pos.x, pos.y, style.core('active-bg-size').pfValue / zoom, 0, 2 * Math.PI); + context.fill(); + } + var timeToRender = r.lastRedrawTime; + if (r.showFps && timeToRender) { + timeToRender = Math.round(timeToRender); + var fps = Math.round(1000 / timeToRender); + context.setTransform(1, 0, 0, 1, 0, 0); + context.fillStyle = 'rgba(255, 0, 0, 0.75)'; + context.strokeStyle = 'rgba(255, 0, 0, 0.75)'; + context.lineWidth = 1; + context.fillText('1 frame = ' + timeToRender + ' ms = ' + fps + ' fps', 0, 20); + var maxFps = 60; + context.strokeRect(0, 30, 250, 20); + context.fillRect(0, 30, 250 * Math.min(fps / maxFps, 1), 20); + } + if (!drawAllLayers) { + needDraw[r.SELECT_BOX] = false; + } } -} - -RectangleD.prototype.getX = function () { - return this.x; -}; - -RectangleD.prototype.setX = function (x) { - this.x = x; -}; - -RectangleD.prototype.getY = function () { - return this.y; -}; - -RectangleD.prototype.setY = function (y) { - this.y = y; -}; - -RectangleD.prototype.getWidth = function () { - return this.width; -}; - -RectangleD.prototype.setWidth = function (width) { - this.width = width; -}; - -RectangleD.prototype.getHeight = function () { - return this.height; -}; - -RectangleD.prototype.setHeight = function (height) { - this.height = height; -}; - -RectangleD.prototype.getRight = function () { - return this.x + this.width; -}; -RectangleD.prototype.getBottom = function () { - return this.y + this.height; -}; + // motionblur: blit rendered blurry frames + if (motionBlur && mbPxRatio !== 1) { + var cxtNode = data.contexts[r.NODE]; + var txtNode = r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_NODE]; + var cxtDrag = data.contexts[r.DRAG]; + var txtDrag = r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_DRAG]; + var drawMotionBlur = function drawMotionBlur(cxt, txt, needClear) { + cxt.setTransform(1, 0, 0, 1, 0, 0); + if (needClear || !motionBlurFadeEffect) { + cxt.clearRect(0, 0, r.canvasWidth, r.canvasHeight); + } else { + mbclear(cxt, 0, 0, r.canvasWidth, r.canvasHeight); + } + var pxr = mbPxRatio; + cxt.drawImage(txt, + // img + 0, 0, + // sx, sy + r.canvasWidth * pxr, r.canvasHeight * pxr, + // sw, sh + 0, 0, + // x, y + r.canvasWidth, r.canvasHeight // w, h + ); + }; -RectangleD.prototype.intersects = function (a) { - if (this.getRight() < a.x) { - return false; + if (needDraw[r.NODE] || needMbClear[r.NODE]) { + drawMotionBlur(cxtNode, txtNode, needMbClear[r.NODE]); + needDraw[r.NODE] = false; + } + if (needDraw[r.DRAG] || needMbClear[r.DRAG]) { + drawMotionBlur(cxtDrag, txtDrag, needMbClear[r.DRAG]); + needDraw[r.DRAG] = false; + } } - - if (this.getBottom() < a.y) { - return false; + r.prevViewport = vp; + if (r.clearingMotionBlur) { + r.clearingMotionBlur = false; + r.motionBlurCleared = true; + r.motionBlur = true; } - - if (a.getRight() < this.x) { - return false; + if (motionBlur) { + r.motionBlurTimeout = setTimeout(function () { + r.motionBlurTimeout = null; + r.clearedForMotionBlur[r.NODE] = false; + r.clearedForMotionBlur[r.DRAG] = false; + r.motionBlur = false; + r.clearingMotionBlur = !textureDraw; + r.mbFrames = 0; + needDraw[r.NODE] = true; + needDraw[r.DRAG] = true; + r.redraw(); + }, motionBlurDelay); } - - if (a.getBottom() < this.y) { - return false; + if (!forcedContext) { + cy.emit('render'); } - - return true; }; -RectangleD.prototype.getCenterX = function () { - return this.x + this.width / 2; -}; +var CRp$3 = {}; -RectangleD.prototype.getMinX = function () { - return this.getX(); +// @O Polygon drawing +CRp$3.drawPolygonPath = function (context, x, y, width, height, points) { + var halfW = width / 2; + var halfH = height / 2; + if (context.beginPath) { + context.beginPath(); + } + context.moveTo(x + halfW * points[0], y + halfH * points[1]); + for (var i = 1; i < points.length / 2; i++) { + context.lineTo(x + halfW * points[i * 2], y + halfH * points[i * 2 + 1]); + } + context.closePath(); }; - -RectangleD.prototype.getMaxX = function () { - return this.getX() + this.width; +CRp$3.drawRoundPolygonPath = function (context, x, y, width, height, points) { + var halfW = width / 2; + var halfH = height / 2; + var cornerRadius = getRoundPolygonRadius(width, height); + if (context.beginPath) { + context.beginPath(); + } + for (var _i = 0; _i < points.length / 4; _i++) { + var sourceUv = void 0, + destUv = void 0; + if (_i === 0) { + sourceUv = points.length - 2; + } else { + sourceUv = _i * 4 - 2; + } + destUv = _i * 4 + 2; + var px = x + halfW * points[_i * 4]; + var py = y + halfH * points[_i * 4 + 1]; + var cosTheta = -points[sourceUv] * points[destUv] - points[sourceUv + 1] * points[destUv + 1]; + var offset = cornerRadius / Math.tan(Math.acos(cosTheta) / 2); + var cp0x = px - offset * points[sourceUv]; + var cp0y = py - offset * points[sourceUv + 1]; + var cp1x = px + offset * points[destUv]; + var cp1y = py + offset * points[destUv + 1]; + if (_i === 0) { + context.moveTo(cp0x, cp0y); + } else { + context.lineTo(cp0x, cp0y); + } + context.arcTo(px, py, cp1x, cp1y, cornerRadius); + } + context.closePath(); }; -RectangleD.prototype.getCenterY = function () { - return this.y + this.height / 2; -}; +// Round rectangle drawing +CRp$3.drawRoundRectanglePath = function (context, x, y, width, height) { + var halfWidth = width / 2; + var halfHeight = height / 2; + var cornerRadius = getRoundRectangleRadius(width, height); + if (context.beginPath) { + context.beginPath(); + } -RectangleD.prototype.getMinY = function () { - return this.getY(); + // Start at top middle + context.moveTo(x, y - halfHeight); + // Arc from middle top to right side + context.arcTo(x + halfWidth, y - halfHeight, x + halfWidth, y, cornerRadius); + // Arc from right side to bottom + context.arcTo(x + halfWidth, y + halfHeight, x, y + halfHeight, cornerRadius); + // Arc from bottom to left side + context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius); + // Arc from left side to topBorder + context.arcTo(x - halfWidth, y - halfHeight, x, y - halfHeight, cornerRadius); + // Join line + context.lineTo(x, y - halfHeight); + context.closePath(); }; +CRp$3.drawBottomRoundRectanglePath = function (context, x, y, width, height) { + var halfWidth = width / 2; + var halfHeight = height / 2; + var cornerRadius = getRoundRectangleRadius(width, height); + if (context.beginPath) { + context.beginPath(); + } -RectangleD.prototype.getMaxY = function () { - return this.getY() + this.height; + // Start at top middle + context.moveTo(x, y - halfHeight); + context.lineTo(x + halfWidth, y - halfHeight); + context.lineTo(x + halfWidth, y); + context.arcTo(x + halfWidth, y + halfHeight, x, y + halfHeight, cornerRadius); + context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius); + context.lineTo(x - halfWidth, y - halfHeight); + context.lineTo(x, y - halfHeight); + context.closePath(); }; - -RectangleD.prototype.getWidthHalf = function () { - return this.width / 2; +CRp$3.drawCutRectanglePath = function (context, x, y, width, height) { + var halfWidth = width / 2; + var halfHeight = height / 2; + var cornerLength = getCutRectangleCornerLength(); + if (context.beginPath) { + context.beginPath(); + } + context.moveTo(x - halfWidth + cornerLength, y - halfHeight); + context.lineTo(x + halfWidth - cornerLength, y - halfHeight); + context.lineTo(x + halfWidth, y - halfHeight + cornerLength); + context.lineTo(x + halfWidth, y + halfHeight - cornerLength); + context.lineTo(x + halfWidth - cornerLength, y + halfHeight); + context.lineTo(x - halfWidth + cornerLength, y + halfHeight); + context.lineTo(x - halfWidth, y + halfHeight - cornerLength); + context.lineTo(x - halfWidth, y - halfHeight + cornerLength); + context.closePath(); }; - -RectangleD.prototype.getHeightHalf = function () { - return this.height / 2; +CRp$3.drawBarrelPath = function (context, x, y, width, height) { + var halfWidth = width / 2; + var halfHeight = height / 2; + var xBegin = x - halfWidth; + var xEnd = x + halfWidth; + var yBegin = y - halfHeight; + var yEnd = y + halfHeight; + var barrelCurveConstants = getBarrelCurveConstants(width, height); + var wOffset = barrelCurveConstants.widthOffset; + var hOffset = barrelCurveConstants.heightOffset; + var ctrlPtXOffset = barrelCurveConstants.ctrlPtOffsetPct * wOffset; + if (context.beginPath) { + context.beginPath(); + } + context.moveTo(xBegin, yBegin + hOffset); + context.lineTo(xBegin, yEnd - hOffset); + context.quadraticCurveTo(xBegin + ctrlPtXOffset, yEnd, xBegin + wOffset, yEnd); + context.lineTo(xEnd - wOffset, yEnd); + context.quadraticCurveTo(xEnd - ctrlPtXOffset, yEnd, xEnd, yEnd - hOffset); + context.lineTo(xEnd, yBegin + hOffset); + context.quadraticCurveTo(xEnd - ctrlPtXOffset, yBegin, xEnd - wOffset, yBegin); + context.lineTo(xBegin + wOffset, yBegin); + context.quadraticCurveTo(xBegin + ctrlPtXOffset, yBegin, xBegin, yBegin + hOffset); + context.closePath(); }; - -module.exports = RectangleD; - -/***/ }), -/* 14 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -function UniqueIDGeneretor() {} - -UniqueIDGeneretor.lastID = 0; - -UniqueIDGeneretor.createID = function (obj) { - if (UniqueIDGeneretor.isPrimitive(obj)) { - return obj; +var sin0 = Math.sin(0); +var cos0 = Math.cos(0); +var sin = {}; +var cos = {}; +var ellipseStepSize = Math.PI / 40; +for (var i = 0 * Math.PI; i < 2 * Math.PI; i += ellipseStepSize) { + sin[i] = Math.sin(i); + cos[i] = Math.cos(i); +} +CRp$3.drawEllipsePath = function (context, centerX, centerY, width, height) { + if (context.beginPath) { + context.beginPath(); } - if (obj.uniqueID != null) { - return obj.uniqueID; + if (context.ellipse) { + context.ellipse(centerX, centerY, width / 2, height / 2, 0, 0, 2 * Math.PI); + } else { + var xPos, yPos; + var rw = width / 2; + var rh = height / 2; + for (var i = 0 * Math.PI; i < 2 * Math.PI; i += ellipseStepSize) { + xPos = centerX - rw * sin[i] * sin0 + rw * cos[i] * cos0; + yPos = centerY + rh * cos[i] * sin0 + rh * sin[i] * cos0; + if (i === 0) { + context.moveTo(xPos, yPos); + } else { + context.lineTo(xPos, yPos); + } + } } - obj.uniqueID = UniqueIDGeneretor.getString(); - UniqueIDGeneretor.lastID++; - return obj.uniqueID; -}; - -UniqueIDGeneretor.getString = function (id) { - if (id == null) id = UniqueIDGeneretor.lastID; - return "Object#" + id + ""; + context.closePath(); }; -UniqueIDGeneretor.isPrimitive = function (arg) { - var type = typeof arg === "undefined" ? "undefined" : _typeof(arg); - return arg == null || type != "object" && type != "function"; +/* global atob, ArrayBuffer, Uint8Array, Blob */ +var CRp$2 = {}; +CRp$2.createBuffer = function (w, h) { + var buffer = document.createElement('canvas'); // eslint-disable-line no-undef + buffer.width = w; + buffer.height = h; + return [buffer, buffer.getContext('2d')]; }; - -module.exports = UniqueIDGeneretor; - -/***/ }), -/* 15 */ -/***/ (function(module, exports, __nested_webpack_require_66321__) { - -"use strict"; - - -function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - -var LayoutConstants = __nested_webpack_require_66321__(0); -var LGraphManager = __nested_webpack_require_66321__(7); -var LNode = __nested_webpack_require_66321__(3); -var LEdge = __nested_webpack_require_66321__(1); -var LGraph = __nested_webpack_require_66321__(6); -var PointD = __nested_webpack_require_66321__(5); -var Transform = __nested_webpack_require_66321__(17); -var Emitter = __nested_webpack_require_66321__(29); - -function Layout(isRemoteUse) { - Emitter.call(this); - - //Layout Quality: 0:draft, 1:default, 2:proof - this.layoutQuality = LayoutConstants.QUALITY; - //Whether layout should create bendpoints as needed or not - this.createBendsAsNeeded = LayoutConstants.DEFAULT_CREATE_BENDS_AS_NEEDED; - //Whether layout should be incremental or not - this.incremental = LayoutConstants.DEFAULT_INCREMENTAL; - //Whether we animate from before to after layout node positions - this.animationOnLayout = LayoutConstants.DEFAULT_ANIMATION_ON_LAYOUT; - //Whether we animate the layout process or not - this.animationDuringLayout = LayoutConstants.DEFAULT_ANIMATION_DURING_LAYOUT; - //Number iterations that should be done between two successive animations - this.animationPeriod = LayoutConstants.DEFAULT_ANIMATION_PERIOD; - /** - * Whether or not leaf nodes (non-compound nodes) are of uniform sizes. When - * they are, both spring and repulsion forces between two leaf nodes can be - * calculated without the expensive clipping point calculations, resulting - * in major speed-up. - */ - this.uniformLeafNodeSizes = LayoutConstants.DEFAULT_UNIFORM_LEAF_NODE_SIZES; - /** - * This is used for creation of bendpoints by using dummy nodes and edges. - * Maps an LEdge to its dummy bendpoint path. - */ - this.edgeToDummyNodes = new Map(); - this.graphManager = new LGraphManager(this); - this.isLayoutFinished = false; - this.isSubLayout = false; - this.isRemoteUse = false; - - if (isRemoteUse != null) { - this.isRemoteUse = isRemoteUse; +CRp$2.bufferCanvasImage = function (options) { + var cy = this.cy; + var eles = cy.mutableElements(); + var bb = eles.boundingBox(); + var ctrRect = this.findContainerClientCoords(); + var width = options.full ? Math.ceil(bb.w) : ctrRect[2]; + var height = options.full ? Math.ceil(bb.h) : ctrRect[3]; + var specdMaxDims = number$1(options.maxWidth) || number$1(options.maxHeight); + var pxRatio = this.getPixelRatio(); + var scale = 1; + if (options.scale !== undefined) { + width *= options.scale; + height *= options.scale; + scale = options.scale; + } else if (specdMaxDims) { + var maxScaleW = Infinity; + var maxScaleH = Infinity; + if (number$1(options.maxWidth)) { + maxScaleW = scale * options.maxWidth / width; + } + if (number$1(options.maxHeight)) { + maxScaleH = scale * options.maxHeight / height; + } + scale = Math.min(maxScaleW, maxScaleH); + width *= scale; + height *= scale; } -} - -Layout.RANDOM_SEED = 1; - -Layout.prototype = Object.create(Emitter.prototype); - -Layout.prototype.getGraphManager = function () { - return this.graphManager; -}; - -Layout.prototype.getAllNodes = function () { - return this.graphManager.getAllNodes(); -}; - -Layout.prototype.getAllEdges = function () { - return this.graphManager.getAllEdges(); -}; - -Layout.prototype.getAllNodesToApplyGravitation = function () { - return this.graphManager.getAllNodesToApplyGravitation(); -}; + if (!specdMaxDims) { + width *= pxRatio; + height *= pxRatio; + scale *= pxRatio; + } + var buffCanvas = document.createElement('canvas'); // eslint-disable-line no-undef -Layout.prototype.newGraphManager = function () { - var gm = new LGraphManager(this); - this.graphManager = gm; - return gm; -}; + buffCanvas.width = width; + buffCanvas.height = height; + buffCanvas.style.width = width + 'px'; + buffCanvas.style.height = height + 'px'; + var buffCxt = buffCanvas.getContext('2d'); -Layout.prototype.newGraph = function (vGraph) { - return new LGraph(null, this.graphManager, vGraph); -}; + // Rasterize the layers, but only if container has nonzero size + if (width > 0 && height > 0) { + buffCxt.clearRect(0, 0, width, height); + buffCxt.globalCompositeOperation = 'source-over'; + var zsortedEles = this.getCachedZSortedEles(); + if (options.full) { + // draw the full bounds of the graph + buffCxt.translate(-bb.x1 * scale, -bb.y1 * scale); + buffCxt.scale(scale, scale); + this.drawElements(buffCxt, zsortedEles); + buffCxt.scale(1 / scale, 1 / scale); + buffCxt.translate(bb.x1 * scale, bb.y1 * scale); + } else { + // draw the current view + var pan = cy.pan(); + var translation = { + x: pan.x * scale, + y: pan.y * scale + }; + scale *= cy.zoom(); + buffCxt.translate(translation.x, translation.y); + buffCxt.scale(scale, scale); + this.drawElements(buffCxt, zsortedEles); + buffCxt.scale(1 / scale, 1 / scale); + buffCxt.translate(-translation.x, -translation.y); + } -Layout.prototype.newNode = function (vNode) { - return new LNode(this.graphManager, vNode); + // need to fill bg at end like this in order to fill cleared transparent pixels in jpgs + if (options.bg) { + buffCxt.globalCompositeOperation = 'destination-over'; + buffCxt.fillStyle = options.bg; + buffCxt.rect(0, 0, width, height); + buffCxt.fill(); + } + } + return buffCanvas; }; - -Layout.prototype.newEdge = function (vEdge) { - return new LEdge(null, null, vEdge); +function b64ToBlob(b64, mimeType) { + var bytes = atob(b64); + var buff = new ArrayBuffer(bytes.length); + var buffUint8 = new Uint8Array(buff); + for (var i = 0; i < bytes.length; i++) { + buffUint8[i] = bytes.charCodeAt(i); + } + return new Blob([buff], { + type: mimeType + }); +} +function b64UriToB64(b64uri) { + var i = b64uri.indexOf(','); + return b64uri.substr(i + 1); +} +function output(options, canvas, mimeType) { + var getB64Uri = function getB64Uri() { + return canvas.toDataURL(mimeType, options.quality); + }; + switch (options.output) { + case 'blob-promise': + return new Promise$1(function (resolve, reject) { + try { + canvas.toBlob(function (blob) { + if (blob != null) { + resolve(blob); + } else { + reject(new Error('`canvas.toBlob()` sent a null value in its callback')); + } + }, mimeType, options.quality); + } catch (err) { + reject(err); + } + }); + case 'blob': + return b64ToBlob(b64UriToB64(getB64Uri()), mimeType); + case 'base64': + return b64UriToB64(getB64Uri()); + case 'base64uri': + default: + return getB64Uri(); + } +} +CRp$2.png = function (options) { + return output(options, this.bufferCanvasImage(options), 'image/png'); }; - -Layout.prototype.checkLayoutSuccess = function () { - return this.graphManager.getRoot() == null || this.graphManager.getRoot().getNodes().length == 0 || this.graphManager.includesInvalidEdge(); +CRp$2.jpg = function (options) { + return output(options, this.bufferCanvasImage(options), 'image/jpeg'); }; -Layout.prototype.runLayout = function () { - this.isLayoutFinished = false; - - if (this.tilingPreLayout) { - this.tilingPreLayout(); - } - - this.initParameters(); - var isLayoutSuccessfull; - - if (this.checkLayoutSuccess()) { - isLayoutSuccessfull = false; - } else { - isLayoutSuccessfull = this.layout(); - } - - if (LayoutConstants.ANIMATE === 'during') { - // If this is a 'during' layout animation. Layout is not finished yet. - // We need to perform these in index.js when layout is really finished. - return false; - } - - if (isLayoutSuccessfull) { - if (!this.isSubLayout) { - this.doPostLayout(); - } - } - - if (this.tilingPostLayout) { - this.tilingPostLayout(); +var CRp$1 = {}; +CRp$1.nodeShapeImpl = function (name, context, centerX, centerY, width, height, points) { + switch (name) { + case 'ellipse': + return this.drawEllipsePath(context, centerX, centerY, width, height); + case 'polygon': + return this.drawPolygonPath(context, centerX, centerY, width, height, points); + case 'round-polygon': + return this.drawRoundPolygonPath(context, centerX, centerY, width, height, points); + case 'roundrectangle': + case 'round-rectangle': + return this.drawRoundRectanglePath(context, centerX, centerY, width, height); + case 'cutrectangle': + case 'cut-rectangle': + return this.drawCutRectanglePath(context, centerX, centerY, width, height); + case 'bottomroundrectangle': + case 'bottom-round-rectangle': + return this.drawBottomRoundRectanglePath(context, centerX, centerY, width, height); + case 'barrel': + return this.drawBarrelPath(context, centerX, centerY, width, height); } - - this.isLayoutFinished = true; - - return isLayoutSuccessfull; }; -/** - * This method performs the operations required after layout. - */ -Layout.prototype.doPostLayout = function () { - //assert !isSubLayout : "Should not be called on sub-layout!"; - // Propagate geometric changes to v-level objects - if (!this.incremental) { - this.transform(); +var CR = CanvasRenderer; +var CRp = CanvasRenderer.prototype; +CRp.CANVAS_LAYERS = 3; +// +CRp.SELECT_BOX = 0; +CRp.DRAG = 1; +CRp.NODE = 2; +CRp.BUFFER_COUNT = 3; +// +CRp.TEXTURE_BUFFER = 0; +CRp.MOTIONBLUR_BUFFER_NODE = 1; +CRp.MOTIONBLUR_BUFFER_DRAG = 2; +function CanvasRenderer(options) { + var r = this; + r.data = { + canvases: new Array(CRp.CANVAS_LAYERS), + contexts: new Array(CRp.CANVAS_LAYERS), + canvasNeedsRedraw: new Array(CRp.CANVAS_LAYERS), + bufferCanvases: new Array(CRp.BUFFER_COUNT), + bufferContexts: new Array(CRp.CANVAS_LAYERS) + }; + var tapHlOffAttr = '-webkit-tap-highlight-color'; + var tapHlOffStyle = 'rgba(0,0,0,0)'; + r.data.canvasContainer = document.createElement('div'); // eslint-disable-line no-undef + var containerStyle = r.data.canvasContainer.style; + r.data.canvasContainer.style[tapHlOffAttr] = tapHlOffStyle; + containerStyle.position = 'relative'; + containerStyle.zIndex = '0'; + containerStyle.overflow = 'hidden'; + var container = options.cy.container(); + container.appendChild(r.data.canvasContainer); + container.style[tapHlOffAttr] = tapHlOffStyle; + var styleMap = { + '-webkit-user-select': 'none', + '-moz-user-select': '-moz-none', + 'user-select': 'none', + '-webkit-tap-highlight-color': 'rgba(0,0,0,0)', + 'outline-style': 'none' + }; + if (ms()) { + styleMap['-ms-touch-action'] = 'none'; + styleMap['touch-action'] = 'none'; } - this.update(); -}; - -/** - * This method updates the geometry of the target graph according to - * calculated layout. - */ -Layout.prototype.update2 = function () { - // update bend points - if (this.createBendsAsNeeded) { - this.createBendpointsFromDummyNodes(); - - // reset all edges, since the topology has changed - this.graphManager.resetAllEdges(); + for (var i = 0; i < CRp.CANVAS_LAYERS; i++) { + var canvas = r.data.canvases[i] = document.createElement('canvas'); // eslint-disable-line no-undef + r.data.contexts[i] = canvas.getContext('2d'); + Object.keys(styleMap).forEach(function (k) { + canvas.style[k] = styleMap[k]; + }); + canvas.style.position = 'absolute'; + canvas.setAttribute('data-id', 'layer' + i); + canvas.style.zIndex = String(CRp.CANVAS_LAYERS - i); + r.data.canvasContainer.appendChild(canvas); + r.data.canvasNeedsRedraw[i] = false; } - - // perform edge, node and root updates if layout is not called - // remotely - if (!this.isRemoteUse) { - // update all edges - var edge; - var allEdges = this.graphManager.getAllEdges(); - for (var i = 0; i < allEdges.length; i++) { - edge = allEdges[i]; - // this.update(edge); - } - - // recursively update nodes - var node; - var nodes = this.graphManager.getRoot().getNodes(); - for (var i = 0; i < nodes.length; i++) { - node = nodes[i]; - // this.update(node); - } - - // update root graph - this.update(this.graphManager.getRoot()); + r.data.topCanvas = r.data.canvases[0]; + r.data.canvases[CRp.NODE].setAttribute('data-id', 'layer' + CRp.NODE + '-node'); + r.data.canvases[CRp.SELECT_BOX].setAttribute('data-id', 'layer' + CRp.SELECT_BOX + '-selectbox'); + r.data.canvases[CRp.DRAG].setAttribute('data-id', 'layer' + CRp.DRAG + '-drag'); + for (var i = 0; i < CRp.BUFFER_COUNT; i++) { + r.data.bufferCanvases[i] = document.createElement('canvas'); // eslint-disable-line no-undef + r.data.bufferContexts[i] = r.data.bufferCanvases[i].getContext('2d'); + r.data.bufferCanvases[i].style.position = 'absolute'; + r.data.bufferCanvases[i].setAttribute('data-id', 'buffer' + i); + r.data.bufferCanvases[i].style.zIndex = String(-i - 1); + r.data.bufferCanvases[i].style.visibility = 'hidden'; + //r.data.canvasContainer.appendChild(r.data.bufferCanvases[i]); } -}; -Layout.prototype.update = function (obj) { - if (obj == null) { - this.update2(); - } else if (obj instanceof LNode) { - var node = obj; - if (node.getChild() != null) { - // since node is compound, recursively update child nodes - var nodes = node.getChild().getNodes(); - for (var i = 0; i < nodes.length; i++) { - update(nodes[i]); + r.pathsEnabled = true; + var emptyBb = makeBoundingBox(); + var getBoxCenter = function getBoxCenter(bb) { + return { + x: (bb.x1 + bb.x2) / 2, + y: (bb.y1 + bb.y2) / 2 + }; + }; + var getCenterOffset = function getCenterOffset(bb) { + return { + x: -bb.w / 2, + y: -bb.h / 2 + }; + }; + var backgroundTimestampHasChanged = function backgroundTimestampHasChanged(ele) { + var _p = ele[0]._private; + var same = _p.oldBackgroundTimestamp === _p.backgroundTimestamp; + return !same; + }; + var getStyleKey = function getStyleKey(ele) { + return ele[0]._private.nodeKey; + }; + var getLabelKey = function getLabelKey(ele) { + return ele[0]._private.labelStyleKey; + }; + var getSourceLabelKey = function getSourceLabelKey(ele) { + return ele[0]._private.sourceLabelStyleKey; + }; + var getTargetLabelKey = function getTargetLabelKey(ele) { + return ele[0]._private.targetLabelStyleKey; + }; + var drawElement = function drawElement(context, ele, bb, scaledLabelShown, useEleOpacity) { + return r.drawElement(context, ele, bb, false, false, useEleOpacity); + }; + var drawLabel = function drawLabel(context, ele, bb, scaledLabelShown, useEleOpacity) { + return r.drawElementText(context, ele, bb, scaledLabelShown, 'main', useEleOpacity); + }; + var drawSourceLabel = function drawSourceLabel(context, ele, bb, scaledLabelShown, useEleOpacity) { + return r.drawElementText(context, ele, bb, scaledLabelShown, 'source', useEleOpacity); + }; + var drawTargetLabel = function drawTargetLabel(context, ele, bb, scaledLabelShown, useEleOpacity) { + return r.drawElementText(context, ele, bb, scaledLabelShown, 'target', useEleOpacity); + }; + var getElementBox = function getElementBox(ele) { + ele.boundingBox(); + return ele[0]._private.bodyBounds; + }; + var getLabelBox = function getLabelBox(ele) { + ele.boundingBox(); + return ele[0]._private.labelBounds.main || emptyBb; + }; + var getSourceLabelBox = function getSourceLabelBox(ele) { + ele.boundingBox(); + return ele[0]._private.labelBounds.source || emptyBb; + }; + var getTargetLabelBox = function getTargetLabelBox(ele) { + ele.boundingBox(); + return ele[0]._private.labelBounds.target || emptyBb; + }; + var isLabelVisibleAtScale = function isLabelVisibleAtScale(ele, scaledLabelShown) { + return scaledLabelShown; + }; + var getElementRotationPoint = function getElementRotationPoint(ele) { + return getBoxCenter(getElementBox(ele)); + }; + var addTextMargin = function addTextMargin(prefix, pt, ele) { + var pre = prefix ? prefix + '-' : ''; + return { + x: pt.x + ele.pstyle(pre + 'text-margin-x').pfValue, + y: pt.y + ele.pstyle(pre + 'text-margin-y').pfValue + }; + }; + var getRsPt = function getRsPt(ele, x, y) { + var rs = ele[0]._private.rscratch; + return { + x: rs[x], + y: rs[y] + }; + }; + var getLabelRotationPoint = function getLabelRotationPoint(ele) { + return addTextMargin('', getRsPt(ele, 'labelX', 'labelY'), ele); + }; + var getSourceLabelRotationPoint = function getSourceLabelRotationPoint(ele) { + return addTextMargin('source', getRsPt(ele, 'sourceLabelX', 'sourceLabelY'), ele); + }; + var getTargetLabelRotationPoint = function getTargetLabelRotationPoint(ele) { + return addTextMargin('target', getRsPt(ele, 'targetLabelX', 'targetLabelY'), ele); + }; + var getElementRotationOffset = function getElementRotationOffset(ele) { + return getCenterOffset(getElementBox(ele)); + }; + var getSourceLabelRotationOffset = function getSourceLabelRotationOffset(ele) { + return getCenterOffset(getSourceLabelBox(ele)); + }; + var getTargetLabelRotationOffset = function getTargetLabelRotationOffset(ele) { + return getCenterOffset(getTargetLabelBox(ele)); + }; + var getLabelRotationOffset = function getLabelRotationOffset(ele) { + var bb = getLabelBox(ele); + var p = getCenterOffset(getLabelBox(ele)); + if (ele.isNode()) { + switch (ele.pstyle('text-halign').value) { + case 'left': + p.x = -bb.w; + break; + case 'right': + p.x = 0; + break; + } + switch (ele.pstyle('text-valign').value) { + case 'top': + p.y = -bb.h; + break; + case 'bottom': + p.y = 0; + break; } } + return p; + }; + var eleTxrCache = r.data.eleTxrCache = new ElementTextureCache(r, { + getKey: getStyleKey, + doesEleInvalidateKey: backgroundTimestampHasChanged, + drawElement: drawElement, + getBoundingBox: getElementBox, + getRotationPoint: getElementRotationPoint, + getRotationOffset: getElementRotationOffset, + allowEdgeTxrCaching: false, + allowParentTxrCaching: false + }); + var lblTxrCache = r.data.lblTxrCache = new ElementTextureCache(r, { + getKey: getLabelKey, + drawElement: drawLabel, + getBoundingBox: getLabelBox, + getRotationPoint: getLabelRotationPoint, + getRotationOffset: getLabelRotationOffset, + isVisible: isLabelVisibleAtScale + }); + var slbTxrCache = r.data.slbTxrCache = new ElementTextureCache(r, { + getKey: getSourceLabelKey, + drawElement: drawSourceLabel, + getBoundingBox: getSourceLabelBox, + getRotationPoint: getSourceLabelRotationPoint, + getRotationOffset: getSourceLabelRotationOffset, + isVisible: isLabelVisibleAtScale + }); + var tlbTxrCache = r.data.tlbTxrCache = new ElementTextureCache(r, { + getKey: getTargetLabelKey, + drawElement: drawTargetLabel, + getBoundingBox: getTargetLabelBox, + getRotationPoint: getTargetLabelRotationPoint, + getRotationOffset: getTargetLabelRotationOffset, + isVisible: isLabelVisibleAtScale + }); + var lyrTxrCache = r.data.lyrTxrCache = new LayeredTextureCache(r); + r.onUpdateEleCalcs(function invalidateTextureCaches(willDraw, eles) { + // each cache should check for sub-key diff to see that the update affects that cache particularly + eleTxrCache.invalidateElements(eles); + lblTxrCache.invalidateElements(eles); + slbTxrCache.invalidateElements(eles); + tlbTxrCache.invalidateElements(eles); - // if the l-level node is associated with a v-level graph object, - // then it is assumed that the v-level node implements the - // interface Updatable. - if (node.vGraphObject != null) { - // cast to Updatable without any type check - var vNode = node.vGraphObject; - - // call the update method of the interface - vNode.update(node); - } - } else if (obj instanceof LEdge) { - var edge = obj; - // if the l-level edge is associated with a v-level graph object, - // then it is assumed that the v-level edge implements the - // interface Updatable. - - if (edge.vGraphObject != null) { - // cast to Updatable without any type check - var vEdge = edge.vGraphObject; + // any change invalidates the layers + lyrTxrCache.invalidateElements(eles); - // call the update method of the interface - vEdge.update(edge); + // update the old bg timestamp so diffs can be done in the ele txr caches + for (var _i = 0; _i < eles.length; _i++) { + var _p = eles[_i]._private; + _p.oldBackgroundTimestamp = _p.backgroundTimestamp; } - } else if (obj instanceof LGraph) { - var graph = obj; - // if the l-level graph is associated with a v-level graph object, - // then it is assumed that the v-level object implements the - // interface Updatable. - - if (graph.vGraphObject != null) { - // cast to Updatable without any type check - var vGraph = graph.vGraphObject; - - // call the update method of the interface - vGraph.update(graph); + }); + var refineInLayers = function refineInLayers(reqs) { + for (var i = 0; i < reqs.length; i++) { + lyrTxrCache.enqueueElementRefinement(reqs[i].ele); } + }; + eleTxrCache.onDequeue(refineInLayers); + lblTxrCache.onDequeue(refineInLayers); + slbTxrCache.onDequeue(refineInLayers); + tlbTxrCache.onDequeue(refineInLayers); +} +CRp.redrawHint = function (group, bool) { + var r = this; + switch (group) { + case 'eles': + r.data.canvasNeedsRedraw[CRp.NODE] = bool; + break; + case 'drag': + r.data.canvasNeedsRedraw[CRp.DRAG] = bool; + break; + case 'select': + r.data.canvasNeedsRedraw[CRp.SELECT_BOX] = bool; + break; } }; -/** - * This method is used to set all layout parameters to default values - * determined at compile time. - */ -Layout.prototype.initParameters = function () { - if (!this.isSubLayout) { - this.layoutQuality = LayoutConstants.QUALITY; - this.animationDuringLayout = LayoutConstants.DEFAULT_ANIMATION_DURING_LAYOUT; - this.animationPeriod = LayoutConstants.DEFAULT_ANIMATION_PERIOD; - this.animationOnLayout = LayoutConstants.DEFAULT_ANIMATION_ON_LAYOUT; - this.incremental = LayoutConstants.DEFAULT_INCREMENTAL; - this.createBendsAsNeeded = LayoutConstants.DEFAULT_CREATE_BENDS_AS_NEEDED; - this.uniformLeafNodeSizes = LayoutConstants.DEFAULT_UNIFORM_LEAF_NODE_SIZES; - } - - if (this.animationDuringLayout) { - this.animationOnLayout = false; +// whether to use Path2D caching for drawing +var pathsImpld = typeof Path2D !== 'undefined'; +CRp.path2dEnabled = function (on) { + if (on === undefined) { + return this.pathsEnabled; } + this.pathsEnabled = on ? true : false; }; - -Layout.prototype.transform = function (newLeftTop) { - if (newLeftTop == undefined) { - this.transform(new PointD(0, 0)); +CRp.usePaths = function () { + return pathsImpld && this.pathsEnabled; +}; +CRp.setImgSmoothing = function (context, bool) { + if (context.imageSmoothingEnabled != null) { + context.imageSmoothingEnabled = bool; } else { - // create a transformation object (from Eclipse to layout). When an - // inverse transform is applied, we get upper-left coordinate of the - // drawing or the root graph at given input coordinate (some margins - // already included in calculation of left-top). - - var trans = new Transform(); - var leftTop = this.graphManager.getRoot().updateLeftTop(); - - if (leftTop != null) { - trans.setWorldOrgX(newLeftTop.x); - trans.setWorldOrgY(newLeftTop.y); - - trans.setDeviceOrgX(leftTop.x); - trans.setDeviceOrgY(leftTop.y); - - var nodes = this.getAllNodes(); - var node; - - for (var i = 0; i < nodes.length; i++) { - node = nodes[i]; - node.transform(trans); - } - } + context.webkitImageSmoothingEnabled = bool; + context.mozImageSmoothingEnabled = bool; + context.msImageSmoothingEnabled = bool; } }; - -Layout.prototype.positionNodesRandomly = function (graph) { - - if (graph == undefined) { - //assert !this.incremental; - this.positionNodesRandomly(this.getGraphManager().getRoot()); - this.getGraphManager().getRoot().updateBounds(true); +CRp.getImgSmoothing = function (context) { + if (context.imageSmoothingEnabled != null) { + return context.imageSmoothingEnabled; } else { - var lNode; - var childGraph; - - var nodes = graph.getNodes(); - for (var i = 0; i < nodes.length; i++) { - lNode = nodes[i]; - childGraph = lNode.getChild(); - - if (childGraph == null) { - lNode.scatter(); - } else if (childGraph.getNodes().length == 0) { - lNode.scatter(); - } else { - this.positionNodesRandomly(childGraph); - lNode.updateBounds(); - } - } + return context.webkitImageSmoothingEnabled || context.mozImageSmoothingEnabled || context.msImageSmoothingEnabled; } }; - -/** - * This method returns a list of trees where each tree is represented as a - * list of l-nodes. The method returns a list of size 0 when: - * - The graph is not flat or - * - One of the component(s) of the graph is not a tree. - */ -Layout.prototype.getFlatForest = function () { - var flatForest = []; - var isForest = true; - - // Quick reference for all nodes in the graph manager associated with - // this layout. The list should not be changed. - var allNodes = this.graphManager.getRoot().getNodes(); - - // First be sure that the graph is flat - var isFlat = true; - - for (var i = 0; i < allNodes.length; i++) { - if (allNodes[i].getChild() != null) { - isFlat = false; - } - } - - // Return empty forest if the graph is not flat. - if (!isFlat) { - return flatForest; +CRp.makeOffscreenCanvas = function (width, height) { + var canvas; + if ((typeof OffscreenCanvas === "undefined" ? "undefined" : _typeof(OffscreenCanvas)) !== ("undefined" )) { + canvas = new OffscreenCanvas(width, height); + } else { + canvas = document.createElement('canvas'); // eslint-disable-line no-undef + canvas.width = width; + canvas.height = height; } + return canvas; +}; +[CRp$a, CRp$9, CRp$8, CRp$7, CRp$6, CRp$5, CRp$4, CRp$3, CRp$2, CRp$1].forEach(function (props) { + extend(CRp, props); +}); - // Run BFS for each component of the graph. - - var visited = new Set(); - var toBeVisited = []; - var parents = new Map(); - var unProcessedNodes = []; - - unProcessedNodes = unProcessedNodes.concat(allNodes); - - // Each iteration of this loop finds a component of the graph and - // decides whether it is a tree or not. If it is a tree, adds it to the - // forest and continued with the next component. +var renderer = [{ + name: 'null', + impl: NullRenderer +}, { + name: 'base', + impl: BR +}, { + name: 'canvas', + impl: CR +}]; - while (unProcessedNodes.length > 0 && isForest) { - toBeVisited.push(unProcessedNodes[0]); +var incExts = [{ + type: 'layout', + extensions: layout +}, { + type: 'renderer', + extensions: renderer +}]; - // Start the BFS. Each iteration of this loop visits a node in a - // BFS manner. - while (toBeVisited.length > 0 && isForest) { - //pool operation - var currentNode = toBeVisited[0]; - toBeVisited.splice(0, 1); - visited.add(currentNode); +// registered extensions to cytoscape, indexed by name +var extensions = {}; - // Traverse all neighbors of this node - var neighborEdges = currentNode.getEdges(); +// registered modules for extensions, indexed by name +var modules = {}; +function setExtension(type, name, registrant) { + var ext = registrant; + var overrideErr = function overrideErr(field) { + warn('Can not register `' + name + '` for `' + type + '` since `' + field + '` already exists in the prototype and can not be overridden'); + }; + if (type === 'core') { + if (Core.prototype[name]) { + return overrideErr(name); + } else { + Core.prototype[name] = registrant; + } + } else if (type === 'collection') { + if (Collection.prototype[name]) { + return overrideErr(name); + } else { + Collection.prototype[name] = registrant; + } + } else if (type === 'layout') { + // fill in missing layout functions in the prototype - for (var i = 0; i < neighborEdges.length; i++) { - var currentNeighbor = neighborEdges[i].getOtherEnd(currentNode); + var Layout = function Layout(options) { + this.options = options; + registrant.call(this, options); - // If BFS is not growing from this neighbor. - if (parents.get(currentNode) != currentNeighbor) { - // We haven't previously visited this neighbor. - if (!visited.has(currentNeighbor)) { - toBeVisited.push(currentNeighbor); - parents.set(currentNeighbor, currentNode); - } - // Since we have previously visited this neighbor and - // this neighbor is not parent of currentNode, given - // graph contains a component that is not tree, hence - // it is not a forest. - else { - isForest = false; - break; - } - } + // make sure layout has _private for use w/ std apis like .on() + if (!plainObject(this._private)) { + this._private = {}; } + this._private.cy = options.cy; + this._private.listeners = []; + this.createEmitter(); + }; + var layoutProto = Layout.prototype = Object.create(registrant.prototype); + var optLayoutFns = []; + for (var i = 0; i < optLayoutFns.length; i++) { + var fnName = optLayoutFns[i]; + layoutProto[fnName] = layoutProto[fnName] || function () { + return this; + }; } - // The graph contains a component that is not a tree. Empty - // previously found trees. The method will end. - if (!isForest) { - flatForest = []; + // either .start() or .run() is defined, so autogen the other + if (layoutProto.start && !layoutProto.run) { + layoutProto.run = function () { + this.start(); + return this; + }; + } else if (!layoutProto.start && layoutProto.run) { + layoutProto.start = function () { + this.run(); + return this; + }; } - // Save currently visited nodes as a tree in our forest. Reset - // visited and parents lists. Continue with the next component of - // the graph, if any. - else { - var temp = [].concat(_toConsumableArray(visited)); - flatForest.push(temp); - //flatForest = flatForest.concat(temp); - //unProcessedNodes.removeAll(visited); - for (var i = 0; i < temp.length; i++) { - var value = temp[i]; - var index = unProcessedNodes.indexOf(value); - if (index > -1) { - unProcessedNodes.splice(index, 1); + var regStop = registrant.prototype.stop; + layoutProto.stop = function () { + var opts = this.options; + if (opts && opts.animate) { + var anis = this.animations; + if (anis) { + for (var _i = 0; _i < anis.length; _i++) { + anis[_i].stop(); } } - visited = new Set(); - parents = new Map(); } - } - - return flatForest; -}; - -/** - * This method creates dummy nodes (an l-level node with minimal dimensions) - * for the given edge (one per bendpoint). The existing l-level structure - * is updated accordingly. - */ -Layout.prototype.createDummyNodesForBendpoints = function (edge) { - var dummyNodes = []; - var prev = edge.source; - - var graph = this.graphManager.calcLowestCommonAncestor(edge.source, edge.target); - - for (var i = 0; i < edge.bendpoints.length; i++) { - // create new dummy node - var dummyNode = this.newNode(null); - dummyNode.setRect(new Point(0, 0), new Dimension(1, 1)); + if (regStop) { + regStop.call(this); + } else { + this.emit('layoutstop'); + } + return this; + }; + if (!layoutProto.destroy) { + layoutProto.destroy = function () { + return this; + }; + } + layoutProto.cy = function () { + return this._private.cy; + }; + var getCy = function getCy(layout) { + return layout._private.cy; + }; + var emitterOpts = { + addEventFields: function addEventFields(layout, evt) { + evt.layout = layout; + evt.cy = getCy(layout); + evt.target = layout; + }, + bubble: function bubble() { + return true; + }, + parent: function parent(layout) { + return getCy(layout); + } + }; + extend(layoutProto, { + createEmitter: function createEmitter() { + this._private.emitter = new Emitter(emitterOpts, this); + return this; + }, + emitter: function emitter() { + return this._private.emitter; + }, + on: function on(evt, cb) { + this.emitter().on(evt, cb); + return this; + }, + one: function one(evt, cb) { + this.emitter().one(evt, cb); + return this; + }, + once: function once(evt, cb) { + this.emitter().one(evt, cb); + return this; + }, + removeListener: function removeListener(evt, cb) { + this.emitter().removeListener(evt, cb); + return this; + }, + removeAllListeners: function removeAllListeners() { + this.emitter().removeAllListeners(); + return this; + }, + emit: function emit(evt, params) { + this.emitter().emit(evt, params); + return this; + } + }); + define.eventAliasesOn(layoutProto); + ext = Layout; // replace with our wrapped layout + } else if (type === 'renderer' && name !== 'null' && name !== 'base') { + // user registered renderers inherit from base - graph.add(dummyNode); + var BaseRenderer = getExtension('renderer', 'base'); + var bProto = BaseRenderer.prototype; + var RegistrantRenderer = registrant; + var rProto = registrant.prototype; + var Renderer = function Renderer() { + BaseRenderer.apply(this, arguments); + RegistrantRenderer.apply(this, arguments); + }; + var proto = Renderer.prototype; + for (var pName in bProto) { + var pVal = bProto[pName]; + var existsInR = rProto[pName] != null; + if (existsInR) { + return overrideErr(pName); + } + proto[pName] = pVal; // take impl from base + } - // create new dummy edge between prev and dummy node - var dummyEdge = this.newEdge(null); - this.graphManager.add(dummyEdge, prev, dummyNode); + for (var _pName in rProto) { + proto[_pName] = rProto[_pName]; // take impl from registrant + } - dummyNodes.add(dummyNode); - prev = dummyNode; + bProto.clientFunctions.forEach(function (name) { + proto[name] = proto[name] || function () { + error('Renderer does not implement `renderer.' + name + '()` on its prototype'); + }; + }); + ext = Renderer; + } else if (type === '__proto__' || type === 'constructor' || type === 'prototype') { + // to avoid potential prototype pollution + return error(type + ' is an illegal type to be registered, possibly lead to prototype pollutions'); + } + return setMap({ + map: extensions, + keys: [type, name], + value: ext + }); +} +function getExtension(type, name) { + return getMap({ + map: extensions, + keys: [type, name] + }); +} +function setModule(type, name, moduleType, moduleName, registrant) { + return setMap({ + map: modules, + keys: [type, name, moduleType, moduleName], + value: registrant + }); +} +function getModule(type, name, moduleType, moduleName) { + return getMap({ + map: modules, + keys: [type, name, moduleType, moduleName] + }); +} +var extension = function extension() { + // e.g. extension('renderer', 'svg') + if (arguments.length === 2) { + return getExtension.apply(null, arguments); } - var dummyEdge = this.newEdge(null); - this.graphManager.add(dummyEdge, prev, edge.target); - - this.edgeToDummyNodes.set(edge, dummyNodes); + // e.g. extension('renderer', 'svg', { ... }) + else if (arguments.length === 3) { + return setExtension.apply(null, arguments); + } - // remove real edge from graph manager if it is inter-graph - if (edge.isInterGraph()) { - this.graphManager.remove(edge); + // e.g. extension('renderer', 'svg', 'nodeShape', 'ellipse') + else if (arguments.length === 4) { + return getModule.apply(null, arguments); } - // else, remove the edge from the current graph - else { - graph.remove(edge); - } - return dummyNodes; + // e.g. extension('renderer', 'svg', 'nodeShape', 'ellipse', { ... }) + else if (arguments.length === 5) { + return setModule.apply(null, arguments); + } else { + error('Invalid extension access syntax'); + } }; -/** - * This method creates bendpoints for edges from the dummy nodes - * at l-level. - */ -Layout.prototype.createBendpointsFromDummyNodes = function () { - var edges = []; - edges = edges.concat(this.graphManager.getAllEdges()); - edges = [].concat(_toConsumableArray(this.edgeToDummyNodes.keys())).concat(edges); - - for (var k = 0; k < edges.length; k++) { - var lEdge = edges[k]; +// allows a core instance to access extensions internally +Core.prototype.extension = extension; - if (lEdge.bendpoints.length > 0) { - var path = this.edgeToDummyNodes.get(lEdge); +// included extensions +incExts.forEach(function (group) { + group.extensions.forEach(function (ext) { + setExtension(group.type, ext.name, ext.impl); + }); +}); - for (var i = 0; i < path.length; i++) { - var dummyNode = path[i]; - var p = new PointD(dummyNode.getCenterX(), dummyNode.getCenterY()); +// a dummy stylesheet object that doesn't need a reference to the core +// (useful for init) +var Stylesheet = function Stylesheet() { + if (!(this instanceof Stylesheet)) { + return new Stylesheet(); + } + this.length = 0; +}; +var sheetfn = Stylesheet.prototype; +sheetfn.instanceString = function () { + return 'stylesheet'; +}; - // update bendpoint's location according to dummy node - var ebp = lEdge.bendpoints.get(i); - ebp.x = p.x; - ebp.y = p.y; +// just store the selector to be parsed later +sheetfn.selector = function (selector) { + var i = this.length++; + this[i] = { + selector: selector, + properties: [] + }; + return this; // chaining +}; - // remove the dummy node, dummy edges incident with this - // dummy node is also removed (within the remove method) - dummyNode.getOwner().remove(dummyNode); +// just store the property to be parsed later +sheetfn.css = function (name, value) { + var i = this.length - 1; + if (string(name)) { + this[i].properties.push({ + name: name, + value: value + }); + } else if (plainObject(name)) { + var map = name; + var propNames = Object.keys(map); + for (var j = 0; j < propNames.length; j++) { + var key = propNames[j]; + var mapVal = map[key]; + if (mapVal == null) { + continue; } - - // add the real edge to graph - this.graphManager.add(lEdge, lEdge.source, lEdge.target); + var prop = Style.properties[key] || Style.properties[dash2camel(key)]; + if (prop == null) { + continue; + } + var _name = prop.name; + var _value = mapVal; + this[i].properties.push({ + name: _name, + value: _value + }); } } + return this; // chaining }; -Layout.transform = function (sliderValue, defaultValue, minDiv, maxMul) { - if (minDiv != undefined && maxMul != undefined) { - var value = defaultValue; +sheetfn.style = sheetfn.css; - if (sliderValue <= 50) { - var minValue = defaultValue / minDiv; - value -= (defaultValue - minValue) / 50 * (50 - sliderValue); - } else { - var maxValue = defaultValue * maxMul; - value += (maxValue - defaultValue) / 50 * (sliderValue - 50); - } +// generate a real style object from the dummy stylesheet +sheetfn.generateStyle = function (cy) { + var style = new Style(cy); + return this.appendToStyle(style); +}; - return value; - } else { - var a, b; +// append a dummy stylesheet object on a real style object +sheetfn.appendToStyle = function (style) { + for (var i = 0; i < this.length; i++) { + var context = this[i]; + var selector = context.selector; + var props = context.properties; + style.selector(selector); // apply selector - if (sliderValue <= 50) { - a = 9.0 * defaultValue / 500.0; - b = defaultValue / 10.0; - } else { - a = 9.0 * defaultValue / 50.0; - b = -8 * defaultValue; + for (var j = 0; j < props.length; j++) { + var prop = props[j]; + style.css(prop.name, prop.value); // apply property } - - return a * sliderValue + b; } -}; -/** - * This method finds and returns the center of the given nodes, assuming - * that the given nodes form a tree in themselves. - */ -Layout.findCenterOfTree = function (nodes) { - var list = []; - list = list.concat(nodes); + return style; +}; - var removedNodes = []; - var remainingDegrees = new Map(); - var foundCenter = false; - var centerNode = null; +var version = "3.27.0"; - if (list.length == 1 || list.length == 2) { - foundCenter = true; - centerNode = list[0]; +var cytoscape = function cytoscape(options) { + // if no options specified, use default + if (options === undefined) { + options = {}; } - for (var i = 0; i < list.length; i++) { - var node = list[i]; - var degree = node.getNeighborsList().size; - remainingDegrees.set(node, node.getNeighborsList().size); - - if (degree == 1) { - removedNodes.push(node); - } + // create instance + if (plainObject(options)) { + return new Core(options); } - var tempList = []; - tempList = tempList.concat(removedNodes); - - while (!foundCenter) { - var tempList2 = []; - tempList2 = tempList2.concat(tempList); - tempList = []; - - for (var i = 0; i < list.length; i++) { - var node = list[i]; - - var index = list.indexOf(node); - if (index >= 0) { - list.splice(index, 1); - } - - var neighbours = node.getNeighborsList(); - - neighbours.forEach(function (neighbour) { - if (removedNodes.indexOf(neighbour) < 0) { - var otherDegree = remainingDegrees.get(neighbour); - var newDegree = otherDegree - 1; - - if (newDegree == 1) { - tempList.push(neighbour); - } - - remainingDegrees.set(neighbour, newDegree); - } - }); - } + // allow for registration of extensions + else if (string(options)) { + return extension.apply(extension, arguments); + } +}; - removedNodes = removedNodes.concat(tempList); +// e.g. cytoscape.use( require('cytoscape-foo'), bar ) +cytoscape.use = function (ext) { + var args = Array.prototype.slice.call(arguments, 1); // args to pass to ext - if (list.length == 1 || list.length == 2) { - foundCenter = true; - centerNode = list[0]; - } - } + args.unshift(cytoscape); // cytoscape is first arg to ext - return centerNode; + ext.apply(null, args); + return this; }; - -/** - * During the coarsening process, this layout may be referenced by two graph managers - * this setter function grants access to change the currently being used graph manager - */ -Layout.prototype.setGraphManager = function (gm) { - this.graphManager = gm; +cytoscape.warnings = function (bool) { + return warnings(bool); }; -module.exports = Layout; - -/***/ }), -/* 16 */ -/***/ (function(module, exports, __webpack_require__) { +// replaced by build system +cytoscape.version = version; -"use strict"; +// expose public apis (mostly for extensions) +cytoscape.stylesheet = cytoscape.Stylesheet = Stylesheet; +module.exports = cytoscape; -function RandomSeed() {} -// adapted from: https://stackoverflow.com/a/19303725 -RandomSeed.seed = 1; -RandomSeed.x = 0; -RandomSeed.nextDouble = function () { - RandomSeed.x = Math.sin(RandomSeed.seed++) * 10000; - return RandomSeed.x - Math.floor(RandomSeed.x); -}; +/***/ }), -module.exports = RandomSeed; +/***/ "./node_modules/dagre/index.js": +/*!*************************************!*\ + !*** ./node_modules/dagre/index.js ***! + \*************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -/***/ }), -/* 17 */ -/***/ (function(module, exports, __nested_webpack_require_84109__) { +/* +Copyright (c) 2012-2014 Chris Pettitt -"use strict"; +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -var PointD = __nested_webpack_require_84109__(5); +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ -function Transform(x, y) { - this.lworldOrgX = 0.0; - this.lworldOrgY = 0.0; - this.ldeviceOrgX = 0.0; - this.ldeviceOrgY = 0.0; - this.lworldExtX = 1.0; - this.lworldExtY = 1.0; - this.ldeviceExtX = 1.0; - this.ldeviceExtY = 1.0; -} +module.exports = { + graphlib: __webpack_require__(/*! ./lib/graphlib */ "./node_modules/dagre/lib/graphlib.js"), -Transform.prototype.getWorldOrgX = function () { - return this.lworldOrgX; + layout: __webpack_require__(/*! ./lib/layout */ "./node_modules/dagre/lib/layout.js"), + debug: __webpack_require__(/*! ./lib/debug */ "./node_modules/dagre/lib/debug.js"), + util: { + time: (__webpack_require__(/*! ./lib/util */ "./node_modules/dagre/lib/util.js").time), + notime: (__webpack_require__(/*! ./lib/util */ "./node_modules/dagre/lib/util.js").notime) + }, + version: __webpack_require__(/*! ./lib/version */ "./node_modules/dagre/lib/version.js") }; -Transform.prototype.setWorldOrgX = function (wox) { - this.lworldOrgX = wox; -}; -Transform.prototype.getWorldOrgY = function () { - return this.lworldOrgY; -}; +/***/ }), -Transform.prototype.setWorldOrgY = function (woy) { - this.lworldOrgY = woy; -}; +/***/ "./node_modules/dagre/lib/acyclic.js": +/*!*******************************************!*\ + !*** ./node_modules/dagre/lib/acyclic.js ***! + \*******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -Transform.prototype.getWorldExtX = function () { - return this.lworldExtX; -}; +"use strict"; -Transform.prototype.setWorldExtX = function (wex) { - this.lworldExtX = wex; -}; -Transform.prototype.getWorldExtY = function () { - return this.lworldExtY; -}; +var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); +var greedyFAS = __webpack_require__(/*! ./greedy-fas */ "./node_modules/dagre/lib/greedy-fas.js"); -Transform.prototype.setWorldExtY = function (wey) { - this.lworldExtY = wey; +module.exports = { + run: run, + undo: undo }; -/* Device related */ +function run(g) { + var fas = (g.graph().acyclicer === "greedy" + ? greedyFAS(g, weightFn(g)) + : dfsFAS(g)); + _.forEach(fas, function(e) { + var label = g.edge(e); + g.removeEdge(e); + label.forwardName = e.name; + label.reversed = true; + g.setEdge(e.w, e.v, label, _.uniqueId("rev")); + }); -Transform.prototype.getDeviceOrgX = function () { - return this.ldeviceOrgX; -}; + function weightFn(g) { + return function(e) { + return g.edge(e).weight; + }; + } +} -Transform.prototype.setDeviceOrgX = function (dox) { - this.ldeviceOrgX = dox; -}; +function dfsFAS(g) { + var fas = []; + var stack = {}; + var visited = {}; -Transform.prototype.getDeviceOrgY = function () { - return this.ldeviceOrgY; -}; + function dfs(v) { + if (_.has(visited, v)) { + return; + } + visited[v] = true; + stack[v] = true; + _.forEach(g.outEdges(v), function(e) { + if (_.has(stack, e.w)) { + fas.push(e); + } else { + dfs(e.w); + } + }); + delete stack[v]; + } -Transform.prototype.setDeviceOrgY = function (doy) { - this.ldeviceOrgY = doy; -}; + _.forEach(g.nodes(), dfs); + return fas; +} -Transform.prototype.getDeviceExtX = function () { - return this.ldeviceExtX; -}; +function undo(g) { + _.forEach(g.edges(), function(e) { + var label = g.edge(e); + if (label.reversed) { + g.removeEdge(e); -Transform.prototype.setDeviceExtX = function (dex) { - this.ldeviceExtX = dex; -}; + var forwardName = label.forwardName; + delete label.reversed; + delete label.forwardName; + g.setEdge(e.w, e.v, label, forwardName); + } + }); +} -Transform.prototype.getDeviceExtY = function () { - return this.ldeviceExtY; -}; -Transform.prototype.setDeviceExtY = function (dey) { - this.ldeviceExtY = dey; -}; +/***/ }), -Transform.prototype.transformX = function (x) { - var xDevice = 0.0; - var worldExtX = this.lworldExtX; - if (worldExtX != 0.0) { - xDevice = this.ldeviceOrgX + (x - this.lworldOrgX) * this.ldeviceExtX / worldExtX; - } +/***/ "./node_modules/dagre/lib/add-border-segments.js": +/*!*******************************************************!*\ + !*** ./node_modules/dagre/lib/add-border-segments.js ***! + \*******************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - return xDevice; -}; +var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); +var util = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js"); -Transform.prototype.transformY = function (y) { - var yDevice = 0.0; - var worldExtY = this.lworldExtY; - if (worldExtY != 0.0) { - yDevice = this.ldeviceOrgY + (y - this.lworldOrgY) * this.ldeviceExtY / worldExtY; - } +module.exports = addBorderSegments; - return yDevice; -}; +function addBorderSegments(g) { + function dfs(v) { + var children = g.children(v); + var node = g.node(v); + if (children.length) { + _.forEach(children, dfs); + } -Transform.prototype.inverseTransformX = function (x) { - var xWorld = 0.0; - var deviceExtX = this.ldeviceExtX; - if (deviceExtX != 0.0) { - xWorld = this.lworldOrgX + (x - this.ldeviceOrgX) * this.lworldExtX / deviceExtX; + if (_.has(node, "minRank")) { + node.borderLeft = []; + node.borderRight = []; + for (var rank = node.minRank, maxRank = node.maxRank + 1; + rank < maxRank; + ++rank) { + addBorderNode(g, "borderLeft", "_bl", v, node, rank); + addBorderNode(g, "borderRight", "_br", v, node, rank); + } + } } - return xWorld; -}; + _.forEach(g.children(), dfs); +} -Transform.prototype.inverseTransformY = function (y) { - var yWorld = 0.0; - var deviceExtY = this.ldeviceExtY; - if (deviceExtY != 0.0) { - yWorld = this.lworldOrgY + (y - this.ldeviceOrgY) * this.lworldExtY / deviceExtY; +function addBorderNode(g, prop, prefix, sg, sgNode, rank) { + var label = { width: 0, height: 0, rank: rank, borderType: prop }; + var prev = sgNode[prop][rank - 1]; + var curr = util.addDummyNode(g, "border", label, prefix); + sgNode[prop][rank] = curr; + g.setParent(curr, sg); + if (prev) { + g.setEdge(prev, curr, { weight: 1 }); } - return yWorld; -}; - -Transform.prototype.inverseTransformPoint = function (inPoint) { - var outPoint = new PointD(this.inverseTransformX(inPoint.x), this.inverseTransformY(inPoint.y)); - return outPoint; -}; +} -module.exports = Transform; /***/ }), -/* 18 */ -/***/ (function(module, exports, __nested_webpack_require_86996__) { + +/***/ "./node_modules/dagre/lib/coordinate-system.js": +/*!*****************************************************!*\ + !*** ./node_modules/dagre/lib/coordinate-system.js ***! + \*****************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; -function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } +var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); -var Layout = __nested_webpack_require_86996__(15); -var FDLayoutConstants = __nested_webpack_require_86996__(4); -var LayoutConstants = __nested_webpack_require_86996__(0); -var IGeometry = __nested_webpack_require_86996__(8); -var IMath = __nested_webpack_require_86996__(9); +module.exports = { + adjust: adjust, + undo: undo +}; -function FDLayout() { - Layout.call(this); +function adjust(g) { + var rankDir = g.graph().rankdir.toLowerCase(); + if (rankDir === "lr" || rankDir === "rl") { + swapWidthHeight(g); + } +} - this.useSmartIdealEdgeLengthCalculation = FDLayoutConstants.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION; - this.gravityConstant = FDLayoutConstants.DEFAULT_GRAVITY_STRENGTH; - this.compoundGravityConstant = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH; - this.gravityRangeFactor = FDLayoutConstants.DEFAULT_GRAVITY_RANGE_FACTOR; - this.compoundGravityRangeFactor = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR; - this.displacementThresholdPerNode = 3.0 * FDLayoutConstants.DEFAULT_EDGE_LENGTH / 100; - this.coolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL; - this.initialCoolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL; - this.totalDisplacement = 0.0; - this.oldTotalDisplacement = 0.0; - this.maxIterations = FDLayoutConstants.MAX_ITERATIONS; +function undo(g) { + var rankDir = g.graph().rankdir.toLowerCase(); + if (rankDir === "bt" || rankDir === "rl") { + reverseY(g); + } + + if (rankDir === "lr" || rankDir === "rl") { + swapXY(g); + swapWidthHeight(g); + } } -FDLayout.prototype = Object.create(Layout.prototype); +function swapWidthHeight(g) { + _.forEach(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); }); + _.forEach(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); }); +} -for (var prop in Layout) { - FDLayout[prop] = Layout[prop]; +function swapWidthHeightOne(attrs) { + var w = attrs.width; + attrs.width = attrs.height; + attrs.height = w; } -FDLayout.prototype.initParameters = function () { - Layout.prototype.initParameters.call(this, arguments); +function reverseY(g) { + _.forEach(g.nodes(), function(v) { reverseYOne(g.node(v)); }); - this.totalIterations = 0; - this.notAnimatedIterations = 0; + _.forEach(g.edges(), function(e) { + var edge = g.edge(e); + _.forEach(edge.points, reverseYOne); + if (_.has(edge, "y")) { + reverseYOne(edge); + } + }); +} - this.useFRGridVariant = FDLayoutConstants.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION; +function reverseYOne(attrs) { + attrs.y = -attrs.y; +} - this.grid = []; -}; +function swapXY(g) { + _.forEach(g.nodes(), function(v) { swapXYOne(g.node(v)); }); -FDLayout.prototype.calcIdealEdgeLengths = function () { - var edge; - var originalIdealLength; - var lcaDepth; - var source; - var target; - var sizeOfSourceInLca; - var sizeOfTargetInLca; + _.forEach(g.edges(), function(e) { + var edge = g.edge(e); + _.forEach(edge.points, swapXYOne); + if (_.has(edge, "x")) { + swapXYOne(edge); + } + }); +} - var allEdges = this.getGraphManager().getAllEdges(); - for (var i = 0; i < allEdges.length; i++) { - edge = allEdges[i]; +function swapXYOne(attrs) { + var x = attrs.x; + attrs.x = attrs.y; + attrs.y = x; +} - originalIdealLength = edge.idealLength; - if (edge.isInterGraph) { - source = edge.getSource(); - target = edge.getTarget(); +/***/ }), - sizeOfSourceInLca = edge.getSourceInLca().getEstimatedSize(); - sizeOfTargetInLca = edge.getTargetInLca().getEstimatedSize(); +/***/ "./node_modules/dagre/lib/data/list.js": +/*!*********************************************!*\ + !*** ./node_modules/dagre/lib/data/list.js ***! + \*********************************************/ +/***/ (function(module) { - if (this.useSmartIdealEdgeLengthCalculation) { - edge.idealLength += sizeOfSourceInLca + sizeOfTargetInLca - 2 * LayoutConstants.SIMPLE_NODE_SIZE; - } +/* + * Simple doubly linked list implementation derived from Cormen, et al., + * "Introduction to Algorithms". + */ - lcaDepth = edge.getLca().getInclusionTreeDepth(); +module.exports = List; - edge.idealLength += originalIdealLength * FDLayoutConstants.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR * (source.getInclusionTreeDepth() + target.getInclusionTreeDepth() - 2 * lcaDepth); - } +function List() { + var sentinel = {}; + sentinel._next = sentinel._prev = sentinel; + this._sentinel = sentinel; +} + +List.prototype.dequeue = function() { + var sentinel = this._sentinel; + var entry = sentinel._prev; + if (entry !== sentinel) { + unlink(entry); + return entry; } }; -FDLayout.prototype.initSpringEmbedder = function () { - - var s = this.getAllNodes().length; - if (this.incremental) { - if (s > FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) { - this.coolingFactor = Math.max(this.coolingFactor * FDLayoutConstants.COOLING_ADAPTATION_FACTOR, this.coolingFactor - (s - FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) / (FDLayoutConstants.ADAPTATION_UPPER_NODE_LIMIT - FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) * this.coolingFactor * (1 - FDLayoutConstants.COOLING_ADAPTATION_FACTOR)); - } - this.maxNodeDisplacement = FDLayoutConstants.MAX_NODE_DISPLACEMENT_INCREMENTAL; - } else { - if (s > FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) { - this.coolingFactor = Math.max(FDLayoutConstants.COOLING_ADAPTATION_FACTOR, 1.0 - (s - FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) / (FDLayoutConstants.ADAPTATION_UPPER_NODE_LIMIT - FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) * (1 - FDLayoutConstants.COOLING_ADAPTATION_FACTOR)); - } else { - this.coolingFactor = 1.0; - } - this.initialCoolingFactor = this.coolingFactor; - this.maxNodeDisplacement = FDLayoutConstants.MAX_NODE_DISPLACEMENT; +List.prototype.enqueue = function(entry) { + var sentinel = this._sentinel; + if (entry._prev && entry._next) { + unlink(entry); } - - this.maxIterations = Math.max(this.getAllNodes().length * 5, this.maxIterations); - - // Reassign this attribute by using new constant value - this.displacementThresholdPerNode = 3.0 * FDLayoutConstants.DEFAULT_EDGE_LENGTH / 100; - this.totalDisplacementThreshold = this.displacementThresholdPerNode * this.getAllNodes().length; - - this.repulsionRange = this.calcRepulsionRange(); + entry._next = sentinel._next; + sentinel._next._prev = entry; + sentinel._next = entry; + entry._prev = sentinel; }; -FDLayout.prototype.calcSpringForces = function () { - var lEdges = this.getAllEdges(); - var edge; +List.prototype.toString = function() { + var strs = []; + var sentinel = this._sentinel; + var curr = sentinel._prev; + while (curr !== sentinel) { + strs.push(JSON.stringify(curr, filterOutLinks)); + curr = curr._prev; + } + return "[" + strs.join(", ") + "]"; +}; - for (var i = 0; i < lEdges.length; i++) { - edge = lEdges[i]; +function unlink(entry) { + entry._prev._next = entry._next; + entry._next._prev = entry._prev; + delete entry._next; + delete entry._prev; +} - this.calcSpringForce(edge, edge.idealLength); +function filterOutLinks(k, v) { + if (k !== "_next" && k !== "_prev") { + return v; } -}; +} -FDLayout.prototype.calcRepulsionForces = function () { - var gridUpdateAllowed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; - var forceToNodeSurroundingUpdate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - var i, j; - var nodeA, nodeB; - var lNodes = this.getAllNodes(); - var processedNodeSet; +/***/ }), - if (this.useFRGridVariant) { - if (this.totalIterations % FDLayoutConstants.GRID_CALCULATION_CHECK_PERIOD == 1 && gridUpdateAllowed) { - this.updateGrid(); - } +/***/ "./node_modules/dagre/lib/debug.js": +/*!*****************************************!*\ + !*** ./node_modules/dagre/lib/debug.js ***! + \*****************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - processedNodeSet = new Set(); +var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); +var util = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js"); +var Graph = (__webpack_require__(/*! ./graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph); - // calculate repulsion forces between each nodes and its surrounding - for (i = 0; i < lNodes.length; i++) { - nodeA = lNodes[i]; - this.calculateRepulsionForceOfANode(nodeA, processedNodeSet, gridUpdateAllowed, forceToNodeSurroundingUpdate); - processedNodeSet.add(nodeA); - } - } else { - for (i = 0; i < lNodes.length; i++) { - nodeA = lNodes[i]; +module.exports = { + debugOrdering: debugOrdering +}; - for (j = i + 1; j < lNodes.length; j++) { - nodeB = lNodes[j]; +/* istanbul ignore next */ +function debugOrdering(g) { + var layerMatrix = util.buildLayerMatrix(g); - // If both nodes are not members of the same graph, skip. - if (nodeA.getOwner() != nodeB.getOwner()) { - continue; - } + var h = new Graph({ compound: true, multigraph: true }).setGraph({}); - this.calcRepulsionForce(nodeA, nodeB); - } - } - } -}; + _.forEach(g.nodes(), function(v) { + h.setNode(v, { label: v }); + h.setParent(v, "layer" + g.node(v).rank); + }); -FDLayout.prototype.calcGravitationalForces = function () { - var node; - var lNodes = this.getAllNodesToApplyGravitation(); + _.forEach(g.edges(), function(e) { + h.setEdge(e.v, e.w, {}, e.name); + }); + + _.forEach(layerMatrix, function(layer, i) { + var layerV = "layer" + i; + h.setNode(layerV, { rank: "same" }); + _.reduce(layer, function(u, v) { + h.setEdge(u, v, { style: "invis" }); + return v; + }); + }); - for (var i = 0; i < lNodes.length; i++) { - node = lNodes[i]; - this.calcGravitationalForce(node); - } -}; + return h; +} -FDLayout.prototype.moveNodes = function () { - var lNodes = this.getAllNodes(); - var node; - for (var i = 0; i < lNodes.length; i++) { - node = lNodes[i]; - node.move(); - } -}; +/***/ }), -FDLayout.prototype.calcSpringForce = function (edge, idealLength) { - var sourceNode = edge.getSource(); - var targetNode = edge.getTarget(); +/***/ "./node_modules/dagre/lib/graphlib.js": +/*!********************************************!*\ + !*** ./node_modules/dagre/lib/graphlib.js ***! + \********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - var length; - var springForce; - var springForceX; - var springForceY; +/* global window */ - // Update edge length - if (this.uniformLeafNodeSizes && sourceNode.getChild() == null && targetNode.getChild() == null) { - edge.updateLengthSimple(); - } else { - edge.updateLength(); +var graphlib; - if (edge.isOverlapingSourceAndTarget) { - return; - } +if (true) { + try { + graphlib = __webpack_require__(/*! graphlib */ "./node_modules/graphlib/index.js"); + } catch (e) { + // continue regardless of error } +} - length = edge.getLength(); +if (!graphlib) { + graphlib = window.graphlib; +} - if (length == 0) return; +module.exports = graphlib; - // Calculate spring forces - springForce = edge.edgeElasticity * (length - idealLength); - // Project force onto x and y axes - springForceX = springForce * (edge.lengthX / length); - springForceY = springForce * (edge.lengthY / length); +/***/ }), - // Apply forces on the end nodes - sourceNode.springForceX += springForceX; - sourceNode.springForceY += springForceY; - targetNode.springForceX -= springForceX; - targetNode.springForceY -= springForceY; -}; +/***/ "./node_modules/dagre/lib/greedy-fas.js": +/*!**********************************************!*\ + !*** ./node_modules/dagre/lib/greedy-fas.js ***! + \**********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -FDLayout.prototype.calcRepulsionForce = function (nodeA, nodeB) { - var rectA = nodeA.getRect(); - var rectB = nodeB.getRect(); - var overlapAmount = new Array(2); - var clipPoints = new Array(4); - var distanceX; - var distanceY; - var distanceSquared; - var distance; - var repulsionForce; - var repulsionForceX; - var repulsionForceY; +var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); +var Graph = (__webpack_require__(/*! ./graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph); +var List = __webpack_require__(/*! ./data/list */ "./node_modules/dagre/lib/data/list.js"); - if (rectA.intersects(rectB)) // two nodes overlap - { - // calculate separation amount in x and y directions - IGeometry.calcSeparationAmount(rectA, rectB, overlapAmount, FDLayoutConstants.DEFAULT_EDGE_LENGTH / 2.0); +/* + * A greedy heuristic for finding a feedback arc set for a graph. A feedback + * arc set is a set of edges that can be removed to make a graph acyclic. + * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, "A fast and + * effective heuristic for the feedback arc set problem." This implementation + * adjusts that from the paper to allow for weighted edges. + */ +module.exports = greedyFAS; - repulsionForceX = 2 * overlapAmount[0]; - repulsionForceY = 2 * overlapAmount[1]; +var DEFAULT_WEIGHT_FN = _.constant(1); - var childrenConstant = nodeA.noOfChildren * nodeB.noOfChildren / (nodeA.noOfChildren + nodeB.noOfChildren); +function greedyFAS(g, weightFn) { + if (g.nodeCount() <= 1) { + return []; + } + var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN); + var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx); - // Apply forces on the two nodes - nodeA.repulsionForceX -= childrenConstant * repulsionForceX; - nodeA.repulsionForceY -= childrenConstant * repulsionForceY; - nodeB.repulsionForceX += childrenConstant * repulsionForceX; - nodeB.repulsionForceY += childrenConstant * repulsionForceY; - } else // no overlap - { - // calculate distance + // Expand multi-edges + return _.flatten(_.map(results, function(e) { + return g.outEdges(e.v, e.w); + }), true); +} - if (this.uniformLeafNodeSizes && nodeA.getChild() == null && nodeB.getChild() == null) // simply base repulsion on distance of node centers - { - distanceX = rectB.getCenterX() - rectA.getCenterX(); - distanceY = rectB.getCenterY() - rectA.getCenterY(); - } else // use clipping points - { - IGeometry.getIntersection(rectA, rectB, clipPoints); +function doGreedyFAS(g, buckets, zeroIdx) { + var results = []; + var sources = buckets[buckets.length - 1]; + var sinks = buckets[0]; - distanceX = clipPoints[2] - clipPoints[0]; - distanceY = clipPoints[3] - clipPoints[1]; + var entry; + while (g.nodeCount()) { + while ((entry = sinks.dequeue())) { removeNode(g, buckets, zeroIdx, entry); } + while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); } + if (g.nodeCount()) { + for (var i = buckets.length - 2; i > 0; --i) { + entry = buckets[i].dequeue(); + if (entry) { + results = results.concat(removeNode(g, buckets, zeroIdx, entry, true)); + break; } - - // No repulsion range. FR grid variant should take care of this. - if (Math.abs(distanceX) < FDLayoutConstants.MIN_REPULSION_DIST) { - distanceX = IMath.sign(distanceX) * FDLayoutConstants.MIN_REPULSION_DIST; - } - - if (Math.abs(distanceY) < FDLayoutConstants.MIN_REPULSION_DIST) { - distanceY = IMath.sign(distanceY) * FDLayoutConstants.MIN_REPULSION_DIST; } + } + } - distanceSquared = distanceX * distanceX + distanceY * distanceY; - distance = Math.sqrt(distanceSquared); + return results; +} - // Here we use half of the nodes' repulsion values for backward compatibility - repulsionForce = (nodeA.nodeRepulsion / 2 + nodeB.nodeRepulsion / 2) * nodeA.noOfChildren * nodeB.noOfChildren / distanceSquared; +function removeNode(g, buckets, zeroIdx, entry, collectPredecessors) { + var results = collectPredecessors ? [] : undefined; - // Project force onto x and y axes - repulsionForceX = repulsionForce * distanceX / distance; - repulsionForceY = repulsionForce * distanceY / distance; + _.forEach(g.inEdges(entry.v), function(edge) { + var weight = g.edge(edge); + var uEntry = g.node(edge.v); - // Apply forces on the two nodes - nodeA.repulsionForceX -= repulsionForceX; - nodeA.repulsionForceY -= repulsionForceY; - nodeB.repulsionForceX += repulsionForceX; - nodeB.repulsionForceY += repulsionForceY; + if (collectPredecessors) { + results.push({ v: edge.v, w: edge.w }); } -}; -FDLayout.prototype.calcGravitationalForce = function (node) { - var ownerGraph; - var ownerCenterX; - var ownerCenterY; - var distanceX; - var distanceY; - var absDistanceX; - var absDistanceY; - var estimatedSize; - ownerGraph = node.getOwner(); + uEntry.out -= weight; + assignBucket(buckets, zeroIdx, uEntry); + }); - ownerCenterX = (ownerGraph.getRight() + ownerGraph.getLeft()) / 2; - ownerCenterY = (ownerGraph.getTop() + ownerGraph.getBottom()) / 2; - distanceX = node.getCenterX() - ownerCenterX; - distanceY = node.getCenterY() - ownerCenterY; - absDistanceX = Math.abs(distanceX) + node.getWidth() / 2; - absDistanceY = Math.abs(distanceY) + node.getHeight() / 2; + _.forEach(g.outEdges(entry.v), function(edge) { + var weight = g.edge(edge); + var w = edge.w; + var wEntry = g.node(w); + wEntry["in"] -= weight; + assignBucket(buckets, zeroIdx, wEntry); + }); - if (node.getOwner() == this.graphManager.getRoot()) // in the root graph - { - estimatedSize = ownerGraph.getEstimatedSize() * this.gravityRangeFactor; + g.removeNode(entry.v); - if (absDistanceX > estimatedSize || absDistanceY > estimatedSize) { - node.gravitationForceX = -this.gravityConstant * distanceX; - node.gravitationForceY = -this.gravityConstant * distanceY; - } - } else // inside a compound - { - estimatedSize = ownerGraph.getEstimatedSize() * this.compoundGravityRangeFactor; + return results; +} - if (absDistanceX > estimatedSize || absDistanceY > estimatedSize) { - node.gravitationForceX = -this.gravityConstant * distanceX * this.compoundGravityConstant; - node.gravitationForceY = -this.gravityConstant * distanceY * this.compoundGravityConstant; - } - } -}; +function buildState(g, weightFn) { + var fasGraph = new Graph(); + var maxIn = 0; + var maxOut = 0; -FDLayout.prototype.isConverged = function () { - var converged; - var oscilating = false; + _.forEach(g.nodes(), function(v) { + fasGraph.setNode(v, { v: v, "in": 0, out: 0 }); + }); - if (this.totalIterations > this.maxIterations / 3) { - oscilating = Math.abs(this.totalDisplacement - this.oldTotalDisplacement) < 2; - } + // Aggregate weights on nodes, but also sum the weights across multi-edges + // into a single edge for the fasGraph. + _.forEach(g.edges(), function(e) { + var prevWeight = fasGraph.edge(e.v, e.w) || 0; + var weight = weightFn(e); + var edgeWeight = prevWeight + weight; + fasGraph.setEdge(e.v, e.w, edgeWeight); + maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight); + maxIn = Math.max(maxIn, fasGraph.node(e.w)["in"] += weight); + }); - converged = this.totalDisplacement < this.totalDisplacementThreshold; + var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); }); + var zeroIdx = maxIn + 1; - this.oldTotalDisplacement = this.totalDisplacement; + _.forEach(fasGraph.nodes(), function(v) { + assignBucket(buckets, zeroIdx, fasGraph.node(v)); + }); - return converged || oscilating; -}; + return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx }; +} -FDLayout.prototype.animate = function () { - if (this.animationDuringLayout && !this.isSubLayout) { - if (this.notAnimatedIterations == this.animationPeriod) { - this.update(); - this.notAnimatedIterations = 0; - } else { - this.notAnimatedIterations++; - } +function assignBucket(buckets, zeroIdx, entry) { + if (!entry.out) { + buckets[0].enqueue(entry); + } else if (!entry["in"]) { + buckets[buckets.length - 1].enqueue(entry); + } else { + buckets[entry.out - entry["in"] + zeroIdx].enqueue(entry); } -}; +} -//This method calculates the number of children (weight) for all nodes -FDLayout.prototype.calcNoOfChildrenForAllNodes = function () { - var node; - var allNodes = this.graphManager.getAllNodes(); - for (var i = 0; i < allNodes.length; i++) { - node = allNodes[i]; - node.noOfChildren = node.getNoOfChildren(); - } -}; +/***/ }), -// ----------------------------------------------------------------------------- -// Section: FR-Grid Variant Repulsion Force Calculation -// ----------------------------------------------------------------------------- +/***/ "./node_modules/dagre/lib/layout.js": +/*!******************************************!*\ + !*** ./node_modules/dagre/lib/layout.js ***! + \******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -FDLayout.prototype.calcGrid = function (graph) { +"use strict"; - var sizeX = 0; - var sizeY = 0; - sizeX = parseInt(Math.ceil((graph.getRight() - graph.getLeft()) / this.repulsionRange)); - sizeY = parseInt(Math.ceil((graph.getBottom() - graph.getTop()) / this.repulsionRange)); +var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); +var acyclic = __webpack_require__(/*! ./acyclic */ "./node_modules/dagre/lib/acyclic.js"); +var normalize = __webpack_require__(/*! ./normalize */ "./node_modules/dagre/lib/normalize.js"); +var rank = __webpack_require__(/*! ./rank */ "./node_modules/dagre/lib/rank/index.js"); +var normalizeRanks = (__webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js").normalizeRanks); +var parentDummyChains = __webpack_require__(/*! ./parent-dummy-chains */ "./node_modules/dagre/lib/parent-dummy-chains.js"); +var removeEmptyRanks = (__webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js").removeEmptyRanks); +var nestingGraph = __webpack_require__(/*! ./nesting-graph */ "./node_modules/dagre/lib/nesting-graph.js"); +var addBorderSegments = __webpack_require__(/*! ./add-border-segments */ "./node_modules/dagre/lib/add-border-segments.js"); +var coordinateSystem = __webpack_require__(/*! ./coordinate-system */ "./node_modules/dagre/lib/coordinate-system.js"); +var order = __webpack_require__(/*! ./order */ "./node_modules/dagre/lib/order/index.js"); +var position = __webpack_require__(/*! ./position */ "./node_modules/dagre/lib/position/index.js"); +var util = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js"); +var Graph = (__webpack_require__(/*! ./graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph); - var grid = new Array(sizeX); +module.exports = layout; - for (var i = 0; i < sizeX; i++) { - grid[i] = new Array(sizeY); - } +function layout(g, opts) { + var time = opts && opts.debugTiming ? util.time : util.notime; + time("layout", function() { + var layoutGraph = + time(" buildLayoutGraph", function() { return buildLayoutGraph(g); }); + time(" runLayout", function() { runLayout(layoutGraph, time); }); + time(" updateInputGraph", function() { updateInputGraph(g, layoutGraph); }); + }); +} - for (var i = 0; i < sizeX; i++) { - for (var j = 0; j < sizeY; j++) { - grid[i][j] = new Array(); - } - } +function runLayout(g, time) { + time(" makeSpaceForEdgeLabels", function() { makeSpaceForEdgeLabels(g); }); + time(" removeSelfEdges", function() { removeSelfEdges(g); }); + time(" acyclic", function() { acyclic.run(g); }); + time(" nestingGraph.run", function() { nestingGraph.run(g); }); + time(" rank", function() { rank(util.asNonCompoundGraph(g)); }); + time(" injectEdgeLabelProxies", function() { injectEdgeLabelProxies(g); }); + time(" removeEmptyRanks", function() { removeEmptyRanks(g); }); + time(" nestingGraph.cleanup", function() { nestingGraph.cleanup(g); }); + time(" normalizeRanks", function() { normalizeRanks(g); }); + time(" assignRankMinMax", function() { assignRankMinMax(g); }); + time(" removeEdgeLabelProxies", function() { removeEdgeLabelProxies(g); }); + time(" normalize.run", function() { normalize.run(g); }); + time(" parentDummyChains", function() { parentDummyChains(g); }); + time(" addBorderSegments", function() { addBorderSegments(g); }); + time(" order", function() { order(g); }); + time(" insertSelfEdges", function() { insertSelfEdges(g); }); + time(" adjustCoordinateSystem", function() { coordinateSystem.adjust(g); }); + time(" position", function() { position(g); }); + time(" positionSelfEdges", function() { positionSelfEdges(g); }); + time(" removeBorderNodes", function() { removeBorderNodes(g); }); + time(" normalize.undo", function() { normalize.undo(g); }); + time(" fixupEdgeLabelCoords", function() { fixupEdgeLabelCoords(g); }); + time(" undoCoordinateSystem", function() { coordinateSystem.undo(g); }); + time(" translateGraph", function() { translateGraph(g); }); + time(" assignNodeIntersects", function() { assignNodeIntersects(g); }); + time(" reversePoints", function() { reversePointsForReversedEdges(g); }); + time(" acyclic.undo", function() { acyclic.undo(g); }); +} - return grid; -}; +/* + * Copies final layout information from the layout graph back to the input + * graph. This process only copies whitelisted attributes from the layout graph + * to the input graph, so it serves as a good place to determine what + * attributes can influence layout. + */ +function updateInputGraph(inputGraph, layoutGraph) { + _.forEach(inputGraph.nodes(), function(v) { + var inputLabel = inputGraph.node(v); + var layoutLabel = layoutGraph.node(v); -FDLayout.prototype.addNodeToGrid = function (v, left, top) { + if (inputLabel) { + inputLabel.x = layoutLabel.x; + inputLabel.y = layoutLabel.y; - var startX = 0; - var finishX = 0; - var startY = 0; - var finishY = 0; + if (layoutGraph.children(v).length) { + inputLabel.width = layoutLabel.width; + inputLabel.height = layoutLabel.height; + } + } + }); - startX = parseInt(Math.floor((v.getRect().x - left) / this.repulsionRange)); - finishX = parseInt(Math.floor((v.getRect().width + v.getRect().x - left) / this.repulsionRange)); - startY = parseInt(Math.floor((v.getRect().y - top) / this.repulsionRange)); - finishY = parseInt(Math.floor((v.getRect().height + v.getRect().y - top) / this.repulsionRange)); + _.forEach(inputGraph.edges(), function(e) { + var inputLabel = inputGraph.edge(e); + var layoutLabel = layoutGraph.edge(e); - for (var i = startX; i <= finishX; i++) { - for (var j = startY; j <= finishY; j++) { - this.grid[i][j].push(v); - v.setGridCoordinates(startX, finishX, startY, finishY); + inputLabel.points = layoutLabel.points; + if (_.has(layoutLabel, "x")) { + inputLabel.x = layoutLabel.x; + inputLabel.y = layoutLabel.y; } - } -}; - -FDLayout.prototype.updateGrid = function () { - var i; - var nodeA; - var lNodes = this.getAllNodes(); + }); - this.grid = this.calcGrid(this.graphManager.getRoot()); + inputGraph.graph().width = layoutGraph.graph().width; + inputGraph.graph().height = layoutGraph.graph().height; +} - // put all nodes to proper grid cells - for (i = 0; i < lNodes.length; i++) { - nodeA = lNodes[i]; - this.addNodeToGrid(nodeA, this.graphManager.getRoot().getLeft(), this.graphManager.getRoot().getTop()); - } +var graphNumAttrs = ["nodesep", "edgesep", "ranksep", "marginx", "marginy"]; +var graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: "tb" }; +var graphAttrs = ["acyclicer", "ranker", "rankdir", "align"]; +var nodeNumAttrs = ["width", "height"]; +var nodeDefaults = { width: 0, height: 0 }; +var edgeNumAttrs = ["minlen", "weight", "width", "height", "labeloffset"]; +var edgeDefaults = { + minlen: 1, weight: 1, width: 0, height: 0, + labeloffset: 10, labelpos: "r" }; +var edgeAttrs = ["labelpos"]; -FDLayout.prototype.calculateRepulsionForceOfANode = function (nodeA, processedNodeSet, gridUpdateAllowed, forceToNodeSurroundingUpdate) { +/* + * Constructs a new graph from the input graph, which can be used for layout. + * This process copies only whitelisted attributes from the input graph to the + * layout graph. Thus this function serves as a good place to determine what + * attributes can influence layout. + */ +function buildLayoutGraph(inputGraph) { + var g = new Graph({ multigraph: true, compound: true }); + var graph = canonicalize(inputGraph.graph()); - if (this.totalIterations % FDLayoutConstants.GRID_CALCULATION_CHECK_PERIOD == 1 && gridUpdateAllowed || forceToNodeSurroundingUpdate) { - var surrounding = new Set(); - nodeA.surrounding = new Array(); - var nodeB; - var grid = this.grid; + g.setGraph(_.merge({}, + graphDefaults, + selectNumberAttrs(graph, graphNumAttrs), + _.pick(graph, graphAttrs))); - for (var i = nodeA.startX - 1; i < nodeA.finishX + 2; i++) { - for (var j = nodeA.startY - 1; j < nodeA.finishY + 2; j++) { - if (!(i < 0 || j < 0 || i >= grid.length || j >= grid[0].length)) { - for (var k = 0; k < grid[i][j].length; k++) { - nodeB = grid[i][j][k]; + _.forEach(inputGraph.nodes(), function(v) { + var node = canonicalize(inputGraph.node(v)); + g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults)); + g.setParent(v, inputGraph.parent(v)); + }); - // If both nodes are not members of the same graph, - // or both nodes are the same, skip. - if (nodeA.getOwner() != nodeB.getOwner() || nodeA == nodeB) { - continue; - } + _.forEach(inputGraph.edges(), function(e) { + var edge = canonicalize(inputGraph.edge(e)); + g.setEdge(e, _.merge({}, + edgeDefaults, + selectNumberAttrs(edge, edgeNumAttrs), + _.pick(edge, edgeAttrs))); + }); - // check if the repulsion force between - // nodeA and nodeB has already been calculated - if (!processedNodeSet.has(nodeB) && !surrounding.has(nodeB)) { - var distanceX = Math.abs(nodeA.getCenterX() - nodeB.getCenterX()) - (nodeA.getWidth() / 2 + nodeB.getWidth() / 2); - var distanceY = Math.abs(nodeA.getCenterY() - nodeB.getCenterY()) - (nodeA.getHeight() / 2 + nodeB.getHeight() / 2); + return g; +} - // if the distance between nodeA and nodeB - // is less then calculation range - if (distanceX <= this.repulsionRange && distanceY <= this.repulsionRange) { - //then add nodeB to surrounding of nodeA - surrounding.add(nodeB); - } - } - } - } +/* + * This idea comes from the Gansner paper: to account for edge labels in our + * layout we split each rank in half by doubling minlen and halving ranksep. + * Then we can place labels at these mid-points between nodes. + * + * We also add some minimal padding to the width to push the label for the edge + * away from the edge itself a bit. + */ +function makeSpaceForEdgeLabels(g) { + var graph = g.graph(); + graph.ranksep /= 2; + _.forEach(g.edges(), function(e) { + var edge = g.edge(e); + edge.minlen *= 2; + if (edge.labelpos.toLowerCase() !== "c") { + if (graph.rankdir === "TB" || graph.rankdir === "BT") { + edge.width += edge.labeloffset; + } else { + edge.height += edge.labeloffset; } } + }); +} + +/* + * Creates temporary dummy nodes that capture the rank in which each edge's + * label is going to, if it has one of non-zero width and height. We do this + * so that we can safely remove empty ranks while preserving balance for the + * label's position. + */ +function injectEdgeLabelProxies(g) { + _.forEach(g.edges(), function(e) { + var edge = g.edge(e); + if (edge.width && edge.height) { + var v = g.node(e.v); + var w = g.node(e.w); + var label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e }; + util.addDummyNode(g, "edge-proxy", label, "_ep"); + } + }); +} - nodeA.surrounding = [].concat(_toConsumableArray(surrounding)); - } - for (i = 0; i < nodeA.surrounding.length; i++) { - this.calcRepulsionForce(nodeA, nodeA.surrounding[i]); - } -}; +function assignRankMinMax(g) { + var maxRank = 0; + _.forEach(g.nodes(), function(v) { + var node = g.node(v); + if (node.borderTop) { + node.minRank = g.node(node.borderTop).rank; + node.maxRank = g.node(node.borderBottom).rank; + maxRank = _.max(maxRank, node.maxRank); + } + }); + g.graph().maxRank = maxRank; +} -FDLayout.prototype.calcRepulsionRange = function () { - return 0.0; -}; +function removeEdgeLabelProxies(g) { + _.forEach(g.nodes(), function(v) { + var node = g.node(v); + if (node.dummy === "edge-proxy") { + g.edge(node.e).labelRank = node.rank; + g.removeNode(v); + } + }); +} -module.exports = FDLayout; +function translateGraph(g) { + var minX = Number.POSITIVE_INFINITY; + var maxX = 0; + var minY = Number.POSITIVE_INFINITY; + var maxY = 0; + var graphLabel = g.graph(); + var marginX = graphLabel.marginx || 0; + var marginY = graphLabel.marginy || 0; -/***/ }), -/* 19 */ -/***/ (function(module, exports, __nested_webpack_require_103214__) { + function getExtremes(attrs) { + var x = attrs.x; + var y = attrs.y; + var w = attrs.width; + var h = attrs.height; + minX = Math.min(minX, x - w / 2); + maxX = Math.max(maxX, x + w / 2); + minY = Math.min(minY, y - h / 2); + maxY = Math.max(maxY, y + h / 2); + } -"use strict"; + _.forEach(g.nodes(), function(v) { getExtremes(g.node(v)); }); + _.forEach(g.edges(), function(e) { + var edge = g.edge(e); + if (_.has(edge, "x")) { + getExtremes(edge); + } + }); + minX -= marginX; + minY -= marginY; -var LEdge = __nested_webpack_require_103214__(1); -var FDLayoutConstants = __nested_webpack_require_103214__(4); + _.forEach(g.nodes(), function(v) { + var node = g.node(v); + node.x -= minX; + node.y -= minY; + }); -function FDLayoutEdge(source, target, vEdge) { - LEdge.call(this, source, target, vEdge); + _.forEach(g.edges(), function(e) { + var edge = g.edge(e); + _.forEach(edge.points, function(p) { + p.x -= minX; + p.y -= minY; + }); + if (_.has(edge, "x")) { edge.x -= minX; } + if (_.has(edge, "y")) { edge.y -= minY; } + }); - // Ideal length and elasticity value for this edge - this.idealLength = FDLayoutConstants.DEFAULT_EDGE_LENGTH; - this.edgeElasticity = FDLayoutConstants.DEFAULT_SPRING_STRENGTH; + graphLabel.width = maxX - minX + marginX; + graphLabel.height = maxY - minY + marginY; } -FDLayoutEdge.prototype = Object.create(LEdge.prototype); - -for (var prop in LEdge) { - FDLayoutEdge[prop] = LEdge[prop]; +function assignNodeIntersects(g) { + _.forEach(g.edges(), function(e) { + var edge = g.edge(e); + var nodeV = g.node(e.v); + var nodeW = g.node(e.w); + var p1, p2; + if (!edge.points) { + edge.points = []; + p1 = nodeW; + p2 = nodeV; + } else { + p1 = edge.points[0]; + p2 = edge.points[edge.points.length - 1]; + } + edge.points.unshift(util.intersectRect(nodeV, p1)); + edge.points.push(util.intersectRect(nodeW, p2)); + }); } -module.exports = FDLayoutEdge; - -/***/ }), -/* 20 */ -/***/ (function(module, exports, __nested_webpack_require_103820__) { - -"use strict"; - +function fixupEdgeLabelCoords(g) { + _.forEach(g.edges(), function(e) { + var edge = g.edge(e); + if (_.has(edge, "x")) { + if (edge.labelpos === "l" || edge.labelpos === "r") { + edge.width -= edge.labeloffset; + } + switch (edge.labelpos) { + case "l": edge.x -= edge.width / 2 + edge.labeloffset; break; + case "r": edge.x += edge.width / 2 + edge.labeloffset; break; + } + } + }); +} -var LNode = __nested_webpack_require_103820__(3); -var FDLayoutConstants = __nested_webpack_require_103820__(4); +function reversePointsForReversedEdges(g) { + _.forEach(g.edges(), function(e) { + var edge = g.edge(e); + if (edge.reversed) { + edge.points.reverse(); + } + }); +} -function FDLayoutNode(gm, loc, size, vNode) { - // alternative constructor is handled inside LNode - LNode.call(this, gm, loc, size, vNode); +function removeBorderNodes(g) { + _.forEach(g.nodes(), function(v) { + if (g.children(v).length) { + var node = g.node(v); + var t = g.node(node.borderTop); + var b = g.node(node.borderBottom); + var l = g.node(_.last(node.borderLeft)); + var r = g.node(_.last(node.borderRight)); - // Repulsion value of this node - this.nodeRepulsion = FDLayoutConstants.DEFAULT_REPULSION_STRENGTH; + node.width = Math.abs(r.x - l.x); + node.height = Math.abs(b.y - t.y); + node.x = l.x + node.width / 2; + node.y = t.y + node.height / 2; + } + }); - //Spring, repulsion and gravitational forces acting on this node - this.springForceX = 0; - this.springForceY = 0; - this.repulsionForceX = 0; - this.repulsionForceY = 0; - this.gravitationForceX = 0; - this.gravitationForceY = 0; - //Amount by which this node is to be moved in this iteration - this.displacementX = 0; - this.displacementY = 0; + _.forEach(g.nodes(), function(v) { + if (g.node(v).dummy === "border") { + g.removeNode(v); + } + }); +} - //Start and finish grid coordinates that this node is fallen into - this.startX = 0; - this.finishX = 0; - this.startY = 0; - this.finishY = 0; +function removeSelfEdges(g) { + _.forEach(g.edges(), function(e) { + if (e.v === e.w) { + var node = g.node(e.v); + if (!node.selfEdges) { + node.selfEdges = []; + } + node.selfEdges.push({ e: e, label: g.edge(e) }); + g.removeEdge(e); + } + }); +} - //Geometric neighbors of this node - this.surrounding = []; +function insertSelfEdges(g) { + var layers = util.buildLayerMatrix(g); + _.forEach(layers, function(layer) { + var orderShift = 0; + _.forEach(layer, function(v, i) { + var node = g.node(v); + node.order = i + orderShift; + _.forEach(node.selfEdges, function(selfEdge) { + util.addDummyNode(g, "selfedge", { + width: selfEdge.label.width, + height: selfEdge.label.height, + rank: node.rank, + order: i + (++orderShift), + e: selfEdge.e, + label: selfEdge.label + }, "_se"); + }); + delete node.selfEdges; + }); + }); } -FDLayoutNode.prototype = Object.create(LNode.prototype); +function positionSelfEdges(g) { + _.forEach(g.nodes(), function(v) { + var node = g.node(v); + if (node.dummy === "selfedge") { + var selfNode = g.node(node.e.v); + var x = selfNode.x + selfNode.width / 2; + var y = selfNode.y; + var dx = node.x - x; + var dy = selfNode.height / 2; + g.setEdge(node.e, node.label); + g.removeNode(v); + node.label.points = [ + { x: x + 2 * dx / 3, y: y - dy }, + { x: x + 5 * dx / 6, y: y - dy }, + { x: x + dx , y: y }, + { x: x + 5 * dx / 6, y: y + dy }, + { x: x + 2 * dx / 3, y: y + dy } + ]; + node.label.x = node.x; + node.label.y = node.y; + } + }); +} -for (var prop in LNode) { - FDLayoutNode[prop] = LNode[prop]; +function selectNumberAttrs(obj, attrs) { + return _.mapValues(_.pick(obj, attrs), Number); } -FDLayoutNode.prototype.setGridCoordinates = function (_startX, _finishX, _startY, _finishY) { - this.startX = _startX; - this.finishX = _finishX; - this.startY = _startY; - this.finishY = _finishY; -}; +function canonicalize(attrs) { + var newAttrs = {}; + _.forEach(attrs, function(v, k) { + newAttrs[k.toLowerCase()] = v; + }); + return newAttrs; +} -module.exports = FDLayoutNode; /***/ }), -/* 21 */ -/***/ (function(module, exports, __webpack_require__) { -"use strict"; +/***/ "./node_modules/dagre/lib/lodash.js": +/*!******************************************!*\ + !*** ./node_modules/dagre/lib/lodash.js ***! + \******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +/* global window */ -function DimensionD(width, height) { - this.width = 0; - this.height = 0; - if (width !== null && height !== null) { - this.height = height; - this.width = width; +var lodash; + +if (true) { + try { + lodash = { + cloneDeep: __webpack_require__(/*! lodash/cloneDeep */ "./node_modules/lodash/cloneDeep.js"), + constant: __webpack_require__(/*! lodash/constant */ "./node_modules/lodash/constant.js"), + defaults: __webpack_require__(/*! lodash/defaults */ "./node_modules/lodash/defaults.js"), + each: __webpack_require__(/*! lodash/each */ "./node_modules/lodash/each.js"), + filter: __webpack_require__(/*! lodash/filter */ "./node_modules/lodash/filter.js"), + find: __webpack_require__(/*! lodash/find */ "./node_modules/lodash/find.js"), + flatten: __webpack_require__(/*! lodash/flatten */ "./node_modules/lodash/flatten.js"), + forEach: __webpack_require__(/*! lodash/forEach */ "./node_modules/lodash/forEach.js"), + forIn: __webpack_require__(/*! lodash/forIn */ "./node_modules/lodash/forIn.js"), + has: __webpack_require__(/*! lodash/has */ "./node_modules/lodash/has.js"), + isUndefined: __webpack_require__(/*! lodash/isUndefined */ "./node_modules/lodash/isUndefined.js"), + last: __webpack_require__(/*! lodash/last */ "./node_modules/lodash/last.js"), + map: __webpack_require__(/*! lodash/map */ "./node_modules/lodash/map.js"), + mapValues: __webpack_require__(/*! lodash/mapValues */ "./node_modules/lodash/mapValues.js"), + max: __webpack_require__(/*! lodash/max */ "./node_modules/lodash/max.js"), + merge: __webpack_require__(/*! lodash/merge */ "./node_modules/lodash/merge.js"), + min: __webpack_require__(/*! lodash/min */ "./node_modules/lodash/min.js"), + minBy: __webpack_require__(/*! lodash/minBy */ "./node_modules/lodash/minBy.js"), + now: __webpack_require__(/*! lodash/now */ "./node_modules/lodash/now.js"), + pick: __webpack_require__(/*! lodash/pick */ "./node_modules/lodash/pick.js"), + range: __webpack_require__(/*! lodash/range */ "./node_modules/lodash/range.js"), + reduce: __webpack_require__(/*! lodash/reduce */ "./node_modules/lodash/reduce.js"), + sortBy: __webpack_require__(/*! lodash/sortBy */ "./node_modules/lodash/sortBy.js"), + uniqueId: __webpack_require__(/*! lodash/uniqueId */ "./node_modules/lodash/uniqueId.js"), + values: __webpack_require__(/*! lodash/values */ "./node_modules/lodash/values.js"), + zipObject: __webpack_require__(/*! lodash/zipObject */ "./node_modules/lodash/zipObject.js"), + }; + } catch (e) { + // continue regardless of error } } -DimensionD.prototype.getWidth = function () { - return this.width; -}; - -DimensionD.prototype.setWidth = function (width) { - this.width = width; -}; - -DimensionD.prototype.getHeight = function () { - return this.height; -}; +if (!lodash) { + lodash = window._; +} -DimensionD.prototype.setHeight = function (height) { - this.height = height; -}; +module.exports = lodash; -module.exports = DimensionD; /***/ }), -/* 22 */ -/***/ (function(module, exports, __nested_webpack_require_105759__) { - -"use strict"; +/***/ "./node_modules/dagre/lib/nesting-graph.js": +/*!*************************************************!*\ + !*** ./node_modules/dagre/lib/nesting-graph.js ***! + \*************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var UniqueIDGeneretor = __nested_webpack_require_105759__(14); - -function HashMap() { - this.map = {}; - this.keys = []; -} - -HashMap.prototype.put = function (key, value) { - var theId = UniqueIDGeneretor.createID(key); - if (!this.contains(theId)) { - this.map[theId] = value; - this.keys.push(key); - } -}; +var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); +var util = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js"); -HashMap.prototype.contains = function (key) { - var theId = UniqueIDGeneretor.createID(key); - return this.map[key] != null; +module.exports = { + run: run, + cleanup: cleanup }; -HashMap.prototype.get = function (key) { - var theId = UniqueIDGeneretor.createID(key); - return this.map[theId]; -}; +/* + * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs, + * adds appropriate edges to ensure that all cluster nodes are placed between + * these boundries, and ensures that the graph is connected. + * + * In addition we ensure, through the use of the minlen property, that nodes + * and subgraph border nodes to not end up on the same rank. + * + * Preconditions: + * + * 1. Input graph is a DAG + * 2. Nodes in the input graph has a minlen attribute + * + * Postconditions: + * + * 1. Input graph is connected. + * 2. Dummy nodes are added for the tops and bottoms of subgraphs. + * 3. The minlen attribute for nodes is adjusted to ensure nodes do not + * get placed on the same rank as subgraph border nodes. + * + * The nesting graph idea comes from Sander, "Layout of Compound Directed + * Graphs." + */ +function run(g) { + var root = util.addDummyNode(g, "root", {}, "_root"); + var depths = treeDepths(g); + var height = _.max(_.values(depths)) - 1; // Note: depths is an Object not an array + var nodeSep = 2 * height + 1; -HashMap.prototype.keySet = function () { - return this.keys; -}; + g.graph().nestingRoot = root; -module.exports = HashMap; + // Multiply minlen by nodeSep to align nodes on non-border ranks. + _.forEach(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; }); -/***/ }), -/* 23 */ -/***/ (function(module, exports, __nested_webpack_require_106487__) { + // Calculate a weight that is sufficient to keep subgraphs vertically compact + var weight = sumWeights(g) + 1; -"use strict"; + // Create border nodes and link them up + _.forEach(g.children(), function(child) { + dfs(g, root, nodeSep, weight, height, depths, child); + }); + // Save the multiplier for node layers for later removal of empty border + // layers. + g.graph().nodeRankFactor = nodeSep; +} -var UniqueIDGeneretor = __nested_webpack_require_106487__(14); +function dfs(g, root, nodeSep, weight, height, depths, v) { + var children = g.children(v); + if (!children.length) { + if (v !== root) { + g.setEdge(root, v, { weight: 0, minlen: nodeSep }); + } + return; + } -function HashSet() { - this.set = {}; -} -; + var top = util.addBorderNode(g, "_bt"); + var bottom = util.addBorderNode(g, "_bb"); + var label = g.node(v); -HashSet.prototype.add = function (obj) { - var theId = UniqueIDGeneretor.createID(obj); - if (!this.contains(theId)) this.set[theId] = obj; -}; + g.setParent(top, v); + label.borderTop = top; + g.setParent(bottom, v); + label.borderBottom = bottom; -HashSet.prototype.remove = function (obj) { - delete this.set[UniqueIDGeneretor.createID(obj)]; -}; + _.forEach(children, function(child) { + dfs(g, root, nodeSep, weight, height, depths, child); -HashSet.prototype.clear = function () { - this.set = {}; -}; + var childNode = g.node(child); + var childTop = childNode.borderTop ? childNode.borderTop : child; + var childBottom = childNode.borderBottom ? childNode.borderBottom : child; + var thisWeight = childNode.borderTop ? weight : 2 * weight; + var minlen = childTop !== childBottom ? 1 : height - depths[v] + 1; -HashSet.prototype.contains = function (obj) { - return this.set[UniqueIDGeneretor.createID(obj)] == obj; -}; + g.setEdge(top, childTop, { + weight: thisWeight, + minlen: minlen, + nestingEdge: true + }); -HashSet.prototype.isEmpty = function () { - return this.size() === 0; -}; + g.setEdge(childBottom, bottom, { + weight: thisWeight, + minlen: minlen, + nestingEdge: true + }); + }); -HashSet.prototype.size = function () { - return Object.keys(this.set).length; -}; + if (!g.parent(v)) { + g.setEdge(root, top, { weight: 0, minlen: height + depths[v] }); + } +} -//concats this.set to the given list -HashSet.prototype.addAllTo = function (list) { - var keys = Object.keys(this.set); - var length = keys.length; - for (var i = 0; i < length; i++) { - list.push(this.set[keys[i]]); +function treeDepths(g) { + var depths = {}; + function dfs(v, depth) { + var children = g.children(v); + if (children && children.length) { + _.forEach(children, function(child) { + dfs(child, depth + 1); + }); + } + depths[v] = depth; } -}; + _.forEach(g.children(), function(v) { dfs(v, 1); }); + return depths; +} -HashSet.prototype.size = function () { - return Object.keys(this.set).length; -}; +function sumWeights(g) { + return _.reduce(g.edges(), function(acc, e) { + return acc + g.edge(e).weight; + }, 0); +} -HashSet.prototype.addAll = function (list) { - var s = list.length; - for (var i = 0; i < s; i++) { - var v = list[i]; - this.add(v); - } -}; +function cleanup(g) { + var graphLabel = g.graph(); + g.removeNode(graphLabel.nestingRoot); + delete graphLabel.nestingRoot; + _.forEach(g.edges(), function(e) { + var edge = g.edge(e); + if (edge.nestingEdge) { + g.removeEdge(e); + } + }); +} -module.exports = HashSet; /***/ }), -/* 24 */ -/***/ (function(module, exports, __webpack_require__) { -"use strict"; +/***/ "./node_modules/dagre/lib/normalize.js": +/*!*********************************************!*\ + !*** ./node_modules/dagre/lib/normalize.js ***! + \*********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; -// Some matrix (1d and 2d array) operations -function Matrix() {} -/** - * matrix multiplication - * array1, array2 and result are 2d arrays - */ -Matrix.multMat = function (array1, array2) { - var result = []; +var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); +var util = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js"); - for (var i = 0; i < array1.length; i++) { - result[i] = []; - for (var j = 0; j < array2[0].length; j++) { - result[i][j] = 0; - for (var k = 0; k < array1[0].length; k++) { - result[i][j] += array1[i][k] * array2[k][j]; - } - } - } - return result; +module.exports = { + run: run, + undo: undo }; -/** - * matrix transpose - * array and result are 2d arrays +/* + * Breaks any long edges in the graph into short segments that span 1 layer + * each. This operation is undoable with the denormalize function. + * + * Pre-conditions: + * + * 1. The input graph is a DAG. + * 2. Each node in the graph has a "rank" property. + * + * Post-condition: + * + * 1. All edges in the graph have a length of 1. + * 2. Dummy nodes are added where edges have been split into segments. + * 3. The graph is augmented with a "dummyChains" attribute which contains + * the first dummy in each chain of dummy nodes produced. */ -Matrix.transpose = function (array) { - var result = []; +function run(g) { + g.graph().dummyChains = []; + _.forEach(g.edges(), function(edge) { normalizeEdge(g, edge); }); +} - for (var i = 0; i < array[0].length; i++) { - result[i] = []; - for (var j = 0; j < array.length; j++) { - result[i][j] = array[j][i]; - } - } +function normalizeEdge(g, e) { + var v = e.v; + var vRank = g.node(v).rank; + var w = e.w; + var wRank = g.node(w).rank; + var name = e.name; + var edgeLabel = g.edge(e); + var labelRank = edgeLabel.labelRank; - return result; -}; + if (wRank === vRank + 1) return; -/** - * multiply array with constant - * array and result are 1d arrays - */ -Matrix.multCons = function (array, constant) { - var result = []; + g.removeEdge(e); - for (var i = 0; i < array.length; i++) { - result[i] = array[i] * constant; + var dummy, attrs, i; + for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) { + edgeLabel.points = []; + attrs = { + width: 0, height: 0, + edgeLabel: edgeLabel, edgeObj: e, + rank: vRank + }; + dummy = util.addDummyNode(g, "edge", attrs, "_d"); + if (vRank === labelRank) { + attrs.width = edgeLabel.width; + attrs.height = edgeLabel.height; + attrs.dummy = "edge-label"; + attrs.labelpos = edgeLabel.labelpos; + } + g.setEdge(v, dummy, { weight: edgeLabel.weight }, name); + if (i === 0) { + g.graph().dummyChains.push(dummy); + } + v = dummy; } - return result; -}; + g.setEdge(v, w, { weight: edgeLabel.weight }, name); +} -/** - * substract two arrays - * array1, array2 and result are 1d arrays - */ -Matrix.minusOp = function (array1, array2) { - var result = []; +function undo(g) { + _.forEach(g.graph().dummyChains, function(v) { + var node = g.node(v); + var origLabel = node.edgeLabel; + var w; + g.setEdge(node.edgeObj, origLabel); + while (node.dummy) { + w = g.successors(v)[0]; + g.removeNode(v); + origLabel.points.push({ x: node.x, y: node.y }); + if (node.dummy === "edge-label") { + origLabel.x = node.x; + origLabel.y = node.y; + origLabel.width = node.width; + origLabel.height = node.height; + } + v = w; + node = g.node(v); + } + }); +} - for (var i = 0; i < array1.length; i++) { - result[i] = array1[i] - array2[i]; - } - return result; -}; +/***/ }), -/** - * dot product of two arrays with same size - * array1 and array2 are 1d arrays - */ -Matrix.dotProduct = function (array1, array2) { - var product = 0; +/***/ "./node_modules/dagre/lib/order/add-subgraph-constraints.js": +/*!******************************************************************!*\ + !*** ./node_modules/dagre/lib/order/add-subgraph-constraints.js ***! + \******************************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - for (var i = 0; i < array1.length; i++) { - product += array1[i] * array2[i]; - } +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); - return product; -}; +module.exports = addSubgraphConstraints; -/** - * magnitude of an array - * array is 1d array - */ -Matrix.mag = function (array) { - return Math.sqrt(this.dotProduct(array, array)); -}; +function addSubgraphConstraints(g, cg, vs) { + var prev = {}, + rootPrev; -/** - * normalization of an array - * array and result are 1d array - */ -Matrix.normalize = function (array) { - var result = []; - var magnitude = this.mag(array); + _.forEach(vs, function(v) { + var child = g.parent(v), + parent, + prevChild; + while (child) { + parent = g.parent(child); + if (parent) { + prevChild = prev[parent]; + prev[parent] = child; + } else { + prevChild = rootPrev; + rootPrev = child; + } + if (prevChild && prevChild !== child) { + cg.setEdge(prevChild, child); + return; + } + child = parent; + } + }); - for (var i = 0; i < array.length; i++) { - result[i] = array[i] / magnitude; + /* + function dfs(v) { + var children = v ? g.children(v) : g.children(); + if (children.length) { + var min = Number.POSITIVE_INFINITY, + subgraphs = []; + _.each(children, function(child) { + var childMin = dfs(child); + if (g.children(child).length) { + subgraphs.push({ v: child, order: childMin }); + } + min = Math.min(min, childMin); + }); + _.reduce(_.sortBy(subgraphs, "order"), function(prev, curr) { + cg.setEdge(prev.v, curr.v); + return curr; + }); + return min; + } + return g.node(v).order; } + dfs(undefined); + */ +} - return result; -}; -/** - * multiply an array with centering matrix - * array and result are 1d array - */ -Matrix.multGamma = function (array) { - var result = []; - var sum = 0; +/***/ }), - for (var i = 0; i < array.length; i++) { - sum += array[i]; - } +/***/ "./node_modules/dagre/lib/order/barycenter.js": +/*!****************************************************!*\ + !*** ./node_modules/dagre/lib/order/barycenter.js ***! + \****************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - sum *= -1 / array.length; +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); - for (var _i = 0; _i < array.length; _i++) { - result[_i] = sum + array[_i]; - } - return result; -}; +module.exports = barycenter; -/** - * a special matrix multiplication - * result = 0.5 * C * INV * C^T * array - * array and result are 1d, C and INV are 2d arrays - */ -Matrix.multL = function (array, C, INV) { - var result = []; - var temp1 = []; - var temp2 = []; +function barycenter(g, movable) { + return _.map(movable, function(v) { + var inV = g.inEdges(v); + if (!inV.length) { + return { v: v }; + } else { + var result = _.reduce(inV, function(acc, e) { + var edge = g.edge(e), + nodeU = g.node(e.v); + return { + sum: acc.sum + (edge.weight * nodeU.order), + weight: acc.weight + edge.weight + }; + }, { sum: 0, weight: 0 }); - // multiply by C^T - for (var i = 0; i < C[0].length; i++) { - var sum = 0; - for (var j = 0; j < C.length; j++) { - sum += -0.5 * C[j][i] * array[j]; - } - temp1[i] = sum; - } - // multiply the result by INV - for (var _i2 = 0; _i2 < INV.length; _i2++) { - var _sum = 0; - for (var _j = 0; _j < INV.length; _j++) { - _sum += INV[_i2][_j] * temp1[_j]; - } - temp2[_i2] = _sum; - } - // multiply the result by C - for (var _i3 = 0; _i3 < C.length; _i3++) { - var _sum2 = 0; - for (var _j2 = 0; _j2 < C[0].length; _j2++) { - _sum2 += C[_i3][_j2] * temp2[_j2]; + return { + v: v, + barycenter: result.sum / result.weight, + weight: result.weight + }; } - result[_i3] = _sum2; - } + }); +} - return result; -}; -module.exports = Matrix; /***/ }), -/* 25 */ -/***/ (function(module, exports, __nested_webpack_require_111039__) { - -"use strict"; +/***/ "./node_modules/dagre/lib/order/build-layer-graph.js": +/*!***********************************************************!*\ + !*** ./node_modules/dagre/lib/order/build-layer-graph.js ***! + \***********************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); +var Graph = (__webpack_require__(/*! ../graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +module.exports = buildLayerGraph; -/** - * A classic Quicksort algorithm with Hoare's partition - * - Works also on LinkedList objects +/* + * Constructs a graph that can be used to sort a layer of nodes. The graph will + * contain all base and subgraph nodes from the request layer in their original + * hierarchy and any edges that are incident on these nodes and are of the type + * requested by the "relationship" parameter. * - * Copyright: i-Vis Research Group, Bilkent University, 2007 - present + * Nodes from the requested rank that do not have parents are assigned a root + * node in the output graph, which is set in the root graph attribute. This + * makes it easy to walk the hierarchy of movable nodes during ordering. + * + * Pre-conditions: + * + * 1. Input graph is a DAG + * 2. Base nodes in the input graph have a rank attribute + * 3. Subgraph nodes in the input graph has minRank and maxRank attributes + * 4. Edges have an assigned weight + * + * Post-conditions: + * + * 1. Output graph has all nodes in the movable rank with preserved + * hierarchy. + * 2. Root nodes in the movable layer are made children of the node + * indicated by the root attribute of the graph. + * 3. Non-movable nodes incident on movable nodes, selected by the + * relationship parameter, are included in the graph (without hierarchy). + * 4. Edges incident on movable nodes, selected by the relationship + * parameter, are added to the output graph. + * 5. The weights for copied edges are aggregated as need, since the output + * graph is not a multi-graph. */ +function buildLayerGraph(g, rank, relationship) { + var root = createRootNode(g), + result = new Graph({ compound: true }).setGraph({ root: root }) + .setDefaultNodeLabel(function(v) { return g.node(v); }); -var LinkedList = __nested_webpack_require_111039__(11); - -var Quicksort = function () { - function Quicksort(A, compareFunction) { - _classCallCheck(this, Quicksort); + _.forEach(g.nodes(), function(v) { + var node = g.node(v), + parent = g.parent(v); - if (compareFunction !== null || compareFunction !== undefined) this.compareFunction = this._defaultCompareFunction; + if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) { + result.setNode(v); + result.setParent(v, parent || root); - var length = void 0; - if (A instanceof LinkedList) length = A.size();else length = A.length; + // This assumes we have only short edges! + _.forEach(g[relationship](v), function(e) { + var u = e.v === v ? e.w : e.v, + edge = result.edge(u, v), + weight = !_.isUndefined(edge) ? edge.weight : 0; + result.setEdge(u, v, { weight: g.edge(e).weight + weight }); + }); - this._quicksort(A, 0, length - 1); + if (_.has(node, "minRank")) { + result.setNode(v, { + borderLeft: node.borderLeft[rank], + borderRight: node.borderRight[rank] + }); + } } + }); - _createClass(Quicksort, [{ - key: '_quicksort', - value: function _quicksort(A, p, r) { - if (p < r) { - var q = this._partition(A, p, r); - this._quicksort(A, p, q); - this._quicksort(A, q + 1, r); - } - } - }, { - key: '_partition', - value: function _partition(A, p, r) { - var x = this._get(A, p); - var i = p; - var j = r; - while (true) { - while (this.compareFunction(x, this._get(A, j))) { - j--; - }while (this.compareFunction(this._get(A, i), x)) { - i++; - }if (i < j) { - this._swap(A, i, j); - i++; - j--; - } else return j; - } - } - }, { - key: '_get', - value: function _get(object, index) { - if (object instanceof LinkedList) return object.get_object_at(index);else return object[index]; - } - }, { - key: '_set', - value: function _set(object, index, value) { - if (object instanceof LinkedList) object.set_object_at(index, value);else object[index] = value; - } - }, { - key: '_swap', - value: function _swap(A, i, j) { - var temp = this._get(A, i); - this._set(A, i, this._get(A, j)); - this._set(A, j, temp); - } - }, { - key: '_defaultCompareFunction', - value: function _defaultCompareFunction(a, b) { - return b > a; - } - }]); + return result; +} - return Quicksort; -}(); +function createRootNode(g) { + var v; + while (g.hasNode((v = _.uniqueId("_root")))); + return v; +} -module.exports = Quicksort; /***/ }), -/* 26 */ -/***/ (function(module, exports, __webpack_require__) { + +/***/ "./node_modules/dagre/lib/order/cross-count.js": +/*!*****************************************************!*\ + !*** ./node_modules/dagre/lib/order/cross-count.js ***! + \*****************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; -// Singular Value Decomposition implementation -function SVD() {}; +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); + +module.exports = crossCount; + +/* + * A function that takes a layering (an array of layers, each with an array of + * ordererd nodes) and a graph and returns a weighted crossing count. + * + * Pre-conditions: + * + * 1. Input graph must be simple (not a multigraph), directed, and include + * only simple edges. + * 2. Edges in the input graph must have assigned weights. + * + * Post-conditions: + * + * 1. The graph and layering matrix are left unchanged. + * + * This algorithm is derived from Barth, et al., "Bilayer Cross Counting." + */ +function crossCount(g, layering) { + var cc = 0; + for (var i = 1; i < layering.length; ++i) { + cc += twoLayerCrossCount(g, layering[i-1], layering[i]); + } + return cc; +} + +function twoLayerCrossCount(g, northLayer, southLayer) { + // Sort all of the edges between the north and south layers by their position + // in the north layer and then the south. Map these edges to the position of + // their head in the south layer. + var southPos = _.zipObject(southLayer, + _.map(southLayer, function (v, i) { return i; })); + var southEntries = _.flatten(_.map(northLayer, function(v) { + return _.sortBy(_.map(g.outEdges(v), function(e) { + return { pos: southPos[e.w], weight: g.edge(e).weight }; + }), "pos"); + }), true); + + // Build the accumulator tree + var firstIndex = 1; + while (firstIndex < southLayer.length) firstIndex <<= 1; + var treeSize = 2 * firstIndex - 1; + firstIndex -= 1; + var tree = _.map(new Array(treeSize), function() { return 0; }); + + // Calculate the weighted crossings + var cc = 0; + _.forEach(southEntries.forEach(function(entry) { + var index = entry.pos + firstIndex; + tree[index] += entry.weight; + var weightSum = 0; + while (index > 0) { + if (index % 2) { + weightSum += tree[index + 1]; + } + index = (index - 1) >> 1; + tree[index] += entry.weight; + } + cc += entry.weight * weightSum; + })); + + return cc; +} + -/* Below singular value decomposition (svd) code including hypot function is adopted from https://github.com/dragonfly-ai/JamaJS - Some changes are applied to make the code compatible with the fcose code and to make it independent from Jama. - Input matrix is changed to a 2D array instead of Jama matrix. Matrix dimensions are taken according to 2D array instead of using Jama functions. - An object that includes singular value components is created for return. - The types of input parameters of the hypot function are removed. - let is used instead of var for the variable initialization. -*/ -/* - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +/***/ }), - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +/***/ "./node_modules/dagre/lib/order/index.js": +/*!***********************************************!*\ + !*** ./node_modules/dagre/lib/order/index.js ***! + \***********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - 1. Definitions. +"use strict"; - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); +var initOrder = __webpack_require__(/*! ./init-order */ "./node_modules/dagre/lib/order/init-order.js"); +var crossCount = __webpack_require__(/*! ./cross-count */ "./node_modules/dagre/lib/order/cross-count.js"); +var sortSubgraph = __webpack_require__(/*! ./sort-subgraph */ "./node_modules/dagre/lib/order/sort-subgraph.js"); +var buildLayerGraph = __webpack_require__(/*! ./build-layer-graph */ "./node_modules/dagre/lib/order/build-layer-graph.js"); +var addSubgraphConstraints = __webpack_require__(/*! ./add-subgraph-constraints */ "./node_modules/dagre/lib/order/add-subgraph-constraints.js"); +var Graph = (__webpack_require__(/*! ../graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph); +var util = __webpack_require__(/*! ../util */ "./node_modules/dagre/lib/util.js"); - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +module.exports = order; - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +/* + * Applies heuristics to minimize edge crossings in the graph and sets the best + * order solution as an order attribute on each node. + * + * Pre-conditions: + * + * 1. Graph must be DAG + * 2. Graph nodes must be objects with a "rank" attribute + * 3. Graph edges must have the "weight" attribute + * + * Post-conditions: + * + * 1. Graph nodes will have an "order" attribute based on the results of the + * algorithm. + */ +function order(g) { + var maxRank = util.maxRank(g), + downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), "inEdges"), + upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), "outEdges"); - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. + var layering = initOrder(g); + assignOrder(g, layering); - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. + var bestCC = Number.POSITIVE_INFINITY, + best; - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). + for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) { + sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2); - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. + layering = util.buildLayerMatrix(g); + var cc = crossCount(g, layering); + if (cc < bestCC) { + lastBest = 0; + best = _.cloneDeep(layering); + bestCC = cc; + } + } - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." + assignOrder(g, best); +} - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +function buildLayerGraphs(g, ranks, relationship) { + return _.map(ranks, function(rank) { + return buildLayerGraph(g, rank, relationship); + }); +} - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +function sweepLayerGraphs(layerGraphs, biasRight) { + var cg = new Graph(); + _.forEach(layerGraphs, function(lg) { + var root = lg.graph().root; + var sorted = sortSubgraph(lg, root, cg, biasRight); + _.forEach(sorted.vs, function(v, i) { + lg.node(v).order = i; + }); + addSubgraphConstraints(lg, cg, sorted.vs); + }); +} - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +function assignOrder(g, layering) { + _.forEach(layering, function(layer) { + _.forEach(layer, function(v, i) { + g.node(v).order = i; + }); + }); +} - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +/***/ }), - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +/***/ "./node_modules/dagre/lib/order/init-order.js": +/*!****************************************************!*\ + !*** ./node_modules/dagre/lib/order/init-order.js ***! + \****************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +"use strict"; - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +module.exports = initOrder; - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +/* + * Assigns an initial order value for each node by performing a DFS search + * starting from nodes in the first rank. Nodes are assigned an order in their + * rank as they are first visited. + * + * This approach comes from Gansner, et al., "A Technique for Drawing Directed + * Graphs." + * + * Returns a layering matrix with an array per layer and each layer sorted by + * the order of its nodes. + */ +function initOrder(g) { + var visited = {}; + var simpleNodes = _.filter(g.nodes(), function(v) { + return !g.children(v).length; + }); + var maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })); + var layers = _.map(_.range(maxRank + 1), function() { return []; }); - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. + function dfs(v) { + if (_.has(visited, v)) return; + visited[v] = true; + var node = g.node(v); + layers[node.rank].push(v); + _.forEach(g.successors(v), dfs); + } - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. + var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; }); + _.forEach(orderedVs, dfs); - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. + return layers; +} - END OF TERMS AND CONDITIONS - APPENDIX: How to apply the Apache License to your work. +/***/ }), - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +/***/ "./node_modules/dagre/lib/order/resolve-conflicts.js": +/*!***********************************************************!*\ + !*** ./node_modules/dagre/lib/order/resolve-conflicts.js ***! + \***********************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - Copyright {yyyy} {name of copyright owner} +"use strict"; - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ +module.exports = resolveConflicts; -SVD.svd = function (A) { - this.U = null; - this.V = null; - this.s = null; - this.m = 0; - this.n = 0; - this.m = A.length; - this.n = A[0].length; - var nu = Math.min(this.m, this.n); - this.s = function (s) { - var a = []; - while (s-- > 0) { - a.push(0); - }return a; - }(Math.min(this.m + 1, this.n)); - this.U = function (dims) { - var allocate = function allocate(dims) { - if (dims.length == 0) { - return 0; - } else { - var array = []; - for (var i = 0; i < dims[0]; i++) { - array.push(allocate(dims.slice(1))); - } - return array; - } - }; - return allocate(dims); - }([this.m, nu]); - this.V = function (dims) { - var allocate = function allocate(dims) { - if (dims.length == 0) { - return 0; - } else { - var array = []; - for (var i = 0; i < dims[0]; i++) { - array.push(allocate(dims.slice(1))); - } - return array; - } +/* + * Given a list of entries of the form {v, barycenter, weight} and a + * constraint graph this function will resolve any conflicts between the + * constraint graph and the barycenters for the entries. If the barycenters for + * an entry would violate a constraint in the constraint graph then we coalesce + * the nodes in the conflict into a new node that respects the contraint and + * aggregates barycenter and weight information. + * + * This implementation is based on the description in Forster, "A Fast and + * Simple Hueristic for Constrained Two-Level Crossing Reduction," thought it + * differs in some specific details. + * + * Pre-conditions: + * + * 1. Each entry has the form {v, barycenter, weight}, or if the node has + * no barycenter, then {v}. + * + * Returns: + * + * A new list of entries of the form {vs, i, barycenter, weight}. The list + * `vs` may either be a singleton or it may be an aggregation of nodes + * ordered such that they do not violate constraints from the constraint + * graph. The property `i` is the lowest original index of any of the + * elements in `vs`. + */ +function resolveConflicts(entries, cg) { + var mappedEntries = {}; + _.forEach(entries, function(entry, i) { + var tmp = mappedEntries[entry.v] = { + indegree: 0, + "in": [], + out: [], + vs: [entry.v], + i: i }; - return allocate(dims); - }([this.n, this.n]); - var e = function (s) { - var a = []; - while (s-- > 0) { - a.push(0); - }return a; - }(this.n); - var work = function (s) { - var a = []; - while (s-- > 0) { - a.push(0); - }return a; - }(this.m); - var wantu = true; - var wantv = true; - var nct = Math.min(this.m - 1, this.n); - var nrt = Math.max(0, Math.min(this.n - 2, this.m)); - for (var k = 0; k < Math.max(nct, nrt); k++) { - if (k < nct) { - this.s[k] = 0; - for (var i = k; i < this.m; i++) { - this.s[k] = SVD.hypot(this.s[k], A[i][k]); - } - ; - if (this.s[k] !== 0.0) { - if (A[k][k] < 0.0) { - this.s[k] = -this.s[k]; - } - for (var _i = k; _i < this.m; _i++) { - A[_i][k] /= this.s[k]; - } - ; - A[k][k] += 1.0; - } - this.s[k] = -this.s[k]; - } - for (var j = k + 1; j < this.n; j++) { - if (function (lhs, rhs) { - return lhs && rhs; - }(k < nct, this.s[k] !== 0.0)) { - var t = 0; - for (var _i2 = k; _i2 < this.m; _i2++) { - t += A[_i2][k] * A[_i2][j]; - } - ; - t = -t / A[k][k]; - for (var _i3 = k; _i3 < this.m; _i3++) { - A[_i3][j] += t * A[_i3][k]; - } - ; - } - e[j] = A[k][j]; - } - ; - if (function (lhs, rhs) { - return lhs && rhs; - }(wantu, k < nct)) { - for (var _i4 = k; _i4 < this.m; _i4++) { - this.U[_i4][k] = A[_i4][k]; - } - ; - } - if (k < nrt) { - e[k] = 0; - for (var _i5 = k + 1; _i5 < this.n; _i5++) { - e[k] = SVD.hypot(e[k], e[_i5]); - } - ; - if (e[k] !== 0.0) { - if (e[k + 1] < 0.0) { - e[k] = -e[k]; - } - for (var _i6 = k + 1; _i6 < this.n; _i6++) { - e[_i6] /= e[k]; - } - ; - e[k + 1] += 1.0; - } - e[k] = -e[k]; - if (function (lhs, rhs) { - return lhs && rhs; - }(k + 1 < this.m, e[k] !== 0.0)) { - for (var _i7 = k + 1; _i7 < this.m; _i7++) { - work[_i7] = 0.0; - } - ; - for (var _j = k + 1; _j < this.n; _j++) { - for (var _i8 = k + 1; _i8 < this.m; _i8++) { - work[_i8] += e[_j] * A[_i8][_j]; - } - ; - } - ; - for (var _j2 = k + 1; _j2 < this.n; _j2++) { - var _t = -e[_j2] / e[k + 1]; - for (var _i9 = k + 1; _i9 < this.m; _i9++) { - A[_i9][_j2] += _t * work[_i9]; - } - ; - } - ; - } - if (wantv) { - for (var _i10 = k + 1; _i10 < this.n; _i10++) { - this.V[_i10][k] = e[_i10]; - }; - } + if (!_.isUndefined(entry.barycenter)) { + tmp.barycenter = entry.barycenter; + tmp.weight = entry.weight; } - }; - var p = Math.min(this.n, this.m + 1); - if (nct < this.n) { - this.s[nct] = A[nct][nct]; - } - if (this.m < p) { - this.s[p - 1] = 0.0; - } - if (nrt + 1 < p) { - e[nrt] = A[nrt][p - 1]; - } - e[p - 1] = 0.0; - if (wantu) { - for (var _j3 = nct; _j3 < nu; _j3++) { - for (var _i11 = 0; _i11 < this.m; _i11++) { - this.U[_i11][_j3] = 0.0; + }); + + _.forEach(cg.edges(), function(e) { + var entryV = mappedEntries[e.v]; + var entryW = mappedEntries[e.w]; + if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) { + entryW.indegree++; + entryV.out.push(mappedEntries[e.w]); + } + }); + + var sourceSet = _.filter(mappedEntries, function(entry) { + return !entry.indegree; + }); + + return doResolveConflicts(sourceSet); +} + +function doResolveConflicts(sourceSet) { + var entries = []; + + function handleIn(vEntry) { + return function(uEntry) { + if (uEntry.merged) { + return; } - ; - this.U[_j3][_j3] = 1.0; - }; - for (var _k = nct - 1; _k >= 0; _k--) { - if (this.s[_k] !== 0.0) { - for (var _j4 = _k + 1; _j4 < nu; _j4++) { - var _t2 = 0; - for (var _i12 = _k; _i12 < this.m; _i12++) { - _t2 += this.U[_i12][_k] * this.U[_i12][_j4]; - }; - _t2 = -_t2 / this.U[_k][_k]; - for (var _i13 = _k; _i13 < this.m; _i13++) { - this.U[_i13][_j4] += _t2 * this.U[_i13][_k]; - }; - }; - for (var _i14 = _k; _i14 < this.m; _i14++) { - this.U[_i14][_k] = -this.U[_i14][_k]; - }; - this.U[_k][_k] = 1.0 + this.U[_k][_k]; - for (var _i15 = 0; _i15 < _k - 1; _i15++) { - this.U[_i15][_k] = 0.0; - }; - } else { - for (var _i16 = 0; _i16 < this.m; _i16++) { - this.U[_i16][_k] = 0.0; - }; - this.U[_k][_k] = 1.0; + if (_.isUndefined(uEntry.barycenter) || + _.isUndefined(vEntry.barycenter) || + uEntry.barycenter >= vEntry.barycenter) { + mergeEntries(vEntry, uEntry); } }; } - if (wantv) { - for (var _k2 = this.n - 1; _k2 >= 0; _k2--) { - if (function (lhs, rhs) { - return lhs && rhs; - }(_k2 < nrt, e[_k2] !== 0.0)) { - for (var _j5 = _k2 + 1; _j5 < nu; _j5++) { - var _t3 = 0; - for (var _i17 = _k2 + 1; _i17 < this.n; _i17++) { - _t3 += this.V[_i17][_k2] * this.V[_i17][_j5]; - }; - _t3 = -_t3 / this.V[_k2 + 1][_k2]; - for (var _i18 = _k2 + 1; _i18 < this.n; _i18++) { - this.V[_i18][_j5] += _t3 * this.V[_i18][_k2]; - }; - }; + + function handleOut(vEntry) { + return function(wEntry) { + wEntry["in"].push(vEntry); + if (--wEntry.indegree === 0) { + sourceSet.push(wEntry); } - for (var _i19 = 0; _i19 < this.n; _i19++) { - this.V[_i19][_k2] = 0.0; - }; - this.V[_k2][_k2] = 1.0; }; } - var pp = p - 1; - var iter = 0; - var eps = Math.pow(2.0, -52.0); - var tiny = Math.pow(2.0, -966.0); - while (p > 0) { - var _k3 = void 0; - var kase = void 0; - for (_k3 = p - 2; _k3 >= -1; _k3--) { - if (_k3 === -1) { - break; - } - if (Math.abs(e[_k3]) <= tiny + eps * (Math.abs(this.s[_k3]) + Math.abs(this.s[_k3 + 1]))) { - e[_k3] = 0.0; - break; - } - }; - if (_k3 === p - 2) { - kase = 4; - } else { - var ks = void 0; - for (ks = p - 1; ks >= _k3; ks--) { - if (ks === _k3) { - break; - } - var _t4 = (ks !== p ? Math.abs(e[ks]) : 0.0) + (ks !== _k3 + 1 ? Math.abs(e[ks - 1]) : 0.0); - if (Math.abs(this.s[ks]) <= tiny + eps * _t4) { - this.s[ks] = 0.0; - break; - } - }; - if (ks === _k3) { - kase = 3; - } else if (ks === p - 1) { - kase = 1; - } else { - kase = 2; - _k3 = ks; - } - } - _k3++; - switch (kase) { - case 1: - { - var f = e[p - 2]; - e[p - 2] = 0.0; - for (var _j6 = p - 2; _j6 >= _k3; _j6--) { - var _t5 = SVD.hypot(this.s[_j6], f); - var cs = this.s[_j6] / _t5; - var sn = f / _t5; - this.s[_j6] = _t5; - if (_j6 !== _k3) { - f = -sn * e[_j6 - 1]; - e[_j6 - 1] = cs * e[_j6 - 1]; - } - if (wantv) { - for (var _i20 = 0; _i20 < this.n; _i20++) { - _t5 = cs * this.V[_i20][_j6] + sn * this.V[_i20][p - 1]; - this.V[_i20][p - 1] = -sn * this.V[_i20][_j6] + cs * this.V[_i20][p - 1]; - this.V[_i20][_j6] = _t5; - }; - } - }; - }; - break; - case 2: - { - var _f = e[_k3 - 1]; - e[_k3 - 1] = 0.0; - for (var _j7 = _k3; _j7 < p; _j7++) { - var _t6 = SVD.hypot(this.s[_j7], _f); - var _cs = this.s[_j7] / _t6; - var _sn = _f / _t6; - this.s[_j7] = _t6; - _f = -_sn * e[_j7]; - e[_j7] = _cs * e[_j7]; - if (wantu) { - for (var _i21 = 0; _i21 < this.m; _i21++) { - _t6 = _cs * this.U[_i21][_j7] + _sn * this.U[_i21][_k3 - 1]; - this.U[_i21][_k3 - 1] = -_sn * this.U[_i21][_j7] + _cs * this.U[_i21][_k3 - 1]; - this.U[_i21][_j7] = _t6; - }; - } - }; - }; - break; - case 3: - { - var scale = Math.max(Math.max(Math.max(Math.max(Math.abs(this.s[p - 1]), Math.abs(this.s[p - 2])), Math.abs(e[p - 2])), Math.abs(this.s[_k3])), Math.abs(e[_k3])); - var sp = this.s[p - 1] / scale; - var spm1 = this.s[p - 2] / scale; - var epm1 = e[p - 2] / scale; - var sk = this.s[_k3] / scale; - var ek = e[_k3] / scale; - var b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2.0; - var c = sp * epm1 * (sp * epm1); - var shift = 0.0; - if (function (lhs, rhs) { - return lhs || rhs; - }(b !== 0.0, c !== 0.0)) { - shift = Math.sqrt(b * b + c); - if (b < 0.0) { - shift = -shift; - } - shift = c / (b + shift); - } - var _f2 = (sk + sp) * (sk - sp) + shift; - var g = sk * ek; - for (var _j8 = _k3; _j8 < p - 1; _j8++) { - var _t7 = SVD.hypot(_f2, g); - var _cs2 = _f2 / _t7; - var _sn2 = g / _t7; - if (_j8 !== _k3) { - e[_j8 - 1] = _t7; - } - _f2 = _cs2 * this.s[_j8] + _sn2 * e[_j8]; - e[_j8] = _cs2 * e[_j8] - _sn2 * this.s[_j8]; - g = _sn2 * this.s[_j8 + 1]; - this.s[_j8 + 1] = _cs2 * this.s[_j8 + 1]; - if (wantv) { - for (var _i22 = 0; _i22 < this.n; _i22++) { - _t7 = _cs2 * this.V[_i22][_j8] + _sn2 * this.V[_i22][_j8 + 1]; - this.V[_i22][_j8 + 1] = -_sn2 * this.V[_i22][_j8] + _cs2 * this.V[_i22][_j8 + 1]; - this.V[_i22][_j8] = _t7; - }; - } - _t7 = SVD.hypot(_f2, g); - _cs2 = _f2 / _t7; - _sn2 = g / _t7; - this.s[_j8] = _t7; - _f2 = _cs2 * e[_j8] + _sn2 * this.s[_j8 + 1]; - this.s[_j8 + 1] = -_sn2 * e[_j8] + _cs2 * this.s[_j8 + 1]; - g = _sn2 * e[_j8 + 1]; - e[_j8 + 1] = _cs2 * e[_j8 + 1]; - if (wantu && _j8 < this.m - 1) { - for (var _i23 = 0; _i23 < this.m; _i23++) { - _t7 = _cs2 * this.U[_i23][_j8] + _sn2 * this.U[_i23][_j8 + 1]; - this.U[_i23][_j8 + 1] = -_sn2 * this.U[_i23][_j8] + _cs2 * this.U[_i23][_j8 + 1]; - this.U[_i23][_j8] = _t7; - }; - } - }; - e[p - 2] = _f2; - iter = iter + 1; - }; - break; - case 4: - { - if (this.s[_k3] <= 0.0) { - this.s[_k3] = this.s[_k3] < 0.0 ? -this.s[_k3] : 0.0; - if (wantv) { - for (var _i24 = 0; _i24 <= pp; _i24++) { - this.V[_i24][_k3] = -this.V[_i24][_k3]; - }; - } - } - while (_k3 < pp) { - if (this.s[_k3] >= this.s[_k3 + 1]) { - break; - } - var _t8 = this.s[_k3]; - this.s[_k3] = this.s[_k3 + 1]; - this.s[_k3 + 1] = _t8; - if (wantv && _k3 < this.n - 1) { - for (var _i25 = 0; _i25 < this.n; _i25++) { - _t8 = this.V[_i25][_k3 + 1]; - this.V[_i25][_k3 + 1] = this.V[_i25][_k3]; - this.V[_i25][_k3] = _t8; - }; - } - if (wantu && _k3 < this.m - 1) { - for (var _i26 = 0; _i26 < this.m; _i26++) { - _t8 = this.U[_i26][_k3 + 1]; - this.U[_i26][_k3 + 1] = this.U[_i26][_k3]; - this.U[_i26][_k3] = _t8; - }; - } - _k3++; - }; - iter = 0; - p--; - }; - break; - } - }; - var result = { U: this.U, V: this.V, S: this.s }; - return result; -}; -// sqrt(a^2 + b^2) without under/overflow. -SVD.hypot = function (a, b) { - var r = void 0; - if (Math.abs(a) > Math.abs(b)) { - r = b / a; - r = Math.abs(a) * Math.sqrt(1 + r * r); - } else if (b != 0) { - r = a / b; - r = Math.abs(b) * Math.sqrt(1 + r * r); - } else { - r = 0.0; + while (sourceSet.length) { + var entry = sourceSet.pop(); + entries.push(entry); + _.forEach(entry["in"].reverse(), handleIn(entry)); + _.forEach(entry.out, handleOut(entry)); } - return r; -}; -module.exports = SVD; + return _.map(_.filter(entries, function(entry) { return !entry.merged; }), + function(entry) { + return _.pick(entry, ["vs", "i", "barycenter", "weight"]); + }); + +} + +function mergeEntries(target, source) { + var sum = 0; + var weight = 0; + + if (target.weight) { + sum += target.barycenter * target.weight; + weight += target.weight; + } + + if (source.weight) { + sum += source.barycenter * source.weight; + weight += source.weight; + } + + target.vs = source.vs.concat(target.vs); + target.barycenter = sum / weight; + target.weight = weight; + target.i = Math.min(source.i, target.i); + source.merged = true; +} + /***/ }), -/* 27 */ -/***/ (function(module, exports, __webpack_require__) { -"use strict"; +/***/ "./node_modules/dagre/lib/order/sort-subgraph.js": +/*!*******************************************************!*\ + !*** ./node_modules/dagre/lib/order/sort-subgraph.js ***! + \*******************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); +var barycenter = __webpack_require__(/*! ./barycenter */ "./node_modules/dagre/lib/order/barycenter.js"); +var resolveConflicts = __webpack_require__(/*! ./resolve-conflicts */ "./node_modules/dagre/lib/order/resolve-conflicts.js"); +var sort = __webpack_require__(/*! ./sort */ "./node_modules/dagre/lib/order/sort.js"); -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); +module.exports = sortSubgraph; -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function sortSubgraph(g, v, cg, biasRight) { + var movable = g.children(v); + var node = g.node(v); + var bl = node ? node.borderLeft : undefined; + var br = node ? node.borderRight: undefined; + var subgraphs = {}; -/** - * Needleman-Wunsch algorithm is an procedure to compute the optimal global alignment of two string - * sequences by S.B.Needleman and C.D.Wunsch (1970). - * - * Aside from the inputs, you can assign the scores for, - * - Match: The two characters at the current index are same. - * - Mismatch: The two characters at the current index are different. - * - Insertion/Deletion(gaps): The best alignment involves one letter aligning to a gap in the other string. - */ + if (bl) { + movable = _.filter(movable, function(w) { + return w !== bl && w !== br; + }); + } -var NeedlemanWunsch = function () { - function NeedlemanWunsch(sequence1, sequence2) { - var match_score = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; - var mismatch_penalty = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : -1; - var gap_penalty = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : -1; + var barycenters = barycenter(g, movable); + _.forEach(barycenters, function(entry) { + if (g.children(entry.v).length) { + var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight); + subgraphs[entry.v] = subgraphResult; + if (_.has(subgraphResult, "barycenter")) { + mergeBarycenters(entry, subgraphResult); + } + } + }); - _classCallCheck(this, NeedlemanWunsch); + var entries = resolveConflicts(barycenters, cg); + expandSubgraphs(entries, subgraphs); - this.sequence1 = sequence1; - this.sequence2 = sequence2; - this.match_score = match_score; - this.mismatch_penalty = mismatch_penalty; - this.gap_penalty = gap_penalty; + var result = sort(entries, biasRight); - // Just the remove redundancy - this.iMax = sequence1.length + 1; - this.jMax = sequence2.length + 1; + if (bl) { + result.vs = _.flatten([bl, result.vs, br], true); + if (g.predecessors(bl).length) { + var blPred = g.node(g.predecessors(bl)[0]), + brPred = g.node(g.predecessors(br)[0]); + if (!_.has(result, "barycenter")) { + result.barycenter = 0; + result.weight = 0; + } + result.barycenter = (result.barycenter * result.weight + + blPred.order + brPred.order) / (result.weight + 2); + result.weight += 2; + } + } - // Grid matrix of scores - this.grid = new Array(this.iMax); - for (var i = 0; i < this.iMax; i++) { - this.grid[i] = new Array(this.jMax); + return result; +} - for (var j = 0; j < this.jMax; j++) { - this.grid[i][j] = 0; - } - } +function expandSubgraphs(entries, subgraphs) { + _.forEach(entries, function(entry) { + entry.vs = _.flatten(entry.vs.map(function(v) { + if (subgraphs[v]) { + return subgraphs[v].vs; + } + return v; + }), true); + }); +} - // Traceback matrix (2D array, each cell is an array of boolean values for [`Diag`, `Up`, `Left`] positions) - this.tracebackGrid = new Array(this.iMax); - for (var _i = 0; _i < this.iMax; _i++) { - this.tracebackGrid[_i] = new Array(this.jMax); +function mergeBarycenters(target, other) { + if (!_.isUndefined(target.barycenter)) { + target.barycenter = (target.barycenter * target.weight + + other.barycenter * other.weight) / + (target.weight + other.weight); + target.weight += other.weight; + } else { + target.barycenter = other.barycenter; + target.weight = other.weight; + } +} - for (var _j = 0; _j < this.jMax; _j++) { - this.tracebackGrid[_i][_j] = [null, null, null]; - } - } - // The aligned sequences (return multiple possibilities) - this.alignments = []; +/***/ }), - // Final alignment score - this.score = -1; +/***/ "./node_modules/dagre/lib/order/sort.js": +/*!**********************************************!*\ + !*** ./node_modules/dagre/lib/order/sort.js ***! + \**********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - // Calculate scores and tracebacks - this.computeGrids(); - } +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); +var util = __webpack_require__(/*! ../util */ "./node_modules/dagre/lib/util.js"); - _createClass(NeedlemanWunsch, [{ - key: "getScore", - value: function getScore() { - return this.score; - } - }, { - key: "getAlignments", - value: function getAlignments() { - return this.alignments; - } +module.exports = sort; - // Main dynamic programming procedure +function sort(entries, biasRight) { + var parts = util.partition(entries, function(entry) { + return _.has(entry, "barycenter"); + }); + var sortable = parts.lhs, + unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }), + vs = [], + sum = 0, + weight = 0, + vsIndex = 0; - }, { - key: "computeGrids", - value: function computeGrids() { - // Fill in the first row - for (var j = 1; j < this.jMax; j++) { - this.grid[0][j] = this.grid[0][j - 1] + this.gap_penalty; - this.tracebackGrid[0][j] = [false, false, true]; - } + sortable.sort(compareWithBias(!!biasRight)); - // Fill in the first column - for (var i = 1; i < this.iMax; i++) { - this.grid[i][0] = this.grid[i - 1][0] + this.gap_penalty; - this.tracebackGrid[i][0] = [false, true, false]; - } + vsIndex = consumeUnsortable(vs, unsortable, vsIndex); - // Fill the rest of the grid - for (var _i2 = 1; _i2 < this.iMax; _i2++) { - for (var _j2 = 1; _j2 < this.jMax; _j2++) { - // Find the max score(s) among [`Diag`, `Up`, `Left`] - var diag = void 0; - if (this.sequence1[_i2 - 1] === this.sequence2[_j2 - 1]) diag = this.grid[_i2 - 1][_j2 - 1] + this.match_score;else diag = this.grid[_i2 - 1][_j2 - 1] + this.mismatch_penalty; + _.forEach(sortable, function (entry) { + vsIndex += entry.vs.length; + vs.push(entry.vs); + sum += entry.barycenter * entry.weight; + weight += entry.weight; + vsIndex = consumeUnsortable(vs, unsortable, vsIndex); + }); - var up = this.grid[_i2 - 1][_j2] + this.gap_penalty; - var left = this.grid[_i2][_j2 - 1] + this.gap_penalty; + var result = { vs: _.flatten(vs, true) }; + if (weight) { + result.barycenter = sum / weight; + result.weight = weight; + } + return result; +} + +function consumeUnsortable(vs, unsortable, index) { + var last; + while (unsortable.length && (last = _.last(unsortable)).i <= index) { + unsortable.pop(); + vs.push(last.vs); + index++; + } + return index; +} - // If there exists multiple max values, capture them for multiple paths - var maxOf = [diag, up, left]; - var indices = this.arrayAllMaxIndexes(maxOf); +function compareWithBias(bias) { + return function(entryV, entryW) { + if (entryV.barycenter < entryW.barycenter) { + return -1; + } else if (entryV.barycenter > entryW.barycenter) { + return 1; + } - // Update Grids - this.grid[_i2][_j2] = maxOf[indices[0]]; - this.tracebackGrid[_i2][_j2] = [indices.includes(0), indices.includes(1), indices.includes(2)]; - } - } + return !bias ? entryV.i - entryW.i : entryW.i - entryV.i; + }; +} - // Update alignment score - this.score = this.grid[this.iMax - 1][this.jMax - 1]; - } - // Gets all possible valid sequence combinations +/***/ }), - }, { - key: "alignmentTraceback", - value: function alignmentTraceback() { - var inProcessAlignments = []; +/***/ "./node_modules/dagre/lib/parent-dummy-chains.js": +/*!*******************************************************!*\ + !*** ./node_modules/dagre/lib/parent-dummy-chains.js ***! + \*******************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - inProcessAlignments.push({ pos: [this.sequence1.length, this.sequence2.length], - seq1: "", - seq2: "" - }); +var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); - while (inProcessAlignments[0]) { - var current = inProcessAlignments[0]; - var directions = this.tracebackGrid[current.pos[0]][current.pos[1]]; +module.exports = parentDummyChains; - if (directions[0]) { - inProcessAlignments.push({ pos: [current.pos[0] - 1, current.pos[1] - 1], - seq1: this.sequence1[current.pos[0] - 1] + current.seq1, - seq2: this.sequence2[current.pos[1] - 1] + current.seq2 - }); - } - if (directions[1]) { - inProcessAlignments.push({ pos: [current.pos[0] - 1, current.pos[1]], - seq1: this.sequence1[current.pos[0] - 1] + current.seq1, - seq2: '-' + current.seq2 - }); - } - if (directions[2]) { - inProcessAlignments.push({ pos: [current.pos[0], current.pos[1] - 1], - seq1: '-' + current.seq1, - seq2: this.sequence2[current.pos[1] - 1] + current.seq2 - }); - } +function parentDummyChains(g) { + var postorderNums = postorder(g); - if (current.pos[0] === 0 && current.pos[1] === 0) this.alignments.push({ sequence1: current.seq1, - sequence2: current.seq2 - }); + _.forEach(g.graph().dummyChains, function(v) { + var node = g.node(v); + var edgeObj = node.edgeObj; + var pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w); + var path = pathData.path; + var lca = pathData.lca; + var pathIdx = 0; + var pathV = path[pathIdx]; + var ascending = true; - inProcessAlignments.shift(); - } + while (v !== edgeObj.w) { + node = g.node(v); - return this.alignments; + if (ascending) { + while ((pathV = path[pathIdx]) !== lca && + g.node(pathV).maxRank < node.rank) { + pathIdx++; } - // Helper Functions - - }, { - key: "getAllIndexes", - value: function getAllIndexes(arr, val) { - var indexes = [], - i = -1; - while ((i = arr.indexOf(val, i + 1)) !== -1) { - indexes.push(i); - } - return indexes; + if (pathV === lca) { + ascending = false; } - }, { - key: "arrayAllMaxIndexes", - value: function arrayAllMaxIndexes(array) { - return this.getAllIndexes(array, Math.max.apply(null, array)); + } + + if (!ascending) { + while (pathIdx < path.length - 1 && + g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) { + pathIdx++; } - }]); + pathV = path[pathIdx]; + } - return NeedlemanWunsch; -}(); + g.setParent(v, pathV); + v = g.successors(v)[0]; + } + }); +} -module.exports = NeedlemanWunsch; +// Find a path from v to w through the lowest common ancestor (LCA). Return the +// full path and the LCA. +function findPath(g, postorderNums, v, w) { + var vPath = []; + var wPath = []; + var low = Math.min(postorderNums[v].low, postorderNums[w].low); + var lim = Math.max(postorderNums[v].lim, postorderNums[w].lim); + var parent; + var lca; -/***/ }), -/* 28 */ -/***/ (function(module, exports, __nested_webpack_require_145732__) { + // Traverse up from v to find the LCA + parent = v; + do { + parent = g.parent(parent); + vPath.push(parent); + } while (parent && + (postorderNums[parent].low > low || lim > postorderNums[parent].lim)); + lca = parent; -"use strict"; + // Traverse from w to LCA + parent = w; + while ((parent = g.parent(parent)) !== lca) { + wPath.push(parent); + } + return { path: vPath.concat(wPath.reverse()), lca: lca }; +} -var layoutBase = function layoutBase() { - return; -}; +function postorder(g) { + var result = {}; + var lim = 0; -layoutBase.FDLayout = __nested_webpack_require_145732__(18); -layoutBase.FDLayoutConstants = __nested_webpack_require_145732__(4); -layoutBase.FDLayoutEdge = __nested_webpack_require_145732__(19); -layoutBase.FDLayoutNode = __nested_webpack_require_145732__(20); -layoutBase.DimensionD = __nested_webpack_require_145732__(21); -layoutBase.HashMap = __nested_webpack_require_145732__(22); -layoutBase.HashSet = __nested_webpack_require_145732__(23); -layoutBase.IGeometry = __nested_webpack_require_145732__(8); -layoutBase.IMath = __nested_webpack_require_145732__(9); -layoutBase.Integer = __nested_webpack_require_145732__(10); -layoutBase.Point = __nested_webpack_require_145732__(12); -layoutBase.PointD = __nested_webpack_require_145732__(5); -layoutBase.RandomSeed = __nested_webpack_require_145732__(16); -layoutBase.RectangleD = __nested_webpack_require_145732__(13); -layoutBase.Transform = __nested_webpack_require_145732__(17); -layoutBase.UniqueIDGeneretor = __nested_webpack_require_145732__(14); -layoutBase.Quicksort = __nested_webpack_require_145732__(25); -layoutBase.LinkedList = __nested_webpack_require_145732__(11); -layoutBase.LGraphObject = __nested_webpack_require_145732__(2); -layoutBase.LGraph = __nested_webpack_require_145732__(6); -layoutBase.LEdge = __nested_webpack_require_145732__(1); -layoutBase.LGraphManager = __nested_webpack_require_145732__(7); -layoutBase.LNode = __nested_webpack_require_145732__(3); -layoutBase.Layout = __nested_webpack_require_145732__(15); -layoutBase.LayoutConstants = __nested_webpack_require_145732__(0); -layoutBase.NeedlemanWunsch = __nested_webpack_require_145732__(27); -layoutBase.Matrix = __nested_webpack_require_145732__(24); -layoutBase.SVD = __nested_webpack_require_145732__(26); + function dfs(v) { + var low = lim; + _.forEach(g.children(v), dfs); + result[v] = { low: low, lim: lim++ }; + } + _.forEach(g.children(), dfs); + + return result; +} -module.exports = layoutBase; /***/ }), -/* 29 */ -/***/ (function(module, exports, __webpack_require__) { + +/***/ "./node_modules/dagre/lib/position/bk.js": +/*!***********************************************!*\ + !*** ./node_modules/dagre/lib/position/bk.js ***! + \***********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; -function Emitter() { - this.listeners = []; -} +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); +var Graph = (__webpack_require__(/*! ../graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph); +var util = __webpack_require__(/*! ../util */ "./node_modules/dagre/lib/util.js"); -var p = Emitter.prototype; +/* + * This module provides coordinate assignment based on Brandes and Köpf, "Fast + * and Simple Horizontal Coordinate Assignment." + */ -p.addListener = function (event, callback) { - this.listeners.push({ - event: event, - callback: callback - }); +module.exports = { + positionX: positionX, + findType1Conflicts: findType1Conflicts, + findType2Conflicts: findType2Conflicts, + addConflict: addConflict, + hasConflict: hasConflict, + verticalAlignment: verticalAlignment, + horizontalCompaction: horizontalCompaction, + alignCoordinates: alignCoordinates, + findSmallestWidthAlignment: findSmallestWidthAlignment, + balance: balance }; -p.removeListener = function (event, callback) { - for (var i = this.listeners.length; i >= 0; i--) { - var l = this.listeners[i]; +/* + * Marks all edges in the graph with a type-1 conflict with the "type1Conflict" + * property. A type-1 conflict is one where a non-inner segment crosses an + * inner segment. An inner segment is an edge with both incident nodes marked + * with the "dummy" property. + * + * This algorithm scans layer by layer, starting with the second, for type-1 + * conflicts between the current layer and the previous layer. For each layer + * it scans the nodes from left to right until it reaches one that is incident + * on an inner segment. It then scans predecessors to determine if they have + * edges that cross that inner segment. At the end a final scan is done for all + * nodes on the current rank to see if they cross the last visited inner + * segment. + * + * This algorithm (safely) assumes that a dummy node will only be incident on a + * single node in the layers being scanned. + */ +function findType1Conflicts(g, layering) { + var conflicts = {}; - if (l.event === event && l.callback === callback) { - this.listeners.splice(i, 1); - } - } -}; + function visitLayer(prevLayer, layer) { + var + // last visited node in the previous layer that is incident on an inner + // segment. + k0 = 0, + // Tracks the last node in this layer scanned for crossings with a type-1 + // segment. + scanPos = 0, + prevLayerLength = prevLayer.length, + lastNode = _.last(layer); -p.emit = function (event, data) { - for (var i = 0; i < this.listeners.length; i++) { - var l = this.listeners[i]; + _.forEach(layer, function(v, i) { + var w = findOtherInnerSegmentNode(g, v), + k1 = w ? g.node(w).order : prevLayerLength; - if (event === l.event) { - l.callback(data); - } + if (w || v === lastNode) { + _.forEach(layer.slice(scanPos, i +1), function(scanNode) { + _.forEach(g.predecessors(scanNode), function(u) { + var uLabel = g.node(u), + uPos = uLabel.order; + if ((uPos < k0 || k1 < uPos) && + !(uLabel.dummy && g.node(scanNode).dummy)) { + addConflict(conflicts, u, scanNode); + } + }); + }); + scanPos = i + 1; + k0 = k1; + } + }); + + return layer; } -}; -module.exports = Emitter; + _.reduce(layering, visitLayer); + return conflicts; +} -/***/ }) -/******/ ]); -}); +function findType2Conflicts(g, layering) { + var conflicts = {}; -/***/ }), + function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) { + var v; + _.forEach(_.range(southPos, southEnd), function(i) { + v = south[i]; + if (g.node(v).dummy) { + _.forEach(g.predecessors(v), function(u) { + var uNode = g.node(u); + if (uNode.dummy && + (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) { + addConflict(conflicts, u, v); + } + }); + } + }); + } -/***/ "./node_modules/lodash.curry/index.js": -/*!********************************************!*\ - !*** ./node_modules/lodash.curry/index.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -/** - * lodash (Custom Build) - * Build: `lodash modularize exports="npm" -o ./` - * Copyright jQuery Foundation and other contributors - * Released under MIT license - * Based on Underscore.js 1.8.3 - * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - */ + function visitLayer(north, south) { + var prevNorthPos = -1, + nextNorthPos, + southPos = 0; -/** Used as the `TypeError` message for "Functions" methods. */ -var FUNC_ERROR_TEXT = 'Expected a function'; + _.forEach(south, function(v, southLookahead) { + if (g.node(v).dummy === "border") { + var predecessors = g.predecessors(v); + if (predecessors.length) { + nextNorthPos = g.node(predecessors[0]).order; + scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos); + southPos = southLookahead; + prevNorthPos = nextNorthPos; + } + } + scan(south, southPos, south.length, nextNorthPos, north.length); + }); -/** Used as the internal argument placeholder. */ -var PLACEHOLDER = '__lodash_placeholder__'; + return south; + } -/** Used to compose bitmasks for function metadata. */ -var BIND_FLAG = 1, - BIND_KEY_FLAG = 2, - CURRY_BOUND_FLAG = 4, - CURRY_FLAG = 8, - CURRY_RIGHT_FLAG = 16, - PARTIAL_FLAG = 32, - PARTIAL_RIGHT_FLAG = 64, - ARY_FLAG = 128, - REARG_FLAG = 256, - FLIP_FLAG = 512; + _.reduce(layering, visitLayer); + return conflicts; +} -/** Used as references for various `Number` constants. */ -var INFINITY = 1 / 0, - MAX_SAFE_INTEGER = 9007199254740991, - MAX_INTEGER = 1.7976931348623157e+308, - NAN = 0 / 0; +function findOtherInnerSegmentNode(g, v) { + if (g.node(v).dummy) { + return _.find(g.predecessors(v), function(u) { + return g.node(u).dummy; + }); + } +} -/** Used to associate wrap methods with their bit flags. */ -var wrapFlags = [ - ['ary', ARY_FLAG], - ['bind', BIND_FLAG], - ['bindKey', BIND_KEY_FLAG], - ['curry', CURRY_FLAG], - ['curryRight', CURRY_RIGHT_FLAG], - ['flip', FLIP_FLAG], - ['partial', PARTIAL_FLAG], - ['partialRight', PARTIAL_RIGHT_FLAG], - ['rearg', REARG_FLAG] -]; +function addConflict(conflicts, v, w) { + if (v > w) { + var tmp = v; + v = w; + w = tmp; + } -/** `Object#toString` result references. */ -var funcTag = '[object Function]', - genTag = '[object GeneratorFunction]', - symbolTag = '[object Symbol]'; + var conflictsV = conflicts[v]; + if (!conflictsV) { + conflicts[v] = conflictsV = {}; + } + conflictsV[w] = true; +} -/** - * Used to match `RegExp` - * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). +function hasConflict(conflicts, v, w) { + if (v > w) { + var tmp = v; + v = w; + w = tmp; + } + return _.has(conflicts[v], w); +} + +/* + * Try to align nodes into vertical "blocks" where possible. This algorithm + * attempts to align a node with one of its median neighbors. If the edge + * connecting a neighbor is a type-1 conflict then we ignore that possibility. + * If a previous node has already formed a block with a node after the node + * we're trying to form a block with, we also ignore that possibility - our + * blocks would be split in that scenario. */ -var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; +function verticalAlignment(g, layering, conflicts, neighborFn) { + var root = {}, + align = {}, + pos = {}; -/** Used to match leading and trailing whitespace. */ -var reTrim = /^\s+|\s+$/g; + // We cache the position here based on the layering because the graph and + // layering may be out of sync. The layering matrix is manipulated to + // generate different extreme alignments. + _.forEach(layering, function(layer) { + _.forEach(layer, function(v, order) { + root[v] = v; + align[v] = v; + pos[v] = order; + }); + }); -/** Used to match wrap detail comments. */ -var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, - reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, - reSplitDetails = /,? & /; + _.forEach(layering, function(layer) { + var prevIdx = -1; + _.forEach(layer, function(v) { + var ws = neighborFn(v); + if (ws.length) { + ws = _.sortBy(ws, function(w) { return pos[w]; }); + var mp = (ws.length - 1) / 2; + for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) { + var w = ws[i]; + if (align[v] === v && + prevIdx < pos[w] && + !hasConflict(conflicts, v, w)) { + align[w] = v; + align[v] = root[v] = root[w]; + prevIdx = pos[w]; + } + } + } + }); + }); -/** Used to detect bad signed hexadecimal string values. */ -var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + return { root: root, align: align }; +} -/** Used to detect binary string values. */ -var reIsBinary = /^0b[01]+$/i; +function horizontalCompaction(g, layering, root, align, reverseSep) { + // This portion of the algorithm differs from BK due to a number of problems. + // Instead of their algorithm we construct a new block graph and do two + // sweeps. The first sweep places blocks with the smallest possible + // coordinates. The second sweep removes unused space by moving blocks to the + // greatest coordinates without violating separation. + var xs = {}, + blockG = buildBlockGraph(g, layering, root, reverseSep), + borderType = reverseSep ? "borderLeft" : "borderRight"; -/** Used to detect host constructors (Safari). */ -var reIsHostCtor = /^\[object .+?Constructor\]$/; + function iterate(setXsFunc, nextNodesFunc) { + var stack = blockG.nodes(); + var elem = stack.pop(); + var visited = {}; + while (elem) { + if (visited[elem]) { + setXsFunc(elem); + } else { + visited[elem] = true; + stack.push(elem); + stack = stack.concat(nextNodesFunc(elem)); + } + + elem = stack.pop(); + } + } + + // First pass, assign smallest coordinates + function pass1(elem) { + xs[elem] = blockG.inEdges(elem).reduce(function(acc, e) { + return Math.max(acc, xs[e.v] + blockG.edge(e)); + }, 0); + } + + // Second pass, assign greatest coordinates + function pass2(elem) { + var min = blockG.outEdges(elem).reduce(function(acc, e) { + return Math.min(acc, xs[e.w] - blockG.edge(e)); + }, Number.POSITIVE_INFINITY); + + var node = g.node(elem); + if (min !== Number.POSITIVE_INFINITY && node.borderType !== borderType) { + xs[elem] = Math.max(xs[elem], min); + } + } -/** Used to detect octal string values. */ -var reIsOctal = /^0o[0-7]+$/i; + iterate(pass1, blockG.predecessors.bind(blockG)); + iterate(pass2, blockG.successors.bind(blockG)); -/** Used to detect unsigned integer values. */ -var reIsUint = /^(?:0|[1-9]\d*)$/; + // Assign x coordinates to all nodes + _.forEach(align, function(v) { + xs[v] = xs[root[v]]; + }); -/** Built-in method references without a dependency on `root`. */ -var freeParseInt = parseInt; + return xs; +} -/** Detect free variable `global` from Node.js. */ -var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g; -/** Detect free variable `self`. */ -var freeSelf = typeof self == 'object' && self && self.Object === Object && self; +function buildBlockGraph(g, layering, root, reverseSep) { + var blockGraph = new Graph(), + graphLabel = g.graph(), + sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep); -/** Used as a reference to the global object. */ -var root = freeGlobal || freeSelf || Function('return this')(); + _.forEach(layering, function(layer) { + var u; + _.forEach(layer, function(v) { + var vRoot = root[v]; + blockGraph.setNode(vRoot); + if (u) { + var uRoot = root[u], + prevMax = blockGraph.edge(uRoot, vRoot); + blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0)); + } + u = v; + }); + }); -/** - * A faster alternative to `Function#apply`, this function invokes `func` - * with the `this` binding of `thisArg` and the arguments of `args`. - * - * @private - * @param {Function} func The function to invoke. - * @param {*} thisArg The `this` binding of `func`. - * @param {Array} args The arguments to invoke `func` with. - * @returns {*} Returns the result of `func`. - */ -function apply(func, thisArg, args) { - switch (args.length) { - case 0: return func.call(thisArg); - case 1: return func.call(thisArg, args[0]); - case 2: return func.call(thisArg, args[0], args[1]); - case 3: return func.call(thisArg, args[0], args[1], args[2]); - } - return func.apply(thisArg, args); + return blockGraph; } -/** - * A specialized version of `_.forEach` for arrays without support for - * iteratee shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns `array`. +/* + * Returns the alignment that has the smallest width of the given alignments. */ -function arrayEach(array, iteratee) { - var index = -1, - length = array ? array.length : 0; +function findSmallestWidthAlignment(g, xss) { + return _.minBy(_.values(xss), function (xs) { + var max = Number.NEGATIVE_INFINITY; + var min = Number.POSITIVE_INFINITY; - while (++index < length) { - if (iteratee(array[index], index, array) === false) { - break; - } - } - return array; -} + _.forIn(xs, function (x, v) { + var halfWidth = width(g, v) / 2; -/** - * A specialized version of `_.includes` for arrays without support for - * specifying an index to search from. - * - * @private - * @param {Array} [array] The array to inspect. - * @param {*} target The value to search for. - * @returns {boolean} Returns `true` if `target` is found, else `false`. - */ -function arrayIncludes(array, value) { - var length = array ? array.length : 0; - return !!length && baseIndexOf(array, value, 0) > -1; + max = Math.max(x + halfWidth, max); + min = Math.min(x - halfWidth, min); + }); + + return max - min; + }); } -/** - * The base implementation of `_.findIndex` and `_.findLastIndex` without - * support for iteratee shorthands. - * - * @private - * @param {Array} array The array to inspect. - * @param {Function} predicate The function invoked per iteration. - * @param {number} fromIndex The index to search from. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {number} Returns the index of the matched value, else `-1`. +/* + * Align the coordinates of each of the layout alignments such that + * left-biased alignments have their minimum coordinate at the same point as + * the minimum coordinate of the smallest width alignment and right-biased + * alignments have their maximum coordinate at the same point as the maximum + * coordinate of the smallest width alignment. */ -function baseFindIndex(array, predicate, fromIndex, fromRight) { - var length = array.length, - index = fromIndex + (fromRight ? 1 : -1); +function alignCoordinates(xss, alignTo) { + var alignToVals = _.values(alignTo), + alignToMin = _.min(alignToVals), + alignToMax = _.max(alignToVals); - while ((fromRight ? index-- : ++index < length)) { - if (predicate(array[index], index, array)) { - return index; - } - } - return -1; -} + _.forEach(["u", "d"], function(vert) { + _.forEach(["l", "r"], function(horiz) { + var alignment = vert + horiz, + xs = xss[alignment], + delta; + if (xs === alignTo) return; -/** - * The base implementation of `_.indexOf` without `fromIndex` bounds checks. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @param {number} fromIndex The index to search from. - * @returns {number} Returns the index of the matched value, else `-1`. - */ -function baseIndexOf(array, value, fromIndex) { - if (value !== value) { - return baseFindIndex(array, baseIsNaN, fromIndex); - } - var index = fromIndex - 1, - length = array.length; + var xsVals = _.values(xs); + delta = horiz === "l" ? alignToMin - _.min(xsVals) : alignToMax - _.max(xsVals); - while (++index < length) { - if (array[index] === value) { - return index; - } - } - return -1; + if (delta) { + xss[alignment] = _.mapValues(xs, function(x) { return x + delta; }); + } + }); + }); } -/** - * The base implementation of `_.isNaN` without support for number objects. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. - */ -function baseIsNaN(value) { - return value !== value; +function balance(xss, align) { + return _.mapValues(xss.ul, function(ignore, v) { + if (align) { + return xss[align.toLowerCase()][v]; + } else { + var xs = _.sortBy(_.map(xss, v)); + return (xs[1] + xs[2]) / 2; + } + }); } -/** - * Gets the number of `placeholder` occurrences in `array`. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} placeholder The placeholder to search for. - * @returns {number} Returns the placeholder count. - */ -function countHolders(array, placeholder) { - var length = array.length, - result = 0; +function positionX(g) { + var layering = util.buildLayerMatrix(g); + var conflicts = _.merge( + findType1Conflicts(g, layering), + findType2Conflicts(g, layering)); - while (length--) { - if (array[length] === placeholder) { - result++; - } - } - return result; -} + var xss = {}; + var adjustedLayering; + _.forEach(["u", "d"], function(vert) { + adjustedLayering = vert === "u" ? layering : _.values(layering).reverse(); + _.forEach(["l", "r"], function(horiz) { + if (horiz === "r") { + adjustedLayering = _.map(adjustedLayering, function(inner) { + return _.values(inner).reverse(); + }); + } -/** - * Gets the value at `key` of `object`. - * - * @private - * @param {Object} [object] The object to query. - * @param {string} key The key of the property to get. - * @returns {*} Returns the property value. - */ -function getValue(object, key) { - return object == null ? undefined : object[key]; -} + var neighborFn = (vert === "u" ? g.predecessors : g.successors).bind(g); + var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn); + var xs = horizontalCompaction(g, adjustedLayering, + align.root, align.align, horiz === "r"); + if (horiz === "r") { + xs = _.mapValues(xs, function(x) { return -x; }); + } + xss[vert + horiz] = xs; + }); + }); -/** - * Checks if `value` is a host object in IE < 9. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a host object, else `false`. - */ -function isHostObject(value) { - // Many host objects are `Object` objects that can coerce to strings - // despite having improperly defined `toString` methods. - var result = false; - if (value != null && typeof value.toString != 'function') { - try { - result = !!(value + ''); - } catch (e) {} - } - return result; + var smallestWidth = findSmallestWidthAlignment(g, xss); + alignCoordinates(xss, smallestWidth); + return balance(xss, g.graph().align); } -/** - * Replaces all `placeholder` elements in `array` with an internal placeholder - * and returns an array of their indexes. - * - * @private - * @param {Array} array The array to modify. - * @param {*} placeholder The placeholder to replace. - * @returns {Array} Returns the new array of placeholder indexes. - */ -function replaceHolders(array, placeholder) { - var index = -1, - length = array.length, - resIndex = 0, - result = []; +function sep(nodeSep, edgeSep, reverseSep) { + return function(g, v, w) { + var vLabel = g.node(v); + var wLabel = g.node(w); + var sum = 0; + var delta; - while (++index < length) { - var value = array[index]; - if (value === placeholder || value === PLACEHOLDER) { - array[index] = PLACEHOLDER; - result[resIndex++] = index; + sum += vLabel.width / 2; + if (_.has(vLabel, "labelpos")) { + switch (vLabel.labelpos.toLowerCase()) { + case "l": delta = -vLabel.width / 2; break; + case "r": delta = vLabel.width / 2; break; + } } - } - return result; -} + if (delta) { + sum += reverseSep ? delta : -delta; + } + delta = 0; -/** Used for built-in method references. */ -var funcProto = Function.prototype, - objectProto = Object.prototype; + sum += (vLabel.dummy ? edgeSep : nodeSep) / 2; + sum += (wLabel.dummy ? edgeSep : nodeSep) / 2; -/** Used to detect overreaching core-js shims. */ -var coreJsData = root['__core-js_shared__']; + sum += wLabel.width / 2; + if (_.has(wLabel, "labelpos")) { + switch (wLabel.labelpos.toLowerCase()) { + case "l": delta = wLabel.width / 2; break; + case "r": delta = -wLabel.width / 2; break; + } + } + if (delta) { + sum += reverseSep ? delta : -delta; + } + delta = 0; -/** Used to detect methods masquerading as native. */ -var maskSrcKey = (function() { - var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); - return uid ? ('Symbol(src)_1.' + uid) : ''; -}()); + return sum; + }; +} -/** Used to resolve the decompiled source of functions. */ -var funcToString = funcProto.toString; +function width(g, v) { + return g.node(v).width; +} -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; -/** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ -var objectToString = objectProto.toString; +/***/ }), -/** Used to detect if a method is native. */ -var reIsNative = RegExp('^' + - funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') - .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' -); +/***/ "./node_modules/dagre/lib/position/index.js": +/*!**************************************************!*\ + !*** ./node_modules/dagre/lib/position/index.js ***! + \**************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -/** Built-in value references. */ -var objectCreate = Object.create; +"use strict"; -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeMax = Math.max, - nativeMin = Math.min; -/* Used to set `toString` methods. */ -var defineProperty = (function() { - var func = getNative(Object, 'defineProperty'), - name = getNative.name; +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); +var util = __webpack_require__(/*! ../util */ "./node_modules/dagre/lib/util.js"); +var positionX = (__webpack_require__(/*! ./bk */ "./node_modules/dagre/lib/position/bk.js").positionX); - return (name && name.length > 2) ? func : undefined; -}()); +module.exports = position; -/** - * The base implementation of `_.create` without support for assigning - * properties to the created object. - * - * @private - * @param {Object} prototype The object to inherit from. - * @returns {Object} Returns the new object. - */ -function baseCreate(proto) { - return isObject(proto) ? objectCreate(proto) : {}; +function position(g) { + g = util.asNonCompoundGraph(g); + + positionY(g); + _.forEach(positionX(g), function(x, v) { + g.node(v).x = x; + }); } -/** - * The base implementation of `_.isNative` without bad shim checks. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a native function, - * else `false`. - */ -function baseIsNative(value) { - if (!isObject(value) || isMasked(value)) { - return false; - } - var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor; - return pattern.test(toSource(value)); +function positionY(g) { + var layering = util.buildLayerMatrix(g); + var rankSep = g.graph().ranksep; + var prevY = 0; + _.forEach(layering, function(layer) { + var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; })); + _.forEach(layer, function(v) { + g.node(v).y = prevY + maxHeight / 2; + }); + prevY += maxHeight + rankSep; + }); } -/** - * Creates an array that is the composition of partially applied arguments, - * placeholders, and provided arguments into a single array of arguments. - * - * @private - * @param {Array} args The provided arguments. - * @param {Array} partials The arguments to prepend to those provided. - * @param {Array} holders The `partials` placeholder indexes. - * @params {boolean} [isCurried] Specify composing for a curried function. - * @returns {Array} Returns the new array of composed arguments. - */ -function composeArgs(args, partials, holders, isCurried) { - var argsIndex = -1, - argsLength = args.length, - holdersLength = holders.length, - leftIndex = -1, - leftLength = partials.length, - rangeLength = nativeMax(argsLength - holdersLength, 0), - result = Array(leftLength + rangeLength), - isUncurried = !isCurried; - while (++leftIndex < leftLength) { - result[leftIndex] = partials[leftIndex]; - } - while (++argsIndex < holdersLength) { - if (isUncurried || argsIndex < argsLength) { - result[holders[argsIndex]] = args[argsIndex]; - } - } - while (rangeLength--) { - result[leftIndex++] = args[argsIndex++]; - } - return result; -} -/** - * This function is like `composeArgs` except that the arguments composition - * is tailored for `_.partialRight`. - * - * @private - * @param {Array} args The provided arguments. - * @param {Array} partials The arguments to append to those provided. - * @param {Array} holders The `partials` placeholder indexes. - * @params {boolean} [isCurried] Specify composing for a curried function. - * @returns {Array} Returns the new array of composed arguments. - */ -function composeArgsRight(args, partials, holders, isCurried) { - var argsIndex = -1, - argsLength = args.length, - holdersIndex = -1, - holdersLength = holders.length, - rightIndex = -1, - rightLength = partials.length, - rangeLength = nativeMax(argsLength - holdersLength, 0), - result = Array(rangeLength + rightLength), - isUncurried = !isCurried; +/***/ }), - while (++argsIndex < rangeLength) { - result[argsIndex] = args[argsIndex]; - } - var offset = argsIndex; - while (++rightIndex < rightLength) { - result[offset + rightIndex] = partials[rightIndex]; - } - while (++holdersIndex < holdersLength) { - if (isUncurried || argsIndex < argsLength) { - result[offset + holders[holdersIndex]] = args[argsIndex++]; - } - } - return result; -} +/***/ "./node_modules/dagre/lib/rank/feasible-tree.js": +/*!******************************************************!*\ + !*** ./node_modules/dagre/lib/rank/feasible-tree.js ***! + \******************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -/** - * Copies the values of `source` to `array`. +"use strict"; + + +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); +var Graph = (__webpack_require__(/*! ../graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph); +var slack = (__webpack_require__(/*! ./util */ "./node_modules/dagre/lib/rank/util.js").slack); + +module.exports = feasibleTree; + +/* + * Constructs a spanning tree with tight edges and adjusted the input node's + * ranks to achieve this. A tight edge is one that is has a length that matches + * its "minlen" attribute. * - * @private - * @param {Array} source The array to copy values from. - * @param {Array} [array=[]] The array to copy values to. - * @returns {Array} Returns `array`. + * The basic structure for this function is derived from Gansner, et al., "A + * Technique for Drawing Directed Graphs." + * + * Pre-conditions: + * + * 1. Graph must be a DAG. + * 2. Graph must be connected. + * 3. Graph must have at least one node. + * 5. Graph nodes must have been previously assigned a "rank" property that + * respects the "minlen" property of incident edges. + * 6. Graph edges must have a "minlen" property. + * + * Post-conditions: + * + * - Graph nodes will have their rank adjusted to ensure that all edges are + * tight. + * + * Returns a tree (undirected graph) that is constructed using only "tight" + * edges. */ -function copyArray(source, array) { - var index = -1, - length = source.length; +function feasibleTree(g) { + var t = new Graph({ directed: false }); - array || (array = Array(length)); - while (++index < length) { - array[index] = source[index]; + // Choose arbitrary node from which to start our tree + var start = g.nodes()[0]; + var size = g.nodeCount(); + t.setNode(start, {}); + + var edge, delta; + while (tightTree(t, g) < size) { + edge = findMinSlackEdge(t, g); + delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge); + shiftRanks(t, g, delta); } - return array; + + return t; } -/** - * Creates a function that wraps `func` to invoke it with the optional `this` - * binding of `thisArg`. - * - * @private - * @param {Function} func The function to wrap. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @param {*} [thisArg] The `this` binding of `func`. - * @returns {Function} Returns the new wrapped function. +/* + * Finds a maximal tree of tight edges and returns the number of nodes in the + * tree. */ -function createBind(func, bitmask, thisArg) { - var isBind = bitmask & BIND_FLAG, - Ctor = createCtor(func); - - function wrapper() { - var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; - return fn.apply(isBind ? thisArg : this, arguments); +function tightTree(t, g) { + function dfs(v) { + _.forEach(g.nodeEdges(v), function(e) { + var edgeV = e.v, + w = (v === edgeV) ? e.w : edgeV; + if (!t.hasNode(w) && !slack(g, e)) { + t.setNode(w, {}); + t.setEdge(v, w, {}); + dfs(w); + } + }); } - return wrapper; + + _.forEach(t.nodes(), dfs); + return t.nodeCount(); } -/** - * Creates a function that produces an instance of `Ctor` regardless of - * whether it was invoked as part of a `new` expression or by `call` or `apply`. - * - * @private - * @param {Function} Ctor The constructor to wrap. - * @returns {Function} Returns the new wrapped function. +/* + * Finds the edge with the smallest slack that is incident on tree and returns + * it. */ -function createCtor(Ctor) { - return function() { - // Use a `switch` statement to work with class constructors. See - // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist - // for more details. - var args = arguments; - switch (args.length) { - case 0: return new Ctor; - case 1: return new Ctor(args[0]); - case 2: return new Ctor(args[0], args[1]); - case 3: return new Ctor(args[0], args[1], args[2]); - case 4: return new Ctor(args[0], args[1], args[2], args[3]); - case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]); - case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); - case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); +function findMinSlackEdge(t, g) { + return _.minBy(g.edges(), function(e) { + if (t.hasNode(e.v) !== t.hasNode(e.w)) { + return slack(g, e); } - var thisBinding = baseCreate(Ctor.prototype), - result = Ctor.apply(thisBinding, args); + }); +} - // Mimic the constructor's `return` behavior. - // See https://es5.github.io/#x13.2.2 for more details. - return isObject(result) ? result : thisBinding; - }; +function shiftRanks(t, g, delta) { + _.forEach(t.nodes(), function(v) { + g.node(v).rank += delta; + }); } -/** - * Creates a function that wraps `func` to enable currying. - * - * @private - * @param {Function} func The function to wrap. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @param {number} arity The arity of `func`. - * @returns {Function} Returns the new wrapped function. - */ -function createCurry(func, bitmask, arity) { - var Ctor = createCtor(func); - function wrapper() { - var length = arguments.length, - args = Array(length), - index = length, - placeholder = getHolder(wrapper); +/***/ }), - while (index--) { - args[index] = arguments[index]; - } - var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder) - ? [] - : replaceHolders(args, placeholder); +/***/ "./node_modules/dagre/lib/rank/index.js": +/*!**********************************************!*\ + !*** ./node_modules/dagre/lib/rank/index.js ***! + \**********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - length -= holders.length; - if (length < arity) { - return createRecurry( - func, bitmask, createHybrid, wrapper.placeholder, undefined, - args, holders, undefined, undefined, arity - length); - } - var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; - return apply(fn, this, args); - } - return wrapper; -} +"use strict"; -/** - * Creates a function that wraps `func` to invoke it with optional `this` - * binding of `thisArg`, partial application, and currying. + +var rankUtil = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/rank/util.js"); +var longestPath = rankUtil.longestPath; +var feasibleTree = __webpack_require__(/*! ./feasible-tree */ "./node_modules/dagre/lib/rank/feasible-tree.js"); +var networkSimplex = __webpack_require__(/*! ./network-simplex */ "./node_modules/dagre/lib/rank/network-simplex.js"); + +module.exports = rank; + +/* + * Assigns a rank to each node in the input graph that respects the "minlen" + * constraint specified on edges between nodes. * - * @private - * @param {Function|string} func The function or method name to wrap. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @param {*} [thisArg] The `this` binding of `func`. - * @param {Array} [partials] The arguments to prepend to those provided to - * the new function. - * @param {Array} [holders] The `partials` placeholder indexes. - * @param {Array} [partialsRight] The arguments to append to those provided - * to the new function. - * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. - * @param {Array} [argPos] The argument positions of the new function. - * @param {number} [ary] The arity cap of `func`. - * @param {number} [arity] The arity of `func`. - * @returns {Function} Returns the new wrapped function. + * This basic structure is derived from Gansner, et al., "A Technique for + * Drawing Directed Graphs." + * + * Pre-conditions: + * + * 1. Graph must be a connected DAG + * 2. Graph nodes must be objects + * 3. Graph edges must have "weight" and "minlen" attributes + * + * Post-conditions: + * + * 1. Graph nodes will have a "rank" attribute based on the results of the + * algorithm. Ranks can start at any index (including negative), we'll + * fix them up later. */ -function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) { - var isAry = bitmask & ARY_FLAG, - isBind = bitmask & BIND_FLAG, - isBindKey = bitmask & BIND_KEY_FLAG, - isCurried = bitmask & (CURRY_FLAG | CURRY_RIGHT_FLAG), - isFlip = bitmask & FLIP_FLAG, - Ctor = isBindKey ? undefined : createCtor(func); +function rank(g) { + switch(g.graph().ranker) { + case "network-simplex": networkSimplexRanker(g); break; + case "tight-tree": tightTreeRanker(g); break; + case "longest-path": longestPathRanker(g); break; + default: networkSimplexRanker(g); + } +} - function wrapper() { - var length = arguments.length, - args = Array(length), - index = length; +// A fast and simple ranker, but results are far from optimal. +var longestPathRanker = longestPath; - while (index--) { - args[index] = arguments[index]; - } - if (isCurried) { - var placeholder = getHolder(wrapper), - holdersCount = countHolders(args, placeholder); - } - if (partials) { - args = composeArgs(args, partials, holders, isCurried); - } - if (partialsRight) { - args = composeArgsRight(args, partialsRight, holdersRight, isCurried); - } - length -= holdersCount; - if (isCurried && length < arity) { - var newHolders = replaceHolders(args, placeholder); - return createRecurry( - func, bitmask, createHybrid, wrapper.placeholder, thisArg, - args, newHolders, argPos, ary, arity - length - ); - } - var thisBinding = isBind ? thisArg : this, - fn = isBindKey ? thisBinding[func] : func; +function tightTreeRanker(g) { + longestPath(g); + feasibleTree(g); +} - length = args.length; - if (argPos) { - args = reorder(args, argPos); - } else if (isFlip && length > 1) { - args.reverse(); - } - if (isAry && ary < length) { - args.length = ary; - } - if (this && this !== root && this instanceof wrapper) { - fn = Ctor || createCtor(fn); - } - return fn.apply(thisBinding, args); - } - return wrapper; +function networkSimplexRanker(g) { + networkSimplex(g); } -/** - * Creates a function that wraps `func` to invoke it with the `this` binding - * of `thisArg` and `partials` prepended to the arguments it receives. + +/***/ }), + +/***/ "./node_modules/dagre/lib/rank/network-simplex.js": +/*!********************************************************!*\ + !*** ./node_modules/dagre/lib/rank/network-simplex.js ***! + \********************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); +var feasibleTree = __webpack_require__(/*! ./feasible-tree */ "./node_modules/dagre/lib/rank/feasible-tree.js"); +var slack = (__webpack_require__(/*! ./util */ "./node_modules/dagre/lib/rank/util.js").slack); +var initRank = (__webpack_require__(/*! ./util */ "./node_modules/dagre/lib/rank/util.js").longestPath); +var preorder = (__webpack_require__(/*! ../graphlib */ "./node_modules/dagre/lib/graphlib.js").alg).preorder; +var postorder = (__webpack_require__(/*! ../graphlib */ "./node_modules/dagre/lib/graphlib.js").alg).postorder; +var simplify = (__webpack_require__(/*! ../util */ "./node_modules/dagre/lib/util.js").simplify); + +module.exports = networkSimplex; + +// Expose some internals for testing purposes +networkSimplex.initLowLimValues = initLowLimValues; +networkSimplex.initCutValues = initCutValues; +networkSimplex.calcCutValue = calcCutValue; +networkSimplex.leaveEdge = leaveEdge; +networkSimplex.enterEdge = enterEdge; +networkSimplex.exchangeEdges = exchangeEdges; + +/* + * The network simplex algorithm assigns ranks to each node in the input graph + * and iteratively improves the ranking to reduce the length of edges. * - * @private - * @param {Function} func The function to wrap. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @param {*} thisArg The `this` binding of `func`. - * @param {Array} partials The arguments to prepend to those provided to - * the new function. - * @returns {Function} Returns the new wrapped function. + * Preconditions: + * + * 1. The input graph must be a DAG. + * 2. All nodes in the graph must have an object value. + * 3. All edges in the graph must have "minlen" and "weight" attributes. + * + * Postconditions: + * + * 1. All nodes in the graph will have an assigned "rank" attribute that has + * been optimized by the network simplex algorithm. Ranks start at 0. + * + * + * A rough sketch of the algorithm is as follows: + * + * 1. Assign initial ranks to each node. We use the longest path algorithm, + * which assigns ranks to the lowest position possible. In general this + * leads to very wide bottom ranks and unnecessarily long edges. + * 2. Construct a feasible tight tree. A tight tree is one such that all + * edges in the tree have no slack (difference between length of edge + * and minlen for the edge). This by itself greatly improves the assigned + * rankings by shorting edges. + * 3. Iteratively find edges that have negative cut values. Generally a + * negative cut value indicates that the edge could be removed and a new + * tree edge could be added to produce a more compact graph. + * + * Much of the algorithms here are derived from Gansner, et al., "A Technique + * for Drawing Directed Graphs." The structure of the file roughly follows the + * structure of the overall algorithm. */ -function createPartial(func, bitmask, thisArg, partials) { - var isBind = bitmask & BIND_FLAG, - Ctor = createCtor(func); - - function wrapper() { - var argsIndex = -1, - argsLength = arguments.length, - leftIndex = -1, - leftLength = partials.length, - args = Array(leftLength + argsLength), - fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; +function networkSimplex(g) { + g = simplify(g); + initRank(g); + var t = feasibleTree(g); + initLowLimValues(t); + initCutValues(t, g); - while (++leftIndex < leftLength) { - args[leftIndex] = partials[leftIndex]; - } - while (argsLength--) { - args[leftIndex++] = arguments[++argsIndex]; - } - return apply(fn, isBind ? thisArg : this, args); + var e, f; + while ((e = leaveEdge(t))) { + f = enterEdge(t, g, e); + exchangeEdges(t, g, e, f); } - return wrapper; } -/** - * Creates a function that wraps `func` to continue currying. - * - * @private - * @param {Function} func The function to wrap. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @param {Function} wrapFunc The function to create the `func` wrapper. - * @param {*} placeholder The placeholder value. - * @param {*} [thisArg] The `this` binding of `func`. - * @param {Array} [partials] The arguments to prepend to those provided to - * the new function. - * @param {Array} [holders] The `partials` placeholder indexes. - * @param {Array} [argPos] The argument positions of the new function. - * @param {number} [ary] The arity cap of `func`. - * @param {number} [arity] The arity of `func`. - * @returns {Function} Returns the new wrapped function. +/* + * Initializes cut values for all edges in the tree. */ -function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) { - var isCurry = bitmask & CURRY_FLAG, - newHolders = isCurry ? holders : undefined, - newHoldersRight = isCurry ? undefined : holders, - newPartials = isCurry ? partials : undefined, - newPartialsRight = isCurry ? undefined : partials; +function initCutValues(t, g) { + var vs = postorder(t, t.nodes()); + vs = vs.slice(0, vs.length - 1); + _.forEach(vs, function(v) { + assignCutValue(t, g, v); + }); +} - bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG); - bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG); +function assignCutValue(t, g, child) { + var childLab = t.node(child); + var parent = childLab.parent; + t.edge(child, parent).cutvalue = calcCutValue(t, g, child); +} - if (!(bitmask & CURRY_BOUND_FLAG)) { - bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG); +/* + * Given the tight tree, its graph, and a child in the graph calculate and + * return the cut value for the edge between the child and its parent. + */ +function calcCutValue(t, g, child) { + var childLab = t.node(child); + var parent = childLab.parent; + // True if the child is on the tail end of the edge in the directed graph + var childIsTail = true; + // The graph's view of the tree edge we're inspecting + var graphEdge = g.edge(child, parent); + // The accumulated cut value for the edge between this node and its parent + var cutValue = 0; + + if (!graphEdge) { + childIsTail = false; + graphEdge = g.edge(parent, child); } - var result = wrapFunc(func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, newHoldersRight, argPos, ary, arity); - result.placeholder = placeholder; - return setWrapToString(result, func, bitmask); + cutValue = graphEdge.weight; + + _.forEach(g.nodeEdges(child), function(e) { + var isOutEdge = e.v === child, + other = isOutEdge ? e.w : e.v; + + if (other !== parent) { + var pointsToHead = isOutEdge === childIsTail, + otherWeight = g.edge(e).weight; + + cutValue += pointsToHead ? otherWeight : -otherWeight; + if (isTreeEdge(t, child, other)) { + var otherCutValue = t.edge(child, other).cutvalue; + cutValue += pointsToHead ? -otherCutValue : otherCutValue; + } + } + }); + + return cutValue; } -/** - * Creates a function that either curries or invokes `func` with optional - * `this` binding and partially applied arguments. - * - * @private - * @param {Function|string} func The function or method name to wrap. - * @param {number} bitmask The bitmask flags. - * The bitmask may be composed of the following flags: - * 1 - `_.bind` - * 2 - `_.bindKey` - * 4 - `_.curry` or `_.curryRight` of a bound function - * 8 - `_.curry` - * 16 - `_.curryRight` - * 32 - `_.partial` - * 64 - `_.partialRight` - * 128 - `_.rearg` - * 256 - `_.ary` - * 512 - `_.flip` - * @param {*} [thisArg] The `this` binding of `func`. - * @param {Array} [partials] The arguments to be partially applied. - * @param {Array} [holders] The `partials` placeholder indexes. - * @param {Array} [argPos] The argument positions of the new function. - * @param {number} [ary] The arity cap of `func`. - * @param {number} [arity] The arity of `func`. - * @returns {Function} Returns the new wrapped function. - */ -function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) { - var isBindKey = bitmask & BIND_KEY_FLAG; - if (!isBindKey && typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - var length = partials ? partials.length : 0; - if (!length) { - bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG); - partials = holders = undefined; +function initLowLimValues(tree, root) { + if (arguments.length < 2) { + root = tree.nodes()[0]; } - ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0); - arity = arity === undefined ? arity : toInteger(arity); - length -= holders ? holders.length : 0; + dfsAssignLowLim(tree, {}, 1, root); +} - if (bitmask & PARTIAL_RIGHT_FLAG) { - var partialsRight = partials, - holdersRight = holders; +function dfsAssignLowLim(tree, visited, nextLim, v, parent) { + var low = nextLim; + var label = tree.node(v); - partials = holders = undefined; + visited[v] = true; + _.forEach(tree.neighbors(v), function(w) { + if (!_.has(visited, w)) { + nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v); + } + }); + + label.low = low; + label.lim = nextLim++; + if (parent) { + label.parent = parent; + } else { + // TODO should be able to remove this when we incrementally update low lim + delete label.parent; } - var newData = [ - func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, - argPos, ary, arity - ]; + return nextLim; +} - func = newData[0]; - bitmask = newData[1]; - thisArg = newData[2]; - partials = newData[3]; - holders = newData[4]; - arity = newData[9] = newData[9] == null - ? (isBindKey ? 0 : func.length) - : nativeMax(newData[9] - length, 0); +function leaveEdge(tree) { + return _.find(tree.edges(), function(e) { + return tree.edge(e).cutvalue < 0; + }); +} + +function enterEdge(t, g, edge) { + var v = edge.v; + var w = edge.w; - if (!arity && bitmask & (CURRY_FLAG | CURRY_RIGHT_FLAG)) { - bitmask &= ~(CURRY_FLAG | CURRY_RIGHT_FLAG); + // For the rest of this function we assume that v is the tail and w is the + // head, so if we don't have this edge in the graph we should flip it to + // match the correct orientation. + if (!g.hasEdge(v, w)) { + v = edge.w; + w = edge.v; } - if (!bitmask || bitmask == BIND_FLAG) { - var result = createBind(func, bitmask, thisArg); - } else if (bitmask == CURRY_FLAG || bitmask == CURRY_RIGHT_FLAG) { - result = createCurry(func, bitmask, arity); - } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !holders.length) { - result = createPartial(func, bitmask, thisArg, partials); - } else { - result = createHybrid.apply(undefined, newData); + + var vLabel = t.node(v); + var wLabel = t.node(w); + var tailLabel = vLabel; + var flip = false; + + // If the root is in the tail of the edge then we need to flip the logic that + // checks for the head and tail nodes in the candidates function below. + if (vLabel.lim > wLabel.lim) { + tailLabel = wLabel; + flip = true; } - return setWrapToString(result, func, bitmask); -} -/** - * Gets the argument placeholder value for `func`. - * - * @private - * @param {Function} func The function to inspect. - * @returns {*} Returns the placeholder value. - */ -function getHolder(func) { - var object = func; - return object.placeholder; -} + var candidates = _.filter(g.edges(), function(edge) { + return flip === isDescendant(t, t.node(edge.v), tailLabel) && + flip !== isDescendant(t, t.node(edge.w), tailLabel); + }); -/** - * Gets the native function at `key` of `object`. - * - * @private - * @param {Object} object The object to query. - * @param {string} key The key of the method to get. - * @returns {*} Returns the function if it's native, else `undefined`. - */ -function getNative(object, key) { - var value = getValue(object, key); - return baseIsNative(value) ? value : undefined; + return _.minBy(candidates, function(edge) { return slack(g, edge); }); } -/** - * Extracts wrapper details from the `source` body comment. - * - * @private - * @param {string} source The source to inspect. - * @returns {Array} Returns the wrapper details. - */ -function getWrapDetails(source) { - var match = source.match(reWrapDetails); - return match ? match[1].split(reSplitDetails) : []; +function exchangeEdges(t, g, e, f) { + var v = e.v; + var w = e.w; + t.removeEdge(v, w); + t.setEdge(f.v, f.w, {}); + initLowLimValues(t); + initCutValues(t, g); + updateRanks(t, g); } -/** - * Inserts wrapper `details` in a comment at the top of the `source` body. - * - * @private - * @param {string} source The source to modify. - * @returns {Array} details The details to insert. - * @returns {string} Returns the modified source. - */ -function insertWrapDetails(source, details) { - var length = details.length, - lastIndex = length - 1; +function updateRanks(t, g) { + var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }); + var vs = preorder(t, root); + vs = vs.slice(1); + _.forEach(vs, function(v) { + var parent = t.node(v).parent, + edge = g.edge(v, parent), + flipped = false; - details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex]; - details = details.join(length > 2 ? ', ' : ' '); - return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n'); + if (!edge) { + edge = g.edge(parent, v); + flipped = true; + } + + g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen); + }); } -/** - * Checks if `value` is a valid array-like index. - * - * @private - * @param {*} value The value to check. - * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. - * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. +/* + * Returns true if the edge is in the tree. */ -function isIndex(value, length) { - length = length == null ? MAX_SAFE_INTEGER : length; - return !!length && - (typeof value == 'number' || reIsUint.test(value)) && - (value > -1 && value % 1 == 0 && value < length); +function isTreeEdge(tree, u, v) { + return tree.hasEdge(u, v); } -/** - * Checks if `func` has its source masked. - * - * @private - * @param {Function} func The function to check. - * @returns {boolean} Returns `true` if `func` is masked, else `false`. +/* + * Returns true if the specified node is descendant of the root node per the + * assigned low and lim attributes in the tree. */ -function isMasked(func) { - return !!maskSrcKey && (maskSrcKey in func); +function isDescendant(tree, vLabel, rootLabel) { + return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim; } -/** - * Reorder `array` according to the specified indexes where the element at - * the first index is assigned as the first element, the element at - * the second index is assigned as the second element, and so on. - * - * @private - * @param {Array} array The array to reorder. - * @param {Array} indexes The arranged array indexes. - * @returns {Array} Returns `array`. - */ -function reorder(array, indexes) { - var arrLength = array.length, - length = nativeMin(indexes.length, arrLength), - oldArray = copyArray(array); - while (length--) { - var index = indexes[length]; - array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined; - } - return array; -} +/***/ }), -/** - * Sets the `toString` method of `wrapper` to mimic the source of `reference` - * with wrapper details in a comment at the top of the source body. - * - * @private - * @param {Function} wrapper The function to modify. - * @param {Function} reference The reference function. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @returns {Function} Returns `wrapper`. - */ -var setWrapToString = !defineProperty ? identity : function(wrapper, reference, bitmask) { - var source = (reference + ''); - return defineProperty(wrapper, 'toString', { - 'configurable': true, - 'enumerable': false, - 'value': constant(insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask))) - }); -}; +/***/ "./node_modules/dagre/lib/rank/util.js": +/*!*********************************************!*\ + !*** ./node_modules/dagre/lib/rank/util.js ***! + \*********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -/** - * Converts `func` to its source code. - * - * @private - * @param {Function} func The function to process. - * @returns {string} Returns the source code. - */ -function toSource(func) { - if (func != null) { - try { - return funcToString.call(func); - } catch (e) {} - try { - return (func + ''); - } catch (e) {} - } - return ''; -} +"use strict"; -/** - * Updates wrapper `details` based on `bitmask` flags. - * - * @private - * @returns {Array} details The details to modify. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @returns {Array} Returns `details`. - */ -function updateWrapDetails(details, bitmask) { - arrayEach(wrapFlags, function(pair) { - var value = '_.' + pair[0]; - if ((bitmask & pair[1]) && !arrayIncludes(details, value)) { - details.push(value); - } - }); - return details.sort(); -} -/** - * Creates a function that accepts arguments of `func` and either invokes - * `func` returning its result, if at least `arity` number of arguments have - * been provided, or returns a function that accepts the remaining `func` - * arguments, and so on. The arity of `func` may be specified if `func.length` - * is not sufficient. - * - * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, - * may be used as a placeholder for provided arguments. - * - * **Note:** This method doesn't set the "length" property of curried functions. - * - * @static - * @memberOf _ - * @since 2.0.0 - * @category Function - * @param {Function} func The function to curry. - * @param {number} [arity=func.length] The arity of `func`. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Function} Returns the new curried function. - * @example - * - * var abc = function(a, b, c) { - * return [a, b, c]; - * }; +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); + +module.exports = { + longestPath: longestPath, + slack: slack +}; + +/* + * Initializes ranks for the input graph using the longest path algorithm. This + * algorithm scales well and is fast in practice, it yields rather poor + * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom + * ranks wide and leaving edges longer than necessary. However, due to its + * speed, this algorithm is good for getting an initial ranking that can be fed + * into other algorithms. * - * var curried = _.curry(abc); + * This algorithm does not normalize layers because it will be used by other + * algorithms in most cases. If using this algorithm directly, be sure to + * run normalize at the end. * - * curried(1)(2)(3); - * // => [1, 2, 3] + * Pre-conditions: * - * curried(1, 2)(3); - * // => [1, 2, 3] + * 1. Input graph is a DAG. + * 2. Input graph node labels can be assigned properties. * - * curried(1, 2, 3); - * // => [1, 2, 3] + * Post-conditions: * - * // Curried with placeholders. - * curried(1)(_, 3)(2); - * // => [1, 2, 3] + * 1. Each node will be assign an (unnormalized) "rank" property. */ -function curry(func, arity, guard) { - arity = guard ? undefined : arity; - var result = createWrap(func, CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity); - result.placeholder = curry.placeholder; - return result; +function longestPath(g) { + var visited = {}; + + function dfs(v) { + var label = g.node(v); + if (_.has(visited, v)) { + return label.rank; + } + visited[v] = true; + + var rank = _.min(_.map(g.outEdges(v), function(e) { + return dfs(e.w) - g.edge(e).minlen; + })); + + if (rank === Number.POSITIVE_INFINITY || // return value of _.map([]) for Lodash 3 + rank === undefined || // return value of _.map([]) for Lodash 4 + rank === null) { // return value of _.map([null]) + rank = 0; + } + + return (label.rank = rank); + } + + _.forEach(g.sources(), dfs); } -/** - * Checks if `value` is classified as a `Function` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a function, else `false`. - * @example - * - * _.isFunction(_); - * // => true - * - * _.isFunction(/abc/); - * // => false +/* + * Returns the amount of slack for the given edge. The slack is defined as the + * difference between the length of the edge and its minimum length. */ -function isFunction(value) { - // The use of `Object#toString` avoids issues with the `typeof` operator - // in Safari 8-9 which returns 'object' for typed array and other constructors. - var tag = isObject(value) ? objectToString.call(value) : ''; - return tag == funcTag || tag == genTag; +function slack(g, e) { + return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen; } -/** - * Checks if `value` is the - * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) - * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(_.noop); - * // => true - * - * _.isObject(null); - * // => false + +/***/ }), + +/***/ "./node_modules/dagre/lib/util.js": +/*!****************************************!*\ + !*** ./node_modules/dagre/lib/util.js ***! + \****************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; +/* eslint "no-console": off */ + + + +var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); +var Graph = (__webpack_require__(/*! ./graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph); + +module.exports = { + addDummyNode: addDummyNode, + simplify: simplify, + asNonCompoundGraph: asNonCompoundGraph, + successorWeights: successorWeights, + predecessorWeights: predecessorWeights, + intersectRect: intersectRect, + buildLayerMatrix: buildLayerMatrix, + normalizeRanks: normalizeRanks, + removeEmptyRanks: removeEmptyRanks, + addBorderNode: addBorderNode, + maxRank: maxRank, + partition: partition, + time: time, + notime: notime +}; + +/* + * Adds a dummy node to the graph and return v. */ -function isObject(value) { - var type = typeof value; - return !!value && (type == 'object' || type == 'function'); +function addDummyNode(g, type, attrs, name) { + var v; + do { + v = _.uniqueId(name); + } while (g.hasNode(v)); + + attrs.dummy = type; + g.setNode(v, attrs); + return v; } -/** - * Checks if `value` is object-like. A value is object-like if it's not `null` - * and has a `typeof` result of "object". - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is object-like, else `false`. - * @example - * - * _.isObjectLike({}); - * // => true - * - * _.isObjectLike([1, 2, 3]); - * // => true - * - * _.isObjectLike(_.noop); - * // => false - * - * _.isObjectLike(null); - * // => false +/* + * Returns a new graph with only simple edges. Handles aggregation of data + * associated with multi-edges. */ -function isObjectLike(value) { - return !!value && typeof value == 'object'; +function simplify(g) { + var simplified = new Graph().setGraph(g.graph()); + _.forEach(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); }); + _.forEach(g.edges(), function(e) { + var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 }; + var label = g.edge(e); + simplified.setEdge(e.v, e.w, { + weight: simpleLabel.weight + label.weight, + minlen: Math.max(simpleLabel.minlen, label.minlen) + }); + }); + return simplified; } -/** - * Checks if `value` is classified as a `Symbol` primitive or object. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. - * @example - * - * _.isSymbol(Symbol.iterator); - * // => true - * - * _.isSymbol('abc'); - * // => false - */ -function isSymbol(value) { - return typeof value == 'symbol' || - (isObjectLike(value) && objectToString.call(value) == symbolTag); +function asNonCompoundGraph(g) { + var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph()); + _.forEach(g.nodes(), function(v) { + if (!g.children(v).length) { + simplified.setNode(v, g.node(v)); + } + }); + _.forEach(g.edges(), function(e) { + simplified.setEdge(e, g.edge(e)); + }); + return simplified; } -/** - * Converts `value` to a finite number. - * - * @static - * @memberOf _ - * @since 4.12.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {number} Returns the converted number. - * @example - * - * _.toFinite(3.2); - * // => 3.2 - * - * _.toFinite(Number.MIN_VALUE); - * // => 5e-324 - * - * _.toFinite(Infinity); - * // => 1.7976931348623157e+308 - * - * _.toFinite('3.2'); - * // => 3.2 +function successorWeights(g) { + var weightMap = _.map(g.nodes(), function(v) { + var sucs = {}; + _.forEach(g.outEdges(v), function(e) { + sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight; + }); + return sucs; + }); + return _.zipObject(g.nodes(), weightMap); +} + +function predecessorWeights(g) { + var weightMap = _.map(g.nodes(), function(v) { + var preds = {}; + _.forEach(g.inEdges(v), function(e) { + preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight; + }); + return preds; + }); + return _.zipObject(g.nodes(), weightMap); +} + +/* + * Finds where a line starting at point ({x, y}) would intersect a rectangle + * ({x, y, width, height}) if it were pointing at the rectangle's center. */ -function toFinite(value) { - if (!value) { - return value === 0 ? value : 0; +function intersectRect(rect, point) { + var x = rect.x; + var y = rect.y; + + // Rectangle intersection algorithm from: + // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes + var dx = point.x - x; + var dy = point.y - y; + var w = rect.width / 2; + var h = rect.height / 2; + + if (!dx && !dy) { + throw new Error("Not possible to find intersection inside of the rectangle"); } - value = toNumber(value); - if (value === INFINITY || value === -INFINITY) { - var sign = (value < 0 ? -1 : 1); - return sign * MAX_INTEGER; + + var sx, sy; + if (Math.abs(dy) * w > Math.abs(dx) * h) { + // Intersection is top or bottom of rect. + if (dy < 0) { + h = -h; + } + sx = h * dx / dy; + sy = h; + } else { + // Intersection is left or right of rect. + if (dx < 0) { + w = -w; + } + sx = w; + sy = w * dy / dx; } - return value === value ? value : 0; + + return { x: x + sx, y: y + sy }; } -/** - * Converts `value` to an integer. - * - * **Note:** This method is loosely based on - * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {number} Returns the converted integer. - * @example - * - * _.toInteger(3.2); - * // => 3 - * - * _.toInteger(Number.MIN_VALUE); - * // => 0 - * - * _.toInteger(Infinity); - * // => 1.7976931348623157e+308 - * - * _.toInteger('3.2'); - * // => 3 +/* + * Given a DAG with each node assigned "rank" and "order" properties, this + * function will produce a matrix with the ids of each node. */ -function toInteger(value) { - var result = toFinite(value), - remainder = result % 1; - - return result === result ? (remainder ? result - remainder : result) : 0; +function buildLayerMatrix(g) { + var layering = _.map(_.range(maxRank(g) + 1), function() { return []; }); + _.forEach(g.nodes(), function(v) { + var node = g.node(v); + var rank = node.rank; + if (!_.isUndefined(rank)) { + layering[rank][node.order] = v; + } + }); + return layering; } -/** - * Converts `value` to a number. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to process. - * @returns {number} Returns the number. - * @example - * - * _.toNumber(3.2); - * // => 3.2 - * - * _.toNumber(Number.MIN_VALUE); - * // => 5e-324 - * - * _.toNumber(Infinity); - * // => Infinity - * - * _.toNumber('3.2'); - * // => 3.2 +/* + * Adjusts the ranks for all nodes in the graph such that all nodes v have + * rank(v) >= 0 and at least one node w has rank(w) = 0. */ -function toNumber(value) { - if (typeof value == 'number') { - return value; - } - if (isSymbol(value)) { - return NAN; - } - if (isObject(value)) { - var other = typeof value.valueOf == 'function' ? value.valueOf() : value; - value = isObject(other) ? (other + '') : other; - } - if (typeof value != 'string') { - return value === 0 ? value : +value; - } - value = value.replace(reTrim, ''); - var isBinary = reIsBinary.test(value); - return (isBinary || reIsOctal.test(value)) - ? freeParseInt(value.slice(2), isBinary ? 2 : 8) - : (reIsBadHex.test(value) ? NAN : +value); +function normalizeRanks(g) { + var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; })); + _.forEach(g.nodes(), function(v) { + var node = g.node(v); + if (_.has(node, "rank")) { + node.rank -= min; + } + }); } -/** - * Creates a function that returns `value`. - * - * @static - * @memberOf _ - * @since 2.4.0 - * @category Util - * @param {*} value The value to return from the new function. - * @returns {Function} Returns the new constant function. - * @example - * - * var objects = _.times(2, _.constant({ 'a': 1 })); - * - * console.log(objects); - * // => [{ 'a': 1 }, { 'a': 1 }] - * - * console.log(objects[0] === objects[1]); - * // => true - */ -function constant(value) { - return function() { - return value; +function removeEmptyRanks(g) { + // Ranks may not start at 0, so we need to offset them + var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; })); + + var layers = []; + _.forEach(g.nodes(), function(v) { + var rank = g.node(v).rank - offset; + if (!layers[rank]) { + layers[rank] = []; + } + layers[rank].push(v); + }); + + var delta = 0; + var nodeRankFactor = g.graph().nodeRankFactor; + _.forEach(layers, function(vs, i) { + if (_.isUndefined(vs) && i % nodeRankFactor !== 0) { + --delta; + } else if (delta) { + _.forEach(vs, function(v) { g.node(v).rank += delta; }); + } + }); +} + +function addBorderNode(g, prefix, rank, order) { + var node = { + width: 0, + height: 0 }; + if (arguments.length >= 4) { + node.rank = rank; + node.order = order; + } + return addDummyNode(g, "border", node, prefix); } -/** - * This method returns the first argument it receives. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Util - * @param {*} value Any value. - * @returns {*} Returns `value`. - * @example - * - * var object = { 'a': 1 }; - * - * console.log(_.identity(object) === object); - * // => true +function maxRank(g) { + return _.max(_.map(g.nodes(), function(v) { + var rank = g.node(v).rank; + if (!_.isUndefined(rank)) { + return rank; + } + })); +} + +/* + * Partition a collection into two groups: `lhs` and `rhs`. If the supplied + * function returns true for an entry it goes into `lhs`. Otherwise it goes + * into `rhs. */ -function identity(value) { - return value; +function partition(collection, fn) { + var result = { lhs: [], rhs: [] }; + _.forEach(collection, function(value) { + if (fn(value)) { + result.lhs.push(value); + } else { + result.rhs.push(value); + } + }); + return result; } -// Assign default placeholders. -curry.placeholder = {}; +/* + * Returns a new function that wraps `fn` with a timer. The wrapper logs the + * time it takes to execute the function. + */ +function time(name, fn) { + var start = _.now(); + try { + return fn(); + } finally { + console.log(name + " time: " + (_.now() - start) + "ms"); + } +} -module.exports = curry; +function notime(name, fn) { + return fn(); +} /***/ }), -/***/ "./node_modules/lodash/_DataView.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_DataView.js ***! - \******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +/***/ "./node_modules/dagre/lib/version.js": +/*!*******************************************!*\ + !*** ./node_modules/dagre/lib/version.js ***! + \*******************************************/ +/***/ (function(module) { -var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), - root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); +module.exports = "0.8.5"; -/* Built-in method references that are verified to be native. */ -var DataView = getNative(root, 'DataView'); -module.exports = DataView; +/***/ }), +/***/ "./node_modules/dependency-graph/lib/dep_graph.js": +/*!********************************************************!*\ + !*** ./node_modules/dependency-graph/lib/dep_graph.js ***! + \********************************************************/ +/***/ (function(__unused_webpack_module, exports) { -/***/ }), +/** + * A simple dependency graph + */ -/***/ "./node_modules/lodash/_Hash.js": -/*!**************************************!*\ - !*** ./node_modules/lodash/_Hash.js ***! - \**************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +/** + * Helper for creating a Topological Sort using Depth-First-Search on a set of edges. + * + * Detects cycles and throws an Error if one is detected (unless the "circular" + * parameter is "true" in which case it ignores them). + * + * @param edges The set of edges to DFS through + * @param leavesOnly Whether to only return "leaf" nodes (ones who have no edges) + * @param result An array in which the results will be populated + * @param circular A boolean to allow circular dependencies + */ +function createDFS(edges, leavesOnly, result, circular) { + var visited = {}; + return function (start) { + if (visited[start]) { + return; + } + var inCurrentPath = {}; + var currentPath = []; + var todo = []; // used as a stack + todo.push({ node: start, processed: false }); + while (todo.length > 0) { + var current = todo[todo.length - 1]; // peek at the todo stack + var processed = current.processed; + var node = current.node; + if (!processed) { + // Haven't visited edges yet (visiting phase) + if (visited[node]) { + todo.pop(); + continue; + } else if (inCurrentPath[node]) { + // It's not a DAG + if (circular) { + todo.pop(); + // If we're tolerating cycles, don't revisit the node + continue; + } + currentPath.push(node); + throw new DepGraphCycleError(currentPath); + } + + inCurrentPath[node] = true; + currentPath.push(node); + var nodeEdges = edges[node]; + // (push edges onto the todo stack in reverse order to be order-compatible with the old DFS implementation) + for (var i = nodeEdges.length - 1; i >= 0; i--) { + todo.push({ node: nodeEdges[i], processed: false }); + } + current.processed = true; + } else { + // Have visited edges (stack unrolling phase) + todo.pop(); + currentPath.pop(); + inCurrentPath[node] = false; + visited[node] = true; + if (!leavesOnly || edges[node].length === 0) { + result.push(node); + } + } + } + }; +} + +/** + * Simple Dependency Graph + */ +var DepGraph = (exports.DepGraph = function DepGraph(opts) { + this.nodes = {}; // Node -> Node/Data (treated like a Set) + this.outgoingEdges = {}; // Node -> [Dependency Node] + this.incomingEdges = {}; // Node -> [Dependant Node] + this.circular = opts && !!opts.circular; // Allows circular deps +}); +DepGraph.prototype = { + /** + * The number of nodes in the graph. + */ + size: function () { + return Object.keys(this.nodes).length; + }, + /** + * Add a node to the dependency graph. If a node already exists, this method will do nothing. + */ + addNode: function (node, data) { + if (!this.hasNode(node)) { + // Checking the arguments length allows the user to add a node with undefined data + if (arguments.length === 2) { + this.nodes[node] = data; + } else { + this.nodes[node] = node; + } + this.outgoingEdges[node] = []; + this.incomingEdges[node] = []; + } + }, + /** + * Remove a node from the dependency graph. If a node does not exist, this method will do nothing. + */ + removeNode: function (node) { + if (this.hasNode(node)) { + delete this.nodes[node]; + delete this.outgoingEdges[node]; + delete this.incomingEdges[node]; + [this.incomingEdges, this.outgoingEdges].forEach(function (edgeList) { + Object.keys(edgeList).forEach(function (key) { + var idx = edgeList[key].indexOf(node); + if (idx >= 0) { + edgeList[key].splice(idx, 1); + } + }, this); + }); + } + }, + /** + * Check if a node exists in the graph + */ + hasNode: function (node) { + return this.nodes.hasOwnProperty(node); + }, + /** + * Get the data associated with a node name + */ + getNodeData: function (node) { + if (this.hasNode(node)) { + return this.nodes[node]; + } else { + throw new Error("Node does not exist: " + node); + } + }, + /** + * Set the associated data for a given node name. If the node does not exist, this method will throw an error + */ + setNodeData: function (node, data) { + if (this.hasNode(node)) { + this.nodes[node] = data; + } else { + throw new Error("Node does not exist: " + node); + } + }, + /** + * Add a dependency between two nodes. If either of the nodes does not exist, + * an Error will be thrown. + */ + addDependency: function (from, to) { + if (!this.hasNode(from)) { + throw new Error("Node does not exist: " + from); + } + if (!this.hasNode(to)) { + throw new Error("Node does not exist: " + to); + } + if (this.outgoingEdges[from].indexOf(to) === -1) { + this.outgoingEdges[from].push(to); + } + if (this.incomingEdges[to].indexOf(from) === -1) { + this.incomingEdges[to].push(from); + } + return true; + }, + /** + * Remove a dependency between two nodes. + */ + removeDependency: function (from, to) { + var idx; + if (this.hasNode(from)) { + idx = this.outgoingEdges[from].indexOf(to); + if (idx >= 0) { + this.outgoingEdges[from].splice(idx, 1); + } + } + + if (this.hasNode(to)) { + idx = this.incomingEdges[to].indexOf(from); + if (idx >= 0) { + this.incomingEdges[to].splice(idx, 1); + } + } + }, + /** + * Return a clone of the dependency graph. If any custom data is attached + * to the nodes, it will only be shallow copied. + */ + clone: function () { + var source = this; + var result = new DepGraph(); + var keys = Object.keys(source.nodes); + keys.forEach(function (n) { + result.nodes[n] = source.nodes[n]; + result.outgoingEdges[n] = source.outgoingEdges[n].slice(0); + result.incomingEdges[n] = source.incomingEdges[n].slice(0); + }); + return result; + }, + /** + * Get an array containing the direct dependencies of the specified node. + * + * Throws an Error if the specified node does not exist. + */ + directDependenciesOf: function (node) { + if (this.hasNode(node)) { + return this.outgoingEdges[node].slice(0); + } else { + throw new Error("Node does not exist: " + node); + } + }, + /** + * Get an array containing the nodes that directly depend on the specified node. + * + * Throws an Error if the specified node does not exist. + */ + directDependantsOf: function (node) { + if (this.hasNode(node)) { + return this.incomingEdges[node].slice(0); + } else { + throw new Error("Node does not exist: " + node); + } + }, + /** + * Get an array containing the nodes that the specified node depends on (transitively). + * + * Throws an Error if the graph has a cycle, or the specified node does not exist. + * + * If `leavesOnly` is true, only nodes that do not depend on any other nodes will be returned + * in the array. + */ + dependenciesOf: function (node, leavesOnly) { + if (this.hasNode(node)) { + var result = []; + var DFS = createDFS( + this.outgoingEdges, + leavesOnly, + result, + this.circular + ); + DFS(node); + var idx = result.indexOf(node); + if (idx >= 0) { + result.splice(idx, 1); + } + return result; + } else { + throw new Error("Node does not exist: " + node); + } + }, + /** + * get an array containing the nodes that depend on the specified node (transitively). + * + * Throws an Error if the graph has a cycle, or the specified node does not exist. + * + * If `leavesOnly` is true, only nodes that do not have any dependants will be returned in the array. + */ + dependantsOf: function (node, leavesOnly) { + if (this.hasNode(node)) { + var result = []; + var DFS = createDFS( + this.incomingEdges, + leavesOnly, + result, + this.circular + ); + DFS(node); + var idx = result.indexOf(node); + if (idx >= 0) { + result.splice(idx, 1); + } + return result; + } else { + throw new Error("Node does not exist: " + node); + } + }, + /** + * Construct the overall processing order for the dependency graph. + * + * Throws an Error if the graph has a cycle. + * + * If `leavesOnly` is true, only nodes that do not depend on any other nodes will be returned. + */ + overallOrder: function (leavesOnly) { + var self = this; + var result = []; + var keys = Object.keys(this.nodes); + if (keys.length === 0) { + return result; // Empty graph + } else { + if (!this.circular) { + // Look for cycles - we run the DFS starting at all the nodes in case there + // are several disconnected subgraphs inside this dependency graph. + var CycleDFS = createDFS(this.outgoingEdges, false, [], this.circular); + keys.forEach(function (n) { + CycleDFS(n); + }); + } -var hashClear = __webpack_require__(/*! ./_hashClear */ "./node_modules/lodash/_hashClear.js"), - hashDelete = __webpack_require__(/*! ./_hashDelete */ "./node_modules/lodash/_hashDelete.js"), - hashGet = __webpack_require__(/*! ./_hashGet */ "./node_modules/lodash/_hashGet.js"), - hashHas = __webpack_require__(/*! ./_hashHas */ "./node_modules/lodash/_hashHas.js"), - hashSet = __webpack_require__(/*! ./_hashSet */ "./node_modules/lodash/_hashSet.js"); + var DFS = createDFS( + this.outgoingEdges, + leavesOnly, + result, + this.circular + ); + // Find all potential starting points (nodes with nothing depending on them) an + // run a DFS starting at these points to get the order + keys + .filter(function (node) { + return self.incomingEdges[node].length === 0; + }) + .forEach(function (n) { + DFS(n); + }); -/** - * Creates a hash object. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ -function Hash(entries) { - var index = -1, - length = entries == null ? 0 : entries.length; + // If we're allowing cycles - we need to run the DFS against any remaining + // nodes that did not end up in the initial result (as they are part of a + // subgraph that does not have a clear starting point) + if (this.circular) { + keys + .filter(function (node) { + return result.indexOf(node) === -1; + }) + .forEach(function (n) { + DFS(n); + }); + } - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); + return result; + } + }, + /** + * Get an array of nodes that have no dependants (i.e. nothing depends on them). + */ + entryNodes: function () { + var self = this; + return Object.keys(this.nodes).filter(function (node) { + return self.incomingEdges[node].length === 0; + }); } -} - -// Add methods to `Hash`. -Hash.prototype.clear = hashClear; -Hash.prototype['delete'] = hashDelete; -Hash.prototype.get = hashGet; -Hash.prototype.has = hashHas; -Hash.prototype.set = hashSet; - -module.exports = Hash; - - -/***/ }), - -/***/ "./node_modules/lodash/_ListCache.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_ListCache.js ***! - \*******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +}; -var listCacheClear = __webpack_require__(/*! ./_listCacheClear */ "./node_modules/lodash/_listCacheClear.js"), - listCacheDelete = __webpack_require__(/*! ./_listCacheDelete */ "./node_modules/lodash/_listCacheDelete.js"), - listCacheGet = __webpack_require__(/*! ./_listCacheGet */ "./node_modules/lodash/_listCacheGet.js"), - listCacheHas = __webpack_require__(/*! ./_listCacheHas */ "./node_modules/lodash/_listCacheHas.js"), - listCacheSet = __webpack_require__(/*! ./_listCacheSet */ "./node_modules/lodash/_listCacheSet.js"); +// Create some aliases +DepGraph.prototype.directDependentsOf = DepGraph.prototype.directDependantsOf; +DepGraph.prototype.dependentsOf = DepGraph.prototype.dependantsOf; /** - * Creates an list cache object. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. + * Cycle error, including the path of the cycle. */ -function ListCache(entries) { - var index = -1, - length = entries == null ? 0 : entries.length; - - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); +var DepGraphCycleError = (exports.DepGraphCycleError = function (cyclePath) { + var message = "Dependency Cycle Found: " + cyclePath.join(" -> "); + var instance = new Error(message); + instance.cyclePath = cyclePath; + Object.setPrototypeOf(instance, Object.getPrototypeOf(this)); + if (Error.captureStackTrace) { + Error.captureStackTrace(instance, DepGraphCycleError); } -} - -// Add methods to `ListCache`. -ListCache.prototype.clear = listCacheClear; -ListCache.prototype['delete'] = listCacheDelete; -ListCache.prototype.get = listCacheGet; -ListCache.prototype.has = listCacheHas; -ListCache.prototype.set = listCacheSet; - -module.exports = ListCache; - - -/***/ }), - -/***/ "./node_modules/lodash/_Map.js": -/*!*************************************!*\ - !*** ./node_modules/lodash/_Map.js ***! - \*************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), - root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); - -/* Built-in method references that are verified to be native. */ -var Map = getNative(root, 'Map'); - -module.exports = Map; + return instance; +}); +DepGraphCycleError.prototype = Object.create(Error.prototype, { + constructor: { + value: Error, + enumerable: false, + writable: true, + configurable: true + } +}); +Object.setPrototypeOf(DepGraphCycleError, Error); /***/ }), -/***/ "./node_modules/lodash/_MapCache.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_MapCache.js ***! - \******************************************/ +/***/ "./node_modules/fast-isnumeric/index.js": +/*!**********************************************!*\ + !*** ./node_modules/fast-isnumeric/index.js ***! + \**********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var mapCacheClear = __webpack_require__(/*! ./_mapCacheClear */ "./node_modules/lodash/_mapCacheClear.js"), - mapCacheDelete = __webpack_require__(/*! ./_mapCacheDelete */ "./node_modules/lodash/_mapCacheDelete.js"), - mapCacheGet = __webpack_require__(/*! ./_mapCacheGet */ "./node_modules/lodash/_mapCacheGet.js"), - mapCacheHas = __webpack_require__(/*! ./_mapCacheHas */ "./node_modules/lodash/_mapCacheHas.js"), - mapCacheSet = __webpack_require__(/*! ./_mapCacheSet */ "./node_modules/lodash/_mapCacheSet.js"); - +"use strict"; /** - * Creates a map cache object to store key-value pairs. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. + * inspired by is-number + * but significantly simplified and sped up by ignoring number and string constructors + * ie these return false: + * new Number(1) + * new String('1') */ -function MapCache(entries) { - var index = -1, - length = entries == null ? 0 : entries.length; - - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } -} - -// Add methods to `MapCache`. -MapCache.prototype.clear = mapCacheClear; -MapCache.prototype['delete'] = mapCacheDelete; -MapCache.prototype.get = mapCacheGet; -MapCache.prototype.has = mapCacheHas; -MapCache.prototype.set = mapCacheSet; - -module.exports = MapCache; - - -/***/ }), - -/***/ "./node_modules/lodash/_Promise.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/_Promise.js ***! - \*****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), - root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); - -/* Built-in method references that are verified to be native. */ -var Promise = getNative(root, 'Promise'); - -module.exports = Promise; - -/***/ }), -/***/ "./node_modules/lodash/_Set.js": -/*!*************************************!*\ - !*** ./node_modules/lodash/_Set.js ***! - \*************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), - root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); +var allBlankCharCodes = __webpack_require__(/*! is-string-blank */ "./node_modules/is-string-blank/index.js"); -/* Built-in method references that are verified to be native. */ -var Set = getNative(root, 'Set'); +module.exports = function(n) { + var type = typeof n; + if(type === 'string') { + var original = n; + n = +n; + // whitespace strings cast to zero - filter them out + if(n===0 && allBlankCharCodes(original)) return false; + } + else if(type !== 'number') return false; -module.exports = Set; + return n - n < 1; +}; /***/ }), -/***/ "./node_modules/lodash/_SetCache.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_SetCache.js ***! - \******************************************/ +/***/ "./node_modules/graphlib/index.js": +/*!****************************************!*\ + !*** ./node_modules/graphlib/index.js ***! + \****************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var MapCache = __webpack_require__(/*! ./_MapCache */ "./node_modules/lodash/_MapCache.js"), - setCacheAdd = __webpack_require__(/*! ./_setCacheAdd */ "./node_modules/lodash/_setCacheAdd.js"), - setCacheHas = __webpack_require__(/*! ./_setCacheHas */ "./node_modules/lodash/_setCacheHas.js"); - /** + * Copyright (c) 2014, Chris Pettitt + * All rights reserved. * - * Creates an array cache object to store unique values. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * @private - * @constructor - * @param {Array} [values] The values to cache. - */ -function SetCache(values) { - var index = -1, - length = values == null ? 0 : values.length; - - this.__data__ = new MapCache; - while (++index < length) { - this.add(values[index]); - } -} - -// Add methods to `SetCache`. -SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; -SetCache.prototype.has = setCacheHas; - -module.exports = SetCache; - - -/***/ }), - -/***/ "./node_modules/lodash/_Stack.js": -/*!***************************************!*\ - !*** ./node_modules/lodash/_Stack.js ***! - \***************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"), - stackClear = __webpack_require__(/*! ./_stackClear */ "./node_modules/lodash/_stackClear.js"), - stackDelete = __webpack_require__(/*! ./_stackDelete */ "./node_modules/lodash/_stackDelete.js"), - stackGet = __webpack_require__(/*! ./_stackGet */ "./node_modules/lodash/_stackGet.js"), - stackHas = __webpack_require__(/*! ./_stackHas */ "./node_modules/lodash/_stackHas.js"), - stackSet = __webpack_require__(/*! ./_stackSet */ "./node_modules/lodash/_stackSet.js"); - -/** - * Creates a stack cache object to store key-value pairs. + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -function Stack(entries) { - var data = this.__data__ = new ListCache(entries); - this.size = data.size; -} - -// Add methods to `Stack`. -Stack.prototype.clear = stackClear; -Stack.prototype['delete'] = stackDelete; -Stack.prototype.get = stackGet; -Stack.prototype.has = stackHas; -Stack.prototype.set = stackSet; - -module.exports = Stack; - - -/***/ }), - -/***/ "./node_modules/lodash/_Symbol.js": -/*!****************************************!*\ - !*** ./node_modules/lodash/_Symbol.js ***! - \****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); - -/** Built-in value references. */ -var Symbol = root.Symbol; - -module.exports = Symbol; - - -/***/ }), - -/***/ "./node_modules/lodash/_Uint8Array.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_Uint8Array.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); -/** Built-in value references. */ -var Uint8Array = root.Uint8Array; +var lib = __webpack_require__(/*! ./lib */ "./node_modules/graphlib/lib/index.js"); -module.exports = Uint8Array; +module.exports = { + Graph: lib.Graph, + json: __webpack_require__(/*! ./lib/json */ "./node_modules/graphlib/lib/json.js"), + alg: __webpack_require__(/*! ./lib/alg */ "./node_modules/graphlib/lib/alg/index.js"), + version: lib.version +}; /***/ }), -/***/ "./node_modules/lodash/_WeakMap.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/_WeakMap.js ***! - \*****************************************/ +/***/ "./node_modules/graphlib/lib/alg/components.js": +/*!*****************************************************!*\ + !*** ./node_modules/graphlib/lib/alg/components.js ***! + \*****************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), - root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); - -/* Built-in method references that are verified to be native. */ -var WeakMap = getNative(root, 'WeakMap'); +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); -module.exports = WeakMap; +module.exports = components; +function components(g) { + var visited = {}; + var cmpts = []; + var cmpt; -/***/ }), + function dfs(v) { + if (_.has(visited, v)) return; + visited[v] = true; + cmpt.push(v); + _.each(g.successors(v), dfs); + _.each(g.predecessors(v), dfs); + } -/***/ "./node_modules/lodash/_apply.js": -/*!***************************************!*\ - !*** ./node_modules/lodash/_apply.js ***! - \***************************************/ -/***/ (function(module) { + _.each(g.nodes(), function(v) { + cmpt = []; + dfs(v); + if (cmpt.length) { + cmpts.push(cmpt); + } + }); -/** - * A faster alternative to `Function#apply`, this function invokes `func` - * with the `this` binding of `thisArg` and the arguments of `args`. - * - * @private - * @param {Function} func The function to invoke. - * @param {*} thisArg The `this` binding of `func`. - * @param {Array} args The arguments to invoke `func` with. - * @returns {*} Returns the result of `func`. - */ -function apply(func, thisArg, args) { - switch (args.length) { - case 0: return func.call(thisArg); - case 1: return func.call(thisArg, args[0]); - case 2: return func.call(thisArg, args[0], args[1]); - case 3: return func.call(thisArg, args[0], args[1], args[2]); - } - return func.apply(thisArg, args); + return cmpts; } -module.exports = apply; - /***/ }), -/***/ "./node_modules/lodash/_arrayEach.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_arrayEach.js ***! - \*******************************************/ -/***/ (function(module) { - -/** - * A specialized version of `_.forEach` for arrays without support for - * iteratee shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns `array`. - */ -function arrayEach(array, iteratee) { - var index = -1, - length = array == null ? 0 : array.length; - - while (++index < length) { - if (iteratee(array[index], index, array) === false) { - break; - } - } - return array; -} - -module.exports = arrayEach; - +/***/ "./node_modules/graphlib/lib/alg/dfs.js": +/*!**********************************************!*\ + !*** ./node_modules/graphlib/lib/alg/dfs.js ***! + \**********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -/***/ }), +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); -/***/ "./node_modules/lodash/_arrayFilter.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_arrayFilter.js ***! - \*********************************************/ -/***/ (function(module) { +module.exports = dfs; -/** - * A specialized version of `_.filter` for arrays without support for - * iteratee shorthands. +/* + * A helper that preforms a pre- or post-order traversal on the input graph + * and returns the nodes in the order they were visited. If the graph is + * undirected then this algorithm will navigate using neighbors. If the graph + * is directed then this algorithm will navigate using successors. * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {Array} Returns the new filtered array. + * Order must be one of "pre" or "post". */ -function arrayFilter(array, predicate) { - var index = -1, - length = array == null ? 0 : array.length, - resIndex = 0, - result = []; +function dfs(g, vs, order) { + if (!_.isArray(vs)) { + vs = [vs]; + } - while (++index < length) { - var value = array[index]; - if (predicate(value, index, array)) { - result[resIndex++] = value; + var navigation = (g.isDirected() ? g.successors : g.neighbors).bind(g); + + var acc = []; + var visited = {}; + _.each(vs, function(v) { + if (!g.hasNode(v)) { + throw new Error("Graph does not have node: " + v); } - } - return result; + + doDfs(g, v, order === "post", visited, navigation, acc); + }); + return acc; } -module.exports = arrayFilter; +function doDfs(g, v, postorder, visited, navigation, acc) { + if (!_.has(visited, v)) { + visited[v] = true; + + if (!postorder) { acc.push(v); } + _.each(navigation(v), function(w) { + doDfs(g, w, postorder, visited, navigation, acc); + }); + if (postorder) { acc.push(v); } + } +} /***/ }), -/***/ "./node_modules/lodash/_arrayIncludes.js": -/*!***********************************************!*\ - !*** ./node_modules/lodash/_arrayIncludes.js ***! - \***********************************************/ +/***/ "./node_modules/graphlib/lib/alg/dijkstra-all.js": +/*!*******************************************************!*\ + !*** ./node_modules/graphlib/lib/alg/dijkstra-all.js ***! + \*******************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var baseIndexOf = __webpack_require__(/*! ./_baseIndexOf */ "./node_modules/lodash/_baseIndexOf.js"); +var dijkstra = __webpack_require__(/*! ./dijkstra */ "./node_modules/graphlib/lib/alg/dijkstra.js"); +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); -/** - * A specialized version of `_.includes` for arrays without support for - * specifying an index to search from. - * - * @private - * @param {Array} [array] The array to inspect. - * @param {*} target The value to search for. - * @returns {boolean} Returns `true` if `target` is found, else `false`. - */ -function arrayIncludes(array, value) { - var length = array == null ? 0 : array.length; - return !!length && baseIndexOf(array, value, 0) > -1; -} +module.exports = dijkstraAll; -module.exports = arrayIncludes; +function dijkstraAll(g, weightFunc, edgeFunc) { + return _.transform(g.nodes(), function(acc, v) { + acc[v] = dijkstra(g, v, weightFunc, edgeFunc); + }, {}); +} /***/ }), -/***/ "./node_modules/lodash/_arrayIncludesWith.js": +/***/ "./node_modules/graphlib/lib/alg/dijkstra.js": /*!***************************************************!*\ - !*** ./node_modules/lodash/_arrayIncludesWith.js ***! + !*** ./node_modules/graphlib/lib/alg/dijkstra.js ***! \***************************************************/ -/***/ (function(module) { - -/** - * This function is like `arrayIncludes` except that it accepts a comparator. - * - * @private - * @param {Array} [array] The array to inspect. - * @param {*} target The value to search for. - * @param {Function} comparator The comparator invoked per element. - * @returns {boolean} Returns `true` if `target` is found, else `false`. - */ -function arrayIncludesWith(array, value, comparator) { - var index = -1, - length = array == null ? 0 : array.length; +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - while (++index < length) { - if (comparator(value, array[index])) { - return true; - } - } - return false; -} +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); +var PriorityQueue = __webpack_require__(/*! ../data/priority-queue */ "./node_modules/graphlib/lib/data/priority-queue.js"); -module.exports = arrayIncludesWith; +module.exports = dijkstra; +var DEFAULT_WEIGHT_FUNC = _.constant(1); -/***/ }), +function dijkstra(g, source, weightFn, edgeFn) { + return runDijkstra(g, String(source), + weightFn || DEFAULT_WEIGHT_FUNC, + edgeFn || function(v) { return g.outEdges(v); }); +} -/***/ "./node_modules/lodash/_arrayLikeKeys.js": -/*!***********************************************!*\ - !*** ./node_modules/lodash/_arrayLikeKeys.js ***! - \***********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +function runDijkstra(g, source, weightFn, edgeFn) { + var results = {}; + var pq = new PriorityQueue(); + var v, vEntry; -var baseTimes = __webpack_require__(/*! ./_baseTimes */ "./node_modules/lodash/_baseTimes.js"), - isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"), - isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), - isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"), - isIndex = __webpack_require__(/*! ./_isIndex */ "./node_modules/lodash/_isIndex.js"), - isTypedArray = __webpack_require__(/*! ./isTypedArray */ "./node_modules/lodash/isTypedArray.js"); + var updateNeighbors = function(edge) { + var w = edge.v !== v ? edge.v : edge.w; + var wEntry = results[w]; + var weight = weightFn(edge); + var distance = vEntry.distance + weight; -/** Used for built-in method references. */ -var objectProto = Object.prototype; + if (weight < 0) { + throw new Error("dijkstra does not allow negative edge weights. " + + "Bad edge: " + edge + " Weight: " + weight); + } -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; + if (distance < wEntry.distance) { + wEntry.distance = distance; + wEntry.predecessor = v; + pq.decrease(w, distance); + } + }; -/** - * Creates an array of the enumerable property names of the array-like `value`. - * - * @private - * @param {*} value The value to query. - * @param {boolean} inherited Specify returning inherited property names. - * @returns {Array} Returns the array of property names. - */ -function arrayLikeKeys(value, inherited) { - var isArr = isArray(value), - isArg = !isArr && isArguments(value), - isBuff = !isArr && !isArg && isBuffer(value), - isType = !isArr && !isArg && !isBuff && isTypedArray(value), - skipIndexes = isArr || isArg || isBuff || isType, - result = skipIndexes ? baseTimes(value.length, String) : [], - length = result.length; + g.nodes().forEach(function(v) { + var distance = v === source ? 0 : Number.POSITIVE_INFINITY; + results[v] = { distance: distance }; + pq.add(v, distance); + }); - for (var key in value) { - if ((inherited || hasOwnProperty.call(value, key)) && - !(skipIndexes && ( - // Safari 9 has enumerable `arguments.length` in strict mode. - key == 'length' || - // Node.js 0.10 has enumerable non-index properties on buffers. - (isBuff && (key == 'offset' || key == 'parent')) || - // PhantomJS 2 has enumerable non-index properties on typed arrays. - (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || - // Skip index properties. - isIndex(key, length) - ))) { - result.push(key); + while (pq.size() > 0) { + v = pq.removeMin(); + vEntry = results[v]; + if (vEntry.distance === Number.POSITIVE_INFINITY) { + break; } + + edgeFn(v).forEach(updateNeighbors); } - return result; -} -module.exports = arrayLikeKeys; + return results; +} /***/ }), -/***/ "./node_modules/lodash/_arrayMap.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_arrayMap.js ***! - \******************************************/ -/***/ (function(module) { +/***/ "./node_modules/graphlib/lib/alg/find-cycles.js": +/*!******************************************************!*\ + !*** ./node_modules/graphlib/lib/alg/find-cycles.js ***! + \******************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -/** - * A specialized version of `_.map` for arrays without support for iteratee - * shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns the new mapped array. - */ -function arrayMap(array, iteratee) { - var index = -1, - length = array == null ? 0 : array.length, - result = Array(length); +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); +var tarjan = __webpack_require__(/*! ./tarjan */ "./node_modules/graphlib/lib/alg/tarjan.js"); - while (++index < length) { - result[index] = iteratee(array[index], index, array); - } - return result; -} +module.exports = findCycles; -module.exports = arrayMap; +function findCycles(g) { + return _.filter(tarjan(g), function(cmpt) { + return cmpt.length > 1 || (cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0])); + }); +} /***/ }), -/***/ "./node_modules/lodash/_arrayPush.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_arrayPush.js ***! - \*******************************************/ -/***/ (function(module) { +/***/ "./node_modules/graphlib/lib/alg/floyd-warshall.js": +/*!*********************************************************!*\ + !*** ./node_modules/graphlib/lib/alg/floyd-warshall.js ***! + \*********************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -/** - * Appends the elements of `values` to `array`. - * - * @private - * @param {Array} array The array to modify. - * @param {Array} values The values to append. - * @returns {Array} Returns `array`. - */ -function arrayPush(array, values) { - var index = -1, - length = values.length, - offset = array.length; +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); - while (++index < length) { - array[offset + index] = values[index]; - } - return array; -} +module.exports = floydWarshall; -module.exports = arrayPush; +var DEFAULT_WEIGHT_FUNC = _.constant(1); +function floydWarshall(g, weightFn, edgeFn) { + return runFloydWarshall(g, + weightFn || DEFAULT_WEIGHT_FUNC, + edgeFn || function(v) { return g.outEdges(v); }); +} -/***/ }), +function runFloydWarshall(g, weightFn, edgeFn) { + var results = {}; + var nodes = g.nodes(); -/***/ "./node_modules/lodash/_arrayReduce.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_arrayReduce.js ***! - \*********************************************/ -/***/ (function(module) { + nodes.forEach(function(v) { + results[v] = {}; + results[v][v] = { distance: 0 }; + nodes.forEach(function(w) { + if (v !== w) { + results[v][w] = { distance: Number.POSITIVE_INFINITY }; + } + }); + edgeFn(v).forEach(function(edge) { + var w = edge.v === v ? edge.w : edge.v; + var d = weightFn(edge); + results[v][w] = { distance: d, predecessor: v }; + }); + }); -/** - * A specialized version of `_.reduce` for arrays without support for - * iteratee shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {*} [accumulator] The initial value. - * @param {boolean} [initAccum] Specify using the first element of `array` as - * the initial value. - * @returns {*} Returns the accumulated value. - */ -function arrayReduce(array, iteratee, accumulator, initAccum) { - var index = -1, - length = array == null ? 0 : array.length; + nodes.forEach(function(k) { + var rowK = results[k]; + nodes.forEach(function(i) { + var rowI = results[i]; + nodes.forEach(function(j) { + var ik = rowI[k]; + var kj = rowK[j]; + var ij = rowI[j]; + var altDistance = ik.distance + kj.distance; + if (altDistance < ij.distance) { + ij.distance = altDistance; + ij.predecessor = kj.predecessor; + } + }); + }); + }); - if (initAccum && length) { - accumulator = array[++index]; - } - while (++index < length) { - accumulator = iteratee(accumulator, array[index], index, array); - } - return accumulator; + return results; } -module.exports = arrayReduce; + +/***/ }), + +/***/ "./node_modules/graphlib/lib/alg/index.js": +/*!************************************************!*\ + !*** ./node_modules/graphlib/lib/alg/index.js ***! + \************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +module.exports = { + components: __webpack_require__(/*! ./components */ "./node_modules/graphlib/lib/alg/components.js"), + dijkstra: __webpack_require__(/*! ./dijkstra */ "./node_modules/graphlib/lib/alg/dijkstra.js"), + dijkstraAll: __webpack_require__(/*! ./dijkstra-all */ "./node_modules/graphlib/lib/alg/dijkstra-all.js"), + findCycles: __webpack_require__(/*! ./find-cycles */ "./node_modules/graphlib/lib/alg/find-cycles.js"), + floydWarshall: __webpack_require__(/*! ./floyd-warshall */ "./node_modules/graphlib/lib/alg/floyd-warshall.js"), + isAcyclic: __webpack_require__(/*! ./is-acyclic */ "./node_modules/graphlib/lib/alg/is-acyclic.js"), + postorder: __webpack_require__(/*! ./postorder */ "./node_modules/graphlib/lib/alg/postorder.js"), + preorder: __webpack_require__(/*! ./preorder */ "./node_modules/graphlib/lib/alg/preorder.js"), + prim: __webpack_require__(/*! ./prim */ "./node_modules/graphlib/lib/alg/prim.js"), + tarjan: __webpack_require__(/*! ./tarjan */ "./node_modules/graphlib/lib/alg/tarjan.js"), + topsort: __webpack_require__(/*! ./topsort */ "./node_modules/graphlib/lib/alg/topsort.js") +}; /***/ }), -/***/ "./node_modules/lodash/_arraySome.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_arraySome.js ***! - \*******************************************/ -/***/ (function(module) { +/***/ "./node_modules/graphlib/lib/alg/is-acyclic.js": +/*!*****************************************************!*\ + !*** ./node_modules/graphlib/lib/alg/is-acyclic.js ***! + \*****************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -/** - * A specialized version of `_.some` for arrays without support for iteratee - * shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {boolean} Returns `true` if any element passes the predicate check, - * else `false`. - */ -function arraySome(array, predicate) { - var index = -1, - length = array == null ? 0 : array.length; +var topsort = __webpack_require__(/*! ./topsort */ "./node_modules/graphlib/lib/alg/topsort.js"); - while (++index < length) { - if (predicate(array[index], index, array)) { - return true; +module.exports = isAcyclic; + +function isAcyclic(g) { + try { + topsort(g); + } catch (e) { + if (e instanceof topsort.CycleException) { + return false; } + throw e; } - return false; + return true; } -module.exports = arraySome; - /***/ }), -/***/ "./node_modules/lodash/_asciiSize.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_asciiSize.js ***! - \*******************************************/ +/***/ "./node_modules/graphlib/lib/alg/postorder.js": +/*!****************************************************!*\ + !*** ./node_modules/graphlib/lib/alg/postorder.js ***! + \****************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var baseProperty = __webpack_require__(/*! ./_baseProperty */ "./node_modules/lodash/_baseProperty.js"); +var dfs = __webpack_require__(/*! ./dfs */ "./node_modules/graphlib/lib/alg/dfs.js"); -/** - * Gets the size of an ASCII `string`. - * - * @private - * @param {string} string The string inspect. - * @returns {number} Returns the string size. - */ -var asciiSize = baseProperty('length'); +module.exports = postorder; -module.exports = asciiSize; +function postorder(g, vs) { + return dfs(g, vs, "post"); +} /***/ }), -/***/ "./node_modules/lodash/_assignMergeValue.js": -/*!**************************************************!*\ - !*** ./node_modules/lodash/_assignMergeValue.js ***! - \**************************************************/ +/***/ "./node_modules/graphlib/lib/alg/preorder.js": +/*!***************************************************!*\ + !*** ./node_modules/graphlib/lib/alg/preorder.js ***! + \***************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ "./node_modules/lodash/_baseAssignValue.js"), - eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"); +var dfs = __webpack_require__(/*! ./dfs */ "./node_modules/graphlib/lib/alg/dfs.js"); -/** - * This function is like `assignValue` except that it doesn't assign - * `undefined` values. - * - * @private - * @param {Object} object The object to modify. - * @param {string} key The key of the property to assign. - * @param {*} value The value to assign. - */ -function assignMergeValue(object, key, value) { - if ((value !== undefined && !eq(object[key], value)) || - (value === undefined && !(key in object))) { - baseAssignValue(object, key, value); - } -} +module.exports = preorder; -module.exports = assignMergeValue; +function preorder(g, vs) { + return dfs(g, vs, "pre"); +} /***/ }), -/***/ "./node_modules/lodash/_assignValue.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_assignValue.js ***! - \*********************************************/ +/***/ "./node_modules/graphlib/lib/alg/prim.js": +/*!***********************************************!*\ + !*** ./node_modules/graphlib/lib/alg/prim.js ***! + \***********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ "./node_modules/lodash/_baseAssignValue.js"), - eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"); +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); +var Graph = __webpack_require__(/*! ../graph */ "./node_modules/graphlib/lib/graph.js"); +var PriorityQueue = __webpack_require__(/*! ../data/priority-queue */ "./node_modules/graphlib/lib/data/priority-queue.js"); -/** Used for built-in method references. */ -var objectProto = Object.prototype; +module.exports = prim; -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; +function prim(g, weightFunc) { + var result = new Graph(); + var parents = {}; + var pq = new PriorityQueue(); + var v; + + function updateNeighbors(edge) { + var w = edge.v === v ? edge.w : edge.v; + var pri = pq.priority(w); + if (pri !== undefined) { + var edgeWeight = weightFunc(edge); + if (edgeWeight < pri) { + parents[w] = v; + pq.decrease(w, edgeWeight); + } + } + } + + if (g.nodeCount() === 0) { + return result; + } + + _.each(g.nodes(), function(v) { + pq.add(v, Number.POSITIVE_INFINITY); + result.setNode(v); + }); + + // Start from an arbitrary node + pq.decrease(g.nodes()[0], 0); + + var init = false; + while (pq.size() > 0) { + v = pq.removeMin(); + if (_.has(parents, v)) { + result.setEdge(v, parents[v]); + } else if (init) { + throw new Error("Input graph is not connected: " + g); + } else { + init = true; + } -/** - * Assigns `value` to `key` of `object` if the existing value is not equivalent - * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. - * - * @private - * @param {Object} object The object to modify. - * @param {string} key The key of the property to assign. - * @param {*} value The value to assign. - */ -function assignValue(object, key, value) { - var objValue = object[key]; - if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || - (value === undefined && !(key in object))) { - baseAssignValue(object, key, value); + g.nodeEdges(v).forEach(updateNeighbors); } -} -module.exports = assignValue; + return result; +} /***/ }), -/***/ "./node_modules/lodash/_assocIndexOf.js": -/*!**********************************************!*\ - !*** ./node_modules/lodash/_assocIndexOf.js ***! - \**********************************************/ +/***/ "./node_modules/graphlib/lib/alg/tarjan.js": +/*!*************************************************!*\ + !*** ./node_modules/graphlib/lib/alg/tarjan.js ***! + \*************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"); +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); -/** - * Gets the index at which the `key` is found in `array` of key-value pairs. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} key The key to search for. - * @returns {number} Returns the index of the matched value, else `-1`. - */ -function assocIndexOf(array, key) { - var length = array.length; - while (length--) { - if (eq(array[length][0], key)) { - return length; - } - } - return -1; -} +module.exports = tarjan; -module.exports = assocIndexOf; +function tarjan(g) { + var index = 0; + var stack = []; + var visited = {}; // node id -> { onStack, lowlink, index } + var results = []; + function dfs(v) { + var entry = visited[v] = { + onStack: true, + lowlink: index, + index: index++ + }; + stack.push(v); -/***/ }), + g.successors(v).forEach(function(w) { + if (!_.has(visited, w)) { + dfs(w); + entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink); + } else if (visited[w].onStack) { + entry.lowlink = Math.min(entry.lowlink, visited[w].index); + } + }); -/***/ "./node_modules/lodash/_baseAssign.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_baseAssign.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + if (entry.lowlink === entry.index) { + var cmpt = []; + var w; + do { + w = stack.pop(); + visited[w].onStack = false; + cmpt.push(w); + } while (v !== w); + results.push(cmpt); + } + } -var copyObject = __webpack_require__(/*! ./_copyObject */ "./node_modules/lodash/_copyObject.js"), - keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); + g.nodes().forEach(function(v) { + if (!_.has(visited, v)) { + dfs(v); + } + }); -/** - * The base implementation of `_.assign` without support for multiple sources - * or `customizer` functions. - * - * @private - * @param {Object} object The destination object. - * @param {Object} source The source object. - * @returns {Object} Returns `object`. - */ -function baseAssign(object, source) { - return object && copyObject(source, keys(source), object); + return results; } -module.exports = baseAssign; - /***/ }), -/***/ "./node_modules/lodash/_baseAssignIn.js": -/*!**********************************************!*\ - !*** ./node_modules/lodash/_baseAssignIn.js ***! - \**********************************************/ +/***/ "./node_modules/graphlib/lib/alg/topsort.js": +/*!**************************************************!*\ + !*** ./node_modules/graphlib/lib/alg/topsort.js ***! + \**************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var copyObject = __webpack_require__(/*! ./_copyObject */ "./node_modules/lodash/_copyObject.js"), - keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js"); - -/** - * The base implementation of `_.assignIn` without support for multiple sources - * or `customizer` functions. - * - * @private - * @param {Object} object The destination object. - * @param {Object} source The source object. - * @returns {Object} Returns `object`. - */ -function baseAssignIn(object, source) { - return object && copyObject(source, keysIn(source), object); -} +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); -module.exports = baseAssignIn; +module.exports = topsort; +topsort.CycleException = CycleException; +function topsort(g) { + var visited = {}; + var stack = {}; + var results = []; -/***/ }), + function visit(node) { + if (_.has(stack, node)) { + throw new CycleException(); + } -/***/ "./node_modules/lodash/_baseAssignValue.js": -/*!*************************************************!*\ - !*** ./node_modules/lodash/_baseAssignValue.js ***! - \*************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + if (!_.has(visited, node)) { + stack[node] = true; + visited[node] = true; + _.each(g.predecessors(node), visit); + delete stack[node]; + results.push(node); + } + } -var defineProperty = __webpack_require__(/*! ./_defineProperty */ "./node_modules/lodash/_defineProperty.js"); + _.each(g.sinks(), visit); -/** - * The base implementation of `assignValue` and `assignMergeValue` without - * value checks. - * - * @private - * @param {Object} object The object to modify. - * @param {string} key The key of the property to assign. - * @param {*} value The value to assign. - */ -function baseAssignValue(object, key, value) { - if (key == '__proto__' && defineProperty) { - defineProperty(object, key, { - 'configurable': true, - 'enumerable': true, - 'value': value, - 'writable': true - }); - } else { - object[key] = value; + if (_.size(visited) !== g.nodeCount()) { + throw new CycleException(); } -} -module.exports = baseAssignValue; + return results; +} +function CycleException() {} +CycleException.prototype = new Error(); // must be an instance of Error to pass testing /***/ }), -/***/ "./node_modules/lodash/_baseClone.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_baseClone.js ***! - \*******************************************/ +/***/ "./node_modules/graphlib/lib/data/priority-queue.js": +/*!**********************************************************!*\ + !*** ./node_modules/graphlib/lib/data/priority-queue.js ***! + \**********************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var Stack = __webpack_require__(/*! ./_Stack */ "./node_modules/lodash/_Stack.js"), - arrayEach = __webpack_require__(/*! ./_arrayEach */ "./node_modules/lodash/_arrayEach.js"), - assignValue = __webpack_require__(/*! ./_assignValue */ "./node_modules/lodash/_assignValue.js"), - baseAssign = __webpack_require__(/*! ./_baseAssign */ "./node_modules/lodash/_baseAssign.js"), - baseAssignIn = __webpack_require__(/*! ./_baseAssignIn */ "./node_modules/lodash/_baseAssignIn.js"), - cloneBuffer = __webpack_require__(/*! ./_cloneBuffer */ "./node_modules/lodash/_cloneBuffer.js"), - copyArray = __webpack_require__(/*! ./_copyArray */ "./node_modules/lodash/_copyArray.js"), - copySymbols = __webpack_require__(/*! ./_copySymbols */ "./node_modules/lodash/_copySymbols.js"), - copySymbolsIn = __webpack_require__(/*! ./_copySymbolsIn */ "./node_modules/lodash/_copySymbolsIn.js"), - getAllKeys = __webpack_require__(/*! ./_getAllKeys */ "./node_modules/lodash/_getAllKeys.js"), - getAllKeysIn = __webpack_require__(/*! ./_getAllKeysIn */ "./node_modules/lodash/_getAllKeysIn.js"), - getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"), - initCloneArray = __webpack_require__(/*! ./_initCloneArray */ "./node_modules/lodash/_initCloneArray.js"), - initCloneByTag = __webpack_require__(/*! ./_initCloneByTag */ "./node_modules/lodash/_initCloneByTag.js"), - initCloneObject = __webpack_require__(/*! ./_initCloneObject */ "./node_modules/lodash/_initCloneObject.js"), - isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), - isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"), - isMap = __webpack_require__(/*! ./isMap */ "./node_modules/lodash/isMap.js"), - isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), - isSet = __webpack_require__(/*! ./isSet */ "./node_modules/lodash/isSet.js"), - keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"), - keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js"); +var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); -/** Used to compose bitmasks for cloning. */ -var CLONE_DEEP_FLAG = 1, - CLONE_FLAT_FLAG = 2, - CLONE_SYMBOLS_FLAG = 4; +module.exports = PriorityQueue; -/** `Object#toString` result references. */ -var argsTag = '[object Arguments]', - arrayTag = '[object Array]', - boolTag = '[object Boolean]', - dateTag = '[object Date]', - errorTag = '[object Error]', - funcTag = '[object Function]', - genTag = '[object GeneratorFunction]', - mapTag = '[object Map]', - numberTag = '[object Number]', - objectTag = '[object Object]', - regexpTag = '[object RegExp]', - setTag = '[object Set]', - stringTag = '[object String]', - symbolTag = '[object Symbol]', - weakMapTag = '[object WeakMap]'; +/** + * A min-priority queue data structure. This algorithm is derived from Cormen, + * et al., "Introduction to Algorithms". The basic idea of a min-priority + * queue is that you can efficiently (in O(1) time) get the smallest key in + * the queue. Adding and removing elements takes O(log n) time. A key can + * have its priority decreased in O(log n) time. + */ +function PriorityQueue() { + this._arr = []; + this._keyIndices = {}; +} -var arrayBufferTag = '[object ArrayBuffer]', - dataViewTag = '[object DataView]', - float32Tag = '[object Float32Array]', - float64Tag = '[object Float64Array]', - int8Tag = '[object Int8Array]', - int16Tag = '[object Int16Array]', - int32Tag = '[object Int32Array]', - uint8Tag = '[object Uint8Array]', - uint8ClampedTag = '[object Uint8ClampedArray]', - uint16Tag = '[object Uint16Array]', - uint32Tag = '[object Uint32Array]'; +/** + * Returns the number of elements in the queue. Takes `O(1)` time. + */ +PriorityQueue.prototype.size = function() { + return this._arr.length; +}; -/** Used to identify `toStringTag` values supported by `_.clone`. */ -var cloneableTags = {}; -cloneableTags[argsTag] = cloneableTags[arrayTag] = -cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = -cloneableTags[boolTag] = cloneableTags[dateTag] = -cloneableTags[float32Tag] = cloneableTags[float64Tag] = -cloneableTags[int8Tag] = cloneableTags[int16Tag] = -cloneableTags[int32Tag] = cloneableTags[mapTag] = -cloneableTags[numberTag] = cloneableTags[objectTag] = -cloneableTags[regexpTag] = cloneableTags[setTag] = -cloneableTags[stringTag] = cloneableTags[symbolTag] = -cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = -cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; -cloneableTags[errorTag] = cloneableTags[funcTag] = -cloneableTags[weakMapTag] = false; +/** + * Returns the keys that are in the queue. Takes `O(n)` time. + */ +PriorityQueue.prototype.keys = function() { + return this._arr.map(function(x) { return x.key; }); +}; /** - * The base implementation of `_.clone` and `_.cloneDeep` which tracks - * traversed objects. + * Returns `true` if **key** is in the queue and `false` if not. + */ +PriorityQueue.prototype.has = function(key) { + return _.has(this._keyIndices, key); +}; + +/** + * Returns the priority for **key**. If **key** is not present in the queue + * then this function returns `undefined`. Takes `O(1)` time. * - * @private - * @param {*} value The value to clone. - * @param {boolean} bitmask The bitmask flags. - * 1 - Deep clone - * 2 - Flatten inherited properties - * 4 - Clone symbols - * @param {Function} [customizer] The function to customize cloning. - * @param {string} [key] The key of `value`. - * @param {Object} [object] The parent object of `value`. - * @param {Object} [stack] Tracks traversed objects and their clone counterparts. - * @returns {*} Returns the cloned value. + * @param {Object} key */ -function baseClone(value, bitmask, customizer, key, object, stack) { - var result, - isDeep = bitmask & CLONE_DEEP_FLAG, - isFlat = bitmask & CLONE_FLAT_FLAG, - isFull = bitmask & CLONE_SYMBOLS_FLAG; +PriorityQueue.prototype.priority = function(key) { + var index = this._keyIndices[key]; + if (index !== undefined) { + return this._arr[index].priority; + } +}; - if (customizer) { - result = object ? customizer(value, key, object, stack) : customizer(value); +/** + * Returns the key for the minimum element in this queue. If the queue is + * empty this function throws an Error. Takes `O(1)` time. + */ +PriorityQueue.prototype.min = function() { + if (this.size() === 0) { + throw new Error("Queue underflow"); } - if (result !== undefined) { - return result; + return this._arr[0].key; +}; + +/** + * Inserts a new key into the priority queue. If the key already exists in + * the queue this function returns `false`; otherwise it will return `true`. + * Takes `O(n)` time. + * + * @param {Object} key the key to add + * @param {Number} priority the initial priority for the key + */ +PriorityQueue.prototype.add = function(key, priority) { + var keyIndices = this._keyIndices; + key = String(key); + if (!_.has(keyIndices, key)) { + var arr = this._arr; + var index = arr.length; + keyIndices[key] = index; + arr.push({key: key, priority: priority}); + this._decrease(index); + return true; } - if (!isObject(value)) { - return value; + return false; +}; + +/** + * Removes and returns the smallest key in the queue. Takes `O(log n)` time. + */ +PriorityQueue.prototype.removeMin = function() { + this._swap(0, this._arr.length - 1); + var min = this._arr.pop(); + delete this._keyIndices[min.key]; + this._heapify(0); + return min.key; +}; + +/** + * Decreases the priority for **key** to **priority**. If the new priority is + * greater than the previous priority, this function will throw an Error. + * + * @param {Object} key the key for which to raise priority + * @param {Number} priority the new priority for the key + */ +PriorityQueue.prototype.decrease = function(key, priority) { + var index = this._keyIndices[key]; + if (priority > this._arr[index].priority) { + throw new Error("New priority is greater than current priority. " + + "Key: " + key + " Old: " + this._arr[index].priority + " New: " + priority); } - var isArr = isArray(value); - if (isArr) { - result = initCloneArray(value); - if (!isDeep) { - return copyArray(value, result); - } - } else { - var tag = getTag(value), - isFunc = tag == funcTag || tag == genTag; + this._arr[index].priority = priority; + this._decrease(index); +}; - if (isBuffer(value)) { - return cloneBuffer(value, isDeep); +PriorityQueue.prototype._heapify = function(i) { + var arr = this._arr; + var l = 2 * i; + var r = l + 1; + var largest = i; + if (l < arr.length) { + largest = arr[l].priority < arr[largest].priority ? l : largest; + if (r < arr.length) { + largest = arr[r].priority < arr[largest].priority ? r : largest; } - if (tag == objectTag || tag == argsTag || (isFunc && !object)) { - result = (isFlat || isFunc) ? {} : initCloneObject(value); - if (!isDeep) { - return isFlat - ? copySymbolsIn(value, baseAssignIn(result, value)) - : copySymbols(value, baseAssign(result, value)); - } - } else { - if (!cloneableTags[tag]) { - return object ? value : {}; - } - result = initCloneByTag(value, tag, isDeep); + if (largest !== i) { + this._swap(i, largest); + this._heapify(largest); } } - // Check for circular references and return its corresponding clone. - stack || (stack = new Stack); - var stacked = stack.get(value); - if (stacked) { - return stacked; - } - stack.set(value, result); - - if (isSet(value)) { - value.forEach(function(subValue) { - result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); - }); - } else if (isMap(value)) { - value.forEach(function(subValue, key) { - result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack)); - }); - } - - var keysFunc = isFull - ? (isFlat ? getAllKeysIn : getAllKeys) - : (isFlat ? keysIn : keys); +}; - var props = isArr ? undefined : keysFunc(value); - arrayEach(props || value, function(subValue, key) { - if (props) { - key = subValue; - subValue = value[key]; +PriorityQueue.prototype._decrease = function(index) { + var arr = this._arr; + var priority = arr[index].priority; + var parent; + while (index !== 0) { + parent = index >> 1; + if (arr[parent].priority < priority) { + break; } - // Recursively populate clone (susceptible to call stack limits). - assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); - }); - return result; -} + this._swap(index, parent); + index = parent; + } +}; -module.exports = baseClone; +PriorityQueue.prototype._swap = function(i, j) { + var arr = this._arr; + var keyIndices = this._keyIndices; + var origArrI = arr[i]; + var origArrJ = arr[j]; + arr[i] = origArrJ; + arr[j] = origArrI; + keyIndices[origArrJ.key] = i; + keyIndices[origArrI.key] = j; +}; /***/ }), -/***/ "./node_modules/lodash/_baseCreate.js": +/***/ "./node_modules/graphlib/lib/graph.js": /*!********************************************!*\ - !*** ./node_modules/lodash/_baseCreate.js ***! + !*** ./node_modules/graphlib/lib/graph.js ***! \********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"); - -/** Built-in value references. */ -var objectCreate = Object.create; - -/** - * The base implementation of `_.create` without support for assigning - * properties to the created object. - * - * @private - * @param {Object} proto The object to inherit from. - * @returns {Object} Returns the new object. - */ -var baseCreate = (function() { - function object() {} - return function(proto) { - if (!isObject(proto)) { - return {}; - } - if (objectCreate) { - return objectCreate(proto); - } - object.prototype = proto; - var result = new object; - object.prototype = undefined; - return result; - }; -}()); - -module.exports = baseCreate; - +"use strict"; -/***/ }), -/***/ "./node_modules/lodash/_baseEach.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_baseEach.js ***! - \******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var _ = __webpack_require__(/*! ./lodash */ "./node_modules/graphlib/lib/lodash.js"); -var baseForOwn = __webpack_require__(/*! ./_baseForOwn */ "./node_modules/lodash/_baseForOwn.js"), - createBaseEach = __webpack_require__(/*! ./_createBaseEach */ "./node_modules/lodash/_createBaseEach.js"); +module.exports = Graph; -/** - * The base implementation of `_.forEach` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array|Object} Returns `collection`. - */ -var baseEach = createBaseEach(baseForOwn); +var DEFAULT_EDGE_NAME = "\x00"; +var GRAPH_NODE = "\x00"; +var EDGE_KEY_DELIM = "\x01"; -module.exports = baseEach; +// Implementation notes: +// +// * Node id query functions should return string ids for the nodes +// * Edge id query functions should return an "edgeObj", edge object, that is +// composed of enough information to uniquely identify an edge: {v, w, name}. +// * Internally we use an "edgeId", a stringified form of the edgeObj, to +// reference edges. This is because we need a performant way to look these +// edges up and, object properties, which have string keys, are the closest +// we're going to get to a performant hashtable in JavaScript. +function Graph(opts) { + this._isDirected = _.has(opts, "directed") ? opts.directed : true; + this._isMultigraph = _.has(opts, "multigraph") ? opts.multigraph : false; + this._isCompound = _.has(opts, "compound") ? opts.compound : false; -/***/ }), + // Label for the graph itself + this._label = undefined; -/***/ "./node_modules/lodash/_baseExtremum.js": -/*!**********************************************!*\ - !*** ./node_modules/lodash/_baseExtremum.js ***! - \**********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // Defaults to be set when creating a new node + this._defaultNodeLabelFn = _.constant(undefined); -var isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); + // Defaults to be set when creating a new edge + this._defaultEdgeLabelFn = _.constant(undefined); -/** - * The base implementation of methods like `_.max` and `_.min` which accepts a - * `comparator` to determine the extremum value. - * - * @private - * @param {Array} array The array to iterate over. - * @param {Function} iteratee The iteratee invoked per iteration. - * @param {Function} comparator The comparator used to compare values. - * @returns {*} Returns the extremum value. - */ -function baseExtremum(array, iteratee, comparator) { - var index = -1, - length = array.length; + // v -> label + this._nodes = {}; - while (++index < length) { - var value = array[index], - current = iteratee(value); + if (this._isCompound) { + // v -> parent + this._parent = {}; - if (current != null && (computed === undefined - ? (current === current && !isSymbol(current)) - : comparator(current, computed) - )) { - var computed = current, - result = value; - } + // v -> children + this._children = {}; + this._children[GRAPH_NODE] = {}; } - return result; -} -module.exports = baseExtremum; + // v -> edgeObj + this._in = {}; + // u -> v -> Number + this._preds = {}; -/***/ }), + // v -> edgeObj + this._out = {}; -/***/ "./node_modules/lodash/_baseFilter.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_baseFilter.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // v -> w -> Number + this._sucs = {}; -var baseEach = __webpack_require__(/*! ./_baseEach */ "./node_modules/lodash/_baseEach.js"); + // e -> edgeObj + this._edgeObjs = {}; -/** - * The base implementation of `_.filter` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {Array} Returns the new filtered array. - */ -function baseFilter(collection, predicate) { - var result = []; - baseEach(collection, function(value, index, collection) { - if (predicate(value, index, collection)) { - result.push(value); - } - }); - return result; + // e -> label + this._edgeLabels = {}; } -module.exports = baseFilter; - - -/***/ }), +/* Number of nodes in the graph. Should only be changed by the implementation. */ +Graph.prototype._nodeCount = 0; -/***/ "./node_modules/lodash/_baseFindIndex.js": -/*!***********************************************!*\ - !*** ./node_modules/lodash/_baseFindIndex.js ***! - \***********************************************/ -/***/ (function(module) { +/* Number of edges in the graph. Should only be changed by the implementation. */ +Graph.prototype._edgeCount = 0; -/** - * The base implementation of `_.findIndex` and `_.findLastIndex` without - * support for iteratee shorthands. - * - * @private - * @param {Array} array The array to inspect. - * @param {Function} predicate The function invoked per iteration. - * @param {number} fromIndex The index to search from. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {number} Returns the index of the matched value, else `-1`. - */ -function baseFindIndex(array, predicate, fromIndex, fromRight) { - var length = array.length, - index = fromIndex + (fromRight ? 1 : -1); - while ((fromRight ? index-- : ++index < length)) { - if (predicate(array[index], index, array)) { - return index; - } - } - return -1; -} +/* === Graph functions ========= */ -module.exports = baseFindIndex; +Graph.prototype.isDirected = function() { + return this._isDirected; +}; +Graph.prototype.isMultigraph = function() { + return this._isMultigraph; +}; -/***/ }), +Graph.prototype.isCompound = function() { + return this._isCompound; +}; -/***/ "./node_modules/lodash/_baseFlatten.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_baseFlatten.js ***! - \*********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +Graph.prototype.setGraph = function(label) { + this._label = label; + return this; +}; -var arrayPush = __webpack_require__(/*! ./_arrayPush */ "./node_modules/lodash/_arrayPush.js"), - isFlattenable = __webpack_require__(/*! ./_isFlattenable */ "./node_modules/lodash/_isFlattenable.js"); +Graph.prototype.graph = function() { + return this._label; +}; -/** - * The base implementation of `_.flatten` with support for restricting flattening. - * - * @private - * @param {Array} array The array to flatten. - * @param {number} depth The maximum recursion depth. - * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. - * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. - * @param {Array} [result=[]] The initial result value. - * @returns {Array} Returns the new flattened array. - */ -function baseFlatten(array, depth, predicate, isStrict, result) { - var index = -1, - length = array.length; - predicate || (predicate = isFlattenable); - result || (result = []); +/* === Node functions ========== */ - while (++index < length) { - var value = array[index]; - if (depth > 0 && predicate(value)) { - if (depth > 1) { - // Recursively flatten arrays (susceptible to call stack limits). - baseFlatten(value, depth - 1, predicate, isStrict, result); - } else { - arrayPush(result, value); - } - } else if (!isStrict) { - result[result.length] = value; - } +Graph.prototype.setDefaultNodeLabel = function(newDefault) { + if (!_.isFunction(newDefault)) { + newDefault = _.constant(newDefault); } - return result; -} + this._defaultNodeLabelFn = newDefault; + return this; +}; -module.exports = baseFlatten; +Graph.prototype.nodeCount = function() { + return this._nodeCount; +}; +Graph.prototype.nodes = function() { + return _.keys(this._nodes); +}; -/***/ }), +Graph.prototype.sources = function() { + var self = this; + return _.filter(this.nodes(), function(v) { + return _.isEmpty(self._in[v]); + }); +}; -/***/ "./node_modules/lodash/_baseFor.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/_baseFor.js ***! - \*****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +Graph.prototype.sinks = function() { + var self = this; + return _.filter(this.nodes(), function(v) { + return _.isEmpty(self._out[v]); + }); +}; -var createBaseFor = __webpack_require__(/*! ./_createBaseFor */ "./node_modules/lodash/_createBaseFor.js"); +Graph.prototype.setNodes = function(vs, value) { + var args = arguments; + var self = this; + _.each(vs, function(v) { + if (args.length > 1) { + self.setNode(v, value); + } else { + self.setNode(v); + } + }); + return this; +}; -/** - * The base implementation of `baseForOwn` which iterates over `object` - * properties returned by `keysFunc` and invokes `iteratee` for each property. - * Iteratee functions may exit iteration early by explicitly returning `false`. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {Function} keysFunc The function to get the keys of `object`. - * @returns {Object} Returns `object`. - */ -var baseFor = createBaseFor(); +Graph.prototype.setNode = function(v, value) { + if (_.has(this._nodes, v)) { + if (arguments.length > 1) { + this._nodes[v] = value; + } + return this; + } -module.exports = baseFor; + this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v); + if (this._isCompound) { + this._parent[v] = GRAPH_NODE; + this._children[v] = {}; + this._children[GRAPH_NODE][v] = true; + } + this._in[v] = {}; + this._preds[v] = {}; + this._out[v] = {}; + this._sucs[v] = {}; + ++this._nodeCount; + return this; +}; +Graph.prototype.node = function(v) { + return this._nodes[v]; +}; -/***/ }), +Graph.prototype.hasNode = function(v) { + return _.has(this._nodes, v); +}; -/***/ "./node_modules/lodash/_baseForOwn.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_baseForOwn.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +Graph.prototype.removeNode = function(v) { + var self = this; + if (_.has(this._nodes, v)) { + var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); }; + delete this._nodes[v]; + if (this._isCompound) { + this._removeFromParentsChildList(v); + delete this._parent[v]; + _.each(this.children(v), function(child) { + self.setParent(child); + }); + delete this._children[v]; + } + _.each(_.keys(this._in[v]), removeEdge); + delete this._in[v]; + delete this._preds[v]; + _.each(_.keys(this._out[v]), removeEdge); + delete this._out[v]; + delete this._sucs[v]; + --this._nodeCount; + } + return this; +}; -var baseFor = __webpack_require__(/*! ./_baseFor */ "./node_modules/lodash/_baseFor.js"), - keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); +Graph.prototype.setParent = function(v, parent) { + if (!this._isCompound) { + throw new Error("Cannot set parent in a non-compound graph"); + } -/** - * The base implementation of `_.forOwn` without support for iteratee shorthands. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Object} Returns `object`. - */ -function baseForOwn(object, iteratee) { - return object && baseFor(object, iteratee, keys); -} + if (_.isUndefined(parent)) { + parent = GRAPH_NODE; + } else { + // Coerce parent to string + parent += ""; + for (var ancestor = parent; + !_.isUndefined(ancestor); + ancestor = this.parent(ancestor)) { + if (ancestor === v) { + throw new Error("Setting " + parent+ " as parent of " + v + + " would create a cycle"); + } + } -module.exports = baseForOwn; + this.setNode(parent); + } + this.setNode(v); + this._removeFromParentsChildList(v); + this._parent[v] = parent; + this._children[parent][v] = true; + return this; +}; -/***/ }), +Graph.prototype._removeFromParentsChildList = function(v) { + delete this._children[this._parent[v]][v]; +}; -/***/ "./node_modules/lodash/_baseGet.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/_baseGet.js ***! - \*****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +Graph.prototype.parent = function(v) { + if (this._isCompound) { + var parent = this._parent[v]; + if (parent !== GRAPH_NODE) { + return parent; + } + } +}; -var castPath = __webpack_require__(/*! ./_castPath */ "./node_modules/lodash/_castPath.js"), - toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js"); +Graph.prototype.children = function(v) { + if (_.isUndefined(v)) { + v = GRAPH_NODE; + } -/** - * The base implementation of `_.get` without support for default values. - * - * @private - * @param {Object} object The object to query. - * @param {Array|string} path The path of the property to get. - * @returns {*} Returns the resolved value. - */ -function baseGet(object, path) { - path = castPath(path, object); + if (this._isCompound) { + var children = this._children[v]; + if (children) { + return _.keys(children); + } + } else if (v === GRAPH_NODE) { + return this.nodes(); + } else if (this.hasNode(v)) { + return []; + } +}; - var index = 0, - length = path.length; +Graph.prototype.predecessors = function(v) { + var predsV = this._preds[v]; + if (predsV) { + return _.keys(predsV); + } +}; - while (object != null && index < length) { - object = object[toKey(path[index++])]; +Graph.prototype.successors = function(v) { + var sucsV = this._sucs[v]; + if (sucsV) { + return _.keys(sucsV); } - return (index && index == length) ? object : undefined; -} +}; -module.exports = baseGet; +Graph.prototype.neighbors = function(v) { + var preds = this.predecessors(v); + if (preds) { + return _.union(preds, this.successors(v)); + } +}; +Graph.prototype.isLeaf = function (v) { + var neighbors; + if (this.isDirected()) { + neighbors = this.successors(v); + } else { + neighbors = this.neighbors(v); + } + return neighbors.length === 0; +}; -/***/ }), +Graph.prototype.filterNodes = function(filter) { + var copy = new this.constructor({ + directed: this._isDirected, + multigraph: this._isMultigraph, + compound: this._isCompound + }); -/***/ "./node_modules/lodash/_baseGetAllKeys.js": -/*!************************************************!*\ - !*** ./node_modules/lodash/_baseGetAllKeys.js ***! - \************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + copy.setGraph(this.graph()); -var arrayPush = __webpack_require__(/*! ./_arrayPush */ "./node_modules/lodash/_arrayPush.js"), - isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"); + var self = this; + _.each(this._nodes, function(value, v) { + if (filter(v)) { + copy.setNode(v, value); + } + }); -/** - * The base implementation of `getAllKeys` and `getAllKeysIn` which uses - * `keysFunc` and `symbolsFunc` to get the enumerable property names and - * symbols of `object`. - * - * @private - * @param {Object} object The object to query. - * @param {Function} keysFunc The function to get the keys of `object`. - * @param {Function} symbolsFunc The function to get the symbols of `object`. - * @returns {Array} Returns the array of property names and symbols. - */ -function baseGetAllKeys(object, keysFunc, symbolsFunc) { - var result = keysFunc(object); - return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); -} + _.each(this._edgeObjs, function(e) { + if (copy.hasNode(e.v) && copy.hasNode(e.w)) { + copy.setEdge(e, self.edge(e)); + } + }); -module.exports = baseGetAllKeys; + var parents = {}; + function findParent(v) { + var parent = self.parent(v); + if (parent === undefined || copy.hasNode(parent)) { + parents[v] = parent; + return parent; + } else if (parent in parents) { + return parents[parent]; + } else { + return findParent(parent); + } + } + + if (this._isCompound) { + _.each(copy.nodes(), function(v) { + copy.setParent(v, findParent(v)); + }); + } + return copy; +}; -/***/ }), +/* === Edge functions ========== */ -/***/ "./node_modules/lodash/_baseGetTag.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_baseGetTag.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +Graph.prototype.setDefaultEdgeLabel = function(newDefault) { + if (!_.isFunction(newDefault)) { + newDefault = _.constant(newDefault); + } + this._defaultEdgeLabelFn = newDefault; + return this; +}; -var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"), - getRawTag = __webpack_require__(/*! ./_getRawTag */ "./node_modules/lodash/_getRawTag.js"), - objectToString = __webpack_require__(/*! ./_objectToString */ "./node_modules/lodash/_objectToString.js"); +Graph.prototype.edgeCount = function() { + return this._edgeCount; +}; -/** `Object#toString` result references. */ -var nullTag = '[object Null]', - undefinedTag = '[object Undefined]'; +Graph.prototype.edges = function() { + return _.values(this._edgeObjs); +}; -/** Built-in value references. */ -var symToStringTag = Symbol ? Symbol.toStringTag : undefined; +Graph.prototype.setPath = function(vs, value) { + var self = this; + var args = arguments; + _.reduce(vs, function(v, w) { + if (args.length > 1) { + self.setEdge(v, w, value); + } else { + self.setEdge(v, w); + } + return w; + }); + return this; +}; -/** - * The base implementation of `getTag` without fallbacks for buggy environments. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the `toStringTag`. +/* + * setEdge(v, w, [value, [name]]) + * setEdge({ v, w, [name] }, [value]) */ -function baseGetTag(value) { - if (value == null) { - return value === undefined ? undefinedTag : nullTag; +Graph.prototype.setEdge = function() { + var v, w, name, value; + var valueSpecified = false; + var arg0 = arguments[0]; + + if (typeof arg0 === "object" && arg0 !== null && "v" in arg0) { + v = arg0.v; + w = arg0.w; + name = arg0.name; + if (arguments.length === 2) { + value = arguments[1]; + valueSpecified = true; + } + } else { + v = arg0; + w = arguments[1]; + name = arguments[3]; + if (arguments.length > 2) { + value = arguments[2]; + valueSpecified = true; + } } - return (symToStringTag && symToStringTag in Object(value)) - ? getRawTag(value) - : objectToString(value); -} -module.exports = baseGetTag; + v = "" + v; + w = "" + w; + if (!_.isUndefined(name)) { + name = "" + name; + } + var e = edgeArgsToId(this._isDirected, v, w, name); + if (_.has(this._edgeLabels, e)) { + if (valueSpecified) { + this._edgeLabels[e] = value; + } + return this; + } -/***/ }), + if (!_.isUndefined(name) && !this._isMultigraph) { + throw new Error("Cannot set a named edge when isMultigraph = false"); + } -/***/ "./node_modules/lodash/_baseGt.js": -/*!****************************************!*\ - !*** ./node_modules/lodash/_baseGt.js ***! - \****************************************/ -/***/ (function(module) { + // It didn't exist, so we need to create it. + // First ensure the nodes exist. + this.setNode(v); + this.setNode(w); -/** - * The base implementation of `_.gt` which doesn't coerce arguments. - * - * @private - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if `value` is greater than `other`, - * else `false`. - */ -function baseGt(value, other) { - return value > other; -} + this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name); -module.exports = baseGt; + var edgeObj = edgeArgsToObj(this._isDirected, v, w, name); + // Ensure we add undirected edges in a consistent way. + v = edgeObj.v; + w = edgeObj.w; + Object.freeze(edgeObj); + this._edgeObjs[e] = edgeObj; + incrementOrInitEntry(this._preds[w], v); + incrementOrInitEntry(this._sucs[v], w); + this._in[w][e] = edgeObj; + this._out[v][e] = edgeObj; + this._edgeCount++; + return this; +}; -/***/ }), +Graph.prototype.edge = function(v, w, name) { + var e = (arguments.length === 1 + ? edgeObjToId(this._isDirected, arguments[0]) + : edgeArgsToId(this._isDirected, v, w, name)); + return this._edgeLabels[e]; +}; -/***/ "./node_modules/lodash/_baseHas.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/_baseHas.js ***! - \*****************************************/ -/***/ (function(module) { +Graph.prototype.hasEdge = function(v, w, name) { + var e = (arguments.length === 1 + ? edgeObjToId(this._isDirected, arguments[0]) + : edgeArgsToId(this._isDirected, v, w, name)); + return _.has(this._edgeLabels, e); +}; -/** Used for built-in method references. */ -var objectProto = Object.prototype; +Graph.prototype.removeEdge = function(v, w, name) { + var e = (arguments.length === 1 + ? edgeObjToId(this._isDirected, arguments[0]) + : edgeArgsToId(this._isDirected, v, w, name)); + var edge = this._edgeObjs[e]; + if (edge) { + v = edge.v; + w = edge.w; + delete this._edgeLabels[e]; + delete this._edgeObjs[e]; + decrementOrRemoveEntry(this._preds[w], v); + decrementOrRemoveEntry(this._sucs[v], w); + delete this._in[w][e]; + delete this._out[v][e]; + this._edgeCount--; + } + return this; +}; -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; +Graph.prototype.inEdges = function(v, u) { + var inV = this._in[v]; + if (inV) { + var edges = _.values(inV); + if (!u) { + return edges; + } + return _.filter(edges, function(edge) { return edge.v === u; }); + } +}; -/** - * The base implementation of `_.has` without support for deep paths. - * - * @private - * @param {Object} [object] The object to query. - * @param {Array|string} key The key to check. - * @returns {boolean} Returns `true` if `key` exists, else `false`. - */ -function baseHas(object, key) { - return object != null && hasOwnProperty.call(object, key); -} +Graph.prototype.outEdges = function(v, w) { + var outV = this._out[v]; + if (outV) { + var edges = _.values(outV); + if (!w) { + return edges; + } + return _.filter(edges, function(edge) { return edge.w === w; }); + } +}; -module.exports = baseHas; +Graph.prototype.nodeEdges = function(v, w) { + var inEdges = this.inEdges(v, w); + if (inEdges) { + return inEdges.concat(this.outEdges(v, w)); + } +}; +function incrementOrInitEntry(map, k) { + if (map[k]) { + map[k]++; + } else { + map[k] = 1; + } +} -/***/ }), +function decrementOrRemoveEntry(map, k) { + if (!--map[k]) { delete map[k]; } +} -/***/ "./node_modules/lodash/_baseHasIn.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_baseHasIn.js ***! - \*******************************************/ -/***/ (function(module) { +function edgeArgsToId(isDirected, v_, w_, name) { + var v = "" + v_; + var w = "" + w_; + if (!isDirected && v > w) { + var tmp = v; + v = w; + w = tmp; + } + return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + + (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name); +} -/** - * The base implementation of `_.hasIn` without support for deep paths. - * - * @private - * @param {Object} [object] The object to query. - * @param {Array|string} key The key to check. - * @returns {boolean} Returns `true` if `key` exists, else `false`. - */ -function baseHasIn(object, key) { - return object != null && key in Object(object); +function edgeArgsToObj(isDirected, v_, w_, name) { + var v = "" + v_; + var w = "" + w_; + if (!isDirected && v > w) { + var tmp = v; + v = w; + w = tmp; + } + var edgeObj = { v: v, w: w }; + if (name) { + edgeObj.name = name; + } + return edgeObj; } -module.exports = baseHasIn; +function edgeObjToId(isDirected, edgeObj) { + return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name); +} /***/ }), -/***/ "./node_modules/lodash/_baseIndexOf.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_baseIndexOf.js ***! - \*********************************************/ +/***/ "./node_modules/graphlib/lib/index.js": +/*!********************************************!*\ + !*** ./node_modules/graphlib/lib/index.js ***! + \********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var baseFindIndex = __webpack_require__(/*! ./_baseFindIndex */ "./node_modules/lodash/_baseFindIndex.js"), - baseIsNaN = __webpack_require__(/*! ./_baseIsNaN */ "./node_modules/lodash/_baseIsNaN.js"), - strictIndexOf = __webpack_require__(/*! ./_strictIndexOf */ "./node_modules/lodash/_strictIndexOf.js"); - -/** - * The base implementation of `_.indexOf` without `fromIndex` bounds checks. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @param {number} fromIndex The index to search from. - * @returns {number} Returns the index of the matched value, else `-1`. - */ -function baseIndexOf(array, value, fromIndex) { - return value === value - ? strictIndexOf(array, value, fromIndex) - : baseFindIndex(array, baseIsNaN, fromIndex); -} - -module.exports = baseIndexOf; +// Includes only the "core" of graphlib +module.exports = { + Graph: __webpack_require__(/*! ./graph */ "./node_modules/graphlib/lib/graph.js"), + version: __webpack_require__(/*! ./version */ "./node_modules/graphlib/lib/version.js") +}; /***/ }), -/***/ "./node_modules/lodash/_baseIsArguments.js": -/*!*************************************************!*\ - !*** ./node_modules/lodash/_baseIsArguments.js ***! - \*************************************************/ +/***/ "./node_modules/graphlib/lib/json.js": +/*!*******************************************!*\ + !*** ./node_modules/graphlib/lib/json.js ***! + \*******************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), - isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); +var _ = __webpack_require__(/*! ./lodash */ "./node_modules/graphlib/lib/lodash.js"); +var Graph = __webpack_require__(/*! ./graph */ "./node_modules/graphlib/lib/graph.js"); -/** `Object#toString` result references. */ -var argsTag = '[object Arguments]'; +module.exports = { + write: write, + read: read +}; -/** - * The base implementation of `_.isArguments`. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an `arguments` object, - */ -function baseIsArguments(value) { - return isObjectLike(value) && baseGetTag(value) == argsTag; +function write(g) { + var json = { + options: { + directed: g.isDirected(), + multigraph: g.isMultigraph(), + compound: g.isCompound() + }, + nodes: writeNodes(g), + edges: writeEdges(g) + }; + if (!_.isUndefined(g.graph())) { + json.value = _.clone(g.graph()); + } + return json; } -module.exports = baseIsArguments; +function writeNodes(g) { + return _.map(g.nodes(), function(v) { + var nodeValue = g.node(v); + var parent = g.parent(v); + var node = { v: v }; + if (!_.isUndefined(nodeValue)) { + node.value = nodeValue; + } + if (!_.isUndefined(parent)) { + node.parent = parent; + } + return node; + }); +} + +function writeEdges(g) { + return _.map(g.edges(), function(e) { + var edgeValue = g.edge(e); + var edge = { v: e.v, w: e.w }; + if (!_.isUndefined(e.name)) { + edge.name = e.name; + } + if (!_.isUndefined(edgeValue)) { + edge.value = edgeValue; + } + return edge; + }); +} + +function read(json) { + var g = new Graph(json.options).setGraph(json.value); + _.each(json.nodes, function(entry) { + g.setNode(entry.v, entry.value); + if (entry.parent) { + g.setParent(entry.v, entry.parent); + } + }); + _.each(json.edges, function(entry) { + g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value); + }); + return g; +} /***/ }), -/***/ "./node_modules/lodash/_baseIsEqual.js": +/***/ "./node_modules/graphlib/lib/lodash.js": /*!*********************************************!*\ - !*** ./node_modules/lodash/_baseIsEqual.js ***! + !*** ./node_modules/graphlib/lib/lodash.js ***! \*********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var baseIsEqualDeep = __webpack_require__(/*! ./_baseIsEqualDeep */ "./node_modules/lodash/_baseIsEqualDeep.js"), - isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); +/* global window */ -/** - * The base implementation of `_.isEqual` which supports partial comparisons - * and tracks traversed objects. - * - * @private - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @param {boolean} bitmask The bitmask flags. - * 1 - Unordered comparison - * 2 - Partial comparison - * @param {Function} [customizer] The function to customize comparisons. - * @param {Object} [stack] Tracks traversed `value` and `other` objects. - * @returns {boolean} Returns `true` if the values are equivalent, else `false`. - */ -function baseIsEqual(value, other, bitmask, customizer, stack) { - if (value === other) { - return true; - } - if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) { - return value !== value && other !== other; +var lodash; + +if (true) { + try { + lodash = { + clone: __webpack_require__(/*! lodash/clone */ "./node_modules/lodash/clone.js"), + constant: __webpack_require__(/*! lodash/constant */ "./node_modules/lodash/constant.js"), + each: __webpack_require__(/*! lodash/each */ "./node_modules/lodash/each.js"), + filter: __webpack_require__(/*! lodash/filter */ "./node_modules/lodash/filter.js"), + has: __webpack_require__(/*! lodash/has */ "./node_modules/lodash/has.js"), + isArray: __webpack_require__(/*! lodash/isArray */ "./node_modules/lodash/isArray.js"), + isEmpty: __webpack_require__(/*! lodash/isEmpty */ "./node_modules/lodash/isEmpty.js"), + isFunction: __webpack_require__(/*! lodash/isFunction */ "./node_modules/lodash/isFunction.js"), + isUndefined: __webpack_require__(/*! lodash/isUndefined */ "./node_modules/lodash/isUndefined.js"), + keys: __webpack_require__(/*! lodash/keys */ "./node_modules/lodash/keys.js"), + map: __webpack_require__(/*! lodash/map */ "./node_modules/lodash/map.js"), + reduce: __webpack_require__(/*! lodash/reduce */ "./node_modules/lodash/reduce.js"), + size: __webpack_require__(/*! lodash/size */ "./node_modules/lodash/size.js"), + transform: __webpack_require__(/*! lodash/transform */ "./node_modules/lodash/transform.js"), + union: __webpack_require__(/*! lodash/union */ "./node_modules/lodash/union.js"), + values: __webpack_require__(/*! lodash/values */ "./node_modules/lodash/values.js") + }; + } catch (e) { + // continue regardless of error } - return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); } -module.exports = baseIsEqual; +if (!lodash) { + lodash = window._; +} + +module.exports = lodash; /***/ }), -/***/ "./node_modules/lodash/_baseIsEqualDeep.js": -/*!*************************************************!*\ - !*** ./node_modules/lodash/_baseIsEqualDeep.js ***! - \*************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +/***/ "./node_modules/graphlib/lib/version.js": +/*!**********************************************!*\ + !*** ./node_modules/graphlib/lib/version.js ***! + \**********************************************/ +/***/ (function(module) { -var Stack = __webpack_require__(/*! ./_Stack */ "./node_modules/lodash/_Stack.js"), - equalArrays = __webpack_require__(/*! ./_equalArrays */ "./node_modules/lodash/_equalArrays.js"), - equalByTag = __webpack_require__(/*! ./_equalByTag */ "./node_modules/lodash/_equalByTag.js"), - equalObjects = __webpack_require__(/*! ./_equalObjects */ "./node_modules/lodash/_equalObjects.js"), - getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"), - isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), - isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"), - isTypedArray = __webpack_require__(/*! ./isTypedArray */ "./node_modules/lodash/isTypedArray.js"); +module.exports = '2.1.8'; -/** Used to compose bitmasks for value comparisons. */ -var COMPARE_PARTIAL_FLAG = 1; -/** `Object#toString` result references. */ -var argsTag = '[object Arguments]', - arrayTag = '[object Array]', - objectTag = '[object Object]'; +/***/ }), -/** Used for built-in method references. */ -var objectProto = Object.prototype; +/***/ "./node_modules/heap/index.js": +/*!************************************!*\ + !*** ./node_modules/heap/index.js ***! + \************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; +module.exports = __webpack_require__(/*! ./lib/heap */ "./node_modules/heap/lib/heap.js"); -/** - * A specialized version of `baseIsEqual` for arrays and objects which performs - * deep comparisons and tracks traversed objects enabling objects with circular - * references to be compared. - * - * @private - * @param {Object} object The object to compare. - * @param {Object} other The other object to compare. - * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. - * @param {Function} customizer The function to customize comparisons. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Object} [stack] Tracks traversed `object` and `other` objects. - * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. - */ -function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { - var objIsArr = isArray(object), - othIsArr = isArray(other), - objTag = objIsArr ? arrayTag : getTag(object), - othTag = othIsArr ? arrayTag : getTag(other); - objTag = objTag == argsTag ? objectTag : objTag; - othTag = othTag == argsTag ? objectTag : othTag; +/***/ }), - var objIsObj = objTag == objectTag, - othIsObj = othTag == objectTag, - isSameTag = objTag == othTag; +/***/ "./node_modules/heap/lib/heap.js": +/*!***************************************!*\ + !*** ./node_modules/heap/lib/heap.js ***! + \***************************************/ +/***/ (function(module, exports) { - if (isSameTag && isBuffer(object)) { - if (!isBuffer(other)) { - return false; - } - objIsArr = true; - objIsObj = false; - } - if (isSameTag && !objIsObj) { - stack || (stack = new Stack); - return (objIsArr || isTypedArray(object)) - ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) - : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); - } - if (!(bitmask & COMPARE_PARTIAL_FLAG)) { - var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), - othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); +var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Generated by CoffeeScript 1.8.0 +(function() { + var Heap, defaultCmp, floor, heapify, heappop, heappush, heappushpop, heapreplace, insort, min, nlargest, nsmallest, updateItem, _siftdown, _siftup; + + floor = Math.floor, min = Math.min; - if (objIsWrapped || othIsWrapped) { - var objUnwrapped = objIsWrapped ? object.value() : object, - othUnwrapped = othIsWrapped ? other.value() : other; - stack || (stack = new Stack); - return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); + /* + Default comparison function to be used + */ + + defaultCmp = function(x, y) { + if (x < y) { + return -1; } - } - if (!isSameTag) { - return false; - } - stack || (stack = new Stack); - return equalObjects(object, other, bitmask, customizer, equalFunc, stack); -} + if (x > y) { + return 1; + } + return 0; + }; -module.exports = baseIsEqualDeep; + /* + Insert item x in list a, and keep it sorted assuming a is sorted. + + If x is already in a, insert it to the right of the rightmost x. + + Optional args lo (default 0) and hi (default a.length) bound the slice + of a to be searched. + */ -/***/ }), + insort = function(a, x, lo, hi, cmp) { + var mid; + if (lo == null) { + lo = 0; + } + if (cmp == null) { + cmp = defaultCmp; + } + if (lo < 0) { + throw new Error('lo must be non-negative'); + } + if (hi == null) { + hi = a.length; + } + while (lo < hi) { + mid = floor((lo + hi) / 2); + if (cmp(x, a[mid]) < 0) { + hi = mid; + } else { + lo = mid + 1; + } + } + return ([].splice.apply(a, [lo, lo - lo].concat(x)), x); + }; -/***/ "./node_modules/lodash/_baseIsMap.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_baseIsMap.js ***! - \*******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"), - isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); + /* + Push item onto heap, maintaining the heap invariant. + */ -/** `Object#toString` result references. */ -var mapTag = '[object Map]'; + heappush = function(array, item, cmp) { + if (cmp == null) { + cmp = defaultCmp; + } + array.push(item); + return _siftdown(array, 0, array.length - 1, cmp); + }; -/** - * The base implementation of `_.isMap` without Node.js optimizations. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a map, else `false`. - */ -function baseIsMap(value) { - return isObjectLike(value) && getTag(value) == mapTag; -} -module.exports = baseIsMap; + /* + Pop the smallest item off the heap, maintaining the heap invariant. + */ + heappop = function(array, cmp) { + var lastelt, returnitem; + if (cmp == null) { + cmp = defaultCmp; + } + lastelt = array.pop(); + if (array.length) { + returnitem = array[0]; + array[0] = lastelt; + _siftup(array, 0, cmp); + } else { + returnitem = lastelt; + } + return returnitem; + }; -/***/ }), -/***/ "./node_modules/lodash/_baseIsMatch.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_baseIsMatch.js ***! - \*********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + /* + Pop and return the current smallest value, and add the new item. + + This is more efficient than heappop() followed by heappush(), and can be + more appropriate when using a fixed size heap. Note that the value + returned may be larger than item! That constrains reasonable use of + this routine unless written as part of a conditional replacement: + if item > array[0] + item = heapreplace(array, item) + */ -var Stack = __webpack_require__(/*! ./_Stack */ "./node_modules/lodash/_Stack.js"), - baseIsEqual = __webpack_require__(/*! ./_baseIsEqual */ "./node_modules/lodash/_baseIsEqual.js"); + heapreplace = function(array, item, cmp) { + var returnitem; + if (cmp == null) { + cmp = defaultCmp; + } + returnitem = array[0]; + array[0] = item; + _siftup(array, 0, cmp); + return returnitem; + }; -/** Used to compose bitmasks for value comparisons. */ -var COMPARE_PARTIAL_FLAG = 1, - COMPARE_UNORDERED_FLAG = 2; -/** - * The base implementation of `_.isMatch` without support for iteratee shorthands. - * - * @private - * @param {Object} object The object to inspect. - * @param {Object} source The object of property values to match. - * @param {Array} matchData The property names, values, and compare flags to match. - * @param {Function} [customizer] The function to customize comparisons. - * @returns {boolean} Returns `true` if `object` is a match, else `false`. - */ -function baseIsMatch(object, source, matchData, customizer) { - var index = matchData.length, - length = index, - noCustomizer = !customizer; + /* + Fast version of a heappush followed by a heappop. + */ - if (object == null) { - return !length; - } - object = Object(object); - while (index--) { - var data = matchData[index]; - if ((noCustomizer && data[2]) - ? data[1] !== object[data[0]] - : !(data[0] in object) - ) { - return false; + heappushpop = function(array, item, cmp) { + var _ref; + if (cmp == null) { + cmp = defaultCmp; } - } - while (++index < length) { - data = matchData[index]; - var key = data[0], - objValue = object[key], - srcValue = data[1]; + if (array.length && cmp(array[0], item) < 0) { + _ref = [array[0], item], item = _ref[0], array[0] = _ref[1]; + _siftup(array, 0, cmp); + } + return item; + }; - if (noCustomizer && data[2]) { - if (objValue === undefined && !(key in object)) { - return false; - } - } else { - var stack = new Stack; - if (customizer) { - var result = customizer(objValue, srcValue, key, object, source, stack); - } - if (!(result === undefined - ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) - : result - )) { - return false; - } + + /* + Transform list into a heap, in-place, in O(array.length) time. + */ + + heapify = function(array, cmp) { + var i, _i, _j, _len, _ref, _ref1, _results, _results1; + if (cmp == null) { + cmp = defaultCmp; } - } - return true; -} + _ref1 = (function() { + _results1 = []; + for (var _j = 0, _ref = floor(array.length / 2); 0 <= _ref ? _j < _ref : _j > _ref; 0 <= _ref ? _j++ : _j--){ _results1.push(_j); } + return _results1; + }).apply(this).reverse(); + _results = []; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + i = _ref1[_i]; + _results.push(_siftup(array, i, cmp)); + } + return _results; + }; -module.exports = baseIsMatch; + /* + Update the position of the given item in the heap. + This function should be called every time the item is being modified. + */ -/***/ }), + updateItem = function(array, item, cmp) { + var pos; + if (cmp == null) { + cmp = defaultCmp; + } + pos = array.indexOf(item); + if (pos === -1) { + return; + } + _siftdown(array, 0, pos, cmp); + return _siftup(array, pos, cmp); + }; -/***/ "./node_modules/lodash/_baseIsNaN.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_baseIsNaN.js ***! - \*******************************************/ -/***/ (function(module) { -/** - * The base implementation of `_.isNaN` without support for number objects. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. - */ -function baseIsNaN(value) { - return value !== value; -} + /* + Find the n largest elements in a dataset. + */ -module.exports = baseIsNaN; + nlargest = function(array, n, cmp) { + var elem, result, _i, _len, _ref; + if (cmp == null) { + cmp = defaultCmp; + } + result = array.slice(0, n); + if (!result.length) { + return result; + } + heapify(result, cmp); + _ref = array.slice(n); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + elem = _ref[_i]; + heappushpop(result, elem, cmp); + } + return result.sort(cmp).reverse(); + }; -/***/ }), + /* + Find the n smallest elements in a dataset. + */ -/***/ "./node_modules/lodash/_baseIsNative.js": -/*!**********************************************!*\ - !*** ./node_modules/lodash/_baseIsNative.js ***! - \**********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + nsmallest = function(array, n, cmp) { + var elem, i, los, result, _i, _j, _len, _ref, _ref1, _results; + if (cmp == null) { + cmp = defaultCmp; + } + if (n * 10 <= array.length) { + result = array.slice(0, n).sort(cmp); + if (!result.length) { + return result; + } + los = result[result.length - 1]; + _ref = array.slice(n); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + elem = _ref[_i]; + if (cmp(elem, los) < 0) { + insort(result, elem, 0, null, cmp); + result.pop(); + los = result[result.length - 1]; + } + } + return result; + } + heapify(array, cmp); + _results = []; + for (i = _j = 0, _ref1 = min(n, array.length); 0 <= _ref1 ? _j < _ref1 : _j > _ref1; i = 0 <= _ref1 ? ++_j : --_j) { + _results.push(heappop(array, cmp)); + } + return _results; + }; -var isFunction = __webpack_require__(/*! ./isFunction */ "./node_modules/lodash/isFunction.js"), - isMasked = __webpack_require__(/*! ./_isMasked */ "./node_modules/lodash/_isMasked.js"), - isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), - toSource = __webpack_require__(/*! ./_toSource */ "./node_modules/lodash/_toSource.js"); + _siftdown = function(array, startpos, pos, cmp) { + var newitem, parent, parentpos; + if (cmp == null) { + cmp = defaultCmp; + } + newitem = array[pos]; + while (pos > startpos) { + parentpos = (pos - 1) >> 1; + parent = array[parentpos]; + if (cmp(newitem, parent) < 0) { + array[pos] = parent; + pos = parentpos; + continue; + } + break; + } + return array[pos] = newitem; + }; -/** - * Used to match `RegExp` - * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). - */ -var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + _siftup = function(array, pos, cmp) { + var childpos, endpos, newitem, rightpos, startpos; + if (cmp == null) { + cmp = defaultCmp; + } + endpos = array.length; + startpos = pos; + newitem = array[pos]; + childpos = 2 * pos + 1; + while (childpos < endpos) { + rightpos = childpos + 1; + if (rightpos < endpos && !(cmp(array[childpos], array[rightpos]) < 0)) { + childpos = rightpos; + } + array[pos] = array[childpos]; + pos = childpos; + childpos = 2 * pos + 1; + } + array[pos] = newitem; + return _siftdown(array, startpos, pos, cmp); + }; -/** Used to detect host constructors (Safari). */ -var reIsHostCtor = /^\[object .+?Constructor\]$/; + Heap = (function() { + Heap.push = heappush; -/** Used for built-in method references. */ -var funcProto = Function.prototype, - objectProto = Object.prototype; + Heap.pop = heappop; -/** Used to resolve the decompiled source of functions. */ -var funcToString = funcProto.toString; + Heap.replace = heapreplace; -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; + Heap.pushpop = heappushpop; -/** Used to detect if a method is native. */ -var reIsNative = RegExp('^' + - funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') - .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' -); + Heap.heapify = heapify; -/** - * The base implementation of `_.isNative` without bad shim checks. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a native function, - * else `false`. - */ -function baseIsNative(value) { - if (!isObject(value) || isMasked(value)) { - return false; - } - var pattern = isFunction(value) ? reIsNative : reIsHostCtor; - return pattern.test(toSource(value)); -} + Heap.updateItem = updateItem; -module.exports = baseIsNative; + Heap.nlargest = nlargest; + Heap.nsmallest = nsmallest; -/***/ }), + function Heap(cmp) { + this.cmp = cmp != null ? cmp : defaultCmp; + this.nodes = []; + } -/***/ "./node_modules/lodash/_baseIsSet.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_baseIsSet.js ***! - \*******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + Heap.prototype.push = function(x) { + return heappush(this.nodes, x, this.cmp); + }; -var getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"), - isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); + Heap.prototype.pop = function() { + return heappop(this.nodes, this.cmp); + }; -/** `Object#toString` result references. */ -var setTag = '[object Set]'; + Heap.prototype.peek = function() { + return this.nodes[0]; + }; -/** - * The base implementation of `_.isSet` without Node.js optimizations. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a set, else `false`. - */ -function baseIsSet(value) { - return isObjectLike(value) && getTag(value) == setTag; -} + Heap.prototype.contains = function(x) { + return this.nodes.indexOf(x) !== -1; + }; -module.exports = baseIsSet; + Heap.prototype.replace = function(x) { + return heapreplace(this.nodes, x, this.cmp); + }; + Heap.prototype.pushpop = function(x) { + return heappushpop(this.nodes, x, this.cmp); + }; -/***/ }), + Heap.prototype.heapify = function() { + return heapify(this.nodes, this.cmp); + }; -/***/ "./node_modules/lodash/_baseIsTypedArray.js": -/*!**************************************************!*\ - !*** ./node_modules/lodash/_baseIsTypedArray.js ***! - \**************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + Heap.prototype.updateItem = function(x) { + return updateItem(this.nodes, x, this.cmp); + }; -var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), - isLength = __webpack_require__(/*! ./isLength */ "./node_modules/lodash/isLength.js"), - isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); + Heap.prototype.clear = function() { + return this.nodes = []; + }; -/** `Object#toString` result references. */ -var argsTag = '[object Arguments]', - arrayTag = '[object Array]', - boolTag = '[object Boolean]', - dateTag = '[object Date]', - errorTag = '[object Error]', - funcTag = '[object Function]', - mapTag = '[object Map]', - numberTag = '[object Number]', - objectTag = '[object Object]', - regexpTag = '[object RegExp]', - setTag = '[object Set]', - stringTag = '[object String]', - weakMapTag = '[object WeakMap]'; + Heap.prototype.empty = function() { + return this.nodes.length === 0; + }; -var arrayBufferTag = '[object ArrayBuffer]', - dataViewTag = '[object DataView]', - float32Tag = '[object Float32Array]', - float64Tag = '[object Float64Array]', - int8Tag = '[object Int8Array]', - int16Tag = '[object Int16Array]', - int32Tag = '[object Int32Array]', - uint8Tag = '[object Uint8Array]', - uint8ClampedTag = '[object Uint8ClampedArray]', - uint16Tag = '[object Uint16Array]', - uint32Tag = '[object Uint32Array]'; + Heap.prototype.size = function() { + return this.nodes.length; + }; -/** Used to identify `toStringTag` values of typed arrays. */ -var typedArrayTags = {}; -typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = -typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = -typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = -typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = -typedArrayTags[uint32Tag] = true; -typedArrayTags[argsTag] = typedArrayTags[arrayTag] = -typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = -typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = -typedArrayTags[errorTag] = typedArrayTags[funcTag] = -typedArrayTags[mapTag] = typedArrayTags[numberTag] = -typedArrayTags[objectTag] = typedArrayTags[regexpTag] = -typedArrayTags[setTag] = typedArrayTags[stringTag] = -typedArrayTags[weakMapTag] = false; + Heap.prototype.clone = function() { + var heap; + heap = new Heap(); + heap.nodes = this.nodes.slice(0); + return heap; + }; -/** - * The base implementation of `_.isTypedArray` without Node.js optimizations. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. - */ -function baseIsTypedArray(value) { - return isObjectLike(value) && - isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; -} + Heap.prototype.toArray = function() { + return this.nodes.slice(0); + }; -module.exports = baseIsTypedArray; + Heap.prototype.insert = Heap.prototype.push; + Heap.prototype.top = Heap.prototype.peek; -/***/ }), + Heap.prototype.front = Heap.prototype.peek; -/***/ "./node_modules/lodash/_baseIteratee.js": -/*!**********************************************!*\ - !*** ./node_modules/lodash/_baseIteratee.js ***! - \**********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + Heap.prototype.has = Heap.prototype.contains; -var baseMatches = __webpack_require__(/*! ./_baseMatches */ "./node_modules/lodash/_baseMatches.js"), - baseMatchesProperty = __webpack_require__(/*! ./_baseMatchesProperty */ "./node_modules/lodash/_baseMatchesProperty.js"), - identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js"), - isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), - property = __webpack_require__(/*! ./property */ "./node_modules/lodash/property.js"); + Heap.prototype.copy = Heap.prototype.clone; -/** - * The base implementation of `_.iteratee`. - * - * @private - * @param {*} [value=_.identity] The value to convert to an iteratee. - * @returns {Function} Returns the iteratee. - */ -function baseIteratee(value) { - // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. - // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. - if (typeof value == 'function') { - return value; - } - if (value == null) { - return identity; - } - if (typeof value == 'object') { - return isArray(value) - ? baseMatchesProperty(value[0], value[1]) - : baseMatches(value); - } - return property(value); -} + return Heap; -module.exports = baseIteratee; + })(); + + (function(root, factory) { + if (true) { + return !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), + __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? + (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else {} + })(this, function() { + return Heap; + }); + +}).call(this); /***/ }), -/***/ "./node_modules/lodash/_baseKeys.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_baseKeys.js ***! - \******************************************/ +/***/ "./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js ***! + \**********************************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var isPrototype = __webpack_require__(/*! ./_isPrototype */ "./node_modules/lodash/_isPrototype.js"), - nativeKeys = __webpack_require__(/*! ./_nativeKeys */ "./node_modules/lodash/_nativeKeys.js"); +"use strict"; -/** Used for built-in method references. */ -var objectProto = Object.prototype; -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; +var reactIs = __webpack_require__(/*! react-is */ "./node_modules/react-is/index.js"); /** - * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. + * Copyright 2015, Yahoo! Inc. + * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. */ -function baseKeys(object) { - if (!isPrototype(object)) { - return nativeKeys(object); - } - var result = []; - for (var key in Object(object)) { - if (hasOwnProperty.call(object, key) && key != 'constructor') { - result.push(key); - } - } - return result; -} +var REACT_STATICS = { + childContextTypes: true, + contextType: true, + contextTypes: true, + defaultProps: true, + displayName: true, + getDefaultProps: true, + getDerivedStateFromError: true, + getDerivedStateFromProps: true, + mixins: true, + propTypes: true, + type: true +}; +var KNOWN_STATICS = { + name: true, + length: true, + prototype: true, + caller: true, + callee: true, + arguments: true, + arity: true +}; +var FORWARD_REF_STATICS = { + '$$typeof': true, + render: true, + defaultProps: true, + displayName: true, + propTypes: true +}; +var MEMO_STATICS = { + '$$typeof': true, + compare: true, + defaultProps: true, + displayName: true, + propTypes: true, + type: true +}; +var TYPE_STATICS = {}; +TYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS; +TYPE_STATICS[reactIs.Memo] = MEMO_STATICS; -module.exports = baseKeys; +function getStatics(component) { + // React v16.11 and below + if (reactIs.isMemo(component)) { + return MEMO_STATICS; + } // React v16.12 and above -/***/ }), + return TYPE_STATICS[component['$$typeof']] || REACT_STATICS; +} -/***/ "./node_modules/lodash/_baseKeysIn.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_baseKeysIn.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var defineProperty = Object.defineProperty; +var getOwnPropertyNames = Object.getOwnPropertyNames; +var getOwnPropertySymbols = Object.getOwnPropertySymbols; +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; +var getPrototypeOf = Object.getPrototypeOf; +var objectPrototype = Object.prototype; +function hoistNonReactStatics(targetComponent, sourceComponent, blacklist) { + if (typeof sourceComponent !== 'string') { + // don't hoist over string (html) components + if (objectPrototype) { + var inheritedComponent = getPrototypeOf(sourceComponent); -var isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), - isPrototype = __webpack_require__(/*! ./_isPrototype */ "./node_modules/lodash/_isPrototype.js"), - nativeKeysIn = __webpack_require__(/*! ./_nativeKeysIn */ "./node_modules/lodash/_nativeKeysIn.js"); + if (inheritedComponent && inheritedComponent !== objectPrototype) { + hoistNonReactStatics(targetComponent, inheritedComponent, blacklist); + } + } -/** Used for built-in method references. */ -var objectProto = Object.prototype; + var keys = getOwnPropertyNames(sourceComponent); -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; + if (getOwnPropertySymbols) { + keys = keys.concat(getOwnPropertySymbols(sourceComponent)); + } -/** - * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - */ -function baseKeysIn(object) { - if (!isObject(object)) { - return nativeKeysIn(object); - } - var isProto = isPrototype(object), - result = []; + var targetStatics = getStatics(targetComponent); + var sourceStatics = getStatics(sourceComponent); - for (var key in object) { - if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { - result.push(key); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + + if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) { + var descriptor = getOwnPropertyDescriptor(sourceComponent, key); + + try { + // Avoid failures from read-only properties + defineProperty(targetComponent, key, descriptor); + } catch (e) {} + } } } - return result; + + return targetComponent; } -module.exports = baseKeysIn; +module.exports = hoistNonReactStatics; /***/ }), -/***/ "./node_modules/lodash/_baseLt.js": -/*!****************************************!*\ - !*** ./node_modules/lodash/_baseLt.js ***! - \****************************************/ +/***/ "./node_modules/invariant/browser.js": +/*!*******************************************!*\ + !*** ./node_modules/invariant/browser.js ***! + \*******************************************/ /***/ (function(module) { +"use strict"; /** - * The base implementation of `_.lt` which doesn't coerce arguments. + * Copyright (c) 2013-present, Facebook, Inc. * - * @private - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if `value` is less than `other`, - * else `false`. + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. */ -function baseLt(value, other) { - return value < other; -} -module.exports = baseLt; - - -/***/ }), - -/***/ "./node_modules/lodash/_baseMap.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/_baseMap.js ***! - \*****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var baseEach = __webpack_require__(/*! ./_baseEach */ "./node_modules/lodash/_baseEach.js"), - isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"); /** - * The base implementation of `_.map` without support for iteratee shorthands. + * Use invariant() to assert state which your program assumes to be true. * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns the new mapped array. + * Provide sprintf-style format (only %s is supported) and arguments + * to provide information about what broke and what you were + * expecting. + * + * The invariant message will be stripped in production, but the invariant + * will remain to ensure logic does not differ in production. */ -function baseMap(collection, iteratee) { - var index = -1, - result = isArrayLike(collection) ? Array(collection.length) : []; - - baseEach(collection, function(value, key, collection) { - result[++index] = iteratee(value, key, collection); - }); - return result; -} - -module.exports = baseMap; - -/***/ }), - -/***/ "./node_modules/lodash/_baseMatches.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_baseMatches.js ***! - \*********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var invariant = function(condition, format, a, b, c, d, e, f) { + if (true) { + if (format === undefined) { + throw new Error('invariant requires an error message argument'); + } + } -var baseIsMatch = __webpack_require__(/*! ./_baseIsMatch */ "./node_modules/lodash/_baseIsMatch.js"), - getMatchData = __webpack_require__(/*! ./_getMatchData */ "./node_modules/lodash/_getMatchData.js"), - matchesStrictComparable = __webpack_require__(/*! ./_matchesStrictComparable */ "./node_modules/lodash/_matchesStrictComparable.js"); + if (!condition) { + var error; + if (format === undefined) { + error = new Error( + 'Minified exception occurred; use the non-minified dev environment ' + + 'for the full error message and additional helpful warnings.' + ); + } else { + var args = [a, b, c, d, e, f]; + var argIndex = 0; + error = new Error( + format.replace(/%s/g, function() { return args[argIndex++]; }) + ); + error.name = 'Invariant Violation'; + } -/** - * The base implementation of `_.matches` which doesn't clone `source`. - * - * @private - * @param {Object} source The object of property values to match. - * @returns {Function} Returns the new spec function. - */ -function baseMatches(source) { - var matchData = getMatchData(source); - if (matchData.length == 1 && matchData[0][2]) { - return matchesStrictComparable(matchData[0][0], matchData[0][1]); + error.framesToPop = 1; // we don't care about invariant's own frame + throw error; } - return function(object) { - return object === source || baseIsMatch(object, source, matchData); - }; -} +}; -module.exports = baseMatches; +module.exports = invariant; /***/ }), -/***/ "./node_modules/lodash/_baseMatchesProperty.js": -/*!*****************************************************!*\ - !*** ./node_modules/lodash/_baseMatchesProperty.js ***! - \*****************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var baseIsEqual = __webpack_require__(/*! ./_baseIsEqual */ "./node_modules/lodash/_baseIsEqual.js"), - get = __webpack_require__(/*! ./get */ "./node_modules/lodash/get.js"), - hasIn = __webpack_require__(/*! ./hasIn */ "./node_modules/lodash/hasIn.js"), - isKey = __webpack_require__(/*! ./_isKey */ "./node_modules/lodash/_isKey.js"), - isStrictComparable = __webpack_require__(/*! ./_isStrictComparable */ "./node_modules/lodash/_isStrictComparable.js"), - matchesStrictComparable = __webpack_require__(/*! ./_matchesStrictComparable */ "./node_modules/lodash/_matchesStrictComparable.js"), - toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js"); - -/** Used to compose bitmasks for value comparisons. */ -var COMPARE_PARTIAL_FLAG = 1, - COMPARE_UNORDERED_FLAG = 2; - -/** - * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. - * - * @private - * @param {string} path The path of the property to get. - * @param {*} srcValue The value to match. - * @returns {Function} Returns the new spec function. - */ -function baseMatchesProperty(path, srcValue) { - if (isKey(path) && isStrictComparable(srcValue)) { - return matchesStrictComparable(toKey(path), srcValue); - } - return function(object) { - var objValue = get(object, path); - return (objValue === undefined && objValue === srcValue) - ? hasIn(object, path) - : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); - }; -} +/***/ "./node_modules/is-string-blank/index.js": +/*!***********************************************!*\ + !*** ./node_modules/is-string-blank/index.js ***! + \***********************************************/ +/***/ (function(module) { -module.exports = baseMatchesProperty; +"use strict"; + + +/** + * Is this string all whitespace? + * This solution kind of makes my brain hurt, but it's significantly faster + * than !str.trim() or any other solution I could find. + * + * whitespace codes from: http://en.wikipedia.org/wiki/Whitespace_character + * and verified with: + * + * for(var i = 0; i < 65536; i++) { + * var s = String.fromCharCode(i); + * if(+s===0 && !s.trim()) console.log(i, s); + * } + * + * which counts a couple of these as *not* whitespace, but finds nothing else + * that *is* whitespace. Note that charCodeAt stops at 16 bits, but it appears + * that there are no whitespace characters above this, and code points above + * this do not map onto white space characters. + */ + +module.exports = function(str){ + var l = str.length, + a; + for(var i = 0; i < l; i++) { + a = str.charCodeAt(i); + if((a < 9 || a > 13) && (a !== 32) && (a !== 133) && (a !== 160) && + (a !== 5760) && (a !== 6158) && (a < 8192 || a > 8205) && + (a !== 8232) && (a !== 8233) && (a !== 8239) && (a !== 8287) && + (a !== 8288) && (a !== 12288) && (a !== 65279)) { + return false; + } + } + return true; +} /***/ }), -/***/ "./node_modules/lodash/_baseMerge.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_baseMerge.js ***! - \*******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var Stack = __webpack_require__(/*! ./_Stack */ "./node_modules/lodash/_Stack.js"), - assignMergeValue = __webpack_require__(/*! ./_assignMergeValue */ "./node_modules/lodash/_assignMergeValue.js"), - baseFor = __webpack_require__(/*! ./_baseFor */ "./node_modules/lodash/_baseFor.js"), - baseMergeDeep = __webpack_require__(/*! ./_baseMergeDeep */ "./node_modules/lodash/_baseMergeDeep.js"), - isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), - keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js"), - safeGet = __webpack_require__(/*! ./_safeGet */ "./node_modules/lodash/_safeGet.js"); +/***/ "./node_modules/layout-base/layout-base.js": +/*!*************************************************!*\ + !*** ./node_modules/layout-base/layout-base.js ***! + \*************************************************/ +/***/ (function(module) { -/** - * The base implementation of `_.merge` without support for multiple sources. - * - * @private - * @param {Object} object The destination object. - * @param {Object} source The source object. - * @param {number} srcIndex The index of `source`. - * @param {Function} [customizer] The function to customize merged values. - * @param {Object} [stack] Tracks traversed source values and their merged - * counterparts. - */ -function baseMerge(object, source, srcIndex, customizer, stack) { - if (object === source) { - return; - } - baseFor(source, function(srcValue, key) { - stack || (stack = new Stack); - if (isObject(srcValue)) { - baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); - } - else { - var newValue = customizer - ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack) - : undefined; +(function webpackUniversalModuleDefinition(root, factory) { + if(true) + module.exports = factory(); + else {} +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __nested_webpack_require_543__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_543__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __nested_webpack_require_543__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __nested_webpack_require_543__.c = installedModules; +/******/ +/******/ // identity function for calling harmony imports with the correct context +/******/ __nested_webpack_require_543__.i = function(value) { return value; }; +/******/ +/******/ // define getter function for harmony exports +/******/ __nested_webpack_require_543__.d = function(exports, name, getter) { +/******/ if(!__nested_webpack_require_543__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __nested_webpack_require_543__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __nested_webpack_require_543__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __nested_webpack_require_543__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __nested_webpack_require_543__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __nested_webpack_require_543__(__nested_webpack_require_543__.s = 28); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { - if (newValue === undefined) { - newValue = srcValue; - } - assignMergeValue(object, key, newValue); - } - }, keysIn); -} +"use strict"; -module.exports = baseMerge; +function LayoutConstants() {} -/***/ }), +/** + * Layout Quality: 0:draft, 1:default, 2:proof + */ +LayoutConstants.QUALITY = 1; -/***/ "./node_modules/lodash/_baseMergeDeep.js": -/*!***********************************************!*\ - !*** ./node_modules/lodash/_baseMergeDeep.js ***! - \***********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +/** + * Default parameters + */ +LayoutConstants.DEFAULT_CREATE_BENDS_AS_NEEDED = false; +LayoutConstants.DEFAULT_INCREMENTAL = false; +LayoutConstants.DEFAULT_ANIMATION_ON_LAYOUT = true; +LayoutConstants.DEFAULT_ANIMATION_DURING_LAYOUT = false; +LayoutConstants.DEFAULT_ANIMATION_PERIOD = 50; +LayoutConstants.DEFAULT_UNIFORM_LEAF_NODE_SIZES = false; -var assignMergeValue = __webpack_require__(/*! ./_assignMergeValue */ "./node_modules/lodash/_assignMergeValue.js"), - cloneBuffer = __webpack_require__(/*! ./_cloneBuffer */ "./node_modules/lodash/_cloneBuffer.js"), - cloneTypedArray = __webpack_require__(/*! ./_cloneTypedArray */ "./node_modules/lodash/_cloneTypedArray.js"), - copyArray = __webpack_require__(/*! ./_copyArray */ "./node_modules/lodash/_copyArray.js"), - initCloneObject = __webpack_require__(/*! ./_initCloneObject */ "./node_modules/lodash/_initCloneObject.js"), - isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"), - isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), - isArrayLikeObject = __webpack_require__(/*! ./isArrayLikeObject */ "./node_modules/lodash/isArrayLikeObject.js"), - isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"), - isFunction = __webpack_require__(/*! ./isFunction */ "./node_modules/lodash/isFunction.js"), - isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), - isPlainObject = __webpack_require__(/*! ./isPlainObject */ "./node_modules/lodash/isPlainObject.js"), - isTypedArray = __webpack_require__(/*! ./isTypedArray */ "./node_modules/lodash/isTypedArray.js"), - safeGet = __webpack_require__(/*! ./_safeGet */ "./node_modules/lodash/_safeGet.js"), - toPlainObject = __webpack_require__(/*! ./toPlainObject */ "./node_modules/lodash/toPlainObject.js"); +// ----------------------------------------------------------------------------- +// Section: General other constants +// ----------------------------------------------------------------------------- +/* + * Margins of a graph to be applied on bouding rectangle of its contents. We + * assume margins on all four sides to be uniform. + */ +LayoutConstants.DEFAULT_GRAPH_MARGIN = 15; -/** - * A specialized version of `baseMerge` for arrays and objects which performs - * deep merges and tracks traversed objects enabling objects with circular - * references to be merged. - * - * @private - * @param {Object} object The destination object. - * @param {Object} source The source object. - * @param {string} key The key of the value to merge. - * @param {number} srcIndex The index of `source`. - * @param {Function} mergeFunc The function to merge values. - * @param {Function} [customizer] The function to customize assigned values. - * @param {Object} [stack] Tracks traversed source values and their merged - * counterparts. +/* + * Whether to consider labels in node dimensions or not */ -function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { - var objValue = safeGet(object, key), - srcValue = safeGet(source, key), - stacked = stack.get(srcValue); +LayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS = false; - if (stacked) { - assignMergeValue(object, key, stacked); - return; - } - var newValue = customizer - ? customizer(objValue, srcValue, (key + ''), object, source, stack) - : undefined; +/* + * Default dimension of a non-compound node. + */ +LayoutConstants.SIMPLE_NODE_SIZE = 40; - var isCommon = newValue === undefined; +/* + * Default dimension of a non-compound node. + */ +LayoutConstants.SIMPLE_NODE_HALF_SIZE = LayoutConstants.SIMPLE_NODE_SIZE / 2; - if (isCommon) { - var isArr = isArray(srcValue), - isBuff = !isArr && isBuffer(srcValue), - isTyped = !isArr && !isBuff && isTypedArray(srcValue); +/* + * Empty compound node size. When a compound node is empty, its both + * dimensions should be of this value. + */ +LayoutConstants.EMPTY_COMPOUND_NODE_SIZE = 40; - newValue = srcValue; - if (isArr || isBuff || isTyped) { - if (isArray(objValue)) { - newValue = objValue; - } - else if (isArrayLikeObject(objValue)) { - newValue = copyArray(objValue); - } - else if (isBuff) { - isCommon = false; - newValue = cloneBuffer(srcValue, true); - } - else if (isTyped) { - isCommon = false; - newValue = cloneTypedArray(srcValue, true); - } - else { - newValue = []; - } - } - else if (isPlainObject(srcValue) || isArguments(srcValue)) { - newValue = objValue; - if (isArguments(objValue)) { - newValue = toPlainObject(objValue); - } - else if (!isObject(objValue) || isFunction(objValue)) { - newValue = initCloneObject(srcValue); - } - } - else { - isCommon = false; - } - } - if (isCommon) { - // Recursively merge objects and arrays (susceptible to call stack limits). - stack.set(srcValue, newValue); - mergeFunc(newValue, srcValue, srcIndex, customizer, stack); - stack['delete'](srcValue); - } - assignMergeValue(object, key, newValue); -} +/* + * Minimum length that an edge should take during layout + */ +LayoutConstants.MIN_EDGE_LENGTH = 1; -module.exports = baseMergeDeep; +/* + * World boundaries that layout operates on + */ +LayoutConstants.WORLD_BOUNDARY = 1000000; +/* + * World boundaries that random positioning can be performed with + */ +LayoutConstants.INITIAL_WORLD_BOUNDARY = LayoutConstants.WORLD_BOUNDARY / 1000; -/***/ }), +/* + * Coordinates of the world center + */ +LayoutConstants.WORLD_CENTER_X = 1200; +LayoutConstants.WORLD_CENTER_Y = 900; -/***/ "./node_modules/lodash/_baseOrderBy.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_baseOrderBy.js ***! - \*********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +module.exports = LayoutConstants; -var arrayMap = __webpack_require__(/*! ./_arrayMap */ "./node_modules/lodash/_arrayMap.js"), - baseGet = __webpack_require__(/*! ./_baseGet */ "./node_modules/lodash/_baseGet.js"), - baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), - baseMap = __webpack_require__(/*! ./_baseMap */ "./node_modules/lodash/_baseMap.js"), - baseSortBy = __webpack_require__(/*! ./_baseSortBy */ "./node_modules/lodash/_baseSortBy.js"), - baseUnary = __webpack_require__(/*! ./_baseUnary */ "./node_modules/lodash/_baseUnary.js"), - compareMultiple = __webpack_require__(/*! ./_compareMultiple */ "./node_modules/lodash/_compareMultiple.js"), - identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js"), - isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"); +/***/ }), +/* 1 */ +/***/ (function(module, exports, __nested_webpack_require_4947__) { -/** - * The base implementation of `_.orderBy` without param guards. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. - * @param {string[]} orders The sort orders of `iteratees`. - * @returns {Array} Returns the new sorted array. - */ -function baseOrderBy(collection, iteratees, orders) { - if (iteratees.length) { - iteratees = arrayMap(iteratees, function(iteratee) { - if (isArray(iteratee)) { - return function(value) { - return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee); - } - } - return iteratee; - }); - } else { - iteratees = [identity]; - } +"use strict"; - var index = -1; - iteratees = arrayMap(iteratees, baseUnary(baseIteratee)); - var result = baseMap(collection, function(value, key, collection) { - var criteria = arrayMap(iteratees, function(iteratee) { - return iteratee(value); - }); - return { 'criteria': criteria, 'index': ++index, 'value': value }; - }); +var LGraphObject = __nested_webpack_require_4947__(2); +var IGeometry = __nested_webpack_require_4947__(8); +var IMath = __nested_webpack_require_4947__(9); - return baseSortBy(result, function(object, other) { - return compareMultiple(object, other, orders); - }); +function LEdge(source, target, vEdge) { + LGraphObject.call(this, vEdge); + + this.isOverlapingSourceAndTarget = false; + this.vGraphObject = vEdge; + this.bendpoints = []; + this.source = source; + this.target = target; } -module.exports = baseOrderBy; +LEdge.prototype = Object.create(LGraphObject.prototype); +for (var prop in LGraphObject) { + LEdge[prop] = LGraphObject[prop]; +} -/***/ }), +LEdge.prototype.getSource = function () { + return this.source; +}; -/***/ "./node_modules/lodash/_basePick.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_basePick.js ***! - \******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +LEdge.prototype.getTarget = function () { + return this.target; +}; -var basePickBy = __webpack_require__(/*! ./_basePickBy */ "./node_modules/lodash/_basePickBy.js"), - hasIn = __webpack_require__(/*! ./hasIn */ "./node_modules/lodash/hasIn.js"); +LEdge.prototype.isInterGraph = function () { + return this.isInterGraph; +}; -/** - * The base implementation of `_.pick` without support for individual - * property identifiers. - * - * @private - * @param {Object} object The source object. - * @param {string[]} paths The property paths to pick. - * @returns {Object} Returns the new object. - */ -function basePick(object, paths) { - return basePickBy(object, paths, function(value, path) { - return hasIn(object, path); - }); -} +LEdge.prototype.getLength = function () { + return this.length; +}; -module.exports = basePick; +LEdge.prototype.isOverlapingSourceAndTarget = function () { + return this.isOverlapingSourceAndTarget; +}; +LEdge.prototype.getBendpoints = function () { + return this.bendpoints; +}; -/***/ }), +LEdge.prototype.getLca = function () { + return this.lca; +}; -/***/ "./node_modules/lodash/_basePickBy.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_basePickBy.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +LEdge.prototype.getSourceInLca = function () { + return this.sourceInLca; +}; -var baseGet = __webpack_require__(/*! ./_baseGet */ "./node_modules/lodash/_baseGet.js"), - baseSet = __webpack_require__(/*! ./_baseSet */ "./node_modules/lodash/_baseSet.js"), - castPath = __webpack_require__(/*! ./_castPath */ "./node_modules/lodash/_castPath.js"); +LEdge.prototype.getTargetInLca = function () { + return this.targetInLca; +}; -/** - * The base implementation of `_.pickBy` without support for iteratee shorthands. - * - * @private - * @param {Object} object The source object. - * @param {string[]} paths The property paths to pick. - * @param {Function} predicate The function invoked per property. - * @returns {Object} Returns the new object. - */ -function basePickBy(object, paths, predicate) { - var index = -1, - length = paths.length, - result = {}; +LEdge.prototype.getOtherEnd = function (node) { + if (this.source === node) { + return this.target; + } else if (this.target === node) { + return this.source; + } else { + throw "Node is not incident with this edge"; + } +}; - while (++index < length) { - var path = paths[index], - value = baseGet(object, path); +LEdge.prototype.getOtherEndInGraph = function (node, graph) { + var otherEnd = this.getOtherEnd(node); + var root = graph.getGraphManager().getRoot(); - if (predicate(value, path)) { - baseSet(result, castPath(path, object), value); + while (true) { + if (otherEnd.getOwner() == graph) { + return otherEnd; } - } - return result; -} -module.exports = basePickBy; + if (otherEnd.getOwner() == root) { + break; + } + otherEnd = otherEnd.getOwner().getParent(); + } -/***/ }), + return null; +}; -/***/ "./node_modules/lodash/_baseProperty.js": -/*!**********************************************!*\ - !*** ./node_modules/lodash/_baseProperty.js ***! - \**********************************************/ -/***/ (function(module) { +LEdge.prototype.updateLength = function () { + var clipPointCoordinates = new Array(4); -/** - * The base implementation of `_.property` without support for deep paths. - * - * @private - * @param {string} key The key of the property to get. - * @returns {Function} Returns the new accessor function. - */ -function baseProperty(key) { - return function(object) { - return object == null ? undefined : object[key]; - }; -} + this.isOverlapingSourceAndTarget = IGeometry.getIntersection(this.target.getRect(), this.source.getRect(), clipPointCoordinates); -module.exports = baseProperty; + if (!this.isOverlapingSourceAndTarget) { + this.lengthX = clipPointCoordinates[0] - clipPointCoordinates[2]; + this.lengthY = clipPointCoordinates[1] - clipPointCoordinates[3]; + if (Math.abs(this.lengthX) < 1.0) { + this.lengthX = IMath.sign(this.lengthX); + } -/***/ }), + if (Math.abs(this.lengthY) < 1.0) { + this.lengthY = IMath.sign(this.lengthY); + } -/***/ "./node_modules/lodash/_basePropertyDeep.js": -/*!**************************************************!*\ - !*** ./node_modules/lodash/_basePropertyDeep.js ***! - \**************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + this.length = Math.sqrt(this.lengthX * this.lengthX + this.lengthY * this.lengthY); + } +}; -var baseGet = __webpack_require__(/*! ./_baseGet */ "./node_modules/lodash/_baseGet.js"); +LEdge.prototype.updateLengthSimple = function () { + this.lengthX = this.target.getCenterX() - this.source.getCenterX(); + this.lengthY = this.target.getCenterY() - this.source.getCenterY(); -/** - * A specialized version of `baseProperty` which supports deep paths. - * - * @private - * @param {Array|string} path The path of the property to get. - * @returns {Function} Returns the new accessor function. - */ -function basePropertyDeep(path) { - return function(object) { - return baseGet(object, path); - }; -} + if (Math.abs(this.lengthX) < 1.0) { + this.lengthX = IMath.sign(this.lengthX); + } -module.exports = basePropertyDeep; + if (Math.abs(this.lengthY) < 1.0) { + this.lengthY = IMath.sign(this.lengthY); + } + this.length = Math.sqrt(this.lengthX * this.lengthX + this.lengthY * this.lengthY); +}; -/***/ }), +module.exports = LEdge; -/***/ "./node_modules/lodash/_baseRange.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_baseRange.js ***! - \*******************************************/ -/***/ (function(module) { +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeCeil = Math.ceil, - nativeMax = Math.max; +"use strict"; -/** - * The base implementation of `_.range` and `_.rangeRight` which doesn't - * coerce arguments. - * - * @private - * @param {number} start The start of the range. - * @param {number} end The end of the range. - * @param {number} step The value to increment or decrement by. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Array} Returns the range of numbers. - */ -function baseRange(start, end, step, fromRight) { - var index = -1, - length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), - result = Array(length); - while (length--) { - result[fromRight ? length : ++index] = start; - start += step; - } - return result; +function LGraphObject(vGraphObject) { + this.vGraphObject = vGraphObject; } -module.exports = baseRange; - +module.exports = LGraphObject; /***/ }), +/* 3 */ +/***/ (function(module, exports, __nested_webpack_require_8167__) { -/***/ "./node_modules/lodash/_baseReduce.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_baseReduce.js ***! - \********************************************/ -/***/ (function(module) { - -/** - * The base implementation of `_.reduce` and `_.reduceRight`, without support - * for iteratee shorthands, which iterates over `collection` using `eachFunc`. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {*} accumulator The initial value. - * @param {boolean} initAccum Specify using the first or last element of - * `collection` as the initial value. - * @param {Function} eachFunc The function to iterate over `collection`. - * @returns {*} Returns the accumulated value. - */ -function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { - eachFunc(collection, function(value, index, collection) { - accumulator = initAccum - ? (initAccum = false, value) - : iteratee(accumulator, value, index, collection); - }); - return accumulator; -} +"use strict"; -module.exports = baseReduce; +var LGraphObject = __nested_webpack_require_8167__(2); +var Integer = __nested_webpack_require_8167__(10); +var RectangleD = __nested_webpack_require_8167__(13); +var LayoutConstants = __nested_webpack_require_8167__(0); +var RandomSeed = __nested_webpack_require_8167__(16); +var PointD = __nested_webpack_require_8167__(5); -/***/ }), +function LNode(gm, loc, size, vNode) { + //Alternative constructor 1 : LNode(LGraphManager gm, Point loc, Dimension size, Object vNode) + if (size == null && vNode == null) { + vNode = loc; + } -/***/ "./node_modules/lodash/_baseRest.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_baseRest.js ***! - \******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + LGraphObject.call(this, vNode); -var identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js"), - overRest = __webpack_require__(/*! ./_overRest */ "./node_modules/lodash/_overRest.js"), - setToString = __webpack_require__(/*! ./_setToString */ "./node_modules/lodash/_setToString.js"); + //Alternative constructor 2 : LNode(Layout layout, Object vNode) + if (gm.graphManager != null) gm = gm.graphManager; -/** - * The base implementation of `_.rest` which doesn't validate or coerce arguments. - * - * @private - * @param {Function} func The function to apply a rest parameter to. - * @param {number} [start=func.length-1] The start position of the rest parameter. - * @returns {Function} Returns the new function. - */ -function baseRest(func, start) { - return setToString(overRest(func, start, identity), func + ''); + this.estimatedSize = Integer.MIN_VALUE; + this.inclusionTreeDepth = Integer.MAX_VALUE; + this.vGraphObject = vNode; + this.edges = []; + this.graphManager = gm; + + if (size != null && loc != null) this.rect = new RectangleD(loc.x, loc.y, size.width, size.height);else this.rect = new RectangleD(); } -module.exports = baseRest; +LNode.prototype = Object.create(LGraphObject.prototype); +for (var prop in LGraphObject) { + LNode[prop] = LGraphObject[prop]; +} +LNode.prototype.getEdges = function () { + return this.edges; +}; -/***/ }), +LNode.prototype.getChild = function () { + return this.child; +}; -/***/ "./node_modules/lodash/_baseSet.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/_baseSet.js ***! - \*****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +LNode.prototype.getOwner = function () { + // if (this.owner != null) { + // if (!(this.owner == null || this.owner.getNodes().indexOf(this) > -1)) { + // throw "assert failed"; + // } + // } -var assignValue = __webpack_require__(/*! ./_assignValue */ "./node_modules/lodash/_assignValue.js"), - castPath = __webpack_require__(/*! ./_castPath */ "./node_modules/lodash/_castPath.js"), - isIndex = __webpack_require__(/*! ./_isIndex */ "./node_modules/lodash/_isIndex.js"), - isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), - toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js"); + return this.owner; +}; -/** - * The base implementation of `_.set`. - * - * @private - * @param {Object} object The object to modify. - * @param {Array|string} path The path of the property to set. - * @param {*} value The value to set. - * @param {Function} [customizer] The function to customize path creation. - * @returns {Object} Returns `object`. - */ -function baseSet(object, path, value, customizer) { - if (!isObject(object)) { - return object; - } - path = castPath(path, object); +LNode.prototype.getWidth = function () { + return this.rect.width; +}; - var index = -1, - length = path.length, - lastIndex = length - 1, - nested = object; +LNode.prototype.setWidth = function (width) { + this.rect.width = width; +}; - while (nested != null && ++index < length) { - var key = toKey(path[index]), - newValue = value; +LNode.prototype.getHeight = function () { + return this.rect.height; +}; - if (key === '__proto__' || key === 'constructor' || key === 'prototype') { - return object; - } +LNode.prototype.setHeight = function (height) { + this.rect.height = height; +}; - if (index != lastIndex) { - var objValue = nested[key]; - newValue = customizer ? customizer(objValue, key, nested) : undefined; - if (newValue === undefined) { - newValue = isObject(objValue) - ? objValue - : (isIndex(path[index + 1]) ? [] : {}); - } - } - assignValue(nested, key, newValue); - nested = nested[key]; - } - return object; -} +LNode.prototype.getCenterX = function () { + return this.rect.x + this.rect.width / 2; +}; -module.exports = baseSet; +LNode.prototype.getCenterY = function () { + return this.rect.y + this.rect.height / 2; +}; +LNode.prototype.getCenter = function () { + return new PointD(this.rect.x + this.rect.width / 2, this.rect.y + this.rect.height / 2); +}; -/***/ }), +LNode.prototype.getLocation = function () { + return new PointD(this.rect.x, this.rect.y); +}; -/***/ "./node_modules/lodash/_baseSetToString.js": -/*!*************************************************!*\ - !*** ./node_modules/lodash/_baseSetToString.js ***! - \*************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +LNode.prototype.getRect = function () { + return this.rect; +}; -var constant = __webpack_require__(/*! ./constant */ "./node_modules/lodash/constant.js"), - defineProperty = __webpack_require__(/*! ./_defineProperty */ "./node_modules/lodash/_defineProperty.js"), - identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js"); +LNode.prototype.getDiagonal = function () { + return Math.sqrt(this.rect.width * this.rect.width + this.rect.height * this.rect.height); +}; /** - * The base implementation of `setToString` without support for hot loop shorting. - * - * @private - * @param {Function} func The function to modify. - * @param {Function} string The `toString` result. - * @returns {Function} Returns `func`. + * This method returns half the diagonal length of this node. */ -var baseSetToString = !defineProperty ? identity : function(func, string) { - return defineProperty(func, 'toString', { - 'configurable': true, - 'enumerable': false, - 'value': constant(string), - 'writable': true - }); +LNode.prototype.getHalfTheDiagonal = function () { + return Math.sqrt(this.rect.height * this.rect.height + this.rect.width * this.rect.width) / 2; }; -module.exports = baseSetToString; +LNode.prototype.setRect = function (upperLeft, dimension) { + this.rect.x = upperLeft.x; + this.rect.y = upperLeft.y; + this.rect.width = dimension.width; + this.rect.height = dimension.height; +}; +LNode.prototype.setCenter = function (cx, cy) { + this.rect.x = cx - this.rect.width / 2; + this.rect.y = cy - this.rect.height / 2; +}; -/***/ }), +LNode.prototype.setLocation = function (x, y) { + this.rect.x = x; + this.rect.y = y; +}; -/***/ "./node_modules/lodash/_baseSortBy.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_baseSortBy.js ***! - \********************************************/ -/***/ (function(module) { +LNode.prototype.moveBy = function (dx, dy) { + this.rect.x += dx; + this.rect.y += dy; +}; -/** - * The base implementation of `_.sortBy` which uses `comparer` to define the - * sort order of `array` and replaces criteria objects with their corresponding - * values. - * - * @private - * @param {Array} array The array to sort. - * @param {Function} comparer The function to define sort order. - * @returns {Array} Returns `array`. - */ -function baseSortBy(array, comparer) { - var length = array.length; +LNode.prototype.getEdgeListToNode = function (to) { + var edgeList = []; + var edge; + var self = this; - array.sort(comparer); - while (length--) { - array[length] = array[length].value; - } - return array; -} + self.edges.forEach(function (edge) { -module.exports = baseSortBy; + if (edge.target == to) { + if (edge.source != self) throw "Incorrect edge source!"; + edgeList.push(edge); + } + }); -/***/ }), + return edgeList; +}; -/***/ "./node_modules/lodash/_baseTimes.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_baseTimes.js ***! - \*******************************************/ -/***/ (function(module) { +LNode.prototype.getEdgesBetween = function (other) { + var edgeList = []; + var edge; -/** - * The base implementation of `_.times` without support for iteratee shorthands - * or max array length checks. - * - * @private - * @param {number} n The number of times to invoke `iteratee`. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns the array of results. - */ -function baseTimes(n, iteratee) { - var index = -1, - result = Array(n); + var self = this; + self.edges.forEach(function (edge) { - while (++index < n) { - result[index] = iteratee(index); - } - return result; -} + if (!(edge.source == self || edge.target == self)) throw "Incorrect edge source and/or target"; -module.exports = baseTimes; + if (edge.target == other || edge.source == other) { + edgeList.push(edge); + } + }); + return edgeList; +}; -/***/ }), +LNode.prototype.getNeighborsList = function () { + var neighbors = new Set(); -/***/ "./node_modules/lodash/_baseToString.js": -/*!**********************************************!*\ - !*** ./node_modules/lodash/_baseToString.js ***! - \**********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + var self = this; + self.edges.forEach(function (edge) { -var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"), - arrayMap = __webpack_require__(/*! ./_arrayMap */ "./node_modules/lodash/_arrayMap.js"), - isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), - isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); + if (edge.source == self) { + neighbors.add(edge.target); + } else { + if (edge.target != self) { + throw "Incorrect incidency!"; + } -/** Used as references for various `Number` constants. */ -var INFINITY = 1 / 0; + neighbors.add(edge.source); + } + }); -/** Used to convert symbols to primitives and strings. */ -var symbolProto = Symbol ? Symbol.prototype : undefined, - symbolToString = symbolProto ? symbolProto.toString : undefined; + return neighbors; +}; -/** - * The base implementation of `_.toString` which doesn't convert nullish - * values to empty strings. - * - * @private - * @param {*} value The value to process. - * @returns {string} Returns the string. - */ -function baseToString(value) { - // Exit early for strings to avoid a performance hit in some environments. - if (typeof value == 'string') { - return value; - } - if (isArray(value)) { - // Recursively convert values (susceptible to call stack limits). - return arrayMap(value, baseToString) + ''; - } - if (isSymbol(value)) { - return symbolToString ? symbolToString.call(value) : ''; +LNode.prototype.withChildren = function () { + var withNeighborsList = new Set(); + var childNode; + var children; + + withNeighborsList.add(this); + + if (this.child != null) { + var nodes = this.child.getNodes(); + for (var i = 0; i < nodes.length; i++) { + childNode = nodes[i]; + children = childNode.withChildren(); + children.forEach(function (node) { + withNeighborsList.add(node); + }); + } } - var result = (value + ''); - return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; -} -module.exports = baseToString; + return withNeighborsList; +}; +LNode.prototype.getNoOfChildren = function () { + var noOfChildren = 0; + var childNode; -/***/ }), + if (this.child == null) { + noOfChildren = 1; + } else { + var nodes = this.child.getNodes(); + for (var i = 0; i < nodes.length; i++) { + childNode = nodes[i]; -/***/ "./node_modules/lodash/_baseTrim.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_baseTrim.js ***! - \******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + noOfChildren += childNode.getNoOfChildren(); + } + } -var trimmedEndIndex = __webpack_require__(/*! ./_trimmedEndIndex */ "./node_modules/lodash/_trimmedEndIndex.js"); + if (noOfChildren == 0) { + noOfChildren = 1; + } + return noOfChildren; +}; -/** Used to match leading whitespace. */ -var reTrimStart = /^\s+/; +LNode.prototype.getEstimatedSize = function () { + if (this.estimatedSize == Integer.MIN_VALUE) { + throw "assert failed"; + } + return this.estimatedSize; +}; -/** - * The base implementation of `_.trim`. - * - * @private - * @param {string} string The string to trim. - * @returns {string} Returns the trimmed string. - */ -function baseTrim(string) { - return string - ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '') - : string; -} +LNode.prototype.calcEstimatedSize = function () { + if (this.child == null) { + return this.estimatedSize = (this.rect.width + this.rect.height) / 2; + } else { + this.estimatedSize = this.child.calcEstimatedSize(); + this.rect.width = this.estimatedSize; + this.rect.height = this.estimatedSize; -module.exports = baseTrim; + return this.estimatedSize; + } +}; +LNode.prototype.scatter = function () { + var randomCenterX; + var randomCenterY; -/***/ }), + var minX = -LayoutConstants.INITIAL_WORLD_BOUNDARY; + var maxX = LayoutConstants.INITIAL_WORLD_BOUNDARY; + randomCenterX = LayoutConstants.WORLD_CENTER_X + RandomSeed.nextDouble() * (maxX - minX) + minX; -/***/ "./node_modules/lodash/_baseUnary.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_baseUnary.js ***! - \*******************************************/ -/***/ (function(module) { + var minY = -LayoutConstants.INITIAL_WORLD_BOUNDARY; + var maxY = LayoutConstants.INITIAL_WORLD_BOUNDARY; + randomCenterY = LayoutConstants.WORLD_CENTER_Y + RandomSeed.nextDouble() * (maxY - minY) + minY; -/** - * The base implementation of `_.unary` without support for storing metadata. - * - * @private - * @param {Function} func The function to cap arguments for. - * @returns {Function} Returns the new capped function. - */ -function baseUnary(func) { - return function(value) { - return func(value); - }; -} + this.rect.x = randomCenterX; + this.rect.y = randomCenterY; +}; -module.exports = baseUnary; +LNode.prototype.updateBounds = function () { + if (this.getChild() == null) { + throw "assert failed"; + } + if (this.getChild().getNodes().length != 0) { + // wrap the children nodes by re-arranging the boundaries + var childGraph = this.getChild(); + childGraph.updateBounds(true); + this.rect.x = childGraph.getLeft(); + this.rect.y = childGraph.getTop(); -/***/ }), + this.setWidth(childGraph.getRight() - childGraph.getLeft()); + this.setHeight(childGraph.getBottom() - childGraph.getTop()); -/***/ "./node_modules/lodash/_baseUniq.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_baseUniq.js ***! - \******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // Update compound bounds considering its label properties + if (LayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS) { -var SetCache = __webpack_require__(/*! ./_SetCache */ "./node_modules/lodash/_SetCache.js"), - arrayIncludes = __webpack_require__(/*! ./_arrayIncludes */ "./node_modules/lodash/_arrayIncludes.js"), - arrayIncludesWith = __webpack_require__(/*! ./_arrayIncludesWith */ "./node_modules/lodash/_arrayIncludesWith.js"), - cacheHas = __webpack_require__(/*! ./_cacheHas */ "./node_modules/lodash/_cacheHas.js"), - createSet = __webpack_require__(/*! ./_createSet */ "./node_modules/lodash/_createSet.js"), - setToArray = __webpack_require__(/*! ./_setToArray */ "./node_modules/lodash/_setToArray.js"); + var width = childGraph.getRight() - childGraph.getLeft(); + var height = childGraph.getBottom() - childGraph.getTop(); -/** Used as the size to enable large array optimizations. */ -var LARGE_ARRAY_SIZE = 200; + if (this.labelWidth) { + if (this.labelPosHorizontal == "left") { + this.rect.x -= this.labelWidth; + this.setWidth(width + this.labelWidth); + } else if (this.labelPosHorizontal == "center" && this.labelWidth > width) { + this.rect.x -= (this.labelWidth - width) / 2; + this.setWidth(this.labelWidth); + } else if (this.labelPosHorizontal == "right") { + this.setWidth(width + this.labelWidth); + } + } -/** - * The base implementation of `_.uniqBy` without support for iteratee shorthands. - * - * @private - * @param {Array} array The array to inspect. - * @param {Function} [iteratee] The iteratee invoked per element. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new duplicate free array. - */ -function baseUniq(array, iteratee, comparator) { - var index = -1, - includes = arrayIncludes, - length = array.length, - isCommon = true, - result = [], - seen = result; + if (this.labelHeight) { + if (this.labelPosVertical == "top") { + this.rect.y -= this.labelHeight; + this.setHeight(height + this.labelHeight); + } else if (this.labelPosVertical == "center" && this.labelHeight > height) { + this.rect.y -= (this.labelHeight - height) / 2; + this.setHeight(this.labelHeight); + } else if (this.labelPosVertical == "bottom") { + this.setHeight(height + this.labelHeight); + } + } + } + } +}; - if (comparator) { - isCommon = false; - includes = arrayIncludesWith; +LNode.prototype.getInclusionTreeDepth = function () { + if (this.inclusionTreeDepth == Integer.MAX_VALUE) { + throw "assert failed"; } - else if (length >= LARGE_ARRAY_SIZE) { - var set = iteratee ? null : createSet(array); - if (set) { - return setToArray(set); - } - isCommon = false; - includes = cacheHas; - seen = new SetCache; + return this.inclusionTreeDepth; +}; + +LNode.prototype.transform = function (trans) { + var left = this.rect.x; + + if (left > LayoutConstants.WORLD_BOUNDARY) { + left = LayoutConstants.WORLD_BOUNDARY; + } else if (left < -LayoutConstants.WORLD_BOUNDARY) { + left = -LayoutConstants.WORLD_BOUNDARY; } - else { - seen = iteratee ? [] : result; + + var top = this.rect.y; + + if (top > LayoutConstants.WORLD_BOUNDARY) { + top = LayoutConstants.WORLD_BOUNDARY; + } else if (top < -LayoutConstants.WORLD_BOUNDARY) { + top = -LayoutConstants.WORLD_BOUNDARY; } - outer: - while (++index < length) { - var value = array[index], - computed = iteratee ? iteratee(value) : value; - value = (comparator || value !== 0) ? value : 0; - if (isCommon && computed === computed) { - var seenIndex = seen.length; - while (seenIndex--) { - if (seen[seenIndex] === computed) { - continue outer; - } - } - if (iteratee) { - seen.push(computed); - } - result.push(value); - } - else if (!includes(seen, computed, comparator)) { - if (seen !== result) { - seen.push(computed); - } - result.push(value); - } + var leftTop = new PointD(left, top); + var vLeftTop = trans.inverseTransformPoint(leftTop); + + this.setLocation(vLeftTop.x, vLeftTop.y); +}; + +LNode.prototype.getLeft = function () { + return this.rect.x; +}; + +LNode.prototype.getRight = function () { + return this.rect.x + this.rect.width; +}; + +LNode.prototype.getTop = function () { + return this.rect.y; +}; + +LNode.prototype.getBottom = function () { + return this.rect.y + this.rect.height; +}; + +LNode.prototype.getParent = function () { + if (this.owner == null) { + return null; } - return result; -} -module.exports = baseUniq; + return this.owner.getParent(); +}; +module.exports = LNode; /***/ }), +/* 4 */ +/***/ (function(module, exports, __nested_webpack_require_17290__) { -/***/ "./node_modules/lodash/_baseValues.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_baseValues.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; -var arrayMap = __webpack_require__(/*! ./_arrayMap */ "./node_modules/lodash/_arrayMap.js"); -/** - * The base implementation of `_.values` and `_.valuesIn` which creates an - * array of `object` property values corresponding to the property names - * of `props`. - * - * @private - * @param {Object} object The object to query. - * @param {Array} props The property names to get values for. - * @returns {Object} Returns the array of property values. - */ -function baseValues(object, props) { - return arrayMap(props, function(key) { - return object[key]; - }); +var LayoutConstants = __nested_webpack_require_17290__(0); + +function FDLayoutConstants() {} + +//FDLayoutConstants inherits static props in LayoutConstants +for (var prop in LayoutConstants) { + FDLayoutConstants[prop] = LayoutConstants[prop]; } -module.exports = baseValues; +FDLayoutConstants.MAX_ITERATIONS = 2500; + +FDLayoutConstants.DEFAULT_EDGE_LENGTH = 50; +FDLayoutConstants.DEFAULT_SPRING_STRENGTH = 0.45; +FDLayoutConstants.DEFAULT_REPULSION_STRENGTH = 4500.0; +FDLayoutConstants.DEFAULT_GRAVITY_STRENGTH = 0.4; +FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH = 1.0; +FDLayoutConstants.DEFAULT_GRAVITY_RANGE_FACTOR = 3.8; +FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR = 1.5; +FDLayoutConstants.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION = true; +FDLayoutConstants.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION = true; +FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL = 0.3; +FDLayoutConstants.COOLING_ADAPTATION_FACTOR = 0.33; +FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT = 1000; +FDLayoutConstants.ADAPTATION_UPPER_NODE_LIMIT = 5000; +FDLayoutConstants.MAX_NODE_DISPLACEMENT_INCREMENTAL = 100.0; +FDLayoutConstants.MAX_NODE_DISPLACEMENT = FDLayoutConstants.MAX_NODE_DISPLACEMENT_INCREMENTAL * 3; +FDLayoutConstants.MIN_REPULSION_DIST = FDLayoutConstants.DEFAULT_EDGE_LENGTH / 10.0; +FDLayoutConstants.CONVERGENCE_CHECK_PERIOD = 100; +FDLayoutConstants.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR = 0.1; +FDLayoutConstants.MIN_EDGE_LENGTH = 1; +FDLayoutConstants.GRID_CALCULATION_CHECK_PERIOD = 10; +module.exports = FDLayoutConstants; /***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { -/***/ "./node_modules/lodash/_baseZipObject.js": -/*!***********************************************!*\ - !*** ./node_modules/lodash/_baseZipObject.js ***! - \***********************************************/ -/***/ (function(module) { +"use strict"; -/** - * This base implementation of `_.zipObject` which assigns values using `assignFunc`. - * - * @private - * @param {Array} props The property identifiers. - * @param {Array} values The property values. - * @param {Function} assignFunc The function to assign values. - * @returns {Object} Returns the new object. - */ -function baseZipObject(props, values, assignFunc) { - var index = -1, - length = props.length, - valsLength = values.length, - result = {}; - while (++index < length) { - var value = index < valsLength ? values[index] : undefined; - assignFunc(result, props[index], value); +function PointD(x, y) { + if (x == null && y == null) { + this.x = 0; + this.y = 0; + } else { + this.x = x; + this.y = y; } - return result; } -module.exports = baseZipObject; +PointD.prototype.getX = function () { + return this.x; +}; +PointD.prototype.getY = function () { + return this.y; +}; -/***/ }), +PointD.prototype.setX = function (x) { + this.x = x; +}; -/***/ "./node_modules/lodash/_cacheHas.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_cacheHas.js ***! - \******************************************/ -/***/ (function(module) { +PointD.prototype.setY = function (y) { + this.y = y; +}; -/** - * Checks if a `cache` value for `key` exists. - * - * @private - * @param {Object} cache The cache to query. - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function cacheHas(cache, key) { - return cache.has(key); -} +PointD.prototype.getDifference = function (pt) { + return new DimensionD(this.x - pt.x, this.y - pt.y); +}; -module.exports = cacheHas; +PointD.prototype.getCopy = function () { + return new PointD(this.x, this.y); +}; + +PointD.prototype.translate = function (dim) { + this.x += dim.width; + this.y += dim.height; + return this; +}; +module.exports = PointD; /***/ }), +/* 6 */ +/***/ (function(module, exports, __nested_webpack_require_19670__) { -/***/ "./node_modules/lodash/_castFunction.js": -/*!**********************************************!*\ - !*** ./node_modules/lodash/_castFunction.js ***! - \**********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; -var identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js"); -/** - * Casts `value` to `identity` if it's not a function. - * - * @private - * @param {*} value The value to inspect. - * @returns {Function} Returns cast function. - */ -function castFunction(value) { - return typeof value == 'function' ? value : identity; -} +var LGraphObject = __nested_webpack_require_19670__(2); +var Integer = __nested_webpack_require_19670__(10); +var LayoutConstants = __nested_webpack_require_19670__(0); +var LGraphManager = __nested_webpack_require_19670__(7); +var LNode = __nested_webpack_require_19670__(3); +var LEdge = __nested_webpack_require_19670__(1); +var RectangleD = __nested_webpack_require_19670__(13); +var Point = __nested_webpack_require_19670__(12); +var LinkedList = __nested_webpack_require_19670__(11); -module.exports = castFunction; +function LGraph(parent, obj2, vGraph) { + LGraphObject.call(this, vGraph); + this.estimatedSize = Integer.MIN_VALUE; + this.margin = LayoutConstants.DEFAULT_GRAPH_MARGIN; + this.edges = []; + this.nodes = []; + this.isConnected = false; + this.parent = parent; + if (obj2 != null && obj2 instanceof LGraphManager) { + this.graphManager = obj2; + } else if (obj2 != null && obj2 instanceof Layout) { + this.graphManager = obj2.graphManager; + } +} -/***/ }), +LGraph.prototype = Object.create(LGraphObject.prototype); +for (var prop in LGraphObject) { + LGraph[prop] = LGraphObject[prop]; +} -/***/ "./node_modules/lodash/_castPath.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_castPath.js ***! - \******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +LGraph.prototype.getNodes = function () { + return this.nodes; +}; -var isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), - isKey = __webpack_require__(/*! ./_isKey */ "./node_modules/lodash/_isKey.js"), - stringToPath = __webpack_require__(/*! ./_stringToPath */ "./node_modules/lodash/_stringToPath.js"), - toString = __webpack_require__(/*! ./toString */ "./node_modules/lodash/toString.js"); +LGraph.prototype.getEdges = function () { + return this.edges; +}; -/** - * Casts `value` to a path array if it's not one. - * - * @private - * @param {*} value The value to inspect. - * @param {Object} [object] The object to query keys on. - * @returns {Array} Returns the cast property path array. - */ -function castPath(value, object) { - if (isArray(value)) { - return value; - } - return isKey(value, object) ? [value] : stringToPath(toString(value)); -} +LGraph.prototype.getGraphManager = function () { + return this.graphManager; +}; -module.exports = castPath; +LGraph.prototype.getParent = function () { + return this.parent; +}; +LGraph.prototype.getLeft = function () { + return this.left; +}; -/***/ }), +LGraph.prototype.getRight = function () { + return this.right; +}; -/***/ "./node_modules/lodash/_cloneArrayBuffer.js": -/*!**************************************************!*\ - !*** ./node_modules/lodash/_cloneArrayBuffer.js ***! - \**************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +LGraph.prototype.getTop = function () { + return this.top; +}; -var Uint8Array = __webpack_require__(/*! ./_Uint8Array */ "./node_modules/lodash/_Uint8Array.js"); +LGraph.prototype.getBottom = function () { + return this.bottom; +}; -/** - * Creates a clone of `arrayBuffer`. - * - * @private - * @param {ArrayBuffer} arrayBuffer The array buffer to clone. - * @returns {ArrayBuffer} Returns the cloned array buffer. - */ -function cloneArrayBuffer(arrayBuffer) { - var result = new arrayBuffer.constructor(arrayBuffer.byteLength); - new Uint8Array(result).set(new Uint8Array(arrayBuffer)); - return result; -} +LGraph.prototype.isConnected = function () { + return this.isConnected; +}; -module.exports = cloneArrayBuffer; +LGraph.prototype.add = function (obj1, sourceNode, targetNode) { + if (sourceNode == null && targetNode == null) { + var newNode = obj1; + if (this.graphManager == null) { + throw "Graph has no graph mgr!"; + } + if (this.getNodes().indexOf(newNode) > -1) { + throw "Node already in graph!"; + } + newNode.owner = this; + this.getNodes().push(newNode); + return newNode; + } else { + var newEdge = obj1; + if (!(this.getNodes().indexOf(sourceNode) > -1 && this.getNodes().indexOf(targetNode) > -1)) { + throw "Source or target not in graph!"; + } -/***/ }), + if (!(sourceNode.owner == targetNode.owner && sourceNode.owner == this)) { + throw "Both owners must be this graph!"; + } -/***/ "./node_modules/lodash/_cloneBuffer.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_cloneBuffer.js ***! - \*********************************************/ -/***/ (function(module, exports, __webpack_require__) { + if (sourceNode.owner != targetNode.owner) { + return null; + } -/* module decorator */ module = __webpack_require__.nmd(module); -var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); + // set source and target + newEdge.source = sourceNode; + newEdge.target = targetNode; -/** Detect free variable `exports`. */ -var freeExports = true && exports && !exports.nodeType && exports; + // set as intra-graph edge + newEdge.isInterGraph = false; -/** Detect free variable `module`. */ -var freeModule = freeExports && "object" == 'object' && module && !module.nodeType && module; + // add to graph edge list + this.getEdges().push(newEdge); -/** Detect the popular CommonJS extension `module.exports`. */ -var moduleExports = freeModule && freeModule.exports === freeExports; + // add to incidency lists + sourceNode.edges.push(newEdge); -/** Built-in value references. */ -var Buffer = moduleExports ? root.Buffer : undefined, - allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined; + if (targetNode != sourceNode) { + targetNode.edges.push(newEdge); + } -/** - * Creates a clone of `buffer`. - * - * @private - * @param {Buffer} buffer The buffer to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @returns {Buffer} Returns the cloned buffer. - */ -function cloneBuffer(buffer, isDeep) { - if (isDeep) { - return buffer.slice(); + return newEdge; } - var length = buffer.length, - result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); +}; - buffer.copy(result); - return result; -} +LGraph.prototype.remove = function (obj) { + var node = obj; + if (obj instanceof LNode) { + if (node == null) { + throw "Node is null!"; + } + if (!(node.owner != null && node.owner == this)) { + throw "Owner graph is invalid!"; + } + if (this.graphManager == null) { + throw "Owner graph manager is invalid!"; + } + // remove incident edges first (make a copy to do it safely) + var edgesToBeRemoved = node.edges.slice(); + var edge; + var s = edgesToBeRemoved.length; + for (var i = 0; i < s; i++) { + edge = edgesToBeRemoved[i]; -module.exports = cloneBuffer; + if (edge.isInterGraph) { + this.graphManager.remove(edge); + } else { + edge.source.owner.remove(edge); + } + } + // now the node itself + var index = this.nodes.indexOf(node); + if (index == -1) { + throw "Node not in owner node list!"; + } -/***/ }), + this.nodes.splice(index, 1); + } else if (obj instanceof LEdge) { + var edge = obj; + if (edge == null) { + throw "Edge is null!"; + } + if (!(edge.source != null && edge.target != null)) { + throw "Source and/or target is null!"; + } + if (!(edge.source.owner != null && edge.target.owner != null && edge.source.owner == this && edge.target.owner == this)) { + throw "Source and/or target owner is invalid!"; + } -/***/ "./node_modules/lodash/_cloneDataView.js": -/*!***********************************************!*\ - !*** ./node_modules/lodash/_cloneDataView.js ***! - \***********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + var sourceIndex = edge.source.edges.indexOf(edge); + var targetIndex = edge.target.edges.indexOf(edge); + if (!(sourceIndex > -1 && targetIndex > -1)) { + throw "Source and/or target doesn't know this edge!"; + } -var cloneArrayBuffer = __webpack_require__(/*! ./_cloneArrayBuffer */ "./node_modules/lodash/_cloneArrayBuffer.js"); + edge.source.edges.splice(sourceIndex, 1); -/** - * Creates a clone of `dataView`. - * - * @private - * @param {Object} dataView The data view to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @returns {Object} Returns the cloned data view. - */ -function cloneDataView(dataView, isDeep) { - var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; - return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); -} + if (edge.target != edge.source) { + edge.target.edges.splice(targetIndex, 1); + } -module.exports = cloneDataView; + var index = edge.source.owner.getEdges().indexOf(edge); + if (index == -1) { + throw "Not in owner's edge list!"; + } + edge.source.owner.getEdges().splice(index, 1); + } +}; -/***/ }), +LGraph.prototype.updateLeftTop = function () { + var top = Integer.MAX_VALUE; + var left = Integer.MAX_VALUE; + var nodeTop; + var nodeLeft; + var margin; -/***/ "./node_modules/lodash/_cloneRegExp.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_cloneRegExp.js ***! - \*********************************************/ -/***/ (function(module) { + var nodes = this.getNodes(); + var s = nodes.length; -/** Used to match `RegExp` flags from their coerced string values. */ -var reFlags = /\w*$/; + for (var i = 0; i < s; i++) { + var lNode = nodes[i]; + nodeTop = lNode.getTop(); + nodeLeft = lNode.getLeft(); -/** - * Creates a clone of `regexp`. - * - * @private - * @param {Object} regexp The regexp to clone. - * @returns {Object} Returns the cloned regexp. - */ -function cloneRegExp(regexp) { - var result = new regexp.constructor(regexp.source, reFlags.exec(regexp)); - result.lastIndex = regexp.lastIndex; - return result; -} + if (top > nodeTop) { + top = nodeTop; + } -module.exports = cloneRegExp; + if (left > nodeLeft) { + left = nodeLeft; + } + } + + // Do we have any nodes in this graph? + if (top == Integer.MAX_VALUE) { + return null; + } + + if (nodes[0].getParent().paddingLeft != undefined) { + margin = nodes[0].getParent().paddingLeft; + } else { + margin = this.margin; + } + + this.left = left - margin; + this.top = top - margin; + + // Apply the margins and return the result + return new Point(this.left, this.top); +}; +LGraph.prototype.updateBounds = function (recursive) { + // calculate bounds + var left = Integer.MAX_VALUE; + var right = -Integer.MAX_VALUE; + var top = Integer.MAX_VALUE; + var bottom = -Integer.MAX_VALUE; + var nodeLeft; + var nodeRight; + var nodeTop; + var nodeBottom; + var margin; + + var nodes = this.nodes; + var s = nodes.length; + for (var i = 0; i < s; i++) { + var lNode = nodes[i]; + + if (recursive && lNode.child != null) { + lNode.updateBounds(); + } + nodeLeft = lNode.getLeft(); + nodeRight = lNode.getRight(); + nodeTop = lNode.getTop(); + nodeBottom = lNode.getBottom(); + + if (left > nodeLeft) { + left = nodeLeft; + } + + if (right < nodeRight) { + right = nodeRight; + } -/***/ }), + if (top > nodeTop) { + top = nodeTop; + } -/***/ "./node_modules/lodash/_cloneSymbol.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_cloneSymbol.js ***! - \*********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + if (bottom < nodeBottom) { + bottom = nodeBottom; + } + } -var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"); + var boundingRect = new RectangleD(left, top, right - left, bottom - top); + if (left == Integer.MAX_VALUE) { + this.left = this.parent.getLeft(); + this.right = this.parent.getRight(); + this.top = this.parent.getTop(); + this.bottom = this.parent.getBottom(); + } -/** Used to convert symbols to primitives and strings. */ -var symbolProto = Symbol ? Symbol.prototype : undefined, - symbolValueOf = symbolProto ? symbolProto.valueOf : undefined; + if (nodes[0].getParent().paddingLeft != undefined) { + margin = nodes[0].getParent().paddingLeft; + } else { + margin = this.margin; + } -/** - * Creates a clone of the `symbol` object. - * - * @private - * @param {Object} symbol The symbol object to clone. - * @returns {Object} Returns the cloned symbol object. - */ -function cloneSymbol(symbol) { - return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {}; -} + this.left = boundingRect.x - margin; + this.right = boundingRect.x + boundingRect.width + margin; + this.top = boundingRect.y - margin; + this.bottom = boundingRect.y + boundingRect.height + margin; +}; -module.exports = cloneSymbol; +LGraph.calculateBounds = function (nodes) { + var left = Integer.MAX_VALUE; + var right = -Integer.MAX_VALUE; + var top = Integer.MAX_VALUE; + var bottom = -Integer.MAX_VALUE; + var nodeLeft; + var nodeRight; + var nodeTop; + var nodeBottom; + var s = nodes.length; -/***/ }), + for (var i = 0; i < s; i++) { + var lNode = nodes[i]; + nodeLeft = lNode.getLeft(); + nodeRight = lNode.getRight(); + nodeTop = lNode.getTop(); + nodeBottom = lNode.getBottom(); -/***/ "./node_modules/lodash/_cloneTypedArray.js": -/*!*************************************************!*\ - !*** ./node_modules/lodash/_cloneTypedArray.js ***! - \*************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + if (left > nodeLeft) { + left = nodeLeft; + } -var cloneArrayBuffer = __webpack_require__(/*! ./_cloneArrayBuffer */ "./node_modules/lodash/_cloneArrayBuffer.js"); + if (right < nodeRight) { + right = nodeRight; + } -/** - * Creates a clone of `typedArray`. - * - * @private - * @param {Object} typedArray The typed array to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @returns {Object} Returns the cloned typed array. - */ -function cloneTypedArray(typedArray, isDeep) { - var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; - return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); -} + if (top > nodeTop) { + top = nodeTop; + } -module.exports = cloneTypedArray; + if (bottom < nodeBottom) { + bottom = nodeBottom; + } + } + var boundingRect = new RectangleD(left, top, right - left, bottom - top); -/***/ }), + return boundingRect; +}; -/***/ "./node_modules/lodash/_compareAscending.js": -/*!**************************************************!*\ - !*** ./node_modules/lodash/_compareAscending.js ***! - \**************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +LGraph.prototype.getInclusionTreeDepth = function () { + if (this == this.graphManager.getRoot()) { + return 1; + } else { + return this.parent.getInclusionTreeDepth(); + } +}; -var isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); +LGraph.prototype.getEstimatedSize = function () { + if (this.estimatedSize == Integer.MIN_VALUE) { + throw "assert failed"; + } + return this.estimatedSize; +}; -/** - * Compares values to sort them in ascending order. - * - * @private - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {number} Returns the sort order indicator for `value`. - */ -function compareAscending(value, other) { - if (value !== other) { - var valIsDefined = value !== undefined, - valIsNull = value === null, - valIsReflexive = value === value, - valIsSymbol = isSymbol(value); +LGraph.prototype.calcEstimatedSize = function () { + var size = 0; + var nodes = this.nodes; + var s = nodes.length; - var othIsDefined = other !== undefined, - othIsNull = other === null, - othIsReflexive = other === other, - othIsSymbol = isSymbol(other); + for (var i = 0; i < s; i++) { + var lNode = nodes[i]; + size += lNode.calcEstimatedSize(); + } - if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) || - (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) || - (valIsNull && othIsDefined && othIsReflexive) || - (!valIsDefined && othIsReflexive) || - !valIsReflexive) { - return 1; - } - if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) || - (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) || - (othIsNull && valIsDefined && valIsReflexive) || - (!othIsDefined && valIsReflexive) || - !othIsReflexive) { - return -1; - } + if (size == 0) { + this.estimatedSize = LayoutConstants.EMPTY_COMPOUND_NODE_SIZE; + } else { + this.estimatedSize = size / Math.sqrt(this.nodes.length); } - return 0; -} -module.exports = compareAscending; + return this.estimatedSize; +}; +LGraph.prototype.updateConnected = function () { + var self = this; + if (this.nodes.length == 0) { + this.isConnected = true; + return; + } -/***/ }), + var queue = new LinkedList(); + var visited = new Set(); + var currentNode = this.nodes[0]; + var neighborEdges; + var currentNeighbor; + var childrenOfNode = currentNode.withChildren(); + childrenOfNode.forEach(function (node) { + queue.push(node); + visited.add(node); + }); -/***/ "./node_modules/lodash/_compareMultiple.js": -/*!*************************************************!*\ - !*** ./node_modules/lodash/_compareMultiple.js ***! - \*************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + while (queue.length !== 0) { + currentNode = queue.shift(); -var compareAscending = __webpack_require__(/*! ./_compareAscending */ "./node_modules/lodash/_compareAscending.js"); + // Traverse all neighbors of this node + neighborEdges = currentNode.getEdges(); + var size = neighborEdges.length; + for (var i = 0; i < size; i++) { + var neighborEdge = neighborEdges[i]; + currentNeighbor = neighborEdge.getOtherEndInGraph(currentNode, this); -/** - * Used by `_.orderBy` to compare multiple properties of a value to another - * and stable sort them. - * - * If `orders` is unspecified, all values are sorted in ascending order. Otherwise, - * specify an order of "desc" for descending or "asc" for ascending sort order - * of corresponding values. - * - * @private - * @param {Object} object The object to compare. - * @param {Object} other The other object to compare. - * @param {boolean[]|string[]} orders The order to sort by for each property. - * @returns {number} Returns the sort order indicator for `object`. - */ -function compareMultiple(object, other, orders) { - var index = -1, - objCriteria = object.criteria, - othCriteria = other.criteria, - length = objCriteria.length, - ordersLength = orders.length; + // Add unvisited neighbors to the list to visit + if (currentNeighbor != null && !visited.has(currentNeighbor)) { + var childrenOfNeighbor = currentNeighbor.withChildren(); - while (++index < length) { - var result = compareAscending(objCriteria[index], othCriteria[index]); - if (result) { - if (index >= ordersLength) { - return result; + childrenOfNeighbor.forEach(function (node) { + queue.push(node); + visited.add(node); + }); } - var order = orders[index]; - return result * (order == 'desc' ? -1 : 1); } } - // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications - // that causes it, under certain circumstances, to provide the same value for - // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 - // for more details. - // - // This also ensures a stable sort in V8 and other engines. - // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details. - return object.index - other.index; -} -module.exports = compareMultiple; - - -/***/ }), + this.isConnected = false; -/***/ "./node_modules/lodash/_copyArray.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_copyArray.js ***! - \*******************************************/ -/***/ (function(module) { + if (visited.size >= this.nodes.length) { + var noOfVisitedInThisGraph = 0; -/** - * Copies the values of `source` to `array`. - * - * @private - * @param {Array} source The array to copy values from. - * @param {Array} [array=[]] The array to copy values to. - * @returns {Array} Returns `array`. - */ -function copyArray(source, array) { - var index = -1, - length = source.length; + visited.forEach(function (visitedNode) { + if (visitedNode.owner == self) { + noOfVisitedInThisGraph++; + } + }); - array || (array = Array(length)); - while (++index < length) { - array[index] = source[index]; + if (noOfVisitedInThisGraph == this.nodes.length) { + this.isConnected = true; + } } - return array; -} - -module.exports = copyArray; +}; +module.exports = LGraph; /***/ }), +/* 7 */ +/***/ (function(module, exports, __nested_webpack_require_29738__) { -/***/ "./node_modules/lodash/_copyObject.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_copyObject.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; -var assignValue = __webpack_require__(/*! ./_assignValue */ "./node_modules/lodash/_assignValue.js"), - baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ "./node_modules/lodash/_baseAssignValue.js"); -/** - * Copies properties of `source` to `object`. - * - * @private - * @param {Object} source The object to copy properties from. - * @param {Array} props The property identifiers to copy. - * @param {Object} [object={}] The object to copy properties to. - * @param {Function} [customizer] The function to customize copied values. - * @returns {Object} Returns `object`. - */ -function copyObject(source, props, object, customizer) { - var isNew = !object; - object || (object = {}); +var LGraph; +var LEdge = __nested_webpack_require_29738__(1); - var index = -1, - length = props.length; +function LGraphManager(layout) { + LGraph = __nested_webpack_require_29738__(6); // It may be better to initilize this out of this function but it gives an error (Right-hand side of 'instanceof' is not callable) now. + this.layout = layout; - while (++index < length) { - var key = props[index]; + this.graphs = []; + this.edges = []; +} - var newValue = customizer - ? customizer(object[key], source[key], key, object, source) - : undefined; +LGraphManager.prototype.addRoot = function () { + var ngraph = this.layout.newGraph(); + var nnode = this.layout.newNode(null); + var root = this.add(ngraph, nnode); + this.setRootGraph(root); + return this.rootGraph; +}; - if (newValue === undefined) { - newValue = source[key]; +LGraphManager.prototype.add = function (newGraph, parentNode, newEdge, sourceNode, targetNode) { + //there are just 2 parameters are passed then it adds an LGraph else it adds an LEdge + if (newEdge == null && sourceNode == null && targetNode == null) { + if (newGraph == null) { + throw "Graph is null!"; } - if (isNew) { - baseAssignValue(object, key, newValue); - } else { - assignValue(object, key, newValue); + if (parentNode == null) { + throw "Parent node is null!"; + } + if (this.graphs.indexOf(newGraph) > -1) { + throw "Graph already in this graph mgr!"; } - } - return object; -} - -module.exports = copyObject; - - -/***/ }), -/***/ "./node_modules/lodash/_copySymbols.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_copySymbols.js ***! - \*********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + this.graphs.push(newGraph); -var copyObject = __webpack_require__(/*! ./_copyObject */ "./node_modules/lodash/_copyObject.js"), - getSymbols = __webpack_require__(/*! ./_getSymbols */ "./node_modules/lodash/_getSymbols.js"); + if (newGraph.parent != null) { + throw "Already has a parent!"; + } + if (parentNode.child != null) { + throw "Already has a child!"; + } -/** - * Copies own symbols of `source` to `object`. - * - * @private - * @param {Object} source The object to copy symbols from. - * @param {Object} [object={}] The object to copy symbols to. - * @returns {Object} Returns `object`. - */ -function copySymbols(source, object) { - return copyObject(source, getSymbols(source), object); -} + newGraph.parent = parentNode; + parentNode.child = newGraph; -module.exports = copySymbols; + return newGraph; + } else { + //change the order of the parameters + targetNode = newEdge; + sourceNode = parentNode; + newEdge = newGraph; + var sourceGraph = sourceNode.getOwner(); + var targetGraph = targetNode.getOwner(); + if (!(sourceGraph != null && sourceGraph.getGraphManager() == this)) { + throw "Source not in this graph mgr!"; + } + if (!(targetGraph != null && targetGraph.getGraphManager() == this)) { + throw "Target not in this graph mgr!"; + } -/***/ }), + if (sourceGraph == targetGraph) { + newEdge.isInterGraph = false; + return sourceGraph.add(newEdge, sourceNode, targetNode); + } else { + newEdge.isInterGraph = true; -/***/ "./node_modules/lodash/_copySymbolsIn.js": -/*!***********************************************!*\ - !*** ./node_modules/lodash/_copySymbolsIn.js ***! - \***********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // set source and target + newEdge.source = sourceNode; + newEdge.target = targetNode; -var copyObject = __webpack_require__(/*! ./_copyObject */ "./node_modules/lodash/_copyObject.js"), - getSymbolsIn = __webpack_require__(/*! ./_getSymbolsIn */ "./node_modules/lodash/_getSymbolsIn.js"); + // add edge to inter-graph edge list + if (this.edges.indexOf(newEdge) > -1) { + throw "Edge already in inter-graph edge list!"; + } -/** - * Copies own and inherited symbols of `source` to `object`. - * - * @private - * @param {Object} source The object to copy symbols from. - * @param {Object} [object={}] The object to copy symbols to. - * @returns {Object} Returns `object`. - */ -function copySymbolsIn(source, object) { - return copyObject(source, getSymbolsIn(source), object); -} + this.edges.push(newEdge); -module.exports = copySymbolsIn; + // add edge to source and target incidency lists + if (!(newEdge.source != null && newEdge.target != null)) { + throw "Edge source and/or target is null!"; + } + if (!(newEdge.source.edges.indexOf(newEdge) == -1 && newEdge.target.edges.indexOf(newEdge) == -1)) { + throw "Edge already in source and/or target incidency list!"; + } -/***/ }), + newEdge.source.edges.push(newEdge); + newEdge.target.edges.push(newEdge); -/***/ "./node_modules/lodash/_coreJsData.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_coreJsData.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + return newEdge; + } + } +}; -var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); +LGraphManager.prototype.remove = function (lObj) { + if (lObj instanceof LGraph) { + var graph = lObj; + if (graph.getGraphManager() != this) { + throw "Graph not in this graph mgr"; + } + if (!(graph == this.rootGraph || graph.parent != null && graph.parent.graphManager == this)) { + throw "Invalid parent node!"; + } -/** Used to detect overreaching core-js shims. */ -var coreJsData = root['__core-js_shared__']; + // first the edges (make a copy to do it safely) + var edgesToBeRemoved = []; -module.exports = coreJsData; + edgesToBeRemoved = edgesToBeRemoved.concat(graph.getEdges()); + var edge; + var s = edgesToBeRemoved.length; + for (var i = 0; i < s; i++) { + edge = edgesToBeRemoved[i]; + graph.remove(edge); + } -/***/ }), + // then the nodes (make a copy to do it safely) + var nodesToBeRemoved = []; -/***/ "./node_modules/lodash/_createAssigner.js": -/*!************************************************!*\ - !*** ./node_modules/lodash/_createAssigner.js ***! - \************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + nodesToBeRemoved = nodesToBeRemoved.concat(graph.getNodes()); -var baseRest = __webpack_require__(/*! ./_baseRest */ "./node_modules/lodash/_baseRest.js"), - isIterateeCall = __webpack_require__(/*! ./_isIterateeCall */ "./node_modules/lodash/_isIterateeCall.js"); + var node; + s = nodesToBeRemoved.length; + for (var i = 0; i < s; i++) { + node = nodesToBeRemoved[i]; + graph.remove(node); + } -/** - * Creates a function like `_.assign`. - * - * @private - * @param {Function} assigner The function to assign values. - * @returns {Function} Returns the new assigner function. - */ -function createAssigner(assigner) { - return baseRest(function(object, sources) { - var index = -1, - length = sources.length, - customizer = length > 1 ? sources[length - 1] : undefined, - guard = length > 2 ? sources[2] : undefined; + // check if graph is the root + if (graph == this.rootGraph) { + this.setRootGraph(null); + } - customizer = (assigner.length > 3 && typeof customizer == 'function') - ? (length--, customizer) - : undefined; + // now remove the graph itself + var index = this.graphs.indexOf(graph); + this.graphs.splice(index, 1); - if (guard && isIterateeCall(sources[0], sources[1], guard)) { - customizer = length < 3 ? undefined : customizer; - length = 1; + // also reset the parent of the graph + graph.parent = null; + } else if (lObj instanceof LEdge) { + edge = lObj; + if (edge == null) { + throw "Edge is null!"; } - object = Object(object); - while (++index < length) { - var source = sources[index]; - if (source) { - assigner(object, source, index, customizer); - } + if (!edge.isInterGraph) { + throw "Not an inter-graph edge!"; + } + if (!(edge.source != null && edge.target != null)) { + throw "Source and/or target is null!"; } - return object; - }); -} - -module.exports = createAssigner; + // remove edge from source and target nodes' incidency lists -/***/ }), + if (!(edge.source.edges.indexOf(edge) != -1 && edge.target.edges.indexOf(edge) != -1)) { + throw "Source and/or target doesn't know this edge!"; + } -/***/ "./node_modules/lodash/_createBaseEach.js": -/*!************************************************!*\ - !*** ./node_modules/lodash/_createBaseEach.js ***! - \************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + var index = edge.source.edges.indexOf(edge); + edge.source.edges.splice(index, 1); + index = edge.target.edges.indexOf(edge); + edge.target.edges.splice(index, 1); -var isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"); + // remove edge from owner graph manager's inter-graph edge list -/** - * Creates a `baseEach` or `baseEachRight` function. - * - * @private - * @param {Function} eachFunc The function to iterate over a collection. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Function} Returns the new base function. - */ -function createBaseEach(eachFunc, fromRight) { - return function(collection, iteratee) { - if (collection == null) { - return collection; + if (!(edge.source.owner != null && edge.source.owner.getGraphManager() != null)) { + throw "Edge owner graph or owner graph manager is null!"; } - if (!isArrayLike(collection)) { - return eachFunc(collection, iteratee); + if (edge.source.owner.getGraphManager().edges.indexOf(edge) == -1) { + throw "Not in owner graph manager's edge list!"; } - var length = collection.length, - index = fromRight ? length : -1, - iterable = Object(collection); - while ((fromRight ? index-- : ++index < length)) { - if (iteratee(iterable[index], index, iterable) === false) { - break; - } - } - return collection; - }; -} + var index = edge.source.owner.getGraphManager().edges.indexOf(edge); + edge.source.owner.getGraphManager().edges.splice(index, 1); + } +}; -module.exports = createBaseEach; +LGraphManager.prototype.updateBounds = function () { + this.rootGraph.updateBounds(true); +}; +LGraphManager.prototype.getGraphs = function () { + return this.graphs; +}; -/***/ }), +LGraphManager.prototype.getAllNodes = function () { + if (this.allNodes == null) { + var nodeList = []; + var graphs = this.getGraphs(); + var s = graphs.length; + for (var i = 0; i < s; i++) { + nodeList = nodeList.concat(graphs[i].getNodes()); + } + this.allNodes = nodeList; + } + return this.allNodes; +}; -/***/ "./node_modules/lodash/_createBaseFor.js": -/*!***********************************************!*\ - !*** ./node_modules/lodash/_createBaseFor.js ***! - \***********************************************/ -/***/ (function(module) { +LGraphManager.prototype.resetAllNodes = function () { + this.allNodes = null; +}; -/** - * Creates a base function for methods like `_.forIn` and `_.forOwn`. - * - * @private - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Function} Returns the new base function. - */ -function createBaseFor(fromRight) { - return function(object, iteratee, keysFunc) { - var index = -1, - iterable = Object(object), - props = keysFunc(object), - length = props.length; +LGraphManager.prototype.resetAllEdges = function () { + this.allEdges = null; +}; - while (length--) { - var key = props[fromRight ? length : ++index]; - if (iteratee(iterable[key], key, iterable) === false) { - break; - } +LGraphManager.prototype.resetAllNodesToApplyGravitation = function () { + this.allNodesToApplyGravitation = null; +}; + +LGraphManager.prototype.getAllEdges = function () { + if (this.allEdges == null) { + var edgeList = []; + var graphs = this.getGraphs(); + var s = graphs.length; + for (var i = 0; i < graphs.length; i++) { + edgeList = edgeList.concat(graphs[i].getEdges()); } - return object; - }; -} -module.exports = createBaseFor; + edgeList = edgeList.concat(this.edges); + this.allEdges = edgeList; + } + return this.allEdges; +}; -/***/ }), +LGraphManager.prototype.getAllNodesToApplyGravitation = function () { + return this.allNodesToApplyGravitation; +}; -/***/ "./node_modules/lodash/_createFind.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_createFind.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +LGraphManager.prototype.setAllNodesToApplyGravitation = function (nodeList) { + if (this.allNodesToApplyGravitation != null) { + throw "assert failed"; + } -var baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), - isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"), - keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); + this.allNodesToApplyGravitation = nodeList; +}; -/** - * Creates a `_.find` or `_.findLast` function. - * - * @private - * @param {Function} findIndexFunc The function to find the collection index. - * @returns {Function} Returns the new find function. - */ -function createFind(findIndexFunc) { - return function(collection, predicate, fromIndex) { - var iterable = Object(collection); - if (!isArrayLike(collection)) { - var iteratee = baseIteratee(predicate, 3); - collection = keys(collection); - predicate = function(key) { return iteratee(iterable[key], key, iterable); }; - } - var index = findIndexFunc(collection, predicate, fromIndex); - return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined; - }; -} +LGraphManager.prototype.getRoot = function () { + return this.rootGraph; +}; -module.exports = createFind; +LGraphManager.prototype.setRootGraph = function (graph) { + if (graph.getGraphManager() != this) { + throw "Root not in this graph mgr!"; + } + this.rootGraph = graph; + // root graph must have a root node associated with it for convenience + if (graph.parent == null) { + graph.parent = this.layout.newNode("Root node"); + } +}; -/***/ }), +LGraphManager.prototype.getLayout = function () { + return this.layout; +}; -/***/ "./node_modules/lodash/_createRange.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_createRange.js ***! - \*********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +LGraphManager.prototype.isOneAncestorOfOther = function (firstNode, secondNode) { + if (!(firstNode != null && secondNode != null)) { + throw "assert failed"; + } -var baseRange = __webpack_require__(/*! ./_baseRange */ "./node_modules/lodash/_baseRange.js"), - isIterateeCall = __webpack_require__(/*! ./_isIterateeCall */ "./node_modules/lodash/_isIterateeCall.js"), - toFinite = __webpack_require__(/*! ./toFinite */ "./node_modules/lodash/toFinite.js"); + if (firstNode == secondNode) { + return true; + } + // Is second node an ancestor of the first one? + var ownerGraph = firstNode.getOwner(); + var parentNode; -/** - * Creates a `_.range` or `_.rangeRight` function. - * - * @private - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Function} Returns the new range function. - */ -function createRange(fromRight) { - return function(start, end, step) { - if (step && typeof step != 'number' && isIterateeCall(start, end, step)) { - end = step = undefined; - } - // Ensure the sign of `-0` is preserved. - start = toFinite(start); - if (end === undefined) { - end = start; - start = 0; - } else { - end = toFinite(end); + do { + parentNode = ownerGraph.getParent(); + + if (parentNode == null) { + break; } - step = step === undefined ? (start < end ? 1 : -1) : toFinite(step); - return baseRange(start, end, step, fromRight); - }; -} -module.exports = createRange; + if (parentNode == secondNode) { + return true; + } + ownerGraph = parentNode.getOwner(); + if (ownerGraph == null) { + break; + } + } while (true); + // Is first node an ancestor of the second one? + ownerGraph = secondNode.getOwner(); -/***/ }), + do { + parentNode = ownerGraph.getParent(); -/***/ "./node_modules/lodash/_createSet.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_createSet.js ***! - \*******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + if (parentNode == null) { + break; + } -var Set = __webpack_require__(/*! ./_Set */ "./node_modules/lodash/_Set.js"), - noop = __webpack_require__(/*! ./noop */ "./node_modules/lodash/noop.js"), - setToArray = __webpack_require__(/*! ./_setToArray */ "./node_modules/lodash/_setToArray.js"); + if (parentNode == firstNode) { + return true; + } -/** Used as references for various `Number` constants. */ -var INFINITY = 1 / 0; + ownerGraph = parentNode.getOwner(); + if (ownerGraph == null) { + break; + } + } while (true); -/** - * Creates a set object of `values`. - * - * @private - * @param {Array} values The values to add to the set. - * @returns {Object} Returns the new set. - */ -var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) { - return new Set(values); + return false; }; -module.exports = createSet; - - -/***/ }), +LGraphManager.prototype.calcLowestCommonAncestors = function () { + var edge; + var sourceNode; + var targetNode; + var sourceAncestorGraph; + var targetAncestorGraph; -/***/ "./node_modules/lodash/_defineProperty.js": -/*!************************************************!*\ - !*** ./node_modules/lodash/_defineProperty.js ***! - \************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + var edges = this.getAllEdges(); + var s = edges.length; + for (var i = 0; i < s; i++) { + edge = edges[i]; -var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"); + sourceNode = edge.source; + targetNode = edge.target; + edge.lca = null; + edge.sourceInLca = sourceNode; + edge.targetInLca = targetNode; -var defineProperty = (function() { - try { - var func = getNative(Object, 'defineProperty'); - func({}, '', {}); - return func; - } catch (e) {} -}()); + if (sourceNode == targetNode) { + edge.lca = sourceNode.getOwner(); + continue; + } -module.exports = defineProperty; + sourceAncestorGraph = sourceNode.getOwner(); + while (edge.lca == null) { + edge.targetInLca = targetNode; + targetAncestorGraph = targetNode.getOwner(); -/***/ }), + while (edge.lca == null) { + if (targetAncestorGraph == sourceAncestorGraph) { + edge.lca = targetAncestorGraph; + break; + } -/***/ "./node_modules/lodash/_equalArrays.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_equalArrays.js ***! - \*********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + if (targetAncestorGraph == this.rootGraph) { + break; + } -var SetCache = __webpack_require__(/*! ./_SetCache */ "./node_modules/lodash/_SetCache.js"), - arraySome = __webpack_require__(/*! ./_arraySome */ "./node_modules/lodash/_arraySome.js"), - cacheHas = __webpack_require__(/*! ./_cacheHas */ "./node_modules/lodash/_cacheHas.js"); + if (edge.lca != null) { + throw "assert failed"; + } + edge.targetInLca = targetAncestorGraph.getParent(); + targetAncestorGraph = edge.targetInLca.getOwner(); + } -/** Used to compose bitmasks for value comparisons. */ -var COMPARE_PARTIAL_FLAG = 1, - COMPARE_UNORDERED_FLAG = 2; + if (sourceAncestorGraph == this.rootGraph) { + break; + } -/** - * A specialized version of `baseIsEqualDeep` for arrays with support for - * partial deep comparisons. - * - * @private - * @param {Array} array The array to compare. - * @param {Array} other The other array to compare. - * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. - * @param {Function} customizer The function to customize comparisons. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Object} stack Tracks traversed `array` and `other` objects. - * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. - */ -function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { - var isPartial = bitmask & COMPARE_PARTIAL_FLAG, - arrLength = array.length, - othLength = other.length; + if (edge.lca == null) { + edge.sourceInLca = sourceAncestorGraph.getParent(); + sourceAncestorGraph = edge.sourceInLca.getOwner(); + } + } - if (arrLength != othLength && !(isPartial && othLength > arrLength)) { - return false; - } - // Check that cyclic values are equal. - var arrStacked = stack.get(array); - var othStacked = stack.get(other); - if (arrStacked && othStacked) { - return arrStacked == other && othStacked == array; + if (edge.lca == null) { + throw "assert failed"; + } } - var index = -1, - result = true, - seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined; - - stack.set(array, other); - stack.set(other, array); +}; - // Ignore non-index properties. - while (++index < arrLength) { - var arrValue = array[index], - othValue = other[index]; +LGraphManager.prototype.calcLowestCommonAncestor = function (firstNode, secondNode) { + if (firstNode == secondNode) { + return firstNode.getOwner(); + } + var firstOwnerGraph = firstNode.getOwner(); - if (customizer) { - var compared = isPartial - ? customizer(othValue, arrValue, index, other, array, stack) - : customizer(arrValue, othValue, index, array, other, stack); - } - if (compared !== undefined) { - if (compared) { - continue; - } - result = false; + do { + if (firstOwnerGraph == null) { break; } - // Recursively compare arrays (susceptible to call stack limits). - if (seen) { - if (!arraySome(other, function(othValue, othIndex) { - if (!cacheHas(seen, othIndex) && - (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { - return seen.push(othIndex); - } - })) { - result = false; + var secondOwnerGraph = secondNode.getOwner(); + + do { + if (secondOwnerGraph == null) { break; } - } else if (!( - arrValue === othValue || - equalFunc(arrValue, othValue, bitmask, customizer, stack) - )) { - result = false; - break; + + if (secondOwnerGraph == firstOwnerGraph) { + return secondOwnerGraph; + } + secondOwnerGraph = secondOwnerGraph.getParent().getOwner(); + } while (true); + + firstOwnerGraph = firstOwnerGraph.getParent().getOwner(); + } while (true); + + return firstOwnerGraph; +}; + +LGraphManager.prototype.calcInclusionTreeDepths = function (graph, depth) { + if (graph == null && depth == null) { + graph = this.rootGraph; + depth = 1; + } + var node; + + var nodes = graph.getNodes(); + var s = nodes.length; + for (var i = 0; i < s; i++) { + node = nodes[i]; + node.inclusionTreeDepth = depth; + + if (node.child != null) { + this.calcInclusionTreeDepths(node.child, depth + 1); } } - stack['delete'](array); - stack['delete'](other); - return result; -} +}; -module.exports = equalArrays; +LGraphManager.prototype.includesInvalidEdge = function () { + var edge; + var edgesToRemove = []; + var s = this.edges.length; + for (var i = 0; i < s; i++) { + edge = this.edges[i]; -/***/ }), + if (this.isOneAncestorOfOther(edge.source, edge.target)) { + edgesToRemove.push(edge); + } + } -/***/ "./node_modules/lodash/_equalByTag.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_equalByTag.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // Remove invalid edges from graph manager + for (var i = 0; i < edgesToRemove.length; i++) { + this.remove(edgesToRemove[i]); + } -var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"), - Uint8Array = __webpack_require__(/*! ./_Uint8Array */ "./node_modules/lodash/_Uint8Array.js"), - eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"), - equalArrays = __webpack_require__(/*! ./_equalArrays */ "./node_modules/lodash/_equalArrays.js"), - mapToArray = __webpack_require__(/*! ./_mapToArray */ "./node_modules/lodash/_mapToArray.js"), - setToArray = __webpack_require__(/*! ./_setToArray */ "./node_modules/lodash/_setToArray.js"); + // Invalid edges are cleared, so return false + return false; +}; -/** Used to compose bitmasks for value comparisons. */ -var COMPARE_PARTIAL_FLAG = 1, - COMPARE_UNORDERED_FLAG = 2; +module.exports = LGraphManager; -/** `Object#toString` result references. */ -var boolTag = '[object Boolean]', - dateTag = '[object Date]', - errorTag = '[object Error]', - mapTag = '[object Map]', - numberTag = '[object Number]', - regexpTag = '[object RegExp]', - setTag = '[object Set]', - stringTag = '[object String]', - symbolTag = '[object Symbol]'; +/***/ }), +/* 8 */ +/***/ (function(module, exports, __nested_webpack_require_41052__) { -var arrayBufferTag = '[object ArrayBuffer]', - dataViewTag = '[object DataView]'; +"use strict"; -/** Used to convert symbols to primitives and strings. */ -var symbolProto = Symbol ? Symbol.prototype : undefined, - symbolValueOf = symbolProto ? symbolProto.valueOf : undefined; /** - * A specialized version of `baseIsEqualDeep` for comparing objects of - * the same `toStringTag`. + * This class maintains a list of static geometry related utility methods. * - * **Note:** This function only supports comparing values with tags of - * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. * - * @private - * @param {Object} object The object to compare. - * @param {Object} other The other object to compare. - * @param {string} tag The `toStringTag` of the objects to compare. - * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. - * @param {Function} customizer The function to customize comparisons. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Object} stack Tracks traversed `object` and `other` objects. - * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + * Copyright: i-Vis Research Group, Bilkent University, 2007 - present */ -function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { - switch (tag) { - case dataViewTag: - if ((object.byteLength != other.byteLength) || - (object.byteOffset != other.byteOffset)) { - return false; - } - object = object.buffer; - other = other.buffer; - - case arrayBufferTag: - if ((object.byteLength != other.byteLength) || - !equalFunc(new Uint8Array(object), new Uint8Array(other))) { - return false; - } - return true; - - case boolTag: - case dateTag: - case numberTag: - // Coerce booleans to `1` or `0` and dates to milliseconds. - // Invalid dates are coerced to `NaN`. - return eq(+object, +other); - - case errorTag: - return object.name == other.name && object.message == other.message; - - case regexpTag: - case stringTag: - // Coerce regexes to strings and treat strings, primitives and objects, - // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring - // for more details. - return object == (other + ''); - - case mapTag: - var convert = mapToArray; - - case setTag: - var isPartial = bitmask & COMPARE_PARTIAL_FLAG; - convert || (convert = setToArray); - if (object.size != other.size && !isPartial) { - return false; - } - // Assume cyclic values are equal. - var stacked = stack.get(object); - if (stacked) { - return stacked == other; - } - bitmask |= COMPARE_UNORDERED_FLAG; +var Point = __nested_webpack_require_41052__(12); - // Recursively compare objects (susceptible to call stack limits). - stack.set(object, other); - var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); - stack['delete'](object); - return result; +function IGeometry() {} - case symbolTag: - if (symbolValueOf) { - return symbolValueOf.call(object) == symbolValueOf.call(other); - } +/** + * This method calculates *half* the amount in x and y directions of the two + * input rectangles needed to separate them keeping their respective + * positioning, and returns the result in the input array. An input + * separation buffer added to the amount in both directions. We assume that + * the two rectangles do intersect. + */ +IGeometry.calcSeparationAmount = function (rectA, rectB, overlapAmount, separationBuffer) { + if (!rectA.intersects(rectB)) { + throw "assert failed"; } - return false; -} -module.exports = equalByTag; + var directions = new Array(2); + this.decideDirectionsForOverlappingNodes(rectA, rectB, directions); -/***/ }), + overlapAmount[0] = Math.min(rectA.getRight(), rectB.getRight()) - Math.max(rectA.x, rectB.x); + overlapAmount[1] = Math.min(rectA.getBottom(), rectB.getBottom()) - Math.max(rectA.y, rectB.y); -/***/ "./node_modules/lodash/_equalObjects.js": -/*!**********************************************!*\ - !*** ./node_modules/lodash/_equalObjects.js ***! - \**********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // update the overlapping amounts for the following cases: + if (rectA.getX() <= rectB.getX() && rectA.getRight() >= rectB.getRight()) { + /* Case x.1: + * + * rectA + * | | + * | _________ | + * | | | | + * |________|_______|______| + * | | + * | | + * rectB + */ + overlapAmount[0] += Math.min(rectB.getX() - rectA.getX(), rectA.getRight() - rectB.getRight()); + } else if (rectB.getX() <= rectA.getX() && rectB.getRight() >= rectA.getRight()) { + /* Case x.2: + * + * rectB + * | | + * | _________ | + * | | | | + * |________|_______|______| + * | | + * | | + * rectA + */ + overlapAmount[0] += Math.min(rectA.getX() - rectB.getX(), rectB.getRight() - rectA.getRight()); + } + if (rectA.getY() <= rectB.getY() && rectA.getBottom() >= rectB.getBottom()) { + /* Case y.1: + * ________ rectA + * | + * | + * ______|____ rectB + * | | + * | | + * ______|____| + * | + * | + * |________ + * + */ + overlapAmount[1] += Math.min(rectB.getY() - rectA.getY(), rectA.getBottom() - rectB.getBottom()); + } else if (rectB.getY() <= rectA.getY() && rectB.getBottom() >= rectA.getBottom()) { + /* Case y.2: + * ________ rectB + * | + * | + * ______|____ rectA + * | | + * | | + * ______|____| + * | + * | + * |________ + * + */ + overlapAmount[1] += Math.min(rectA.getY() - rectB.getY(), rectB.getBottom() - rectA.getBottom()); + } -var getAllKeys = __webpack_require__(/*! ./_getAllKeys */ "./node_modules/lodash/_getAllKeys.js"); + // find slope of the line passes two centers + var slope = Math.abs((rectB.getCenterY() - rectA.getCenterY()) / (rectB.getCenterX() - rectA.getCenterX())); + // if centers are overlapped + if (rectB.getCenterY() === rectA.getCenterY() && rectB.getCenterX() === rectA.getCenterX()) { + // assume the slope is 1 (45 degree) + slope = 1.0; + } -/** Used to compose bitmasks for value comparisons. */ -var COMPARE_PARTIAL_FLAG = 1; + var moveByY = slope * overlapAmount[0]; + var moveByX = overlapAmount[1] / slope; + if (overlapAmount[0] < moveByX) { + moveByX = overlapAmount[0]; + } else { + moveByY = overlapAmount[1]; + } + // return half the amount so that if each rectangle is moved by these + // amounts in opposite directions, overlap will be resolved + overlapAmount[0] = -1 * directions[0] * (moveByX / 2 + separationBuffer); + overlapAmount[1] = -1 * directions[1] * (moveByY / 2 + separationBuffer); +}; -/** Used for built-in method references. */ -var objectProto = Object.prototype; +/** + * This method decides the separation direction of overlapping nodes + * + * if directions[0] = -1, then rectA goes left + * if directions[0] = 1, then rectA goes right + * if directions[1] = -1, then rectA goes up + * if directions[1] = 1, then rectA goes down + */ +IGeometry.decideDirectionsForOverlappingNodes = function (rectA, rectB, directions) { + if (rectA.getCenterX() < rectB.getCenterX()) { + directions[0] = -1; + } else { + directions[0] = 1; + } -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; + if (rectA.getCenterY() < rectB.getCenterY()) { + directions[1] = -1; + } else { + directions[1] = 1; + } +}; /** - * A specialized version of `baseIsEqualDeep` for objects with support for - * partial deep comparisons. - * - * @private - * @param {Object} object The object to compare. - * @param {Object} other The other object to compare. - * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. - * @param {Function} customizer The function to customize comparisons. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Object} stack Tracks traversed `object` and `other` objects. - * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + * This method calculates the intersection (clipping) points of the two + * input rectangles with line segment defined by the centers of these two + * rectangles. The clipping points are saved in the input double array and + * whether or not the two rectangles overlap is returned. */ -function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { - var isPartial = bitmask & COMPARE_PARTIAL_FLAG, - objProps = getAllKeys(object), - objLength = objProps.length, - othProps = getAllKeys(other), - othLength = othProps.length; +IGeometry.getIntersection2 = function (rectA, rectB, result) { + //result[0-1] will contain clipPoint of rectA, result[2-3] will contain clipPoint of rectB + var p1x = rectA.getCenterX(); + var p1y = rectA.getCenterY(); + var p2x = rectB.getCenterX(); + var p2y = rectB.getCenterY(); - if (objLength != othLength && !isPartial) { - return false; + //if two rectangles intersect, then clipping points are centers + if (rectA.intersects(rectB)) { + result[0] = p1x; + result[1] = p1y; + result[2] = p2x; + result[3] = p2y; + return true; } - var index = objLength; - while (index--) { - var key = objProps[index]; - if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { + //variables for rectA + var topLeftAx = rectA.getX(); + var topLeftAy = rectA.getY(); + var topRightAx = rectA.getRight(); + var bottomLeftAx = rectA.getX(); + var bottomLeftAy = rectA.getBottom(); + var bottomRightAx = rectA.getRight(); + var halfWidthA = rectA.getWidthHalf(); + var halfHeightA = rectA.getHeightHalf(); + //variables for rectB + var topLeftBx = rectB.getX(); + var topLeftBy = rectB.getY(); + var topRightBx = rectB.getRight(); + var bottomLeftBx = rectB.getX(); + var bottomLeftBy = rectB.getBottom(); + var bottomRightBx = rectB.getRight(); + var halfWidthB = rectB.getWidthHalf(); + var halfHeightB = rectB.getHeightHalf(); + + //flag whether clipping points are found + var clipPointAFound = false; + var clipPointBFound = false; + + // line is vertical + if (p1x === p2x) { + if (p1y > p2y) { + result[0] = p1x; + result[1] = topLeftAy; + result[2] = p2x; + result[3] = bottomLeftBy; + return false; + } else if (p1y < p2y) { + result[0] = p1x; + result[1] = bottomLeftAy; + result[2] = p2x; + result[3] = topLeftBy; return false; + } else { + //not line, return null; } } - // Check that cyclic values are equal. - var objStacked = stack.get(object); - var othStacked = stack.get(other); - if (objStacked && othStacked) { - return objStacked == other && othStacked == object; - } - var result = true; - stack.set(object, other); - stack.set(other, object); + // line is horizontal + else if (p1y === p2y) { + if (p1x > p2x) { + result[0] = topLeftAx; + result[1] = p1y; + result[2] = topRightBx; + result[3] = p2y; + return false; + } else if (p1x < p2x) { + result[0] = topRightAx; + result[1] = p1y; + result[2] = topLeftBx; + result[3] = p2y; + return false; + } else { + //not valid line, return null; + } + } else { + //slopes of rectA's and rectB's diagonals + var slopeA = rectA.height / rectA.width; + var slopeB = rectB.height / rectB.width; - var skipCtor = isPartial; - while (++index < objLength) { - key = objProps[index]; - var objValue = object[key], - othValue = other[key]; + //slope of line between center of rectA and center of rectB + var slopePrime = (p2y - p1y) / (p2x - p1x); + var cardinalDirectionA = void 0; + var cardinalDirectionB = void 0; + var tempPointAx = void 0; + var tempPointAy = void 0; + var tempPointBx = void 0; + var tempPointBy = void 0; - if (customizer) { - var compared = isPartial - ? customizer(othValue, objValue, key, other, object, stack) - : customizer(objValue, othValue, key, object, other, stack); - } - // Recursively compare objects (susceptible to call stack limits). - if (!(compared === undefined - ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) - : compared - )) { - result = false; - break; + //determine whether clipping point is the corner of nodeA + if (-slopeA === slopePrime) { + if (p1x > p2x) { + result[0] = bottomLeftAx; + result[1] = bottomLeftAy; + clipPointAFound = true; + } else { + result[0] = topRightAx; + result[1] = topLeftAy; + clipPointAFound = true; + } + } else if (slopeA === slopePrime) { + if (p1x > p2x) { + result[0] = topLeftAx; + result[1] = topLeftAy; + clipPointAFound = true; + } else { + result[0] = bottomRightAx; + result[1] = bottomLeftAy; + clipPointAFound = true; + } + } + + //determine whether clipping point is the corner of nodeB + if (-slopeB === slopePrime) { + if (p2x > p1x) { + result[2] = bottomLeftBx; + result[3] = bottomLeftBy; + clipPointBFound = true; + } else { + result[2] = topRightBx; + result[3] = topLeftBy; + clipPointBFound = true; + } + } else if (slopeB === slopePrime) { + if (p2x > p1x) { + result[2] = topLeftBx; + result[3] = topLeftBy; + clipPointBFound = true; + } else { + result[2] = bottomRightBx; + result[3] = bottomLeftBy; + clipPointBFound = true; + } + } + + //if both clipping points are corners + if (clipPointAFound && clipPointBFound) { + return false; + } + + //determine Cardinal Direction of rectangles + if (p1x > p2x) { + if (p1y > p2y) { + cardinalDirectionA = this.getCardinalDirection(slopeA, slopePrime, 4); + cardinalDirectionB = this.getCardinalDirection(slopeB, slopePrime, 2); + } else { + cardinalDirectionA = this.getCardinalDirection(-slopeA, slopePrime, 3); + cardinalDirectionB = this.getCardinalDirection(-slopeB, slopePrime, 1); + } + } else { + if (p1y > p2y) { + cardinalDirectionA = this.getCardinalDirection(-slopeA, slopePrime, 1); + cardinalDirectionB = this.getCardinalDirection(-slopeB, slopePrime, 3); + } else { + cardinalDirectionA = this.getCardinalDirection(slopeA, slopePrime, 2); + cardinalDirectionB = this.getCardinalDirection(slopeB, slopePrime, 4); + } + } + //calculate clipping Point if it is not found before + if (!clipPointAFound) { + switch (cardinalDirectionA) { + case 1: + tempPointAy = topLeftAy; + tempPointAx = p1x + -halfHeightA / slopePrime; + result[0] = tempPointAx; + result[1] = tempPointAy; + break; + case 2: + tempPointAx = bottomRightAx; + tempPointAy = p1y + halfWidthA * slopePrime; + result[0] = tempPointAx; + result[1] = tempPointAy; + break; + case 3: + tempPointAy = bottomLeftAy; + tempPointAx = p1x + halfHeightA / slopePrime; + result[0] = tempPointAx; + result[1] = tempPointAy; + break; + case 4: + tempPointAx = bottomLeftAx; + tempPointAy = p1y + -halfWidthA * slopePrime; + result[0] = tempPointAx; + result[1] = tempPointAy; + break; + } + } + if (!clipPointBFound) { + switch (cardinalDirectionB) { + case 1: + tempPointBy = topLeftBy; + tempPointBx = p2x + -halfHeightB / slopePrime; + result[2] = tempPointBx; + result[3] = tempPointBy; + break; + case 2: + tempPointBx = bottomRightBx; + tempPointBy = p2y + halfWidthB * slopePrime; + result[2] = tempPointBx; + result[3] = tempPointBy; + break; + case 3: + tempPointBy = bottomLeftBy; + tempPointBx = p2x + halfHeightB / slopePrime; + result[2] = tempPointBx; + result[3] = tempPointBy; + break; + case 4: + tempPointBx = bottomLeftBx; + tempPointBy = p2y + -halfWidthB * slopePrime; + result[2] = tempPointBx; + result[3] = tempPointBy; + break; + } + } } - skipCtor || (skipCtor = key == 'constructor'); + return false; +}; + +/** + * This method returns in which cardinal direction does input point stays + * 1: North + * 2: East + * 3: South + * 4: West + */ +IGeometry.getCardinalDirection = function (slope, slopePrime, line) { + if (slope > slopePrime) { + return line; + } else { + return 1 + line % 4; } - if (result && !skipCtor) { - var objCtor = object.constructor, - othCtor = other.constructor; +}; + +/** + * This method calculates the intersection of the two lines defined by + * point pairs (s1,s2) and (f1,f2). + */ +IGeometry.getIntersection = function (s1, s2, f1, f2) { + if (f2 == null) { + return this.getIntersection2(s1, s2, f1); + } + + var x1 = s1.x; + var y1 = s1.y; + var x2 = s2.x; + var y2 = s2.y; + var x3 = f1.x; + var y3 = f1.y; + var x4 = f2.x; + var y4 = f2.y; + var x = void 0, + y = void 0; // intersection point + var a1 = void 0, + a2 = void 0, + b1 = void 0, + b2 = void 0, + c1 = void 0, + c2 = void 0; // coefficients of line eqns. + var denom = void 0; - // Non `Object` object instances with different constructors are not equal. - if (objCtor != othCtor && - ('constructor' in object && 'constructor' in other) && - !(typeof objCtor == 'function' && objCtor instanceof objCtor && - typeof othCtor == 'function' && othCtor instanceof othCtor)) { - result = false; - } - } - stack['delete'](object); - stack['delete'](other); - return result; -} + a1 = y2 - y1; + b1 = x1 - x2; + c1 = x2 * y1 - x1 * y2; // { a1*x + b1*y + c1 = 0 is line 1 } -module.exports = equalObjects; + a2 = y4 - y3; + b2 = x3 - x4; + c2 = x4 * y3 - x3 * y4; // { a2*x + b2*y + c2 = 0 is line 2 } + denom = a1 * b2 - a2 * b1; -/***/ }), + if (denom === 0) { + return null; + } -/***/ "./node_modules/lodash/_flatRest.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_flatRest.js ***! - \******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + x = (b1 * c2 - b2 * c1) / denom; + y = (a2 * c1 - a1 * c2) / denom; -var flatten = __webpack_require__(/*! ./flatten */ "./node_modules/lodash/flatten.js"), - overRest = __webpack_require__(/*! ./_overRest */ "./node_modules/lodash/_overRest.js"), - setToString = __webpack_require__(/*! ./_setToString */ "./node_modules/lodash/_setToString.js"); + return new Point(x, y); +}; /** - * A specialized version of `baseRest` which flattens the rest array. - * - * @private - * @param {Function} func The function to apply a rest parameter to. - * @returns {Function} Returns the new function. + * This method finds and returns the angle of the vector from the + x-axis + * in clockwise direction (compatible w/ Java coordinate system!). */ -function flatRest(func) { - return setToString(overRest(func, undefined, flatten), func + ''); -} +IGeometry.angleOfVector = function (Cx, Cy, Nx, Ny) { + var C_angle = void 0; -module.exports = flatRest; + if (Cx !== Nx) { + C_angle = Math.atan((Ny - Cy) / (Nx - Cx)); + if (Nx < Cx) { + C_angle += Math.PI; + } else if (Ny < Cy) { + C_angle += this.TWO_PI; + } + } else if (Ny < Cy) { + C_angle = this.ONE_AND_HALF_PI; // 270 degrees + } else { + C_angle = this.HALF_PI; // 90 degrees + } -/***/ }), + return C_angle; +}; -/***/ "./node_modules/lodash/_freeGlobal.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_freeGlobal.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +/** + * This method checks whether the given two line segments (one with point + * p1 and p2, the other with point p3 and p4) intersect at a point other + * than these points. + */ +IGeometry.doIntersect = function (p1, p2, p3, p4) { + var a = p1.x; + var b = p1.y; + var c = p2.x; + var d = p2.y; + var p = p3.x; + var q = p3.y; + var r = p4.x; + var s = p4.y; + var det = (c - a) * (s - q) - (r - p) * (d - b); -/** Detect free variable `global` from Node.js. */ -var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g; + if (det === 0) { + return false; + } else { + var lambda = ((s - q) * (r - a) + (p - r) * (s - b)) / det; + var gamma = ((b - d) * (r - a) + (c - a) * (s - b)) / det; + return 0 < lambda && lambda < 1 && 0 < gamma && gamma < 1; + } +}; -module.exports = freeGlobal; +/** + * This method checks and calculates the intersection of + * a line segment and a circle. + */ +IGeometry.findCircleLineIntersections = function (Ex, Ey, Lx, Ly, Cx, Cy, r) { + // E is the starting point of the ray, + // L is the end point of the ray, + // C is the center of sphere you're testing against + // r is the radius of that sphere -/***/ }), + // Compute: + // d = L - E ( Direction vector of ray, from start to end ) + // f = E - C ( Vector from center sphere to ray start ) -/***/ "./node_modules/lodash/_getAllKeys.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_getAllKeys.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // Then the intersection is found by.. + // P = E + t * d + // This is a parametric equation: + // Px = Ex + tdx + // Py = Ey + tdy -var baseGetAllKeys = __webpack_require__(/*! ./_baseGetAllKeys */ "./node_modules/lodash/_baseGetAllKeys.js"), - getSymbols = __webpack_require__(/*! ./_getSymbols */ "./node_modules/lodash/_getSymbols.js"), - keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); + // get a, b, c values + var a = (Lx - Ex) * (Lx - Ex) + (Ly - Ey) * (Ly - Ey); + var b = 2 * ((Ex - Cx) * (Lx - Ex) + (Ey - Cy) * (Ly - Ey)); + var c = (Ex - Cx) * (Ex - Cx) + (Ey - Cy) * (Ey - Cy) - r * r; + // get discriminant + var disc = b * b - 4 * a * c; + if (disc >= 0) { + // insert into quadratic formula + var t1 = (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a); + var t2 = (-b - Math.sqrt(b * b - 4 * a * c)) / (2 * a); + var intersections = null; + if (t1 >= 0 && t1 <= 1) { + // t1 is the intersection, and it's closer than t2 + // (since t1 uses -b - discriminant) + // Impale, Poke + return [t1]; + } + + // here t1 didn't intersect so we are either started + // inside the sphere or completely past it + if (t2 >= 0 && t2 <= 1) { + // ExitWound + return [t2]; + } + + return intersections; + } else return null; +}; + +// ----------------------------------------------------------------------------- +// Section: Class Constants +// ----------------------------------------------------------------------------- /** - * Creates an array of own enumerable property names and symbols of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names and symbols. + * Some useful pre-calculated constants */ -function getAllKeys(object) { - return baseGetAllKeys(object, keys, getSymbols); -} - -module.exports = getAllKeys; +IGeometry.HALF_PI = 0.5 * Math.PI; +IGeometry.ONE_AND_HALF_PI = 1.5 * Math.PI; +IGeometry.TWO_PI = 2.0 * Math.PI; +IGeometry.THREE_PI = 3.0 * Math.PI; +module.exports = IGeometry; /***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { -/***/ "./node_modules/lodash/_getAllKeysIn.js": -/*!**********************************************!*\ - !*** ./node_modules/lodash/_getAllKeysIn.js ***! - \**********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; -var baseGetAllKeys = __webpack_require__(/*! ./_baseGetAllKeys */ "./node_modules/lodash/_baseGetAllKeys.js"), - getSymbolsIn = __webpack_require__(/*! ./_getSymbolsIn */ "./node_modules/lodash/_getSymbolsIn.js"), - keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js"); + +function IMath() {} /** - * Creates an array of own and inherited enumerable property names and - * symbols of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names and symbols. + * This method returns the sign of the input value. */ -function getAllKeysIn(object) { - return baseGetAllKeys(object, keysIn, getSymbolsIn); -} +IMath.sign = function (value) { + if (value > 0) { + return 1; + } else if (value < 0) { + return -1; + } else { + return 0; + } +}; -module.exports = getAllKeysIn; +IMath.floor = function (value) { + return value < 0 ? Math.ceil(value) : Math.floor(value); +}; +IMath.ceil = function (value) { + return value < 0 ? Math.floor(value) : Math.ceil(value); +}; + +module.exports = IMath; /***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { -/***/ "./node_modules/lodash/_getMapData.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_getMapData.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; -var isKeyable = __webpack_require__(/*! ./_isKeyable */ "./node_modules/lodash/_isKeyable.js"); -/** - * Gets the data for `map`. - * - * @private - * @param {Object} map The map to query. - * @param {string} key The reference key. - * @returns {*} Returns the map data. - */ -function getMapData(map, key) { - var data = map.__data__; - return isKeyable(key) - ? data[typeof key == 'string' ? 'string' : 'hash'] - : data.map; -} +function Integer() {} -module.exports = getMapData; +Integer.MAX_VALUE = 2147483647; +Integer.MIN_VALUE = -2147483648; +module.exports = Integer; /***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { -/***/ "./node_modules/lodash/_getMatchData.js": -/*!**********************************************!*\ - !*** ./node_modules/lodash/_getMatchData.js ***! - \**********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; -var isStrictComparable = __webpack_require__(/*! ./_isStrictComparable */ "./node_modules/lodash/_isStrictComparable.js"), - keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); -/** - * Gets the property names, values, and compare flags of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the match data of `object`. - */ -function getMatchData(object) { - var result = keys(object), - length = result.length; +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - while (length--) { - var key = result[length], - value = object[key]; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - result[length] = [key, value, isStrictComparable(value)]; +var nodeFrom = function nodeFrom(value) { + return { value: value, next: null, prev: null }; +}; + +var add = function add(prev, node, next, list) { + if (prev !== null) { + prev.next = node; + } else { + list.head = node; } - return result; -} -module.exports = getMatchData; + if (next !== null) { + next.prev = node; + } else { + list.tail = node; + } + node.prev = prev; + node.next = next; -/***/ }), + list.length++; -/***/ "./node_modules/lodash/_getNative.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_getNative.js ***! - \*******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + return node; +}; -var baseIsNative = __webpack_require__(/*! ./_baseIsNative */ "./node_modules/lodash/_baseIsNative.js"), - getValue = __webpack_require__(/*! ./_getValue */ "./node_modules/lodash/_getValue.js"); +var _remove = function _remove(node, list) { + var prev = node.prev, + next = node.next; -/** - * Gets the native function at `key` of `object`. - * - * @private - * @param {Object} object The object to query. - * @param {string} key The key of the method to get. - * @returns {*} Returns the function if it's native, else `undefined`. - */ -function getNative(object, key) { - var value = getValue(object, key); - return baseIsNative(value) ? value : undefined; -} -module.exports = getNative; + if (prev !== null) { + prev.next = next; + } else { + list.head = next; + } + if (next !== null) { + next.prev = prev; + } else { + list.tail = prev; + } -/***/ }), + node.prev = node.next = null; -/***/ "./node_modules/lodash/_getPrototype.js": -/*!**********************************************!*\ - !*** ./node_modules/lodash/_getPrototype.js ***! - \**********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + list.length--; -var overArg = __webpack_require__(/*! ./_overArg */ "./node_modules/lodash/_overArg.js"); + return node; +}; -/** Built-in value references. */ -var getPrototype = overArg(Object.getPrototypeOf, Object); +var LinkedList = function () { + function LinkedList(vals) { + var _this = this; -module.exports = getPrototype; + _classCallCheck(this, LinkedList); + this.length = 0; + this.head = null; + this.tail = null; -/***/ }), + if (vals != null) { + vals.forEach(function (v) { + return _this.push(v); + }); + } + } -/***/ "./node_modules/lodash/_getRawTag.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_getRawTag.js ***! - \*******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + _createClass(LinkedList, [{ + key: "size", + value: function size() { + return this.length; + } + }, { + key: "insertBefore", + value: function insertBefore(val, otherNode) { + return add(otherNode.prev, nodeFrom(val), otherNode, this); + } + }, { + key: "insertAfter", + value: function insertAfter(val, otherNode) { + return add(otherNode, nodeFrom(val), otherNode.next, this); + } + }, { + key: "insertNodeBefore", + value: function insertNodeBefore(newNode, otherNode) { + return add(otherNode.prev, newNode, otherNode, this); + } + }, { + key: "insertNodeAfter", + value: function insertNodeAfter(newNode, otherNode) { + return add(otherNode, newNode, otherNode.next, this); + } + }, { + key: "push", + value: function push(val) { + return add(this.tail, nodeFrom(val), null, this); + } + }, { + key: "unshift", + value: function unshift(val) { + return add(null, nodeFrom(val), this.head, this); + } + }, { + key: "remove", + value: function remove(node) { + return _remove(node, this); + } + }, { + key: "pop", + value: function pop() { + return _remove(this.tail, this).value; + } + }, { + key: "popNode", + value: function popNode() { + return _remove(this.tail, this); + } + }, { + key: "shift", + value: function shift() { + return _remove(this.head, this).value; + } + }, { + key: "shiftNode", + value: function shiftNode() { + return _remove(this.head, this); + } + }, { + key: "get_object_at", + value: function get_object_at(index) { + if (index <= this.length()) { + var i = 1; + var current = this.head; + while (i < index) { + current = current.next; + i++; + } + return current.value; + } + } + }, { + key: "set_object_at", + value: function set_object_at(index, value) { + if (index <= this.length()) { + var i = 1; + var current = this.head; + while (i < index) { + current = current.next; + i++; + } + current.value = value; + } + } + }]); -var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"); + return LinkedList; +}(); -/** Used for built-in method references. */ -var objectProto = Object.prototype; +module.exports = LinkedList; -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { -/** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ -var nativeObjectToString = objectProto.toString; +"use strict"; -/** Built-in value references. */ -var symToStringTag = Symbol ? Symbol.toStringTag : undefined; -/** - * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the raw `toStringTag`. +/* + *This class is the javascript implementation of the Point.java class in jdk */ -function getRawTag(value) { - var isOwn = hasOwnProperty.call(value, symToStringTag), - tag = value[symToStringTag]; +function Point(x, y, p) { + this.x = null; + this.y = null; + if (x == null && y == null && p == null) { + this.x = 0; + this.y = 0; + } else if (typeof x == 'number' && typeof y == 'number' && p == null) { + this.x = x; + this.y = y; + } else if (x.constructor.name == 'Point' && y == null && p == null) { + p = x; + this.x = p.x; + this.y = p.y; + } +} - try { - value[symToStringTag] = undefined; - var unmasked = true; - } catch (e) {} +Point.prototype.getX = function () { + return this.x; +}; - var result = nativeObjectToString.call(value); - if (unmasked) { - if (isOwn) { - value[symToStringTag] = tag; +Point.prototype.getY = function () { + return this.y; +}; + +Point.prototype.getLocation = function () { + return new Point(this.x, this.y); +}; + +Point.prototype.setLocation = function (x, y, p) { + if (x.constructor.name == 'Point' && y == null && p == null) { + p = x; + this.setLocation(p.x, p.y); + } else if (typeof x == 'number' && typeof y == 'number' && p == null) { + //if both parameters are integer just move (x,y) location + if (parseInt(x) == x && parseInt(y) == y) { + this.move(x, y); } else { - delete value[symToStringTag]; + this.x = Math.floor(x + 0.5); + this.y = Math.floor(y + 0.5); } } - return result; -} +}; -module.exports = getRawTag; +Point.prototype.move = function (x, y) { + this.x = x; + this.y = y; +}; +Point.prototype.translate = function (dx, dy) { + this.x += dx; + this.y += dy; +}; -/***/ }), +Point.prototype.equals = function (obj) { + if (obj.constructor.name == "Point") { + var pt = obj; + return this.x == pt.x && this.y == pt.y; + } + return this == obj; +}; -/***/ "./node_modules/lodash/_getSymbols.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_getSymbols.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +Point.prototype.toString = function () { + return new Point().constructor.name + "[x=" + this.x + ",y=" + this.y + "]"; +}; -var arrayFilter = __webpack_require__(/*! ./_arrayFilter */ "./node_modules/lodash/_arrayFilter.js"), - stubArray = __webpack_require__(/*! ./stubArray */ "./node_modules/lodash/stubArray.js"); +module.exports = Point; -/** Used for built-in method references. */ -var objectProto = Object.prototype; +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { -/** Built-in value references. */ -var propertyIsEnumerable = objectProto.propertyIsEnumerable; +"use strict"; -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeGetSymbols = Object.getOwnPropertySymbols; -/** - * Creates an array of the own enumerable symbols of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of symbols. - */ -var getSymbols = !nativeGetSymbols ? stubArray : function(object) { - if (object == null) { - return []; - } - object = Object(object); - return arrayFilter(nativeGetSymbols(object), function(symbol) { - return propertyIsEnumerable.call(object, symbol); - }); -}; +function RectangleD(x, y, width, height) { + this.x = 0; + this.y = 0; + this.width = 0; + this.height = 0; -module.exports = getSymbols; + if (x != null && y != null && width != null && height != null) { + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } +} +RectangleD.prototype.getX = function () { + return this.x; +}; -/***/ }), +RectangleD.prototype.setX = function (x) { + this.x = x; +}; -/***/ "./node_modules/lodash/_getSymbolsIn.js": -/*!**********************************************!*\ - !*** ./node_modules/lodash/_getSymbolsIn.js ***! - \**********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +RectangleD.prototype.getY = function () { + return this.y; +}; -var arrayPush = __webpack_require__(/*! ./_arrayPush */ "./node_modules/lodash/_arrayPush.js"), - getPrototype = __webpack_require__(/*! ./_getPrototype */ "./node_modules/lodash/_getPrototype.js"), - getSymbols = __webpack_require__(/*! ./_getSymbols */ "./node_modules/lodash/_getSymbols.js"), - stubArray = __webpack_require__(/*! ./stubArray */ "./node_modules/lodash/stubArray.js"); +RectangleD.prototype.setY = function (y) { + this.y = y; +}; -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeGetSymbols = Object.getOwnPropertySymbols; +RectangleD.prototype.getWidth = function () { + return this.width; +}; -/** - * Creates an array of the own and inherited enumerable symbols of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of symbols. - */ -var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { - var result = []; - while (object) { - arrayPush(result, getSymbols(object)); - object = getPrototype(object); - } - return result; +RectangleD.prototype.setWidth = function (width) { + this.width = width; }; -module.exports = getSymbolsIn; +RectangleD.prototype.getHeight = function () { + return this.height; +}; +RectangleD.prototype.setHeight = function (height) { + this.height = height; +}; -/***/ }), +RectangleD.prototype.getRight = function () { + return this.x + this.width; +}; -/***/ "./node_modules/lodash/_getTag.js": -/*!****************************************!*\ - !*** ./node_modules/lodash/_getTag.js ***! - \****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +RectangleD.prototype.getBottom = function () { + return this.y + this.height; +}; -var DataView = __webpack_require__(/*! ./_DataView */ "./node_modules/lodash/_DataView.js"), - Map = __webpack_require__(/*! ./_Map */ "./node_modules/lodash/_Map.js"), - Promise = __webpack_require__(/*! ./_Promise */ "./node_modules/lodash/_Promise.js"), - Set = __webpack_require__(/*! ./_Set */ "./node_modules/lodash/_Set.js"), - WeakMap = __webpack_require__(/*! ./_WeakMap */ "./node_modules/lodash/_WeakMap.js"), - baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), - toSource = __webpack_require__(/*! ./_toSource */ "./node_modules/lodash/_toSource.js"); +RectangleD.prototype.intersects = function (a) { + if (this.getRight() < a.x) { + return false; + } -/** `Object#toString` result references. */ -var mapTag = '[object Map]', - objectTag = '[object Object]', - promiseTag = '[object Promise]', - setTag = '[object Set]', - weakMapTag = '[object WeakMap]'; + if (this.getBottom() < a.y) { + return false; + } -var dataViewTag = '[object DataView]'; + if (a.getRight() < this.x) { + return false; + } -/** Used to detect maps, sets, and weakmaps. */ -var dataViewCtorString = toSource(DataView), - mapCtorString = toSource(Map), - promiseCtorString = toSource(Promise), - setCtorString = toSource(Set), - weakMapCtorString = toSource(WeakMap); + if (a.getBottom() < this.y) { + return false; + } -/** - * Gets the `toStringTag` of `value`. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the `toStringTag`. - */ -var getTag = baseGetTag; + return true; +}; -// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. -if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || - (Map && getTag(new Map) != mapTag) || - (Promise && getTag(Promise.resolve()) != promiseTag) || - (Set && getTag(new Set) != setTag) || - (WeakMap && getTag(new WeakMap) != weakMapTag)) { - getTag = function(value) { - var result = baseGetTag(value), - Ctor = result == objectTag ? value.constructor : undefined, - ctorString = Ctor ? toSource(Ctor) : ''; +RectangleD.prototype.getCenterX = function () { + return this.x + this.width / 2; +}; - if (ctorString) { - switch (ctorString) { - case dataViewCtorString: return dataViewTag; - case mapCtorString: return mapTag; - case promiseCtorString: return promiseTag; - case setCtorString: return setTag; - case weakMapCtorString: return weakMapTag; - } - } - return result; - }; -} +RectangleD.prototype.getMinX = function () { + return this.getX(); +}; -module.exports = getTag; +RectangleD.prototype.getMaxX = function () { + return this.getX() + this.width; +}; +RectangleD.prototype.getCenterY = function () { + return this.y + this.height / 2; +}; -/***/ }), +RectangleD.prototype.getMinY = function () { + return this.getY(); +}; -/***/ "./node_modules/lodash/_getValue.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_getValue.js ***! - \******************************************/ -/***/ (function(module) { +RectangleD.prototype.getMaxY = function () { + return this.getY() + this.height; +}; -/** - * Gets the value at `key` of `object`. - * - * @private - * @param {Object} [object] The object to query. - * @param {string} key The key of the property to get. - * @returns {*} Returns the property value. - */ -function getValue(object, key) { - return object == null ? undefined : object[key]; -} +RectangleD.prototype.getWidthHalf = function () { + return this.width / 2; +}; -module.exports = getValue; +RectangleD.prototype.getHeightHalf = function () { + return this.height / 2; +}; +module.exports = RectangleD; /***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { -/***/ "./node_modules/lodash/_hasPath.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/_hasPath.js ***! - \*****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; -var castPath = __webpack_require__(/*! ./_castPath */ "./node_modules/lodash/_castPath.js"), - isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"), - isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), - isIndex = __webpack_require__(/*! ./_isIndex */ "./node_modules/lodash/_isIndex.js"), - isLength = __webpack_require__(/*! ./isLength */ "./node_modules/lodash/isLength.js"), - toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js"); -/** - * Checks if `path` exists on `object`. - * - * @private - * @param {Object} object The object to query. - * @param {Array|string} path The path to check. - * @param {Function} hasFunc The function to check properties. - * @returns {boolean} Returns `true` if `path` exists, else `false`. - */ -function hasPath(object, path, hasFunc) { - path = castPath(path, object); +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - var index = -1, - length = path.length, - result = false; +function UniqueIDGeneretor() {} - while (++index < length) { - var key = toKey(path[index]); - if (!(result = object != null && hasFunc(object, key))) { - break; - } - object = object[key]; +UniqueIDGeneretor.lastID = 0; + +UniqueIDGeneretor.createID = function (obj) { + if (UniqueIDGeneretor.isPrimitive(obj)) { + return obj; } - if (result || ++index != length) { - return result; + if (obj.uniqueID != null) { + return obj.uniqueID; } - length = object == null ? 0 : object.length; - return !!length && isLength(length) && isIndex(key, length) && - (isArray(object) || isArguments(object)); -} + obj.uniqueID = UniqueIDGeneretor.getString(); + UniqueIDGeneretor.lastID++; + return obj.uniqueID; +}; -module.exports = hasPath; +UniqueIDGeneretor.getString = function (id) { + if (id == null) id = UniqueIDGeneretor.lastID; + return "Object#" + id + ""; +}; + +UniqueIDGeneretor.isPrimitive = function (arg) { + var type = typeof arg === "undefined" ? "undefined" : _typeof(arg); + return arg == null || type != "object" && type != "function"; +}; +module.exports = UniqueIDGeneretor; /***/ }), +/* 15 */ +/***/ (function(module, exports, __nested_webpack_require_66321__) { -/***/ "./node_modules/lodash/_hasUnicode.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_hasUnicode.js ***! - \********************************************/ -/***/ (function(module) { +"use strict"; -/** Used to compose unicode character classes. */ -var rsAstralRange = '\\ud800-\\udfff', - rsComboMarksRange = '\\u0300-\\u036f', - reComboHalfMarksRange = '\\ufe20-\\ufe2f', - rsComboSymbolsRange = '\\u20d0-\\u20ff', - rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, - rsVarRange = '\\ufe0e\\ufe0f'; -/** Used to compose unicode capture groups. */ -var rsZWJ = '\\u200d'; +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } -/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ -var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']'); +var LayoutConstants = __nested_webpack_require_66321__(0); +var LGraphManager = __nested_webpack_require_66321__(7); +var LNode = __nested_webpack_require_66321__(3); +var LEdge = __nested_webpack_require_66321__(1); +var LGraph = __nested_webpack_require_66321__(6); +var PointD = __nested_webpack_require_66321__(5); +var Transform = __nested_webpack_require_66321__(17); +var Emitter = __nested_webpack_require_66321__(29); -/** - * Checks if `string` contains Unicode symbols. - * - * @private - * @param {string} string The string to inspect. - * @returns {boolean} Returns `true` if a symbol is found, else `false`. - */ -function hasUnicode(string) { - return reHasUnicode.test(string); -} +function Layout(isRemoteUse) { + Emitter.call(this); -module.exports = hasUnicode; + //Layout Quality: 0:draft, 1:default, 2:proof + this.layoutQuality = LayoutConstants.QUALITY; + //Whether layout should create bendpoints as needed or not + this.createBendsAsNeeded = LayoutConstants.DEFAULT_CREATE_BENDS_AS_NEEDED; + //Whether layout should be incremental or not + this.incremental = LayoutConstants.DEFAULT_INCREMENTAL; + //Whether we animate from before to after layout node positions + this.animationOnLayout = LayoutConstants.DEFAULT_ANIMATION_ON_LAYOUT; + //Whether we animate the layout process or not + this.animationDuringLayout = LayoutConstants.DEFAULT_ANIMATION_DURING_LAYOUT; + //Number iterations that should be done between two successive animations + this.animationPeriod = LayoutConstants.DEFAULT_ANIMATION_PERIOD; + /** + * Whether or not leaf nodes (non-compound nodes) are of uniform sizes. When + * they are, both spring and repulsion forces between two leaf nodes can be + * calculated without the expensive clipping point calculations, resulting + * in major speed-up. + */ + this.uniformLeafNodeSizes = LayoutConstants.DEFAULT_UNIFORM_LEAF_NODE_SIZES; + /** + * This is used for creation of bendpoints by using dummy nodes and edges. + * Maps an LEdge to its dummy bendpoint path. + */ + this.edgeToDummyNodes = new Map(); + this.graphManager = new LGraphManager(this); + this.isLayoutFinished = false; + this.isSubLayout = false; + this.isRemoteUse = false; + if (isRemoteUse != null) { + this.isRemoteUse = isRemoteUse; + } +} -/***/ }), +Layout.RANDOM_SEED = 1; -/***/ "./node_modules/lodash/_hashClear.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_hashClear.js ***! - \*******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +Layout.prototype = Object.create(Emitter.prototype); -var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); +Layout.prototype.getGraphManager = function () { + return this.graphManager; +}; -/** - * Removes all key-value entries from the hash. - * - * @private - * @name clear - * @memberOf Hash - */ -function hashClear() { - this.__data__ = nativeCreate ? nativeCreate(null) : {}; - this.size = 0; -} +Layout.prototype.getAllNodes = function () { + return this.graphManager.getAllNodes(); +}; -module.exports = hashClear; +Layout.prototype.getAllEdges = function () { + return this.graphManager.getAllEdges(); +}; +Layout.prototype.getAllNodesToApplyGravitation = function () { + return this.graphManager.getAllNodesToApplyGravitation(); +}; -/***/ }), +Layout.prototype.newGraphManager = function () { + var gm = new LGraphManager(this); + this.graphManager = gm; + return gm; +}; -/***/ "./node_modules/lodash/_hashDelete.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_hashDelete.js ***! - \********************************************/ -/***/ (function(module) { +Layout.prototype.newGraph = function (vGraph) { + return new LGraph(null, this.graphManager, vGraph); +}; -/** - * Removes `key` and its value from the hash. - * - * @private - * @name delete - * @memberOf Hash - * @param {Object} hash The hash to modify. - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ -function hashDelete(key) { - var result = this.has(key) && delete this.__data__[key]; - this.size -= result ? 1 : 0; - return result; -} +Layout.prototype.newNode = function (vNode) { + return new LNode(this.graphManager, vNode); +}; -module.exports = hashDelete; +Layout.prototype.newEdge = function (vEdge) { + return new LEdge(null, null, vEdge); +}; +Layout.prototype.checkLayoutSuccess = function () { + return this.graphManager.getRoot() == null || this.graphManager.getRoot().getNodes().length == 0 || this.graphManager.includesInvalidEdge(); +}; -/***/ }), +Layout.prototype.runLayout = function () { + this.isLayoutFinished = false; -/***/ "./node_modules/lodash/_hashGet.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/_hashGet.js ***! - \*****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + if (this.tilingPreLayout) { + this.tilingPreLayout(); + } -var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); + this.initParameters(); + var isLayoutSuccessfull; -/** Used to stand-in for `undefined` hash values. */ -var HASH_UNDEFINED = '__lodash_hash_undefined__'; + if (this.checkLayoutSuccess()) { + isLayoutSuccessfull = false; + } else { + isLayoutSuccessfull = this.layout(); + } -/** Used for built-in method references. */ -var objectProto = Object.prototype; + if (LayoutConstants.ANIMATE === 'during') { + // If this is a 'during' layout animation. Layout is not finished yet. + // We need to perform these in index.js when layout is really finished. + return false; + } -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; + if (isLayoutSuccessfull) { + if (!this.isSubLayout) { + this.doPostLayout(); + } + } -/** - * Gets the hash value for `key`. - * - * @private - * @name get - * @memberOf Hash - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ -function hashGet(key) { - var data = this.__data__; - if (nativeCreate) { - var result = data[key]; - return result === HASH_UNDEFINED ? undefined : result; + if (this.tilingPostLayout) { + this.tilingPostLayout(); } - return hasOwnProperty.call(data, key) ? data[key] : undefined; -} -module.exports = hashGet; + this.isLayoutFinished = true; + + return isLayoutSuccessfull; +}; +/** + * This method performs the operations required after layout. + */ +Layout.prototype.doPostLayout = function () { + //assert !isSubLayout : "Should not be called on sub-layout!"; + // Propagate geometric changes to v-level objects + if (!this.incremental) { + this.transform(); + } + this.update(); +}; -/***/ }), +/** + * This method updates the geometry of the target graph according to + * calculated layout. + */ +Layout.prototype.update2 = function () { + // update bend points + if (this.createBendsAsNeeded) { + this.createBendpointsFromDummyNodes(); -/***/ "./node_modules/lodash/_hashHas.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/_hashHas.js ***! - \*****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // reset all edges, since the topology has changed + this.graphManager.resetAllEdges(); + } -var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); + // perform edge, node and root updates if layout is not called + // remotely + if (!this.isRemoteUse) { + // update all edges + var edge; + var allEdges = this.graphManager.getAllEdges(); + for (var i = 0; i < allEdges.length; i++) { + edge = allEdges[i]; + // this.update(edge); + } -/** Used for built-in method references. */ -var objectProto = Object.prototype; + // recursively update nodes + var node; + var nodes = this.graphManager.getRoot().getNodes(); + for (var i = 0; i < nodes.length; i++) { + node = nodes[i]; + // this.update(node); + } -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; + // update root graph + this.update(this.graphManager.getRoot()); + } +}; -/** - * Checks if a hash value for `key` exists. - * - * @private - * @name has - * @memberOf Hash - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function hashHas(key) { - var data = this.__data__; - return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); -} +Layout.prototype.update = function (obj) { + if (obj == null) { + this.update2(); + } else if (obj instanceof LNode) { + var node = obj; + if (node.getChild() != null) { + // since node is compound, recursively update child nodes + var nodes = node.getChild().getNodes(); + for (var i = 0; i < nodes.length; i++) { + update(nodes[i]); + } + } -module.exports = hashHas; + // if the l-level node is associated with a v-level graph object, + // then it is assumed that the v-level node implements the + // interface Updatable. + if (node.vGraphObject != null) { + // cast to Updatable without any type check + var vNode = node.vGraphObject; + // call the update method of the interface + vNode.update(node); + } + } else if (obj instanceof LEdge) { + var edge = obj; + // if the l-level edge is associated with a v-level graph object, + // then it is assumed that the v-level edge implements the + // interface Updatable. -/***/ }), + if (edge.vGraphObject != null) { + // cast to Updatable without any type check + var vEdge = edge.vGraphObject; -/***/ "./node_modules/lodash/_hashSet.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/_hashSet.js ***! - \*****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // call the update method of the interface + vEdge.update(edge); + } + } else if (obj instanceof LGraph) { + var graph = obj; + // if the l-level graph is associated with a v-level graph object, + // then it is assumed that the v-level object implements the + // interface Updatable. -var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); + if (graph.vGraphObject != null) { + // cast to Updatable without any type check + var vGraph = graph.vGraphObject; -/** Used to stand-in for `undefined` hash values. */ -var HASH_UNDEFINED = '__lodash_hash_undefined__'; + // call the update method of the interface + vGraph.update(graph); + } + } +}; -/** - * Sets the hash `key` to `value`. - * - * @private - * @name set - * @memberOf Hash - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the hash instance. +/** + * This method is used to set all layout parameters to default values + * determined at compile time. */ -function hashSet(key, value) { - var data = this.__data__; - this.size += this.has(key) ? 0 : 1; - data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; - return this; -} - -module.exports = hashSet; +Layout.prototype.initParameters = function () { + if (!this.isSubLayout) { + this.layoutQuality = LayoutConstants.QUALITY; + this.animationDuringLayout = LayoutConstants.DEFAULT_ANIMATION_DURING_LAYOUT; + this.animationPeriod = LayoutConstants.DEFAULT_ANIMATION_PERIOD; + this.animationOnLayout = LayoutConstants.DEFAULT_ANIMATION_ON_LAYOUT; + this.incremental = LayoutConstants.DEFAULT_INCREMENTAL; + this.createBendsAsNeeded = LayoutConstants.DEFAULT_CREATE_BENDS_AS_NEEDED; + this.uniformLeafNodeSizes = LayoutConstants.DEFAULT_UNIFORM_LEAF_NODE_SIZES; + } + if (this.animationDuringLayout) { + this.animationOnLayout = false; + } +}; -/***/ }), +Layout.prototype.transform = function (newLeftTop) { + if (newLeftTop == undefined) { + this.transform(new PointD(0, 0)); + } else { + // create a transformation object (from Eclipse to layout). When an + // inverse transform is applied, we get upper-left coordinate of the + // drawing or the root graph at given input coordinate (some margins + // already included in calculation of left-top). -/***/ "./node_modules/lodash/_initCloneArray.js": -/*!************************************************!*\ - !*** ./node_modules/lodash/_initCloneArray.js ***! - \************************************************/ -/***/ (function(module) { + var trans = new Transform(); + var leftTop = this.graphManager.getRoot().updateLeftTop(); -/** Used for built-in method references. */ -var objectProto = Object.prototype; + if (leftTop != null) { + trans.setWorldOrgX(newLeftTop.x); + trans.setWorldOrgY(newLeftTop.y); -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; + trans.setDeviceOrgX(leftTop.x); + trans.setDeviceOrgY(leftTop.y); -/** - * Initializes an array clone. - * - * @private - * @param {Array} array The array to clone. - * @returns {Array} Returns the initialized clone. - */ -function initCloneArray(array) { - var length = array.length, - result = new array.constructor(length); + var nodes = this.getAllNodes(); + var node; - // Add properties assigned by `RegExp#exec`. - if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { - result.index = array.index; - result.input = array.input; + for (var i = 0; i < nodes.length; i++) { + node = nodes[i]; + node.transform(trans); + } + } } - return result; -} - -module.exports = initCloneArray; +}; +Layout.prototype.positionNodesRandomly = function (graph) { -/***/ }), + if (graph == undefined) { + //assert !this.incremental; + this.positionNodesRandomly(this.getGraphManager().getRoot()); + this.getGraphManager().getRoot().updateBounds(true); + } else { + var lNode; + var childGraph; -/***/ "./node_modules/lodash/_initCloneByTag.js": -/*!************************************************!*\ - !*** ./node_modules/lodash/_initCloneByTag.js ***! - \************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + var nodes = graph.getNodes(); + for (var i = 0; i < nodes.length; i++) { + lNode = nodes[i]; + childGraph = lNode.getChild(); -var cloneArrayBuffer = __webpack_require__(/*! ./_cloneArrayBuffer */ "./node_modules/lodash/_cloneArrayBuffer.js"), - cloneDataView = __webpack_require__(/*! ./_cloneDataView */ "./node_modules/lodash/_cloneDataView.js"), - cloneRegExp = __webpack_require__(/*! ./_cloneRegExp */ "./node_modules/lodash/_cloneRegExp.js"), - cloneSymbol = __webpack_require__(/*! ./_cloneSymbol */ "./node_modules/lodash/_cloneSymbol.js"), - cloneTypedArray = __webpack_require__(/*! ./_cloneTypedArray */ "./node_modules/lodash/_cloneTypedArray.js"); + if (childGraph == null) { + lNode.scatter(); + } else if (childGraph.getNodes().length == 0) { + lNode.scatter(); + } else { + this.positionNodesRandomly(childGraph); + lNode.updateBounds(); + } + } + } +}; -/** `Object#toString` result references. */ -var boolTag = '[object Boolean]', - dateTag = '[object Date]', - mapTag = '[object Map]', - numberTag = '[object Number]', - regexpTag = '[object RegExp]', - setTag = '[object Set]', - stringTag = '[object String]', - symbolTag = '[object Symbol]'; +/** + * This method returns a list of trees where each tree is represented as a + * list of l-nodes. The method returns a list of size 0 when: + * - The graph is not flat or + * - One of the component(s) of the graph is not a tree. + */ +Layout.prototype.getFlatForest = function () { + var flatForest = []; + var isForest = true; -var arrayBufferTag = '[object ArrayBuffer]', - dataViewTag = '[object DataView]', - float32Tag = '[object Float32Array]', - float64Tag = '[object Float64Array]', - int8Tag = '[object Int8Array]', - int16Tag = '[object Int16Array]', - int32Tag = '[object Int32Array]', - uint8Tag = '[object Uint8Array]', - uint8ClampedTag = '[object Uint8ClampedArray]', - uint16Tag = '[object Uint16Array]', - uint32Tag = '[object Uint32Array]'; + // Quick reference for all nodes in the graph manager associated with + // this layout. The list should not be changed. + var allNodes = this.graphManager.getRoot().getNodes(); -/** - * Initializes an object clone based on its `toStringTag`. - * - * **Note:** This function only supports cloning values with tags of - * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`. - * - * @private - * @param {Object} object The object to clone. - * @param {string} tag The `toStringTag` of the object to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @returns {Object} Returns the initialized clone. - */ -function initCloneByTag(object, tag, isDeep) { - var Ctor = object.constructor; - switch (tag) { - case arrayBufferTag: - return cloneArrayBuffer(object); + // First be sure that the graph is flat + var isFlat = true; - case boolTag: - case dateTag: - return new Ctor(+object); + for (var i = 0; i < allNodes.length; i++) { + if (allNodes[i].getChild() != null) { + isFlat = false; + } + } - case dataViewTag: - return cloneDataView(object, isDeep); + // Return empty forest if the graph is not flat. + if (!isFlat) { + return flatForest; + } - case float32Tag: case float64Tag: - case int8Tag: case int16Tag: case int32Tag: - case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: - return cloneTypedArray(object, isDeep); + // Run BFS for each component of the graph. - case mapTag: - return new Ctor; + var visited = new Set(); + var toBeVisited = []; + var parents = new Map(); + var unProcessedNodes = []; - case numberTag: - case stringTag: - return new Ctor(object); + unProcessedNodes = unProcessedNodes.concat(allNodes); - case regexpTag: - return cloneRegExp(object); + // Each iteration of this loop finds a component of the graph and + // decides whether it is a tree or not. If it is a tree, adds it to the + // forest and continued with the next component. - case setTag: - return new Ctor; + while (unProcessedNodes.length > 0 && isForest) { + toBeVisited.push(unProcessedNodes[0]); - case symbolTag: - return cloneSymbol(object); - } -} + // Start the BFS. Each iteration of this loop visits a node in a + // BFS manner. + while (toBeVisited.length > 0 && isForest) { + //pool operation + var currentNode = toBeVisited[0]; + toBeVisited.splice(0, 1); + visited.add(currentNode); -module.exports = initCloneByTag; + // Traverse all neighbors of this node + var neighborEdges = currentNode.getEdges(); + for (var i = 0; i < neighborEdges.length; i++) { + var currentNeighbor = neighborEdges[i].getOtherEnd(currentNode); -/***/ }), + // If BFS is not growing from this neighbor. + if (parents.get(currentNode) != currentNeighbor) { + // We haven't previously visited this neighbor. + if (!visited.has(currentNeighbor)) { + toBeVisited.push(currentNeighbor); + parents.set(currentNeighbor, currentNode); + } + // Since we have previously visited this neighbor and + // this neighbor is not parent of currentNode, given + // graph contains a component that is not tree, hence + // it is not a forest. + else { + isForest = false; + break; + } + } + } + } -/***/ "./node_modules/lodash/_initCloneObject.js": -/*!*************************************************!*\ - !*** ./node_modules/lodash/_initCloneObject.js ***! - \*************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // The graph contains a component that is not a tree. Empty + // previously found trees. The method will end. + if (!isForest) { + flatForest = []; + } + // Save currently visited nodes as a tree in our forest. Reset + // visited and parents lists. Continue with the next component of + // the graph, if any. + else { + var temp = [].concat(_toConsumableArray(visited)); + flatForest.push(temp); + //flatForest = flatForest.concat(temp); + //unProcessedNodes.removeAll(visited); + for (var i = 0; i < temp.length; i++) { + var value = temp[i]; + var index = unProcessedNodes.indexOf(value); + if (index > -1) { + unProcessedNodes.splice(index, 1); + } + } + visited = new Set(); + parents = new Map(); + } + } -var baseCreate = __webpack_require__(/*! ./_baseCreate */ "./node_modules/lodash/_baseCreate.js"), - getPrototype = __webpack_require__(/*! ./_getPrototype */ "./node_modules/lodash/_getPrototype.js"), - isPrototype = __webpack_require__(/*! ./_isPrototype */ "./node_modules/lodash/_isPrototype.js"); + return flatForest; +}; -/** - * Initializes an object clone. - * - * @private - * @param {Object} object The object to clone. - * @returns {Object} Returns the initialized clone. +/** + * This method creates dummy nodes (an l-level node with minimal dimensions) + * for the given edge (one per bendpoint). The existing l-level structure + * is updated accordingly. */ -function initCloneObject(object) { - return (typeof object.constructor == 'function' && !isPrototype(object)) - ? baseCreate(getPrototype(object)) - : {}; -} +Layout.prototype.createDummyNodesForBendpoints = function (edge) { + var dummyNodes = []; + var prev = edge.source; -module.exports = initCloneObject; + var graph = this.graphManager.calcLowestCommonAncestor(edge.source, edge.target); + for (var i = 0; i < edge.bendpoints.length; i++) { + // create new dummy node + var dummyNode = this.newNode(null); + dummyNode.setRect(new Point(0, 0), new Dimension(1, 1)); -/***/ }), + graph.add(dummyNode); -/***/ "./node_modules/lodash/_isFlattenable.js": -/*!***********************************************!*\ - !*** ./node_modules/lodash/_isFlattenable.js ***! - \***********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // create new dummy edge between prev and dummy node + var dummyEdge = this.newEdge(null); + this.graphManager.add(dummyEdge, prev, dummyNode); -var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"), - isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"), - isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"); + dummyNodes.add(dummyNode); + prev = dummyNode; + } -/** Built-in value references. */ -var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined; + var dummyEdge = this.newEdge(null); + this.graphManager.add(dummyEdge, prev, edge.target); -/** - * Checks if `value` is a flattenable `arguments` object or array. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. - */ -function isFlattenable(value) { - return isArray(value) || isArguments(value) || - !!(spreadableSymbol && value && value[spreadableSymbol]); -} + this.edgeToDummyNodes.set(edge, dummyNodes); -module.exports = isFlattenable; + // remove real edge from graph manager if it is inter-graph + if (edge.isInterGraph()) { + this.graphManager.remove(edge); + } + // else, remove the edge from the current graph + else { + graph.remove(edge); + } + return dummyNodes; +}; -/***/ }), +/** + * This method creates bendpoints for edges from the dummy nodes + * at l-level. + */ +Layout.prototype.createBendpointsFromDummyNodes = function () { + var edges = []; + edges = edges.concat(this.graphManager.getAllEdges()); + edges = [].concat(_toConsumableArray(this.edgeToDummyNodes.keys())).concat(edges); -/***/ "./node_modules/lodash/_isIndex.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/_isIndex.js ***! - \*****************************************/ -/***/ (function(module) { + for (var k = 0; k < edges.length; k++) { + var lEdge = edges[k]; -/** Used as references for various `Number` constants. */ -var MAX_SAFE_INTEGER = 9007199254740991; + if (lEdge.bendpoints.length > 0) { + var path = this.edgeToDummyNodes.get(lEdge); -/** Used to detect unsigned integer values. */ -var reIsUint = /^(?:0|[1-9]\d*)$/; + for (var i = 0; i < path.length; i++) { + var dummyNode = path[i]; + var p = new PointD(dummyNode.getCenterX(), dummyNode.getCenterY()); -/** - * Checks if `value` is a valid array-like index. - * - * @private - * @param {*} value The value to check. - * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. - * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. - */ -function isIndex(value, length) { - var type = typeof value; - length = length == null ? MAX_SAFE_INTEGER : length; + // update bendpoint's location according to dummy node + var ebp = lEdge.bendpoints.get(i); + ebp.x = p.x; + ebp.y = p.y; + + // remove the dummy node, dummy edges incident with this + // dummy node is also removed (within the remove method) + dummyNode.getOwner().remove(dummyNode); + } - return !!length && - (type == 'number' || - (type != 'symbol' && reIsUint.test(value))) && - (value > -1 && value % 1 == 0 && value < length); -} + // add the real edge to graph + this.graphManager.add(lEdge, lEdge.source, lEdge.target); + } + } +}; -module.exports = isIndex; +Layout.transform = function (sliderValue, defaultValue, minDiv, maxMul) { + if (minDiv != undefined && maxMul != undefined) { + var value = defaultValue; + if (sliderValue <= 50) { + var minValue = defaultValue / minDiv; + value -= (defaultValue - minValue) / 50 * (50 - sliderValue); + } else { + var maxValue = defaultValue * maxMul; + value += (maxValue - defaultValue) / 50 * (sliderValue - 50); + } -/***/ }), + return value; + } else { + var a, b; -/***/ "./node_modules/lodash/_isIterateeCall.js": -/*!************************************************!*\ - !*** ./node_modules/lodash/_isIterateeCall.js ***! - \************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + if (sliderValue <= 50) { + a = 9.0 * defaultValue / 500.0; + b = defaultValue / 10.0; + } else { + a = 9.0 * defaultValue / 50.0; + b = -8 * defaultValue; + } -var eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"), - isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"), - isIndex = __webpack_require__(/*! ./_isIndex */ "./node_modules/lodash/_isIndex.js"), - isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"); + return a * sliderValue + b; + } +}; -/** - * Checks if the given arguments are from an iteratee call. - * - * @private - * @param {*} value The potential iteratee value argument. - * @param {*} index The potential iteratee index or key argument. - * @param {*} object The potential iteratee object argument. - * @returns {boolean} Returns `true` if the arguments are from an iteratee call, - * else `false`. +/** + * This method finds and returns the center of the given nodes, assuming + * that the given nodes form a tree in themselves. */ -function isIterateeCall(value, index, object) { - if (!isObject(object)) { - return false; +Layout.findCenterOfTree = function (nodes) { + var list = []; + list = list.concat(nodes); + + var removedNodes = []; + var remainingDegrees = new Map(); + var foundCenter = false; + var centerNode = null; + + if (list.length == 1 || list.length == 2) { + foundCenter = true; + centerNode = list[0]; } - var type = typeof index; - if (type == 'number' - ? (isArrayLike(object) && isIndex(index, object.length)) - : (type == 'string' && index in object) - ) { - return eq(object[index], value); + + for (var i = 0; i < list.length; i++) { + var node = list[i]; + var degree = node.getNeighborsList().size; + remainingDegrees.set(node, node.getNeighborsList().size); + + if (degree == 1) { + removedNodes.push(node); + } } - return false; -} -module.exports = isIterateeCall; + var tempList = []; + tempList = tempList.concat(removedNodes); + while (!foundCenter) { + var tempList2 = []; + tempList2 = tempList2.concat(tempList); + tempList = []; -/***/ }), + for (var i = 0; i < list.length; i++) { + var node = list[i]; -/***/ "./node_modules/lodash/_isKey.js": -/*!***************************************!*\ - !*** ./node_modules/lodash/_isKey.js ***! - \***************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + var index = list.indexOf(node); + if (index >= 0) { + list.splice(index, 1); + } -var isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), - isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); + var neighbours = node.getNeighborsList(); -/** Used to match property names within property paths. */ -var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, - reIsPlainProp = /^\w*$/; + neighbours.forEach(function (neighbour) { + if (removedNodes.indexOf(neighbour) < 0) { + var otherDegree = remainingDegrees.get(neighbour); + var newDegree = otherDegree - 1; -/** - * Checks if `value` is a property name and not a property path. - * - * @private - * @param {*} value The value to check. - * @param {Object} [object] The object to query keys on. - * @returns {boolean} Returns `true` if `value` is a property name, else `false`. - */ -function isKey(value, object) { - if (isArray(value)) { - return false; - } - var type = typeof value; - if (type == 'number' || type == 'symbol' || type == 'boolean' || - value == null || isSymbol(value)) { - return true; - } - return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || - (object != null && value in Object(object)); -} + if (newDegree == 1) { + tempList.push(neighbour); + } -module.exports = isKey; + remainingDegrees.set(neighbour, newDegree); + } + }); + } + removedNodes = removedNodes.concat(tempList); -/***/ }), + if (list.length == 1 || list.length == 2) { + foundCenter = true; + centerNode = list[0]; + } + } -/***/ "./node_modules/lodash/_isKeyable.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_isKeyable.js ***! - \*******************************************/ -/***/ (function(module) { + return centerNode; +}; -/** - * Checks if `value` is suitable for use as unique object key. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is suitable, else `false`. +/** + * During the coarsening process, this layout may be referenced by two graph managers + * this setter function grants access to change the currently being used graph manager */ -function isKeyable(value) { - var type = typeof value; - return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') - ? (value !== '__proto__') - : (value === null); -} - -module.exports = isKeyable; +Layout.prototype.setGraphManager = function (gm) { + this.graphManager = gm; +}; +module.exports = Layout; /***/ }), +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { -/***/ "./node_modules/lodash/_isMasked.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_isMasked.js ***! - \******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var coreJsData = __webpack_require__(/*! ./_coreJsData */ "./node_modules/lodash/_coreJsData.js"); +"use strict"; -/** Used to detect methods masquerading as native. */ -var maskSrcKey = (function() { - var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); - return uid ? ('Symbol(src)_1.' + uid) : ''; -}()); -/** - * Checks if `func` has its source masked. - * - * @private - * @param {Function} func The function to check. - * @returns {boolean} Returns `true` if `func` is masked, else `false`. - */ -function isMasked(func) { - return !!maskSrcKey && (maskSrcKey in func); -} +function RandomSeed() {} +// adapted from: https://stackoverflow.com/a/19303725 +RandomSeed.seed = 1; +RandomSeed.x = 0; -module.exports = isMasked; +RandomSeed.nextDouble = function () { + RandomSeed.x = Math.sin(RandomSeed.seed++) * 10000; + return RandomSeed.x - Math.floor(RandomSeed.x); +}; +module.exports = RandomSeed; /***/ }), +/* 17 */ +/***/ (function(module, exports, __nested_webpack_require_84109__) { -/***/ "./node_modules/lodash/_isPrototype.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_isPrototype.js ***! - \*********************************************/ -/***/ (function(module) { +"use strict"; -/** Used for built-in method references. */ -var objectProto = Object.prototype; -/** - * Checks if `value` is likely a prototype object. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. - */ -function isPrototype(value) { - var Ctor = value && value.constructor, - proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; +var PointD = __nested_webpack_require_84109__(5); - return value === proto; +function Transform(x, y) { + this.lworldOrgX = 0.0; + this.lworldOrgY = 0.0; + this.ldeviceOrgX = 0.0; + this.ldeviceOrgY = 0.0; + this.lworldExtX = 1.0; + this.lworldExtY = 1.0; + this.ldeviceExtX = 1.0; + this.ldeviceExtY = 1.0; } -module.exports = isPrototype; +Transform.prototype.getWorldOrgX = function () { + return this.lworldOrgX; +}; +Transform.prototype.setWorldOrgX = function (wox) { + this.lworldOrgX = wox; +}; -/***/ }), +Transform.prototype.getWorldOrgY = function () { + return this.lworldOrgY; +}; -/***/ "./node_modules/lodash/_isStrictComparable.js": -/*!****************************************************!*\ - !*** ./node_modules/lodash/_isStrictComparable.js ***! - \****************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +Transform.prototype.setWorldOrgY = function (woy) { + this.lworldOrgY = woy; +}; -var isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"); +Transform.prototype.getWorldExtX = function () { + return this.lworldExtX; +}; -/** - * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` if suitable for strict - * equality comparisons, else `false`. - */ -function isStrictComparable(value) { - return value === value && !isObject(value); -} +Transform.prototype.setWorldExtX = function (wex) { + this.lworldExtX = wex; +}; -module.exports = isStrictComparable; +Transform.prototype.getWorldExtY = function () { + return this.lworldExtY; +}; +Transform.prototype.setWorldExtY = function (wey) { + this.lworldExtY = wey; +}; -/***/ }), +/* Device related */ -/***/ "./node_modules/lodash/_listCacheClear.js": -/*!************************************************!*\ - !*** ./node_modules/lodash/_listCacheClear.js ***! - \************************************************/ -/***/ (function(module) { +Transform.prototype.getDeviceOrgX = function () { + return this.ldeviceOrgX; +}; -/** - * Removes all key-value entries from the list cache. - * - * @private - * @name clear - * @memberOf ListCache - */ -function listCacheClear() { - this.__data__ = []; - this.size = 0; -} +Transform.prototype.setDeviceOrgX = function (dox) { + this.ldeviceOrgX = dox; +}; -module.exports = listCacheClear; +Transform.prototype.getDeviceOrgY = function () { + return this.ldeviceOrgY; +}; +Transform.prototype.setDeviceOrgY = function (doy) { + this.ldeviceOrgY = doy; +}; -/***/ }), +Transform.prototype.getDeviceExtX = function () { + return this.ldeviceExtX; +}; -/***/ "./node_modules/lodash/_listCacheDelete.js": -/*!*************************************************!*\ - !*** ./node_modules/lodash/_listCacheDelete.js ***! - \*************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +Transform.prototype.setDeviceExtX = function (dex) { + this.ldeviceExtX = dex; +}; -var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js"); +Transform.prototype.getDeviceExtY = function () { + return this.ldeviceExtY; +}; -/** Used for built-in method references. */ -var arrayProto = Array.prototype; +Transform.prototype.setDeviceExtY = function (dey) { + this.ldeviceExtY = dey; +}; -/** Built-in value references. */ -var splice = arrayProto.splice; +Transform.prototype.transformX = function (x) { + var xDevice = 0.0; + var worldExtX = this.lworldExtX; + if (worldExtX != 0.0) { + xDevice = this.ldeviceOrgX + (x - this.lworldOrgX) * this.ldeviceExtX / worldExtX; + } -/** - * Removes `key` and its value from the list cache. - * - * @private - * @name delete - * @memberOf ListCache - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ -function listCacheDelete(key) { - var data = this.__data__, - index = assocIndexOf(data, key); + return xDevice; +}; - if (index < 0) { - return false; - } - var lastIndex = data.length - 1; - if (index == lastIndex) { - data.pop(); - } else { - splice.call(data, index, 1); +Transform.prototype.transformY = function (y) { + var yDevice = 0.0; + var worldExtY = this.lworldExtY; + if (worldExtY != 0.0) { + yDevice = this.ldeviceOrgY + (y - this.lworldOrgY) * this.ldeviceExtY / worldExtY; } - --this.size; - return true; -} -module.exports = listCacheDelete; + return yDevice; +}; +Transform.prototype.inverseTransformX = function (x) { + var xWorld = 0.0; + var deviceExtX = this.ldeviceExtX; + if (deviceExtX != 0.0) { + xWorld = this.lworldOrgX + (x - this.ldeviceOrgX) * this.lworldExtX / deviceExtX; + } -/***/ }), + return xWorld; +}; -/***/ "./node_modules/lodash/_listCacheGet.js": -/*!**********************************************!*\ - !*** ./node_modules/lodash/_listCacheGet.js ***! - \**********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +Transform.prototype.inverseTransformY = function (y) { + var yWorld = 0.0; + var deviceExtY = this.ldeviceExtY; + if (deviceExtY != 0.0) { + yWorld = this.lworldOrgY + (y - this.ldeviceOrgY) * this.lworldExtY / deviceExtY; + } + return yWorld; +}; -var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js"); +Transform.prototype.inverseTransformPoint = function (inPoint) { + var outPoint = new PointD(this.inverseTransformX(inPoint.x), this.inverseTransformY(inPoint.y)); + return outPoint; +}; -/** - * Gets the list cache value for `key`. - * - * @private - * @name get - * @memberOf ListCache - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ -function listCacheGet(key) { - var data = this.__data__, - index = assocIndexOf(data, key); +module.exports = Transform; - return index < 0 ? undefined : data[index][1]; -} +/***/ }), +/* 18 */ +/***/ (function(module, exports, __nested_webpack_require_86996__) { -module.exports = listCacheGet; +"use strict"; -/***/ }), +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } -/***/ "./node_modules/lodash/_listCacheHas.js": -/*!**********************************************!*\ - !*** ./node_modules/lodash/_listCacheHas.js ***! - \**********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var Layout = __nested_webpack_require_86996__(15); +var FDLayoutConstants = __nested_webpack_require_86996__(4); +var LayoutConstants = __nested_webpack_require_86996__(0); +var IGeometry = __nested_webpack_require_86996__(8); +var IMath = __nested_webpack_require_86996__(9); -var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js"); +function FDLayout() { + Layout.call(this); -/** - * Checks if a list cache value for `key` exists. - * - * @private - * @name has - * @memberOf ListCache - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function listCacheHas(key) { - return assocIndexOf(this.__data__, key) > -1; + this.useSmartIdealEdgeLengthCalculation = FDLayoutConstants.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION; + this.gravityConstant = FDLayoutConstants.DEFAULT_GRAVITY_STRENGTH; + this.compoundGravityConstant = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH; + this.gravityRangeFactor = FDLayoutConstants.DEFAULT_GRAVITY_RANGE_FACTOR; + this.compoundGravityRangeFactor = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR; + this.displacementThresholdPerNode = 3.0 * FDLayoutConstants.DEFAULT_EDGE_LENGTH / 100; + this.coolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL; + this.initialCoolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL; + this.totalDisplacement = 0.0; + this.oldTotalDisplacement = 0.0; + this.maxIterations = FDLayoutConstants.MAX_ITERATIONS; } -module.exports = listCacheHas; +FDLayout.prototype = Object.create(Layout.prototype); +for (var prop in Layout) { + FDLayout[prop] = Layout[prop]; +} -/***/ }), +FDLayout.prototype.initParameters = function () { + Layout.prototype.initParameters.call(this, arguments); -/***/ "./node_modules/lodash/_listCacheSet.js": -/*!**********************************************!*\ - !*** ./node_modules/lodash/_listCacheSet.js ***! - \**********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + this.totalIterations = 0; + this.notAnimatedIterations = 0; -var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js"); + this.useFRGridVariant = FDLayoutConstants.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION; -/** - * Sets the list cache `key` to `value`. - * - * @private - * @name set - * @memberOf ListCache - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the list cache instance. - */ -function listCacheSet(key, value) { - var data = this.__data__, - index = assocIndexOf(data, key); + this.grid = []; +}; - if (index < 0) { - ++this.size; - data.push([key, value]); - } else { - data[index][1] = value; - } - return this; -} +FDLayout.prototype.calcIdealEdgeLengths = function () { + var edge; + var originalIdealLength; + var lcaDepth; + var source; + var target; + var sizeOfSourceInLca; + var sizeOfTargetInLca; -module.exports = listCacheSet; + var allEdges = this.getGraphManager().getAllEdges(); + for (var i = 0; i < allEdges.length; i++) { + edge = allEdges[i]; + originalIdealLength = edge.idealLength; -/***/ }), + if (edge.isInterGraph) { + source = edge.getSource(); + target = edge.getTarget(); -/***/ "./node_modules/lodash/_mapCacheClear.js": -/*!***********************************************!*\ - !*** ./node_modules/lodash/_mapCacheClear.js ***! - \***********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + sizeOfSourceInLca = edge.getSourceInLca().getEstimatedSize(); + sizeOfTargetInLca = edge.getTargetInLca().getEstimatedSize(); -var Hash = __webpack_require__(/*! ./_Hash */ "./node_modules/lodash/_Hash.js"), - ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"), - Map = __webpack_require__(/*! ./_Map */ "./node_modules/lodash/_Map.js"); + if (this.useSmartIdealEdgeLengthCalculation) { + edge.idealLength += sizeOfSourceInLca + sizeOfTargetInLca - 2 * LayoutConstants.SIMPLE_NODE_SIZE; + } -/** - * Removes all key-value entries from the map. - * - * @private - * @name clear - * @memberOf MapCache - */ -function mapCacheClear() { - this.size = 0; - this.__data__ = { - 'hash': new Hash, - 'map': new (Map || ListCache), - 'string': new Hash - }; -} + lcaDepth = edge.getLca().getInclusionTreeDepth(); -module.exports = mapCacheClear; + edge.idealLength += originalIdealLength * FDLayoutConstants.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR * (source.getInclusionTreeDepth() + target.getInclusionTreeDepth() - 2 * lcaDepth); + } + } +}; +FDLayout.prototype.initSpringEmbedder = function () { -/***/ }), + var s = this.getAllNodes().length; + if (this.incremental) { + if (s > FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) { + this.coolingFactor = Math.max(this.coolingFactor * FDLayoutConstants.COOLING_ADAPTATION_FACTOR, this.coolingFactor - (s - FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) / (FDLayoutConstants.ADAPTATION_UPPER_NODE_LIMIT - FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) * this.coolingFactor * (1 - FDLayoutConstants.COOLING_ADAPTATION_FACTOR)); + } + this.maxNodeDisplacement = FDLayoutConstants.MAX_NODE_DISPLACEMENT_INCREMENTAL; + } else { + if (s > FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) { + this.coolingFactor = Math.max(FDLayoutConstants.COOLING_ADAPTATION_FACTOR, 1.0 - (s - FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) / (FDLayoutConstants.ADAPTATION_UPPER_NODE_LIMIT - FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) * (1 - FDLayoutConstants.COOLING_ADAPTATION_FACTOR)); + } else { + this.coolingFactor = 1.0; + } + this.initialCoolingFactor = this.coolingFactor; + this.maxNodeDisplacement = FDLayoutConstants.MAX_NODE_DISPLACEMENT; + } -/***/ "./node_modules/lodash/_mapCacheDelete.js": -/*!************************************************!*\ - !*** ./node_modules/lodash/_mapCacheDelete.js ***! - \************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + this.maxIterations = Math.max(this.getAllNodes().length * 5, this.maxIterations); -var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); + // Reassign this attribute by using new constant value + this.displacementThresholdPerNode = 3.0 * FDLayoutConstants.DEFAULT_EDGE_LENGTH / 100; + this.totalDisplacementThreshold = this.displacementThresholdPerNode * this.getAllNodes().length; -/** - * Removes `key` and its value from the map. - * - * @private - * @name delete - * @memberOf MapCache - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ -function mapCacheDelete(key) { - var result = getMapData(this, key)['delete'](key); - this.size -= result ? 1 : 0; - return result; -} + this.repulsionRange = this.calcRepulsionRange(); +}; -module.exports = mapCacheDelete; +FDLayout.prototype.calcSpringForces = function () { + var lEdges = this.getAllEdges(); + var edge; + for (var i = 0; i < lEdges.length; i++) { + edge = lEdges[i]; -/***/ }), + this.calcSpringForce(edge, edge.idealLength); + } +}; -/***/ "./node_modules/lodash/_mapCacheGet.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_mapCacheGet.js ***! - \*********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +FDLayout.prototype.calcRepulsionForces = function () { + var gridUpdateAllowed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + var forceToNodeSurroundingUpdate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; -var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); + var i, j; + var nodeA, nodeB; + var lNodes = this.getAllNodes(); + var processedNodeSet; -/** - * Gets the map value for `key`. - * - * @private - * @name get - * @memberOf MapCache - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ -function mapCacheGet(key) { - return getMapData(this, key).get(key); -} + if (this.useFRGridVariant) { + if (this.totalIterations % FDLayoutConstants.GRID_CALCULATION_CHECK_PERIOD == 1 && gridUpdateAllowed) { + this.updateGrid(); + } -module.exports = mapCacheGet; + processedNodeSet = new Set(); + // calculate repulsion forces between each nodes and its surrounding + for (i = 0; i < lNodes.length; i++) { + nodeA = lNodes[i]; + this.calculateRepulsionForceOfANode(nodeA, processedNodeSet, gridUpdateAllowed, forceToNodeSurroundingUpdate); + processedNodeSet.add(nodeA); + } + } else { + for (i = 0; i < lNodes.length; i++) { + nodeA = lNodes[i]; -/***/ }), + for (j = i + 1; j < lNodes.length; j++) { + nodeB = lNodes[j]; -/***/ "./node_modules/lodash/_mapCacheHas.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_mapCacheHas.js ***! - \*********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // If both nodes are not members of the same graph, skip. + if (nodeA.getOwner() != nodeB.getOwner()) { + continue; + } -var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); + this.calcRepulsionForce(nodeA, nodeB); + } + } + } +}; -/** - * Checks if a map value for `key` exists. - * - * @private - * @name has - * @memberOf MapCache - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function mapCacheHas(key) { - return getMapData(this, key).has(key); -} +FDLayout.prototype.calcGravitationalForces = function () { + var node; + var lNodes = this.getAllNodesToApplyGravitation(); -module.exports = mapCacheHas; + for (var i = 0; i < lNodes.length; i++) { + node = lNodes[i]; + this.calcGravitationalForce(node); + } +}; +FDLayout.prototype.moveNodes = function () { + var lNodes = this.getAllNodes(); + var node; -/***/ }), + for (var i = 0; i < lNodes.length; i++) { + node = lNodes[i]; + node.move(); + } +}; -/***/ "./node_modules/lodash/_mapCacheSet.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_mapCacheSet.js ***! - \*********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +FDLayout.prototype.calcSpringForce = function (edge, idealLength) { + var sourceNode = edge.getSource(); + var targetNode = edge.getTarget(); -var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); + var length; + var springForce; + var springForceX; + var springForceY; -/** - * Sets the map `key` to `value`. - * - * @private - * @name set - * @memberOf MapCache - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the map cache instance. - */ -function mapCacheSet(key, value) { - var data = getMapData(this, key), - size = data.size; + // Update edge length + if (this.uniformLeafNodeSizes && sourceNode.getChild() == null && targetNode.getChild() == null) { + edge.updateLengthSimple(); + } else { + edge.updateLength(); - data.set(key, value); - this.size += data.size == size ? 0 : 1; - return this; -} + if (edge.isOverlapingSourceAndTarget) { + return; + } + } -module.exports = mapCacheSet; + length = edge.getLength(); + if (length == 0) return; -/***/ }), + // Calculate spring forces + springForce = edge.edgeElasticity * (length - idealLength); -/***/ "./node_modules/lodash/_mapToArray.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_mapToArray.js ***! - \********************************************/ -/***/ (function(module) { + // Project force onto x and y axes + springForceX = springForce * (edge.lengthX / length); + springForceY = springForce * (edge.lengthY / length); -/** - * Converts `map` to its key-value pairs. - * - * @private - * @param {Object} map The map to convert. - * @returns {Array} Returns the key-value pairs. - */ -function mapToArray(map) { - var index = -1, - result = Array(map.size); + // Apply forces on the end nodes + sourceNode.springForceX += springForceX; + sourceNode.springForceY += springForceY; + targetNode.springForceX -= springForceX; + targetNode.springForceY -= springForceY; +}; - map.forEach(function(value, key) { - result[++index] = [key, value]; - }); - return result; -} +FDLayout.prototype.calcRepulsionForce = function (nodeA, nodeB) { + var rectA = nodeA.getRect(); + var rectB = nodeB.getRect(); + var overlapAmount = new Array(2); + var clipPoints = new Array(4); + var distanceX; + var distanceY; + var distanceSquared; + var distance; + var repulsionForce; + var repulsionForceX; + var repulsionForceY; -module.exports = mapToArray; + if (rectA.intersects(rectB)) // two nodes overlap + { + // calculate separation amount in x and y directions + IGeometry.calcSeparationAmount(rectA, rectB, overlapAmount, FDLayoutConstants.DEFAULT_EDGE_LENGTH / 2.0); + repulsionForceX = 2 * overlapAmount[0]; + repulsionForceY = 2 * overlapAmount[1]; -/***/ }), + var childrenConstant = nodeA.noOfChildren * nodeB.noOfChildren / (nodeA.noOfChildren + nodeB.noOfChildren); -/***/ "./node_modules/lodash/_matchesStrictComparable.js": -/*!*********************************************************!*\ - !*** ./node_modules/lodash/_matchesStrictComparable.js ***! - \*********************************************************/ -/***/ (function(module) { + // Apply forces on the two nodes + nodeA.repulsionForceX -= childrenConstant * repulsionForceX; + nodeA.repulsionForceY -= childrenConstant * repulsionForceY; + nodeB.repulsionForceX += childrenConstant * repulsionForceX; + nodeB.repulsionForceY += childrenConstant * repulsionForceY; + } else // no overlap + { + // calculate distance -/** - * A specialized version of `matchesProperty` for source values suitable - * for strict equality comparisons, i.e. `===`. - * - * @private - * @param {string} key The key of the property to get. - * @param {*} srcValue The value to match. - * @returns {Function} Returns the new spec function. - */ -function matchesStrictComparable(key, srcValue) { - return function(object) { - if (object == null) { - return false; - } - return object[key] === srcValue && - (srcValue !== undefined || (key in Object(object))); - }; -} + if (this.uniformLeafNodeSizes && nodeA.getChild() == null && nodeB.getChild() == null) // simply base repulsion on distance of node centers + { + distanceX = rectB.getCenterX() - rectA.getCenterX(); + distanceY = rectB.getCenterY() - rectA.getCenterY(); + } else // use clipping points + { + IGeometry.getIntersection(rectA, rectB, clipPoints); -module.exports = matchesStrictComparable; + distanceX = clipPoints[2] - clipPoints[0]; + distanceY = clipPoints[3] - clipPoints[1]; + } + // No repulsion range. FR grid variant should take care of this. + if (Math.abs(distanceX) < FDLayoutConstants.MIN_REPULSION_DIST) { + distanceX = IMath.sign(distanceX) * FDLayoutConstants.MIN_REPULSION_DIST; + } -/***/ }), + if (Math.abs(distanceY) < FDLayoutConstants.MIN_REPULSION_DIST) { + distanceY = IMath.sign(distanceY) * FDLayoutConstants.MIN_REPULSION_DIST; + } -/***/ "./node_modules/lodash/_memoizeCapped.js": -/*!***********************************************!*\ - !*** ./node_modules/lodash/_memoizeCapped.js ***! - \***********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + distanceSquared = distanceX * distanceX + distanceY * distanceY; + distance = Math.sqrt(distanceSquared); -var memoize = __webpack_require__(/*! ./memoize */ "./node_modules/lodash/memoize.js"); + // Here we use half of the nodes' repulsion values for backward compatibility + repulsionForce = (nodeA.nodeRepulsion / 2 + nodeB.nodeRepulsion / 2) * nodeA.noOfChildren * nodeB.noOfChildren / distanceSquared; -/** Used as the maximum memoize cache size. */ -var MAX_MEMOIZE_SIZE = 500; + // Project force onto x and y axes + repulsionForceX = repulsionForce * distanceX / distance; + repulsionForceY = repulsionForce * distanceY / distance; -/** - * A specialized version of `_.memoize` which clears the memoized function's - * cache when it exceeds `MAX_MEMOIZE_SIZE`. - * - * @private - * @param {Function} func The function to have its output memoized. - * @returns {Function} Returns the new memoized function. - */ -function memoizeCapped(func) { - var result = memoize(func, function(key) { - if (cache.size === MAX_MEMOIZE_SIZE) { - cache.clear(); + // Apply forces on the two nodes + nodeA.repulsionForceX -= repulsionForceX; + nodeA.repulsionForceY -= repulsionForceY; + nodeB.repulsionForceX += repulsionForceX; + nodeB.repulsionForceY += repulsionForceY; } - return key; - }); +}; - var cache = result.cache; - return result; -} +FDLayout.prototype.calcGravitationalForce = function (node) { + var ownerGraph; + var ownerCenterX; + var ownerCenterY; + var distanceX; + var distanceY; + var absDistanceX; + var absDistanceY; + var estimatedSize; + ownerGraph = node.getOwner(); -module.exports = memoizeCapped; + ownerCenterX = (ownerGraph.getRight() + ownerGraph.getLeft()) / 2; + ownerCenterY = (ownerGraph.getTop() + ownerGraph.getBottom()) / 2; + distanceX = node.getCenterX() - ownerCenterX; + distanceY = node.getCenterY() - ownerCenterY; + absDistanceX = Math.abs(distanceX) + node.getWidth() / 2; + absDistanceY = Math.abs(distanceY) + node.getHeight() / 2; + if (node.getOwner() == this.graphManager.getRoot()) // in the root graph + { + estimatedSize = ownerGraph.getEstimatedSize() * this.gravityRangeFactor; -/***/ }), + if (absDistanceX > estimatedSize || absDistanceY > estimatedSize) { + node.gravitationForceX = -this.gravityConstant * distanceX; + node.gravitationForceY = -this.gravityConstant * distanceY; + } + } else // inside a compound + { + estimatedSize = ownerGraph.getEstimatedSize() * this.compoundGravityRangeFactor; -/***/ "./node_modules/lodash/_nativeCreate.js": -/*!**********************************************!*\ - !*** ./node_modules/lodash/_nativeCreate.js ***! - \**********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + if (absDistanceX > estimatedSize || absDistanceY > estimatedSize) { + node.gravitationForceX = -this.gravityConstant * distanceX * this.compoundGravityConstant; + node.gravitationForceY = -this.gravityConstant * distanceY * this.compoundGravityConstant; + } + } +}; -var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"); +FDLayout.prototype.isConverged = function () { + var converged; + var oscilating = false; -/* Built-in method references that are verified to be native. */ -var nativeCreate = getNative(Object, 'create'); + if (this.totalIterations > this.maxIterations / 3) { + oscilating = Math.abs(this.totalDisplacement - this.oldTotalDisplacement) < 2; + } -module.exports = nativeCreate; + converged = this.totalDisplacement < this.totalDisplacementThreshold; + this.oldTotalDisplacement = this.totalDisplacement; -/***/ }), + return converged || oscilating; +}; -/***/ "./node_modules/lodash/_nativeKeys.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_nativeKeys.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +FDLayout.prototype.animate = function () { + if (this.animationDuringLayout && !this.isSubLayout) { + if (this.notAnimatedIterations == this.animationPeriod) { + this.update(); + this.notAnimatedIterations = 0; + } else { + this.notAnimatedIterations++; + } + } +}; -var overArg = __webpack_require__(/*! ./_overArg */ "./node_modules/lodash/_overArg.js"); +//This method calculates the number of children (weight) for all nodes +FDLayout.prototype.calcNoOfChildrenForAllNodes = function () { + var node; + var allNodes = this.graphManager.getAllNodes(); -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeKeys = overArg(Object.keys, Object); + for (var i = 0; i < allNodes.length; i++) { + node = allNodes[i]; + node.noOfChildren = node.getNoOfChildren(); + } +}; -module.exports = nativeKeys; +// ----------------------------------------------------------------------------- +// Section: FR-Grid Variant Repulsion Force Calculation +// ----------------------------------------------------------------------------- +FDLayout.prototype.calcGrid = function (graph) { -/***/ }), + var sizeX = 0; + var sizeY = 0; -/***/ "./node_modules/lodash/_nativeKeysIn.js": -/*!**********************************************!*\ - !*** ./node_modules/lodash/_nativeKeysIn.js ***! - \**********************************************/ -/***/ (function(module) { + sizeX = parseInt(Math.ceil((graph.getRight() - graph.getLeft()) / this.repulsionRange)); + sizeY = parseInt(Math.ceil((graph.getBottom() - graph.getTop()) / this.repulsionRange)); -/** - * This function is like - * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) - * except that it includes inherited enumerable properties. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - */ -function nativeKeysIn(object) { - var result = []; - if (object != null) { - for (var key in Object(object)) { - result.push(key); + var grid = new Array(sizeX); + + for (var i = 0; i < sizeX; i++) { + grid[i] = new Array(sizeY); + } + + for (var i = 0; i < sizeX; i++) { + for (var j = 0; j < sizeY; j++) { + grid[i][j] = new Array(); } } - return result; -} -module.exports = nativeKeysIn; + return grid; +}; +FDLayout.prototype.addNodeToGrid = function (v, left, top) { + + var startX = 0; + var finishX = 0; + var startY = 0; + var finishY = 0; + + startX = parseInt(Math.floor((v.getRect().x - left) / this.repulsionRange)); + finishX = parseInt(Math.floor((v.getRect().width + v.getRect().x - left) / this.repulsionRange)); + startY = parseInt(Math.floor((v.getRect().y - top) / this.repulsionRange)); + finishY = parseInt(Math.floor((v.getRect().height + v.getRect().y - top) / this.repulsionRange)); + + for (var i = startX; i <= finishX; i++) { + for (var j = startY; j <= finishY; j++) { + this.grid[i][j].push(v); + v.setGridCoordinates(startX, finishX, startY, finishY); + } + } +}; -/***/ }), +FDLayout.prototype.updateGrid = function () { + var i; + var nodeA; + var lNodes = this.getAllNodes(); -/***/ "./node_modules/lodash/_nodeUtil.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_nodeUtil.js ***! - \******************************************/ -/***/ (function(module, exports, __webpack_require__) { + this.grid = this.calcGrid(this.graphManager.getRoot()); -/* module decorator */ module = __webpack_require__.nmd(module); -var freeGlobal = __webpack_require__(/*! ./_freeGlobal */ "./node_modules/lodash/_freeGlobal.js"); + // put all nodes to proper grid cells + for (i = 0; i < lNodes.length; i++) { + nodeA = lNodes[i]; + this.addNodeToGrid(nodeA, this.graphManager.getRoot().getLeft(), this.graphManager.getRoot().getTop()); + } +}; -/** Detect free variable `exports`. */ -var freeExports = true && exports && !exports.nodeType && exports; +FDLayout.prototype.calculateRepulsionForceOfANode = function (nodeA, processedNodeSet, gridUpdateAllowed, forceToNodeSurroundingUpdate) { -/** Detect free variable `module`. */ -var freeModule = freeExports && "object" == 'object' && module && !module.nodeType && module; + if (this.totalIterations % FDLayoutConstants.GRID_CALCULATION_CHECK_PERIOD == 1 && gridUpdateAllowed || forceToNodeSurroundingUpdate) { + var surrounding = new Set(); + nodeA.surrounding = new Array(); + var nodeB; + var grid = this.grid; -/** Detect the popular CommonJS extension `module.exports`. */ -var moduleExports = freeModule && freeModule.exports === freeExports; + for (var i = nodeA.startX - 1; i < nodeA.finishX + 2; i++) { + for (var j = nodeA.startY - 1; j < nodeA.finishY + 2; j++) { + if (!(i < 0 || j < 0 || i >= grid.length || j >= grid[0].length)) { + for (var k = 0; k < grid[i][j].length; k++) { + nodeB = grid[i][j][k]; -/** Detect free variable `process` from Node.js. */ -var freeProcess = moduleExports && freeGlobal.process; + // If both nodes are not members of the same graph, + // or both nodes are the same, skip. + if (nodeA.getOwner() != nodeB.getOwner() || nodeA == nodeB) { + continue; + } -/** Used to access faster Node.js helpers. */ -var nodeUtil = (function() { - try { - // Use `util.types` for Node.js 10+. - var types = freeModule && freeModule.require && freeModule.require('util').types; + // check if the repulsion force between + // nodeA and nodeB has already been calculated + if (!processedNodeSet.has(nodeB) && !surrounding.has(nodeB)) { + var distanceX = Math.abs(nodeA.getCenterX() - nodeB.getCenterX()) - (nodeA.getWidth() / 2 + nodeB.getWidth() / 2); + var distanceY = Math.abs(nodeA.getCenterY() - nodeB.getCenterY()) - (nodeA.getHeight() / 2 + nodeB.getHeight() / 2); - if (types) { - return types; + // if the distance between nodeA and nodeB + // is less then calculation range + if (distanceX <= this.repulsionRange && distanceY <= this.repulsionRange) { + //then add nodeB to surrounding of nodeA + surrounding.add(nodeB); + } + } + } + } + } } - // Legacy `process.binding('util')` for Node.js < 10. - return freeProcess && freeProcess.binding && freeProcess.binding('util'); - } catch (e) {} -}()); + nodeA.surrounding = [].concat(_toConsumableArray(surrounding)); + } + for (i = 0; i < nodeA.surrounding.length; i++) { + this.calcRepulsionForce(nodeA, nodeA.surrounding[i]); + } +}; -module.exports = nodeUtil; +FDLayout.prototype.calcRepulsionRange = function () { + return 0.0; +}; +module.exports = FDLayout; /***/ }), +/* 19 */ +/***/ (function(module, exports, __nested_webpack_require_103214__) { -/***/ "./node_modules/lodash/_objectToString.js": -/*!************************************************!*\ - !*** ./node_modules/lodash/_objectToString.js ***! - \************************************************/ -/***/ (function(module) { +"use strict"; -/** Used for built-in method references. */ -var objectProto = Object.prototype; -/** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ -var nativeObjectToString = objectProto.toString; +var LEdge = __nested_webpack_require_103214__(1); +var FDLayoutConstants = __nested_webpack_require_103214__(4); -/** - * Converts `value` to a string using `Object.prototype.toString`. - * - * @private - * @param {*} value The value to convert. - * @returns {string} Returns the converted string. - */ -function objectToString(value) { - return nativeObjectToString.call(value); +function FDLayoutEdge(source, target, vEdge) { + LEdge.call(this, source, target, vEdge); + + // Ideal length and elasticity value for this edge + this.idealLength = FDLayoutConstants.DEFAULT_EDGE_LENGTH; + this.edgeElasticity = FDLayoutConstants.DEFAULT_SPRING_STRENGTH; } -module.exports = objectToString; +FDLayoutEdge.prototype = Object.create(LEdge.prototype); + +for (var prop in LEdge) { + FDLayoutEdge[prop] = LEdge[prop]; +} +module.exports = FDLayoutEdge; /***/ }), +/* 20 */ +/***/ (function(module, exports, __nested_webpack_require_103820__) { -/***/ "./node_modules/lodash/_overArg.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/_overArg.js ***! - \*****************************************/ -/***/ (function(module) { +"use strict"; -/** - * Creates a unary function that invokes `func` with its argument transformed. - * - * @private - * @param {Function} func The function to wrap. - * @param {Function} transform The argument transform. - * @returns {Function} Returns the new function. - */ -function overArg(func, transform) { - return function(arg) { - return func(transform(arg)); - }; -} -module.exports = overArg; +var LNode = __nested_webpack_require_103820__(3); +var FDLayoutConstants = __nested_webpack_require_103820__(4); +function FDLayoutNode(gm, loc, size, vNode) { + // alternative constructor is handled inside LNode + LNode.call(this, gm, loc, size, vNode); -/***/ }), + // Repulsion value of this node + this.nodeRepulsion = FDLayoutConstants.DEFAULT_REPULSION_STRENGTH; -/***/ "./node_modules/lodash/_overRest.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_overRest.js ***! - \******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + //Spring, repulsion and gravitational forces acting on this node + this.springForceX = 0; + this.springForceY = 0; + this.repulsionForceX = 0; + this.repulsionForceY = 0; + this.gravitationForceX = 0; + this.gravitationForceY = 0; + //Amount by which this node is to be moved in this iteration + this.displacementX = 0; + this.displacementY = 0; -var apply = __webpack_require__(/*! ./_apply */ "./node_modules/lodash/_apply.js"); + //Start and finish grid coordinates that this node is fallen into + this.startX = 0; + this.finishX = 0; + this.startY = 0; + this.finishY = 0; -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeMax = Math.max; + //Geometric neighbors of this node + this.surrounding = []; +} -/** - * A specialized version of `baseRest` which transforms the rest array. - * - * @private - * @param {Function} func The function to apply a rest parameter to. - * @param {number} [start=func.length-1] The start position of the rest parameter. - * @param {Function} transform The rest array transform. - * @returns {Function} Returns the new function. - */ -function overRest(func, start, transform) { - start = nativeMax(start === undefined ? (func.length - 1) : start, 0); - return function() { - var args = arguments, - index = -1, - length = nativeMax(args.length - start, 0), - array = Array(length); +FDLayoutNode.prototype = Object.create(LNode.prototype); - while (++index < length) { - array[index] = args[start + index]; - } - index = -1; - var otherArgs = Array(start + 1); - while (++index < start) { - otherArgs[index] = args[index]; - } - otherArgs[start] = transform(array); - return apply(func, this, otherArgs); - }; +for (var prop in LNode) { + FDLayoutNode[prop] = LNode[prop]; } -module.exports = overRest; +FDLayoutNode.prototype.setGridCoordinates = function (_startX, _finishX, _startY, _finishY) { + this.startX = _startX; + this.finishX = _finishX; + this.startY = _startY; + this.finishY = _finishY; +}; +module.exports = FDLayoutNode; /***/ }), +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { -/***/ "./node_modules/lodash/_root.js": -/*!**************************************!*\ - !*** ./node_modules/lodash/_root.js ***! - \**************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var freeGlobal = __webpack_require__(/*! ./_freeGlobal */ "./node_modules/lodash/_freeGlobal.js"); +"use strict"; -/** Detect free variable `self`. */ -var freeSelf = typeof self == 'object' && self && self.Object === Object && self; -/** Used as a reference to the global object. */ -var root = freeGlobal || freeSelf || Function('return this')(); +function DimensionD(width, height) { + this.width = 0; + this.height = 0; + if (width !== null && height !== null) { + this.height = height; + this.width = width; + } +} -module.exports = root; +DimensionD.prototype.getWidth = function () { + return this.width; +}; +DimensionD.prototype.setWidth = function (width) { + this.width = width; +}; -/***/ }), +DimensionD.prototype.getHeight = function () { + return this.height; +}; -/***/ "./node_modules/lodash/_safeGet.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/_safeGet.js ***! - \*****************************************/ -/***/ (function(module) { +DimensionD.prototype.setHeight = function (height) { + this.height = height; +}; -/** - * Gets the value at `key`, unless `key` is "__proto__" or "constructor". - * - * @private - * @param {Object} object The object to query. - * @param {string} key The key of the property to get. - * @returns {*} Returns the property value. - */ -function safeGet(object, key) { - if (key === 'constructor' && typeof object[key] === 'function') { - return; - } +module.exports = DimensionD; - if (key == '__proto__') { - return; - } +/***/ }), +/* 22 */ +/***/ (function(module, exports, __nested_webpack_require_105759__) { - return object[key]; -} +"use strict"; -module.exports = safeGet; +var UniqueIDGeneretor = __nested_webpack_require_105759__(14); -/***/ }), +function HashMap() { + this.map = {}; + this.keys = []; +} -/***/ "./node_modules/lodash/_setCacheAdd.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_setCacheAdd.js ***! - \*********************************************/ -/***/ (function(module) { +HashMap.prototype.put = function (key, value) { + var theId = UniqueIDGeneretor.createID(key); + if (!this.contains(theId)) { + this.map[theId] = value; + this.keys.push(key); + } +}; -/** Used to stand-in for `undefined` hash values. */ -var HASH_UNDEFINED = '__lodash_hash_undefined__'; +HashMap.prototype.contains = function (key) { + var theId = UniqueIDGeneretor.createID(key); + return this.map[key] != null; +}; -/** - * Adds `value` to the array cache. - * - * @private - * @name add - * @memberOf SetCache - * @alias push - * @param {*} value The value to cache. - * @returns {Object} Returns the cache instance. - */ -function setCacheAdd(value) { - this.__data__.set(value, HASH_UNDEFINED); - return this; -} +HashMap.prototype.get = function (key) { + var theId = UniqueIDGeneretor.createID(key); + return this.map[theId]; +}; -module.exports = setCacheAdd; +HashMap.prototype.keySet = function () { + return this.keys; +}; +module.exports = HashMap; /***/ }), +/* 23 */ +/***/ (function(module, exports, __nested_webpack_require_106487__) { -/***/ "./node_modules/lodash/_setCacheHas.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_setCacheHas.js ***! - \*********************************************/ -/***/ (function(module) { - -/** - * Checks if `value` is in the array cache. - * - * @private - * @name has - * @memberOf SetCache - * @param {*} value The value to search for. - * @returns {number} Returns `true` if `value` is found, else `false`. - */ -function setCacheHas(value) { - return this.__data__.has(value); -} - -module.exports = setCacheHas; +"use strict"; -/***/ }), +var UniqueIDGeneretor = __nested_webpack_require_106487__(14); -/***/ "./node_modules/lodash/_setToArray.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_setToArray.js ***! - \********************************************/ -/***/ (function(module) { +function HashSet() { + this.set = {}; +} +; -/** - * Converts `set` to an array of its values. - * - * @private - * @param {Object} set The set to convert. - * @returns {Array} Returns the values. - */ -function setToArray(set) { - var index = -1, - result = Array(set.size); +HashSet.prototype.add = function (obj) { + var theId = UniqueIDGeneretor.createID(obj); + if (!this.contains(theId)) this.set[theId] = obj; +}; - set.forEach(function(value) { - result[++index] = value; - }); - return result; -} +HashSet.prototype.remove = function (obj) { + delete this.set[UniqueIDGeneretor.createID(obj)]; +}; -module.exports = setToArray; +HashSet.prototype.clear = function () { + this.set = {}; +}; +HashSet.prototype.contains = function (obj) { + return this.set[UniqueIDGeneretor.createID(obj)] == obj; +}; -/***/ }), +HashSet.prototype.isEmpty = function () { + return this.size() === 0; +}; -/***/ "./node_modules/lodash/_setToString.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_setToString.js ***! - \*********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +HashSet.prototype.size = function () { + return Object.keys(this.set).length; +}; -var baseSetToString = __webpack_require__(/*! ./_baseSetToString */ "./node_modules/lodash/_baseSetToString.js"), - shortOut = __webpack_require__(/*! ./_shortOut */ "./node_modules/lodash/_shortOut.js"); +//concats this.set to the given list +HashSet.prototype.addAllTo = function (list) { + var keys = Object.keys(this.set); + var length = keys.length; + for (var i = 0; i < length; i++) { + list.push(this.set[keys[i]]); + } +}; -/** - * Sets the `toString` method of `func` to return `string`. - * - * @private - * @param {Function} func The function to modify. - * @param {Function} string The `toString` result. - * @returns {Function} Returns `func`. - */ -var setToString = shortOut(baseSetToString); +HashSet.prototype.size = function () { + return Object.keys(this.set).length; +}; -module.exports = setToString; +HashSet.prototype.addAll = function (list) { + var s = list.length; + for (var i = 0; i < s; i++) { + var v = list[i]; + this.add(v); + } +}; +module.exports = HashSet; /***/ }), +/* 24 */ +/***/ (function(module, exports, __webpack_require__) { -/***/ "./node_modules/lodash/_shortOut.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_shortOut.js ***! - \******************************************/ -/***/ (function(module) { +"use strict"; -/** Used to detect hot functions by number of calls within a span of milliseconds. */ -var HOT_COUNT = 800, - HOT_SPAN = 16; -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeNow = Date.now; +// Some matrix (1d and 2d array) operations +function Matrix() {} /** - * Creates a function that'll short out and invoke `identity` instead - * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` - * milliseconds. - * - * @private - * @param {Function} func The function to restrict. - * @returns {Function} Returns the new shortable function. + * matrix multiplication + * array1, array2 and result are 2d arrays */ -function shortOut(func) { - var count = 0, - lastCalled = 0; - - return function() { - var stamp = nativeNow(), - remaining = HOT_SPAN - (stamp - lastCalled); +Matrix.multMat = function (array1, array2) { + var result = []; - lastCalled = stamp; - if (remaining > 0) { - if (++count >= HOT_COUNT) { - return arguments[0]; + for (var i = 0; i < array1.length; i++) { + result[i] = []; + for (var j = 0; j < array2[0].length; j++) { + result[i][j] = 0; + for (var k = 0; k < array1[0].length; k++) { + result[i][j] += array1[i][k] * array2[k][j]; } - } else { - count = 0; } - return func.apply(undefined, arguments); - }; -} - -module.exports = shortOut; - - -/***/ }), - -/***/ "./node_modules/lodash/_stackClear.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_stackClear.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"); + } + return result; +}; /** - * Removes all key-value entries from the stack. - * - * @private - * @name clear - * @memberOf Stack + * matrix transpose + * array and result are 2d arrays */ -function stackClear() { - this.__data__ = new ListCache; - this.size = 0; -} - -module.exports = stackClear; - +Matrix.transpose = function (array) { + var result = []; -/***/ }), + for (var i = 0; i < array[0].length; i++) { + result[i] = []; + for (var j = 0; j < array.length; j++) { + result[i][j] = array[j][i]; + } + } -/***/ "./node_modules/lodash/_stackDelete.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_stackDelete.js ***! - \*********************************************/ -/***/ (function(module) { + return result; +}; /** - * Removes `key` and its value from the stack. - * - * @private - * @name delete - * @memberOf Stack - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. + * multiply array with constant + * array and result are 1d arrays */ -function stackDelete(key) { - var data = this.__data__, - result = data['delete'](key); +Matrix.multCons = function (array, constant) { + var result = []; - this.size = data.size; - return result; -} + for (var i = 0; i < array.length; i++) { + result[i] = array[i] * constant; + } -module.exports = stackDelete; + return result; +}; +/** + * substract two arrays + * array1, array2 and result are 1d arrays + */ +Matrix.minusOp = function (array1, array2) { + var result = []; -/***/ }), + for (var i = 0; i < array1.length; i++) { + result[i] = array1[i] - array2[i]; + } -/***/ "./node_modules/lodash/_stackGet.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_stackGet.js ***! - \******************************************/ -/***/ (function(module) { + return result; +}; /** - * Gets the stack value for `key`. - * - * @private - * @name get - * @memberOf Stack - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. + * dot product of two arrays with same size + * array1 and array2 are 1d arrays */ -function stackGet(key) { - return this.__data__.get(key); -} - -module.exports = stackGet; +Matrix.dotProduct = function (array1, array2) { + var product = 0; + for (var i = 0; i < array1.length; i++) { + product += array1[i] * array2[i]; + } -/***/ }), + return product; +}; -/***/ "./node_modules/lodash/_stackHas.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_stackHas.js ***! - \******************************************/ -/***/ (function(module) { +/** + * magnitude of an array + * array is 1d array + */ +Matrix.mag = function (array) { + return Math.sqrt(this.dotProduct(array, array)); +}; /** - * Checks if a stack value for `key` exists. - * - * @private - * @name has - * @memberOf Stack - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + * normalization of an array + * array and result are 1d array */ -function stackHas(key) { - return this.__data__.has(key); -} +Matrix.normalize = function (array) { + var result = []; + var magnitude = this.mag(array); -module.exports = stackHas; + for (var i = 0; i < array.length; i++) { + result[i] = array[i] / magnitude; + } + return result; +}; -/***/ }), +/** + * multiply an array with centering matrix + * array and result are 1d array + */ +Matrix.multGamma = function (array) { + var result = []; + var sum = 0; -/***/ "./node_modules/lodash/_stackSet.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_stackSet.js ***! - \******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + for (var i = 0; i < array.length; i++) { + sum += array[i]; + } -var ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"), - Map = __webpack_require__(/*! ./_Map */ "./node_modules/lodash/_Map.js"), - MapCache = __webpack_require__(/*! ./_MapCache */ "./node_modules/lodash/_MapCache.js"); + sum *= -1 / array.length; -/** Used as the size to enable large array optimizations. */ -var LARGE_ARRAY_SIZE = 200; + for (var _i = 0; _i < array.length; _i++) { + result[_i] = sum + array[_i]; + } + return result; +}; /** - * Sets the stack `key` to `value`. - * - * @private - * @name set - * @memberOf Stack - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the stack cache instance. + * a special matrix multiplication + * result = 0.5 * C * INV * C^T * array + * array and result are 1d, C and INV are 2d arrays */ -function stackSet(key, value) { - var data = this.__data__; - if (data instanceof ListCache) { - var pairs = data.__data__; - if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { - pairs.push([key, value]); - this.size = ++data.size; - return this; +Matrix.multL = function (array, C, INV) { + var result = []; + var temp1 = []; + var temp2 = []; + + // multiply by C^T + for (var i = 0; i < C[0].length; i++) { + var sum = 0; + for (var j = 0; j < C.length; j++) { + sum += -0.5 * C[j][i] * array[j]; } - data = this.__data__ = new MapCache(pairs); + temp1[i] = sum; + } + // multiply the result by INV + for (var _i2 = 0; _i2 < INV.length; _i2++) { + var _sum = 0; + for (var _j = 0; _j < INV.length; _j++) { + _sum += INV[_i2][_j] * temp1[_j]; + } + temp2[_i2] = _sum; + } + // multiply the result by C + for (var _i3 = 0; _i3 < C.length; _i3++) { + var _sum2 = 0; + for (var _j2 = 0; _j2 < C[0].length; _j2++) { + _sum2 += C[_i3][_j2] * temp2[_j2]; + } + result[_i3] = _sum2; } - data.set(key, value); - this.size = data.size; - return this; -} -module.exports = stackSet; + return result; +}; +module.exports = Matrix; /***/ }), +/* 25 */ +/***/ (function(module, exports, __nested_webpack_require_111039__) { -/***/ "./node_modules/lodash/_strictIndexOf.js": -/*!***********************************************!*\ - !*** ./node_modules/lodash/_strictIndexOf.js ***! - \***********************************************/ -/***/ (function(module) { +"use strict"; + + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** - * A specialized version of `_.indexOf` which performs strict equality - * comparisons of values, i.e. `===`. + * A classic Quicksort algorithm with Hoare's partition + * - Works also on LinkedList objects * - * @private - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @param {number} fromIndex The index to search from. - * @returns {number} Returns the index of the matched value, else `-1`. + * Copyright: i-Vis Research Group, Bilkent University, 2007 - present */ -function strictIndexOf(array, value, fromIndex) { - var index = fromIndex - 1, - length = array.length; - - while (++index < length) { - if (array[index] === value) { - return index; - } - } - return -1; -} -module.exports = strictIndexOf; +var LinkedList = __nested_webpack_require_111039__(11); +var Quicksort = function () { + function Quicksort(A, compareFunction) { + _classCallCheck(this, Quicksort); -/***/ }), + if (compareFunction !== null || compareFunction !== undefined) this.compareFunction = this._defaultCompareFunction; -/***/ "./node_modules/lodash/_stringSize.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_stringSize.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + var length = void 0; + if (A instanceof LinkedList) length = A.size();else length = A.length; -var asciiSize = __webpack_require__(/*! ./_asciiSize */ "./node_modules/lodash/_asciiSize.js"), - hasUnicode = __webpack_require__(/*! ./_hasUnicode */ "./node_modules/lodash/_hasUnicode.js"), - unicodeSize = __webpack_require__(/*! ./_unicodeSize */ "./node_modules/lodash/_unicodeSize.js"); + this._quicksort(A, 0, length - 1); + } -/** - * Gets the number of symbols in `string`. - * - * @private - * @param {string} string The string to inspect. - * @returns {number} Returns the string size. - */ -function stringSize(string) { - return hasUnicode(string) - ? unicodeSize(string) - : asciiSize(string); -} + _createClass(Quicksort, [{ + key: '_quicksort', + value: function _quicksort(A, p, r) { + if (p < r) { + var q = this._partition(A, p, r); + this._quicksort(A, p, q); + this._quicksort(A, q + 1, r); + } + } + }, { + key: '_partition', + value: function _partition(A, p, r) { + var x = this._get(A, p); + var i = p; + var j = r; + while (true) { + while (this.compareFunction(x, this._get(A, j))) { + j--; + }while (this.compareFunction(this._get(A, i), x)) { + i++; + }if (i < j) { + this._swap(A, i, j); + i++; + j--; + } else return j; + } + } + }, { + key: '_get', + value: function _get(object, index) { + if (object instanceof LinkedList) return object.get_object_at(index);else return object[index]; + } + }, { + key: '_set', + value: function _set(object, index, value) { + if (object instanceof LinkedList) object.set_object_at(index, value);else object[index] = value; + } + }, { + key: '_swap', + value: function _swap(A, i, j) { + var temp = this._get(A, i); + this._set(A, i, this._get(A, j)); + this._set(A, j, temp); + } + }, { + key: '_defaultCompareFunction', + value: function _defaultCompareFunction(a, b) { + return b > a; + } + }]); -module.exports = stringSize; + return Quicksort; +}(); +module.exports = Quicksort; /***/ }), +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { -/***/ "./node_modules/lodash/_stringToPath.js": -/*!**********************************************!*\ - !*** ./node_modules/lodash/_stringToPath.js ***! - \**********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; -var memoizeCapped = __webpack_require__(/*! ./_memoizeCapped */ "./node_modules/lodash/_memoizeCapped.js"); -/** Used to match property names within property paths. */ -var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; +// Singular Value Decomposition implementation +function SVD() {}; -/** Used to match backslashes in property paths. */ -var reEscapeChar = /\\(\\)?/g; +/* Below singular value decomposition (svd) code including hypot function is adopted from https://github.com/dragonfly-ai/JamaJS + Some changes are applied to make the code compatible with the fcose code and to make it independent from Jama. + Input matrix is changed to a 2D array instead of Jama matrix. Matrix dimensions are taken according to 2D array instead of using Jama functions. + An object that includes singular value components is created for return. + The types of input parameters of the hypot function are removed. + let is used instead of var for the variable initialization. +*/ +/* + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -/** - * Converts `string` to a property path array. - * - * @private - * @param {string} string The string to convert. - * @returns {Array} Returns the property path array. - */ -var stringToPath = memoizeCapped(function(string) { - var result = []; - if (string.charCodeAt(0) === 46 /* . */) { - result.push(''); - } - string.replace(rePropName, function(match, number, quote, subString) { - result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); - }); - return result; -}); + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -module.exports = stringToPath; + 1. Definitions. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -/***/ }), + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -/***/ "./node_modules/lodash/_toKey.js": -/*!***************************************!*\ - !*** ./node_modules/lodash/_toKey.js ***! - \***************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -var isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -/** Used as references for various `Number` constants. */ -var INFINITY = 1 / 0; + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -/** - * Converts `value` to a string key if it's not a string or symbol. - * - * @private - * @param {*} value The value to inspect. - * @returns {string|symbol} Returns the key. - */ -function toKey(value) { - if (typeof value == 'string' || isSymbol(value)) { - return value; - } - var result = (value + ''); - return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; -} + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -module.exports = toKey; + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -/***/ }), + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -/***/ "./node_modules/lodash/_toSource.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_toSource.js ***! - \******************************************/ -/***/ (function(module) { + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -/** Used for built-in method references. */ -var funcProto = Function.prototype; + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -/** Used to resolve the decompiled source of functions. */ -var funcToString = funcProto.toString; + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -/** - * Converts `func` to its source code. - * - * @private - * @param {Function} func The function to convert. - * @returns {string} Returns the source code. - */ -function toSource(func) { - if (func != null) { - try { - return funcToString.call(func); - } catch (e) {} - try { - return (func + ''); - } catch (e) {} - } - return ''; -} + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -module.exports = toSource; + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -/***/ }), + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -/***/ "./node_modules/lodash/_trimmedEndIndex.js": -/*!*************************************************!*\ - !*** ./node_modules/lodash/_trimmedEndIndex.js ***! - \*************************************************/ -/***/ (function(module) { + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -/** Used to match a single whitespace character. */ -var reWhitespace = /\s/; + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -/** - * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace - * character of `string`. - * - * @private - * @param {string} string The string to inspect. - * @returns {number} Returns the index of the last non-whitespace character. - */ -function trimmedEndIndex(string) { - var index = string.length; + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. - while (index-- && reWhitespace.test(string.charAt(index))) {} - return index; -} + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -module.exports = trimmedEndIndex; + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + END OF TERMS AND CONDITIONS -/***/ }), + APPENDIX: How to apply the Apache License to your work. -/***/ "./node_modules/lodash/_unicodeSize.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/_unicodeSize.js ***! - \*********************************************/ -/***/ (function(module) { + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -/** Used to compose unicode character classes. */ -var rsAstralRange = '\\ud800-\\udfff', - rsComboMarksRange = '\\u0300-\\u036f', - reComboHalfMarksRange = '\\ufe20-\\ufe2f', - rsComboSymbolsRange = '\\u20d0-\\u20ff', - rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, - rsVarRange = '\\ufe0e\\ufe0f'; + Copyright {yyyy} {name of copyright owner} -/** Used to compose unicode capture groups. */ -var rsAstral = '[' + rsAstralRange + ']', - rsCombo = '[' + rsComboRange + ']', - rsFitz = '\\ud83c[\\udffb-\\udfff]', - rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', - rsNonAstral = '[^' + rsAstralRange + ']', - rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', - rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', - rsZWJ = '\\u200d'; + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -/** Used to compose unicode regexes. */ -var reOptMod = rsModifier + '?', - rsOptVar = '[' + rsVarRange + ']?', - rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', - rsSeq = rsOptVar + reOptMod + rsOptJoin, - rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; + http://www.apache.org/licenses/LICENSE-2.0 -/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ -var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ -/** - * Gets the size of a Unicode `string`. - * - * @private - * @param {string} string The string inspect. - * @returns {number} Returns the string size. - */ -function unicodeSize(string) { - var result = reUnicode.lastIndex = 0; - while (reUnicode.test(string)) { - ++result; +SVD.svd = function (A) { + this.U = null; + this.V = null; + this.s = null; + this.m = 0; + this.n = 0; + this.m = A.length; + this.n = A[0].length; + var nu = Math.min(this.m, this.n); + this.s = function (s) { + var a = []; + while (s-- > 0) { + a.push(0); + }return a; + }(Math.min(this.m + 1, this.n)); + this.U = function (dims) { + var allocate = function allocate(dims) { + if (dims.length == 0) { + return 0; + } else { + var array = []; + for (var i = 0; i < dims[0]; i++) { + array.push(allocate(dims.slice(1))); + } + return array; + } + }; + return allocate(dims); + }([this.m, nu]); + this.V = function (dims) { + var allocate = function allocate(dims) { + if (dims.length == 0) { + return 0; + } else { + var array = []; + for (var i = 0; i < dims[0]; i++) { + array.push(allocate(dims.slice(1))); + } + return array; + } + }; + return allocate(dims); + }([this.n, this.n]); + var e = function (s) { + var a = []; + while (s-- > 0) { + a.push(0); + }return a; + }(this.n); + var work = function (s) { + var a = []; + while (s-- > 0) { + a.push(0); + }return a; + }(this.m); + var wantu = true; + var wantv = true; + var nct = Math.min(this.m - 1, this.n); + var nrt = Math.max(0, Math.min(this.n - 2, this.m)); + for (var k = 0; k < Math.max(nct, nrt); k++) { + if (k < nct) { + this.s[k] = 0; + for (var i = k; i < this.m; i++) { + this.s[k] = SVD.hypot(this.s[k], A[i][k]); + } + ; + if (this.s[k] !== 0.0) { + if (A[k][k] < 0.0) { + this.s[k] = -this.s[k]; + } + for (var _i = k; _i < this.m; _i++) { + A[_i][k] /= this.s[k]; + } + ; + A[k][k] += 1.0; + } + this.s[k] = -this.s[k]; + } + for (var j = k + 1; j < this.n; j++) { + if (function (lhs, rhs) { + return lhs && rhs; + }(k < nct, this.s[k] !== 0.0)) { + var t = 0; + for (var _i2 = k; _i2 < this.m; _i2++) { + t += A[_i2][k] * A[_i2][j]; + } + ; + t = -t / A[k][k]; + for (var _i3 = k; _i3 < this.m; _i3++) { + A[_i3][j] += t * A[_i3][k]; + } + ; + } + e[j] = A[k][j]; + } + ; + if (function (lhs, rhs) { + return lhs && rhs; + }(wantu, k < nct)) { + for (var _i4 = k; _i4 < this.m; _i4++) { + this.U[_i4][k] = A[_i4][k]; + } + ; + } + if (k < nrt) { + e[k] = 0; + for (var _i5 = k + 1; _i5 < this.n; _i5++) { + e[k] = SVD.hypot(e[k], e[_i5]); + } + ; + if (e[k] !== 0.0) { + if (e[k + 1] < 0.0) { + e[k] = -e[k]; + } + for (var _i6 = k + 1; _i6 < this.n; _i6++) { + e[_i6] /= e[k]; + } + ; + e[k + 1] += 1.0; + } + e[k] = -e[k]; + if (function (lhs, rhs) { + return lhs && rhs; + }(k + 1 < this.m, e[k] !== 0.0)) { + for (var _i7 = k + 1; _i7 < this.m; _i7++) { + work[_i7] = 0.0; + } + ; + for (var _j = k + 1; _j < this.n; _j++) { + for (var _i8 = k + 1; _i8 < this.m; _i8++) { + work[_i8] += e[_j] * A[_i8][_j]; + } + ; + } + ; + for (var _j2 = k + 1; _j2 < this.n; _j2++) { + var _t = -e[_j2] / e[k + 1]; + for (var _i9 = k + 1; _i9 < this.m; _i9++) { + A[_i9][_j2] += _t * work[_i9]; + } + ; + } + ; + } + if (wantv) { + for (var _i10 = k + 1; _i10 < this.n; _i10++) { + this.V[_i10][k] = e[_i10]; + }; + } + } + }; + var p = Math.min(this.n, this.m + 1); + if (nct < this.n) { + this.s[nct] = A[nct][nct]; + } + if (this.m < p) { + this.s[p - 1] = 0.0; + } + if (nrt + 1 < p) { + e[nrt] = A[nrt][p - 1]; + } + e[p - 1] = 0.0; + if (wantu) { + for (var _j3 = nct; _j3 < nu; _j3++) { + for (var _i11 = 0; _i11 < this.m; _i11++) { + this.U[_i11][_j3] = 0.0; + } + ; + this.U[_j3][_j3] = 1.0; + }; + for (var _k = nct - 1; _k >= 0; _k--) { + if (this.s[_k] !== 0.0) { + for (var _j4 = _k + 1; _j4 < nu; _j4++) { + var _t2 = 0; + for (var _i12 = _k; _i12 < this.m; _i12++) { + _t2 += this.U[_i12][_k] * this.U[_i12][_j4]; + }; + _t2 = -_t2 / this.U[_k][_k]; + for (var _i13 = _k; _i13 < this.m; _i13++) { + this.U[_i13][_j4] += _t2 * this.U[_i13][_k]; + }; + }; + for (var _i14 = _k; _i14 < this.m; _i14++) { + this.U[_i14][_k] = -this.U[_i14][_k]; + }; + this.U[_k][_k] = 1.0 + this.U[_k][_k]; + for (var _i15 = 0; _i15 < _k - 1; _i15++) { + this.U[_i15][_k] = 0.0; + }; + } else { + for (var _i16 = 0; _i16 < this.m; _i16++) { + this.U[_i16][_k] = 0.0; + }; + this.U[_k][_k] = 1.0; + } + }; + } + if (wantv) { + for (var _k2 = this.n - 1; _k2 >= 0; _k2--) { + if (function (lhs, rhs) { + return lhs && rhs; + }(_k2 < nrt, e[_k2] !== 0.0)) { + for (var _j5 = _k2 + 1; _j5 < nu; _j5++) { + var _t3 = 0; + for (var _i17 = _k2 + 1; _i17 < this.n; _i17++) { + _t3 += this.V[_i17][_k2] * this.V[_i17][_j5]; + }; + _t3 = -_t3 / this.V[_k2 + 1][_k2]; + for (var _i18 = _k2 + 1; _i18 < this.n; _i18++) { + this.V[_i18][_j5] += _t3 * this.V[_i18][_k2]; + }; + }; + } + for (var _i19 = 0; _i19 < this.n; _i19++) { + this.V[_i19][_k2] = 0.0; + }; + this.V[_k2][_k2] = 1.0; + }; } + var pp = p - 1; + var iter = 0; + var eps = Math.pow(2.0, -52.0); + var tiny = Math.pow(2.0, -966.0); + while (p > 0) { + var _k3 = void 0; + var kase = void 0; + for (_k3 = p - 2; _k3 >= -1; _k3--) { + if (_k3 === -1) { + break; + } + if (Math.abs(e[_k3]) <= tiny + eps * (Math.abs(this.s[_k3]) + Math.abs(this.s[_k3 + 1]))) { + e[_k3] = 0.0; + break; + } + }; + if (_k3 === p - 2) { + kase = 4; + } else { + var ks = void 0; + for (ks = p - 1; ks >= _k3; ks--) { + if (ks === _k3) { + break; + } + var _t4 = (ks !== p ? Math.abs(e[ks]) : 0.0) + (ks !== _k3 + 1 ? Math.abs(e[ks - 1]) : 0.0); + if (Math.abs(this.s[ks]) <= tiny + eps * _t4) { + this.s[ks] = 0.0; + break; + } + }; + if (ks === _k3) { + kase = 3; + } else if (ks === p - 1) { + kase = 1; + } else { + kase = 2; + _k3 = ks; + } + } + _k3++; + switch (kase) { + case 1: + { + var f = e[p - 2]; + e[p - 2] = 0.0; + for (var _j6 = p - 2; _j6 >= _k3; _j6--) { + var _t5 = SVD.hypot(this.s[_j6], f); + var cs = this.s[_j6] / _t5; + var sn = f / _t5; + this.s[_j6] = _t5; + if (_j6 !== _k3) { + f = -sn * e[_j6 - 1]; + e[_j6 - 1] = cs * e[_j6 - 1]; + } + if (wantv) { + for (var _i20 = 0; _i20 < this.n; _i20++) { + _t5 = cs * this.V[_i20][_j6] + sn * this.V[_i20][p - 1]; + this.V[_i20][p - 1] = -sn * this.V[_i20][_j6] + cs * this.V[_i20][p - 1]; + this.V[_i20][_j6] = _t5; + }; + } + }; + }; + break; + case 2: + { + var _f = e[_k3 - 1]; + e[_k3 - 1] = 0.0; + for (var _j7 = _k3; _j7 < p; _j7++) { + var _t6 = SVD.hypot(this.s[_j7], _f); + var _cs = this.s[_j7] / _t6; + var _sn = _f / _t6; + this.s[_j7] = _t6; + _f = -_sn * e[_j7]; + e[_j7] = _cs * e[_j7]; + if (wantu) { + for (var _i21 = 0; _i21 < this.m; _i21++) { + _t6 = _cs * this.U[_i21][_j7] + _sn * this.U[_i21][_k3 - 1]; + this.U[_i21][_k3 - 1] = -_sn * this.U[_i21][_j7] + _cs * this.U[_i21][_k3 - 1]; + this.U[_i21][_j7] = _t6; + }; + } + }; + }; + break; + case 3: + { + var scale = Math.max(Math.max(Math.max(Math.max(Math.abs(this.s[p - 1]), Math.abs(this.s[p - 2])), Math.abs(e[p - 2])), Math.abs(this.s[_k3])), Math.abs(e[_k3])); + var sp = this.s[p - 1] / scale; + var spm1 = this.s[p - 2] / scale; + var epm1 = e[p - 2] / scale; + var sk = this.s[_k3] / scale; + var ek = e[_k3] / scale; + var b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2.0; + var c = sp * epm1 * (sp * epm1); + var shift = 0.0; + if (function (lhs, rhs) { + return lhs || rhs; + }(b !== 0.0, c !== 0.0)) { + shift = Math.sqrt(b * b + c); + if (b < 0.0) { + shift = -shift; + } + shift = c / (b + shift); + } + var _f2 = (sk + sp) * (sk - sp) + shift; + var g = sk * ek; + for (var _j8 = _k3; _j8 < p - 1; _j8++) { + var _t7 = SVD.hypot(_f2, g); + var _cs2 = _f2 / _t7; + var _sn2 = g / _t7; + if (_j8 !== _k3) { + e[_j8 - 1] = _t7; + } + _f2 = _cs2 * this.s[_j8] + _sn2 * e[_j8]; + e[_j8] = _cs2 * e[_j8] - _sn2 * this.s[_j8]; + g = _sn2 * this.s[_j8 + 1]; + this.s[_j8 + 1] = _cs2 * this.s[_j8 + 1]; + if (wantv) { + for (var _i22 = 0; _i22 < this.n; _i22++) { + _t7 = _cs2 * this.V[_i22][_j8] + _sn2 * this.V[_i22][_j8 + 1]; + this.V[_i22][_j8 + 1] = -_sn2 * this.V[_i22][_j8] + _cs2 * this.V[_i22][_j8 + 1]; + this.V[_i22][_j8] = _t7; + }; + } + _t7 = SVD.hypot(_f2, g); + _cs2 = _f2 / _t7; + _sn2 = g / _t7; + this.s[_j8] = _t7; + _f2 = _cs2 * e[_j8] + _sn2 * this.s[_j8 + 1]; + this.s[_j8 + 1] = -_sn2 * e[_j8] + _cs2 * this.s[_j8 + 1]; + g = _sn2 * e[_j8 + 1]; + e[_j8 + 1] = _cs2 * e[_j8 + 1]; + if (wantu && _j8 < this.m - 1) { + for (var _i23 = 0; _i23 < this.m; _i23++) { + _t7 = _cs2 * this.U[_i23][_j8] + _sn2 * this.U[_i23][_j8 + 1]; + this.U[_i23][_j8 + 1] = -_sn2 * this.U[_i23][_j8] + _cs2 * this.U[_i23][_j8 + 1]; + this.U[_i23][_j8] = _t7; + }; + } + }; + e[p - 2] = _f2; + iter = iter + 1; + }; + break; + case 4: + { + if (this.s[_k3] <= 0.0) { + this.s[_k3] = this.s[_k3] < 0.0 ? -this.s[_k3] : 0.0; + if (wantv) { + for (var _i24 = 0; _i24 <= pp; _i24++) { + this.V[_i24][_k3] = -this.V[_i24][_k3]; + }; + } + } + while (_k3 < pp) { + if (this.s[_k3] >= this.s[_k3 + 1]) { + break; + } + var _t8 = this.s[_k3]; + this.s[_k3] = this.s[_k3 + 1]; + this.s[_k3 + 1] = _t8; + if (wantv && _k3 < this.n - 1) { + for (var _i25 = 0; _i25 < this.n; _i25++) { + _t8 = this.V[_i25][_k3 + 1]; + this.V[_i25][_k3 + 1] = this.V[_i25][_k3]; + this.V[_i25][_k3] = _t8; + }; + } + if (wantu && _k3 < this.m - 1) { + for (var _i26 = 0; _i26 < this.m; _i26++) { + _t8 = this.U[_i26][_k3 + 1]; + this.U[_i26][_k3 + 1] = this.U[_i26][_k3]; + this.U[_i26][_k3] = _t8; + }; + } + _k3++; + }; + iter = 0; + p--; + }; + break; + } + }; + var result = { U: this.U, V: this.V, S: this.s }; return result; -} +}; -module.exports = unicodeSize; +// sqrt(a^2 + b^2) without under/overflow. +SVD.hypot = function (a, b) { + var r = void 0; + if (Math.abs(a) > Math.abs(b)) { + r = b / a; + r = Math.abs(a) * Math.sqrt(1 + r * r); + } else if (b != 0) { + r = a / b; + r = Math.abs(b) * Math.sqrt(1 + r * r); + } else { + r = 0.0; + } + return r; +}; +module.exports = SVD; /***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { -/***/ "./node_modules/lodash/clone.js": -/*!**************************************!*\ - !*** ./node_modules/lodash/clone.js ***! - \**************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; -var baseClone = __webpack_require__(/*! ./_baseClone */ "./node_modules/lodash/_baseClone.js"); -/** Used to compose bitmasks for cloning. */ -var CLONE_SYMBOLS_FLAG = 4; +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** - * Creates a shallow clone of `value`. - * - * **Note:** This method is loosely based on the - * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) - * and supports cloning arrays, array buffers, booleans, date objects, maps, - * numbers, `Object` objects, regexes, sets, strings, symbols, and typed - * arrays. The own enumerable properties of `arguments` objects are cloned - * as plain objects. An empty object is returned for uncloneable values such - * as error objects, functions, DOM nodes, and WeakMaps. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to clone. - * @returns {*} Returns the cloned value. - * @see _.cloneDeep - * @example - * - * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * Needleman-Wunsch algorithm is an procedure to compute the optimal global alignment of two string + * sequences by S.B.Needleman and C.D.Wunsch (1970). * - * var shallow = _.clone(objects); - * console.log(shallow[0] === objects[0]); - * // => true + * Aside from the inputs, you can assign the scores for, + * - Match: The two characters at the current index are same. + * - Mismatch: The two characters at the current index are different. + * - Insertion/Deletion(gaps): The best alignment involves one letter aligning to a gap in the other string. */ -function clone(value) { - return baseClone(value, CLONE_SYMBOLS_FLAG); -} -module.exports = clone; +var NeedlemanWunsch = function () { + function NeedlemanWunsch(sequence1, sequence2) { + var match_score = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; + var mismatch_penalty = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : -1; + var gap_penalty = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : -1; + _classCallCheck(this, NeedlemanWunsch); -/***/ }), + this.sequence1 = sequence1; + this.sequence2 = sequence2; + this.match_score = match_score; + this.mismatch_penalty = mismatch_penalty; + this.gap_penalty = gap_penalty; -/***/ "./node_modules/lodash/cloneDeep.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/cloneDeep.js ***! - \******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // Just the remove redundancy + this.iMax = sequence1.length + 1; + this.jMax = sequence2.length + 1; -var baseClone = __webpack_require__(/*! ./_baseClone */ "./node_modules/lodash/_baseClone.js"); + // Grid matrix of scores + this.grid = new Array(this.iMax); + for (var i = 0; i < this.iMax; i++) { + this.grid[i] = new Array(this.jMax); -/** Used to compose bitmasks for cloning. */ -var CLONE_DEEP_FLAG = 1, - CLONE_SYMBOLS_FLAG = 4; + for (var j = 0; j < this.jMax; j++) { + this.grid[i][j] = 0; + } + } -/** - * This method is like `_.clone` except that it recursively clones `value`. - * - * @static - * @memberOf _ - * @since 1.0.0 - * @category Lang - * @param {*} value The value to recursively clone. - * @returns {*} Returns the deep cloned value. - * @see _.clone - * @example - * - * var objects = [{ 'a': 1 }, { 'b': 2 }]; - * - * var deep = _.cloneDeep(objects); - * console.log(deep[0] === objects[0]); - * // => false - */ -function cloneDeep(value) { - return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); -} + // Traceback matrix (2D array, each cell is an array of boolean values for [`Diag`, `Up`, `Left`] positions) + this.tracebackGrid = new Array(this.iMax); + for (var _i = 0; _i < this.iMax; _i++) { + this.tracebackGrid[_i] = new Array(this.jMax); -module.exports = cloneDeep; + for (var _j = 0; _j < this.jMax; _j++) { + this.tracebackGrid[_i][_j] = [null, null, null]; + } + } + // The aligned sequences (return multiple possibilities) + this.alignments = []; -/***/ }), + // Final alignment score + this.score = -1; -/***/ "./node_modules/lodash/constant.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/constant.js ***! - \*****************************************/ -/***/ (function(module) { + // Calculate scores and tracebacks + this.computeGrids(); + } -/** - * Creates a function that returns `value`. - * - * @static - * @memberOf _ - * @since 2.4.0 - * @category Util - * @param {*} value The value to return from the new function. - * @returns {Function} Returns the new constant function. - * @example - * - * var objects = _.times(2, _.constant({ 'a': 1 })); - * - * console.log(objects); - * // => [{ 'a': 1 }, { 'a': 1 }] - * - * console.log(objects[0] === objects[1]); - * // => true - */ -function constant(value) { - return function() { - return value; - }; -} + _createClass(NeedlemanWunsch, [{ + key: "getScore", + value: function getScore() { + return this.score; + } + }, { + key: "getAlignments", + value: function getAlignments() { + return this.alignments; + } -module.exports = constant; + // Main dynamic programming procedure + }, { + key: "computeGrids", + value: function computeGrids() { + // Fill in the first row + for (var j = 1; j < this.jMax; j++) { + this.grid[0][j] = this.grid[0][j - 1] + this.gap_penalty; + this.tracebackGrid[0][j] = [false, false, true]; + } -/***/ }), + // Fill in the first column + for (var i = 1; i < this.iMax; i++) { + this.grid[i][0] = this.grid[i - 1][0] + this.gap_penalty; + this.tracebackGrid[i][0] = [false, true, false]; + } -/***/ "./node_modules/lodash/debounce.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/debounce.js ***! - \*****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // Fill the rest of the grid + for (var _i2 = 1; _i2 < this.iMax; _i2++) { + for (var _j2 = 1; _j2 < this.jMax; _j2++) { + // Find the max score(s) among [`Diag`, `Up`, `Left`] + var diag = void 0; + if (this.sequence1[_i2 - 1] === this.sequence2[_j2 - 1]) diag = this.grid[_i2 - 1][_j2 - 1] + this.match_score;else diag = this.grid[_i2 - 1][_j2 - 1] + this.mismatch_penalty; -var isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), - now = __webpack_require__(/*! ./now */ "./node_modules/lodash/now.js"), - toNumber = __webpack_require__(/*! ./toNumber */ "./node_modules/lodash/toNumber.js"); + var up = this.grid[_i2 - 1][_j2] + this.gap_penalty; + var left = this.grid[_i2][_j2 - 1] + this.gap_penalty; -/** Error message constants. */ -var FUNC_ERROR_TEXT = 'Expected a function'; + // If there exists multiple max values, capture them for multiple paths + var maxOf = [diag, up, left]; + var indices = this.arrayAllMaxIndexes(maxOf); -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeMax = Math.max, - nativeMin = Math.min; + // Update Grids + this.grid[_i2][_j2] = maxOf[indices[0]]; + this.tracebackGrid[_i2][_j2] = [indices.includes(0), indices.includes(1), indices.includes(2)]; + } + } -/** - * Creates a debounced function that delays invoking `func` until after `wait` - * milliseconds have elapsed since the last time the debounced function was - * invoked. The debounced function comes with a `cancel` method to cancel - * delayed `func` invocations and a `flush` method to immediately invoke them. - * Provide `options` to indicate whether `func` should be invoked on the - * leading and/or trailing edge of the `wait` timeout. The `func` is invoked - * with the last arguments provided to the debounced function. Subsequent - * calls to the debounced function return the result of the last `func` - * invocation. - * - * **Note:** If `leading` and `trailing` options are `true`, `func` is - * invoked on the trailing edge of the timeout only if the debounced function - * is invoked more than once during the `wait` timeout. - * - * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred - * until to the next tick, similar to `setTimeout` with a timeout of `0`. - * - * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) - * for details over the differences between `_.debounce` and `_.throttle`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to debounce. - * @param {number} [wait=0] The number of milliseconds to delay. - * @param {Object} [options={}] The options object. - * @param {boolean} [options.leading=false] - * Specify invoking on the leading edge of the timeout. - * @param {number} [options.maxWait] - * The maximum time `func` is allowed to be delayed before it's invoked. - * @param {boolean} [options.trailing=true] - * Specify invoking on the trailing edge of the timeout. - * @returns {Function} Returns the new debounced function. - * @example - * - * // Avoid costly calculations while the window size is in flux. - * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); - * - * // Invoke `sendMail` when clicked, debouncing subsequent calls. - * jQuery(element).on('click', _.debounce(sendMail, 300, { - * 'leading': true, - * 'trailing': false - * })); - * - * // Ensure `batchLog` is invoked once after 1 second of debounced calls. - * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); - * var source = new EventSource('/stream'); - * jQuery(source).on('message', debounced); - * - * // Cancel the trailing debounced invocation. - * jQuery(window).on('popstate', debounced.cancel); - */ -function debounce(func, wait, options) { - var lastArgs, - lastThis, - maxWait, - result, - timerId, - lastCallTime, - lastInvokeTime = 0, - leading = false, - maxing = false, - trailing = true; + // Update alignment score + this.score = this.grid[this.iMax - 1][this.jMax - 1]; + } - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - wait = toNumber(wait) || 0; - if (isObject(options)) { - leading = !!options.leading; - maxing = 'maxWait' in options; - maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; - trailing = 'trailing' in options ? !!options.trailing : trailing; - } + // Gets all possible valid sequence combinations - function invokeFunc(time) { - var args = lastArgs, - thisArg = lastThis; + }, { + key: "alignmentTraceback", + value: function alignmentTraceback() { + var inProcessAlignments = []; - lastArgs = lastThis = undefined; - lastInvokeTime = time; - result = func.apply(thisArg, args); - return result; - } + inProcessAlignments.push({ pos: [this.sequence1.length, this.sequence2.length], + seq1: "", + seq2: "" + }); - function leadingEdge(time) { - // Reset any `maxWait` timer. - lastInvokeTime = time; - // Start the timer for the trailing edge. - timerId = setTimeout(timerExpired, wait); - // Invoke the leading edge. - return leading ? invokeFunc(time) : result; - } + while (inProcessAlignments[0]) { + var current = inProcessAlignments[0]; + var directions = this.tracebackGrid[current.pos[0]][current.pos[1]]; - function remainingWait(time) { - var timeSinceLastCall = time - lastCallTime, - timeSinceLastInvoke = time - lastInvokeTime, - timeWaiting = wait - timeSinceLastCall; + if (directions[0]) { + inProcessAlignments.push({ pos: [current.pos[0] - 1, current.pos[1] - 1], + seq1: this.sequence1[current.pos[0] - 1] + current.seq1, + seq2: this.sequence2[current.pos[1] - 1] + current.seq2 + }); + } + if (directions[1]) { + inProcessAlignments.push({ pos: [current.pos[0] - 1, current.pos[1]], + seq1: this.sequence1[current.pos[0] - 1] + current.seq1, + seq2: '-' + current.seq2 + }); + } + if (directions[2]) { + inProcessAlignments.push({ pos: [current.pos[0], current.pos[1] - 1], + seq1: '-' + current.seq1, + seq2: this.sequence2[current.pos[1] - 1] + current.seq2 + }); + } - return maxing - ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) - : timeWaiting; - } + if (current.pos[0] === 0 && current.pos[1] === 0) this.alignments.push({ sequence1: current.seq1, + sequence2: current.seq2 + }); - function shouldInvoke(time) { - var timeSinceLastCall = time - lastCallTime, - timeSinceLastInvoke = time - lastInvokeTime; + inProcessAlignments.shift(); + } - // Either this is the first call, activity has stopped and we're at the - // trailing edge, the system time has gone backwards and we're treating - // it as the trailing edge, or we've hit the `maxWait` limit. - return (lastCallTime === undefined || (timeSinceLastCall >= wait) || - (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); - } + return this.alignments; + } - function timerExpired() { - var time = now(); - if (shouldInvoke(time)) { - return trailingEdge(time); - } - // Restart the timer. - timerId = setTimeout(timerExpired, remainingWait(time)); - } + // Helper Functions - function trailingEdge(time) { - timerId = undefined; + }, { + key: "getAllIndexes", + value: function getAllIndexes(arr, val) { + var indexes = [], + i = -1; + while ((i = arr.indexOf(val, i + 1)) !== -1) { + indexes.push(i); + } + return indexes; + } + }, { + key: "arrayAllMaxIndexes", + value: function arrayAllMaxIndexes(array) { + return this.getAllIndexes(array, Math.max.apply(null, array)); + } + }]); - // Only invoke if we have `lastArgs` which means `func` has been - // debounced at least once. - if (trailing && lastArgs) { - return invokeFunc(time); - } - lastArgs = lastThis = undefined; - return result; - } + return NeedlemanWunsch; +}(); - function cancel() { - if (timerId !== undefined) { - clearTimeout(timerId); - } - lastInvokeTime = 0; - lastArgs = lastCallTime = lastThis = timerId = undefined; - } +module.exports = NeedlemanWunsch; - function flush() { - return timerId === undefined ? result : trailingEdge(now()); - } +/***/ }), +/* 28 */ +/***/ (function(module, exports, __nested_webpack_require_145732__) { - function debounced() { - var time = now(), - isInvoking = shouldInvoke(time); +"use strict"; - lastArgs = arguments; - lastThis = this; - lastCallTime = time; - if (isInvoking) { - if (timerId === undefined) { - return leadingEdge(lastCallTime); - } - if (maxing) { - // Handle invocations in a tight loop. - clearTimeout(timerId); - timerId = setTimeout(timerExpired, wait); - return invokeFunc(lastCallTime); - } - } - if (timerId === undefined) { - timerId = setTimeout(timerExpired, wait); - } - return result; - } - debounced.cancel = cancel; - debounced.flush = flush; - return debounced; -} +var layoutBase = function layoutBase() { + return; +}; -module.exports = debounce; +layoutBase.FDLayout = __nested_webpack_require_145732__(18); +layoutBase.FDLayoutConstants = __nested_webpack_require_145732__(4); +layoutBase.FDLayoutEdge = __nested_webpack_require_145732__(19); +layoutBase.FDLayoutNode = __nested_webpack_require_145732__(20); +layoutBase.DimensionD = __nested_webpack_require_145732__(21); +layoutBase.HashMap = __nested_webpack_require_145732__(22); +layoutBase.HashSet = __nested_webpack_require_145732__(23); +layoutBase.IGeometry = __nested_webpack_require_145732__(8); +layoutBase.IMath = __nested_webpack_require_145732__(9); +layoutBase.Integer = __nested_webpack_require_145732__(10); +layoutBase.Point = __nested_webpack_require_145732__(12); +layoutBase.PointD = __nested_webpack_require_145732__(5); +layoutBase.RandomSeed = __nested_webpack_require_145732__(16); +layoutBase.RectangleD = __nested_webpack_require_145732__(13); +layoutBase.Transform = __nested_webpack_require_145732__(17); +layoutBase.UniqueIDGeneretor = __nested_webpack_require_145732__(14); +layoutBase.Quicksort = __nested_webpack_require_145732__(25); +layoutBase.LinkedList = __nested_webpack_require_145732__(11); +layoutBase.LGraphObject = __nested_webpack_require_145732__(2); +layoutBase.LGraph = __nested_webpack_require_145732__(6); +layoutBase.LEdge = __nested_webpack_require_145732__(1); +layoutBase.LGraphManager = __nested_webpack_require_145732__(7); +layoutBase.LNode = __nested_webpack_require_145732__(3); +layoutBase.Layout = __nested_webpack_require_145732__(15); +layoutBase.LayoutConstants = __nested_webpack_require_145732__(0); +layoutBase.NeedlemanWunsch = __nested_webpack_require_145732__(27); +layoutBase.Matrix = __nested_webpack_require_145732__(24); +layoutBase.SVD = __nested_webpack_require_145732__(26); +module.exports = layoutBase; /***/ }), +/* 29 */ +/***/ (function(module, exports, __webpack_require__) { -/***/ "./node_modules/lodash/defaults.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/defaults.js ***! - \*****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var baseRest = __webpack_require__(/*! ./_baseRest */ "./node_modules/lodash/_baseRest.js"), - eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"), - isIterateeCall = __webpack_require__(/*! ./_isIterateeCall */ "./node_modules/lodash/_isIterateeCall.js"), - keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js"); - -/** Used for built-in method references. */ -var objectProto = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; +"use strict"; -/** - * Assigns own and inherited enumerable string keyed properties of source - * objects to the destination object for all destination properties that - * resolve to `undefined`. Source objects are applied from left to right. - * Once a property is set, additional values of the same property are ignored. - * - * **Note:** This method mutates `object`. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The destination object. - * @param {...Object} [sources] The source objects. - * @returns {Object} Returns `object`. - * @see _.defaultsDeep - * @example - * - * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); - * // => { 'a': 1, 'b': 2 } - */ -var defaults = baseRest(function(object, sources) { - object = Object(object); - var index = -1; - var length = sources.length; - var guard = length > 2 ? sources[2] : undefined; +function Emitter() { + this.listeners = []; +} - if (guard && isIterateeCall(sources[0], sources[1], guard)) { - length = 1; - } +var p = Emitter.prototype; - while (++index < length) { - var source = sources[index]; - var props = keysIn(source); - var propsIndex = -1; - var propsLength = props.length; +p.addListener = function (event, callback) { + this.listeners.push({ + event: event, + callback: callback + }); +}; - while (++propsIndex < propsLength) { - var key = props[propsIndex]; - var value = object[key]; +p.removeListener = function (event, callback) { + for (var i = this.listeners.length; i >= 0; i--) { + var l = this.listeners[i]; - if (value === undefined || - (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) { - object[key] = source[key]; - } + if (l.event === event && l.callback === callback) { + this.listeners.splice(i, 1); } } +}; - return object; -}); +p.emit = function (event, data) { + for (var i = 0; i < this.listeners.length; i++) { + var l = this.listeners[i]; -module.exports = defaults; + if (event === l.event) { + l.callback(data); + } + } +}; + +module.exports = Emitter; +/***/ }) +/******/ ]); +}); /***/ }), -/***/ "./node_modules/lodash/each.js": -/*!*************************************!*\ - !*** ./node_modules/lodash/each.js ***! - \*************************************/ +/***/ "./node_modules/lodash.curry/index.js": +/*!********************************************!*\ + !*** ./node_modules/lodash.curry/index.js ***! + \********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -module.exports = __webpack_require__(/*! ./forEach */ "./node_modules/lodash/forEach.js"); +/** + * lodash (Custom Build) + * Build: `lodash modularize exports="npm" -o ./` + * Copyright jQuery Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ + +/** Used as the `TypeError` message for "Functions" methods. */ +var FUNC_ERROR_TEXT = 'Expected a function'; +/** Used as the internal argument placeholder. */ +var PLACEHOLDER = '__lodash_placeholder__'; -/***/ }), +/** Used to compose bitmasks for function metadata. */ +var BIND_FLAG = 1, + BIND_KEY_FLAG = 2, + CURRY_BOUND_FLAG = 4, + CURRY_FLAG = 8, + CURRY_RIGHT_FLAG = 16, + PARTIAL_FLAG = 32, + PARTIAL_RIGHT_FLAG = 64, + ARY_FLAG = 128, + REARG_FLAG = 256, + FLIP_FLAG = 512; -/***/ "./node_modules/lodash/eq.js": -/*!***********************************!*\ - !*** ./node_modules/lodash/eq.js ***! - \***********************************/ -/***/ (function(module) { +/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0, + MAX_SAFE_INTEGER = 9007199254740991, + MAX_INTEGER = 1.7976931348623157e+308, + NAN = 0 / 0; + +/** Used to associate wrap methods with their bit flags. */ +var wrapFlags = [ + ['ary', ARY_FLAG], + ['bind', BIND_FLAG], + ['bindKey', BIND_KEY_FLAG], + ['curry', CURRY_FLAG], + ['curryRight', CURRY_RIGHT_FLAG], + ['flip', FLIP_FLAG], + ['partial', PARTIAL_FLAG], + ['partialRight', PARTIAL_RIGHT_FLAG], + ['rearg', REARG_FLAG] +]; + +/** `Object#toString` result references. */ +var funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + symbolTag = '[object Symbol]'; /** - * Performs a - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * comparison between two values to determine if they are equivalent. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if the values are equivalent, else `false`. - * @example - * - * var object = { 'a': 1 }; - * var other = { 'a': 1 }; - * - * _.eq(object, object); - * // => true - * - * _.eq(object, other); - * // => false - * - * _.eq('a', 'a'); - * // => true - * - * _.eq('a', Object('a')); - * // => false - * - * _.eq(NaN, NaN); - * // => true + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). */ -function eq(value, other) { - return value === other || (value !== value && other !== other); -} +var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; -module.exports = eq; +/** Used to match leading and trailing whitespace. */ +var reTrim = /^\s+|\s+$/g; +/** Used to match wrap detail comments. */ +var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, + reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, + reSplitDetails = /,? & /; -/***/ }), +/** Used to detect bad signed hexadecimal string values. */ +var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; -/***/ "./node_modules/lodash/filter.js": -/*!***************************************!*\ - !*** ./node_modules/lodash/filter.js ***! - \***************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +/** Used to detect binary string values. */ +var reIsBinary = /^0b[01]+$/i; -var arrayFilter = __webpack_require__(/*! ./_arrayFilter */ "./node_modules/lodash/_arrayFilter.js"), - baseFilter = __webpack_require__(/*! ./_baseFilter */ "./node_modules/lodash/_baseFilter.js"), - baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), - isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"); +/** Used to detect host constructors (Safari). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; -/** - * Iterates over elements of `collection`, returning an array of all elements - * `predicate` returns truthy for. The predicate is invoked with three - * arguments: (value, index|key, collection). - * - * **Note:** Unlike `_.remove`, this method returns a new array. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new filtered array. - * @see _.reject - * @example - * - * var users = [ - * { 'user': 'barney', 'age': 36, 'active': true }, - * { 'user': 'fred', 'age': 40, 'active': false } - * ]; - * - * _.filter(users, function(o) { return !o.active; }); - * // => objects for ['fred'] - * - * // The `_.matches` iteratee shorthand. - * _.filter(users, { 'age': 36, 'active': true }); - * // => objects for ['barney'] - * - * // The `_.matchesProperty` iteratee shorthand. - * _.filter(users, ['active', false]); - * // => objects for ['fred'] - * - * // The `_.property` iteratee shorthand. - * _.filter(users, 'active'); - * // => objects for ['barney'] - * - * // Combining several predicates using `_.overEvery` or `_.overSome`. - * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]])); - * // => objects for ['fred', 'barney'] - */ -function filter(collection, predicate) { - var func = isArray(collection) ? arrayFilter : baseFilter; - return func(collection, baseIteratee(predicate, 3)); -} +/** Used to detect octal string values. */ +var reIsOctal = /^0o[0-7]+$/i; -module.exports = filter; +/** Used to detect unsigned integer values. */ +var reIsUint = /^(?:0|[1-9]\d*)$/; +/** Built-in method references without a dependency on `root`. */ +var freeParseInt = parseInt; -/***/ }), +/** Detect free variable `global` from Node.js. */ +var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g; -/***/ "./node_modules/lodash/find.js": -/*!*************************************!*\ - !*** ./node_modules/lodash/find.js ***! - \*************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +/** Detect free variable `self`. */ +var freeSelf = typeof self == 'object' && self && self.Object === Object && self; -var createFind = __webpack_require__(/*! ./_createFind */ "./node_modules/lodash/_createFind.js"), - findIndex = __webpack_require__(/*! ./findIndex */ "./node_modules/lodash/findIndex.js"); +/** Used as a reference to the global object. */ +var root = freeGlobal || freeSelf || Function('return this')(); /** - * Iterates over elements of `collection`, returning the first element - * `predicate` returns truthy for. The predicate is invoked with three - * arguments: (value, index|key, collection). - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to inspect. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @param {number} [fromIndex=0] The index to search from. - * @returns {*} Returns the matched element, else `undefined`. - * @example - * - * var users = [ - * { 'user': 'barney', 'age': 36, 'active': true }, - * { 'user': 'fred', 'age': 40, 'active': false }, - * { 'user': 'pebbles', 'age': 1, 'active': true } - * ]; - * - * _.find(users, function(o) { return o.age < 40; }); - * // => object for 'barney' - * - * // The `_.matches` iteratee shorthand. - * _.find(users, { 'age': 1, 'active': true }); - * // => object for 'pebbles' - * - * // The `_.matchesProperty` iteratee shorthand. - * _.find(users, ['active', false]); - * // => object for 'fred' + * A faster alternative to `Function#apply`, this function invokes `func` + * with the `this` binding of `thisArg` and the arguments of `args`. * - * // The `_.property` iteratee shorthand. - * _.find(users, 'active'); - * // => object for 'barney' + * @private + * @param {Function} func The function to invoke. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} args The arguments to invoke `func` with. + * @returns {*} Returns the result of `func`. */ -var find = createFind(findIndex); - -module.exports = find; +function apply(func, thisArg, args) { + switch (args.length) { + case 0: return func.call(thisArg); + case 1: return func.call(thisArg, args[0]); + case 2: return func.call(thisArg, args[0], args[1]); + case 3: return func.call(thisArg, args[0], args[1], args[2]); + } + return func.apply(thisArg, args); +} +/** + * A specialized version of `_.forEach` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ +function arrayEach(array, iteratee) { + var index = -1, + length = array ? array.length : 0; -/***/ }), + while (++index < length) { + if (iteratee(array[index], index, array) === false) { + break; + } + } + return array; +} -/***/ "./node_modules/lodash/findIndex.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/findIndex.js ***! - \******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +/** + * A specialized version of `_.includes` for arrays without support for + * specifying an index to search from. + * + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @returns {boolean} Returns `true` if `target` is found, else `false`. + */ +function arrayIncludes(array, value) { + var length = array ? array.length : 0; + return !!length && baseIndexOf(array, value, 0) > -1; +} -var baseFindIndex = __webpack_require__(/*! ./_baseFindIndex */ "./node_modules/lodash/_baseFindIndex.js"), - baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), - toInteger = __webpack_require__(/*! ./toInteger */ "./node_modules/lodash/toInteger.js"); +/** + * The base implementation of `_.findIndex` and `_.findLastIndex` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {number} fromIndex The index to search from. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function baseFindIndex(array, predicate, fromIndex, fromRight) { + var length = array.length, + index = fromIndex + (fromRight ? 1 : -1); -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeMax = Math.max; + while ((fromRight ? index-- : ++index < length)) { + if (predicate(array[index], index, array)) { + return index; + } + } + return -1; +} /** - * This method is like `_.find` except that it returns the index of the first - * element `predicate` returns truthy for instead of the element itself. + * The base implementation of `_.indexOf` without `fromIndex` bounds checks. * - * @static - * @memberOf _ - * @since 1.1.0 - * @category Array + * @private * @param {Array} array The array to inspect. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @param {number} [fromIndex=0] The index to search from. - * @returns {number} Returns the index of the found element, else `-1`. - * @example - * - * var users = [ - * { 'user': 'barney', 'active': false }, - * { 'user': 'fred', 'active': false }, - * { 'user': 'pebbles', 'active': true } - * ]; - * - * _.findIndex(users, function(o) { return o.user == 'barney'; }); - * // => 0 - * - * // The `_.matches` iteratee shorthand. - * _.findIndex(users, { 'user': 'fred', 'active': false }); - * // => 1 - * - * // The `_.matchesProperty` iteratee shorthand. - * _.findIndex(users, ['active', false]); - * // => 0 - * - * // The `_.property` iteratee shorthand. - * _.findIndex(users, 'active'); - * // => 2 + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. */ -function findIndex(array, predicate, fromIndex) { - var length = array == null ? 0 : array.length; - if (!length) { - return -1; +function baseIndexOf(array, value, fromIndex) { + if (value !== value) { + return baseFindIndex(array, baseIsNaN, fromIndex); } - var index = fromIndex == null ? 0 : toInteger(fromIndex); - if (index < 0) { - index = nativeMax(length + index, 0); + var index = fromIndex - 1, + length = array.length; + + while (++index < length) { + if (array[index] === value) { + return index; + } } - return baseFindIndex(array, baseIteratee(predicate, 3), index); + return -1; } -module.exports = findIndex; - +/** + * The base implementation of `_.isNaN` without support for number objects. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + */ +function baseIsNaN(value) { + return value !== value; +} -/***/ }), +/** + * Gets the number of `placeholder` occurrences in `array`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} placeholder The placeholder to search for. + * @returns {number} Returns the placeholder count. + */ +function countHolders(array, placeholder) { + var length = array.length, + result = 0; -/***/ "./node_modules/lodash/flatten.js": -/*!****************************************!*\ - !*** ./node_modules/lodash/flatten.js ***! - \****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + while (length--) { + if (array[length] === placeholder) { + result++; + } + } + return result; +} -var baseFlatten = __webpack_require__(/*! ./_baseFlatten */ "./node_modules/lodash/_baseFlatten.js"); +/** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ +function getValue(object, key) { + return object == null ? undefined : object[key]; +} /** - * Flattens `array` a single level deep. + * Checks if `value` is a host object in IE < 9. * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to flatten. - * @returns {Array} Returns the new flattened array. - * @example + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a host object, else `false`. + */ +function isHostObject(value) { + // Many host objects are `Object` objects that can coerce to strings + // despite having improperly defined `toString` methods. + var result = false; + if (value != null && typeof value.toString != 'function') { + try { + result = !!(value + ''); + } catch (e) {} + } + return result; +} + +/** + * Replaces all `placeholder` elements in `array` with an internal placeholder + * and returns an array of their indexes. * - * _.flatten([1, [2, [3, [4]], 5]]); - * // => [1, 2, [3, [4]], 5] + * @private + * @param {Array} array The array to modify. + * @param {*} placeholder The placeholder to replace. + * @returns {Array} Returns the new array of placeholder indexes. */ -function flatten(array) { - var length = array == null ? 0 : array.length; - return length ? baseFlatten(array, 1) : []; +function replaceHolders(array, placeholder) { + var index = -1, + length = array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (value === placeholder || value === PLACEHOLDER) { + array[index] = PLACEHOLDER; + result[resIndex++] = index; + } + } + return result; } -module.exports = flatten; +/** Used for built-in method references. */ +var funcProto = Function.prototype, + objectProto = Object.prototype; +/** Used to detect overreaching core-js shims. */ +var coreJsData = root['__core-js_shared__']; -/***/ }), +/** Used to detect methods masquerading as native. */ +var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; +}()); -/***/ "./node_modules/lodash/forEach.js": -/*!****************************************!*\ - !*** ./node_modules/lodash/forEach.js ***! - \****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; -var arrayEach = __webpack_require__(/*! ./_arrayEach */ "./node_modules/lodash/_arrayEach.js"), - baseEach = __webpack_require__(/*! ./_baseEach */ "./node_modules/lodash/_baseEach.js"), - castFunction = __webpack_require__(/*! ./_castFunction */ "./node_modules/lodash/_castFunction.js"), - isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"); +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; /** - * Iterates over elements of `collection` and invokes `iteratee` for each element. - * The iteratee is invoked with three arguments: (value, index|key, collection). - * Iteratee functions may exit iteration early by explicitly returning `false`. - * - * **Note:** As with other "Collections" methods, objects with a "length" - * property are iterated like arrays. To avoid this behavior use `_.forIn` - * or `_.forOwn` for object iteration. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @alias each - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Array|Object} Returns `collection`. - * @see _.forEachRight - * @example - * - * _.forEach([1, 2], function(value) { - * console.log(value); - * }); - * // => Logs `1` then `2`. - * - * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { - * console.log(key); - * }); - * // => Logs 'a' then 'b' (iteration order is not guaranteed). + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. */ -function forEach(collection, iteratee) { - var func = isArray(collection) ? arrayEach : baseEach; - return func(collection, castFunction(iteratee)); -} +var objectToString = objectProto.toString; -module.exports = forEach; +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); +/** Built-in value references. */ +var objectCreate = Object.create; -/***/ }), +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max, + nativeMin = Math.min; -/***/ "./node_modules/lodash/forIn.js": -/*!**************************************!*\ - !*** ./node_modules/lodash/forIn.js ***! - \**************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +/* Used to set `toString` methods. */ +var defineProperty = (function() { + var func = getNative(Object, 'defineProperty'), + name = getNative.name; -var baseFor = __webpack_require__(/*! ./_baseFor */ "./node_modules/lodash/_baseFor.js"), - castFunction = __webpack_require__(/*! ./_castFunction */ "./node_modules/lodash/_castFunction.js"), - keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js"); + return (name && name.length > 2) ? func : undefined; +}()); /** - * Iterates over own and inherited enumerable string keyed properties of an - * object and invokes `iteratee` for each property. The iteratee is invoked - * with three arguments: (value, key, object). Iteratee functions may exit - * iteration early by explicitly returning `false`. - * - * @static - * @memberOf _ - * @since 0.3.0 - * @category Object - * @param {Object} object The object to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Object} Returns `object`. - * @see _.forInRight - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; + * The base implementation of `_.create` without support for assigning + * properties to the created object. * - * _.forIn(new Foo, function(value, key) { - * console.log(key); - * }); - * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed). + * @private + * @param {Object} prototype The object to inherit from. + * @returns {Object} Returns the new object. */ -function forIn(object, iteratee) { - return object == null - ? object - : baseFor(object, castFunction(iteratee), keysIn); +function baseCreate(proto) { + return isObject(proto) ? objectCreate(proto) : {}; } -module.exports = forIn; - - -/***/ }), - -/***/ "./node_modules/lodash/get.js": -/*!************************************!*\ - !*** ./node_modules/lodash/get.js ***! - \************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var baseGet = __webpack_require__(/*! ./_baseGet */ "./node_modules/lodash/_baseGet.js"); - /** - * Gets the value at `path` of `object`. If the resolved value is - * `undefined`, the `defaultValue` is returned in its place. - * - * @static - * @memberOf _ - * @since 3.7.0 - * @category Object - * @param {Object} object The object to query. - * @param {Array|string} path The path of the property to get. - * @param {*} [defaultValue] The value returned for `undefined` resolved values. - * @returns {*} Returns the resolved value. - * @example - * - * var object = { 'a': [{ 'b': { 'c': 3 } }] }; - * - * _.get(object, 'a[0].b.c'); - * // => 3 - * - * _.get(object, ['a', '0', 'b', 'c']); - * // => 3 + * The base implementation of `_.isNative` without bad shim checks. * - * _.get(object, 'a.b.c', 'default'); - * // => 'default' + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. */ -function get(object, path, defaultValue) { - var result = object == null ? undefined : baseGet(object, path); - return result === undefined ? defaultValue : result; +function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); } -module.exports = get; - - -/***/ }), - -/***/ "./node_modules/lodash/has.js": -/*!************************************!*\ - !*** ./node_modules/lodash/has.js ***! - \************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +/** + * Creates an array that is the composition of partially applied arguments, + * placeholders, and provided arguments into a single array of arguments. + * + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to prepend to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. + */ +function composeArgs(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersLength = holders.length, + leftIndex = -1, + leftLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(leftLength + rangeLength), + isUncurried = !isCurried; -var baseHas = __webpack_require__(/*! ./_baseHas */ "./node_modules/lodash/_baseHas.js"), - hasPath = __webpack_require__(/*! ./_hasPath */ "./node_modules/lodash/_hasPath.js"); + while (++leftIndex < leftLength) { + result[leftIndex] = partials[leftIndex]; + } + while (++argsIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[holders[argsIndex]] = args[argsIndex]; + } + } + while (rangeLength--) { + result[leftIndex++] = args[argsIndex++]; + } + return result; +} /** - * Checks if `path` is a direct property of `object`. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @param {Array|string} path The path to check. - * @returns {boolean} Returns `true` if `path` exists, else `false`. - * @example - * - * var object = { 'a': { 'b': 2 } }; - * var other = _.create({ 'a': _.create({ 'b': 2 }) }); - * - * _.has(object, 'a'); - * // => true - * - * _.has(object, 'a.b'); - * // => true - * - * _.has(object, ['a', 'b']); - * // => true + * This function is like `composeArgs` except that the arguments composition + * is tailored for `_.partialRight`. * - * _.has(other, 'a'); - * // => false + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to append to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. */ -function has(object, path) { - return object != null && hasPath(object, path, baseHas); -} +function composeArgsRight(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersIndex = -1, + holdersLength = holders.length, + rightIndex = -1, + rightLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(rangeLength + rightLength), + isUncurried = !isCurried; -module.exports = has; + while (++argsIndex < rangeLength) { + result[argsIndex] = args[argsIndex]; + } + var offset = argsIndex; + while (++rightIndex < rightLength) { + result[offset + rightIndex] = partials[rightIndex]; + } + while (++holdersIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[offset + holders[holdersIndex]] = args[argsIndex++]; + } + } + return result; +} +/** + * Copies the values of `source` to `array`. + * + * @private + * @param {Array} source The array to copy values from. + * @param {Array} [array=[]] The array to copy values to. + * @returns {Array} Returns `array`. + */ +function copyArray(source, array) { + var index = -1, + length = source.length; -/***/ }), + array || (array = Array(length)); + while (++index < length) { + array[index] = source[index]; + } + return array; +} -/***/ "./node_modules/lodash/hasIn.js": -/*!**************************************!*\ - !*** ./node_modules/lodash/hasIn.js ***! - \**************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +/** + * Creates a function that wraps `func` to invoke it with the optional `this` + * binding of `thisArg`. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @returns {Function} Returns the new wrapped function. + */ +function createBind(func, bitmask, thisArg) { + var isBind = bitmask & BIND_FLAG, + Ctor = createCtor(func); -var baseHasIn = __webpack_require__(/*! ./_baseHasIn */ "./node_modules/lodash/_baseHasIn.js"), - hasPath = __webpack_require__(/*! ./_hasPath */ "./node_modules/lodash/_hasPath.js"); + function wrapper() { + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return fn.apply(isBind ? thisArg : this, arguments); + } + return wrapper; +} /** - * Checks if `path` is a direct or inherited property of `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Object - * @param {Object} object The object to query. - * @param {Array|string} path The path to check. - * @returns {boolean} Returns `true` if `path` exists, else `false`. - * @example - * - * var object = _.create({ 'a': _.create({ 'b': 2 }) }); - * - * _.hasIn(object, 'a'); - * // => true - * - * _.hasIn(object, 'a.b'); - * // => true - * - * _.hasIn(object, ['a', 'b']); - * // => true + * Creates a function that produces an instance of `Ctor` regardless of + * whether it was invoked as part of a `new` expression or by `call` or `apply`. * - * _.hasIn(object, 'b'); - * // => false + * @private + * @param {Function} Ctor The constructor to wrap. + * @returns {Function} Returns the new wrapped function. */ -function hasIn(object, path) { - return object != null && hasPath(object, path, baseHasIn); +function createCtor(Ctor) { + return function() { + // Use a `switch` statement to work with class constructors. See + // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist + // for more details. + var args = arguments; + switch (args.length) { + case 0: return new Ctor; + case 1: return new Ctor(args[0]); + case 2: return new Ctor(args[0], args[1]); + case 3: return new Ctor(args[0], args[1], args[2]); + case 4: return new Ctor(args[0], args[1], args[2], args[3]); + case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]); + case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); + case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + } + var thisBinding = baseCreate(Ctor.prototype), + result = Ctor.apply(thisBinding, args); + + // Mimic the constructor's `return` behavior. + // See https://es5.github.io/#x13.2.2 for more details. + return isObject(result) ? result : thisBinding; + }; } -module.exports = hasIn; +/** + * Creates a function that wraps `func` to enable currying. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {number} arity The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ +function createCurry(func, bitmask, arity) { + var Ctor = createCtor(func); + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length, + placeholder = getHolder(wrapper); -/***/ }), + while (index--) { + args[index] = arguments[index]; + } + var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder) + ? [] + : replaceHolders(args, placeholder); -/***/ "./node_modules/lodash/identity.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/identity.js ***! - \*****************************************/ -/***/ (function(module) { + length -= holders.length; + if (length < arity) { + return createRecurry( + func, bitmask, createHybrid, wrapper.placeholder, undefined, + args, holders, undefined, undefined, arity - length); + } + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return apply(fn, this, args); + } + return wrapper; +} /** - * This method returns the first argument it receives. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Util - * @param {*} value Any value. - * @returns {*} Returns `value`. - * @example - * - * var object = { 'a': 1 }; + * Creates a function that wraps `func` to invoke it with optional `this` + * binding of `thisArg`, partial application, and currying. * - * console.log(_.identity(object) === object); - * // => true + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [partialsRight] The arguments to append to those provided + * to the new function. + * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. */ -function identity(value) { - return value; -} - -module.exports = identity; - +function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) { + var isAry = bitmask & ARY_FLAG, + isBind = bitmask & BIND_FLAG, + isBindKey = bitmask & BIND_KEY_FLAG, + isCurried = bitmask & (CURRY_FLAG | CURRY_RIGHT_FLAG), + isFlip = bitmask & FLIP_FLAG, + Ctor = isBindKey ? undefined : createCtor(func); -/***/ }), + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length; -/***/ "./node_modules/lodash/isArguments.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/isArguments.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + while (index--) { + args[index] = arguments[index]; + } + if (isCurried) { + var placeholder = getHolder(wrapper), + holdersCount = countHolders(args, placeholder); + } + if (partials) { + args = composeArgs(args, partials, holders, isCurried); + } + if (partialsRight) { + args = composeArgsRight(args, partialsRight, holdersRight, isCurried); + } + length -= holdersCount; + if (isCurried && length < arity) { + var newHolders = replaceHolders(args, placeholder); + return createRecurry( + func, bitmask, createHybrid, wrapper.placeholder, thisArg, + args, newHolders, argPos, ary, arity - length + ); + } + var thisBinding = isBind ? thisArg : this, + fn = isBindKey ? thisBinding[func] : func; -var baseIsArguments = __webpack_require__(/*! ./_baseIsArguments */ "./node_modules/lodash/_baseIsArguments.js"), - isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); + length = args.length; + if (argPos) { + args = reorder(args, argPos); + } else if (isFlip && length > 1) { + args.reverse(); + } + if (isAry && ary < length) { + args.length = ary; + } + if (this && this !== root && this instanceof wrapper) { + fn = Ctor || createCtor(fn); + } + return fn.apply(thisBinding, args); + } + return wrapper; +} -/** Used for built-in method references. */ -var objectProto = Object.prototype; +/** + * Creates a function that wraps `func` to invoke it with the `this` binding + * of `thisArg` and `partials` prepended to the arguments it receives. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} partials The arguments to prepend to those provided to + * the new function. + * @returns {Function} Returns the new wrapped function. + */ +function createPartial(func, bitmask, thisArg, partials) { + var isBind = bitmask & BIND_FLAG, + Ctor = createCtor(func); -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; + function wrapper() { + var argsIndex = -1, + argsLength = arguments.length, + leftIndex = -1, + leftLength = partials.length, + args = Array(leftLength + argsLength), + fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; -/** Built-in value references. */ -var propertyIsEnumerable = objectProto.propertyIsEnumerable; + while (++leftIndex < leftLength) { + args[leftIndex] = partials[leftIndex]; + } + while (argsLength--) { + args[leftIndex++] = arguments[++argsIndex]; + } + return apply(fn, isBind ? thisArg : this, args); + } + return wrapper; +} /** - * Checks if `value` is likely an `arguments` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an `arguments` object, - * else `false`. - * @example - * - * _.isArguments(function() { return arguments; }()); - * // => true + * Creates a function that wraps `func` to continue currying. * - * _.isArguments([1, 2, 3]); - * // => false + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {Function} wrapFunc The function to create the `func` wrapper. + * @param {*} placeholder The placeholder value. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. */ -var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { - return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && - !propertyIsEnumerable.call(value, 'callee'); -}; - -module.exports = isArguments; +function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) { + var isCurry = bitmask & CURRY_FLAG, + newHolders = isCurry ? holders : undefined, + newHoldersRight = isCurry ? undefined : holders, + newPartials = isCurry ? partials : undefined, + newPartialsRight = isCurry ? undefined : partials; + bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG); + bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG); -/***/ }), + if (!(bitmask & CURRY_BOUND_FLAG)) { + bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG); + } -/***/ "./node_modules/lodash/isArray.js": -/*!****************************************!*\ - !*** ./node_modules/lodash/isArray.js ***! - \****************************************/ -/***/ (function(module) { + var result = wrapFunc(func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, newHoldersRight, argPos, ary, arity); + result.placeholder = placeholder; + return setWrapToString(result, func, bitmask); +} /** - * Checks if `value` is classified as an `Array` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an array, else `false`. - * @example - * - * _.isArray([1, 2, 3]); - * // => true - * - * _.isArray(document.body.children); - * // => false - * - * _.isArray('abc'); - * // => false + * Creates a function that either curries or invokes `func` with optional + * `this` binding and partially applied arguments. * - * _.isArray(_.noop); - * // => false + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. + * The bitmask may be composed of the following flags: + * 1 - `_.bind` + * 2 - `_.bindKey` + * 4 - `_.curry` or `_.curryRight` of a bound function + * 8 - `_.curry` + * 16 - `_.curryRight` + * 32 - `_.partial` + * 64 - `_.partialRight` + * 128 - `_.rearg` + * 256 - `_.ary` + * 512 - `_.flip` + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to be partially applied. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. */ -var isArray = Array.isArray; +function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) { + var isBindKey = bitmask & BIND_KEY_FLAG; + if (!isBindKey && typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + var length = partials ? partials.length : 0; + if (!length) { + bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG); + partials = holders = undefined; + } + ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0); + arity = arity === undefined ? arity : toInteger(arity); + length -= holders ? holders.length : 0; -module.exports = isArray; + if (bitmask & PARTIAL_RIGHT_FLAG) { + var partialsRight = partials, + holdersRight = holders; + partials = holders = undefined; + } -/***/ }), + var newData = [ + func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, + argPos, ary, arity + ]; -/***/ "./node_modules/lodash/isArrayLike.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/isArrayLike.js ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + func = newData[0]; + bitmask = newData[1]; + thisArg = newData[2]; + partials = newData[3]; + holders = newData[4]; + arity = newData[9] = newData[9] == null + ? (isBindKey ? 0 : func.length) + : nativeMax(newData[9] - length, 0); -var isFunction = __webpack_require__(/*! ./isFunction */ "./node_modules/lodash/isFunction.js"), - isLength = __webpack_require__(/*! ./isLength */ "./node_modules/lodash/isLength.js"); + if (!arity && bitmask & (CURRY_FLAG | CURRY_RIGHT_FLAG)) { + bitmask &= ~(CURRY_FLAG | CURRY_RIGHT_FLAG); + } + if (!bitmask || bitmask == BIND_FLAG) { + var result = createBind(func, bitmask, thisArg); + } else if (bitmask == CURRY_FLAG || bitmask == CURRY_RIGHT_FLAG) { + result = createCurry(func, bitmask, arity); + } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !holders.length) { + result = createPartial(func, bitmask, thisArg, partials); + } else { + result = createHybrid.apply(undefined, newData); + } + return setWrapToString(result, func, bitmask); +} /** - * Checks if `value` is array-like. A value is considered array-like if it's - * not a function and has a `value.length` that's an integer greater than or - * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is array-like, else `false`. - * @example - * - * _.isArrayLike([1, 2, 3]); - * // => true - * - * _.isArrayLike(document.body.children); - * // => true - * - * _.isArrayLike('abc'); - * // => true + * Gets the argument placeholder value for `func`. * - * _.isArrayLike(_.noop); - * // => false + * @private + * @param {Function} func The function to inspect. + * @returns {*} Returns the placeholder value. */ -function isArrayLike(value) { - return value != null && isLength(value.length) && !isFunction(value); +function getHolder(func) { + var object = func; + return object.placeholder; } -module.exports = isArrayLike; - - -/***/ }), - -/***/ "./node_modules/lodash/isArrayLikeObject.js": -/*!**************************************************!*\ - !*** ./node_modules/lodash/isArrayLikeObject.js ***! - \**************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"), - isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); - /** - * This method is like `_.isArrayLike` except that it also checks if `value` - * is an object. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an array-like object, - * else `false`. - * @example - * - * _.isArrayLikeObject([1, 2, 3]); - * // => true - * - * _.isArrayLikeObject(document.body.children); - * // => true - * - * _.isArrayLikeObject('abc'); - * // => false + * Gets the native function at `key` of `object`. * - * _.isArrayLikeObject(_.noop); - * // => false + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. */ -function isArrayLikeObject(value) { - return isObjectLike(value) && isArrayLike(value); +function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; } -module.exports = isArrayLikeObject; - - -/***/ }), - -/***/ "./node_modules/lodash/isBuffer.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/isBuffer.js ***! - \*****************************************/ -/***/ (function(module, exports, __webpack_require__) { - -/* module decorator */ module = __webpack_require__.nmd(module); -var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"), - stubFalse = __webpack_require__(/*! ./stubFalse */ "./node_modules/lodash/stubFalse.js"); - -/** Detect free variable `exports`. */ -var freeExports = true && exports && !exports.nodeType && exports; - -/** Detect free variable `module`. */ -var freeModule = freeExports && "object" == 'object' && module && !module.nodeType && module; - -/** Detect the popular CommonJS extension `module.exports`. */ -var moduleExports = freeModule && freeModule.exports === freeExports; - -/** Built-in value references. */ -var Buffer = moduleExports ? root.Buffer : undefined; - -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined; - /** - * Checks if `value` is a buffer. - * - * @static - * @memberOf _ - * @since 4.3.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. - * @example - * - * _.isBuffer(new Buffer(2)); - * // => true + * Extracts wrapper details from the `source` body comment. * - * _.isBuffer(new Uint8Array(2)); - * // => false + * @private + * @param {string} source The source to inspect. + * @returns {Array} Returns the wrapper details. */ -var isBuffer = nativeIsBuffer || stubFalse; - -module.exports = isBuffer; - - -/***/ }), - -/***/ "./node_modules/lodash/isEmpty.js": -/*!****************************************!*\ - !*** ./node_modules/lodash/isEmpty.js ***! - \****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var baseKeys = __webpack_require__(/*! ./_baseKeys */ "./node_modules/lodash/_baseKeys.js"), - getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"), - isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"), - isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), - isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"), - isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"), - isPrototype = __webpack_require__(/*! ./_isPrototype */ "./node_modules/lodash/_isPrototype.js"), - isTypedArray = __webpack_require__(/*! ./isTypedArray */ "./node_modules/lodash/isTypedArray.js"); - -/** `Object#toString` result references. */ -var mapTag = '[object Map]', - setTag = '[object Set]'; +function getWrapDetails(source) { + var match = source.match(reWrapDetails); + return match ? match[1].split(reSplitDetails) : []; +} -/** Used for built-in method references. */ -var objectProto = Object.prototype; +/** + * Inserts wrapper `details` in a comment at the top of the `source` body. + * + * @private + * @param {string} source The source to modify. + * @returns {Array} details The details to insert. + * @returns {string} Returns the modified source. + */ +function insertWrapDetails(source, details) { + var length = details.length, + lastIndex = length - 1; -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; + details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex]; + details = details.join(length > 2 ? ', ' : ' '); + return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n'); +} /** - * Checks if `value` is an empty object, collection, map, or set. - * - * Objects are considered empty if they have no own enumerable string keyed - * properties. - * - * Array-like values such as `arguments` objects, arrays, buffers, strings, or - * jQuery-like collections are considered empty if they have a `length` of `0`. - * Similarly, maps and sets are considered empty if they have a `size` of `0`. + * Checks if `value` is a valid array-like index. * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang + * @private * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is empty, else `false`. - * @example - * - * _.isEmpty(null); - * // => true - * - * _.isEmpty(true); - * // => true - * - * _.isEmpty(1); - * // => true - * - * _.isEmpty([1, 2, 3]); - * // => false - * - * _.isEmpty({ 'a': 1 }); - * // => false + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. */ -function isEmpty(value) { - if (value == null) { - return true; - } - if (isArrayLike(value) && - (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' || - isBuffer(value) || isTypedArray(value) || isArguments(value))) { - return !value.length; - } - var tag = getTag(value); - if (tag == mapTag || tag == setTag) { - return !value.size; - } - if (isPrototype(value)) { - return !baseKeys(value).length; - } - for (var key in value) { - if (hasOwnProperty.call(value, key)) { - return false; - } - } - return true; +function isIndex(value, length) { + length = length == null ? MAX_SAFE_INTEGER : length; + return !!length && + (typeof value == 'number' || reIsUint.test(value)) && + (value > -1 && value % 1 == 0 && value < length); } -module.exports = isEmpty; - - -/***/ }), - -/***/ "./node_modules/lodash/isFunction.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/isFunction.js ***! - \*******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +/** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ +function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); +} -var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), - isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"); +/** + * Reorder `array` according to the specified indexes where the element at + * the first index is assigned as the first element, the element at + * the second index is assigned as the second element, and so on. + * + * @private + * @param {Array} array The array to reorder. + * @param {Array} indexes The arranged array indexes. + * @returns {Array} Returns `array`. + */ +function reorder(array, indexes) { + var arrLength = array.length, + length = nativeMin(indexes.length, arrLength), + oldArray = copyArray(array); -/** `Object#toString` result references. */ -var asyncTag = '[object AsyncFunction]', - funcTag = '[object Function]', - genTag = '[object GeneratorFunction]', - proxyTag = '[object Proxy]'; + while (length--) { + var index = indexes[length]; + array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined; + } + return array; +} /** - * Checks if `value` is classified as a `Function` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a function, else `false`. - * @example + * Sets the `toString` method of `wrapper` to mimic the source of `reference` + * with wrapper details in a comment at the top of the source body. * - * _.isFunction(_); - * // => true + * @private + * @param {Function} wrapper The function to modify. + * @param {Function} reference The reference function. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Function} Returns `wrapper`. + */ +var setWrapToString = !defineProperty ? identity : function(wrapper, reference, bitmask) { + var source = (reference + ''); + return defineProperty(wrapper, 'toString', { + 'configurable': true, + 'enumerable': false, + 'value': constant(insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask))) + }); +}; + +/** + * Converts `func` to its source code. * - * _.isFunction(/abc/); - * // => false + * @private + * @param {Function} func The function to process. + * @returns {string} Returns the source code. */ -function isFunction(value) { - if (!isObject(value)) { - return false; +function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} } - // The use of `Object#toString` avoids issues with the `typeof` operator - // in Safari 9 which returns 'object' for typed arrays and other constructors. - var tag = baseGetTag(value); - return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; + return ''; } -module.exports = isFunction; - - -/***/ }), - -/***/ "./node_modules/lodash/isLength.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/isLength.js ***! - \*****************************************/ -/***/ (function(module) { - -/** Used as references for various `Number` constants. */ -var MAX_SAFE_INTEGER = 9007199254740991; +/** + * Updates wrapper `details` based on `bitmask` flags. + * + * @private + * @returns {Array} details The details to modify. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Array} Returns `details`. + */ +function updateWrapDetails(details, bitmask) { + arrayEach(wrapFlags, function(pair) { + var value = '_.' + pair[0]; + if ((bitmask & pair[1]) && !arrayIncludes(details, value)) { + details.push(value); + } + }); + return details.sort(); +} /** - * Checks if `value` is a valid array-like length. + * Creates a function that accepts arguments of `func` and either invokes + * `func` returning its result, if at least `arity` number of arguments have + * been provided, or returns a function that accepts the remaining `func` + * arguments, and so on. The arity of `func` may be specified if `func.length` + * is not sufficient. * - * **Note:** This method is loosely based on - * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for provided arguments. + * + * **Note:** This method doesn't set the "length" property of curried functions. * * @static * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @since 2.0.0 + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new curried function. * @example * - * _.isLength(3); - * // => true + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; * - * _.isLength(Number.MIN_VALUE); - * // => false + * var curried = _.curry(abc); * - * _.isLength(Infinity); - * // => false + * curried(1)(2)(3); + * // => [1, 2, 3] * - * _.isLength('3'); - * // => false + * curried(1, 2)(3); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // Curried with placeholders. + * curried(1)(_, 3)(2); + * // => [1, 2, 3] */ -function isLength(value) { - return typeof value == 'number' && - value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +function curry(func, arity, guard) { + arity = guard ? undefined : arity; + var result = createWrap(func, CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity); + result.placeholder = curry.placeholder; + return result; } -module.exports = isLength; - - -/***/ }), - -/***/ "./node_modules/lodash/isMap.js": -/*!**************************************!*\ - !*** ./node_modules/lodash/isMap.js ***! - \**************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var baseIsMap = __webpack_require__(/*! ./_baseIsMap */ "./node_modules/lodash/_baseIsMap.js"), - baseUnary = __webpack_require__(/*! ./_baseUnary */ "./node_modules/lodash/_baseUnary.js"), - nodeUtil = __webpack_require__(/*! ./_nodeUtil */ "./node_modules/lodash/_nodeUtil.js"); - -/* Node.js helper references. */ -var nodeIsMap = nodeUtil && nodeUtil.isMap; - /** - * Checks if `value` is classified as a `Map` object. + * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ - * @since 4.3.0 + * @since 0.1.0 * @category Lang * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a map, else `false`. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * - * _.isMap(new Map); + * _.isFunction(_); * // => true * - * _.isMap(new WeakMap); + * _.isFunction(/abc/); * // => false */ -var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; - -module.exports = isMap; - - -/***/ }), - -/***/ "./node_modules/lodash/isObject.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/isObject.js ***! - \*****************************************/ -/***/ (function(module) { +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 8-9 which returns 'object' for typed array and other constructors. + var tag = isObject(value) ? objectToString.call(value) : ''; + return tag == funcTag || tag == genTag; +} /** * Checks if `value` is the @@ -72668,20 +61834,9 @@ module.exports = isMap; */ function isObject(value) { var type = typeof value; - return value != null && (type == 'object' || type == 'function'); + return !!value && (type == 'object' || type == 'function'); } -module.exports = isObject; - - -/***/ }), - -/***/ "./node_modules/lodash/isObjectLike.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/isObjectLike.js ***! - \*********************************************/ -/***/ (function(module) { - /** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". @@ -72707,11538 +61862,10368 @@ module.exports = isObject; * // => false */ function isObjectLike(value) { - return value != null && typeof value == 'object'; + return !!value && typeof value == 'object'; } -module.exports = isObjectLike; - - -/***/ }), - -/***/ "./node_modules/lodash/isPlainObject.js": -/*!**********************************************!*\ - !*** ./node_modules/lodash/isPlainObject.js ***! - \**********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), - getPrototype = __webpack_require__(/*! ./_getPrototype */ "./node_modules/lodash/_getPrototype.js"), - isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); - -/** `Object#toString` result references. */ -var objectTag = '[object Object]'; - -/** Used for built-in method references. */ -var funcProto = Function.prototype, - objectProto = Object.prototype; - -/** Used to resolve the decompiled source of functions. */ -var funcToString = funcProto.toString; - -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; - -/** Used to infer the `Object` constructor. */ -var objectCtorString = funcToString.call(Object); - /** - * Checks if `value` is a plain object, that is, an object created by the - * `Object` constructor or one with a `[[Prototype]]` of `null`. + * Checks if `value` is classified as a `Symbol` primitive or object. * * @static * @memberOf _ - * @since 0.8.0 + * @since 4.0.0 * @category Lang * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. * @example * - * function Foo() { - * this.a = 1; - * } + * _.isSymbol(Symbol.iterator); + * // => true * - * _.isPlainObject(new Foo); + * _.isSymbol('abc'); * // => false + */ +function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike(value) && objectToString.call(value) == symbolTag); +} + +/** + * Converts `value` to a finite number. * - * _.isPlainObject([1, 2, 3]); - * // => false + * @static + * @memberOf _ + * @since 4.12.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted number. + * @example * - * _.isPlainObject({ 'x': 0, 'y': 0 }); - * // => true + * _.toFinite(3.2); + * // => 3.2 * - * _.isPlainObject(Object.create(null)); - * // => true + * _.toFinite(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toFinite(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toFinite('3.2'); + * // => 3.2 */ -function isPlainObject(value) { - if (!isObjectLike(value) || baseGetTag(value) != objectTag) { - return false; +function toFinite(value) { + if (!value) { + return value === 0 ? value : 0; } - var proto = getPrototype(value); - if (proto === null) { - return true; + value = toNumber(value); + if (value === INFINITY || value === -INFINITY) { + var sign = (value < 0 ? -1 : 1); + return sign * MAX_INTEGER; } - var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; - return typeof Ctor == 'function' && Ctor instanceof Ctor && - funcToString.call(Ctor) == objectCtorString; + return value === value ? value : 0; } -module.exports = isPlainObject; - - -/***/ }), - -/***/ "./node_modules/lodash/isSet.js": -/*!**************************************!*\ - !*** ./node_modules/lodash/isSet.js ***! - \**************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var baseIsSet = __webpack_require__(/*! ./_baseIsSet */ "./node_modules/lodash/_baseIsSet.js"), - baseUnary = __webpack_require__(/*! ./_baseUnary */ "./node_modules/lodash/_baseUnary.js"), - nodeUtil = __webpack_require__(/*! ./_nodeUtil */ "./node_modules/lodash/_nodeUtil.js"); - -/* Node.js helper references. */ -var nodeIsSet = nodeUtil && nodeUtil.isSet; - /** - * Checks if `value` is classified as a `Set` object. + * Converts `value` to an integer. + * + * **Note:** This method is loosely based on + * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). * * @static * @memberOf _ - * @since 4.3.0 + * @since 4.0.0 * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a set, else `false`. + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. * @example * - * _.isSet(new Set); - * // => true + * _.toInteger(3.2); + * // => 3 * - * _.isSet(new WeakSet); - * // => false + * _.toInteger(Number.MIN_VALUE); + * // => 0 + * + * _.toInteger(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toInteger('3.2'); + * // => 3 */ -var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; - -module.exports = isSet; - - -/***/ }), - -/***/ "./node_modules/lodash/isString.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/isString.js ***! - \*****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), - isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), - isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); +function toInteger(value) { + var result = toFinite(value), + remainder = result % 1; -/** `Object#toString` result references. */ -var stringTag = '[object String]'; + return result === result ? (remainder ? result - remainder : result) : 0; +} /** - * Checks if `value` is classified as a `String` primitive or object. + * Converts `value` to a number. * * @static - * @since 0.1.0 * @memberOf _ + * @since 4.0.0 * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a string, else `false`. + * @param {*} value The value to process. + * @returns {number} Returns the number. * @example * - * _.isString('abc'); - * // => true + * _.toNumber(3.2); + * // => 3.2 * - * _.isString(1); - * // => false + * _.toNumber(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toNumber(Infinity); + * // => Infinity + * + * _.toNumber('3.2'); + * // => 3.2 */ -function isString(value) { - return typeof value == 'string' || - (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag); +function toNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol(value)) { + return NAN; + } + if (isObject(value)) { + var other = typeof value.valueOf == 'function' ? value.valueOf() : value; + value = isObject(other) ? (other + '') : other; + } + if (typeof value != 'string') { + return value === 0 ? value : +value; + } + value = value.replace(reTrim, ''); + var isBinary = reIsBinary.test(value); + return (isBinary || reIsOctal.test(value)) + ? freeParseInt(value.slice(2), isBinary ? 2 : 8) + : (reIsBadHex.test(value) ? NAN : +value); } -module.exports = isString; - - -/***/ }), - -/***/ "./node_modules/lodash/isSymbol.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/isSymbol.js ***! - \*****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), - isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); - -/** `Object#toString` result references. */ -var symbolTag = '[object Symbol]'; - /** - * Checks if `value` is classified as a `Symbol` primitive or object. + * Creates a function that returns `value`. * * @static * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @since 2.4.0 + * @category Util + * @param {*} value The value to return from the new function. + * @returns {Function} Returns the new constant function. * @example * - * _.isSymbol(Symbol.iterator); + * var objects = _.times(2, _.constant({ 'a': 1 })); + * + * console.log(objects); + * // => [{ 'a': 1 }, { 'a': 1 }] + * + * console.log(objects[0] === objects[1]); * // => true + */ +function constant(value) { + return function() { + return value; + }; +} + +/** + * This method returns the first argument it receives. * - * _.isSymbol('abc'); - * // => false + * @static + * @since 0.1.0 + * @memberOf _ + * @category Util + * @param {*} value Any value. + * @returns {*} Returns `value`. + * @example + * + * var object = { 'a': 1 }; + * + * console.log(_.identity(object) === object); + * // => true */ -function isSymbol(value) { - return typeof value == 'symbol' || - (isObjectLike(value) && baseGetTag(value) == symbolTag); +function identity(value) { + return value; } -module.exports = isSymbol; +// Assign default placeholders. +curry.placeholder = {}; + +module.exports = curry; /***/ }), -/***/ "./node_modules/lodash/isTypedArray.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/isTypedArray.js ***! - \*********************************************/ +/***/ "./node_modules/lodash/_DataView.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/_DataView.js ***! + \******************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var baseIsTypedArray = __webpack_require__(/*! ./_baseIsTypedArray */ "./node_modules/lodash/_baseIsTypedArray.js"), - baseUnary = __webpack_require__(/*! ./_baseUnary */ "./node_modules/lodash/_baseUnary.js"), - nodeUtil = __webpack_require__(/*! ./_nodeUtil */ "./node_modules/lodash/_nodeUtil.js"); +var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), + root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); -/* Node.js helper references. */ -var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; +/* Built-in method references that are verified to be native. */ +var DataView = getNative(root, 'DataView'); + +module.exports = DataView; + + +/***/ }), + +/***/ "./node_modules/lodash/_Hash.js": +/*!**************************************!*\ + !*** ./node_modules/lodash/_Hash.js ***! + \**************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var hashClear = __webpack_require__(/*! ./_hashClear */ "./node_modules/lodash/_hashClear.js"), + hashDelete = __webpack_require__(/*! ./_hashDelete */ "./node_modules/lodash/_hashDelete.js"), + hashGet = __webpack_require__(/*! ./_hashGet */ "./node_modules/lodash/_hashGet.js"), + hashHas = __webpack_require__(/*! ./_hashHas */ "./node_modules/lodash/_hashHas.js"), + hashSet = __webpack_require__(/*! ./_hashSet */ "./node_modules/lodash/_hashSet.js"); /** - * Checks if `value` is classified as a typed array. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. - * @example - * - * _.isTypedArray(new Uint8Array); - * // => true + * Creates a hash object. * - * _.isTypedArray([]); - * // => false + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. */ -var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; +function Hash(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +// Add methods to `Hash`. +Hash.prototype.clear = hashClear; +Hash.prototype['delete'] = hashDelete; +Hash.prototype.get = hashGet; +Hash.prototype.has = hashHas; +Hash.prototype.set = hashSet; -module.exports = isTypedArray; +module.exports = Hash; /***/ }), -/***/ "./node_modules/lodash/isUndefined.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/isUndefined.js ***! - \********************************************/ -/***/ (function(module) { +/***/ "./node_modules/lodash/_ListCache.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash/_ListCache.js ***! + \*******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var listCacheClear = __webpack_require__(/*! ./_listCacheClear */ "./node_modules/lodash/_listCacheClear.js"), + listCacheDelete = __webpack_require__(/*! ./_listCacheDelete */ "./node_modules/lodash/_listCacheDelete.js"), + listCacheGet = __webpack_require__(/*! ./_listCacheGet */ "./node_modules/lodash/_listCacheGet.js"), + listCacheHas = __webpack_require__(/*! ./_listCacheHas */ "./node_modules/lodash/_listCacheHas.js"), + listCacheSet = __webpack_require__(/*! ./_listCacheSet */ "./node_modules/lodash/_listCacheSet.js"); /** - * Checks if `value` is `undefined`. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. - * @example - * - * _.isUndefined(void 0); - * // => true + * Creates an list cache object. * - * _.isUndefined(null); - * // => false + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. */ -function isUndefined(value) { - return value === undefined; +function ListCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } } -module.exports = isUndefined; +// Add methods to `ListCache`. +ListCache.prototype.clear = listCacheClear; +ListCache.prototype['delete'] = listCacheDelete; +ListCache.prototype.get = listCacheGet; +ListCache.prototype.has = listCacheHas; +ListCache.prototype.set = listCacheSet; + +module.exports = ListCache; /***/ }), -/***/ "./node_modules/lodash/keys.js": +/***/ "./node_modules/lodash/_Map.js": /*!*************************************!*\ - !*** ./node_modules/lodash/keys.js ***! + !*** ./node_modules/lodash/_Map.js ***! \*************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var arrayLikeKeys = __webpack_require__(/*! ./_arrayLikeKeys */ "./node_modules/lodash/_arrayLikeKeys.js"), - baseKeys = __webpack_require__(/*! ./_baseKeys */ "./node_modules/lodash/_baseKeys.js"), - isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"); +var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), + root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); -/** - * Creates an array of the own enumerable property names of `object`. - * - * **Note:** Non-object values are coerced to objects. See the - * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) - * for more details. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.keys(new Foo); - * // => ['a', 'b'] (iteration order is not guaranteed) - * - * _.keys('hi'); - * // => ['0', '1'] - */ -function keys(object) { - return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); -} +/* Built-in method references that are verified to be native. */ +var Map = getNative(root, 'Map'); -module.exports = keys; +module.exports = Map; /***/ }), -/***/ "./node_modules/lodash/keysIn.js": -/*!***************************************!*\ - !*** ./node_modules/lodash/keysIn.js ***! - \***************************************/ +/***/ "./node_modules/lodash/_MapCache.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/_MapCache.js ***! + \******************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var arrayLikeKeys = __webpack_require__(/*! ./_arrayLikeKeys */ "./node_modules/lodash/_arrayLikeKeys.js"), - baseKeysIn = __webpack_require__(/*! ./_baseKeysIn */ "./node_modules/lodash/_baseKeysIn.js"), - isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"); +var mapCacheClear = __webpack_require__(/*! ./_mapCacheClear */ "./node_modules/lodash/_mapCacheClear.js"), + mapCacheDelete = __webpack_require__(/*! ./_mapCacheDelete */ "./node_modules/lodash/_mapCacheDelete.js"), + mapCacheGet = __webpack_require__(/*! ./_mapCacheGet */ "./node_modules/lodash/_mapCacheGet.js"), + mapCacheHas = __webpack_require__(/*! ./_mapCacheHas */ "./node_modules/lodash/_mapCacheHas.js"), + mapCacheSet = __webpack_require__(/*! ./_mapCacheSet */ "./node_modules/lodash/_mapCacheSet.js"); /** - * Creates an array of the own and inherited enumerable property names of `object`. - * - * **Note:** Non-object values are coerced to objects. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; + * Creates a map cache object to store key-value pairs. * - * _.keysIn(new Foo); - * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. */ -function keysIn(object) { - return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); +function MapCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } } -module.exports = keysIn; +// Add methods to `MapCache`. +MapCache.prototype.clear = mapCacheClear; +MapCache.prototype['delete'] = mapCacheDelete; +MapCache.prototype.get = mapCacheGet; +MapCache.prototype.has = mapCacheHas; +MapCache.prototype.set = mapCacheSet; + +module.exports = MapCache; /***/ }), -/***/ "./node_modules/lodash/last.js": -/*!*************************************!*\ - !*** ./node_modules/lodash/last.js ***! - \*************************************/ -/***/ (function(module) { +/***/ "./node_modules/lodash/_Promise.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/_Promise.js ***! + \*****************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -/** - * Gets the last element of `array`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to query. - * @returns {*} Returns the last element of `array`. - * @example - * - * _.last([1, 2, 3]); - * // => 3 - */ -function last(array) { - var length = array == null ? 0 : array.length; - return length ? array[length - 1] : undefined; -} +var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), + root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); -module.exports = last; +/* Built-in method references that are verified to be native. */ +var Promise = getNative(root, 'Promise'); + +module.exports = Promise; /***/ }), -/***/ "./node_modules/lodash/map.js": -/*!************************************!*\ - !*** ./node_modules/lodash/map.js ***! - \************************************/ +/***/ "./node_modules/lodash/_Set.js": +/*!*************************************!*\ + !*** ./node_modules/lodash/_Set.js ***! + \*************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var arrayMap = __webpack_require__(/*! ./_arrayMap */ "./node_modules/lodash/_arrayMap.js"), - baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), - baseMap = __webpack_require__(/*! ./_baseMap */ "./node_modules/lodash/_baseMap.js"), - isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"); +var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), + root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); -/** - * Creates an array of values by running each element in `collection` thru - * `iteratee`. The iteratee is invoked with three arguments: - * (value, index|key, collection). - * - * Many lodash methods are guarded to work as iteratees for methods like - * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. - * - * The guarded methods are: - * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, - * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, - * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, - * `template`, `trim`, `trimEnd`, `trimStart`, and `words` - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new mapped array. - * @example - * - * function square(n) { - * return n * n; - * } - * - * _.map([4, 8], square); - * // => [16, 64] - * - * _.map({ 'a': 4, 'b': 8 }, square); - * // => [16, 64] (iteration order is not guaranteed) - * - * var users = [ - * { 'user': 'barney' }, - * { 'user': 'fred' } - * ]; - * - * // The `_.property` iteratee shorthand. - * _.map(users, 'user'); - * // => ['barney', 'fred'] - */ -function map(collection, iteratee) { - var func = isArray(collection) ? arrayMap : baseMap; - return func(collection, baseIteratee(iteratee, 3)); -} +/* Built-in method references that are verified to be native. */ +var Set = getNative(root, 'Set'); -module.exports = map; +module.exports = Set; /***/ }), -/***/ "./node_modules/lodash/mapValues.js": +/***/ "./node_modules/lodash/_SetCache.js": /*!******************************************!*\ - !*** ./node_modules/lodash/mapValues.js ***! + !*** ./node_modules/lodash/_SetCache.js ***! \******************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ "./node_modules/lodash/_baseAssignValue.js"), - baseForOwn = __webpack_require__(/*! ./_baseForOwn */ "./node_modules/lodash/_baseForOwn.js"), - baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"); +var MapCache = __webpack_require__(/*! ./_MapCache */ "./node_modules/lodash/_MapCache.js"), + setCacheAdd = __webpack_require__(/*! ./_setCacheAdd */ "./node_modules/lodash/_setCacheAdd.js"), + setCacheHas = __webpack_require__(/*! ./_setCacheHas */ "./node_modules/lodash/_setCacheHas.js"); /** - * Creates an object with the same keys as `object` and values generated - * by running each own enumerable string keyed property of `object` thru - * `iteratee`. The iteratee is invoked with three arguments: - * (value, key, object). - * - * @static - * @memberOf _ - * @since 2.4.0 - * @category Object - * @param {Object} object The object to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Object} Returns the new mapped object. - * @see _.mapKeys - * @example - * - * var users = { - * 'fred': { 'user': 'fred', 'age': 40 }, - * 'pebbles': { 'user': 'pebbles', 'age': 1 } - * }; * - * _.mapValues(users, function(o) { return o.age; }); - * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) + * Creates an array cache object to store unique values. * - * // The `_.property` iteratee shorthand. - * _.mapValues(users, 'age'); - * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) + * @private + * @constructor + * @param {Array} [values] The values to cache. */ -function mapValues(object, iteratee) { - var result = {}; - iteratee = baseIteratee(iteratee, 3); +function SetCache(values) { + var index = -1, + length = values == null ? 0 : values.length; - baseForOwn(object, function(value, key, object) { - baseAssignValue(result, key, iteratee(value, key, object)); - }); - return result; + this.__data__ = new MapCache; + while (++index < length) { + this.add(values[index]); + } } -module.exports = mapValues; +// Add methods to `SetCache`. +SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; +SetCache.prototype.has = setCacheHas; + +module.exports = SetCache; /***/ }), -/***/ "./node_modules/lodash/max.js": -/*!************************************!*\ - !*** ./node_modules/lodash/max.js ***! - \************************************/ +/***/ "./node_modules/lodash/_Stack.js": +/*!***************************************!*\ + !*** ./node_modules/lodash/_Stack.js ***! + \***************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var baseExtremum = __webpack_require__(/*! ./_baseExtremum */ "./node_modules/lodash/_baseExtremum.js"), - baseGt = __webpack_require__(/*! ./_baseGt */ "./node_modules/lodash/_baseGt.js"), - identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js"); +var ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"), + stackClear = __webpack_require__(/*! ./_stackClear */ "./node_modules/lodash/_stackClear.js"), + stackDelete = __webpack_require__(/*! ./_stackDelete */ "./node_modules/lodash/_stackDelete.js"), + stackGet = __webpack_require__(/*! ./_stackGet */ "./node_modules/lodash/_stackGet.js"), + stackHas = __webpack_require__(/*! ./_stackHas */ "./node_modules/lodash/_stackHas.js"), + stackSet = __webpack_require__(/*! ./_stackSet */ "./node_modules/lodash/_stackSet.js"); /** - * Computes the maximum value of `array`. If `array` is empty or falsey, - * `undefined` is returned. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Math - * @param {Array} array The array to iterate over. - * @returns {*} Returns the maximum value. - * @example - * - * _.max([4, 2, 8, 6]); - * // => 8 + * Creates a stack cache object to store key-value pairs. * - * _.max([]); - * // => undefined + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. */ -function max(array) { - return (array && array.length) - ? baseExtremum(array, identity, baseGt) - : undefined; +function Stack(entries) { + var data = this.__data__ = new ListCache(entries); + this.size = data.size; } -module.exports = max; +// Add methods to `Stack`. +Stack.prototype.clear = stackClear; +Stack.prototype['delete'] = stackDelete; +Stack.prototype.get = stackGet; +Stack.prototype.has = stackHas; +Stack.prototype.set = stackSet; + +module.exports = Stack; /***/ }), -/***/ "./node_modules/lodash/memoize.js": +/***/ "./node_modules/lodash/_Symbol.js": /*!****************************************!*\ - !*** ./node_modules/lodash/memoize.js ***! + !*** ./node_modules/lodash/_Symbol.js ***! \****************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var MapCache = __webpack_require__(/*! ./_MapCache */ "./node_modules/lodash/_MapCache.js"); +var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); -/** Error message constants. */ -var FUNC_ERROR_TEXT = 'Expected a function'; +/** Built-in value references. */ +var Symbol = root.Symbol; + +module.exports = Symbol; + + +/***/ }), + +/***/ "./node_modules/lodash/_Uint8Array.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_Uint8Array.js ***! + \********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); + +/** Built-in value references. */ +var Uint8Array = root.Uint8Array; + +module.exports = Uint8Array; + + +/***/ }), + +/***/ "./node_modules/lodash/_WeakMap.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/_WeakMap.js ***! + \*****************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), + root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); + +/* Built-in method references that are verified to be native. */ +var WeakMap = getNative(root, 'WeakMap'); + +module.exports = WeakMap; + + +/***/ }), + +/***/ "./node_modules/lodash/_apply.js": +/*!***************************************!*\ + !*** ./node_modules/lodash/_apply.js ***! + \***************************************/ +/***/ (function(module) { /** - * Creates a function that memoizes the result of `func`. If `resolver` is - * provided, it determines the cache key for storing the result based on the - * arguments provided to the memoized function. By default, the first argument - * provided to the memoized function is used as the map cache key. The `func` - * is invoked with the `this` binding of the memoized function. - * - * **Note:** The cache is exposed as the `cache` property on the memoized - * function. Its creation may be customized by replacing the `_.memoize.Cache` - * constructor with one whose instances implement the - * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) - * method interface of `clear`, `delete`, `get`, `has`, and `set`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to have its output memoized. - * @param {Function} [resolver] The function to resolve the cache key. - * @returns {Function} Returns the new memoized function. - * @example - * - * var object = { 'a': 1, 'b': 2 }; - * var other = { 'c': 3, 'd': 4 }; - * - * var values = _.memoize(_.values); - * values(object); - * // => [1, 2] - * - * values(other); - * // => [3, 4] - * - * object.a = 2; - * values(object); - * // => [1, 2] - * - * // Modify the result cache. - * values.cache.set(object, ['a', 'b']); - * values(object); - * // => ['a', 'b'] + * A faster alternative to `Function#apply`, this function invokes `func` + * with the `this` binding of `thisArg` and the arguments of `args`. * - * // Replace `_.memoize.Cache`. - * _.memoize.Cache = WeakMap; + * @private + * @param {Function} func The function to invoke. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} args The arguments to invoke `func` with. + * @returns {*} Returns the result of `func`. */ -function memoize(func, resolver) { - if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { - throw new TypeError(FUNC_ERROR_TEXT); +function apply(func, thisArg, args) { + switch (args.length) { + case 0: return func.call(thisArg); + case 1: return func.call(thisArg, args[0]); + case 2: return func.call(thisArg, args[0], args[1]); + case 3: return func.call(thisArg, args[0], args[1], args[2]); } - var memoized = function() { - var args = arguments, - key = resolver ? resolver.apply(this, args) : args[0], - cache = memoized.cache; + return func.apply(thisArg, args); +} - if (cache.has(key)) { - return cache.get(key); +module.exports = apply; + + +/***/ }), + +/***/ "./node_modules/lodash/_arrayEach.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash/_arrayEach.js ***! + \*******************************************/ +/***/ (function(module) { + +/** + * A specialized version of `_.forEach` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ +function arrayEach(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (iteratee(array[index], index, array) === false) { + break; } - var result = func.apply(this, args); - memoized.cache = cache.set(key, result) || cache; - return result; - }; - memoized.cache = new (memoize.Cache || MapCache); - return memoized; + } + return array; } -// Expose `MapCache`. -memoize.Cache = MapCache; - -module.exports = memoize; +module.exports = arrayEach; /***/ }), -/***/ "./node_modules/lodash/merge.js": -/*!**************************************!*\ - !*** ./node_modules/lodash/merge.js ***! - \**************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var baseMerge = __webpack_require__(/*! ./_baseMerge */ "./node_modules/lodash/_baseMerge.js"), - createAssigner = __webpack_require__(/*! ./_createAssigner */ "./node_modules/lodash/_createAssigner.js"); +/***/ "./node_modules/lodash/_arrayFilter.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_arrayFilter.js ***! + \*********************************************/ +/***/ (function(module) { /** - * This method is like `_.assign` except that it recursively merges own and - * inherited enumerable string keyed properties of source objects into the - * destination object. Source properties that resolve to `undefined` are - * skipped if a destination value exists. Array and plain object properties - * are merged recursively. Other objects and value types are overridden by - * assignment. Source objects are applied from left to right. Subsequent - * sources overwrite property assignments of previous sources. - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 0.5.0 - * @category Object - * @param {Object} object The destination object. - * @param {...Object} [sources] The source objects. - * @returns {Object} Returns `object`. - * @example - * - * var object = { - * 'a': [{ 'b': 2 }, { 'd': 4 }] - * }; - * - * var other = { - * 'a': [{ 'c': 3 }, { 'e': 5 }] - * }; + * A specialized version of `_.filter` for arrays without support for + * iteratee shorthands. * - * _.merge(object, other); - * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. */ -var merge = createAssigner(function(object, source, srcIndex) { - baseMerge(object, source, srcIndex); -}); +function arrayFilter(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; -module.exports = merge; + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result[resIndex++] = value; + } + } + return result; +} + +module.exports = arrayFilter; /***/ }), -/***/ "./node_modules/lodash/min.js": -/*!************************************!*\ - !*** ./node_modules/lodash/min.js ***! - \************************************/ +/***/ "./node_modules/lodash/_arrayIncludes.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash/_arrayIncludes.js ***! + \***********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var baseExtremum = __webpack_require__(/*! ./_baseExtremum */ "./node_modules/lodash/_baseExtremum.js"), - baseLt = __webpack_require__(/*! ./_baseLt */ "./node_modules/lodash/_baseLt.js"), - identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js"); +var baseIndexOf = __webpack_require__(/*! ./_baseIndexOf */ "./node_modules/lodash/_baseIndexOf.js"); /** - * Computes the minimum value of `array`. If `array` is empty or falsey, - * `undefined` is returned. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Math - * @param {Array} array The array to iterate over. - * @returns {*} Returns the minimum value. - * @example - * - * _.min([4, 2, 8, 6]); - * // => 2 + * A specialized version of `_.includes` for arrays without support for + * specifying an index to search from. * - * _.min([]); - * // => undefined + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @returns {boolean} Returns `true` if `target` is found, else `false`. */ -function min(array) { - return (array && array.length) - ? baseExtremum(array, identity, baseLt) - : undefined; +function arrayIncludes(array, value) { + var length = array == null ? 0 : array.length; + return !!length && baseIndexOf(array, value, 0) > -1; } -module.exports = min; +module.exports = arrayIncludes; /***/ }), -/***/ "./node_modules/lodash/minBy.js": -/*!**************************************!*\ - !*** ./node_modules/lodash/minBy.js ***! - \**************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var baseExtremum = __webpack_require__(/*! ./_baseExtremum */ "./node_modules/lodash/_baseExtremum.js"), - baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), - baseLt = __webpack_require__(/*! ./_baseLt */ "./node_modules/lodash/_baseLt.js"); +/***/ "./node_modules/lodash/_arrayIncludesWith.js": +/*!***************************************************!*\ + !*** ./node_modules/lodash/_arrayIncludesWith.js ***! + \***************************************************/ +/***/ (function(module) { /** - * This method is like `_.min` except that it accepts `iteratee` which is - * invoked for each element in `array` to generate the criterion by which - * the value is ranked. The iteratee is invoked with one argument: (value). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Math - * @param {Array} array The array to iterate over. - * @param {Function} [iteratee=_.identity] The iteratee invoked per element. - * @returns {*} Returns the minimum value. - * @example - * - * var objects = [{ 'n': 1 }, { 'n': 2 }]; - * - * _.minBy(objects, function(o) { return o.n; }); - * // => { 'n': 1 } + * This function is like `arrayIncludes` except that it accepts a comparator. * - * // The `_.property` iteratee shorthand. - * _.minBy(objects, 'n'); - * // => { 'n': 1 } + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @param {Function} comparator The comparator invoked per element. + * @returns {boolean} Returns `true` if `target` is found, else `false`. */ -function minBy(array, iteratee) { - return (array && array.length) - ? baseExtremum(array, baseIteratee(iteratee, 2), baseLt) - : undefined; +function arrayIncludesWith(array, value, comparator) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (comparator(value, array[index])) { + return true; + } + } + return false; } -module.exports = minBy; +module.exports = arrayIncludesWith; /***/ }), -/***/ "./node_modules/lodash/noop.js": -/*!*************************************!*\ - !*** ./node_modules/lodash/noop.js ***! - \*************************************/ -/***/ (function(module) { +/***/ "./node_modules/lodash/_arrayLikeKeys.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash/_arrayLikeKeys.js ***! + \***********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var baseTimes = __webpack_require__(/*! ./_baseTimes */ "./node_modules/lodash/_baseTimes.js"), + isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"), + isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), + isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"), + isIndex = __webpack_require__(/*! ./_isIndex */ "./node_modules/lodash/_isIndex.js"), + isTypedArray = __webpack_require__(/*! ./isTypedArray */ "./node_modules/lodash/isTypedArray.js"); + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; /** - * This method returns `undefined`. - * - * @static - * @memberOf _ - * @since 2.3.0 - * @category Util - * @example + * Creates an array of the enumerable property names of the array-like `value`. * - * _.times(2, _.noop); - * // => [undefined, undefined] + * @private + * @param {*} value The value to query. + * @param {boolean} inherited Specify returning inherited property names. + * @returns {Array} Returns the array of property names. */ -function noop() { - // No operation performed. +function arrayLikeKeys(value, inherited) { + var isArr = isArray(value), + isArg = !isArr && isArguments(value), + isBuff = !isArr && !isArg && isBuffer(value), + isType = !isArr && !isArg && !isBuff && isTypedArray(value), + skipIndexes = isArr || isArg || isBuff || isType, + result = skipIndexes ? baseTimes(value.length, String) : [], + length = result.length; + + for (var key in value) { + if ((inherited || hasOwnProperty.call(value, key)) && + !(skipIndexes && ( + // Safari 9 has enumerable `arguments.length` in strict mode. + key == 'length' || + // Node.js 0.10 has enumerable non-index properties on buffers. + (isBuff && (key == 'offset' || key == 'parent')) || + // PhantomJS 2 has enumerable non-index properties on typed arrays. + (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || + // Skip index properties. + isIndex(key, length) + ))) { + result.push(key); + } + } + return result; } -module.exports = noop; +module.exports = arrayLikeKeys; /***/ }), -/***/ "./node_modules/lodash/now.js": -/*!************************************!*\ - !*** ./node_modules/lodash/now.js ***! - \************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); +/***/ "./node_modules/lodash/_arrayMap.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/_arrayMap.js ***! + \******************************************/ +/***/ (function(module) { /** - * Gets the timestamp of the number of milliseconds that have elapsed since - * the Unix epoch (1 January 1970 00:00:00 UTC). - * - * @static - * @memberOf _ - * @since 2.4.0 - * @category Date - * @returns {number} Returns the timestamp. - * @example + * A specialized version of `_.map` for arrays without support for iteratee + * shorthands. * - * _.defer(function(stamp) { - * console.log(_.now() - stamp); - * }, _.now()); - * // => Logs the number of milliseconds it took for the deferred invocation. + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. */ -var now = function() { - return root.Date.now(); -}; +function arrayMap(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length, + result = Array(length); -module.exports = now; + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; +} +module.exports = arrayMap; -/***/ }), -/***/ "./node_modules/lodash/pick.js": -/*!*************************************!*\ - !*** ./node_modules/lodash/pick.js ***! - \*************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +/***/ }), -var basePick = __webpack_require__(/*! ./_basePick */ "./node_modules/lodash/_basePick.js"), - flatRest = __webpack_require__(/*! ./_flatRest */ "./node_modules/lodash/_flatRest.js"); +/***/ "./node_modules/lodash/_arrayPush.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash/_arrayPush.js ***! + \*******************************************/ +/***/ (function(module) { /** - * Creates an object composed of the picked `object` properties. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The source object. - * @param {...(string|string[])} [paths] The property paths to pick. - * @returns {Object} Returns the new object. - * @example - * - * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * Appends the elements of `values` to `array`. * - * _.pick(object, ['a', 'c']); - * // => { 'a': 1, 'c': 3 } + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to append. + * @returns {Array} Returns `array`. */ -var pick = flatRest(function(object, paths) { - return object == null ? {} : basePick(object, paths); -}); +function arrayPush(array, values) { + var index = -1, + length = values.length, + offset = array.length; -module.exports = pick; + while (++index < length) { + array[offset + index] = values[index]; + } + return array; +} +module.exports = arrayPush; -/***/ }), -/***/ "./node_modules/lodash/property.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/property.js ***! - \*****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +/***/ }), -var baseProperty = __webpack_require__(/*! ./_baseProperty */ "./node_modules/lodash/_baseProperty.js"), - basePropertyDeep = __webpack_require__(/*! ./_basePropertyDeep */ "./node_modules/lodash/_basePropertyDeep.js"), - isKey = __webpack_require__(/*! ./_isKey */ "./node_modules/lodash/_isKey.js"), - toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js"); +/***/ "./node_modules/lodash/_arrayReduce.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_arrayReduce.js ***! + \*********************************************/ +/***/ (function(module) { /** - * Creates a function that returns the value at `path` of a given object. - * - * @static - * @memberOf _ - * @since 2.4.0 - * @category Util - * @param {Array|string} path The path of the property to get. - * @returns {Function} Returns the new accessor function. - * @example - * - * var objects = [ - * { 'a': { 'b': 2 } }, - * { 'a': { 'b': 1 } } - * ]; - * - * _.map(objects, _.property('a.b')); - * // => [2, 1] + * A specialized version of `_.reduce` for arrays without support for + * iteratee shorthands. * - * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b'); - * // => [1, 2] + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initAccum] Specify using the first element of `array` as + * the initial value. + * @returns {*} Returns the accumulated value. */ -function property(path) { - return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path); +function arrayReduce(array, iteratee, accumulator, initAccum) { + var index = -1, + length = array == null ? 0 : array.length; + + if (initAccum && length) { + accumulator = array[++index]; + } + while (++index < length) { + accumulator = iteratee(accumulator, array[index], index, array); + } + return accumulator; } -module.exports = property; +module.exports = arrayReduce; /***/ }), -/***/ "./node_modules/lodash/range.js": -/*!**************************************!*\ - !*** ./node_modules/lodash/range.js ***! - \**************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var createRange = __webpack_require__(/*! ./_createRange */ "./node_modules/lodash/_createRange.js"); +/***/ "./node_modules/lodash/_arraySome.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash/_arraySome.js ***! + \*******************************************/ +/***/ (function(module) { /** - * Creates an array of numbers (positive and/or negative) progressing from - * `start` up to, but not including, `end`. A step of `-1` is used if a negative - * `start` is specified without an `end` or `step`. If `end` is not specified, - * it's set to `start` with `start` then set to `0`. - * - * **Note:** JavaScript follows the IEEE-754 standard for resolving - * floating-point values which can produce unexpected results. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Util - * @param {number} [start=0] The start of the range. - * @param {number} end The end of the range. - * @param {number} [step=1] The value to increment or decrement by. - * @returns {Array} Returns the range of numbers. - * @see _.inRange, _.rangeRight - * @example - * - * _.range(4); - * // => [0, 1, 2, 3] - * - * _.range(-4); - * // => [0, -1, -2, -3] - * - * _.range(1, 5); - * // => [1, 2, 3, 4] - * - * _.range(0, 20, 5); - * // => [0, 5, 10, 15] - * - * _.range(0, -4, -1); - * // => [0, -1, -2, -3] - * - * _.range(1, 4, 0); - * // => [1, 1, 1] + * A specialized version of `_.some` for arrays without support for iteratee + * shorthands. * - * _.range(0); - * // => [] + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. */ -var range = createRange(); +function arraySome(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; -module.exports = range; + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } + return false; +} + +module.exports = arraySome; /***/ }), -/***/ "./node_modules/lodash/reduce.js": -/*!***************************************!*\ - !*** ./node_modules/lodash/reduce.js ***! - \***************************************/ +/***/ "./node_modules/lodash/_asciiSize.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash/_asciiSize.js ***! + \*******************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var arrayReduce = __webpack_require__(/*! ./_arrayReduce */ "./node_modules/lodash/_arrayReduce.js"), - baseEach = __webpack_require__(/*! ./_baseEach */ "./node_modules/lodash/_baseEach.js"), - baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), - baseReduce = __webpack_require__(/*! ./_baseReduce */ "./node_modules/lodash/_baseReduce.js"), - isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"); +var baseProperty = __webpack_require__(/*! ./_baseProperty */ "./node_modules/lodash/_baseProperty.js"); /** - * Reduces `collection` to a value which is the accumulated result of running - * each element in `collection` thru `iteratee`, where each successive - * invocation is supplied the return value of the previous. If `accumulator` - * is not given, the first element of `collection` is used as the initial - * value. The iteratee is invoked with four arguments: - * (accumulator, value, index|key, collection). - * - * Many lodash methods are guarded to work as iteratees for methods like - * `_.reduce`, `_.reduceRight`, and `_.transform`. - * - * The guarded methods are: - * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, - * and `sortBy` - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @param {*} [accumulator] The initial value. - * @returns {*} Returns the accumulated value. - * @see _.reduceRight - * @example - * - * _.reduce([1, 2], function(sum, n) { - * return sum + n; - * }, 0); - * // => 3 + * Gets the size of an ASCII `string`. * - * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { - * (result[value] || (result[value] = [])).push(key); - * return result; - * }, {}); - * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed) + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. */ -function reduce(collection, iteratee, accumulator) { - var func = isArray(collection) ? arrayReduce : baseReduce, - initAccum = arguments.length < 3; - - return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach); -} +var asciiSize = baseProperty('length'); -module.exports = reduce; +module.exports = asciiSize; /***/ }), -/***/ "./node_modules/lodash/set.js": -/*!************************************!*\ - !*** ./node_modules/lodash/set.js ***! - \************************************/ +/***/ "./node_modules/lodash/_assignMergeValue.js": +/*!**************************************************!*\ + !*** ./node_modules/lodash/_assignMergeValue.js ***! + \**************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var baseSet = __webpack_require__(/*! ./_baseSet */ "./node_modules/lodash/_baseSet.js"); +var baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ "./node_modules/lodash/_baseAssignValue.js"), + eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"); /** - * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, - * it's created. Arrays are created for missing index properties while objects - * are created for all other missing properties. Use `_.setWith` to customize - * `path` creation. - * - * **Note:** This method mutates `object`. + * This function is like `assignValue` except that it doesn't assign + * `undefined` values. * - * @static - * @memberOf _ - * @since 3.7.0 - * @category Object + * @private * @param {Object} object The object to modify. - * @param {Array|string} path The path of the property to set. - * @param {*} value The value to set. - * @returns {Object} Returns `object`. - * @example - * - * var object = { 'a': [{ 'b': { 'c': 3 } }] }; - * - * _.set(object, 'a[0].b.c', 4); - * console.log(object.a[0].b.c); - * // => 4 - * - * _.set(object, ['x', '0', 'y', 'z'], 5); - * console.log(object.x[0].y.z); - * // => 5 + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. */ -function set(object, path, value) { - return object == null ? object : baseSet(object, path, value); +function assignMergeValue(object, key, value) { + if ((value !== undefined && !eq(object[key], value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } } -module.exports = set; +module.exports = assignMergeValue; /***/ }), -/***/ "./node_modules/lodash/size.js": -/*!*************************************!*\ - !*** ./node_modules/lodash/size.js ***! - \*************************************/ +/***/ "./node_modules/lodash/_assignValue.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_assignValue.js ***! + \*********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var baseKeys = __webpack_require__(/*! ./_baseKeys */ "./node_modules/lodash/_baseKeys.js"), - getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"), - isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"), - isString = __webpack_require__(/*! ./isString */ "./node_modules/lodash/isString.js"), - stringSize = __webpack_require__(/*! ./_stringSize */ "./node_modules/lodash/_stringSize.js"); +var baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ "./node_modules/lodash/_baseAssignValue.js"), + eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"); -/** `Object#toString` result references. */ -var mapTag = '[object Map]', - setTag = '[object Set]'; +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; /** - * Gets the size of `collection` by returning its length for array-like - * values or the number of own enumerable string keyed properties for objects. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object|string} collection The collection to inspect. - * @returns {number} Returns the collection size. - * @example - * - * _.size([1, 2, 3]); - * // => 3 - * - * _.size({ 'a': 1, 'b': 2 }); - * // => 2 + * Assigns `value` to `key` of `object` if the existing value is not equivalent + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. * - * _.size('pebbles'); - * // => 7 + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. */ -function size(collection) { - if (collection == null) { - return 0; - } - if (isArrayLike(collection)) { - return isString(collection) ? stringSize(collection) : collection.length; - } - var tag = getTag(collection); - if (tag == mapTag || tag == setTag) { - return collection.size; +function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); } - return baseKeys(collection).length; } -module.exports = size; +module.exports = assignValue; /***/ }), -/***/ "./node_modules/lodash/sortBy.js": -/*!***************************************!*\ - !*** ./node_modules/lodash/sortBy.js ***! - \***************************************/ +/***/ "./node_modules/lodash/_assocIndexOf.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash/_assocIndexOf.js ***! + \**********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var baseFlatten = __webpack_require__(/*! ./_baseFlatten */ "./node_modules/lodash/_baseFlatten.js"), - baseOrderBy = __webpack_require__(/*! ./_baseOrderBy */ "./node_modules/lodash/_baseOrderBy.js"), - baseRest = __webpack_require__(/*! ./_baseRest */ "./node_modules/lodash/_baseRest.js"), - isIterateeCall = __webpack_require__(/*! ./_isIterateeCall */ "./node_modules/lodash/_isIterateeCall.js"); +var eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"); /** - * Creates an array of elements, sorted in ascending order by the results of - * running each element in a collection thru each iteratee. This method - * performs a stable sort, that is, it preserves the original sort order of - * equal elements. The iteratees are invoked with one argument: (value). - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {...(Function|Function[])} [iteratees=[_.identity]] - * The iteratees to sort by. - * @returns {Array} Returns the new sorted array. - * @example - * - * var users = [ - * { 'user': 'fred', 'age': 48 }, - * { 'user': 'barney', 'age': 36 }, - * { 'user': 'fred', 'age': 30 }, - * { 'user': 'barney', 'age': 34 } - * ]; - * - * _.sortBy(users, [function(o) { return o.user; }]); - * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]] + * Gets the index at which the `key` is found in `array` of key-value pairs. * - * _.sortBy(users, ['user', 'age']); - * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]] + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. */ -var sortBy = baseRest(function(collection, iteratees) { - if (collection == null) { - return []; - } - var length = iteratees.length; - if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) { - iteratees = []; - } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) { - iteratees = [iteratees[0]]; +function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } } - return baseOrderBy(collection, baseFlatten(iteratees, 1), []); -}); + return -1; +} -module.exports = sortBy; +module.exports = assocIndexOf; /***/ }), -/***/ "./node_modules/lodash/stubArray.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/stubArray.js ***! - \******************************************/ -/***/ (function(module) { +/***/ "./node_modules/lodash/_baseAssign.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_baseAssign.js ***! + \********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var copyObject = __webpack_require__(/*! ./_copyObject */ "./node_modules/lodash/_copyObject.js"), + keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); /** - * This method returns a new empty array. - * - * @static - * @memberOf _ - * @since 4.13.0 - * @category Util - * @returns {Array} Returns the new empty array. - * @example - * - * var arrays = _.times(2, _.stubArray); - * - * console.log(arrays); - * // => [[], []] + * The base implementation of `_.assign` without support for multiple sources + * or `customizer` functions. * - * console.log(arrays[0] === arrays[1]); - * // => false + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. */ -function stubArray() { - return []; +function baseAssign(object, source) { + return object && copyObject(source, keys(source), object); } -module.exports = stubArray; +module.exports = baseAssign; /***/ }), -/***/ "./node_modules/lodash/stubFalse.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/stubFalse.js ***! - \******************************************/ -/***/ (function(module) { +/***/ "./node_modules/lodash/_baseAssignIn.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash/_baseAssignIn.js ***! + \**********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var copyObject = __webpack_require__(/*! ./_copyObject */ "./node_modules/lodash/_copyObject.js"), + keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js"); /** - * This method returns `false`. - * - * @static - * @memberOf _ - * @since 4.13.0 - * @category Util - * @returns {boolean} Returns `false`. - * @example + * The base implementation of `_.assignIn` without support for multiple sources + * or `customizer` functions. * - * _.times(2, _.stubFalse); - * // => [false, false] + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. */ -function stubFalse() { - return false; +function baseAssignIn(object, source) { + return object && copyObject(source, keysIn(source), object); } -module.exports = stubFalse; +module.exports = baseAssignIn; /***/ }), -/***/ "./node_modules/lodash/toFinite.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/toFinite.js ***! - \*****************************************/ +/***/ "./node_modules/lodash/_baseAssignValue.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash/_baseAssignValue.js ***! + \*************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var toNumber = __webpack_require__(/*! ./toNumber */ "./node_modules/lodash/toNumber.js"); - -/** Used as references for various `Number` constants. */ -var INFINITY = 1 / 0, - MAX_INTEGER = 1.7976931348623157e+308; +var defineProperty = __webpack_require__(/*! ./_defineProperty */ "./node_modules/lodash/_defineProperty.js"); /** - * Converts `value` to a finite number. - * - * @static - * @memberOf _ - * @since 4.12.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {number} Returns the converted number. - * @example - * - * _.toFinite(3.2); - * // => 3.2 - * - * _.toFinite(Number.MIN_VALUE); - * // => 5e-324 - * - * _.toFinite(Infinity); - * // => 1.7976931348623157e+308 + * The base implementation of `assignValue` and `assignMergeValue` without + * value checks. * - * _.toFinite('3.2'); - * // => 3.2 + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. */ -function toFinite(value) { - if (!value) { - return value === 0 ? value : 0; - } - value = toNumber(value); - if (value === INFINITY || value === -INFINITY) { - var sign = (value < 0 ? -1 : 1); - return sign * MAX_INTEGER; +function baseAssignValue(object, key, value) { + if (key == '__proto__' && defineProperty) { + defineProperty(object, key, { + 'configurable': true, + 'enumerable': true, + 'value': value, + 'writable': true + }); + } else { + object[key] = value; } - return value === value ? value : 0; } -module.exports = toFinite; +module.exports = baseAssignValue; /***/ }), -/***/ "./node_modules/lodash/toInteger.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/toInteger.js ***! - \******************************************/ +/***/ "./node_modules/lodash/_baseClone.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash/_baseClone.js ***! + \*******************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var toFinite = __webpack_require__(/*! ./toFinite */ "./node_modules/lodash/toFinite.js"); +var Stack = __webpack_require__(/*! ./_Stack */ "./node_modules/lodash/_Stack.js"), + arrayEach = __webpack_require__(/*! ./_arrayEach */ "./node_modules/lodash/_arrayEach.js"), + assignValue = __webpack_require__(/*! ./_assignValue */ "./node_modules/lodash/_assignValue.js"), + baseAssign = __webpack_require__(/*! ./_baseAssign */ "./node_modules/lodash/_baseAssign.js"), + baseAssignIn = __webpack_require__(/*! ./_baseAssignIn */ "./node_modules/lodash/_baseAssignIn.js"), + cloneBuffer = __webpack_require__(/*! ./_cloneBuffer */ "./node_modules/lodash/_cloneBuffer.js"), + copyArray = __webpack_require__(/*! ./_copyArray */ "./node_modules/lodash/_copyArray.js"), + copySymbols = __webpack_require__(/*! ./_copySymbols */ "./node_modules/lodash/_copySymbols.js"), + copySymbolsIn = __webpack_require__(/*! ./_copySymbolsIn */ "./node_modules/lodash/_copySymbolsIn.js"), + getAllKeys = __webpack_require__(/*! ./_getAllKeys */ "./node_modules/lodash/_getAllKeys.js"), + getAllKeysIn = __webpack_require__(/*! ./_getAllKeysIn */ "./node_modules/lodash/_getAllKeysIn.js"), + getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"), + initCloneArray = __webpack_require__(/*! ./_initCloneArray */ "./node_modules/lodash/_initCloneArray.js"), + initCloneByTag = __webpack_require__(/*! ./_initCloneByTag */ "./node_modules/lodash/_initCloneByTag.js"), + initCloneObject = __webpack_require__(/*! ./_initCloneObject */ "./node_modules/lodash/_initCloneObject.js"), + isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), + isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"), + isMap = __webpack_require__(/*! ./isMap */ "./node_modules/lodash/isMap.js"), + isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), + isSet = __webpack_require__(/*! ./isSet */ "./node_modules/lodash/isSet.js"), + keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"), + keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js"); + +/** Used to compose bitmasks for cloning. */ +var CLONE_DEEP_FLAG = 1, + CLONE_FLAT_FLAG = 2, + CLONE_SYMBOLS_FLAG = 4; + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + mapTag = '[object Map]', + numberTag = '[object Number]', + objectTag = '[object Object]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + symbolTag = '[object Symbol]', + weakMapTag = '[object WeakMap]'; + +var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + +/** Used to identify `toStringTag` values supported by `_.clone`. */ +var cloneableTags = {}; +cloneableTags[argsTag] = cloneableTags[arrayTag] = +cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = +cloneableTags[boolTag] = cloneableTags[dateTag] = +cloneableTags[float32Tag] = cloneableTags[float64Tag] = +cloneableTags[int8Tag] = cloneableTags[int16Tag] = +cloneableTags[int32Tag] = cloneableTags[mapTag] = +cloneableTags[numberTag] = cloneableTags[objectTag] = +cloneableTags[regexpTag] = cloneableTags[setTag] = +cloneableTags[stringTag] = cloneableTags[symbolTag] = +cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = +cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; +cloneableTags[errorTag] = cloneableTags[funcTag] = +cloneableTags[weakMapTag] = false; /** - * Converts `value` to an integer. - * - * **Note:** This method is loosely based on - * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {number} Returns the converted integer. - * @example - * - * _.toInteger(3.2); - * // => 3 - * - * _.toInteger(Number.MIN_VALUE); - * // => 0 - * - * _.toInteger(Infinity); - * // => 1.7976931348623157e+308 + * The base implementation of `_.clone` and `_.cloneDeep` which tracks + * traversed objects. * - * _.toInteger('3.2'); - * // => 3 + * @private + * @param {*} value The value to clone. + * @param {boolean} bitmask The bitmask flags. + * 1 - Deep clone + * 2 - Flatten inherited properties + * 4 - Clone symbols + * @param {Function} [customizer] The function to customize cloning. + * @param {string} [key] The key of `value`. + * @param {Object} [object] The parent object of `value`. + * @param {Object} [stack] Tracks traversed objects and their clone counterparts. + * @returns {*} Returns the cloned value. */ -function toInteger(value) { - var result = toFinite(value), - remainder = result % 1; +function baseClone(value, bitmask, customizer, key, object, stack) { + var result, + isDeep = bitmask & CLONE_DEEP_FLAG, + isFlat = bitmask & CLONE_FLAT_FLAG, + isFull = bitmask & CLONE_SYMBOLS_FLAG; + + if (customizer) { + result = object ? customizer(value, key, object, stack) : customizer(value); + } + if (result !== undefined) { + return result; + } + if (!isObject(value)) { + return value; + } + var isArr = isArray(value); + if (isArr) { + result = initCloneArray(value); + if (!isDeep) { + return copyArray(value, result); + } + } else { + var tag = getTag(value), + isFunc = tag == funcTag || tag == genTag; + + if (isBuffer(value)) { + return cloneBuffer(value, isDeep); + } + if (tag == objectTag || tag == argsTag || (isFunc && !object)) { + result = (isFlat || isFunc) ? {} : initCloneObject(value); + if (!isDeep) { + return isFlat + ? copySymbolsIn(value, baseAssignIn(result, value)) + : copySymbols(value, baseAssign(result, value)); + } + } else { + if (!cloneableTags[tag]) { + return object ? value : {}; + } + result = initCloneByTag(value, tag, isDeep); + } + } + // Check for circular references and return its corresponding clone. + stack || (stack = new Stack); + var stacked = stack.get(value); + if (stacked) { + return stacked; + } + stack.set(value, result); + + if (isSet(value)) { + value.forEach(function(subValue) { + result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); + }); + } else if (isMap(value)) { + value.forEach(function(subValue, key) { + result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack)); + }); + } - return result === result ? (remainder ? result - remainder : result) : 0; + var keysFunc = isFull + ? (isFlat ? getAllKeysIn : getAllKeys) + : (isFlat ? keysIn : keys); + + var props = isArr ? undefined : keysFunc(value); + arrayEach(props || value, function(subValue, key) { + if (props) { + key = subValue; + subValue = value[key]; + } + // Recursively populate clone (susceptible to call stack limits). + assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); + }); + return result; } -module.exports = toInteger; +module.exports = baseClone; /***/ }), -/***/ "./node_modules/lodash/toNumber.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/toNumber.js ***! - \*****************************************/ +/***/ "./node_modules/lodash/_baseCreate.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_baseCreate.js ***! + \********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var baseTrim = __webpack_require__(/*! ./_baseTrim */ "./node_modules/lodash/_baseTrim.js"), - isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), - isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); - -/** Used as references for various `Number` constants. */ -var NAN = 0 / 0; - -/** Used to detect bad signed hexadecimal string values. */ -var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; - -/** Used to detect binary string values. */ -var reIsBinary = /^0b[01]+$/i; - -/** Used to detect octal string values. */ -var reIsOctal = /^0o[0-7]+$/i; +var isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"); -/** Built-in method references without a dependency on `root`. */ -var freeParseInt = parseInt; +/** Built-in value references. */ +var objectCreate = Object.create; /** - * Converts `value` to a number. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to process. - * @returns {number} Returns the number. - * @example - * - * _.toNumber(3.2); - * // => 3.2 - * - * _.toNumber(Number.MIN_VALUE); - * // => 5e-324 - * - * _.toNumber(Infinity); - * // => Infinity + * The base implementation of `_.create` without support for assigning + * properties to the created object. * - * _.toNumber('3.2'); - * // => 3.2 + * @private + * @param {Object} proto The object to inherit from. + * @returns {Object} Returns the new object. */ -function toNumber(value) { - if (typeof value == 'number') { - return value; - } - if (isSymbol(value)) { - return NAN; - } - if (isObject(value)) { - var other = typeof value.valueOf == 'function' ? value.valueOf() : value; - value = isObject(other) ? (other + '') : other; - } - if (typeof value != 'string') { - return value === 0 ? value : +value; - } - value = baseTrim(value); - var isBinary = reIsBinary.test(value); - return (isBinary || reIsOctal.test(value)) - ? freeParseInt(value.slice(2), isBinary ? 2 : 8) - : (reIsBadHex.test(value) ? NAN : +value); -} +var baseCreate = (function() { + function object() {} + return function(proto) { + if (!isObject(proto)) { + return {}; + } + if (objectCreate) { + return objectCreate(proto); + } + object.prototype = proto; + var result = new object; + object.prototype = undefined; + return result; + }; +}()); -module.exports = toNumber; +module.exports = baseCreate; /***/ }), -/***/ "./node_modules/lodash/toPath.js": -/*!***************************************!*\ - !*** ./node_modules/lodash/toPath.js ***! - \***************************************/ +/***/ "./node_modules/lodash/_baseEach.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/_baseEach.js ***! + \******************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var arrayMap = __webpack_require__(/*! ./_arrayMap */ "./node_modules/lodash/_arrayMap.js"), - copyArray = __webpack_require__(/*! ./_copyArray */ "./node_modules/lodash/_copyArray.js"), - isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), - isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"), - stringToPath = __webpack_require__(/*! ./_stringToPath */ "./node_modules/lodash/_stringToPath.js"), - toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js"), - toString = __webpack_require__(/*! ./toString */ "./node_modules/lodash/toString.js"); +var baseForOwn = __webpack_require__(/*! ./_baseForOwn */ "./node_modules/lodash/_baseForOwn.js"), + createBaseEach = __webpack_require__(/*! ./_createBaseEach */ "./node_modules/lodash/_createBaseEach.js"); /** - * Converts `value` to a property path array. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Util - * @param {*} value The value to convert. - * @returns {Array} Returns the new property path array. - * @example - * - * _.toPath('a.b.c'); - * // => ['a', 'b', 'c'] + * The base implementation of `_.forEach` without support for iteratee shorthands. * - * _.toPath('a[0].b.c'); - * // => ['a', '0', 'b', 'c'] + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. */ -function toPath(value) { - if (isArray(value)) { - return arrayMap(value, toKey); - } - return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value))); -} +var baseEach = createBaseEach(baseForOwn); -module.exports = toPath; +module.exports = baseEach; /***/ }), -/***/ "./node_modules/lodash/toPlainObject.js": +/***/ "./node_modules/lodash/_baseExtremum.js": /*!**********************************************!*\ - !*** ./node_modules/lodash/toPlainObject.js ***! + !*** ./node_modules/lodash/_baseExtremum.js ***! \**********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var copyObject = __webpack_require__(/*! ./_copyObject */ "./node_modules/lodash/_copyObject.js"), - keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js"); +var isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); /** - * Converts `value` to a plain object flattening inherited enumerable string - * keyed properties of `value` to own properties of the plain object. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {Object} Returns the converted plain object. - * @example - * - * function Foo() { - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.assign({ 'a': 1 }, new Foo); - * // => { 'a': 1, 'b': 2 } + * The base implementation of methods like `_.max` and `_.min` which accepts a + * `comparator` to determine the extremum value. * - * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); - * // => { 'a': 1, 'b': 2, 'c': 3 } + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The iteratee invoked per iteration. + * @param {Function} comparator The comparator used to compare values. + * @returns {*} Returns the extremum value. */ -function toPlainObject(value) { - return copyObject(value, keysIn(value)); +function baseExtremum(array, iteratee, comparator) { + var index = -1, + length = array.length; + + while (++index < length) { + var value = array[index], + current = iteratee(value); + + if (current != null && (computed === undefined + ? (current === current && !isSymbol(current)) + : comparator(current, computed) + )) { + var computed = current, + result = value; + } + } + return result; } -module.exports = toPlainObject; +module.exports = baseExtremum; /***/ }), -/***/ "./node_modules/lodash/toString.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/toString.js ***! - \*****************************************/ +/***/ "./node_modules/lodash/_baseFilter.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_baseFilter.js ***! + \********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var baseToString = __webpack_require__(/*! ./_baseToString */ "./node_modules/lodash/_baseToString.js"); +var baseEach = __webpack_require__(/*! ./_baseEach */ "./node_modules/lodash/_baseEach.js"); /** - * Converts `value` to a string. An empty string is returned for `null` - * and `undefined` values. The sign of `-0` is preserved. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {string} Returns the converted string. - * @example - * - * _.toString(null); - * // => '' - * - * _.toString(-0); - * // => '-0' + * The base implementation of `_.filter` without support for iteratee shorthands. * - * _.toString([1, 2, 3]); - * // => '1,2,3' + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. */ -function toString(value) { - return value == null ? '' : baseToString(value); +function baseFilter(collection, predicate) { + var result = []; + baseEach(collection, function(value, index, collection) { + if (predicate(value, index, collection)) { + result.push(value); + } + }); + return result; } -module.exports = toString; +module.exports = baseFilter; /***/ }), -/***/ "./node_modules/lodash/transform.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/transform.js ***! - \******************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var arrayEach = __webpack_require__(/*! ./_arrayEach */ "./node_modules/lodash/_arrayEach.js"), - baseCreate = __webpack_require__(/*! ./_baseCreate */ "./node_modules/lodash/_baseCreate.js"), - baseForOwn = __webpack_require__(/*! ./_baseForOwn */ "./node_modules/lodash/_baseForOwn.js"), - baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), - getPrototype = __webpack_require__(/*! ./_getPrototype */ "./node_modules/lodash/_getPrototype.js"), - isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), - isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"), - isFunction = __webpack_require__(/*! ./isFunction */ "./node_modules/lodash/isFunction.js"), - isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), - isTypedArray = __webpack_require__(/*! ./isTypedArray */ "./node_modules/lodash/isTypedArray.js"); +/***/ "./node_modules/lodash/_baseFindIndex.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash/_baseFindIndex.js ***! + \***********************************************/ +/***/ (function(module) { /** - * An alternative to `_.reduce`; this method transforms `object` to a new - * `accumulator` object which is the result of running each of its own - * enumerable string keyed properties thru `iteratee`, with each invocation - * potentially mutating the `accumulator` object. If `accumulator` is not - * provided, a new object with the same `[[Prototype]]` will be used. The - * iteratee is invoked with four arguments: (accumulator, value, key, object). - * Iteratee functions may exit iteration early by explicitly returning `false`. - * - * @static - * @memberOf _ - * @since 1.3.0 - * @category Object - * @param {Object} object The object to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @param {*} [accumulator] The custom accumulator value. - * @returns {*} Returns the accumulated value. - * @example - * - * _.transform([2, 3, 4], function(result, n) { - * result.push(n *= n); - * return n % 2 == 0; - * }, []); - * // => [4, 9] + * The base implementation of `_.findIndex` and `_.findLastIndex` without + * support for iteratee shorthands. * - * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { - * (result[value] || (result[value] = [])).push(key); - * }, {}); - * // => { '1': ['a', 'c'], '2': ['b'] } + * @private + * @param {Array} array The array to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {number} fromIndex The index to search from. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {number} Returns the index of the matched value, else `-1`. */ -function transform(object, iteratee, accumulator) { - var isArr = isArray(object), - isArrLike = isArr || isBuffer(object) || isTypedArray(object); +function baseFindIndex(array, predicate, fromIndex, fromRight) { + var length = array.length, + index = fromIndex + (fromRight ? 1 : -1); - iteratee = baseIteratee(iteratee, 4); - if (accumulator == null) { - var Ctor = object && object.constructor; - if (isArrLike) { - accumulator = isArr ? new Ctor : []; - } - else if (isObject(object)) { - accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {}; - } - else { - accumulator = {}; + while ((fromRight ? index-- : ++index < length)) { + if (predicate(array[index], index, array)) { + return index; } } - (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) { - return iteratee(accumulator, value, index, object); - }); - return accumulator; + return -1; } -module.exports = transform; +module.exports = baseFindIndex; /***/ }), -/***/ "./node_modules/lodash/union.js": -/*!**************************************!*\ - !*** ./node_modules/lodash/union.js ***! - \**************************************/ +/***/ "./node_modules/lodash/_baseFlatten.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_baseFlatten.js ***! + \*********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var baseFlatten = __webpack_require__(/*! ./_baseFlatten */ "./node_modules/lodash/_baseFlatten.js"), - baseRest = __webpack_require__(/*! ./_baseRest */ "./node_modules/lodash/_baseRest.js"), - baseUniq = __webpack_require__(/*! ./_baseUniq */ "./node_modules/lodash/_baseUniq.js"), - isArrayLikeObject = __webpack_require__(/*! ./isArrayLikeObject */ "./node_modules/lodash/isArrayLikeObject.js"); +var arrayPush = __webpack_require__(/*! ./_arrayPush */ "./node_modules/lodash/_arrayPush.js"), + isFlattenable = __webpack_require__(/*! ./_isFlattenable */ "./node_modules/lodash/_isFlattenable.js"); /** - * Creates an array of unique values, in order, from all given arrays using - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {...Array} [arrays] The arrays to inspect. - * @returns {Array} Returns the new array of combined values. - * @example + * The base implementation of `_.flatten` with support for restricting flattening. * - * _.union([2], [1, 2]); - * // => [2, 1] + * @private + * @param {Array} array The array to flatten. + * @param {number} depth The maximum recursion depth. + * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. + * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. + * @param {Array} [result=[]] The initial result value. + * @returns {Array} Returns the new flattened array. */ -var union = baseRest(function(arrays) { - return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); -}); - -module.exports = union; - - -/***/ }), - -/***/ "./node_modules/lodash/uniqueId.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/uniqueId.js ***! - \*****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var toString = __webpack_require__(/*! ./toString */ "./node_modules/lodash/toString.js"); +function baseFlatten(array, depth, predicate, isStrict, result) { + var index = -1, + length = array.length; -/** Used to generate unique IDs. */ -var idCounter = 0; + predicate || (predicate = isFlattenable); + result || (result = []); -/** - * Generates a unique ID. If `prefix` is given, the ID is appended to it. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Util - * @param {string} [prefix=''] The value to prefix the ID with. - * @returns {string} Returns the unique ID. - * @example - * - * _.uniqueId('contact_'); - * // => 'contact_104' - * - * _.uniqueId(); - * // => '105' - */ -function uniqueId(prefix) { - var id = ++idCounter; - return toString(prefix) + id; + while (++index < length) { + var value = array[index]; + if (depth > 0 && predicate(value)) { + if (depth > 1) { + // Recursively flatten arrays (susceptible to call stack limits). + baseFlatten(value, depth - 1, predicate, isStrict, result); + } else { + arrayPush(result, value); + } + } else if (!isStrict) { + result[result.length] = value; + } + } + return result; } -module.exports = uniqueId; +module.exports = baseFlatten; /***/ }), -/***/ "./node_modules/lodash/values.js": -/*!***************************************!*\ - !*** ./node_modules/lodash/values.js ***! - \***************************************/ +/***/ "./node_modules/lodash/_baseFor.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/_baseFor.js ***! + \*****************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var baseValues = __webpack_require__(/*! ./_baseValues */ "./node_modules/lodash/_baseValues.js"), - keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); +var createBaseFor = __webpack_require__(/*! ./_createBaseFor */ "./node_modules/lodash/_createBaseFor.js"); /** - * Creates an array of the own enumerable string keyed property values of `object`. - * - * **Note:** Non-object values are coerced to objects. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property values. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.values(new Foo); - * // => [1, 2] (iteration order is not guaranteed) + * The base implementation of `baseForOwn` which iterates over `object` + * properties returned by `keysFunc` and invokes `iteratee` for each property. + * Iteratee functions may exit iteration early by explicitly returning `false`. * - * _.values('hi'); - * // => ['h', 'i'] + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. */ -function values(object) { - return object == null ? [] : baseValues(object, keys(object)); -} +var baseFor = createBaseFor(); -module.exports = values; +module.exports = baseFor; /***/ }), -/***/ "./node_modules/lodash/zipObject.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/zipObject.js ***! - \******************************************/ +/***/ "./node_modules/lodash/_baseForOwn.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_baseForOwn.js ***! + \********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var assignValue = __webpack_require__(/*! ./_assignValue */ "./node_modules/lodash/_assignValue.js"), - baseZipObject = __webpack_require__(/*! ./_baseZipObject */ "./node_modules/lodash/_baseZipObject.js"); +var baseFor = __webpack_require__(/*! ./_baseFor */ "./node_modules/lodash/_baseFor.js"), + keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); /** - * This method is like `_.fromPairs` except that it accepts two arrays, - * one of property identifiers and one of corresponding values. - * - * @static - * @memberOf _ - * @since 0.4.0 - * @category Array - * @param {Array} [props=[]] The property identifiers. - * @param {Array} [values=[]] The property values. - * @returns {Object} Returns the new object. - * @example + * The base implementation of `_.forOwn` without support for iteratee shorthands. * - * _.zipObject(['a', 'b'], [1, 2]); - * // => { 'a': 1, 'b': 2 } + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. */ -function zipObject(props, values) { - return baseZipObject(props || [], values || [], assignValue); +function baseForOwn(object, iteratee) { + return object && baseFor(object, iteratee, keys); } -module.exports = zipObject; +module.exports = baseForOwn; /***/ }), -/***/ "./node_modules/prop-types/lib/ReactPropTypesSecret.js": -/*!*************************************************************!*\ - !*** ./node_modules/prop-types/lib/ReactPropTypesSecret.js ***! - \*************************************************************/ -/***/ (function(module) { +/***/ "./node_modules/lodash/_baseGet.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/_baseGet.js ***! + \*****************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var castPath = __webpack_require__(/*! ./_castPath */ "./node_modules/lodash/_castPath.js"), + toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js"); -"use strict"; /** - * Copyright (c) 2013-present, Facebook, Inc. + * The base implementation of `_.get` without support for default values. * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. */ +function baseGet(object, path) { + path = castPath(path, object); + var index = 0, + length = path.length; + while (object != null && index < length) { + object = object[toKey(path[index++])]; + } + return (index && index == length) ? object : undefined; +} -var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; - -module.exports = ReactPropTypesSecret; +module.exports = baseGet; /***/ }), -/***/ "./node_modules/react-base16-styling/lib/esm/colorConverters.js": -/*!**********************************************************************!*\ - !*** ./node_modules/react-base16-styling/lib/esm/colorConverters.js ***! - \**********************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_baseGetAllKeys.js": +/*!************************************************!*\ + !*** ./node_modules/lodash/_baseGetAllKeys.js ***! + \************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ rgb2yuv: function() { return /* binding */ rgb2yuv; }, -/* harmony export */ yuv2rgb: function() { return /* binding */ yuv2rgb; } -/* harmony export */ }); -function yuv2rgb(yuv) { - var y = yuv[0], - u = yuv[1], - v = yuv[2]; - var r, g, b; - r = y * 1 + u * 0 + v * 1.13983; - g = y * 1 + u * -0.39465 + v * -0.5806; - b = y * 1 + u * 2.02311 + v * 0; - r = Math.min(Math.max(0, r), 1); - g = Math.min(Math.max(0, g), 1); - b = Math.min(Math.max(0, b), 1); - return [r * 255, g * 255, b * 255]; -} -function rgb2yuv(rgb) { - var r = rgb[0] / 255, - g = rgb[1] / 255, - b = rgb[2] / 255; - var y = r * 0.299 + g * 0.587 + b * 0.114; - var u = r * -0.14713 + g * -0.28886 + b * 0.436; - var v = r * 0.615 + g * -0.51499 + b * -0.10001; - return [y, u, v]; -} +var arrayPush = __webpack_require__(/*! ./_arrayPush */ "./node_modules/lodash/_arrayPush.js"), + isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"); -/***/ }), +/** + * The base implementation of `getAllKeys` and `getAllKeysIn` which uses + * `keysFunc` and `symbolsFunc` to get the enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Function} keysFunc The function to get the keys of `object`. + * @param {Function} symbolsFunc The function to get the symbols of `object`. + * @returns {Array} Returns the array of property names and symbols. + */ +function baseGetAllKeys(object, keysFunc, symbolsFunc) { + var result = keysFunc(object); + return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); +} -/***/ "./node_modules/react-base16-styling/lib/esm/index.js": -/*!************************************************************!*\ - !*** ./node_modules/react-base16-styling/lib/esm/index.js ***! - \************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +module.exports = baseGetAllKeys; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ createStyling: function() { return /* binding */ createStyling; }, -/* harmony export */ getBase16Theme: function() { return /* binding */ getBase16Theme; }, -/* harmony export */ invertBase16Theme: function() { return /* binding */ invertBase16Theme; }, -/* harmony export */ invertTheme: function() { return /* binding */ invertTheme; } -/* harmony export */ }); -/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/esm/typeof.js"); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); -/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); -/* harmony import */ var base16__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! base16 */ "./node_modules/base16/lib/index.js"); -/* harmony import */ var color__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! color */ "./node_modules/color/index.js"); -/* harmony import */ var color__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(color__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var lodash_curry__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash.curry */ "./node_modules/lodash.curry/index.js"); -/* harmony import */ var lodash_curry__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash_curry__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _colorConverters__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./colorConverters */ "./node_modules/react-base16-styling/lib/esm/colorConverters.js"); +/***/ }), +/***/ "./node_modules/lodash/_baseGetTag.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_baseGetTag.js ***! + \********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"), + getRawTag = __webpack_require__(/*! ./_getRawTag */ "./node_modules/lodash/_getRawTag.js"), + objectToString = __webpack_require__(/*! ./_objectToString */ "./node_modules/lodash/_objectToString.js"); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } +/** `Object#toString` result references. */ +var nullTag = '[object Null]', + undefinedTag = '[object Undefined]'; -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } +/** Built-in value references. */ +var symToStringTag = Symbol ? Symbol.toStringTag : undefined; +/** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (symToStringTag && symToStringTag in Object(value)) + ? getRawTag(value) + : objectToString(value); +} +module.exports = baseGetTag; +/***/ }), -var DEFAULT_BASE16 = base16__WEBPACK_IMPORTED_MODULE_3__["default"]; -var BASE16_KEYS = Object.keys(DEFAULT_BASE16); // we need a correcting factor, so that a dark, but not black background color -// converts to bright enough inversed color +/***/ "./node_modules/lodash/_baseGt.js": +/*!****************************************!*\ + !*** ./node_modules/lodash/_baseGt.js ***! + \****************************************/ +/***/ (function(module) { -var flip = function flip(x) { - return x < 0.25 ? 1 : x < 0.5 ? 0.9 - x : 1.1 - x; -}; +/** + * The base implementation of `_.gt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. + */ +function baseGt(value, other) { + return value > other; +} -var invertColor = function invertColor(hexString) { - var color = color__WEBPACK_IMPORTED_MODULE_4___default()(hexString); +module.exports = baseGt; - var _rgb2yuv = (0,_colorConverters__WEBPACK_IMPORTED_MODULE_6__.rgb2yuv)(color.array()), - _rgb2yuv2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_rgb2yuv, 3), - y = _rgb2yuv2[0], - u = _rgb2yuv2[1], - v = _rgb2yuv2[2]; - var flippedYuv = [flip(y), u, v]; - var rgb = (0,_colorConverters__WEBPACK_IMPORTED_MODULE_6__.yuv2rgb)(flippedYuv); - return color__WEBPACK_IMPORTED_MODULE_4___default().rgb(rgb).hex(); -}; +/***/ }), -var merger = function merger(styling) { - return function (prevStyling) { - return { - className: [prevStyling.className, styling.className].filter(Boolean).join(' '), - style: _objectSpread(_objectSpread({}, prevStyling.style || {}), styling.style || {}) - }; - }; -}; +/***/ "./node_modules/lodash/_baseHas.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/_baseHas.js ***! + \*****************************************/ +/***/ (function(module) { -var mergeStyling = function mergeStyling(customStyling, defaultStyling) { - if (customStyling === undefined) { - return defaultStyling; - } +/** Used for built-in method references. */ +var objectProto = Object.prototype; - if (defaultStyling === undefined) { - return customStyling; - } +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; - var customType = (0,_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__["default"])(customStyling); +/** + * The base implementation of `_.has` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ +function baseHas(object, key) { + return object != null && hasOwnProperty.call(object, key); +} - var defaultType = (0,_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__["default"])(defaultStyling); +module.exports = baseHas; - switch (customType) { - case 'string': - switch (defaultType) { - case 'string': - return [defaultStyling, customStyling].filter(Boolean).join(' '); - case 'object': - return merger({ - className: customStyling, - style: defaultStyling - }); +/***/ }), - case 'function': - return function (styling) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } +/***/ "./node_modules/lodash/_baseHasIn.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash/_baseHasIn.js ***! + \*******************************************/ +/***/ (function(module) { - return merger({ - className: customStyling - })(defaultStyling.apply(void 0, [styling].concat(args))); - }; - } +/** + * The base implementation of `_.hasIn` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ +function baseHasIn(object, key) { + return object != null && key in Object(object); +} - break; +module.exports = baseHasIn; - case 'object': - switch (defaultType) { - case 'string': - return merger({ - className: defaultStyling, - style: customStyling - }); - case 'object': - return _objectSpread(_objectSpread({}, defaultStyling), customStyling); +/***/ }), - case 'function': - return function (styling) { - for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - args[_key2 - 1] = arguments[_key2]; - } +/***/ "./node_modules/lodash/_baseIndexOf.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_baseIndexOf.js ***! + \*********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - return merger({ - style: customStyling - })(defaultStyling.apply(void 0, [styling].concat(args))); - }; - } +var baseFindIndex = __webpack_require__(/*! ./_baseFindIndex */ "./node_modules/lodash/_baseFindIndex.js"), + baseIsNaN = __webpack_require__(/*! ./_baseIsNaN */ "./node_modules/lodash/_baseIsNaN.js"), + strictIndexOf = __webpack_require__(/*! ./_strictIndexOf */ "./node_modules/lodash/_strictIndexOf.js"); - break; +/** + * The base implementation of `_.indexOf` without `fromIndex` bounds checks. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function baseIndexOf(array, value, fromIndex) { + return value === value + ? strictIndexOf(array, value, fromIndex) + : baseFindIndex(array, baseIsNaN, fromIndex); +} - case 'function': - switch (defaultType) { - case 'string': - return function (styling) { - for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { - args[_key3 - 1] = arguments[_key3]; - } +module.exports = baseIndexOf; - return customStyling.apply(void 0, [merger(styling)({ - className: defaultStyling - })].concat(args)); - }; - case 'object': - return function (styling) { - for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { - args[_key4 - 1] = arguments[_key4]; - } +/***/ }), - return customStyling.apply(void 0, [merger(styling)({ - style: defaultStyling - })].concat(args)); - }; +/***/ "./node_modules/lodash/_baseIsArguments.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash/_baseIsArguments.js ***! + \*************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - case 'function': - return function (styling) { - for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) { - args[_key5 - 1] = arguments[_key5]; - } +var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), + isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); - return customStyling.apply(void 0, [defaultStyling.apply(void 0, [styling].concat(args))].concat(args)); - }; - } +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]'; - } -}; +/** + * The base implementation of `_.isArguments`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + */ +function baseIsArguments(value) { + return isObjectLike(value) && baseGetTag(value) == argsTag; +} -var mergeStylings = function mergeStylings(customStylings, defaultStylings) { - var keys = Object.keys(defaultStylings); +module.exports = baseIsArguments; - for (var key in customStylings) { - if (keys.indexOf(key) === -1) keys.push(key); - } - return keys.reduce(function (mergedStyling, key) { - return mergedStyling[key] = mergeStyling(customStylings[key], defaultStylings[key]), mergedStyling; - }, {}); -}; +/***/ }), -var getStylingByKeys = function getStylingByKeys(mergedStyling, keys) { - for (var _len6 = arguments.length, args = new Array(_len6 > 2 ? _len6 - 2 : 0), _key6 = 2; _key6 < _len6; _key6++) { - args[_key6 - 2] = arguments[_key6]; - } +/***/ "./node_modules/lodash/_baseIsEqual.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_baseIsEqual.js ***! + \*********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - if (keys === null) { - return mergedStyling; - } +var baseIsEqualDeep = __webpack_require__(/*! ./_baseIsEqualDeep */ "./node_modules/lodash/_baseIsEqualDeep.js"), + isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); - if (!Array.isArray(keys)) { - keys = [keys]; +/** + * The base implementation of `_.isEqual` which supports partial comparisons + * and tracks traversed objects. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {boolean} bitmask The bitmask flags. + * 1 - Unordered comparison + * 2 - Partial comparison + * @param {Function} [customizer] The function to customize comparisons. + * @param {Object} [stack] Tracks traversed `value` and `other` objects. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + */ +function baseIsEqual(value, other, bitmask, customizer, stack) { + if (value === other) { + return true; } - - var styles = keys.map(function (key) { - return mergedStyling[key]; - }).filter(Boolean); - var props = styles.reduce(function (obj, s) { - if (typeof s === 'string') { - obj.className = [obj.className, s].filter(Boolean).join(' '); - } else if ((0,_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__["default"])(s) === 'object') { - obj.style = _objectSpread(_objectSpread({}, obj.style), s); - } else if (typeof s === 'function') { - obj = _objectSpread(_objectSpread({}, obj), s.apply(void 0, [obj].concat(args))); - } - - return obj; - }, { - className: '', - style: {} - }); - - if (!props.className) { - delete props.className; + if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) { + return value !== value && other !== other; } + return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); +} - if (Object.keys(props.style).length === 0) { - delete props.style; - } +module.exports = baseIsEqual; - return props; -}; -var invertBase16Theme = function invertBase16Theme(base16Theme) { - return Object.keys(base16Theme).reduce(function (t, key) { - return t[key] = /^base/.test(key) ? invertColor(base16Theme[key]) : key === 'scheme' ? base16Theme[key] + ':inverted' : base16Theme[key], t; - }, {}); -}; -var createStyling = lodash_curry__WEBPACK_IMPORTED_MODULE_5___default()(function (getStylingFromBase16) { - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var themeOrStyling = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - var _options$defaultBase = options.defaultBase16, - defaultBase16 = _options$defaultBase === void 0 ? DEFAULT_BASE16 : _options$defaultBase, - _options$base16Themes = options.base16Themes, - base16Themes = _options$base16Themes === void 0 ? null : _options$base16Themes; - var base16Theme = getBase16Theme(themeOrStyling, base16Themes); +/***/ }), - if (base16Theme) { - themeOrStyling = _objectSpread(_objectSpread({}, base16Theme), themeOrStyling); - } +/***/ "./node_modules/lodash/_baseIsEqualDeep.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash/_baseIsEqualDeep.js ***! + \*************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - var theme = BASE16_KEYS.reduce(function (t, key) { - return t[key] = themeOrStyling[key] || defaultBase16[key], t; - }, {}); - var customStyling = Object.keys(themeOrStyling).reduce(function (s, key) { - return BASE16_KEYS.indexOf(key) === -1 ? (s[key] = themeOrStyling[key], s) : s; - }, {}); - var defaultStyling = getStylingFromBase16(theme); - var mergedStyling = mergeStylings(customStyling, defaultStyling); +var Stack = __webpack_require__(/*! ./_Stack */ "./node_modules/lodash/_Stack.js"), + equalArrays = __webpack_require__(/*! ./_equalArrays */ "./node_modules/lodash/_equalArrays.js"), + equalByTag = __webpack_require__(/*! ./_equalByTag */ "./node_modules/lodash/_equalByTag.js"), + equalObjects = __webpack_require__(/*! ./_equalObjects */ "./node_modules/lodash/_equalObjects.js"), + getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"), + isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), + isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"), + isTypedArray = __webpack_require__(/*! ./isTypedArray */ "./node_modules/lodash/isTypedArray.js"); - for (var _len7 = arguments.length, args = new Array(_len7 > 3 ? _len7 - 3 : 0), _key7 = 3; _key7 < _len7; _key7++) { - args[_key7 - 3] = arguments[_key7]; - } +/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG = 1; - return lodash_curry__WEBPACK_IMPORTED_MODULE_5___default()(getStylingByKeys, 2).apply(void 0, [mergedStyling].concat(args)); -}, 3); +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + objectTag = '[object Object]'; -var isStylingConfig = function isStylingConfig(theme) { - return !!theme.extend; -}; +/** Used for built-in method references. */ +var objectProto = Object.prototype; -var getBase16Theme = function getBase16Theme(theme, base16Themes) { - if (theme && isStylingConfig(theme) && theme.extend) { - theme = theme.extend; - } +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; - if (typeof theme === 'string') { - var _theme$split = theme.split(':'), - _theme$split2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_theme$split, 2), - _themeName = _theme$split2[0], - modifier = _theme$split2[1]; +/** + * A specialized version of `baseIsEqual` for arrays and objects which performs + * deep comparisons and tracks traversed objects enabling objects with circular + * references to be compared. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} [stack] Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { + var objIsArr = isArray(object), + othIsArr = isArray(other), + objTag = objIsArr ? arrayTag : getTag(object), + othTag = othIsArr ? arrayTag : getTag(other); - if (base16Themes) { - theme = base16Themes[_themeName]; - } else { - theme = base16__WEBPACK_IMPORTED_MODULE_3__[_themeName]; - } + objTag = objTag == argsTag ? objectTag : objTag; + othTag = othTag == argsTag ? objectTag : othTag; - if (modifier === 'inverted') { - theme = invertBase16Theme(theme); + var objIsObj = objTag == objectTag, + othIsObj = othTag == objectTag, + isSameTag = objTag == othTag; + + if (isSameTag && isBuffer(object)) { + if (!isBuffer(other)) { + return false; } + objIsArr = true; + objIsObj = false; } - - return theme && Object.prototype.hasOwnProperty.call(theme, 'base00') ? theme : undefined; -}; -var invertTheme = function invertTheme(theme) { - if (typeof theme === 'string') { - return "".concat(theme, ":inverted"); + if (isSameTag && !objIsObj) { + stack || (stack = new Stack); + return (objIsArr || isTypedArray(object)) + ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) + : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); } + if (!(bitmask & COMPARE_PARTIAL_FLAG)) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); - if (theme && isStylingConfig(theme) && theme.extend) { - if (typeof theme.extend === 'string') { - return _objectSpread(_objectSpread({}, theme), {}, { - extend: "".concat(theme.extend, ":inverted") - }); - } + if (objIsWrapped || othIsWrapped) { + var objUnwrapped = objIsWrapped ? object.value() : object, + othUnwrapped = othIsWrapped ? other.value() : other; - return _objectSpread(_objectSpread({}, theme), {}, { - extend: invertBase16Theme(theme.extend) - }); + stack || (stack = new Stack); + return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); + } } - - if (theme) { - return invertBase16Theme(theme); + if (!isSameTag) { + return false; } + stack || (stack = new Stack); + return equalObjects(object, other, bitmask, customizer, equalFunc, stack); +} - return theme; -}; +module.exports = baseIsEqualDeep; /***/ }), -/***/ "./node_modules/react-is/cjs/react-is.development.js": -/*!***********************************************************!*\ - !*** ./node_modules/react-is/cjs/react-is.development.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -"use strict"; -/** @license React v16.13.1 - * react-is.development.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - - - - - -if (true) { - (function() { -'use strict'; +/***/ "./node_modules/lodash/_baseIsMap.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash/_baseIsMap.js ***! + \*******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -// The Symbol used to tag the ReactElement-like types. If there is no native Symbol -// nor polyfill, then a plain number is used for performance. -var hasSymbol = typeof Symbol === 'function' && Symbol.for; -var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7; -var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca; -var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb; -var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc; -var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2; -var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd; -var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary -// (unstable) APIs that have been removed. Can we remove the symbols? +var getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"), + isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); -var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf; -var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf; -var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0; -var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1; -var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8; -var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3; -var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4; -var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9; -var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5; -var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6; -var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7; +/** `Object#toString` result references. */ +var mapTag = '[object Map]'; -function isValidElementType(type) { - return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill. - type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE); +/** + * The base implementation of `_.isMap` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. + */ +function baseIsMap(value) { + return isObjectLike(value) && getTag(value) == mapTag; } -function typeOf(object) { - if (typeof object === 'object' && object !== null) { - var $$typeof = object.$$typeof; +module.exports = baseIsMap; - switch ($$typeof) { - case REACT_ELEMENT_TYPE: - var type = object.type; - switch (type) { - case REACT_ASYNC_MODE_TYPE: - case REACT_CONCURRENT_MODE_TYPE: - case REACT_FRAGMENT_TYPE: - case REACT_PROFILER_TYPE: - case REACT_STRICT_MODE_TYPE: - case REACT_SUSPENSE_TYPE: - return type; +/***/ }), - default: - var $$typeofType = type && type.$$typeof; +/***/ "./node_modules/lodash/_baseIsMatch.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_baseIsMatch.js ***! + \*********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - switch ($$typeofType) { - case REACT_CONTEXT_TYPE: - case REACT_FORWARD_REF_TYPE: - case REACT_LAZY_TYPE: - case REACT_MEMO_TYPE: - case REACT_PROVIDER_TYPE: - return $$typeofType; +var Stack = __webpack_require__(/*! ./_Stack */ "./node_modules/lodash/_Stack.js"), + baseIsEqual = __webpack_require__(/*! ./_baseIsEqual */ "./node_modules/lodash/_baseIsEqual.js"); - default: - return $$typeof; - } +/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; - } +/** + * The base implementation of `_.isMatch` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Array} matchData The property names, values, and compare flags to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + */ +function baseIsMatch(object, source, matchData, customizer) { + var index = matchData.length, + length = index, + noCustomizer = !customizer; - case REACT_PORTAL_TYPE: - return $$typeof; + if (object == null) { + return !length; + } + object = Object(object); + while (index--) { + var data = matchData[index]; + if ((noCustomizer && data[2]) + ? data[1] !== object[data[0]] + : !(data[0] in object) + ) { + return false; } } + while (++index < length) { + data = matchData[index]; + var key = data[0], + objValue = object[key], + srcValue = data[1]; - return undefined; -} // AsyncMode is deprecated along with isAsyncMode - -var AsyncMode = REACT_ASYNC_MODE_TYPE; -var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE; -var ContextConsumer = REACT_CONTEXT_TYPE; -var ContextProvider = REACT_PROVIDER_TYPE; -var Element = REACT_ELEMENT_TYPE; -var ForwardRef = REACT_FORWARD_REF_TYPE; -var Fragment = REACT_FRAGMENT_TYPE; -var Lazy = REACT_LAZY_TYPE; -var Memo = REACT_MEMO_TYPE; -var Portal = REACT_PORTAL_TYPE; -var Profiler = REACT_PROFILER_TYPE; -var StrictMode = REACT_STRICT_MODE_TYPE; -var Suspense = REACT_SUSPENSE_TYPE; -var hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated - -function isAsyncMode(object) { - { - if (!hasWarnedAboutDeprecatedIsAsyncMode) { - hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint - - console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.'); + if (noCustomizer && data[2]) { + if (objValue === undefined && !(key in object)) { + return false; + } + } else { + var stack = new Stack; + if (customizer) { + var result = customizer(objValue, srcValue, key, object, source, stack); + } + if (!(result === undefined + ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) + : result + )) { + return false; + } } } - - return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE; -} -function isConcurrentMode(object) { - return typeOf(object) === REACT_CONCURRENT_MODE_TYPE; -} -function isContextConsumer(object) { - return typeOf(object) === REACT_CONTEXT_TYPE; -} -function isContextProvider(object) { - return typeOf(object) === REACT_PROVIDER_TYPE; -} -function isElement(object) { - return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; -} -function isForwardRef(object) { - return typeOf(object) === REACT_FORWARD_REF_TYPE; -} -function isFragment(object) { - return typeOf(object) === REACT_FRAGMENT_TYPE; -} -function isLazy(object) { - return typeOf(object) === REACT_LAZY_TYPE; -} -function isMemo(object) { - return typeOf(object) === REACT_MEMO_TYPE; -} -function isPortal(object) { - return typeOf(object) === REACT_PORTAL_TYPE; -} -function isProfiler(object) { - return typeOf(object) === REACT_PROFILER_TYPE; -} -function isStrictMode(object) { - return typeOf(object) === REACT_STRICT_MODE_TYPE; -} -function isSuspense(object) { - return typeOf(object) === REACT_SUSPENSE_TYPE; + return true; } -exports.AsyncMode = AsyncMode; -exports.ConcurrentMode = ConcurrentMode; -exports.ContextConsumer = ContextConsumer; -exports.ContextProvider = ContextProvider; -exports.Element = Element; -exports.ForwardRef = ForwardRef; -exports.Fragment = Fragment; -exports.Lazy = Lazy; -exports.Memo = Memo; -exports.Portal = Portal; -exports.Profiler = Profiler; -exports.StrictMode = StrictMode; -exports.Suspense = Suspense; -exports.isAsyncMode = isAsyncMode; -exports.isConcurrentMode = isConcurrentMode; -exports.isContextConsumer = isContextConsumer; -exports.isContextProvider = isContextProvider; -exports.isElement = isElement; -exports.isForwardRef = isForwardRef; -exports.isFragment = isFragment; -exports.isLazy = isLazy; -exports.isMemo = isMemo; -exports.isPortal = isPortal; -exports.isProfiler = isProfiler; -exports.isStrictMode = isStrictMode; -exports.isSuspense = isSuspense; -exports.isValidElementType = isValidElementType; -exports.typeOf = typeOf; - })(); -} +module.exports = baseIsMatch; /***/ }), -/***/ "./node_modules/react-is/index.js": -/*!****************************************!*\ - !*** ./node_modules/react-is/index.js ***! - \****************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -"use strict"; - +/***/ "./node_modules/lodash/_baseIsNaN.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash/_baseIsNaN.js ***! + \*******************************************/ +/***/ (function(module) { -if (false) {} else { - module.exports = __webpack_require__(/*! ./cjs/react-is.development.js */ "./node_modules/react-is/cjs/react-is.development.js"); +/** + * The base implementation of `_.isNaN` without support for number objects. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + */ +function baseIsNaN(value) { + return value !== value; } +module.exports = baseIsNaN; -/***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/ItemRange.js": -/*!***********************************************************!*\ - !*** ./node_modules/react-json-tree/lib/esm/ItemRange.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ }), -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ ItemRange; } -/* harmony export */ }); -/* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); -/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/esm/classCallCheck.js"); -/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/esm/createClass.js"); -/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js"); -/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/esm/inherits.js"); -/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js"); -/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js"); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_8__); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! prop-types */ "prop-types"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_9__); -/* harmony import */ var _JSONArrow__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./JSONArrow */ "./node_modules/react-json-tree/lib/esm/JSONArrow.js"); +/***/ "./node_modules/lodash/_baseIsNative.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash/_baseIsNative.js ***! + \**********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var isFunction = __webpack_require__(/*! ./isFunction */ "./node_modules/lodash/isFunction.js"), + isMasked = __webpack_require__(/*! ./_isMasked */ "./node_modules/lodash/_isMasked.js"), + isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), + toSource = __webpack_require__(/*! ./_toSource */ "./node_modules/lodash/_toSource.js"); +/** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ +var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; +/** Used to detect host constructors (Safari). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; +/** Used for built-in method references. */ +var funcProto = Function.prototype, + objectProto = Object.prototype; +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); +/** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ +function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = isFunction(value) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); +} -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__["default"])(this, result); }; } +module.exports = baseIsNative; -function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } +/***/ }), +/***/ "./node_modules/lodash/_baseIsSet.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash/_baseIsSet.js ***! + \*******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"), + isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); +/** `Object#toString` result references. */ +var setTag = '[object Set]'; -var ItemRange = /*#__PURE__*/function (_React$Component) { - (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__["default"])(ItemRange, _React$Component); +/** + * The base implementation of `_.isSet` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. + */ +function baseIsSet(value) { + return isObjectLike(value) && getTag(value) == setTag; +} - var _super = _createSuper(ItemRange); +module.exports = baseIsSet; - function ItemRange(props) { - var _this; - (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__["default"])(this, ItemRange); +/***/ }), - _this = _super.call(this, props); +/***/ "./node_modules/lodash/_baseIsTypedArray.js": +/*!**************************************************!*\ + !*** ./node_modules/lodash/_baseIsTypedArray.js ***! + \**************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7__["default"])((0,_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_3__["default"])(_this), "handleClick", function () { - _this.setState({ - expanded: !_this.state.expanded - }); - }); +var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), + isLength = __webpack_require__(/*! ./isLength */ "./node_modules/lodash/isLength.js"), + isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); - _this.state = { - expanded: false - }; - return _this; - } +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + mapTag = '[object Map]', + numberTag = '[object Number]', + objectTag = '[object Object]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + weakMapTag = '[object WeakMap]'; - (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__["default"])(ItemRange, [{ - key: "render", - value: function render() { - var _this$props = this.props, - styling = _this$props.styling, - from = _this$props.from, - to = _this$props.to, - renderChildNodes = _this$props.renderChildNodes, - nodeType = _this$props.nodeType; - return this.state.expanded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_8___default().createElement("div", styling('itemRange', this.state.expanded), renderChildNodes(this.props, from, to)) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_8___default().createElement("div", (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, styling('itemRange', this.state.expanded), { - onClick: this.handleClick - }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_8___default().createElement(_JSONArrow__WEBPACK_IMPORTED_MODULE_10__["default"], { - nodeType: nodeType, - styling: styling, - expanded: false, - onClick: this.handleClick, - arrowStyle: "double" - }), "".concat(from, " ... ").concat(to)); - } - }]); +var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; - return ItemRange; -}((react__WEBPACK_IMPORTED_MODULE_8___default().Component)); +/** Used to identify `toStringTag` values of typed arrays. */ +var typedArrayTags = {}; +typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = +typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = +typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = +typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = +typedArrayTags[uint32Tag] = true; +typedArrayTags[argsTag] = typedArrayTags[arrayTag] = +typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = +typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = +typedArrayTags[errorTag] = typedArrayTags[funcTag] = +typedArrayTags[mapTag] = typedArrayTags[numberTag] = +typedArrayTags[objectTag] = typedArrayTags[regexpTag] = +typedArrayTags[setTag] = typedArrayTags[stringTag] = +typedArrayTags[weakMapTag] = false; -(0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7__["default"])(ItemRange, "propTypes", { - styling: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().func).isRequired, - from: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().number).isRequired, - to: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().number).isRequired, - renderChildNodes: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().func).isRequired, - nodeType: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string).isRequired -}); +/** + * The base implementation of `_.isTypedArray` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + */ +function baseIsTypedArray(value) { + return isObjectLike(value) && + isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; +} +module.exports = baseIsTypedArray; /***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/JSONArrayNode.js": -/*!***************************************************************!*\ - !*** ./node_modules/react-json-tree/lib/esm/JSONArrayNode.js ***! - \***************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); -/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "prop-types"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _JSONNestedNode__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./JSONNestedNode */ "./node_modules/react-json-tree/lib/esm/JSONNestedNode.js"); - - -var _excluded = ["data"]; - - +/***/ "./node_modules/lodash/_baseIteratee.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash/_baseIteratee.js ***! + \**********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var baseMatches = __webpack_require__(/*! ./_baseMatches */ "./node_modules/lodash/_baseMatches.js"), + baseMatchesProperty = __webpack_require__(/*! ./_baseMatchesProperty */ "./node_modules/lodash/_baseMatchesProperty.js"), + identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js"), + isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), + property = __webpack_require__(/*! ./property */ "./node_modules/lodash/property.js"); -// Returns the "n Items" string for this node, -// generating and caching it if it hasn't been created yet. -function createItemString(data) { - return "".concat(data.length, " ").concat(data.length !== 1 ? 'items' : 'item'); +/** + * The base implementation of `_.iteratee`. + * + * @private + * @param {*} [value=_.identity] The value to convert to an iteratee. + * @returns {Function} Returns the iteratee. + */ +function baseIteratee(value) { + // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. + // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. + if (typeof value == 'function') { + return value; + } + if (value == null) { + return identity; + } + if (typeof value == 'object') { + return isArray(value) + ? baseMatchesProperty(value[0], value[1]) + : baseMatches(value); + } + return property(value); } -// Configures to render an Array -var JSONArrayNode = function JSONArrayNode(_ref) { - var data = _ref.data, - props = (0,_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__["default"])(_ref, _excluded); - - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_JSONNestedNode__WEBPACK_IMPORTED_MODULE_4__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, props, { - data: data, - nodeType: "Array", - nodeTypeIndicator: "[]", - createItemString: createItemString, - expandable: data.length > 0 - })); -}; +module.exports = baseIteratee; -JSONArrayNode.propTypes = { - data: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array) -}; -/* harmony default export */ __webpack_exports__["default"] = (JSONArrayNode); /***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/JSONArrow.js": -/*!***********************************************************!*\ - !*** ./node_modules/react-json-tree/lib/esm/JSONArrow.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_baseKeys.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/_baseKeys.js ***! + \******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "prop-types"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +var isPrototype = __webpack_require__(/*! ./_isPrototype */ "./node_modules/lodash/_isPrototype.js"), + nativeKeys = __webpack_require__(/*! ./_nativeKeys */ "./node_modules/lodash/_nativeKeys.js"); +/** Used for built-in method references. */ +var objectProto = Object.prototype; +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; +/** + * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function baseKeys(object) { + if (!isPrototype(object)) { + return nativeKeys(object); + } + var result = []; + for (var key in Object(object)) { + if (hasOwnProperty.call(object, key) && key != 'constructor') { + result.push(key); + } + } + return result; +} -var JSONArrow = function JSONArrow(_ref) { - var styling = _ref.styling, - arrowStyle = _ref.arrowStyle, - expanded = _ref.expanded, - nodeType = _ref.nodeType, - onClick = _ref.onClick; - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, styling('arrowContainer', arrowStyle), { - onClick: onClick - }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", styling(['arrow', 'arrowSign'], nodeType, expanded, arrowStyle), "\u25B6", arrowStyle === 'double' && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", styling(['arrowSign', 'arrowSignInner']), "\u25B6"))); -}; +module.exports = baseKeys; -JSONArrow.propTypes = { - styling: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired, - arrowStyle: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOf(['single', 'double']), - expanded: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired, - nodeType: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired, - onClick: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired -}; -JSONArrow.defaultProps = { - arrowStyle: 'single' -}; -/* harmony default export */ __webpack_exports__["default"] = (JSONArrow); /***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/JSONIterableNode.js": -/*!******************************************************************!*\ - !*** ./node_modules/react-json-tree/lib/esm/JSONIterableNode.js ***! - \******************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _JSONNestedNode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./JSONNestedNode */ "./node_modules/react-json-tree/lib/esm/JSONNestedNode.js"); - - -function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +/***/ "./node_modules/lodash/_baseKeysIn.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_baseKeysIn.js ***! + \********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } +var isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), + isPrototype = __webpack_require__(/*! ./_isPrototype */ "./node_modules/lodash/_isPrototype.js"), + nativeKeysIn = __webpack_require__(/*! ./_nativeKeysIn */ "./node_modules/lodash/_nativeKeysIn.js"); +/** Used for built-in method references. */ +var objectProto = Object.prototype; +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; +/** + * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function baseKeysIn(object) { + if (!isObject(object)) { + return nativeKeysIn(object); + } + var isProto = isPrototype(object), + result = []; -// Returns the "n Items" string for this node, -// generating and caching it if it hasn't been created yet. -function createItemString(data, limit) { - var count = 0; - var hasMore = false; + for (var key in object) { + if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; +} - if (Number.isSafeInteger(data.size)) { - count = data.size; - } else { - // eslint-disable-next-line no-unused-vars - var _iterator = _createForOfIteratorHelper(data), - _step; +module.exports = baseKeysIn; - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var entry = _step.value; - if (limit && count + 1 > limit) { - hasMore = true; - break; - } +/***/ }), - count += 1; - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - } +/***/ "./node_modules/lodash/_baseLt.js": +/*!****************************************!*\ + !*** ./node_modules/lodash/_baseLt.js ***! + \****************************************/ +/***/ (function(module) { - return "".concat(hasMore ? '>' : '').concat(count, " ").concat(count !== 1 ? 'entries' : 'entry'); +/** + * The base implementation of `_.lt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, + * else `false`. + */ +function baseLt(value, other) { + return value < other; } -// Configures to render an iterable -var JSONIterableNode = function JSONIterableNode(_ref) { - var props = (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _ref); - - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_JSONNestedNode__WEBPACK_IMPORTED_MODULE_2__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, props, { - nodeType: "Iterable", - nodeTypeIndicator: "()", - createItemString: createItemString - })); -}; +module.exports = baseLt; -/* harmony default export */ __webpack_exports__["default"] = (JSONIterableNode); /***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/JSONNestedNode.js": -/*!****************************************************************!*\ - !*** ./node_modules/react-json-tree/lib/esm/JSONNestedNode.js ***! - \****************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_baseMap.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/_baseMap.js ***! + \*****************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ JSONNestedNode; } -/* harmony export */ }); -/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/esm/classCallCheck.js"); -/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/esm/createClass.js"); -/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js"); -/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/esm/inherits.js"); -/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js"); -/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js"); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); -/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js"); -/* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_9__); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ "prop-types"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__); -/* harmony import */ var _JSONArrow__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./JSONArrow */ "./node_modules/react-json-tree/lib/esm/JSONArrow.js"); -/* harmony import */ var _getCollectionEntries__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./getCollectionEntries */ "./node_modules/react-json-tree/lib/esm/getCollectionEntries.js"); -/* harmony import */ var _JSONNode__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./JSONNode */ "./node_modules/react-json-tree/lib/esm/JSONNode.js"); -/* harmony import */ var _ItemRange__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./ItemRange */ "./node_modules/react-json-tree/lib/esm/ItemRange.js"); +var baseEach = __webpack_require__(/*! ./_baseEach */ "./node_modules/lodash/_baseEach.js"), + isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"); +/** + * The base implementation of `_.map` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ +function baseMap(collection, iteratee) { + var index = -1, + result = isArrayLike(collection) ? Array(collection.length) : []; + baseEach(collection, function(value, key, collection) { + result[++index] = iteratee(value, key, collection); + }); + return result; +} +module.exports = baseMap; +/***/ }), +/***/ "./node_modules/lodash/_baseMatches.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_baseMatches.js ***! + \*********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var baseIsMatch = __webpack_require__(/*! ./_baseIsMatch */ "./node_modules/lodash/_baseIsMatch.js"), + getMatchData = __webpack_require__(/*! ./_getMatchData */ "./node_modules/lodash/_getMatchData.js"), + matchesStrictComparable = __webpack_require__(/*! ./_matchesStrictComparable */ "./node_modules/lodash/_matchesStrictComparable.js"); +/** + * The base implementation of `_.matches` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property values to match. + * @returns {Function} Returns the new spec function. + */ +function baseMatches(source) { + var matchData = getMatchData(source); + if (matchData.length == 1 && matchData[0][2]) { + return matchesStrictComparable(matchData[0][0], matchData[0][1]); + } + return function(object) { + return object === source || baseIsMatch(object, source, matchData); + }; +} +module.exports = baseMatches; -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6__["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } +/***/ }), -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5__["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5__["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4__["default"])(this, result); }; } +/***/ "./node_modules/lodash/_baseMatchesProperty.js": +/*!*****************************************************!*\ + !*** ./node_modules/lodash/_baseMatchesProperty.js ***! + \*****************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } +var baseIsEqual = __webpack_require__(/*! ./_baseIsEqual */ "./node_modules/lodash/_baseIsEqual.js"), + get = __webpack_require__(/*! ./get */ "./node_modules/lodash/get.js"), + hasIn = __webpack_require__(/*! ./hasIn */ "./node_modules/lodash/hasIn.js"), + isKey = __webpack_require__(/*! ./_isKey */ "./node_modules/lodash/_isKey.js"), + isStrictComparable = __webpack_require__(/*! ./_isStrictComparable */ "./node_modules/lodash/_isStrictComparable.js"), + matchesStrictComparable = __webpack_require__(/*! ./_matchesStrictComparable */ "./node_modules/lodash/_matchesStrictComparable.js"), + toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js"); +/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; +/** + * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. + * + * @private + * @param {string} path The path of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ +function baseMatchesProperty(path, srcValue) { + if (isKey(path) && isStrictComparable(srcValue)) { + return matchesStrictComparable(toKey(path), srcValue); + } + return function(object) { + var objValue = get(object, path); + return (objValue === undefined && objValue === srcValue) + ? hasIn(object, path) + : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); + }; +} +module.exports = baseMatchesProperty; +/***/ }), +/***/ "./node_modules/lodash/_baseMerge.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash/_baseMerge.js ***! + \*******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var Stack = __webpack_require__(/*! ./_Stack */ "./node_modules/lodash/_Stack.js"), + assignMergeValue = __webpack_require__(/*! ./_assignMergeValue */ "./node_modules/lodash/_assignMergeValue.js"), + baseFor = __webpack_require__(/*! ./_baseFor */ "./node_modules/lodash/_baseFor.js"), + baseMergeDeep = __webpack_require__(/*! ./_baseMergeDeep */ "./node_modules/lodash/_baseMergeDeep.js"), + isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), + keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js"), + safeGet = __webpack_require__(/*! ./_safeGet */ "./node_modules/lodash/_safeGet.js"); -function isRange(rangeOrEntry) { - return rangeOrEntry.to !== undefined; -} +/** + * The base implementation of `_.merge` without support for multiple sources. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {number} srcIndex The index of `source`. + * @param {Function} [customizer] The function to customize merged values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ +function baseMerge(object, source, srcIndex, customizer, stack) { + if (object === source) { + return; + } + baseFor(source, function(srcValue, key) { + stack || (stack = new Stack); + if (isObject(srcValue)) { + baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); + } + else { + var newValue = customizer + ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack) + : undefined; -function renderChildNodes(props, from, to) { - var nodeType = props.nodeType, - data = props.data, - collectionLimit = props.collectionLimit, - circularCache = props.circularCache, - keyPath = props.keyPath, - postprocessValue = props.postprocessValue, - sortObjectKeys = props.sortObjectKeys; - var childNodes = []; - (0,_getCollectionEntries__WEBPACK_IMPORTED_MODULE_11__["default"])(nodeType, data, sortObjectKeys, collectionLimit, from, to).forEach(function (entry) { - if (isRange(entry)) { - childNodes.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement(_ItemRange__WEBPACK_IMPORTED_MODULE_12__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_8__["default"])({}, props, { - key: "ItemRange--".concat(entry.from, "-").concat(entry.to), - from: entry.from, - to: entry.to, - renderChildNodes: renderChildNodes - }))); - } else { - var key = entry.key, - value = entry.value; - var isCircular = circularCache.indexOf(value) !== -1; - childNodes.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement(_JSONNode__WEBPACK_IMPORTED_MODULE_13__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_8__["default"])({}, props, { - postprocessValue: postprocessValue, - collectionLimit: collectionLimit, - key: "Node--".concat(key), - keyPath: [key].concat((0,_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_7__["default"])(keyPath)), - value: postprocessValue(value), - circularCache: [].concat((0,_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_7__["default"])(circularCache), [value]), - isCircular: isCircular, - hideRoot: false - }))); + if (newValue === undefined) { + newValue = srcValue; + } + assignMergeValue(object, key, newValue); } - }); - return childNodes; + }, keysIn); } -function getStateFromProps(props) { - // calculate individual node expansion if necessary - var expanded = !props.isCircular ? props.shouldExpandNode(props.keyPath, props.data, props.level) : false; - return { - expanded: expanded - }; -} +module.exports = baseMerge; -var JSONNestedNode = /*#__PURE__*/function (_React$Component) { - (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__["default"])(JSONNestedNode, _React$Component); - var _super = _createSuper(JSONNestedNode); +/***/ }), + +/***/ "./node_modules/lodash/_baseMergeDeep.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash/_baseMergeDeep.js ***! + \***********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var assignMergeValue = __webpack_require__(/*! ./_assignMergeValue */ "./node_modules/lodash/_assignMergeValue.js"), + cloneBuffer = __webpack_require__(/*! ./_cloneBuffer */ "./node_modules/lodash/_cloneBuffer.js"), + cloneTypedArray = __webpack_require__(/*! ./_cloneTypedArray */ "./node_modules/lodash/_cloneTypedArray.js"), + copyArray = __webpack_require__(/*! ./_copyArray */ "./node_modules/lodash/_copyArray.js"), + initCloneObject = __webpack_require__(/*! ./_initCloneObject */ "./node_modules/lodash/_initCloneObject.js"), + isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"), + isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), + isArrayLikeObject = __webpack_require__(/*! ./isArrayLikeObject */ "./node_modules/lodash/isArrayLikeObject.js"), + isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"), + isFunction = __webpack_require__(/*! ./isFunction */ "./node_modules/lodash/isFunction.js"), + isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), + isPlainObject = __webpack_require__(/*! ./isPlainObject */ "./node_modules/lodash/isPlainObject.js"), + isTypedArray = __webpack_require__(/*! ./isTypedArray */ "./node_modules/lodash/isTypedArray.js"), + safeGet = __webpack_require__(/*! ./_safeGet */ "./node_modules/lodash/_safeGet.js"), + toPlainObject = __webpack_require__(/*! ./toPlainObject */ "./node_modules/lodash/toPlainObject.js"); + +/** + * A specialized version of `baseMerge` for arrays and objects which performs + * deep merges and tracks traversed objects enabling objects with circular + * references to be merged. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {string} key The key of the value to merge. + * @param {number} srcIndex The index of `source`. + * @param {Function} mergeFunc The function to merge values. + * @param {Function} [customizer] The function to customize assigned values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ +function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { + var objValue = safeGet(object, key), + srcValue = safeGet(source, key), + stacked = stack.get(srcValue); - function JSONNestedNode(props) { - var _this; + if (stacked) { + assignMergeValue(object, key, stacked); + return; + } + var newValue = customizer + ? customizer(objValue, srcValue, (key + ''), object, source, stack) + : undefined; - (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__["default"])(this, JSONNestedNode); + var isCommon = newValue === undefined; - _this = _super.call(this, props); + if (isCommon) { + var isArr = isArray(srcValue), + isBuff = !isArr && isBuffer(srcValue), + isTyped = !isArr && !isBuff && isTypedArray(srcValue); - (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6__["default"])((0,_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_2__["default"])(_this), "handleClick", function () { - if (_this.props.expandable) { - _this.setState({ - expanded: !_this.state.expanded - }); + newValue = srcValue; + if (isArr || isBuff || isTyped) { + if (isArray(objValue)) { + newValue = objValue; } - }); - - _this.state = getStateFromProps(props); - return _this; - } - - (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__["default"])(JSONNestedNode, [{ - key: "UNSAFE_componentWillReceiveProps", - value: function UNSAFE_componentWillReceiveProps(nextProps) { - var nextState = getStateFromProps(nextProps); - - if (getStateFromProps(this.props).expanded !== nextState.expanded) { - this.setState(nextState); + else if (isArrayLikeObject(objValue)) { + newValue = copyArray(objValue); + } + else if (isBuff) { + isCommon = false; + newValue = cloneBuffer(srcValue, true); + } + else if (isTyped) { + isCommon = false; + newValue = cloneTypedArray(srcValue, true); + } + else { + newValue = []; } } - }, { - key: "shouldComponentUpdate", - value: function shouldComponentUpdate(nextProps, nextState) { - var _this2 = this; - - return !!Object.keys(nextProps).find(function (key) { - return key !== 'circularCache' && (key === 'keyPath' ? nextProps[key].join('/') !== _this2.props[key].join('/') : nextProps[key] !== _this2.props[key]); - }) || nextState.expanded !== this.state.expanded; + else if (isPlainObject(srcValue) || isArguments(srcValue)) { + newValue = objValue; + if (isArguments(objValue)) { + newValue = toPlainObject(objValue); + } + else if (!isObject(objValue) || isFunction(objValue)) { + newValue = initCloneObject(srcValue); + } } - }, { - key: "render", - value: function render() { - var _this$props = this.props, - getItemString = _this$props.getItemString, - nodeTypeIndicator = _this$props.nodeTypeIndicator, - nodeType = _this$props.nodeType, - data = _this$props.data, - hideRoot = _this$props.hideRoot, - createItemString = _this$props.createItemString, - styling = _this$props.styling, - collectionLimit = _this$props.collectionLimit, - keyPath = _this$props.keyPath, - labelRenderer = _this$props.labelRenderer, - expandable = _this$props.expandable; - var expanded = this.state.expanded; - var renderedChildren = expanded || hideRoot && this.props.level === 0 ? renderChildNodes(_objectSpread(_objectSpread({}, this.props), {}, { - level: this.props.level + 1 - })) : null; - var itemType = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement("span", styling('nestedNodeItemType', expanded), nodeTypeIndicator); - var renderedItemString = getItemString(nodeType, data, itemType, createItemString(data, collectionLimit), keyPath); - var stylingArgs = [keyPath, nodeType, expanded, expandable]; - return hideRoot ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement("li", styling.apply(void 0, ['rootNode'].concat(stylingArgs)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement("ul", styling.apply(void 0, ['rootNodeChildren'].concat(stylingArgs)), renderedChildren)) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement("li", styling.apply(void 0, ['nestedNode'].concat(stylingArgs)), expandable && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement(_JSONArrow__WEBPACK_IMPORTED_MODULE_14__["default"], { - styling: styling, - nodeType: nodeType, - expanded: expanded, - onClick: this.handleClick - }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement("label", (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_8__["default"])({}, styling.apply(void 0, [['label', 'nestedNodeLabel']].concat(stylingArgs)), { - onClick: this.handleClick - }), labelRenderer.apply(void 0, stylingArgs)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement("span", (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_8__["default"])({}, styling.apply(void 0, ['nestedNodeItemString'].concat(stylingArgs)), { - onClick: this.handleClick - }), renderedItemString), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement("ul", styling.apply(void 0, ['nestedNodeChildren'].concat(stylingArgs)), renderedChildren)); + else { + isCommon = false; } - }]); - - return JSONNestedNode; -}((react__WEBPACK_IMPORTED_MODULE_9___default().Component)); - -(0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6__["default"])(JSONNestedNode, "propTypes", { - getItemString: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().func).isRequired, - nodeTypeIndicator: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().any), - nodeType: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().string).isRequired, - data: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().any), - hideRoot: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().bool).isRequired, - createItemString: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().func).isRequired, - styling: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().func).isRequired, - collectionLimit: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number), - keyPath: prop_types__WEBPACK_IMPORTED_MODULE_10___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_10___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_10___default().string), (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number)])).isRequired, - labelRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().func).isRequired, - shouldExpandNode: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().func), - level: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number).isRequired, - sortObjectKeys: prop_types__WEBPACK_IMPORTED_MODULE_10___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_10___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_10___default().bool)]), - isCircular: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().bool), - expandable: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().bool) -}); - -(0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6__["default"])(JSONNestedNode, "defaultProps", { - data: [], - circularCache: [], - level: 0, - expandable: true -}); + } + if (isCommon) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, newValue); + mergeFunc(newValue, srcValue, srcIndex, customizer, stack); + stack['delete'](srcValue); + } + assignMergeValue(object, key, newValue); +} +module.exports = baseMergeDeep; /***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/JSONNode.js": -/*!**********************************************************!*\ - !*** ./node_modules/react-json-tree/lib/esm/JSONNode.js ***! - \**********************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_baseOrderBy.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_baseOrderBy.js ***! + \*********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); -/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ "prop-types"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _objType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./objType */ "./node_modules/react-json-tree/lib/esm/objType.js"); -/* harmony import */ var _JSONObjectNode__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./JSONObjectNode */ "./node_modules/react-json-tree/lib/esm/JSONObjectNode.js"); -/* harmony import */ var _JSONArrayNode__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./JSONArrayNode */ "./node_modules/react-json-tree/lib/esm/JSONArrayNode.js"); -/* harmony import */ var _JSONIterableNode__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./JSONIterableNode */ "./node_modules/react-json-tree/lib/esm/JSONIterableNode.js"); -/* harmony import */ var _JSONValueNode__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./JSONValueNode */ "./node_modules/react-json-tree/lib/esm/JSONValueNode.js"); +var arrayMap = __webpack_require__(/*! ./_arrayMap */ "./node_modules/lodash/_arrayMap.js"), + baseGet = __webpack_require__(/*! ./_baseGet */ "./node_modules/lodash/_baseGet.js"), + baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), + baseMap = __webpack_require__(/*! ./_baseMap */ "./node_modules/lodash/_baseMap.js"), + baseSortBy = __webpack_require__(/*! ./_baseSortBy */ "./node_modules/lodash/_baseSortBy.js"), + baseUnary = __webpack_require__(/*! ./_baseUnary */ "./node_modules/lodash/_baseUnary.js"), + compareMultiple = __webpack_require__(/*! ./_compareMultiple */ "./node_modules/lodash/_compareMultiple.js"), + identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js"), + isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"); +/** + * The base implementation of `_.orderBy` without param guards. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. + * @param {string[]} orders The sort orders of `iteratees`. + * @returns {Array} Returns the new sorted array. + */ +function baseOrderBy(collection, iteratees, orders) { + if (iteratees.length) { + iteratees = arrayMap(iteratees, function(iteratee) { + if (isArray(iteratee)) { + return function(value) { + return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee); + } + } + return iteratee; + }); + } else { + iteratees = [identity]; + } + var index = -1; + iteratees = arrayMap(iteratees, baseUnary(baseIteratee)); -var _excluded = ["getItemString", "keyPath", "labelRenderer", "styling", "value", "valueRenderer", "isCustomNode"]; + var result = baseMap(collection, function(value, key, collection) { + var criteria = arrayMap(iteratees, function(iteratee) { + return iteratee(value); + }); + return { 'criteria': criteria, 'index': ++index, 'value': value }; + }); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } + return baseSortBy(result, function(object, other) { + return compareMultiple(object, other, orders); + }); +} -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } +module.exports = baseOrderBy; +/***/ }), +/***/ "./node_modules/lodash/_basePick.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/_basePick.js ***! + \******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var basePickBy = __webpack_require__(/*! ./_basePickBy */ "./node_modules/lodash/_basePickBy.js"), + hasIn = __webpack_require__(/*! ./hasIn */ "./node_modules/lodash/hasIn.js"); +/** + * The base implementation of `_.pick` without support for individual + * property identifiers. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @returns {Object} Returns the new object. + */ +function basePick(object, paths) { + return basePickBy(object, paths, function(value, path) { + return hasIn(object, path); + }); +} +module.exports = basePick; +/***/ }), -var JSONNode = function JSONNode(_ref) { - var getItemString = _ref.getItemString, - keyPath = _ref.keyPath, - labelRenderer = _ref.labelRenderer, - styling = _ref.styling, - value = _ref.value, - valueRenderer = _ref.valueRenderer, - isCustomNode = _ref.isCustomNode, - rest = (0,_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__["default"])(_ref, _excluded); +/***/ "./node_modules/lodash/_basePickBy.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_basePickBy.js ***! + \********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - var nodeType = isCustomNode(value) ? 'Custom' : (0,_objType__WEBPACK_IMPORTED_MODULE_5__["default"])(value); - var simpleNodeProps = { - getItemString: getItemString, - key: keyPath[0], - keyPath: keyPath, - labelRenderer: labelRenderer, - nodeType: nodeType, - styling: styling, - value: value, - valueRenderer: valueRenderer - }; +var baseGet = __webpack_require__(/*! ./_baseGet */ "./node_modules/lodash/_baseGet.js"), + baseSet = __webpack_require__(/*! ./_baseSet */ "./node_modules/lodash/_baseSet.js"), + castPath = __webpack_require__(/*! ./_castPath */ "./node_modules/lodash/_castPath.js"); - var nestedNodeProps = _objectSpread(_objectSpread(_objectSpread({}, rest), simpleNodeProps), {}, { - data: value, - isCustomNode: isCustomNode - }); +/** + * The base implementation of `_.pickBy` without support for iteratee shorthands. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @param {Function} predicate The function invoked per property. + * @returns {Object} Returns the new object. + */ +function basePickBy(object, paths, predicate) { + var index = -1, + length = paths.length, + result = {}; - switch (nodeType) { - case 'Object': - case 'Error': - case 'WeakMap': - case 'WeakSet': - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONObjectNode__WEBPACK_IMPORTED_MODULE_6__["default"], nestedNodeProps); + while (++index < length) { + var path = paths[index], + value = baseGet(object, path); - case 'Array': - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONArrayNode__WEBPACK_IMPORTED_MODULE_7__["default"], nestedNodeProps); + if (predicate(value, path)) { + baseSet(result, castPath(path, object), value); + } + } + return result; +} - case 'Iterable': - case 'Map': - case 'Set': - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONIterableNode__WEBPACK_IMPORTED_MODULE_8__["default"], nestedNodeProps); +module.exports = basePickBy; - case 'String': - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONValueNode__WEBPACK_IMPORTED_MODULE_9__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, simpleNodeProps, { - valueGetter: function valueGetter(raw) { - return "\"".concat(raw, "\""); - } - })); - case 'Number': - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONValueNode__WEBPACK_IMPORTED_MODULE_9__["default"], simpleNodeProps); +/***/ }), - case 'Boolean': - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONValueNode__WEBPACK_IMPORTED_MODULE_9__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, simpleNodeProps, { - valueGetter: function valueGetter(raw) { - return raw ? 'true' : 'false'; - } - })); +/***/ "./node_modules/lodash/_baseProperty.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash/_baseProperty.js ***! + \**********************************************/ +/***/ (function(module) { - case 'Date': - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONValueNode__WEBPACK_IMPORTED_MODULE_9__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, simpleNodeProps, { - valueGetter: function valueGetter(raw) { - return raw.toISOString(); - } - })); +/** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new accessor function. + */ +function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; +} - case 'Null': - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONValueNode__WEBPACK_IMPORTED_MODULE_9__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, simpleNodeProps, { - valueGetter: function valueGetter() { - return 'null'; - } - })); +module.exports = baseProperty; - case 'Undefined': - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONValueNode__WEBPACK_IMPORTED_MODULE_9__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, simpleNodeProps, { - valueGetter: function valueGetter() { - return 'undefined'; - } - })); - case 'Function': - case 'Symbol': - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONValueNode__WEBPACK_IMPORTED_MODULE_9__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, simpleNodeProps, { - valueGetter: function valueGetter(raw) { - return raw.toString(); - } - })); +/***/ }), - case 'Custom': - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONValueNode__WEBPACK_IMPORTED_MODULE_9__["default"], simpleNodeProps); +/***/ "./node_modules/lodash/_basePropertyDeep.js": +/*!**************************************************!*\ + !*** ./node_modules/lodash/_basePropertyDeep.js ***! + \**************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - default: - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONValueNode__WEBPACK_IMPORTED_MODULE_9__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, simpleNodeProps, { - valueGetter: function valueGetter() { - return "<".concat(nodeType, ">"); - } - })); - } -}; +var baseGet = __webpack_require__(/*! ./_baseGet */ "./node_modules/lodash/_baseGet.js"); -JSONNode.propTypes = { - getItemString: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func).isRequired, - keyPath: prop_types__WEBPACK_IMPORTED_MODULE_4___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_4___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_4___default().string), (prop_types__WEBPACK_IMPORTED_MODULE_4___default().number)]).isRequired).isRequired, - labelRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func).isRequired, - styling: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func).isRequired, - value: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().any), - valueRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func).isRequired, - isCustomNode: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func).isRequired -}; -/* harmony default export */ __webpack_exports__["default"] = (JSONNode); +/** + * A specialized version of `baseProperty` which supports deep paths. + * + * @private + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new accessor function. + */ +function basePropertyDeep(path) { + return function(object) { + return baseGet(object, path); + }; +} -/***/ }), +module.exports = basePropertyDeep; -/***/ "./node_modules/react-json-tree/lib/esm/JSONObjectNode.js": -/*!****************************************************************!*\ - !*** ./node_modules/react-json-tree/lib/esm/JSONObjectNode.js ***! - \****************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); -/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "prop-types"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _JSONNestedNode__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./JSONNestedNode */ "./node_modules/react-json-tree/lib/esm/JSONNestedNode.js"); +/***/ }), +/***/ "./node_modules/lodash/_baseRange.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash/_baseRange.js ***! + \*******************************************/ +/***/ (function(module) { -var _excluded = ["data"]; +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeCeil = Math.ceil, + nativeMax = Math.max; +/** + * The base implementation of `_.range` and `_.rangeRight` which doesn't + * coerce arguments. + * + * @private + * @param {number} start The start of the range. + * @param {number} end The end of the range. + * @param {number} step The value to increment or decrement by. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Array} Returns the range of numbers. + */ +function baseRange(start, end, step, fromRight) { + var index = -1, + length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), + result = Array(length); + while (length--) { + result[fromRight ? length : ++index] = start; + start += step; + } + return result; +} +module.exports = baseRange; -// Returns the "n Items" string for this node, -// generating and caching it if it hasn't been created yet. -function createItemString(data) { - var len = Object.getOwnPropertyNames(data).length; - return "".concat(len, " ").concat(len !== 1 ? 'keys' : 'key'); -} -// Configures to render an Object -var JSONObjectNode = function JSONObjectNode(_ref) { - var data = _ref.data, - props = (0,_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__["default"])(_ref, _excluded); +/***/ }), - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_JSONNestedNode__WEBPACK_IMPORTED_MODULE_4__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, props, { - data: data, - nodeType: "Object", - nodeTypeIndicator: props.nodeType === 'Error' ? 'Error()' : '{}', - createItemString: createItemString, - expandable: Object.getOwnPropertyNames(data).length > 0 - })); -}; +/***/ "./node_modules/lodash/_baseReduce.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_baseReduce.js ***! + \********************************************/ +/***/ (function(module) { -JSONObjectNode.propTypes = { - data: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object), - nodeType: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired -}; -/* harmony default export */ __webpack_exports__["default"] = (JSONObjectNode); +/** + * The base implementation of `_.reduce` and `_.reduceRight`, without support + * for iteratee shorthands, which iterates over `collection` using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} accumulator The initial value. + * @param {boolean} initAccum Specify using the first or last element of + * `collection` as the initial value. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the accumulated value. + */ +function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { + eachFunc(collection, function(value, index, collection) { + accumulator = initAccum + ? (initAccum = false, value) + : iteratee(accumulator, value, index, collection); + }); + return accumulator; +} -/***/ }), +module.exports = baseReduce; -/***/ "./node_modules/react-json-tree/lib/esm/JSONValueNode.js": -/*!***************************************************************!*\ - !*** ./node_modules/react-json-tree/lib/esm/JSONValueNode.js ***! - \***************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "prop-types"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/***/ }), +/***/ "./node_modules/lodash/_baseRest.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/_baseRest.js ***! + \******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js"), + overRest = __webpack_require__(/*! ./_overRest */ "./node_modules/lodash/_overRest.js"), + setToString = __webpack_require__(/*! ./_setToString */ "./node_modules/lodash/_setToString.js"); +/** + * The base implementation of `_.rest` which doesn't validate or coerce arguments. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + */ +function baseRest(func, start) { + return setToString(overRest(func, start, identity), func + ''); +} -var JSONValueNode = function JSONValueNode(_ref) { - var nodeType = _ref.nodeType, - styling = _ref.styling, - labelRenderer = _ref.labelRenderer, - keyPath = _ref.keyPath, - valueRenderer = _ref.valueRenderer, - value = _ref.value, - _ref$valueGetter = _ref.valueGetter, - valueGetter = _ref$valueGetter === void 0 ? function (value) { - return value; - } : _ref$valueGetter; - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("li", styling('value', nodeType, keyPath), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("label", styling(['label', 'valueLabel'], nodeType, keyPath), labelRenderer(keyPath, nodeType, false, false)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("span", styling('valueText', nodeType, keyPath), valueRenderer.apply(void 0, [valueGetter(value), value].concat((0,_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__["default"])(keyPath))))); -}; +module.exports = baseRest; -JSONValueNode.propTypes = { - nodeType: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired, - styling: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired, - labelRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired, - keyPath: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_2___default().string), (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number)]).isRequired).isRequired, - valueRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired, - value: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().any), - valueGetter: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func) -}; -/* harmony default export */ __webpack_exports__["default"] = (JSONValueNode); /***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/createStylingFromTheme.js": -/*!************************************************************************!*\ - !*** ./node_modules/react-json-tree/lib/esm/createStylingFromTheme.js ***! - \************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_baseSet.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/_baseSet.js ***! + \*****************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); -/* harmony import */ var react_base16_styling__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-base16-styling */ "./node_modules/react-base16-styling/lib/esm/index.js"); -/* harmony import */ var _themes_solarized__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./themes/solarized */ "./node_modules/react-json-tree/lib/esm/themes/solarized.js"); +var assignValue = __webpack_require__(/*! ./_assignValue */ "./node_modules/lodash/_assignValue.js"), + castPath = __webpack_require__(/*! ./_castPath */ "./node_modules/lodash/_castPath.js"), + isIndex = __webpack_require__(/*! ./_isIndex */ "./node_modules/lodash/_isIndex.js"), + isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), + toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js"); +/** + * The base implementation of `_.set`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ +function baseSet(object, path, value, customizer) { + if (!isObject(object)) { + return object; + } + path = castPath(path, object); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } + var index = -1, + length = path.length, + lastIndex = length - 1, + nested = object; -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } + while (nested != null && ++index < length) { + var key = toKey(path[index]), + newValue = value; + if (key === '__proto__' || key === 'constructor' || key === 'prototype') { + return object; + } + if (index != lastIndex) { + var objValue = nested[key]; + newValue = customizer ? customizer(objValue, key, nested) : undefined; + if (newValue === undefined) { + newValue = isObject(objValue) + ? objValue + : (isIndex(path[index + 1]) ? [] : {}); + } + } + assignValue(nested, key, newValue); + nested = nested[key]; + } + return object; +} +module.exports = baseSet; -var colorMap = function colorMap(theme) { - return { - BACKGROUND_COLOR: theme.base00, - TEXT_COLOR: theme.base07, - STRING_COLOR: theme.base0B, - DATE_COLOR: theme.base0B, - NUMBER_COLOR: theme.base09, - BOOLEAN_COLOR: theme.base09, - NULL_COLOR: theme.base08, - UNDEFINED_COLOR: theme.base08, - FUNCTION_COLOR: theme.base08, - SYMBOL_COLOR: theme.base08, - LABEL_COLOR: theme.base0D, - ARROW_COLOR: theme.base0D, - ITEM_STRING_COLOR: theme.base0B, - ITEM_STRING_EXPANDED_COLOR: theme.base03 - }; -}; -var valueColorMap = function valueColorMap(colors) { - return { - String: colors.STRING_COLOR, - Date: colors.DATE_COLOR, - Number: colors.NUMBER_COLOR, - Boolean: colors.BOOLEAN_COLOR, - Null: colors.NULL_COLOR, - Undefined: colors.UNDEFINED_COLOR, - Function: colors.FUNCTION_COLOR, - Symbol: colors.SYMBOL_COLOR - }; -}; +/***/ }), -var getDefaultThemeStyling = function getDefaultThemeStyling(theme) { - var colors = colorMap(theme); - return { - tree: { - border: 0, - padding: 0, - marginTop: '0.5em', - marginBottom: '0.5em', - marginLeft: '0.125em', - marginRight: 0, - listStyle: 'none', - MozUserSelect: 'none', - WebkitUserSelect: 'none', - backgroundColor: colors.BACKGROUND_COLOR - }, - value: function value(_ref, nodeType, keyPath) { - var style = _ref.style; - return { - style: _objectSpread(_objectSpread({}, style), {}, { - paddingTop: '0.25em', - paddingRight: 0, - marginLeft: '0.875em', - WebkitUserSelect: 'text', - MozUserSelect: 'text', - wordWrap: 'break-word', - paddingLeft: keyPath.length > 1 ? '2.125em' : '1.25em', - textIndent: '-0.5em', - wordBreak: 'break-all' - }) - }; - }, - label: { - display: 'inline-block', - color: colors.LABEL_COLOR - }, - valueLabel: { - margin: '0 0.5em 0 0' - }, - valueText: function valueText(_ref2, nodeType) { - var style = _ref2.style; - return { - style: _objectSpread(_objectSpread({}, style), {}, { - color: valueColorMap(colors)[nodeType] - }) - }; - }, - itemRange: function itemRange(styling, expanded) { - return { - style: { - paddingTop: expanded ? 0 : '0.25em', - cursor: 'pointer', - color: colors.LABEL_COLOR - } - }; - }, - arrow: function arrow(_ref3, nodeType, expanded) { - var style = _ref3.style; - return { - style: _objectSpread(_objectSpread({}, style), {}, { - marginLeft: 0, - transition: '150ms', - WebkitTransition: '150ms', - MozTransition: '150ms', - WebkitTransform: expanded ? 'rotateZ(90deg)' : 'rotateZ(0deg)', - MozTransform: expanded ? 'rotateZ(90deg)' : 'rotateZ(0deg)', - transform: expanded ? 'rotateZ(90deg)' : 'rotateZ(0deg)', - transformOrigin: '45% 50%', - WebkitTransformOrigin: '45% 50%', - MozTransformOrigin: '45% 50%', - position: 'relative', - lineHeight: '1.1em', - fontSize: '0.75em' - }) - }; - }, - arrowContainer: function arrowContainer(_ref4, arrowStyle) { - var style = _ref4.style; - return { - style: _objectSpread(_objectSpread({}, style), {}, { - display: 'inline-block', - paddingRight: '0.5em', - paddingLeft: arrowStyle === 'double' ? '1em' : 0, - cursor: 'pointer' - }) - }; - }, - arrowSign: { - color: colors.ARROW_COLOR - }, - arrowSignInner: { - position: 'absolute', - top: 0, - left: '-0.4em' - }, - nestedNode: function nestedNode(_ref5, keyPath, nodeType, expanded, expandable) { - var style = _ref5.style; - return { - style: _objectSpread(_objectSpread({}, style), {}, { - position: 'relative', - paddingTop: '0.25em', - marginLeft: keyPath.length > 1 ? '0.875em' : 0, - paddingLeft: !expandable ? '1.125em' : 0 - }) - }; - }, - rootNode: { - padding: 0, - margin: 0 - }, - nestedNodeLabel: function nestedNodeLabel(_ref6, keyPath, nodeType, expanded, expandable) { - var style = _ref6.style; - return { - style: _objectSpread(_objectSpread({}, style), {}, { - margin: 0, - padding: 0, - WebkitUserSelect: expandable ? 'inherit' : 'text', - MozUserSelect: expandable ? 'inherit' : 'text', - cursor: expandable ? 'pointer' : 'default' - }) - }; - }, - nestedNodeItemString: function nestedNodeItemString(_ref7, keyPath, nodeType, expanded) { - var style = _ref7.style; - return { - style: _objectSpread(_objectSpread({}, style), {}, { - paddingLeft: '0.5em', - cursor: 'default', - color: expanded ? colors.ITEM_STRING_EXPANDED_COLOR : colors.ITEM_STRING_COLOR - }) - }; - }, - nestedNodeItemType: { - marginLeft: '0.3em', - marginRight: '0.3em' - }, - nestedNodeChildren: function nestedNodeChildren(_ref8, nodeType, expanded) { - var style = _ref8.style; - return { - style: _objectSpread(_objectSpread({}, style), {}, { - padding: 0, - margin: 0, - listStyle: 'none', - display: expanded ? 'block' : 'none' - }) - }; - }, - rootNodeChildren: { - padding: 0, - margin: 0, - listStyle: 'none' - } - }; +/***/ "./node_modules/lodash/_baseSetToString.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash/_baseSetToString.js ***! + \*************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var constant = __webpack_require__(/*! ./constant */ "./node_modules/lodash/constant.js"), + defineProperty = __webpack_require__(/*! ./_defineProperty */ "./node_modules/lodash/_defineProperty.js"), + identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js"); + +/** + * The base implementation of `setToString` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ +var baseSetToString = !defineProperty ? identity : function(func, string) { + return defineProperty(func, 'toString', { + 'configurable': true, + 'enumerable': false, + 'value': constant(string), + 'writable': true + }); }; -var createStylingFromTheme = (0,react_base16_styling__WEBPACK_IMPORTED_MODULE_1__.createStyling)(getDefaultThemeStyling, { - defaultBase16: _themes_solarized__WEBPACK_IMPORTED_MODULE_2__["default"] -}); -/* harmony default export */ __webpack_exports__["default"] = (createStylingFromTheme); +module.exports = baseSetToString; + /***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/getCollectionEntries.js": -/*!**********************************************************************!*\ - !*** ./node_modules/react-json-tree/lib/esm/getCollectionEntries.js ***! - \**********************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_baseSortBy.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_baseSortBy.js ***! + \********************************************/ +/***/ (function(module) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ getCollectionEntries; } -/* harmony export */ }); -/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js"); +/** + * The base implementation of `_.sortBy` which uses `comparer` to define the + * sort order of `array` and replaces criteria objects with their corresponding + * values. + * + * @private + * @param {Array} array The array to sort. + * @param {Function} comparer The function to define sort order. + * @returns {Array} Returns `array`. + */ +function baseSortBy(array, comparer) { + var length = array.length; + array.sort(comparer); + while (length--) { + array[length] = array[length].value; + } + return array; +} -function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } +module.exports = baseSortBy; -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } +/***/ }), -function getLength(type, collection) { - if (type === 'Object') { - // eslint-disable-next-line @typescript-eslint/ban-types - return Object.keys(collection).length; - } else if (type === 'Array') { - return collection.length; - } +/***/ "./node_modules/lodash/_baseTimes.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash/_baseTimes.js ***! + \*******************************************/ +/***/ (function(module) { - return Infinity; -} +/** + * The base implementation of `_.times` without support for iteratee shorthands + * or max array length checks. + * + * @private + * @param {number} n The number of times to invoke `iteratee`. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the array of results. + */ +function baseTimes(n, iteratee) { + var index = -1, + result = Array(n); -function isIterableMap(collection) { - return typeof collection.set === 'function'; + while (++index < n) { + result[index] = iteratee(index); + } + return result; } -function getEntries(type, collection, sortObjectKeys) { - var from = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; - var to = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : Infinity; - var res; +module.exports = baseTimes; - if (type === 'Object') { - var keys = Object.getOwnPropertyNames(collection); - if (sortObjectKeys) { - keys.sort(sortObjectKeys === true ? undefined : sortObjectKeys); - } +/***/ }), - keys = keys.slice(from, to + 1); - res = { - entries: keys.map(function (key) { - return { - key: key, - value: collection[key] - }; - }) - }; - } else if (type === 'Array') { - res = { - entries: collection.slice(from, to + 1).map(function (val, idx) { - return { - key: idx + from, - value: val - }; - }) - }; - } else { - var idx = 0; - var entries = []; - var done = true; - var isMap = isIterableMap(collection); +/***/ "./node_modules/lodash/_baseToString.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash/_baseToString.js ***! + \**********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - var _iterator = _createForOfIteratorHelper(collection), - _step; +var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"), + arrayMap = __webpack_require__(/*! ./_arrayMap */ "./node_modules/lodash/_arrayMap.js"), + isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), + isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var item = _step.value; +/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0; - if (idx > to) { - done = false; - break; - } +/** Used to convert symbols to primitives and strings. */ +var symbolProto = Symbol ? Symbol.prototype : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; - if (from <= idx) { - if (isMap && Array.isArray(item)) { - if (typeof item[0] === 'string' || typeof item[0] === 'number') { - entries.push({ - key: item[0], - value: item[1] - }); - } else { - entries.push({ - key: "[entry ".concat(idx, "]"), - value: { - '[key]': item[0], - '[value]': item[1] - } - }); - } - } else { - entries.push({ - key: idx, - value: item - }); - } - } +/** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ +function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isArray(value)) { + // Recursively convert values (susceptible to call stack limits). + return arrayMap(value, baseToString) + ''; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; +} - idx++; - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } +module.exports = baseToString; + + +/***/ }), + +/***/ "./node_modules/lodash/_baseTrim.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/_baseTrim.js ***! + \******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var trimmedEndIndex = __webpack_require__(/*! ./_trimmedEndIndex */ "./node_modules/lodash/_trimmedEndIndex.js"); - res = { - hasMore: !done, - entries: entries - }; - } +/** Used to match leading whitespace. */ +var reTrimStart = /^\s+/; - return res; +/** + * The base implementation of `_.trim`. + * + * @private + * @param {string} string The string to trim. + * @returns {string} Returns the trimmed string. + */ +function baseTrim(string) { + return string + ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '') + : string; } -function getRanges(from, to, limit) { - var ranges = []; +module.exports = baseTrim; - while (to - from > limit * limit) { - limit = limit * limit; - } - for (var i = from; i <= to; i += limit) { - ranges.push({ - from: i, - to: Math.min(to, i + limit - 1) - }); - } +/***/ }), - return ranges; +/***/ "./node_modules/lodash/_baseUnary.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash/_baseUnary.js ***! + \*******************************************/ +/***/ (function(module) { + +/** + * The base implementation of `_.unary` without support for storing metadata. + * + * @private + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + */ +function baseUnary(func) { + return function(value) { + return func(value); + }; } -function getCollectionEntries(type, collection, sortObjectKeys, limit) { - var from = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; - var to = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : Infinity; - var getEntriesBound = getEntries.bind(null, type, collection, sortObjectKeys); +module.exports = baseUnary; - if (!limit) { - return getEntriesBound().entries; - } - var isSubset = to < Infinity; - var length = Math.min(to - from, getLength(type, collection)); +/***/ }), - if (type !== 'Iterable') { - if (length <= limit || limit < 7) { - return getEntriesBound(from, to).entries; +/***/ "./node_modules/lodash/_baseUniq.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/_baseUniq.js ***! + \******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var SetCache = __webpack_require__(/*! ./_SetCache */ "./node_modules/lodash/_SetCache.js"), + arrayIncludes = __webpack_require__(/*! ./_arrayIncludes */ "./node_modules/lodash/_arrayIncludes.js"), + arrayIncludesWith = __webpack_require__(/*! ./_arrayIncludesWith */ "./node_modules/lodash/_arrayIncludesWith.js"), + cacheHas = __webpack_require__(/*! ./_cacheHas */ "./node_modules/lodash/_cacheHas.js"), + createSet = __webpack_require__(/*! ./_createSet */ "./node_modules/lodash/_createSet.js"), + setToArray = __webpack_require__(/*! ./_setToArray */ "./node_modules/lodash/_setToArray.js"); + +/** Used as the size to enable large array optimizations. */ +var LARGE_ARRAY_SIZE = 200; + +/** + * The base implementation of `_.uniqBy` without support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new duplicate free array. + */ +function baseUniq(array, iteratee, comparator) { + var index = -1, + includes = arrayIncludes, + length = array.length, + isCommon = true, + result = [], + seen = result; + + if (comparator) { + isCommon = false; + includes = arrayIncludesWith; + } + else if (length >= LARGE_ARRAY_SIZE) { + var set = iteratee ? null : createSet(array); + if (set) { + return setToArray(set); } - } else { - if (length <= limit && !isSubset) { - return getEntriesBound(from, to).entries; + isCommon = false; + includes = cacheHas; + seen = new SetCache; + } + else { + seen = iteratee ? [] : result; + } + outer: + while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + value = (comparator || value !== 0) ? value : 0; + if (isCommon && computed === computed) { + var seenIndex = seen.length; + while (seenIndex--) { + if (seen[seenIndex] === computed) { + continue outer; + } + } + if (iteratee) { + seen.push(computed); + } + result.push(value); + } + else if (!includes(seen, computed, comparator)) { + if (seen !== result) { + seen.push(computed); + } + result.push(value); } } + return result; +} - var limitedEntries; +module.exports = baseUniq; - if (type === 'Iterable') { - var _getEntriesBound = getEntriesBound(from, from + limit - 1), - hasMore = _getEntriesBound.hasMore, - entries = _getEntriesBound.entries; - limitedEntries = hasMore ? [].concat((0,_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__["default"])(entries), (0,_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__["default"])(getRanges(from + limit, from + 2 * limit - 1, limit))) : entries; - } else { - limitedEntries = isSubset ? getRanges(from, to, limit) : [].concat((0,_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__["default"])(getEntriesBound(0, limit - 5).entries), (0,_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__["default"])(getRanges(limit - 4, length - 5, limit)), (0,_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__["default"])(getEntriesBound(length - 4, length - 1).entries)); - } +/***/ }), - return limitedEntries; +/***/ "./node_modules/lodash/_baseValues.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_baseValues.js ***! + \********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var arrayMap = __webpack_require__(/*! ./_arrayMap */ "./node_modules/lodash/_arrayMap.js"); + +/** + * The base implementation of `_.values` and `_.valuesIn` which creates an + * array of `object` property values corresponding to the property names + * of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the array of property values. + */ +function baseValues(object, props) { + return arrayMap(props, function(key) { + return object[key]; + }); } +module.exports = baseValues; + + /***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/index.js": -/*!*******************************************************!*\ - !*** ./node_modules/react-json-tree/lib/esm/index.js ***! - \*******************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_baseZipObject.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash/_baseZipObject.js ***! + \***********************************************/ +/***/ (function(module) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ JSONTree: function() { return /* binding */ JSONTree; } -/* harmony export */ }); -/* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); -/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); -/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/esm/classCallCheck.js"); -/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/esm/createClass.js"); -/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/esm/inherits.js"); -/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js"); -/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js"); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); -/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_9__); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ "prop-types"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__); -/* harmony import */ var _JSONNode__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./JSONNode */ "./node_modules/react-json-tree/lib/esm/JSONNode.js"); -/* harmony import */ var _createStylingFromTheme__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./createStylingFromTheme */ "./node_modules/react-json-tree/lib/esm/createStylingFromTheme.js"); -/* harmony import */ var react_base16_styling__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! react-base16-styling */ "./node_modules/react-base16-styling/lib/esm/index.js"); +/** + * This base implementation of `_.zipObject` which assigns values using `assignFunc`. + * + * @private + * @param {Array} props The property identifiers. + * @param {Array} values The property values. + * @param {Function} assignFunc The function to assign values. + * @returns {Object} Returns the new object. + */ +function baseZipObject(props, values, assignFunc) { + var index = -1, + length = props.length, + valsLength = values.length, + result = {}; + while (++index < length) { + var value = index < valsLength ? values[index] : undefined; + assignFunc(result, props[index], value); + } + return result; +} +module.exports = baseZipObject; +/***/ }), +/***/ "./node_modules/lodash/_cacheHas.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/_cacheHas.js ***! + \******************************************/ +/***/ (function(module) { +/** + * Checks if a `cache` value for `key` exists. + * + * @private + * @param {Object} cache The cache to query. + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function cacheHas(cache, key) { + return cache.has(key); +} +module.exports = cacheHas; -var _excluded = ["data", "keyPath", "postprocessValue", "hideRoot", "theme", "invertTheme"]; +/***/ }), -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__["default"])(this, result); }; } +/***/ "./node_modules/lodash/_castFunction.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash/_castFunction.js ***! + \**********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } +var identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js"); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } +/** + * Casts `value` to `identity` if it's not a function. + * + * @private + * @param {*} value The value to inspect. + * @returns {Function} Returns cast function. + */ +function castFunction(value) { + return typeof value == 'function' ? value : identity; +} -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7__["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } +module.exports = castFunction; -// ES6 + inline style port of JSONViewer https://bitbucket.org/davevedder/react-json-viewer/ -// all credits and original code to the author -// Dave Vedder http://www.eskimospy.com/ -// port by Daniele Zannotti http://www.github.com/dzannotti +/***/ }), +/***/ "./node_modules/lodash/_castPath.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/_castPath.js ***! + \******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), + isKey = __webpack_require__(/*! ./_isKey */ "./node_modules/lodash/_isKey.js"), + stringToPath = __webpack_require__(/*! ./_stringToPath */ "./node_modules/lodash/_stringToPath.js"), + toString = __webpack_require__(/*! ./toString */ "./node_modules/lodash/toString.js"); +/** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @param {Object} [object] The object to query keys on. + * @returns {Array} Returns the cast property path array. + */ +function castPath(value, object) { + if (isArray(value)) { + return value; + } + return isKey(value, object) ? [value] : stringToPath(toString(value)); +} +module.exports = castPath; -var identity = function identity(value) { - return value; -}; -var expandRootNode = function expandRootNode(keyPath, data, level) { - return level === 0; -}; +/***/ }), -var defaultItemString = function defaultItemString(type, data, itemType, itemString) { - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement("span", null, itemType, " ", itemString); -}; +/***/ "./node_modules/lodash/_cloneArrayBuffer.js": +/*!**************************************************!*\ + !*** ./node_modules/lodash/_cloneArrayBuffer.js ***! + \**************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var defaultLabelRenderer = function defaultLabelRenderer(_ref) { - var _ref2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_8__["default"])(_ref, 1), - label = _ref2[0]; +var Uint8Array = __webpack_require__(/*! ./_Uint8Array */ "./node_modules/lodash/_Uint8Array.js"); - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement("span", null, label, ":"); -}; +/** + * Creates a clone of `arrayBuffer`. + * + * @private + * @param {ArrayBuffer} arrayBuffer The array buffer to clone. + * @returns {ArrayBuffer} Returns the cloned array buffer. + */ +function cloneArrayBuffer(arrayBuffer) { + var result = new arrayBuffer.constructor(arrayBuffer.byteLength); + new Uint8Array(result).set(new Uint8Array(arrayBuffer)); + return result; +} -var noCustomNode = function noCustomNode() { - return false; -}; +module.exports = cloneArrayBuffer; -function checkLegacyTheming(theme, props) { - var deprecatedStylingMethodsMap = { - getArrowStyle: 'arrow', - getListStyle: 'nestedNodeChildren', - getItemStringStyle: 'nestedNodeItemString', - getLabelStyle: 'label', - getValueStyle: 'valueText' - }; - var deprecatedStylingMethods = Object.keys(deprecatedStylingMethodsMap).filter(function (name) { - return props[name]; - }); - if (deprecatedStylingMethods.length > 0) { - if (typeof theme === 'string') { - theme = { - extend: theme - }; - } else { - theme = _objectSpread({}, theme); - } +/***/ }), - deprecatedStylingMethods.forEach(function (name) { - // eslint-disable-next-line no-console - console.error("Styling method \"".concat(name, "\" is deprecated, use \"theme\" property instead")); +/***/ "./node_modules/lodash/_cloneBuffer.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_cloneBuffer.js ***! + \*********************************************/ +/***/ (function(module, exports, __webpack_require__) { - theme[deprecatedStylingMethodsMap[name]] = function (_ref3) { - var style = _ref3.style; +/* module decorator */ module = __webpack_require__.nmd(module); +var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } +/** Detect free variable `exports`. */ +var freeExports = true && exports && !exports.nodeType && exports; - return { - style: _objectSpread(_objectSpread({}, style), props[name].apply(props, args)) - }; - }; - }); - } +/** Detect free variable `module`. */ +var freeModule = freeExports && "object" == 'object' && module && !module.nodeType && module; - return theme; -} +/** Detect the popular CommonJS extension `module.exports`. */ +var moduleExports = freeModule && freeModule.exports === freeExports; -function getStateFromProps(props) { - var theme = checkLegacyTheming(props.theme, props); +/** Built-in value references. */ +var Buffer = moduleExports ? root.Buffer : undefined, + allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined; - if (props.invertTheme) { - theme = (0,react_base16_styling__WEBPACK_IMPORTED_MODULE_11__.invertTheme)(theme); +/** + * Creates a clone of `buffer`. + * + * @private + * @param {Buffer} buffer The buffer to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Buffer} Returns the cloned buffer. + */ +function cloneBuffer(buffer, isDeep) { + if (isDeep) { + return buffer.slice(); } + var length = buffer.length, + result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); - return { - styling: (0,_createStylingFromTheme__WEBPACK_IMPORTED_MODULE_12__["default"])(theme) - }; + buffer.copy(result); + return result; } -var JSONTree = /*#__PURE__*/function (_React$Component) { - (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__["default"])(JSONTree, _React$Component); +module.exports = cloneBuffer; - var _super = _createSuper(JSONTree); - function JSONTree(props) { - var _this; +/***/ }), - (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__["default"])(this, JSONTree); +/***/ "./node_modules/lodash/_cloneDataView.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash/_cloneDataView.js ***! + \***********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - _this = _super.call(this, props); - _this.state = getStateFromProps(props); - return _this; - } +var cloneArrayBuffer = __webpack_require__(/*! ./_cloneArrayBuffer */ "./node_modules/lodash/_cloneArrayBuffer.js"); - (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__["default"])(JSONTree, [{ - key: "UNSAFE_componentWillReceiveProps", - value: function UNSAFE_componentWillReceiveProps(nextProps) { - var _this2 = this; +/** + * Creates a clone of `dataView`. + * + * @private + * @param {Object} dataView The data view to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned data view. + */ +function cloneDataView(dataView, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; + return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); +} - if (['theme', 'invertTheme'].find(function (k) { - return nextProps[k] !== _this2.props[k]; - })) { - this.setState(getStateFromProps(nextProps)); - } - } - }, { - key: "shouldComponentUpdate", - value: function shouldComponentUpdate(nextProps) { - var _this3 = this; +module.exports = cloneDataView; - return !!Object.keys(nextProps).find(function (k) { - return k === 'keyPath' ? nextProps[k].join('/') !== _this3.props[k].join('/') : nextProps[k] !== _this3.props[k]; - }); - } - }, { - key: "render", - value: function render() { - var _this$props = this.props, - value = _this$props.data, - keyPath = _this$props.keyPath, - postprocessValue = _this$props.postprocessValue, - hideRoot = _this$props.hideRoot, - theme = _this$props.theme, - _ = _this$props.invertTheme, - rest = (0,_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__["default"])(_this$props, _excluded); - var styling = this.state.styling; - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement("ul", styling('tree'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement(_JSONNode__WEBPACK_IMPORTED_MODULE_13__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _objectSpread({ - postprocessValue: postprocessValue, - hideRoot: hideRoot, - styling: styling - }, rest), { - keyPath: hideRoot ? [] : keyPath, - value: postprocessValue(value) - }))); - } - }]); +/***/ }), - return JSONTree; -}((react__WEBPACK_IMPORTED_MODULE_9___default().Component)); +/***/ "./node_modules/lodash/_cloneRegExp.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_cloneRegExp.js ***! + \*********************************************/ +/***/ (function(module) { -(0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7__["default"])(JSONTree, "propTypes", { - data: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().any), - hideRoot: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().bool), - theme: prop_types__WEBPACK_IMPORTED_MODULE_10___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_10___default().object), (prop_types__WEBPACK_IMPORTED_MODULE_10___default().string)]), - invertTheme: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().bool), - keyPath: prop_types__WEBPACK_IMPORTED_MODULE_10___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_10___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_10___default().string), (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number)])), - postprocessValue: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().func), - sortObjectKeys: prop_types__WEBPACK_IMPORTED_MODULE_10___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_10___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_10___default().bool)]) -}); +/** Used to match `RegExp` flags from their coerced string values. */ +var reFlags = /\w*$/; + +/** + * Creates a clone of `regexp`. + * + * @private + * @param {Object} regexp The regexp to clone. + * @returns {Object} Returns the cloned regexp. + */ +function cloneRegExp(regexp) { + var result = new regexp.constructor(regexp.source, reFlags.exec(regexp)); + result.lastIndex = regexp.lastIndex; + return result; +} -(0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7__["default"])(JSONTree, "defaultProps", { - shouldExpandNode: expandRootNode, - hideRoot: false, - keyPath: ['root'], - getItemString: defaultItemString, - labelRenderer: defaultLabelRenderer, - valueRenderer: identity, - postprocessValue: identity, - isCustomNode: noCustomNode, - collectionLimit: 50, - invertTheme: true -}); +module.exports = cloneRegExp; -/***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/objType.js": -/*!*********************************************************!*\ - !*** ./node_modules/react-json-tree/lib/esm/objType.js ***! - \*********************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ }), -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ objType; } -/* harmony export */ }); -function objType(obj) { - var type = Object.prototype.toString.call(obj).slice(8, -1); +/***/ "./node_modules/lodash/_cloneSymbol.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_cloneSymbol.js ***! + \*********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - if (type === 'Object' && typeof obj[Symbol.iterator] === 'function') { - return 'Iterable'; - } +var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"); - if (type === 'Custom' && obj.constructor !== Object && obj instanceof Object) { - // For projects implementing objects overriding `.prototype[Symbol.toStringTag]` - return 'Object'; - } +/** Used to convert symbols to primitives and strings. */ +var symbolProto = Symbol ? Symbol.prototype : undefined, + symbolValueOf = symbolProto ? symbolProto.valueOf : undefined; - return type; +/** + * Creates a clone of the `symbol` object. + * + * @private + * @param {Object} symbol The symbol object to clone. + * @returns {Object} Returns the cloned symbol object. + */ +function cloneSymbol(symbol) { + return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {}; } -/***/ }), - -/***/ "./node_modules/react-json-tree/lib/esm/themes/solarized.js": -/*!******************************************************************!*\ - !*** ./node_modules/react-json-tree/lib/esm/themes/solarized.js ***! - \******************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +module.exports = cloneSymbol; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony default export */ __webpack_exports__["default"] = ({ - scheme: 'solarized', - author: 'ethan schoonover (http://ethanschoonover.com/solarized)', - base00: '#002b36', - base01: '#073642', - base02: '#586e75', - base03: '#657b83', - base04: '#839496', - base05: '#93a1a1', - base06: '#eee8d5', - base07: '#fdf6e3', - base08: '#dc322f', - base09: '#cb4b16', - base0A: '#b58900', - base0B: '#859900', - base0C: '#2aa198', - base0D: '#268bd2', - base0E: '#6c71c4', - base0F: '#d33682' -}); /***/ }), -/***/ "./node_modules/redux-actions/es/createAction.js": -/*!*******************************************************!*\ - !*** ./node_modules/redux-actions/es/createAction.js ***! - \*******************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_cloneTypedArray.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash/_cloneTypedArray.js ***! + \*************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ createAction; } -/* harmony export */ }); -/* harmony import */ var invariant__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! invariant */ "./node_modules/invariant/browser.js"); -/* harmony import */ var invariant__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(invariant__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/isFunction */ "./node_modules/redux-actions/es/utils/isFunction.js"); -/* harmony import */ var _utils_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/identity */ "./node_modules/redux-actions/es/utils/identity.js"); -/* harmony import */ var _utils_isNull__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils/isNull */ "./node_modules/redux-actions/es/utils/isNull.js"); +var cloneArrayBuffer = __webpack_require__(/*! ./_cloneArrayBuffer */ "./node_modules/lodash/_cloneArrayBuffer.js"); +/** + * Creates a clone of `typedArray`. + * + * @private + * @param {Object} typedArray The typed array to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned typed array. + */ +function cloneTypedArray(typedArray, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; + return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); +} +module.exports = cloneTypedArray; -function createAction(type, payloadCreator, metaCreator) { - if (payloadCreator === void 0) { - payloadCreator = _utils_identity__WEBPACK_IMPORTED_MODULE_1__["default"]; - } +/***/ }), - invariant__WEBPACK_IMPORTED_MODULE_0___default()((0,_utils_isFunction__WEBPACK_IMPORTED_MODULE_2__["default"])(payloadCreator) || (0,_utils_isNull__WEBPACK_IMPORTED_MODULE_3__["default"])(payloadCreator), 'Expected payloadCreator to be a function, undefined or null'); - var finalPayloadCreator = (0,_utils_isNull__WEBPACK_IMPORTED_MODULE_3__["default"])(payloadCreator) || payloadCreator === _utils_identity__WEBPACK_IMPORTED_MODULE_1__["default"] ? _utils_identity__WEBPACK_IMPORTED_MODULE_1__["default"] : function (head) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } +/***/ "./node_modules/lodash/_compareAscending.js": +/*!**************************************************!*\ + !*** ./node_modules/lodash/_compareAscending.js ***! + \**************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - return head instanceof Error ? head : payloadCreator.apply(void 0, [head].concat(args)); - }; - var hasMeta = (0,_utils_isFunction__WEBPACK_IMPORTED_MODULE_2__["default"])(metaCreator); - var typeString = type.toString(); +var isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); - var actionCreator = function actionCreator() { - var payload = finalPayloadCreator.apply(void 0, arguments); - var action = { - type: type - }; +/** + * Compares values to sort them in ascending order. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {number} Returns the sort order indicator for `value`. + */ +function compareAscending(value, other) { + if (value !== other) { + var valIsDefined = value !== undefined, + valIsNull = value === null, + valIsReflexive = value === value, + valIsSymbol = isSymbol(value); - if (payload instanceof Error) { - action.error = true; - } + var othIsDefined = other !== undefined, + othIsNull = other === null, + othIsReflexive = other === other, + othIsSymbol = isSymbol(other); - if (payload !== undefined) { - action.payload = payload; + if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) || + (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) || + (valIsNull && othIsDefined && othIsReflexive) || + (!valIsDefined && othIsReflexive) || + !valIsReflexive) { + return 1; } - - if (hasMeta) { - action.meta = metaCreator.apply(void 0, arguments); + if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) || + (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) || + (othIsNull && valIsDefined && valIsReflexive) || + (!othIsDefined && valIsReflexive) || + !othIsReflexive) { + return -1; } + } + return 0; +} - return action; - }; - - actionCreator.toString = function () { - return typeString; - }; +module.exports = compareAscending; - return actionCreator; -} /***/ }), -/***/ "./node_modules/redux-actions/es/utils/identity.js": -/*!*********************************************************!*\ - !*** ./node_modules/redux-actions/es/utils/identity.js ***! - \*********************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_compareMultiple.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash/_compareMultiple.js ***! + \*************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony default export */ __webpack_exports__["default"] = (function (value) { - return value; -}); +var compareAscending = __webpack_require__(/*! ./_compareAscending */ "./node_modules/lodash/_compareAscending.js"); -/***/ }), +/** + * Used by `_.orderBy` to compare multiple properties of a value to another + * and stable sort them. + * + * If `orders` is unspecified, all values are sorted in ascending order. Otherwise, + * specify an order of "desc" for descending or "asc" for ascending sort order + * of corresponding values. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {boolean[]|string[]} orders The order to sort by for each property. + * @returns {number} Returns the sort order indicator for `object`. + */ +function compareMultiple(object, other, orders) { + var index = -1, + objCriteria = object.criteria, + othCriteria = other.criteria, + length = objCriteria.length, + ordersLength = orders.length; -/***/ "./node_modules/redux-actions/es/utils/isFunction.js": -/*!***********************************************************!*\ - !*** ./node_modules/redux-actions/es/utils/isFunction.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + while (++index < length) { + var result = compareAscending(objCriteria[index], othCriteria[index]); + if (result) { + if (index >= ordersLength) { + return result; + } + var order = orders[index]; + return result * (order == 'desc' ? -1 : 1); + } + } + // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications + // that causes it, under certain circumstances, to provide the same value for + // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 + // for more details. + // + // This also ensures a stable sort in V8 and other engines. + // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details. + return object.index - other.index; +} + +module.exports = compareMultiple; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony default export */ __webpack_exports__["default"] = (function (value) { - return typeof value === 'function'; -}); /***/ }), -/***/ "./node_modules/redux-actions/es/utils/isNull.js": -/*!*******************************************************!*\ - !*** ./node_modules/redux-actions/es/utils/isNull.js ***! - \*******************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_copyArray.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash/_copyArray.js ***! + \*******************************************/ +/***/ (function(module) { + +/** + * Copies the values of `source` to `array`. + * + * @private + * @param {Array} source The array to copy values from. + * @param {Array} [array=[]] The array to copy values to. + * @returns {Array} Returns `array`. + */ +function copyArray(source, array) { + var index = -1, + length = source.length; + + array || (array = Array(length)); + while (++index < length) { + array[index] = source[index]; + } + return array; +} + +module.exports = copyArray; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony default export */ __webpack_exports__["default"] = (function (value) { - return value === null; -}); /***/ }), -/***/ "./node_modules/redux-thunk/es/index.js": -/*!**********************************************!*\ - !*** ./node_modules/redux-thunk/es/index.js ***! - \**********************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_copyObject.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_copyObject.js ***! + \********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** A function that accepts a potential "extra argument" value to be injected later, - * and returns an instance of the thunk middleware that uses that value +var assignValue = __webpack_require__(/*! ./_assignValue */ "./node_modules/lodash/_assignValue.js"), + baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ "./node_modules/lodash/_baseAssignValue.js"); + +/** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property identifiers to copy. + * @param {Object} [object={}] The object to copy properties to. + * @param {Function} [customizer] The function to customize copied values. + * @returns {Object} Returns `object`. */ -function createThunkMiddleware(extraArgument) { - // Standard Redux middleware definition pattern: - // See: https://redux.js.org/tutorials/fundamentals/part-4-store#writing-custom-middleware - var middleware = function middleware(_ref) { - var dispatch = _ref.dispatch, - getState = _ref.getState; - return function (next) { - return function (action) { - // The thunk middleware looks for any functions that were passed to `store.dispatch`. - // If this "action" is really a function, call it and return the result. - if (typeof action === 'function') { - // Inject the store's `dispatch` and `getState` methods, as well as any "extra arg" - return action(dispatch, getState, extraArgument); - } // Otherwise, pass the action down the middleware chain as usual +function copyObject(source, props, object, customizer) { + var isNew = !object; + object || (object = {}); + var index = -1, + length = props.length; - return next(action); - }; - }; - }; + while (++index < length) { + var key = props[index]; - return middleware; + var newValue = customizer + ? customizer(object[key], source[key], key, object, source) + : undefined; + + if (newValue === undefined) { + newValue = source[key]; + } + if (isNew) { + baseAssignValue(object, key, newValue); + } else { + assignValue(object, key, newValue); + } + } + return object; } -var thunk = createThunkMiddleware(); // Attach the factory function so users can create a customized version -// with whatever "extra arg" they want to inject into their thunks +module.exports = copyObject; -thunk.withExtraArgument = createThunkMiddleware; -/* harmony default export */ __webpack_exports__["default"] = (thunk); /***/ }), -/***/ "./node_modules/redux/es/redux.js": -/*!****************************************!*\ - !*** ./node_modules/redux/es/redux.js ***! - \****************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ __DO_NOT_USE__ActionTypes: function() { return /* binding */ ActionTypes; }, -/* harmony export */ applyMiddleware: function() { return /* binding */ applyMiddleware; }, -/* harmony export */ bindActionCreators: function() { return /* binding */ bindActionCreators; }, -/* harmony export */ combineReducers: function() { return /* binding */ combineReducers; }, -/* harmony export */ compose: function() { return /* binding */ compose; }, -/* harmony export */ createStore: function() { return /* binding */ createStore; }, -/* harmony export */ legacy_createStore: function() { return /* binding */ legacy_createStore; } -/* harmony export */ }); -/* harmony import */ var _babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectSpread2 */ "./node_modules/@babel/runtime/helpers/esm/objectSpread2.js"); +/***/ "./node_modules/lodash/_copySymbols.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_copySymbols.js ***! + \*********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var copyObject = __webpack_require__(/*! ./_copyObject */ "./node_modules/lodash/_copyObject.js"), + getSymbols = __webpack_require__(/*! ./_getSymbols */ "./node_modules/lodash/_getSymbols.js"); /** - * Adapted from React: https://github.com/facebook/react/blob/master/packages/shared/formatProdErrorMessage.js + * Copies own symbols of `source` to `object`. * - * Do not require this module directly! Use normal throw error calls. These messages will be replaced with error codes - * during build. - * @param {number} code + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. */ -function formatProdErrorMessage(code) { - return "Minified Redux error #" + code + "; visit https://redux.js.org/Errors?code=" + code + " for the full message or " + 'use the non-minified dev environment for full errors. '; +function copySymbols(source, object) { + return copyObject(source, getSymbols(source), object); } -// Inlined version of the `symbol-observable` polyfill -var $$observable = (function () { - return typeof Symbol === 'function' && Symbol.observable || '@@observable'; -})(); +module.exports = copySymbols; -/** - * These are private action types reserved by Redux. - * For any unknown actions, you must return the current state. - * If the current state is undefined, you must return the initial state. - * Do not reference these action types directly in your code. - */ -var randomString = function randomString() { - return Math.random().toString(36).substring(7).split('').join('.'); -}; -var ActionTypes = { - INIT: "@@redux/INIT" + randomString(), - REPLACE: "@@redux/REPLACE" + randomString(), - PROBE_UNKNOWN_ACTION: function PROBE_UNKNOWN_ACTION() { - return "@@redux/PROBE_UNKNOWN_ACTION" + randomString(); - } -}; +/***/ }), + +/***/ "./node_modules/lodash/_copySymbolsIn.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash/_copySymbolsIn.js ***! + \***********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var copyObject = __webpack_require__(/*! ./_copyObject */ "./node_modules/lodash/_copyObject.js"), + getSymbolsIn = __webpack_require__(/*! ./_getSymbolsIn */ "./node_modules/lodash/_getSymbolsIn.js"); /** - * @param {any} obj The object to inspect. - * @returns {boolean} True if the argument appears to be a plain object. + * Copies own and inherited symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. */ -function isPlainObject(obj) { - if (typeof obj !== 'object' || obj === null) return false; - var proto = obj; +function copySymbolsIn(source, object) { + return copyObject(source, getSymbolsIn(source), object); +} - while (Object.getPrototypeOf(proto) !== null) { - proto = Object.getPrototypeOf(proto); - } +module.exports = copySymbolsIn; - return Object.getPrototypeOf(obj) === proto; -} -// Inlined / shortened version of `kindOf` from https://github.com/jonschlinkert/kind-of -function miniKindOf(val) { - if (val === void 0) return 'undefined'; - if (val === null) return 'null'; - var type = typeof val; +/***/ }), - switch (type) { - case 'boolean': - case 'string': - case 'number': - case 'symbol': - case 'function': - { - return type; - } - } +/***/ "./node_modules/lodash/_coreJsData.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_coreJsData.js ***! + \********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - if (Array.isArray(val)) return 'array'; - if (isDate(val)) return 'date'; - if (isError(val)) return 'error'; - var constructorName = ctorName(val); +var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); - switch (constructorName) { - case 'Symbol': - case 'Promise': - case 'WeakMap': - case 'WeakSet': - case 'Map': - case 'Set': - return constructorName; - } // other +/** Used to detect overreaching core-js shims. */ +var coreJsData = root['__core-js_shared__']; + +module.exports = coreJsData; + + +/***/ }), + +/***/ "./node_modules/lodash/_createAssigner.js": +/*!************************************************!*\ + !*** ./node_modules/lodash/_createAssigner.js ***! + \************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var baseRest = __webpack_require__(/*! ./_baseRest */ "./node_modules/lodash/_baseRest.js"), + isIterateeCall = __webpack_require__(/*! ./_isIterateeCall */ "./node_modules/lodash/_isIterateeCall.js"); +/** + * Creates a function like `_.assign`. + * + * @private + * @param {Function} assigner The function to assign values. + * @returns {Function} Returns the new assigner function. + */ +function createAssigner(assigner) { + return baseRest(function(object, sources) { + var index = -1, + length = sources.length, + customizer = length > 1 ? sources[length - 1] : undefined, + guard = length > 2 ? sources[2] : undefined; - return type.slice(8, -1).toLowerCase().replace(/\s/g, ''); -} + customizer = (assigner.length > 3 && typeof customizer == 'function') + ? (length--, customizer) + : undefined; -function ctorName(val) { - return typeof val.constructor === 'function' ? val.constructor.name : null; + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined : customizer; + length = 1; + } + object = Object(object); + while (++index < length) { + var source = sources[index]; + if (source) { + assigner(object, source, index, customizer); + } + } + return object; + }); } -function isError(val) { - return val instanceof Error || typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number'; -} +module.exports = createAssigner; -function isDate(val) { - if (val instanceof Date) return true; - return typeof val.toDateString === 'function' && typeof val.getDate === 'function' && typeof val.setDate === 'function'; -} -function kindOf(val) { - var typeOfVal = typeof val; +/***/ }), - if (true) { - typeOfVal = miniKindOf(val); - } +/***/ "./node_modules/lodash/_createBaseEach.js": +/*!************************************************!*\ + !*** ./node_modules/lodash/_createBaseEach.js ***! + \************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - return typeOfVal; -} +var isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"); /** - * @deprecated - * - * **We recommend using the `configureStore` method - * of the `@reduxjs/toolkit` package**, which replaces `createStore`. - * - * Redux Toolkit is our recommended approach for writing Redux logic today, - * including store setup, reducers, data fetching, and more. - * - * **For more details, please read this Redux docs page:** - * **https://redux.js.org/introduction/why-rtk-is-redux-today** - * - * `configureStore` from Redux Toolkit is an improved version of `createStore` that - * simplifies setup and helps avoid common bugs. - * - * You should not be using the `redux` core package by itself today, except for learning purposes. - * The `createStore` method from the core `redux` package will not be removed, but we encourage - * all users to migrate to using Redux Toolkit for all Redux code. - * - * If you want to use `createStore` without this visual deprecation warning, use - * the `legacy_createStore` import instead: - * - * `import { legacy_createStore as createStore} from 'redux'` + * Creates a `baseEach` or `baseEachRight` function. * + * @private + * @param {Function} eachFunc The function to iterate over a collection. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. */ +function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee) { + if (collection == null) { + return collection; + } + if (!isArrayLike(collection)) { + return eachFunc(collection, iteratee); + } + var length = collection.length, + index = fromRight ? length : -1, + iterable = Object(collection); -function createStore(reducer, preloadedState, enhancer) { - var _ref2; - - if (typeof preloadedState === 'function' && typeof enhancer === 'function' || typeof enhancer === 'function' && typeof arguments[3] === 'function') { - throw new Error( false ? 0 : 'It looks like you are passing several store enhancers to ' + 'createStore(). This is not supported. Instead, compose them ' + 'together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.'); - } + while ((fromRight ? index-- : ++index < length)) { + if (iteratee(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; +} - if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') { - enhancer = preloadedState; - preloadedState = undefined; - } +module.exports = createBaseEach; - if (typeof enhancer !== 'undefined') { - if (typeof enhancer !== 'function') { - throw new Error( false ? 0 : "Expected the enhancer to be a function. Instead, received: '" + kindOf(enhancer) + "'"); - } - return enhancer(createStore)(reducer, preloadedState); - } +/***/ }), - if (typeof reducer !== 'function') { - throw new Error( false ? 0 : "Expected the root reducer to be a function. Instead, received: '" + kindOf(reducer) + "'"); - } +/***/ "./node_modules/lodash/_createBaseFor.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash/_createBaseFor.js ***! + \***********************************************/ +/***/ (function(module) { - var currentReducer = reducer; - var currentState = preloadedState; - var currentListeners = []; - var nextListeners = currentListeners; - var isDispatching = false; - /** - * This makes a shallow copy of currentListeners so we can use - * nextListeners as a temporary list while dispatching. - * - * This prevents any bugs around consumers calling - * subscribe/unsubscribe in the middle of a dispatch. - */ +/** + * Creates a base function for methods like `_.forIn` and `_.forOwn`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ +function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var index = -1, + iterable = Object(object), + props = keysFunc(object), + length = props.length; - function ensureCanMutateNextListeners() { - if (nextListeners === currentListeners) { - nextListeners = currentListeners.slice(); + while (length--) { + var key = props[fromRight ? length : ++index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } } - } - /** - * Reads the state tree managed by the store. - * - * @returns {any} The current state tree of your application. - */ + return object; + }; +} +module.exports = createBaseFor; - function getState() { - if (isDispatching) { - throw new Error( false ? 0 : 'You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.'); - } - return currentState; - } - /** - * Adds a change listener. It will be called any time an action is dispatched, - * and some part of the state tree may potentially have changed. You may then - * call `getState()` to read the current state tree inside the callback. - * - * You may call `dispatch()` from a change listener, with the following - * caveats: - * - * 1. The subscriptions are snapshotted just before every `dispatch()` call. - * If you subscribe or unsubscribe while the listeners are being invoked, this - * will not have any effect on the `dispatch()` that is currently in progress. - * However, the next `dispatch()` call, whether nested or not, will use a more - * recent snapshot of the subscription list. - * - * 2. The listener should not expect to see all state changes, as the state - * might have been updated multiple times during a nested `dispatch()` before - * the listener is called. It is, however, guaranteed that all subscribers - * registered before the `dispatch()` started will be called with the latest - * state by the time it exits. - * - * @param {Function} listener A callback to be invoked on every dispatch. - * @returns {Function} A function to remove this change listener. - */ +/***/ }), +/***/ "./node_modules/lodash/_createFind.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_createFind.js ***! + \********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - function subscribe(listener) { - if (typeof listener !== 'function') { - throw new Error( false ? 0 : "Expected the listener to be a function. Instead, received: '" + kindOf(listener) + "'"); - } +var baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), + isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"), + keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); - if (isDispatching) { - throw new Error( false ? 0 : 'You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.'); +/** + * Creates a `_.find` or `_.findLast` function. + * + * @private + * @param {Function} findIndexFunc The function to find the collection index. + * @returns {Function} Returns the new find function. + */ +function createFind(findIndexFunc) { + return function(collection, predicate, fromIndex) { + var iterable = Object(collection); + if (!isArrayLike(collection)) { + var iteratee = baseIteratee(predicate, 3); + collection = keys(collection); + predicate = function(key) { return iteratee(iterable[key], key, iterable); }; } + var index = findIndexFunc(collection, predicate, fromIndex); + return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined; + }; +} - var isSubscribed = true; - ensureCanMutateNextListeners(); - nextListeners.push(listener); - return function unsubscribe() { - if (!isSubscribed) { - return; - } +module.exports = createFind; - if (isDispatching) { - throw new Error( false ? 0 : 'You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.'); - } - isSubscribed = false; - ensureCanMutateNextListeners(); - var index = nextListeners.indexOf(listener); - nextListeners.splice(index, 1); - currentListeners = null; - }; - } - /** - * Dispatches an action. It is the only way to trigger a state change. - * - * The `reducer` function, used to create the store, will be called with the - * current state tree and the given `action`. Its return value will - * be considered the **next** state of the tree, and the change listeners - * will be notified. - * - * The base implementation only supports plain object actions. If you want to - * dispatch a Promise, an Observable, a thunk, or something else, you need to - * wrap your store creating function into the corresponding middleware. For - * example, see the documentation for the `redux-thunk` package. Even the - * middleware will eventually dispatch plain object actions using this method. - * - * @param {Object} action A plain object representing “what changed”. It is - * a good idea to keep actions serializable so you can record and replay user - * sessions, or use the time travelling `redux-devtools`. An action must have - * a `type` property which may not be `undefined`. It is a good idea to use - * string constants for action types. - * - * @returns {Object} For convenience, the same action object you dispatched. - * - * Note that, if you use a custom middleware, it may wrap `dispatch()` to - * return something else (for example, a Promise you can await). - */ +/***/ }), +/***/ "./node_modules/lodash/_createRange.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_createRange.js ***! + \*********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - function dispatch(action) { - if (!isPlainObject(action)) { - throw new Error( false ? 0 : "Actions must be plain objects. Instead, the actual type was: '" + kindOf(action) + "'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples."); - } +var baseRange = __webpack_require__(/*! ./_baseRange */ "./node_modules/lodash/_baseRange.js"), + isIterateeCall = __webpack_require__(/*! ./_isIterateeCall */ "./node_modules/lodash/_isIterateeCall.js"), + toFinite = __webpack_require__(/*! ./toFinite */ "./node_modules/lodash/toFinite.js"); - if (typeof action.type === 'undefined') { - throw new Error( false ? 0 : 'Actions may not have an undefined "type" property. You may have misspelled an action type string constant.'); +/** + * Creates a `_.range` or `_.rangeRight` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new range function. + */ +function createRange(fromRight) { + return function(start, end, step) { + if (step && typeof step != 'number' && isIterateeCall(start, end, step)) { + end = step = undefined; } - - if (isDispatching) { - throw new Error( false ? 0 : 'Reducers may not dispatch actions.'); + // Ensure the sign of `-0` is preserved. + start = toFinite(start); + if (end === undefined) { + end = start; + start = 0; + } else { + end = toFinite(end); } + step = step === undefined ? (start < end ? 1 : -1) : toFinite(step); + return baseRange(start, end, step, fromRight); + }; +} - try { - isDispatching = true; - currentState = currentReducer(currentState, action); - } finally { - isDispatching = false; - } +module.exports = createRange; - var listeners = currentListeners = nextListeners; - for (var i = 0; i < listeners.length; i++) { - var listener = listeners[i]; - listener(); - } +/***/ }), - return action; - } - /** - * Replaces the reducer currently used by the store to calculate the state. - * - * You might need this if your app implements code splitting and you want to - * load some of the reducers dynamically. You might also need this if you - * implement a hot reloading mechanism for Redux. - * - * @param {Function} nextReducer The reducer for the store to use instead. - * @returns {void} - */ +/***/ "./node_modules/lodash/_createSet.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash/_createSet.js ***! + \*******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var Set = __webpack_require__(/*! ./_Set */ "./node_modules/lodash/_Set.js"), + noop = __webpack_require__(/*! ./noop */ "./node_modules/lodash/noop.js"), + setToArray = __webpack_require__(/*! ./_setToArray */ "./node_modules/lodash/_setToArray.js"); - function replaceReducer(nextReducer) { - if (typeof nextReducer !== 'function') { - throw new Error( false ? 0 : "Expected the nextReducer to be a function. Instead, received: '" + kindOf(nextReducer)); - } +/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0; - currentReducer = nextReducer; // This action has a similiar effect to ActionTypes.INIT. - // Any reducers that existed in both the new and old rootReducer - // will receive the previous state. This effectively populates - // the new state tree with any relevant data from the old one. +/** + * Creates a set object of `values`. + * + * @private + * @param {Array} values The values to add to the set. + * @returns {Object} Returns the new set. + */ +var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) { + return new Set(values); +}; - dispatch({ - type: ActionTypes.REPLACE - }); - } - /** - * Interoperability point for observable/reactive libraries. - * @returns {observable} A minimal observable of state changes. - * For more information, see the observable proposal: - * https://github.com/tc39/proposal-observable - */ +module.exports = createSet; - function observable() { - var _ref; +/***/ }), - var outerSubscribe = subscribe; - return _ref = { - /** - * The minimal observable subscription method. - * @param {Object} observer Any object that can be used as an observer. - * The observer object should have a `next` method. - * @returns {subscription} An object with an `unsubscribe` method that can - * be used to unsubscribe the observable from the store, and prevent further - * emission of values from the observable. - */ - subscribe: function subscribe(observer) { - if (typeof observer !== 'object' || observer === null) { - throw new Error( false ? 0 : "Expected the observer to be an object. Instead, received: '" + kindOf(observer) + "'"); - } +/***/ "./node_modules/lodash/_defineProperty.js": +/*!************************************************!*\ + !*** ./node_modules/lodash/_defineProperty.js ***! + \************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - function observeState() { - if (observer.next) { - observer.next(getState()); - } - } +var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"); - observeState(); - var unsubscribe = outerSubscribe(observeState); - return { - unsubscribe: unsubscribe - }; - } - }, _ref[$$observable] = function () { - return this; - }, _ref; - } // When a store is created, an "INIT" action is dispatched so that every - // reducer returns their initial state. This effectively populates - // the initial state tree. +var defineProperty = (function() { + try { + var func = getNative(Object, 'defineProperty'); + func({}, '', {}); + return func; + } catch (e) {} +}()); +module.exports = defineProperty; - dispatch({ - type: ActionTypes.INIT - }); - return _ref2 = { - dispatch: dispatch, - subscribe: subscribe, - getState: getState, - replaceReducer: replaceReducer - }, _ref2[$$observable] = observable, _ref2; -} -/** - * Creates a Redux store that holds the state tree. - * - * **We recommend using `configureStore` from the - * `@reduxjs/toolkit` package**, which replaces `createStore`: - * **https://redux.js.org/introduction/why-rtk-is-redux-today** - * - * The only way to change the data in the store is to call `dispatch()` on it. - * - * There should only be a single store in your app. To specify how different - * parts of the state tree respond to actions, you may combine several reducers - * into a single reducer function by using `combineReducers`. - * - * @param {Function} reducer A function that returns the next state tree, given - * the current state tree and the action to handle. - * - * @param {any} [preloadedState] The initial state. You may optionally specify it - * to hydrate the state from the server in universal apps, or to restore a - * previously serialized user session. - * If you use `combineReducers` to produce the root reducer function, this must be - * an object with the same shape as `combineReducers` keys. - * - * @param {Function} [enhancer] The store enhancer. You may optionally specify it - * to enhance the store with third-party capabilities such as middleware, - * time travel, persistence, etc. The only store enhancer that ships with Redux - * is `applyMiddleware()`. - * - * @returns {Store} A Redux store that lets you read the state, dispatch actions - * and subscribe to changes. - */ -var legacy_createStore = createStore; +/***/ }), + +/***/ "./node_modules/lodash/_equalArrays.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_equalArrays.js ***! + \*********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var SetCache = __webpack_require__(/*! ./_SetCache */ "./node_modules/lodash/_SetCache.js"), + arraySome = __webpack_require__(/*! ./_arraySome */ "./node_modules/lodash/_arraySome.js"), + cacheHas = __webpack_require__(/*! ./_cacheHas */ "./node_modules/lodash/_cacheHas.js"); + +/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; /** - * Prints a warning in the console if it exists. + * A specialized version of `baseIsEqualDeep` for arrays with support for + * partial deep comparisons. * - * @param {String} message The warning message. - * @returns {void} + * @private + * @param {Array} array The array to compare. + * @param {Array} other The other array to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `array` and `other` objects. + * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. */ -function warning(message) { - /* eslint-disable no-console */ - if (typeof console !== 'undefined' && typeof console.error === 'function') { - console.error(message); +function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + arrLength = array.length, + othLength = other.length; + + if (arrLength != othLength && !(isPartial && othLength > arrLength)) { + return false; } - /* eslint-enable no-console */ + // Check that cyclic values are equal. + var arrStacked = stack.get(array); + var othStacked = stack.get(other); + if (arrStacked && othStacked) { + return arrStacked == other && othStacked == array; + } + var index = -1, + result = true, + seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined; + stack.set(array, other); + stack.set(other, array); - try { - // This error was thrown as a convenience so that if you enable - // "break on all exceptions" in your console, - // it would pause the execution at this line. - throw new Error(message); - } catch (e) {} // eslint-disable-line no-empty + // Ignore non-index properties. + while (++index < arrLength) { + var arrValue = array[index], + othValue = other[index]; + if (customizer) { + var compared = isPartial + ? customizer(othValue, arrValue, index, other, array, stack) + : customizer(arrValue, othValue, index, array, other, stack); + } + if (compared !== undefined) { + if (compared) { + continue; + } + result = false; + break; + } + // Recursively compare arrays (susceptible to call stack limits). + if (seen) { + if (!arraySome(other, function(othValue, othIndex) { + if (!cacheHas(seen, othIndex) && + (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { + return seen.push(othIndex); + } + })) { + result = false; + break; + } + } else if (!( + arrValue === othValue || + equalFunc(arrValue, othValue, bitmask, customizer, stack) + )) { + result = false; + break; + } + } + stack['delete'](array); + stack['delete'](other); + return result; } -function getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) { - var reducerKeys = Object.keys(reducers); - var argumentName = action && action.type === ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer'; +module.exports = equalArrays; - if (reducerKeys.length === 0) { - return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.'; - } - if (!isPlainObject(inputState)) { - return "The " + argumentName + " has unexpected type of \"" + kindOf(inputState) + "\". Expected argument to be an object with the following " + ("keys: \"" + reducerKeys.join('", "') + "\""); - } +/***/ }), - var unexpectedKeys = Object.keys(inputState).filter(function (key) { - return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key]; - }); - unexpectedKeys.forEach(function (key) { - unexpectedKeyCache[key] = true; - }); - if (action && action.type === ActionTypes.REPLACE) return; +/***/ "./node_modules/lodash/_equalByTag.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_equalByTag.js ***! + \********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - if (unexpectedKeys.length > 0) { - return "Unexpected " + (unexpectedKeys.length > 1 ? 'keys' : 'key') + " " + ("\"" + unexpectedKeys.join('", "') + "\" found in " + argumentName + ". ") + "Expected to find one of the known reducer keys instead: " + ("\"" + reducerKeys.join('", "') + "\". Unexpected keys will be ignored."); - } -} +var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"), + Uint8Array = __webpack_require__(/*! ./_Uint8Array */ "./node_modules/lodash/_Uint8Array.js"), + eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"), + equalArrays = __webpack_require__(/*! ./_equalArrays */ "./node_modules/lodash/_equalArrays.js"), + mapToArray = __webpack_require__(/*! ./_mapToArray */ "./node_modules/lodash/_mapToArray.js"), + setToArray = __webpack_require__(/*! ./_setToArray */ "./node_modules/lodash/_setToArray.js"); -function assertReducerShape(reducers) { - Object.keys(reducers).forEach(function (key) { - var reducer = reducers[key]; - var initialState = reducer(undefined, { - type: ActionTypes.INIT - }); +/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; - if (typeof initialState === 'undefined') { - throw new Error( false ? 0 : "The slice reducer for key \"" + key + "\" returned undefined during initialization. " + "If the state passed to the reducer is undefined, you must " + "explicitly return the initial state. The initial state may " + "not be undefined. If you don't want to set a value for this reducer, " + "you can use null instead of undefined."); - } +/** `Object#toString` result references. */ +var boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + mapTag = '[object Map]', + numberTag = '[object Number]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + symbolTag = '[object Symbol]'; + +var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]'; + +/** Used to convert symbols to primitives and strings. */ +var symbolProto = Symbol ? Symbol.prototype : undefined, + symbolValueOf = symbolProto ? symbolProto.valueOf : undefined; - if (typeof reducer(undefined, { - type: ActionTypes.PROBE_UNKNOWN_ACTION() - }) === 'undefined') { - throw new Error( false ? 0 : "The slice reducer for key \"" + key + "\" returned undefined when probed with a random type. " + ("Don't try to handle '" + ActionTypes.INIT + "' or other actions in \"redux/*\" ") + "namespace. They are considered private. Instead, you must return the " + "current state for any unknown actions, unless it is undefined, " + "in which case you must return the initial state, regardless of the " + "action type. The initial state may not be undefined, but can be null."); - } - }); -} /** - * Turns an object whose values are different reducer functions, into a single - * reducer function. It will call every child reducer, and gather their results - * into a single state object, whose keys correspond to the keys of the passed - * reducer functions. + * A specialized version of `baseIsEqualDeep` for comparing objects of + * the same `toStringTag`. * - * @param {Object} reducers An object whose values correspond to different - * reducer functions that need to be combined into one. One handy way to obtain - * it is to use ES6 `import * as reducers` syntax. The reducers may never return - * undefined for any action. Instead, they should return their initial state - * if the state passed to them was undefined, and the current state for any - * unrecognized action. + * **Note:** This function only supports comparing values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. * - * @returns {Function} A reducer function that invokes every reducer inside the - * passed object, and builds a state object with the same shape. + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {string} tag The `toStringTag` of the objects to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ +function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { + switch (tag) { + case dataViewTag: + if ((object.byteLength != other.byteLength) || + (object.byteOffset != other.byteOffset)) { + return false; + } + object = object.buffer; + other = other.buffer; + case arrayBufferTag: + if ((object.byteLength != other.byteLength) || + !equalFunc(new Uint8Array(object), new Uint8Array(other))) { + return false; + } + return true; -function combineReducers(reducers) { - var reducerKeys = Object.keys(reducers); - var finalReducers = {}; - - for (var i = 0; i < reducerKeys.length; i++) { - var key = reducerKeys[i]; + case boolTag: + case dateTag: + case numberTag: + // Coerce booleans to `1` or `0` and dates to milliseconds. + // Invalid dates are coerced to `NaN`. + return eq(+object, +other); - if (true) { - if (typeof reducers[key] === 'undefined') { - warning("No reducer provided for key \"" + key + "\""); - } - } + case errorTag: + return object.name == other.name && object.message == other.message; - if (typeof reducers[key] === 'function') { - finalReducers[key] = reducers[key]; - } - } + case regexpTag: + case stringTag: + // Coerce regexes to strings and treat strings, primitives and objects, + // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring + // for more details. + return object == (other + ''); - var finalReducerKeys = Object.keys(finalReducers); // This is used to make sure we don't warn about the same - // keys multiple times. + case mapTag: + var convert = mapToArray; - var unexpectedKeyCache; + case setTag: + var isPartial = bitmask & COMPARE_PARTIAL_FLAG; + convert || (convert = setToArray); - if (true) { - unexpectedKeyCache = {}; - } + if (object.size != other.size && !isPartial) { + return false; + } + // Assume cyclic values are equal. + var stacked = stack.get(object); + if (stacked) { + return stacked == other; + } + bitmask |= COMPARE_UNORDERED_FLAG; - var shapeAssertionError; + // Recursively compare objects (susceptible to call stack limits). + stack.set(object, other); + var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); + stack['delete'](object); + return result; - try { - assertReducerShape(finalReducers); - } catch (e) { - shapeAssertionError = e; + case symbolTag: + if (symbolValueOf) { + return symbolValueOf.call(object) == symbolValueOf.call(other); + } } + return false; +} - return function combination(state, action) { - if (state === void 0) { - state = {}; - } - - if (shapeAssertionError) { - throw shapeAssertionError; - } +module.exports = equalByTag; - if (true) { - var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache); - if (warningMessage) { - warning(warningMessage); - } - } +/***/ }), - var hasChanged = false; - var nextState = {}; +/***/ "./node_modules/lodash/_equalObjects.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash/_equalObjects.js ***! + \**********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - for (var _i = 0; _i < finalReducerKeys.length; _i++) { - var _key = finalReducerKeys[_i]; - var reducer = finalReducers[_key]; - var previousStateForKey = state[_key]; - var nextStateForKey = reducer(previousStateForKey, action); +var getAllKeys = __webpack_require__(/*! ./_getAllKeys */ "./node_modules/lodash/_getAllKeys.js"); - if (typeof nextStateForKey === 'undefined') { - var actionType = action && action.type; - throw new Error( false ? 0 : "When called with an action of type " + (actionType ? "\"" + String(actionType) + "\"" : '(unknown type)') + ", the slice reducer for key \"" + _key + "\" returned undefined. " + "To ignore an action, you must explicitly return the previous state. " + "If you want this reducer to hold no value, you can return null instead of undefined."); - } +/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG = 1; - nextState[_key] = nextStateForKey; - hasChanged = hasChanged || nextStateForKey !== previousStateForKey; - } +/** Used for built-in method references. */ +var objectProto = Object.prototype; - hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length; - return hasChanged ? nextState : state; - }; -} +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; -function bindActionCreator(actionCreator, dispatch) { - return function () { - return dispatch(actionCreator.apply(this, arguments)); - }; -} /** - * Turns an object whose values are action creators, into an object with the - * same keys, but with every function wrapped into a `dispatch` call so they - * may be invoked directly. This is just a convenience method, as you can call - * `store.dispatch(MyActionCreators.doSomething())` yourself just fine. - * - * For convenience, you can also pass an action creator as the first argument, - * and get a dispatch wrapped function in return. - * - * @param {Function|Object} actionCreators An object whose values are action - * creator functions. One handy way to obtain it is to use ES6 `import * as` - * syntax. You may also pass a single function. - * - * @param {Function} dispatch The `dispatch` function available on your Redux - * store. + * A specialized version of `baseIsEqualDeep` for objects with support for + * partial deep comparisons. * - * @returns {Function|Object} The object mimicking the original object, but with - * every action creator wrapped into the `dispatch` call. If you passed a - * function as `actionCreators`, the return value will also be a single - * function. + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ +function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + objProps = getAllKeys(object), + objLength = objProps.length, + othProps = getAllKeys(other), + othLength = othProps.length; - -function bindActionCreators(actionCreators, dispatch) { - if (typeof actionCreators === 'function') { - return bindActionCreator(actionCreators, dispatch); + if (objLength != othLength && !isPartial) { + return false; } - - if (typeof actionCreators !== 'object' || actionCreators === null) { - throw new Error( false ? 0 : "bindActionCreators expected an object or a function, but instead received: '" + kindOf(actionCreators) + "'. " + "Did you write \"import ActionCreators from\" instead of \"import * as ActionCreators from\"?"); + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { + return false; + } } + // Check that cyclic values are equal. + var objStacked = stack.get(object); + var othStacked = stack.get(other); + if (objStacked && othStacked) { + return objStacked == other && othStacked == object; + } + var result = true; + stack.set(object, other); + stack.set(other, object); - var boundActionCreators = {}; - - for (var key in actionCreators) { - var actionCreator = actionCreators[key]; + var skipCtor = isPartial; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], + othValue = other[key]; - if (typeof actionCreator === 'function') { - boundActionCreators[key] = bindActionCreator(actionCreator, dispatch); + if (customizer) { + var compared = isPartial + ? customizer(othValue, objValue, key, other, object, stack) + : customizer(objValue, othValue, key, object, other, stack); + } + // Recursively compare objects (susceptible to call stack limits). + if (!(compared === undefined + ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) + : compared + )) { + result = false; + break; } + skipCtor || (skipCtor = key == 'constructor'); } + if (result && !skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; - return boundActionCreators; + // Non `Object` object instances with different constructors are not equal. + if (objCtor != othCtor && + ('constructor' in object && 'constructor' in other) && + !(typeof objCtor == 'function' && objCtor instanceof objCtor && + typeof othCtor == 'function' && othCtor instanceof othCtor)) { + result = false; + } + } + stack['delete'](object); + stack['delete'](other); + return result; } -/** - * Composes single-argument functions from right to left. The rightmost - * function can take multiple arguments as it provides the signature for - * the resulting composite function. - * - * @param {...Function} funcs The functions to compose. - * @returns {Function} A function obtained by composing the argument functions - * from right to left. For example, compose(f, g, h) is identical to doing - * (...args) => f(g(h(...args))). - */ -function compose() { - for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) { - funcs[_key] = arguments[_key]; - } +module.exports = equalObjects; - if (funcs.length === 0) { - return function (arg) { - return arg; - }; - } - if (funcs.length === 1) { - return funcs[0]; - } +/***/ }), - return funcs.reduce(function (a, b) { - return function () { - return a(b.apply(void 0, arguments)); - }; - }); -} +/***/ "./node_modules/lodash/_flatRest.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/_flatRest.js ***! + \******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var flatten = __webpack_require__(/*! ./flatten */ "./node_modules/lodash/flatten.js"), + overRest = __webpack_require__(/*! ./_overRest */ "./node_modules/lodash/_overRest.js"), + setToString = __webpack_require__(/*! ./_setToString */ "./node_modules/lodash/_setToString.js"); /** - * Creates a store enhancer that applies middleware to the dispatch method - * of the Redux store. This is handy for a variety of tasks, such as expressing - * asynchronous actions in a concise manner, or logging every action payload. - * - * See `redux-thunk` package as an example of the Redux middleware. - * - * Because middleware is potentially asynchronous, this should be the first - * store enhancer in the composition chain. - * - * Note that each middleware will be given the `dispatch` and `getState` functions - * as named arguments. + * A specialized version of `baseRest` which flattens the rest array. * - * @param {...Function} middlewares The middleware chain to be applied. - * @returns {Function} A store enhancer applying the middleware. + * @private + * @param {Function} func The function to apply a rest parameter to. + * @returns {Function} Returns the new function. */ +function flatRest(func) { + return setToString(overRest(func, undefined, flatten), func + ''); +} -function applyMiddleware() { - for (var _len = arguments.length, middlewares = new Array(_len), _key = 0; _key < _len; _key++) { - middlewares[_key] = arguments[_key]; - } +module.exports = flatRest; - return function (createStore) { - return function () { - var store = createStore.apply(void 0, arguments); - var _dispatch = function dispatch() { - throw new Error( false ? 0 : 'Dispatching while constructing your middleware is not allowed. ' + 'Other middleware would not be applied to this dispatch.'); - }; +/***/ }), - var middlewareAPI = { - getState: store.getState, - dispatch: function dispatch() { - return _dispatch.apply(void 0, arguments); - } - }; - var chain = middlewares.map(function (middleware) { - return middleware(middlewareAPI); - }); - _dispatch = compose.apply(void 0, chain)(store.dispatch); - return (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__["default"])({}, store), {}, { - dispatch: _dispatch - }); - }; - }; -} +/***/ "./node_modules/lodash/_freeGlobal.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_freeGlobal.js ***! + \********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +/** Detect free variable `global` from Node.js. */ +var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g; +module.exports = freeGlobal; /***/ }), -/***/ "./node_modules/simple-swizzle/index.js": +/***/ "./node_modules/lodash/_getAllKeys.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_getAllKeys.js ***! + \********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var baseGetAllKeys = __webpack_require__(/*! ./_baseGetAllKeys */ "./node_modules/lodash/_baseGetAllKeys.js"), + getSymbols = __webpack_require__(/*! ./_getSymbols */ "./node_modules/lodash/_getSymbols.js"), + keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); + +/** + * Creates an array of own enumerable property names and symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ +function getAllKeys(object) { + return baseGetAllKeys(object, keys, getSymbols); +} + +module.exports = getAllKeys; + + +/***/ }), + +/***/ "./node_modules/lodash/_getAllKeysIn.js": /*!**********************************************!*\ - !*** ./node_modules/simple-swizzle/index.js ***! + !*** ./node_modules/lodash/_getAllKeysIn.js ***! \**********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; +var baseGetAllKeys = __webpack_require__(/*! ./_baseGetAllKeys */ "./node_modules/lodash/_baseGetAllKeys.js"), + getSymbolsIn = __webpack_require__(/*! ./_getSymbolsIn */ "./node_modules/lodash/_getSymbolsIn.js"), + keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js"); + +/** + * Creates an array of own and inherited enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ +function getAllKeysIn(object) { + return baseGetAllKeys(object, keysIn, getSymbolsIn); +} + +module.exports = getAllKeysIn; + +/***/ }), -var isArrayish = __webpack_require__(/*! is-arrayish */ "./node_modules/simple-swizzle/node_modules/is-arrayish/index.js"); +/***/ "./node_modules/lodash/_getMapData.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_getMapData.js ***! + \********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var concat = Array.prototype.concat; -var slice = Array.prototype.slice; +var isKeyable = __webpack_require__(/*! ./_isKeyable */ "./node_modules/lodash/_isKeyable.js"); -var swizzle = module.exports = function swizzle(args) { - var results = []; +/** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ +function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; +} - for (var i = 0, len = args.length; i < len; i++) { - var arg = args[i]; +module.exports = getMapData; - if (isArrayish(arg)) { - // http://jsperf.com/javascript-array-concat-vs-push/98 - results = concat.call(results, slice.call(arg)); - } else { - results.push(arg); - } - } - return results; -}; +/***/ }), -swizzle.wrap = function (fn) { - return function () { - return fn(swizzle(arguments)); - }; -}; +/***/ "./node_modules/lodash/_getMatchData.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash/_getMatchData.js ***! + \**********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var isStrictComparable = __webpack_require__(/*! ./_isStrictComparable */ "./node_modules/lodash/_isStrictComparable.js"), + keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); -/***/ }), +/** + * Gets the property names, values, and compare flags of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the match data of `object`. + */ +function getMatchData(object) { + var result = keys(object), + length = result.length; -/***/ "./node_modules/simple-swizzle/node_modules/is-arrayish/index.js": -/*!***********************************************************************!*\ - !*** ./node_modules/simple-swizzle/node_modules/is-arrayish/index.js ***! - \***********************************************************************/ -/***/ (function(module) { + while (length--) { + var key = result[length], + value = object[key]; -module.exports = function isArrayish(obj) { - if (!obj || typeof obj === 'string') { - return false; - } + result[length] = [key, value, isStrictComparable(value)]; + } + return result; +} - return obj instanceof Array || Array.isArray(obj) || - (obj.length >= 0 && (obj.splice instanceof Function || - (Object.getOwnPropertyDescriptor(obj, (obj.length - 1)) && obj.constructor.name !== 'String'))); -}; +module.exports = getMatchData; /***/ }), -/***/ "./src/components/core/Toolbar.css": -/*!*****************************************!*\ - !*** ./src/components/core/Toolbar.css ***! - \*****************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _node_modules_css_loader_dist_cjs_js_Toolbar_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../../node_modules/css-loader/dist/cjs.js!./Toolbar.css */ "./node_modules/css-loader/dist/cjs.js!./src/components/core/Toolbar.css"); +/***/ "./node_modules/lodash/_getNative.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash/_getNative.js ***! + \*******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - - - - - - - +var baseIsNative = __webpack_require__(/*! ./_baseIsNative */ "./node_modules/lodash/_baseIsNative.js"), + getValue = __webpack_require__(/*! ./_getValue */ "./node_modules/lodash/_getValue.js"); -var options = {}; +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; +} -options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); +module.exports = getNative; - options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); -var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_Toolbar_css__WEBPACK_IMPORTED_MODULE_6__["default"], options); +/***/ }), +/***/ "./node_modules/lodash/_getPrototype.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash/_getPrototype.js ***! + \**********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var overArg = __webpack_require__(/*! ./_overArg */ "./node_modules/lodash/_overArg.js"); +/** Built-in value references. */ +var getPrototype = overArg(Object.getPrototypeOf, Object); - /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_Toolbar_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_Toolbar_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_Toolbar_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); +module.exports = getPrototype; /***/ }), -/***/ "./src/components/error/CallbackGraph/CallbackGraphContainer.css": -/*!***********************************************************************!*\ - !*** ./src/components/error/CallbackGraph/CallbackGraphContainer.css ***! - \***********************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _node_modules_css_loader_dist_cjs_js_CallbackGraphContainer_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../../../node_modules/css-loader/dist/cjs.js!./CallbackGraphContainer.css */ "./node_modules/css-loader/dist/cjs.js!./src/components/error/CallbackGraph/CallbackGraphContainer.css"); +/***/ "./node_modules/lodash/_getRawTag.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash/_getRawTag.js ***! + \*******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - - - - - - - +var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"); -var options = {}; +/** Used for built-in method references. */ +var objectProto = Object.prototype; -options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; - options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var nativeObjectToString = objectProto.toString; -var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_CallbackGraphContainer_css__WEBPACK_IMPORTED_MODULE_6__["default"], options); +/** Built-in value references. */ +var symToStringTag = Symbol ? Symbol.toStringTag : undefined; +/** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ +function getRawTag(value) { + var isOwn = hasOwnProperty.call(value, symToStringTag), + tag = value[symToStringTag]; + try { + value[symToStringTag] = undefined; + var unmasked = true; + } catch (e) {} + var result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result; +} - /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_CallbackGraphContainer_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_CallbackGraphContainer_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_CallbackGraphContainer_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); +module.exports = getRawTag; /***/ }), -/***/ "./src/components/error/FrontEnd/FrontEndError.css": -/*!*********************************************************!*\ - !*** ./src/components/error/FrontEnd/FrontEndError.css ***! - \*********************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_getSymbols.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_getSymbols.js ***! + \********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _node_modules_css_loader_dist_cjs_js_FrontEndError_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../../../node_modules/css-loader/dist/cjs.js!./FrontEndError.css */ "./node_modules/css-loader/dist/cjs.js!./src/components/error/FrontEnd/FrontEndError.css"); +var arrayFilter = __webpack_require__(/*! ./_arrayFilter */ "./node_modules/lodash/_arrayFilter.js"), + stubArray = __webpack_require__(/*! ./stubArray */ "./node_modules/lodash/stubArray.js"); - - - - - - - - - +/** Used for built-in method references. */ +var objectProto = Object.prototype; -var options = {}; +/** Built-in value references. */ +var propertyIsEnumerable = objectProto.propertyIsEnumerable; -options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeGetSymbols = Object.getOwnPropertySymbols; - options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); +/** + * Creates an array of the own enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ +var getSymbols = !nativeGetSymbols ? stubArray : function(object) { + if (object == null) { + return []; + } + object = Object(object); + return arrayFilter(nativeGetSymbols(object), function(symbol) { + return propertyIsEnumerable.call(object, symbol); + }); +}; -var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_FrontEndError_css__WEBPACK_IMPORTED_MODULE_6__["default"], options); +module.exports = getSymbols; +/***/ }), +/***/ "./node_modules/lodash/_getSymbolsIn.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash/_getSymbolsIn.js ***! + \**********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_FrontEndError_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_FrontEndError_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_FrontEndError_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); +var arrayPush = __webpack_require__(/*! ./_arrayPush */ "./node_modules/lodash/_arrayPush.js"), + getPrototype = __webpack_require__(/*! ./_getPrototype */ "./node_modules/lodash/_getPrototype.js"), + getSymbols = __webpack_require__(/*! ./_getSymbols */ "./node_modules/lodash/_getSymbols.js"), + stubArray = __webpack_require__(/*! ./stubArray */ "./node_modules/lodash/stubArray.js"); +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeGetSymbols = Object.getOwnPropertySymbols; -/***/ }), +/** + * Creates an array of the own and inherited enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ +var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { + var result = []; + while (object) { + arrayPush(result, getSymbols(object)); + object = getPrototype(object); + } + return result; +}; -/***/ "./src/components/error/GlobalErrorOverlay.css": -/*!*****************************************************!*\ - !*** ./src/components/error/GlobalErrorOverlay.css ***! - \*****************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +module.exports = getSymbolsIn; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _node_modules_css_loader_dist_cjs_js_GlobalErrorOverlay_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../../node_modules/css-loader/dist/cjs.js!./GlobalErrorOverlay.css */ "./node_modules/css-loader/dist/cjs.js!./src/components/error/GlobalErrorOverlay.css"); - - - - - - - - - +/***/ }), -var options = {}; +/***/ "./node_modules/lodash/_getTag.js": +/*!****************************************!*\ + !*** ./node_modules/lodash/_getTag.js ***! + \****************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); +var DataView = __webpack_require__(/*! ./_DataView */ "./node_modules/lodash/_DataView.js"), + Map = __webpack_require__(/*! ./_Map */ "./node_modules/lodash/_Map.js"), + Promise = __webpack_require__(/*! ./_Promise */ "./node_modules/lodash/_Promise.js"), + Set = __webpack_require__(/*! ./_Set */ "./node_modules/lodash/_Set.js"), + WeakMap = __webpack_require__(/*! ./_WeakMap */ "./node_modules/lodash/_WeakMap.js"), + baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), + toSource = __webpack_require__(/*! ./_toSource */ "./node_modules/lodash/_toSource.js"); - options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); +/** `Object#toString` result references. */ +var mapTag = '[object Map]', + objectTag = '[object Object]', + promiseTag = '[object Promise]', + setTag = '[object Set]', + weakMapTag = '[object WeakMap]'; -var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_GlobalErrorOverlay_css__WEBPACK_IMPORTED_MODULE_6__["default"], options); +var dataViewTag = '[object DataView]'; +/** Used to detect maps, sets, and weakmaps. */ +var dataViewCtorString = toSource(DataView), + mapCtorString = toSource(Map), + promiseCtorString = toSource(Promise), + setCtorString = toSource(Set), + weakMapCtorString = toSource(WeakMap); +/** + * Gets the `toStringTag` of `value`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +var getTag = baseGetTag; +// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. +if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || + (Map && getTag(new Map) != mapTag) || + (Promise && getTag(Promise.resolve()) != promiseTag) || + (Set && getTag(new Set) != setTag) || + (WeakMap && getTag(new WeakMap) != weakMapTag)) { + getTag = function(value) { + var result = baseGetTag(value), + Ctor = result == objectTag ? value.constructor : undefined, + ctorString = Ctor ? toSource(Ctor) : ''; - /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_GlobalErrorOverlay_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_GlobalErrorOverlay_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_GlobalErrorOverlay_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); + if (ctorString) { + switch (ctorString) { + case dataViewCtorString: return dataViewTag; + case mapCtorString: return mapTag; + case promiseCtorString: return promiseTag; + case setCtorString: return setTag; + case weakMapCtorString: return weakMapTag; + } + } + return result; + }; +} + +module.exports = getTag; /***/ }), -/***/ "./src/components/error/Percy.css": -/*!****************************************!*\ - !*** ./src/components/error/Percy.css ***! - \****************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_getValue.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/_getValue.js ***! + \******************************************/ +/***/ (function(module) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _node_modules_css_loader_dist_cjs_js_Percy_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../../node_modules/css-loader/dist/cjs.js!./Percy.css */ "./node_modules/css-loader/dist/cjs.js!./src/components/error/Percy.css"); +/** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ +function getValue(object, key) { + return object == null ? undefined : object[key]; +} - - - - - - - - - +module.exports = getValue; -var options = {}; -options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); +/***/ }), - options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); +/***/ "./node_modules/lodash/_hasPath.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/_hasPath.js ***! + \*****************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_Percy_css__WEBPACK_IMPORTED_MODULE_6__["default"], options); +var castPath = __webpack_require__(/*! ./_castPath */ "./node_modules/lodash/_castPath.js"), + isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"), + isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), + isIndex = __webpack_require__(/*! ./_isIndex */ "./node_modules/lodash/_isIndex.js"), + isLength = __webpack_require__(/*! ./isLength */ "./node_modules/lodash/isLength.js"), + toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js"); +/** + * Checks if `path` exists on `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @param {Function} hasFunc The function to check properties. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + */ +function hasPath(object, path, hasFunc) { + path = castPath(path, object); + var index = -1, + length = path.length, + result = false; + while (++index < length) { + var key = toKey(path[index]); + if (!(result = object != null && hasFunc(object, key))) { + break; + } + object = object[key]; + } + if (result || ++index != length) { + return result; + } + length = object == null ? 0 : object.length; + return !!length && isLength(length) && isIndex(key, length) && + (isArray(object) || isArguments(object)); +} - /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_Percy_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_Percy_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_Percy_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); +module.exports = hasPath; /***/ }), -/***/ "./src/components/error/menu/DebugMenu.css": -/*!*************************************************!*\ - !*** ./src/components/error/menu/DebugMenu.css ***! - \*************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_hasUnicode.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_hasUnicode.js ***! + \********************************************/ +/***/ (function(module) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _node_modules_css_loader_dist_cjs_js_DebugMenu_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../../../node_modules/css-loader/dist/cjs.js!./DebugMenu.css */ "./node_modules/css-loader/dist/cjs.js!./src/components/error/menu/DebugMenu.css"); +/** Used to compose unicode character classes. */ +var rsAstralRange = '\\ud800-\\udfff', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, + rsVarRange = '\\ufe0e\\ufe0f'; - - - - - - - - - +/** Used to compose unicode capture groups. */ +var rsZWJ = '\\u200d'; -var options = {}; +/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ +var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']'); -options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); +/** + * Checks if `string` contains Unicode symbols. + * + * @private + * @param {string} string The string to inspect. + * @returns {boolean} Returns `true` if a symbol is found, else `false`. + */ +function hasUnicode(string) { + return reHasUnicode.test(string); +} - options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); +module.exports = hasUnicode; -var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_DebugMenu_css__WEBPACK_IMPORTED_MODULE_6__["default"], options); +/***/ }), +/***/ "./node_modules/lodash/_hashClear.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash/_hashClear.js ***! + \*******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); - /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_DebugMenu_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_DebugMenu_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_DebugMenu_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); +/** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ +function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; + this.size = 0; +} + +module.exports = hashClear; /***/ }), -/***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js": -/*!****************************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***! - \****************************************************************************/ +/***/ "./node_modules/lodash/_hashDelete.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_hashDelete.js ***! + \********************************************/ /***/ (function(module) { -"use strict"; - - -var stylesInDOM = []; -function getIndexByIdentifier(identifier) { - var result = -1; - for (var i = 0; i < stylesInDOM.length; i++) { - if (stylesInDOM[i].identifier === identifier) { - result = i; - break; - } - } +/** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function hashDelete(key) { + var result = this.has(key) && delete this.__data__[key]; + this.size -= result ? 1 : 0; return result; } -function modulesToDom(list, options) { - var idCountMap = {}; - var identifiers = []; - for (var i = 0; i < list.length; i++) { - var item = list[i]; - var id = options.base ? item[0] + options.base : item[0]; - var count = idCountMap[id] || 0; - var identifier = "".concat(id, " ").concat(count); - idCountMap[id] = count + 1; - var indexByIdentifier = getIndexByIdentifier(identifier); - var obj = { - css: item[1], - media: item[2], - sourceMap: item[3], - supports: item[4], - layer: item[5] - }; - if (indexByIdentifier !== -1) { - stylesInDOM[indexByIdentifier].references++; - stylesInDOM[indexByIdentifier].updater(obj); - } else { - var updater = addElementStyle(obj, options); - options.byIndex = i; - stylesInDOM.splice(i, 0, { - identifier: identifier, - updater: updater, - references: 1 - }); - } - identifiers.push(identifier); - } - return identifiers; -} -function addElementStyle(obj, options) { - var api = options.domAPI(options); - api.update(obj); - var updater = function updater(newObj) { - if (newObj) { - if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) { - return; - } - api.update(obj = newObj); - } else { - api.remove(); - } - }; - return updater; -} -module.exports = function (list, options) { - options = options || {}; - list = list || []; - var lastIdentifiers = modulesToDom(list, options); - return function update(newList) { - newList = newList || []; - for (var i = 0; i < lastIdentifiers.length; i++) { - var identifier = lastIdentifiers[i]; - var index = getIndexByIdentifier(identifier); - stylesInDOM[index].references--; - } - var newLastIdentifiers = modulesToDom(newList, options); - for (var _i = 0; _i < lastIdentifiers.length; _i++) { - var _identifier = lastIdentifiers[_i]; - var _index = getIndexByIdentifier(_identifier); - if (stylesInDOM[_index].references === 0) { - stylesInDOM[_index].updater(); - stylesInDOM.splice(_index, 1); - } - } - lastIdentifiers = newLastIdentifiers; - }; -}; + +module.exports = hashDelete; + /***/ }), -/***/ "./node_modules/style-loader/dist/runtime/insertBySelector.js": -/*!********************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/insertBySelector.js ***! - \********************************************************************/ -/***/ (function(module) { +/***/ "./node_modules/lodash/_hashGet.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/_hashGet.js ***! + \*****************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; +var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); +/** Used to stand-in for `undefined` hash values. */ +var HASH_UNDEFINED = '__lodash_hash_undefined__'; -var memo = {}; +/** Used for built-in method references. */ +var objectProto = Object.prototype; -/* istanbul ignore next */ -function getTarget(target) { - if (typeof memo[target] === "undefined") { - var styleTarget = document.querySelector(target); +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; - // Special case to return head of iframe instead of iframe itself - if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) { - try { - // This will throw an exception if access to iframe is blocked - // due to cross-origin restrictions - styleTarget = styleTarget.contentDocument.head; - } catch (e) { - // istanbul ignore next - styleTarget = null; - } - } - memo[target] = styleTarget; +/** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; } - return memo[target]; + return hasOwnProperty.call(data, key) ? data[key] : undefined; } -/* istanbul ignore next */ -function insertBySelector(insert, style) { - var target = getTarget(insert); - if (!target) { - throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid."); - } - target.appendChild(style); -} -module.exports = insertBySelector; +module.exports = hashGet; + /***/ }), -/***/ "./node_modules/style-loader/dist/runtime/insertStyleElement.js": -/*!**********************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/insertStyleElement.js ***! - \**********************************************************************/ -/***/ (function(module) { +/***/ "./node_modules/lodash/_hashHas.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/_hashHas.js ***! + \*****************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; +var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); +/** Used for built-in method references. */ +var objectProto = Object.prototype; -/* istanbul ignore next */ -function insertStyleElement(options) { - var element = document.createElement("style"); - options.setAttributes(element, options.attributes); - options.insert(element, options.options); - return element; +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function hashHas(key) { + var data = this.__data__; + return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); } -module.exports = insertStyleElement; + +module.exports = hashHas; + /***/ }), -/***/ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js ***! - \**********************************************************************************/ +/***/ "./node_modules/lodash/_hashSet.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/_hashSet.js ***! + \*****************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; +var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); +/** Used to stand-in for `undefined` hash values. */ +var HASH_UNDEFINED = '__lodash_hash_undefined__'; -/* istanbul ignore next */ -function setAttributesWithoutAttributes(styleElement) { - var nonce = true ? __webpack_require__.nc : 0; - if (nonce) { - styleElement.setAttribute("nonce", nonce); - } +/** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ +function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; } -module.exports = setAttributesWithoutAttributes; + +module.exports = hashSet; + /***/ }), -/***/ "./node_modules/style-loader/dist/runtime/styleDomAPI.js": -/*!***************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/styleDomAPI.js ***! - \***************************************************************/ +/***/ "./node_modules/lodash/_initCloneArray.js": +/*!************************************************!*\ + !*** ./node_modules/lodash/_initCloneArray.js ***! + \************************************************/ /***/ (function(module) { -"use strict"; - +/** Used for built-in method references. */ +var objectProto = Object.prototype; -/* istanbul ignore next */ -function apply(styleElement, options, obj) { - var css = ""; - if (obj.supports) { - css += "@supports (".concat(obj.supports, ") {"); - } - if (obj.media) { - css += "@media ".concat(obj.media, " {"); - } - var needLayer = typeof obj.layer !== "undefined"; - if (needLayer) { - css += "@layer".concat(obj.layer.length > 0 ? " ".concat(obj.layer) : "", " {"); - } - css += obj.css; - if (needLayer) { - css += "}"; - } - if (obj.media) { - css += "}"; - } - if (obj.supports) { - css += "}"; - } - var sourceMap = obj.sourceMap; - if (sourceMap && typeof btoa !== "undefined") { - css += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */"); - } +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; - // For old IE - /* istanbul ignore if */ - options.styleTagTransform(css, styleElement, options.options); -} -function removeStyleElement(styleElement) { - // istanbul ignore if - if (styleElement.parentNode === null) { - return false; - } - styleElement.parentNode.removeChild(styleElement); -} +/** + * Initializes an array clone. + * + * @private + * @param {Array} array The array to clone. + * @returns {Array} Returns the initialized clone. + */ +function initCloneArray(array) { + var length = array.length, + result = new array.constructor(length); -/* istanbul ignore next */ -function domAPI(options) { - if (typeof document === "undefined") { - return { - update: function update() {}, - remove: function remove() {} - }; + // Add properties assigned by `RegExp#exec`. + if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { + result.index = array.index; + result.input = array.input; } - var styleElement = options.insertStyleElement(options); - return { - update: function update(obj) { - apply(styleElement, options, obj); - }, - remove: function remove() { - removeStyleElement(styleElement); - } - }; + return result; } -module.exports = domAPI; -/***/ }), +module.exports = initCloneArray; -/***/ "./node_modules/style-loader/dist/runtime/styleTagTransform.js": -/*!*********************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/styleTagTransform.js ***! - \*********************************************************************/ -/***/ (function(module) { -"use strict"; +/***/ }), +/***/ "./node_modules/lodash/_initCloneByTag.js": +/*!************************************************!*\ + !*** ./node_modules/lodash/_initCloneByTag.js ***! + \************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -/* istanbul ignore next */ -function styleTagTransform(css, styleElement) { - if (styleElement.styleSheet) { - styleElement.styleSheet.cssText = css; - } else { - while (styleElement.firstChild) { - styleElement.removeChild(styleElement.firstChild); - } - styleElement.appendChild(document.createTextNode(css)); - } -} -module.exports = styleTagTransform; +var cloneArrayBuffer = __webpack_require__(/*! ./_cloneArrayBuffer */ "./node_modules/lodash/_cloneArrayBuffer.js"), + cloneDataView = __webpack_require__(/*! ./_cloneDataView */ "./node_modules/lodash/_cloneDataView.js"), + cloneRegExp = __webpack_require__(/*! ./_cloneRegExp */ "./node_modules/lodash/_cloneRegExp.js"), + cloneSymbol = __webpack_require__(/*! ./_cloneSymbol */ "./node_modules/lodash/_cloneSymbol.js"), + cloneTypedArray = __webpack_require__(/*! ./_cloneTypedArray */ "./node_modules/lodash/_cloneTypedArray.js"); -/***/ }), +/** `Object#toString` result references. */ +var boolTag = '[object Boolean]', + dateTag = '[object Date]', + mapTag = '[object Map]', + numberTag = '[object Number]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + symbolTag = '[object Symbol]'; -/***/ "./node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js": -/*!**********************************************************************************************!*\ - !*** ./node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js ***! - \**********************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; -"use strict"; /** - * @license React - * use-sync-external-store-shim.development.js + * Initializes an object clone based on its `toStringTag`. * - * Copyright (c) Facebook, Inc. and its affiliates. + * **Note:** This function only supports cloning values with tags of + * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`. * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. + * @private + * @param {Object} object The object to clone. + * @param {string} tag The `toStringTag` of the object to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the initialized clone. */ +function initCloneByTag(object, tag, isDeep) { + var Ctor = object.constructor; + switch (tag) { + case arrayBufferTag: + return cloneArrayBuffer(object); + case boolTag: + case dateTag: + return new Ctor(+object); + case dataViewTag: + return cloneDataView(object, isDeep); -if (true) { - (function() { + case float32Tag: case float64Tag: + case int8Tag: case int16Tag: case int32Tag: + case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: + return cloneTypedArray(object, isDeep); - 'use strict'; + case mapTag: + return new Ctor; -/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ -if ( - typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && - typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === - 'function' -) { - __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); -} - var React = __webpack_require__(/*! react */ "react"); + case numberTag: + case stringTag: + return new Ctor(object); -var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; + case regexpTag: + return cloneRegExp(object); -function error(format) { - { - { - for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - args[_key2 - 1] = arguments[_key2]; - } + case setTag: + return new Ctor; - printWarning('error', format, args); - } + case symbolTag: + return cloneSymbol(object); } } -function printWarning(level, format, args) { - // When changing this logic, you might want to also - // update consoleWithStackDev.www.js as well. - { - var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; - var stack = ReactDebugCurrentFrame.getStackAddendum(); - - if (stack !== '') { - format += '%s'; - args = args.concat([stack]); - } // eslint-disable-next-line react-internal/safe-string-coercion +module.exports = initCloneByTag; - var argsWithFormat = args.map(function (item) { - return String(item); - }); // Careful: RN currently depends on this prefix +/***/ }), - argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it - // breaks IE9: https://github.com/facebook/react/issues/13610 - // eslint-disable-next-line react-internal/no-production-logging +/***/ "./node_modules/lodash/_initCloneObject.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash/_initCloneObject.js ***! + \*************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - Function.prototype.apply.call(console[level], console, argsWithFormat); - } -} +var baseCreate = __webpack_require__(/*! ./_baseCreate */ "./node_modules/lodash/_baseCreate.js"), + getPrototype = __webpack_require__(/*! ./_getPrototype */ "./node_modules/lodash/_getPrototype.js"), + isPrototype = __webpack_require__(/*! ./_isPrototype */ "./node_modules/lodash/_isPrototype.js"); /** - * inlined Object.is polyfill to avoid requiring consumers ship their own - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is + * Initializes an object clone. + * + * @private + * @param {Object} object The object to clone. + * @returns {Object} Returns the initialized clone. */ -function is(x, y) { - return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare - ; +function initCloneObject(object) { + return (typeof object.constructor == 'function' && !isPrototype(object)) + ? baseCreate(getPrototype(object)) + : {}; } -var objectIs = typeof Object.is === 'function' ? Object.is : is; +module.exports = initCloneObject; -// dispatch for CommonJS interop named imports. -var useState = React.useState, - useEffect = React.useEffect, - useLayoutEffect = React.useLayoutEffect, - useDebugValue = React.useDebugValue; -var didWarnOld18Alpha = false; -var didWarnUncachedGetSnapshot = false; // Disclaimer: This shim breaks many of the rules of React, and only works -// because of a very particular set of implementation details and assumptions -// -- change any one of them and it will break. The most important assumption -// is that updates are always synchronous, because concurrent rendering is -// only available in versions of React that also have a built-in -// useSyncExternalStore API. And we only use this shim when the built-in API -// does not exist. -// -// Do not assume that the clever hacks used by this hook also work in general. -// The point of this shim is to replace the need for hacks by other libraries. +/***/ }), -function useSyncExternalStore(subscribe, getSnapshot, // Note: The shim does not use getServerSnapshot, because pre-18 versions of -// React do not expose a way to check if we're hydrating. So users of the shim -// will need to track that themselves and return the correct value -// from `getSnapshot`. -getServerSnapshot) { - { - if (!didWarnOld18Alpha) { - if (React.startTransition !== undefined) { - didWarnOld18Alpha = true; +/***/ "./node_modules/lodash/_isFlattenable.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash/_isFlattenable.js ***! + \***********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - error('You are using an outdated, pre-release alpha of React 18 that ' + 'does not support useSyncExternalStore. The ' + 'use-sync-external-store shim will not work correctly. Upgrade ' + 'to a newer pre-release.'); - } - } - } // Read the current snapshot from the store on every render. Again, this - // breaks the rules of React, and only works here because of specific - // implementation details, most importantly that updates are - // always synchronous. +var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"), + isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"), + isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"); +/** Built-in value references. */ +var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined; - var value = getSnapshot(); +/** + * Checks if `value` is a flattenable `arguments` object or array. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. + */ +function isFlattenable(value) { + return isArray(value) || isArguments(value) || + !!(spreadableSymbol && value && value[spreadableSymbol]); +} - { - if (!didWarnUncachedGetSnapshot) { - var cachedValue = getSnapshot(); +module.exports = isFlattenable; - if (!objectIs(value, cachedValue)) { - error('The result of getSnapshot should be cached to avoid an infinite loop'); - didWarnUncachedGetSnapshot = true; - } - } - } // Because updates are synchronous, we don't queue them. Instead we force a - // re-render whenever the subscribed state changes by updating an some - // arbitrary useState hook. Then, during render, we call getSnapshot to read - // the current value. - // - // Because we don't actually use the state returned by the useState hook, we - // can save a bit of memory by storing other stuff in that slot. - // - // To implement the early bailout, we need to track some things on a mutable - // object. Usually, we would put that in a useRef hook, but we can stash it in - // our useState hook instead. - // - // To force a re-render, we call forceUpdate({inst}). That works because the - // new object always fails an equality check. +/***/ }), +/***/ "./node_modules/lodash/_isIndex.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/_isIndex.js ***! + \*****************************************/ +/***/ (function(module) { - var _useState = useState({ - inst: { - value: value, - getSnapshot: getSnapshot - } - }), - inst = _useState[0].inst, - forceUpdate = _useState[1]; // Track the latest getSnapshot function with a ref. This needs to be updated - // in the layout phase so we can access it during the tearing check that - // happens on subscribe. +/** Used as references for various `Number` constants. */ +var MAX_SAFE_INTEGER = 9007199254740991; +/** Used to detect unsigned integer values. */ +var reIsUint = /^(?:0|[1-9]\d*)$/; - useLayoutEffect(function () { - inst.value = value; - inst.getSnapshot = getSnapshot; // Whenever getSnapshot or subscribe changes, we need to check in the - // commit phase if there was an interleaved mutation. In concurrent mode - // this can happen all the time, but even in synchronous mode, an earlier - // effect may have mutated the store. +/** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ +function isIndex(value, length) { + var type = typeof value; + length = length == null ? MAX_SAFE_INTEGER : length; - if (checkIfSnapshotChanged(inst)) { - // Force a re-render. - forceUpdate({ - inst: inst - }); - } - }, [subscribe, value, getSnapshot]); - useEffect(function () { - // Check for changes right before subscribing. Subsequent changes will be - // detected in the subscription handler. - if (checkIfSnapshotChanged(inst)) { - // Force a re-render. - forceUpdate({ - inst: inst - }); - } + return !!length && + (type == 'number' || + (type != 'symbol' && reIsUint.test(value))) && + (value > -1 && value % 1 == 0 && value < length); +} - var handleStoreChange = function () { - // TODO: Because there is no cross-renderer API for batching updates, it's - // up to the consumer of this library to wrap their subscription event - // with unstable_batchedUpdates. Should we try to detect when this isn't - // the case and print a warning in development? - // The store changed. Check if the snapshot changed since the last time we - // read from the store. - if (checkIfSnapshotChanged(inst)) { - // Force a re-render. - forceUpdate({ - inst: inst - }); - } - }; // Subscribe to the store and return a clean-up function. +module.exports = isIndex; - return subscribe(handleStoreChange); - }, [subscribe]); - useDebugValue(value); - return value; -} +/***/ }), -function checkIfSnapshotChanged(inst) { - var latestGetSnapshot = inst.getSnapshot; - var prevValue = inst.value; +/***/ "./node_modules/lodash/_isIterateeCall.js": +/*!************************************************!*\ + !*** ./node_modules/lodash/_isIterateeCall.js ***! + \************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - try { - var nextValue = latestGetSnapshot(); - return !objectIs(prevValue, nextValue); - } catch (error) { - return true; +var eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"), + isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"), + isIndex = __webpack_require__(/*! ./_isIndex */ "./node_modules/lodash/_isIndex.js"), + isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"); + +/** + * Checks if the given arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, + * else `false`. + */ +function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object) + ) { + return eq(object[index], value); } + return false; } -function useSyncExternalStore$1(subscribe, getSnapshot, getServerSnapshot) { - // Note: The shim does not use getServerSnapshot, because pre-18 versions of - // React do not expose a way to check if we're hydrating. So users of the shim - // will need to track that themselves and return the correct value - // from `getSnapshot`. - return getSnapshot(); -} +module.exports = isIterateeCall; -var canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined'); -var isServerEnvironment = !canUseDOM; +/***/ }), -var shim = isServerEnvironment ? useSyncExternalStore$1 : useSyncExternalStore; -var useSyncExternalStore$2 = React.useSyncExternalStore !== undefined ? React.useSyncExternalStore : shim; +/***/ "./node_modules/lodash/_isKey.js": +/*!***************************************!*\ + !*** ./node_modules/lodash/_isKey.js ***! + \***************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -exports.useSyncExternalStore = useSyncExternalStore$2; - /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ -if ( - typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && - typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === - 'function' -) { - __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error()); -} - - })(); +var isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), + isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); + +/** Used to match property names within property paths. */ +var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/; + +/** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ +function isKey(value, object) { + if (isArray(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || isSymbol(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); } +module.exports = isKey; + /***/ }), -/***/ "./node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js": -/*!************************************************************************************************************!*\ - !*** ./node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js ***! - \************************************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ "./node_modules/lodash/_isKeyable.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash/_isKeyable.js ***! + \*******************************************/ +/***/ (function(module) { -"use strict"; /** - * @license React - * use-sync-external-store-shim/with-selector.development.js - * - * Copyright (c) Facebook, Inc. and its affiliates. + * Checks if `value` is suitable for use as unique object key. * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. */ +function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); +} +module.exports = isKeyable; -if (true) { - (function() { +/***/ }), - 'use strict'; +/***/ "./node_modules/lodash/_isMasked.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/_isMasked.js ***! + \******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ -if ( - typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && - typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === - 'function' -) { - __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); -} - var React = __webpack_require__(/*! react */ "react"); -var shim = __webpack_require__(/*! use-sync-external-store/shim */ "./node_modules/use-sync-external-store/shim/index.js"); +var coreJsData = __webpack_require__(/*! ./_coreJsData */ "./node_modules/lodash/_coreJsData.js"); + +/** Used to detect methods masquerading as native. */ +var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; +}()); /** - * inlined Object.is polyfill to avoid requiring consumers ship their own - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. */ -function is(x, y) { - return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare - ; +function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); } -var objectIs = typeof Object.is === 'function' ? Object.is : is; +module.exports = isMasked; -var useSyncExternalStore = shim.useSyncExternalStore; -// for CommonJS interop. +/***/ }), -var useRef = React.useRef, - useEffect = React.useEffect, - useMemo = React.useMemo, - useDebugValue = React.useDebugValue; // Same as useSyncExternalStore, but supports selector and isEqual arguments. +/***/ "./node_modules/lodash/_isPrototype.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_isPrototype.js ***! + \*********************************************/ +/***/ (function(module) { -function useSyncExternalStoreWithSelector(subscribe, getSnapshot, getServerSnapshot, selector, isEqual) { - // Use this to track the rendered snapshot. - var instRef = useRef(null); - var inst; +/** Used for built-in method references. */ +var objectProto = Object.prototype; - if (instRef.current === null) { - inst = { - hasValue: false, - value: null - }; - instRef.current = inst; - } else { - inst = instRef.current; - } +/** + * Checks if `value` is likely a prototype object. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. + */ +function isPrototype(value) { + var Ctor = value && value.constructor, + proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; - var _useMemo = useMemo(function () { - // Track the memoized state using closure variables that are local to this - // memoized instance of a getSnapshot function. Intentionally not using a - // useRef hook, because that state would be shared across all concurrent - // copies of the hook/component. - var hasMemo = false; - var memoizedSnapshot; - var memoizedSelection; + return value === proto; +} - var memoizedSelector = function (nextSnapshot) { - if (!hasMemo) { - // The first time the hook is called, there is no memoized result. - hasMemo = true; - memoizedSnapshot = nextSnapshot; +module.exports = isPrototype; - var _nextSelection = selector(nextSnapshot); - if (isEqual !== undefined) { - // Even if the selector has changed, the currently rendered selection - // may be equal to the new selection. We should attempt to reuse the - // current value if possible, to preserve downstream memoizations. - if (inst.hasValue) { - var currentSelection = inst.value; +/***/ }), - if (isEqual(currentSelection, _nextSelection)) { - memoizedSelection = currentSelection; - return currentSelection; - } - } - } +/***/ "./node_modules/lodash/_isStrictComparable.js": +/*!****************************************************!*\ + !*** ./node_modules/lodash/_isStrictComparable.js ***! + \****************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - memoizedSelection = _nextSelection; - return _nextSelection; - } // We may be able to reuse the previous invocation's result. +var isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"); + +/** + * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` if suitable for strict + * equality comparisons, else `false`. + */ +function isStrictComparable(value) { + return value === value && !isObject(value); +} +module.exports = isStrictComparable; - // We may be able to reuse the previous invocation's result. - var prevSnapshot = memoizedSnapshot; - var prevSelection = memoizedSelection; - if (objectIs(prevSnapshot, nextSnapshot)) { - // The snapshot is the same as last time. Reuse the previous selection. - return prevSelection; - } // The snapshot has changed, so we need to compute a new selection. +/***/ }), + +/***/ "./node_modules/lodash/_listCacheClear.js": +/*!************************************************!*\ + !*** ./node_modules/lodash/_listCacheClear.js ***! + \************************************************/ +/***/ (function(module) { + +/** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ +function listCacheClear() { + this.__data__ = []; + this.size = 0; +} +module.exports = listCacheClear; - // The snapshot has changed, so we need to compute a new selection. - var nextSelection = selector(nextSnapshot); // If a custom isEqual function is provided, use that to check if the data - // has changed. If it hasn't, return the previous selection. That signals - // to React that the selections are conceptually equal, and we can bail - // out of rendering. - // If a custom isEqual function is provided, use that to check if the data - // has changed. If it hasn't, return the previous selection. That signals - // to React that the selections are conceptually equal, and we can bail - // out of rendering. - if (isEqual !== undefined && isEqual(prevSelection, nextSelection)) { - return prevSelection; - } +/***/ }), - memoizedSnapshot = nextSnapshot; - memoizedSelection = nextSelection; - return nextSelection; - }; // Assigning this to a constant so that Flow knows it can't change. +/***/ "./node_modules/lodash/_listCacheDelete.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash/_listCacheDelete.js ***! + \*************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js"); - // Assigning this to a constant so that Flow knows it can't change. - var maybeGetServerSnapshot = getServerSnapshot === undefined ? null : getServerSnapshot; +/** Used for built-in method references. */ +var arrayProto = Array.prototype; - var getSnapshotWithSelector = function () { - return memoizedSelector(getSnapshot()); - }; +/** Built-in value references. */ +var splice = arrayProto.splice; - var getServerSnapshotWithSelector = maybeGetServerSnapshot === null ? undefined : function () { - return memoizedSelector(maybeGetServerSnapshot()); - }; - return [getSnapshotWithSelector, getServerSnapshotWithSelector]; - }, [getSnapshot, getServerSnapshot, selector, isEqual]), - getSelection = _useMemo[0], - getServerSelection = _useMemo[1]; +/** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); - var value = useSyncExternalStore(subscribe, getSelection, getServerSelection); - useEffect(function () { - inst.hasValue = true; - inst.value = value; - }, [value]); - useDebugValue(value); - return value; + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; } -exports.useSyncExternalStoreWithSelector = useSyncExternalStoreWithSelector; - /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ -if ( - typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && - typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === - 'function' -) { - __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error()); -} - - })(); -} +module.exports = listCacheDelete; /***/ }), -/***/ "./node_modules/use-sync-external-store/shim/index.js": -/*!************************************************************!*\ - !*** ./node_modules/use-sync-external-store/shim/index.js ***! - \************************************************************/ +/***/ "./node_modules/lodash/_listCacheGet.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash/_listCacheGet.js ***! + \**********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; +var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js"); +/** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); -if (false) {} else { - module.exports = __webpack_require__(/*! ../cjs/use-sync-external-store-shim.development.js */ "./node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js"); + return index < 0 ? undefined : data[index][1]; } +module.exports = listCacheGet; + /***/ }), -/***/ "./node_modules/use-sync-external-store/shim/with-selector.js": -/*!********************************************************************!*\ - !*** ./node_modules/use-sync-external-store/shim/with-selector.js ***! - \********************************************************************/ +/***/ "./node_modules/lodash/_listCacheHas.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash/_listCacheHas.js ***! + \**********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; - +var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js"); -if (false) {} else { - module.exports = __webpack_require__(/*! ../cjs/use-sync-external-store-shim/with-selector.development.js */ "./node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js"); +/** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; } +module.exports = listCacheHas; + /***/ }), -/***/ "prop-types": -/*!****************************!*\ - !*** external "PropTypes" ***! - \****************************/ -/***/ (function(module) { +/***/ "./node_modules/lodash/_listCacheSet.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash/_listCacheSet.js ***! + \**********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -module.exports = window["PropTypes"]; +var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js"); -/***/ }), +/** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ +function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); -/***/ "react": -/*!************************!*\ - !*** external "React" ***! - \************************/ -/***/ (function(module) { + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; +} + +module.exports = listCacheSet; -"use strict"; -module.exports = window["React"]; /***/ }), -/***/ "react-dom": -/*!***************************!*\ - !*** external "ReactDOM" ***! - \***************************/ -/***/ (function(module) { +/***/ "./node_modules/lodash/_mapCacheClear.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash/_mapCacheClear.js ***! + \***********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -module.exports = window["ReactDOM"]; +var Hash = __webpack_require__(/*! ./_Hash */ "./node_modules/lodash/_Hash.js"), + ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"), + Map = __webpack_require__(/*! ./_Map */ "./node_modules/lodash/_Map.js"); -/***/ }), +/** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ +function mapCacheClear() { + this.size = 0; + this.__data__ = { + 'hash': new Hash, + 'map': new (Map || ListCache), + 'string': new Hash + }; +} -/***/ "./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js": -/*!*********************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js ***! - \*********************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +module.exports = mapCacheClear; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _arrayLikeToArray; } -/* harmony export */ }); -function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - return arr2; -} /***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js": -/*!*******************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js ***! - \*******************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_mapCacheDelete.js": +/*!************************************************!*\ + !*** ./node_modules/lodash/_mapCacheDelete.js ***! + \************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _arrayWithHoles; } -/* harmony export */ }); -function _arrayWithHoles(arr) { - if (Array.isArray(arr)) return arr; +var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); + +/** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function mapCacheDelete(key) { + var result = getMapData(this, key)['delete'](key); + this.size -= result ? 1 : 0; + return result; } +module.exports = mapCacheDelete; + + /***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js": -/*!**********************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js ***! - \**********************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_mapCacheGet.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_mapCacheGet.js ***! + \*********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _arrayWithoutHoles; } -/* harmony export */ }); -/* harmony import */ var _arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayLikeToArray.js */ "./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js"); +var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); -function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__["default"])(arr); +/** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function mapCacheGet(key) { + return getMapData(this, key).get(key); } -/***/ }), - -/***/ "./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js ***! - \**************************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +module.exports = mapCacheGet; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _assertThisInitialized; } -/* harmony export */ }); -function _assertThisInitialized(self) { - if (self === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - return self; -} /***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/classCallCheck.js": -/*!*******************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/classCallCheck.js ***! - \*******************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_mapCacheHas.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_mapCacheHas.js ***! + \*********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _classCallCheck; } -/* harmony export */ }); -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } +var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); + +/** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function mapCacheHas(key) { + return getMapData(this, key).has(key); } +module.exports = mapCacheHas; + + /***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/createClass.js": -/*!****************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/createClass.js ***! - \****************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_mapCacheSet.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_mapCacheSet.js ***! + \*********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _createClass; } -/* harmony export */ }); -/* harmony import */ var _toPropertyKey_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./toPropertyKey.js */ "./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js"); +var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); -function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, (0,_toPropertyKey_js__WEBPACK_IMPORTED_MODULE_0__["default"])(descriptor.key), descriptor); - } -} -function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; +/** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ +function mapCacheSet(key, value) { + var data = getMapData(this, key), + size = data.size; + + data.set(key, value); + this.size += data.size == size ? 0 : 1; + return this; } +module.exports = mapCacheSet; + + /***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js": -/*!*******************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/defineProperty.js ***! - \*******************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_mapToArray.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_mapToArray.js ***! + \********************************************/ +/***/ (function(module) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _defineProperty; } -/* harmony export */ }); -/* harmony import */ var _toPropertyKey_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./toPropertyKey.js */ "./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js"); +/** + * Converts `map` to its key-value pairs. + * + * @private + * @param {Object} map The map to convert. + * @returns {Array} Returns the key-value pairs. + */ +function mapToArray(map) { + var index = -1, + result = Array(map.size); -function _defineProperty(obj, key, value) { - key = (0,_toPropertyKey_js__WEBPACK_IMPORTED_MODULE_0__["default"])(key); - if (key in obj) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; - } - return obj; + map.forEach(function(value, key) { + result[++index] = [key, value]; + }); + return result; } +module.exports = mapToArray; + + /***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/extends.js": -/*!************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/extends.js ***! - \************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_matchesStrictComparable.js": +/*!*********************************************************!*\ + !*** ./node_modules/lodash/_matchesStrictComparable.js ***! + \*********************************************************/ +/***/ (function(module) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _extends; } -/* harmony export */ }); -function _extends() { - _extends = Object.assign ? Object.assign.bind() : function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } +/** + * A specialized version of `matchesProperty` for source values suitable + * for strict equality comparisons, i.e. `===`. + * + * @private + * @param {string} key The key of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ +function matchesStrictComparable(key, srcValue) { + return function(object) { + if (object == null) { + return false; } - return target; + return object[key] === srcValue && + (srcValue !== undefined || (key in Object(object))); }; - return _extends.apply(this, arguments); } -/***/ }), - -/***/ "./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js": -/*!*******************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js ***! - \*******************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +module.exports = matchesStrictComparable; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _getPrototypeOf; } -/* harmony export */ }); -function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { - return o.__proto__ || Object.getPrototypeOf(o); - }; - return _getPrototypeOf(o); -} /***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/inherits.js": -/*!*************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/inherits.js ***! - \*************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_memoizeCapped.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash/_memoizeCapped.js ***! + \***********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var memoize = __webpack_require__(/*! ./memoize */ "./node_modules/lodash/memoize.js"); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _inherits; } -/* harmony export */ }); -/* harmony import */ var _setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./setPrototypeOf.js */ "./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js"); +/** Used as the maximum memoize cache size. */ +var MAX_MEMOIZE_SIZE = 500; -function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function"); - } - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - writable: true, - configurable: true +/** + * A specialized version of `_.memoize` which clears the memoized function's + * cache when it exceeds `MAX_MEMOIZE_SIZE`. + * + * @private + * @param {Function} func The function to have its output memoized. + * @returns {Function} Returns the new memoized function. + */ +function memoizeCapped(func) { + var result = memoize(func, function(key) { + if (cache.size === MAX_MEMOIZE_SIZE) { + cache.clear(); } + return key; }); - Object.defineProperty(subClass, "prototype", { - writable: false - }); - if (superClass) (0,_setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__["default"])(subClass, superClass); + + var cache = result.cache; + return result; } +module.exports = memoizeCapped; + + /***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/iterableToArray.js": -/*!********************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/iterableToArray.js ***! - \********************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_nativeCreate.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash/_nativeCreate.js ***! + \**********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _iterableToArray; } -/* harmony export */ }); -function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); -} +var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"); -/***/ }), +/* Built-in method references that are verified to be native. */ +var nativeCreate = getNative(Object, 'create'); -/***/ "./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js ***! - \*************************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +module.exports = nativeCreate; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _iterableToArrayLimit; } -/* harmony export */ }); -function _iterableToArrayLimit(arr, i) { - var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; - if (null != _i) { - var _s, - _e, - _x, - _r, - _arr = [], - _n = !0, - _d = !1; - try { - if (_x = (_i = _i.call(arr)).next, 0 === i) { - if (Object(_i) !== _i) return; - _n = !1; - } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); - } catch (err) { - _d = !0, _e = err; - } finally { - try { - if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r)) return; - } finally { - if (_d) throw _e; - } - } - return _arr; - } -} /***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js": -/*!********************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js ***! - \********************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_nativeKeys.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_nativeKeys.js ***! + \********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _nonIterableRest; } -/* harmony export */ }); -function _nonIterableRest() { - throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} +var overArg = __webpack_require__(/*! ./_overArg */ "./node_modules/lodash/_overArg.js"); -/***/ }), +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeKeys = overArg(Object.keys, Object); -/***/ "./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js": -/*!**********************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js ***! - \**********************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +module.exports = nativeKeys; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _nonIterableSpread; } -/* harmony export */ }); -function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} /***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/objectSpread2.js": -/*!******************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/objectSpread2.js ***! - \******************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _objectSpread2; } -/* harmony export */ }); -/* harmony import */ var _defineProperty_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./defineProperty.js */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); +/***/ "./node_modules/lodash/_nativeKeysIn.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash/_nativeKeysIn.js ***! + \**********************************************/ +/***/ (function(module) { -function ownKeys(object, enumerableOnly) { - var keys = Object.keys(object); - if (Object.getOwnPropertySymbols) { - var symbols = Object.getOwnPropertySymbols(object); - enumerableOnly && (symbols = symbols.filter(function (sym) { - return Object.getOwnPropertyDescriptor(object, sym).enumerable; - })), keys.push.apply(keys, symbols); - } - return keys; -} -function _objectSpread2(target) { - for (var i = 1; i < arguments.length; i++) { - var source = null != arguments[i] ? arguments[i] : {}; - i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { - (0,_defineProperty_js__WEBPACK_IMPORTED_MODULE_0__["default"])(target, key, source[key]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { - Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); - }); +/** + * This function is like + * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * except that it includes inherited enumerable properties. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function nativeKeysIn(object) { + var result = []; + if (object != null) { + for (var key in Object(object)) { + result.push(key); + } } - return target; + return result; } +module.exports = nativeKeysIn; + + /***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js ***! - \****************************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_nodeUtil.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/_nodeUtil.js ***! + \******************************************/ +/***/ (function(module, exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _objectWithoutProperties; } -/* harmony export */ }); -/* harmony import */ var _objectWithoutPropertiesLoose_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./objectWithoutPropertiesLoose.js */ "./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js"); +/* module decorator */ module = __webpack_require__.nmd(module); +var freeGlobal = __webpack_require__(/*! ./_freeGlobal */ "./node_modules/lodash/_freeGlobal.js"); -function _objectWithoutProperties(source, excluded) { - if (source == null) return {}; - var target = (0,_objectWithoutPropertiesLoose_js__WEBPACK_IMPORTED_MODULE_0__["default"])(source, excluded); - var key, i; - if (Object.getOwnPropertySymbols) { - var sourceSymbolKeys = Object.getOwnPropertySymbols(source); - for (i = 0; i < sourceSymbolKeys.length; i++) { - key = sourceSymbolKeys[i]; - if (excluded.indexOf(key) >= 0) continue; - if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; - target[key] = source[key]; +/** Detect free variable `exports`. */ +var freeExports = true && exports && !exports.nodeType && exports; + +/** Detect free variable `module`. */ +var freeModule = freeExports && "object" == 'object' && module && !module.nodeType && module; + +/** Detect the popular CommonJS extension `module.exports`. */ +var moduleExports = freeModule && freeModule.exports === freeExports; + +/** Detect free variable `process` from Node.js. */ +var freeProcess = moduleExports && freeGlobal.process; + +/** Used to access faster Node.js helpers. */ +var nodeUtil = (function() { + try { + // Use `util.types` for Node.js 10+. + var types = freeModule && freeModule.require && freeModule.require('util').types; + + if (types) { + return types; } - } - return target; -} -/***/ }), + // Legacy `process.binding('util')` for Node.js < 10. + return freeProcess && freeProcess.binding && freeProcess.binding('util'); + } catch (e) {} +}()); -/***/ "./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js": -/*!*********************************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js ***! - \*********************************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +module.exports = nodeUtil; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _objectWithoutPropertiesLoose; } -/* harmony export */ }); -function _objectWithoutPropertiesLoose(source, excluded) { - if (source == null) return {}; - var target = {}; - var sourceKeys = Object.keys(source); - var key, i; - for (i = 0; i < sourceKeys.length; i++) { - key = sourceKeys[i]; - if (excluded.indexOf(key) >= 0) continue; - target[key] = source[key]; - } - return target; -} /***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js ***! - \******************************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_objectToString.js": +/*!************************************************!*\ + !*** ./node_modules/lodash/_objectToString.js ***! + \************************************************/ +/***/ (function(module) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _possibleConstructorReturn; } -/* harmony export */ }); -/* harmony import */ var _typeof_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./typeof.js */ "./node_modules/@babel/runtime/helpers/esm/typeof.js"); -/* harmony import */ var _assertThisInitialized_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./assertThisInitialized.js */ "./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js"); +/** Used for built-in method references. */ +var objectProto = Object.prototype; +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var nativeObjectToString = objectProto.toString; -function _possibleConstructorReturn(self, call) { - if (call && ((0,_typeof_js__WEBPACK_IMPORTED_MODULE_0__["default"])(call) === "object" || typeof call === "function")) { - return call; - } else if (call !== void 0) { - throw new TypeError("Derived constructors may only return object or undefined"); - } - return (0,_assertThisInitialized_js__WEBPACK_IMPORTED_MODULE_1__["default"])(self); +/** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ +function objectToString(value) { + return nativeObjectToString.call(value); } +module.exports = objectToString; + + /***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js": -/*!*******************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js ***! - \*******************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_overArg.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/_overArg.js ***! + \*****************************************/ +/***/ (function(module) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _setPrototypeOf; } -/* harmony export */ }); -function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { - o.__proto__ = p; - return o; +/** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ +function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); }; - return _setPrototypeOf(o, p); } -/***/ }), - -/***/ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js": -/*!******************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js ***! - \******************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +module.exports = overArg; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _slicedToArray; } -/* harmony export */ }); -/* harmony import */ var _arrayWithHoles_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayWithHoles.js */ "./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js"); -/* harmony import */ var _iterableToArrayLimit_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./iterableToArrayLimit.js */ "./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js"); -/* harmony import */ var _unsupportedIterableToArray_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./unsupportedIterableToArray.js */ "./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js"); -/* harmony import */ var _nonIterableRest_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./nonIterableRest.js */ "./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js"); +/***/ }), +/***/ "./node_modules/lodash/_overRest.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/_overRest.js ***! + \******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var apply = __webpack_require__(/*! ./_apply */ "./node_modules/lodash/_apply.js"); -function _slicedToArray(arr, i) { - return (0,_arrayWithHoles_js__WEBPACK_IMPORTED_MODULE_0__["default"])(arr) || (0,_iterableToArrayLimit_js__WEBPACK_IMPORTED_MODULE_1__["default"])(arr, i) || (0,_unsupportedIterableToArray_js__WEBPACK_IMPORTED_MODULE_2__["default"])(arr, i) || (0,_nonIterableRest_js__WEBPACK_IMPORTED_MODULE_3__["default"])(); -} +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; -/***/ }), +/** + * A specialized version of `baseRest` which transforms the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @param {Function} transform The rest array transform. + * @returns {Function} Returns the new function. + */ +function overRest(func, start, transform) { + start = nativeMax(start === undefined ? (func.length - 1) : start, 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + array = Array(length); -/***/ "./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js": -/*!**********************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js ***! - \**********************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + while (++index < length) { + array[index] = args[start + index]; + } + index = -1; + var otherArgs = Array(start + 1); + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = transform(array); + return apply(func, this, otherArgs); + }; +} -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _toConsumableArray; } -/* harmony export */ }); -/* harmony import */ var _arrayWithoutHoles_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayWithoutHoles.js */ "./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js"); -/* harmony import */ var _iterableToArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./iterableToArray.js */ "./node_modules/@babel/runtime/helpers/esm/iterableToArray.js"); -/* harmony import */ var _unsupportedIterableToArray_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./unsupportedIterableToArray.js */ "./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js"); -/* harmony import */ var _nonIterableSpread_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./nonIterableSpread.js */ "./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js"); +module.exports = overRest; +/***/ }), +/***/ "./node_modules/lodash/_root.js": +/*!**************************************!*\ + !*** ./node_modules/lodash/_root.js ***! + \**************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -function _toConsumableArray(arr) { - return (0,_arrayWithoutHoles_js__WEBPACK_IMPORTED_MODULE_0__["default"])(arr) || (0,_iterableToArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(arr) || (0,_unsupportedIterableToArray_js__WEBPACK_IMPORTED_MODULE_2__["default"])(arr) || (0,_nonIterableSpread_js__WEBPACK_IMPORTED_MODULE_3__["default"])(); -} +var freeGlobal = __webpack_require__(/*! ./_freeGlobal */ "./node_modules/lodash/_freeGlobal.js"); -/***/ }), +/** Detect free variable `self`. */ +var freeSelf = typeof self == 'object' && self && self.Object === Object && self; -/***/ "./node_modules/@babel/runtime/helpers/esm/toPrimitive.js": -/*!****************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/toPrimitive.js ***! - \****************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/** Used as a reference to the global object. */ +var root = freeGlobal || freeSelf || Function('return this')(); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _toPrimitive; } -/* harmony export */ }); -/* harmony import */ var _typeof_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./typeof.js */ "./node_modules/@babel/runtime/helpers/esm/typeof.js"); +module.exports = root; -function _toPrimitive(input, hint) { - if ((0,_typeof_js__WEBPACK_IMPORTED_MODULE_0__["default"])(input) !== "object" || input === null) return input; - var prim = input[Symbol.toPrimitive]; - if (prim !== undefined) { - var res = prim.call(input, hint || "default"); - if ((0,_typeof_js__WEBPACK_IMPORTED_MODULE_0__["default"])(res) !== "object") return res; - throw new TypeError("@@toPrimitive must return a primitive value."); - } - return (hint === "string" ? String : Number)(input); -} /***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js": -/*!******************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js ***! - \******************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_safeGet.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/_safeGet.js ***! + \*****************************************/ +/***/ (function(module) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _toPropertyKey; } -/* harmony export */ }); -/* harmony import */ var _typeof_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./typeof.js */ "./node_modules/@babel/runtime/helpers/esm/typeof.js"); -/* harmony import */ var _toPrimitive_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./toPrimitive.js */ "./node_modules/@babel/runtime/helpers/esm/toPrimitive.js"); +/** + * Gets the value at `key`, unless `key` is "__proto__" or "constructor". + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ +function safeGet(object, key) { + if (key === 'constructor' && typeof object[key] === 'function') { + return; + } + if (key == '__proto__') { + return; + } -function _toPropertyKey(arg) { - var key = (0,_toPrimitive_js__WEBPACK_IMPORTED_MODULE_1__["default"])(arg, "string"); - return (0,_typeof_js__WEBPACK_IMPORTED_MODULE_0__["default"])(key) === "symbol" ? key : String(key); + return object[key]; } -/***/ }), +module.exports = safeGet; -/***/ "./node_modules/@babel/runtime/helpers/esm/typeof.js": -/*!***********************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/typeof.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _typeof; } -/* harmony export */ }); -function _typeof(obj) { - "@babel/helpers - typeof"; +/***/ }), - return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { - return typeof obj; - } : function (obj) { - return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }, _typeof(obj); -} +/***/ "./node_modules/lodash/_setCacheAdd.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_setCacheAdd.js ***! + \*********************************************/ +/***/ (function(module) { -/***/ }), +/** Used to stand-in for `undefined` hash values. */ +var HASH_UNDEFINED = '__lodash_hash_undefined__'; -/***/ "./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js ***! - \*******************************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/** + * Adds `value` to the array cache. + * + * @private + * @name add + * @memberOf SetCache + * @alias push + * @param {*} value The value to cache. + * @returns {Object} Returns the cache instance. + */ +function setCacheAdd(value) { + this.__data__.set(value, HASH_UNDEFINED); + return this; +} -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _unsupportedIterableToArray; } -/* harmony export */ }); -/* harmony import */ var _arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayLikeToArray.js */ "./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js"); +module.exports = setCacheAdd; -function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__["default"])(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__["default"])(o, minLen); -} /***/ }), -/***/ "./node_modules/ramda/es/F.js": -/*!************************************!*\ - !*** ./node_modules/ramda/es/F.js ***! - \************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_setCacheHas.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_setCacheHas.js ***! + \*********************************************/ +/***/ (function(module) { -"use strict"; -__webpack_require__.r(__webpack_exports__); /** - * A function that always returns `false`. Any passed in parameters are ignored. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Function - * @sig * -> Boolean - * @param {*} - * @return {Boolean} - * @see R.T - * @example + * Checks if `value` is in the array cache. * - * R.F(); //=> false + * @private + * @name has + * @memberOf SetCache + * @param {*} value The value to search for. + * @returns {number} Returns `true` if `value` is found, else `false`. */ -var F = function F() { - return false; -}; -/* harmony default export */ __webpack_exports__["default"] = (F); +function setCacheHas(value) { + return this.__data__.has(value); +} + +module.exports = setCacheHas; + /***/ }), -/***/ "./node_modules/ramda/es/T.js": -/*!************************************!*\ - !*** ./node_modules/ramda/es/T.js ***! - \************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_setToArray.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_setToArray.js ***! + \********************************************/ +/***/ (function(module) { -"use strict"; -__webpack_require__.r(__webpack_exports__); /** - * A function that always returns `true`. Any passed in parameters are ignored. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Function - * @sig * -> Boolean - * @param {*} - * @return {Boolean} - * @see R.F - * @example + * Converts `set` to an array of its values. * - * R.T(); //=> true + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the values. */ -var T = function T() { - return true; -}; -/* harmony default export */ __webpack_exports__["default"] = (T); +function setToArray(set) { + var index = -1, + result = Array(set.size); + + set.forEach(function(value) { + result[++index] = value; + }); + return result; +} + +module.exports = setToArray; + /***/ }), -/***/ "./node_modules/ramda/es/__.js": -/*!*************************************!*\ - !*** ./node_modules/ramda/es/__.js ***! - \*************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_setToString.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_setToString.js ***! + \*********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var baseSetToString = __webpack_require__(/*! ./_baseSetToString */ "./node_modules/lodash/_baseSetToString.js"), + shortOut = __webpack_require__(/*! ./_shortOut */ "./node_modules/lodash/_shortOut.js"); -"use strict"; -__webpack_require__.r(__webpack_exports__); /** - * A special placeholder value used to specify "gaps" within curried functions, - * allowing partial application of any combination of arguments, regardless of - * their positions. - * - * If `g` is a curried ternary function and `_` is `R.__`, the following are - * equivalent: - * - * - `g(1, 2, 3)` - * - `g(_, 2, 3)(1)` - * - `g(_, _, 3)(1)(2)` - * - `g(_, _, 3)(1, 2)` - * - `g(_, 2, _)(1, 3)` - * - `g(_, 2)(1)(3)` - * - `g(_, 2)(1, 3)` - * - `g(_, 2)(_, 3)(1)` - * - * @name __ - * @constant - * @memberOf R - * @since v0.6.0 - * @category Function - * @example + * Sets the `toString` method of `func` to return `string`. * - * const greet = R.replace('{name}', R.__, 'Hello, {name}!'); - * greet('Alice'); //=> 'Hello, Alice!' + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. */ -/* harmony default export */ __webpack_exports__["default"] = ({ - '@@functional/placeholder': true -}); +var setToString = shortOut(baseSetToString); + +module.exports = setToString; + /***/ }), -/***/ "./node_modules/ramda/es/add.js": -/*!**************************************!*\ - !*** ./node_modules/ramda/es/add.js ***! - \**************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_shortOut.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/_shortOut.js ***! + \******************************************/ +/***/ (function(module) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/** Used to detect hot functions by number of calls within a span of milliseconds. */ +var HOT_COUNT = 800, + HOT_SPAN = 16; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeNow = Date.now; /** - * Adds two values. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Math - * @sig Number -> Number -> Number - * @param {Number} a - * @param {Number} b - * @return {Number} - * @see R.subtract - * @example + * Creates a function that'll short out and invoke `identity` instead + * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` + * milliseconds. * - * R.add(2, 3); //=> 5 - * R.add(7)(10); //=> 17 + * @private + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new shortable function. */ +function shortOut(func) { + var count = 0, + lastCalled = 0; -var add = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function add(a, b) { - return Number(a) + Number(b); -}); -/* harmony default export */ __webpack_exports__["default"] = (add); + return function() { + var stamp = nativeNow(), + remaining = HOT_SPAN - (stamp - lastCalled); -/***/ }), + lastCalled = stamp; + if (remaining > 0) { + if (++count >= HOT_COUNT) { + return arguments[0]; + } + } else { + count = 0; + } + return func.apply(undefined, arguments); + }; +} -/***/ "./node_modules/ramda/es/addIndex.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/addIndex.js ***! - \*******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +module.exports = shortOut; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_concat_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_concat.js */ "./node_modules/ramda/es/internal/_concat.js"); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./curryN.js */ "./node_modules/ramda/es/curryN.js"); +/***/ }), + +/***/ "./node_modules/lodash/_stackClear.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_stackClear.js ***! + \********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"); /** - * Creates a new list iteration function from an existing one by adding two new - * parameters to its callback function: the current index, and the entire list. - * - * This would turn, for instance, [`R.map`](#map) function into one that - * more closely resembles `Array.prototype.map`. Note that this will only work - * for functions in which the iteration callback function is the first - * parameter, and where the list is the last parameter. (This latter might be - * unimportant if the list parameter is not used.) - * - * @func - * @memberOf R - * @since v0.15.0 - * @category Function - * @category List - * @sig (((a ...) -> b) ... -> [a] -> *) -> (((a ..., Int, [a]) -> b) ... -> [a] -> *) - * @param {Function} fn A list iteration function that does not pass index or list to its callback - * @return {Function} An altered list iteration function that passes (item, index, list) to its callback - * @example + * Removes all key-value entries from the stack. * - * const mapIndexed = R.addIndex(R.map); - * mapIndexed((val, idx) => idx + '-' + val, ['f', 'o', 'o', 'b', 'a', 'r']); - * //=> ['0-f', '1-o', '2-o', '3-b', '4-a', '5-r'] + * @private + * @name clear + * @memberOf Stack */ +function stackClear() { + this.__data__ = new ListCache; + this.size = 0; +} + +module.exports = stackClear; -var addIndex = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function addIndex(fn) { - return (0,_curryN_js__WEBPACK_IMPORTED_MODULE_2__["default"])(fn.length, function () { - var idx = 0; - var origFn = arguments[0]; - var list = arguments[arguments.length - 1]; - var args = Array.prototype.slice.call(arguments, 0); - args[0] = function () { - var result = origFn.apply(this, (0,_internal_concat_js__WEBPACK_IMPORTED_MODULE_0__["default"])(arguments, [idx, list])); - idx += 1; - return result; - }; - return fn.apply(this, args); - }); -}); -/* harmony default export */ __webpack_exports__["default"] = (addIndex); /***/ }), -/***/ "./node_modules/ramda/es/addIndexRight.js": -/*!************************************************!*\ - !*** ./node_modules/ramda/es/addIndexRight.js ***! - \************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_stackDelete.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_stackDelete.js ***! + \*********************************************/ +/***/ (function(module) { + +/** + * Removes `key` and its value from the stack. + * + * @private + * @name delete + * @memberOf Stack + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function stackDelete(key) { + var data = this.__data__, + result = data['delete'](key); + + this.size = data.size; + return result; +} + +module.exports = stackDelete; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_concat_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_concat.js */ "./node_modules/ramda/es/internal/_concat.js"); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./curryN.js */ "./node_modules/ramda/es/curryN.js"); +/***/ }), +/***/ "./node_modules/lodash/_stackGet.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/_stackGet.js ***! + \******************************************/ +/***/ (function(module) { /** - * As with `addIndex`, `addIndexRight` creates a new list iteration function - * from an existing one by adding two new parameters to its callback function: - * the current index, and the entire list. - * - * Unlike `addIndex`, `addIndexRight` iterates from the right to the left. - * - * @func - * @memberOf R - * @since v0.29.0 - * @category Function - * @category List - * @sig ((a ... -> b) ... -> [a] -> *) -> (a ..., Int, [a] -> b) ... -> [a] -> *) - * @param {Function} fn A list iteration function that does not pass index or list to its callback - * @return {Function} An altered list iteration function that passes (item, index, list) to its callback - * @example + * Gets the stack value for `key`. * - * const revmap = (fn, ary) => R.map(fn, R.reverse(ary)); - * const revmapIndexed = R.addIndexRight(revmap); - * revmapIndexed((val, idx) => idx + '-' + val, ['f', 'o', 'o', 'b', 'a', 'r']); - * //=> [ '5-r', '4-a', '3-b', '2-o', '1-o', '0-f' ] + * @private + * @name get + * @memberOf Stack + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. */ +function stackGet(key) { + return this.__data__.get(key); +} -var addIndexRight = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function addIndex(fn) { - return (0,_curryN_js__WEBPACK_IMPORTED_MODULE_2__["default"])(fn.length, function () { - var origFn = arguments[0]; - var list = arguments[arguments.length - 1]; - var idx = list.length - 1; - var args = Array.prototype.slice.call(arguments, 0); - args[0] = function () { - var result = origFn.apply(this, (0,_internal_concat_js__WEBPACK_IMPORTED_MODULE_0__["default"])(arguments, [idx, list])); - idx -= 1; - return result; - }; - return fn.apply(this, args); - }); -}); -/* harmony default export */ __webpack_exports__["default"] = (addIndexRight); - -/***/ }), +module.exports = stackGet; -/***/ "./node_modules/ramda/es/adjust.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/adjust.js ***! - \*****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_concat_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_concat.js */ "./node_modules/ramda/es/internal/_concat.js"); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); +/***/ }), +/***/ "./node_modules/lodash/_stackHas.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/_stackHas.js ***! + \******************************************/ +/***/ (function(module) { /** - * Applies a function to the value at the given index of an array, returning a - * new copy of the array with the element at the given index replaced with the - * result of the function application. - * - * @func - * @memberOf R - * @since v0.14.0 - * @category List - * @sig Number -> (a -> a) -> [a] -> [a] - * @param {Number} idx The index. - * @param {Function} fn The function to apply. - * @param {Array|Arguments} list An array-like object whose value - * at the supplied index will be replaced. - * @return {Array} A copy of the supplied array-like object with - * the element at index `idx` replaced with the value - * returned by applying `fn` to the existing element. - * @see R.update - * @example + * Checks if a stack value for `key` exists. * - * R.adjust(1, R.toUpper, ['a', 'b', 'c', 'd']); //=> ['a', 'B', 'c', 'd'] - * R.adjust(-1, R.toUpper, ['a', 'b', 'c', 'd']); //=> ['a', 'b', 'c', 'D'] - * @symb R.adjust(-1, f, [a, b]) = [a, f(b)] - * @symb R.adjust(0, f, [a, b]) = [f(a), b] + * @private + * @name has + * @memberOf Stack + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ +function stackHas(key) { + return this.__data__.has(key); +} -var adjust = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function adjust(idx, fn, list) { - var len = list.length; - if (idx >= len || idx < -len) { - return list; - } - var _idx = (len + idx) % len; - var _list = (0,_internal_concat_js__WEBPACK_IMPORTED_MODULE_0__["default"])(list); - _list[_idx] = fn(list[_idx]); - return _list; -}); -/* harmony default export */ __webpack_exports__["default"] = (adjust); +module.exports = stackHas; -/***/ }), -/***/ "./node_modules/ramda/es/all.js": -/*!**************************************!*\ - !*** ./node_modules/ramda/es/all.js ***! - \**************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ }), -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_xall_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xall.js */ "./node_modules/ramda/es/internal/_xall.js"); +/***/ "./node_modules/lodash/_stackSet.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/_stackSet.js ***! + \******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"), + Map = __webpack_require__(/*! ./_Map */ "./node_modules/lodash/_Map.js"), + MapCache = __webpack_require__(/*! ./_MapCache */ "./node_modules/lodash/_MapCache.js"); +/** Used as the size to enable large array optimizations. */ +var LARGE_ARRAY_SIZE = 200; /** - * Returns `true` if all elements of the list match the predicate, `false` if - * there are any that don't. - * - * Dispatches to the `all` method of the second argument, if present. - * - * Acts as a transducer if a transformer is given in list position. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig (a -> Boolean) -> [a] -> Boolean - * @param {Function} fn The predicate function. - * @param {Array} list The array to consider. - * @return {Boolean} `true` if the predicate is satisfied by every element, `false` - * otherwise. - * @see R.any, R.none, R.transduce - * @example + * Sets the stack `key` to `value`. * - * const equals3 = R.equals(3); - * R.all(equals3)([3, 3, 3, 3]); //=> true - * R.all(equals3)([3, 3, 1, 3]); //=> false + * @private + * @name set + * @memberOf Stack + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the stack cache instance. */ - -var all = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])(['all'], _internal_xall_js__WEBPACK_IMPORTED_MODULE_2__["default"], function all(fn, list) { - var idx = 0; - while (idx < list.length) { - if (!fn(list[idx])) { - return false; +function stackSet(key, value) { + var data = this.__data__; + if (data instanceof ListCache) { + var pairs = data.__data__; + if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { + pairs.push([key, value]); + this.size = ++data.size; + return this; } - idx += 1; + data = this.__data__ = new MapCache(pairs); } - return true; -})); -/* harmony default export */ __webpack_exports__["default"] = (all); + data.set(key, value); + this.size = data.size; + return this; +} + +module.exports = stackSet; + /***/ }), -/***/ "./node_modules/ramda/es/allPass.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/allPass.js ***! - \******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_strictIndexOf.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash/_strictIndexOf.js ***! + \***********************************************/ +/***/ (function(module) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./curryN.js */ "./node_modules/ramda/es/curryN.js"); -/* harmony import */ var _max_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./max.js */ "./node_modules/ramda/es/max.js"); -/* harmony import */ var _pluck_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./pluck.js */ "./node_modules/ramda/es/pluck.js"); -/* harmony import */ var _reduce_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./reduce.js */ "./node_modules/ramda/es/reduce.js"); +/** + * A specialized version of `_.indexOf` which performs strict equality + * comparisons of values, i.e. `===`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function strictIndexOf(array, value, fromIndex) { + var index = fromIndex - 1, + length = array.length; + + while (++index < length) { + if (array[index] === value) { + return index; + } + } + return -1; +} + +module.exports = strictIndexOf; +/***/ }), +/***/ "./node_modules/lodash/_stringSize.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/_stringSize.js ***! + \********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var asciiSize = __webpack_require__(/*! ./_asciiSize */ "./node_modules/lodash/_asciiSize.js"), + hasUnicode = __webpack_require__(/*! ./_hasUnicode */ "./node_modules/lodash/_hasUnicode.js"), + unicodeSize = __webpack_require__(/*! ./_unicodeSize */ "./node_modules/lodash/_unicodeSize.js"); /** - * Takes a list of predicates and returns a predicate that returns true for a - * given list of arguments if every one of the provided predicates is satisfied - * by those arguments. - * - * The function returned is a curried function whose arity matches that of the - * highest-arity predicate. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Logic - * @sig [(*... -> Boolean)] -> (*... -> Boolean) - * @param {Array} predicates An array of predicates to check - * @return {Function} The combined predicate - * @see R.anyPass, R.both - * @example - * - * const isQueen = R.propEq('rank', 'Q'); - * const isSpade = R.propEq('suit', '♠︎'); - * const isQueenOfSpades = R.allPass([isQueen, isSpade]); + * Gets the number of symbols in `string`. * - * isQueenOfSpades({rank: 'Q', suit: '♣︎'}); //=> false - * isQueenOfSpades({rank: 'Q', suit: '♠︎'}); //=> true + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the string size. */ +function stringSize(string) { + return hasUnicode(string) + ? unicodeSize(string) + : asciiSize(string); +} + +module.exports = stringSize; -var allPass = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function allPass(preds) { - return (0,_curryN_js__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_reduce_js__WEBPACK_IMPORTED_MODULE_4__["default"])(_max_js__WEBPACK_IMPORTED_MODULE_2__["default"], 0, (0,_pluck_js__WEBPACK_IMPORTED_MODULE_3__["default"])('length', preds)), function () { - var idx = 0; - var len = preds.length; - while (idx < len) { - if (!preds[idx].apply(this, arguments)) { - return false; - } - idx += 1; - } - return true; - }); -}); -/* harmony default export */ __webpack_exports__["default"] = (allPass); /***/ }), -/***/ "./node_modules/ramda/es/always.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/always.js ***! - \*****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_stringToPath.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash/_stringToPath.js ***! + \**********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +var memoizeCapped = __webpack_require__(/*! ./_memoizeCapped */ "./node_modules/lodash/_memoizeCapped.js"); + +/** Used to match property names within property paths. */ +var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + +/** Used to match backslashes in property paths. */ +var reEscapeChar = /\\(\\)?/g; /** - * Returns a function that always returns the given value. Note that for - * non-primitives the value returned is a reference to the original value. - * - * This function is known as `const`, `constant`, or `K` (for K combinator) in - * other languages and libraries. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig a -> (* -> a) - * @param {*} val The value to wrap in a function - * @return {Function} A Function :: * -> val. - * @example + * Converts `string` to a property path array. * - * const t = R.always('Tee'); - * t(); //=> 'Tee' + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. */ - -var always = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function always(val) { - return function () { - return val; - }; +var stringToPath = memoizeCapped(function(string) { + var result = []; + if (string.charCodeAt(0) === 46 /* . */) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, subString) { + result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; }); -/* harmony default export */ __webpack_exports__["default"] = (always); + +module.exports = stringToPath; + /***/ }), -/***/ "./node_modules/ramda/es/and.js": -/*!**************************************!*\ - !*** ./node_modules/ramda/es/and.js ***! - \**************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/_toKey.js": +/*!***************************************!*\ + !*** ./node_modules/lodash/_toKey.js ***! + \***************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +var isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); + +/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0; /** - * Returns the first argument if it is falsy, otherwise the second argument. - * Acts as the boolean `and` statement if both inputs are `Boolean`s. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Logic - * @sig a -> b -> a | b - * @param {Any} a - * @param {Any} b - * @return {Any} - * @see R.both, R.or - * @example + * Converts `value` to a string key if it's not a string or symbol. * - * R.and(true, true); //=> true - * R.and(true, false); //=> false - * R.and(false, true); //=> false - * R.and(false, false); //=> false + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. */ +function toKey(value) { + if (typeof value == 'string' || isSymbol(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; +} + +module.exports = toKey; -var and = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function and(a, b) { - return a && b; -}); -/* harmony default export */ __webpack_exports__["default"] = (and); /***/ }), -/***/ "./node_modules/ramda/es/andThen.js": +/***/ "./node_modules/lodash/_toSource.js": /*!******************************************!*\ - !*** ./node_modules/ramda/es/andThen.js ***! + !*** ./node_modules/lodash/_toSource.js ***! \******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(module) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_assertPromise_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_assertPromise.js */ "./node_modules/ramda/es/internal/_assertPromise.js"); +/** Used for built-in method references. */ +var funcProto = Function.prototype; +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; /** - * Returns the result of applying the onSuccess function to the value inside - * a successfully resolved promise. This is useful for working with promises - * inside function compositions. - * - * @func - * @memberOf R - * @since v0.27.1 - * @category Function - * @sig (a -> b) -> (Promise e a) -> (Promise e b) - * @sig (a -> (Promise e b)) -> (Promise e a) -> (Promise e b) - * @param {Function} onSuccess The function to apply. Can return a value or a promise of a value. - * @param {Promise} p - * @return {Promise} The result of calling `p.then(onSuccess)` - * @see R.otherwise - * @example - * - * const makeQuery = email => ({ query: { email }}); - * const fetchMember = request => - * Promise.resolve({ firstName: 'Bob', lastName: 'Loblaw', id: 42 }); - * - * //getMemberName :: String -> Promise ({ firstName, lastName }) - * const getMemberName = R.pipe( - * makeQuery, - * fetchMember, - * R.andThen(R.pick(['firstName', 'lastName'])) - * ); + * Converts `func` to its source code. * - * getMemberName('bob@gmail.com').then(console.log); + * @private + * @param {Function} func The function to convert. + * @returns {string} Returns the source code. */ +function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; +} -var andThen = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function andThen(f, p) { - (0,_internal_assertPromise_js__WEBPACK_IMPORTED_MODULE_1__["default"])('andThen', p); - return p.then(f); -}); -/* harmony default export */ __webpack_exports__["default"] = (andThen); - -/***/ }), +module.exports = toSource; -/***/ "./node_modules/ramda/es/any.js": -/*!**************************************!*\ - !*** ./node_modules/ramda/es/any.js ***! - \**************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_xany_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xany.js */ "./node_modules/ramda/es/internal/_xany.js"); +/***/ }), +/***/ "./node_modules/lodash/_trimmedEndIndex.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash/_trimmedEndIndex.js ***! + \*************************************************/ +/***/ (function(module) { +/** Used to match a single whitespace character. */ +var reWhitespace = /\s/; /** - * Returns `true` if at least one of the elements of the list match the predicate, - * `false` otherwise. - * - * Dispatches to the `any` method of the second argument, if present. - * - * Acts as a transducer if a transformer is given in list position. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig (a -> Boolean) -> [a] -> Boolean - * @param {Function} fn The predicate function. - * @param {Array} list The array to consider. - * @return {Boolean} `true` if the predicate is satisfied by at least one element, `false` - * otherwise. - * @see R.all, R.none, R.transduce - * @example + * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace + * character of `string`. * - * const lessThan0 = R.flip(R.lt)(0); - * const lessThan2 = R.flip(R.lt)(2); - * R.any(lessThan0)([1, 2]); //=> false - * R.any(lessThan2)([1, 2]); //=> true + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the index of the last non-whitespace character. */ +function trimmedEndIndex(string) { + var index = string.length; -var any = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])(['any'], _internal_xany_js__WEBPACK_IMPORTED_MODULE_2__["default"], function any(fn, list) { - var idx = 0; - while (idx < list.length) { - if (fn(list[idx])) { - return true; - } - idx += 1; - } - return false; -})); -/* harmony default export */ __webpack_exports__["default"] = (any); + while (index-- && reWhitespace.test(string.charAt(index))) {} + return index; +} -/***/ }), +module.exports = trimmedEndIndex; -/***/ "./node_modules/ramda/es/anyPass.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/anyPass.js ***! - \******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./curryN.js */ "./node_modules/ramda/es/curryN.js"); -/* harmony import */ var _max_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./max.js */ "./node_modules/ramda/es/max.js"); -/* harmony import */ var _pluck_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./pluck.js */ "./node_modules/ramda/es/pluck.js"); -/* harmony import */ var _reduce_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./reduce.js */ "./node_modules/ramda/es/reduce.js"); +/***/ }), + +/***/ "./node_modules/lodash/_unicodeSize.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/_unicodeSize.js ***! + \*********************************************/ +/***/ (function(module) { +/** Used to compose unicode character classes. */ +var rsAstralRange = '\\ud800-\\udfff', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, + rsVarRange = '\\ufe0e\\ufe0f'; +/** Used to compose unicode capture groups. */ +var rsAstral = '[' + rsAstralRange + ']', + rsCombo = '[' + rsComboRange + ']', + rsFitz = '\\ud83c[\\udffb-\\udfff]', + rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', + rsNonAstral = '[^' + rsAstralRange + ']', + rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', + rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', + rsZWJ = '\\u200d'; +/** Used to compose unicode regexes. */ +var reOptMod = rsModifier + '?', + rsOptVar = '[' + rsVarRange + ']?', + rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', + rsSeq = rsOptVar + reOptMod + rsOptJoin, + rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; +/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ +var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); /** - * Takes a list of predicates and returns a predicate that returns true for a - * given list of arguments if at least one of the provided predicates is - * satisfied by those arguments. - * - * The function returned is a curried function whose arity matches that of the - * highest-arity predicate. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Logic - * @sig [(*... -> Boolean)] -> (*... -> Boolean) - * @param {Array} predicates An array of predicates to check - * @return {Function} The combined predicate - * @see R.allPass, R.either - * @example - * - * const isClub = R.propEq('suit', '♣'); - * const isSpade = R.propEq('suit', '♠'); - * const isBlackCard = R.anyPass([isClub, isSpade]); + * Gets the size of a Unicode `string`. * - * isBlackCard({rank: '10', suit: '♣'}); //=> true - * isBlackCard({rank: 'Q', suit: '♠'}); //=> true - * isBlackCard({rank: 'Q', suit: '♦'}); //=> false + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. */ +function unicodeSize(string) { + var result = reUnicode.lastIndex = 0; + while (reUnicode.test(string)) { + ++result; + } + return result; +} -var anyPass = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function anyPass(preds) { - return (0,_curryN_js__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_reduce_js__WEBPACK_IMPORTED_MODULE_4__["default"])(_max_js__WEBPACK_IMPORTED_MODULE_2__["default"], 0, (0,_pluck_js__WEBPACK_IMPORTED_MODULE_3__["default"])('length', preds)), function () { - var idx = 0; - var len = preds.length; - while (idx < len) { - if (preds[idx].apply(this, arguments)) { - return true; - } - idx += 1; - } - return false; - }); -}); -/* harmony default export */ __webpack_exports__["default"] = (anyPass); - -/***/ }), +module.exports = unicodeSize; -/***/ "./node_modules/ramda/es/ap.js": -/*!*************************************!*\ - !*** ./node_modules/ramda/es/ap.js ***! - \*************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_concat_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_concat.js */ "./node_modules/ramda/es/internal/_concat.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_reduce_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_reduce.js */ "./node_modules/ramda/es/internal/_reduce.js"); -/* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./map.js */ "./node_modules/ramda/es/map.js"); +/***/ }), +/***/ "./node_modules/lodash/clone.js": +/*!**************************************!*\ + !*** ./node_modules/lodash/clone.js ***! + \**************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var baseClone = __webpack_require__(/*! ./_baseClone */ "./node_modules/lodash/_baseClone.js"); +/** Used to compose bitmasks for cloning. */ +var CLONE_SYMBOLS_FLAG = 4; /** - * ap applies a list of functions to a list of values. + * Creates a shallow clone of `value`. * - * Dispatches to the `ap` method of the first argument, if present. Also - * treats curried functions as applicatives. + * **Note:** This method is loosely based on the + * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) + * and supports cloning arrays, array buffers, booleans, date objects, maps, + * numbers, `Object` objects, regexes, sets, strings, symbols, and typed + * arrays. The own enumerable properties of `arguments` objects are cloned + * as plain objects. An empty object is returned for uncloneable values such + * as error objects, functions, DOM nodes, and WeakMaps. * - * @func - * @memberOf R - * @since v0.3.0 - * @category Function - * @sig [a -> b] -> [a] -> [b] - * @sig Apply f => f (a -> b) -> f a -> f b - * @sig (r -> a -> b) -> (r -> a) -> (r -> b) - * @param {*} applyF - * @param {*} applyX - * @return {*} + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to clone. + * @returns {*} Returns the cloned value. + * @see _.cloneDeep * @example * - * R.ap([R.multiply(2), R.add(3)], [1,2,3]); //=> [2, 4, 6, 4, 5, 6] - * R.ap([R.concat('tasty '), R.toUpper], ['pizza', 'salad']); //=> ["tasty pizza", "tasty salad", "PIZZA", "SALAD"] + * var objects = [{ 'a': 1 }, { 'b': 2 }]; * - * // R.ap can also be used as S combinator - * // when only two functions are passed - * R.ap(R.concat, R.toUpper)('Ramda') //=> 'RamdaRAMDA' - * @symb R.ap([f, g], [a, b]) = [f(a), f(b), g(a), g(b)] + * var shallow = _.clone(objects); + * console.log(shallow[0] === objects[0]); + * // => true */ +function clone(value) { + return baseClone(value, CLONE_SYMBOLS_FLAG); +} -var ap = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function ap(applyF, applyX) { - return typeof applyX['fantasy-land/ap'] === 'function' ? applyX['fantasy-land/ap'](applyF) : typeof applyF.ap === 'function' ? applyF.ap(applyX) : typeof applyF === 'function' ? function (x) { - return applyF(x)(applyX(x)); - } : (0,_internal_reduce_js__WEBPACK_IMPORTED_MODULE_2__["default"])(function (acc, f) { - return (0,_internal_concat_js__WEBPACK_IMPORTED_MODULE_0__["default"])(acc, (0,_map_js__WEBPACK_IMPORTED_MODULE_3__["default"])(f, applyX)); - }, [], applyF); -}); -/* harmony default export */ __webpack_exports__["default"] = (ap); - -/***/ }), +module.exports = clone; -/***/ "./node_modules/ramda/es/aperture.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/aperture.js ***! - \*******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_aperture_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_aperture.js */ "./node_modules/ramda/es/internal/_aperture.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_xaperture_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_xaperture.js */ "./node_modules/ramda/es/internal/_xaperture.js"); +/***/ }), +/***/ "./node_modules/lodash/cloneDeep.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/cloneDeep.js ***! + \******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var baseClone = __webpack_require__(/*! ./_baseClone */ "./node_modules/lodash/_baseClone.js"); +/** Used to compose bitmasks for cloning. */ +var CLONE_DEEP_FLAG = 1, + CLONE_SYMBOLS_FLAG = 4; /** - * Returns a new list, composed of n-tuples of consecutive elements. If `n` is - * greater than the length of the list, an empty list is returned. - * - * Acts as a transducer if a transformer is given in list position. + * This method is like `_.clone` except that it recursively clones `value`. * - * @func - * @memberOf R - * @since v0.12.0 - * @category List - * @sig Number -> [a] -> [[a]] - * @param {Number} n The size of the tuples to create - * @param {Array} list The list to split into `n`-length tuples - * @return {Array} The resulting list of `n`-length tuples - * @see R.transduce + * @static + * @memberOf _ + * @since 1.0.0 + * @category Lang + * @param {*} value The value to recursively clone. + * @returns {*} Returns the deep cloned value. + * @see _.clone * @example * - * R.aperture(2, [1, 2, 3, 4, 5]); //=> [[1, 2], [2, 3], [3, 4], [4, 5]] - * R.aperture(3, [1, 2, 3, 4, 5]); //=> [[1, 2, 3], [2, 3, 4], [3, 4, 5]] - * R.aperture(7, [1, 2, 3, 4, 5]); //=> [] + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var deep = _.cloneDeep(objects); + * console.log(deep[0] === objects[0]); + * // => false */ +function cloneDeep(value) { + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); +} + +module.exports = cloneDeep; -var aperture = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_2__["default"])([], _internal_xaperture_js__WEBPACK_IMPORTED_MODULE_3__["default"], _internal_aperture_js__WEBPACK_IMPORTED_MODULE_0__["default"])); -/* harmony default export */ __webpack_exports__["default"] = (aperture); /***/ }), -/***/ "./node_modules/ramda/es/append.js": +/***/ "./node_modules/lodash/constant.js": /*!*****************************************!*\ - !*** ./node_modules/ramda/es/append.js ***! + !*** ./node_modules/lodash/constant.js ***! \*****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_concat_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_concat.js */ "./node_modules/ramda/es/internal/_concat.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); - +/***/ (function(module) { /** - * Returns a new list containing the contents of the given list, followed by - * the given element. + * Creates a function that returns `value`. * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig a -> [a] -> [a] - * @param {*} el The element to add to the end of the new list. - * @param {Array} list The list of elements to add a new item to. - * list. - * @return {Array} A new list containing the elements of the old list followed by `el`. - * @see R.prepend + * @static + * @memberOf _ + * @since 2.4.0 + * @category Util + * @param {*} value The value to return from the new function. + * @returns {Function} Returns the new constant function. * @example * - * R.append('tests', ['write', 'more']); //=> ['write', 'more', 'tests'] - * R.append('tests', []); //=> ['tests'] - * R.append(['tests'], ['write', 'more']); //=> ['write', 'more', ['tests']] + * var objects = _.times(2, _.constant({ 'a': 1 })); + * + * console.log(objects); + * // => [{ 'a': 1 }, { 'a': 1 }] + * + * console.log(objects[0] === objects[1]); + * // => true */ +function constant(value) { + return function() { + return value; + }; +} + +module.exports = constant; -var append = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function append(el, list) { - return (0,_internal_concat_js__WEBPACK_IMPORTED_MODULE_0__["default"])(list, [el]); -}); -/* harmony default export */ __webpack_exports__["default"] = (append); /***/ }), -/***/ "./node_modules/ramda/es/apply.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/apply.js ***! - \****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/debounce.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/debounce.js ***! + \*****************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +var isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), + now = __webpack_require__(/*! ./now */ "./node_modules/lodash/now.js"), + toNumber = __webpack_require__(/*! ./toNumber */ "./node_modules/lodash/toNumber.js"); + +/** Error message constants. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max, + nativeMin = Math.min; /** - * Applies function `fn` to the argument list `args`. This is useful for - * creating a fixed-arity function from a variadic function. `fn` should be a - * bound function if context is significant. + * Creates a debounced function that delays invoking `func` until after `wait` + * milliseconds have elapsed since the last time the debounced function was + * invoked. The debounced function comes with a `cancel` method to cancel + * delayed `func` invocations and a `flush` method to immediately invoke them. + * Provide `options` to indicate whether `func` should be invoked on the + * leading and/or trailing edge of the `wait` timeout. The `func` is invoked + * with the last arguments provided to the debounced function. Subsequent + * calls to the debounced function return the result of the last `func` + * invocation. * - * @func - * @memberOf R - * @since v0.7.0 + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the debounced function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.debounce` and `_.throttle`. + * + * @static + * @memberOf _ + * @since 0.1.0 * @category Function - * @sig (*... -> a) -> [*] -> a - * @param {Function} fn The function which will be called with `args` - * @param {Array} args The arguments to call `fn` with - * @return {*} result The result, equivalent to `fn(...args)` - * @see R.call, R.unapply + * @param {Function} func The function to debounce. + * @param {number} [wait=0] The number of milliseconds to delay. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=false] + * Specify invoking on the leading edge of the timeout. + * @param {number} [options.maxWait] + * The maximum time `func` is allowed to be delayed before it's invoked. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new debounced function. * @example * - * const nums = [1, 2, 3, -99, 42, 6, 7]; - * R.apply(Math.max, nums); //=> 42 - * @symb R.apply(f, [a, b, c]) = f(a, b, c) + * // Avoid costly calculations while the window size is in flux. + * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); + * + * // Invoke `sendMail` when clicked, debouncing subsequent calls. + * jQuery(element).on('click', _.debounce(sendMail, 300, { + * 'leading': true, + * 'trailing': false + * })); + * + * // Ensure `batchLog` is invoked once after 1 second of debounced calls. + * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); + * var source = new EventSource('/stream'); + * jQuery(source).on('message', debounced); + * + * // Cancel the trailing debounced invocation. + * jQuery(window).on('popstate', debounced.cancel); */ +function debounce(func, wait, options) { + var lastArgs, + lastThis, + maxWait, + result, + timerId, + lastCallTime, + lastInvokeTime = 0, + leading = false, + maxing = false, + trailing = true; -var apply = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function apply(fn, args) { - return fn.apply(this, args); -}); -/* harmony default export */ __webpack_exports__["default"] = (apply); - -/***/ }), + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + wait = toNumber(wait) || 0; + if (isObject(options)) { + leading = !!options.leading; + maxing = 'maxWait' in options; + maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } -/***/ "./node_modules/ramda/es/applySpec.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/applySpec.js ***! - \********************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + function invokeFunc(time) { + var args = lastArgs, + thisArg = lastThis; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); -/* harmony import */ var _apply_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./apply.js */ "./node_modules/ramda/es/apply.js"); -/* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./curryN.js */ "./node_modules/ramda/es/curryN.js"); -/* harmony import */ var _max_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./max.js */ "./node_modules/ramda/es/max.js"); -/* harmony import */ var _pluck_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./pluck.js */ "./node_modules/ramda/es/pluck.js"); -/* harmony import */ var _reduce_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./reduce.js */ "./node_modules/ramda/es/reduce.js"); -/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./keys.js */ "./node_modules/ramda/es/keys.js"); -/* harmony import */ var _values_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./values.js */ "./node_modules/ramda/es/values.js"); + lastArgs = lastThis = undefined; + lastInvokeTime = time; + result = func.apply(thisArg, args); + return result; + } + function leadingEdge(time) { + // Reset any `maxWait` timer. + lastInvokeTime = time; + // Start the timer for the trailing edge. + timerId = setTimeout(timerExpired, wait); + // Invoke the leading edge. + return leading ? invokeFunc(time) : result; + } + function remainingWait(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime, + timeWaiting = wait - timeSinceLastCall; + return maxing + ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) + : timeWaiting; + } + function shouldInvoke(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime; + // Either this is the first call, activity has stopped and we're at the + // trailing edge, the system time has gone backwards and we're treating + // it as the trailing edge, or we've hit the `maxWait` limit. + return (lastCallTime === undefined || (timeSinceLastCall >= wait) || + (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); + } + function timerExpired() { + var time = now(); + if (shouldInvoke(time)) { + return trailingEdge(time); + } + // Restart the timer. + timerId = setTimeout(timerExpired, remainingWait(time)); + } + function trailingEdge(time) { + timerId = undefined; - // Use custom mapValues function to avoid issues with specs that include a "map" key and R.map -// delegating calls to .map + // Only invoke if we have `lastArgs` which means `func` has been + // debounced at least once. + if (trailing && lastArgs) { + return invokeFunc(time); + } + lastArgs = lastThis = undefined; + return result; + } -function mapValues(fn, obj) { - return (0,_internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(obj) ? obj.map(fn) : (0,_keys_js__WEBPACK_IMPORTED_MODULE_7__["default"])(obj).reduce(function (acc, key) { - acc[key] = fn(obj[key]); - return acc; - }, {}); -} -/** - * Given a spec object recursively mapping properties to functions, creates a - * function producing an object of the same structure, by mapping each property - * to the result of calling its associated function with the supplied arguments. - * - * @func - * @memberOf R - * @since v0.20.0 - * @category Function - * @sig {k: ((a, b, ..., m) -> v)} -> ((a, b, ..., m) -> {k: v}) - * @param {Object} spec an object recursively mapping properties to functions for - * producing the values for these properties. - * @return {Function} A function that returns an object of the same structure - * as `spec', with each property set to the value returned by calling its - * associated function with the supplied arguments. - * @see R.converge, R.juxt - * @example - * - * const getMetrics = R.applySpec({ - * sum: R.add, - * nested: { mul: R.multiply } - * }); - * getMetrics(2, 4); // => { sum: 6, nested: { mul: 8 } } - * @symb R.applySpec({ x: f, y: { z: g } })(a, b) = { x: f(a, b), y: { z: g(a, b) } } - */ + function cancel() { + if (timerId !== undefined) { + clearTimeout(timerId); + } + lastInvokeTime = 0; + lastArgs = lastCallTime = lastThis = timerId = undefined; + } -var applySpec = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function applySpec(spec) { - spec = mapValues(function (v) { - return typeof v == 'function' ? v : applySpec(v); - }, spec); - return (0,_curryN_js__WEBPACK_IMPORTED_MODULE_3__["default"])((0,_reduce_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_max_js__WEBPACK_IMPORTED_MODULE_4__["default"], 0, (0,_pluck_js__WEBPACK_IMPORTED_MODULE_5__["default"])('length', (0,_values_js__WEBPACK_IMPORTED_MODULE_8__["default"])(spec))), function () { - var args = arguments; - return mapValues(function (f) { - return (0,_apply_js__WEBPACK_IMPORTED_MODULE_2__["default"])(f, args); - }, spec); - }); -}); -/* harmony default export */ __webpack_exports__["default"] = (applySpec); + function flush() { + return timerId === undefined ? result : trailingEdge(now()); + } -/***/ }), + function debounced() { + var time = now(), + isInvoking = shouldInvoke(time); -/***/ "./node_modules/ramda/es/applyTo.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/applyTo.js ***! - \******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + lastArgs = arguments; + lastThis = this; + lastCallTime = time; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); + if (isInvoking) { + if (timerId === undefined) { + return leadingEdge(lastCallTime); + } + if (maxing) { + // Handle invocations in a tight loop. + clearTimeout(timerId); + timerId = setTimeout(timerExpired, wait); + return invokeFunc(lastCallTime); + } + } + if (timerId === undefined) { + timerId = setTimeout(timerExpired, wait); + } + return result; + } + debounced.cancel = cancel; + debounced.flush = flush; + return debounced; +} -/** - * Takes a value and applies a function to it. - * - * This function is also known as the `thrush` combinator. - * - * @func - * @memberOf R - * @since v0.25.0 - * @category Function - * @sig a -> (a -> b) -> b - * @param {*} x The value - * @param {Function} f The function to apply - * @return {*} The result of applying `f` to `x` - * @example - * - * const t42 = R.applyTo(42); - * t42(R.identity); //=> 42 - * t42(R.add(1)); //=> 43 - */ +module.exports = debounce; -var applyTo = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function applyTo(x, f) { - return f(x); -}); -/* harmony default export */ __webpack_exports__["default"] = (applyTo); /***/ }), -/***/ "./node_modules/ramda/es/ascend.js": +/***/ "./node_modules/lodash/defaults.js": /*!*****************************************!*\ - !*** ./node_modules/ramda/es/ascend.js ***! + !*** ./node_modules/lodash/defaults.js ***! \*****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); - -/** - * Makes an ascending comparator function out of a function that returns a value - * that can be compared with `<` and `>`. - * - * @func - * @memberOf R - * @since v0.23.0 - * @category Function - * @sig Ord b => (a -> b) -> a -> a -> Number - * @param {Function} fn A function of arity one that returns a value that can be compared - * @param {*} a The first item to be compared. - * @param {*} b The second item to be compared. - * @return {Number} `-1` if fn(a) < fn(b), `1` if fn(b) < fn(a), otherwise `0` - * @see R.descend - * @example - * - * const byAge = R.ascend(R.prop('age')); - * const people = [ - * { name: 'Emma', age: 70 }, - * { name: 'Peter', age: 78 }, - * { name: 'Mikhail', age: 62 }, - * ]; - * const peopleByYoungestFirst = R.sort(byAge, people); - * //=> [{ name: 'Mikhail', age: 62 },{ name: 'Emma', age: 70 }, { name: 'Peter', age: 78 }] - */ - -var ascend = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function ascend(fn, a, b) { - var aa = fn(a); - var bb = fn(b); - return aa < bb ? -1 : aa > bb ? 1 : 0; -}); -/* harmony default export */ __webpack_exports__["default"] = (ascend); - -/***/ }), +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -/***/ "./node_modules/ramda/es/assoc.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/assoc.js ***! - \****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +var baseRest = __webpack_require__(/*! ./_baseRest */ "./node_modules/lodash/_baseRest.js"), + eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"), + isIterateeCall = __webpack_require__(/*! ./_isIterateeCall */ "./node_modules/lodash/_isIterateeCall.js"), + keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js"); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _assocPath_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./assocPath.js */ "./node_modules/ramda/es/assocPath.js"); +/** Used for built-in method references. */ +var objectProto = Object.prototype; +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; /** - * Makes a shallow clone of an object, setting or overriding the specified - * property with the given value. Note that this copies and flattens prototype - * properties onto the new object as well. All non-primitive properties are - * copied by reference. + * Assigns own and inherited enumerable string keyed properties of source + * objects to the destination object for all destination properties that + * resolve to `undefined`. Source objects are applied from left to right. + * Once a property is set, additional values of the same property are ignored. * - * @func - * @memberOf R - * @since v0.8.0 + * **Note:** This method mutates `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ * @category Object - * @typedefn Idx = String | Int - * @sig Idx -> a -> {k: v} -> {k: v} - * @param {String|Number} prop The property name to set - * @param {*} val The new value - * @param {Object} obj The object to clone - * @return {Object} A new object equivalent to the original except for the changed property. - * @see R.dissoc, R.pick + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaultsDeep * @example * - * R.assoc('c', 3, {a: 1, b: 2}); //=> {a: 1, b: 2, c: 3} + * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } */ +var defaults = baseRest(function(object, sources) { + object = Object(object); -var assoc = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function assoc(prop, val, obj) { - return (0,_assocPath_js__WEBPACK_IMPORTED_MODULE_1__["default"])([prop], val, obj); -}); -/* harmony default export */ __webpack_exports__["default"] = (assoc); + var index = -1; + var length = sources.length; + var guard = length > 2 ? sources[2] : undefined; -/***/ }), + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + length = 1; + } -/***/ "./node_modules/ramda/es/assocPath.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/assocPath.js ***! - \********************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + while (++index < length) { + var source = sources[index]; + var props = keysIn(source); + var propsIndex = -1; + var propsLength = props.length; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _internal_has_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_has.js */ "./node_modules/ramda/es/internal/_has.js"); -/* harmony import */ var _internal_isInteger_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_isInteger.js */ "./node_modules/ramda/es/internal/_isInteger.js"); -/* harmony import */ var _internal_assoc_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_assoc.js */ "./node_modules/ramda/es/internal/_assoc.js"); -/* harmony import */ var _isNil_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./isNil.js */ "./node_modules/ramda/es/isNil.js"); + while (++propsIndex < propsLength) { + var key = props[propsIndex]; + var value = object[key]; + if (value === undefined || + (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) { + object[key] = source[key]; + } + } + } + return object; +}); +module.exports = defaults; -/** - * Makes a shallow clone of an object, setting or overriding the nodes required - * to create the given path, and placing the specific value at the tail end of - * that path. Note that this copies and flattens prototype properties onto the - * new object as well. All non-primitive properties are copied by reference. - * - * @func - * @memberOf R - * @since v0.8.0 - * @category Object - * @typedefn Idx = String | Int | Symbol - * @sig [Idx] -> a -> {a} -> {a} - * @param {Array} path the path to set - * @param {*} val The new value - * @param {Object} obj The object to clone - * @return {Object} A new object equivalent to the original except along the specified path. - * @see R.dissocPath - * @example - * - * R.assocPath(['a', 'b', 'c'], 42, {a: {b: {c: 0}}}); //=> {a: {b: {c: 42}}} - * - * // Any missing or non-object keys in path will be overridden - * R.assocPath(['a', 'b', 'c'], 42, {a: 5}); //=> {a: {b: {c: 42}}} - */ +/***/ }), -var assocPath = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function assocPath(path, val, obj) { - if (path.length === 0) { - return val; - } - var idx = path[0]; - if (path.length > 1) { - var nextObj = !(0,_isNil_js__WEBPACK_IMPORTED_MODULE_4__["default"])(obj) && (0,_internal_has_js__WEBPACK_IMPORTED_MODULE_1__["default"])(idx, obj) && typeof obj[idx] === 'object' ? obj[idx] : (0,_internal_isInteger_js__WEBPACK_IMPORTED_MODULE_2__["default"])(path[1]) ? [] : {}; - val = assocPath(Array.prototype.slice.call(path, 1), val, nextObj); - } - return (0,_internal_assoc_js__WEBPACK_IMPORTED_MODULE_3__["default"])(idx, val, obj); -}); -/* harmony default export */ __webpack_exports__["default"] = (assocPath); +/***/ "./node_modules/lodash/each.js": +/*!*************************************!*\ + !*** ./node_modules/lodash/each.js ***! + \*************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -/***/ }), +module.exports = __webpack_require__(/*! ./forEach */ "./node_modules/lodash/forEach.js"); -/***/ "./node_modules/ramda/es/binary.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/binary.js ***! - \*****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _nAry_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./nAry.js */ "./node_modules/ramda/es/nAry.js"); +/***/ }), +/***/ "./node_modules/lodash/eq.js": +/*!***********************************!*\ + !*** ./node_modules/lodash/eq.js ***! + \***********************************/ +/***/ (function(module) { /** - * Wraps a function of any arity (including nullary) in a function that accepts - * exactly 2 parameters. Any extraneous parameters will not be passed to the - * supplied function. + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. * - * @func - * @memberOf R - * @since v0.2.0 - * @category Function - * @sig (a -> b -> c -> ... -> z) -> ((a, b) -> z) - * @param {Function} fn The function to wrap. - * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of - * arity 2. - * @see R.nAry, R.unary + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. * @example * - * const takesThreeArgs = function(a, b, c) { - * return [a, b, c]; - * }; - * takesThreeArgs.length; //=> 3 - * takesThreeArgs(1, 2, 3); //=> [1, 2, 3] + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; * - * const takesTwoArgs = R.binary(takesThreeArgs); - * takesTwoArgs.length; //=> 2 - * // Only 2 arguments are passed to the wrapped function - * takesTwoArgs(1, 2, 3); //=> [1, 2, undefined] - * @symb R.binary(f)(a, b, c) = f(a, b) - */ - -var binary = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function binary(fn) { - return (0,_nAry_js__WEBPACK_IMPORTED_MODULE_1__["default"])(2, fn); -}); -/* harmony default export */ __webpack_exports__["default"] = (binary); - -/***/ }), - -/***/ "./node_modules/ramda/es/bind.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/bind.js ***! - \***************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_arity_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_arity.js */ "./node_modules/ramda/es/internal/_arity.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); - - -/** - * Creates a function that is bound to a context. - * Note: `R.bind` does not provide the additional argument-binding capabilities of - * [Function.prototype.bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind). + * _.eq(object, object); + * // => true * - * @func - * @memberOf R - * @since v0.6.0 - * @category Function - * @category Object - * @sig (* -> *) -> {*} -> (* -> *) - * @param {Function} fn The function to bind to context - * @param {Object} thisObj The context to bind `fn` to - * @return {Function} A function that will execute in the context of `thisObj`. - * @see R.partial - * @example + * _.eq(object, other); + * // => false * - * const log = R.bind(console.log, console); - * R.pipe(R.assoc('a', 2), R.tap(log), R.assoc('a', 3))({a: 1}); //=> {a: 3} - * // logs {a: 2} - * @symb R.bind(f, o)(a, b) = f.call(o, a, b) + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true */ +function eq(value, other) { + return value === other || (value !== value && other !== other); +} + +module.exports = eq; -var bind = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function bind(fn, thisObj) { - return (0,_internal_arity_js__WEBPACK_IMPORTED_MODULE_0__["default"])(fn.length, function () { - return fn.apply(thisObj, arguments); - }); -}); -/* harmony default export */ __webpack_exports__["default"] = (bind); /***/ }), -/***/ "./node_modules/ramda/es/both.js": +/***/ "./node_modules/lodash/filter.js": /*!***************************************!*\ - !*** ./node_modules/ramda/es/both.js ***! + !*** ./node_modules/lodash/filter.js ***! \***************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_isFunction_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isFunction.js */ "./node_modules/ramda/es/internal/_isFunction.js"); -/* harmony import */ var _and_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./and.js */ "./node_modules/ramda/es/and.js"); -/* harmony import */ var _lift_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lift.js */ "./node_modules/ramda/es/lift.js"); - - +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var arrayFilter = __webpack_require__(/*! ./_arrayFilter */ "./node_modules/lodash/_arrayFilter.js"), + baseFilter = __webpack_require__(/*! ./_baseFilter */ "./node_modules/lodash/_baseFilter.js"), + baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), + isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"); /** - * A function which calls the two provided functions and returns the `&&` - * of the results. - * It returns the result of the first function if it is false-y and the result - * of the second function otherwise. Note that this is short-circuited, - * meaning that the second function will not be invoked if the first returns a - * false-y value. + * Iterates over elements of `collection`, returning an array of all elements + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). * - * In addition to functions, `R.both` also accepts any fantasy-land compatible - * applicative functor. + * **Note:** Unlike `_.remove`, this method returns a new array. * - * @func - * @memberOf R - * @since v0.12.0 - * @category Logic - * @sig (*... -> Boolean) -> (*... -> Boolean) -> (*... -> Boolean) - * @param {Function} f A predicate - * @param {Function} g Another predicate - * @return {Function} a function that applies its arguments to `f` and `g` and `&&`s their outputs together. - * @see R.either, R.allPass, R.and + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + * @see _.reject * @example * - * const gt10 = R.gt(R.__, 10) - * const lt20 = R.lt(R.__, 20) - * const f = R.both(gt10, lt20); - * f(15); //=> true - * f(30); //=> false + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * _.filter(users, function(o) { return !o.active; }); + * // => objects for ['fred'] + * + * // The `_.matches` iteratee shorthand. + * _.filter(users, { 'age': 36, 'active': true }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.filter(users, ['active', false]); + * // => objects for ['fred'] + * + * // The `_.property` iteratee shorthand. + * _.filter(users, 'active'); + * // => objects for ['barney'] * - * R.both(Maybe.Just(false), Maybe.Just(55)); // => Maybe.Just(false) - * R.both([false, false, 'a'], [11]); //=> [false, false, 11] + * // Combining several predicates using `_.overEvery` or `_.overSome`. + * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]])); + * // => objects for ['fred', 'barney'] */ +function filter(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, baseIteratee(predicate, 3)); +} + +module.exports = filter; -var both = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function both(f, g) { - return (0,_internal_isFunction_js__WEBPACK_IMPORTED_MODULE_1__["default"])(f) ? function _both() { - return f.apply(this, arguments) && g.apply(this, arguments); - } : (0,_lift_js__WEBPACK_IMPORTED_MODULE_3__["default"])(_and_js__WEBPACK_IMPORTED_MODULE_2__["default"])(f, g); -}); -/* harmony default export */ __webpack_exports__["default"] = (both); /***/ }), -/***/ "./node_modules/ramda/es/call.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/call.js ***! - \***************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/find.js": +/*!*************************************!*\ + !*** ./node_modules/lodash/find.js ***! + \*************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +var createFind = __webpack_require__(/*! ./_createFind */ "./node_modules/lodash/_createFind.js"), + findIndex = __webpack_require__(/*! ./findIndex */ "./node_modules/lodash/findIndex.js"); /** - * Returns the result of calling its first argument with the remaining - * arguments. This is occasionally useful as a converging function for - * [`R.converge`](#converge): the first branch can produce a function while the - * remaining branches produce values to be passed to that function as its - * arguments. + * Iterates over elements of `collection`, returning the first element + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). * - * @func - * @memberOf R - * @since v0.9.0 - * @category Function - * @sig ((*... -> a), *...) -> a - * @param {Function} fn The function to apply to the remaining arguments. - * @param {...*} args Any number of positional arguments. - * @return {*} - * @see R.apply + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {*} Returns the matched element, else `undefined`. * @example * - * R.call(R.add, 1, 2); //=> 3 + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false }, + * { 'user': 'pebbles', 'age': 1, 'active': true } + * ]; + * + * _.find(users, function(o) { return o.age < 40; }); + * // => object for 'barney' * - * const indentN = R.pipe( - * R.repeat(' '), - * R.join(''), - * R.replace(/^(?!$)/gm) - * ); + * // The `_.matches` iteratee shorthand. + * _.find(users, { 'age': 1, 'active': true }); + * // => object for 'pebbles' * - * const format = R.converge( - * R.call, - * [ - * R.pipe(R.prop('indent'), indentN), - * R.prop('value') - * ] - * ); + * // The `_.matchesProperty` iteratee shorthand. + * _.find(users, ['active', false]); + * // => object for 'fred' * - * format({indent: 2, value: 'foo\nbar\nbaz\n'}); //=> ' foo\n bar\n baz\n' - * @symb R.call(f, a, b) = f(a, b) + * // The `_.property` iteratee shorthand. + * _.find(users, 'active'); + * // => object for 'barney' */ +var find = createFind(findIndex); -var call = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function call(fn) { - return fn.apply(this, Array.prototype.slice.call(arguments, 1)); -}); -/* harmony default export */ __webpack_exports__["default"] = (call); - -/***/ }), - -/***/ "./node_modules/ramda/es/chain.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/chain.js ***! - \****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +module.exports = find; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_makeFlat_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_makeFlat.js */ "./node_modules/ramda/es/internal/_makeFlat.js"); -/* harmony import */ var _internal_xchain_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_xchain.js */ "./node_modules/ramda/es/internal/_xchain.js"); -/* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./map.js */ "./node_modules/ramda/es/map.js"); +/***/ }), +/***/ "./node_modules/lodash/findIndex.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/findIndex.js ***! + \******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var baseFindIndex = __webpack_require__(/*! ./_baseFindIndex */ "./node_modules/lodash/_baseFindIndex.js"), + baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), + toInteger = __webpack_require__(/*! ./toInteger */ "./node_modules/lodash/toInteger.js"); +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; /** - * `chain` maps a function over a list and concatenates the results. `chain` - * is also known as `flatMap` in some libraries. + * This method is like `_.find` except that it returns the index of the first + * element `predicate` returns truthy for instead of the element itself. * - * Dispatches to the `chain` method of the second argument, if present, - * according to the [FantasyLand Chain spec](https://github.com/fantasyland/fantasy-land#chain). + * @static + * @memberOf _ + * @since 1.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the found element, else `-1`. + * @example * - * If second argument is a function, `chain(f, g)(x)` is equivalent to `f(g(x), x)`. + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; * - * Acts as a transducer if a transformer is given in list position. + * _.findIndex(users, function(o) { return o.user == 'barney'; }); + * // => 0 * - * @func - * @memberOf R - * @since v0.3.0 - * @category List - * @sig Chain m => (a -> m b) -> m a -> m b - * @param {Function} fn The function to map with - * @param {Array} list The list to map over - * @return {Array} The result of flat-mapping `list` with `fn` - * @example + * // The `_.matches` iteratee shorthand. + * _.findIndex(users, { 'user': 'fred', 'active': false }); + * // => 1 * - * const duplicate = n => [n, n]; - * R.chain(duplicate, [1, 2, 3]); //=> [1, 1, 2, 2, 3, 3] + * // The `_.matchesProperty` iteratee shorthand. + * _.findIndex(users, ['active', false]); + * // => 0 * - * R.chain(R.append, R.head)([1, 2, 3]); //=> [1, 2, 3, 1] + * // The `_.property` iteratee shorthand. + * _.findIndex(users, 'active'); + * // => 2 */ - -var chain = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])(['fantasy-land/chain', 'chain'], _internal_xchain_js__WEBPACK_IMPORTED_MODULE_3__["default"], function chain(fn, monad) { - if (typeof monad === 'function') { - return function (x) { - return fn(monad(x))(x); - }; +function findIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); } - return (0,_internal_makeFlat_js__WEBPACK_IMPORTED_MODULE_2__["default"])(false)((0,_map_js__WEBPACK_IMPORTED_MODULE_4__["default"])(fn, monad)); -})); -/* harmony default export */ __webpack_exports__["default"] = (chain); + return baseFindIndex(array, baseIteratee(predicate, 3), index); +} + +module.exports = findIndex; + /***/ }), -/***/ "./node_modules/ramda/es/clamp.js": +/***/ "./node_modules/lodash/flatten.js": /*!****************************************!*\ - !*** ./node_modules/ramda/es/clamp.js ***! + !*** ./node_modules/lodash/flatten.js ***! \****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); +var baseFlatten = __webpack_require__(/*! ./_baseFlatten */ "./node_modules/lodash/_baseFlatten.js"); /** - * Restricts a number to be within a range. - * - * Also works for other ordered types such as Strings and Dates. + * Flattens `array` a single level deep. * - * @func - * @memberOf R - * @since v0.20.0 - * @category Relation - * @sig Ord a => a -> a -> a -> a - * @param {Number} minimum The lower limit of the clamp (inclusive) - * @param {Number} maximum The upper limit of the clamp (inclusive) - * @param {Number} value Value to be clamped - * @return {Number} Returns `minimum` when `val < minimum`, `maximum` when `val > maximum`, returns `val` otherwise + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. * @example * - * R.clamp(1, 10, -5) // => 1 - * R.clamp(1, 10, 15) // => 10 - * R.clamp(1, 10, 4) // => 4 + * _.flatten([1, [2, [3, [4]], 5]]); + * // => [1, 2, [3, [4]], 5] */ +function flatten(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, 1) : []; +} + +module.exports = flatten; -var clamp = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function clamp(min, max, value) { - if (min > max) { - throw new Error('min must not be greater than max in clamp(min, max, value)'); - } - return value < min ? min : value > max ? max : value; -}); -/* harmony default export */ __webpack_exports__["default"] = (clamp); /***/ }), -/***/ "./node_modules/ramda/es/clone.js": +/***/ "./node_modules/lodash/forEach.js": /*!****************************************!*\ - !*** ./node_modules/ramda/es/clone.js ***! + !*** ./node_modules/lodash/forEach.js ***! \****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_clone_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_clone.js */ "./node_modules/ramda/es/internal/_clone.js"); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var arrayEach = __webpack_require__(/*! ./_arrayEach */ "./node_modules/lodash/_arrayEach.js"), + baseEach = __webpack_require__(/*! ./_baseEach */ "./node_modules/lodash/_baseEach.js"), + castFunction = __webpack_require__(/*! ./_castFunction */ "./node_modules/lodash/_castFunction.js"), + isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"); /** - * Creates a deep copy of the source that can be used in place of the source - * object without retaining any references to it. - * The source object may contain (nested) `Array`s and `Object`s, - * `Number`s, `String`s, `Boolean`s and `Date`s. - * `Function`s are assigned by reference rather than copied. - * - * Dispatches to a `clone` method if present. + * Iterates over elements of `collection` and invokes `iteratee` for each element. + * The iteratee is invoked with three arguments: (value, index|key, collection). + * Iteratee functions may exit iteration early by explicitly returning `false`. * - * Note that if the source object has multiple nodes that share a reference, - * the returned object will have the same structure, but the references will - * be pointed to the location within the cloned value. + * **Note:** As with other "Collections" methods, objects with a "length" + * property are iterated like arrays. To avoid this behavior use `_.forIn` + * or `_.forOwn` for object iteration. * - * @func - * @memberOf R - * @since v0.1.0 - * @category Object - * @sig {*} -> {*} - * @param {*} value The object or array to clone - * @return {*} A deeply cloned copy of `val` + * @static + * @memberOf _ + * @since 0.1.0 + * @alias each + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEachRight * @example * - * const objects = [{}, {}, {}]; - * const objectsClone = R.clone(objects); - * objects === objectsClone; //=> false - * objects[0] === objectsClone[0]; //=> false + * _.forEach([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `1` then `2`. + * + * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). */ +function forEach(collection, iteratee) { + var func = isArray(collection) ? arrayEach : baseEach; + return func(collection, castFunction(iteratee)); +} -var clone = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function clone(value) { - return value != null && typeof value.clone === 'function' ? value.clone() : (0,_internal_clone_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value, true); -}); -/* harmony default export */ __webpack_exports__["default"] = (clone); +module.exports = forEach; -/***/ }), -/***/ "./node_modules/ramda/es/collectBy.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/collectBy.js ***! - \********************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ }), -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_reduce_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_reduce.js */ "./node_modules/ramda/es/internal/_reduce.js"); +/***/ "./node_modules/lodash/forIn.js": +/*!**************************************!*\ + !*** ./node_modules/lodash/forIn.js ***! + \**************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var baseFor = __webpack_require__(/*! ./_baseFor */ "./node_modules/lodash/_baseFor.js"), + castFunction = __webpack_require__(/*! ./_castFunction */ "./node_modules/lodash/_castFunction.js"), + keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js"); /** - * Splits a list into sub-lists, based on the result of calling a key-returning function on each element, - * and grouping the results according to values returned. + * Iterates over own and inherited enumerable string keyed properties of an + * object and invokes `iteratee` for each property. The iteratee is invoked + * with three arguments: (value, key, object). Iteratee functions may exit + * iteration early by explicitly returning `false`. * - * @func - * @memberOf R - * @since v0.28.0 - * @category List - * @typedefn Idx = String | Int | Symbol - * @sig Idx a => (b -> a) -> [b] -> [[b]] - * @param {Function} fn Function :: a -> Idx - * @param {Array} list The array to group - * @return {Array} - * An array of arrays where each sub-array contains items for which - * the String-returning function has returned the same value. - * @see R.groupBy, R.partition + * @static + * @memberOf _ + * @since 0.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forInRight * @example - * R.collectBy(R.prop('type'), [ - * {type: 'breakfast', item: '☕️'}, - * {type: 'lunch', item: '🌯'}, - * {type: 'dinner', item: '🍝'}, - * {type: 'breakfast', item: '🥐'}, - * {type: 'lunch', item: '🍕'} - * ]); - * - * // [ [ {type: 'breakfast', item: '☕️'}, - * // {type: 'breakfast', item: '🥐'} ], - * // [ {type: 'lunch', item: '🌯'}, - * // {type: 'lunch', item: '🍕'} ], - * // [ {type: 'dinner', item: '🍝'} ] ] - */ - -var collectBy = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function collectBy(fn, list) { - var group = (0,_internal_reduce_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (o, x) { - var tag = fn(x); - if (o[tag] === undefined) { - o[tag] = []; - } - o[tag].push(x); - return o; - }, {}, list); - var newList = []; - for (var tag in group) { - newList.push(group[tag]); - } - return newList; -}); -/* harmony default export */ __webpack_exports__["default"] = (collectBy); + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forIn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed). + */ +function forIn(object, iteratee) { + return object == null + ? object + : baseFor(object, castFunction(iteratee), keysIn); +} + +module.exports = forIn; + /***/ }), -/***/ "./node_modules/ramda/es/comparator.js": -/*!*********************************************!*\ - !*** ./node_modules/ramda/es/comparator.js ***! - \*********************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/get.js": +/*!************************************!*\ + !*** ./node_modules/lodash/get.js ***! + \************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +var baseGet = __webpack_require__(/*! ./_baseGet */ "./node_modules/lodash/_baseGet.js"); /** - * Makes a comparator function out of a function that reports whether the first - * element is less than the second. + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig ((a, b) -> Boolean) -> ((a, b) -> Number) - * @param {Function} pred A predicate function of arity two which will return `true` if the first argument - * is less than the second, `false` otherwise - * @return {Function} A Function :: a -> b -> Int that returns `-1` if a < b, `1` if b < a, otherwise `0` + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. * @example * - * const byAge = R.comparator((a, b) => a.age < b.age); - * const people = [ - * { name: 'Emma', age: 70 }, - * { name: 'Peter', age: 78 }, - * { name: 'Mikhail', age: 62 }, - * ]; - * const peopleByIncreasingAge = R.sort(byAge, people); - * //=> [{ name: 'Mikhail', age: 62 },{ name: 'Emma', age: 70 }, { name: 'Peter', age: 78 }] + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' */ +function get(object, path, defaultValue) { + var result = object == null ? undefined : baseGet(object, path); + return result === undefined ? defaultValue : result; +} -var comparator = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function comparator(pred) { - return function (a, b) { - return pred(a, b) ? -1 : pred(b, a) ? 1 : 0; - }; -}); -/* harmony default export */ __webpack_exports__["default"] = (comparator); +module.exports = get; -/***/ }), -/***/ "./node_modules/ramda/es/complement.js": -/*!*********************************************!*\ - !*** ./node_modules/ramda/es/complement.js ***! - \*********************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ }), -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _lift_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lift.js */ "./node_modules/ramda/es/lift.js"); -/* harmony import */ var _not_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./not.js */ "./node_modules/ramda/es/not.js"); +/***/ "./node_modules/lodash/has.js": +/*!************************************!*\ + !*** ./node_modules/lodash/has.js ***! + \************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var baseHas = __webpack_require__(/*! ./_baseHas */ "./node_modules/lodash/_baseHas.js"), + hasPath = __webpack_require__(/*! ./_hasPath */ "./node_modules/lodash/_hasPath.js"); /** - * Takes a function `f` and returns a function `g` such that if called with the same arguments - * when `f` returns a "truthy" value, `g` returns `false` and when `f` returns a "falsy" value `g` returns `true`. - * - * `R.complement` may be applied to any functor + * Checks if `path` is a direct property of `object`. * - * @func - * @memberOf R - * @since v0.12.0 - * @category Logic - * @sig (*... -> *) -> (*... -> Boolean) - * @param {Function} f - * @return {Function} - * @see R.not + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. * @example * - * const isNotNil = R.complement(R.isNil); - * R.isNil(null); //=> true - * isNotNil(null); //=> false - * R.isNil(7); //=> false - * isNotNil(7); //=> true + * var object = { 'a': { 'b': 2 } }; + * var other = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.has(object, 'a'); + * // => true + * + * _.has(object, 'a.b'); + * // => true + * + * _.has(object, ['a', 'b']); + * // => true + * + * _.has(other, 'a'); + * // => false */ +function has(object, path) { + return object != null && hasPath(object, path, baseHas); +} -var complement = /*#__PURE__*/ -(0,_lift_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_not_js__WEBPACK_IMPORTED_MODULE_1__["default"]); -/* harmony default export */ __webpack_exports__["default"] = (complement); +module.exports = has; -/***/ }), -/***/ "./node_modules/ramda/es/compose.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/compose.js ***! - \******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ }), -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ compose; } -/* harmony export */ }); -/* harmony import */ var _pipe_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pipe.js */ "./node_modules/ramda/es/pipe.js"); -/* harmony import */ var _reverse_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./reverse.js */ "./node_modules/ramda/es/reverse.js"); +/***/ "./node_modules/lodash/hasIn.js": +/*!**************************************!*\ + !*** ./node_modules/lodash/hasIn.js ***! + \**************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var baseHasIn = __webpack_require__(/*! ./_baseHasIn */ "./node_modules/lodash/_baseHasIn.js"), + hasPath = __webpack_require__(/*! ./_hasPath */ "./node_modules/lodash/_hasPath.js"); /** - * Performs right-to-left function composition. The last argument may have - * any arity; the remaining arguments must be unary. - * - * **Note:** The result of compose is not automatically curried. + * Checks if `path` is a direct or inherited property of `object`. * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig ((y -> z), (x -> y), ..., (o -> p), ((a, b, ..., n) -> o)) -> ((a, b, ..., n) -> z) - * @param {...Function} ...functions The functions to compose - * @return {Function} - * @see R.pipe + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. * @example * - * const classyGreeting = (firstName, lastName) => "The name's " + lastName + ", " + firstName + " " + lastName - * const yellGreeting = R.compose(R.toUpper, classyGreeting); - * yellGreeting('James', 'Bond'); //=> "THE NAME'S BOND, JAMES BOND" + * var object = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.hasIn(object, 'a'); + * // => true * - * R.compose(Math.abs, R.add(1), R.multiply(2))(-4) //=> 7 + * _.hasIn(object, 'a.b'); + * // => true + * + * _.hasIn(object, ['a', 'b']); + * // => true * - * @symb R.compose(f, g, h)(a, b) = f(g(h(a, b))) - * @symb R.compose(f, g, h)(a)(b) = f(g(h(a)))(b) + * _.hasIn(object, 'b'); + * // => false */ - -function compose() { - if (arguments.length === 0) { - throw new Error('compose requires at least one argument'); - } - return _pipe_js__WEBPACK_IMPORTED_MODULE_0__["default"].apply(this, (0,_reverse_js__WEBPACK_IMPORTED_MODULE_1__["default"])(arguments)); +function hasIn(object, path) { + return object != null && hasPath(object, path, baseHasIn); } -/***/ }), - -/***/ "./node_modules/ramda/es/composeWith.js": -/*!**********************************************!*\ - !*** ./node_modules/ramda/es/composeWith.js ***! - \**********************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +module.exports = hasIn; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _pipeWith_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pipeWith.js */ "./node_modules/ramda/es/pipeWith.js"); -/* harmony import */ var _reverse_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./reverse.js */ "./node_modules/ramda/es/reverse.js"); +/***/ }), +/***/ "./node_modules/lodash/identity.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/identity.js ***! + \*****************************************/ +/***/ (function(module) { /** - * Performs right-to-left function composition using transforming function. The last function may have - * any arity; the remaining functions must be unary. Unlike `compose`, functions are passed in an array. - * - * **Note:** The result of composeWith is not automatically curried. Transforming function is not used - * on the last argument. + * This method returns the first argument it receives. * - * @func - * @memberOf R - * @since v0.26.0 - * @category Function - * @sig ((* -> *), [(y -> z), (x -> y), ..., (o -> p), ((a, b, ..., n) -> o)]) -> ((a, b, ..., n) -> z) - * @param {Function} transformer The transforming function - * @param {Array} functions The functions to compose - * @return {Function} - * @see R.compose, R.pipeWith + * @static + * @since 0.1.0 + * @memberOf _ + * @category Util + * @param {*} value Any value. + * @returns {*} Returns `value`. * @example * - * const composeWhileNotNil = R.composeWith((f, res) => R.isNil(res) ? res : f(res)); - * - * composeWhileNotNil([R.inc, R.prop('age')])({age: 1}) //=> 2 - * composeWhileNotNil([R.inc, R.prop('age')])({}) //=> undefined + * var object = { 'a': 1 }; * - * @symb R.composeWith(f)([g, h, i])(...args) = f(g, f(h, i(...args))) + * console.log(_.identity(object) === object); + * // => true */ +function identity(value) { + return value; +} -var composeWith = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function composeWith(xf, list) { - return _pipeWith_js__WEBPACK_IMPORTED_MODULE_1__["default"].apply(this, [xf, (0,_reverse_js__WEBPACK_IMPORTED_MODULE_2__["default"])(list)]); -}); -/* harmony default export */ __webpack_exports__["default"] = (composeWith); +module.exports = identity; -/***/ }), -/***/ "./node_modules/ramda/es/concat.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/concat.js ***! - \*****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ }), -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); -/* harmony import */ var _internal_isFunction_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_isFunction.js */ "./node_modules/ramda/es/internal/_isFunction.js"); -/* harmony import */ var _internal_isString_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_isString.js */ "./node_modules/ramda/es/internal/_isString.js"); -/* harmony import */ var _toString_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./toString.js */ "./node_modules/ramda/es/toString.js"); +/***/ "./node_modules/lodash/isArguments.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/isArguments.js ***! + \********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var baseIsArguments = __webpack_require__(/*! ./_baseIsArguments */ "./node_modules/lodash/_baseIsArguments.js"), + isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); +/** Used for built-in method references. */ +var objectProto = Object.prototype; +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; +/** Built-in value references. */ +var propertyIsEnumerable = objectProto.propertyIsEnumerable; /** - * Returns the result of concatenating the given lists or strings. - * - * Note: `R.concat` expects both arguments to be of the same type, - * unlike the native `Array.prototype.concat` method. It will throw - * an error if you `concat` an Array with a non-Array value. - * - * Dispatches to the `concat` method of the first argument, if present. - * Can also concatenate two members of a [fantasy-land - * compatible semigroup](https://github.com/fantasyland/fantasy-land#semigroup). - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig [a] -> [a] -> [a] - * @sig String -> String -> String - * @param {Array|String} firstList The first list - * @param {Array|String} secondList The second list - * @return {Array|String} A list consisting of the elements of `firstList` followed by the elements of - * `secondList`. + * Checks if `value` is likely an `arguments` object. * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. * @example * - * R.concat('ABC', 'DEF'); // 'ABCDEF' - * R.concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3] - * R.concat([], []); //=> [] + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false */ +var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { + return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && + !propertyIsEnumerable.call(value, 'callee'); +}; -var concat = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function concat(a, b) { - if ((0,_internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(a)) { - if ((0,_internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(b)) { - return a.concat(b); - } - throw new TypeError((0,_toString_js__WEBPACK_IMPORTED_MODULE_4__["default"])(b) + ' is not an array'); - } - if ((0,_internal_isString_js__WEBPACK_IMPORTED_MODULE_3__["default"])(a)) { - if ((0,_internal_isString_js__WEBPACK_IMPORTED_MODULE_3__["default"])(b)) { - return a + b; - } - throw new TypeError((0,_toString_js__WEBPACK_IMPORTED_MODULE_4__["default"])(b) + ' is not a string'); - } - if (a != null && (0,_internal_isFunction_js__WEBPACK_IMPORTED_MODULE_2__["default"])(a['fantasy-land/concat'])) { - return a['fantasy-land/concat'](b); - } - if (a != null && (0,_internal_isFunction_js__WEBPACK_IMPORTED_MODULE_2__["default"])(a.concat)) { - return a.concat(b); - } - throw new TypeError((0,_toString_js__WEBPACK_IMPORTED_MODULE_4__["default"])(a) + ' does not have a method named "concat" or "fantasy-land/concat"'); -}); -/* harmony default export */ __webpack_exports__["default"] = (concat); - -/***/ }), - -/***/ "./node_modules/ramda/es/cond.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/cond.js ***! - \***************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_arity_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_arity.js */ "./node_modules/ramda/es/internal/_arity.js"); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./map.js */ "./node_modules/ramda/es/map.js"); -/* harmony import */ var _max_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./max.js */ "./node_modules/ramda/es/max.js"); -/* harmony import */ var _reduce_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./reduce.js */ "./node_modules/ramda/es/reduce.js"); - +module.exports = isArguments; +/***/ }), +/***/ "./node_modules/lodash/isArray.js": +/*!****************************************!*\ + !*** ./node_modules/lodash/isArray.js ***! + \****************************************/ +/***/ (function(module) { /** - * Returns a function, `fn`, which encapsulates `if/else, if/else, ...` logic. - * `R.cond` takes a list of [predicate, transformer] pairs. All of the arguments - * to `fn` are applied to each of the predicates in turn until one returns a - * "truthy" value, at which point `fn` returns the result of applying its - * arguments to the corresponding transformer. If none of the predicates - * matches, `fn` returns undefined. - * - * **Please note**: This is not a direct substitute for a `switch` statement. - * Remember that both elements of every pair passed to `cond` are *functions*, - * and `cond` returns a function. + * Checks if `value` is classified as an `Array` object. * - * @func - * @memberOf R - * @since v0.6.0 - * @category Logic - * @sig [[(*... -> Boolean),(*... -> *)]] -> (*... -> *) - * @param {Array} pairs A list of [predicate, transformer] - * @return {Function} - * @see R.ifElse, R.unless, R.when + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. * @example * - * const fn = R.cond([ - * [R.equals(0), R.always('water freezes at 0°C')], - * [R.equals(100), R.always('water boils at 100°C')], - * [R.T, temp => 'nothing special happens at ' + temp + '°C'] - * ]); - * fn(0); //=> 'water freezes at 0°C' - * fn(50); //=> 'nothing special happens at 50°C' - * fn(100); //=> 'water boils at 100°C' - */ - -var cond = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function cond(pairs) { - var arity = (0,_reduce_js__WEBPACK_IMPORTED_MODULE_4__["default"])(_max_js__WEBPACK_IMPORTED_MODULE_3__["default"], 0, (0,_map_js__WEBPACK_IMPORTED_MODULE_2__["default"])(function (pair) { - return pair[0].length; - }, pairs)); - return (0,_internal_arity_js__WEBPACK_IMPORTED_MODULE_0__["default"])(arity, function () { - var idx = 0; - while (idx < pairs.length) { - if (pairs[idx][0].apply(this, arguments)) { - return pairs[idx][1].apply(this, arguments); - } - idx += 1; - } - }); -}); -/* harmony default export */ __webpack_exports__["default"] = (cond); + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ +var isArray = Array.isArray; + +module.exports = isArray; + /***/ }), -/***/ "./node_modules/ramda/es/construct.js": +/***/ "./node_modules/lodash/isArrayLike.js": /*!********************************************!*\ - !*** ./node_modules/ramda/es/construct.js ***! + !*** ./node_modules/lodash/isArrayLike.js ***! \********************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _constructN_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constructN.js */ "./node_modules/ramda/es/constructN.js"); +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var isFunction = __webpack_require__(/*! ./isFunction */ "./node_modules/lodash/isFunction.js"), + isLength = __webpack_require__(/*! ./isLength */ "./node_modules/lodash/isLength.js"); /** - * Wraps a constructor function inside a curried function that can be called - * with the same arguments and returns the same type. + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig (* -> {*}) -> (* -> {*}) - * @param {Function} fn The constructor function to wrap. - * @return {Function} A wrapped, curried constructor function. - * @see R.invoker + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. * @example * - * // Constructor function - * function Animal(kind) { - * this.kind = kind; - * }; - * Animal.prototype.sighting = function() { - * return "It's a " + this.kind + "!"; - * } + * _.isArrayLike([1, 2, 3]); + * // => true * - * const AnimalConstructor = R.construct(Animal) + * _.isArrayLike(document.body.children); + * // => true * - * // Notice we no longer need the 'new' keyword: - * AnimalConstructor('Pig'); //=> {"kind": "Pig", "sighting": function (){...}}; + * _.isArrayLike('abc'); + * // => true * - * const animalTypes = ["Lion", "Tiger", "Bear"]; - * const animalSighting = R.invoker(0, 'sighting'); - * const sightNewAnimal = R.compose(animalSighting, AnimalConstructor); - * R.map(sightNewAnimal, animalTypes); //=> ["It's a Lion!", "It's a Tiger!", "It's a Bear!"] + * _.isArrayLike(_.noop); + * // => false */ +function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); +} -var construct = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function construct(Fn) { - return (0,_constructN_js__WEBPACK_IMPORTED_MODULE_1__["default"])(Fn.length, Fn); -}); -/* harmony default export */ __webpack_exports__["default"] = (construct); - -/***/ }), +module.exports = isArrayLike; -/***/ "./node_modules/ramda/es/constructN.js": -/*!*********************************************!*\ - !*** ./node_modules/ramda/es/constructN.js ***! - \*********************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _curry_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./curry.js */ "./node_modules/ramda/es/curry.js"); -/* harmony import */ var _nAry_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./nAry.js */ "./node_modules/ramda/es/nAry.js"); +/***/ }), +/***/ "./node_modules/lodash/isArrayLikeObject.js": +/*!**************************************************!*\ + !*** ./node_modules/lodash/isArrayLikeObject.js ***! + \**************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"), + isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); /** - * Wraps a constructor function inside a curried function that can be called - * with the same arguments and returns the same type. The arity of the function - * returned is specified to allow using variadic constructor functions. + * This method is like `_.isArrayLike` except that it also checks if `value` + * is an object. * - * @func - * @memberOf R - * @since v0.4.0 - * @category Function - * @sig Number -> (* -> {*}) -> (* -> {*}) - * @param {Number} n The arity of the constructor function. - * @param {Function} Fn The constructor function to wrap. - * @return {Function} A wrapped, curried constructor function. + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array-like object, + * else `false`. * @example * - * // Variadic Constructor function - * function Salad() { - * this.ingredients = arguments; - * } - * - * Salad.prototype.recipe = function() { - * const instructions = R.map(ingredient => 'Add a dollop of ' + ingredient, this.ingredients); - * return R.join('\n', instructions); - * }; + * _.isArrayLikeObject([1, 2, 3]); + * // => true * - * const ThreeLayerSalad = R.constructN(3, Salad); + * _.isArrayLikeObject(document.body.children); + * // => true * - * // Notice we no longer need the 'new' keyword, and the constructor is curried for 3 arguments. - * const salad = ThreeLayerSalad('Mayonnaise')('Potato Chips')('Ketchup'); + * _.isArrayLikeObject('abc'); + * // => false * - * console.log(salad.recipe()); - * // Add a dollop of Mayonnaise - * // Add a dollop of Potato Chips - * // Add a dollop of Ketchup + * _.isArrayLikeObject(_.noop); + * // => false */ +function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); +} + +module.exports = isArrayLikeObject; -var constructN = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function constructN(n, Fn) { - if (n > 10) { - throw new Error('Constructor with greater than ten arguments'); - } - if (n === 0) { - return function () { - return new Fn(); - }; - } - return (0,_curry_js__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_nAry_js__WEBPACK_IMPORTED_MODULE_2__["default"])(n, function ($0, $1, $2, $3, $4, $5, $6, $7, $8, $9) { - switch (n) { - case 1: - return new Fn($0); - case 2: - return new Fn($0, $1); - case 3: - return new Fn($0, $1, $2); - case 4: - return new Fn($0, $1, $2, $3); - case 5: - return new Fn($0, $1, $2, $3, $4); - case 6: - return new Fn($0, $1, $2, $3, $4, $5); - case 7: - return new Fn($0, $1, $2, $3, $4, $5, $6); - case 8: - return new Fn($0, $1, $2, $3, $4, $5, $6, $7); - case 9: - return new Fn($0, $1, $2, $3, $4, $5, $6, $7, $8); - case 10: - return new Fn($0, $1, $2, $3, $4, $5, $6, $7, $8, $9); - } - })); -}); -/* harmony default export */ __webpack_exports__["default"] = (constructN); /***/ }), -/***/ "./node_modules/ramda/es/converge.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/converge.js ***! - \*******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/isBuffer.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/isBuffer.js ***! + \*****************************************/ +/***/ (function(module, exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_map_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_map.js */ "./node_modules/ramda/es/internal/_map.js"); -/* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./curryN.js */ "./node_modules/ramda/es/curryN.js"); -/* harmony import */ var _max_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./max.js */ "./node_modules/ramda/es/max.js"); -/* harmony import */ var _pluck_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pluck.js */ "./node_modules/ramda/es/pluck.js"); -/* harmony import */ var _reduce_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./reduce.js */ "./node_modules/ramda/es/reduce.js"); +/* module decorator */ module = __webpack_require__.nmd(module); +var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"), + stubFalse = __webpack_require__(/*! ./stubFalse */ "./node_modules/lodash/stubFalse.js"); +/** Detect free variable `exports`. */ +var freeExports = true && exports && !exports.nodeType && exports; +/** Detect free variable `module`. */ +var freeModule = freeExports && "object" == 'object' && module && !module.nodeType && module; +/** Detect the popular CommonJS extension `module.exports`. */ +var moduleExports = freeModule && freeModule.exports === freeExports; +/** Built-in value references. */ +var Buffer = moduleExports ? root.Buffer : undefined; +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined; /** - * Accepts a converging function and a list of branching functions and returns - * a new function. The arity of the new function is the same as the arity of - * the longest branching function. When invoked, this new function is applied - * to some arguments, and each branching function is applied to those same - * arguments. The results of each branching function are passed as arguments - * to the converging function to produce the return value. + * Checks if `value` is a buffer. * - * @func - * @memberOf R - * @since v0.4.2 - * @category Function - * @sig ((x1, x2, ...) -> z) -> [((a, b, ...) -> x1), ((a, b, ...) -> x2), ...] -> (a -> b -> ... -> z) - * @param {Function} after A function. `after` will be invoked with the return values of - * `fn1` and `fn2` as its arguments. - * @param {Array} functions A list of functions. - * @return {Function} A new function. - * @see R.useWith + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. * @example * - * const average = R.converge(R.divide, [R.sum, R.length]) - * average([1, 2, 3, 4, 5, 6, 7]) //=> 4 - * - * const strangeConcat = R.converge(R.concat, [R.toUpper, R.toLower]) - * strangeConcat("Yodel") //=> "YODELyodel" + * _.isBuffer(new Buffer(2)); + * // => true * - * @symb R.converge(f, [g, h])(a, b) = f(g(a, b), h(a, b)) + * _.isBuffer(new Uint8Array(2)); + * // => false */ +var isBuffer = nativeIsBuffer || stubFalse; + +module.exports = isBuffer; -var converge = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function converge(after, fns) { - return (0,_curryN_js__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_reduce_js__WEBPACK_IMPORTED_MODULE_5__["default"])(_max_js__WEBPACK_IMPORTED_MODULE_3__["default"], 0, (0,_pluck_js__WEBPACK_IMPORTED_MODULE_4__["default"])('length', fns)), function () { - var args = arguments; - var context = this; - return after.apply(context, (0,_internal_map_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (fn) { - return fn.apply(context, args); - }, fns)); - }); -}); -/* harmony default export */ __webpack_exports__["default"] = (converge); /***/ }), -/***/ "./node_modules/ramda/es/count.js": +/***/ "./node_modules/lodash/isEmpty.js": /*!****************************************!*\ - !*** ./node_modules/ramda/es/count.js ***! + !*** ./node_modules/lodash/isEmpty.js ***! \****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_reduce_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_reduce.js */ "./node_modules/ramda/es/internal/_reduce.js"); -/* harmony import */ var _curry_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./curry.js */ "./node_modules/ramda/es/curry.js"); - - -/** - * Returns the number of items in a given `list` matching the predicate `f` - * - * @func - * @memberOf R - * @since v0.28.0 - * @category List - * @sig (a -> Boolean) -> [a] -> Number - * @param {Function} predicate to match items against - * @return {Array} list of items to count in - * @example - * - * const even = x => x % 2 == 0; - * - * R.count(even, [1, 2, 3, 4, 5]); // => 2 - * R.map(R.count(even), [[1, 1, 1], [2, 3, 4, 5], [6]]); // => [0, 2, 1] - */ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -var count = /*#__PURE__*/ -(0,_curry_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (pred, list) { - return (0,_internal_reduce_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (a, e) { - return pred(e) ? a + 1 : a; - }, 0, list); -}); -/* harmony default export */ __webpack_exports__["default"] = (count); +var baseKeys = __webpack_require__(/*! ./_baseKeys */ "./node_modules/lodash/_baseKeys.js"), + getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"), + isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"), + isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), + isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"), + isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"), + isPrototype = __webpack_require__(/*! ./_isPrototype */ "./node_modules/lodash/_isPrototype.js"), + isTypedArray = __webpack_require__(/*! ./isTypedArray */ "./node_modules/lodash/isTypedArray.js"); -/***/ }), +/** `Object#toString` result references. */ +var mapTag = '[object Map]', + setTag = '[object Set]'; -/***/ "./node_modules/ramda/es/countBy.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/countBy.js ***! - \******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/** Used for built-in method references. */ +var objectProto = Object.prototype; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _reduceBy_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./reduceBy.js */ "./node_modules/ramda/es/reduceBy.js"); +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; /** - * Counts the elements of a list according to how many match each value of a - * key generated by the supplied function. Returns an object mapping the keys - * produced by `fn` to the number of occurrences in the list. Note that all - * keys are coerced to strings because of how JavaScript objects work. + * Checks if `value` is an empty object, collection, map, or set. * - * Acts as a transducer if a transformer is given in list position. + * Objects are considered empty if they have no own enumerable string keyed + * properties. * - * @func - * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig (a -> String) -> [a] -> {*} - * @param {Function} fn The function used to map values to keys. - * @param {Array} list The list to count elements from. - * @return {Object} An object mapping keys to number of occurrences in the list. + * Array-like values such as `arguments` objects, arrays, buffers, strings, or + * jQuery-like collections are considered empty if they have a `length` of `0`. + * Similarly, maps and sets are considered empty if they have a `size` of `0`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is empty, else `false`. * @example * - * const numbers = [1.0, 1.1, 1.2, 2.0, 3.0, 2.2]; - * R.countBy(Math.floor)(numbers); //=> {'1': 3, '2': 2, '3': 1} + * _.isEmpty(null); + * // => true + * + * _.isEmpty(true); + * // => true + * + * _.isEmpty(1); + * // => true + * + * _.isEmpty([1, 2, 3]); + * // => false * - * const letters = ['a', 'b', 'A', 'a', 'B', 'c']; - * R.countBy(R.toLower)(letters); //=> {'a': 3, 'b': 2, 'c': 1} + * _.isEmpty({ 'a': 1 }); + * // => false */ +function isEmpty(value) { + if (value == null) { + return true; + } + if (isArrayLike(value) && + (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' || + isBuffer(value) || isTypedArray(value) || isArguments(value))) { + return !value.length; + } + var tag = getTag(value); + if (tag == mapTag || tag == setTag) { + return !value.size; + } + if (isPrototype(value)) { + return !baseKeys(value).length; + } + for (var key in value) { + if (hasOwnProperty.call(value, key)) { + return false; + } + } + return true; +} + +module.exports = isEmpty; -var countBy = /*#__PURE__*/ -(0,_reduceBy_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (acc, elem) { - return acc + 1; -}, 0); -/* harmony default export */ __webpack_exports__["default"] = (countBy); /***/ }), -/***/ "./node_modules/ramda/es/curry.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/curry.js ***! - \****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/isFunction.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash/isFunction.js ***! + \*******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./curryN.js */ "./node_modules/ramda/es/curryN.js"); +var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), + isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"); +/** `Object#toString` result references. */ +var asyncTag = '[object AsyncFunction]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + proxyTag = '[object Proxy]'; /** - * Returns a curried equivalent of the provided function. The curried function - * has two unusual capabilities. First, its arguments needn't be provided one - * at a time. If `f` is a ternary function and `g` is `R.curry(f)`, the - * following are equivalent: - * - * - `g(1)(2)(3)` - * - `g(1)(2, 3)` - * - `g(1, 2)(3)` - * - `g(1, 2, 3)` - * - * Secondly, the special placeholder value [`R.__`](#__) may be used to specify - * "gaps", allowing partial application of any combination of arguments, - * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__), - * the following are equivalent: - * - * - `g(1, 2, 3)` - * - `g(_, 2, 3)(1)` - * - `g(_, _, 3)(1)(2)` - * - `g(_, _, 3)(1, 2)` - * - `g(_, 2)(1)(3)` - * - `g(_, 2)(1, 3)` - * - `g(_, 2)(_, 3)(1)` - * - * Please note that default parameters don't count towards a [function arity](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/length) - * and therefore `curry` won't work well with those: - * - * ``` - * const h = R.curry((a, b, c = 2) => a + b + c); - * - * h(40); - * //=> function (waits for `b`) - * - * h(39)(1); - * //=> 42 - * - * h(1)(2, 3); - * //=> 6 - * - * h(1)(2)(7); - * //=> Error! (`3` is not a function!) - * ``` + * Checks if `value` is classified as a `Function` object. * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig (* -> a) -> (* -> a) - * @param {Function} fn The function to curry. - * @return {Function} A new, curried function. - * @see R.curryN, R.partial + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * - * const addFourNumbers = (a, b, c, d) => a + b + c + d; + * _.isFunction(_); + * // => true * - * const curriedAddFourNumbers = R.curry(addFourNumbers); - * const f = curriedAddFourNumbers(1, 2); - * const g = f(3); - * g(4); //=> 10 + * _.isFunction(/abc/); + * // => false */ +function isFunction(value) { + if (!isObject(value)) { + return false; + } + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 9 which returns 'object' for typed arrays and other constructors. + var tag = baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; +} + +module.exports = isFunction; -var curry = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function curry(fn) { - return (0,_curryN_js__WEBPACK_IMPORTED_MODULE_1__["default"])(fn.length, fn); -}); -/* harmony default export */ __webpack_exports__["default"] = (curry); /***/ }), -/***/ "./node_modules/ramda/es/curryN.js": +/***/ "./node_modules/lodash/isLength.js": /*!*****************************************!*\ - !*** ./node_modules/ramda/es/curryN.js ***! + !*** ./node_modules/lodash/isLength.js ***! \*****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_arity_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_arity.js */ "./node_modules/ramda/es/internal/_arity.js"); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_curryN_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_curryN.js */ "./node_modules/ramda/es/internal/_curryN.js"); - - +/***/ (function(module) { +/** Used as references for various `Number` constants. */ +var MAX_SAFE_INTEGER = 9007199254740991; /** - * Returns a curried equivalent of the provided function, with the specified - * arity. The curried function has two unusual capabilities. First, its - * arguments needn't be provided one at a time. If `g` is `R.curryN(3, f)`, the - * following are equivalent: + * Checks if `value` is a valid array-like length. * - * - `g(1)(2)(3)` - * - `g(1)(2, 3)` - * - `g(1, 2)(3)` - * - `g(1, 2, 3)` + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). * - * Secondly, the special placeholder value [`R.__`](#__) may be used to specify - * "gaps", allowing partial application of any combination of arguments, - * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__), - * the following are equivalent: + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example * - * - `g(1, 2, 3)` - * - `g(_, 2, 3)(1)` - * - `g(_, _, 3)(1)(2)` - * - `g(_, _, 3)(1, 2)` - * - `g(_, 2)(1)(3)` - * - `g(_, 2)(1, 3)` - * - `g(_, 2)(_, 3)(1)` + * _.isLength(3); + * // => true * - * @func - * @memberOf R - * @since v0.5.0 - * @category Function - * @sig Number -> (* -> a) -> (* -> a) - * @param {Number} length The arity for the returned function. - * @param {Function} fn The function to curry. - * @return {Function} A new, curried function. - * @see R.curry - * @example + * _.isLength(Number.MIN_VALUE); + * // => false * - * const sumArgs = (...args) => R.sum(args); + * _.isLength(Infinity); + * // => false * - * const curriedAddFourNumbers = R.curryN(4, sumArgs); - * const f = curriedAddFourNumbers(1, 2); - * const g = f(3); - * g(4); //=> 10 + * _.isLength('3'); + * // => false */ +function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} + +module.exports = isLength; -var curryN = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_2__["default"])(function curryN(length, fn) { - if (length === 1) { - return (0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__["default"])(fn); - } - return (0,_internal_arity_js__WEBPACK_IMPORTED_MODULE_0__["default"])(length, (0,_internal_curryN_js__WEBPACK_IMPORTED_MODULE_3__["default"])(length, [], fn)); -}); -/* harmony default export */ __webpack_exports__["default"] = (curryN); /***/ }), -/***/ "./node_modules/ramda/es/dec.js": +/***/ "./node_modules/lodash/isMap.js": /*!**************************************!*\ - !*** ./node_modules/ramda/es/dec.js ***! + !*** ./node_modules/lodash/isMap.js ***! \**************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _add_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./add.js */ "./node_modules/ramda/es/add.js"); +var baseIsMap = __webpack_require__(/*! ./_baseIsMap */ "./node_modules/lodash/_baseIsMap.js"), + baseUnary = __webpack_require__(/*! ./_baseUnary */ "./node_modules/lodash/_baseUnary.js"), + nodeUtil = __webpack_require__(/*! ./_nodeUtil */ "./node_modules/lodash/_nodeUtil.js"); + +/* Node.js helper references. */ +var nodeIsMap = nodeUtil && nodeUtil.isMap; /** - * Decrements its argument. + * Checks if `value` is classified as a `Map` object. * - * @func - * @memberOf R - * @since v0.9.0 - * @category Math - * @sig Number -> Number - * @param {Number} n - * @return {Number} n - 1 - * @see R.inc + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. * @example * - * R.dec(42); //=> 41 + * _.isMap(new Map); + * // => true + * + * _.isMap(new WeakMap); + * // => false */ +var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; -var dec = /*#__PURE__*/ -(0,_add_js__WEBPACK_IMPORTED_MODULE_0__["default"])(-1); -/* harmony default export */ __webpack_exports__["default"] = (dec); +module.exports = isMap; -/***/ }), -/***/ "./node_modules/ramda/es/defaultTo.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/defaultTo.js ***! - \********************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ }), -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/***/ "./node_modules/lodash/isObject.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/isObject.js ***! + \*****************************************/ +/***/ (function(module) { /** - * Returns the second argument if it is not `null`, `undefined` or `NaN`; - * otherwise the first argument is returned. + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * - * @func - * @memberOf R - * @since v0.10.0 - * @category Logic - * @sig a -> b -> a | b - * @param {a} default The default value. - * @param {b} val `val` will be returned instead of `default` unless `val` is `null`, `undefined` or `NaN`. - * @return {*} The second value if it is not `null`, `undefined` or `NaN`, otherwise the default value + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * - * const defaultTo42 = R.defaultTo(42); + * _.isObject({}); + * // => true * - * defaultTo42(null); //=> 42 - * defaultTo42(undefined); //=> 42 - * defaultTo42(false); //=> false - * defaultTo42('Ramda'); //=> 'Ramda' - * // parseInt('string') results in NaN - * defaultTo42(parseInt('string')); //=> 42 - */ - -var defaultTo = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function defaultTo(d, v) { - return v == null || v !== v ? d : v; -}); -/* harmony default export */ __webpack_exports__["default"] = (defaultTo); - -/***/ }), - -/***/ "./node_modules/ramda/es/descend.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/descend.js ***! - \******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); - -/** - * Makes a descending comparator function out of a function that returns a value - * that can be compared with `<` and `>`. + * _.isObject([1, 2, 3]); + * // => true * - * @func - * @memberOf R - * @since v0.23.0 - * @category Function - * @sig Ord b => (a -> b) -> a -> a -> Number - * @param {Function} fn A function of arity one that returns a value that can be compared - * @param {*} a The first item to be compared. - * @param {*} b The second item to be compared. - * @return {Number} `-1` if fn(a) > fn(b), `1` if fn(b) > fn(a), otherwise `0` - * @see R.ascend - * @example + * _.isObject(_.noop); + * // => true * - * const byAge = R.descend(R.prop('age')); - * const people = [ - * { name: 'Emma', age: 70 }, - * { name: 'Peter', age: 78 }, - * { name: 'Mikhail', age: 62 }, - * ]; - * const peopleByOldestFirst = R.sort(byAge, people); - * //=> [{ name: 'Peter', age: 78 }, { name: 'Emma', age: 70 }, { name: 'Mikhail', age: 62 }] + * _.isObject(null); + * // => false */ +function isObject(value) { + var type = typeof value; + return value != null && (type == 'object' || type == 'function'); +} + +module.exports = isObject; -var descend = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function descend(fn, a, b) { - var aa = fn(a); - var bb = fn(b); - return aa > bb ? -1 : aa < bb ? 1 : 0; -}); -/* harmony default export */ __webpack_exports__["default"] = (descend); /***/ }), -/***/ "./node_modules/ramda/es/difference.js": +/***/ "./node_modules/lodash/isObjectLike.js": /*!*********************************************!*\ - !*** ./node_modules/ramda/es/difference.js ***! + !*** ./node_modules/lodash/isObjectLike.js ***! \*********************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_Set_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_Set.js */ "./node_modules/ramda/es/internal/_Set.js"); - +/***/ (function(module) { /** - * Finds the set (i.e. no duplicates) of all elements in the first list not - * contained in the second list. Objects and Arrays are compared in terms of - * value equality, not reference equality. + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". * - * @func - * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig [*] -> [*] -> [*] - * @param {Array} list1 The first list. - * @param {Array} list2 The second list. - * @return {Array} The elements in `list1` that are not in `list2`. - * @see R.differenceWith, R.symmetricDifference, R.symmetricDifferenceWith, R.without + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. * @example * - * R.difference([1,2,3,4], [7,6,5,4,3]); //=> [1,2] - * R.difference([7,6,5,4,3], [1,2,3,4]); //=> [7,6,5] - * R.difference([{a: 1}, {b: 2}], [{a: 1}, {c: 3}]) //=> [{b: 2}] + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false */ +function isObjectLike(value) { + return value != null && typeof value == 'object'; +} + +module.exports = isObjectLike; -var difference = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function difference(first, second) { - var out = []; - var idx = 0; - var firstLen = first.length; - var secondLen = second.length; - var toFilterOut = new _internal_Set_js__WEBPACK_IMPORTED_MODULE_1__["default"](); - for (var i = 0; i < secondLen; i += 1) { - toFilterOut.add(second[i]); - } - while (idx < firstLen) { - if (toFilterOut.add(first[idx])) { - out[out.length] = first[idx]; - } - idx += 1; - } - return out; -}); -/* harmony default export */ __webpack_exports__["default"] = (difference); /***/ }), -/***/ "./node_modules/ramda/es/differenceWith.js": -/*!*************************************************!*\ - !*** ./node_modules/ramda/es/differenceWith.js ***! - \*************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/isPlainObject.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash/isPlainObject.js ***! + \**********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_includesWith_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_includesWith.js */ "./node_modules/ramda/es/internal/_includesWith.js"); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); +var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), + getPrototype = __webpack_require__(/*! ./_getPrototype */ "./node_modules/lodash/_getPrototype.js"), + isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); + +/** `Object#toString` result references. */ +var objectTag = '[object Object]'; + +/** Used for built-in method references. */ +var funcProto = Function.prototype, + objectProto = Object.prototype; + +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; +/** Used to infer the `Object` constructor. */ +var objectCtorString = funcToString.call(Object); /** - * Finds the set (i.e. no duplicates) of all elements in the first list not - * contained in the second list. Duplication is determined according to the - * value returned by applying the supplied predicate to two list elements. + * Checks if `value` is a plain object, that is, an object created by the + * `Object` constructor or one with a `[[Prototype]]` of `null`. * - * @func - * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig ((a, a) -> Boolean) -> [a] -> [a] -> [a] - * @param {Function} pred A predicate used to test whether two items are equal. - * @param {Array} list1 The first list. - * @param {Array} list2 The second list. - * @return {Array} The elements in `list1` that are not in `list2`. - * @see R.difference, R.symmetricDifference, R.symmetricDifferenceWith + * @static + * @memberOf _ + * @since 0.8.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. * @example * - * const cmp = (x, y) => x.a === y.a; - * const l1 = [{a: 1}, {a: 2}, {a: 3}]; - * const l2 = [{a: 3}, {a: 4}]; - * R.differenceWith(cmp, l1, l2); //=> [{a: 1}, {a: 2}] + * function Foo() { + * this.a = 1; + * } + * + * _.isPlainObject(new Foo); + * // => false + * + * _.isPlainObject([1, 2, 3]); + * // => false + * + * _.isPlainObject({ 'x': 0, 'y': 0 }); + * // => true * - * R.differenceWith(R.equals, [1, 2, 3, 3, 3], []); //=> [1, 2, 3] - * R.differenceWith(R.equals, [1, 2, 3, 3, 3], [1]); //=> [2, 3] + * _.isPlainObject(Object.create(null)); + * // => true */ - -var differenceWith = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function differenceWith(pred, first, second) { - var out = []; - var idx = 0; - var firstLen = first.length; - while (idx < firstLen) { - if (!(0,_internal_includesWith_js__WEBPACK_IMPORTED_MODULE_0__["default"])(pred, first[idx], second) && !(0,_internal_includesWith_js__WEBPACK_IMPORTED_MODULE_0__["default"])(pred, first[idx], out)) { - out.push(first[idx]); - } - idx += 1; +function isPlainObject(value) { + if (!isObjectLike(value) || baseGetTag(value) != objectTag) { + return false; } - return out; -}); -/* harmony default export */ __webpack_exports__["default"] = (differenceWith); + var proto = getPrototype(value); + if (proto === null) { + return true; + } + var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; + return typeof Ctor == 'function' && Ctor instanceof Ctor && + funcToString.call(Ctor) == objectCtorString; +} + +module.exports = isPlainObject; + /***/ }), -/***/ "./node_modules/ramda/es/dissoc.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/dissoc.js ***! - \*****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/isSet.js": +/*!**************************************!*\ + !*** ./node_modules/lodash/isSet.js ***! + \**************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _dissocPath_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dissocPath.js */ "./node_modules/ramda/es/dissocPath.js"); +var baseIsSet = __webpack_require__(/*! ./_baseIsSet */ "./node_modules/lodash/_baseIsSet.js"), + baseUnary = __webpack_require__(/*! ./_baseUnary */ "./node_modules/lodash/_baseUnary.js"), + nodeUtil = __webpack_require__(/*! ./_nodeUtil */ "./node_modules/lodash/_nodeUtil.js"); +/* Node.js helper references. */ +var nodeIsSet = nodeUtil && nodeUtil.isSet; /** - * Returns a new object that does not contain a `prop` property. + * Checks if `value` is classified as a `Set` object. * - * @func - * @memberOf R - * @since v0.10.0 - * @category Object - * @sig String -> {k: v} -> {k: v} - * @param {String} prop The name of the property to dissociate - * @param {Object} obj The object to clone - * @return {Object} A new object equivalent to the original but without the specified property - * @see R.assoc, R.omit + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. * @example * - * R.dissoc('b', {a: 1, b: 2, c: 3}); //=> {a: 1, c: 3} + * _.isSet(new Set); + * // => true + * + * _.isSet(new WeakSet); + * // => false */ +var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; -var dissoc = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function dissoc(prop, obj) { - return (0,_dissocPath_js__WEBPACK_IMPORTED_MODULE_1__["default"])([prop], obj); -}); -/* harmony default export */ __webpack_exports__["default"] = (dissoc); - -/***/ }), - -/***/ "./node_modules/ramda/es/dissocPath.js": -/*!*********************************************!*\ - !*** ./node_modules/ramda/es/dissocPath.js ***! - \*********************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dissoc_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dissoc.js */ "./node_modules/ramda/es/internal/_dissoc.js"); -/* harmony import */ var _internal_isInteger_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_isInteger.js */ "./node_modules/ramda/es/internal/_isInteger.js"); -/* harmony import */ var _internal_isArray_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); -/* harmony import */ var _assoc_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./assoc.js */ "./node_modules/ramda/es/assoc.js"); +module.exports = isSet; +/***/ }), +/***/ "./node_modules/lodash/isString.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/isString.js ***! + \*****************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), + isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), + isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); -/** - * Makes a shallow clone of an object. Note that this copies and flattens - * prototype properties onto the new object as well. All non-primitive - * properties are copied by reference. - * - * @private - * @param {String|Integer} prop The prop operating - * @param {Object|Array} obj The object to clone - * @return {Object|Array} A new object equivalent to the original. - */ +/** `Object#toString` result references. */ +var stringTag = '[object String]'; -function _shallowCloneObject(prop, obj) { - if ((0,_internal_isInteger_js__WEBPACK_IMPORTED_MODULE_2__["default"])(prop) && (0,_internal_isArray_js__WEBPACK_IMPORTED_MODULE_3__["default"])(obj)) { - return [].concat(obj); - } - var result = {}; - for (var p in obj) { - result[p] = obj[p]; - } - return result; -} /** - * Makes a shallow clone of an object, omitting the property at the given path. - * Note that this copies and flattens prototype properties onto the new object - * as well. All non-primitive properties are copied by reference. + * Checks if `value` is classified as a `String` primitive or object. * - * @func - * @memberOf R - * @since v0.11.0 - * @category Object - * @typedefn Idx = String | Int | Symbol - * @sig [Idx] -> {k: v} -> {k: v} - * @param {Array} path The path to the value to omit - * @param {Object} obj The object to clone - * @return {Object} A new object without the property at path - * @see R.assocPath + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a string, else `false`. * @example * - * R.dissocPath(['a', 'b', 'c'], {a: {b: {c: 42}}}); //=> {a: {b: {}}} + * _.isString('abc'); + * // => true + * + * _.isString(1); + * // => false */ +function isString(value) { + return typeof value == 'string' || + (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag); +} + +module.exports = isString; -var dissocPath = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function dissocPath(path, obj) { - if (obj == null) { - return obj; - } - switch (path.length) { - case 0: - return obj; - case 1: - return (0,_internal_dissoc_js__WEBPACK_IMPORTED_MODULE_1__["default"])(path[0], obj); - default: - var head = path[0]; - var tail = Array.prototype.slice.call(path, 1); - if (obj[head] == null) { - return _shallowCloneObject(head, obj); - } else { - return (0,_assoc_js__WEBPACK_IMPORTED_MODULE_4__["default"])(head, dissocPath(tail, obj[head]), obj); - } - } -}); -/* harmony default export */ __webpack_exports__["default"] = (dissocPath); /***/ }), -/***/ "./node_modules/ramda/es/divide.js": +/***/ "./node_modules/lodash/isSymbol.js": /*!*****************************************!*\ - !*** ./node_modules/ramda/es/divide.js ***! + !*** ./node_modules/lodash/isSymbol.js ***! \*****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), + isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); + +/** `Object#toString` result references. */ +var symbolTag = '[object Symbol]'; /** - * Divides two numbers. Equivalent to `a / b`. + * Checks if `value` is classified as a `Symbol` primitive or object. * - * @func - * @memberOf R - * @since v0.1.0 - * @category Math - * @sig Number -> Number -> Number - * @param {Number} a The first value. - * @param {Number} b The second value. - * @return {Number} The result of `a / b`. - * @see R.multiply + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. * @example * - * R.divide(71, 100); //=> 0.71 - * - * const half = R.divide(R.__, 2); - * half(42); //=> 21 + * _.isSymbol(Symbol.iterator); + * // => true * - * const reciprocal = R.divide(1); - * reciprocal(4); //=> 0.25 + * _.isSymbol('abc'); + * // => false */ +function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike(value) && baseGetTag(value) == symbolTag); +} -var divide = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function divide(a, b) { - return a / b; -}); -/* harmony default export */ __webpack_exports__["default"] = (divide); - -/***/ }), +module.exports = isSymbol; -/***/ "./node_modules/ramda/es/drop.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/drop.js ***! - \***************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_xdrop_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xdrop.js */ "./node_modules/ramda/es/internal/_xdrop.js"); -/* harmony import */ var _slice_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./slice.js */ "./node_modules/ramda/es/slice.js"); +/***/ }), +/***/ "./node_modules/lodash/isTypedArray.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash/isTypedArray.js ***! + \*********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var baseIsTypedArray = __webpack_require__(/*! ./_baseIsTypedArray */ "./node_modules/lodash/_baseIsTypedArray.js"), + baseUnary = __webpack_require__(/*! ./_baseUnary */ "./node_modules/lodash/_baseUnary.js"), + nodeUtil = __webpack_require__(/*! ./_nodeUtil */ "./node_modules/lodash/_nodeUtil.js"); +/* Node.js helper references. */ +var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; /** - * Returns all but the first `n` elements of the given list, string, or - * transducer/transformer (or object with a `drop` method). - * - * Dispatches to the `drop` method of the second argument, if present. + * Checks if `value` is classified as a typed array. * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig Number -> [a] -> [a] - * @sig Number -> String -> String - * @param {Number} n - * @param {*} list - * @return {*} A copy of list without the first `n` elements - * @see R.take, R.transduce, R.dropLast, R.dropWhile + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. * @example * - * R.drop(1, ['foo', 'bar', 'baz']); //=> ['bar', 'baz'] - * R.drop(2, ['foo', 'bar', 'baz']); //=> ['baz'] - * R.drop(3, ['foo', 'bar', 'baz']); //=> [] - * R.drop(4, ['foo', 'bar', 'baz']); //=> [] - * R.drop(3, 'ramda'); //=> 'da' + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false */ +var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; -var drop = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])(['drop'], _internal_xdrop_js__WEBPACK_IMPORTED_MODULE_2__["default"], function drop(n, xs) { - return (0,_slice_js__WEBPACK_IMPORTED_MODULE_3__["default"])(Math.max(0, n), Infinity, xs); -})); -/* harmony default export */ __webpack_exports__["default"] = (drop); - -/***/ }), - -/***/ "./node_modules/ramda/es/dropLast.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/dropLast.js ***! - \*******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_dropLast_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_dropLast.js */ "./node_modules/ramda/es/internal/_dropLast.js"); -/* harmony import */ var _internal_xdropLast_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_xdropLast.js */ "./node_modules/ramda/es/internal/_xdropLast.js"); +module.exports = isTypedArray; +/***/ }), +/***/ "./node_modules/lodash/isUndefined.js": +/*!********************************************!*\ + !*** ./node_modules/lodash/isUndefined.js ***! + \********************************************/ +/***/ (function(module) { /** - * Returns a list containing all but the last `n` elements of the given `list`. - * - * Acts as a transducer if a transformer is given in list position. + * Checks if `value` is `undefined`. * - * @func - * @memberOf R - * @since v0.16.0 - * @category List - * @sig Number -> [a] -> [a] - * @sig Number -> String -> String - * @param {Number} n The number of elements of `list` to skip. - * @param {Array} list The list of elements to consider. - * @return {Array} A copy of the list with only the first `list.length - n` elements - * @see R.takeLast, R.drop, R.dropWhile, R.dropLastWhile + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. * @example * - * R.dropLast(1, ['foo', 'bar', 'baz']); //=> ['foo', 'bar'] - * R.dropLast(2, ['foo', 'bar', 'baz']); //=> ['foo'] - * R.dropLast(3, ['foo', 'bar', 'baz']); //=> [] - * R.dropLast(4, ['foo', 'bar', 'baz']); //=> [] - * R.dropLast(3, 'ramda'); //=> 'ra' + * _.isUndefined(void 0); + * // => true + * + * _.isUndefined(null); + * // => false */ +function isUndefined(value) { + return value === undefined; +} -var dropLast = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])([], _internal_xdropLast_js__WEBPACK_IMPORTED_MODULE_3__["default"], _internal_dropLast_js__WEBPACK_IMPORTED_MODULE_2__["default"])); -/* harmony default export */ __webpack_exports__["default"] = (dropLast); - -/***/ }), - -/***/ "./node_modules/ramda/es/dropLastWhile.js": -/*!************************************************!*\ - !*** ./node_modules/ramda/es/dropLastWhile.js ***! - \************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +module.exports = isUndefined; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_dropLastWhile_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_dropLastWhile.js */ "./node_modules/ramda/es/internal/_dropLastWhile.js"); -/* harmony import */ var _internal_xdropLastWhile_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_xdropLastWhile.js */ "./node_modules/ramda/es/internal/_xdropLastWhile.js"); +/***/ }), +/***/ "./node_modules/lodash/keys.js": +/*!*************************************!*\ + !*** ./node_modules/lodash/keys.js ***! + \*************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var arrayLikeKeys = __webpack_require__(/*! ./_arrayLikeKeys */ "./node_modules/lodash/_arrayLikeKeys.js"), + baseKeys = __webpack_require__(/*! ./_baseKeys */ "./node_modules/lodash/_baseKeys.js"), + isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"); /** - * Returns a new list excluding all the tailing elements of a given list which - * satisfy the supplied predicate function. It passes each value from the right - * to the supplied predicate function, skipping elements until the predicate - * function returns a `falsy` value. The predicate function is applied to one argument: - * *(value)*. + * Creates an array of the own enumerable property names of `object`. * - * Acts as a transducer if a transformer is given in list position. + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * for more details. * - * @func - * @memberOf R - * @since v0.16.0 - * @category List - * @sig (a -> Boolean) -> [a] -> [a] - * @sig (a -> Boolean) -> String -> String - * @param {Function} predicate The function to be called on each element - * @param {Array} xs The collection to iterate over. - * @return {Array} A new array without any trailing elements that return `falsy` values from the `predicate`. - * @see R.takeLastWhile, R.addIndex, R.drop, R.dropWhile + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. * @example * - * const lteThree = x => x <= 3; + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; * - * R.dropLastWhile(lteThree, [1, 2, 3, 4, 3, 2, 1]); //=> [1, 2, 3, 4] + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) * - * R.dropLastWhile(x => x !== 'd' , 'Ramda'); //=> 'Ramd' + * _.keys('hi'); + * // => ['0', '1'] */ +function keys(object) { + return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); +} -var dropLastWhile = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])([], _internal_xdropLastWhile_js__WEBPACK_IMPORTED_MODULE_3__["default"], _internal_dropLastWhile_js__WEBPACK_IMPORTED_MODULE_2__["default"])); -/* harmony default export */ __webpack_exports__["default"] = (dropLastWhile); - -/***/ }), - -/***/ "./node_modules/ramda/es/dropRepeats.js": -/*!**********************************************!*\ - !*** ./node_modules/ramda/es/dropRepeats.js ***! - \**********************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_xdropRepeatsWith_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xdropRepeatsWith.js */ "./node_modules/ramda/es/internal/_xdropRepeatsWith.js"); -/* harmony import */ var _dropRepeatsWith_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./dropRepeatsWith.js */ "./node_modules/ramda/es/dropRepeatsWith.js"); -/* harmony import */ var _equals_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./equals.js */ "./node_modules/ramda/es/equals.js"); +module.exports = keys; +/***/ }), +/***/ "./node_modules/lodash/keysIn.js": +/*!***************************************!*\ + !*** ./node_modules/lodash/keysIn.js ***! + \***************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var arrayLikeKeys = __webpack_require__(/*! ./_arrayLikeKeys */ "./node_modules/lodash/_arrayLikeKeys.js"), + baseKeysIn = __webpack_require__(/*! ./_baseKeysIn */ "./node_modules/lodash/_baseKeysIn.js"), + isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"); /** - * Returns a new list without any consecutively repeating elements. - * [`R.equals`](#equals) is used to determine equality. + * Creates an array of the own and inherited enumerable property names of `object`. * - * Acts as a transducer if a transformer is given in list position. + * **Note:** Non-object values are coerced to objects. * - * @func - * @memberOf R - * @since v0.14.0 - * @category List - * @sig [a] -> [a] - * @param {Array} list The array to consider. - * @return {Array} `list` without repeating elements. - * @see R.transduce + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. * @example * - * R.dropRepeats([1, 1, 1, 2, 3, 4, 4, 2, 2]); //=> [1, 2, 3, 4, 2] + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) */ +function keysIn(object) { + return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); +} -var dropRepeats = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])([], function () { - return (0,_internal_xdropRepeatsWith_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_equals_js__WEBPACK_IMPORTED_MODULE_4__["default"]); -}, /*#__PURE__*/ -(0,_dropRepeatsWith_js__WEBPACK_IMPORTED_MODULE_3__["default"])(_equals_js__WEBPACK_IMPORTED_MODULE_4__["default"]))); -/* harmony default export */ __webpack_exports__["default"] = (dropRepeats); - -/***/ }), - -/***/ "./node_modules/ramda/es/dropRepeatsBy.js": -/*!************************************************!*\ - !*** ./node_modules/ramda/es/dropRepeatsBy.js ***! - \************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_xdropRepeatsWith_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xdropRepeatsWith.js */ "./node_modules/ramda/es/internal/_xdropRepeatsWith.js"); -/* harmony import */ var _dropRepeatsWith_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./dropRepeatsWith.js */ "./node_modules/ramda/es/dropRepeatsWith.js"); -/* harmony import */ var _eqBy_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./eqBy.js */ "./node_modules/ramda/es/eqBy.js"); - +module.exports = keysIn; +/***/ }), +/***/ "./node_modules/lodash/last.js": +/*!*************************************!*\ + !*** ./node_modules/lodash/last.js ***! + \*************************************/ +/***/ (function(module) { /** - * Returns a new list without any consecutively repeating elements, - * based upon the value returned by applying the supplied function to - * each list element. [`R.equals`](#equals) is used to determine equality. - * - * Acts as a transducer if a transformer is given in list position. + * Gets the last element of `array`. * - * @func - * @memberOf R - * @since v0.29.0 - * @category List - * @sig (a -> b) -> [a] -> [a] - * @param {Function} fn A function used to produce a value to use during comparisons. - * @param {Array} list The array to consider. - * @return {Array} `list` without repeating elements. - * @see R.transduce + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the last element of `array`. * @example * - * R.dropRepeatsBy(Math.abs, [1, -1, -1, 2, 3, -4, 4, 2, 2]); //=> [1, 2, 3, -4, 2] + * _.last([1, 2, 3]); + * // => 3 */ +function last(array) { + var length = array == null ? 0 : array.length; + return length ? array[length - 1] : undefined; +} -var dropRepeatsBy = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (fn, list) { - return (0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])([], function () { - return (0,_internal_xdropRepeatsWith_js__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_eqBy_js__WEBPACK_IMPORTED_MODULE_4__["default"])(fn)); - }, (0,_dropRepeatsWith_js__WEBPACK_IMPORTED_MODULE_3__["default"])((0,_eqBy_js__WEBPACK_IMPORTED_MODULE_4__["default"])(fn)))(list); -}); -/* harmony default export */ __webpack_exports__["default"] = (dropRepeatsBy); - -/***/ }), - -/***/ "./node_modules/ramda/es/dropRepeatsWith.js": -/*!**************************************************!*\ - !*** ./node_modules/ramda/es/dropRepeatsWith.js ***! - \**************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +module.exports = last; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_xdropRepeatsWith_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xdropRepeatsWith.js */ "./node_modules/ramda/es/internal/_xdropRepeatsWith.js"); -/* harmony import */ var _last_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./last.js */ "./node_modules/ramda/es/last.js"); +/***/ }), +/***/ "./node_modules/lodash/map.js": +/*!************************************!*\ + !*** ./node_modules/lodash/map.js ***! + \************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var arrayMap = __webpack_require__(/*! ./_arrayMap */ "./node_modules/lodash/_arrayMap.js"), + baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), + baseMap = __webpack_require__(/*! ./_baseMap */ "./node_modules/lodash/_baseMap.js"), + isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"); /** - * Returns a new list without any consecutively repeating elements. Equality is - * determined by applying the supplied predicate to each pair of consecutive elements. The - * first element in a series of equal elements will be preserved. + * Creates an array of values by running each element in `collection` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, index|key, collection). * - * Acts as a transducer if a transformer is given in list position. + * Many lodash methods are guarded to work as iteratees for methods like + * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. * - * @func - * @memberOf R - * @since v0.14.0 - * @category List - * @sig ((a, a) -> Boolean) -> [a] -> [a] - * @param {Function} pred A predicate used to test whether two items are equal. - * @param {Array} list The array to consider. - * @return {Array} `list` without repeating elements. - * @see R.transduce + * The guarded methods are: + * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, + * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, + * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, + * `template`, `trim`, `trimEnd`, `trimStart`, and `words` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new mapped array. * @example * - * const l = [1, -1, 1, 3, 4, -4, -4, -5, 5, 3, 3]; - * R.dropRepeatsWith(R.eqBy(Math.abs), l); //=> [1, 3, 4, -5, 3] + * function square(n) { + * return n * n; + * } + * + * _.map([4, 8], square); + * // => [16, 64] + * + * _.map({ 'a': 4, 'b': 8 }, square); + * // => [16, 64] (iteration order is not guaranteed) + * + * var users = [ + * { 'user': 'barney' }, + * { 'user': 'fred' } + * ]; + * + * // The `_.property` iteratee shorthand. + * _.map(users, 'user'); + * // => ['barney', 'fred'] */ +function map(collection, iteratee) { + var func = isArray(collection) ? arrayMap : baseMap; + return func(collection, baseIteratee(iteratee, 3)); +} -var dropRepeatsWith = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])([], _internal_xdropRepeatsWith_js__WEBPACK_IMPORTED_MODULE_2__["default"], function dropRepeatsWith(pred, list) { - var result = []; - var idx = 1; - var len = list.length; - if (len !== 0) { - result[0] = list[0]; - while (idx < len) { - if (!pred((0,_last_js__WEBPACK_IMPORTED_MODULE_3__["default"])(result), list[idx])) { - result[result.length] = list[idx]; - } - idx += 1; - } - } - return result; -})); -/* harmony default export */ __webpack_exports__["default"] = (dropRepeatsWith); - -/***/ }), - -/***/ "./node_modules/ramda/es/dropWhile.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/dropWhile.js ***! - \********************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +module.exports = map; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_xdropWhile_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xdropWhile.js */ "./node_modules/ramda/es/internal/_xdropWhile.js"); -/* harmony import */ var _slice_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./slice.js */ "./node_modules/ramda/es/slice.js"); +/***/ }), +/***/ "./node_modules/lodash/mapValues.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/mapValues.js ***! + \******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ "./node_modules/lodash/_baseAssignValue.js"), + baseForOwn = __webpack_require__(/*! ./_baseForOwn */ "./node_modules/lodash/_baseForOwn.js"), + baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"); /** - * Returns a new list excluding the leading elements of a given list which - * satisfy the supplied predicate function. It passes each value to the supplied - * predicate function, skipping elements while the predicate function returns - * `true`. The predicate function is applied to one argument: *(value)*. - * - * Dispatches to the `dropWhile` method of the second argument, if present. - * - * Acts as a transducer if a transformer is given in list position. + * Creates an object with the same keys as `object` and values generated + * by running each own enumerable string keyed property of `object` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, key, object). * - * @func - * @memberOf R - * @since v0.9.0 - * @category List - * @sig (a -> Boolean) -> [a] -> [a] - * @sig (a -> Boolean) -> String -> String - * @param {Function} fn The function called per iteration. - * @param {Array} xs The collection to iterate over. - * @return {Array} A new array. - * @see R.takeWhile, R.transduce, R.addIndex + * @static + * @memberOf _ + * @since 2.4.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns the new mapped object. + * @see _.mapKeys * @example * - * const lteTwo = x => x <= 2; + * var users = { + * 'fred': { 'user': 'fred', 'age': 40 }, + * 'pebbles': { 'user': 'pebbles', 'age': 1 } + * }; * - * R.dropWhile(lteTwo, [1, 2, 3, 4, 3, 2, 1]); //=> [3, 4, 3, 2, 1] + * _.mapValues(users, function(o) { return o.age; }); + * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) * - * R.dropWhile(x => x !== 'd' , 'Ramda'); //=> 'da' + * // The `_.property` iteratee shorthand. + * _.mapValues(users, 'age'); + * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) */ +function mapValues(object, iteratee) { + var result = {}; + iteratee = baseIteratee(iteratee, 3); -var dropWhile = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])(['dropWhile'], _internal_xdropWhile_js__WEBPACK_IMPORTED_MODULE_2__["default"], function dropWhile(pred, xs) { - var idx = 0; - var len = xs.length; - while (idx < len && pred(xs[idx])) { - idx += 1; - } - return (0,_slice_js__WEBPACK_IMPORTED_MODULE_3__["default"])(idx, Infinity, xs); -})); -/* harmony default export */ __webpack_exports__["default"] = (dropWhile); - -/***/ }), + baseForOwn(object, function(value, key, object) { + baseAssignValue(result, key, iteratee(value, key, object)); + }); + return result; +} -/***/ "./node_modules/ramda/es/either.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/either.js ***! - \*****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +module.exports = mapValues; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_isFunction_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isFunction.js */ "./node_modules/ramda/es/internal/_isFunction.js"); -/* harmony import */ var _lift_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lift.js */ "./node_modules/ramda/es/lift.js"); -/* harmony import */ var _or_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./or.js */ "./node_modules/ramda/es/or.js"); +/***/ }), +/***/ "./node_modules/lodash/max.js": +/*!************************************!*\ + !*** ./node_modules/lodash/max.js ***! + \************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var baseExtremum = __webpack_require__(/*! ./_baseExtremum */ "./node_modules/lodash/_baseExtremum.js"), + baseGt = __webpack_require__(/*! ./_baseGt */ "./node_modules/lodash/_baseGt.js"), + identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js"); /** - * A function wrapping calls to the two functions in an `||` operation, - * returning the result of the first function if it is truth-y and the result - * of the second function otherwise. Note that this is short-circuited, - * meaning that the second function will not be invoked if the first returns a - * truth-y value. - * - * In addition to functions, `R.either` also accepts any fantasy-land compatible - * applicative functor. + * Computes the maximum value of `array`. If `array` is empty or falsey, + * `undefined` is returned. * - * @func - * @memberOf R - * @since v0.12.0 - * @category Logic - * @sig (*... -> Boolean) -> (*... -> Boolean) -> (*... -> Boolean) - * @param {Function} f a predicate - * @param {Function} g another predicate - * @return {Function} a function that applies its arguments to `f` and `g` and `||`s their outputs together. - * @see R.both, R.anyPass, R.or + * @static + * @since 0.1.0 + * @memberOf _ + * @category Math + * @param {Array} array The array to iterate over. + * @returns {*} Returns the maximum value. * @example * - * const gt10 = x => x > 10; - * const even = x => x % 2 === 0; - * const f = R.either(gt10, even); - * f(101); //=> true - * f(8); //=> true + * _.max([4, 2, 8, 6]); + * // => 8 * - * R.either(Maybe.Just(false), Maybe.Just(55)); // => Maybe.Just(55) - * R.either([false, false, 'a'], [11]) // => [11, 11, "a"] + * _.max([]); + * // => undefined */ +function max(array) { + return (array && array.length) + ? baseExtremum(array, identity, baseGt) + : undefined; +} + +module.exports = max; -var either = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function either(f, g) { - return (0,_internal_isFunction_js__WEBPACK_IMPORTED_MODULE_1__["default"])(f) ? function _either() { - return f.apply(this, arguments) || g.apply(this, arguments); - } : (0,_lift_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_or_js__WEBPACK_IMPORTED_MODULE_3__["default"])(f, g); -}); -/* harmony default export */ __webpack_exports__["default"] = (either); /***/ }), -/***/ "./node_modules/ramda/es/empty.js": +/***/ "./node_modules/lodash/memoize.js": /*!****************************************!*\ - !*** ./node_modules/ramda/es/empty.js ***! + !*** ./node_modules/lodash/memoize.js ***! \****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _internal_isArguments_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isArguments.js */ "./node_modules/ramda/es/internal/_isArguments.js"); -/* harmony import */ var _internal_isArray_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); -/* harmony import */ var _internal_isObject_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_isObject.js */ "./node_modules/ramda/es/internal/_isObject.js"); -/* harmony import */ var _internal_isString_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./internal/_isString.js */ "./node_modules/ramda/es/internal/_isString.js"); -/* harmony import */ var _internal_isTypedArray_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./internal/_isTypedArray.js */ "./node_modules/ramda/es/internal/_isTypedArray.js"); - - - +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var MapCache = __webpack_require__(/*! ./_MapCache */ "./node_modules/lodash/_MapCache.js"); +/** Error message constants. */ +var FUNC_ERROR_TEXT = 'Expected a function'; /** - * Returns the empty value of its argument's type. Ramda defines the empty - * value of Array (`[]`), Object (`{}`), String (`''`), - * TypedArray (`Uint8Array []`, `Float32Array []`, etc), and Arguments. Other - * types are supported if they define `.empty`, - * `.prototype.empty` or implement the - * [FantasyLand Monoid spec](https://github.com/fantasyland/fantasy-land#monoid). + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. * - * Dispatches to the `empty` method of the first argument, if present. + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `clear`, `delete`, `get`, `has`, and `set`. * - * @func - * @memberOf R - * @since v0.3.0 + * @static + * @memberOf _ + * @since 0.1.0 * @category Function - * @sig a -> a - * @param {*} x - * @return {*} + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. * @example * - * R.empty(Just(42)); //=> Nothing() - * R.empty([1, 2, 3]); //=> [] - * R.empty('unicorns'); //=> '' - * R.empty({x: 1, y: 2}); //=> {} - * R.empty(Uint8Array.from('123')); //=> Uint8Array [] + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; */ +function memoize(func, resolver) { + if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; -var empty = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function empty(x) { - return x != null && typeof x['fantasy-land/empty'] === 'function' ? x['fantasy-land/empty']() : x != null && x.constructor != null && typeof x.constructor['fantasy-land/empty'] === 'function' ? x.constructor['fantasy-land/empty']() : x != null && typeof x.empty === 'function' ? x.empty() : x != null && x.constructor != null && typeof x.constructor.empty === 'function' ? x.constructor.empty() : (0,_internal_isArray_js__WEBPACK_IMPORTED_MODULE_2__["default"])(x) ? [] : (0,_internal_isString_js__WEBPACK_IMPORTED_MODULE_4__["default"])(x) ? '' : (0,_internal_isObject_js__WEBPACK_IMPORTED_MODULE_3__["default"])(x) ? {} : (0,_internal_isArguments_js__WEBPACK_IMPORTED_MODULE_1__["default"])(x) ? function () { - return arguments; - }() : (0,_internal_isTypedArray_js__WEBPACK_IMPORTED_MODULE_5__["default"])(x) ? x.constructor.from('') : void 0 // else - ; -}); + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result) || cache; + return result; + }; + memoized.cache = new (memoize.Cache || MapCache); + return memoized; +} -/* harmony default export */ __webpack_exports__["default"] = (empty); +// Expose `MapCache`. +memoize.Cache = MapCache; -/***/ }), +module.exports = memoize; -/***/ "./node_modules/ramda/es/endsWith.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/endsWith.js ***! - \*******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _equals_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./equals.js */ "./node_modules/ramda/es/equals.js"); -/* harmony import */ var _takeLast_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./takeLast.js */ "./node_modules/ramda/es/takeLast.js"); +/***/ }), +/***/ "./node_modules/lodash/merge.js": +/*!**************************************!*\ + !*** ./node_modules/lodash/merge.js ***! + \**************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var baseMerge = __webpack_require__(/*! ./_baseMerge */ "./node_modules/lodash/_baseMerge.js"), + createAssigner = __webpack_require__(/*! ./_createAssigner */ "./node_modules/lodash/_createAssigner.js"); /** - * Checks if a list ends with the provided sublist. + * This method is like `_.assign` except that it recursively merges own and + * inherited enumerable string keyed properties of source objects into the + * destination object. Source properties that resolve to `undefined` are + * skipped if a destination value exists. Array and plain object properties + * are merged recursively. Other objects and value types are overridden by + * assignment. Source objects are applied from left to right. Subsequent + * sources overwrite property assignments of previous sources. * - * Similarly, checks if a string ends with the provided substring. + * **Note:** This method mutates `object`. * - * @func - * @memberOf R - * @since v0.24.0 - * @category List - * @sig [a] -> [a] -> Boolean - * @sig String -> String -> Boolean - * @param {*} suffix - * @param {*} list - * @return {Boolean} - * @see R.startsWith + * @static + * @memberOf _ + * @since 0.5.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. * @example * - * R.endsWith('c', 'abc') //=> true - * R.endsWith('b', 'abc') //=> false - * R.endsWith(['c'], ['a', 'b', 'c']) //=> true - * R.endsWith(['b'], ['a', 'b', 'c']) //=> false - */ - -var endsWith = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (suffix, list) { - return (0,_equals_js__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_takeLast_js__WEBPACK_IMPORTED_MODULE_2__["default"])(suffix.length, list), suffix); -}); -/* harmony default export */ __webpack_exports__["default"] = (endsWith); - -/***/ }), - -/***/ "./node_modules/ramda/es/eqBy.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/eqBy.js ***! - \***************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _equals_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./equals.js */ "./node_modules/ramda/es/equals.js"); - - -/** - * Takes a function and two values in its domain and returns `true` if the - * values map to the same value in the codomain; `false` otherwise. + * var object = { + * 'a': [{ 'b': 2 }, { 'd': 4 }] + * }; * - * @func - * @memberOf R - * @since v0.18.0 - * @category Relation - * @sig (a -> b) -> a -> a -> Boolean - * @param {Function} f - * @param {*} x - * @param {*} y - * @return {Boolean} - * @example + * var other = { + * 'a': [{ 'c': 3 }, { 'e': 5 }] + * }; * - * R.eqBy(Math.abs, 5, -5); //=> true + * _.merge(object, other); + * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } */ - -var eqBy = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function eqBy(f, x, y) { - return (0,_equals_js__WEBPACK_IMPORTED_MODULE_1__["default"])(f(x), f(y)); +var merge = createAssigner(function(object, source, srcIndex) { + baseMerge(object, source, srcIndex); }); -/* harmony default export */ __webpack_exports__["default"] = (eqBy); -/***/ }), +module.exports = merge; -/***/ "./node_modules/ramda/es/eqProps.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/eqProps.js ***! - \******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _equals_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./equals.js */ "./node_modules/ramda/es/equals.js"); +/***/ }), + +/***/ "./node_modules/lodash/min.js": +/*!************************************!*\ + !*** ./node_modules/lodash/min.js ***! + \************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var baseExtremum = __webpack_require__(/*! ./_baseExtremum */ "./node_modules/lodash/_baseExtremum.js"), + baseLt = __webpack_require__(/*! ./_baseLt */ "./node_modules/lodash/_baseLt.js"), + identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js"); /** - * Reports whether two objects have the same value, in [`R.equals`](#equals) - * terms, for the specified property. Useful as a curried predicate. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Object - * @sig k -> {k: v} -> {k: v} -> Boolean - * @param {String} prop The name of the property to compare - * @param {Object} obj1 - * @param {Object} obj2 - * @return {Boolean} + * Computes the minimum value of `array`. If `array` is empty or falsey, + * `undefined` is returned. * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Math + * @param {Array} array The array to iterate over. + * @returns {*} Returns the minimum value. * @example * - * const o1 = { a: 1, b: 2, c: 3, d: 4 }; - * const o2 = { a: 10, b: 20, c: 3, d: 40 }; - * R.eqProps('a', o1, o2); //=> false - * R.eqProps('c', o1, o2); //=> true + * _.min([4, 2, 8, 6]); + * // => 2 + * + * _.min([]); + * // => undefined */ +function min(array) { + return (array && array.length) + ? baseExtremum(array, identity, baseLt) + : undefined; +} -var eqProps = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function eqProps(prop, obj1, obj2) { - return (0,_equals_js__WEBPACK_IMPORTED_MODULE_1__["default"])(obj1[prop], obj2[prop]); -}); -/* harmony default export */ __webpack_exports__["default"] = (eqProps); +module.exports = min; -/***/ }), -/***/ "./node_modules/ramda/es/equals.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/equals.js ***! - \*****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ }), -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_equals_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_equals.js */ "./node_modules/ramda/es/internal/_equals.js"); +/***/ "./node_modules/lodash/minBy.js": +/*!**************************************!*\ + !*** ./node_modules/lodash/minBy.js ***! + \**************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var baseExtremum = __webpack_require__(/*! ./_baseExtremum */ "./node_modules/lodash/_baseExtremum.js"), + baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), + baseLt = __webpack_require__(/*! ./_baseLt */ "./node_modules/lodash/_baseLt.js"); /** - * Returns `true` if its arguments are equivalent, `false` otherwise. Handles - * cyclical data structures. - * - * Dispatches symmetrically to the `equals` methods of both arguments, if - * present. + * This method is like `_.min` except that it accepts `iteratee` which is + * invoked for each element in `array` to generate the criterion by which + * the value is ranked. The iteratee is invoked with one argument: (value). * - * @func - * @memberOf R - * @since v0.15.0 - * @category Relation - * @sig a -> b -> Boolean - * @param {*} a - * @param {*} b - * @return {Boolean} + * @static + * @memberOf _ + * @since 4.0.0 + * @category Math + * @param {Array} array The array to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {*} Returns the minimum value. * @example * - * R.equals(1, 1); //=> true - * R.equals(1, '1'); //=> false - * R.equals([1, 2, 3], [1, 2, 3]); //=> true + * var objects = [{ 'n': 1 }, { 'n': 2 }]; * - * const a = {}; a.v = a; - * const b = {}; b.v = b; - * R.equals(a, b); //=> true - */ - -var equals = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function equals(a, b) { - return (0,_internal_equals_js__WEBPACK_IMPORTED_MODULE_1__["default"])(a, b, [], []); -}); -/* harmony default export */ __webpack_exports__["default"] = (equals); - -/***/ }), + * _.minBy(objects, function(o) { return o.n; }); + * // => { 'n': 1 } + * + * // The `_.property` iteratee shorthand. + * _.minBy(objects, 'n'); + * // => { 'n': 1 } + */ +function minBy(array, iteratee) { + return (array && array.length) + ? baseExtremum(array, baseIteratee(iteratee, 2), baseLt) + : undefined; +} -/***/ "./node_modules/ramda/es/evolve.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/evolve.js ***! - \*****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +module.exports = minBy; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); -/* harmony import */ var _internal_isObject_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_isObject.js */ "./node_modules/ramda/es/internal/_isObject.js"); +/***/ }), +/***/ "./node_modules/lodash/noop.js": +/*!*************************************!*\ + !*** ./node_modules/lodash/noop.js ***! + \*************************************/ +/***/ (function(module) { /** - * Creates a new object by recursively evolving a shallow copy of `object`, - * according to the `transformation` functions. All non-primitive properties - * are copied by reference. - * - * A `transformation` function will not be invoked if its corresponding key - * does not exist in the evolved object. + * This method returns `undefined`. * - * @func - * @memberOf R - * @since v0.9.0 - * @category Object - * @sig {k: (v -> v)} -> {k: v} -> {k: v} - * @param {Object} transformations The object specifying transformation functions to apply - * to the object. - * @param {Object} object The object to be transformed. - * @return {Object} The transformed object. + * @static + * @memberOf _ + * @since 2.3.0 + * @category Util * @example * - * const tomato = {firstName: ' Tomato ', data: {elapsed: 100, remaining: 1400}, id:123}; - * const transformations = { - * firstName: R.trim, - * lastName: R.trim, // Will not get invoked. - * data: {elapsed: R.add(1), remaining: R.add(-1)} - * }; - * R.evolve(transformations, tomato); //=> {firstName: 'Tomato', data: {elapsed: 101, remaining: 1399}, id:123} + * _.times(2, _.noop); + * // => [undefined, undefined] */ +function noop() { + // No operation performed. +} + +module.exports = noop; -var evolve = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function evolve(transformations, object) { - if (!(0,_internal_isObject_js__WEBPACK_IMPORTED_MODULE_2__["default"])(object) && !(0,_internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object)) { - return object; - } - var result = object instanceof Array ? [] : {}; - var transformation, key, type; - for (key in object) { - transformation = transformations[key]; - type = typeof transformation; - result[key] = type === 'function' ? transformation(object[key]) : transformation && type === 'object' ? evolve(transformation, object[key]) : object[key]; - } - return result; -}); -/* harmony default export */ __webpack_exports__["default"] = (evolve); /***/ }), -/***/ "./node_modules/ramda/es/filter.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/filter.js ***! - \*****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/now.js": +/*!************************************!*\ + !*** ./node_modules/lodash/now.js ***! + \************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_arrayReduce_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_arrayReduce.js */ "./node_modules/ramda/es/internal/_arrayReduce.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_filter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_filter.js */ "./node_modules/ramda/es/internal/_filter.js"); -/* harmony import */ var _internal_isObject_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./internal/_isObject.js */ "./node_modules/ramda/es/internal/_isObject.js"); -/* harmony import */ var _internal_xfilter_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./internal/_xfilter.js */ "./node_modules/ramda/es/internal/_xfilter.js"); -/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./keys.js */ "./node_modules/ramda/es/keys.js"); +var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); +/** + * Gets the timestamp of the number of milliseconds that have elapsed since + * the Unix epoch (1 January 1970 00:00:00 UTC). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Date + * @returns {number} Returns the timestamp. + * @example + * + * _.defer(function(stamp) { + * console.log(_.now() - stamp); + * }, _.now()); + * // => Logs the number of milliseconds it took for the deferred invocation. + */ +var now = function() { + return root.Date.now(); +}; +module.exports = now; +/***/ }), +/***/ "./node_modules/lodash/pick.js": +/*!*************************************!*\ + !*** ./node_modules/lodash/pick.js ***! + \*************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var basePick = __webpack_require__(/*! ./_basePick */ "./node_modules/lodash/_basePick.js"), + flatRest = __webpack_require__(/*! ./_flatRest */ "./node_modules/lodash/_flatRest.js"); /** - * Takes a predicate and a `Filterable`, and returns a new filterable of the - * same type containing the members of the given filterable which satisfy the - * given predicate. Filterable objects include plain objects or any object - * that has a filter method such as `Array`. - * - * Dispatches to the `filter` method of the second argument, if present. - * - * Acts as a transducer if a transformer is given in list position. + * Creates an object composed of the picked `object` properties. * - * @func - * @memberOf R - * @since v0.1.0 - * @category List + * @static + * @since 0.1.0 + * @memberOf _ * @category Object - * @sig Filterable f => (a -> Boolean) -> f a -> f a - * @param {Function} pred - * @param {Array} filterable - * @return {Array} Filterable - * @see R.reject, R.transduce, R.addIndex + * @param {Object} object The source object. + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Object} Returns the new object. * @example * - * const isEven = n => n % 2 === 0; - * - * R.filter(isEven, [1, 2, 3, 4]); //=> [2, 4] + * var object = { 'a': 1, 'b': '2', 'c': 3 }; * - * R.filter(isEven, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4} + * _.pick(object, ['a', 'c']); + * // => { 'a': 1, 'c': 3 } */ +var pick = flatRest(function(object, paths) { + return object == null ? {} : basePick(object, paths); +}); -var filter = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_2__["default"])(['fantasy-land/filter', 'filter'], _internal_xfilter_js__WEBPACK_IMPORTED_MODULE_5__["default"], function (pred, filterable) { - return (0,_internal_isObject_js__WEBPACK_IMPORTED_MODULE_4__["default"])(filterable) ? (0,_internal_arrayReduce_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (acc, key) { - if (pred(filterable[key])) { - acc[key] = filterable[key]; - } - return acc; - }, {}, (0,_keys_js__WEBPACK_IMPORTED_MODULE_6__["default"])(filterable)) : - // else - (0,_internal_filter_js__WEBPACK_IMPORTED_MODULE_3__["default"])(pred, filterable); -})); -/* harmony default export */ __webpack_exports__["default"] = (filter); - -/***/ }), +module.exports = pick; -/***/ "./node_modules/ramda/es/find.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/find.js ***! - \***************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_xfind_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xfind.js */ "./node_modules/ramda/es/internal/_xfind.js"); +/***/ }), +/***/ "./node_modules/lodash/property.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/property.js ***! + \*****************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var baseProperty = __webpack_require__(/*! ./_baseProperty */ "./node_modules/lodash/_baseProperty.js"), + basePropertyDeep = __webpack_require__(/*! ./_basePropertyDeep */ "./node_modules/lodash/_basePropertyDeep.js"), + isKey = __webpack_require__(/*! ./_isKey */ "./node_modules/lodash/_isKey.js"), + toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js"); /** - * Returns the first element of the list which matches the predicate, or - * `undefined` if no element matches. + * Creates a function that returns the value at `path` of a given object. * - * Dispatches to the `find` method of the second argument, if present. + * @static + * @memberOf _ + * @since 2.4.0 + * @category Util + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new accessor function. + * @example * - * Acts as a transducer if a transformer is given in list position. + * var objects = [ + * { 'a': { 'b': 2 } }, + * { 'a': { 'b': 1 } } + * ]; * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig (a -> Boolean) -> [a] -> a | undefined - * @param {Function} fn The predicate function used to determine if the element is the - * desired one. - * @param {Array} list The array to consider. - * @return {Object} The element found, or `undefined`. - * @see R.transduce - * @example + * _.map(objects, _.property('a.b')); + * // => [2, 1] * - * const xs = [{a: 1}, {a: 2}, {a: 3}]; - * R.find(R.propEq('a', 2))(xs); //=> {a: 2} - * R.find(R.propEq('a', 4))(xs); //=> undefined + * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b'); + * // => [1, 2] */ +function property(path) { + return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path); +} -var find = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])(['find'], _internal_xfind_js__WEBPACK_IMPORTED_MODULE_2__["default"], function find(fn, list) { - var idx = 0; - var len = list.length; - while (idx < len) { - if (fn(list[idx])) { - return list[idx]; - } - idx += 1; - } -})); -/* harmony default export */ __webpack_exports__["default"] = (find); - -/***/ }), +module.exports = property; -/***/ "./node_modules/ramda/es/findIndex.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/findIndex.js ***! - \********************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_xfindIndex_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xfindIndex.js */ "./node_modules/ramda/es/internal/_xfindIndex.js"); +/***/ }), +/***/ "./node_modules/lodash/range.js": +/*!**************************************!*\ + !*** ./node_modules/lodash/range.js ***! + \**************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var createRange = __webpack_require__(/*! ./_createRange */ "./node_modules/lodash/_createRange.js"); /** - * Returns the index of the first element of the list which matches the - * predicate, or `-1` if no element matches. + * Creates an array of numbers (positive and/or negative) progressing from + * `start` up to, but not including, `end`. A step of `-1` is used if a negative + * `start` is specified without an `end` or `step`. If `end` is not specified, + * it's set to `start` with `start` then set to `0`. * - * Acts as a transducer if a transformer is given in list position. + * **Note:** JavaScript follows the IEEE-754 standard for resolving + * floating-point values which can produce unexpected results. * - * @func - * @memberOf R - * @since v0.1.1 - * @category List - * @sig (a -> Boolean) -> [a] -> Number - * @param {Function} fn The predicate function used to determine if the element is the - * desired one. - * @param {Array} list The array to consider. - * @return {Number} The index of the element found, or `-1`. - * @see R.transduce, R.indexOf + * @static + * @since 0.1.0 + * @memberOf _ + * @category Util + * @param {number} [start=0] The start of the range. + * @param {number} end The end of the range. + * @param {number} [step=1] The value to increment or decrement by. + * @returns {Array} Returns the range of numbers. + * @see _.inRange, _.rangeRight * @example * - * const xs = [{a: 1}, {a: 2}, {a: 3}]; - * R.findIndex(R.propEq('a', 2))(xs); //=> 1 - * R.findIndex(R.propEq('a', 4))(xs); //=> -1 + * _.range(4); + * // => [0, 1, 2, 3] + * + * _.range(-4); + * // => [0, -1, -2, -3] + * + * _.range(1, 5); + * // => [1, 2, 3, 4] + * + * _.range(0, 20, 5); + * // => [0, 5, 10, 15] + * + * _.range(0, -4, -1); + * // => [0, -1, -2, -3] + * + * _.range(1, 4, 0); + * // => [1, 1, 1] + * + * _.range(0); + * // => [] */ +var range = createRange(); -var findIndex = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])([], _internal_xfindIndex_js__WEBPACK_IMPORTED_MODULE_2__["default"], function findIndex(fn, list) { - var idx = 0; - var len = list.length; - while (idx < len) { - if (fn(list[idx])) { - return idx; - } - idx += 1; - } - return -1; -})); -/* harmony default export */ __webpack_exports__["default"] = (findIndex); - -/***/ }), +module.exports = range; -/***/ "./node_modules/ramda/es/findLast.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/findLast.js ***! - \*******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_xfindLast_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xfindLast.js */ "./node_modules/ramda/es/internal/_xfindLast.js"); +/***/ }), +/***/ "./node_modules/lodash/reduce.js": +/*!***************************************!*\ + !*** ./node_modules/lodash/reduce.js ***! + \***************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var arrayReduce = __webpack_require__(/*! ./_arrayReduce */ "./node_modules/lodash/_arrayReduce.js"), + baseEach = __webpack_require__(/*! ./_baseEach */ "./node_modules/lodash/_baseEach.js"), + baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), + baseReduce = __webpack_require__(/*! ./_baseReduce */ "./node_modules/lodash/_baseReduce.js"), + isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"); /** - * Returns the last element of the list which matches the predicate, or - * `undefined` if no element matches. + * Reduces `collection` to a value which is the accumulated result of running + * each element in `collection` thru `iteratee`, where each successive + * invocation is supplied the return value of the previous. If `accumulator` + * is not given, the first element of `collection` is used as the initial + * value. The iteratee is invoked with four arguments: + * (accumulator, value, index|key, collection). * - * Acts as a transducer if a transformer is given in list position. + * Many lodash methods are guarded to work as iteratees for methods like + * `_.reduce`, `_.reduceRight`, and `_.transform`. * - * @func - * @memberOf R - * @since v0.1.1 - * @category List - * @sig (a -> Boolean) -> [a] -> a | undefined - * @param {Function} fn The predicate function used to determine if the element is the - * desired one. - * @param {Array} list The array to consider. - * @return {Object} The element found, or `undefined`. - * @see R.transduce + * The guarded methods are: + * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, + * and `sortBy` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @returns {*} Returns the accumulated value. + * @see _.reduceRight * @example * - * const xs = [{a: 1, b: 0}, {a:1, b: 1}]; - * R.findLast(R.propEq('a', 1))(xs); //=> {a: 1, b: 1} - * R.findLast(R.propEq('a', 4))(xs); //=> undefined + * _.reduce([1, 2], function(sum, n) { + * return sum + n; + * }, 0); + * // => 3 + * + * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { + * (result[value] || (result[value] = [])).push(key); + * return result; + * }, {}); + * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed) */ +function reduce(collection, iteratee, accumulator) { + var func = isArray(collection) ? arrayReduce : baseReduce, + initAccum = arguments.length < 3; -var findLast = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])([], _internal_xfindLast_js__WEBPACK_IMPORTED_MODULE_2__["default"], function findLast(fn, list) { - var idx = list.length - 1; - while (idx >= 0) { - if (fn(list[idx])) { - return list[idx]; - } - idx -= 1; - } -})); -/* harmony default export */ __webpack_exports__["default"] = (findLast); + return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach); +} -/***/ }), +module.exports = reduce; -/***/ "./node_modules/ramda/es/findLastIndex.js": -/*!************************************************!*\ - !*** ./node_modules/ramda/es/findLastIndex.js ***! - \************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_xfindLastIndex_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xfindLastIndex.js */ "./node_modules/ramda/es/internal/_xfindLastIndex.js"); +/***/ }), +/***/ "./node_modules/lodash/set.js": +/*!************************************!*\ + !*** ./node_modules/lodash/set.js ***! + \************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var baseSet = __webpack_require__(/*! ./_baseSet */ "./node_modules/lodash/_baseSet.js"); /** - * Returns the index of the last element of the list which matches the - * predicate, or `-1` if no element matches. + * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, + * it's created. Arrays are created for missing index properties while objects + * are created for all other missing properties. Use `_.setWith` to customize + * `path` creation. * - * Acts as a transducer if a transformer is given in list position. + * **Note:** This method mutates `object`. * - * @func - * @memberOf R - * @since v0.1.1 - * @category List - * @sig (a -> Boolean) -> [a] -> Number - * @param {Function} fn The predicate function used to determine if the element is the - * desired one. - * @param {Array} list The array to consider. - * @return {Number} The index of the element found, or `-1`. - * @see R.transduce, R.lastIndexOf + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @returns {Object} Returns `object`. * @example * - * const xs = [{a: 1, b: 0}, {a:1, b: 1}]; - * R.findLastIndex(R.propEq('a', 1))(xs); //=> 1 - * R.findLastIndex(R.propEq('a', 4))(xs); //=> -1 + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.set(object, 'a[0].b.c', 4); + * console.log(object.a[0].b.c); + * // => 4 + * + * _.set(object, ['x', '0', 'y', 'z'], 5); + * console.log(object.x[0].y.z); + * // => 5 */ +function set(object, path, value) { + return object == null ? object : baseSet(object, path, value); +} + +module.exports = set; -var findLastIndex = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])([], _internal_xfindLastIndex_js__WEBPACK_IMPORTED_MODULE_2__["default"], function findLastIndex(fn, list) { - var idx = list.length - 1; - while (idx >= 0) { - if (fn(list[idx])) { - return idx; - } - idx -= 1; - } - return -1; -})); -/* harmony default export */ __webpack_exports__["default"] = (findLastIndex); /***/ }), -/***/ "./node_modules/ramda/es/flatten.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/flatten.js ***! - \******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/size.js": +/*!*************************************!*\ + !*** ./node_modules/lodash/size.js ***! + \*************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _internal_makeFlat_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_makeFlat.js */ "./node_modules/ramda/es/internal/_makeFlat.js"); +var baseKeys = __webpack_require__(/*! ./_baseKeys */ "./node_modules/lodash/_baseKeys.js"), + getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"), + isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"), + isString = __webpack_require__(/*! ./isString */ "./node_modules/lodash/isString.js"), + stringSize = __webpack_require__(/*! ./_stringSize */ "./node_modules/lodash/_stringSize.js"); +/** `Object#toString` result references. */ +var mapTag = '[object Map]', + setTag = '[object Set]'; /** - * Returns a new list by pulling every item out of it (and all its sub-arrays) - * and putting them in a new array, depth-first. + * Gets the size of `collection` by returning its length for array-like + * values or the number of own enumerable string keyed properties for objects. * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig [a] -> [b] - * @param {Array} list The array to consider. - * @return {Array} The flattened list. - * @see R.unnest + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @returns {number} Returns the collection size. * @example * - * R.flatten([1, 2, [3, 4], 5, [6, [7, 8, [9, [10, 11], 12]]]]); - * //=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] + * _.size([1, 2, 3]); + * // => 3 + * + * _.size({ 'a': 1, 'b': 2 }); + * // => 2 + * + * _.size('pebbles'); + * // => 7 */ +function size(collection) { + if (collection == null) { + return 0; + } + if (isArrayLike(collection)) { + return isString(collection) ? stringSize(collection) : collection.length; + } + var tag = getTag(collection); + if (tag == mapTag || tag == setTag) { + return collection.size; + } + return baseKeys(collection).length; +} + +module.exports = size; -var flatten = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ -(0,_internal_makeFlat_js__WEBPACK_IMPORTED_MODULE_1__["default"])(true)); -/* harmony default export */ __webpack_exports__["default"] = (flatten); /***/ }), -/***/ "./node_modules/ramda/es/flip.js": +/***/ "./node_modules/lodash/sortBy.js": /*!***************************************!*\ - !*** ./node_modules/ramda/es/flip.js ***! + !*** ./node_modules/lodash/sortBy.js ***! \***************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./curryN.js */ "./node_modules/ramda/es/curryN.js"); +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var baseFlatten = __webpack_require__(/*! ./_baseFlatten */ "./node_modules/lodash/_baseFlatten.js"), + baseOrderBy = __webpack_require__(/*! ./_baseOrderBy */ "./node_modules/lodash/_baseOrderBy.js"), + baseRest = __webpack_require__(/*! ./_baseRest */ "./node_modules/lodash/_baseRest.js"), + isIterateeCall = __webpack_require__(/*! ./_isIterateeCall */ "./node_modules/lodash/_isIterateeCall.js"); /** - * Returns a new function much like the supplied one, except that the first two - * arguments' order is reversed. + * Creates an array of elements, sorted in ascending order by the results of + * running each element in a collection thru each iteratee. This method + * performs a stable sort, that is, it preserves the original sort order of + * equal elements. The iteratees are invoked with one argument: (value). * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig ((a, b, c, ...) -> z) -> (b -> a -> c -> ... -> z) - * @param {Function} fn The function to invoke with its first two parameters reversed. - * @return {*} The result of invoking `fn` with its first two parameters' order reversed. + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {...(Function|Function[])} [iteratees=[_.identity]] + * The iteratees to sort by. + * @returns {Array} Returns the new sorted array. * @example * - * const mergeThree = (a, b, c) => [].concat(a, b, c); + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 30 }, + * { 'user': 'barney', 'age': 34 } + * ]; * - * mergeThree(1, 2, 3); //=> [1, 2, 3] + * _.sortBy(users, [function(o) { return o.user; }]); + * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]] * - * R.flip(mergeThree)(1, 2, 3); //=> [2, 1, 3] - * @symb R.flip(f)(a, b, c) = f(b, a, c) + * _.sortBy(users, ['user', 'age']); + * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]] */ - -var flip = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function flip(fn) { - return (0,_curryN_js__WEBPACK_IMPORTED_MODULE_1__["default"])(fn.length, function (a, b) { - var args = Array.prototype.slice.call(arguments, 0); - args[0] = b; - args[1] = a; - return fn.apply(this, args); - }); +var sortBy = baseRest(function(collection, iteratees) { + if (collection == null) { + return []; + } + var length = iteratees.length; + if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) { + iteratees = []; + } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) { + iteratees = [iteratees[0]]; + } + return baseOrderBy(collection, baseFlatten(iteratees, 1), []); }); -/* harmony default export */ __webpack_exports__["default"] = (flip); + +module.exports = sortBy; + /***/ }), -/***/ "./node_modules/ramda/es/forEach.js": +/***/ "./node_modules/lodash/stubArray.js": /*!******************************************!*\ - !*** ./node_modules/ramda/es/forEach.js ***! + !*** ./node_modules/lodash/stubArray.js ***! \******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_checkForMethod_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_checkForMethod.js */ "./node_modules/ramda/es/internal/_checkForMethod.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); - +/***/ (function(module) { /** - * Iterate over an input `list`, calling a provided function `fn` for each - * element in the list. - * - * `fn` receives one argument: *(value)*. - * - * Note: `R.forEach` does not skip deleted or unassigned indices (sparse - * arrays), unlike the native `Array.prototype.forEach` method. For more - * details on this behavior, see: - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Description + * This method returns a new empty array. * - * Also note that, unlike `Array.prototype.forEach`, Ramda's `forEach` returns - * the original array. In some libraries this function is named `each`. + * @static + * @memberOf _ + * @since 4.13.0 + * @category Util + * @returns {Array} Returns the new empty array. + * @example * - * Dispatches to the `forEach` method of the second argument, if present. + * var arrays = _.times(2, _.stubArray); * - * @func - * @memberOf R - * @since v0.1.1 - * @category List - * @sig (a -> *) -> [a] -> [a] - * @param {Function} fn The function to invoke. Receives one argument, `value`. - * @param {Array} list The list to iterate over. - * @return {Array} The original list. - * @see R.addIndex - * @example + * console.log(arrays); + * // => [[], []] * - * const printXPlusFive = x => console.log(x + 5); - * R.forEach(printXPlusFive, [1, 2, 3]); //=> [1, 2, 3] - * // logs 6 - * // logs 7 - * // logs 8 - * @symb R.forEach(f, [a, b, c]) = [a, b, c] + * console.log(arrays[0] === arrays[1]); + * // => false */ +function stubArray() { + return []; +} -var forEach = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])( /*#__PURE__*/ -(0,_internal_checkForMethod_js__WEBPACK_IMPORTED_MODULE_0__["default"])('forEach', function forEach(fn, list) { - var len = list.length; - var idx = 0; - while (idx < len) { - fn(list[idx]); - idx += 1; - } - return list; -})); -/* harmony default export */ __webpack_exports__["default"] = (forEach); - -/***/ }), +module.exports = stubArray; -/***/ "./node_modules/ramda/es/forEachObjIndexed.js": -/*!****************************************************!*\ - !*** ./node_modules/ramda/es/forEachObjIndexed.js ***! - \****************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./keys.js */ "./node_modules/ramda/es/keys.js"); +/***/ }), +/***/ "./node_modules/lodash/stubFalse.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/stubFalse.js ***! + \******************************************/ +/***/ (function(module) { /** - * Iterate over an input `object`, calling a provided function `fn` for each - * key and value in the object. - * - * `fn` receives three argument: *(value, key, obj)*. + * This method returns `false`. * - * @func - * @memberOf R - * @since v0.23.0 - * @category Object - * @sig ((a, String, StrMap a) -> Any) -> StrMap a -> StrMap a - * @param {Function} fn The function to invoke. Receives three argument, `value`, `key`, `obj`. - * @param {Object} obj The object to iterate over. - * @return {Object} The original object. + * @static + * @memberOf _ + * @since 4.13.0 + * @category Util + * @returns {boolean} Returns `false`. * @example * - * const printKeyConcatValue = (value, key) => console.log(key + ':' + value); - * R.forEachObjIndexed(printKeyConcatValue, {x: 1, y: 2}); //=> {x: 1, y: 2} - * // logs x:1 - * // logs y:2 - * @symb R.forEachObjIndexed(f, {x: a, y: b}) = {x: a, y: b} + * _.times(2, _.stubFalse); + * // => [false, false] */ +function stubFalse() { + return false; +} + +module.exports = stubFalse; -var forEachObjIndexed = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function forEachObjIndexed(fn, obj) { - var keyList = (0,_keys_js__WEBPACK_IMPORTED_MODULE_1__["default"])(obj); - var idx = 0; - while (idx < keyList.length) { - var key = keyList[idx]; - fn(obj[key], key, obj); - idx += 1; - } - return obj; -}); -/* harmony default export */ __webpack_exports__["default"] = (forEachObjIndexed); /***/ }), -/***/ "./node_modules/ramda/es/fromPairs.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/fromPairs.js ***! - \********************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/toFinite.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/toFinite.js ***! + \*****************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +var toNumber = __webpack_require__(/*! ./toNumber */ "./node_modules/lodash/toNumber.js"); + +/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0, + MAX_INTEGER = 1.7976931348623157e+308; /** - * Creates a new object from a list key-value pairs. If a key appears in - * multiple pairs, the rightmost pair is included in the object. + * Converts `value` to a finite number. * - * @func - * @memberOf R - * @since v0.3.0 - * @category List - * @sig [[k,v]] -> {k: v} - * @param {Array} pairs An array of two-element arrays that will be the keys and values of the output object. - * @return {Object} The object made by pairing up `keys` and `values`. - * @see R.toPairs, R.pair + * @static + * @memberOf _ + * @since 4.12.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted number. * @example * - * R.fromPairs([['a', 1], ['b', 2], ['c', 3]]); //=> {a: 1, b: 2, c: 3} + * _.toFinite(3.2); + * // => 3.2 + * + * _.toFinite(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toFinite(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toFinite('3.2'); + * // => 3.2 */ - -var fromPairs = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function fromPairs(pairs) { - var result = {}; - var idx = 0; - while (idx < pairs.length) { - result[pairs[idx][0]] = pairs[idx][1]; - idx += 1; +function toFinite(value) { + if (!value) { + return value === 0 ? value : 0; } - return result; -}); -/* harmony default export */ __webpack_exports__["default"] = (fromPairs); + value = toNumber(value); + if (value === INFINITY || value === -INFINITY) { + var sign = (value < 0 ? -1 : 1); + return sign * MAX_INTEGER; + } + return value === value ? value : 0; +} + +module.exports = toFinite; + /***/ }), -/***/ "./node_modules/ramda/es/groupBy.js": +/***/ "./node_modules/lodash/toInteger.js": /*!******************************************!*\ - !*** ./node_modules/ramda/es/groupBy.js ***! + !*** ./node_modules/lodash/toInteger.js ***! \******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_checkForMethod_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_checkForMethod.js */ "./node_modules/ramda/es/internal/_checkForMethod.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _reduceBy_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./reduceBy.js */ "./node_modules/ramda/es/reduceBy.js"); - +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var toFinite = __webpack_require__(/*! ./toFinite */ "./node_modules/lodash/toFinite.js"); /** - * Splits a list into sub-lists stored in an object, based on the result of - * calling a key-returning function on each element, and grouping the - * results according to values returned. - * - * Dispatches to the `groupBy` method of the second argument, if present. + * Converts `value` to an integer. * - * Acts as a transducer if a transformer is given in list position. + * **Note:** This method is loosely based on + * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @typedefn Idx = String | Int | Symbol - * @sig Idx a => (b -> a) -> [b] -> {a: [b]} - * @param {Function} fn Function :: a -> Idx - * @param {Array} list The array to group - * @return {Object} An object with the output of `fn` for keys, mapped to arrays of elements - * that produced that key when passed to `fn`. - * @see R.reduceBy, R.transduce, R.indexBy, R.collectBy + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. * @example * - * const byGrade = R.groupBy(function(student) { - * const score = student.score; - * return score < 65 ? 'F' : - * score < 70 ? 'D' : - * score < 80 ? 'C' : - * score < 90 ? 'B' : 'A'; - * }); - * const students = [{name: 'Abby', score: 84}, - * {name: 'Eddy', score: 58}, - * // ... - * {name: 'Jack', score: 69}]; - * byGrade(students); - * // { - * // 'A': [{name: 'Dianne', score: 99}], - * // 'B': [{name: 'Abby', score: 84}] - * // // ..., - * // 'F': [{name: 'Eddy', score: 58}] - * // } + * _.toInteger(3.2); + * // => 3 + * + * _.toInteger(Number.MIN_VALUE); + * // => 0 + * + * _.toInteger(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toInteger('3.2'); + * // => 3 */ +function toInteger(value) { + var result = toFinite(value), + remainder = result % 1; + + return result === result ? (remainder ? result - remainder : result) : 0; +} + +module.exports = toInteger; -var groupBy = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])( /*#__PURE__*/ -(0,_internal_checkForMethod_js__WEBPACK_IMPORTED_MODULE_0__["default"])('groupBy', /*#__PURE__*/ -(0,_reduceBy_js__WEBPACK_IMPORTED_MODULE_2__["default"])(function (acc, item) { - acc.push(item); - return acc; -}, []))); -/* harmony default export */ __webpack_exports__["default"] = (groupBy); /***/ }), -/***/ "./node_modules/ramda/es/groupWith.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/groupWith.js ***! - \********************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/toNumber.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/toNumber.js ***! + \*****************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +var baseTrim = __webpack_require__(/*! ./_baseTrim */ "./node_modules/lodash/_baseTrim.js"), + isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), + isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); -/** - * Takes a list and returns a list of lists where each sublist's elements are - * all satisfied pairwise comparison according to the provided function. - * Only adjacent elements are passed to the comparison function. - * - * @func - * @memberOf R - * @since v0.21.0 - * @category List - * @sig ((a, a) → Boolean) → [a] → [[a]] - * @param {Function} fn Function for determining whether two given (adjacent) - * elements should be in the same group - * @param {Array} list The array to group. Also accepts a string, which will be - * treated as a list of characters. - * @return {List} A list that contains sublists of elements, - * whose concatenations are equal to the original list. - * @example - * - * R.groupWith(R.equals, [0, 1, 1, 2, 3, 5, 8, 13, 21]) - * //=> [[0], [1, 1], [2], [3], [5], [8], [13], [21]] - * - * R.groupWith((a, b) => a + 1 === b, [0, 1, 1, 2, 3, 5, 8, 13, 21]) - * //=> [[0, 1], [1, 2, 3], [5], [8], [13], [21]] - * - * R.groupWith((a, b) => a % 2 === b % 2, [0, 1, 1, 2, 3, 5, 8, 13, 21]) - * //=> [[0], [1, 1], [2], [3, 5], [8], [13, 21]] - * - * const isVowel = R.test(/^[aeiou]$/i); - * R.groupWith(R.eqBy(isVowel), 'aestiou') - * //=> ['ae', 'st', 'iou'] - */ +/** Used as references for various `Number` constants. */ +var NAN = 0 / 0; -var groupWith = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (fn, list) { - var res = []; - var idx = 0; - var len = list.length; - while (idx < len) { - var nextidx = idx + 1; - while (nextidx < len && fn(list[nextidx - 1], list[nextidx])) { - nextidx += 1; - } - res.push(list.slice(idx, nextidx)); - idx = nextidx; - } - return res; -}); -/* harmony default export */ __webpack_exports__["default"] = (groupWith); +/** Used to detect bad signed hexadecimal string values. */ +var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; -/***/ }), +/** Used to detect binary string values. */ +var reIsBinary = /^0b[01]+$/i; -/***/ "./node_modules/ramda/es/gt.js": -/*!*************************************!*\ - !*** ./node_modules/ramda/es/gt.js ***! - \*************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/** Used to detect octal string values. */ +var reIsOctal = /^0o[0-7]+$/i; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/** Built-in method references without a dependency on `root`. */ +var freeParseInt = parseInt; /** - * Returns `true` if the first argument is greater than the second; `false` - * otherwise. + * Converts `value` to a number. * - * @func - * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig Ord a => a -> a -> Boolean - * @param {*} a - * @param {*} b - * @return {Boolean} - * @see R.lt + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {number} Returns the number. * @example * - * R.gt(2, 1); //=> true - * R.gt(2, 2); //=> false - * R.gt(2, 3); //=> false - * R.gt('a', 'z'); //=> false - * R.gt('z', 'a'); //=> true + * _.toNumber(3.2); + * // => 3.2 + * + * _.toNumber(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toNumber(Infinity); + * // => Infinity + * + * _.toNumber('3.2'); + * // => 3.2 */ +function toNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol(value)) { + return NAN; + } + if (isObject(value)) { + var other = typeof value.valueOf == 'function' ? value.valueOf() : value; + value = isObject(other) ? (other + '') : other; + } + if (typeof value != 'string') { + return value === 0 ? value : +value; + } + value = baseTrim(value); + var isBinary = reIsBinary.test(value); + return (isBinary || reIsOctal.test(value)) + ? freeParseInt(value.slice(2), isBinary ? 2 : 8) + : (reIsBadHex.test(value) ? NAN : +value); +} + +module.exports = toNumber; -var gt = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function gt(a, b) { - return a > b; -}); -/* harmony default export */ __webpack_exports__["default"] = (gt); /***/ }), -/***/ "./node_modules/ramda/es/gte.js": -/*!**************************************!*\ - !*** ./node_modules/ramda/es/gte.js ***! - \**************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/toPath.js": +/*!***************************************!*\ + !*** ./node_modules/lodash/toPath.js ***! + \***************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +var arrayMap = __webpack_require__(/*! ./_arrayMap */ "./node_modules/lodash/_arrayMap.js"), + copyArray = __webpack_require__(/*! ./_copyArray */ "./node_modules/lodash/_copyArray.js"), + isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), + isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"), + stringToPath = __webpack_require__(/*! ./_stringToPath */ "./node_modules/lodash/_stringToPath.js"), + toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js"), + toString = __webpack_require__(/*! ./toString */ "./node_modules/lodash/toString.js"); /** - * Returns `true` if the first argument is greater than or equal to the second; - * `false` otherwise. + * Converts `value` to a property path array. * - * @func - * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig Ord a => a -> a -> Boolean - * @param {Number} a - * @param {Number} b - * @return {Boolean} - * @see R.lte + * @static + * @memberOf _ + * @since 4.0.0 + * @category Util + * @param {*} value The value to convert. + * @returns {Array} Returns the new property path array. * @example * - * R.gte(2, 1); //=> true - * R.gte(2, 2); //=> true - * R.gte(2, 3); //=> false - * R.gte('a', 'z'); //=> false - * R.gte('z', 'a'); //=> true + * _.toPath('a.b.c'); + * // => ['a', 'b', 'c'] + * + * _.toPath('a[0].b.c'); + * // => ['a', '0', 'b', 'c'] */ +function toPath(value) { + if (isArray(value)) { + return arrayMap(value, toKey); + } + return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value))); +} -var gte = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function gte(a, b) { - return a >= b; -}); -/* harmony default export */ __webpack_exports__["default"] = (gte); +module.exports = toPath; -/***/ }), -/***/ "./node_modules/ramda/es/has.js": -/*!**************************************!*\ - !*** ./node_modules/ramda/es/has.js ***! - \**************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ }), -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _hasPath_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./hasPath.js */ "./node_modules/ramda/es/hasPath.js"); +/***/ "./node_modules/lodash/toPlainObject.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash/toPlainObject.js ***! + \**********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var copyObject = __webpack_require__(/*! ./_copyObject */ "./node_modules/lodash/_copyObject.js"), + keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js"); /** - * Returns whether or not an object has an own property with the specified name + * Converts `value` to a plain object flattening inherited enumerable string + * keyed properties of `value` to own properties of the plain object. * - * @func - * @memberOf R - * @since v0.7.0 - * @category Object - * @sig s -> {s: x} -> Boolean - * @param {String} prop The name of the property to check for. - * @param {Object} obj The object to query. - * @return {Boolean} Whether the property exists. + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {Object} Returns the converted plain object. * @example * - * const hasName = R.has('name'); - * hasName({name: 'alice'}); //=> true - * hasName({name: 'bob'}); //=> true - * hasName({}); //=> false + * function Foo() { + * this.b = 2; + * } + * + * Foo.prototype.c = 3; * - * const point = {x: 0, y: 0}; - * const pointHas = R.has(R.__, point); - * pointHas('x'); //=> true - * pointHas('y'); //=> true - * pointHas('z'); //=> false + * _.assign({ 'a': 1 }, new Foo); + * // => { 'a': 1, 'b': 2 } + * + * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); + * // => { 'a': 1, 'b': 2, 'c': 3 } */ +function toPlainObject(value) { + return copyObject(value, keysIn(value)); +} -var has = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function has(prop, obj) { - return (0,_hasPath_js__WEBPACK_IMPORTED_MODULE_1__["default"])([prop], obj); -}); -/* harmony default export */ __webpack_exports__["default"] = (has); +module.exports = toPlainObject; -/***/ }), -/***/ "./node_modules/ramda/es/hasIn.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/hasIn.js ***! - \****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ }), -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _isNil_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isNil.js */ "./node_modules/ramda/es/isNil.js"); +/***/ "./node_modules/lodash/toString.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/toString.js ***! + \*****************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var baseToString = __webpack_require__(/*! ./_baseToString */ "./node_modules/lodash/_baseToString.js"); /** - * Returns whether or not an object or its prototype chain has a property with - * the specified name + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. * - * @func - * @memberOf R - * @since v0.7.0 - * @category Object - * @sig s -> {s: x} -> Boolean - * @param {String} prop The name of the property to check for. - * @param {Object} obj The object to query. - * @return {Boolean} Whether the property exists. + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. * @example * - * function Rectangle(width, height) { - * this.width = width; - * this.height = height; - * } - * Rectangle.prototype.area = function() { - * return this.width * this.height; - * }; + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' * - * const square = new Rectangle(2, 2); - * R.hasIn('width', square); //=> true - * R.hasIn('area', square); //=> true + * _.toString([1, 2, 3]); + * // => '1,2,3' */ +function toString(value) { + return value == null ? '' : baseToString(value); +} + +module.exports = toString; -var hasIn = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function hasIn(prop, obj) { - if ((0,_isNil_js__WEBPACK_IMPORTED_MODULE_1__["default"])(obj)) { - return false; - } - return prop in obj; -}); -/* harmony default export */ __webpack_exports__["default"] = (hasIn); /***/ }), -/***/ "./node_modules/ramda/es/hasPath.js": +/***/ "./node_modules/lodash/transform.js": /*!******************************************!*\ - !*** ./node_modules/ramda/es/hasPath.js ***! + !*** ./node_modules/lodash/transform.js ***! \******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_has_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_has.js */ "./node_modules/ramda/es/internal/_has.js"); -/* harmony import */ var _isNil_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isNil.js */ "./node_modules/ramda/es/isNil.js"); - +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var arrayEach = __webpack_require__(/*! ./_arrayEach */ "./node_modules/lodash/_arrayEach.js"), + baseCreate = __webpack_require__(/*! ./_baseCreate */ "./node_modules/lodash/_baseCreate.js"), + baseForOwn = __webpack_require__(/*! ./_baseForOwn */ "./node_modules/lodash/_baseForOwn.js"), + baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), + getPrototype = __webpack_require__(/*! ./_getPrototype */ "./node_modules/lodash/_getPrototype.js"), + isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), + isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"), + isFunction = __webpack_require__(/*! ./isFunction */ "./node_modules/lodash/isFunction.js"), + isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), + isTypedArray = __webpack_require__(/*! ./isTypedArray */ "./node_modules/lodash/isTypedArray.js"); /** - * Returns whether or not a path exists in an object. Only the object's - * own properties are checked. + * An alternative to `_.reduce`; this method transforms `object` to a new + * `accumulator` object which is the result of running each of its own + * enumerable string keyed properties thru `iteratee`, with each invocation + * potentially mutating the `accumulator` object. If `accumulator` is not + * provided, a new object with the same `[[Prototype]]` will be used. The + * iteratee is invoked with four arguments: (accumulator, value, key, object). + * Iteratee functions may exit iteration early by explicitly returning `false`. * - * @func - * @memberOf R - * @since v0.26.0 + * @static + * @memberOf _ + * @since 1.3.0 * @category Object - * @typedefn Idx = String | Int | Symbol - * @sig [Idx] -> {a} -> Boolean - * @param {Array} path The path to use. - * @param {Object} obj The object to check the path in. - * @return {Boolean} Whether the path exists. - * @see R.has + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The custom accumulator value. + * @returns {*} Returns the accumulated value. * @example * - * R.hasPath(['a', 'b'], {a: {b: 2}}); // => true - * R.hasPath(['a', 'b'], {a: {b: undefined}}); // => true - * R.hasPath(['a', 'b'], {a: {c: 2}}); // => false - * R.hasPath(['a', 'b'], {}); // => false + * _.transform([2, 3, 4], function(result, n) { + * result.push(n *= n); + * return n % 2 == 0; + * }, []); + * // => [4, 9] + * + * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { + * (result[value] || (result[value] = [])).push(key); + * }, {}); + * // => { '1': ['a', 'c'], '2': ['b'] } */ +function transform(object, iteratee, accumulator) { + var isArr = isArray(object), + isArrLike = isArr || isBuffer(object) || isTypedArray(object); -var hasPath = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function hasPath(_path, obj) { - if (_path.length === 0 || (0,_isNil_js__WEBPACK_IMPORTED_MODULE_2__["default"])(obj)) { - return false; - } - var val = obj; - var idx = 0; - while (idx < _path.length) { - if (!(0,_isNil_js__WEBPACK_IMPORTED_MODULE_2__["default"])(val) && (0,_internal_has_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_path[idx], val)) { - val = val[_path[idx]]; - idx += 1; - } else { - return false; + iteratee = baseIteratee(iteratee, 4); + if (accumulator == null) { + var Ctor = object && object.constructor; + if (isArrLike) { + accumulator = isArr ? new Ctor : []; + } + else if (isObject(object)) { + accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {}; + } + else { + accumulator = {}; } } - return true; -}); -/* harmony default export */ __webpack_exports__["default"] = (hasPath); - -/***/ }), - -/***/ "./node_modules/ramda/es/head.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/head.js ***! - \***************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _nth_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./nth.js */ "./node_modules/ramda/es/nth.js"); + (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) { + return iteratee(accumulator, value, index, object); + }); + return accumulator; +} -/** - * Returns the first element of the given list or string. In some libraries - * this function is named `first`. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig [a] -> a | Undefined - * @sig String -> String - * @param {Array|String} list - * @return {*} - * @see R.tail, R.init, R.last - * @example - * - * R.head(['fi', 'fo', 'fum']); //=> 'fi' - * R.head([]); //=> undefined - * - * R.head('abc'); //=> 'a' - * R.head(''); //=> '' - */ +module.exports = transform; -var head = /*#__PURE__*/ -(0,_nth_js__WEBPACK_IMPORTED_MODULE_0__["default"])(0); -/* harmony default export */ __webpack_exports__["default"] = (head); /***/ }), -/***/ "./node_modules/ramda/es/identical.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/identical.js ***! - \********************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/union.js": +/*!**************************************!*\ + !*** ./node_modules/lodash/union.js ***! + \**************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_objectIs_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_objectIs.js */ "./node_modules/ramda/es/internal/_objectIs.js"); +var baseFlatten = __webpack_require__(/*! ./_baseFlatten */ "./node_modules/lodash/_baseFlatten.js"), + baseRest = __webpack_require__(/*! ./_baseRest */ "./node_modules/lodash/_baseRest.js"), + baseUniq = __webpack_require__(/*! ./_baseUniq */ "./node_modules/lodash/_baseUniq.js"), + isArrayLikeObject = __webpack_require__(/*! ./isArrayLikeObject */ "./node_modules/lodash/isArrayLikeObject.js"); /** - * Returns true if its arguments are identical, false otherwise. Values are - * identical if they reference the same memory. `NaN` is identical to `NaN`; - * `0` and `-0` are not identical. - * - * Note this is merely a curried version of ES6 `Object.is`. - * - * `identical` does not support the `__` placeholder. + * Creates an array of unique values, in order, from all given arrays using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. * - * @func - * @memberOf R - * @since v0.15.0 - * @category Relation - * @sig a -> a -> Boolean - * @param {*} a - * @param {*} b - * @return {Boolean} + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of combined values. * @example * - * const o = {}; - * R.identical(o, o); //=> true - * R.identical(1, 1); //=> true - * R.identical(1, '1'); //=> false - * R.identical([], []); //=> false - * R.identical(0, -0); //=> false - * R.identical(NaN, NaN); //=> true + * _.union([2], [1, 2]); + * // => [2, 1] */ +var union = baseRest(function(arrays) { + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); +}); -var identical = function identical(a, b) { - switch (arguments.length) { - case 0: - return identical; - case 1: - return function () { - return function unaryIdentical(_b) { - switch (arguments.length) { - case 0: - return unaryIdentical; - default: - return (0,_internal_objectIs_js__WEBPACK_IMPORTED_MODULE_0__["default"])(a, _b); - } - }; - }(); - default: - return (0,_internal_objectIs_js__WEBPACK_IMPORTED_MODULE_0__["default"])(a, b); - } -}; // In order to support Cross-origin Window objects as arguments to identical, -// it cannot be implemented as _curry2(_objectIs). -// The reason is that _curry2 checks if a function argument is the placeholder __ -// by accessing a paritcular property. However, across URL origins access -// to most properties of Window is forbidden. +module.exports = union; -/* harmony default export */ __webpack_exports__["default"] = (identical); /***/ }), -/***/ "./node_modules/ramda/es/identity.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/identity.js ***! - \*******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/uniqueId.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash/uniqueId.js ***! + \*****************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _internal_identity_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_identity.js */ "./node_modules/ramda/es/internal/_identity.js"); +var toString = __webpack_require__(/*! ./toString */ "./node_modules/lodash/toString.js"); +/** Used to generate unique IDs. */ +var idCounter = 0; /** - * A function that does nothing but return the parameter supplied to it. Good - * as a default or placeholder function. + * Generates a unique ID. If `prefix` is given, the ID is appended to it. * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig a -> a - * @param {*} x The value to return. - * @return {*} The input value, `x`. + * @static + * @since 0.1.0 + * @memberOf _ + * @category Util + * @param {string} [prefix=''] The value to prefix the ID with. + * @returns {string} Returns the unique ID. * @example * - * R.identity(1); //=> 1 + * _.uniqueId('contact_'); + * // => 'contact_104' * - * const obj = {}; - * R.identity(obj) === obj; //=> true - * @symb R.identity(a) = a + * _.uniqueId(); + * // => '105' */ +function uniqueId(prefix) { + var id = ++idCounter; + return toString(prefix) + id; +} -var identity = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_internal_identity_js__WEBPACK_IMPORTED_MODULE_1__["default"]); -/* harmony default export */ __webpack_exports__["default"] = (identity); +module.exports = uniqueId; -/***/ }), -/***/ "./node_modules/ramda/es/ifElse.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/ifElse.js ***! - \*****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ }), -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./curryN.js */ "./node_modules/ramda/es/curryN.js"); +/***/ "./node_modules/lodash/values.js": +/*!***************************************!*\ + !*** ./node_modules/lodash/values.js ***! + \***************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +var baseValues = __webpack_require__(/*! ./_baseValues */ "./node_modules/lodash/_baseValues.js"), + keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); /** - * Creates a function that will process either the `onTrue` or the `onFalse` - * function depending upon the result of the `condition` predicate. + * Creates an array of the own enumerable string keyed property values of `object`. * - * Note that `ifElse` takes its arity from the longest of the three functions passed to it. + * **Note:** Non-object values are coerced to objects. * - * @func - * @memberOf R - * @since v0.8.0 - * @category Logic - * @sig (*... -> Boolean) -> (*... -> *) -> (*... -> *) -> (*... -> *) - * @param {Function} condition A predicate function - * @param {Function} onTrue A function to invoke when the `condition` evaluates to a truthy value. - * @param {Function} onFalse A function to invoke when the `condition` evaluates to a falsy value. - * @return {Function} A new function that will process either the `onTrue` or the `onFalse` - * function depending upon the result of the `condition` predicate. - * @see R.unless, R.when, R.cond + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property values. * @example * - * const incCount = R.ifElse( - * R.has('count'), - * R.over(R.lensProp('count'), R.inc), - * R.assoc('count', 1) - * ); - * incCount({ count: 1 }); //=> { count: 2 } - * incCount({}); //=> { count: 1 } + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.values(new Foo); + * // => [1, 2] (iteration order is not guaranteed) + * + * _.values('hi'); + * // => ['h', 'i'] */ +function values(object) { + return object == null ? [] : baseValues(object, keys(object)); +} + +module.exports = values; -var ifElse = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function ifElse(condition, onTrue, onFalse) { - return (0,_curryN_js__WEBPACK_IMPORTED_MODULE_1__["default"])(Math.max(condition.length, onTrue.length, onFalse.length), function _ifElse() { - return condition.apply(this, arguments) ? onTrue.apply(this, arguments) : onFalse.apply(this, arguments); - }); -}); -/* harmony default export */ __webpack_exports__["default"] = (ifElse); /***/ }), -/***/ "./node_modules/ramda/es/inc.js": -/*!**************************************!*\ - !*** ./node_modules/ramda/es/inc.js ***! - \**************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/lodash/zipObject.js": +/*!******************************************!*\ + !*** ./node_modules/lodash/zipObject.js ***! + \******************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _add_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./add.js */ "./node_modules/ramda/es/add.js"); +var assignValue = __webpack_require__(/*! ./_assignValue */ "./node_modules/lodash/_assignValue.js"), + baseZipObject = __webpack_require__(/*! ./_baseZipObject */ "./node_modules/lodash/_baseZipObject.js"); /** - * Increments its argument. + * This method is like `_.fromPairs` except that it accepts two arrays, + * one of property identifiers and one of corresponding values. * - * @func - * @memberOf R - * @since v0.9.0 - * @category Math - * @sig Number -> Number - * @param {Number} n - * @return {Number} n + 1 - * @see R.dec + * @static + * @memberOf _ + * @since 0.4.0 + * @category Array + * @param {Array} [props=[]] The property identifiers. + * @param {Array} [values=[]] The property values. + * @returns {Object} Returns the new object. * @example * - * R.inc(42); //=> 43 + * _.zipObject(['a', 'b'], [1, 2]); + * // => { 'a': 1, 'b': 2 } */ +function zipObject(props, values) { + return baseZipObject(props || [], values || [], assignValue); +} + +module.exports = zipObject; -var inc = /*#__PURE__*/ -(0,_add_js__WEBPACK_IMPORTED_MODULE_0__["default"])(1); -/* harmony default export */ __webpack_exports__["default"] = (inc); /***/ }), -/***/ "./node_modules/ramda/es/includes.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/includes.js ***! - \*******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/prop-types/lib/ReactPropTypesSecret.js": +/*!*************************************************************!*\ + !*** ./node_modules/prop-types/lib/ReactPropTypesSecret.js ***! + \*************************************************************/ +/***/ (function(module) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_includes.js */ "./node_modules/ramda/es/internal/_includes.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); - - /** - * Returns `true` if the specified value is equal, in [`R.equals`](#equals) - * terms, to at least one element of the given list; `false` otherwise. - * Also works with strings. - * - * @func - * @memberOf R - * @since v0.26.0 - * @category List - * @sig a -> [a] -> Boolean - * @param {Object} a The item to compare against. - * @param {Array} list The array to consider. - * @return {Boolean} `true` if an equivalent item is in the list, `false` otherwise. - * @see R.any - * @example + * Copyright (c) 2013-present, Facebook, Inc. * - * R.includes(3, [1, 2, 3]); //=> true - * R.includes(4, [1, 2, 3]); //=> false - * R.includes({ name: 'Fred' }, [{ name: 'Fred' }]); //=> true - * R.includes([42], [[42]]); //=> true - * R.includes('ba', 'banana'); //=>true + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. */ -var includes = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_internal_includes_js__WEBPACK_IMPORTED_MODULE_0__["default"]); -/* harmony default export */ __webpack_exports__["default"] = (includes); + + +var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; + +module.exports = ReactPropTypesSecret; + /***/ }), -/***/ "./node_modules/ramda/es/index.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/index.js ***! - \****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/react-base16-styling/lib/esm/colorConverters.js": +/*!**********************************************************************!*\ + !*** ./node_modules/react-base16-styling/lib/esm/colorConverters.js ***! + \**********************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ F: function() { return /* reexport safe */ _F_js__WEBPACK_IMPORTED_MODULE_0__["default"]; }, -/* harmony export */ T: function() { return /* reexport safe */ _T_js__WEBPACK_IMPORTED_MODULE_1__["default"]; }, -/* harmony export */ __: function() { return /* reexport safe */ _js__WEBPACK_IMPORTED_MODULE_2__["default"]; }, -/* harmony export */ add: function() { return /* reexport safe */ _add_js__WEBPACK_IMPORTED_MODULE_3__["default"]; }, -/* harmony export */ addIndex: function() { return /* reexport safe */ _addIndex_js__WEBPACK_IMPORTED_MODULE_4__["default"]; }, -/* harmony export */ addIndexRight: function() { return /* reexport safe */ _addIndexRight_js__WEBPACK_IMPORTED_MODULE_5__["default"]; }, -/* harmony export */ adjust: function() { return /* reexport safe */ _adjust_js__WEBPACK_IMPORTED_MODULE_6__["default"]; }, -/* harmony export */ all: function() { return /* reexport safe */ _all_js__WEBPACK_IMPORTED_MODULE_7__["default"]; }, -/* harmony export */ allPass: function() { return /* reexport safe */ _allPass_js__WEBPACK_IMPORTED_MODULE_8__["default"]; }, -/* harmony export */ always: function() { return /* reexport safe */ _always_js__WEBPACK_IMPORTED_MODULE_9__["default"]; }, -/* harmony export */ and: function() { return /* reexport safe */ _and_js__WEBPACK_IMPORTED_MODULE_10__["default"]; }, -/* harmony export */ andThen: function() { return /* reexport safe */ _andThen_js__WEBPACK_IMPORTED_MODULE_223__["default"]; }, -/* harmony export */ any: function() { return /* reexport safe */ _any_js__WEBPACK_IMPORTED_MODULE_11__["default"]; }, -/* harmony export */ anyPass: function() { return /* reexport safe */ _anyPass_js__WEBPACK_IMPORTED_MODULE_12__["default"]; }, -/* harmony export */ ap: function() { return /* reexport safe */ _ap_js__WEBPACK_IMPORTED_MODULE_13__["default"]; }, -/* harmony export */ aperture: function() { return /* reexport safe */ _aperture_js__WEBPACK_IMPORTED_MODULE_14__["default"]; }, -/* harmony export */ append: function() { return /* reexport safe */ _append_js__WEBPACK_IMPORTED_MODULE_15__["default"]; }, -/* harmony export */ apply: function() { return /* reexport safe */ _apply_js__WEBPACK_IMPORTED_MODULE_16__["default"]; }, -/* harmony export */ applySpec: function() { return /* reexport safe */ _applySpec_js__WEBPACK_IMPORTED_MODULE_17__["default"]; }, -/* harmony export */ applyTo: function() { return /* reexport safe */ _applyTo_js__WEBPACK_IMPORTED_MODULE_18__["default"]; }, -/* harmony export */ ascend: function() { return /* reexport safe */ _ascend_js__WEBPACK_IMPORTED_MODULE_19__["default"]; }, -/* harmony export */ assoc: function() { return /* reexport safe */ _assoc_js__WEBPACK_IMPORTED_MODULE_20__["default"]; }, -/* harmony export */ assocPath: function() { return /* reexport safe */ _assocPath_js__WEBPACK_IMPORTED_MODULE_21__["default"]; }, -/* harmony export */ binary: function() { return /* reexport safe */ _binary_js__WEBPACK_IMPORTED_MODULE_22__["default"]; }, -/* harmony export */ bind: function() { return /* reexport safe */ _bind_js__WEBPACK_IMPORTED_MODULE_23__["default"]; }, -/* harmony export */ both: function() { return /* reexport safe */ _both_js__WEBPACK_IMPORTED_MODULE_24__["default"]; }, -/* harmony export */ call: function() { return /* reexport safe */ _call_js__WEBPACK_IMPORTED_MODULE_25__["default"]; }, -/* harmony export */ chain: function() { return /* reexport safe */ _chain_js__WEBPACK_IMPORTED_MODULE_26__["default"]; }, -/* harmony export */ clamp: function() { return /* reexport safe */ _clamp_js__WEBPACK_IMPORTED_MODULE_27__["default"]; }, -/* harmony export */ clone: function() { return /* reexport safe */ _clone_js__WEBPACK_IMPORTED_MODULE_28__["default"]; }, -/* harmony export */ collectBy: function() { return /* reexport safe */ _collectBy_js__WEBPACK_IMPORTED_MODULE_29__["default"]; }, -/* harmony export */ comparator: function() { return /* reexport safe */ _comparator_js__WEBPACK_IMPORTED_MODULE_30__["default"]; }, -/* harmony export */ complement: function() { return /* reexport safe */ _complement_js__WEBPACK_IMPORTED_MODULE_31__["default"]; }, -/* harmony export */ compose: function() { return /* reexport safe */ _compose_js__WEBPACK_IMPORTED_MODULE_32__["default"]; }, -/* harmony export */ composeWith: function() { return /* reexport safe */ _composeWith_js__WEBPACK_IMPORTED_MODULE_33__["default"]; }, -/* harmony export */ concat: function() { return /* reexport safe */ _concat_js__WEBPACK_IMPORTED_MODULE_34__["default"]; }, -/* harmony export */ cond: function() { return /* reexport safe */ _cond_js__WEBPACK_IMPORTED_MODULE_35__["default"]; }, -/* harmony export */ construct: function() { return /* reexport safe */ _construct_js__WEBPACK_IMPORTED_MODULE_36__["default"]; }, -/* harmony export */ constructN: function() { return /* reexport safe */ _constructN_js__WEBPACK_IMPORTED_MODULE_37__["default"]; }, -/* harmony export */ converge: function() { return /* reexport safe */ _converge_js__WEBPACK_IMPORTED_MODULE_38__["default"]; }, -/* harmony export */ count: function() { return /* reexport safe */ _count_js__WEBPACK_IMPORTED_MODULE_39__["default"]; }, -/* harmony export */ countBy: function() { return /* reexport safe */ _countBy_js__WEBPACK_IMPORTED_MODULE_40__["default"]; }, -/* harmony export */ curry: function() { return /* reexport safe */ _curry_js__WEBPACK_IMPORTED_MODULE_41__["default"]; }, -/* harmony export */ curryN: function() { return /* reexport safe */ _curryN_js__WEBPACK_IMPORTED_MODULE_42__["default"]; }, -/* harmony export */ dec: function() { return /* reexport safe */ _dec_js__WEBPACK_IMPORTED_MODULE_43__["default"]; }, -/* harmony export */ defaultTo: function() { return /* reexport safe */ _defaultTo_js__WEBPACK_IMPORTED_MODULE_44__["default"]; }, -/* harmony export */ descend: function() { return /* reexport safe */ _descend_js__WEBPACK_IMPORTED_MODULE_45__["default"]; }, -/* harmony export */ difference: function() { return /* reexport safe */ _difference_js__WEBPACK_IMPORTED_MODULE_46__["default"]; }, -/* harmony export */ differenceWith: function() { return /* reexport safe */ _differenceWith_js__WEBPACK_IMPORTED_MODULE_47__["default"]; }, -/* harmony export */ dissoc: function() { return /* reexport safe */ _dissoc_js__WEBPACK_IMPORTED_MODULE_48__["default"]; }, -/* harmony export */ dissocPath: function() { return /* reexport safe */ _dissocPath_js__WEBPACK_IMPORTED_MODULE_49__["default"]; }, -/* harmony export */ divide: function() { return /* reexport safe */ _divide_js__WEBPACK_IMPORTED_MODULE_50__["default"]; }, -/* harmony export */ drop: function() { return /* reexport safe */ _drop_js__WEBPACK_IMPORTED_MODULE_51__["default"]; }, -/* harmony export */ dropLast: function() { return /* reexport safe */ _dropLast_js__WEBPACK_IMPORTED_MODULE_52__["default"]; }, -/* harmony export */ dropLastWhile: function() { return /* reexport safe */ _dropLastWhile_js__WEBPACK_IMPORTED_MODULE_53__["default"]; }, -/* harmony export */ dropRepeats: function() { return /* reexport safe */ _dropRepeats_js__WEBPACK_IMPORTED_MODULE_54__["default"]; }, -/* harmony export */ dropRepeatsBy: function() { return /* reexport safe */ _dropRepeatsBy_js__WEBPACK_IMPORTED_MODULE_55__["default"]; }, -/* harmony export */ dropRepeatsWith: function() { return /* reexport safe */ _dropRepeatsWith_js__WEBPACK_IMPORTED_MODULE_56__["default"]; }, -/* harmony export */ dropWhile: function() { return /* reexport safe */ _dropWhile_js__WEBPACK_IMPORTED_MODULE_57__["default"]; }, -/* harmony export */ either: function() { return /* reexport safe */ _either_js__WEBPACK_IMPORTED_MODULE_58__["default"]; }, -/* harmony export */ empty: function() { return /* reexport safe */ _empty_js__WEBPACK_IMPORTED_MODULE_59__["default"]; }, -/* harmony export */ endsWith: function() { return /* reexport safe */ _endsWith_js__WEBPACK_IMPORTED_MODULE_60__["default"]; }, -/* harmony export */ eqBy: function() { return /* reexport safe */ _eqBy_js__WEBPACK_IMPORTED_MODULE_61__["default"]; }, -/* harmony export */ eqProps: function() { return /* reexport safe */ _eqProps_js__WEBPACK_IMPORTED_MODULE_62__["default"]; }, -/* harmony export */ equals: function() { return /* reexport safe */ _equals_js__WEBPACK_IMPORTED_MODULE_63__["default"]; }, -/* harmony export */ evolve: function() { return /* reexport safe */ _evolve_js__WEBPACK_IMPORTED_MODULE_64__["default"]; }, -/* harmony export */ filter: function() { return /* reexport safe */ _filter_js__WEBPACK_IMPORTED_MODULE_65__["default"]; }, -/* harmony export */ find: function() { return /* reexport safe */ _find_js__WEBPACK_IMPORTED_MODULE_66__["default"]; }, -/* harmony export */ findIndex: function() { return /* reexport safe */ _findIndex_js__WEBPACK_IMPORTED_MODULE_67__["default"]; }, -/* harmony export */ findLast: function() { return /* reexport safe */ _findLast_js__WEBPACK_IMPORTED_MODULE_68__["default"]; }, -/* harmony export */ findLastIndex: function() { return /* reexport safe */ _findLastIndex_js__WEBPACK_IMPORTED_MODULE_69__["default"]; }, -/* harmony export */ flatten: function() { return /* reexport safe */ _flatten_js__WEBPACK_IMPORTED_MODULE_70__["default"]; }, -/* harmony export */ flip: function() { return /* reexport safe */ _flip_js__WEBPACK_IMPORTED_MODULE_71__["default"]; }, -/* harmony export */ forEach: function() { return /* reexport safe */ _forEach_js__WEBPACK_IMPORTED_MODULE_72__["default"]; }, -/* harmony export */ forEachObjIndexed: function() { return /* reexport safe */ _forEachObjIndexed_js__WEBPACK_IMPORTED_MODULE_73__["default"]; }, -/* harmony export */ fromPairs: function() { return /* reexport safe */ _fromPairs_js__WEBPACK_IMPORTED_MODULE_74__["default"]; }, -/* harmony export */ groupBy: function() { return /* reexport safe */ _groupBy_js__WEBPACK_IMPORTED_MODULE_75__["default"]; }, -/* harmony export */ groupWith: function() { return /* reexport safe */ _groupWith_js__WEBPACK_IMPORTED_MODULE_76__["default"]; }, -/* harmony export */ gt: function() { return /* reexport safe */ _gt_js__WEBPACK_IMPORTED_MODULE_77__["default"]; }, -/* harmony export */ gte: function() { return /* reexport safe */ _gte_js__WEBPACK_IMPORTED_MODULE_78__["default"]; }, -/* harmony export */ has: function() { return /* reexport safe */ _has_js__WEBPACK_IMPORTED_MODULE_79__["default"]; }, -/* harmony export */ hasIn: function() { return /* reexport safe */ _hasIn_js__WEBPACK_IMPORTED_MODULE_80__["default"]; }, -/* harmony export */ hasPath: function() { return /* reexport safe */ _hasPath_js__WEBPACK_IMPORTED_MODULE_81__["default"]; }, -/* harmony export */ head: function() { return /* reexport safe */ _head_js__WEBPACK_IMPORTED_MODULE_82__["default"]; }, -/* harmony export */ identical: function() { return /* reexport safe */ _identical_js__WEBPACK_IMPORTED_MODULE_83__["default"]; }, -/* harmony export */ identity: function() { return /* reexport safe */ _identity_js__WEBPACK_IMPORTED_MODULE_84__["default"]; }, -/* harmony export */ ifElse: function() { return /* reexport safe */ _ifElse_js__WEBPACK_IMPORTED_MODULE_85__["default"]; }, -/* harmony export */ inc: function() { return /* reexport safe */ _inc_js__WEBPACK_IMPORTED_MODULE_86__["default"]; }, -/* harmony export */ includes: function() { return /* reexport safe */ _includes_js__WEBPACK_IMPORTED_MODULE_87__["default"]; }, -/* harmony export */ indexBy: function() { return /* reexport safe */ _indexBy_js__WEBPACK_IMPORTED_MODULE_88__["default"]; }, -/* harmony export */ indexOf: function() { return /* reexport safe */ _indexOf_js__WEBPACK_IMPORTED_MODULE_89__["default"]; }, -/* harmony export */ init: function() { return /* reexport safe */ _init_js__WEBPACK_IMPORTED_MODULE_90__["default"]; }, -/* harmony export */ innerJoin: function() { return /* reexport safe */ _innerJoin_js__WEBPACK_IMPORTED_MODULE_91__["default"]; }, -/* harmony export */ insert: function() { return /* reexport safe */ _insert_js__WEBPACK_IMPORTED_MODULE_92__["default"]; }, -/* harmony export */ insertAll: function() { return /* reexport safe */ _insertAll_js__WEBPACK_IMPORTED_MODULE_93__["default"]; }, -/* harmony export */ intersection: function() { return /* reexport safe */ _intersection_js__WEBPACK_IMPORTED_MODULE_94__["default"]; }, -/* harmony export */ intersperse: function() { return /* reexport safe */ _intersperse_js__WEBPACK_IMPORTED_MODULE_95__["default"]; }, -/* harmony export */ into: function() { return /* reexport safe */ _into_js__WEBPACK_IMPORTED_MODULE_96__["default"]; }, -/* harmony export */ invert: function() { return /* reexport safe */ _invert_js__WEBPACK_IMPORTED_MODULE_97__["default"]; }, -/* harmony export */ invertObj: function() { return /* reexport safe */ _invertObj_js__WEBPACK_IMPORTED_MODULE_98__["default"]; }, -/* harmony export */ invoker: function() { return /* reexport safe */ _invoker_js__WEBPACK_IMPORTED_MODULE_99__["default"]; }, -/* harmony export */ is: function() { return /* reexport safe */ _is_js__WEBPACK_IMPORTED_MODULE_100__["default"]; }, -/* harmony export */ isEmpty: function() { return /* reexport safe */ _isEmpty_js__WEBPACK_IMPORTED_MODULE_101__["default"]; }, -/* harmony export */ isNil: function() { return /* reexport safe */ _isNil_js__WEBPACK_IMPORTED_MODULE_102__["default"]; }, -/* harmony export */ isNotNil: function() { return /* reexport safe */ _isNotNil_js__WEBPACK_IMPORTED_MODULE_103__["default"]; }, -/* harmony export */ join: function() { return /* reexport safe */ _join_js__WEBPACK_IMPORTED_MODULE_104__["default"]; }, -/* harmony export */ juxt: function() { return /* reexport safe */ _juxt_js__WEBPACK_IMPORTED_MODULE_105__["default"]; }, -/* harmony export */ keys: function() { return /* reexport safe */ _keys_js__WEBPACK_IMPORTED_MODULE_106__["default"]; }, -/* harmony export */ keysIn: function() { return /* reexport safe */ _keysIn_js__WEBPACK_IMPORTED_MODULE_107__["default"]; }, -/* harmony export */ last: function() { return /* reexport safe */ _last_js__WEBPACK_IMPORTED_MODULE_108__["default"]; }, -/* harmony export */ lastIndexOf: function() { return /* reexport safe */ _lastIndexOf_js__WEBPACK_IMPORTED_MODULE_109__["default"]; }, -/* harmony export */ length: function() { return /* reexport safe */ _length_js__WEBPACK_IMPORTED_MODULE_110__["default"]; }, -/* harmony export */ lens: function() { return /* reexport safe */ _lens_js__WEBPACK_IMPORTED_MODULE_111__["default"]; }, -/* harmony export */ lensIndex: function() { return /* reexport safe */ _lensIndex_js__WEBPACK_IMPORTED_MODULE_112__["default"]; }, -/* harmony export */ lensPath: function() { return /* reexport safe */ _lensPath_js__WEBPACK_IMPORTED_MODULE_113__["default"]; }, -/* harmony export */ lensProp: function() { return /* reexport safe */ _lensProp_js__WEBPACK_IMPORTED_MODULE_114__["default"]; }, -/* harmony export */ lift: function() { return /* reexport safe */ _lift_js__WEBPACK_IMPORTED_MODULE_115__["default"]; }, -/* harmony export */ liftN: function() { return /* reexport safe */ _liftN_js__WEBPACK_IMPORTED_MODULE_116__["default"]; }, -/* harmony export */ lt: function() { return /* reexport safe */ _lt_js__WEBPACK_IMPORTED_MODULE_117__["default"]; }, -/* harmony export */ lte: function() { return /* reexport safe */ _lte_js__WEBPACK_IMPORTED_MODULE_118__["default"]; }, -/* harmony export */ map: function() { return /* reexport safe */ _map_js__WEBPACK_IMPORTED_MODULE_119__["default"]; }, -/* harmony export */ mapAccum: function() { return /* reexport safe */ _mapAccum_js__WEBPACK_IMPORTED_MODULE_120__["default"]; }, -/* harmony export */ mapAccumRight: function() { return /* reexport safe */ _mapAccumRight_js__WEBPACK_IMPORTED_MODULE_121__["default"]; }, -/* harmony export */ mapObjIndexed: function() { return /* reexport safe */ _mapObjIndexed_js__WEBPACK_IMPORTED_MODULE_122__["default"]; }, -/* harmony export */ match: function() { return /* reexport safe */ _match_js__WEBPACK_IMPORTED_MODULE_123__["default"]; }, -/* harmony export */ mathMod: function() { return /* reexport safe */ _mathMod_js__WEBPACK_IMPORTED_MODULE_124__["default"]; }, -/* harmony export */ max: function() { return /* reexport safe */ _max_js__WEBPACK_IMPORTED_MODULE_125__["default"]; }, -/* harmony export */ maxBy: function() { return /* reexport safe */ _maxBy_js__WEBPACK_IMPORTED_MODULE_126__["default"]; }, -/* harmony export */ mean: function() { return /* reexport safe */ _mean_js__WEBPACK_IMPORTED_MODULE_127__["default"]; }, -/* harmony export */ median: function() { return /* reexport safe */ _median_js__WEBPACK_IMPORTED_MODULE_128__["default"]; }, -/* harmony export */ memoizeWith: function() { return /* reexport safe */ _memoizeWith_js__WEBPACK_IMPORTED_MODULE_129__["default"]; }, -/* harmony export */ mergeAll: function() { return /* reexport safe */ _mergeAll_js__WEBPACK_IMPORTED_MODULE_130__["default"]; }, -/* harmony export */ mergeDeepLeft: function() { return /* reexport safe */ _mergeDeepLeft_js__WEBPACK_IMPORTED_MODULE_131__["default"]; }, -/* harmony export */ mergeDeepRight: function() { return /* reexport safe */ _mergeDeepRight_js__WEBPACK_IMPORTED_MODULE_132__["default"]; }, -/* harmony export */ mergeDeepWith: function() { return /* reexport safe */ _mergeDeepWith_js__WEBPACK_IMPORTED_MODULE_133__["default"]; }, -/* harmony export */ mergeDeepWithKey: function() { return /* reexport safe */ _mergeDeepWithKey_js__WEBPACK_IMPORTED_MODULE_134__["default"]; }, -/* harmony export */ mergeLeft: function() { return /* reexport safe */ _mergeLeft_js__WEBPACK_IMPORTED_MODULE_135__["default"]; }, -/* harmony export */ mergeRight: function() { return /* reexport safe */ _mergeRight_js__WEBPACK_IMPORTED_MODULE_136__["default"]; }, -/* harmony export */ mergeWith: function() { return /* reexport safe */ _mergeWith_js__WEBPACK_IMPORTED_MODULE_137__["default"]; }, -/* harmony export */ mergeWithKey: function() { return /* reexport safe */ _mergeWithKey_js__WEBPACK_IMPORTED_MODULE_138__["default"]; }, -/* harmony export */ min: function() { return /* reexport safe */ _min_js__WEBPACK_IMPORTED_MODULE_139__["default"]; }, -/* harmony export */ minBy: function() { return /* reexport safe */ _minBy_js__WEBPACK_IMPORTED_MODULE_140__["default"]; }, -/* harmony export */ modify: function() { return /* reexport safe */ _modify_js__WEBPACK_IMPORTED_MODULE_141__["default"]; }, -/* harmony export */ modifyPath: function() { return /* reexport safe */ _modifyPath_js__WEBPACK_IMPORTED_MODULE_142__["default"]; }, -/* harmony export */ modulo: function() { return /* reexport safe */ _modulo_js__WEBPACK_IMPORTED_MODULE_143__["default"]; }, -/* harmony export */ move: function() { return /* reexport safe */ _move_js__WEBPACK_IMPORTED_MODULE_144__["default"]; }, -/* harmony export */ multiply: function() { return /* reexport safe */ _multiply_js__WEBPACK_IMPORTED_MODULE_145__["default"]; }, -/* harmony export */ nAry: function() { return /* reexport safe */ _nAry_js__WEBPACK_IMPORTED_MODULE_146__["default"]; }, -/* harmony export */ negate: function() { return /* reexport safe */ _negate_js__WEBPACK_IMPORTED_MODULE_148__["default"]; }, -/* harmony export */ none: function() { return /* reexport safe */ _none_js__WEBPACK_IMPORTED_MODULE_149__["default"]; }, -/* harmony export */ not: function() { return /* reexport safe */ _not_js__WEBPACK_IMPORTED_MODULE_150__["default"]; }, -/* harmony export */ nth: function() { return /* reexport safe */ _nth_js__WEBPACK_IMPORTED_MODULE_151__["default"]; }, -/* harmony export */ nthArg: function() { return /* reexport safe */ _nthArg_js__WEBPACK_IMPORTED_MODULE_152__["default"]; }, -/* harmony export */ o: function() { return /* reexport safe */ _o_js__WEBPACK_IMPORTED_MODULE_153__["default"]; }, -/* harmony export */ objOf: function() { return /* reexport safe */ _objOf_js__WEBPACK_IMPORTED_MODULE_154__["default"]; }, -/* harmony export */ of: function() { return /* reexport safe */ _of_js__WEBPACK_IMPORTED_MODULE_155__["default"]; }, -/* harmony export */ omit: function() { return /* reexport safe */ _omit_js__WEBPACK_IMPORTED_MODULE_156__["default"]; }, -/* harmony export */ on: function() { return /* reexport safe */ _on_js__WEBPACK_IMPORTED_MODULE_157__["default"]; }, -/* harmony export */ once: function() { return /* reexport safe */ _once_js__WEBPACK_IMPORTED_MODULE_158__["default"]; }, -/* harmony export */ or: function() { return /* reexport safe */ _or_js__WEBPACK_IMPORTED_MODULE_159__["default"]; }, -/* harmony export */ otherwise: function() { return /* reexport safe */ _otherwise_js__WEBPACK_IMPORTED_MODULE_160__["default"]; }, -/* harmony export */ over: function() { return /* reexport safe */ _over_js__WEBPACK_IMPORTED_MODULE_161__["default"]; }, -/* harmony export */ pair: function() { return /* reexport safe */ _pair_js__WEBPACK_IMPORTED_MODULE_162__["default"]; }, -/* harmony export */ partial: function() { return /* reexport safe */ _partial_js__WEBPACK_IMPORTED_MODULE_163__["default"]; }, -/* harmony export */ partialObject: function() { return /* reexport safe */ _partialObject_js__WEBPACK_IMPORTED_MODULE_147__["default"]; }, -/* harmony export */ partialRight: function() { return /* reexport safe */ _partialRight_js__WEBPACK_IMPORTED_MODULE_164__["default"]; }, -/* harmony export */ partition: function() { return /* reexport safe */ _partition_js__WEBPACK_IMPORTED_MODULE_165__["default"]; }, -/* harmony export */ path: function() { return /* reexport safe */ _path_js__WEBPACK_IMPORTED_MODULE_166__["default"]; }, -/* harmony export */ pathEq: function() { return /* reexport safe */ _pathEq_js__WEBPACK_IMPORTED_MODULE_168__["default"]; }, -/* harmony export */ pathOr: function() { return /* reexport safe */ _pathOr_js__WEBPACK_IMPORTED_MODULE_169__["default"]; }, -/* harmony export */ pathSatisfies: function() { return /* reexport safe */ _pathSatisfies_js__WEBPACK_IMPORTED_MODULE_170__["default"]; }, -/* harmony export */ paths: function() { return /* reexport safe */ _paths_js__WEBPACK_IMPORTED_MODULE_167__["default"]; }, -/* harmony export */ pick: function() { return /* reexport safe */ _pick_js__WEBPACK_IMPORTED_MODULE_171__["default"]; }, -/* harmony export */ pickAll: function() { return /* reexport safe */ _pickAll_js__WEBPACK_IMPORTED_MODULE_172__["default"]; }, -/* harmony export */ pickBy: function() { return /* reexport safe */ _pickBy_js__WEBPACK_IMPORTED_MODULE_173__["default"]; }, -/* harmony export */ pipe: function() { return /* reexport safe */ _pipe_js__WEBPACK_IMPORTED_MODULE_174__["default"]; }, -/* harmony export */ pipeWith: function() { return /* reexport safe */ _pipeWith_js__WEBPACK_IMPORTED_MODULE_175__["default"]; }, -/* harmony export */ pluck: function() { return /* reexport safe */ _pluck_js__WEBPACK_IMPORTED_MODULE_176__["default"]; }, -/* harmony export */ prepend: function() { return /* reexport safe */ _prepend_js__WEBPACK_IMPORTED_MODULE_177__["default"]; }, -/* harmony export */ product: function() { return /* reexport safe */ _product_js__WEBPACK_IMPORTED_MODULE_178__["default"]; }, -/* harmony export */ project: function() { return /* reexport safe */ _project_js__WEBPACK_IMPORTED_MODULE_179__["default"]; }, -/* harmony export */ promap: function() { return /* reexport safe */ _promap_js__WEBPACK_IMPORTED_MODULE_180__["default"]; }, -/* harmony export */ prop: function() { return /* reexport safe */ _prop_js__WEBPACK_IMPORTED_MODULE_181__["default"]; }, -/* harmony export */ propEq: function() { return /* reexport safe */ _propEq_js__WEBPACK_IMPORTED_MODULE_182__["default"]; }, -/* harmony export */ propIs: function() { return /* reexport safe */ _propIs_js__WEBPACK_IMPORTED_MODULE_183__["default"]; }, -/* harmony export */ propOr: function() { return /* reexport safe */ _propOr_js__WEBPACK_IMPORTED_MODULE_184__["default"]; }, -/* harmony export */ propSatisfies: function() { return /* reexport safe */ _propSatisfies_js__WEBPACK_IMPORTED_MODULE_185__["default"]; }, -/* harmony export */ props: function() { return /* reexport safe */ _props_js__WEBPACK_IMPORTED_MODULE_186__["default"]; }, -/* harmony export */ range: function() { return /* reexport safe */ _range_js__WEBPACK_IMPORTED_MODULE_187__["default"]; }, -/* harmony export */ reduce: function() { return /* reexport safe */ _reduce_js__WEBPACK_IMPORTED_MODULE_188__["default"]; }, -/* harmony export */ reduceBy: function() { return /* reexport safe */ _reduceBy_js__WEBPACK_IMPORTED_MODULE_189__["default"]; }, -/* harmony export */ reduceRight: function() { return /* reexport safe */ _reduceRight_js__WEBPACK_IMPORTED_MODULE_190__["default"]; }, -/* harmony export */ reduceWhile: function() { return /* reexport safe */ _reduceWhile_js__WEBPACK_IMPORTED_MODULE_191__["default"]; }, -/* harmony export */ reduced: function() { return /* reexport safe */ _reduced_js__WEBPACK_IMPORTED_MODULE_192__["default"]; }, -/* harmony export */ reject: function() { return /* reexport safe */ _reject_js__WEBPACK_IMPORTED_MODULE_193__["default"]; }, -/* harmony export */ remove: function() { return /* reexport safe */ _remove_js__WEBPACK_IMPORTED_MODULE_194__["default"]; }, -/* harmony export */ repeat: function() { return /* reexport safe */ _repeat_js__WEBPACK_IMPORTED_MODULE_195__["default"]; }, -/* harmony export */ replace: function() { return /* reexport safe */ _replace_js__WEBPACK_IMPORTED_MODULE_196__["default"]; }, -/* harmony export */ reverse: function() { return /* reexport safe */ _reverse_js__WEBPACK_IMPORTED_MODULE_197__["default"]; }, -/* harmony export */ scan: function() { return /* reexport safe */ _scan_js__WEBPACK_IMPORTED_MODULE_198__["default"]; }, -/* harmony export */ sequence: function() { return /* reexport safe */ _sequence_js__WEBPACK_IMPORTED_MODULE_199__["default"]; }, -/* harmony export */ set: function() { return /* reexport safe */ _set_js__WEBPACK_IMPORTED_MODULE_200__["default"]; }, -/* harmony export */ slice: function() { return /* reexport safe */ _slice_js__WEBPACK_IMPORTED_MODULE_201__["default"]; }, -/* harmony export */ sort: function() { return /* reexport safe */ _sort_js__WEBPACK_IMPORTED_MODULE_202__["default"]; }, -/* harmony export */ sortBy: function() { return /* reexport safe */ _sortBy_js__WEBPACK_IMPORTED_MODULE_203__["default"]; }, -/* harmony export */ sortWith: function() { return /* reexport safe */ _sortWith_js__WEBPACK_IMPORTED_MODULE_204__["default"]; }, -/* harmony export */ split: function() { return /* reexport safe */ _split_js__WEBPACK_IMPORTED_MODULE_205__["default"]; }, -/* harmony export */ splitAt: function() { return /* reexport safe */ _splitAt_js__WEBPACK_IMPORTED_MODULE_206__["default"]; }, -/* harmony export */ splitEvery: function() { return /* reexport safe */ _splitEvery_js__WEBPACK_IMPORTED_MODULE_207__["default"]; }, -/* harmony export */ splitWhen: function() { return /* reexport safe */ _splitWhen_js__WEBPACK_IMPORTED_MODULE_208__["default"]; }, -/* harmony export */ splitWhenever: function() { return /* reexport safe */ _splitWhenever_js__WEBPACK_IMPORTED_MODULE_209__["default"]; }, -/* harmony export */ startsWith: function() { return /* reexport safe */ _startsWith_js__WEBPACK_IMPORTED_MODULE_210__["default"]; }, -/* harmony export */ subtract: function() { return /* reexport safe */ _subtract_js__WEBPACK_IMPORTED_MODULE_211__["default"]; }, -/* harmony export */ sum: function() { return /* reexport safe */ _sum_js__WEBPACK_IMPORTED_MODULE_212__["default"]; }, -/* harmony export */ swap: function() { return /* reexport safe */ _swap_js__WEBPACK_IMPORTED_MODULE_213__["default"]; }, -/* harmony export */ symmetricDifference: function() { return /* reexport safe */ _symmetricDifference_js__WEBPACK_IMPORTED_MODULE_214__["default"]; }, -/* harmony export */ symmetricDifferenceWith: function() { return /* reexport safe */ _symmetricDifferenceWith_js__WEBPACK_IMPORTED_MODULE_215__["default"]; }, -/* harmony export */ tail: function() { return /* reexport safe */ _tail_js__WEBPACK_IMPORTED_MODULE_216__["default"]; }, -/* harmony export */ take: function() { return /* reexport safe */ _take_js__WEBPACK_IMPORTED_MODULE_217__["default"]; }, -/* harmony export */ takeLast: function() { return /* reexport safe */ _takeLast_js__WEBPACK_IMPORTED_MODULE_218__["default"]; }, -/* harmony export */ takeLastWhile: function() { return /* reexport safe */ _takeLastWhile_js__WEBPACK_IMPORTED_MODULE_219__["default"]; }, -/* harmony export */ takeWhile: function() { return /* reexport safe */ _takeWhile_js__WEBPACK_IMPORTED_MODULE_220__["default"]; }, -/* harmony export */ tap: function() { return /* reexport safe */ _tap_js__WEBPACK_IMPORTED_MODULE_221__["default"]; }, -/* harmony export */ test: function() { return /* reexport safe */ _test_js__WEBPACK_IMPORTED_MODULE_222__["default"]; }, -/* harmony export */ thunkify: function() { return /* reexport safe */ _thunkify_js__WEBPACK_IMPORTED_MODULE_264__["default"]; }, -/* harmony export */ times: function() { return /* reexport safe */ _times_js__WEBPACK_IMPORTED_MODULE_224__["default"]; }, -/* harmony export */ toLower: function() { return /* reexport safe */ _toLower_js__WEBPACK_IMPORTED_MODULE_225__["default"]; }, -/* harmony export */ toPairs: function() { return /* reexport safe */ _toPairs_js__WEBPACK_IMPORTED_MODULE_226__["default"]; }, -/* harmony export */ toPairsIn: function() { return /* reexport safe */ _toPairsIn_js__WEBPACK_IMPORTED_MODULE_227__["default"]; }, -/* harmony export */ toString: function() { return /* reexport safe */ _toString_js__WEBPACK_IMPORTED_MODULE_228__["default"]; }, -/* harmony export */ toUpper: function() { return /* reexport safe */ _toUpper_js__WEBPACK_IMPORTED_MODULE_229__["default"]; }, -/* harmony export */ transduce: function() { return /* reexport safe */ _transduce_js__WEBPACK_IMPORTED_MODULE_230__["default"]; }, -/* harmony export */ transpose: function() { return /* reexport safe */ _transpose_js__WEBPACK_IMPORTED_MODULE_231__["default"]; }, -/* harmony export */ traverse: function() { return /* reexport safe */ _traverse_js__WEBPACK_IMPORTED_MODULE_232__["default"]; }, -/* harmony export */ trim: function() { return /* reexport safe */ _trim_js__WEBPACK_IMPORTED_MODULE_233__["default"]; }, -/* harmony export */ tryCatch: function() { return /* reexport safe */ _tryCatch_js__WEBPACK_IMPORTED_MODULE_234__["default"]; }, -/* harmony export */ type: function() { return /* reexport safe */ _type_js__WEBPACK_IMPORTED_MODULE_235__["default"]; }, -/* harmony export */ unapply: function() { return /* reexport safe */ _unapply_js__WEBPACK_IMPORTED_MODULE_236__["default"]; }, -/* harmony export */ unary: function() { return /* reexport safe */ _unary_js__WEBPACK_IMPORTED_MODULE_237__["default"]; }, -/* harmony export */ uncurryN: function() { return /* reexport safe */ _uncurryN_js__WEBPACK_IMPORTED_MODULE_238__["default"]; }, -/* harmony export */ unfold: function() { return /* reexport safe */ _unfold_js__WEBPACK_IMPORTED_MODULE_239__["default"]; }, -/* harmony export */ union: function() { return /* reexport safe */ _union_js__WEBPACK_IMPORTED_MODULE_240__["default"]; }, -/* harmony export */ unionWith: function() { return /* reexport safe */ _unionWith_js__WEBPACK_IMPORTED_MODULE_241__["default"]; }, -/* harmony export */ uniq: function() { return /* reexport safe */ _uniq_js__WEBPACK_IMPORTED_MODULE_242__["default"]; }, -/* harmony export */ uniqBy: function() { return /* reexport safe */ _uniqBy_js__WEBPACK_IMPORTED_MODULE_243__["default"]; }, -/* harmony export */ uniqWith: function() { return /* reexport safe */ _uniqWith_js__WEBPACK_IMPORTED_MODULE_244__["default"]; }, -/* harmony export */ unless: function() { return /* reexport safe */ _unless_js__WEBPACK_IMPORTED_MODULE_245__["default"]; }, -/* harmony export */ unnest: function() { return /* reexport safe */ _unnest_js__WEBPACK_IMPORTED_MODULE_246__["default"]; }, -/* harmony export */ until: function() { return /* reexport safe */ _until_js__WEBPACK_IMPORTED_MODULE_247__["default"]; }, -/* harmony export */ unwind: function() { return /* reexport safe */ _unwind_js__WEBPACK_IMPORTED_MODULE_248__["default"]; }, -/* harmony export */ update: function() { return /* reexport safe */ _update_js__WEBPACK_IMPORTED_MODULE_249__["default"]; }, -/* harmony export */ useWith: function() { return /* reexport safe */ _useWith_js__WEBPACK_IMPORTED_MODULE_250__["default"]; }, -/* harmony export */ values: function() { return /* reexport safe */ _values_js__WEBPACK_IMPORTED_MODULE_251__["default"]; }, -/* harmony export */ valuesIn: function() { return /* reexport safe */ _valuesIn_js__WEBPACK_IMPORTED_MODULE_252__["default"]; }, -/* harmony export */ view: function() { return /* reexport safe */ _view_js__WEBPACK_IMPORTED_MODULE_253__["default"]; }, -/* harmony export */ when: function() { return /* reexport safe */ _when_js__WEBPACK_IMPORTED_MODULE_254__["default"]; }, -/* harmony export */ where: function() { return /* reexport safe */ _where_js__WEBPACK_IMPORTED_MODULE_255__["default"]; }, -/* harmony export */ whereAny: function() { return /* reexport safe */ _whereAny_js__WEBPACK_IMPORTED_MODULE_256__["default"]; }, -/* harmony export */ whereEq: function() { return /* reexport safe */ _whereEq_js__WEBPACK_IMPORTED_MODULE_257__["default"]; }, -/* harmony export */ without: function() { return /* reexport safe */ _without_js__WEBPACK_IMPORTED_MODULE_258__["default"]; }, -/* harmony export */ xor: function() { return /* reexport safe */ _xor_js__WEBPACK_IMPORTED_MODULE_259__["default"]; }, -/* harmony export */ xprod: function() { return /* reexport safe */ _xprod_js__WEBPACK_IMPORTED_MODULE_260__["default"]; }, -/* harmony export */ zip: function() { return /* reexport safe */ _zip_js__WEBPACK_IMPORTED_MODULE_261__["default"]; }, -/* harmony export */ zipObj: function() { return /* reexport safe */ _zipObj_js__WEBPACK_IMPORTED_MODULE_262__["default"]; }, -/* harmony export */ zipWith: function() { return /* reexport safe */ _zipWith_js__WEBPACK_IMPORTED_MODULE_263__["default"]; } +/* harmony export */ rgb2yuv: function() { return /* binding */ rgb2yuv; }, +/* harmony export */ yuv2rgb: function() { return /* binding */ yuv2rgb; } /* harmony export */ }); -/* harmony import */ var _F_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./F.js */ "./node_modules/ramda/es/F.js"); -/* harmony import */ var _T_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./T.js */ "./node_modules/ramda/es/T.js"); -/* harmony import */ var _js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./__.js */ "./node_modules/ramda/es/__.js"); -/* harmony import */ var _add_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./add.js */ "./node_modules/ramda/es/add.js"); -/* harmony import */ var _addIndex_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./addIndex.js */ "./node_modules/ramda/es/addIndex.js"); -/* harmony import */ var _addIndexRight_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./addIndexRight.js */ "./node_modules/ramda/es/addIndexRight.js"); -/* harmony import */ var _adjust_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./adjust.js */ "./node_modules/ramda/es/adjust.js"); -/* harmony import */ var _all_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./all.js */ "./node_modules/ramda/es/all.js"); -/* harmony import */ var _allPass_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./allPass.js */ "./node_modules/ramda/es/allPass.js"); -/* harmony import */ var _always_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./always.js */ "./node_modules/ramda/es/always.js"); -/* harmony import */ var _and_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./and.js */ "./node_modules/ramda/es/and.js"); -/* harmony import */ var _any_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./any.js */ "./node_modules/ramda/es/any.js"); -/* harmony import */ var _anyPass_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./anyPass.js */ "./node_modules/ramda/es/anyPass.js"); -/* harmony import */ var _ap_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./ap.js */ "./node_modules/ramda/es/ap.js"); -/* harmony import */ var _aperture_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./aperture.js */ "./node_modules/ramda/es/aperture.js"); -/* harmony import */ var _append_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./append.js */ "./node_modules/ramda/es/append.js"); -/* harmony import */ var _apply_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./apply.js */ "./node_modules/ramda/es/apply.js"); -/* harmony import */ var _applySpec_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./applySpec.js */ "./node_modules/ramda/es/applySpec.js"); -/* harmony import */ var _applyTo_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./applyTo.js */ "./node_modules/ramda/es/applyTo.js"); -/* harmony import */ var _ascend_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./ascend.js */ "./node_modules/ramda/es/ascend.js"); -/* harmony import */ var _assoc_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./assoc.js */ "./node_modules/ramda/es/assoc.js"); -/* harmony import */ var _assocPath_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./assocPath.js */ "./node_modules/ramda/es/assocPath.js"); -/* harmony import */ var _binary_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./binary.js */ "./node_modules/ramda/es/binary.js"); -/* harmony import */ var _bind_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./bind.js */ "./node_modules/ramda/es/bind.js"); -/* harmony import */ var _both_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./both.js */ "./node_modules/ramda/es/both.js"); -/* harmony import */ var _call_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./call.js */ "./node_modules/ramda/es/call.js"); -/* harmony import */ var _chain_js__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./chain.js */ "./node_modules/ramda/es/chain.js"); -/* harmony import */ var _clamp_js__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./clamp.js */ "./node_modules/ramda/es/clamp.js"); -/* harmony import */ var _clone_js__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./clone.js */ "./node_modules/ramda/es/clone.js"); -/* harmony import */ var _collectBy_js__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./collectBy.js */ "./node_modules/ramda/es/collectBy.js"); -/* harmony import */ var _comparator_js__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./comparator.js */ "./node_modules/ramda/es/comparator.js"); -/* harmony import */ var _complement_js__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./complement.js */ "./node_modules/ramda/es/complement.js"); -/* harmony import */ var _compose_js__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./compose.js */ "./node_modules/ramda/es/compose.js"); -/* harmony import */ var _composeWith_js__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./composeWith.js */ "./node_modules/ramda/es/composeWith.js"); -/* harmony import */ var _concat_js__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./concat.js */ "./node_modules/ramda/es/concat.js"); -/* harmony import */ var _cond_js__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./cond.js */ "./node_modules/ramda/es/cond.js"); -/* harmony import */ var _construct_js__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./construct.js */ "./node_modules/ramda/es/construct.js"); -/* harmony import */ var _constructN_js__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./constructN.js */ "./node_modules/ramda/es/constructN.js"); -/* harmony import */ var _converge_js__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./converge.js */ "./node_modules/ramda/es/converge.js"); -/* harmony import */ var _count_js__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./count.js */ "./node_modules/ramda/es/count.js"); -/* harmony import */ var _countBy_js__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./countBy.js */ "./node_modules/ramda/es/countBy.js"); -/* harmony import */ var _curry_js__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./curry.js */ "./node_modules/ramda/es/curry.js"); -/* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./curryN.js */ "./node_modules/ramda/es/curryN.js"); -/* harmony import */ var _dec_js__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./dec.js */ "./node_modules/ramda/es/dec.js"); -/* harmony import */ var _defaultTo_js__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./defaultTo.js */ "./node_modules/ramda/es/defaultTo.js"); -/* harmony import */ var _descend_js__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./descend.js */ "./node_modules/ramda/es/descend.js"); -/* harmony import */ var _difference_js__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./difference.js */ "./node_modules/ramda/es/difference.js"); -/* harmony import */ var _differenceWith_js__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./differenceWith.js */ "./node_modules/ramda/es/differenceWith.js"); -/* harmony import */ var _dissoc_js__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./dissoc.js */ "./node_modules/ramda/es/dissoc.js"); -/* harmony import */ var _dissocPath_js__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./dissocPath.js */ "./node_modules/ramda/es/dissocPath.js"); -/* harmony import */ var _divide_js__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./divide.js */ "./node_modules/ramda/es/divide.js"); -/* harmony import */ var _drop_js__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ./drop.js */ "./node_modules/ramda/es/drop.js"); -/* harmony import */ var _dropLast_js__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./dropLast.js */ "./node_modules/ramda/es/dropLast.js"); -/* harmony import */ var _dropLastWhile_js__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ./dropLastWhile.js */ "./node_modules/ramda/es/dropLastWhile.js"); -/* harmony import */ var _dropRepeats_js__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ./dropRepeats.js */ "./node_modules/ramda/es/dropRepeats.js"); -/* harmony import */ var _dropRepeatsBy_js__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ./dropRepeatsBy.js */ "./node_modules/ramda/es/dropRepeatsBy.js"); -/* harmony import */ var _dropRepeatsWith_js__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ./dropRepeatsWith.js */ "./node_modules/ramda/es/dropRepeatsWith.js"); -/* harmony import */ var _dropWhile_js__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ./dropWhile.js */ "./node_modules/ramda/es/dropWhile.js"); -/* harmony import */ var _either_js__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ./either.js */ "./node_modules/ramda/es/either.js"); -/* harmony import */ var _empty_js__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ./empty.js */ "./node_modules/ramda/es/empty.js"); -/* harmony import */ var _endsWith_js__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ./endsWith.js */ "./node_modules/ramda/es/endsWith.js"); -/* harmony import */ var _eqBy_js__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(/*! ./eqBy.js */ "./node_modules/ramda/es/eqBy.js"); -/* harmony import */ var _eqProps_js__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(/*! ./eqProps.js */ "./node_modules/ramda/es/eqProps.js"); -/* harmony import */ var _equals_js__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(/*! ./equals.js */ "./node_modules/ramda/es/equals.js"); -/* harmony import */ var _evolve_js__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(/*! ./evolve.js */ "./node_modules/ramda/es/evolve.js"); -/* harmony import */ var _filter_js__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(/*! ./filter.js */ "./node_modules/ramda/es/filter.js"); -/* harmony import */ var _find_js__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(/*! ./find.js */ "./node_modules/ramda/es/find.js"); -/* harmony import */ var _findIndex_js__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(/*! ./findIndex.js */ "./node_modules/ramda/es/findIndex.js"); -/* harmony import */ var _findLast_js__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(/*! ./findLast.js */ "./node_modules/ramda/es/findLast.js"); -/* harmony import */ var _findLastIndex_js__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(/*! ./findLastIndex.js */ "./node_modules/ramda/es/findLastIndex.js"); -/* harmony import */ var _flatten_js__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(/*! ./flatten.js */ "./node_modules/ramda/es/flatten.js"); -/* harmony import */ var _flip_js__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(/*! ./flip.js */ "./node_modules/ramda/es/flip.js"); -/* harmony import */ var _forEach_js__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(/*! ./forEach.js */ "./node_modules/ramda/es/forEach.js"); -/* harmony import */ var _forEachObjIndexed_js__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(/*! ./forEachObjIndexed.js */ "./node_modules/ramda/es/forEachObjIndexed.js"); -/* harmony import */ var _fromPairs_js__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(/*! ./fromPairs.js */ "./node_modules/ramda/es/fromPairs.js"); -/* harmony import */ var _groupBy_js__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(/*! ./groupBy.js */ "./node_modules/ramda/es/groupBy.js"); -/* harmony import */ var _groupWith_js__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(/*! ./groupWith.js */ "./node_modules/ramda/es/groupWith.js"); -/* harmony import */ var _gt_js__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(/*! ./gt.js */ "./node_modules/ramda/es/gt.js"); -/* harmony import */ var _gte_js__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(/*! ./gte.js */ "./node_modules/ramda/es/gte.js"); -/* harmony import */ var _has_js__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(/*! ./has.js */ "./node_modules/ramda/es/has.js"); -/* harmony import */ var _hasIn_js__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(/*! ./hasIn.js */ "./node_modules/ramda/es/hasIn.js"); -/* harmony import */ var _hasPath_js__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(/*! ./hasPath.js */ "./node_modules/ramda/es/hasPath.js"); -/* harmony import */ var _head_js__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(/*! ./head.js */ "./node_modules/ramda/es/head.js"); -/* harmony import */ var _identical_js__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(/*! ./identical.js */ "./node_modules/ramda/es/identical.js"); -/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_84__ = __webpack_require__(/*! ./identity.js */ "./node_modules/ramda/es/identity.js"); -/* harmony import */ var _ifElse_js__WEBPACK_IMPORTED_MODULE_85__ = __webpack_require__(/*! ./ifElse.js */ "./node_modules/ramda/es/ifElse.js"); -/* harmony import */ var _inc_js__WEBPACK_IMPORTED_MODULE_86__ = __webpack_require__(/*! ./inc.js */ "./node_modules/ramda/es/inc.js"); -/* harmony import */ var _includes_js__WEBPACK_IMPORTED_MODULE_87__ = __webpack_require__(/*! ./includes.js */ "./node_modules/ramda/es/includes.js"); -/* harmony import */ var _indexBy_js__WEBPACK_IMPORTED_MODULE_88__ = __webpack_require__(/*! ./indexBy.js */ "./node_modules/ramda/es/indexBy.js"); -/* harmony import */ var _indexOf_js__WEBPACK_IMPORTED_MODULE_89__ = __webpack_require__(/*! ./indexOf.js */ "./node_modules/ramda/es/indexOf.js"); -/* harmony import */ var _init_js__WEBPACK_IMPORTED_MODULE_90__ = __webpack_require__(/*! ./init.js */ "./node_modules/ramda/es/init.js"); -/* harmony import */ var _innerJoin_js__WEBPACK_IMPORTED_MODULE_91__ = __webpack_require__(/*! ./innerJoin.js */ "./node_modules/ramda/es/innerJoin.js"); -/* harmony import */ var _insert_js__WEBPACK_IMPORTED_MODULE_92__ = __webpack_require__(/*! ./insert.js */ "./node_modules/ramda/es/insert.js"); -/* harmony import */ var _insertAll_js__WEBPACK_IMPORTED_MODULE_93__ = __webpack_require__(/*! ./insertAll.js */ "./node_modules/ramda/es/insertAll.js"); -/* harmony import */ var _intersection_js__WEBPACK_IMPORTED_MODULE_94__ = __webpack_require__(/*! ./intersection.js */ "./node_modules/ramda/es/intersection.js"); -/* harmony import */ var _intersperse_js__WEBPACK_IMPORTED_MODULE_95__ = __webpack_require__(/*! ./intersperse.js */ "./node_modules/ramda/es/intersperse.js"); -/* harmony import */ var _into_js__WEBPACK_IMPORTED_MODULE_96__ = __webpack_require__(/*! ./into.js */ "./node_modules/ramda/es/into.js"); -/* harmony import */ var _invert_js__WEBPACK_IMPORTED_MODULE_97__ = __webpack_require__(/*! ./invert.js */ "./node_modules/ramda/es/invert.js"); -/* harmony import */ var _invertObj_js__WEBPACK_IMPORTED_MODULE_98__ = __webpack_require__(/*! ./invertObj.js */ "./node_modules/ramda/es/invertObj.js"); -/* harmony import */ var _invoker_js__WEBPACK_IMPORTED_MODULE_99__ = __webpack_require__(/*! ./invoker.js */ "./node_modules/ramda/es/invoker.js"); -/* harmony import */ var _is_js__WEBPACK_IMPORTED_MODULE_100__ = __webpack_require__(/*! ./is.js */ "./node_modules/ramda/es/is.js"); -/* harmony import */ var _isEmpty_js__WEBPACK_IMPORTED_MODULE_101__ = __webpack_require__(/*! ./isEmpty.js */ "./node_modules/ramda/es/isEmpty.js"); -/* harmony import */ var _isNil_js__WEBPACK_IMPORTED_MODULE_102__ = __webpack_require__(/*! ./isNil.js */ "./node_modules/ramda/es/isNil.js"); -/* harmony import */ var _isNotNil_js__WEBPACK_IMPORTED_MODULE_103__ = __webpack_require__(/*! ./isNotNil.js */ "./node_modules/ramda/es/isNotNil.js"); -/* harmony import */ var _join_js__WEBPACK_IMPORTED_MODULE_104__ = __webpack_require__(/*! ./join.js */ "./node_modules/ramda/es/join.js"); -/* harmony import */ var _juxt_js__WEBPACK_IMPORTED_MODULE_105__ = __webpack_require__(/*! ./juxt.js */ "./node_modules/ramda/es/juxt.js"); -/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_106__ = __webpack_require__(/*! ./keys.js */ "./node_modules/ramda/es/keys.js"); -/* harmony import */ var _keysIn_js__WEBPACK_IMPORTED_MODULE_107__ = __webpack_require__(/*! ./keysIn.js */ "./node_modules/ramda/es/keysIn.js"); -/* harmony import */ var _last_js__WEBPACK_IMPORTED_MODULE_108__ = __webpack_require__(/*! ./last.js */ "./node_modules/ramda/es/last.js"); -/* harmony import */ var _lastIndexOf_js__WEBPACK_IMPORTED_MODULE_109__ = __webpack_require__(/*! ./lastIndexOf.js */ "./node_modules/ramda/es/lastIndexOf.js"); -/* harmony import */ var _length_js__WEBPACK_IMPORTED_MODULE_110__ = __webpack_require__(/*! ./length.js */ "./node_modules/ramda/es/length.js"); -/* harmony import */ var _lens_js__WEBPACK_IMPORTED_MODULE_111__ = __webpack_require__(/*! ./lens.js */ "./node_modules/ramda/es/lens.js"); -/* harmony import */ var _lensIndex_js__WEBPACK_IMPORTED_MODULE_112__ = __webpack_require__(/*! ./lensIndex.js */ "./node_modules/ramda/es/lensIndex.js"); -/* harmony import */ var _lensPath_js__WEBPACK_IMPORTED_MODULE_113__ = __webpack_require__(/*! ./lensPath.js */ "./node_modules/ramda/es/lensPath.js"); -/* harmony import */ var _lensProp_js__WEBPACK_IMPORTED_MODULE_114__ = __webpack_require__(/*! ./lensProp.js */ "./node_modules/ramda/es/lensProp.js"); -/* harmony import */ var _lift_js__WEBPACK_IMPORTED_MODULE_115__ = __webpack_require__(/*! ./lift.js */ "./node_modules/ramda/es/lift.js"); -/* harmony import */ var _liftN_js__WEBPACK_IMPORTED_MODULE_116__ = __webpack_require__(/*! ./liftN.js */ "./node_modules/ramda/es/liftN.js"); -/* harmony import */ var _lt_js__WEBPACK_IMPORTED_MODULE_117__ = __webpack_require__(/*! ./lt.js */ "./node_modules/ramda/es/lt.js"); -/* harmony import */ var _lte_js__WEBPACK_IMPORTED_MODULE_118__ = __webpack_require__(/*! ./lte.js */ "./node_modules/ramda/es/lte.js"); -/* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_119__ = __webpack_require__(/*! ./map.js */ "./node_modules/ramda/es/map.js"); -/* harmony import */ var _mapAccum_js__WEBPACK_IMPORTED_MODULE_120__ = __webpack_require__(/*! ./mapAccum.js */ "./node_modules/ramda/es/mapAccum.js"); -/* harmony import */ var _mapAccumRight_js__WEBPACK_IMPORTED_MODULE_121__ = __webpack_require__(/*! ./mapAccumRight.js */ "./node_modules/ramda/es/mapAccumRight.js"); -/* harmony import */ var _mapObjIndexed_js__WEBPACK_IMPORTED_MODULE_122__ = __webpack_require__(/*! ./mapObjIndexed.js */ "./node_modules/ramda/es/mapObjIndexed.js"); -/* harmony import */ var _match_js__WEBPACK_IMPORTED_MODULE_123__ = __webpack_require__(/*! ./match.js */ "./node_modules/ramda/es/match.js"); -/* harmony import */ var _mathMod_js__WEBPACK_IMPORTED_MODULE_124__ = __webpack_require__(/*! ./mathMod.js */ "./node_modules/ramda/es/mathMod.js"); -/* harmony import */ var _max_js__WEBPACK_IMPORTED_MODULE_125__ = __webpack_require__(/*! ./max.js */ "./node_modules/ramda/es/max.js"); -/* harmony import */ var _maxBy_js__WEBPACK_IMPORTED_MODULE_126__ = __webpack_require__(/*! ./maxBy.js */ "./node_modules/ramda/es/maxBy.js"); -/* harmony import */ var _mean_js__WEBPACK_IMPORTED_MODULE_127__ = __webpack_require__(/*! ./mean.js */ "./node_modules/ramda/es/mean.js"); -/* harmony import */ var _median_js__WEBPACK_IMPORTED_MODULE_128__ = __webpack_require__(/*! ./median.js */ "./node_modules/ramda/es/median.js"); -/* harmony import */ var _memoizeWith_js__WEBPACK_IMPORTED_MODULE_129__ = __webpack_require__(/*! ./memoizeWith.js */ "./node_modules/ramda/es/memoizeWith.js"); -/* harmony import */ var _mergeAll_js__WEBPACK_IMPORTED_MODULE_130__ = __webpack_require__(/*! ./mergeAll.js */ "./node_modules/ramda/es/mergeAll.js"); -/* harmony import */ var _mergeDeepLeft_js__WEBPACK_IMPORTED_MODULE_131__ = __webpack_require__(/*! ./mergeDeepLeft.js */ "./node_modules/ramda/es/mergeDeepLeft.js"); -/* harmony import */ var _mergeDeepRight_js__WEBPACK_IMPORTED_MODULE_132__ = __webpack_require__(/*! ./mergeDeepRight.js */ "./node_modules/ramda/es/mergeDeepRight.js"); -/* harmony import */ var _mergeDeepWith_js__WEBPACK_IMPORTED_MODULE_133__ = __webpack_require__(/*! ./mergeDeepWith.js */ "./node_modules/ramda/es/mergeDeepWith.js"); -/* harmony import */ var _mergeDeepWithKey_js__WEBPACK_IMPORTED_MODULE_134__ = __webpack_require__(/*! ./mergeDeepWithKey.js */ "./node_modules/ramda/es/mergeDeepWithKey.js"); -/* harmony import */ var _mergeLeft_js__WEBPACK_IMPORTED_MODULE_135__ = __webpack_require__(/*! ./mergeLeft.js */ "./node_modules/ramda/es/mergeLeft.js"); -/* harmony import */ var _mergeRight_js__WEBPACK_IMPORTED_MODULE_136__ = __webpack_require__(/*! ./mergeRight.js */ "./node_modules/ramda/es/mergeRight.js"); -/* harmony import */ var _mergeWith_js__WEBPACK_IMPORTED_MODULE_137__ = __webpack_require__(/*! ./mergeWith.js */ "./node_modules/ramda/es/mergeWith.js"); -/* harmony import */ var _mergeWithKey_js__WEBPACK_IMPORTED_MODULE_138__ = __webpack_require__(/*! ./mergeWithKey.js */ "./node_modules/ramda/es/mergeWithKey.js"); -/* harmony import */ var _min_js__WEBPACK_IMPORTED_MODULE_139__ = __webpack_require__(/*! ./min.js */ "./node_modules/ramda/es/min.js"); -/* harmony import */ var _minBy_js__WEBPACK_IMPORTED_MODULE_140__ = __webpack_require__(/*! ./minBy.js */ "./node_modules/ramda/es/minBy.js"); -/* harmony import */ var _modify_js__WEBPACK_IMPORTED_MODULE_141__ = __webpack_require__(/*! ./modify.js */ "./node_modules/ramda/es/modify.js"); -/* harmony import */ var _modifyPath_js__WEBPACK_IMPORTED_MODULE_142__ = __webpack_require__(/*! ./modifyPath.js */ "./node_modules/ramda/es/modifyPath.js"); -/* harmony import */ var _modulo_js__WEBPACK_IMPORTED_MODULE_143__ = __webpack_require__(/*! ./modulo.js */ "./node_modules/ramda/es/modulo.js"); -/* harmony import */ var _move_js__WEBPACK_IMPORTED_MODULE_144__ = __webpack_require__(/*! ./move.js */ "./node_modules/ramda/es/move.js"); -/* harmony import */ var _multiply_js__WEBPACK_IMPORTED_MODULE_145__ = __webpack_require__(/*! ./multiply.js */ "./node_modules/ramda/es/multiply.js"); -/* harmony import */ var _nAry_js__WEBPACK_IMPORTED_MODULE_146__ = __webpack_require__(/*! ./nAry.js */ "./node_modules/ramda/es/nAry.js"); -/* harmony import */ var _partialObject_js__WEBPACK_IMPORTED_MODULE_147__ = __webpack_require__(/*! ./partialObject.js */ "./node_modules/ramda/es/partialObject.js"); -/* harmony import */ var _negate_js__WEBPACK_IMPORTED_MODULE_148__ = __webpack_require__(/*! ./negate.js */ "./node_modules/ramda/es/negate.js"); -/* harmony import */ var _none_js__WEBPACK_IMPORTED_MODULE_149__ = __webpack_require__(/*! ./none.js */ "./node_modules/ramda/es/none.js"); -/* harmony import */ var _not_js__WEBPACK_IMPORTED_MODULE_150__ = __webpack_require__(/*! ./not.js */ "./node_modules/ramda/es/not.js"); -/* harmony import */ var _nth_js__WEBPACK_IMPORTED_MODULE_151__ = __webpack_require__(/*! ./nth.js */ "./node_modules/ramda/es/nth.js"); -/* harmony import */ var _nthArg_js__WEBPACK_IMPORTED_MODULE_152__ = __webpack_require__(/*! ./nthArg.js */ "./node_modules/ramda/es/nthArg.js"); -/* harmony import */ var _o_js__WEBPACK_IMPORTED_MODULE_153__ = __webpack_require__(/*! ./o.js */ "./node_modules/ramda/es/o.js"); -/* harmony import */ var _objOf_js__WEBPACK_IMPORTED_MODULE_154__ = __webpack_require__(/*! ./objOf.js */ "./node_modules/ramda/es/objOf.js"); -/* harmony import */ var _of_js__WEBPACK_IMPORTED_MODULE_155__ = __webpack_require__(/*! ./of.js */ "./node_modules/ramda/es/of.js"); -/* harmony import */ var _omit_js__WEBPACK_IMPORTED_MODULE_156__ = __webpack_require__(/*! ./omit.js */ "./node_modules/ramda/es/omit.js"); -/* harmony import */ var _on_js__WEBPACK_IMPORTED_MODULE_157__ = __webpack_require__(/*! ./on.js */ "./node_modules/ramda/es/on.js"); -/* harmony import */ var _once_js__WEBPACK_IMPORTED_MODULE_158__ = __webpack_require__(/*! ./once.js */ "./node_modules/ramda/es/once.js"); -/* harmony import */ var _or_js__WEBPACK_IMPORTED_MODULE_159__ = __webpack_require__(/*! ./or.js */ "./node_modules/ramda/es/or.js"); -/* harmony import */ var _otherwise_js__WEBPACK_IMPORTED_MODULE_160__ = __webpack_require__(/*! ./otherwise.js */ "./node_modules/ramda/es/otherwise.js"); -/* harmony import */ var _over_js__WEBPACK_IMPORTED_MODULE_161__ = __webpack_require__(/*! ./over.js */ "./node_modules/ramda/es/over.js"); -/* harmony import */ var _pair_js__WEBPACK_IMPORTED_MODULE_162__ = __webpack_require__(/*! ./pair.js */ "./node_modules/ramda/es/pair.js"); -/* harmony import */ var _partial_js__WEBPACK_IMPORTED_MODULE_163__ = __webpack_require__(/*! ./partial.js */ "./node_modules/ramda/es/partial.js"); -/* harmony import */ var _partialRight_js__WEBPACK_IMPORTED_MODULE_164__ = __webpack_require__(/*! ./partialRight.js */ "./node_modules/ramda/es/partialRight.js"); -/* harmony import */ var _partition_js__WEBPACK_IMPORTED_MODULE_165__ = __webpack_require__(/*! ./partition.js */ "./node_modules/ramda/es/partition.js"); -/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_166__ = __webpack_require__(/*! ./path.js */ "./node_modules/ramda/es/path.js"); -/* harmony import */ var _paths_js__WEBPACK_IMPORTED_MODULE_167__ = __webpack_require__(/*! ./paths.js */ "./node_modules/ramda/es/paths.js"); -/* harmony import */ var _pathEq_js__WEBPACK_IMPORTED_MODULE_168__ = __webpack_require__(/*! ./pathEq.js */ "./node_modules/ramda/es/pathEq.js"); -/* harmony import */ var _pathOr_js__WEBPACK_IMPORTED_MODULE_169__ = __webpack_require__(/*! ./pathOr.js */ "./node_modules/ramda/es/pathOr.js"); -/* harmony import */ var _pathSatisfies_js__WEBPACK_IMPORTED_MODULE_170__ = __webpack_require__(/*! ./pathSatisfies.js */ "./node_modules/ramda/es/pathSatisfies.js"); -/* harmony import */ var _pick_js__WEBPACK_IMPORTED_MODULE_171__ = __webpack_require__(/*! ./pick.js */ "./node_modules/ramda/es/pick.js"); -/* harmony import */ var _pickAll_js__WEBPACK_IMPORTED_MODULE_172__ = __webpack_require__(/*! ./pickAll.js */ "./node_modules/ramda/es/pickAll.js"); -/* harmony import */ var _pickBy_js__WEBPACK_IMPORTED_MODULE_173__ = __webpack_require__(/*! ./pickBy.js */ "./node_modules/ramda/es/pickBy.js"); -/* harmony import */ var _pipe_js__WEBPACK_IMPORTED_MODULE_174__ = __webpack_require__(/*! ./pipe.js */ "./node_modules/ramda/es/pipe.js"); -/* harmony import */ var _pipeWith_js__WEBPACK_IMPORTED_MODULE_175__ = __webpack_require__(/*! ./pipeWith.js */ "./node_modules/ramda/es/pipeWith.js"); -/* harmony import */ var _pluck_js__WEBPACK_IMPORTED_MODULE_176__ = __webpack_require__(/*! ./pluck.js */ "./node_modules/ramda/es/pluck.js"); -/* harmony import */ var _prepend_js__WEBPACK_IMPORTED_MODULE_177__ = __webpack_require__(/*! ./prepend.js */ "./node_modules/ramda/es/prepend.js"); -/* harmony import */ var _product_js__WEBPACK_IMPORTED_MODULE_178__ = __webpack_require__(/*! ./product.js */ "./node_modules/ramda/es/product.js"); -/* harmony import */ var _project_js__WEBPACK_IMPORTED_MODULE_179__ = __webpack_require__(/*! ./project.js */ "./node_modules/ramda/es/project.js"); -/* harmony import */ var _promap_js__WEBPACK_IMPORTED_MODULE_180__ = __webpack_require__(/*! ./promap.js */ "./node_modules/ramda/es/promap.js"); -/* harmony import */ var _prop_js__WEBPACK_IMPORTED_MODULE_181__ = __webpack_require__(/*! ./prop.js */ "./node_modules/ramda/es/prop.js"); -/* harmony import */ var _propEq_js__WEBPACK_IMPORTED_MODULE_182__ = __webpack_require__(/*! ./propEq.js */ "./node_modules/ramda/es/propEq.js"); -/* harmony import */ var _propIs_js__WEBPACK_IMPORTED_MODULE_183__ = __webpack_require__(/*! ./propIs.js */ "./node_modules/ramda/es/propIs.js"); -/* harmony import */ var _propOr_js__WEBPACK_IMPORTED_MODULE_184__ = __webpack_require__(/*! ./propOr.js */ "./node_modules/ramda/es/propOr.js"); -/* harmony import */ var _propSatisfies_js__WEBPACK_IMPORTED_MODULE_185__ = __webpack_require__(/*! ./propSatisfies.js */ "./node_modules/ramda/es/propSatisfies.js"); -/* harmony import */ var _props_js__WEBPACK_IMPORTED_MODULE_186__ = __webpack_require__(/*! ./props.js */ "./node_modules/ramda/es/props.js"); -/* harmony import */ var _range_js__WEBPACK_IMPORTED_MODULE_187__ = __webpack_require__(/*! ./range.js */ "./node_modules/ramda/es/range.js"); -/* harmony import */ var _reduce_js__WEBPACK_IMPORTED_MODULE_188__ = __webpack_require__(/*! ./reduce.js */ "./node_modules/ramda/es/reduce.js"); -/* harmony import */ var _reduceBy_js__WEBPACK_IMPORTED_MODULE_189__ = __webpack_require__(/*! ./reduceBy.js */ "./node_modules/ramda/es/reduceBy.js"); -/* harmony import */ var _reduceRight_js__WEBPACK_IMPORTED_MODULE_190__ = __webpack_require__(/*! ./reduceRight.js */ "./node_modules/ramda/es/reduceRight.js"); -/* harmony import */ var _reduceWhile_js__WEBPACK_IMPORTED_MODULE_191__ = __webpack_require__(/*! ./reduceWhile.js */ "./node_modules/ramda/es/reduceWhile.js"); -/* harmony import */ var _reduced_js__WEBPACK_IMPORTED_MODULE_192__ = __webpack_require__(/*! ./reduced.js */ "./node_modules/ramda/es/reduced.js"); -/* harmony import */ var _reject_js__WEBPACK_IMPORTED_MODULE_193__ = __webpack_require__(/*! ./reject.js */ "./node_modules/ramda/es/reject.js"); -/* harmony import */ var _remove_js__WEBPACK_IMPORTED_MODULE_194__ = __webpack_require__(/*! ./remove.js */ "./node_modules/ramda/es/remove.js"); -/* harmony import */ var _repeat_js__WEBPACK_IMPORTED_MODULE_195__ = __webpack_require__(/*! ./repeat.js */ "./node_modules/ramda/es/repeat.js"); -/* harmony import */ var _replace_js__WEBPACK_IMPORTED_MODULE_196__ = __webpack_require__(/*! ./replace.js */ "./node_modules/ramda/es/replace.js"); -/* harmony import */ var _reverse_js__WEBPACK_IMPORTED_MODULE_197__ = __webpack_require__(/*! ./reverse.js */ "./node_modules/ramda/es/reverse.js"); -/* harmony import */ var _scan_js__WEBPACK_IMPORTED_MODULE_198__ = __webpack_require__(/*! ./scan.js */ "./node_modules/ramda/es/scan.js"); -/* harmony import */ var _sequence_js__WEBPACK_IMPORTED_MODULE_199__ = __webpack_require__(/*! ./sequence.js */ "./node_modules/ramda/es/sequence.js"); -/* harmony import */ var _set_js__WEBPACK_IMPORTED_MODULE_200__ = __webpack_require__(/*! ./set.js */ "./node_modules/ramda/es/set.js"); -/* harmony import */ var _slice_js__WEBPACK_IMPORTED_MODULE_201__ = __webpack_require__(/*! ./slice.js */ "./node_modules/ramda/es/slice.js"); -/* harmony import */ var _sort_js__WEBPACK_IMPORTED_MODULE_202__ = __webpack_require__(/*! ./sort.js */ "./node_modules/ramda/es/sort.js"); -/* harmony import */ var _sortBy_js__WEBPACK_IMPORTED_MODULE_203__ = __webpack_require__(/*! ./sortBy.js */ "./node_modules/ramda/es/sortBy.js"); -/* harmony import */ var _sortWith_js__WEBPACK_IMPORTED_MODULE_204__ = __webpack_require__(/*! ./sortWith.js */ "./node_modules/ramda/es/sortWith.js"); -/* harmony import */ var _split_js__WEBPACK_IMPORTED_MODULE_205__ = __webpack_require__(/*! ./split.js */ "./node_modules/ramda/es/split.js"); -/* harmony import */ var _splitAt_js__WEBPACK_IMPORTED_MODULE_206__ = __webpack_require__(/*! ./splitAt.js */ "./node_modules/ramda/es/splitAt.js"); -/* harmony import */ var _splitEvery_js__WEBPACK_IMPORTED_MODULE_207__ = __webpack_require__(/*! ./splitEvery.js */ "./node_modules/ramda/es/splitEvery.js"); -/* harmony import */ var _splitWhen_js__WEBPACK_IMPORTED_MODULE_208__ = __webpack_require__(/*! ./splitWhen.js */ "./node_modules/ramda/es/splitWhen.js"); -/* harmony import */ var _splitWhenever_js__WEBPACK_IMPORTED_MODULE_209__ = __webpack_require__(/*! ./splitWhenever.js */ "./node_modules/ramda/es/splitWhenever.js"); -/* harmony import */ var _startsWith_js__WEBPACK_IMPORTED_MODULE_210__ = __webpack_require__(/*! ./startsWith.js */ "./node_modules/ramda/es/startsWith.js"); -/* harmony import */ var _subtract_js__WEBPACK_IMPORTED_MODULE_211__ = __webpack_require__(/*! ./subtract.js */ "./node_modules/ramda/es/subtract.js"); -/* harmony import */ var _sum_js__WEBPACK_IMPORTED_MODULE_212__ = __webpack_require__(/*! ./sum.js */ "./node_modules/ramda/es/sum.js"); -/* harmony import */ var _swap_js__WEBPACK_IMPORTED_MODULE_213__ = __webpack_require__(/*! ./swap.js */ "./node_modules/ramda/es/swap.js"); -/* harmony import */ var _symmetricDifference_js__WEBPACK_IMPORTED_MODULE_214__ = __webpack_require__(/*! ./symmetricDifference.js */ "./node_modules/ramda/es/symmetricDifference.js"); -/* harmony import */ var _symmetricDifferenceWith_js__WEBPACK_IMPORTED_MODULE_215__ = __webpack_require__(/*! ./symmetricDifferenceWith.js */ "./node_modules/ramda/es/symmetricDifferenceWith.js"); -/* harmony import */ var _tail_js__WEBPACK_IMPORTED_MODULE_216__ = __webpack_require__(/*! ./tail.js */ "./node_modules/ramda/es/tail.js"); -/* harmony import */ var _take_js__WEBPACK_IMPORTED_MODULE_217__ = __webpack_require__(/*! ./take.js */ "./node_modules/ramda/es/take.js"); -/* harmony import */ var _takeLast_js__WEBPACK_IMPORTED_MODULE_218__ = __webpack_require__(/*! ./takeLast.js */ "./node_modules/ramda/es/takeLast.js"); -/* harmony import */ var _takeLastWhile_js__WEBPACK_IMPORTED_MODULE_219__ = __webpack_require__(/*! ./takeLastWhile.js */ "./node_modules/ramda/es/takeLastWhile.js"); -/* harmony import */ var _takeWhile_js__WEBPACK_IMPORTED_MODULE_220__ = __webpack_require__(/*! ./takeWhile.js */ "./node_modules/ramda/es/takeWhile.js"); -/* harmony import */ var _tap_js__WEBPACK_IMPORTED_MODULE_221__ = __webpack_require__(/*! ./tap.js */ "./node_modules/ramda/es/tap.js"); -/* harmony import */ var _test_js__WEBPACK_IMPORTED_MODULE_222__ = __webpack_require__(/*! ./test.js */ "./node_modules/ramda/es/test.js"); -/* harmony import */ var _andThen_js__WEBPACK_IMPORTED_MODULE_223__ = __webpack_require__(/*! ./andThen.js */ "./node_modules/ramda/es/andThen.js"); -/* harmony import */ var _times_js__WEBPACK_IMPORTED_MODULE_224__ = __webpack_require__(/*! ./times.js */ "./node_modules/ramda/es/times.js"); -/* harmony import */ var _toLower_js__WEBPACK_IMPORTED_MODULE_225__ = __webpack_require__(/*! ./toLower.js */ "./node_modules/ramda/es/toLower.js"); -/* harmony import */ var _toPairs_js__WEBPACK_IMPORTED_MODULE_226__ = __webpack_require__(/*! ./toPairs.js */ "./node_modules/ramda/es/toPairs.js"); -/* harmony import */ var _toPairsIn_js__WEBPACK_IMPORTED_MODULE_227__ = __webpack_require__(/*! ./toPairsIn.js */ "./node_modules/ramda/es/toPairsIn.js"); -/* harmony import */ var _toString_js__WEBPACK_IMPORTED_MODULE_228__ = __webpack_require__(/*! ./toString.js */ "./node_modules/ramda/es/toString.js"); -/* harmony import */ var _toUpper_js__WEBPACK_IMPORTED_MODULE_229__ = __webpack_require__(/*! ./toUpper.js */ "./node_modules/ramda/es/toUpper.js"); -/* harmony import */ var _transduce_js__WEBPACK_IMPORTED_MODULE_230__ = __webpack_require__(/*! ./transduce.js */ "./node_modules/ramda/es/transduce.js"); -/* harmony import */ var _transpose_js__WEBPACK_IMPORTED_MODULE_231__ = __webpack_require__(/*! ./transpose.js */ "./node_modules/ramda/es/transpose.js"); -/* harmony import */ var _traverse_js__WEBPACK_IMPORTED_MODULE_232__ = __webpack_require__(/*! ./traverse.js */ "./node_modules/ramda/es/traverse.js"); -/* harmony import */ var _trim_js__WEBPACK_IMPORTED_MODULE_233__ = __webpack_require__(/*! ./trim.js */ "./node_modules/ramda/es/trim.js"); -/* harmony import */ var _tryCatch_js__WEBPACK_IMPORTED_MODULE_234__ = __webpack_require__(/*! ./tryCatch.js */ "./node_modules/ramda/es/tryCatch.js"); -/* harmony import */ var _type_js__WEBPACK_IMPORTED_MODULE_235__ = __webpack_require__(/*! ./type.js */ "./node_modules/ramda/es/type.js"); -/* harmony import */ var _unapply_js__WEBPACK_IMPORTED_MODULE_236__ = __webpack_require__(/*! ./unapply.js */ "./node_modules/ramda/es/unapply.js"); -/* harmony import */ var _unary_js__WEBPACK_IMPORTED_MODULE_237__ = __webpack_require__(/*! ./unary.js */ "./node_modules/ramda/es/unary.js"); -/* harmony import */ var _uncurryN_js__WEBPACK_IMPORTED_MODULE_238__ = __webpack_require__(/*! ./uncurryN.js */ "./node_modules/ramda/es/uncurryN.js"); -/* harmony import */ var _unfold_js__WEBPACK_IMPORTED_MODULE_239__ = __webpack_require__(/*! ./unfold.js */ "./node_modules/ramda/es/unfold.js"); -/* harmony import */ var _union_js__WEBPACK_IMPORTED_MODULE_240__ = __webpack_require__(/*! ./union.js */ "./node_modules/ramda/es/union.js"); -/* harmony import */ var _unionWith_js__WEBPACK_IMPORTED_MODULE_241__ = __webpack_require__(/*! ./unionWith.js */ "./node_modules/ramda/es/unionWith.js"); -/* harmony import */ var _uniq_js__WEBPACK_IMPORTED_MODULE_242__ = __webpack_require__(/*! ./uniq.js */ "./node_modules/ramda/es/uniq.js"); -/* harmony import */ var _uniqBy_js__WEBPACK_IMPORTED_MODULE_243__ = __webpack_require__(/*! ./uniqBy.js */ "./node_modules/ramda/es/uniqBy.js"); -/* harmony import */ var _uniqWith_js__WEBPACK_IMPORTED_MODULE_244__ = __webpack_require__(/*! ./uniqWith.js */ "./node_modules/ramda/es/uniqWith.js"); -/* harmony import */ var _unless_js__WEBPACK_IMPORTED_MODULE_245__ = __webpack_require__(/*! ./unless.js */ "./node_modules/ramda/es/unless.js"); -/* harmony import */ var _unnest_js__WEBPACK_IMPORTED_MODULE_246__ = __webpack_require__(/*! ./unnest.js */ "./node_modules/ramda/es/unnest.js"); -/* harmony import */ var _until_js__WEBPACK_IMPORTED_MODULE_247__ = __webpack_require__(/*! ./until.js */ "./node_modules/ramda/es/until.js"); -/* harmony import */ var _unwind_js__WEBPACK_IMPORTED_MODULE_248__ = __webpack_require__(/*! ./unwind.js */ "./node_modules/ramda/es/unwind.js"); -/* harmony import */ var _update_js__WEBPACK_IMPORTED_MODULE_249__ = __webpack_require__(/*! ./update.js */ "./node_modules/ramda/es/update.js"); -/* harmony import */ var _useWith_js__WEBPACK_IMPORTED_MODULE_250__ = __webpack_require__(/*! ./useWith.js */ "./node_modules/ramda/es/useWith.js"); -/* harmony import */ var _values_js__WEBPACK_IMPORTED_MODULE_251__ = __webpack_require__(/*! ./values.js */ "./node_modules/ramda/es/values.js"); -/* harmony import */ var _valuesIn_js__WEBPACK_IMPORTED_MODULE_252__ = __webpack_require__(/*! ./valuesIn.js */ "./node_modules/ramda/es/valuesIn.js"); -/* harmony import */ var _view_js__WEBPACK_IMPORTED_MODULE_253__ = __webpack_require__(/*! ./view.js */ "./node_modules/ramda/es/view.js"); -/* harmony import */ var _when_js__WEBPACK_IMPORTED_MODULE_254__ = __webpack_require__(/*! ./when.js */ "./node_modules/ramda/es/when.js"); -/* harmony import */ var _where_js__WEBPACK_IMPORTED_MODULE_255__ = __webpack_require__(/*! ./where.js */ "./node_modules/ramda/es/where.js"); -/* harmony import */ var _whereAny_js__WEBPACK_IMPORTED_MODULE_256__ = __webpack_require__(/*! ./whereAny.js */ "./node_modules/ramda/es/whereAny.js"); -/* harmony import */ var _whereEq_js__WEBPACK_IMPORTED_MODULE_257__ = __webpack_require__(/*! ./whereEq.js */ "./node_modules/ramda/es/whereEq.js"); -/* harmony import */ var _without_js__WEBPACK_IMPORTED_MODULE_258__ = __webpack_require__(/*! ./without.js */ "./node_modules/ramda/es/without.js"); -/* harmony import */ var _xor_js__WEBPACK_IMPORTED_MODULE_259__ = __webpack_require__(/*! ./xor.js */ "./node_modules/ramda/es/xor.js"); -/* harmony import */ var _xprod_js__WEBPACK_IMPORTED_MODULE_260__ = __webpack_require__(/*! ./xprod.js */ "./node_modules/ramda/es/xprod.js"); -/* harmony import */ var _zip_js__WEBPACK_IMPORTED_MODULE_261__ = __webpack_require__(/*! ./zip.js */ "./node_modules/ramda/es/zip.js"); -/* harmony import */ var _zipObj_js__WEBPACK_IMPORTED_MODULE_262__ = __webpack_require__(/*! ./zipObj.js */ "./node_modules/ramda/es/zipObj.js"); -/* harmony import */ var _zipWith_js__WEBPACK_IMPORTED_MODULE_263__ = __webpack_require__(/*! ./zipWith.js */ "./node_modules/ramda/es/zipWith.js"); -/* harmony import */ var _thunkify_js__WEBPACK_IMPORTED_MODULE_264__ = __webpack_require__(/*! ./thunkify.js */ "./node_modules/ramda/es/thunkify.js"); - - - - - - +function yuv2rgb(yuv) { + var y = yuv[0], + u = yuv[1], + v = yuv[2]; + var r, g, b; + r = y * 1 + u * 0 + v * 1.13983; + g = y * 1 + u * -0.39465 + v * -0.5806; + b = y * 1 + u * 2.02311 + v * 0; + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); + return [r * 255, g * 255, b * 255]; +} +function rgb2yuv(rgb) { + var r = rgb[0] / 255, + g = rgb[1] / 255, + b = rgb[2] / 255; + var y = r * 0.299 + g * 0.587 + b * 0.114; + var u = r * -0.14713 + g * -0.28886 + b * 0.436; + var v = r * 0.615 + g * -0.51499 + b * -0.10001; + return [y, u, v]; +} +/***/ }), +/***/ "./node_modules/react-base16-styling/lib/esm/index.js": +/*!************************************************************!*\ + !*** ./node_modules/react-base16-styling/lib/esm/index.js ***! + \************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ createStyling: function() { return /* binding */ createStyling; }, +/* harmony export */ getBase16Theme: function() { return /* binding */ getBase16Theme; }, +/* harmony export */ invertBase16Theme: function() { return /* binding */ invertBase16Theme; }, +/* harmony export */ invertTheme: function() { return /* binding */ invertTheme; } +/* harmony export */ }); +/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/esm/typeof.js"); +/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); +/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); +/* harmony import */ var base16__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! base16 */ "./node_modules/base16/lib/index.js"); +/* harmony import */ var color__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! color */ "./node_modules/color/index.js"); +/* harmony import */ var color__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(color__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var lodash_curry__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash.curry */ "./node_modules/lodash.curry/index.js"); +/* harmony import */ var lodash_curry__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash_curry__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _colorConverters__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./colorConverters */ "./node_modules/react-base16-styling/lib/esm/colorConverters.js"); +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } +var DEFAULT_BASE16 = base16__WEBPACK_IMPORTED_MODULE_3__["default"]; +var BASE16_KEYS = Object.keys(DEFAULT_BASE16); // we need a correcting factor, so that a dark, but not black background color +// converts to bright enough inversed color +var flip = function flip(x) { + return x < 0.25 ? 1 : x < 0.5 ? 0.9 - x : 1.1 - x; +}; +var invertColor = function invertColor(hexString) { + var color = color__WEBPACK_IMPORTED_MODULE_4___default()(hexString); + var _rgb2yuv = (0,_colorConverters__WEBPACK_IMPORTED_MODULE_6__.rgb2yuv)(color.array()), + _rgb2yuv2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_rgb2yuv, 3), + y = _rgb2yuv2[0], + u = _rgb2yuv2[1], + v = _rgb2yuv2[2]; + var flippedYuv = [flip(y), u, v]; + var rgb = (0,_colorConverters__WEBPACK_IMPORTED_MODULE_6__.yuv2rgb)(flippedYuv); + return color__WEBPACK_IMPORTED_MODULE_4___default().rgb(rgb).hex(); +}; +var merger = function merger(styling) { + return function (prevStyling) { + return { + className: [prevStyling.className, styling.className].filter(Boolean).join(' '), + style: _objectSpread(_objectSpread({}, prevStyling.style || {}), styling.style || {}) + }; + }; +}; +var mergeStyling = function mergeStyling(customStyling, defaultStyling) { + if (customStyling === undefined) { + return defaultStyling; + } + if (defaultStyling === undefined) { + return customStyling; + } + var customType = (0,_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__["default"])(customStyling); + var defaultType = (0,_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__["default"])(defaultStyling); + switch (customType) { + case 'string': + switch (defaultType) { + case 'string': + return [defaultStyling, customStyling].filter(Boolean).join(' '); + case 'object': + return merger({ + className: customStyling, + style: defaultStyling + }); + case 'function': + return function (styling) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return merger({ + className: customStyling + })(defaultStyling.apply(void 0, [styling].concat(args))); + }; + } + break; + case 'object': + switch (defaultType) { + case 'string': + return merger({ + className: defaultStyling, + style: customStyling + }); + case 'object': + return _objectSpread(_objectSpread({}, defaultStyling), customStyling); + case 'function': + return function (styling) { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + return merger({ + style: customStyling + })(defaultStyling.apply(void 0, [styling].concat(args))); + }; + } + break; + case 'function': + switch (defaultType) { + case 'string': + return function (styling) { + for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + args[_key3 - 1] = arguments[_key3]; + } + return customStyling.apply(void 0, [merger(styling)({ + className: defaultStyling + })].concat(args)); + }; + case 'object': + return function (styling) { + for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { + args[_key4 - 1] = arguments[_key4]; + } + return customStyling.apply(void 0, [merger(styling)({ + style: defaultStyling + })].concat(args)); + }; + case 'function': + return function (styling) { + for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) { + args[_key5 - 1] = arguments[_key5]; + } + return customStyling.apply(void 0, [defaultStyling.apply(void 0, [styling].concat(args))].concat(args)); + }; + } + } +}; +var mergeStylings = function mergeStylings(customStylings, defaultStylings) { + var keys = Object.keys(defaultStylings); + for (var key in customStylings) { + if (keys.indexOf(key) === -1) keys.push(key); + } + return keys.reduce(function (mergedStyling, key) { + return mergedStyling[key] = mergeStyling(customStylings[key], defaultStylings[key]), mergedStyling; + }, {}); +}; +var getStylingByKeys = function getStylingByKeys(mergedStyling, keys) { + for (var _len6 = arguments.length, args = new Array(_len6 > 2 ? _len6 - 2 : 0), _key6 = 2; _key6 < _len6; _key6++) { + args[_key6 - 2] = arguments[_key6]; + } + if (keys === null) { + return mergedStyling; + } + if (!Array.isArray(keys)) { + keys = [keys]; + } + var styles = keys.map(function (key) { + return mergedStyling[key]; + }).filter(Boolean); + var props = styles.reduce(function (obj, s) { + if (typeof s === 'string') { + obj.className = [obj.className, s].filter(Boolean).join(' '); + } else if ((0,_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__["default"])(s) === 'object') { + obj.style = _objectSpread(_objectSpread({}, obj.style), s); + } else if (typeof s === 'function') { + obj = _objectSpread(_objectSpread({}, obj), s.apply(void 0, [obj].concat(args))); + } + return obj; + }, { + className: '', + style: {} + }); + if (!props.className) { + delete props.className; + } + if (Object.keys(props.style).length === 0) { + delete props.style; + } + return props; +}; +var invertBase16Theme = function invertBase16Theme(base16Theme) { + return Object.keys(base16Theme).reduce(function (t, key) { + return t[key] = /^base/.test(key) ? invertColor(base16Theme[key]) : key === 'scheme' ? base16Theme[key] + ':inverted' : base16Theme[key], t; + }, {}); +}; +var createStyling = lodash_curry__WEBPACK_IMPORTED_MODULE_5___default()(function (getStylingFromBase16) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var themeOrStyling = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var _options$defaultBase = options.defaultBase16, + defaultBase16 = _options$defaultBase === void 0 ? DEFAULT_BASE16 : _options$defaultBase, + _options$base16Themes = options.base16Themes, + base16Themes = _options$base16Themes === void 0 ? null : _options$base16Themes; + var base16Theme = getBase16Theme(themeOrStyling, base16Themes); + if (base16Theme) { + themeOrStyling = _objectSpread(_objectSpread({}, base16Theme), themeOrStyling); + } + var theme = BASE16_KEYS.reduce(function (t, key) { + return t[key] = themeOrStyling[key] || defaultBase16[key], t; + }, {}); + var customStyling = Object.keys(themeOrStyling).reduce(function (s, key) { + return BASE16_KEYS.indexOf(key) === -1 ? (s[key] = themeOrStyling[key], s) : s; + }, {}); + var defaultStyling = getStylingFromBase16(theme); + var mergedStyling = mergeStylings(customStyling, defaultStyling); + for (var _len7 = arguments.length, args = new Array(_len7 > 3 ? _len7 - 3 : 0), _key7 = 3; _key7 < _len7; _key7++) { + args[_key7 - 3] = arguments[_key7]; + } + return lodash_curry__WEBPACK_IMPORTED_MODULE_5___default()(getStylingByKeys, 2).apply(void 0, [mergedStyling].concat(args)); +}, 3); +var isStylingConfig = function isStylingConfig(theme) { + return !!theme.extend; +}; +var getBase16Theme = function getBase16Theme(theme, base16Themes) { + if (theme && isStylingConfig(theme) && theme.extend) { + theme = theme.extend; + } + if (typeof theme === 'string') { + var _theme$split = theme.split(':'), + _theme$split2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_theme$split, 2), + _themeName = _theme$split2[0], + modifier = _theme$split2[1]; + if (base16Themes) { + theme = base16Themes[_themeName]; + } else { + theme = base16__WEBPACK_IMPORTED_MODULE_3__[_themeName]; + } + if (modifier === 'inverted') { + theme = invertBase16Theme(theme); + } + } + return theme && Object.prototype.hasOwnProperty.call(theme, 'base00') ? theme : undefined; +}; +var invertTheme = function invertTheme(theme) { + if (typeof theme === 'string') { + return "".concat(theme, ":inverted"); + } + if (theme && isStylingConfig(theme) && theme.extend) { + if (typeof theme.extend === 'string') { + return _objectSpread(_objectSpread({}, theme), {}, { + extend: "".concat(theme.extend, ":inverted") + }); + } + return _objectSpread(_objectSpread({}, theme), {}, { + extend: invertBase16Theme(theme.extend) + }); + } + if (theme) { + return invertBase16Theme(theme); + } + return theme; +}; +/***/ }), +/***/ "./node_modules/react-is/cjs/react-is.development.js": +/*!***********************************************************!*\ + !*** ./node_modules/react-is/cjs/react-is.development.js ***! + \***********************************************************/ +/***/ (function(__unused_webpack_module, exports) { +"use strict"; +/** @license React v16.13.1 + * react-is.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +if (true) { + (function() { +'use strict'; +// The Symbol used to tag the ReactElement-like types. If there is no native Symbol +// nor polyfill, then a plain number is used for performance. +var hasSymbol = typeof Symbol === 'function' && Symbol.for; +var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7; +var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca; +var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb; +var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc; +var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2; +var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd; +var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary +// (unstable) APIs that have been removed. Can we remove the symbols? +var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf; +var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf; +var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0; +var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1; +var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8; +var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3; +var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4; +var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9; +var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5; +var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6; +var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7; +function isValidElementType(type) { + return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill. + type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE); +} +function typeOf(object) { + if (typeof object === 'object' && object !== null) { + var $$typeof = object.$$typeof; + switch ($$typeof) { + case REACT_ELEMENT_TYPE: + var type = object.type; + switch (type) { + case REACT_ASYNC_MODE_TYPE: + case REACT_CONCURRENT_MODE_TYPE: + case REACT_FRAGMENT_TYPE: + case REACT_PROFILER_TYPE: + case REACT_STRICT_MODE_TYPE: + case REACT_SUSPENSE_TYPE: + return type; + default: + var $$typeofType = type && type.$$typeof; + switch ($$typeofType) { + case REACT_CONTEXT_TYPE: + case REACT_FORWARD_REF_TYPE: + case REACT_LAZY_TYPE: + case REACT_MEMO_TYPE: + case REACT_PROVIDER_TYPE: + return $$typeofType; + default: + return $$typeof; + } + } + case REACT_PORTAL_TYPE: + return $$typeof; + } + } + return undefined; +} // AsyncMode is deprecated along with isAsyncMode +var AsyncMode = REACT_ASYNC_MODE_TYPE; +var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE; +var ContextConsumer = REACT_CONTEXT_TYPE; +var ContextProvider = REACT_PROVIDER_TYPE; +var Element = REACT_ELEMENT_TYPE; +var ForwardRef = REACT_FORWARD_REF_TYPE; +var Fragment = REACT_FRAGMENT_TYPE; +var Lazy = REACT_LAZY_TYPE; +var Memo = REACT_MEMO_TYPE; +var Portal = REACT_PORTAL_TYPE; +var Profiler = REACT_PROFILER_TYPE; +var StrictMode = REACT_STRICT_MODE_TYPE; +var Suspense = REACT_SUSPENSE_TYPE; +var hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated +function isAsyncMode(object) { + { + if (!hasWarnedAboutDeprecatedIsAsyncMode) { + hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint + console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.'); + } + } + return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE; +} +function isConcurrentMode(object) { + return typeOf(object) === REACT_CONCURRENT_MODE_TYPE; +} +function isContextConsumer(object) { + return typeOf(object) === REACT_CONTEXT_TYPE; +} +function isContextProvider(object) { + return typeOf(object) === REACT_PROVIDER_TYPE; +} +function isElement(object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; +} +function isForwardRef(object) { + return typeOf(object) === REACT_FORWARD_REF_TYPE; +} +function isFragment(object) { + return typeOf(object) === REACT_FRAGMENT_TYPE; +} +function isLazy(object) { + return typeOf(object) === REACT_LAZY_TYPE; +} +function isMemo(object) { + return typeOf(object) === REACT_MEMO_TYPE; +} +function isPortal(object) { + return typeOf(object) === REACT_PORTAL_TYPE; +} +function isProfiler(object) { + return typeOf(object) === REACT_PROFILER_TYPE; +} +function isStrictMode(object) { + return typeOf(object) === REACT_STRICT_MODE_TYPE; +} +function isSuspense(object) { + return typeOf(object) === REACT_SUSPENSE_TYPE; +} +exports.AsyncMode = AsyncMode; +exports.ConcurrentMode = ConcurrentMode; +exports.ContextConsumer = ContextConsumer; +exports.ContextProvider = ContextProvider; +exports.Element = Element; +exports.ForwardRef = ForwardRef; +exports.Fragment = Fragment; +exports.Lazy = Lazy; +exports.Memo = Memo; +exports.Portal = Portal; +exports.Profiler = Profiler; +exports.StrictMode = StrictMode; +exports.Suspense = Suspense; +exports.isAsyncMode = isAsyncMode; +exports.isConcurrentMode = isConcurrentMode; +exports.isContextConsumer = isContextConsumer; +exports.isContextProvider = isContextProvider; +exports.isElement = isElement; +exports.isForwardRef = isForwardRef; +exports.isFragment = isFragment; +exports.isLazy = isLazy; +exports.isMemo = isMemo; +exports.isPortal = isPortal; +exports.isProfiler = isProfiler; +exports.isStrictMode = isStrictMode; +exports.isSuspense = isSuspense; +exports.isValidElementType = isValidElementType; +exports.typeOf = typeOf; + })(); +} +/***/ }), +/***/ "./node_modules/react-is/index.js": +/*!****************************************!*\ + !*** ./node_modules/react-is/index.js ***! + \****************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; +if (false) {} else { + module.exports = __webpack_require__(/*! ./cjs/react-is.development.js */ "./node_modules/react-is/cjs/react-is.development.js"); +} +/***/ }), +/***/ "./node_modules/react-json-tree/lib/esm/ItemRange.js": +/*!***********************************************************!*\ + !*** ./node_modules/react-json-tree/lib/esm/ItemRange.js ***! + \***********************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ ItemRange; } +/* harmony export */ }); +/* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/esm/classCallCheck.js"); +/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/esm/createClass.js"); +/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js"); +/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/esm/inherits.js"); +/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js"); +/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js"); +/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_8__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! prop-types */ "prop-types"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_9__); +/* harmony import */ var _JSONArrow__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./JSONArrow */ "./node_modules/react-json-tree/lib/esm/JSONArrow.js"); @@ -84248,65 +72233,265 @@ __webpack_require__.r(__webpack_exports__); +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__["default"])(this, result); }; } +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } +var ItemRange = /*#__PURE__*/function (_React$Component) { + (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__["default"])(ItemRange, _React$Component); + var _super = _createSuper(ItemRange); + function ItemRange(props) { + var _this; + (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__["default"])(this, ItemRange); + _this = _super.call(this, props); + (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7__["default"])((0,_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_3__["default"])(_this), "handleClick", function () { + _this.setState({ + expanded: !_this.state.expanded + }); + }); + _this.state = { + expanded: false + }; + return _this; + } + (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__["default"])(ItemRange, [{ + key: "render", + value: function render() { + var _this$props = this.props, + styling = _this$props.styling, + from = _this$props.from, + to = _this$props.to, + renderChildNodes = _this$props.renderChildNodes, + nodeType = _this$props.nodeType; + return this.state.expanded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_8___default().createElement("div", styling('itemRange', this.state.expanded), renderChildNodes(this.props, from, to)) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_8___default().createElement("div", (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, styling('itemRange', this.state.expanded), { + onClick: this.handleClick + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_8___default().createElement(_JSONArrow__WEBPACK_IMPORTED_MODULE_10__["default"], { + nodeType: nodeType, + styling: styling, + expanded: false, + onClick: this.handleClick, + arrowStyle: "double" + }), "".concat(from, " ... ").concat(to)); + } + }]); + return ItemRange; +}((react__WEBPACK_IMPORTED_MODULE_8___default().Component)); +(0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7__["default"])(ItemRange, "propTypes", { + styling: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().func).isRequired, + from: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().number).isRequired, + to: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().number).isRequired, + renderChildNodes: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().func).isRequired, + nodeType: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string).isRequired +}); +/***/ }), +/***/ "./node_modules/react-json-tree/lib/esm/JSONArrayNode.js": +/*!***************************************************************!*\ + !*** ./node_modules/react-json-tree/lib/esm/JSONArrayNode.js ***! + \***************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "prop-types"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _JSONNestedNode__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./JSONNestedNode */ "./node_modules/react-json-tree/lib/esm/JSONNestedNode.js"); +var _excluded = ["data"]; +// Returns the "n Items" string for this node, +// generating and caching it if it hasn't been created yet. +function createItemString(data) { + return "".concat(data.length, " ").concat(data.length !== 1 ? 'items' : 'item'); +} +// Configures to render an Array +var JSONArrayNode = function JSONArrayNode(_ref) { + var data = _ref.data, + props = (0,_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__["default"])(_ref, _excluded); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_JSONNestedNode__WEBPACK_IMPORTED_MODULE_4__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, props, { + data: data, + nodeType: "Array", + nodeTypeIndicator: "[]", + createItemString: createItemString, + expandable: data.length > 0 + })); +}; +JSONArrayNode.propTypes = { + data: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array) +}; +/* harmony default export */ __webpack_exports__["default"] = (JSONArrayNode); +/***/ }), +/***/ "./node_modules/react-json-tree/lib/esm/JSONArrow.js": +/*!***********************************************************!*\ + !*** ./node_modules/react-json-tree/lib/esm/JSONArrow.js ***! + \***********************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "prop-types"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +var JSONArrow = function JSONArrow(_ref) { + var styling = _ref.styling, + arrowStyle = _ref.arrowStyle, + expanded = _ref.expanded, + nodeType = _ref.nodeType, + onClick = _ref.onClick; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, styling('arrowContainer', arrowStyle), { + onClick: onClick + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", styling(['arrow', 'arrowSign'], nodeType, expanded, arrowStyle), "\u25B6", arrowStyle === 'double' && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", styling(['arrowSign', 'arrowSignInner']), "\u25B6"))); +}; +JSONArrow.propTypes = { + styling: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired, + arrowStyle: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOf(['single', 'double']), + expanded: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired, + nodeType: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired, + onClick: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired +}; +JSONArrow.defaultProps = { + arrowStyle: 'single' +}; +/* harmony default export */ __webpack_exports__["default"] = (JSONArrow); +/***/ }), +/***/ "./node_modules/react-json-tree/lib/esm/JSONIterableNode.js": +/*!******************************************************************!*\ + !*** ./node_modules/react-json-tree/lib/esm/JSONIterableNode.js ***! + \******************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _JSONNestedNode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./JSONNestedNode */ "./node_modules/react-json-tree/lib/esm/JSONNestedNode.js"); +function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } +// Returns the "n Items" string for this node, +// generating and caching it if it hasn't been created yet. +function createItemString(data, limit) { + var count = 0; + var hasMore = false; + if (Number.isSafeInteger(data.size)) { + count = data.size; + } else { + // eslint-disable-next-line no-unused-vars + var _iterator = _createForOfIteratorHelper(data), + _step; + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var entry = _step.value; + if (limit && count + 1 > limit) { + hasMore = true; + break; + } + count += 1; + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + } + return "".concat(hasMore ? '>' : '').concat(count, " ").concat(count !== 1 ? 'entries' : 'entry'); +} +// Configures to render an iterable +var JSONIterableNode = function JSONIterableNode(_ref) { + var props = (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _ref); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_JSONNestedNode__WEBPACK_IMPORTED_MODULE_2__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, props, { + nodeType: "Iterable", + nodeTypeIndicator: "()", + createItemString: createItemString + })); +}; +/* harmony default export */ __webpack_exports__["default"] = (JSONIterableNode); +/***/ }), +/***/ "./node_modules/react-json-tree/lib/esm/JSONNestedNode.js": +/*!****************************************************************!*\ + !*** ./node_modules/react-json-tree/lib/esm/JSONNestedNode.js ***! + \****************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ JSONNestedNode; } +/* harmony export */ }); +/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/esm/classCallCheck.js"); +/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/esm/createClass.js"); +/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js"); +/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/esm/inherits.js"); +/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js"); +/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js"); +/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); +/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js"); +/* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_9__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ "prop-types"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__); +/* harmony import */ var _JSONArrow__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./JSONArrow */ "./node_modules/react-json-tree/lib/esm/JSONArrow.js"); +/* harmony import */ var _getCollectionEntries__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./getCollectionEntries */ "./node_modules/react-json-tree/lib/esm/getCollectionEntries.js"); +/* harmony import */ var _JSONNode__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./JSONNode */ "./node_modules/react-json-tree/lib/esm/JSONNode.js"); +/* harmony import */ var _ItemRange__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./ItemRange */ "./node_modules/react-json-tree/lib/esm/ItemRange.js"); @@ -84317,9 +72502,13 @@ __webpack_require__.r(__webpack_exports__); +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6__["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5__["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5__["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4__["default"])(this, result); }; } +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } @@ -84328,31 +72517,191 @@ __webpack_require__.r(__webpack_exports__); +function isRange(rangeOrEntry) { + return rangeOrEntry.to !== undefined; +} +function renderChildNodes(props, from, to) { + var nodeType = props.nodeType, + data = props.data, + collectionLimit = props.collectionLimit, + circularCache = props.circularCache, + keyPath = props.keyPath, + postprocessValue = props.postprocessValue, + sortObjectKeys = props.sortObjectKeys; + var childNodes = []; + (0,_getCollectionEntries__WEBPACK_IMPORTED_MODULE_11__["default"])(nodeType, data, sortObjectKeys, collectionLimit, from, to).forEach(function (entry) { + if (isRange(entry)) { + childNodes.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement(_ItemRange__WEBPACK_IMPORTED_MODULE_12__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_8__["default"])({}, props, { + key: "ItemRange--".concat(entry.from, "-").concat(entry.to), + from: entry.from, + to: entry.to, + renderChildNodes: renderChildNodes + }))); + } else { + var key = entry.key, + value = entry.value; + var isCircular = circularCache.indexOf(value) !== -1; + childNodes.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement(_JSONNode__WEBPACK_IMPORTED_MODULE_13__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_8__["default"])({}, props, { + postprocessValue: postprocessValue, + collectionLimit: collectionLimit, + key: "Node--".concat(key), + keyPath: [key].concat((0,_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_7__["default"])(keyPath)), + value: postprocessValue(value), + circularCache: [].concat((0,_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_7__["default"])(circularCache), [value]), + isCircular: isCircular, + hideRoot: false + }))); + } + }); + return childNodes; +} +function getStateFromProps(props) { + // calculate individual node expansion if necessary + var expanded = !props.isCircular ? props.shouldExpandNode(props.keyPath, props.data, props.level) : false; + return { + expanded: expanded + }; +} +var JSONNestedNode = /*#__PURE__*/function (_React$Component) { + (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__["default"])(JSONNestedNode, _React$Component); + var _super = _createSuper(JSONNestedNode); + function JSONNestedNode(props) { + var _this; + (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__["default"])(this, JSONNestedNode); + _this = _super.call(this, props); + (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6__["default"])((0,_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_2__["default"])(_this), "handleClick", function () { + if (_this.props.expandable) { + _this.setState({ + expanded: !_this.state.expanded + }); + } + }); + _this.state = getStateFromProps(props); + return _this; + } + (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__["default"])(JSONNestedNode, [{ + key: "UNSAFE_componentWillReceiveProps", + value: function UNSAFE_componentWillReceiveProps(nextProps) { + var nextState = getStateFromProps(nextProps); + if (getStateFromProps(this.props).expanded !== nextState.expanded) { + this.setState(nextState); + } + } + }, { + key: "shouldComponentUpdate", + value: function shouldComponentUpdate(nextProps, nextState) { + var _this2 = this; + return !!Object.keys(nextProps).find(function (key) { + return key !== 'circularCache' && (key === 'keyPath' ? nextProps[key].join('/') !== _this2.props[key].join('/') : nextProps[key] !== _this2.props[key]); + }) || nextState.expanded !== this.state.expanded; + } + }, { + key: "render", + value: function render() { + var _this$props = this.props, + getItemString = _this$props.getItemString, + nodeTypeIndicator = _this$props.nodeTypeIndicator, + nodeType = _this$props.nodeType, + data = _this$props.data, + hideRoot = _this$props.hideRoot, + createItemString = _this$props.createItemString, + styling = _this$props.styling, + collectionLimit = _this$props.collectionLimit, + keyPath = _this$props.keyPath, + labelRenderer = _this$props.labelRenderer, + expandable = _this$props.expandable; + var expanded = this.state.expanded; + var renderedChildren = expanded || hideRoot && this.props.level === 0 ? renderChildNodes(_objectSpread(_objectSpread({}, this.props), {}, { + level: this.props.level + 1 + })) : null; + var itemType = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement("span", styling('nestedNodeItemType', expanded), nodeTypeIndicator); + var renderedItemString = getItemString(nodeType, data, itemType, createItemString(data, collectionLimit), keyPath); + var stylingArgs = [keyPath, nodeType, expanded, expandable]; + return hideRoot ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement("li", styling.apply(void 0, ['rootNode'].concat(stylingArgs)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement("ul", styling.apply(void 0, ['rootNodeChildren'].concat(stylingArgs)), renderedChildren)) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement("li", styling.apply(void 0, ['nestedNode'].concat(stylingArgs)), expandable && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement(_JSONArrow__WEBPACK_IMPORTED_MODULE_14__["default"], { + styling: styling, + nodeType: nodeType, + expanded: expanded, + onClick: this.handleClick + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement("label", (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_8__["default"])({}, styling.apply(void 0, [['label', 'nestedNodeLabel']].concat(stylingArgs)), { + onClick: this.handleClick + }), labelRenderer.apply(void 0, stylingArgs)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement("span", (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_8__["default"])({}, styling.apply(void 0, ['nestedNodeItemString'].concat(stylingArgs)), { + onClick: this.handleClick + }), renderedItemString), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement("ul", styling.apply(void 0, ['nestedNodeChildren'].concat(stylingArgs)), renderedChildren)); + } + }]); + return JSONNestedNode; +}((react__WEBPACK_IMPORTED_MODULE_9___default().Component)); +(0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6__["default"])(JSONNestedNode, "propTypes", { + getItemString: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().func).isRequired, + nodeTypeIndicator: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().any), + nodeType: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().string).isRequired, + data: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().any), + hideRoot: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().bool).isRequired, + createItemString: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().func).isRequired, + styling: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().func).isRequired, + collectionLimit: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number), + keyPath: prop_types__WEBPACK_IMPORTED_MODULE_10___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_10___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_10___default().string), (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number)])).isRequired, + labelRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().func).isRequired, + shouldExpandNode: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().func), + level: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number).isRequired, + sortObjectKeys: prop_types__WEBPACK_IMPORTED_MODULE_10___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_10___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_10___default().bool)]), + isCircular: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().bool), + expandable: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().bool) +}); +(0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_6__["default"])(JSONNestedNode, "defaultProps", { + data: [], + circularCache: [], + level: 0, + expandable: true +}); +/***/ }), +/***/ "./node_modules/react-json-tree/lib/esm/JSONNode.js": +/*!**********************************************************!*\ + !*** ./node_modules/react-json-tree/lib/esm/JSONNode.js ***! + \**********************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); +/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ "prop-types"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _objType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./objType */ "./node_modules/react-json-tree/lib/esm/objType.js"); +/* harmony import */ var _JSONObjectNode__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./JSONObjectNode */ "./node_modules/react-json-tree/lib/esm/JSONObjectNode.js"); +/* harmony import */ var _JSONArrayNode__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./JSONArrayNode */ "./node_modules/react-json-tree/lib/esm/JSONArrayNode.js"); +/* harmony import */ var _JSONIterableNode__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./JSONIterableNode */ "./node_modules/react-json-tree/lib/esm/JSONIterableNode.js"); +/* harmony import */ var _JSONValueNode__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./JSONValueNode */ "./node_modules/react-json-tree/lib/esm/JSONValueNode.js"); +var _excluded = ["getItemString", "keyPath", "labelRenderer", "styling", "value", "valueRenderer", "isCustomNode"]; +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } @@ -84362,8865 +72711,7644 @@ __webpack_require__.r(__webpack_exports__); +var JSONNode = function JSONNode(_ref) { + var getItemString = _ref.getItemString, + keyPath = _ref.keyPath, + labelRenderer = _ref.labelRenderer, + styling = _ref.styling, + value = _ref.value, + valueRenderer = _ref.valueRenderer, + isCustomNode = _ref.isCustomNode, + rest = (0,_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__["default"])(_ref, _excluded); + var nodeType = isCustomNode(value) ? 'Custom' : (0,_objType__WEBPACK_IMPORTED_MODULE_5__["default"])(value); + var simpleNodeProps = { + getItemString: getItemString, + key: keyPath[0], + keyPath: keyPath, + labelRenderer: labelRenderer, + nodeType: nodeType, + styling: styling, + value: value, + valueRenderer: valueRenderer + }; + var nestedNodeProps = _objectSpread(_objectSpread(_objectSpread({}, rest), simpleNodeProps), {}, { + data: value, + isCustomNode: isCustomNode + }); + switch (nodeType) { + case 'Object': + case 'Error': + case 'WeakMap': + case 'WeakSet': + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONObjectNode__WEBPACK_IMPORTED_MODULE_6__["default"], nestedNodeProps); + case 'Array': + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONArrayNode__WEBPACK_IMPORTED_MODULE_7__["default"], nestedNodeProps); + case 'Iterable': + case 'Map': + case 'Set': + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONIterableNode__WEBPACK_IMPORTED_MODULE_8__["default"], nestedNodeProps); + case 'String': + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONValueNode__WEBPACK_IMPORTED_MODULE_9__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, simpleNodeProps, { + valueGetter: function valueGetter(raw) { + return "\"".concat(raw, "\""); + } + })); + case 'Number': + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONValueNode__WEBPACK_IMPORTED_MODULE_9__["default"], simpleNodeProps); + case 'Boolean': + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONValueNode__WEBPACK_IMPORTED_MODULE_9__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, simpleNodeProps, { + valueGetter: function valueGetter(raw) { + return raw ? 'true' : 'false'; + } + })); + case 'Date': + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONValueNode__WEBPACK_IMPORTED_MODULE_9__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, simpleNodeProps, { + valueGetter: function valueGetter(raw) { + return raw.toISOString(); + } + })); + case 'Null': + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONValueNode__WEBPACK_IMPORTED_MODULE_9__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, simpleNodeProps, { + valueGetter: function valueGetter() { + return 'null'; + } + })); + case 'Undefined': + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONValueNode__WEBPACK_IMPORTED_MODULE_9__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, simpleNodeProps, { + valueGetter: function valueGetter() { + return 'undefined'; + } + })); + case 'Function': + case 'Symbol': + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONValueNode__WEBPACK_IMPORTED_MODULE_9__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, simpleNodeProps, { + valueGetter: function valueGetter(raw) { + return raw.toString(); + } + })); + case 'Custom': + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONValueNode__WEBPACK_IMPORTED_MODULE_9__["default"], simpleNodeProps); + default: + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_JSONValueNode__WEBPACK_IMPORTED_MODULE_9__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, simpleNodeProps, { + valueGetter: function valueGetter() { + return "<".concat(nodeType, ">"); + } + })); + } +}; +JSONNode.propTypes = { + getItemString: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func).isRequired, + keyPath: prop_types__WEBPACK_IMPORTED_MODULE_4___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_4___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_4___default().string), (prop_types__WEBPACK_IMPORTED_MODULE_4___default().number)]).isRequired).isRequired, + labelRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func).isRequired, + styling: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func).isRequired, + value: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().any), + valueRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func).isRequired, + isCustomNode: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func).isRequired +}; +/* harmony default export */ __webpack_exports__["default"] = (JSONNode); +/***/ }), +/***/ "./node_modules/react-json-tree/lib/esm/JSONObjectNode.js": +/*!****************************************************************!*\ + !*** ./node_modules/react-json-tree/lib/esm/JSONObjectNode.js ***! + \****************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "prop-types"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _JSONNestedNode__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./JSONNestedNode */ "./node_modules/react-json-tree/lib/esm/JSONNestedNode.js"); +var _excluded = ["data"]; +// Returns the "n Items" string for this node, +// generating and caching it if it hasn't been created yet. +function createItemString(data) { + var len = Object.getOwnPropertyNames(data).length; + return "".concat(len, " ").concat(len !== 1 ? 'keys' : 'key'); +} +// Configures to render an Object +var JSONObjectNode = function JSONObjectNode(_ref) { + var data = _ref.data, + props = (0,_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__["default"])(_ref, _excluded); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_JSONNestedNode__WEBPACK_IMPORTED_MODULE_4__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, props, { + data: data, + nodeType: "Object", + nodeTypeIndicator: props.nodeType === 'Error' ? 'Error()' : '{}', + createItemString: createItemString, + expandable: Object.getOwnPropertyNames(data).length > 0 + })); +}; +JSONObjectNode.propTypes = { + data: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object), + nodeType: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired +}; +/* harmony default export */ __webpack_exports__["default"] = (JSONObjectNode); +/***/ }), +/***/ "./node_modules/react-json-tree/lib/esm/JSONValueNode.js": +/*!***************************************************************!*\ + !*** ./node_modules/react-json-tree/lib/esm/JSONValueNode.js ***! + \***************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "prop-types"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +var JSONValueNode = function JSONValueNode(_ref) { + var nodeType = _ref.nodeType, + styling = _ref.styling, + labelRenderer = _ref.labelRenderer, + keyPath = _ref.keyPath, + valueRenderer = _ref.valueRenderer, + value = _ref.value, + _ref$valueGetter = _ref.valueGetter, + valueGetter = _ref$valueGetter === void 0 ? function (value) { + return value; + } : _ref$valueGetter; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("li", styling('value', nodeType, keyPath), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("label", styling(['label', 'valueLabel'], nodeType, keyPath), labelRenderer(keyPath, nodeType, false, false)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("span", styling('valueText', nodeType, keyPath), valueRenderer.apply(void 0, [valueGetter(value), value].concat((0,_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__["default"])(keyPath))))); +}; +JSONValueNode.propTypes = { + nodeType: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired, + styling: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired, + labelRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired, + keyPath: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_2___default().string), (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number)]).isRequired).isRequired, + valueRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired, + value: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().any), + valueGetter: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func) +}; +/* harmony default export */ __webpack_exports__["default"] = (JSONValueNode); /***/ }), -/***/ "./node_modules/ramda/es/indexBy.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/indexBy.js ***! - \******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/react-json-tree/lib/esm/createStylingFromTheme.js": +/*!************************************************************************!*\ + !*** ./node_modules/react-json-tree/lib/esm/createStylingFromTheme.js ***! + \************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _reduceBy_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./reduceBy.js */ "./node_modules/ramda/es/reduceBy.js"); +/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); +/* harmony import */ var react_base16_styling__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-base16-styling */ "./node_modules/react-base16-styling/lib/esm/index.js"); +/* harmony import */ var _themes_solarized__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./themes/solarized */ "./node_modules/react-json-tree/lib/esm/themes/solarized.js"); -/** - * Given a function that generates a key, turns a list of objects into an - * object indexing the objects by the given key. Note that if multiple - * objects generate the same value for the indexing key only the last value - * will be included in the generated object. - * - * Acts as a transducer if a transformer is given in list position. - * - * @func - * @memberOf R - * @since v0.19.0 - * @category List - * @typedefn Idx = String | Int | Symbol - * @sig Idx a => (b -> a) -> [b] -> {a: b} - * @param {Function} fn Function :: a -> Idx - * @param {Array} array The array of objects to index - * @return {Object} An object indexing each array element by the given property. - * @see R.groupBy - * @example - * - * const list = [{id: 'xyz', title: 'A'}, {id: 'abc', title: 'B'}]; - * R.indexBy(R.prop('id'), list); - * //=> {abc: {id: 'abc', title: 'B'}, xyz: {id: 'xyz', title: 'A'}} - */ -var indexBy = /*#__PURE__*/ -(0,_reduceBy_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (acc, elem) { - return elem; -}, null); -/* harmony default export */ __webpack_exports__["default"] = (indexBy); +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } -/***/ }), +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } -/***/ "./node_modules/ramda/es/indexOf.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/indexOf.js ***! - \******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_indexOf_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_indexOf.js */ "./node_modules/ramda/es/internal/_indexOf.js"); -/* harmony import */ var _internal_isArray_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); +var colorMap = function colorMap(theme) { + return { + BACKGROUND_COLOR: theme.base00, + TEXT_COLOR: theme.base07, + STRING_COLOR: theme.base0B, + DATE_COLOR: theme.base0B, + NUMBER_COLOR: theme.base09, + BOOLEAN_COLOR: theme.base09, + NULL_COLOR: theme.base08, + UNDEFINED_COLOR: theme.base08, + FUNCTION_COLOR: theme.base08, + SYMBOL_COLOR: theme.base08, + LABEL_COLOR: theme.base0D, + ARROW_COLOR: theme.base0D, + ITEM_STRING_COLOR: theme.base0B, + ITEM_STRING_EXPANDED_COLOR: theme.base03 + }; +}; + +var valueColorMap = function valueColorMap(colors) { + return { + String: colors.STRING_COLOR, + Date: colors.DATE_COLOR, + Number: colors.NUMBER_COLOR, + Boolean: colors.BOOLEAN_COLOR, + Null: colors.NULL_COLOR, + Undefined: colors.UNDEFINED_COLOR, + Function: colors.FUNCTION_COLOR, + Symbol: colors.SYMBOL_COLOR + }; +}; -/** - * Returns the position of the first occurrence of an item in an array, or -1 - * if the item is not included in the array. [`R.equals`](#equals) is used to - * determine equality. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig a -> [a] -> Number - * @param {*} target The item to find. - * @param {Array} xs The array to search in. - * @return {Number} the index of the target, or -1 if the target is not found. - * @see R.lastIndexOf, R.findIndex - * @example - * - * R.indexOf(3, [1,2,3,4]); //=> 2 - * R.indexOf(10, [1,2,3,4]); //=> -1 - */ +var getDefaultThemeStyling = function getDefaultThemeStyling(theme) { + var colors = colorMap(theme); + return { + tree: { + border: 0, + padding: 0, + marginTop: '0.5em', + marginBottom: '0.5em', + marginLeft: '0.125em', + marginRight: 0, + listStyle: 'none', + MozUserSelect: 'none', + WebkitUserSelect: 'none', + backgroundColor: colors.BACKGROUND_COLOR + }, + value: function value(_ref, nodeType, keyPath) { + var style = _ref.style; + return { + style: _objectSpread(_objectSpread({}, style), {}, { + paddingTop: '0.25em', + paddingRight: 0, + marginLeft: '0.875em', + WebkitUserSelect: 'text', + MozUserSelect: 'text', + wordWrap: 'break-word', + paddingLeft: keyPath.length > 1 ? '2.125em' : '1.25em', + textIndent: '-0.5em', + wordBreak: 'break-all' + }) + }; + }, + label: { + display: 'inline-block', + color: colors.LABEL_COLOR + }, + valueLabel: { + margin: '0 0.5em 0 0' + }, + valueText: function valueText(_ref2, nodeType) { + var style = _ref2.style; + return { + style: _objectSpread(_objectSpread({}, style), {}, { + color: valueColorMap(colors)[nodeType] + }) + }; + }, + itemRange: function itemRange(styling, expanded) { + return { + style: { + paddingTop: expanded ? 0 : '0.25em', + cursor: 'pointer', + color: colors.LABEL_COLOR + } + }; + }, + arrow: function arrow(_ref3, nodeType, expanded) { + var style = _ref3.style; + return { + style: _objectSpread(_objectSpread({}, style), {}, { + marginLeft: 0, + transition: '150ms', + WebkitTransition: '150ms', + MozTransition: '150ms', + WebkitTransform: expanded ? 'rotateZ(90deg)' : 'rotateZ(0deg)', + MozTransform: expanded ? 'rotateZ(90deg)' : 'rotateZ(0deg)', + transform: expanded ? 'rotateZ(90deg)' : 'rotateZ(0deg)', + transformOrigin: '45% 50%', + WebkitTransformOrigin: '45% 50%', + MozTransformOrigin: '45% 50%', + position: 'relative', + lineHeight: '1.1em', + fontSize: '0.75em' + }) + }; + }, + arrowContainer: function arrowContainer(_ref4, arrowStyle) { + var style = _ref4.style; + return { + style: _objectSpread(_objectSpread({}, style), {}, { + display: 'inline-block', + paddingRight: '0.5em', + paddingLeft: arrowStyle === 'double' ? '1em' : 0, + cursor: 'pointer' + }) + }; + }, + arrowSign: { + color: colors.ARROW_COLOR + }, + arrowSignInner: { + position: 'absolute', + top: 0, + left: '-0.4em' + }, + nestedNode: function nestedNode(_ref5, keyPath, nodeType, expanded, expandable) { + var style = _ref5.style; + return { + style: _objectSpread(_objectSpread({}, style), {}, { + position: 'relative', + paddingTop: '0.25em', + marginLeft: keyPath.length > 1 ? '0.875em' : 0, + paddingLeft: !expandable ? '1.125em' : 0 + }) + }; + }, + rootNode: { + padding: 0, + margin: 0 + }, + nestedNodeLabel: function nestedNodeLabel(_ref6, keyPath, nodeType, expanded, expandable) { + var style = _ref6.style; + return { + style: _objectSpread(_objectSpread({}, style), {}, { + margin: 0, + padding: 0, + WebkitUserSelect: expandable ? 'inherit' : 'text', + MozUserSelect: expandable ? 'inherit' : 'text', + cursor: expandable ? 'pointer' : 'default' + }) + }; + }, + nestedNodeItemString: function nestedNodeItemString(_ref7, keyPath, nodeType, expanded) { + var style = _ref7.style; + return { + style: _objectSpread(_objectSpread({}, style), {}, { + paddingLeft: '0.5em', + cursor: 'default', + color: expanded ? colors.ITEM_STRING_EXPANDED_COLOR : colors.ITEM_STRING_COLOR + }) + }; + }, + nestedNodeItemType: { + marginLeft: '0.3em', + marginRight: '0.3em' + }, + nestedNodeChildren: function nestedNodeChildren(_ref8, nodeType, expanded) { + var style = _ref8.style; + return { + style: _objectSpread(_objectSpread({}, style), {}, { + padding: 0, + margin: 0, + listStyle: 'none', + display: expanded ? 'block' : 'none' + }) + }; + }, + rootNodeChildren: { + padding: 0, + margin: 0, + listStyle: 'none' + } + }; +}; -var indexOf = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function indexOf(target, xs) { - return typeof xs.indexOf === 'function' && !(0,_internal_isArray_js__WEBPACK_IMPORTED_MODULE_2__["default"])(xs) ? xs.indexOf(target) : (0,_internal_indexOf_js__WEBPACK_IMPORTED_MODULE_1__["default"])(xs, target, 0); +var createStylingFromTheme = (0,react_base16_styling__WEBPACK_IMPORTED_MODULE_1__.createStyling)(getDefaultThemeStyling, { + defaultBase16: _themes_solarized__WEBPACK_IMPORTED_MODULE_2__["default"] }); -/* harmony default export */ __webpack_exports__["default"] = (indexOf); - -/***/ }), - -/***/ "./node_modules/ramda/es/init.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/init.js ***! - \***************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _slice_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./slice.js */ "./node_modules/ramda/es/slice.js"); - -/** - * Returns all but the last element of the given list or string. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category List - * @sig [a] -> [a] - * @sig String -> String - * @param {*} list - * @return {*} - * @see R.last, R.head, R.tail - * @example - * - * R.init([1, 2, 3]); //=> [1, 2] - * R.init([1, 2]); //=> [1] - * R.init([1]); //=> [] - * R.init([]); //=> [] - * - * R.init('abc'); //=> 'ab' - * R.init('ab'); //=> 'a' - * R.init('a'); //=> '' - * R.init(''); //=> '' - */ - -var init = /*#__PURE__*/ -(0,_slice_js__WEBPACK_IMPORTED_MODULE_0__["default"])(0, -1); -/* harmony default export */ __webpack_exports__["default"] = (init); +/* harmony default export */ __webpack_exports__["default"] = (createStylingFromTheme); /***/ }), -/***/ "./node_modules/ramda/es/innerJoin.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/innerJoin.js ***! - \********************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/react-json-tree/lib/esm/getCollectionEntries.js": +/*!**********************************************************************!*\ + !*** ./node_modules/react-json-tree/lib/esm/getCollectionEntries.js ***! + \**********************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_includesWith_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_includesWith.js */ "./node_modules/ramda/es/internal/_includesWith.js"); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _internal_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_filter.js */ "./node_modules/ramda/es/internal/_filter.js"); - +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ getCollectionEntries; } +/* harmony export */ }); +/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js"); -/** - * Takes a predicate `pred`, a list `xs`, and a list `ys`, and returns a list - * `xs'` comprising each of the elements of `xs` which is equal to one or more - * elements of `ys` according to `pred`. - * - * `pred` must be a binary function expecting an element from each list. - * - * `xs`, `ys`, and `xs'` are treated as sets, semantically, so ordering should - * not be significant, but since `xs'` is ordered the implementation guarantees - * that its values are in the same order as they appear in `xs`. Duplicates are - * not removed, so `xs'` may contain duplicates if `xs` contains duplicates. - * - * @func - * @memberOf R - * @since v0.24.0 - * @category Relation - * @sig ((a, b) -> Boolean) -> [a] -> [b] -> [a] - * @param {Function} pred - * @param {Array} xs - * @param {Array} ys - * @return {Array} - * @see R.intersection - * @example - * - * R.innerJoin( - * (record, id) => record.id === id, - * [{id: 824, name: 'Richie Furay'}, - * {id: 956, name: 'Dewey Martin'}, - * {id: 313, name: 'Bruce Palmer'}, - * {id: 456, name: 'Stephen Stills'}, - * {id: 177, name: 'Neil Young'}], - * [177, 456, 999] - * ); - * //=> [{id: 456, name: 'Stephen Stills'}, {id: 177, name: 'Neil Young'}] - */ - -var innerJoin = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function innerJoin(pred, xs, ys) { - return (0,_internal_filter_js__WEBPACK_IMPORTED_MODULE_2__["default"])(function (x) { - return (0,_internal_includesWith_js__WEBPACK_IMPORTED_MODULE_0__["default"])(pred, x, ys); - }, xs); -}); -/* harmony default export */ __webpack_exports__["default"] = (innerJoin); +function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } -/***/ }), +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -/***/ "./node_modules/ramda/es/insert.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/insert.js ***! - \*****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); +function getLength(type, collection) { + if (type === 'Object') { + // eslint-disable-next-line @typescript-eslint/ban-types + return Object.keys(collection).length; + } else if (type === 'Array') { + return collection.length; + } -/** - * Inserts the supplied element into the list, at the specified `index`. _Note that + return Infinity; +} - * this is not destructive_: it returns a copy of the list with the changes. - * No lists have been harmed in the application of this function. - * - * @func - * @memberOf R - * @since v0.2.2 - * @category List - * @sig Number -> a -> [a] -> [a] - * @param {Number} index The position to insert the element - * @param {*} elt The element to insert into the Array - * @param {Array} list The list to insert into - * @return {Array} A new Array with `elt` inserted at `index`. - * @example - * - * R.insert(2, 'x', [1,2,3,4]); //=> [1,2,'x',3,4] - */ +function isIterableMap(collection) { + return typeof collection.set === 'function'; +} -var insert = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function insert(idx, elt, list) { - idx = idx < list.length && idx >= 0 ? idx : list.length; - var result = Array.prototype.slice.call(list, 0); - result.splice(idx, 0, elt); - return result; -}); -/* harmony default export */ __webpack_exports__["default"] = (insert); +function getEntries(type, collection, sortObjectKeys) { + var from = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; + var to = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : Infinity; + var res; -/***/ }), + if (type === 'Object') { + var keys = Object.getOwnPropertyNames(collection); -/***/ "./node_modules/ramda/es/insertAll.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/insertAll.js ***! - \********************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + if (sortObjectKeys) { + keys.sort(sortObjectKeys === true ? undefined : sortObjectKeys); + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); + keys = keys.slice(from, to + 1); + res = { + entries: keys.map(function (key) { + return { + key: key, + value: collection[key] + }; + }) + }; + } else if (type === 'Array') { + res = { + entries: collection.slice(from, to + 1).map(function (val, idx) { + return { + key: idx + from, + value: val + }; + }) + }; + } else { + var idx = 0; + var entries = []; + var done = true; + var isMap = isIterableMap(collection); -/** - * Inserts the sub-list into the list, at the specified `index`. _Note that this is not - * destructive_: it returns a copy of the list with the changes. - * No lists have been harmed in the application of this function. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category List - * @sig Number -> [a] -> [a] -> [a] - * @param {Number} index The position to insert the sub-list - * @param {Array} elts The sub-list to insert into the Array - * @param {Array} list The list to insert the sub-list into - * @return {Array} A new Array with `elts` inserted starting at `index`. - * @example - * - * R.insertAll(2, ['x','y','z'], [1,2,3,4]); //=> [1,2,'x','y','z',3,4] - */ + var _iterator = _createForOfIteratorHelper(collection), + _step; -var insertAll = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function insertAll(idx, elts, list) { - idx = idx < list.length && idx >= 0 ? idx : list.length; - return [].concat(Array.prototype.slice.call(list, 0, idx), elts, Array.prototype.slice.call(list, idx)); -}); -/* harmony default export */ __webpack_exports__["default"] = (insertAll); + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var item = _step.value; -/***/ }), + if (idx > to) { + done = false; + break; + } -/***/ "./node_modules/ramda/es/internal/_Set.js": -/*!************************************************!*\ - !*** ./node_modules/ramda/es/internal/_Set.js ***! - \************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + if (from <= idx) { + if (isMap && Array.isArray(item)) { + if (typeof item[0] === 'string' || typeof item[0] === 'number') { + entries.push({ + key: item[0], + value: item[1] + }); + } else { + entries.push({ + key: "[entry ".concat(idx, "]"), + value: { + '[key]': item[0], + '[value]': item[1] + } + }); + } + } else { + entries.push({ + key: idx, + value: item + }); + } + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_includes.js */ "./node_modules/ramda/es/internal/_includes.js"); + idx++; + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } -var _Set = /*#__PURE__*/ -function () { - function _Set() { - /* globals Set */ - this._nativeSet = typeof Set === 'function' ? new Set() : null; - this._items = {}; + res = { + hasMore: !done, + entries: entries + }; } - // until we figure out why jsdoc chokes on this - // @param item The item to add to the Set - // @returns {boolean} true if the item did not exist prior, otherwise false - // - _Set.prototype.add = function (item) { - return !hasOrAdd(item, true, this); - }; // - // @param item The item to check for existence in the Set - // @returns {boolean} true if the item exists in the Set, otherwise false - // + return res; +} - _Set.prototype.has = function (item) { - return hasOrAdd(item, false, this); - }; // - // Combines the logic for checking whether an item is a member of the set and - // for adding a new item to the set. - // - // @param item The item to check or add to the Set instance. - // @param shouldAdd If true, the item will be added to the set if it doesn't - // already exist. - // @param set The set instance to check or add to. - // @return {boolean} true if the item already existed, otherwise false. - // +function getRanges(from, to, limit) { + var ranges = []; - return _Set; -}(); -function hasOrAdd(item, shouldAdd, set) { - var type = typeof item; - var prevSize, newSize; - switch (type) { - case 'string': - case 'number': - // distinguish between +0 and -0 - if (item === 0 && 1 / item === -Infinity) { - if (set._items['-0']) { - return true; - } else { - if (shouldAdd) { - set._items['-0'] = true; - } - return false; - } - } // these types can all utilise the native Set + while (to - from > limit * limit) { + limit = limit * limit; + } - if (set._nativeSet !== null) { - if (shouldAdd) { - prevSize = set._nativeSet.size; - set._nativeSet.add(item); - newSize = set._nativeSet.size; - return newSize === prevSize; - } else { - return set._nativeSet.has(item); - } - } else { - if (!(type in set._items)) { - if (shouldAdd) { - set._items[type] = {}; - set._items[type][item] = true; - } - return false; - } else if (item in set._items[type]) { - return true; - } else { - if (shouldAdd) { - set._items[type][item] = true; - } - return false; - } - } - case 'boolean': - // set._items['boolean'] holds a two element array - // representing [ falseExists, trueExists ] - if (type in set._items) { - var bIdx = item ? 1 : 0; - if (set._items[type][bIdx]) { - return true; - } else { - if (shouldAdd) { - set._items[type][bIdx] = true; - } - return false; - } - } else { - if (shouldAdd) { - set._items[type] = item ? [false, true] : [true, false]; - } - return false; - } - case 'function': - // compare functions for reference equality - if (set._nativeSet !== null) { - if (shouldAdd) { - prevSize = set._nativeSet.size; - set._nativeSet.add(item); - newSize = set._nativeSet.size; - return newSize === prevSize; - } else { - return set._nativeSet.has(item); - } - } else { - if (!(type in set._items)) { - if (shouldAdd) { - set._items[type] = [item]; - } - return false; - } - if (!(0,_includes_js__WEBPACK_IMPORTED_MODULE_0__["default"])(item, set._items[type])) { - if (shouldAdd) { - set._items[type].push(item); - } - return false; - } - return true; - } - case 'undefined': - if (set._items[type]) { - return true; - } else { - if (shouldAdd) { - set._items[type] = true; - } - return false; - } - case 'object': - if (item === null) { - if (!set._items['null']) { - if (shouldAdd) { - set._items['null'] = true; - } - return false; - } - return true; - } + for (var i = from; i <= to; i += limit) { + ranges.push({ + from: i, + to: Math.min(to, i + limit - 1) + }); + } - /* falls through */ + return ranges; +} - default: - // reduce the search size of heterogeneous sets by creating buckets - // for each type. - type = Object.prototype.toString.call(item); - if (!(type in set._items)) { - if (shouldAdd) { - set._items[type] = [item]; - } - return false; - } // scan through all previously applied items +function getCollectionEntries(type, collection, sortObjectKeys, limit) { + var from = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; + var to = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : Infinity; + var getEntriesBound = getEntries.bind(null, type, collection, sortObjectKeys); - if (!(0,_includes_js__WEBPACK_IMPORTED_MODULE_0__["default"])(item, set._items[type])) { - if (shouldAdd) { - set._items[type].push(item); - } - return false; - } - return true; + if (!limit) { + return getEntriesBound().entries; } -} // A simple Set type that honours R.equals semantics -/* harmony default export */ __webpack_exports__["default"] = (_Set); + var isSubset = to < Infinity; + var length = Math.min(to - from, getLength(type, collection)); + + if (type !== 'Iterable') { + if (length <= limit || limit < 7) { + return getEntriesBound(from, to).entries; + } + } else { + if (length <= limit && !isSubset) { + return getEntriesBound(from, to).entries; + } + } -/***/ }), + var limitedEntries; -/***/ "./node_modules/ramda/es/internal/_aperture.js": -/*!*****************************************************!*\ - !*** ./node_modules/ramda/es/internal/_aperture.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + if (type === 'Iterable') { + var _getEntriesBound = getEntriesBound(from, from + limit - 1), + hasMore = _getEntriesBound.hasMore, + entries = _getEntriesBound.entries; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _aperture; } -/* harmony export */ }); -function _aperture(n, list) { - var idx = 0; - var limit = list.length - (n - 1); - var acc = new Array(limit >= 0 ? limit : 0); - while (idx < limit) { - acc[idx] = Array.prototype.slice.call(list, idx, idx + n); - idx += 1; + limitedEntries = hasMore ? [].concat((0,_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__["default"])(entries), (0,_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__["default"])(getRanges(from + limit, from + 2 * limit - 1, limit))) : entries; + } else { + limitedEntries = isSubset ? getRanges(from, to, limit) : [].concat((0,_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__["default"])(getEntriesBound(0, limit - 5).entries), (0,_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__["default"])(getRanges(limit - 4, length - 5, limit)), (0,_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__["default"])(getEntriesBound(length - 4, length - 1).entries)); } - return acc; + + return limitedEntries; } /***/ }), -/***/ "./node_modules/ramda/es/internal/_arity.js": -/*!**************************************************!*\ - !*** ./node_modules/ramda/es/internal/_arity.js ***! - \**************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/react-json-tree/lib/esm/index.js": +/*!*******************************************************!*\ + !*** ./node_modules/react-json-tree/lib/esm/index.js ***! + \*******************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _arity; } +/* harmony export */ JSONTree: function() { return /* binding */ JSONTree; } /* harmony export */ }); -function _arity(n, fn) { - /* eslint-disable no-unused-vars */ - switch (n) { - case 0: - return function () { - return fn.apply(this, arguments); - }; - case 1: - return function (a0) { - return fn.apply(this, arguments); - }; - case 2: - return function (a0, a1) { - return fn.apply(this, arguments); - }; - case 3: - return function (a0, a1, a2) { - return fn.apply(this, arguments); - }; - case 4: - return function (a0, a1, a2, a3) { - return fn.apply(this, arguments); - }; - case 5: - return function (a0, a1, a2, a3, a4) { - return fn.apply(this, arguments); - }; - case 6: - return function (a0, a1, a2, a3, a4, a5) { - return fn.apply(this, arguments); - }; - case 7: - return function (a0, a1, a2, a3, a4, a5, a6) { - return fn.apply(this, arguments); - }; - case 8: - return function (a0, a1, a2, a3, a4, a5, a6, a7) { - return fn.apply(this, arguments); - }; - case 9: - return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) { - return fn.apply(this, arguments); - }; - case 10: - return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - return fn.apply(this, arguments); - }; - default: - throw new Error('First argument to _arity must be a non-negative integer no greater than ten'); - } -} +/* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); +/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/esm/classCallCheck.js"); +/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/esm/createClass.js"); +/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/esm/inherits.js"); +/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js"); +/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js"); +/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); +/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_9__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ "prop-types"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__); +/* harmony import */ var _JSONNode__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./JSONNode */ "./node_modules/react-json-tree/lib/esm/JSONNode.js"); +/* harmony import */ var _createStylingFromTheme__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./createStylingFromTheme */ "./node_modules/react-json-tree/lib/esm/createStylingFromTheme.js"); +/* harmony import */ var react_base16_styling__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! react-base16-styling */ "./node_modules/react-base16-styling/lib/esm/index.js"); -/***/ }), -/***/ "./node_modules/ramda/es/internal/_arrayFromIterator.js": -/*!**************************************************************!*\ - !*** ./node_modules/ramda/es/internal/_arrayFromIterator.js ***! - \**************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _arrayFromIterator; } -/* harmony export */ }); -function _arrayFromIterator(iter) { - var list = []; - var next; - while (!(next = iter.next()).done) { - list.push(next.value); - } - return list; -} -/***/ }), -/***/ "./node_modules/ramda/es/internal/_arrayReduce.js": -/*!********************************************************!*\ - !*** ./node_modules/ramda/es/internal/_arrayReduce.js ***! - \********************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _arrayReduce; } -/* harmony export */ }); -function _arrayReduce(reducer, acc, list) { - var index = 0; - var length = list.length; - while (index < length) { - acc = reducer(acc, list[index]); - index += 1; - } - return acc; -} -/***/ }), -/***/ "./node_modules/ramda/es/internal/_assertPromise.js": -/*!**********************************************************!*\ - !*** ./node_modules/ramda/es/internal/_assertPromise.js ***! - \**********************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _assertPromise; } -/* harmony export */ }); -/* harmony import */ var _isFunction_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isFunction.js */ "./node_modules/ramda/es/internal/_isFunction.js"); -/* harmony import */ var _toString_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_toString.js */ "./node_modules/ramda/es/internal/_toString.js"); +var _excluded = ["data", "keyPath", "postprocessValue", "hideRoot", "theme", "invertTheme"]; +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__["default"])(this, result); }; } -function _assertPromise(name, p) { - if (p == null || !(0,_isFunction_js__WEBPACK_IMPORTED_MODULE_0__["default"])(p.then)) { - throw new TypeError('`' + name + '` expected a Promise, received ' + (0,_toString_js__WEBPACK_IMPORTED_MODULE_1__["default"])(p, [])); - } -} +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } -/***/ }), +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } -/***/ "./node_modules/ramda/es/internal/_assoc.js": -/*!**************************************************!*\ - !*** ./node_modules/ramda/es/internal/_assoc.js ***! - \**************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7__["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _assoc; } -/* harmony export */ }); -/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); -/* harmony import */ var _isInteger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isInteger.js */ "./node_modules/ramda/es/internal/_isInteger.js"); +// ES6 + inline style port of JSONViewer https://bitbucket.org/davevedder/react-json-viewer/ +// all credits and original code to the author +// Dave Vedder http://www.eskimospy.com/ +// port by Daniele Zannotti http://www.github.com/dzannotti -/** - * Makes a shallow clone of an object, setting or overriding the specified - * property with the given value. Note that this copies and flattens prototype - * properties onto the new object as well. All non-primitive properties are - * copied by reference. - * - * @private - * @param {String|Number} prop The property name to set - * @param {*} val The new value - * @param {Object|Array} obj The object to clone - * @return {Object|Array} A new object equivalent to the original except for the changed property. - */ -function _assoc(prop, val, obj) { - if ((0,_isInteger_js__WEBPACK_IMPORTED_MODULE_1__["default"])(prop) && (0,_isArray_js__WEBPACK_IMPORTED_MODULE_0__["default"])(obj)) { - var arr = [].concat(obj); - arr[prop] = val; - return arr; - } - var result = {}; - for (var p in obj) { - result[p] = obj[p]; - } - result[prop] = val; - return result; -} -/***/ }), -/***/ "./node_modules/ramda/es/internal/_checkForMethod.js": -/*!***********************************************************!*\ - !*** ./node_modules/ramda/es/internal/_checkForMethod.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _checkForMethod; } -/* harmony export */ }); -/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); +var identity = function identity(value) { + return value; +}; -/** - * This checks whether a function has a [methodname] function. If it isn't an - * array it will execute that function otherwise it will default to the ramda - * implementation. - * - * @private - * @param {Function} fn ramda implementation - * @param {String} methodname property to check for a custom implementation - * @return {Object} Whatever the return value of the method is. - */ +var expandRootNode = function expandRootNode(keyPath, data, level) { + return level === 0; +}; -function _checkForMethod(methodname, fn) { - return function () { - var length = arguments.length; - if (length === 0) { - return fn(); - } - var obj = arguments[length - 1]; - return (0,_isArray_js__WEBPACK_IMPORTED_MODULE_0__["default"])(obj) || typeof obj[methodname] !== 'function' ? fn.apply(this, arguments) : obj[methodname].apply(obj, Array.prototype.slice.call(arguments, 0, length - 1)); +var defaultItemString = function defaultItemString(type, data, itemType, itemString) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement("span", null, itemType, " ", itemString); +}; + +var defaultLabelRenderer = function defaultLabelRenderer(_ref) { + var _ref2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_8__["default"])(_ref, 1), + label = _ref2[0]; + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement("span", null, label, ":"); +}; + +var noCustomNode = function noCustomNode() { + return false; +}; + +function checkLegacyTheming(theme, props) { + var deprecatedStylingMethodsMap = { + getArrowStyle: 'arrow', + getListStyle: 'nestedNodeChildren', + getItemStringStyle: 'nestedNodeItemString', + getLabelStyle: 'label', + getValueStyle: 'valueText' }; -} + var deprecatedStylingMethods = Object.keys(deprecatedStylingMethodsMap).filter(function (name) { + return props[name]; + }); -/***/ }), + if (deprecatedStylingMethods.length > 0) { + if (typeof theme === 'string') { + theme = { + extend: theme + }; + } else { + theme = _objectSpread({}, theme); + } -/***/ "./node_modules/ramda/es/internal/_clone.js": -/*!**************************************************!*\ - !*** ./node_modules/ramda/es/internal/_clone.js ***! - \**************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + deprecatedStylingMethods.forEach(function (name) { + // eslint-disable-next-line no-console + console.error("Styling method \"".concat(name, "\" is deprecated, use \"theme\" property instead")); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _clone; } -/* harmony export */ }); -/* harmony import */ var _cloneRegExp_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_cloneRegExp.js */ "./node_modules/ramda/es/internal/_cloneRegExp.js"); -/* harmony import */ var _type_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../type.js */ "./node_modules/ramda/es/type.js"); + theme[deprecatedStylingMethodsMap[name]] = function (_ref3) { + var style = _ref3.style; + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } -/** - * Copies an object. - * - * @private - * @param {*} value The value to be copied - * @param {Boolean} deep Whether or not to perform deep cloning. - * @return {*} The copied value. - */ + return { + style: _objectSpread(_objectSpread({}, style), props[name].apply(props, args)) + }; + }; + }); + } -function _clone(value, deep, map) { - map || (map = new _ObjectMap()); // this avoids the slower switch with a quick if decision removing some milliseconds in each run. + return theme; +} - if (_isPrimitive(value)) { - return value; +function getStateFromProps(props) { + var theme = checkLegacyTheming(props.theme, props); + + if (props.invertTheme) { + theme = (0,react_base16_styling__WEBPACK_IMPORTED_MODULE_11__.invertTheme)(theme); } - var copy = function copy(copiedValue) { - // Check for circular and same references on the object graph and return its corresponding clone. - var cachedCopy = map.get(value); - if (cachedCopy) { - return cachedCopy; - } - map.set(value, copiedValue); - for (var key in value) { - if (Object.prototype.hasOwnProperty.call(value, key)) { - copiedValue[key] = deep ? _clone(value[key], true, map) : value[key]; - } - } - return copiedValue; + + return { + styling: (0,_createStylingFromTheme__WEBPACK_IMPORTED_MODULE_12__["default"])(theme) }; - switch ((0,_type_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value)) { - case 'Object': - return copy(Object.create(Object.getPrototypeOf(value))); - case 'Array': - return copy([]); - case 'Date': - return new Date(value.valueOf()); - case 'RegExp': - return (0,_cloneRegExp_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value); - case 'Int8Array': - case 'Uint8Array': - case 'Uint8ClampedArray': - case 'Int16Array': - case 'Uint16Array': - case 'Int32Array': - case 'Uint32Array': - case 'Float32Array': - case 'Float64Array': - case 'BigInt64Array': - case 'BigUint64Array': - return value.slice(); - default: - return value; - } -} -function _isPrimitive(param) { - var type = typeof param; - return param == null || type != 'object' && type != 'function'; } -var _ObjectMap = /*#__PURE__*/ -function () { - function _ObjectMap() { - this.map = {}; - this.length = 0; + +var JSONTree = /*#__PURE__*/function (_React$Component) { + (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__["default"])(JSONTree, _React$Component); + + var _super = _createSuper(JSONTree); + + function JSONTree(props) { + var _this; + + (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__["default"])(this, JSONTree); + + _this = _super.call(this, props); + _this.state = getStateFromProps(props); + return _this; } - _ObjectMap.prototype.set = function (key, value) { - var hashedKey = this.hash(key); - var bucket = this.map[hashedKey]; - if (!bucket) { - this.map[hashedKey] = bucket = []; - } - bucket.push([key, value]); - this.length += 1; - }; - _ObjectMap.prototype.hash = function (key) { - var hashedKey = []; - for (var value in key) { - hashedKey.push(Object.prototype.toString.call(key[value])); - } - return hashedKey.join(); - }; - _ObjectMap.prototype.get = function (key) { - /** - * depending on the number of objects to be cloned is faster to just iterate over the items in the map just because the hash function is so costly, - * on my tests this number is 180, anything above that using the hash function is faster. - */ - if (this.length <= 180) { - for (var p in this.map) { - var _bucket = this.map[p]; - for (var i = 0; i < _bucket.length; i += 1) { - var element = _bucket[i]; - if (element[0] === key) { - return element[1]; - } - } + + (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__["default"])(JSONTree, [{ + key: "UNSAFE_componentWillReceiveProps", + value: function UNSAFE_componentWillReceiveProps(nextProps) { + var _this2 = this; + + if (['theme', 'invertTheme'].find(function (k) { + return nextProps[k] !== _this2.props[k]; + })) { + this.setState(getStateFromProps(nextProps)); } - return; } - var hashedKey = this.hash(key); - var bucket = this.map[hashedKey]; - if (!bucket) { - return; + }, { + key: "shouldComponentUpdate", + value: function shouldComponentUpdate(nextProps) { + var _this3 = this; + + return !!Object.keys(nextProps).find(function (k) { + return k === 'keyPath' ? nextProps[k].join('/') !== _this3.props[k].join('/') : nextProps[k] !== _this3.props[k]; + }); } - for (var _i = 0; _i < bucket.length; _i += 1) { - var _element = bucket[_i]; - if (_element[0] === key) { - return _element[1]; - } + }, { + key: "render", + value: function render() { + var _this$props = this.props, + value = _this$props.data, + keyPath = _this$props.keyPath, + postprocessValue = _this$props.postprocessValue, + hideRoot = _this$props.hideRoot, + theme = _this$props.theme, + _ = _this$props.invertTheme, + rest = (0,_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__["default"])(_this$props, _excluded); + + var styling = this.state.styling; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement("ul", styling('tree'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default().createElement(_JSONNode__WEBPACK_IMPORTED_MODULE_13__["default"], (0,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _objectSpread({ + postprocessValue: postprocessValue, + hideRoot: hideRoot, + styling: styling + }, rest), { + keyPath: hideRoot ? [] : keyPath, + value: postprocessValue(value) + }))); } - }; - return _ObjectMap; -}(); + }]); + + return JSONTree; +}((react__WEBPACK_IMPORTED_MODULE_9___default().Component)); + +(0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7__["default"])(JSONTree, "propTypes", { + data: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().any), + hideRoot: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().bool), + theme: prop_types__WEBPACK_IMPORTED_MODULE_10___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_10___default().object), (prop_types__WEBPACK_IMPORTED_MODULE_10___default().string)]), + invertTheme: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().bool), + keyPath: prop_types__WEBPACK_IMPORTED_MODULE_10___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_10___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_10___default().string), (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number)])), + postprocessValue: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().func), + sortObjectKeys: prop_types__WEBPACK_IMPORTED_MODULE_10___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_10___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_10___default().bool)]) +}); + +(0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_7__["default"])(JSONTree, "defaultProps", { + shouldExpandNode: expandRootNode, + hideRoot: false, + keyPath: ['root'], + getItemString: defaultItemString, + labelRenderer: defaultLabelRenderer, + valueRenderer: identity, + postprocessValue: identity, + isCustomNode: noCustomNode, + collectionLimit: 50, + invertTheme: true +}); + +/***/ }), + +/***/ "./node_modules/react-json-tree/lib/esm/objType.js": +/*!*********************************************************!*\ + !*** ./node_modules/react-json-tree/lib/esm/objType.js ***! + \*********************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ objType; } +/* harmony export */ }); +function objType(obj) { + var type = Object.prototype.toString.call(obj).slice(8, -1); + + if (type === 'Object' && typeof obj[Symbol.iterator] === 'function') { + return 'Iterable'; + } + + if (type === 'Custom' && obj.constructor !== Object && obj instanceof Object) { + // For projects implementing objects overriding `.prototype[Symbol.toStringTag]` + return 'Object'; + } + + return type; +} /***/ }), -/***/ "./node_modules/ramda/es/internal/_cloneRegExp.js": -/*!********************************************************!*\ - !*** ./node_modules/ramda/es/internal/_cloneRegExp.js ***! - \********************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/react-json-tree/lib/esm/themes/solarized.js": +/*!******************************************************************!*\ + !*** ./node_modules/react-json-tree/lib/esm/themes/solarized.js ***! + \******************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _cloneRegExp; } -/* harmony export */ }); -function _cloneRegExp(pattern) { - return new RegExp(pattern.source, pattern.flags ? pattern.flags : (pattern.global ? 'g' : '') + (pattern.ignoreCase ? 'i' : '') + (pattern.multiline ? 'm' : '') + (pattern.sticky ? 'y' : '') + (pattern.unicode ? 'u' : '') + (pattern.dotAll ? 's' : '')); -} +/* harmony default export */ __webpack_exports__["default"] = ({ + scheme: 'solarized', + author: 'ethan schoonover (http://ethanschoonover.com/solarized)', + base00: '#002b36', + base01: '#073642', + base02: '#586e75', + base03: '#657b83', + base04: '#839496', + base05: '#93a1a1', + base06: '#eee8d5', + base07: '#fdf6e3', + base08: '#dc322f', + base09: '#cb4b16', + base0A: '#b58900', + base0B: '#859900', + base0C: '#2aa198', + base0D: '#268bd2', + base0E: '#6c71c4', + base0F: '#d33682' +}); /***/ }), -/***/ "./node_modules/ramda/es/internal/_complement.js": +/***/ "./node_modules/redux-actions/es/createAction.js": /*!*******************************************************!*\ - !*** ./node_modules/ramda/es/internal/_complement.js ***! + !*** ./node_modules/redux-actions/es/createAction.js ***! \*******************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _complement; } +/* harmony export */ "default": function() { return /* binding */ createAction; } /* harmony export */ }); -function _complement(f) { - return function () { - return !f.apply(this, arguments); +/* harmony import */ var invariant__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! invariant */ "./node_modules/invariant/browser.js"); +/* harmony import */ var invariant__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(invariant__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _utils_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/isFunction */ "./node_modules/redux-actions/es/utils/isFunction.js"); +/* harmony import */ var _utils_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/identity */ "./node_modules/redux-actions/es/utils/identity.js"); +/* harmony import */ var _utils_isNull__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils/isNull */ "./node_modules/redux-actions/es/utils/isNull.js"); + + + + +function createAction(type, payloadCreator, metaCreator) { + if (payloadCreator === void 0) { + payloadCreator = _utils_identity__WEBPACK_IMPORTED_MODULE_1__["default"]; + } + + invariant__WEBPACK_IMPORTED_MODULE_0___default()((0,_utils_isFunction__WEBPACK_IMPORTED_MODULE_2__["default"])(payloadCreator) || (0,_utils_isNull__WEBPACK_IMPORTED_MODULE_3__["default"])(payloadCreator), 'Expected payloadCreator to be a function, undefined or null'); + var finalPayloadCreator = (0,_utils_isNull__WEBPACK_IMPORTED_MODULE_3__["default"])(payloadCreator) || payloadCreator === _utils_identity__WEBPACK_IMPORTED_MODULE_1__["default"] ? _utils_identity__WEBPACK_IMPORTED_MODULE_1__["default"] : function (head) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + return head instanceof Error ? head : payloadCreator.apply(void 0, [head].concat(args)); + }; + var hasMeta = (0,_utils_isFunction__WEBPACK_IMPORTED_MODULE_2__["default"])(metaCreator); + var typeString = type.toString(); + + var actionCreator = function actionCreator() { + var payload = finalPayloadCreator.apply(void 0, arguments); + var action = { + type: type + }; + + if (payload instanceof Error) { + action.error = true; + } + + if (payload !== undefined) { + action.payload = payload; + } + + if (hasMeta) { + action.meta = metaCreator.apply(void 0, arguments); + } + + return action; + }; + + actionCreator.toString = function () { + return typeString; }; + + return actionCreator; } /***/ }), -/***/ "./node_modules/ramda/es/internal/_concat.js": -/*!***************************************************!*\ - !*** ./node_modules/ramda/es/internal/_concat.js ***! - \***************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/redux-actions/es/utils/identity.js": +/*!*********************************************************!*\ + !*** ./node_modules/redux-actions/es/utils/identity.js ***! + \*********************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _concat; } -/* harmony export */ }); -/** - * Private `concat` function to merge two array-like objects. - * - * @private - * @param {Array|Arguments} [set1=[]] An array-like object. - * @param {Array|Arguments} [set2=[]] An array-like object. - * @return {Array} A new, merged array. - * @example - * - * _concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3] - */ -function _concat(set1, set2) { - set1 = set1 || []; - set2 = set2 || []; - var idx; - var len1 = set1.length; - var len2 = set2.length; - var result = []; - idx = 0; - while (idx < len1) { - result[result.length] = set1[idx]; - idx += 1; - } - idx = 0; - while (idx < len2) { - result[result.length] = set2[idx]; - idx += 1; - } - return result; -} +/* harmony default export */ __webpack_exports__["default"] = (function (value) { + return value; +}); /***/ }), -/***/ "./node_modules/ramda/es/internal/_createPartialApplicator.js": -/*!********************************************************************!*\ - !*** ./node_modules/ramda/es/internal/_createPartialApplicator.js ***! - \********************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/redux-actions/es/utils/isFunction.js": +/*!***********************************************************!*\ + !*** ./node_modules/redux-actions/es/utils/isFunction.js ***! + \***********************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _createPartialApplicator; } -/* harmony export */ }); -/* harmony import */ var _arity_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arity.js */ "./node_modules/ramda/es/internal/_arity.js"); -/* harmony import */ var _curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony default export */ __webpack_exports__["default"] = (function (value) { + return typeof value === 'function'; +}); +/***/ }), -function _createPartialApplicator(concat) { - return (0,_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (fn, args) { - return (0,_arity_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Math.max(0, fn.length - args.length), function () { - return fn.apply(this, concat(args, arguments)); - }); - }); -} +/***/ "./node_modules/redux-actions/es/utils/isNull.js": +/*!*******************************************************!*\ + !*** ./node_modules/redux-actions/es/utils/isNull.js ***! + \*******************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (function (value) { + return value === null; +}); /***/ }), -/***/ "./node_modules/ramda/es/internal/_createReduce.js": -/*!*********************************************************!*\ - !*** ./node_modules/ramda/es/internal/_createReduce.js ***! - \*********************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/redux-thunk/es/index.js": +/*!**********************************************!*\ + !*** ./node_modules/redux-thunk/es/index.js ***! + \**********************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _createReduce; } -/* harmony export */ }); -/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArrayLike.js */ "./node_modules/ramda/es/internal/_isArrayLike.js"); +/** A function that accepts a potential "extra argument" value to be injected later, + * and returns an instance of the thunk middleware that uses that value + */ +function createThunkMiddleware(extraArgument) { + // Standard Redux middleware definition pattern: + // See: https://redux.js.org/tutorials/fundamentals/part-4-store#writing-custom-middleware + var middleware = function middleware(_ref) { + var dispatch = _ref.dispatch, + getState = _ref.getState; + return function (next) { + return function (action) { + // The thunk middleware looks for any functions that were passed to `store.dispatch`. + // If this "action" is really a function, call it and return the result. + if (typeof action === 'function') { + // Inject the store's `dispatch` and `getState` methods, as well as any "extra arg" + return action(dispatch, getState, extraArgument); + } // Otherwise, pass the action down the middleware chain as usual -var symIterator = typeof Symbol !== 'undefined' ? Symbol.iterator : '@@iterator'; -function _createReduce(arrayReduce, methodReduce, iterableReduce) { - return function _reduce(xf, acc, list) { - if ((0,_isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__["default"])(list)) { - return arrayReduce(xf, acc, list); - } - if (list == null) { - return acc; - } - if (typeof list['fantasy-land/reduce'] === 'function') { - return methodReduce(xf, acc, list, 'fantasy-land/reduce'); - } - if (list[symIterator] != null) { - return iterableReduce(xf, acc, list[symIterator]()); - } - if (typeof list.next === 'function') { - return iterableReduce(xf, acc, list); - } - if (typeof list.reduce === 'function') { - return methodReduce(xf, acc, list, 'reduce'); - } - throw new TypeError('reduce: list must be array or iterable'); + + return next(action); + }; + }; }; + + return middleware; } +var thunk = createThunkMiddleware(); // Attach the factory function so users can create a customized version +// with whatever "extra arg" they want to inject into their thunks + +thunk.withExtraArgument = createThunkMiddleware; +/* harmony default export */ __webpack_exports__["default"] = (thunk); + /***/ }), -/***/ "./node_modules/ramda/es/internal/_curry1.js": -/*!***************************************************!*\ - !*** ./node_modules/ramda/es/internal/_curry1.js ***! - \***************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/redux/es/redux.js": +/*!****************************************!*\ + !*** ./node_modules/redux/es/redux.js ***! + \****************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _curry1; } +/* harmony export */ __DO_NOT_USE__ActionTypes: function() { return /* binding */ ActionTypes; }, +/* harmony export */ applyMiddleware: function() { return /* binding */ applyMiddleware; }, +/* harmony export */ bindActionCreators: function() { return /* binding */ bindActionCreators; }, +/* harmony export */ combineReducers: function() { return /* binding */ combineReducers; }, +/* harmony export */ compose: function() { return /* binding */ compose; }, +/* harmony export */ createStore: function() { return /* binding */ createStore; }, +/* harmony export */ legacy_createStore: function() { return /* binding */ legacy_createStore; } /* harmony export */ }); -/* harmony import */ var _isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isPlaceholder.js */ "./node_modules/ramda/es/internal/_isPlaceholder.js"); +/* harmony import */ var _babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectSpread2 */ "./node_modules/@babel/runtime/helpers/esm/objectSpread2.js"); + /** - * Optimized internal one-arity curry function. + * Adapted from React: https://github.com/facebook/react/blob/master/packages/shared/formatProdErrorMessage.js * - * @private - * @category Function - * @param {Function} fn The function to curry. - * @return {Function} The curried function. + * Do not require this module directly! Use normal throw error calls. These messages will be replaced with error codes + * during build. + * @param {number} code */ - -function _curry1(fn) { - return function f1(a) { - if (arguments.length === 0 || (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(a)) { - return f1; - } else { - return fn.apply(this, arguments); - } - }; +function formatProdErrorMessage(code) { + return "Minified Redux error #" + code + "; visit https://redux.js.org/Errors?code=" + code + " for the full message or " + 'use the non-minified dev environment for full errors. '; } -/***/ }), - -/***/ "./node_modules/ramda/es/internal/_curry2.js": -/*!***************************************************!*\ - !*** ./node_modules/ramda/es/internal/_curry2.js ***! - \***************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +// Inlined version of the `symbol-observable` polyfill +var $$observable = (function () { + return typeof Symbol === 'function' && Symbol.observable || '@@observable'; +})(); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _curry2; } -/* harmony export */ }); -/* harmony import */ var _curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _isPlaceholder_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isPlaceholder.js */ "./node_modules/ramda/es/internal/_isPlaceholder.js"); +/** + * These are private action types reserved by Redux. + * For any unknown actions, you must return the current state. + * If the current state is undefined, you must return the initial state. + * Do not reference these action types directly in your code. + */ +var randomString = function randomString() { + return Math.random().toString(36).substring(7).split('').join('.'); +}; +var ActionTypes = { + INIT: "@@redux/INIT" + randomString(), + REPLACE: "@@redux/REPLACE" + randomString(), + PROBE_UNKNOWN_ACTION: function PROBE_UNKNOWN_ACTION() { + return "@@redux/PROBE_UNKNOWN_ACTION" + randomString(); + } +}; /** - * Optimized internal two-arity curry function. - * - * @private - * @category Function - * @param {Function} fn The function to curry. - * @return {Function} The curried function. + * @param {any} obj The object to inspect. + * @returns {boolean} True if the argument appears to be a plain object. */ +function isPlainObject(obj) { + if (typeof obj !== 'object' || obj === null) return false; + var proto = obj; -function _curry2(fn) { - return function f2(a, b) { - switch (arguments.length) { - case 0: - return f2; - case 1: - return (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_1__["default"])(a) ? f2 : (0,_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (_b) { - return fn(a, _b); - }); - default: - return (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_1__["default"])(a) && (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_1__["default"])(b) ? f2 : (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_1__["default"])(a) ? (0,_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (_a) { - return fn(_a, b); - }) : (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_1__["default"])(b) ? (0,_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (_b) { - return fn(a, _b); - }) : fn(a, b); - } - }; + while (Object.getPrototypeOf(proto) !== null) { + proto = Object.getPrototypeOf(proto); + } + + return Object.getPrototypeOf(obj) === proto; } -/***/ }), +// Inlined / shortened version of `kindOf` from https://github.com/jonschlinkert/kind-of +function miniKindOf(val) { + if (val === void 0) return 'undefined'; + if (val === null) return 'null'; + var type = typeof val; -/***/ "./node_modules/ramda/es/internal/_curry3.js": -/*!***************************************************!*\ - !*** ./node_modules/ramda/es/internal/_curry3.js ***! - \***************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + switch (type) { + case 'boolean': + case 'string': + case 'number': + case 'symbol': + case 'function': + { + return type; + } + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _curry3; } -/* harmony export */ }); -/* harmony import */ var _curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _isPlaceholder_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_isPlaceholder.js */ "./node_modules/ramda/es/internal/_isPlaceholder.js"); + if (Array.isArray(val)) return 'array'; + if (isDate(val)) return 'date'; + if (isError(val)) return 'error'; + var constructorName = ctorName(val); + + switch (constructorName) { + case 'Symbol': + case 'Promise': + case 'WeakMap': + case 'WeakSet': + case 'Map': + case 'Set': + return constructorName; + } // other + return type.slice(8, -1).toLowerCase().replace(/\s/g, ''); +} -/** - * Optimized internal three-arity curry function. - * - * @private - * @category Function - * @param {Function} fn The function to curry. - * @return {Function} The curried function. - */ +function ctorName(val) { + return typeof val.constructor === 'function' ? val.constructor.name : null; +} -function _curry3(fn) { - return function f3(a, b, c) { - switch (arguments.length) { - case 0: - return f3; - case 1: - return (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_2__["default"])(a) ? f3 : (0,_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (_b, _c) { - return fn(a, _b, _c); - }); - case 2: - return (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_2__["default"])(a) && (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_2__["default"])(b) ? f3 : (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_2__["default"])(a) ? (0,_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (_a, _c) { - return fn(_a, b, _c); - }) : (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_2__["default"])(b) ? (0,_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (_b, _c) { - return fn(a, _b, _c); - }) : (0,_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (_c) { - return fn(a, b, _c); - }); - default: - return (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_2__["default"])(a) && (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_2__["default"])(b) && (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_2__["default"])(c) ? f3 : (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_2__["default"])(a) && (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_2__["default"])(b) ? (0,_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (_a, _b) { - return fn(_a, _b, c); - }) : (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_2__["default"])(a) && (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_2__["default"])(c) ? (0,_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (_a, _c) { - return fn(_a, b, _c); - }) : (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_2__["default"])(b) && (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_2__["default"])(c) ? (0,_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (_b, _c) { - return fn(a, _b, _c); - }) : (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_2__["default"])(a) ? (0,_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (_a) { - return fn(_a, b, c); - }) : (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_2__["default"])(b) ? (0,_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (_b) { - return fn(a, _b, c); - }) : (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_2__["default"])(c) ? (0,_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (_c) { - return fn(a, b, _c); - }) : fn(a, b, c); - } - }; +function isError(val) { + return val instanceof Error || typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number'; } -/***/ }), +function isDate(val) { + if (val instanceof Date) return true; + return typeof val.toDateString === 'function' && typeof val.getDate === 'function' && typeof val.setDate === 'function'; +} -/***/ "./node_modules/ramda/es/internal/_curryN.js": -/*!***************************************************!*\ - !*** ./node_modules/ramda/es/internal/_curryN.js ***! - \***************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +function kindOf(val) { + var typeOfVal = typeof val; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _curryN; } -/* harmony export */ }); -/* harmony import */ var _arity_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arity.js */ "./node_modules/ramda/es/internal/_arity.js"); -/* harmony import */ var _isPlaceholder_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isPlaceholder.js */ "./node_modules/ramda/es/internal/_isPlaceholder.js"); + if (true) { + typeOfVal = miniKindOf(val); + } + return typeOfVal; +} /** - * Internal curryN function. + * @deprecated + * + * **We recommend using the `configureStore` method + * of the `@reduxjs/toolkit` package**, which replaces `createStore`. + * + * Redux Toolkit is our recommended approach for writing Redux logic today, + * including store setup, reducers, data fetching, and more. + * + * **For more details, please read this Redux docs page:** + * **https://redux.js.org/introduction/why-rtk-is-redux-today** + * + * `configureStore` from Redux Toolkit is an improved version of `createStore` that + * simplifies setup and helps avoid common bugs. + * + * You should not be using the `redux` core package by itself today, except for learning purposes. + * The `createStore` method from the core `redux` package will not be removed, but we encourage + * all users to migrate to using Redux Toolkit for all Redux code. + * + * If you want to use `createStore` without this visual deprecation warning, use + * the `legacy_createStore` import instead: + * + * `import { legacy_createStore as createStore} from 'redux'` * - * @private - * @category Function - * @param {Number} length The arity of the curried function. - * @param {Array} received An array of arguments received thus far. - * @param {Function} fn The function to curry. - * @return {Function} The curried function. */ -function _curryN(length, received, fn) { - return function () { - var combined = []; - var argsIdx = 0; - var left = length; - var combinedIdx = 0; - while (combinedIdx < received.length || argsIdx < arguments.length) { - var result; - if (combinedIdx < received.length && (!(0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_1__["default"])(received[combinedIdx]) || argsIdx >= arguments.length)) { - result = received[combinedIdx]; - } else { - result = arguments[argsIdx]; - argsIdx += 1; - } - combined[combinedIdx] = result; - if (!(0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_1__["default"])(result)) { - left -= 1; - } - combinedIdx += 1; +function createStore(reducer, preloadedState, enhancer) { + var _ref2; + + if (typeof preloadedState === 'function' && typeof enhancer === 'function' || typeof enhancer === 'function' && typeof arguments[3] === 'function') { + throw new Error( false ? 0 : 'It looks like you are passing several store enhancers to ' + 'createStore(). This is not supported. Instead, compose them ' + 'together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.'); + } + + if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') { + enhancer = preloadedState; + preloadedState = undefined; + } + + if (typeof enhancer !== 'undefined') { + if (typeof enhancer !== 'function') { + throw new Error( false ? 0 : "Expected the enhancer to be a function. Instead, received: '" + kindOf(enhancer) + "'"); } - return left <= 0 ? fn.apply(this, combined) : (0,_arity_js__WEBPACK_IMPORTED_MODULE_0__["default"])(left, _curryN(length, combined, fn)); - }; -} -/***/ }), + return enhancer(createStore)(reducer, preloadedState); + } -/***/ "./node_modules/ramda/es/internal/_dispatchable.js": -/*!*********************************************************!*\ - !*** ./node_modules/ramda/es/internal/_dispatchable.js ***! - \*********************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + if (typeof reducer !== 'function') { + throw new Error( false ? 0 : "Expected the root reducer to be a function. Instead, received: '" + kindOf(reducer) + "'"); + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _dispatchable; } -/* harmony export */ }); -/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); -/* harmony import */ var _isTransformer_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isTransformer.js */ "./node_modules/ramda/es/internal/_isTransformer.js"); + var currentReducer = reducer; + var currentState = preloadedState; + var currentListeners = []; + var nextListeners = currentListeners; + var isDispatching = false; + /** + * This makes a shallow copy of currentListeners so we can use + * nextListeners as a temporary list while dispatching. + * + * This prevents any bugs around consumers calling + * subscribe/unsubscribe in the middle of a dispatch. + */ + function ensureCanMutateNextListeners() { + if (nextListeners === currentListeners) { + nextListeners = currentListeners.slice(); + } + } + /** + * Reads the state tree managed by the store. + * + * @returns {any} The current state tree of your application. + */ -/** - * Returns a function that dispatches with different strategies based on the - * object in list position (last argument). If it is an array, executes [fn]. - * Otherwise, if it has a function with one of the given method names, it will - * execute that function (functor case). Otherwise, if it is a transformer, - * uses transducer created by [transducerCreator] to return a new transformer - * (transducer case). - * Otherwise, it will default to executing [fn]. - * - * @private - * @param {Array} methodNames properties to check for a custom implementation - * @param {Function} transducerCreator transducer factory if object is transformer - * @param {Function} fn default ramda implementation - * @return {Function} A function that dispatches on object in list position - */ -function _dispatchable(methodNames, transducerCreator, fn) { - return function () { - if (arguments.length === 0) { - return fn(); - } - var obj = arguments[arguments.length - 1]; - if (!(0,_isArray_js__WEBPACK_IMPORTED_MODULE_0__["default"])(obj)) { - var idx = 0; - while (idx < methodNames.length) { - if (typeof obj[methodNames[idx]] === 'function') { - return obj[methodNames[idx]].apply(obj, Array.prototype.slice.call(arguments, 0, -1)); - } - idx += 1; - } - if ((0,_isTransformer_js__WEBPACK_IMPORTED_MODULE_1__["default"])(obj)) { - var transducer = transducerCreator.apply(null, Array.prototype.slice.call(arguments, 0, -1)); - return transducer(obj); - } + function getState() { + if (isDispatching) { + throw new Error( false ? 0 : 'You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.'); } - return fn.apply(this, arguments); - }; -} -/***/ }), + return currentState; + } + /** + * Adds a change listener. It will be called any time an action is dispatched, + * and some part of the state tree may potentially have changed. You may then + * call `getState()` to read the current state tree inside the callback. + * + * You may call `dispatch()` from a change listener, with the following + * caveats: + * + * 1. The subscriptions are snapshotted just before every `dispatch()` call. + * If you subscribe or unsubscribe while the listeners are being invoked, this + * will not have any effect on the `dispatch()` that is currently in progress. + * However, the next `dispatch()` call, whether nested or not, will use a more + * recent snapshot of the subscription list. + * + * 2. The listener should not expect to see all state changes, as the state + * might have been updated multiple times during a nested `dispatch()` before + * the listener is called. It is, however, guaranteed that all subscribers + * registered before the `dispatch()` started will be called with the latest + * state by the time it exits. + * + * @param {Function} listener A callback to be invoked on every dispatch. + * @returns {Function} A function to remove this change listener. + */ -/***/ "./node_modules/ramda/es/internal/_dissoc.js": -/*!***************************************************!*\ - !*** ./node_modules/ramda/es/internal/_dissoc.js ***! - \***************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _dissoc; } -/* harmony export */ }); -/* harmony import */ var _isInteger_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isInteger.js */ "./node_modules/ramda/es/internal/_isInteger.js"); -/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); -/* harmony import */ var _remove_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../remove.js */ "./node_modules/ramda/es/remove.js"); + function subscribe(listener) { + if (typeof listener !== 'function') { + throw new Error( false ? 0 : "Expected the listener to be a function. Instead, received: '" + kindOf(listener) + "'"); + } + if (isDispatching) { + throw new Error( false ? 0 : 'You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.'); + } + var isSubscribed = true; + ensureCanMutateNextListeners(); + nextListeners.push(listener); + return function unsubscribe() { + if (!isSubscribed) { + return; + } -/** - * Returns a new object that does not contain a `prop` property. - * - * @private - * @param {String|Number} prop The name of the property to dissociate - * @param {Object|Array} obj The object to clone - * @return {Object} A new object equivalent to the original but without the specified property - */ + if (isDispatching) { + throw new Error( false ? 0 : 'You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.'); + } -function _dissoc(prop, obj) { - if (obj == null) { - return obj; - } - if ((0,_isInteger_js__WEBPACK_IMPORTED_MODULE_0__["default"])(prop) && (0,_isArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(obj)) { - return (0,_remove_js__WEBPACK_IMPORTED_MODULE_2__["default"])(prop, 1, obj); - } - var result = {}; - for (var p in obj) { - result[p] = obj[p]; + isSubscribed = false; + ensureCanMutateNextListeners(); + var index = nextListeners.indexOf(listener); + nextListeners.splice(index, 1); + currentListeners = null; + }; } - delete result[prop]; - return result; -} + /** + * Dispatches an action. It is the only way to trigger a state change. + * + * The `reducer` function, used to create the store, will be called with the + * current state tree and the given `action`. Its return value will + * be considered the **next** state of the tree, and the change listeners + * will be notified. + * + * The base implementation only supports plain object actions. If you want to + * dispatch a Promise, an Observable, a thunk, or something else, you need to + * wrap your store creating function into the corresponding middleware. For + * example, see the documentation for the `redux-thunk` package. Even the + * middleware will eventually dispatch plain object actions using this method. + * + * @param {Object} action A plain object representing “what changed”. It is + * a good idea to keep actions serializable so you can record and replay user + * sessions, or use the time travelling `redux-devtools`. An action must have + * a `type` property which may not be `undefined`. It is a good idea to use + * string constants for action types. + * + * @returns {Object} For convenience, the same action object you dispatched. + * + * Note that, if you use a custom middleware, it may wrap `dispatch()` to + * return something else (for example, a Promise you can await). + */ -/***/ }), -/***/ "./node_modules/ramda/es/internal/_dropLast.js": -/*!*****************************************************!*\ - !*** ./node_modules/ramda/es/internal/_dropLast.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + function dispatch(action) { + if (!isPlainObject(action)) { + throw new Error( false ? 0 : "Actions must be plain objects. Instead, the actual type was: '" + kindOf(action) + "'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples."); + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ dropLast; } -/* harmony export */ }); -/* harmony import */ var _take_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../take.js */ "./node_modules/ramda/es/take.js"); + if (typeof action.type === 'undefined') { + throw new Error( false ? 0 : 'Actions may not have an undefined "type" property. You may have misspelled an action type string constant.'); + } -function dropLast(n, xs) { - return (0,_take_js__WEBPACK_IMPORTED_MODULE_0__["default"])(n < xs.length ? xs.length - n : 0, xs); -} + if (isDispatching) { + throw new Error( false ? 0 : 'Reducers may not dispatch actions.'); + } -/***/ }), + try { + isDispatching = true; + currentState = currentReducer(currentState, action); + } finally { + isDispatching = false; + } -/***/ "./node_modules/ramda/es/internal/_dropLastWhile.js": -/*!**********************************************************!*\ - !*** ./node_modules/ramda/es/internal/_dropLastWhile.js ***! - \**********************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + var listeners = currentListeners = nextListeners; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ dropLastWhile; } -/* harmony export */ }); -/* harmony import */ var _slice_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../slice.js */ "./node_modules/ramda/es/slice.js"); + for (var i = 0; i < listeners.length; i++) { + var listener = listeners[i]; + listener(); + } -function dropLastWhile(pred, xs) { - var idx = xs.length - 1; - while (idx >= 0 && pred(xs[idx])) { - idx -= 1; + return action; } - return (0,_slice_js__WEBPACK_IMPORTED_MODULE_0__["default"])(0, idx + 1, xs); -} + /** + * Replaces the reducer currently used by the store to calculate the state. + * + * You might need this if your app implements code splitting and you want to + * load some of the reducers dynamically. You might also need this if you + * implement a hot reloading mechanism for Redux. + * + * @param {Function} nextReducer The reducer for the store to use instead. + * @returns {void} + */ -/***/ }), -/***/ "./node_modules/ramda/es/internal/_equals.js": -/*!***************************************************!*\ - !*** ./node_modules/ramda/es/internal/_equals.js ***! - \***************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + function replaceReducer(nextReducer) { + if (typeof nextReducer !== 'function') { + throw new Error( false ? 0 : "Expected the nextReducer to be a function. Instead, received: '" + kindOf(nextReducer)); + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _equals; } -/* harmony export */ }); -/* harmony import */ var _arrayFromIterator_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayFromIterator.js */ "./node_modules/ramda/es/internal/_arrayFromIterator.js"); -/* harmony import */ var _includesWith_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_includesWith.js */ "./node_modules/ramda/es/internal/_includesWith.js"); -/* harmony import */ var _functionName_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_functionName.js */ "./node_modules/ramda/es/internal/_functionName.js"); -/* harmony import */ var _has_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_has.js */ "./node_modules/ramda/es/internal/_has.js"); -/* harmony import */ var _objectIs_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_objectIs.js */ "./node_modules/ramda/es/internal/_objectIs.js"); -/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../keys.js */ "./node_modules/ramda/es/keys.js"); -/* harmony import */ var _type_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../type.js */ "./node_modules/ramda/es/type.js"); + currentReducer = nextReducer; // This action has a similiar effect to ActionTypes.INIT. + // Any reducers that existed in both the new and old rootReducer + // will receive the previous state. This effectively populates + // the new state tree with any relevant data from the old one. + + dispatch({ + type: ActionTypes.REPLACE + }); + } + /** + * Interoperability point for observable/reactive libraries. + * @returns {observable} A minimal observable of state changes. + * For more information, see the observable proposal: + * https://github.com/tc39/proposal-observable + */ + function observable() { + var _ref; + var outerSubscribe = subscribe; + return _ref = { + /** + * The minimal observable subscription method. + * @param {Object} observer Any object that can be used as an observer. + * The observer object should have a `next` method. + * @returns {subscription} An object with an `unsubscribe` method that can + * be used to unsubscribe the observable from the store, and prevent further + * emission of values from the observable. + */ + subscribe: function subscribe(observer) { + if (typeof observer !== 'object' || observer === null) { + throw new Error( false ? 0 : "Expected the observer to be an object. Instead, received: '" + kindOf(observer) + "'"); + } + function observeState() { + if (observer.next) { + observer.next(getState()); + } + } + observeState(); + var unsubscribe = outerSubscribe(observeState); + return { + unsubscribe: unsubscribe + }; + } + }, _ref[$$observable] = function () { + return this; + }, _ref; + } // When a store is created, an "INIT" action is dispatched so that every + // reducer returns their initial state. This effectively populates + // the initial state tree. + dispatch({ + type: ActionTypes.INIT + }); + return _ref2 = { + dispatch: dispatch, + subscribe: subscribe, + getState: getState, + replaceReducer: replaceReducer + }, _ref2[$$observable] = observable, _ref2; +} /** - * private _uniqContentEquals function. - * That function is checking equality of 2 iterator contents with 2 assumptions - * - iterators lengths are the same - * - iterators values are unique + * Creates a Redux store that holds the state tree. * - * false-positive result will be returned for comparison of, e.g. - * - [1,2,3] and [1,2,3,4] - * - [1,1,1] and [1,2,3] - * */ + * **We recommend using `configureStore` from the + * `@reduxjs/toolkit` package**, which replaces `createStore`: + * **https://redux.js.org/introduction/why-rtk-is-redux-today** + * + * The only way to change the data in the store is to call `dispatch()` on it. + * + * There should only be a single store in your app. To specify how different + * parts of the state tree respond to actions, you may combine several reducers + * into a single reducer function by using `combineReducers`. + * + * @param {Function} reducer A function that returns the next state tree, given + * the current state tree and the action to handle. + * + * @param {any} [preloadedState] The initial state. You may optionally specify it + * to hydrate the state from the server in universal apps, or to restore a + * previously serialized user session. + * If you use `combineReducers` to produce the root reducer function, this must be + * an object with the same shape as `combineReducers` keys. + * + * @param {Function} [enhancer] The store enhancer. You may optionally specify it + * to enhance the store with third-party capabilities such as middleware, + * time travel, persistence, etc. The only store enhancer that ships with Redux + * is `applyMiddleware()`. + * + * @returns {Store} A Redux store that lets you read the state, dispatch actions + * and subscribe to changes. + */ -function _uniqContentEquals(aIterator, bIterator, stackA, stackB) { - var a = (0,_arrayFromIterator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(aIterator); - var b = (0,_arrayFromIterator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bIterator); - function eq(_a, _b) { - return _equals(_a, _b, stackA.slice(), stackB.slice()); - } // if *a* array contains any element that is not included in *b* +var legacy_createStore = createStore; - return !(0,_includesWith_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (b, aItem) { - return !(0,_includesWith_js__WEBPACK_IMPORTED_MODULE_1__["default"])(eq, aItem, b); - }, b, a); -} -function _equals(a, b, stackA, stackB) { - if ((0,_objectIs_js__WEBPACK_IMPORTED_MODULE_4__["default"])(a, b)) { - return true; - } - var typeA = (0,_type_js__WEBPACK_IMPORTED_MODULE_6__["default"])(a); - if (typeA !== (0,_type_js__WEBPACK_IMPORTED_MODULE_6__["default"])(b)) { - return false; - } - if (typeof a['fantasy-land/equals'] === 'function' || typeof b['fantasy-land/equals'] === 'function') { - return typeof a['fantasy-land/equals'] === 'function' && a['fantasy-land/equals'](b) && typeof b['fantasy-land/equals'] === 'function' && b['fantasy-land/equals'](a); - } - if (typeof a.equals === 'function' || typeof b.equals === 'function') { - return typeof a.equals === 'function' && a.equals(b) && typeof b.equals === 'function' && b.equals(a); - } - switch (typeA) { - case 'Arguments': - case 'Array': - case 'Object': - if (typeof a.constructor === 'function' && (0,_functionName_js__WEBPACK_IMPORTED_MODULE_2__["default"])(a.constructor) === 'Promise') { - return a === b; - } - break; - case 'Boolean': - case 'Number': - case 'String': - if (!(typeof a === typeof b && (0,_objectIs_js__WEBPACK_IMPORTED_MODULE_4__["default"])(a.valueOf(), b.valueOf()))) { - return false; - } - break; - case 'Date': - if (!(0,_objectIs_js__WEBPACK_IMPORTED_MODULE_4__["default"])(a.valueOf(), b.valueOf())) { - return false; - } - break; - case 'Error': - return a.name === b.name && a.message === b.message; - case 'RegExp': - if (!(a.source === b.source && a.global === b.global && a.ignoreCase === b.ignoreCase && a.multiline === b.multiline && a.sticky === b.sticky && a.unicode === b.unicode)) { - return false; - } - break; - } - var idx = stackA.length - 1; - while (idx >= 0) { - if (stackA[idx] === a) { - return stackB[idx] === b; - } - idx -= 1; - } - switch (typeA) { - case 'Map': - if (a.size !== b.size) { - return false; - } - return _uniqContentEquals(a.entries(), b.entries(), stackA.concat([a]), stackB.concat([b])); - case 'Set': - if (a.size !== b.size) { - return false; - } - return _uniqContentEquals(a.values(), b.values(), stackA.concat([a]), stackB.concat([b])); - case 'Arguments': - case 'Array': - case 'Object': - case 'Boolean': - case 'Number': - case 'String': - case 'Date': - case 'Error': - case 'RegExp': - case 'Int8Array': - case 'Uint8Array': - case 'Uint8ClampedArray': - case 'Int16Array': - case 'Uint16Array': - case 'Int32Array': - case 'Uint32Array': - case 'Float32Array': - case 'Float64Array': - case 'ArrayBuffer': - break; - default: - // Values of other types are only equal if identical. - return false; - } - var keysA = (0,_keys_js__WEBPACK_IMPORTED_MODULE_5__["default"])(a); - if (keysA.length !== (0,_keys_js__WEBPACK_IMPORTED_MODULE_5__["default"])(b).length) { - return false; - } - var extendedStackA = stackA.concat([a]); - var extendedStackB = stackB.concat([b]); - idx = keysA.length - 1; - while (idx >= 0) { - var key = keysA[idx]; - if (!((0,_has_js__WEBPACK_IMPORTED_MODULE_3__["default"])(key, b) && _equals(b[key], a[key], extendedStackA, extendedStackB))) { - return false; - } - idx -= 1; +/** + * Prints a warning in the console if it exists. + * + * @param {String} message The warning message. + * @returns {void} + */ +function warning(message) { + /* eslint-disable no-console */ + if (typeof console !== 'undefined' && typeof console.error === 'function') { + console.error(message); } - return true; + /* eslint-enable no-console */ + + + try { + // This error was thrown as a convenience so that if you enable + // "break on all exceptions" in your console, + // it would pause the execution at this line. + throw new Error(message); + } catch (e) {} // eslint-disable-line no-empty + } -/***/ }), +function getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) { + var reducerKeys = Object.keys(reducers); + var argumentName = action && action.type === ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer'; -/***/ "./node_modules/ramda/es/internal/_filter.js": -/*!***************************************************!*\ - !*** ./node_modules/ramda/es/internal/_filter.js ***! - \***************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + if (reducerKeys.length === 0) { + return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.'; + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _filter; } -/* harmony export */ }); -function _filter(fn, list) { - var idx = 0; - var len = list.length; - var result = []; - while (idx < len) { - if (fn(list[idx])) { - result[result.length] = list[idx]; - } - idx += 1; + if (!isPlainObject(inputState)) { + return "The " + argumentName + " has unexpected type of \"" + kindOf(inputState) + "\". Expected argument to be an object with the following " + ("keys: \"" + reducerKeys.join('", "') + "\""); + } + + var unexpectedKeys = Object.keys(inputState).filter(function (key) { + return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key]; + }); + unexpectedKeys.forEach(function (key) { + unexpectedKeyCache[key] = true; + }); + if (action && action.type === ActionTypes.REPLACE) return; + + if (unexpectedKeys.length > 0) { + return "Unexpected " + (unexpectedKeys.length > 1 ? 'keys' : 'key') + " " + ("\"" + unexpectedKeys.join('", "') + "\" found in " + argumentName + ". ") + "Expected to find one of the known reducer keys instead: " + ("\"" + reducerKeys.join('", "') + "\". Unexpected keys will be ignored."); } - return result; } -/***/ }), +function assertReducerShape(reducers) { + Object.keys(reducers).forEach(function (key) { + var reducer = reducers[key]; + var initialState = reducer(undefined, { + type: ActionTypes.INIT + }); -/***/ "./node_modules/ramda/es/internal/_flatCat.js": -/*!****************************************************!*\ - !*** ./node_modules/ramda/es/internal/_flatCat.js ***! - \****************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + if (typeof initialState === 'undefined') { + throw new Error( false ? 0 : "The slice reducer for key \"" + key + "\" returned undefined during initialization. " + "If the state passed to the reducer is undefined, you must " + "explicitly return the initial state. The initial state may " + "not be undefined. If you don't want to set a value for this reducer, " + "you can use null instead of undefined."); + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _forceReduced_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_forceReduced.js */ "./node_modules/ramda/es/internal/_forceReduced.js"); -/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isArrayLike.js */ "./node_modules/ramda/es/internal/_isArrayLike.js"); -/* harmony import */ var _xArrayReduce_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_xArrayReduce.js */ "./node_modules/ramda/es/internal/_xArrayReduce.js"); -/* harmony import */ var _xReduce_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_xReduce.js */ "./node_modules/ramda/es/internal/_xReduce.js"); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); + if (typeof reducer(undefined, { + type: ActionTypes.PROBE_UNKNOWN_ACTION() + }) === 'undefined') { + throw new Error( false ? 0 : "The slice reducer for key \"" + key + "\" returned undefined when probed with a random type. " + ("Don't try to handle '" + ActionTypes.INIT + "' or other actions in \"redux/*\" ") + "namespace. They are considered private. Instead, you must return the " + "current state for any unknown actions, unless it is undefined, " + "in which case you must return the initial state, regardless of the " + "action type. The initial state may not be undefined, but can be null."); + } + }); +} +/** + * Turns an object whose values are different reducer functions, into a single + * reducer function. It will call every child reducer, and gather their results + * into a single state object, whose keys correspond to the keys of the passed + * reducer functions. + * + * @param {Object} reducers An object whose values correspond to different + * reducer functions that need to be combined into one. One handy way to obtain + * it is to use ES6 `import * as reducers` syntax. The reducers may never return + * undefined for any action. Instead, they should return their initial state + * if the state passed to them was undefined, and the current state for any + * unrecognized action. + * + * @returns {Function} A reducer function that invokes every reducer inside the + * passed object, and builds a state object with the same shape. + */ +function combineReducers(reducers) { + var reducerKeys = Object.keys(reducers); + var finalReducers = {}; + for (var i = 0; i < reducerKeys.length; i++) { + var key = reducerKeys[i]; + if (true) { + if (typeof reducers[key] === 'undefined') { + warning("No reducer provided for key \"" + key + "\""); + } + } -var tInit = '@@transducer/init'; -var tStep = '@@transducer/step'; -var tResult = '@@transducer/result'; -var XPreservingReduced = /*#__PURE__*/ -function () { - function XPreservingReduced(xf) { - this.xf = xf; - } - XPreservingReduced.prototype[tInit] = _xfBase_js__WEBPACK_IMPORTED_MODULE_4__["default"].init; - XPreservingReduced.prototype[tResult] = _xfBase_js__WEBPACK_IMPORTED_MODULE_4__["default"].result; - XPreservingReduced.prototype[tStep] = function (result, input) { - var ret = this.xf[tStep](result, input); - return ret['@@transducer/reduced'] ? (0,_forceReduced_js__WEBPACK_IMPORTED_MODULE_0__["default"])(ret) : ret; - }; - return XPreservingReduced; -}(); -var XFlatCat = /*#__PURE__*/ -function () { - function XFlatCat(xf) { - this.xf = new XPreservingReduced(xf); + if (typeof reducers[key] === 'function') { + finalReducers[key] = reducers[key]; + } } - XFlatCat.prototype[tInit] = _xfBase_js__WEBPACK_IMPORTED_MODULE_4__["default"].init; - XFlatCat.prototype[tResult] = _xfBase_js__WEBPACK_IMPORTED_MODULE_4__["default"].result; - XFlatCat.prototype[tStep] = function (result, input) { - return !(0,_isArrayLike_js__WEBPACK_IMPORTED_MODULE_1__["default"])(input) ? (0,_xArrayReduce_js__WEBPACK_IMPORTED_MODULE_2__["default"])(this.xf, result, [input]) : (0,_xReduce_js__WEBPACK_IMPORTED_MODULE_3__["default"])(this.xf, result, input); - }; - return XFlatCat; -}(); -var _flatCat = function _xcat(xf) { - return new XFlatCat(xf); -}; -/* harmony default export */ __webpack_exports__["default"] = (_flatCat); -/***/ }), + var finalReducerKeys = Object.keys(finalReducers); // This is used to make sure we don't warn about the same + // keys multiple times. -/***/ "./node_modules/ramda/es/internal/_forceReduced.js": -/*!*********************************************************!*\ - !*** ./node_modules/ramda/es/internal/_forceReduced.js ***! - \*********************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + var unexpectedKeyCache; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _forceReduced; } -/* harmony export */ }); -function _forceReduced(x) { - return { - '@@transducer/value': x, - '@@transducer/reduced': true - }; -} + if (true) { + unexpectedKeyCache = {}; + } -/***/ }), + var shapeAssertionError; -/***/ "./node_modules/ramda/es/internal/_functionName.js": -/*!*********************************************************!*\ - !*** ./node_modules/ramda/es/internal/_functionName.js ***! - \*********************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + try { + assertReducerShape(finalReducers); + } catch (e) { + shapeAssertionError = e; + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _functionName; } -/* harmony export */ }); -function _functionName(f) { - // String(x => x) evaluates to "x => x", so the pattern may not match. - var match = String(f).match(/^function (\w*)/); - return match == null ? '' : match[1]; -} + return function combination(state, action) { + if (state === void 0) { + state = {}; + } -/***/ }), + if (shapeAssertionError) { + throw shapeAssertionError; + } -/***/ "./node_modules/ramda/es/internal/_has.js": -/*!************************************************!*\ - !*** ./node_modules/ramda/es/internal/_has.js ***! - \************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + if (true) { + var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _has; } -/* harmony export */ }); -function _has(prop, obj) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} + if (warningMessage) { + warning(warningMessage); + } + } -/***/ }), + var hasChanged = false; + var nextState = {}; -/***/ "./node_modules/ramda/es/internal/_identity.js": -/*!*****************************************************!*\ - !*** ./node_modules/ramda/es/internal/_identity.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + for (var _i = 0; _i < finalReducerKeys.length; _i++) { + var _key = finalReducerKeys[_i]; + var reducer = finalReducers[_key]; + var previousStateForKey = state[_key]; + var nextStateForKey = reducer(previousStateForKey, action); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _identity; } -/* harmony export */ }); -function _identity(x) { - return x; + if (typeof nextStateForKey === 'undefined') { + var actionType = action && action.type; + throw new Error( false ? 0 : "When called with an action of type " + (actionType ? "\"" + String(actionType) + "\"" : '(unknown type)') + ", the slice reducer for key \"" + _key + "\" returned undefined. " + "To ignore an action, you must explicitly return the previous state. " + "If you want this reducer to hold no value, you can return null instead of undefined."); + } + + nextState[_key] = nextStateForKey; + hasChanged = hasChanged || nextStateForKey !== previousStateForKey; + } + + hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length; + return hasChanged ? nextState : state; + }; } -/***/ }), +function bindActionCreator(actionCreator, dispatch) { + return function () { + return dispatch(actionCreator.apply(this, arguments)); + }; +} +/** + * Turns an object whose values are action creators, into an object with the + * same keys, but with every function wrapped into a `dispatch` call so they + * may be invoked directly. This is just a convenience method, as you can call + * `store.dispatch(MyActionCreators.doSomething())` yourself just fine. + * + * For convenience, you can also pass an action creator as the first argument, + * and get a dispatch wrapped function in return. + * + * @param {Function|Object} actionCreators An object whose values are action + * creator functions. One handy way to obtain it is to use ES6 `import * as` + * syntax. You may also pass a single function. + * + * @param {Function} dispatch The `dispatch` function available on your Redux + * store. + * + * @returns {Function|Object} The object mimicking the original object, but with + * every action creator wrapped into the `dispatch` call. If you passed a + * function as `actionCreators`, the return value will also be a single + * function. + */ -/***/ "./node_modules/ramda/es/internal/_includes.js": -/*!*****************************************************!*\ - !*** ./node_modules/ramda/es/internal/_includes.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _includes; } -/* harmony export */ }); -/* harmony import */ var _indexOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_indexOf.js */ "./node_modules/ramda/es/internal/_indexOf.js"); +function bindActionCreators(actionCreators, dispatch) { + if (typeof actionCreators === 'function') { + return bindActionCreator(actionCreators, dispatch); + } -function _includes(a, list) { - return (0,_indexOf_js__WEBPACK_IMPORTED_MODULE_0__["default"])(list, a, 0) >= 0; -} + if (typeof actionCreators !== 'object' || actionCreators === null) { + throw new Error( false ? 0 : "bindActionCreators expected an object or a function, but instead received: '" + kindOf(actionCreators) + "'. " + "Did you write \"import ActionCreators from\" instead of \"import * as ActionCreators from\"?"); + } -/***/ }), + var boundActionCreators = {}; -/***/ "./node_modules/ramda/es/internal/_includesWith.js": -/*!*********************************************************!*\ - !*** ./node_modules/ramda/es/internal/_includesWith.js ***! - \*********************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + for (var key in actionCreators) { + var actionCreator = actionCreators[key]; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _includesWith; } -/* harmony export */ }); -function _includesWith(pred, x, list) { - var idx = 0; - var len = list.length; - while (idx < len) { - if (pred(x, list[idx])) { - return true; + if (typeof actionCreator === 'function') { + boundActionCreators[key] = bindActionCreator(actionCreator, dispatch); } - idx += 1; } - return false; + + return boundActionCreators; } -/***/ }), +/** + * Composes single-argument functions from right to left. The rightmost + * function can take multiple arguments as it provides the signature for + * the resulting composite function. + * + * @param {...Function} funcs The functions to compose. + * @returns {Function} A function obtained by composing the argument functions + * from right to left. For example, compose(f, g, h) is identical to doing + * (...args) => f(g(h(...args))). + */ +function compose() { + for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) { + funcs[_key] = arguments[_key]; + } -/***/ "./node_modules/ramda/es/internal/_indexOf.js": -/*!****************************************************!*\ - !*** ./node_modules/ramda/es/internal/_indexOf.js ***! - \****************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + if (funcs.length === 0) { + return function (arg) { + return arg; + }; + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _indexOf; } -/* harmony export */ }); -/* harmony import */ var _equals_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../equals.js */ "./node_modules/ramda/es/equals.js"); + if (funcs.length === 1) { + return funcs[0]; + } -function _indexOf(list, a, idx) { - var inf, item; // Array.prototype.indexOf doesn't exist below IE9 + return funcs.reduce(function (a, b) { + return function () { + return a(b.apply(void 0, arguments)); + }; + }); +} - if (typeof list.indexOf === 'function') { - switch (typeof a) { - case 'number': - if (a === 0) { - // manually crawl the list to distinguish between +0 and -0 - inf = 1 / a; - while (idx < list.length) { - item = list[idx]; - if (item === 0 && 1 / item === inf) { - return idx; - } - idx += 1; - } - return -1; - } else if (a !== a) { - // NaN - while (idx < list.length) { - item = list[idx]; - if (typeof item === 'number' && item !== item) { - return idx; - } - idx += 1; - } - return -1; - } // non-zero numbers can utilise Set +/** + * Creates a store enhancer that applies middleware to the dispatch method + * of the Redux store. This is handy for a variety of tasks, such as expressing + * asynchronous actions in a concise manner, or logging every action payload. + * + * See `redux-thunk` package as an example of the Redux middleware. + * + * Because middleware is potentially asynchronous, this should be the first + * store enhancer in the composition chain. + * + * Note that each middleware will be given the `dispatch` and `getState` functions + * as named arguments. + * + * @param {...Function} middlewares The middleware chain to be applied. + * @returns {Function} A store enhancer applying the middleware. + */ - return list.indexOf(a, idx); - // all these types can utilise Set +function applyMiddleware() { + for (var _len = arguments.length, middlewares = new Array(_len), _key = 0; _key < _len; _key++) { + middlewares[_key] = arguments[_key]; + } - case 'string': - case 'boolean': - case 'function': - case 'undefined': - return list.indexOf(a, idx); - case 'object': - if (a === null) { - // null can utilise Set - return list.indexOf(a, idx); - } - } - } // anything else not covered above, defer to R.equals + return function (createStore) { + return function () { + var store = createStore.apply(void 0, arguments); - while (idx < list.length) { - if ((0,_equals_js__WEBPACK_IMPORTED_MODULE_0__["default"])(list[idx], a)) { - return idx; - } - idx += 1; - } - return -1; -} + var _dispatch = function dispatch() { + throw new Error( false ? 0 : 'Dispatching while constructing your middleware is not allowed. ' + 'Other middleware would not be applied to this dispatch.'); + }; -/***/ }), + var middlewareAPI = { + getState: store.getState, + dispatch: function dispatch() { + return _dispatch.apply(void 0, arguments); + } + }; + var chain = middlewares.map(function (middleware) { + return middleware(middlewareAPI); + }); + _dispatch = compose.apply(void 0, chain)(store.dispatch); + return (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__["default"])({}, store), {}, { + dispatch: _dispatch + }); + }; + }; +} -/***/ "./node_modules/ramda/es/internal/_isArguments.js": -/*!********************************************************!*\ - !*** ./node_modules/ramda/es/internal/_isArguments.js ***! - \********************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _has_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_has.js */ "./node_modules/ramda/es/internal/_has.js"); -var toString = Object.prototype.toString; -var _isArguments = /*#__PURE__*/ -function () { - return toString.call(arguments) === '[object Arguments]' ? function _isArguments(x) { - return toString.call(x) === '[object Arguments]'; - } : function _isArguments(x) { - return (0,_has_js__WEBPACK_IMPORTED_MODULE_0__["default"])('callee', x); - }; -}(); -/* harmony default export */ __webpack_exports__["default"] = (_isArguments); /***/ }), -/***/ "./node_modules/ramda/es/internal/_isArray.js": -/*!****************************************************!*\ - !*** ./node_modules/ramda/es/internal/_isArray.js ***! - \****************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/simple-swizzle/index.js": +/*!**********************************************!*\ + !*** ./node_modules/simple-swizzle/index.js ***! + \**********************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * Tests whether or not an object is an array. - * - * @private - * @param {*} val The object to test. - * @return {Boolean} `true` if `val` is an array, `false` otherwise. - * @example - * - * _isArray([]); //=> true - * _isArray(null); //=> false - * _isArray({}); //=> false - */ -/* harmony default export */ __webpack_exports__["default"] = (Array.isArray || function _isArray(val) { - return val != null && val.length >= 0 && Object.prototype.toString.call(val) === '[object Array]'; -}); -/***/ }), -/***/ "./node_modules/ramda/es/internal/_isArrayLike.js": -/*!********************************************************!*\ - !*** ./node_modules/ramda/es/internal/_isArrayLike.js ***! - \********************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +var isArrayish = __webpack_require__(/*! is-arrayish */ "./node_modules/simple-swizzle/node_modules/is-arrayish/index.js"); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); -/* harmony import */ var _isString_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_isString.js */ "./node_modules/ramda/es/internal/_isString.js"); +var concat = Array.prototype.concat; +var slice = Array.prototype.slice; +var swizzle = module.exports = function swizzle(args) { + var results = []; + for (var i = 0, len = args.length; i < len; i++) { + var arg = args[i]; -/** - * Tests whether or not an object is similar to an array. - * - * @private - * @category Type - * @category List - * @sig * -> Boolean - * @param {*} x The object to test. - * @return {Boolean} `true` if `x` has a numeric length property and extreme indices defined; `false` otherwise. - * @example - * - * _isArrayLike([]); //=> true - * _isArrayLike(true); //=> false - * _isArrayLike({}); //=> false - * _isArrayLike({length: 10}); //=> false - * _isArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> true - * _isArrayLike({nodeType: 1, length: 1}) // => false - */ + if (isArrayish(arg)) { + // http://jsperf.com/javascript-array-concat-vs-push/98 + results = concat.call(results, slice.call(arg)); + } else { + results.push(arg); + } + } + + return results; +}; + +swizzle.wrap = function (fn) { + return function () { + return fn(swizzle(arguments)); + }; +}; -var _isArrayLike = /*#__PURE__*/ -(0,_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function isArrayLike(x) { - if ((0,_isArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(x)) { - return true; - } - if (!x) { - return false; - } - if (typeof x !== 'object') { - return false; - } - if ((0,_isString_js__WEBPACK_IMPORTED_MODULE_2__["default"])(x)) { - return false; - } - if (x.length === 0) { - return true; - } - if (x.length > 0) { - return x.hasOwnProperty(0) && x.hasOwnProperty(x.length - 1); - } - return false; -}); -/* harmony default export */ __webpack_exports__["default"] = (_isArrayLike); /***/ }), -/***/ "./node_modules/ramda/es/internal/_isFunction.js": -/*!*******************************************************!*\ - !*** ./node_modules/ramda/es/internal/_isFunction.js ***! - \*******************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/simple-swizzle/node_modules/is-arrayish/index.js": +/*!***********************************************************************!*\ + !*** ./node_modules/simple-swizzle/node_modules/is-arrayish/index.js ***! + \***********************************************************************/ +/***/ (function(module) { + +module.exports = function isArrayish(obj) { + if (!obj || typeof obj === 'string') { + return false; + } + + return obj instanceof Array || Array.isArray(obj) || + (obj.length >= 0 && (obj.splice instanceof Function || + (Object.getOwnPropertyDescriptor(obj, (obj.length - 1)) && obj.constructor.name !== 'String'))); +}; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _isFunction; } -/* harmony export */ }); -function _isFunction(x) { - var type = Object.prototype.toString.call(x); - return type === '[object Function]' || type === '[object AsyncFunction]' || type === '[object GeneratorFunction]' || type === '[object AsyncGeneratorFunction]'; -} /***/ }), -/***/ "./node_modules/ramda/es/internal/_isInteger.js": -/*!******************************************************!*\ - !*** ./node_modules/ramda/es/internal/_isInteger.js ***! - \******************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./src/components/core/Toolbar.css": +/*!*****************************************!*\ + !*** ./src/components/core/Toolbar.css ***! + \*****************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/** - * Determine if the passed argument is an integer. - * - * @private - * @param {*} n - * @category Type - * @return {Boolean} - */ -/* harmony default export */ __webpack_exports__["default"] = (Number.isInteger || function _isInteger(n) { - return n << 0 === n; -}); +/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _node_modules_css_loader_dist_cjs_js_Toolbar_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../../node_modules/css-loader/dist/cjs.js!./Toolbar.css */ "./node_modules/css-loader/dist/cjs.js!./src/components/core/Toolbar.css"); -/***/ }), + + + + + + + + + -/***/ "./node_modules/ramda/es/internal/_isNumber.js": -/*!*****************************************************!*\ - !*** ./node_modules/ramda/es/internal/_isNumber.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +var options = {}; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _isNumber; } -/* harmony export */ }); -function _isNumber(x) { - return Object.prototype.toString.call(x) === '[object Number]'; -} +options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); +options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); -/***/ }), + options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); + +options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); +options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); -/***/ "./node_modules/ramda/es/internal/_isObject.js": -/*!*****************************************************!*\ - !*** ./node_modules/ramda/es/internal/_isObject.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_Toolbar_css__WEBPACK_IMPORTED_MODULE_6__["default"], options); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _isObject; } -/* harmony export */ }); -function _isObject(x) { - return Object.prototype.toString.call(x) === '[object Object]'; -} -/***/ }), -/***/ "./node_modules/ramda/es/internal/_isPlaceholder.js": -/*!**********************************************************!*\ - !*** ./node_modules/ramda/es/internal/_isPlaceholder.js ***! - \**********************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _isPlaceholder; } -/* harmony export */ }); -function _isPlaceholder(a) { - return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true; -} + /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_Toolbar_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_Toolbar_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_Toolbar_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); + /***/ }), -/***/ "./node_modules/ramda/es/internal/_isRegExp.js": -/*!*****************************************************!*\ - !*** ./node_modules/ramda/es/internal/_isRegExp.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./src/components/error/CallbackGraph/CallbackGraphContainer.css": +/*!***********************************************************************!*\ + !*** ./src/components/error/CallbackGraph/CallbackGraphContainer.css ***! + \***********************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _isRegExp; } -/* harmony export */ }); -function _isRegExp(x) { - return Object.prototype.toString.call(x) === '[object RegExp]'; -} +/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _node_modules_css_loader_dist_cjs_js_CallbackGraphContainer_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../../../node_modules/css-loader/dist/cjs.js!./CallbackGraphContainer.css */ "./node_modules/css-loader/dist/cjs.js!./src/components/error/CallbackGraph/CallbackGraphContainer.css"); -/***/ }), + + + + + + + + + -/***/ "./node_modules/ramda/es/internal/_isString.js": -/*!*****************************************************!*\ - !*** ./node_modules/ramda/es/internal/_isString.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +var options = {}; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _isString; } -/* harmony export */ }); -function _isString(x) { - return Object.prototype.toString.call(x) === '[object String]'; -} +options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); +options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); -/***/ }), + options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); + +options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); +options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); -/***/ "./node_modules/ramda/es/internal/_isTransformer.js": -/*!**********************************************************!*\ - !*** ./node_modules/ramda/es/internal/_isTransformer.js ***! - \**********************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_CallbackGraphContainer_css__WEBPACK_IMPORTED_MODULE_6__["default"], options); + + + + + /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_CallbackGraphContainer_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_CallbackGraphContainer_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_CallbackGraphContainer_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _isTransformer; } -/* harmony export */ }); -function _isTransformer(obj) { - return obj != null && typeof obj['@@transducer/step'] === 'function'; -} /***/ }), -/***/ "./node_modules/ramda/es/internal/_isTypedArray.js": +/***/ "./src/components/error/FrontEnd/FrontEndError.css": /*!*********************************************************!*\ - !*** ./node_modules/ramda/es/internal/_isTypedArray.js ***! + !*** ./src/components/error/FrontEnd/FrontEndError.css ***! \*********************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _isTypedArray; } -/* harmony export */ }); -/** - * Tests whether or not an object is a typed array. - * - * @private - * @param {*} val The object to test. - * @return {Boolean} `true` if `val` is a typed array, `false` otherwise. - * @example - * - * _isTypedArray(new Uint8Array([])); //=> true - * _isTypedArray(new Float32Array([])); //=> true - * _isTypedArray([]); //=> false - * _isTypedArray(null); //=> false - * _isTypedArray({}); //=> false - */ -function _isTypedArray(val) { - var type = Object.prototype.toString.call(val); - return type === '[object Uint8ClampedArray]' || type === '[object Int8Array]' || type === '[object Uint8Array]' || type === '[object Int16Array]' || type === '[object Uint16Array]' || type === '[object Int32Array]' || type === '[object Uint32Array]' || type === '[object Float32Array]' || type === '[object Float64Array]' || type === '[object BigInt64Array]' || type === '[object BigUint64Array]'; -} +/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _node_modules_css_loader_dist_cjs_js_FrontEndError_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../../../node_modules/css-loader/dist/cjs.js!./FrontEndError.css */ "./node_modules/css-loader/dist/cjs.js!./src/components/error/FrontEnd/FrontEndError.css"); + + + + + + + + + + + +var options = {}; + +options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); +options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); + + options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); + +options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); +options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); + +var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_FrontEndError_css__WEBPACK_IMPORTED_MODULE_6__["default"], options); + + + + + /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_FrontEndError_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_FrontEndError_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_FrontEndError_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); + /***/ }), -/***/ "./node_modules/ramda/es/internal/_makeFlat.js": +/***/ "./src/components/error/GlobalErrorOverlay.css": /*!*****************************************************!*\ - !*** ./node_modules/ramda/es/internal/_makeFlat.js ***! + !*** ./src/components/error/GlobalErrorOverlay.css ***! \*****************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _makeFlat; } -/* harmony export */ }); -/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArrayLike.js */ "./node_modules/ramda/es/internal/_isArrayLike.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _node_modules_css_loader_dist_cjs_js_GlobalErrorOverlay_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../../node_modules/css-loader/dist/cjs.js!./GlobalErrorOverlay.css */ "./node_modules/css-loader/dist/cjs.js!./src/components/error/GlobalErrorOverlay.css"); -/** - * `_makeFlat` is a helper function that returns a one-level or fully recursive - * function based on the flag passed in. - * - * @private - */ + + + + + + + + + -function _makeFlat(recursive) { - return function flatt(list) { - var value, jlen, j; - var result = []; - var idx = 0; - var ilen = list.length; - while (idx < ilen) { - if ((0,_isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__["default"])(list[idx])) { - value = recursive ? flatt(list[idx]) : list[idx]; - j = 0; - jlen = value.length; - while (j < jlen) { - result[result.length] = value[j]; - j += 1; - } - } else { - result[result.length] = list[idx]; - } - idx += 1; - } - return result; - }; -} +var options = {}; -/***/ }), +options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); +options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); + + options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); + +options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); +options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); + +var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_GlobalErrorOverlay_css__WEBPACK_IMPORTED_MODULE_6__["default"], options); -/***/ "./node_modules/ramda/es/internal/_map.js": -/*!************************************************!*\ - !*** ./node_modules/ramda/es/internal/_map.js ***! - \************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _map; } -/* harmony export */ }); -function _map(fn, functor) { - var idx = 0; - var len = functor.length; - var result = Array(len); - while (idx < len) { - result[idx] = fn(functor[idx]); - idx += 1; - } - return result; -} + + + /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_GlobalErrorOverlay_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_GlobalErrorOverlay_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_GlobalErrorOverlay_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); + /***/ }), -/***/ "./node_modules/ramda/es/internal/_modify.js": -/*!***************************************************!*\ - !*** ./node_modules/ramda/es/internal/_modify.js ***! - \***************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./src/components/error/Percy.css": +/*!****************************************!*\ + !*** ./src/components/error/Percy.css ***! + \****************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _modify; } -/* harmony export */ }); -/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); -/* harmony import */ var _isInteger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isInteger.js */ "./node_modules/ramda/es/internal/_isInteger.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _node_modules_css_loader_dist_cjs_js_Percy_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../../node_modules/css-loader/dist/cjs.js!./Percy.css */ "./node_modules/css-loader/dist/cjs.js!./src/components/error/Percy.css"); + + + + + + + + + -/** - * Makes a shallow clone of an object, applying the given fn to the specified - * property with the given value. Note that this copies and flattens prototype - * properties onto the new object as well. All non-primitive properties are - * copied by reference. - * - * @private - * @param {String|Number} prop The property name to set - * @param {Function} fn The function to apply to the property - * @param {Object|Array} obj The object to clone - * @return {Object|Array} A new object equivalent to the original except for the changed property. - */ +var options = {}; -function _modify(prop, fn, obj) { - if ((0,_isInteger_js__WEBPACK_IMPORTED_MODULE_1__["default"])(prop) && (0,_isArray_js__WEBPACK_IMPORTED_MODULE_0__["default"])(obj)) { - var arr = [].concat(obj); - arr[prop] = fn(arr[prop]); - return arr; - } - var result = {}; - for (var p in obj) { - result[p] = obj[p]; - } - result[prop] = fn(result[prop]); - return result; -} +options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); +options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); -/***/ }), + options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); + +options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); +options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); -/***/ "./node_modules/ramda/es/internal/_objectAssign.js": -/*!*********************************************************!*\ - !*** ./node_modules/ramda/es/internal/_objectAssign.js ***! - \*********************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_Percy_css__WEBPACK_IMPORTED_MODULE_6__["default"], options); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _has_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_has.js */ "./node_modules/ramda/es/internal/_has.js"); - // Based on https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign -function _objectAssign(target) { - if (target == null) { - throw new TypeError('Cannot convert undefined or null to object'); - } - var output = Object(target); - var idx = 1; - var length = arguments.length; - while (idx < length) { - var source = arguments[idx]; - if (source != null) { - for (var nextKey in source) { - if ((0,_has_js__WEBPACK_IMPORTED_MODULE_0__["default"])(nextKey, source)) { - output[nextKey] = source[nextKey]; - } - } - } - idx += 1; - } - return output; -} -/* harmony default export */ __webpack_exports__["default"] = (typeof Object.assign === 'function' ? Object.assign : _objectAssign); -/***/ }), -/***/ "./node_modules/ramda/es/internal/_objectIs.js": -/*!*****************************************************!*\ - !*** ./node_modules/ramda/es/internal/_objectIs.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_Percy_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_Percy_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_Percy_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); -"use strict"; -__webpack_require__.r(__webpack_exports__); -// Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is -function _objectIs(a, b) { - // SameValue algorithm - if (a === b) { - // Steps 1-5, 7-10 - // Steps 6.b-6.e: +0 != -0 - return a !== 0 || 1 / a === 1 / b; - } else { - // Step 6.a: NaN == NaN - return a !== a && b !== b; - } -} -/* harmony default export */ __webpack_exports__["default"] = (typeof Object.is === 'function' ? Object.is : _objectIs); /***/ }), -/***/ "./node_modules/ramda/es/internal/_pipe.js": +/***/ "./src/components/error/menu/DebugMenu.css": /*!*************************************************!*\ - !*** ./node_modules/ramda/es/internal/_pipe.js ***! + !*** ./src/components/error/menu/DebugMenu.css ***! \*************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _pipe; } -/* harmony export */ }); -function _pipe(f, g) { - return function () { - return g.call(this, f.apply(this, arguments)); - }; -} +/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); +/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _node_modules_css_loader_dist_cjs_js_DebugMenu_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../../../node_modules/css-loader/dist/cjs.js!./DebugMenu.css */ "./node_modules/css-loader/dist/cjs.js!./src/components/error/menu/DebugMenu.css"); -/***/ }), + + + + + + + + + -/***/ "./node_modules/ramda/es/internal/_promap.js": -/*!***************************************************!*\ - !*** ./node_modules/ramda/es/internal/_promap.js ***! - \***************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +var options = {}; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _promap; } -/* harmony export */ }); -function _promap(f, g, profunctor) { - return function (x) { - return g(profunctor(f(x))); - }; -} +options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); +options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); + + options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); + +options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); +options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); + +var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_DebugMenu_css__WEBPACK_IMPORTED_MODULE_6__["default"], options); -/***/ }), -/***/ "./node_modules/ramda/es/internal/_quote.js": -/*!**************************************************!*\ - !*** ./node_modules/ramda/es/internal/_quote.js ***! - \**************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _quote; } -/* harmony export */ }); -function _quote(s) { - var escaped = s.replace(/\\/g, '\\\\').replace(/[\b]/g, '\\b') // \b matches word boundary; [\b] matches backspace - .replace(/\f/g, '\\f').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\t/g, '\\t').replace(/\v/g, '\\v').replace(/\0/g, '\\0'); - return '"' + escaped.replace(/"/g, '\\"') + '"'; -} + + /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_DebugMenu_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_DebugMenu_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_DebugMenu_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); + /***/ }), -/***/ "./node_modules/ramda/es/internal/_reduce.js": -/*!***************************************************!*\ - !*** ./node_modules/ramda/es/internal/_reduce.js ***! - \***************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js": +/*!****************************************************************************!*\ + !*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***! + \****************************************************************************/ +/***/ (function(module) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _arrayReduce_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayReduce.js */ "./node_modules/ramda/es/internal/_arrayReduce.js"); -/* harmony import */ var _createReduce_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_createReduce.js */ "./node_modules/ramda/es/internal/_createReduce.js"); -function _iterableReduce(reducer, acc, iter) { - var step = iter.next(); - while (!step.done) { - acc = reducer(acc, step.value); - step = iter.next(); +var stylesInDOM = []; +function getIndexByIdentifier(identifier) { + var result = -1; + for (var i = 0; i < stylesInDOM.length; i++) { + if (stylesInDOM[i].identifier === identifier) { + result = i; + break; + } } - return acc; + return result; } -function _methodReduce(reducer, acc, obj, methodName) { - return obj[methodName](reducer, acc); +function modulesToDom(list, options) { + var idCountMap = {}; + var identifiers = []; + for (var i = 0; i < list.length; i++) { + var item = list[i]; + var id = options.base ? item[0] + options.base : item[0]; + var count = idCountMap[id] || 0; + var identifier = "".concat(id, " ").concat(count); + idCountMap[id] = count + 1; + var indexByIdentifier = getIndexByIdentifier(identifier); + var obj = { + css: item[1], + media: item[2], + sourceMap: item[3], + supports: item[4], + layer: item[5] + }; + if (indexByIdentifier !== -1) { + stylesInDOM[indexByIdentifier].references++; + stylesInDOM[indexByIdentifier].updater(obj); + } else { + var updater = addElementStyle(obj, options); + options.byIndex = i; + stylesInDOM.splice(i, 0, { + identifier: identifier, + updater: updater, + references: 1 + }); + } + identifiers.push(identifier); + } + return identifiers; } -var _reduce = /*#__PURE__*/ -(0,_createReduce_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_arrayReduce_js__WEBPACK_IMPORTED_MODULE_0__["default"], _methodReduce, _iterableReduce); -/* harmony default export */ __webpack_exports__["default"] = (_reduce); - -/***/ }), - -/***/ "./node_modules/ramda/es/internal/_reduced.js": -/*!****************************************************!*\ - !*** ./node_modules/ramda/es/internal/_reduced.js ***! - \****************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _reduced; } -/* harmony export */ }); -function _reduced(x) { - return x && x['@@transducer/reduced'] ? x : { - '@@transducer/value': x, - '@@transducer/reduced': true +function addElementStyle(obj, options) { + var api = options.domAPI(options); + api.update(obj); + var updater = function updater(newObj) { + if (newObj) { + if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) { + return; + } + api.update(obj = newObj); + } else { + api.remove(); + } }; + return updater; } +module.exports = function (list, options) { + options = options || {}; + list = list || []; + var lastIdentifiers = modulesToDom(list, options); + return function update(newList) { + newList = newList || []; + for (var i = 0; i < lastIdentifiers.length; i++) { + var identifier = lastIdentifiers[i]; + var index = getIndexByIdentifier(identifier); + stylesInDOM[index].references--; + } + var newLastIdentifiers = modulesToDom(newList, options); + for (var _i = 0; _i < lastIdentifiers.length; _i++) { + var _identifier = lastIdentifiers[_i]; + var _index = getIndexByIdentifier(_identifier); + if (stylesInDOM[_index].references === 0) { + stylesInDOM[_index].updater(); + stylesInDOM.splice(_index, 1); + } + } + lastIdentifiers = newLastIdentifiers; + }; +}; /***/ }), -/***/ "./node_modules/ramda/es/internal/_stepCat.js": -/*!****************************************************!*\ - !*** ./node_modules/ramda/es/internal/_stepCat.js ***! - \****************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/style-loader/dist/runtime/insertBySelector.js": +/*!********************************************************************!*\ + !*** ./node_modules/style-loader/dist/runtime/insertBySelector.js ***! + \********************************************************************/ +/***/ (function(module) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _stepCat; } -/* harmony export */ }); -/* harmony import */ var _objectAssign_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_objectAssign.js */ "./node_modules/ramda/es/internal/_objectAssign.js"); -/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_identity.js */ "./node_modules/ramda/es/internal/_identity.js"); -/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_isArrayLike.js */ "./node_modules/ramda/es/internal/_isArrayLike.js"); -/* harmony import */ var _isTransformer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_isTransformer.js */ "./node_modules/ramda/es/internal/_isTransformer.js"); -/* harmony import */ var _objOf_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../objOf.js */ "./node_modules/ramda/es/objOf.js"); - +var memo = {}; +/* istanbul ignore next */ +function getTarget(target) { + if (typeof memo[target] === "undefined") { + var styleTarget = document.querySelector(target); -var _stepCatArray = { - '@@transducer/init': Array, - '@@transducer/step': function transducerStep(xs, x) { - xs.push(x); - return xs; - }, - '@@transducer/result': _identity_js__WEBPACK_IMPORTED_MODULE_1__["default"] -}; -var _stepCatString = { - '@@transducer/init': String, - '@@transducer/step': function transducerStep(a, b) { - return a + b; - }, - '@@transducer/result': _identity_js__WEBPACK_IMPORTED_MODULE_1__["default"] -}; -var _stepCatObject = { - '@@transducer/init': Object, - '@@transducer/step': function transducerStep(result, input) { - return (0,_objectAssign_js__WEBPACK_IMPORTED_MODULE_0__["default"])(result, (0,_isArrayLike_js__WEBPACK_IMPORTED_MODULE_2__["default"])(input) ? (0,_objOf_js__WEBPACK_IMPORTED_MODULE_4__["default"])(input[0], input[1]) : input); - }, - '@@transducer/result': _identity_js__WEBPACK_IMPORTED_MODULE_1__["default"] -}; -function _stepCat(obj) { - if ((0,_isTransformer_js__WEBPACK_IMPORTED_MODULE_3__["default"])(obj)) { - return obj; - } - if ((0,_isArrayLike_js__WEBPACK_IMPORTED_MODULE_2__["default"])(obj)) { - return _stepCatArray; - } - if (typeof obj === 'string') { - return _stepCatString; + // Special case to return head of iframe instead of iframe itself + if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) { + try { + // This will throw an exception if access to iframe is blocked + // due to cross-origin restrictions + styleTarget = styleTarget.contentDocument.head; + } catch (e) { + // istanbul ignore next + styleTarget = null; + } + } + memo[target] = styleTarget; } - if (typeof obj === 'object') { - return _stepCatObject; + return memo[target]; +} + +/* istanbul ignore next */ +function insertBySelector(insert, style) { + var target = getTarget(insert); + if (!target) { + throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid."); } - throw new Error('Cannot create transformer for ' + obj); + target.appendChild(style); } +module.exports = insertBySelector; /***/ }), -/***/ "./node_modules/ramda/es/internal/_toISOString.js": -/*!********************************************************!*\ - !*** ./node_modules/ramda/es/internal/_toISOString.js ***! - \********************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/style-loader/dist/runtime/insertStyleElement.js": +/*!**********************************************************************!*\ + !*** ./node_modules/style-loader/dist/runtime/insertStyleElement.js ***! + \**********************************************************************/ +/***/ (function(module) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * Polyfill from . - */ -var pad = function pad(n) { - return (n < 10 ? '0' : '') + n; -}; -var _toISOString = typeof Date.prototype.toISOString === 'function' ? function _toISOString(d) { - return d.toISOString(); -} : function _toISOString(d) { - return d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate()) + 'T' + pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()) + ':' + pad(d.getUTCSeconds()) + '.' + (d.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) + 'Z'; -}; -/* harmony default export */ __webpack_exports__["default"] = (_toISOString); + + +/* istanbul ignore next */ +function insertStyleElement(options) { + var element = document.createElement("style"); + options.setAttributes(element, options.attributes); + options.insert(element, options.options); + return element; +} +module.exports = insertStyleElement; /***/ }), -/***/ "./node_modules/ramda/es/internal/_toString.js": -/*!*****************************************************!*\ - !*** ./node_modules/ramda/es/internal/_toString.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js ***! + \**********************************************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _toString; } -/* harmony export */ }); -/* harmony import */ var _includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_includes.js */ "./node_modules/ramda/es/internal/_includes.js"); -/* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_map.js */ "./node_modules/ramda/es/internal/_map.js"); -/* harmony import */ var _quote_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_quote.js */ "./node_modules/ramda/es/internal/_quote.js"); -/* harmony import */ var _toISOString_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_toISOString.js */ "./node_modules/ramda/es/internal/_toISOString.js"); -/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../keys.js */ "./node_modules/ramda/es/keys.js"); -/* harmony import */ var _reject_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../reject.js */ "./node_modules/ramda/es/reject.js"); +/* istanbul ignore next */ +function setAttributesWithoutAttributes(styleElement) { + var nonce = true ? __webpack_require__.nc : 0; + if (nonce) { + styleElement.setAttribute("nonce", nonce); + } +} +module.exports = setAttributesWithoutAttributes; +/***/ }), +/***/ "./node_modules/style-loader/dist/runtime/styleDomAPI.js": +/*!***************************************************************!*\ + !*** ./node_modules/style-loader/dist/runtime/styleDomAPI.js ***! + \***************************************************************/ +/***/ (function(module) { +"use strict"; -function _toString(x, seen) { - var recur = function recur(y) { - var xs = seen.concat([x]); - return (0,_includes_js__WEBPACK_IMPORTED_MODULE_0__["default"])(y, xs) ? '' : _toString(y, xs); - }; // mapPairs :: (Object, [String]) -> [String] - var mapPairs = function mapPairs(obj, keys) { - return (0,_map_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (k) { - return (0,_quote_js__WEBPACK_IMPORTED_MODULE_2__["default"])(k) + ': ' + recur(obj[k]); - }, keys.slice().sort()); - }; - switch (Object.prototype.toString.call(x)) { - case '[object Arguments]': - return '(function() { return arguments; }(' + (0,_map_js__WEBPACK_IMPORTED_MODULE_1__["default"])(recur, x).join(', ') + '))'; - case '[object Array]': - return '[' + (0,_map_js__WEBPACK_IMPORTED_MODULE_1__["default"])(recur, x).concat(mapPairs(x, (0,_reject_js__WEBPACK_IMPORTED_MODULE_5__["default"])(function (k) { - return /^\d+$/.test(k); - }, (0,_keys_js__WEBPACK_IMPORTED_MODULE_4__["default"])(x)))).join(', ') + ']'; - case '[object Boolean]': - return typeof x === 'object' ? 'new Boolean(' + recur(x.valueOf()) + ')' : x.toString(); - case '[object Date]': - return 'new Date(' + (isNaN(x.valueOf()) ? recur(NaN) : (0,_quote_js__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_toISOString_js__WEBPACK_IMPORTED_MODULE_3__["default"])(x))) + ')'; - case '[object Map]': - return 'new Map(' + recur(Array.from(x)) + ')'; - case '[object Null]': - return 'null'; - case '[object Number]': - return typeof x === 'object' ? 'new Number(' + recur(x.valueOf()) + ')' : 1 / x === -Infinity ? '-0' : x.toString(10); - case '[object Set]': - return 'new Set(' + recur(Array.from(x).sort()) + ')'; - case '[object String]': - return typeof x === 'object' ? 'new String(' + recur(x.valueOf()) + ')' : (0,_quote_js__WEBPACK_IMPORTED_MODULE_2__["default"])(x); - case '[object Undefined]': - return 'undefined'; - default: - if (typeof x.toString === 'function') { - var repr = x.toString(); - if (repr !== '[object Object]') { - return repr; - } - } - return '{' + mapPairs(x, (0,_keys_js__WEBPACK_IMPORTED_MODULE_4__["default"])(x)).join(', ') + '}'; +/* istanbul ignore next */ +function apply(styleElement, options, obj) { + var css = ""; + if (obj.supports) { + css += "@supports (".concat(obj.supports, ") {"); + } + if (obj.media) { + css += "@media ".concat(obj.media, " {"); + } + var needLayer = typeof obj.layer !== "undefined"; + if (needLayer) { + css += "@layer".concat(obj.layer.length > 0 ? " ".concat(obj.layer) : "", " {"); + } + css += obj.css; + if (needLayer) { + css += "}"; + } + if (obj.media) { + css += "}"; + } + if (obj.supports) { + css += "}"; + } + var sourceMap = obj.sourceMap; + if (sourceMap && typeof btoa !== "undefined") { + css += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */"); } -} - -/***/ }), -/***/ "./node_modules/ramda/es/internal/_xArrayReduce.js": -/*!*********************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xArrayReduce.js ***! - \*********************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + // For old IE + /* istanbul ignore if */ + options.styleTagTransform(css, styleElement, options.options); +} +function removeStyleElement(styleElement) { + // istanbul ignore if + if (styleElement.parentNode === null) { + return false; + } + styleElement.parentNode.removeChild(styleElement); +} -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xArrayReduce; } -/* harmony export */ }); -function _xArrayReduce(xf, acc, list) { - var idx = 0; - var len = list.length; - while (idx < len) { - acc = xf['@@transducer/step'](acc, list[idx]); - if (acc && acc['@@transducer/reduced']) { - acc = acc['@@transducer/value']; - break; - } - idx += 1; +/* istanbul ignore next */ +function domAPI(options) { + if (typeof document === "undefined") { + return { + update: function update() {}, + remove: function remove() {} + }; } - return xf['@@transducer/result'](acc); + var styleElement = options.insertStyleElement(options); + return { + update: function update(obj) { + apply(styleElement, options, obj); + }, + remove: function remove() { + removeStyleElement(styleElement); + } + }; } +module.exports = domAPI; /***/ }), -/***/ "./node_modules/ramda/es/internal/_xReduce.js": -/*!****************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xReduce.js ***! - \****************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/style-loader/dist/runtime/styleTagTransform.js": +/*!*********************************************************************!*\ + !*** ./node_modules/style-loader/dist/runtime/styleTagTransform.js ***! + \*********************************************************************/ +/***/ (function(module) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _createReduce_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_createReduce.js */ "./node_modules/ramda/es/internal/_createReduce.js"); -/* harmony import */ var _xArrayReduce_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_xArrayReduce.js */ "./node_modules/ramda/es/internal/_xArrayReduce.js"); -/* harmony import */ var _bind_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../bind.js */ "./node_modules/ramda/es/bind.js"); - -function _xIterableReduce(xf, acc, iter) { - var step = iter.next(); - while (!step.done) { - acc = xf['@@transducer/step'](acc, step.value); - if (acc && acc['@@transducer/reduced']) { - acc = acc['@@transducer/value']; - break; +/* istanbul ignore next */ +function styleTagTransform(css, styleElement) { + if (styleElement.styleSheet) { + styleElement.styleSheet.cssText = css; + } else { + while (styleElement.firstChild) { + styleElement.removeChild(styleElement.firstChild); } - step = iter.next(); + styleElement.appendChild(document.createTextNode(css)); } - return xf['@@transducer/result'](acc); -} -function _xMethodReduce(xf, acc, obj, methodName) { - return xf['@@transducer/result'](obj[methodName]((0,_bind_js__WEBPACK_IMPORTED_MODULE_2__["default"])(xf['@@transducer/step'], xf), acc)); } -var _xReduce = /*#__PURE__*/ -(0,_createReduce_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_xArrayReduce_js__WEBPACK_IMPORTED_MODULE_1__["default"], _xMethodReduce, _xIterableReduce); -/* harmony default export */ __webpack_exports__["default"] = (_xReduce); +module.exports = styleTagTransform; /***/ }), -/***/ "./node_modules/ramda/es/internal/_xall.js": -/*!*************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xall.js ***! - \*************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js": +/*!**********************************************************************************************!*\ + !*** ./node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js ***! + \**********************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xall; } -/* harmony export */ }); -/* harmony import */ var _reduced_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_reduced.js */ "./node_modules/ramda/es/internal/_reduced.js"); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); +/** + * @license React + * use-sync-external-store-shim.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ -var XAll = /*#__PURE__*/ -function () { - function XAll(f, xf) { - this.xf = xf; - this.f = f; - this.all = true; - } - XAll.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_1__["default"].init; - XAll.prototype['@@transducer/result'] = function (result) { - if (this.all) { - result = this.xf['@@transducer/step'](result, true); - } - return this.xf['@@transducer/result'](result); - }; - XAll.prototype['@@transducer/step'] = function (result, input) { - if (!this.f(input)) { - this.all = false; - result = (0,_reduced_js__WEBPACK_IMPORTED_MODULE_0__["default"])(this.xf['@@transducer/step'](result, false)); - } - return result; - }; - return XAll; -}(); -function _xall(f) { - return function (xf) { - return new XAll(f, xf); - }; -} -/***/ }), +if (true) { + (function() { -/***/ "./node_modules/ramda/es/internal/_xany.js": -/*!*************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xany.js ***! - \*************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + 'use strict'; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xany; } -/* harmony export */ }); -/* harmony import */ var _reduced_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_reduced.js */ "./node_modules/ramda/es/internal/_reduced.js"); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); +/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ +if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === + 'function' +) { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); +} + var React = __webpack_require__(/*! react */ "react"); +var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; -var XAny = /*#__PURE__*/ -function () { - function XAny(f, xf) { - this.xf = xf; - this.f = f; - this.any = false; - } - XAny.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_1__["default"].init; - XAny.prototype['@@transducer/result'] = function (result) { - if (!this.any) { - result = this.xf['@@transducer/step'](result, false); - } - return this.xf['@@transducer/result'](result); - }; - XAny.prototype['@@transducer/step'] = function (result, input) { - if (this.f(input)) { - this.any = true; - result = (0,_reduced_js__WEBPACK_IMPORTED_MODULE_0__["default"])(this.xf['@@transducer/step'](result, true)); +function error(format) { + { + { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + + printWarning('error', format, args); } - return result; - }; - return XAny; -}(); -function _xany(f) { - return function (xf) { - return new XAny(f, xf); - }; + } } -/***/ }), - -/***/ "./node_modules/ramda/es/internal/_xaperture.js": -/*!******************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xaperture.js ***! - \******************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +function printWarning(level, format, args) { + // When changing this logic, you might want to also + // update consoleWithStackDev.www.js as well. + { + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame.getStackAddendum(); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xaperture; } -/* harmony export */ }); -/* harmony import */ var _concat_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_concat.js */ "./node_modules/ramda/es/internal/_concat.js"); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); + if (stack !== '') { + format += '%s'; + args = args.concat([stack]); + } // eslint-disable-next-line react-internal/safe-string-coercion -var XAperture = /*#__PURE__*/ -function () { - function XAperture(n, xf) { - this.xf = xf; - this.pos = 0; - this.full = false; - this.acc = new Array(n); + var argsWithFormat = args.map(function (item) { + return String(item); + }); // Careful: RN currently depends on this prefix + + argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it + // breaks IE9: https://github.com/facebook/react/issues/13610 + // eslint-disable-next-line react-internal/no-production-logging + + Function.prototype.apply.call(console[level], console, argsWithFormat); } - XAperture.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_1__["default"].init; - XAperture.prototype['@@transducer/result'] = function (result) { - this.acc = null; - return this.xf['@@transducer/result'](result); - }; - XAperture.prototype['@@transducer/step'] = function (result, input) { - this.store(input); - return this.full ? this.xf['@@transducer/step'](result, this.getCopy()) : result; - }; - XAperture.prototype.store = function (input) { - this.acc[this.pos] = input; - this.pos += 1; - if (this.pos === this.acc.length) { - this.pos = 0; - this.full = true; - } - }; - XAperture.prototype.getCopy = function () { - return (0,_concat_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Array.prototype.slice.call(this.acc, this.pos), Array.prototype.slice.call(this.acc, 0, this.pos)); - }; - return XAperture; -}(); -function _xaperture(n) { - return function (xf) { - return new XAperture(n, xf); - }; } -/***/ }), +/** + * inlined Object.is polyfill to avoid requiring consumers ship their own + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is + */ +function is(x, y) { + return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare + ; +} -/***/ "./node_modules/ramda/es/internal/_xchain.js": -/*!***************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xchain.js ***! - \***************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +var objectIs = typeof Object.is === 'function' ? Object.is : is; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xchain; } -/* harmony export */ }); -/* harmony import */ var _flatCat_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_flatCat.js */ "./node_modules/ramda/es/internal/_flatCat.js"); -/* harmony import */ var _xmap_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_xmap.js */ "./node_modules/ramda/es/internal/_xmap.js"); +// dispatch for CommonJS interop named imports. +var useState = React.useState, + useEffect = React.useEffect, + useLayoutEffect = React.useLayoutEffect, + useDebugValue = React.useDebugValue; +var didWarnOld18Alpha = false; +var didWarnUncachedGetSnapshot = false; // Disclaimer: This shim breaks many of the rules of React, and only works +// because of a very particular set of implementation details and assumptions +// -- change any one of them and it will break. The most important assumption +// is that updates are always synchronous, because concurrent rendering is +// only available in versions of React that also have a built-in +// useSyncExternalStore API. And we only use this shim when the built-in API +// does not exist. +// +// Do not assume that the clever hacks used by this hook also work in general. +// The point of this shim is to replace the need for hacks by other libraries. -function _xchain(f) { - return function (xf) { - return (0,_xmap_js__WEBPACK_IMPORTED_MODULE_1__["default"])(f)((0,_flatCat_js__WEBPACK_IMPORTED_MODULE_0__["default"])(xf)); - }; -} +function useSyncExternalStore(subscribe, getSnapshot, // Note: The shim does not use getServerSnapshot, because pre-18 versions of +// React do not expose a way to check if we're hydrating. So users of the shim +// will need to track that themselves and return the correct value +// from `getSnapshot`. +getServerSnapshot) { + { + if (!didWarnOld18Alpha) { + if (React.startTransition !== undefined) { + didWarnOld18Alpha = true; -/***/ }), + error('You are using an outdated, pre-release alpha of React 18 that ' + 'does not support useSyncExternalStore. The ' + 'use-sync-external-store shim will not work correctly. Upgrade ' + 'to a newer pre-release.'); + } + } + } // Read the current snapshot from the store on every render. Again, this + // breaks the rules of React, and only works here because of specific + // implementation details, most importantly that updates are + // always synchronous. -/***/ "./node_modules/ramda/es/internal/_xdrop.js": -/*!**************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xdrop.js ***! - \**************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xdrop; } -/* harmony export */ }); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); + var value = getSnapshot(); -var XDrop = /*#__PURE__*/ -function () { - function XDrop(n, xf) { - this.xf = xf; - this.n = n; - } - XDrop.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].init; - XDrop.prototype['@@transducer/result'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].result; - XDrop.prototype['@@transducer/step'] = function (result, input) { - if (this.n > 0) { - this.n -= 1; - return result; - } - return this.xf['@@transducer/step'](result, input); - }; - return XDrop; -}(); -function _xdrop(n) { - return function (xf) { - return new XDrop(n, xf); - }; -} + { + if (!didWarnUncachedGetSnapshot) { + var cachedValue = getSnapshot(); -/***/ }), + if (!objectIs(value, cachedValue)) { + error('The result of getSnapshot should be cached to avoid an infinite loop'); -/***/ "./node_modules/ramda/es/internal/_xdropLast.js": -/*!******************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xdropLast.js ***! - \******************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + didWarnUncachedGetSnapshot = true; + } + } + } // Because updates are synchronous, we don't queue them. Instead we force a + // re-render whenever the subscribed state changes by updating an some + // arbitrary useState hook. Then, during render, we call getSnapshot to read + // the current value. + // + // Because we don't actually use the state returned by the useState hook, we + // can save a bit of memory by storing other stuff in that slot. + // + // To implement the early bailout, we need to track some things on a mutable + // object. Usually, we would put that in a useRef hook, but we can stash it in + // our useState hook instead. + // + // To force a re-render, we call forceUpdate({inst}). That works because the + // new object always fails an equality check. -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xdropLast; } -/* harmony export */ }); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); -var XDropLast = /*#__PURE__*/ -function () { - function XDropLast(n, xf) { - if (n <= 0) { - return xf; + var _useState = useState({ + inst: { + value: value, + getSnapshot: getSnapshot } - this.xf = xf; - this.pos = 0; - this.full = false; - this.acc = new Array(n); - } - XDropLast.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].init; - XDropLast.prototype['@@transducer/result'] = function (result) { - this.acc = null; - return this.xf['@@transducer/result'](result); - }; - XDropLast.prototype['@@transducer/step'] = function (result, input) { - if (this.full) { - result = this.xf['@@transducer/step'](result, this.acc[this.pos]); + }), + inst = _useState[0].inst, + forceUpdate = _useState[1]; // Track the latest getSnapshot function with a ref. This needs to be updated + // in the layout phase so we can access it during the tearing check that + // happens on subscribe. + + + useLayoutEffect(function () { + inst.value = value; + inst.getSnapshot = getSnapshot; // Whenever getSnapshot or subscribe changes, we need to check in the + // commit phase if there was an interleaved mutation. In concurrent mode + // this can happen all the time, but even in synchronous mode, an earlier + // effect may have mutated the store. + + if (checkIfSnapshotChanged(inst)) { + // Force a re-render. + forceUpdate({ + inst: inst + }); } - this.store(input); - return result; - }; - XDropLast.prototype.store = function (input) { - this.acc[this.pos] = input; - this.pos += 1; - if (this.pos === this.acc.length) { - this.pos = 0; - this.full = true; + }, [subscribe, value, getSnapshot]); + useEffect(function () { + // Check for changes right before subscribing. Subsequent changes will be + // detected in the subscription handler. + if (checkIfSnapshotChanged(inst)) { + // Force a re-render. + forceUpdate({ + inst: inst + }); } - }; - return XDropLast; -}(); -function _xdropLast(n) { - return function (xf) { - return new XDropLast(n, xf); - }; -} -/***/ }), + var handleStoreChange = function () { + // TODO: Because there is no cross-renderer API for batching updates, it's + // up to the consumer of this library to wrap their subscription event + // with unstable_batchedUpdates. Should we try to detect when this isn't + // the case and print a warning in development? + // The store changed. Check if the snapshot changed since the last time we + // read from the store. + if (checkIfSnapshotChanged(inst)) { + // Force a re-render. + forceUpdate({ + inst: inst + }); + } + }; // Subscribe to the store and return a clean-up function. -/***/ "./node_modules/ramda/es/internal/_xdropLastWhile.js": -/*!***********************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xdropLastWhile.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xdropLastWhile; } -/* harmony export */ }); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); -/* harmony import */ var _xReduce_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_xReduce.js */ "./node_modules/ramda/es/internal/_xReduce.js"); + return subscribe(handleStoreChange); + }, [subscribe]); + useDebugValue(value); + return value; +} +function checkIfSnapshotChanged(inst) { + var latestGetSnapshot = inst.getSnapshot; + var prevValue = inst.value; -var XDropLastWhile = /*#__PURE__*/ -function () { - function XDropLastWhile(fn, xf) { - this.f = fn; - this.retained = []; - this.xf = xf; + try { + var nextValue = latestGetSnapshot(); + return !objectIs(prevValue, nextValue); + } catch (error) { + return true; } - XDropLastWhile.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].init; - XDropLastWhile.prototype['@@transducer/result'] = function (result) { - this.retained = null; - return this.xf['@@transducer/result'](result); - }; - XDropLastWhile.prototype['@@transducer/step'] = function (result, input) { - return this.f(input) ? this.retain(result, input) : this.flush(result, input); - }; - XDropLastWhile.prototype.flush = function (result, input) { - result = (0,_xReduce_js__WEBPACK_IMPORTED_MODULE_1__["default"])(this.xf, result, this.retained); - this.retained = []; - return this.xf['@@transducer/step'](result, input); - }; - XDropLastWhile.prototype.retain = function (result, input) { - this.retained.push(input); - return result; - }; - return XDropLastWhile; -}(); -function _xdropLastWhile(fn) { - return function (xf) { - return new XDropLastWhile(fn, xf); - }; } -/***/ }), - -/***/ "./node_modules/ramda/es/internal/_xdropRepeatsWith.js": -/*!*************************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xdropRepeatsWith.js ***! - \*************************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xdropRepeatsWith; } -/* harmony export */ }); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); - -var XDropRepeatsWith = /*#__PURE__*/ -function () { - function XDropRepeatsWith(pred, xf) { - this.xf = xf; - this.pred = pred; - this.lastValue = undefined; - this.seenFirstValue = false; - } - XDropRepeatsWith.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].init; - XDropRepeatsWith.prototype['@@transducer/result'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].result; - XDropRepeatsWith.prototype['@@transducer/step'] = function (result, input) { - var sameAsLast = false; - if (!this.seenFirstValue) { - this.seenFirstValue = true; - } else if (this.pred(this.lastValue, input)) { - sameAsLast = true; - } - this.lastValue = input; - return sameAsLast ? result : this.xf['@@transducer/step'](result, input); - }; - return XDropRepeatsWith; -}(); -function _xdropRepeatsWith(pred) { - return function (xf) { - return new XDropRepeatsWith(pred, xf); - }; +function useSyncExternalStore$1(subscribe, getSnapshot, getServerSnapshot) { + // Note: The shim does not use getServerSnapshot, because pre-18 versions of + // React do not expose a way to check if we're hydrating. So users of the shim + // will need to track that themselves and return the correct value + // from `getSnapshot`. + return getSnapshot(); } -/***/ }), +var canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined'); -/***/ "./node_modules/ramda/es/internal/_xdropWhile.js": -/*!*******************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xdropWhile.js ***! - \*******************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +var isServerEnvironment = !canUseDOM; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xdropWhile; } -/* harmony export */ }); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); +var shim = isServerEnvironment ? useSyncExternalStore$1 : useSyncExternalStore; +var useSyncExternalStore$2 = React.useSyncExternalStore !== undefined ? React.useSyncExternalStore : shim; -var XDropWhile = /*#__PURE__*/ -function () { - function XDropWhile(f, xf) { - this.xf = xf; - this.f = f; - } - XDropWhile.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].init; - XDropWhile.prototype['@@transducer/result'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].result; - XDropWhile.prototype['@@transducer/step'] = function (result, input) { - if (this.f) { - if (this.f(input)) { - return result; - } - this.f = null; - } - return this.xf['@@transducer/step'](result, input); - }; - return XDropWhile; -}(); -function _xdropWhile(f) { - return function (xf) { - return new XDropWhile(f, xf); - }; +exports.useSyncExternalStore = useSyncExternalStore$2; + /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ +if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === + 'function' +) { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error()); +} + + })(); } + /***/ }), -/***/ "./node_modules/ramda/es/internal/_xfBase.js": -/*!***************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xfBase.js ***! - \***************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js": +/*!************************************************************************************************************!*\ + !*** ./node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js ***! + \************************************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony default export */ __webpack_exports__["default"] = ({ - init: function init() { - return this.xf['@@transducer/init'](); - }, - result: function result(_result) { - return this.xf['@@transducer/result'](_result); - } -}); +/** + * @license React + * use-sync-external-store-shim/with-selector.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ -/***/ }), -/***/ "./node_modules/ramda/es/internal/_xfilter.js": -/*!****************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xfilter.js ***! - \****************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xfilter; } -/* harmony export */ }); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); +if (true) { + (function() { -var XFilter = /*#__PURE__*/ -function () { - function XFilter(f, xf) { - this.xf = xf; - this.f = f; - } - XFilter.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].init; - XFilter.prototype['@@transducer/result'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].result; - XFilter.prototype['@@transducer/step'] = function (result, input) { - return this.f(input) ? this.xf['@@transducer/step'](result, input) : result; - }; - return XFilter; -}(); -function _xfilter(f) { - return function (xf) { - return new XFilter(f, xf); - }; + 'use strict'; + +/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ +if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === + 'function' +) { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); } + var React = __webpack_require__(/*! react */ "react"); +var shim = __webpack_require__(/*! use-sync-external-store/shim */ "./node_modules/use-sync-external-store/shim/index.js"); -/***/ }), +/** + * inlined Object.is polyfill to avoid requiring consumers ship their own + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is + */ +function is(x, y) { + return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare + ; +} -/***/ "./node_modules/ramda/es/internal/_xfind.js": -/*!**************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xfind.js ***! - \**************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +var objectIs = typeof Object.is === 'function' ? Object.is : is; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xfind; } -/* harmony export */ }); -/* harmony import */ var _reduced_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_reduced.js */ "./node_modules/ramda/es/internal/_reduced.js"); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); +var useSyncExternalStore = shim.useSyncExternalStore; +// for CommonJS interop. -var XFind = /*#__PURE__*/ -function () { - function XFind(f, xf) { - this.xf = xf; - this.f = f; - this.found = false; +var useRef = React.useRef, + useEffect = React.useEffect, + useMemo = React.useMemo, + useDebugValue = React.useDebugValue; // Same as useSyncExternalStore, but supports selector and isEqual arguments. + +function useSyncExternalStoreWithSelector(subscribe, getSnapshot, getServerSnapshot, selector, isEqual) { + // Use this to track the rendered snapshot. + var instRef = useRef(null); + var inst; + + if (instRef.current === null) { + inst = { + hasValue: false, + value: null + }; + instRef.current = inst; + } else { + inst = instRef.current; } - XFind.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_1__["default"].init; - XFind.prototype['@@transducer/result'] = function (result) { - if (!this.found) { - result = this.xf['@@transducer/step'](result, void 0); - } - return this.xf['@@transducer/result'](result); - }; - XFind.prototype['@@transducer/step'] = function (result, input) { - if (this.f(input)) { - this.found = true; - result = (0,_reduced_js__WEBPACK_IMPORTED_MODULE_0__["default"])(this.xf['@@transducer/step'](result, input)); - } - return result; - }; - return XFind; -}(); -function _xfind(f) { - return function (xf) { - return new XFind(f, xf); - }; -} -/***/ }), + var _useMemo = useMemo(function () { + // Track the memoized state using closure variables that are local to this + // memoized instance of a getSnapshot function. Intentionally not using a + // useRef hook, because that state would be shared across all concurrent + // copies of the hook/component. + var hasMemo = false; + var memoizedSnapshot; + var memoizedSelection; -/***/ "./node_modules/ramda/es/internal/_xfindIndex.js": -/*!*******************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xfindIndex.js ***! - \*******************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + var memoizedSelector = function (nextSnapshot) { + if (!hasMemo) { + // The first time the hook is called, there is no memoized result. + hasMemo = true; + memoizedSnapshot = nextSnapshot; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xfindIndex; } -/* harmony export */ }); -/* harmony import */ var _reduced_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_reduced.js */ "./node_modules/ramda/es/internal/_reduced.js"); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); + var _nextSelection = selector(nextSnapshot); + if (isEqual !== undefined) { + // Even if the selector has changed, the currently rendered selection + // may be equal to the new selection. We should attempt to reuse the + // current value if possible, to preserve downstream memoizations. + if (inst.hasValue) { + var currentSelection = inst.value; -var XFindIndex = /*#__PURE__*/ -function () { - function XFindIndex(f, xf) { - this.xf = xf; - this.f = f; - this.idx = -1; - this.found = false; - } - XFindIndex.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_1__["default"].init; - XFindIndex.prototype['@@transducer/result'] = function (result) { - if (!this.found) { - result = this.xf['@@transducer/step'](result, -1); - } - return this.xf['@@transducer/result'](result); - }; - XFindIndex.prototype['@@transducer/step'] = function (result, input) { - this.idx += 1; - if (this.f(input)) { - this.found = true; - result = (0,_reduced_js__WEBPACK_IMPORTED_MODULE_0__["default"])(this.xf['@@transducer/step'](result, this.idx)); - } - return result; - }; - return XFindIndex; -}(); -function _xfindIndex(f) { - return function (xf) { - return new XFindIndex(f, xf); - }; -} + if (isEqual(currentSelection, _nextSelection)) { + memoizedSelection = currentSelection; + return currentSelection; + } + } + } -/***/ }), + memoizedSelection = _nextSelection; + return _nextSelection; + } // We may be able to reuse the previous invocation's result. -/***/ "./node_modules/ramda/es/internal/_xfindLast.js": -/*!******************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xfindLast.js ***! - \******************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xfindLast; } -/* harmony export */ }); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); + // We may be able to reuse the previous invocation's result. + var prevSnapshot = memoizedSnapshot; + var prevSelection = memoizedSelection; -var XFindLast = /*#__PURE__*/ -function () { - function XFindLast(f, xf) { - this.xf = xf; - this.f = f; - } - XFindLast.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].init; - XFindLast.prototype['@@transducer/result'] = function (result) { - return this.xf['@@transducer/result'](this.xf['@@transducer/step'](result, this.last)); - }; - XFindLast.prototype['@@transducer/step'] = function (result, input) { - if (this.f(input)) { - this.last = input; - } - return result; - }; - return XFindLast; -}(); -function _xfindLast(f) { - return function (xf) { - return new XFindLast(f, xf); - }; -} + if (objectIs(prevSnapshot, nextSnapshot)) { + // The snapshot is the same as last time. Reuse the previous selection. + return prevSelection; + } // The snapshot has changed, so we need to compute a new selection. -/***/ }), -/***/ "./node_modules/ramda/es/internal/_xfindLastIndex.js": -/*!***********************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xfindLastIndex.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + // The snapshot has changed, so we need to compute a new selection. + var nextSelection = selector(nextSnapshot); // If a custom isEqual function is provided, use that to check if the data + // has changed. If it hasn't, return the previous selection. That signals + // to React that the selections are conceptually equal, and we can bail + // out of rendering. -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xfindLastIndex; } -/* harmony export */ }); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); + // If a custom isEqual function is provided, use that to check if the data + // has changed. If it hasn't, return the previous selection. That signals + // to React that the selections are conceptually equal, and we can bail + // out of rendering. + if (isEqual !== undefined && isEqual(prevSelection, nextSelection)) { + return prevSelection; + } -var XFindLastIndex = /*#__PURE__*/ -function () { - function XFindLastIndex(f, xf) { - this.xf = xf; - this.f = f; - this.idx = -1; - this.lastIdx = -1; - } - XFindLastIndex.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].init; - XFindLastIndex.prototype['@@transducer/result'] = function (result) { - return this.xf['@@transducer/result'](this.xf['@@transducer/step'](result, this.lastIdx)); - }; - XFindLastIndex.prototype['@@transducer/step'] = function (result, input) { - this.idx += 1; - if (this.f(input)) { - this.lastIdx = this.idx; - } - return result; - }; - return XFindLastIndex; -}(); -function _xfindLastIndex(f) { - return function (xf) { - return new XFindLastIndex(f, xf); - }; -} + memoizedSnapshot = nextSnapshot; + memoizedSelection = nextSelection; + return nextSelection; + }; // Assigning this to a constant so that Flow knows it can't change. -/***/ }), -/***/ "./node_modules/ramda/es/internal/_xmap.js": -/*!*************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xmap.js ***! - \*************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + // Assigning this to a constant so that Flow knows it can't change. + var maybeGetServerSnapshot = getServerSnapshot === undefined ? null : getServerSnapshot; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); + var getSnapshotWithSelector = function () { + return memoizedSelector(getSnapshot()); + }; + + var getServerSnapshotWithSelector = maybeGetServerSnapshot === null ? undefined : function () { + return memoizedSelector(maybeGetServerSnapshot()); + }; + return [getSnapshotWithSelector, getServerSnapshotWithSelector]; + }, [getSnapshot, getServerSnapshot, selector, isEqual]), + getSelection = _useMemo[0], + getServerSelection = _useMemo[1]; + + var value = useSyncExternalStore(subscribe, getSelection, getServerSelection); + useEffect(function () { + inst.hasValue = true; + inst.value = value; + }, [value]); + useDebugValue(value); + return value; +} + +exports.useSyncExternalStoreWithSelector = useSyncExternalStoreWithSelector; + /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ +if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === + 'function' +) { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error()); +} + + })(); +} -var XMap = /*#__PURE__*/ -function () { - function XMap(f, xf) { - this.xf = xf; - this.f = f; - } - XMap.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].init; - XMap.prototype['@@transducer/result'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].result; - XMap.prototype['@@transducer/step'] = function (result, input) { - return this.xf['@@transducer/step'](result, this.f(input)); - }; - return XMap; -}(); -var _xmap = function _xmap(f) { - return function (xf) { - return new XMap(f, xf); - }; -}; -/* harmony default export */ __webpack_exports__["default"] = (_xmap); /***/ }), -/***/ "./node_modules/ramda/es/internal/_xpromap.js": -/*!****************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xpromap.js ***! - \****************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/use-sync-external-store/shim/index.js": +/*!************************************************************!*\ + !*** ./node_modules/use-sync-external-store/shim/index.js ***! + \************************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xpromap; } -/* harmony export */ }); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); -/* harmony import */ var _promap_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_promap.js */ "./node_modules/ramda/es/internal/_promap.js"); -var XPromap = /*#__PURE__*/ -function () { - function XPromap(f, g, xf) { - this.xf = xf; - this.f = f; - this.g = g; - } - XPromap.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].init; - XPromap.prototype['@@transducer/result'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].result; - XPromap.prototype['@@transducer/step'] = function (result, input) { - return this.xf['@@transducer/step'](result, (0,_promap_js__WEBPACK_IMPORTED_MODULE_1__["default"])(this.f, this.g, input)); - }; - return XPromap; -}(); -function _xpromap(f, g) { - return function (xf) { - return new XPromap(f, g, xf); - }; +if (false) {} else { + module.exports = __webpack_require__(/*! ../cjs/use-sync-external-store-shim.development.js */ "./node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js"); } + /***/ }), -/***/ "./node_modules/ramda/es/internal/_xreduceBy.js": -/*!******************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xreduceBy.js ***! - \******************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "./node_modules/use-sync-external-store/shim/with-selector.js": +/*!********************************************************************!*\ + !*** ./node_modules/use-sync-external-store/shim/with-selector.js ***! + \********************************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xreduceBy; } -/* harmony export */ }); -/* harmony import */ var _clone_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_clone.js */ "./node_modules/ramda/es/internal/_clone.js"); -/* harmony import */ var _has_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_has.js */ "./node_modules/ramda/es/internal/_has.js"); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); - -var XReduceBy = /*#__PURE__*/ -function () { - function XReduceBy(valueFn, valueAcc, keyFn, xf) { - this.valueFn = valueFn; - this.valueAcc = valueAcc; - this.keyFn = keyFn; - this.xf = xf; - this.inputs = {}; - } - XReduceBy.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_2__["default"].init; - XReduceBy.prototype['@@transducer/result'] = function (result) { - var key; - for (key in this.inputs) { - if ((0,_has_js__WEBPACK_IMPORTED_MODULE_1__["default"])(key, this.inputs)) { - result = this.xf['@@transducer/step'](result, this.inputs[key]); - if (result['@@transducer/reduced']) { - result = result['@@transducer/value']; - break; - } - } - } - this.inputs = null; - return this.xf['@@transducer/result'](result); - }; - XReduceBy.prototype['@@transducer/step'] = function (result, input) { - var key = this.keyFn(input); - this.inputs[key] = this.inputs[key] || [key, (0,_clone_js__WEBPACK_IMPORTED_MODULE_0__["default"])(this.valueAcc, false)]; - this.inputs[key][1] = this.valueFn(this.inputs[key][1], input); - return result; - }; - return XReduceBy; -}(); -function _xreduceBy(valueFn, valueAcc, keyFn) { - return function (xf) { - return new XReduceBy(valueFn, valueAcc, keyFn, xf); - }; +if (false) {} else { + module.exports = __webpack_require__(/*! ../cjs/use-sync-external-store-shim/with-selector.development.js */ "./node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js"); } + /***/ }), -/***/ "./node_modules/ramda/es/internal/_xscan.js": -/*!**************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xscan.js ***! - \**************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "prop-types": +/*!****************************!*\ + !*** external "PropTypes" ***! + \****************************/ +/***/ (function(module) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); - - -var tInit = '@@transducer/init'; -var tStep = '@@transducer/step'; -var XScan = /*#__PURE__*/ -function () { - function XScan(reducer, acc, xf) { - this.xf = xf; - this.f = reducer; - this.acc = acc; - } - XScan.prototype[tInit] = function () { - return this.xf[tStep](this.xf[tInit](), this.acc); - }; - XScan.prototype['@@transducer/result'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_1__["default"].result; - XScan.prototype[tStep] = function (result, input) { - if (result['@@transducer/reduced']) { - return result; - } - this.acc = this.f(this.acc, input); - return this.xf[tStep](result, this.acc); - }; - return XScan; -}(); -var _xscan = /*#__PURE__*/ -(0,_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function _xscan(reducer, acc, xf) { - return new XScan(reducer, acc, xf); -}); -/* harmony default export */ __webpack_exports__["default"] = (_xscan); +module.exports = window["PropTypes"]; /***/ }), -/***/ "./node_modules/ramda/es/internal/_xtake.js": -/*!**************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xtake.js ***! - \**************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ "react": +/*!************************!*\ + !*** external "React" ***! + \************************/ +/***/ (function(module) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xtake; } -/* harmony export */ }); -/* harmony import */ var _reduced_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_reduced.js */ "./node_modules/ramda/es/internal/_reduced.js"); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); +module.exports = window["React"]; +/***/ }), -var XTake = /*#__PURE__*/ -function () { - function XTake(n, xf) { - this.xf = xf; - this.n = n; - this.i = 0; - } - XTake.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_1__["default"].init; - XTake.prototype['@@transducer/result'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_1__["default"].result; - XTake.prototype['@@transducer/step'] = function (result, input) { - this.i += 1; - var ret = this.n === 0 ? result : this.xf['@@transducer/step'](result, input); - return this.n >= 0 && this.i >= this.n ? (0,_reduced_js__WEBPACK_IMPORTED_MODULE_0__["default"])(ret) : ret; - }; - return XTake; -}(); -function _xtake(n) { - return function (xf) { - return new XTake(n, xf); - }; -} +/***/ "react-dom": +/*!***************************!*\ + !*** external "ReactDOM" ***! + \***************************/ +/***/ (function(module) { + +"use strict"; +module.exports = window["ReactDOM"]; /***/ }), -/***/ "./node_modules/ramda/es/internal/_xtakeWhile.js": -/*!*******************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xtakeWhile.js ***! - \*******************************************************/ +/***/ "./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js ***! + \*********************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xtakeWhile; } +/* harmony export */ "default": function() { return /* binding */ _arrayLikeToArray; } /* harmony export */ }); -/* harmony import */ var _reduced_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_reduced.js */ "./node_modules/ramda/es/internal/_reduced.js"); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); - - -var XTakeWhile = /*#__PURE__*/ -function () { - function XTakeWhile(f, xf) { - this.xf = xf; - this.f = f; - } - XTakeWhile.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_1__["default"].init; - XTakeWhile.prototype['@@transducer/result'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_1__["default"].result; - XTakeWhile.prototype['@@transducer/step'] = function (result, input) { - return this.f(input) ? this.xf['@@transducer/step'](result, input) : (0,_reduced_js__WEBPACK_IMPORTED_MODULE_0__["default"])(result); - }; - return XTakeWhile; -}(); -function _xtakeWhile(f) { - return function (xf) { - return new XTakeWhile(f, xf); - }; +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + return arr2; } /***/ }), -/***/ "./node_modules/ramda/es/internal/_xtap.js": -/*!*************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xtap.js ***! - \*************************************************/ +/***/ "./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js ***! + \*******************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xtap; } +/* harmony export */ "default": function() { return /* binding */ _arrayWithHoles; } /* harmony export */ }); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); - -var XTap = /*#__PURE__*/ -function () { - function XTap(f, xf) { - this.xf = xf; - this.f = f; - } - XTap.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].init; - XTap.prototype['@@transducer/result'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].result; - XTap.prototype['@@transducer/step'] = function (result, input) { - this.f(input); - return this.xf['@@transducer/step'](result, input); - }; - return XTap; -}(); -function _xtap(f) { - return function (xf) { - return new XTap(f, xf); - }; +function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; } /***/ }), -/***/ "./node_modules/ramda/es/internal/_xuniqBy.js": -/*!****************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xuniqBy.js ***! - \****************************************************/ +/***/ "./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js ***! + \**********************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xuniqBy; } +/* harmony export */ "default": function() { return /* binding */ _arrayWithoutHoles; } /* harmony export */ }); -/* harmony import */ var _Set_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_Set.js */ "./node_modules/ramda/es/internal/_Set.js"); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); - +/* harmony import */ var _arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayLikeToArray.js */ "./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js"); -var XUniqBy = /*#__PURE__*/ -function () { - function XUniqBy(f, xf) { - this.xf = xf; - this.f = f; - this.set = new _Set_js__WEBPACK_IMPORTED_MODULE_0__["default"](); - } - XUniqBy.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_1__["default"].init; - XUniqBy.prototype['@@transducer/result'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_1__["default"].result; - XUniqBy.prototype['@@transducer/step'] = function (result, input) { - return this.set.add(this.f(input)) ? this.xf['@@transducer/step'](result, input) : result; - }; - return XUniqBy; -}(); -function _xuniqBy(f) { - return function (xf) { - return new XUniqBy(f, xf); - }; +function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__["default"])(arr); } /***/ }), -/***/ "./node_modules/ramda/es/internal/_xuniqWith.js": -/*!******************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xuniqWith.js ***! - \******************************************************/ +/***/ "./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js ***! + \**************************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xuniqWith; } +/* harmony export */ "default": function() { return /* binding */ _assertThisInitialized; } /* harmony export */ }); -/* harmony import */ var _includesWith_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_includesWith.js */ "./node_modules/ramda/es/internal/_includesWith.js"); -/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); - - -var XUniqWith = /*#__PURE__*/ -function () { - function XUniqWith(pred, xf) { - this.xf = xf; - this.pred = pred; - this.items = []; +function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } - XUniqWith.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_1__["default"].init; - XUniqWith.prototype['@@transducer/result'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_1__["default"].result; - XUniqWith.prototype['@@transducer/step'] = function (result, input) { - if ((0,_includesWith_js__WEBPACK_IMPORTED_MODULE_0__["default"])(this.pred, input, this.items)) { - return result; - } else { - this.items.push(input); - return this.xf['@@transducer/step'](result, input); - } - }; - return XUniqWith; -}(); -function _xuniqWith(pred) { - return function (xf) { - return new XUniqWith(pred, xf); - }; + return self; } /***/ }), -/***/ "./node_modules/ramda/es/internal/_xwrap.js": -/*!**************************************************!*\ - !*** ./node_modules/ramda/es/internal/_xwrap.js ***! - \**************************************************/ +/***/ "./node_modules/@babel/runtime/helpers/esm/classCallCheck.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/classCallCheck.js ***! + \*******************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ _xwrap; } +/* harmony export */ "default": function() { return /* binding */ _classCallCheck; } /* harmony export */ }); -var XWrap = /*#__PURE__*/ -function () { - function XWrap(fn) { - this.f = fn; +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); } - XWrap.prototype['@@transducer/init'] = function () { - throw new Error('init not implemented on XWrap'); - }; - XWrap.prototype['@@transducer/result'] = function (acc) { - return acc; - }; - XWrap.prototype['@@transducer/step'] = function (acc, x) { - return this.f(acc, x); - }; - return XWrap; -}(); -function _xwrap(fn) { - return new XWrap(fn); } /***/ }), -/***/ "./node_modules/ramda/es/intersection.js": -/*!***********************************************!*\ - !*** ./node_modules/ramda/es/intersection.js ***! - \***********************************************/ +/***/ "./node_modules/@babel/runtime/helpers/esm/createClass.js": +/*!****************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/createClass.js ***! + \****************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_filter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_filter.js */ "./node_modules/ramda/es/internal/_filter.js"); -/* harmony import */ var _internal_Set_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_Set.js */ "./node_modules/ramda/es/internal/_Set.js"); -/* harmony import */ var _uniq_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./uniq.js */ "./node_modules/ramda/es/uniq.js"); - - - - -/** - * Combines two lists into a set (i.e. no duplicates) composed of those - * elements common to both lists. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig [*] -> [*] -> [*] - * @param {Array} list1 The first list. - * @param {Array} list2 The second list. - * @return {Array} The list of elements found in both `list1` and `list2`. - * @see R.innerJoin - * @example - * - * R.intersection([1,2,3,4], [7,6,5,4,3]); //=> [4, 3] - */ +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _createClass; } +/* harmony export */ }); +/* harmony import */ var _toPropertyKey_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./toPropertyKey.js */ "./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js"); -var intersection = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function intersection(list1, list2) { - var toKeep = new _internal_Set_js__WEBPACK_IMPORTED_MODULE_2__["default"](); - for (var i = 0; i < list1.length; i += 1) { - toKeep.add(list1[i]); +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, (0,_toPropertyKey_js__WEBPACK_IMPORTED_MODULE_0__["default"])(descriptor.key), descriptor); } - return (0,_uniq_js__WEBPACK_IMPORTED_MODULE_3__["default"])((0,_internal_filter_js__WEBPACK_IMPORTED_MODULE_1__["default"])(toKeep.has.bind(toKeep), list2)); -}); -/* harmony default export */ __webpack_exports__["default"] = (intersection); +} +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); + return Constructor; +} /***/ }), -/***/ "./node_modules/ramda/es/intersperse.js": -/*!**********************************************!*\ - !*** ./node_modules/ramda/es/intersperse.js ***! - \**********************************************/ +/***/ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/defineProperty.js ***! + \*******************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_checkForMethod_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_checkForMethod.js */ "./node_modules/ramda/es/internal/_checkForMethod.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); - - -/** - * Creates a new list with the separator interposed between elements. - * - * Dispatches to the `intersperse` method of the second argument, if present. - * - * @func - * @memberOf R - * @since v0.14.0 - * @category List - * @sig a -> [a] -> [a] - * @param {*} separator The element to add to the list. - * @param {Array} list The list to be interposed. - * @return {Array} The new list. - * @example - * - * R.intersperse('a', ['b', 'n', 'n', 's']); //=> ['b', 'a', 'n', 'a', 'n', 'a', 's'] - */ +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _defineProperty; } +/* harmony export */ }); +/* harmony import */ var _toPropertyKey_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./toPropertyKey.js */ "./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js"); -var intersperse = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])( /*#__PURE__*/ -(0,_internal_checkForMethod_js__WEBPACK_IMPORTED_MODULE_0__["default"])('intersperse', function intersperse(separator, list) { - var out = []; - var idx = 0; - var length = list.length; - while (idx < length) { - if (idx === length - 1) { - out.push(list[idx]); - } else { - out.push(list[idx], separator); - } - idx += 1; +function _defineProperty(obj, key, value) { + key = (0,_toPropertyKey_js__WEBPACK_IMPORTED_MODULE_0__["default"])(key); + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; } - return out; -})); -/* harmony default export */ __webpack_exports__["default"] = (intersperse); - -/***/ }), - -/***/ "./node_modules/ramda/es/into.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/into.js ***! - \***************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _internal_isTransformer_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isTransformer.js */ "./node_modules/ramda/es/internal/_isTransformer.js"); -/* harmony import */ var _internal_xReduce_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xReduce.js */ "./node_modules/ramda/es/internal/_xReduce.js"); -/* harmony import */ var _internal_stepCat_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_stepCat.js */ "./node_modules/ramda/es/internal/_stepCat.js"); - - - - -/** - * Transforms the items of the list with the transducer and appends the - * transformed items to the accumulator using an appropriate iterator function - * based on the accumulator type. - * - * The accumulator can be an array, string, object or a transformer. Iterated - * items will be appended to arrays and concatenated to strings. Objects will - * be merged directly or 2-item arrays will be merged as key, value pairs. - * - * The accumulator can also be a transformer object that provides a 2-arity - * reducing iterator function, step, 0-arity initial value function, init, and - * 1-arity result extraction function result. The step function is used as the - * iterator function in reduce. The result function is used to convert the - * final accumulator into the return type and in most cases is R.identity. The - * init function is used to provide the initial accumulator. - * - * The iteration is performed with [`R.reduce`](#reduce) after initializing the - * transducer. - * - * @func - * @memberOf R - * @since v0.12.0 - * @category List - * @sig a -> (b -> b) -> [c] -> a - * @param {*} acc The initial accumulator value. - * @param {Function} xf The transducer function. Receives a transformer and returns a transformer. - * @param {Array} list The list to iterate over. - * @return {*} The final, accumulated value. - * @see R.transduce - * @example - * - * const numbers = [1, 2, 3, 4]; - * const transducer = R.compose(R.map(R.add(1)), R.take(2)); - * - * R.into([], transducer, numbers); //=> [2, 3] - * - * const intoArray = R.into([]); - * intoArray(transducer, numbers); //=> [2, 3] - */ - -var into = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function into(acc, transducer, list) { - var xf = transducer((0,_internal_isTransformer_js__WEBPACK_IMPORTED_MODULE_1__["default"])(acc) ? acc : (0,_internal_stepCat_js__WEBPACK_IMPORTED_MODULE_3__["default"])(acc)); - return (0,_internal_xReduce_js__WEBPACK_IMPORTED_MODULE_2__["default"])(xf, xf['@@transducer/init'](), list); -}); -/* harmony default export */ __webpack_exports__["default"] = (into); + return obj; +} /***/ }), -/***/ "./node_modules/ramda/es/invert.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/invert.js ***! - \*****************************************/ +/***/ "./node_modules/@babel/runtime/helpers/esm/extends.js": +/*!************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/extends.js ***! + \************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _internal_has_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_has.js */ "./node_modules/ramda/es/internal/_has.js"); -/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./keys.js */ "./node_modules/ramda/es/keys.js"); - +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _extends; } +/* harmony export */ }); +function _extends() { + _extends = Object.assign ? Object.assign.bind() : function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; + return _extends.apply(this, arguments); +} +/***/ }), -/** - * Same as [`R.invertObj`](#invertObj), however this accounts for objects with - * duplicate values by putting the values into an array. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Object - * @sig {s: x} -> {x: [ s, ... ]} - * @param {Object} obj The object or array to invert - * @return {Object} out A new object with keys in an array. - * @see R.invertObj - * @example - * - * const raceResultsByFirstName = { - * first: 'alice', - * second: 'jake', - * third: 'alice', - * }; - * R.invert(raceResultsByFirstName); - * //=> { 'alice': ['first', 'third'], 'jake':['second'] } - */ +/***/ "./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js ***! + \*******************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -var invert = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function invert(obj) { - var props = (0,_keys_js__WEBPACK_IMPORTED_MODULE_2__["default"])(obj); - var len = props.length; - var idx = 0; - var out = {}; - while (idx < len) { - var key = props[idx]; - var val = obj[key]; - var list = (0,_internal_has_js__WEBPACK_IMPORTED_MODULE_1__["default"])(val, out) ? out[val] : out[val] = []; - list[list.length] = key; - idx += 1; - } - return out; -}); -/* harmony default export */ __webpack_exports__["default"] = (invert); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _getPrototypeOf; } +/* harmony export */ }); +function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); +} /***/ }), -/***/ "./node_modules/ramda/es/invertObj.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/invertObj.js ***! - \********************************************/ +/***/ "./node_modules/@babel/runtime/helpers/esm/inherits.js": +/*!*************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/inherits.js ***! + \*************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./keys.js */ "./node_modules/ramda/es/keys.js"); - - -/** - * Returns a new object with the keys of the given object as values, and the - * values of the given object, which are coerced to strings, as keys. Note - * that the last key found is preferred when handling the same value. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Object - * @sig {s: x} -> {x: s} - * @param {Object} obj The object or array to invert - * @return {Object} out A new object - * @see R.invert - * @example - * - * const raceResults = { - * first: 'alice', - * second: 'jake' - * }; - * R.invertObj(raceResults); - * //=> { 'alice': 'first', 'jake':'second' } - * - * // Alternatively: - * const raceResults = ['alice', 'jake']; - * R.invertObj(raceResults); - * //=> { 'alice': '0', 'jake':'1' } - */ +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _inherits; } +/* harmony export */ }); +/* harmony import */ var _setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./setPrototypeOf.js */ "./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js"); -var invertObj = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function invertObj(obj) { - var props = (0,_keys_js__WEBPACK_IMPORTED_MODULE_1__["default"])(obj); - var len = props.length; - var idx = 0; - var out = {}; - while (idx < len) { - var key = props[idx]; - out[obj[key]] = key; - idx += 1; +function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); } - return out; -}); -/* harmony default export */ __webpack_exports__["default"] = (invertObj); + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + Object.defineProperty(subClass, "prototype", { + writable: false + }); + if (superClass) (0,_setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__["default"])(subClass, superClass); +} /***/ }), -/***/ "./node_modules/ramda/es/invoker.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/invoker.js ***! - \******************************************/ +/***/ "./node_modules/@babel/runtime/helpers/esm/iterableToArray.js": +/*!********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/iterableToArray.js ***! + \********************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_isFunction_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isFunction.js */ "./node_modules/ramda/es/internal/_isFunction.js"); -/* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./curryN.js */ "./node_modules/ramda/es/curryN.js"); -/* harmony import */ var _toString_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./toString.js */ "./node_modules/ramda/es/toString.js"); - - +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _iterableToArray; } +/* harmony export */ }); +function _iterableToArray(iter) { + if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); +} +/***/ }), -/** - * Given an `arity` (Number) and a `name` (String) the `invoker` function - * returns a curried function that takes `arity` arguments and a `context` - * object. It will "invoke" the `name`'d function (a method) on the `context` - * object. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig Number -> String -> (a -> b -> ... -> n -> Object -> *) - * @param {Number} arity Number of arguments the returned function should take - * before the target object. - * @param {String} method Name of any of the target object's methods to call. - * @return {Function} A new curried function. - * @see R.construct - * @example - * // A function with no arguments - * const asJson = invoker(0, "json") - * // Just like calling .then((response) => response.json()) - * fetch("http://example.com/index.json").then(asJson) - * - * // A function with one argument - * const sliceFrom = invoker(1, 'slice'); - * sliceFrom(6, 'abcdefghijklm'); //=> 'ghijklm' - * - * // A function with two arguments - * const sliceFrom6 = invoker(2, 'slice')(6); - * sliceFrom6(8, 'abcdefghijklm'); //=> 'gh' - * - * // NOTE: You can't simply pass some of the arguments to the initial invoker function. - * const firstCreditCardSection = invoker(2, "slice", 0, 4) - * firstCreditCardSection("4242 4242 4242 4242") // => Function<...> - * - * // Since invoker returns a curried function, you may partially apply it to create the function you need. - * const firstCreditCardSection = invoker(2, "slice")(0, 4) - * firstCreditCardSection("4242 4242 4242 4242") // => "4242" - * - * @symb R.invoker(0, 'method')(o) = o['method']() - * @symb R.invoker(1, 'method')(a, o) = o['method'](a) - * @symb R.invoker(2, 'method')(a, b, o) = o['method'](a, b) - */ +/***/ "./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js ***! + \*************************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -var invoker = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function invoker(arity, method) { - return (0,_curryN_js__WEBPACK_IMPORTED_MODULE_2__["default"])(arity + 1, function () { - var target = arguments[arity]; - if (target != null && (0,_internal_isFunction_js__WEBPACK_IMPORTED_MODULE_1__["default"])(target[method])) { - return target[method].apply(target, Array.prototype.slice.call(arguments, 0, arity)); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _iterableToArrayLimit; } +/* harmony export */ }); +function _iterableToArrayLimit(r, l) { + var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; + if (null != t) { + var e, + n, + i, + u, + a = [], + f = !0, + o = !1; + try { + if (i = (t = t.call(r)).next, 0 === l) { + if (Object(t) !== t) return; + f = !1; + } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); + } catch (r) { + o = !0, n = r; + } finally { + try { + if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; + } finally { + if (o) throw n; + } } - throw new TypeError((0,_toString_js__WEBPACK_IMPORTED_MODULE_3__["default"])(target) + ' does not have a method named "' + method + '"'); - }); -}); -/* harmony default export */ __webpack_exports__["default"] = (invoker); + return a; + } +} /***/ }), -/***/ "./node_modules/ramda/es/is.js": -/*!*************************************!*\ - !*** ./node_modules/ramda/es/is.js ***! - \*************************************/ +/***/ "./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js": +/*!********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js ***! + \********************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); - -/** - * See if an object (i.e. `val`) is an instance of the supplied constructor. This - * function will check up the inheritance chain, if any. - * If `val` was created using `Object.create`, `R.is(Object, val) === true`. - * - * @func - * @memberOf R - * @since v0.3.0 - * @category Type - * @sig (* -> {*}) -> a -> Boolean - * @param {Object} ctor A constructor - * @param {*} val The value to test - * @return {Boolean} - * @example - * - * R.is(Object, {}); //=> true - * R.is(Number, 1); //=> true - * R.is(Object, 1); //=> false - * R.is(String, 's'); //=> true - * R.is(String, new String('')); //=> true - * R.is(Object, new String('')); //=> true - * R.is(Object, 's'); //=> false - * R.is(Number, {}); //=> false - */ - -var is = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function is(Ctor, val) { - return val instanceof Ctor || val != null && (val.constructor === Ctor || Ctor.name === 'Object' && typeof val === 'object'); -}); -/* harmony default export */ __webpack_exports__["default"] = (is); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _nonIterableRest; } +/* harmony export */ }); +function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} /***/ }), -/***/ "./node_modules/ramda/es/isEmpty.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/isEmpty.js ***! - \******************************************/ +/***/ "./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js ***! + \**********************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _empty_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./empty.js */ "./node_modules/ramda/es/empty.js"); -/* harmony import */ var _equals_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./equals.js */ "./node_modules/ramda/es/equals.js"); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _nonIterableSpread; } +/* harmony export */ }); +function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} +/***/ }), +/***/ "./node_modules/@babel/runtime/helpers/esm/objectSpread2.js": +/*!******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/objectSpread2.js ***! + \******************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -/** - * Returns `true` if the given value is its type's empty value; `false` - * otherwise. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Logic - * @sig a -> Boolean - * @param {*} x - * @return {Boolean} - * @see R.empty - * @example - * - * R.isEmpty([1, 2, 3]); //=> false - * R.isEmpty([]); //=> true - * R.isEmpty(''); //=> true - * R.isEmpty(null); //=> false - * R.isEmpty({}); //=> true - * R.isEmpty({length: 0}); //=> false - * R.isEmpty(Uint8Array.from('')); //=> true - */ +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _objectSpread2; } +/* harmony export */ }); +/* harmony import */ var _defineProperty_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./defineProperty.js */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); -var isEmpty = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function isEmpty(x) { - return x != null && (0,_equals_js__WEBPACK_IMPORTED_MODULE_2__["default"])(x, (0,_empty_js__WEBPACK_IMPORTED_MODULE_1__["default"])(x)); -}); -/* harmony default export */ __webpack_exports__["default"] = (isEmpty); +function ownKeys(e, r) { + var t = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var o = Object.getOwnPropertySymbols(e); + r && (o = o.filter(function (r) { + return Object.getOwnPropertyDescriptor(e, r).enumerable; + })), t.push.apply(t, o); + } + return t; +} +function _objectSpread2(e) { + for (var r = 1; r < arguments.length; r++) { + var t = null != arguments[r] ? arguments[r] : {}; + r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { + (0,_defineProperty_js__WEBPACK_IMPORTED_MODULE_0__["default"])(e, r, t[r]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { + Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); + }); + } + return e; +} /***/ }), -/***/ "./node_modules/ramda/es/isNil.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/isNil.js ***! - \****************************************/ +/***/ "./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js ***! + \****************************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); - -/** - * Checks if the input value is `null` or `undefined`. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Type - * @sig * -> Boolean - * @param {*} x The value to test. - * @return {Boolean} `true` if `x` is `undefined` or `null`, otherwise `false`. - * @example - * - * R.isNil(null); //=> true - * R.isNil(undefined); //=> true - * R.isNil(0); //=> false - * R.isNil([]); //=> false - */ +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _objectWithoutProperties; } +/* harmony export */ }); +/* harmony import */ var _objectWithoutPropertiesLoose_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./objectWithoutPropertiesLoose.js */ "./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js"); -var isNil = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function isNil(x) { - return x == null; -}); -/* harmony default export */ __webpack_exports__["default"] = (isNil); +function _objectWithoutProperties(source, excluded) { + if (source == null) return {}; + var target = (0,_objectWithoutPropertiesLoose_js__WEBPACK_IMPORTED_MODULE_0__["default"])(source, excluded); + var key, i; + if (Object.getOwnPropertySymbols) { + var sourceSymbolKeys = Object.getOwnPropertySymbols(source); + for (i = 0; i < sourceSymbolKeys.length; i++) { + key = sourceSymbolKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; + target[key] = source[key]; + } + } + return target; +} /***/ }), -/***/ "./node_modules/ramda/es/isNotNil.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/isNotNil.js ***! - \*******************************************/ +/***/ "./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js ***! + \*********************************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _isNil_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isNil.js */ "./node_modules/ramda/es/isNil.js"); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); - - -/** - * Checks if the input value is not `null` and not `undefined`. - * - * @func - * @memberOf R - * @since v0.29.0 - * @category Type - * @sig * -> Boolean - * @param {*} x The value to test. - * @return {Boolean} `true` if `x` is not `undefined` or not `null`, otherwise `false`. - * @example - * - * R.isNotNil(null); //=> false - * R.isNotNil(undefined); //=> false - * R.isNotNil(0); //=> true - * R.isNotNil([]); //=> true - */ - -var isNotNil = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function isNotNil(x) { - return !(0,_isNil_js__WEBPACK_IMPORTED_MODULE_0__["default"])(x); -}); -/* harmony default export */ __webpack_exports__["default"] = (isNotNil); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _objectWithoutPropertiesLoose; } +/* harmony export */ }); +function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } + return target; +} /***/ }), -/***/ "./node_modules/ramda/es/join.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/join.js ***! - \***************************************/ +/***/ "./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js ***! + \******************************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _invoker_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./invoker.js */ "./node_modules/ramda/es/invoker.js"); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _possibleConstructorReturn; } +/* harmony export */ }); +/* harmony import */ var _typeof_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./typeof.js */ "./node_modules/@babel/runtime/helpers/esm/typeof.js"); +/* harmony import */ var _assertThisInitialized_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./assertThisInitialized.js */ "./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js"); -/** - * Returns a string made by inserting the `separator` between each element and - * concatenating all the elements into a single string. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig String -> [a] -> String - * @param {Number|String} separator The string used to separate the elements. - * @param {Array} xs The elements to join into a string. - * @return {String} str The string made by concatenating `xs` with `separator`. - * @see R.split - * @example - * - * const spacer = R.join(' '); - * spacer(['a', 2, 3.4]); //=> 'a 2 3.4' - * R.join('|', [1, 2, 3]); //=> '1|2|3' - */ -var join = /*#__PURE__*/ -(0,_invoker_js__WEBPACK_IMPORTED_MODULE_0__["default"])(1, 'join'); -/* harmony default export */ __webpack_exports__["default"] = (join); +function _possibleConstructorReturn(self, call) { + if (call && ((0,_typeof_js__WEBPACK_IMPORTED_MODULE_0__["default"])(call) === "object" || typeof call === "function")) { + return call; + } else if (call !== void 0) { + throw new TypeError("Derived constructors may only return object or undefined"); + } + return (0,_assertThisInitialized_js__WEBPACK_IMPORTED_MODULE_1__["default"])(self); +} /***/ }), -/***/ "./node_modules/ramda/es/juxt.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/juxt.js ***! - \***************************************/ +/***/ "./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js ***! + \*******************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _converge_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./converge.js */ "./node_modules/ramda/es/converge.js"); - - -/** - * juxt applies a list of functions to a list of values. - * - * @func - * @memberOf R - * @since v0.19.0 - * @category Function - * @sig [(a, b, ..., m) -> n] -> ((a, b, ..., m) -> [n]) - * @param {Array} fns An array of functions - * @return {Function} A function that returns a list of values after applying each of the original `fns` to its parameters. - * @see R.applySpec - * @example - * - * const getRange = R.juxt([Math.min, Math.max]); - * getRange(3, 4, 9, -3); //=> [-3, 9] - * @symb R.juxt([f, g, h])(a, b) = [f(a, b), g(a, b), h(a, b)] - */ - -var juxt = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function juxt(fns) { - return (0,_converge_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function () { - return Array.prototype.slice.call(arguments, 0); - }, fns); -}); -/* harmony default export */ __webpack_exports__["default"] = (juxt); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _setPrototypeOf; } +/* harmony export */ }); +function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf(o, p); +} /***/ }), -/***/ "./node_modules/ramda/es/keys.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/keys.js ***! - \***************************************/ +/***/ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js": +/*!******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js ***! + \******************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _internal_has_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_has.js */ "./node_modules/ramda/es/internal/_has.js"); -/* harmony import */ var _internal_isArguments_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_isArguments.js */ "./node_modules/ramda/es/internal/_isArguments.js"); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _slicedToArray; } +/* harmony export */ }); +/* harmony import */ var _arrayWithHoles_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayWithHoles.js */ "./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js"); +/* harmony import */ var _iterableToArrayLimit_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./iterableToArrayLimit.js */ "./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js"); +/* harmony import */ var _unsupportedIterableToArray_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./unsupportedIterableToArray.js */ "./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js"); +/* harmony import */ var _nonIterableRest_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./nonIterableRest.js */ "./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js"); - // cover IE < 9 keys issues -var hasEnumBug = ! /*#__PURE__*/ -{ - toString: null -}.propertyIsEnumerable('toString'); -var nonEnumerableProps = ['constructor', 'valueOf', 'isPrototypeOf', 'toString', 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; // Safari bug -var hasArgsEnumBug = /*#__PURE__*/ -function () { - 'use strict'; +function _slicedToArray(arr, i) { + return (0,_arrayWithHoles_js__WEBPACK_IMPORTED_MODULE_0__["default"])(arr) || (0,_iterableToArrayLimit_js__WEBPACK_IMPORTED_MODULE_1__["default"])(arr, i) || (0,_unsupportedIterableToArray_js__WEBPACK_IMPORTED_MODULE_2__["default"])(arr, i) || (0,_nonIterableRest_js__WEBPACK_IMPORTED_MODULE_3__["default"])(); +} - return arguments.propertyIsEnumerable('length'); -}(); -var contains = function contains(list, item) { - var idx = 0; - while (idx < list.length) { - if (list[idx] === item) { - return true; - } - idx += 1; - } - return false; -}; -/** - * Returns a list containing the names of all the enumerable own properties of - * the supplied object. - * Note that the order of the output array is not guaranteed to be consistent - * across different JS platforms. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Object - * @sig {k: v} -> [k] - * @param {Object} obj The object to extract properties from - * @return {Array} An array of the object's own properties. - * @see R.keysIn, R.values, R.toPairs - * @example - * - * R.keys({a: 1, b: 2, c: 3}); //=> ['a', 'b', 'c'] - */ +/***/ }), -var keys = typeof Object.keys === 'function' && !hasArgsEnumBug ? /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function keys(obj) { - return Object(obj) !== obj ? [] : Object.keys(obj); -}) : /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function keys(obj) { - if (Object(obj) !== obj) { - return []; - } - var prop, nIdx; - var ks = []; - var checkArgsLength = hasArgsEnumBug && (0,_internal_isArguments_js__WEBPACK_IMPORTED_MODULE_2__["default"])(obj); - for (prop in obj) { - if ((0,_internal_has_js__WEBPACK_IMPORTED_MODULE_1__["default"])(prop, obj) && (!checkArgsLength || prop !== 'length')) { - ks[ks.length] = prop; - } - } - if (hasEnumBug) { - nIdx = nonEnumerableProps.length - 1; - while (nIdx >= 0) { - prop = nonEnumerableProps[nIdx]; - if ((0,_internal_has_js__WEBPACK_IMPORTED_MODULE_1__["default"])(prop, obj) && !contains(ks, prop)) { - ks[ks.length] = prop; - } - nIdx -= 1; - } - } - return ks; -}); -/* harmony default export */ __webpack_exports__["default"] = (keys); +/***/ "./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js ***! + \**********************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _toConsumableArray; } +/* harmony export */ }); +/* harmony import */ var _arrayWithoutHoles_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayWithoutHoles.js */ "./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js"); +/* harmony import */ var _iterableToArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./iterableToArray.js */ "./node_modules/@babel/runtime/helpers/esm/iterableToArray.js"); +/* harmony import */ var _unsupportedIterableToArray_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./unsupportedIterableToArray.js */ "./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js"); +/* harmony import */ var _nonIterableSpread_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./nonIterableSpread.js */ "./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js"); + + + + +function _toConsumableArray(arr) { + return (0,_arrayWithoutHoles_js__WEBPACK_IMPORTED_MODULE_0__["default"])(arr) || (0,_iterableToArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(arr) || (0,_unsupportedIterableToArray_js__WEBPACK_IMPORTED_MODULE_2__["default"])(arr) || (0,_nonIterableSpread_js__WEBPACK_IMPORTED_MODULE_3__["default"])(); +} /***/ }), -/***/ "./node_modules/ramda/es/keysIn.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/keysIn.js ***! - \*****************************************/ +/***/ "./node_modules/@babel/runtime/helpers/esm/toPrimitive.js": +/*!****************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/toPrimitive.js ***! + \****************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); - -/** - * Returns a list containing the names of all the properties of the supplied - * object, including prototype properties. - * Note that the order of the output array is not guaranteed to be consistent - * across different JS platforms. - * - * @func - * @memberOf R - * @since v0.2.0 - * @category Object - * @sig {k: v} -> [k] - * @param {Object} obj The object to extract properties from - * @return {Array} An array of the object's own and prototype properties. - * @see R.keys, R.valuesIn - * @example - * - * const F = function() { this.x = 'X'; }; - * F.prototype.y = 'Y'; - * const f = new F(); - * R.keysIn(f); //=> ['x', 'y'] - */ +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _toPrimitive; } +/* harmony export */ }); +/* harmony import */ var _typeof_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./typeof.js */ "./node_modules/@babel/runtime/helpers/esm/typeof.js"); -var keysIn = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function keysIn(obj) { - var prop; - var ks = []; - for (prop in obj) { - ks[ks.length] = prop; +function _toPrimitive(input, hint) { + if ((0,_typeof_js__WEBPACK_IMPORTED_MODULE_0__["default"])(input) !== "object" || input === null) return input; + var prim = input[Symbol.toPrimitive]; + if (prim !== undefined) { + var res = prim.call(input, hint || "default"); + if ((0,_typeof_js__WEBPACK_IMPORTED_MODULE_0__["default"])(res) !== "object") return res; + throw new TypeError("@@toPrimitive must return a primitive value."); } - return ks; -}); -/* harmony default export */ __webpack_exports__["default"] = (keysIn); + return (hint === "string" ? String : Number)(input); +} /***/ }), -/***/ "./node_modules/ramda/es/last.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/last.js ***! - \***************************************/ +/***/ "./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js": +/*!******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js ***! + \******************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _nth_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./nth.js */ "./node_modules/ramda/es/nth.js"); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _toPropertyKey; } +/* harmony export */ }); +/* harmony import */ var _typeof_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./typeof.js */ "./node_modules/@babel/runtime/helpers/esm/typeof.js"); +/* harmony import */ var _toPrimitive_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./toPrimitive.js */ "./node_modules/@babel/runtime/helpers/esm/toPrimitive.js"); -/** - * Returns the last element of the given list or string. - * - * @func - * @memberOf R - * @since v0.1.4 - * @category List - * @sig [a] -> a | Undefined - * @sig String -> String - * @param {*} list - * @return {*} - * @see R.init, R.head, R.tail - * @example - * - * R.last(['fi', 'fo', 'fum']); //=> 'fum' - * R.last([]); //=> undefined - * - * R.last('abc'); //=> 'c' - * R.last(''); //=> '' - */ -var last = /*#__PURE__*/ -(0,_nth_js__WEBPACK_IMPORTED_MODULE_0__["default"])(-1); -/* harmony default export */ __webpack_exports__["default"] = (last); +function _toPropertyKey(arg) { + var key = (0,_toPrimitive_js__WEBPACK_IMPORTED_MODULE_1__["default"])(arg, "string"); + return (0,_typeof_js__WEBPACK_IMPORTED_MODULE_0__["default"])(key) === "symbol" ? key : String(key); +} /***/ }), -/***/ "./node_modules/ramda/es/lastIndexOf.js": -/*!**********************************************!*\ - !*** ./node_modules/ramda/es/lastIndexOf.js ***! - \**********************************************/ +/***/ "./node_modules/@babel/runtime/helpers/esm/typeof.js": +/*!***********************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/typeof.js ***! + \***********************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); -/* harmony import */ var _equals_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./equals.js */ "./node_modules/ramda/es/equals.js"); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _typeof; } +/* harmony export */ }); +function _typeof(o) { + "@babel/helpers - typeof"; + return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { + return typeof o; + } : function (o) { + return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; + }, _typeof(o); +} +/***/ }), -/** - * Returns the position of the last occurrence of an item in an array, or -1 if - * the item is not included in the array. [`R.equals`](#equals) is used to - * determine equality. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig a -> [a] -> Number - * @param {*} target The item to find. - * @param {Array} xs The array to search in. - * @return {Number} the index of the target, or -1 if the target is not found. - * @see R.indexOf, R.findLastIndex - * @example - * - * R.lastIndexOf(3, [-1,3,3,0,1,2,3,4]); //=> 6 - * R.lastIndexOf(10, [1,2,3,4]); //=> -1 - */ +/***/ "./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js ***! + \*******************************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -var lastIndexOf = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function lastIndexOf(target, xs) { - if (typeof xs.lastIndexOf === 'function' && !(0,_internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(xs)) { - return xs.lastIndexOf(target); - } else { - var idx = xs.length - 1; - while (idx >= 0) { - if ((0,_equals_js__WEBPACK_IMPORTED_MODULE_2__["default"])(xs[idx], target)) { - return idx; - } - idx -= 1; - } - return -1; - } -}); -/* harmony default export */ __webpack_exports__["default"] = (lastIndexOf); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _unsupportedIterableToArray; } +/* harmony export */ }); +/* harmony import */ var _arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayLikeToArray.js */ "./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js"); + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__["default"])(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__["default"])(o, minLen); +} /***/ }), -/***/ "./node_modules/ramda/es/length.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/length.js ***! - \*****************************************/ +/***/ "./node_modules/ramda/es/addIndex.js": +/*!*******************************************!*\ + !*** ./node_modules/ramda/es/addIndex.js ***! + \*******************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); +/* harmony import */ var _internal_concat_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_concat.js */ "./node_modules/ramda/es/internal/_concat.js"); /* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _internal_isNumber_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isNumber.js */ "./node_modules/ramda/es/internal/_isNumber.js"); +/* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./curryN.js */ "./node_modules/ramda/es/curryN.js"); + /** - * Returns the number of elements in the array by returning `list.length`. + * Creates a new list iteration function from an existing one by adding two new + * parameters to its callback function: the current index, and the entire list. + * + * This would turn, for instance, [`R.map`](#map) function into one that + * more closely resembles `Array.prototype.map`. Note that this will only work + * for functions in which the iteration callback function is the first + * parameter, and where the list is the last parameter. (This latter might be + * unimportant if the list parameter is not used.) * * @func * @memberOf R - * @since v0.3.0 + * @since v0.15.0 + * @category Function * @category List - * @sig [a] -> Number - * @param {Array} list The array to inspect. - * @return {Number} The length of the array. + * @sig (((a ...) -> b) ... -> [a] -> *) -> (((a ..., Int, [a]) -> b) ... -> [a] -> *) + * @param {Function} fn A list iteration function that does not pass index or list to its callback + * @return {Function} An altered list iteration function that passes (item, index, list) to its callback * @example * - * R.length([]); //=> 0 - * R.length([1, 2, 3]); //=> 3 + * const mapIndexed = R.addIndex(R.map); + * mapIndexed((val, idx) => idx + '-' + val, ['f', 'o', 'o', 'b', 'a', 'r']); + * //=> ['0-f', '1-o', '2-o', '3-b', '4-a', '5-r'] */ -var length = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function length(list) { - return list != null && (0,_internal_isNumber_js__WEBPACK_IMPORTED_MODULE_1__["default"])(list.length) ? list.length : NaN; +var addIndex = /*#__PURE__*/ +(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function addIndex(fn) { + return (0,_curryN_js__WEBPACK_IMPORTED_MODULE_1__["default"])(fn.length, function () { + var idx = 0; + var origFn = arguments[0]; + var list = arguments[arguments.length - 1]; + var args = Array.prototype.slice.call(arguments, 0); + args[0] = function () { + var result = origFn.apply(this, (0,_internal_concat_js__WEBPACK_IMPORTED_MODULE_2__["default"])(arguments, [idx, list])); + idx += 1; + return result; + }; + return fn.apply(this, args); + }); }); -/* harmony default export */ __webpack_exports__["default"] = (length); +/* harmony default export */ __webpack_exports__["default"] = (addIndex); /***/ }), -/***/ "./node_modules/ramda/es/lens.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/lens.js ***! - \***************************************/ +/***/ "./node_modules/ramda/es/all.js": +/*!**************************************!*\ + !*** ./node_modules/ramda/es/all.js ***! + \**************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./map.js */ "./node_modules/ramda/es/map.js"); +/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); +/* harmony import */ var _internal_xall_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xall.js */ "./node_modules/ramda/es/internal/_xall.js"); + /** - * Returns a lens for the given getter and setter functions. The getter "gets" - * the value of the focus; the setter "sets" the value of the focus. The setter - * should not mutate the data structure. + * Returns `true` if all elements of the list match the predicate, `false` if + * there are any that don't. + * + * Dispatches to the `all` method of the second argument, if present. + * + * Acts as a transducer if a transformer is given in list position. * * @func * @memberOf R - * @since v0.8.0 - * @category Object - * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s - * @sig (s -> a) -> ((a, s) -> s) -> Lens s a - * @param {Function} getter - * @param {Function} setter - * @return {Lens} - * @see R.view, R.set, R.over, R.lensIndex, R.lensProp + * @since v0.1.0 + * @category List + * @sig (a -> Boolean) -> [a] -> Boolean + * @param {Function} fn The predicate function. + * @param {Array} list The array to consider. + * @return {Boolean} `true` if the predicate is satisfied by every element, `false` + * otherwise. + * @see R.any, R.none, R.transduce * @example * - * const xLens = R.lens(R.prop('x'), R.assoc('x')); - * - * R.view(xLens, {x: 1, y: 2}); //=> 1 - * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2} - * R.over(xLens, R.negate, {x: 1, y: 2}); //=> {x: -1, y: 2} + * const equals3 = R.equals(3); + * R.all(equals3)([3, 3, 3, 3]); //=> true + * R.all(equals3)([3, 3, 1, 3]); //=> false */ -var lens = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function lens(getter, setter) { - return function (toFunctorFn) { - return function (target) { - return (0,_map_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (focus) { - return setter(focus, target); - }, toFunctorFn(getter(target))); - }; - }; -}); -/* harmony default export */ __webpack_exports__["default"] = (lens); +var all = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ +(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])(['all'], _internal_xall_js__WEBPACK_IMPORTED_MODULE_2__["default"], function all(fn, list) { + var idx = 0; + while (idx < list.length) { + if (!fn(list[idx])) { + return false; + } + idx += 1; + } + return true; +})); +/* harmony default export */ __webpack_exports__["default"] = (all); /***/ }), -/***/ "./node_modules/ramda/es/lensIndex.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/lensIndex.js ***! - \********************************************/ +/***/ "./node_modules/ramda/es/always.js": +/*!*****************************************!*\ + !*** ./node_modules/ramda/es/always.js ***! + \*****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _lens_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lens.js */ "./node_modules/ramda/es/lens.js"); -/* harmony import */ var _nth_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./nth.js */ "./node_modules/ramda/es/nth.js"); -/* harmony import */ var _update_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./update.js */ "./node_modules/ramda/es/update.js"); - - - /** - * Returns a lens whose focus is the specified index. + * Returns a function that always returns the given value. Note that for + * non-primitives the value returned is a reference to the original value. + * + * This function is known as `const`, `constant`, or `K` (for K combinator) in + * other languages and libraries. * * @func * @memberOf R - * @since v0.14.0 - * @category Object - * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s - * @sig Number -> Lens s a - * @param {Number} n - * @return {Lens} - * @see R.view, R.set, R.over, R.nth + * @since v0.1.0 + * @category Function + * @sig a -> (* -> a) + * @param {*} val The value to wrap in a function + * @return {Function} A Function :: * -> val. * @example * - * const headLens = R.lensIndex(0); - * - * R.view(headLens, ['a', 'b', 'c']); //=> 'a' - * R.set(headLens, 'x', ['a', 'b', 'c']); //=> ['x', 'b', 'c'] - * R.over(headLens, R.toUpper, ['a', 'b', 'c']); //=> ['A', 'b', 'c'] + * const t = R.always('Tee'); + * t(); //=> 'Tee' */ -var lensIndex = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function lensIndex(n) { - return (0,_lens_js__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_nth_js__WEBPACK_IMPORTED_MODULE_2__["default"])(n), (0,_update_js__WEBPACK_IMPORTED_MODULE_3__["default"])(n)); +var always = /*#__PURE__*/ +(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function always(val) { + return function () { + return val; + }; }); -/* harmony default export */ __webpack_exports__["default"] = (lensIndex); +/* harmony default export */ __webpack_exports__["default"] = (always); /***/ }), -/***/ "./node_modules/ramda/es/lensPath.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/lensPath.js ***! - \*******************************************/ +/***/ "./node_modules/ramda/es/any.js": +/*!**************************************!*\ + !*** ./node_modules/ramda/es/any.js ***! + \**************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _assocPath_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./assocPath.js */ "./node_modules/ramda/es/assocPath.js"); -/* harmony import */ var _lens_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lens.js */ "./node_modules/ramda/es/lens.js"); -/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./path.js */ "./node_modules/ramda/es/path.js"); - +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); +/* harmony import */ var _internal_xany_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xany.js */ "./node_modules/ramda/es/internal/_xany.js"); /** - * Returns a lens whose focus is the specified path. + * Returns `true` if at least one of the elements of the list match the predicate, + * `false` otherwise. + * + * Dispatches to the `any` method of the second argument, if present. + * + * Acts as a transducer if a transformer is given in list position. * * @func * @memberOf R - * @since v0.19.0 - * @category Object - * @typedefn Idx = String | Int | Symbol - * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s - * @sig [Idx] -> Lens s a - * @param {Array} path The path to use. - * @return {Lens} - * @see R.view, R.set, R.over + * @since v0.1.0 + * @category List + * @sig (a -> Boolean) -> [a] -> Boolean + * @param {Function} fn The predicate function. + * @param {Array} list The array to consider. + * @return {Boolean} `true` if the predicate is satisfied by at least one element, `false` + * otherwise. + * @see R.all, R.none, R.transduce * @example * - * const xHeadYLens = R.lensPath(['x', 0, 'y']); - * - * R.view(xHeadYLens, {x: [{y: 2, z: 3}, {y: 4, z: 5}]}); - * //=> 2 - * R.set(xHeadYLens, 1, {x: [{y: 2, z: 3}, {y: 4, z: 5}]}); - * //=> {x: [{y: 1, z: 3}, {y: 4, z: 5}]} - * R.over(xHeadYLens, R.negate, {x: [{y: 2, z: 3}, {y: 4, z: 5}]}); - * //=> {x: [{y: -2, z: 3}, {y: 4, z: 5}]} + * const lessThan0 = R.flip(R.lt)(0); + * const lessThan2 = R.flip(R.lt)(2); + * R.any(lessThan0)([1, 2]); //=> false + * R.any(lessThan2)([1, 2]); //=> true */ -var lensPath = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function lensPath(p) { - return (0,_lens_js__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_path_js__WEBPACK_IMPORTED_MODULE_3__["default"])(p), (0,_assocPath_js__WEBPACK_IMPORTED_MODULE_1__["default"])(p)); -}); -/* harmony default export */ __webpack_exports__["default"] = (lensPath); +var any = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ +(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])(['any'], _internal_xany_js__WEBPACK_IMPORTED_MODULE_2__["default"], function any(fn, list) { + var idx = 0; + while (idx < list.length) { + if (fn(list[idx])) { + return true; + } + idx += 1; + } + return false; +})); +/* harmony default export */ __webpack_exports__["default"] = (any); /***/ }), -/***/ "./node_modules/ramda/es/lensProp.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/lensProp.js ***! - \*******************************************/ +/***/ "./node_modules/ramda/es/ap.js": +/*!*************************************!*\ + !*** ./node_modules/ramda/es/ap.js ***! + \*************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _assoc_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./assoc.js */ "./node_modules/ramda/es/assoc.js"); -/* harmony import */ var _lens_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lens.js */ "./node_modules/ramda/es/lens.js"); -/* harmony import */ var _prop_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./prop.js */ "./node_modules/ramda/es/prop.js"); +/* harmony import */ var _internal_concat_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_concat.js */ "./node_modules/ramda/es/internal/_concat.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_reduce_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_reduce.js */ "./node_modules/ramda/es/internal/_reduce.js"); +/* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./map.js */ "./node_modules/ramda/es/map.js"); /** - * Returns a lens whose focus is the specified property. + * ap applies a list of functions to a list of values. + * + * Dispatches to the `ap` method of the first argument, if present. Also + * treats curried functions as applicatives. * * @func * @memberOf R - * @since v0.14.0 - * @category Object - * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s - * @sig String -> Lens s a - * @param {String} k - * @return {Lens} - * @see R.view, R.set, R.over + * @since v0.3.0 + * @category Function + * @sig [a -> b] -> [a] -> [b] + * @sig Apply f => f (a -> b) -> f a -> f b + * @sig (r -> a -> b) -> (r -> a) -> (r -> b) + * @param {*} applyF + * @param {*} applyX + * @return {*} * @example * - * const xLens = R.lensProp('x'); + * R.ap([R.multiply(2), R.add(3)], [1,2,3]); //=> [2, 4, 6, 4, 5, 6] + * R.ap([R.concat('tasty '), R.toUpper], ['pizza', 'salad']); //=> ["tasty pizza", "tasty salad", "PIZZA", "SALAD"] * - * R.view(xLens, {x: 1, y: 2}); //=> 1 - * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2} - * R.over(xLens, R.negate, {x: 1, y: 2}); //=> {x: -1, y: 2} + * // R.ap can also be used as S combinator + * // when only two functions are passed + * R.ap(R.concat, R.toUpper)('Ramda') //=> 'RamdaRAMDA' + * @symb R.ap([f, g], [a, b]) = [f(a), f(b), g(a), g(b)] */ -var lensProp = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function lensProp(k) { - return (0,_lens_js__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_prop_js__WEBPACK_IMPORTED_MODULE_3__["default"])(k), (0,_assoc_js__WEBPACK_IMPORTED_MODULE_1__["default"])(k)); +var ap = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function ap(applyF, applyX) { + return typeof applyX['fantasy-land/ap'] === 'function' ? applyX['fantasy-land/ap'](applyF) : typeof applyF.ap === 'function' ? applyF.ap(applyX) : typeof applyF === 'function' ? function (x) { + return applyF(x)(applyX(x)); + } : (0,_internal_reduce_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (acc, f) { + return (0,_internal_concat_js__WEBPACK_IMPORTED_MODULE_2__["default"])(acc, (0,_map_js__WEBPACK_IMPORTED_MODULE_3__["default"])(f, applyX)); + }, [], applyF); }); -/* harmony default export */ __webpack_exports__["default"] = (lensProp); +/* harmony default export */ __webpack_exports__["default"] = (ap); /***/ }), -/***/ "./node_modules/ramda/es/lift.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/lift.js ***! - \***************************************/ +/***/ "./node_modules/ramda/es/append.js": +/*!*****************************************!*\ + !*** ./node_modules/ramda/es/append.js ***! + \*****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _liftN_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./liftN.js */ "./node_modules/ramda/es/liftN.js"); +/* harmony import */ var _internal_concat_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_concat.js */ "./node_modules/ramda/es/internal/_concat.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); /** - * "lifts" a function of arity >= 1 so that it may "map over" a list, Function or other - * object that satisfies the [FantasyLand Apply spec](https://github.com/fantasyland/fantasy-land#apply). + * Returns a new list containing the contents of the given list, followed by + * the given element. * * @func * @memberOf R - * @since v0.7.0 - * @category Function - * @sig (*... -> *) -> ([*]... -> [*]) - * @param {Function} fn The function to lift into higher context - * @return {Function} The lifted function. - * @see R.liftN + * @since v0.1.0 + * @category List + * @sig a -> [a] -> [a] + * @param {*} el The element to add to the end of the new list. + * @param {Array} list The list of elements to add a new item to. + * list. + * @return {Array} A new list containing the elements of the old list followed by `el`. + * @see R.prepend * @example * - * const madd3 = R.lift((a, b, c) => a + b + c); - * - * madd3([100, 200], [30, 40], [5, 6, 7]); //=> [135, 136, 137, 145, 146, 147, 235, 236, 237, 245, 246, 247] - * - * const madd5 = R.lift((a, b, c, d, e) => a + b + c + d + e); - * - * madd5([10, 20], [1], [2, 3], [4], [100, 200]); //=> [117, 217, 118, 218, 127, 227, 128, 228] + * R.append('tests', ['write', 'more']); //=> ['write', 'more', 'tests'] + * R.append('tests', []); //=> ['tests'] + * R.append(['tests'], ['write', 'more']); //=> ['write', 'more', ['tests']] */ -var lift = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function lift(fn) { - return (0,_liftN_js__WEBPACK_IMPORTED_MODULE_1__["default"])(fn.length, fn); +var append = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function append(el, list) { + return (0,_internal_concat_js__WEBPACK_IMPORTED_MODULE_1__["default"])(list, [el]); }); -/* harmony default export */ __webpack_exports__["default"] = (lift); +/* harmony default export */ __webpack_exports__["default"] = (append); /***/ }), -/***/ "./node_modules/ramda/es/liftN.js": +/***/ "./node_modules/ramda/es/assoc.js": /*!****************************************!*\ - !*** ./node_modules/ramda/es/liftN.js ***! + !*** ./node_modules/ramda/es/assoc.js ***! \****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_arrayReduce_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_arrayReduce.js */ "./node_modules/ramda/es/internal/_arrayReduce.js"); -/* harmony import */ var _ap_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ap.js */ "./node_modules/ramda/es/ap.js"); -/* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./curryN.js */ "./node_modules/ramda/es/curryN.js"); -/* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./map.js */ "./node_modules/ramda/es/map.js"); - - - +/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); +/* harmony import */ var _assocPath_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./assocPath.js */ "./node_modules/ramda/es/assocPath.js"); /** - * "lifts" a function to be the specified arity, so that it may "map over" that - * many lists, Functions or other objects that satisfy the [FantasyLand Apply spec](https://github.com/fantasyland/fantasy-land#apply). + * Makes a shallow clone of an object, setting or overriding the specified + * property with the given value. Note that this copies and flattens prototype + * properties onto the new object as well. All non-primitive properties are + * copied by reference. * * @func * @memberOf R - * @since v0.7.0 - * @category Function - * @sig Number -> (*... -> *) -> ([*]... -> [*]) - * @param {Function} fn The function to lift into higher context - * @return {Function} The lifted function. - * @see R.lift, R.ap + * @since v0.8.0 + * @category Object + * @typedefn Idx = String | Int + * @sig Idx -> a -> {k: v} -> {k: v} + * @param {String|Number} prop The property name to set + * @param {*} val The new value + * @param {Object} obj The object to clone + * @return {Object} A new object equivalent to the original except for the changed property. + * @see R.dissoc, R.pick * @example * - * const madd3 = R.liftN(3, (...args) => R.sum(args)); - * madd3([1,2,3], [1,2,3], [1]); //=> [3, 4, 5, 4, 5, 6, 5, 6, 7] + * R.assoc('c', 3, {a: 1, b: 2}); //=> {a: 1, b: 2, c: 3} */ -var liftN = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function liftN(arity, fn) { - var lifted = (0,_curryN_js__WEBPACK_IMPORTED_MODULE_3__["default"])(arity, fn); - return (0,_curryN_js__WEBPACK_IMPORTED_MODULE_3__["default"])(arity, function () { - return (0,_internal_arrayReduce_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_ap_js__WEBPACK_IMPORTED_MODULE_2__["default"], (0,_map_js__WEBPACK_IMPORTED_MODULE_4__["default"])(lifted, arguments[0]), Array.prototype.slice.call(arguments, 1)); - }); +var assoc = /*#__PURE__*/ +(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function assoc(prop, val, obj) { + return (0,_assocPath_js__WEBPACK_IMPORTED_MODULE_1__["default"])([prop], val, obj); }); -/* harmony default export */ __webpack_exports__["default"] = (liftN); +/* harmony default export */ __webpack_exports__["default"] = (assoc); /***/ }), -/***/ "./node_modules/ramda/es/lt.js": -/*!*************************************!*\ - !*** ./node_modules/ramda/es/lt.js ***! - \*************************************/ +/***/ "./node_modules/ramda/es/assocPath.js": +/*!********************************************!*\ + !*** ./node_modules/ramda/es/assocPath.js ***! + \********************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); +/* harmony import */ var _internal_has_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_has.js */ "./node_modules/ramda/es/internal/_has.js"); +/* harmony import */ var _internal_isInteger_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_isInteger.js */ "./node_modules/ramda/es/internal/_isInteger.js"); +/* harmony import */ var _internal_assoc_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./internal/_assoc.js */ "./node_modules/ramda/es/internal/_assoc.js"); +/* harmony import */ var _isNil_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isNil.js */ "./node_modules/ramda/es/isNil.js"); + + + + /** - * Returns `true` if the first argument is less than the second; `false` - * otherwise. + * Makes a shallow clone of an object, setting or overriding the nodes required + * to create the given path, and placing the specific value at the tail end of + * that path. Note that this copies and flattens prototype properties onto the + * new object as well. All non-primitive properties are copied by reference. * * @func * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig Ord a => a -> a -> Boolean - * @param {*} a - * @param {*} b - * @return {Boolean} - * @see R.gt + * @since v0.8.0 + * @category Object + * @typedefn Idx = String | Int | Symbol + * @sig [Idx] -> a -> {a} -> {a} + * @param {Array} path the path to set + * @param {*} val The new value + * @param {Object} obj The object to clone + * @return {Object} A new object equivalent to the original except along the specified path. + * @see R.dissocPath * @example * - * R.lt(2, 1); //=> false - * R.lt(2, 2); //=> false - * R.lt(2, 3); //=> true - * R.lt('a', 'z'); //=> true - * R.lt('z', 'a'); //=> false + * R.assocPath(['a', 'b', 'c'], 42, {a: {b: {c: 0}}}); //=> {a: {b: {c: 42}}} + * + * // Any missing or non-object keys in path will be overridden + * R.assocPath(['a', 'b', 'c'], 42, {a: 5}); //=> {a: {b: {c: 42}}} */ -var lt = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function lt(a, b) { - return a < b; +var assocPath = /*#__PURE__*/ +(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function assocPath(path, val, obj) { + if (path.length === 0) { + return val; + } + var idx = path[0]; + if (path.length > 1) { + var nextObj = !(0,_isNil_js__WEBPACK_IMPORTED_MODULE_1__["default"])(obj) && (0,_internal_has_js__WEBPACK_IMPORTED_MODULE_2__["default"])(idx, obj) && typeof obj[idx] === 'object' ? obj[idx] : (0,_internal_isInteger_js__WEBPACK_IMPORTED_MODULE_3__["default"])(path[1]) ? [] : {}; + val = assocPath(Array.prototype.slice.call(path, 1), val, nextObj); + } + return (0,_internal_assoc_js__WEBPACK_IMPORTED_MODULE_4__["default"])(idx, val, obj); }); -/* harmony default export */ __webpack_exports__["default"] = (lt); +/* harmony default export */ __webpack_exports__["default"] = (assocPath); /***/ }), -/***/ "./node_modules/ramda/es/lte.js": -/*!**************************************!*\ - !*** ./node_modules/ramda/es/lte.js ***! - \**************************************/ +/***/ "./node_modules/ramda/es/bind.js": +/*!***************************************!*\ + !*** ./node_modules/ramda/es/bind.js ***! + \***************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); +/* harmony import */ var _internal_arity_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_arity.js */ "./node_modules/ramda/es/internal/_arity.js"); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); + /** - * Returns `true` if the first argument is less than or equal to the second; - * `false` otherwise. + * Creates a function that is bound to a context. + * Note: `R.bind` does not provide the additional argument-binding capabilities of + * [Function.prototype.bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind). * * @func * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig Ord a => a -> a -> Boolean - * @param {Number} a - * @param {Number} b - * @return {Boolean} - * @see R.gte + * @since v0.6.0 + * @category Function + * @category Object + * @sig (* -> *) -> {*} -> (* -> *) + * @param {Function} fn The function to bind to context + * @param {Object} thisObj The context to bind `fn` to + * @return {Function} A function that will execute in the context of `thisObj`. + * @see R.partial * @example * - * R.lte(2, 1); //=> false - * R.lte(2, 2); //=> true - * R.lte(2, 3); //=> true - * R.lte('a', 'z'); //=> true - * R.lte('z', 'a'); //=> false + * const log = R.bind(console.log, console); + * R.pipe(R.assoc('a', 2), R.tap(log), R.assoc('a', 3))({a: 1}); //=> {a: 3} + * // logs {a: 2} + * @symb R.bind(f, o)(a, b) = f.call(o, a, b) */ -var lte = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function lte(a, b) { - return a <= b; +var bind = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function bind(fn, thisObj) { + return (0,_internal_arity_js__WEBPACK_IMPORTED_MODULE_1__["default"])(fn.length, function () { + return fn.apply(thisObj, arguments); + }); }); -/* harmony default export */ __webpack_exports__["default"] = (lte); +/* harmony default export */ __webpack_exports__["default"] = (bind); /***/ }), -/***/ "./node_modules/ramda/es/map.js": -/*!**************************************!*\ - !*** ./node_modules/ramda/es/map.js ***! - \**************************************/ +/***/ "./node_modules/ramda/es/clone.js": +/*!****************************************!*\ + !*** ./node_modules/ramda/es/clone.js ***! + \****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_arrayReduce_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_arrayReduce.js */ "./node_modules/ramda/es/internal/_arrayReduce.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_map_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_map.js */ "./node_modules/ramda/es/internal/_map.js"); -/* harmony import */ var _internal_xmap_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./internal/_xmap.js */ "./node_modules/ramda/es/internal/_xmap.js"); -/* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./curryN.js */ "./node_modules/ramda/es/curryN.js"); -/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./keys.js */ "./node_modules/ramda/es/keys.js"); - - - - - +/* harmony import */ var _internal_clone_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_clone.js */ "./node_modules/ramda/es/internal/_clone.js"); +/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); /** - * Takes a function and - * a [functor](https://github.com/fantasyland/fantasy-land#functor), - * applies the function to each of the functor's values, and returns - * a functor of the same shape. - * - * Ramda provides suitable `map` implementations for `Array` and `Object`, - * so this function may be applied to `[1, 2, 3]` or `{x: 1, y: 2, z: 3}`. - * - * Dispatches to the `map` method of the second argument, if present. + * Creates a deep copy of the source that can be used in place of the source + * object without retaining any references to it. + * The source object may contain (nested) `Array`s and `Object`s, + * `Number`s, `String`s, `Boolean`s and `Date`s. + * `Function`s are assigned by reference rather than copied. * - * Acts as a transducer if a transformer is given in list position. + * Dispatches to a `clone` method if present. * - * Also treats functions as functors and will compose them together. + * Note that if the source object has multiple nodes that share a reference, + * the returned object will have the same structure, but the references will + * be pointed to the location within the cloned value. * * @func * @memberOf R * @since v0.1.0 - * @category List - * @sig Functor f => (a -> b) -> f a -> f b - * @param {Function} fn The function to be called on every element of the input `list`. - * @param {Array} list The list to be iterated over. - * @return {Array} The new list. - * @see R.transduce, R.addIndex, R.pluck, R.project + * @category Object + * @sig {*} -> {*} + * @param {*} value The object or array to clone + * @return {*} A deeply cloned copy of `val` * @example * - * const double = x => x * 2; - * - * R.map(double, [1, 2, 3]); //=> [2, 4, 6] - * - * R.map(double, {x: 1, y: 2, z: 3}); //=> {x: 2, y: 4, z: 6} - * @symb R.map(f, [a, b]) = [f(a), f(b)] - * @symb R.map(f, { x: a, y: b }) = { x: f(a), y: f(b) } - * @symb R.map(f, functor_o) = functor_o.map(f) + * const objects = [{}, {}, {}]; + * const objectsClone = R.clone(objects); + * objects === objectsClone; //=> false + * objects[0] === objectsClone[0]; //=> false */ -var map = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_2__["default"])(['fantasy-land/map', 'map'], _internal_xmap_js__WEBPACK_IMPORTED_MODULE_4__["default"], function map(fn, functor) { - switch (Object.prototype.toString.call(functor)) { - case '[object Function]': - return (0,_curryN_js__WEBPACK_IMPORTED_MODULE_5__["default"])(functor.length, function () { - return fn.call(this, functor.apply(this, arguments)); - }); - case '[object Object]': - return (0,_internal_arrayReduce_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (acc, key) { - acc[key] = fn(functor[key]); - return acc; - }, {}, (0,_keys_js__WEBPACK_IMPORTED_MODULE_6__["default"])(functor)); - default: - return (0,_internal_map_js__WEBPACK_IMPORTED_MODULE_3__["default"])(fn, functor); - } -})); -/* harmony default export */ __webpack_exports__["default"] = (map); +var clone = /*#__PURE__*/ +(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function clone(value) { + return value != null && typeof value.clone === 'function' ? value.clone() : (0,_internal_clone_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value, true); +}); +/* harmony default export */ __webpack_exports__["default"] = (clone); /***/ }), -/***/ "./node_modules/ramda/es/mapAccum.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/mapAccum.js ***! - \*******************************************/ +/***/ "./node_modules/ramda/es/comparator.js": +/*!*********************************************!*\ + !*** ./node_modules/ramda/es/comparator.js ***! + \*********************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); +/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); /** - * The `mapAccum` function behaves like a combination of map and reduce; it - * applies a function to each element of a list, passing an accumulating - * parameter from left to right, and returning a final value of this - * accumulator together with the new list. - * - * The iterator function receives two arguments, *acc* and *value*, and should - * return a tuple *[acc, value]*. + * Makes a comparator function out of a function that reports whether the first + * element is less than the second. * * @func * @memberOf R - * @since v0.10.0 - * @category List - * @sig ((acc, x) -> (acc, y)) -> acc -> [x] -> (acc, [y]) - * @param {Function} fn The function to be called on every element of the input `list`. - * @param {*} acc The accumulator value. - * @param {Array} list The list to iterate over. - * @return {*} The final, accumulated value. - * @see R.scan, R.addIndex, R.mapAccumRight + * @since v0.1.0 + * @category Function + * @sig ((a, b) -> Boolean) -> ((a, b) -> Number) + * @param {Function} pred A predicate function of arity two which will return `true` if the first argument + * is less than the second, `false` otherwise + * @return {Function} A Function :: a -> b -> Int that returns `-1` if a < b, `1` if b < a, otherwise `0` * @example * - * const digits = ['1', '2', '3', '4']; - * const appender = (a, b) => [a + b, a + b]; - * - * R.mapAccum(appender, 0, digits); //=> ['01234', ['01', '012', '0123', '01234']] - * @symb R.mapAccum(f, a, [b, c, d]) = [ - * f(f(f(a, b)[0], c)[0], d)[0], - * [ - * f(a, b)[1], - * f(f(a, b)[0], c)[1], - * f(f(f(a, b)[0], c)[0], d)[1] - * ] - * ] + * const byAge = R.comparator((a, b) => a.age < b.age); + * const people = [ + * { name: 'Emma', age: 70 }, + * { name: 'Peter', age: 78 }, + * { name: 'Mikhail', age: 62 }, + * ]; + * const peopleByIncreasingAge = R.sort(byAge, people); + * //=> [{ name: 'Mikhail', age: 62 },{ name: 'Emma', age: 70 }, { name: 'Peter', age: 78 }] */ -var mapAccum = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function mapAccum(fn, acc, list) { - var idx = 0; - var len = list.length; - var result = []; - var tuple = [acc]; - while (idx < len) { - tuple = fn(tuple[0], list[idx]); - result[idx] = tuple[1]; - idx += 1; - } - return [tuple[0], result]; +var comparator = /*#__PURE__*/ +(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function comparator(pred) { + return function (a, b) { + return pred(a, b) ? -1 : pred(b, a) ? 1 : 0; + }; }); -/* harmony default export */ __webpack_exports__["default"] = (mapAccum); +/* harmony default export */ __webpack_exports__["default"] = (comparator); /***/ }), -/***/ "./node_modules/ramda/es/mapAccumRight.js": -/*!************************************************!*\ - !*** ./node_modules/ramda/es/mapAccumRight.js ***! - \************************************************/ +/***/ "./node_modules/ramda/es/concat.js": +/*!*****************************************!*\ + !*** ./node_modules/ramda/es/concat.js ***! + \*****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); +/* harmony import */ var _internal_isFunction_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./internal/_isFunction.js */ "./node_modules/ramda/es/internal/_isFunction.js"); +/* harmony import */ var _internal_isString_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_isString.js */ "./node_modules/ramda/es/internal/_isString.js"); +/* harmony import */ var _toString_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./toString.js */ "./node_modules/ramda/es/toString.js"); + + + + /** - * The `mapAccumRight` function behaves like a combination of map and reduce; it - * applies a function to each element of a list, passing an accumulating - * parameter from right to left, and returning a final value of this - * accumulator together with the new list. + * Returns the result of concatenating the given lists or strings. * - * Similar to [`mapAccum`](#mapAccum), except moves through the input list from - * the right to the left. + * Note: `R.concat` expects both arguments to be of the same type, + * unlike the native `Array.prototype.concat` method. It will throw + * an error if you `concat` an Array with a non-Array value. * - * The iterator function receives two arguments, *acc* and *value*, and should - * return a tuple *[acc, value]*. + * Dispatches to the `concat` method of the first argument, if present. + * Can also concatenate two members of a [fantasy-land + * compatible semigroup](https://github.com/fantasyland/fantasy-land#semigroup). * * @func * @memberOf R - * @since v0.10.0 + * @since v0.1.0 * @category List - * @sig ((acc, x) -> (acc, y)) -> acc -> [x] -> (acc, [y]) - * @param {Function} fn The function to be called on every element of the input `list`. - * @param {*} acc The accumulator value. - * @param {Array} list The list to iterate over. - * @return {*} The final, accumulated value. - * @see R.addIndex, R.mapAccum - * @example + * @sig [a] -> [a] -> [a] + * @sig String -> String -> String + * @param {Array|String} firstList The first list + * @param {Array|String} secondList The second list + * @return {Array|String} A list consisting of the elements of `firstList` followed by the elements of + * `secondList`. * - * const digits = ['1', '2', '3', '4']; - * const appender = (a, b) => [b + a, b + a]; + * @example * - * R.mapAccumRight(appender, 5, digits); //=> ['12345', ['12345', '2345', '345', '45']] - * @symb R.mapAccumRight(f, a, [b, c, d]) = [ - * f(f(f(a, d)[0], c)[0], b)[0], - * [ - * f(a, d)[1], - * f(f(a, d)[0], c)[1], - * f(f(f(a, d)[0], c)[0], b)[1] - * ] - * ] + * R.concat('ABC', 'DEF'); // 'ABCDEF' + * R.concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3] + * R.concat([], []); //=> [] */ -var mapAccumRight = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function mapAccumRight(fn, acc, list) { - var idx = list.length - 1; - var result = []; - var tuple = [acc]; - while (idx >= 0) { - tuple = fn(tuple[0], list[idx]); - result[idx] = tuple[1]; - idx -= 1; +var concat = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function concat(a, b) { + if ((0,_internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(a)) { + if ((0,_internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(b)) { + return a.concat(b); + } + throw new TypeError((0,_toString_js__WEBPACK_IMPORTED_MODULE_2__["default"])(b) + ' is not an array'); + } + if ((0,_internal_isString_js__WEBPACK_IMPORTED_MODULE_3__["default"])(a)) { + if ((0,_internal_isString_js__WEBPACK_IMPORTED_MODULE_3__["default"])(b)) { + return a + b; + } + throw new TypeError((0,_toString_js__WEBPACK_IMPORTED_MODULE_2__["default"])(b) + ' is not a string'); + } + if (a != null && (0,_internal_isFunction_js__WEBPACK_IMPORTED_MODULE_4__["default"])(a['fantasy-land/concat'])) { + return a['fantasy-land/concat'](b); + } + if (a != null && (0,_internal_isFunction_js__WEBPACK_IMPORTED_MODULE_4__["default"])(a.concat)) { + return a.concat(b); } - return [tuple[0], result]; + throw new TypeError((0,_toString_js__WEBPACK_IMPORTED_MODULE_2__["default"])(a) + ' does not have a method named "concat" or "fantasy-land/concat"'); }); -/* harmony default export */ __webpack_exports__["default"] = (mapAccumRight); +/* harmony default export */ __webpack_exports__["default"] = (concat); /***/ }), -/***/ "./node_modules/ramda/es/mapObjIndexed.js": -/*!************************************************!*\ - !*** ./node_modules/ramda/es/mapObjIndexed.js ***! - \************************************************/ +/***/ "./node_modules/ramda/es/converge.js": +/*!*******************************************!*\ + !*** ./node_modules/ramda/es/converge.js ***! + \*******************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_arrayReduce_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_arrayReduce.js */ "./node_modules/ramda/es/internal/_arrayReduce.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./keys.js */ "./node_modules/ramda/es/keys.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_map_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./internal/_map.js */ "./node_modules/ramda/es/internal/_map.js"); +/* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./curryN.js */ "./node_modules/ramda/es/curryN.js"); +/* harmony import */ var _max_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./max.js */ "./node_modules/ramda/es/max.js"); +/* harmony import */ var _pluck_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pluck.js */ "./node_modules/ramda/es/pluck.js"); +/* harmony import */ var _reduce_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./reduce.js */ "./node_modules/ramda/es/reduce.js"); + + + /** - * An Object-specific version of [`map`](#map). The function is applied to three - * arguments: *(value, key, obj)*. If only the value is significant, use - * [`map`](#map) instead. + * Accepts a converging function and a list of branching functions and returns + * a new function. The arity of the new function is the same as the arity of + * the longest branching function. When invoked, this new function is applied + * to some arguments, and each branching function is applied to those same + * arguments. The results of each branching function are passed as arguments + * to the converging function to produce the return value. * * @func * @memberOf R - * @since v0.9.0 - * @category Object - * @sig ((*, String, Object) -> *) -> Object -> Object - * @param {Function} fn - * @param {Object} obj - * @return {Object} - * @see R.map + * @since v0.4.2 + * @category Function + * @sig ((x1, x2, ...) -> z) -> [((a, b, ...) -> x1), ((a, b, ...) -> x2), ...] -> (a -> b -> ... -> z) + * @param {Function} after A function. `after` will be invoked with the return values of + * `fn1` and `fn2` as its arguments. + * @param {Array} functions A list of functions. + * @return {Function} A new function. + * @see R.useWith * @example * - * const xyz = { x: 1, y: 2, z: 3 }; - * const prependKeyAndDouble = (num, key, obj) => key + (num * 2); + * const average = R.converge(R.divide, [R.sum, R.length]) + * average([1, 2, 3, 4, 5, 6, 7]) //=> 4 * - * R.mapObjIndexed(prependKeyAndDouble, xyz); //=> { x: 'x2', y: 'y4', z: 'z6' } + * const strangeConcat = R.converge(R.concat, [R.toUpper, R.toLower]) + * strangeConcat("Yodel") //=> "YODELyodel" + * + * @symb R.converge(f, [g, h])(a, b) = f(g(a, b), h(a, b)) */ -var mapObjIndexed = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function mapObjIndexed(fn, obj) { - return (0,_internal_arrayReduce_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (acc, key) { - acc[key] = fn(obj[key], key, obj); - return acc; - }, {}, (0,_keys_js__WEBPACK_IMPORTED_MODULE_2__["default"])(obj)); +var converge = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function converge(after, fns) { + return (0,_curryN_js__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_reduce_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_max_js__WEBPACK_IMPORTED_MODULE_3__["default"], 0, (0,_pluck_js__WEBPACK_IMPORTED_MODULE_4__["default"])('length', fns)), function () { + var args = arguments; + var context = this; + return after.apply(context, (0,_internal_map_js__WEBPACK_IMPORTED_MODULE_5__["default"])(function (fn) { + return fn.apply(context, args); + }, fns)); + }); }); -/* harmony default export */ __webpack_exports__["default"] = (mapObjIndexed); +/* harmony default export */ __webpack_exports__["default"] = (converge); /***/ }), -/***/ "./node_modules/ramda/es/match.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/match.js ***! - \****************************************/ +/***/ "./node_modules/ramda/es/curryN.js": +/*!*****************************************!*\ + !*** ./node_modules/ramda/es/curryN.js ***! + \*****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); +/* harmony import */ var _internal_arity_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_arity.js */ "./node_modules/ramda/es/internal/_arity.js"); +/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_curryN_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_curryN.js */ "./node_modules/ramda/es/internal/_curryN.js"); + + + /** - * Tests a regular expression against a String. Note that this function will - * return an empty array when there are no matches. This differs from - * [`String.prototype.match`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match) - * which returns `null` when there are no matches. + * Returns a curried equivalent of the provided function, with the specified + * arity. The curried function has two unusual capabilities. First, its + * arguments needn't be provided one at a time. If `g` is `R.curryN(3, f)`, the + * following are equivalent: + * + * - `g(1)(2)(3)` + * - `g(1)(2, 3)` + * - `g(1, 2)(3)` + * - `g(1, 2, 3)` + * + * Secondly, the special placeholder value [`R.__`](#__) may be used to specify + * "gaps", allowing partial application of any combination of arguments, + * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__), + * the following are equivalent: + * + * - `g(1, 2, 3)` + * - `g(_, 2, 3)(1)` + * - `g(_, _, 3)(1)(2)` + * - `g(_, _, 3)(1, 2)` + * - `g(_, 2)(1)(3)` + * - `g(_, 2)(1, 3)` + * - `g(_, 2)(_, 3)(1)` * * @func * @memberOf R - * @since v0.1.0 - * @category String - * @sig RegExp -> String -> [String | Undefined] - * @param {RegExp} rx A regular expression. - * @param {String} str The string to match against - * @return {Array} The list of matches or empty array. - * @see R.test + * @since v0.5.0 + * @category Function + * @sig Number -> (* -> a) -> (* -> a) + * @param {Number} length The arity for the returned function. + * @param {Function} fn The function to curry. + * @return {Function} A new, curried function. + * @see R.curry * @example * - * R.match(/([a-z]a)/g, 'bananas'); //=> ['ba', 'na', 'na'] - * R.match(/a/, 'b'); //=> [] - * R.match(/a/, null); //=> TypeError: null does not have a method named "match" + * const sumArgs = (...args) => R.sum(args); + * + * const curriedAddFourNumbers = R.curryN(4, sumArgs); + * const f = curriedAddFourNumbers(1, 2); + * const g = f(3); + * g(4); //=> 10 */ -var match = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function match(rx, str) { - return str.match(rx) || []; +var curryN = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function curryN(length, fn) { + if (length === 1) { + return (0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__["default"])(fn); + } + return (0,_internal_arity_js__WEBPACK_IMPORTED_MODULE_2__["default"])(length, (0,_internal_curryN_js__WEBPACK_IMPORTED_MODULE_3__["default"])(length, [], fn)); }); -/* harmony default export */ __webpack_exports__["default"] = (match); +/* harmony default export */ __webpack_exports__["default"] = (curryN); /***/ }), -/***/ "./node_modules/ramda/es/mathMod.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/mathMod.js ***! - \******************************************/ +/***/ "./node_modules/ramda/es/defaultTo.js": +/*!********************************************!*\ + !*** ./node_modules/ramda/es/defaultTo.js ***! + \********************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_isInteger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isInteger.js */ "./node_modules/ramda/es/internal/_isInteger.js"); - /** - * `mathMod` behaves like the modulo operator should mathematically, unlike the - * `%` operator (and by extension, [`R.modulo`](#modulo)). So while - * `-17 % 5` is `-2`, `mathMod(-17, 5)` is `3`. `mathMod` requires Integer - * arguments, and returns NaN when the modulus is zero or negative. + * Returns the second argument if it is not `null`, `undefined` or `NaN`; + * otherwise the first argument is returned. * * @func * @memberOf R - * @since v0.3.0 - * @category Math - * @sig Number -> Number -> Number - * @param {Number} m The dividend. - * @param {Number} p the modulus. - * @return {Number} The result of `b mod a`. - * @see R.modulo + * @since v0.10.0 + * @category Logic + * @sig a -> b -> a | b + * @param {a} default The default value. + * @param {b} val `val` will be returned instead of `default` unless `val` is `null`, `undefined` or `NaN`. + * @return {*} The second value if it is not `null`, `undefined` or `NaN`, otherwise the default value * @example * - * R.mathMod(-17, 5); //=> 3 - * R.mathMod(17, 5); //=> 2 - * R.mathMod(17, -5); //=> NaN - * R.mathMod(17, 0); //=> NaN - * R.mathMod(17.2, 5); //=> NaN - * R.mathMod(17, 5.3); //=> NaN - * - * const clock = R.mathMod(R.__, 12); - * clock(15); //=> 3 - * clock(24); //=> 0 + * const defaultTo42 = R.defaultTo(42); * - * const seventeenMod = R.mathMod(17); - * seventeenMod(3); //=> 2 - * seventeenMod(4); //=> 1 - * seventeenMod(10); //=> 7 + * defaultTo42(null); //=> 42 + * defaultTo42(undefined); //=> 42 + * defaultTo42(false); //=> false + * defaultTo42('Ramda'); //=> 'Ramda' + * // parseInt('string') results in NaN + * defaultTo42(parseInt('string')); //=> 42 */ -var mathMod = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function mathMod(m, p) { - if (!(0,_internal_isInteger_js__WEBPACK_IMPORTED_MODULE_1__["default"])(m)) { - return NaN; - } - if (!(0,_internal_isInteger_js__WEBPACK_IMPORTED_MODULE_1__["default"])(p) || p < 1) { - return NaN; - } - return (m % p + p) % p; +var defaultTo = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function defaultTo(d, v) { + return v == null || v !== v ? d : v; }); -/* harmony default export */ __webpack_exports__["default"] = (mathMod); +/* harmony default export */ __webpack_exports__["default"] = (defaultTo); /***/ }), -/***/ "./node_modules/ramda/es/max.js": -/*!**************************************!*\ - !*** ./node_modules/ramda/es/max.js ***! - \**************************************/ +/***/ "./node_modules/ramda/es/difference.js": +/*!*********************************************!*\ + !*** ./node_modules/ramda/es/difference.js ***! + \*********************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _toString_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./toString.js */ "./node_modules/ramda/es/toString.js"); +/* harmony import */ var _internal_Set_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_Set.js */ "./node_modules/ramda/es/internal/_Set.js"); /** - * Returns the larger of its two arguments. + * Finds the set (i.e. no duplicates) of all elements in the first list not + * contained in the second list. Objects and Arrays are compared in terms of + * value equality, not reference equality. * * @func * @memberOf R * @since v0.1.0 * @category Relation - * @sig Ord a => a -> a -> a - * @param {*} a - * @param {*} b - * @return {*} - * @see R.maxBy, R.min + * @sig [*] -> [*] -> [*] + * @param {Array} list1 The first list. + * @param {Array} list2 The second list. + * @return {Array} The elements in `list1` that are not in `list2`. + * @see R.differenceWith, R.symmetricDifference, R.symmetricDifferenceWith, R.without * @example * - * R.max(789, 123); //=> 789 - * R.max('a', 'b'); //=> 'b' + * R.difference([1,2,3,4], [7,6,5,4,3]); //=> [1,2] + * R.difference([7,6,5,4,3], [1,2,3,4]); //=> [7,6,5] + * R.difference([{a: 1}, {b: 2}], [{a: 1}, {c: 3}]) //=> [{b: 2}] */ -var max = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function max(a, b) { - if (a === b) { - return b; +var difference = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function difference(first, second) { + var out = []; + var idx = 0; + var firstLen = first.length; + var secondLen = second.length; + var toFilterOut = new _internal_Set_js__WEBPACK_IMPORTED_MODULE_1__["default"](); + for (var i = 0; i < secondLen; i += 1) { + toFilterOut.add(second[i]); } - function safeMax(x, y) { - if (x > y !== y > x) { - return y > x ? y : x; + while (idx < firstLen) { + if (toFilterOut.add(first[idx])) { + out[out.length] = first[idx]; } - return undefined; - } - var maxByValue = safeMax(a, b); - if (maxByValue !== undefined) { - return maxByValue; - } - var maxByType = safeMax(typeof a, typeof b); - if (maxByType !== undefined) { - return maxByType === typeof a ? a : b; - } - var stringA = (0,_toString_js__WEBPACK_IMPORTED_MODULE_1__["default"])(a); - var maxByStringValue = safeMax(stringA, (0,_toString_js__WEBPACK_IMPORTED_MODULE_1__["default"])(b)); - if (maxByStringValue !== undefined) { - return maxByStringValue === stringA ? a : b; + idx += 1; } - return b; + return out; }); -/* harmony default export */ __webpack_exports__["default"] = (max); +/* harmony default export */ __webpack_exports__["default"] = (difference); /***/ }), -/***/ "./node_modules/ramda/es/maxBy.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/maxBy.js ***! - \****************************************/ +/***/ "./node_modules/ramda/es/dissoc.js": +/*!*****************************************!*\ + !*** ./node_modules/ramda/es/dissoc.js ***! + \*****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _max_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./max.js */ "./node_modules/ramda/es/max.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _dissocPath_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dissocPath.js */ "./node_modules/ramda/es/dissocPath.js"); /** - * Takes a function and two values, and returns whichever value produces the - * larger result when passed to the provided function. + * Returns a new object that does not contain a `prop` property. * * @func * @memberOf R - * @since v0.8.0 - * @category Relation - * @sig Ord b => (a -> b) -> a -> a -> a - * @param {Function} f - * @param {*} a - * @param {*} b - * @return {*} - * @see R.max, R.minBy + * @since v0.10.0 + * @category Object + * @sig String -> {k: v} -> {k: v} + * @param {String} prop The name of the property to dissociate + * @param {Object} obj The object to clone + * @return {Object} A new object equivalent to the original but without the specified property + * @see R.assoc, R.omit * @example * - * // square :: Number -> Number - * const square = n => n * n; - * - * R.maxBy(square, -3, 2); //=> -3 - * - * R.reduce(R.maxBy(square), 0, [3, -5, 4, 1, -2]); //=> -5 - * R.reduce(R.maxBy(square), 0, []); //=> 0 + * R.dissoc('b', {a: 1, b: 2, c: 3}); //=> {a: 1, c: 3} */ -var maxBy = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function maxBy(f, a, b) { - var resultB = f(b); - return (0,_max_js__WEBPACK_IMPORTED_MODULE_1__["default"])(f(a), resultB) === resultB ? b : a; +var dissoc = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function dissoc(prop, obj) { + return (0,_dissocPath_js__WEBPACK_IMPORTED_MODULE_1__["default"])([prop], obj); }); -/* harmony default export */ __webpack_exports__["default"] = (maxBy); +/* harmony default export */ __webpack_exports__["default"] = (dissoc); /***/ }), -/***/ "./node_modules/ramda/es/mean.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/mean.js ***! - \***************************************/ +/***/ "./node_modules/ramda/es/dissocPath.js": +/*!*********************************************!*\ + !*** ./node_modules/ramda/es/dissocPath.js ***! + \*********************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _sum_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sum.js */ "./node_modules/ramda/es/sum.js"); - - -/** - * Returns the mean of the given list of numbers. - * - * @func - * @memberOf R - * @since v0.14.0 - * @category Math - * @sig [Number] -> Number - * @param {Array} list - * @return {Number} - * @see R.median - * @example - * - * R.mean([2, 7, 9]); //=> 6 - * R.mean([]); //=> NaN - */ +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_dissoc_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_dissoc.js */ "./node_modules/ramda/es/internal/_dissoc.js"); +/* harmony import */ var _internal_isInteger_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_isInteger.js */ "./node_modules/ramda/es/internal/_isInteger.js"); +/* harmony import */ var _internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); +/* harmony import */ var _assoc_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./assoc.js */ "./node_modules/ramda/es/assoc.js"); -var mean = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function mean(list) { - return (0,_sum_js__WEBPACK_IMPORTED_MODULE_1__["default"])(list) / list.length; -}); -/* harmony default export */ __webpack_exports__["default"] = (mean); -/***/ }), -/***/ "./node_modules/ramda/es/median.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/median.js ***! - \*****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _mean_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mean.js */ "./node_modules/ramda/es/mean.js"); +/** + * Makes a shallow clone of an object. Note that this copies and flattens + * prototype properties onto the new object as well. All non-primitive + * properties are copied by reference. + * + * @private + * @param {String|Integer} prop The prop operating + * @param {Object|Array} obj The object to clone + * @return {Object|Array} A new object equivalent to the original. + */ +function _shallowCloneObject(prop, obj) { + if ((0,_internal_isInteger_js__WEBPACK_IMPORTED_MODULE_0__["default"])(prop) && (0,_internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(obj)) { + return [].concat(obj); + } + var result = {}; + for (var p in obj) { + result[p] = obj[p]; + } + return result; +} /** - * Returns the median of the given list of numbers. + * Makes a shallow clone of an object, omitting the property at the given path. + * Note that this copies and flattens prototype properties onto the new object + * as well. All non-primitive properties are copied by reference. * * @func * @memberOf R - * @since v0.14.0 - * @category Math - * @sig [Number] -> Number - * @param {Array} list - * @return {Number} - * @see R.mean + * @since v0.11.0 + * @category Object + * @typedefn Idx = String | Int | Symbol + * @sig [Idx] -> {k: v} -> {k: v} + * @param {Array} path The path to the value to omit + * @param {Object} obj The object to clone + * @return {Object} A new object without the property at path + * @see R.assocPath * @example * - * R.median([2, 9, 7]); //=> 7 - * R.median([7, 2, 10, 9]); //=> 8 - * R.median([]); //=> NaN + * R.dissocPath(['a', 'b', 'c'], {a: {b: {c: 42}}}); //=> {a: {b: {}}} */ -var median = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function median(list) { - var len = list.length; - if (len === 0) { - return NaN; - } - var width = 2 - len % 2; - var idx = (len - width) / 2; - return (0,_mean_js__WEBPACK_IMPORTED_MODULE_1__["default"])(Array.prototype.slice.call(list, 0).sort(function (a, b) { - return a < b ? -1 : a > b ? 1 : 0; - }).slice(idx, idx + width)); +var dissocPath = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_2__["default"])(function dissocPath(path, obj) { + if (obj == null) { + return obj; + } + switch (path.length) { + case 0: + return obj; + case 1: + return (0,_internal_dissoc_js__WEBPACK_IMPORTED_MODULE_3__["default"])(path[0], obj); + default: + var head = path[0]; + var tail = Array.prototype.slice.call(path, 1); + if (obj[head] == null) { + return _shallowCloneObject(head, obj); + } else { + return (0,_assoc_js__WEBPACK_IMPORTED_MODULE_4__["default"])(head, dissocPath(tail, obj[head]), obj); + } + } }); -/* harmony default export */ __webpack_exports__["default"] = (median); +/* harmony default export */ __webpack_exports__["default"] = (dissocPath); /***/ }), -/***/ "./node_modules/ramda/es/memoizeWith.js": -/*!**********************************************!*\ - !*** ./node_modules/ramda/es/memoizeWith.js ***! - \**********************************************/ +/***/ "./node_modules/ramda/es/empty.js": +/*!****************************************!*\ + !*** ./node_modules/ramda/es/empty.js ***! + \****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_arity_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_arity.js */ "./node_modules/ramda/es/internal/_arity.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_has_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_has.js */ "./node_modules/ramda/es/internal/_has.js"); +/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +/* harmony import */ var _internal_isArguments_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./internal/_isArguments.js */ "./node_modules/ramda/es/internal/_isArguments.js"); +/* harmony import */ var _internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); +/* harmony import */ var _internal_isObject_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_isObject.js */ "./node_modules/ramda/es/internal/_isObject.js"); +/* harmony import */ var _internal_isString_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_isString.js */ "./node_modules/ramda/es/internal/_isString.js"); +/* harmony import */ var _internal_isTypedArray_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./internal/_isTypedArray.js */ "./node_modules/ramda/es/internal/_isTypedArray.js"); + + + /** - * Takes a string-returning function `keyGen` and a function `fn` and returns - * a new function that returns cached results for subsequent - * calls with the same arguments. - * - * When the function is invoked, `keyGen` is applied to the same arguments - * and its result becomes the cache key. If the cache contains something - * under that key, the function simply returns it and does not invoke `fn` at all. - * - * Otherwise `fn` is applied to the same arguments and its return value - * is cached under that key and returned by the function. + * Returns the empty value of its argument's type. Ramda defines the empty + * value of Array (`[]`), Object (`{}`), String (`''`), + * TypedArray (`Uint8Array []`, `Float32Array []`, etc), and Arguments. Other + * types are supported if they define `.empty`, + * `.prototype.empty` or implement the + * [FantasyLand Monoid spec](https://github.com/fantasyland/fantasy-land#monoid). * - * Care must be taken when implementing `keyGen` to avoid key collision, - * or if tracking references, memory leaks and mutating arguments. + * Dispatches to the `empty` method of the first argument, if present. * * @func * @memberOf R - * @since v0.24.0 + * @since v0.3.0 * @category Function - * @sig (*... -> String) -> (*... -> a) -> (*... -> a) - * @param {Function} keyGen The function to generate the cache key. - * @param {Function} fn The function to memoize. - * @return {Function} Memoized version of `fn`. + * @sig a -> a + * @param {*} x + * @return {*} * @example - * const withAge = memoizeWith(o => `${o.birth}/${o.death}`, ({birth, death}) => { - * // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^ - * // keyGen fn - * console.log(`computing age for ${birth}/${death}`); - * return ({birth, death, age: death - birth}); - * }); * - * withAge({birth: 1921, death: 1999}); - * //=> LOG: computing age for 1921/1999 - * //=> {birth: 1921, death: 1999, age: 78} (returned from fn) - * - * withAge({birth: 1921, death: 1999}); - * //=> {birth: 1921, death: 1999, age: 78} (returned from cache) + * R.empty(Just(42)); //=> Nothing() + * R.empty([1, 2, 3]); //=> [] + * R.empty('unicorns'); //=> '' + * R.empty({x: 1, y: 2}); //=> {} + * R.empty(Uint8Array.from('123')); //=> Uint8Array [] */ -var memoizeWith = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function memoizeWith(keyGen, fn) { - var cache = {}; - return (0,_internal_arity_js__WEBPACK_IMPORTED_MODULE_0__["default"])(fn.length, function () { - var key = keyGen.apply(this, arguments); - if (!(0,_internal_has_js__WEBPACK_IMPORTED_MODULE_2__["default"])(key, cache)) { - cache[key] = fn.apply(this, arguments); - } - return cache[key]; - }); +var empty = /*#__PURE__*/ +(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function empty(x) { + return x != null && typeof x['fantasy-land/empty'] === 'function' ? x['fantasy-land/empty']() : x != null && x.constructor != null && typeof x.constructor['fantasy-land/empty'] === 'function' ? x.constructor['fantasy-land/empty']() : x != null && typeof x.empty === 'function' ? x.empty() : x != null && x.constructor != null && typeof x.constructor.empty === 'function' ? x.constructor.empty() : (0,_internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(x) ? [] : (0,_internal_isString_js__WEBPACK_IMPORTED_MODULE_2__["default"])(x) ? '' : (0,_internal_isObject_js__WEBPACK_IMPORTED_MODULE_3__["default"])(x) ? {} : (0,_internal_isArguments_js__WEBPACK_IMPORTED_MODULE_4__["default"])(x) ? function () { + return arguments; + }() : (0,_internal_isTypedArray_js__WEBPACK_IMPORTED_MODULE_5__["default"])(x) ? x.constructor.from('') : void 0 // else + ; }); -/* harmony default export */ __webpack_exports__["default"] = (memoizeWith); + +/* harmony default export */ __webpack_exports__["default"] = (empty); /***/ }), -/***/ "./node_modules/ramda/es/mergeAll.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/mergeAll.js ***! - \*******************************************/ +/***/ "./node_modules/ramda/es/equals.js": +/*!*****************************************!*\ + !*** ./node_modules/ramda/es/equals.js ***! + \*****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_objectAssign_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_objectAssign.js */ "./node_modules/ramda/es/internal/_objectAssign.js"); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_equals_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_equals.js */ "./node_modules/ramda/es/internal/_equals.js"); /** - * Creates one new object with the own properties from a list of objects. - * If a key exists in more than one object, the value from the last - * object it exists in will be used. + * Returns `true` if its arguments are equivalent, `false` otherwise. Handles + * cyclical data structures. + * + * Dispatches symmetrically to the `equals` methods of both arguments, if + * present. * * @func * @memberOf R - * @since v0.10.0 - * @category List - * @sig [{k: v}] -> {k: v} - * @param {Array} list An array of objects - * @return {Object} A merged object. - * @see R.reduce + * @since v0.15.0 + * @category Relation + * @sig a -> b -> Boolean + * @param {*} a + * @param {*} b + * @return {Boolean} * @example * - * R.mergeAll([{foo:1},{bar:2},{baz:3}]); //=> {foo:1,bar:2,baz:3} - * R.mergeAll([{foo:1},{foo:2},{bar:2}]); //=> {foo:2,bar:2} - * @symb R.mergeAll([{ x: 1 }, { y: 2 }, { z: 3 }]) = { x: 1, y: 2, z: 3 } + * R.equals(1, 1); //=> true + * R.equals(1, '1'); //=> false + * R.equals([1, 2, 3], [1, 2, 3]); //=> true + * + * const a = {}; a.v = a; + * const b = {}; b.v = b; + * R.equals(a, b); //=> true */ -var mergeAll = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function mergeAll(list) { - return _internal_objectAssign_js__WEBPACK_IMPORTED_MODULE_0__["default"].apply(null, [{}].concat(list)); +var equals = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function equals(a, b) { + return (0,_internal_equals_js__WEBPACK_IMPORTED_MODULE_1__["default"])(a, b, [], []); }); -/* harmony default export */ __webpack_exports__["default"] = (mergeAll); +/* harmony default export */ __webpack_exports__["default"] = (equals); /***/ }), -/***/ "./node_modules/ramda/es/mergeDeepLeft.js": -/*!************************************************!*\ - !*** ./node_modules/ramda/es/mergeDeepLeft.js ***! - \************************************************/ +/***/ "./node_modules/ramda/es/evolve.js": +/*!*****************************************!*\ + !*** ./node_modules/ramda/es/evolve.js ***! + \*****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _mergeDeepWithKey_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mergeDeepWithKey.js */ "./node_modules/ramda/es/mergeDeepWithKey.js"); +/* harmony import */ var _internal_isArray_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); +/* harmony import */ var _internal_isObject_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isObject.js */ "./node_modules/ramda/es/internal/_isObject.js"); + /** - * Creates a new object with the own properties of the first object merged with - * the own properties of the second object. If a key exists in both objects: - * - and both values are objects, the two values will be recursively merged - * - otherwise the value from the first object will be used. + * Creates a new object by recursively evolving a shallow copy of `object`, + * according to the `transformation` functions. All non-primitive properties + * are copied by reference. + * + * A `transformation` function will not be invoked if its corresponding key + * does not exist in the evolved object. * * @func * @memberOf R - * @since v0.24.0 + * @since v0.9.0 * @category Object - * @sig {a} -> {a} -> {a} - * @param {Object} lObj - * @param {Object} rObj - * @return {Object} - * @see R.merge, R.mergeDeepRight, R.mergeDeepWith, R.mergeDeepWithKey + * @sig {k: (v -> v)} -> {k: v} -> {k: v} + * @param {Object} transformations The object specifying transformation functions to apply + * to the object. + * @param {Object} object The object to be transformed. + * @return {Object} The transformed object. * @example * - * R.mergeDeepLeft({ name: 'fred', age: 10, contact: { email: 'moo@example.com' }}, - * { age: 40, contact: { email: 'baa@example.com' }}); - * //=> { name: 'fred', age: 10, contact: { email: 'moo@example.com' }} + * const tomato = {firstName: ' Tomato ', data: {elapsed: 100, remaining: 1400}, id:123}; + * const transformations = { + * firstName: R.trim, + * lastName: R.trim, // Will not get invoked. + * data: {elapsed: R.add(1), remaining: R.add(-1)} + * }; + * R.evolve(transformations, tomato); //=> {firstName: 'Tomato', data: {elapsed: 101, remaining: 1399}, id:123} */ -var mergeDeepLeft = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function mergeDeepLeft(lObj, rObj) { - return (0,_mergeDeepWithKey_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (k, lVal, rVal) { - return lVal; - }, lObj, rObj); +var evolve = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function evolve(transformations, object) { + if (!(0,_internal_isObject_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object) && !(0,_internal_isArray_js__WEBPACK_IMPORTED_MODULE_2__["default"])(object)) { + return object; + } + var result = object instanceof Array ? [] : {}; + var transformation, key, type; + for (key in object) { + transformation = transformations[key]; + type = typeof transformation; + result[key] = type === 'function' ? transformation(object[key]) : transformation && type === 'object' ? evolve(transformation, object[key]) : object[key]; + } + return result; }); -/* harmony default export */ __webpack_exports__["default"] = (mergeDeepLeft); +/* harmony default export */ __webpack_exports__["default"] = (evolve); /***/ }), -/***/ "./node_modules/ramda/es/mergeDeepRight.js": -/*!*************************************************!*\ - !*** ./node_modules/ramda/es/mergeDeepRight.js ***! - \*************************************************/ +/***/ "./node_modules/ramda/es/filter.js": +/*!*****************************************!*\ + !*** ./node_modules/ramda/es/filter.js ***! + \*****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); +/* harmony import */ var _internal_arrayReduce_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./internal/_arrayReduce.js */ "./node_modules/ramda/es/internal/_arrayReduce.js"); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _mergeDeepWithKey_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mergeDeepWithKey.js */ "./node_modules/ramda/es/mergeDeepWithKey.js"); - +/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); +/* harmony import */ var _internal_filter_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./internal/_filter.js */ "./node_modules/ramda/es/internal/_filter.js"); +/* harmony import */ var _internal_isObject_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_isObject.js */ "./node_modules/ramda/es/internal/_isObject.js"); +/* harmony import */ var _internal_xfilter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xfilter.js */ "./node_modules/ramda/es/internal/_xfilter.js"); +/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./keys.js */ "./node_modules/ramda/es/keys.js"); -/** - * Creates a new object with the own properties of the first object merged with - * the own properties of the second object. If a key exists in both objects: - * - and both values are objects, the two values will be recursively merged - * - otherwise the value from the second object will be used. - * - * @func - * @memberOf R - * @since v0.24.0 - * @category Object - * @sig {a} -> {a} -> {a} - * @param {Object} lObj - * @param {Object} rObj - * @return {Object} - * @see R.merge, R.mergeDeepLeft, R.mergeDeepWith, R.mergeDeepWithKey - * @example - * - * R.mergeDeepRight({ name: 'fred', age: 10, contact: { email: 'moo@example.com' }}, - * { age: 40, contact: { email: 'baa@example.com' }}); - * //=> { name: 'fred', age: 40, contact: { email: 'baa@example.com' }} - */ -var mergeDeepRight = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function mergeDeepRight(lObj, rObj) { - return (0,_mergeDeepWithKey_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (k, lVal, rVal) { - return rVal; - }, lObj, rObj); -}); -/* harmony default export */ __webpack_exports__["default"] = (mergeDeepRight); -/***/ }), -/***/ "./node_modules/ramda/es/mergeDeepWith.js": -/*!************************************************!*\ - !*** ./node_modules/ramda/es/mergeDeepWith.js ***! - \************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _mergeDeepWithKey_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mergeDeepWithKey.js */ "./node_modules/ramda/es/mergeDeepWithKey.js"); /** - * Creates a new object with the own properties of the two provided objects. - * If a key exists in both objects: - * - and both associated values are also objects then the values will be - * recursively merged. - * - otherwise the provided function is applied to associated values using the - * resulting value as the new value associated with the key. - * If a key only exists in one object, the value will be associated with the key - * of the resulting object. + * Takes a predicate and a `Filterable`, and returns a new filterable of the + * same type containing the members of the given filterable which satisfy the + * given predicate. Filterable objects include plain objects or any object + * that has a filter method such as `Array`. + * + * Dispatches to the `filter` method of the second argument, if present. + * + * Acts as a transducer if a transformer is given in list position. * * @func * @memberOf R - * @since v0.24.0 + * @since v0.1.0 + * @category List * @category Object - * @sig ((a, a) -> a) -> {a} -> {a} -> {a} - * @param {Function} fn - * @param {Object} lObj - * @param {Object} rObj - * @return {Object} - * @see R.mergeWith, R.mergeDeepWithKey + * @sig Filterable f => (a -> Boolean) -> f a -> f a + * @param {Function} pred + * @param {Array} filterable + * @return {Array} Filterable + * @see R.reject, R.transduce, R.addIndex * @example * - * R.mergeDeepWith(R.concat, - * { a: true, c: { values: [10, 20] }}, - * { b: true, c: { values: [15, 35] }}); - * //=> { a: true, b: true, c: { values: [10, 20, 15, 35] }} + * const isEven = n => n % 2 === 0; + * + * R.filter(isEven, [1, 2, 3, 4]); //=> [2, 4] + * + * R.filter(isEven, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4} */ -var mergeDeepWith = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function mergeDeepWith(fn, lObj, rObj) { - return (0,_mergeDeepWithKey_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (k, lVal, rVal) { - return fn(lVal, rVal); - }, lObj, rObj); -}); -/* harmony default export */ __webpack_exports__["default"] = (mergeDeepWith); +var filter = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ +(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])(['fantasy-land/filter', 'filter'], _internal_xfilter_js__WEBPACK_IMPORTED_MODULE_2__["default"], function (pred, filterable) { + return (0,_internal_isObject_js__WEBPACK_IMPORTED_MODULE_3__["default"])(filterable) ? (0,_internal_arrayReduce_js__WEBPACK_IMPORTED_MODULE_4__["default"])(function (acc, key) { + if (pred(filterable[key])) { + acc[key] = filterable[key]; + } + return acc; + }, {}, (0,_keys_js__WEBPACK_IMPORTED_MODULE_5__["default"])(filterable)) : + // else + (0,_internal_filter_js__WEBPACK_IMPORTED_MODULE_6__["default"])(pred, filterable); +})); +/* harmony default export */ __webpack_exports__["default"] = (filter); /***/ }), -/***/ "./node_modules/ramda/es/mergeDeepWithKey.js": -/*!***************************************************!*\ - !*** ./node_modules/ramda/es/mergeDeepWithKey.js ***! - \***************************************************/ +/***/ "./node_modules/ramda/es/find.js": +/*!***************************************!*\ + !*** ./node_modules/ramda/es/find.js ***! + \***************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _internal_isObject_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isObject.js */ "./node_modules/ramda/es/internal/_isObject.js"); -/* harmony import */ var _mergeWithKey_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mergeWithKey.js */ "./node_modules/ramda/es/mergeWithKey.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); +/* harmony import */ var _internal_xfind_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xfind.js */ "./node_modules/ramda/es/internal/_xfind.js"); /** - * Creates a new object with the own properties of the two provided objects. - * If a key exists in both objects: - * - and both associated values are also objects then the values will be - * recursively merged. - * - otherwise the provided function is applied to the key and associated values - * using the resulting value as the new value associated with the key. - * If a key only exists in one object, the value will be associated with the key - * of the resulting object. + * Returns the first element of the list which matches the predicate, or + * `undefined` if no element matches. + * + * Dispatches to the `find` method of the second argument, if present. + * + * Acts as a transducer if a transformer is given in list position. * * @func * @memberOf R - * @since v0.24.0 - * @category Object - * @sig ((String, a, a) -> a) -> {a} -> {a} -> {a} - * @param {Function} fn - * @param {Object} lObj - * @param {Object} rObj - * @return {Object} - * @see R.mergeWithKey, R.mergeDeepWith + * @since v0.1.0 + * @category List + * @sig (a -> Boolean) -> [a] -> a | undefined + * @param {Function} fn The predicate function used to determine if the element is the + * desired one. + * @param {Array} list The array to consider. + * @return {Object} The element found, or `undefined`. + * @see R.transduce * @example * - * let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r - * R.mergeDeepWithKey(concatValues, - * { a: true, c: { thing: 'foo', values: [10, 20] }}, - * { b: true, c: { thing: 'bar', values: [15, 35] }}); - * //=> { a: true, b: true, c: { thing: 'bar', values: [10, 20, 15, 35] }} + * const xs = [{a: 1}, {a: 2}, {a: 3}]; + * R.find(R.propEq(2, 'a'))(xs); //=> {a: 2} + * R.find(R.propEq(4, 'a'))(xs); //=> undefined */ -var mergeDeepWithKey = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function mergeDeepWithKey(fn, lObj, rObj) { - return (0,_mergeWithKey_js__WEBPACK_IMPORTED_MODULE_2__["default"])(function (k, lVal, rVal) { - if ((0,_internal_isObject_js__WEBPACK_IMPORTED_MODULE_1__["default"])(lVal) && (0,_internal_isObject_js__WEBPACK_IMPORTED_MODULE_1__["default"])(rVal)) { - return mergeDeepWithKey(fn, lVal, rVal); - } else { - return fn(k, lVal, rVal); +var find = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ +(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])(['find'], _internal_xfind_js__WEBPACK_IMPORTED_MODULE_2__["default"], function find(fn, list) { + var idx = 0; + var len = list.length; + while (idx < len) { + if (fn(list[idx])) { + return list[idx]; } - }, lObj, rObj); -}); -/* harmony default export */ __webpack_exports__["default"] = (mergeDeepWithKey); + idx += 1; + } +})); +/* harmony default export */ __webpack_exports__["default"] = (find); /***/ }), -/***/ "./node_modules/ramda/es/mergeLeft.js": +/***/ "./node_modules/ramda/es/findIndex.js": /*!********************************************!*\ - !*** ./node_modules/ramda/es/mergeLeft.js ***! + !*** ./node_modules/ramda/es/findIndex.js ***! \********************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_objectAssign_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_objectAssign.js */ "./node_modules/ramda/es/internal/_objectAssign.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); +/* harmony import */ var _internal_xfindIndex_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xfindIndex.js */ "./node_modules/ramda/es/internal/_xfindIndex.js"); + /** - * Create a new object with the own properties of the first object merged with - * the own properties of the second object. If a key exists in both objects, - * the value from the first object will be used. + * Returns the index of the first element of the list which matches the + * predicate, or `-1` if no element matches. + * + * Acts as a transducer if a transformer is given in list position. * * @func * @memberOf R - * @since v0.26.0 - * @category Object - * @sig {k: v} -> {k: v} -> {k: v} - * @param {Object} l - * @param {Object} r - * @return {Object} - * @see R.mergeRight, R.mergeDeepLeft, R.mergeWith, R.mergeWithKey + * @since v0.1.1 + * @category List + * @sig (a -> Boolean) -> [a] -> Number + * @param {Function} fn The predicate function used to determine if the element is the + * desired one. + * @param {Array} list The array to consider. + * @return {Number} The index of the element found, or `-1`. + * @see R.transduce, R.indexOf * @example * - * R.mergeLeft({ 'age': 40 }, { 'name': 'fred', 'age': 10 }); - * //=> { 'name': 'fred', 'age': 40 } - * - * const resetToDefault = R.mergeLeft({x: 0}); - * resetToDefault({x: 5, y: 2}); //=> {x: 0, y: 2} - * @symb R.mergeLeft(a, b) = {...b, ...a} + * const xs = [{a: 1}, {a: 2}, {a: 3}]; + * R.findIndex(R.propEq(2, 'a'))(xs); //=> 1 + * R.findIndex(R.propEq(4, 'a'))(xs); //=> -1 */ -var mergeLeft = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function mergeLeft(l, r) { - return (0,_internal_objectAssign_js__WEBPACK_IMPORTED_MODULE_0__["default"])({}, r, l); -}); -/* harmony default export */ __webpack_exports__["default"] = (mergeLeft); +var findIndex = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ +(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])([], _internal_xfindIndex_js__WEBPACK_IMPORTED_MODULE_2__["default"], function findIndex(fn, list) { + var idx = 0; + var len = list.length; + while (idx < len) { + if (fn(list[idx])) { + return idx; + } + idx += 1; + } + return -1; +})); +/* harmony default export */ __webpack_exports__["default"] = (findIndex); /***/ }), -/***/ "./node_modules/ramda/es/mergeRight.js": -/*!*********************************************!*\ - !*** ./node_modules/ramda/es/mergeRight.js ***! - \*********************************************/ +/***/ "./node_modules/ramda/es/flatten.js": +/*!******************************************!*\ + !*** ./node_modules/ramda/es/flatten.js ***! + \******************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_objectAssign_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_objectAssign.js */ "./node_modules/ramda/es/internal/_objectAssign.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +/* harmony import */ var _internal_makeFlat_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_makeFlat.js */ "./node_modules/ramda/es/internal/_makeFlat.js"); /** - * Create a new object with the own properties of the first object merged with - * the own properties of the second object. If a key exists in both objects, - * the value from the second object will be used. + * Returns a new list by pulling every item out of it (and all its sub-arrays) + * and putting them in a new array, depth-first. * * @func * @memberOf R - * @since v0.26.0 - * @category Object - * @sig {k: v} -> {k: v} -> {k: v} - * @param {Object} l - * @param {Object} r - * @return {Object} - * @see R.mergeLeft, R.mergeDeepRight, R.mergeWith, R.mergeWithKey + * @since v0.1.0 + * @category List + * @sig [a] -> [b] + * @param {Array} list The array to consider. + * @return {Array} The flattened list. + * @see R.unnest * @example * - * R.mergeRight({ 'name': 'fred', 'age': 10 }, { 'age': 40 }); - * //=> { 'name': 'fred', 'age': 40 } - * - * const withDefaults = R.mergeRight({x: 0, y: 0}); - * withDefaults({y: 2}); //=> {x: 0, y: 2} - * @symb R.mergeRight(a, b) = {...a, ...b} + * R.flatten([1, 2, [3, 4], 5, [6, [7, 8, [9, [10, 11], 12]]]]); + * //=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] */ -var mergeRight = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function mergeRight(l, r) { - return (0,_internal_objectAssign_js__WEBPACK_IMPORTED_MODULE_0__["default"])({}, l, r); -}); -/* harmony default export */ __webpack_exports__["default"] = (mergeRight); +var flatten = /*#__PURE__*/ +(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ +(0,_internal_makeFlat_js__WEBPACK_IMPORTED_MODULE_1__["default"])(true)); +/* harmony default export */ __webpack_exports__["default"] = (flatten); /***/ }), -/***/ "./node_modules/ramda/es/mergeWith.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/mergeWith.js ***! - \********************************************/ +/***/ "./node_modules/ramda/es/forEach.js": +/*!******************************************!*\ + !*** ./node_modules/ramda/es/forEach.js ***! + \******************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _mergeWithKey_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mergeWithKey.js */ "./node_modules/ramda/es/mergeWithKey.js"); +/* harmony import */ var _internal_checkForMethod_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_checkForMethod.js */ "./node_modules/ramda/es/internal/_checkForMethod.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); /** - * Creates a new object with the own properties of the two provided objects. If - * a key exists in both objects, the provided function is applied to the values - * associated with the key in each object, with the result being used as the - * value associated with the key in the returned object. + * Iterate over an input `list`, calling a provided function `fn` for each + * element in the list. + * + * `fn` receives one argument: *(value)*. + * + * Note: `R.forEach` does not skip deleted or unassigned indices (sparse + * arrays), unlike the native `Array.prototype.forEach` method. For more + * details on this behavior, see: + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Description + * + * Also note that, unlike `Array.prototype.forEach`, Ramda's `forEach` returns + * the original array. In some libraries this function is named `each`. + * + * Dispatches to the `forEach` method of the second argument, if present. * * @func * @memberOf R - * @since v0.19.0 - * @category Object - * @sig ((a, a) -> a) -> {a} -> {a} -> {a} - * @param {Function} fn - * @param {Object} l - * @param {Object} r - * @return {Object} - * @see R.mergeDeepWith, R.merge, R.mergeWithKey + * @since v0.1.1 + * @category List + * @sig (a -> *) -> [a] -> [a] + * @param {Function} fn The function to invoke. Receives one argument, `value`. + * @param {Array} list The list to iterate over. + * @return {Array} The original list. + * @see R.addIndex * @example * - * R.mergeWith(R.concat, - * { a: true, values: [10, 20] }, - * { b: true, values: [15, 35] }); - * //=> { a: true, b: true, values: [10, 20, 15, 35] } + * const printXPlusFive = x => console.log(x + 5); + * R.forEach(printXPlusFive, [1, 2, 3]); //=> [1, 2, 3] + * // logs 6 + * // logs 7 + * // logs 8 + * @symb R.forEach(f, [a, b, c]) = [a, b, c] */ -var mergeWith = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function mergeWith(fn, l, r) { - return (0,_mergeWithKey_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (_, _l, _r) { - return fn(_l, _r); - }, l, r); -}); -/* harmony default export */ __webpack_exports__["default"] = (mergeWith); +var forEach = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ +(0,_internal_checkForMethod_js__WEBPACK_IMPORTED_MODULE_1__["default"])('forEach', function forEach(fn, list) { + var len = list.length; + var idx = 0; + while (idx < len) { + fn(list[idx]); + idx += 1; + } + return list; +})); +/* harmony default export */ __webpack_exports__["default"] = (forEach); /***/ }), -/***/ "./node_modules/ramda/es/mergeWithKey.js": -/*!***********************************************!*\ - !*** ./node_modules/ramda/es/mergeWithKey.js ***! - \***********************************************/ +/***/ "./node_modules/ramda/es/forEachObjIndexed.js": +/*!****************************************************!*\ + !*** ./node_modules/ramda/es/forEachObjIndexed.js ***! + \****************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _internal_has_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_has.js */ "./node_modules/ramda/es/internal/_has.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./keys.js */ "./node_modules/ramda/es/keys.js"); /** - * Creates a new object with the own properties of the two provided objects. If - * a key exists in both objects, the provided function is applied to the key - * and the values associated with the key in each object, with the result being - * used as the value associated with the key in the returned object. + * Iterate over an input `object`, calling a provided function `fn` for each + * key and value in the object. + * + * `fn` receives three argument: *(value, key, obj)*. * * @func * @memberOf R - * @since v0.19.0 + * @since v0.23.0 * @category Object - * @sig ((String, a, a) -> a) -> {a} -> {a} -> {a} - * @param {Function} fn - * @param {Object} l - * @param {Object} r - * @return {Object} - * @see R.mergeDeepWithKey, R.merge, R.mergeWith + * @sig ((a, String, StrMap a) -> Any) -> StrMap a -> StrMap a + * @param {Function} fn The function to invoke. Receives three argument, `value`, `key`, `obj`. + * @param {Object} obj The object to iterate over. + * @return {Object} The original object. * @example * - * let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r - * R.mergeWithKey(concatValues, - * { a: true, thing: 'foo', values: [10, 20] }, - * { b: true, thing: 'bar', values: [15, 35] }); - * //=> { a: true, b: true, thing: 'bar', values: [10, 20, 15, 35] } - * @symb R.mergeWithKey(f, { x: 1, y: 2 }, { y: 5, z: 3 }) = { x: 1, y: f('y', 2, 5), z: 3 } + * const printKeyConcatValue = (value, key) => console.log(key + ':' + value); + * R.forEachObjIndexed(printKeyConcatValue, {x: 1, y: 2}); //=> {x: 1, y: 2} + * // logs x:1 + * // logs y:2 + * @symb R.forEachObjIndexed(f, {x: a, y: b}) = {x: a, y: b} */ -var mergeWithKey = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function mergeWithKey(fn, l, r) { - var result = {}; - var k; - l = l || {}; - r = r || {}; - for (k in l) { - if ((0,_internal_has_js__WEBPACK_IMPORTED_MODULE_1__["default"])(k, l)) { - result[k] = (0,_internal_has_js__WEBPACK_IMPORTED_MODULE_1__["default"])(k, r) ? fn(k, l[k], r[k]) : l[k]; - } - } - for (k in r) { - if ((0,_internal_has_js__WEBPACK_IMPORTED_MODULE_1__["default"])(k, r) && !(0,_internal_has_js__WEBPACK_IMPORTED_MODULE_1__["default"])(k, result)) { - result[k] = r[k]; - } +var forEachObjIndexed = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function forEachObjIndexed(fn, obj) { + var keyList = (0,_keys_js__WEBPACK_IMPORTED_MODULE_1__["default"])(obj); + var idx = 0; + while (idx < keyList.length) { + var key = keyList[idx]; + fn(obj[key], key, obj); + idx += 1; } - return result; + return obj; }); -/* harmony default export */ __webpack_exports__["default"] = (mergeWithKey); +/* harmony default export */ __webpack_exports__["default"] = (forEachObjIndexed); /***/ }), -/***/ "./node_modules/ramda/es/min.js": -/*!**************************************!*\ - !*** ./node_modules/ramda/es/min.js ***! - \**************************************/ +/***/ "./node_modules/ramda/es/groupBy.js": +/*!******************************************!*\ + !*** ./node_modules/ramda/es/groupBy.js ***! + \******************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); +/* harmony import */ var _internal_checkForMethod_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_checkForMethod.js */ "./node_modules/ramda/es/internal/_checkForMethod.js"); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _toString_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./toString.js */ "./node_modules/ramda/es/toString.js"); +/* harmony import */ var _reduceBy_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./reduceBy.js */ "./node_modules/ramda/es/reduceBy.js"); + /** - * Returns the smaller of its two arguments. + * Splits a list into sub-lists stored in an object, based on the result of + * calling a key-returning function on each element, and grouping the + * results according to values returned. + * + * Dispatches to the `groupBy` method of the second argument, if present. + * + * Acts as a transducer if a transformer is given in list position. * * @func * @memberOf R * @since v0.1.0 - * @category Relation - * @sig Ord a => a -> a -> a - * @param {*} a - * @param {*} b - * @return {*} - * @see R.minBy, R.max + * @category List + * @typedefn Idx = String | Int | Symbol + * @sig Idx a => (b -> a) -> [b] -> {a: [b]} + * @param {Function} fn Function :: a -> Idx + * @param {Array} list The array to group + * @return {Object} An object with the output of `fn` for keys, mapped to arrays of elements + * that produced that key when passed to `fn`. + * @see R.reduceBy, R.transduce, R.indexBy, R.collectBy * @example * - * R.min(789, 123); //=> 123 - * R.min('a', 'b'); //=> 'a' + * const byGrade = R.groupBy(function(student) { + * const score = student.score; + * return score < 65 ? 'F' : + * score < 70 ? 'D' : + * score < 80 ? 'C' : + * score < 90 ? 'B' : 'A'; + * }); + * const students = [{name: 'Abby', score: 84}, + * {name: 'Eddy', score: 58}, + * // ... + * {name: 'Jack', score: 69}]; + * byGrade(students); + * // { + * // 'A': [{name: 'Dianne', score: 99}], + * // 'B': [{name: 'Abby', score: 84}] + * // // ..., + * // 'F': [{name: 'Eddy', score: 58}] + * // } */ -var min = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function min(a, b) { - if (a === b) { - return a; - } - function safeMin(x, y) { - if (x < y !== y < x) { - return y < x ? y : x; - } - return undefined; - } - var minByValue = safeMin(a, b); - if (minByValue !== undefined) { - return minByValue; - } - var minByType = safeMin(typeof a, typeof b); - if (minByType !== undefined) { - return minByType === typeof a ? a : b; - } - var stringA = (0,_toString_js__WEBPACK_IMPORTED_MODULE_1__["default"])(a); - var minByStringValue = safeMin(stringA, (0,_toString_js__WEBPACK_IMPORTED_MODULE_1__["default"])(b)); - if (minByStringValue !== undefined) { - return minByStringValue === stringA ? a : b; - } - return a; -}); -/* harmony default export */ __webpack_exports__["default"] = (min); +var groupBy = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ +(0,_internal_checkForMethod_js__WEBPACK_IMPORTED_MODULE_1__["default"])('groupBy', /*#__PURE__*/ +(0,_reduceBy_js__WEBPACK_IMPORTED_MODULE_2__["default"])(function (acc, item) { + acc.push(item); + return acc; +}, []))); +/* harmony default export */ __webpack_exports__["default"] = (groupBy); /***/ }), -/***/ "./node_modules/ramda/es/minBy.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/minBy.js ***! - \****************************************/ +/***/ "./node_modules/ramda/es/has.js": +/*!**************************************!*\ + !*** ./node_modules/ramda/es/has.js ***! + \**************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _min_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./min.js */ "./node_modules/ramda/es/min.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _hasPath_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./hasPath.js */ "./node_modules/ramda/es/hasPath.js"); /** - * Takes a function and two values, and returns whichever value produces the - * smaller result when passed to the provided function. + * Returns whether or not an object has an own property with the specified name * * @func * @memberOf R - * @since v0.8.0 - * @category Relation - * @sig Ord b => (a -> b) -> a -> a -> a - * @param {Function} f - * @param {*} a - * @param {*} b - * @return {*} - * @see R.min, R.maxBy + * @since v0.7.0 + * @category Object + * @sig s -> {s: x} -> Boolean + * @param {String} prop The name of the property to check for. + * @param {Object} obj The object to query. + * @return {Boolean} Whether the property exists. * @example * - * // square :: Number -> Number - * const square = n => n * n; - * - * R.minBy(square, -3, 2); //=> 2 + * const hasName = R.has('name'); + * hasName({name: 'alice'}); //=> true + * hasName({name: 'bob'}); //=> true + * hasName({}); //=> false * - * R.reduce(R.minBy(square), Infinity, [3, -5, 4, 1, -2]); //=> 1 - * R.reduce(R.minBy(square), Infinity, []); //=> Infinity + * const point = {x: 0, y: 0}; + * const pointHas = R.has(R.__, point); + * pointHas('x'); //=> true + * pointHas('y'); //=> true + * pointHas('z'); //=> false */ -var minBy = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function minBy(f, a, b) { - var resultB = f(b); - return (0,_min_js__WEBPACK_IMPORTED_MODULE_1__["default"])(f(a), resultB) === resultB ? b : a; +var has = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function has(prop, obj) { + return (0,_hasPath_js__WEBPACK_IMPORTED_MODULE_1__["default"])([prop], obj); }); -/* harmony default export */ __webpack_exports__["default"] = (minBy); +/* harmony default export */ __webpack_exports__["default"] = (has); /***/ }), -/***/ "./node_modules/ramda/es/modify.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/modify.js ***! - \*****************************************/ +/***/ "./node_modules/ramda/es/hasPath.js": +/*!******************************************!*\ + !*** ./node_modules/ramda/es/hasPath.js ***! + \******************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _modifyPath_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifyPath.js */ "./node_modules/ramda/es/modifyPath.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_has_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_has.js */ "./node_modules/ramda/es/internal/_has.js"); +/* harmony import */ var _isNil_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isNil.js */ "./node_modules/ramda/es/isNil.js"); + /** - * Creates a copy of the passed object by applying an `fn` function to the given `prop` property. - * - * The function will not be invoked, and the object will not change - * if its corresponding property does not exist in the object. - * All non-primitive properties are copied to the new object by reference. + * Returns whether or not a path exists in an object. Only the object's + * own properties are checked. * * @func * @memberOf R - * @since v0.28.0 + * @since v0.26.0 * @category Object - * @sig Idx -> (v -> v) -> {k: v} -> {k: v} - * @param {String|Number} prop The property to be modified. - * @param {Function} fn The function to apply to the property. - * @param {Object} object The object to be transformed. - * @return {Object} The transformed object. + * @typedefn Idx = String | Int | Symbol + * @sig [Idx] -> {a} -> Boolean + * @param {Array} path The path to use. + * @param {Object} obj The object to check the path in. + * @return {Boolean} Whether the path exists. + * @see R.has * @example * - * const person = {name: 'James', age: 20, pets: ['dog', 'cat']}; - * R.modify('age', R.add(1), person); //=> {name: 'James', age: 21, pets: ['dog', 'cat']} - * R.modify('pets', R.append('turtle'), person); //=> {name: 'James', age: 20, pets: ['dog', 'cat', 'turtle']} + * R.hasPath(['a', 'b'], {a: {b: 2}}); // => true + * R.hasPath(['a', 'b'], {a: {b: undefined}}); // => true + * R.hasPath(['a', 'b'], {a: {c: 2}}); // => false + * R.hasPath(['a', 'b'], {}); // => false */ -var modify = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function modify(prop, fn, object) { - return (0,_modifyPath_js__WEBPACK_IMPORTED_MODULE_1__["default"])([prop], fn, object); +var hasPath = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function hasPath(_path, obj) { + if (_path.length === 0 || (0,_isNil_js__WEBPACK_IMPORTED_MODULE_1__["default"])(obj)) { + return false; + } + var val = obj; + var idx = 0; + while (idx < _path.length) { + if (!(0,_isNil_js__WEBPACK_IMPORTED_MODULE_1__["default"])(val) && (0,_internal_has_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_path[idx], val)) { + val = val[_path[idx]]; + idx += 1; + } else { + return false; + } + } + return true; }); -/* harmony default export */ __webpack_exports__["default"] = (modify); +/* harmony default export */ __webpack_exports__["default"] = (hasPath); /***/ }), -/***/ "./node_modules/ramda/es/modifyPath.js": -/*!*********************************************!*\ - !*** ./node_modules/ramda/es/modifyPath.js ***! - \*********************************************/ +/***/ "./node_modules/ramda/es/identity.js": +/*!*******************************************!*\ + !*** ./node_modules/ramda/es/identity.js ***! + \*******************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); -/* harmony import */ var _internal_isObject_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_isObject.js */ "./node_modules/ramda/es/internal/_isObject.js"); -/* harmony import */ var _internal_has_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_has.js */ "./node_modules/ramda/es/internal/_has.js"); -/* harmony import */ var _internal_assoc_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./internal/_assoc.js */ "./node_modules/ramda/es/internal/_assoc.js"); -/* harmony import */ var _internal_modify_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./internal/_modify.js */ "./node_modules/ramda/es/internal/_modify.js"); - - - - +/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +/* harmony import */ var _internal_identity_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_identity.js */ "./node_modules/ramda/es/internal/_identity.js"); /** - * Creates a shallow clone of the passed object by applying an `fn` function - * to the value at the given path. - * - * The function will not be invoked, and the object will not change - * if its corresponding path does not exist in the object. - * All non-primitive properties are copied to the new object by reference. + * A function that does nothing but return the parameter supplied to it. Good + * as a default or placeholder function. * * @func * @memberOf R - * @since v0.28.0 - * @category Object - * @sig [Idx] -> (v -> v) -> {k: v} -> {k: v} - * @param {Array} path The path to be modified. - * @param {Function} fn The function to apply to the path. - * @param {Object} object The object to be transformed. - * @return {Object} The transformed object. + * @since v0.1.0 + * @category Function + * @sig a -> a + * @param {*} x The value to return. + * @return {*} The input value, `x`. * @example * - * const person = {name: 'James', address: { zipCode: '90216' }}; - * R.modifyPath(['address', 'zipCode'], R.reverse, person); //=> {name: 'James', address: { zipCode: '61209' }} + * R.identity(1); //=> 1 * - * // Can handle arrays too - * const person = {name: 'James', addresses: [{ zipCode: '90216' }]}; - * R.modifyPath(['addresses', 0, 'zipCode'], R.reverse, person); //=> {name: 'James', addresses: [{ zipCode: '61209' }]} + * const obj = {}; + * R.identity(obj) === obj; //=> true + * @symb R.identity(a) = a */ -var modifyPath = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function modifyPath(path, fn, object) { - if (!(0,_internal_isObject_js__WEBPACK_IMPORTED_MODULE_2__["default"])(object) && !(0,_internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object) || path.length === 0) { - return object; - } - var idx = path[0]; - if (!(0,_internal_has_js__WEBPACK_IMPORTED_MODULE_3__["default"])(idx, object)) { - return object; - } - if (path.length === 1) { - return (0,_internal_modify_js__WEBPACK_IMPORTED_MODULE_5__["default"])(idx, fn, object); - } - var val = modifyPath(Array.prototype.slice.call(path, 1), fn, object[idx]); - if (val === object[idx]) { - return object; - } - return (0,_internal_assoc_js__WEBPACK_IMPORTED_MODULE_4__["default"])(idx, val, object); -}); -/* harmony default export */ __webpack_exports__["default"] = (modifyPath); +var identity = /*#__PURE__*/ +(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_internal_identity_js__WEBPACK_IMPORTED_MODULE_1__["default"]); +/* harmony default export */ __webpack_exports__["default"] = (identity); /***/ }), -/***/ "./node_modules/ramda/es/modulo.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/modulo.js ***! - \*****************************************/ +/***/ "./node_modules/ramda/es/includes.js": +/*!*******************************************!*\ + !*** ./node_modules/ramda/es/includes.js ***! + \*******************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); +/* harmony import */ var _internal_includes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_includes.js */ "./node_modules/ramda/es/internal/_includes.js"); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); + /** - * Divides the first parameter by the second and returns the remainder. Note - * that this function preserves the JavaScript-style behavior for modulo. For - * mathematical modulo see [`mathMod`](#mathMod). + * Returns `true` if the specified value is equal, in [`R.equals`](#equals) + * terms, to at least one element of the given list; `false` otherwise. + * Also works with strings. * * @func * @memberOf R - * @since v0.1.1 - * @category Math - * @sig Number -> Number -> Number - * @param {Number} a The value to the divide. - * @param {Number} b The pseudo-modulus - * @return {Number} The result of `b % a`. - * @see R.mathMod + * @since v0.26.0 + * @category List + * @sig a -> [a] -> Boolean + * @param {Object} a The item to compare against. + * @param {Array} list The array to consider. + * @return {Boolean} `true` if an equivalent item is in the list, `false` otherwise. + * @see R.any * @example * - * R.modulo(17, 3); //=> 2 - * // JS behavior: - * R.modulo(-17, 3); //=> -2 - * R.modulo(17, -3); //=> 2 - * - * const isOdd = R.modulo(R.__, 2); - * isOdd(42); //=> 0 - * isOdd(21); //=> 1 + * R.includes(3, [1, 2, 3]); //=> true + * R.includes(4, [1, 2, 3]); //=> false + * R.includes({ name: 'Fred' }, [{ name: 'Fred' }]); //=> true + * R.includes([42], [[42]]); //=> true + * R.includes('ba', 'banana'); //=>true */ -var modulo = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function modulo(a, b) { - return a % b; -}); -/* harmony default export */ __webpack_exports__["default"] = (modulo); +var includes = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_internal_includes_js__WEBPACK_IMPORTED_MODULE_1__["default"]); +/* harmony default export */ __webpack_exports__["default"] = (includes); /***/ }), -/***/ "./node_modules/ramda/es/move.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/move.js ***! - \***************************************/ +/***/ "./node_modules/ramda/es/indexOf.js": +/*!******************************************!*\ + !*** ./node_modules/ramda/es/indexOf.js ***! + \******************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_indexOf_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_indexOf.js */ "./node_modules/ramda/es/internal/_indexOf.js"); +/* harmony import */ var _internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); + + /** - * Move an item, at index `from`, to index `to`, in a list of elements. - * A new list will be created containing the new elements order. + * Returns the position of the first occurrence of an item in an array, or -1 + * if the item is not included in the array. [`R.equals`](#equals) is used to + * determine equality. * * @func * @memberOf R - * @since v0.27.1 + * @since v0.1.0 * @category List - * @sig Number -> Number -> [a] -> [a] - * @param {Number} from The source index - * @param {Number} to The destination index - * @param {Array} list The list which will serve to realise the move - * @return {Array} The new list reordered + * @sig a -> [a] -> Number + * @param {*} target The item to find. + * @param {Array} xs The array to search in. + * @return {Number} the index of the target, or -1 if the target is not found. + * @see R.lastIndexOf, R.findIndex * @example * - * R.move(0, 2, ['a', 'b', 'c', 'd', 'e', 'f']); //=> ['b', 'c', 'a', 'd', 'e', 'f'] - * R.move(-1, 0, ['a', 'b', 'c', 'd', 'e', 'f']); //=> ['f', 'a', 'b', 'c', 'd', 'e'] list rotation + * R.indexOf(3, [1,2,3,4]); //=> 2 + * R.indexOf(10, [1,2,3,4]); //=> -1 */ -var move = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (from, to, list) { - var length = list.length; - var result = list.slice(); - var positiveFrom = from < 0 ? length + from : from; - var positiveTo = to < 0 ? length + to : to; - var item = result.splice(positiveFrom, 1); - return positiveFrom < 0 || positiveFrom >= list.length || positiveTo < 0 || positiveTo >= list.length ? list : [].concat(result.slice(0, positiveTo)).concat(item).concat(result.slice(positiveTo, list.length)); +var indexOf = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function indexOf(target, xs) { + return typeof xs.indexOf === 'function' && !(0,_internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(xs) ? xs.indexOf(target) : (0,_internal_indexOf_js__WEBPACK_IMPORTED_MODULE_2__["default"])(xs, target, 0); }); -/* harmony default export */ __webpack_exports__["default"] = (move); +/* harmony default export */ __webpack_exports__["default"] = (indexOf); /***/ }), -/***/ "./node_modules/ramda/es/multiply.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/multiply.js ***! - \*******************************************/ +/***/ "./node_modules/ramda/es/insert.js": +/*!*****************************************!*\ + !*** ./node_modules/ramda/es/insert.js ***! + \*****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); /** - * Multiplies two numbers. Equivalent to `a * b` but curried. + * Inserts the supplied element into the list, at the specified `index`. _Note that + + * this is not destructive_: it returns a copy of the list with the changes. + * No lists have been harmed in the application of this function. * * @func * @memberOf R - * @since v0.1.0 - * @category Math - * @sig Number -> Number -> Number - * @param {Number} a The first value. - * @param {Number} b The second value. - * @return {Number} The result of `a * b`. - * @see R.divide + * @since v0.2.2 + * @category List + * @sig Number -> a -> [a] -> [a] + * @param {Number} index The position to insert the element + * @param {*} elt The element to insert into the Array + * @param {Array} list The list to insert into + * @return {Array} A new Array with `elt` inserted at `index`. * @example * - * const double = R.multiply(2); - * const triple = R.multiply(3); - * double(3); //=> 6 - * triple(4); //=> 12 - * R.multiply(2, 5); //=> 10 + * R.insert(2, 'x', [1,2,3,4]); //=> [1,2,'x',3,4] */ -var multiply = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function multiply(a, b) { - return a * b; -}); -/* harmony default export */ __webpack_exports__["default"] = (multiply); +var insert = /*#__PURE__*/ +(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function insert(idx, elt, list) { + idx = idx < list.length && idx >= 0 ? idx : list.length; + var result = Array.prototype.slice.call(list, 0); + result.splice(idx, 0, elt); + return result; +}); +/* harmony default export */ __webpack_exports__["default"] = (insert); + +/***/ }), + +/***/ "./node_modules/ramda/es/internal/_Set.js": +/*!************************************************!*\ + !*** ./node_modules/ramda/es/internal/_Set.js ***! + \************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_includes.js */ "./node_modules/ramda/es/internal/_includes.js"); + +var _Set = /*#__PURE__*/ +function () { + function _Set() { + /* globals Set */ + this._nativeSet = typeof Set === 'function' ? new Set() : null; + this._items = {}; + } + + // until we figure out why jsdoc chokes on this + // @param item The item to add to the Set + // @returns {boolean} true if the item did not exist prior, otherwise false + // + _Set.prototype.add = function (item) { + return !hasOrAdd(item, true, this); + }; // + // @param item The item to check for existence in the Set + // @returns {boolean} true if the item exists in the Set, otherwise false + // + + _Set.prototype.has = function (item) { + return hasOrAdd(item, false, this); + }; // + // Combines the logic for checking whether an item is a member of the set and + // for adding a new item to the set. + // + // @param item The item to check or add to the Set instance. + // @param shouldAdd If true, the item will be added to the set if it doesn't + // already exist. + // @param set The set instance to check or add to. + // @return {boolean} true if the item already existed, otherwise false. + // + + return _Set; +}(); +function hasOrAdd(item, shouldAdd, set) { + var type = typeof item; + var prevSize, newSize; + switch (type) { + case 'string': + case 'number': + // distinguish between +0 and -0 + if (item === 0 && 1 / item === -Infinity) { + if (set._items['-0']) { + return true; + } else { + if (shouldAdd) { + set._items['-0'] = true; + } + return false; + } + } // these types can all utilise the native Set + + if (set._nativeSet !== null) { + if (shouldAdd) { + prevSize = set._nativeSet.size; + set._nativeSet.add(item); + newSize = set._nativeSet.size; + return newSize === prevSize; + } else { + return set._nativeSet.has(item); + } + } else { + if (!(type in set._items)) { + if (shouldAdd) { + set._items[type] = {}; + set._items[type][item] = true; + } + return false; + } else if (item in set._items[type]) { + return true; + } else { + if (shouldAdd) { + set._items[type][item] = true; + } + return false; + } + } + case 'boolean': + // set._items['boolean'] holds a two element array + // representing [ falseExists, trueExists ] + if (type in set._items) { + var bIdx = item ? 1 : 0; + if (set._items[type][bIdx]) { + return true; + } else { + if (shouldAdd) { + set._items[type][bIdx] = true; + } + return false; + } + } else { + if (shouldAdd) { + set._items[type] = item ? [false, true] : [true, false]; + } + return false; + } + case 'function': + // compare functions for reference equality + if (set._nativeSet !== null) { + if (shouldAdd) { + prevSize = set._nativeSet.size; + set._nativeSet.add(item); + newSize = set._nativeSet.size; + return newSize === prevSize; + } else { + return set._nativeSet.has(item); + } + } else { + if (!(type in set._items)) { + if (shouldAdd) { + set._items[type] = [item]; + } + return false; + } + if (!(0,_includes_js__WEBPACK_IMPORTED_MODULE_0__["default"])(item, set._items[type])) { + if (shouldAdd) { + set._items[type].push(item); + } + return false; + } + return true; + } + case 'undefined': + if (set._items[type]) { + return true; + } else { + if (shouldAdd) { + set._items[type] = true; + } + return false; + } + case 'object': + if (item === null) { + if (!set._items['null']) { + if (shouldAdd) { + set._items['null'] = true; + } + return false; + } + return true; + } + + /* falls through */ + + default: + // reduce the search size of heterogeneous sets by creating buckets + // for each type. + type = Object.prototype.toString.call(item); + if (!(type in set._items)) { + if (shouldAdd) { + set._items[type] = [item]; + } + return false; + } // scan through all previously applied items + + if (!(0,_includes_js__WEBPACK_IMPORTED_MODULE_0__["default"])(item, set._items[type])) { + if (shouldAdd) { + set._items[type].push(item); + } + return false; + } + return true; + } +} // A simple Set type that honours R.equals semantics + +/* harmony default export */ __webpack_exports__["default"] = (_Set); /***/ }), -/***/ "./node_modules/ramda/es/nAry.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/nAry.js ***! - \***************************************/ +/***/ "./node_modules/ramda/es/internal/_arity.js": +/*!**************************************************!*\ + !*** ./node_modules/ramda/es/internal/_arity.js ***! + \**************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); - -/** - * Wraps a function of any arity (including nullary) in a function that accepts - * exactly `n` parameters. Any extraneous parameters will not be passed to the - * supplied function. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig Number -> (* -> a) -> (* -> a) - * @param {Number} n The desired arity of the new function. - * @param {Function} fn The function to wrap. - * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of - * arity `n`. - * @see R.binary, R.unary - * @example - * - * const takesTwoArgs = (a, b) => [a, b]; - * - * takesTwoArgs.length; //=> 2 - * takesTwoArgs(1, 2); //=> [1, 2] - * - * const takesOneArg = R.nAry(1, takesTwoArgs); - * takesOneArg.length; //=> 1 - * // Only `n` arguments are passed to the wrapped function - * takesOneArg(1, 2); //=> [1, undefined] - * @symb R.nAry(0, f)(a, b) = f() - * @symb R.nAry(1, f)(a, b) = f(a) - * @symb R.nAry(2, f)(a, b) = f(a, b) - */ - -var nAry = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function nAry(n, fn) { +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _arity; } +/* harmony export */ }); +function _arity(n, fn) { + /* eslint-disable no-unused-vars */ switch (n) { case 0: return function () { - return fn.call(this); + return fn.apply(this, arguments); }; case 1: return function (a0) { - return fn.call(this, a0); + return fn.apply(this, arguments); }; case 2: return function (a0, a1) { - return fn.call(this, a0, a1); + return fn.apply(this, arguments); }; case 3: return function (a0, a1, a2) { - return fn.call(this, a0, a1, a2); + return fn.apply(this, arguments); }; case 4: return function (a0, a1, a2, a3) { - return fn.call(this, a0, a1, a2, a3); + return fn.apply(this, arguments); }; case 5: return function (a0, a1, a2, a3, a4) { - return fn.call(this, a0, a1, a2, a3, a4); + return fn.apply(this, arguments); }; case 6: return function (a0, a1, a2, a3, a4, a5) { - return fn.call(this, a0, a1, a2, a3, a4, a5); + return fn.apply(this, arguments); }; case 7: return function (a0, a1, a2, a3, a4, a5, a6) { - return fn.call(this, a0, a1, a2, a3, a4, a5, a6); + return fn.apply(this, arguments); }; case 8: return function (a0, a1, a2, a3, a4, a5, a6, a7) { - return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7); + return fn.apply(this, arguments); }; case 9: return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) { - return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7, a8); + return fn.apply(this, arguments); }; case 10: return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); + return fn.apply(this, arguments); }; default: - throw new Error('First argument to nAry must be a non-negative integer no greater than ten'); + throw new Error('First argument to _arity must be a non-negative integer no greater than ten'); } -}); -/* harmony default export */ __webpack_exports__["default"] = (nAry); - -/***/ }), - -/***/ "./node_modules/ramda/es/negate.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/negate.js ***! - \*****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); - -/** - * Negates its argument. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Math - * @sig Number -> Number - * @param {Number} n - * @return {Number} - * @example - * - * R.negate(42); //=> -42 - */ - -var negate = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function negate(n) { - return -n; -}); -/* harmony default export */ __webpack_exports__["default"] = (negate); - -/***/ }), - -/***/ "./node_modules/ramda/es/none.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/none.js ***! - \***************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_complement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_complement.js */ "./node_modules/ramda/es/internal/_complement.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _all_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./all.js */ "./node_modules/ramda/es/all.js"); - - - -/** - * Returns `true` if no elements of the list match the predicate, `false` - * otherwise. - * - * Dispatches to the `all` method of the second argument, if present. - * - * Acts as a transducer if a transformer is given in list position. - * - * @func - * @memberOf R - * @since v0.12.0 - * @category List - * @sig (a -> Boolean) -> [a] -> Boolean - * @param {Function} fn The predicate function. - * @param {Array} list The array to consider. - * @return {Boolean} `true` if the predicate is not satisfied by every element, `false` otherwise. - * @see R.all, R.any - * @example - * - * const isEven = n => n % 2 === 0; - * const isOdd = n => n % 2 !== 0; - * - * R.none(isEven, [1, 3, 5, 7, 9, 11]); //=> true - * R.none(isOdd, [1, 3, 5, 7, 8, 11]); //=> false - */ - -var none = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function none(fn, input) { - return (0,_all_js__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_internal_complement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(fn), input); -}); -/* harmony default export */ __webpack_exports__["default"] = (none); +} /***/ }), -/***/ "./node_modules/ramda/es/not.js": -/*!**************************************!*\ - !*** ./node_modules/ramda/es/not.js ***! - \**************************************/ +/***/ "./node_modules/ramda/es/internal/_arrayFromIterator.js": +/*!**************************************************************!*\ + !*** ./node_modules/ramda/es/internal/_arrayFromIterator.js ***! + \**************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); - -/** - * A function that returns the `!` of its argument. It will return `true` when - * passed false-y value, and `false` when passed a truth-y one. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Logic - * @sig * -> Boolean - * @param {*} a any value - * @return {Boolean} the logical inverse of passed argument. - * @see R.complement - * @example - * - * R.not(true); //=> false - * R.not(false); //=> true - * R.not(0); //=> true - * R.not(1); //=> false - */ - -var not = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function not(a) { - return !a; -}); -/* harmony default export */ __webpack_exports__["default"] = (not); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _arrayFromIterator; } +/* harmony export */ }); +function _arrayFromIterator(iter) { + var list = []; + var next; + while (!(next = iter.next()).done) { + list.push(next.value); + } + return list; +} /***/ }), -/***/ "./node_modules/ramda/es/nth.js": -/*!**************************************!*\ - !*** ./node_modules/ramda/es/nth.js ***! - \**************************************/ +/***/ "./node_modules/ramda/es/internal/_arrayReduce.js": +/*!********************************************************!*\ + !*** ./node_modules/ramda/es/internal/_arrayReduce.js ***! + \********************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_isString_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isString.js */ "./node_modules/ramda/es/internal/_isString.js"); - - -/** - * Returns the nth element of the given list or string. If n is negative the - * element at index length + n is returned. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig Number -> [a] -> a | Undefined - * @sig Number -> String -> String - * @param {Number} offset - * @param {*} list - * @return {*} - * @example - * - * const list = ['foo', 'bar', 'baz', 'quux']; - * R.nth(1, list); //=> 'bar' - * R.nth(-1, list); //=> 'quux' - * R.nth(-99, list); //=> undefined - * - * R.nth(2, 'abc'); //=> 'c' - * R.nth(3, 'abc'); //=> '' - * @symb R.nth(-1, [a, b, c]) = c - * @symb R.nth(0, [a, b, c]) = a - * @symb R.nth(1, [a, b, c]) = b - */ - -var nth = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function nth(offset, list) { - var idx = offset < 0 ? list.length + offset : offset; - return (0,_internal_isString_js__WEBPACK_IMPORTED_MODULE_1__["default"])(list) ? list.charAt(idx) : list[idx]; -}); -/* harmony default export */ __webpack_exports__["default"] = (nth); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _arrayReduce; } +/* harmony export */ }); +function _arrayReduce(reducer, acc, list) { + var index = 0; + var length = list.length; + while (index < length) { + acc = reducer(acc, list[index]); + index += 1; + } + return acc; +} /***/ }), -/***/ "./node_modules/ramda/es/nthArg.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/nthArg.js ***! - \*****************************************/ +/***/ "./node_modules/ramda/es/internal/_assoc.js": +/*!**************************************************!*\ + !*** ./node_modules/ramda/es/internal/_assoc.js ***! + \**************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./curryN.js */ "./node_modules/ramda/es/curryN.js"); -/* harmony import */ var _nth_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./nth.js */ "./node_modules/ramda/es/nth.js"); - +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _assoc; } +/* harmony export */ }); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); +/* harmony import */ var _isInteger_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isInteger.js */ "./node_modules/ramda/es/internal/_isInteger.js"); /** - * Returns a function which returns its nth argument. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Function - * @sig Number -> *... -> * - * @param {Number} n - * @return {Function} - * @example + * Makes a shallow clone of an object, setting or overriding the specified + * property with the given value. Note that this copies and flattens prototype + * properties onto the new object as well. All non-primitive properties are + * copied by reference. * - * R.nthArg(1)('a', 'b', 'c'); //=> 'b' - * R.nthArg(-1)('a', 'b', 'c'); //=> 'c' - * @symb R.nthArg(-1)(a, b, c) = c - * @symb R.nthArg(0)(a, b, c) = a - * @symb R.nthArg(1)(a, b, c) = b + * @private + * @param {String|Number} prop The property name to set + * @param {*} val The new value + * @param {Object|Array} obj The object to clone + * @return {Object|Array} A new object equivalent to the original except for the changed property. */ -var nthArg = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function nthArg(n) { - var arity = n < 0 ? 1 : n + 1; - return (0,_curryN_js__WEBPACK_IMPORTED_MODULE_1__["default"])(arity, function () { - return (0,_nth_js__WEBPACK_IMPORTED_MODULE_2__["default"])(n, arguments); - }); -}); -/* harmony default export */ __webpack_exports__["default"] = (nthArg); +function _assoc(prop, val, obj) { + if ((0,_isInteger_js__WEBPACK_IMPORTED_MODULE_0__["default"])(prop) && (0,_isArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(obj)) { + var arr = [].concat(obj); + arr[prop] = val; + return arr; + } + var result = {}; + for (var p in obj) { + result[p] = obj[p]; + } + result[prop] = val; + return result; +} /***/ }), -/***/ "./node_modules/ramda/es/o.js": -/*!************************************!*\ - !*** ./node_modules/ramda/es/o.js ***! - \************************************/ +/***/ "./node_modules/ramda/es/internal/_checkForMethod.js": +/*!***********************************************************!*\ + !*** ./node_modules/ramda/es/internal/_checkForMethod.js ***! + \***********************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _checkForMethod; } +/* harmony export */ }); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); /** - * `o` is a curried composition function that returns a unary function. - * Like [`compose`](#compose), `o` performs right-to-left function composition. - * Unlike [`compose`](#compose), the rightmost function passed to `o` will be - * invoked with only one argument. Also, unlike [`compose`](#compose), `o` is - * limited to accepting only 2 unary functions. The name o was chosen because - * of its similarity to the mathematical composition operator ∘. - * - * @func - * @memberOf R - * @since v0.24.0 - * @category Function - * @sig (b -> c) -> (a -> b) -> a -> c - * @param {Function} f - * @param {Function} g - * @return {Function} - * @see R.compose, R.pipe - * @example - * - * const classyGreeting = name => "The name's " + name.last + ", " + name.first + " " + name.last - * const yellGreeting = R.o(R.toUpper, classyGreeting); - * yellGreeting({first: 'James', last: 'Bond'}); //=> "THE NAME'S BOND, JAMES BOND" - * - * R.o(R.multiply(10), R.add(10))(-4) //=> 60 + * This checks whether a function has a [methodname] function. If it isn't an + * array it will execute that function otherwise it will default to the ramda + * implementation. * - * @symb R.o(f, g, x) = f(g(x)) + * @private + * @param {Function} fn ramda implementation + * @param {String} methodname property to check for a custom implementation + * @return {Object} Whatever the return value of the method is. */ -var o = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function o(f, g, x) { - return f(g(x)); -}); -/* harmony default export */ __webpack_exports__["default"] = (o); +function _checkForMethod(methodname, fn) { + return function () { + var length = arguments.length; + if (length === 0) { + return fn(); + } + var obj = arguments[length - 1]; + return (0,_isArray_js__WEBPACK_IMPORTED_MODULE_0__["default"])(obj) || typeof obj[methodname] !== 'function' ? fn.apply(this, arguments) : obj[methodname].apply(obj, Array.prototype.slice.call(arguments, 0, length - 1)); + }; +} /***/ }), -/***/ "./node_modules/ramda/es/objOf.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/objOf.js ***! - \****************************************/ +/***/ "./node_modules/ramda/es/internal/_clone.js": +/*!**************************************************!*\ + !*** ./node_modules/ramda/es/internal/_clone.js ***! + \**************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); - -/** - * Creates an object containing a single key:value pair. - * - * @func - * @memberOf R - * @since v0.18.0 - * @category Object - * @sig String -> a -> {String:a} - * @param {String} key - * @param {*} val - * @return {Object} - * @see R.pair - * @example - * - * const matchPhrases = R.compose( - * R.objOf('must'), - * R.map(R.objOf('match_phrase')) - * ); - * matchPhrases(['foo', 'bar', 'baz']); //=> {must: [{match_phrase: 'foo'}, {match_phrase: 'bar'}, {match_phrase: 'baz'}]} - */ - -var objOf = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function objOf(key, val) { - var obj = {}; - obj[key] = val; - return obj; -}); -/* harmony default export */ __webpack_exports__["default"] = (objOf); - -/***/ }), - -/***/ "./node_modules/ramda/es/of.js": -/*!*************************************!*\ - !*** ./node_modules/ramda/es/of.js ***! - \*************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _clone; } +/* harmony export */ }); +/* harmony import */ var _cloneRegExp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_cloneRegExp.js */ "./node_modules/ramda/es/internal/_cloneRegExp.js"); +/* harmony import */ var _type_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../type.js */ "./node_modules/ramda/es/type.js"); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); /** - * Given a constructor and a value, returns a new instance of that constructor - * containing the value. - * - * Dispatches to the `fantasy-land/of` method of the constructor first (if present) - * or to the `of` method last (if present). When neither are present, wraps the - * value in an array. - * - * Note this `of` is different from the ES6 `of`; See - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of - * - * @func - * @memberOf R - * @since v0.3.0 - * @category Function - * @sig (* -> {*}) -> a -> {a} - * @param {Object} Ctor A constructor - * @param {*} val any value - * @return {*} An instance of the `Ctor` wrapping `val`. - * @example + * Copies an object. * - * R.of(Array, 42); //=> [42] - * R.of(Array, [42]); //=> [[42]] - * R.of(Maybe, 42); //=> Maybe.Just(42) + * @private + * @param {*} value The value to be copied + * @param {Boolean} deep Whether or not to perform deep cloning. + * @return {*} The copied value. */ -var of = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function of(Ctor, val) { - return typeof Ctor['fantasy-land/of'] === 'function' ? Ctor['fantasy-land/of'](val) : typeof Ctor.of === 'function' ? Ctor.of(val) : [val]; -}); -/* harmony default export */ __webpack_exports__["default"] = (of); - -/***/ }), - -/***/ "./node_modules/ramda/es/omit.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/omit.js ***! - \***************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); - -/** - * Returns a partial copy of an object omitting the keys specified. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Object - * @sig [String] -> {String: *} -> {String: *} - * @param {Array} names an array of String property names to omit from the new object - * @param {Object} obj The object to copy from - * @return {Object} A new object with properties from `names` not on it. - * @see R.pick - * @example - * - * R.omit(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, c: 3} - */ +function _clone(value, deep, map) { + map || (map = new _ObjectMap()); // this avoids the slower switch with a quick if decision removing some milliseconds in each run. -var omit = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function omit(names, obj) { - var result = {}; - var index = {}; - var idx = 0; - var len = names.length; - while (idx < len) { - index[names[idx]] = 1; - idx += 1; + if (_isPrimitive(value)) { + return value; } - for (var prop in obj) { - if (!index.hasOwnProperty(prop)) { - result[prop] = obj[prop]; + var copy = function copy(copiedValue) { + // Check for circular and same references on the object graph and return its corresponding clone. + var cachedCopy = map.get(value); + if (cachedCopy) { + return cachedCopy; + } + map.set(value, copiedValue); + for (var key in value) { + if (Object.prototype.hasOwnProperty.call(value, key)) { + copiedValue[key] = deep ? _clone(value[key], true, map) : value[key]; + } } + return copiedValue; + }; + switch ((0,_type_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value)) { + case 'Object': + return copy(Object.create(Object.getPrototypeOf(value))); + case 'Array': + return copy([]); + case 'Date': + return new Date(value.valueOf()); + case 'RegExp': + return (0,_cloneRegExp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value); + case 'Int8Array': + case 'Uint8Array': + case 'Uint8ClampedArray': + case 'Int16Array': + case 'Uint16Array': + case 'Int32Array': + case 'Uint32Array': + case 'Float32Array': + case 'Float64Array': + case 'BigInt64Array': + case 'BigUint64Array': + return value.slice(); + default: + return value; } - return result; -}); -/* harmony default export */ __webpack_exports__["default"] = (omit); - -/***/ }), - -/***/ "./node_modules/ramda/es/on.js": -/*!*************************************!*\ - !*** ./node_modules/ramda/es/on.js ***! - \*************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curryN_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curryN.js */ "./node_modules/ramda/es/internal/_curryN.js"); - -/** - * Takes a binary function `f`, a unary function `g`, and two values. - * Applies `g` to each value, then applies the result of each to `f`. - * - * Also known as the P combinator. - * - * @func - * @memberOf R - * @since v0.28.0 - * @category Function - * @sig ((a, a) -> b) -> (c -> a) -> c -> c -> b - * @param {Function} f a binary function - * @param {Function} g a unary function - * @param {any} a any value - * @param {any} b any value - * @return {any} The result of `f` - * @example - * - * const eqBy = R.on((a, b) => a === b); - * eqBy(R.prop('a'), {b:0, a:1}, {a:1}) //=> true; - * - * const containsInsensitive = R.on(R.includes, R.toLower); - * containsInsensitive('o', 'FOO'); //=> true - * @symb R.on(f, g, a, b) = f(g(a), g(b)) - */ - -var on = /*#__PURE__*/ -(0,_internal_curryN_js__WEBPACK_IMPORTED_MODULE_0__["default"])(4, [], function on(f, g, a, b) { - return f(g(a), g(b)); -}); -/* harmony default export */ __webpack_exports__["default"] = (on); - -/***/ }), - -/***/ "./node_modules/ramda/es/once.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/once.js ***! - \***************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_arity_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_arity.js */ "./node_modules/ramda/es/internal/_arity.js"); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); - - -/** - * Accepts a function `fn` and returns a function that guards invocation of - * `fn` such that `fn` can only ever be called once, no matter how many times - * the returned function is invoked. The first value calculated is returned in - * subsequent invocations. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig (a... -> b) -> (a... -> b) - * @param {Function} fn The function to wrap in a call-only-once wrapper. - * @return {Function} The wrapped function. - * @example - * - * const addOneOnce = R.once(x => x + 1); - * addOneOnce(10); //=> 11 - * addOneOnce(addOneOnce(50)); //=> 11 - */ - -var once = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function once(fn) { - var called = false; - var result; - return (0,_internal_arity_js__WEBPACK_IMPORTED_MODULE_0__["default"])(fn.length, function () { - if (called) { - return result; +} +function _isPrimitive(param) { + var type = typeof param; + return param == null || type != 'object' && type != 'function'; +} +var _ObjectMap = /*#__PURE__*/ +function () { + function _ObjectMap() { + this.map = {}; + this.length = 0; + } + _ObjectMap.prototype.set = function (key, value) { + var hashedKey = this.hash(key); + var bucket = this.map[hashedKey]; + if (!bucket) { + this.map[hashedKey] = bucket = []; + } + bucket.push([key, value]); + this.length += 1; + }; + _ObjectMap.prototype.hash = function (key) { + var hashedKey = []; + for (var value in key) { + hashedKey.push(Object.prototype.toString.call(key[value])); + } + return hashedKey.join(); + }; + _ObjectMap.prototype.get = function (key) { + /** + * depending on the number of objects to be cloned is faster to just iterate over the items in the map just because the hash function is so costly, + * on my tests this number is 180, anything above that using the hash function is faster. + */ + if (this.length <= 180) { + for (var p in this.map) { + var _bucket = this.map[p]; + for (var i = 0; i < _bucket.length; i += 1) { + var element = _bucket[i]; + if (element[0] === key) { + return element[1]; + } + } + } + return; + } + var hashedKey = this.hash(key); + var bucket = this.map[hashedKey]; + if (!bucket) { + return; + } + for (var _i = 0; _i < bucket.length; _i += 1) { + var _element = bucket[_i]; + if (_element[0] === key) { + return _element[1]; + } } - called = true; - result = fn.apply(this, arguments); - return result; - }); -}); -/* harmony default export */ __webpack_exports__["default"] = (once); - -/***/ }), - -/***/ "./node_modules/ramda/es/or.js": -/*!*************************************!*\ - !*** ./node_modules/ramda/es/or.js ***! - \*************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); - -/** - * Returns the first argument if it is truthy, otherwise the second argument. - * Acts as the boolean `or` statement if both inputs are `Boolean`s. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Logic - * @sig a -> b -> a | b - * @param {Any} a - * @param {Any} b - * @return {Any} - * @see R.either, R.and - * @example - * - * R.or(true, true); //=> true - * R.or(true, false); //=> true - * R.or(false, true); //=> true - * R.or(false, false); //=> false - */ - -var or = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function or(a, b) { - return a || b; -}); -/* harmony default export */ __webpack_exports__["default"] = (or); + }; + return _ObjectMap; +}(); /***/ }), -/***/ "./node_modules/ramda/es/otherwise.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/otherwise.js ***! - \********************************************/ +/***/ "./node_modules/ramda/es/internal/_cloneRegExp.js": +/*!********************************************************!*\ + !*** ./node_modules/ramda/es/internal/_cloneRegExp.js ***! + \********************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_assertPromise_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_assertPromise.js */ "./node_modules/ramda/es/internal/_assertPromise.js"); - - -/** - * Returns the result of applying the onFailure function to the value inside - * a failed promise. This is useful for handling rejected promises - * inside function compositions. - * - * @func - * @memberOf R - * @since v0.26.0 - * @category Function - * @sig (e -> b) -> (Promise e a) -> (Promise e b) - * @sig (e -> (Promise f b)) -> (Promise e a) -> (Promise f b) - * @param {Function} onFailure The function to apply. Can return a value or a promise of a value. - * @param {Promise} p - * @return {Promise} The result of calling `p.then(null, onFailure)` - * @see R.andThen - * @example - * - * const failedFetch = id => Promise.reject('bad ID'); - * const useDefault = () => ({ firstName: 'Bob', lastName: 'Loblaw' }); - * - * //recoverFromFailure :: String -> Promise ({ firstName, lastName }) - * const recoverFromFailure = R.pipe( - * failedFetch, - * R.otherwise(useDefault), - * R.andThen(R.pick(['firstName', 'lastName'])), - * ); - * recoverFromFailure(12345).then(console.log); - */ - -var otherwise = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function otherwise(f, p) { - (0,_internal_assertPromise_js__WEBPACK_IMPORTED_MODULE_1__["default"])('otherwise', p); - return p.then(null, f); -}); -/* harmony default export */ __webpack_exports__["default"] = (otherwise); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _cloneRegExp; } +/* harmony export */ }); +function _cloneRegExp(pattern) { + return new RegExp(pattern.source, pattern.flags ? pattern.flags : (pattern.global ? 'g' : '') + (pattern.ignoreCase ? 'i' : '') + (pattern.multiline ? 'm' : '') + (pattern.sticky ? 'y' : '') + (pattern.unicode ? 'u' : '') + (pattern.dotAll ? 's' : '')); +} /***/ }), -/***/ "./node_modules/ramda/es/over.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/over.js ***! - \***************************************/ +/***/ "./node_modules/ramda/es/internal/_complement.js": +/*!*******************************************************!*\ + !*** ./node_modules/ramda/es/internal/_complement.js ***! + \*******************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); - // `Identity` is a functor that holds a single value, where `map` simply -// transforms the held value with the provided function. - -var Identity = function Identity(x) { - return { - value: x, - map: function map(f) { - return Identity(f(x)); - } +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _complement; } +/* harmony export */ }); +function _complement(f) { + return function () { + return !f.apply(this, arguments); }; -}; -/** - * Returns the result of "setting" the portion of the given data structure - * focused by the given lens to the result of applying the given function to - * the focused value. - * - * @func - * @memberOf R - * @since v0.16.0 - * @category Object - * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s - * @sig Lens s a -> (a -> a) -> s -> s - * @param {Lens} lens - * @param {*} v - * @param {*} x - * @return {*} - * @see R.view, R.set, R.lens, R.lensIndex, R.lensProp, R.lensPath - * @example - * - * const headLens = R.lensIndex(0); - * - * R.over(headLens, R.toUpper, ['foo', 'bar', 'baz']); //=> ['FOO', 'bar', 'baz'] - */ - -var over = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function over(lens, f, x) { - // The value returned by the getter function is first transformed with `f`, - // then set as the value of an `Identity`. This is then mapped over with the - // setter function of the lens. - return lens(function (y) { - return Identity(f(y)); - })(x).value; -}); -/* harmony default export */ __webpack_exports__["default"] = (over); +} /***/ }), -/***/ "./node_modules/ramda/es/pair.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/pair.js ***! - \***************************************/ +/***/ "./node_modules/ramda/es/internal/_concat.js": +/*!***************************************************!*\ + !*** ./node_modules/ramda/es/internal/_concat.js ***! + \***************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); - +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _concat; } +/* harmony export */ }); /** - * Takes two arguments, `fst` and `snd`, and returns `[fst, snd]`. + * Private `concat` function to merge two array-like objects. * - * @func - * @memberOf R - * @since v0.18.0 - * @category List - * @sig a -> b -> (a,b) - * @param {*} fst - * @param {*} snd - * @return {Array} - * @see R.objOf, R.of + * @private + * @param {Array|Arguments} [set1=[]] An array-like object. + * @param {Array|Arguments} [set2=[]] An array-like object. + * @return {Array} A new, merged array. * @example * - * R.pair('foo', 'bar'); //=> ['foo', 'bar'] + * _concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3] */ - -var pair = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function pair(fst, snd) { - return [fst, snd]; -}); -/* harmony default export */ __webpack_exports__["default"] = (pair); +function _concat(set1, set2) { + set1 = set1 || []; + set2 = set2 || []; + var idx; + var len1 = set1.length; + var len2 = set2.length; + var result = []; + idx = 0; + while (idx < len1) { + result[result.length] = set1[idx]; + idx += 1; + } + idx = 0; + while (idx < len2) { + result[result.length] = set2[idx]; + idx += 1; + } + return result; +} /***/ }), -/***/ "./node_modules/ramda/es/partial.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/partial.js ***! - \******************************************/ +/***/ "./node_modules/ramda/es/internal/_createReduce.js": +/*!*********************************************************!*\ + !*** ./node_modules/ramda/es/internal/_createReduce.js ***! + \*********************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_concat_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_concat.js */ "./node_modules/ramda/es/internal/_concat.js"); -/* harmony import */ var _internal_createPartialApplicator_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_createPartialApplicator.js */ "./node_modules/ramda/es/internal/_createPartialApplicator.js"); - - -/** - * Takes a function `f` and a list of arguments, and returns a function `g`. - * When applied, `g` returns the result of applying `f` to the arguments - * provided initially followed by the arguments provided to `g`. - * - * @func - * @memberOf R - * @since v0.10.0 - * @category Function - * @sig ((a, b, c, ..., n) -> x) -> [a, b, c, ...] -> ((d, e, f, ..., n) -> x) - * @param {Function} f - * @param {Array} args - * @return {Function} - * @see R.partialRight, R.curry - * @example - * - * const multiply2 = (a, b) => a * b; - * const double = R.partial(multiply2, [2]); - * double(3); //=> 6 - * - * const greet = (salutation, title, firstName, lastName) => - * salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!'; - * - * const sayHello = R.partial(greet, ['Hello']); - * const sayHelloToMs = R.partial(sayHello, ['Ms.']); - * sayHelloToMs('Jane', 'Jones'); //=> 'Hello, Ms. Jane Jones!' - * @symb R.partial(f, [a, b])(c, d) = f(a, b, c, d) - */ +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _createReduce; } +/* harmony export */ }); +/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArrayLike.js */ "./node_modules/ramda/es/internal/_isArrayLike.js"); -var partial = /*#__PURE__*/ -(0,_internal_createPartialApplicator_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_internal_concat_js__WEBPACK_IMPORTED_MODULE_0__["default"]); -/* harmony default export */ __webpack_exports__["default"] = (partial); +var symIterator = typeof Symbol !== 'undefined' ? Symbol.iterator : '@@iterator'; +function _createReduce(arrayReduce, methodReduce, iterableReduce) { + return function _reduce(xf, acc, list) { + if ((0,_isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__["default"])(list)) { + return arrayReduce(xf, acc, list); + } + if (list == null) { + return acc; + } + if (typeof list['fantasy-land/reduce'] === 'function') { + return methodReduce(xf, acc, list, 'fantasy-land/reduce'); + } + if (list[symIterator] != null) { + return iterableReduce(xf, acc, list[symIterator]()); + } + if (typeof list.next === 'function') { + return iterableReduce(xf, acc, list); + } + if (typeof list.reduce === 'function') { + return methodReduce(xf, acc, list, 'reduce'); + } + throw new TypeError('reduce: list must be array or iterable'); + }; +} /***/ }), -/***/ "./node_modules/ramda/es/partialObject.js": -/*!************************************************!*\ - !*** ./node_modules/ramda/es/partialObject.js ***! - \************************************************/ +/***/ "./node_modules/ramda/es/internal/_curry1.js": +/*!***************************************************!*\ + !*** ./node_modules/ramda/es/internal/_curry1.js ***! + \***************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _mergeDeepRight_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mergeDeepRight.js */ "./node_modules/ramda/es/mergeDeepRight.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -var _this = undefined; - +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _curry1; } +/* harmony export */ }); +/* harmony import */ var _isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isPlaceholder.js */ "./node_modules/ramda/es/internal/_isPlaceholder.js"); /** - * Takes a function `f` and an object, and returns a function `g`. - * When applied, `g` returns the result of applying `f` to the object - * provided initially merged deeply (right) with the object provided as an argument to `g`. + * Optimized internal one-arity curry function. * - * @func - * @memberOf R - * @since v0.28.0 + * @private * @category Function - * @sig (({ a, b, c, ..., n }) -> x) -> { a, b, c, ...} -> ({ d, e, f, ..., n } -> x) - * @param {Function} f - * @param {Object} props - * @return {Function} - * @see R.partial, R.partialRight, R.curry, R.mergeDeepRight - * @example - * - * const multiply2 = ({ a, b }) => a * b; - * const double = R.partialObject(multiply2, { a: 2 }); - * double({ b: 2 }); //=> 4 - * - * const greet = ({ salutation, title, firstName, lastName }) => - * salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!'; - * - * const sayHello = R.partialObject(greet, { salutation: 'Hello' }); - * const sayHelloToMs = R.partialObject(sayHello, { title: 'Ms.' }); - * sayHelloToMs({ firstName: 'Jane', lastName: 'Jones' }); //=> 'Hello, Ms. Jane Jones!' - * @symb R.partialObject(f, { a, b })({ c, d }) = f({ a, b, c, d }) + * @param {Function} fn The function to curry. + * @return {Function} The curried function. */ -var partialObject = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (f, o) { - return function (props) { - return f.call(_this, (0,_mergeDeepRight_js__WEBPACK_IMPORTED_MODULE_0__["default"])(o, props)); +function _curry1(fn) { + return function f1(a) { + if (arguments.length === 0 || (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(a)) { + return f1; + } else { + return fn.apply(this, arguments); + } }; -}); -/* harmony default export */ __webpack_exports__["default"] = (partialObject); +} /***/ }), -/***/ "./node_modules/ramda/es/partialRight.js": -/*!***********************************************!*\ - !*** ./node_modules/ramda/es/partialRight.js ***! - \***********************************************/ +/***/ "./node_modules/ramda/es/internal/_curry2.js": +/*!***************************************************!*\ + !*** ./node_modules/ramda/es/internal/_curry2.js ***! + \***************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_concat_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_concat.js */ "./node_modules/ramda/es/internal/_concat.js"); -/* harmony import */ var _internal_createPartialApplicator_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_createPartialApplicator.js */ "./node_modules/ramda/es/internal/_createPartialApplicator.js"); -/* harmony import */ var _flip_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./flip.js */ "./node_modules/ramda/es/flip.js"); - +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _curry2; } +/* harmony export */ }); +/* harmony import */ var _curry1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +/* harmony import */ var _isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isPlaceholder.js */ "./node_modules/ramda/es/internal/_isPlaceholder.js"); /** - * Takes a function `f` and a list of arguments, and returns a function `g`. - * When applied, `g` returns the result of applying `f` to the arguments - * provided to `g` followed by the arguments provided initially. + * Optimized internal two-arity curry function. * - * @func - * @memberOf R - * @since v0.10.0 + * @private * @category Function - * @sig ((a, b, c, ..., n) -> x) -> [d, e, f, ..., n] -> ((a, b, c, ...) -> x) - * @param {Function} f - * @param {Array} args - * @return {Function} - * @see R.partial - * @example - * - * const greet = (salutation, title, firstName, lastName) => - * salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!'; - * - * const greetMsJaneJones = R.partialRight(greet, ['Ms.', 'Jane', 'Jones']); - * - * greetMsJaneJones('Hello'); //=> 'Hello, Ms. Jane Jones!' - * @symb R.partialRight(f, [a, b])(c, d) = f(c, d, a, b) + * @param {Function} fn The function to curry. + * @return {Function} The curried function. */ -var partialRight = /*#__PURE__*/ -(0,_internal_createPartialApplicator_js__WEBPACK_IMPORTED_MODULE_1__["default"])( /*#__PURE__*/ -(0,_flip_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_internal_concat_js__WEBPACK_IMPORTED_MODULE_0__["default"])); -/* harmony default export */ __webpack_exports__["default"] = (partialRight); +function _curry2(fn) { + return function f2(a, b) { + switch (arguments.length) { + case 0: + return f2; + case 1: + return (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(a) ? f2 : (0,_curry1_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (_b) { + return fn(a, _b); + }); + default: + return (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(a) && (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(b) ? f2 : (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(a) ? (0,_curry1_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (_a) { + return fn(_a, b); + }) : (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(b) ? (0,_curry1_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (_b) { + return fn(a, _b); + }) : fn(a, b); + } + }; +} /***/ }), -/***/ "./node_modules/ramda/es/partition.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/partition.js ***! - \********************************************/ +/***/ "./node_modules/ramda/es/internal/_curry3.js": +/*!***************************************************!*\ + !*** ./node_modules/ramda/es/internal/_curry3.js ***! + \***************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _filter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./filter.js */ "./node_modules/ramda/es/filter.js"); -/* harmony import */ var _juxt_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./juxt.js */ "./node_modules/ramda/es/juxt.js"); -/* harmony import */ var _reject_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./reject.js */ "./node_modules/ramda/es/reject.js"); - - - -/** - * Takes a predicate and a list or other `Filterable` object and returns the - * pair of filterable objects of the same type of elements which do and do not - * satisfy, the predicate, respectively. Filterable objects include plain objects or any object - * that has a filter method such as `Array`. - * - * @func - * @memberOf R - * @since v0.1.4 - * @category List - * @sig Filterable f => (a -> Boolean) -> f a -> [f a, f a] - * @param {Function} pred A predicate to determine which side the element belongs to. - * @param {Array} filterable the list (or other filterable) to partition. - * @return {Array} An array, containing first the subset of elements that satisfy the - * predicate, and second the subset of elements that do not satisfy. - * @see R.filter, R.reject - * @example - * - * R.partition(R.includes('s'), ['sss', 'ttt', 'foo', 'bars']); - * // => [ [ 'sss', 'bars' ], [ 'ttt', 'foo' ] ] - * - * R.partition(R.includes('s'), { a: 'sss', b: 'ttt', foo: 'bars' }); - * // => [ { a: 'sss', foo: 'bars' }, { b: 'ttt' } ] - */ - -var partition = /*#__PURE__*/ -(0,_juxt_js__WEBPACK_IMPORTED_MODULE_1__["default"])([_filter_js__WEBPACK_IMPORTED_MODULE_0__["default"], _reject_js__WEBPACK_IMPORTED_MODULE_2__["default"]]); -/* harmony default export */ __webpack_exports__["default"] = (partition); - -/***/ }), - -/***/ "./node_modules/ramda/es/path.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/path.js ***! - \***************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _curry3; } +/* harmony export */ }); +/* harmony import */ var _curry1_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +/* harmony import */ var _curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isPlaceholder.js */ "./node_modules/ramda/es/internal/_isPlaceholder.js"); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _paths_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./paths.js */ "./node_modules/ramda/es/paths.js"); /** - * Retrieves the value at a given path. The nodes of the path can be arbitrary strings or non-negative integers. - * For anything else, the value is unspecified. Integer paths are meant to index arrays, strings are meant for objects. - * - * @func - * @memberOf R - * @since v0.2.0 - * @category Object - * @typedefn Idx = String | Int | Symbol - * @sig [Idx] -> {a} -> a | Undefined - * @sig Idx = String | NonNegativeInt - * @param {Array} path The path to use. - * @param {Object} obj The object or array to retrieve the nested property from. - * @return {*} The data at `path`. - * @see R.prop, R.nth, R.assocPath, R.dissocPath - * @example + * Optimized internal three-arity curry function. * - * R.path(['a', 'b'], {a: {b: 2}}); //=> 2 - * R.path(['a', 'b'], {c: {b: 2}}); //=> undefined - * R.path(['a', 'b', 0], {a: {b: [1, 2, 3]}}); //=> 1 - * R.path(['a', 'b', -2], {a: {b: [1, 2, 3]}}); //=> 2 - * R.path([2], {'2': 2}); //=> 2 - * R.path([-2], {'-2': 'a'}); //=> undefined + * @private + * @category Function + * @param {Function} fn The function to curry. + * @return {Function} The curried function. */ -var path = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function path(pathAr, obj) { - return (0,_paths_js__WEBPACK_IMPORTED_MODULE_1__["default"])([pathAr], obj)[0]; -}); -/* harmony default export */ __webpack_exports__["default"] = (path); +function _curry3(fn) { + return function f3(a, b, c) { + switch (arguments.length) { + case 0: + return f3; + case 1: + return (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(a) ? f3 : (0,_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (_b, _c) { + return fn(a, _b, _c); + }); + case 2: + return (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(a) && (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(b) ? f3 : (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(a) ? (0,_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (_a, _c) { + return fn(_a, b, _c); + }) : (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(b) ? (0,_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (_b, _c) { + return fn(a, _b, _c); + }) : (0,_curry1_js__WEBPACK_IMPORTED_MODULE_2__["default"])(function (_c) { + return fn(a, b, _c); + }); + default: + return (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(a) && (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(b) && (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(c) ? f3 : (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(a) && (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(b) ? (0,_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (_a, _b) { + return fn(_a, _b, c); + }) : (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(a) && (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(c) ? (0,_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (_a, _c) { + return fn(_a, b, _c); + }) : (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(b) && (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(c) ? (0,_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (_b, _c) { + return fn(a, _b, _c); + }) : (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(a) ? (0,_curry1_js__WEBPACK_IMPORTED_MODULE_2__["default"])(function (_a) { + return fn(_a, b, c); + }) : (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(b) ? (0,_curry1_js__WEBPACK_IMPORTED_MODULE_2__["default"])(function (_b) { + return fn(a, _b, c); + }) : (0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(c) ? (0,_curry1_js__WEBPACK_IMPORTED_MODULE_2__["default"])(function (_c) { + return fn(a, b, _c); + }) : fn(a, b, c); + } + }; +} /***/ }), -/***/ "./node_modules/ramda/es/pathEq.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/pathEq.js ***! - \*****************************************/ +/***/ "./node_modules/ramda/es/internal/_curryN.js": +/*!***************************************************!*\ + !*** ./node_modules/ramda/es/internal/_curryN.js ***! + \***************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _equals_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./equals.js */ "./node_modules/ramda/es/equals.js"); -/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./path.js */ "./node_modules/ramda/es/path.js"); - +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _curryN; } +/* harmony export */ }); +/* harmony import */ var _arity_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_arity.js */ "./node_modules/ramda/es/internal/_arity.js"); +/* harmony import */ var _isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isPlaceholder.js */ "./node_modules/ramda/es/internal/_isPlaceholder.js"); /** - * Determines whether a nested path on an object has a specific value, in - * [`R.equals`](#equals) terms. Most likely used to filter a list. - * - * @func - * @memberOf R - * @since v0.7.0 - * @category Relation - * @typedefn Idx = String | Int | Symbol - * @sig a -> [Idx] -> {a} -> Boolean - * @param {*} val The value to compare the nested property with - * @param {Array} path The path of the nested property to use - * @param {Object} obj The object to check the nested property in - * @return {Boolean} `true` if the value equals the nested object property, - * `false` otherwise. - * @see R.whereEq, R.propEq, R.pathSatisfies, R.equals - * @example + * Internal curryN function. * - * const user1 = { address: { zipCode: 90210 } }; - * const user2 = { address: { zipCode: 55555 } }; - * const user3 = { name: 'Bob' }; - * const users = [ user1, user2, user3 ]; - * const isFamous = R.pathEq(90210, ['address', 'zipCode']); - * R.filter(isFamous, users); //=> [ user1 ] + * @private + * @category Function + * @param {Number} length The arity of the curried function. + * @param {Array} received An array of arguments received thus far. + * @param {Function} fn The function to curry. + * @return {Function} The curried function. */ -var pathEq = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function pathEq(val, _path, obj) { - return (0,_equals_js__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_path_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_path, obj), val); -}); -/* harmony default export */ __webpack_exports__["default"] = (pathEq); +function _curryN(length, received, fn) { + return function () { + var combined = []; + var argsIdx = 0; + var left = length; + var combinedIdx = 0; + var hasPlaceholder = false; + while (combinedIdx < received.length || argsIdx < arguments.length) { + var result; + if (combinedIdx < received.length && (!(0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(received[combinedIdx]) || argsIdx >= arguments.length)) { + result = received[combinedIdx]; + } else { + result = arguments[argsIdx]; + argsIdx += 1; + } + combined[combinedIdx] = result; + if (!(0,_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(result)) { + left -= 1; + } else { + hasPlaceholder = true; + } + combinedIdx += 1; + } + return !hasPlaceholder && left <= 0 ? fn.apply(this, combined) : (0,_arity_js__WEBPACK_IMPORTED_MODULE_1__["default"])(Math.max(0, left), _curryN(length, combined, fn)); + }; +} /***/ }), -/***/ "./node_modules/ramda/es/pathOr.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/pathOr.js ***! - \*****************************************/ +/***/ "./node_modules/ramda/es/internal/_dispatchable.js": +/*!*********************************************************!*\ + !*** ./node_modules/ramda/es/internal/_dispatchable.js ***! + \*********************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _defaultTo_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./defaultTo.js */ "./node_modules/ramda/es/defaultTo.js"); -/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./path.js */ "./node_modules/ramda/es/path.js"); - +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _dispatchable; } +/* harmony export */ }); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); +/* harmony import */ var _isTransformer_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isTransformer.js */ "./node_modules/ramda/es/internal/_isTransformer.js"); /** - * If the given, non-null object has a value at the given path, returns the - * value at that path. Otherwise returns the provided default value. - * - * @func - * @memberOf R - * @since v0.18.0 - * @category Object - * @typedefn Idx = String | Int | Symbol - * @sig a -> [Idx] -> {a} -> a - * @param {*} d The default value. - * @param {Array} p The path to use. - * @param {Object} obj The object to retrieve the nested property from. - * @return {*} The data at `path` of the supplied object or the default value. - * @example + * Returns a function that dispatches with different strategies based on the + * object in list position (last argument). If it is an array, executes [fn]. + * Otherwise, if it has a function with one of the given method names, it will + * execute that function (functor case). Otherwise, if it is a transformer, + * uses transducer created by [transducerCreator] to return a new transformer + * (transducer case). + * Otherwise, it will default to executing [fn]. * - * R.pathOr('N/A', ['a', 'b'], {a: {b: 2}}); //=> 2 - * R.pathOr('N/A', ['a', 'b'], {c: {b: 2}}); //=> "N/A" + * @private + * @param {Array} methodNames properties to check for a custom implementation + * @param {Function} transducerCreator transducer factory if object is transformer + * @param {Function} fn default ramda implementation + * @return {Function} A function that dispatches on object in list position */ -var pathOr = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function pathOr(d, p, obj) { - return (0,_defaultTo_js__WEBPACK_IMPORTED_MODULE_1__["default"])(d, (0,_path_js__WEBPACK_IMPORTED_MODULE_2__["default"])(p, obj)); -}); -/* harmony default export */ __webpack_exports__["default"] = (pathOr); +function _dispatchable(methodNames, transducerCreator, fn) { + return function () { + if (arguments.length === 0) { + return fn(); + } + var obj = arguments[arguments.length - 1]; + if (!(0,_isArray_js__WEBPACK_IMPORTED_MODULE_0__["default"])(obj)) { + var idx = 0; + while (idx < methodNames.length) { + if (typeof obj[methodNames[idx]] === 'function') { + return obj[methodNames[idx]].apply(obj, Array.prototype.slice.call(arguments, 0, -1)); + } + idx += 1; + } + if ((0,_isTransformer_js__WEBPACK_IMPORTED_MODULE_1__["default"])(obj)) { + var transducer = transducerCreator.apply(null, Array.prototype.slice.call(arguments, 0, -1)); + return transducer(obj); + } + } + return fn.apply(this, arguments); + }; +} /***/ }), -/***/ "./node_modules/ramda/es/pathSatisfies.js": -/*!************************************************!*\ - !*** ./node_modules/ramda/es/pathSatisfies.js ***! - \************************************************/ +/***/ "./node_modules/ramda/es/internal/_dissoc.js": +/*!***************************************************!*\ + !*** ./node_modules/ramda/es/internal/_dissoc.js ***! + \***************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./node_modules/ramda/es/path.js"); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _dissoc; } +/* harmony export */ }); +/* harmony import */ var _isInteger_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isInteger.js */ "./node_modules/ramda/es/internal/_isInteger.js"); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); +/* harmony import */ var _remove_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../remove.js */ "./node_modules/ramda/es/remove.js"); + /** - * Returns `true` if the specified object property at given path satisfies the - * given predicate; `false` otherwise. - * - * @func - * @memberOf R - * @since v0.19.0 - * @category Logic - * @typedefn Idx = String | Int | Symbol - * @sig (a -> Boolean) -> [Idx] -> {a} -> Boolean - * @param {Function} pred - * @param {Array} propPath - * @param {*} obj - * @return {Boolean} - * @see R.propSatisfies, R.path - * @example + * Returns a new object that does not contain a `prop` property. * - * R.pathSatisfies(y => y > 0, ['x', 'y'], {x: {y: 2}}); //=> true - * R.pathSatisfies(R.is(Object), [], {x: {y: 2}}); //=> true + * @private + * @param {String|Number} prop The name of the property to dissociate + * @param {Object|Array} obj The object to clone + * @return {Object} A new object equivalent to the original but without the specified property */ -var pathSatisfies = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function pathSatisfies(pred, propPath, obj) { - return pred((0,_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(propPath, obj)); -}); -/* harmony default export */ __webpack_exports__["default"] = (pathSatisfies); +function _dissoc(prop, obj) { + if (obj == null) { + return obj; + } + if ((0,_isInteger_js__WEBPACK_IMPORTED_MODULE_0__["default"])(prop) && (0,_isArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(obj)) { + return (0,_remove_js__WEBPACK_IMPORTED_MODULE_2__["default"])(prop, 1, obj); + } + var result = {}; + for (var p in obj) { + result[p] = obj[p]; + } + delete result[prop]; + return result; +} /***/ }), -/***/ "./node_modules/ramda/es/paths.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/paths.js ***! - \****************************************/ +/***/ "./node_modules/ramda/es/internal/_equals.js": +/*!***************************************************!*\ + !*** ./node_modules/ramda/es/internal/_equals.js ***! + \***************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_isInteger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isInteger.js */ "./node_modules/ramda/es/internal/_isInteger.js"); -/* harmony import */ var _nth_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./nth.js */ "./node_modules/ramda/es/nth.js"); - +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _equals; } +/* harmony export */ }); +/* harmony import */ var _arrayFromIterator_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayFromIterator.js */ "./node_modules/ramda/es/internal/_arrayFromIterator.js"); +/* harmony import */ var _includesWith_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_includesWith.js */ "./node_modules/ramda/es/internal/_includesWith.js"); +/* harmony import */ var _functionName_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_functionName.js */ "./node_modules/ramda/es/internal/_functionName.js"); +/* harmony import */ var _has_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./_has.js */ "./node_modules/ramda/es/internal/_has.js"); +/* harmony import */ var _objectIs_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_objectIs.js */ "./node_modules/ramda/es/internal/_objectIs.js"); +/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../keys.js */ "./node_modules/ramda/es/keys.js"); +/* harmony import */ var _type_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../type.js */ "./node_modules/ramda/es/type.js"); -/** - * Retrieves the values at given paths of an object. - * - * @func - * @memberOf R - * @since v0.27.1 - * @category Object - * @typedefn Idx = [String | Int | Symbol] - * @sig [Idx] -> {a} -> [a | Undefined] - * @param {Array} pathsArray The array of paths to be fetched. - * @param {Object} obj The object to retrieve the nested properties from. - * @return {Array} A list consisting of values at paths specified by "pathsArray". - * @see R.path - * @example - * - * R.paths([['a', 'b'], ['p', 0, 'q']], {a: {b: 2}, p: [{q: 3}]}); //=> [2, 3] - * R.paths([['a', 'b'], ['p', 'r']], {a: {b: 2}, p: [{q: 3}]}); //=> [2, undefined] - */ -var paths = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function paths(pathsArray, obj) { - return pathsArray.map(function (paths) { - var val = obj; - var idx = 0; - var p; - while (idx < paths.length) { - if (val == null) { - return; - } - p = paths[idx]; - val = (0,_internal_isInteger_js__WEBPACK_IMPORTED_MODULE_1__["default"])(p) ? (0,_nth_js__WEBPACK_IMPORTED_MODULE_2__["default"])(p, val) : val[p]; - idx += 1; - } - return val; - }); -}); -/* harmony default export */ __webpack_exports__["default"] = (paths); -/***/ }), -/***/ "./node_modules/ramda/es/pick.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/pick.js ***! - \***************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); /** - * Returns a partial copy of an object containing only the keys specified. If - * the key does not exist, the property is ignored. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Object - * @sig [k] -> {k: v} -> {k: v} - * @param {Array} names an array of String property names to copy onto a new object - * @param {Object} obj The object to copy from - * @return {Object} A new object with only properties from `names` on it. - * @see R.omit, R.props - * @example + * private _uniqContentEquals function. + * That function is checking equality of 2 iterator contents with 2 assumptions + * - iterators lengths are the same + * - iterators values are unique * - * R.pick(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, d: 4} - * R.pick(['a', 'e', 'f'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1} - */ + * false-positive result will be returned for comparison of, e.g. + * - [1,2,3] and [1,2,3,4] + * - [1,1,1] and [1,2,3] + * */ -var pick = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function pick(names, obj) { - var result = {}; - var idx = 0; - while (idx < names.length) { - if (names[idx] in obj) { - result[names[idx]] = obj[names[idx]]; +function _uniqContentEquals(aIterator, bIterator, stackA, stackB) { + var a = (0,_arrayFromIterator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(aIterator); + var b = (0,_arrayFromIterator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bIterator); + function eq(_a, _b) { + return _equals(_a, _b, stackA.slice(), stackB.slice()); + } // if *a* array contains any element that is not included in *b* + + return !(0,_includesWith_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (b, aItem) { + return !(0,_includesWith_js__WEBPACK_IMPORTED_MODULE_1__["default"])(eq, aItem, b); + }, b, a); +} +function _equals(a, b, stackA, stackB) { + if ((0,_objectIs_js__WEBPACK_IMPORTED_MODULE_2__["default"])(a, b)) { + return true; + } + var typeA = (0,_type_js__WEBPACK_IMPORTED_MODULE_3__["default"])(a); + if (typeA !== (0,_type_js__WEBPACK_IMPORTED_MODULE_3__["default"])(b)) { + return false; + } + if (typeof a['fantasy-land/equals'] === 'function' || typeof b['fantasy-land/equals'] === 'function') { + return typeof a['fantasy-land/equals'] === 'function' && a['fantasy-land/equals'](b) && typeof b['fantasy-land/equals'] === 'function' && b['fantasy-land/equals'](a); + } + if (typeof a.equals === 'function' || typeof b.equals === 'function') { + return typeof a.equals === 'function' && a.equals(b) && typeof b.equals === 'function' && b.equals(a); + } + switch (typeA) { + case 'Arguments': + case 'Array': + case 'Object': + if (typeof a.constructor === 'function' && (0,_functionName_js__WEBPACK_IMPORTED_MODULE_4__["default"])(a.constructor) === 'Promise') { + return a === b; + } + break; + case 'Boolean': + case 'Number': + case 'String': + if (!(typeof a === typeof b && (0,_objectIs_js__WEBPACK_IMPORTED_MODULE_2__["default"])(a.valueOf(), b.valueOf()))) { + return false; + } + break; + case 'Date': + if (!(0,_objectIs_js__WEBPACK_IMPORTED_MODULE_2__["default"])(a.valueOf(), b.valueOf())) { + return false; + } + break; + case 'Error': + return a.name === b.name && a.message === b.message; + case 'RegExp': + if (!(a.source === b.source && a.global === b.global && a.ignoreCase === b.ignoreCase && a.multiline === b.multiline && a.sticky === b.sticky && a.unicode === b.unicode)) { + return false; + } + break; + } + var idx = stackA.length - 1; + while (idx >= 0) { + if (stackA[idx] === a) { + return stackB[idx] === b; } - idx += 1; + idx -= 1; } - return result; -}); -/* harmony default export */ __webpack_exports__["default"] = (pick); + switch (typeA) { + case 'Map': + if (a.size !== b.size) { + return false; + } + return _uniqContentEquals(a.entries(), b.entries(), stackA.concat([a]), stackB.concat([b])); + case 'Set': + if (a.size !== b.size) { + return false; + } + return _uniqContentEquals(a.values(), b.values(), stackA.concat([a]), stackB.concat([b])); + case 'Arguments': + case 'Array': + case 'Object': + case 'Boolean': + case 'Number': + case 'String': + case 'Date': + case 'Error': + case 'RegExp': + case 'Int8Array': + case 'Uint8Array': + case 'Uint8ClampedArray': + case 'Int16Array': + case 'Uint16Array': + case 'Int32Array': + case 'Uint32Array': + case 'Float32Array': + case 'Float64Array': + case 'ArrayBuffer': + break; + default: + // Values of other types are only equal if identical. + return false; + } + var keysA = (0,_keys_js__WEBPACK_IMPORTED_MODULE_5__["default"])(a); + if (keysA.length !== (0,_keys_js__WEBPACK_IMPORTED_MODULE_5__["default"])(b).length) { + return false; + } + var extendedStackA = stackA.concat([a]); + var extendedStackB = stackB.concat([b]); + idx = keysA.length - 1; + while (idx >= 0) { + var key = keysA[idx]; + if (!((0,_has_js__WEBPACK_IMPORTED_MODULE_6__["default"])(key, b) && _equals(b[key], a[key], extendedStackA, extendedStackB))) { + return false; + } + idx -= 1; + } + return true; +} /***/ }), -/***/ "./node_modules/ramda/es/pickAll.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/pickAll.js ***! - \******************************************/ +/***/ "./node_modules/ramda/es/internal/_filter.js": +/*!***************************************************!*\ + !*** ./node_modules/ramda/es/internal/_filter.js ***! + \***************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); - -/** - * Similar to `pick` except that this one includes a `key: undefined` pair for - * properties that don't exist. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Object - * @sig [k] -> {k: v} -> {k: v} - * @param {Array} names an array of String property names to copy onto a new object - * @param {Object} obj The object to copy from - * @return {Object} A new object with only properties from `names` on it. - * @see R.pick - * @example - * - * R.pickAll(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, d: 4} - * R.pickAll(['a', 'e', 'f'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, e: undefined, f: undefined} - */ - -var pickAll = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function pickAll(names, obj) { - var result = {}; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _filter; } +/* harmony export */ }); +function _filter(fn, list) { var idx = 0; - var len = names.length; + var len = list.length; + var result = []; while (idx < len) { - var name = names[idx]; - result[name] = obj[name]; + if (fn(list[idx])) { + result[result.length] = list[idx]; + } idx += 1; } return result; -}); -/* harmony default export */ __webpack_exports__["default"] = (pickAll); +} /***/ }), -/***/ "./node_modules/ramda/es/pickBy.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/pickBy.js ***! - \*****************************************/ +/***/ "./node_modules/ramda/es/internal/_functionName.js": +/*!*********************************************************!*\ + !*** ./node_modules/ramda/es/internal/_functionName.js ***! + \*********************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); - -/** - * Returns a partial copy of an object containing only the keys that satisfy - * the supplied predicate. - * - * @func - * @memberOf R - * @since v0.8.0 - * @category Object - * @sig ((v, k) -> Boolean) -> {k: v} -> {k: v} - * @param {Function} pred A predicate to determine whether or not a key - * should be included on the output object. - * @param {Object} obj The object to copy from - * @return {Object} A new object with only properties that satisfy `pred` - * on it. - * @see R.pick, R.filter - * @example - * - * const isUpperCase = (val, key) => key.toUpperCase() === key; - * R.pickBy(isUpperCase, {a: 1, b: 2, A: 3, B: 4}); //=> {A: 3, B: 4} - */ - -var pickBy = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function pickBy(test, obj) { - var result = {}; - for (var prop in obj) { - if (test(obj[prop], prop, obj)) { - result[prop] = obj[prop]; - } - } - return result; -}); -/* harmony default export */ __webpack_exports__["default"] = (pickBy); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _functionName; } +/* harmony export */ }); +function _functionName(f) { + // String(x => x) evaluates to "x => x", so the pattern may not match. + var match = String(f).match(/^function (\w*)/); + return match == null ? '' : match[1]; +} /***/ }), -/***/ "./node_modules/ramda/es/pipe.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/pipe.js ***! - \***************************************/ +/***/ "./node_modules/ramda/es/internal/_has.js": +/*!************************************************!*\ + !*** ./node_modules/ramda/es/internal/_has.js ***! + \************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ pipe; } +/* harmony export */ "default": function() { return /* binding */ _has; } /* harmony export */ }); -/* harmony import */ var _internal_arity_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_arity.js */ "./node_modules/ramda/es/internal/_arity.js"); -/* harmony import */ var _internal_pipe_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_pipe.js */ "./node_modules/ramda/es/internal/_pipe.js"); -/* harmony import */ var _reduce_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./reduce.js */ "./node_modules/ramda/es/reduce.js"); -/* harmony import */ var _tail_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tail.js */ "./node_modules/ramda/es/tail.js"); - - - - -/** - * Performs left-to-right function composition. The first argument may have - * any arity; the remaining arguments must be unary. - * - * In some libraries this function is named `sequence`. - * - * **Note:** The result of pipe is not automatically curried. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig (((a, b, ..., n) -> o), (o -> p), ..., (x -> y), (y -> z)) -> ((a, b, ..., n) -> z) - * @param {...Function} functions - * @return {Function} - * @see R.compose - * @example - * - * const f = R.pipe(Math.pow, R.negate, R.inc); - * - * f(3, 4); // -(3^4) + 1 - * @symb R.pipe(f, g, h)(a, b) = h(g(f(a, b))) - * @symb R.pipe(f, g, h)(a)(b) = h(g(f(a)))(b) - */ - -function pipe() { - if (arguments.length === 0) { - throw new Error('pipe requires at least one argument'); - } - return (0,_internal_arity_js__WEBPACK_IMPORTED_MODULE_0__["default"])(arguments[0].length, (0,_reduce_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_internal_pipe_js__WEBPACK_IMPORTED_MODULE_1__["default"], arguments[0], (0,_tail_js__WEBPACK_IMPORTED_MODULE_3__["default"])(arguments))); +function _has(prop, obj) { + return Object.prototype.hasOwnProperty.call(obj, prop); } /***/ }), -/***/ "./node_modules/ramda/es/pipeWith.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/pipeWith.js ***! - \*******************************************/ +/***/ "./node_modules/ramda/es/internal/_identity.js": +/*!*****************************************************!*\ + !*** ./node_modules/ramda/es/internal/_identity.js ***! + \*****************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_arity_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_arity.js */ "./node_modules/ramda/es/internal/_arity.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _head_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./head.js */ "./node_modules/ramda/es/head.js"); -/* harmony import */ var _internal_reduce_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_reduce.js */ "./node_modules/ramda/es/internal/_reduce.js"); -/* harmony import */ var _tail_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tail.js */ "./node_modules/ramda/es/tail.js"); -/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./identity.js */ "./node_modules/ramda/es/identity.js"); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _identity; } +/* harmony export */ }); +function _identity(x) { + return x; +} +/***/ }), +/***/ "./node_modules/ramda/es/internal/_includes.js": +/*!*****************************************************!*\ + !*** ./node_modules/ramda/es/internal/_includes.js ***! + \*****************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _includes; } +/* harmony export */ }); +/* harmony import */ var _indexOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_indexOf.js */ "./node_modules/ramda/es/internal/_indexOf.js"); +function _includes(a, list) { + return (0,_indexOf_js__WEBPACK_IMPORTED_MODULE_0__["default"])(list, a, 0) >= 0; +} +/***/ }), -/** - * Performs left-to-right function composition using transforming function. The first function may have - * any arity; the remaining functions must be unary. - * - * **Note:** The result of pipeWith is not automatically curried. Transforming function is not used on the - * first argument. - * - * @func - * @memberOf R - * @since v0.26.0 - * @category Function - * @sig ((* -> *), [((a, b, ..., n) -> o), (o -> p), ..., (x -> y), (y -> z)]) -> ((a, b, ..., n) -> z) - * @param {Function} transformer The transforming function - * @param {Array} functions The functions to pipe - * @return {Function} - * @see R.composeWith, R.pipe - * @example - * - * const pipeWhileNotNil = R.pipeWith((f, res) => R.isNil(res) ? res : f(res)); - * const f = pipeWhileNotNil([Math.pow, R.negate, R.inc]) - * - * f(3, 4); // -(3^4) + 1 - * @symb R.pipeWith(f)([g, h, i])(...args) = f(i, f(h, g(...args))) - */ +/***/ "./node_modules/ramda/es/internal/_includesWith.js": +/*!*********************************************************!*\ + !*** ./node_modules/ramda/es/internal/_includesWith.js ***! + \*********************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -var pipeWith = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function pipeWith(xf, list) { - if (list.length <= 0) { - return _identity_js__WEBPACK_IMPORTED_MODULE_5__["default"]; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _includesWith; } +/* harmony export */ }); +function _includesWith(pred, x, list) { + var idx = 0; + var len = list.length; + while (idx < len) { + if (pred(x, list[idx])) { + return true; + } + idx += 1; } - var headList = (0,_head_js__WEBPACK_IMPORTED_MODULE_2__["default"])(list); - var tailList = (0,_tail_js__WEBPACK_IMPORTED_MODULE_4__["default"])(list); - return (0,_internal_arity_js__WEBPACK_IMPORTED_MODULE_0__["default"])(headList.length, function () { - return (0,_internal_reduce_js__WEBPACK_IMPORTED_MODULE_3__["default"])(function (result, f) { - return xf.call(this, f, result); - }, headList.apply(this, arguments), tailList); - }); -}); -/* harmony default export */ __webpack_exports__["default"] = (pipeWith); + return false; +} /***/ }), -/***/ "./node_modules/ramda/es/pluck.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/pluck.js ***! - \****************************************/ +/***/ "./node_modules/ramda/es/internal/_indexOf.js": +/*!****************************************************!*\ + !*** ./node_modules/ramda/es/internal/_indexOf.js ***! + \****************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./map.js */ "./node_modules/ramda/es/map.js"); -/* harmony import */ var _prop_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./prop.js */ "./node_modules/ramda/es/prop.js"); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _indexOf; } +/* harmony export */ }); +/* harmony import */ var _equals_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../equals.js */ "./node_modules/ramda/es/equals.js"); + +function _indexOf(list, a, idx) { + var inf, item; // Array.prototype.indexOf doesn't exist below IE9 + if (typeof list.indexOf === 'function') { + switch (typeof a) { + case 'number': + if (a === 0) { + // manually crawl the list to distinguish between +0 and -0 + inf = 1 / a; + while (idx < list.length) { + item = list[idx]; + if (item === 0 && 1 / item === inf) { + return idx; + } + idx += 1; + } + return -1; + } else if (a !== a) { + // NaN + while (idx < list.length) { + item = list[idx]; + if (typeof item === 'number' && item !== item) { + return idx; + } + idx += 1; + } + return -1; + } // non-zero numbers can utilise Set + return list.indexOf(a, idx); + // all these types can utilise Set -/** - * Returns a new list by plucking the same named property off all objects in - * the list supplied. - * - * `pluck` will work on - * any [functor](https://github.com/fantasyland/fantasy-land#functor) in - * addition to arrays, as it is equivalent to `R.map(R.prop(k), f)`. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig Functor f => k -> f {k: v} -> f v - * @param {Number|String} key The key name to pluck off of each object. - * @param {Array} f The array or functor to consider. - * @return {Array} The list of values for the given key. - * @see R.project, R.prop, R.props - * @example - * - * var getAges = R.pluck('age'); - * getAges([{name: 'fred', age: 29}, {name: 'wilma', age: 27}]); //=> [29, 27] - * - * R.pluck(0, [[1, 2], [3, 4]]); //=> [1, 3] - * R.pluck('val', {a: {val: 3}, b: {val: 5}}); //=> {a: 3, b: 5} - * @symb R.pluck('x', [{x: 1, y: 2}, {x: 3, y: 4}, {x: 5, y: 6}]) = [1, 3, 5] - * @symb R.pluck(0, [[1, 2], [3, 4], [5, 6]]) = [1, 3, 5] - */ + case 'string': + case 'boolean': + case 'function': + case 'undefined': + return list.indexOf(a, idx); + case 'object': + if (a === null) { + // null can utilise Set + return list.indexOf(a, idx); + } + } + } // anything else not covered above, defer to R.equals -var pluck = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function pluck(p, list) { - return (0,_map_js__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_prop_js__WEBPACK_IMPORTED_MODULE_2__["default"])(p), list); -}); -/* harmony default export */ __webpack_exports__["default"] = (pluck); + while (idx < list.length) { + if ((0,_equals_js__WEBPACK_IMPORTED_MODULE_0__["default"])(list[idx], a)) { + return idx; + } + idx += 1; + } + return -1; +} /***/ }), -/***/ "./node_modules/ramda/es/prepend.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/prepend.js ***! - \******************************************/ +/***/ "./node_modules/ramda/es/internal/_isArguments.js": +/*!********************************************************!*\ + !*** ./node_modules/ramda/es/internal/_isArguments.js ***! + \********************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_concat_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_concat.js */ "./node_modules/ramda/es/internal/_concat.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); - - -/** - * Returns a new list with the given element at the front, followed by the - * contents of the list. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig a -> [a] -> [a] - * @param {*} el The item to add to the head of the output list. - * @param {Array} list The array to add to the tail of the output list. - * @return {Array} A new array. - * @see R.append - * @example - * - * R.prepend('fee', ['fi', 'fo', 'fum']); //=> ['fee', 'fi', 'fo', 'fum'] - */ +/* harmony import */ var _has_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_has.js */ "./node_modules/ramda/es/internal/_has.js"); -var prepend = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function prepend(el, list) { - return (0,_internal_concat_js__WEBPACK_IMPORTED_MODULE_0__["default"])([el], list); -}); -/* harmony default export */ __webpack_exports__["default"] = (prepend); +var toString = Object.prototype.toString; +var _isArguments = /*#__PURE__*/ +function () { + return toString.call(arguments) === '[object Arguments]' ? function _isArguments(x) { + return toString.call(x) === '[object Arguments]'; + } : function _isArguments(x) { + return (0,_has_js__WEBPACK_IMPORTED_MODULE_0__["default"])('callee', x); + }; +}(); +/* harmony default export */ __webpack_exports__["default"] = (_isArguments); /***/ }), -/***/ "./node_modules/ramda/es/product.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/product.js ***! - \******************************************/ +/***/ "./node_modules/ramda/es/internal/_isArray.js": +/*!****************************************************!*\ + !*** ./node_modules/ramda/es/internal/_isArray.js ***! + \****************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _multiply_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./multiply.js */ "./node_modules/ramda/es/multiply.js"); -/* harmony import */ var _reduce_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./reduce.js */ "./node_modules/ramda/es/reduce.js"); - - /** - * Multiplies together all the elements of a list. + * Tests whether or not an object is an array. * - * @func - * @memberOf R - * @since v0.1.0 - * @category Math - * @sig [Number] -> Number - * @param {Array} list An array of numbers - * @return {Number} The product of all the numbers in the list. - * @see R.reduce + * @private + * @param {*} val The object to test. + * @return {Boolean} `true` if `val` is an array, `false` otherwise. * @example * - * R.product([2,4,6,8,100,1]); //=> 38400 + * _isArray([]); //=> true + * _isArray(null); //=> false + * _isArray({}); //=> false */ - -var product = /*#__PURE__*/ -(0,_reduce_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_multiply_js__WEBPACK_IMPORTED_MODULE_0__["default"], 1); -/* harmony default export */ __webpack_exports__["default"] = (product); +/* harmony default export */ __webpack_exports__["default"] = (Array.isArray || function _isArray(val) { + return val != null && val.length >= 0 && Object.prototype.toString.call(val) === '[object Array]'; +}); /***/ }), -/***/ "./node_modules/ramda/es/project.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/project.js ***! - \******************************************/ +/***/ "./node_modules/ramda/es/internal/_isArrayLike.js": +/*!********************************************************!*\ + !*** ./node_modules/ramda/es/internal/_isArrayLike.js ***! + \********************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_map_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_map.js */ "./node_modules/ramda/es/internal/_map.js"); -/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./identity.js */ "./node_modules/ramda/es/identity.js"); -/* harmony import */ var _pickAll_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./pickAll.js */ "./node_modules/ramda/es/pickAll.js"); -/* harmony import */ var _useWith_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./useWith.js */ "./node_modules/ramda/es/useWith.js"); - +/* harmony import */ var _curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); +/* harmony import */ var _isString_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_isString.js */ "./node_modules/ramda/es/internal/_isString.js"); /** - * Reasonable analog to SQL `select` statement. + * Tests whether or not an object is similar to an array. * - * @func - * @memberOf R - * @since v0.1.0 - * @category Object - * @category Relation - * @sig [k] -> [{k: v}] -> [{k: v}] - * @param {Array} props The property names to project - * @param {Array} objs The objects to query - * @return {Array} An array of objects with just the `props` properties. - * @see R.pluck, R.props, R.prop + * @private + * @category Type + * @category List + * @sig * -> Boolean + * @param {*} x The object to test. + * @return {Boolean} `true` if `x` has a numeric length property and extreme indices defined; `false` otherwise. * @example * - * const abby = {name: 'Abby', age: 7, hair: 'blond', grade: 2}; - * const fred = {name: 'Fred', age: 12, hair: 'brown', grade: 7}; - * const kids = [abby, fred]; - * R.project(['name', 'grade'], kids); //=> [{name: 'Abby', grade: 2}, {name: 'Fred', grade: 7}] + * _isArrayLike([]); //=> true + * _isArrayLike(true); //=> false + * _isArrayLike({}); //=> false + * _isArrayLike({length: 10}); //=> false + * _isArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> true + * _isArrayLike({nodeType: 1, length: 1}) // => false */ -var project = /*#__PURE__*/ -(0,_useWith_js__WEBPACK_IMPORTED_MODULE_3__["default"])(_internal_map_js__WEBPACK_IMPORTED_MODULE_0__["default"], [_pickAll_js__WEBPACK_IMPORTED_MODULE_2__["default"], _identity_js__WEBPACK_IMPORTED_MODULE_1__["default"]]); // passing `identity` gives correct arity - -/* harmony default export */ __webpack_exports__["default"] = (project); +var _isArrayLike = /*#__PURE__*/ +(0,_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function isArrayLike(x) { + if ((0,_isArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(x)) { + return true; + } + if (!x) { + return false; + } + if (typeof x !== 'object') { + return false; + } + if ((0,_isString_js__WEBPACK_IMPORTED_MODULE_2__["default"])(x)) { + return false; + } + if (x.length === 0) { + return true; + } + if (x.length > 0) { + return x.hasOwnProperty(0) && x.hasOwnProperty(x.length - 1); + } + return false; +}); +/* harmony default export */ __webpack_exports__["default"] = (_isArrayLike); /***/ }), -/***/ "./node_modules/ramda/es/promap.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/promap.js ***! - \*****************************************/ +/***/ "./node_modules/ramda/es/internal/_isFunction.js": +/*!*******************************************************!*\ + !*** ./node_modules/ramda/es/internal/_isFunction.js ***! + \*******************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_promap_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_promap.js */ "./node_modules/ramda/es/internal/_promap.js"); -/* harmony import */ var _internal_xpromap_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_xpromap.js */ "./node_modules/ramda/es/internal/_xpromap.js"); - +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _isFunction; } +/* harmony export */ }); +function _isFunction(x) { + var type = Object.prototype.toString.call(x); + return type === '[object Function]' || type === '[object AsyncFunction]' || type === '[object GeneratorFunction]' || type === '[object AsyncGeneratorFunction]'; +} +/***/ }), +/***/ "./node_modules/ramda/es/internal/_isInteger.js": +/*!******************************************************!*\ + !*** ./node_modules/ramda/es/internal/_isInteger.js ***! + \******************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); /** - * Takes two functions as pre- and post- processors respectively for a third function, - * i.e. `promap(f, g, h)(x) === g(h(f(x)))`. - * - * Dispatches to the `promap` method of the third argument, if present, - * according to the [FantasyLand Profunctor spec](https://github.com/fantasyland/fantasy-land#profunctor). - * - * Acts as a transducer if a transformer is given in profunctor position. - * - * @func - * @memberOf R - * @since v0.28.0 - * @category Function - * @sig (a -> b) -> (c -> d) -> (b -> c) -> (a -> d) - * @sig Profunctor p => (a -> b) -> (c -> d) -> p b c -> p a d - * @param {Function} f The preprocessor function, a -> b - * @param {Function} g The postprocessor function, c -> d - * @param {Profunctor} profunctor The profunctor instance to be promapped, e.g. b -> c - * @return {Profunctor} The new profunctor instance, e.g. a -> d - * @see R.transduce - * @example - * - * const decodeChar = R.promap(s => s.charCodeAt(), String.fromCharCode, R.add(-8)) - * const decodeString = R.promap(R.split(''), R.join(''), R.map(decodeChar)) - * decodeString("ziuli") //=> "ramda" + * Determine if the passed argument is an integer. * - * @symb R.promap(f, g, h) = x => g(h(f(x))) - * @symb R.promap(f, g, profunctor) = profunctor.promap(f, g) + * @private + * @param {*} n + * @category Type + * @return {Boolean} */ - -var promap = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])(['fantasy-land/promap', 'promap'], _internal_xpromap_js__WEBPACK_IMPORTED_MODULE_3__["default"], _internal_promap_js__WEBPACK_IMPORTED_MODULE_2__["default"])); -/* harmony default export */ __webpack_exports__["default"] = (promap); +/* harmony default export */ __webpack_exports__["default"] = (Number.isInteger || function _isInteger(n) { + return n << 0 === n; +}); /***/ }), -/***/ "./node_modules/ramda/es/prop.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/prop.js ***! - \***************************************/ +/***/ "./node_modules/ramda/es/internal/_isObject.js": +/*!*****************************************************!*\ + !*** ./node_modules/ramda/es/internal/_isObject.js ***! + \*****************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_isInteger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isInteger.js */ "./node_modules/ramda/es/internal/_isInteger.js"); -/* harmony import */ var _nth_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./nth.js */ "./node_modules/ramda/es/nth.js"); - - - -/** - * Returns a function that when supplied an object returns the indicated - * property of that object, if it exists. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Object - * @typedefn Idx = String | Int | Symbol - * @sig Idx -> {s: a} -> a | Undefined - * @param {String|Number} p The property name or array index - * @param {Object} obj The object to query - * @return {*} The value at `obj.p`. - * @see R.path, R.props, R.pluck, R.project, R.nth - * @example - * - * R.prop('x', {x: 100}); //=> 100 - * R.prop('x', {}); //=> undefined - * R.prop(0, [100]); //=> 100 - * R.compose(R.inc, R.prop('x'))({ x: 3 }) //=> 4 - */ - -var prop = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function prop(p, obj) { - if (obj == null) { - return; - } - return (0,_internal_isInteger_js__WEBPACK_IMPORTED_MODULE_1__["default"])(p) ? (0,_nth_js__WEBPACK_IMPORTED_MODULE_2__["default"])(p, obj) : obj[p]; -}); -/* harmony default export */ __webpack_exports__["default"] = (prop); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _isObject; } +/* harmony export */ }); +function _isObject(x) { + return Object.prototype.toString.call(x) === '[object Object]'; +} /***/ }), -/***/ "./node_modules/ramda/es/propEq.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/propEq.js ***! - \*****************************************/ +/***/ "./node_modules/ramda/es/internal/_isPlaceholder.js": +/*!**********************************************************!*\ + !*** ./node_modules/ramda/es/internal/_isPlaceholder.js ***! + \**********************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _prop_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./prop.js */ "./node_modules/ramda/es/prop.js"); -/* harmony import */ var _equals_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./equals.js */ "./node_modules/ramda/es/equals.js"); - +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _isPlaceholder; } +/* harmony export */ }); +function _isPlaceholder(a) { + return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true; +} +/***/ }), -/** - * Returns `true` if the specified object property is equal, in - * [`R.equals`](#equals) terms, to the given value; `false` otherwise. - * You can test multiple properties with [`R.whereEq`](#whereEq), - * and test nested path property with [`R.pathEq`](#pathEq). - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig a -> String -> Object -> Boolean - * @param {*} val The value to compare the property with - * @param {String} name the specified object property's key - * @param {*} obj The object to check the property in - * @return {Boolean} `true` if the value equals the specified object property, - * `false` otherwise. - * @see R.whereEq, R.pathEq, R.propSatisfies, R.equals - * @example - * - * const abby = {name: 'Abby', age: 7, hair: 'blond'}; - * const fred = {name: 'Fred', age: 12, hair: 'brown'}; - * const rusty = {name: 'Rusty', age: 10, hair: 'brown'}; - * const alois = {name: 'Alois', age: 15, disposition: 'surly'}; - * const kids = [abby, fred, rusty, alois]; - * const hasBrownHair = R.propEq('brown', 'hair'); - * R.filter(hasBrownHair, kids); //=> [fred, rusty] - */ +/***/ "./node_modules/ramda/es/internal/_isString.js": +/*!*****************************************************!*\ + !*** ./node_modules/ramda/es/internal/_isString.js ***! + \*****************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -var propEq = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function propEq(val, name, obj) { - return (0,_equals_js__WEBPACK_IMPORTED_MODULE_2__["default"])(val, (0,_prop_js__WEBPACK_IMPORTED_MODULE_1__["default"])(name, obj)); -}); -/* harmony default export */ __webpack_exports__["default"] = (propEq); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _isString; } +/* harmony export */ }); +function _isString(x) { + return Object.prototype.toString.call(x) === '[object String]'; +} /***/ }), -/***/ "./node_modules/ramda/es/propIs.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/propIs.js ***! - \*****************************************/ +/***/ "./node_modules/ramda/es/internal/_isTransformer.js": +/*!**********************************************************!*\ + !*** ./node_modules/ramda/es/internal/_isTransformer.js ***! + \**********************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _prop_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./prop.js */ "./node_modules/ramda/es/prop.js"); -/* harmony import */ var _is_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./is.js */ "./node_modules/ramda/es/is.js"); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _isTransformer; } +/* harmony export */ }); +function _isTransformer(obj) { + return obj != null && typeof obj['@@transducer/step'] === 'function'; +} +/***/ }), +/***/ "./node_modules/ramda/es/internal/_isTypedArray.js": +/*!*********************************************************!*\ + !*** ./node_modules/ramda/es/internal/_isTypedArray.js ***! + \*********************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _isTypedArray; } +/* harmony export */ }); /** - * Returns `true` if the specified object property is of the given type; - * `false` otherwise. + * Tests whether or not an object is a typed array. * - * @func - * @memberOf R - * @since v0.16.0 - * @category Type - * @sig Type -> String -> Object -> Boolean - * @param {Function} type - * @param {String} name - * @param {*} obj - * @return {Boolean} - * @see R.is, R.propSatisfies + * @private + * @param {*} val The object to test. + * @return {Boolean} `true` if `val` is a typed array, `false` otherwise. * @example * - * R.propIs(Number, 'x', {x: 1, y: 2}); //=> true - * R.propIs(Number, 'x', {x: 'foo'}); //=> false - * R.propIs(Number, 'x', {}); //=> false + * _isTypedArray(new Uint8Array([])); //=> true + * _isTypedArray(new Float32Array([])); //=> true + * _isTypedArray([]); //=> false + * _isTypedArray(null); //=> false + * _isTypedArray({}); //=> false */ - -var propIs = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function propIs(type, name, obj) { - return (0,_is_js__WEBPACK_IMPORTED_MODULE_2__["default"])(type, (0,_prop_js__WEBPACK_IMPORTED_MODULE_1__["default"])(name, obj)); -}); -/* harmony default export */ __webpack_exports__["default"] = (propIs); +function _isTypedArray(val) { + var type = Object.prototype.toString.call(val); + return type === '[object Uint8ClampedArray]' || type === '[object Int8Array]' || type === '[object Uint8Array]' || type === '[object Int16Array]' || type === '[object Uint16Array]' || type === '[object Int32Array]' || type === '[object Uint32Array]' || type === '[object Float32Array]' || type === '[object Float64Array]' || type === '[object BigInt64Array]' || type === '[object BigUint64Array]'; +} /***/ }), -/***/ "./node_modules/ramda/es/propOr.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/propOr.js ***! - \*****************************************/ +/***/ "./node_modules/ramda/es/internal/_makeFlat.js": +/*!*****************************************************!*\ + !*** ./node_modules/ramda/es/internal/_makeFlat.js ***! + \*****************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _defaultTo_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./defaultTo.js */ "./node_modules/ramda/es/defaultTo.js"); -/* harmony import */ var _prop_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./prop.js */ "./node_modules/ramda/es/prop.js"); - - +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _makeFlat; } +/* harmony export */ }); +/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArrayLike.js */ "./node_modules/ramda/es/internal/_isArrayLike.js"); /** - * Return the specified property of the given non-null object if the property - * is present and it's value is not `null`, `undefined` or `NaN`. - * - * Otherwise the first argument is returned. - * - * @func - * @memberOf R - * @since v0.6.0 - * @category Object - * @sig a -> String -> Object -> a - * @param {*} val The default value. - * @param {String} p The name of the property to return. - * @param {Object} obj The object to query. - * @return {*} The value of given property of the supplied object or the default value. - * @example - * - * const alice = { - * name: 'ALICE', - * age: 101 - * }; - * const favorite = R.prop('favoriteLibrary'); - * const favoriteWithDefault = R.propOr('Ramda', 'favoriteLibrary'); + * `_makeFlat` is a helper function that returns a one-level or fully recursive + * function based on the flag passed in. * - * favorite(alice); //=> undefined - * favoriteWithDefault(alice); //=> 'Ramda' + * @private */ -var propOr = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function propOr(val, p, obj) { - return (0,_defaultTo_js__WEBPACK_IMPORTED_MODULE_1__["default"])(val, (0,_prop_js__WEBPACK_IMPORTED_MODULE_2__["default"])(p, obj)); -}); -/* harmony default export */ __webpack_exports__["default"] = (propOr); +function _makeFlat(recursive) { + return function flatt(list) { + var value, jlen, j; + var result = []; + var idx = 0; + var ilen = list.length; + while (idx < ilen) { + if ((0,_isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__["default"])(list[idx])) { + value = recursive ? flatt(list[idx]) : list[idx]; + j = 0; + jlen = value.length; + while (j < jlen) { + result[result.length] = value[j]; + j += 1; + } + } else { + result[result.length] = list[idx]; + } + idx += 1; + } + return result; + }; +} /***/ }), -/***/ "./node_modules/ramda/es/propSatisfies.js": +/***/ "./node_modules/ramda/es/internal/_map.js": /*!************************************************!*\ - !*** ./node_modules/ramda/es/propSatisfies.js ***! + !*** ./node_modules/ramda/es/internal/_map.js ***! \************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _prop_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./prop.js */ "./node_modules/ramda/es/prop.js"); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _map; } +/* harmony export */ }); +function _map(fn, functor) { + var idx = 0; + var len = functor.length; + var result = Array(len); + while (idx < len) { + result[idx] = fn(functor[idx]); + idx += 1; + } + return result; +} +/***/ }), -/** - * Returns `true` if the specified object property satisfies the given - * predicate; `false` otherwise. You can test multiple properties with - * [`R.where`](#where). - * - * @func - * @memberOf R - * @since v0.16.0 - * @category Logic - * @sig (a -> Boolean) -> String -> {String: a} -> Boolean - * @param {Function} pred - * @param {String} name - * @param {*} obj - * @return {Boolean} - * @see R.where, R.propEq, R.propIs - * @example - * - * R.propSatisfies(x => x > 0, 'x', {x: 1, y: 2}); //=> true - */ +/***/ "./node_modules/ramda/es/internal/_objectAssign.js": +/*!*********************************************************!*\ + !*** ./node_modules/ramda/es/internal/_objectAssign.js ***! + \*********************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -var propSatisfies = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function propSatisfies(pred, name, obj) { - return pred((0,_prop_js__WEBPACK_IMPORTED_MODULE_1__["default"])(name, obj)); -}); -/* harmony default export */ __webpack_exports__["default"] = (propSatisfies); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _has_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_has.js */ "./node_modules/ramda/es/internal/_has.js"); + // Based on https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign + +function _objectAssign(target) { + if (target == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var output = Object(target); + var idx = 1; + var length = arguments.length; + while (idx < length) { + var source = arguments[idx]; + if (source != null) { + for (var nextKey in source) { + if ((0,_has_js__WEBPACK_IMPORTED_MODULE_0__["default"])(nextKey, source)) { + output[nextKey] = source[nextKey]; + } + } + } + idx += 1; + } + return output; +} +/* harmony default export */ __webpack_exports__["default"] = (typeof Object.assign === 'function' ? Object.assign : _objectAssign); /***/ }), -/***/ "./node_modules/ramda/es/props.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/props.js ***! - \****************************************/ +/***/ "./node_modules/ramda/es/internal/_objectIs.js": +/*!*****************************************************!*\ + !*** ./node_modules/ramda/es/internal/_objectIs.js ***! + \*****************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./node_modules/ramda/es/path.js"); +// Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is +function _objectIs(a, b) { + // SameValue algorithm + if (a === b) { + // Steps 1-5, 7-10 + // Steps 6.b-6.e: +0 != -0 + return a !== 0 || 1 / a === 1 / b; + } else { + // Step 6.a: NaN == NaN + return a !== a && b !== b; + } +} +/* harmony default export */ __webpack_exports__["default"] = (typeof Object.is === 'function' ? Object.is : _objectIs); +/***/ }), -/** - * Acts as multiple `prop`: array of keys in, array of values out. Preserves - * order. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Object - * @sig [k] -> {k: v} -> [v] - * @param {Array} ps The property names to fetch - * @param {Object} obj The object to query - * @return {Array} The corresponding values or partially applied function. - * @see R.prop, R.pluck, R.project - * @example - * - * R.props(['x', 'y'], {x: 1, y: 2}); //=> [1, 2] - * R.props(['c', 'a', 'b'], {b: 2, a: 1}); //=> [undefined, 1, 2] - * - * const fullName = R.compose(R.join(' '), R.props(['first', 'last'])); - * fullName({last: 'Bullet-Tooth', age: 33, first: 'Tony'}); //=> 'Tony Bullet-Tooth' - */ +/***/ "./node_modules/ramda/es/internal/_quote.js": +/*!**************************************************!*\ + !*** ./node_modules/ramda/es/internal/_quote.js ***! + \**************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { -var props = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function props(ps, obj) { - return ps.map(function (p) { - return (0,_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])([p], obj); - }); -}); -/* harmony default export */ __webpack_exports__["default"] = (props); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _quote; } +/* harmony export */ }); +function _quote(s) { + var escaped = s.replace(/\\/g, '\\\\').replace(/[\b]/g, '\\b') // \b matches word boundary; [\b] matches backspace + .replace(/\f/g, '\\f').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\t/g, '\\t').replace(/\v/g, '\\v').replace(/\0/g, '\\0'); + return '"' + escaped.replace(/"/g, '\\"') + '"'; +} /***/ }), -/***/ "./node_modules/ramda/es/range.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/range.js ***! - \****************************************/ +/***/ "./node_modules/ramda/es/internal/_reduce.js": +/*!***************************************************!*\ + !*** ./node_modules/ramda/es/internal/_reduce.js ***! + \***************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_isNumber_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isNumber.js */ "./node_modules/ramda/es/internal/_isNumber.js"); - +/* harmony import */ var _arrayReduce_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_arrayReduce.js */ "./node_modules/ramda/es/internal/_arrayReduce.js"); +/* harmony import */ var _createReduce_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_createReduce.js */ "./node_modules/ramda/es/internal/_createReduce.js"); -/** - * Returns a list of numbers from `from` (inclusive) to `to` (exclusive). - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig Number -> Number -> [Number] - * @param {Number} from The first number in the list. - * @param {Number} to One more than the last number in the list. - * @return {Array} The list of numbers in the set `[a, b)`. - * @example - * - * R.range(1, 5); //=> [1, 2, 3, 4] - * R.range(50, 53); //=> [50, 51, 52] - */ -var range = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function range(from, to) { - if (!((0,_internal_isNumber_js__WEBPACK_IMPORTED_MODULE_1__["default"])(from) && (0,_internal_isNumber_js__WEBPACK_IMPORTED_MODULE_1__["default"])(to))) { - throw new TypeError('Both arguments to range must be numbers'); - } - var result = []; - var n = from; - while (n < to) { - result.push(n); - n += 1; +function _iterableReduce(reducer, acc, iter) { + var step = iter.next(); + while (!step.done) { + acc = reducer(acc, step.value); + step = iter.next(); } - return result; -}); -/* harmony default export */ __webpack_exports__["default"] = (range); + return acc; +} +function _methodReduce(reducer, acc, obj, methodName) { + return obj[methodName](reducer, acc); +} +var _reduce = /*#__PURE__*/ +(0,_createReduce_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_arrayReduce_js__WEBPACK_IMPORTED_MODULE_1__["default"], _methodReduce, _iterableReduce); +/* harmony default export */ __webpack_exports__["default"] = (_reduce); /***/ }), -/***/ "./node_modules/ramda/es/reduce.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/reduce.js ***! - \*****************************************/ +/***/ "./node_modules/ramda/es/internal/_reduced.js": +/*!****************************************************!*\ + !*** ./node_modules/ramda/es/internal/_reduced.js ***! + \****************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _internal_xReduce_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_xReduce.js */ "./node_modules/ramda/es/internal/_xReduce.js"); -/* harmony import */ var _internal_xwrap_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xwrap.js */ "./node_modules/ramda/es/internal/_xwrap.js"); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _reduced; } +/* harmony export */ }); +function _reduced(x) { + return x && x['@@transducer/reduced'] ? x : { + '@@transducer/value': x, + '@@transducer/reduced': true + }; +} +/***/ }), +/***/ "./node_modules/ramda/es/internal/_toISOString.js": +/*!********************************************************!*\ + !*** ./node_modules/ramda/es/internal/_toISOString.js ***! + \********************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); /** - * Returns a single item by iterating through the list, successively calling - * the iterator function and passing it an accumulator value and the current - * value from the array, and then passing the result to the next call. - * - * The iterator function receives two values: *(acc, value)*. It may use - * [`R.reduced`](#reduced) to shortcut the iteration. - * - * The arguments' order of [`reduceRight`](#reduceRight)'s iterator function - * is *(value, acc)*. - * - * Note: `R.reduce` does not skip deleted or unassigned indices (sparse - * arrays), unlike the native `Array.prototype.reduce` method. For more details - * on this behavior, see: - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#Description - * - * Be cautious of mutating and returning the accumulator. If you reuse it across - * invocations, it will continue to accumulate onto the same value. The general - * recommendation is to always return a new value. If you can't do so for - * performance reasons, then be sure to reinitialize the accumulator on each - * invocation. - * - * Dispatches to the `reduce` method of the third argument, if present. When - * doing so, it is up to the user to handle the [`R.reduced`](#reduced) - * shortcuting, as this is not implemented by `reduce`. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig ((a, b) -> a) -> a -> [b] -> a - * @param {Function} fn The iterator function. Receives two values, the accumulator and the - * current element from the array. - * @param {*} acc The accumulator value. - * @param {Array} list The list to iterate over. - * @return {*} The final, accumulated value. - * @see R.reduced, R.addIndex, R.reduceRight - * @example - * - * R.reduce(R.subtract, 0, [1, 2, 3, 4]) // => ((((0 - 1) - 2) - 3) - 4) = -10 - * // - -10 - * // / \ / \ - * // - 4 -6 4 - * // / \ / \ - * // - 3 ==> -3 3 - * // / \ / \ - * // - 2 -1 2 - * // / \ / \ - * // 0 1 0 1 - * - * @symb R.reduce(f, a, [b, c, d]) = f(f(f(a, b), c), d) + * Polyfill from . */ - -var reduce = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (xf, acc, list) { - return (0,_internal_xReduce_js__WEBPACK_IMPORTED_MODULE_1__["default"])(typeof xf === 'function' ? (0,_internal_xwrap_js__WEBPACK_IMPORTED_MODULE_2__["default"])(xf) : xf, acc, list); -}); -/* harmony default export */ __webpack_exports__["default"] = (reduce); +var pad = function pad(n) { + return (n < 10 ? '0' : '') + n; +}; +var _toISOString = typeof Date.prototype.toISOString === 'function' ? function _toISOString(d) { + return d.toISOString(); +} : function _toISOString(d) { + return d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate()) + 'T' + pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()) + ':' + pad(d.getUTCSeconds()) + '.' + (d.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) + 'Z'; +}; +/* harmony default export */ __webpack_exports__["default"] = (_toISOString); /***/ }), -/***/ "./node_modules/ramda/es/reduceBy.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/reduceBy.js ***! - \*******************************************/ +/***/ "./node_modules/ramda/es/internal/_toString.js": +/*!*****************************************************!*\ + !*** ./node_modules/ramda/es/internal/_toString.js ***! + \*****************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_clone_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_clone.js */ "./node_modules/ramda/es/internal/_clone.js"); -/* harmony import */ var _internal_curryN_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curryN.js */ "./node_modules/ramda/es/internal/_curryN.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_has_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_has.js */ "./node_modules/ramda/es/internal/_has.js"); -/* harmony import */ var _internal_reduced_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./internal/_reduced.js */ "./node_modules/ramda/es/internal/_reduced.js"); -/* harmony import */ var _internal_xReduce_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./internal/_xReduce.js */ "./node_modules/ramda/es/internal/_xReduce.js"); -/* harmony import */ var _internal_xreduceBy_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./internal/_xreduceBy.js */ "./node_modules/ramda/es/internal/_xreduceBy.js"); -/* harmony import */ var _internal_xwrap_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./internal/_xwrap.js */ "./node_modules/ramda/es/internal/_xwrap.js"); - - +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _toString; } +/* harmony export */ }); +/* harmony import */ var _includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_includes.js */ "./node_modules/ramda/es/internal/_includes.js"); +/* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_map.js */ "./node_modules/ramda/es/internal/_map.js"); +/* harmony import */ var _quote_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_quote.js */ "./node_modules/ramda/es/internal/_quote.js"); +/* harmony import */ var _toISOString_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_toISOString.js */ "./node_modules/ramda/es/internal/_toISOString.js"); +/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../keys.js */ "./node_modules/ramda/es/keys.js"); +/* harmony import */ var _reject_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../reject.js */ "./node_modules/ramda/es/reject.js"); -/** - * Groups the elements of the list according to the result of calling - * the String-returning function `keyFn` on each element and reduces the elements - * of each group to a single value via the reducer function `valueFn`. - * - * The value function receives two values: *(acc, value)*. It may use - * [`R.reduced`](#reduced) to short circuit the iteration. - * - * This function is basically a more general [`groupBy`](#groupBy) function. - * - * Acts as a transducer if a transformer is given in list position. - * - * @func - * @memberOf R - * @since v0.20.0 - * @category List - * @sig ((a, b) -> a) -> a -> (b -> String) -> [b] -> {String: a} - * @param {Function} valueFn The function that reduces the elements of each group to a single - * value. Receives two values, accumulator for a particular group and the current element. - * @param {*} acc The (initial) accumulator value for each group. - * @param {Function} keyFn The function that maps the list's element into a key. - * @param {Array} list The array to group. - * @return {Object} An object with the output of `keyFn` for keys, mapped to the output of - * `valueFn` for elements which produced that key when passed to `keyFn`. - * @see R.groupBy, R.reduce, R.reduced - * @example - * - * const groupNames = (acc, {name}) => acc.concat(name) - * const toGrade = ({score}) => - * score < 65 ? 'F' : - * score < 70 ? 'D' : - * score < 80 ? 'C' : - * score < 90 ? 'B' : 'A' - * - * var students = [ - * {name: 'Abby', score: 83}, - * {name: 'Bart', score: 62}, - * {name: 'Curt', score: 88}, - * {name: 'Dora', score: 92}, - * ] - * - * reduceBy(groupNames, [], toGrade, students) - * //=> {"A": ["Dora"], "B": ["Abby", "Curt"], "F": ["Bart"]} - */ +function _toString(x, seen) { + var recur = function recur(y) { + var xs = seen.concat([x]); + return (0,_includes_js__WEBPACK_IMPORTED_MODULE_0__["default"])(y, xs) ? '' : _toString(y, xs); + }; // mapPairs :: (Object, [String]) -> [String] -var reduceBy = /*#__PURE__*/ -(0,_internal_curryN_js__WEBPACK_IMPORTED_MODULE_1__["default"])(4, [], /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_2__["default"])([], _internal_xreduceBy_js__WEBPACK_IMPORTED_MODULE_6__["default"], function reduceBy(valueFn, valueAcc, keyFn, list) { - var xf = (0,_internal_xwrap_js__WEBPACK_IMPORTED_MODULE_7__["default"])(function (acc, elt) { - var key = keyFn(elt); - var value = valueFn((0,_internal_has_js__WEBPACK_IMPORTED_MODULE_3__["default"])(key, acc) ? acc[key] : (0,_internal_clone_js__WEBPACK_IMPORTED_MODULE_0__["default"])(valueAcc, false), elt); - if (value && value['@@transducer/reduced']) { - return (0,_internal_reduced_js__WEBPACK_IMPORTED_MODULE_4__["default"])(acc); - } - acc[key] = value; - return acc; - }); - return (0,_internal_xReduce_js__WEBPACK_IMPORTED_MODULE_5__["default"])(xf, {}, list); -})); -/* harmony default export */ __webpack_exports__["default"] = (reduceBy); + var mapPairs = function mapPairs(obj, keys) { + return (0,_map_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (k) { + return (0,_quote_js__WEBPACK_IMPORTED_MODULE_2__["default"])(k) + ': ' + recur(obj[k]); + }, keys.slice().sort()); + }; + switch (Object.prototype.toString.call(x)) { + case '[object Arguments]': + return '(function() { return arguments; }(' + (0,_map_js__WEBPACK_IMPORTED_MODULE_1__["default"])(recur, x).join(', ') + '))'; + case '[object Array]': + return '[' + (0,_map_js__WEBPACK_IMPORTED_MODULE_1__["default"])(recur, x).concat(mapPairs(x, (0,_reject_js__WEBPACK_IMPORTED_MODULE_3__["default"])(function (k) { + return /^\d+$/.test(k); + }, (0,_keys_js__WEBPACK_IMPORTED_MODULE_4__["default"])(x)))).join(', ') + ']'; + case '[object Boolean]': + return typeof x === 'object' ? 'new Boolean(' + recur(x.valueOf()) + ')' : x.toString(); + case '[object Date]': + return 'new Date(' + (isNaN(x.valueOf()) ? recur(NaN) : (0,_quote_js__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_toISOString_js__WEBPACK_IMPORTED_MODULE_5__["default"])(x))) + ')'; + case '[object Map]': + return 'new Map(' + recur(Array.from(x)) + ')'; + case '[object Null]': + return 'null'; + case '[object Number]': + return typeof x === 'object' ? 'new Number(' + recur(x.valueOf()) + ')' : 1 / x === -Infinity ? '-0' : x.toString(10); + case '[object Set]': + return 'new Set(' + recur(Array.from(x).sort()) + ')'; + case '[object String]': + return typeof x === 'object' ? 'new String(' + recur(x.valueOf()) + ')' : (0,_quote_js__WEBPACK_IMPORTED_MODULE_2__["default"])(x); + case '[object Undefined]': + return 'undefined'; + default: + if (typeof x.toString === 'function') { + var repr = x.toString(); + if (repr !== '[object Object]') { + return repr; + } + } + return '{' + mapPairs(x, (0,_keys_js__WEBPACK_IMPORTED_MODULE_4__["default"])(x)).join(', ') + '}'; + } +} /***/ }), -/***/ "./node_modules/ramda/es/reduceRight.js": -/*!**********************************************!*\ - !*** ./node_modules/ramda/es/reduceRight.js ***! - \**********************************************/ +/***/ "./node_modules/ramda/es/internal/_xArrayReduce.js": +/*!*********************************************************!*\ + !*** ./node_modules/ramda/es/internal/_xArrayReduce.js ***! + \*********************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); - -/** - * Returns a single item by iterating through the list, successively calling - * the iterator function and passing it an accumulator value and the current - * value from the array, and then passing the result to the next call. - * - * Similar to [`reduce`](#reduce), except moves through the input list from the - * right to the left. - * - * The iterator function receives two values: *(value, acc)*, while the arguments' - * order of `reduce`'s iterator function is *(acc, value)*. `reduceRight` may use [`reduced`](#reduced) - * to short circuit the iteration. - * - * Note: `R.reduceRight` does not skip deleted or unassigned indices (sparse - * arrays), unlike the native `Array.prototype.reduceRight` method. For more details - * on this behavior, see: - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight#Description - * - * Be cautious of mutating and returning the accumulator. If you reuse it across - * invocations, it will continue to accumulate onto the same value. The general - * recommendation is to always return a new value. If you can't do so for - * performance reasons, then be sure to reinitialize the accumulator on each - * invocation. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig ((a, b) -> b) -> b -> [a] -> b - * @param {Function} fn The iterator function. Receives two values, the current element from the array - * and the accumulator. - * @param {*} acc The accumulator value. - * @param {Array} list The list to iterate over. - * @return {*} The final, accumulated value. - * @see R.reduce, R.addIndex, R.reduced - * @example - * - * R.reduceRight(R.subtract, 0, [1, 2, 3, 4]) // => (1 - (2 - (3 - (4 - 0)))) = -2 - * // - -2 - * // / \ / \ - * // 1 - 1 3 - * // / \ / \ - * // 2 - ==> 2 -1 - * // / \ / \ - * // 3 - 3 4 - * // / \ / \ - * // 4 0 4 0 - * - * @symb R.reduceRight(f, a, [b, c, d]) = f(b, f(c, f(d, a))) - */ - -var reduceRight = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function reduceRight(fn, acc, list) { - var idx = list.length - 1; - while (idx >= 0) { - acc = fn(list[idx], acc); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _xArrayReduce; } +/* harmony export */ }); +function _xArrayReduce(xf, acc, list) { + var idx = 0; + var len = list.length; + while (idx < len) { + acc = xf['@@transducer/step'](acc, list[idx]); if (acc && acc['@@transducer/reduced']) { acc = acc['@@transducer/value']; break; } - idx -= 1; + idx += 1; } - return acc; -}); -/* harmony default export */ __webpack_exports__["default"] = (reduceRight); + return xf['@@transducer/result'](acc); +} /***/ }), -/***/ "./node_modules/ramda/es/reduceWhile.js": -/*!**********************************************!*\ - !*** ./node_modules/ramda/es/reduceWhile.js ***! - \**********************************************/ +/***/ "./node_modules/ramda/es/internal/_xReduce.js": +/*!****************************************************!*\ + !*** ./node_modules/ramda/es/internal/_xReduce.js ***! + \****************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curryN_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curryN.js */ "./node_modules/ramda/es/internal/_curryN.js"); -/* harmony import */ var _internal_xReduce_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_xReduce.js */ "./node_modules/ramda/es/internal/_xReduce.js"); -/* harmony import */ var _internal_xwrap_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xwrap.js */ "./node_modules/ramda/es/internal/_xwrap.js"); -/* harmony import */ var _internal_reduced_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_reduced.js */ "./node_modules/ramda/es/internal/_reduced.js"); - - +/* harmony import */ var _createReduce_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_createReduce.js */ "./node_modules/ramda/es/internal/_createReduce.js"); +/* harmony import */ var _xArrayReduce_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_xArrayReduce.js */ "./node_modules/ramda/es/internal/_xArrayReduce.js"); +/* harmony import */ var _bind_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../bind.js */ "./node_modules/ramda/es/bind.js"); -/** - * Like [`reduce`](#reduce), `reduceWhile` returns a single item by iterating - * through the list, successively calling the iterator function. `reduceWhile` - * also takes a predicate that is evaluated before each step. If the predicate - * returns `false`, it "short-circuits" the iteration and returns the current - * value of the accumulator. `reduceWhile` may alternatively be short-circuited - * via [`reduced`](#reduced). - * - * @func - * @memberOf R - * @since v0.22.0 - * @category List - * @sig ((a, b) -> Boolean) -> ((a, b) -> a) -> a -> [b] -> a - * @param {Function} pred The predicate. It is passed the accumulator and the - * current element. - * @param {Function} fn The iterator function. Receives two values, the - * accumulator and the current element. - * @param {*} a The accumulator value. - * @param {Array} list The list to iterate over. - * @return {*} The final, accumulated value. - * @see R.reduce, R.reduced - * @example - * - * const isOdd = (acc, x) => x % 2 !== 0; - * const xs = [1, 3, 5, 60, 777, 800]; - * R.reduceWhile(isOdd, R.add, 0, xs); //=> 9 - * - * const ys = [2, 4, 6] - * R.reduceWhile(isOdd, R.add, 111, ys); //=> 111 - */ -var reduceWhile = /*#__PURE__*/ -(0,_internal_curryN_js__WEBPACK_IMPORTED_MODULE_0__["default"])(4, [], function _reduceWhile(pred, fn, a, list) { - var xf = (0,_internal_xwrap_js__WEBPACK_IMPORTED_MODULE_2__["default"])(function (acc, x) { - return pred(acc, x) ? fn(acc, x) : (0,_internal_reduced_js__WEBPACK_IMPORTED_MODULE_3__["default"])(acc); - }); - return (0,_internal_xReduce_js__WEBPACK_IMPORTED_MODULE_1__["default"])(xf, a, list); -}); -/* harmony default export */ __webpack_exports__["default"] = (reduceWhile); +function _xIterableReduce(xf, acc, iter) { + var step = iter.next(); + while (!step.done) { + acc = xf['@@transducer/step'](acc, step.value); + if (acc && acc['@@transducer/reduced']) { + acc = acc['@@transducer/value']; + break; + } + step = iter.next(); + } + return xf['@@transducer/result'](acc); +} +function _xMethodReduce(xf, acc, obj, methodName) { + return xf['@@transducer/result'](obj[methodName]((0,_bind_js__WEBPACK_IMPORTED_MODULE_0__["default"])(xf['@@transducer/step'], xf), acc)); +} +var _xReduce = /*#__PURE__*/ +(0,_createReduce_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_xArrayReduce_js__WEBPACK_IMPORTED_MODULE_2__["default"], _xMethodReduce, _xIterableReduce); +/* harmony default export */ __webpack_exports__["default"] = (_xReduce); /***/ }), -/***/ "./node_modules/ramda/es/reduced.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/reduced.js ***! - \******************************************/ +/***/ "./node_modules/ramda/es/internal/_xall.js": +/*!*************************************************!*\ + !*** ./node_modules/ramda/es/internal/_xall.js ***! + \*************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _internal_reduced_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_reduced.js */ "./node_modules/ramda/es/internal/_reduced.js"); - +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _xall; } +/* harmony export */ }); +/* harmony import */ var _reduced_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_reduced.js */ "./node_modules/ramda/es/internal/_reduced.js"); +/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); -/** - * Returns a value wrapped to indicate that it is the final value of the reduce - * and transduce functions. The returned value should be considered a black - * box: the internal structure is not guaranteed to be stable. - * - * This optimization is available to the below functions: - * - [`reduce`](#reduce) - * - [`reduceWhile`](#reduceWhile) - * - [`reduceBy`](#reduceBy) - * - [`reduceRight`](#reduceRight) - * - [`transduce`](#transduce) - * - * @func - * @memberOf R - * @since v0.15.0 - * @category List - * @sig a -> * - * @param {*} x The final value of the reduce. - * @return {*} The wrapped value. - * @see R.reduce, R.reduceWhile, R.reduceBy, R.reduceRight, R.transduce - * @example - * - * R.reduce( - * (acc, item) => item > 3 ? R.reduced(acc) : acc.concat(item), - * [], - * [1, 2, 3, 4, 5]) // [1, 2, 3] - */ -var reduced = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_internal_reduced_js__WEBPACK_IMPORTED_MODULE_1__["default"]); -/* harmony default export */ __webpack_exports__["default"] = (reduced); +var XAll = /*#__PURE__*/ +function () { + function XAll(f, xf) { + this.xf = xf; + this.f = f; + this.all = true; + } + XAll.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].init; + XAll.prototype['@@transducer/result'] = function (result) { + if (this.all) { + result = this.xf['@@transducer/step'](result, true); + } + return this.xf['@@transducer/result'](result); + }; + XAll.prototype['@@transducer/step'] = function (result, input) { + if (!this.f(input)) { + this.all = false; + result = (0,_reduced_js__WEBPACK_IMPORTED_MODULE_1__["default"])(this.xf['@@transducer/step'](result, false)); + } + return result; + }; + return XAll; +}(); +function _xall(f) { + return function (xf) { + return new XAll(f, xf); + }; +} /***/ }), -/***/ "./node_modules/ramda/es/reject.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/reject.js ***! - \*****************************************/ +/***/ "./node_modules/ramda/es/internal/_xany.js": +/*!*************************************************!*\ + !*** ./node_modules/ramda/es/internal/_xany.js ***! + \*************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_complement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_complement.js */ "./node_modules/ramda/es/internal/_complement.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./filter.js */ "./node_modules/ramda/es/filter.js"); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _xany; } +/* harmony export */ }); +/* harmony import */ var _reduced_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_reduced.js */ "./node_modules/ramda/es/internal/_reduced.js"); +/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); +var XAny = /*#__PURE__*/ +function () { + function XAny(f, xf) { + this.xf = xf; + this.f = f; + this.any = false; + } + XAny.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].init; + XAny.prototype['@@transducer/result'] = function (result) { + if (!this.any) { + result = this.xf['@@transducer/step'](result, false); + } + return this.xf['@@transducer/result'](result); + }; + XAny.prototype['@@transducer/step'] = function (result, input) { + if (this.f(input)) { + this.any = true; + result = (0,_reduced_js__WEBPACK_IMPORTED_MODULE_1__["default"])(this.xf['@@transducer/step'](result, true)); + } + return result; + }; + return XAny; +}(); +function _xany(f) { + return function (xf) { + return new XAny(f, xf); + }; +} -/** - * The complement of [`filter`](#filter). - * - * Acts as a transducer if a transformer is given in list position. Filterable - * objects include plain objects or any object that has a filter method such - * as `Array`. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig Filterable f => (a -> Boolean) -> f a -> f a - * @param {Function} pred - * @param {Array} filterable - * @return {Array} - * @see R.filter, R.transduce, R.addIndex - * @example - * - * const isOdd = (n) => n % 2 !== 0; - * - * R.reject(isOdd, [1, 2, 3, 4]); //=> [2, 4] - * - * R.reject(isOdd, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4} - */ +/***/ }), -var reject = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function reject(pred, filterable) { - return (0,_filter_js__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_internal_complement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(pred), filterable); +/***/ "./node_modules/ramda/es/internal/_xfBase.js": +/*!***************************************************!*\ + !*** ./node_modules/ramda/es/internal/_xfBase.js ***! + \***************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = ({ + init: function init() { + return this.xf['@@transducer/init'](); + }, + result: function result(_result) { + return this.xf['@@transducer/result'](_result); + } }); -/* harmony default export */ __webpack_exports__["default"] = (reject); /***/ }), -/***/ "./node_modules/ramda/es/remove.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/remove.js ***! - \*****************************************/ +/***/ "./node_modules/ramda/es/internal/_xfilter.js": +/*!****************************************************!*\ + !*** ./node_modules/ramda/es/internal/_xfilter.js ***! + \****************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); - -/** - * Removes the sub-list of `list` starting at index `start` and containing - * `count` elements. _Note that this is not destructive_: it returns a copy of - * the list with the changes. - * No lists have been harmed in the application of this function. - * - * @func - * @memberOf R - * @since v0.2.2 - * @category List - * @sig Number -> Number -> [a] -> [a] - * @param {Number} start The position to start removing elements - * @param {Number} count The number of elements to remove - * @param {Array} list The list to remove from - * @return {Array} A new Array with `count` elements from `start` removed. - * @see R.without - * @example - * - * R.remove(2, 3, [1,2,3,4,5,6,7,8]); //=> [1,2,6,7,8] - */ +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _xfilter; } +/* harmony export */ }); +/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); -var remove = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function remove(start, count, list) { - var result = Array.prototype.slice.call(list, 0); - result.splice(start, count); - return result; -}); -/* harmony default export */ __webpack_exports__["default"] = (remove); +var XFilter = /*#__PURE__*/ +function () { + function XFilter(f, xf) { + this.xf = xf; + this.f = f; + } + XFilter.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].init; + XFilter.prototype['@@transducer/result'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].result; + XFilter.prototype['@@transducer/step'] = function (result, input) { + return this.f(input) ? this.xf['@@transducer/step'](result, input) : result; + }; + return XFilter; +}(); +function _xfilter(f) { + return function (xf) { + return new XFilter(f, xf); + }; +} /***/ }), -/***/ "./node_modules/ramda/es/repeat.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/repeat.js ***! - \*****************************************/ +/***/ "./node_modules/ramda/es/internal/_xfind.js": +/*!**************************************************!*\ + !*** ./node_modules/ramda/es/internal/_xfind.js ***! + \**************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _always_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./always.js */ "./node_modules/ramda/es/always.js"); -/* harmony import */ var _times_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./times.js */ "./node_modules/ramda/es/times.js"); - - +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _xfind; } +/* harmony export */ }); +/* harmony import */ var _reduced_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_reduced.js */ "./node_modules/ramda/es/internal/_reduced.js"); +/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); -/** - * Returns a fixed list of size `n` containing a specified identical value. - * - * @func - * @memberOf R - * @since v0.1.1 - * @category List - * @sig a -> n -> [a] - * @param {*} value The value to repeat. - * @param {Number} n The desired size of the output list. - * @return {Array} A new array containing `n` `value`s. - * @see R.times - * @example - * - * R.repeat('hi', 5); //=> ['hi', 'hi', 'hi', 'hi', 'hi'] - * - * const obj = {}; - * const repeatedObjs = R.repeat(obj, 5); //=> [{}, {}, {}, {}, {}] - * repeatedObjs[0] === repeatedObjs[1]; //=> true - * @symb R.repeat(a, 0) = [] - * @symb R.repeat(a, 1) = [a] - * @symb R.repeat(a, 2) = [a, a] - */ -var repeat = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function repeat(value, n) { - return (0,_times_js__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_always_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value), n); -}); -/* harmony default export */ __webpack_exports__["default"] = (repeat); +var XFind = /*#__PURE__*/ +function () { + function XFind(f, xf) { + this.xf = xf; + this.f = f; + this.found = false; + } + XFind.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].init; + XFind.prototype['@@transducer/result'] = function (result) { + if (!this.found) { + result = this.xf['@@transducer/step'](result, void 0); + } + return this.xf['@@transducer/result'](result); + }; + XFind.prototype['@@transducer/step'] = function (result, input) { + if (this.f(input)) { + this.found = true; + result = (0,_reduced_js__WEBPACK_IMPORTED_MODULE_1__["default"])(this.xf['@@transducer/step'](result, input)); + } + return result; + }; + return XFind; +}(); +function _xfind(f) { + return function (xf) { + return new XFind(f, xf); + }; +} /***/ }), -/***/ "./node_modules/ramda/es/replace.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/replace.js ***! - \******************************************/ +/***/ "./node_modules/ramda/es/internal/_xfindIndex.js": +/*!*******************************************************!*\ + !*** ./node_modules/ramda/es/internal/_xfindIndex.js ***! + \*******************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _xfindIndex; } +/* harmony export */ }); +/* harmony import */ var _reduced_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_reduced.js */ "./node_modules/ramda/es/internal/_reduced.js"); +/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); -/** - * Replace a substring or regex match in a string with a replacement. - * - * The first two parameters correspond to the parameters of the - * `String.prototype.replace()` function, so the second parameter can also be a - * function. - * - * @func - * @memberOf R - * @since v0.7.0 - * @category String - * @sig RegExp|String -> String -> String -> String - * @param {RegExp|String} pattern A regular expression or a substring to match. - * @param {String} replacement The string to replace the matches with. - * @param {String} str The String to do the search and replacement in. - * @return {String} The result. - * @example - * - * R.replace('foo', 'bar', 'foo foo foo'); //=> 'bar foo foo' - * R.replace(/foo/, 'bar', 'foo foo foo'); //=> 'bar foo foo' - * - * // Use the "g" (global) flag to replace all occurrences: - * R.replace(/foo/g, 'bar', 'foo foo foo'); //=> 'bar bar bar' - */ -var replace = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function replace(regex, replacement, str) { - return str.replace(regex, replacement); -}); -/* harmony default export */ __webpack_exports__["default"] = (replace); +var XFindIndex = /*#__PURE__*/ +function () { + function XFindIndex(f, xf) { + this.xf = xf; + this.f = f; + this.idx = -1; + this.found = false; + } + XFindIndex.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].init; + XFindIndex.prototype['@@transducer/result'] = function (result) { + if (!this.found) { + result = this.xf['@@transducer/step'](result, -1); + } + return this.xf['@@transducer/result'](result); + }; + XFindIndex.prototype['@@transducer/step'] = function (result, input) { + this.idx += 1; + if (this.f(input)) { + this.found = true; + result = (0,_reduced_js__WEBPACK_IMPORTED_MODULE_1__["default"])(this.xf['@@transducer/step'](result, this.idx)); + } + return result; + }; + return XFindIndex; +}(); +function _xfindIndex(f) { + return function (xf) { + return new XFindIndex(f, xf); + }; +} /***/ }), -/***/ "./node_modules/ramda/es/reverse.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/reverse.js ***! - \******************************************/ +/***/ "./node_modules/ramda/es/internal/_xmap.js": +/*!*************************************************!*\ + !*** ./node_modules/ramda/es/internal/_xmap.js ***! + \*************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _internal_isString_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isString.js */ "./node_modules/ramda/es/internal/_isString.js"); - - -/** - * Returns a new list or string with the elements or characters in reverse - * order. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig [a] -> [a] - * @sig String -> String - * @param {Array|String} list - * @return {Array|String} - * @example - * - * R.reverse([1, 2, 3]); //=> [3, 2, 1] - * R.reverse([1, 2]); //=> [2, 1] - * R.reverse([1]); //=> [1] - * R.reverse([]); //=> [] - * - * R.reverse('abc'); //=> 'cba' - * R.reverse('ab'); //=> 'ba' - * R.reverse('a'); //=> 'a' - * R.reverse(''); //=> '' - */ +/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); -var reverse = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function reverse(list) { - return (0,_internal_isString_js__WEBPACK_IMPORTED_MODULE_1__["default"])(list) ? list.split('').reverse().join('') : Array.prototype.slice.call(list, 0).reverse(); -}); -/* harmony default export */ __webpack_exports__["default"] = (reverse); +var XMap = /*#__PURE__*/ +function () { + function XMap(f, xf) { + this.xf = xf; + this.f = f; + } + XMap.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].init; + XMap.prototype['@@transducer/result'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].result; + XMap.prototype['@@transducer/step'] = function (result, input) { + return this.xf['@@transducer/step'](result, this.f(input)); + }; + return XMap; +}(); +var _xmap = function _xmap(f) { + return function (xf) { + return new XMap(f, xf); + }; +}; +/* harmony default export */ __webpack_exports__["default"] = (_xmap); /***/ }), -/***/ "./node_modules/ramda/es/scan.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/scan.js ***! - \***************************************/ +/***/ "./node_modules/ramda/es/internal/_xreduceBy.js": +/*!******************************************************!*\ + !*** ./node_modules/ramda/es/internal/_xreduceBy.js ***! + \******************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_xscan_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xscan.js */ "./node_modules/ramda/es/internal/_xscan.js"); - +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _xreduceBy; } +/* harmony export */ }); +/* harmony import */ var _clone_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_clone.js */ "./node_modules/ramda/es/internal/_clone.js"); +/* harmony import */ var _has_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_has.js */ "./node_modules/ramda/es/internal/_has.js"); +/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); -/** - * Scan is similar to [`reduce`](#reduce), but returns a list of successively - * reduced values from the left. - * - * Acts as a transducer if a transformer is given in list position. - * - * @func - * @memberOf R - * @since v0.10.0 - * @category List - * @sig ((a, b) -> a) -> a -> [b] -> [a] - * @param {Function} fn The iterator function. Receives two values, the accumulator and the - * current element from the array - * @param {*} acc The accumulator value. - * @param {Array} list The list to iterate over. - * @return {Array} A list of all intermediately reduced values. - * @see R.reduce, R.mapAccum - * @example - * - * const numbers = [1, 2, 3, 4]; - * const factorials = R.scan(R.multiply, 1, numbers); //=> [1, 1, 2, 6, 24] - * @symb R.scan(f, a, [b, c]) = [a, f(a, b), f(f(a, b), c)] - */ -var scan = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])([], _internal_xscan_js__WEBPACK_IMPORTED_MODULE_2__["default"], function scan(fn, acc, list) { - var idx = 0; - var len = list.length; - var result = [acc]; - while (idx < len) { - acc = fn(acc, list[idx]); - result[idx + 1] = acc; - idx += 1; +var XReduceBy = /*#__PURE__*/ +function () { + function XReduceBy(valueFn, valueAcc, keyFn, xf) { + this.valueFn = valueFn; + this.valueAcc = valueAcc; + this.keyFn = keyFn; + this.xf = xf; + this.inputs = {}; } - return result; -})); -/* harmony default export */ __webpack_exports__["default"] = (scan); + XReduceBy.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].init; + XReduceBy.prototype['@@transducer/result'] = function (result) { + var key; + for (key in this.inputs) { + if ((0,_has_js__WEBPACK_IMPORTED_MODULE_1__["default"])(key, this.inputs)) { + result = this.xf['@@transducer/step'](result, this.inputs[key]); + if (result['@@transducer/reduced']) { + result = result['@@transducer/value']; + break; + } + } + } + this.inputs = null; + return this.xf['@@transducer/result'](result); + }; + XReduceBy.prototype['@@transducer/step'] = function (result, input) { + var key = this.keyFn(input); + this.inputs[key] = this.inputs[key] || [key, (0,_clone_js__WEBPACK_IMPORTED_MODULE_2__["default"])(this.valueAcc, false)]; + this.inputs[key][1] = this.valueFn(this.inputs[key][1], input); + return result; + }; + return XReduceBy; +}(); +function _xreduceBy(valueFn, valueAcc, keyFn) { + return function (xf) { + return new XReduceBy(valueFn, valueAcc, keyFn, xf); + }; +} /***/ }), -/***/ "./node_modules/ramda/es/sequence.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/sequence.js ***! - \*******************************************/ +/***/ "./node_modules/ramda/es/internal/_xtake.js": +/*!**************************************************!*\ + !*** ./node_modules/ramda/es/internal/_xtake.js ***! + \**************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _ap_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ap.js */ "./node_modules/ramda/es/ap.js"); -/* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./map.js */ "./node_modules/ramda/es/map.js"); -/* harmony import */ var _prepend_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./prepend.js */ "./node_modules/ramda/es/prepend.js"); -/* harmony import */ var _reduceRight_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./reduceRight.js */ "./node_modules/ramda/es/reduceRight.js"); -/* harmony import */ var _internal_identity_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./internal/_identity.js */ "./node_modules/ramda/es/internal/_identity.js"); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _xtake; } +/* harmony export */ }); +/* harmony import */ var _reduced_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_reduced.js */ "./node_modules/ramda/es/internal/_reduced.js"); +/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); +var XTake = /*#__PURE__*/ +function () { + function XTake(n, xf) { + this.xf = xf; + this.n = n; + this.i = 0; + } + XTake.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].init; + XTake.prototype['@@transducer/result'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_0__["default"].result; + XTake.prototype['@@transducer/step'] = function (result, input) { + this.i += 1; + var ret = this.n === 0 ? result : this.xf['@@transducer/step'](result, input); + return this.n >= 0 && this.i >= this.n ? (0,_reduced_js__WEBPACK_IMPORTED_MODULE_1__["default"])(ret) : ret; + }; + return XTake; +}(); +function _xtake(n) { + return function (xf) { + return new XTake(n, xf); + }; +} +/***/ }), +/***/ "./node_modules/ramda/es/internal/_xuniqBy.js": +/*!****************************************************!*\ + !*** ./node_modules/ramda/es/internal/_xuniqBy.js ***! + \****************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _xuniqBy; } +/* harmony export */ }); +/* harmony import */ var _Set_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_Set.js */ "./node_modules/ramda/es/internal/_Set.js"); +/* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); -/** - * Transforms a [Traversable](https://github.com/fantasyland/fantasy-land#traversable) - * of [Applicative](https://github.com/fantasyland/fantasy-land#applicative) into an - * Applicative of Traversable. - * - * Dispatches to the `"fantasy-land/traverse"` or the `traverse` method of the second argument, if present. - * - * @func - * @memberOf R - * @since v0.19.0 - * @category List - * @sig fantasy-land/of :: TypeRep f => f ~> a -> f a - * @sig (Applicative f, Traversable t) => TypeRep f -> t (f a) -> f (t a) - * @sig (Applicative f, Traversable t) => (a -> f a) -> t (f a) -> f (t a) - * @param {Object|Function} TypeRepresentative with an `of` or `fantasy-land/of` method - * @param {*} traversable - * @return {*} - * @see R.traverse - * @example - * - * R.sequence(Maybe.of, [Just(1), Just(2), Just(3)]); //=> Just([1, 2, 3]) - * R.sequence(Maybe.of, [Just(1), Just(2), Nothing()]); //=> Nothing() - * - * R.sequence(R.of(Array), Just([1, 2, 3])); //=> [Just(1), Just(2), Just(3)] - * R.sequence(R.of(Array), Nothing()); //=> [Nothing()] - */ -var sequence = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function sequence(F, traversable) { - var of = typeof F['fantasy-land/of'] === 'function' ? F['fantasy-land/of'] : typeof F.of === 'function' ? F.of : F; - var TypeRep = { - 'fantasy-land/of': of +var XUniqBy = /*#__PURE__*/ +function () { + function XUniqBy(f, xf) { + this.xf = xf; + this.f = f; + this.set = new _Set_js__WEBPACK_IMPORTED_MODULE_0__["default"](); + } + XUniqBy.prototype['@@transducer/init'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_1__["default"].init; + XUniqBy.prototype['@@transducer/result'] = _xfBase_js__WEBPACK_IMPORTED_MODULE_1__["default"].result; + XUniqBy.prototype['@@transducer/step'] = function (result, input) { + return this.set.add(this.f(input)) ? this.xf['@@transducer/step'](result, input) : result; }; - return typeof traversable['fantasy-land/traverse'] === 'function' ? traversable['fantasy-land/traverse'](TypeRep, _internal_identity_js__WEBPACK_IMPORTED_MODULE_5__["default"]) : typeof traversable.traverse === 'function' ? traversable.traverse(TypeRep, _internal_identity_js__WEBPACK_IMPORTED_MODULE_5__["default"]) : (0,_reduceRight_js__WEBPACK_IMPORTED_MODULE_4__["default"])(function (x, acc) { - return (0,_ap_js__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_map_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_prepend_js__WEBPACK_IMPORTED_MODULE_3__["default"], x), acc); - }, of([]), traversable); -}); -/* harmony default export */ __webpack_exports__["default"] = (sequence); + return XUniqBy; +}(); +function _xuniqBy(f) { + return function (xf) { + return new XUniqBy(f, xf); + }; +} /***/ }), -/***/ "./node_modules/ramda/es/set.js": -/*!**************************************!*\ - !*** ./node_modules/ramda/es/set.js ***! - \**************************************/ +/***/ "./node_modules/ramda/es/internal/_xwrap.js": +/*!**************************************************!*\ + !*** ./node_modules/ramda/es/internal/_xwrap.js ***! + \**************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _always_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./always.js */ "./node_modules/ramda/es/always.js"); -/* harmony import */ var _over_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./over.js */ "./node_modules/ramda/es/over.js"); - - - -/** - * Returns the result of "setting" the portion of the given data structure - * focused by the given lens to the given value. - * - * @func - * @memberOf R - * @since v0.16.0 - * @category Object - * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s - * @sig Lens s a -> a -> s -> s - * @param {Lens} lens - * @param {*} v - * @param {*} x - * @return {*} - * @see R.view, R.over, R.lens, R.lensIndex, R.lensProp, R.lensPath - * @example - * - * const xLens = R.lensProp('x'); - * - * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2} - * R.set(xLens, 8, {x: 1, y: 2}); //=> {x: 8, y: 2} - */ - -var set = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function set(lens, v, x) { - return (0,_over_js__WEBPACK_IMPORTED_MODULE_2__["default"])(lens, (0,_always_js__WEBPACK_IMPORTED_MODULE_1__["default"])(v), x); -}); -/* harmony default export */ __webpack_exports__["default"] = (set); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ _xwrap; } +/* harmony export */ }); +var XWrap = /*#__PURE__*/ +function () { + function XWrap(fn) { + this.f = fn; + } + XWrap.prototype['@@transducer/init'] = function () { + throw new Error('init not implemented on XWrap'); + }; + XWrap.prototype['@@transducer/result'] = function (acc) { + return acc; + }; + XWrap.prototype['@@transducer/step'] = function (acc, x) { + return this.f(acc, x); + }; + return XWrap; +}(); +function _xwrap(fn) { + return new XWrap(fn); +} /***/ }), -/***/ "./node_modules/ramda/es/slice.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/slice.js ***! - \****************************************/ +/***/ "./node_modules/ramda/es/intersection.js": +/*!***********************************************!*\ + !*** ./node_modules/ramda/es/intersection.js ***! + \***********************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_checkForMethod_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_checkForMethod.js */ "./node_modules/ramda/es/internal/_checkForMethod.js"); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_filter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_filter.js */ "./node_modules/ramda/es/internal/_filter.js"); +/* harmony import */ var _internal_Set_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_Set.js */ "./node_modules/ramda/es/internal/_Set.js"); +/* harmony import */ var _uniq_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./uniq.js */ "./node_modules/ramda/es/uniq.js"); + + /** - * Returns the elements of the given list or string (or object with a `slice` - * method) from `fromIndex` (inclusive) to `toIndex` (exclusive). - * - * Dispatches to the `slice` method of the third argument, if present. + * Combines two lists into a set (i.e. no duplicates) composed of those + * elements common to both lists. * * @func * @memberOf R - * @since v0.1.4 - * @category List - * @sig Number -> Number -> [a] -> [a] - * @sig Number -> Number -> String -> String - * @param {Number} fromIndex The start index (inclusive). - * @param {Number} toIndex The end index (exclusive). - * @param {*} list - * @return {*} + * @since v0.1.0 + * @category Relation + * @sig [*] -> [*] -> [*] + * @param {Array} list1 The first list. + * @param {Array} list2 The second list. + * @return {Array} The list of elements found in both `list1` and `list2`. + * @see R.innerJoin * @example * - * R.slice(1, 3, ['a', 'b', 'c', 'd']); //=> ['b', 'c'] - * R.slice(1, Infinity, ['a', 'b', 'c', 'd']); //=> ['b', 'c', 'd'] - * R.slice(0, -1, ['a', 'b', 'c', 'd']); //=> ['a', 'b', 'c'] - * R.slice(-3, -1, ['a', 'b', 'c', 'd']); //=> ['b', 'c'] - * R.slice(0, 3, 'ramda'); //=> 'ram' + * R.intersection([1,2,3,4], [7,6,5,4,3]); //=> [4, 3] */ -var slice = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_1__["default"])( /*#__PURE__*/ -(0,_internal_checkForMethod_js__WEBPACK_IMPORTED_MODULE_0__["default"])('slice', function slice(fromIndex, toIndex, list) { - return Array.prototype.slice.call(list, fromIndex, toIndex); -})); -/* harmony default export */ __webpack_exports__["default"] = (slice); +var intersection = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function intersection(list1, list2) { + var toKeep = new _internal_Set_js__WEBPACK_IMPORTED_MODULE_1__["default"](); + for (var i = 0; i < list1.length; i += 1) { + toKeep.add(list1[i]); + } + return (0,_uniq_js__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_internal_filter_js__WEBPACK_IMPORTED_MODULE_3__["default"])(toKeep.has.bind(toKeep), list2)); +}); +/* harmony default export */ __webpack_exports__["default"] = (intersection); /***/ }), -/***/ "./node_modules/ramda/es/sort.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/sort.js ***! - \***************************************/ +/***/ "./node_modules/ramda/es/is.js": +/*!*************************************!*\ + !*** ./node_modules/ramda/es/is.js ***! + \*************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; @@ -93228,2372 +80356,2469 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); /** - * Returns a copy of the list, sorted according to the comparator function, - * which should accept two values at a time and return a negative number if the - * first value is smaller, a positive number if it's larger, and zero if they - * are equal. Please note that this is a **copy** of the list. It does not - * modify the original. + * See if an object (i.e. `val`) is an instance of the supplied constructor. This + * function will check up the inheritance chain, if any. + * If `val` was created using `Object.create`, `R.is(Object, val) === true`. * * @func * @memberOf R - * @since v0.1.0 - * @category List - * @sig ((a, a) -> Number) -> [a] -> [a] - * @param {Function} comparator A sorting function :: a -> b -> Int - * @param {Array} list The list to sort - * @return {Array} a new array with its elements sorted by the comparator function. - * @see R.ascend, R.descend + * @since v0.3.0 + * @category Type + * @sig (* -> {*}) -> a -> Boolean + * @param {Object} ctor A constructor + * @param {*} val The value to test + * @return {Boolean} * @example * - * const diff = function(a, b) { return a - b; }; - * R.sort(diff, [4,2,7,5]); //=> [2, 4, 5, 7] + * R.is(Object, {}); //=> true + * R.is(Number, 1); //=> true + * R.is(Object, 1); //=> false + * R.is(String, 's'); //=> true + * R.is(String, new String('')); //=> true + * R.is(Object, new String('')); //=> true + * R.is(Object, 's'); //=> false + * R.is(Number, {}); //=> false */ -var sort = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function sort(comparator, list) { - return Array.prototype.slice.call(list, 0).sort(comparator); +var is = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function is(Ctor, val) { + return val instanceof Ctor || val != null && (val.constructor === Ctor || Ctor.name === 'Object' && typeof val === 'object'); }); -/* harmony default export */ __webpack_exports__["default"] = (sort); +/* harmony default export */ __webpack_exports__["default"] = (is); /***/ }), -/***/ "./node_modules/ramda/es/sortBy.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/sortBy.js ***! - \*****************************************/ +/***/ "./node_modules/ramda/es/isEmpty.js": +/*!******************************************!*\ + !*** ./node_modules/ramda/es/isEmpty.js ***! + \******************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +/* harmony import */ var _empty_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./empty.js */ "./node_modules/ramda/es/empty.js"); +/* harmony import */ var _equals_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./equals.js */ "./node_modules/ramda/es/equals.js"); + + /** - * Sorts the list according to the supplied function. + * Returns `true` if the given value is its type's empty value; `false` + * otherwise. * * @func * @memberOf R * @since v0.1.0 - * @category Relation - * @sig Ord b => (a -> b) -> [a] -> [a] - * @param {Function} fn - * @param {Array} list The list to sort. - * @return {Array} A new list sorted by the keys generated by `fn`. + * @category Logic + * @sig a -> Boolean + * @param {*} x + * @return {Boolean} + * @see R.empty * @example * - * const sortByFirstItem = R.sortBy(R.prop(0)); - * const pairs = [[-1, 1], [-2, 2], [-3, 3]]; - * sortByFirstItem(pairs); //=> [[-3, 3], [-2, 2], [-1, 1]] - * - * const sortByNameCaseInsensitive = R.sortBy(R.compose(R.toLower, R.prop('name'))); - * const alice = { - * name: 'ALICE', - * age: 101 - * }; - * const bob = { - * name: 'Bob', - * age: -10 - * }; - * const clara = { - * name: 'clara', - * age: 314.159 - * }; - * const people = [clara, bob, alice]; - * sortByNameCaseInsensitive(people); //=> [alice, bob, clara] + * R.isEmpty([1, 2, 3]); //=> false + * R.isEmpty([]); //=> true + * R.isEmpty(''); //=> true + * R.isEmpty(null); //=> false + * R.isEmpty({}); //=> true + * R.isEmpty({length: 0}); //=> false + * R.isEmpty(Uint8Array.from('')); //=> true */ -var sortBy = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function sortBy(fn, list) { - return Array.prototype.slice.call(list, 0).sort(function (a, b) { - var aa = fn(a); - var bb = fn(b); - return aa < bb ? -1 : aa > bb ? 1 : 0; - }); +var isEmpty = /*#__PURE__*/ +(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function isEmpty(x) { + return x != null && (0,_equals_js__WEBPACK_IMPORTED_MODULE_1__["default"])(x, (0,_empty_js__WEBPACK_IMPORTED_MODULE_2__["default"])(x)); }); -/* harmony default export */ __webpack_exports__["default"] = (sortBy); +/* harmony default export */ __webpack_exports__["default"] = (isEmpty); /***/ }), -/***/ "./node_modules/ramda/es/sortWith.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/sortWith.js ***! - \*******************************************/ +/***/ "./node_modules/ramda/es/isNil.js": +/*!****************************************!*\ + !*** ./node_modules/ramda/es/isNil.js ***! + \****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); /** - * Sorts a list according to a list of comparators. + * Checks if the input value is `null` or `undefined`. * * @func * @memberOf R - * @since v0.23.0 - * @category Relation - * @sig [(a, a) -> Number] -> [a] -> [a] - * @param {Array} functions A list of comparator functions. - * @param {Array} list The list to sort. - * @return {Array} A new list sorted according to the comarator functions. - * @see R.ascend, R.descend + * @since v0.9.0 + * @category Type + * @sig * -> Boolean + * @param {*} x The value to test. + * @return {Boolean} `true` if `x` is `undefined` or `null`, otherwise `false`. * @example * - * const alice = { - * name: 'alice', - * age: 40 - * }; - * const bob = { - * name: 'bob', - * age: 30 - * }; - * const clara = { - * name: 'clara', - * age: 40 - * }; - * const people = [clara, bob, alice]; - * const ageNameSort = R.sortWith([ - * R.descend(R.prop('age')), - * R.ascend(R.prop('name')) - * ]); - * ageNameSort(people); //=> [alice, clara, bob] - */ - -var sortWith = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function sortWith(fns, list) { - return Array.prototype.slice.call(list, 0).sort(function (a, b) { - var result = 0; - var i = 0; - while (result === 0 && i < fns.length) { - result = fns[i](a, b); - i += 1; - } - return result; - }); + * R.isNil(null); //=> true + * R.isNil(undefined); //=> true + * R.isNil(0); //=> false + * R.isNil([]); //=> false + */ + +var isNil = /*#__PURE__*/ +(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function isNil(x) { + return x == null; }); -/* harmony default export */ __webpack_exports__["default"] = (sortWith); +/* harmony default export */ __webpack_exports__["default"] = (isNil); /***/ }), -/***/ "./node_modules/ramda/es/split.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/split.js ***! - \****************************************/ +/***/ "./node_modules/ramda/es/juxt.js": +/*!***************************************!*\ + !*** ./node_modules/ramda/es/juxt.js ***! + \***************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _invoker_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./invoker.js */ "./node_modules/ramda/es/invoker.js"); +/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +/* harmony import */ var _converge_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./converge.js */ "./node_modules/ramda/es/converge.js"); + /** - * Splits a string into an array of strings based on the given - * separator. + * juxt applies a list of functions to a list of values. * * @func * @memberOf R - * @since v0.1.0 - * @category String - * @sig (String | RegExp) -> String -> [String] - * @param {String|RegExp} sep The pattern. - * @param {String} str The string to separate into an array. - * @return {Array} The array of strings from `str` separated by `sep`. - * @see R.join + * @since v0.19.0 + * @category Function + * @sig [(a, b, ..., m) -> n] -> ((a, b, ..., m) -> [n]) + * @param {Array} fns An array of functions + * @return {Function} A function that returns a list of values after applying each of the original `fns` to its parameters. + * @see R.applySpec * @example * - * const pathComponents = R.split('/'); - * R.tail(pathComponents('/usr/local/bin/node')); //=> ['usr', 'local', 'bin', 'node'] - * - * R.split('.', 'a.b.c.xyz.d'); //=> ['a', 'b', 'c', 'xyz', 'd'] + * const getRange = R.juxt([Math.min, Math.max]); + * getRange(3, 4, 9, -3); //=> [-3, 9] + * @symb R.juxt([f, g, h])(a, b) = [f(a, b), g(a, b), h(a, b)] */ -var split = /*#__PURE__*/ -(0,_invoker_js__WEBPACK_IMPORTED_MODULE_0__["default"])(1, 'split'); -/* harmony default export */ __webpack_exports__["default"] = (split); +var juxt = /*#__PURE__*/ +(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function juxt(fns) { + return (0,_converge_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function () { + return Array.prototype.slice.call(arguments, 0); + }, fns); +}); +/* harmony default export */ __webpack_exports__["default"] = (juxt); /***/ }), -/***/ "./node_modules/ramda/es/splitAt.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/splitAt.js ***! - \******************************************/ +/***/ "./node_modules/ramda/es/keys.js": +/*!***************************************!*\ + !*** ./node_modules/ramda/es/keys.js ***! + \***************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _length_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./length.js */ "./node_modules/ramda/es/length.js"); -/* harmony import */ var _slice_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./slice.js */ "./node_modules/ramda/es/slice.js"); +/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +/* harmony import */ var _internal_has_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_has.js */ "./node_modules/ramda/es/internal/_has.js"); +/* harmony import */ var _internal_isArguments_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isArguments.js */ "./node_modules/ramda/es/internal/_isArguments.js"); + + // cover IE < 9 keys issues + +var hasEnumBug = ! /*#__PURE__*/ +{ + toString: null +}.propertyIsEnumerable('toString'); +var nonEnumerableProps = ['constructor', 'valueOf', 'isPrototypeOf', 'toString', 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; // Safari bug +var hasArgsEnumBug = /*#__PURE__*/ +function () { + 'use strict'; + return arguments.propertyIsEnumerable('length'); +}(); +var contains = function contains(list, item) { + var idx = 0; + while (idx < list.length) { + if (list[idx] === item) { + return true; + } + idx += 1; + } + return false; +}; /** - * Splits a given list or string at a given index. + * Returns a list containing the names of all the enumerable own properties of + * the supplied object. + * Note that the order of the output array is not guaranteed to be consistent + * across different JS platforms. * * @func * @memberOf R - * @since v0.19.0 - * @category List - * @sig Number -> [a] -> [[a], [a]] - * @sig Number -> String -> [String, String] - * @param {Number} index The index where the array/string is split. - * @param {Array|String} array The array/string to be split. - * @return {Array} + * @since v0.1.0 + * @category Object + * @sig {k: v} -> [k] + * @param {Object} obj The object to extract properties from + * @return {Array} An array of the object's own properties. + * @see R.keysIn, R.values, R.toPairs * @example * - * R.splitAt(1, [1, 2, 3]); //=> [[1], [2, 3]] - * R.splitAt(5, 'hello world'); //=> ['hello', ' world'] - * R.splitAt(-1, 'foobar'); //=> ['fooba', 'r'] + * R.keys({a: 1, b: 2, c: 3}); //=> ['a', 'b', 'c'] */ -var splitAt = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function splitAt(index, array) { - return [(0,_slice_js__WEBPACK_IMPORTED_MODULE_2__["default"])(0, index, array), (0,_slice_js__WEBPACK_IMPORTED_MODULE_2__["default"])(index, (0,_length_js__WEBPACK_IMPORTED_MODULE_1__["default"])(array), array)]; +var keys = typeof Object.keys === 'function' && !hasArgsEnumBug ? /*#__PURE__*/ +(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function keys(obj) { + return Object(obj) !== obj ? [] : Object.keys(obj); +}) : /*#__PURE__*/ +(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function keys(obj) { + if (Object(obj) !== obj) { + return []; + } + var prop, nIdx; + var ks = []; + var checkArgsLength = hasArgsEnumBug && (0,_internal_isArguments_js__WEBPACK_IMPORTED_MODULE_1__["default"])(obj); + for (prop in obj) { + if ((0,_internal_has_js__WEBPACK_IMPORTED_MODULE_2__["default"])(prop, obj) && (!checkArgsLength || prop !== 'length')) { + ks[ks.length] = prop; + } + } + if (hasEnumBug) { + nIdx = nonEnumerableProps.length - 1; + while (nIdx >= 0) { + prop = nonEnumerableProps[nIdx]; + if ((0,_internal_has_js__WEBPACK_IMPORTED_MODULE_2__["default"])(prop, obj) && !contains(ks, prop)) { + ks[ks.length] = prop; + } + nIdx -= 1; + } + } + return ks; }); -/* harmony default export */ __webpack_exports__["default"] = (splitAt); +/* harmony default export */ __webpack_exports__["default"] = (keys); /***/ }), -/***/ "./node_modules/ramda/es/splitEvery.js": -/*!*********************************************!*\ - !*** ./node_modules/ramda/es/splitEvery.js ***! - \*********************************************/ +/***/ "./node_modules/ramda/es/lens.js": +/*!***************************************!*\ + !*** ./node_modules/ramda/es/lens.js ***! + \***************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _slice_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./slice.js */ "./node_modules/ramda/es/slice.js"); +/* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./map.js */ "./node_modules/ramda/es/map.js"); /** - * Splits a collection into slices of the specified length. + * Returns a lens for the given getter and setter functions. The getter "gets" + * the value of the focus; the setter "sets" the value of the focus. The setter + * should not mutate the data structure. * * @func * @memberOf R - * @since v0.16.0 - * @category List - * @sig Number -> [a] -> [[a]] - * @sig Number -> String -> [String] - * @param {Number} n - * @param {Array} list - * @return {Array} + * @since v0.8.0 + * @category Object + * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s + * @sig (s -> a) -> ((a, s) -> s) -> Lens s a + * @param {Function} getter + * @param {Function} setter + * @return {Lens} + * @see R.view, R.set, R.over, R.lensIndex, R.lensProp * @example * - * R.splitEvery(3, [1, 2, 3, 4, 5, 6, 7]); //=> [[1, 2, 3], [4, 5, 6], [7]] - * R.splitEvery(3, 'foobarbaz'); //=> ['foo', 'bar', 'baz'] + * const xLens = R.lens(R.prop('x'), R.assoc('x')); + * + * R.view(xLens, {x: 1, y: 2}); //=> 1 + * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2} + * R.over(xLens, R.negate, {x: 1, y: 2}); //=> {x: -1, y: 2} */ -var splitEvery = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function splitEvery(n, list) { - if (n <= 0) { - throw new Error('First argument to splitEvery must be a positive integer'); - } - var result = []; - var idx = 0; - while (idx < list.length) { - result.push((0,_slice_js__WEBPACK_IMPORTED_MODULE_1__["default"])(idx, idx += n, list)); - } - return result; +var lens = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function lens(getter, setter) { + return function (toFunctorFn) { + return function (target) { + return (0,_map_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (focus) { + return setter(focus, target); + }, toFunctorFn(getter(target))); + }; + }; }); -/* harmony default export */ __webpack_exports__["default"] = (splitEvery); +/* harmony default export */ __webpack_exports__["default"] = (lens); /***/ }), -/***/ "./node_modules/ramda/es/splitWhen.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/splitWhen.js ***! - \********************************************/ +/***/ "./node_modules/ramda/es/lensPath.js": +/*!*******************************************!*\ + !*** ./node_modules/ramda/es/lensPath.js ***! + \*******************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +/* harmony import */ var _assocPath_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./assocPath.js */ "./node_modules/ramda/es/assocPath.js"); +/* harmony import */ var _lens_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lens.js */ "./node_modules/ramda/es/lens.js"); +/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./path.js */ "./node_modules/ramda/es/path.js"); + + + /** - * Takes a list and a predicate and returns a pair of lists with the following properties: - * - * - the result of concatenating the two output lists is equivalent to the input list; - * - none of the elements of the first output list satisfies the predicate; and - * - if the second output list is non-empty, its first element satisfies the predicate. + * Returns a lens whose focus is the specified path. * * @func * @memberOf R * @since v0.19.0 - * @category List - * @sig (a -> Boolean) -> [a] -> [[a], [a]] - * @param {Function} pred The predicate that determines where the array is split. - * @param {Array} list The array to be split. - * @return {Array} + * @category Object + * @typedefn Idx = String | Int | Symbol + * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s + * @sig [Idx] -> Lens s a + * @param {Array} path The path to use. + * @return {Lens} + * @see R.view, R.set, R.over * @example * - * R.splitWhen(R.equals(2), [1, 2, 3, 1, 2, 3]); //=> [[1], [2, 3, 1, 2, 3]] + * const xHeadYLens = R.lensPath(['x', 0, 'y']); + * + * R.view(xHeadYLens, {x: [{y: 2, z: 3}, {y: 4, z: 5}]}); + * //=> 2 + * R.set(xHeadYLens, 1, {x: [{y: 2, z: 3}, {y: 4, z: 5}]}); + * //=> {x: [{y: 1, z: 3}, {y: 4, z: 5}]} + * R.over(xHeadYLens, R.negate, {x: [{y: 2, z: 3}, {y: 4, z: 5}]}); + * //=> {x: [{y: -2, z: 3}, {y: 4, z: 5}]} */ -var splitWhen = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function splitWhen(pred, list) { - var idx = 0; - var len = list.length; - var prefix = []; - while (idx < len && !pred(list[idx])) { - prefix.push(list[idx]); - idx += 1; - } - return [prefix, Array.prototype.slice.call(list, idx)]; +var lensPath = /*#__PURE__*/ +(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function lensPath(p) { + return (0,_lens_js__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_path_js__WEBPACK_IMPORTED_MODULE_2__["default"])(p), (0,_assocPath_js__WEBPACK_IMPORTED_MODULE_3__["default"])(p)); }); -/* harmony default export */ __webpack_exports__["default"] = (splitWhen); +/* harmony default export */ __webpack_exports__["default"] = (lensPath); /***/ }), -/***/ "./node_modules/ramda/es/splitWhenever.js": -/*!************************************************!*\ - !*** ./node_modules/ramda/es/splitWhenever.js ***! - \************************************************/ +/***/ "./node_modules/ramda/es/lt.js": +/*!*************************************!*\ + !*** ./node_modules/ramda/es/lt.js ***! + \*************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curryN_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curryN.js */ "./node_modules/ramda/es/internal/_curryN.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); /** - * Splits an array into slices on every occurrence of a value. + * Returns `true` if the first argument is less than the second; `false` + * otherwise. * * @func * @memberOf R - * @since v0.26.1 - * @category List - * @sig (a -> Boolean) -> [a] -> [[a]] - * @param {Function} pred The predicate that determines where the array is split. - * @param {Array} list The array to be split. - * @return {Array} + * @since v0.1.0 + * @category Relation + * @sig Ord a => a -> a -> Boolean + * @param {*} a + * @param {*} b + * @return {Boolean} + * @see R.gt * @example * - * R.splitWhenever(R.equals(2), [1, 2, 3, 2, 4, 5, 2, 6, 7]); //=> [[1], [3], [4, 5], [6, 7]] + * R.lt(2, 1); //=> false + * R.lt(2, 2); //=> false + * R.lt(2, 3); //=> true + * R.lt('a', 'z'); //=> true + * R.lt('z', 'a'); //=> false */ -var splitWhenever = /*#__PURE__*/ -(0,_internal_curryN_js__WEBPACK_IMPORTED_MODULE_0__["default"])(2, [], function splitWhenever(pred, list) { - var acc = []; - var curr = []; - for (var i = 0; i < list.length; i = i + 1) { - if (!pred(list[i])) { - curr.push(list[i]); - } - if ((i < list.length - 1 && pred(list[i + 1]) || i === list.length - 1) && curr.length > 0) { - acc.push(curr); - curr = []; - } - } - return acc; +var lt = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function lt(a, b) { + return a < b; }); -/* harmony default export */ __webpack_exports__["default"] = (splitWhenever); +/* harmony default export */ __webpack_exports__["default"] = (lt); /***/ }), -/***/ "./node_modules/ramda/es/startsWith.js": -/*!*********************************************!*\ - !*** ./node_modules/ramda/es/startsWith.js ***! - \*********************************************/ +/***/ "./node_modules/ramda/es/map.js": +/*!**************************************!*\ + !*** ./node_modules/ramda/es/map.js ***! + \**************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); +/* harmony import */ var _internal_arrayReduce_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./internal/_arrayReduce.js */ "./node_modules/ramda/es/internal/_arrayReduce.js"); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _equals_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./equals.js */ "./node_modules/ramda/es/equals.js"); -/* harmony import */ var _take_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./take.js */ "./node_modules/ramda/es/take.js"); +/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); +/* harmony import */ var _internal_map_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./internal/_map.js */ "./node_modules/ramda/es/internal/_map.js"); +/* harmony import */ var _internal_xmap_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xmap.js */ "./node_modules/ramda/es/internal/_xmap.js"); +/* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./curryN.js */ "./node_modules/ramda/es/curryN.js"); +/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./keys.js */ "./node_modules/ramda/es/keys.js"); + + + + /** - * Checks if a list starts with the provided sublist. + * Takes a function and + * a [functor](https://github.com/fantasyland/fantasy-land#functor), + * applies the function to each of the functor's values, and returns + * a functor of the same shape. * - * Similarly, checks if a string starts with the provided substring. + * Ramda provides suitable `map` implementations for `Array` and `Object`, + * so this function may be applied to `[1, 2, 3]` or `{x: 1, y: 2, z: 3}`. + * + * Dispatches to the `map` method of the second argument, if present. + * + * Acts as a transducer if a transformer is given in list position. + * + * Also treats functions as functors and will compose them together. * * @func * @memberOf R - * @since v0.24.0 + * @since v0.1.0 * @category List - * @sig [a] -> [a] -> Boolean - * @sig String -> String -> Boolean - * @param {*} prefix - * @param {*} list - * @return {Boolean} - * @see R.endsWith + * @sig Functor f => (a -> b) -> f a -> f b + * @param {Function} fn The function to be called on every element of the input `list`. + * @param {Array} list The list to be iterated over. + * @return {Array} The new list. + * @see R.transduce, R.addIndex, R.pluck, R.project * @example * - * R.startsWith('a', 'abc') //=> true - * R.startsWith('b', 'abc') //=> false - * R.startsWith(['a'], ['a', 'b', 'c']) //=> true - * R.startsWith(['b'], ['a', 'b', 'c']) //=> false + * const double = x => x * 2; + * + * R.map(double, [1, 2, 3]); //=> [2, 4, 6] + * + * R.map(double, {x: 1, y: 2, z: 3}); //=> {x: 2, y: 4, z: 6} + * @symb R.map(f, [a, b]) = [f(a), f(b)] + * @symb R.map(f, { x: a, y: b }) = { x: f(a), y: f(b) } + * @symb R.map(f, functor_o) = functor_o.map(f) */ -var startsWith = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (prefix, list) { - return (0,_equals_js__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_take_js__WEBPACK_IMPORTED_MODULE_2__["default"])(prefix.length, list), prefix); -}); -/* harmony default export */ __webpack_exports__["default"] = (startsWith); +var map = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ +(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])(['fantasy-land/map', 'map'], _internal_xmap_js__WEBPACK_IMPORTED_MODULE_2__["default"], function map(fn, functor) { + switch (Object.prototype.toString.call(functor)) { + case '[object Function]': + return (0,_curryN_js__WEBPACK_IMPORTED_MODULE_3__["default"])(functor.length, function () { + return fn.call(this, functor.apply(this, arguments)); + }); + case '[object Object]': + return (0,_internal_arrayReduce_js__WEBPACK_IMPORTED_MODULE_4__["default"])(function (acc, key) { + acc[key] = fn(functor[key]); + return acc; + }, {}, (0,_keys_js__WEBPACK_IMPORTED_MODULE_5__["default"])(functor)); + default: + return (0,_internal_map_js__WEBPACK_IMPORTED_MODULE_6__["default"])(fn, functor); + } +})); +/* harmony default export */ __webpack_exports__["default"] = (map); /***/ }), -/***/ "./node_modules/ramda/es/subtract.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/subtract.js ***! - \*******************************************/ +/***/ "./node_modules/ramda/es/mapObjIndexed.js": +/*!************************************************!*\ + !*** ./node_modules/ramda/es/mapObjIndexed.js ***! + \************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); +/* harmony import */ var _internal_arrayReduce_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_arrayReduce.js */ "./node_modules/ramda/es/internal/_arrayReduce.js"); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./keys.js */ "./node_modules/ramda/es/keys.js"); + + /** - * Subtracts its second argument from its first argument. + * An Object-specific version of [`map`](#map). The function is applied to three + * arguments: *(value, key, obj)*. If only the value is significant, use + * [`map`](#map) instead. * * @func * @memberOf R - * @since v0.1.0 - * @category Math - * @sig Number -> Number -> Number - * @param {Number} a The first value. - * @param {Number} b The second value. - * @return {Number} The result of `a - b`. - * @see R.add + * @since v0.9.0 + * @category Object + * @sig ((*, String, Object) -> *) -> Object -> Object + * @param {Function} fn + * @param {Object} obj + * @return {Object} + * @see R.map * @example * - * R.subtract(10, 8); //=> 2 - * - * const minus5 = R.subtract(R.__, 5); - * minus5(17); //=> 12 + * const xyz = { x: 1, y: 2, z: 3 }; + * const prependKeyAndDouble = (num, key, obj) => key + (num * 2); * - * const complementaryAngle = R.subtract(90); - * complementaryAngle(30); //=> 60 - * complementaryAngle(72); //=> 18 + * R.mapObjIndexed(prependKeyAndDouble, xyz); //=> { x: 'x2', y: 'y4', z: 'z6' } */ -var subtract = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function subtract(a, b) { - return Number(a) - Number(b); +var mapObjIndexed = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function mapObjIndexed(fn, obj) { + return (0,_internal_arrayReduce_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (acc, key) { + acc[key] = fn(obj[key], key, obj); + return acc; + }, {}, (0,_keys_js__WEBPACK_IMPORTED_MODULE_2__["default"])(obj)); }); -/* harmony default export */ __webpack_exports__["default"] = (subtract); +/* harmony default export */ __webpack_exports__["default"] = (mapObjIndexed); /***/ }), -/***/ "./node_modules/ramda/es/sum.js": +/***/ "./node_modules/ramda/es/max.js": /*!**************************************!*\ - !*** ./node_modules/ramda/es/sum.js ***! + !*** ./node_modules/ramda/es/max.js ***! \**************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _add_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./add.js */ "./node_modules/ramda/es/add.js"); -/* harmony import */ var _reduce_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./reduce.js */ "./node_modules/ramda/es/reduce.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _toString_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./toString.js */ "./node_modules/ramda/es/toString.js"); /** - * Adds together all the elements of a list. + * Returns the larger of its two arguments. * * @func * @memberOf R * @since v0.1.0 - * @category Math - * @sig [Number] -> Number - * @param {Array} list An array of numbers - * @return {Number} The sum of all the numbers in the list. - * @see R.reduce + * @category Relation + * @sig Ord a => a -> a -> a + * @param {*} a + * @param {*} b + * @return {*} + * @see R.maxBy, R.min * @example * - * R.sum([2,4,6,8,100,1]); //=> 121 + * R.max(789, 123); //=> 789 + * R.max('a', 'b'); //=> 'b' */ -var sum = /*#__PURE__*/ -(0,_reduce_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_add_js__WEBPACK_IMPORTED_MODULE_0__["default"], 0); -/* harmony default export */ __webpack_exports__["default"] = (sum); +var max = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function max(a, b) { + if (a === b) { + return b; + } + function safeMax(x, y) { + if (x > y !== y > x) { + return y > x ? y : x; + } + return undefined; + } + var maxByValue = safeMax(a, b); + if (maxByValue !== undefined) { + return maxByValue; + } + var maxByType = safeMax(typeof a, typeof b); + if (maxByType !== undefined) { + return maxByType === typeof a ? a : b; + } + var stringA = (0,_toString_js__WEBPACK_IMPORTED_MODULE_1__["default"])(a); + var maxByStringValue = safeMax(stringA, (0,_toString_js__WEBPACK_IMPORTED_MODULE_1__["default"])(b)); + if (maxByStringValue !== undefined) { + return maxByStringValue === stringA ? a : b; + } + return b; +}); +/* harmony default export */ __webpack_exports__["default"] = (max); /***/ }), -/***/ "./node_modules/ramda/es/swap.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/swap.js ***! - \***************************************/ +/***/ "./node_modules/ramda/es/memoizeWith.js": +/*!**********************************************!*\ + !*** ./node_modules/ramda/es/memoizeWith.js ***! + \**********************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); -/* harmony import */ var _internal_isString_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_isString.js */ "./node_modules/ramda/es/internal/_isString.js"); -/* harmony import */ var _clone_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./clone.js */ "./node_modules/ramda/es/clone.js"); - +/* harmony import */ var _internal_arity_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_arity.js */ "./node_modules/ramda/es/internal/_arity.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_has_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_has.js */ "./node_modules/ramda/es/internal/_has.js"); -var swapObject = function swapObject(indexA, indexB, o) { - var copy = (0,_clone_js__WEBPACK_IMPORTED_MODULE_3__["default"])(o); - var properties = Object.getOwnPropertyNames(copy); - if (properties.includes(indexA) && properties.includes(indexB)) { - var tmp = copy[indexA]; - copy[indexA] = copy[indexB]; - copy[indexB] = tmp; - } - return copy; -}; -var swapList = function swapList(indexA, indexB, list) { - var length = list.length; - var result = list.slice(); - var positiveIndexA = indexA < 0 ? length + indexA : indexA; - var positiveIndexB = indexB < 0 ? length + indexB : indexB; - var positiveMin = Math.min(positiveIndexA, positiveIndexB); - var positiveMax = Math.max(positiveIndexA, positiveIndexB); - if (positiveIndexA < 0 || positiveIndexA > length) { - return result; - } - if (positiveIndexB < 0 || positiveIndexB > length) { - return result; - } - if (positiveIndexA === positiveIndexB) { - return result; - } - result = [].concat(result.slice(0, positiveMin)).concat(result[positiveMax]).concat(result.slice(positiveMin + 1, positiveMax)).concat(result[positiveMin]).concat(result.slice(positiveMax + 1, length)); - return result; -}; -var swapString = function swapString(indexA, indexB, s) { - var result = swapList(indexA, indexB, s); - return (0,_internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(result) ? result.join('') : result; -}; /** - * Swap an item, at index `indexA` with another item, at index `indexB`, in an object or a list of elements. - * A new result will be created containing the new elements order. + * Takes a string-returning function `keyGen` and a function `fn` and returns + * a new function that returns cached results for subsequent + * calls with the same arguments. + * + * When the function is invoked, `keyGen` is applied to the same arguments + * and its result becomes the cache key. If the cache contains something + * under that key, the function simply returns it and does not invoke `fn` at all. + * + * Otherwise `fn` is applied to the same arguments and its return value + * is cached under that key and returned by the function. + * + * Care must be taken when implementing `keyGen` to avoid key collision, + * or if tracking references, memory leaks and mutating arguments. * * @func * @memberOf R - * @since v0.29.0 - * @category List - * @sig Number -> Number -> [a] -> [a] - * @param {Number|string|Object} indexA The first index - * @param {Number|string|Object} indexB The second index - * @param {Array|Object} o Either the object or list which will serve to realise the swap - * @return {Array|Object} The new object or list reordered + * @since v0.24.0 + * @category Function + * @sig (*... -> String) -> (*... -> a) -> (*... -> a) + * @param {Function} keyGen The function to generate the cache key. + * @param {Function} fn The function to memoize. + * @return {Function} Memoized version of `fn`. * @example + * const withAge = memoizeWith(o => `${o.birth}/${o.death}`, ({birth, death}) => { + * // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^ + * // keyGen fn + * console.log(`computing age for ${birth}/${death}`); + * return ({birth, death, age: death - birth}); + * }); + * + * withAge({birth: 1921, death: 1999}); + * //=> LOG: computing age for 1921/1999 + * //=> {birth: 1921, death: 1999, age: 78} (returned from fn) * - * R.swap(0, 2, ['a', 'b', 'c', 'd', 'e', 'f']); //=> ['c', 'b', 'a', 'd', 'e', 'f'] - * R.swap(-1, 0, ['a', 'b', 'c', 'd', 'e', 'f']); //=> ['f', 'b', 'c', 'd', 'e', 'a'] list rotation - * R.swap('a', 'b', {a: 1, b: 2}); //=> {a: 2, b: 2} - * R.swap(0, 2, 'foo'); //=> 'oof' + * withAge({birth: 1921, death: 1999}); + * //=> {birth: 1921, death: 1999, age: 78} (returned from cache) */ -var swap = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (indexA, indexB, o) { - if ((0,_internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(o)) { - return swapList(indexA, indexB, o); - } else if ((0,_internal_isString_js__WEBPACK_IMPORTED_MODULE_2__["default"])(o)) { - return swapString(indexA, indexB, o); - } else { - return swapObject(indexA, indexB, o); - } +var memoizeWith = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function memoizeWith(keyGen, fn) { + var cache = {}; + return (0,_internal_arity_js__WEBPACK_IMPORTED_MODULE_1__["default"])(fn.length, function () { + var key = keyGen.apply(this, arguments); + if (!(0,_internal_has_js__WEBPACK_IMPORTED_MODULE_2__["default"])(key, cache)) { + cache[key] = fn.apply(this, arguments); + } + return cache[key]; + }); }); -/* harmony default export */ __webpack_exports__["default"] = (swap); +/* harmony default export */ __webpack_exports__["default"] = (memoizeWith); /***/ }), -/***/ "./node_modules/ramda/es/symmetricDifference.js": -/*!******************************************************!*\ - !*** ./node_modules/ramda/es/symmetricDifference.js ***! - \******************************************************/ +/***/ "./node_modules/ramda/es/mergeDeepRight.js": +/*!*************************************************!*\ + !*** ./node_modules/ramda/es/mergeDeepRight.js ***! + \*************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _concat_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./concat.js */ "./node_modules/ramda/es/concat.js"); -/* harmony import */ var _difference_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./difference.js */ "./node_modules/ramda/es/difference.js"); - +/* harmony import */ var _mergeDeepWithKey_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mergeDeepWithKey.js */ "./node_modules/ramda/es/mergeDeepWithKey.js"); /** - * Finds the set (i.e. no duplicates) of all elements contained in the first or - * second list, but not both. + * Creates a new object with the own properties of the first object merged with + * the own properties of the second object. If a key exists in both objects: + * - and both values are objects, the two values will be recursively merged + * - otherwise the value from the second object will be used. * * @func * @memberOf R - * @since v0.19.0 - * @category Relation - * @sig [*] -> [*] -> [*] - * @param {Array} list1 The first list. - * @param {Array} list2 The second list. - * @return {Array} The elements in `list1` or `list2`, but not both. - * @see R.symmetricDifferenceWith, R.difference, R.differenceWith + * @since v0.24.0 + * @category Object + * @sig {a} -> {a} -> {a} + * @param {Object} lObj + * @param {Object} rObj + * @return {Object} + * @see R.merge, R.mergeDeepLeft, R.mergeDeepWith, R.mergeDeepWithKey * @example * - * R.symmetricDifference([1,2,3,4], [7,6,5,4,3]); //=> [1,2,7,6,5] - * R.symmetricDifference([7,6,5,4,3], [1,2,3,4]); //=> [7,6,5,1,2] + * R.mergeDeepRight({ name: 'fred', age: 10, contact: { email: 'moo@example.com' }}, + * { age: 40, contact: { email: 'baa@example.com' }}); + * //=> { name: 'fred', age: 40, contact: { email: 'baa@example.com' }} */ -var symmetricDifference = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function symmetricDifference(list1, list2) { - return (0,_concat_js__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_difference_js__WEBPACK_IMPORTED_MODULE_2__["default"])(list1, list2), (0,_difference_js__WEBPACK_IMPORTED_MODULE_2__["default"])(list2, list1)); +var mergeDeepRight = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function mergeDeepRight(lObj, rObj) { + return (0,_mergeDeepWithKey_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (k, lVal, rVal) { + return rVal; + }, lObj, rObj); }); -/* harmony default export */ __webpack_exports__["default"] = (symmetricDifference); +/* harmony default export */ __webpack_exports__["default"] = (mergeDeepRight); /***/ }), -/***/ "./node_modules/ramda/es/symmetricDifferenceWith.js": -/*!**********************************************************!*\ - !*** ./node_modules/ramda/es/symmetricDifferenceWith.js ***! - \**********************************************************/ +/***/ "./node_modules/ramda/es/mergeDeepWithKey.js": +/*!***************************************************!*\ + !*** ./node_modules/ramda/es/mergeDeepWithKey.js ***! + \***************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _concat_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./concat.js */ "./node_modules/ramda/es/concat.js"); -/* harmony import */ var _differenceWith_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./differenceWith.js */ "./node_modules/ramda/es/differenceWith.js"); +/* harmony import */ var _internal_isObject_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_isObject.js */ "./node_modules/ramda/es/internal/_isObject.js"); +/* harmony import */ var _mergeWithKey_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mergeWithKey.js */ "./node_modules/ramda/es/mergeWithKey.js"); /** - * Finds the set (i.e. no duplicates) of all elements contained in the first or - * second list, but not both. Duplication is determined according to the value - * returned by applying the supplied predicate to two list elements. + * Creates a new object with the own properties of the two provided objects. + * If a key exists in both objects: + * - and both associated values are also objects then the values will be + * recursively merged. + * - otherwise the provided function is applied to the key and associated values + * using the resulting value as the new value associated with the key. + * If a key only exists in one object, the value will be associated with the key + * of the resulting object. * * @func * @memberOf R - * @since v0.19.0 - * @category Relation - * @sig ((a, a) -> Boolean) -> [a] -> [a] -> [a] - * @param {Function} pred A predicate used to test whether two items are equal. - * @param {Array} list1 The first list. - * @param {Array} list2 The second list. - * @return {Array} The elements in `list1` or `list2`, but not both. - * @see R.symmetricDifference, R.difference, R.differenceWith + * @since v0.24.0 + * @category Object + * @sig ((String, a, a) -> a) -> {a} -> {a} -> {a} + * @param {Function} fn + * @param {Object} lObj + * @param {Object} rObj + * @return {Object} + * @see R.mergeWithKey, R.mergeDeepWith * @example * - * const eqA = R.eqBy(R.prop('a')); - * const l1 = [{a: 1}, {a: 2}, {a: 3}, {a: 4}]; - * const l2 = [{a: 3}, {a: 4}, {a: 5}, {a: 6}]; - * R.symmetricDifferenceWith(eqA, l1, l2); //=> [{a: 1}, {a: 2}, {a: 5}, {a: 6}] + * let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r + * R.mergeDeepWithKey(concatValues, + * { a: true, c: { thing: 'foo', values: [10, 20] }}, + * { b: true, c: { thing: 'bar', values: [15, 35] }}); + * //=> { a: true, b: true, c: { thing: 'bar', values: [10, 20, 15, 35] }} */ -var symmetricDifferenceWith = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function symmetricDifferenceWith(pred, list1, list2) { - return (0,_concat_js__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_differenceWith_js__WEBPACK_IMPORTED_MODULE_2__["default"])(pred, list1, list2), (0,_differenceWith_js__WEBPACK_IMPORTED_MODULE_2__["default"])(pred, list2, list1)); +var mergeDeepWithKey = /*#__PURE__*/ +(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function mergeDeepWithKey(fn, lObj, rObj) { + return (0,_mergeWithKey_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (k, lVal, rVal) { + if ((0,_internal_isObject_js__WEBPACK_IMPORTED_MODULE_2__["default"])(lVal) && (0,_internal_isObject_js__WEBPACK_IMPORTED_MODULE_2__["default"])(rVal)) { + return mergeDeepWithKey(fn, lVal, rVal); + } else { + return fn(k, lVal, rVal); + } + }, lObj, rObj); }); -/* harmony default export */ __webpack_exports__["default"] = (symmetricDifferenceWith); +/* harmony default export */ __webpack_exports__["default"] = (mergeDeepWithKey); /***/ }), -/***/ "./node_modules/ramda/es/tail.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/tail.js ***! - \***************************************/ +/***/ "./node_modules/ramda/es/mergeLeft.js": +/*!********************************************!*\ + !*** ./node_modules/ramda/es/mergeLeft.js ***! + \********************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_checkForMethod_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_checkForMethod.js */ "./node_modules/ramda/es/internal/_checkForMethod.js"); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _slice_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./slice.js */ "./node_modules/ramda/es/slice.js"); - +/* harmony import */ var _internal_objectAssign_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_objectAssign.js */ "./node_modules/ramda/es/internal/_objectAssign.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); /** - * Returns all but the first element of the given list or string (or object - * with a `tail` method). - * - * Dispatches to the `slice` method of the first argument, if present. + * Create a new object with the own properties of the first object merged with + * the own properties of the second object. If a key exists in both objects, + * the value from the first object will be used. * * @func * @memberOf R - * @since v0.1.0 - * @category List - * @sig [a] -> [a] - * @sig String -> String - * @param {*} list - * @return {*} - * @see R.head, R.init, R.last + * @since v0.26.0 + * @category Object + * @sig {k: v} -> {k: v} -> {k: v} + * @param {Object} l + * @param {Object} r + * @return {Object} + * @see R.mergeRight, R.mergeDeepLeft, R.mergeWith, R.mergeWithKey * @example * - * R.tail([1, 2, 3]); //=> [2, 3] - * R.tail([1, 2]); //=> [2] - * R.tail([1]); //=> [] - * R.tail([]); //=> [] + * R.mergeLeft({ 'age': 40 }, { 'name': 'fred', 'age': 10 }); + * //=> { 'name': 'fred', 'age': 40 } * - * R.tail('abc'); //=> 'bc' - * R.tail('ab'); //=> 'b' - * R.tail('a'); //=> '' - * R.tail(''); //=> '' + * const resetToDefault = R.mergeLeft({x: 0}); + * resetToDefault({x: 5, y: 2}); //=> {x: 0, y: 2} + * @symb R.mergeLeft(a, b) = {...b, ...a} */ -var tail = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__["default"])( /*#__PURE__*/ -(0,_internal_checkForMethod_js__WEBPACK_IMPORTED_MODULE_0__["default"])('tail', /*#__PURE__*/ -(0,_slice_js__WEBPACK_IMPORTED_MODULE_2__["default"])(1, Infinity))); -/* harmony default export */ __webpack_exports__["default"] = (tail); +var mergeLeft = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function mergeLeft(l, r) { + return (0,_internal_objectAssign_js__WEBPACK_IMPORTED_MODULE_1__["default"])({}, r, l); +}); +/* harmony default export */ __webpack_exports__["default"] = (mergeLeft); /***/ }), -/***/ "./node_modules/ramda/es/take.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/take.js ***! - \***************************************/ +/***/ "./node_modules/ramda/es/mergeRight.js": +/*!*********************************************!*\ + !*** ./node_modules/ramda/es/mergeRight.js ***! + \*********************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); +/* harmony import */ var _internal_objectAssign_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_objectAssign.js */ "./node_modules/ramda/es/internal/_objectAssign.js"); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_xtake_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xtake.js */ "./node_modules/ramda/es/internal/_xtake.js"); -/* harmony import */ var _slice_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./slice.js */ "./node_modules/ramda/es/slice.js"); - - /** - * Returns the first `n` elements of the given list, string, or - * transducer/transformer (or object with a `take` method). - * - * Dispatches to the `take` method of the second argument, if present. + * Create a new object with the own properties of the first object merged with + * the own properties of the second object. If a key exists in both objects, + * the value from the second object will be used. * * @func * @memberOf R - * @since v0.1.0 - * @category List - * @sig Number -> [a] -> [a] - * @sig Number -> String -> String - * @param {Number} n - * @param {*} list - * @return {*} - * @see R.drop + * @since v0.26.0 + * @category Object + * @sig {k: v} -> {k: v} -> {k: v} + * @param {Object} l + * @param {Object} r + * @return {Object} + * @see R.mergeLeft, R.mergeDeepRight, R.mergeWith, R.mergeWithKey * @example * - * R.take(1, ['foo', 'bar', 'baz']); //=> ['foo'] - * R.take(2, ['foo', 'bar', 'baz']); //=> ['foo', 'bar'] - * R.take(3, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] - * R.take(4, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] - * R.take(3, 'ramda'); //=> 'ram' - * - * const personnel = [ - * 'Dave Brubeck', - * 'Paul Desmond', - * 'Eugene Wright', - * 'Joe Morello', - * 'Gerry Mulligan', - * 'Bob Bates', - * 'Joe Dodge', - * 'Ron Crotty' - * ]; + * R.mergeRight({ 'name': 'fred', 'age': 10 }, { 'age': 40 }); + * //=> { 'name': 'fred', 'age': 40 } * - * const takeFive = R.take(5); - * takeFive(personnel); - * //=> ['Dave Brubeck', 'Paul Desmond', 'Eugene Wright', 'Joe Morello', 'Gerry Mulligan'] - * @symb R.take(-1, [a, b]) = [a, b] - * @symb R.take(0, [a, b]) = [] - * @symb R.take(1, [a, b]) = [a] - * @symb R.take(2, [a, b]) = [a, b] + * const withDefaults = R.mergeRight({x: 0, y: 0}); + * withDefaults({y: 2}); //=> {x: 0, y: 2} + * @symb R.mergeRight(a, b) = {...a, ...b} */ -var take = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])(['take'], _internal_xtake_js__WEBPACK_IMPORTED_MODULE_2__["default"], function take(n, xs) { - return (0,_slice_js__WEBPACK_IMPORTED_MODULE_3__["default"])(0, n < 0 ? Infinity : n, xs); -})); -/* harmony default export */ __webpack_exports__["default"] = (take); +var mergeRight = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function mergeRight(l, r) { + return (0,_internal_objectAssign_js__WEBPACK_IMPORTED_MODULE_1__["default"])({}, l, r); +}); +/* harmony default export */ __webpack_exports__["default"] = (mergeRight); /***/ }), -/***/ "./node_modules/ramda/es/takeLast.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/takeLast.js ***! - \*******************************************/ +/***/ "./node_modules/ramda/es/mergeWith.js": +/*!********************************************!*\ + !*** ./node_modules/ramda/es/mergeWith.js ***! + \********************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _drop_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./drop.js */ "./node_modules/ramda/es/drop.js"); +/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); +/* harmony import */ var _mergeWithKey_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mergeWithKey.js */ "./node_modules/ramda/es/mergeWithKey.js"); /** - * Returns a new list containing the last `n` elements of the given list. - * If `n > list.length`, returns a list of `list.length` elements. + * Creates a new object with the own properties of the two provided objects. If + * a key exists in both objects, the provided function is applied to the values + * associated with the key in each object, with the result being used as the + * value associated with the key in the returned object. * * @func * @memberOf R - * @since v0.16.0 - * @category List - * @sig Number -> [a] -> [a] - * @sig Number -> String -> String - * @param {Number} n The number of elements to return. - * @param {Array} xs The collection to consider. - * @return {Array} - * @see R.dropLast + * @since v0.19.0 + * @category Object + * @sig ((a, a) -> a) -> {a} -> {a} -> {a} + * @param {Function} fn + * @param {Object} l + * @param {Object} r + * @return {Object} + * @see R.mergeDeepWith, R.merge, R.mergeWithKey * @example * - * R.takeLast(1, ['foo', 'bar', 'baz']); //=> ['baz'] - * R.takeLast(2, ['foo', 'bar', 'baz']); //=> ['bar', 'baz'] - * R.takeLast(3, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] - * R.takeLast(4, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] - * R.takeLast(3, 'ramda'); //=> 'mda' + * R.mergeWith(R.concat, + * { a: true, values: [10, 20] }, + * { b: true, values: [15, 35] }); + * //=> { a: true, b: true, values: [10, 20, 15, 35] } */ -var takeLast = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function takeLast(n, xs) { - return (0,_drop_js__WEBPACK_IMPORTED_MODULE_1__["default"])(n >= 0 ? xs.length - n : 0, xs); +var mergeWith = /*#__PURE__*/ +(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function mergeWith(fn, l, r) { + return (0,_mergeWithKey_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function (_, _l, _r) { + return fn(_l, _r); + }, l, r); }); -/* harmony default export */ __webpack_exports__["default"] = (takeLast); +/* harmony default export */ __webpack_exports__["default"] = (mergeWith); /***/ }), -/***/ "./node_modules/ramda/es/takeLastWhile.js": -/*!************************************************!*\ - !*** ./node_modules/ramda/es/takeLastWhile.js ***! - \************************************************/ +/***/ "./node_modules/ramda/es/mergeWithKey.js": +/*!***********************************************!*\ + !*** ./node_modules/ramda/es/mergeWithKey.js ***! + \***********************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _slice_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./slice.js */ "./node_modules/ramda/es/slice.js"); +/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); +/* harmony import */ var _internal_has_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_has.js */ "./node_modules/ramda/es/internal/_has.js"); /** - * Returns a new list containing the last `n` elements of a given list, passing - * each value to the supplied predicate function, and terminating when the - * predicate function returns `false`. Excludes the element that caused the - * predicate function to fail. The predicate function is passed one argument: - * *(value)*. + * Creates a new object with the own properties of the two provided objects. If + * a key exists in both objects, the provided function is applied to the key + * and the values associated with the key in each object, with the result being + * used as the value associated with the key in the returned object. * * @func * @memberOf R - * @since v0.16.0 - * @category List - * @sig (a -> Boolean) -> [a] -> [a] - * @sig (a -> Boolean) -> String -> String - * @param {Function} fn The function called per iteration. - * @param {Array} xs The collection to iterate over. - * @return {Array} A new array. - * @see R.dropLastWhile, R.addIndex + * @since v0.19.0 + * @category Object + * @sig ((String, a, a) -> a) -> {a} -> {a} -> {a} + * @param {Function} fn + * @param {Object} l + * @param {Object} r + * @return {Object} + * @see R.mergeDeepWithKey, R.merge, R.mergeWith * @example * - * const isNotOne = x => x !== 1; - * - * R.takeLastWhile(isNotOne, [1, 2, 3, 4]); //=> [2, 3, 4] - * - * R.takeLastWhile(x => x !== 'R' , 'Ramda'); //=> 'amda' + * let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r + * R.mergeWithKey(concatValues, + * { a: true, thing: 'foo', values: [10, 20] }, + * { b: true, thing: 'bar', values: [15, 35] }); + * //=> { a: true, b: true, thing: 'bar', values: [10, 20, 15, 35] } + * @symb R.mergeWithKey(f, { x: 1, y: 2 }, { y: 5, z: 3 }) = { x: 1, y: f('y', 2, 5), z: 3 } */ -var takeLastWhile = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function takeLastWhile(fn, xs) { - var idx = xs.length - 1; - while (idx >= 0 && fn(xs[idx])) { - idx -= 1; +var mergeWithKey = /*#__PURE__*/ +(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function mergeWithKey(fn, l, r) { + var result = {}; + var k; + l = l || {}; + r = r || {}; + for (k in l) { + if ((0,_internal_has_js__WEBPACK_IMPORTED_MODULE_1__["default"])(k, l)) { + result[k] = (0,_internal_has_js__WEBPACK_IMPORTED_MODULE_1__["default"])(k, r) ? fn(k, l[k], r[k]) : l[k]; + } + } + for (k in r) { + if ((0,_internal_has_js__WEBPACK_IMPORTED_MODULE_1__["default"])(k, r) && !(0,_internal_has_js__WEBPACK_IMPORTED_MODULE_1__["default"])(k, result)) { + result[k] = r[k]; + } } - return (0,_slice_js__WEBPACK_IMPORTED_MODULE_1__["default"])(idx + 1, Infinity, xs); + return result; }); -/* harmony default export */ __webpack_exports__["default"] = (takeLastWhile); +/* harmony default export */ __webpack_exports__["default"] = (mergeWithKey); /***/ }), -/***/ "./node_modules/ramda/es/takeWhile.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/takeWhile.js ***! - \********************************************/ +/***/ "./node_modules/ramda/es/nth.js": +/*!**************************************!*\ + !*** ./node_modules/ramda/es/nth.js ***! + \**************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_xtakeWhile_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xtakeWhile.js */ "./node_modules/ramda/es/internal/_xtakeWhile.js"); -/* harmony import */ var _slice_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./slice.js */ "./node_modules/ramda/es/slice.js"); - - +/* harmony import */ var _internal_isString_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isString.js */ "./node_modules/ramda/es/internal/_isString.js"); /** - * Returns a new list containing the first `n` elements of a given list, - * passing each value to the supplied predicate function, and terminating when - * the predicate function returns `false`. Excludes the element that caused the - * predicate function to fail. The predicate function is passed one argument: - * *(value)*. - * - * Dispatches to the `takeWhile` method of the second argument, if present. - * - * Acts as a transducer if a transformer is given in list position. + * Returns the nth element of the given list or string. If n is negative the + * element at index length + n is returned. * * @func * @memberOf R * @since v0.1.0 * @category List - * @sig (a -> Boolean) -> [a] -> [a] - * @sig (a -> Boolean) -> String -> String - * @param {Function} fn The function called per iteration. - * @param {Array} xs The collection to iterate over. - * @return {Array} A new array. - * @see R.dropWhile, R.transduce, R.addIndex + * @sig Number -> [a] -> a | Undefined + * @sig Number -> String -> String + * @param {Number} offset + * @param {*} list + * @return {*} * @example * - * const isNotFour = x => x !== 4; - * - * R.takeWhile(isNotFour, [1, 2, 3, 4, 3, 2, 1]); //=> [1, 2, 3] + * const list = ['foo', 'bar', 'baz', 'quux']; + * R.nth(1, list); //=> 'bar' + * R.nth(-1, list); //=> 'quux' + * R.nth(-99, list); //=> undefined * - * R.takeWhile(x => x !== 'd' , 'Ramda'); //=> 'Ram' + * R.nth(2, 'abc'); //=> 'c' + * R.nth(3, 'abc'); //=> '' + * @symb R.nth(-1, [a, b, c]) = c + * @symb R.nth(0, [a, b, c]) = a + * @symb R.nth(1, [a, b, c]) = b */ -var takeWhile = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])(['takeWhile'], _internal_xtakeWhile_js__WEBPACK_IMPORTED_MODULE_2__["default"], function takeWhile(fn, xs) { - var idx = 0; - var len = xs.length; - while (idx < len && fn(xs[idx])) { - idx += 1; - } - return (0,_slice_js__WEBPACK_IMPORTED_MODULE_3__["default"])(0, idx, xs); -})); -/* harmony default export */ __webpack_exports__["default"] = (takeWhile); +var nth = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function nth(offset, list) { + var idx = offset < 0 ? list.length + offset : offset; + return (0,_internal_isString_js__WEBPACK_IMPORTED_MODULE_1__["default"])(list) ? list.charAt(idx) : list[idx]; +}); +/* harmony default export */ __webpack_exports__["default"] = (nth); /***/ }), -/***/ "./node_modules/ramda/es/tap.js": -/*!**************************************!*\ - !*** ./node_modules/ramda/es/tap.js ***! - \**************************************/ +/***/ "./node_modules/ramda/es/omit.js": +/*!***************************************!*\ + !*** ./node_modules/ramda/es/omit.js ***! + \***************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_xtap_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xtap.js */ "./node_modules/ramda/es/internal/_xtap.js"); - - /** - * Runs the given function with the supplied object, then returns the object. - * - * Acts as a transducer if a transformer is given as second parameter. + * Returns a partial copy of an object omitting the keys specified. * * @func * @memberOf R * @since v0.1.0 - * @category Function - * @sig (a -> *) -> a -> a - * @param {Function} fn The function to call with `x`. The return value of `fn` will be thrown away. - * @param {*} x - * @return {*} `x`. + * @category Object + * @sig [String] -> {String: *} -> {String: *} + * @param {Array} names an array of String property names to omit from the new object + * @param {Object} obj The object to copy from + * @return {Object} A new object with properties from `names` not on it. + * @see R.pick * @example * - * const sayX = x => console.log('x is ' + x); - * R.tap(sayX, 100); //=> 100 - * // logs 'x is 100' - * @symb R.tap(f, a) = (f(a), a) + * R.omit(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, c: 3} */ -var tap = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])([], _internal_xtap_js__WEBPACK_IMPORTED_MODULE_2__["default"], function tap(fn, x) { - fn(x); - return x; -})); -/* harmony default export */ __webpack_exports__["default"] = (tap); +var omit = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function omit(names, obj) { + var result = {}; + var index = {}; + var idx = 0; + var len = names.length; + while (idx < len) { + index[names[idx]] = 1; + idx += 1; + } + for (var prop in obj) { + if (!index.hasOwnProperty(prop)) { + result[prop] = obj[prop]; + } + } + return result; +}); +/* harmony default export */ __webpack_exports__["default"] = (omit); /***/ }), -/***/ "./node_modules/ramda/es/test.js": +/***/ "./node_modules/ramda/es/once.js": /*!***************************************!*\ - !*** ./node_modules/ramda/es/test.js ***! + !*** ./node_modules/ramda/es/once.js ***! \***************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_cloneRegExp_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_cloneRegExp.js */ "./node_modules/ramda/es/internal/_cloneRegExp.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_isRegExp_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_isRegExp.js */ "./node_modules/ramda/es/internal/_isRegExp.js"); -/* harmony import */ var _toString_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./toString.js */ "./node_modules/ramda/es/toString.js"); - - +/* harmony import */ var _internal_arity_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_arity.js */ "./node_modules/ramda/es/internal/_arity.js"); +/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); /** - * Determines whether a given string matches a given regular expression. + * Accepts a function `fn` and returns a function that guards invocation of + * `fn` such that `fn` can only ever be called once, no matter how many times + * the returned function is invoked. The first value calculated is returned in + * subsequent invocations. * * @func * @memberOf R - * @since v0.12.0 - * @category String - * @sig RegExp -> String -> Boolean - * @param {RegExp} pattern - * @param {String} str - * @return {Boolean} - * @see R.match + * @since v0.1.0 + * @category Function + * @sig (a... -> b) -> (a... -> b) + * @param {Function} fn The function to wrap in a call-only-once wrapper. + * @return {Function} The wrapped function. * @example * - * R.test(/^x/, 'xyz'); //=> true - * R.test(/^y/, 'xyz'); //=> false + * const addOneOnce = R.once(x => x + 1); + * addOneOnce(10); //=> 11 + * addOneOnce(addOneOnce(50)); //=> 11 */ -var test = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function test(pattern, str) { - if (!(0,_internal_isRegExp_js__WEBPACK_IMPORTED_MODULE_2__["default"])(pattern)) { - throw new TypeError('‘test’ requires a value of type RegExp as its first argument; received ' + (0,_toString_js__WEBPACK_IMPORTED_MODULE_3__["default"])(pattern)); - } - return (0,_internal_cloneRegExp_js__WEBPACK_IMPORTED_MODULE_0__["default"])(pattern).test(str); +var once = /*#__PURE__*/ +(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function once(fn) { + var called = false; + var result; + return (0,_internal_arity_js__WEBPACK_IMPORTED_MODULE_1__["default"])(fn.length, function () { + if (called) { + return result; + } + called = true; + result = fn.apply(this, arguments); + return result; + }); }); -/* harmony default export */ __webpack_exports__["default"] = (test); +/* harmony default export */ __webpack_exports__["default"] = (once); /***/ }), -/***/ "./node_modules/ramda/es/thunkify.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/thunkify.js ***! - \*******************************************/ +/***/ "./node_modules/ramda/es/over.js": +/*!***************************************!*\ + !*** ./node_modules/ramda/es/over.js ***! + \***************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curryN.js */ "./node_modules/ramda/es/curryN.js"); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); - +/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); + // `Identity` is a functor that holds a single value, where `map` simply +// transforms the held value with the provided function. +var Identity = function Identity(x) { + return { + value: x, + map: function map(f) { + return Identity(f(x)); + } + }; +}; /** - * Creates a thunk out of a function. A thunk delays a calculation until - * its result is needed, providing lazy evaluation of arguments. + * Returns the result of "setting" the portion of the given data structure + * focused by the given lens to the result of applying the given function to + * the focused value. * * @func * @memberOf R - * @since v0.26.0 - * @category Function - * @sig ((a, b, ..., j) -> k) -> (a, b, ..., j) -> (() -> k) - * @param {Function} fn A function to wrap in a thunk - * @return {Function} Expects arguments for `fn` and returns a new function - * that, when called, applies those arguments to `fn`. - * @see R.partial, R.partialRight + * @since v0.16.0 + * @category Object + * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s + * @sig Lens s a -> (a -> a) -> s -> s + * @param {Lens} lens + * @param {*} v + * @param {*} x + * @return {*} + * @see R.view, R.set, R.lens, R.lensIndex, R.lensProp, R.lensPath * @example * - * R.thunkify(R.identity)(42)(); //=> 42 - * R.thunkify((a, b) => a + b)(25, 17)(); //=> 42 + * const headLens = R.lensIndex(0); + * + * R.over(headLens, R.toUpper, ['foo', 'bar', 'baz']); //=> ['FOO', 'bar', 'baz'] */ -var thunkify = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function thunkify(fn) { - return (0,_curryN_js__WEBPACK_IMPORTED_MODULE_0__["default"])(fn.length, function createThunk() { - var fnArgs = arguments; - return function invokeThunk() { - return fn.apply(this, fnArgs); - }; - }); +var over = /*#__PURE__*/ +(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function over(lens, f, x) { + // The value returned by the getter function is first transformed with `f`, + // then set as the value of an `Identity`. This is then mapped over with the + // setter function of the lens. + return lens(function (y) { + return Identity(f(y)); + })(x).value; }); -/* harmony default export */ __webpack_exports__["default"] = (thunkify); +/* harmony default export */ __webpack_exports__["default"] = (over); /***/ }), -/***/ "./node_modules/ramda/es/times.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/times.js ***! - \****************************************/ +/***/ "./node_modules/ramda/es/partition.js": +/*!********************************************!*\ + !*** ./node_modules/ramda/es/partition.js ***! + \********************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _filter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./filter.js */ "./node_modules/ramda/es/filter.js"); +/* harmony import */ var _juxt_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./juxt.js */ "./node_modules/ramda/es/juxt.js"); +/* harmony import */ var _reject_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./reject.js */ "./node_modules/ramda/es/reject.js"); + + /** - * Calls an input function `n` times, returning an array containing the results - * of those function calls. - * - * `fn` is passed one argument: The current value of `n`, which begins at `0` - * and is gradually incremented to `n - 1`. + * Takes a predicate and a list or other `Filterable` object and returns the + * pair of filterable objects of the same type of elements which do and do not + * satisfy, the predicate, respectively. Filterable objects include plain objects or any object + * that has a filter method such as `Array`. * * @func * @memberOf R - * @since v0.2.3 + * @since v0.1.4 * @category List - * @sig (Number -> a) -> Number -> [a] - * @param {Function} fn The function to invoke. Passed one argument, the current value of `n`. - * @param {Number} n A value between `0` and `n - 1`. Increments after each function call. - * @return {Array} An array containing the return values of all calls to `fn`. - * @see R.repeat + * @sig Filterable f => (a -> Boolean) -> f a -> [f a, f a] + * @param {Function} pred A predicate to determine which side the element belongs to. + * @param {Array} filterable the list (or other filterable) to partition. + * @return {Array} An array, containing first the subset of elements that satisfy the + * predicate, and second the subset of elements that do not satisfy. + * @see R.filter, R.reject * @example * - * R.times(R.identity, 5); //=> [0, 1, 2, 3, 4] - * @symb R.times(f, 0) = [] - * @symb R.times(f, 1) = [f(0)] - * @symb R.times(f, 2) = [f(0), f(1)] + * R.partition(R.includes('s'), ['sss', 'ttt', 'foo', 'bars']); + * // => [ [ 'sss', 'bars' ], [ 'ttt', 'foo' ] ] + * + * R.partition(R.includes('s'), { a: 'sss', b: 'ttt', foo: 'bars' }); + * // => [ { a: 'sss', foo: 'bars' }, { b: 'ttt' } ] */ -var times = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function times(fn, n) { - var len = Number(n); - var idx = 0; - var list; - if (len < 0 || isNaN(len)) { - throw new RangeError('n must be a non-negative number'); - } - list = []; - while (idx < len) { - list.push(fn(idx)); - idx += 1; - } - return list; -}); -/* harmony default export */ __webpack_exports__["default"] = (times); +var partition = /*#__PURE__*/ +(0,_juxt_js__WEBPACK_IMPORTED_MODULE_0__["default"])([_filter_js__WEBPACK_IMPORTED_MODULE_1__["default"], _reject_js__WEBPACK_IMPORTED_MODULE_2__["default"]]); +/* harmony default export */ __webpack_exports__["default"] = (partition); /***/ }), -/***/ "./node_modules/ramda/es/toLower.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/toLower.js ***! - \******************************************/ +/***/ "./node_modules/ramda/es/path.js": +/*!***************************************!*\ + !*** ./node_modules/ramda/es/path.js ***! + \***************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _invoker_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./invoker.js */ "./node_modules/ramda/es/invoker.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _paths_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./paths.js */ "./node_modules/ramda/es/paths.js"); + /** - * The lower case version of a string. + * Retrieves the value at a given path. The nodes of the path can be arbitrary strings or non-negative integers. + * For anything else, the value is unspecified. Integer paths are meant to index arrays, strings are meant for objects. * * @func * @memberOf R - * @since v0.9.0 - * @category String - * @sig String -> String - * @param {String} str The string to lower case. - * @return {String} The lower case version of `str`. - * @see R.toUpper + * @since v0.2.0 + * @category Object + * @typedefn Idx = String | Int | Symbol + * @sig [Idx] -> {a} -> a | Undefined + * @sig Idx = String | NonNegativeInt + * @param {Array} path The path to use. + * @param {Object} obj The object or array to retrieve the nested property from. + * @return {*} The data at `path`. + * @see R.prop, R.nth, R.assocPath, R.dissocPath * @example * - * R.toLower('XYZ'); //=> 'xyz' + * R.path(['a', 'b'], {a: {b: 2}}); //=> 2 + * R.path(['a', 'b'], {c: {b: 2}}); //=> undefined + * R.path(['a', 'b', 0], {a: {b: [1, 2, 3]}}); //=> 1 + * R.path(['a', 'b', -2], {a: {b: [1, 2, 3]}}); //=> 2 + * R.path([2], {'2': 2}); //=> 2 + * R.path([-2], {'-2': 'a'}); //=> undefined */ -var toLower = /*#__PURE__*/ -(0,_invoker_js__WEBPACK_IMPORTED_MODULE_0__["default"])(0, 'toLowerCase'); -/* harmony default export */ __webpack_exports__["default"] = (toLower); +var path = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function path(pathAr, obj) { + return (0,_paths_js__WEBPACK_IMPORTED_MODULE_1__["default"])([pathAr], obj)[0]; +}); +/* harmony default export */ __webpack_exports__["default"] = (path); /***/ }), -/***/ "./node_modules/ramda/es/toPairs.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/toPairs.js ***! - \******************************************/ +/***/ "./node_modules/ramda/es/pathOr.js": +/*!*****************************************!*\ + !*** ./node_modules/ramda/es/pathOr.js ***! + \*****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _internal_has_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_has.js */ "./node_modules/ramda/es/internal/_has.js"); +/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); +/* harmony import */ var _defaultTo_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./defaultTo.js */ "./node_modules/ramda/es/defaultTo.js"); +/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./path.js */ "./node_modules/ramda/es/path.js"); + /** - * Converts an object into an array of key, value arrays. Only the object's - * own properties are used. - * Note that the order of the output array is not guaranteed to be consistent - * across different JS platforms. + * If the given, non-null object has a value at the given path, returns the + * value at that path. Otherwise returns the provided default value. * * @func * @memberOf R - * @since v0.4.0 + * @since v0.18.0 * @category Object - * @sig {String: *} -> [[String,*]] - * @param {Object} obj The object to extract from - * @return {Array} An array of key, value arrays from the object's own properties. - * @see R.fromPairs, R.keys, R.values + * @typedefn Idx = String | Int | Symbol + * @sig a -> [Idx] -> {a} -> a + * @param {*} d The default value. + * @param {Array} p The path to use. + * @param {Object} obj The object to retrieve the nested property from. + * @return {*} The data at `path` of the supplied object or the default value. * @example * - * R.toPairs({a: 1, b: 2, c: 3}); //=> [['a', 1], ['b', 2], ['c', 3]] + * R.pathOr('N/A', ['a', 'b'], {a: {b: 2}}); //=> 2 + * R.pathOr('N/A', ['a', 'b'], {c: {b: 2}}); //=> "N/A" */ -var toPairs = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function toPairs(obj) { - var pairs = []; - for (var prop in obj) { - if ((0,_internal_has_js__WEBPACK_IMPORTED_MODULE_1__["default"])(prop, obj)) { - pairs[pairs.length] = [prop, obj[prop]]; - } - } - return pairs; +var pathOr = /*#__PURE__*/ +(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function pathOr(d, p, obj) { + return (0,_defaultTo_js__WEBPACK_IMPORTED_MODULE_1__["default"])(d, (0,_path_js__WEBPACK_IMPORTED_MODULE_2__["default"])(p, obj)); }); -/* harmony default export */ __webpack_exports__["default"] = (toPairs); +/* harmony default export */ __webpack_exports__["default"] = (pathOr); /***/ }), -/***/ "./node_modules/ramda/es/toPairsIn.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/toPairsIn.js ***! - \********************************************/ +/***/ "./node_modules/ramda/es/paths.js": +/*!****************************************!*\ + !*** ./node_modules/ramda/es/paths.js ***! + \****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_isInteger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isInteger.js */ "./node_modules/ramda/es/internal/_isInteger.js"); +/* harmony import */ var _nth_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./nth.js */ "./node_modules/ramda/es/nth.js"); + + /** - * Converts an object into an array of key, value arrays. The object's own - * properties and prototype properties are used. Note that the order of the - * output array is not guaranteed to be consistent across different JS - * platforms. + * Retrieves the values at given paths of an object. * * @func * @memberOf R - * @since v0.4.0 + * @since v0.27.1 * @category Object - * @sig {String: *} -> [[String,*]] - * @param {Object} obj The object to extract from - * @return {Array} An array of key, value arrays from the object's own - * and prototype properties. + * @typedefn Idx = [String | Int | Symbol] + * @sig [Idx] -> {a} -> [a | Undefined] + * @param {Array} pathsArray The array of paths to be fetched. + * @param {Object} obj The object to retrieve the nested properties from. + * @return {Array} A list consisting of values at paths specified by "pathsArray". + * @see R.path * @example * - * const F = function() { this.x = 'X'; }; - * F.prototype.y = 'Y'; - * const f = new F(); - * R.toPairsIn(f); //=> [['x','X'], ['y','Y']] + * R.paths([['a', 'b'], ['p', 0, 'q']], {a: {b: 2}, p: [{q: 3}]}); //=> [2, 3] + * R.paths([['a', 'b'], ['p', 'r']], {a: {b: 2}, p: [{q: 3}]}); //=> [2, undefined] */ -var toPairsIn = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function toPairsIn(obj) { - var pairs = []; - for (var prop in obj) { - pairs[pairs.length] = [prop, obj[prop]]; - } - return pairs; +var paths = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function paths(pathsArray, obj) { + return pathsArray.map(function (paths) { + var val = obj; + var idx = 0; + var p; + while (idx < paths.length) { + if (val == null) { + return; + } + p = paths[idx]; + val = (0,_internal_isInteger_js__WEBPACK_IMPORTED_MODULE_1__["default"])(p) ? (0,_nth_js__WEBPACK_IMPORTED_MODULE_2__["default"])(p, val) : val[p]; + idx += 1; + } + return val; + }); }); -/* harmony default export */ __webpack_exports__["default"] = (toPairsIn); +/* harmony default export */ __webpack_exports__["default"] = (paths); /***/ }), -/***/ "./node_modules/ramda/es/toString.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/toString.js ***! - \*******************************************/ +/***/ "./node_modules/ramda/es/pick.js": +/*!***************************************!*\ + !*** ./node_modules/ramda/es/pick.js ***! + \***************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _internal_toString_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_toString.js */ "./node_modules/ramda/es/internal/_toString.js"); - +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); /** - * Returns the string representation of the given value. `eval`'ing the output - * should result in a value equivalent to the input value. Many of the built-in - * `toString` methods do not satisfy this requirement. - * - * If the given value is an `[object Object]` with a `toString` method other - * than `Object.prototype.toString`, this method is invoked with no arguments - * to produce the return value. This means user-defined constructor functions - * can provide a suitable `toString` method. For example: - * - * function Point(x, y) { - * this.x = x; - * this.y = y; - * } - * - * Point.prototype.toString = function() { - * return 'new Point(' + this.x + ', ' + this.y + ')'; - * }; - * - * R.toString(new Point(1, 2)); //=> 'new Point(1, 2)' + * Returns a partial copy of an object containing only the keys specified. If + * the key does not exist, the property is ignored. * * @func * @memberOf R - * @since v0.14.0 - * @category String - * @sig * -> String - * @param {*} val - * @return {String} + * @since v0.1.0 + * @category Object + * @sig [k] -> {k: v} -> {k: v} + * @param {Array} names an array of String property names to copy onto a new object + * @param {Object} obj The object to copy from + * @return {Object} A new object with only properties from `names` on it. + * @see R.omit, R.props * @example * - * R.toString(42); //=> '42' - * R.toString('abc'); //=> '"abc"' - * R.toString([1, 2, 3]); //=> '[1, 2, 3]' - * R.toString({foo: 1, bar: 2, baz: 3}); //=> '{"bar": 2, "baz": 3, "foo": 1}' - * R.toString(new Date('2001-02-03T04:05:06Z')); //=> 'new Date("2001-02-03T04:05:06.000Z")' + * R.pick(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, d: 4} + * R.pick(['a', 'e', 'f'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1} */ -var toString = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function toString(val) { - return (0,_internal_toString_js__WEBPACK_IMPORTED_MODULE_1__["default"])(val, []); +var pick = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function pick(names, obj) { + var result = {}; + var idx = 0; + while (idx < names.length) { + if (names[idx] in obj) { + result[names[idx]] = obj[names[idx]]; + } + idx += 1; + } + return result; }); -/* harmony default export */ __webpack_exports__["default"] = (toString); +/* harmony default export */ __webpack_exports__["default"] = (pick); /***/ }), -/***/ "./node_modules/ramda/es/toUpper.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/toUpper.js ***! - \******************************************/ +/***/ "./node_modules/ramda/es/pickBy.js": +/*!*****************************************!*\ + !*** ./node_modules/ramda/es/pickBy.js ***! + \*****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _invoker_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./invoker.js */ "./node_modules/ramda/es/invoker.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); /** - * The upper case version of a string. + * Returns a partial copy of an object containing only the keys that satisfy + * the supplied predicate. * * @func * @memberOf R - * @since v0.9.0 - * @category String - * @sig String -> String - * @param {String} str The string to upper case. - * @return {String} The upper case version of `str`. - * @see R.toLower + * @since v0.8.0 + * @category Object + * @sig ((v, k) -> Boolean) -> {k: v} -> {k: v} + * @param {Function} pred A predicate to determine whether or not a key + * should be included on the output object. + * @param {Object} obj The object to copy from + * @return {Object} A new object with only properties that satisfy `pred` + * on it. + * @see R.pick, R.filter * @example * - * R.toUpper('abc'); //=> 'ABC' + * const isUpperCase = (val, key) => key.toUpperCase() === key; + * R.pickBy(isUpperCase, {a: 1, b: 2, A: 3, B: 4}); //=> {A: 3, B: 4} */ -var toUpper = /*#__PURE__*/ -(0,_invoker_js__WEBPACK_IMPORTED_MODULE_0__["default"])(0, 'toUpperCase'); -/* harmony default export */ __webpack_exports__["default"] = (toUpper); +var pickBy = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function pickBy(test, obj) { + var result = {}; + for (var prop in obj) { + if (test(obj[prop], prop, obj)) { + result[prop] = obj[prop]; + } + } + return result; +}); +/* harmony default export */ __webpack_exports__["default"] = (pickBy); /***/ }), -/***/ "./node_modules/ramda/es/transduce.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/transduce.js ***! - \********************************************/ +/***/ "./node_modules/ramda/es/pluck.js": +/*!****************************************!*\ + !*** ./node_modules/ramda/es/pluck.js ***! + \****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_xReduce_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_xReduce.js */ "./node_modules/ramda/es/internal/_xReduce.js"); -/* harmony import */ var _internal_xwrap_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_xwrap.js */ "./node_modules/ramda/es/internal/_xwrap.js"); -/* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./curryN.js */ "./node_modules/ramda/es/curryN.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./map.js */ "./node_modules/ramda/es/map.js"); +/* harmony import */ var _prop_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./prop.js */ "./node_modules/ramda/es/prop.js"); /** - * Initializes a transducer using supplied iterator function. Returns a single - * item by iterating through the list, successively calling the transformed - * iterator function and passing it an accumulator value and the current value - * from the array, and then passing the result to the next call. - * - * The iterator function receives two values: *(acc, value)*. It will be - * wrapped as a transformer to initialize the transducer. A transformer can be - * passed directly in place of an iterator function. In both cases, iteration - * may be stopped early with the [`R.reduced`](#reduced) function. - * - * A transducer is a function that accepts a transformer and returns a - * transformer and can be composed directly. - * - * A transformer is an object that provides a 2-arity reducing iterator - * function, step, 0-arity initial value function, init, and 1-arity result - * extraction function, result. The step function is used as the iterator - * function in reduce. The result function is used to convert the final - * accumulator into the return type and in most cases is - * [`R.identity`](#identity). The init function can be used to provide an - * initial accumulator, but is ignored by transduce. + * Returns a new list by plucking the same named property off all objects in + * the list supplied. * - * The iteration is performed with [`R.reduce`](#reduce) after initializing the transducer. + * `pluck` will work on + * any [functor](https://github.com/fantasyland/fantasy-land#functor) in + * addition to arrays, as it is equivalent to `R.map(R.prop(k), f)`. * * @func * @memberOf R - * @since v0.12.0 + * @since v0.1.0 * @category List - * @sig (c -> c) -> ((a, b) -> a) -> a -> [b] -> a - * @param {Function} xf The transducer function. Receives a transformer and returns a transformer. - * @param {Function} fn The iterator function. Receives two values, the accumulator and the - * current element from the array. Wrapped as transformer, if necessary, and used to - * initialize the transducer - * @param {*} acc The initial accumulator value. - * @param {Array} list The list to iterate over. - * @return {*} The final, accumulated value. - * @see R.reduce, R.reduced, R.into + * @sig Functor f => k -> f {k: v} -> f v + * @param {Number|String} key The key name to pluck off of each object. + * @param {Array} f The array or functor to consider. + * @return {Array} The list of values for the given key. + * @see R.project, R.prop, R.props * @example * - * const numbers = [1, 2, 3, 4]; - * const transducer = R.compose(R.map(R.add(1)), R.take(2)); - * R.transduce(transducer, R.flip(R.append), [], numbers); //=> [2, 3] + * var getAges = R.pluck('age'); + * getAges([{name: 'fred', age: 29}, {name: 'wilma', age: 27}]); //=> [29, 27] * - * const isOdd = (x) => x % 2 !== 0; - * const firstOddTransducer = R.compose(R.filter(isOdd), R.take(1)); - * R.transduce(firstOddTransducer, R.flip(R.append), [], R.range(0, 100)); //=> [1] + * R.pluck(0, [[1, 2], [3, 4]]); //=> [1, 3] + * R.pluck('val', {a: {val: 3}, b: {val: 5}}); //=> {a: 3, b: 5} + * @symb R.pluck('x', [{x: 1, y: 2}, {x: 3, y: 4}, {x: 5, y: 6}]) = [1, 3, 5] + * @symb R.pluck(0, [[1, 2], [3, 4], [5, 6]]) = [1, 3, 5] */ -var transduce = /*#__PURE__*/ -(0,_curryN_js__WEBPACK_IMPORTED_MODULE_2__["default"])(4, function transduce(xf, fn, acc, list) { - return (0,_internal_xReduce_js__WEBPACK_IMPORTED_MODULE_0__["default"])(xf(typeof fn === 'function' ? (0,_internal_xwrap_js__WEBPACK_IMPORTED_MODULE_1__["default"])(fn) : fn), acc, list); +var pluck = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function pluck(p, list) { + return (0,_map_js__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_prop_js__WEBPACK_IMPORTED_MODULE_2__["default"])(p), list); }); -/* harmony default export */ __webpack_exports__["default"] = (transduce); +/* harmony default export */ __webpack_exports__["default"] = (pluck); /***/ }), -/***/ "./node_modules/ramda/es/transpose.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/transpose.js ***! - \********************************************/ +/***/ "./node_modules/ramda/es/prepend.js": +/*!******************************************!*\ + !*** ./node_modules/ramda/es/prepend.js ***! + \******************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +/* harmony import */ var _internal_concat_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_concat.js */ "./node_modules/ramda/es/internal/_concat.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); + /** - * Transposes the rows and columns of a 2D list. - * When passed a list of `n` lists of length `x`, - * returns a list of `x` lists of length `n`. - * + * Returns a new list with the given element at the front, followed by the + * contents of the list. * * @func * @memberOf R - * @since v0.19.0 + * @since v0.1.0 * @category List - * @sig [[a]] -> [[a]] - * @param {Array} list A 2D list - * @return {Array} A 2D list + * @sig a -> [a] -> [a] + * @param {*} el The item to add to the head of the output list. + * @param {Array} list The array to add to the tail of the output list. + * @return {Array} A new array. + * @see R.append * @example * - * R.transpose([[1, 'a'], [2, 'b'], [3, 'c']]) //=> [[1, 2, 3], ['a', 'b', 'c']] - * R.transpose([[1, 2, 3], ['a', 'b', 'c']]) //=> [[1, 'a'], [2, 'b'], [3, 'c']] - * - * // If some of the rows are shorter than the following rows, their elements are skipped: - * R.transpose([[10, 11], [20], [], [30, 31, 32]]) //=> [[10, 20, 30], [11, 31], [32]] - * @symb R.transpose([[a], [b], [c]]) = [a, b, c] - * @symb R.transpose([[a, b], [c, d]]) = [[a, c], [b, d]] - * @symb R.transpose([[a, b], [c]]) = [[a, c], [b]] + * R.prepend('fee', ['fi', 'fo', 'fum']); //=> ['fee', 'fi', 'fo', 'fum'] */ -var transpose = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function transpose(outerlist) { - var i = 0; - var result = []; - while (i < outerlist.length) { - var innerlist = outerlist[i]; - var j = 0; - while (j < innerlist.length) { - if (typeof result[j] === 'undefined') { - result[j] = []; - } - result[j].push(innerlist[j]); - j += 1; - } - i += 1; - } - return result; +var prepend = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function prepend(el, list) { + return (0,_internal_concat_js__WEBPACK_IMPORTED_MODULE_1__["default"])([el], list); }); -/* harmony default export */ __webpack_exports__["default"] = (transpose); +/* harmony default export */ __webpack_exports__["default"] = (prepend); /***/ }), -/***/ "./node_modules/ramda/es/traverse.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/traverse.js ***! - \*******************************************/ +/***/ "./node_modules/ramda/es/prop.js": +/*!***************************************!*\ + !*** ./node_modules/ramda/es/prop.js ***! + \***************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./map.js */ "./node_modules/ramda/es/map.js"); -/* harmony import */ var _sequence_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sequence.js */ "./node_modules/ramda/es/sequence.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_isInteger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isInteger.js */ "./node_modules/ramda/es/internal/_isInteger.js"); +/* harmony import */ var _nth_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./nth.js */ "./node_modules/ramda/es/nth.js"); /** - * Maps an [Applicative](https://github.com/fantasyland/fantasy-land#applicative)-returning - * function over a [Traversable](https://github.com/fantasyland/fantasy-land#traversable), - * then uses [`sequence`](#sequence) to transform the resulting Traversable of Applicative - * into an Applicative of Traversable. - * - * Dispatches to the `traverse` method of the third argument, if present. + * Returns a function that when supplied an object returns the indicated + * property of that object, if it exists. * * @func * @memberOf R - * @since v0.19.0 - * @category List - * @sig fantasy-land/of :: TypeRep f => f ~> a -> f a - * @sig (Applicative f, Traversable t) => TypeRep f -> (a -> f b) -> t a -> f (t b) - * @sig (Applicative f, Traversable t) => (b -> f b) -> (a -> f b) -> t a -> f (t b) - * @param {Object|Function} TypeRepresentative with an `of` or `fantasy-land/of` method - * @param {Function} f - * @param {*} traversable - * @return {*} - * @see R.sequence + * @since v0.1.0 + * @category Object + * @typedefn Idx = String | Int | Symbol + * @sig Idx -> {s: a} -> a | Undefined + * @param {String|Number} p The property name or array index + * @param {Object} obj The object to query + * @return {*} The value at `obj.p`. + * @see R.path, R.props, R.pluck, R.project, R.nth * @example * - * // Returns `Maybe.Nothing` if the given divisor is `0` - * const safeDiv = n => d => d === 0 ? Maybe.Nothing() : Maybe.Just(n / d) - * - * R.traverse(Maybe.of, safeDiv(10), [2, 4, 5]); //=> Maybe.Just([5, 2.5, 2]) - * R.traverse(Maybe.of, safeDiv(10), [2, 0, 5]); //=> Maybe.Nothing - * - * // Using a Type Representative - * R.traverse(Maybe, safeDiv(10), Right(4)); //=> Just(Right(2.5)) - * R.traverse(Maybe, safeDiv(10), Right(0)); //=> Nothing - * R.traverse(Maybe, safeDiv(10), Left("X")); //=> Just(Left("X")) + * R.prop('x', {x: 100}); //=> 100 + * R.prop('x', {}); //=> undefined + * R.prop(0, [100]); //=> 100 + * R.compose(R.inc, R.prop('x'))({ x: 3 }) //=> 4 */ -var traverse = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function traverse(F, f, traversable) { - var of = typeof F['fantasy-land/of'] === 'function' ? F['fantasy-land/of'] : typeof F.of === 'function' ? F.of : F; - var TypeRep = { - 'fantasy-land/of': of - }; - return typeof traversable['fantasy-land/traverse'] === 'function' ? traversable['fantasy-land/traverse'](TypeRep, f) : typeof traversable.traverse === 'function' ? traversable.traverse(TypeRep, f) : (0,_sequence_js__WEBPACK_IMPORTED_MODULE_2__["default"])(TypeRep, (0,_map_js__WEBPACK_IMPORTED_MODULE_1__["default"])(f, traversable)); +var prop = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function prop(p, obj) { + if (obj == null) { + return; + } + return (0,_internal_isInteger_js__WEBPACK_IMPORTED_MODULE_1__["default"])(p) ? (0,_nth_js__WEBPACK_IMPORTED_MODULE_2__["default"])(p, obj) : obj[p]; }); -/* harmony default export */ __webpack_exports__["default"] = (traverse); +/* harmony default export */ __webpack_exports__["default"] = (prop); /***/ }), -/***/ "./node_modules/ramda/es/trim.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/trim.js ***! - \***************************************/ +/***/ "./node_modules/ramda/es/propEq.js": +/*!*****************************************!*\ + !*** ./node_modules/ramda/es/propEq.js ***! + \*****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); +/* harmony import */ var _prop_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./prop.js */ "./node_modules/ramda/es/prop.js"); +/* harmony import */ var _equals_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./equals.js */ "./node_modules/ramda/es/equals.js"); + + -var ws = "\t\n\x0B\f\r \xA0\u1680\u2000\u2001\u2002\u2003" + "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" + "\u2029\uFEFF"; -var zeroWidth = "\u200B"; -var hasProtoTrim = typeof String.prototype.trim === 'function'; /** - * Removes (strips) whitespace from both ends of the string. + * Returns `true` if the specified object property is equal, in + * [`R.equals`](#equals) terms, to the given value; `false` otherwise. + * You can test multiple properties with [`R.whereEq`](#whereEq), + * and test nested path property with [`R.pathEq`](#pathEq). * * @func * @memberOf R - * @since v0.6.0 - * @category String - * @sig String -> String - * @param {String} str The string to trim. - * @return {String} Trimmed version of `str`. + * @since v0.1.0 + * @category Relation + * @sig a -> String -> Object -> Boolean + * @param {*} val The value to compare the property with + * @param {String} name the specified object property's key + * @param {*} obj The object to check the property in + * @return {Boolean} `true` if the value equals the specified object property, + * `false` otherwise. + * @see R.whereEq, R.pathEq, R.propSatisfies, R.equals * @example * - * R.trim(' xyz '); //=> 'xyz' - * R.map(R.trim, R.split(',', 'x, y, z')); //=> ['x', 'y', 'z'] + * const abby = {name: 'Abby', age: 7, hair: 'blond'}; + * const fred = {name: 'Fred', age: 12, hair: 'brown'}; + * const rusty = {name: 'Rusty', age: 10, hair: 'brown'}; + * const alois = {name: 'Alois', age: 15, disposition: 'surly'}; + * const kids = [abby, fred, rusty, alois]; + * const hasBrownHair = R.propEq('brown', 'hair'); + * R.filter(hasBrownHair, kids); //=> [fred, rusty] */ -var trim = !hasProtoTrim || /*#__PURE__*/ -ws.trim() || ! /*#__PURE__*/ -zeroWidth.trim() ? /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function trim(str) { - var beginRx = new RegExp('^[' + ws + '][' + ws + ']*'); - var endRx = new RegExp('[' + ws + '][' + ws + ']*$'); - return str.replace(beginRx, '').replace(endRx, ''); -}) : /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function trim(str) { - return str.trim(); +var propEq = /*#__PURE__*/ +(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function propEq(val, name, obj) { + return (0,_equals_js__WEBPACK_IMPORTED_MODULE_1__["default"])(val, (0,_prop_js__WEBPACK_IMPORTED_MODULE_2__["default"])(name, obj)); }); -/* harmony default export */ __webpack_exports__["default"] = (trim); +/* harmony default export */ __webpack_exports__["default"] = (propEq); /***/ }), -/***/ "./node_modules/ramda/es/tryCatch.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/tryCatch.js ***! - \*******************************************/ +/***/ "./node_modules/ramda/es/propOr.js": +/*!*****************************************!*\ + !*** ./node_modules/ramda/es/propOr.js ***! + \*****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_arity_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_arity.js */ "./node_modules/ramda/es/internal/_arity.js"); -/* harmony import */ var _internal_concat_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_concat.js */ "./node_modules/ramda/es/internal/_concat.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); +/* harmony import */ var _defaultTo_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./defaultTo.js */ "./node_modules/ramda/es/defaultTo.js"); +/* harmony import */ var _prop_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./prop.js */ "./node_modules/ramda/es/prop.js"); /** - * `tryCatch` takes two functions, a `tryer` and a `catcher`. The returned - * function evaluates the `tryer`; if it does not throw, it simply returns the - * result. If the `tryer` *does* throw, the returned function evaluates the - * `catcher` function and returns its result. Note that for effective - * composition with this function, both the `tryer` and `catcher` functions - * must return the same type of results. + * Return the specified property of the given non-null object if the property + * is present and it's value is not `null`, `undefined` or `NaN`. + * + * Otherwise the first argument is returned. * * @func * @memberOf R - * @since v0.20.0 - * @category Function - * @sig (...x -> a) -> ((e, ...x) -> a) -> (...x -> a) - * @param {Function} tryer The function that may throw. - * @param {Function} catcher The function that will be evaluated if `tryer` throws. - * @return {Function} A new function that will catch exceptions and send them to the catcher. + * @since v0.6.0 + * @category Object + * @sig a -> String -> Object -> a + * @param {*} val The default value. + * @param {String} p The name of the property to return. + * @param {Object} obj The object to query. + * @return {*} The value of given property of the supplied object or the default value. * @example * - * R.tryCatch(R.prop('x'), R.F)({x: true}); //=> true - * R.tryCatch(() => { throw 'foo'}, R.always('caught'))('bar') // => - * 'caught' - * R.tryCatch(R.times(R.identity), R.always([]))('s') // => [] - * R.tryCatch(() => { throw 'this is not a valid value'}, (err, value)=>({error : err, value }))('bar') // => {'error': 'this is not a valid value', 'value': 'bar'} + * const alice = { + * name: 'ALICE', + * age: 101 + * }; + * const favorite = R.prop('favoriteLibrary'); + * const favoriteWithDefault = R.propOr('Ramda', 'favoriteLibrary'); + * + * favorite(alice); //=> undefined + * favoriteWithDefault(alice); //=> 'Ramda' */ -var tryCatch = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_2__["default"])(function _tryCatch(tryer, catcher) { - return (0,_internal_arity_js__WEBPACK_IMPORTED_MODULE_0__["default"])(tryer.length, function () { - try { - return tryer.apply(this, arguments); - } catch (e) { - return catcher.apply(this, (0,_internal_concat_js__WEBPACK_IMPORTED_MODULE_1__["default"])([e], arguments)); - } - }); +var propOr = /*#__PURE__*/ +(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function propOr(val, p, obj) { + return (0,_defaultTo_js__WEBPACK_IMPORTED_MODULE_1__["default"])(val, (0,_prop_js__WEBPACK_IMPORTED_MODULE_2__["default"])(p, obj)); }); -/* harmony default export */ __webpack_exports__["default"] = (tryCatch); +/* harmony default export */ __webpack_exports__["default"] = (propOr); /***/ }), -/***/ "./node_modules/ramda/es/type.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/type.js ***! - \***************************************/ +/***/ "./node_modules/ramda/es/props.js": +/*!****************************************!*\ + !*** ./node_modules/ramda/es/props.js ***! + \****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./node_modules/ramda/es/path.js"); + /** - * Gives a single-word string description of the (native) type of a value, - * returning such answers as 'Object', 'Number', 'Array', or 'Null'. Does not - * attempt to distinguish user Object types any further, reporting them all as - * 'Object'. + * Acts as multiple `prop`: array of keys in, array of values out. Preserves + * order. * * @func * @memberOf R - * @since v0.8.0 - * @category Type - * @sig * -> String - * @param {*} val The value to test - * @return {String} + * @since v0.1.0 + * @category Object + * @sig [k] -> {k: v} -> [v] + * @param {Array} ps The property names to fetch + * @param {Object} obj The object to query + * @return {Array} The corresponding values or partially applied function. + * @see R.prop, R.pluck, R.project * @example * - * R.type({}); //=> "Object" - * R.type(1); //=> "Number" - * R.type(false); //=> "Boolean" - * R.type('s'); //=> "String" - * R.type(null); //=> "Null" - * R.type([]); //=> "Array" - * R.type(/[A-z]/); //=> "RegExp" - * R.type(() => {}); //=> "Function" - * R.type(undefined); //=> "Undefined" + * R.props(['x', 'y'], {x: 1, y: 2}); //=> [1, 2] + * R.props(['c', 'a', 'b'], {b: 2, a: 1}); //=> [undefined, 1, 2] + * + * const fullName = R.compose(R.join(' '), R.props(['first', 'last'])); + * fullName({last: 'Bullet-Tooth', age: 33, first: 'Tony'}); //=> 'Tony Bullet-Tooth' */ -var type = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function type(val) { - return val === null ? 'Null' : val === undefined ? 'Undefined' : Object.prototype.toString.call(val).slice(8, -1); +var props = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function props(ps, obj) { + return ps.map(function (p) { + return (0,_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])([p], obj); + }); }); -/* harmony default export */ __webpack_exports__["default"] = (type); +/* harmony default export */ __webpack_exports__["default"] = (props); /***/ }), -/***/ "./node_modules/ramda/es/unapply.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/unapply.js ***! - \******************************************/ +/***/ "./node_modules/ramda/es/reduce.js": +/*!*****************************************!*\ + !*** ./node_modules/ramda/es/reduce.js ***! + \*****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); +/* harmony import */ var _internal_xReduce_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_xReduce.js */ "./node_modules/ramda/es/internal/_xReduce.js"); +/* harmony import */ var _internal_xwrap_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xwrap.js */ "./node_modules/ramda/es/internal/_xwrap.js"); + + /** - * Takes a function `fn`, which takes a single array argument, and returns a - * function which: + * Returns a single item by iterating through the list, successively calling + * the iterator function and passing it an accumulator value and the current + * value from the array, and then passing the result to the next call. * - * - takes any number of positional arguments; - * - passes these arguments to `fn` as an array; and - * - returns the result. + * The iterator function receives two values: *(acc, value)*. It may use + * [`R.reduced`](#reduced) to shortcut the iteration. + * + * The arguments' order of [`reduceRight`](#reduceRight)'s iterator function + * is *(value, acc)*. + * + * Note: `R.reduce` does not skip deleted or unassigned indices (sparse + * arrays), unlike the native `Array.prototype.reduce` method. For more details + * on this behavior, see: + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#Description + * + * Be cautious of mutating and returning the accumulator. If you reuse it across + * invocations, it will continue to accumulate onto the same value. The general + * recommendation is to always return a new value. If you can't do so for + * performance reasons, then be sure to reinitialize the accumulator on each + * invocation. * - * In other words, `R.unapply` derives a variadic function from a function which - * takes an array. `R.unapply` is the inverse of [`R.apply`](#apply). + * Dispatches to the `reduce` method of the third argument, if present. When + * doing so, it is up to the user to handle the [`R.reduced`](#reduced) + * shortcuting, as this is not implemented by `reduce`. * * @func * @memberOf R - * @since v0.8.0 - * @category Function - * @sig ([*...] -> a) -> (*... -> a) - * @param {Function} fn - * @return {Function} - * @see R.apply + * @since v0.1.0 + * @category List + * @sig ((a, b) -> a) -> a -> [b] -> a + * @param {Function} fn The iterator function. Receives two values, the accumulator and the + * current element from the array. + * @param {*} acc The accumulator value. + * @param {Array} list The list to iterate over. + * @return {*} The final, accumulated value. + * @see R.reduced, R.addIndex, R.reduceRight * @example * - * R.unapply(JSON.stringify)(1, 2, 3); //=> '[1,2,3]' - * @symb R.unapply(f)(a, b) = f([a, b]) + * R.reduce(R.subtract, 0, [1, 2, 3, 4]) // => ((((0 - 1) - 2) - 3) - 4) = -10 + * // - -10 + * // / \ / \ + * // - 4 -6 4 + * // / \ / \ + * // - 3 ==> -3 3 + * // / \ / \ + * // - 2 -1 2 + * // / \ / \ + * // 0 1 0 1 + * + * @symb R.reduce(f, a, [b, c, d]) = f(f(f(a, b), c), d) */ -var unapply = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function unapply(fn) { - return function () { - return fn(Array.prototype.slice.call(arguments, 0)); - }; +var reduce = /*#__PURE__*/ +(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (xf, acc, list) { + return (0,_internal_xReduce_js__WEBPACK_IMPORTED_MODULE_1__["default"])(typeof xf === 'function' ? (0,_internal_xwrap_js__WEBPACK_IMPORTED_MODULE_2__["default"])(xf) : xf, acc, list); }); -/* harmony default export */ __webpack_exports__["default"] = (unapply); +/* harmony default export */ __webpack_exports__["default"] = (reduce); /***/ }), -/***/ "./node_modules/ramda/es/unary.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/unary.js ***! - \****************************************/ +/***/ "./node_modules/ramda/es/reduceBy.js": +/*!*******************************************!*\ + !*** ./node_modules/ramda/es/reduceBy.js ***! + \*******************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); -/* harmony import */ var _nAry_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./nAry.js */ "./node_modules/ramda/es/nAry.js"); +/* harmony import */ var _internal_clone_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./internal/_clone.js */ "./node_modules/ramda/es/internal/_clone.js"); +/* harmony import */ var _internal_curryN_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curryN.js */ "./node_modules/ramda/es/internal/_curryN.js"); +/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); +/* harmony import */ var _internal_has_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./internal/_has.js */ "./node_modules/ramda/es/internal/_has.js"); +/* harmony import */ var _internal_reduced_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./internal/_reduced.js */ "./node_modules/ramda/es/internal/_reduced.js"); +/* harmony import */ var _internal_xReduce_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./internal/_xReduce.js */ "./node_modules/ramda/es/internal/_xReduce.js"); +/* harmony import */ var _internal_xreduceBy_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xreduceBy.js */ "./node_modules/ramda/es/internal/_xreduceBy.js"); +/* harmony import */ var _internal_xwrap_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_xwrap.js */ "./node_modules/ramda/es/internal/_xwrap.js"); + + + + + + /** - * Wraps a function of any arity (including nullary) in a function that accepts - * exactly 1 parameter. Any extraneous parameters will not be passed to the - * supplied function. + * Groups the elements of the list according to the result of calling + * the String-returning function `keyFn` on each element and reduces the elements + * of each group to a single value via the reducer function `valueFn`. + * + * The value function receives two values: *(acc, value)*. It may use + * [`R.reduced`](#reduced) to short circuit the iteration. + * + * This function is basically a more general [`groupBy`](#groupBy) function. + * + * Acts as a transducer if a transformer is given in list position. * * @func * @memberOf R - * @since v0.2.0 - * @category Function - * @sig (a -> b -> c -> ... -> z) -> (a -> z) - * @param {Function} fn The function to wrap. - * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of - * arity 1. - * @see R.binary, R.nAry + * @since v0.20.0 + * @category List + * @sig ((a, b) -> a) -> a -> (b -> String) -> [b] -> {String: a} + * @param {Function} valueFn The function that reduces the elements of each group to a single + * value. Receives two values, accumulator for a particular group and the current element. + * @param {*} acc The (initial) accumulator value for each group. + * @param {Function} keyFn The function that maps the list's element into a key. + * @param {Array} list The array to group. + * @return {Object} An object with the output of `keyFn` for keys, mapped to the output of + * `valueFn` for elements which produced that key when passed to `keyFn`. + * @see R.groupBy, R.reduce, R.reduced * @example * - * const takesTwoArgs = function(a, b) { - * return [a, b]; - * }; - * takesTwoArgs.length; //=> 2 - * takesTwoArgs(1, 2); //=> [1, 2] + * const groupNames = (acc, {name}) => acc.concat(name) + * const toGrade = ({score}) => + * score < 65 ? 'F' : + * score < 70 ? 'D' : + * score < 80 ? 'C' : + * score < 90 ? 'B' : 'A' + * + * var students = [ + * {name: 'Abby', score: 83}, + * {name: 'Bart', score: 62}, + * {name: 'Curt', score: 88}, + * {name: 'Dora', score: 92}, + * ] * - * const takesOneArg = R.unary(takesTwoArgs); - * takesOneArg.length; //=> 1 - * // Only 1 argument is passed to the wrapped function - * takesOneArg(1, 2); //=> [1, undefined] - * @symb R.unary(f)(a, b, c) = f(a) + * reduceBy(groupNames, [], toGrade, students) + * //=> {"A": ["Dora"], "B": ["Abby", "Curt"], "F": ["Bart"]} */ -var unary = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function unary(fn) { - return (0,_nAry_js__WEBPACK_IMPORTED_MODULE_1__["default"])(1, fn); -}); -/* harmony default export */ __webpack_exports__["default"] = (unary); +var reduceBy = /*#__PURE__*/ +(0,_internal_curryN_js__WEBPACK_IMPORTED_MODULE_0__["default"])(4, [], /*#__PURE__*/ +(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])([], _internal_xreduceBy_js__WEBPACK_IMPORTED_MODULE_2__["default"], function reduceBy(valueFn, valueAcc, keyFn, list) { + var xf = (0,_internal_xwrap_js__WEBPACK_IMPORTED_MODULE_3__["default"])(function (acc, elt) { + var key = keyFn(elt); + var value = valueFn((0,_internal_has_js__WEBPACK_IMPORTED_MODULE_4__["default"])(key, acc) ? acc[key] : (0,_internal_clone_js__WEBPACK_IMPORTED_MODULE_5__["default"])(valueAcc, false), elt); + if (value && value['@@transducer/reduced']) { + return (0,_internal_reduced_js__WEBPACK_IMPORTED_MODULE_6__["default"])(acc); + } + acc[key] = value; + return acc; + }); + return (0,_internal_xReduce_js__WEBPACK_IMPORTED_MODULE_7__["default"])(xf, {}, list); +})); +/* harmony default export */ __webpack_exports__["default"] = (reduceBy); /***/ }), -/***/ "./node_modules/ramda/es/uncurryN.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/uncurryN.js ***! - \*******************************************/ +/***/ "./node_modules/ramda/es/reject.js": +/*!*****************************************!*\ + !*** ./node_modules/ramda/es/reject.js ***! + \*****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); +/* harmony import */ var _internal_complement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_complement.js */ "./node_modules/ramda/es/internal/_complement.js"); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./curryN.js */ "./node_modules/ramda/es/curryN.js"); +/* harmony import */ var _filter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./filter.js */ "./node_modules/ramda/es/filter.js"); + /** - * Returns a function of arity `n` from a (manually) curried function. - * Note that, the returned function is actually a ramda style - * curryied function, which can accept one or more arguments in each - * function calling. + * The complement of [`filter`](#filter). + * + * Acts as a transducer if a transformer is given in list position. Filterable + * objects include plain objects or any object that has a filter method such + * as `Array`. * * @func * @memberOf R - * @since v0.14.0 - * @category Function - * @sig Number -> (a -> b -> c ... -> z) -> ((a -> b -> c ...) -> z) - * @param {Number} length The arity for the returned function. - * @param {Function} fn The function to uncurry. - * @return {Function} A new function. - * @see R.curry, R.curryN + * @since v0.1.0 + * @category List + * @sig Filterable f => (a -> Boolean) -> f a -> f a + * @param {Function} pred + * @param {Array} filterable + * @return {Array} + * @see R.filter, R.transduce, R.addIndex * @example * - * const addFour = a => b => c => d => a + b + c + d; + * const isOdd = (n) => n % 2 !== 0; + * + * R.reject(isOdd, [1, 2, 3, 4]); //=> [2, 4] * - * const uncurriedAddFour = R.uncurryN(4, addFour); - * uncurriedAddFour(1, 2, 3, 4); //=> 10 + * R.reject(isOdd, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4} */ -var uncurryN = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function uncurryN(depth, fn) { - return (0,_curryN_js__WEBPACK_IMPORTED_MODULE_1__["default"])(depth, function () { - var currentDepth = 1; - var value = fn; - var idx = 0; - var endIdx; - while (currentDepth <= depth && typeof value === 'function') { - endIdx = currentDepth === depth ? arguments.length : idx + value.length; - value = value.apply(this, Array.prototype.slice.call(arguments, idx, endIdx)); - currentDepth += 1; - idx = endIdx; - } - return value; - }); +var reject = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function reject(pred, filterable) { + return (0,_filter_js__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_internal_complement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(pred), filterable); }); -/* harmony default export */ __webpack_exports__["default"] = (uncurryN); +/* harmony default export */ __webpack_exports__["default"] = (reject); /***/ }), -/***/ "./node_modules/ramda/es/unfold.js": +/***/ "./node_modules/ramda/es/remove.js": /*!*****************************************!*\ - !*** ./node_modules/ramda/es/unfold.js ***! + !*** ./node_modules/ramda/es/remove.js ***! \*****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); /** - * Builds a list from a seed value. Accepts an iterator function, which returns - * either false to stop iteration or an array of length 2 containing the value - * to add to the resulting list and the seed to be used in the next call to the - * iterator function. - * - * The iterator function receives one argument: *(seed)*. + * Removes the sub-list of `list` starting at index `start` and containing + * `count` elements. _Note that this is not destructive_: it returns a copy of + * the list with the changes. + * No lists have been harmed in the application of this function. * * @func * @memberOf R - * @since v0.10.0 + * @since v0.2.2 * @category List - * @sig (a -> [b]) -> * -> [b] - * @param {Function} fn The iterator function. receives one argument, `seed`, and returns - * either false to quit iteration or an array of length two to proceed. The element - * at index 0 of this array will be added to the resulting array, and the element - * at index 1 will be passed to the next call to `fn`. - * @param {*} seed The seed value. - * @return {Array} The final list. + * @sig Number -> Number -> [a] -> [a] + * @param {Number} start The position to start removing elements + * @param {Number} count The number of elements to remove + * @param {Array} list The list to remove from + * @return {Array} A new Array with `count` elements from `start` removed. + * @see R.without * @example * - * const f = n => n > 50 ? false : [-n, n + 10]; - * R.unfold(f, 10); //=> [-10, -20, -30, -40, -50] - * @symb R.unfold(f, x) = [f(x)[0], f(f(x)[1])[0], f(f(f(x)[1])[1])[0], ...] + * R.remove(2, 3, [1,2,3,4,5,6,7,8]); //=> [1,2,6,7,8] */ -var unfold = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function unfold(fn, seed) { - var pair = fn(seed); - var result = []; - while (pair && pair.length) { - result[result.length] = pair[0]; - pair = fn(pair[1]); - } +var remove = /*#__PURE__*/ +(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function remove(start, count, list) { + var result = Array.prototype.slice.call(list, 0); + result.splice(start, count); return result; }); -/* harmony default export */ __webpack_exports__["default"] = (unfold); +/* harmony default export */ __webpack_exports__["default"] = (remove); /***/ }), -/***/ "./node_modules/ramda/es/union.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/union.js ***! - \****************************************/ +/***/ "./node_modules/ramda/es/reverse.js": +/*!******************************************!*\ + !*** ./node_modules/ramda/es/reverse.js ***! + \******************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_concat_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_concat.js */ "./node_modules/ramda/es/internal/_concat.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _compose_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./compose.js */ "./node_modules/ramda/es/compose.js"); -/* harmony import */ var _uniq_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./uniq.js */ "./node_modules/ramda/es/uniq.js"); - - +/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +/* harmony import */ var _internal_isString_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isString.js */ "./node_modules/ramda/es/internal/_isString.js"); /** - * Combines two lists into a set (i.e. no duplicates) composed of the elements - * of each list. + * Returns a new list or string with the elements or characters in reverse + * order. * * @func * @memberOf R * @since v0.1.0 - * @category Relation - * @sig [*] -> [*] -> [*] - * @param {Array} as The first list. - * @param {Array} bs The second list. - * @return {Array} The first and second lists concatenated, with - * duplicates removed. + * @category List + * @sig [a] -> [a] + * @sig String -> String + * @param {Array|String} list + * @return {Array|String} * @example * - * R.union([1, 2, 3], [2, 3, 4]); //=> [1, 2, 3, 4] + * R.reverse([1, 2, 3]); //=> [3, 2, 1] + * R.reverse([1, 2]); //=> [2, 1] + * R.reverse([1]); //=> [1] + * R.reverse([]); //=> [] + * + * R.reverse('abc'); //=> 'cba' + * R.reverse('ab'); //=> 'ba' + * R.reverse('a'); //=> 'a' + * R.reverse(''); //=> '' */ -var union = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])( /*#__PURE__*/ -(0,_compose_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_uniq_js__WEBPACK_IMPORTED_MODULE_3__["default"], _internal_concat_js__WEBPACK_IMPORTED_MODULE_0__["default"])); -/* harmony default export */ __webpack_exports__["default"] = (union); +var reverse = /*#__PURE__*/ +(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function reverse(list) { + return (0,_internal_isString_js__WEBPACK_IMPORTED_MODULE_1__["default"])(list) ? list.split('').reverse().join('') : Array.prototype.slice.call(list, 0).reverse(); +}); +/* harmony default export */ __webpack_exports__["default"] = (reverse); /***/ }), -/***/ "./node_modules/ramda/es/unionWith.js": -/*!********************************************!*\ - !*** ./node_modules/ramda/es/unionWith.js ***! - \********************************************/ +/***/ "./node_modules/ramda/es/set.js": +/*!**************************************!*\ + !*** ./node_modules/ramda/es/set.js ***! + \**************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_concat_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_concat.js */ "./node_modules/ramda/es/internal/_concat.js"); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _uniqWith_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./uniqWith.js */ "./node_modules/ramda/es/uniqWith.js"); +/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); +/* harmony import */ var _always_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./always.js */ "./node_modules/ramda/es/always.js"); +/* harmony import */ var _over_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./over.js */ "./node_modules/ramda/es/over.js"); /** - * Combines two lists into a set (i.e. no duplicates) composed of the elements - * of each list. Duplication is determined according to the value returned by - * applying the supplied predicate to two list elements. If an element exists - * in both lists, the first element from the first list will be used. + * Returns the result of "setting" the portion of the given data structure + * focused by the given lens to the given value. * * @func * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig ((a, a) -> Boolean) -> [*] -> [*] -> [*] - * @param {Function} pred A predicate used to test whether two items are equal. - * @param {Array} list1 The first list. - * @param {Array} list2 The second list. - * @return {Array} The first and second lists concatenated, with - * duplicates removed. - * @see R.union + * @since v0.16.0 + * @category Object + * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s + * @sig Lens s a -> a -> s -> s + * @param {Lens} lens + * @param {*} v + * @param {*} x + * @return {*} + * @see R.view, R.over, R.lens, R.lensIndex, R.lensProp, R.lensPath * @example * - * const l1 = [{a: 1}, {a: 2}]; - * const l2 = [{a: 1}, {a: 4}]; - * R.unionWith(R.eqBy(R.prop('a')), l1, l2); //=> [{a: 1}, {a: 2}, {a: 4}] + * const xLens = R.lensProp('x'); + * + * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2} + * R.set(xLens, 8, {x: 1, y: 2}); //=> {x: 8, y: 2} */ -var unionWith = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function unionWith(pred, list1, list2) { - return (0,_uniqWith_js__WEBPACK_IMPORTED_MODULE_2__["default"])(pred, (0,_internal_concat_js__WEBPACK_IMPORTED_MODULE_0__["default"])(list1, list2)); +var set = /*#__PURE__*/ +(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function set(lens, v, x) { + return (0,_over_js__WEBPACK_IMPORTED_MODULE_1__["default"])(lens, (0,_always_js__WEBPACK_IMPORTED_MODULE_2__["default"])(v), x); }); -/* harmony default export */ __webpack_exports__["default"] = (unionWith); +/* harmony default export */ __webpack_exports__["default"] = (set); /***/ }), -/***/ "./node_modules/ramda/es/uniq.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/uniq.js ***! - \***************************************/ +/***/ "./node_modules/ramda/es/slice.js": +/*!****************************************!*\ + !*** ./node_modules/ramda/es/slice.js ***! + \****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./identity.js */ "./node_modules/ramda/es/identity.js"); -/* harmony import */ var _uniqBy_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./uniqBy.js */ "./node_modules/ramda/es/uniqBy.js"); +/* harmony import */ var _internal_checkForMethod_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_checkForMethod.js */ "./node_modules/ramda/es/internal/_checkForMethod.js"); +/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); /** - * Returns a new list containing only one copy of each element in the original - * list. [`R.equals`](#equals) is used to determine equality. + * Returns the elements of the given list or string (or object with a `slice` + * method) from `fromIndex` (inclusive) to `toIndex` (exclusive). + * + * Dispatches to the `slice` method of the third argument, if present. * * @func * @memberOf R - * @since v0.1.0 + * @since v0.1.4 * @category List - * @sig [a] -> [a] - * @param {Array} list The array to consider. - * @return {Array} The list of unique items. + * @sig Number -> Number -> [a] -> [a] + * @sig Number -> Number -> String -> String + * @param {Number} fromIndex The start index (inclusive). + * @param {Number} toIndex The end index (exclusive). + * @param {*} list + * @return {*} * @example * - * R.uniq([1, 1, 2, 1]); //=> [1, 2] - * R.uniq([1, '1']); //=> [1, '1'] - * R.uniq([[42], [42]]); //=> [[42]] + * R.slice(1, 3, ['a', 'b', 'c', 'd']); //=> ['b', 'c'] + * R.slice(1, Infinity, ['a', 'b', 'c', 'd']); //=> ['b', 'c', 'd'] + * R.slice(0, -1, ['a', 'b', 'c', 'd']); //=> ['a', 'b', 'c'] + * R.slice(-3, -1, ['a', 'b', 'c', 'd']); //=> ['b', 'c'] + * R.slice(0, 3, 'ramda'); //=> 'ram' */ -var uniq = /*#__PURE__*/ -(0,_uniqBy_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_identity_js__WEBPACK_IMPORTED_MODULE_0__["default"]); -/* harmony default export */ __webpack_exports__["default"] = (uniq); +var slice = /*#__PURE__*/ +(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ +(0,_internal_checkForMethod_js__WEBPACK_IMPORTED_MODULE_1__["default"])('slice', function slice(fromIndex, toIndex, list) { + return Array.prototype.slice.call(list, fromIndex, toIndex); +})); +/* harmony default export */ __webpack_exports__["default"] = (slice); /***/ }), -/***/ "./node_modules/ramda/es/uniqBy.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/uniqBy.js ***! - \*****************************************/ +/***/ "./node_modules/ramda/es/sort.js": +/*!***************************************!*\ + !*** ./node_modules/ramda/es/sort.js ***! + \***************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_Set_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_Set.js */ "./node_modules/ramda/es/internal/_Set.js"); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_xuniqBy_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_xuniqBy.js */ "./node_modules/ramda/es/internal/_xuniqBy.js"); - - - +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); /** - * Returns a new list containing only one copy of each element in the original - * list, based upon the value returned by applying the supplied function to - * each list element. Prefers the first item if the supplied function produces - * the same value on two items. [`R.equals`](#equals) is used for comparison. - * - * Acts as a transducer if a transformer is given in list position. + * Returns a copy of the list, sorted according to the comparator function, + * which should accept two values at a time and return a negative number if the + * first value is smaller, a positive number if it's larger, and zero if they + * are equal. Please note that this is a **copy** of the list. It does not + * modify the original. * * @func * @memberOf R - * @since v0.16.0 + * @since v0.1.0 * @category List - * @sig (a -> b) -> [a] -> [a] - * @param {Function} fn A function used to produce a value to use during comparisons. - * @param {Array} list The array to consider. - * @return {Array} The list of unique items. + * @sig ((a, a) -> Number) -> [a] -> [a] + * @param {Function} comparator A sorting function :: a -> b -> Int + * @param {Array} list The list to sort + * @return {Array} a new array with its elements sorted by the comparator function. + * @see R.ascend, R.descend * @example * - * R.uniqBy(Math.abs, [-1, -5, 2, 10, 1, 2]); //=> [-1, -5, 2, 10] + * const diff = function(a, b) { return a - b; }; + * R.sort(diff, [4,2,7,5]); //=> [2, 4, 5, 7] */ -var uniqBy = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_2__["default"])([], _internal_xuniqBy_js__WEBPACK_IMPORTED_MODULE_3__["default"], function (fn, list) { - var set = new _internal_Set_js__WEBPACK_IMPORTED_MODULE_0__["default"](); - var result = []; - var idx = 0; - var appliedItem, item; - while (idx < list.length) { - item = list[idx]; - appliedItem = fn(item); - if (set.add(appliedItem)) { - result.push(item); - } - idx += 1; - } - return result; -})); -/* harmony default export */ __webpack_exports__["default"] = (uniqBy); +var sort = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function sort(comparator, list) { + return Array.prototype.slice.call(list, 0).sort(comparator); +}); +/* harmony default export */ __webpack_exports__["default"] = (sort); /***/ }), -/***/ "./node_modules/ramda/es/uniqWith.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/uniqWith.js ***! - \*******************************************/ +/***/ "./node_modules/ramda/es/startsWith.js": +/*!*********************************************!*\ + !*** ./node_modules/ramda/es/startsWith.js ***! + \*********************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); -/* harmony import */ var _internal_includesWith_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_includesWith.js */ "./node_modules/ramda/es/internal/_includesWith.js"); -/* harmony import */ var _internal_xuniqWith_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_xuniqWith.js */ "./node_modules/ramda/es/internal/_xuniqWith.js"); - +/* harmony import */ var _equals_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./equals.js */ "./node_modules/ramda/es/equals.js"); +/* harmony import */ var _take_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./take.js */ "./node_modules/ramda/es/take.js"); /** - * Returns a new list containing only one copy of each element in the original - * list, based upon the value returned by applying the supplied predicate to - * two list elements. Prefers the first item if two items compare equal based - * on the predicate. + * Checks if a list starts with the provided sublist. * - * Acts as a transducer if a transformer is given in list position. + * Similarly, checks if a string starts with the provided substring. * * @func * @memberOf R - * @since v0.2.0 + * @since v0.24.0 * @category List - * @sig ((a, a) -> Boolean) -> [a] -> [a] - * @param {Function} pred A predicate used to test whether two items are equal. - * @param {Array} list The array to consider. - * @return {Array} The list of unique items. + * @sig [a] -> [a] -> Boolean + * @sig String -> String -> Boolean + * @param {*} prefix + * @param {*} list + * @return {Boolean} + * @see R.endsWith * @example * - * const strEq = R.eqBy(String); - * R.uniqWith(strEq)([1, '1', 2, 1]); //=> [1, 2] - * R.uniqWith(strEq)([{}, {}]); //=> [{}] - * R.uniqWith(strEq)([1, '1', 1]); //=> [1] - * R.uniqWith(strEq)(['1', 1, 1]); //=> ['1'] + * R.startsWith('a', 'abc') //=> true + * R.startsWith('b', 'abc') //=> false + * R.startsWith(['a'], ['a', 'b', 'c']) //=> true + * R.startsWith(['b'], ['a', 'b', 'c']) //=> false */ -var uniqWith = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ -(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])([], _internal_xuniqWith_js__WEBPACK_IMPORTED_MODULE_3__["default"], function (pred, list) { - var idx = 0; - var len = list.length; - var result = []; - var item; - while (idx < len) { - item = list[idx]; - if (!(0,_internal_includesWith_js__WEBPACK_IMPORTED_MODULE_2__["default"])(pred, item, result)) { - result[result.length] = item; - } - idx += 1; - } - return result; -})); -/* harmony default export */ __webpack_exports__["default"] = (uniqWith); +var startsWith = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (prefix, list) { + return (0,_equals_js__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_take_js__WEBPACK_IMPORTED_MODULE_2__["default"])(prefix.length, list), prefix); +}); +/* harmony default export */ __webpack_exports__["default"] = (startsWith); /***/ }), -/***/ "./node_modules/ramda/es/unless.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/unless.js ***! - \*****************************************/ +/***/ "./node_modules/ramda/es/take.js": +/*!***************************************!*\ + !*** ./node_modules/ramda/es/take.js ***! + \***************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); +/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); +/* harmony import */ var _internal_xtake_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xtake.js */ "./node_modules/ramda/es/internal/_xtake.js"); +/* harmony import */ var _slice_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./slice.js */ "./node_modules/ramda/es/slice.js"); + + + /** - * Tests the final argument by passing it to the given predicate function. If - * the predicate is not satisfied, the function will return the result of - * calling the `whenFalseFn` function with the same argument. If the predicate - * is satisfied, the argument is returned as is. + * Returns the first `n` elements of the given list, string, or + * transducer/transformer (or object with a `take` method). + * + * Dispatches to the `take` method of the second argument, if present. * * @func * @memberOf R - * @since v0.18.0 - * @category Logic - * @sig (a -> Boolean) -> (a -> b) -> a -> a | b - * @param {Function} pred A predicate function - * @param {Function} whenFalseFn A function to invoke when the `pred` evaluates - * to a falsy value. - * @param {*} x An object to test with the `pred` function and - * pass to `whenFalseFn` if necessary. - * @return {*} Either `x` or the result of applying `x` to `whenFalseFn`. - * @see R.ifElse, R.when, R.cond + * @since v0.1.0 + * @category List + * @sig Number -> [a] -> [a] + * @sig Number -> String -> String + * @param {Number} n + * @param {*} list + * @return {*} + * @see R.drop * @example * - * let safeInc = R.unless(R.isNil, R.inc); - * safeInc(null); //=> null - * safeInc(1); //=> 2 + * R.take(1, ['foo', 'bar', 'baz']); //=> ['foo'] + * R.take(2, ['foo', 'bar', 'baz']); //=> ['foo', 'bar'] + * R.take(3, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] + * R.take(4, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] + * R.take(3, 'ramda'); //=> 'ram' + * + * const personnel = [ + * 'Dave Brubeck', + * 'Paul Desmond', + * 'Eugene Wright', + * 'Joe Morello', + * 'Gerry Mulligan', + * 'Bob Bates', + * 'Joe Dodge', + * 'Ron Crotty' + * ]; + * + * const takeFive = R.take(5); + * takeFive(personnel); + * //=> ['Dave Brubeck', 'Paul Desmond', 'Eugene Wright', 'Joe Morello', 'Gerry Mulligan'] + * @symb R.take(-1, [a, b]) = [a, b] + * @symb R.take(0, [a, b]) = [] + * @symb R.take(1, [a, b]) = [a] + * @symb R.take(2, [a, b]) = [a, b] */ -var unless = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function unless(pred, whenFalseFn, x) { - return pred(x) ? x : whenFalseFn(x); -}); -/* harmony default export */ __webpack_exports__["default"] = (unless); +var take = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ +(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])(['take'], _internal_xtake_js__WEBPACK_IMPORTED_MODULE_2__["default"], function take(n, xs) { + return (0,_slice_js__WEBPACK_IMPORTED_MODULE_3__["default"])(0, n < 0 ? Infinity : n, xs); +})); +/* harmony default export */ __webpack_exports__["default"] = (take); /***/ }), -/***/ "./node_modules/ramda/es/unnest.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/unnest.js ***! - \*****************************************/ +/***/ "./node_modules/ramda/es/toPairs.js": +/*!******************************************!*\ + !*** ./node_modules/ramda/es/toPairs.js ***! + \******************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_identity_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_identity.js */ "./node_modules/ramda/es/internal/_identity.js"); -/* harmony import */ var _chain_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./chain.js */ "./node_modules/ramda/es/chain.js"); +/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +/* harmony import */ var _internal_has_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_has.js */ "./node_modules/ramda/es/internal/_has.js"); /** - * Shorthand for `R.chain(R.identity)`, which removes one level of nesting from - * any [Chain](https://github.com/fantasyland/fantasy-land#chain). + * Converts an object into an array of key, value arrays. Only the object's + * own properties are used. + * Note that the order of the output array is not guaranteed to be consistent + * across different JS platforms. * * @func * @memberOf R - * @since v0.3.0 - * @category List - * @sig Chain c => c (c a) -> c a - * @param {*} list - * @return {*} - * @see R.flatten, R.chain + * @since v0.4.0 + * @category Object + * @sig {String: *} -> [[String,*]] + * @param {Object} obj The object to extract from + * @return {Array} An array of key, value arrays from the object's own properties. + * @see R.fromPairs, R.keys, R.values * @example * - * R.unnest([1, [2], [[3]]]); //=> [1, 2, [3]] - * R.unnest([[1, 2], [3, 4], [5, 6]]); //=> [1, 2, 3, 4, 5, 6] + * R.toPairs({a: 1, b: 2, c: 3}); //=> [['a', 1], ['b', 2], ['c', 3]] */ -var unnest = /*#__PURE__*/ -(0,_chain_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_internal_identity_js__WEBPACK_IMPORTED_MODULE_0__["default"]); -/* harmony default export */ __webpack_exports__["default"] = (unnest); +var toPairs = /*#__PURE__*/ +(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function toPairs(obj) { + var pairs = []; + for (var prop in obj) { + if ((0,_internal_has_js__WEBPACK_IMPORTED_MODULE_1__["default"])(prop, obj)) { + pairs[pairs.length] = [prop, obj[prop]]; + } + } + return pairs; +}); +/* harmony default export */ __webpack_exports__["default"] = (toPairs); /***/ }), -/***/ "./node_modules/ramda/es/until.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/until.js ***! - \****************************************/ +/***/ "./node_modules/ramda/es/toString.js": +/*!*******************************************!*\ + !*** ./node_modules/ramda/es/toString.js ***! + \*******************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); +/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); +/* harmony import */ var _internal_toString_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_toString.js */ "./node_modules/ramda/es/internal/_toString.js"); + /** - * Takes a predicate, a transformation function, and an initial value, - * and returns a value of the same type as the initial value. - * It does so by applying the transformation until the predicate is satisfied, - * at which point it returns the satisfactory value. + * Returns the string representation of the given value. `eval`'ing the output + * should result in a value equivalent to the input value. Many of the built-in + * `toString` methods do not satisfy this requirement. + * + * If the given value is an `[object Object]` with a `toString` method other + * than `Object.prototype.toString`, this method is invoked with no arguments + * to produce the return value. This means user-defined constructor functions + * can provide a suitable `toString` method. For example: + * + * function Point(x, y) { + * this.x = x; + * this.y = y; + * } + * + * Point.prototype.toString = function() { + * return 'new Point(' + this.x + ', ' + this.y + ')'; + * }; + * + * R.toString(new Point(1, 2)); //=> 'new Point(1, 2)' * * @func * @memberOf R - * @since v0.20.0 - * @category Logic - * @sig (a -> Boolean) -> (a -> a) -> a -> a - * @param {Function} pred A predicate function - * @param {Function} fn The iterator function - * @param {*} init Initial value - * @return {*} Final value that satisfies predicate + * @since v0.14.0 + * @category String + * @sig * -> String + * @param {*} val + * @return {String} * @example * - * R.until(R.gt(R.__, 100), R.multiply(2))(1) // => 128 + * R.toString(42); //=> '42' + * R.toString('abc'); //=> '"abc"' + * R.toString([1, 2, 3]); //=> '[1, 2, 3]' + * R.toString({foo: 1, bar: 2, baz: 3}); //=> '{"bar": 2, "baz": 3, "foo": 1}' + * R.toString(new Date('2001-02-03T04:05:06Z')); //=> 'new Date("2001-02-03T04:05:06.000Z")' */ -var until = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function until(pred, fn, init) { - var val = init; - while (!pred(val)) { - val = fn(val); - } - return val; +var toString = /*#__PURE__*/ +(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function toString(val) { + return (0,_internal_toString_js__WEBPACK_IMPORTED_MODULE_1__["default"])(val, []); }); -/* harmony default export */ __webpack_exports__["default"] = (until); +/* harmony default export */ __webpack_exports__["default"] = (toString); /***/ }), -/***/ "./node_modules/ramda/es/unwind.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/unwind.js ***! - \*****************************************/ +/***/ "./node_modules/ramda/es/type.js": +/*!***************************************!*\ + !*** ./node_modules/ramda/es/type.js ***! + \***************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); -/* harmony import */ var _internal_map_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_map.js */ "./node_modules/ramda/es/internal/_map.js"); -/* harmony import */ var _internal_assoc_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_assoc.js */ "./node_modules/ramda/es/internal/_assoc.js"); - - - +/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); /** - * - * Deconstructs an array field from the input documents to output a document for each element. - * Each output document is the input document with the value of the array field replaced by the element. + * Gives a single-word string description of the (native) type of a value, + * returning such answers as 'Object', 'Number', 'Array', or 'Null'. Does not + * attempt to distinguish user Object types any further, reporting them all as + * 'Object'. * * @func * @memberOf R - * @since v0.28.0 - * @category Object - * @sig String -> {k: [v]} -> [{k: v}] - * @param {String} key The key to determine which property of the object should be unwind - * @param {Object} object The object containing list under property named as key which is to unwind - * @return {List} A new list of object containing the value of input key having list replaced by each element in the object. + * @since v0.8.0 + * @category Type + * @sig * -> String + * @param {*} val The value to test + * @return {String} * @example * - * R.unwind('hobbies', { - * name: 'alice', - * hobbies: ['Golf', 'Hacking'], - * colors: ['red', 'green'], - * }); - * // [ - * // { name: 'alice', hobbies: 'Golf', colors: ['red', 'green'] }, - * // { name: 'alice', hobbies: 'Hacking', colors: ['red', 'green'] } - * // ] - */ - -var unwind = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function (key, object) { - // If key is not in object or key is not as a list in object - if (!(key in object && (0,_internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object[key]))) { - return [object]; - } // Map over object[key] which is a list and assoc each element with key - - return (0,_internal_map_js__WEBPACK_IMPORTED_MODULE_2__["default"])(function (item) { - return (0,_internal_assoc_js__WEBPACK_IMPORTED_MODULE_3__["default"])(key, item, object); - }, object[key]); + * R.type({}); //=> "Object" + * R.type(1); //=> "Number" + * R.type(false); //=> "Boolean" + * R.type('s'); //=> "String" + * R.type(null); //=> "Null" + * R.type([]); //=> "Array" + * R.type(/[A-z]/); //=> "RegExp" + * R.type(() => {}); //=> "Function" + * R.type(async () => {}); //=> "AsyncFunction" + * R.type(undefined); //=> "Undefined" + */ + +var type = /*#__PURE__*/ +(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function type(val) { + return val === null ? 'Null' : val === undefined ? 'Undefined' : Object.prototype.toString.call(val).slice(8, -1); }); -/* harmony default export */ __webpack_exports__["default"] = (unwind); +/* harmony default export */ __webpack_exports__["default"] = (type); /***/ }), -/***/ "./node_modules/ramda/es/update.js": -/*!*****************************************!*\ - !*** ./node_modules/ramda/es/update.js ***! - \*****************************************/ +/***/ "./node_modules/ramda/es/uniq.js": +/*!***************************************!*\ + !*** ./node_modules/ramda/es/uniq.js ***! + \***************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); -/* harmony import */ var _adjust_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./adjust.js */ "./node_modules/ramda/es/adjust.js"); -/* harmony import */ var _always_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./always.js */ "./node_modules/ramda/es/always.js"); - +/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./identity.js */ "./node_modules/ramda/es/identity.js"); +/* harmony import */ var _uniqBy_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./uniqBy.js */ "./node_modules/ramda/es/uniqBy.js"); /** - * Returns a new copy of the array with the element at the provided index - * replaced with the given value. + * Returns a new list containing only one copy of each element in the original + * list. [`R.equals`](#equals) is used to determine equality. * * @func * @memberOf R - * @since v0.14.0 + * @since v0.1.0 * @category List - * @sig Number -> a -> [a] -> [a] - * @param {Number} idx The index to update. - * @param {*} x The value to exist at the given index of the returned array. - * @param {Array|Arguments} list The source array-like object to be updated. - * @return {Array} A copy of `list` with the value at index `idx` replaced with `x`. - * @see R.adjust + * @sig [a] -> [a] + * @param {Array} list The array to consider. + * @return {Array} The list of unique items. * @example * - * R.update(1, '_', ['a', 'b', 'c']); //=> ['a', '_', 'c'] - * R.update(-1, '_', ['a', 'b', 'c']); //=> ['a', 'b', '_'] - * @symb R.update(-1, a, [b, c]) = [b, a] - * @symb R.update(0, a, [b, c]) = [a, c] - * @symb R.update(1, a, [b, c]) = [b, a] + * R.uniq([1, 1, 2, 1]); //=> [1, 2] + * R.uniq([1, '1']); //=> [1, '1'] + * R.uniq([[42], [42]]); //=> [[42]] */ -var update = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function update(idx, x, list) { - return (0,_adjust_js__WEBPACK_IMPORTED_MODULE_1__["default"])(idx, (0,_always_js__WEBPACK_IMPORTED_MODULE_2__["default"])(x), list); -}); -/* harmony default export */ __webpack_exports__["default"] = (update); +var uniq = /*#__PURE__*/ +(0,_uniqBy_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_identity_js__WEBPACK_IMPORTED_MODULE_1__["default"]); +/* harmony default export */ __webpack_exports__["default"] = (uniq); /***/ }), -/***/ "./node_modules/ramda/es/useWith.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/useWith.js ***! - \******************************************/ +/***/ "./node_modules/ramda/es/uniqBy.js": +/*!*****************************************!*\ + !*** ./node_modules/ramda/es/uniqBy.js ***! + \*****************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); +/* harmony import */ var _internal_Set_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_Set.js */ "./node_modules/ramda/es/internal/_Set.js"); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _curryN_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./curryN.js */ "./node_modules/ramda/es/curryN.js"); +/* harmony import */ var _internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_dispatchable.js */ "./node_modules/ramda/es/internal/_dispatchable.js"); +/* harmony import */ var _internal_xuniqBy_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_xuniqBy.js */ "./node_modules/ramda/es/internal/_xuniqBy.js"); + + /** - * Accepts a function `fn` and a list of transformer functions and returns a - * new curried function. When the new function is invoked, it calls the - * function `fn` with parameters consisting of the result of calling each - * supplied handler on successive arguments to the new function. + * Returns a new list containing only one copy of each element in the original + * list, based upon the value returned by applying the supplied function to + * each list element. Prefers the first item if the supplied function produces + * the same value on two items. [`R.equals`](#equals) is used for comparison. * - * If more arguments are passed to the returned function than transformer - * functions, those arguments are passed directly to `fn` as additional - * parameters. If you expect additional arguments that don't need to be - * transformed, although you can ignore them, it's best to pass an identity - * function so that the new function reports the correct arity. + * Acts as a transducer if a transformer is given in list position. * * @func * @memberOf R - * @since v0.1.0 - * @category Function - * @sig ((x1, x2, ...) -> z) -> [(a -> x1), (b -> x2), ...] -> (a -> b -> ... -> z) - * @param {Function} fn The function to wrap. - * @param {Array} transformers A list of transformer functions - * @return {Function} The wrapped function. - * @see R.converge + * @since v0.16.0 + * @category List + * @sig (a -> b) -> [a] -> [a] + * @param {Function} fn A function used to produce a value to use during comparisons. + * @param {Array} list The array to consider. + * @return {Array} The list of unique items. * @example * - * R.useWith(Math.pow, [R.identity, R.identity])(3, 4); //=> 81 - * R.useWith(Math.pow, [R.identity, R.identity])(3)(4); //=> 81 - * R.useWith(Math.pow, [R.dec, R.inc])(3, 4); //=> 32 - * R.useWith(Math.pow, [R.dec, R.inc])(3)(4); //=> 32 - * @symb R.useWith(f, [g, h])(a, b) = f(g(a), h(b)) + * R.uniqBy(Math.abs, [-1, -5, 2, 10, 1, 2]); //=> [-1, -5, 2, 10] */ -var useWith = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function useWith(fn, transformers) { - return (0,_curryN_js__WEBPACK_IMPORTED_MODULE_1__["default"])(transformers.length, function () { - var args = []; - var idx = 0; - while (idx < transformers.length) { - args.push(transformers[idx].call(this, arguments[idx])); - idx += 1; +var uniqBy = /*#__PURE__*/ +(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/ +(0,_internal_dispatchable_js__WEBPACK_IMPORTED_MODULE_1__["default"])([], _internal_xuniqBy_js__WEBPACK_IMPORTED_MODULE_2__["default"], function (fn, list) { + var set = new _internal_Set_js__WEBPACK_IMPORTED_MODULE_3__["default"](); + var result = []; + var idx = 0; + var appliedItem, item; + while (idx < list.length) { + item = list[idx]; + appliedItem = fn(item); + if (set.add(appliedItem)) { + result.push(item); } - return fn.apply(this, args.concat(Array.prototype.slice.call(arguments, transformers.length))); - }); -}); -/* harmony default export */ __webpack_exports__["default"] = (useWith); + idx += 1; + } + return result; +})); +/* harmony default export */ __webpack_exports__["default"] = (uniqBy); /***/ }), @@ -95643,51 +82868,6 @@ var values = /*#__PURE__*/ /***/ }), -/***/ "./node_modules/ramda/es/valuesIn.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/valuesIn.js ***! - \*******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); - -/** - * Returns a list of all the properties, including prototype properties, of the - * supplied object. - * Note that the order of the output array is not guaranteed to be consistent - * across different JS platforms. - * - * @func - * @memberOf R - * @since v0.2.0 - * @category Object - * @sig {k: v} -> [v] - * @param {Object} obj The object to extract values from - * @return {Array} An array of the values of the object's own and prototype properties. - * @see R.values, R.keysIn - * @example - * - * const F = function() { this.x = 'X'; }; - * F.prototype.y = 'Y'; - * const f = new F(); - * R.valuesIn(f); //=> ['X', 'Y'] - */ - -var valuesIn = /*#__PURE__*/ -(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function valuesIn(obj) { - var prop; - var vs = []; - for (prop in obj) { - vs[vs.length] = obj[prop]; - } - return vs; -}); -/* harmony default export */ __webpack_exports__["default"] = (valuesIn); - -/***/ }), - /***/ "./node_modules/ramda/es/view.js": /*!***************************************!*\ !*** ./node_modules/ramda/es/view.js ***! @@ -95739,364 +82919,6 @@ var view = /*#__PURE__*/ /***/ }), -/***/ "./node_modules/ramda/es/when.js": -/*!***************************************!*\ - !*** ./node_modules/ramda/es/when.js ***! - \***************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); - -/** - * Tests the final argument by passing it to the given predicate function. If - * the predicate is satisfied, the function will return the result of calling - * the `whenTrueFn` function with the same argument. If the predicate is not - * satisfied, the argument is returned as is. - * - * @func - * @memberOf R - * @since v0.18.0 - * @category Logic - * @sig (a -> Boolean) -> (a -> b) -> a -> a | b - * @param {Function} pred A predicate function - * @param {Function} whenTrueFn A function to invoke when the `condition` - * evaluates to a truthy value. - * @param {*} x An object to test with the `pred` function and - * pass to `whenTrueFn` if necessary. - * @return {*} Either `x` or the result of applying `x` to `whenTrueFn`. - * @see R.ifElse, R.unless, R.cond - * @example - * - * // truncate :: String -> String - * const truncate = R.when( - * R.propSatisfies(R.gt(R.__, 10), 'length'), - * R.pipe(R.take(10), R.append('…'), R.join('')) - * ); - * truncate('12345'); //=> '12345' - * truncate('0123456789ABC'); //=> '0123456789…' - */ - -var when = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function when(pred, whenTrueFn, x) { - return pred(x) ? whenTrueFn(x) : x; -}); -/* harmony default export */ __webpack_exports__["default"] = (when); - -/***/ }), - -/***/ "./node_modules/ramda/es/where.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/where.js ***! - \****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_has_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_has.js */ "./node_modules/ramda/es/internal/_has.js"); - - -/** - * Takes a spec object and a test object; returns true if the test satisfies - * the spec. Each of the spec's own properties must be a predicate function. - * Each predicate is applied to the value of the corresponding property of the - * test object. `where` returns true if all the predicates return true, false - * otherwise. - * - * `where` is well suited to declaratively expressing constraints for other - * functions such as [`filter`](#filter) and [`find`](#find). - * - * @func - * @memberOf R - * @since v0.1.1 - * @category Object - * @sig {String: (* -> Boolean)} -> {String: *} -> Boolean - * @param {Object} spec - * @param {Object} testObj - * @return {Boolean} - * @see R.propSatisfies, R.whereEq - * @example - * - * // pred :: Object -> Boolean - * const pred = R.where({ - * a: R.equals('foo'), - * b: R.complement(R.equals('bar')), - * x: R.gt(R.__, 10), - * y: R.lt(R.__, 20) - * }); - * - * pred({a: 'foo', b: 'xxx', x: 11, y: 19}); //=> true - * pred({a: 'xxx', b: 'xxx', x: 11, y: 19}); //=> false - * pred({a: 'foo', b: 'bar', x: 11, y: 19}); //=> false - * pred({a: 'foo', b: 'xxx', x: 10, y: 19}); //=> false - * pred({a: 'foo', b: 'xxx', x: 11, y: 20}); //=> false - */ - -var where = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function where(spec, testObj) { - for (var prop in spec) { - if ((0,_internal_has_js__WEBPACK_IMPORTED_MODULE_1__["default"])(prop, spec) && !spec[prop](testObj[prop])) { - return false; - } - } - return true; -}); -/* harmony default export */ __webpack_exports__["default"] = (where); - -/***/ }), - -/***/ "./node_modules/ramda/es/whereAny.js": -/*!*******************************************!*\ - !*** ./node_modules/ramda/es/whereAny.js ***! - \*******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_has_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_has.js */ "./node_modules/ramda/es/internal/_has.js"); - - -/** - * Takes a spec object and a test object; each of the spec's own properties must be a predicate function. - * Each predicate is applied to the value of the corresponding property of the - * test object. `whereAny` returns true if at least one of the predicates return true, - * false otherwise. - * - * `whereAny` is well suited to declaratively expressing constraints for other - * functions such as [`filter`](#filter) and [`find`](#find). - * - * @func - * @memberOf R - * @since v0.28.0 - * @category Object - * @sig {String: (* -> Boolean)} -> {String: *} -> Boolean - * @param {Object} spec - * @param {Object} testObj - * @return {Boolean} - * @see R.propSatisfies, R.where - * @example - * - * // pred :: Object -> Boolean - * const pred = R.whereAny({ - * a: R.equals('foo'), - * b: R.complement(R.equals('xxx')), - * x: R.gt(R.__, 10), - * y: R.lt(R.__, 20) - * }); - * - * pred({a: 'foo', b: 'xxx', x: 8, y: 34}); //=> true - * pred({a: 'xxx', b: 'xxx', x: 9, y: 21}); //=> false - * pred({a: 'bar', b: 'xxx', x: 10, y: 20}); //=> false - * pred({a: 'foo', b: 'bar', x: 10, y: 20}); //=> true - * pred({a: 'foo', b: 'xxx', x: 11, y: 20}); //=> true - */ - -var whereAny = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function whereAny(spec, testObj) { - for (var prop in spec) { - if ((0,_internal_has_js__WEBPACK_IMPORTED_MODULE_1__["default"])(prop, spec) && spec[prop](testObj[prop])) { - return true; - } - } - return false; -}); -/* harmony default export */ __webpack_exports__["default"] = (whereAny); - -/***/ }), - -/***/ "./node_modules/ramda/es/whereEq.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/whereEq.js ***! - \******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _equals_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./equals.js */ "./node_modules/ramda/es/equals.js"); -/* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./map.js */ "./node_modules/ramda/es/map.js"); -/* harmony import */ var _where_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./where.js */ "./node_modules/ramda/es/where.js"); - - - - -/** - * Takes a spec object and a test object; returns true if the test satisfies - * the spec, false otherwise. An object satisfies the spec if, for each of the - * spec's own properties, accessing that property of the object gives the same - * value (in [`R.equals`](#equals) terms) as accessing that property of the - * spec. - * - * `whereEq` is a specialization of [`where`](#where). - * - * @func - * @memberOf R - * @since v0.14.0 - * @category Object - * @sig {String: *} -> {String: *} -> Boolean - * @param {Object} spec - * @param {Object} testObj - * @return {Boolean} - * @see R.propEq, R.where - * @example - * - * // pred :: Object -> Boolean - * const pred = R.whereEq({a: 1, b: 2}); - * - * pred({a: 1}); //=> false - * pred({a: 1, b: 2}); //=> true - * pred({a: 1, b: 2, c: 3}); //=> true - * pred({a: 1, b: 1}); //=> false - */ - -var whereEq = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function whereEq(spec, testObj) { - return (0,_where_js__WEBPACK_IMPORTED_MODULE_3__["default"])((0,_map_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_equals_js__WEBPACK_IMPORTED_MODULE_1__["default"], spec), testObj); -}); -/* harmony default export */ __webpack_exports__["default"] = (whereEq); - -/***/ }), - -/***/ "./node_modules/ramda/es/without.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/without.js ***! - \******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); -/* harmony import */ var _internal_Set_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_Set.js */ "./node_modules/ramda/es/internal/_Set.js"); -/* harmony import */ var _reject_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./reject.js */ "./node_modules/ramda/es/reject.js"); - - - -/** - * Returns a new list without values in the first argument. - * [`R.equals`](#equals) is used to determine equality. - * - * Acts as a transducer if a transformer is given in list position. - * - * @func - * @memberOf R - * @since v0.19.0 - * @category List - * @sig [a] -> [a] -> [a] - * @param {Array} list1 The values to be removed from `list2`. - * @param {Array} list2 The array to remove values from. - * @return {Array} The new array without values in `list1`. - * @see R.transduce, R.difference, R.remove - * @example - * - * R.without([1, 2], [1, 2, 1, 3, 4]); //=> [3, 4] - */ - -var without = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function without(xs, list) { - var toRemove = new _internal_Set_js__WEBPACK_IMPORTED_MODULE_1__["default"](); - for (var i = 0; i < xs.length; i += 1) { - toRemove.add(xs[i]); - } - return (0,_reject_js__WEBPACK_IMPORTED_MODULE_2__["default"])(toRemove.has.bind(toRemove), list); -}); -/* harmony default export */ __webpack_exports__["default"] = (without); - -/***/ }), - -/***/ "./node_modules/ramda/es/xor.js": -/*!**************************************!*\ - !*** ./node_modules/ramda/es/xor.js ***! - \**************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); - -/** - * Exclusive disjunction logical operation. - * Returns `true` if one of the arguments is truthy and the other is falsy. - * Otherwise, it returns `false`. - * - * @func - * @memberOf R - * @since v0.27.1 - * @category Logic - * @sig a -> b -> Boolean - * @param {Any} a - * @param {Any} b - * @return {Boolean} true if one of the arguments is truthy and the other is falsy - * @see R.or, R.and - * @example - * - * R.xor(true, true); //=> false - * R.xor(true, false); //=> true - * R.xor(false, true); //=> true - * R.xor(false, false); //=> false - */ - -var xor = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function xor(a, b) { - return Boolean(!a ^ !b); -}); -/* harmony default export */ __webpack_exports__["default"] = (xor); - -/***/ }), - -/***/ "./node_modules/ramda/es/xprod.js": -/*!****************************************!*\ - !*** ./node_modules/ramda/es/xprod.js ***! - \****************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); - -/** - * Creates a new list out of the two supplied by creating each possible pair - * from the lists. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig [a] -> [b] -> [[a,b]] - * @param {Array} as The first list. - * @param {Array} bs The second list. - * @return {Array} The list made by combining each possible pair from - * `as` and `bs` into pairs (`[a, b]`). - * @example - * - * R.xprod([1, 2], ['a', 'b']); //=> [[1, 'a'], [1, 'b'], [2, 'a'], [2, 'b']] - * @symb R.xprod([a, b], [c, d]) = [[a, c], [a, d], [b, c], [b, d]] - */ - -var xprod = /*#__PURE__*/ -(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function xprod(a, b) { - // = xprodWith(prepend); (takes about 3 times as long...) - var idx = 0; - var ilen = a.length; - var j; - var jlen = b.length; - var result = []; - while (idx < ilen) { - j = 0; - while (j < jlen) { - result[result.length] = [a[idx], b[j]]; - j += 1; - } - idx += 1; - } - return result; -}); -/* harmony default export */ __webpack_exports__["default"] = (xprod); - -/***/ }), - /***/ "./node_modules/ramda/es/zip.js": /*!**************************************!*\ !*** ./node_modules/ramda/es/zip.js ***! @@ -96183,56 +83005,6 @@ var zipObj = /*#__PURE__*/ }); /* harmony default export */ __webpack_exports__["default"] = (zipObj); -/***/ }), - -/***/ "./node_modules/ramda/es/zipWith.js": -/*!******************************************!*\ - !*** ./node_modules/ramda/es/zipWith.js ***! - \******************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry3.js */ "./node_modules/ramda/es/internal/_curry3.js"); - -/** - * Creates a new list out of the two supplied by applying the function to each - * equally-positioned pair in the lists. The returned list is truncated to the - * length of the shorter of the two input lists. - * - * @function - * @memberOf R - * @since v0.1.0 - * @category List - * @sig ((a, b) -> c) -> [a] -> [b] -> [c] - * @param {Function} fn The function used to combine the two elements into one value. - * @param {Array} list1 The first array to consider. - * @param {Array} list2 The second array to consider. - * @return {Array} The list made by combining same-indexed elements of `list1` and `list2` - * using `fn`. - * @example - * - * const f = (x, y) => { - * // ... - * }; - * R.zipWith(f, [1, 2, 3], ['a', 'b', 'c']); - * //=> [f(1, 'a'), f(2, 'b'), f(3, 'c')] - * @symb R.zipWith(fn, [a, b, c], [d, e, f]) = [fn(a, d), fn(b, e), fn(c, f)] - */ - -var zipWith = /*#__PURE__*/ -(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function zipWith(fn, a, b) { - var rv = []; - var idx = 0; - var len = Math.min(a.length, b.length); - while (idx < len) { - rv[idx] = fn(a[idx], b[idx]); - idx += 1; - } - return rv; -}); -/* harmony default export */ __webpack_exports__["default"] = (zipWith); - /***/ }) /******/ }); @@ -96348,17 +83120,20 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ Response: function() { return /* binding */ Response; }, /* harmony export */ fetch: function() { return /* binding */ fetch; } /* harmony export */ }); -var global = +/* eslint-disable no-prototype-builtins */ +var g = (typeof globalThis !== 'undefined' && globalThis) || (typeof self !== 'undefined' && self) || - (typeof global !== 'undefined' && global) + // eslint-disable-next-line no-undef + (typeof __webpack_require__.g !== 'undefined' && __webpack_require__.g) || + {} var support = { - searchParams: 'URLSearchParams' in global, - iterable: 'Symbol' in global && 'iterator' in Symbol, + searchParams: 'URLSearchParams' in g, + iterable: 'Symbol' in g && 'iterator' in Symbol, blob: - 'FileReader' in global && - 'Blob' in global && + 'FileReader' in g && + 'Blob' in g && (function() { try { new Blob() @@ -96367,8 +83142,8 @@ var support = { return false } })(), - formData: 'FormData' in global, - arrayBuffer: 'ArrayBuffer' in global + formData: 'FormData' in g, + arrayBuffer: 'ArrayBuffer' in g } function isDataView(obj) { @@ -96439,6 +83214,9 @@ function Headers(headers) { }, this) } else if (Array.isArray(headers)) { headers.forEach(function(header) { + if (header.length != 2) { + throw new TypeError('Headers constructor: expected name/value pair to be length 2, found' + header.length) + } this.append(header[0], header[1]) }, this) } else if (headers) { @@ -96509,6 +83287,7 @@ if (support.iterable) { } function consumed(body) { + if (body._noBody) return if (body.bodyUsed) { return Promise.reject(new TypeError('Already read')) } @@ -96536,7 +83315,9 @@ function readBlobAsArrayBuffer(blob) { function readBlobAsText(blob) { var reader = new FileReader() var promise = fileReaderReady(reader) - reader.readAsText(blob) + var match = /charset=([A-Za-z0-9_-]+)/.exec(blob.type) + var encoding = match ? match[1] : 'utf-8' + reader.readAsText(blob, encoding) return promise } @@ -96574,9 +83355,11 @@ function Body() { semantic of setting Request.bodyUsed in the constructor before _initBody is called. */ + // eslint-disable-next-line no-self-assign this.bodyUsed = this.bodyUsed this._bodyInit = body if (!body) { + this._noBody = true; this._bodyText = '' } else if (typeof body === 'string') { this._bodyText = body @@ -96624,26 +83407,27 @@ function Body() { return Promise.resolve(new Blob([this._bodyText])) } } + } - this.arrayBuffer = function() { - if (this._bodyArrayBuffer) { - var isConsumed = consumed(this) - if (isConsumed) { - return isConsumed - } - if (ArrayBuffer.isView(this._bodyArrayBuffer)) { - return Promise.resolve( - this._bodyArrayBuffer.buffer.slice( - this._bodyArrayBuffer.byteOffset, - this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength - ) + this.arrayBuffer = function() { + if (this._bodyArrayBuffer) { + var isConsumed = consumed(this) + if (isConsumed) { + return isConsumed + } else if (ArrayBuffer.isView(this._bodyArrayBuffer)) { + return Promise.resolve( + this._bodyArrayBuffer.buffer.slice( + this._bodyArrayBuffer.byteOffset, + this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength ) - } else { - return Promise.resolve(this._bodyArrayBuffer) - } + ) } else { - return this.blob().then(readBlobAsArrayBuffer) + return Promise.resolve(this._bodyArrayBuffer) } + } else if (support.blob) { + return this.blob().then(readBlobAsArrayBuffer) + } else { + throw new Error('could not read as ArrayBuffer') } } @@ -96678,7 +83462,7 @@ function Body() { } // HTTP methods whose capitalization should be normalized -var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'] +var methods = ['CONNECT', 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'TRACE'] function normalizeMethod(method) { var upcased = method.toUpperCase() @@ -96719,7 +83503,12 @@ function Request(input, options) { } this.method = normalizeMethod(options.method || this.method || 'GET') this.mode = options.mode || this.mode || null - this.signal = options.signal || this.signal + this.signal = options.signal || this.signal || (function () { + if ('AbortController' in g) { + var ctrl = new AbortController(); + return ctrl.signal; + } + }()); this.referrer = null if ((this.method === 'GET' || this.method === 'HEAD') && body) { @@ -96781,7 +83570,11 @@ function parseHeaders(rawHeaders) { var key = parts.shift().trim() if (key) { var value = parts.join(':').trim() - headers.append(key, value) + try { + headers.append(key, value) + } catch (error) { + console.warn('Response ' + error.message) + } } }) return headers @@ -96799,6 +83592,9 @@ function Response(bodyInit, options) { this.type = 'default' this.status = options.status === undefined ? 200 : options.status + if (this.status < 200 || this.status > 599) { + throw new RangeError("Failed to construct 'Response': The status provided (0) is outside the range [200, 599].") + } this.ok = this.status >= 200 && this.status < 300 this.statusText = options.statusText === undefined ? '' : '' + options.statusText this.headers = new Headers(options.headers) @@ -96818,7 +83614,8 @@ Response.prototype.clone = function() { } Response.error = function() { - var response = new Response(null, {status: 0, statusText: ''}) + var response = new Response(null, {status: 200, statusText: ''}) + response.status = 0 response.type = 'error' return response } @@ -96833,7 +83630,7 @@ Response.redirect = function(url, status) { return new Response(null, {status: status, headers: {location: url}}) } -var DOMException = global.DOMException +var DOMException = g.DOMException try { new DOMException() } catch (err) { @@ -96863,10 +83660,16 @@ function fetch(input, init) { xhr.onload = function() { var options = { - status: xhr.status, statusText: xhr.statusText, headers: parseHeaders(xhr.getAllResponseHeaders() || '') } + // This check if specifically for when a user fetches a file locally from the file system + // Only if the status is out of a normal range + if (request.url.startsWith('file://') && (xhr.status < 200 || xhr.status > 599)) { + options.status = 200; + } else { + options.status = xhr.status; + } options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL') var body = 'response' in xhr ? xhr.response : xhr.responseText setTimeout(function() { @@ -96882,7 +83685,7 @@ function fetch(input, init) { xhr.ontimeout = function() { setTimeout(function() { - reject(new TypeError('Network request failed')) + reject(new TypeError('Network request timed out')) }, 0) } @@ -96894,7 +83697,7 @@ function fetch(input, init) { function fixUrl(url) { try { - return url === '' && global.location.href ? global.location.href : url + return url === '' && g.location.href ? g.location.href : url } catch (e) { return url } @@ -96912,18 +83715,23 @@ function fetch(input, init) { if (support.blob) { xhr.responseType = 'blob' } else if ( - support.arrayBuffer && - request.headers.get('Content-Type') && - request.headers.get('Content-Type').indexOf('application/octet-stream') !== -1 + support.arrayBuffer ) { xhr.responseType = 'arraybuffer' } } - if (init && typeof init.headers === 'object' && !(init.headers instanceof Headers)) { + if (init && typeof init.headers === 'object' && !(init.headers instanceof Headers || (g.Headers && init.headers instanceof g.Headers))) { + var names = []; Object.getOwnPropertyNames(init.headers).forEach(function(name) { + names.push(normalizeName(name)) xhr.setRequestHeader(name, normalizeValue(init.headers[name])) }) + request.headers.forEach(function(value, name) { + if (names.indexOf(name) === -1) { + xhr.setRequestHeader(name, value) + } + }) } else { request.headers.forEach(function(value, name) { xhr.setRequestHeader(name, value) @@ -96947,11 +83755,11 @@ function fetch(input, init) { fetch.polyfill = true -if (!global.fetch) { - global.fetch = fetch - global.Headers = Headers - global.Request = Request - global.Response = Response +if (!g.fetch) { + g.fetch = fetch + g.Headers = Headers + g.Request = Request + g.Response = Response } }(); @@ -96971,4 +83779,4 @@ window.DashRenderer = _DashRenderer__WEBPACK_IMPORTED_MODULE_0__.DashRenderer; window.dash_renderer = __webpack_exports__; /******/ })() ; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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RWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7OztBQ3ZCQTtBQUNBLGtCQUFrQixtQkFBTyxDQUFDLHNEQUFZOztBQUV0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTywyQkFBMkI7QUFDbEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTywyQkFBMkI7QUFDbEMsUUFBUSw0QkFBNEI7QUFDcEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTyw2QkFBNkI7QUFDcEMsV0FBVyxpQ0FBaUM7QUFDNUMsVUFBVSxnQ0FBZ0M7QUFDMUMsV0FBVyxpQ0FBaUM7QUFDNUMsT0FBTyxxQ0FBcUM7QUFDNUMsU0FBUywyQ0FBMkM7QUFDcEQsUUFBUTtBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELGdCQUFnQjtBQUNyRSxtREFBbUQsY0FBYztBQUNqRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixPQUFPLFFBQVE7QUFDaEMsaUJBQWlCLE9BQU8sUUFBUTtBQUNoQyxrQkFBa0IsT0FBTyxPQUFPO0FBQ2hDLGtCQUFrQixPQUFPLE9BQU87QUFDaEMsaUJBQWlCLFFBQVEsT0FBTztBQUNoQyxpQkFBaUIsUUFBUSxPQUFPO0FBQ2hDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVFQUF1RTs7QUFFdkU7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtDQUErQyxFQUFFLFVBQVUsRUFBRTtBQUM3RDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7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LENBQUMsNERBQWU7O0FBRXJDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxjQUFjLG1CQUFtQjtBQUNqQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYyxjQUFjO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsY0FBYztBQUNoQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzRUFBc0UsbUNBQW1DOztBQUV6RztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6QjtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLGtIQUFrSCxZQUFZLE9BQU8sS0FBSyxZQUFZLFdBQVcsVUFBVSxVQUFVLFVBQVUsVUFBVSxLQUFLLE1BQU0sTUFBTSxVQUFVLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxhQUFhLE1BQU0sS0FBSyxVQUFVLFVBQVUsWUFBWSxXQUFXLFVBQVUsWUFBWSxNQUFNLEtBQUssVUFBVSxVQUFVLFVBQVUsTUFBTSxLQUFLLFVBQVUsVUFBVSxZQUFZLFdBQVcsVUFBVSxNQUFNLEtBQUssT0FBTyxPQUFPLFdBQVcsS0FBSyxLQUFLLFlBQVksYUFBYSxNQUFNLEtBQUssWUFBWSxXQUFXLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsV0FBVyxPQUFPLEtBQUssWUFBWSxhQUFhLFlBQVksWUFBWSxhQUFhLFdBQVcsVUFBVSxZQUFZLE9B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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLDBHQUEwRyxZQUFZLFdBQVcsVUFBVSxVQUFVLFVBQVUsWUFBWSxhQUFhLFdBQVcsWUFBWSxhQUFhLFdBQVcsVUFBVSxVQUFVLE1BQU0sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLFVBQVUsT0FBTyxLQUFLLFlBQVksYUFBYSxXQUFXLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxXQUFXLFVBQVUsWUFBWSxhQUFhLGFBQWEsTUFBTSxPQUFPLE1BQU0sS0FBSyxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsTUFBTSxLQUFLLFVBQVUsVUFBVSxVQUFVLE9BQU8sS0FBSyxVQUFVLFlBQVksYUFBYSxhQUFhLFdBQVcsTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLFdBQVcsVUFBVSxVQUFVLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxXQUFXLFVBQVUsTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLGFBQWEsV0FBVyxVQUFVLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxXQUFXLFlBQVksV0FBVyxZQUFZLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxZQUFZLE1BQU0sTUFBTSxZQUFZLFdBQVcsTUFBTSxLQUFLLFlB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLE9BQU87QUFDekI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7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QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQSx5REFBeUQ7O0FBRXpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUEsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSwrRkFBK0Y7QUFDL0Y7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLHFCQUFxQjtBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7O0FBR0EsNkRBQTZEO0FBQzdEO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7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QTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLDJCQUEyQjtBQUM3QztBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFD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QUFDQTs7QUFFQTtBQUNBLHNCQUFzQixpQkFBaUI7QUFDdkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLGlCQUFpQjtBQUNuQzs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLHFCQUFxQjtBQUN6Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtB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QVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBLHdGQUF3Rjs7QUFFeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQixZQUFZOztBQUVaO0FBQ0EsK0ZBQStGO0FBQy9GOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSw2REFBNkQ7QUFDN0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsK0RBQStEOztBQUUvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCLGdCQUFnQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7QUFFVixRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVIsTUFBTTtBQUNOO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU4sSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscURBQXFEOztBQUVyRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBc0IsaUJBQWlCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4Qzs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDs7QUFFekQ7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQyxJQUFJOztBQUVMLDBCQUEwQjs7QUFFMUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUIsMkNBQTJDOztBQUUzQztBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0Q0FBNEM7O0FBRTVDLCtCQUErQjs7QUFFL0I7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FB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QTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBLHNCQUFzQixpQkFBaUI7QUFDdkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYzs7QUFFZDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQzs7QUFFakM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7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T0FBTztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBcUIsd0JBQXdCO0FBQzdDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHNCQUFzQix3QkFBd0I7QUFDOUM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsV0FBVyxvRUFBb0U7QUFDL0U7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR04sb0NBQW9DOztBQUVwQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0M7O0FBRXRDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IsZ0JBQWdCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlDQUFpQzs7QUFFakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUEsa0JBQWtCOztBQUVsQjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7O0FBRUE7QUFD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UDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOOztBQUVBLG9CQUFvQixrQkFBa0I7QUFDdEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx1RkFBdUY7O0FBRXZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0IsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUcsR0FBRzs7QUFFTjtBQUNBLCtCQUErQjs7QUFFL0I7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSCxrQkFBa0IsNkJBQTZCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRyxJQUFJO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHLEdB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O0FBQ1I7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVFQUF1RTs7QUFFdkU7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCOzs7QUFHM0I7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx1QkFBdUI7O0FBRXZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7O0FBRUEscUJBQXFCLG1CQUFtQjtBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVB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Q0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUEsZ0JBQWdCOztBQUVoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGlCQUFpQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxzQkFBc0Isb0JBQW9CO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUEsc0JBQXNCLDBCQUEwQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUwsb0JBQW9CLG1CQUFtQjtBQUN2QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCOztBQUUvQiwrQkFBK0I7O0FBRS9CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdDQUFnQyxRQUFRO0FBQ3hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSCxrQkFBa0IsaUJBQWlCO0FBQ25DOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0IsZ0JBQWdCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCO0FBQ2xCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQSxxREFBcUQ7QUFDckQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTixtQ0FBbUM7O0FBRW5DLHVCQUF1Qjs7QUFFdkIsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdEQUF3RDtBQUN4RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0EsaURBQWlEOztBQUVqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsZUFBZTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlDQUF5Qzs7QUFFekM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDOztBQUV4QztBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLGFBQWE7QUFDL0I7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0VBQW9FOztBQUVwRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7O0FBRTVCO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQzs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7O0FBRTFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFD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O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxNQUFNOztBQUVOOztBQUVBLGtCQUFrQixvQkFBb0I7QUFDdEM7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxrQ0FBa0M7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVOztBQUVWLFVBQVU7O0FBRVYsWUFBWTs7QUFFWixZQUFZOztBQUVaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKLDRCQUE0QjtBQUM1QixJQUFJO0FBQ0o7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7O0FBRUE7QUFD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QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFFBQVE7O0FBRVIsTUFBTTtBQUNOOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUix5REFBeUQ7QUFDekQsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx1Q0FBdUM7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMENBQTBDOztBQUUxQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtB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QUFFQSxrQkFBa0IsdUJBQXVCO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFOztBQUVsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDs7QUFFaEQ7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLHNCQUFzQix5QkFBeUI7QUFDL0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsbUNBQW1DOztBQUVuQztBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsNEJBQTRCLHFCQUFxQjtBQUNqRDtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7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QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDOztBQUV4QztBQUNBLG9DQUFvQzs7QUFFcEM7QUFDQTtBQUNBLG9DQUFvQztBQUNwQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEI7O0FBRTlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBLDhCQUE4Qjs7QUFFOUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDOztBQUUvQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLDRCQUE0QjtBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7O0FBRTlCO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdURBQXVEOztBQUV2RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0VBQWtFOztBQUVsRTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTs7QUFFVixRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTs7QUFFVixRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTs7QUFFVjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNCQUFzQixrQkFBa0I7QUFDeEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1Qzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCOztBQUU5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsbUJBQW1CO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0Q0FBNEM7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrSUFBa0k7O0FBRWxJO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsa0JBQWtCLHVCQUF1QjtBQUN6QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG1CQUFtQix3QkFBd0I7QUFDM0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7OztBQUdKLHFDQUFxQzs7QUFFckMsZ0ZBQWdGOztBQUVoRixpRkFBaUY7O0FBRWpGLGdGQUFnRjs7QUFFaEYsaUZBQWlGOztBQUVqRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDBCQUEwQixpQkFBaUI7QUFDM0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBLDhCQUE4QixpQkFBaUI7QUFDL0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGlEQUFpRDs7QUFFakQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscURBQXFEOztBQUVyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2Qzs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsV0FBVztBQUNYLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7O0FBRXRCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBEOztBQUUxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLHVCQUF1QjtBQUN6Qyx3RUFBd0U7O0FBRXhFO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLHNCQUFzQjtBQUN4QyxpRUFBaUU7O0FBRWpFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQzs7QUFFMUMsMENBQTBDOztBQUUxQyxxQkFBcUIsa0JBQWtCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osK0NBQStDOztBQUUvQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7O0FBRUQscUJBQXFCOztBQUVyQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDOztBQUV0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxvQkFBb0IseUJBQXlCO0FBQzdDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkIsa0JBQWtCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxrQkFBa0I7QUFDbEIsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7QUFDM0I7O0FBRUE7QUFDQSxzQ0FBc0M7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLHVDQUF1QyxLQUFLO0FBQ2hEO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUksK0RBQStELEtBQUs7QUFDeEU7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsR0FBRzs7O0FBR0gsc0NBQXNDOztBQUV0QztBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsR0FBRzs7O0FBR0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTs7QUFFQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUEsZUFBZTtBQUNmOztBQUVBLDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUIsb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBLHdDQUF3QztBQUN4QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0EsdURBQXVEOztBQUV2RCwyQkFBMkI7O0FBRTNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0gsNkJBQTZCOztBQUU3Qjs7QUFFQTs7Ozs7Ozs7Ozs7QUN4dCtCQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZLG1CQUFPLENBQUMsNERBQWdCOztBQUVwQyxVQUFVLG1CQUFPLENBQUMsd0RBQWM7QUFDaEMsU0FBUyxtQkFBTyxDQUFDLHNEQUFhO0FBQzlCO0FBQ0EsVUFBVSxnRkFBMEI7QUFDcEMsWUFBWSxrRkFBNEI7QUFDeEMsR0FBRztBQUNILFdBQVcsbUJBQU8sQ0FBQywwREFBZTtBQUNsQzs7Ozs7Ozs7Ozs7O0FDaENhOztBQUViLFFBQVEsbUJBQU8sQ0FBQyxvREFBVTtBQUMxQixnQkFBZ0IsbUJBQU8sQ0FBQyw0REFBYzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7Ozs7Ozs7Ozs7O0FDbEVBLFFBQVEsbUJBQU8sQ0FBQyxvREFBVTtBQUMxQixXQUFXLG1CQUFPLENBQUMsZ0RBQVE7O0FBRTNCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFdBQVc7QUFDdkM7QUFDQTs7Ozs7Ozs7Ozs7O0FDckNhOztBQUViLFFBQVEsbUJBQU8sQ0FBQyxvREFBVTs7QUFFMUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFDQUFxQyxnQ0FBZ0M7QUFDckUscUNBQXFDLGdDQUFnQztBQUNyRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUNBQXFDLHlCQUF5Qjs7QUFFOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFDQUFxQyx1QkFBdUI7O0FBRTVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkRBLFFBQVEsbUJBQU8sQ0FBQyxvREFBVTtBQUMxQixXQUFXLG1CQUFPLENBQUMsZ0RBQVE7QUFDM0IsWUFBWSxxRkFBMkI7O0FBRXZDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLGtDQUFrQyxhQUFhOztBQUVyRTtBQUNBLG1CQUFtQixVQUFVO0FBQzdCO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLDBCQUEwQjtBQUMxQixHQUFHOztBQUVIO0FBQ0E7QUFDQSx3QkFBd0IsY0FBYztBQUN0QztBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEM7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBOzs7Ozs7Ozs7OztBQ2pDQTs7QUFFQTs7QUFFQSxJQUFJLElBQTZCO0FBQ2pDO0FBQ0EsZUFBZSxtQkFBTyxDQUFDLGtEQUFVO0FBQ2pDLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2hCQSxRQUFRLG1CQUFPLENBQUMsb0RBQVU7QUFDMUIsWUFBWSxxRkFBMkI7QUFDdkMsV0FBVyxtQkFBTyxDQUFDLDBEQUFhOztBQUVoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBDQUEwQztBQUMxQywwQ0FBMEM7QUFDMUM7QUFDQSx1Q0FBdUMsT0FBTztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBcUIsc0JBQXNCO0FBQzNDOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQix1QkFBdUI7QUFDakQsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVILDZEQUE2RCxvQkFBb0I7QUFDakY7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUgsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3JIYTs7QUFFYixRQUFRLG1CQUFPLENBQUMsb0RBQVU7QUFDMUIsY0FBYyxtQkFBTyxDQUFDLHNEQUFXO0FBQ2pDLGdCQUFnQixtQkFBTyxDQUFDLDBEQUFhO0FBQ3JDLFdBQVcsbUJBQU8sQ0FBQyxzREFBUTtBQUMzQixxQkFBcUIsc0ZBQWdDO0FBQ3JELHdCQUF3QixtQkFBTyxDQUFDLDhFQUF1QjtBQUN2RCx1QkFBdUIsd0ZBQWtDO0FBQ3pELG1CQUFtQixtQkFBTyxDQUFDLGtFQUFpQjtBQUM1Qyx3QkFBd0IsbUJBQU8sQ0FBQyw4RUFBdUI7QUFDdkQsdUJBQXVCLG1CQUFPLENBQUMsMEVBQXFCO0FBQ3BELFlBQVksbUJBQU8sQ0FBQyx3REFBUztBQUM3QixlQUFlLG1CQUFPLENBQUMsOERBQVk7QUFDbkMsV0FBVyxtQkFBTyxDQUFDLGdEQUFRO0FBQzNCLFlBQVkscUZBQTJCOztBQUV2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4Qyw2QkFBNkI7QUFDM0UsNENBQTRDLCtCQUErQjtBQUMzRSw0Q0FBNEMsbUNBQW1DO0FBQy9FLEdBQUc7QUFDSDs7QUFFQTtBQUNBLGtEQUFrRCw0QkFBNEI7QUFDOUUsa0RBQWtELHFCQUFxQjtBQUN2RSxrREFBa0QsaUJBQWlCO0FBQ25FLGtEQUFrRCxzQkFBc0I7QUFDeEUsa0RBQWtELG1DQUFtQztBQUNyRixrREFBa0QsNEJBQTRCO0FBQzlFLGtEQUFrRCxzQkFBc0I7QUFDeEUsa0RBQWtELDBCQUEwQjtBQUM1RSxrREFBa0Qsb0JBQW9CO0FBQ3RFLGtEQUFrRCxzQkFBc0I7QUFDeEUsa0RBQWtELDRCQUE0QjtBQUM5RSxrREFBa0QsbUJBQW1CO0FBQ3JFLGtEQUFrRCx1QkFBdUI7QUFDekUsa0RBQWtELHVCQUF1QjtBQUN6RSxrREFBa0QsV0FBVztBQUM3RCxrREFBa0QscUJBQXFCO0FBQ3ZFLGtEQUFrRCw2QkFBNkI7QUFDL0Usa0RBQWtELGNBQWM7QUFDaEUsa0RBQWtELHVCQUF1QjtBQUN6RSxrREFBa0QsdUJBQXVCO0FBQ3pFLGtEQUFrRCxvQkFBb0I7QUFDdEUsa0RBQWtELDBCQUEwQjtBQUM1RSxrREFBa0QsMkJBQTJCO0FBQzdFLGtEQUFrRCxvQkFBb0I7QUFDdEUsa0RBQWtELDBCQUEwQjtBQUM1RSxrREFBa0QsbUNBQW1DO0FBQ3JGLGtEQUFrRCxrQkFBa0I7QUFDcEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isa0NBQWtDO0FBQ3hEOztBQUVBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDLHlCQUF5QjtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLDRCQUE0QjtBQUM1Qiw0QkFBNEI7QUFDNUIsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZEO0FBQzdELDZEQUE2RDtBQUM3RDtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHdCQUF3QjtBQUNwRDtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNI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OztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLGNBQWM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsbUNBQW1DLDBCQUEwQjtBQUNwSDtBQUNBLEtBQUs7QUFDTDtBQUNBLHNDQUFzQyxXQUFXO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsV0FBVztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Es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O0FBQ0E7QUFDQTs7QUFFQSxxR0FBcUc7QUFDckc7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLG9CQUFvQixrQkFBa0I7QUFDdEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0EsaUNBQWlDLGdDQUFtQjs7QUFFcEQ7OztBQUdBLHNCQUFzQixnQ0FBbUI7O0FBRXpDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0EsaUNBQWlDLGdDQUFtQjs7QUFFcEQ7OztBQUdBLG1CQUFtQixnQ0FBbUI7QUFDdEMsY0FBYyxnQ0FBbUI7QUFDakMsc0JBQXNCLGdDQUFtQjtBQUN6QyxvQkFBb0IsZ0NBQW1CO0FBQ3ZDLFlBQVksZ0NBQW1CO0FBQy9CLFlBQVksZ0NBQW1CO0FBQy9CLGlCQUFpQixnQ0FBbUI7QUFDcEMsWUFBWSxnQ0FBbUI7QUFDL0IsaUJBQWlCLGdDQUFtQjs7QUFFcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxrQkFBa0IsT0FBTztBQUN6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixVQUFVO0FBQzlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQSxpQ0FBaUMsZ0NBQW1COztBQUVwRDs7O0FBR0E7QUFDQSxZQUFZLGdDQUFtQjs7QUFFL0I7QUFDQSxXQUFXLGdDQUFtQixLQUFLO0FBQ25DOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsbUJBQW1CO0FBQ3ZDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQSxJQUFJOztBQUVKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsMEJBQTBCO0FBQzVDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLE9BQU87QUFDUDtBQUNBLGlDQUFpQyxnQ0FBbUI7O0FBRXBEOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsWUFBWSxnQ0FBbUI7O0FBRS9COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0EscUdBQXFHLHFCQUFxQixt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QTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbURBQW1EOztBQUVuRDtBQUNBLDhDQUE4Qzs7QUFFOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQyxzRUFBc0U7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxrRUFBa0U7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGNBQWMsT0FBTzs7QUFFckI7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxHQUFHO0FBQ2QsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixZQUFZLFNBQVM7QUFDckIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixZQUFZLFNBQVM7QUFDckIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNJO0FBQ0k7QUFDWjtBQUNOO0FBQ0Y7QUFDTTtBQUNSO0FBQ007QUFDRjtBQUNBO0FBQ0E7QUFDSjtBQUNVO0FBQ0Y7QUFDVTtBQUNaO0FBQ047QUFDTTtBQUNvQjtBQUNoQjtBQUNKO0FBQ0k7QUFDZDtBQUNFO0FBQ0E7QUFDSTtBQUNJO0FBQ047QUFDVTtBQUNGO0FBQ0o7QUFDTjtBQUNVO0FBQ0Y7QUFDQTtBQUNOO0FBQ1U7QUFDTjtBQUNNO0FBQ007QUFDRjtBQUNkO0FBQ0k7QUFDTTtBQUNKO0FBQ1Y7QUFDVTtBQUNKO0FBQ007QUFDUjtBQUNBO0FBQ0E7QUFDSTtBQUNKO0FBQ2M7QUFDVjtBQUNKO0FBQ1U7QUFDRjtBQUNBO0FBQ1I7QUFDRTtBQUNOO0FBQ0U7QUFDQTtBQUNVO0FBQ1U7QUFDQTtBQUNoQjtBQUNJO0FBQ1I7QUFDSTtBQUNGO0FBQ0k7QUFDVTtBQUNOO0FBQ1U7QUFDRTtBQUNGO0FBQ007QUFDZDtBQUNFO0FBQ0Y7QUFDTTtBQUNsQjtBQUNJO0FBQ0U7QUFDUTtBQUNSO0FBQ0o7QUFDUTtBQUNSO0FBQ2tCO0FBQ2Q7QUFDSjtBQUNGO0FBQ0E7QUFDTTtBQUNWO0FBQ1E7QUFDTjtBQUNJO0FBQ0o7QUFDSTtBQUNKO0FBQ2M7QUFDVjtBQUNBO0FBQ007QUFDVTtBQUNOO0FBQ1Y7QUFDRTtBQUNFO0FBQ0E7QUFDYztBQUNsQjtBQUNNO0FBQ0Y7QUFDSjtBQUNRO0FBQ047QUFDSTtBQUNBO0FBQ0E7QUFDRjtBQUNKO0FBQ0k7QUFDQTtBQUNBO0FBQ2M7QUFDaEI7QUFDQTtBQUNFO0FBQ0k7QUFDTTtBQUNBO0FBQ1I7QUFDRjtBQUNBO0FBQ0E7QUFDRTtBQUNBO0FBQ047QUFDUTtBQUNWO0FBQ0k7QUFDRjtBQUNJO0FBQ0k7QUFDTjtBQUNJO0FBQ007QUFDRjtBQUNRO0FBQ047QUFDSjtBQUNWO0FBQ0U7QUFDOEI7QUFDUTtBQUN0QztBQUNBO0FBQ1E7QUFDVTtBQUNSO0FBQ1o7QUFDRTtBQUNNO0FBQ0o7QUFDSTtBQUNBO0FBQ0k7QUFDRjtBQUNGO0FBQ0k7QUFDQTtBQUNGO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRCxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1IsNEVBQTRFO0FBQzVFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRCQUE0QixxQkFBcUI7QUFDakQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQSxxQ0FBcUMsMEJBQTBCO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBNkIsMEJBQTBCLGVBQWU7QUFDdEU7O0FBRU87QUFDUDtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQzVsQjRDOztBQUU1QztBQUNBdHBFLE1BQU0sQ0FBQ3lqQixZQUFZLEdBQUdBLHVEQUFZLEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BwbG90bHkvZGFzaC1jb21wb25lbnQtcGx1Z2lucy9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9pY29ucy9CZWxsSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0NoZWNrSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0Nsb2NrSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0NvbGxhcHNlSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0RlYnVnSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0dyYXBoSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL09mZkljb24uc3ZnIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvQXBwUHJvdmlkZXIucmVhY3QudHN4Iiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvU3RvcmVPYnNlcnZlci50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvY2FsbGJhY2tzLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9kZXBlbmRlbmNpZXNfdHMudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2lzTG9hZGluZy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvbG9hZGluZ01hcC50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvcGF0Y2gudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL3JlcXVlc3REZXBlbmRlbmNpZXMudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb25maWcudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9vYnNlcnZlcnMvZG9jdW1lbnRUaXRsZS50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL29ic2VydmVycy9leGVjdXRlZENhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL29ic2VydmVycy9leGVjdXRpbmdDYWxsYmFja3MudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9vYnNlcnZlcnMvaXNMb2FkaW5nLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvb2JzZXJ2ZXJzL2xvYWRpbmdNYXAudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9vYnNlcnZlcnMvcHJpb3JpdGl6ZWRDYWxsYmFja3MudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9vYnNlcnZlcnMvcmVxdWVzdGVkQ2FsbGJhY2tzLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvb2JzZXJ2ZXJzL3N0b3JlZENhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2NhbGxiYWNrSm9icy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2NhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2lzTG9hZGluZy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2xvYWRpbmdNYXAudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9zdG9yZS50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3V0aWxzL1RyZWVDb250YWluZXIudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy91dGlscy9jYWxsYmFja3MudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy91dGlscy93YWl0LnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvQVBJQ29udHJvbGxlci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL0FwcENvbnRhaW5lci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL0Rhc2hSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL1RyZWVDb250YWluZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2FwaS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvY29uc3RhbnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9kZXBlbmRlbmNpZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9pc0FwcFJlYWR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9wYXRocy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jaGVja1Byb3BUeXBlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvY29yZS9Mb2FkaW5nLnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9jb3JlL1JlbG9hZGVyLnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9jb3JlL1Rvb2xiYXIucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0NhbGxiYWNrR3JhcGgvQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvQ2FsbGJhY2tHcmFwaC9DYWxsYmFja0dyYXBoQ29udGFpbmVyU3R5bGVzaGVldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvQ2FsbGJhY2tHcmFwaC9DYWxsYmFja0dyYXBoRWZmZWN0cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvQ29tcG9uZW50RXJyb3JCb3VuZGFyeS5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvRnJvbnRFbmQvRnJvbnRFbmRFcnJvci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvRnJvbnRFbmQvRnJvbnRFbmRFcnJvckNvbnRhaW5lci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvR2xvYmFsRXJyb3JDb250YWluZXIucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0dsb2JhbEVycm9yT3ZlcmxheS5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9EZWJ1Z01lbnUucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL3dlcmt6ZXVnY3NzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29uc3RhbnRzL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2V4Y2VwdGlvbnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9pc1NpbXBsZUNvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3BlcnNpc3RlbmNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvYXBpLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvYXBwTGlmZWN5Y2xlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvY2hhbmdlZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2NvbmZpZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2RlcGVuZGVuY3lHcmFwaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2Vycm9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvaGlzdG9yeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2hvb2tzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvbGF5b3V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvcGF0aHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9wcm9maWxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvcmVkdWNlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZ2lzdHJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY3l0b3NjYXBlLWZjb3NlL2N5dG9zY2FwZS1mY29zZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4uL3NyYy90eXBlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4uL3NyYy9kaWZmLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi4vc3JjL2pzb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uLi9zcmMvZGVmYXVsdHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uLi9zcmMvcGF0Y2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uLi9zcmMvY29tcG9uZW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29tcG9uZW50cy9Db250ZXh0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29tcG9uZW50cy9Qcm92aWRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2NvbXBvbmVudHMvY29ubmVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3QvaW52YWxpZEFyZ0ZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L21hcERpc3BhdGNoVG9Qcm9wcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3QvbWFwU3RhdGVUb1Byb3BzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9tZXJnZVByb3BzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9zZWxlY3RvckZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L3ZlcmlmeVN1YnNlbGVjdG9ycy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3Qvd3JhcE1hcFRvUHJvcHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9leHBvcnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvaG9va3MvdXNlRGlzcGF0Y2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9ob29rcy91c2VSZWR1eENvbnRleHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9ob29rcy91c2VTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2hvb2tzL3VzZVN0b3JlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy90eXBlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL1N1YnNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL2JhdGNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvYmluZEFjdGlvbkNyZWF0b3JzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvaXNQbGFpbk9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL3JlYWN0QmF0Y2hlZFVwZGF0ZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy9zaGFsbG93RXF1YWwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvdXNlU3luY0V4dGVybmFsU3RvcmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy92ZXJpZnlQbGFpbk9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL3dhcm5pbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hcGF0aHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2FzaGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hdGVsaWVyLWR1bmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2F0ZWxpZXItZm9yZXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hdGVsaWVyLWhlYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hdGVsaWVyLWxha2VzaWRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hdGVsaWVyLXNlYXNpZGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2Jlc3Bpbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYnJld2VyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9icmlnaHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2NoYWxrLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9jb2Rlc2Nob29sLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9jb2xvcnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2RlZmF1bHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2VpZ2h0aWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9lbWJlcnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2ZsYXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2dvb2dsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvZ3JheXNjYWxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9ncmVlbnNjcmVlbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvaGFybW9uaWMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2hvcHNjb3RjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2lzb3RvcGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL21hcnJha2VzaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvbW9jaGEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL21vbm9rYWkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL29jZWFuLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9wYXJhaXNvLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9wb3AuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3JhaWxzY2FzdHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3NoYXBlc2hpZnRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvc29sYXJpemVkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9zdW1tZXJmcnVpdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvdGhyZWV6ZXJvdHdvZm91ci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvdG9tb3Jyb3cuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3R1YmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3R3aWxpZ2h0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9jb252ZXJzaW9ucy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2NvbG9yLWNvbnZlcnQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jb2xvci1jb252ZXJ0L3JvdXRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY29sb3ItbmFtZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2NvbG9yLXN0cmluZy9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2NvbG9yL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY29va2llL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY29zZS1iYXNlL2Nvc2UtYmFzZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvY29yZS9Ub29sYmFyLmNzcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvQ2FsbGJhY2tHcmFwaC9DYWxsYmFja0dyYXBoQ29udGFpbmVyLmNzcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvRnJvbnRFbmQvRnJvbnRFbmRFcnJvci5jc3MiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0dsb2JhbEVycm9yT3ZlcmxheS5jc3MiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL1BlcmN5LmNzcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9EZWJ1Z01lbnUuY3NzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2N5dG9zY2FwZS1kYWdyZS9jeXRvc2NhcGUtZGFncmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jeXRvc2NhcGUvZGlzdC9jeXRvc2NhcGUuY2pzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvYWN5Y2xpYy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9hZGQtYm9yZGVyLXNlZ21lbnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL2Nvb3JkaW5hdGUtc3lzdGVtLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL2RhdGEvbGlzdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9kZWJ1Zy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9ncmFwaGxpYi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9ncmVlZHktZmFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL2xheW91dC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9sb2Rhc2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvbmVzdGluZy1ncmFwaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9ub3JtYWxpemUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvYWRkLXN1YmdyYXBoLWNvbnN0cmFpbnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2JhcnljZW50ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvYnVpbGQtbGF5ZXItZ3JhcGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvY3Jvc3MtY291bnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvaW5pdC1vcmRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9vcmRlci9yZXNvbHZlLWNvbmZsaWN0cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9vcmRlci9zb3J0LXN1YmdyYXBoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL3NvcnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcGFyZW50LWR1bW15LWNoYWlucy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9wb3NpdGlvbi9iay5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9wb3NpdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9yYW5rL2ZlYXNpYmxlLXRyZWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcmFuay9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9yYW5rL25ldHdvcmstc2ltcGxleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9yYW5rL3V0aWwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvdXRpbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi92ZXJzaW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGVwZW5kZW5jeS1ncmFwaC9saWIvZGVwX2dyYXBoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZmFzdC1pc251bWVyaWMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvY29tcG9uZW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvZGZzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9kaWprc3RyYS1hbGwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2RpamtzdHJhLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9maW5kLWN5Y2xlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvZmxveWQtd2Fyc2hhbGwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9pcy1hY3ljbGljLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9wb3N0b3JkZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL3ByZW9yZGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9wcmltLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy90YXJqYW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL3RvcHNvcnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvZGF0YS9wcmlvcml0eS1xdWV1ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9ncmFwaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9qc29uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2xvZGFzaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi92ZXJzaW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvaGVhcC9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2hlYXAvbGliL2hlYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ob2lzdC1ub24tcmVhY3Qtc3RhdGljcy9kaXN0L2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzLmNqcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2ludmFyaWFudC9icm93c2VyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvaXMtc3RyaW5nLWJsYW5rL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbGF5b3V0LWJhc2UvbGF5b3V0LWJhc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2guY3VycnkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX0RhdGFWaWV3LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19IYXNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19MaXN0Q2FjaGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX01hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fTWFwQ2FjaGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1Byb21pc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1NldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fU2V0Q2FjaGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1N0YWNrLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TeW1ib2wuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1VpbnQ4QXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1dlYWtNYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FwcGx5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUVhY2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5RmlsdGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUluY2x1ZGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUluY2x1ZGVzV2l0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlMaWtlS2V5cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlNYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5UHVzaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlSZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5U29tZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNjaWlTaXplLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc3NpZ25NZXJnZVZhbHVlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc3NpZ25WYWx1ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNzb2NJbmRleE9mLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQXNzaWduLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQXNzaWduSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VBc3NpZ25WYWx1ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUNsb25lLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQ3JlYXRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRWFjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUV4dHJlbXVtLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRmlsdGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRmluZEluZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRmxhdHRlbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUZvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUZvck93bi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldEFsbEtleXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRUYWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUhhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUhhc0luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSW5kZXhPZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzQXJndW1lbnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNFcXVhbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzRXF1YWxEZWVwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNNYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc01hdGNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNOYU4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc05hdGl2ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNUeXBlZEFycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXRlcmF0ZWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VLZXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlS2V5c0luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNYXRjaGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTWF0Y2hlc1Byb3BlcnR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTWVyZ2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNZXJnZURlZXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VPcmRlckJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUGljay5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVBpY2tCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVByb3BlcnR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUHJvcGVydHlEZWVwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUmFuZ2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VSZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VSZXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlU2V0VG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VTb3J0QnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VUaW1lcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRvU3RyaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVHJpbS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVVuYXJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5pcS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVZhbHVlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVppcE9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2FjaGVIYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nhc3RGdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2FzdFBhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lQXJyYXlCdWZmZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lQnVmZmVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZURhdGFWaWV3LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZVJlZ0V4cC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVTeW1ib2wuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29tcGFyZUFzY2VuZGluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29tcGFyZU11bHRpcGxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3B5QXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlPYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlTeW1ib2xzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3B5U3ltYm9sc0luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3JlSnNEYXRhLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVBc3NpZ25lci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlQmFzZUVhY2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUJhc2VGb3IuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUZpbmQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZVJhbmdlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVTZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbEFycmF5cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZXF1YWxCeVRhZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZXF1YWxPYmplY3RzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19mbGF0UmVzdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZnJlZUdsb2JhbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0QWxsS2V5cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0QWxsS2V5c0luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRNYXBEYXRhLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRNYXRjaERhdGEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE5hdGl2ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0UHJvdG90eXBlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRSYXdUYWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFN5bWJvbHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFN5bWJvbHNJbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0VGFnLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRWYWx1ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzUGF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzVW5pY29kZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaENsZWFyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoRGVsZXRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoR2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoSGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pbml0Q2xvbmVBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faW5pdENsb25lQnlUYWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2luaXRDbG9uZU9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNGbGF0dGVuYWJsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNJbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNJdGVyYXRlZUNhbGwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzS2V5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0tleWFibGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzTWFza2VkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc1Byb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNTdHJpY3RDb21wYXJhYmxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVDbGVhci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlRGVsZXRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVHZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUhhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUNsZWFyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZURlbGV0ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVHZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlSGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZVNldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWF0Y2hlc1N0cmljdENvbXBhcmFibGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21lbW9pemVDYXBwZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUNyZWF0ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbmF0aXZlS2V5cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbmF0aXZlS2V5c0luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19ub2RlVXRpbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb2JqZWN0VG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX292ZXJBcmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX292ZXJSZXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19yb290LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zYWZlR2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zZXRDYWNoZUFkZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0Q2FjaGVIYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldFRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldFRvU3RyaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zaG9ydE91dC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tDbGVhci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tEZWxldGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrR2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0hhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tTZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0cmljdEluZGV4T2YuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0cmluZ1NpemUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0cmluZ1RvUGF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fdG9LZXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3RvU291cmNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL190cmltbWVkRW5kSW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3VuaWNvZGVTaXplLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2Nsb25lLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2Nsb25lRGVlcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9jb25zdGFudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9kZWJvdW5jZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9kZWZhdWx0cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9lYWNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2VxLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9maW5kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZpbmRJbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9mbGF0dGVuLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZvckVhY2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZm9ySW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZ2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2hhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9oYXNJbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FyZ3VtZW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXlMaWtlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXlMaWtlT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQnVmZmVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzRW1wdHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNGdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0xlbmd0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc01hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdExpa2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNQbGFpbk9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1NldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1N5bWJvbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1R5cGVkQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNVbmRlZmluZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gva2V5cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9rZXlzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbGFzdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9tYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbWFwVmFsdWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL21heC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9tZW1vaXplLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL21lcmdlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL21pbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9taW5CeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9ub29wLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL25vdy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9waWNrLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3Byb3BlcnR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3JhbmdlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3JlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9zZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvc2l6ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9zb3J0QnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvc3R1YkFycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJGYWxzZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC90b0Zpbml0ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC90b0ludGVnZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9OdW1iZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9QYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvUGxhaW5PYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdHJhbnNmb3JtLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3VuaW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3VuaXF1ZUlkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC96aXBPYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJhc2UxNi1zdHlsaW5nL2xpYi9lc20vY29sb3JDb252ZXJ0ZXJzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtYmFzZTE2LXN0eWxpbmcvbGliL2VzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vSXRlbVJhbmdlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vSlNPTkFycmF5Tm9kZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL0pTT05BcnJvdy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL0pTT05JdGVyYWJsZU5vZGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9KU09OTmVzdGVkTm9kZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL0pTT05Ob2RlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vSlNPTk9iamVjdE5vZGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9KU09OVmFsdWVOb2RlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vY3JlYXRlU3R5bGluZ0Zyb21UaGVtZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL2dldENvbGxlY3Rpb25FbnRyaWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9vYmpUeXBlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vdGhlbWVzL3NvbGFyaXplZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlZHV4LWFjdGlvbnMvZXMvY3JlYXRlQWN0aW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVkdXgtYWN0aW9ucy9lcy91dGlscy9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlZHV4LWFjdGlvbnMvZXMvdXRpbHMvaXNGdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlZHV4LWFjdGlvbnMvZXMvdXRpbHMvaXNOdWxsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVkdXgtdGh1bmsvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWR1eC9lcy9yZWR1eC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3NpbXBsZS1zd2l6emxlL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvc2ltcGxlLXN3aXp6bGUvbm9kZV9tb2R1bGVzL2lzLWFycmF5aXNoL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9jb3JlL1Rvb2xiYXIuY3NzP2Q4MTMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0NhbGxiYWNrR3JhcGgvQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5jc3M/NThlMiIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvRnJvbnRFbmQvRnJvbnRFbmRFcnJvci5jc3M/YTkwMCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvR2xvYmFsRXJyb3JPdmVybGF5LmNzcz9hZDNkIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9QZXJjeS5jc3M/YWYzOCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9EZWJ1Z01lbnUuY3NzPzZkNTQiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0vd2l0aC1zZWxlY3Rvci5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL3NoaW0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltL3dpdGgtc2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci9leHRlcm5hbCB3aW5kb3cgXCJQcm9wVHlwZXNcIiIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL2V4dGVybmFsIHdpbmRvdyBcIlJlYWN0XCIiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci9leHRlcm5hbCB3aW5kb3cgXCJSZWFjdERPTVwiIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXJyYXlMaWtlVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FycmF5V2l0aEhvbGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXJyYXlXaXRob3V0SG9sZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVjay5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZ2V0UHJvdG90eXBlT2YuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2l0ZXJhYmxlVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vbm9uSXRlcmFibGVSZXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vbm9uSXRlcmFibGVTcHJlYWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcG9zc2libGVDb25zdHJ1Y3RvclJldHVybi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NldFByb3RvdHlwZU9mLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9QcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b1Byb3BlcnR5S2V5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9GLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvVC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL19fLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYWRkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYWRkSW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9hZGRJbmRleFJpZ2h0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYWRqdXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYWxsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYWxsUGFzcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2Fsd2F5cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2FuZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2FuZFRoZW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9hbnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9hbnlQYXNzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9hcGVydHVyZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2FwcGVuZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2FwcGx5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYXBwbHlTcGVjLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYXBwbHlUby5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2FzY2VuZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2Fzc29jLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYXNzb2NQYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYmluYXJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYmluZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2JvdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9jYWxsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvY2hhaW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9jbGFtcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2Nsb25lLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvY29sbGVjdEJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvY29tcGFyYXRvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2NvbXBsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9jb21wb3NlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvY29tcG9zZVdpdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9jb25kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvY29uc3RydWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvY29uc3RydWN0Ti5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2NvbnZlcmdlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvY291bnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9jb3VudEJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvY3VycnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9jdXJyeU4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9kZWMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9kZWZhdWx0VG8uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9kZXNjZW5kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZGlmZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2RpZmZlcmVuY2VXaXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZGlzc29jLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZGlzc29jUGF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2RpdmlkZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2Ryb3AuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9kcm9wTGFzdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2Ryb3BMYXN0V2hpbGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9kcm9wUmVwZWF0cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2Ryb3BSZXBlYXRzQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9kcm9wUmVwZWF0c1dpdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9kcm9wV2hpbGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9laXRoZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9lbXB0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2VuZHNXaXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZXFCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2VxUHJvcHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9lcXVhbHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9ldm9sdmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9maW5kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZmluZEluZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZmluZExhc3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9maW5kTGFzdEluZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZmxhdHRlbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ZsaXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9mb3JFYWNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZm9yRWFjaE9iakluZGV4ZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9mcm9tUGFpcnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9ncm91cEJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZ3JvdXBXaXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZ3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9ndGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9oYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9oYXNJbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2hhc1BhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9oZWFkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaWRlbnRpY2FsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pZkVsc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbmMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW5kZXhCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2luZGV4T2YuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbml0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW5uZXJKb2luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW5zZXJ0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW5zZXJ0QWxsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX1NldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19hcGVydHVyZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19hcml0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19hcnJheUZyb21JdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19hcnJheVJlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19hc3NlcnRQcm9taXNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2Fzc29jLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2NoZWNrRm9yTWV0aG9kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2Nsb25lLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2Nsb25lUmVnRXhwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2NvbXBsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY29uY2F0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2NyZWF0ZVBhcnRpYWxBcHBsaWNhdG9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2NyZWF0ZVJlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jdXJyeTEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY3VycnkyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2N1cnJ5My5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jdXJyeU4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2Rpc3NvYy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19kcm9wTGFzdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19kcm9wTGFzdFdoaWxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2VxdWFscy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fZmxhdENhdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19mb3JjZVJlZHVjZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fZnVuY3Rpb25OYW1lLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2hhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pbmNsdWRlc1dpdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faW5kZXhPZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc0FyZ3VtZW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc0FycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzQXJyYXlMaWtlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzRnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNJbnRlZ2VyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzTnVtYmVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzUGxhY2Vob2xkZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNSZWdFeHAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNTdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNUcmFuc2Zvcm1lci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc1R5cGVkQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fbWFrZUZsYXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fbWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX21vZGlmeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19vYmplY3RBc3NpZ24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fb2JqZWN0SXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fcGlwZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19wcm9tYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fcXVvdGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fcmVkdWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3JlZHVjZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fc3RlcENhdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL190b0lTT1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL190b1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194QXJyYXlSZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feFJlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194YWxsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hhbnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feGFwZXJ0dXJlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hjaGFpbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194ZHJvcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194ZHJvcExhc3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feGRyb3BMYXN0V2hpbGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feGRyb3BSZXBlYXRzV2l0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194ZHJvcFdoaWxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hmQmFzZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194ZmlsdGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hmaW5kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hmaW5kSW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feGZpbmRMYXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hmaW5kTGFzdEluZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3htYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feHByb21hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194cmVkdWNlQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feHNjYW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feHRha2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feHRha2VXaGlsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194dGFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3h1bmlxQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feHVuaXFXaXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3h3cmFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJzZWN0aW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJzcGVyc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRvLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW52ZXJ0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW52ZXJ0T2JqLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW52b2tlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2lzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaXNFbXB0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2lzTmlsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaXNOb3ROaWwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9qb2luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvanV4dC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2tleXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9rZXlzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9sYXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbGFzdEluZGV4T2YuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9sZW5ndGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9sZW5zLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbGVuc0luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbGVuc1BhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9sZW5zUHJvcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2xpZnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9saWZ0Ti5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2x0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbHRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWFwQWNjdW0uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tYXBBY2N1bVJpZ2h0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWFwT2JqSW5kZXhlZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21hdGNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWF0aE1vZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21heC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21heEJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWVhbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21lZGlhbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21lbW9pemVXaXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWVyZ2VBbGwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tZXJnZURlZXBMZWZ0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWVyZ2VEZWVwUmlnaHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tZXJnZURlZXBXaXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWVyZ2VEZWVwV2l0aEtleS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21lcmdlTGVmdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21lcmdlUmlnaHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tZXJnZVdpdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tZXJnZVdpdGhLZXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9taW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9taW5CeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21vZGlmeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21vZGlmeVBhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tb2R1bG8uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tb3ZlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbXVsdGlwbHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9uQXJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbmVnYXRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbm9uZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL25vdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL250aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL250aEFyZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL28uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9vYmpPZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL29mLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvb21pdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL29uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvb25jZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL29yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvb3RoZXJ3aXNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvb3Zlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3BhaXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wYXJ0aWFsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcGFydGlhbE9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3BhcnRpYWxSaWdodC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3BhcnRpdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3BhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wYXRoRXEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wYXRoT3IuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wYXRoU2F0aXNmaWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcGF0aHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9waWNrLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcGlja0FsbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3BpY2tCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3BpcGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9waXBlV2l0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3BsdWNrLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcHJlcGVuZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3Byb2R1Y3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wcm9qZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcHJvbWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcHJvcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3Byb3BFcS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3Byb3BJcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3Byb3BPci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3Byb3BTYXRpc2ZpZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wcm9wcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3JhbmdlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcmVkdWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcmVkdWNlQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9yZWR1Y2VSaWdodC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3JlZHVjZVdoaWxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcmVkdWNlZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3JlamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3JlbW92ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3JlcGVhdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3JlcGxhY2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9yZXZlcnNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvc2Nhbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3NlcXVlbmNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvc2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvc2xpY2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9zb3J0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvc29ydEJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvc29ydFdpdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9zcGxpdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3NwbGl0QXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9zcGxpdEV2ZXJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvc3BsaXRXaGVuLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvc3BsaXRXaGVuZXZlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3N0YXJ0c1dpdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9zdWJ0cmFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3N1bS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3N3YXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9zeW1tZXRyaWNEaWZmZXJlbmNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvc3ltbWV0cmljRGlmZmVyZW5jZVdpdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy90YWlsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdGFrZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3Rha2VMYXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdGFrZUxhc3RXaGlsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3Rha2VXaGlsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3RhcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3Rlc3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy90aHVua2lmeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3RpbWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdG9Mb3dlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3RvUGFpcnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy90b1BhaXJzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy90b1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3RvVXBwZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy90cmFuc2R1Y2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy90cmFuc3Bvc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy90cmF2ZXJzZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3RyaW0uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy90cnlDYXRjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3R5cGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy91bmFwcGx5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdW5hcnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy91bmN1cnJ5Ti5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3VuZm9sZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3VuaW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdW5pb25XaXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdW5pcS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3VuaXFCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3VuaXFXaXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdW5sZXNzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdW5uZXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdW50aWwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy91bndpbmQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy91cGRhdGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy91c2VXaXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdmFsdWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdmFsdWVzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy92aWV3LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvd2hlbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3doZXJlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvd2hlcmVBbnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy93aGVyZUVxLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvd2l0aG91dC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3hvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3hwcm9kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvemlwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvemlwT2JqLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvemlwV2l0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci93ZWJwYWNrL3J1bnRpbWUvbm9kZSBtb2R1bGUgZGVjb3JhdG9yIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvd2VicGFjay9ydW50aW1lL25vbmNlIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvd2hhdHdnLWZldGNoL2ZldGNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiIWZ1bmN0aW9uKGUsbil7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9bihyZXF1aXJlKFwicmVhY3RcIikpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wicmVhY3RcIl0sbik6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0c1tcImRhc2gtY29tcG9uZW50LXBsdWdpbnNcIl09bihyZXF1aXJlKFwicmVhY3RcIikpOmVbXCJkYXNoLWNvbXBvbmVudC1wbHVnaW5zXCJdPW4oZS5SZWFjdCl9KHdpbmRvdywoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPXt9O2Z1bmN0aW9uIHQocil7aWYobltyXSlyZXR1cm4gbltyXS5leHBvcnRzO3ZhciBvPW5bcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiBlW3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLHQpLG8ubD0hMCxvLmV4cG9ydHN9cmV0dXJuIHQubT1lLHQuYz1uLHQuZD1mdW5jdGlvbihlLG4scil7dC5vKGUsbil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4se2VudW1lcmFibGU6ITAsZ2V0OnJ9KX0sdC5yPWZ1bmN0aW9uKGUpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LHQudD1mdW5jdGlvbihlLG4pe2lmKDEmbiYmKGU9dChlKSksOCZuKXJldHVybiBlO2lmKDQmbiYmXCJvYmplY3RcIj09dHlwZW9mIGUmJmUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKHQucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTplfSksMiZuJiZcInN0cmluZ1wiIT10eXBlb2YgZSlmb3IodmFyIG8gaW4gZSl0LmQocixvLGZ1bmN0aW9uKG4pe3JldHVybiBlW25dfS5iaW5kKG51bGwsbykpO3JldHVybiByfSx0Lm49ZnVuY3Rpb24oZSl7dmFyIG49ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIHQuZChuLFwiYVwiLG4pLG59LHQubz1mdW5jdGlvbihlLG4pe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKX0sdC5wPVwiXCIsdCh0LnM9MSl9KFtmdW5jdGlvbihuLHQpe24uZXhwb3J0cz1lfSxmdW5jdGlvbihlLG4sdCl7XCJ1c2Ugc3RyaWN0XCI7dC5yKG4pLHQuZChuLFwiYXN5bmNEZWNvcmF0b3JcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdX0pKSx0LmQobixcImluaGVyaXRBc3luY0RlY29yYXRvclwiLChmdW5jdGlvbigpe3JldHVybiBhfSkpLHQuZChuLFwiaXNSZWFkeVwiLChmdW5jdGlvbigpe3JldHVybiBjfSkpLHQuZChuLFwiSGlzdG9yeVwiLChmdW5jdGlvbigpe3JldHVybiBkfSkpO3ZhciByPXQoMCk7ZnVuY3Rpb24gbyhlLG4sdCxyLG8saSx1KXt0cnl7dmFyIGE9ZVtpXSh1KSxjPWEudmFsdWV9Y2F0Y2goZSl7cmV0dXJuIHZvaWQgdChlKX1hLmRvbmU/bihjKTpQcm9taXNlLnJlc29sdmUoYykudGhlbihyLG8pfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcyx0PWFyZ3VtZW50cztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsaSl7dmFyIHU9ZS5hcHBseShuLHQpO2Z1bmN0aW9uIGEoZSl7byh1LHIsaSxhLGMsXCJuZXh0XCIsZSl9ZnVuY3Rpb24gYyhlKXtvKHUscixpLGEsYyxcInRocm93XCIsZSl9YSh2b2lkIDApfSkpfX12YXIgdT1mdW5jdGlvbihlLG4pe3ZhciB0LG89e2lzUmVhZHk6bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe3Q9ZX0pKSxnZXQ6T2JqZWN0KHIubGF6eSkoKGZ1bmN0aW9uKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShuKCkpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBzZXRUaW1lb3V0KGkocmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLm5leHQ9Mix0KCEwKTtjYXNlIDI6by5pc1JlYWR5PSEwO2Nhc2UgMzpjYXNlXCJlbmRcIjpyZXR1cm4gZS5zdG9wKCl9fSksZSl9KSkpLDApLGV9KSl9KSl9O3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9kYXNocHJpdmF0ZV9pc0xhenlDb21wb25lbnRSZWFkeVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby5pc1JlYWR5fX0pLG8uZ2V0fSxhPWZ1bmN0aW9uKGUsbil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfZGFzaHByaXZhdGVfaXNMYXp5Q29tcG9uZW50UmVhZHlcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGMobil9fSl9LGM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuX2Rhc2hwcml2YXRlX2lzTGF6eUNvbXBvbmVudFJlYWR5fTtmdW5jdGlvbiBmKGUsbil7Zm9yKHZhciB0PTA7dDxuLmxlbmd0aDt0Kyspe3ZhciByPW5bdF07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX12YXIgcz1cIl9kYXNocHJpdmF0ZV9oaXN0b3J5Y2hhbmdlXCIsZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXshZnVuY3Rpb24oZSxuKXtpZighKGUgaW5zdGFuY2VvZiBuKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfSh0aGlzLGUpfXZhciBuLHQscjtyZXR1cm4gbj1lLHI9W3trZXk6XCJkaXNwYXRjaENoYW5nZUV2ZW50XCIsdmFsdWU6ZnVuY3Rpb24oKXt3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQocykpfX0se2tleTpcIm9uQ2hhbmdlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKHMsZSksZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIocyxlKX19fV0sKHQ9bnVsbCkmJmYobi5wcm90b3R5cGUsdCksciYmZihuLHIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLFwicHJvdG90eXBlXCIse3dyaXRhYmxlOiExfSksZX0oKX1dKX0pKTsiLCJ2YXIgX3BhdGg7XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIFN2Z0JlbGxJY29uID0gZnVuY3Rpb24gU3ZnQmVsbEljb24ocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDI4IDI0XCJcbiAgfSwgcHJvcHMpLCBfcGF0aCB8fCAoX3BhdGggPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGw6IFwiI2ZmZlwiLFxuICAgIGQ6IFwiTTguMTA3IDIuNDQgNi4yLjUzM0MzIDIuOTczLjg5MyA2LjczMy43MDcgMTFoMi42NjZhMTEuMjYgMTEuMjYgMCAwIDEgNC43MzQtOC41NlpNMjQuNjI3IDExaDIuNjY2Yy0uMi00LjI2Ny0yLjMwNi04LjAyNy01LjQ5My0xMC40NjdMMTkuOTA3IDIuNDRhMTEuMzI3IDExLjMyNyAwIDAgMSA0LjcyIDguNTZaTTIyIDExLjY2N2MwLTQuMDk0LTIuMTg3LTcuNTItNi04LjQyN1YuMzMzaC00VjMuMjRjLTMuODI3LjkwNy02IDQuMzItNiA4LjQyN3Y2LjY2NkwzLjMzMyAyMXYxLjMzM2gyMS4zMzNWMjFMMjIgMTguMzMzdi02LjY2NlptLTggMTQuNjY2Yy4xODcgMCAuMzYtLjAxMy41MzMtLjA1M2EyLjcwNSAyLjcwNSAwIDAgMCAxLjkyLTEuNTczYy4xMzQtLjMyLjItLjY2Ny4yLTEuMDRIMTEuMzJBMi42ODYgMi42ODYgMCAwIDAgMTQgMjYuMzMzWlwiXG4gIH0pKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgU3ZnQmVsbEljb247IiwidmFyIF9wYXRoO1xuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbnZhciBTdmdDaGVja0ljb24gPSBmdW5jdGlvbiBTdmdDaGVja0ljb24ocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDU0IDI0XCJcbiAgfSwgcHJvcHMpLCBfcGF0aCB8fCAoX3BhdGggPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHN0cm9rZTogXCIjZmZmXCIsXG4gICAgc3Ryb2tlV2lkdGg6IDQsXG4gICAgZDogXCJtMTUgMTIgOCA4TDM5IDRcIlxuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFN2Z0NoZWNrSWNvbjsiLCJ2YXIgX3BhdGg7XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIFN2Z0Nsb2NrSWNvbiA9IGZ1bmN0aW9uIFN2Z0Nsb2NrSWNvbihwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgdmlld0JveDogXCIwIDAgNTQgMjRcIlxuICB9LCBwcm9wcyksIF9wYXRoIHx8IChfcGF0aCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgc3Ryb2tlOiBcIiNmZmZcIixcbiAgICBzdHJva2VXaWR0aDogNCxcbiAgICBkOiBcIk0yNyAwdjIyaDIyXCJcbiAgfSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTdmdDbG9ja0ljb247IiwidmFyIF9wYXRoO1xuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbnZhciBTdmdDb2xsYXBzZUljb24gPSBmdW5jdGlvbiBTdmdDb2xsYXBzZUljb24ocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiAxMCxcbiAgICBoZWlnaHQ6IDYsXG4gICAgZmlsbDogXCJub25lXCJcbiAgfSwgcHJvcHMpLCBfcGF0aCB8fCAoX3BhdGggPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIHN0cm9rZTogXCIjQTJCMUM2XCIsXG4gICAgZDogXCJtMSAxIDQgNCA0LTRcIlxuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFN2Z0NvbGxhcHNlSWNvbjsiLCJ2YXIgX3BhdGg7XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIFN2Z0RlYnVnSWNvbiA9IGZ1bmN0aW9uIFN2Z0RlYnVnSWNvbihwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IDQyLFxuICAgIGhlaWdodDogMjQsXG4gICAgZmlsbDogXCJub25lXCJcbiAgfSwgcHJvcHMpLCBfcGF0aCB8fCAoX3BhdGggPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGw6IFwiI2ZmZlwiLFxuICAgIGQ6IFwiTTE0Ljg1IDIxLjE5NyA1LjYxNiAxMmw5LjIyNS05LjE5N0wxMi4wMjggMCAwIDEybDEyLjAzNyAxMiAyLjgxMy0yLjgwM1ptMTIuMyAwTDM2LjM3NSAxMiAyNy4xNSAyLjgwMyAyOS45NjMgMCA0MiAxMiAyOS45NjIgMjRsLTIuODEyLTIuODAzWlwiXG4gIH0pKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgU3ZnRGVidWdJY29uOyIsInZhciBfcGF0aDtcbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG52YXIgU3ZnR3JhcGhJY29uID0gZnVuY3Rpb24gU3ZnR3JhcGhJY29uKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB3aWR0aDogMjIsXG4gICAgaGVpZ2h0OiAyNCxcbiAgICBmaWxsOiBcIm5vbmVcIlxuICB9LCBwcm9wcyksIF9wYXRoIHx8IChfcGF0aCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbDogXCIjZmZmXCIsXG4gICAgZDogXCJNMTguMTAzIDE3LjAwNWMtLjkwOCAwLTEuNzU2LjMwMi0yLjM2Mi45MDVsLTguNjU3LTUuMDA1Yy4wNi0uMzAyLjEyLS41NDMuMTItLjg0NSAwLS4zMDEtLjA2LS41NDMtLjEyLS44NDRsOC41MzctNC45NDRhMy42NDQgMy42NDQgMCAwIDAgMi40ODIuOTY0YzEuOTk4IDAgMy42MzMtMS42MjggMy42MzMtMy42MThTMjAuMSAwIDE4LjEwMyAwIDE0LjQ3IDEuNjI4IDE0LjQ3IDMuNjE4YzAgLjMwMi4wNi41NDMuMTIyLjg0NUw2LjA1NSA5LjQwN2EzLjY0NCAzLjY0NCAwIDAgMC0yLjQ4My0uOTY1QzEuNTc0IDguNDQyIDAgMTAuMDcxIDAgMTIuMDZjMCAxLjk5IDEuNjM1IDMuNjE4IDMuNjMzIDMuNjE4Ljk2OCAwIDEuODE2LS4zNjEgMi40ODItLjk2NGw4LjU5OCA1LjAwNWMtLjA2MS4yNC0uMTIxLjQ4Mi0uMTIxLjc4NEEzLjUwNyAzLjUwNyAwIDAgMCAxOC4xMDIgMjRhMy41MDcgMy41MDcgMCAwIDAgMy41MTEtMy40OTcgMy41MDcgMy41MDcgMCAwIDAtMy41MS0zLjQ5OFpcIlxuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFN2Z0dyYXBoSWNvbjsiLCJ2YXIgX3BhdGg7XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIFN2Z09mZkljb24gPSBmdW5jdGlvbiBTdmdPZmZJY29uKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB2aWV3Qm94OiBcIjAgMCA1NCAyNFwiXG4gIH0sIHByb3BzKSwgX3BhdGggfHwgKF9wYXRoID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBzdHJva2U6IFwiI2ZmZlwiLFxuICAgIHN0cm9rZVdpZHRoOiA0LFxuICAgIGQ6IFwibTE4IDIgMTggMThtMC0xOEwxOCAyMFwiXG4gIH0pKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgU3ZnT2ZmSWNvbjsiLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgU3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgQXBwQ29udGFpbmVyIGZyb20gJy4vQXBwQ29udGFpbmVyLnJlYWN0JztcbmNvbnN0IEFwcFByb3ZpZGVyID0gKHsgaG9va3MgfSkgPT4ge1xuICAgIGNvbnN0IFt7IHN0b3JlIH1dID0gdXNlU3RhdGUoKCkgPT4gbmV3IFN0b3JlKCkpO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChQcm92aWRlciwgeyBzdG9yZTogc3RvcmUgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChBcHBDb250YWluZXIsIHsgaG9va3M6IGhvb2tzIH0pKSk7XG59O1xuQXBwUHJvdmlkZXIucHJvcFR5cGVzID0ge1xuICAgIGhvb2tzOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICBsYXlvdXRfcHJlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgbGF5b3V0X3Bvc3Q6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICByZXF1ZXN0X3ByZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIHJlcXVlc3RfcG9zdDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIGNhbGxiYWNrX3Jlc29sdmVkOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgcmVxdWVzdF9yZWZyZXNoX2p3dDogUHJvcFR5cGVzLmZ1bmNcbiAgICB9KVxufTtcbkFwcFByb3ZpZGVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgICBob29rczoge1xuICAgICAgICBsYXlvdXRfcHJlOiBudWxsLFxuICAgICAgICBsYXlvdXRfcG9zdDogbnVsbCxcbiAgICAgICAgcmVxdWVzdF9wcmU6IG51bGwsXG4gICAgICAgIHJlcXVlc3RfcG9zdDogbnVsbCxcbiAgICAgICAgY2FsbGJhY2tfcmVzb2x2ZWQ6IG51bGwsXG4gICAgICAgIHJlcXVlc3RfcmVmcmVzaF9qd3Q6IG51bGxcbiAgICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgQXBwUHJvdmlkZXI7XG4iLCJpbXBvcnQgeyBhbnksIGZpbHRlciwgbWFwLCBwYXRoIH0gZnJvbSAncmFtZGEnO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RvcmVPYnNlcnZlciB7XG4gICAgX3N0b3JlO1xuICAgIF91bnN1YnNjcmliZTtcbiAgICBfb2JzZXJ2ZXJzID0gW107XG4gICAgY29uc3RydWN0b3Ioc3RvcmUpIHtcbiAgICAgICAgdGhpcy5fX2luaXRfXyhzdG9yZSk7XG4gICAgfVxuICAgIG9ic2VydmUgPSAob2JzZXJ2ZXIsIGlucHV0cykgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIG9ic2VydmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXRzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW5wdXRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWRkKG9ic2VydmVyLCBpbnB1dHMpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHRoaXMucmVtb3ZlKG9ic2VydmVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZChvYnNlcnZlci5vYnNlcnZlciwgb2JzZXJ2ZXIuaW5wdXRzKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHRoaXMucmVtb3ZlKG9ic2VydmVyLm9ic2VydmVyKTtcbiAgICB9O1xuICAgIHNldFN0b3JlID0gKHN0b3JlKSA9PiB7XG4gICAgICAgIHRoaXMuX19maW5hbGl6ZV9fKCk7XG4gICAgICAgIHRoaXMuX19pbml0X18oc3RvcmUpO1xuICAgIH07XG4gICAgX19maW5hbGl6ZV9fID0gKCkgPT4gdGhpcy5fdW5zdWJzY3JpYmU/LigpO1xuICAgIF9faW5pdF9fID0gKHN0b3JlKSA9PiB7XG4gICAgICAgIHRoaXMuX3N0b3JlID0gc3RvcmU7XG4gICAgICAgIGlmIChzdG9yZSkge1xuICAgICAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUgPSBzdG9yZS5zdWJzY3JpYmUodGhpcy5ub3RpZnkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29ic2VydmVycy5mb3JFYWNoKG8gPT4ge1xuICAgICAgICAgICAgby5sYXN0U3RhdGUgPSBudWxsO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGFkZCA9IChvYnNlcnZlciwgaW5wdXRzKSA9PiB0aGlzLl9vYnNlcnZlcnMucHVzaCh7XG4gICAgICAgIGlucHV0UGF0aHM6IG1hcChwID0+IHAuc3BsaXQoJy4nKSwgaW5wdXRzKSxcbiAgICAgICAgbGFzdFN0YXRlOiBudWxsLFxuICAgICAgICBvYnNlcnZlcixcbiAgICAgICAgdHJpZ2dlcmVkOiBmYWxzZVxuICAgIH0pO1xuICAgIG5vdGlmeSA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLl9zdG9yZTtcbiAgICAgICAgaWYgKCFzdG9yZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgdHJpZ2dlcmVkID0gZmlsdGVyKG8gPT4gIW8udHJpZ2dlcmVkICYmXG4gICAgICAgICAgICBhbnkoaSA9PiBwYXRoKGksIHN0YXRlKSAhPT0gcGF0aChpLCBvLmxhc3RTdGF0ZSksIG8uaW5wdXRQYXRocyksIHRoaXMuX29ic2VydmVycyk7XG4gICAgICAgIHRyaWdnZXJlZC5mb3JFYWNoKG8gPT4ge1xuICAgICAgICAgICAgby50cmlnZ2VyZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgdHJpZ2dlcmVkLmZvckVhY2gobyA9PiB7XG4gICAgICAgICAgICBvLmxhc3RTdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICBvLm9ic2VydmVyKHN0b3JlKTtcbiAgICAgICAgICAgIG8udHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmVtb3ZlID0gKG9ic2VydmVyKSA9PiB0aGlzLl9vYnNlcnZlcnMuc3BsaWNlKHRoaXMuX29ic2VydmVycy5maW5kSW5kZXgobyA9PiBvYnNlcnZlciA9PT0gby5vYnNlcnZlciwgdGhpcy5fb2JzZXJ2ZXJzKSwgMSk7XG59XG4iLCJpbXBvcnQgeyBjb25jYXQsIGZsYXR0ZW4sIGludGVyc2VjdGlvbiwga2V5cywgbWFwLCBtZXJnZURlZXBSaWdodCwgcGF0aCwgcGljaywgcGx1Y2ssIHZhbHVlcywgdG9QYWlycywgemlwLCBhc3NvY1BhdGggfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBTVEFUVVMsIEpXVF9FWFBJUkVEX01FU1NBR0UgfSBmcm9tICcuLi9jb25zdGFudHMvY29uc3RhbnRzJztcbmltcG9ydCB7IE1BWF9BVVRIX1JFVFJJRVMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBDYWxsYmFja0FjdGlvblR5cGUsIENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZSB9IGZyb20gJy4uL3JlZHVjZXJzL2NhbGxiYWNrcyc7XG5pbXBvcnQgeyBpc011bHRpVmFsdWVkLCBzdHJpbmdpZnlJZCwgaXNNdWx0aU91dHB1dFByb3AgfSBmcm9tICcuL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyB1cmxCYXNlIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBnZXRDU1JGSGVhZGVyIH0gZnJvbSAnLic7XG5pbXBvcnQgeyBjcmVhdGVBY3Rpb24gfSBmcm9tICdyZWR1eC1hY3Rpb25zJztcbmltcG9ydCB7IGFkZEh0dHBIZWFkZXJzIH0gZnJvbSAnLi4vYWN0aW9ucyc7XG5pbXBvcnQgeyBub3RpZnlPYnNlcnZlcnMsIHVwZGF0ZVByb3BzIH0gZnJvbSAnLi9pbmRleCc7XG5pbXBvcnQgeyBoYW5kbGVQYXRjaCwgaXNQYXRjaCB9IGZyb20gJy4vcGF0Y2gnO1xuaW1wb3J0IHsgZ2V0UGF0aCB9IGZyb20gJy4vcGF0aHMnO1xuaW1wb3J0IHsgcmVxdWVzdERlcGVuZGVuY2llcyB9IGZyb20gJy4vcmVxdWVzdERlcGVuZGVuY2llcyc7XG5leHBvcnQgY29uc3QgYWRkQmxvY2tlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuQWRkQmxvY2tlZCk7XG5leHBvcnQgY29uc3QgYWRkQ29tcGxldGVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZS5BZGRDb21wbGV0ZWQpO1xuZXhwb3J0IGNvbnN0IGFkZEV4ZWN1dGVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5BZGRFeGVjdXRlZCk7XG5leHBvcnQgY29uc3QgYWRkRXhlY3V0aW5nQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5BZGRFeGVjdXRpbmcpO1xuZXhwb3J0IGNvbnN0IGFkZFByaW9yaXRpemVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5BZGRQcmlvcml0aXplZCk7XG5leHBvcnQgY29uc3QgYWRkUmVxdWVzdGVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5BZGRSZXF1ZXN0ZWQpO1xuZXhwb3J0IGNvbnN0IGFkZFN0b3JlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuQWRkU3RvcmVkKTtcbmV4cG9ydCBjb25zdCBhZGRXYXRjaGVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5BZGRXYXRjaGVkKTtcbmV4cG9ydCBjb25zdCByZW1vdmVFeGVjdXRlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlRXhlY3V0ZWQpO1xuZXhwb3J0IGNvbnN0IHJlbW92ZUJsb2NrZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZUJsb2NrZWQpO1xuZXhwb3J0IGNvbnN0IHJlbW92ZUV4ZWN1dGluZ0NhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlRXhlY3V0aW5nKTtcbmV4cG9ydCBjb25zdCByZW1vdmVQcmlvcml0aXplZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlUHJpb3JpdGl6ZWQpO1xuZXhwb3J0IGNvbnN0IHJlbW92ZVJlcXVlc3RlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlUmVxdWVzdGVkKTtcbmV4cG9ydCBjb25zdCByZW1vdmVTdG9yZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVN0b3JlZCk7XG5leHBvcnQgY29uc3QgcmVtb3ZlV2F0Y2hlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlV2F0Y2hlZCk7XG5leHBvcnQgY29uc3QgYWdncmVnYXRlQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZS5BZ2dyZWdhdGUpO1xuY29uc3QgdXBkYXRlUmVzb3VyY2VVc2FnZSA9IGNyZWF0ZUFjdGlvbignVVBEQVRFX1JFU09VUkNFX1VTQUdFJyk7XG5jb25zdCBhZGRDYWxsYmFja0pvYiA9IGNyZWF0ZUFjdGlvbignQUREX0NBTExCQUNLX0pPQicpO1xuY29uc3QgcmVtb3ZlQ2FsbGJhY2tKb2IgPSBjcmVhdGVBY3Rpb24oJ1JFTU9WRV9DQUxMQkFDS19KT0InKTtcbmNvbnN0IHNldENhbGxiYWNrSm9iT3V0ZGF0ZWQgPSBjcmVhdGVBY3Rpb24oJ0NBTExCQUNLX0pPQl9PVVREQVRFRCcpO1xuZnVuY3Rpb24gdW53cmFwSWZOb3RNdWx0aShwYXRocywgaWRQcm9wcywgc3BlYywgYW55VmFscywgZGVwVHlwZSkge1xuICAgIGxldCBtc2cgPSAnJztcbiAgICBpZiAoaXNNdWx0aVZhbHVlZChzcGVjKSkge1xuICAgICAgICByZXR1cm4gW2lkUHJvcHMsIG1zZ107XG4gICAgfVxuICAgIGlmIChpZFByb3BzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICBpZiAoIWlkUHJvcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBpc1N0ciA9IHR5cGVvZiBzcGVjLmlkID09PSAnc3RyaW5nJztcbiAgICAgICAgICAgIG1zZyA9XG4gICAgICAgICAgICAgICAgJ0Egbm9uZXhpc3RlbnQgb2JqZWN0IHdhcyB1c2VkIGluIGFuIGAnICtcbiAgICAgICAgICAgICAgICAgICAgZGVwVHlwZSArXG4gICAgICAgICAgICAgICAgICAgICdgIG9mIGEgRGFzaCBjYWxsYmFjay4gVGhlIGlkIG9mIHRoaXMgb2JqZWN0IGlzICcgK1xuICAgICAgICAgICAgICAgICAgICAoaXNTdHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ2AnICsgc3BlYy5pZCArICdgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBKU09OLnN0cmluZ2lmeShzcGVjLmlkKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFueVZhbHMgPyAnIHdpdGggTUFUQ0ggdmFsdWVzICcgKyBhbnlWYWxzIDogJycpKSArXG4gICAgICAgICAgICAgICAgICAgICcgYW5kIHRoZSBwcm9wZXJ0eSBpcyBgJyArXG4gICAgICAgICAgICAgICAgICAgIHNwZWMucHJvcGVydHkgK1xuICAgICAgICAgICAgICAgICAgICAoaXNTdHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ2AuIFRoZSBzdHJpbmcgaWRzIGluIHRoZSBjdXJyZW50IGxheW91dCBhcmU6IFsnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzKHBhdGhzLnN0cnMpLmpvaW4oJywgJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnYC4gVGhlIHdpbGRjYXJkIGlkcyBjdXJyZW50bHkgYXZhaWxhYmxlIGFyZSBsb2dnZWQgYWJvdmUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBtc2cgPVxuICAgICAgICAgICAgICAgICdNdWx0aXBsZSBvYmplY3RzIHdlcmUgZm91bmQgZm9yIGFuIGAnICtcbiAgICAgICAgICAgICAgICAgICAgZGVwVHlwZSArXG4gICAgICAgICAgICAgICAgICAgICdgIG9mIGEgY2FsbGJhY2sgdGhhdCBvbmx5IHRha2VzIG9uZSB2YWx1ZS4gVGhlIGlkIHNwZWMgaXMgJyArXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHNwZWMuaWQpICtcbiAgICAgICAgICAgICAgICAgICAgKGFueVZhbHMgPyAnIHdpdGggTUFUQ0ggdmFsdWVzICcgKyBhbnlWYWxzIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgJyBhbmQgdGhlIHByb3BlcnR5IGlzIGAnICtcbiAgICAgICAgICAgICAgICAgICAgc3BlYy5wcm9wZXJ0eSArXG4gICAgICAgICAgICAgICAgICAgICdgLiBUaGUgb2JqZWN0cyB3ZSBmb3VuZCBhcmU6ICcgK1xuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShtYXAocGljayhbJ2lkJywgJ3Byb3BlcnR5J10pLCBpZFByb3BzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtpZFByb3BzWzBdLCBtc2ddO1xufVxuZnVuY3Rpb24gZmlsbFZhbHMocGF0aHMsIGxheW91dCwgY2IsIHNwZWNzLCBkZXBUeXBlLCBhbGxvd0FsbE1pc3NpbmcgPSBmYWxzZSkge1xuICAgIGNvbnN0IGdldHRlciA9IGRlcFR5cGUgPT09ICdJbnB1dCcgPyBjYi5nZXRJbnB1dHMgOiBjYi5nZXRTdGF0ZTtcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICBsZXQgZW1wdHlNdWx0aVZhbHVlcyA9IDA7XG4gICAgY29uc3QgaW5wdXRWYWxzID0gZ2V0dGVyKHBhdGhzKS5tYXAoKGlucHV0TGlzdCwgaSkgPT4ge1xuICAgICAgICBjb25zdCBbaW5wdXRzLCBpbnB1dEVycm9yXSA9IHVud3JhcElmTm90TXVsdGkocGF0aHMsIGlucHV0TGlzdC5tYXAoKHsgaWQsIHByb3BlcnR5LCBwYXRoOiBwYXRoXyB9KSA9PiAoe1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIHZhbHVlOiBwYXRoKFsuLi5wYXRoXywgJ3Byb3BzJywgcHJvcGVydHldLCBsYXlvdXQpXG4gICAgICAgIH0pKSwgc3BlY3NbaV0sIGNiLmFueVZhbHMsIGRlcFR5cGUpO1xuICAgICAgICBpZiAoaXNNdWx0aVZhbHVlZChzcGVjc1tpXSkgJiYgIWlucHV0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVtcHR5TXVsdGlWYWx1ZXMrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wdXRFcnJvcikge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goaW5wdXRFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlucHV0cztcbiAgICB9KTtcbiAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICBpZiAoYWxsb3dBbGxNaXNzaW5nICYmXG4gICAgICAgICAgICBlcnJvcnMubGVuZ3RoICsgZW1wdHlNdWx0aVZhbHVlcyA9PT0gaW5wdXRWYWxzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSBhdCBsZWFzdCBvbmUgbm9uLW11bHRpdmFsdWVkIGlucHV0LCBidXQgYWxsIHNpbXBsZSBhbmRcbiAgICAgICAgICAgIC8vIG11bHRpLXZhbHVlZCBpbnB1dHMgYXJlIG1pc3NpbmcuXG4gICAgICAgICAgICAvLyAoaWYgYWxsIGlucHV0cyBhcmUgbXVsdGl2YWx1ZWQgYW5kIGFsbCBtaXNzaW5nIHdlIHN0aWxsIHJldHVyblxuICAgICAgICAgICAgLy8gdGhlbSBhcyBub3JtYWwsIGFuZCBmaXJlIHRoZSBjYWxsYmFjay4pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSB3ZSBoYXZlIHNvbWUgbWlzc2luZyBhbmQgc29tZSBwcmVzZW50IGlucHV0cy5cbiAgICAgICAgLy8gT3IgYWxsIG1pc3NpbmcgaW4gYSBjb250ZXh0IHRoYXQgZG9lc24ndCBhbGxvdyB0aGlzLlxuICAgICAgICAvLyBUaGF0J3MgYSByZWFsIHByb2JsZW0sIHNvIHRocm93IHRoZSBmaXJzdCBtZXNzYWdlIGFzIGFuIGVycm9yLlxuICAgICAgICByZWZFcnIoZXJyb3JzLCBwYXRocyk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dFZhbHM7XG59XG5mdW5jdGlvbiByZWZFcnIoZXJyb3JzLCBwYXRocykge1xuICAgIGNvbnN0IGVyciA9IGVycm9yc1swXTtcbiAgICBpZiAoZXJyLmluZGV4T2YoJ2xvZ2dlZCBhYm92ZScpICE9PSAtMSkge1xuICAgICAgICAvLyBXaWxkY2FyZCByZWZlcmVuY2UgZXJyb3JzIG1lbnRpb24gYSBsaXN0IG9mIHdpbGRjYXJkIHNwZWNzIGxvZ2dlZFxuICAgICAgICAvLyBUT0RPOiB1bndyYXBwZWQgbGlzdCBvZiB3aWxkY2FyZCBpZHM/XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IocGF0aHMub2Jqcyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihlcnIpO1xufVxuY29uc3QgZ2V0VmFscyA9IChpbnB1dCkgPT4gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBwbHVjaygndmFsdWUnLCBpbnB1dCkgOiBpbnB1dC52YWx1ZTtcbmNvbnN0IHppcElmQXJyYXkgPSAoYSwgYikgPT4gQXJyYXkuaXNBcnJheShhKSA/IHppcChhLCBiKSA6IFtbYSwgYl1dO1xuZnVuY3Rpb24gY2xlYW5PdXRwdXRQcm9wKHByb3BlcnR5KSB7XG4gICAgcmV0dXJuIHByb3BlcnR5LnNwbGl0KCdAJylbMF07XG59XG5hc3luYyBmdW5jdGlvbiBoYW5kbGVDbGllbnRzaWRlKGRpc3BhdGNoLCBjbGllbnRzaWRlX2Z1bmN0aW9uLCBjb25maWcsIHBheWxvYWQpIHtcbiAgICBjb25zdCBkYyA9ICh3aW5kb3cuZGFzaF9jbGllbnRzaWRlID1cbiAgICAgICAgd2luZG93LmRhc2hfY2xpZW50c2lkZSB8fCB7fSk7XG4gICAgaWYgKCFkYy5ub191cGRhdGUpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRjLCAnbm9fdXBkYXRlJywge1xuICAgICAgICAgICAgdmFsdWU6IHsgZGVzY3JpcHRpb246ICdSZXR1cm4gdG8gcHJldmVudCB1cGRhdGluZyBhbiBPdXRwdXQuJyB9LFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGMsICdQcmV2ZW50VXBkYXRlJywge1xuICAgICAgICAgICAgdmFsdWU6IHsgZGVzY3JpcHRpb246ICdUaHJvdyB0byBwcmV2ZW50IHVwZGF0aW5nIGFsbCBPdXRwdXRzLicgfSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgeyBpbnB1dHMsIG91dHB1dHMsIHN0YXRlIH0gPSBwYXlsb2FkO1xuICAgIGNvbnN0IHJlcXVlc3RUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBpbnB1dERpY3QgPSBpbnB1dHNUb0RpY3QoaW5wdXRzKTtcbiAgICBjb25zdCBzdGF0ZURpY3QgPSBpbnB1dHNUb0RpY3Qoc3RhdGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGxldCBzdGF0dXMgPSBTVEFUVVMuT0s7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBuYW1lc3BhY2UsIGZ1bmN0aW9uX25hbWUgfSA9IGNsaWVudHNpZGVfZnVuY3Rpb247XG4gICAgICAgIGxldCBhcmdzID0gaW5wdXRzLm1hcChnZXRWYWxzKTtcbiAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgICBhcmdzID0gY29uY2F0KGFyZ3MsIHN0YXRlLm1hcChnZXRWYWxzKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2V0dXAgY2FsbGJhY2sgY29udGV4dFxuICAgICAgICBkYy5jYWxsYmFja19jb250ZXh0ID0ge307XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQudHJpZ2dlcmVkID0gcGF5bG9hZC5jaGFuZ2VkUHJvcElkcy5tYXAocHJvcF9pZCA9PiAoe1xuICAgICAgICAgICAgcHJvcF9pZDogcHJvcF9pZCxcbiAgICAgICAgICAgIHZhbHVlOiBpbnB1dERpY3RbcHJvcF9pZF1cbiAgICAgICAgfSkpO1xuICAgICAgICBkYy5jYWxsYmFja19jb250ZXh0LmlucHV0c19saXN0ID0gaW5wdXRzO1xuICAgICAgICBkYy5jYWxsYmFja19jb250ZXh0LmlucHV0cyA9IGlucHV0RGljdDtcbiAgICAgICAgZGMuY2FsbGJhY2tfY29udGV4dC5zdGF0ZXNfbGlzdCA9IHN0YXRlO1xuICAgICAgICBkYy5jYWxsYmFja19jb250ZXh0LnN0YXRlcyA9IHN0YXRlRGljdDtcbiAgICAgICAgbGV0IHJldHVyblZhbHVlID0gZGNbbmFtZXNwYWNlXVtmdW5jdGlvbl9uYW1lXSguLi5hcmdzKTtcbiAgICAgICAgZGVsZXRlIGRjLmNhbGxiYWNrX2NvbnRleHQ7XG4gICAgICAgIGlmICh0eXBlb2YgcmV0dXJuVmFsdWU/LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVyblZhbHVlID0gYXdhaXQgcmV0dXJuVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgemlwSWZBcnJheShvdXRwdXRzLCByZXR1cm5WYWx1ZSkuZm9yRWFjaCgoW291dGksIHJldGldKSA9PiB7XG4gICAgICAgICAgICB6aXBJZkFycmF5KG91dGksIHJldGkpLmZvckVhY2goKFtvdXRpaiwgcmV0aWpdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBpZCwgcHJvcGVydHkgfSA9IG91dGlqO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkU3RyID0gc3RyaW5naWZ5SWQoaWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFGb3JJZCA9IChyZXN1bHRbaWRTdHJdID0gcmVzdWx0W2lkU3RyXSB8fCB7fSk7XG4gICAgICAgICAgICAgICAgaWYgKHJldGlqICE9PSBkYy5ub191cGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YUZvcklkW2NsZWFuT3V0cHV0UHJvcChwcm9wZXJ0eSldID0gcmV0aWo7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSA9PT0gZGMuUHJldmVudFVwZGF0ZSkge1xuICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTLlBSRVZFTlRfVVBEQVRFO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTLkNMSUVOVFNJREVfRVJST1I7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICBkZWxldGUgZGMuY2FsbGJhY2tfY29udGV4dDtcbiAgICAgICAgLy8gU2V0dGluZyBzZXJ2ZXIgPSBjbGllbnQgZm9yY2VzIG5ldHdvcmsgPSAwXG4gICAgICAgIGNvbnN0IHRvdGFsVGltZSA9IERhdGUubm93KCkgLSByZXF1ZXN0VGltZTtcbiAgICAgICAgY29uc3QgcmVzb3VyY2VzID0ge1xuICAgICAgICAgICAgX19kYXNoX3NlcnZlcjogdG90YWxUaW1lLFxuICAgICAgICAgICAgX19kYXNoX2NsaWVudDogdG90YWxUaW1lLFxuICAgICAgICAgICAgX19kYXNoX3VwbG9hZDogMCxcbiAgICAgICAgICAgIF9fZGFzaF9kb3dubG9hZDogMFxuICAgICAgICB9O1xuICAgICAgICBpZiAoY29uZmlnLnVpKSB7XG4gICAgICAgICAgICBkaXNwYXRjaCh1cGRhdGVSZXNvdXJjZVVzYWdlKHtcbiAgICAgICAgICAgICAgICBpZDogcGF5bG9hZC5vdXRwdXQsXG4gICAgICAgICAgICAgICAgdXNhZ2U6IHJlc291cmNlcyxcbiAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBzaWRlVXBkYXRlKG91dHB1dHMsIGRpc3BhdGNoLCBwYXRocykge1xuICAgIHRvUGFpcnMob3V0cHV0cykuZm9yRWFjaCgoW2lkLCB2YWx1ZV0pID0+IHtcbiAgICAgICAgY29uc3QgW2NvbXBvbmVudElkLCBwcm9wTmFtZV0gPSBpZC5zcGxpdCgnLicpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRQYXRoID0gcGF0aHMuc3Ryc1tjb21wb25lbnRJZF07XG4gICAgICAgIGRpc3BhdGNoKHVwZGF0ZVByb3BzKHtcbiAgICAgICAgICAgIHByb3BzOiB7IFtwcm9wTmFtZV06IHZhbHVlIH0sXG4gICAgICAgICAgICBpdGVtcGF0aDogY29tcG9uZW50UGF0aFxuICAgICAgICB9KSk7XG4gICAgICAgIGRpc3BhdGNoKG5vdGlmeU9ic2VydmVycyh7IGlkOiBjb21wb25lbnRJZCwgcHJvcHM6IHsgW3Byb3BOYW1lXTogdmFsdWUgfSB9KSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBoYW5kbGVTZXJ2ZXJzaWRlKGRpc3BhdGNoLCBob29rcywgY29uZmlnLCBwYXlsb2FkLCBwYXRocywgbG9uZywgYWRkaXRpb25hbEFyZ3MsIGdldFN0YXRlLCBvdXRwdXQpIHtcbiAgICBpZiAoaG9va3MucmVxdWVzdF9wcmUpIHtcbiAgICAgICAgaG9va3MucmVxdWVzdF9wcmUocGF5bG9hZCk7XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3RUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZCk7XG4gICAgbGV0IGNhY2hlS2V5O1xuICAgIGxldCBqb2I7XG4gICAgbGV0IHJ1bm5pbmdPZmY7XG4gICAgbGV0IHByb2dyZXNzRGVmYXVsdDtcbiAgICBsZXQgbW9yZUFyZ3MgPSBhZGRpdGlvbmFsQXJncztcbiAgICBjb25zdCBmZXRjaENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBoZWFkZXJzID0gZ2V0Q1NSRkhlYWRlcigpO1xuICAgICAgICBsZXQgdXJsID0gYCR7dXJsQmFzZShjb25maWcpfV9kYXNoLXVwZGF0ZS1jb21wb25lbnRgO1xuICAgICAgICBjb25zdCBhZGRBcmcgPSAobmFtZSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIGxldCBkZWxpbSA9ICc/JztcbiAgICAgICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJz8nKSkge1xuICAgICAgICAgICAgICAgIGRlbGltID0gJyYnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXJsID0gYCR7dXJsfSR7ZGVsaW19JHtuYW1lfT0ke3ZhbHVlfWA7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChjYWNoZUtleSkge1xuICAgICAgICAgICAgYWRkQXJnKCdjYWNoZUtleScsIGNhY2hlS2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoam9iKSB7XG4gICAgICAgICAgICBhZGRBcmcoJ2pvYicsIGpvYik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vcmVBcmdzKSB7XG4gICAgICAgICAgICBtb3JlQXJncy5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IGFkZEFyZyhrZXksIHZhbHVlKSk7XG4gICAgICAgICAgICBtb3JlQXJncyA9IG1vcmVBcmdzLmZpbHRlcigoW18sIF9fLCBzaW5nbGVdKSA9PiAhc2luZ2xlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmV0Y2godXJsLCBtZXJnZURlZXBSaWdodChjb25maWcuZmV0Y2gsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIGJvZHlcbiAgICAgICAgfSkpO1xuICAgIH07XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlT3V0cHV0ID0gKHJlcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBzdGF0dXMgfSA9IHJlcztcbiAgICAgICAgICAgIGlmIChqb2IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFja0pvYiA9IGdldFN0YXRlKCkuY2FsbGJhY2tKb2JzW2pvYl07XG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrSm9iPy5vdXRkYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChyZW1vdmVDYWxsYmFja0pvYih7IGpvYklkOiBqb2IgfSkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7fSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gcmVjb3JkUHJvZmlsZShyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnVpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENhbGxiYWNrIHByb2ZpbGluZyAtIG9ubHkgcmVsZXZhbnQgaWYgd2UncmUgc2hvd2luZyB0aGUgZGVidWcgdWlcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX3NlcnZlcjogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fZGFzaF9jbGllbnQ6IERhdGUubm93KCkgLSByZXF1ZXN0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fZGFzaF91cGxvYWQ6IGJvZHkubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX2Rvd25sb2FkOiBOdW1iZXIocmVzLmhlYWRlcnMuZ2V0KCdDb250ZW50LUxlbmd0aCcpKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1pbmdIZWFkZXJzID0gcmVzLmhlYWRlcnMuZ2V0KCdTZXJ2ZXItVGltaW5nJykgfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgIHRpbWluZ0hlYWRlcnMuc3BsaXQoJywnKS5mb3JFYWNoKChoZWFkZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBoZWFkZXIuc3BsaXQoJzsnKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR1ciA9IGhlYWRlci5tYXRjaCgvO2R1cj1bMC05Ll0rLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzW25hbWVdID0gTnVtYmVyKGR1clswXS5zbGljZSg1KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaCh1cGRhdGVSZXNvdXJjZVVzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBwYXlsb2FkLm91dHB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlOiByZXNvdXJjZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IHBheWxvYWQuaW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHBheWxvYWQuc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZpbmlzaExpbmUgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgbXVsdGksIHJlc3BvbnNlIH0gPSBkYXRhO1xuICAgICAgICAgICAgICAgIGlmIChob29rcy5yZXF1ZXN0X3Bvc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgaG9va3MucmVxdWVzdF9wb3N0KHBheWxvYWQsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAobXVsdGkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IG91dHB1dCB9ID0gcGF5bG9hZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSBvdXRwdXQuc3Vic3RyKDAsIG91dHB1dC5sYXN0SW5kZXhPZignLicpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0geyBbaWRdOiByZXNwb25zZS5wcm9wcyB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZWNvcmRQcm9maWxlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlSm9iID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChqb2IpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gocmVtb3ZlQ2FsbGJhY2tKb2IoeyBqb2JJZDogam9iIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJ1bm5pbmdPZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgc2lkZVVwZGF0ZShydW5uaW5nT2ZmLCBkaXNwYXRjaCwgcGF0aHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NEZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHNpZGVVcGRhdGUocHJvZ3Jlc3NEZWZhdWx0LCBkaXNwYXRjaCwgcGF0aHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSBTVEFUVVMuT0spIHtcbiAgICAgICAgICAgICAgICByZXMuanNvbigpLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWNoZUtleSAmJiBkYXRhLmNhY2hlS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZUtleSA9IGRhdGEuY2FjaGVLZXk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFqb2IgJiYgZGF0YS5qb2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpvYkluZm8gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iSWQ6IGRhdGEuam9iLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5OiBkYXRhLmNhY2hlS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbElucHV0czogZGF0YS5jYW5jZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NEZWZhdWx0OiBkYXRhLnByb2dyZXNzRGVmYXVsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChhZGRDYWxsYmFja0pvYihqb2JJbmZvKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBqb2IgPSBkYXRhLmpvYjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5wcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lkZVVwZGF0ZShkYXRhLnByb2dyZXNzLCBkaXNwYXRjaCwgcGF0aHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZGVVcGRhdGUoZGF0YS5ydW5uaW5nLCBkaXNwYXRjaCwgcGF0aHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghcnVubmluZ09mZiAmJiBkYXRhLnJ1bm5pbmdPZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmdPZmYgPSBkYXRhLnJ1bm5pbmdPZmY7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9ncmVzc0RlZmF1bHQgJiYgZGF0YS5wcm9ncmVzc0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzRGVmYXVsdCA9IGRhdGEucHJvZ3Jlc3NEZWZhdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghbG9uZyB8fCBkYXRhLnJlc3BvbnNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlSm9iKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hMaW5lKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUG9sbCBjaGFpbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoaGFuZGxlLCBsb25nLmludGVydmFsICE9PSB1bmRlZmluZWQgPyBsb25nLmludGVydmFsIDogNTAwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RhdHVzID09PSBTVEFUVVMuUFJFVkVOVF9VUERBVEUpIHtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZUpvYigpO1xuICAgICAgICAgICAgICAgIHJlY29yZFByb2ZpbGUoe30pO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoe30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29tcGxldGVKb2IoKTtcbiAgICAgICAgICAgICAgICByZWplY3QocmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaGFuZGxlRXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLnVpKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2godXBkYXRlUmVzb3VyY2VVc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBwYXlsb2FkLm91dHB1dCxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBTVEFUVVMuTk9fUkVTUE9OU0UsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDoge30sXG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogcGF5bG9hZC5pbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiBwYXlsb2FkLnN0YXRlXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQ2FsbGJhY2sgZmFpbGVkOiB0aGUgc2VydmVyIGRpZCBub3QgcmVzcG9uZC4nKSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGhhbmRsZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGZldGNoQ2FsbGJhY2soKS50aGVuKGhhbmRsZU91dHB1dCwgaGFuZGxlRXJyb3IpO1xuICAgICAgICB9O1xuICAgICAgICBoYW5kbGUoKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGlucHV0c1RvRGljdChpbnB1dHNfbGlzdCkge1xuICAgIC8vIFBvcnRlZCBkaXJlY3RseSBmcm9tIF91dGlscy5weSwgaW5wdXRzX3RvX2RpY3RcbiAgICAvLyB0YWtlcyBhbiBhcnJheSBvZiBpbnB1dHMgKHNvbWUgaW5wdXRzIG1heSBiZSBhbiBhcnJheSlcbiAgICAvLyByZXR1cm5zIGFuIE9iamVjdCAobWFwKTpcbiAgICAvLyAga2V5cyBvZiB0aGUgZm9ybSBgaWQucHJvcGVydHlgIG9yIGB7XCJpZFwiOiAwfS5wcm9wZXJ0eWBcbiAgICAvLyAgdmFsdWVzIGNvbnRhaW4gdGhlIHByb3BlcnR5IHZhbHVlXG4gICAgaWYgKCFpbnB1dHNfbGlzdCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRzX2xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXRzX2xpc3RbaV0pKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dHNpID0gaW5wdXRzX2xpc3RbaV07XG4gICAgICAgICAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgaW5wdXRzaS5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZF9zdHIgPSBgJHtzdHJpbmdpZnlJZChpbnB1dHNpW2lpXS5pZCl9LiR7aW5wdXRzaVtpaV0ucHJvcGVydHl9YDtcbiAgICAgICAgICAgICAgICBpbnB1dHNbaWRfc3RyXSA9IGlucHV0c2lbaWldLnZhbHVlID8/IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpZF9zdHIgPSBgJHtzdHJpbmdpZnlJZChpbnB1dHNfbGlzdFtpXS5pZCl9LiR7aW5wdXRzX2xpc3RbaV0ucHJvcGVydHl9YDtcbiAgICAgICAgICAgIGlucHV0c1tpZF9zdHJdID0gaW5wdXRzX2xpc3RbaV0udmFsdWUgPz8gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5wdXRzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVDYWxsYmFjayhjYiwgY29uZmlnLCBob29rcywgcGF0aHMsIGxheW91dCwgeyBhbGxPdXRwdXRzIH0sIGRpc3BhdGNoLCBnZXRTdGF0ZSkge1xuICAgIGNvbnN0IHsgb3V0cHV0LCBpbnB1dHMsIHN0YXRlLCBjbGllbnRzaWRlX2Z1bmN0aW9uLCBsb25nLCBkeW5hbWljX2NyZWF0b3IgfSA9IGNiLmNhbGxiYWNrO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGluVmFscyA9IGZpbGxWYWxzKHBhdGhzLCBsYXlvdXQsIGNiLCBpbnB1dHMsICdJbnB1dCcsIHRydWUpO1xuICAgICAgICAvKiBQcmV2ZW50IGNhbGxiYWNrIGlmIHRoZXJlJ3Mgbm8gaW5wdXRzICovXG4gICAgICAgIGlmIChpblZhbHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uY2IsXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uUHJvbWlzZTogbnVsbFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvdXRwdXRzID0gW107XG4gICAgICAgIGNvbnN0IG91dHB1dEVycm9ycyA9IFtdO1xuICAgICAgICBhbGxPdXRwdXRzLmZvckVhY2goKG91dCwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW291dGksIGVycmldID0gdW53cmFwSWZOb3RNdWx0aShwYXRocywgbWFwKHBpY2soWydpZCcsICdwcm9wZXJ0eSddKSwgb3V0KSwgY2IuY2FsbGJhY2sub3V0cHV0c1tpXSwgY2IuYW55VmFscywgJ091dHB1dCcpO1xuICAgICAgICAgICAgb3V0cHV0cy5wdXNoKG91dGkpO1xuICAgICAgICAgICAgaWYgKGVycmkpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRFcnJvcnMucHVzaChlcnJpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChvdXRwdXRFcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoZmxhdHRlbihpblZhbHMpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJlZkVycihvdXRwdXRFcnJvcnMsIHBhdGhzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoaXMgY2FzZSBpcyBhbGwtZW1wdHkgbXVsdGl2YWx1ZWQgd2lsZGNhcmQgaW5wdXRzLFxuICAgICAgICAgICAgLy8gd2hpY2ggd2Ugd291bGQgbm9ybWFsbHkgZmlyZSB0aGUgY2FsbGJhY2sgZm9yLCBleGNlcHRcbiAgICAgICAgICAgIC8vIHNvbWUgb3V0cHV0cyBhcmUgbWlzc2luZy4gU28gaW5zdGVhZCB3ZSB0cmVhdCBpdCBsaWtlXG4gICAgICAgICAgICAvLyByZWd1bGFyIG1pc3NpbmcgaW5wdXRzIGFuZCBqdXN0IHNpbGVudGx5IHByZXZlbnQgaXQuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvblByb21pc2U6IG51bGxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgX19leGVjdXRlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQsXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IGlzTXVsdGlPdXRwdXRQcm9wKG91dHB1dCkgPyBvdXRwdXRzIDogb3V0cHV0c1swXSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBpblZhbHMsXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWRQcm9wSWRzOiBrZXlzKGNiLmNoYW5nZWRQcm9wSWRzKSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IGNiLmNhbGxiYWNrLnN0YXRlLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBmaWxsVmFscyhwYXRocywgbGF5b3V0LCBjYiwgc3RhdGUsICdTdGF0ZScpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKGNsaWVudHNpZGVfZnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBoYW5kbGVDbGllbnRzaWRlKGRpc3BhdGNoLCBjbGllbnRzaWRlX2Z1bmN0aW9uLCBjb25maWcsIHBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YSwgcGF5bG9hZCB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3IsIHBheWxvYWQgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgbmV3Q29uZmlnID0gY29uZmlnO1xuICAgICAgICAgICAgICAgIGxldCBuZXdIZWFkZXJzID0gbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgbGFzdEVycm9yO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxBcmdzID0gW107XG4gICAgICAgICAgICAgICAgdmFsdWVzKGdldFN0YXRlKCkuY2FsbGJhY2tKb2JzKS5mb3JFYWNoKChqb2IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNiLmNhbGxiYWNrLm91dHB1dCA9PT0gam9iLm91dHB1dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVybWluYXRlIHRoZSBvbGQgam9icyB0aGF0IGFyZSBub3QgY29tcGxldGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgYXMgb3V0ZGF0ZWQgZm9yIHRoZSBjYWxsYmFjayBwcm9taXNlIHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNvbHZlIGFuZCByZW1vdmUgYWZ0ZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsQXJncy5wdXNoKFsnb2xkSm9iJywgam9iLmpvYklkLCB0cnVlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzZXRDYWxsYmFja0pvYk91dGRhdGVkKHsgam9iSWQ6IGpvYi5qb2JJZCB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFqb2IuY2FuY2VsSW5wdXRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXIgPSBpbnRlcnNlY3Rpb24oam9iLmNhbmNlbElucHV0cywgY2IuY2FsbGJhY2suaW5wdXRzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbEFyZ3MucHVzaChbJ2NhbmNlbEpvYicsIGpvYi5qb2JJZF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpvYi5wcm9ncmVzc0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlVXBkYXRlKGpvYi5wcm9ncmVzc0RlZmF1bHQsIGRpc3BhdGNoLCBwYXRocyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCByZXRyeSA9IDA7IHJldHJ5IDw9IE1BWF9BVVRIX1JFVFJJRVM7IHJldHJ5KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgaGFuZGxlU2VydmVyc2lkZShkaXNwYXRjaCwgaG9va3MsIG5ld0NvbmZpZywgcGF5bG9hZCwgcGF0aHMsIGxvbmcsIGFkZGl0aW9uYWxBcmdzLmxlbmd0aCA/IGFkZGl0aW9uYWxBcmdzIDogdW5kZWZpbmVkLCBnZXRTdGF0ZSwgY2IuY2FsbGJhY2sub3V0cHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdIZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goYWRkSHR0cEhlYWRlcnMobmV3SGVhZGVycykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGF5b3V0IG1heSBoYXZlIGNoYW5nZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGF5b3V0ID0gZ2V0U3RhdGUoKS5sYXlvdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbGF0dGVuKG91dHB1dHMpLmZvckVhY2goKG91dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gY2xlYW5PdXRwdXRQcm9wKG91dC5wcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0UGF0aCA9IGdldFBhdGgocGF0aHMsIG91dC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHBhdGgob3V0cHV0UGF0aC5jb25jYXQoWydwcm9wcycsIHByb3BOYW1lXSksIGN1cnJlbnRMYXlvdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFQYXRoID0gW3N0cmluZ2lmeUlkKG91dC5pZCksIHByb3BOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRWYWx1ZSA9IHBhdGgoZGF0YVBhdGgsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1BhdGNoKG91dHB1dFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBwYXRjaCB1bmRlZmluZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYXNzb2NQYXRoKGRhdGFQYXRoLCBoYW5kbGVQYXRjaChwcmV2aW91c1ZhbHVlLCBvdXRwdXRWYWx1ZSksIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5bmFtaWNfY3JlYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gZGlzcGF0Y2gocmVxdWVzdERlcGVuZGVuY2llcygpKSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhLCBwYXlsb2FkIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKHJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEVycm9yID0gcmVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHJ5IDw9IE1BWF9BVVRIX1JFVFJJRVMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzLnN0YXR1cyA9PT0gU1RBVFVTLlVOQVVUSE9SSVpFRCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc3RhdHVzID09PSBTVEFUVVMuQkFEX1JFUVVFU1QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHkuaW5jbHVkZXMoSldUX0VYUElSRURfTUVTU0FHRSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvb2tzLnJlcXVlc3RfcmVmcmVzaF9qd3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvbGRKd3QgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5mZXRjaC5oZWFkZXJzLkF1dGhvcml6YXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRKd3QgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZmV0Y2guaGVhZGVycy5BdXRob3JpemF0aW9uLnN1YnN0cignQmVhcmVyICcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0p3dCA9IGF3YWl0IGhvb2tzLnJlcXVlc3RfcmVmcmVzaF9qd3Qob2xkSnd0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdKd3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWFkZXJzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bmV3Snd0fWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbmZpZyA9IG1lcmdlRGVlcFJpZ2h0KGNvbmZpZywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogbmV3SGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB3ZSByZWFjaCBoZXJlIHdoZW4gd2UgcnVuIG91dCBvZiByZXRyaWVzLlxuICAgICAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBsYXN0RXJyb3IsIHBheWxvYWQ6IG51bGwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGVycm9yLCBwYXlsb2FkOiBudWxsIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5ld0NiID0ge1xuICAgICAgICAgICAgLi4uY2IsXG4gICAgICAgICAgICBleGVjdXRpb25Qcm9taXNlOiBfX2V4ZWN1dGUoKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3Q2I7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uY2IsXG4gICAgICAgICAgICBleGVjdXRpb25Qcm9taXNlOiB7IGVycm9yLCBwYXlsb2FkOiBudWxsIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBhbGwsIGFzc29jLCBjb25jYXQsIGRpZmZlcmVuY2UsIGZpbHRlciwgZmxhdHRlbiwgaXNFbXB0eSwga2V5cywgbWFwLCBtZXJnZVdpdGgsIHBhcnRpdGlvbiwgcGF0aCwgcGlja0J5LCBwcm9wcywgcmVkdWNlLCB6aXBPYmogfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBhZGRBbGxSZXNvbHZlZEZyb21PdXRwdXRzLCBnZXRVbmZpbHRlcmVkTGF5b3V0Q2FsbGJhY2tzLCBpZE1hdGNoLCBpc011bHRpVmFsdWVkLCBzcGxpdElkQW5kUHJvcCwgc3RyaW5naWZ5SWQgfSBmcm9tICcuL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBnZXRQYXRoIH0gZnJvbSAnLi9wYXRocyc7XG5leHBvcnQgY29uc3QgRElSRUNUID0gMjtcbmV4cG9ydCBjb25zdCBJTkRJUkVDVCA9IDE7XG5leHBvcnQgY29uc3QgbWVyZ2VNYXggPSBtZXJnZVdpdGgoTWF0aC5tYXgpO1xuZXhwb3J0IGNvbnN0IGNvbWJpbmVJZEFuZFByb3AgPSAoeyBpZCwgcHJvcGVydHkgfSkgPT4gYCR7c3RyaW5naWZ5SWQoaWQpfS4ke3Byb3BlcnR5fWA7XG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FsbGJhY2tzQnlJbnB1dChncmFwaHMsIHBhdGhzLCBpZCwgcHJvcCwgY2hhbmdlVHlwZSwgd2l0aFByaW9yaXR5ID0gdHJ1ZSkge1xuICAgIGNvbnN0IG1hdGNoZXMgPSBbXTtcbiAgICBjb25zdCBpZEFuZFByb3AgPSBjb21iaW5lSWRBbmRQcm9wKHsgaWQsIHByb3BlcnR5OiBwcm9wIH0pO1xuICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIHN0YW5kYXJkIGlkIHZlcnNpb25cbiAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gKGdyYXBocy5pbnB1dE1hcFtpZF0gfHwge30pW3Byb3BdO1xuICAgICAgICBpZiAoIWNhbGxiYWNrcykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKGFkZEFsbFJlc29sdmVkRnJvbU91dHB1dHMocmVzb2x2ZURlcHMoKSwgcGF0aHMsIG1hdGNoZXMpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIHdpbGRjYXJkIHZlcnNpb25cbiAgICAgICAgY29uc3QgX2tleXMgPSBPYmplY3Qua2V5cyhpZCkuc29ydCgpO1xuICAgICAgICBjb25zdCB2YWxzID0gcHJvcHMoX2tleXMsIGlkKTtcbiAgICAgICAgY29uc3Qga2V5U3RyID0gX2tleXMuam9pbignLCcpO1xuICAgICAgICBjb25zdCBwYXR0ZXJucyA9IChncmFwaHMuaW5wdXRQYXR0ZXJuc1trZXlTdHJdIHx8IHt9KVtwcm9wXTtcbiAgICAgICAgaWYgKCFwYXR0ZXJucykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHBhdHRlcm5zLmZvckVhY2gocGF0dGVybiA9PiB7XG4gICAgICAgICAgICBpZiAoaWRNYXRjaChfa2V5cywgdmFscywgcGF0dGVybi52YWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgcGF0dGVybi5jYWxsYmFja3MuZm9yRWFjaChhZGRBbGxSZXNvbHZlZEZyb21PdXRwdXRzKHJlc29sdmVEZXBzKF9rZXlzLCB2YWxzLCBwYXR0ZXJuLnZhbHVlcyksIHBhdGhzLCBtYXRjaGVzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXRjaGVzLmZvckVhY2gobWF0Y2ggPT4ge1xuICAgICAgICBtYXRjaC5jaGFuZ2VkUHJvcElkc1tpZEFuZFByb3BdID0gY2hhbmdlVHlwZSB8fCBESVJFQ1Q7XG4gICAgICAgIGlmICh3aXRoUHJpb3JpdHkpIHtcbiAgICAgICAgICAgIG1hdGNoLnByaW9yaXR5ID0gZ2V0UHJpb3JpdHkoZ3JhcGhzLCBwYXRocywgbWF0Y2gpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG1hdGNoZXM7XG59XG4vKlxuICogQnVpbGRzIGEgdHJlZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgY2FuIGJlIHRyaWdnZXJlZCBieSB0aGUgcHJvdmlkZWQgY2FsbGJhY2suXG4gKiBVc2VzIHRoZSBudW1iZXIgb2YgY2FsbGJhY2tzIGF0IGVhY2ggdHJlZSBkZXB0aCBhbmQgdGhlIHRvdGFsIGRlcHRoIG9mIHRoZSB0cmVlXG4gKiB0byBjcmVhdGUgYSBzb3J0YWJsZSBwcmlvcml0eSBoYXNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJpb3JpdHkoZ3JhcGhzLCBwYXRocywgY2FsbGJhY2spIHtcbiAgICBsZXQgY2FsbGJhY2tzID0gW2NhbGxiYWNrXTtcbiAgICBjb25zdCB0b3VjaGVkT3V0cHV0cyA9IHt9O1xuICAgIGNvbnN0IHRvdWNoZWRDYklkcyA9IHt9O1xuICAgIGNvbnN0IHByaW9yaXR5ID0gW107XG4gICAgd2hpbGUgKGNhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgY2FsbGJhY2tzID0gZmlsdGVyKGMgPT4ge1xuICAgICAgICAgICAgY29uc3QgdG91Y2hlZCA9IHRvdWNoZWRDYklkc1tjLnJlc29sdmVkSWRdO1xuICAgICAgICAgICAgdG91Y2hlZENiSWRzW2MucmVzb2x2ZWRJZF0gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHRvdWNoZWQ7XG4gICAgICAgIH0sIGNhbGxiYWNrcyk7XG4gICAgICAgIGNvbnN0IG91dHB1dHMgPSBmaWx0ZXIobyA9PiAhdG91Y2hlZE91dHB1dHNbY29tYmluZUlkQW5kUHJvcChvKV0sIGZsYXR0ZW4obWFwKGNiID0+IGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhwYXRocykpLCBjYWxsYmFja3MpKSk7XG4gICAgICAgIG91dHB1dHMuZm9yRWFjaChvID0+ICh0b3VjaGVkT3V0cHV0c1tjb21iaW5lSWRBbmRQcm9wKG8pXSA9IHRydWUpKTtcbiAgICAgICAgY2FsbGJhY2tzID0gZmxhdHRlbihtYXAoKHsgaWQsIHByb3BlcnR5IH0pID0+IGdldENhbGxiYWNrc0J5SW5wdXQoZ3JhcGhzLCBwYXRocywgaWQsIHByb3BlcnR5LCBJTkRJUkVDVCwgZmFsc2UpLCBvdXRwdXRzKSk7XG4gICAgICAgIGlmIChjYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBwcmlvcml0eS5wdXNoKGNhbGxiYWNrcy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaW9yaXR5LnVuc2hpZnQocHJpb3JpdHkubGVuZ3RoKTtcbiAgICByZXR1cm4gbWFwKGkgPT4gTWF0aC5taW4oaSwgMzUpLnRvU3RyaW5nKDM2KSwgcHJpb3JpdHkpLmpvaW4oJycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbFN1YnNlcXVlbnRPdXRwdXRzRm9yQ2FsbGJhY2soZ3JhcGhzLCBwYXRocywgY2FsbGJhY2spIHtcbiAgICBsZXQgY2FsbGJhY2tzID0gW2NhbGxiYWNrXTtcbiAgICBsZXQgdG91Y2hlZE91dHB1dHMgPSB7fTtcbiAgICAvLyB0aGlzIHRyYXZlcnNlcyB0aGUgZ3JhcGggYWxsIHRoZSB3YXkgdG8gdGhlIGVuZFxuICAgIHdoaWxlIChjYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgIC8vIGRvbid0IGFkZCBpdCBpZiBpdCBhbHJlYWR5IGV4aXN0cyBiYXNlZCBvbiBpZCBhbmQgcHJvcHNcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IGZpbHRlcihvID0+ICF0b3VjaGVkT3V0cHV0c1tjb21iaW5lSWRBbmRQcm9wKG8pXSwgZmxhdHRlbihtYXAoY2IgPT4gZmxhdHRlbihjYi5nZXRPdXRwdXRzKHBhdGhzKSksIGNhbGxiYWNrcykpKTtcbiAgICAgICAgdG91Y2hlZE91dHB1dHMgPSByZWR1Y2UoKHRvdWNoZWQsIG8pID0+IGFzc29jKGNvbWJpbmVJZEFuZFByb3AobyksIHRydWUsIHRvdWNoZWQpLCB0b3VjaGVkT3V0cHV0cywgb3V0cHV0cyk7XG4gICAgICAgIGNhbGxiYWNrcyA9IGZsYXR0ZW4obWFwKCh7IGlkLCBwcm9wZXJ0eSB9KSA9PiBnZXRDYWxsYmFja3NCeUlucHV0KGdyYXBocywgcGF0aHMsIGlkLCBwcm9wZXJ0eSwgSU5ESVJFQ1QsIGZhbHNlKSwgb3V0cHV0cykpO1xuICAgIH1cbiAgICByZXR1cm4gdG91Y2hlZE91dHB1dHM7XG59XG5leHBvcnQgY29uc3QgZ2V0UmVhZHlDYWxsYmFja3MgPSAocGF0aHMsIGNhbmRpZGF0ZXMsIGNhbGxiYWNrcyA9IGNhbmRpZGF0ZXMsIGdyYXBocyA9IHt9KSA9PiB7XG4gICAgLy8gU2tpcCBpZiB0aGVyZSdzIG5vIGNhbmRpZGF0ZXNcbiAgICBpZiAoIWNhbmRpZGF0ZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgLy8gRmluZCBhbGwgb3V0cHV0cyBvZiBhbGwgYWN0aXZlIGNhbGxiYWNrc1xuICAgIGNvbnN0IG91dHB1dHMgPSBtYXAoY29tYmluZUlkQW5kUHJvcCwgcmVkdWNlKChvLCBjYikgPT4gY29uY2F0KG8sIGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhwYXRocykpKSwgW10sIGNhbGxiYWNrcykpO1xuICAgIC8vIE1ha2UgYG91dHB1dHNgIGhhc2ggdGFibGUgZm9yIGZhc3RlciBhY2Nlc3NcbiAgICBsZXQgb3V0cHV0c01hcCA9IHt9O1xuICAgIG91dHB1dHMuZm9yRWFjaChvdXRwdXQgPT4gKG91dHB1dHNNYXBbb3V0cHV0XSA9IHRydWUpKTtcbiAgICAvLyBmaW5kIGFsbCB0aGUgb3V0cHV0cyB0b3VjaGVkIGJ5IGFjdGl2ZUNhbGxiYWNrc1xuICAgIC8vIHJlbW92ZSB0aGlzIGNoZWNrIGlmIGdyYXBoIGlzIGFjY2Vzc2libGUgYWxsIHRoZSB0aW1lXG4gICAgaWYgKE9iamVjdC5rZXlzKGdyYXBocykubGVuZ3RoKSB7XG4gICAgICAgIC8vbm90IHN1cmUgaWYgZ3JhcGggd2lsbCBiZSBhY2Nlc3NpYmxlIGFsbCB0aGUgdGltZVxuICAgICAgICBjb25zdCBhbGxUb3VjaGVkT3V0cHV0cyA9IGZsYXR0ZW4obWFwKGNiID0+IGdldEFsbFN1YnNlcXVlbnRPdXRwdXRzRm9yQ2FsbGJhY2soZ3JhcGhzLCBwYXRocywgY2IpLCBjYWxsYmFja3MpKTtcbiAgICAgICAgLy8gb3ZlcnJyaWRlcyB0aGUgb3V0cHV0c01hcCwgd2lsbCBkdXBsaWNhdGUgY2FsbGJhY2tzIGZpbHRlcmVkXG4gICAgICAgIC8vIHRoaXMgaXMgb25seSBkb25lIHRvIHNpbGVuY2UgdHlwZXNjcmlwdCBlcnJvcnNcbiAgICAgICAgaWYgKGFsbFRvdWNoZWRPdXRwdXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG91dHB1dHNNYXAgPSBPYmplY3QuYXNzaWduKGFsbFRvdWNoZWRPdXRwdXRzWzBdLCAuLi5hbGxUb3VjaGVkT3V0cHV0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gRmluZCBgcmVxdWVzdGVkYCBjYWxsYmFja3MgdGhhdCBkbyBub3QgZGVwZW5kIG9uIGEgb3V0c3RhbmRpbmcgb3V0cHV0IChhcyBlaXRoZXIgaW5wdXQgb3Igc3RhdGUpXG4gICAgLy8gT3V0cHV0cyB3aGljaCBvdmVybGFwIGFuIGlucHV0IGRvIG5vdCBjb3VudCBhcyBhbiBvdXRzdGFuZGluZyBvdXRwdXRcbiAgICByZXR1cm4gZmlsdGVyKGNiID0+IGFsbChjYnAgPT4gIW91dHB1dHNNYXBbY29tYmluZUlkQW5kUHJvcChjYnApXSwgZGlmZmVyZW5jZShmbGF0dGVuKGNiLmdldElucHV0cyhwYXRocykpLCBmbGF0dGVuKGNiLmdldE91dHB1dHMocGF0aHMpKSkpLCBjYW5kaWRhdGVzKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0TGF5b3V0Q2FsbGJhY2tzID0gKGdyYXBocywgcGF0aHMsIGxheW91dCwgb3B0aW9ucykgPT4ge1xuICAgIGxldCBleGNsdXNpb25zID0gW107XG4gICAgbGV0IGNhbGxiYWNrcyA9IGdldFVuZmlsdGVyZWRMYXlvdXRDYWxsYmFja3MoZ3JhcGhzLCBwYXRocywgbGF5b3V0LCBvcHRpb25zKTtcbiAgICAvKlxuICAgICAgICBSZW1vdmUgZnJvbSB0aGUgaW5pdGlhbCBjYWxsYmFja3MgdGhvc2UgdGhhdCBhcmUgbGVmdCB3aXRoIG9ubHkgZXhjbHVkZWQgaW5wdXRzLlxuXG4gICAgICAgIEV4Y2x1c2lvbiBvZiBpbnB1dHMgaGFwcGVucyB3aGVuOlxuICAgICAgICAtIGFuIGlucHV0IGlzIG1pc3NpbmdcbiAgICAgICAgLSBhbiBpbnB1dCBpbiB0aGUgaW5pdGlhbCBjYWxsYmFjayBjaGFpbiBkZXBlbmRzIG9ubHkgb24gZXhjbHVkZWQgaW5wdXRzXG5cbiAgICAgICAgRnVydGhlciBleGNsdXNpb24gbWlnaHQgaGFwcGVuIGFmdGVyIGNhbGxiYWNrcyByZXR1cm4gd2l0aDpcbiAgICAgICAgLSBQcmV2ZW50VXBkYXRlXG4gICAgICAgIC0gbm9fdXBkYXRlXG4gICAgKi9cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAvLyBGaW5kIGNhbGxiYWNrcyBmb3Igd2hpY2ggYWxsIGlucHV0cyBhcmUgbWlzc2luZyBvciBpbiB0aGUgZXhjbHVzaW9uc1xuICAgICAgICBjb25zdCBbaW5jbHVkZWQsIGV4Y2x1ZGVkXSA9IHBhcnRpdGlvbigoeyBjYWxsYmFjazogeyBpbnB1dHMgfSwgZ2V0SW5wdXRzIH0pID0+IGFsbChpc011bHRpVmFsdWVkLCBpbnB1dHMpIHx8XG4gICAgICAgICAgICAhaXNFbXB0eShkaWZmZXJlbmNlKG1hcChjb21iaW5lSWRBbmRQcm9wLCBmbGF0dGVuKGdldElucHV0cyhwYXRocykpKSwgZXhjbHVzaW9ucykpLCBjYWxsYmFja3MpO1xuICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIGFkZGl0aW9uYWwgZXhjbHVzaW9ucywgYnJlYWsgbG9vcCAtIGNhbGxiYWNrcyBoYXZlIGJlZW4gY2xlYW5lZFxuICAgICAgICBpZiAoIWV4Y2x1ZGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2tzID0gaW5jbHVkZWQ7XG4gICAgICAgIC8vIHVwZGF0ZSBleGNsdXNpb25zIHdpdGggYWxsIGFkZGl0aW9uYWwgZXhjbHVkZWQgb3V0cHV0c1xuICAgICAgICBleGNsdXNpb25zID0gY29uY2F0KGV4Y2x1c2lvbnMsIG1hcChjb21iaW5lSWRBbmRQcm9wLCBmbGF0dGVuKG1hcCgoeyBnZXRPdXRwdXRzIH0pID0+IGdldE91dHB1dHMocGF0aHMpLCBleGNsdWRlZCkpKSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmZpbHRlclJvb3QpIHtcbiAgICAgICAgbGV0IHJvb3RJZCA9IHBhdGgoWydwcm9wcycsICdpZCddLCBsYXlvdXQpO1xuICAgICAgICBpZiAocm9vdElkKSB7XG4gICAgICAgICAgICByb290SWQgPSBzdHJpbmdpZnlJZChyb290SWQpO1xuICAgICAgICAgICAgLy8gRmlsdGVyIGlucHV0cyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgcmVzcG9uc2VcbiAgICAgICAgICAgIGNhbGxiYWNrcyA9IGNhbGxiYWNrcy5maWx0ZXIoY2IgPT4gY2IuY2FsbGJhY2suaW5wdXRzLnJlZHVjZSgocHJldmlvdXMsIGlucHV0KSA9PiBwcmV2aW91cyB8fFxuICAgICAgICAgICAgICAgIChzdHJpbmdpZnlJZChpbnB1dC5pZCkgPT0gcm9vdElkICYmXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsdGVyUm9vdC5pbmNsdWRlcyhpbnB1dC5wcm9wZXJ0eSkpLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qXG4gICAgICAgIFJldHVybiBhbGwgY2FsbGJhY2tzIHdpdGggYW4gYGV4ZWN1dGlvbkdyb3VwYCB0byBhbGxvdyBncm91cC1wcm9jZXNzaW5nXG4gICAgKi9cbiAgICBjb25zdCBleGVjdXRpb25Hcm91cCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpO1xuICAgIHJldHVybiBtYXAoY2IgPT4gKHsgLi4uY2IsIGV4ZWN1dGlvbkdyb3VwIH0pLCBjYWxsYmFja3MpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRVbmlxdWVJZGVudGlmaWVyID0gKHsgYW55VmFscywgY2FsbGJhY2s6IHsgaW5wdXRzLCBvdXRwdXRzLCBzdGF0ZSB9IH0pID0+IGNvbmNhdChtYXAoY29tYmluZUlkQW5kUHJvcCwgWy4uLmlucHV0cywgLi4ub3V0cHV0cywgLi4uc3RhdGVdKSwgQXJyYXkuaXNBcnJheShhbnlWYWxzKSA/IGFueVZhbHMgOiBhbnlWYWxzID09PSAnJyA/IFtdIDogW2FueVZhbHNdKS5qb2luKCcsJyk7XG5leHBvcnQgZnVuY3Rpb24gaW5jbHVkZU9ic2VydmVycyhpZCwgcHJvcGVydGllcywgZ3JhcGhzLCBwYXRocykge1xuICAgIHJldHVybiBmbGF0dGVuKG1hcChwcm9wTmFtZSA9PiBnZXRDYWxsYmFja3NCeUlucHV0KGdyYXBocywgcGF0aHMsIGlkLCBwcm9wTmFtZSksIGtleXMocHJvcGVydGllcykpKTtcbn1cbi8qXG4gKiBDcmVhdGUgYSBwZW5kaW5nIGNhbGxiYWNrIG9iamVjdC4gSW5jbHVkZXMgdGhlIG9yaWdpbmFsIGNhbGxiYWNrIGRlZmluaXRpb24sXG4gKiBpdHMgcmVzb2x2ZWQgSUQgKGluY2x1ZGluZyB0aGUgdmFsdWUgb2YgYWxsIE1BVENIIHdpbGRjYXJkcyksXG4gKiBhY2Nlc3NvcnMgdG8gZmluZCBhbGwgaW5wdXRzLCBvdXRwdXRzLCBhbmQgc3RhdGUgaW52b2x2ZWQgaW4gdGhpc1xuICogY2FsbGJhY2sgKGxhenkgYXMgbm90IGFsbCB1c2VycyB3aWxsIHdhbnQgYWxsIG9mIHRoZXNlKS5cbiAqL1xuZXhwb3J0IGNvbnN0IG1ha2VSZXNvbHZlZENhbGxiYWNrID0gKGNhbGxiYWNrLCByZXNvbHZlLCBhbnlWYWxzKSA9PiAoe1xuICAgIGNhbGxiYWNrLFxuICAgIGFueVZhbHMsXG4gICAgcmVzb2x2ZWRJZDogY2FsbGJhY2sub3V0cHV0ICsgYW55VmFscyxcbiAgICBnZXRPdXRwdXRzOiBwYXRocyA9PiBjYWxsYmFjay5vdXRwdXRzLm1hcChyZXNvbHZlKHBhdGhzKSksXG4gICAgZ2V0SW5wdXRzOiBwYXRocyA9PiBjYWxsYmFjay5pbnB1dHMubWFwKHJlc29sdmUocGF0aHMpKSxcbiAgICBnZXRTdGF0ZTogcGF0aHMgPT4gY2FsbGJhY2suc3RhdGUubWFwKHJlc29sdmUocGF0aHMpKSxcbiAgICBjaGFuZ2VkUHJvcElkczoge30sXG4gICAgaW5pdGlhbENhbGw6IGZhbHNlXG59KTtcbmV4cG9ydCBmdW5jdGlvbiBwcnVuZUNhbGxiYWNrcyhjYWxsYmFja3MsIHBhdGhzKSB7XG4gICAgY29uc3QgWywgcmVtb3ZlZF0gPSBwYXJ0aXRpb24oKHsgZ2V0T3V0cHV0cywgY2FsbGJhY2s6IHsgb3V0cHV0cyB9IH0pID0+IGZsYXR0ZW4oZ2V0T3V0cHV0cyhwYXRocykpLmxlbmd0aCA9PT0gb3V0cHV0cy5sZW5ndGgsIGNhbGxiYWNrcyk7XG4gICAgY29uc3QgWywgbW9kaWZpZWRdID0gcGFydGl0aW9uKCh7IGdldE91dHB1dHMgfSkgPT4gIWZsYXR0ZW4oZ2V0T3V0cHV0cyhwYXRocykpLmxlbmd0aCwgcmVtb3ZlZCk7XG4gICAgY29uc3QgYWRkZWQgPSBtYXAoY2IgPT4gYXNzb2MoJ2NoYW5nZWRQcm9wSWRzJywgcGlja0J5KChfLCBwcm9wSWQpID0+IGdldFBhdGgocGF0aHMsIHNwbGl0SWRBbmRQcm9wKHByb3BJZCkuaWQpLCBjYi5jaGFuZ2VkUHJvcElkcyksIGNiKSwgbW9kaWZpZWQpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFkZGVkLFxuICAgICAgICByZW1vdmVkXG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRGVwcyhyZWZLZXlzLCByZWZWYWxzLCByZWZQYXR0ZXJuVmFscykge1xuICAgIHJldHVybiAocGF0aHMpID0+ICh7IGlkOiBpZFBhdHRlcm4sIHByb3BlcnR5IH0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpZFBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChwYXRocywgaWRQYXR0ZXJuKTtcbiAgICAgICAgICAgIHJldHVybiBwYXRoID8gW3sgaWQ6IGlkUGF0dGVybiwgcHJvcGVydHksIHBhdGggfV0gOiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBfa2V5cyA9IE9iamVjdC5rZXlzKGlkUGF0dGVybikuc29ydCgpO1xuICAgICAgICBjb25zdCBwYXR0ZXJuVmFscyA9IHByb3BzKF9rZXlzLCBpZFBhdHRlcm4pO1xuICAgICAgICBjb25zdCBrZXlTdHIgPSBfa2V5cy5qb2luKCcsJyk7XG4gICAgICAgIGNvbnN0IGtleVBhdGhzID0gcGF0aHMub2Jqc1trZXlTdHJdO1xuICAgICAgICBpZiAoIWtleVBhdGhzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGtleVBhdGhzLmZvckVhY2goKHsgdmFsdWVzOiB2YWxzLCBwYXRoIH0pID0+IHtcbiAgICAgICAgICAgIGlmIChpZE1hdGNoKF9rZXlzLCB2YWxzLCBwYXR0ZXJuVmFscywgcmVmS2V5cywgcmVmVmFscywgcmVmUGF0dGVyblZhbHMpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBpZDogemlwT2JqKF9rZXlzLCB2YWxzKSwgcHJvcGVydHksIHBhdGggfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVBY3Rpb24gfSBmcm9tICdyZWR1eC1hY3Rpb25zJztcbmltcG9ydCB7IElzTG9hZGluZ0FjdGlvblR5cGUgfSBmcm9tICcuLi9yZWR1Y2Vycy9pc0xvYWRpbmcnO1xuZXhwb3J0IGNvbnN0IHNldElzTG9hZGluZyA9IGNyZWF0ZUFjdGlvbihJc0xvYWRpbmdBY3Rpb25UeXBlLlNldCk7XG4iLCJpbXBvcnQgeyBjcmVhdGVBY3Rpb24gfSBmcm9tICdyZWR1eC1hY3Rpb25zJztcbmltcG9ydCB7IExvYWRpbmdNYXBBY3Rpb25UeXBlIH0gZnJvbSAnLi4vcmVkdWNlcnMvbG9hZGluZ01hcCc7XG5leHBvcnQgY29uc3Qgc2V0TG9hZGluZ01hcCA9IGNyZWF0ZUFjdGlvbihMb2FkaW5nTWFwQWN0aW9uVHlwZS5TZXQpO1xuIiwiaW1wb3J0IHsgYXBwZW5kLCBhc3NvY1BhdGgsIGNvbmNhdCwgZGlzc29jUGF0aCwgZW1wdHksIGVxdWFscywgaGFzLCBpbnNlcnQsIGlzLCBwYXRoLCBwcmVwZW5kLCByZXZlcnNlIH0gZnJvbSAncmFtZGEnO1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGF0Y2gob2JqKSB7XG4gICAgcmV0dXJuIGhhcygnX19kYXNoX3BhdGNoX3VwZGF0ZScsIG9iaik7XG59XG5mdW5jdGlvbiBnZXRMb2NhdGlvbkluZGV4KHZhbHVlLCBwcmV2aW91cykge1xuICAgIGlmIChpcyhOdW1iZXIsIHZhbHVlKSAmJiB2YWx1ZSA8IDApIHtcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzLmxlbmd0aCArIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBnZXRMb2NhdGlvblBhdGgobG9jYXRpb24sIG9iaikge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2F0aW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TG9jYXRpb25JbmRleChsb2NhdGlvbltpXSwgcGF0aChjdXJyZW50LCBvYmopKTtcbiAgICAgICAgY3VycmVudC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG59XG5jb25zdCBwYXRjaEhhbmRsZXJzID0ge1xuICAgIEFzc2lnbjogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCB7IHBhcmFtcywgbG9jYXRpb24gfSA9IHBhdGNoT3BlcmF0aW9uO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKGxvY2F0aW9uLCBwYXJhbXMudmFsdWUsIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIE1lcmdlOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHtcbiAgICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgICAuLi5wYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWVcbiAgICAgICAgfSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgRXh0ZW5kOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIGNvbmNhdChwcmV2LCBwYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWUpLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBEZWxldGU6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgcmV0dXJuIGRpc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIEluc2VydDogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBpbnNlcnQoZ2V0TG9jYXRpb25JbmRleChwYXRjaE9wZXJhdGlvbi5wYXJhbXMuaW5kZXgsIHByZXYpLCBwYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWUsIHByZXYpLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBBcHBlbmQ6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgYXBwZW5kKHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSwgcHJldiksIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIFByZXBlbmQ6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJlcGVuZChwYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWUsIHByZXYpLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBBZGQ6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldiArIHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgU3ViOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXYgLSBwYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWUsIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIE11bDogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2ICogcGF0Y2hPcGVyYXRpb24ucGFyYW1zLnZhbHVlLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBEaXY6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldiAvIHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgQ2xlYXI6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgZW1wdHkocHJldiksIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIFJldmVyc2U6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcmV2ZXJzZShwcmV2KSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgUmVtb3ZlOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXYuZmlsdGVyKChpdGVtKSA9PiAhZXF1YWxzKGl0ZW0sIHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSkpLCBwcmV2aW91cyk7XG4gICAgfVxufTtcbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVQYXRjaChwcmV2aW91c1ZhbHVlLCBwYXRjaFZhbHVlKSB7XG4gICAgbGV0IHJlZHVjZWRWYWx1ZSA9IHByZXZpb3VzVmFsdWU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRjaFZhbHVlLm9wZXJhdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGF0Y2ggPSBwYXRjaFZhbHVlLm9wZXJhdGlvbnNbaV07XG4gICAgICAgIHBhdGNoLmxvY2F0aW9uID0gZ2V0TG9jYXRpb25QYXRoKHBhdGNoLmxvY2F0aW9uLCByZWR1Y2VkVmFsdWUpO1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gcGF0Y2hIYW5kbGVyc1twYXRjaC5vcGVyYXRpb25dO1xuICAgICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBPcGVyYXRpb24gJHtwYXRjaC5vcGVyYXRpb259YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVkdWNlZFZhbHVlID0gaGFuZGxlcihyZWR1Y2VkVmFsdWUsIHBhdGNoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZHVjZWRWYWx1ZTtcbn1cbiIsImltcG9ydCB7IGJhdGNoIH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHsgc2V0R3JhcGhzIH0gZnJvbSAnLi9pbmRleCc7XG5pbXBvcnQgYXBpVGh1bmsgZnJvbSAnLi9hcGknO1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3REZXBlbmRlbmNpZXMoKSB7XG4gICAgcmV0dXJuIChkaXNwYXRjaCkgPT4ge1xuICAgICAgICBiYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICBkaXNwYXRjaChzZXRHcmFwaHMoe30pKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKGFwaVRodW5rKCdfZGFzaC1kZXBlbmRlbmNpZXMnLCAnR0VUJywgJ2RlcGVuZGVuY2llc1JlcXVlc3QnKSk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb25maWdGcm9tRE9NKCkge1xuICAgIGNvbnN0IGNvbmZpZ0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnX2Rhc2gtY29uZmlnJyk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoY29uZmlnRWxlbWVudD8udGV4dENvbnRlbnQgPyBjb25maWdFbGVtZW50Py50ZXh0Q29udGVudCA6ICd7fScpO1xufVxuIiwiY29uc3QgdXBkYXRlVGl0bGUgPSAoZ2V0U3RhdGUpID0+IHtcbiAgICBjb25zdCB7IGNvbmZpZywgaXNMb2FkaW5nIH0gPSBnZXRTdGF0ZSgpO1xuICAgIGNvbnN0IHVwZGF0ZV90aXRsZSA9IGNvbmZpZz8udXBkYXRlX3RpdGxlO1xuICAgIGlmICghdXBkYXRlX3RpdGxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzTG9hZGluZykge1xuICAgICAgICBpZiAoZG9jdW1lbnQudGl0bGUgIT09IHVwZGF0ZV90aXRsZSkge1xuICAgICAgICAgICAgb2JzZXJ2ZXIudGl0bGUgPSBkb2N1bWVudC50aXRsZTtcbiAgICAgICAgICAgIGRvY3VtZW50LnRpdGxlID0gdXBkYXRlX3RpdGxlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoZG9jdW1lbnQudGl0bGUgPT09IHVwZGF0ZV90aXRsZSkge1xuICAgICAgICAgICAgZG9jdW1lbnQudGl0bGUgPSBvYnNlcnZlci50aXRsZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9ic2VydmVyLnRpdGxlID0gZG9jdW1lbnQudGl0bGU7XG4gICAgICAgIH1cbiAgICB9XG59O1xuY29uc3Qgb2JzZXJ2ZXIgPSB7XG4gICAgaW5wdXRzOiBbJ2lzTG9hZGluZyddLFxuICAgIG11dGF0aW9uT2JzZXJ2ZXI6IHVuZGVmaW5lZCxcbiAgICBvYnNlcnZlcjogKHsgZ2V0U3RhdGUgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGNvbmZpZyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgaWYgKG9ic2VydmVyLmNvbmZpZyAhPT0gY29uZmlnKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5jb25maWcgPSBjb25maWc7XG4gICAgICAgICAgICBvYnNlcnZlci5tdXRhdGlvbk9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICBvYnNlcnZlci5tdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gdXBkYXRlVGl0bGUoZ2V0U3RhdGUpKTtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKTtcbiAgICAgICAgICAgIGlmICh0aXRsZSkge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLm11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZSh0aXRsZSwge1xuICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlckRhdGE6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVUaXRsZShnZXRTdGF0ZSk7XG4gICAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IG9ic2VydmVyO1xuIiwiaW1wb3J0IHsgY29uY2F0LCBmbGF0dGVuLCBpc0VtcHR5LCBpc05pbCwgbWFwLCBwYXRoLCBrZXlzLCBwaWNrQnksIHRvUGFpcnMsIHBhdGhPciB9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7IGFnZ3JlZ2F0ZUNhbGxiYWNrcywgYWRkUmVxdWVzdGVkQ2FsbGJhY2tzLCByZW1vdmVFeGVjdXRlZENhbGxiYWNrcywgYWRkQ29tcGxldGVkQ2FsbGJhY2tzLCBhZGRTdG9yZWRDYWxsYmFja3MgfSBmcm9tICcuLi9hY3Rpb25zL2NhbGxiYWNrcyc7XG5pbXBvcnQgeyBwYXJzZUlmV2lsZGNhcmQgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBjb21iaW5lSWRBbmRQcm9wLCBnZXRDYWxsYmFja3NCeUlucHV0LCBnZXRMYXlvdXRDYWxsYmFja3MsIGluY2x1ZGVPYnNlcnZlcnMgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llc190cyc7XG5pbXBvcnQgeyB1cGRhdGVQcm9wcywgc2V0UGF0aHMsIGhhbmRsZUFzeW5jRXJyb3IgfSBmcm9tICcuLi9hY3Rpb25zJztcbmltcG9ydCB7IGdldFBhdGgsIGNvbXB1dGVQYXRocyB9IGZyb20gJy4uL2FjdGlvbnMvcGF0aHMnO1xuaW1wb3J0IHsgYXBwbHlQZXJzaXN0ZW5jZSwgcHJ1bmVQZXJzaXN0ZW5jZSB9IGZyb20gJy4uL3BlcnNpc3RlbmNlJztcbmNvbnN0IG9ic2VydmVyID0ge1xuICAgIG9ic2VydmVyOiAoeyBkaXNwYXRjaCwgZ2V0U3RhdGUgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrczogeyBleGVjdXRlZCB9IH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBmdW5jdGlvbiBhcHBseVByb3BzKGlkLCB1cGRhdGVkUHJvcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbGF5b3V0LCBwYXRocyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1wYXRoID0gZ2V0UGF0aChwYXRocywgaWQpO1xuICAgICAgICAgICAgaWYgKCFpdGVtcGF0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBjYWxsYmFjay1nZW5lcmF0ZWQgdXBkYXRlLlxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpbnZhbGlkYXRlcyBleGlzdGluZyBwZXJzaXN0ZWQgcHJvcCB2YWx1ZXMsXG4gICAgICAgICAgICAvLyBvciBpZiBwZXJzaXN0ZW5jZSBjaGFuZ2VkLCB3aGV0aGVyIHRoaXMgdXBkYXRlcyBvdGhlciBwcm9wcy5cbiAgICAgICAgICAgIHVwZGF0ZWRQcm9wcyA9IHBydW5lUGVyc2lzdGVuY2UocGF0aChpdGVtcGF0aCwgbGF5b3V0KSwgdXBkYXRlZFByb3BzLCBkaXNwYXRjaCk7XG4gICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSB1cGRhdGUgY29udGFpbnMgd2hvbGUgY29tcG9uZW50cywgc2VlIGlmIGFueSBvZlxuICAgICAgICAgICAgLy8gdGhvc2UgY29tcG9uZW50cyBoYXZlIHByb3BzIHRvIHVwZGF0ZSB0byBwZXJzaXN0IHVzZXIgZWRpdHMuXG4gICAgICAgICAgICBjb25zdCB7IHByb3BzIH0gPSBhcHBseVBlcnNpc3RlbmNlKHsgcHJvcHM6IHVwZGF0ZWRQcm9wcyB9LCBkaXNwYXRjaCk7XG4gICAgICAgICAgICBkaXNwYXRjaCh1cGRhdGVQcm9wcyh7XG4gICAgICAgICAgICAgICAgaXRlbXBhdGgsXG4gICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgc291cmNlOiAncmVzcG9uc2UnXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlcXVlc3RlZENhbGxiYWNrcyA9IFtdO1xuICAgICAgICBjb25zdCBzdG9yZWRDYWxsYmFja3MgPSBbXTtcbiAgICAgICAgZXhlY3V0ZWQuZm9yRWFjaChjYiA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcmVkZWNlc3NvcnMgPSBjb25jYXQoY2IucHJlZGVjZXNzb3JzID8/IFtdLCBbY2IuY2FsbGJhY2tdKTtcbiAgICAgICAgICAgIGNvbnN0IHsgY2FsbGJhY2s6IHsgY2xpZW50c2lkZV9mdW5jdGlvbiwgb3V0cHV0IH0sIGV4ZWN1dGlvblJlc3VsdCB9ID0gY2I7XG4gICAgICAgICAgICBpZiAoaXNOaWwoZXhlY3V0aW9uUmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IsIHBheWxvYWQgfSA9IGV4ZWN1dGlvblJlc3VsdDtcbiAgICAgICAgICAgIGlmIChkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhkYXRhKS5mb3JFYWNoKChbaWQsIHByb3BzXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRJZCA9IHBhcnNlSWZXaWxkY2FyZChpZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZ3JhcGhzLCBsYXlvdXQ6IG9sZExheW91dCwgcGF0aHM6IG9sZFBhdGhzIH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBDb21wb25lbnRzIHdpbGwgdHJpZ2dlciBjYWxsYmFja3Mgb24gdGhlaXIgb3duIGFzIHJlcXVpcmVkIChlZy4gZGVyaXZlZClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXBwbGllZFByb3BzID0gYXBwbHlQcm9wcyhwYXJzZWRJZCwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAvLyBBZGQgY2FsbGJhY2tzIGZvciBtb2RpZmllZCBpbnB1dHNcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ2FsbGJhY2tzID0gY29uY2F0KHJlcXVlc3RlZENhbGxiYWNrcywgZmxhdHRlbihtYXAocHJvcCA9PiBnZXRDYWxsYmFja3NCeUlucHV0KGdyYXBocywgb2xkUGF0aHMsIHBhcnNlZElkLCBwcm9wLCB0cnVlKSwga2V5cyhwcm9wcykpKS5tYXAocmNiID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5yY2IsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVkZWNlc3NvcnNcbiAgICAgICAgICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZVBhdGggPSBnZXRQYXRoKG9sZFBhdGhzLCBwYXJzZWRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYmFzZVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRPYmogPSBwYXRoKGJhc2VQYXRoLCBvbGRMYXlvdXQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlblByb3BzID0gcGF0aE9yKCdkZWZhdWx0VmFsdWUnLCBbb2xkT2JqLm5hbWVzcGFjZSwgb2xkT2JqLnR5cGVdLCB3aW5kb3cuX19kYXNocHJpdmF0ZV9jaGlsZHJlblByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlUGF0aHMgPSAoY2hpbGRyZW4sIG9sZENoaWxkcmVuLCBvbGRDaGlsZHJlblBhdGgsIGZpbHRlclJvb3QgPSBmYWxzZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb1BhdGhzID0gZ2V0U3RhdGUoKS5wYXRocztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhzID0gY29tcHV0ZVBhdGhzKGNoaWxkcmVuLCBvbGRDaGlsZHJlblBhdGgsIG9QYXRocyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzZXRQYXRocyhwYXRocykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGNhbGxiYWNrcyBmb3IgbmV3IGxheW91dCAody8gZXhlY3V0aW9uIGdyb3VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ2FsbGJhY2tzID0gY29uY2F0KHJlcXVlc3RlZENhbGxiYWNrcywgZ2V0TGF5b3V0Q2FsbGJhY2tzKGdyYXBocywgcGF0aHMsIGNoaWxkcmVuLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtQYXRoOiBvbGRDaGlsZHJlblBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUm9vdFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkubWFwKHJjYiA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJjYixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkZWNlc3NvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXaWxkY2FyZCBjYWxsYmFja3Mgd2l0aCBhcnJheSBpbnB1dHMgKEFMTCAvIEFMTFNNQUxMRVIpIG5lZWQgdG8gdHJpZ2dlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBkdWUgdG8gdGhlIGRlbGV0aW9uIG9mIGNvbXBvbmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENhbGxiYWNrcyA9IGNvbmNhdChyZXF1ZXN0ZWRDYWxsYmFja3MsIGdldExheW91dENhbGxiYWNrcyhncmFwaHMsIG9sZFBhdGhzLCBvbGRDaGlsZHJlbiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWRBcnJheUlucHV0c09ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0aHM6IHBhdGhzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rUGF0aDogb2xkQ2hpbGRyZW5QYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclJvb3RcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLm1hcChyY2IgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yY2IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGVjZXNzb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSkpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVjb21wdXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBbJ2NoaWxkcmVuJ11cbiAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQoY2hpbGRyZW5Qcm9wcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGNoaWxkcmVuUHJvcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVjb21wdXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlblByb3AuaW5jbHVkZXMoJ1tdJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbZnJvbnRQYXRoXSA9IGNoaWxkcmVuUHJvcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJ1tdJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChwID0+IHAuc3BsaXQoJy4nKS5maWx0ZXIoZSA9PiBlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJvbnRPYmogPSBwYXRoKGZyb250UGF0aCwgYXBwbGllZFByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZyb250T2JqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3Jhd2wgbGF5b3V0IG5lZWRzIHRoZSBucy90eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlUGF0aHMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5vbGRPYmosXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5vbGRPYmoucHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5hcHBsaWVkUHJvcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9sZE9iaiwgYmFzZVBhdGgsIGtleXMoYXBwbGllZFByb3BzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBkbyBpdCBvbmNlIGZvciB0aGUgY29tcG9uZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29tcHV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW5Qcm9wUGF0aCA9IGNoaWxkcmVuUHJvcC5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gcGF0aChjaGlsZHJlblByb3BQYXRoLCBhcHBsaWVkUHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRDaGlsZHJlblBhdGggPSBjb25jYXQoZ2V0UGF0aChvbGRQYXRocywgcGFyc2VkSWQpLCBbJ3Byb3BzJ10uY29uY2F0KGNoaWxkcmVuUHJvcFBhdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRDaGlsZHJlbiA9IHBhdGgob2xkQ2hpbGRyZW5QYXRoLCBvbGRMYXlvdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBhdGhzKGNoaWxkcmVuLCBvbGRDaGlsZHJlbiwgb2xkQ2hpbGRyZW5QYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHBlcnNpc3RlbmNlIGVkZ2UgY2FzZTogaWYgeW91IGV4cGxpY2l0bHkgdXBkYXRlIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBwZXJzaXN0ZW5jZSBrZXksIG90aGVyIHByb3BzIG1heSBjaGFuZ2UgdGhhdCByZXF1aXJlIHVzXG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIGZpcmUgYWRkaXRpb25hbCBjYWxsYmFja3NcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRkZWRQcm9wcyA9IHBpY2tCeSgoXywgaykgPT4gIShrIGluIHByb3BzKSwgYXBwbGllZFByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0VtcHR5KGFkZGVkUHJvcHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGdyYXBoczogY3VycmVudEdyYXBocywgcGF0aHMgfSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDYWxsYmFja3MgPSBjb25jYXQocmVxdWVzdGVkQ2FsbGJhY2tzLCBpbmNsdWRlT2JzZXJ2ZXJzKGlkLCBhZGRlZFByb3BzLCBjdXJyZW50R3JhcGhzLCBwYXRocykubWFwKHJjYiA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJjYixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkZWNlc3NvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBBZGQgaW5mb3JtYXRpb24gYWJvdXQgcG90ZW50aWFsbHkgdXBkYXRlZCBvdXRwdXRzIHZzLiB1cGRhdGVkIG91dHB1dHMsXG4gICAgICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGJlIHVzZWQgdG8gZHJvcCBjYWxsYmFja3MgZnJvbSBleGVjdXRpb24gZ3JvdXBzIHdoZW4gbm8gb3V0cHV0XG4gICAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcgdGhlIGRvd25zdHJlYW0gY2FsbGJhY2sncyBpbnB1dHMgd2VyZSBtb2RpZmllZFxuICAgICAgICAgICAgICAgIHN0b3JlZENhbGxiYWNrcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY2IsXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbk1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbFByb3BzOiBtYXAoY29tYmluZUlkQW5kUHJvcCwgZmxhdHRlbihjYi5nZXRPdXRwdXRzKGdldFN0YXRlKCkucGF0aHMpKSksXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkUHJvcHM6IGZsYXR0ZW4obWFwKChbaWQsIHZhbHVlXSkgPT4gbWFwKHByb3BlcnR5ID0+IGNvbWJpbmVJZEFuZFByb3AoeyBpZCwgcHJvcGVydHkgfSksIGtleXModmFsdWUpKSwgdG9QYWlycyhkYXRhKSkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0cyA9IHBheWxvYWRcbiAgICAgICAgICAgICAgICAgICAgPyBtYXAoY29tYmluZUlkQW5kUHJvcCwgZmxhdHRlbihbcGF5bG9hZC5vdXRwdXRzXSkpLmpvaW4oJywgJylcbiAgICAgICAgICAgICAgICAgICAgOiBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgQ2FsbGJhY2sgZXJyb3IgdXBkYXRpbmcgJHtvdXRwdXRzfWA7XG4gICAgICAgICAgICAgICAgaWYgKGNsaWVudHNpZGVfZnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBuYW1lc3BhY2U6IG5zLCBmdW5jdGlvbl9uYW1lOiBmbiB9ID0gY2xpZW50c2lkZV9mdW5jdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSArPSBgIHZpYSBjbGllbnRzaWRlIGZ1bmN0aW9uICR7bnN9LiR7Zm59YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlQXN5bmNFcnJvcihlcnJvciwgbWVzc2FnZSwgZGlzcGF0Y2gpO1xuICAgICAgICAgICAgICAgIHN0b3JlZENhbGxiYWNrcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY2IsXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbk1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbFByb3BzOiBtYXAoY29tYmluZUlkQW5kUHJvcCwgZmxhdHRlbihjYi5nZXRPdXRwdXRzKGdldFN0YXRlKCkucGF0aHMpKSksXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkUHJvcHM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3BhdGNoKGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICBleGVjdXRlZC5sZW5ndGggPyByZW1vdmVFeGVjdXRlZENhbGxiYWNrcyhleGVjdXRlZCkgOiBudWxsLFxuICAgICAgICAgICAgZXhlY3V0ZWQubGVuZ3RoID8gYWRkQ29tcGxldGVkQ2FsbGJhY2tzKGV4ZWN1dGVkLmxlbmd0aCkgOiBudWxsLFxuICAgICAgICAgICAgc3RvcmVkQ2FsbGJhY2tzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gYWRkU3RvcmVkQ2FsbGJhY2tzKHN0b3JlZENhbGxiYWNrcylcbiAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICByZXF1ZXN0ZWRDYWxsYmFja3MubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MocmVxdWVzdGVkQ2FsbGJhY2tzKVxuICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICBdKSk7XG4gICAgfSxcbiAgICBpbnB1dHM6IFsnY2FsbGJhY2tzLmV4ZWN1dGVkJ11cbn07XG5leHBvcnQgZGVmYXVsdCBvYnNlcnZlcjtcbiIsImltcG9ydCB7IGFzc29jLCBmaW5kLCBwYXJ0aXRpb24gfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBhZGRFeGVjdXRlZENhbGxiYWNrcywgYWRkV2F0Y2hlZENhbGxiYWNrcywgYWdncmVnYXRlQ2FsbGJhY2tzLCByZW1vdmVFeGVjdXRpbmdDYWxsYmFja3MsIHJlbW92ZVdhdGNoZWRDYWxsYmFja3MgfSBmcm9tICcuLi9hY3Rpb25zL2NhbGxiYWNrcyc7XG5pbXBvcnQgeyBnZXRBcHBTdGF0ZSB9IGZyb20gJy4uL3JlZHVjZXJzL2NvbnN0YW50cyc7XG5jb25zdCBvYnNlcnZlciA9IHtcbiAgICBvYnNlcnZlcjogKHsgZGlzcGF0Y2gsIGdldFN0YXRlIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3M6IHsgZXhlY3V0aW5nIH0gfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IFtkZWZlcnJlZCwgc2tpcHBlZE9yUmVhZHldID0gcGFydGl0aW9uKGNiID0+IGNiLmV4ZWN1dGlvblByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlLCBleGVjdXRpbmcpO1xuICAgICAgICBkaXNwYXRjaChhZ2dyZWdhdGVDYWxsYmFja3MoW1xuICAgICAgICAgICAgZXhlY3V0aW5nLmxlbmd0aCA/IHJlbW92ZUV4ZWN1dGluZ0NhbGxiYWNrcyhleGVjdXRpbmcpIDogbnVsbCxcbiAgICAgICAgICAgIGRlZmVycmVkLmxlbmd0aCA/IGFkZFdhdGNoZWRDYWxsYmFja3MoZGVmZXJyZWQpIDogbnVsbCxcbiAgICAgICAgICAgIHNraXBwZWRPclJlYWR5Lmxlbmd0aFxuICAgICAgICAgICAgICAgID8gYWRkRXhlY3V0ZWRDYWxsYmFja3Moc2tpcHBlZE9yUmVhZHkubWFwKGNiID0+IGFzc29jKCdleGVjdXRpb25SZXN1bHQnLCBjYi5leGVjdXRpb25Qcm9taXNlLCBjYikpKVxuICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICBdKSk7XG4gICAgICAgIGRlZmVycmVkLmZvckVhY2goYXN5bmMgKGNiKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjYi5leGVjdXRpb25Qcm9taXNlO1xuICAgICAgICAgICAgY29uc3QgeyBjYWxsYmFja3M6IHsgd2F0Y2hlZCB9LCBhcHBMaWZlY3ljbGUsIGhvb2tzOiB7IGNhbGxiYWNrX3Jlc29sdmVkIH0gfSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgICBpZiAoYXBwTGlmZWN5Y2xlICE9PSBnZXRBcHBTdGF0ZSgnSFlEUkFURUQnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjYWxsYmFja19yZXNvbHZlZCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrX3Jlc29sdmVkKGNiLmNhbGxiYWNrLCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgYHdhdGNoZWRgIGxpc3Qgc2luY2UgLSBvbiBjYWxsYmFjayBjb21wbGV0aW9uLCBhbm90aGVyIGNhbGxiYWNrIG1heSBiZSBjYW5jZWxsZWRcbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIGNhbGxiYWNrIGluc3RhbmNlIG9yIG9uZSB0aGF0IG1hdGNoZXMgaXRzIHByb21pc2UgKGVnLiBjb3VsZCBoYXZlIGJlZW4gcHJ1bmVkKVxuICAgICAgICAgICAgY29uc3QgY3VycmVudENiID0gZmluZChfY2IgPT4gX2NiID09PSBjYiB8fCBfY2IuZXhlY3V0aW9uUHJvbWlzZSA9PT0gY2IuZXhlY3V0aW9uUHJvbWlzZSwgd2F0Y2hlZCk7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRDYikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSBtb3ZlIHRvIGBleGVjdXRlZGAgYW5kIHJlbW92ZSBmcm9tIGB3YXRjaGVkYFxuICAgICAgICAgICAgZGlzcGF0Y2goYWdncmVnYXRlQ2FsbGJhY2tzKFtcbiAgICAgICAgICAgICAgICByZW1vdmVXYXRjaGVkQ2FsbGJhY2tzKFtjdXJyZW50Q2JdKSxcbiAgICAgICAgICAgICAgICBhZGRFeGVjdXRlZENhbGxiYWNrcyhbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnRDYixcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvblJlc3VsdDogcmVzdWx0XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgXSkpO1xuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGlucHV0czogWydjYWxsYmFja3MuZXhlY3V0aW5nJ11cbn07XG5leHBvcnQgZGVmYXVsdCBvYnNlcnZlcjtcbiIsImltcG9ydCB7IGdldFBlbmRpbmdDYWxsYmFja3MgfSBmcm9tICcuLi91dGlscy9jYWxsYmFja3MnO1xuaW1wb3J0IHsgc2V0SXNMb2FkaW5nIH0gZnJvbSAnLi4vYWN0aW9ucy9pc0xvYWRpbmcnO1xuY29uc3Qgb2JzZXJ2ZXIgPSB7XG4gICAgb2JzZXJ2ZXI6ICh7IGRpc3BhdGNoLCBnZXRTdGF0ZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2tzLCBpc0xvYWRpbmcgfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IHBlbmRpbmdDYWxsYmFja3MgPSBnZXRQZW5kaW5nQ2FsbGJhY2tzKGNhbGxiYWNrcyk7XG4gICAgICAgIGNvbnN0IG5leHQgPSBCb29sZWFuKHBlbmRpbmdDYWxsYmFja3MubGVuZ3RoKTtcbiAgICAgICAgaWYgKGlzTG9hZGluZyAhPT0gbmV4dCkge1xuICAgICAgICAgICAgZGlzcGF0Y2goc2V0SXNMb2FkaW5nKG5leHQpKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaW5wdXRzOiBbJ2NhbGxiYWNrcyddXG59O1xuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQgeyBlcXVhbHMsIGZsYXR0ZW4sIGlzRW1wdHksIG1hcCwgcmVkdWNlIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgc2V0TG9hZGluZ01hcCB9IGZyb20gJy4uL2FjdGlvbnMvbG9hZGluZ01hcCc7XG5jb25zdCBvYnNlcnZlciA9IHtcbiAgICBvYnNlcnZlcjogKHsgZGlzcGF0Y2gsIGdldFN0YXRlIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3M6IHsgZXhlY3V0aW5nLCB3YXRjaGVkLCBleGVjdXRlZCB9LCBsb2FkaW5nTWFwLCBwYXRocyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgLypcbiAgICAgICAgICAgIEdldCB0aGUgcGF0aCBvZiBhbGwgY29tcG9uZW50cyBpbXBhY3RlZCBieSBjYWxsYmFja3NcbiAgICAgICAgICAgIHdpdGggc3RhdGVzOiBleGVjdXRpbmcsIHdhdGNoZWQsIGV4ZWN1dGVkLlxuXG4gICAgICAgICAgICBGb3IgZWFjaCBwYXRoLCBrZWVwIHRyYWNrIG9mIGFsbCAoaWQscHJvcCkgdHVwbGVzIHRoYXRcbiAgICAgICAgICAgIGFyZSBpbXBhY3RlZCBmb3IgdGhpcyBub2RlIGFuZCBuZXN0ZWQgbm9kZXMuXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IGxvYWRpbmdQYXRocyA9IGZsYXR0ZW4obWFwKGNiID0+IGNiLmdldE91dHB1dHMocGF0aHMpLCBbLi4uZXhlY3V0aW5nLCAuLi53YXRjaGVkLCAuLi5leGVjdXRlZF0pKTtcbiAgICAgICAgY29uc3QgbmV4dE1hcCA9IGlzRW1wdHkobG9hZGluZ1BhdGhzKVxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IHJlZHVjZSgocmVzLCB7IGlkLCBwcm9wZXJ0eSwgcGF0aCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IHJlcztcbiAgICAgICAgICAgICAgICBjb25zdCBpZHByb3AgPSB7IGlkLCBwcm9wZXJ0eSB9O1xuICAgICAgICAgICAgICAgIC8vIEFzc2lnbiBhbGwgYWZmZWN0ZWQgcHJvcHMgZm9yIHRoaXMgcGF0aCBhbmQgbmVzdGVkIHBhdGhzXG4gICAgICAgICAgICAgICAgdGFyZ2V0Ll9fZGFzaHByaXZhdGVfX2lkcHJvcHNfXyA9XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5fX2Rhc2hwcml2YXRlX19pZHByb3BzX18gfHwgW107XG4gICAgICAgICAgICAgICAgdGFyZ2V0Ll9fZGFzaHByaXZhdGVfX2lkcHJvcHNfXy5wdXNoKGlkcHJvcCk7XG4gICAgICAgICAgICAgICAgcGF0aC5mb3JFYWNoKChwLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldFtwXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcF0gPz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocCA9PT0gJ2NoaWxkcmVuJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcGF0aFtpICsgMV0gPT09ICdudW1iZXInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gW11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5fX2Rhc2hwcml2YXRlX19pZHByb3BzX18gPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Ll9fZGFzaHByaXZhdGVfX2lkcHJvcHNfXyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Ll9fZGFzaHByaXZhdGVfX2lkcHJvcHNfXy5wdXNoKGlkcHJvcCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gQXNzaWduIG9uZSBhZmZlY3RlZCBwcm9wIGZvciB0aGlzIHBhdGhcbiAgICAgICAgICAgICAgICB0YXJnZXQuX19kYXNocHJpdmF0ZV9faWRwcm9wX18gPVxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQuX19kYXNocHJpdmF0ZV9faWRwcm9wX18gfHwgaWRwcm9wO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICB9LCB7fSwgbG9hZGluZ1BhdGhzKTtcbiAgICAgICAgaWYgKCFlcXVhbHMobmV4dE1hcCwgbG9hZGluZ01hcCkpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKHNldExvYWRpbmdNYXAobmV4dE1hcCkpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBpbnB1dHM6IFsnY2FsbGJhY2tzLmV4ZWN1dGluZycsICdjYWxsYmFja3Mud2F0Y2hlZCcsICdjYWxsYmFja3MuZXhlY3V0ZWQnXVxufTtcbmV4cG9ydCBkZWZhdWx0IG9ic2VydmVyO1xuIiwiaW1wb3J0IHsgZmluZCwgZmxhdHRlbiwgbWFwLCBwYXJ0aXRpb24sIHBsdWNrLCBzb3J0LCB1bmlxIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgYWRkQmxvY2tlZENhbGxiYWNrcywgYWRkRXhlY3V0aW5nQ2FsbGJhY2tzLCBhZ2dyZWdhdGVDYWxsYmFja3MsIGV4ZWN1dGVDYWxsYmFjaywgcmVtb3ZlQmxvY2tlZENhbGxiYWNrcywgcmVtb3ZlUHJpb3JpdGl6ZWRDYWxsYmFja3MgfSBmcm9tICcuLi9hY3Rpb25zL2NhbGxiYWNrcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlJZCB9IGZyb20gJy4uL2FjdGlvbnMvZGVwZW5kZW5jaWVzJztcbmltcG9ydCB7IGNvbWJpbmVJZEFuZFByb3AgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llc190cyc7XG5pbXBvcnQgaXNBcHBSZWFkeSBmcm9tICcuLi9hY3Rpb25zL2lzQXBwUmVhZHknO1xuaW1wb3J0IHsgZ2V0QXBwU3RhdGUgfSBmcm9tICcuLi9yZWR1Y2Vycy9jb25zdGFudHMnO1xuY29uc3Qgc29ydFByaW9yaXR5ID0gKGMxLCBjMikgPT4ge1xuICAgIHJldHVybiAoYzEucHJpb3JpdHkgPz8gJycpID4gKGMyLnByaW9yaXR5ID8/ICcnKSA/IC0xIDogMTtcbn07XG5jb25zdCBnZXRTdGFzaCA9IChjYiwgcGF0aHMpID0+IHtcbiAgICBjb25zdCB7IGdldE91dHB1dHMgfSA9IGNiO1xuICAgIGNvbnN0IGFsbE91dHB1dHMgPSBnZXRPdXRwdXRzKHBhdGhzKTtcbiAgICBjb25zdCBmbGF0T3V0cHV0cyA9IGZsYXR0ZW4oYWxsT3V0cHV0cyk7XG4gICAgY29uc3QgYWxsUHJvcElkcyA9IFtdO1xuICAgIGNvbnN0IHJlcU91dCA9IHt9O1xuICAgIGZsYXRPdXRwdXRzLmZvckVhY2goKHsgaWQsIHByb3BlcnR5IH0pID0+IHtcbiAgICAgICAgY29uc3QgaWRTdHIgPSBzdHJpbmdpZnlJZChpZCk7XG4gICAgICAgIGNvbnN0IGlkT3V0ID0gKHJlcU91dFtpZFN0cl0gPSByZXFPdXRbaWRTdHJdIHx8IFtdKTtcbiAgICAgICAgaWRPdXQucHVzaChwcm9wZXJ0eSk7XG4gICAgICAgIGFsbFByb3BJZHMucHVzaChjb21iaW5lSWRBbmRQcm9wKHsgaWQ6IGlkU3RyLCBwcm9wZXJ0eSB9KSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgYWxsT3V0cHV0cywgYWxsUHJvcElkcyB9O1xufTtcbmNvbnN0IGdldElkcyA9IChjYiwgcGF0aHMpID0+IHVuaXEocGx1Y2soJ2lkJywgW1xuICAgIC4uLmZsYXR0ZW4oY2IuZ2V0SW5wdXRzKHBhdGhzKSksXG4gICAgLi4uZmxhdHRlbihjYi5nZXRTdGF0ZShwYXRocykpXG5dKSk7XG5jb25zdCBvYnNlcnZlciA9IHtcbiAgICBvYnNlcnZlcjogYXN5bmMgKHsgZGlzcGF0Y2gsIGdldFN0YXRlIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3M6IHsgZXhlY3V0aW5nLCB3YXRjaGVkIH0sIGNvbmZpZywgaG9va3MsIGxheW91dCwgcGF0aHMsIGFwcExpZmVjeWNsZSB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IHsgY2FsbGJhY2tzOiB7IHByaW9yaXRpemVkIH0gfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGlmIChhcHBMaWZlY3ljbGUgIT09IGdldEFwcFN0YXRlKCdIWURSQVRFRCcpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXZhaWxhYmxlID0gTWF0aC5tYXgoMCwgMTIgLSBleGVjdXRpbmcubGVuZ3RoIC0gd2F0Y2hlZC5sZW5ndGgpO1xuICAgICAgICAvLyBPcmRlciBwcmlvcml0aXplZCBjYWxsYmFja3MgYmFzZWQgb24gZGVwdGggYW5kIGJyZWFkdGggb2YgY2FsbGJhY2sgY2hhaW5cbiAgICAgICAgcHJpb3JpdGl6ZWQgPSBzb3J0KHNvcnRQcmlvcml0eSwgcHJpb3JpdGl6ZWQpO1xuICAgICAgICAvLyBEaXZpZGUgYmV0d2VlbiBzeW5jIGFuZCBhc3luY1xuICAgICAgICBjb25zdCBbc3luY0NhbGxiYWNrcywgYXN5bmNDYWxsYmFja3NdID0gcGFydGl0aW9uKGNiID0+IGlzQXBwUmVhZHkobGF5b3V0LCBwYXRocywgZ2V0SWRzKGNiLCBwYXRocykpID09PSB0cnVlLCBwcmlvcml0aXplZCk7XG4gICAgICAgIGNvbnN0IHBpY2tlZFN5bmNDYWxsYmFja3MgPSBzeW5jQ2FsbGJhY2tzLnNsaWNlKDAsIGF2YWlsYWJsZSk7XG4gICAgICAgIGNvbnN0IHBpY2tlZEFzeW5jQ2FsbGJhY2tzID0gYXN5bmNDYWxsYmFja3Muc2xpY2UoMCwgYXZhaWxhYmxlIC0gcGlja2VkU3luY0NhbGxiYWNrcy5sZW5ndGgpO1xuICAgICAgICBpZiAocGlja2VkU3luY0NhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICAgICAgcmVtb3ZlUHJpb3JpdGl6ZWRDYWxsYmFja3MocGlja2VkU3luY0NhbGxiYWNrcyksXG4gICAgICAgICAgICAgICAgYWRkRXhlY3V0aW5nQ2FsbGJhY2tzKG1hcChjYiA9PiBleGVjdXRlQ2FsbGJhY2soY2IsIGNvbmZpZywgaG9va3MsIHBhdGhzLCBsYXlvdXQsIGdldFN0YXNoKGNiLCBwYXRocyksIGRpc3BhdGNoLCBnZXRTdGF0ZSksIHBpY2tlZFN5bmNDYWxsYmFja3MpKVxuICAgICAgICAgICAgXSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwaWNrZWRBc3luY0NhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmVycmVkID0gbWFwKGNiID0+ICh7XG4gICAgICAgICAgICAgICAgLi4uY2IsXG4gICAgICAgICAgICAgICAgLi4uZ2V0U3Rhc2goY2IsIHBhdGhzKSxcbiAgICAgICAgICAgICAgICBpc1JlYWR5OiBpc0FwcFJlYWR5KGxheW91dCwgcGF0aHMsIGdldElkcyhjYiwgcGF0aHMpKVxuICAgICAgICAgICAgfSksIHBpY2tlZEFzeW5jQ2FsbGJhY2tzKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICAgICAgcmVtb3ZlUHJpb3JpdGl6ZWRDYWxsYmFja3MocGlja2VkQXN5bmNDYWxsYmFja3MpLFxuICAgICAgICAgICAgICAgIGFkZEJsb2NrZWRDYWxsYmFja3MoZGVmZXJyZWQpXG4gICAgICAgICAgICBdKSk7XG4gICAgICAgICAgICBkZWZlcnJlZC5mb3JFYWNoKGFzeW5jIChjYikgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNiLmlzUmVhZHk7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBjYWxsYmFja3M6IHsgYmxvY2tlZCB9IH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYmVlbiByZW1vdmVkIGZyb20gdGhlIGBibG9ja2VkYCBsaXN0IHNpbmNlIC0gb25cbiAgICAgICAgICAgICAgICAvLyBjYWxsYmFjayBjb21wbGV0aW9uLCBhbm90aGVyIGNhbGxiYWNrIG1heSBiZSBjYW5jZWxsZWRcbiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBjYWxsYmFjayBpbnN0YW5jZSBvciBvbmUgdGhhdCBtYXRjaGVzIGl0cyBwcm9taXNlXG4gICAgICAgICAgICAgICAgLy8gKGVnLiBjb3VsZCBoYXZlIGJlZW4gcHJ1bmVkKVxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDYiA9IGZpbmQoX2NiID0+IF9jYiA9PT0gY2IgfHwgX2NiLmlzUmVhZHkgPT09IGNiLmlzUmVhZHksIGJsb2NrZWQpO1xuICAgICAgICAgICAgICAgIGlmICghY3VycmVudENiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0aW5nQ2FsbGJhY2sgPSBleGVjdXRlQ2FsbGJhY2soY2IsIGNvbmZpZywgaG9va3MsIHBhdGhzLCBsYXlvdXQsIGNiLCBkaXNwYXRjaCwgZ2V0U3RhdGUpO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUJsb2NrZWRDYWxsYmFja3MoW2NiXSksXG4gICAgICAgICAgICAgICAgICAgIGFkZEV4ZWN1dGluZ0NhbGxiYWNrcyhbZXhlY3V0aW5nQ2FsbGJhY2tdKVxuICAgICAgICAgICAgICAgIF0pKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBpbnB1dHM6IFsnY2FsbGJhY2tzLnByaW9yaXRpemVkJywgJ2NhbGxiYWNrcy5jb21wbGV0ZWQnXVxufTtcbmV4cG9ydCBkZWZhdWx0IG9ic2VydmVyO1xuIiwiaW1wb3J0IHsgYWxsLCBjb25jYXQsIGRpZmZlcmVuY2UsIGZpbHRlciwgZmxhdHRlbiwgZ3JvdXBCeSwgaW5jbHVkZXMsIGludGVyc2VjdGlvbiwgaXNFbXB0eSwgaXNOaWwsIG1hcCwgbWVyZ2VMZWZ0LCBtZXJnZVdpdGgsIHBsdWNrLCByZWR1Y2UsIHZhbHVlcyB9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7IGFnZ3JlZ2F0ZUNhbGxiYWNrcywgcmVtb3ZlUHJpb3JpdGl6ZWRDYWxsYmFja3MsIHJlbW92ZUV4ZWN1dGluZ0NhbGxiYWNrcywgcmVtb3ZlV2F0Y2hlZENhbGxiYWNrcywgYWRkUHJpb3JpdGl6ZWRDYWxsYmFja3MsIGFkZEV4ZWN1dGluZ0NhbGxiYWNrcywgYWRkV2F0Y2hlZENhbGxiYWNrcywgcmVtb3ZlQmxvY2tlZENhbGxiYWNrcywgYWRkQmxvY2tlZENhbGxiYWNrcywgYWRkUmVxdWVzdGVkQ2FsbGJhY2tzLCByZW1vdmVSZXF1ZXN0ZWRDYWxsYmFja3MgfSBmcm9tICcuLi9hY3Rpb25zL2NhbGxiYWNrcyc7XG5pbXBvcnQgeyBpc011bHRpVmFsdWVkIH0gZnJvbSAnLi4vYWN0aW9ucy9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHsgY29tYmluZUlkQW5kUHJvcCwgZ2V0UmVhZHlDYWxsYmFja3MsIGdldFVuaXF1ZUlkZW50aWZpZXIsIHBydW5lQ2FsbGJhY2tzIH0gZnJvbSAnLi4vYWN0aW9ucy9kZXBlbmRlbmNpZXNfdHMnO1xuaW1wb3J0IHdhaXQgZnJvbSAnLi8uLi91dGlscy93YWl0JztcbmltcG9ydCB7IGdldFBlbmRpbmdDYWxsYmFja3MgfSBmcm9tICcuLi91dGlscy9jYWxsYmFja3MnO1xuY29uc3Qgb2JzZXJ2ZXIgPSB7XG4gICAgb2JzZXJ2ZXI6IGFzeW5jICh7IGRpc3BhdGNoLCBnZXRTdGF0ZSB9KSA9PiB7XG4gICAgICAgIGF3YWl0IHdhaXQoMCk7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2tzLCBjYWxsYmFja3M6IHsgcHJpb3JpdGl6ZWQsIGJsb2NrZWQsIGV4ZWN1dGluZywgd2F0Y2hlZCwgc3RvcmVkIH0sIHBhdGhzLCBncmFwaHMgfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGxldCB7IGNhbGxiYWNrczogeyByZXF1ZXN0ZWQgfSB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgaW5pdGlhbFJlcXVlc3RlZCA9IHJlcXVlc3RlZC5zbGljZSgwKTtcbiAgICAgICAgY29uc3QgcGVuZGluZ0NhbGxiYWNrcyA9IGdldFBlbmRpbmdDYWxsYmFja3MoY2FsbGJhY2tzKTtcbiAgICAgICAgLypcbiAgICAgICAgICAgIDAuIFBydW5lIGNpcmN1bGFyIGNhbGxiYWNrcyB0aGF0IGhhdmUgY29tcGxldGVkIHRoZSBsb29wXG4gICAgICAgICAgICAtIGNiLmNhbGxiYWNrIGluY2x1ZGVkIGluIGNiLnByZWRlY2Vzc29yc1xuICAgICAgICAqL1xuICAgICAgICBjb25zdCByQ2lyY3VsYXJzID0gZmlsdGVyKGNiID0+IGluY2x1ZGVzKGNiLmNhbGxiYWNrLCBjYi5wcmVkZWNlc3NvcnMgPz8gW10pLCByZXF1ZXN0ZWQpO1xuICAgICAgICAvKlxuICAgICAgICAgICAgVE9ETz9cbiAgICAgICAgICAgIENsZWFuIHVwIHRoZSBgcmVxdWVzdGVkYCBsaXN0IC0gZHVyaW5nIHRoZSBkaXNwYXRjaCBwaGFzZSxcbiAgICAgICAgICAgIGNpcmN1bGFycyB3aWxsIGJlIHJlbW92ZWQgZm9yIHJlYWxcbiAgICAgICAgKi9cbiAgICAgICAgcmVxdWVzdGVkID0gZGlmZmVyZW5jZShyZXF1ZXN0ZWQsIHJDaXJjdWxhcnMpO1xuICAgICAgICAvKlxuICAgICAgICAgICAgMS4gUmVtb3ZlIGR1cGxpY2F0ZWQgYHJlcXVlc3RlZGAgY2FsbGJhY2tzIC0gZ2l2ZSBwcmVjZWRlbmNlIHRvIG5ld2VyIGNhbGxiYWNrcyBvdmVyIG9sZGVyIG9uZXNcbiAgICAgICAgKi9cbiAgICAgICAgbGV0IHJEdXBsaWNhdGVzID0gW107XG4gICAgICAgIGNvbnN0IHJNZXJnZWREdXBsaWNhdGVzID0gW107XG4gICAgICAgIHZhbHVlcyhncm91cEJ5KGdldFVuaXF1ZUlkZW50aWZpZXIsIHJlcXVlc3RlZCkpLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgICAgICAgaWYgKGdyb3VwLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIGtlZXAgY2FsbGJhY2sgaWYgaXRzIHRoZSBvbmx5IG9uZSBvZiBpdHMga2luZFxuICAgICAgICAgICAgICAgIHJNZXJnZWREdXBsaWNhdGVzLnB1c2goZ3JvdXBbMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5pdGlhbCA9IGdyb3VwLmZpbmQoY2IgPT4gY2IuaW5pdGlhbENhbGwpO1xuICAgICAgICAgICAgICAgIGlmIChpbml0aWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRyb3AgdGhlIGluaXRpYWwgY2FsbGJhY2sgaWYgaXQncyBub3QgYWxvbmVcbiAgICAgICAgICAgICAgICAgICAgckR1cGxpY2F0ZXMucHVzaChpbml0aWFsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBXaXRob3V0SW5pdGlhbCA9IGdyb3VwLmZpbHRlcihjYiA9PiBjYiAhPT0gaW5pdGlhbCk7XG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwV2l0aG91dEluaXRpYWwubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlJ3Mgb25seSBvbmUgY2FsbGJhY2sgYmVzaWRlIHRoZSBpbml0aWFsIG9uZSwga2VlcCB0aGF0IGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgICAgIHJNZXJnZWREdXBsaWNhdGVzLnB1c2goZ3JvdXBXaXRob3V0SW5pdGlhbFswXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgbWVyZ2UgYWxsIHJlbWFpbmluZyBjYWxsYmFja3MgdG9nZXRoZXJcbiAgICAgICAgICAgICAgICAgICAgckR1cGxpY2F0ZXMgPSBjb25jYXQockR1cGxpY2F0ZXMsIGdyb3VwV2l0aG91dEluaXRpYWwpO1xuICAgICAgICAgICAgICAgICAgICByTWVyZ2VkRHVwbGljYXRlcy5wdXNoKG1lcmdlTGVmdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkUHJvcElkczogcmVkdWNlKG1lcmdlV2l0aChNYXRoLm1heCksIHt9LCBwbHVjaygnY2hhbmdlZFByb3BJZHMnLCBncm91cFdpdGhvdXRJbml0aWFsKSksXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Hcm91cDogZmlsdGVyKGV4ZyA9PiBCb29sZWFuKGV4ZyksIHBsdWNrKCdleGVjdXRpb25Hcm91cCcsIGdyb3VwV2l0aG91dEluaXRpYWwpKS5zbGljZSgtMSlbMF1cbiAgICAgICAgICAgICAgICAgICAgfSwgZ3JvdXBXaXRob3V0SW5pdGlhbC5zbGljZSgtMSlbMF0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvKlxuICAgICAgICAgICAgVE9ETz9cbiAgICAgICAgICAgIENsZWFuIHVwIHRoZSBgcmVxdWVzdGVkYCBsaXN0IC0gZHVyaW5nIHRoZSBkaXNwYXRjaCBwaGFzZSxcbiAgICAgICAgICAgIGR1cGxpY2F0ZXMgd2lsbCBiZSByZW1vdmVkIGZvciByZWFsXG4gICAgICAgICovXG4gICAgICAgIHJlcXVlc3RlZCA9IHJNZXJnZWREdXBsaWNhdGVzO1xuICAgICAgICAvKlxuICAgICAgICAgICAgMi4gUmVtb3ZlIGR1cGxpY2F0ZWQgYHByaW9yaXRpemVkYCwgYGV4ZWN1dGluZ2AgYW5kIGB3YXRjaGluZ2AgY2FsbGJhY2tzXG4gICAgICAgICovXG4gICAgICAgIC8qXG4gICAgICAgICAgICBFeHRyYWN0IGFsbCBidXQgdGhlIGZpcnN0IGNhbGxiYWNrIGZyb20gZWFjaCBJT1Mta2V5IGdyb3VwXG4gICAgICAgICAgICB0aGVzZSBjYWxsYmFja3MgYXJlIGBwcmlvcml0aXplZGAgYW5kIGR1cGxpY2F0ZXMuXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IHBEdXBsaWNhdGVzID0gZmxhdHRlbihtYXAoZ3JvdXAgPT4gZ3JvdXAuc2xpY2UoMCwgLTEpLCB2YWx1ZXMoZ3JvdXBCeShnZXRVbmlxdWVJZGVudGlmaWVyLCBjb25jYXQocHJpb3JpdGl6ZWQsIHJlcXVlc3RlZCkpKSkpO1xuICAgICAgICBjb25zdCBiRHVwbGljYXRlcyA9IGZsYXR0ZW4obWFwKGdyb3VwID0+IGdyb3VwLnNsaWNlKDAsIC0xKSwgdmFsdWVzKGdyb3VwQnkoZ2V0VW5pcXVlSWRlbnRpZmllciwgY29uY2F0KGJsb2NrZWQsIHJlcXVlc3RlZCkpKSkpO1xuICAgICAgICBjb25zdCBlRHVwbGljYXRlcyA9IGZsYXR0ZW4obWFwKGdyb3VwID0+IGdyb3VwLnNsaWNlKDAsIC0xKSwgdmFsdWVzKGdyb3VwQnkoZ2V0VW5pcXVlSWRlbnRpZmllciwgY29uY2F0KGV4ZWN1dGluZywgcmVxdWVzdGVkKSkpKSk7XG4gICAgICAgIGNvbnN0IHdEdXBsaWNhdGVzID0gZmxhdHRlbihtYXAoZ3JvdXAgPT4gZ3JvdXAuc2xpY2UoMCwgLTEpLCB2YWx1ZXMoZ3JvdXBCeShnZXRVbmlxdWVJZGVudGlmaWVyLCBjb25jYXQod2F0Y2hlZCwgcmVxdWVzdGVkKSkpKSk7XG4gICAgICAgIC8qXG4gICAgICAgICAgICAzLiBNb2RpZnkgb3IgcmVtb3ZlIGNhbGxiYWNrcyB0aGF0IGFyZSBvdXRwdXR0aW5nIHRvIG5vbi1leGlzdGluZyBsYXlvdXQgYGlkYC5cbiAgICAgICAgKi9cbiAgICAgICAgY29uc3QgeyBhZGRlZDogckFkZGVkLCByZW1vdmVkOiByUmVtb3ZlZCB9ID0gcHJ1bmVDYWxsYmFja3MocmVxdWVzdGVkLCBwYXRocyk7XG4gICAgICAgIGNvbnN0IHsgYWRkZWQ6IHBBZGRlZCwgcmVtb3ZlZDogcFJlbW92ZWQgfSA9IHBydW5lQ2FsbGJhY2tzKHByaW9yaXRpemVkLCBwYXRocyk7XG4gICAgICAgIGNvbnN0IHsgYWRkZWQ6IGJBZGRlZCwgcmVtb3ZlZDogYlJlbW92ZWQgfSA9IHBydW5lQ2FsbGJhY2tzKGJsb2NrZWQsIHBhdGhzKTtcbiAgICAgICAgY29uc3QgeyBhZGRlZDogZUFkZGVkLCByZW1vdmVkOiBlUmVtb3ZlZCB9ID0gcHJ1bmVDYWxsYmFja3MoZXhlY3V0aW5nLCBwYXRocyk7XG4gICAgICAgIGNvbnN0IHsgYWRkZWQ6IHdBZGRlZCwgcmVtb3ZlZDogd1JlbW92ZWQgfSA9IHBydW5lQ2FsbGJhY2tzKHdhdGNoZWQsIHBhdGhzKTtcbiAgICAgICAgLypcbiAgICAgICAgICAgIFRPRE8/XG4gICAgICAgICAgICBDbGVhbiB1cCB0aGUgYHJlcXVlc3RlZGAgbGlzdCAtIGR1cmluZyB0aGUgZGlzcGF0Y2ggcGhhc2UsXG4gICAgICAgICAgICBpdCB3aWxsIGJlIHVwZGF0ZWQgZm9yIHJlYWxcbiAgICAgICAgKi9cbiAgICAgICAgcmVxdWVzdGVkID0gY29uY2F0KGRpZmZlcmVuY2UocmVxdWVzdGVkLCByUmVtb3ZlZCksIHJBZGRlZCk7XG4gICAgICAgIC8qXG4gICAgICAgICAgICA0LiBGaW5kIGByZXF1ZXN0ZWRgIGNhbGxiYWNrcyB0aGF0IGRvIG5vdCBkZXBlbmQgb24gYSBvdXRzdGFuZGluZyBvdXRwdXQgKGFzIGVpdGhlciBpbnB1dCBvciBzdGF0ZSlcbiAgICAgICAgKi9cbiAgICAgICAgbGV0IHJlYWR5Q2FsbGJhY2tzID0gZ2V0UmVhZHlDYWxsYmFja3MocGF0aHMsIHJlcXVlc3RlZCwgcGVuZGluZ0NhbGxiYWNrcywgZ3JhcGhzKTtcbiAgICAgICAgbGV0IG9sZEJsb2NrZWQgPSBbXTtcbiAgICAgICAgbGV0IG5ld0Jsb2NrZWQgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIHRoZXJlIGlzIDpcbiAgICAgICAgICogLSBubyByZWFkeSBjYWxsYmFja3NcbiAgICAgICAgICogLSBhdCBsZWFzdCBvbmUgcmVxdWVzdGVkIGNhbGxiYWNrXG4gICAgICAgICAqIC0gbm8gYWRkaXRpb25hbCBwZW5kaW5nIGNhbGxiYWNrc1xuICAgICAgICAgKlxuICAgICAgICAgKiBjYW4gYXNzdW1lOlxuICAgICAgICAgKiAtIHRoZSByZXF1ZXN0ZWQgY2FsbGJhY2tzIGFyZSBwYXJ0IG9mIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSBsb29wXG4gICAgICAgICAqXG4gICAgICAgICAqIHRoZW4gcmVjdXJzaXZlbHk6XG4gICAgICAgICAqIC0gYXNzdW1lIHRoZSBmaXJzdCBjYWxsYmFjayBpbiB0aGUgbGlzdCBpcyByZWFkeSAodGhlIGVudHJ5IHBvaW50IGZvciB0aGUgbG9vcClcbiAgICAgICAgICogLSBjaGVjayB3aGF0IGNhbGxiYWNrcyBhcmUgYmxvY2tlZCAvIHJlYWR5IHdpdGggdGhlIGFzc3VtcHRpb25cbiAgICAgICAgICogLSB1cGRhdGUgdGhlIG1pc3NpbmcgcHJlZGVjZXNzb3JzIGJhc2VkIG9uIGFzc3VtcHRpb25zXG4gICAgICAgICAqIC0gY29udGludWUgdW50aWwgdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBjYW5kaWRhdGVzXG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoIXJlYWR5Q2FsbGJhY2tzLmxlbmd0aCAmJlxuICAgICAgICAgICAgcmVxdWVzdGVkLmxlbmd0aCAmJlxuICAgICAgICAgICAgcmVxdWVzdGVkLmxlbmd0aCA9PT0gcGVuZGluZ0NhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBjYW5kaWRhdGVzID0gcmVxdWVzdGVkLnNsaWNlKDApO1xuICAgICAgICAgICAgd2hpbGUgKGNhbmRpZGF0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gQXNzdW1lIDFzdCBjYWxsYmFjayBpcyByZWFkeSBhbmRcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgY2FuZGlkYXRlcyAvIHJlYWR5Q2FsbGJhY2tzIGFjY29yZGluZ2x5XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhZHlDYWxsYmFjayA9IGNhbmRpZGF0ZXNbMF07XG4gICAgICAgICAgICAgICAgcmVhZHlDYWxsYmFja3MucHVzaChyZWFkeUNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gY2FuZGlkYXRlcy5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICAvLyBSZW1haW5pbmcgY2FuZGlkYXRlcyBhcmUgbm90IGJsb2NrZWQgYnkgY3VycmVudCBhc3N1bXB0aW9uc1xuICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMgPSBnZXRSZWFkeUNhbGxiYWNrcyhwYXRocywgY2FuZGlkYXRlcywgcmVhZHlDYWxsYmFja3MpO1xuICAgICAgICAgICAgICAgIC8vIEJsb2NrZWQgcmVxdWVzdHMgbmVlZCB0byBtYWtlIHN1cmUgdGhleSBoYXZlIHRoZSBjYWxsYmFjayBhcyBhIHByZWRlY2Vzc29yXG4gICAgICAgICAgICAgICAgY29uc3QgYmxvY2tlZEJ5QXNzdW1wdGlvbnMgPSBkaWZmZXJlbmNlKGNhbmRpZGF0ZXMsIGNhbmRpZGF0ZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVkID0gZmlsdGVyKGNiID0+ICFjYi5wcmVkZWNlc3NvcnMgfHxcbiAgICAgICAgICAgICAgICAgICAgIWluY2x1ZGVzKHJlYWR5Q2FsbGJhY2suY2FsbGJhY2ssIGNiLnByZWRlY2Vzc29ycyksIGJsb2NrZWRCeUFzc3VtcHRpb25zKTtcbiAgICAgICAgICAgICAgICBvbGRCbG9ja2VkID0gY29uY2F0KG9sZEJsb2NrZWQsIG1vZGlmaWVkKTtcbiAgICAgICAgICAgICAgICBuZXdCbG9ja2VkID0gY29uY2F0KG5ld0Jsb2NrZWQsIG1vZGlmaWVkLm1hcChjYiA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAuLi5jYixcbiAgICAgICAgICAgICAgICAgICAgcHJlZGVjZXNzb3JzOiBjb25jYXQoY2IucHJlZGVjZXNzb3JzID8/IFtdLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFkeUNhbGxiYWNrLmNhbGxiYWNrXG4gICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKlxuICAgICAgICAgICAgVE9ETz9cbiAgICAgICAgICAgIENsZWFuIHVwIHRoZSBgcmVxdWVzdGVkYCBsaXN0IC0gZHVyaW5nIHRoZSBkaXNwYXRjaCBwaGFzZSxcbiAgICAgICAgICAgIGl0IHdpbGwgYmUgdXBkYXRlZCBmb3IgcmVhbFxuICAgICAgICAqL1xuICAgICAgICByZXF1ZXN0ZWQgPSBjb25jYXQoZGlmZmVyZW5jZShyZXF1ZXN0ZWQsIG9sZEJsb2NrZWQpLCBuZXdCbG9ja2VkKTtcbiAgICAgICAgLypcbiAgICAgICAgICAgIDUuIFBydW5lIGNhbGxiYWNrcyB0aGF0IGJlY2FtZSBpcnJlbGV2YW50IGluIHRoZWlyIGBleGVjdXRpb25Hcm91cGBcbiAgICAgICAgKi9cbiAgICAgICAgLy8gR3JvdXAgYnkgZXhlY3V0aW9uR3JvdXAsIGRyb3Agbm9uLWV4ZWN1dGlvbkdyb3VwIGNhbGxiYWNrc1xuICAgICAgICAvLyB0aG9zZSB3ZXJlIG5vdCB0cmlnZ2VyZWQgYnkgbGF5b3V0IGNoYW5nZXMgYW5kIGRvbid0IGhhdmUgXCJzdHJvbmdcIiBpbnRlcmRlcGVuZGVuY3kgZm9yXG4gICAgICAgIC8vIGNhbGxiYWNrIGNoYWluIGNvbXBsZXRpb25cbiAgICAgICAgY29uc3QgcGVuZGluZ0dyb3VwcyA9IGdyb3VwQnkoY2IgPT4gY2IuZXhlY3V0aW9uR3JvdXAsIGZpbHRlcihjYiA9PiAhaXNOaWwoY2IuZXhlY3V0aW9uR3JvdXApLCBzdG9yZWQpKTtcbiAgICAgICAgY29uc3QgZHJvcHBlZCA9IGZpbHRlcihjYiA9PiB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBgc3RvcmVkYCBjYWxsYmFjayBmb3IgdGhlIGdyb3VwLCBubyBvdXRwdXRzIHdlcmUgZHJvcHBlZCAtPiBgY2JgIGlzIGtlcHRcbiAgICAgICAgICAgIGlmICghY2IuZXhlY3V0aW9uR3JvdXAgfHxcbiAgICAgICAgICAgICAgICAhcGVuZGluZ0dyb3Vwc1tjYi5leGVjdXRpb25Hcm91cF0gfHxcbiAgICAgICAgICAgICAgICAhcGVuZGluZ0dyb3Vwc1tjYi5leGVjdXRpb25Hcm91cF0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gR2V0IGFsbCBpbnB1dHMgZm9yIGBjYmBcbiAgICAgICAgICAgIGNvbnN0IGlucHV0cyA9IG1hcChjb21iaW5lSWRBbmRQcm9wLCBmbGF0dGVuKGNiLmdldElucHV0cyhwYXRocykpKTtcbiAgICAgICAgICAgIC8vIEdldCBhbGwgdGhlIHBvdGVudGlhbGx5IHVwZGF0ZWQgcHJvcHMgZm9yIHRoZSBncm91cCBzbyBmYXJcbiAgICAgICAgICAgIGNvbnN0IGFsbFByb3BzID0gZmxhdHRlbihtYXAoZ2NiID0+IGdjYi5leGVjdXRpb25NZXRhLmFsbFByb3BzLCBwZW5kaW5nR3JvdXBzW2NiLmV4ZWN1dGlvbkdyb3VwXSkpO1xuICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgdXBkYXRlZCBwcm9wcyBmb3IgdGhlIGdyb3VwIHNvIGZhclxuICAgICAgICAgICAgY29uc3QgdXBkYXRlZCA9IGZsYXR0ZW4obWFwKGdjYiA9PiBnY2IuZXhlY3V0aW9uTWV0YS51cGRhdGVkUHJvcHMsIHBlbmRpbmdHcm91cHNbY2IuZXhlY3V0aW9uR3JvdXBdKSk7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIG92ZXJsYXAgYmV0d2VlbiB0aGUgdXBkYXRlZCBwcm9wcyBhbmQgdGhlIGlucHV0cyxcbiAgICAgICAgICAgIC8vICsgdGhlcmUncyBubyBwcm9wcyB0aGF0IGFyZW4ndCBjb3ZlcmVkIGJ5IHRoZSBwb3RlbnRpYWxseSB1cGRhdGVkIHByb3BzLFxuICAgICAgICAgICAgLy8gYW5kIG5vdCBhbGwgaW5wdXRzIGFyZSBtdWx0aSB2YWx1ZWRcbiAgICAgICAgICAgIC8vIC0+IGRyb3AgYGNiYFxuICAgICAgICAgICAgY29uc3QgcmVzID0gaXNFbXB0eShpbnRlcnNlY3Rpb24oaW5wdXRzLCB1cGRhdGVkKSkgJiZcbiAgICAgICAgICAgICAgICBpc0VtcHR5KGRpZmZlcmVuY2UoaW5wdXRzLCBhbGxQcm9wcykpICYmXG4gICAgICAgICAgICAgICAgIWFsbChpc011bHRpVmFsdWVkLCBjYi5jYWxsYmFjay5pbnB1dHMpO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSwgcmVhZHlDYWxsYmFja3MpO1xuICAgICAgICAvKlxuICAgICAgICAgICAgVE9ETz9cbiAgICAgICAgICAgIENsZWFuIHVwIHRoZSBgcmVxdWVzdGVkYCBsaXN0IC0gZHVyaW5nIHRoZSBkaXNwYXRjaCBwaGFzZSxcbiAgICAgICAgICAgIGl0IHdpbGwgYmUgdXBkYXRlZCBmb3IgcmVhbFxuICAgICAgICAqL1xuICAgICAgICByZXF1ZXN0ZWQgPSBkaWZmZXJlbmNlKHJlcXVlc3RlZCwgZHJvcHBlZCk7XG4gICAgICAgIHJlYWR5Q2FsbGJhY2tzID0gZGlmZmVyZW5jZShyZWFkeUNhbGxiYWNrcywgZHJvcHBlZCk7XG4gICAgICAgIHJlcXVlc3RlZCA9IGRpZmZlcmVuY2UocmVxdWVzdGVkLCByZWFkeUNhbGxiYWNrcyk7XG4gICAgICAgIGNvbnN0IGFkZGVkID0gZGlmZmVyZW5jZShyZXF1ZXN0ZWQsIGluaXRpYWxSZXF1ZXN0ZWQpO1xuICAgICAgICBjb25zdCByZW1vdmVkID0gZGlmZmVyZW5jZShpbml0aWFsUmVxdWVzdGVkLCByZXF1ZXN0ZWQpO1xuICAgICAgICBkaXNwYXRjaChhZ2dyZWdhdGVDYWxsYmFja3MoW1xuICAgICAgICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdGVkIGNhbGxiYWNrc1xuICAgICAgICAgICAgYWRkZWQubGVuZ3RoID8gYWRkUmVxdWVzdGVkQ2FsbGJhY2tzKGFkZGVkKSA6IG51bGwsXG4gICAgICAgICAgICByZW1vdmVkLmxlbmd0aCA/IHJlbW92ZVJlcXVlc3RlZENhbGxiYWNrcyhyZW1vdmVkKSA6IG51bGwsXG4gICAgICAgICAgICAvLyBDbGVhbiB1cCBkdXBsaWNhdGVkIGNhbGxiYWNrc1xuICAgICAgICAgICAgcER1cGxpY2F0ZXMubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyByZW1vdmVQcmlvcml0aXplZENhbGxiYWNrcyhwRHVwbGljYXRlcylcbiAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICBiRHVwbGljYXRlcy5sZW5ndGggPyByZW1vdmVCbG9ja2VkQ2FsbGJhY2tzKGJEdXBsaWNhdGVzKSA6IG51bGwsXG4gICAgICAgICAgICBlRHVwbGljYXRlcy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHJlbW92ZUV4ZWN1dGluZ0NhbGxiYWNrcyhlRHVwbGljYXRlcylcbiAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICB3RHVwbGljYXRlcy5sZW5ndGggPyByZW1vdmVXYXRjaGVkQ2FsbGJhY2tzKHdEdXBsaWNhdGVzKSA6IG51bGwsXG4gICAgICAgICAgICAvLyBQcnVuZSBjYWxsYmFja3NcbiAgICAgICAgICAgIHBSZW1vdmVkLmxlbmd0aCA/IHJlbW92ZVByaW9yaXRpemVkQ2FsbGJhY2tzKHBSZW1vdmVkKSA6IG51bGwsXG4gICAgICAgICAgICBwQWRkZWQubGVuZ3RoID8gYWRkUHJpb3JpdGl6ZWRDYWxsYmFja3MocEFkZGVkKSA6IG51bGwsXG4gICAgICAgICAgICBiUmVtb3ZlZC5sZW5ndGggPyByZW1vdmVCbG9ja2VkQ2FsbGJhY2tzKGJSZW1vdmVkKSA6IG51bGwsXG4gICAgICAgICAgICBiQWRkZWQubGVuZ3RoID8gYWRkQmxvY2tlZENhbGxiYWNrcyhiQWRkZWQpIDogbnVsbCxcbiAgICAgICAgICAgIGVSZW1vdmVkLmxlbmd0aCA/IHJlbW92ZUV4ZWN1dGluZ0NhbGxiYWNrcyhlUmVtb3ZlZCkgOiBudWxsLFxuICAgICAgICAgICAgZUFkZGVkLmxlbmd0aCA/IGFkZEV4ZWN1dGluZ0NhbGxiYWNrcyhlQWRkZWQpIDogbnVsbCxcbiAgICAgICAgICAgIHdSZW1vdmVkLmxlbmd0aCA/IHJlbW92ZVdhdGNoZWRDYWxsYmFja3Mod1JlbW92ZWQpIDogbnVsbCxcbiAgICAgICAgICAgIHdBZGRlZC5sZW5ndGggPyBhZGRXYXRjaGVkQ2FsbGJhY2tzKHdBZGRlZCkgOiBudWxsLFxuICAgICAgICAgICAgLy8gUHJvbW90ZSBjYWxsYmFja3NcbiAgICAgICAgICAgIHJlYWR5Q2FsbGJhY2tzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gYWRkUHJpb3JpdGl6ZWRDYWxsYmFja3MocmVhZHlDYWxsYmFja3MpXG4gICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIF0pKTtcbiAgICB9LFxuICAgIGlucHV0czogWydjYWxsYmFja3MucmVxdWVzdGVkJywgJ2NhbGxiYWNrcy5jb21wbGV0ZWQnXVxufTtcbmV4cG9ydCBkZWZhdWx0IG9ic2VydmVyO1xuIiwiaW1wb3J0IHsgY29uY2F0LCBmaWx0ZXIsIGdyb3VwQnksIGlzTmlsLCBwYXJ0aXRpb24sIHJlZHVjZSwgdG9QYWlycyB9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7IGFnZ3JlZ2F0ZUNhbGxiYWNrcywgcmVtb3ZlU3RvcmVkQ2FsbGJhY2tzIH0gZnJvbSAnLi4vYWN0aW9ucy9jYWxsYmFja3MnO1xuaW1wb3J0IHsgZ2V0UGVuZGluZ0NhbGxiYWNrcyB9IGZyb20gJy4uL3V0aWxzL2NhbGxiYWNrcyc7XG5jb25zdCBvYnNlcnZlciA9IHtcbiAgICBvYnNlcnZlcjogKHsgZGlzcGF0Y2gsIGdldFN0YXRlIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3MgfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IHBlbmRpbmdDYWxsYmFja3MgPSBnZXRQZW5kaW5nQ2FsbGJhY2tzKGNhbGxiYWNrcyk7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2tzOiB7IHN0b3JlZCB9IH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBbbnVsbEdyb3VwQ2FsbGJhY2tzLCBncm91cENhbGxiYWNrc10gPSBwYXJ0aXRpb24oY2IgPT4gaXNOaWwoY2IuZXhlY3V0aW9uR3JvdXApLCBzdG9yZWQpO1xuICAgICAgICBjb25zdCBleGVjdXRpb25Hcm91cHMgPSBncm91cEJ5KGNiID0+IGNiLmV4ZWN1dGlvbkdyb3VwLCBncm91cENhbGxiYWNrcyk7XG4gICAgICAgIGNvbnN0IHBlbmRpbmdHcm91cHMgPSBncm91cEJ5KGNiID0+IGNiLmV4ZWN1dGlvbkdyb3VwLCBmaWx0ZXIoY2IgPT4gIWlzTmlsKGNiLmV4ZWN1dGlvbkdyb3VwKSwgcGVuZGluZ0NhbGxiYWNrcykpO1xuICAgICAgICBjb25zdCBkcm9wcGVkID0gcmVkdWNlKChyZXMsIFtleGVjdXRpb25Hcm91cCwgZXhlY3V0aW9uR3JvdXBDYWxsYmFja3NdKSA9PiAhcGVuZGluZ0dyb3Vwc1tleGVjdXRpb25Hcm91cF1cbiAgICAgICAgICAgID8gY29uY2F0KHJlcywgZXhlY3V0aW9uR3JvdXBDYWxsYmFja3MpXG4gICAgICAgICAgICA6IHJlcywgW10sIHRvUGFpcnMoZXhlY3V0aW9uR3JvdXBzKSk7XG4gICAgICAgIGRpc3BhdGNoKGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICBudWxsR3JvdXBDYWxsYmFja3MubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyByZW1vdmVTdG9yZWRDYWxsYmFja3MobnVsbEdyb3VwQ2FsbGJhY2tzKVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIGRyb3BwZWQubGVuZ3RoID8gcmVtb3ZlU3RvcmVkQ2FsbGJhY2tzKGRyb3BwZWQpIDogbnVsbFxuICAgICAgICBdKSk7XG4gICAgfSxcbiAgICBpbnB1dHM6IFsnY2FsbGJhY2tzLnN0b3JlZCcsICdjYWxsYmFja3MuY29tcGxldGVkJ11cbn07XG5leHBvcnQgZGVmYXVsdCBvYnNlcnZlcjtcbiIsImltcG9ydCB7IGFzc29jLCBhc3NvY1BhdGgsIGRpc3NvYyB9IGZyb20gJ3JhbWRhJztcbmNvbnN0IHNldEpvYiA9IChqb2IsIHN0YXRlKSA9PiBhc3NvYyhqb2Iuam9iSWQsIGpvYiwgc3RhdGUpO1xuY29uc3QgcmVtb3ZlSm9iID0gKGpvYklkLCBzdGF0ZSkgPT4gZGlzc29jKGpvYklkLCBzdGF0ZSk7XG5jb25zdCBzZXRPdXRkYXRlZCA9IChqb2JJZCwgc3RhdGUpID0+IGFzc29jUGF0aChbam9iSWQsICdvdXRkYXRlZCddLCB0cnVlLCBzdGF0ZSk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoc3RhdGUgPSB7fSwgYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdBRERfQ0FMTEJBQ0tfSk9CJzpcbiAgICAgICAgICAgIHJldHVybiBzZXRKb2IoYWN0aW9uLnBheWxvYWQsIHN0YXRlKTtcbiAgICAgICAgY2FzZSAnUkVNT1ZFX0NBTExCQUNLX0pPQic6XG4gICAgICAgICAgICByZXR1cm4gcmVtb3ZlSm9iKGFjdGlvbi5wYXlsb2FkLmpvYklkLCBzdGF0ZSk7XG4gICAgICAgIGNhc2UgJ0NBTExCQUNLX0pPQl9PVVREQVRFRCc6XG4gICAgICAgICAgICByZXR1cm4gc2V0T3V0ZGF0ZWQoYWN0aW9uLnBheWxvYWQuam9iSWQsIHN0YXRlKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBjb25jYXQsIGRpZmZlcmVuY2UsIHJlZHVjZSB9IGZyb20gJ3JhbWRhJztcbmV4cG9ydCB2YXIgQ2FsbGJhY2tBY3Rpb25UeXBlO1xuKGZ1bmN0aW9uIChDYWxsYmFja0FjdGlvblR5cGUpIHtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJBZGRCbG9ja2VkXCJdID0gXCJDYWxsYmFja3MuQWRkQmxvY2tlZFwiO1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIkFkZEV4ZWN1dGVkXCJdID0gXCJDYWxsYmFja3MuQWRkRXhlY3V0ZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJBZGRFeGVjdXRpbmdcIl0gPSBcIkNhbGxiYWNrcy5BZGRFeGVjdXRpbmdcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJBZGRQcmlvcml0aXplZFwiXSA9IFwiQ2FsbGJhY2tzLkFkZFByaW9yaXRpemVkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiQWRkUmVxdWVzdGVkXCJdID0gXCJDYWxsYmFja3MuQWRkUmVxdWVzdGVkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiQWRkU3RvcmVkXCJdID0gXCJDYWxsYmFja3MuQWRkU3RvcmVkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiQWRkV2F0Y2hlZFwiXSA9IFwiQ2FsbGJhY2tzLkFkZFdhdGNoZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJSZW1vdmVCbG9ja2VkXCJdID0gXCJDYWxsYmFja3MuUmVtb3ZlQmxvY2tlZFwiO1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIlJlbW92ZUV4ZWN1dGVkXCJdID0gXCJDYWxsYmFja3MuUmVtb3ZlRXhlY3V0ZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJSZW1vdmVFeGVjdXRpbmdcIl0gPSBcIkNhbGxiYWNrcy5SZW1vdmVFeGVjdXRpbmdcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJSZW1vdmVQcmlvcml0aXplZFwiXSA9IFwiQ2FsbGJhY2tzLlJlbW92ZVByaW9yaXRpemVkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiUmVtb3ZlUmVxdWVzdGVkXCJdID0gXCJDYWxsYmFja3MuUmVtb3ZlUmVxdWVzdGVkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiUmVtb3ZlU3RvcmVkXCJdID0gXCJDYWxsYmFja3MuUmVtb3ZlU3RvcmVkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiUmVtb3ZlV2F0Y2hlZFwiXSA9IFwiQ2FsbGJhY2tzLlJlbW92ZVdhdGNoZWRcIjtcbn0pKENhbGxiYWNrQWN0aW9uVHlwZSB8fCAoQ2FsbGJhY2tBY3Rpb25UeXBlID0ge30pKTtcbmV4cG9ydCB2YXIgQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlO1xuKGZ1bmN0aW9uIChDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGUpIHtcbiAgICBDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGVbXCJBZGRDb21wbGV0ZWRcIl0gPSBcIkNhbGxiYWNrcy5Db21wbGV0ZWRcIjtcbiAgICBDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGVbXCJBZ2dyZWdhdGVcIl0gPSBcIkNhbGxiYWNrcy5BZ2dyZWdhdGVcIjtcbn0pKENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZSB8fCAoQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlID0ge30pKTtcbmNvbnN0IERFRkFVTFRfU1RBVEUgPSB7XG4gICAgYmxvY2tlZDogW10sXG4gICAgZXhlY3V0ZWQ6IFtdLFxuICAgIGV4ZWN1dGluZzogW10sXG4gICAgcHJpb3JpdGl6ZWQ6IFtdLFxuICAgIHJlcXVlc3RlZDogW10sXG4gICAgc3RvcmVkOiBbXSxcbiAgICB3YXRjaGVkOiBbXSxcbiAgICBjb21wbGV0ZWQ6IDBcbn07XG5jb25zdCB0cmFuc2Zvcm1zID0ge1xuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkQmxvY2tlZF06IGNvbmNhdCxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZEV4ZWN1dGVkXTogY29uY2F0LFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkRXhlY3V0aW5nXTogY29uY2F0LFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkUHJpb3JpdGl6ZWRdOiBjb25jYXQsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRSZXF1ZXN0ZWRdOiBjb25jYXQsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRTdG9yZWRdOiBjb25jYXQsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRXYXRjaGVkXTogY29uY2F0LFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlQmxvY2tlZF06IGRpZmZlcmVuY2UsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVFeGVjdXRlZF06IGRpZmZlcmVuY2UsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVFeGVjdXRpbmddOiBkaWZmZXJlbmNlLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlUHJpb3JpdGl6ZWRdOiBkaWZmZXJlbmNlLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlUmVxdWVzdGVkXTogZGlmZmVyZW5jZSxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVN0b3JlZF06IGRpZmZlcmVuY2UsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVXYXRjaGVkXTogZGlmZmVyZW5jZVxufTtcbmNvbnN0IGZpZWxkcyA9IHtcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZEJsb2NrZWRdOiAnYmxvY2tlZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRFeGVjdXRlZF06ICdleGVjdXRlZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRFeGVjdXRpbmddOiAnZXhlY3V0aW5nJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFByaW9yaXRpemVkXTogJ3ByaW9yaXRpemVkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFJlcXVlc3RlZF06ICdyZXF1ZXN0ZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkU3RvcmVkXTogJ3N0b3JlZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRXYXRjaGVkXTogJ3dhdGNoZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlQmxvY2tlZF06ICdibG9ja2VkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZUV4ZWN1dGVkXTogJ2V4ZWN1dGVkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZUV4ZWN1dGluZ106ICdleGVjdXRpbmcnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlUHJpb3JpdGl6ZWRdOiAncHJpb3JpdGl6ZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlUmVxdWVzdGVkXTogJ3JlcXVlc3RlZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVTdG9yZWRdOiAnc3RvcmVkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVdhdGNoZWRdOiAnd2F0Y2hlZCdcbn07XG5jb25zdCBtdXRhdGVDb21wbGV0ZWQgPSAoc3RhdGUsIGFjdGlvbikgPT4gKHtcbiAgICAuLi5zdGF0ZSxcbiAgICBjb21wbGV0ZWQ6IHN0YXRlLmNvbXBsZXRlZCArIGFjdGlvbi5wYXlsb2FkXG59KTtcbmNvbnN0IG11dGF0ZUNhbGxiYWNrcyA9IChzdGF0ZSwgYWN0aW9uKSA9PiB7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gdHJhbnNmb3Jtc1thY3Rpb24udHlwZV07XG4gICAgY29uc3QgZmllbGQgPSBmaWVsZHNbYWN0aW9uLnR5cGVdO1xuICAgIHJldHVybiAhdHJhbnNmb3JtIHx8ICFmaWVsZCB8fCBhY3Rpb24ucGF5bG9hZC5sZW5ndGggPT09IDBcbiAgICAgICAgPyBzdGF0ZVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgW2ZpZWxkXTogdHJhbnNmb3JtKHN0YXRlW2ZpZWxkXSwgYWN0aW9uLnBheWxvYWQpXG4gICAgICAgIH07XG59O1xuZXhwb3J0IGRlZmF1bHQgKHN0YXRlID0gREVGQVVMVF9TVEFURSwgYWN0aW9uKSA9PiByZWR1Y2UoKHMsIGEpID0+IHtcbiAgICBpZiAoYSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcztcbiAgICB9XG4gICAgZWxzZSBpZiAoYS50eXBlID09PSBDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGUuQWRkQ29tcGxldGVkKSB7XG4gICAgICAgIHJldHVybiBtdXRhdGVDb21wbGV0ZWQocywgYSk7XG4gICAgfVxuICAgIHJldHVybiBtdXRhdGVDYWxsYmFja3MocywgYSk7XG59LCBzdGF0ZSwgYWN0aW9uLnR5cGUgPT09IENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZS5BZ2dyZWdhdGVcbiAgICA/IGFjdGlvbi5wYXlsb2FkXG4gICAgOiBbYWN0aW9uXSk7XG4iLCJleHBvcnQgdmFyIElzTG9hZGluZ0FjdGlvblR5cGU7XG4oZnVuY3Rpb24gKElzTG9hZGluZ0FjdGlvblR5cGUpIHtcbiAgICBJc0xvYWRpbmdBY3Rpb25UeXBlW1wiU2V0XCJdID0gXCJJc0xvYWRpbmcuU2V0XCI7XG59KShJc0xvYWRpbmdBY3Rpb25UeXBlIHx8IChJc0xvYWRpbmdBY3Rpb25UeXBlID0ge30pKTtcbmNvbnN0IERFRkFVTFRfU1RBVEUgPSB0cnVlO1xuZXhwb3J0IGRlZmF1bHQgKHN0YXRlID0gREVGQVVMVF9TVEFURSwgYWN0aW9uKSA9PiAoYWN0aW9uLnR5cGUgPT09IElzTG9hZGluZ0FjdGlvblR5cGUuU2V0ID8gYWN0aW9uLnBheWxvYWQgOiBzdGF0ZSk7XG4iLCJleHBvcnQgdmFyIExvYWRpbmdNYXBBY3Rpb25UeXBlO1xuKGZ1bmN0aW9uIChMb2FkaW5nTWFwQWN0aW9uVHlwZSkge1xuICAgIExvYWRpbmdNYXBBY3Rpb25UeXBlW1wiU2V0XCJdID0gXCJMb2FkaW5nTWFwLlNldFwiO1xufSkoTG9hZGluZ01hcEFjdGlvblR5cGUgfHwgKExvYWRpbmdNYXBBY3Rpb25UeXBlID0ge30pKTtcbmNvbnN0IERFRkFVTFRfU1RBVEUgPSB7fTtcbmV4cG9ydCBkZWZhdWx0IChzdGF0ZSA9IERFRkFVTFRfU1RBVEUsIGFjdGlvbikgPT4gKGFjdGlvbi50eXBlID09PSBMb2FkaW5nTWFwQWN0aW9uVHlwZS5TZXQgPyBhY3Rpb24ucGF5bG9hZCA6IHN0YXRlKTtcbiIsImltcG9ydCB7IG9uY2UgfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBjcmVhdGVTdG9yZSwgYXBwbHlNaWRkbGV3YXJlIH0gZnJvbSAncmVkdXgnO1xuaW1wb3J0IHRodW5rIGZyb20gJ3JlZHV4LXRodW5rJztcbmltcG9ydCB7IGNyZWF0ZVJlZHVjZXIgfSBmcm9tICcuL3JlZHVjZXJzL3JlZHVjZXInO1xuaW1wb3J0IFN0b3JlT2JzZXJ2ZXIgZnJvbSAnLi9TdG9yZU9ic2VydmVyJztcbmltcG9ydCBkb2N1bWVudFRpdGxlIGZyb20gJy4vb2JzZXJ2ZXJzL2RvY3VtZW50VGl0bGUnO1xuaW1wb3J0IGV4ZWN1dGVkQ2FsbGJhY2tzIGZyb20gJy4vb2JzZXJ2ZXJzL2V4ZWN1dGVkQ2FsbGJhY2tzJztcbmltcG9ydCBleGVjdXRpbmdDYWxsYmFja3MgZnJvbSAnLi9vYnNlcnZlcnMvZXhlY3V0aW5nQ2FsbGJhY2tzJztcbmltcG9ydCBpc0xvYWRpbmcgZnJvbSAnLi9vYnNlcnZlcnMvaXNMb2FkaW5nJztcbmltcG9ydCBsb2FkaW5nTWFwIGZyb20gJy4vb2JzZXJ2ZXJzL2xvYWRpbmdNYXAnO1xuaW1wb3J0IHByaW9yaXRpemVkQ2FsbGJhY2tzIGZyb20gJy4vb2JzZXJ2ZXJzL3ByaW9yaXRpemVkQ2FsbGJhY2tzJztcbmltcG9ydCByZXF1ZXN0ZWRDYWxsYmFja3MgZnJvbSAnLi9vYnNlcnZlcnMvcmVxdWVzdGVkQ2FsbGJhY2tzJztcbmltcG9ydCBzdG9yZWRDYWxsYmFja3MgZnJvbSAnLi9vYnNlcnZlcnMvc3RvcmVkQ2FsbGJhY2tzJztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlbmRlcmVyU3RvcmUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9fc3RvcmUgPSB0aGlzLmluaXRpYWxpemVTdG9yZSgpO1xuICAgIH1cbiAgICBfX3N0b3JlO1xuICAgIGdldCBzdG9yZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19zdG9yZTtcbiAgICB9XG4gICAgc3RvcmVPYnNlcnZlciA9IG5ldyBTdG9yZU9ic2VydmVyKCk7XG4gICAgc2V0T2JzZXJ2ZXJzID0gb25jZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9ic2VydmUgPSB0aGlzLnN0b3JlT2JzZXJ2ZXIub2JzZXJ2ZTtcbiAgICAgICAgb2JzZXJ2ZShkb2N1bWVudFRpdGxlKTtcbiAgICAgICAgb2JzZXJ2ZShpc0xvYWRpbmcpO1xuICAgICAgICBvYnNlcnZlKGxvYWRpbmdNYXApO1xuICAgICAgICBvYnNlcnZlKHJlcXVlc3RlZENhbGxiYWNrcyk7XG4gICAgICAgIG9ic2VydmUocHJpb3JpdGl6ZWRDYWxsYmFja3MpO1xuICAgICAgICBvYnNlcnZlKGV4ZWN1dGluZ0NhbGxiYWNrcyk7XG4gICAgICAgIG9ic2VydmUoZXhlY3V0ZWRDYWxsYmFja3MpO1xuICAgICAgICBvYnNlcnZlKHN0b3JlZENhbGxiYWNrcyk7XG4gICAgfSk7XG4gICAgY3JlYXRlQXBwU3RvcmUgPSAocmVkdWNlciwgbWlkZGxld2FyZSkgPT4ge1xuICAgICAgICB0aGlzLl9fc3RvcmUgPSBjcmVhdGVTdG9yZShyZWR1Y2VyLCBtaWRkbGV3YXJlKTtcbiAgICAgICAgdGhpcy5zdG9yZU9ic2VydmVyLnNldFN0b3JlKHRoaXMuX19zdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0T2JzZXJ2ZXJzKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIGEgUmVkdXggc3RvcmUgd2l0aCB0aHVuaywgcGx1cyBsb2dnaW5nIChvbmx5IGluIGRldmVsb3BtZW50IG1vZGUpIG1pZGRsZXdhcmVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbH0gcmVzZXQ6IGRpc2NhcmQgYW55IHByZXZpb3VzIHN0b3JlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3RvcmU8R2VuZXJpY1N0b3JlRW5oYW5jZXI+fVxuICAgICAqICBBbiBpbml0aWFsaXplZCByZWR1eCBzdG9yZSB3aXRoIG1pZGRsZXdhcmUgYW5kIHBvc3NpYmxlIGhvdCByZWxvYWRpbmcgb2YgcmVkdWNlcnNcbiAgICAgKi9cbiAgICBpbml0aWFsaXplU3RvcmUgPSAocmVzZXQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX19zdG9yZSAmJiAhcmVzZXQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9fc3RvcmU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVkdWNlciA9IGNyZWF0ZVJlZHVjZXIoKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb2Nlc3MtZW52XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFwcFN0b3JlKHJlZHVjZXIsIGFwcGx5TWlkZGxld2FyZSh0aHVuaykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gb25seSBhdHRhY2ggbG9nZ2VyIHRvIG1pZGRsZXdhcmUgaW4gbm9uLXByb2R1Y3Rpb24gbW9kZVxuICAgICAgICAgICAgY29uc3QgcmVkdXhEVEVDID0gd2luZG93XG4gICAgICAgICAgICAgICAgLl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX0NPTVBPU0VfXztcbiAgICAgICAgICAgIGlmIChyZWR1eERURUMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUFwcFN0b3JlKHJlZHVjZXIsIHJlZHV4RFRFQyh7IGFjdGlvbnNEZW55bGlzdDogWydyZWxvYWRSZXF1ZXN0J10gfSkoYXBwbHlNaWRkbGV3YXJlKHRodW5rKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVBcHBTdG9yZShyZWR1Y2VyLCBhcHBseU1pZGRsZXdhcmUodGh1bmspKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlc2V0KSB7XG4gICAgICAgICAgICAvLyBUT0RPIC0gUHJvdGVjdCB0aGlzIHVuZGVyIGEgZGVidWcgbW9kZT9cbiAgICAgICAgICAgIHdpbmRvdy5zdG9yZSA9IHRoaXMuX19zdG9yZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9kdWxlLmhvdCkge1xuICAgICAgICAgICAgLy8gRW5hYmxlIGhvdCBtb2R1bGUgcmVwbGFjZW1lbnQgZm9yIHJlZHVjZXJzXG4gICAgICAgICAgICBtb2R1bGUuaG90LmFjY2VwdCgnLi9yZWR1Y2Vycy9yZWR1Y2VyJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRSb290UmVkdWNlciA9IHJlcXVpcmUoJy4vcmVkdWNlcnMvcmVkdWNlcicpLmNyZWF0ZVJlZHVjZXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9fc3RvcmUucmVwbGFjZVJlZHVjZXIobmV4dFJvb3RSZWR1Y2VyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9fc3RvcmU7XG4gICAgfTtcbn1cbiIsImltcG9ydCB7IHBhdGgsIHR5cGUsIGhhcyB9IGZyb20gJ3JhbWRhJztcbmltcG9ydCBSZWdpc3RyeSBmcm9tICcuLi9yZWdpc3RyeSc7XG5pbXBvcnQgeyBzdHJpbmdpZnlJZCB9IGZyb20gJy4uL2FjdGlvbnMvZGVwZW5kZW5jaWVzJztcbmZ1bmN0aW9uIGlzTG9hZGluZ0NvbXBvbmVudChsYXlvdXQpIHtcbiAgICB2YWxpZGF0ZUNvbXBvbmVudChsYXlvdXQpO1xuICAgIHJldHVybiBSZWdpc3RyeS5yZXNvbHZlKGxheW91dCkuX2Rhc2hwcml2YXRlX2lzTG9hZGluZ0NvbXBvbmVudDtcbn1cbmNvbnN0IE5VTExfTE9BRElOR19TVEFURSA9IGZhbHNlO1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvYWRpbmdTdGF0ZShjb21wb25lbnRMYXlvdXQsIGNvbXBvbmVudFBhdGgsIGxvYWRpbmdNYXApIHtcbiAgICBpZiAoIWxvYWRpbmdNYXApIHtcbiAgICAgICAgcmV0dXJuIE5VTExfTE9BRElOR19TVEFURTtcbiAgICB9XG4gICAgY29uc3QgbG9hZGluZ0ZyYWdtZW50ID0gcGF0aChjb21wb25lbnRQYXRoLCBsb2FkaW5nTWFwKTtcbiAgICAvLyBDb21wb25lbnQgYW5kIGNoaWxkcmVuIGFyZSBub3QgbG9hZGluZyBpZiB0aGVyZSdzIG5vIGxvYWRpbmcgZnJhZ21lbnRcbiAgICAvLyBmb3IgdGhlIGNvbXBvbmVudCdzIHBhdGggaW4gdGhlIGxheW91dC5cbiAgICBpZiAoIWxvYWRpbmdGcmFnbWVudCkge1xuICAgICAgICByZXR1cm4gTlVMTF9MT0FESU5HX1NUQVRFO1xuICAgIH1cbiAgICBjb25zdCBpZHByb3AgPSBsb2FkaW5nRnJhZ21lbnQuX19kYXNocHJpdmF0ZV9faWRwcm9wX187XG4gICAgaWYgKGlkcHJvcCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaXNfbG9hZGluZzogdHJ1ZSxcbiAgICAgICAgICAgIHByb3BfbmFtZTogaWRwcm9wLnByb3BlcnR5LFxuICAgICAgICAgICAgY29tcG9uZW50X25hbWU6IHN0cmluZ2lmeUlkKGlkcHJvcC5pZClcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgaWRwcm9wcyA9IGxvYWRpbmdGcmFnbWVudC5fX2Rhc2hwcml2YXRlX19pZHByb3BzX18/LlswXTtcbiAgICBpZiAoaWRwcm9wcyAmJiBpc0xvYWRpbmdDb21wb25lbnQoY29tcG9uZW50TGF5b3V0KSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaXNfbG9hZGluZzogdHJ1ZSxcbiAgICAgICAgICAgIHByb3BfbmFtZTogaWRwcm9wcy5wcm9wZXJ0eSxcbiAgICAgICAgICAgIGNvbXBvbmVudF9uYW1lOiBzdHJpbmdpZnlJZChpZHByb3BzLmlkKVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gTlVMTF9MT0FESU5HX1NUQVRFO1xufVxuZXhwb3J0IGNvbnN0IGdldExvYWRpbmdIYXNoID0gKGNvbXBvbmVudFBhdGgsIGxvYWRpbmdNYXApID0+ICgobG9hZGluZ01hcCAmJlxuICAgIHBhdGgoY29tcG9uZW50UGF0aCwgbG9hZGluZ01hcClcbiAgICAgICAgPy5fX2Rhc2hwcml2YXRlX19pZHByb3BzX18pID8/XG4gICAgW10pXG4gICAgLm1hcCgoeyBpZCwgcHJvcGVydHkgfSkgPT4gYCR7aWR9LiR7cHJvcGVydHl9YClcbiAgICAuam9pbignLCcpO1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICBpZiAodHlwZShjb21wb25lbnREZWZpbml0aW9uKSA9PT0gJ0FycmF5Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBjaGlsZHJlbiBwcm9wZXJ0eSBvZiBhIGNvbXBvbmVudCBpcyBhIGxpc3Qgb2YgbGlzdHMsIGluc3RlYWQgJyArXG4gICAgICAgICAgICAnb2YganVzdCBhIGxpc3QuICcgK1xuICAgICAgICAgICAgJ0NoZWNrIHRoZSBjb21wb25lbnQgdGhhdCBoYXMgdGhlIGZvbGxvd2luZyBjb250ZW50cywgJyArXG4gICAgICAgICAgICAnYW5kIHJlbW92ZSBvbmUgb2YgdGhlIGxldmVscyBvZiBuZXN0aW5nOiBcXG4nICtcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGNvbXBvbmVudERlZmluaXRpb24sIG51bGwsIDIpKTtcbiAgICB9XG4gICAgaWYgKHR5cGUoY29tcG9uZW50RGVmaW5pdGlvbikgPT09ICdPYmplY3QnICYmXG4gICAgICAgICEoaGFzKCduYW1lc3BhY2UnLCBjb21wb25lbnREZWZpbml0aW9uKSAmJlxuICAgICAgICAgICAgaGFzKCd0eXBlJywgY29tcG9uZW50RGVmaW5pdGlvbikgJiZcbiAgICAgICAgICAgIGhhcygncHJvcHMnLCBjb21wb25lbnREZWZpbml0aW9uKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBvYmplY3Qgd2FzIHByb3ZpZGVkIGFzIGBjaGlsZHJlbmAgaW5zdGVhZCBvZiBhIGNvbXBvbmVudCwgJyArXG4gICAgICAgICAgICAnc3RyaW5nLCBvciBudW1iZXIgKG9yIGxpc3Qgb2YgdGhvc2UpLiAnICtcbiAgICAgICAgICAgICdDaGVjayB0aGUgY2hpbGRyZW4gcHJvcGVydHkgdGhhdCBsb29rcyBzb21ldGhpbmcgbGlrZTpcXG4nICtcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGNvbXBvbmVudERlZmluaXRpb24sIG51bGwsIDIpKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBvbWl0LCB2YWx1ZXMgfSBmcm9tICdyYW1kYSc7XG5leHBvcnQgY29uc3QgZ2V0UGVuZGluZ0NhbGxiYWNrcyA9IChzdGF0ZSkgPT4gQXJyYXkoKS5jb25jYXQoLi4udmFsdWVzKG9taXQoWydzdG9yZWQnLCAnY29tcGxldGVkJ10sIHN0YXRlKSkpO1xuIiwiZXhwb3J0IGRlZmF1bHQgYXN5bmMgKGR1cmF0aW9uKSA9PiB7XG4gICAgbGV0IF9yZXNvbHZlO1xuICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IChfcmVzb2x2ZSA9IHJlc29sdmUpKTtcbiAgICBzZXRUaW1lb3V0KF9yZXNvbHZlLCBkdXJhdGlvbik7XG4gICAgcmV0dXJuIHA7XG59O1xuIiwiaW1wb3J0IHtiYXRjaCwgY29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHtpbmNsdWRlcywgaXNFbXB0eX0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IFJlYWN0LCB7dXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlLCBjcmVhdGVDb250ZXh0fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFRyZWVDb250YWluZXIgZnJvbSAnLi9UcmVlQ29udGFpbmVyJztcbmltcG9ydCBHbG9iYWxFcnJvckNvbnRhaW5lciBmcm9tICcuL2NvbXBvbmVudHMvZXJyb3IvR2xvYmFsRXJyb3JDb250YWluZXIucmVhY3QnO1xuaW1wb3J0IHtcbiAgICBkaXNwYXRjaEVycm9yLFxuICAgIGh5ZHJhdGVJbml0aWFsT3V0cHV0cyxcbiAgICBvbkVycm9yLFxuICAgIHNldEdyYXBocyxcbiAgICBzZXRQYXRocyxcbiAgICBzZXRMYXlvdXRcbn0gZnJvbSAnLi9hY3Rpb25zJztcbmltcG9ydCB7Y29tcHV0ZVBhdGhzfSBmcm9tICcuL2FjdGlvbnMvcGF0aHMnO1xuaW1wb3J0IHtjb21wdXRlR3JhcGhzfSBmcm9tICcuL2FjdGlvbnMvZGVwZW5kZW5jaWVzJztcbmltcG9ydCBhcGlUaHVuayBmcm9tICcuL2FjdGlvbnMvYXBpJztcbmltcG9ydCB7RXZlbnRFbWl0dGVyfSBmcm9tICcuL2FjdGlvbnMvdXRpbHMnO1xuaW1wb3J0IHthcHBseVBlcnNpc3RlbmNlfSBmcm9tICcuL3BlcnNpc3RlbmNlJztcbmltcG9ydCB7Z2V0QXBwU3RhdGV9IGZyb20gJy4vcmVkdWNlcnMvY29uc3RhbnRzJztcbmltcG9ydCB7U1RBVFVTfSBmcm9tICcuL2NvbnN0YW50cy9jb25zdGFudHMnO1xuaW1wb3J0IHtnZXRMb2FkaW5nU3RhdGUsIGdldExvYWRpbmdIYXNofSBmcm9tICcuL3V0aWxzL1RyZWVDb250YWluZXInO1xuaW1wb3J0IHdhaXQgZnJvbSAnLi91dGlscy93YWl0JztcblxuZXhwb3J0IGNvbnN0IERhc2hDb250ZXh0ID0gY3JlYXRlQ29udGV4dCh7fSk7XG5cbi8qKlxuICogRmlyZSBvZmYgQVBJIGNhbGxzIGZvciBpbml0aWFsaXphdGlvblxuICogQHBhcmFtIHsqfSBwcm9wcyBwcm9wc1xuICogQHJldHVybnMgeyp9IGNvbXBvbmVudFxuICovXG5jb25zdCBVbmNvbm5lY3RlZENvbnRhaW5lciA9IHByb3BzID0+IHtcbiAgICBjb25zdCB7XG4gICAgICAgIGFwcExpZmVjeWNsZSxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBkZXBlbmRlbmNpZXNSZXF1ZXN0LFxuICAgICAgICBlcnJvcixcbiAgICAgICAgbGF5b3V0UmVxdWVzdCxcbiAgICAgICAgbGF5b3V0LFxuICAgICAgICBsb2FkaW5nTWFwXG4gICAgfSA9IHByb3BzO1xuXG4gICAgY29uc3QgW2Vycm9yTG9hZGluZywgc2V0RXJyb3JMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICAgIGNvbnN0IGV2ZW50cyA9IHVzZVJlZihudWxsKTtcbiAgICBpZiAoIWV2ZW50cy5jdXJyZW50KSB7XG4gICAgICAgIGV2ZW50cy5jdXJyZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIH1cbiAgICBjb25zdCByZW5kZXJlZFRyZWUgPSB1c2VSZWYoZmFsc2UpO1xuXG4gICAgY29uc3QgcHJvcHNSZWYgPSB1c2VSZWYoe30pO1xuICAgIHByb3BzUmVmLmN1cnJlbnQgPSBwcm9wcztcblxuICAgIGNvbnN0IHByb3ZpZGVyID0gdXNlUmVmKHtcbiAgICAgICAgZm46ICgpID0+ICh7XG4gICAgICAgICAgICBfZGFzaHByaXZhdGVfY29uZmlnOiBwcm9wc1JlZi5jdXJyZW50LmNvbmZpZyxcbiAgICAgICAgICAgIF9kYXNocHJpdmF0ZV9kaXNwYXRjaDogcHJvcHNSZWYuY3VycmVudC5kaXNwYXRjaCxcbiAgICAgICAgICAgIF9kYXNocHJpdmF0ZV9ncmFwaHM6IHByb3BzUmVmLmN1cnJlbnQuZ3JhcGhzLFxuICAgICAgICAgICAgX2Rhc2hwcml2YXRlX2xvYWRpbmdNYXA6IHByb3BzUmVmLmN1cnJlbnQubG9hZGluZ01hcFxuICAgICAgICB9KVxuICAgIH0pO1xuXG4gICAgdXNlRWZmZWN0KHN0b3JlRWZmZWN0LmJpbmQobnVsbCwgcHJvcHMsIGV2ZW50cywgc2V0RXJyb3JMb2FkaW5nKSk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAocmVuZGVyZWRUcmVlLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVuZGVyZWRUcmVlLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB3YWl0KDApO1xuICAgICAgICAgICAgICAgIGV2ZW50cy5jdXJyZW50LmVtaXQoJ3JlbmRlcmVkJyk7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoY29uZmlnLnNlcnZlX2xvY2FsbHkpIHtcbiAgICAgICAgICAgIHdpbmRvdy5fZGFzaFBsb3RseUpTVVJMID0gYCR7Y29uZmlnLnJlcXVlc3RzX3BhdGhuYW1lX3ByZWZpeH1fZGFzaC1jb21wb25lbnQtc3VpdGVzL3Bsb3RseS9wYWNrYWdlX2RhdGEvcGxvdGx5Lm1pbi5qc2A7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3aW5kb3cuX2Rhc2hQbG90bHlKU1VSTCA9IGNvbmZpZy5wbG90bHlqc191cmw7XG4gICAgICAgIH1cbiAgICB9LCBbXSk7XG5cbiAgICBsZXQgY29udGVudDtcbiAgICBpZiAoXG4gICAgICAgIGxheW91dFJlcXVlc3Quc3RhdHVzICYmXG4gICAgICAgICFpbmNsdWRlcyhsYXlvdXRSZXF1ZXN0LnN0YXR1cywgW1NUQVRVUy5PSywgJ2xvYWRpbmcnXSlcbiAgICApIHtcbiAgICAgICAgY29udGVudCA9IDxkaXYgY2xhc3NOYW1lPSdfZGFzaC1lcnJvcic+RXJyb3IgbG9hZGluZyBsYXlvdXQ8L2Rpdj47XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICAgZXJyb3JMb2FkaW5nIHx8XG4gICAgICAgIChkZXBlbmRlbmNpZXNSZXF1ZXN0LnN0YXR1cyAmJlxuICAgICAgICAgICAgIWluY2x1ZGVzKGRlcGVuZGVuY2llc1JlcXVlc3Quc3RhdHVzLCBbU1RBVFVTLk9LLCAnbG9hZGluZyddKSlcbiAgICApIHtcbiAgICAgICAgY29udGVudCA9IDxkaXYgY2xhc3NOYW1lPSdfZGFzaC1lcnJvcic+RXJyb3IgbG9hZGluZyBkZXBlbmRlbmNpZXM8L2Rpdj47XG4gICAgfSBlbHNlIGlmIChhcHBMaWZlY3ljbGUgPT09IGdldEFwcFN0YXRlKCdIWURSQVRFRCcpKSB7XG4gICAgICAgIHJlbmRlcmVkVHJlZS5jdXJyZW50ID0gdHJ1ZTtcblxuICAgICAgICBjb250ZW50ID0gKFxuICAgICAgICAgICAgPERhc2hDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtwcm92aWRlci5jdXJyZW50fT5cbiAgICAgICAgICAgICAgICA8VHJlZUNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICBfZGFzaHByaXZhdGVfZXJyb3I9e2Vycm9yfVxuICAgICAgICAgICAgICAgICAgICBfZGFzaHByaXZhdGVfbGF5b3V0PXtsYXlvdXR9XG4gICAgICAgICAgICAgICAgICAgIF9kYXNocHJpdmF0ZV9sb2FkaW5nU3RhdGU9e2dldExvYWRpbmdTdGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGluZ01hcFxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICBfZGFzaHByaXZhdGVfbG9hZGluZ1N0YXRlSGFzaD17Z2V0TG9hZGluZ0hhc2goXG4gICAgICAgICAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRpbmdNYXBcbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgX2Rhc2hwcml2YXRlX3BhdGg9e0pTT04uc3RyaW5naWZ5KFtdKX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9EYXNoQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZW50ID0gPGRpdiBjbGFzc05hbWU9J19kYXNoLWxvYWRpbmcnPkxvYWRpbmcuLi48L2Rpdj47XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZyAmJiBjb25maWcudWkgPT09IHRydWUgPyAoXG4gICAgICAgIDxHbG9iYWxFcnJvckNvbnRhaW5lcj57Y29udGVudH08L0dsb2JhbEVycm9yQ29udGFpbmVyPlxuICAgICkgOiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICApO1xufTtcblxuZnVuY3Rpb24gc3RvcmVFZmZlY3QocHJvcHMsIGV2ZW50cywgc2V0RXJyb3JMb2FkaW5nKSB7XG4gICAgY29uc3Qge1xuICAgICAgICBhcHBMaWZlY3ljbGUsXG4gICAgICAgIGRlcGVuZGVuY2llc1JlcXVlc3QsXG4gICAgICAgIGRpc3BhdGNoLFxuICAgICAgICBlcnJvcixcbiAgICAgICAgZ3JhcGhzLFxuICAgICAgICBob29rcyxcbiAgICAgICAgbGF5b3V0LFxuICAgICAgICBsYXlvdXRSZXF1ZXN0XG4gICAgfSA9IHByb3BzO1xuXG4gICAgYmF0Y2goKCkgPT4ge1xuICAgICAgICBpZiAoaXNFbXB0eShsYXlvdXRSZXF1ZXN0KSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBob29rcy5sYXlvdXRfcHJlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgaG9va3MubGF5b3V0X3ByZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzcGF0Y2goYXBpVGh1bmsoJ19kYXNoLWxheW91dCcsICdHRVQnLCAnbGF5b3V0UmVxdWVzdCcpKTtcbiAgICAgICAgfSBlbHNlIGlmIChsYXlvdXRSZXF1ZXN0LnN0YXR1cyA9PT0gU1RBVFVTLk9LKSB7XG4gICAgICAgICAgICBpZiAoaXNFbXB0eShsYXlvdXQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBob29rcy5sYXlvdXRfcG9zdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBob29rcy5sYXlvdXRfcG9zdChsYXlvdXRSZXF1ZXN0LmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBmaW5hbExheW91dCA9IGFwcGx5UGVyc2lzdGVuY2UoXG4gICAgICAgICAgICAgICAgICAgIGxheW91dFJlcXVlc3QuY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgICAgICBzZXRQYXRocyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVQYXRocyhmaW5hbExheW91dCwgW10sIG51bGwsIGV2ZW50cy5jdXJyZW50KVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChzZXRMYXlvdXQoZmluYWxMYXlvdXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0VtcHR5KGRlcGVuZGVuY2llc1JlcXVlc3QpKSB7XG4gICAgICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgICAgICBhcGlUaHVuaygnX2Rhc2gtZGVwZW5kZW5jaWVzJywgJ0dFVCcsICdkZXBlbmRlbmNpZXNSZXF1ZXN0JylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBkZXBlbmRlbmNpZXNSZXF1ZXN0LnN0YXR1cyA9PT0gU1RBVFVTLk9LICYmXG4gICAgICAgICAgICBpc0VtcHR5KGdyYXBocylcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgICAgICBzZXRHcmFwaHMoXG4gICAgICAgICAgICAgICAgICAgIGNvbXB1dGVHcmFwaHMoXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXNSZXF1ZXN0LmNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKGRpc3BhdGNoKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIGRlcGVuZGVuY2llc1JlcXVlc3QgYW5kIGl0cyBjb21wdXRlZCBzdG9yZXNcbiAgICAgICAgICAgIGRlcGVuZGVuY2llc1JlcXVlc3Quc3RhdHVzID09PSBTVEFUVVMuT0sgJiZcbiAgICAgICAgICAgICFpc0VtcHR5KGdyYXBocykgJiZcbiAgICAgICAgICAgIC8vIExheW91dFJlcXVlc3QgYW5kIGl0cyBjb21wdXRlZCBzdG9yZXNcbiAgICAgICAgICAgIGxheW91dFJlcXVlc3Quc3RhdHVzID09PSBTVEFUVVMuT0sgJiZcbiAgICAgICAgICAgICFpc0VtcHR5KGxheW91dCkgJiZcbiAgICAgICAgICAgIC8vIEhhc24ndCBhbHJlYWR5IGh5ZHJhdGVkXG4gICAgICAgICAgICBhcHBMaWZlY3ljbGUgPT09IGdldEFwcFN0YXRlKCdTVEFSVEVEJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2goaHlkcmF0ZUluaXRpYWxPdXRwdXRzKGRpc3BhdGNoRXJyb3IoZGlzcGF0Y2gpKSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAvLyBEaXNwbGF5IHRoaXMgZXJyb3IgaW4gZGV2dG9vbHMsIHVubGVzcyB3ZSBoYXZlIGVycm9yc1xuICAgICAgICAgICAgICAgIC8vIGFscmVhZHksIGluIHdoaWNoIGNhc2Ugd2UgYXNzdW1lIHRoaXMgbmV3IG9uZSBpcyBtb290XG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvci5mcm9udEVuZC5sZW5ndGggJiYgIWVycm9yLmJhY2tFbmQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKG9uRXJyb3Ioe3R5cGU6ICdiYWNrRW5kJywgZXJyb3I6IGVycn0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBzZXRFcnJvckxvYWRpbmcoaGFzRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5cblVuY29ubmVjdGVkQ29udGFpbmVyLnByb3BUeXBlcyA9IHtcbiAgICBhcHBMaWZlY3ljbGU6IFByb3BUeXBlcy5vbmVPZihbXG4gICAgICAgIGdldEFwcFN0YXRlKCdTVEFSVEVEJyksXG4gICAgICAgIGdldEFwcFN0YXRlKCdIWURSQVRFRCcpLFxuICAgICAgICBnZXRBcHBTdGF0ZSgnREVTVFJPWUVEJylcbiAgICBdKSxcbiAgICBkaXNwYXRjaDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgZGVwZW5kZW5jaWVzUmVxdWVzdDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBncmFwaHM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgaG9va3M6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgbGF5b3V0UmVxdWVzdDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBsYXlvdXQ6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgbG9hZGluZ01hcDogUHJvcFR5cGVzLmFueSxcbiAgICBoaXN0b3J5OiBQcm9wVHlwZXMuYW55LFxuICAgIGVycm9yOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGNvbmZpZzogUHJvcFR5cGVzLm9iamVjdFxufTtcblxuY29uc3QgQ29udGFpbmVyID0gY29ubmVjdChcbiAgICAvLyBtYXAgc3RhdGUgdG8gcHJvcHNcbiAgICBzdGF0ZSA9PiAoe1xuICAgICAgICBhcHBMaWZlY3ljbGU6IHN0YXRlLmFwcExpZmVjeWNsZSxcbiAgICAgICAgZGVwZW5kZW5jaWVzUmVxdWVzdDogc3RhdGUuZGVwZW5kZW5jaWVzUmVxdWVzdCxcbiAgICAgICAgaG9va3M6IHN0YXRlLmhvb2tzLFxuICAgICAgICBsYXlvdXRSZXF1ZXN0OiBzdGF0ZS5sYXlvdXRSZXF1ZXN0LFxuICAgICAgICBsYXlvdXQ6IHN0YXRlLmxheW91dCxcbiAgICAgICAgbG9hZGluZ01hcDogc3RhdGUubG9hZGluZ01hcCxcbiAgICAgICAgZ3JhcGhzOiBzdGF0ZS5ncmFwaHMsXG4gICAgICAgIGhpc3Rvcnk6IHN0YXRlLmhpc3RvcnksXG4gICAgICAgIGVycm9yOiBzdGF0ZS5lcnJvcixcbiAgICAgICAgY29uZmlnOiBzdGF0ZS5jb25maWdcbiAgICB9KSxcbiAgICBkaXNwYXRjaCA9PiAoe2Rpc3BhdGNofSlcbikoVW5jb25uZWN0ZWRDb250YWluZXIpO1xuXG5leHBvcnQgZGVmYXVsdCBDb250YWluZXI7XG4iLCJpbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IEFQSUNvbnRyb2xsZXIgZnJvbSAnLi9BUElDb250cm9sbGVyLnJlYWN0JztcbmltcG9ydCBMb2FkaW5nIGZyb20gJy4vY29tcG9uZW50cy9jb3JlL0xvYWRpbmcucmVhY3QnO1xuaW1wb3J0IFRvb2xiYXIgZnJvbSAnLi9jb21wb25lbnRzL2NvcmUvVG9vbGJhci5yZWFjdCc7XG5pbXBvcnQgUmVsb2FkZXIgZnJvbSAnLi9jb21wb25lbnRzL2NvcmUvUmVsb2FkZXIucmVhY3QnO1xuaW1wb3J0IGdldENvbmZpZ0Zyb21ET00gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHtzZXRIb29rcywgc2V0Q29uZmlnfSBmcm9tICcuL2FjdGlvbnMvaW5kZXgnO1xuaW1wb3J0IHt0eXBlLCBtZW1vaXplV2l0aCwgaWRlbnRpdHl9IGZyb20gJ3JhbWRhJztcblxuY2xhc3MgVW5jb25uZWN0ZWRBcHBDb250YWluZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcHJvcHMuaG9va3MubGF5b3V0X3ByZSAhPT0gbnVsbCB8fFxuICAgICAgICAgICAgcHJvcHMuaG9va3MubGF5b3V0X3Bvc3QgIT09IG51bGwgfHxcbiAgICAgICAgICAgIHByb3BzLmhvb2tzLnJlcXVlc3RfcHJlICE9PSBudWxsIHx8XG4gICAgICAgICAgICBwcm9wcy5ob29rcy5yZXF1ZXN0X3Bvc3QgIT09IG51bGwgfHxcbiAgICAgICAgICAgIHByb3BzLmhvb2tzLmNhbGxiYWNrX3Jlc29sdmVkICE9PSBudWxsIHx8XG4gICAgICAgICAgICBwcm9wcy5ob29rcy5yZXF1ZXN0X3JlZnJlc2hfand0ICE9PSBudWxsXG4gICAgICAgICkge1xuICAgICAgICAgICAgbGV0IGhvb2tzID0gcHJvcHMuaG9va3M7XG5cbiAgICAgICAgICAgIGlmIChob29rcy5yZXF1ZXN0X3JlZnJlc2hfand0KSB7XG4gICAgICAgICAgICAgICAgaG9va3MgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmhvb2tzLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3JlZnJlc2hfand0OiBtZW1vaXplV2l0aChcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgaG9va3MucmVxdWVzdF9yZWZyZXNoX2p3dFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJvcHMuZGlzcGF0Y2goc2V0SG9va3MoaG9va3MpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSB7XG4gICAgICAgIGNvbnN0IHtkaXNwYXRjaH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWdGcm9tRE9NKCk7XG5cbiAgICAgICAgLy8gcHJlc2V0IGNvbW1vbiByZXF1ZXN0IHBhcmFtcyBpbiB0aGUgY29uZmlnXG4gICAgICAgIGNvbmZpZy5mZXRjaCA9IHtcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBkaXNwYXRjaChzZXRDb25maWcoY29uZmlnKSk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCB7Y29uZmlnfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGlmICh0eXBlKGNvbmZpZykgPT09ICdOdWxsJykge1xuICAgICAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPSdfZGFzaC1sb2FkaW5nJz5Mb2FkaW5nLi4uPC9kaXY+O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHtzaG93X3VuZG9fcmVkb30gPSBjb25maWc7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAge3Nob3dfdW5kb19yZWRvID8gPFRvb2xiYXIgLz4gOiBudWxsfVxuICAgICAgICAgICAgICAgIDxBUElDb250cm9sbGVyIC8+XG4gICAgICAgICAgICAgICAgPExvYWRpbmcgLz5cbiAgICAgICAgICAgICAgICA8UmVsb2FkZXIgLz5cbiAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5VbmNvbm5lY3RlZEFwcENvbnRhaW5lci5wcm9wVHlwZXMgPSB7XG4gICAgaG9va3M6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZGlzcGF0Y2g6IFByb3BUeXBlcy5mdW5jLFxuICAgIGNvbmZpZzogUHJvcFR5cGVzLm9iamVjdFxufTtcblxuY29uc3QgQXBwQ29udGFpbmVyID0gY29ubmVjdChcbiAgICBzdGF0ZSA9PiAoe1xuICAgICAgICBoaXN0b3J5OiBzdGF0ZS5oaXN0b3J5LFxuICAgICAgICBjb25maWc6IHN0YXRlLmNvbmZpZ1xuICAgIH0pLFxuICAgIGRpc3BhdGNoID0+ICh7ZGlzcGF0Y2h9KVxuKShVbmNvbm5lY3RlZEFwcENvbnRhaW5lcik7XG5cbmV4cG9ydCBkZWZhdWx0IEFwcENvbnRhaW5lcjtcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcblxuaW1wb3J0IEFwcFByb3ZpZGVyIGZyb20gJy4vQXBwUHJvdmlkZXIucmVhY3QnO1xuXG5jbGFzcyBEYXNoUmVuZGVyZXIge1xuICAgIGNvbnN0cnVjdG9yKGhvb2tzKSB7XG4gICAgICAgIC8vIHJlbmRlciBEYXNoIFJlbmRlcmVyIHVwb24gaW5pdGlhbGlzaW5nIVxuICAgICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVhY3QtZW50cnktcG9pbnQnKTtcblxuICAgICAgICBpZiAoUmVhY3RET00uY3JlYXRlUm9vdCkge1xuICAgICAgICAgICAgY29uc3Qgcm9vdCA9IFJlYWN0RE9NLmNyZWF0ZVJvb3QoY29udGFpbmVyKTtcbiAgICAgICAgICAgIHJvb3QucmVuZGVyKDxBcHBQcm92aWRlciBob29rcz17aG9va3N9IC8+KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFJlYWN0RE9NLnJlbmRlcig8QXBwUHJvdmlkZXIgaG9va3M9e2hvb2tzfSAvPiwgY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHtEYXNoUmVuZGVyZXJ9O1xuIiwiaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50LCBtZW1vLCB1c2VDb250ZXh0fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlZ2lzdHJ5IGZyb20gJy4vcmVnaXN0cnknO1xuaW1wb3J0IHtwcm9wVHlwZUVycm9ySGFuZGxlcn0gZnJvbSAnLi9leGNlcHRpb25zJztcbmltcG9ydCB7XG4gICAgYWRkSW5kZXgsXG4gICAgYXNzb2MsXG4gICAgYXNzb2NQYXRoLFxuICAgIGNvbmNhdCxcbiAgICBkaXNzb2MsXG4gICAgZXF1YWxzLFxuICAgIGlzRW1wdHksXG4gICAgaXNOaWwsXG4gICAgaGFzLFxuICAgIGtleXMsXG4gICAgbWFwLFxuICAgIG1hcE9iakluZGV4ZWQsXG4gICAgbWVyZ2VSaWdodCxcbiAgICBwaWNrLFxuICAgIHBpY2tCeSxcbiAgICBwcm9wT3IsXG4gICAgcGF0aCBhcyBycGF0aCxcbiAgICBwYXRoT3IsXG4gICAgdHlwZVxufSBmcm9tICdyYW1kYSc7XG5pbXBvcnQge25vdGlmeU9ic2VydmVycywgdXBkYXRlUHJvcHN9IGZyb20gJy4vYWN0aW9ucyc7XG5pbXBvcnQgaXNTaW1wbGVDb21wb25lbnQgZnJvbSAnLi9pc1NpbXBsZUNvbXBvbmVudCc7XG5pbXBvcnQge3JlY29yZFVpRWRpdH0gZnJvbSAnLi9wZXJzaXN0ZW5jZSc7XG5pbXBvcnQgQ29tcG9uZW50RXJyb3JCb3VuZGFyeSBmcm9tICcuL2NvbXBvbmVudHMvZXJyb3IvQ29tcG9uZW50RXJyb3JCb3VuZGFyeS5yZWFjdCc7XG5pbXBvcnQgY2hlY2tQcm9wVHlwZXMgZnJvbSAnLi9jaGVja1Byb3BUeXBlcyc7XG5pbXBvcnQge2dldFdhdGNoZWRLZXlzLCBzdHJpbmdpZnlJZH0gZnJvbSAnLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQge1xuICAgIGdldExvYWRpbmdIYXNoLFxuICAgIGdldExvYWRpbmdTdGF0ZSxcbiAgICB2YWxpZGF0ZUNvbXBvbmVudFxufSBmcm9tICcuL3V0aWxzL1RyZWVDb250YWluZXInO1xuaW1wb3J0IHtEYXNoQ29udGV4dH0gZnJvbSAnLi9BUElDb250cm9sbGVyLnJlYWN0JztcbmltcG9ydCB7YmF0Y2h9IGZyb20gJ3JlYWN0LXJlZHV4JztcblxuY29uc3QgTk9UX0xPQURJTkcgPSB7XG4gICAgaXNfbG9hZGluZzogZmFsc2Vcbn07XG5cbmZ1bmN0aW9uIENoZWNrZWRDb21wb25lbnQocCkge1xuICAgIGNvbnN0IHtlbGVtZW50LCBleHRyYVByb3BzLCBwcm9wcywgY2hpbGRyZW4sIHR5cGV9ID0gcDtcblxuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGNoZWNrUHJvcFR5cGVzKFxuICAgICAgICBlbGVtZW50LnByb3BUeXBlcyxcbiAgICAgICAgcHJvcHMsXG4gICAgICAgICdjb21wb25lbnQgcHJvcCcsXG4gICAgICAgIGVsZW1lbnRcbiAgICApO1xuICAgIGlmIChlcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgcHJvcFR5cGVFcnJvckhhbmRsZXIoZXJyb3JNZXNzYWdlLCBwcm9wcywgdHlwZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoZWxlbWVudCwgcHJvcHMsIGV4dHJhUHJvcHMsIGNoaWxkcmVuKTtcbn1cblxuQ2hlY2tlZENvbXBvbmVudC5wcm9wVHlwZXMgPSB7XG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5hbnksXG4gICAgZWxlbWVudDogUHJvcFR5cGVzLmFueSxcbiAgICBsYXlvdXQ6IFByb3BUeXBlcy5hbnksXG4gICAgcHJvcHM6IFByb3BUeXBlcy5hbnksXG4gICAgZXh0cmFQcm9wczogUHJvcFR5cGVzLmFueSxcbiAgICBpZDogUHJvcFR5cGVzLnN0cmluZ1xufTtcblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudChlbGVtZW50LCBwcm9wcywgZXh0cmFQcm9wcywgY2hpbGRyZW4pIHtcbiAgICBjb25zdCBhbGxQcm9wcyA9IG1lcmdlUmlnaHQocHJvcHMsIGV4dHJhUHJvcHMpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChlbGVtZW50LCBhbGxQcm9wcywgLi4uY2hpbGRyZW4pO1xuICAgIH1cbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChlbGVtZW50LCBhbGxQcm9wcywgY2hpbGRyZW4pO1xufVxuXG5mdW5jdGlvbiBpc0RyeUNvbXBvbmVudChvYmopIHtcbiAgICByZXR1cm4gKFxuICAgICAgICB0eXBlKG9iaikgPT09ICdPYmplY3QnICYmXG4gICAgICAgIGhhcygndHlwZScsIG9iaikgJiZcbiAgICAgICAgaGFzKCduYW1lc3BhY2UnLCBvYmopICYmXG4gICAgICAgIGhhcygncHJvcHMnLCBvYmopXG4gICAgKTtcbn1cblxuY29uc3QgRGFzaFdyYXBwZXIgPSBwcm9wcyA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoRGFzaENvbnRleHQpO1xuICAgIHJldHVybiAoXG4gICAgICAgIDxCYXNlVHJlZUNvbnRhaW5lclxuICAgICAgICAgICAgey4uLmNvbnRleHQuZm4oKX1cbiAgICAgICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgICAgIF9kYXNocHJpdmF0ZV9wYXRoPXtKU09OLnBhcnNlKHByb3BzLl9kYXNocHJpdmF0ZV9wYXRoKX1cbiAgICAgICAgLz5cbiAgICApO1xufTtcblxuY29uc3QgVHJlZUNvbnRhaW5lciA9IG1lbW8oRGFzaFdyYXBwZXIpO1xuXG5jbGFzcyBCYXNlVHJlZUNvbnRhaW5lciBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc2V0UHJvcHMgPSB0aGlzLnNldFByb3BzLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgY3JlYXRlQ29udGFpbmVyKHByb3BzLCBjb21wb25lbnQsIHBhdGgsIGtleSA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gaXNTaW1wbGVDb21wb25lbnQoY29tcG9uZW50KSA/IChcbiAgICAgICAgICAgIGNvbXBvbmVudFxuICAgICAgICApIDogKFxuICAgICAgICAgICAgPFRyZWVDb250YWluZXJcbiAgICAgICAgICAgICAgICBrZXk9e1xuICAgICAgICAgICAgICAgICAgICAoY29tcG9uZW50ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucHJvcHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ2lmeUlkKGNvbXBvbmVudC5wcm9wcy5pZCkpIHx8XG4gICAgICAgICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfZGFzaHByaXZhdGVfZXJyb3I9e3Byb3BzLl9kYXNocHJpdmF0ZV9lcnJvcn1cbiAgICAgICAgICAgICAgICBfZGFzaHByaXZhdGVfbGF5b3V0PXtjb21wb25lbnR9XG4gICAgICAgICAgICAgICAgX2Rhc2hwcml2YXRlX2xvYWRpbmdTdGF0ZT17Z2V0TG9hZGluZ1N0YXRlKFxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLl9kYXNocHJpdmF0ZV9sb2FkaW5nTWFwXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICBfZGFzaHByaXZhdGVfbG9hZGluZ1N0YXRlSGFzaD17Z2V0TG9hZGluZ0hhc2goXG4gICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLl9kYXNocHJpdmF0ZV9sb2FkaW5nTWFwXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICBfZGFzaHByaXZhdGVfcGF0aD17SlNPTi5zdHJpbmdpZnkocGF0aCl9XG4gICAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHNldFByb3BzKG5ld1Byb3BzKSB7XG4gICAgICAgIGNvbnN0IHtfZGFzaHByaXZhdGVfZGlzcGF0Y2gsIF9kYXNocHJpdmF0ZV9wYXRoLCBfZGFzaHByaXZhdGVfbGF5b3V0fSA9XG4gICAgICAgICAgICB0aGlzLnByb3BzO1xuXG4gICAgICAgIGNvbnN0IG9sZFByb3BzID0gdGhpcy5nZXRMYXlvdXRQcm9wcygpO1xuICAgICAgICBjb25zdCB7aWR9ID0gb2xkUHJvcHM7XG4gICAgICAgIGNvbnN0IGNoYW5nZWRQcm9wcyA9IHBpY2tCeShcbiAgICAgICAgICAgICh2YWwsIGtleSkgPT4gIWVxdWFscyh2YWwsIG9sZFByb3BzW2tleV0pLFxuICAgICAgICAgICAgbmV3UHJvcHNcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWlzRW1wdHkoY2hhbmdlZFByb3BzKSkge1xuICAgICAgICAgICAgX2Rhc2hwcml2YXRlX2Rpc3BhdGNoKChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7Z3JhcGhzfSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgLy8gSWRlbnRpZnkgdGhlIG1vZGlmaWVkIHByb3BzIHRoYXQgYXJlIHJlcXVpcmVkIGZvciBjYWxsYmFja3NcbiAgICAgICAgICAgICAgICBjb25zdCB3YXRjaGVkS2V5cyA9IGdldFdhdGNoZWRLZXlzKFxuICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAga2V5cyhjaGFuZ2VkUHJvcHMpLFxuICAgICAgICAgICAgICAgICAgICBncmFwaHNcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgYmF0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZXRQcm9wcyBoZXJlIGlzIHRyaWdnZXJlZCBieSB0aGUgVUkgLSByZWNvcmQgdGhlc2UgY2hhbmdlc1xuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcGVyc2lzdGVuY2VcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkVWlFZGl0KF9kYXNocHJpdmF0ZV9sYXlvdXQsIG5ld1Byb3BzLCBkaXNwYXRjaCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gT25seSBkaXNwYXRjaCBjaGFuZ2VzIHRvIERhc2ggaWYgYSB3YXRjaGVkIHByb3AgY2hhbmdlZFxuICAgICAgICAgICAgICAgICAgICBpZiAod2F0Y2hlZEtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlPYnNlcnZlcnMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IHBpY2sod2F0Y2hlZEtleXMsIGNoYW5nZWRQcm9wcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyB1cGRhdGUgdGhpcyBjb21wb25lbnQncyBwcm9wc1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVByb3BzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wczogY2hhbmdlZFByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1wYXRoOiBfZGFzaHByaXZhdGVfcGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0Q2hpbGRyZW4oY29tcG9uZW50cywgcGF0aCkge1xuICAgICAgICBpZiAoaXNOaWwoY29tcG9uZW50cykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY29tcG9uZW50cylcbiAgICAgICAgICAgID8gYWRkSW5kZXgobWFwKShcbiAgICAgICAgICAgICAgICAgIChjb21wb25lbnQsIGkpID0+XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVDb250YWluZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2F0KHBhdGgsIFsncHJvcHMnLCAnY2hpbGRyZW4nLCBpXSlcbiAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgY29tcG9uZW50c1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IHRoaXMuY3JlYXRlQ29udGFpbmVyKFxuICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcyxcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMsXG4gICAgICAgICAgICAgICAgICBjb25jYXQocGF0aCwgWydwcm9wcycsICdjaGlsZHJlbiddKVxuICAgICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHdyYXBDaGlsZHJlblByb3Aobm9kZSwgY2hpbGRyZW5Qcm9wKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5tYXAoKG4sIGkpID0+XG4gICAgICAgICAgICAgICAgaXNEcnlDb21wb25lbnQobilcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmNyZWF0ZUNvbnRhaW5lcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2F0KHRoaXMucHJvcHMuX2Rhc2hwcml2YXRlX3BhdGgsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jaGlsZHJlblByb3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICA6IG5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0RyeUNvbXBvbmVudChub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQ29udGFpbmVyKFxuICAgICAgICAgICAgdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBjb25jYXQodGhpcy5wcm9wcy5fZGFzaHByaXZhdGVfcGF0aCwgWydwcm9wcycsIC4uLmNoaWxkcmVuUHJvcF0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0Q29tcG9uZW50KF9kYXNocHJpdmF0ZV9sYXlvdXQsIGNoaWxkcmVuLCBsb2FkaW5nX3N0YXRlLCBzZXRQcm9wcykge1xuICAgICAgICBjb25zdCB7X2Rhc2hwcml2YXRlX2NvbmZpZywgX2Rhc2hwcml2YXRlX2Rpc3BhdGNoLCBfZGFzaHByaXZhdGVfZXJyb3J9ID1cbiAgICAgICAgICAgIHRoaXMucHJvcHM7XG5cbiAgICAgICAgaWYgKGlzRW1wdHkoX2Rhc2hwcml2YXRlX2xheW91dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzU2ltcGxlQ29tcG9uZW50KF9kYXNocHJpdmF0ZV9sYXlvdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gX2Rhc2hwcml2YXRlX2xheW91dDtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudChfZGFzaHByaXZhdGVfbGF5b3V0KTtcblxuICAgICAgICBjb25zdCBlbGVtZW50ID0gUmVnaXN0cnkucmVzb2x2ZShfZGFzaHByaXZhdGVfbGF5b3V0KTtcblxuICAgICAgICAvLyBIeWRyYXRlIGNvbXBvbmVudHMgcHJvcHNcbiAgICAgICAgY29uc3QgY2hpbGRyZW5Qcm9wcyA9IHBhdGhPcihcbiAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICdjaGlsZHJlbl9wcm9wcycsXG4gICAgICAgICAgICAgICAgX2Rhc2hwcml2YXRlX2xheW91dC5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgX2Rhc2hwcml2YXRlX2xheW91dC50eXBlXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgX2Rhc2hwcml2YXRlX2NvbmZpZ1xuICAgICAgICApO1xuICAgICAgICBsZXQgcHJvcHMgPSBkaXNzb2MoJ2NoaWxkcmVuJywgX2Rhc2hwcml2YXRlX2xheW91dC5wcm9wcyk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlblByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlblByb3AgPSBjaGlsZHJlblByb3BzW2ldO1xuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVPYmplY3QgPSAob2JqLCBvcGF0aCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXBPYmpJbmRleGVkKFxuICAgICAgICAgICAgICAgICAgICAobm9kZSwgaykgPT4gdGhpcy53cmFwQ2hpbGRyZW5Qcm9wKG5vZGUsIFsuLi5vcGF0aCwga10pLFxuICAgICAgICAgICAgICAgICAgICBvYmpcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcC5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhdGggPSBjaGlsZHJlblByb3Auc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZTtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlblByb3AuaW5jbHVkZXMoJ1tdJykpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZyb250UGF0aCA9IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgYmFja1BhdGggPSBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNPYmplY3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5mb3JFYWNoKHAgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLmluY2x1ZGVzKCdbXScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuaW5jbHVkZXMoJ3t9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc09iamVjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9udFBhdGgucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnJlcGxhY2UoJ3t9JywgJycpLnJlcGxhY2UoJ1tdJywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRQYXRoLnB1c2gocC5yZXBsYWNlKCdbXScsICcnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHAuaW5jbHVkZXMoJ3t9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT2JqZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRQYXRoLnB1c2gocC5yZXBsYWNlKCd7fScsICcnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRQYXRoLnB1c2gocCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocC5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPYmplY3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrUGF0aC5wdXNoKHAucmVwbGFjZSgne30nLCAnJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tQYXRoLnB1c2gocCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBub2RlID0gcnBhdGgoZnJvbnRQYXRoLCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQgfHwgIW5vZGUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdE5vZGUgPSBycGF0aChiYWNrUGF0aCwgbm9kZVswXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3ROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG5vZGVWYWx1ZSA9IG5vZGUubWFwKChlbGVtZW50LCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50UGF0aCA9IGNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9udFBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2F0KFtpXSwgYmFja1BhdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3RWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja1BhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RWYWx1ZSA9IGhhbmRsZU9iamVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwYXRoKGJhY2tQYXRoLCBlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFZhbHVlID0gaGFuZGxlT2JqZWN0KGVsZW1lbnQsIGVsZW1lbnRQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RWYWx1ZSA9IHRoaXMud3JhcENoaWxkcmVuUHJvcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnBhdGgoYmFja1BhdGgsIGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzb2NQYXRoKGJhY2tQYXRoLCBsaXN0VmFsdWUsIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGZyb250UGF0aDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5Qcm9wLmluY2x1ZGVzKCd7fScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHN1cHBvcnRzIG9uZSBsZXZlbCBvZiBuZXN0aW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJvbnQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkeW5hbWljID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGFzQmFjayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFja1BhdGggPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBwYXRoLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VyID0gcGF0aFtqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyLmluY2x1ZGVzKCd7fScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgPSBjb25jYXQoZnJvbnQsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ci5yZXBsYWNlKCd7fScsICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPCBwYXRoLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0JhY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0JhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tQYXRoLnB1c2goY3VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb250LnB1c2goY3VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHluVmFsdWUgPSBycGF0aChkeW5hbWljLCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHluVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVWYWx1ZSA9IG1hcE9iakluZGV4ZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkLCBrKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cmFwQ2hpbGRyZW5Qcm9wKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0JhY2sgPyBycGF0aChiYWNrUGF0aCwgZCkgOiBkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0JhY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjb25jYXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNhdChba10sIGJhY2tQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb25jYXQoZHluYW1pYywgW2tdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluVmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBkeW5hbWljO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHJwYXRoKHBhdGgsIHByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVWYWx1ZSA9IHRoaXMud3JhcENoaWxkcmVuUHJvcChub2RlLCBwYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9wcyA9IGFzc29jUGF0aChwYXRoLCBub2RlVmFsdWUsIHByb3BzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcC5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3BhdGggPSBjaGlsZHJlblByb3AucmVwbGFjZSgne30nLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQXJyYXkgPSBjaGlsZHJlblByb3AuaW5jbHVkZXMoJ1tdJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGF0aCA9IG9wYXRoLnJlcGxhY2UoJ1tdJywgJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBwcm9wc1tvcGF0aF07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5vZGUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVBhdGggPSBjb25jYXQoW29wYXRoXSwgW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMgPSBhc3NvY1BhdGgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU9iamVjdChub2RlW2pdLCBhUGF0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMgPSBhc3NvYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU9iamVjdChub2RlLCBbb3BhdGhdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHByb3BzW2NoaWxkcmVuUHJvcF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzID0gYXNzb2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5Qcm9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JhcENoaWxkcmVuUHJvcChub2RlLCBbY2hpbGRyZW5Qcm9wXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZShwcm9wcy5pZCkgPT09ICdPYmplY3QnKSB7XG4gICAgICAgICAgICAvLyBUdXJuIG9iamVjdCBpZHMgKGZvciB3aWxkY2FyZHMpIGludG8gdW5pcXVlIHN0cmluZ3MuXG4gICAgICAgICAgICAvLyBCZWNhdXNlIG9mIHRoZSBgZGlzc29jYCBhYm92ZSB3ZSdyZSBub3QgbXV0YXRpbmcgdGhlIGxheW91dCxcbiAgICAgICAgICAgIC8vIGp1c3QgdGhlIGlkIHdlIHBhc3Mgb24gdG8gdGhlIHJlbmRlcmVkIGNvbXBvbmVudFxuICAgICAgICAgICAgcHJvcHMuaWQgPSBzdHJpbmdpZnlJZChwcm9wcy5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXh0cmFQcm9wcyA9IHtcbiAgICAgICAgICAgIGxvYWRpbmdfc3RhdGU6IGxvYWRpbmdfc3RhdGUgfHwgTk9UX0xPQURJTkcsXG4gICAgICAgICAgICBzZXRQcm9wc1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8Q29tcG9uZW50RXJyb3JCb3VuZGFyeVxuICAgICAgICAgICAgICAgIGNvbXBvbmVudFR5cGU9e19kYXNocHJpdmF0ZV9sYXlvdXQudHlwZX1cbiAgICAgICAgICAgICAgICBjb21wb25lbnRJZD17cHJvcHMuaWR9XG4gICAgICAgICAgICAgICAga2V5PXtwcm9wcy5pZH1cbiAgICAgICAgICAgICAgICBkaXNwYXRjaD17X2Rhc2hwcml2YXRlX2Rpc3BhdGNofVxuICAgICAgICAgICAgICAgIGVycm9yPXtfZGFzaHByaXZhdGVfZXJyb3J9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge19kYXNocHJpdmF0ZV9jb25maWcucHJvcHNfY2hlY2sgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxDaGVja2VkQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbj17Y2hpbGRyZW59XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50PXtlbGVtZW50fVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM9e3Byb3BzfVxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFQcm9wcz17ZXh0cmFQcm9wc31cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9e19kYXNocHJpdmF0ZV9sYXlvdXQudHlwZX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KGVsZW1lbnQsIHByb3BzLCBleHRyYVByb3BzLCBjaGlsZHJlbilcbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9Db21wb25lbnRFcnJvckJvdW5kYXJ5PlxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldExheW91dFByb3BzKCkge1xuICAgICAgICByZXR1cm4gcHJvcE9yKHt9LCAncHJvcHMnLCB0aGlzLnByb3BzLl9kYXNocHJpdmF0ZV9sYXlvdXQpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgX2Rhc2hwcml2YXRlX2xheW91dCxcbiAgICAgICAgICAgIF9kYXNocHJpdmF0ZV9sb2FkaW5nU3RhdGUsXG4gICAgICAgICAgICBfZGFzaHByaXZhdGVfcGF0aFxuICAgICAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgICAgICBjb25zdCBsYXlvdXRQcm9wcyA9IHRoaXMuZ2V0TGF5b3V0UHJvcHMoKTtcblxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW4oXG4gICAgICAgICAgICBsYXlvdXRQcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICAgIF9kYXNocHJpdmF0ZV9wYXRoXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50KFxuICAgICAgICAgICAgX2Rhc2hwcml2YXRlX2xheW91dCxcbiAgICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgICAgX2Rhc2hwcml2YXRlX2xvYWRpbmdTdGF0ZSxcbiAgICAgICAgICAgIHRoaXMuc2V0UHJvcHNcbiAgICAgICAgKTtcbiAgICB9XG59XG5cblRyZWVDb250YWluZXIucHJvcFR5cGVzID0ge1xuICAgIF9kYXNocHJpdmF0ZV9lcnJvcjogUHJvcFR5cGVzLmFueSxcbiAgICBfZGFzaHByaXZhdGVfbGF5b3V0OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIF9kYXNocHJpdmF0ZV9sb2FkaW5nU3RhdGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgICAgICBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgICBQcm9wVHlwZXMuYm9vbFxuICAgIF0pLFxuICAgIF9kYXNocHJpdmF0ZV9sb2FkaW5nU3RhdGVIYXNoOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIF9kYXNocHJpdmF0ZV9wYXRoOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuXG5CYXNlVHJlZUNvbnRhaW5lci5wcm9wVHlwZXMgPSB7XG4gICAgLi4uVHJlZUNvbnRhaW5lci5wcm9wVHlwZXMsXG4gICAgX2Rhc2hwcml2YXRlX2NvbmZpZzogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBfZGFzaHByaXZhdGVfZGlzcGF0Y2g6IFByb3BUeXBlcy5mdW5jLFxuICAgIF9kYXNocHJpdmF0ZV9ncmFwaHM6IFByb3BUeXBlcy5hbnksXG4gICAgX2Rhc2hwcml2YXRlX2xvYWRpbmdNYXA6IFByb3BUeXBlcy5hbnksXG4gICAgX2Rhc2hwcml2YXRlX3BhdGg6IFByb3BUeXBlcy5hcnJheVxufTtcblxuZXhwb3J0IGRlZmF1bHQgVHJlZUNvbnRhaW5lcjtcbiIsImltcG9ydCB7bWVyZ2VEZWVwUmlnaHQsIG9uY2V9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7Z2V0Q1NSRkhlYWRlciwgaGFuZGxlQXN5bmNFcnJvciwgYWRkSHR0cEhlYWRlcnN9IGZyb20gJy4uL2FjdGlvbnMnO1xuaW1wb3J0IHt1cmxCYXNlfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7TUFYX0FVVEhfUkVUUklFU30gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtKV1RfRVhQSVJFRF9NRVNTQUdFLCBTVEFUVVN9IGZyb20gJy4uL2NvbnN0YW50cy9jb25zdGFudHMnO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAqL1xuY29uc3QgbG9nV2FybmluZ09uY2UgPSBvbmNlKGNvbnNvbGUud2Fybik7XG5cbmZ1bmN0aW9uIEdFVChwYXRoLCBmZXRjaENvbmZpZykge1xuICAgIHJldHVybiBmZXRjaChcbiAgICAgICAgcGF0aCxcbiAgICAgICAgbWVyZ2VEZWVwUmlnaHQoZmV0Y2hDb25maWcsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiBnZXRDU1JGSGVhZGVyKClcbiAgICAgICAgfSlcbiAgICApO1xufVxuXG5mdW5jdGlvbiBQT1NUKHBhdGgsIGZldGNoQ29uZmlnLCBib2R5ID0ge30pIHtcbiAgICByZXR1cm4gZmV0Y2goXG4gICAgICAgIHBhdGgsXG4gICAgICAgIG1lcmdlRGVlcFJpZ2h0KGZldGNoQ29uZmlnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IGdldENTUkZIZWFkZXIoKSxcbiAgICAgICAgICAgIGJvZHk6IGJvZHkgPyBKU09OLnN0cmluZ2lmeShib2R5KSA6IG51bGxcbiAgICAgICAgfSlcbiAgICApO1xufVxuXG5jb25zdCByZXF1ZXN0ID0ge0dFVCwgUE9TVH07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFwaVRodW5rKGVuZHBvaW50LCBtZXRob2QsIHN0b3JlLCBpZCwgYm9keSkge1xuICAgIHJldHVybiBhc3luYyAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgICAgIGxldCB7Y29uZmlnLCBob29rc30gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBsZXQgbmV3SGVhZGVycyA9IG51bGw7XG5cbiAgICAgICAgY29uc3QgdXJsID0gYCR7dXJsQmFzZShjb25maWcpfSR7ZW5kcG9pbnR9YDtcblxuICAgICAgICBmdW5jdGlvbiBzZXRDb25uZWN0aW9uU3RhdHVzKGNvbm5lY3RlZCkge1xuICAgICAgICAgICAgaWYgKGdldFN0YXRlKCkuZXJyb3IuYmFja0VuZENvbm5lY3RlZCAhPT0gY29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnU0VUX0NPTk5FQ1RJT05fU1RBVFVTJyxcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogY29ubmVjdGVkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiBzdG9yZSxcbiAgICAgICAgICAgIHBheWxvYWQ6IHtpZCwgc3RhdHVzOiAnbG9hZGluZyd9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcmVzO1xuICAgICAgICAgICAgZm9yIChsZXQgcmV0cnkgPSAwOyByZXRyeSA8PSBNQVhfQVVUSF9SRVRSSUVTOyByZXRyeSsrKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gYXdhaXQgcmVxdWVzdFttZXRob2RdKHVybCwgY29uZmlnLmZldGNoLCBib2R5KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZldGNoIHJlamVjdGlvbiAtIHRoaXMgbWVhbnMgdGhlIHJlcXVlc3QgZGlkbid0IHJldHVybixcbiAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgZ2V0IGhlcmUgZnJvbSA0MDAvNTAwIGVycm9ycywgb25seSBuZXR3b3JrXG4gICAgICAgICAgICAgICAgICAgIC8vIGVycm9ycyBvciB1bnJlc3BvbnNpdmUgc2VydmVycy5cbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2ZldGNoIGVycm9yJywgcmVzKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0Q29ubmVjdGlvblN0YXR1cyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHJlcy5zdGF0dXMgPT09IFNUQVRVUy5VTkFVVEhPUklaRUQgfHxcbiAgICAgICAgICAgICAgICAgICAgcmVzLnN0YXR1cyA9PT0gU1RBVFVTLkJBRF9SRVFVRVNUXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChob29rcy5yZXF1ZXN0X3JlZnJlc2hfand0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChib2R5LmluY2x1ZGVzKEpXVF9FWFBJUkVEX01FU1NBR0UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Snd0ID0gYXdhaXQgaG9va3MucmVxdWVzdF9yZWZyZXNoX2p3dChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZldGNoLmhlYWRlcnMuQXV0aG9yaXphdGlvbi5zdWJzdHIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQmVhcmVyICcubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdKd3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhZGVycyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtuZXdKd3R9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IG1lcmdlRGVlcFJpZ2h0KGNvbmZpZywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2g6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBuZXdIZWFkZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXMuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpO1xuXG4gICAgICAgICAgICBpZiAobmV3SGVhZGVycykge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKGFkZEh0dHBIZWFkZXJzKG5ld0hlYWRlcnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldENvbm5lY3Rpb25TdGF0dXModHJ1ZSk7XG4gICAgICAgICAgICBpZiAoY29udGVudFR5cGUgJiYgY29udGVudFR5cGUuaW5kZXhPZignYXBwbGljYXRpb24vanNvbicpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpLnRoZW4oanNvbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHN0b3JlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBqc29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ganNvbjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ1dhcm5pbmdPbmNlKFxuICAgICAgICAgICAgICAgICdSZXNwb25zZSBpcyBtaXNzaW5nIGhlYWRlcjogY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogc3RvcmUsXG4gICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZXMuc3RhdHVzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdFcnJvciBmcm9tIEFQSSBjYWxsOiAnICsgZW5kcG9pbnQ7XG4gICAgICAgICAgICBoYW5kbGVBc3luY0Vycm9yKGVyciwgbWVzc2FnZSwgZGlzcGF0Y2gpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbiIsImNvbnN0IGFjdGlvbkxpc3QgPSB7XG4gICAgT05fUFJPUF9DSEFOR0U6IDEsXG4gICAgU0VUX1JFUVVFU1RfUVVFVUU6IDEsXG4gICAgU0VUX0dSQVBIUzogMSxcbiAgICBTRVRfUEFUSFM6IDEsXG4gICAgU0VUX0xBWU9VVDogMSxcbiAgICBTRVRfQVBQX0xJRkVDWUNMRTogMSxcbiAgICBTRVRfQ09ORklHOiAxLFxuICAgIEFERF9IVFRQX0hFQURFUlM6IDEsXG4gICAgT05fRVJST1I6IDEsXG4gICAgU0VUX0hPT0tTOiAxXG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QWN0aW9uID0gYWN0aW9uID0+IHtcbiAgICBpZiAoYWN0aW9uTGlzdFthY3Rpb25dKSB7XG4gICAgICAgIHJldHVybiBhY3Rpb247XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgJHthY3Rpb259IGlzIG5vdCBkZWZpbmVkLmApO1xufTtcblxuZXhwb3J0IGNvbnN0IE1BWF9BVVRIX1JFVFJJRVMgPSAxO1xuIiwiaW1wb3J0IHtEZXBHcmFwaH0gZnJvbSAnZGVwZW5kZW5jeS1ncmFwaCc7XG5pbXBvcnQgaXNOdW1lcmljIGZyb20gJ2Zhc3QtaXNudW1lcmljJztcbmltcG9ydCB7XG4gICAgYWxsLFxuICAgIGFueSxcbiAgICBhcCxcbiAgICBhc3NvYyxcbiAgICBkaWZmZXJlbmNlLFxuICAgIGVxdWFscyxcbiAgICBldm9sdmUsXG4gICAgZmluZEluZGV4LFxuICAgIGZsYXR0ZW4sXG4gICAgZm9yRWFjaE9iakluZGV4ZWQsXG4gICAgaW5jbHVkZXMsXG4gICAgaW50ZXJzZWN0aW9uLFxuICAgIGlzRW1wdHksXG4gICAga2V5cyxcbiAgICBtYXAsXG4gICAgbWVyZ2VSaWdodCxcbiAgICBwYXRoLFxuICAgIHBsdWNrLFxuICAgIHByb3BzLFxuICAgIHN0YXJ0c1dpdGgsXG4gICAgdmFsdWVzLFxuICAgIHppcCxcbiAgICB6aXBPYmpcbn0gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQge1xuICAgIGNvbWJpbmVJZEFuZFByb3AsXG4gICAgZ2V0Q2FsbGJhY2tzQnlJbnB1dCxcbiAgICBnZXRQcmlvcml0eSxcbiAgICBJTkRJUkVDVCxcbiAgICBtZXJnZU1heCxcbiAgICBtYWtlUmVzb2x2ZWRDYWxsYmFjayxcbiAgICByZXNvbHZlRGVwc1xufSBmcm9tICcuL2RlcGVuZGVuY2llc190cyc7XG5pbXBvcnQge2NvbXB1dGVQYXRocywgZ2V0UGF0aH0gZnJvbSAnLi9wYXRocyc7XG5cbmltcG9ydCB7Y3Jhd2xMYXlvdXR9IGZyb20gJy4vdXRpbHMnO1xuXG5pbXBvcnQgUmVnaXN0cnkgZnJvbSAnLi4vcmVnaXN0cnknO1xuXG4vKlxuICogSWYgdGhpcyB1cGRhdGUgaXMgZm9yIG11bHRpcGxlIG91dHB1dHMsIHRoZW4gaXQgaGFzXG4gKiBzdGFydGluZyAmIHRyYWlsaW5nIGAuLmAgYW5kIGVhY2ggcHJvcElkIHBhaXIgaXMgc2VwYXJhdGVkXG4gKiBieSBgLi4uYCwgZS5nLlxuICogXCIuLm91dHB1dC0xLnZhbHVlLi4ub3V0cHV0LTIudmFsdWUuLi5vdXRwdXQtMy52YWx1ZS4uLm91dHB1dC00LnZhbHVlLi5cIlxuICovXG5leHBvcnQgY29uc3QgaXNNdWx0aU91dHB1dFByb3AgPSBpZEFuZFByb3AgPT4gaWRBbmRQcm9wLnN0YXJ0c1dpdGgoJy4uJyk7XG5cbmNvbnN0IEFMTCA9IHt3aWxkOiAnQUxMJywgbXVsdGk6IDF9O1xuY29uc3QgTUFUQ0ggPSB7d2lsZDogJ01BVENIJ307XG5jb25zdCBBTExTTUFMTEVSID0ge3dpbGQ6ICdBTExTTUFMTEVSJywgbXVsdGk6IDEsIGV4cGFuZDogMX07XG5jb25zdCB3aWxkY2FyZHMgPSB7QUxMLCBNQVRDSCwgQUxMU01BTExFUn07XG5jb25zdCBhbGxvd2VkV2lsZGNhcmRzID0ge1xuICAgIE91dHB1dDoge0FMTCwgTUFUQ0h9LFxuICAgIElucHV0OiB3aWxkY2FyZHMsXG4gICAgU3RhdGU6IHdpbGRjYXJkc1xufTtcbmNvbnN0IHdpbGRjYXJkVmFsVHlwZXMgPSBbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddO1xuXG5jb25zdCBpZEludmFsaWRDaGFycyA9IFsnLicsICd7J107XG5cbi8qXG4gKiBJZiB0aGlzIElEIGlzIGEgd2lsZGNhcmQsIGl0IGlzIGEgc3RyaW5naWZpZWQgSlNPTiBvYmplY3RcbiAqIHRoZSBcIntcIiBjaGFyYWN0ZXIgaXMgZGlzYWxsb3dlZCBmcm9tIHJlZ3VsYXIgc3RyaW5nIElEc1xuICovXG5jb25zdCBpc1dpbGRjYXJkSWQgPSBpZFN0ciA9PiBpZFN0ci5zdGFydHNXaXRoKCd7Jyk7XG5cbi8qXG4gKiBUdXJuIHN0cmluZ2lmaWVkIHdpbGRjYXJkIElEcyBpbnRvIG9iamVjdHMuXG4gKiBXaWxkY2FyZHMgYXJlIGVuY29kZWQgYXMgc2luZ2xlLWl0ZW0gYXJyYXlzIGNvbnRhaW5pbmcgdGhlIHdpbGRjYXJkIG5hbWVcbiAqIGFzIGEgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBwYXJzZVdpbGRjYXJkSWQoaWRTdHIpIHtcbiAgICByZXR1cm4gbWFwKFxuICAgICAgICB2YWwgPT4gKEFycmF5LmlzQXJyYXkodmFsKSAmJiB3aWxkY2FyZHNbdmFsWzBdXSkgfHwgdmFsLFxuICAgICAgICBKU09OLnBhcnNlKGlkU3RyKVxuICAgICk7XG59XG5cbi8qXG4gKiBJZiB0aGlzIHVwZGF0ZSBpcyBmb3IgbXVsdGlwbGUgb3V0cHV0cywgdGhlbiBpdCBoYXNcbiAqIHN0YXJ0aW5nICYgdHJhaWxpbmcgYC4uYCBhbmQgZWFjaCBwcm9wSWQgcGFpciBpcyBzZXBhcmF0ZWRcbiAqIGJ5IGAuLi5gLCBlLmcuXG4gKiBcIi4ub3V0cHV0LTEudmFsdWUuLi5vdXRwdXQtMi52YWx1ZS4uLm91dHB1dC0zLnZhbHVlLi4ub3V0cHV0LTQudmFsdWUuLlwiXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTXVsdGlwbGVPdXRwdXRzKG91dHB1dElkQW5kUHJvcCkge1xuICAgIHJldHVybiBvdXRwdXRJZEFuZFByb3Auc3Vic3RyKDIsIG91dHB1dElkQW5kUHJvcC5sZW5ndGggLSA0KS5zcGxpdCgnLi4uJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdElkQW5kUHJvcChpZEFuZFByb3ApIHtcbiAgICAvLyBzaW5jZSB3aWxkY2FyZCBpZHMgY2FuIGhhdmUgLiBpbiB0aGVtIGJ1dCBwcm9wcyBjYW4ndCxcbiAgICAvLyBsb29rIGZvciB0aGUgbGFzdCAuIGluIHRoZSBzdHJpbmcgYW5kIHNwbGl0IHRoZXJlXG4gICAgY29uc3QgZG90UG9zID0gaWRBbmRQcm9wLmxhc3RJbmRleE9mKCcuJyk7XG4gICAgY29uc3QgaWRTdHIgPSBpZEFuZFByb3Auc3Vic3RyKDAsIGRvdFBvcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHBhcnNlSWZXaWxkY2FyZChpZFN0ciksXG4gICAgICAgIHByb3BlcnR5OiBpZEFuZFByb3Auc3Vic3RyKGRvdFBvcyArIDEpXG4gICAgfTtcbn1cblxuLypcbiAqIENoZWNrIGlmIHRoaXMgSUQgaXMgYSBzdHJpbmdpZmllZCBvYmplY3QsIGFuZCBpZiBzbyBwYXJzZSBpdCB0byB0aGF0IG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJZldpbGRjYXJkKGlkU3RyKSB7XG4gICAgcmV0dXJuIGlzV2lsZGNhcmRJZChpZFN0cikgPyBwYXJzZVdpbGRjYXJkSWQoaWRTdHIpIDogaWRTdHI7XG59XG5cbi8qXG4gKiBKU09OLnN0cmluZ2lmeSAtIGZvciB0aGUgb2JqZWN0IGZvcm0gLSBidXQgZW5zdXJpbmcga2V5cyBhcmUgc29ydGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnlJZChpZCkge1xuICAgIGlmICh0eXBlb2YgaWQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gICAgY29uc3Qgc3RyaW5naWZ5VmFsID0gdiA9PiAodiAmJiB2LndpbGQpIHx8IEpTT04uc3RyaW5naWZ5KHYpO1xuICAgIGNvbnN0IHBhcnRzID0gT2JqZWN0LmtleXMoaWQpXG4gICAgICAgIC5zb3J0KClcbiAgICAgICAgLm1hcChrID0+IEpTT04uc3RyaW5naWZ5KGspICsgJzonICsgc3RyaW5naWZ5VmFsKGlkW2tdKSk7XG4gICAgcmV0dXJuICd7JyArIHBhcnRzLmpvaW4oJywnKSArICd9Jztcbn1cblxuLypcbiAqIGlkIGRpY3QgdmFsdWVzIGNhbiBiZSBudW1iZXJzLCBzdHJpbmdzLCBhbmQgYm9vbGVhbnMuXG4gKiBXZSBuZWVkIGEgZGVmaW5pdGUgb3JkZXJpbmcgdGhhdCB3aWxsIHdvcmsgYWNyb3NzIHR5cGVzLFxuICogZXZlbiBpZiBzYW5lIHVzZXJzIHdvdWxkIG5vdCBtaXggdHlwZXMuXG4gKiAtIG51bWVyaWMgc3RyaW5ncyBhcmUgdHJlYXRlZCBhcyBudW1iZXJzXG4gKiAtIGJvb2xlYW5zIGNvbWUgYWZ0ZXIgbnVtYmVycywgYmVmb3JlIHN0cmluZ3MuIGZhbHNlLCB0aGVuIHRydWUuXG4gKiAtIG5vbi1udW1lcmljIHN0cmluZ3MgY29tZSBsYXN0XG4gKi9cbmZ1bmN0aW9uIGlkVmFsU29ydChhLCBiKSB7XG4gICAgY29uc3QgYklzTnVtZXJpYyA9IGlzTnVtZXJpYyhiKTtcbiAgICBpZiAoaXNOdW1lcmljKGEpKSB7XG4gICAgICAgIGlmIChiSXNOdW1lcmljKSB7XG4gICAgICAgICAgICBjb25zdCBhTiA9IE51bWJlcihhKTtcbiAgICAgICAgICAgIGNvbnN0IGJOID0gTnVtYmVyKGIpO1xuICAgICAgICAgICAgcmV0dXJuIGFOID4gYk4gPyAxIDogYU4gPCBiTiA/IC0xIDogMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGlmIChiSXNOdW1lcmljKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBjb25zdCBhSXNCb29sID0gdHlwZW9mIGEgPT09ICdib29sZWFuJztcbiAgICBpZiAoYUlzQm9vbCAhPT0gKHR5cGVvZiBiID09PSAnYm9vbGVhbicpKSB7XG4gICAgICAgIHJldHVybiBhSXNCb29sID8gLTEgOiAxO1xuICAgIH1cbiAgICByZXR1cm4gYSA+IGIgPyAxIDogYSA8IGIgPyAtMSA6IDA7XG59XG5cbi8qXG4gKiBQcm92aWRlIGEgdmFsdWUga25vd24gdG8gYmUgYmVmb3JlIG9yIGFmdGVyIHYsIGFjY29yZGluZyB0byBpZFZhbFNvcnRcbiAqL1xuY29uc3QgdmFsQmVmb3JlID0gdiA9PiAoaXNOdW1lcmljKHYpID8gdiAtIDEgOiAwKTtcbmNvbnN0IHZhbEFmdGVyID0gdiA9PiAodHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdiArICd6JyA6ICd6Jyk7XG5cbmZ1bmN0aW9uIGFkZE1hcChkZXBNYXAsIGlkLCBwcm9wLCBkZXBlbmRlbmN5KSB7XG4gICAgY29uc3QgaWRNYXAgPSAoZGVwTWFwW2lkXSA9IGRlcE1hcFtpZF0gfHwge30pO1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IChpZE1hcFtwcm9wXSA9IGlkTWFwW3Byb3BdIHx8IFtdKTtcbiAgICBjYWxsYmFja3MucHVzaChkZXBlbmRlbmN5KTtcbn1cblxuZnVuY3Rpb24gYWRkUGF0dGVybihkZXBNYXAsIGlkU3BlYywgcHJvcCwgZGVwZW5kZW5jeSkge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpZFNwZWMpLnNvcnQoKTtcbiAgICBjb25zdCBrZXlTdHIgPSBrZXlzLmpvaW4oJywnKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBwcm9wcyhrZXlzLCBpZFNwZWMpO1xuICAgIGNvbnN0IGtleUNhbGxiYWNrcyA9IChkZXBNYXBba2V5U3RyXSA9IGRlcE1hcFtrZXlTdHJdIHx8IHt9KTtcbiAgICBjb25zdCBwcm9wQ2FsbGJhY2tzID0gKGtleUNhbGxiYWNrc1twcm9wXSA9IGtleUNhbGxiYWNrc1twcm9wXSB8fCBbXSk7XG4gICAgbGV0IHZhbE1hdGNoID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wQ2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChlcXVhbHModmFsdWVzLCBwcm9wQ2FsbGJhY2tzW2ldLnZhbHVlcykpIHtcbiAgICAgICAgICAgIHZhbE1hdGNoID0gcHJvcENhbGxiYWNrc1tpXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghdmFsTWF0Y2gpIHtcbiAgICAgICAgdmFsTWF0Y2ggPSB7a2V5cywgdmFsdWVzLCBjYWxsYmFja3M6IFtdfTtcbiAgICAgICAgcHJvcENhbGxiYWNrcy5wdXNoKHZhbE1hdGNoKTtcbiAgICB9XG4gICAgdmFsTWF0Y2guY2FsbGJhY2tzLnB1c2goZGVwZW5kZW5jeSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRGVwZW5kZW5jaWVzKHBhcnNlZERlcGVuZGVuY2llcywgZGlzcGF0Y2hFcnJvcikge1xuICAgIGNvbnN0IG91dFN0cnMgPSB7fTtcbiAgICBjb25zdCBvdXRPYmpzID0gW107XG5cbiAgICBwYXJzZWREZXBlbmRlbmNpZXMuZm9yRWFjaChkZXAgPT4ge1xuICAgICAgICBjb25zdCB7aW5wdXRzLCBvdXRwdXRzLCBzdGF0ZX0gPSBkZXA7XG4gICAgICAgIGxldCBoYXNPdXRwdXRzID0gdHJ1ZTtcbiAgICAgICAgaWYgKG91dHB1dHMubGVuZ3RoID09PSAxICYmICFvdXRwdXRzWzBdLmlkICYmICFvdXRwdXRzWzBdLnByb3BlcnR5KSB7XG4gICAgICAgICAgICBoYXNPdXRwdXRzID0gZmFsc2U7XG4gICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdBIGNhbGxiYWNrIGlzIG1pc3NpbmcgT3V0cHV0cycsIFtcbiAgICAgICAgICAgICAgICAnUGxlYXNlIHByb3ZpZGUgYW4gb3V0cHV0IGZvciB0aGlzIGNhbGxiYWNrOicsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZGVwLCBudWxsLCAyKVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoZWFkID1cbiAgICAgICAgICAgICdJbiB0aGUgY2FsbGJhY2sgZm9yIG91dHB1dChzKTpcXG4gICcgK1xuICAgICAgICAgICAgb3V0cHV0cy5tYXAoY29tYmluZUlkQW5kUHJvcCkuam9pbignXFxuICAnKTtcblxuICAgICAgICBpZiAoIWlucHV0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0EgY2FsbGJhY2sgaXMgbWlzc2luZyBJbnB1dHMnLCBbXG4gICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAndGhlcmUgYXJlIG5vIGBJbnB1dGAgZWxlbWVudHMuJyxcbiAgICAgICAgICAgICAgICAnV2l0aG91dCBgSW5wdXRgIGVsZW1lbnRzLCBpdCB3aWxsIG5ldmVyIGdldCBjYWxsZWQuJyxcbiAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAnU3Vic2NyaWJpbmcgdG8gYElucHV0YCBjb21wb25lbnRzIHdpbGwgY2F1c2UgdGhlJyxcbiAgICAgICAgICAgICAgICAnY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW5ldmVyIHRoZWlyIHZhbHVlcyBjaGFuZ2UuJ1xuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGVjID0gW1xuICAgICAgICAgICAgW291dHB1dHMsICdPdXRwdXQnXSxcbiAgICAgICAgICAgIFtpbnB1dHMsICdJbnB1dCddLFxuICAgICAgICAgICAgW3N0YXRlLCAnU3RhdGUnXVxuICAgICAgICBdO1xuICAgICAgICBzcGVjLmZvckVhY2goKFthcmdzLCBjbHNdKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2xzID09PSAnT3V0cHV0JyAmJiAhaGFzT3V0cHV0cykge1xuICAgICAgICAgICAgICAgIC8vIGp1c3QgYSBxdWlyayBvZiBob3cgd2UgcGFzcyAmIHBhcnNlIG91dHB1dHMgLSBpZiB5b3UgZG9uJ3RcbiAgICAgICAgICAgICAgICAvLyBwcm92aWRlIG9uZSwgaXQgbG9va3MgbGlrZSBhIHNpbmdsZSBibGFuayBvdXRwdXQuIFRoaXMgaXNcbiAgICAgICAgICAgICAgICAvLyBhY3R1YWxseSB1c2VmdWwgZm9yIGdyYWNlZnVsIGZhaWx1cmUsIHNvIHdlIHdvcmsgYXJvdW5kIGl0LlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFyZ3MpKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcihgQ2FsbGJhY2sgJHtjbHN9KHMpIG11c3QgYmUgYW4gQXJyYXlgLCBbXG4gICAgICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgICAgIGBGb3IgJHtjbHN9KHMpIHdlIGZvdW5kOmAsXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGFyZ3MpLFxuICAgICAgICAgICAgICAgICAgICAnYnV0IHdlIGV4cGVjdGVkIGFuIEFycmF5LidcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFyZ3MuZm9yRWFjaCgoaWRQcm9wLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGVBcmcoaWRQcm9wLCBoZWFkLCBjbHMsIGksIGRpc3BhdGNoRXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZpbmREdXBsaWNhdGVPdXRwdXRzKG91dHB1dHMsIGhlYWQsIGRpc3BhdGNoRXJyb3IsIG91dFN0cnMsIG91dE9ianMpO1xuICAgICAgICBmaW5kTWlzbWF0Y2hlZFdpbGRjYXJkcyhvdXRwdXRzLCBpbnB1dHMsIHN0YXRlLCBoZWFkLCBkaXNwYXRjaEVycm9yKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBcmcoe2lkLCBwcm9wZXJ0eX0sIGhlYWQsIGNscywgaSwgZGlzcGF0Y2hFcnJvcikge1xuICAgIGlmICh0eXBlb2YgcHJvcGVydHkgIT09ICdzdHJpbmcnIHx8ICFwcm9wZXJ0eSkge1xuICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayBwcm9wZXJ0eSBlcnJvcicsIFtcbiAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICBgJHtjbHN9WyR7aX1dLnByb3BlcnR5ID0gJHtKU09OLnN0cmluZ2lmeShwcm9wZXJ0eSl9YCxcbiAgICAgICAgICAgICdidXQgd2UgZXhwZWN0ZWQgYHByb3BlcnR5YCB0byBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJ1xuICAgICAgICBdKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlkID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoaXNFbXB0eShpZCkpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIGl0ZW0gbWlzc2luZyBJRCcsIFtcbiAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWQgPSB7fWAsXG4gICAgICAgICAgICAgICAgJ0V2ZXJ5IGl0ZW0gbGlua2VkIHRvIGEgY2FsbGJhY2sgbmVlZHMgYW4gSUQnXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvckVhY2hPYmpJbmRleGVkKCh2LCBrKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWspIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayB3aWxkY2FyZCBJRCBlcnJvcicsIFtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgYCR7Y2xzfVske2l9XS5pZCBoYXMga2V5IFwiJHtrfVwiYCxcbiAgICAgICAgICAgICAgICAgICAgJ0tleXMgbXVzdCBiZSBub24tZW1wdHkgc3RyaW5ncy4nXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdi53aWxkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFsbG93ZWRXaWxkY2FyZHNbY2xzXVt2LndpbGRdICE9PSB2KSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIHdpbGRjYXJkIElEIGVycm9yJywgW1xuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWRbXCIke2t9XCJdID0gJHt2LndpbGR9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGBBbGxvd2VkIHdpbGRjYXJkcyBmb3IgJHtjbHN9cyBhcmU6YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMoYWxsb3dlZFdpbGRjYXJkc1tjbHNdKS5qb2luKCcsICcpXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWluY2x1ZGVzKHR5cGVvZiB2LCB3aWxkY2FyZFZhbFR5cGVzKSkge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIHdpbGRjYXJkIElEIGVycm9yJywgW1xuICAgICAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgICAgICBgJHtjbHN9WyR7aX1dLmlkW1wiJHtrfVwiXSA9ICR7SlNPTi5zdHJpbmdpZnkodil9YCxcbiAgICAgICAgICAgICAgICAgICAgJ1dpbGRjYXJkIGNhbGxiYWNrIElEIHZhbHVlcyBtdXN0IGJlIGVpdGhlciB3aWxkY2FyZHMnLFxuICAgICAgICAgICAgICAgICAgICAnb3IgY29uc3RhbnRzIG9mIG9uZSBvZiB0aGVzZSB0eXBlczonLFxuICAgICAgICAgICAgICAgICAgICB3aWxkY2FyZFZhbFR5cGVzLmpvaW4oJywgJylcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgaWQpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayBpdGVtIG1pc3NpbmcgSUQnLCBbXG4gICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICBgJHtjbHN9WyR7aX1dLmlkID0gXCIke2lkfVwiYCxcbiAgICAgICAgICAgICAgICAnRXZlcnkgaXRlbSBsaW5rZWQgdG8gYSBjYWxsYmFjayBuZWVkcyBhbiBJRCdcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGludmFsaWRDaGFycyA9IGlkSW52YWxpZENoYXJzLmZpbHRlcihjID0+IGluY2x1ZGVzKGMsIGlkKSk7XG4gICAgICAgIGlmIChpbnZhbGlkQ2hhcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayBpbnZhbGlkIElEIHN0cmluZycsIFtcbiAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWQgPSAnJHtpZH0nYCxcbiAgICAgICAgICAgICAgICBgY2hhcmFjdGVycyAnJHtpbnZhbGlkQ2hhcnMuam9pbihcIicsICdcIil9JyBhcmUgbm90IGFsbG93ZWQuYFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayBJRCB0eXBlIGVycm9yJywgW1xuICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWQgPSAke0pTT04uc3RyaW5naWZ5KGlkKX1gLFxuICAgICAgICAgICAgJ0lEcyBtdXN0IGJlIHN0cmluZ3Mgb3Igd2lsZGNhcmQtY29tcGF0aWJsZSBvYmplY3RzLidcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBmaW5kRHVwbGljYXRlT3V0cHV0cyhvdXRwdXRzLCBoZWFkLCBkaXNwYXRjaEVycm9yLCBvdXRTdHJzLCBvdXRPYmpzKSB7XG4gICAgY29uc3QgbmV3T3V0cHV0U3RycyA9IHt9O1xuICAgIGNvbnN0IG5ld091dHB1dE9ianMgPSBbXTtcbiAgICBvdXRwdXRzLmZvckVhY2goKHtpZCwgcHJvcGVydHl9LCBpKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBpZFByb3AgPSBjb21iaW5lSWRBbmRQcm9wKHtpZCwgcHJvcGVydHl9KTtcbiAgICAgICAgICAgIGlmIChuZXdPdXRwdXRTdHJzW2lkUHJvcF0pIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdEdXBsaWNhdGUgY2FsbGJhY2sgT3V0cHV0cycsIFtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgYE91dHB1dCAke2l9ICgke2lkUHJvcH0pIGlzIGFscmVhZHkgdXNlZCBieSB0aGlzIGNhbGxiYWNrLmBcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0U3Ryc1tpZFByb3BdKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignRHVwbGljYXRlIGNhbGxiYWNrIG91dHB1dHMnLCBbXG4gICAgICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgICAgIGBPdXRwdXQgJHtpfSAoJHtpZFByb3B9KSBpcyBhbHJlYWR5IGluIHVzZS5gLFxuICAgICAgICAgICAgICAgICAgICAnVG8gcmVzb2x2ZSB0aGlzLCBzZXQgYGFsbG93X2R1cGxpY2F0ZT1UcnVlYCBvbicsXG4gICAgICAgICAgICAgICAgICAgICdkdXBsaWNhdGUgb3V0cHV0cywgb3IgY29tYmluZSB0aGUgb3V0cHV0cyBpbnRvJyxcbiAgICAgICAgICAgICAgICAgICAgJ29uZSBjYWxsYmFjayBmdW5jdGlvbiwgZGlzdGluZ3Vpc2hpbmcgdGhlIHRyaWdnZXInLFxuICAgICAgICAgICAgICAgICAgICAnYnkgdXNpbmcgYGRhc2guY2FsbGJhY2tfY29udGV4dGAgaWYgbmVjZXNzYXJ5LidcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3T3V0cHV0U3Ryc1tpZFByb3BdID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGlkT2JqID0ge2lkLCBwcm9wZXJ0eX07XG4gICAgICAgICAgICBjb25zdCBzZWxmT3ZlcmxhcCA9IHdpbGRjYXJkT3ZlcmxhcChpZE9iaiwgbmV3T3V0cHV0T2Jqcyk7XG4gICAgICAgICAgICBjb25zdCBvdGhlck92ZXJsYXAgPSBzZWxmT3ZlcmxhcCB8fCB3aWxkY2FyZE92ZXJsYXAoaWRPYmosIG91dE9ianMpO1xuICAgICAgICAgICAgaWYgKHNlbGZPdmVybGFwIHx8IG90aGVyT3ZlcmxhcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkUHJvcCA9IGNvbWJpbmVJZEFuZFByb3AoaWRPYmopO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkUHJvcDIgPSBjb21iaW5lSWRBbmRQcm9wKHNlbGZPdmVybGFwIHx8IG90aGVyT3ZlcmxhcCk7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignT3ZlcmxhcHBpbmcgd2lsZGNhcmQgY2FsbGJhY2sgb3V0cHV0cycsIFtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgYE91dHB1dCAke2l9ICgke2lkUHJvcH0pYCxcbiAgICAgICAgICAgICAgICAgICAgYG92ZXJsYXBzIGFub3RoZXIgb3V0cHV0ICgke2lkUHJvcDJ9KWAsXG4gICAgICAgICAgICAgICAgICAgIGB1c2VkIGluICR7c2VsZk92ZXJsYXAgPyAndGhpcycgOiAnYSBkaWZmZXJlbnQnfSBjYWxsYmFjay5gXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld091dHB1dE9ianMucHVzaChpZE9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBrZXlzKG5ld091dHB1dFN0cnMpLmZvckVhY2goayA9PiB7XG4gICAgICAgIG91dFN0cnNba10gPSAxO1xuICAgIH0pO1xuICAgIG5ld091dHB1dE9ianMuZm9yRWFjaChpZE9iaiA9PiB7XG4gICAgICAgIG91dE9ianMucHVzaChpZE9iaik7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSW5PdXRPdmVybGFwKG91dCwgaW5wdXRzKSB7XG4gICAgY29uc3Qge2lkOiBvdXRJZCwgcHJvcGVydHk6IG91dFByb3B9ID0gb3V0O1xuICAgIHJldHVybiBpbnB1dHMuc29tZShpbl8gPT4ge1xuICAgICAgICBjb25zdCB7aWQ6IGluSWQsIHByb3BlcnR5OiBpblByb3B9ID0gaW5fO1xuICAgICAgICBpZiAob3V0UHJvcCAhPT0gaW5Qcm9wIHx8IHR5cGVvZiBvdXRJZCAhPT0gdHlwZW9mIGluSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG91dElkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKG91dElkID09PSBpbklkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2lsZGNhcmRPdmVybGFwKGluXywgW291dF0pKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRNaXNtYXRjaGVkV2lsZGNhcmRzKG91dHB1dHMsIGlucHV0cywgc3RhdGUsIGhlYWQsIGRpc3BhdGNoRXJyb3IpIHtcbiAgICBjb25zdCB7bWF0Y2hLZXlzOiBvdXQwTWF0Y2hLZXlzfSA9IGZpbmRXaWxkY2FyZEtleXMob3V0cHV0c1swXS5pZCk7XG4gICAgb3V0cHV0cy5mb3JFYWNoKChvdXQsIGkpID0+IHtcbiAgICAgICAgaWYgKGkgJiYgIWVxdWFscyhmaW5kV2lsZGNhcmRLZXlzKG91dC5pZCkubWF0Y2hLZXlzLCBvdXQwTWF0Y2hLZXlzKSkge1xuICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignTWlzbWF0Y2hlZCBgTUFUQ0hgIHdpbGRjYXJkcyBhY3Jvc3MgYE91dHB1dGBzJywgW1xuICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgYE91dHB1dCAke2l9ICgke2NvbWJpbmVJZEFuZFByb3Aob3V0KX0pYCxcbiAgICAgICAgICAgICAgICAnZG9lcyBub3QgaGF2ZSBNQVRDSCB3aWxkY2FyZHMgb24gdGhlIHNhbWUga2V5cyBhcycsXG4gICAgICAgICAgICAgICAgYE91dHB1dCAwICgke2NvbWJpbmVJZEFuZFByb3Aob3V0cHV0c1swXSl9KS5gLFxuICAgICAgICAgICAgICAgICdNQVRDSCB3aWxkY2FyZHMgbXVzdCBiZSBvbiB0aGUgc2FtZSBrZXlzIGZvciBhbGwgT3V0cHV0cy4nLFxuICAgICAgICAgICAgICAgICdBTEwgd2lsZGNhcmRzIG5lZWQgbm90IG1hdGNoLCBvbmx5IE1BVENILidcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgW1xuICAgICAgICBbaW5wdXRzLCAnSW5wdXQnXSxcbiAgICAgICAgW3N0YXRlLCAnU3RhdGUnXVxuICAgIF0uZm9yRWFjaCgoW2FyZ3MsIGNsc10pID0+IHtcbiAgICAgICAgYXJncy5mb3JFYWNoKChhcmcsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHttYXRjaEtleXMsIGFsbHNtYWxsZXJLZXlzfSA9IGZpbmRXaWxkY2FyZEtleXMoYXJnLmlkKTtcbiAgICAgICAgICAgIGNvbnN0IGFsbFdpbGRjYXJkS2V5cyA9IG1hdGNoS2V5cy5jb25jYXQoYWxsc21hbGxlcktleXMpO1xuICAgICAgICAgICAgY29uc3QgZGlmZiA9IGRpZmZlcmVuY2UoYWxsV2lsZGNhcmRLZXlzLCBvdXQwTWF0Y2hLZXlzKTtcbiAgICAgICAgICAgIGlmIChkaWZmLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGRpZmYuc29ydCgpO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ2BJbnB1dGAgLyBgU3RhdGVgIHdpbGRjYXJkcyBub3QgaW4gYE91dHB1dGBzJywgW1xuICAgICAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgICAgICBgJHtjbHN9ICR7aX0gKCR7Y29tYmluZUlkQW5kUHJvcChhcmcpfSlgLFxuICAgICAgICAgICAgICAgICAgICBgaGFzIE1BVENIIG9yIEFMTFNNQUxMRVIgb24ga2V5KHMpICR7ZGlmZi5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICAgICAgICAgIGB3aGVyZSBPdXRwdXQgMCAoJHtjb21iaW5lSWRBbmRQcm9wKG91dHB1dHNbMF0pfSlgLFxuICAgICAgICAgICAgICAgICAgICAnZG9lcyBub3QgaGF2ZSBhIE1BVENIIHdpbGRjYXJkLiBJbnB1dHMgYW5kIFN0YXRlIGRvIG5vdCcsXG4gICAgICAgICAgICAgICAgICAgICduZWVkIGV2ZXJ5IE1BVENIIGZyb20gdGhlIE91dHB1dChzKSwgYnV0IHRoZXkgY2Fubm90IGhhdmUnLFxuICAgICAgICAgICAgICAgICAgICAnZXh0cmFzIGJleW9uZCB0aGUgT3V0cHV0KHMpLidcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbmNvbnN0IG1hdGNoV2lsZEtleXMgPSAoW2EsIGJdKSA9PiB7XG4gICAgY29uc3QgYVdpbGQgPSBhICYmIGEud2lsZDtcbiAgICBjb25zdCBiV2lsZCA9IGIgJiYgYi53aWxkO1xuICAgIGlmIChhV2lsZCAmJiBiV2lsZCkge1xuICAgICAgICAvLyBFdmVyeSB3aWxkY2FyZCBjb21iaW5hdGlvbiBvdmVybGFwcyBleGNlcHQgTUFUQ0g8LT5BTExTTUFMTEVSXG4gICAgICAgIHJldHVybiAhKFxuICAgICAgICAgICAgKGEgPT09IE1BVENIICYmIGIgPT09IEFMTFNNQUxMRVIpIHx8XG4gICAgICAgICAgICAoYSA9PT0gQUxMU01BTExFUiAmJiBiID09PSBNQVRDSClcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGEgPT09IGIgfHwgYVdpbGQgfHwgYldpbGQ7XG59O1xuXG5mdW5jdGlvbiB3aWxkY2FyZE92ZXJsYXAoe2lkLCBwcm9wZXJ0eX0sIG9ianMpIHtcbiAgICBjb25zdCBpZEtleXMgPSBrZXlzKGlkKS5zb3J0KCk7XG4gICAgY29uc3QgaWRWYWxzID0gcHJvcHMoaWRLZXlzLCBpZCk7XG4gICAgZm9yIChjb25zdCBvYmogb2Ygb2Jqcykge1xuICAgICAgICBjb25zdCB7aWQ6IGlkMiwgcHJvcGVydHk6IHByb3BlcnR5Mn0gPSBvYmo7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHByb3BlcnR5MiA9PT0gcHJvcGVydHkgJiZcbiAgICAgICAgICAgIHR5cGVvZiBpZDIgIT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICBlcXVhbHMoa2V5cyhpZDIpLnNvcnQoKSwgaWRLZXlzKSAmJlxuICAgICAgICAgICAgYWxsKG1hdGNoV2lsZEtleXMsIHppcChpZFZhbHMsIHByb3BzKGlkS2V5cywgaWQyKSkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNhbGxiYWNrc1RvTGF5b3V0KHN0YXRlXywgZGlzcGF0Y2hFcnJvcikge1xuICAgIGNvbnN0IHtjb25maWcsIGdyYXBocywgbGF5b3V0OiBsYXlvdXRfLCBwYXRoczogcGF0aHNffSA9IHN0YXRlXztcbiAgICBjb25zdCB2YWxpZGF0ZUlkcyA9ICFjb25maWcuc3VwcHJlc3NfY2FsbGJhY2tfZXhjZXB0aW9ucztcbiAgICBsZXQgbGF5b3V0LCBwYXRocztcbiAgICBpZiAodmFsaWRhdGVJZHMgJiYgY29uZmlnLnZhbGlkYXRpb25fbGF5b3V0KSB7XG4gICAgICAgIGxheW91dCA9IGNvbmZpZy52YWxpZGF0aW9uX2xheW91dDtcbiAgICAgICAgcGF0aHMgPSBjb21wdXRlUGF0aHMobGF5b3V0LCBbXSwgbnVsbCwgcGF0aHNfLmV2ZW50cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGF5b3V0ID0gbGF5b3V0XztcbiAgICAgICAgcGF0aHMgPSBwYXRoc187XG4gICAgfVxuICAgIGNvbnN0IHtvdXRwdXRNYXAsIGlucHV0TWFwLCBvdXRwdXRQYXR0ZXJucywgaW5wdXRQYXR0ZXJuc30gPSBncmFwaHM7XG5cbiAgICBmdW5jdGlvbiB0YWlsKGNhbGxiYWNrcykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgJ1RoaXMgSUQgd2FzIHVzZWQgaW4gdGhlIGNhbGxiYWNrKHMpIGZvciBPdXRwdXQocyk6XFxuICAnICtcbiAgICAgICAgICAgIGNhbGxiYWNrc1xuICAgICAgICAgICAgICAgIC5tYXAoKHtvdXRwdXRzfSkgPT4gb3V0cHV0cy5tYXAoY29tYmluZUlkQW5kUHJvcCkuam9pbignLCAnKSlcbiAgICAgICAgICAgICAgICAuam9pbignXFxuICAnKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1pc3NpbmdJZChpZCwgY2xzLCBjYWxsYmFja3MpIHtcbiAgICAgICAgZGlzcGF0Y2hFcnJvcignSUQgbm90IGZvdW5kIGluIGxheW91dCcsIFtcbiAgICAgICAgICAgIGBBdHRlbXB0aW5nIHRvIGNvbm5lY3QgYSBjYWxsYmFjayAke2Nsc30gaXRlbSB0byBjb21wb25lbnQ6YCxcbiAgICAgICAgICAgIGAgIFwiJHtzdHJpbmdpZnlJZChpZCl9XCJgLFxuICAgICAgICAgICAgJ2J1dCBubyBjb21wb25lbnRzIHdpdGggdGhhdCBpZCBleGlzdCBpbiB0aGUgbGF5b3V0LicsXG4gICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICdJZiB5b3UgYXJlIGFzc2lnbmluZyBjYWxsYmFja3MgdG8gY29tcG9uZW50cyB0aGF0IGFyZScsXG4gICAgICAgICAgICAnZ2VuZXJhdGVkIGJ5IG90aGVyIGNhbGxiYWNrcyAoYW5kIHRoZXJlZm9yZSBub3QgaW4gdGhlJyxcbiAgICAgICAgICAgICdpbml0aWFsIGxheW91dCksIHlvdSBjYW4gc3VwcHJlc3MgdGhpcyBleGNlcHRpb24gYnkgc2V0dGluZycsXG4gICAgICAgICAgICAnYHN1cHByZXNzX2NhbGxiYWNrX2V4Y2VwdGlvbnM9VHJ1ZWAuJyxcbiAgICAgICAgICAgIHRhaWwoY2FsbGJhY2tzKVxuICAgICAgICBdKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZVByb3AoaWQsIGlkUGF0aCwgcmF3UHJvcCwgY2xzLCBjYWxsYmFja3MpIHtcbiAgICAgICAgY29uc3QgcHJvcCA9IHJhd1Byb3Auc3BsaXQoJ0AnKVswXTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gcGF0aChpZFBhdGgsIGxheW91dCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBSZWdpc3RyeS5yZXNvbHZlKGNvbXBvbmVudCk7XG5cbiAgICAgICAgLy8gbm90ZTogRmxvdyBjb21wb25lbnRzIGRvIG5vdCBoYXZlIHByb3BUeXBlcywgc28gd2UgY2FuJ3QgdmFsaWRhdGUuXG4gICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQucHJvcFR5cGVzICYmICFlbGVtZW50LnByb3BUeXBlc1twcm9wXSkge1xuICAgICAgICAgICAgLy8gbG9vayBmb3Igd2lsZGNhcmQgcHJvcHMgKGllIGRhdGEtKiBldGMpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BOYW1lIGluIGVsZW1lbnQucHJvcFR5cGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdCA9IHByb3BOYW1lLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZS5jaGFyQXQobGFzdCkgPT09ICcqJyAmJlxuICAgICAgICAgICAgICAgICAgICBwcm9wLnN1YnN0cigwLCBsYXN0KSA9PT0gcHJvcE5hbWUuc3Vic3RyKDAsIGxhc3QpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7dHlwZSwgbmFtZXNwYWNlfSA9IGNvbXBvbmVudDtcbiAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0ludmFsaWQgcHJvcCBmb3IgdGhpcyBjb21wb25lbnQnLCBbXG4gICAgICAgICAgICAgICAgYFByb3BlcnR5IFwiJHtwcm9wfVwiIHdhcyB1c2VkIHdpdGggY29tcG9uZW50IElEOmAsXG4gICAgICAgICAgICAgICAgYCAgJHtKU09OLnN0cmluZ2lmeShpZCl9YCxcbiAgICAgICAgICAgICAgICBgaW4gb25lIG9mIHRoZSAke2Nsc30gaXRlbXMgb2YgYSBjYWxsYmFjay5gLFxuICAgICAgICAgICAgICAgIGBUaGlzIElEIGlzIGFzc2lnbmVkIHRvIGEgJHtuYW1lc3BhY2V9LiR7dHlwZX0gY29tcG9uZW50YCxcbiAgICAgICAgICAgICAgICAnaW4gdGhlIGxheW91dCwgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHByb3BlcnR5LicsXG4gICAgICAgICAgICAgICAgdGFpbChjYWxsYmFja3MpXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlSWRQYXR0ZXJuUHJvcChpZCwgcHJvcGVydHksIGNscywgY2FsbGJhY2tzKSB7XG4gICAgICAgIHJlc29sdmVEZXBzKCkocGF0aHMpKHtpZCwgcHJvcGVydHl9KS5mb3JFYWNoKGRlcCA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aWQ6IGlkUmVzb2x2ZWQsIHBhdGg6IGlkUGF0aH0gPSBkZXA7XG4gICAgICAgICAgICB2YWxpZGF0ZVByb3AoaWRSZXNvbHZlZCwgaWRQYXRoLCBwcm9wZXJ0eSwgY2xzLCBjYWxsYmFja3MpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBjYWxsYmFja0lkc0NoZWNrZWRGb3JTdGF0ZSA9IHt9O1xuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVTdGF0ZShjYWxsYmFjaykge1xuICAgICAgICBjb25zdCB7c3RhdGUsIG91dHB1dH0gPSBjYWxsYmFjaztcblxuICAgICAgICAvLyBlbnN1cmUgd2UgZG9uJ3QgY2hlY2sgdGhlIHNhbWUgY2FsbGJhY2sgZm9yIHN0YXRlIG11bHRpcGxlIHRpbWVzXG4gICAgICAgIGlmIChjYWxsYmFja0lkc0NoZWNrZWRGb3JTdGF0ZVtvdXRwdXRdKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2tJZHNDaGVja2VkRm9yU3RhdGVbb3V0cHV0XSA9IDE7XG5cbiAgICAgICAgY29uc3QgY2xzID0gJ1N0YXRlJztcblxuICAgICAgICBzdGF0ZS5mb3JFYWNoKCh7aWQsIHByb3BlcnR5fSkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZFBhdGggPSBnZXRQYXRoKHBhdGhzLCBpZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFpZFBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlSWRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nSWQoaWQsIGNscywgW2NhbGxiYWNrXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVByb3AoaWQsIGlkUGF0aCwgcHJvcGVydHksIGNscywgW2NhbGxiYWNrXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gT25seSB2YWxpZGF0ZSBwcm9wcyBmb3IgU3RhdGUgb2JqZWN0IGlkcyB0aGF0IHdlIGRvbid0IG5lZWQgdG9cbiAgICAgICAgICAgIC8vIHJlc29sdmUgdGhlbSB0byBzcGVjaWZpYyBpbnB1dHMgb3Igb3V0cHV0c1xuICAgICAgICAgICAgZWxzZSBpZiAoIWludGVyc2VjdGlvbihbTUFUQ0gsIEFMTFNNQUxMRVJdLCB2YWx1ZXMoaWQpKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZUlkUGF0dGVyblByb3AoaWQsIHByb3BlcnR5LCBjbHMsIFtjYWxsYmFja10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZU1hcChtYXAsIGNscywgZG9TdGF0ZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIG1hcCkge1xuICAgICAgICAgICAgY29uc3QgaWRQcm9wcyA9IG1hcFtpZF07XG4gICAgICAgICAgICBjb25zdCBpZFBhdGggPSBnZXRQYXRoKHBhdGhzLCBpZCk7XG4gICAgICAgICAgICBpZiAoIWlkUGF0aCkge1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZUlkcykge1xuICAgICAgICAgICAgICAgICAgICBtaXNzaW5nSWQoaWQsIGNscywgZmxhdHRlbih2YWx1ZXMoaWRQcm9wcykpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gaWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFja3MgPSBpZFByb3BzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVQcm9wKGlkLCBpZFBhdGgsIHByb3BlcnR5LCBjbHMsIGNhbGxiYWNrcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb1N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCB3b3VsZCBiZSByZWR1bmRhbnQgdG8gY2hlY2sgc3RhdGUgb24gYm90aCBpbnB1dHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBvdXRwdXRzIC0gc28gb25seSBzZXQgZG9TdGF0ZSBmb3Igb3V0cHV0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKHZhbGlkYXRlU3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFsaWRhdGVNYXAob3V0cHV0TWFwLCAnT3V0cHV0JywgdHJ1ZSk7XG4gICAgdmFsaWRhdGVNYXAoaW5wdXRNYXAsICdJbnB1dCcpO1xuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVQYXR0ZXJucyhwYXR0ZXJucywgY2xzLCBkb1N0YXRlKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5U3RyIGluIHBhdHRlcm5zKSB7XG4gICAgICAgICAgICBjb25zdCBrZXlQYXR0ZXJucyA9IHBhdHRlcm5zW2tleVN0cl07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGtleVBhdHRlcm5zKSB7XG4gICAgICAgICAgICAgICAga2V5UGF0dGVybnNbcHJvcGVydHldLmZvckVhY2goKHtrZXlzLCB2YWx1ZXMsIGNhbGxiYWNrc30pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSB6aXBPYmooa2V5cywgdmFsdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVJZFBhdHRlcm5Qcm9wKGlkLCBwcm9wZXJ0eSwgY2xzLCBjYWxsYmFja3MpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9TdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmZvckVhY2godmFsaWRhdGVTdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhbGlkYXRlUGF0dGVybnMob3V0cHV0UGF0dGVybnMsICdPdXRwdXQnLCB0cnVlKTtcbiAgICB2YWxpZGF0ZVBhdHRlcm5zKGlucHV0UGF0dGVybnMsICdJbnB1dCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUdyYXBocyhkZXBlbmRlbmNpZXMsIGRpc3BhdGNoRXJyb3IpIHtcbiAgICAvLyBtdWx0aUdyYXBoIGlzIGp1c3QgZm9yIGZpbmRpbmcgY2lyY3VsYXIgZGVwc1xuICAgIGNvbnN0IG11bHRpR3JhcGggPSBuZXcgRGVwR3JhcGgoKTtcblxuICAgIGNvbnN0IHdpbGRjYXJkUGxhY2Vob2xkZXJzID0ge307XG5cbiAgICBjb25zdCBmaXhJZHMgPSBtYXAoZXZvbHZlKHtpZDogcGFyc2VJZldpbGRjYXJkfSkpO1xuICAgIGNvbnN0IHBhcnNlZERlcGVuZGVuY2llcyA9IG1hcChkZXAgPT4ge1xuICAgICAgICBjb25zdCB7b3V0cHV0fSA9IGRlcDtcbiAgICAgICAgY29uc3Qgb3V0ID0gZXZvbHZlKHtpbnB1dHM6IGZpeElkcywgc3RhdGU6IGZpeElkc30sIGRlcCk7XG4gICAgICAgIG91dC5vdXRwdXRzID0gbWFwKFxuICAgICAgICAgICAgb3V0aSA9PiBhc3NvYygnb3V0JywgdHJ1ZSwgc3BsaXRJZEFuZFByb3Aob3V0aSkpLFxuICAgICAgICAgICAgaXNNdWx0aU91dHB1dFByb3Aob3V0cHV0KSA/IHBhcnNlTXVsdGlwbGVPdXRwdXRzKG91dHB1dCkgOiBbb3V0cHV0XVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH0sIGRlcGVuZGVuY2llcyk7XG5cbiAgICBsZXQgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICBjb25zdCB3cmFwcGVkREUgPSAobWVzc2FnZSwgbGluZXMpID0+IHtcbiAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICBkaXNwYXRjaEVycm9yKG1lc3NhZ2UsIGxpbmVzKTtcbiAgICB9O1xuICAgIHZhbGlkYXRlRGVwZW5kZW5jaWVzKHBhcnNlZERlcGVuZGVuY2llcywgd3JhcHBlZERFKTtcblxuICAgIC8qXG4gICAgICogRm9yIHJlZ3VsYXIgaWRzLCBvdXRwdXRNYXAgYW5kIGlucHV0TWFwIGFyZTpcbiAgICAgKiAgIHtbaWRdOiB7W3Byb3BdOiBbY2FsbGJhY2ssIC4uLl19fVxuICAgICAqIHdoZXJlIGNhbGxiYWNrcyBhcmUgdGhlIG1hdGNoaW5nIHNwZWNzIGZyb20gdGhlIG9yaWdpbmFsXG4gICAgICogZGVwZW5kZW5jaWVzUmVxdWVzdCwgYnV0IHdpdGggb3V0cHV0cyBwYXJzZWQgdG8gbG9vayBsaWtlIGlucHV0cyxcbiAgICAgKiBhbmQgYSBsaXN0IG1hdGNoS2V5cyBhZGRlZCBpZiB0aGUgb3V0cHV0cyBoYXZlIE1BVENIIHdpbGRjYXJkcy5cbiAgICAgKiBGb3Igb3V0cHV0TWFwIHRoZXJlIHNob3VsZCBvbmx5IGV2ZXIgYmUgb25lIGNhbGxiYWNrIHBlciBpZC9wcm9wXG4gICAgICogYnV0IGZvciBpbnB1dE1hcCB0aGVyZSBtYXkgYmUgbWFueS5cbiAgICAgKlxuICAgICAqIEZvciB3aWxkY2FyZCBpZHMsIG91dHB1dFBhdHRlcm5zIGFuZCBpbnB1dFBhdHRlcm5zIGFyZTpcbiAgICAgKiAgIHtcbiAgICAgKiAgICAgICBba2V5c3RyXToge1xuICAgICAqICAgICAgICAgICBbcHJvcF06IFtcbiAgICAgKiAgICAgICAgICAgICAgIHtrZXlzOiBbLi4uXSwgdmFsdWVzOiBbLi4uXSwgY2FsbGJhY2tzOiBbY2FsbGJhY2ssIC4uLl19LFxuICAgICAqICAgICAgICAgICAgICAgey4uLn1cbiAgICAgKiAgICAgICAgICAgXVxuICAgICAqICAgICAgIH1cbiAgICAgKiAgIH1cbiAgICAgKiBrZXlzdHIgaXMgYSBzdHJpbmdpZmllZCBvcmRlcmVkIGxpc3Qgb2Yga2V5cyBpbiB0aGUgaWRcbiAgICAgKiBrZXlzIGlzIHRoZSBzYW1lIG9yZGVyZWQgbGlzdCAoanVzdCBjb3BpZWQgZm9yIGNvbnZlbmllbmNlKVxuICAgICAqIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBleHBsaWNpdCBvciB3aWxkY2FyZCB2YWx1ZXMgZm9yIGVhY2gga2V5IGluIGtleXNcbiAgICAgKi9cbiAgICBjb25zdCBvdXRwdXRNYXAgPSB7fTtcbiAgICBjb25zdCBpbnB1dE1hcCA9IHt9O1xuICAgIGNvbnN0IG91dHB1dFBhdHRlcm5zID0ge307XG4gICAgY29uc3QgaW5wdXRQYXR0ZXJucyA9IHt9O1xuXG4gICAgY29uc3QgZmluYWxHcmFwaHMgPSB7XG4gICAgICAgIE11bHRpR3JhcGg6IG11bHRpR3JhcGgsXG4gICAgICAgIG91dHB1dE1hcCxcbiAgICAgICAgaW5wdXRNYXAsXG4gICAgICAgIG91dHB1dFBhdHRlcm5zLFxuICAgICAgICBpbnB1dFBhdHRlcm5zLFxuICAgICAgICBjYWxsYmFja3M6IHBhcnNlZERlcGVuZGVuY2llc1xuICAgIH07XG5cbiAgICBpZiAoaGFzRXJyb3IpIHtcbiAgICAgICAgLy8gbGVhdmUgdGhlIGdyYXBocyBlbXB0eSBpZiB3ZSBmb3VuZCBhbiBlcnJvciwgc28gd2UgZG9uJ3QgdHJ5IHRvXG4gICAgICAgIC8vIGV4ZWN1dGUgdGhlIGJyb2tlbiBjYWxsYmFja3MuXG4gICAgICAgIHJldHVybiBmaW5hbEdyYXBocztcbiAgICB9XG5cbiAgICBwYXJzZWREZXBlbmRlbmNpZXMuZm9yRWFjaChkZXBlbmRlbmN5ID0+IHtcbiAgICAgICAgY29uc3Qge291dHB1dHMsIGlucHV0c30gPSBkZXBlbmRlbmN5O1xuXG4gICAgICAgIG91dHB1dHMuY29uY2F0KGlucHV0cykuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtpZH0gPSBpdGVtO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBmb3JFYWNoT2JqSW5kZXhlZCgodmFsLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aWxkY2FyZFBsYWNlaG9sZGVyc1trZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWxkY2FyZFBsYWNlaG9sZGVyc1trZXldID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmQ6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5UGxhY2Vob2xkZXJzID0gd2lsZGNhcmRQbGFjZWhvbGRlcnNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCAmJiB2YWwud2lsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC5leHBhbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlQbGFjZWhvbGRlcnMuZXhwYW5kICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5UGxhY2Vob2xkZXJzLmV4YWN0LmluZGV4T2YodmFsKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleVBsYWNlaG9sZGVycy5leGFjdC5wdXNoKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZm9yRWFjaE9iakluZGV4ZWQoa2V5UGxhY2Vob2xkZXJzID0+IHtcbiAgICAgICAgY29uc3Qge2V4YWN0LCBleHBhbmR9ID0ga2V5UGxhY2Vob2xkZXJzO1xuICAgICAgICBjb25zdCB2YWxzID0gZXhhY3Quc2xpY2UoKS5zb3J0KGlkVmFsU29ydCk7XG4gICAgICAgIGlmIChleHBhbmQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwYW5kOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZXhhY3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHMuc3BsaWNlKDAsIDAsIFt2YWxCZWZvcmUodmFsc1swXSldKTtcbiAgICAgICAgICAgICAgICAgICAgdmFscy5wdXNoKHZhbEFmdGVyKHZhbHNbdmFscy5sZW5ndGggLSAxXSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHMucHVzaChpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIWV4YWN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gb25seSBNQVRDSC9BTEwgLSBzdGlsbCBuZWVkIGEgdmFsdWVcbiAgICAgICAgICAgIHZhbHMucHVzaCgwKTtcbiAgICAgICAgfVxuICAgICAgICBrZXlQbGFjZWhvbGRlcnMudmFscyA9IHZhbHM7XG4gICAgfSwgd2lsZGNhcmRQbGFjZWhvbGRlcnMpO1xuXG4gICAgZnVuY3Rpb24gbWFrZUFsbElkcyhpZFNwZWMsIG91dElkRmluYWwpIHtcbiAgICAgICAgbGV0IGlkTGlzdCA9IFt7fV07XG4gICAgICAgIGZvckVhY2hPYmpJbmRleGVkKCh2YWwsIGtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGVzdFZhbHMgPSB3aWxkY2FyZFBsYWNlaG9sZGVyc1trZXldLnZhbHM7XG4gICAgICAgICAgICBjb25zdCBvdXRWYWxJbmRleCA9IHRlc3RWYWxzLmluZGV4T2Yob3V0SWRGaW5hbFtrZXldKTtcbiAgICAgICAgICAgIGxldCBuZXdWYWxzID0gW3ZhbF07XG4gICAgICAgICAgICBpZiAodmFsICYmIHZhbC53aWxkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gQUxMU01BTExFUikge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3V0VmFsSW5kZXggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdWYWxzID0gdGVzdFZhbHMuc2xpY2UoMCwgb3V0VmFsSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc21hbGxlciBpdGVtcyAtIGRlbGV0ZSBhbGwgb3V0cHV0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1BVENIIG9yIEFMTFxuICAgICAgICAgICAgICAgICAgICAvLyBNQVRDSCAqaXMqIEFMTCBmb3Igb3V0cHV0cywgaWUgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGFcbiAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgc3BlY2lmaWVkIGluIGBvdXRJZEZpbmFsYFxuICAgICAgICAgICAgICAgICAgICBuZXdWYWxzID1cbiAgICAgICAgICAgICAgICAgICAgICAgIG91dFZhbEluZGV4ID09PSAtMSB8fCB2YWwgPT09IEFMTFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGVzdFZhbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFtvdXRJZEZpbmFsW2tleV1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJlcGxpY2F0ZXMgZXZlcnl0aGluZyBpbiBpZExpc3Qgb25jZSBmb3IgZWFjaCBpdGVtIGluXG4gICAgICAgICAgICAvLyBuZXdWYWxzLCBhdHRhY2hpbmcgZWFjaCB2YWx1ZSBhdCBrZXkuXG4gICAgICAgICAgICBpZExpc3QgPSBhcChhcChbYXNzb2Moa2V5KV0sIG5ld1ZhbHMpLCBpZExpc3QpO1xuICAgICAgICB9LCBpZFNwZWMpO1xuICAgICAgICByZXR1cm4gaWRMaXN0O1xuICAgIH1cblxuICAgIC8qIG11bHRpR3JhcGggaXMgdXNlZCBvbmx5IGZvciB0ZXN0aW5nIGNpcmN1bGFyaXR5XG4gICAgICpcbiAgICAgKiBFYWNoIGNvbXBvbmVudCtwcm9wZXJ0eSB0aGF0IGlzIHVzZWQgYXMgYW4gaW5wdXQgb3Igb3V0cHV0IGlzIGFkZGVkIGFzIGEgbm9kZVxuICAgICAqIHRvIGEgZGlyZWN0ZWQgZ3JhcGggd2l0aCBhIGRlcGVuZGVuY3kgZnJvbSBlYWNoIGlucHV0IHRvIGVhY2ggb3V0cHV0LiBUaGVcbiAgICAgKiBmdW5jdGlvbiB0cmlnZ2VyRGVmYXVsdFN0YXRlIGluIGluZGV4LmpzIHRoZW4gY2hlY2tzIHRoaXMgZ3JhcGggZm9yIGNpcmN1bGFyaXR5LlxuICAgICAqXG4gICAgICogSW4gb3JkZXIgdG8gYWxsb3cgdGhlIHNhbWUgY29tcG9uZW50K3Byb3BlcnR5IHRvIGJlIGJvdGggYW4gaW5wdXQgYW5kIG91dHB1dFxuICAgICAqIG9mIHRoZSBzYW1lIGNhbGxiYWNrLCBhIHR3byBwYXNzIGFwcHJvYWNoIGlzIHVzZWQuXG4gICAgICpcbiAgICAgKiBJbiB0aGUgZmlyc3QgcGFzcywgdGhlIGdyYXBoIGlzIGJ1aWx0IHVwIG5vcm1hbGx5IHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0XG4gICAgICogaW4gY2FzZXMgd2hlcmUgYW4gb3V0cHV0IGlzIGFsc28gYW4gaW5wdXQgdG8gdGhlIHNhbWUgY2FsbGJhY2sgYSBzcGVjaWFsXG4gICAgICogXCJvdXRwdXRcIiBub2RlIGlzIGFkZGVkIGFuZCB0aGUgZGVwZW5kZW5jaWVzIHRhcmdldCB0aGlzIG91dHB1dCBub2RlIGluc3RlYWQuXG4gICAgICogRm9yIGV4YW1wbGUsIGlmIGBzbGlkZXIudmFsdWVgIGlzIGJvdGggYW4gaW5wdXQgYW5kIGFuIG91dHB1dCwgdGhlbiB0aGUgYSBuZXdcbiAgICAgKiBub2RlIGBzbGlkZXIudmFsdWVfX291dHB1dGAgd2lsbCBiZSBhZGRlZCB3aXRoIGEgZGVwZW5kZW5jeSBmcm9tIGBzbGlkZXIudmFsdWVgXG4gICAgICogdG8gYHNsaWRlci52YWx1ZV9fb3V0cHV0YC4gU3BsaXR0aW5nIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGludG8gc2VwYXJhdGUgbm9kZXNcbiAgICAgKiByZW1vdmVzIHRoZSBjaXJjdWxhcml0eS5cbiAgICAgKlxuICAgICAqIEluIG9yZGVyIHRvIHN0aWxsIGRldGVjdCBvdGhlciBmb3JtcyBvZiBjaXJjdWxhcml0eSwgaXQgaXMgbmVjZXNzYXJ5IHRvIGRvIGFcbiAgICAgKiBzZWNvbmQgcGFzcyBhbmQgYWRkIHRoZSBuZXcgb3V0cHV0IG5vZGVzIGFzIGEgZGVwZW5kZW5jeSBpbiBhbnkgKm90aGVyKiBjYWxsYmFja3NcbiAgICAgKiB3aGVyZSB0aGUgb3JpZ2luYWwgbm9kZSB3YXMgYW4gaW5wdXQuIENvbnRpbnVpbmcgdGhlIGV4YW1wbGUsIGFueSBvdGhlciBjYWxsYmFja1xuICAgICAqIHRoYXQgaGFkIGBzbGlkZXIudmFsdWVgIGFzIGFuIGlucHV0IGRlcGVuZGVuY3kgYWxzbyBuZWVkcyB0byBoYXZlXG4gICAgICogYHNsaWRlci52YWx1ZV9fb3V0cHV0YCBhcyBhIGRlcGVuZGVuY3kuIFRvIG1ha2UgdGhpcyBlZmZpY2llbnQsIGFsbCB0aGUgaW5wdXRzXG4gICAgICogYW5kIG91dHB1dHMgZm9yIGVhY2ggY2FsbGJhY2sgYXJlIHN0b3JlZCBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuXG4gICAgICovXG5cbiAgICBjb25zdCBvdXRwdXRUYWcgPSAnX19vdXRwdXQnO1xuICAgIGNvbnN0IGR1cGxpY2F0ZU91dHB1dHMgPSBbXTtcbiAgICBjb25zdCBjYkluID0gW107XG4gICAgY29uc3QgY2JPdXQgPSBbXTtcblxuICAgIGZ1bmN0aW9uIGFkZElucHV0VG9NdWx0aShpbklkUHJvcCwgb3V0SWRQcm9wLCBmaXJzdFBhc3MgPSB0cnVlKSB7XG4gICAgICAgIG11bHRpR3JhcGguYWRkTm9kZShpbklkUHJvcCk7XG4gICAgICAgIG11bHRpR3JhcGguYWRkRGVwZW5kZW5jeShpbklkUHJvcCwgb3V0SWRQcm9wKTtcbiAgICAgICAgLy8gb25seSBzdG9yZSBjYWxsYmFjayBpbnB1dHMgYW5kIG91dHB1dHMgZHVyaW5nIHRoZSBmaXJzdCBwYXNzXG4gICAgICAgIGlmIChmaXJzdFBhc3MpIHtcbiAgICAgICAgICAgIGNiSW5bY2JJbi5sZW5ndGggLSAxXS5wdXNoKGluSWRQcm9wKTtcbiAgICAgICAgICAgIGNiT3V0W2NiT3V0Lmxlbmd0aCAtIDFdLnB1c2gob3V0SWRQcm9wKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlZERlcGVuZGVuY2llcy5mb3JFYWNoKGRlcGVuZGVuY3kgPT4ge1xuICAgICAgICBjb25zdCB7b3V0cHV0cywgaW5wdXRzfSA9IGRlcGVuZGVuY3k7XG5cbiAgICAgICAgLy8gbmV3IGNhbGxiYWNrLCBhZGQgYW4gZW1wdHkgYXJyYXkgZm9yIGl0cyBpbnB1dHMgYW5kIG91dHB1dHNcbiAgICAgICAgY2JJbi5wdXNoKFtdKTtcbiAgICAgICAgY2JPdXQucHVzaChbXSk7XG5cbiAgICAgICAgZnVuY3Rpb24gYWRkT3V0cHV0VG9NdWx0aShvdXRJZEZpbmFsLCBvdXRJZFByb3ApIHtcbiAgICAgICAgICAgIG11bHRpR3JhcGguYWRkTm9kZShvdXRJZFByb3ApO1xuICAgICAgICAgICAgaW5wdXRzLmZvckVhY2goaW5PYmogPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtpZDogaW5JZCwgcHJvcGVydHl9ID0gaW5PYmo7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbklkID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbklkTGlzdCA9IG1ha2VBbGxJZHMoaW5JZCwgb3V0SWRGaW5hbCk7XG4gICAgICAgICAgICAgICAgICAgIGluSWRMaXN0LmZvckVhY2goaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkSW5wdXRUb011bHRpKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVJZEFuZFByb3Aoe2lkLCBwcm9wZXJ0eX0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dElkUHJvcFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkSW5wdXRUb011bHRpKGNvbWJpbmVJZEFuZFByb3AoaW5PYmopLCBvdXRJZFByb3ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UnbGwgY29udGludWUgdG8gdXNlIGRlcC5vdXRwdXQgYXMgaXRzIGlkLCBidXQgYWRkIG91dHB1dHMgYXMgd2VsbFxuICAgICAgICAvLyBmb3IgY29udmVuaWVuY2UgYW5kIHN5bW1ldHJ5IHdpdGggdGhlIHN0cnVjdHVyZSBvZiBpbnB1dHMgYW5kIHN0YXRlLlxuICAgICAgICAvLyBBbHNvIGNvbGxlY3QgTUFUQ0gga2V5cyBpbiB0aGUgb3V0cHV0IChhbGwgb3V0cHV0cyBtdXN0IHNoYXJlIHRoZXNlKVxuICAgICAgICAvLyBhbmQgQUxMIGtleXMgaW4gdGhlIGZpcnN0IG91dHB1dCAobmVlZCBub3QgYmUgc2hhcmVkIGJ1dCB3ZSdsbCB1c2VcbiAgICAgICAgLy8gdGhlIGZpcnN0IG91dHB1dCBmb3IgY2FsY3VsYXRpb25zKSBmb3IgbGF0ZXIgY29udmVuaWVuY2UuXG4gICAgICAgIGNvbnN0IHttYXRjaEtleXN9ID0gZmluZFdpbGRjYXJkS2V5cyhvdXRwdXRzWzBdLmlkKTtcbiAgICAgICAgY29uc3QgZmlyc3RTaW5nbGVPdXRwdXQgPSBmaW5kSW5kZXgobyA9PiAhaXNNdWx0aVZhbHVlZChvLmlkKSwgb3V0cHV0cyk7XG4gICAgICAgIGNvbnN0IGZpbmFsRGVwZW5kZW5jeSA9IG1lcmdlUmlnaHQoXG4gICAgICAgICAgICB7bWF0Y2hLZXlzLCBmaXJzdFNpbmdsZU91dHB1dCwgb3V0cHV0c30sXG4gICAgICAgICAgICBkZXBlbmRlbmN5XG4gICAgICAgICk7XG5cbiAgICAgICAgb3V0cHV0cy5mb3JFYWNoKG91dElkUHJvcCA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aWQ6IG91dElkLCBwcm9wZXJ0eX0gPSBvdXRJZFByb3A7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGlzIG91dHB1dCBpcyBhbHNvIGFuIGlucHV0IHRvIHRoZSBzYW1lIGNhbGxiYWNrXG4gICAgICAgICAgICBjb25zdCBhbHNvSW5wdXQgPSBjaGVja0luT3V0T3ZlcmxhcChvdXRJZFByb3AsIGlucHV0cyk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG91dElkID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dElkTGlzdCA9IG1ha2VBbGxJZHMob3V0SWQsIHt9KTtcbiAgICAgICAgICAgICAgICBvdXRJZExpc3QuZm9yRWFjaChpZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBPdXRJZFByb3AgPSB7aWQsIHByb3BlcnR5fTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG91dElkTmFtZSA9IGNvbWJpbmVJZEFuZFByb3AodGVtcE91dElkUHJvcCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgb3V0cHV0IGlzIGFsc28gYW4gaW5wdXQsIGFkZCBgb3V0cHV0VGFnYCB0byB0aGUgbmFtZVxuICAgICAgICAgICAgICAgICAgICBpZiAoYWxzb0lucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVPdXRwdXRzLnB1c2godGVtcE91dElkUHJvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRJZE5hbWUgKz0gb3V0cHV0VGFnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dFRvTXVsdGkoaWQsIG91dElkTmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYWRkUGF0dGVybihvdXRwdXRQYXR0ZXJucywgb3V0SWQsIHByb3BlcnR5LCBmaW5hbERlcGVuZGVuY3kpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgb3V0SWROYW1lID0gY29tYmluZUlkQW5kUHJvcChvdXRJZFByb3ApO1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgb3V0cHV0IGlzIGFsc28gYW4gaW5wdXQsIGFkZCBgb3V0cHV0VGFnYCB0byB0aGUgbmFtZVxuICAgICAgICAgICAgICAgIGlmIChhbHNvSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlT3V0cHV0cy5wdXNoKG91dElkUHJvcCk7XG4gICAgICAgICAgICAgICAgICAgIG91dElkTmFtZSArPSBvdXRwdXRUYWc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFkZE91dHB1dFRvTXVsdGkoe30sIG91dElkTmFtZSk7XG4gICAgICAgICAgICAgICAgYWRkTWFwKG91dHB1dE1hcCwgb3V0SWQsIHByb3BlcnR5LCBmaW5hbERlcGVuZGVuY3kpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpbnB1dHMuZm9yRWFjaChpbnB1dE9iamVjdCA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aWQ6IGluSWQsIHByb3BlcnR5OiBpblByb3B9ID0gaW5wdXRPYmplY3Q7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGluSWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgYWRkUGF0dGVybihpbnB1dFBhdHRlcm5zLCBpbklkLCBpblByb3AsIGZpbmFsRGVwZW5kZW5jeSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFkZE1hcChpbnB1dE1hcCwgaW5JZCwgaW5Qcm9wLCBmaW5hbERlcGVuZGVuY3kpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIHNlY29uZCBwYXNzIGZvciBhZGRpbmcgbmV3IG91dHB1dCBub2RlcyBhcyBkZXBlbmRlbmNpZXMgd2hlcmUgbmVlZGVkXG4gICAgZHVwbGljYXRlT3V0cHV0cy5mb3JFYWNoKGR1cGVPdXRJZFByb3AgPT4ge1xuICAgICAgICBjb25zdCBvcmlnaW5hbE5hbWUgPSBjb21iaW5lSWRBbmRQcm9wKGR1cGVPdXRJZFByb3ApO1xuICAgICAgICBjb25zdCBuZXdOYW1lID0gb3JpZ2luYWxOYW1lLmNvbmNhdChvdXRwdXRUYWcpO1xuICAgICAgICBmb3IgKHZhciBjbnQgPSAwOyBjbnQgPCBjYkluLmxlbmd0aDsgY250KyspIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGlucHV0IHRvIHRoZSBjYWxsYmFja1xuICAgICAgICAgICAgaWYgKGNiSW5bY250XS5zb21lKGluTmFtZSA9PiBpbk5hbWUgPT09IG9yaWdpbmFsTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAvKiBtYWtlIHN1cmUgaXQncyBub3QgYWxzbyBhbiBvdXRwdXQgb2YgdGhlIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgICogKHRoaXMgd2lsbCBiZSB0aGUgb3JpZ2luYWwgY2FsbGJhY2spXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgaWYgKCFjYk91dFtjbnRdLnNvbWUob3V0TmFtZSA9PiBvdXROYW1lID09PSBuZXdOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBjYk91dFtjbnRdLmZvckVhY2gob3V0TmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJbnB1dFRvTXVsdGkobmV3TmFtZSwgb3V0TmFtZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmaW5hbEdyYXBocztcbn1cblxuZnVuY3Rpb24gZmluZFdpbGRjYXJkS2V5cyhpZCkge1xuICAgIGNvbnN0IG1hdGNoS2V5cyA9IFtdO1xuICAgIGNvbnN0IGFsbHNtYWxsZXJLZXlzID0gW107XG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yRWFjaE9iakluZGV4ZWQoKHZhbCwga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsID09PSBNQVRDSCkge1xuICAgICAgICAgICAgICAgIG1hdGNoS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbCA9PT0gQUxMU01BTExFUikge1xuICAgICAgICAgICAgICAgIGFsbHNtYWxsZXJLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgaWQpO1xuICAgICAgICBtYXRjaEtleXMuc29ydCgpO1xuICAgICAgICBhbGxzbWFsbGVyS2V5cy5zb3J0KCk7XG4gICAgfVxuICAgIHJldHVybiB7bWF0Y2hLZXlzLCBhbGxzbWFsbGVyS2V5c307XG59XG5cbi8qXG4gKiBEbyB0aGUgZ2l2ZW4gaWQgdmFsdWVzIGB2YWxzYCBtYXRjaCB0aGUgcGF0dGVybiBgcGF0dGVyblZhbHNgP1xuICogYGtleXNgLCBgcGF0dGVyblZhbHNgLCBhbmQgYHZhbHNgIGFyZSBhbGwgYXJyYXlzLCBhbmQgd2UgYWxyZWFkeSBrbm93IHRoYXRcbiAqIHdlJ3JlIG9ubHkgbG9va2luZyBhdCBpZHMgd2l0aCB0aGUgc2FtZSBrZXlzIGFzIHRoZSBwYXR0ZXJuLlxuICpcbiAqIE9wdGlvbmFsbHksIGluY2x1ZGUgYW5vdGhlciByZWZlcmVuY2Ugc2V0IG9mIHRoZSBzYW1lIC0gdG8gZW5zdXJlIHRoZVxuICogY29ycmVjdCBtYXRjaGluZyBvZiBNQVRDSCBvciBBTExTTUFMTEVSIGJldHdlZW4gaW5wdXQgYW5kIG91dHB1dCBpdGVtcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlkTWF0Y2goXG4gICAga2V5cyxcbiAgICB2YWxzLFxuICAgIHBhdHRlcm5WYWxzLFxuICAgIHJlZktleXMsXG4gICAgcmVmVmFscyxcbiAgICByZWZQYXR0ZXJuVmFsc1xuKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHZhbHNbaV07XG4gICAgICAgIGNvbnN0IHBhdHRlcm5WYWwgPSBwYXR0ZXJuVmFsc1tpXTtcbiAgICAgICAgaWYgKHBhdHRlcm5WYWwud2lsZCkge1xuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHNlY29uZCBpZCwgY29tcGFyZSB0aGUgd2lsZGNhcmQgdmFsdWVzLlxuICAgICAgICAgICAgLy8gV2l0aG91dCBhIHNlY29uZCBpZCwgYWxsIHdpbGRjYXJkcyBwYXNzIGF0IHRoaXMgc3RhZ2UuXG4gICAgICAgICAgICBpZiAocmVmS2V5cyAmJiBwYXR0ZXJuVmFsICE9PSBBTEwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZJbmRleCA9IHJlZktleXMuaW5kZXhPZihrZXlzW2ldKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZQYXR0ZXJuVmFsID0gcmVmUGF0dGVyblZhbHNbcmVmSW5kZXhdO1xuICAgICAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjay4gU2hvdWxkbid0IGV2ZXIgZmFpbCB0aGlzLCBpZiB0aGUgYmFjayBlbmRcbiAgICAgICAgICAgICAgICAvLyBkaWQgaXRzIGpvYiB2YWxpZGF0aW5nIGNhbGxiYWNrcy5cbiAgICAgICAgICAgICAgICAvLyBZb3UgY2FuJ3QgcmVzb2x2ZSBhbiBpbnB1dCBhZ2FpbnN0IGFuIGlucHV0LCBiZWNhdXNlXG4gICAgICAgICAgICAgICAgLy8gdHdvIEFMTFNNQUxMRVIncyB3b3VsZG4ndCBtYWtlIHNlbnNlIVxuICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuVmFsID09PSBBTExTTUFMTEVSICYmIHJlZlBhdHRlcm5WYWwgPT09IEFMTFNNQUxMRVIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2ludmFsaWQgd2lsZGNhcmQgaWQgcGFpcjogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuVmFscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmS2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmUGF0dGVyblZhbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlZhbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGlkVmFsU29ydCh2YWwsIHJlZlZhbHNbcmVmSW5kZXhdKSAhPT1cbiAgICAgICAgICAgICAgICAgICAgKHBhdHRlcm5WYWwgPT09IEFMTFNNQUxMRVJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcmVmUGF0dGVyblZhbCA9PT0gQUxMU01BTExFUlxuICAgICAgICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICAgICAgICA6IDApXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodmFsICE9PSBwYXR0ZXJuVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldEFueVZhbHMocGF0dGVyblZhbHMsIHZhbHMpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuVmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGF0dGVyblZhbHNbaV0gPT09IE1BVENIKSB7XG4gICAgICAgICAgICBtYXRjaGVzLnB1c2godmFsc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoZXMubGVuZ3RoID8gSlNPTi5zdHJpbmdpZnkobWF0Y2hlcykgOiAnJztcbn1cblxuLypcbiAqIERvZXMgdGhpcyBpdGVtIChpbnB1dCAvIG91dHB1dCAvIHN0YXRlKSBzdXBwb3J0IG11bHRpcGxlIHZhbHVlcz9cbiAqIHN0cmluZyBJRHMgZG8gbm90OyB3aWxkY2FyZCBJRHMgb25seSBkbyBpZiB0aGV5IGNvbnRhaW4gQUxMIG9yIEFMTFNNQUxMRVJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTXVsdGlWYWx1ZWQoe2lkfSkge1xuICAgIHJldHVybiB0eXBlb2YgaWQgPT09ICdvYmplY3QnICYmIGFueSh2ID0+IHYubXVsdGksIHZhbHVlcyhpZCkpO1xufVxuXG4vKlxuICogRm9yIGEgZ2l2ZW4gb3V0cHV0IGlkIGFuZCBwcm9wLCBmaW5kIHRoZSBjYWxsYmFjayBnZW5lcmF0aW5nIGl0LlxuICogSWYgbm8gY2FsbGJhY2sgaXMgZm91bmQsIHJldHVybnMgZmFsc2UuXG4gKiBJZiBvbmUgaXMgZm91bmQsIHJldHVybnM6XG4gKiB7XG4gKiAgICAgY2FsbGJhY2s6IHRoZSBjYWxsYmFjayBzcGVjIHtvdXRwdXRzLCBpbnB1dHMsIHN0YXRlIGV0Y31cbiAqICAgICBhbnlWYWxzOiBzdHJpbmdpZmllZCBsaXN0IG9mIHJlc29sdmVkIE1BVENIIGtleXMgd2UgbWF0Y2hlZFxuICogICAgIHJlc29sdmVkSWQ6IHRoZSBcIm91dHB1dHNcIiBpZCBzdHJpbmcgcGx1cyBNQVRDSCB2YWx1ZXMgd2UgbWF0Y2hlZFxuICogICAgIGdldE91dHB1dHM6IGFjY2Vzc29yIGZ1bmN0aW9uIHRvIGdpdmUgYWxsIHJlc29sdmVkIG91dHB1dHMgb2YgdGhpc1xuICogICAgICAgICBjYWxsYmFjay4gVGFrZXMgYHBhdGhzYCBhcyBhcmd1bWVudCB0byBhcHBseSB3aGVuIHRoZSBjYWxsYmFjayBpc1xuICogICAgICAgICBkaXNwYXRjaGVkLCBpbiBjYXNlIGEgcHJldmlvdXMgY2FsbGJhY2sgaGFzIGFsdGVyZWQgdGhlIGxheW91dC5cbiAqICAgICAgICAgVGhlIHJlc3VsdCBpcyBhIGxpc3Qgb2Yge2lkIChzdHJpbmcgb3Igb2JqZWN0KSwgcHJvcGVydHkgKHN0cmluZyl9XG4gKiAgICAgZ2V0SW5wdXRzOiBzYW1lIGZvciBpbnB1dHNcbiAqICAgICBnZXRTdGF0ZTogc2FtZSBmb3Igc3RhdGVcbiAqICAgICBjaGFuZ2VkUHJvcElkczogYW4gb2JqZWN0IG9mIHtbaWRBbmRQcm9wXTogdn0gdHJpZ2dlcmluZyB0aGlzIGNhbGxiYWNrXG4gKiAgICAgICAgIHYgPSBESVJFQ1QgKDIpOiB0aGUgcHJvcCB3YXMgY2hhbmdlZCBpbiB0aGUgZnJvbnQgZW5kLCBzbyBkZXBlbmRlbnRcbiAqICAgICAgICAgICAgIGNhbGxiYWNrcyAqTVVTVCogYmUgZXhlY3V0ZWQuXG4gKiAgICAgICAgIHYgPSBJTkRJUkVDVCAoMSk6IHRoZSBwcm9wIGlzIGV4cGVjdGVkIHRvIGJlIGNoYW5nZWQgYnkgYSBjYWxsYmFjayxcbiAqICAgICAgICAgICAgIGJ1dCBpZiB0aGlzIGlzIHByZXZlbnRlZCwgZGVwZW5kZW50IGNhbGxiYWNrcyBtYXkgYmUgcHJ1bmVkLlxuICogICAgIGluaXRpYWxDYWxsOiBib29sZWFuLCBpZiB0cnVlIHdlIGRvbid0IHJlcXVpcmUgYW55IGNoYW5nZWRQcm9wSWRzXG4gKiAgICAgICAgIHRvIGtlZXAgdGhpcyBjYWxsYmFjayBhcm91bmQsIGFzIGl0J3MgdGhlIGluaXRpYWwgY2FsbCB0byBwb3B1bGF0ZVxuICogICAgICAgICB0aGlzIHZhbHVlIG9uIHBhZ2UgbG9hZCBvciBjaGFuZ2luZyBwYXJ0IG9mIHRoZSBsYXlvdXQuXG4gKiAgICAgICAgIEJ5IGRlZmF1bHQgdGhpcyBpcyB0cnVlIGZvciBjYWxsYmFja3MgZ2VuZXJhdGVkIGJ5XG4gKiAgICAgICAgIGdldENhbGxiYWNrQnlPdXRwdXQsIGZhbHNlIGZyb20gZ2V0Q2FsbGJhY2tzQnlJbnB1dC5cbiAqIH1cbiAqL1xuZnVuY3Rpb24gZ2V0Q2FsbGJhY2tCeU91dHB1dChncmFwaHMsIHBhdGhzLCBpZCwgcHJvcCkge1xuICAgIGxldCByZXNvbHZlO1xuICAgIGxldCBjYWxsYmFjaztcbiAgICBsZXQgYW55VmFscyA9ICcnO1xuICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIHN0YW5kYXJkIGlkIHZlcnNpb25cbiAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gKGdyYXBocy5vdXRwdXRNYXBbaWRdIHx8IHt9KVtwcm9wXTtcbiAgICAgICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFja3NbMF07XG4gICAgICAgICAgICByZXNvbHZlID0gcmVzb2x2ZURlcHMoKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHdpbGRjYXJkIHZlcnNpb25cbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGlkKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IHZhbHMgPSBwcm9wcyhrZXlzLCBpZCk7XG4gICAgICAgIGNvbnN0IGtleVN0ciA9IGtleXMuam9pbignLCcpO1xuICAgICAgICBjb25zdCBwYXR0ZXJucyA9IChncmFwaHMub3V0cHV0UGF0dGVybnNba2V5U3RyXSB8fCB7fSlbcHJvcF07XG4gICAgICAgIGlmIChwYXR0ZXJucykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdHRlcm5WYWxzID0gcGF0dGVybnNbaV0udmFsdWVzO1xuICAgICAgICAgICAgICAgIGlmIChpZE1hdGNoKGtleXMsIHZhbHMsIHBhdHRlcm5WYWxzKSkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHBhdHRlcm5zW2ldLmNhbGxiYWNrc1swXTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSA9IHJlc29sdmVEZXBzKGtleXMsIHZhbHMsIHBhdHRlcm5WYWxzKTtcbiAgICAgICAgICAgICAgICAgICAgYW55VmFscyA9IGdldEFueVZhbHMocGF0dGVyblZhbHMsIHZhbHMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFyZXNvbHZlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZVJlc29sdmVkQ2FsbGJhY2soY2FsbGJhY2ssIHJlc29sdmUsIGFueVZhbHMpO1xufVxuXG5mdW5jdGlvbiBhZGRSZXNvbHZlZEZyb21PdXRwdXRzKGNhbGxiYWNrLCBvdXRQYXR0ZXJuLCBvdXRzLCBtYXRjaGVzKSB7XG4gICAgY29uc3Qgb3V0MEtleXMgPSBPYmplY3Qua2V5cyhvdXRQYXR0ZXJuLmlkKS5zb3J0KCk7XG4gICAgY29uc3Qgb3V0MFBhdHRlcm5WYWxzID0gcHJvcHMob3V0MEtleXMsIG91dFBhdHRlcm4uaWQpO1xuICAgIGNvbnN0IGZvdW5kQ2JJZHMgPSB7fTtcbiAgICBvdXRzLmZvckVhY2goKHtpZDogb3V0SWR9KSA9PiB7XG4gICAgICAgIGNvbnN0IG91dFZhbHMgPSBwcm9wcyhvdXQwS2V5cywgb3V0SWQpO1xuICAgICAgICBjb25zdCByZXNvbHZlZCA9IG1ha2VSZXNvbHZlZENhbGxiYWNrKFxuICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICByZXNvbHZlRGVwcyhvdXQwS2V5cywgb3V0VmFscywgb3V0MFBhdHRlcm5WYWxzKSxcbiAgICAgICAgICAgIGdldEFueVZhbHMob3V0MFBhdHRlcm5WYWxzLCBvdXRWYWxzKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCB7cmVzb2x2ZWRJZH0gPSByZXNvbHZlZDtcbiAgICAgICAgaWYgKCFmb3VuZENiSWRzW3Jlc29sdmVkSWRdKSB7XG4gICAgICAgICAgICBtYXRjaGVzLnB1c2gocmVzb2x2ZWQpO1xuICAgICAgICAgICAgZm91bmRDYklkc1tyZXNvbHZlZElkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEFsbFJlc29sdmVkRnJvbU91dHB1dHMocmVzb2x2ZSwgcGF0aHMsIG1hdGNoZXMpIHtcbiAgICByZXR1cm4gY2FsbGJhY2sgPT4ge1xuICAgICAgICBjb25zdCB7bWF0Y2hLZXlzLCBmaXJzdFNpbmdsZU91dHB1dCwgb3V0cHV0c30gPSBjYWxsYmFjaztcbiAgICAgICAgaWYgKG1hdGNoS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNpbmdsZU91dFBhdHRlcm4gPSBvdXRwdXRzW2ZpcnN0U2luZ2xlT3V0cHV0XTtcbiAgICAgICAgICAgIGlmIChzaW5nbGVPdXRQYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgYWRkUmVzb2x2ZWRGcm9tT3V0cHV0cyhcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgICAgIHNpbmdsZU91dFBhdHRlcm4sXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocGF0aHMpKHNpbmdsZU91dFBhdHRlcm4pLFxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgKiBJZiBldmVyeSBvdXRwdXQgaGFzIEFMTCB3ZSBuZWVkIHRvIHJlZHVjZSByZXNvbHZlZCBzZXRcbiAgICAgICAgICAgICAgICAgKiB0byBvbmUgaXRlbSBwZXIgY29tYmluYXRpb24gb2YgTUFUQ0ggdmFsdWVzLlxuICAgICAgICAgICAgICAgICAqIFRoYXQgd2lsbCBnaXZlIG9uZSByZXN1bHQgcGVyIGNhbGxiYWNrIGludm9jYXRpb24uXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY29uc3QgYW55U2VlbiA9IHt9O1xuICAgICAgICAgICAgICAgIG91dHB1dHMuZm9yRWFjaChvdXRQYXR0ZXJuID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0U2V0ID0gcmVzb2x2ZShwYXRocykob3V0UGF0dGVybikuZmlsdGVyKGkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hTdHIgPSBKU09OLnN0cmluZ2lmeShwcm9wcyhtYXRjaEtleXMsIGkuaWQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYW55U2VlblttYXRjaFN0cl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnlTZWVuW21hdGNoU3RyXSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBhZGRSZXNvbHZlZEZyb21PdXRwdXRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRQYXR0ZXJuLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0U2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlc1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY2IgPSBtYWtlUmVzb2x2ZWRDYWxsYmFjayhjYWxsYmFjaywgcmVzb2x2ZSwgJycpO1xuICAgICAgICAgICAgaWYgKGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhwYXRocykpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChjYik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vKlxuICogRm9yIGEgZ2l2ZW4gaWQgYW5kIHByb3AgZmluZCBhbGwgY2FsbGJhY2tzIGl0J3MgYW4gaW5wdXQgb2YuXG4gKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBvYmplY3RzOlxuICogICB7Y2FsbGJhY2ssIHJlc29sdmVkSWQsIGdldE91dHB1dHMsIGdldElucHV0cywgZ2V0U3RhdGV9XG4gKiAgIFNlZSBnZXRDYWxsYmFja0J5T3V0cHV0IGZvciBkZXRhaWxzLlxuICpcbiAqIE5vdGUgdGhhdCBpZiB0aGUgb3JpZ2luYWwgaW5wdXQgY29udGFpbnMgYW4gQUxMU01BTExFUiB3aWxkY2FyZCxcbiAqIHRoZXJlIG1heSBiZSBtYW55IGVudHJpZXMgZm9yIHRoZSBzYW1lIGNhbGxiYWNrLCBidXQgYW55IGdpdmVuIG91dHB1dFxuICogKHdpdGggYW4gTUFUQ0ggY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQncyBBTExTTUFMTEVSKSB3aWxsIG9ubHkgYXBwZWFyXG4gKiBpbiBvbmUgZW50cnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXYXRjaGVkS2V5cyhpZCwgbmV3UHJvcHMsIGdyYXBocykge1xuICAgIGlmICghKGlkICYmIGdyYXBocyAmJiBuZXdQcm9wcy5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBpbnB1dHMgPSBncmFwaHMuaW5wdXRNYXBbaWRdO1xuICAgICAgICByZXR1cm4gaW5wdXRzID8gbmV3UHJvcHMuZmlsdGVyKG5ld1Byb3AgPT4gaW5wdXRzW25ld1Byb3BdKSA6IFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpZCkuc29ydCgpO1xuICAgIGNvbnN0IHZhbHMgPSBwcm9wcyhrZXlzLCBpZCk7XG4gICAgY29uc3Qga2V5U3RyID0ga2V5cy5qb2luKCcsJyk7XG4gICAgY29uc3Qga2V5UGF0dGVybnMgPSBncmFwaHMuaW5wdXRQYXR0ZXJuc1trZXlTdHJdO1xuICAgIGlmICgha2V5UGF0dGVybnMpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gbmV3UHJvcHMuZmlsdGVyKHByb3AgPT4ge1xuICAgICAgICBjb25zdCBwYXR0ZXJucyA9IGtleVBhdHRlcm5zW3Byb3BdO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgcGF0dGVybnMgJiZcbiAgICAgICAgICAgIHBhdHRlcm5zLnNvbWUocGF0dGVybiA9PiBpZE1hdGNoKGtleXMsIHZhbHMsIHBhdHRlcm4udmFsdWVzKSlcbiAgICAgICAgKTtcbiAgICB9KTtcbn1cblxuLypcbiAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIGNhbGxiYWNrcyByZWZlcmVuY2luZyBhIGNodW5rIG9mIHRoZSBsYXlvdXQsXG4gKiBlaXRoZXIgYXMgaW5wdXRzIG9yIG91dHB1dHMuXG4gKlxuICogb3B0cy5vdXRwdXRzT25seTogYm9vbGVhbiwgc2V0IHRydWUgd2hlbiBjcmF3bGluZyB0aGUgKndob2xlKiBsYXlvdXQsXG4gKiAgIGJlY2F1c2Ugb3V0cHV0cyBhcmUgZW5vdWdoIHRvIGdldCBldmVyeXRoaW5nLlxuICogb3B0cy5yZW1vdmVkQXJyYXlJbnB1dHNPbmx5OiBib29sZWFuLCBzZXQgdHJ1ZSB0byBvbmx5IGxvb2sgZm9yIGlucHV0cyBpblxuICogICB3aWxkY2FyZCBhcnJheXMgKEFMTCBvciBBTExTTUFMTEVSKSwgbm8gb3V0cHV0cy4gVGhpcyBnZXRzIHVzZWQgdG8gdGVsbFxuICogICB3aGVuIHRoZSBuZXcgKmFic2VuY2UqIG9mIGEgZ2l2ZW4gY29tcG9uZW50IHNob3VsZCB0cmlnZ2VyIGEgY2FsbGJhY2suXG4gKiBvcHRzLm5ld1BhdGhzOiBwYXRocyBvYmplY3QgYWZ0ZXIgdGhlIGVkaXQgLSB0byBiZSB1c2VkIHdpdGhcbiAqICAgcmVtb3ZlZEFycmF5SW5wdXRzT25seSB0byBkZXRlcm1pbmUgaWYgdGhlIGNhbGxiYWNrIHN0aWxsIGhhcyBpdHMgb3V0cHV0c1xuICogb3B0cy5jaHVua1BhdGg6IHBhdGggdG8gdGhlIG5ldyBjaHVuayAtIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFueSBvdXRwdXRzIGFyZVxuICogICBvdXRzaWRlIG9mIHRoaXMgY2h1bmssIGJlY2F1c2UgdGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgaW5wdXRzIGluc2lkZSB0aGVcbiAqICAgY2h1bmsgY291bnQgYXMgaGF2aW5nIGNoYW5nZWRcbiAqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIG9iamVjdHM6XG4gKiAgIHtjYWxsYmFjaywgcmVzb2x2ZWRJZCwgZ2V0T3V0cHV0cywgZ2V0SW5wdXRzLCBnZXRTdGF0ZSwgLi4uZXRjfVxuICogICBTZWUgZ2V0Q2FsbGJhY2tCeU91dHB1dCBmb3IgZGV0YWlscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVuZmlsdGVyZWRMYXlvdXRDYWxsYmFja3MoZ3JhcGhzLCBwYXRocywgbGF5b3V0Q2h1bmssIG9wdHMpIHtcbiAgICBjb25zdCB7b3V0cHV0c09ubHksIHJlbW92ZWRBcnJheUlucHV0c09ubHksIG5ld1BhdGhzLCBjaHVua1BhdGh9ID0gb3B0cztcbiAgICBjb25zdCBmb3VuZENiSWRzID0ge307XG4gICAgY29uc3QgY2FsbGJhY2tzID0gW107XG5cbiAgICBmdW5jdGlvbiBhZGRDYWxsYmFjayhjYWxsYmFjaykge1xuICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kSW5kZXggPSBmb3VuZENiSWRzW2NhbGxiYWNrLnJlc29sdmVkSWRdO1xuICAgICAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kQ2IgPSBjYWxsYmFja3NbZm91bmRJbmRleF07XG4gICAgICAgICAgICAgICAgZm91bmRDYi5jaGFuZ2VkUHJvcElkcyA9IG1lcmdlTWF4KFxuICAgICAgICAgICAgICAgICAgICBmb3VuZENiLmNoYW5nZWRQcm9wSWRzLFxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jaGFuZ2VkUHJvcElkc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrLmluaXRpYWxDYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kQ2IuaW5pdGlhbENhbGwgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm91bmRDYklkc1tjYWxsYmFjay5yZXNvbHZlZElkXSA9IGNhbGxiYWNrcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkQ2FsbGJhY2tJZkFycmF5KGlkU3RyKSB7XG4gICAgICAgIHJldHVybiBjYiA9PlxuICAgICAgICAgICAgY2IuZ2V0SW5wdXRzKHBhdGhzKS5zb21lKGluaSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGluaSkgJiZcbiAgICAgICAgICAgICAgICAgICAgaW5pLnNvbWUoaW5paiA9PiBzdHJpbmdpZnlJZChpbmlqLmlkKSA9PT0gaWRTdHIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FsbGJhY2sgc2hvdWxkIHRyaWdnZXIgZXZlbiB3aXRoIG5vIGNoYW5nZWRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIHByb3BzIHRoYXQgY2hhbmdlZCBubyBsb25nZXIgZXhpc3QuXG4gICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGtpbmQgb2YgYWJ1c2luZyB0aGUgYGluaXRpYWxDYWxsYCBmbGFnIGhlcmUsIGl0J3NcbiAgICAgICAgICAgICAgICAgICAgLy8gbW9yZSBsaWtlIGEgXCJmaW5hbCBjYWxsXCIgZm9yIHRoZSByZW1vdmVkIGlucHV0cywgYnV0XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY2FzZSBpcyBub3Qgc3ViamVjdCB0byBgcHJldmVudF9pbml0aWFsX2NhbGxgLlxuICAgICAgICAgICAgICAgICAgICBpZiAoZmxhdHRlbihjYi5nZXRPdXRwdXRzKG5ld1BhdGhzKSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYi5pbml0aWFsQ2FsbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYi5jaGFuZ2VkUHJvcElkcyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ2FsbGJhY2soY2IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVPbmVJZChpZCwgb3V0SWRDYWxsYmFja3MsIGluSWRDYWxsYmFja3MpIHtcbiAgICAgICAgaWYgKG91dElkQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIG91dElkQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2IgPSBnZXRDYWxsYmFja0J5T3V0cHV0KGdyYXBocywgcGF0aHMsIGlkLCBwcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrcyBmb3VuZCBpbiB0aGUgbGF5b3V0IGJ5IG91dHB1dCBzaG91bGQgYWx3YXlzIHJ1blxuICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3Mgc3BlY2lmaWNhbGx5IHJlcXVlc3RlZCBub3QgdG8uXG4gICAgICAgICAgICAgICAgICAgIC8vIGllIHRoaXMgaXMgdGhlIGluaXRpYWwgY2FsbCBvZiB0aGlzIGNhbGxiYWNrIGV2ZW4gaWYgaXQnc1xuICAgICAgICAgICAgICAgICAgICAvLyBub3QgdGhlIHBhZ2UgaW5pdGlhbGl6YXRpb24gYnV0IGp1c3QgYSBuZXcgbGF5b3V0IGNodW5rXG4gICAgICAgICAgICAgICAgICAgIGlmICghY2IuY2FsbGJhY2sucHJldmVudF9pbml0aWFsX2NhbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiLmluaXRpYWxDYWxsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZENhbGxiYWNrKGNiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW91dHB1dHNPbmx5ICYmIGluSWRDYWxsYmFja3MpIHtcbiAgICAgICAgICAgIGNvbnN0IG1heWJlQWRkQ2FsbGJhY2sgPSByZW1vdmVkQXJyYXlJbnB1dHNPbmx5XG4gICAgICAgICAgICAgICAgPyBhZGRDYWxsYmFja0lmQXJyYXkoc3RyaW5naWZ5SWQoaWQpKVxuICAgICAgICAgICAgICAgIDogYWRkQ2FsbGJhY2s7XG4gICAgICAgICAgICBsZXQgaGFuZGxlVGhpc0NhbGxiYWNrID0gbWF5YmVBZGRDYWxsYmFjaztcbiAgICAgICAgICAgIGlmIChjaHVua1BhdGgpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVUaGlzQ2FsbGJhY2sgPSBjYiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICFhbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRzV2l0aChjaHVua1BhdGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWNrKCdwYXRoJywgZmxhdHRlbihjYi5nZXRPdXRwdXRzKHBhdGhzKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF5YmVBZGRDYWxsYmFjayhjYik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBpbklkQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgZ2V0Q2FsbGJhY2tzQnlJbnB1dChcbiAgICAgICAgICAgICAgICAgICAgZ3JhcGhzLFxuICAgICAgICAgICAgICAgICAgICBwYXRocyxcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgICAgICAgICBJTkRJUkVDVFxuICAgICAgICAgICAgICAgICkuZm9yRWFjaChoYW5kbGVUaGlzQ2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3Jhd2xMYXlvdXQobGF5b3V0Q2h1bmssIGNoaWxkID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBwYXRoKFsncHJvcHMnLCAnaWQnXSwgY2hpbGQpO1xuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnICYmICFyZW1vdmVkQXJyYXlJbnB1dHNPbmx5KSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlT25lSWQoaWQsIGdyYXBocy5vdXRwdXRNYXBbaWRdLCBncmFwaHMuaW5wdXRNYXBbaWRdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5U3RyID0gT2JqZWN0LmtleXMoaWQpLnNvcnQoKS5qb2luKCcsJyk7XG4gICAgICAgICAgICAgICAgaGFuZGxlT25lSWQoXG4gICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICAhcmVtb3ZlZEFycmF5SW5wdXRzT25seSAmJiBncmFwaHMub3V0cHV0UGF0dGVybnNba2V5U3RyXSxcbiAgICAgICAgICAgICAgICAgICAgZ3JhcGhzLmlucHV0UGF0dGVybnNba2V5U3RyXVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBtYXAoXG4gICAgICAgIGNiID0+ICh7XG4gICAgICAgICAgICAuLi5jYixcbiAgICAgICAgICAgIHByaW9yaXR5OiBnZXRQcmlvcml0eShncmFwaHMsIHBhdGhzLCBjYilcbiAgICAgICAgfSksXG4gICAgICAgIGNhbGxiYWNrc1xuICAgICk7XG59XG4iLCJpbXBvcnQge29uY2V9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7Y3JlYXRlQWN0aW9ufSBmcm9tICdyZWR1eC1hY3Rpb25zJztcbmltcG9ydCB7YWRkUmVxdWVzdGVkQ2FsbGJhY2tzfSBmcm9tICcuL2NhbGxiYWNrcyc7XG5pbXBvcnQge2dldEFwcFN0YXRlfSBmcm9tICcuLi9yZWR1Y2Vycy9jb25zdGFudHMnO1xuaW1wb3J0IHtnZXRBY3Rpb259IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBjb29raWUgZnJvbSAnY29va2llJztcbmltcG9ydCB7dmFsaWRhdGVDYWxsYmFja3NUb0xheW91dH0gZnJvbSAnLi9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHtpbmNsdWRlT2JzZXJ2ZXJzLCBnZXRMYXlvdXRDYWxsYmFja3N9IGZyb20gJy4vZGVwZW5kZW5jaWVzX3RzJztcbmltcG9ydCB7Z2V0UGF0aH0gZnJvbSAnLi9wYXRocyc7XG5cbmV4cG9ydCBjb25zdCBvbkVycm9yID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignT05fRVJST1InKSk7XG5leHBvcnQgY29uc3Qgc2V0QXBwTGlmZWN5Y2xlID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignU0VUX0FQUF9MSUZFQ1lDTEUnKSk7XG5leHBvcnQgY29uc3Qgc2V0Q29uZmlnID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignU0VUX0NPTkZJRycpKTtcbmV4cG9ydCBjb25zdCBhZGRIdHRwSGVhZGVycyA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ0FERF9IVFRQX0hFQURFUlMnKSk7XG5leHBvcnQgY29uc3Qgc2V0R3JhcGhzID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignU0VUX0dSQVBIUycpKTtcbmV4cG9ydCBjb25zdCBzZXRIb29rcyA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ1NFVF9IT09LUycpKTtcbmV4cG9ydCBjb25zdCBzZXRMYXlvdXQgPSBjcmVhdGVBY3Rpb24oZ2V0QWN0aW9uKCdTRVRfTEFZT1VUJykpO1xuZXhwb3J0IGNvbnN0IHNldFBhdGhzID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignU0VUX1BBVEhTJykpO1xuZXhwb3J0IGNvbnN0IHNldFJlcXVlc3RRdWV1ZSA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ1NFVF9SRVFVRVNUX1FVRVVFJykpO1xuZXhwb3J0IGNvbnN0IHVwZGF0ZVByb3BzID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignT05fUFJPUF9DSEFOR0UnKSk7XG5cbmV4cG9ydCBjb25zdCBkaXNwYXRjaEVycm9yID0gZGlzcGF0Y2ggPT4gKG1lc3NhZ2UsIGxpbmVzKSA9PlxuICAgIGRpc3BhdGNoKFxuICAgICAgICBvbkVycm9yKHtcbiAgICAgICAgICAgIHR5cGU6ICdiYWNrRW5kJyxcbiAgICAgICAgICAgIGVycm9yOiB7bWVzc2FnZSwgaHRtbDogbGluZXMuam9pbignXFxuJyl9XG4gICAgICAgIH0pXG4gICAgKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGh5ZHJhdGVJbml0aWFsT3V0cHV0cygpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGRpc3BhdGNoLCBnZXRTdGF0ZSkge1xuICAgICAgICB2YWxpZGF0ZUNhbGxiYWNrc1RvTGF5b3V0KGdldFN0YXRlKCksIGRpc3BhdGNoRXJyb3IoZGlzcGF0Y2gpKTtcbiAgICAgICAgdHJpZ2dlckRlZmF1bHRTdGF0ZShkaXNwYXRjaCwgZ2V0U3RhdGUpO1xuICAgICAgICBkaXNwYXRjaChzZXRBcHBMaWZlY3ljbGUoZ2V0QXBwU3RhdGUoJ0hZRFJBVEVEJykpKTtcbiAgICB9O1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAqL1xuY29uc3QgbG9nV2FybmluZ09uY2UgPSBvbmNlKGNvbnNvbGUud2Fybik7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDU1JGSGVhZGVyKCkge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnWC1DU1JGVG9rZW4nOiBjb29raWUucGFyc2UoZG9jdW1lbnQuY29va2llKS5fY3NyZl90b2tlblxuICAgICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nV2FybmluZ09uY2UoZSk7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHRyaWdnZXJEZWZhdWx0U3RhdGUoZGlzcGF0Y2gsIGdldFN0YXRlKSB7XG4gICAgY29uc3Qge2dyYXBocywgcGF0aHMsIGxheW91dH0gPSBnZXRTdGF0ZSgpO1xuXG4gICAgLy8gb3ZlcmFsbE9yZGVyIHdpbGwgYXNzZXJ0IGNpcmN1bGFyIGRlcGVuZGVuY2llcyBmb3IgbXVsdGkgb3V0cHV0LlxuICAgIHRyeSB7XG4gICAgICAgIGdyYXBocy5NdWx0aUdyYXBoLm92ZXJhbGxPcmRlcigpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgIG9uRXJyb3Ioe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdiYWNrRW5kJyxcbiAgICAgICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQ2lyY3VsYXIgRGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICAgICAgICAgICAgaHRtbDogZXJyLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGRpc3BhdGNoKFxuICAgICAgICBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MoXG4gICAgICAgICAgICBnZXRMYXlvdXRDYWxsYmFja3MoZ3JhcGhzLCBwYXRocywgbGF5b3V0LCB7XG4gICAgICAgICAgICAgICAgb3V0cHV0c09ubHk6IHRydWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICApO1xufVxuXG5leHBvcnQgY29uc3QgcmVkbyA9IG1vdmVIaXN0b3J5KCdSRURPJyk7XG5leHBvcnQgY29uc3QgdW5kbyA9IG1vdmVIaXN0b3J5KCdVTkRPJyk7XG5leHBvcnQgY29uc3QgcmV2ZXJ0ID0gbW92ZUhpc3RvcnkoJ1JFVkVSVCcpO1xuXG5mdW5jdGlvbiBtb3ZlSGlzdG9yeShjaGFuZ2VUeXBlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkaXNwYXRjaCwgZ2V0U3RhdGUpIHtcbiAgICAgICAgY29uc3Qge2hpc3RvcnksIHBhdGhzfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGRpc3BhdGNoKGNyZWF0ZUFjdGlvbihjaGFuZ2VUeXBlKSgpKTtcbiAgICAgICAgY29uc3Qge2lkLCBwcm9wc30gPVxuICAgICAgICAgICAgKGNoYW5nZVR5cGUgPT09ICdSRURPJ1xuICAgICAgICAgICAgICAgID8gaGlzdG9yeS5mdXR1cmVbMF1cbiAgICAgICAgICAgICAgICA6IGhpc3RvcnkucGFzdFtoaXN0b3J5LnBhc3QubGVuZ3RoIC0gMV0pIHx8IHt9O1xuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBwcm9wc1xuICAgICAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgY3JlYXRlQWN0aW9uKCdVTkRPX1BST1BfQ0hBTkdFJykoe1xuICAgICAgICAgICAgICAgICAgICBpdGVtcGF0aDogZ2V0UGF0aChwYXRocywgaWQpLFxuICAgICAgICAgICAgICAgICAgICBwcm9wc1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBkaXNwYXRjaChub3RpZnlPYnNlcnZlcnMoe2lkLCBwcm9wc30pKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3RpZnlPYnNlcnZlcnMoe2lkLCBwcm9wc30pIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKGRpc3BhdGNoLCBnZXRTdGF0ZSkge1xuICAgICAgICBjb25zdCB7Z3JhcGhzLCBwYXRoc30gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgIGFkZFJlcXVlc3RlZENhbGxiYWNrcyhpbmNsdWRlT2JzZXJ2ZXJzKGlkLCBwcm9wcywgZ3JhcGhzLCBwYXRocykpXG4gICAgICAgICk7XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUFzeW5jRXJyb3IoZXJyLCBtZXNzYWdlLCBkaXNwYXRjaCkge1xuICAgIC8vIEhhbmRsZSBodG1sIGVycm9yIHJlc3BvbnNlc1xuICAgIGlmIChlcnIgJiYgdHlwZW9mIGVyci50ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVyci50ZXh0KCkudGhlbih0ZXh0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0ge21lc3NhZ2UsIGh0bWw6IHRleHR9O1xuICAgICAgICAgICAgZGlzcGF0Y2gob25FcnJvcih7dHlwZTogJ2JhY2tFbmQnLCBlcnJvcn0pKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyciA6IHttZXNzYWdlLCBodG1sOiBlcnJ9O1xuICAgICAgICBkaXNwYXRjaChvbkVycm9yKHt0eXBlOiAnYmFja0VuZCcsIGVycm9yfSkpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7cGF0aH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHtpc1JlYWR5fSBmcm9tICdAcGxvdGx5L2Rhc2gtY29tcG9uZW50LXBsdWdpbnMnO1xuXG5pbXBvcnQgUmVnaXN0cnkgZnJvbSAnLi4vcmVnaXN0cnknO1xuaW1wb3J0IHtnZXRQYXRofSBmcm9tICcuL3BhdGhzJztcbmltcG9ydCB7c3RyaW5naWZ5SWR9IGZyb20gJy4vZGVwZW5kZW5jaWVzJztcblxuZXhwb3J0IGRlZmF1bHQgKGxheW91dCwgcGF0aHMsIHRhcmdldHMpID0+IHtcbiAgICBpZiAoIXRhcmdldHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuXG4gICAgY29uc3Qge2V2ZW50c30gPSBwYXRocztcbiAgICBjb25zdCByZW5kZXJlZCA9IG5ldyBQcm9taXNlKHJlc29sdmVSZW5kZXJlZCA9PiB7XG4gICAgICAgIGV2ZW50cy5vbmNlKCdyZW5kZXJlZCcsIHJlc29sdmVSZW5kZXJlZCk7XG4gICAgfSk7XG5cbiAgICB0YXJnZXRzLmZvckVhY2goaWQgPT4ge1xuICAgICAgICBjb25zdCBwYXRoT2ZJZCA9IGdldFBhdGgocGF0aHMsIGlkKTtcbiAgICAgICAgaWYgKCFwYXRoT2ZJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gcGF0aChwYXRoT2ZJZCwgbGF5b3V0KTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IFJlZ2lzdHJ5LnJlc29sdmUodGFyZ2V0KTtcbiAgICAgICAgY29uc3QgcmVhZHkgPSBpc1JlYWR5KGNvbXBvbmVudCk7XG5cbiAgICAgICAgaWYgKHJlYWR5ICYmIHR5cGVvZiByZWFkeS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICAgICAgICAgIFByb21pc2UucmFjZShbXG4gICAgICAgICAgICAgICAgICAgIHJlYWR5LFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJlZC50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3RyaW5naWZ5SWQoaWQpKSAmJiByZWFkeVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBwcm9taXNlcy5sZW5ndGggPyBQcm9taXNlLmFsbChwcm9taXNlcykgOiB0cnVlO1xufTtcbiIsImltcG9ydCB7XG4gICAgY29uY2F0LFxuICAgIGZpbHRlcixcbiAgICBmaW5kLFxuICAgIGZvckVhY2hPYmpJbmRleGVkLFxuICAgIGluc2VydCxcbiAgICBwYXRoLFxuICAgIHByb3BFcSxcbiAgICBwcm9wcyxcbiAgICBpbmRleE9mXG59IGZyb20gJ3JhbWRhJztcblxuaW1wb3J0IHtjcmF3bExheW91dH0gZnJvbSAnLi91dGlscyc7XG5cbi8qXG4gKiBzdGF0ZS5wYXRocyBoYXMgc3RydWN0dXJlOlxuICoge1xuICogICBzdHJzOiB7W2lkXTogcGF0aH0gLy8gZm9yIHJlZ3VsYXIgc3RyaW5nIGlkc1xuICogICBvYmpzOiB7W2tleVN0cl06IFt7dmFsdWVzLCBwYXRofV19IC8vIGZvciB3aWxkY2FyZCBpZHNcbiAqIH1cbiAqIGtleVN0cjogc29ydGVkIGtleXMgb2YgdGhlIGlkLCBqb2luZWQgd2l0aCAnLCcgaW50byBvbmUgc3RyaW5nXG4gKiB2YWx1ZXM6IGFycmF5IG9mIHZhbHVlcyBpbiB0aGUgaWQsIGluIG9yZGVyIG9mIGtleXNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVBhdGhzKHN1YlRyZWUsIHN0YXJ0aW5nUGF0aCwgb2xkUGF0aHMsIGV2ZW50cykge1xuICAgIGNvbnN0IHtzdHJzOiBvbGRTdHJzLCBvYmpzOiBvbGRPYmpzfSA9IG9sZFBhdGhzIHx8IHtzdHJzOiB7fSwgb2Jqczoge319O1xuXG4gICAgY29uc3QgZGlmZkhlYWQgPSBwYXRoID0+IHN0YXJ0aW5nUGF0aC5zb21lKCh2LCBpKSA9PiBwYXRoW2ldICE9PSB2KTtcblxuICAgIGNvbnN0IHNwTGVuID0gc3RhcnRpbmdQYXRoLmxlbmd0aDtcbiAgICAvLyBpZiB3ZSdyZSB1cGRhdGluZyBhIHN1YnRyZWUsIGNsZWFyIG91dCBhbGwgb2YgdGhlIGV4aXN0aW5nIGl0ZW1zXG4gICAgY29uc3Qgc3RycyA9IHNwTGVuID8gZmlsdGVyKGRpZmZIZWFkLCBvbGRTdHJzKSA6IHt9O1xuICAgIGNvbnN0IG9ianMgPSB7fTtcbiAgICBpZiAoc3BMZW4pIHtcbiAgICAgICAgZm9yRWFjaE9iakluZGV4ZWQoKG9sZFZhbFBhdGhzLCBvbGRLZXlzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWxzID0gZmlsdGVyKCh7cGF0aH0pID0+IGRpZmZIZWFkKHBhdGgpLCBvbGRWYWxQYXRocyk7XG4gICAgICAgICAgICBpZiAobmV3VmFscy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBvYmpzW29sZEtleXNdID0gbmV3VmFscztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgb2xkT2Jqcyk7XG4gICAgfVxuXG4gICAgY3Jhd2xMYXlvdXQoc3ViVHJlZSwgKGNoaWxkLCBpdGVtcGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IHBhdGgoWydwcm9wcycsICdpZCddLCBjaGlsZCk7XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaWQpLnNvcnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBwcm9wcyhrZXlzLCBpZCk7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5U3RyID0ga2V5cy5qb2luKCcsJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aHMgPSAob2Jqc1trZXlTdHJdID0gb2Jqc1trZXlTdHJdIHx8IFtdKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRpZSA9IG9sZE9ianNba2V5U3RyXSB8fCBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0ge3ZhbHVlcywgcGF0aDogY29uY2F0KHN0YXJ0aW5nUGF0aCwgaXRlbXBhdGgpfTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGluZGV4T2YoaXRlbSwgb2xkaWUpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvYmpzW2tleVN0cl0gPSBpbnNlcnQoaW5kZXgsIGl0ZW0sIHBhdGhzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0cnNbaWRdID0gY29uY2F0KHN0YXJ0aW5nUGF0aCwgaXRlbXBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBXZSBpbmNsdWRlIGFuIGV2ZW50IGVtaXR0ZXIgaGVyZSBiZWNhdXNlIGl0IHdpbGwgYmUgdXNlZCBhbG9uZyB3aXRoXG4gICAgLy8gcGF0aHMgdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIGFwcCBpcyByZWFkeSBmb3IgY2FsbGJhY2tzLlxuICAgIHJldHVybiB7c3Rycywgb2JqcywgZXZlbnRzOiBldmVudHMgfHwgb2xkUGF0aHMuZXZlbnRzfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhdGgocGF0aHMsIGlkKSB7XG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGlkKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IGtleVN0ciA9IGtleXMuam9pbignLCcpO1xuICAgICAgICBjb25zdCBrZXlQYXRocyA9IHBhdGhzLm9ianNba2V5U3RyXTtcbiAgICAgICAgaWYgKCFrZXlQYXRocykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHByb3BzKGtleXMsIGlkKTtcbiAgICAgICAgY29uc3QgcGF0aE9iaiA9IGZpbmQocHJvcEVxKHZhbHVlcywgJ3ZhbHVlcycpLCBrZXlQYXRocyk7XG4gICAgICAgIHJldHVybiBwYXRoT2JqICYmIHBhdGhPYmoucGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGhzLnN0cnNbaWRdO1xufVxuIiwiaW1wb3J0IHtcbiAgICBhcHBlbmQsXG4gICAgY29uY2F0LFxuICAgIGhhcyxcbiAgICBwYXRoLFxuICAgIHBhdGhPcixcbiAgICB0eXBlLFxuICAgIGZpbmRJbmRleCxcbiAgICBpbmNsdWRlcyxcbiAgICBzbGljZVxufSBmcm9tICdyYW1kYSc7XG5cbi8qXG4gKiByZXF1ZXN0c19wYXRobmFtZV9wcmVmaXggaXMgdGhlIG5ldyBjb25maWcgcGFyYW1ldGVyIGludHJvZHVjZWQgaW5cbiAqIGRhc2g9PTAuMTguMC4gVGhlIHByZXZpb3VzIHZlcnNpb25zIGp1c3QgaGFkIHVybF9iYXNlX3BhdGhuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cmxCYXNlKGNvbmZpZykge1xuICAgIGNvbnN0IGhhc1VybEJhc2UgPSBoYXMoJ3VybF9iYXNlX3BhdGhuYW1lJywgY29uZmlnKTtcbiAgICBjb25zdCBoYXNSZXFQcmVmaXggPSBoYXMoJ3JlcXVlc3RzX3BhdGhuYW1lX3ByZWZpeCcsIGNvbmZpZyk7XG4gICAgaWYgKHR5cGUoY29uZmlnKSAhPT0gJ09iamVjdCcgfHwgKCFoYXNVcmxCYXNlICYmICFoYXNSZXFQcmVmaXgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBcbiAgICAgICAgICAgIFRyeWluZyB0byBtYWtlIGFuIEFQSSByZXF1ZXN0IGJ1dCBuZWl0aGVyXG4gICAgICAgICAgICBcInVybF9iYXNlX3BhdGhuYW1lXCIgbm9yIFwicmVxdWVzdHNfcGF0aG5hbWVfcHJlZml4XCJcbiAgICAgICAgICAgIGlzIGluIFxcYGNvbmZpZ1xcYC4gXFxgY29uZmlnXFxgIGlzOiBgLFxuICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZSA9IGhhc1JlcVByZWZpeFxuICAgICAgICA/IGNvbmZpZy5yZXF1ZXN0c19wYXRobmFtZV9wcmVmaXhcbiAgICAgICAgOiBjb25maWcudXJsX2Jhc2VfcGF0aG5hbWU7XG5cbiAgICByZXR1cm4gYmFzZS5jaGFyQXQoYmFzZS5sZW5ndGggLSAxKSA9PT0gJy8nID8gYmFzZSA6IGJhc2UgKyAnLyc7XG59XG5cbmNvbnN0IHByb3BzQ2hpbGRyZW4gPSBbJ3Byb3BzJywgJ2NoaWxkcmVuJ107XG5cbi8vIGNyYXdsIGEgbGF5b3V0IG9iamVjdCBvciBjaGlsZHJlbiBhcnJheSwgYXBwbHkgYSBmdW5jdGlvbiBvbiBldmVyeSBvYmplY3RcbmV4cG9ydCBjb25zdCBjcmF3bExheW91dCA9IChcbiAgICBvYmplY3QsXG4gICAgZnVuYyxcbiAgICBjdXJyZW50UGF0aCA9IFtdLFxuICAgIGV4dHJhUGF0aCA9IHVuZGVmaW5lZFxuKSA9PiB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgICAgICAvLyBjaGlsZHJlbiBhcnJheVxuICAgICAgICBvYmplY3QuZm9yRWFjaCgoY2hpbGQsIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChleHRyYVBhdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvYmpPZiA9IGZpbmRJbmRleChwID0+IGluY2x1ZGVzKCd7fScsIHApLCBleHRyYVBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChvYmpPZiAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJvbnQgPSBzbGljZSgwLCBvYmpPZiwgZXh0cmFQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFjayA9IHNsaWNlKG9iak9mLCBleHRyYVBhdGgubGVuZ3RoLCBleHRyYVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcmF3bExheW91dChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKGZyb250LCBjaGlsZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jYXQoY3VycmVudFBhdGgsIGNvbmNhdChbaV0sIGZyb250KSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tQYXRoID0gYmFja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAocCA9PiBwLnJlcGxhY2UoJ3t9JywgJycpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZSA9PiBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZE9iaixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZFBhdGggPSBjb25jYXQoW2ldLCBiYWNrUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja1BhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRPYmogPSBwYXRoKGJhY2tQYXRoLCBjaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkT2JqID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjaGlsZE9iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2hpbGRPYmpba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmF3bExheW91dChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNhdChjdXJyZW50UGF0aCwgY2hpbGRQYXRoLmNvbmNhdChba2V5XSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNyYXdsTGF5b3V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aChleHRyYVBhdGgsIGNoaWxkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25jYXQoY3VycmVudFBhdGgsIGNvbmNhdChbaV0sIGV4dHJhUGF0aCkpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjcmF3bExheW91dChjaGlsZCwgZnVuYywgYXBwZW5kKGksIGN1cnJlbnRQYXRoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZShvYmplY3QpID09PSAnT2JqZWN0Jykge1xuICAgICAgICBmdW5jKG9iamVjdCwgY3VycmVudFBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gcGF0aChwcm9wc0NoaWxkcmVuLCBvYmplY3QpO1xuICAgICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1BhdGggPSBjb25jYXQoY3VycmVudFBhdGgsIHByb3BzQ2hpbGRyZW4pO1xuICAgICAgICAgICAgY3Jhd2xMYXlvdXQoY2hpbGRyZW4sIGZ1bmMsIG5ld1BhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hpbGRyZW5Qcm9wcyA9IHBhdGhPcihcbiAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgW29iamVjdC5uYW1lc3BhY2UsIG9iamVjdC50eXBlXSxcbiAgICAgICAgICAgIHdpbmRvdy5fX2Rhc2hwcml2YXRlX2NoaWxkcmVuUHJvcHNcbiAgICAgICAgKTtcbiAgICAgICAgY2hpbGRyZW5Qcm9wcy5mb3JFYWNoKGNoaWxkcmVuUHJvcCA9PiB7XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5Qcm9wLmluY2x1ZGVzKCdbXScpKSB7XG4gICAgICAgICAgICAgICAgbGV0IFtmcm9udFBhdGgsIGJhY2tQYXRoXSA9IGNoaWxkcmVuUHJvcFxuICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJ1tdJylcbiAgICAgICAgICAgICAgICAgICAgLm1hcChwID0+IHAuc3BsaXQoJy4nKS5maWx0ZXIoZSA9PiBlKSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmcm9udCA9IGNvbmNhdChbJ3Byb3BzJ10sIGZyb250UGF0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFzZVBhdGggPSBjb25jYXQoY3VycmVudFBhdGgsIGZyb250KTtcbiAgICAgICAgICAgICAgICBjcmF3bExheW91dChwYXRoKGZyb250LCBvYmplY3QpLCBmdW5jLCBiYXNlUGF0aCwgYmFja1BhdGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5Qcm9wLmluY2x1ZGVzKCd7fScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wYXRoID0gY2hpbGRyZW5Qcm9wLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyb250UGF0aCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrUGF0aCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJQYXRoID0gb3BhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kICYmIGN1clBhdGguaW5jbHVkZXMoJ3t9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRQYXRoLnB1c2goY3VyUGF0aC5yZXBsYWNlKCd7fScsICcnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrUGF0aC5wdXNoKGN1clBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb250UGF0aC5wdXNoKGN1clBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQYXRoID0gY29uY2F0KGN1cnJlbnRQYXRoLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAncHJvcHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZnJvbnRQYXRoXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9WYWx1ZSA9IHBhdGgoWydwcm9wcycsIC4uLmZyb250UGF0aF0sIG9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBvVmFsdWVba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja1BhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyYXdsTGF5b3V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aChiYWNrUGF0aCwgdmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNhdChuZXdQYXRoLCBba2V5LCAuLi5iYWNrUGF0aF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhd2xMYXlvdXQodmFsdWUsIGZ1bmMsIFsuLi5uZXdQYXRoLCBrZXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQYXRoID0gY29uY2F0KGN1cnJlbnRQYXRoLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAncHJvcHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY2hpbGRyZW5Qcm9wLnNwbGl0KCcuJylcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgIGNyYXdsTGF5b3V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aChbJ3Byb3BzJywgLi4uY2hpbGRyZW5Qcm9wLnNwbGl0KCcuJyldLCBvYmplY3QpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGhcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbi8vIFRoZXJlIGFyZSBwYWNrYWdlcyBmb3IgdGhpcyBidXQgaXQncyBzaW1wbGUgZW5vdWdoLCBJIGp1c3Rcbi8vIGFkYXB0ZWQgaXQgZnJvbSBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9tdWRnZS81ODMwMzgyXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fZXYgPSB7fTtcbiAgICB9XG4gICAgb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50cyA9ICh0aGlzLl9ldltldmVudF0gPSB0aGlzLl9ldltldmVudF0gfHwgW10pO1xuICAgICAgICBldmVudHMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiAoKSA9PiB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgfVxuICAgIHJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICBjb25zdCBldmVudHMgPSB0aGlzLl9ldltldmVudF07XG4gICAgICAgIGlmIChldmVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGV2ZW50cy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgICAgIGlmIChpZHggPiAtMSkge1xuICAgICAgICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbWl0KGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMuX2V2W2V2ZW50XTtcbiAgICAgICAgaWYgKGV2ZW50cykge1xuICAgICAgICAgICAgZXZlbnRzLmZvckVhY2gobGlzdGVuZXIgPT4gbGlzdGVuZXIuYXBwbHkodGhpcywgYXJncykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uY2UoZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIGNvbnN0IHJlbW92ZSA9IHRoaXMub24oZXZlbnQsICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICByZW1vdmUoKTtcbiAgICAgICAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCIvKlxuICogQ29waWVkIG91dCBvZiBwcm9wLXR5cGVzIGFuZCBtb2RpZmllZCAtIGluc3BpcmVkIGJ5IGNoZWNrLXByb3AtdHlwZXMsIGJ1dFxuICogc2ltcGxpZmllZCBhbmQgdHdlYWtlZCB0byBvdXIgbmVlZHM6IHdlIGRvbid0IG5lZWQgdGhlIE5PREVfRU5WIGNoZWNrLFxuICogd2UgcmVwb3J0IGFsbCBlcnJvcnMsIG5vdCBqdXN0IHRoZSBmaXJzdCBvbmUsIGFuZCB3ZSBkb24ndCBuZWVkIHRoZSB0aHJvd2luZ1xuICogdmFyaWFudCBgYXNzZXJ0UHJvcFR5cGVzYC5cbiAqL1xuaW1wb3J0IFJlYWN0UHJvcFR5cGVzU2VjcmV0IGZyb20gJ3Byb3AtdHlwZXMvbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0JztcblxuLyoqXG4gKiBBc3NlcnQgdGhhdCB0aGUgdmFsdWVzIG1hdGNoIHdpdGggdGhlIHR5cGUgc3BlY3MuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHR5cGVTcGVjcyBNYXAgb2YgbmFtZSB0byBhIFJlYWN0UHJvcFR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgUnVudGltZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHR5cGUtY2hlY2tlZFxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uIGUuZy4gXCJwcm9wXCIsIFwiY29udGV4dFwiLCBcImNoaWxkIGNvbnRleHRcIlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbXBvbmVudE5hbWUgTmFtZSBvZiB0aGUgY29tcG9uZW50IGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBnZXRTdGFjayBSZXR1cm5zIHRoZSBjb21wb25lbnQgc3RhY2suXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEFueSBlcnJvciBtZXNzYWdlIHJlc3VsdGluZyBmcm9tIGNoZWNraW5nIHRoZSB0eXBlc1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjaGVja1Byb3BUeXBlcyhcbiAgICB0eXBlU3BlY3MsXG4gICAgdmFsdWVzLFxuICAgIGxvY2F0aW9uLFxuICAgIGNvbXBvbmVudE5hbWUsXG4gICAgZ2V0U3RhY2sgPSBudWxsXG4pIHtcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgICAgaWYgKHR5cGVTcGVjcy5oYXNPd25Qcm9wZXJ0eSh0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgICAgICBsZXQgZXJyb3I7XG4gICAgICAgICAgICAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIHR5cGUgYCcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTcGVjTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AgaXMgaW52YWxpZDsgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdgLidcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVNwZWNOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWN0UHJvcFR5cGVzU2VjcmV0XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yICYmICEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyBgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3BlY05hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBlcnJvciArXG4gICAgICAgICAgICAgICAgICAgICAgICAnLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0YWNrID0gKGdldFN0YWNrICYmIGdldFN0YWNrKCkpIHx8ICcnO1xuXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICdGYWlsZWQgJyArIGxvY2F0aW9uICsgJyB0eXBlOiAnICsgZXJyb3IubWVzc2FnZSArIHN0YWNrXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzLmpvaW4oJ1xcblxcbicpO1xufVxuIiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxuZnVuY3Rpb24gTG9hZGluZyhwcm9wcykge1xuICAgIGlmIChwcm9wcy5pc0xvYWRpbmcpIHtcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPSdfZGFzaC1sb2FkaW5nLWNhbGxiYWNrJyAvPjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbkxvYWRpbmcucHJvcFR5cGVzID0ge1xuICAgIGlzTG9hZGluZzogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChzdGF0ZSA9PiAoe1xuICAgIGlzTG9hZGluZzogc3RhdGUuaXNMb2FkaW5nXG59KSkoTG9hZGluZyk7XG4iLCJpbXBvcnQge1xuICAgIGNvbXBhcmF0b3IsXG4gICAgZXF1YWxzLFxuICAgIGZvckVhY2gsXG4gICAgaGFzLFxuICAgIGlzRW1wdHksXG4gICAgbHQsXG4gICAgcGF0aCxcbiAgICBwYXRoT3IsXG4gICAgc29ydFxufSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IGFwaVRodW5rIGZyb20gJy4uLy4uL2FjdGlvbnMvYXBpJztcblxuY2xhc3MgUmVsb2FkZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgaWYgKHByb3BzLmNvbmZpZy5ob3RfcmVsb2FkKSB7XG4gICAgICAgICAgICBjb25zdCB7aW50ZXJ2YWwsIG1heF9yZXRyeX0gPSBwcm9wcy5jb25maWcuaG90X3JlbG9hZDtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgaW50ZXJ2YWwsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGludGVydmFsSWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgcGFja2FnZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgbWF4X3JldHJ5XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogdHJ1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZXRyeSA9IDA7XG4gICAgICAgIHRoaXMuX2hlYWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkJyk7XG4gICAgICAgIHRoaXMuY2xlYXJJbnRlcnZhbCA9IHRoaXMuY2xlYXJJbnRlcnZhbC5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIGNsZWFySW50ZXJ2YWwoKSB7XG4gICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuc3RhdGUuaW50ZXJ2YWxJZCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2ludGVydmFsSWQ6IG51bGx9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHByb3BzKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIFNhdmUgdGhlIG5vbi1sb2FkaW5nIHJlcXVlc3RzIGluIHRoZSBzdGF0ZSBpbiBvcmRlciB0byBjb21wYXJlXG4gICAgICAgICAqIGN1cnJlbnQgaGFzaGVzIHdpdGggcHJldmlvdXMgaGFzaGVzLlxuICAgICAgICAgKiBOb3RlIHRoYXQgaWYgdGhlcmUgd2Fzbid0IGEgXCJsb2FkaW5nXCIgc3RhdGUgZm9yIHRoZSByZXF1ZXN0cyxcbiAgICAgICAgICogdGhlbiB3ZSAgY291bGQgc2ltcGx5IGNvbXBhcmUgYHByb3BzYCB3aXRoIGBwcmV2UHJvcHNgIGluXG4gICAgICAgICAqIGBjb21wb25lbnREaWRVcGRhdGVgLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWlzRW1wdHkocHJvcHMucmVsb2FkUmVxdWVzdCkgJiZcbiAgICAgICAgICAgIHByb3BzLnJlbG9hZFJlcXVlc3Quc3RhdHVzICE9PSAnbG9hZGluZydcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4ge3JlbG9hZFJlcXVlc3Q6IHByb3BzLnJlbG9hZFJlcXVlc3R9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgICAgICBjb25zdCB7cmVsb2FkUmVxdWVzdH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBjb25zdCB7ZGlzcGF0Y2h9ID0gdGhpcy5wcm9wcztcblxuICAgICAgICAvLyBJbiB0aGUgYmVnaW5uaW5nLCByZWxvYWRSZXF1ZXN0IHdvbid0IGJlIGRlZmluZWRcbiAgICAgICAgaWYgKCFyZWxvYWRSZXF1ZXN0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgKiBXaGVuIHJlbG9hZFJlcXVlc3QgaXMgZmlyc3QgZGVmaW5lZCwgcHJldlN0YXRlIHdvbid0IGJlIGRlZmluZWRcbiAgICAgICAgICogZm9yIG9uZSByZW5kZXIgbG9vcC5cbiAgICAgICAgICogVGhlIGZpcnN0IHJlbG9hZFJlcXVlc3QgZGVmaW5lcyB0aGUgaW5pdGlhbC9iYXNlbGluZSBoYXNoIC1cbiAgICAgICAgICogaXQgZG9lc24ndCByZXF1aXJlIGEgcmVsb2FkXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoIWhhcygncmVsb2FkUmVxdWVzdCcsIHByZXZTdGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlbG9hZFJlcXVlc3Quc3RhdHVzID09PSAyMDAgJiZcbiAgICAgICAgICAgIHBhdGgoWydjb250ZW50JywgJ3JlbG9hZEhhc2gnXSwgcmVsb2FkUmVxdWVzdCkgIT09XG4gICAgICAgICAgICAgICAgcGF0aChbJ3JlbG9hZFJlcXVlc3QnLCAnY29udGVudCcsICdyZWxvYWRIYXNoJ10sIHByZXZTdGF0ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgQ1NTICghY29udGVudC5oYXJkKSBvciBuZXcgcGFja2FnZSBhc3NldHNcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICByZWxvYWRSZXF1ZXN0LmNvbnRlbnQuaGFyZCB8fFxuICAgICAgICAgICAgICAgICFlcXVhbHMoXG4gICAgICAgICAgICAgICAgICAgIHJlbG9hZFJlcXVlc3QuY29udGVudC5wYWNrYWdlcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIHBhdGhPcihcbiAgICAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgWydyZWxvYWRSZXF1ZXN0JywgJ2NvbnRlbnQnLCAncGFja2FnZXMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZTdGF0ZVxuICAgICAgICAgICAgICAgICAgICApLmxlbmd0aFxuICAgICAgICAgICAgICAgICkgfHxcbiAgICAgICAgICAgICAgICAhZXF1YWxzKFxuICAgICAgICAgICAgICAgICAgICBzb3J0KGNvbXBhcmF0b3IobHQpLCByZWxvYWRSZXF1ZXN0LmNvbnRlbnQucGFja2FnZXMpLFxuICAgICAgICAgICAgICAgICAgICBzb3J0KFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyYXRvcihsdCksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoT3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWydyZWxvYWRSZXF1ZXN0JywgJ2NvbnRlbnQnLCAncGFja2FnZXMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2U3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIExvb2sgaWYgaXQgd2FzIGEgY3NzIGZpbGUuXG4gICAgICAgICAgICAgICAgbGV0IHdhc19jc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYSBvZiByZWxvYWRSZXF1ZXN0LmNvbnRlbnQuZmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEuaXNfY3NzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YXNfY3NzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzVG9EaXNhYmxlID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIG9sZCBmaWxlIGJ5IHhwYXRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXQgPSBkb2N1bWVudC5ldmFsdWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgLy9saW5rW2NvbnRhaW5zKEBocmVmLCBcIiR7YS51cmx9XCIpXWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faGVhZFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlID0gaXQuaXRlcmF0ZU5leHQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvRGlzYWJsZS5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBpdC5pdGVyYXRlTmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPT4gbi5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNUb0Rpc2FibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLm1vZGlmaWVkID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay5ocmVmID0gYCR7YS51cmx9P209JHthLm1vZGlmaWVkfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9oZWFkLmFwcGVuZENoaWxkKGxpbmspO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVsc2UgdGhlIGZpbGUgd2FzIGRlbGV0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGFub3RoZXIga2luZCBvZiBmaWxlIGhlcmUgZG8gYSBoYXJkIHJlbG9hZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdhc19jc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghd2FzX2Nzcykge1xuICAgICAgICAgICAgICAgICAgICAvLyBBc3NldHMgZmlsZSBoYXZlIGNoYW5nZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gb3IgYSBjb21wb25lbnQgbGliIGhhcyBiZWVuIGFkZGVkL3JlbW92ZWQgLVxuICAgICAgICAgICAgICAgICAgICAvLyBNdXN0IGRvIGEgaGFyZCByZWxvYWRcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQmFja2VuZCBjb2RlIGNoYW5nZWQgLSBjYW4gZG8gYSBzb2Z0IHJlbG9hZCBpbiBwbGFjZVxuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHt0eXBlOiAnUkVMT0FEJ30pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5pbnRlcnZhbElkICE9PSBudWxsICYmXG4gICAgICAgICAgICByZWxvYWRSZXF1ZXN0LnN0YXR1cyA9PT0gNTAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JldHJ5ID4gdGhpcy5zdGF0ZS5tYXhfcmV0cnkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFySW50ZXJ2YWwoKTtcbiAgICAgICAgICAgICAgICAvLyBJbnRlZ3JhdGUgd2l0aCBkZXYgdG9vbHMgdWk/IVxuICAgICAgICAgICAgICAgIHdpbmRvdy5hbGVydChcbiAgICAgICAgICAgICAgICAgICAgYEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQgYWZ0ZXIgZmFpbGluZyAke3RoaXMuX3JldHJ5fSB0aW1lcy4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnUGxlYXNlIGNoZWNrIHlvdXIgYXBwbGljYXRpb24gZm9yIGVycm9ycywgdGhlbiByZWZyZXNoIHRoZSBwYWdlLidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcmV0cnkrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICBjb25zdCB7ZGlzcGF0Y2gsIHJlbG9hZFJlcXVlc3R9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY29uc3Qge2Rpc2FibGVkLCBpbnRlcnZhbH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBpZiAoIWRpc2FibGVkICYmICF0aGlzLnN0YXRlLmludGVydmFsSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVydmFsSWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgcmVxdWVzdHMgZnJvbSBwaWxpbmcgdXAgLSByZWxvYWRpbmcgY2FuIHRha2VcbiAgICAgICAgICAgICAgICAvLyBtYW55IHNlY29uZHMgKDEwLTMwKSBhbmQgdGhlIGludGVydmFsIGlzIDNzIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgICAgICBpZiAocmVsb2FkUmVxdWVzdC5zdGF0dXMgIT09ICdsb2FkaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChhcGlUaHVuaygnX3JlbG9hZC1oYXNoJywgJ0dFVCcsICdyZWxvYWRSZXF1ZXN0JykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGludGVydmFsKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2ludGVydmFsSWR9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuc3RhdGUuZGlzYWJsZWQgJiYgdGhpcy5zdGF0ZS5pbnRlcnZhbElkKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFySW50ZXJ2YWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5SZWxvYWRlci5kZWZhdWx0UHJvcHMgPSB7fTtcblxuUmVsb2FkZXIucHJvcFR5cGVzID0ge1xuICAgIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGNvbmZpZzogUHJvcFR5cGVzLm9iamVjdCxcbiAgICByZWxvYWRSZXF1ZXN0OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGRpc3BhdGNoOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBpbnRlcnZhbDogUHJvcFR5cGVzLm51bWJlclxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChcbiAgICBzdGF0ZSA9PiAoe1xuICAgICAgICBjb25maWc6IHN0YXRlLmNvbmZpZyxcbiAgICAgICAgcmVsb2FkUmVxdWVzdDogc3RhdGUucmVsb2FkUmVxdWVzdFxuICAgIH0pLFxuICAgIGRpc3BhdGNoID0+ICh7ZGlzcGF0Y2h9KVxuKShSZWxvYWRlcik7XG4iLCJpbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHtyZWRvLCB1bmRvfSBmcm9tICcuLi8uLi9hY3Rpb25zL2luZGV4LmpzJztcbmltcG9ydCAnLi9Ub29sYmFyLmNzcyc7XG5cbmZ1bmN0aW9uIFVuY29ubmVjdGVkVG9vbGJhcihwcm9wcykge1xuICAgIGNvbnN0IHtkaXNwYXRjaCwgaGlzdG9yeX0gPSBwcm9wcztcblxuICAgIGNvbnN0IHVuZG9MaW5rID0gKFxuICAgICAgICA8c3BhblxuICAgICAgICAgICAga2V5PSd1bmRvTGluaydcbiAgICAgICAgICAgIGNsYXNzTmFtZT0nX2Rhc2gtdW5kby1yZWRvLWxpbmsnXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBkaXNwYXRjaCh1bmRvKX1cbiAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J19kYXNoLWljb24tdW5kbyc+4oa6PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtdW5kby1yZWRvLWxhYmVsJz51bmRvPC9kaXY+XG4gICAgICAgIDwvc3Bhbj5cbiAgICApO1xuXG4gICAgY29uc3QgcmVkb0xpbmsgPSAoXG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICBrZXk9J3JlZG9MaW5rJ1xuICAgICAgICAgICAgY2xhc3NOYW1lPSdfZGFzaC11bmRvLXJlZG8tbGluaydcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGRpc3BhdGNoKHJlZG8pfVxuICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtaWNvbi1yZWRvJz7ihrs8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdfZGFzaC11bmRvLXJlZG8tbGFiZWwnPnJlZG88L2Rpdj5cbiAgICAgICAgPC9zcGFuPlxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtdW5kby1yZWRvJz5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAge2hpc3RvcnkucGFzdC5sZW5ndGggPiAwID8gdW5kb0xpbmsgOiBudWxsfVxuICAgICAgICAgICAgICAgIHtoaXN0b3J5LmZ1dHVyZS5sZW5ndGggPiAwID8gcmVkb0xpbmsgOiBudWxsfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59XG5cblVuY29ubmVjdGVkVG9vbGJhci5wcm9wVHlwZXMgPSB7XG4gICAgaGlzdG9yeTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBkaXNwYXRjaDogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbmNvbnN0IFRvb2xiYXIgPSBjb25uZWN0KFxuICAgIHN0YXRlID0+ICh7XG4gICAgICAgIGhpc3Rvcnk6IHN0YXRlLmhpc3RvcnlcbiAgICB9KSxcbiAgICBkaXNwYXRjaCA9PiAoe2Rpc3BhdGNofSlcbikoVW5jb25uZWN0ZWRUb29sYmFyKTtcblxuZXhwb3J0IGRlZmF1bHQgVG9vbGJhcjtcbiIsImltcG9ydCBSZWFjdCwge0NvbXBvbmVudCwgdXNlU3RhdGUsIHVzZU1lbW8sIHVzZUVmZmVjdCwgdXNlUmVmfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHtjb25uZWN0LCB1c2VTZWxlY3Rvcn0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IEN5dG9zY2FwZSBmcm9tICdjeXRvc2NhcGUnO1xuaW1wb3J0IEN5dG9zY2FwZUNvbXBvbmVudCBmcm9tICdyZWFjdC1jeXRvc2NhcGVqcyc7XG5pbXBvcnQgZGFncmUgZnJvbSAnY3l0b3NjYXBlLWRhZ3JlJztcbmltcG9ydCBmY29zZSBmcm9tICdjeXRvc2NhcGUtZmNvc2UnO1xuaW1wb3J0IHtKU09OVHJlZX0gZnJvbSAncmVhY3QtanNvbi10cmVlJztcbmltcG9ydCB7a2V5cywgbWVyZ2VSaWdodCwgb21pdCwgcGF0aCwgdmFsdWVzfSBmcm9tICdyYW1kYSc7XG5cbmltcG9ydCB7Z2V0UGF0aH0gZnJvbSAnLi4vLi4vLi4vYWN0aW9ucy9wYXRocyc7XG5pbXBvcnQge3N0cmluZ2lmeUlkfSBmcm9tICcuLi8uLi8uLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQge29uRXJyb3J9IGZyb20gJy4uLy4uLy4uL2FjdGlvbnMnO1xuXG5pbXBvcnQgJy4vQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5jc3MnO1xuaW1wb3J0IHN0eWxlc2hlZXQgZnJvbSAnLi9DYWxsYmFja0dyYXBoQ29udGFpbmVyU3R5bGVzaGVldCc7XG5pbXBvcnQge1xuICAgIHVwZGF0ZVNlbGVjdGVkTm9kZSxcbiAgICB1cGRhdGVDaGFuZ2VkUHJvcHMsXG4gICAgdXBkYXRlQ2FsbGJhY2tcbn0gZnJvbSAnLi9DYWxsYmFja0dyYXBoRWZmZWN0cyc7XG5cbkN5dG9zY2FwZS51c2UoZGFncmUpO1xuQ3l0b3NjYXBlLnVzZShmY29zZSk7XG5cbi8qXG4gKiBHZW5lcmF0ZXMgYWxsIHRoZSBlbGVtZW50cyAobm9kZXMsIGVkZ2VzKSBmb3IgdGhlIGRlcGVuZGVuY3kgZ3JhcGguXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlRWxlbWVudHMoZ3JhcGhzLCBwcm9maWxlLCBleHRyYUxpbmtzKSB7XG4gICAgY29uc3QgY29uc3VtZWQgPSBbXTtcbiAgICBjb25zdCBlbGVtZW50cyA9IFtdO1xuICAgIGNvbnN0IHN0cnVjdHVyZSA9IHt9O1xuXG4gICAgZnVuY3Rpb24gcmVjb3JkTm9kZShpZCwgcmF3UHJvcGVydHkpIHtcbiAgICAgICAgY29uc3QgcHJvcGVydHkgPSByYXdQcm9wZXJ0eS5zcGxpdCgnQCcpWzBdO1xuICAgICAgICBjb25zdCBpZFN0ciA9IHN0cmluZ2lmeUlkKGlkKTtcbiAgICAgICAgY29uc3QgaWRUeXBlID0gdHlwZW9mIGlkID09PSAnb2JqZWN0JyA/ICd3aWxkY2FyZCcgOiAnY29tcG9uZW50JztcblxuICAgICAgICAvLyBkYWdyZSBsYXlvdXQgaGFzIHByb2JsZW1zIHdpdGggZWcgYHdpZHRoYCBwcm9wZXJ0eSAtIHNvIHByZXBlbmQgYW4gWFxuICAgICAgICBjb25zdCBwYXJlbnRJZCA9IGlkU3RyO1xuICAgICAgICBjb25zdCBjaGlsZElkID0gYCR7cGFyZW50SWR9Llgke3Byb3BlcnR5fWA7XG5cbiAgICAgICAgaWYgKCFjb25zdW1lZC5pbmNsdWRlcyhwYXJlbnRJZCkpIHtcbiAgICAgICAgICAgIGNvbnN1bWVkLnB1c2gocGFyZW50SWQpO1xuICAgICAgICAgICAgZWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBpZDogcGFyZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpZFN0cixcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogaWRUeXBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdHJ1Y3R1cmVbcGFyZW50SWRdID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvbnN1bWVkLmluY2x1ZGVzKGNoaWxkSWQpKSB7XG4gICAgICAgICAgICBjb25zdW1lZC5wdXNoKGNoaWxkSWQpO1xuICAgICAgICAgICAgZWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBpZDogY2hpbGRJZCxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHByb3BlcnR5LFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IHBhcmVudElkLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAncHJvcGVydHknXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdHJ1Y3R1cmVbcGFyZW50SWRdLnB1c2goY2hpbGRJZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hpbGRJZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWNvcmRFZGdlKHNvdXJjZSwgdGFyZ2V0LCB0eXBlKSB7XG4gICAgICAgIGVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgKGdyYXBocy5jYWxsYmFja3MgfHwgW10pLmZvckVhY2goKGNhbGxiYWNrLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGNiID0gYF9fZGFzaF9jYWxsYmFja19fLiR7Y2FsbGJhY2sub3V0cHV0fWA7XG4gICAgICAgIGNvbnN0IGNiUHJvZmlsZSA9IHByb2ZpbGUuY2FsbGJhY2tzW2NhbGxiYWNrLm91dHB1dF0gfHwge307XG4gICAgICAgIGNvbnN0IGNvdW50ID0gY2JQcm9maWxlLmNvdW50IHx8IDA7XG4gICAgICAgIGNvbnN0IHRpbWUgPSBjYlByb2ZpbGUudG90YWwgfHwgMDtcblxuICAgICAgICBlbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBpZDogY2IsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGBjYWxsYmFjay4ke2l9YCxcbiAgICAgICAgICAgICAgICB0eXBlOiAnY2FsbGJhY2snLFxuICAgICAgICAgICAgICAgIG1vZGU6IGNhbGxiYWNrLmNsaWVudHNpZGVfZnVuY3Rpb24gPyAnY2xpZW50JyA6ICdzZXJ2ZXInLFxuICAgICAgICAgICAgICAgIGNvdW50OiBjb3VudCxcbiAgICAgICAgICAgICAgICB0aW1lOiBjb3VudCA+IDAgPyBNYXRoLnJvdW5kKHRpbWUgLyBjb3VudCkgOiAwLFxuICAgICAgICAgICAgICAgIGxvYWRpbmdTZXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgZXJyb3JTZXQ6IERhdGUubm93KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2FsbGJhY2sub3V0cHV0cy5tYXAoKHtpZCwgcHJvcGVydHl9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub2RlSWQgPSByZWNvcmROb2RlKGlkLCBwcm9wZXJ0eSk7XG4gICAgICAgICAgICByZWNvcmRFZGdlKGNiLCBub2RlSWQsICdvdXRwdXQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2FsbGJhY2suaW5wdXRzLm1hcCgoe2lkLCBwcm9wZXJ0eX0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVJZCA9IHJlY29yZE5vZGUoaWQsIHByb3BlcnR5KTtcbiAgICAgICAgICAgIHJlY29yZEVkZ2Uobm9kZUlkLCBjYiwgJ2lucHV0Jyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNhbGxiYWNrLnN0YXRlLm1hcCgoe2lkLCBwcm9wZXJ0eX0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVJZCA9IHJlY29yZE5vZGUoaWQsIHByb3BlcnR5KTtcbiAgICAgICAgICAgIHJlY29yZEVkZ2Uobm9kZUlkLCBjYiwgJ3N0YXRlJyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gcHVsbCB0b2dldGhlciBwcm9wcyBpbiB0aGUgc2FtZSBjb21wb25lbnRcbiAgICBpZiAoZXh0cmFMaW5rcykge1xuICAgICAgICB2YWx1ZXMoc3RydWN0dXJlKS5mb3JFYWNoKGNoaWxkSWRzID0+IHtcbiAgICAgICAgICAgIGNoaWxkSWRzLmZvckVhY2goY2hpbGRGcm9tID0+IHtcbiAgICAgICAgICAgICAgICBjaGlsZElkcy5mb3JFYWNoKGNoaWxkVG8gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRGcm9tICE9PSBjaGlsZFRvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRFZGdlKGNoaWxkRnJvbSwgY2hpbGRUbywgJ2hpZGRlbicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzO1xufVxuXG5mdW5jdGlvbiByZWR1Y2VTdGF0dXMoc3RhdHVzKSB7XG4gICAgaWYgKGtleXMoc3RhdHVzKS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIHN0YXR1cy5sYXRlc3Q7XG4gICAgfVxuICAgIHJldHVybiBzdGF0dXM7XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5PdXRwdXRzKHJlcykge1xuICAgIGNvbnN0IG91dHB1dHMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGlkU3RyIGluIHJlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gcmVzW2lkU3RyXSkge1xuICAgICAgICAgICAgb3V0cHV0c1tpZFN0ciArICcuJyArIHByb3BdID0gcmVzW2lkU3RyXVtwcm9wXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0cztcbn1cblxuZnVuY3Rpb24gZmxhdHRlbklucHV0cyhpbkFycmF5LCBmaW5hbCkge1xuICAgIChpbkFycmF5IHx8IFtdKS5mb3JFYWNoKGluSXRlbSA9PiB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGluSXRlbSkpIHtcbiAgICAgICAgICAgIGZsYXR0ZW5JbnB1dHMoaW5JdGVtLCBmaW5hbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7aWQsIHByb3BlcnR5LCB2YWx1ZX0gPSBpbkl0ZW07XG4gICAgICAgICAgICBmaW5hbFtzdHJpbmdpZnlJZChpZCkgKyAnLicgKyBwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmaW5hbDtcbn1cblxuZnVuY3Rpb24gY2xlYW5PdXRwdXRJZChvdXRwdXRJZCkge1xuICAgIHJldHVybiBvdXRwdXRJZFxuICAgICAgICAucmVwbGFjZSgvKF5cXC5cXC58XFwuXFwuJCkvZywgJycpXG4gICAgICAgIC5zcGxpdCgnLi4uJylcbiAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAgIChhZ2csIG5leHQpID0+XG4gICAgICAgICAgICAgICAgYWdnLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXBsYWNlKC8oLipcXC4uKikoQC4rKSQvLCAoYSwgYikgPT4gYiArICcgKER1cGxpY2F0ZSknKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBbXVxuICAgICAgICApXG4gICAgICAgIC5qb2luKCcuLi4nKTtcbn1cblxuLy8gbGVuKCdfX2Rhc2hfY2FsbGJhY2tfXy4nKVxuY29uc3QgY2JQcmVmaXhMZW4gPSAxODtcblxuY29uc3QgZGFncmVMYXlvdXQgPSB7XG4gICAgbmFtZTogJ2RhZ3JlJyxcbiAgICBwYWRkaW5nOiAxMCxcbiAgICByYW5rZXI6ICd0aWdodC10cmVlJ1xufTtcblxuY29uc3QgZm9yY2VMYXlvdXQgPSB7bmFtZTogJ2Zjb3NlJywgcGFkZGluZzogMTAsIGFuaW1hdGU6IGZhbHNlfTtcblxuY29uc3QgbGF5b3V0cyA9IHtcbiAgICAndG9wLWRvd24nOiB7Li4uZGFncmVMYXlvdXQsIHNwYWNpbmdGYWN0b3I6IDAuOH0sXG4gICAgJ2xlZnQtcmlnaHQnOiB7Li4uZGFncmVMYXlvdXQsIG5vZGVTZXA6IDAsIHJhbmtTZXA6IDgwLCByYW5rRGlyOiAnTFInfSxcbiAgICBmb3JjZTogZm9yY2VMYXlvdXQsXG4gICAgJ2ZvcmNlLWxvb3NlJzogZm9yY2VMYXlvdXRcbn07XG5cbmZ1bmN0aW9uIENhbGxiYWNrR3JhcGgoKSB7XG4gICAgLy8gR3JhYiBpdGVtcyBmcm9tIHRoZSByZWR1eCBzdG9yZS5cbiAgICBjb25zdCBwYXRocyA9IHVzZVNlbGVjdG9yKHN0YXRlID0+IHN0YXRlLnBhdGhzKTtcbiAgICBjb25zdCBsYXlvdXQgPSB1c2VTZWxlY3RvcihzdGF0ZSA9PiBzdGF0ZS5sYXlvdXQpO1xuICAgIGNvbnN0IGdyYXBocyA9IHVzZVNlbGVjdG9yKHN0YXRlID0+IHN0YXRlLmdyYXBocyk7XG4gICAgY29uc3QgcHJvZmlsZSA9IHVzZVNlbGVjdG9yKHN0YXRlID0+IHN0YXRlLnByb2ZpbGUpO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB1c2VTZWxlY3RvcihzdGF0ZSA9PiBzdGF0ZS5jaGFuZ2VkKTtcbiAgICBjb25zdCBsaWZlY3ljbGVTdGF0ZSA9IHVzZVNlbGVjdG9yKHN0YXRlID0+IHN0YXRlLmFwcExpZmVjeWNsZSk7XG5cbiAgICAvLyBLZWVwIHRyYWNrIG9mIGN5dG9zY2FwZSByZWZlcmVuY2UgYW5kIHVzZXIgc2VsZWN0ZWQgaXRlbXMuXG4gICAgY29uc3QgW3NlbGVjdGVkLCBzZXRTZWxlY3RlZF0gPSB1c2VTdGF0ZShudWxsKTtcbiAgICBjb25zdCBbY3l0b3NjYXBlLCBzZXRDeXRvc2NhcGVdID0gdXNlU3RhdGUobnVsbCk7XG5cbiAgICBjb25zdCB7Z3JhcGhMYXlvdXR9ID0gcHJvZmlsZTtcbiAgICBjb25zdCBjaG9zZW5UeXBlID0gZ3JhcGhMYXlvdXQ/Ll9jaG9zZW5UeXBlO1xuICAgIGNvbnN0IGxheW91dFNlbGVjdG9yID0gdXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IFtsYXlvdXRUeXBlLCBzZXRMYXlvdXRUeXBlXSA9IHVzZVN0YXRlKGNob3NlblR5cGUgfHwgJ3RvcC1kb3duJyk7XG5cbiAgICAvLyBHZW5lcmF0ZSBhbmQgbWVtb2l6ZSB0aGUgZWxlbWVudHMuXG4gICAgY29uc3QgZWxlbWVudHMgPSB1c2VNZW1vKFxuICAgICAgICAoKSA9PiBnZW5lcmF0ZUVsZW1lbnRzKGdyYXBocywgcHJvZmlsZSwgbGF5b3V0VHlwZSA9PT0gJ2ZvcmNlJyksXG4gICAgICAgIFtncmFwaHMsIGxheW91dFR5cGVdXG4gICAgKTtcblxuICAgIC8vIEN1c3RvbSBob29rIHRvIG1ha2Ugc3VyZSBjeXRvc2NhcGUgaXMgbG9hZGVkLlxuICAgIGNvbnN0IHVzZUN5dG9zY2FwZUVmZmVjdCA9IChlZmZlY3QsIGNvbmRpdGlvbikgPT4ge1xuICAgICAgICB1c2VFZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiAoY3l0b3NjYXBlICYmIGVmZmVjdChjeXRvc2NhcGUpKSB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb25kaXRpb25cbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50KGlkKSB7XG4gICAgICAgIC8vIGZvciBub3cgaWdub3JlIHBhdHRlcm4tbWF0Y2hpbmcgSURzXG4gICAgICAgIC8vIHRvIGRvIGJldHRlciB3ZSBtYXkgbmVlZCB0byBzdG9yZSB0aGUgKmFjdHVhbCogSURzIHVzZWQgZm9yIGVhY2hcbiAgICAgICAgLy8gY2FsbGJhY2sgaW52b2NhdGlvbiwgc2luY2UgdGhleSBuZWVkIG5vdCBtYXRjaCB3aGF0J3Mgb24gdGhlIHBhZ2Ugbm93LlxuICAgICAgICBpZiAoaWQuY2hhckF0KDApID09PSAneycpIHtcbiAgICAgICAgICAgIGhhc1BhdHRlcm5zID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaWRQYXRoID0gZ2V0UGF0aChwYXRocywgaWQpO1xuICAgICAgICByZXR1cm4gaWRQYXRoID8gcGF0aChpZFBhdGgsIGxheW91dCkgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UHJvcFZhbHVlKGRhdGEpIHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZ2V0Q29tcG9uZW50KGRhdGEucGFyZW50KTtcbiAgICAgICAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5wcm9wc1tkYXRhLmxhYmVsXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRQcmVzZXRMYXlvdXQoe2N5fSkge1xuICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSB7fTtcbiAgICAgICAgY3kubm9kZXMoKS5lYWNoKG4gPT4ge1xuICAgICAgICAgICAgcG9zaXRpb25zW24uaWQoKV0gPSBuLnBvc2l0aW9uKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEhhY2shIFdlJ3JlIG11dGF0aW5nIHRoZSByZWR1eCBzdG9yZSBkaXJlY3RseSBoZXJlLCByYXRoZXIgdGhhblxuICAgICAgICAvLyBkaXNwYXRjaGluZyBhbiBhY3Rpb24sIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0aGlzIHRvIHRyaWdnZXIgYVxuICAgICAgICAvLyByZXJlbmRlciwgd2UganVzdCB3YW50IHRoZSBsYXlvdXQgdG8gcGVyc2lzdCB3aGVuIHRoZSBjYWxsYmFjayBncmFwaFxuICAgICAgICAvLyBpcyByZXJlbmRlcmVkIC0gZWl0aGVyIGJlY2F1c2UgdGhlcmUncyBuZXcgcHJvZmlsZSBpbmZvcm1hdGlvbiB0b1xuICAgICAgICAvLyBkaXNwbGF5IG9yIGJlY2F1c2UgdGhlIGdyYXBoIHdhcyBjbG9zZWQgYW5kIHJlb3BlbmVkLiBUaGUgbGF0dGVyIGlzXG4gICAgICAgIC8vIHRoZSByZWFzb24gd2UncmUgbm90IHVzaW5nIGNvbXBvbmVudCBzdGF0ZSB0byBzdG9yZSB0aGUgbGF5b3V0LlxuICAgICAgICBwcm9maWxlLmdyYXBoTGF5b3V0ID0ge1xuICAgICAgICAgICAgbmFtZTogJ3ByZXNldCcsXG4gICAgICAgICAgICBmaXQ6IGZhbHNlLFxuICAgICAgICAgICAgcG9zaXRpb25zLFxuICAgICAgICAgICAgem9vbTogY3kuem9vbSgpLFxuICAgICAgICAgICAgcGFuOiBjeS5wYW4oKSxcbiAgICAgICAgICAgIF9jaG9zZW5UeXBlOiBsYXlvdXRTZWxlY3Rvci5jdXJyZW50Py52YWx1ZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEFkZHMgY2FsbGJhY2tzIG9uY2UgY3ljdG9zY2FwZSBpcyBpbml0aWFsaXplZC5cbiAgICB1c2VDeXRvc2NhcGVFZmZlY3QoXG4gICAgICAgIGN5ID0+IHtcbiAgICAgICAgICAgIGN5dG9zY2FwZS5vbigndGFwJywgJ25vZGUnLCBlID0+IHNldFNlbGVjdGVkKGUudGFyZ2V0KSk7XG4gICAgICAgICAgICBjeXRvc2NhcGUub24oJ3RhcCcsIGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlLnRhcmdldCA9PT0gY3kpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWQobnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjeXRvc2NhcGUub24oJ3pvb20nLCBzZXRQcmVzZXRMYXlvdXQpO1xuICAgICAgICAgICAgY3l0b3NjYXBlLm9uKCdwYW4nLCBzZXRQcmVzZXRMYXlvdXQpO1xuICAgICAgICAgICAgY3l0b3NjYXBlLm5vZGVzKCkub24oJ3Bvc2l0aW9uJywgc2V0UHJlc2V0TGF5b3V0KTtcbiAgICAgICAgfSxcbiAgICAgICAgW2N5dG9zY2FwZV1cbiAgICApO1xuXG4gICAgLy8gU2V0IG5vZGUgY2xhc3NlcyBvbiBzZWxlY3RlZC5cbiAgICB1c2VDeXRvc2NhcGVFZmZlY3QoXG4gICAgICAgIGN5ID0+IHNlbGVjdGVkICYmIHVwZGF0ZVNlbGVjdGVkTm9kZShjeSwgc2VsZWN0ZWQuZGF0YSgpLmlkKSxcbiAgICAgICAgW3NlbGVjdGVkXVxuICAgICk7XG5cbiAgICAvLyBGbGFzaCBjbGFzc2VzIHdoZW4gcHJvcHMgY2hhbmdlLiBVc2VzIGNoYW5nZWQgYXMgYSB0cmlnZ2VyLiBBbHNvXG4gICAgLy8gZmxhc2ggYWxsIGlucHV0IGVkZ2VzIG9yaWdpbmF0aW5nIGZyb20gdGhpcyBub2RlIGFuZCBoaWdobGlnaHRcbiAgICAvLyB0aGUgc3VidHJlZSB0aGF0IGNvbnRhaW5zIHRoZSBzZWxlY3RlZCBub2RlLlxuICAgIHVzZUN5dG9zY2FwZUVmZmVjdChcbiAgICAgICAgY3kgPT4gY2hhbmdlZCAmJiB1cGRhdGVDaGFuZ2VkUHJvcHMoY3ksIGNoYW5nZWQuaWQsIGNoYW5nZWQucHJvcHMpLFxuICAgICAgICBbY2hhbmdlZF1cbiAgICApO1xuXG4gICAgLy8gVXBkYXRlIGNhbGxiYWNrcyBmcm9tIHByb2ZpbGluZyBpbmZvcm1hdGlvbi5cbiAgICB1c2VDeXRvc2NhcGVFZmZlY3QoXG4gICAgICAgIGN5ID0+XG4gICAgICAgICAgICBwcm9maWxlLnVwZGF0ZWQuZm9yRWFjaChjYiA9PlxuICAgICAgICAgICAgICAgIHVwZGF0ZUNhbGxiYWNrKGN5LCBjYiwgcHJvZmlsZS5jYWxsYmFja3NbY2JdKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgW3Byb2ZpbGUudXBkYXRlZF1cbiAgICApO1xuXG4gICAgaWYgKGxpZmVjeWNsZVN0YXRlICE9PSAnSFlEUkFURUQnKSB7XG4gICAgICAgIC8vIElmIHdlIGdldCBoZXJlIHRvbyBlYXJseSAtIG1vc3QgbGlrZWx5IGR1cmluZyBob3QgcmVsb2FkaW5nIC0gdGhlblxuICAgICAgICAvLyB3ZSBuZWVkIHRvIGJhaWwgb3V0IGFuZCB3YWl0IGZvciB0aGUgZnVsbCBzdGF0ZSB0byBiZSBhdmFpbGFibGVcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWNhbGxiYWNrLWRhZy0tY29udGFpbmVyJz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1jYWxsYmFjay1kYWctLW1lc3NhZ2UnPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PldhaXRpbmcgZm9yIGFwcCB0byBiZSByZWFkeS4uLjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRklYTUU6IE1vdmUgdG8gYSBuZXcgY29tcG9uZW50P1xuICAgIC8vIEdlbmVyYXRlIHRoZSBlbGVtZW50IGludHJvc3BlY3Rpb24gZGF0YS5cbiAgICBsZXQgZWxlbWVudE5hbWUgPSAnJztcbiAgICBsZXQgZWxlbWVudEluZm8gPSB7fTtcbiAgICBsZXQgaGFzUGF0dGVybnMgPSBmYWxzZTtcblxuICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICBjb25zdCBkYXRhID0gc2VsZWN0ZWQuZGF0YSgpO1xuXG4gICAgICAgIHN3aXRjaCAoZGF0YS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdjb21wb25lbnQnOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdCA9IG9taXQoWydpZCddLCBnZXRDb21wb25lbnQoZGF0YS5pZCk/LnByb3BzKTtcbiAgICAgICAgICAgICAgICBlbGVtZW50SW5mbyA9IHJlc3Q7XG4gICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSBkYXRhLmlkO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdwcm9wZXJ0eSc6IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9IGRhdGEucGFyZW50O1xuICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvW2RhdGEubGFiZWxdID0gZ2V0UHJvcFZhbHVlKGRhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjYWxsYmFja1xuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvLnR5cGUgPSBkYXRhLm1vZGU7XG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdWlkIGFuZCBzZXQgcHJvZmlsZS5cbiAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFja091dHB1dElkID0gZGF0YS5pZC5zbGljZShjYlByZWZpeExlbik7XG4gICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSBjbGVhbk91dHB1dElkKGNhbGxiYWNrT3V0cHV0SWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNiUHJvZmlsZSA9IHByb2ZpbGUuY2FsbGJhY2tzW2NhbGxiYWNrT3V0cHV0SWRdO1xuICAgICAgICAgICAgICAgIGlmIChjYlByb2ZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgfSA9IGNiUHJvZmlsZTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdmcgPSB2ID0+IE1hdGgucm91bmQodiAvIChjb3VudCB8fCAxKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluZm9bJ2NhbGwgY291bnQnXSA9IGNvdW50O1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5mby5zdGF0dXMgPSByZWR1Y2VTdGF0dXMoc3RhdHVzKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1pbmcgPSAoZWxlbWVudEluZm9bJ3RpbWUgKGF2ZyBtaWxsaXNlY29uZHMpJ10gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbDogYXZnKHRvdGFsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGU6IGF2Zyhjb21wdXRlKVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubW9kZSA9PT0gJ3NlcnZlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWluZy5uZXR3b3JrID0gYXZnKG5ldHdvcmsudGltZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvWydkYXRhIHRyYW5zZmVyIChhdmcgYnl0ZXMpJ10gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWQ6IGF2ZyhuZXR3b3JrLmRvd25sb2FkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQ6IGF2ZyhuZXR3b3JrLnVwbG9hZClcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmVzb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1pbmdbJ3VzZXI6ICcgKyBrZXldID0gYXZnKHJlc291cmNlc1trZXldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvLm91dHB1dHMgPSBmbGF0dGVuT3V0cHV0cyhyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5mby5pbnB1dHMgPSBmbGF0dGVuSW5wdXRzKGlucHV0cywge30pO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5mby5zdGF0ZSA9IGZsYXR0ZW5JbnB1dHMoc3RhdGUsIHt9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5mb1snY2FsbCBjb3VudCddID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjeUxheW91dCA9XG4gICAgICAgIGNob3NlblR5cGUgPT09IGxheW91dFR5cGVcbiAgICAgICAgICAgID8gZ3JhcGhMYXlvdXRcbiAgICAgICAgICAgIDogbWVyZ2VSaWdodChsYXlvdXRzW2xheW91dFR5cGVdLCB7cmVhZHk6IHNldFByZXNldExheW91dH0pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtY2FsbGJhY2stZGFnLS1jb250YWluZXInPlxuICAgICAgICAgICAgPEN5dG9zY2FwZUNvbXBvbmVudFxuICAgICAgICAgICAgICAgIHN0eWxlPXt7d2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnMTAwJSd9fVxuICAgICAgICAgICAgICAgIGN5PXtzZXRDeXRvc2NhcGV9XG4gICAgICAgICAgICAgICAgZWxlbWVudHM9e2VsZW1lbnRzfVxuICAgICAgICAgICAgICAgIGxheW91dD17Y3lMYXlvdXR9XG4gICAgICAgICAgICAgICAgc3R5bGVzaGVldD17c3R5bGVzaGVldH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB7c2VsZWN0ZWQgPyAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtY2FsbGJhY2stZGFnLS1pbmZvJz5cbiAgICAgICAgICAgICAgICAgICAge2hhc1BhdHRlcm5zID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvIGlzbid0IHN1cHBvcnRlZCBmb3IgcGF0dGVybi1tYXRjaGluZyBJRHMgYXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHRpbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICAgICAgPEpTT05UcmVlXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhPXtlbGVtZW50SW5mb31cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lPSdzdW1tZXJmcnVpdCdcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsUmVuZGVyZXI9e19rZXlzID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2tleXMubGVuZ3RoID09PSAxID8gZWxlbWVudE5hbWUgOiBfa2V5c1swXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SXRlbVN0cmluZz17KHR5cGUsIGRhdGEsIGl0ZW1UeXBlKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e2l0ZW1UeXBlfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRFeHBhbmROb2RlPXsoa2V5TmFtZSwgZGF0YSwgbGV2ZWwpID0+IGxldmVsIDwgMX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nZGFzaC1jYWxsYmFjay1kYWctLWxheW91dFNlbGVjdG9yJ1xuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IHNldExheW91dFR5cGUoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgIHZhbHVlPXtsYXlvdXRUeXBlfVxuICAgICAgICAgICAgICAgIHJlZj17bGF5b3V0U2VsZWN0b3J9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2tleXMobGF5b3V0cykubWFwKGsgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPXtrfSBrZXk9e2t9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2t9XG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59XG5cbkNhbGxiYWNrR3JhcGgucHJvcFR5cGVzID0ge307XG5cbmNsYXNzIFVuY29ubmVjdGVkQ2FsbGJhY2tHcmFwaENvbnRhaW5lciBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnN0YXRlID0ge2hhc0Vycm9yOiBmYWxzZX07XG4gICAgfVxuXG4gICAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihfKSB7XG4gICAgICAgIHJldHVybiB7aGFzRXJyb3I6IHRydWV9O1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZENhdGNoKGVycm9yLCBpbmZvKSB7XG4gICAgICAgIGNvbnN0IHtkaXNwYXRjaH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgIG9uRXJyb3Ioe1xuICAgICAgICAgICAgICAgIG15SUQ6IHRoaXMuc3RhdGUubXlJRCxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZnJvbnRFbmQnLFxuICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgIGluZm9cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5oYXNFcnJvciA/IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWNhbGxiYWNrLWRhZy0tY29udGFpbmVyJz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1jYWxsYmFjay1kYWctLW1lc3NhZ2UnPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pk9vcHMhIFRoZSBjYWxsYmFjayBncmFwaCB0aHJldyBhbiBlcnJvci48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5DaGVjayB0aGUgZXJyb3IgbGlzdCBmb3IgZGV0YWlscy48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApIDogKFxuICAgICAgICAgICAgPENhbGxiYWNrR3JhcGggLz5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblVuY29ubmVjdGVkQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5wcm9wVHlwZXMgPSB7XG4gICAgZGlzcGF0Y2g6IFByb3BUeXBlcy5mdW5jXG59O1xuXG5jb25zdCBDYWxsYmFja0dyYXBoQ29udGFpbmVyID0gY29ubmVjdChudWxsLCBkaXNwYXRjaCA9PiAoe2Rpc3BhdGNofSkpKFxuICAgIFVuY29ubmVjdGVkQ2FsbGJhY2tHcmFwaENvbnRhaW5lclxuKTtcblxuZXhwb3J0IHtDYWxsYmFja0dyYXBoQ29udGFpbmVyfTtcbiIsImNvbnN0IHN0eWxlc2hlZXQgPSBbXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJyonLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgJ2ZvbnQtc2l6ZSc6IDEyLFxuICAgICAgICAgICAgJ2ZvbnQtZmFtaWx5JzogJ1wiQXJpYWxcIiwgc2Fucy1zZXJpZidcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnZWRnZScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICB3aWR0aDogMixcbiAgICAgICAgICAgICdsaW5lLWNvbG9yJzogJyM4ODg4ODgnLFxuICAgICAgICAgICAgJ3RhcmdldC1hcnJvdy1jb2xvcic6ICcjODg4ODg4JyxcbiAgICAgICAgICAgICd0YXJnZXQtYXJyb3ctc2hhcGUnOiAndHJpYW5nbGUnLFxuICAgICAgICAgICAgJ3RhcmdldC1hcnJvdy1maWxsJzogJ2ZpbGxlZCcsXG4gICAgICAgICAgICAnYXJyb3ctc2NhbGUnOiAxLFxuICAgICAgICAgICAgJ2N1cnZlLXN0eWxlJzogJ2JlemllcicsXG4gICAgICAgICAgICAnY29udHJvbC1wb2ludC1zdGVwLXNpemUnOiA0MCxcbiAgICAgICAgICAgICd0cmFuc2l0aW9uLXByb3BlcnR5JzogJ2xpbmUtY29sb3IsIHRhcmdldC1hcnJvdy1jb2xvcicsXG4gICAgICAgICAgICAndHJhbnNpdGlvbi1kdXJhdGlvbic6ICcwLjI1cycsXG4gICAgICAgICAgICAndHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nOiAnZWFzZS1pbi1vdXQtc2luZSdcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnZWRnZVt0eXBlPVwiaGlkZGVuXCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdlZGdlW3R5cGU9XCJvdXRwdXRcIl0nLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgJ2xpbmUtY29sb3InOiAnIzAwODBEMCcsXG4gICAgICAgICAgICAndGFyZ2V0LWFycm93LWNvbG9yJzogJyMwMDgwRDAnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ2VkZ2VbdHlwZT1cInN0YXRlXCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICdsaW5lLXN0eWxlJzogJ2Rhc2hlZCdcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnbm9kZScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBjb2xvcjogJyMzMzMzMzMnLFxuICAgICAgICAgICAgcGFkZGluZzogNixcbiAgICAgICAgICAgICd0ZXh0LXZhbGlnbic6ICdjZW50ZXInLFxuICAgICAgICAgICAgJ3RleHQtaGFsaWduJzogJ2NlbnRlcicsXG4gICAgICAgICAgICAnYm9yZGVyLXdpZHRoJzogMixcbiAgICAgICAgICAgICdib3JkZXItb3BhY2l0eSc6IDAsXG4gICAgICAgICAgICAnYm9yZGVyLXN0eWxlJzogJ3NvbGlkJyxcbiAgICAgICAgICAgICdib3JkZXItY29sb3InOiAnIzg4ODg4OCcsXG4gICAgICAgICAgICAndHJhbnNpdGlvbi1wcm9wZXJ0eSc6ICdib3JkZXItb3BhY2l0eScsXG4gICAgICAgICAgICAndHJhbnNpdGlvbi1kdXJhdGlvbic6ICcwLjI1cycsXG4gICAgICAgICAgICAndHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nOiAnZWFzZS1pbi1vdXQtc2luZSdcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnbm9kZVt0eXBlPVwiY2FsbGJhY2tcIl0nLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgd2lkdGg6IDM1LFxuICAgICAgICAgICAgaGVpZ2h0OiAyNSxcbiAgICAgICAgICAgIHNoYXBlOiAncm91bmQtcmVjdGFuZ2xlJyxcbiAgICAgICAgICAgIGxhYmVsOiBlID0+IGAke2UuZGF0YSgpLmNvdW50fVxcbiR7ZS5kYXRhKCkudGltZX0gbXNgLFxuICAgICAgICAgICAgJ3RleHQtd3JhcCc6ICd3cmFwJyxcbiAgICAgICAgICAgICd0ZXh0LWp1c3RpZmljYXRpb24nOiAnY2VudGVyJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdub2RlW3R5cGU9XCJjYWxsYmFja1wiXVttb2RlPVwiY2xpZW50XCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGNvbG9yOiAnIzMyMzMzMCcsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjRjBEQjRGJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdub2RlW3R5cGU9XCJjYWxsYmFja1wiXVttb2RlPVwic2VydmVyXCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGNvbG9yOiAnIzMyMzMzMCcsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjMDBDQzk2J1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdub2RlW3R5cGU9XCJjb21wb25lbnRcIl0sIG5vZGVbdHlwZT1cIndpbGRjYXJkXCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIHdpZHRoOiAnbGFiZWwnLFxuICAgICAgICAgICAgLy8gaGVpZ2h0OiAnbGFiZWwnLFxuICAgICAgICAgICAgc2hhcGU6ICdyZWN0YW5nbGUnLFxuICAgICAgICAgICAgY29udGVudDogZSA9PiBlLmRhdGEoKS5sYWJlbC5yZXBsYWNlKC9cIi9nLCAnJyksXG4gICAgICAgICAgICAndGV4dC12YWxpZ24nOiAndG9wJyxcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJyNCOUMyQ0UnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ25vZGVbdHlwZT1cInByb3BlcnR5XCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIHdpZHRoOiAnbGFiZWwnLFxuICAgICAgICAgICAgaGVpZ2h0OiAyMCxcbiAgICAgICAgICAgIHNoYXBlOiAncmVjdGFuZ2xlJyxcbiAgICAgICAgICAgIGNvbnRlbnQ6ICdkYXRhKGxhYmVsKScsXG4gICAgICAgICAgICBjb2xvcjogJ3doaXRlJyxcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJyMxMDlERkYnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJy5zZWxlY3RlZC1ub2RlJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGdob3N0OiAneWVzJyxcbiAgICAgICAgICAgICdnaG9zdC1vZmZzZXQteCc6IDIsXG4gICAgICAgICAgICAnZ2hvc3Qtb2Zmc2V0LXknOiAyLFxuICAgICAgICAgICAgJ2dob3N0LW9wYWNpdHknOiAwLjI1LFxuICAgICAgICAgICAgJ2JvcmRlci1vcGFjaXR5JzogMVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICcucHJvcC1jaGFuZ2VkLCAuY2FsbGJhY2stbG9hZGluZycsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJyNDQzQzQjcnLFxuICAgICAgICAgICAgJ2JvcmRlci13aWR0aCc6IDIsXG4gICAgICAgICAgICAnYm9yZGVyLW9wYWNpdHknOiAxXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJy5jYWxsYmFjay1lcnJvcicsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjRTEzMzJFJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICcudHJpZ2dlcmVkJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICdsaW5lLWNvbG9yJzogJyNDQzQzQjcnLFxuICAgICAgICAgICAgJ3RhcmdldC1hcnJvdy1jb2xvcic6ICcjQ0M0M0I3J1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICcuaW5hY3RpdmUnLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgb3BhY2l0eTogMC41XG4gICAgICAgIH1cbiAgICB9XG5dO1xuXG5leHBvcnQgZGVmYXVsdCBzdHlsZXNoZWV0O1xuIiwiaW1wb3J0IHtTVEFUVVMsIFNUQVRVU01BUH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL2NvbnN0YW50cyc7XG5cbi8qKlxuICogZ2V0RWRnZVR5cGVzXG4gKlxuICogRmluZHMgYWxsIGVkZ2VzIGNvbm5lY3RlZCB0byBhIG5vZGUgYW5kIHNwbGl0cyB0aGVtIGJ5IHR5cGUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG5vZGUgLSBDeXRvc2NhcGUgbm9kZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IC0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGVkZ2VzLCBzb3J0ZWQgYnkgdHlwZS5cbiAqL1xuZnVuY3Rpb24gZ2V0RWRnZVR5cGVzKG5vZGUpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IG5vZGUuY29ubmVjdGVkRWRnZXMoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbnB1dDogZWxlbWVudHMuZmlsdGVyKCdbdHlwZSA9IFwiaW5wdXRcIl0nKSxcbiAgICAgICAgc3RhdGU6IGVsZW1lbnRzLmZpbHRlcignW3R5cGUgPSBcInN0YXRlXCJdJyksXG4gICAgICAgIG91dHB1dDogZWxlbWVudHMuZmlsdGVyKCdbdHlwZSA9IFwib3V0cHV0XCJdJylcbiAgICB9O1xufVxuXG4vKipcbiAqIHVwZGF0ZVNlbGVjdGVkXG4gKlxuICogVXBkYXRlcyB0aGUgY2xhc3NlcyBvZiB0aGUgc2VsZWN0ZWQgbm9kZSBhbmQgcmVjZW50ZXJzIHRoZSB2aWV3cG9ydC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3kgLSBSZWZlcmVuY2UgdG8gdGhlIGN5dG9zY2FwZSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBpZCAtIFRoZSBpZCBvZiB0aGUgc2VsZWN0ZWQgbm9kZS5cbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gLSBjbGVhbnVwIGZ1bmN0aW9uLCBmb3IgdXNlRWZmZWN0IGhvb2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVNlbGVjdGVkTm9kZShjeSwgaWQpIHtcbiAgICBmdW5jdGlvbiBhc2NlbmQobm9kZSwgY29sbGVjdGlvbikge1xuICAgICAgICAvLyBGSVhNRTogU2hvdWxkIHdlIGluY2x1ZGUgU3RhdGUgcGFyZW50cyBidXQgbm9uLXJlY3Vyc2l2ZWx5P1xuICAgICAgICBjb25zdCB0eXBlID0gbm9kZS5kYXRhKCkudHlwZSA9PT0gJ2NhbGxiYWNrJyA/ICdpbnB1dCcgOiAnb3V0cHV0JztcbiAgICAgICAgY29uc3QgZWRnZXMgPSBnZXRFZGdlVHlwZXMobm9kZSlbdHlwZV07XG4gICAgICAgIGNvbnN0IHBhcmVudHMgPSBlZGdlcy5zb3VyY2VzKCk7XG4gICAgICAgIGNvbGxlY3Rpb24ubWVyZ2UoZWRnZXMpO1xuICAgICAgICBjb2xsZWN0aW9uLm1lcmdlKHBhcmVudHMpO1xuICAgICAgICBpZiAobm9kZS5kYXRhKCkudHlwZSA9PT0gJ3Byb3BlcnR5Jykge1xuICAgICAgICAgICAgY29sbGVjdGlvbi5tZXJnZShub2RlLmFuY2VzdG9ycygpKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnRzLmZvckVhY2gobm9kZSA9PiBhc2NlbmQobm9kZSwgY29sbGVjdGlvbikpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlc2NlbmQobm9kZSwgY29sbGVjdGlvbikge1xuICAgICAgICBjb25zdCB0eXBlID0gbm9kZS5kYXRhKCkudHlwZSA9PT0gJ2NhbGxiYWNrJyA/ICdvdXRwdXQnIDogJ2lucHV0JztcbiAgICAgICAgY29uc3QgZWRnZXMgPSBnZXRFZGdlVHlwZXMobm9kZSlbdHlwZV07XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZWRnZXMudGFyZ2V0cygpO1xuICAgICAgICBjb2xsZWN0aW9uLm1lcmdlKGVkZ2VzKTtcbiAgICAgICAgY29sbGVjdGlvbi5tZXJnZShjaGlsZHJlbik7XG4gICAgICAgIGlmIChub2RlLmRhdGEoKS50eXBlID09PSAncHJvcGVydHknKSB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uLm1lcmdlKG5vZGUuYW5jZXN0b3JzKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuLmZvckVhY2gobm9kZSA9PiBkZXNjZW5kKG5vZGUsIGNvbGxlY3Rpb24pKTtcbiAgICB9XG5cbiAgICBpZiAoaWQpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGlkKTtcblxuICAgICAgICAvLyBIaWdobGlnaHQgdGhlIHNlbGVjdGVkIG5vZGUuXG5cbiAgICAgICAgbm9kZS5hZGRDbGFzcygnc2VsZWN0ZWQtbm9kZScpO1xuXG4gICAgICAgIC8vIEZpbmQgdGhlIHN1YnRyZWUgdGhhdCB0aGUgbm9kZSBiZWxvbmdzIHRvLiBBIHN1YnRyZWUgY29udGFpbnNcbiAgICAgICAgLy8gYWxsIGFsbCBhbmNlc3RvcnMgYW5kIGRlc2NlbmRhbnRzIHRoYXQgYXJlIGNvbm5lY3RlZCB2aWEgSW5wdXRzXG4gICAgICAgIC8vIG9yIE91dHB1dHMgKGJ1dCBub3QgU3RhdGUpLlxuXG4gICAgICAgIC8vIFdBUk5JTkc6IE5vIGN5Y2xlIGRldGVjdGlvbiFcblxuICAgICAgICBjb25zdCBzdWJ0cmVlID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICBzdWJ0cmVlLm1lcmdlKG5vZGUpO1xuICAgICAgICBhc2NlbmQobm9kZSwgc3VidHJlZSk7XG4gICAgICAgIGRlc2NlbmQobm9kZSwgc3VidHJlZSk7XG5cbiAgICAgICAgY29uc3Qgb3RoZXIgPSBzdWJ0cmVlLmFic29sdXRlQ29tcGxlbWVudCgpO1xuICAgICAgICBvdGhlci5hZGRDbGFzcygnaW5hY3RpdmUnKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQtbm9kZScpO1xuICAgICAgICAgICAgb3RoZXIucmVtb3ZlQ2xhc3MoJ2luYWN0aXZlJyk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogdXBkYXRlQ2hhbmdlZFByb3BcbiAqXG4gKiBGbGFzaGVzIHByb3BlcnR5IG5vZGVzIHRoYXQgdXBkYXRlZCBhbmQgYW55IGlucHV0cyB0aGV5IGFyZSBjb25uZWN0ZWQgdG8uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGN5IC0gUmVmZXJlbmNlIHRvIHRoZSBjeXRvc2NhcGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBUaGUgY29tcG9uZW50IGlkIHdoaWNoIHVwZGF0ZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgLSBUaGUgcHJvcHMgdGhhdCB1cGRhdGVkLlxuICogQHBhcmFtIHtOdW1iZXJ9IGZsYXNoVGltZSAtIFRoZSB0aW1lIHRvIGZsYXNoIGNsYXNzZXMgZm9yIGluIG1zLlxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUNoYW5nZWRQcm9wcyhjeSwgaWQsIHByb3BzLCBmbGFzaFRpbWUgPSA1MDApIHtcbiAgICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGAke2lkfS4ke3Byb3B9YCk7XG4gICAgICAgIG5vZGUuZmxhc2hDbGFzcygncHJvcC1jaGFuZ2VkJywgZmxhc2hUaW1lKTtcbiAgICAgICAgbm9kZS5lZGdlc1RvKCcqJylcbiAgICAgICAgICAgIC5maWx0ZXIoJ1t0eXBlID0gXCJpbnB1dFwiXScpXG4gICAgICAgICAgICAuZmxhc2hDbGFzcygndHJpZ2dlcmVkJywgZmxhc2hUaW1lKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiB1cGRhdGVDYWxsYmFja1xuICpcbiAqIFVwZGF0ZXMgYSBjYWxsYmFjayBub2RlIHdpdGggcHJvZmlsaW5nIGluZm9ybWF0aW9uIChjYWxsIGNvdW50LCBhdmcgdGltZSlcbiAqIGFuZCBhZGRzIG9yIHJlbW92ZXMgY2xhc3NlcyBhcyBuZWNlc3NhcnkuIENsYXNzZXMgYXJlIGFsd2F5cyBhc3NlcnQgZm9yXG4gKiBhdCBsZWFzdCBmbGFzaFRpbWUgbXMgc28gdGhhdCB0aGV5IGNhbiBiZSB2aXN1YWxseSBvYnNlcnZlZC4gV2hlbiBjYWxsYmFja3NcbiAqIHJlc29sdmUsIGFsbCBvdXRwdXQgZWRnZXMgYXJlIGZsYXNoZWQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGN5IC0gUmVmZXJlbmNlIHRvIHRoZSBjeXRvc2NhcGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBUaGUgaWQgb2YgdGhlIGNhbGxiYWNrIChpLmUuLCBpdCdzIG91dHB1dCBpZGVudGlmaWVyKVxuICogQHBhcmFtIHtPYmplY3R9IHByb2ZpbGUgLSBUaGUgY2FsbGJhY2sgcHJvZmlsaW5nIGluZm9ybWF0aW9uLlxuICogQHBhcmFtIHtOdW1iZXJ9IGZsYXNoVGltZSAtIFRoZSB0aW1lIHRvIGZsYXNoIGNsYXNzZXMgZm9yIGluIG1zLlxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUNhbGxiYWNrKGN5LCBpZCwgcHJvZmlsZSwgZmxhc2hUaW1lID0gNTAwKSB7XG4gICAgY29uc3Qgbm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGBfX2Rhc2hfY2FsbGJhY2tfXy4ke2lkfWApO1xuICAgIGNvbnN0IHtjb3VudCwgdG90YWwsIHN0YXR1c30gPSBwcm9maWxlO1xuICAgIGNvbnN0IHtsYXRlc3R9ID0gc3RhdHVzO1xuXG4gICAgLy8gVXBkYXRlIGRhdGEuXG4gICAgY29uc3QgYXZnVGltZSA9IGNvdW50ID4gMCA/IHRvdGFsIC8gY291bnQgOiAwO1xuICAgIG5vZGUuZGF0YSgnY291bnQnLCBjb3VudCk7XG4gICAgbm9kZS5kYXRhKCd0aW1lJywgTWF0aC5yb3VuZChhdmdUaW1lKSk7XG5cbiAgICAvLyBFaXRoZXIgZmxhc2ggdGhlIGNsYXNzZXMgT1IgbWFpbnRhaW4gaXQgZm9yIGxvbmcgY2FsbGJhY2tzLlxuICAgIGlmIChsYXRlc3QgPT09ICdsb2FkaW5nJykge1xuICAgICAgICBub2RlLmRhdGEoJ2xvYWRpbmdTZXQnLCBEYXRlLm5vdygpKTtcbiAgICAgICAgbm9kZS5hZGRDbGFzcygnY2FsbGJhY2stbG9hZGluZycpO1xuICAgIH0gZWxzZSBpZiAobm9kZS5oYXNDbGFzcygnY2FsbGJhY2stbG9hZGluZycpKSB7XG4gICAgICAgIGNvbnN0IHRpbWVMZWZ0ID0gbm9kZS5kYXRhKCdsb2FkaW5nU2V0JykgKyBmbGFzaFRpbWUgLSBEYXRlLm5vdygpO1xuICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgKCkgPT4gbm9kZS5yZW1vdmVDbGFzcygnY2FsbGJhY2stbG9hZGluZycpLFxuICAgICAgICAgICAgTWF0aC5tYXgodGltZUxlZnQsIDApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgICBsYXRlc3QgIT09ICdsb2FkaW5nJyAmJlxuICAgICAgICBsYXRlc3QgIT09IFNUQVRVU01BUFtTVEFUVVMuT0tdICYmXG4gICAgICAgIGxhdGVzdCAhPT0gU1RBVFVTTUFQW1NUQVRVUy5QUkVWRU5UX1VQREFURV1cbiAgICApIHtcbiAgICAgICAgbm9kZS5kYXRhKCdlcnJvclNldCcsIERhdGUubm93KCkpO1xuICAgICAgICBub2RlLmFkZENsYXNzKCdjYWxsYmFjay1lcnJvcicpO1xuICAgIH0gZWxzZSBpZiAobm9kZS5oYXNDbGFzcygnY2FsbGJhY2stZXJyb3InKSkge1xuICAgICAgICBjb25zdCB0aW1lTGVmdCA9IG5vZGUuZGF0YSgnZXJyb3JTZXQnKSArIGZsYXNoVGltZSAtIERhdGUubm93KCk7XG4gICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAoKSA9PiBub2RlLnJlbW92ZUNsYXNzKCdjYWxsYmFjay1lcnJvcicpLFxuICAgICAgICAgICAgTWF0aC5tYXgodGltZUxlZnQsIDApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRklYTUU6IFRoaXMgd2lsbCBmbGFzaCBicmFuY2hlcyB0aGF0IHJldHVybiBub191cGRhdGUhIVxuICAgIC8vIElmIHRoZSBjYWxsYmFjayByZXNvbHZlZCBwcm9wZXJseSwgZmxhc2ggdGhlIG91dHB1dHMuXG4gICAgaWYgKGxhdGVzdCA9PT0gU1RBVFVTTUFQW1NUQVRVUy5PS10pIHtcbiAgICAgICAgbm9kZS5lZGdlc1RvKCcqJykuZmxhc2hDbGFzcygndHJpZ2dlcmVkJywgZmxhc2hUaW1lKTtcbiAgICB9XG59XG4iLCJpbXBvcnQge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7b25FcnJvciwgcmV2ZXJ0fSBmcm9tICcuLi8uLi9hY3Rpb25zJztcblxuY2xhc3MgQ29tcG9uZW50RXJyb3JCb3VuZGFyeSBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgbXlJRDogcHJvcHMuY29tcG9uZW50SWQsXG4gICAgICAgICAgICBvbGRDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGhhc0Vycm9yOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoXykge1xuICAgICAgICByZXR1cm4ge2hhc0Vycm9yOiB0cnVlfTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRDYXRjaChlcnJvciwgaW5mbykge1xuICAgICAgICBjb25zdCB7ZGlzcGF0Y2h9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICBvbkVycm9yKHtcbiAgICAgICAgICAgICAgICBteUlEOiB0aGlzLnN0YXRlLm15SUQsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2Zyb250RW5kJyxcbiAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICBpbmZvXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICBkaXNwYXRjaChyZXZlcnQpO1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgICAgICBjb25zdCBwcmV2Q2hpbGRyZW4gPSBwcmV2UHJvcHMuY2hpbGRyZW47XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICF0aGlzLnN0YXRlLmhhc0Vycm9yICYmXG4gICAgICAgICAgICBwcmV2Q2hpbGRyZW4gIT09IHByZXZTdGF0ZS5vbGRDaGlsZHJlbiAmJlxuICAgICAgICAgICAgcHJldkNoaWxkcmVuICE9PSB0aGlzLnByb3BzLmNoaWxkcmVuXG4gICAgICAgICkge1xuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWRpZC11cGRhdGUtc2V0LXN0YXRlICovXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBvbGRDaGlsZHJlbjogcHJldkNoaWxkcmVuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qge2hhc0Vycm9yLCBvbGRDaGlsZHJlbn0gPSB0aGlzLnN0YXRlO1xuICAgICAgICByZXR1cm4gaGFzRXJyb3IgPyBvbGRDaGlsZHJlbiA6IHRoaXMucHJvcHMuY2hpbGRyZW47XG4gICAgfVxufVxuXG5Db21wb25lbnRFcnJvckJvdW5kYXJ5LnByb3BUeXBlcyA9IHtcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBjb21wb25lbnRJZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBlcnJvcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBkaXNwYXRjaDogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbmV4cG9ydCBkZWZhdWx0IENvbXBvbmVudEVycm9yQm91bmRhcnk7XG4iLCJpbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCAnLi9Gcm9udEVuZEVycm9yLmNzcyc7XG5pbXBvcnQge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IENvbGxhcHNlSWNvbiBmcm9tICcuLi9pY29ucy9Db2xsYXBzZUljb24uc3ZnJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgJy4uL1BlcmN5LmNzcyc7XG5pbXBvcnQge3VybEJhc2V9IGZyb20gJy4uLy4uLy4uL2FjdGlvbnMvdXRpbHMnO1xuXG5pbXBvcnQgd2Vya3pldWdDc3MgZnJvbSAnLi4vd2Vya3pldWdjc3MnO1xuXG5jbGFzcyBGcm9udEVuZEVycm9yIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBjb2xsYXBzZWQ6IHRoaXMucHJvcHMuaXNMaXN0SXRlbVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qge2UsIGluQWxlcnRzVHJheX0gPSB0aGlzLnByb3BzO1xuICAgICAgICBjb25zdCB7Y29sbGFwc2VkfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgICAgY29uc3QgY2FyZENsYXNzZXMgPVxuICAgICAgICAgICAgJ2Rhc2gtZXJyb3ItY2FyZF9fY29udGVudCcgK1xuICAgICAgICAgICAgKGluQWxlcnRzVHJheSA/ICcgZGFzaC1lcnJvci1jYXJkLS1hbGVydHMtdHJheScgOiAnJyk7XG5cbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8taW5saW5lLWNvbW1lbnRzICovXG4gICAgICAgIGNvbnN0IGVycm9ySGVhZGVyID0gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvci10b3AgdGVzdC1kZXZ0b29scy1lcnJvci10b2dnbGUnXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdGhpcy5zZXRTdGF0ZSh7Y29sbGFwc2VkOiAhY29sbGFwc2VkfSl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yLXRvcF9fZ3JvdXAnPlxuICAgICAgICAgICAgICAgICAgICDim5HvuI9cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yX190aXRsZSc+XG4gICAgICAgICAgICAgICAgICAgICAgICB7ZS5lcnJvci5tZXNzYWdlIHx8ICdFcnJvcid9XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yLXRvcF9fZ3JvdXAnPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3JfX3RpbWVzdGFtcCBwZXJjeS1oaWRlJz5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtgJHtlLnRpbWVzdGFtcC50b0xvY2FsZVRpbWVTdHJpbmcoKX1gfVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvcl9fdGltZXN0YW1wIHBlcmN5LXNob3cnPlxuICAgICAgICAgICAgICAgICAgICAgICAgey8qIFNwZWNpYWwgcGVyY3kgdGltZXN0YW1wIGZvciB2aXN1YWwgdGVzdGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEhpZGRlbiBkdXJpbmcgcmVndWxhciB1c2FnZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqL31cbiAgICAgICAgICAgICAgICAgICAgICAgIDAwOjAwOjAwIFBNXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICA8Q29sbGFwc2VJY29uXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BkYXNoLWZlLWVycm9yX19jb2xsYXBzZSAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlZCA/ICdkYXNoLWZlLWVycm9yX19jb2xsYXBzZS0tZmxpcHBlZCcgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB0aGlzLnNldFN0YXRlKHtjb2xsYXBzZWQ6ICFjb2xsYXBzZWR9KX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1pbmxpbmUtY29tbWVudHMgKi9cblxuICAgICAgICByZXR1cm4gY29sbGFwc2VkID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZXJyb3ItY2FyZF9fbGlzdC1pdGVtJz57ZXJyb3JIZWFkZXJ9PC9kaXY+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y2FyZENsYXNzZXN9PlxuICAgICAgICAgICAgICAgIHtlcnJvckhlYWRlcn1cbiAgICAgICAgICAgICAgICA8RXJyb3JDb250ZW50IGVycm9yPXtlLmVycm9yfSAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5jb25zdCBNQVhfTUVTU0FHRV9MRU5HVEggPSA0MDtcbi8qIGVzbGludC1kaXNhYmxlIG5vLWlubGluZS1jb21tZW50cyAqL1xuZnVuY3Rpb24gVW5jb25uZWN0ZWRFcnJvckNvbnRlbnQoe2Vycm9yLCBiYXNlfSkge1xuICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdlcnJvci1jb250YWluZXInPlxuICAgICAgICAgICAgey8qXG4gICAgICAgICAgICAgKiA0MCBpcyBhIHJvdWdoIGhldXJpc3RpYyAtIGlmIGxvbmdlciB0aGFuIDQwIHRoZW4gdGhlXG4gICAgICAgICAgICAgKiBtZXNzYWdlIG1pZ2h0IG92ZXJmbG93IGludG8gZWxsaXBzZXMgaW4gdGhlIHRpdGxlIGFib3ZlICZcbiAgICAgICAgICAgICAqIHdpbGwgbmVlZCB0byBiZSBkaXNwbGF5ZWQgaW4gZnVsbCBpbiB0aGlzIGVycm9yIGJvZHlcbiAgICAgICAgICAgICAqL31cbiAgICAgICAgICAgIHt0eXBlb2YgZXJyb3IubWVzc2FnZSAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UubGVuZ3RoIDwgTUFYX01FU1NBR0VfTEVOR1RIID8gbnVsbCA6IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvcl9fc3QnPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvcl9faW5mbyBkYXNoLWZlLWVycm9yX19jdXJ2ZWQnPlxuICAgICAgICAgICAgICAgICAgICAgICAge2Vycm9yLm1lc3NhZ2V9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAge3R5cGVvZiBlcnJvci5zdGFjayAhPT0gJ3N0cmluZycgPyBudWxsIDogKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yX19zdCc+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yX19pbmZvJz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkZXRhaWxzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdW1tYXJ5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUaGlzIGVycm9yIG9yaWdpbmF0ZWQgZnJvbSB0aGUgYnVpbHQtaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFTY3JpcHQgY29kZSB0aGF0IHJ1bnMgRGFzaCBhcHBzLiBDbGlja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2VlIHRoZSBmdWxsIHN0YWNrIHRyYWNlIG9yIG9wZW4geW91clxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJvd3NlcidzIGNvbnNvbGUuKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdW1tYXJ5PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2Vycm9yLnN0YWNrLnNwbGl0KCdcXG4nKS5tYXAoKGxpbmUsIGkpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAga2V5PXtpfT57bGluZX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2RldGFpbHM+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHsvKiBCYWNrZW5kIEVycm9yICovfVxuICAgICAgICAgICAge3R5cGVvZiBlcnJvci5odG1sICE9PSAnc3RyaW5nJyA/IG51bGwgOiBlcnJvci5odG1sXG4gICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsICc8IWRvY3R5cGUnLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpID09PSAnPCFkb2N0eXBlJyA/IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1iZS1lcnJvcl9fc3QnPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1iYWNrZW5kLWVycm9yJz5cbiAgICAgICAgICAgICAgICAgICAgICAgIHsvKiBFbWJlZCB3ZXJremV1ZyBkZWJ1Z2dlciBpbiBhbiBpZnJhbWUgdG8gcHJldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgQ1NTIGxlYWtpbmcgLSB3ZXJremV1ZyBIVE1MIGluY2x1ZGVzIGEgYnVuY2hcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mIENTUyBvbiBiYXNlIGh0bWwgZWxlbWVudHMgbGlrZSBgPGJvZHkvPmBcbiAgICAgICAgICAgICAgICAgICAgICAqL31cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGlmcmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RvYz17ZXJyb3IuaHRtbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2hlYWQ+JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+JHt3ZXJremV1Z0Nzc308L3N0eWxlPjwvaGVhZD5gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPVwiP19fZGVidWdnZXJfXycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgPVwiJHtiYXNlfT9fX2RlYnVnZ2VyX19gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogNjdweCBvZiBwYWRkaW5nIGFuZCBtYXJnaW4gYmV0d2VlbiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGlmcmFtZSBhbmQgdGhlIHBhcmVudCBjb250YWluZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDY3IHdhcyBkZXRlcm1pbmVkIG1hbnVhbGx5IGluIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBicm93c2VyJ3MgZGV2IHRvb2xzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICdjYWxjKDYwMHB4IC0gNjdweCknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICc3NXZoJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAnbm9uZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWJlLWVycm9yX19zdHInPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1iYWNrZW5kLWVycm9yJz57ZXJyb3IuaHRtbH08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG5vLWlubGluZS1jb21tZW50cyAqL1xuXG5jb25zdCBlcnJvclByb3BUeXBlcyA9IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgbWVzc2FnZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAgIC8qIGZyb250LWVuZCBlcnJvciBtZXNzYWdlcyAqL1xuICAgIHN0YWNrOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gICAgLyogYmFja2VuZCBlcnJvciBtZXNzYWdlcyAqL1xuICAgIGh0bWw6IFByb3BUeXBlcy5zdHJpbmdcbn0pO1xuXG5VbmNvbm5lY3RlZEVycm9yQ29udGVudC5wcm9wVHlwZXMgPSB7XG4gICAgZXJyb3I6IGVycm9yUHJvcFR5cGVzLFxuICAgIGJhc2U6IFByb3BUeXBlcy5zdHJpbmdcbn07XG5cbmNvbnN0IEVycm9yQ29udGVudCA9IGNvbm5lY3Qoc3RhdGUgPT4gKHtiYXNlOiB1cmxCYXNlKHN0YXRlLmNvbmZpZyl9KSkoXG4gICAgVW5jb25uZWN0ZWRFcnJvckNvbnRlbnRcbik7XG5cbkZyb250RW5kRXJyb3IucHJvcFR5cGVzID0ge1xuICAgIGU6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgIHRpbWVzdGFtcDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgICAgZXJyb3I6IGVycm9yUHJvcFR5cGVzXG4gICAgfSksXG4gICAgaW5BbGVydHNUcmF5OiBQcm9wVHlwZXMuYm9vbCxcbiAgICBpc0xpc3RJdGVtOiBQcm9wVHlwZXMuYm9vbFxufTtcblxuRnJvbnRFbmRFcnJvci5kZWZhdWx0UHJvcHMgPSB7XG4gICAgaW5BbGVydHNUcmF5OiBmYWxzZSxcbiAgICBpc0xpc3RJdGVtOiBmYWxzZVxufTtcblxuZXhwb3J0IHtGcm9udEVuZEVycm9yfTtcbiIsImltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0ICcuL0Zyb250RW5kRXJyb3IuY3NzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge0Zyb250RW5kRXJyb3J9IGZyb20gJy4vRnJvbnRFbmRFcnJvci5yZWFjdCc7XG5cbmNsYXNzIEZyb250RW5kRXJyb3JDb250YWluZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHtlcnJvcnMsIGNvbm5lY3RlZCwgZXJyb3JzT3BlbmVkLCBjbGlja0hhbmRsZXJ9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY29uc3QgZXJyb3JzTGVuZ3RoID0gZXJyb3JzLmxlbmd0aDtcbiAgICAgICAgaWYgKGVycm9yc0xlbmd0aCA9PT0gMCB8fCAhZXJyb3JzT3BlbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluQWxlcnRzVHJheSA9IHRoaXMucHJvcHMuaW5BbGVydHNUcmF5O1xuICAgICAgICBsZXQgY2FyZENsYXNzZXMgPSAnZGFzaC1lcnJvci1jYXJkIGRhc2gtZXJyb3ItY2FyZC0tY29udGFpbmVyJztcblxuICAgICAgICBjb25zdCBlcnJvckVsZW1lbnRzID0gZXJyb3JzLm1hcCgoZXJyb3IsIGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiA8RnJvbnRFbmRFcnJvciBlPXtlcnJvcn0gaXNMaXN0SXRlbT17dHJ1ZX0ga2V5PXtpfSAvPjtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpbkFsZXJ0c1RyYXkpIHtcbiAgICAgICAgICAgIGNhcmRDbGFzc2VzICs9ICcgZGFzaC1lcnJvci1jYXJkLS1hbGVydHMtdHJheSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjYXJkQ2xhc3Nlc30+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZXJyb3ItY2FyZF9fdG9wYmFyJz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZXJyb3ItY2FyZF9fbWVzc2FnZSc+XG4gICAgICAgICAgICAgICAgICAgICAgICDwn5uRIEVycm9ycyAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGNsYXNzTmFtZT0ndGVzdC1kZXZ0b29scy1lcnJvci1jb3VudCc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2Vycm9yc0xlbmd0aH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICAgICAgKXtjb25uZWN0ZWQgPyBudWxsIDogJ1xcdTAwYTAg8J+aqyBTZXJ2ZXIgVW5hdmFpbGFibGUnfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yX19pY29uLXgnXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBjbGlja0hhbmRsZXIoKX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgw5dcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZXJyb3ItY2FyZF9fbGlzdCc+e2Vycm9yRWxlbWVudHN9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbkZyb250RW5kRXJyb3JDb250YWluZXIucHJvcFR5cGVzID0ge1xuICAgIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGVycm9yczogUHJvcFR5cGVzLmFycmF5LFxuICAgIGNvbm5lY3RlZDogUHJvcFR5cGVzLmJvb2wsXG4gICAgaW5BbGVydHNUcmF5OiBQcm9wVHlwZXMuYW55LFxuICAgIGVycm9yc09wZW5lZDogUHJvcFR5cGVzLmFueSxcbiAgICBjbGlja0hhbmRsZXI6IFByb3BUeXBlcy5mdW5jXG59O1xuXG5Gcm9udEVuZEVycm9yQ29udGFpbmVyLnByb3BUeXBlcyA9IHtcbiAgICBpbkFsZXJ0c1RyYXk6IFByb3BUeXBlcy5hbnlcbn07XG5cbmV4cG9ydCB7RnJvbnRFbmRFcnJvckNvbnRhaW5lcn07XG4iLCJpbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7RGVidWdNZW51fSBmcm9tICcuL21lbnUvRGVidWdNZW51LnJlYWN0JztcblxuY2xhc3MgVW5jb25uZWN0ZWRHbG9iYWxFcnJvckNvbnRhaW5lciBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qge2NvbmZpZywgZXJyb3IsIGNoaWxkcmVufSA9IHRoaXMucHJvcHM7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGlkPSdfZGFzaC1nbG9iYWwtZXJyb3ItY29udGFpbmVyJz5cbiAgICAgICAgICAgICAgICA8RGVidWdNZW51IGVycm9yPXtlcnJvcn0gaG90UmVsb2FkPXtCb29sZWFuKGNvbmZpZy5ob3RfcmVsb2FkKX0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9J19kYXNoLWFwcC1jb250ZW50Jz57Y2hpbGRyZW59PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9EZWJ1Z01lbnU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblVuY29ubmVjdGVkR2xvYmFsRXJyb3JDb250YWluZXIucHJvcFR5cGVzID0ge1xuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGNvbmZpZzogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBlcnJvcjogUHJvcFR5cGVzLm9iamVjdFxufTtcblxuY29uc3QgR2xvYmFsRXJyb3JDb250YWluZXIgPSBjb25uZWN0KHN0YXRlID0+ICh7XG4gICAgY29uZmlnOiBzdGF0ZS5jb25maWcsXG4gICAgZXJyb3I6IHN0YXRlLmVycm9yXG59KSkoVW5jb25uZWN0ZWRHbG9iYWxFcnJvckNvbnRhaW5lcik7XG5cbmV4cG9ydCBkZWZhdWx0IEdsb2JhbEVycm9yQ29udGFpbmVyO1xuIiwiaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHtjb25jYXR9IGZyb20gJ3JhbWRhJztcblxuaW1wb3J0ICcuL0dsb2JhbEVycm9yT3ZlcmxheS5jc3MnO1xuaW1wb3J0IHtGcm9udEVuZEVycm9yQ29udGFpbmVyfSBmcm9tICcuL0Zyb250RW5kL0Zyb250RW5kRXJyb3JDb250YWluZXIucmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHbG9iYWxFcnJvck92ZXJsYXkgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHt2aXNpYmxlLCBlcnJvciwgZXJyb3JzT3BlbmVkLCBjbGlja0hhbmRsZXJ9ID0gdGhpcy5wcm9wcztcblxuICAgICAgICBsZXQgZnJvbnRFbmRFcnJvcnM7XG4gICAgICAgIGlmIChlcnJvcnNPcGVuZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IGNvbmNhdChlcnJvci5mcm9udEVuZCwgZXJyb3IuYmFja0VuZCk7XG5cbiAgICAgICAgICAgIGZyb250RW5kRXJyb3JzID0gKFxuICAgICAgICAgICAgICAgIDxGcm9udEVuZEVycm9yQ29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycz17ZXJyb3JzfVxuICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQ9e2Vycm9yLmJhY2tFbmRDb25uZWN0ZWR9XG4gICAgICAgICAgICAgICAgICAgIGVycm9yc09wZW5lZD17ZXJyb3JzT3BlbmVkfVxuICAgICAgICAgICAgICAgICAgICBjbGlja0hhbmRsZXI9e2NsaWNrSGFuZGxlcn1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2Pnt0aGlzLnByb3BzLmNoaWxkcmVufTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWVycm9yLW1lbnUnPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17dmlzaWJsZSA/ICdkYXNoLWZlLWVycm9ycycgOiAnJ30+XG4gICAgICAgICAgICAgICAgICAgICAgICB7ZnJvbnRFbmRFcnJvcnN9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5HbG9iYWxFcnJvck92ZXJsYXkucHJvcFR5cGVzID0ge1xuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIHZpc2libGU6IFByb3BUeXBlcy5ib29sLFxuICAgIGVycm9yOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGVycm9yc09wZW5lZDogUHJvcFR5cGVzLmFueSxcbiAgICBjbGlja0hhbmRsZXI6IFByb3BUeXBlcy5mdW5jXG59O1xuIiwiaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5pbXBvcnQgJy4vRGVidWdNZW51LmNzcyc7XG5cbmltcG9ydCBCZWxsSWNvbiBmcm9tICcuLi9pY29ucy9CZWxsSWNvbi5zdmcnO1xuaW1wb3J0IENoZWNrSWNvbiBmcm9tICcuLi9pY29ucy9DaGVja0ljb24uc3ZnJztcbmltcG9ydCBDbG9ja0ljb24gZnJvbSAnLi4vaWNvbnMvQ2xvY2tJY29uLnN2Zyc7XG5pbXBvcnQgRGVidWdJY29uIGZyb20gJy4uL2ljb25zL0RlYnVnSWNvbi5zdmcnO1xuaW1wb3J0IEdyYXBoSWNvbiBmcm9tICcuLi9pY29ucy9HcmFwaEljb24uc3ZnJztcbmltcG9ydCBPZmZJY29uIGZyb20gJy4uL2ljb25zL09mZkljb24uc3ZnJztcblxuaW1wb3J0IEdsb2JhbEVycm9yT3ZlcmxheSBmcm9tICcuLi9HbG9iYWxFcnJvck92ZXJsYXkucmVhY3QnO1xuaW1wb3J0IHtDYWxsYmFja0dyYXBoQ29udGFpbmVyfSBmcm9tICcuLi9DYWxsYmFja0dyYXBoL0NhbGxiYWNrR3JhcGhDb250YWluZXIucmVhY3QnO1xuXG5jb25zdCBjbGFzc2VzID0gKGJhc2UsIHZhcmlhbnQsIHZhcmlhbnQyKSA9PlxuICAgIGAke2Jhc2V9ICR7YmFzZX0tLSR7dmFyaWFudH1gICsgKHZhcmlhbnQyID8gYCAke2Jhc2V9LS0ke3ZhcmlhbnQyfWAgOiAnJyk7XG5cbmNvbnN0IGJ1dHRvbkZhY3RvcnkgPSAoXG4gICAgZW5hYmxlZCxcbiAgICBidXR0b25WYXJpYW50LFxuICAgIHRvZ2dsZSxcbiAgICBfSWNvbixcbiAgICBpY29uVmFyaWFudCxcbiAgICBsYWJlbFxuKSA9PiAoXG4gICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9fYnV0dG9uLWNvbnRhaW5lcic+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NlcyhcbiAgICAgICAgICAgICAgICAnZGFzaC1kZWJ1Zy1tZW51X19idXR0b24nLFxuICAgICAgICAgICAgICAgIGJ1dHRvblZhcmlhbnQsXG4gICAgICAgICAgICAgICAgZW5hYmxlZCAmJiAnZW5hYmxlZCdcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICBvbkNsaWNrPXt0b2dnbGV9XG4gICAgICAgID5cbiAgICAgICAgICAgIDxfSWNvbiBjbGFzc05hbWU9e2NsYXNzZXMoJ2Rhc2gtZGVidWctbWVudV9faWNvbicsIGljb25WYXJpYW50KX0gLz5cbiAgICAgICAgICAgIHtsYWJlbCA/IChcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi1sYWJlbCc+e2xhYmVsfTwvbGFiZWw+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4pO1xuXG5jbGFzcyBEZWJ1Z01lbnUgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgb3BlbmVkOiBmYWxzZSxcbiAgICAgICAgICAgIGNhbGxiYWNrR3JhcGhPcGVuZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3JzT3BlbmVkOiB0cnVlXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qge29wZW5lZCwgZXJyb3JzT3BlbmVkLCBjYWxsYmFja0dyYXBoT3BlbmVkfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGNvbnN0IHtlcnJvciwgaG90UmVsb2FkfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgICAgY29uc3QgZXJyQ291bnQgPSBlcnJvci5mcm9udEVuZC5sZW5ndGggKyBlcnJvci5iYWNrRW5kLmxlbmd0aDtcbiAgICAgICAgY29uc3QgY29ubmVjdGVkID0gZXJyb3IuYmFja0VuZENvbm5lY3RlZDtcblxuICAgICAgICBjb25zdCB0b2dnbGVFcnJvcnMgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtlcnJvcnNPcGVuZWQ6ICFlcnJvcnNPcGVuZWR9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBzdGF0dXMgPSBob3RSZWxvYWRcbiAgICAgICAgICAgID8gY29ubmVjdGVkXG4gICAgICAgICAgICAgICAgPyAnYXZhaWxhYmxlJ1xuICAgICAgICAgICAgICAgIDogJ3VuYXZhaWxhYmxlJ1xuICAgICAgICAgICAgOiAnY29sZCc7XG4gICAgICAgIGNvbnN0IF9TdGF0dXNJY29uID0gaG90UmVsb2FkXG4gICAgICAgICAgICA/IGNvbm5lY3RlZFxuICAgICAgICAgICAgICAgID8gQ2hlY2tJY29uXG4gICAgICAgICAgICAgICAgOiBPZmZJY29uXG4gICAgICAgICAgICA6IENsb2NrSWNvbjtcblxuICAgICAgICBjb25zdCBtZW51Q29udGVudCA9IG9wZW5lZCA/IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX2NvbnRlbnQnPlxuICAgICAgICAgICAgICAgIHtjYWxsYmFja0dyYXBoT3BlbmVkID8gPENhbGxiYWNrR3JhcGhDb250YWluZXIgLz4gOiBudWxsfVxuICAgICAgICAgICAgICAgIHtidXR0b25GYWN0b3J5KFxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0dyYXBoT3BlbmVkLFxuICAgICAgICAgICAgICAgICAgICAnY2FsbGJhY2tzJyxcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tHcmFwaE9wZW5lZDogIWNhbGxiYWNrR3JhcGhPcGVuZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBHcmFwaEljb24sXG4gICAgICAgICAgICAgICAgICAgICdncmFwaCcsXG4gICAgICAgICAgICAgICAgICAgICdDYWxsYmFja3MnXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICB7YnV0dG9uRmFjdG9yeShcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzT3BlbmVkLFxuICAgICAgICAgICAgICAgICAgICAnZXJyb3JzJyxcbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlRXJyb3JzLFxuICAgICAgICAgICAgICAgICAgICBCZWxsSWNvbixcbiAgICAgICAgICAgICAgICAgICAgJ2JlbGwnLFxuICAgICAgICAgICAgICAgICAgICBlcnJDb3VudCArICcgRXJyb3InICsgKGVyckNvdW50ID09PSAxID8gJycgOiAncycpXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICB7YnV0dG9uRmFjdG9yeShcbiAgICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgX1N0YXR1c0ljb24sXG4gICAgICAgICAgICAgICAgICAgICdpbmRpY2F0b3InLFxuICAgICAgICAgICAgICAgICAgICAnU2VydmVyJ1xuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX2NvbnRlbnQnIC8+XG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYWxlcnRzTGFiZWwgPVxuICAgICAgICAgICAgKGVyckNvdW50IHx8ICFjb25uZWN0ZWQpICYmICFvcGVuZWQgPyAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZGVidWctYWxlcnQtbGFiZWwnPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1hbGVydCcgb25DbGljaz17dG9nZ2xlRXJyb3JzfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJDb3VudCA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1lcnJvci1jb3VudCc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsn8J+bkSAnICsgZXJyQ291bnR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb25uZWN0ZWQgPyBudWxsIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLWRpc2Nvbm5lY3RlZCc+8J+aqzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApIDogbnVsbDtcblxuICAgICAgICBjb25zdCBvcGVuVmFyaWFudCA9IG9wZW5lZCA/ICdvcGVuJyA6ICdjbG9zZWQnO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIHthbGVydHNMYWJlbH1cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NlcygnZGFzaC1kZWJ1Zy1tZW51X19vdXRlcicsIG9wZW5WYXJpYW50KX0+XG4gICAgICAgICAgICAgICAgICAgIHttZW51Q29udGVudH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NlcygnZGFzaC1kZWJ1Zy1tZW51Jywgb3BlblZhcmlhbnQpfVxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtvcGVuZWQ6ICFvcGVuZWR9KTtcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxEZWJ1Z0ljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NlcygnZGFzaC1kZWJ1Zy1tZW51X19pY29uJywgJ2RlYnVnJyl9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPEdsb2JhbEVycm9yT3ZlcmxheVxuICAgICAgICAgICAgICAgICAgICBlcnJvcj17ZXJyb3J9XG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU9e2VyckNvdW50ID4gMH1cbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzT3BlbmVkPXtlcnJvcnNPcGVuZWR9XG4gICAgICAgICAgICAgICAgICAgIGNsaWNrSGFuZGxlcj17dG9nZ2xlRXJyb3JzfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMucHJvcHMuY2hpbGRyZW59XG4gICAgICAgICAgICAgICAgPC9HbG9iYWxFcnJvck92ZXJsYXk+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbkRlYnVnTWVudS5wcm9wVHlwZXMgPSB7XG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZXJyb3I6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgaG90UmVsb2FkOiBQcm9wVHlwZXMuYm9vbFxufTtcblxuZXhwb3J0IHtEZWJ1Z01lbnV9O1xuIiwiLy8gV2Vya3pldWcgY3NzIGluY2x1ZGVkIGFzIGEgc3RyaW5nLCBiZWNhdXNlIHdlIHdhbnQgdG8gaW5qZWN0XG4vLyBpdCBpbnRvIGFuIGlmcmFtZSBzcmNEb2NcblxuZXhwb3J0IGRlZmF1bHQgYFxuYm9keSB7XG4gICAgbWFyZ2luOiAwcHg7XG4gICAgbWFyZ2luLXRvcDogMTBweDtcbn1cblxuLmVycm9yLWNvbnRhaW5lciB7XG4gICAgZm9udC1mYW1pbHk6IFJvYm90bztcbn1cblxuLnRyYWNlYmFjayB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcbiAgICBib3JkZXItcmFkaXVzOiAwcHggMHB4IDRweCA0cHg7XG4gICAgY29sb3I6ICM1MDY3ODQ7XG59XG5cbmgyLnRyYWNlYmFjayB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YzZjZmYTtcbiAgICBib3JkZXI6IDJweCBzb2xpZCAjZGZlOGYzO1xuICAgIGJvcmRlci1ib3R0b206IDBweDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweCA0cHggMHB4IDBweDtcbiAgICBjb2xvcjogIzUwNjc4NDtcbn1cblxuaDIudHJhY2ViYWNrIGVtIHtcbiAgICBjb2xvcjogIzUwNjc4NDtcbiAgICBmb250LXdlaWdodDogMTAwO1xufVxuXG4udHJhY2ViYWNrIHByZSwgLmRlYnVnZ2VyIHRleHRhcmVhIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjNGNkZBO1xufVxuXG4uZGVidWdnZXIgaDEge1xuICAgIGNvbG9yOiAjNTA2Nzg0O1xuICAgIGZvbnQtZmFtaWx5OiBSb2JvdG87XG59XG5cbi5leHBsYW5hdGlvbiB7XG4gICAgY29sb3I6ICNBMkIxQzY7XG59XG5cbi8qIEhpZGUgdGhlIERvbid0IFBhbmljISBmb290ZXIgKi9cbi5kZWJ1Z2dlciAuZm9vdGVyIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4vKiBIaWRlIGFsbCBvZiB0aGUgRGFzaCB0cmFjZWJhY2sgc3R1ZmYgdGhhdCBsZWFkcyB1cCB0byB0aGUgY2FsbCAqL1xuLmxpbmUuYmVmb3JlIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG5kaXYuZGVidWdnZXIge1xuICAgIHBhZGRpbmc6IDBweDtcbn1cblxuLmRlYnVnZ2VyIGgxIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4uZGVidWdnZXIgLmVycm9ybXNnIHtcbiAgICBtYXJnaW46IDA7XG4gICAgY29sb3I6ICM1MDY3ODQ7XG4gICAgZm9udC1zaXplOiAxNnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2Y2ZmE7XG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBwYWRkaW5nOiAxMHB4O1xufVxuXG4uZGVidWdnZXIgLnBhc3RlbWVzc2FnZSBpbnB1dCB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmRlYnVnZ2VyIC5leHBsYW5hdGlvbiB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmRlYnVnZ2VyIGRpdi5wbGFpbiB7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIGJvcmRlci13aWR0aDogMnB4O1xuICAgIGNvbG9yOiAjNTA2Nzg0O1xufVxuXG4ucGxhaW4ge1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG59XG4ucGxhaW4gPiBmb3JtID4gcCB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cbi5wbGFpbiBwcmUge1xuICAgIHBhZGRpbmc6IDE1cHggIWltcG9ydGFudDtcbiAgICBvdmVyZmxvdy14OiBzY3JvbGw7XG59XG5cbi5kZWJ1Z2dlciBkaXYudHJhY2ViYWNrIHByZSB7XG4gICAgY3Vyc29yOiBkZWZhdWx0O1xufVxuXG4uZGVidWdnZXIgLnRyYWNlYmFjayAuc291cmNlIHByZS5saW5lIGltZyB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cbmA7XG4iLCJleHBvcnQgY29uc3QgUkVESVJFQ1RfVVJJX1BBVEhOQU1FID0gJy9fb2F1dGgyL2NhbGxiYWNrJztcbmV4cG9ydCBjb25zdCBPQVVUSF9DT09LSUVfTkFNRSA9ICdwbG90bHlfb2F1dGhfdG9rZW4nO1xuZXhwb3J0IGNvbnN0IEpXVF9FWFBJUkVEX01FU1NBR0UgPSAnSldUIEV4cGlyZWQnO1xuXG5leHBvcnQgY29uc3QgU1RBVFVTID0ge1xuICAgIE9LOiAyMDAsXG4gICAgUFJFVkVOVF9VUERBVEU6IDIwNCxcbiAgICAvLyBXZSBhY2NlcHQgYm90aCA0MDAgYW5kIDQwMSBmb3IgSldUIHRva2VuIGV4cGlyeSByZXNwb25zZXMuXG4gICAgLy8gU29tZSBzZXJ2ZXJzIHVzZSBjb2RlIDQwMCBmb3IgZXhwaXJlZCB0b2tlbnMsIGJlY2F1c2VcbiAgICAvLyB0aGV5IHJlc2VydmUgNDAxIGZvciBjYXNlcyB0aGF0IHJlcXVpcmUgdXNlciBhY3Rpb25cbiAgICBCQURfUkVRVUVTVDogNDAwLFxuICAgIFVOQVVUSE9SSVpFRDogNDAxLFxuICAgIENMSUVOVFNJREVfRVJST1I6ICdDTElFTlRTSURFX0VSUk9SJyxcbiAgICBOT19SRVNQT05TRTogJ05PX1JFU1BPTlNFJ1xufTtcblxuZXhwb3J0IGNvbnN0IFNUQVRVU01BUCA9IHtcbiAgICBbU1RBVFVTLk9LXTogJ1NVQ0NFU1MnLFxuICAgIFtTVEFUVVMuUFJFVkVOVF9VUERBVEVdOiAnTk9fVVBEQVRFJ1xufTtcbiIsImltcG9ydCB7aGFzLCBpbmNsdWRlc30gZnJvbSAncmFtZGEnO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJvcFR5cGVFcnJvckhhbmRsZXIobWVzc2FnZSwgcHJvcHMsIHR5cGUpIHtcbiAgICAvKlxuICAgICAqIHByb3BUeXBlIGVycm9yIG1lc3NhZ2VzIGFyZSBjb25zdHJ1Y3RlZCBpblxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9wcm9wLXR5cGVzL2Jsb2IvdjE1LjcuMi9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qc1xuICAgICAqIChWZXJzaW9uIDE1LjcuMilcbiAgICAgKlxuICAgICAqIFBhcnNlIHRoZXNlIGV4Y2VwdGlvbiBvYmplY3RzIHRvIHJlbW92ZSBKUyBzb3VyY2UgY29kZSBhbmQgaW1wcm92ZVxuICAgICAqIHRoZSBjbGFyaXR5LlxuICAgICAqXG4gICAgICogSWYgd3JvbmcgcHJvcCB0eXBlIHdhcyBwYXNzZWQgaW4sIG1lc3NhZ2UgbG9va3MgbGlrZTpcbiAgICAgKlxuICAgICAqIEVycm9yOiBcIkZhaWxlZCBjb21wb25lbnQgcHJvcCB0eXBlOiBJbnZhbGlkIGNvbXBvbmVudCBwcm9wIGBhbmltYXRlYCBvZiB0eXBlIGBudW1iZXJgIHN1cHBsaWVkIHRvIGBmdW5jdGlvbiBHcmFwaFdpdGhEZWZhdWx0cyhwcm9wcykge1xuICAgICAqICAgdmFyIGlkID0gcHJvcHMuaWQgPyBwcm9wcy5pZCA6IGdlbmVyYXRlSWQoKTtcbiAgICAgKiAgIHJldHVybiByZWFjdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KFBsb3RseUdyYXBoLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgKiAgICAgaWQ6IGlkXG4gICAgICogICB9KSk7XG4gICAgICogfWAsIGV4cGVjdGVkIGBib29sZWFuYC5cIlxuICAgICAqXG4gICAgICpcbiAgICAgKiBJZiBhIHJlcXVpcmVkIHByb3AgdHlwZSB3YXMgb21pdHRlZCwgbWVzc2FnZSBsb29rcyBsaWtlOlxuICAgICAqXG4gICAgICogXCJGYWlsZWQgY29tcG9uZW50IHByb3AgdHlwZTogVGhlIGNvbXBvbmVudCBwcm9wIGBvcHRpb25zWzBdLnZhbHVlYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgaW4gYGZ1bmN0aW9uIENoZWNrbGlzdChwcm9wcykge1xuICAgICAqICAgIHZhciBfdGhpcztcbiAgICAgKlxuICAgICAqICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDaGVja2xpc3QpO1xuICAgICAqXG4gICAgICogICAgIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX2dldFByb3RvdHlwZU9mKENoZWNrbGlzdCkuY2FsbCh0aGlzLCBwcm9wcykpO1xuICAgICAqICAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgKiAgICAgICB2YWx1ZXM6IHByb3BzLnZhbHVlc1xuICAgICAqICAgICB9O1xuICAgICAqICAgICByZXR1cm4gX3RoaXM7XG4gICAgICogICB9YCwgYnV0IGl0cyB2YWx1ZSBpcyBgdW5kZWZpbmVkYC5cIlxuICAgICAqXG4gICAgICovXG5cbiAgICBjb25zdCBtZXNzYWdlUGFydHMgPSBtZXNzYWdlLnNwbGl0KCdgJyk7XG4gICAgbGV0IGVycm9yTWVzc2FnZTtcbiAgICBpZiAoaW5jbHVkZXMoJ2lzIG1hcmtlZCBhcyByZXF1aXJlZCcsIG1lc3NhZ2UpKSB7XG4gICAgICAgIGNvbnN0IGludmFsaWRQcm9wUGF0aCA9IG1lc3NhZ2VQYXJ0c1sxXTtcbiAgICAgICAgZXJyb3JNZXNzYWdlID0gYCR7aW52YWxpZFByb3BQYXRofSBpbiAke3R5cGV9YDtcbiAgICAgICAgaWYgKHByb3BzLmlkKSB7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYCB3aXRoIElEIFwiJHtwcm9wcy5pZH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgZXJyb3JNZXNzYWdlICs9ICcgaXMgcmVxdWlyZWQgYnV0IGl0IHdhcyBub3QgcHJvdmlkZWQuJztcbiAgICB9IGVsc2UgaWYgKGluY2x1ZGVzKCdCYWQgb2JqZWN0JywgbWVzc2FnZSkpIHtcbiAgICAgICAgLypcbiAgICAgICAgICogSGFuZGxlIC5leGFjdCBlcnJvcnNcbiAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3Byb3AtdHlwZXMvYmxvYi92MTUuNy4yL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzI0w0MzgtTDQ0MlxuICAgICAgICAgKi9cbiAgICAgICAgZXJyb3JNZXNzYWdlID1cbiAgICAgICAgICAgIG1lc3NhZ2Uuc3BsaXQoJ3N1cHBsaWVkIHRvICcpWzBdICtcbiAgICAgICAgICAgIGBzdXBwbGllZCB0byAke3R5cGV9YCArXG4gICAgICAgICAgICAnLlxcbkJhZCcgK1xuICAgICAgICAgICAgbWVzc2FnZS5zcGxpdCgnLlxcbkJhZCcpWzFdO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGluY2x1ZGVzKCdJbnZhbGlkICcsIG1lc3NhZ2UpICYmXG4gICAgICAgIGluY2x1ZGVzKCcgc3VwcGxpZWQgdG8gJywgbWVzc2FnZSlcbiAgICApIHtcbiAgICAgICAgY29uc3QgaW52YWxpZFByb3BQYXRoID0gbWVzc2FnZVBhcnRzWzFdO1xuXG4gICAgICAgIGVycm9yTWVzc2FnZSA9IGBJbnZhbGlkIGFyZ3VtZW50IFxcYCR7aW52YWxpZFByb3BQYXRofVxcYCBwYXNzZWQgaW50byAke3R5cGV9YDtcbiAgICAgICAgaWYgKHByb3BzLmlkKSB7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYCB3aXRoIElEIFwiJHtwcm9wcy5pZH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgZXJyb3JNZXNzYWdlICs9ICcuJztcblxuICAgICAgICAvKlxuICAgICAgICAgKiBOb3QgYWxsIGVycm9yIG1lc3NhZ2VzIGluY2x1ZGUgdGhlIGV4cGVjdGVkIHZhbHVlLlxuICAgICAgICAgKiBJbiBwYXJ0aWN1bGFyLCBvbmVPZlR5cGUuXG4gICAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9wcm9wLXR5cGVzL2Jsb2IvdjE1LjcuMi9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qcyNMMzg4XG4gICAgICAgICAqL1xuICAgICAgICBpZiAoaW5jbHVkZXMoJywgZXhwZWN0ZWQgJywgbWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkUHJvcFR5cGUgPSBtZXNzYWdlLnNwbGl0KCcsIGV4cGVjdGVkICcpWzFdO1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlICs9IGBcXG5FeHBlY3RlZCAke2V4cGVjdGVkUHJvcFR5cGV9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIE5vdCBhbGwgZXJyb3IgbWVzc2FnZXMgaW5jbHVkZSB0aGUgdHlwZVxuICAgICAgICAgKiBJbiBwYXJ0aWN1bGFyLCBvbmVPZlR5cGUuXG4gICAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9wcm9wLXR5cGVzL2Jsb2IvdjE1LjcuMi9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qcyNMMzg4XG4gICAgICAgICAqL1xuICAgICAgICBpZiAoaW5jbHVkZXMoJyBvZiB0eXBlIGAnLCBtZXNzYWdlKSkge1xuICAgICAgICAgICAgY29uc3QgaW52YWxpZFByb3BUeXBlUHJvdmlkZWQgPSBtZXNzYWdlXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcgb2YgdHlwZSBgJylbMV1cbiAgICAgICAgICAgICAgICAuc3BsaXQoJ2AnKVswXTtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSBgXFxuV2FzIHN1cHBsaWVkIHR5cGUgXFxgJHtpbnZhbGlkUHJvcFR5cGVQcm92aWRlZH1cXGAuYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXMoaW52YWxpZFByb3BQYXRoLCBwcm9wcykpIHtcbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgKiBpbnZhbGlkUHJvcFBhdGggbWF5IGJlIG5lc3RlZCBsaWtlIGBvcHRpb25zWzBdLnZhbHVlYC5cbiAgICAgICAgICAgICAqIEZvciBub3csIHdlIHdvbid0IHRyeSB0byB1bnBhY2sgdGhlc2UgbmVzdGVkIG9wdGlvbnNcbiAgICAgICAgICAgICAqIGJ1dCB3ZSBjb3VsZCBpbiB0aGUgZnV0dXJlLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBqc29uU3VwcGxpZWRWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIHByb3BzW2ludmFsaWRQcm9wUGF0aF0sXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGpzb25TdXBwbGllZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVzKCdcXG4nLCBqc29uU3VwcGxpZWRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlICs9IGBcXG5WYWx1ZSBwcm92aWRlZDogXFxuJHtqc29uU3VwcGxpZWRWYWx1ZX1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSBgXFxuVmFsdWUgcHJvdmlkZWQ6ICR7anNvblN1cHBsaWVkVmFsdWV9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAvKlxuICAgICAgICAgKiBOb3QgYXdhcmUgb2Ygb3RoZXIgcHJvcCB0eXBlIHdhcm5pbmcgbWVzc2FnZXMuXG4gICAgICAgICAqIEJ1dCwgaWYgdGhleSBleGlzdCwgdGhlbiBhdCBsZWFzdCB0aHJvdyB0aGUgZGVmYXVsdFxuICAgICAgICAgKiByZWFjdCBwcm9wIHR5cGVzIGVycm9yXG4gICAgICAgICAqL1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG59XG4iLCJpbXBvcnQge2luY2x1ZGVzLCB0eXBlfSBmcm9tICdyYW1kYSc7XG5cbmNvbnN0IFNJTVBMRV9DT01QT05FTlRfVFlQRVMgPSBbJ1N0cmluZycsICdOdW1iZXInLCAnTnVsbCcsICdCb29sZWFuJ107XG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvbmVudCA9PiBpbmNsdWRlcyh0eXBlKGNvbXBvbmVudCksIFNJTVBMRV9DT01QT05FTlRfVFlQRVMpO1xuIiwiLyoqXG4gKiBHZW5lcmFsaXplZCBwZXJzaXN0ZW5jZSBmb3IgY29tcG9uZW50IHByb3BzXG4gKlxuICogV2hlbiB1c2VycyBpbnB1dCBuZXcgcHJvcCB2YWx1ZXMsIHRoZXkgY2FuIGJlIHN0b3JlZCBhbmQgcmVhcHBsaWVkIGxhdGVyLFxuICogd2hlbiB0aGUgY29tcG9uZW50IGlzIHJlY3JlYXRlZCAoY2hhbmdpbmcgYFRhYmAgZm9yIGV4YW1wbGUpIG9yIHdoZW4gdGhlXG4gKiBwYWdlIGlzIHJlbG9hZGVkIChkZXBlbmRpbmcgb24gYHBlcnNpc3RlbmNlX3R5cGVgKS4gU3RvcmFnZSBpcyB0aWVkIHRvXG4gKiBjb21wb25lbnQgSUQsIGFuZCB0aGUgcHJvcCB2YWx1ZXMgd2lsbCBub3QgYmUgc3RvcmVkIHdpdGggY29tcG9uZW50c1xuICogd2l0aG91dCBhbiBJRC5cbiAqXG4gKiBSZW5kZXJlciBoYW5kbGVzIHRoZSBtZWNoYW5pY3MsIGJ1dCBjb21wb25lbnRzIG11c3QgZGVmaW5lIGEgZmV3IHByb3BzOlxuICpcbiAqIC0gYHBlcnNpc3RlbmNlYDogYm9vbGVhbiwgc3RyaW5nLCBvciBudW1iZXIuIEZvciBzaW1wbGUgdXNhZ2UsIHNldCB0byBgdHJ1ZWBcbiAqICAgdG8gZW5hYmxlIHBlcnNpc3RlbmNlLCBvbWl0IG9yIHNldCBgZmFsc2VgIHRvIGRpc2FibGUuIEZvciBtb3JlIGNvbXBsZXhcbiAqICAgc2NlbmFyaW9zLCB1c2UgYW55IHRydXRoeSB2YWx1ZSwgYW5kIGNoYW5nZSB0byBhICpkaWZmZXJlbnQqIHRydXRoeSB2YWx1ZVxuICogICB3aGVuIHlvdSB3YW50IHRoZSBwZXJzaXN0ZWQgdmFsdWVzIGNsZWFyZWQuIChtb2RlbGVkIG9mZiBgdWlyZXZpc2lvbmAgaW4pXG4gKiAgIHBsb3RseS5qc1xuICogICBUeXBpY2FsbHkgc2hvdWxkIGhhdmUgbm8gZGVmYXVsdCwgYnV0IHRoZSBvdGhlciBwZXJzaXN0ZW5jZSBwcm9wcyBzaG91bGRcbiAqICAgaGF2ZSBkZWZhdWx0cywgc28gYWxsIGEgdXNlciBuZWVkcyB0byBkbyB0byBlbmFibGUgcGVyc2lzdGVuY2UgaXMgc2V0IHRoaXNcbiAqICAgb25lIHByb3AuXG4gKlxuICogLSBgcGVyc2lzdGVkX3Byb3BzYDogYXJyYXkgb2YgcHJvcCBuYW1lcyBvciBcIm5lc3RlZCBwcm9wIElEc1wiIGFsbG93ZWQgdG9cbiAqICAgcGVyc2lzdC4gTm9ybWFsbHkgc2hvdWxkIGRlZmF1bHQgdG8gdGhlIGZ1bGwgbGlzdCBvZiBzdXBwb3J0ZWQgcHJvcHMsXG4gKiAgIHNvIHRoZXkgY2FuIGFsbCBiZSBlbmFibGVkIGF0IG9uY2UuIFRoZSBtYWluIGV4Y2VwdGlvbiB0byB0aGlzIGlzIGlmXG4gKiAgIHRoZXJlJ3MgYSBwcm9wIHRoYXQgKmNhbiogYmUgcGVyc2lzdGVkIGJ1dCBtb3N0IHVzZXJzIHdvdWxkbid0IHdhbnQgdGhpcy5cbiAqICAgQSBuZXN0ZWQgcHJvcCBJRCBkZXNjcmliZXMgKnBhcnQqIG9mIGEgcHJvcCB0byBzdG9yZS4gSXQgbXVzdCBiZVxuICogICBcIjxwcm9wTmFtZT4uPHBpZWNlPlwiIHdoZXJlIHByb3BOYW1lIGlzIHRoZSBwcm9wIHRoYXQgaGFzIHRoaXMgaW5mbywgYW5kXG4gKiAgIHBpZWNlIG1heSBvciBtYXkgbm90IG1hcCB0byB0aGUgZXhhY3Qgc3Vic3RydWN0dXJlIGJlaW5nIHN0b3JlZCBidXQgaXNcbiAqICAgbWVhbmluZ2Z1bCB0byB0aGUgdXNlci4gRm9yIGV4YW1wbGUsIGluIGBkYXNoX3RhYmxlYCwgYGNvbHVtbnMubmFtZWBcbiAqICAgc3RvcmVzIGBjb2x1bW5zW2ldLm5hbWVgIGZvciBhbGwgY29sdW1ucyBgaWAuIE5lc3RlZCBwcm9wcyBhbHNvIG5lZWRcbiAqICAgZW50cmllcyBpbiBgcGVyc2lzdGVuY2VUcmFuc2Zvcm1zYCAtIHNlZSBiZWxvdy5cbiAqXG4gKiAtIGBwZXJzaXN0ZW5jZV90eXBlYDogb25lIG9mIFwibG9jYWxcIiwgXCJzZXNzaW9uXCIsIG9yIFwibWVtb3J5XCIsIGp1c3QgbGlrZVxuICogICBgZGNjLlN0b3JlYC4gQnV0IHRoZSBkZWZhdWx0IGhlcmUgc2hvdWxkIGJlIFwibG9jYWxcIiBiZWNhdXNlIHRoZSBtYWluIHVzZVxuICogICBjYXNlIGlzIHRvIG1haW50YWluIHNldHRpbmdzIGFjcm9zcyByZWxvYWRzLlxuICpcbiAqIElmIGFueSBgcGVyc2lzdGVkX3Byb3BzYCBhcmUgbmVzdGVkIHByb3AgSURzLCB0aGUgY29tcG9uZW50IHNob3VsZCBkZWZpbmUgYVxuICogY2xhc3MgcHJvcGVydHkgKG5vdCBhIFJlYWN0IHByb3ApIGBwZXJzaXN0ZW5jZVRyYW5zZm9ybXNgLCBhcyBhbiBvYmplY3Q6XG4gKiB7XG4gKiAgIFtwcm9wTmFtZV06IHtcbiAqICAgICBbcGllY2VdOiB7XG4gKiAgICAgICBleHRyYWN0OiBwcm9wVmFsdWUgPT4gdmFsdWVUb1N0b3JlLFxuICogICAgICAgYXBwbHk6IChzdG9yZWRWYWx1ZSwgcHJvcFZhbHVlKSA9PiBuZXdQcm9wVmFsdWVcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIC0gYGV4dHJhY3RgIHR1cm5zIGEgcHJvcCB2YWx1ZSBpbnRvIGEgcmVkdWNlZCB2YWx1ZSB0byBzdG9yZS5cbiAqIC0gYGFwcGx5YCBwdXRzIGFuIGV4dHJhY3RlZCB2YWx1ZSBiYWNrIGludG8gdGhlIHByb3AuIE1ha2Ugc3VyZSB0aGlzIGNyZWF0ZXNcbiAqICAgYSBuZXcgb2JqZWN0IHJhdGhlciB0aGFuIG11dGF0aW5nIGBwcm9WYWx1ZWAsIGFuZCB0aGF0IGlmIHRoZXJlIGFyZVxuICogICBtdWx0aXBsZSBgcGllY2VgIGVudHJpZXMgZm9yIG9uZSBgcHJvcE5hbWVgLCB0aGVpciBgYXBwbHlgIGZ1bmN0aW9uc1xuICogICBjb21tdXRlIC0gd2hpY2ggc2hvdWxkIG5vdCBiZSBhbiBpc3N1ZSBpZiB0aGV5IGV4dHJhY3QgYW5kIGFwcGx5XG4gKiAgIG5vbi1pbnRlcnNlY3RpbmcgcGFydHMgb2YgdGhlIGZ1bGwgcHJvcC5cbiAqIFlvdSBvbmx5IG5lZWQgdG8gZGVmaW5lIHRoZXNlIGZvciB0aGUgcHJvcHMgdGhhdCBuZWVkIHRoZW0uXG4gKiBJdCdzIGltcG9ydGFudCB0aGF0IGBleHRyYWN0YCBwdWxscyBvdXQgKm9ubHkqIHRoZSByZWxldmFudCBwaWVjZXMgb2YgdGhlXG4gKiBwcm9wLCBiZWNhdXNlIHBlcnNpc3RlbmNlIGlzIG9ubHkgbWFpbnRhaW5lZCBpZiB0aGUgZXh0cmFjdGVkIHZhbHVlIG9mIHRoZVxuICogcHJvcCBiZWZvcmUgYXBwbHlpbmcgcGVyc2lzdGVuY2UgaXMgdGhlIHNhbWUgYXMgaXQgd2FzIGJlZm9yZSB0aGUgdXNlcidzXG4gKiBjaGFuZ2VzLlxuICovXG5cbmltcG9ydCB7XG4gICAgZXF1YWxzLFxuICAgIGZpbHRlcixcbiAgICBmb3JFYWNoLFxuICAgIGtleXMsXG4gICAgbGVuc1BhdGgsXG4gICAgbWVyZ2VSaWdodCxcbiAgICBzZXQsXG4gICAgdHlwZVxufSBmcm9tICdyYW1kYSc7XG5pbXBvcnQge2NyZWF0ZUFjdGlvbn0gZnJvbSAncmVkdXgtYWN0aW9ucyc7XG5cbmltcG9ydCBSZWdpc3RyeSBmcm9tICcuL3JlZ2lzdHJ5JztcbmltcG9ydCB7c3RyaW5naWZ5SWR9IGZyb20gJy4vYWN0aW9ucy9kZXBlbmRlbmNpZXMnO1xuXG5leHBvcnQgY29uc3Qgc3RvcmVQcmVmaXggPSAnX2Rhc2hfcGVyc2lzdGVuY2UuJztcblxuZnVuY3Rpb24gZXJyKGUpIHtcbiAgICBjb25zdCBlcnJvciA9IHR5cGVvZiBlID09PSAnc3RyaW5nJyA/IG5ldyBFcnJvcihlKSA6IGU7XG5cbiAgICByZXR1cm4gY3JlYXRlQWN0aW9uKCdPTl9FUlJPUicpKHtcbiAgICAgICAgdHlwZTogJ2Zyb250RW5kJyxcbiAgICAgICAgZXJyb3JcbiAgICB9KTtcbn1cblxuLypcbiAqIERvZXMgYSBrZXkgZml0IHRoaXMgcHJlZml4PyBNdXN0IGVpdGhlciBiZSBhbiBleGFjdCBtYXRjaFxuICogb3IsIGlmIGEgc2VwYXJhdG9yIGlzIHByb3ZpZGVkLCBhIHNjb3BlZCBtYXRjaCAtIGV4YWN0IHByZWZpeFxuICogZm9sbG93ZWQgYnkgdGhlIHNlcGFyYXRvciAodGhlbiBhbnl0aGluZyBlbHNlKVxuICovXG5mdW5jdGlvbiBrZXlQcmVmaXhNYXRjaChwcmVmaXgsIHNlcGFyYXRvcikge1xuICAgIGNvbnN0IGZ1bGxTdHIgPSBwcmVmaXggKyBzZXBhcmF0b3I7XG4gICAgY29uc3QgZnVsbExlbiA9IGZ1bGxTdHIubGVuZ3RoO1xuICAgIHJldHVybiBrZXkgPT4ga2V5ID09PSBwcmVmaXggfHwga2V5LnN1YnN0cigwLCBmdWxsTGVuKSA9PT0gZnVsbFN0cjtcbn1cblxuY29uc3QgVU5ERUZJTkVEID0gJ1UnO1xuY29uc3QgX3BhcnNlID0gdmFsID0+ICh2YWwgPT09IFVOREVGSU5FRCA/IHVuZGVmaW5lZCA6IEpTT04ucGFyc2UodmFsIHx8IG51bGwpKTtcbmNvbnN0IF9zdHJpbmdpZnkgPSB2YWwgPT4gKHZhbCA9PT0gdW5kZWZpbmVkID8gVU5ERUZJTkVEIDogSlNPTi5zdHJpbmdpZnkodmFsKSk7XG5cbmNsYXNzIFdlYlN0b3JlIHtcbiAgICBjb25zdHJ1Y3RvcihiYWNrRW5kKSB7XG4gICAgICAgIHRoaXMuX25hbWUgPSBiYWNrRW5kO1xuICAgICAgICB0aGlzLl9zdG9yYWdlID0gd2luZG93W2JhY2tFbmRdO1xuICAgIH1cblxuICAgIGhhc0l0ZW0oa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdG9yYWdlLmdldEl0ZW0oc3RvcmVQcmVmaXggKyBrZXkpICE9PSBudWxsO1xuICAgIH1cblxuICAgIGdldEl0ZW0oa2V5KSB7XG4gICAgICAgIC8vIG5vdGU6IF9zdG9yYWdlLmdldEl0ZW0gcmV0dXJucyBudWxsIG9uIG1pc3Npbmcga2V5c1xuICAgICAgICAvLyBhbmQgSlNPTi5wYXJzZShudWxsKSByZXR1cm5zIG51bGwgYXMgd2VsbFxuICAgICAgICByZXR1cm4gX3BhcnNlKHRoaXMuX3N0b3JhZ2UuZ2V0SXRlbShzdG9yZVByZWZpeCArIGtleSkpO1xuICAgIH1cblxuICAgIF9zZXRJdGVtKGtleSwgdmFsdWUpIHtcbiAgICAgICAgLy8gdW5wcm90ZWN0ZWQgdmVyc2lvbiBvZiBzZXRJdGVtLCBmb3IgdXNlIGJ5IHRyeUdldFdlYlN0b3JlXG4gICAgICAgIHRoaXMuX3N0b3JhZ2Uuc2V0SXRlbShzdG9yZVByZWZpeCArIGtleSwgX3N0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH1cbiAgICAvKlxuICAgICAqIEluIGFkZGl0aW9uIHRvIHRoZSByZWd1bGFyIGtleS0+dmFsdWUgdG8gc2V0LCBzZXRJdGVtIHRha2VzXG4gICAgICogZGlzcGF0Y2ggYXMgYSBwYXJhbWV0ZXIsIHNvIGl0IGNhbiByZXBvcnQgT09NIHRvIGRldnRvb2xzXG4gICAgICovXG4gICAgc2V0SXRlbShrZXksIHZhbHVlLCBkaXNwYXRjaCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5fc2V0SXRlbShrZXksIHZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgZXJyKFxuICAgICAgICAgICAgICAgICAgICBgJHtrZXl9IGZhaWxlZCB0byBzYXZlIGluICR7dGhpcy5fbmFtZX0uIFBlcnNpc3RlZCBwcm9wcyBtYXkgYmUgbG9zdC5gXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIFRPRE86IGF0IHNvbWUgcG9pbnQgd2UgbWF5IHdhbnQgdG8gY29udmVydCB0aGlzIHRvIGZhbGwgYmFja1xuICAgICAgICAgICAgLy8gb24gbWVtb3J5LCBwdWxsaW5nIG91dCBhbGwgcGVyc2lzdGVuY2Uga2V5cyBhbmQgcHV0dGluZyB0aGVtXG4gICAgICAgICAgICAvLyBpbiBhIE1lbVN0b3JlIHRoYXQgZ2V0cyB1c2VkIGZyb20gdGhlbiBvbndhcmQuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVJdGVtKGtleSkge1xuICAgICAgICB0aGlzLl9zdG9yYWdlLnJlbW92ZUl0ZW0oc3RvcmVQcmVmaXggKyBrZXkpO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogY2xlYXIgbWF0Y2hpbmcga2V5cyBtYXRjaGluZyAob3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIGRvdCBhbmQgbW9yZVxuICAgICAqIGNoYXJhY3RlcnMpIC0gb3IgYWxsIGtleXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RvcmUgaWYgbm8gcHJlZml4LlxuICAgICAqL1xuICAgIGNsZWFyKGtleVByZWZpeCkge1xuICAgICAgICBjb25zdCBmdWxsUHJlZml4ID0gc3RvcmVQcmVmaXggKyAoa2V5UHJlZml4IHx8ICcnKTtcbiAgICAgICAgY29uc3Qga2V5TWF0Y2ggPSBrZXlQcmVmaXhNYXRjaChmdWxsUHJlZml4LCBrZXlQcmVmaXggPyAnLicgOiAnJyk7XG4gICAgICAgIGNvbnN0IGtleXNUb1JlbW92ZSA9IFtdO1xuICAgICAgICAvLyAyLXN0ZXAgcHJvY2Vzcywgc28gd2UgZG9uJ3QgZGVwZW5kIG9uIGFueSBwYXJ0aWN1bGFyIGJlaGF2aW9yIG9mXG4gICAgICAgIC8vIGtleSBvcmRlciB3aGlsZSByZW1vdmluZyBzb21lXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fc3RvcmFnZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZnVsbEtleSA9IHRoaXMuX3N0b3JhZ2Uua2V5KGkpO1xuICAgICAgICAgICAgaWYgKGtleU1hdGNoKGZ1bGxLZXkpKSB7XG4gICAgICAgICAgICAgICAga2V5c1RvUmVtb3ZlLnB1c2goZnVsbEtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yRWFjaChrID0+IHRoaXMuX3N0b3JhZ2UucmVtb3ZlSXRlbShrKSwga2V5c1RvUmVtb3ZlKTtcbiAgICB9XG59XG5cbmNsYXNzIE1lbVN0b3JlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuICAgIH1cblxuICAgIGhhc0l0ZW0oa2V5KSB7XG4gICAgICAgIHJldHVybiBrZXkgaW4gdGhpcy5fZGF0YTtcbiAgICB9XG5cbiAgICBnZXRJdGVtKGtleSkge1xuICAgICAgICAvLyBydW4gdGhpcyBzdG9yYWdlIHRocm91Z2ggSlNPTiB0b28gc28gd2Uga25vdyB3ZSBnZXQgYSBmcmVzaCBvYmplY3RcbiAgICAgICAgLy8gZWFjaCByZXRyaWV2YWxcbiAgICAgICAgcmV0dXJuIF9wYXJzZSh0aGlzLl9kYXRhW2tleV0pO1xuICAgIH1cblxuICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLl9kYXRhW2tleV0gPSBfc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9XG5cbiAgICByZW1vdmVJdGVtKGtleSkge1xuICAgICAgICBkZWxldGUgdGhpcy5fZGF0YVtrZXldO1xuICAgIH1cblxuICAgIGNsZWFyKGtleVByZWZpeCkge1xuICAgICAgICBpZiAoa2V5UHJlZml4KSB7XG4gICAgICAgICAgICBmb3JFYWNoKFxuICAgICAgICAgICAgICAgIGtleSA9PiBkZWxldGUgdGhpcy5fZGF0YVtrZXldLFxuICAgICAgICAgICAgICAgIGZpbHRlcihrZXlQcmVmaXhNYXRjaChrZXlQcmVmaXgsICcuJyksIGtleXModGhpcy5fZGF0YSkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBNYWtlIGEgc3RyaW5nIDJeMTYgY2hhcmFjdGVycyBsb25nICgqMiBieXRlcy9jaGFyID0gMTMwa0IpLCB0byB0ZXN0IHN0b3JhZ2UuXG4vLyBUaGF0IHNob3VsZCBiZSBwbGVudHkgZm9yIGNvbW1vbiBwZXJzaXN0ZW5jZSB1c2UgY2FzZXMsXG4vLyB3aXRob3V0IGdldHRpbmcgYW55d2hlcmUgbmVhciB0eXBpY2FsIGJyb3dzZXIgbGltaXRzXG5jb25zdCBwb3cgPSAxNjtcbmZ1bmN0aW9uIGxvbmdTdHJpbmcoKSB7XG4gICAgbGV0IHMgPSAnU3BhbSc7XG4gICAgZm9yIChsZXQgaSA9IDI7IGkgPCBwb3c7IGkrKykge1xuICAgICAgICBzICs9IHM7XG4gICAgfVxuICAgIHJldHVybiBzO1xufVxuXG5leHBvcnQgY29uc3Qgc3RvcmVzID0ge1xuICAgIG1lbW9yeTogbmV3IE1lbVN0b3JlKClcbiAgICAvLyBEZWZlciB0ZXN0aW5nICYgbWFraW5nIGxvY2FsL3Nlc3Npb24gc3RvcmVzIHVudGlsIHJlcXVlc3RlZC5cbiAgICAvLyBUaGF0IHdheSBpZiB3ZSBoYXZlIGVycm9ycyBoZXJlIHRoZXkgY2FuIHNob3cgdXAgaW4gZGV2dG9vbHMuXG59O1xuXG5jb25zdCBiYWNrRW5kcyA9IHtcbiAgICBsb2NhbDogJ2xvY2FsU3RvcmFnZScsXG4gICAgc2Vzc2lvbjogJ3Nlc3Npb25TdG9yYWdlJ1xufTtcblxuZnVuY3Rpb24gdHJ5R2V0V2ViU3RvcmUoYmFja0VuZCwgZGlzcGF0Y2gpIHtcbiAgICBjb25zdCBzdG9yZSA9IG5ldyBXZWJTdG9yZShiYWNrRW5kKTtcbiAgICBjb25zdCBmYWxsYmFja1N0b3JlID0gc3RvcmVzLm1lbW9yeTtcbiAgICBjb25zdCBzdG9yZVRlc3QgPSBsb25nU3RyaW5nKCk7XG4gICAgY29uc3QgdGVzdEtleSA9IHN0b3JlUHJlZml4ICsgJ3gueCc7XG4gICAgdHJ5IHtcbiAgICAgICAgc3RvcmUuX3NldEl0ZW0odGVzdEtleSwgc3RvcmVUZXN0KTtcbiAgICAgICAgaWYgKHN0b3JlLmdldEl0ZW0odGVzdEtleSkgIT09IHN0b3JlVGVzdCkge1xuICAgICAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgZXJyKGAke2JhY2tFbmR9IGluaXQgZmFpbGVkIHNldC9nZXQsIGZhbGxpbmcgYmFjayB0byBtZW1vcnlgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxsYmFja1N0b3JlO1xuICAgICAgICB9XG4gICAgICAgIHN0b3JlLnJlbW92ZUl0ZW0odGVzdEtleSk7XG4gICAgICAgIHJldHVybiBzdG9yZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgZXJyKGAke2JhY2tFbmR9IGluaXQgZmlyc3QgdHJ5IGZhaWxlZDsgY2xlYXJpbmcgYW5kIHJldHJ5aW5nYClcbiAgICAgICAgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgc3RvcmUuY2xlYXIoKTtcbiAgICAgICAgc3RvcmUuX3NldEl0ZW0odGVzdEtleSwgc3RvcmVUZXN0KTtcbiAgICAgICAgaWYgKHN0b3JlLmdldEl0ZW0odGVzdEtleSkgIT09IHN0b3JlVGVzdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3BlJyk7XG4gICAgICAgIH1cbiAgICAgICAgc3RvcmUucmVtb3ZlSXRlbSh0ZXN0S2V5KTtcbiAgICAgICAgZGlzcGF0Y2goZXJyKGAke2JhY2tFbmR9IGluaXQgc2V0L2dldCBzdWNjZWVkZWQgYWZ0ZXIgY2xlYXJpbmchYCkpO1xuICAgICAgICByZXR1cm4gc3RvcmU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBkaXNwYXRjaChlcnIoYCR7YmFja0VuZH0gaW5pdCBzdGlsbCBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBtZW1vcnlgKSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFja1N0b3JlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0U3RvcmUodHlwZSwgZGlzcGF0Y2gpIHtcbiAgICBpZiAoIXN0b3Jlc1t0eXBlXSkge1xuICAgICAgICBzdG9yZXNbdHlwZV0gPSB0cnlHZXRXZWJTdG9yZShiYWNrRW5kc1t0eXBlXSwgZGlzcGF0Y2gpO1xuICAgIH1cbiAgICByZXR1cm4gc3RvcmVzW3R5cGVdO1xufVxuXG5jb25zdCBub29wVHJhbnNmb3JtID0ge1xuICAgIGV4dHJhY3Q6IHByb3BWYWx1ZSA9PiBwcm9wVmFsdWUsXG4gICAgYXBwbHk6IChzdG9yZWRWYWx1ZSwgX3Byb3BWYWx1ZSkgPT4gc3RvcmVkVmFsdWVcbn07XG5cbmNvbnN0IGdldFRyYW5zZm9ybSA9IChlbGVtZW50LCBwcm9wTmFtZSwgcHJvcFBhcnQpID0+IHtcbiAgICBpZiAoXG4gICAgICAgIGVsZW1lbnQucGVyc2lzdGVuY2VUcmFuc2Zvcm1zICYmXG4gICAgICAgIGVsZW1lbnQucGVyc2lzdGVuY2VUcmFuc2Zvcm1zW3Byb3BOYW1lXVxuICAgICkge1xuICAgICAgICBpZiAocHJvcFBhcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnBlcnNpc3RlbmNlVHJhbnNmb3Jtc1twcm9wTmFtZV1bcHJvcFBhcnRdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50LnBlcnNpc3RlbmNlVHJhbnNmb3Jtc1twcm9wTmFtZV07XG4gICAgfVxuICAgIHJldHVybiBub29wVHJhbnNmb3JtO1xufTtcblxuY29uc3QgZ2V0VmFsc0tleSA9IChpZCwgcGVyc2lzdGVkUHJvcCwgcGVyc2lzdGVuY2UpID0+XG4gICAgYCR7c3RyaW5naWZ5SWQoaWQpfS4ke3BlcnNpc3RlZFByb3B9LiR7SlNPTi5zdHJpbmdpZnkocGVyc2lzdGVuY2UpfWA7XG5cbmNvbnN0IGdldFByb3BzID0gbGF5b3V0ID0+IHtcbiAgICBjb25zdCB7cHJvcHMsIHR5cGUsIG5hbWVzcGFjZX0gPSBsYXlvdXQ7XG4gICAgaWYgKCF0eXBlIHx8ICFuYW1lc3BhY2UpIHtcbiAgICAgICAgLy8gbm90IGEgcmVhbCBjb21wb25lbnQgLSBqdXN0IG5lZWQgdGhlIHByb3BzIGZvciByZWN1cnNpb25cbiAgICAgICAgcmV0dXJuIHtwcm9wc307XG4gICAgfVxuICAgIGNvbnN0IHtpZCwgcGVyc2lzdGVuY2V9ID0gcHJvcHM7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gUmVnaXN0cnkucmVzb2x2ZShsYXlvdXQpO1xuICAgIGNvbnN0IGdldFZhbCA9IHByb3AgPT4gcHJvcHNbcHJvcF0gfHwgKGVsZW1lbnQuZGVmYXVsdFByb3BzIHx8IHt9KVtwcm9wXTtcbiAgICBjb25zdCBwZXJzaXN0ZWRfcHJvcHMgPSBnZXRWYWwoJ3BlcnNpc3RlZF9wcm9wcycpO1xuICAgIGNvbnN0IHBlcnNpc3RlbmNlX3R5cGUgPSBnZXRWYWwoJ3BlcnNpc3RlbmNlX3R5cGUnKTtcbiAgICBjb25zdCBjYW5QZXJzaXN0ID0gaWQgJiYgcGVyc2lzdGVkX3Byb3BzICYmIHBlcnNpc3RlbmNlX3R5cGU7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBjYW5QZXJzaXN0LFxuICAgICAgICBpZCxcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHBlcnNpc3RlbmNlLFxuICAgICAgICBwZXJzaXN0ZWRfcHJvcHMsXG4gICAgICAgIHBlcnNpc3RlbmNlX3R5cGVcbiAgICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZFVpRWRpdChsYXlvdXQsIG5ld1Byb3BzLCBkaXNwYXRjaCkge1xuICAgIGNvbnN0IHtcbiAgICAgICAgY2FuUGVyc2lzdCxcbiAgICAgICAgaWQsXG4gICAgICAgIHByb3BzLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBwZXJzaXN0ZW5jZSxcbiAgICAgICAgcGVyc2lzdGVkX3Byb3BzLFxuICAgICAgICBwZXJzaXN0ZW5jZV90eXBlXG4gICAgfSA9IGdldFByb3BzKGxheW91dCk7XG4gICAgaWYgKCFjYW5QZXJzaXN0IHx8ICFwZXJzaXN0ZW5jZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yRWFjaChwZXJzaXN0ZWRQcm9wID0+IHtcbiAgICAgICAgY29uc3QgW3Byb3BOYW1lLCBwcm9wUGFydF0gPSBwZXJzaXN0ZWRQcm9wLnNwbGl0KCcuJyk7XG4gICAgICAgIGlmIChuZXdQcm9wc1twcm9wTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGdldFN0b3JlKHBlcnNpc3RlbmNlX3R5cGUsIGRpc3BhdGNoKTtcbiAgICAgICAgICAgIGNvbnN0IHtleHRyYWN0fSA9IGdldFRyYW5zZm9ybShlbGVtZW50LCBwcm9wTmFtZSwgcHJvcFBhcnQpO1xuXG4gICAgICAgICAgICBjb25zdCB2YWxzS2V5ID0gZ2V0VmFsc0tleShpZCwgcGVyc2lzdGVkUHJvcCwgcGVyc2lzdGVuY2UpO1xuICAgICAgICAgICAgbGV0IG9yaWdpbmFsVmFsID0gZXh0cmFjdChwcm9wc1twcm9wTmFtZV0pO1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsID0gZXh0cmFjdChuZXdQcm9wc1twcm9wTmFtZV0pO1xuXG4gICAgICAgICAgICAvLyBtYWlubHkgZm9yIG5lc3RlZCBwcm9wcyB3aXRoIG11bHRpcGxlIHBlcnNpc3RlZCBwYXJ0cywgaXQnc1xuICAgICAgICAgICAgLy8gcG9zc2libGUgdG8gaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyBiZWZvcmUgLSBzaG91bGQgbm90IHN0b3JlXG4gICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2UuXG4gICAgICAgICAgICBpZiAob3JpZ2luYWxWYWwgIT09IG5ld1ZhbCkge1xuICAgICAgICAgICAgICAgIGlmIChzdG9yYWdlLmhhc0l0ZW0odmFsc0tleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxWYWwgPSBzdG9yYWdlLmdldEl0ZW0odmFsc0tleSlbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHMgPVxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFZhbCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFtuZXdWYWxdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFtuZXdWYWwsIG9yaWdpbmFsVmFsXTtcbiAgICAgICAgICAgICAgICBzdG9yYWdlLnNldEl0ZW0odmFsc0tleSwgdmFscywgZGlzcGF0Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSwgcGVyc2lzdGVkX3Byb3BzKTtcbn1cblxuLypcbiAqIFVzZWQgZm9yIGVudGlyZSBsYXlvdXRzIChvbiBsb2FkKSBvciBwYXJ0aWFsIGxheW91dHMgKGZyb20gY2hpbGRyZW5cbiAqIGNhbGxiYWNrcykgdG8gYXBwbHkgcHJldmlvdXNseS1zdG9yZWQgVUkgZWRpdHMgdG8gY29tcG9uZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlQZXJzaXN0ZW5jZShsYXlvdXQsIGRpc3BhdGNoKSB7XG4gICAgaWYgKHR5cGUobGF5b3V0KSAhPT0gJ09iamVjdCcgfHwgIWxheW91dC5wcm9wcykge1xuICAgICAgICByZXR1cm4gbGF5b3V0O1xuICAgIH1cblxuICAgIHJldHVybiBwZXJzaXN0ZW5jZU1vZHMobGF5b3V0LCBsYXlvdXQsIFtdLCBkaXNwYXRjaCk7XG59XG5cbmNvbnN0IFVORE8gPSB0cnVlO1xuZnVuY3Rpb24gbW9kUHJvcChrZXksIHN0b3JhZ2UsIGVsZW1lbnQsIHByb3BzLCBwZXJzaXN0ZWRQcm9wLCB1cGRhdGUsIHVuZG8pIHtcbiAgICBpZiAoc3RvcmFnZS5oYXNJdGVtKGtleSkpIHtcbiAgICAgICAgY29uc3QgW25ld1ZhbCwgb3JpZ2luYWxWYWxdID0gc3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICAgIGNvbnN0IGZyb21WYWwgPSB1bmRvID8gbmV3VmFsIDogb3JpZ2luYWxWYWw7XG4gICAgICAgIGNvbnN0IHRvVmFsID0gdW5kbyA/IG9yaWdpbmFsVmFsIDogbmV3VmFsO1xuICAgICAgICBjb25zdCBbcHJvcE5hbWUsIHByb3BQYXJ0XSA9IHBlcnNpc3RlZFByb3Auc3BsaXQoJy4nKTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gZ2V0VHJhbnNmb3JtKGVsZW1lbnQsIHByb3BOYW1lLCBwcm9wUGFydCk7XG5cbiAgICAgICAgaWYgKGVxdWFscyhmcm9tVmFsLCB0cmFuc2Zvcm0uZXh0cmFjdChwcm9wc1twcm9wTmFtZV0pKSkge1xuICAgICAgICAgICAgdXBkYXRlW3Byb3BOYW1lXSA9IHRyYW5zZm9ybS5hcHBseShcbiAgICAgICAgICAgICAgICB0b1ZhbCxcbiAgICAgICAgICAgICAgICBwcm9wTmFtZSBpbiB1cGRhdGUgPyB1cGRhdGVbcHJvcE5hbWVdIDogcHJvcHNbcHJvcE5hbWVdXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY2xlYXIgdGhpcyBzYXZlZCBlZGl0IC0gd2UndmUgc3RhcnRlZCB3aXRoIHRoZSB3cm9uZ1xuICAgICAgICAgICAgLy8gdmFsdWUgZm9yIHRoaXMgcGVyc2lzdGVuY2UgSURcbiAgICAgICAgICAgIHN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwZXJzaXN0ZW5jZU1vZHMobGF5b3V0LCBjb21wb25lbnQsIHBhdGgsIGRpc3BhdGNoKSB7XG4gICAgY29uc3Qge1xuICAgICAgICBjYW5QZXJzaXN0LFxuICAgICAgICBpZCxcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHBlcnNpc3RlbmNlLFxuICAgICAgICBwZXJzaXN0ZWRfcHJvcHMsXG4gICAgICAgIHBlcnNpc3RlbmNlX3R5cGVcbiAgICB9ID0gZ2V0UHJvcHMoY29tcG9uZW50KTtcblxuICAgIGxldCBsYXlvdXRPdXQgPSBsYXlvdXQ7XG4gICAgaWYgKGNhblBlcnNpc3QgJiYgcGVyc2lzdGVuY2UpIHtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGdldFN0b3JlKHBlcnNpc3RlbmNlX3R5cGUsIGRpc3BhdGNoKTtcbiAgICAgICAgY29uc3QgdXBkYXRlID0ge307XG4gICAgICAgIGZvckVhY2goXG4gICAgICAgICAgICBwZXJzaXN0ZWRQcm9wID0+XG4gICAgICAgICAgICAgICAgbW9kUHJvcChcbiAgICAgICAgICAgICAgICAgICAgZ2V0VmFsc0tleShpZCwgcGVyc2lzdGVkUHJvcCwgcGVyc2lzdGVuY2UpLFxuICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVkUHJvcCxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHBlcnNpc3RlZF9wcm9wc1xuICAgICAgICApO1xuXG4gICAgICAgIGZvciAoY29uc3QgcHJvcE5hbWUgaW4gdXBkYXRlKSB7XG4gICAgICAgICAgICBsYXlvdXRPdXQgPSBzZXQoXG4gICAgICAgICAgICAgICAgbGVuc1BhdGgocGF0aC5jb25jYXQoJ3Byb3BzJywgcHJvcE5hbWUpKSxcbiAgICAgICAgICAgICAgICB1cGRhdGVbcHJvcE5hbWVdLFxuICAgICAgICAgICAgICAgIGxheW91dE91dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJlY3Vyc2UgaW53YXJkXG4gICAgY29uc3Qge2NoaWxkcmVufSA9IHByb3BzO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGUoY2hpbGQpID09PSAnT2JqZWN0JyAmJiBjaGlsZC5wcm9wcykge1xuICAgICAgICAgICAgICAgIGxheW91dE91dCA9IHBlcnNpc3RlbmNlTW9kcyhcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0T3V0LFxuICAgICAgICAgICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5jb25jYXQoJ3Byb3BzJywgJ2NoaWxkcmVuJywgaSksXG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlKGNoaWxkcmVuKSA9PT0gJ09iamVjdCcgJiYgY2hpbGRyZW4ucHJvcHMpIHtcbiAgICAgICAgbGF5b3V0T3V0ID0gcGVyc2lzdGVuY2VNb2RzKFxuICAgICAgICAgICAgbGF5b3V0T3V0LFxuICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICBwYXRoLmNvbmNhdCgncHJvcHMnLCAnY2hpbGRyZW4nKSxcbiAgICAgICAgICAgIGRpc3BhdGNoXG4gICAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBsYXlvdXRPdXQ7XG59XG5cbi8qXG4gKiBXaGVuIHdlIHJlY2VpdmUgbmV3IGV4cGxpY2l0IHByb3BzIGZyb20gYSBjYWxsYmFjayxcbiAqIHRoZXNlIG92ZXJyaWRlIFVJLWRyaXZlbiBlZGl0cyBvZiB0aG9zZSBleGFjdCBwcm9wc1xuICogYnV0IG5vdCBmb3IgcHJvcHMgbmVzdGVkIGluc2lkZSBjaGlsZHJlblxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJ1bmVQZXJzaXN0ZW5jZShsYXlvdXQsIG5ld1Byb3BzLCBkaXNwYXRjaCkge1xuICAgIGNvbnN0IHtcbiAgICAgICAgY2FuUGVyc2lzdCxcbiAgICAgICAgaWQsXG4gICAgICAgIHByb3BzLFxuICAgICAgICBwZXJzaXN0ZW5jZSxcbiAgICAgICAgcGVyc2lzdGVkX3Byb3BzLFxuICAgICAgICBwZXJzaXN0ZW5jZV90eXBlLFxuICAgICAgICBlbGVtZW50XG4gICAgfSA9IGdldFByb3BzKGxheW91dCk7XG5cbiAgICBjb25zdCBnZXRGaW5hbCA9IChwcm9wTmFtZSwgcHJldlZhbCkgPT5cbiAgICAgICAgcHJvcE5hbWUgaW4gbmV3UHJvcHMgPyBuZXdQcm9wc1twcm9wTmFtZV0gOiBwcmV2VmFsO1xuICAgIGNvbnN0IGZpbmFsUGVyc2lzdGVuY2UgPSBnZXRGaW5hbCgncGVyc2lzdGVuY2UnLCBwZXJzaXN0ZW5jZSk7XG5cbiAgICBpZiAoIWNhblBlcnNpc3QgfHwgIShwZXJzaXN0ZW5jZSB8fCBmaW5hbFBlcnNpc3RlbmNlKSkge1xuICAgICAgICByZXR1cm4gbmV3UHJvcHM7XG4gICAgfVxuXG4gICAgY29uc3QgZmluYWxQZXJzaXN0ZW5jZVR5cGUgPSBnZXRGaW5hbCgncGVyc2lzdGVuY2VfdHlwZScsIHBlcnNpc3RlbmNlX3R5cGUpO1xuICAgIGNvbnN0IGZpbmFsUGVyc2lzdGVkUHJvcHMgPSBnZXRGaW5hbCgncGVyc2lzdGVkX3Byb3BzJywgcGVyc2lzdGVkX3Byb3BzKTtcbiAgICBjb25zdCBwZXJzaXN0ZW5jZUNoYW5nZWQgPVxuICAgICAgICBmaW5hbFBlcnNpc3RlbmNlICE9PSBwZXJzaXN0ZW5jZSB8fFxuICAgICAgICBmaW5hbFBlcnNpc3RlbmNlVHlwZSAhPT0gcGVyc2lzdGVuY2VfdHlwZSB8fFxuICAgICAgICBmaW5hbFBlcnNpc3RlZFByb3BzICE9PSBwZXJzaXN0ZWRfcHJvcHM7XG5cbiAgICBjb25zdCBub3RJbk5ld1Byb3BzID0gcGVyc2lzdGVkUHJvcCA9PlxuICAgICAgICAhKHBlcnNpc3RlZFByb3Auc3BsaXQoJy4nKVswXSBpbiBuZXdQcm9wcyk7XG5cbiAgICBjb25zdCB1cGRhdGUgPSB7fTtcblxuICAgIGxldCBkZXBlcnNpc3RlZFByb3BzID0gcHJvcHM7XG5cbiAgICBpZiAocGVyc2lzdGVuY2VDaGFuZ2VkICYmIHBlcnNpc3RlbmNlKSB7XG4gICAgICAgIC8vIGNsZWFyIHByZXZpb3VzbHktYXBwbGllZCBwZXJzaXN0ZW5jZVxuICAgICAgICBjb25zdCBzdG9yYWdlID0gZ2V0U3RvcmUocGVyc2lzdGVuY2VfdHlwZSwgZGlzcGF0Y2gpO1xuICAgICAgICBmb3JFYWNoKFxuICAgICAgICAgICAgcGVyc2lzdGVkUHJvcCA9PlxuICAgICAgICAgICAgICAgIG1vZFByb3AoXG4gICAgICAgICAgICAgICAgICAgIGdldFZhbHNLZXkoaWQsIHBlcnNpc3RlZFByb3AsIHBlcnNpc3RlbmNlKSxcbiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlZFByb3AsXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgVU5ET1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBmaWx0ZXIobm90SW5OZXdQcm9wcywgcGVyc2lzdGVkX3Byb3BzKVxuICAgICAgICApO1xuICAgICAgICBkZXBlcnNpc3RlZFByb3BzID0gbWVyZ2VSaWdodChwcm9wcywgdXBkYXRlKTtcbiAgICB9XG5cbiAgICBpZiAoZmluYWxQZXJzaXN0ZW5jZSkge1xuICAgICAgICBjb25zdCBmaW5hbFN0b3JhZ2UgPSBnZXRTdG9yZShmaW5hbFBlcnNpc3RlbmNlVHlwZSwgZGlzcGF0Y2gpO1xuXG4gICAgICAgIGlmIChwZXJzaXN0ZW5jZUNoYW5nZWQpIHtcbiAgICAgICAgICAgIC8vIGFwcGx5IG5ldyBwZXJzaXN0ZW5jZVxuICAgICAgICAgICAgZm9yRWFjaChcbiAgICAgICAgICAgICAgICBwZXJzaXN0ZWRQcm9wID0+XG4gICAgICAgICAgICAgICAgICAgIG1vZFByb3AoXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWxzS2V5KGlkLCBwZXJzaXN0ZWRQcm9wLCBmaW5hbFBlcnNpc3RlbmNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsU3RvcmFnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXBlcnNpc3RlZFByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVkUHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGZpbHRlcihub3RJbk5ld1Byb3BzLCBmaW5hbFBlcnNpc3RlZFByb3BzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vdyB0aGUgbWFpbiBwb2ludCAtIGNsZWFyIGFueSBlZGl0IG9mIGEgcHJvcCB0aGF0IGNoYW5nZWRcbiAgICAgICAgLy8gbm90ZSB0aGF0IHRoaXMgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIG5ldyBwcm9wIHZhbHVlLlxuICAgICAgICBjb25zdCB0cmFuc2Zvcm1zID0gZWxlbWVudC5wZXJzaXN0ZW5jZVRyYW5zZm9ybXMgfHwge307XG4gICAgICAgIGZvciAoY29uc3QgcHJvcE5hbWUgaW4gbmV3UHJvcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BUcmFuc2Zvcm1zID0gdHJhbnNmb3Jtc1twcm9wTmFtZV07XG4gICAgICAgICAgICBpZiAocHJvcFRyYW5zZm9ybXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BQYXJ0IGluIHByb3BUcmFuc2Zvcm1zKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsU3RvcmFnZS5yZW1vdmVJdGVtKFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsc0tleShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtwcm9wTmFtZX0uJHtwcm9wUGFydH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsUGVyc2lzdGVuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbmFsU3RvcmFnZS5yZW1vdmVJdGVtKFxuICAgICAgICAgICAgICAgICAgICBnZXRWYWxzS2V5KGlkLCBwcm9wTmFtZSwgZmluYWxQZXJzaXN0ZW5jZSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwZXJzaXN0ZW5jZUNoYW5nZWQgPyBtZXJnZVJpZ2h0KG5ld1Byb3BzLCB1cGRhdGUpIDogbmV3UHJvcHM7XG59XG4iLCJpbXBvcnQge2Fzc29jLCBhc3NvY1BhdGgsIG1lcmdlUmlnaHR9IGZyb20gJ3JhbWRhJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlQXBpUmVkdWNlcihzdG9yZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBBcGlSZWR1Y2VyKHN0YXRlID0ge30sIGFjdGlvbikge1xuICAgICAgICBsZXQgbmV3U3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgaWYgKGFjdGlvbi50eXBlID09PSBzdG9yZSkge1xuICAgICAgICAgICAgY29uc3Qge2lkLCBzdGF0dXMsIGNvbnRlbnR9ID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgICAgICAgICBjb25zdCBuZXdSZXF1ZXN0ID0ge3N0YXR1cywgY29udGVudH07XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IGFzc29jUGF0aChpZCwgbmV3UmVxdWVzdCwgc3RhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpZCkge1xuICAgICAgICAgICAgICAgIG5ld1N0YXRlID0gYXNzb2MoaWQsIG5ld1JlcXVlc3QsIHN0YXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3U3RhdGUgPSBtZXJnZVJpZ2h0KHN0YXRlLCBuZXdSZXF1ZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3U3RhdGU7XG4gICAgfTtcbn1cbiIsImltcG9ydCB7Z2V0QWN0aW9ufSBmcm9tICcuLi9hY3Rpb25zL2NvbnN0YW50cyc7XG5pbXBvcnQge2dldEFwcFN0YXRlfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmZ1bmN0aW9uIGFwcExpZmVjeWNsZShzdGF0ZSA9IGdldEFwcFN0YXRlKCdTVEFSVEVEJyksIGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSBnZXRBY3Rpb24oJ1NFVF9BUFBfTElGRUNZQ0xFJyk6XG4gICAgICAgICAgICByZXR1cm4gZ2V0QXBwU3RhdGUoYWN0aW9uLnBheWxvYWQpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgYXBwTGlmZWN5Y2xlO1xuIiwiY29uc3QgaW5pdGlhbENoYW5nZSA9IHtcbiAgICBpZDogbnVsbCxcbiAgICBwcm9wczoge31cbn07XG5cbmZ1bmN0aW9uIGNoYW5nZWQoc3RhdGUgPSBpbml0aWFsQ2hhbmdlKSB7XG4gICAgLy8gVGhpcyBpcyBlbXB0eSBqdXN0IHRvIGluaXRpYWxpemUgdGhlIHN0b3JlLiBDaGFuZ2VzXG4gICAgLy8gYXJlIGFjdHVhbGx5IHJlY29yZGVkIGluIHJlZHVjZXIuanMgc28gdGhhdCB3ZSBjYW5cbiAgICAvLyByZXNvbHZlIHBhdGhzIHRvIGlkLlxuICAgIHJldHVybiBzdGF0ZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2hhbmdlZDtcbiIsImltcG9ydCB7Z2V0QWN0aW9ufSBmcm9tICcuLi9hY3Rpb25zL2NvbnN0YW50cyc7XG5pbXBvcnQge21lcmdlRGVlcFJpZ2h0fSBmcm9tICdyYW1kYSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbmZpZyhzdGF0ZSA9IG51bGwsIGFjdGlvbikge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gZ2V0QWN0aW9uKCdTRVRfQ09ORklHJykpIHtcbiAgICAgICAgLy8gUHV0IHRoZSBjb21wb25lbnRzIGNoaWxkcmVuUHJvcHMgaW4gd2luZG93cyBmb3Igc2lkZSB1c2FnZS5cbiAgICAgICAgd2luZG93Ll9fZGFzaHByaXZhdGVfY2hpbGRyZW5Qcm9wcyA9IG1lcmdlRGVlcFJpZ2h0KFxuICAgICAgICAgICAgd2luZG93Ll9fZGFzaHByaXZhdGVfY2hpbGRyZW5Qcm9wcyB8fCB7fSxcbiAgICAgICAgICAgIGFjdGlvbi5wYXlsb2FkLmNoaWxkcmVuX3Byb3BzXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSBnZXRBY3Rpb24oJ0FERF9IVFRQX0hFQURFUlMnKSkge1xuICAgICAgICByZXR1cm4gbWVyZ2VEZWVwUmlnaHQoc3RhdGUsIHtcbiAgICAgICAgICAgIGZldGNoOiB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogYWN0aW9uLnBheWxvYWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBnZXRBcHBTdGF0ZShzdGF0ZSkge1xuICAgIGNvbnN0IHN0YXRlTGlzdCA9IHtcbiAgICAgICAgU1RBUlRFRDogJ1NUQVJURUQnLFxuICAgICAgICBIWURSQVRFRDogJ0hZRFJBVEVEJyxcbiAgICAgICAgREVTVFJPWUVEOiAnREVTVFJPWUVEJ1xuICAgIH07XG4gICAgaWYgKHN0YXRlTGlzdFtzdGF0ZV0pIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlTGlzdFtzdGF0ZV07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgJHtzdGF0ZX0gaXMgbm90IGEgdmFsaWQgYXBwIHN0YXRlLmApO1xufVxuIiwiY29uc3QgaW5pdGlhbEdyYXBoID0ge307XG5cbmNvbnN0IGdyYXBocyA9IChzdGF0ZSA9IGluaXRpYWxHcmFwaCwgYWN0aW9uKSA9PiB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSAnU0VUX0dSQVBIUycpIHtcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBncmFwaHM7XG4iLCJpbXBvcnQge21lcmdlUmlnaHR9IGZyb20gJ3JhbWRhJztcblxuY29uc3QgaW5pdGlhbEVycm9yID0ge1xuICAgIGZyb250RW5kOiBbXSxcbiAgICBiYWNrRW5kOiBbXSxcbiAgICBiYWNrRW5kQ29ubmVjdGVkOiB0cnVlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBlcnJvcihzdGF0ZSA9IGluaXRpYWxFcnJvciwgYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdPTl9FUlJPUic6IHtcbiAgICAgICAgICAgIGNvbnN0IHtmcm9udEVuZCwgYmFja0VuZCwgYmFja0VuZENvbm5lY3RlZH0gPSBzdGF0ZTtcbiAgICAgICAgICAgIC8vIGxvZyBlcnJvcnMgdG8gdGhlIGNvbnNvbGUgZm9yIHN0YWNrIHRyYWNpbmcgYW5kIHNvIHRoZXkncmVcbiAgICAgICAgICAgIC8vIGF2YWlsYWJsZSBldmVuIHdpdGggZGVidWdnaW5nIG9mZlxuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGUgKi9cbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYWN0aW9uLnBheWxvYWQuZXJyb3IpO1xuXG4gICAgICAgICAgICBpZiAoYWN0aW9uLnBheWxvYWQudHlwZSA9PT0gJ2Zyb250RW5kJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGZyb250RW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXJnZVJpZ2h0KGFjdGlvbi5wYXlsb2FkLCB7dGltZXN0YW1wOiBuZXcgRGF0ZSgpfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5mcm9udEVuZFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBiYWNrRW5kLFxuICAgICAgICAgICAgICAgICAgICBiYWNrRW5kQ29ubmVjdGVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnBheWxvYWQudHlwZSA9PT0gJ2JhY2tFbmQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbnRFbmQsXG4gICAgICAgICAgICAgICAgICAgIGJhY2tFbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlUmlnaHQoYWN0aW9uLnBheWxvYWQsIHt0aW1lc3RhbXA6IG5ldyBEYXRlKCl9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmJhY2tFbmRcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgYmFja0VuZENvbm5lY3RlZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnU0VUX0NPTk5FQ1RJT05fU1RBVFVTJzoge1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlUmlnaHQoc3RhdGUsIHtiYWNrRW5kQ29ubmVjdGVkOiBhY3Rpb24ucGF5bG9hZH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiY29uc3QgaW5pdGlhbEhpc3RvcnkgPSB7XG4gICAgcGFzdDogW10sXG4gICAgcHJlc2VudDoge30sXG4gICAgZnV0dXJlOiBbXVxufTtcblxuZnVuY3Rpb24gaGlzdG9yeShzdGF0ZSA9IGluaXRpYWxIaXN0b3J5LCBhY3Rpb24pIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ1VORE8nOiB7XG4gICAgICAgICAgICBjb25zdCB7cGFzdCwgcHJlc2VudCwgZnV0dXJlfSA9IHN0YXRlO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBwYXN0W3Bhc3QubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBjb25zdCBuZXdQYXN0ID0gcGFzdC5zbGljZSgwLCBwYXN0Lmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBwYXN0OiBuZXdQYXN0LFxuICAgICAgICAgICAgICAgIHByZXNlbnQ6IHByZXZpb3VzLFxuICAgICAgICAgICAgICAgIGZ1dHVyZTogW3ByZXNlbnQsIC4uLmZ1dHVyZV1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdSRURPJzoge1xuICAgICAgICAgICAgY29uc3Qge3Bhc3QsIHByZXNlbnQsIGZ1dHVyZX0gPSBzdGF0ZTtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBmdXR1cmVbMF07XG4gICAgICAgICAgICBjb25zdCBuZXdGdXR1cmUgPSBmdXR1cmUuc2xpY2UoMSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHBhc3Q6IFsuLi5wYXN0LCBwcmVzZW50XSxcbiAgICAgICAgICAgICAgICBwcmVzZW50OiBuZXh0LFxuICAgICAgICAgICAgICAgIGZ1dHVyZTogbmV3RnV0dXJlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnUkVWRVJUJzoge1xuICAgICAgICAgICAgY29uc3Qge3Bhc3QsIGZ1dHVyZX0gPSBzdGF0ZTtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzID0gcGFzdFtwYXN0Lmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgY29uc3QgbmV3UGFzdCA9IHBhc3Quc2xpY2UoMCwgcGFzdC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcGFzdDogbmV3UGFzdCxcbiAgICAgICAgICAgICAgICBwcmVzZW50OiBwcmV2aW91cyxcbiAgICAgICAgICAgICAgICBmdXR1cmU6IFsuLi5mdXR1cmVdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBoaXN0b3J5O1xuIiwiY29uc3QgY3VzdG9tSG9va3MgPSAoXG4gICAgc3RhdGUgPSB7XG4gICAgICAgIGxheW91dF9wcmU6IG51bGwsXG4gICAgICAgIGxheW91dF9wb3N0OiBudWxsLFxuICAgICAgICByZXF1ZXN0X3ByZTogbnVsbCxcbiAgICAgICAgcmVxdWVzdF9wb3N0OiBudWxsLFxuICAgICAgICBjYWxsYmFja19yZXNvbHZlZDogbnVsbCxcbiAgICAgICAgcmVxdWVzdF9yZWZyZXNoX2p3dDogbnVsbCxcbiAgICAgICAgYmVhcjogZmFsc2VcbiAgICB9LFxuICAgIGFjdGlvblxuKSA9PiB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdTRVRfSE9PS1MnOlxuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGN1c3RvbUhvb2tzO1xuIiwiaW1wb3J0IHthcHBlbmQsIGFzc29jUGF0aCwgaW5jbHVkZXMsIGxlbnNQYXRoLCBtZXJnZVJpZ2h0LCB2aWV3fSBmcm9tICdyYW1kYSc7XG5cbmltcG9ydCB7Z2V0QWN0aW9ufSBmcm9tICcuLi9hY3Rpb25zL2NvbnN0YW50cyc7XG5cbmNvbnN0IGxheW91dCA9IChzdGF0ZSA9IHt9LCBhY3Rpb24pID0+IHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGdldEFjdGlvbignU0VUX0xBWU9VVCcpKSB7XG4gICAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICBpbmNsdWRlcyhhY3Rpb24udHlwZSwgW1xuICAgICAgICAgICAgJ1VORE9fUFJPUF9DSEFOR0UnLFxuICAgICAgICAgICAgJ1JFRE9fUFJPUF9DSEFOR0UnLFxuICAgICAgICAgICAgZ2V0QWN0aW9uKCdPTl9QUk9QX0NIQU5HRScpXG4gICAgICAgIF0pXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHByb3BQYXRoID0gYXBwZW5kKCdwcm9wcycsIGFjdGlvbi5wYXlsb2FkLml0ZW1wYXRoKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdQcm9wcyA9IHZpZXcobGVuc1BhdGgocHJvcFBhdGgpLCBzdGF0ZSk7XG4gICAgICAgIGNvbnN0IG1lcmdlZFByb3BzID0gbWVyZ2VSaWdodChleGlzdGluZ1Byb3BzLCBhY3Rpb24ucGF5bG9hZC5wcm9wcyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocHJvcFBhdGgsIG1lcmdlZFByb3BzLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbGF5b3V0O1xuIiwiaW1wb3J0IHtnZXRBY3Rpb259IGZyb20gJy4uL2FjdGlvbnMvY29uc3RhbnRzJztcblxuY29uc3QgaW5pdGlhbFBhdGhzID0ge3N0cnM6IHt9LCBvYmpzOiB7fX07XG5cbmNvbnN0IHBhdGhzID0gKHN0YXRlID0gaW5pdGlhbFBhdGhzLCBhY3Rpb24pID0+IHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGdldEFjdGlvbignU0VUX1BBVEhTJykpIHtcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBwYXRocztcbiIsImltcG9ydCB7Y2xvbmV9IGZyb20gJ3JhbWRhJztcblxuaW1wb3J0IHtTVEFUVVNNQVB9IGZyb20gJy4uL2NvbnN0YW50cy9jb25zdGFudHMnO1xuXG5jb25zdCBkZWZhdWx0UHJvZmlsZSA9IHtcbiAgICBjb3VudDogMCxcbiAgICB0b3RhbDogMCxcbiAgICBjb21wdXRlOiAwLFxuICAgIG5ldHdvcms6IHtcbiAgICAgICAgdGltZTogMCxcbiAgICAgICAgdXBsb2FkOiAwLFxuICAgICAgICBkb3dubG9hZDogMFxuICAgIH0sXG4gICAgcmVzb3VyY2VzOiB7fSxcbiAgICBzdGF0dXM6IHtcbiAgICAgICAgbGF0ZXN0OiBudWxsXG4gICAgfSxcbiAgICByZXN1bHQ6IHt9XG59O1xuXG5jb25zdCBkZWZhdWx0U3RhdGUgPSB7XG4gICAgdXBkYXRlZDogW10sXG4gICAgcmVzb3VyY2VzOiB7fSxcbiAgICBjYWxsYmFja3M6IHt9LFxuICAgIGdyYXBoTGF5b3V0OiBudWxsXG59O1xuXG5jb25zdCBwcm9maWxlID0gKHN0YXRlID0gZGVmYXVsdFN0YXRlLCBhY3Rpb24pID0+IHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdVUERBVEVfUkVTT1VSQ0VfVVNBR0UnKSB7XG4gICAgICAgIC8vIEtlZXAgYSByZWNvcmQgb2YgdGhlIG1vc3QgcmVjZW50IGNoYW5nZS4gVGhpc1xuICAgICAgICAvLyBpcyBzdWJ0bHkgZGlmZmVyZW50IGZyb20gaGlzdG9yeS5wcmVzZW50IGJlY2F1c2VcbiAgICAgICAgLy8gaXQgd2F0Y2hlcyBhbGwgcHJvcHMsIG5vdCBqdXN0IGlucHV0cy5cbiAgICAgICAgY29uc3Qge2lkLCB1c2FnZSwgc3RhdHVzfSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgICAgICBjb25zdCBzdGF0dXNNYXBwZWQgPSBTVEFUVVNNQVBbc3RhdHVzXSB8fCBzdGF0dXM7XG5cbiAgICAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgY2FsbGJhY2sgdGhhdCBhY3R1YWxseSBjaGFuZ2VkLlxuICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgICAgICAgIHVwZGF0ZWQ6IFtpZF0sXG4gICAgICAgICAgICByZXNvdXJjZXM6IHN0YXRlLnJlc291cmNlcyxcbiAgICAgICAgICAgIGNhbGxiYWNrczogc3RhdGUuY2FsbGJhY2tzLFxuICAgICAgICAgICAgLy8gZ3JhcGhMYXlvdXQgaXMgbmV2ZXIgcGFzc2VkIGluIHZpYSBhY3Rpb25zLCBiZWNhdXNlIHdlIGRvbid0XG4gICAgICAgICAgICAvLyB3YW50IGl0IHRvIHRyaWdnZXIgYSByZXJlbmRlciBvZiB0aGUgY2FsbGJhY2sgZ3JhcGguXG4gICAgICAgICAgICAvLyBTZWUgQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5yZWFjdFxuICAgICAgICAgICAgZ3JhcGhMYXlvdXQ6IHN0YXRlLmdyYXBoTGF5b3V0XG4gICAgICAgIH07XG5cbiAgICAgICAgbmV3U3RhdGUuY2FsbGJhY2tzW2lkXSA9XG4gICAgICAgICAgICBuZXdTdGF0ZS5jYWxsYmFja3NbaWRdIHx8IGNsb25lKGRlZmF1bHRQcm9maWxlKTtcblxuICAgICAgICBjb25zdCBjYiA9IG5ld1N0YXRlLmNhbGxiYWNrc1tpZF07XG4gICAgICAgIGNvbnN0IGNiUmVzb3VyY2VzID0gY2IucmVzb3VyY2VzO1xuICAgICAgICBjb25zdCB0b3RhbFJlc291cmNlcyA9IG5ld1N0YXRlLnJlc291cmNlcztcblxuICAgICAgICAvLyBVcGRhdGUgcmVzb3VyY2UgdXNhZ2UgJiBwYXJhbXMuXG4gICAgICAgIGNiLmNvdW50ICs9IDE7XG4gICAgICAgIGNiLnN0YXR1cy5sYXRlc3QgPSBzdGF0dXNNYXBwZWQ7XG4gICAgICAgIGNiLnN0YXR1c1tzdGF0dXNNYXBwZWRdID0gKGNiLnN0YXR1c1tzdGF0dXNNYXBwZWRdIHx8IDApICsgMTtcbiAgICAgICAgY2IucmVzdWx0ID0gYWN0aW9uLnBheWxvYWQucmVzdWx0O1xuICAgICAgICBjYi5pbnB1dHMgPSBhY3Rpb24ucGF5bG9hZC5pbnB1dHM7XG4gICAgICAgIGNiLnN0YXRlID0gYWN0aW9uLnBheWxvYWQuc3RhdGU7XG5cbiAgICAgICAgaWYgKHVzYWdlKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgX19kYXNoX2NsaWVudCxcbiAgICAgICAgICAgICAgICBfX2Rhc2hfc2VydmVyLFxuICAgICAgICAgICAgICAgIF9fZGFzaF91cGxvYWQsXG4gICAgICAgICAgICAgICAgX19kYXNoX2Rvd25sb2FkLFxuICAgICAgICAgICAgICAgIC4uLnVzZXJcbiAgICAgICAgICAgIH0gPSB1c2FnZTtcblxuICAgICAgICAgICAgY2IudG90YWwgKz0gX19kYXNoX2NsaWVudDtcbiAgICAgICAgICAgIGNiLmNvbXB1dGUgKz0gX19kYXNoX3NlcnZlcjtcbiAgICAgICAgICAgIGNiLm5ldHdvcmsudGltZSArPSBfX2Rhc2hfY2xpZW50IC0gX19kYXNoX3NlcnZlcjtcbiAgICAgICAgICAgIGNiLm5ldHdvcmsudXBsb2FkICs9IF9fZGFzaF91cGxvYWQ7XG4gICAgICAgICAgICBjYi5uZXR3b3JrLmRvd25sb2FkICs9IF9fZGFzaF9kb3dubG9hZDtcblxuICAgICAgICAgICAgZm9yIChjb25zdCByIGluIHVzZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAodXNlci5oYXNPd25Qcm9wZXJ0eShyKSkge1xuICAgICAgICAgICAgICAgICAgICBjYlJlc291cmNlc1tyXSA9IChjYlJlc291cmNlc1tyXSB8fCAwKSArIHVzZXJbcl07XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsUmVzb3VyY2VzW3JdID0gKHRvdGFsUmVzb3VyY2VzW3JdIHx8IDApICsgdXNlcltyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3U3RhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcHJvZmlsZTtcbiIsImltcG9ydCB7Zm9yRWFjaCwgaXNFbXB0eSwga2V5cywgcGF0aH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHtjb21iaW5lUmVkdWNlcnN9IGZyb20gJ3JlZHV4JztcblxuaW1wb3J0IHtnZXRDYWxsYmFja3NCeUlucHV0fSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llc190cyc7XG5cbmltcG9ydCBjcmVhdGVBcGlSZWR1Y2VyIGZyb20gJy4vYXBpJztcbmltcG9ydCBhcHBMaWZlY3ljbGUgZnJvbSAnLi9hcHBMaWZlY3ljbGUnO1xuaW1wb3J0IGNhbGxiYWNrcyBmcm9tICcuL2NhbGxiYWNrcyc7XG5pbXBvcnQgY29uZmlnIGZyb20gJy4vY29uZmlnJztcbmltcG9ydCBncmFwaHMgZnJvbSAnLi9kZXBlbmRlbmN5R3JhcGgnO1xuaW1wb3J0IGVycm9yIGZyb20gJy4vZXJyb3InO1xuaW1wb3J0IGhpc3RvcnkgZnJvbSAnLi9oaXN0b3J5JztcbmltcG9ydCBob29rcyBmcm9tICcuL2hvb2tzJztcbmltcG9ydCBwcm9maWxlIGZyb20gJy4vcHJvZmlsZSc7XG5pbXBvcnQgY2hhbmdlZCBmcm9tICcuL2NoYW5nZWQnO1xuaW1wb3J0IGlzTG9hZGluZyBmcm9tICcuL2lzTG9hZGluZyc7XG5pbXBvcnQgbGF5b3V0IGZyb20gJy4vbGF5b3V0JztcbmltcG9ydCBsb2FkaW5nTWFwIGZyb20gJy4vbG9hZGluZ01hcCc7XG5pbXBvcnQgcGF0aHMgZnJvbSAnLi9wYXRocyc7XG5pbXBvcnQgY2FsbGJhY2tKb2JzIGZyb20gJy4vY2FsbGJhY2tKb2JzJztcblxuZXhwb3J0IGNvbnN0IGFwaVJlcXVlc3RzID0gW1xuICAgICdkZXBlbmRlbmNpZXNSZXF1ZXN0JyxcbiAgICAnbGF5b3V0UmVxdWVzdCcsXG4gICAgJ3JlbG9hZFJlcXVlc3QnLFxuICAgICdsb2dpblJlcXVlc3QnXG5dO1xuXG5mdW5jdGlvbiBtYWluUmVkdWNlcigpIHtcbiAgICBjb25zdCBwYXJ0cyA9IHtcbiAgICAgICAgYXBwTGlmZWN5Y2xlLFxuICAgICAgICBjYWxsYmFja3MsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIGdyYXBocyxcbiAgICAgICAgaGlzdG9yeSxcbiAgICAgICAgaG9va3MsXG4gICAgICAgIHByb2ZpbGUsXG4gICAgICAgIGNoYW5nZWQsXG4gICAgICAgIGlzTG9hZGluZyxcbiAgICAgICAgbGF5b3V0LFxuICAgICAgICBsb2FkaW5nTWFwLFxuICAgICAgICBwYXRoc1xuICAgIH07XG4gICAgZm9yRWFjaChyID0+IHtcbiAgICAgICAgcGFydHNbcl0gPSBjcmVhdGVBcGlSZWR1Y2VyKHIpO1xuICAgIH0sIGFwaVJlcXVlc3RzKTtcblxuICAgIHBhcnRzLmNhbGxiYWNrSm9icyA9IGNhbGxiYWNrSm9icztcblxuICAgIHJldHVybiBjb21iaW5lUmVkdWNlcnMocGFydHMpO1xufVxuXG5mdW5jdGlvbiBnZXRJbnB1dEhpc3RvcnlTdGF0ZShwYXlsb2FkLCBzdGF0ZSwgcmVjb3JkQ2hhbmdlcykge1xuICAgIGNvbnN0IHtncmFwaHMsIHBhdGhzLCBsYXlvdXR9ID0gc3RhdGU7XG4gICAgY29uc3Qge2l0ZW1wYXRoLCBwcm9wc30gPSBwYXlsb2FkO1xuICAgIGNvbnN0IHJlZlByb3BzID0gcGF0aChpdGVtcGF0aC5jb25jYXQoWydwcm9wcyddKSwgbGF5b3V0KSB8fCB7fTtcbiAgICBjb25zdCB7aWR9ID0gcmVmUHJvcHM7XG5cbiAgICBsZXQgaGlzdG9yeUVudHJ5O1xuICAgIGlmIChpZCkge1xuICAgICAgICBpZiAocmVjb3JkQ2hhbmdlcykge1xuICAgICAgICAgICAgc3RhdGUuY2hhbmdlZCA9IHtpZCwgcHJvcHN9O1xuICAgICAgICB9XG5cbiAgICAgICAgaGlzdG9yeUVudHJ5ID0ge2lkLCBwcm9wczoge319O1xuICAgICAgICBrZXlzKHByb3BzKS5mb3JFYWNoKHByb3BLZXkgPT4ge1xuICAgICAgICAgICAgaWYgKGdldENhbGxiYWNrc0J5SW5wdXQoZ3JhcGhzLCBwYXRocywgaWQsIHByb3BLZXkpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGhpc3RvcnlFbnRyeS5wcm9wc1twcm9wS2V5XSA9IHJlZlByb3BzW3Byb3BLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGhpc3RvcnlFbnRyeTtcbn1cblxuZnVuY3Rpb24gcmVjb3JkSGlzdG9yeShyZWR1Y2VyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7XG4gICAgICAgIC8vIFJlY29yZCBpbml0aWFsIHN0YXRlXG4gICAgICAgIGNvbnN0IHt0eXBlLCBwYXlsb2FkfSA9IGFjdGlvbjtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdPTl9QUk9QX0NIQU5HRScpIHtcbiAgICAgICAgICAgIC8vIGhpc3RvcnkgcmVjb3JkcyBhbGwgcHJvcCBjaGFuZ2VzIHRoYXQgYXJlIGlucHV0cy5cbiAgICAgICAgICAgIGNvbnN0IGhpc3RvcnlFbnRyeSA9IGdldElucHV0SGlzdG9yeVN0YXRlKHBheWxvYWQsIHN0YXRlLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChoaXN0b3J5RW50cnkgJiYgIWlzRW1wdHkoaGlzdG9yeUVudHJ5LnByb3BzKSkge1xuICAgICAgICAgICAgICAgIHN0YXRlLmhpc3RvcnkucHJlc2VudCA9IGhpc3RvcnlFbnRyeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5leHRTdGF0ZSA9IHJlZHVjZXIoc3RhdGUsIGFjdGlvbik7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICdPTl9QUk9QX0NIQU5HRScgJiYgcGF5bG9hZC5zb3VyY2UgIT09ICdyZXNwb25zZScpIHtcbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgKiBpZiB0aGUgcHJvcCBjaGFuZ2UgaXMgYW4gaW5wdXQsIHRoZW5cbiAgICAgICAgICAgICAqIHJlY29yZCBpdCBzbyB0aGF0IGl0IGNhbiBiZSBwbGF5ZWQgYmFja1xuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBoaXN0b3J5RW50cnkgPSBnZXRJbnB1dEhpc3RvcnlTdGF0ZShwYXlsb2FkLCBuZXh0U3RhdGUpO1xuICAgICAgICAgICAgaWYgKGhpc3RvcnlFbnRyeSAmJiAhaXNFbXB0eShoaXN0b3J5RW50cnkucHJvcHMpKSB7XG4gICAgICAgICAgICAgICAgbmV4dFN0YXRlLmhpc3RvcnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3Q6IFsuLi5uZXh0U3RhdGUuaGlzdG9yeS5wYXN0LCBzdGF0ZS5oaXN0b3J5LnByZXNlbnRdLFxuICAgICAgICAgICAgICAgICAgICBwcmVzZW50OiBoaXN0b3J5RW50cnksXG4gICAgICAgICAgICAgICAgICAgIGZ1dHVyZTogW11cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiByZWxvYWRlclJlZHVjZXIocmVkdWNlcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuICAgICAgICBjb25zdCB7aGlzdG9yeSwgY29uZmlnLCBob29rc30gPSBzdGF0ZSB8fCB7fTtcbiAgICAgICAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG4gICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gJ1JFTE9BRCcpIHtcbiAgICAgICAgICAgIG5ld1N0YXRlID0ge2hpc3RvcnksIGNvbmZpZywgaG9va3N9O1xuICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSAnU0VUX0NPTkZJRycpIHtcbiAgICAgICAgICAgIC8vIG5ldyBjb25maWcgYWxzbyByZWxvYWRzLCBhbmQgZXZlbiBjbGVhcnMgaGlzdG9yeSxcbiAgICAgICAgICAgIC8vIGluIGNhc2UgdGhlcmUncyBhIG5ldyB1c2VyIG9yIGV2ZW4gYSB0b3RhbGx5IGRpZmZlcmVudCBhcHAhXG4gICAgICAgICAgICAvLyBob29rcyBhcmUgc2V0IGF0IGFuIGV2ZW4gaGlnaGVyIGxldmVsIHRoYW4gY29uZmlnIHRob3VnaC5cbiAgICAgICAgICAgIG5ld1N0YXRlID0ge2hvb2tzfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVkdWNlcihuZXdTdGF0ZSwgYWN0aW9uKTtcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkdWNlcigpIHtcbiAgICByZXR1cm4gcmVsb2FkZXJSZWR1Y2VyKHJlY29yZEhpc3RvcnkobWFpblJlZHVjZXIoKSkpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQge1xuICAgIHJlc29sdmU6IGNvbXBvbmVudCA9PiB7XG4gICAgICAgIGNvbnN0IHt0eXBlLCBuYW1lc3BhY2V9ID0gY29tcG9uZW50O1xuXG4gICAgICAgIGNvbnN0IG5zID0gd2luZG93W25hbWVzcGFjZV07XG5cbiAgICAgICAgaWYgKG5zKSB7XG4gICAgICAgICAgICBpZiAobnNbdHlwZV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnNbdHlwZV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tcG9uZW50ICR7dHlwZX0gbm90IGZvdW5kIGluICR7bmFtZXNwYWNlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke25hbWVzcGFjZX0gd2FzIG5vdCBmb3VuZC5gKTtcbiAgICB9XG59O1xuIiwiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiY29zZS1iYXNlXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtcImNvc2UtYmFzZVwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJjeXRvc2NhcGVGY29zZVwiXSA9IGZhY3RvcnkocmVxdWlyZShcImNvc2UtYmFzZVwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiY3l0b3NjYXBlRmNvc2VcIl0gPSBmYWN0b3J5KHJvb3RbXCJjb3NlQmFzZVwiXSk7XG59KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xNDBfXykge1xucmV0dXJuIC8qKioqKiovICgoKSA9PiB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0XCJ1c2Ugc3RyaWN0XCI7XG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlc19fID0gKHtcblxuLyoqKi8gNjU4OlxuLyoqKi8gKChtb2R1bGUpID0+IHtcblxuXG5cbi8vIFNpbXBsZSwgaW50ZXJuYWwgT2JqZWN0LmFzc2lnbigpIHBvbHlmaWxsIGZvciBvcHRpb25zIG9iamVjdHMgZXRjLlxuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5hc3NpZ24gIT0gbnVsbCA/IE9iamVjdC5hc3NpZ24uYmluZChPYmplY3QpIDogZnVuY3Rpb24gKHRndCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgc3JjcyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBzcmNzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHNyY3MuZm9yRWFjaChmdW5jdGlvbiAoc3JjKSB7XG4gICAgT2JqZWN0LmtleXMoc3JjKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICByZXR1cm4gdGd0W2tdID0gc3JjW2tdO1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gdGd0O1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU0ODpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBfc2xpY2VkVG9BcnJheSA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0pIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfSByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IHJldHVybiBhcnI7IH0gZWxzZSBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSB7IHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7IH0gZWxzZSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9IH07IH0oKTtcblxuLypcbiAqIEF1eGlsaWFyeSBmdW5jdGlvbnNcbiAqL1xuXG52YXIgTGlua2VkTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5sYXlvdXRCYXNlLkxpbmtlZExpc3Q7XG5cbnZhciBhdXhpbGlhcnkgPSB7fTtcblxuLy8gZ2V0IHRoZSB0b3AgbW9zdCBub2Rlc1xuYXV4aWxpYXJ5LmdldFRvcE1vc3ROb2RlcyA9IGZ1bmN0aW9uIChub2Rlcykge1xuICB2YXIgbm9kZXNNYXAgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIG5vZGVzTWFwW25vZGVzW2ldLmlkKCldID0gdHJ1ZTtcbiAgfVxuICB2YXIgcm9vdHMgPSBub2Rlcy5maWx0ZXIoZnVuY3Rpb24gKGVsZSwgaSkge1xuICAgIGlmICh0eXBlb2YgZWxlID09PSBcIm51bWJlclwiKSB7XG4gICAgICBlbGUgPSBpO1xuICAgIH1cbiAgICB2YXIgcGFyZW50ID0gZWxlLnBhcmVudCgpWzBdO1xuICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGVzTWFwW3BhcmVudC5pZCgpXSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50KClbMF07XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gcm9vdHM7XG59O1xuXG4vLyBmaW5kIGRpc2Nvbm5lY3RlZCBjb21wb25lbnRzIGFuZCBjcmVhdGUgZHVtbXkgbm9kZXMgdGhhdCBjb25uZWN0IHRoZW1cbmF1eGlsaWFyeS5jb25uZWN0Q29tcG9uZW50cyA9IGZ1bmN0aW9uIChjeSwgZWxlcywgdG9wTW9zdE5vZGVzLCBkdW1teU5vZGVzKSB7XG4gIHZhciBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0KCk7XG4gIHZhciB2aXNpdGVkID0gbmV3IFNldCgpO1xuICB2YXIgdmlzaXRlZFRvcE1vc3ROb2RlcyA9IFtdO1xuICB2YXIgY3VycmVudE5laWdoYm9yID0gdm9pZCAwO1xuICB2YXIgbWluRGVncmVlTm9kZSA9IHZvaWQgMDtcbiAgdmFyIG1pbkRlZ3JlZSA9IHZvaWQgMDtcblxuICB2YXIgaXNDb25uZWN0ZWQgPSBmYWxzZTtcbiAgdmFyIGNvdW50ID0gMTtcbiAgdmFyIG5vZGVzQ29ubmVjdGVkVG9EdW1teSA9IFtdO1xuICB2YXIgY29tcG9uZW50cyA9IFtdO1xuXG4gIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgIHZhciBjbXB0ID0gY3kuY29sbGVjdGlvbigpO1xuICAgIGNvbXBvbmVudHMucHVzaChjbXB0KTtcblxuICAgIHZhciBjdXJyZW50Tm9kZSA9IHRvcE1vc3ROb2Rlc1swXTtcbiAgICB2YXIgY2hpbGRyZW5PZkN1cnJlbnROb2RlID0gY3kuY29sbGVjdGlvbigpO1xuICAgIGNoaWxkcmVuT2ZDdXJyZW50Tm9kZS5tZXJnZShjdXJyZW50Tm9kZSkubWVyZ2UoY3VycmVudE5vZGUuZGVzY2VuZGFudHMoKS5pbnRlcnNlY3Rpb24oZWxlcykpO1xuICAgIHZpc2l0ZWRUb3BNb3N0Tm9kZXMucHVzaChjdXJyZW50Tm9kZSk7XG5cbiAgICBjaGlsZHJlbk9mQ3VycmVudE5vZGUuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgcXVldWUucHVzaChub2RlKTtcbiAgICAgIHZpc2l0ZWQuYWRkKG5vZGUpO1xuICAgICAgY21wdC5tZXJnZShub2RlKTtcbiAgICB9KTtcblxuICAgIHZhciBfbG9vcDIgPSBmdW5jdGlvbiBfbG9vcDIoKSB7XG4gICAgICBjdXJyZW50Tm9kZSA9IHF1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgIC8vIFRyYXZlcnNlIGFsbCBuZWlnaGJvcnMgb2YgdGhpcyBub2RlXG4gICAgICB2YXIgbmVpZ2hib3JOb2RlcyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgIGN1cnJlbnROb2RlLm5laWdoYm9yaG9vZCgpLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAoZWxlcy5pbnRlcnNlY3Rpb24oY3VycmVudE5vZGUuZWRnZXNXaXRoKG5vZGUpKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbmVpZ2hib3JOb2Rlcy5tZXJnZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVpZ2hib3JOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbmVpZ2hib3JOb2RlID0gbmVpZ2hib3JOb2Rlc1tpXTtcbiAgICAgICAgY3VycmVudE5laWdoYm9yID0gdG9wTW9zdE5vZGVzLmludGVyc2VjdGlvbihuZWlnaGJvck5vZGUudW5pb24obmVpZ2hib3JOb2RlLmFuY2VzdG9ycygpKSk7XG4gICAgICAgIGlmIChjdXJyZW50TmVpZ2hib3IgIT0gbnVsbCAmJiAhdmlzaXRlZC5oYXMoY3VycmVudE5laWdoYm9yWzBdKSkge1xuICAgICAgICAgIHZhciBjaGlsZHJlbk9mTmVpZ2hib3IgPSBjdXJyZW50TmVpZ2hib3IudW5pb24oY3VycmVudE5laWdoYm9yLmRlc2NlbmRhbnRzKCkpO1xuXG4gICAgICAgICAgY2hpbGRyZW5PZk5laWdoYm9yLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2gobm9kZSk7XG4gICAgICAgICAgICB2aXNpdGVkLmFkZChub2RlKTtcbiAgICAgICAgICAgIGNtcHQubWVyZ2Uobm9kZSk7XG4gICAgICAgICAgICBpZiAodG9wTW9zdE5vZGVzLmhhcyhub2RlKSkge1xuICAgICAgICAgICAgICB2aXNpdGVkVG9wTW9zdE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPSAwKSB7XG4gICAgICBfbG9vcDIoKTtcbiAgICB9XG5cbiAgICBjbXB0LmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIGVsZXMuaW50ZXJzZWN0aW9uKG5vZGUuY29ubmVjdGVkRWRnZXMoKSkuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAvLyBjb25uZWN0ZWRFZGdlcygpIHVzdWFsbHkgY2FjaGVkXG4gICAgICAgIGlmIChjbXB0LmhhcyhlLnNvdXJjZSgpKSAmJiBjbXB0LmhhcyhlLnRhcmdldCgpKSkge1xuICAgICAgICAgIC8vIGhhcygpIGlzIGNoZWFwXG4gICAgICAgICAgY21wdC5tZXJnZShlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAodmlzaXRlZFRvcE1vc3ROb2Rlcy5sZW5ndGggPT0gdG9wTW9zdE5vZGVzLmxlbmd0aCkge1xuICAgICAgaXNDb25uZWN0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghaXNDb25uZWN0ZWQgfHwgaXNDb25uZWN0ZWQgJiYgY291bnQgPiAxKSB7XG4gICAgICBtaW5EZWdyZWVOb2RlID0gdmlzaXRlZFRvcE1vc3ROb2Rlc1swXTtcbiAgICAgIG1pbkRlZ3JlZSA9IG1pbkRlZ3JlZU5vZGUuY29ubmVjdGVkRWRnZXMoKS5sZW5ndGg7XG4gICAgICB2aXNpdGVkVG9wTW9zdE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuY29ubmVjdGVkRWRnZXMoKS5sZW5ndGggPCBtaW5EZWdyZWUpIHtcbiAgICAgICAgICBtaW5EZWdyZWUgPSBub2RlLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoO1xuICAgICAgICAgIG1pbkRlZ3JlZU5vZGUgPSBub2RlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIG5vZGVzQ29ubmVjdGVkVG9EdW1teS5wdXNoKG1pbkRlZ3JlZU5vZGUuaWQoKSk7XG4gICAgICAvLyBUTyBETzogQ2hlY2sgZWZmaWNpZW5jeSBvZiB0aGlzIHBhcnRcbiAgICAgIHZhciB0ZW1wID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgdGVtcC5tZXJnZSh2aXNpdGVkVG9wTW9zdE5vZGVzWzBdKTtcbiAgICAgIHZpc2l0ZWRUb3BNb3N0Tm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB0ZW1wLm1lcmdlKG5vZGUpO1xuICAgICAgfSk7XG4gICAgICB2aXNpdGVkVG9wTW9zdE5vZGVzID0gW107XG4gICAgICB0b3BNb3N0Tm9kZXMgPSB0b3BNb3N0Tm9kZXMuZGlmZmVyZW5jZSh0ZW1wKTtcbiAgICAgIGNvdW50Kys7XG4gICAgfVxuICB9O1xuXG4gIGRvIHtcbiAgICBfbG9vcCgpO1xuICB9IHdoaWxlICghaXNDb25uZWN0ZWQpO1xuXG4gIGlmIChkdW1teU5vZGVzKSB7XG4gICAgaWYgKG5vZGVzQ29ubmVjdGVkVG9EdW1teS5sZW5ndGggPiAwKSB7XG4gICAgICBkdW1teU5vZGVzLnNldCgnZHVtbXknICsgKGR1bW15Tm9kZXMuc2l6ZSArIDEpLCBub2Rlc0Nvbm5lY3RlZFRvRHVtbXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29tcG9uZW50cztcbn07XG5cbi8vIHJlbG9jYXRlcyBjb21wb25lbnRSZXN1bHQgdG8gb3JpZ2luYWxDZW50ZXIgaWYgdGhlcmUgaXMgbm8gZml4ZWROb2RlQ29uc3RyYWludFxuYXV4aWxpYXJ5LnJlbG9jYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKG9yaWdpbmFsQ2VudGVyLCBjb21wb25lbnRSZXN1bHQsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zLmZpeGVkTm9kZUNvbnN0cmFpbnQpIHtcbiAgICB2YXIgbWluWENvb3JkID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIHZhciBtYXhYQ29vcmQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgdmFyIG1pbllDb29yZCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICB2YXIgbWF4WUNvb3JkID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiKSB7XG4gICAgICAvLyBjYWxjdWxhdGUgY3VycmVudCBib3VuZGluZyBib3hcbiAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlO1xuICAgICAgdmFyIF9pdGVyYXRvckVycm9yID0gdW5kZWZpbmVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBjb21wb25lbnRSZXN1bHQubm9kZUluZGV4ZXNbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gKF9zdGVwID0gX2l0ZXJhdG9yLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlKSB7XG4gICAgICAgICAgdmFyIF9yZWYgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpO1xuXG4gICAgICAgICAgdmFyIGtleSA9IF9yZWYyWzBdO1xuICAgICAgICAgIHZhciB2YWx1ZSA9IF9yZWYyWzFdO1xuXG4gICAgICAgICAgdmFyIGN5Tm9kZSA9IG9wdGlvbnMuY3kuZ2V0RWxlbWVudEJ5SWQoa2V5KTtcbiAgICAgICAgICBpZiAoY3lOb2RlKSB7XG4gICAgICAgICAgICB2YXIgbm9kZUJCID0gY3lOb2RlLmJvdW5kaW5nQm94KCk7XG4gICAgICAgICAgICB2YXIgbGVmdFggPSBjb21wb25lbnRSZXN1bHQueENvb3Jkc1t2YWx1ZV0gLSBub2RlQkIudyAvIDI7XG4gICAgICAgICAgICB2YXIgcmlnaHRYID0gY29tcG9uZW50UmVzdWx0LnhDb29yZHNbdmFsdWVdICsgbm9kZUJCLncgLyAyO1xuICAgICAgICAgICAgdmFyIHRvcFkgPSBjb21wb25lbnRSZXN1bHQueUNvb3Jkc1t2YWx1ZV0gLSBub2RlQkIuaCAvIDI7XG4gICAgICAgICAgICB2YXIgYm90dG9tWSA9IGNvbXBvbmVudFJlc3VsdC55Q29vcmRzW3ZhbHVlXSArIG5vZGVCQi5oIC8gMjtcblxuICAgICAgICAgICAgaWYgKGxlZnRYIDwgbWluWENvb3JkKSBtaW5YQ29vcmQgPSBsZWZ0WDtcbiAgICAgICAgICAgIGlmIChyaWdodFggPiBtYXhYQ29vcmQpIG1heFhDb29yZCA9IHJpZ2h0WDtcbiAgICAgICAgICAgIGlmICh0b3BZIDwgbWluWUNvb3JkKSBtaW5ZQ29vcmQgPSB0b3BZO1xuICAgICAgICAgICAgaWYgKGJvdHRvbVkgPiBtYXhZQ29vcmQpIG1heFlDb29yZCA9IGJvdHRvbVk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGZpbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgYW5kIG9yaWdpbmFsIGNlbnRlclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgX2l0ZXJhdG9yRXJyb3IgPSBlcnI7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3IucmV0dXJuKSB7XG4gICAgICAgICAgICBfaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBkaWZmT25YID0gb3JpZ2luYWxDZW50ZXIueCAtIChtYXhYQ29vcmQgKyBtaW5YQ29vcmQpIC8gMjtcbiAgICAgIHZhciBkaWZmT25ZID0gb3JpZ2luYWxDZW50ZXIueSAtIChtYXhZQ29vcmQgKyBtaW5ZQ29vcmQpIC8gMjtcbiAgICAgIC8vIG1vdmUgY29tcG9uZW50IHRvIG9yaWdpbmFsIGNlbnRlclxuICAgICAgY29tcG9uZW50UmVzdWx0LnhDb29yZHMgPSBjb21wb25lbnRSZXN1bHQueENvb3Jkcy5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHggKyBkaWZmT25YO1xuICAgICAgfSk7XG4gICAgICBjb21wb25lbnRSZXN1bHQueUNvb3JkcyA9IGNvbXBvbmVudFJlc3VsdC55Q29vcmRzLm1hcChmdW5jdGlvbiAoeSkge1xuICAgICAgICByZXR1cm4geSArIGRpZmZPblk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY2FsY3VsYXRlIGN1cnJlbnQgYm91bmRpbmcgYm94XG4gICAgICBPYmplY3Qua2V5cyhjb21wb25lbnRSZXN1bHQpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgdmFyIG5vZGUgPSBjb21wb25lbnRSZXN1bHRbaXRlbV07XG4gICAgICAgIHZhciBsZWZ0WCA9IG5vZGUuZ2V0UmVjdCgpLng7XG4gICAgICAgIHZhciByaWdodFggPSBub2RlLmdldFJlY3QoKS54ICsgbm9kZS5nZXRSZWN0KCkud2lkdGg7XG4gICAgICAgIHZhciB0b3BZID0gbm9kZS5nZXRSZWN0KCkueTtcbiAgICAgICAgdmFyIGJvdHRvbVkgPSBub2RlLmdldFJlY3QoKS55ICsgbm9kZS5nZXRSZWN0KCkuaGVpZ2h0O1xuXG4gICAgICAgIGlmIChsZWZ0WCA8IG1pblhDb29yZCkgbWluWENvb3JkID0gbGVmdFg7XG4gICAgICAgIGlmIChyaWdodFggPiBtYXhYQ29vcmQpIG1heFhDb29yZCA9IHJpZ2h0WDtcbiAgICAgICAgaWYgKHRvcFkgPCBtaW5ZQ29vcmQpIG1pbllDb29yZCA9IHRvcFk7XG4gICAgICAgIGlmIChib3R0b21ZID4gbWF4WUNvb3JkKSBtYXhZQ29vcmQgPSBib3R0b21ZO1xuICAgICAgfSk7XG4gICAgICAvLyBmaW5kIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyZW50IGFuZCBvcmlnaW5hbCBjZW50ZXJcbiAgICAgIHZhciBfZGlmZk9uWCA9IG9yaWdpbmFsQ2VudGVyLnggLSAobWF4WENvb3JkICsgbWluWENvb3JkKSAvIDI7XG4gICAgICB2YXIgX2RpZmZPblkgPSBvcmlnaW5hbENlbnRlci55IC0gKG1heFlDb29yZCArIG1pbllDb29yZCkgLyAyO1xuICAgICAgLy8gbW92ZSBjb21wb25lbnQgdG8gb3JpZ2luYWwgY2VudGVyXG4gICAgICBPYmplY3Qua2V5cyhjb21wb25lbnRSZXN1bHQpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgdmFyIG5vZGUgPSBjb21wb25lbnRSZXN1bHRbaXRlbV07XG4gICAgICAgIG5vZGUuc2V0Q2VudGVyKG5vZGUuZ2V0Q2VudGVyWCgpICsgX2RpZmZPblgsIG5vZGUuZ2V0Q2VudGVyWSgpICsgX2RpZmZPblkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59O1xuXG5hdXhpbGlhcnkuY2FsY0JvdW5kaW5nQm94ID0gZnVuY3Rpb24gKHBhcmVudE5vZGUsIHhDb29yZHMsIHlDb29yZHMsIG5vZGVJbmRleGVzKSB7XG4gIC8vIGNhbGN1bGF0ZSBib3VuZHNcbiAgdmFyIGxlZnQgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgdmFyIHJpZ2h0ID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gIHZhciB0b3AgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgdmFyIGJvdHRvbSA9IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSO1xuICB2YXIgbm9kZUxlZnQgPSB2b2lkIDA7XG4gIHZhciBub2RlUmlnaHQgPSB2b2lkIDA7XG4gIHZhciBub2RlVG9wID0gdm9pZCAwO1xuICB2YXIgbm9kZUJvdHRvbSA9IHZvaWQgMDtcblxuICB2YXIgbm9kZXMgPSBwYXJlbnROb2RlLmRlc2NlbmRhbnRzKCkubm90KFwiOnBhcmVudFwiKTtcbiAgdmFyIHMgPSBub2Rlcy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcblxuICAgIG5vZGVMZWZ0ID0geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZS5pZCgpKV0gLSBub2RlLndpZHRoKCkgLyAyO1xuICAgIG5vZGVSaWdodCA9IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGUuaWQoKSldICsgbm9kZS53aWR0aCgpIC8gMjtcbiAgICBub2RlVG9wID0geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZS5pZCgpKV0gLSBub2RlLmhlaWdodCgpIC8gMjtcbiAgICBub2RlQm90dG9tID0geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZS5pZCgpKV0gKyBub2RlLmhlaWdodCgpIC8gMjtcblxuICAgIGlmIChsZWZ0ID4gbm9kZUxlZnQpIHtcbiAgICAgIGxlZnQgPSBub2RlTGVmdDtcbiAgICB9XG5cbiAgICBpZiAocmlnaHQgPCBub2RlUmlnaHQpIHtcbiAgICAgIHJpZ2h0ID0gbm9kZVJpZ2h0O1xuICAgIH1cblxuICAgIGlmICh0b3AgPiBub2RlVG9wKSB7XG4gICAgICB0b3AgPSBub2RlVG9wO1xuICAgIH1cblxuICAgIGlmIChib3R0b20gPCBub2RlQm90dG9tKSB7XG4gICAgICBib3R0b20gPSBub2RlQm90dG9tO1xuICAgIH1cbiAgfVxuXG4gIHZhciBib3VuZGluZ0JveCA9IHt9O1xuICBib3VuZGluZ0JveC50b3BMZWZ0WCA9IGxlZnQ7XG4gIGJvdW5kaW5nQm94LnRvcExlZnRZID0gdG9wO1xuICBib3VuZGluZ0JveC53aWR0aCA9IHJpZ2h0IC0gbGVmdDtcbiAgYm91bmRpbmdCb3guaGVpZ2h0ID0gYm90dG9tIC0gdG9wO1xuICByZXR1cm4gYm91bmRpbmdCb3g7XG59O1xuXG4vLyBUaGlzIGZ1bmN0aW9uIGZpbmRzIGFuZCByZXR1cm5zIHBhcmVudCBub2RlcyB3aG9zZSBhbGwgY2hpbGRyZW4gYXJlIGhpZGRlblxuYXV4aWxpYXJ5LmNhbGNQYXJlbnRzV2l0aG91dENoaWxkcmVuID0gZnVuY3Rpb24gKGN5LCBlbGVzKSB7XG4gIHZhciBwYXJlbnRzV2l0aG91dENoaWxkcmVuID0gY3kuY29sbGVjdGlvbigpO1xuICBlbGVzLm5vZGVzKCc6cGFyZW50JykuZm9yRWFjaChmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgdmFyIGNoZWNrID0gZmFsc2U7XG4gICAgcGFyZW50LmNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIGlmIChjaGlsZC5jc3MoJ2Rpc3BsYXknKSAhPSAnbm9uZScpIHtcbiAgICAgICAgY2hlY2sgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghY2hlY2spIHtcbiAgICAgIHBhcmVudHNXaXRob3V0Q2hpbGRyZW4ubWVyZ2UocGFyZW50KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJlbnRzV2l0aG91dENoaWxkcmVuO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBhdXhpbGlhcnk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4MTY6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG4vKipcbiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwb3N0cHJvY2Vzc2luZyBwYXJ0IHRoYXQgYXBwbGllcyBDb1NFIGxheW91dCBvdmVyIHRoZSBzcGVjdHJhbCBsYXlvdXRcbiovXG5cbnZhciBhdXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0OCk7XG52YXIgQ29TRUxheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5Db1NFTGF5b3V0O1xudmFyIENvU0VOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLkNvU0VOb2RlO1xudmFyIFBvaW50RCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5sYXlvdXRCYXNlLlBvaW50RDtcbnZhciBEaW1lbnNpb25EID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLmxheW91dEJhc2UuRGltZW5zaW9uRDtcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0MCkubGF5b3V0QmFzZS5MYXlvdXRDb25zdGFudHM7XG52YXIgRkRMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0MCkubGF5b3V0QmFzZS5GRExheW91dENvbnN0YW50cztcbnZhciBDb1NFQ29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLkNvU0VDb25zdGFudHM7XG5cbi8vIG1haW4gZnVuY3Rpb24gdGhhdCBjb3NlIGxheW91dCBpcyBwcm9jZXNzZWRcbnZhciBjb3NlTGF5b3V0ID0gZnVuY3Rpb24gY29zZUxheW91dChvcHRpb25zLCBzcGVjdHJhbFJlc3VsdCkge1xuXG4gIHZhciBjeSA9IG9wdGlvbnMuY3k7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCk7XG4gIHZhciBlZGdlcyA9IGVsZXMuZWRnZXMoKTtcblxuICB2YXIgbm9kZUluZGV4ZXMgPSB2b2lkIDA7XG4gIHZhciB4Q29vcmRzID0gdm9pZCAwO1xuICB2YXIgeUNvb3JkcyA9IHZvaWQgMDtcbiAgdmFyIGlkVG9MTm9kZSA9IHt9O1xuXG4gIGlmIChvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgIG5vZGVJbmRleGVzID0gc3BlY3RyYWxSZXN1bHRbXCJub2RlSW5kZXhlc1wiXTtcbiAgICB4Q29vcmRzID0gc3BlY3RyYWxSZXN1bHRbXCJ4Q29vcmRzXCJdO1xuICAgIHlDb29yZHMgPSBzcGVjdHJhbFJlc3VsdFtcInlDb29yZHNcIl07XG4gIH1cblxuICB2YXIgaXNGbiA9IGZ1bmN0aW9uIGlzRm4oZm4pIHtcbiAgICByZXR1cm4gdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nO1xuICB9O1xuXG4gIHZhciBvcHRGbiA9IGZ1bmN0aW9uIG9wdEZuKG9wdCwgZWxlKSB7XG4gICAgaWYgKGlzRm4ob3B0KSkge1xuICAgICAgcmV0dXJuIG9wdChlbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3B0O1xuICAgIH1cbiAgfTtcblxuICAvKioqKiBQb3N0cHJvY2Vzc2luZyBmdW5jdGlvbnMgKioqKi9cblxuICB2YXIgcGFyZW50c1dpdGhvdXRDaGlsZHJlbiA9IGF1eC5jYWxjUGFyZW50c1dpdGhvdXRDaGlsZHJlbihjeSwgZWxlcyk7XG5cbiAgLy8gdHJhbnNmZXIgY3l0b3NjYXBlIG5vZGVzIHRvIGNvc2Ugbm9kZXNcbiAgdmFyIHByb2Nlc3NDaGlsZHJlbkxpc3QgPSBmdW5jdGlvbiBwcm9jZXNzQ2hpbGRyZW5MaXN0KHBhcmVudCwgY2hpbGRyZW4sIGxheW91dCwgb3B0aW9ucykge1xuICAgIHZhciBzaXplID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICB2YXIgdGhlQ2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIHZhciBjaGlsZHJlbl9vZl9jaGlsZHJlbiA9IG51bGw7XG4gICAgICBpZiAodGhlQ2hpbGQuaW50ZXJzZWN0aW9uKHBhcmVudHNXaXRob3V0Q2hpbGRyZW4pLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIGNoaWxkcmVuX29mX2NoaWxkcmVuID0gdGhlQ2hpbGQuY2hpbGRyZW4oKTtcbiAgICAgIH1cbiAgICAgIHZhciB0aGVOb2RlID0gdm9pZCAwO1xuXG4gICAgICB2YXIgZGltZW5zaW9ucyA9IHRoZUNoaWxkLmxheW91dERpbWVuc2lvbnMoe1xuICAgICAgICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IG9wdGlvbnMubm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzXG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoZUNoaWxkLm91dGVyV2lkdGgoKSAhPSBudWxsICYmIHRoZUNoaWxkLm91dGVySGVpZ2h0KCkgIT0gbnVsbCkge1xuICAgICAgICBpZiAob3B0aW9ucy5yYW5kb21pemUpIHtcbiAgICAgICAgICBpZiAoIXRoZUNoaWxkLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgIHRoZU5vZGUgPSBwYXJlbnQuYWRkKG5ldyBDb1NFTm9kZShsYXlvdXQuZ3JhcGhNYW5hZ2VyLCBuZXcgUG9pbnREKHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KHRoZUNoaWxkLmlkKCkpXSAtIGRpbWVuc2lvbnMudyAvIDIsIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KHRoZUNoaWxkLmlkKCkpXSAtIGRpbWVuc2lvbnMuaCAvIDIpLCBuZXcgRGltZW5zaW9uRChwYXJzZUZsb2F0KGRpbWVuc2lvbnMudyksIHBhcnNlRmxvYXQoZGltZW5zaW9ucy5oKSkpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHBhcmVudEluZm8gPSBhdXguY2FsY0JvdW5kaW5nQm94KHRoZUNoaWxkLCB4Q29vcmRzLCB5Q29vcmRzLCBub2RlSW5kZXhlcyk7XG4gICAgICAgICAgICBpZiAodGhlQ2hpbGQuaW50ZXJzZWN0aW9uKHBhcmVudHNXaXRob3V0Q2hpbGRyZW4pLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgIHRoZU5vZGUgPSBwYXJlbnQuYWRkKG5ldyBDb1NFTm9kZShsYXlvdXQuZ3JhcGhNYW5hZ2VyLCBuZXcgUG9pbnREKHBhcmVudEluZm8udG9wTGVmdFgsIHBhcmVudEluZm8udG9wTGVmdFkpLCBuZXcgRGltZW5zaW9uRChwYXJlbnRJbmZvLndpZHRoLCBwYXJlbnRJbmZvLmhlaWdodCkpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGZvciB0aGUgcGFyZW50c1dpdGhvdXRDaGlsZHJlblxuICAgICAgICAgICAgICB0aGVOb2RlID0gcGFyZW50LmFkZChuZXcgQ29TRU5vZGUobGF5b3V0LmdyYXBoTWFuYWdlciwgbmV3IFBvaW50RChwYXJlbnRJbmZvLnRvcExlZnRYLCBwYXJlbnRJbmZvLnRvcExlZnRZKSwgbmV3IERpbWVuc2lvbkQocGFyc2VGbG9hdChkaW1lbnNpb25zLncpLCBwYXJzZUZsb2F0KGRpbWVuc2lvbnMuaCkpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoZU5vZGUgPSBwYXJlbnQuYWRkKG5ldyBDb1NFTm9kZShsYXlvdXQuZ3JhcGhNYW5hZ2VyLCBuZXcgUG9pbnREKHRoZUNoaWxkLnBvc2l0aW9uKCd4JykgLSBkaW1lbnNpb25zLncgLyAyLCB0aGVDaGlsZC5wb3NpdGlvbigneScpIC0gZGltZW5zaW9ucy5oIC8gMiksIG5ldyBEaW1lbnNpb25EKHBhcnNlRmxvYXQoZGltZW5zaW9ucy53KSwgcGFyc2VGbG9hdChkaW1lbnNpb25zLmgpKSkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGVOb2RlID0gcGFyZW50LmFkZChuZXcgQ29TRU5vZGUodGhpcy5ncmFwaE1hbmFnZXIpKTtcbiAgICAgIH1cbiAgICAgIC8vIEF0dGFjaCBpZCB0byB0aGUgbGF5b3V0IG5vZGUgYW5kIHJlcHVsc2lvbiB2YWx1ZVxuICAgICAgdGhlTm9kZS5pZCA9IHRoZUNoaWxkLmRhdGEoXCJpZFwiKTtcbiAgICAgIHRoZU5vZGUubm9kZVJlcHVsc2lvbiA9IG9wdEZuKG9wdGlvbnMubm9kZVJlcHVsc2lvbiwgdGhlQ2hpbGQpO1xuICAgICAgLy8gQXR0YWNoIHRoZSBwYWRkaW5ncyBvZiBjeSBub2RlIHRvIGxheW91dCBub2RlXG4gICAgICB0aGVOb2RlLnBhZGRpbmdMZWZ0ID0gcGFyc2VJbnQodGhlQ2hpbGQuY3NzKCdwYWRkaW5nJykpO1xuICAgICAgdGhlTm9kZS5wYWRkaW5nVG9wID0gcGFyc2VJbnQodGhlQ2hpbGQuY3NzKCdwYWRkaW5nJykpO1xuICAgICAgdGhlTm9kZS5wYWRkaW5nUmlnaHQgPSBwYXJzZUludCh0aGVDaGlsZC5jc3MoJ3BhZGRpbmcnKSk7XG4gICAgICB0aGVOb2RlLnBhZGRpbmdCb3R0b20gPSBwYXJzZUludCh0aGVDaGlsZC5jc3MoJ3BhZGRpbmcnKSk7XG5cbiAgICAgIC8vQXR0YWNoIHRoZSBsYWJlbCBwcm9wZXJ0aWVzIHRvIGJvdGggY29tcG91bmQgYW5kIHNpbXBsZSBub2RlcyBpZiBsYWJlbHMgd2lsbCBiZSBpbmNsdWRlZCBpbiBub2RlIGRpbWVuc2lvbnNcbiAgICAgIC8vVGhlc2UgcHJvcGVydGllcyB3aWxsIGJlIHVzZWQgd2hpbGUgdXBkYXRpbmcgYm91bmRzIG9mIGNvbXBvdW5kcyBkdXJpbmcgaXRlcmF0aW9ucyBvciB0aWxpbmdcbiAgICAgIC8vYW5kIHdpbGwgYmUgdXNlZCBmb3Igc2ltcGxlIG5vZGVzIHdoaWxlIHRyYW5zZmVycmluZyBmaW5hbCBwb3NpdGlvbnMgdG8gY3l0b3NjYXBlXG4gICAgICBpZiAob3B0aW9ucy5ub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHMpIHtcbiAgICAgICAgdGhlTm9kZS5sYWJlbFdpZHRoID0gdGhlQ2hpbGQuYm91bmRpbmdCb3goeyBpbmNsdWRlTGFiZWxzOiB0cnVlLCBpbmNsdWRlTm9kZXM6IGZhbHNlLCBpbmNsdWRlT3ZlcmxheXM6IGZhbHNlIH0pLnc7XG4gICAgICAgIHRoZU5vZGUubGFiZWxIZWlnaHQgPSB0aGVDaGlsZC5ib3VuZGluZ0JveCh7IGluY2x1ZGVMYWJlbHM6IHRydWUsIGluY2x1ZGVOb2RlczogZmFsc2UsIGluY2x1ZGVPdmVybGF5czogZmFsc2UgfSkuaDtcbiAgICAgICAgdGhlTm9kZS5sYWJlbFBvc1ZlcnRpY2FsID0gdGhlQ2hpbGQuY3NzKFwidGV4dC12YWxpZ25cIik7XG4gICAgICAgIHRoZU5vZGUubGFiZWxQb3NIb3Jpem9udGFsID0gdGhlQ2hpbGQuY3NzKFwidGV4dC1oYWxpZ25cIik7XG4gICAgICB9XG5cbiAgICAgIC8vIE1hcCB0aGUgbGF5b3V0IG5vZGVcbiAgICAgIGlkVG9MTm9kZVt0aGVDaGlsZC5kYXRhKFwiaWRcIildID0gdGhlTm9kZTtcblxuICAgICAgaWYgKGlzTmFOKHRoZU5vZGUucmVjdC54KSkge1xuICAgICAgICB0aGVOb2RlLnJlY3QueCA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc05hTih0aGVOb2RlLnJlY3QueSkpIHtcbiAgICAgICAgdGhlTm9kZS5yZWN0LnkgPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hpbGRyZW5fb2ZfY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbl9vZl9jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciB0aGVOZXdHcmFwaCA9IHZvaWQgMDtcbiAgICAgICAgdGhlTmV3R3JhcGggPSBsYXlvdXQuZ2V0R3JhcGhNYW5hZ2VyKCkuYWRkKGxheW91dC5uZXdHcmFwaCgpLCB0aGVOb2RlKTtcbiAgICAgICAgcHJvY2Vzc0NoaWxkcmVuTGlzdCh0aGVOZXdHcmFwaCwgY2hpbGRyZW5fb2ZfY2hpbGRyZW4sIGxheW91dCwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIHRyYW5zZmVyIGN5dG9zY2FwZSBlZGdlcyB0byBjb3NlIGVkZ2VzXG4gIHZhciBwcm9jZXNzRWRnZXMgPSBmdW5jdGlvbiBwcm9jZXNzRWRnZXMobGF5b3V0LCBnbSwgZWRnZXMpIHtcbiAgICB2YXIgaWRlYWxMZW5ndGhUb3RhbCA9IDA7XG4gICAgdmFyIGVkZ2VDb3VudCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tpXTtcbiAgICAgIHZhciBzb3VyY2VOb2RlID0gaWRUb0xOb2RlW2VkZ2UuZGF0YShcInNvdXJjZVwiKV07XG4gICAgICB2YXIgdGFyZ2V0Tm9kZSA9IGlkVG9MTm9kZVtlZGdlLmRhdGEoXCJ0YXJnZXRcIildO1xuICAgICAgaWYgKHNvdXJjZU5vZGUgJiYgdGFyZ2V0Tm9kZSAmJiBzb3VyY2VOb2RlICE9PSB0YXJnZXROb2RlICYmIHNvdXJjZU5vZGUuZ2V0RWRnZXNCZXR3ZWVuKHRhcmdldE5vZGUpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHZhciBlMSA9IGdtLmFkZChsYXlvdXQubmV3RWRnZSgpLCBzb3VyY2VOb2RlLCB0YXJnZXROb2RlKTtcbiAgICAgICAgZTEuaWQgPSBlZGdlLmlkKCk7XG4gICAgICAgIGUxLmlkZWFsTGVuZ3RoID0gb3B0Rm4ob3B0aW9ucy5pZGVhbEVkZ2VMZW5ndGgsIGVkZ2UpO1xuICAgICAgICBlMS5lZGdlRWxhc3RpY2l0eSA9IG9wdEZuKG9wdGlvbnMuZWRnZUVsYXN0aWNpdHksIGVkZ2UpO1xuICAgICAgICBpZGVhbExlbmd0aFRvdGFsICs9IGUxLmlkZWFsTGVuZ3RoO1xuICAgICAgICBlZGdlQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gd2UgbmVlZCB0byB1cGRhdGUgdGhlIGlkZWFsIGVkZ2UgbGVuZ3RoIGNvbnN0YW50IHdpdGggdGhlIGF2Zy4gaWRlYWwgbGVuZ3RoIHZhbHVlIGFmdGVyIHByb2Nlc3NpbmcgZWRnZXNcbiAgICAvLyBpbiBjYXNlIHRoZXJlIGlzIG5vIGVkZ2UsIHVzZSBvdGhlciBvcHRpb25zXG4gICAgaWYgKG9wdGlvbnMuaWRlYWxFZGdlTGVuZ3RoICE9IG51bGwpIHtcbiAgICAgIGlmIChlZGdlQ291bnQgPiAwKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIID0gaWRlYWxMZW5ndGhUb3RhbCAvIGVkZ2VDb3VudDtlbHNlIGlmICghaXNGbihvcHRpb25zLmlkZWFsRWRnZUxlbmd0aCkpIC8vIGluIGNhc2UgdGhlcmUgaXMgbm8gZWRnZSwgYnV0IG9wdGlvbiBnaXZlcyBhIHZhbHVlIHRvIHVzZVxuICAgICAgICBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIID0gb3B0aW9ucy5pZGVhbEVkZ2VMZW5ndGg7ZWxzZSAvLyBpbiBjYXNlIHRoZXJlIGlzIG5vIGVkZ2UgYW5kIHdlIGNhbm5vdCBnZXQgYSB2YWx1ZSBmcm9tIG9wdGlvbiAoYmVjYXVzZSBpdCdzIGEgZnVuY3Rpb24pXG4gICAgICAgIENvU0VDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSA1MDtcbiAgICAgIC8vIHdlIG5lZWQgdG8gdXBkYXRlIHRoZXNlIGNvbnN0YW50IHZhbHVlcyBiYXNlZCBvbiB0aGUgaWRlYWwgZWRnZSBsZW5ndGggY29uc3RhbnRcbiAgICAgIENvU0VDb25zdGFudHMuTUlOX1JFUFVMU0lPTl9ESVNUID0gRkRMYXlvdXRDb25zdGFudHMuTUlOX1JFUFVMU0lPTl9ESVNUID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCAvIDEwLjA7XG4gICAgICBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfUkFESUFMX1NFUEFSQVRJT04gPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIO1xuICAgIH1cbiAgfTtcblxuICAvLyB0cmFuc2ZlciBjeXRvc2NhcGUgY29uc3RyYWludHMgdG8gY29zZSBsYXlvdXRcbiAgdmFyIHByb2Nlc3NDb25zdHJhaW50cyA9IGZ1bmN0aW9uIHByb2Nlc3NDb25zdHJhaW50cyhsYXlvdXQsIG9wdGlvbnMpIHtcbiAgICAvLyBnZXQgbm9kZXMgdG8gYmUgZml4ZWRcbiAgICBpZiAob3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50KSB7XG4gICAgICBsYXlvdXQuY29uc3RyYWludHNbXCJmaXhlZE5vZGVDb25zdHJhaW50XCJdID0gb3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50O1xuICAgIH1cbiAgICAvLyBnZXQgbm9kZXMgdG8gYmUgYWxpZ25lZFxuICAgIGlmIChvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQpIHtcbiAgICAgIGxheW91dC5jb25zdHJhaW50c1tcImFsaWdubWVudENvbnN0cmFpbnRcIl0gPSBvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQ7XG4gICAgfVxuICAgIC8vIGdldCBub2RlcyB0byBiZSByZWxhdGl2ZWx5IHBsYWNlZFxuICAgIGlmIChvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCkge1xuICAgICAgbGF5b3V0LmNvbnN0cmFpbnRzW1wicmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50XCJdID0gb3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQ7XG4gICAgfVxuICB9O1xuXG4gIC8qKioqIEFwcGx5IHBvc3Rwcm9jZXNzaW5nICoqKiovXG4gIGlmIChvcHRpb25zLm5lc3RpbmdGYWN0b3IgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5QRVJfTEVWRUxfSURFQUxfRURHRV9MRU5HVEhfRkFDVE9SID0gRkRMYXlvdXRDb25zdGFudHMuUEVSX0xFVkVMX0lERUFMX0VER0VfTEVOR1RIX0ZBQ1RPUiA9IG9wdGlvbnMubmVzdGluZ0ZhY3RvcjtcbiAgaWYgKG9wdGlvbnMuZ3Jhdml0eSAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9TVFJFTkdUSCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9TVFJFTkdUSCA9IG9wdGlvbnMuZ3Jhdml0eTtcbiAgaWYgKG9wdGlvbnMubnVtSXRlciAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLk1BWF9JVEVSQVRJT05TID0gRkRMYXlvdXRDb25zdGFudHMuTUFYX0lURVJBVElPTlMgPSBvcHRpb25zLm51bUl0ZXI7XG4gIGlmIChvcHRpb25zLmdyYXZpdHlSYW5nZSAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9SQU5HRV9GQUNUT1IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0dSQVZJVFlfUkFOR0VfRkFDVE9SID0gb3B0aW9ucy5ncmF2aXR5UmFuZ2U7XG4gIGlmIChvcHRpb25zLmdyYXZpdHlDb21wb3VuZCAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9TVFJFTkdUSCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9TVFJFTkdUSCA9IG9wdGlvbnMuZ3Jhdml0eUNvbXBvdW5kO1xuICBpZiAob3B0aW9ucy5ncmF2aXR5UmFuZ2VDb21wb3VuZCAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9SQU5HRV9GQUNUT1IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfUkFOR0VfRkFDVE9SID0gb3B0aW9ucy5ncmF2aXR5UmFuZ2VDb21wb3VuZDtcbiAgaWYgKG9wdGlvbnMuaW5pdGlhbEVuZXJneU9uSW5jcmVtZW50YWwgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCA9IG9wdGlvbnMuaW5pdGlhbEVuZXJneU9uSW5jcmVtZW50YWw7XG5cbiAgaWYgKG9wdGlvbnMudGlsaW5nQ29tcGFyZUJ5ICE9IG51bGwpIENvU0VDb25zdGFudHMuVElMSU5HX0NPTVBBUkVfQlkgPSBvcHRpb25zLnRpbGluZ0NvbXBhcmVCeTtcblxuICBpZiAob3B0aW9ucy5xdWFsaXR5ID09ICdwcm9vZicpIExheW91dENvbnN0YW50cy5RVUFMSVRZID0gMjtlbHNlIExheW91dENvbnN0YW50cy5RVUFMSVRZID0gMDtcblxuICBDb1NFQ29uc3RhbnRzLk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUyA9IEZETGF5b3V0Q29uc3RhbnRzLk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUyA9IExheW91dENvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMgPSBvcHRpb25zLm5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVscztcbiAgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9JTkNSRU1FTlRBTCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMID0gIW9wdGlvbnMucmFuZG9taXplO1xuICBDb1NFQ29uc3RhbnRzLkFOSU1BVEUgPSBGRExheW91dENvbnN0YW50cy5BTklNQVRFID0gTGF5b3V0Q29uc3RhbnRzLkFOSU1BVEUgPSBvcHRpb25zLmFuaW1hdGU7XG4gIENvU0VDb25zdGFudHMuVElMRSA9IG9wdGlvbnMudGlsZTtcbiAgQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19WRVJUSUNBTCA9IHR5cGVvZiBvcHRpb25zLnRpbGluZ1BhZGRpbmdWZXJ0aWNhbCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGlsaW5nUGFkZGluZ1ZlcnRpY2FsLmNhbGwoKSA6IG9wdGlvbnMudGlsaW5nUGFkZGluZ1ZlcnRpY2FsO1xuICBDb1NFQ29uc3RhbnRzLlRJTElOR19QQURESU5HX0hPUklaT05UQUwgPSB0eXBlb2Ygb3B0aW9ucy50aWxpbmdQYWRkaW5nSG9yaXpvbnRhbCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGlsaW5nUGFkZGluZ0hvcml6b250YWwuY2FsbCgpIDogb3B0aW9ucy50aWxpbmdQYWRkaW5nSG9yaXpvbnRhbDtcblxuICBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUwgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUwgPSB0cnVlO1xuICBDb1NFQ29uc3RhbnRzLlBVUkVfSU5DUkVNRU5UQUwgPSAhb3B0aW9ucy5yYW5kb21pemU7XG4gIExheW91dENvbnN0YW50cy5ERUZBVUxUX1VOSUZPUk1fTEVBRl9OT0RFX1NJWkVTID0gb3B0aW9ucy51bmlmb3JtTm9kZURpbWVuc2lvbnM7XG5cbiAgLy8gVGhpcyBwYXJ0IGlzIGZvciBkZWJ1Zy9kZW1vIHB1cnBvc2VcbiAgaWYgKG9wdGlvbnMuc3RlcCA9PSBcInRyYW5zZm9ybWVkXCIpIHtcbiAgICBDb1NFQ29uc3RhbnRzLlRSQU5TRk9STV9PTl9DT05TVFJBSU5UX0hBTkRMSU5HID0gdHJ1ZTtcbiAgICBDb1NFQ29uc3RhbnRzLkVORk9SQ0VfQ09OU1RSQUlOVFMgPSBmYWxzZTtcbiAgICBDb1NFQ29uc3RhbnRzLkFQUExZX0xBWU9VVCA9IGZhbHNlO1xuICB9XG4gIGlmIChvcHRpb25zLnN0ZXAgPT0gXCJlbmZvcmNlZFwiKSB7XG4gICAgQ29TRUNvbnN0YW50cy5UUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyA9IGZhbHNlO1xuICAgIENvU0VDb25zdGFudHMuRU5GT1JDRV9DT05TVFJBSU5UUyA9IHRydWU7XG4gICAgQ29TRUNvbnN0YW50cy5BUFBMWV9MQVlPVVQgPSBmYWxzZTtcbiAgfVxuICBpZiAob3B0aW9ucy5zdGVwID09IFwiY29zZVwiKSB7XG4gICAgQ29TRUNvbnN0YW50cy5UUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyA9IGZhbHNlO1xuICAgIENvU0VDb25zdGFudHMuRU5GT1JDRV9DT05TVFJBSU5UUyA9IGZhbHNlO1xuICAgIENvU0VDb25zdGFudHMuQVBQTFlfTEFZT1VUID0gdHJ1ZTtcbiAgfVxuICBpZiAob3B0aW9ucy5zdGVwID09IFwiYWxsXCIpIHtcbiAgICBpZiAob3B0aW9ucy5yYW5kb21pemUpIENvU0VDb25zdGFudHMuVFJBTlNGT1JNX09OX0NPTlNUUkFJTlRfSEFORExJTkcgPSB0cnVlO2Vsc2UgQ29TRUNvbnN0YW50cy5UUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyA9IGZhbHNlO1xuICAgIENvU0VDb25zdGFudHMuRU5GT1JDRV9DT05TVFJBSU5UUyA9IHRydWU7XG4gICAgQ29TRUNvbnN0YW50cy5BUFBMWV9MQVlPVVQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuZml4ZWROb2RlQ29uc3RyYWludCB8fCBvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQgfHwgb3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcbiAgICBDb1NFQ29uc3RhbnRzLlRSRUVfUkVEVUNUSU9OX09OX0lOQ1JFTUVOVEFMID0gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgQ29TRUNvbnN0YW50cy5UUkVFX1JFRFVDVElPTl9PTl9JTkNSRU1FTlRBTCA9IHRydWU7XG4gIH1cblxuICB2YXIgY29zZUxheW91dCA9IG5ldyBDb1NFTGF5b3V0KCk7XG4gIHZhciBnbSA9IGNvc2VMYXlvdXQubmV3R3JhcGhNYW5hZ2VyKCk7XG5cbiAgcHJvY2Vzc0NoaWxkcmVuTGlzdChnbS5hZGRSb290KCksIGF1eC5nZXRUb3BNb3N0Tm9kZXMobm9kZXMpLCBjb3NlTGF5b3V0LCBvcHRpb25zKTtcbiAgcHJvY2Vzc0VkZ2VzKGNvc2VMYXlvdXQsIGdtLCBlZGdlcyk7XG4gIHByb2Nlc3NDb25zdHJhaW50cyhjb3NlTGF5b3V0LCBvcHRpb25zKTtcblxuICBjb3NlTGF5b3V0LnJ1bkxheW91dCgpO1xuXG4gIHJldHVybiBpZFRvTE5vZGU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHsgY29zZUxheW91dDogY29zZUxheW91dCB9O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMjEyOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuLyoqXG4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZmNvc2UgbGF5b3V0IGFsZ29yaXRobVxuKi9cblxudmFyIGFzc2lnbiA9IF9fd2VicGFja19yZXF1aXJlX18oNjU4KTtcbnZhciBhdXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0OCk7XG5cbnZhciBfcmVxdWlyZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjU3KSxcbiAgICBzcGVjdHJhbExheW91dCA9IF9yZXF1aXJlLnNwZWN0cmFsTGF5b3V0O1xuXG52YXIgX3JlcXVpcmUyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MTYpLFxuICAgIGNvc2VMYXlvdXQgPSBfcmVxdWlyZTIuY29zZUxheW91dDtcblxudmFyIGRlZmF1bHRzID0gT2JqZWN0LmZyZWV6ZSh7XG5cbiAgLy8gJ2RyYWZ0JywgJ2RlZmF1bHQnIG9yICdwcm9vZicgXG4gIC8vIC0gJ2RyYWZ0JyBvbmx5IGFwcGxpZXMgc3BlY3RyYWwgbGF5b3V0IFxuICAvLyAtICdkZWZhdWx0JyBpbXByb3ZlcyB0aGUgcXVhbGl0eSB3aXRoIHN1YnNlcXVlbnQgQ29TRSBsYXlvdXQgKGZhc3QgY29vbGluZyByYXRlKVxuICAvLyAtICdwcm9vZicgaW1wcm92ZXMgdGhlIHF1YWxpdHkgd2l0aCBzdWJzZXF1ZW50IENvU0UgbGF5b3V0IChzbG93IGNvb2xpbmcgcmF0ZSkgXG4gIHF1YWxpdHk6IFwiZGVmYXVsdFwiLFxuICAvLyBVc2UgcmFuZG9tIG5vZGUgcG9zaXRpb25zIGF0IGJlZ2lubmluZyBvZiBsYXlvdXRcbiAgLy8gaWYgdGhpcyBpcyBzZXQgdG8gZmFsc2UsIHRoZW4gcXVhbGl0eSBvcHRpb24gbXVzdCBiZSBcInByb29mXCJcbiAgcmFuZG9taXplOiB0cnVlLFxuICAvLyBXaGV0aGVyIG9yIG5vdCB0byBhbmltYXRlIHRoZSBsYXlvdXRcbiAgYW5pbWF0ZTogdHJ1ZSxcbiAgLy8gRHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zLCBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiAxMDAwLFxuICAvLyBFYXNpbmcgb2YgYW5pbWF0aW9uLCBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBGaXQgdGhlIHZpZXdwb3J0IHRvIHRoZSByZXBvc2l0aW9uZWQgbm9kZXNcbiAgZml0OiB0cnVlLFxuICAvLyBQYWRkaW5nIGFyb3VuZCBsYXlvdXRcbiAgcGFkZGluZzogMzAsXG4gIC8vIFdoZXRoZXIgdG8gaW5jbHVkZSBsYWJlbHMgaW4gbm9kZSBkaW1lbnNpb25zLiBWYWxpZCBpbiBcInByb29mXCIgcXVhbGl0eVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBXaGV0aGVyIG9yIG5vdCBzaW1wbGUgbm9kZXMgKG5vbi1jb21wb3VuZCBub2RlcykgYXJlIG9mIHVuaWZvcm0gZGltZW5zaW9uc1xuICB1bmlmb3JtTm9kZURpbWVuc2lvbnM6IGZhbHNlLFxuICAvLyBXaGV0aGVyIHRvIHBhY2sgZGlzY29ubmVjdGVkIGNvbXBvbmVudHMgLSB2YWxpZCBvbmx5IGlmIHJhbmRvbWl6ZTogdHJ1ZVxuICBwYWNrQ29tcG9uZW50czogdHJ1ZSxcbiAgLy8gTGF5b3V0IHN0ZXAgLSBhbGwsIHRyYW5zZm9ybWVkLCBlbmZvcmNlZCwgY29zZSAtIGZvciBkZWJ1ZyBwdXJwb3NlIG9ubHlcbiAgc3RlcDogXCJhbGxcIixcblxuICAvKiBzcGVjdHJhbCBsYXlvdXQgb3B0aW9ucyAqL1xuXG4gIC8vIEZhbHNlIGZvciByYW5kb20sIHRydWUgZm9yIGdyZWVkeVxuICBzYW1wbGluZ1R5cGU6IHRydWUsXG4gIC8vIFNhbXBsZSBzaXplIHRvIGNvbnN0cnVjdCBkaXN0YW5jZSBtYXRyaXhcbiAgc2FtcGxlU2l6ZTogMjUsXG4gIC8vIFNlcGFyYXRpb24gYW1vdW50IGJldHdlZW4gbm9kZXNcbiAgbm9kZVNlcGFyYXRpb246IDc1LFxuICAvLyBQb3dlciBpdGVyYXRpb24gdG9sZXJhbmNlXG4gIHBpVG9sOiAwLjAwMDAwMDEsXG5cbiAgLyogQ29TRSBsYXlvdXQgb3B0aW9ucyAqL1xuXG4gIC8vIE5vZGUgcmVwdWxzaW9uIChub24gb3ZlcmxhcHBpbmcpIG11bHRpcGxpZXJcbiAgbm9kZVJlcHVsc2lvbjogZnVuY3Rpb24gbm9kZVJlcHVsc2lvbihub2RlKSB7XG4gICAgcmV0dXJuIDQ1MDA7XG4gIH0sXG4gIC8vIElkZWFsIGVkZ2UgKG5vbiBuZXN0ZWQpIGxlbmd0aFxuICBpZGVhbEVkZ2VMZW5ndGg6IGZ1bmN0aW9uIGlkZWFsRWRnZUxlbmd0aChlZGdlKSB7XG4gICAgcmV0dXJuIDUwO1xuICB9LFxuICAvLyBEaXZpc29yIHRvIGNvbXB1dGUgZWRnZSBmb3JjZXNcbiAgZWRnZUVsYXN0aWNpdHk6IGZ1bmN0aW9uIGVkZ2VFbGFzdGljaXR5KGVkZ2UpIHtcbiAgICByZXR1cm4gMC40NTtcbiAgfSxcbiAgLy8gTmVzdGluZyBmYWN0b3IgKG11bHRpcGxpZXIpIHRvIGNvbXB1dGUgaWRlYWwgZWRnZSBsZW5ndGggZm9yIG5lc3RlZCBlZGdlc1xuICBuZXN0aW5nRmFjdG9yOiAwLjEsXG4gIC8vIEdyYXZpdHkgZm9yY2UgKGNvbnN0YW50KVxuICBncmF2aXR5OiAwLjI1LFxuICAvLyBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHBlcmZvcm1cbiAgbnVtSXRlcjogMjUwMCxcbiAgLy8gRm9yIGVuYWJsaW5nIHRpbGluZ1xuICB0aWxlOiB0cnVlLFxuICAvLyBUaGUgZnVuY3Rpb24gdGhhdCBzcGVjaWZpZXMgdGhlIGNyaXRlcmlhIGZvciBjb21wYXJpbmcgbm9kZXMgd2hpbGUgc29ydGluZyB0aGVtIGR1cmluZyB0aWxpbmcgb3BlcmF0aW9uLlxuICAvLyBUYWtlcyB0aGUgbm9kZSBpZCBhcyBhIHBhcmFtZXRlciBhbmQgdGhlIGRlZmF1bHQgdGlsaW5nIG9wZXJhdGlvbiBpcyBwZXJmb21lZCB3aGVuIHRoaXMgb3B0aW9uIGlzIG5vdCBzZXQuXG4gIHRpbGluZ0NvbXBhcmVCeTogdW5kZWZpbmVkLFxuICAvLyBSZXByZXNlbnRzIHRoZSBhbW91bnQgb2YgdGhlIHZlcnRpY2FsIHNwYWNlIHRvIHB1dCBiZXR3ZWVuIHRoZSB6ZXJvIGRlZ3JlZSBtZW1iZXJzIGR1cmluZyB0aGUgdGlsaW5nIG9wZXJhdGlvbihjYW4gYWxzbyBiZSBhIGZ1bmN0aW9uKVxuICB0aWxpbmdQYWRkaW5nVmVydGljYWw6IDEwLFxuICAvLyBSZXByZXNlbnRzIHRoZSBhbW91bnQgb2YgdGhlIGhvcml6b250YWwgc3BhY2UgdG8gcHV0IGJldHdlZW4gdGhlIHplcm8gZGVncmVlIG1lbWJlcnMgZHVyaW5nIHRoZSB0aWxpbmcgb3BlcmF0aW9uKGNhbiBhbHNvIGJlIGEgZnVuY3Rpb24pXG4gIHRpbGluZ1BhZGRpbmdIb3Jpem9udGFsOiAxMCxcbiAgLy8gR3Jhdml0eSByYW5nZSAoY29uc3RhbnQpIGZvciBjb21wb3VuZHNcbiAgZ3Jhdml0eVJhbmdlQ29tcG91bmQ6IDEuNSxcbiAgLy8gR3Jhdml0eSBmb3JjZSAoY29uc3RhbnQpIGZvciBjb21wb3VuZHNcbiAgZ3Jhdml0eUNvbXBvdW5kOiAxLjAsXG4gIC8vIEdyYXZpdHkgcmFuZ2UgKGNvbnN0YW50KVxuICBncmF2aXR5UmFuZ2U6IDMuOCxcbiAgLy8gSW5pdGlhbCBjb29saW5nIGZhY3RvciBmb3IgaW5jcmVtZW50YWwgbGF5b3V0ICBcbiAgaW5pdGlhbEVuZXJneU9uSW5jcmVtZW50YWw6IDAuMyxcblxuICAvKiBjb25zdHJhaW50IG9wdGlvbnMgKi9cblxuICAvLyBGaXggcmVxdWlyZWQgbm9kZXMgdG8gcHJlZGVmaW5lZCBwb3NpdGlvbnNcbiAgLy8gW3tub2RlSWQ6ICduMScsIHBvc2l0aW9uOiB7eDogMTAwLCB5OiAyMDB9LCB7Li4ufV1cbiAgZml4ZWROb2RlQ29uc3RyYWludDogdW5kZWZpbmVkLFxuICAvLyBBbGlnbiByZXF1aXJlZCBub2RlcyBpbiB2ZXJ0aWNhbC9ob3Jpem9udGFsIGRpcmVjdGlvblxuICAvLyB7dmVydGljYWw6IFtbJ24xJywgJ24yJyldLCBbJ24zJywgJ240J11dLCBob3Jpem9udGFsOiBbJ24yJywgJ240J119XG4gIGFsaWdubWVudENvbnN0cmFpbnQ6IHVuZGVmaW5lZCxcbiAgLy8gUGxhY2UgdHdvIG5vZGVzIHJlbGF0aXZlbHkgaW4gdmVydGljYWwvaG9yaXpvbnRhbCBkaXJlY3Rpb24gXG4gIC8vIFt7dG9wOiAnbjEnLCBib3R0b206ICduMicsIGdhcDogMTAwfSwge2xlZnQ6ICduMycsIHJpZ2h0OiAnbjQnLCBnYXA6IDc1fV1cbiAgcmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50OiB1bmRlZmluZWQsXG5cbiAgLyogbGF5b3V0IGV2ZW50IGNhbGxiYWNrcyAqL1xuICByZWFkeTogZnVuY3Rpb24gcmVhZHkoKSB7fSwgLy8gb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHt9IC8vIG9uIGxheW91dHN0b3Bcbn0pO1xuXG52YXIgTGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBMYXlvdXQob3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMYXlvdXQpO1xuXG4gICAgdGhpcy5vcHRpb25zID0gYXNzaWduKHt9LCBkZWZhdWx0cywgb3B0aW9ucyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTGF5b3V0LCBbe1xuICAgIGtleTogJ3J1bicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJ1bigpIHtcbiAgICAgIHZhciBsYXlvdXQgPSB0aGlzO1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICAgICAgdmFyIGVsZXMgPSBvcHRpb25zLmVsZXM7XG5cbiAgICAgIHZhciBzcGVjdHJhbFJlc3VsdCA9IFtdO1xuICAgICAgdmFyIHhDb29yZHMgPSB2b2lkIDA7XG4gICAgICB2YXIgeUNvb3JkcyA9IHZvaWQgMDtcbiAgICAgIHZhciBjb3NlUmVzdWx0ID0gW107XG4gICAgICB2YXIgY29tcG9uZW50cyA9IHZvaWQgMDtcbiAgICAgIHZhciBjb21wb25lbnRDZW50ZXJzID0gW107XG5cbiAgICAgIC8vIGJhc2ljIHZhbGlkaXR5IGNoZWNrIGZvciBjb25zdHJhaW50IGlucHV0cyBcbiAgICAgIGlmIChvcHRpb25zLmZpeGVkTm9kZUNvbnN0cmFpbnQgJiYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMuZml4ZWROb2RlQ29uc3RyYWludCkgfHwgb3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50Lmxlbmd0aCA9PSAwKSkge1xuICAgICAgICBvcHRpb25zLmZpeGVkTm9kZUNvbnN0cmFpbnQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbCAmJiAoIUFycmF5LmlzQXJyYXkob3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsKSB8fCBvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWwubGVuZ3RoID09IDApKSB7XG4gICAgICAgICAgb3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbCAmJiAoIUFycmF5LmlzQXJyYXkob3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWwpIHx8IG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsLmxlbmd0aCA9PSAwKSkge1xuICAgICAgICAgIG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCAmJiAoIUFycmF5LmlzQXJyYXkob3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHx8IG9wdGlvbnMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50Lmxlbmd0aCA9PSAwKSkge1xuICAgICAgICBvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgYW55IGNvbnN0cmFpbnQgZXhpc3RzLCBzZXQgc29tZSBvcHRpb25zXG4gICAgICB2YXIgY29uc3RyYWludEV4aXN0ID0gb3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50IHx8IG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludCB8fCBvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludDtcbiAgICAgIGlmIChjb25zdHJhaW50RXhpc3QpIHtcbiAgICAgICAgLy8gY29uc3RyYWludHMgd29yayB3aXRoIHRoZXNlIG9wdGlvbnNcbiAgICAgICAgb3B0aW9ucy50aWxlID0gZmFsc2U7XG4gICAgICAgIG9wdGlvbnMucGFja0NvbXBvbmVudHMgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gZGVjaWRlIGNvbXBvbmVudCBwYWNraW5nIGlzIGVuYWJsZWQgb3Igbm90XG4gICAgICB2YXIgbGF5VXRpbCA9IHZvaWQgMDtcbiAgICAgIHZhciBwYWNraW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgaWYgKGN5LmxheW91dFV0aWxpdGllcyAmJiBvcHRpb25zLnBhY2tDb21wb25lbnRzKSB7XG4gICAgICAgIGxheVV0aWwgPSBjeS5sYXlvdXRVdGlsaXRpZXMoXCJnZXRcIik7XG4gICAgICAgIGlmICghbGF5VXRpbCkgbGF5VXRpbCA9IGN5LmxheW91dFV0aWxpdGllcygpO1xuICAgICAgICBwYWNraW5nRW5hYmxlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVzLm5vZGVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBpZiBwYWNraW5nIGlzIG5vdCBlbmFibGVkLCBwZXJmb3JtIGxheW91dCBvbiB0aGUgd2hvbGUgZ3JhcGhcbiAgICAgICAgaWYgKCFwYWNraW5nRW5hYmxlZCkge1xuICAgICAgICAgIC8vIHN0b3JlIGNvbXBvbmVudCBjZW50ZXJcbiAgICAgICAgICB2YXIgYm91bmRpbmdCb3ggPSBvcHRpb25zLmVsZXMuYm91bmRpbmdCb3goKTtcbiAgICAgICAgICBjb21wb25lbnRDZW50ZXJzLnB1c2goeyB4OiBib3VuZGluZ0JveC54MSArIGJvdW5kaW5nQm94LncgLyAyLCB5OiBib3VuZGluZ0JveC55MSArIGJvdW5kaW5nQm94LmggLyAyIH0pO1xuICAgICAgICAgIC8vIGFwcGx5IHNwZWN0cmFsIGxheW91dFxuICAgICAgICAgIGlmIChvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHNwZWN0cmFsTGF5b3V0KG9wdGlvbnMpO1xuICAgICAgICAgICAgc3BlY3RyYWxSZXN1bHQucHVzaChyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBhcHBseSBjb3NlIGxheW91dCBhcyBwb3N0cHJvY2Vzc2luZ1xuICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkZWZhdWx0XCIgfHwgb3B0aW9ucy5xdWFsaXR5ID09IFwicHJvb2ZcIikge1xuICAgICAgICAgICAgY29zZVJlc3VsdC5wdXNoKGNvc2VMYXlvdXQob3B0aW9ucywgc3BlY3RyYWxSZXN1bHRbMF0pKTtcbiAgICAgICAgICAgIGF1eC5yZWxvY2F0ZUNvbXBvbmVudChjb21wb25lbnRDZW50ZXJzWzBdLCBjb3NlUmVzdWx0WzBdLCBvcHRpb25zKTsgLy8gcmVsb2NhdGUgY2VudGVyIHRvIG9yaWdpbmFsIHBvc2l0aW9uXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF1eC5yZWxvY2F0ZUNvbXBvbmVudChjb21wb25lbnRDZW50ZXJzWzBdLCBzcGVjdHJhbFJlc3VsdFswXSwgb3B0aW9ucyk7IC8vIHJlbG9jYXRlIGNlbnRlciB0byBvcmlnaW5hbCBwb3NpdGlvblxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBwYWNraW5nIGlzIGVuYWJsZWRcbiAgICAgICAgICB2YXIgdG9wTW9zdE5vZGVzID0gYXV4LmdldFRvcE1vc3ROb2RlcyhvcHRpb25zLmVsZXMubm9kZXMoKSk7XG4gICAgICAgICAgY29tcG9uZW50cyA9IGF1eC5jb25uZWN0Q29tcG9uZW50cyhjeSwgb3B0aW9ucy5lbGVzLCB0b3BNb3N0Tm9kZXMpO1xuICAgICAgICAgIC8vIHN0b3JlIGNvbXBvbmVudCBjZW50ZXJzXG4gICAgICAgICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgIHZhciBib3VuZGluZ0JveCA9IGNvbXBvbmVudC5ib3VuZGluZ0JveCgpO1xuICAgICAgICAgICAgY29tcG9uZW50Q2VudGVycy5wdXNoKHsgeDogYm91bmRpbmdCb3gueDEgKyBib3VuZGluZ0JveC53IC8gMiwgeTogYm91bmRpbmdCb3gueTEgKyBib3VuZGluZ0JveC5oIC8gMiB9KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vc2VuZCBlYWNoIGNvbXBvbmVudCB0byBzcGVjdHJhbCBsYXlvdXQgaWYgcmFuZG9taXplZFxuICAgICAgICAgIGlmIChvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgICAgICAgICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgb3B0aW9ucy5lbGVzID0gY29tcG9uZW50O1xuICAgICAgICAgICAgICBzcGVjdHJhbFJlc3VsdC5wdXNoKHNwZWN0cmFsTGF5b3V0KG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkZWZhdWx0XCIgfHwgb3B0aW9ucy5xdWFsaXR5ID09IFwicHJvb2ZcIikge1xuICAgICAgICAgICAgdmFyIHRvQmVUaWxlZE5vZGVzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMudGlsZSkge1xuICAgICAgICAgICAgICAvLyBiZWhhdmUgbm9kZXMgdG8gYmUgdGlsZWQgYXMgb25lIGNvbXBvbmVudFxuICAgICAgICAgICAgICB2YXIgbm9kZUluZGV4ZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICAgIHZhciBfeENvb3JkcyA9IFtdO1xuICAgICAgICAgICAgICB2YXIgX3lDb29yZHMgPSBbXTtcbiAgICAgICAgICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgICAgICAgICAgdmFyIHRlbXBTcGVjdHJhbFJlc3VsdCA9IHsgbm9kZUluZGV4ZXM6IG5vZGVJbmRleGVzLCB4Q29vcmRzOiBfeENvb3JkcywgeUNvb3JkczogX3lDb29yZHMgfTtcbiAgICAgICAgICAgICAgdmFyIGluZGV4ZXNUb0JlRGVsZXRlZCA9IFtdO1xuICAgICAgICAgICAgICBjb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmVkZ2VzKCkubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUsIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9CZVRpbGVkTm9kZXMubWVyZ2UoY29tcG9uZW50Lm5vZGVzKClbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUuaXNQYXJlbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHRlbXBTcGVjdHJhbFJlc3VsdC5ub2RlSW5kZXhlcy5zZXQoY29tcG9uZW50Lm5vZGVzKClbaV0uaWQoKSwgY291bnQrKyk7XG4gICAgICAgICAgICAgICAgICAgICAgdGVtcFNwZWN0cmFsUmVzdWx0LnhDb29yZHMucHVzaChjb21wb25lbnQubm9kZXMoKVswXS5wb3NpdGlvbigpLngpO1xuICAgICAgICAgICAgICAgICAgICAgIHRlbXBTcGVjdHJhbFJlc3VsdC55Q29vcmRzLnB1c2goY29tcG9uZW50Lm5vZGVzKClbMF0ucG9zaXRpb24oKS55KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpbmRleGVzVG9CZURlbGV0ZWQucHVzaChpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKHRvQmVUaWxlZE5vZGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2JvdW5kaW5nQm94ID0gdG9CZVRpbGVkTm9kZXMuYm91bmRpbmdCb3goKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRDZW50ZXJzLnB1c2goeyB4OiBfYm91bmRpbmdCb3gueDEgKyBfYm91bmRpbmdCb3gudyAvIDIsIHk6IF9ib3VuZGluZ0JveC55MSArIF9ib3VuZGluZ0JveC5oIC8gMiB9KTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2godG9CZVRpbGVkTm9kZXMpO1xuICAgICAgICAgICAgICAgIHNwZWN0cmFsUmVzdWx0LnB1c2godGVtcFNwZWN0cmFsUmVzdWx0KTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gaW5kZXhlc1RvQmVEZWxldGVkLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnRzLnNwbGljZShpbmRleGVzVG9CZURlbGV0ZWRbaV0sIDEpO1xuICAgICAgICAgICAgICAgICAgc3BlY3RyYWxSZXN1bHQuc3BsaWNlKGluZGV4ZXNUb0JlRGVsZXRlZFtpXSwgMSk7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnRDZW50ZXJzLnNwbGljZShpbmRleGVzVG9CZURlbGV0ZWRbaV0sIDEpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50LCBpbmRleCkge1xuICAgICAgICAgICAgICAvLyBzZW5kIGVhY2ggY29tcG9uZW50IHRvIGNvc2UgbGF5b3V0XG4gICAgICAgICAgICAgIG9wdGlvbnMuZWxlcyA9IGNvbXBvbmVudDtcbiAgICAgICAgICAgICAgY29zZVJlc3VsdC5wdXNoKGNvc2VMYXlvdXQob3B0aW9ucywgc3BlY3RyYWxSZXN1bHRbaW5kZXhdKSk7XG4gICAgICAgICAgICAgIGF1eC5yZWxvY2F0ZUNvbXBvbmVudChjb21wb25lbnRDZW50ZXJzW2luZGV4XSwgY29zZVJlc3VsdFtpbmRleF0sIG9wdGlvbnMpOyAvLyByZWxvY2F0ZSBjZW50ZXIgdG8gb3JpZ2luYWwgcG9zaXRpb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgYXV4LnJlbG9jYXRlQ29tcG9uZW50KGNvbXBvbmVudENlbnRlcnNbaW5kZXhdLCBzcGVjdHJhbFJlc3VsdFtpbmRleF0sIG9wdGlvbnMpOyAvLyByZWxvY2F0ZSBjZW50ZXIgdG8gb3JpZ2luYWwgcG9zaXRpb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHBhY2tpbmdcbiAgICAgICAgICB2YXIgY29tcG9uZW50c0V2YWx1YXRlZCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICBpZiAoY29tcG9uZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2YXIgc3ViZ3JhcGhzID0gW107XG4gICAgICAgICAgICB2YXIgaGlkZGVuRWxlcyA9IGVsZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsZS5jc3MoJ2Rpc3BsYXknKSA9PSAnbm9uZSc7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50LCBpbmRleCkge1xuICAgICAgICAgICAgICB2YXIgbm9kZUluZGV4ZXMgPSB2b2lkIDA7XG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiKSB7XG4gICAgICAgICAgICAgICAgbm9kZUluZGV4ZXMgPSBzcGVjdHJhbFJlc3VsdFtpbmRleF0ubm9kZUluZGV4ZXM7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm5vZGVzKCkubm90KGhpZGRlbkVsZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgc3ViZ3JhcGggPSB7fTtcbiAgICAgICAgICAgICAgICBzdWJncmFwaC5lZGdlcyA9IFtdO1xuICAgICAgICAgICAgICAgIHN1YmdyYXBoLm5vZGVzID0gW107XG4gICAgICAgICAgICAgICAgdmFyIG5vZGVJbmRleCA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQubm9kZXMoKS5ub3QoaGlkZGVuRWxlcykuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucXVhbGl0eSA9PSBcImRyYWZ0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBub2RlSW5kZXggPSBub2RlSW5kZXhlcy5nZXQobm9kZS5pZCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICBzdWJncmFwaC5ub2Rlcy5wdXNoKHsgeDogc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnhDb29yZHNbbm9kZUluZGV4XSAtIG5vZGUuYm91bmRpbmdib3goKS53IC8gMiwgeTogc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHNbbm9kZUluZGV4XSAtIG5vZGUuYm91bmRpbmdib3goKS5oIC8gMiwgd2lkdGg6IG5vZGUuYm91bmRpbmdib3goKS53LCBoZWlnaHQ6IG5vZGUuYm91bmRpbmdib3goKS5oIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJbmZvID0gYXV4LmNhbGNCb3VuZGluZ0JveChub2RlLCBzcGVjdHJhbFJlc3VsdFtpbmRleF0ueENvb3Jkcywgc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHMsIG5vZGVJbmRleGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICBzdWJncmFwaC5ub2Rlcy5wdXNoKHsgeDogcGFyZW50SW5mby50b3BMZWZ0WCwgeTogcGFyZW50SW5mby50b3BMZWZ0WSwgd2lkdGg6IHBhcmVudEluZm8ud2lkdGgsIGhlaWdodDogcGFyZW50SW5mby5oZWlnaHQgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3NlUmVzdWx0W2luZGV4XVtub2RlLmlkKCldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3ViZ3JhcGgubm9kZXMucHVzaCh7IHg6IGNvc2VSZXN1bHRbaW5kZXhdW25vZGUuaWQoKV0uZ2V0TGVmdCgpLCB5OiBjb3NlUmVzdWx0W2luZGV4XVtub2RlLmlkKCldLmdldFRvcCgpLCB3aWR0aDogY29zZVJlc3VsdFtpbmRleF1bbm9kZS5pZCgpXS5nZXRXaWR0aCgpLCBoZWlnaHQ6IGNvc2VSZXN1bHRbaW5kZXhdW25vZGUuaWQoKV0uZ2V0SGVpZ2h0KCkgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuZWRnZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgc291cmNlID0gZWRnZS5zb3VyY2UoKTtcbiAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBlZGdlLnRhcmdldCgpO1xuICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5jc3MoXCJkaXNwbGF5XCIpICE9IFwibm9uZVwiICYmIHRhcmdldC5jc3MoXCJkaXNwbGF5XCIpICE9IFwibm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZU5vZGVJbmRleCA9IG5vZGVJbmRleGVzLmdldChzb3VyY2UuaWQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldE5vZGVJbmRleCA9IG5vZGVJbmRleGVzLmdldCh0YXJnZXQuaWQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZUNlbnRlciA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDZW50ZXIgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJbmZvID0gYXV4LmNhbGNCb3VuZGluZ0JveChzb3VyY2UsIHNwZWN0cmFsUmVzdWx0W2luZGV4XS54Q29vcmRzLCBzcGVjdHJhbFJlc3VsdFtpbmRleF0ueUNvb3Jkcywgbm9kZUluZGV4ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ2VudGVyLnB1c2gocGFyZW50SW5mby50b3BMZWZ0WCArIHBhcmVudEluZm8ud2lkdGggLyAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNlbnRlci5wdXNoKHBhcmVudEluZm8udG9wTGVmdFkgKyBwYXJlbnRJbmZvLmhlaWdodCAvIDIpO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VDZW50ZXIucHVzaChzcGVjdHJhbFJlc3VsdFtpbmRleF0ueENvb3Jkc1tzb3VyY2VOb2RlSW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNlbnRlci5wdXNoKHNwZWN0cmFsUmVzdWx0W2luZGV4XS55Q29vcmRzW3NvdXJjZU5vZGVJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGFyZW50SW5mbyA9IGF1eC5jYWxjQm91bmRpbmdCb3godGFyZ2V0LCBzcGVjdHJhbFJlc3VsdFtpbmRleF0ueENvb3Jkcywgc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHMsIG5vZGVJbmRleGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENlbnRlci5wdXNoKF9wYXJlbnRJbmZvLnRvcExlZnRYICsgX3BhcmVudEluZm8ud2lkdGggLyAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENlbnRlci5wdXNoKF9wYXJlbnRJbmZvLnRvcExlZnRZICsgX3BhcmVudEluZm8uaGVpZ2h0IC8gMik7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENlbnRlci5wdXNoKHNwZWN0cmFsUmVzdWx0W2luZGV4XS54Q29vcmRzW3RhcmdldE5vZGVJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Q2VudGVyLnB1c2goc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHNbdGFyZ2V0Tm9kZUluZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHN1YmdyYXBoLmVkZ2VzLnB1c2goeyBzdGFydFg6IHNvdXJjZUNlbnRlclswXSwgc3RhcnRZOiBzb3VyY2VDZW50ZXJbMV0sIGVuZFg6IHRhcmdldENlbnRlclswXSwgZW5kWTogdGFyZ2V0Q2VudGVyWzFdIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3NlUmVzdWx0W2luZGV4XVtzb3VyY2UuaWQoKV0gJiYgY29zZVJlc3VsdFtpbmRleF1bdGFyZ2V0LmlkKCldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJncmFwaC5lZGdlcy5wdXNoKHsgc3RhcnRYOiBjb3NlUmVzdWx0W2luZGV4XVtzb3VyY2UuaWQoKV0uZ2V0Q2VudGVyWCgpLCBzdGFydFk6IGNvc2VSZXN1bHRbaW5kZXhdW3NvdXJjZS5pZCgpXS5nZXRDZW50ZXJZKCksIGVuZFg6IGNvc2VSZXN1bHRbaW5kZXhdW3RhcmdldC5pZCgpXS5nZXRDZW50ZXJYKCksIGVuZFk6IGNvc2VSZXN1bHRbaW5kZXhdW3RhcmdldC5pZCgpXS5nZXRDZW50ZXJZKCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHN1YmdyYXBoLm5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHN1YmdyYXBocy5wdXNoKHN1YmdyYXBoKTtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHNFdmFsdWF0ZWQuYWRkKGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIHNoaWZ0UmVzdWx0ID0gbGF5VXRpbC5wYWNrQ29tcG9uZW50cyhzdWJncmFwaHMsIG9wdGlvbnMucmFuZG9taXplKS5zaGlmdHM7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5xdWFsaXR5ID09IFwiZHJhZnRcIikge1xuICAgICAgICAgICAgICBzcGVjdHJhbFJlc3VsdC5mb3JFYWNoKGZ1bmN0aW9uIChyZXN1bHQsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld1hDb29yZHMgPSByZXN1bHQueENvb3Jkcy5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB4ICsgc2hpZnRSZXN1bHRbaW5kZXhdLmR4O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHZhciBuZXdZQ29vcmRzID0gcmVzdWx0LnlDb29yZHMubWFwKGZ1bmN0aW9uICh5KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4geSArIHNoaWZ0UmVzdWx0W2luZGV4XS5keTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXN1bHQueENvb3JkcyA9IG5ld1hDb29yZHM7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnlDb29yZHMgPSBuZXdZQ29vcmRzO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBfY291bnQgPSAwO1xuICAgICAgICAgICAgICBjb21wb25lbnRzRXZhbHVhdGVkLmZvckVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY29zZVJlc3VsdFtpbmRleF0pLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgIHZhciBub2RlUmVjdGFuZ2xlID0gY29zZVJlc3VsdFtpbmRleF1baXRlbV07XG4gICAgICAgICAgICAgICAgICBub2RlUmVjdGFuZ2xlLnNldENlbnRlcihub2RlUmVjdGFuZ2xlLmdldENlbnRlclgoKSArIHNoaWZ0UmVzdWx0W19jb3VudF0uZHgsIG5vZGVSZWN0YW5nbGUuZ2V0Q2VudGVyWSgpICsgc2hpZnRSZXN1bHRbX2NvdW50XS5keSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgX2NvdW50Kys7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBnZXQgZWFjaCBlbGVtZW50J3MgY2FsY3VsYXRlZCBwb3NpdGlvblxuICAgICAgdmFyIGdldFBvc2l0aW9ucyA9IGZ1bmN0aW9uIGdldFBvc2l0aW9ucyhlbGUsIGkpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMucXVhbGl0eSA9PSBcImRlZmF1bHRcIiB8fCBvcHRpb25zLnF1YWxpdHkgPT0gXCJwcm9vZlwiKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBlbGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGVsZSA9IGk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBwb3MgPSB2b2lkIDA7XG4gICAgICAgICAgdmFyIG5vZGUgPSB2b2lkIDA7XG4gICAgICAgICAgdmFyIHRoZUlkID0gZWxlLmRhdGEoJ2lkJyk7XG4gICAgICAgICAgY29zZVJlc3VsdC5mb3JFYWNoKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICh0aGVJZCBpbiByZXN1bHQpIHtcbiAgICAgICAgICAgICAgcG9zID0geyB4OiByZXN1bHRbdGhlSWRdLmdldFJlY3QoKS5nZXRDZW50ZXJYKCksIHk6IHJlc3VsdFt0aGVJZF0uZ2V0UmVjdCgpLmdldENlbnRlclkoKSB9O1xuICAgICAgICAgICAgICBub2RlID0gcmVzdWx0W3RoZUlkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAob3B0aW9ucy5ub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHMpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmxhYmVsV2lkdGgpIHtcbiAgICAgICAgICAgICAgaWYgKG5vZGUubGFiZWxQb3NIb3Jpem9udGFsID09IFwibGVmdFwiKSB7XG4gICAgICAgICAgICAgICAgcG9zLnggKz0gbm9kZS5sYWJlbFdpZHRoIC8gMjtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICAgICAgICBwb3MueCAtPSBub2RlLmxhYmVsV2lkdGggLyAyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS5sYWJlbEhlaWdodCkge1xuICAgICAgICAgICAgICBpZiAobm9kZS5sYWJlbFBvc1ZlcnRpY2FsID09IFwidG9wXCIpIHtcbiAgICAgICAgICAgICAgICBwb3MueSArPSBub2RlLmxhYmVsSGVpZ2h0IC8gMjtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmxhYmVsUG9zVmVydGljYWwgPT0gXCJib3R0b21cIikge1xuICAgICAgICAgICAgICAgIHBvcy55IC09IG5vZGUubGFiZWxIZWlnaHQgLyAyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwb3MgPT0gdW5kZWZpbmVkKSBwb3MgPSB7IHg6IGVsZS5wb3NpdGlvbihcInhcIiksIHk6IGVsZS5wb3NpdGlvbihcInlcIikgfTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogcG9zLngsXG4gICAgICAgICAgICB5OiBwb3MueVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIF9wb3MgPSB2b2lkIDA7XG4gICAgICAgICAgc3BlY3RyYWxSZXN1bHQuZm9yRWFjaChmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSByZXN1bHQubm9kZUluZGV4ZXMuZ2V0KGVsZS5pZCgpKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgX3BvcyA9IHsgeDogcmVzdWx0LnhDb29yZHNbaW5kZXhdLCB5OiByZXN1bHQueUNvb3Jkc1tpbmRleF0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoX3BvcyA9PSB1bmRlZmluZWQpIF9wb3MgPSB7IHg6IGVsZS5wb3NpdGlvbihcInhcIiksIHk6IGVsZS5wb3NpdGlvbihcInlcIikgfTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogX3Bvcy54LFxuICAgICAgICAgICAgeTogX3Bvcy55XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gcXVhbGl0eSA9IFwiZHJhZnRcIiBhbmQgcmFuZG9taXplID0gZmFsc2UgYXJlIGNvbnRyYWRpY3RpdmUgc28gaW4gdGhhdCBjYXNlIHBvc2l0aW9ucyBkb24ndCBjaGFuZ2VcbiAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkZWZhdWx0XCIgfHwgb3B0aW9ucy5xdWFsaXR5ID09IFwicHJvb2ZcIiB8fCBvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgICAgICAvLyB0cmFuc2ZlciBjYWxjdWxhdGVkIHBvc2l0aW9ucyB0byBub2RlcyAocG9zaXRpb25zIG9mIG9ubHkgc2ltcGxlIG5vZGVzIGFyZSBldmFsdWF0ZWQsIGNvbXBvdW5kcyBhcmUgcG9zaXRpb25lZCBhdXRvbWF0aWNhbGx5KVxuICAgICAgICB2YXIgcGFyZW50c1dpdGhvdXRDaGlsZHJlbiA9IGF1eC5jYWxjUGFyZW50c1dpdGhvdXRDaGlsZHJlbihjeSwgZWxlcyk7XG4gICAgICAgIHZhciBfaGlkZGVuRWxlcyA9IGVsZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlLmNzcygnZGlzcGxheScpID09ICdub25lJztcbiAgICAgICAgfSk7XG4gICAgICAgIG9wdGlvbnMuZWxlcyA9IGVsZXMubm90KF9oaWRkZW5FbGVzKTtcblxuICAgICAgICBlbGVzLm5vZGVzKCkubm90KFwiOnBhcmVudFwiKS5ub3QoX2hpZGRlbkVsZXMpLmxheW91dFBvc2l0aW9ucyhsYXlvdXQsIG9wdGlvbnMsIGdldFBvc2l0aW9ucyk7XG5cbiAgICAgICAgaWYgKHBhcmVudHNXaXRob3V0Q2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHBhcmVudHNXaXRob3V0Q2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgICBlbGUucG9zaXRpb24oZ2V0UG9zaXRpb25zKGVsZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhcIklmIHJhbmRvbWl6ZSBvcHRpb24gaXMgc2V0IHRvIGZhbHNlLCB0aGVuIHF1YWxpdHkgb3B0aW9uIG11c3QgYmUgJ2RlZmF1bHQnIG9yICdwcm9vZicuXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBMYXlvdXQ7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTGF5b3V0O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNjU3OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuLyoqXG4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3BlY3RyYWwgbGF5b3V0IHRoYXQgaXMgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGZjb3NlIGxheW91dCBhbGdvcml0aG1cbiovXG5cbnZhciBhdXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0OCk7XG52YXIgTWF0cml4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLmxheW91dEJhc2UuTWF0cml4O1xudmFyIFNWRCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5sYXlvdXRCYXNlLlNWRDtcblxuLy8gbWFpbiBmdW5jdGlvbiB0aGF0IHNwZWN0cmFsIGxheW91dCBpcyBwcm9jZXNzZWRcbnZhciBzcGVjdHJhbExheW91dCA9IGZ1bmN0aW9uIHNwZWN0cmFsTGF5b3V0KG9wdGlvbnMpIHtcblxuICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpO1xuICB2YXIgcGFyZW50Tm9kZXMgPSBlbGVzLm5vZGVzKFwiOnBhcmVudFwiKTtcblxuICB2YXIgZHVtbXlOb2RlcyA9IG5ldyBNYXAoKTsgLy8gbWFwIHRvIGtlZXAgZHVtbXkgbm9kZXMgYW5kIHRoZWlyIG5laWdoYm9yc1xuICB2YXIgbm9kZUluZGV4ZXMgPSBuZXcgTWFwKCk7IC8vIG1hcCB0byBrZWVwIGluZGV4ZXMgdG8gbm9kZXNcbiAgdmFyIHBhcmVudENoaWxkTWFwID0gbmV3IE1hcCgpOyAvLyBtYXBwaW5nIGJ0dy4gY29tcG91bmQgYW5kIGl0cyByZXByZXNlbnRhdGl2ZSBub2RlIFxuICB2YXIgYWxsTm9kZXNOZWlnaGJvcmhvb2QgPSBbXTsgLy8gYXJyYXkgdG8ga2VlcCBuZWlnaGJvcmhvb2Qgb2YgYWxsIG5vZGVzXG4gIHZhciB4Q29vcmRzID0gW107XG4gIHZhciB5Q29vcmRzID0gW107XG5cbiAgdmFyIHNhbXBsZXNDb2x1bW4gPSBbXTsgLy8gc2FtcGxlZCB2ZXJ0aWNlc1xuICB2YXIgbWluRGlzdGFuY2VzQ29sdW1uID0gW107XG4gIHZhciBDID0gW107IC8vIGNvbHVtbiBzYW1wbGluZyBtYXRyaXhcbiAgdmFyIFBISSA9IFtdOyAvLyBpbnRlcnNlY3Rpb24gb2YgY29sdW1uIGFuZCByb3cgc2FtcGxpbmcgbWF0cmljZXMgXG4gIHZhciBJTlYgPSBbXTsgLy8gaW52ZXJzZSBvZiBQSEkgXG5cbiAgdmFyIGZpcnN0U2FtcGxlID0gdm9pZCAwOyAvLyB0aGUgZmlyc3Qgc2FtcGxlZCBub2RlXG4gIHZhciBub2RlU2l6ZSA9IHZvaWQgMDtcblxuICB2YXIgaW5maW5pdHkgPSAxMDAwMDAwMDA7XG4gIHZhciBzbWFsbCA9IDAuMDAwMDAwMDAxO1xuXG4gIHZhciBwaVRvbCA9IG9wdGlvbnMucGlUb2w7XG4gIHZhciBzYW1wbGluZ1R5cGUgPSBvcHRpb25zLnNhbXBsaW5nVHlwZTsgLy8gZmFsc2UgZm9yIHJhbmRvbSwgdHJ1ZSBmb3IgZ3JlZWR5XG4gIHZhciBub2RlU2VwYXJhdGlvbiA9IG9wdGlvbnMubm9kZVNlcGFyYXRpb247XG4gIHZhciBzYW1wbGVTaXplID0gdm9pZCAwO1xuXG4gIC8qKioqIFNwZWN0cmFsLXByZXByb2Nlc3NpbmcgZnVuY3Rpb25zICoqKiovXG5cbiAgLyoqKiogU3BlY3RyYWwgbGF5b3V0IGZ1bmN0aW9ucyAqKioqL1xuXG4gIC8vIGRldGVybWluZSB3aGljaCBjb2x1bW5zIHRvIGJlIHNhbXBsZWRcbiAgdmFyIHJhbmRvbVNhbXBsZUNSID0gZnVuY3Rpb24gcmFuZG9tU2FtcGxlQ1IoKSB7XG4gICAgdmFyIHNhbXBsZSA9IDA7XG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB2YXIgZmxhZyA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKGNvdW50IDwgc2FtcGxlU2l6ZSkge1xuICAgICAgc2FtcGxlID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbm9kZVNpemUpO1xuXG4gICAgICBmbGFnID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgaWYgKHNhbXBsZXNDb2x1bW5baV0gPT0gc2FtcGxlKSB7XG4gICAgICAgICAgZmxhZyA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFmbGFnKSB7XG4gICAgICAgIHNhbXBsZXNDb2x1bW5bY291bnRdID0gc2FtcGxlO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIHRha2VzIHRoZSBpbmRleCBvZiB0aGUgbm9kZShwaXZvdCkgdG8gaW5pdGlhdGUgQkZTIGFzIGEgcGFyYW1ldGVyXG4gIHZhciBCRlMgPSBmdW5jdGlvbiBCRlMocGl2b3QsIGluZGV4LCBzYW1wbGluZ01ldGhvZCkge1xuICAgIHZhciBwYXRoID0gW107IC8vIHRoZSBmcm9udCBvZiB0aGUgcGF0aFxuICAgIHZhciBmcm9udCA9IDA7IC8vIHRoZSBiYWNrIG9mIHRoZSBwYXRoXG4gICAgdmFyIGJhY2sgPSAwO1xuICAgIHZhciBjdXJyZW50ID0gMDtcbiAgICB2YXIgdGVtcCA9IHZvaWQgMDtcbiAgICB2YXIgZGlzdGFuY2UgPSBbXTtcblxuICAgIHZhciBtYXhfZGlzdCA9IDA7IC8vIHRoZSBmdXJ0aGVzdCBub2RlIHRvIGJlIHJldHVybmVkXG4gICAgdmFyIG1heF9pbmQgPSAxO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlU2l6ZTsgaSsrKSB7XG4gICAgICBkaXN0YW5jZVtpXSA9IGluZmluaXR5O1xuICAgIH1cblxuICAgIHBhdGhbYmFja10gPSBwaXZvdDtcbiAgICBkaXN0YW5jZVtwaXZvdF0gPSAwO1xuXG4gICAgd2hpbGUgKGJhY2sgPj0gZnJvbnQpIHtcbiAgICAgIGN1cnJlbnQgPSBwYXRoW2Zyb250KytdO1xuICAgICAgdmFyIG5laWdoYm9ycyA9IGFsbE5vZGVzTmVpZ2hib3Job29kW2N1cnJlbnRdO1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5laWdoYm9ycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdGVtcCA9IG5vZGVJbmRleGVzLmdldChuZWlnaGJvcnNbX2ldKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlW3RlbXBdID09IGluZmluaXR5KSB7XG4gICAgICAgICAgZGlzdGFuY2VbdGVtcF0gPSBkaXN0YW5jZVtjdXJyZW50XSArIDE7XG4gICAgICAgICAgcGF0aFsrK2JhY2tdID0gdGVtcDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgQ1tjdXJyZW50XVtpbmRleF0gPSBkaXN0YW5jZVtjdXJyZW50XSAqIG5vZGVTZXBhcmF0aW9uO1xuICAgIH1cblxuICAgIGlmIChzYW1wbGluZ01ldGhvZCkge1xuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbm9kZVNpemU7IF9pMisrKSB7XG4gICAgICAgIGlmIChDW19pMl1baW5kZXhdIDwgbWluRGlzdGFuY2VzQ29sdW1uW19pMl0pIG1pbkRpc3RhbmNlc0NvbHVtbltfaTJdID0gQ1tfaTJdW2luZGV4XTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbm9kZVNpemU7IF9pMysrKSB7XG4gICAgICAgIGlmIChtaW5EaXN0YW5jZXNDb2x1bW5bX2kzXSA+IG1heF9kaXN0KSB7XG4gICAgICAgICAgbWF4X2Rpc3QgPSBtaW5EaXN0YW5jZXNDb2x1bW5bX2kzXTtcbiAgICAgICAgICBtYXhfaW5kID0gX2kzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXhfaW5kO1xuICB9O1xuXG4gIC8vIGFwcGx5IEJGUyB0byBhbGwgbm9kZXMgb3Igc2VsZWN0ZWQgc2FtcGxlc1xuICB2YXIgYWxsQkZTID0gZnVuY3Rpb24gYWxsQkZTKHNhbXBsaW5nTWV0aG9kKSB7XG5cbiAgICB2YXIgc2FtcGxlID0gdm9pZCAwO1xuXG4gICAgaWYgKCFzYW1wbGluZ01ldGhvZCkge1xuICAgICAgcmFuZG9tU2FtcGxlQ1IoKTtcblxuICAgICAgLy8gY2FsbCBCRlNcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2FtcGxlU2l6ZTsgaSsrKSB7XG4gICAgICAgIEJGUyhzYW1wbGVzQ29sdW1uW2ldLCBpLCBzYW1wbGluZ01ldGhvZCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzYW1wbGUgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBub2RlU2l6ZSk7XG4gICAgICBmaXJzdFNhbXBsZSA9IHNhbXBsZTtcblxuICAgICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgbm9kZVNpemU7IF9pNCsrKSB7XG4gICAgICAgIG1pbkRpc3RhbmNlc0NvbHVtbltfaTRdID0gaW5maW5pdHk7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IHNhbXBsZVNpemU7IF9pNSsrKSB7XG4gICAgICAgIHNhbXBsZXNDb2x1bW5bX2k1XSA9IHNhbXBsZTtcbiAgICAgICAgc2FtcGxlID0gQkZTKHNhbXBsZSwgX2k1LCBzYW1wbGluZ01ldGhvZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZm9ybSB0aGUgc3F1YXJlZCBkaXN0YW5jZXMgZm9yIENcbiAgICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBub2RlU2l6ZTsgX2k2KyspIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2FtcGxlU2l6ZTsgaisrKSB7XG4gICAgICAgIENbX2k2XVtqXSAqPSBDW19pNl1bal07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZm9ybSBQSElcbiAgICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCBzYW1wbGVTaXplOyBfaTcrKykge1xuICAgICAgUEhJW19pN10gPSBbXTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaTggPSAwOyBfaTggPCBzYW1wbGVTaXplOyBfaTgrKykge1xuICAgICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IHNhbXBsZVNpemU7IF9qKyspIHtcbiAgICAgICAgUEhJW19pOF1bX2pdID0gQ1tzYW1wbGVzQ29sdW1uW19qXV1bX2k4XTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gcGVyZm9ybSB0aGUgU1ZEIGFsZ29yaXRobSBhbmQgYXBwbHkgYSByZWd1bGFyaXphdGlvbiBzdGVwXG4gIHZhciBzYW1wbGUgPSBmdW5jdGlvbiBzYW1wbGUoKSB7XG5cbiAgICB2YXIgU1ZEUmVzdWx0ID0gU1ZELnN2ZChQSEkpO1xuXG4gICAgdmFyIGFfcSA9IFNWRFJlc3VsdC5TO1xuICAgIHZhciBhX3UgPSBTVkRSZXN1bHQuVTtcbiAgICB2YXIgYV92ID0gU1ZEUmVzdWx0LlY7XG5cbiAgICB2YXIgbWF4X3MgPSBhX3FbMF0gKiBhX3FbMF0gKiBhX3FbMF07XG5cbiAgICB2YXIgYV9TaWcgPSBbXTtcblxuICAgIC8vICByZWd1bGFyaXphdGlvblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2FtcGxlU2l6ZTsgaSsrKSB7XG4gICAgICBhX1NpZ1tpXSA9IFtdO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzYW1wbGVTaXplOyBqKyspIHtcbiAgICAgICAgYV9TaWdbaV1bal0gPSAwO1xuICAgICAgICBpZiAoaSA9PSBqKSB7XG4gICAgICAgICAgYV9TaWdbaV1bal0gPSBhX3FbaV0gLyAoYV9xW2ldICogYV9xW2ldICsgbWF4X3MgLyAoYV9xW2ldICogYV9xW2ldKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBJTlYgPSBNYXRyaXgubXVsdE1hdChNYXRyaXgubXVsdE1hdChhX3YsIGFfU2lnKSwgTWF0cml4LnRyYW5zcG9zZShhX3UpKTtcbiAgfTtcblxuICAvLyBjYWxjdWxhdGUgZmluYWwgY29vcmRpbmF0ZXMgXG4gIHZhciBwb3dlckl0ZXJhdGlvbiA9IGZ1bmN0aW9uIHBvd2VySXRlcmF0aW9uKCkge1xuICAgIC8vIHR3byBsYXJnZXN0IGVpZ2VudmFsdWVzXG4gICAgdmFyIHRoZXRhMSA9IHZvaWQgMDtcbiAgICB2YXIgdGhldGEyID0gdm9pZCAwO1xuXG4gICAgLy8gaW5pdGlhbCBndWVzc2VzIGZvciBlaWdlbnZlY3RvcnNcbiAgICB2YXIgWTEgPSBbXTtcbiAgICB2YXIgWTIgPSBbXTtcblxuICAgIHZhciBWMSA9IFtdO1xuICAgIHZhciBWMiA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlU2l6ZTsgaSsrKSB7XG4gICAgICBZMVtpXSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICBZMltpXSA9IE1hdGgucmFuZG9tKCk7XG4gICAgfVxuXG4gICAgWTEgPSBNYXRyaXgubm9ybWFsaXplKFkxKTtcbiAgICBZMiA9IE1hdHJpeC5ub3JtYWxpemUoWTIpO1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICAvLyB0byBrZWVwIHRyYWNrIG9mIHRoZSBpbXByb3ZlbWVudCByYXRpbyBpbiBwb3dlciBpdGVyYXRpb25cbiAgICB2YXIgY3VycmVudCA9IHNtYWxsO1xuICAgIHZhciBwcmV2aW91cyA9IHNtYWxsO1xuXG4gICAgdmFyIHRlbXAgPSB2b2lkIDA7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY291bnQrKztcblxuICAgICAgZm9yICh2YXIgX2k5ID0gMDsgX2k5IDwgbm9kZVNpemU7IF9pOSsrKSB7XG4gICAgICAgIFYxW19pOV0gPSBZMVtfaTldO1xuICAgICAgfVxuXG4gICAgICBZMSA9IE1hdHJpeC5tdWx0R2FtbWEoTWF0cml4Lm11bHRMKE1hdHJpeC5tdWx0R2FtbWEoVjEpLCBDLCBJTlYpKTtcbiAgICAgIHRoZXRhMSA9IE1hdHJpeC5kb3RQcm9kdWN0KFYxLCBZMSk7XG4gICAgICBZMSA9IE1hdHJpeC5ub3JtYWxpemUoWTEpO1xuXG4gICAgICBjdXJyZW50ID0gTWF0cml4LmRvdFByb2R1Y3QoVjEsIFkxKTtcblxuICAgICAgdGVtcCA9IE1hdGguYWJzKGN1cnJlbnQgLyBwcmV2aW91cyk7XG5cbiAgICAgIGlmICh0ZW1wIDw9IDEgKyBwaVRvbCAmJiB0ZW1wID49IDEpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzID0gY3VycmVudDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaTEwID0gMDsgX2kxMCA8IG5vZGVTaXplOyBfaTEwKyspIHtcbiAgICAgIFYxW19pMTBdID0gWTFbX2kxMF07XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZpb3VzID0gc21hbGw7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvdW50Kys7XG5cbiAgICAgIGZvciAodmFyIF9pMTEgPSAwOyBfaTExIDwgbm9kZVNpemU7IF9pMTErKykge1xuICAgICAgICBWMltfaTExXSA9IFkyW19pMTFdO1xuICAgICAgfVxuXG4gICAgICBWMiA9IE1hdHJpeC5taW51c09wKFYyLCBNYXRyaXgubXVsdENvbnMoVjEsIE1hdHJpeC5kb3RQcm9kdWN0KFYxLCBWMikpKTtcbiAgICAgIFkyID0gTWF0cml4Lm11bHRHYW1tYShNYXRyaXgubXVsdEwoTWF0cml4Lm11bHRHYW1tYShWMiksIEMsIElOVikpO1xuICAgICAgdGhldGEyID0gTWF0cml4LmRvdFByb2R1Y3QoVjIsIFkyKTtcbiAgICAgIFkyID0gTWF0cml4Lm5vcm1hbGl6ZShZMik7XG5cbiAgICAgIGN1cnJlbnQgPSBNYXRyaXguZG90UHJvZHVjdChWMiwgWTIpO1xuXG4gICAgICB0ZW1wID0gTWF0aC5hYnMoY3VycmVudCAvIHByZXZpb3VzKTtcblxuICAgICAgaWYgKHRlbXAgPD0gMSArIHBpVG9sICYmIHRlbXAgPj0gMSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXMgPSBjdXJyZW50O1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pMTIgPSAwOyBfaTEyIDwgbm9kZVNpemU7IF9pMTIrKykge1xuICAgICAgVjJbX2kxMl0gPSBZMltfaTEyXTtcbiAgICB9XG5cbiAgICAvLyB0aGV0YTEgbm93IGNvbnRhaW5zIGRvbWluYW50IGVpZ2VudmFsdWVcbiAgICAvLyB0aGV0YTIgbm93IGNvbnRhaW5zIHRoZSBzZWNvbmQtbGFyZ2VzdCBlaWdlbnZhbHVlXG4gICAgLy8gVjEgbm93IGNvbnRhaW5zIHRoZXRhMSdzIGVpZ2VudmVjdG9yXG4gICAgLy8gVjIgbm93IGNvbnRhaW5zIHRoZXRhMidzIGVpZ2VudmVjdG9yXG5cbiAgICAvL3BvcHVsYXRlIHRoZSB0d28gdmVjdG9yc1xuICAgIHhDb29yZHMgPSBNYXRyaXgubXVsdENvbnMoVjEsIE1hdGguc3FydChNYXRoLmFicyh0aGV0YTEpKSk7XG4gICAgeUNvb3JkcyA9IE1hdHJpeC5tdWx0Q29ucyhWMiwgTWF0aC5zcXJ0KE1hdGguYWJzKHRoZXRhMikpKTtcbiAgfTtcblxuICAvKioqKiBQcmVwYXJhdGlvbiBmb3Igc3BlY3RyYWwgbGF5b3V0IChQcmVwcm9jZXNzaW5nKSAqKioqL1xuXG4gIC8vIGNvbm5lY3QgZGlzY29ubmVjdGVkIGNvbXBvbmVudHMgKGZpcnN0IHRvcCBsZXZlbCwgdGhlbiBpbnNpZGUgb2YgZWFjaCBjb21wb3VuZCBub2RlKVxuICBhdXguY29ubmVjdENvbXBvbmVudHMoY3ksIGVsZXMsIGF1eC5nZXRUb3BNb3N0Tm9kZXMobm9kZXMpLCBkdW1teU5vZGVzKTtcblxuICBwYXJlbnROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICBhdXguY29ubmVjdENvbXBvbmVudHMoY3ksIGVsZXMsIGF1eC5nZXRUb3BNb3N0Tm9kZXMoZWxlLmRlc2NlbmRhbnRzKCkuaW50ZXJzZWN0aW9uKGVsZXMpKSwgZHVtbXlOb2Rlcyk7XG4gIH0pO1xuXG4gIC8vIGFzc2lnbiBpbmRleGVzIHRvIG5vZGVzIChmaXJzdCByZWFsLCB0aGVuIGR1bW15IG5vZGVzKVxuICB2YXIgaW5kZXggPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFub2Rlc1tpXS5pc1BhcmVudCgpKSB7XG4gICAgICBub2RlSW5kZXhlcy5zZXQobm9kZXNbaV0uaWQoKSwgaW5kZXgrKyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgdmFyIF9pdGVyYXRvckVycm9yID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gZHVtbXlOb2Rlcy5rZXlzKClbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gKF9zdGVwID0gX2l0ZXJhdG9yLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlKSB7XG4gICAgICB2YXIga2V5ID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgIG5vZGVJbmRleGVzLnNldChrZXksIGluZGV4KyspO1xuICAgIH1cblxuICAgIC8vIGluc3RhbnRpYXRlIHRoZSBuZWlnaGJvcmhvb2QgbWF0cml4XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICBfaXRlcmF0b3JFcnJvciA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uICYmIF9pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgX2l0ZXJhdG9yLnJldHVybigpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgX2kxMyA9IDA7IF9pMTMgPCBub2RlSW5kZXhlcy5zaXplOyBfaTEzKyspIHtcbiAgICBhbGxOb2Rlc05laWdoYm9yaG9vZFtfaTEzXSA9IFtdO1xuICB9XG5cbiAgLy8gZm9ybSBhIHBhcmVudC1jaGlsZCBtYXAgdG8ga2VlcCByZXByZXNlbnRhdGl2ZSBub2RlIG9mIGVhY2ggY29tcG91bmQgbm9kZSAgXG4gIHBhcmVudE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgIHZhciBjaGlsZHJlbiA9IGVsZS5jaGlsZHJlbigpLmludGVyc2VjdGlvbihlbGVzKTtcblxuICAgIC8vICAgICAgbGV0IHJhbmRvbSA9IDA7XG4gICAgd2hpbGUgKGNoaWxkcmVuLm5vZGVzKFwiOmNoaWxkbGVzc1wiKS5sZW5ndGggPT0gMCkge1xuICAgICAgLy8gICAgICAgIHJhbmRvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoaWxkcmVuLm5vZGVzKCkubGVuZ3RoKTsgLy8gaWYgYWxsIGNoaWxkcmVuIGFyZSBjb21wb3VuZCB0aGVuIHByb2NlZWQgcmFuZG9tbHlcbiAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4ubm9kZXMoKVswXS5jaGlsZHJlbigpLmludGVyc2VjdGlvbihlbGVzKTtcbiAgICB9XG4gICAgLy8gIHNlbGVjdCB0aGUgcmVwcmVzZW50YXRpdmUgbm9kZSAtIHdlIGNhbiBhcHBseSBkaWZmZXJlbnQgbWV0aG9kcyBoZXJlXG4gICAgLy8gICAgICByYW5kb20gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGlsZHJlbi5ub2RlcyhcIjpjaGlsZGxlc3NcIikubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBtaW4gPSBjaGlsZHJlbi5ub2RlcyhcIjpjaGlsZGxlc3NcIilbMF0uY29ubmVjdGVkRWRnZXMoKS5sZW5ndGg7XG4gICAgY2hpbGRyZW4ubm9kZXMoXCI6Y2hpbGRsZXNzXCIpLmZvckVhY2goZnVuY3Rpb24gKGVsZTIsIGkpIHtcbiAgICAgIGlmIChlbGUyLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoIDwgbWluKSB7XG4gICAgICAgIG1pbiA9IGVsZTIuY29ubmVjdGVkRWRnZXMoKS5sZW5ndGg7XG4gICAgICAgIGluZGV4ID0gaTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwYXJlbnRDaGlsZE1hcC5zZXQoZWxlLmlkKCksIGNoaWxkcmVuLm5vZGVzKFwiOmNoaWxkbGVzc1wiKVtpbmRleF0uaWQoKSk7XG4gIH0pO1xuXG4gIC8vIGFkZCBuZWlnaGJvcmhvb2QgcmVsYXRpb25zIChmaXJzdCByZWFsLCB0aGVuIGR1bW15IG5vZGVzKVxuICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICB2YXIgZWxlSW5kZXggPSB2b2lkIDA7XG5cbiAgICBpZiAoZWxlLmlzUGFyZW50KCkpIGVsZUluZGV4ID0gbm9kZUluZGV4ZXMuZ2V0KHBhcmVudENoaWxkTWFwLmdldChlbGUuaWQoKSkpO2Vsc2UgZWxlSW5kZXggPSBub2RlSW5kZXhlcy5nZXQoZWxlLmlkKCkpO1xuXG4gICAgZWxlLm5laWdoYm9yaG9vZCgpLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgaWYgKGVsZXMuaW50ZXJzZWN0aW9uKGVsZS5lZGdlc1dpdGgobm9kZSkpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKG5vZGUuaXNQYXJlbnQoKSkgYWxsTm9kZXNOZWlnaGJvcmhvb2RbZWxlSW5kZXhdLnB1c2gocGFyZW50Q2hpbGRNYXAuZ2V0KG5vZGUuaWQoKSkpO2Vsc2UgYWxsTm9kZXNOZWlnaGJvcmhvb2RbZWxlSW5kZXhdLnB1c2gobm9kZS5pZCgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoX2tleSkge1xuICAgIHZhciBlbGVJbmRleCA9IG5vZGVJbmRleGVzLmdldChfa2V5KTtcbiAgICB2YXIgZGlzY29ubmVjdGVkSWQgPSB2b2lkIDA7XG4gICAgZHVtbXlOb2Rlcy5nZXQoX2tleSkuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGlmIChjeS5nZXRFbGVtZW50QnlJZChpZCkuaXNQYXJlbnQoKSkgZGlzY29ubmVjdGVkSWQgPSBwYXJlbnRDaGlsZE1hcC5nZXQoaWQpO2Vsc2UgZGlzY29ubmVjdGVkSWQgPSBpZDtcblxuICAgICAgYWxsTm9kZXNOZWlnaGJvcmhvb2RbZWxlSW5kZXhdLnB1c2goZGlzY29ubmVjdGVkSWQpO1xuICAgICAgYWxsTm9kZXNOZWlnaGJvcmhvb2Rbbm9kZUluZGV4ZXMuZ2V0KGRpc2Nvbm5lY3RlZElkKV0ucHVzaChfa2V5KTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSB0cnVlO1xuICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IyID0gZmFsc2U7XG4gIHZhciBfaXRlcmF0b3JFcnJvcjIgPSB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gZHVtbXlOb2Rlcy5rZXlzKClbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDI7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSAoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiA9IHRydWUpIHtcbiAgICAgIHZhciBfa2V5ID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICBfbG9vcChfa2V5KTtcbiAgICB9XG5cbiAgICAvLyBub2RlU2l6ZSBub3cgb25seSBjb25zaWRlcnMgdGhlIHNpemUgb2YgdHJhbnNmb3JtZWQgZ3JhcGhcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2RpZEl0ZXJhdG9yRXJyb3IyID0gdHJ1ZTtcbiAgICBfaXRlcmF0b3JFcnJvcjIgPSBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgJiYgX2l0ZXJhdG9yMi5yZXR1cm4pIHtcbiAgICAgICAgX2l0ZXJhdG9yMi5yZXR1cm4oKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMikge1xuICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbm9kZVNpemUgPSBub2RlSW5kZXhlcy5zaXplO1xuXG4gIHZhciBzcGVjdHJhbFJlc3VsdCA9IHZvaWQgMDtcblxuICAvLyBJZiBudW1iZXIgb2Ygbm9kZXMgaW4gdHJhbnNmb3JtZWQgZ3JhcGggaXMgMSBvciAyLCBlaXRoZXIgU1ZEIG9yIHBvd2VySXRlcmF0aW9uIGNhdXNlcyBwcm9ibGVtXG4gIC8vIFNvIHNraXAgc3BlY3RyYWwgYW5kIGxheW91dCB0aGUgZ3JhcGggd2l0aCBjb3NlXG4gIGlmIChub2RlU2l6ZSA+IDIpIHtcbiAgICAvLyBpZiAjIG9mIG5vZGVzIGluIHRyYW5zZm9ybWVkIGdyYXBoIGlzIHNtYWxsZXIgdGhhbiBzYW1wbGUgc2l6ZSxcbiAgICAvLyB0aGVuIHVzZSAjIG9mIG5vZGVzIGFzIHNhbXBsZSBzaXplXG4gICAgc2FtcGxlU2l6ZSA9IG5vZGVTaXplIDwgb3B0aW9ucy5zYW1wbGVTaXplID8gbm9kZVNpemUgOiBvcHRpb25zLnNhbXBsZVNpemU7XG5cbiAgICAvLyBpbnN0YW50aWF0ZXMgdGhlIHBhcnRpYWwgbWF0cmljZXMgdGhhdCB3aWxsIGJlIHVzZWQgaW4gc3BlY3RyYWwgbGF5b3V0XG4gICAgZm9yICh2YXIgX2kxNCA9IDA7IF9pMTQgPCBub2RlU2l6ZTsgX2kxNCsrKSB7XG4gICAgICBDW19pMTRdID0gW107XG4gICAgfVxuICAgIGZvciAodmFyIF9pMTUgPSAwOyBfaTE1IDwgc2FtcGxlU2l6ZTsgX2kxNSsrKSB7XG4gICAgICBJTlZbX2kxNV0gPSBbXTtcbiAgICB9XG5cbiAgICAvKioqKiBBcHBseSBzcGVjdHJhbCBsYXlvdXQgKioqKi9cblxuICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiIHx8IG9wdGlvbnMuc3RlcCA9PSBcImFsbFwiKSB7XG4gICAgICBhbGxCRlMoc2FtcGxpbmdUeXBlKTtcbiAgICAgIHNhbXBsZSgpO1xuICAgICAgcG93ZXJJdGVyYXRpb24oKTtcblxuICAgICAgc3BlY3RyYWxSZXN1bHQgPSB7IG5vZGVJbmRleGVzOiBub2RlSW5kZXhlcywgeENvb3JkczogeENvb3JkcywgeUNvb3JkczogeUNvb3JkcyB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlSW5kZXhlcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgIHhDb29yZHMucHVzaChjeS5nZXRFbGVtZW50QnlJZChrZXkpLnBvc2l0aW9uKFwieFwiKSk7XG4gICAgICAgIHlDb29yZHMucHVzaChjeS5nZXRFbGVtZW50QnlJZChrZXkpLnBvc2l0aW9uKFwieVwiKSk7XG4gICAgICB9KTtcbiAgICAgIHNwZWN0cmFsUmVzdWx0ID0geyBub2RlSW5kZXhlczogbm9kZUluZGV4ZXMsIHhDb29yZHM6IHhDb29yZHMsIHlDb29yZHM6IHlDb29yZHMgfTtcbiAgICB9XG4gICAgcmV0dXJuIHNwZWN0cmFsUmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIHZhciBpdGVyYXRvciA9IG5vZGVJbmRleGVzLmtleXMoKTtcbiAgICB2YXIgZmlyc3ROb2RlID0gY3kuZ2V0RWxlbWVudEJ5SWQoaXRlcmF0b3IubmV4dCgpLnZhbHVlKTtcbiAgICB2YXIgZmlyc3ROb2RlUG9zID0gZmlyc3ROb2RlLnBvc2l0aW9uKCk7XG4gICAgdmFyIGZpcnN0Tm9kZVdpZHRoID0gZmlyc3ROb2RlLm91dGVyV2lkdGgoKTtcbiAgICB4Q29vcmRzLnB1c2goZmlyc3ROb2RlUG9zLngpO1xuICAgIHlDb29yZHMucHVzaChmaXJzdE5vZGVQb3MueSk7XG4gICAgaWYgKG5vZGVTaXplID09IDIpIHtcbiAgICAgIHZhciBzZWNvbmROb2RlID0gY3kuZ2V0RWxlbWVudEJ5SWQoaXRlcmF0b3IubmV4dCgpLnZhbHVlKTtcbiAgICAgIHZhciBzZWNvbmROb2RlV2lkdGggPSBzZWNvbmROb2RlLm91dGVyV2lkdGgoKTtcbiAgICAgIHhDb29yZHMucHVzaChmaXJzdE5vZGVQb3MueCArIGZpcnN0Tm9kZVdpZHRoIC8gMiArIHNlY29uZE5vZGVXaWR0aCAvIDIgKyBvcHRpb25zLmlkZWFsRWRnZUxlbmd0aCk7XG4gICAgICB5Q29vcmRzLnB1c2goZmlyc3ROb2RlUG9zLnkpO1xuICAgIH1cblxuICAgIHNwZWN0cmFsUmVzdWx0ID0geyBub2RlSW5kZXhlczogbm9kZUluZGV4ZXMsIHhDb29yZHM6IHhDb29yZHMsIHlDb29yZHM6IHlDb29yZHMgfTtcbiAgICByZXR1cm4gc3BlY3RyYWxSZXN1bHQ7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0geyBzcGVjdHJhbExheW91dDogc3BlY3RyYWxMYXlvdXQgfTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU3OTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBpbXBsID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTIpO1xuXG4vLyByZWdpc3RlcnMgdGhlIGV4dGVuc2lvbiBvbiBhIGN5dG9zY2FwZSBsaWIgcmVmXG52YXIgcmVnaXN0ZXIgPSBmdW5jdGlvbiByZWdpc3RlcihjeXRvc2NhcGUpIHtcbiAgaWYgKCFjeXRvc2NhcGUpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gY2FuJ3QgcmVnaXN0ZXIgaWYgY3l0b3NjYXBlIHVuc3BlY2lmaWVkXG5cbiAgY3l0b3NjYXBlKCdsYXlvdXQnLCAnZmNvc2UnLCBpbXBsKTsgLy8gcmVnaXN0ZXIgd2l0aCBjeXRvc2NhcGUuanNcbn07XG5cbmlmICh0eXBlb2YgY3l0b3NjYXBlICE9PSAndW5kZWZpbmVkJykge1xuICAvLyBleHBvc2UgdG8gZ2xvYmFsIGN5dG9zY2FwZSAoaS5lLiB3aW5kb3cuY3l0b3NjYXBlKVxuICByZWdpc3RlcihjeXRvc2NhcGUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlZ2lzdGVyO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMTQwOlxuLyoqKi8gKChtb2R1bGUpID0+IHtcblxubW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xNDBfXztcblxuLyoqKi8gfSlcblxuLyoqKioqKi8gXHR9KTtcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuLyoqKioqKi8gXHRcdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqLyBcdFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8vIHN0YXJ0dXBcbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdC8vIFRoaXMgZW50cnkgbW9kdWxlIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgbW9kdWxlcyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NzkpO1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19leHBvcnRzX187XG4vKioqKioqLyB9KSgpXG47XG59KTsiLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5jb25zdCB7IHN0cmluZywgYXJyYXksIG9iamVjdCwgbnVtYmVyLCBib29sLCBvbmVPZlR5cGUsIGFueSwgZnVuYyB9ID0gUHJvcFR5cGVzO1xuXG5leHBvcnQgY29uc3QgdHlwZXMgPSB7XG4gIC8qKlxuICAgKiBUaGUgYGlkYCBIVE1MIGF0dHJpYnV0ZSBvZiB0aGUgY29tcG9uZW50LlxuICAgKiAqL1xuICBpZDogc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgYGNsYXNzYCBIVE1MIGF0dHJpYnV0ZSBvZiB0aGUgY29tcG9uZW50LiAgVXNlIHRoaXMgdG8gc2V0IHRoZSBkaW1lbnNpb25zIG9mXG4gICAqIHRoZSBncmFwaCB2aXN1YWxpc2F0aW9uIHZpYSBhIHN0eWxlIGJsb2NrIGluIHlvdXIgQ1NTIGZpbGUuXG4gICAqL1xuICBjbGFzc05hbWU6IHN0cmluZyxcblxuICAvKipcbiAgICogVGhlIGBzdHlsZWAgSFRNTCBhdHRyaWJ1dGUgb2YgdGhlIGNvbXBvbmVudC4gIFVzZSB0aGlzIHRvIHNldCB0aGUgZGltZW5zaW9ucyBvZlxuICAgKiB0aGUgZ3JhcGggdmlzdWFsaXNhdGlvbiBpZiB5b3UgZG8gbm90IHVzZSBzZXBhcmF0ZSBDU1MgZmlsZXMuXG4gICAqL1xuICBzdHlsZTogb25lT2ZUeXBlKFtzdHJpbmcsIG9iamVjdF0pLFxuXG4gIC8qKlxuICAgKiBUaGUgZmxhdCBsaXN0IG9mIEN5dG9zY2FwZSBlbGVtZW50cyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZ3JhcGgsIGVhY2ggcmVwcmVzZW50ZWRcbiAgICogYXMgbm9uLXN0cmluZ2lmaWVkIEpTT04uICBFLmcuOlxuICAgKlxuICAgKiBgYGBcbiAgICogZWxlbWVudHM6IFtcbiAgICogICB7IGRhdGE6IHsgaWQ6ICdvbmUnLCBsYWJlbDogJ05vZGUgMScgfSwgcG9zaXRpb246IHsgeDogMCwgeTogMCB9IH0sXG4gICAqICAgeyBkYXRhOiB7IGlkOiAndHdvJywgbGFiZWw6ICdOb2RlIDInIH0sIHBvc2l0aW9uOiB7IHg6IDEwMCwgeTogMCB9IH0sXG4gICAqICAgeyBkYXRhOiB7IHNvdXJjZTogJ29uZScsIHRhcmdldDogJ3R3bycsIGxhYmVsOiAnRWRnZSBmcm9tIE5vZGUxIHRvIE5vZGUyJyB9IH1cbiAgICogXVxuICAgKiBgYGBcbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNub3RhdGlvbi9lbGVtZW50cy1qc29uXG4gICAqICovXG4gIGVsZW1lbnRzOiBvbmVPZlR5cGUoW2FycmF5LCBhbnldKSxcblxuICAvKipcbiAgICogVGhlIEN5dG9zY2FwZSBzdHlsZXNoZWV0IGFzIG5vbi1zdHJpbmdpZmllZCBKU09OLiAgRS5nLjpcbiAgICpcbiAgICogYGBgXG4gICAqIHN0eWxlc2hlZXQ6IFtcbiAgICogICB7XG4gICAqICAgICAgc2VsZWN0b3I6ICdub2RlJyxcbiAgICogICAgICBzdHlsZToge1xuICAgKiAgICAgICAgJ3dpZHRoJzogMzAsXG4gICAqICAgICAgICAnaGVpZ2h0JzogMzAsXG4gICAqICAgICAgICAnc2hhcGUnOiAncmVjdGFuZ2xlJ1xuICAgKiAgICAgIH1cbiAgICogICB9XG4gICAqIF1cbiAgICogYGBgXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jc3R5bGVcbiAgICovXG4gIHN0eWxlc2hlZXQ6IG9uZU9mVHlwZShbYXJyYXksIGFueV0pLFxuXG4gIC8qKlxuICAgKiBVc2UgYSBsYXlvdXQgdG8gYXV0b21hdGljYWxseSBwb3NpdGlvbiB0aGUgbm9kZXMgaW4gdGhlIGdyYXBoLiAgRS5nLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGF5b3V0OiB7IG5hbWU6ICdyYW5kb20nIH1cbiAgICogYGBgXG4gICAqXG4gICAqIE4uYi4gdG8gdXNlIGFuIGV4dGVybmFsIGxheW91dCBleHRlbnNpb24sIHlvdSBtdXN0IHJlZ2lzdGVyIHRoZSBleHRlbnNpb25cbiAgICogcHJpb3IgdG8gcmVuZGVyaW5nIHRoaXMgY29tcG9uZW50LCBlLmcuOlxuICAgKlxuICAgKiBgYGBcbiAgICogaW1wb3J0IEN5dG9zY2FwZSBmcm9tICdjeXRvc2NhcGUnO1xuICAgKiBpbXBvcnQgQ09TRUJpbGtlbnQgZnJvbSAnY3l0b3NjYXBlLWNvc2UtYmlsa2VudCc7XG4gICAqIGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG4gICAqIGltcG9ydCBDeXRvc2NhcGVDb21wb25lbnQgZnJvbSAnY3l0b3NjYXBlLXJlYWN0anMnO1xuICAgKlxuICAgKiBDeXRvc2NhcGUudXNlKENPU0VCaWxrZW50KTtcbiAgICpcbiAgICogY2xhc3MgTXlBcHAgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgKiAgIHJlbmRlcigpIHtcbiAgICogICAgIGNvbnN0IGVsZW1lbnRzID0gW1xuICAgKiAgICAgICB7IGRhdGE6IHsgaWQ6ICdvbmUnLCBsYWJlbDogJ05vZGUgMScgfSwgcG9zaXRpb246IHsgeDogMCwgeTogMCB9IH0sXG4gICAqICAgICAgIHsgZGF0YTogeyBpZDogJ3R3bycsIGxhYmVsOiAnTm9kZSAyJyB9LCBwb3NpdGlvbjogeyB4OiAxMDAsIHk6IDAgfSB9LFxuICAgKiAgICAgICB7IGRhdGE6IHsgc291cmNlOiAnb25lJywgdGFyZ2V0OiAndHdvJywgbGFiZWw6ICdFZGdlIGZyb20gTm9kZTEgdG8gTm9kZTInIH0gfVxuICAgKiAgICAgXTtcbiAgICpcbiAgICogICAgIGNvbnN0IGxheW91dCA9IHsgbmFtZTogJ2Nvc2UtYmlsa2VudCcgfTtcbiAgICpcbiAgICogICAgIHJldHVybiA8Q3l0b3NjYXBlQ29tcG9uZW50IGVsZW1lbnRzPXtlbGVtZW50c30gbGF5b3V0PXtsYXlvdXR9PjtcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jbGF5b3V0c1xuICAgKi9cbiAgbGF5b3V0OiBvbmVPZlR5cGUoW29iamVjdCwgYW55XSksXG5cbiAgLyoqXG4gICAqIFRoZSBwYW5uaW5nIHBvc2l0aW9uIG9mIHRoZSBncmFwaC5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvcGFuXG4gICAqL1xuICBwYW46IG9uZU9mVHlwZShbb2JqZWN0LCBhbnldKSxcblxuICAvKipcbiAgICogVGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy96b29tXG4gICAqL1xuICB6b29tOiBudW1iZXIsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBhbm5pbmcgcG9zaXRpb24gb2YgdGhlIGdyYXBoIGlzIG11dGFibGUgb3ZlcmFsbC5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvcGFubmluZ0VuYWJsZWRcbiAgICovXG4gIHBhbm5pbmdFbmFibGVkOiBib29sLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYW5uaW5nIHBvc2l0aW9uIG9mIHRoZSBncmFwaCBpcyBtdXRhYmxlIGJ5IHVzZXIgZ2VzdHVyZXMgKGUuZy4gc3dpcGUpLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy91c2VyUGFubmluZ0VuYWJsZWRcbiAgICovXG4gIHVzZXJQYW5uaW5nRW5hYmxlZDogYm9vbCxcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gem9vbSBsZXZlbCBvZiB0aGUgZ3JhcGguXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL21pblpvb21cbiAgICovXG4gIG1pblpvb206IG51bWJlcixcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gem9vbSBsZXZlbCBvZiB0aGUgZ3JhcGguXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL21heFpvb21cbiAgICovXG4gIG1heFpvb206IG51bWJlcixcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgem9vbSBsZXZlbCBvZiB0aGUgZ3JhcGggaXMgbXV0YWJsZSBvdmVyYWxsLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy96b29taW5nRW5hYmxlZFxuICAgKi9cbiAgem9vbWluZ0VuYWJsZWQ6IGJvb2wsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoIGlzIG11dGFibGUgYnkgdXNlciBnZXN0dXJlcyAoZS5nLiBwaW5jaC10by16b29tKS5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvdXNlclpvb21pbmdFbmFibGVkXG4gICAqL1xuICB1c2VyWm9vbWluZ0VuYWJsZWQ6IGJvb2wsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgc2hpZnQrY2xpY2stYW5kLWRyYWcgYm94IHNlbGVjdGlvbiBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy9ib3hTZWxlY3Rpb25FbmFibGVkXG4gICAqL1xuICBib3hTZWxlY3Rpb25FbmFibGVkOiBib29sLFxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBub2RlcyBhdXRvbWF0aWNhbGx5IGNhbiBub3QgYmUgZ3JhYmJlZCByZWdhcmRsZXNzIG9mIHdoZXRoZXJcbiAgICogZWFjaCBub2RlIGlzIG1hcmtlZCBhcyBncmFiYmFibGUuXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL2F1dG91bmdyYWJpZnlcbiAgICovXG4gIGF1dG91bmdyYWJpZnk6IGJvb2wsXG5cbiAgLyoqXG4gICAqIElmIHRydWUsIG5vZGVzIGNhbiBub3QgYmUgbW92ZWQgYXQgYWxsLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy9hdXRvbG9ja1xuICAgKi9cbiAgYXV0b2xvY2s6IGJvb2wsXG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGVsZW1lbnRzIGhhdmUgaW1tdXRhYmxlIHNlbGVjdGlvbiBzdGF0ZS5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvYXV0b3Vuc2VsZWN0aWZ5XG4gICAqL1xuICBhdXRvdW5zZWxlY3RpZnk6IGJvb2wsXG5cbiAgLyoqXG4gICAqIGBnZXQob2JqZWN0LCBrZXkpYFxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYG9iamVjdGAgYXQgdGhlIGBrZXlgLCB3aGljaCBtYXkgYmUgYW4gaW50ZWdlclxuICAgKiBpbiB0aGUgY2FzZSBvZiBsaXN0cy9hcnJheXMgb3Igc3RyaW5ncyBpbiB0aGUgY2FzZSBvZiBtYXBzL29iamVjdHMuXG4gICAqL1xuICBnZXQ6IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGB0b0pzb24ob2JqZWN0KWBcbiAgICogR2V0IHRoZSBkZWVwIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYG9iamVjdGAgYXMgbm9uLXN0cmluZ2lmaWVkIEpTT04uXG4gICAqL1xuICB0b0pzb246IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGRpZmYob2JqZWN0QSwgb2JqZWN0QilcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHR3byBvYmplY3RzIGhhdmUgZXF1YWwgdmFsdWUuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWZcbiAgICogYW5kIHdoZXJlIEN5dG9zY2FwZSBuZWVkcyB0byBiZSBwYXRjaGVkLlxuICAgKi9cbiAgZGlmZjogZnVuYyxcblxuICAvKipcbiAgICogZm9yRWFjaChsaXN0LCBpdGVyYXRvcilcbiAgICogQ2FsbCBgaXRlcmF0b3JgIG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYGxpc3RgLCBpbiBvcmRlci5cbiAgICovXG4gIGZvckVhY2g6IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGN5KGN5UmVmKVxuICAgKiBUaGUgYGN5YCBwcm9wIGFsbG93cyBmb3IgZ2V0dGluZyBhIHJlZmVyZW5jZSB0byB0aGUgYGN5YCBDeXRvc2NhcGUgb2JqZWN0LCBlLmcuOlxuICAgKlxuICAgKiBgPEN5dG9zY2FwZUNvbXBvbmVudCBjeT17Y3kgPT4gKG15Q3lSZWYgPSBjeSl9IC8+YFxuICAgKi9cbiAgY3k6IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGhlYWRsZXNzXG4gICAqIFRoZSBgaGVhZGxlc3NgIHByb3BlciBhbGxvd3MgZm9yIHNldHRpbmcgd2hldGhlciB0aGUgQ3l0b3NjYXBlIGluc3RhbmNlIGlzIGhlYWRsZXNzLCBpLmUuXG4gICAqIG5vdCByZW5kZXJlZC4gIFRoaXMgdmFsdWUgY2FuIG5vdCBiZSBjaGFuZ2VkIGFmdGVyIGluaXRpYWxpc2F0aW9uIG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBoZWFkbGVzczogYm9vbCxcblxuICAvKipcbiAgICogc3R5bGVFbmFibGVkXG4gICAqIFRoZSBgc3R5bGVFbmFibGVkYCBmbGFnIGlzIHVzZWQgdG8gZW5hYmxlIHN0eWxlIGZ1bmN0aW9uYWxpdHkgaW4gYSBoZWFkbGVzcyBpbnN0YW5jZSAoaS5lLlxuICAgKiBgaGVhZGxlc3M6IHRydWUsIHN0eWxlRW5hYmxlZDogdHJ1ZWApLiAgRm9yIGEgcmVuZGVyZWQgaW5zdGFuY2UsIGRvIG5vdCBzZXQgdGhpcyB2YWx1ZS5cbiAgICovXG4gIHN0eWxlRW5hYmxlZDogYm9vbCxcblxuICAvKipcbiAgICogaGlkZUVkZ2VzT25WaWV3cG9ydFxuICAgKiBBIHJlbmRlcmluZyBoaW50IHRoYXQgc3BlY2lmaWVzLCBmb3IgcmVuZGVyZXJzIHdoaWNoIHN1cHBvcnQgdGhlIGhpbnQsIHdoZXRoZXIgZWRnZXMgc2hvdWxkXG4gICAqIGJlIGhpZGRlbiBkdXJpbmcgem9vbSBhbmQgcGFuIG9wZXJhdGlvbnMuXG4gICAqL1xuICBoaWRlRWRnZXNPblZpZXdwb3J0OiBib29sLFxuXG4gIC8qKlxuICAgKiB0ZXh0dXJlT25WaWV3cG9ydFxuICAgKiBBIHJlbmRlcmluZyBoaW50IHRoYXQgc3BlY2lmaWVzLCBmb3IgcmVuZGVyZXJzIHdoaWNoIHN1cHBvcnQgdGhlIGhpbnQsIHdoZXRoZXIgYSBwcmV2aWV3XG4gICAqIGJhc2VkIG9uIHRoZSBleGlzdGluZyBzY2VuZSBzaG91bGQgYmUgdXNlZCBpbiBwbGFjZSBvZiBidWlsZGluZyBhIG5ldyBzY2VuZS5cbiAgICovXG4gIHRleHR1cmVPblZpZXdwb3J0OiBib29sLFxuXG4gIC8qKlxuICAgKiBtb3Rpb25CbHVyXG4gICAqIEEgcmVuZGVyaW5nIGhpbnQgdGhhdCBzcGVjaWZpZXMsIGZvciByZW5kZXJlcnMgd2hpY2ggc3VwcG9ydCB0aGUgaGludCwgd2hldGhlciBhIG1vdGlvbiBibHVyXG4gICAqIGVmZmVjdCBzaG91bGQgYmUgYXBwbGllZC5cbiAgICovXG4gIG1vdGlvbkJsdXI6IGJvb2wsXG5cbiAgLyoqXG4gICAqIG1vdGlvbkJsdXJPcGFjaXR5XG4gICAqIEEgcmVuZGVyaW5nIGhpbnQgdGhhdCBzcGVjaWZpZXMsIGZvciByZW5kZXJlcnMgd2hpY2ggc3VwcG9ydCB0aGUgaGludCwgaG93IHN0cm9uZyB0aGUgbW90aW9uXG4gICAqIGJsdXIgZWZmZWN0IHNob3VsZCBiZS4gIFRoZSB2YWx1ZSByYW5nZXMgZnJvbSAwIHRvIDEsIHdpdGggbGFyZ2VyIHZhbHVlcyBpbmRpY2F0aW5nIGxhcmdlclxuICAgKiBzdHJlbmd0aC5cbiAgICovXG4gIG1vdGlvbkJsdXJPcGFjaXR5OiBudW1iZXIsXG5cbiAgLyoqXG4gICAqIHdoZWVsU2Vuc2l0aXZpdHlcbiAgICogQSByZW5kZXJpbmcgaGludCB0aGF0IHNwZWNpZmllcywgZm9yIHJlbmRlcmVycyB3aGljaCBzdXBwb3J0IHRoZSBoaW50LCBob3cgZmFzdCB3aGVlbCB6b29taW5nXG4gICAqIHNob3VsZCBiZS4gIFRoZSB2YWx1ZSBpcyBhIHBvc2l0aXZlIG11bHRpcGxpZXIuICBEbyBub3Qgc2V0IHRoaXMgdmFsdWUgdW5sZXNzIHlvdSBhcmUgdXNpbmdcbiAgICogdW5jb252ZW50aW9uYWwgaGFyZHdhcmUgYW5kIGNhbiBndWFyYW50ZWUgdGhhdCBhbGwgeW91ciB1c2VycyB3aWxsIHVzZSB0aGUgc2FtZSBoYXJkd2FyZS4gIFRoZVxuICAgKiBkZWZhdWx0IHZhbHVlIHdvcmtzIHdlbGwgZm9yIHN0YW5kYXJkIG1pY2Ugb24gY29tbW9uIG9wZXJhdGluZyBzeXN0ZW1zLiAgSWYgeW91IGNoYW5nZSB0aGlzXG4gICAqIHZhbHVlLCBpdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IHlvdSB3aWxsIGNyZWF0ZSBhIGJhZCB1c2VyIGV4cGVyaWVuY2UgZm9yIG1hbnkgb3IgbW9zdCBvZiB5b3VyXG4gICAqIHVzZXJzLlxuICAgKi9cbiAgd2hlZWxTZW5zaXRpdml0eTogbnVtYmVyLFxuXG4gIC8qKlxuICAgKiBwaXhlbFJhdGlvXG4gICAqIEEgcmVuZGVyaW5nIGhpbnQgdGhhdCBzcGVjaWZpZXMsIGZvciByZW5kZXJlcnMgd2hpY2ggc3VwcG9ydCB0aGUgaGludCwgdGhlIHBpeGVsIHJhdGlvIHRoYXRcbiAgICogc2hvdWxkIGJlIHVzZWQuICBNYXkgYmUgJ2F1dG8nIG9yIGEgcG9zaXRpdmUgbnVtYmVyLlxuICAgKi9cbiAgcGl4ZWxSYXRpbzogb25lT2ZUeXBlKFtzdHJpbmcsIG9iamVjdF0pLFxufTtcbiIsImNvbnN0IGVpdGhlcklzTmlsID0gKGEsIGIpID0+IGEgPT0gbnVsbCB8fCBiID09IG51bGw7XG5cbmV4cG9ydCBjb25zdCBoYXNoRGlmZiA9IChhLCBiKSA9PiB7XG4gIHJldHVybiBlaXRoZXJJc05pbChhLCBiKSB8fCBhLmhhc2goKSAhPT0gYi5oYXNoKCk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2hhbGxvd09iakRpZmYgPSAoYSwgYikgPT4ge1xuICBpZiAoZWl0aGVySXNOaWwoYSwgYikgJiYgIShhID09IG51bGwgJiYgYiA9PSBudWxsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGEgPT09IGIpIHtcbiAgICAvLyBjYW4ndCBkbyBhIGRpZmYgb24gdGhlIHNhbWUgb2JqXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gbm9uLW9iamVjdCB2YWx1ZXMgY2FuIGJlIGNvbXBhcmVkIHdpdGggdGhlIGVxdWFsaXR5IG9wZXJhdG9yXG4gIGlmICh0eXBlb2YgYSAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIGIgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGEgIT09IGI7XG4gIH1cblxuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuICBjb25zdCBtaXNtYXRjaGVzID0gKGtleSkgPT4gYVtrZXldICE9PSBiW2tleV07XG5cbiAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYUtleXMuc29tZShtaXNtYXRjaGVzKSB8fCBiS2V5cy5zb21lKG1pc21hdGNoZXMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuIiwiZXhwb3J0IGNvbnN0IGdldCA9IChvYmosIGtleSkgPT4gKG9iaiAhPSBudWxsID8gb2JqW2tleV0gOiBudWxsKTtcblxuZXhwb3J0IGNvbnN0IHRvSnNvbiA9IChvYmopID0+IG9iajtcblxuZXhwb3J0IGNvbnN0IGZvckVhY2ggPSAoYXJyLCBpdGVyYXRvcikgPT4gYXJyLmZvckVhY2goaXRlcmF0b3IpO1xuIiwiaW1wb3J0IHsgc2hhbGxvd09iakRpZmYgfSBmcm9tICcuL2RpZmYnO1xuaW1wb3J0IHsgZ2V0LCB0b0pzb24sIGZvckVhY2ggfSBmcm9tICcuL2pzb24nO1xuXG5leHBvcnQgY29uc3QgaWRlbnRpdHkgPSAoeCkgPT4geDtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRzID0gW1xuICB7IGRhdGE6IHsgaWQ6ICdhJywgbGFiZWw6ICdFeGFtcGxlIG5vZGUgQScgfSB9LFxuICB7IGRhdGE6IHsgaWQ6ICdiJywgbGFiZWw6ICdFeGFtcGxlIG5vZGUgQicgfSB9LFxuICB7IGRhdGE6IHsgaWQ6ICdlJywgc291cmNlOiAnYScsIHRhcmdldDogJ2InIH0gfSxcbl07XG5cbmV4cG9ydCBjb25zdCBzdHlsZXNoZWV0ID0gW1xuICB7XG4gICAgc2VsZWN0b3I6ICdub2RlJyxcbiAgICBzdHlsZToge1xuICAgICAgbGFiZWw6ICdkYXRhKGxhYmVsKScsXG4gICAgfSxcbiAgfSxcbl07XG5cbmV4cG9ydCBjb25zdCB6b29tID0gMTtcblxuZXhwb3J0IGNvbnN0IHBhbiA9IHtcbiAgeDogMCxcbiAgeTogMCxcbn07XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0cyA9IHtcbiAgZGlmZjogc2hhbGxvd09iakRpZmYsXG4gIGdldCxcbiAgdG9Kc29uLFxuICBmb3JFYWNoLFxuICBlbGVtZW50cyxcbiAgc3R5bGVzaGVldCxcbiAgem9vbSxcbiAgcGFuLFxufTtcbiIsImltcG9ydCB7IGdldCBhcyBhdEtleSB9IGZyb20gJy4vanNvbic7XG5pbXBvcnQgeyBzaGFsbG93T2JqRGlmZiB9IGZyb20gJy4vZGlmZic7XG5cbmNvbnN0IGlzRGlmZkF0S2V5ID0gKGpzb24xLCBqc29uMiwgZGlmZiwga2V5KSA9PlxuICBkaWZmKGF0S2V5KGpzb24xLCBrZXkpLCBhdEtleShqc29uMiwga2V5KSk7XG5cbmV4cG9ydCBjb25zdCBwYXRjaCA9IChjeSwganNvbjEsIGpzb24yLCBkaWZmLCB0b0pzb24sIGdldCwgZm9yRWFjaCkgPT4ge1xuICBjeS5iYXRjaCgoKSA9PiB7XG4gICAgLy8gVGhlIHNoYWxsb3cgb2JqZWN0IGRpZmYoKSBtdXN0IGRlZmVyIHRvIHBhdGNoRWxlbWVudHMoKSBhcyBpdCBtdXN0IGNvbXBhcmUgdGhlXG4gICAgLy8gZWxlbWVudHMgYXMgYW4gdW5vcmRlcmVkIHNldC4gIEEgY3VzdG9tIGRpZmYoKSwgd2l0aCBJbW11dGFibGUgZm9yIGV4YW1wbGUsXG4gICAgLy8gY291bGQganVzdCB1c2UgYW4gZXF1YWxpdHkgY2hlY2sgKD09PSkuXG4gICAgaWYgKFxuICAgICAgZGlmZiA9PT0gc2hhbGxvd09iakRpZmYgfHxcbiAgICAgIGlzRGlmZkF0S2V5KGpzb24xLCBqc29uMiwgZGlmZiwgJ2VsZW1lbnRzJylcbiAgICApIHtcbiAgICAgIHBhdGNoRWxlbWVudHMoXG4gICAgICAgIGN5LFxuICAgICAgICBhdEtleShqc29uMSwgJ2VsZW1lbnRzJyksXG4gICAgICAgIGF0S2V5KGpzb24yLCAnZWxlbWVudHMnKSxcbiAgICAgICAgdG9Kc29uLFxuICAgICAgICBnZXQsXG4gICAgICAgIGZvckVhY2gsXG4gICAgICAgIGRpZmZcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlmZkF0S2V5KGpzb24xLCBqc29uMiwgZGlmZiwgJ3N0eWxlc2hlZXQnKSkge1xuICAgICAgcGF0Y2hTdHlsZShcbiAgICAgICAgY3ksXG4gICAgICAgIGF0S2V5KGpzb24xLCAnc3R5bGVzaGVldCcpLFxuICAgICAgICBhdEtleShqc29uMiwgJ3N0eWxlc2hlZXQnKSxcbiAgICAgICAgdG9Kc29uXG4gICAgICApO1xuICAgIH1cblxuICAgIFtcbiAgICAgIC8vIHNpbXBsZSBrZXlzIHRoYXQgY2FuIGJlIHBhdGNoZWQgZGlyZWN0bHkgKGtleSBzYW1lIGFzIGZuIG5hbWUpXG4gICAgICAnem9vbScsXG4gICAgICAnbWluWm9vbScsXG4gICAgICAnbWF4Wm9vbScsXG4gICAgICAnem9vbWluZ0VuYWJsZWQnLFxuICAgICAgJ3VzZXJab29taW5nRW5hYmxlZCcsXG4gICAgICAncGFuJyxcbiAgICAgICdwYW5uaW5nRW5hYmxlZCcsXG4gICAgICAndXNlclBhbm5pbmdFbmFibGVkJyxcbiAgICAgICdib3hTZWxlY3Rpb25FbmFibGVkJyxcbiAgICAgICdhdXRvdW5ncmFiaWZ5JyxcbiAgICAgICdhdXRvbG9jaycsXG4gICAgICAnYXV0b3Vuc2VsZWN0aWZ5JyxcbiAgICBdLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGlzRGlmZkF0S2V5KGpzb24xLCBqc29uMiwgZGlmZiwga2V5KSkge1xuICAgICAgICBwYXRjaEpzb24oY3ksIGtleSwgYXRLZXkoanNvbjEsIGtleSksIGF0S2V5KGpzb24yLCBrZXkpLCB0b0pzb24pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBpZiAoaXNEaWZmQXRLZXkoanNvbjEsIGpzb24yLCBkaWZmLCAnbGF5b3V0JykpIHtcbiAgICBwYXRjaExheW91dChjeSwgYXRLZXkoanNvbjEsICdsYXlvdXQnKSwgYXRLZXkoanNvbjIsICdsYXlvdXQnKSwgdG9Kc29uKTtcbiAgfVxufTtcblxuY29uc3QgcGF0Y2hKc29uID0gKGN5LCBrZXksIHZhbDEsIHZhbDIsIHRvSnNvbikgPT4ge1xuICBjeVtrZXldKHRvSnNvbih2YWwyKSk7XG59O1xuXG5jb25zdCBwYXRjaExheW91dCA9IChjeSwgbGF5b3V0MSwgbGF5b3V0MiwgdG9Kc29uKSA9PiB7XG4gIGNvbnN0IGxheW91dE9wdHMgPSB0b0pzb24obGF5b3V0Mik7XG5cbiAgaWYgKGxheW91dE9wdHMgIT0gbnVsbCkge1xuICAgIGN5LmxheW91dChsYXlvdXRPcHRzKS5ydW4oKTtcbiAgfVxufTtcblxuY29uc3QgcGF0Y2hTdHlsZSA9IChjeSwgc3R5bGUxLCBzdHlsZTIsIHRvSnNvbikgPT4ge1xuICBjb25zdCBzdHlsZSA9IGN5LnN0eWxlKCk7XG5cbiAgaWYgKHN0eWxlID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdHlsZS5mcm9tSnNvbih0b0pzb24oc3R5bGUyKSkudXBkYXRlKCk7XG59O1xuXG5jb25zdCBwYXRjaEVsZW1lbnRzID0gKGN5LCBlbGVzMSwgZWxlczIsIHRvSnNvbiwgZ2V0LCBmb3JFYWNoLCBkaWZmKSA9PiB7XG4gIGNvbnN0IHRvQWRkID0gW107XG4gIGNvbnN0IHRvUm0gPSBjeS5jb2xsZWN0aW9uKCk7XG4gIGNvbnN0IHRvUGF0Y2ggPSBbXTtcbiAgY29uc3QgZWxlczFNYXAgPSB7fTtcbiAgY29uc3QgZWxlczJNYXAgPSB7fTtcbiAgY29uc3QgZWxlczFIYXNJZCA9IChpZCkgPT4gZWxlczFNYXBbaWRdICE9IG51bGw7XG4gIGNvbnN0IGVsZXMySGFzSWQgPSAoaWQpID0+IGVsZXMyTWFwW2lkXSAhPSBudWxsO1xuICBjb25zdCBnZXRFbGUxID0gKGlkKSA9PiBlbGVzMU1hcFtpZF07XG4gIGNvbnN0IGdldElkID0gKGVsZSkgPT4gZ2V0KGdldChlbGUsICdkYXRhJyksICdpZCcpO1xuXG4gIGZvckVhY2goZWxlczIsIChlbGUyKSA9PiB7XG4gICAgY29uc3QgaWQgPSBnZXRJZChlbGUyKTtcblxuICAgIGVsZXMyTWFwW2lkXSA9IGVsZTI7XG4gIH0pO1xuXG4gIGlmIChlbGVzMSAhPSBudWxsKSB7XG4gICAgZm9yRWFjaChlbGVzMSwgKGVsZTEpID0+IHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0SWQoZWxlMSk7XG5cbiAgICAgIGVsZXMxTWFwW2lkXSA9IGVsZTE7XG5cbiAgICAgIGlmICghZWxlczJIYXNJZChpZCkpIHtcbiAgICAgICAgdG9SbS5tZXJnZShjeS5nZXRFbGVtZW50QnlJZChpZCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZm9yRWFjaChlbGVzMiwgKGVsZTIpID0+IHtcbiAgICBjb25zdCBpZCA9IGdldElkKGVsZTIpO1xuICAgIGNvbnN0IGVsZTEgPSBnZXRFbGUxKGlkKTtcblxuICAgIGlmIChlbGVzMUhhc0lkKGlkKSkge1xuICAgICAgdG9QYXRjaC5wdXNoKHsgZWxlMSwgZWxlMiB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9BZGQucHVzaCh0b0pzb24oZWxlMikpO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHRvUm0ubGVuZ3RoID4gMCkge1xuICAgIGN5LnJlbW92ZSh0b1JtKTtcbiAgfVxuXG4gIGlmICh0b0FkZC5sZW5ndGggPiAwKSB7XG4gICAgY3kuYWRkKHRvQWRkKTtcbiAgfVxuXG4gIHRvUGF0Y2guZm9yRWFjaCgoeyBlbGUxLCBlbGUyIH0pID0+XG4gICAgcGF0Y2hFbGVtZW50KGN5LCBlbGUxLCBlbGUyLCB0b0pzb24sIGdldCwgZGlmZilcbiAgKTtcbn07XG5cbmNvbnN0IHBhdGNoRWxlbWVudCA9IChjeSwgZWxlMSwgZWxlMiwgdG9Kc29uLCBnZXQsIGRpZmYpID0+IHtcbiAgY29uc3QgaWQgPSBnZXQoZ2V0KGVsZTIsICdkYXRhJyksICdpZCcpO1xuICBjb25zdCBjeUVsZSA9IGN5LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgY29uc3QgcGF0Y2ggPSB7fTtcbiAgY29uc3QganNvbktleXMgPSBbXG4gICAgJ2RhdGEnLFxuICAgICdwb3NpdGlvbicsXG4gICAgJ3NlbGVjdGVkJyxcbiAgICAnc2VsZWN0YWJsZScsXG4gICAgJ2xvY2tlZCcsXG4gICAgJ2dyYWJiYWJsZScsXG4gICAgJ2NsYXNzZXMnLFxuICBdO1xuXG4gIGpzb25LZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IGRhdGEyID0gZ2V0KGVsZTIsIGtleSk7XG5cbiAgICBpZiAoZGlmZihkYXRhMiwgZ2V0KGVsZTEsIGtleSkpKSB7XG4gICAgICBwYXRjaFtrZXldID0gdG9Kc29uKGRhdGEyKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHNjcmF0Y2gyID0gZ2V0KGVsZTIsICdzY3JhdGNoJyk7XG4gIGlmIChkaWZmKHNjcmF0Y2gyLCBnZXQoZWxlMSwgJ3NjcmF0Y2gnKSkpIHtcbiAgICBjeUVsZS5zY3JhdGNoKHRvSnNvbihzY3JhdGNoMikpO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKHBhdGNoKS5sZW5ndGggPiAwKSB7XG4gICAgY3lFbGUuanNvbihwYXRjaCk7XG4gIH1cbn07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHlwZXMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGRlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cyc7XG5pbXBvcnQgQ3l0b3NjYXBlIGZyb20gJ2N5dG9zY2FwZSc7XG5pbXBvcnQgeyBwYXRjaCB9IGZyb20gJy4vcGF0Y2gnO1xuXG4vKipcbiAqIFRoZSBgQ3l0b3NjYXBlQ29tcG9uZW50YCBpcyBhIFJlYWN0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBmb3IgdGhlIGRlY2xhcmF0aXZlIGNyZWF0aW9uXG4gKiBhbmQgbW9kaWZpY2F0aW9uIG9mIGEgQ3l0b3NjYXBlIGluc3RhbmNlLCBhIGdyYXBoIHZpc3VhbGlzYXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN5dG9zY2FwZUNvbXBvbmVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcFR5cGVzKCkge1xuICAgIHJldHVybiB0eXBlcztcbiAgfVxuXG4gIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BzKCkge1xuICAgIHJldHVybiBkZWZhdWx0cztcbiAgfVxuXG4gIHN0YXRpYyBub3JtYWxpemVFbGVtZW50cyhlbGVtZW50cykge1xuICAgIGNvbnN0IGlzQXJyYXkgPSBlbGVtZW50cy5sZW5ndGggIT0gbnVsbDtcblxuICAgIGlmIChpc0FycmF5KSB7XG4gICAgICByZXR1cm4gZWxlbWVudHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB7IG5vZGVzLCBlZGdlcyB9ID0gZWxlbWVudHM7XG5cbiAgICAgIGlmIChub2RlcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVzID0gW107XG4gICAgICB9XG5cbiAgICAgIGlmIChlZGdlcyA9PSBudWxsKSB7XG4gICAgICAgIGVkZ2VzID0gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2Rlcy5jb25jYXQoZWRnZXMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuZGlzcGxheU5hbWUgPSAnQ3l0b3NjYXBlQ29tcG9uZW50JztcbiAgICB0aGlzLmNvbnRhaW5lclJlZiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb250YWluZXJSZWYuY3VycmVudDtcblxuICAgIGNvbnN0IHtcbiAgICAgIGdsb2JhbCxcbiAgICAgIGhlYWRsZXNzLFxuICAgICAgc3R5bGVFbmFibGVkLFxuICAgICAgaGlkZUVkZ2VzT25WaWV3cG9ydCxcbiAgICAgIHRleHR1cmVPblZpZXdwb3J0LFxuICAgICAgbW90aW9uQmx1cixcbiAgICAgIG1vdGlvbkJsdXJPcGFjaXR5LFxuICAgICAgd2hlZWxTZW5zaXRpdml0eSxcbiAgICAgIHBpeGVsUmF0aW8sXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBjb25zdCBjeSA9ICh0aGlzLl9jeSA9IG5ldyBDeXRvc2NhcGUoe1xuICAgICAgY29udGFpbmVyLFxuICAgICAgaGVhZGxlc3MsXG4gICAgICBzdHlsZUVuYWJsZWQsXG4gICAgICBoaWRlRWRnZXNPblZpZXdwb3J0LFxuICAgICAgdGV4dHVyZU9uVmlld3BvcnQsXG4gICAgICBtb3Rpb25CbHVyLFxuICAgICAgbW90aW9uQmx1ck9wYWNpdHksXG4gICAgICB3aGVlbFNlbnNpdGl2aXR5LFxuICAgICAgcGl4ZWxSYXRpbyxcbiAgICB9KSk7XG5cbiAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICB3aW5kb3dbZ2xvYmFsXSA9IGN5O1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQ3l0b3NjYXBlKG51bGwsIHRoaXMucHJvcHMpO1xuICB9XG5cbiAgdXBkYXRlQ3l0b3NjYXBlKHByZXZQcm9wcywgbmV3UHJvcHMpIHtcbiAgICBjb25zdCBjeSA9IHRoaXMuX2N5O1xuICAgIGNvbnN0IHsgZGlmZiwgdG9Kc29uLCBnZXQsIGZvckVhY2ggfSA9IG5ld1Byb3BzO1xuXG4gICAgcGF0Y2goY3ksIHByZXZQcm9wcywgbmV3UHJvcHMsIGRpZmYsIHRvSnNvbiwgZ2V0LCBmb3JFYWNoKTtcblxuICAgIGlmIChuZXdQcm9wcy5jeSAhPSBudWxsKSB7XG4gICAgICBuZXdQcm9wcy5jeShjeSk7XG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgIHRoaXMudXBkYXRlQ3l0b3NjYXBlKHByZXZQcm9wcywgdGhpcy5wcm9wcyk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLl9jeS5kZXN0cm95KCk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBpZCwgY2xhc3NOYW1lLCBzdHlsZSB9ID0gdGhpcy5wcm9wcztcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCdkaXYnLCB7XG4gICAgICByZWY6IHRoaXMuY29udGFpbmVyUmVmLFxuICAgICAgaWQsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBzdHlsZSxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBjb25zdCBSZWFjdFJlZHV4Q29udGV4dCA9IC8qI19fUFVSRV9fKi9jcmVhdGVDb250ZXh0KG51bGwpO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWFjdFJlZHV4Q29udGV4dC5kaXNwbGF5TmFtZSA9ICdSZWFjdFJlZHV4Jztcbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVhY3RSZWR1eENvbnRleHQ7IiwiaW1wb3J0IFJlYWN0LCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBSZWFjdFJlZHV4Q29udGV4dCB9IGZyb20gJy4vQ29udGV4dCc7XG5pbXBvcnQgeyBjcmVhdGVTdWJzY3JpcHRpb24gfSBmcm9tICcuLi91dGlscy9TdWJzY3JpcHRpb24nO1xuaW1wb3J0IHsgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCB9IGZyb20gJy4uL3V0aWxzL3VzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QnO1xuXG5mdW5jdGlvbiBQcm92aWRlcih7XG4gIHN0b3JlLFxuICBjb250ZXh0LFxuICBjaGlsZHJlbixcbiAgc2VydmVyU3RhdGVcbn0pIHtcbiAgY29uc3QgY29udGV4dFZhbHVlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gY3JlYXRlU3Vic2NyaXB0aW9uKHN0b3JlKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RvcmUsXG4gICAgICBzdWJzY3JpcHRpb24sXG4gICAgICBnZXRTZXJ2ZXJTdGF0ZTogc2VydmVyU3RhdGUgPyAoKSA9PiBzZXJ2ZXJTdGF0ZSA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH0sIFtzdG9yZSwgc2VydmVyU3RhdGVdKTtcbiAgY29uc3QgcHJldmlvdXNTdGF0ZSA9IHVzZU1lbW8oKCkgPT4gc3RvcmUuZ2V0U3RhdGUoKSwgW3N0b3JlXSk7XG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHN1YnNjcmlwdGlvblxuICAgIH0gPSBjb250ZXh0VmFsdWU7XG4gICAgc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UgPSBzdWJzY3JpcHRpb24ubm90aWZ5TmVzdGVkU3VicztcbiAgICBzdWJzY3JpcHRpb24udHJ5U3Vic2NyaWJlKCk7XG5cbiAgICBpZiAocHJldmlvdXNTdGF0ZSAhPT0gc3RvcmUuZ2V0U3RhdGUoKSkge1xuICAgICAgc3Vic2NyaXB0aW9uLm5vdGlmeU5lc3RlZFN1YnMoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgc3Vic2NyaXB0aW9uLnRyeVVuc3Vic2NyaWJlKCk7XG4gICAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICB9LCBbY29udGV4dFZhbHVlLCBwcmV2aW91c1N0YXRlXSk7XG4gIGNvbnN0IENvbnRleHQgPSBjb250ZXh0IHx8IFJlYWN0UmVkdXhDb250ZXh0OyAvLyBAdHMtaWdub3JlICdBbnlBY3Rpb24nIGlzIGFzc2lnbmFibGUgdG8gdGhlIGNvbnN0cmFpbnQgb2YgdHlwZSAnQScsIGJ1dCAnQScgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBkaWZmZXJlbnQgc3VidHlwZVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGNvbnRleHRWYWx1ZVxuICB9LCBjaGlsZHJlbik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFByb3ZpZGVyOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlXCI7XG5jb25zdCBfZXhjbHVkZWQgPSBbXCJyZWFjdFJlZHV4Rm9yd2FyZGVkUmVmXCJdO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYywgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG5pbXBvcnQgaG9pc3RTdGF0aWNzIGZyb20gJ2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzJztcbmltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0LCB1c2VNZW1vLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpc1ZhbGlkRWxlbWVudFR5cGUsIGlzQ29udGV4dENvbnN1bWVyIH0gZnJvbSAncmVhY3QtaXMnO1xuaW1wb3J0IGRlZmF1bHRTZWxlY3RvckZhY3RvcnkgZnJvbSAnLi4vY29ubmVjdC9zZWxlY3RvckZhY3RvcnknO1xuaW1wb3J0IHsgbWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yeSB9IGZyb20gJy4uL2Nvbm5lY3QvbWFwRGlzcGF0Y2hUb1Byb3BzJztcbmltcG9ydCB7IG1hcFN0YXRlVG9Qcm9wc0ZhY3RvcnkgfSBmcm9tICcuLi9jb25uZWN0L21hcFN0YXRlVG9Qcm9wcyc7XG5pbXBvcnQgeyBtZXJnZVByb3BzRmFjdG9yeSB9IGZyb20gJy4uL2Nvbm5lY3QvbWVyZ2VQcm9wcyc7XG5pbXBvcnQgeyBjcmVhdGVTdWJzY3JpcHRpb24gfSBmcm9tICcuLi91dGlscy9TdWJzY3JpcHRpb24nO1xuaW1wb3J0IHsgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCB9IGZyb20gJy4uL3V0aWxzL3VzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QnO1xuaW1wb3J0IHNoYWxsb3dFcXVhbCBmcm9tICcuLi91dGlscy9zaGFsbG93RXF1YWwnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi4vdXRpbHMvd2FybmluZyc7XG5pbXBvcnQgeyBSZWFjdFJlZHV4Q29udGV4dCB9IGZyb20gJy4vQ29udGV4dCc7XG5pbXBvcnQgeyBub3RJbml0aWFsaXplZCB9IGZyb20gJy4uL3V0aWxzL3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbmxldCB1c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IG5vdEluaXRpYWxpemVkO1xuZXhwb3J0IGNvbnN0IGluaXRpYWxpemVDb25uZWN0ID0gZm4gPT4ge1xuICB1c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IGZuO1xufTsgLy8gRGVmaW5lIHNvbWUgY29uc3RhbnQgYXJyYXlzIGp1c3QgdG8gYXZvaWQgcmUtY3JlYXRpbmcgdGhlc2VcblxuY29uc3QgRU1QVFlfQVJSQVkgPSBbbnVsbCwgMF07XG5jb25zdCBOT19TVUJTQ1JJUFRJT05fQVJSQVkgPSBbbnVsbCwgbnVsbF07IC8vIEF0dGVtcHRzIHRvIHN0cmluZ2lmeSB3aGF0ZXZlciBub3QtcmVhbGx5LWEtY29tcG9uZW50IHZhbHVlIHdlIHdlcmUgZ2l2ZW5cbi8vIGZvciBsb2dnaW5nIGluIGFuIGVycm9yIG1lc3NhZ2VcblxuY29uc3Qgc3RyaW5naWZ5Q29tcG9uZW50ID0gQ29tcCA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KENvbXApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gU3RyaW5nKENvbXApO1xuICB9XG59O1xuXG4vLyBUaGlzIGlzIFwianVzdFwiIGEgYHVzZUxheW91dEVmZmVjdGAsIGJ1dCB3aXRoIHR3byBtb2RpZmljYXRpb25zOlxuLy8gLSB3ZSBuZWVkIHRvIGZhbGwgYmFjayB0byBgdXNlRWZmZWN0YCBpbiBTU1IgdG8gYXZvaWQgYW5ub3lpbmcgd2FybmluZ3Ncbi8vIC0gd2UgZXh0cmFjdCB0aGlzIHRvIGEgc2VwYXJhdGUgZnVuY3Rpb24gdG8gYXZvaWQgY2xvc2luZyBvdmVyIHZhbHVlc1xuLy8gICBhbmQgY2F1c2luZyBtZW1vcnkgbGVha3NcbmZ1bmN0aW9uIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3RXaXRoQXJncyhlZmZlY3RGdW5jLCBlZmZlY3RBcmdzLCBkZXBlbmRlbmNpZXMpIHtcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiBlZmZlY3RGdW5jKC4uLmVmZmVjdEFyZ3MpLCBkZXBlbmRlbmNpZXMpO1xufSAvLyBFZmZlY3QgY2FsbGJhY2ssIGV4dHJhY3RlZDogYXNzaWduIHRoZSBsYXRlc3QgcHJvcHMgdmFsdWVzIHRvIHJlZnMgZm9yIGxhdGVyIHVzYWdlXG5cblxuZnVuY3Rpb24gY2FwdHVyZVdyYXBwZXJQcm9wcyhsYXN0V3JhcHBlclByb3BzLCBsYXN0Q2hpbGRQcm9wcywgcmVuZGVySXNTY2hlZHVsZWQsIHdyYXBwZXJQcm9wcywgLy8gYWN0dWFsQ2hpbGRQcm9wczogdW5rbm93bixcbmNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUsIG5vdGlmeU5lc3RlZFN1YnMpIHtcbiAgLy8gV2Ugd2FudCB0byBjYXB0dXJlIHRoZSB3cmFwcGVyIHByb3BzIGFuZCBjaGlsZCBwcm9wcyB3ZSB1c2VkIGZvciBsYXRlciBjb21wYXJpc29uc1xuICBsYXN0V3JhcHBlclByb3BzLmN1cnJlbnQgPSB3cmFwcGVyUHJvcHM7XG4gIHJlbmRlcklzU2NoZWR1bGVkLmN1cnJlbnQgPSBmYWxzZTsgLy8gSWYgdGhlIHJlbmRlciB3YXMgZnJvbSBhIHN0b3JlIHVwZGF0ZSwgY2xlYXIgb3V0IHRoYXQgcmVmZXJlbmNlIGFuZCBjYXNjYWRlIHRoZSBzdWJzY3JpYmVyIHVwZGF0ZVxuXG4gIGlmIChjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQpIHtcbiAgICBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQgPSBudWxsO1xuICAgIG5vdGlmeU5lc3RlZFN1YnMoKTtcbiAgfVxufSAvLyBFZmZlY3QgY2FsbGJhY2ssIGV4dHJhY3RlZDogc3Vic2NyaWJlIHRvIHRoZSBSZWR1eCBzdG9yZSBvciBuZWFyZXN0IGNvbm5lY3RlZCBhbmNlc3Rvcixcbi8vIGNoZWNrIGZvciB1cGRhdGVzIGFmdGVyIGRpc3BhdGNoZWQgYWN0aW9ucywgYW5kIHRyaWdnZXIgcmUtcmVuZGVycy5cblxuXG5mdW5jdGlvbiBzdWJzY3JpYmVVcGRhdGVzKHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcywgc3RvcmUsIHN1YnNjcmlwdGlvbiwgY2hpbGRQcm9wc1NlbGVjdG9yLCBsYXN0V3JhcHBlclByb3BzLCBsYXN0Q2hpbGRQcm9wcywgcmVuZGVySXNTY2hlZHVsZWQsIGlzTW91bnRlZCwgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSwgbm90aWZ5TmVzdGVkU3VicywgLy8gZm9yY2VDb21wb25lbnRVcGRhdGVEaXNwYXRjaDogUmVhY3QuRGlzcGF0Y2g8YW55PixcbmFkZGl0aW9uYWxTdWJzY3JpYmVMaXN0ZW5lcikge1xuICAvLyBJZiB3ZSdyZSBub3Qgc3Vic2NyaWJlZCB0byB0aGUgc3RvcmUsIG5vdGhpbmcgdG8gZG8gaGVyZVxuICBpZiAoIXNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcykgcmV0dXJuICgpID0+IHt9OyAvLyBDYXB0dXJlIHZhbHVlcyBmb3IgY2hlY2tpbmcgaWYgYW5kIHdoZW4gdGhpcyBjb21wb25lbnQgdW5tb3VudHNcblxuICBsZXQgZGlkVW5zdWJzY3JpYmUgPSBmYWxzZTtcbiAgbGV0IGxhc3RUaHJvd25FcnJvciA9IG51bGw7IC8vIFdlJ2xsIHJ1biB0aGlzIGNhbGxiYWNrIGV2ZXJ5IHRpbWUgYSBzdG9yZSBzdWJzY3JpcHRpb24gdXBkYXRlIHByb3BhZ2F0ZXMgdG8gdGhpcyBjb21wb25lbnRcblxuICBjb25zdCBjaGVja0ZvclVwZGF0ZXMgPSAoKSA9PiB7XG4gICAgaWYgKGRpZFVuc3Vic2NyaWJlIHx8ICFpc01vdW50ZWQuY3VycmVudCkge1xuICAgICAgLy8gRG9uJ3QgcnVuIHN0YWxlIGxpc3RlbmVycy5cbiAgICAgIC8vIFJlZHV4IGRvZXNuJ3QgZ3VhcmFudGVlIHVuc3Vic2NyaXB0aW9ucyBoYXBwZW4gdW50aWwgbmV4dCBkaXNwYXRjaC5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFRPRE8gV2UncmUgY3VycmVudGx5IGNhbGxpbmcgZ2V0U3RhdGUgb3Vyc2VsdmVzIGhlcmUsIHJhdGhlciB0aGFuIGxldHRpbmcgYHVTRVNgIGRvIGl0XG5cblxuICAgIGNvbnN0IGxhdGVzdFN0b3JlU3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGxldCBuZXdDaGlsZFByb3BzLCBlcnJvcjtcblxuICAgIHRyeSB7XG4gICAgICAvLyBBY3R1YWxseSBydW4gdGhlIHNlbGVjdG9yIHdpdGggdGhlIG1vc3QgcmVjZW50IHN0b3JlIHN0YXRlIGFuZCB3cmFwcGVyIHByb3BzXG4gICAgICAvLyB0byBkZXRlcm1pbmUgd2hhdCB0aGUgY2hpbGQgcHJvcHMgc2hvdWxkIGJlXG4gICAgICBuZXdDaGlsZFByb3BzID0gY2hpbGRQcm9wc1NlbGVjdG9yKGxhdGVzdFN0b3JlU3RhdGUsIGxhc3RXcmFwcGVyUHJvcHMuY3VycmVudCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3IgPSBlO1xuICAgICAgbGFzdFRocm93bkVycm9yID0gZTtcbiAgICB9XG5cbiAgICBpZiAoIWVycm9yKSB7XG4gICAgICBsYXN0VGhyb3duRXJyb3IgPSBudWxsO1xuICAgIH0gLy8gSWYgdGhlIGNoaWxkIHByb3BzIGhhdmVuJ3QgY2hhbmdlZCwgbm90aGluZyB0byBkbyBoZXJlIC0gY2FzY2FkZSB0aGUgc3Vic2NyaXB0aW9uIHVwZGF0ZVxuXG5cbiAgICBpZiAobmV3Q2hpbGRQcm9wcyA9PT0gbGFzdENoaWxkUHJvcHMuY3VycmVudCkge1xuICAgICAgaWYgKCFyZW5kZXJJc1NjaGVkdWxlZC5jdXJyZW50KSB7XG4gICAgICAgIG5vdGlmeU5lc3RlZFN1YnMoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2F2ZSByZWZlcmVuY2VzIHRvIHRoZSBuZXcgY2hpbGQgcHJvcHMuICBOb3RlIHRoYXQgd2UgdHJhY2sgdGhlIFwiY2hpbGQgcHJvcHMgZnJvbSBzdG9yZSB1cGRhdGVcIlxuICAgICAgLy8gYXMgYSByZWYgaW5zdGVhZCBvZiBhIHVzZVN0YXRlL3VzZVJlZHVjZXIgYmVjYXVzZSB3ZSBuZWVkIGEgd2F5IHRvIGRldGVybWluZSBpZiB0aGF0IHZhbHVlIGhhc1xuICAgICAgLy8gYmVlbiBwcm9jZXNzZWQuICBJZiB0aGlzIHdlbnQgaW50byB1c2VTdGF0ZS91c2VSZWR1Y2VyLCB3ZSBjb3VsZG4ndCBjbGVhciBvdXQgdGhlIHZhbHVlIHdpdGhvdXRcbiAgICAgIC8vIGZvcmNpbmcgYW5vdGhlciByZS1yZW5kZXIsIHdoaWNoIHdlIGRvbid0IHdhbnQuXG4gICAgICBsYXN0Q2hpbGRQcm9wcy5jdXJyZW50ID0gbmV3Q2hpbGRQcm9wcztcbiAgICAgIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudCA9IG5ld0NoaWxkUHJvcHM7XG4gICAgICByZW5kZXJJc1NjaGVkdWxlZC5jdXJyZW50ID0gdHJ1ZTsgLy8gVE9ETyBUaGlzIGlzIGhhY2t5IGFuZCBub3QgaG93IGB1U0VTYCBpcyBtZWFudCB0byBiZSB1c2VkXG4gICAgICAvLyBUcmlnZ2VyIHRoZSBSZWFjdCBgdXNlU3luY0V4dGVybmFsU3RvcmVgIHN1YnNjcmliZXJcblxuICAgICAgYWRkaXRpb25hbFN1YnNjcmliZUxpc3RlbmVyKCk7XG4gICAgfVxuICB9OyAvLyBBY3R1YWxseSBzdWJzY3JpYmUgdG8gdGhlIG5lYXJlc3QgY29ubmVjdGVkIGFuY2VzdG9yIChvciBzdG9yZSlcblxuXG4gIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlID0gY2hlY2tGb3JVcGRhdGVzO1xuICBzdWJzY3JpcHRpb24udHJ5U3Vic2NyaWJlKCk7IC8vIFB1bGwgZGF0YSBmcm9tIHRoZSBzdG9yZSBhZnRlciBmaXJzdCByZW5kZXIgaW4gY2FzZSB0aGUgc3RvcmUgaGFzXG4gIC8vIGNoYW5nZWQgc2luY2Ugd2UgYmVnYW4uXG5cbiAgY2hlY2tGb3JVcGRhdGVzKCk7XG5cbiAgY29uc3QgdW5zdWJzY3JpYmVXcmFwcGVyID0gKCkgPT4ge1xuICAgIGRpZFVuc3Vic2NyaWJlID0gdHJ1ZTtcbiAgICBzdWJzY3JpcHRpb24udHJ5VW5zdWJzY3JpYmUoKTtcbiAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IG51bGw7XG5cbiAgICBpZiAobGFzdFRocm93bkVycm9yKSB7XG4gICAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgd2UgY2F1Z2h0IGFuIGVycm9yIGR1ZSB0byBhIGJhZCBtYXBTdGF0ZSBmdW5jdGlvbiwgYnV0IHRoZVxuICAgICAgLy8gcGFyZW50IHJlLXJlbmRlcmVkIHdpdGhvdXQgdGhpcyBjb21wb25lbnQgYW5kIHdlJ3JlIGFib3V0IHRvIHVubW91bnQuXG4gICAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4gYXMgbG9uZyBhcyB3ZSBkbyB0b3AtZG93biBzdWJzY3JpcHRpb25zIGNvcnJlY3RseSwgYnV0XG4gICAgICAvLyBpZiB3ZSBldmVyIGRvIHRob3NlIHdyb25nLCB0aGlzIHRocm93IHdpbGwgc3VyZmFjZSB0aGUgZXJyb3IgaW4gb3VyIHRlc3RzLlxuICAgICAgLy8gSW4gdGhhdCBjYXNlLCB0aHJvdyB0aGUgZXJyb3IgZnJvbSBoZXJlIHNvIGl0IGRvZXNuJ3QgZ2V0IGxvc3QuXG4gICAgICB0aHJvdyBsYXN0VGhyb3duRXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB1bnN1YnNjcmliZVdyYXBwZXI7XG59IC8vIFJlZHVjZXIgaW5pdGlhbCBzdGF0ZSBjcmVhdGlvbiBmb3Igb3VyIHVwZGF0ZSByZWR1Y2VyXG5cblxuY29uc3QgaW5pdFN0YXRlVXBkYXRlcyA9ICgpID0+IEVNUFRZX0FSUkFZO1xuXG5mdW5jdGlvbiBzdHJpY3RFcXVhbChhLCBiKSB7XG4gIHJldHVybiBhID09PSBiO1xufVxuLyoqXHJcbiAqIEluZmVycyB0aGUgdHlwZSBvZiBwcm9wcyB0aGF0IGEgY29ubmVjdG9yIHdpbGwgaW5qZWN0IGludG8gYSBjb21wb25lbnQuXHJcbiAqL1xuXG5cbmxldCBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRQdXJlT3B0aW9uID0gZmFsc2U7XG4vKipcclxuICogQ29ubmVjdHMgYSBSZWFjdCBjb21wb25lbnQgdG8gYSBSZWR1eCBzdG9yZS5cclxuICpcclxuICogLSBXaXRob3V0IGFyZ3VtZW50cywganVzdCB3cmFwcyB0aGUgY29tcG9uZW50LCB3aXRob3V0IGNoYW5naW5nIHRoZSBiZWhhdmlvciAvIHByb3BzXHJcbiAqXHJcbiAqIC0gSWYgMiBwYXJhbXMgYXJlIHBhc3NlZCAoM3JkIHBhcmFtLCBtZXJnZVByb3BzLCBpcyBza2lwcGVkKSwgZGVmYXVsdCBiZWhhdmlvclxyXG4gKiBpcyB0byBvdmVycmlkZSBvd25Qcm9wcyAoYXMgc3RhdGVkIGluIHRoZSBkb2NzKSwgc28gd2hhdCByZW1haW5zIGlzIGV2ZXJ5dGhpbmcgdGhhdCdzXHJcbiAqIG5vdCBhIHN0YXRlIG9yIGRpc3BhdGNoIHByb3BcclxuICpcclxuICogLSBXaGVuIDNyZCBwYXJhbSBpcyBwYXNzZWQsIHdlIGRvbid0IGtub3cgaWYgb3duUHJvcHMgcHJvcGFnYXRlIGFuZCB3aGV0aGVyIHRoZXlcclxuICogc2hvdWxkIGJlIHZhbGlkIGNvbXBvbmVudCBwcm9wcywgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIG1lcmdlUHJvcHMgaW1wbGVtZW50YXRpb24uXHJcbiAqIEFzIHN1Y2gsIGl0IGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZXh0ZW5kIG93blByb3BzIGludGVyZmFjZSBmcm9tIHN0YXRlIG9yXHJcbiAqIGRpc3BhdGNoIHByb3BzIG9yIGJvdGggd2hlbiBhcHBsaWNhYmxlXHJcbiAqXHJcbiAqIEBwYXJhbSBtYXBTdGF0ZVRvUHJvcHMgQSBmdW5jdGlvbiB0aGF0IGV4dHJhY3RzIHZhbHVlcyBmcm9tIHN0YXRlXHJcbiAqIEBwYXJhbSBtYXBEaXNwYXRjaFRvUHJvcHMgU2V0dXAgZm9yIGRpc3BhdGNoaW5nIGFjdGlvbnNcclxuICogQHBhcmFtIG1lcmdlUHJvcHMgT3B0aW9uYWwgY2FsbGJhY2sgdG8gbWVyZ2Ugc3RhdGUgYW5kIGRpc3BhdGNoIHByb3BzIHRvZ2V0aGVyXHJcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSBjb25uZWN0aW9uXHJcbiAqXHJcbiAqL1xuXG5mdW5jdGlvbiBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzLCB7XG4gIC8vIFRoZSBgcHVyZWAgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQsIHNvIFRTIGRvZXNuJ3QgbGlrZSB1cyBkZXN0cnVjdHVyaW5nIHRoaXMgdG8gY2hlY2sgaXRzIGV4aXN0ZW5jZS5cbiAgLy8gQHRzLWlnbm9yZVxuICBwdXJlLFxuICBhcmVTdGF0ZXNFcXVhbCA9IHN0cmljdEVxdWFsLFxuICBhcmVPd25Qcm9wc0VxdWFsID0gc2hhbGxvd0VxdWFsLFxuICBhcmVTdGF0ZVByb3BzRXF1YWwgPSBzaGFsbG93RXF1YWwsXG4gIGFyZU1lcmdlZFByb3BzRXF1YWwgPSBzaGFsbG93RXF1YWwsXG4gIC8vIHVzZSBSZWFjdCdzIGZvcndhcmRSZWYgdG8gZXhwb3NlIGEgcmVmIG9mIHRoZSB3cmFwcGVkIGNvbXBvbmVudFxuICBmb3J3YXJkUmVmID0gZmFsc2UsXG4gIC8vIHRoZSBjb250ZXh0IGNvbnN1bWVyIHRvIHVzZVxuICBjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHRcbn0gPSB7fSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChwdXJlICE9PSB1bmRlZmluZWQgJiYgIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZFB1cmVPcHRpb24pIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZFB1cmVPcHRpb24gPSB0cnVlO1xuICAgICAgd2FybmluZygnVGhlIGBwdXJlYCBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZC4gYGNvbm5lY3RgIGlzIG5vdyBhbHdheXMgYSBcInB1cmUvbWVtb2l6ZWRcIiBjb21wb25lbnQnKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBDb250ZXh0ID0gY29udGV4dDtcbiAgY29uc3QgaW5pdE1hcFN0YXRlVG9Qcm9wcyA9IG1hcFN0YXRlVG9Qcm9wc0ZhY3RvcnkobWFwU3RhdGVUb1Byb3BzKTtcbiAgY29uc3QgaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcnkobWFwRGlzcGF0Y2hUb1Byb3BzKTtcbiAgY29uc3QgaW5pdE1lcmdlUHJvcHMgPSBtZXJnZVByb3BzRmFjdG9yeShtZXJnZVByb3BzKTtcbiAgY29uc3Qgc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzID0gQm9vbGVhbihtYXBTdGF0ZVRvUHJvcHMpO1xuXG4gIGNvbnN0IHdyYXBXaXRoQ29ubmVjdCA9IFdyYXBwZWRDb21wb25lbnQgPT4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFpc1ZhbGlkRWxlbWVudFR5cGUoV3JhcHBlZENvbXBvbmVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgWW91IG11c3QgcGFzcyBhIGNvbXBvbmVudCB0byB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgYnkgY29ubmVjdC4gSW5zdGVhZCByZWNlaXZlZCAke3N0cmluZ2lmeUNvbXBvbmVudChXcmFwcGVkQ29tcG9uZW50KX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCB3cmFwcGVkQ29tcG9uZW50TmFtZSA9IFdyYXBwZWRDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgV3JhcHBlZENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnO1xuICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gYENvbm5lY3QoJHt3cmFwcGVkQ29tcG9uZW50TmFtZX0pYDtcbiAgICBjb25zdCBzZWxlY3RvckZhY3RvcnlPcHRpb25zID0ge1xuICAgICAgc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzLFxuICAgICAgZGlzcGxheU5hbWUsXG4gICAgICB3cmFwcGVkQ29tcG9uZW50TmFtZSxcbiAgICAgIFdyYXBwZWRDb21wb25lbnQsXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBpbml0TWFwU3RhdGVUb1Byb3BzLFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyxcbiAgICAgIGluaXRNZXJnZVByb3BzLFxuICAgICAgYXJlU3RhdGVzRXF1YWwsXG4gICAgICBhcmVTdGF0ZVByb3BzRXF1YWwsXG4gICAgICBhcmVPd25Qcm9wc0VxdWFsLFxuICAgICAgYXJlTWVyZ2VkUHJvcHNFcXVhbFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBDb25uZWN0RnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgIGNvbnN0IFtwcm9wc0NvbnRleHQsIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWYsIHdyYXBwZXJQcm9wc10gPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgLy8gRGlzdGluZ3Vpc2ggYmV0d2VlbiBhY3R1YWwgXCJkYXRhXCIgcHJvcHMgdGhhdCB3ZXJlIHBhc3NlZCB0byB0aGUgd3JhcHBlciBjb21wb25lbnQsXG4gICAgICAgIC8vIGFuZCB2YWx1ZXMgbmVlZGVkIHRvIGNvbnRyb2wgYmVoYXZpb3IgKGZvcndhcmRlZCByZWZzLCBhbHRlcm5hdGUgY29udGV4dCBpbnN0YW5jZXMpLlxuICAgICAgICAvLyBUbyBtYWludGFpbiB0aGUgd3JhcHBlclByb3BzIG9iamVjdCByZWZlcmVuY2UsIG1lbW9pemUgdGhpcyBkZXN0cnVjdHVyaW5nLlxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgcmVhY3RSZWR1eEZvcndhcmRlZFJlZlxuICAgICAgICB9ID0gcHJvcHMsXG4gICAgICAgICAgICAgIHdyYXBwZXJQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHByb3BzLCBfZXhjbHVkZWQpO1xuXG4gICAgICAgIHJldHVybiBbcHJvcHMuY29udGV4dCwgcmVhY3RSZWR1eEZvcndhcmRlZFJlZiwgd3JhcHBlclByb3BzXTtcbiAgICAgIH0sIFtwcm9wc10pO1xuICAgICAgY29uc3QgQ29udGV4dFRvVXNlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIC8vIFVzZXJzIG1heSBvcHRpb25hbGx5IHBhc3MgaW4gYSBjdXN0b20gY29udGV4dCBpbnN0YW5jZSB0byB1c2UgaW5zdGVhZCBvZiBvdXIgUmVhY3RSZWR1eENvbnRleHQuXG4gICAgICAgIC8vIE1lbW9pemUgdGhlIGNoZWNrIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBjb250ZXh0IGluc3RhbmNlIHdlIHNob3VsZCB1c2UuXG4gICAgICAgIHJldHVybiBwcm9wc0NvbnRleHQgJiYgcHJvcHNDb250ZXh0LkNvbnN1bWVyICYmIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaXNDb250ZXh0Q29uc3VtZXIoIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KHByb3BzQ29udGV4dC5Db25zdW1lciwgbnVsbCkpID8gcHJvcHNDb250ZXh0IDogQ29udGV4dDtcbiAgICAgIH0sIFtwcm9wc0NvbnRleHQsIENvbnRleHRdKTsgLy8gUmV0cmlldmUgdGhlIHN0b3JlIGFuZCBhbmNlc3RvciBzdWJzY3JpcHRpb24gdmlhIGNvbnRleHQsIGlmIGF2YWlsYWJsZVxuXG4gICAgICBjb25zdCBjb250ZXh0VmFsdWUgPSB1c2VDb250ZXh0KENvbnRleHRUb1VzZSk7IC8vIFRoZSBzdG9yZSBfbXVzdF8gZXhpc3QgYXMgZWl0aGVyIGEgcHJvcCBvciBpbiBjb250ZXh0LlxuICAgICAgLy8gV2UnbGwgY2hlY2sgdG8gc2VlIGlmIGl0IF9sb29rc18gbGlrZSBhIFJlZHV4IHN0b3JlIGZpcnN0LlxuICAgICAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gcGFzcyB0aHJvdWdoIGEgYHN0b3JlYCBwcm9wIHRoYXQgaXMganVzdCBhIHBsYWluIHZhbHVlLlxuXG4gICAgICBjb25zdCBkaWRTdG9yZUNvbWVGcm9tUHJvcHMgPSBCb29sZWFuKHByb3BzLnN0b3JlKSAmJiBCb29sZWFuKHByb3BzLnN0b3JlLmdldFN0YXRlKSAmJiBCb29sZWFuKHByb3BzLnN0b3JlLmRpc3BhdGNoKTtcbiAgICAgIGNvbnN0IGRpZFN0b3JlQ29tZUZyb21Db250ZXh0ID0gQm9vbGVhbihjb250ZXh0VmFsdWUpICYmIEJvb2xlYW4oY29udGV4dFZhbHVlLnN0b3JlKTtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIWRpZFN0b3JlQ29tZUZyb21Qcm9wcyAmJiAhZGlkU3RvcmVDb21lRnJvbUNvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBcInN0b3JlXCIgaW4gdGhlIGNvbnRleHQgb2YgYCArIGBcIiR7ZGlzcGxheU5hbWV9XCIuIEVpdGhlciB3cmFwIHRoZSByb290IGNvbXBvbmVudCBpbiBhIDxQcm92aWRlcj4sIGAgKyBgb3IgcGFzcyBhIGN1c3RvbSBSZWFjdCBjb250ZXh0IHByb3ZpZGVyIHRvIDxQcm92aWRlcj4gYW5kIHRoZSBjb3JyZXNwb25kaW5nIGAgKyBgUmVhY3QgY29udGV4dCBjb25zdW1lciB0byAke2Rpc3BsYXlOYW1lfSBpbiBjb25uZWN0IG9wdGlvbnMuYCk7XG4gICAgICB9IC8vIEJhc2VkIG9uIHRoZSBwcmV2aW91cyBjaGVjaywgb25lIG9mIHRoZXNlIG11c3QgYmUgdHJ1ZVxuXG5cbiAgICAgIGNvbnN0IHN0b3JlID0gZGlkU3RvcmVDb21lRnJvbVByb3BzID8gcHJvcHMuc3RvcmUgOiBjb250ZXh0VmFsdWUuc3RvcmU7XG4gICAgICBjb25zdCBnZXRTZXJ2ZXJTdGF0ZSA9IGRpZFN0b3JlQ29tZUZyb21Db250ZXh0ID8gY29udGV4dFZhbHVlLmdldFNlcnZlclN0YXRlIDogc3RvcmUuZ2V0U3RhdGU7XG4gICAgICBjb25zdCBjaGlsZFByb3BzU2VsZWN0b3IgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgLy8gVGhlIGNoaWxkIHByb3BzIHNlbGVjdG9yIG5lZWRzIHRoZSBzdG9yZSByZWZlcmVuY2UgYXMgYW4gaW5wdXQuXG4gICAgICAgIC8vIFJlLWNyZWF0ZSB0aGlzIHNlbGVjdG9yIHdoZW5ldmVyIHRoZSBzdG9yZSBjaGFuZ2VzLlxuICAgICAgICByZXR1cm4gZGVmYXVsdFNlbGVjdG9yRmFjdG9yeShzdG9yZS5kaXNwYXRjaCwgc2VsZWN0b3JGYWN0b3J5T3B0aW9ucyk7XG4gICAgICB9LCBbc3RvcmVdKTtcbiAgICAgIGNvbnN0IFtzdWJzY3JpcHRpb24sIG5vdGlmeU5lc3RlZFN1YnNdID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGlmICghc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzKSByZXR1cm4gTk9fU1VCU0NSSVBUSU9OX0FSUkFZOyAvLyBUaGlzIFN1YnNjcmlwdGlvbidzIHNvdXJjZSBzaG91bGQgbWF0Y2ggd2hlcmUgc3RvcmUgY2FtZSBmcm9tOiBwcm9wcyB2cy4gY29udGV4dC4gQSBjb21wb25lbnRcbiAgICAgICAgLy8gY29ubmVjdGVkIHRvIHRoZSBzdG9yZSB2aWEgcHJvcHMgc2hvdWxkbid0IHVzZSBzdWJzY3JpcHRpb24gZnJvbSBjb250ZXh0LCBvciB2aWNlIHZlcnNhLlxuXG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IGNyZWF0ZVN1YnNjcmlwdGlvbihzdG9yZSwgZGlkU3RvcmVDb21lRnJvbVByb3BzID8gdW5kZWZpbmVkIDogY29udGV4dFZhbHVlLnN1YnNjcmlwdGlvbik7IC8vIGBub3RpZnlOZXN0ZWRTdWJzYCBpcyBkdXBsaWNhdGVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgY29tcG9uZW50IGlzIHVubW91bnRlZCBpblxuICAgICAgICAvLyB0aGUgbWlkZGxlIG9mIHRoZSBub3RpZmljYXRpb24gbG9vcCwgd2hlcmUgYHN1YnNjcmlwdGlvbmAgd2lsbCB0aGVuIGJlIG51bGwuIFRoaXMgY2FuXG4gICAgICAgIC8vIHByb2JhYmx5IGJlIGF2b2lkZWQgaWYgU3Vic2NyaXB0aW9uJ3MgbGlzdGVuZXJzIGxvZ2ljIGlzIGNoYW5nZWQgdG8gbm90IGNhbGwgbGlzdGVuZXJzXG4gICAgICAgIC8vIHRoYXQgaGF2ZSBiZWVuIHVuc3Vic2NyaWJlZCBpbiB0aGUgIG1pZGRsZSBvZiB0aGUgbm90aWZpY2F0aW9uIGxvb3AuXG5cbiAgICAgICAgY29uc3Qgbm90aWZ5TmVzdGVkU3VicyA9IHN1YnNjcmlwdGlvbi5ub3RpZnlOZXN0ZWRTdWJzLmJpbmQoc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgcmV0dXJuIFtzdWJzY3JpcHRpb24sIG5vdGlmeU5lc3RlZFN1YnNdO1xuICAgICAgfSwgW3N0b3JlLCBkaWRTdG9yZUNvbWVGcm9tUHJvcHMsIGNvbnRleHRWYWx1ZV0pOyAvLyBEZXRlcm1pbmUgd2hhdCB7c3RvcmUsIHN1YnNjcmlwdGlvbn0gdmFsdWUgc2hvdWxkIGJlIHB1dCBpbnRvIG5lc3RlZCBjb250ZXh0LCBpZiBuZWNlc3NhcnksXG4gICAgICAvLyBhbmQgbWVtb2l6ZSB0aGF0IHZhbHVlIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGNvbnRleHQgdXBkYXRlcy5cblxuICAgICAgY29uc3Qgb3ZlcnJpZGRlbkNvbnRleHRWYWx1ZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBpZiAoZGlkU3RvcmVDb21lRnJvbVByb3BzKSB7XG4gICAgICAgICAgLy8gVGhpcyBjb21wb25lbnQgaXMgZGlyZWN0bHkgc3Vic2NyaWJlZCB0byBhIHN0b3JlIGZyb20gcHJvcHMuXG4gICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCBkZXNjZW5kYW50cyByZWFkaW5nIGZyb20gdGhpcyBzdG9yZSAtIHBhc3MgZG93biB3aGF0ZXZlclxuICAgICAgICAgIC8vIHRoZSBleGlzdGluZyBjb250ZXh0IHZhbHVlIGlzIGZyb20gdGhlIG5lYXJlc3QgY29ubmVjdGVkIGFuY2VzdG9yLlxuICAgICAgICAgIHJldHVybiBjb250ZXh0VmFsdWU7XG4gICAgICAgIH0gLy8gT3RoZXJ3aXNlLCBwdXQgdGhpcyBjb21wb25lbnQncyBzdWJzY3JpcHRpb24gaW5zdGFuY2UgaW50byBjb250ZXh0LCBzbyB0aGF0XG4gICAgICAgIC8vIGNvbm5lY3RlZCBkZXNjZW5kYW50cyB3b24ndCB1cGRhdGUgdW50aWwgYWZ0ZXIgdGhpcyBjb21wb25lbnQgaXMgZG9uZVxuXG5cbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBjb250ZXh0VmFsdWUsIHtcbiAgICAgICAgICBzdWJzY3JpcHRpb25cbiAgICAgICAgfSk7XG4gICAgICB9LCBbZGlkU3RvcmVDb21lRnJvbVByb3BzLCBjb250ZXh0VmFsdWUsIHN1YnNjcmlwdGlvbl0pOyAvLyBTZXQgdXAgcmVmcyB0byBjb29yZGluYXRlIHZhbHVlcyBiZXR3ZWVuIHRoZSBzdWJzY3JpcHRpb24gZWZmZWN0IGFuZCB0aGUgcmVuZGVyIGxvZ2ljXG5cbiAgICAgIGNvbnN0IGxhc3RDaGlsZFByb3BzID0gdXNlUmVmKCk7XG4gICAgICBjb25zdCBsYXN0V3JhcHBlclByb3BzID0gdXNlUmVmKHdyYXBwZXJQcm9wcyk7XG4gICAgICBjb25zdCBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlID0gdXNlUmVmKCk7XG4gICAgICBjb25zdCByZW5kZXJJc1NjaGVkdWxlZCA9IHVzZVJlZihmYWxzZSk7XG4gICAgICBjb25zdCBpc1Byb2Nlc3NpbmdEaXNwYXRjaCA9IHVzZVJlZihmYWxzZSk7XG4gICAgICBjb25zdCBpc01vdW50ZWQgPSB1c2VSZWYoZmFsc2UpO1xuICAgICAgY29uc3QgbGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvciA9IHVzZVJlZigpO1xuICAgICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlzTW91bnRlZC5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICBpc01vdW50ZWQuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgfSwgW10pO1xuICAgICAgY29uc3QgYWN0dWFsQ2hpbGRQcm9wc1NlbGVjdG9yID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gKCkgPT4ge1xuICAgICAgICAgIC8vIFRyaWNreSBsb2dpYyBoZXJlOlxuICAgICAgICAgIC8vIC0gVGhpcyByZW5kZXIgbWF5IGhhdmUgYmVlbiB0cmlnZ2VyZWQgYnkgYSBSZWR1eCBzdG9yZSB1cGRhdGUgdGhhdCBwcm9kdWNlZCBuZXcgY2hpbGQgcHJvcHNcbiAgICAgICAgICAvLyAtIEhvd2V2ZXIsIHdlIG1heSBoYXZlIGdvdHRlbiBuZXcgd3JhcHBlciBwcm9wcyBhZnRlciB0aGF0XG4gICAgICAgICAgLy8gSWYgd2UgaGF2ZSBuZXcgY2hpbGQgcHJvcHMsIGFuZCB0aGUgc2FtZSB3cmFwcGVyIHByb3BzLCB3ZSBrbm93IHdlIHNob3VsZCB1c2UgdGhlIG5ldyBjaGlsZCBwcm9wcyBhcy1pcy5cbiAgICAgICAgICAvLyBCdXQsIGlmIHdlIGhhdmUgbmV3IHdyYXBwZXIgcHJvcHMsIHRob3NlIG1pZ2h0IGNoYW5nZSB0aGUgY2hpbGQgcHJvcHMsIHNvIHdlIGhhdmUgdG8gcmVjYWxjdWxhdGUgdGhpbmdzLlxuICAgICAgICAgIC8vIFNvLCB3ZSdsbCB1c2UgdGhlIGNoaWxkIHByb3BzIGZyb20gc3RvcmUgdXBkYXRlIG9ubHkgaWYgdGhlIHdyYXBwZXIgcHJvcHMgYXJlIHRoZSBzYW1lIGFzIGxhc3QgdGltZS5cbiAgICAgICAgICBpZiAoY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50ICYmIHdyYXBwZXJQcm9wcyA9PT0gbGFzdFdyYXBwZXJQcm9wcy5jdXJyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50O1xuICAgICAgICAgIH0gLy8gVE9ETyBXZSdyZSByZWFkaW5nIHRoZSBzdG9yZSBkaXJlY3RseSBpbiByZW5kZXIoKSBoZXJlLiBCYWQgaWRlYT9cbiAgICAgICAgICAvLyBUaGlzIHdpbGwgbGlrZWx5IGNhdXNlIEJhZCBUaGluZ3MgKFRNKSB0byBoYXBwZW4gaW4gQ29uY3VycmVudCBNb2RlLlxuICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkbyB0aGlzIGJlY2F1c2Ugb24gcmVuZGVycyBfbm90XyBjYXVzZWQgYnkgc3RvcmUgdXBkYXRlcywgd2UgbmVlZCB0aGUgbGF0ZXN0IHN0b3JlIHN0YXRlXG4gICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIGNoaWxkIHByb3BzIHNob3VsZCBiZS5cblxuXG4gICAgICAgICAgcmV0dXJuIGNoaWxkUHJvcHNTZWxlY3RvcihzdG9yZS5nZXRTdGF0ZSgpLCB3cmFwcGVyUHJvcHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBzZWxlY3RvcjtcbiAgICAgIH0sIFtzdG9yZSwgd3JhcHBlclByb3BzXSk7IC8vIFdlIG5lZWQgdGhpcyB0byBleGVjdXRlIHN5bmNocm9ub3VzbHkgZXZlcnkgdGltZSB3ZSByZS1yZW5kZXIuIEhvd2V2ZXIsIFJlYWN0IHdhcm5zXG4gICAgICAvLyBhYm91dCB1c2VMYXlvdXRFZmZlY3QgaW4gU1NSLCBzbyB3ZSB0cnkgdG8gZGV0ZWN0IGVudmlyb25tZW50IGFuZCBmYWxsIGJhY2sgdG9cbiAgICAgIC8vIGp1c3QgdXNlRWZmZWN0IGluc3RlYWQgdG8gYXZvaWQgdGhlIHdhcm5pbmcsIHNpbmNlIG5laXRoZXIgd2lsbCBydW4gYW55d2F5LlxuXG4gICAgICBjb25zdCBzdWJzY3JpYmVGb3JSZWFjdCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBjb25zdCBzdWJzY3JpYmUgPSByZWFjdExpc3RlbmVyID0+IHtcbiAgICAgICAgICBpZiAoIXN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHt9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzdWJzY3JpYmVVcGRhdGVzKHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcywgc3RvcmUsIHN1YnNjcmlwdGlvbiwgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGNoaWxkUHJvcHNTZWxlY3RvciwgbGFzdFdyYXBwZXJQcm9wcywgbGFzdENoaWxkUHJvcHMsIHJlbmRlcklzU2NoZWR1bGVkLCBpc01vdW50ZWQsIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUsIG5vdGlmeU5lc3RlZFN1YnMsIHJlYWN0TGlzdGVuZXIpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBzdWJzY3JpYmU7XG4gICAgICB9LCBbc3Vic2NyaXB0aW9uXSk7XG4gICAgICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0V2l0aEFyZ3MoY2FwdHVyZVdyYXBwZXJQcm9wcywgW2xhc3RXcmFwcGVyUHJvcHMsIGxhc3RDaGlsZFByb3BzLCByZW5kZXJJc1NjaGVkdWxlZCwgd3JhcHBlclByb3BzLCBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLCBub3RpZnlOZXN0ZWRTdWJzXSk7XG4gICAgICBsZXQgYWN0dWFsQ2hpbGRQcm9wcztcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYWN0dWFsQ2hpbGRQcm9wcyA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlKCAvLyBUT0RPIFdlJ3JlIHBhc3NpbmcgdGhyb3VnaCBhIGJpZyB3cmFwcGVyIHRoYXQgZG9lcyBhIGJ1bmNoIG9mIGV4dHJhIHNpZGUgZWZmZWN0cyBiZXNpZGVzIHN1YnNjcmliaW5nXG4gICAgICAgIHN1YnNjcmliZUZvclJlYWN0LCAvLyBUT0RPIFRoaXMgaXMgaW5jcmVkaWJseSBoYWNreS4gV2UndmUgYWxyZWFkeSBwcm9jZXNzZWQgdGhlIHN0b3JlIHVwZGF0ZSBhbmQgY2FsY3VsYXRlZCBuZXcgY2hpbGQgcHJvcHMsXG4gICAgICAgIC8vIFRPRE8gYW5kIHdlJ3JlIGp1c3QgcGFzc2luZyB0aGF0IHRocm91Z2ggc28gaXQgdHJpZ2dlcnMgYSByZS1yZW5kZXIgZm9yIHVzIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gYHVTRVNgLlxuICAgICAgICBhY3R1YWxDaGlsZFByb3BzU2VsZWN0b3IsIGdldFNlcnZlclN0YXRlID8gKCkgPT4gY2hpbGRQcm9wc1NlbGVjdG9yKGdldFNlcnZlclN0YXRlKCksIHdyYXBwZXJQcm9wcykgOiBhY3R1YWxDaGlsZFByb3BzU2VsZWN0b3IpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yLmN1cnJlbnQpIHtcbiAgICAgICAgICA7XG4gICAgICAgICAgZXJyLm1lc3NhZ2UgKz0gYFxcblRoZSBlcnJvciBtYXkgYmUgY29ycmVsYXRlZCB3aXRoIHRoaXMgcHJldmlvdXMgZXJyb3I6XFxuJHtsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yLmN1cnJlbnQuc3RhY2t9XFxuXFxuYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cblxuICAgICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGxhdGVzdFN1YnNjcmlwdGlvbkNhbGxiYWNrRXJyb3IuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICBsYXN0Q2hpbGRQcm9wcy5jdXJyZW50ID0gYWN0dWFsQ2hpbGRQcm9wcztcbiAgICAgIH0pOyAvLyBOb3cgdGhhdCBhbGwgdGhhdCdzIGRvbmUsIHdlIGNhbiBmaW5hbGx5IHRyeSB0byBhY3R1YWxseSByZW5kZXIgdGhlIGNoaWxkIGNvbXBvbmVudC5cbiAgICAgIC8vIFdlIG1lbW9pemUgdGhlIGVsZW1lbnRzIGZvciB0aGUgcmVuZGVyZWQgY2hpbGQgY29tcG9uZW50IGFzIGFuIG9wdGltaXphdGlvbi5cblxuICAgICAgY29uc3QgcmVuZGVyZWRXcmFwcGVkQ29tcG9uZW50ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgLyojX19QVVJFX18qL1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFdyYXBwZWRDb21wb25lbnQsIF9leHRlbmRzKHt9LCBhY3R1YWxDaGlsZFByb3BzLCB7XG4gICAgICAgICAgICByZWY6IHJlYWN0UmVkdXhGb3J3YXJkZWRSZWZcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcbiAgICAgIH0sIFtyZWFjdFJlZHV4Rm9yd2FyZGVkUmVmLCBXcmFwcGVkQ29tcG9uZW50LCBhY3R1YWxDaGlsZFByb3BzXSk7IC8vIElmIFJlYWN0IHNlZXMgdGhlIGV4YWN0IHNhbWUgZWxlbWVudCByZWZlcmVuY2UgYXMgbGFzdCB0aW1lLCBpdCBiYWlscyBvdXQgb2YgcmUtcmVuZGVyaW5nXG4gICAgICAvLyB0aGF0IGNoaWxkLCBzYW1lIGFzIGlmIGl0IHdhcyB3cmFwcGVkIGluIFJlYWN0Lm1lbW8oKSBvciByZXR1cm5lZCBmYWxzZSBmcm9tIHNob3VsZENvbXBvbmVudFVwZGF0ZS5cblxuICAgICAgY29uc3QgcmVuZGVyZWRDaGlsZCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBpZiAoc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBjb21wb25lbnQgaXMgc3Vic2NyaWJlZCB0byBzdG9yZSB1cGRhdGVzLCB3ZSBuZWVkIHRvIHBhc3MgaXRzIG93blxuICAgICAgICAgIC8vIHN1YnNjcmlwdGlvbiBpbnN0YW5jZSBkb3duIHRvIG91ciBkZXNjZW5kYW50cy4gVGhhdCBtZWFucyByZW5kZXJpbmcgdGhlIHNhbWVcbiAgICAgICAgICAvLyBDb250ZXh0IGluc3RhbmNlLCBhbmQgcHV0dGluZyBhIGRpZmZlcmVudCB2YWx1ZSBpbnRvIHRoZSBjb250ZXh0LlxuICAgICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb250ZXh0VG9Vc2UuUHJvdmlkZXIsIHtcbiAgICAgICAgICAgIHZhbHVlOiBvdmVycmlkZGVuQ29udGV4dFZhbHVlXG4gICAgICAgICAgfSwgcmVuZGVyZWRXcmFwcGVkQ29tcG9uZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZW5kZXJlZFdyYXBwZWRDb21wb25lbnQ7XG4gICAgICB9LCBbQ29udGV4dFRvVXNlLCByZW5kZXJlZFdyYXBwZWRDb21wb25lbnQsIG92ZXJyaWRkZW5Db250ZXh0VmFsdWVdKTtcbiAgICAgIHJldHVybiByZW5kZXJlZENoaWxkO1xuICAgIH1cblxuICAgIGNvbnN0IF9Db25uZWN0ID0gUmVhY3QubWVtbyhDb25uZWN0RnVuY3Rpb24pO1xuXG4gICAgLy8gQWRkIGEgaGFja3kgY2FzdCB0byBnZXQgdGhlIHJpZ2h0IG91dHB1dCB0eXBlXG4gICAgY29uc3QgQ29ubmVjdCA9IF9Db25uZWN0O1xuICAgIENvbm5lY3QuV3JhcHBlZENvbXBvbmVudCA9IFdyYXBwZWRDb21wb25lbnQ7XG4gICAgQ29ubmVjdC5kaXNwbGF5TmFtZSA9IENvbm5lY3RGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuXG4gICAgaWYgKGZvcndhcmRSZWYpIHtcbiAgICAgIGNvbnN0IF9mb3J3YXJkZWQgPSBSZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIGZvcndhcmRDb25uZWN0UmVmKHByb3BzLCByZWYpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29ubmVjdCwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICAgICAgcmVhY3RSZWR1eEZvcndhcmRlZFJlZjogcmVmXG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBmb3J3YXJkZWQgPSBfZm9yd2FyZGVkO1xuICAgICAgZm9yd2FyZGVkLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XG4gICAgICBmb3J3YXJkZWQuV3JhcHBlZENvbXBvbmVudCA9IFdyYXBwZWRDb21wb25lbnQ7XG4gICAgICByZXR1cm4gaG9pc3RTdGF0aWNzKGZvcndhcmRlZCwgV3JhcHBlZENvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhvaXN0U3RhdGljcyhDb25uZWN0LCBXcmFwcGVkQ29tcG9uZW50KTtcbiAgfTtcblxuICByZXR1cm4gd3JhcFdpdGhDb25uZWN0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0OyIsImV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeShhcmcsIG5hbWUpIHtcbiAgcmV0dXJuIChkaXNwYXRjaCwgb3B0aW9ucykgPT4ge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2YWx1ZSBvZiB0eXBlICR7dHlwZW9mIGFyZ30gZm9yICR7bmFtZX0gYXJndW1lbnQgd2hlbiBjb25uZWN0aW5nIGNvbXBvbmVudCAke29wdGlvbnMud3JhcHBlZENvbXBvbmVudE5hbWV9LmApO1xuICB9O1xufSIsImltcG9ydCBiaW5kQWN0aW9uQ3JlYXRvcnMgZnJvbSAnLi4vdXRpbHMvYmluZEFjdGlvbkNyZWF0b3JzJztcbmltcG9ydCB7IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQsIHdyYXBNYXBUb1Byb3BzRnVuYyB9IGZyb20gJy4vd3JhcE1hcFRvUHJvcHMnO1xuaW1wb3J0IHsgY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkgfSBmcm9tICcuL2ludmFsaWRBcmdGYWN0b3J5JztcbmV4cG9ydCBmdW5jdGlvbiBtYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3J5KG1hcERpc3BhdGNoVG9Qcm9wcykge1xuICByZXR1cm4gbWFwRGlzcGF0Y2hUb1Byb3BzICYmIHR5cGVvZiBtYXBEaXNwYXRjaFRvUHJvcHMgPT09ICdvYmplY3QnID8gd3JhcE1hcFRvUHJvcHNDb25zdGFudChkaXNwYXRjaCA9PiAvLyBAdHMtaWdub3JlXG4gIGJpbmRBY3Rpb25DcmVhdG9ycyhtYXBEaXNwYXRjaFRvUHJvcHMsIGRpc3BhdGNoKSkgOiAhbWFwRGlzcGF0Y2hUb1Byb3BzID8gd3JhcE1hcFRvUHJvcHNDb25zdGFudChkaXNwYXRjaCA9PiAoe1xuICAgIGRpc3BhdGNoXG4gIH0pKSA6IHR5cGVvZiBtYXBEaXNwYXRjaFRvUHJvcHMgPT09ICdmdW5jdGlvbicgPyAvLyBAdHMtaWdub3JlXG4gIHdyYXBNYXBUb1Byb3BzRnVuYyhtYXBEaXNwYXRjaFRvUHJvcHMsICdtYXBEaXNwYXRjaFRvUHJvcHMnKSA6IGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5KG1hcERpc3BhdGNoVG9Qcm9wcywgJ21hcERpc3BhdGNoVG9Qcm9wcycpO1xufSIsImltcG9ydCB7IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQsIHdyYXBNYXBUb1Byb3BzRnVuYyB9IGZyb20gJy4vd3JhcE1hcFRvUHJvcHMnO1xuaW1wb3J0IHsgY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkgfSBmcm9tICcuL2ludmFsaWRBcmdGYWN0b3J5JztcbmV4cG9ydCBmdW5jdGlvbiBtYXBTdGF0ZVRvUHJvcHNGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcykge1xuICByZXR1cm4gIW1hcFN0YXRlVG9Qcm9wcyA/IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoKCkgPT4gKHt9KSkgOiB0eXBlb2YgbWFwU3RhdGVUb1Byb3BzID09PSAnZnVuY3Rpb24nID8gLy8gQHRzLWlnbm9yZVxuICB3cmFwTWFwVG9Qcm9wc0Z1bmMobWFwU3RhdGVUb1Byb3BzLCAnbWFwU3RhdGVUb1Byb3BzJykgOiBjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMsICdtYXBTdGF0ZVRvUHJvcHMnKTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCB2ZXJpZnlQbGFpbk9iamVjdCBmcm9tICcuLi91dGlscy92ZXJpZnlQbGFpbk9iamVjdCc7XG5pbXBvcnQgeyBjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeSB9IGZyb20gJy4vaW52YWxpZEFyZ0ZhY3RvcnknO1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRNZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKSB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIF9leHRlbmRzKHt9LCBvd25Qcm9wcywgc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gd3JhcE1lcmdlUHJvcHNGdW5jKG1lcmdlUHJvcHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRNZXJnZVByb3BzUHJveHkoZGlzcGF0Y2gsIHtcbiAgICBkaXNwbGF5TmFtZSxcbiAgICBhcmVNZXJnZWRQcm9wc0VxdWFsXG4gIH0pIHtcbiAgICBsZXQgaGFzUnVuT25jZSA9IGZhbHNlO1xuICAgIGxldCBtZXJnZWRQcm9wcztcbiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VQcm9wc1Byb3h5KHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKSB7XG4gICAgICBjb25zdCBuZXh0TWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcblxuICAgICAgaWYgKGhhc1J1bk9uY2UpIHtcbiAgICAgICAgaWYgKCFhcmVNZXJnZWRQcm9wc0VxdWFsKG5leHRNZXJnZWRQcm9wcywgbWVyZ2VkUHJvcHMpKSBtZXJnZWRQcm9wcyA9IG5leHRNZXJnZWRQcm9wcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhhc1J1bk9uY2UgPSB0cnVlO1xuICAgICAgICBtZXJnZWRQcm9wcyA9IG5leHRNZXJnZWRQcm9wcztcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHZlcmlmeVBsYWluT2JqZWN0KG1lcmdlZFByb3BzLCBkaXNwbGF5TmFtZSwgJ21lcmdlUHJvcHMnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICAgIH07XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VQcm9wc0ZhY3RvcnkobWVyZ2VQcm9wcykge1xuICByZXR1cm4gIW1lcmdlUHJvcHMgPyAoKSA9PiBkZWZhdWx0TWVyZ2VQcm9wcyA6IHR5cGVvZiBtZXJnZVByb3BzID09PSAnZnVuY3Rpb24nID8gd3JhcE1lcmdlUHJvcHNGdW5jKG1lcmdlUHJvcHMpIDogY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkobWVyZ2VQcm9wcywgJ21lcmdlUHJvcHMnKTtcbn0iLCJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIjtcbmNvbnN0IF9leGNsdWRlZCA9IFtcImluaXRNYXBTdGF0ZVRvUHJvcHNcIiwgXCJpbml0TWFwRGlzcGF0Y2hUb1Byb3BzXCIsIFwiaW5pdE1lcmdlUHJvcHNcIl07XG5pbXBvcnQgdmVyaWZ5U3Vic2VsZWN0b3JzIGZyb20gJy4vdmVyaWZ5U3Vic2VsZWN0b3JzJztcbmV4cG9ydCBmdW5jdGlvbiBwdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywgZGlzcGF0Y2gsIHtcbiAgYXJlU3RhdGVzRXF1YWwsXG4gIGFyZU93blByb3BzRXF1YWwsXG4gIGFyZVN0YXRlUHJvcHNFcXVhbFxufSkge1xuICBsZXQgaGFzUnVuQXRMZWFzdE9uY2UgPSBmYWxzZTtcbiAgbGV0IHN0YXRlO1xuICBsZXQgb3duUHJvcHM7XG4gIGxldCBzdGF0ZVByb3BzO1xuICBsZXQgZGlzcGF0Y2hQcm9wcztcbiAgbGV0IG1lcmdlZFByb3BzO1xuXG4gIGZ1bmN0aW9uIGhhbmRsZUZpcnN0Q2FsbChmaXJzdFN0YXRlLCBmaXJzdE93blByb3BzKSB7XG4gICAgc3RhdGUgPSBmaXJzdFN0YXRlO1xuICAgIG93blByb3BzID0gZmlyc3RPd25Qcm9wcztcbiAgICBzdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgZGlzcGF0Y2hQcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgaGFzUnVuQXRMZWFzdE9uY2UgPSB0cnVlO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZU5ld1Byb3BzQW5kTmV3U3RhdGUoKSB7XG4gICAgc3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuICAgIGlmIChtYXBEaXNwYXRjaFRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMpIGRpc3BhdGNoUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG93blByb3BzKTtcbiAgICBtZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZU5ld1Byb3BzKCkge1xuICAgIGlmIChtYXBTdGF0ZVRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMpIHN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcbiAgICBpZiAobWFwRGlzcGF0Y2hUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSBkaXNwYXRjaFByb3BzID0gbWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVOZXdTdGF0ZSgpIHtcbiAgICBjb25zdCBuZXh0U3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuICAgIGNvbnN0IHN0YXRlUHJvcHNDaGFuZ2VkID0gIWFyZVN0YXRlUHJvcHNFcXVhbChuZXh0U3RhdGVQcm9wcywgc3RhdGVQcm9wcyk7XG4gICAgc3RhdGVQcm9wcyA9IG5leHRTdGF0ZVByb3BzO1xuICAgIGlmIChzdGF0ZVByb3BzQ2hhbmdlZCkgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVTdWJzZXF1ZW50Q2FsbHMobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpIHtcbiAgICBjb25zdCBwcm9wc0NoYW5nZWQgPSAhYXJlT3duUHJvcHNFcXVhbChuZXh0T3duUHJvcHMsIG93blByb3BzKTtcbiAgICBjb25zdCBzdGF0ZUNoYW5nZWQgPSAhYXJlU3RhdGVzRXF1YWwobmV4dFN0YXRlLCBzdGF0ZSwgbmV4dE93blByb3BzLCBvd25Qcm9wcyk7XG4gICAgc3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgb3duUHJvcHMgPSBuZXh0T3duUHJvcHM7XG4gICAgaWYgKHByb3BzQ2hhbmdlZCAmJiBzdGF0ZUNoYW5nZWQpIHJldHVybiBoYW5kbGVOZXdQcm9wc0FuZE5ld1N0YXRlKCk7XG4gICAgaWYgKHByb3BzQ2hhbmdlZCkgcmV0dXJuIGhhbmRsZU5ld1Byb3BzKCk7XG4gICAgaWYgKHN0YXRlQ2hhbmdlZCkgcmV0dXJuIGhhbmRsZU5ld1N0YXRlKCk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHB1cmVGaW5hbFByb3BzU2VsZWN0b3IobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpIHtcbiAgICByZXR1cm4gaGFzUnVuQXRMZWFzdE9uY2UgPyBoYW5kbGVTdWJzZXF1ZW50Q2FsbHMobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpIDogaGFuZGxlRmlyc3RDYWxsKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKTtcbiAgfTtcbn1cbi8vIFRPRE86IEFkZCBtb3JlIGNvbW1lbnRzXG4vLyBUaGUgc2VsZWN0b3IgcmV0dXJuZWQgYnkgc2VsZWN0b3JGYWN0b3J5IHdpbGwgbWVtb2l6ZSBpdHMgcmVzdWx0cyxcbi8vIGFsbG93aW5nIGNvbm5lY3QncyBzaG91bGRDb21wb25lbnRVcGRhdGUgdG8gcmV0dXJuIGZhbHNlIGlmIGZpbmFsXG4vLyBwcm9wcyBoYXZlIG5vdCBjaGFuZ2VkLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShkaXNwYXRjaCwgX3JlZikge1xuICBsZXQge1xuICAgIGluaXRNYXBTdGF0ZVRvUHJvcHMsXG4gICAgaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyxcbiAgICBpbml0TWVyZ2VQcm9wc1xuICB9ID0gX3JlZixcbiAgICAgIG9wdGlvbnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIGNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9IGluaXRNYXBTdGF0ZVRvUHJvcHMoZGlzcGF0Y2gsIG9wdGlvbnMpO1xuICBjb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvcHRpb25zKTtcbiAgY29uc3QgbWVyZ2VQcm9wcyA9IGluaXRNZXJnZVByb3BzKGRpc3BhdGNoLCBvcHRpb25zKTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHZlcmlmeVN1YnNlbGVjdG9ycyhtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcyk7XG4gIH1cblxuICByZXR1cm4gcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIGRpc3BhdGNoLCBvcHRpb25zKTtcbn0iLCJpbXBvcnQgd2FybmluZyBmcm9tICcuLi91dGlscy93YXJuaW5nJztcblxuZnVuY3Rpb24gdmVyaWZ5KHNlbGVjdG9yLCBtZXRob2ROYW1lKSB7XG4gIGlmICghc2VsZWN0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgdmFsdWUgZm9yICR7bWV0aG9kTmFtZX0gaW4gY29ubmVjdC5gKTtcbiAgfSBlbHNlIGlmIChtZXRob2ROYW1lID09PSAnbWFwU3RhdGVUb1Byb3BzJyB8fCBtZXRob2ROYW1lID09PSAnbWFwRGlzcGF0Y2hUb1Byb3BzJykge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNlbGVjdG9yLCAnZGVwZW5kc09uT3duUHJvcHMnKSkge1xuICAgICAgd2FybmluZyhgVGhlIHNlbGVjdG9yIGZvciAke21ldGhvZE5hbWV9IG9mIGNvbm5lY3QgZGlkIG5vdCBzcGVjaWZ5IGEgdmFsdWUgZm9yIGRlcGVuZHNPbk93blByb3BzLmApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2ZXJpZnlTdWJzZWxlY3RvcnMobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMpIHtcbiAgdmVyaWZ5KG1hcFN0YXRlVG9Qcm9wcywgJ21hcFN0YXRlVG9Qcm9wcycpO1xuICB2ZXJpZnkobWFwRGlzcGF0Y2hUb1Byb3BzLCAnbWFwRGlzcGF0Y2hUb1Byb3BzJyk7XG4gIHZlcmlmeShtZXJnZVByb3BzLCAnbWVyZ2VQcm9wcycpO1xufSIsImltcG9ydCB2ZXJpZnlQbGFpbk9iamVjdCBmcm9tICcuLi91dGlscy92ZXJpZnlQbGFpbk9iamVjdCc7XG5leHBvcnQgZnVuY3Rpb24gd3JhcE1hcFRvUHJvcHNDb25zdGFudCggLy8gKiBOb3RlOlxuLy8gIEl0IHNlZW1zIHRoYXQgdGhlIGRpc3BhdGNoIGFyZ3VtZW50XG4vLyAgY291bGQgYmUgYSBkaXNwYXRjaCBmdW5jdGlvbiBpbiBzb21lIGNhc2VzIChleDogd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzTWlzc2luZylcbi8vICBhbmQgYSBzdGF0ZSBvYmplY3QgaW4gc29tZSBvdGhlcnMgKGV4OiB3aGVuTWFwU3RhdGVUb1Byb3BzSXNNaXNzaW5nKVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5nZXRDb25zdGFudCkge1xuICByZXR1cm4gZnVuY3Rpb24gaW5pdENvbnN0YW50U2VsZWN0b3IoZGlzcGF0Y2gpIHtcbiAgICBjb25zdCBjb25zdGFudCA9IGdldENvbnN0YW50KGRpc3BhdGNoKTtcblxuICAgIGZ1bmN0aW9uIGNvbnN0YW50U2VsZWN0b3IoKSB7XG4gICAgICByZXR1cm4gY29uc3RhbnQ7XG4gICAgfVxuXG4gICAgY29uc3RhbnRTZWxlY3Rvci5kZXBlbmRzT25Pd25Qcm9wcyA9IGZhbHNlO1xuICAgIHJldHVybiBjb25zdGFudFNlbGVjdG9yO1xuICB9O1xufSAvLyBkZXBlbmRzT25Pd25Qcm9wcyBpcyB1c2VkIGJ5IGNyZWF0ZU1hcFRvUHJvcHNQcm94eSB0byBkZXRlcm1pbmUgd2hldGhlciB0byBwYXNzIHByb3BzIGFzIGFyZ3Ncbi8vIHRvIHRoZSBtYXBUb1Byb3BzIGZ1bmN0aW9uIGJlaW5nIHdyYXBwZWQuIEl0IGlzIGFsc28gdXNlZCBieSBtYWtlUHVyZVByb3BzU2VsZWN0b3IgdG8gZGV0ZXJtaW5lXG4vLyB3aGV0aGVyIG1hcFRvUHJvcHMgbmVlZHMgdG8gYmUgaW52b2tlZCB3aGVuIHByb3BzIGhhdmUgY2hhbmdlZC5cbi8vXG4vLyBBIGxlbmd0aCBvZiBvbmUgc2lnbmFscyB0aGF0IG1hcFRvUHJvcHMgZG9lcyBub3QgZGVwZW5kIG9uIHByb3BzIGZyb20gdGhlIHBhcmVudCBjb21wb25lbnQuXG4vLyBBIGxlbmd0aCBvZiB6ZXJvIGlzIGFzc3VtZWQgdG8gbWVhbiBtYXBUb1Byb3BzIGlzIGdldHRpbmcgYXJncyB2aWEgYXJndW1lbnRzIG9yIC4uLmFyZ3MgYW5kXG4vLyB0aGVyZWZvcmUgbm90IHJlcG9ydGluZyBpdHMgbGVuZ3RoIGFjY3VyYXRlbHkuLlxuLy8gVE9ETyBDYW4gdGhpcyBnZXQgcHVsbGVkIG91dCBzbyB0aGF0IHdlIGNhbiBzdWJzY3JpYmUgZGlyZWN0bHkgdG8gdGhlIHN0b3JlIGlmIHdlIGRvbid0IG5lZWQgb3duUHJvcHM/XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXBlbmRzT25Pd25Qcm9wcyhtYXBUb1Byb3BzKSB7XG4gIHJldHVybiBtYXBUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzID8gQm9vbGVhbihtYXBUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSA6IG1hcFRvUHJvcHMubGVuZ3RoICE9PSAxO1xufSAvLyBVc2VkIGJ5IHdoZW5NYXBTdGF0ZVRvUHJvcHNJc0Z1bmN0aW9uIGFuZCB3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNGdW5jdGlvbixcbi8vIHRoaXMgZnVuY3Rpb24gd3JhcHMgbWFwVG9Qcm9wcyBpbiBhIHByb3h5IGZ1bmN0aW9uIHdoaWNoIGRvZXMgc2V2ZXJhbCB0aGluZ3M6XG4vL1xuLy8gICogRGV0ZWN0cyB3aGV0aGVyIHRoZSBtYXBUb1Byb3BzIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZCBkZXBlbmRzIG9uIHByb3BzLCB3aGljaFxuLy8gICAgaXMgdXNlZCBieSBzZWxlY3RvckZhY3RvcnkgdG8gZGVjaWRlIGlmIGl0IHNob3VsZCByZWludm9rZSBvbiBwcm9wcyBjaGFuZ2VzLlxuLy9cbi8vICAqIE9uIGZpcnN0IGNhbGwsIGhhbmRsZXMgbWFwVG9Qcm9wcyBpZiByZXR1cm5zIGFub3RoZXIgZnVuY3Rpb24sIGFuZCB0cmVhdHMgdGhhdFxuLy8gICAgbmV3IGZ1bmN0aW9uIGFzIHRoZSB0cnVlIG1hcFRvUHJvcHMgZm9yIHN1YnNlcXVlbnQgY2FsbHMuXG4vL1xuLy8gICogT24gZmlyc3QgY2FsbCwgdmVyaWZpZXMgdGhlIGZpcnN0IHJlc3VsdCBpcyBhIHBsYWluIG9iamVjdCwgaW4gb3JkZXIgdG8gd2FyblxuLy8gICAgdGhlIGRldmVsb3BlciB0aGF0IHRoZWlyIG1hcFRvUHJvcHMgZnVuY3Rpb24gaXMgbm90IHJldHVybmluZyBhIHZhbGlkIHJlc3VsdC5cbi8vXG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwTWFwVG9Qcm9wc0Z1bmMobWFwVG9Qcm9wcywgbWV0aG9kTmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gaW5pdFByb3h5U2VsZWN0b3IoZGlzcGF0Y2gsIHtcbiAgICBkaXNwbGF5TmFtZVxuICB9KSB7XG4gICAgY29uc3QgcHJveHkgPSBmdW5jdGlvbiBtYXBUb1Byb3BzUHJveHkoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcykge1xuICAgICAgcmV0dXJuIHByb3h5LmRlcGVuZHNPbk93blByb3BzID8gcHJveHkubWFwVG9Qcm9wcyhzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKSA6IHByb3h5Lm1hcFRvUHJvcHMoc3RhdGVPckRpc3BhdGNoLCB1bmRlZmluZWQpO1xuICAgIH07IC8vIGFsbG93IGRldGVjdEZhY3RvcnlBbmRWZXJpZnkgdG8gZ2V0IG93blByb3BzXG5cblxuICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gdHJ1ZTtcblxuICAgIHByb3h5Lm1hcFRvUHJvcHMgPSBmdW5jdGlvbiBkZXRlY3RGYWN0b3J5QW5kVmVyaWZ5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpIHtcbiAgICAgIHByb3h5Lm1hcFRvUHJvcHMgPSBtYXBUb1Byb3BzO1xuICAgICAgcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPSBnZXREZXBlbmRzT25Pd25Qcm9wcyhtYXBUb1Byb3BzKTtcbiAgICAgIGxldCBwcm9wcyA9IHByb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpO1xuXG4gICAgICBpZiAodHlwZW9mIHByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByb3h5Lm1hcFRvUHJvcHMgPSBwcm9wcztcbiAgICAgICAgcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPSBnZXREZXBlbmRzT25Pd25Qcm9wcyhwcm9wcyk7XG4gICAgICAgIHByb3BzID0gcHJveHkoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB2ZXJpZnlQbGFpbk9iamVjdChwcm9wcywgZGlzcGxheU5hbWUsIG1ldGhvZE5hbWUpO1xuICAgICAgcmV0dXJuIHByb3BzO1xuICAgIH07XG5cbiAgICByZXR1cm4gcHJveHk7XG4gIH07XG59IiwiaW1wb3J0IFByb3ZpZGVyIGZyb20gJy4vY29tcG9uZW50cy9Qcm92aWRlcic7XG5pbXBvcnQgY29ubmVjdCBmcm9tICcuL2NvbXBvbmVudHMvY29ubmVjdCc7XG5pbXBvcnQgeyBSZWFjdFJlZHV4Q29udGV4dCB9IGZyb20gJy4vY29tcG9uZW50cy9Db250ZXh0JztcbmltcG9ydCB7IHVzZURpc3BhdGNoLCBjcmVhdGVEaXNwYXRjaEhvb2sgfSBmcm9tICcuL2hvb2tzL3VzZURpc3BhdGNoJztcbmltcG9ydCB7IHVzZVNlbGVjdG9yLCBjcmVhdGVTZWxlY3Rvckhvb2sgfSBmcm9tICcuL2hvb2tzL3VzZVNlbGVjdG9yJztcbmltcG9ydCB7IHVzZVN0b3JlLCBjcmVhdGVTdG9yZUhvb2sgfSBmcm9tICcuL2hvb2tzL3VzZVN0b3JlJztcbmltcG9ydCBzaGFsbG93RXF1YWwgZnJvbSAnLi91dGlscy9zaGFsbG93RXF1YWwnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgeyBQcm92aWRlciwgUmVhY3RSZWR1eENvbnRleHQsIGNvbm5lY3QsIHVzZURpc3BhdGNoLCBjcmVhdGVEaXNwYXRjaEhvb2ssIHVzZVNlbGVjdG9yLCBjcmVhdGVTZWxlY3Rvckhvb2ssIHVzZVN0b3JlLCBjcmVhdGVTdG9yZUhvb2ssIHNoYWxsb3dFcXVhbCB9OyIsImltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi4vY29tcG9uZW50cy9Db250ZXh0JztcbmltcG9ydCB7IHVzZVN0b3JlIGFzIHVzZURlZmF1bHRTdG9yZSwgY3JlYXRlU3RvcmVIb29rIH0gZnJvbSAnLi91c2VTdG9yZSc7XG4vKipcclxuICogSG9vayBmYWN0b3J5LCB3aGljaCBjcmVhdGVzIGEgYHVzZURpc3BhdGNoYCBob29rIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cclxuICpcclxuICogQHBhcmFtIHtSZWFjdC5Db250ZXh0fSBbY29udGV4dD1SZWFjdFJlZHV4Q29udGV4dF0gQ29udGV4dCBwYXNzZWQgdG8geW91ciBgPFByb3ZpZGVyPmAuXHJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBgdXNlRGlzcGF0Y2hgIGhvb2sgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBjb250ZXh0LlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURpc3BhdGNoSG9vayhjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHQpIHtcbiAgY29uc3QgdXNlU3RvcmUgPSAvLyBAdHMtaWdub3JlXG4gIGNvbnRleHQgPT09IFJlYWN0UmVkdXhDb250ZXh0ID8gdXNlRGVmYXVsdFN0b3JlIDogY3JlYXRlU3RvcmVIb29rKGNvbnRleHQpO1xuICByZXR1cm4gZnVuY3Rpb24gdXNlRGlzcGF0Y2goKSB7XG4gICAgY29uc3Qgc3RvcmUgPSB1c2VTdG9yZSgpOyAvLyBAdHMtaWdub3JlXG5cbiAgICByZXR1cm4gc3RvcmUuZGlzcGF0Y2g7XG4gIH07XG59XG4vKipcclxuICogQSBob29rIHRvIGFjY2VzcyB0aGUgcmVkdXggYGRpc3BhdGNoYCBmdW5jdGlvbi5cclxuICpcclxuICogQHJldHVybnMge2FueXxmdW5jdGlvbn0gcmVkdXggc3RvcmUncyBgZGlzcGF0Y2hgIGZ1bmN0aW9uXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqXHJcbiAqIGltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0J1xyXG4gKiBpbXBvcnQgeyB1c2VEaXNwYXRjaCB9IGZyb20gJ3JlYWN0LXJlZHV4J1xyXG4gKlxyXG4gKiBleHBvcnQgY29uc3QgQ291bnRlckNvbXBvbmVudCA9ICh7IHZhbHVlIH0pID0+IHtcclxuICogICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKClcclxuICogICBjb25zdCBpbmNyZWFzZUNvdW50ZXIgPSB1c2VDYWxsYmFjaygoKSA9PiBkaXNwYXRjaCh7IHR5cGU6ICdpbmNyZWFzZS1jb3VudGVyJyB9KSwgW10pXHJcbiAqICAgcmV0dXJuIChcclxuICogICAgIDxkaXY+XHJcbiAqICAgICAgIDxzcGFuPnt2YWx1ZX08L3NwYW4+XHJcbiAqICAgICAgIDxidXR0b24gb25DbGljaz17aW5jcmVhc2VDb3VudGVyfT5JbmNyZWFzZSBjb3VudGVyPC9idXR0b24+XHJcbiAqICAgICA8L2Rpdj5cclxuICogICApXHJcbiAqIH1cclxuICovXG5cbmV4cG9ydCBjb25zdCB1c2VEaXNwYXRjaCA9IC8qI19fUFVSRV9fKi9jcmVhdGVEaXNwYXRjaEhvb2soKTsiLCJpbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuLi9jb21wb25lbnRzL0NvbnRleHQnO1xuXG4vKipcclxuICogQSBob29rIHRvIGFjY2VzcyB0aGUgdmFsdWUgb2YgdGhlIGBSZWFjdFJlZHV4Q29udGV4dGAuIFRoaXMgaXMgYSBsb3ctbGV2ZWxcclxuICogaG9vayB0aGF0IHlvdSBzaG91bGQgdXN1YWxseSBub3QgbmVlZCB0byBjYWxsIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7YW55fSB0aGUgdmFsdWUgb2YgdGhlIGBSZWFjdFJlZHV4Q29udGV4dGBcclxuICpcclxuICogQGV4YW1wbGVcclxuICpcclxuICogaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xyXG4gKiBpbXBvcnQgeyB1c2VSZWR1eENvbnRleHQgfSBmcm9tICdyZWFjdC1yZWR1eCdcclxuICpcclxuICogZXhwb3J0IGNvbnN0IENvdW50ZXJDb21wb25lbnQgPSAoKSA9PiB7XHJcbiAqICAgY29uc3QgeyBzdG9yZSB9ID0gdXNlUmVkdXhDb250ZXh0KClcclxuICogICByZXR1cm4gPGRpdj57c3RvcmUuZ2V0U3RhdGUoKX08L2Rpdj5cclxuICogfVxyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VSZWR1eENvbnRleHQoKSB7XG4gIGNvbnN0IGNvbnRleHRWYWx1ZSA9IHVzZUNvbnRleHQoUmVhY3RSZWR1eENvbnRleHQpO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFjb250ZXh0VmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCBmaW5kIHJlYWN0LXJlZHV4IGNvbnRleHQgdmFsdWU7IHBsZWFzZSBlbnN1cmUgdGhlIGNvbXBvbmVudCBpcyB3cmFwcGVkIGluIGEgPFByb3ZpZGVyPicpO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRleHRWYWx1ZTtcbn0iLCJpbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VEZWJ1Z1ZhbHVlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlUmVkdXhDb250ZXh0IGFzIHVzZURlZmF1bHRSZWR1eENvbnRleHQgfSBmcm9tICcuL3VzZVJlZHV4Q29udGV4dCc7XG5pbXBvcnQgeyBSZWFjdFJlZHV4Q29udGV4dCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ29udGV4dCc7XG5pbXBvcnQgeyBub3RJbml0aWFsaXplZCB9IGZyb20gJy4uL3V0aWxzL3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbmxldCB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvciA9IG5vdEluaXRpYWxpemVkO1xuZXhwb3J0IGNvbnN0IGluaXRpYWxpemVVc2VTZWxlY3RvciA9IGZuID0+IHtcbiAgdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IgPSBmbjtcbn07XG5cbmNvbnN0IHJlZkVxdWFsaXR5ID0gKGEsIGIpID0+IGEgPT09IGI7XG4vKipcclxuICogSG9vayBmYWN0b3J5LCB3aGljaCBjcmVhdGVzIGEgYHVzZVNlbGVjdG9yYCBob29rIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cclxuICpcclxuICogQHBhcmFtIHtSZWFjdC5Db250ZXh0fSBbY29udGV4dD1SZWFjdFJlZHV4Q29udGV4dF0gQ29udGV4dCBwYXNzZWQgdG8geW91ciBgPFByb3ZpZGVyPmAuXHJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBgdXNlU2VsZWN0b3JgIGhvb2sgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBjb250ZXh0LlxyXG4gKi9cblxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VsZWN0b3JIb29rKGNvbnRleHQgPSBSZWFjdFJlZHV4Q29udGV4dCkge1xuICBjb25zdCB1c2VSZWR1eENvbnRleHQgPSBjb250ZXh0ID09PSBSZWFjdFJlZHV4Q29udGV4dCA/IHVzZURlZmF1bHRSZWR1eENvbnRleHQgOiAoKSA9PiB1c2VDb250ZXh0KGNvbnRleHQpO1xuICByZXR1cm4gZnVuY3Rpb24gdXNlU2VsZWN0b3Ioc2VsZWN0b3IsIGVxdWFsaXR5Rm4gPSByZWZFcXVhbGl0eSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoIXNlbGVjdG9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWW91IG11c3QgcGFzcyBhIHNlbGVjdG9yIHRvIHVzZVNlbGVjdG9yYCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2VsZWN0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBZb3UgbXVzdCBwYXNzIGEgZnVuY3Rpb24gYXMgYSBzZWxlY3RvciB0byB1c2VTZWxlY3RvcmApO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGVxdWFsaXR5Rm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBZb3UgbXVzdCBwYXNzIGEgZnVuY3Rpb24gYXMgYW4gZXF1YWxpdHkgZnVuY3Rpb24gdG8gdXNlU2VsZWN0b3JgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICBzdG9yZSxcbiAgICAgIHN1YnNjcmlwdGlvbixcbiAgICAgIGdldFNlcnZlclN0YXRlXG4gICAgfSA9IHVzZVJlZHV4Q29udGV4dCgpO1xuICAgIGNvbnN0IHNlbGVjdGVkU3RhdGUgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvcihzdWJzY3JpcHRpb24uYWRkTmVzdGVkU3ViLCBzdG9yZS5nZXRTdGF0ZSwgZ2V0U2VydmVyU3RhdGUgfHwgc3RvcmUuZ2V0U3RhdGUsIHNlbGVjdG9yLCBlcXVhbGl0eUZuKTtcbiAgICB1c2VEZWJ1Z1ZhbHVlKHNlbGVjdGVkU3RhdGUpO1xuICAgIHJldHVybiBzZWxlY3RlZFN0YXRlO1xuICB9O1xufVxuLyoqXHJcbiAqIEEgaG9vayB0byBhY2Nlc3MgdGhlIHJlZHV4IHN0b3JlJ3Mgc3RhdGUuIFRoaXMgaG9vayB0YWtlcyBhIHNlbGVjdG9yIGZ1bmN0aW9uXHJcbiAqIGFzIGFuIGFyZ3VtZW50LiBUaGUgc2VsZWN0b3IgaXMgY2FsbGVkIHdpdGggdGhlIHN0b3JlIHN0YXRlLlxyXG4gKlxyXG4gKiBUaGlzIGhvb2sgdGFrZXMgYW4gb3B0aW9uYWwgZXF1YWxpdHkgY29tcGFyaXNvbiBmdW5jdGlvbiBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlclxyXG4gKiB0aGF0IGFsbG93cyB5b3UgdG8gY3VzdG9taXplIHRoZSB3YXkgdGhlIHNlbGVjdGVkIHN0YXRlIGlzIGNvbXBhcmVkIHRvIGRldGVybWluZVxyXG4gKiB3aGV0aGVyIHRoZSBjb21wb25lbnQgbmVlZHMgdG8gYmUgcmUtcmVuZGVyZWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGVjdG9yIHRoZSBzZWxlY3RvciBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9uPX0gZXF1YWxpdHlGbiB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGVxdWFsaXR5XHJcbiAqXHJcbiAqIEByZXR1cm5zIHthbnl9IHRoZSBzZWxlY3RlZCBzdGF0ZVxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKlxyXG4gKiBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXHJcbiAqIGltcG9ydCB7IHVzZVNlbGVjdG9yIH0gZnJvbSAncmVhY3QtcmVkdXgnXHJcbiAqXHJcbiAqIGV4cG9ydCBjb25zdCBDb3VudGVyQ29tcG9uZW50ID0gKCkgPT4ge1xyXG4gKiAgIGNvbnN0IGNvdW50ZXIgPSB1c2VTZWxlY3RvcihzdGF0ZSA9PiBzdGF0ZS5jb3VudGVyKVxyXG4gKiAgIHJldHVybiA8ZGl2Pntjb3VudGVyfTwvZGl2PlxyXG4gKiB9XHJcbiAqL1xuXG5leHBvcnQgY29uc3QgdXNlU2VsZWN0b3IgPSAvKiNfX1BVUkVfXyovY3JlYXRlU2VsZWN0b3JIb29rKCk7IiwiaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi4vY29tcG9uZW50cy9Db250ZXh0JztcbmltcG9ydCB7IHVzZVJlZHV4Q29udGV4dCBhcyB1c2VEZWZhdWx0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi91c2VSZWR1eENvbnRleHQnO1xuLyoqXHJcbiAqIEhvb2sgZmFjdG9yeSwgd2hpY2ggY3JlYXRlcyBhIGB1c2VTdG9yZWAgaG9vayBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhY3QuQ29udGV4dH0gW2NvbnRleHQ9UmVhY3RSZWR1eENvbnRleHRdIENvbnRleHQgcGFzc2VkIHRvIHlvdXIgYDxQcm92aWRlcj5gLlxyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgYHVzZVN0b3JlYCBob29rIGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dC5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdG9yZUhvb2soY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0KSB7XG4gIGNvbnN0IHVzZVJlZHV4Q29udGV4dCA9IC8vIEB0cy1pZ25vcmVcbiAgY29udGV4dCA9PT0gUmVhY3RSZWR1eENvbnRleHQgPyB1c2VEZWZhdWx0UmVkdXhDb250ZXh0IDogKCkgPT4gdXNlQ29udGV4dChjb250ZXh0KTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVzZVN0b3JlKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHN0b3JlXG4gICAgfSA9IHVzZVJlZHV4Q29udGV4dCgpOyAvLyBAdHMtaWdub3JlXG5cbiAgICByZXR1cm4gc3RvcmU7XG4gIH07XG59XG4vKipcclxuICogQSBob29rIHRvIGFjY2VzcyB0aGUgcmVkdXggc3RvcmUuXHJcbiAqXHJcbiAqIEByZXR1cm5zIHthbnl9IHRoZSByZWR1eCBzdG9yZVxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKlxyXG4gKiBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXHJcbiAqIGltcG9ydCB7IHVzZVN0b3JlIH0gZnJvbSAncmVhY3QtcmVkdXgnXHJcbiAqXHJcbiAqIGV4cG9ydCBjb25zdCBFeGFtcGxlQ29tcG9uZW50ID0gKCkgPT4ge1xyXG4gKiAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmUoKVxyXG4gKiAgIHJldHVybiA8ZGl2PntzdG9yZS5nZXRTdGF0ZSgpfTwvZGl2PlxyXG4gKiB9XHJcbiAqL1xuXG5leHBvcnQgY29uc3QgdXNlU3RvcmUgPSAvKiNfX1BVUkVfXyovY3JlYXRlU3RvcmVIb29rKCk7IiwiLy8gVGhlIHByaW1hcnkgZW50cnkgcG9pbnQgYXNzdW1lcyB3ZSdyZSB3b3JraW5nIHdpdGggc3RhbmRhcmQgUmVhY3RET00vUk4sIGJ1dFxuLy8gb2xkZXIgdmVyc2lvbnMgdGhhdCBkbyBub3QgaW5jbHVkZSBgdXNlU3luY0V4dGVybmFsU3RvcmVgIChSZWFjdCAxNi45IC0gMTcueCkuXG4vLyBCZWNhdXNlIG9mIHRoYXQsIHRoZSB1c2VTeW5jRXh0ZXJuYWxTdG9yZSBjb21wYXQgc2hpbSBpcyBuZWVkZWQuXG5pbXBvcnQgeyB1c2VTeW5jRXh0ZXJuYWxTdG9yZSB9IGZyb20gJ3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL3NoaW0nO1xuaW1wb3J0IHsgdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IgfSBmcm9tICd1c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltL3dpdGgtc2VsZWN0b3InO1xuaW1wb3J0IHsgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgYXMgYmF0Y2ggfSBmcm9tICcuL3V0aWxzL3JlYWN0QmF0Y2hlZFVwZGF0ZXMnO1xuaW1wb3J0IHsgc2V0QmF0Y2ggfSBmcm9tICcuL3V0aWxzL2JhdGNoJztcbmltcG9ydCB7IGluaXRpYWxpemVVc2VTZWxlY3RvciB9IGZyb20gJy4vaG9va3MvdXNlU2VsZWN0b3InO1xuaW1wb3J0IHsgaW5pdGlhbGl6ZUNvbm5lY3QgfSBmcm9tICcuL2NvbXBvbmVudHMvY29ubmVjdCc7XG5pbml0aWFsaXplVXNlU2VsZWN0b3IodXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IpO1xuaW5pdGlhbGl6ZUNvbm5lY3QodXNlU3luY0V4dGVybmFsU3RvcmUpOyAvLyBFbmFibGUgYmF0Y2hlZCB1cGRhdGVzIGluIG91ciBzdWJzY3JpcHRpb25zIGZvciB1c2Vcbi8vIHdpdGggc3RhbmRhcmQgUmVhY3QgcmVuZGVyZXJzIChSZWFjdERPTSwgUmVhY3QgTmF0aXZlKVxuXG5zZXRCYXRjaChiYXRjaCk7XG5leHBvcnQgeyBiYXRjaCB9O1xuZXhwb3J0ICogZnJvbSAnLi9leHBvcnRzJzsiLCJleHBvcnQge307IiwiaW1wb3J0IHsgZ2V0QmF0Y2ggfSBmcm9tICcuL2JhdGNoJzsgLy8gZW5jYXBzdWxhdGVzIHRoZSBzdWJzY3JpcHRpb24gbG9naWMgZm9yIGNvbm5lY3RpbmcgYSBjb21wb25lbnQgdG8gdGhlIHJlZHV4IHN0b3JlLCBhc1xuLy8gd2VsbCBhcyBuZXN0aW5nIHN1YnNjcmlwdGlvbnMgb2YgZGVzY2VuZGFudCBjb21wb25lbnRzLCBzbyB0aGF0IHdlIGNhbiBlbnN1cmUgdGhlXG4vLyBhbmNlc3RvciBjb21wb25lbnRzIHJlLXJlbmRlciBiZWZvcmUgZGVzY2VuZGFudHNcblxuZnVuY3Rpb24gY3JlYXRlTGlzdGVuZXJDb2xsZWN0aW9uKCkge1xuICBjb25zdCBiYXRjaCA9IGdldEJhdGNoKCk7XG4gIGxldCBmaXJzdCA9IG51bGw7XG4gIGxldCBsYXN0ID0gbnVsbDtcbiAgcmV0dXJuIHtcbiAgICBjbGVhcigpIHtcbiAgICAgIGZpcnN0ID0gbnVsbDtcbiAgICAgIGxhc3QgPSBudWxsO1xuICAgIH0sXG5cbiAgICBub3RpZnkoKSB7XG4gICAgICBiYXRjaCgoKSA9PiB7XG4gICAgICAgIGxldCBsaXN0ZW5lciA9IGZpcnN0O1xuXG4gICAgICAgIHdoaWxlIChsaXN0ZW5lcikge1xuICAgICAgICAgIGxpc3RlbmVyLmNhbGxiYWNrKCk7XG4gICAgICAgICAgbGlzdGVuZXIgPSBsaXN0ZW5lci5uZXh0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgZ2V0KCkge1xuICAgICAgbGV0IGxpc3RlbmVycyA9IFtdO1xuICAgICAgbGV0IGxpc3RlbmVyID0gZmlyc3Q7XG5cbiAgICAgIHdoaWxlIChsaXN0ZW5lcikge1xuICAgICAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXIubmV4dDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxpc3RlbmVycztcbiAgICB9LFxuXG4gICAgc3Vic2NyaWJlKGNhbGxiYWNrKSB7XG4gICAgICBsZXQgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgIGxldCBsaXN0ZW5lciA9IGxhc3QgPSB7XG4gICAgICAgIGNhbGxiYWNrLFxuICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICBwcmV2OiBsYXN0XG4gICAgICB9O1xuXG4gICAgICBpZiAobGlzdGVuZXIucHJldikge1xuICAgICAgICBsaXN0ZW5lci5wcmV2Lm5leHQgPSBsaXN0ZW5lcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpcnN0ID0gbGlzdGVuZXI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpIHtcbiAgICAgICAgaWYgKCFpc1N1YnNjcmliZWQgfHwgZmlyc3QgPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgaXNTdWJzY3JpYmVkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGxpc3RlbmVyLm5leHQpIHtcbiAgICAgICAgICBsaXN0ZW5lci5uZXh0LnByZXYgPSBsaXN0ZW5lci5wcmV2O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxhc3QgPSBsaXN0ZW5lci5wcmV2O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpc3RlbmVyLnByZXYpIHtcbiAgICAgICAgICBsaXN0ZW5lci5wcmV2Lm5leHQgPSBsaXN0ZW5lci5uZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpcnN0ID0gbGlzdGVuZXIubmV4dDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgfTtcbn1cblxuY29uc3QgbnVsbExpc3RlbmVycyA9IHtcbiAgbm90aWZ5KCkge30sXG5cbiAgZ2V0OiAoKSA9PiBbXVxufTtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdWJzY3JpcHRpb24oc3RvcmUsIHBhcmVudFN1Yikge1xuICBsZXQgdW5zdWJzY3JpYmU7XG4gIGxldCBsaXN0ZW5lcnMgPSBudWxsTGlzdGVuZXJzO1xuXG4gIGZ1bmN0aW9uIGFkZE5lc3RlZFN1YihsaXN0ZW5lcikge1xuICAgIHRyeVN1YnNjcmliZSgpO1xuICAgIHJldHVybiBsaXN0ZW5lcnMuc3Vic2NyaWJlKGxpc3RlbmVyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vdGlmeU5lc3RlZFN1YnMoKSB7XG4gICAgbGlzdGVuZXJzLm5vdGlmeSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlQ2hhbmdlV3JhcHBlcigpIHtcbiAgICBpZiAoc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UpIHtcbiAgICAgIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNTdWJzY3JpYmVkKCkge1xuICAgIHJldHVybiBCb29sZWFuKHVuc3Vic2NyaWJlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyeVN1YnNjcmliZSgpIHtcbiAgICBpZiAoIXVuc3Vic2NyaWJlKSB7XG4gICAgICB1bnN1YnNjcmliZSA9IHBhcmVudFN1YiA/IHBhcmVudFN1Yi5hZGROZXN0ZWRTdWIoaGFuZGxlQ2hhbmdlV3JhcHBlcikgOiBzdG9yZS5zdWJzY3JpYmUoaGFuZGxlQ2hhbmdlV3JhcHBlcik7XG4gICAgICBsaXN0ZW5lcnMgPSBjcmVhdGVMaXN0ZW5lckNvbGxlY3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0cnlVbnN1YnNjcmliZSgpIHtcbiAgICBpZiAodW5zdWJzY3JpYmUpIHtcbiAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICB1bnN1YnNjcmliZSA9IHVuZGVmaW5lZDtcbiAgICAgIGxpc3RlbmVycy5jbGVhcigpO1xuICAgICAgbGlzdGVuZXJzID0gbnVsbExpc3RlbmVycztcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdWJzY3JpcHRpb24gPSB7XG4gICAgYWRkTmVzdGVkU3ViLFxuICAgIG5vdGlmeU5lc3RlZFN1YnMsXG4gICAgaGFuZGxlQ2hhbmdlV3JhcHBlcixcbiAgICBpc1N1YnNjcmliZWQsXG4gICAgdHJ5U3Vic2NyaWJlLFxuICAgIHRyeVVuc3Vic2NyaWJlLFxuICAgIGdldExpc3RlbmVyczogKCkgPT4gbGlzdGVuZXJzXG4gIH07XG4gIHJldHVybiBzdWJzY3JpcHRpb247XG59IiwiLy8gRGVmYXVsdCB0byBhIGR1bW15IFwiYmF0Y2hcIiBpbXBsZW1lbnRhdGlvbiB0aGF0IGp1c3QgcnVucyB0aGUgY2FsbGJhY2tcbmZ1bmN0aW9uIGRlZmF1bHROb29wQmF0Y2goY2FsbGJhY2spIHtcbiAgY2FsbGJhY2soKTtcbn1cblxubGV0IGJhdGNoID0gZGVmYXVsdE5vb3BCYXRjaDsgLy8gQWxsb3cgaW5qZWN0aW5nIGFub3RoZXIgYmF0Y2hpbmcgZnVuY3Rpb24gbGF0ZXJcblxuZXhwb3J0IGNvbnN0IHNldEJhdGNoID0gbmV3QmF0Y2ggPT4gYmF0Y2ggPSBuZXdCYXRjaDsgLy8gU3VwcGx5IGEgZ2V0dGVyIGp1c3QgdG8gc2tpcCBkZWFsaW5nIHdpdGggRVNNIGJpbmRpbmdzXG5cbmV4cG9ydCBjb25zdCBnZXRCYXRjaCA9ICgpID0+IGJhdGNoOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJpbmRBY3Rpb25DcmVhdG9ycyhhY3Rpb25DcmVhdG9ycywgZGlzcGF0Y2gpIHtcbiAgY29uc3QgYm91bmRBY3Rpb25DcmVhdG9ycyA9IHt9O1xuXG4gIGZvciAoY29uc3Qga2V5IGluIGFjdGlvbkNyZWF0b3JzKSB7XG4gICAgY29uc3QgYWN0aW9uQ3JlYXRvciA9IGFjdGlvbkNyZWF0b3JzW2tleV07XG5cbiAgICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGJvdW5kQWN0aW9uQ3JlYXRvcnNba2V5XSA9ICguLi5hcmdzKSA9PiBkaXNwYXRjaChhY3Rpb25DcmVhdG9yKC4uLmFyZ3MpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYm91bmRBY3Rpb25DcmVhdG9ycztcbn0iLCIvKipcclxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXHJcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBhcmd1bWVudCBhcHBlYXJzIHRvIGJlIGEgcGxhaW4gb2JqZWN0LlxyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgbGV0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG4gIGlmIChwcm90byA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gIGxldCBiYXNlUHJvdG8gPSBwcm90bztcblxuICB3aGlsZSAoT2JqZWN0LmdldFByb3RvdHlwZU9mKGJhc2VQcm90bykgIT09IG51bGwpIHtcbiAgICBiYXNlUHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYmFzZVByb3RvKTtcbiAgfVxuXG4gIHJldHVybiBwcm90byA9PT0gYmFzZVByb3RvO1xufSIsImV4cG9ydCB7IHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIH0gZnJvbSAncmVhY3QtZG9tJzsiLCJmdW5jdGlvbiBpcyh4LCB5KSB7XG4gIGlmICh4ID09PSB5KSB7XG4gICAgcmV0dXJuIHggIT09IDAgfHwgeSAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQikge1xuICBpZiAoaXMob2JqQSwgb2JqQikpIHJldHVybiB0cnVlO1xuXG4gIGlmICh0eXBlb2Ygb2JqQSAhPT0gJ29iamVjdCcgfHwgb2JqQSA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqQiAhPT0gJ29iamVjdCcgfHwgb2JqQiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2V5c0EubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmpCLCBrZXlzQVtpXSkgfHwgIWlzKG9iakFba2V5c0FbaV1dLCBvYmpCW2tleXNBW2ldXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn0iLCJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZUxheW91dEVmZmVjdCB9IGZyb20gJ3JlYWN0JzsgLy8gUmVhY3QgY3VycmVudGx5IHRocm93cyBhIHdhcm5pbmcgd2hlbiB1c2luZyB1c2VMYXlvdXRFZmZlY3Qgb24gdGhlIHNlcnZlci5cbi8vIFRvIGdldCBhcm91bmQgaXQsIHdlIGNhbiBjb25kaXRpb25hbGx5IHVzZUVmZmVjdCBvbiB0aGUgc2VydmVyIChuby1vcCkgYW5kXG4vLyB1c2VMYXlvdXRFZmZlY3QgaW4gdGhlIGJyb3dzZXIuIFdlIG5lZWQgdXNlTGF5b3V0RWZmZWN0IHRvIGVuc3VyZSB0aGUgc3RvcmVcbi8vIHN1YnNjcmlwdGlvbiBjYWxsYmFjayBhbHdheXMgaGFzIHRoZSBzZWxlY3RvciBmcm9tIHRoZSBsYXRlc3QgcmVuZGVyIGNvbW1pdFxuLy8gYXZhaWxhYmxlLCBvdGhlcndpc2UgYSBzdG9yZSB1cGRhdGUgbWF5IGhhcHBlbiBiZXR3ZWVuIHJlbmRlciBhbmQgdGhlIGVmZmVjdCxcbi8vIHdoaWNoIG1heSBjYXVzZSBtaXNzZWQgdXBkYXRlczsgd2UgYWxzbyBtdXN0IGVuc3VyZSB0aGUgc3RvcmUgc3Vic2NyaXB0aW9uXG4vLyBpcyBjcmVhdGVkIHN5bmNocm9ub3VzbHksIG90aGVyd2lzZSBhIHN0b3JlIHVwZGF0ZSBtYXkgb2NjdXIgYmVmb3JlIHRoZVxuLy8gc3Vic2NyaXB0aW9uIGlzIGNyZWF0ZWQgYW5kIGFuIGluY29uc2lzdGVudCBzdGF0ZSBtYXkgYmUgb2JzZXJ2ZWRcbi8vIE1hdGNoZXMgbG9naWMgaW4gUmVhY3QncyBgc2hhcmVkL0V4ZWN1dGlvbkVudmlyb25tZW50YCBmaWxlXG5cbmV4cG9ydCBjb25zdCBjYW5Vc2VET00gPSAhISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgIT09ICd1bmRlZmluZWQnKTtcbmV4cG9ydCBjb25zdCB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0ID0gY2FuVXNlRE9NID8gdXNlTGF5b3V0RWZmZWN0IDogdXNlRWZmZWN0OyIsImV4cG9ydCBjb25zdCBub3RJbml0aWFsaXplZCA9ICgpID0+IHtcbiAgdGhyb3cgbmV3IEVycm9yKCd1U0VTIG5vdCBpbml0aWFsaXplZCEnKTtcbn07IiwiaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSAnLi9pc1BsYWluT2JqZWN0JztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4vd2FybmluZyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2ZXJpZnlQbGFpbk9iamVjdCh2YWx1ZSwgZGlzcGxheU5hbWUsIG1ldGhvZE5hbWUpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgIHdhcm5pbmcoYCR7bWV0aG9kTmFtZX0oKSBpbiAke2Rpc3BsYXlOYW1lfSBtdXN0IHJldHVybiBhIHBsYWluIG9iamVjdC4gSW5zdGVhZCByZWNlaXZlZCAke3ZhbHVlfS5gKTtcbiAgfVxufSIsIi8qKlxyXG4gKiBQcmludHMgYSB3YXJuaW5nIGluIHRoZSBjb25zb2xlIGlmIGl0IGV4aXN0cy5cclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIHdhcm5pbmcgbWVzc2FnZS5cclxuICogQHJldHVybnMge3ZvaWR9XHJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd2FybmluZyhtZXNzYWdlKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gIH1cbiAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG5cblxuICB0cnkge1xuICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgaWYgeW91IGVuYWJsZVxuICAgIC8vIFwiYnJlYWsgb24gYWxsIGV4Y2VwdGlvbnNcIiBpbiB5b3VyIGNvbnNvbGUsXG4gICAgLy8gaXQgd291bGQgcGF1c2UgdGhlIGV4ZWN1dGlvbiBhdCB0aGlzIGxpbmUuXG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWVtcHR5ICovXG4gIH0gY2F0Y2ggKGUpIHt9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tZW1wdHkgKi9cblxufSIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LWlzLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gQVRURU5USU9OXG4vLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsXG4vLyBQbGVhc2UgY29uc2lkZXIgYWxzbyBhZGRpbmcgdG8gJ3JlYWN0LWRldnRvb2xzLXNoYXJlZC9zcmMvYmFja2VuZC9SZWFjdFN5bWJvbHMnXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50Jyk7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKTtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKTtcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKTtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKTtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0Jyk7XG52YXIgUkVBQ1RfU0VSVkVSX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnNlcnZlcl9jb250ZXh0Jyk7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpO1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKTtcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5Jyk7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGVuYWJsZVNjb3BlQVBJID0gZmFsc2U7IC8vIEV4cGVyaW1lbnRhbCBDcmVhdGUgRXZlbnQgSGFuZGxlIEFQSS5cbnZhciBlbmFibGVDYWNoZUVsZW1lbnQgPSBmYWxzZTtcbnZhciBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyA9IGZhbHNlOyAvLyBObyBrbm93biBidWdzLCBidXQgbmVlZHMgcGVyZm9ybWFuY2UgdGVzdGluZ1xuXG52YXIgZW5hYmxlTGVnYWN5SGlkZGVuID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaWJlclxuLy8gc3R1ZmYuIEludGVuZGVkIHRvIGVuYWJsZSBSZWFjdCBjb3JlIG1lbWJlcnMgdG8gbW9yZSBlYXNpbHkgZGVidWcgc2NoZWR1bGluZ1xuLy8gaXNzdWVzIGluIERFViBidWlsZHMuXG5cbnZhciBlbmFibGVEZWJ1Z1RyYWNpbmcgPSBmYWxzZTsgLy8gVHJhY2sgd2hpY2ggRmliZXIocykgc2NoZWR1bGUgcmVuZGVyIHdvcmsuXG5cbnZhciBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFO1xuXG57XG4gIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKCdyZWFjdC5tb2R1bGUucmVmZXJlbmNlJyk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBOb3RlOiB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyAoZS5nLiBpZiBpdCdzIGEgcG9seWZpbGwpLlxuXG5cbiAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCBlbmFibGVEZWJ1Z1RyYWNpbmcgIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgZW5hYmxlTGVnYWN5SGlkZGVuICB8fCB0eXBlID09PSBSRUFDVF9PRkZTQ1JFRU5fVFlQRSB8fCBlbmFibGVTY29wZUFQSSAgfHwgZW5hYmxlQ2FjaGVFbGVtZW50ICB8fCBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gVGhpcyBuZWVkcyB0byBpbmNsdWRlIGFsbCBwb3NzaWJsZSBtb2R1bGUgcmVmZXJlbmNlIG9iamVjdFxuICAgIC8vIHR5cGVzIHN1cHBvcnRlZCBieSBhbnkgRmxpZ2h0IGNvbmZpZ3VyYXRpb24gYW55d2hlcmUgc2luY2VcbiAgICAvLyB3ZSBkb24ndCBrbm93IHdoaWNoIEZsaWdodCBidWlsZCB0aGlzIHdpbGwgZW5kIHVwIGJlaW5nIHVzZWRcbiAgICAvLyB3aXRoLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgfHwgdHlwZS5nZXRNb2R1bGVJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHR5cGVPZihvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcblxuICAgIHN3aXRjaCAoJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICB2YXIgdHlwZSA9IG9iamVjdC50eXBlO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhciAkJHR5cGVvZlR5cGUgPSB0eXBlICYmIHR5cGUuJCR0eXBlb2Y7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoJCR0eXBlb2ZUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfU0VSVkVSX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mVHlwZTtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxudmFyIENvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlRFWFRfVFlQRTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSBSRUFDVF9QUk9WSURFUl9UWVBFO1xudmFyIEVsZW1lbnQgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG52YXIgRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG52YXIgRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xudmFyIExhenkgPSBSRUFDVF9MQVpZX1RZUEU7XG52YXIgTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcbnZhciBQb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbnZhciBQcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG52YXIgU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG52YXIgU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xudmFyIFN1c3BlbnNlTGlzdCA9IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IGZhbHNlO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQ29uY3VycmVudE1vZGUgPSBmYWxzZTsgLy8gQXN5bmNNb2RlIHNob3VsZCBiZSBkZXByZWNhdGVkXG5cbmZ1bmN0aW9uIGlzQXN5bmNNb2RlKG9iamVjdCkge1xuICB7XG4gICAgaWYgKCFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSkge1xuICAgICAgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSB0cnVlOyAvLyBVc2luZyBjb25zb2xlWyd3YXJuJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuXG4gICAgICBjb25zb2xlWyd3YXJuJ10oJ1RoZSBSZWFjdElzLmlzQXN5bmNNb2RlKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE4Ky4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICB7XG4gICAgaWYgKCFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE4Ky4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRDb25zdW1lcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05URVhUX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9WSURFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNGb3J3YXJkUmVmKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZyYWdtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0xhenkob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTEFaWV9UWVBFO1xufVxuZnVuY3Rpb24gaXNNZW1vKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX01FTU9fVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUG9ydGFsKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BPUlRBTF9UWVBFO1xufVxuZnVuY3Rpb24gaXNQcm9maWxlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdHJpY3RNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlTGlzdChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU7XG59XG5cbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5TdXNwZW5zZUxpc3QgPSBTdXNwZW5zZUxpc3Q7XG5leHBvcnRzLmlzQXN5bmNNb2RlID0gaXNBc3luY01vZGU7XG5leHBvcnRzLmlzQ29uY3VycmVudE1vZGUgPSBpc0NvbmN1cnJlbnRNb2RlO1xuZXhwb3J0cy5pc0NvbnRleHRDb25zdW1lciA9IGlzQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5pc0NvbnRleHRQcm92aWRlciA9IGlzQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG5leHBvcnRzLmlzRm9yd2FyZFJlZiA9IGlzRm9yd2FyZFJlZjtcbmV4cG9ydHMuaXNGcmFnbWVudCA9IGlzRnJhZ21lbnQ7XG5leHBvcnRzLmlzTGF6eSA9IGlzTGF6eTtcbmV4cG9ydHMuaXNNZW1vID0gaXNNZW1vO1xuZXhwb3J0cy5pc1BvcnRhbCA9IGlzUG9ydGFsO1xuZXhwb3J0cy5pc1Byb2ZpbGVyID0gaXNQcm9maWxlcjtcbmV4cG9ydHMuaXNTdHJpY3RNb2RlID0gaXNTdHJpY3RNb2RlO1xuZXhwb3J0cy5pc1N1c3BlbnNlID0gaXNTdXNwZW5zZTtcbmV4cG9ydHMuaXNTdXNwZW5zZUxpc3QgPSBpc1N1c3BlbnNlTGlzdDtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlO1xuZXhwb3J0cy50eXBlT2YgPSB0eXBlT2Y7XG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYXBhdGh5JyxcbiAgYXV0aG9yOiAnamFubmlrIHNpZWJlcnQgKGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5uaWtzKScsXG4gIGJhc2UwMDogJyMwMzFBMTYnLFxuICBiYXNlMDE6ICcjMEIzNDJEJyxcbiAgYmFzZTAyOiAnIzE4NEU0NScsXG4gIGJhc2UwMzogJyMyQjY4NUUnLFxuICBiYXNlMDQ6ICcjNUY5QzkyJyxcbiAgYmFzZTA1OiAnIzgxQjVBQycsXG4gIGJhc2UwNjogJyNBN0NFQzgnLFxuICBiYXNlMDc6ICcjRDJFN0U0JyxcbiAgYmFzZTA4OiAnIzNFOTY4OCcsXG4gIGJhc2UwOTogJyMzRTc5OTYnLFxuICBiYXNlMEE6ICcjM0U0Qzk2JyxcbiAgYmFzZTBCOiAnIzg4M0U5NicsXG4gIGJhc2UwQzogJyM5NjNFNEMnLFxuICBiYXNlMEQ6ICcjOTY4ODNFJyxcbiAgYmFzZTBFOiAnIzRDOTYzRScsXG4gIGJhc2UwRjogJyMzRTk2NUInXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdhc2hlcycsXG4gIGF1dGhvcjogJ2phbm5payBzaWViZXJ0IChodHRwczovL2dpdGh1Yi5jb20vamFubmlrcyknLFxuICBiYXNlMDA6ICcjMUMyMDIzJyxcbiAgYmFzZTAxOiAnIzM5M0Y0NScsXG4gIGJhc2UwMjogJyM1NjVFNjUnLFxuICBiYXNlMDM6ICcjNzQ3Qzg0JyxcbiAgYmFzZTA0OiAnI0FEQjNCQScsXG4gIGJhc2UwNTogJyNDN0NDRDEnLFxuICBiYXNlMDY6ICcjREZFMkU1JyxcbiAgYmFzZTA3OiAnI0YzRjRGNScsXG4gIGJhc2UwODogJyNDN0FFOTUnLFxuICBiYXNlMDk6ICcjQzdDNzk1JyxcbiAgYmFzZTBBOiAnI0FFQzc5NScsXG4gIGJhc2UwQjogJyM5NUM3QUUnLFxuICBiYXNlMEM6ICcjOTVBRUM3JyxcbiAgYmFzZTBEOiAnI0FFOTVDNycsXG4gIGJhc2UwRTogJyNDNzk1QUUnLFxuICBiYXNlMEY6ICcjQzc5NTk1J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYXRlbGllciBkdW5lJyxcbiAgYXV0aG9yOiAnYnJhbSBkZSBoYWFuIChodHRwOi8vYXRlbGllcmJyYW0uZ2l0aHViLmlvL3N5bnRheC1oaWdobGlnaHRpbmcvYXRlbGllci1zY2hlbWVzL2R1bmUpJyxcbiAgYmFzZTAwOiAnIzIwMjAxZCcsXG4gIGJhc2UwMTogJyMyOTI4MjQnLFxuICBiYXNlMDI6ICcjNmU2YjVlJyxcbiAgYmFzZTAzOiAnIzdkN2E2OCcsXG4gIGJhc2UwNDogJyM5OTk1ODAnLFxuICBiYXNlMDU6ICcjYTZhMjhjJyxcbiAgYmFzZTA2OiAnI2U4ZTRjZicsXG4gIGJhc2UwNzogJyNmZWZiZWMnLFxuICBiYXNlMDg6ICcjZDczNzM3JyxcbiAgYmFzZTA5OiAnI2I2NTYxMScsXG4gIGJhc2UwQTogJyNjZmIwMTcnLFxuICBiYXNlMEI6ICcjNjBhYzM5JyxcbiAgYmFzZTBDOiAnIzFmYWQ4MycsXG4gIGJhc2UwRDogJyM2Njg0ZTEnLFxuICBiYXNlMEU6ICcjYjg1NGQ0JyxcbiAgYmFzZTBGOiAnI2Q0MzU1Midcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2F0ZWxpZXIgZm9yZXN0JyxcbiAgYXV0aG9yOiAnYnJhbSBkZSBoYWFuIChodHRwOi8vYXRlbGllcmJyYW0uZ2l0aHViLmlvL3N5bnRheC1oaWdobGlnaHRpbmcvYXRlbGllci1zY2hlbWVzL2ZvcmVzdCknLFxuICBiYXNlMDA6ICcjMWIxOTE4JyxcbiAgYmFzZTAxOiAnIzJjMjQyMScsXG4gIGJhc2UwMjogJyM2ODYxNWUnLFxuICBiYXNlMDM6ICcjNzY2ZTZiJyxcbiAgYmFzZTA0OiAnIzljOTQ5MScsXG4gIGJhc2UwNTogJyNhOGExOWYnLFxuICBiYXNlMDY6ICcjZTZlMmUwJyxcbiAgYmFzZTA3OiAnI2YxZWZlZScsXG4gIGJhc2UwODogJyNmMjJjNDAnLFxuICBiYXNlMDk6ICcjZGY1MzIwJyxcbiAgYmFzZTBBOiAnI2Q1OTExYScsXG4gIGJhc2UwQjogJyM1YWI3MzgnLFxuICBiYXNlMEM6ICcjMDBhZDljJyxcbiAgYmFzZTBEOiAnIzQwN2VlNycsXG4gIGJhc2UwRTogJyM2NjY2ZWEnLFxuICBiYXNlMEY6ICcjYzMzZmYzJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYXRlbGllciBoZWF0aCcsXG4gIGF1dGhvcjogJ2JyYW0gZGUgaGFhbiAoaHR0cDovL2F0ZWxpZXJicmFtLmdpdGh1Yi5pby9zeW50YXgtaGlnaGxpZ2h0aW5nL2F0ZWxpZXItc2NoZW1lcy9oZWF0aCknLFxuICBiYXNlMDA6ICcjMWIxODFiJyxcbiAgYmFzZTAxOiAnIzI5MjMyOScsXG4gIGJhc2UwMjogJyM2OTVkNjknLFxuICBiYXNlMDM6ICcjNzc2OTc3JyxcbiAgYmFzZTA0OiAnIzllOGY5ZScsXG4gIGJhc2UwNTogJyNhYjliYWInLFxuICBiYXNlMDY6ICcjZDhjYWQ4JyxcbiAgYmFzZTA3OiAnI2Y3ZjNmNycsXG4gIGJhc2UwODogJyNjYTQwMmInLFxuICBiYXNlMDk6ICcjYTY1OTI2JyxcbiAgYmFzZTBBOiAnI2JiOGEzNScsXG4gIGJhc2UwQjogJyMzNzlhMzcnLFxuICBiYXNlMEM6ICcjMTU5MzkzJyxcbiAgYmFzZTBEOiAnIzUxNmFlYycsXG4gIGJhc2UwRTogJyM3YjU5YzAnLFxuICBiYXNlMEY6ICcjY2MzM2NjJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYXRlbGllciBsYWtlc2lkZScsXG4gIGF1dGhvcjogJ2JyYW0gZGUgaGFhbiAoaHR0cDovL2F0ZWxpZXJicmFtLmdpdGh1Yi5pby9zeW50YXgtaGlnaGxpZ2h0aW5nL2F0ZWxpZXItc2NoZW1lcy9sYWtlc2lkZS8pJyxcbiAgYmFzZTAwOiAnIzE2MWIxZCcsXG4gIGJhc2UwMTogJyMxZjI5MmUnLFxuICBiYXNlMDI6ICcjNTE2ZDdiJyxcbiAgYmFzZTAzOiAnIzVhN2I4YycsXG4gIGJhc2UwNDogJyM3MTk1YTgnLFxuICBiYXNlMDU6ICcjN2VhMmI0JyxcbiAgYmFzZTA2OiAnI2MxZTRmNicsXG4gIGJhc2UwNzogJyNlYmY4ZmYnLFxuICBiYXNlMDg6ICcjZDIyZDcyJyxcbiAgYmFzZTA5OiAnIzkzNWMyNScsXG4gIGJhc2UwQTogJyM4YThhMGYnLFxuICBiYXNlMEI6ICcjNTY4YzNiJyxcbiAgYmFzZTBDOiAnIzJkOGY2ZicsXG4gIGJhc2UwRDogJyMyNTdmYWQnLFxuICBiYXNlMEU6ICcjNWQ1ZGIxJyxcbiAgYmFzZTBGOiAnI2I3MmRkMidcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2F0ZWxpZXIgc2Vhc2lkZScsXG4gIGF1dGhvcjogJ2JyYW0gZGUgaGFhbiAoaHR0cDovL2F0ZWxpZXJicmFtLmdpdGh1Yi5pby9zeW50YXgtaGlnaGxpZ2h0aW5nL2F0ZWxpZXItc2NoZW1lcy9zZWFzaWRlLyknLFxuICBiYXNlMDA6ICcjMTMxNTEzJyxcbiAgYmFzZTAxOiAnIzI0MjkyNCcsXG4gIGJhc2UwMjogJyM1ZTZlNWUnLFxuICBiYXNlMDM6ICcjNjg3ZDY4JyxcbiAgYmFzZTA0OiAnIzgwOTk4MCcsXG4gIGJhc2UwNTogJyM4Y2E2OGMnLFxuICBiYXNlMDY6ICcjY2ZlOGNmJyxcbiAgYmFzZTA3OiAnI2YwZmZmMCcsXG4gIGJhc2UwODogJyNlNjE5M2MnLFxuICBiYXNlMDk6ICcjODc3MTFkJyxcbiAgYmFzZTBBOiAnI2MzYzMyMicsXG4gIGJhc2UwQjogJyMyOWEzMjknLFxuICBiYXNlMEM6ICcjMTk5OWIzJyxcbiAgYmFzZTBEOiAnIzNkNjJmNScsXG4gIGJhc2UwRTogJyNhZDJiZWUnLFxuICBiYXNlMEY6ICcjZTYxOWMzJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYmVzcGluJyxcbiAgYXV0aG9yOiAnamFuIHQuIHNvdHQnLFxuICBiYXNlMDA6ICcjMjgyMTFjJyxcbiAgYmFzZTAxOiAnIzM2MzEyZScsXG4gIGJhc2UwMjogJyM1ZTVkNWMnLFxuICBiYXNlMDM6ICcjNjY2NjY2JyxcbiAgYmFzZTA0OiAnIzc5Nzk3NycsXG4gIGJhc2UwNTogJyM4YTg5ODYnLFxuICBiYXNlMDY6ICcjOWQ5Yjk3JyxcbiAgYmFzZTA3OiAnI2JhYWU5ZScsXG4gIGJhc2UwODogJyNjZjZhNGMnLFxuICBiYXNlMDk6ICcjY2Y3ZDM0JyxcbiAgYmFzZTBBOiAnI2Y5ZWU5OCcsXG4gIGJhc2UwQjogJyM1NGJlMGQnLFxuICBiYXNlMEM6ICcjYWZjNGRiJyxcbiAgYmFzZTBEOiAnIzVlYTZlYScsXG4gIGJhc2UwRTogJyM5Yjg1OWQnLFxuICBiYXNlMEY6ICcjOTM3MTIxJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYnJld2VyJyxcbiAgYXV0aG9yOiAndGltb3Row6llIHBvaXNvdCAoaHR0cDovL2dpdGh1Yi5jb20vdHBvaXNvdCknLFxuICBiYXNlMDA6ICcjMGMwZDBlJyxcbiAgYmFzZTAxOiAnIzJlMmYzMCcsXG4gIGJhc2UwMjogJyM1MTUyNTMnLFxuICBiYXNlMDM6ICcjNzM3NDc1JyxcbiAgYmFzZTA0OiAnIzk1OTY5NycsXG4gIGJhc2UwNTogJyNiN2I4YjknLFxuICBiYXNlMDY6ICcjZGFkYmRjJyxcbiAgYmFzZTA3OiAnI2ZjZmRmZScsXG4gIGJhc2UwODogJyNlMzFhMWMnLFxuICBiYXNlMDk6ICcjZTY1NTBkJyxcbiAgYmFzZTBBOiAnI2RjYTA2MCcsXG4gIGJhc2UwQjogJyMzMWEzNTQnLFxuICBiYXNlMEM6ICcjODBiMWQzJyxcbiAgYmFzZTBEOiAnIzMxODJiZCcsXG4gIGJhc2UwRTogJyM3NTZiYjEnLFxuICBiYXNlMEY6ICcjYjE1OTI4J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYnJpZ2h0JyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzAwMDAwMCcsXG4gIGJhc2UwMTogJyMzMDMwMzAnLFxuICBiYXNlMDI6ICcjNTA1MDUwJyxcbiAgYmFzZTAzOiAnI2IwYjBiMCcsXG4gIGJhc2UwNDogJyNkMGQwZDAnLFxuICBiYXNlMDU6ICcjZTBlMGUwJyxcbiAgYmFzZTA2OiAnI2Y1ZjVmNScsXG4gIGJhc2UwNzogJyNmZmZmZmYnLFxuICBiYXNlMDg6ICcjZmIwMTIwJyxcbiAgYmFzZTA5OiAnI2ZjNmQyNCcsXG4gIGJhc2UwQTogJyNmZGEzMzEnLFxuICBiYXNlMEI6ICcjYTFjNjU5JyxcbiAgYmFzZTBDOiAnIzc2YzdiNycsXG4gIGJhc2UwRDogJyM2ZmIzZDInLFxuICBiYXNlMEU6ICcjZDM4MWMzJyxcbiAgYmFzZTBGOiAnI2JlNjQzYydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2NoYWxrJyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzE1MTUxNScsXG4gIGJhc2UwMTogJyMyMDIwMjAnLFxuICBiYXNlMDI6ICcjMzAzMDMwJyxcbiAgYmFzZTAzOiAnIzUwNTA1MCcsXG4gIGJhc2UwNDogJyNiMGIwYjAnLFxuICBiYXNlMDU6ICcjZDBkMGQwJyxcbiAgYmFzZTA2OiAnI2UwZTBlMCcsXG4gIGJhc2UwNzogJyNmNWY1ZjUnLFxuICBiYXNlMDg6ICcjZmI5ZmIxJyxcbiAgYmFzZTA5OiAnI2VkYTk4NycsXG4gIGJhc2UwQTogJyNkZGIyNmYnLFxuICBiYXNlMEI6ICcjYWNjMjY3JyxcbiAgYmFzZTBDOiAnIzEyY2ZjMCcsXG4gIGJhc2UwRDogJyM2ZmMyZWYnLFxuICBiYXNlMEU6ICcjZTFhM2VlJyxcbiAgYmFzZTBGOiAnI2RlYWY4Zidcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2NvZGVzY2hvb2wnLFxuICBhdXRob3I6ICdicmV0dG9mODYnLFxuICBiYXNlMDA6ICcjMjMyYzMxJyxcbiAgYmFzZTAxOiAnIzFjMzY1NycsXG4gIGJhc2UwMjogJyMyYTM0M2EnLFxuICBiYXNlMDM6ICcjM2Y0OTQ0JyxcbiAgYmFzZTA0OiAnIzg0ODk4YycsXG4gIGJhc2UwNTogJyM5ZWE3YTYnLFxuICBiYXNlMDY6ICcjYTdjZmEzJyxcbiAgYmFzZTA3OiAnI2I1ZDhmNicsXG4gIGJhc2UwODogJyMyYTU0OTEnLFxuICBiYXNlMDk6ICcjNDM4MjBkJyxcbiAgYmFzZTBBOiAnI2EwM2IxZScsXG4gIGJhc2UwQjogJyMyMzc5ODYnLFxuICBiYXNlMEM6ICcjYjAyZjMwJyxcbiAgYmFzZTBEOiAnIzQ4NGQ3OScsXG4gIGJhc2UwRTogJyNjNTk4MjAnLFxuICBiYXNlMEY6ICcjYzk4MzQ0J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnY29sb3JzJyxcbiAgYXV0aG9yOiAnbXJtcnMgKGh0dHA6Ly9jbHJzLmNjKScsXG4gIGJhc2UwMDogJyMxMTExMTEnLFxuICBiYXNlMDE6ICcjMzMzMzMzJyxcbiAgYmFzZTAyOiAnIzU1NTU1NScsXG4gIGJhc2UwMzogJyM3Nzc3NzcnLFxuICBiYXNlMDQ6ICcjOTk5OTk5JyxcbiAgYmFzZTA1OiAnI2JiYmJiYicsXG4gIGJhc2UwNjogJyNkZGRkZGQnLFxuICBiYXNlMDc6ICcjZmZmZmZmJyxcbiAgYmFzZTA4OiAnI2ZmNDEzNicsXG4gIGJhc2UwOTogJyNmZjg1MWInLFxuICBiYXNlMEE6ICcjZmZkYzAwJyxcbiAgYmFzZTBCOiAnIzJlY2M0MCcsXG4gIGJhc2UwQzogJyM3ZmRiZmYnLFxuICBiYXNlMEQ6ICcjMDA3NGQ5JyxcbiAgYmFzZTBFOiAnI2IxMGRjOScsXG4gIGJhc2UwRjogJyM4NTE0NGInXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdkZWZhdWx0JyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzE4MTgxOCcsXG4gIGJhc2UwMTogJyMyODI4MjgnLFxuICBiYXNlMDI6ICcjMzgzODM4JyxcbiAgYmFzZTAzOiAnIzU4NTg1OCcsXG4gIGJhc2UwNDogJyNiOGI4YjgnLFxuICBiYXNlMDU6ICcjZDhkOGQ4JyxcbiAgYmFzZTA2OiAnI2U4ZThlOCcsXG4gIGJhc2UwNzogJyNmOGY4ZjgnLFxuICBiYXNlMDg6ICcjYWI0NjQyJyxcbiAgYmFzZTA5OiAnI2RjOTY1NicsXG4gIGJhc2UwQTogJyNmN2NhODgnLFxuICBiYXNlMEI6ICcjYTFiNTZjJyxcbiAgYmFzZTBDOiAnIzg2YzFiOScsXG4gIGJhc2UwRDogJyM3Y2FmYzInLFxuICBiYXNlMEU6ICcjYmE4YmFmJyxcbiAgYmFzZTBGOiAnI2ExNjk0Nidcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2VpZ2h0aWVzJyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzJkMmQyZCcsXG4gIGJhc2UwMTogJyMzOTM5MzknLFxuICBiYXNlMDI6ICcjNTE1MTUxJyxcbiAgYmFzZTAzOiAnIzc0NzM2OScsXG4gIGJhc2UwNDogJyNhMDlmOTMnLFxuICBiYXNlMDU6ICcjZDNkMGM4JyxcbiAgYmFzZTA2OiAnI2U4ZTZkZicsXG4gIGJhc2UwNzogJyNmMmYwZWMnLFxuICBiYXNlMDg6ICcjZjI3NzdhJyxcbiAgYmFzZTA5OiAnI2Y5OTE1NycsXG4gIGJhc2UwQTogJyNmZmNjNjYnLFxuICBiYXNlMEI6ICcjOTljYzk5JyxcbiAgYmFzZTBDOiAnIzY2Y2NjYycsXG4gIGJhc2UwRDogJyM2Njk5Y2MnLFxuICBiYXNlMEU6ICcjY2M5OWNjJyxcbiAgYmFzZTBGOiAnI2QyN2I1Mydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2VtYmVycycsXG4gIGF1dGhvcjogJ2phbm5payBzaWViZXJ0IChodHRwczovL2dpdGh1Yi5jb20vamFubmlrcyknLFxuICBiYXNlMDA6ICcjMTYxMzBGJyxcbiAgYmFzZTAxOiAnIzJDMjYyMCcsXG4gIGJhc2UwMjogJyM0MzNCMzInLFxuICBiYXNlMDM6ICcjNUE1MDQ3JyxcbiAgYmFzZTA0OiAnIzhBODA3NScsXG4gIGJhc2UwNTogJyNBMzlBOTAnLFxuICBiYXNlMDY6ICcjQkVCNkFFJyxcbiAgYmFzZTA3OiAnI0RCRDZEMScsXG4gIGJhc2UwODogJyM4MjZENTcnLFxuICBiYXNlMDk6ICcjODI4MjU3JyxcbiAgYmFzZTBBOiAnIzZEODI1NycsXG4gIGJhc2UwQjogJyM1NzgyNkQnLFxuICBiYXNlMEM6ICcjNTc2RDgyJyxcbiAgYmFzZTBEOiAnIzZENTc4MicsXG4gIGJhc2UwRTogJyM4MjU3NkQnLFxuICBiYXNlMEY6ICcjODI1NzU3J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnZmxhdCcsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMyQzNFNTAnLFxuICBiYXNlMDE6ICcjMzQ0OTVFJyxcbiAgYmFzZTAyOiAnIzdGOEM4RCcsXG4gIGJhc2UwMzogJyM5NUE1QTYnLFxuICBiYXNlMDQ6ICcjQkRDM0M3JyxcbiAgYmFzZTA1OiAnI2UwZTBlMCcsXG4gIGJhc2UwNjogJyNmNWY1ZjUnLFxuICBiYXNlMDc6ICcjRUNGMEYxJyxcbiAgYmFzZTA4OiAnI0U3NEMzQycsXG4gIGJhc2UwOTogJyNFNjdFMjInLFxuICBiYXNlMEE6ICcjRjFDNDBGJyxcbiAgYmFzZTBCOiAnIzJFQ0M3MScsXG4gIGJhc2UwQzogJyMxQUJDOUMnLFxuICBiYXNlMEQ6ICcjMzQ5OERCJyxcbiAgYmFzZTBFOiAnIzlCNTlCNicsXG4gIGJhc2UwRjogJyNiZTY0M2MnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdnb29nbGUnLFxuICBhdXRob3I6ICdzZXRoIHdyaWdodCAoaHR0cDovL3NldGhhd3JpZ2h0LmNvbSknLFxuICBiYXNlMDA6ICcjMWQxZjIxJyxcbiAgYmFzZTAxOiAnIzI4MmEyZScsXG4gIGJhc2UwMjogJyMzNzNiNDEnLFxuICBiYXNlMDM6ICcjOTY5ODk2JyxcbiAgYmFzZTA0OiAnI2I0YjdiNCcsXG4gIGJhc2UwNTogJyNjNWM4YzYnLFxuICBiYXNlMDY6ICcjZTBlMGUwJyxcbiAgYmFzZTA3OiAnI2ZmZmZmZicsXG4gIGJhc2UwODogJyNDQzM0MkInLFxuICBiYXNlMDk6ICcjRjk2QTM4JyxcbiAgYmFzZTBBOiAnI0ZCQTkyMicsXG4gIGJhc2UwQjogJyMxOTg4NDQnLFxuICBiYXNlMEM6ICcjMzk3MUVEJyxcbiAgYmFzZTBEOiAnIzM5NzFFRCcsXG4gIGJhc2UwRTogJyNBMzZBQzcnLFxuICBiYXNlMEY6ICcjMzk3MUVEJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnZ3JheXNjYWxlJyxcbiAgYXV0aG9yOiAnYWxleGFuZHJlIGdhdmlvbGkgKGh0dHBzOi8vZ2l0aHViLmNvbS9hbGV4eDIvKScsXG4gIGJhc2UwMDogJyMxMDEwMTAnLFxuICBiYXNlMDE6ICcjMjUyNTI1JyxcbiAgYmFzZTAyOiAnIzQ2NDY0NicsXG4gIGJhc2UwMzogJyM1MjUyNTInLFxuICBiYXNlMDQ6ICcjYWJhYmFiJyxcbiAgYmFzZTA1OiAnI2I5YjliOScsXG4gIGJhc2UwNjogJyNlM2UzZTMnLFxuICBiYXNlMDc6ICcjZjdmN2Y3JyxcbiAgYmFzZTA4OiAnIzdjN2M3YycsXG4gIGJhc2UwOTogJyM5OTk5OTknLFxuICBiYXNlMEE6ICcjYTBhMGEwJyxcbiAgYmFzZTBCOiAnIzhlOGU4ZScsXG4gIGJhc2UwQzogJyM4Njg2ODYnLFxuICBiYXNlMEQ6ICcjNjg2ODY4JyxcbiAgYmFzZTBFOiAnIzc0NzQ3NCcsXG4gIGJhc2UwRjogJyM1ZTVlNWUnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdncmVlbiBzY3JlZW4nLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMDAxMTAwJyxcbiAgYmFzZTAxOiAnIzAwMzMwMCcsXG4gIGJhc2UwMjogJyMwMDU1MDAnLFxuICBiYXNlMDM6ICcjMDA3NzAwJyxcbiAgYmFzZTA0OiAnIzAwOTkwMCcsXG4gIGJhc2UwNTogJyMwMGJiMDAnLFxuICBiYXNlMDY6ICcjMDBkZDAwJyxcbiAgYmFzZTA3OiAnIzAwZmYwMCcsXG4gIGJhc2UwODogJyMwMDc3MDAnLFxuICBiYXNlMDk6ICcjMDA5OTAwJyxcbiAgYmFzZTBBOiAnIzAwNzcwMCcsXG4gIGJhc2UwQjogJyMwMGJiMDAnLFxuICBiYXNlMEM6ICcjMDA1NTAwJyxcbiAgYmFzZTBEOiAnIzAwOTkwMCcsXG4gIGJhc2UwRTogJyMwMGJiMDAnLFxuICBiYXNlMEY6ICcjMDA1NTAwJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnaGFybW9uaWMxNicsXG4gIGF1dGhvcjogJ2phbm5payBzaWViZXJ0IChodHRwczovL2dpdGh1Yi5jb20vamFubmlrcyknLFxuICBiYXNlMDA6ICcjMGIxYzJjJyxcbiAgYmFzZTAxOiAnIzIyM2I1NCcsXG4gIGJhc2UwMjogJyM0MDVjNzknLFxuICBiYXNlMDM6ICcjNjI3ZTk5JyxcbiAgYmFzZTA0OiAnI2FhYmNjZScsXG4gIGJhc2UwNTogJyNjYmQ2ZTInLFxuICBiYXNlMDY6ICcjZTVlYmYxJyxcbiAgYmFzZTA3OiAnI2Y3ZjlmYicsXG4gIGJhc2UwODogJyNiZjhiNTYnLFxuICBiYXNlMDk6ICcjYmZiZjU2JyxcbiAgYmFzZTBBOiAnIzhiYmY1NicsXG4gIGJhc2UwQjogJyM1NmJmOGInLFxuICBiYXNlMEM6ICcjNTY4YmJmJyxcbiAgYmFzZTBEOiAnIzhiNTZiZicsXG4gIGJhc2UwRTogJyNiZjU2OGInLFxuICBiYXNlMEY6ICcjYmY1NjU2J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnaG9wc2NvdGNoJyxcbiAgYXV0aG9yOiAnamFuIHQuIHNvdHQnLFxuICBiYXNlMDA6ICcjMzIyOTMxJyxcbiAgYmFzZTAxOiAnIzQzM2I0MicsXG4gIGJhc2UwMjogJyM1YzU0NWInLFxuICBiYXNlMDM6ICcjNzk3Mzc5JyxcbiAgYmFzZTA0OiAnIzk4OTQ5OCcsXG4gIGJhc2UwNTogJyNiOWI1YjgnLFxuICBiYXNlMDY6ICcjZDVkM2Q1JyxcbiAgYmFzZTA3OiAnI2ZmZmZmZicsXG4gIGJhc2UwODogJyNkZDQ2NGMnLFxuICBiYXNlMDk6ICcjZmQ4YjE5JyxcbiAgYmFzZTBBOiAnI2ZkY2M1OScsXG4gIGJhc2UwQjogJyM4ZmMxM2UnLFxuICBiYXNlMEM6ICcjMTQ5YjkzJyxcbiAgYmFzZTBEOiAnIzEyOTBiZicsXG4gIGJhc2UwRTogJyNjODVlN2MnLFxuICBiYXNlMEY6ICcjYjMzNTA4J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlKG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqWydkZWZhdWx0J10gOiBvYmo7IH1cblxudmFyIF90aHJlZXplcm90d29mb3VyID0gcmVxdWlyZSgnLi90aHJlZXplcm90d29mb3VyJyk7XG5cbmV4cG9ydHMudGhyZWV6ZXJvdHdvZm91ciA9IF9pbnRlcm9wUmVxdWlyZShfdGhyZWV6ZXJvdHdvZm91cik7XG5cbnZhciBfYXBhdGh5ID0gcmVxdWlyZSgnLi9hcGF0aHknKTtcblxuZXhwb3J0cy5hcGF0aHkgPSBfaW50ZXJvcFJlcXVpcmUoX2FwYXRoeSk7XG5cbnZhciBfYXNoZXMgPSByZXF1aXJlKCcuL2FzaGVzJyk7XG5cbmV4cG9ydHMuYXNoZXMgPSBfaW50ZXJvcFJlcXVpcmUoX2FzaGVzKTtcblxudmFyIF9hdGVsaWVyRHVuZSA9IHJlcXVpcmUoJy4vYXRlbGllci1kdW5lJyk7XG5cbmV4cG9ydHMuYXRlbGllckR1bmUgPSBfaW50ZXJvcFJlcXVpcmUoX2F0ZWxpZXJEdW5lKTtcblxudmFyIF9hdGVsaWVyRm9yZXN0ID0gcmVxdWlyZSgnLi9hdGVsaWVyLWZvcmVzdCcpO1xuXG5leHBvcnRzLmF0ZWxpZXJGb3Jlc3QgPSBfaW50ZXJvcFJlcXVpcmUoX2F0ZWxpZXJGb3Jlc3QpO1xuXG52YXIgX2F0ZWxpZXJIZWF0aCA9IHJlcXVpcmUoJy4vYXRlbGllci1oZWF0aCcpO1xuXG5leHBvcnRzLmF0ZWxpZXJIZWF0aCA9IF9pbnRlcm9wUmVxdWlyZShfYXRlbGllckhlYXRoKTtcblxudmFyIF9hdGVsaWVyTGFrZXNpZGUgPSByZXF1aXJlKCcuL2F0ZWxpZXItbGFrZXNpZGUnKTtcblxuZXhwb3J0cy5hdGVsaWVyTGFrZXNpZGUgPSBfaW50ZXJvcFJlcXVpcmUoX2F0ZWxpZXJMYWtlc2lkZSk7XG5cbnZhciBfYXRlbGllclNlYXNpZGUgPSByZXF1aXJlKCcuL2F0ZWxpZXItc2Vhc2lkZScpO1xuXG5leHBvcnRzLmF0ZWxpZXJTZWFzaWRlID0gX2ludGVyb3BSZXF1aXJlKF9hdGVsaWVyU2Vhc2lkZSk7XG5cbnZhciBfYmVzcGluID0gcmVxdWlyZSgnLi9iZXNwaW4nKTtcblxuZXhwb3J0cy5iZXNwaW4gPSBfaW50ZXJvcFJlcXVpcmUoX2Jlc3Bpbik7XG5cbnZhciBfYnJld2VyID0gcmVxdWlyZSgnLi9icmV3ZXInKTtcblxuZXhwb3J0cy5icmV3ZXIgPSBfaW50ZXJvcFJlcXVpcmUoX2JyZXdlcik7XG5cbnZhciBfYnJpZ2h0ID0gcmVxdWlyZSgnLi9icmlnaHQnKTtcblxuZXhwb3J0cy5icmlnaHQgPSBfaW50ZXJvcFJlcXVpcmUoX2JyaWdodCk7XG5cbnZhciBfY2hhbGsgPSByZXF1aXJlKCcuL2NoYWxrJyk7XG5cbmV4cG9ydHMuY2hhbGsgPSBfaW50ZXJvcFJlcXVpcmUoX2NoYWxrKTtcblxudmFyIF9jb2Rlc2Nob29sID0gcmVxdWlyZSgnLi9jb2Rlc2Nob29sJyk7XG5cbmV4cG9ydHMuY29kZXNjaG9vbCA9IF9pbnRlcm9wUmVxdWlyZShfY29kZXNjaG9vbCk7XG5cbnZhciBfY29sb3JzID0gcmVxdWlyZSgnLi9jb2xvcnMnKTtcblxuZXhwb3J0cy5jb2xvcnMgPSBfaW50ZXJvcFJlcXVpcmUoX2NvbG9ycyk7XG5cbnZhciBfZGVmYXVsdCA9IHJlcXVpcmUoJy4vZGVmYXVsdCcpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBfaW50ZXJvcFJlcXVpcmUoX2RlZmF1bHQpO1xuXG52YXIgX2VpZ2h0aWVzID0gcmVxdWlyZSgnLi9laWdodGllcycpO1xuXG5leHBvcnRzLmVpZ2h0aWVzID0gX2ludGVyb3BSZXF1aXJlKF9laWdodGllcyk7XG5cbnZhciBfZW1iZXJzID0gcmVxdWlyZSgnLi9lbWJlcnMnKTtcblxuZXhwb3J0cy5lbWJlcnMgPSBfaW50ZXJvcFJlcXVpcmUoX2VtYmVycyk7XG5cbnZhciBfZmxhdCA9IHJlcXVpcmUoJy4vZmxhdCcpO1xuXG5leHBvcnRzLmZsYXQgPSBfaW50ZXJvcFJlcXVpcmUoX2ZsYXQpO1xuXG52YXIgX2dvb2dsZSA9IHJlcXVpcmUoJy4vZ29vZ2xlJyk7XG5cbmV4cG9ydHMuZ29vZ2xlID0gX2ludGVyb3BSZXF1aXJlKF9nb29nbGUpO1xuXG52YXIgX2dyYXlzY2FsZSA9IHJlcXVpcmUoJy4vZ3JheXNjYWxlJyk7XG5cbmV4cG9ydHMuZ3JheXNjYWxlID0gX2ludGVyb3BSZXF1aXJlKF9ncmF5c2NhbGUpO1xuXG52YXIgX2dyZWVuc2NyZWVuID0gcmVxdWlyZSgnLi9ncmVlbnNjcmVlbicpO1xuXG5leHBvcnRzLmdyZWVuc2NyZWVuID0gX2ludGVyb3BSZXF1aXJlKF9ncmVlbnNjcmVlbik7XG5cbnZhciBfaGFybW9uaWMgPSByZXF1aXJlKCcuL2hhcm1vbmljJyk7XG5cbmV4cG9ydHMuaGFybW9uaWMgPSBfaW50ZXJvcFJlcXVpcmUoX2hhcm1vbmljKTtcblxudmFyIF9ob3BzY290Y2ggPSByZXF1aXJlKCcuL2hvcHNjb3RjaCcpO1xuXG5leHBvcnRzLmhvcHNjb3RjaCA9IF9pbnRlcm9wUmVxdWlyZShfaG9wc2NvdGNoKTtcblxudmFyIF9pc290b3BlID0gcmVxdWlyZSgnLi9pc290b3BlJyk7XG5cbmV4cG9ydHMuaXNvdG9wZSA9IF9pbnRlcm9wUmVxdWlyZShfaXNvdG9wZSk7XG5cbnZhciBfbWFycmFrZXNoID0gcmVxdWlyZSgnLi9tYXJyYWtlc2gnKTtcblxuZXhwb3J0cy5tYXJyYWtlc2ggPSBfaW50ZXJvcFJlcXVpcmUoX21hcnJha2VzaCk7XG5cbnZhciBfbW9jaGEgPSByZXF1aXJlKCcuL21vY2hhJyk7XG5cbmV4cG9ydHMubW9jaGEgPSBfaW50ZXJvcFJlcXVpcmUoX21vY2hhKTtcblxudmFyIF9tb25va2FpID0gcmVxdWlyZSgnLi9tb25va2FpJyk7XG5cbmV4cG9ydHMubW9ub2thaSA9IF9pbnRlcm9wUmVxdWlyZShfbW9ub2thaSk7XG5cbnZhciBfb2NlYW4gPSByZXF1aXJlKCcuL29jZWFuJyk7XG5cbmV4cG9ydHMub2NlYW4gPSBfaW50ZXJvcFJlcXVpcmUoX29jZWFuKTtcblxudmFyIF9wYXJhaXNvID0gcmVxdWlyZSgnLi9wYXJhaXNvJyk7XG5cbmV4cG9ydHMucGFyYWlzbyA9IF9pbnRlcm9wUmVxdWlyZShfcGFyYWlzbyk7XG5cbnZhciBfcG9wID0gcmVxdWlyZSgnLi9wb3AnKTtcblxuZXhwb3J0cy5wb3AgPSBfaW50ZXJvcFJlcXVpcmUoX3BvcCk7XG5cbnZhciBfcmFpbHNjYXN0cyA9IHJlcXVpcmUoJy4vcmFpbHNjYXN0cycpO1xuXG5leHBvcnRzLnJhaWxzY2FzdHMgPSBfaW50ZXJvcFJlcXVpcmUoX3JhaWxzY2FzdHMpO1xuXG52YXIgX3NoYXBlc2hpZnRlciA9IHJlcXVpcmUoJy4vc2hhcGVzaGlmdGVyJyk7XG5cbmV4cG9ydHMuc2hhcGVzaGlmdGVyID0gX2ludGVyb3BSZXF1aXJlKF9zaGFwZXNoaWZ0ZXIpO1xuXG52YXIgX3NvbGFyaXplZCA9IHJlcXVpcmUoJy4vc29sYXJpemVkJyk7XG5cbmV4cG9ydHMuc29sYXJpemVkID0gX2ludGVyb3BSZXF1aXJlKF9zb2xhcml6ZWQpO1xuXG52YXIgX3N1bW1lcmZydWl0ID0gcmVxdWlyZSgnLi9zdW1tZXJmcnVpdCcpO1xuXG5leHBvcnRzLnN1bW1lcmZydWl0ID0gX2ludGVyb3BSZXF1aXJlKF9zdW1tZXJmcnVpdCk7XG5cbnZhciBfdG9tb3Jyb3cgPSByZXF1aXJlKCcuL3RvbW9ycm93Jyk7XG5cbmV4cG9ydHMudG9tb3Jyb3cgPSBfaW50ZXJvcFJlcXVpcmUoX3RvbW9ycm93KTtcblxudmFyIF90dWJlID0gcmVxdWlyZSgnLi90dWJlJyk7XG5cbmV4cG9ydHMudHViZSA9IF9pbnRlcm9wUmVxdWlyZShfdHViZSk7XG5cbnZhciBfdHdpbGlnaHQgPSByZXF1aXJlKCcuL3R3aWxpZ2h0Jyk7XG5cbmV4cG9ydHMudHdpbGlnaHQgPSBfaW50ZXJvcFJlcXVpcmUoX3R3aWxpZ2h0KTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2lzb3RvcGUnLFxuICBhdXRob3I6ICdqYW4gdC4gc290dCcsXG4gIGJhc2UwMDogJyMwMDAwMDAnLFxuICBiYXNlMDE6ICcjNDA0MDQwJyxcbiAgYmFzZTAyOiAnIzYwNjA2MCcsXG4gIGJhc2UwMzogJyM4MDgwODAnLFxuICBiYXNlMDQ6ICcjYzBjMGMwJyxcbiAgYmFzZTA1OiAnI2QwZDBkMCcsXG4gIGJhc2UwNjogJyNlMGUwZTAnLFxuICBiYXNlMDc6ICcjZmZmZmZmJyxcbiAgYmFzZTA4OiAnI2ZmMDAwMCcsXG4gIGJhc2UwOTogJyNmZjk5MDAnLFxuICBiYXNlMEE6ICcjZmYwMDk5JyxcbiAgYmFzZTBCOiAnIzMzZmYwMCcsXG4gIGJhc2UwQzogJyMwMGZmZmYnLFxuICBiYXNlMEQ6ICcjMDA2NmZmJyxcbiAgYmFzZTBFOiAnI2NjMDBmZicsXG4gIGJhc2UwRjogJyMzMzAwZmYnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdtYXJyYWtlc2gnLFxuICBhdXRob3I6ICdhbGV4YW5kcmUgZ2F2aW9saSAoaHR0cDovL2dpdGh1Yi5jb20vYWxleHgyLyknLFxuICBiYXNlMDA6ICcjMjAxNjAyJyxcbiAgYmFzZTAxOiAnIzMwMmUwMCcsXG4gIGJhc2UwMjogJyM1ZjViMTcnLFxuICBiYXNlMDM6ICcjNmM2ODIzJyxcbiAgYmFzZTA0OiAnIzg2ODEzYicsXG4gIGJhc2UwNTogJyM5NDhlNDgnLFxuICBiYXNlMDY6ICcjY2NjMzdhJyxcbiAgYmFzZTA3OiAnI2ZhZjBhNScsXG4gIGJhc2UwODogJyNjMzUzNTknLFxuICBiYXNlMDk6ICcjYjM2MTQ0JyxcbiAgYmFzZTBBOiAnI2E4ODMzOScsXG4gIGJhc2UwQjogJyMxODk3NGUnLFxuICBiYXNlMEM6ICcjNzVhNzM4JyxcbiAgYmFzZTBEOiAnIzQ3N2NhMScsXG4gIGJhc2UwRTogJyM4ODY4YjMnLFxuICBiYXNlMEY6ICcjYjM1ODhlJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnbW9jaGEnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjM0IzMjI4JyxcbiAgYmFzZTAxOiAnIzUzNDYzNicsXG4gIGJhc2UwMjogJyM2NDUyNDAnLFxuICBiYXNlMDM6ICcjN2U3MDVhJyxcbiAgYmFzZTA0OiAnI2I4YWZhZCcsXG4gIGJhc2UwNTogJyNkMGM4YzYnLFxuICBiYXNlMDY6ICcjZTllMWRkJyxcbiAgYmFzZTA3OiAnI2Y1ZWVlYicsXG4gIGJhc2UwODogJyNjYjYwNzcnLFxuICBiYXNlMDk6ICcjZDI4YjcxJyxcbiAgYmFzZTBBOiAnI2Y0YmM4NycsXG4gIGJhc2UwQjogJyNiZWI1NWInLFxuICBiYXNlMEM6ICcjN2JiZGE0JyxcbiAgYmFzZTBEOiAnIzhhYjNiNScsXG4gIGJhc2UwRTogJyNhODliYjknLFxuICBiYXNlMEY6ICcjYmI5NTg0J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnbW9ub2thaScsXG4gIGF1dGhvcjogJ3dpbWVyIGhhemVuYmVyZyAoaHR0cDovL3d3dy5tb25va2FpLm5sKScsXG4gIGJhc2UwMDogJyMyNzI4MjInLFxuICBiYXNlMDE6ICcjMzgzODMwJyxcbiAgYmFzZTAyOiAnIzQ5NDgzZScsXG4gIGJhc2UwMzogJyM3NTcxNWUnLFxuICBiYXNlMDQ6ICcjYTU5Zjg1JyxcbiAgYmFzZTA1OiAnI2Y4ZjhmMicsXG4gIGJhc2UwNjogJyNmNWY0ZjEnLFxuICBiYXNlMDc6ICcjZjlmOGY1JyxcbiAgYmFzZTA4OiAnI2Y5MjY3MicsXG4gIGJhc2UwOTogJyNmZDk3MWYnLFxuICBiYXNlMEE6ICcjZjRiZjc1JyxcbiAgYmFzZTBCOiAnI2E2ZTIyZScsXG4gIGJhc2UwQzogJyNhMWVmZTQnLFxuICBiYXNlMEQ6ICcjNjZkOWVmJyxcbiAgYmFzZTBFOiAnI2FlODFmZicsXG4gIGJhc2UwRjogJyNjYzY2MzMnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdvY2VhbicsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMyYjMwM2InLFxuICBiYXNlMDE6ICcjMzQzZDQ2JyxcbiAgYmFzZTAyOiAnIzRmNWI2NicsXG4gIGJhc2UwMzogJyM2NTczN2UnLFxuICBiYXNlMDQ6ICcjYTdhZGJhJyxcbiAgYmFzZTA1OiAnI2MwYzVjZScsXG4gIGJhc2UwNjogJyNkZmUxZTgnLFxuICBiYXNlMDc6ICcjZWZmMWY1JyxcbiAgYmFzZTA4OiAnI2JmNjE2YScsXG4gIGJhc2UwOTogJyNkMDg3NzAnLFxuICBiYXNlMEE6ICcjZWJjYjhiJyxcbiAgYmFzZTBCOiAnI2EzYmU4YycsXG4gIGJhc2UwQzogJyM5NmI1YjQnLFxuICBiYXNlMEQ6ICcjOGZhMWIzJyxcbiAgYmFzZTBFOiAnI2I0OGVhZCcsXG4gIGJhc2UwRjogJyNhYjc5NjcnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdwYXJhaXNvJyxcbiAgYXV0aG9yOiAnamFuIHQuIHNvdHQnLFxuICBiYXNlMDA6ICcjMmYxZTJlJyxcbiAgYmFzZTAxOiAnIzQxMzIzZicsXG4gIGJhc2UwMjogJyM0ZjQyNGMnLFxuICBiYXNlMDM6ICcjNzc2ZTcxJyxcbiAgYmFzZTA0OiAnIzhkODY4NycsXG4gIGJhc2UwNTogJyNhMzllOWInLFxuICBiYXNlMDY6ICcjYjliNmIwJyxcbiAgYmFzZTA3OiAnI2U3ZTlkYicsXG4gIGJhc2UwODogJyNlZjYxNTUnLFxuICBiYXNlMDk6ICcjZjk5YjE1JyxcbiAgYmFzZTBBOiAnI2ZlYzQxOCcsXG4gIGJhc2UwQjogJyM0OGI2ODUnLFxuICBiYXNlMEM6ICcjNWJjNGJmJyxcbiAgYmFzZTBEOiAnIzA2YjZlZicsXG4gIGJhc2UwRTogJyM4MTViYTQnLFxuICBiYXNlMEY6ICcjZTk2YmE4J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAncG9wJyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzAwMDAwMCcsXG4gIGJhc2UwMTogJyMyMDIwMjAnLFxuICBiYXNlMDI6ICcjMzAzMDMwJyxcbiAgYmFzZTAzOiAnIzUwNTA1MCcsXG4gIGJhc2UwNDogJyNiMGIwYjAnLFxuICBiYXNlMDU6ICcjZDBkMGQwJyxcbiAgYmFzZTA2OiAnI2UwZTBlMCcsXG4gIGJhc2UwNzogJyNmZmZmZmYnLFxuICBiYXNlMDg6ICcjZWIwMDhhJyxcbiAgYmFzZTA5OiAnI2YyOTMzMycsXG4gIGJhc2UwQTogJyNmOGNhMTInLFxuICBiYXNlMEI6ICcjMzdiMzQ5JyxcbiAgYmFzZTBDOiAnIzAwYWFiYicsXG4gIGJhc2UwRDogJyMwZTVhOTQnLFxuICBiYXNlMEU6ICcjYjMxZThkJyxcbiAgYmFzZTBGOiAnIzdhMmQwMCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ3JhaWxzY2FzdHMnLFxuICBhdXRob3I6ICdyeWFuIGJhdGVzIChodHRwOi8vcmFpbHNjYXN0cy5jb20pJyxcbiAgYmFzZTAwOiAnIzJiMmIyYicsXG4gIGJhc2UwMTogJyMyNzI5MzUnLFxuICBiYXNlMDI6ICcjM2E0MDU1JyxcbiAgYmFzZTAzOiAnIzVhNjQ3ZScsXG4gIGJhc2UwNDogJyNkNGNmYzknLFxuICBiYXNlMDU6ICcjZTZlMWRjJyxcbiAgYmFzZTA2OiAnI2Y0ZjFlZCcsXG4gIGJhc2UwNzogJyNmOWY3ZjMnLFxuICBiYXNlMDg6ICcjZGE0OTM5JyxcbiAgYmFzZTA5OiAnI2NjNzgzMycsXG4gIGJhc2UwQTogJyNmZmM2NmQnLFxuICBiYXNlMEI6ICcjYTVjMjYxJyxcbiAgYmFzZTBDOiAnIzUxOWY1MCcsXG4gIGJhc2UwRDogJyM2ZDljYmUnLFxuICBiYXNlMEU6ICcjYjZiM2ViJyxcbiAgYmFzZTBGOiAnI2JjOTQ1OCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ3NoYXBlc2hpZnRlcicsXG4gIGF1dGhvcjogJ3R5bGVyIGJlbnppZ2VyIChodHRwOi8vdHliZW56LmNvbSknLFxuICBiYXNlMDA6ICcjMDAwMDAwJyxcbiAgYmFzZTAxOiAnIzA0MDQwNCcsXG4gIGJhc2UwMjogJyMxMDIwMTUnLFxuICBiYXNlMDM6ICcjMzQzNDM0JyxcbiAgYmFzZTA0OiAnIzU1NTU1NScsXG4gIGJhc2UwNTogJyNhYmFiYWInLFxuICBiYXNlMDY6ICcjZTBlMGUwJyxcbiAgYmFzZTA3OiAnI2Y5ZjlmOScsXG4gIGJhc2UwODogJyNlOTJmMmYnLFxuICBiYXNlMDk6ICcjZTA5NDQ4JyxcbiAgYmFzZTBBOiAnI2RkZGQxMycsXG4gIGJhc2UwQjogJyMwZWQ4MzknLFxuICBiYXNlMEM6ICcjMjNlZGRhJyxcbiAgYmFzZTBEOiAnIzNiNDhlMycsXG4gIGJhc2UwRTogJyNmOTk2ZTInLFxuICBiYXNlMEY6ICcjNjk1NDJkJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnc29sYXJpemVkJyxcbiAgYXV0aG9yOiAnZXRoYW4gc2Nob29ub3ZlciAoaHR0cDovL2V0aGFuc2Nob29ub3Zlci5jb20vc29sYXJpemVkKScsXG4gIGJhc2UwMDogJyMwMDJiMzYnLFxuICBiYXNlMDE6ICcjMDczNjQyJyxcbiAgYmFzZTAyOiAnIzU4NmU3NScsXG4gIGJhc2UwMzogJyM2NTdiODMnLFxuICBiYXNlMDQ6ICcjODM5NDk2JyxcbiAgYmFzZTA1OiAnIzkzYTFhMScsXG4gIGJhc2UwNjogJyNlZWU4ZDUnLFxuICBiYXNlMDc6ICcjZmRmNmUzJyxcbiAgYmFzZTA4OiAnI2RjMzIyZicsXG4gIGJhc2UwOTogJyNjYjRiMTYnLFxuICBiYXNlMEE6ICcjYjU4OTAwJyxcbiAgYmFzZTBCOiAnIzg1OTkwMCcsXG4gIGJhc2UwQzogJyMyYWExOTgnLFxuICBiYXNlMEQ6ICcjMjY4YmQyJyxcbiAgYmFzZTBFOiAnIzZjNzFjNCcsXG4gIGJhc2UwRjogJyNkMzM2ODInXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdzdW1tZXJmcnVpdCcsXG4gIGF1dGhvcjogJ2NocmlzdG9waGVyIGNvcmxleSAoaHR0cDovL2NzY29ybGV5LmdpdGh1Yi5pby8pJyxcbiAgYmFzZTAwOiAnIzE1MTUxNScsXG4gIGJhc2UwMTogJyMyMDIwMjAnLFxuICBiYXNlMDI6ICcjMzAzMDMwJyxcbiAgYmFzZTAzOiAnIzUwNTA1MCcsXG4gIGJhc2UwNDogJyNCMEIwQjAnLFxuICBiYXNlMDU6ICcjRDBEMEQwJyxcbiAgYmFzZTA2OiAnI0UwRTBFMCcsXG4gIGJhc2UwNzogJyNGRkZGRkYnLFxuICBiYXNlMDg6ICcjRkYwMDg2JyxcbiAgYmFzZTA5OiAnI0ZEODkwMCcsXG4gIGJhc2UwQTogJyNBQkE4MDAnLFxuICBiYXNlMEI6ICcjMDBDOTE4JyxcbiAgYmFzZTBDOiAnIzFmYWFhYScsXG4gIGJhc2UwRDogJyMzNzc3RTYnLFxuICBiYXNlMEU6ICcjQUQwMEExJyxcbiAgYmFzZTBGOiAnI2NjNjYzMydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ3RocmVlemVyb3R3b2ZvdXInLFxuICBhdXRob3I6ICdqYW4gdC4gc290dCAoaHR0cDovL2dpdGh1Yi5jb20vaWRsZWJlcmcpJyxcbiAgYmFzZTAwOiAnIzA5MDMwMCcsXG4gIGJhc2UwMTogJyMzYTM0MzInLFxuICBiYXNlMDI6ICcjNGE0NTQzJyxcbiAgYmFzZTAzOiAnIzVjNTg1NScsXG4gIGJhc2UwNDogJyM4MDdkN2MnLFxuICBiYXNlMDU6ICcjYTVhMmEyJyxcbiAgYmFzZTA2OiAnI2Q2ZDVkNCcsXG4gIGJhc2UwNzogJyNmN2Y3ZjcnLFxuICBiYXNlMDg6ICcjZGIyZDIwJyxcbiAgYmFzZTA5OiAnI2U4YmJkMCcsXG4gIGJhc2UwQTogJyNmZGVkMDInLFxuICBiYXNlMEI6ICcjMDFhMjUyJyxcbiAgYmFzZTBDOiAnI2I1ZTRmNCcsXG4gIGJhc2UwRDogJyMwMWEwZTQnLFxuICBiYXNlMEU6ICcjYTE2YTk0JyxcbiAgYmFzZTBGOiAnI2NkYWI1Mydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ3RvbW9ycm93JyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzFkMWYyMScsXG4gIGJhc2UwMTogJyMyODJhMmUnLFxuICBiYXNlMDI6ICcjMzczYjQxJyxcbiAgYmFzZTAzOiAnIzk2OTg5NicsXG4gIGJhc2UwNDogJyNiNGI3YjQnLFxuICBiYXNlMDU6ICcjYzVjOGM2JyxcbiAgYmFzZTA2OiAnI2UwZTBlMCcsXG4gIGJhc2UwNzogJyNmZmZmZmYnLFxuICBiYXNlMDg6ICcjY2M2NjY2JyxcbiAgYmFzZTA5OiAnI2RlOTM1ZicsXG4gIGJhc2UwQTogJyNmMGM2NzQnLFxuICBiYXNlMEI6ICcjYjViZDY4JyxcbiAgYmFzZTBDOiAnIzhhYmViNycsXG4gIGJhc2UwRDogJyM4MWEyYmUnLFxuICBiYXNlMEU6ICcjYjI5NGJiJyxcbiAgYmFzZTBGOiAnI2EzNjg1YSdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2xvbmRvbiB0dWJlJyxcbiAgYXV0aG9yOiAnamFuIHQuIHNvdHQnLFxuICBiYXNlMDA6ICcjMjMxZjIwJyxcbiAgYmFzZTAxOiAnIzFjM2Y5NScsXG4gIGJhc2UwMjogJyM1YTU3NTgnLFxuICBiYXNlMDM6ICcjNzM3MTcxJyxcbiAgYmFzZTA0OiAnIzk1OWNhMScsXG4gIGJhc2UwNTogJyNkOWQ4ZDgnLFxuICBiYXNlMDY6ICcjZTdlN2U4JyxcbiAgYmFzZTA3OiAnI2ZmZmZmZicsXG4gIGJhc2UwODogJyNlZTJlMjQnLFxuICBiYXNlMDk6ICcjZjM4NmExJyxcbiAgYmFzZTBBOiAnI2ZmZDIwNCcsXG4gIGJhc2UwQjogJyMwMDg1M2UnLFxuICBiYXNlMEM6ICcjODVjZWJjJyxcbiAgYmFzZTBEOiAnIzAwOWRkYycsXG4gIGJhc2UwRTogJyM5ODAwNWQnLFxuICBiYXNlMEY6ICcjYjA2MTEwJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAndHdpbGlnaHQnLFxuICBhdXRob3I6ICdkYXZpZCBoYXJ0IChodHRwOi8vaGFydC1kZXYuY29tKScsXG4gIGJhc2UwMDogJyMxZTFlMWUnLFxuICBiYXNlMDE6ICcjMzIzNTM3JyxcbiAgYmFzZTAyOiAnIzQ2NGI1MCcsXG4gIGJhc2UwMzogJyM1ZjVhNjAnLFxuICBiYXNlMDQ6ICcjODM4MTg0JyxcbiAgYmFzZTA1OiAnI2E3YTdhNycsXG4gIGJhc2UwNjogJyNjM2MzYzMnLFxuICBiYXNlMDc6ICcjZmZmZmZmJyxcbiAgYmFzZTA4OiAnI2NmNmE0YycsXG4gIGJhc2UwOTogJyNjZGE4NjknLFxuICBiYXNlMEE6ICcjZjllZTk4JyxcbiAgYmFzZTBCOiAnIzhmOWQ2YScsXG4gIGJhc2UwQzogJyNhZmM0ZGInLFxuICBiYXNlMEQ6ICcjNzU4N2E2JyxcbiAgYmFzZTBFOiAnIzliODU5ZCcsXG4gIGJhc2UwRjogJyM5YjcwM2YnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiLyogTUlUIGxpY2Vuc2UgKi9cbnZhciBjc3NLZXl3b3JkcyA9IHJlcXVpcmUoJ2NvbG9yLW5hbWUnKTtcblxuLy8gTk9URTogY29udmVyc2lvbnMgc2hvdWxkIG9ubHkgcmV0dXJuIHByaW1pdGl2ZSB2YWx1ZXMgKGkuZS4gYXJyYXlzLCBvclxuLy8gICAgICAgdmFsdWVzIHRoYXQgZ2l2ZSBjb3JyZWN0IGB0eXBlb2ZgIHJlc3VsdHMpLlxuLy8gICAgICAgZG8gbm90IHVzZSBib3ggdmFsdWVzIHR5cGVzIChpLmUuIE51bWJlcigpLCBTdHJpbmcoKSwgZXRjLilcblxudmFyIHJldmVyc2VLZXl3b3JkcyA9IHt9O1xuZm9yICh2YXIga2V5IGluIGNzc0tleXdvcmRzKSB7XG5cdGlmIChjc3NLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0cmV2ZXJzZUtleXdvcmRzW2Nzc0tleXdvcmRzW2tleV1dID0ga2V5O1xuXHR9XG59XG5cbnZhciBjb252ZXJ0ID0gbW9kdWxlLmV4cG9ydHMgPSB7XG5cdHJnYjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdyZ2InfSxcblx0aHNsOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2hzbCd9LFxuXHRoc3Y6IHtjaGFubmVsczogMywgbGFiZWxzOiAnaHN2J30sXG5cdGh3Yjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdod2InfSxcblx0Y215azoge2NoYW5uZWxzOiA0LCBsYWJlbHM6ICdjbXlrJ30sXG5cdHh5ejoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICd4eXonfSxcblx0bGFiOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2xhYid9LFxuXHRsY2g6IHtjaGFubmVsczogMywgbGFiZWxzOiAnbGNoJ30sXG5cdGhleDoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnaGV4J119LFxuXHRrZXl3b3JkOiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydrZXl3b3JkJ119LFxuXHRhbnNpMTY6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2Fuc2kxNiddfSxcblx0YW5zaTI1Njoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnYW5zaTI1NiddfSxcblx0aGNnOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogWydoJywgJ2MnLCAnZyddfSxcblx0YXBwbGU6IHtjaGFubmVsczogMywgbGFiZWxzOiBbJ3IxNicsICdnMTYnLCAnYjE2J119LFxuXHRncmF5OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydncmF5J119XG59O1xuXG4vLyBoaWRlIC5jaGFubmVscyBhbmQgLmxhYmVscyBwcm9wZXJ0aWVzXG5mb3IgKHZhciBtb2RlbCBpbiBjb252ZXJ0KSB7XG5cdGlmIChjb252ZXJ0Lmhhc093blByb3BlcnR5KG1vZGVsKSkge1xuXHRcdGlmICghKCdjaGFubmVscycgaW4gY29udmVydFttb2RlbF0pKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgY2hhbm5lbHMgcHJvcGVydHk6ICcgKyBtb2RlbCk7XG5cdFx0fVxuXG5cdFx0aWYgKCEoJ2xhYmVscycgaW4gY29udmVydFttb2RlbF0pKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgY2hhbm5lbCBsYWJlbHMgcHJvcGVydHk6ICcgKyBtb2RlbCk7XG5cdFx0fVxuXG5cdFx0aWYgKGNvbnZlcnRbbW9kZWxdLmxhYmVscy5sZW5ndGggIT09IGNvbnZlcnRbbW9kZWxdLmNoYW5uZWxzKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ2NoYW5uZWwgYW5kIGxhYmVsIGNvdW50cyBtaXNtYXRjaDogJyArIG1vZGVsKTtcblx0XHR9XG5cblx0XHR2YXIgY2hhbm5lbHMgPSBjb252ZXJ0W21vZGVsXS5jaGFubmVscztcblx0XHR2YXIgbGFiZWxzID0gY29udmVydFttb2RlbF0ubGFiZWxzO1xuXHRcdGRlbGV0ZSBjb252ZXJ0W21vZGVsXS5jaGFubmVscztcblx0XHRkZWxldGUgY29udmVydFttb2RlbF0ubGFiZWxzO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W21vZGVsXSwgJ2NoYW5uZWxzJywge3ZhbHVlOiBjaGFubmVsc30pO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W21vZGVsXSwgJ2xhYmVscycsIHt2YWx1ZTogbGFiZWxzfSk7XG5cdH1cbn1cblxuY29udmVydC5yZ2IuaHNsID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgciA9IHJnYlswXSAvIDI1NTtcblx0dmFyIGcgPSByZ2JbMV0gLyAyNTU7XG5cdHZhciBiID0gcmdiWzJdIC8gMjU1O1xuXHR2YXIgbWluID0gTWF0aC5taW4ociwgZywgYik7XG5cdHZhciBtYXggPSBNYXRoLm1heChyLCBnLCBiKTtcblx0dmFyIGRlbHRhID0gbWF4IC0gbWluO1xuXHR2YXIgaDtcblx0dmFyIHM7XG5cdHZhciBsO1xuXG5cdGlmIChtYXggPT09IG1pbikge1xuXHRcdGggPSAwO1xuXHR9IGVsc2UgaWYgKHIgPT09IG1heCkge1xuXHRcdGggPSAoZyAtIGIpIC8gZGVsdGE7XG5cdH0gZWxzZSBpZiAoZyA9PT0gbWF4KSB7XG5cdFx0aCA9IDIgKyAoYiAtIHIpIC8gZGVsdGE7XG5cdH0gZWxzZSBpZiAoYiA9PT0gbWF4KSB7XG5cdFx0aCA9IDQgKyAociAtIGcpIC8gZGVsdGE7XG5cdH1cblxuXHRoID0gTWF0aC5taW4oaCAqIDYwLCAzNjApO1xuXG5cdGlmIChoIDwgMCkge1xuXHRcdGggKz0gMzYwO1xuXHR9XG5cblx0bCA9IChtaW4gKyBtYXgpIC8gMjtcblxuXHRpZiAobWF4ID09PSBtaW4pIHtcblx0XHRzID0gMDtcblx0fSBlbHNlIGlmIChsIDw9IDAuNSkge1xuXHRcdHMgPSBkZWx0YSAvIChtYXggKyBtaW4pO1xuXHR9IGVsc2Uge1xuXHRcdHMgPSBkZWx0YSAvICgyIC0gbWF4IC0gbWluKTtcblx0fVxuXG5cdHJldHVybiBbaCwgcyAqIDEwMCwgbCAqIDEwMF07XG59O1xuXG5jb252ZXJ0LnJnYi5oc3YgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciByZGlmO1xuXHR2YXIgZ2RpZjtcblx0dmFyIGJkaWY7XG5cdHZhciBoO1xuXHR2YXIgcztcblxuXHR2YXIgciA9IHJnYlswXSAvIDI1NTtcblx0dmFyIGcgPSByZ2JbMV0gLyAyNTU7XG5cdHZhciBiID0gcmdiWzJdIC8gMjU1O1xuXHR2YXIgdiA9IE1hdGgubWF4KHIsIGcsIGIpO1xuXHR2YXIgZGlmZiA9IHYgLSBNYXRoLm1pbihyLCBnLCBiKTtcblx0dmFyIGRpZmZjID0gZnVuY3Rpb24gKGMpIHtcblx0XHRyZXR1cm4gKHYgLSBjKSAvIDYgLyBkaWZmICsgMSAvIDI7XG5cdH07XG5cblx0aWYgKGRpZmYgPT09IDApIHtcblx0XHRoID0gcyA9IDA7XG5cdH0gZWxzZSB7XG5cdFx0cyA9IGRpZmYgLyB2O1xuXHRcdHJkaWYgPSBkaWZmYyhyKTtcblx0XHRnZGlmID0gZGlmZmMoZyk7XG5cdFx0YmRpZiA9IGRpZmZjKGIpO1xuXG5cdFx0aWYgKHIgPT09IHYpIHtcblx0XHRcdGggPSBiZGlmIC0gZ2RpZjtcblx0XHR9IGVsc2UgaWYgKGcgPT09IHYpIHtcblx0XHRcdGggPSAoMSAvIDMpICsgcmRpZiAtIGJkaWY7XG5cdFx0fSBlbHNlIGlmIChiID09PSB2KSB7XG5cdFx0XHRoID0gKDIgLyAzKSArIGdkaWYgLSByZGlmO1xuXHRcdH1cblx0XHRpZiAoaCA8IDApIHtcblx0XHRcdGggKz0gMTtcblx0XHR9IGVsc2UgaWYgKGggPiAxKSB7XG5cdFx0XHRoIC09IDE7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIFtcblx0XHRoICogMzYwLFxuXHRcdHMgKiAxMDAsXG5cdFx0diAqIDEwMFxuXHRdO1xufTtcblxuY29udmVydC5yZ2IuaHdiID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgciA9IHJnYlswXTtcblx0dmFyIGcgPSByZ2JbMV07XG5cdHZhciBiID0gcmdiWzJdO1xuXHR2YXIgaCA9IGNvbnZlcnQucmdiLmhzbChyZ2IpWzBdO1xuXHR2YXIgdyA9IDEgLyAyNTUgKiBNYXRoLm1pbihyLCBNYXRoLm1pbihnLCBiKSk7XG5cblx0YiA9IDEgLSAxIC8gMjU1ICogTWF0aC5tYXgociwgTWF0aC5tYXgoZywgYikpO1xuXG5cdHJldHVybiBbaCwgdyAqIDEwMCwgYiAqIDEwMF07XG59O1xuXG5jb252ZXJ0LnJnYi5jbXlrID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgciA9IHJnYlswXSAvIDI1NTtcblx0dmFyIGcgPSByZ2JbMV0gLyAyNTU7XG5cdHZhciBiID0gcmdiWzJdIC8gMjU1O1xuXHR2YXIgYztcblx0dmFyIG07XG5cdHZhciB5O1xuXHR2YXIgaztcblxuXHRrID0gTWF0aC5taW4oMSAtIHIsIDEgLSBnLCAxIC0gYik7XG5cdGMgPSAoMSAtIHIgLSBrKSAvICgxIC0gaykgfHwgMDtcblx0bSA9ICgxIC0gZyAtIGspIC8gKDEgLSBrKSB8fCAwO1xuXHR5ID0gKDEgLSBiIC0gaykgLyAoMSAtIGspIHx8IDA7XG5cblx0cmV0dXJuIFtjICogMTAwLCBtICogMTAwLCB5ICogMTAwLCBrICogMTAwXTtcbn07XG5cbi8qKlxuICogU2VlIGh0dHBzOi8vZW4ubS53aWtpcGVkaWEub3JnL3dpa2kvRXVjbGlkZWFuX2Rpc3RhbmNlI1NxdWFyZWRfRXVjbGlkZWFuX2Rpc3RhbmNlXG4gKiAqL1xuZnVuY3Rpb24gY29tcGFyYXRpdmVEaXN0YW5jZSh4LCB5KSB7XG5cdHJldHVybiAoXG5cdFx0TWF0aC5wb3coeFswXSAtIHlbMF0sIDIpICtcblx0XHRNYXRoLnBvdyh4WzFdIC0geVsxXSwgMikgK1xuXHRcdE1hdGgucG93KHhbMl0gLSB5WzJdLCAyKVxuXHQpO1xufVxuXG5jb252ZXJ0LnJnYi5rZXl3b3JkID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgcmV2ZXJzZWQgPSByZXZlcnNlS2V5d29yZHNbcmdiXTtcblx0aWYgKHJldmVyc2VkKSB7XG5cdFx0cmV0dXJuIHJldmVyc2VkO1xuXHR9XG5cblx0dmFyIGN1cnJlbnRDbG9zZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcblx0dmFyIGN1cnJlbnRDbG9zZXN0S2V5d29yZDtcblxuXHRmb3IgKHZhciBrZXl3b3JkIGluIGNzc0tleXdvcmRzKSB7XG5cdFx0aWYgKGNzc0tleXdvcmRzLmhhc093blByb3BlcnR5KGtleXdvcmQpKSB7XG5cdFx0XHR2YXIgdmFsdWUgPSBjc3NLZXl3b3Jkc1trZXl3b3JkXTtcblxuXHRcdFx0Ly8gQ29tcHV0ZSBjb21wYXJhdGl2ZSBkaXN0YW5jZVxuXHRcdFx0dmFyIGRpc3RhbmNlID0gY29tcGFyYXRpdmVEaXN0YW5jZShyZ2IsIHZhbHVlKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgaXRzIGxlc3MsIGlmIHNvIHNldCBhcyBjbG9zZXN0XG5cdFx0XHRpZiAoZGlzdGFuY2UgPCBjdXJyZW50Q2xvc2VzdERpc3RhbmNlKSB7XG5cdFx0XHRcdGN1cnJlbnRDbG9zZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcblx0XHRcdFx0Y3VycmVudENsb3Nlc3RLZXl3b3JkID0ga2V5d29yZDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY3VycmVudENsb3Nlc3RLZXl3b3JkO1xufTtcblxuY29udmVydC5rZXl3b3JkLnJnYiA9IGZ1bmN0aW9uIChrZXl3b3JkKSB7XG5cdHJldHVybiBjc3NLZXl3b3Jkc1trZXl3b3JkXTtcbn07XG5cbmNvbnZlcnQucmdiLnh5eiA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHIgPSByZ2JbMF0gLyAyNTU7XG5cdHZhciBnID0gcmdiWzFdIC8gMjU1O1xuXHR2YXIgYiA9IHJnYlsyXSAvIDI1NTtcblxuXHQvLyBhc3N1bWUgc1JHQlxuXHRyID0gciA+IDAuMDQwNDUgPyBNYXRoLnBvdygoKHIgKyAwLjA1NSkgLyAxLjA1NSksIDIuNCkgOiAociAvIDEyLjkyKTtcblx0ZyA9IGcgPiAwLjA0MDQ1ID8gTWF0aC5wb3coKChnICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpIDogKGcgLyAxMi45Mik7XG5cdGIgPSBiID4gMC4wNDA0NSA/IE1hdGgucG93KCgoYiArIDAuMDU1KSAvIDEuMDU1KSwgMi40KSA6IChiIC8gMTIuOTIpO1xuXG5cdHZhciB4ID0gKHIgKiAwLjQxMjQpICsgKGcgKiAwLjM1NzYpICsgKGIgKiAwLjE4MDUpO1xuXHR2YXIgeSA9IChyICogMC4yMTI2KSArIChnICogMC43MTUyKSArIChiICogMC4wNzIyKTtcblx0dmFyIHogPSAociAqIDAuMDE5MykgKyAoZyAqIDAuMTE5MikgKyAoYiAqIDAuOTUwNSk7XG5cblx0cmV0dXJuIFt4ICogMTAwLCB5ICogMTAwLCB6ICogMTAwXTtcbn07XG5cbmNvbnZlcnQucmdiLmxhYiA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHh5eiA9IGNvbnZlcnQucmdiLnh5eihyZ2IpO1xuXHR2YXIgeCA9IHh5elswXTtcblx0dmFyIHkgPSB4eXpbMV07XG5cdHZhciB6ID0geHl6WzJdO1xuXHR2YXIgbDtcblx0dmFyIGE7XG5cdHZhciBiO1xuXG5cdHggLz0gOTUuMDQ3O1xuXHR5IC89IDEwMDtcblx0eiAvPSAxMDguODgzO1xuXG5cdHggPSB4ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh4LCAxIC8gMykgOiAoNy43ODcgKiB4KSArICgxNiAvIDExNik7XG5cdHkgPSB5ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh5LCAxIC8gMykgOiAoNy43ODcgKiB5KSArICgxNiAvIDExNik7XG5cdHogPSB6ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh6LCAxIC8gMykgOiAoNy43ODcgKiB6KSArICgxNiAvIDExNik7XG5cblx0bCA9ICgxMTYgKiB5KSAtIDE2O1xuXHRhID0gNTAwICogKHggLSB5KTtcblx0YiA9IDIwMCAqICh5IC0geik7XG5cblx0cmV0dXJuIFtsLCBhLCBiXTtcbn07XG5cbmNvbnZlcnQuaHNsLnJnYiA9IGZ1bmN0aW9uIChoc2wpIHtcblx0dmFyIGggPSBoc2xbMF0gLyAzNjA7XG5cdHZhciBzID0gaHNsWzFdIC8gMTAwO1xuXHR2YXIgbCA9IGhzbFsyXSAvIDEwMDtcblx0dmFyIHQxO1xuXHR2YXIgdDI7XG5cdHZhciB0Mztcblx0dmFyIHJnYjtcblx0dmFyIHZhbDtcblxuXHRpZiAocyA9PT0gMCkge1xuXHRcdHZhbCA9IGwgKiAyNTU7XG5cdFx0cmV0dXJuIFt2YWwsIHZhbCwgdmFsXTtcblx0fVxuXG5cdGlmIChsIDwgMC41KSB7XG5cdFx0dDIgPSBsICogKDEgKyBzKTtcblx0fSBlbHNlIHtcblx0XHR0MiA9IGwgKyBzIC0gbCAqIHM7XG5cdH1cblxuXHR0MSA9IDIgKiBsIC0gdDI7XG5cblx0cmdiID0gWzAsIDAsIDBdO1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdHQzID0gaCArIDEgLyAzICogLShpIC0gMSk7XG5cdFx0aWYgKHQzIDwgMCkge1xuXHRcdFx0dDMrKztcblx0XHR9XG5cdFx0aWYgKHQzID4gMSkge1xuXHRcdFx0dDMtLTtcblx0XHR9XG5cblx0XHRpZiAoNiAqIHQzIDwgMSkge1xuXHRcdFx0dmFsID0gdDEgKyAodDIgLSB0MSkgKiA2ICogdDM7XG5cdFx0fSBlbHNlIGlmICgyICogdDMgPCAxKSB7XG5cdFx0XHR2YWwgPSB0Mjtcblx0XHR9IGVsc2UgaWYgKDMgKiB0MyA8IDIpIHtcblx0XHRcdHZhbCA9IHQxICsgKHQyIC0gdDEpICogKDIgLyAzIC0gdDMpICogNjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFsID0gdDE7XG5cdFx0fVxuXG5cdFx0cmdiW2ldID0gdmFsICogMjU1O1xuXHR9XG5cblx0cmV0dXJuIHJnYjtcbn07XG5cbmNvbnZlcnQuaHNsLmhzdiA9IGZ1bmN0aW9uIChoc2wpIHtcblx0dmFyIGggPSBoc2xbMF07XG5cdHZhciBzID0gaHNsWzFdIC8gMTAwO1xuXHR2YXIgbCA9IGhzbFsyXSAvIDEwMDtcblx0dmFyIHNtaW4gPSBzO1xuXHR2YXIgbG1pbiA9IE1hdGgubWF4KGwsIDAuMDEpO1xuXHR2YXIgc3Y7XG5cdHZhciB2O1xuXG5cdGwgKj0gMjtcblx0cyAqPSAobCA8PSAxKSA/IGwgOiAyIC0gbDtcblx0c21pbiAqPSBsbWluIDw9IDEgPyBsbWluIDogMiAtIGxtaW47XG5cdHYgPSAobCArIHMpIC8gMjtcblx0c3YgPSBsID09PSAwID8gKDIgKiBzbWluKSAvIChsbWluICsgc21pbikgOiAoMiAqIHMpIC8gKGwgKyBzKTtcblxuXHRyZXR1cm4gW2gsIHN2ICogMTAwLCB2ICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHN2LnJnYiA9IGZ1bmN0aW9uIChoc3YpIHtcblx0dmFyIGggPSBoc3ZbMF0gLyA2MDtcblx0dmFyIHMgPSBoc3ZbMV0gLyAxMDA7XG5cdHZhciB2ID0gaHN2WzJdIC8gMTAwO1xuXHR2YXIgaGkgPSBNYXRoLmZsb29yKGgpICUgNjtcblxuXHR2YXIgZiA9IGggLSBNYXRoLmZsb29yKGgpO1xuXHR2YXIgcCA9IDI1NSAqIHYgKiAoMSAtIHMpO1xuXHR2YXIgcSA9IDI1NSAqIHYgKiAoMSAtIChzICogZikpO1xuXHR2YXIgdCA9IDI1NSAqIHYgKiAoMSAtIChzICogKDEgLSBmKSkpO1xuXHR2ICo9IDI1NTtcblxuXHRzd2l0Y2ggKGhpKSB7XG5cdFx0Y2FzZSAwOlxuXHRcdFx0cmV0dXJuIFt2LCB0LCBwXTtcblx0XHRjYXNlIDE6XG5cdFx0XHRyZXR1cm4gW3EsIHYsIHBdO1xuXHRcdGNhc2UgMjpcblx0XHRcdHJldHVybiBbcCwgdiwgdF07XG5cdFx0Y2FzZSAzOlxuXHRcdFx0cmV0dXJuIFtwLCBxLCB2XTtcblx0XHRjYXNlIDQ6XG5cdFx0XHRyZXR1cm4gW3QsIHAsIHZdO1xuXHRcdGNhc2UgNTpcblx0XHRcdHJldHVybiBbdiwgcCwgcV07XG5cdH1cbn07XG5cbmNvbnZlcnQuaHN2LmhzbCA9IGZ1bmN0aW9uIChoc3YpIHtcblx0dmFyIGggPSBoc3ZbMF07XG5cdHZhciBzID0gaHN2WzFdIC8gMTAwO1xuXHR2YXIgdiA9IGhzdlsyXSAvIDEwMDtcblx0dmFyIHZtaW4gPSBNYXRoLm1heCh2LCAwLjAxKTtcblx0dmFyIGxtaW47XG5cdHZhciBzbDtcblx0dmFyIGw7XG5cblx0bCA9ICgyIC0gcykgKiB2O1xuXHRsbWluID0gKDIgLSBzKSAqIHZtaW47XG5cdHNsID0gcyAqIHZtaW47XG5cdHNsIC89IChsbWluIDw9IDEpID8gbG1pbiA6IDIgLSBsbWluO1xuXHRzbCA9IHNsIHx8IDA7XG5cdGwgLz0gMjtcblxuXHRyZXR1cm4gW2gsIHNsICogMTAwLCBsICogMTAwXTtcbn07XG5cbi8vIGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzcy1jb2xvci8jaHdiLXRvLXJnYlxuY29udmVydC5od2IucmdiID0gZnVuY3Rpb24gKGh3Yikge1xuXHR2YXIgaCA9IGh3YlswXSAvIDM2MDtcblx0dmFyIHdoID0gaHdiWzFdIC8gMTAwO1xuXHR2YXIgYmwgPSBod2JbMl0gLyAxMDA7XG5cdHZhciByYXRpbyA9IHdoICsgYmw7XG5cdHZhciBpO1xuXHR2YXIgdjtcblx0dmFyIGY7XG5cdHZhciBuO1xuXG5cdC8vIHdoICsgYmwgY2FudCBiZSA+IDFcblx0aWYgKHJhdGlvID4gMSkge1xuXHRcdHdoIC89IHJhdGlvO1xuXHRcdGJsIC89IHJhdGlvO1xuXHR9XG5cblx0aSA9IE1hdGguZmxvb3IoNiAqIGgpO1xuXHR2ID0gMSAtIGJsO1xuXHRmID0gNiAqIGggLSBpO1xuXG5cdGlmICgoaSAmIDB4MDEpICE9PSAwKSB7XG5cdFx0ZiA9IDEgLSBmO1xuXHR9XG5cblx0biA9IHdoICsgZiAqICh2IC0gd2gpOyAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvblxuXG5cdHZhciByO1xuXHR2YXIgZztcblx0dmFyIGI7XG5cdHN3aXRjaCAoaSkge1xuXHRcdGRlZmF1bHQ6XG5cdFx0Y2FzZSA2OlxuXHRcdGNhc2UgMDogciA9IHY7IGcgPSBuOyBiID0gd2g7IGJyZWFrO1xuXHRcdGNhc2UgMTogciA9IG47IGcgPSB2OyBiID0gd2g7IGJyZWFrO1xuXHRcdGNhc2UgMjogciA9IHdoOyBnID0gdjsgYiA9IG47IGJyZWFrO1xuXHRcdGNhc2UgMzogciA9IHdoOyBnID0gbjsgYiA9IHY7IGJyZWFrO1xuXHRcdGNhc2UgNDogciA9IG47IGcgPSB3aDsgYiA9IHY7IGJyZWFrO1xuXHRcdGNhc2UgNTogciA9IHY7IGcgPSB3aDsgYiA9IG47IGJyZWFrO1xuXHR9XG5cblx0cmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn07XG5cbmNvbnZlcnQuY215ay5yZ2IgPSBmdW5jdGlvbiAoY215aykge1xuXHR2YXIgYyA9IGNteWtbMF0gLyAxMDA7XG5cdHZhciBtID0gY215a1sxXSAvIDEwMDtcblx0dmFyIHkgPSBjbXlrWzJdIC8gMTAwO1xuXHR2YXIgayA9IGNteWtbM10gLyAxMDA7XG5cdHZhciByO1xuXHR2YXIgZztcblx0dmFyIGI7XG5cblx0ciA9IDEgLSBNYXRoLm1pbigxLCBjICogKDEgLSBrKSArIGspO1xuXHRnID0gMSAtIE1hdGgubWluKDEsIG0gKiAoMSAtIGspICsgayk7XG5cdGIgPSAxIC0gTWF0aC5taW4oMSwgeSAqICgxIC0gaykgKyBrKTtcblxuXHRyZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xufTtcblxuY29udmVydC54eXoucmdiID0gZnVuY3Rpb24gKHh5eikge1xuXHR2YXIgeCA9IHh5elswXSAvIDEwMDtcblx0dmFyIHkgPSB4eXpbMV0gLyAxMDA7XG5cdHZhciB6ID0geHl6WzJdIC8gMTAwO1xuXHR2YXIgcjtcblx0dmFyIGc7XG5cdHZhciBiO1xuXG5cdHIgPSAoeCAqIDMuMjQwNikgKyAoeSAqIC0xLjUzNzIpICsgKHogKiAtMC40OTg2KTtcblx0ZyA9ICh4ICogLTAuOTY4OSkgKyAoeSAqIDEuODc1OCkgKyAoeiAqIDAuMDQxNSk7XG5cdGIgPSAoeCAqIDAuMDU1NykgKyAoeSAqIC0wLjIwNDApICsgKHogKiAxLjA1NzApO1xuXG5cdC8vIGFzc3VtZSBzUkdCXG5cdHIgPSByID4gMC4wMDMxMzA4XG5cdFx0PyAoKDEuMDU1ICogTWF0aC5wb3cociwgMS4wIC8gMi40KSkgLSAwLjA1NSlcblx0XHQ6IHIgKiAxMi45MjtcblxuXHRnID0gZyA+IDAuMDAzMTMwOFxuXHRcdD8gKCgxLjA1NSAqIE1hdGgucG93KGcsIDEuMCAvIDIuNCkpIC0gMC4wNTUpXG5cdFx0OiBnICogMTIuOTI7XG5cblx0YiA9IGIgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiBNYXRoLnBvdyhiLCAxLjAgLyAyLjQpKSAtIDAuMDU1KVxuXHRcdDogYiAqIDEyLjkyO1xuXG5cdHIgPSBNYXRoLm1pbihNYXRoLm1heCgwLCByKSwgMSk7XG5cdGcgPSBNYXRoLm1pbihNYXRoLm1heCgwLCBnKSwgMSk7XG5cdGIgPSBNYXRoLm1pbihNYXRoLm1heCgwLCBiKSwgMSk7XG5cblx0cmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn07XG5cbmNvbnZlcnQueHl6LmxhYiA9IGZ1bmN0aW9uICh4eXopIHtcblx0dmFyIHggPSB4eXpbMF07XG5cdHZhciB5ID0geHl6WzFdO1xuXHR2YXIgeiA9IHh5elsyXTtcblx0dmFyIGw7XG5cdHZhciBhO1xuXHR2YXIgYjtcblxuXHR4IC89IDk1LjA0Nztcblx0eSAvPSAxMDA7XG5cdHogLz0gMTA4Ljg4MztcblxuXHR4ID0geCA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeCwgMSAvIDMpIDogKDcuNzg3ICogeCkgKyAoMTYgLyAxMTYpO1xuXHR5ID0geSA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeSwgMSAvIDMpIDogKDcuNzg3ICogeSkgKyAoMTYgLyAxMTYpO1xuXHR6ID0geiA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeiwgMSAvIDMpIDogKDcuNzg3ICogeikgKyAoMTYgLyAxMTYpO1xuXG5cdGwgPSAoMTE2ICogeSkgLSAxNjtcblx0YSA9IDUwMCAqICh4IC0geSk7XG5cdGIgPSAyMDAgKiAoeSAtIHopO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LmxhYi54eXogPSBmdW5jdGlvbiAobGFiKSB7XG5cdHZhciBsID0gbGFiWzBdO1xuXHR2YXIgYSA9IGxhYlsxXTtcblx0dmFyIGIgPSBsYWJbMl07XG5cdHZhciB4O1xuXHR2YXIgeTtcblx0dmFyIHo7XG5cblx0eSA9IChsICsgMTYpIC8gMTE2O1xuXHR4ID0gYSAvIDUwMCArIHk7XG5cdHogPSB5IC0gYiAvIDIwMDtcblxuXHR2YXIgeTIgPSBNYXRoLnBvdyh5LCAzKTtcblx0dmFyIHgyID0gTWF0aC5wb3coeCwgMyk7XG5cdHZhciB6MiA9IE1hdGgucG93KHosIDMpO1xuXHR5ID0geTIgPiAwLjAwODg1NiA/IHkyIDogKHkgLSAxNiAvIDExNikgLyA3Ljc4Nztcblx0eCA9IHgyID4gMC4wMDg4NTYgPyB4MiA6ICh4IC0gMTYgLyAxMTYpIC8gNy43ODc7XG5cdHogPSB6MiA+IDAuMDA4ODU2ID8gejIgOiAoeiAtIDE2IC8gMTE2KSAvIDcuNzg3O1xuXG5cdHggKj0gOTUuMDQ3O1xuXHR5ICo9IDEwMDtcblx0eiAqPSAxMDguODgzO1xuXG5cdHJldHVybiBbeCwgeSwgel07XG59O1xuXG5jb252ZXJ0LmxhYi5sY2ggPSBmdW5jdGlvbiAobGFiKSB7XG5cdHZhciBsID0gbGFiWzBdO1xuXHR2YXIgYSA9IGxhYlsxXTtcblx0dmFyIGIgPSBsYWJbMl07XG5cdHZhciBocjtcblx0dmFyIGg7XG5cdHZhciBjO1xuXG5cdGhyID0gTWF0aC5hdGFuMihiLCBhKTtcblx0aCA9IGhyICogMzYwIC8gMiAvIE1hdGguUEk7XG5cblx0aWYgKGggPCAwKSB7XG5cdFx0aCArPSAzNjA7XG5cdH1cblxuXHRjID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpO1xuXG5cdHJldHVybiBbbCwgYywgaF07XG59O1xuXG5jb252ZXJ0LmxjaC5sYWIgPSBmdW5jdGlvbiAobGNoKSB7XG5cdHZhciBsID0gbGNoWzBdO1xuXHR2YXIgYyA9IGxjaFsxXTtcblx0dmFyIGggPSBsY2hbMl07XG5cdHZhciBhO1xuXHR2YXIgYjtcblx0dmFyIGhyO1xuXG5cdGhyID0gaCAvIDM2MCAqIDIgKiBNYXRoLlBJO1xuXHRhID0gYyAqIE1hdGguY29zKGhyKTtcblx0YiA9IGMgKiBNYXRoLnNpbihocik7XG5cblx0cmV0dXJuIFtsLCBhLCBiXTtcbn07XG5cbmNvbnZlcnQucmdiLmFuc2kxNiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHZhciByID0gYXJnc1swXTtcblx0dmFyIGcgPSBhcmdzWzFdO1xuXHR2YXIgYiA9IGFyZ3NbMl07XG5cdHZhciB2YWx1ZSA9IDEgaW4gYXJndW1lbnRzID8gYXJndW1lbnRzWzFdIDogY29udmVydC5yZ2IuaHN2KGFyZ3MpWzJdOyAvLyBoc3YgLT4gYW5zaTE2IG9wdGltaXphdGlvblxuXG5cdHZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSAvIDUwKTtcblxuXHRpZiAodmFsdWUgPT09IDApIHtcblx0XHRyZXR1cm4gMzA7XG5cdH1cblxuXHR2YXIgYW5zaSA9IDMwXG5cdFx0KyAoKE1hdGgucm91bmQoYiAvIDI1NSkgPDwgMilcblx0XHR8IChNYXRoLnJvdW5kKGcgLyAyNTUpIDw8IDEpXG5cdFx0fCBNYXRoLnJvdW5kKHIgLyAyNTUpKTtcblxuXHRpZiAodmFsdWUgPT09IDIpIHtcblx0XHRhbnNpICs9IDYwO1xuXHR9XG5cblx0cmV0dXJuIGFuc2k7XG59O1xuXG5jb252ZXJ0Lmhzdi5hbnNpMTYgPSBmdW5jdGlvbiAoYXJncykge1xuXHQvLyBvcHRpbWl6YXRpb24gaGVyZTsgd2UgYWxyZWFkeSBrbm93IHRoZSB2YWx1ZSBhbmQgZG9uJ3QgbmVlZCB0byBnZXRcblx0Ly8gaXQgY29udmVydGVkIGZvciB1cy5cblx0cmV0dXJuIGNvbnZlcnQucmdiLmFuc2kxNihjb252ZXJ0Lmhzdi5yZ2IoYXJncyksIGFyZ3NbMl0pO1xufTtcblxuY29udmVydC5yZ2IuYW5zaTI1NiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHZhciByID0gYXJnc1swXTtcblx0dmFyIGcgPSBhcmdzWzFdO1xuXHR2YXIgYiA9IGFyZ3NbMl07XG5cblx0Ly8gd2UgdXNlIHRoZSBleHRlbmRlZCBncmV5c2NhbGUgcGFsZXR0ZSBoZXJlLCB3aXRoIHRoZSBleGNlcHRpb24gb2Zcblx0Ly8gYmxhY2sgYW5kIHdoaXRlLiBub3JtYWwgcGFsZXR0ZSBvbmx5IGhhcyA0IGdyZXlzY2FsZSBzaGFkZXMuXG5cdGlmIChyID09PSBnICYmIGcgPT09IGIpIHtcblx0XHRpZiAociA8IDgpIHtcblx0XHRcdHJldHVybiAxNjtcblx0XHR9XG5cblx0XHRpZiAociA+IDI0OCkge1xuXHRcdFx0cmV0dXJuIDIzMTtcblx0XHR9XG5cblx0XHRyZXR1cm4gTWF0aC5yb3VuZCgoKHIgLSA4KSAvIDI0NykgKiAyNCkgKyAyMzI7XG5cdH1cblxuXHR2YXIgYW5zaSA9IDE2XG5cdFx0KyAoMzYgKiBNYXRoLnJvdW5kKHIgLyAyNTUgKiA1KSlcblx0XHQrICg2ICogTWF0aC5yb3VuZChnIC8gMjU1ICogNSkpXG5cdFx0KyBNYXRoLnJvdW5kKGIgLyAyNTUgKiA1KTtcblxuXHRyZXR1cm4gYW5zaTtcbn07XG5cbmNvbnZlcnQuYW5zaTE2LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHZhciBjb2xvciA9IGFyZ3MgJSAxMDtcblxuXHQvLyBoYW5kbGUgZ3JleXNjYWxlXG5cdGlmIChjb2xvciA9PT0gMCB8fCBjb2xvciA9PT0gNykge1xuXHRcdGlmIChhcmdzID4gNTApIHtcblx0XHRcdGNvbG9yICs9IDMuNTtcblx0XHR9XG5cblx0XHRjb2xvciA9IGNvbG9yIC8gMTAuNSAqIDI1NTtcblxuXHRcdHJldHVybiBbY29sb3IsIGNvbG9yLCBjb2xvcl07XG5cdH1cblxuXHR2YXIgbXVsdCA9ICh+fihhcmdzID4gNTApICsgMSkgKiAwLjU7XG5cdHZhciByID0gKChjb2xvciAmIDEpICogbXVsdCkgKiAyNTU7XG5cdHZhciBnID0gKCgoY29sb3IgPj4gMSkgJiAxKSAqIG11bHQpICogMjU1O1xuXHR2YXIgYiA9ICgoKGNvbG9yID4+IDIpICYgMSkgKiBtdWx0KSAqIDI1NTtcblxuXHRyZXR1cm4gW3IsIGcsIGJdO1xufTtcblxuY29udmVydC5hbnNpMjU2LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdC8vIGhhbmRsZSBncmV5c2NhbGVcblx0aWYgKGFyZ3MgPj0gMjMyKSB7XG5cdFx0dmFyIGMgPSAoYXJncyAtIDIzMikgKiAxMCArIDg7XG5cdFx0cmV0dXJuIFtjLCBjLCBjXTtcblx0fVxuXG5cdGFyZ3MgLT0gMTY7XG5cblx0dmFyIHJlbTtcblx0dmFyIHIgPSBNYXRoLmZsb29yKGFyZ3MgLyAzNikgLyA1ICogMjU1O1xuXHR2YXIgZyA9IE1hdGguZmxvb3IoKHJlbSA9IGFyZ3MgJSAzNikgLyA2KSAvIDUgKiAyNTU7XG5cdHZhciBiID0gKHJlbSAlIDYpIC8gNSAqIDI1NTtcblxuXHRyZXR1cm4gW3IsIGcsIGJdO1xufTtcblxuY29udmVydC5yZ2IuaGV4ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0dmFyIGludGVnZXIgPSAoKE1hdGgucm91bmQoYXJnc1swXSkgJiAweEZGKSA8PCAxNilcblx0XHQrICgoTWF0aC5yb3VuZChhcmdzWzFdKSAmIDB4RkYpIDw8IDgpXG5cdFx0KyAoTWF0aC5yb3VuZChhcmdzWzJdKSAmIDB4RkYpO1xuXG5cdHZhciBzdHJpbmcgPSBpbnRlZ2VyLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRyZXR1cm4gJzAwMDAwMCcuc3Vic3RyaW5nKHN0cmluZy5sZW5ndGgpICsgc3RyaW5nO1xufTtcblxuY29udmVydC5oZXgucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0dmFyIG1hdGNoID0gYXJncy50b1N0cmluZygxNikubWF0Y2goL1thLWYwLTldezZ9fFthLWYwLTldezN9L2kpO1xuXHRpZiAoIW1hdGNoKSB7XG5cdFx0cmV0dXJuIFswLCAwLCAwXTtcblx0fVxuXG5cdHZhciBjb2xvclN0cmluZyA9IG1hdGNoWzBdO1xuXG5cdGlmIChtYXRjaFswXS5sZW5ndGggPT09IDMpIHtcblx0XHRjb2xvclN0cmluZyA9IGNvbG9yU3RyaW5nLnNwbGl0KCcnKS5tYXAoZnVuY3Rpb24gKGNoYXIpIHtcblx0XHRcdHJldHVybiBjaGFyICsgY2hhcjtcblx0XHR9KS5qb2luKCcnKTtcblx0fVxuXG5cdHZhciBpbnRlZ2VyID0gcGFyc2VJbnQoY29sb3JTdHJpbmcsIDE2KTtcblx0dmFyIHIgPSAoaW50ZWdlciA+PiAxNikgJiAweEZGO1xuXHR2YXIgZyA9IChpbnRlZ2VyID4+IDgpICYgMHhGRjtcblx0dmFyIGIgPSBpbnRlZ2VyICYgMHhGRjtcblxuXHRyZXR1cm4gW3IsIGcsIGJdO1xufTtcblxuY29udmVydC5yZ2IuaGNnID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgciA9IHJnYlswXSAvIDI1NTtcblx0dmFyIGcgPSByZ2JbMV0gLyAyNTU7XG5cdHZhciBiID0gcmdiWzJdIC8gMjU1O1xuXHR2YXIgbWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgociwgZyksIGIpO1xuXHR2YXIgbWluID0gTWF0aC5taW4oTWF0aC5taW4ociwgZyksIGIpO1xuXHR2YXIgY2hyb21hID0gKG1heCAtIG1pbik7XG5cdHZhciBncmF5c2NhbGU7XG5cdHZhciBodWU7XG5cblx0aWYgKGNocm9tYSA8IDEpIHtcblx0XHRncmF5c2NhbGUgPSBtaW4gLyAoMSAtIGNocm9tYSk7XG5cdH0gZWxzZSB7XG5cdFx0Z3JheXNjYWxlID0gMDtcblx0fVxuXG5cdGlmIChjaHJvbWEgPD0gMCkge1xuXHRcdGh1ZSA9IDA7XG5cdH0gZWxzZVxuXHRpZiAobWF4ID09PSByKSB7XG5cdFx0aHVlID0gKChnIC0gYikgLyBjaHJvbWEpICUgNjtcblx0fSBlbHNlXG5cdGlmIChtYXggPT09IGcpIHtcblx0XHRodWUgPSAyICsgKGIgLSByKSAvIGNocm9tYTtcblx0fSBlbHNlIHtcblx0XHRodWUgPSA0ICsgKHIgLSBnKSAvIGNocm9tYSArIDQ7XG5cdH1cblxuXHRodWUgLz0gNjtcblx0aHVlICU9IDE7XG5cblx0cmV0dXJuIFtodWUgKiAzNjAsIGNocm9tYSAqIDEwMCwgZ3JheXNjYWxlICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHNsLmhjZyA9IGZ1bmN0aW9uIChoc2wpIHtcblx0dmFyIHMgPSBoc2xbMV0gLyAxMDA7XG5cdHZhciBsID0gaHNsWzJdIC8gMTAwO1xuXHR2YXIgYyA9IDE7XG5cdHZhciBmID0gMDtcblxuXHRpZiAobCA8IDAuNSkge1xuXHRcdGMgPSAyLjAgKiBzICogbDtcblx0fSBlbHNlIHtcblx0XHRjID0gMi4wICogcyAqICgxLjAgLSBsKTtcblx0fVxuXG5cdGlmIChjIDwgMS4wKSB7XG5cdFx0ZiA9IChsIC0gMC41ICogYykgLyAoMS4wIC0gYyk7XG5cdH1cblxuXHRyZXR1cm4gW2hzbFswXSwgYyAqIDEwMCwgZiAqIDEwMF07XG59O1xuXG5jb252ZXJ0Lmhzdi5oY2cgPSBmdW5jdGlvbiAoaHN2KSB7XG5cdHZhciBzID0gaHN2WzFdIC8gMTAwO1xuXHR2YXIgdiA9IGhzdlsyXSAvIDEwMDtcblxuXHR2YXIgYyA9IHMgKiB2O1xuXHR2YXIgZiA9IDA7XG5cblx0aWYgKGMgPCAxLjApIHtcblx0XHRmID0gKHYgLSBjKSAvICgxIC0gYyk7XG5cdH1cblxuXHRyZXR1cm4gW2hzdlswXSwgYyAqIDEwMCwgZiAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhjZy5yZ2IgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdHZhciBoID0gaGNnWzBdIC8gMzYwO1xuXHR2YXIgYyA9IGhjZ1sxXSAvIDEwMDtcblx0dmFyIGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0aWYgKGMgPT09IDAuMCkge1xuXHRcdHJldHVybiBbZyAqIDI1NSwgZyAqIDI1NSwgZyAqIDI1NV07XG5cdH1cblxuXHR2YXIgcHVyZSA9IFswLCAwLCAwXTtcblx0dmFyIGhpID0gKGggJSAxKSAqIDY7XG5cdHZhciB2ID0gaGkgJSAxO1xuXHR2YXIgdyA9IDEgLSB2O1xuXHR2YXIgbWcgPSAwO1xuXG5cdHN3aXRjaCAoTWF0aC5mbG9vcihoaSkpIHtcblx0XHRjYXNlIDA6XG5cdFx0XHRwdXJlWzBdID0gMTsgcHVyZVsxXSA9IHY7IHB1cmVbMl0gPSAwOyBicmVhaztcblx0XHRjYXNlIDE6XG5cdFx0XHRwdXJlWzBdID0gdzsgcHVyZVsxXSA9IDE7IHB1cmVbMl0gPSAwOyBicmVhaztcblx0XHRjYXNlIDI6XG5cdFx0XHRwdXJlWzBdID0gMDsgcHVyZVsxXSA9IDE7IHB1cmVbMl0gPSB2OyBicmVhaztcblx0XHRjYXNlIDM6XG5cdFx0XHRwdXJlWzBdID0gMDsgcHVyZVsxXSA9IHc7IHB1cmVbMl0gPSAxOyBicmVhaztcblx0XHRjYXNlIDQ6XG5cdFx0XHRwdXJlWzBdID0gdjsgcHVyZVsxXSA9IDA7IHB1cmVbMl0gPSAxOyBicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0cHVyZVswXSA9IDE7IHB1cmVbMV0gPSAwOyBwdXJlWzJdID0gdztcblx0fVxuXG5cdG1nID0gKDEuMCAtIGMpICogZztcblxuXHRyZXR1cm4gW1xuXHRcdChjICogcHVyZVswXSArIG1nKSAqIDI1NSxcblx0XHQoYyAqIHB1cmVbMV0gKyBtZykgKiAyNTUsXG5cdFx0KGMgKiBwdXJlWzJdICsgbWcpICogMjU1XG5cdF07XG59O1xuXG5jb252ZXJ0LmhjZy5oc3YgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdHZhciBjID0gaGNnWzFdIC8gMTAwO1xuXHR2YXIgZyA9IGhjZ1syXSAvIDEwMDtcblxuXHR2YXIgdiA9IGMgKyBnICogKDEuMCAtIGMpO1xuXHR2YXIgZiA9IDA7XG5cblx0aWYgKHYgPiAwLjApIHtcblx0XHRmID0gYyAvIHY7XG5cdH1cblxuXHRyZXR1cm4gW2hjZ1swXSwgZiAqIDEwMCwgdiAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhjZy5oc2wgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdHZhciBjID0gaGNnWzFdIC8gMTAwO1xuXHR2YXIgZyA9IGhjZ1syXSAvIDEwMDtcblxuXHR2YXIgbCA9IGcgKiAoMS4wIC0gYykgKyAwLjUgKiBjO1xuXHR2YXIgcyA9IDA7XG5cblx0aWYgKGwgPiAwLjAgJiYgbCA8IDAuNSkge1xuXHRcdHMgPSBjIC8gKDIgKiBsKTtcblx0fSBlbHNlXG5cdGlmIChsID49IDAuNSAmJiBsIDwgMS4wKSB7XG5cdFx0cyA9IGMgLyAoMiAqICgxIC0gbCkpO1xuXHR9XG5cblx0cmV0dXJuIFtoY2dbMF0sIHMgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuY29udmVydC5oY2cuaHdiID0gZnVuY3Rpb24gKGhjZykge1xuXHR2YXIgYyA9IGhjZ1sxXSAvIDEwMDtcblx0dmFyIGcgPSBoY2dbMl0gLyAxMDA7XG5cdHZhciB2ID0gYyArIGcgKiAoMS4wIC0gYyk7XG5cdHJldHVybiBbaGNnWzBdLCAodiAtIGMpICogMTAwLCAoMSAtIHYpICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHdiLmhjZyA9IGZ1bmN0aW9uIChod2IpIHtcblx0dmFyIHcgPSBod2JbMV0gLyAxMDA7XG5cdHZhciBiID0gaHdiWzJdIC8gMTAwO1xuXHR2YXIgdiA9IDEgLSBiO1xuXHR2YXIgYyA9IHYgLSB3O1xuXHR2YXIgZyA9IDA7XG5cblx0aWYgKGMgPCAxKSB7XG5cdFx0ZyA9ICh2IC0gYykgLyAoMSAtIGMpO1xuXHR9XG5cblx0cmV0dXJuIFtod2JbMF0sIGMgKiAxMDAsIGcgKiAxMDBdO1xufTtcblxuY29udmVydC5hcHBsZS5yZ2IgPSBmdW5jdGlvbiAoYXBwbGUpIHtcblx0cmV0dXJuIFsoYXBwbGVbMF0gLyA2NTUzNSkgKiAyNTUsIChhcHBsZVsxXSAvIDY1NTM1KSAqIDI1NSwgKGFwcGxlWzJdIC8gNjU1MzUpICogMjU1XTtcbn07XG5cbmNvbnZlcnQucmdiLmFwcGxlID0gZnVuY3Rpb24gKHJnYikge1xuXHRyZXR1cm4gWyhyZ2JbMF0gLyAyNTUpICogNjU1MzUsIChyZ2JbMV0gLyAyNTUpICogNjU1MzUsIChyZ2JbMl0gLyAyNTUpICogNjU1MzVdO1xufTtcblxuY29udmVydC5ncmF5LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHJldHVybiBbYXJnc1swXSAvIDEwMCAqIDI1NSwgYXJnc1swXSAvIDEwMCAqIDI1NSwgYXJnc1swXSAvIDEwMCAqIDI1NV07XG59O1xuXG5jb252ZXJ0LmdyYXkuaHNsID0gY29udmVydC5ncmF5LmhzdiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHJldHVybiBbMCwgMCwgYXJnc1swXV07XG59O1xuXG5jb252ZXJ0LmdyYXkuaHdiID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0cmV0dXJuIFswLCAxMDAsIGdyYXlbMF1dO1xufTtcblxuY29udmVydC5ncmF5LmNteWsgPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRyZXR1cm4gWzAsIDAsIDAsIGdyYXlbMF1dO1xufTtcblxuY29udmVydC5ncmF5LmxhYiA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHJldHVybiBbZ3JheVswXSwgMCwgMF07XG59O1xuXG5jb252ZXJ0LmdyYXkuaGV4ID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0dmFyIHZhbCA9IE1hdGgucm91bmQoZ3JheVswXSAvIDEwMCAqIDI1NSkgJiAweEZGO1xuXHR2YXIgaW50ZWdlciA9ICh2YWwgPDwgMTYpICsgKHZhbCA8PCA4KSArIHZhbDtcblxuXHR2YXIgc3RyaW5nID0gaW50ZWdlci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0cmV0dXJuICcwMDAwMDAnLnN1YnN0cmluZyhzdHJpbmcubGVuZ3RoKSArIHN0cmluZztcbn07XG5cbmNvbnZlcnQucmdiLmdyYXkgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciB2YWwgPSAocmdiWzBdICsgcmdiWzFdICsgcmdiWzJdKSAvIDM7XG5cdHJldHVybiBbdmFsIC8gMjU1ICogMTAwXTtcbn07XG4iLCJ2YXIgY29udmVyc2lvbnMgPSByZXF1aXJlKCcuL2NvbnZlcnNpb25zJyk7XG52YXIgcm91dGUgPSByZXF1aXJlKCcuL3JvdXRlJyk7XG5cbnZhciBjb252ZXJ0ID0ge307XG5cbnZhciBtb2RlbHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9ucyk7XG5cbmZ1bmN0aW9uIHdyYXBSYXcoZm4pIHtcblx0dmFyIHdyYXBwZWRGbiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdFx0aWYgKGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gYXJncztcblx0XHR9XG5cblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXHRcdH1cblxuXHRcdHJldHVybiBmbihhcmdzKTtcblx0fTtcblxuXHQvLyBwcmVzZXJ2ZSAuY29udmVyc2lvbiBwcm9wZXJ0eSBpZiB0aGVyZSBpcyBvbmVcblx0aWYgKCdjb252ZXJzaW9uJyBpbiBmbikge1xuXHRcdHdyYXBwZWRGbi5jb252ZXJzaW9uID0gZm4uY29udmVyc2lvbjtcblx0fVxuXG5cdHJldHVybiB3cmFwcGVkRm47XG59XG5cbmZ1bmN0aW9uIHdyYXBSb3VuZGVkKGZuKSB7XG5cdHZhciB3cmFwcGVkRm4gPSBmdW5jdGlvbiAoYXJncykge1xuXHRcdGlmIChhcmdzID09PSB1bmRlZmluZWQgfHwgYXJncyA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGFyZ3M7XG5cdFx0fVxuXG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblx0XHR9XG5cblx0XHR2YXIgcmVzdWx0ID0gZm4oYXJncyk7XG5cblx0XHQvLyB3ZSdyZSBhc3N1bWluZyB0aGUgcmVzdWx0IGlzIGFuIGFycmF5IGhlcmUuXG5cdFx0Ly8gc2VlIG5vdGljZSBpbiBjb252ZXJzaW9ucy5qczsgZG9uJ3QgdXNlIGJveCB0eXBlc1xuXHRcdC8vIGluIGNvbnZlcnNpb24gZnVuY3Rpb25zLlxuXHRcdGlmICh0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0Jykge1xuXHRcdFx0Zm9yICh2YXIgbGVuID0gcmVzdWx0Lmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0XHRyZXN1bHRbaV0gPSBNYXRoLnJvdW5kKHJlc3VsdFtpXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fTtcblxuXHQvLyBwcmVzZXJ2ZSAuY29udmVyc2lvbiBwcm9wZXJ0eSBpZiB0aGVyZSBpcyBvbmVcblx0aWYgKCdjb252ZXJzaW9uJyBpbiBmbikge1xuXHRcdHdyYXBwZWRGbi5jb252ZXJzaW9uID0gZm4uY29udmVyc2lvbjtcblx0fVxuXG5cdHJldHVybiB3cmFwcGVkRm47XG59XG5cbm1vZGVscy5mb3JFYWNoKGZ1bmN0aW9uIChmcm9tTW9kZWwpIHtcblx0Y29udmVydFtmcm9tTW9kZWxdID0ge307XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbZnJvbU1vZGVsXSwgJ2NoYW5uZWxzJywge3ZhbHVlOiBjb252ZXJzaW9uc1tmcm9tTW9kZWxdLmNoYW5uZWxzfSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W2Zyb21Nb2RlbF0sICdsYWJlbHMnLCB7dmFsdWU6IGNvbnZlcnNpb25zW2Zyb21Nb2RlbF0ubGFiZWxzfSk7XG5cblx0dmFyIHJvdXRlcyA9IHJvdXRlKGZyb21Nb2RlbCk7XG5cdHZhciByb3V0ZU1vZGVscyA9IE9iamVjdC5rZXlzKHJvdXRlcyk7XG5cblx0cm91dGVNb2RlbHMuZm9yRWFjaChmdW5jdGlvbiAodG9Nb2RlbCkge1xuXHRcdHZhciBmbiA9IHJvdXRlc1t0b01vZGVsXTtcblxuXHRcdGNvbnZlcnRbZnJvbU1vZGVsXVt0b01vZGVsXSA9IHdyYXBSb3VuZGVkKGZuKTtcblx0XHRjb252ZXJ0W2Zyb21Nb2RlbF1bdG9Nb2RlbF0ucmF3ID0gd3JhcFJhdyhmbik7XG5cdH0pO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gY29udmVydDtcbiIsInZhciBjb252ZXJzaW9ucyA9IHJlcXVpcmUoJy4vY29udmVyc2lvbnMnKTtcblxuLypcblx0dGhpcyBmdW5jdGlvbiByb3V0ZXMgYSBtb2RlbCB0byBhbGwgb3RoZXIgbW9kZWxzLlxuXG5cdGFsbCBmdW5jdGlvbnMgdGhhdCBhcmUgcm91dGVkIGhhdmUgYSBwcm9wZXJ0eSBgLmNvbnZlcnNpb25gIGF0dGFjaGVkXG5cdHRvIHRoZSByZXR1cm5lZCBzeW50aGV0aWMgZnVuY3Rpb24uIFRoaXMgcHJvcGVydHkgaXMgYW4gYXJyYXlcblx0b2Ygc3RyaW5ncywgZWFjaCB3aXRoIHRoZSBzdGVwcyBpbiBiZXR3ZWVuIHRoZSAnZnJvbScgYW5kICd0bydcblx0Y29sb3IgbW9kZWxzIChpbmNsdXNpdmUpLlxuXG5cdGNvbnZlcnNpb25zIHRoYXQgYXJlIG5vdCBwb3NzaWJsZSBzaW1wbHkgYXJlIG5vdCBpbmNsdWRlZC5cbiovXG5cbmZ1bmN0aW9uIGJ1aWxkR3JhcGgoKSB7XG5cdHZhciBncmFwaCA9IHt9O1xuXHQvLyBodHRwczovL2pzcGVyZi5jb20vb2JqZWN0LWtleXMtdnMtZm9yLWluLXdpdGgtY2xvc3VyZS8zXG5cdHZhciBtb2RlbHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9ucyk7XG5cblx0Zm9yICh2YXIgbGVuID0gbW9kZWxzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdGdyYXBoW21vZGVsc1tpXV0gPSB7XG5cdFx0XHQvLyBodHRwOi8vanNwZXJmLmNvbS8xLXZzLWluZmluaXR5XG5cdFx0XHQvLyBtaWNyby1vcHQsIGJ1dCB0aGlzIGlzIHNpbXBsZS5cblx0XHRcdGRpc3RhbmNlOiAtMSxcblx0XHRcdHBhcmVudDogbnVsbFxuXHRcdH07XG5cdH1cblxuXHRyZXR1cm4gZ3JhcGg7XG59XG5cbi8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JyZWFkdGgtZmlyc3Rfc2VhcmNoXG5mdW5jdGlvbiBkZXJpdmVCRlMoZnJvbU1vZGVsKSB7XG5cdHZhciBncmFwaCA9IGJ1aWxkR3JhcGgoKTtcblx0dmFyIHF1ZXVlID0gW2Zyb21Nb2RlbF07IC8vIHVuc2hpZnQgLT4gcXVldWUgLT4gcG9wXG5cblx0Z3JhcGhbZnJvbU1vZGVsXS5kaXN0YW5jZSA9IDA7XG5cblx0d2hpbGUgKHF1ZXVlLmxlbmd0aCkge1xuXHRcdHZhciBjdXJyZW50ID0gcXVldWUucG9wKCk7XG5cdFx0dmFyIGFkamFjZW50cyA9IE9iamVjdC5rZXlzKGNvbnZlcnNpb25zW2N1cnJlbnRdKTtcblxuXHRcdGZvciAodmFyIGxlbiA9IGFkamFjZW50cy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdHZhciBhZGphY2VudCA9IGFkamFjZW50c1tpXTtcblx0XHRcdHZhciBub2RlID0gZ3JhcGhbYWRqYWNlbnRdO1xuXG5cdFx0XHRpZiAobm9kZS5kaXN0YW5jZSA9PT0gLTEpIHtcblx0XHRcdFx0bm9kZS5kaXN0YW5jZSA9IGdyYXBoW2N1cnJlbnRdLmRpc3RhbmNlICsgMTtcblx0XHRcdFx0bm9kZS5wYXJlbnQgPSBjdXJyZW50O1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KGFkamFjZW50KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZ3JhcGg7XG59XG5cbmZ1bmN0aW9uIGxpbmsoZnJvbSwgdG8pIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChhcmdzKSB7XG5cdFx0cmV0dXJuIHRvKGZyb20oYXJncykpO1xuXHR9O1xufVxuXG5mdW5jdGlvbiB3cmFwQ29udmVyc2lvbih0b01vZGVsLCBncmFwaCkge1xuXHR2YXIgcGF0aCA9IFtncmFwaFt0b01vZGVsXS5wYXJlbnQsIHRvTW9kZWxdO1xuXHR2YXIgZm4gPSBjb252ZXJzaW9uc1tncmFwaFt0b01vZGVsXS5wYXJlbnRdW3RvTW9kZWxdO1xuXG5cdHZhciBjdXIgPSBncmFwaFt0b01vZGVsXS5wYXJlbnQ7XG5cdHdoaWxlIChncmFwaFtjdXJdLnBhcmVudCkge1xuXHRcdHBhdGgudW5zaGlmdChncmFwaFtjdXJdLnBhcmVudCk7XG5cdFx0Zm4gPSBsaW5rKGNvbnZlcnNpb25zW2dyYXBoW2N1cl0ucGFyZW50XVtjdXJdLCBmbik7XG5cdFx0Y3VyID0gZ3JhcGhbY3VyXS5wYXJlbnQ7XG5cdH1cblxuXHRmbi5jb252ZXJzaW9uID0gcGF0aDtcblx0cmV0dXJuIGZuO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmcm9tTW9kZWwpIHtcblx0dmFyIGdyYXBoID0gZGVyaXZlQkZTKGZyb21Nb2RlbCk7XG5cdHZhciBjb252ZXJzaW9uID0ge307XG5cblx0dmFyIG1vZGVscyA9IE9iamVjdC5rZXlzKGdyYXBoKTtcblx0Zm9yICh2YXIgbGVuID0gbW9kZWxzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdHZhciB0b01vZGVsID0gbW9kZWxzW2ldO1xuXHRcdHZhciBub2RlID0gZ3JhcGhbdG9Nb2RlbF07XG5cblx0XHRpZiAobm9kZS5wYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdC8vIG5vIHBvc3NpYmxlIGNvbnZlcnNpb24sIG9yIHRoaXMgbm9kZSBpcyB0aGUgc291cmNlIG1vZGVsLlxuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29udmVyc2lvblt0b01vZGVsXSA9IHdyYXBDb252ZXJzaW9uKHRvTW9kZWwsIGdyYXBoKTtcblx0fVxuXG5cdHJldHVybiBjb252ZXJzaW9uO1xufTtcblxuIiwiJ3VzZSBzdHJpY3QnXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHRcImFsaWNlYmx1ZVwiOiBbMjQwLCAyNDgsIDI1NV0sXHJcblx0XCJhbnRpcXVld2hpdGVcIjogWzI1MCwgMjM1LCAyMTVdLFxyXG5cdFwiYXF1YVwiOiBbMCwgMjU1LCAyNTVdLFxyXG5cdFwiYXF1YW1hcmluZVwiOiBbMTI3LCAyNTUsIDIxMl0sXHJcblx0XCJhenVyZVwiOiBbMjQwLCAyNTUsIDI1NV0sXHJcblx0XCJiZWlnZVwiOiBbMjQ1LCAyNDUsIDIyMF0sXHJcblx0XCJiaXNxdWVcIjogWzI1NSwgMjI4LCAxOTZdLFxyXG5cdFwiYmxhY2tcIjogWzAsIDAsIDBdLFxyXG5cdFwiYmxhbmNoZWRhbG1vbmRcIjogWzI1NSwgMjM1LCAyMDVdLFxyXG5cdFwiYmx1ZVwiOiBbMCwgMCwgMjU1XSxcclxuXHRcImJsdWV2aW9sZXRcIjogWzEzOCwgNDMsIDIyNl0sXHJcblx0XCJicm93blwiOiBbMTY1LCA0MiwgNDJdLFxyXG5cdFwiYnVybHl3b29kXCI6IFsyMjIsIDE4NCwgMTM1XSxcclxuXHRcImNhZGV0Ymx1ZVwiOiBbOTUsIDE1OCwgMTYwXSxcclxuXHRcImNoYXJ0cmV1c2VcIjogWzEyNywgMjU1LCAwXSxcclxuXHRcImNob2NvbGF0ZVwiOiBbMjEwLCAxMDUsIDMwXSxcclxuXHRcImNvcmFsXCI6IFsyNTUsIDEyNywgODBdLFxyXG5cdFwiY29ybmZsb3dlcmJsdWVcIjogWzEwMCwgMTQ5LCAyMzddLFxyXG5cdFwiY29ybnNpbGtcIjogWzI1NSwgMjQ4LCAyMjBdLFxyXG5cdFwiY3JpbXNvblwiOiBbMjIwLCAyMCwgNjBdLFxyXG5cdFwiY3lhblwiOiBbMCwgMjU1LCAyNTVdLFxyXG5cdFwiZGFya2JsdWVcIjogWzAsIDAsIDEzOV0sXHJcblx0XCJkYXJrY3lhblwiOiBbMCwgMTM5LCAxMzldLFxyXG5cdFwiZGFya2dvbGRlbnJvZFwiOiBbMTg0LCAxMzQsIDExXSxcclxuXHRcImRhcmtncmF5XCI6IFsxNjksIDE2OSwgMTY5XSxcclxuXHRcImRhcmtncmVlblwiOiBbMCwgMTAwLCAwXSxcclxuXHRcImRhcmtncmV5XCI6IFsxNjksIDE2OSwgMTY5XSxcclxuXHRcImRhcmtraGFraVwiOiBbMTg5LCAxODMsIDEwN10sXHJcblx0XCJkYXJrbWFnZW50YVwiOiBbMTM5LCAwLCAxMzldLFxyXG5cdFwiZGFya29saXZlZ3JlZW5cIjogWzg1LCAxMDcsIDQ3XSxcclxuXHRcImRhcmtvcmFuZ2VcIjogWzI1NSwgMTQwLCAwXSxcclxuXHRcImRhcmtvcmNoaWRcIjogWzE1MywgNTAsIDIwNF0sXHJcblx0XCJkYXJrcmVkXCI6IFsxMzksIDAsIDBdLFxyXG5cdFwiZGFya3NhbG1vblwiOiBbMjMzLCAxNTAsIDEyMl0sXHJcblx0XCJkYXJrc2VhZ3JlZW5cIjogWzE0MywgMTg4LCAxNDNdLFxyXG5cdFwiZGFya3NsYXRlYmx1ZVwiOiBbNzIsIDYxLCAxMzldLFxyXG5cdFwiZGFya3NsYXRlZ3JheVwiOiBbNDcsIDc5LCA3OV0sXHJcblx0XCJkYXJrc2xhdGVncmV5XCI6IFs0NywgNzksIDc5XSxcclxuXHRcImRhcmt0dXJxdW9pc2VcIjogWzAsIDIwNiwgMjA5XSxcclxuXHRcImRhcmt2aW9sZXRcIjogWzE0OCwgMCwgMjExXSxcclxuXHRcImRlZXBwaW5rXCI6IFsyNTUsIDIwLCAxNDddLFxyXG5cdFwiZGVlcHNreWJsdWVcIjogWzAsIDE5MSwgMjU1XSxcclxuXHRcImRpbWdyYXlcIjogWzEwNSwgMTA1LCAxMDVdLFxyXG5cdFwiZGltZ3JleVwiOiBbMTA1LCAxMDUsIDEwNV0sXHJcblx0XCJkb2RnZXJibHVlXCI6IFszMCwgMTQ0LCAyNTVdLFxyXG5cdFwiZmlyZWJyaWNrXCI6IFsxNzgsIDM0LCAzNF0sXHJcblx0XCJmbG9yYWx3aGl0ZVwiOiBbMjU1LCAyNTAsIDI0MF0sXHJcblx0XCJmb3Jlc3RncmVlblwiOiBbMzQsIDEzOSwgMzRdLFxyXG5cdFwiZnVjaHNpYVwiOiBbMjU1LCAwLCAyNTVdLFxyXG5cdFwiZ2FpbnNib3JvXCI6IFsyMjAsIDIyMCwgMjIwXSxcclxuXHRcImdob3N0d2hpdGVcIjogWzI0OCwgMjQ4LCAyNTVdLFxyXG5cdFwiZ29sZFwiOiBbMjU1LCAyMTUsIDBdLFxyXG5cdFwiZ29sZGVucm9kXCI6IFsyMTgsIDE2NSwgMzJdLFxyXG5cdFwiZ3JheVwiOiBbMTI4LCAxMjgsIDEyOF0sXHJcblx0XCJncmVlblwiOiBbMCwgMTI4LCAwXSxcclxuXHRcImdyZWVueWVsbG93XCI6IFsxNzMsIDI1NSwgNDddLFxyXG5cdFwiZ3JleVwiOiBbMTI4LCAxMjgsIDEyOF0sXHJcblx0XCJob25leWRld1wiOiBbMjQwLCAyNTUsIDI0MF0sXHJcblx0XCJob3RwaW5rXCI6IFsyNTUsIDEwNSwgMTgwXSxcclxuXHRcImluZGlhbnJlZFwiOiBbMjA1LCA5MiwgOTJdLFxyXG5cdFwiaW5kaWdvXCI6IFs3NSwgMCwgMTMwXSxcclxuXHRcIml2b3J5XCI6IFsyNTUsIDI1NSwgMjQwXSxcclxuXHRcImtoYWtpXCI6IFsyNDAsIDIzMCwgMTQwXSxcclxuXHRcImxhdmVuZGVyXCI6IFsyMzAsIDIzMCwgMjUwXSxcclxuXHRcImxhdmVuZGVyYmx1c2hcIjogWzI1NSwgMjQwLCAyNDVdLFxyXG5cdFwibGF3bmdyZWVuXCI6IFsxMjQsIDI1MiwgMF0sXHJcblx0XCJsZW1vbmNoaWZmb25cIjogWzI1NSwgMjUwLCAyMDVdLFxyXG5cdFwibGlnaHRibHVlXCI6IFsxNzMsIDIxNiwgMjMwXSxcclxuXHRcImxpZ2h0Y29yYWxcIjogWzI0MCwgMTI4LCAxMjhdLFxyXG5cdFwibGlnaHRjeWFuXCI6IFsyMjQsIDI1NSwgMjU1XSxcclxuXHRcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFsyNTAsIDI1MCwgMjEwXSxcclxuXHRcImxpZ2h0Z3JheVwiOiBbMjExLCAyMTEsIDIxMV0sXHJcblx0XCJsaWdodGdyZWVuXCI6IFsxNDQsIDIzOCwgMTQ0XSxcclxuXHRcImxpZ2h0Z3JleVwiOiBbMjExLCAyMTEsIDIxMV0sXHJcblx0XCJsaWdodHBpbmtcIjogWzI1NSwgMTgyLCAxOTNdLFxyXG5cdFwibGlnaHRzYWxtb25cIjogWzI1NSwgMTYwLCAxMjJdLFxyXG5cdFwibGlnaHRzZWFncmVlblwiOiBbMzIsIDE3OCwgMTcwXSxcclxuXHRcImxpZ2h0c2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDI1MF0sXHJcblx0XCJsaWdodHNsYXRlZ3JheVwiOiBbMTE5LCAxMzYsIDE1M10sXHJcblx0XCJsaWdodHNsYXRlZ3JleVwiOiBbMTE5LCAxMzYsIDE1M10sXHJcblx0XCJsaWdodHN0ZWVsYmx1ZVwiOiBbMTc2LCAxOTYsIDIyMl0sXHJcblx0XCJsaWdodHllbGxvd1wiOiBbMjU1LCAyNTUsIDIyNF0sXHJcblx0XCJsaW1lXCI6IFswLCAyNTUsIDBdLFxyXG5cdFwibGltZWdyZWVuXCI6IFs1MCwgMjA1LCA1MF0sXHJcblx0XCJsaW5lblwiOiBbMjUwLCAyNDAsIDIzMF0sXHJcblx0XCJtYWdlbnRhXCI6IFsyNTUsIDAsIDI1NV0sXHJcblx0XCJtYXJvb25cIjogWzEyOCwgMCwgMF0sXHJcblx0XCJtZWRpdW1hcXVhbWFyaW5lXCI6IFsxMDIsIDIwNSwgMTcwXSxcclxuXHRcIm1lZGl1bWJsdWVcIjogWzAsIDAsIDIwNV0sXHJcblx0XCJtZWRpdW1vcmNoaWRcIjogWzE4NiwgODUsIDIxMV0sXHJcblx0XCJtZWRpdW1wdXJwbGVcIjogWzE0NywgMTEyLCAyMTldLFxyXG5cdFwibWVkaXVtc2VhZ3JlZW5cIjogWzYwLCAxNzksIDExM10sXHJcblx0XCJtZWRpdW1zbGF0ZWJsdWVcIjogWzEyMywgMTA0LCAyMzhdLFxyXG5cdFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogWzAsIDI1MCwgMTU0XSxcclxuXHRcIm1lZGl1bXR1cnF1b2lzZVwiOiBbNzIsIDIwOSwgMjA0XSxcclxuXHRcIm1lZGl1bXZpb2xldHJlZFwiOiBbMTk5LCAyMSwgMTMzXSxcclxuXHRcIm1pZG5pZ2h0Ymx1ZVwiOiBbMjUsIDI1LCAxMTJdLFxyXG5cdFwibWludGNyZWFtXCI6IFsyNDUsIDI1NSwgMjUwXSxcclxuXHRcIm1pc3R5cm9zZVwiOiBbMjU1LCAyMjgsIDIyNV0sXHJcblx0XCJtb2NjYXNpblwiOiBbMjU1LCAyMjgsIDE4MV0sXHJcblx0XCJuYXZham93aGl0ZVwiOiBbMjU1LCAyMjIsIDE3M10sXHJcblx0XCJuYXZ5XCI6IFswLCAwLCAxMjhdLFxyXG5cdFwib2xkbGFjZVwiOiBbMjUzLCAyNDUsIDIzMF0sXHJcblx0XCJvbGl2ZVwiOiBbMTI4LCAxMjgsIDBdLFxyXG5cdFwib2xpdmVkcmFiXCI6IFsxMDcsIDE0MiwgMzVdLFxyXG5cdFwib3JhbmdlXCI6IFsyNTUsIDE2NSwgMF0sXHJcblx0XCJvcmFuZ2VyZWRcIjogWzI1NSwgNjksIDBdLFxyXG5cdFwib3JjaGlkXCI6IFsyMTgsIDExMiwgMjE0XSxcclxuXHRcInBhbGVnb2xkZW5yb2RcIjogWzIzOCwgMjMyLCAxNzBdLFxyXG5cdFwicGFsZWdyZWVuXCI6IFsxNTIsIDI1MSwgMTUyXSxcclxuXHRcInBhbGV0dXJxdW9pc2VcIjogWzE3NSwgMjM4LCAyMzhdLFxyXG5cdFwicGFsZXZpb2xldHJlZFwiOiBbMjE5LCAxMTIsIDE0N10sXHJcblx0XCJwYXBheWF3aGlwXCI6IFsyNTUsIDIzOSwgMjEzXSxcclxuXHRcInBlYWNocHVmZlwiOiBbMjU1LCAyMTgsIDE4NV0sXHJcblx0XCJwZXJ1XCI6IFsyMDUsIDEzMywgNjNdLFxyXG5cdFwicGlua1wiOiBbMjU1LCAxOTIsIDIwM10sXHJcblx0XCJwbHVtXCI6IFsyMjEsIDE2MCwgMjIxXSxcclxuXHRcInBvd2RlcmJsdWVcIjogWzE3NiwgMjI0LCAyMzBdLFxyXG5cdFwicHVycGxlXCI6IFsxMjgsIDAsIDEyOF0sXHJcblx0XCJyZWJlY2NhcHVycGxlXCI6IFsxMDIsIDUxLCAxNTNdLFxyXG5cdFwicmVkXCI6IFsyNTUsIDAsIDBdLFxyXG5cdFwicm9zeWJyb3duXCI6IFsxODgsIDE0MywgMTQzXSxcclxuXHRcInJveWFsYmx1ZVwiOiBbNjUsIDEwNSwgMjI1XSxcclxuXHRcInNhZGRsZWJyb3duXCI6IFsxMzksIDY5LCAxOV0sXHJcblx0XCJzYWxtb25cIjogWzI1MCwgMTI4LCAxMTRdLFxyXG5cdFwic2FuZHlicm93blwiOiBbMjQ0LCAxNjQsIDk2XSxcclxuXHRcInNlYWdyZWVuXCI6IFs0NiwgMTM5LCA4N10sXHJcblx0XCJzZWFzaGVsbFwiOiBbMjU1LCAyNDUsIDIzOF0sXHJcblx0XCJzaWVubmFcIjogWzE2MCwgODIsIDQ1XSxcclxuXHRcInNpbHZlclwiOiBbMTkyLCAxOTIsIDE5Ml0sXHJcblx0XCJza3libHVlXCI6IFsxMzUsIDIwNiwgMjM1XSxcclxuXHRcInNsYXRlYmx1ZVwiOiBbMTA2LCA5MCwgMjA1XSxcclxuXHRcInNsYXRlZ3JheVwiOiBbMTEyLCAxMjgsIDE0NF0sXHJcblx0XCJzbGF0ZWdyZXlcIjogWzExMiwgMTI4LCAxNDRdLFxyXG5cdFwic25vd1wiOiBbMjU1LCAyNTAsIDI1MF0sXHJcblx0XCJzcHJpbmdncmVlblwiOiBbMCwgMjU1LCAxMjddLFxyXG5cdFwic3RlZWxibHVlXCI6IFs3MCwgMTMwLCAxODBdLFxyXG5cdFwidGFuXCI6IFsyMTAsIDE4MCwgMTQwXSxcclxuXHRcInRlYWxcIjogWzAsIDEyOCwgMTI4XSxcclxuXHRcInRoaXN0bGVcIjogWzIxNiwgMTkxLCAyMTZdLFxyXG5cdFwidG9tYXRvXCI6IFsyNTUsIDk5LCA3MV0sXHJcblx0XCJ0dXJxdW9pc2VcIjogWzY0LCAyMjQsIDIwOF0sXHJcblx0XCJ2aW9sZXRcIjogWzIzOCwgMTMwLCAyMzhdLFxyXG5cdFwid2hlYXRcIjogWzI0NSwgMjIyLCAxNzldLFxyXG5cdFwid2hpdGVcIjogWzI1NSwgMjU1LCAyNTVdLFxyXG5cdFwid2hpdGVzbW9rZVwiOiBbMjQ1LCAyNDUsIDI0NV0sXHJcblx0XCJ5ZWxsb3dcIjogWzI1NSwgMjU1LCAwXSxcclxuXHRcInllbGxvd2dyZWVuXCI6IFsxNTQsIDIwNSwgNTBdXHJcbn07XHJcbiIsIi8qIE1JVCBsaWNlbnNlICovXG52YXIgY29sb3JOYW1lcyA9IHJlcXVpcmUoJ2NvbG9yLW5hbWUnKTtcbnZhciBzd2l6emxlID0gcmVxdWlyZSgnc2ltcGxlLXN3aXp6bGUnKTtcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIHJldmVyc2VOYW1lcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbi8vIGNyZWF0ZSBhIGxpc3Qgb2YgcmV2ZXJzZSBjb2xvciBuYW1lc1xuZm9yICh2YXIgbmFtZSBpbiBjb2xvck5hbWVzKSB7XG5cdGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbG9yTmFtZXMsIG5hbWUpKSB7XG5cdFx0cmV2ZXJzZU5hbWVzW2NvbG9yTmFtZXNbbmFtZV1dID0gbmFtZTtcblx0fVxufVxuXG52YXIgY3MgPSBtb2R1bGUuZXhwb3J0cyA9IHtcblx0dG86IHt9LFxuXHRnZXQ6IHt9XG59O1xuXG5jcy5nZXQgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdHZhciBwcmVmaXggPSBzdHJpbmcuc3Vic3RyaW5nKDAsIDMpLnRvTG93ZXJDYXNlKCk7XG5cdHZhciB2YWw7XG5cdHZhciBtb2RlbDtcblx0c3dpdGNoIChwcmVmaXgpIHtcblx0XHRjYXNlICdoc2wnOlxuXHRcdFx0dmFsID0gY3MuZ2V0LmhzbChzdHJpbmcpO1xuXHRcdFx0bW9kZWwgPSAnaHNsJztcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ2h3Yic6XG5cdFx0XHR2YWwgPSBjcy5nZXQuaHdiKHN0cmluZyk7XG5cdFx0XHRtb2RlbCA9ICdod2InO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHZhbCA9IGNzLmdldC5yZ2Ioc3RyaW5nKTtcblx0XHRcdG1vZGVsID0gJ3JnYic7XG5cdFx0XHRicmVhaztcblx0fVxuXG5cdGlmICghdmFsKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRyZXR1cm4ge21vZGVsOiBtb2RlbCwgdmFsdWU6IHZhbH07XG59O1xuXG5jcy5nZXQucmdiID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHRpZiAoIXN0cmluZykge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0dmFyIGFiYnIgPSAvXiMoW2EtZjAtOV17Myw0fSkkL2k7XG5cdHZhciBoZXggPSAvXiMoW2EtZjAtOV17Nn0pKFthLWYwLTldezJ9KT8kL2k7XG5cdHZhciByZ2JhID0gL15yZ2JhP1xcKFxccyooWystXT9cXGQrKSg/PVtcXHMsXSlcXHMqKD86LFxccyopPyhbKy1dP1xcZCspKD89W1xccyxdKVxccyooPzosXFxzKik/KFsrLV0/XFxkKylcXHMqKD86Wyx8XFwvXVxccyooWystXT9bXFxkXFwuXSspKCU/KVxccyopP1xcKSQvO1xuXHR2YXIgcGVyID0gL15yZ2JhP1xcKFxccyooWystXT9bXFxkXFwuXSspXFwlXFxzKiw/XFxzKihbKy1dP1tcXGRcXC5dKylcXCVcXHMqLD9cXHMqKFsrLV0/W1xcZFxcLl0rKVxcJVxccyooPzpbLHxcXC9dXFxzKihbKy1dP1tcXGRcXC5dKykoJT8pXFxzKik/XFwpJC87XG5cdHZhciBrZXl3b3JkID0gL14oXFx3KykkLztcblxuXHR2YXIgcmdiID0gWzAsIDAsIDAsIDFdO1xuXHR2YXIgbWF0Y2g7XG5cdHZhciBpO1xuXHR2YXIgaGV4QWxwaGE7XG5cblx0aWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKGhleCkpIHtcblx0XHRoZXhBbHBoYSA9IG1hdGNoWzJdO1xuXHRcdG1hdGNoID0gbWF0Y2hbMV07XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0XHQvLyBodHRwczovL2pzcGVyZi5jb20vc2xpY2UtdnMtc3Vic3RyLXZzLXN1YnN0cmluZy1tZXRob2RzLWxvbmctc3RyaW5nLzE5XG5cdFx0XHR2YXIgaTIgPSBpICogMjtcblx0XHRcdHJnYltpXSA9IHBhcnNlSW50KG1hdGNoLnNsaWNlKGkyLCBpMiArIDIpLCAxNik7XG5cdFx0fVxuXG5cdFx0aWYgKGhleEFscGhhKSB7XG5cdFx0XHRyZ2JbM10gPSBwYXJzZUludChoZXhBbHBoYSwgMTYpIC8gMjU1O1xuXHRcdH1cblx0fSBlbHNlIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChhYmJyKSkge1xuXHRcdG1hdGNoID0gbWF0Y2hbMV07XG5cdFx0aGV4QWxwaGEgPSBtYXRjaFszXTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdHJnYltpXSA9IHBhcnNlSW50KG1hdGNoW2ldICsgbWF0Y2hbaV0sIDE2KTtcblx0XHR9XG5cblx0XHRpZiAoaGV4QWxwaGEpIHtcblx0XHRcdHJnYlszXSA9IHBhcnNlSW50KGhleEFscGhhICsgaGV4QWxwaGEsIDE2KSAvIDI1NTtcblx0XHR9XG5cdH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2gocmdiYSkpIHtcblx0XHRmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0XHRyZ2JbaV0gPSBwYXJzZUludChtYXRjaFtpICsgMV0sIDApO1xuXHRcdH1cblxuXHRcdGlmIChtYXRjaFs0XSkge1xuXHRcdFx0aWYgKG1hdGNoWzVdKSB7XG5cdFx0XHRcdHJnYlszXSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pICogMC4wMTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJnYlszXSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChwZXIpKSB7XG5cdFx0Zm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdFx0cmdiW2ldID0gTWF0aC5yb3VuZChwYXJzZUZsb2F0KG1hdGNoW2kgKyAxXSkgKiAyLjU1KTtcblx0XHR9XG5cblx0XHRpZiAobWF0Y2hbNF0pIHtcblx0XHRcdGlmIChtYXRjaFs1XSkge1xuXHRcdFx0XHRyZ2JbM10gPSBwYXJzZUZsb2F0KG1hdGNoWzRdKSAqIDAuMDE7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZ2JbM10gPSBwYXJzZUZsb2F0KG1hdGNoWzRdKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goa2V5d29yZCkpIHtcblx0XHRpZiAobWF0Y2hbMV0gPT09ICd0cmFuc3BhcmVudCcpIHtcblx0XHRcdHJldHVybiBbMCwgMCwgMCwgMF07XG5cdFx0fVxuXG5cdFx0aWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbG9yTmFtZXMsIG1hdGNoWzFdKSkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0cmdiID0gY29sb3JOYW1lc1ttYXRjaFsxXV07XG5cdFx0cmdiWzNdID0gMTtcblxuXHRcdHJldHVybiByZ2I7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0cmdiW2ldID0gY2xhbXAocmdiW2ldLCAwLCAyNTUpO1xuXHR9XG5cdHJnYlszXSA9IGNsYW1wKHJnYlszXSwgMCwgMSk7XG5cblx0cmV0dXJuIHJnYjtcbn07XG5cbmNzLmdldC5oc2wgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdGlmICghc3RyaW5nKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHR2YXIgaHNsID0gL15oc2xhP1xcKFxccyooWystXT8oPzpcXGR7MCwzfVxcLik/XFxkKykoPzpkZWcpP1xccyosP1xccyooWystXT9bXFxkXFwuXSspJVxccyosP1xccyooWystXT9bXFxkXFwuXSspJVxccyooPzpbLHxcXC9dXFxzKihbKy1dPyg/PVxcLlxcZHxcXGQpKD86MHxbMS05XVxcZCopPyg/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPylcXHMqKT9cXCkkLztcblx0dmFyIG1hdGNoID0gc3RyaW5nLm1hdGNoKGhzbCk7XG5cblx0aWYgKG1hdGNoKSB7XG5cdFx0dmFyIGFscGhhID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG5cdFx0dmFyIGggPSAoKHBhcnNlRmxvYXQobWF0Y2hbMV0pICUgMzYwKSArIDM2MCkgJSAzNjA7XG5cdFx0dmFyIHMgPSBjbGFtcChwYXJzZUZsb2F0KG1hdGNoWzJdKSwgMCwgMTAwKTtcblx0XHR2YXIgbCA9IGNsYW1wKHBhcnNlRmxvYXQobWF0Y2hbM10pLCAwLCAxMDApO1xuXHRcdHZhciBhID0gY2xhbXAoaXNOYU4oYWxwaGEpID8gMSA6IGFscGhhLCAwLCAxKTtcblxuXHRcdHJldHVybiBbaCwgcywgbCwgYV07XG5cdH1cblxuXHRyZXR1cm4gbnVsbDtcbn07XG5cbmNzLmdldC5od2IgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdGlmICghc3RyaW5nKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHR2YXIgaHdiID0gL15od2JcXChcXHMqKFsrLV0/XFxkezAsM30oPzpcXC5cXGQrKT8pKD86ZGVnKT9cXHMqLFxccyooWystXT9bXFxkXFwuXSspJVxccyosXFxzKihbKy1dP1tcXGRcXC5dKyklXFxzKig/OixcXHMqKFsrLV0/KD89XFwuXFxkfFxcZCkoPzowfFsxLTldXFxkKik/KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KVxccyopP1xcKSQvO1xuXHR2YXIgbWF0Y2ggPSBzdHJpbmcubWF0Y2goaHdiKTtcblxuXHRpZiAobWF0Y2gpIHtcblx0XHR2YXIgYWxwaGEgPSBwYXJzZUZsb2F0KG1hdGNoWzRdKTtcblx0XHR2YXIgaCA9ICgocGFyc2VGbG9hdChtYXRjaFsxXSkgJSAzNjApICsgMzYwKSAlIDM2MDtcblx0XHR2YXIgdyA9IGNsYW1wKHBhcnNlRmxvYXQobWF0Y2hbMl0pLCAwLCAxMDApO1xuXHRcdHZhciBiID0gY2xhbXAocGFyc2VGbG9hdChtYXRjaFszXSksIDAsIDEwMCk7XG5cdFx0dmFyIGEgPSBjbGFtcChpc05hTihhbHBoYSkgPyAxIDogYWxwaGEsIDAsIDEpO1xuXHRcdHJldHVybiBbaCwgdywgYiwgYV07XG5cdH1cblxuXHRyZXR1cm4gbnVsbDtcbn07XG5cbmNzLnRvLmhleCA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHJnYmEgPSBzd2l6emxlKGFyZ3VtZW50cyk7XG5cblx0cmV0dXJuIChcblx0XHQnIycgK1xuXHRcdGhleERvdWJsZShyZ2JhWzBdKSArXG5cdFx0aGV4RG91YmxlKHJnYmFbMV0pICtcblx0XHRoZXhEb3VibGUocmdiYVsyXSkgK1xuXHRcdChyZ2JhWzNdIDwgMVxuXHRcdFx0PyAoaGV4RG91YmxlKE1hdGgucm91bmQocmdiYVszXSAqIDI1NSkpKVxuXHRcdFx0OiAnJylcblx0KTtcbn07XG5cbmNzLnRvLnJnYiA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHJnYmEgPSBzd2l6emxlKGFyZ3VtZW50cyk7XG5cblx0cmV0dXJuIHJnYmEubGVuZ3RoIDwgNCB8fCByZ2JhWzNdID09PSAxXG5cdFx0PyAncmdiKCcgKyBNYXRoLnJvdW5kKHJnYmFbMF0pICsgJywgJyArIE1hdGgucm91bmQocmdiYVsxXSkgKyAnLCAnICsgTWF0aC5yb3VuZChyZ2JhWzJdKSArICcpJ1xuXHRcdDogJ3JnYmEoJyArIE1hdGgucm91bmQocmdiYVswXSkgKyAnLCAnICsgTWF0aC5yb3VuZChyZ2JhWzFdKSArICcsICcgKyBNYXRoLnJvdW5kKHJnYmFbMl0pICsgJywgJyArIHJnYmFbM10gKyAnKSc7XG59O1xuXG5jcy50by5yZ2IucGVyY2VudCA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHJnYmEgPSBzd2l6emxlKGFyZ3VtZW50cyk7XG5cblx0dmFyIHIgPSBNYXRoLnJvdW5kKHJnYmFbMF0gLyAyNTUgKiAxMDApO1xuXHR2YXIgZyA9IE1hdGgucm91bmQocmdiYVsxXSAvIDI1NSAqIDEwMCk7XG5cdHZhciBiID0gTWF0aC5yb3VuZChyZ2JhWzJdIC8gMjU1ICogMTAwKTtcblxuXHRyZXR1cm4gcmdiYS5sZW5ndGggPCA0IHx8IHJnYmFbM10gPT09IDFcblx0XHQ/ICdyZ2IoJyArIHIgKyAnJSwgJyArIGcgKyAnJSwgJyArIGIgKyAnJSknXG5cdFx0OiAncmdiYSgnICsgciArICclLCAnICsgZyArICclLCAnICsgYiArICclLCAnICsgcmdiYVszXSArICcpJztcbn07XG5cbmNzLnRvLmhzbCA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGhzbGEgPSBzd2l6emxlKGFyZ3VtZW50cyk7XG5cdHJldHVybiBoc2xhLmxlbmd0aCA8IDQgfHwgaHNsYVszXSA9PT0gMVxuXHRcdD8gJ2hzbCgnICsgaHNsYVswXSArICcsICcgKyBoc2xhWzFdICsgJyUsICcgKyBoc2xhWzJdICsgJyUpJ1xuXHRcdDogJ2hzbGEoJyArIGhzbGFbMF0gKyAnLCAnICsgaHNsYVsxXSArICclLCAnICsgaHNsYVsyXSArICclLCAnICsgaHNsYVszXSArICcpJztcbn07XG5cbi8vIGh3YiBpcyBhIGJpdCBkaWZmZXJlbnQgdGhhbiByZ2IoYSkgJiBoc2woYSkgc2luY2UgdGhlcmUgaXMgbm8gYWxwaGEgc3BlY2lmaWMgc3ludGF4XG4vLyAoaHdiIGhhdmUgYWxwaGEgb3B0aW9uYWwgJiAxIGlzIGRlZmF1bHQgdmFsdWUpXG5jcy50by5od2IgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBod2JhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXG5cdHZhciBhID0gJyc7XG5cdGlmIChod2JhLmxlbmd0aCA+PSA0ICYmIGh3YmFbM10gIT09IDEpIHtcblx0XHRhID0gJywgJyArIGh3YmFbM107XG5cdH1cblxuXHRyZXR1cm4gJ2h3YignICsgaHdiYVswXSArICcsICcgKyBod2JhWzFdICsgJyUsICcgKyBod2JhWzJdICsgJyUnICsgYSArICcpJztcbn07XG5cbmNzLnRvLmtleXdvcmQgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHJldHVybiByZXZlcnNlTmFtZXNbcmdiLnNsaWNlKDAsIDMpXTtcbn07XG5cbi8vIGhlbHBlcnNcbmZ1bmN0aW9uIGNsYW1wKG51bSwgbWluLCBtYXgpIHtcblx0cmV0dXJuIE1hdGgubWluKE1hdGgubWF4KG1pbiwgbnVtKSwgbWF4KTtcbn1cblxuZnVuY3Rpb24gaGV4RG91YmxlKG51bSkge1xuXHR2YXIgc3RyID0gTWF0aC5yb3VuZChudW0pLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRyZXR1cm4gKHN0ci5sZW5ndGggPCAyKSA/ICcwJyArIHN0ciA6IHN0cjtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbG9yU3RyaW5nID0gcmVxdWlyZSgnY29sb3Itc3RyaW5nJyk7XG52YXIgY29udmVydCA9IHJlcXVpcmUoJ2NvbG9yLWNvbnZlcnQnKTtcblxudmFyIF9zbGljZSA9IFtdLnNsaWNlO1xuXG52YXIgc2tpcHBlZE1vZGVscyA9IFtcblx0Ly8gdG8gYmUgaG9uZXN0LCBJIGRvbid0IHJlYWxseSBmZWVsIGxpa2Uga2V5d29yZCBiZWxvbmdzIGluIGNvbG9yIGNvbnZlcnQsIGJ1dCBlaC5cblx0J2tleXdvcmQnLFxuXG5cdC8vIGdyYXkgY29uZmxpY3RzIHdpdGggc29tZSBtZXRob2QgbmFtZXMsIGFuZCBoYXMgaXRzIG93biBtZXRob2QgZGVmaW5lZC5cblx0J2dyYXknLFxuXG5cdC8vIHNob3VsZG4ndCByZWFsbHkgYmUgaW4gY29sb3ItY29udmVydCBlaXRoZXIuLi5cblx0J2hleCdcbl07XG5cbnZhciBoYXNoZWRNb2RlbEtleXMgPSB7fTtcbk9iamVjdC5rZXlzKGNvbnZlcnQpLmZvckVhY2goZnVuY3Rpb24gKG1vZGVsKSB7XG5cdGhhc2hlZE1vZGVsS2V5c1tfc2xpY2UuY2FsbChjb252ZXJ0W21vZGVsXS5sYWJlbHMpLnNvcnQoKS5qb2luKCcnKV0gPSBtb2RlbDtcbn0pO1xuXG52YXIgbGltaXRlcnMgPSB7fTtcblxuZnVuY3Rpb24gQ29sb3Iob2JqLCBtb2RlbCkge1xuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgQ29sb3IpKSB7XG5cdFx0cmV0dXJuIG5ldyBDb2xvcihvYmosIG1vZGVsKTtcblx0fVxuXG5cdGlmIChtb2RlbCAmJiBtb2RlbCBpbiBza2lwcGVkTW9kZWxzKSB7XG5cdFx0bW9kZWwgPSBudWxsO1xuXHR9XG5cblx0aWYgKG1vZGVsICYmICEobW9kZWwgaW4gY29udmVydCkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbW9kZWw6ICcgKyBtb2RlbCk7XG5cdH1cblxuXHR2YXIgaTtcblx0dmFyIGNoYW5uZWxzO1xuXG5cdGlmIChvYmogPT0gbnVsbCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVxLW51bGwsZXFlcWVxXG5cdFx0dGhpcy5tb2RlbCA9ICdyZ2InO1xuXHRcdHRoaXMuY29sb3IgPSBbMCwgMCwgMF07XG5cdFx0dGhpcy52YWxwaGEgPSAxO1xuXHR9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIENvbG9yKSB7XG5cdFx0dGhpcy5tb2RlbCA9IG9iai5tb2RlbDtcblx0XHR0aGlzLmNvbG9yID0gb2JqLmNvbG9yLnNsaWNlKCk7XG5cdFx0dGhpcy52YWxwaGEgPSBvYmoudmFscGhhO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG5cdFx0dmFyIHJlc3VsdCA9IGNvbG9yU3RyaW5nLmdldChvYmopO1xuXHRcdGlmIChyZXN1bHQgPT09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlIGNvbG9yIGZyb20gc3RyaW5nOiAnICsgb2JqKTtcblx0XHR9XG5cblx0XHR0aGlzLm1vZGVsID0gcmVzdWx0Lm1vZGVsO1xuXHRcdGNoYW5uZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5jaGFubmVscztcblx0XHR0aGlzLmNvbG9yID0gcmVzdWx0LnZhbHVlLnNsaWNlKDAsIGNoYW5uZWxzKTtcblx0XHR0aGlzLnZhbHBoYSA9IHR5cGVvZiByZXN1bHQudmFsdWVbY2hhbm5lbHNdID09PSAnbnVtYmVyJyA/IHJlc3VsdC52YWx1ZVtjaGFubmVsc10gOiAxO1xuXHR9IGVsc2UgaWYgKG9iai5sZW5ndGgpIHtcblx0XHR0aGlzLm1vZGVsID0gbW9kZWwgfHwgJ3JnYic7XG5cdFx0Y2hhbm5lbHMgPSBjb252ZXJ0W3RoaXMubW9kZWxdLmNoYW5uZWxzO1xuXHRcdHZhciBuZXdBcnIgPSBfc2xpY2UuY2FsbChvYmosIDAsIGNoYW5uZWxzKTtcblx0XHR0aGlzLmNvbG9yID0gemVyb0FycmF5KG5ld0FyciwgY2hhbm5lbHMpO1xuXHRcdHRoaXMudmFscGhhID0gdHlwZW9mIG9ialtjaGFubmVsc10gPT09ICdudW1iZXInID8gb2JqW2NoYW5uZWxzXSA6IDE7XG5cdH0gZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gJ251bWJlcicpIHtcblx0XHQvLyB0aGlzIGlzIGFsd2F5cyBSR0IgLSBjYW4gYmUgY29udmVydGVkIGxhdGVyIG9uLlxuXHRcdG9iaiAmPSAweEZGRkZGRjtcblx0XHR0aGlzLm1vZGVsID0gJ3JnYic7XG5cdFx0dGhpcy5jb2xvciA9IFtcblx0XHRcdChvYmogPj4gMTYpICYgMHhGRixcblx0XHRcdChvYmogPj4gOCkgJiAweEZGLFxuXHRcdFx0b2JqICYgMHhGRlxuXHRcdF07XG5cdFx0dGhpcy52YWxwaGEgPSAxO1xuXHR9IGVsc2Uge1xuXHRcdHRoaXMudmFscGhhID0gMTtcblxuXHRcdHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcblx0XHRpZiAoJ2FscGhhJyBpbiBvYmopIHtcblx0XHRcdGtleXMuc3BsaWNlKGtleXMuaW5kZXhPZignYWxwaGEnKSwgMSk7XG5cdFx0XHR0aGlzLnZhbHBoYSA9IHR5cGVvZiBvYmouYWxwaGEgPT09ICdudW1iZXInID8gb2JqLmFscGhhIDogMDtcblx0XHR9XG5cblx0XHR2YXIgaGFzaGVkS2V5cyA9IGtleXMuc29ydCgpLmpvaW4oJycpO1xuXHRcdGlmICghKGhhc2hlZEtleXMgaW4gaGFzaGVkTW9kZWxLZXlzKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcGFyc2UgY29sb3IgZnJvbSBvYmplY3Q6ICcgKyBKU09OLnN0cmluZ2lmeShvYmopKTtcblx0XHR9XG5cblx0XHR0aGlzLm1vZGVsID0gaGFzaGVkTW9kZWxLZXlzW2hhc2hlZEtleXNdO1xuXG5cdFx0dmFyIGxhYmVscyA9IGNvbnZlcnRbdGhpcy5tb2RlbF0ubGFiZWxzO1xuXHRcdHZhciBjb2xvciA9IFtdO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbG9yLnB1c2gob2JqW2xhYmVsc1tpXV0pO1xuXHRcdH1cblxuXHRcdHRoaXMuY29sb3IgPSB6ZXJvQXJyYXkoY29sb3IpO1xuXHR9XG5cblx0Ly8gcGVyZm9ybSBsaW1pdGF0aW9ucyAoY2xhbXBpbmcsIGV0Yy4pXG5cdGlmIChsaW1pdGVyc1t0aGlzLm1vZGVsXSkge1xuXHRcdGNoYW5uZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5jaGFubmVscztcblx0XHRmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykge1xuXHRcdFx0dmFyIGxpbWl0ID0gbGltaXRlcnNbdGhpcy5tb2RlbF1baV07XG5cdFx0XHRpZiAobGltaXQpIHtcblx0XHRcdFx0dGhpcy5jb2xvcltpXSA9IGxpbWl0KHRoaXMuY29sb3JbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHRoaXMudmFscGhhID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdGhpcy52YWxwaGEpKTtcblxuXHRpZiAoT2JqZWN0LmZyZWV6ZSkge1xuXHRcdE9iamVjdC5mcmVlemUodGhpcyk7XG5cdH1cbn1cblxuQ29sb3IucHJvdG90eXBlID0ge1xuXHR0b1N0cmluZzogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnN0cmluZygpO1xuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzW3RoaXMubW9kZWxdKCk7XG5cdH0sXG5cblx0c3RyaW5nOiBmdW5jdGlvbiAocGxhY2VzKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzLm1vZGVsIGluIGNvbG9yU3RyaW5nLnRvID8gdGhpcyA6IHRoaXMucmdiKCk7XG5cdFx0c2VsZiA9IHNlbGYucm91bmQodHlwZW9mIHBsYWNlcyA9PT0gJ251bWJlcicgPyBwbGFjZXMgOiAxKTtcblx0XHR2YXIgYXJncyA9IHNlbGYudmFscGhhID09PSAxID8gc2VsZi5jb2xvciA6IHNlbGYuY29sb3IuY29uY2F0KHRoaXMudmFscGhhKTtcblx0XHRyZXR1cm4gY29sb3JTdHJpbmcudG9bc2VsZi5tb2RlbF0oYXJncyk7XG5cdH0sXG5cblx0cGVyY2VudFN0cmluZzogZnVuY3Rpb24gKHBsYWNlcykge1xuXHRcdHZhciBzZWxmID0gdGhpcy5yZ2IoKS5yb3VuZCh0eXBlb2YgcGxhY2VzID09PSAnbnVtYmVyJyA/IHBsYWNlcyA6IDEpO1xuXHRcdHZhciBhcmdzID0gc2VsZi52YWxwaGEgPT09IDEgPyBzZWxmLmNvbG9yIDogc2VsZi5jb2xvci5jb25jYXQodGhpcy52YWxwaGEpO1xuXHRcdHJldHVybiBjb2xvclN0cmluZy50by5yZ2IucGVyY2VudChhcmdzKTtcblx0fSxcblxuXHRhcnJheTogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnZhbHBoYSA9PT0gMSA/IHRoaXMuY29sb3Iuc2xpY2UoKSA6IHRoaXMuY29sb3IuY29uY2F0KHRoaXMudmFscGhhKTtcblx0fSxcblxuXHRvYmplY3Q6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmVzdWx0ID0ge307XG5cdFx0dmFyIGNoYW5uZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5jaGFubmVscztcblx0XHR2YXIgbGFiZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5sYWJlbHM7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHtcblx0XHRcdHJlc3VsdFtsYWJlbHNbaV1dID0gdGhpcy5jb2xvcltpXTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy52YWxwaGEgIT09IDEpIHtcblx0XHRcdHJlc3VsdC5hbHBoYSA9IHRoaXMudmFscGhhO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0dW5pdEFycmF5OiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHJnYiA9IHRoaXMucmdiKCkuY29sb3I7XG5cdFx0cmdiWzBdIC89IDI1NTtcblx0XHRyZ2JbMV0gLz0gMjU1O1xuXHRcdHJnYlsyXSAvPSAyNTU7XG5cblx0XHRpZiAodGhpcy52YWxwaGEgIT09IDEpIHtcblx0XHRcdHJnYi5wdXNoKHRoaXMudmFscGhhKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmdiO1xuXHR9LFxuXG5cdHVuaXRPYmplY3Q6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKS5vYmplY3QoKTtcblx0XHRyZ2IuciAvPSAyNTU7XG5cdFx0cmdiLmcgLz0gMjU1O1xuXHRcdHJnYi5iIC89IDI1NTtcblxuXHRcdGlmICh0aGlzLnZhbHBoYSAhPT0gMSkge1xuXHRcdFx0cmdiLmFscGhhID0gdGhpcy52YWxwaGE7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJnYjtcblx0fSxcblxuXHRyb3VuZDogZnVuY3Rpb24gKHBsYWNlcykge1xuXHRcdHBsYWNlcyA9IE1hdGgubWF4KHBsYWNlcyB8fCAwLCAwKTtcblx0XHRyZXR1cm4gbmV3IENvbG9yKHRoaXMuY29sb3IubWFwKHJvdW5kVG9QbGFjZShwbGFjZXMpKS5jb25jYXQodGhpcy52YWxwaGEpLCB0aGlzLm1vZGVsKTtcblx0fSxcblxuXHRhbHBoYTogZnVuY3Rpb24gKHZhbCkge1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKHRoaXMuY29sb3IuY29uY2F0KE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHZhbCkpKSwgdGhpcy5tb2RlbCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMudmFscGhhO1xuXHR9LFxuXG5cdC8vIHJnYlxuXHRyZWQ6IGdldHNldCgncmdiJywgMCwgbWF4Zm4oMjU1KSksXG5cdGdyZWVuOiBnZXRzZXQoJ3JnYicsIDEsIG1heGZuKDI1NSkpLFxuXHRibHVlOiBnZXRzZXQoJ3JnYicsIDIsIG1heGZuKDI1NSkpLFxuXG5cdGh1ZTogZ2V0c2V0KFsnaHNsJywgJ2hzdicsICdoc2wnLCAnaHdiJywgJ2hjZyddLCAwLCBmdW5jdGlvbiAodmFsKSB7IHJldHVybiAoKHZhbCAlIDM2MCkgKyAzNjApICUgMzYwOyB9KSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBicmFjZS1zdHlsZVxuXG5cdHNhdHVyYXRpb25sOiBnZXRzZXQoJ2hzbCcsIDEsIG1heGZuKDEwMCkpLFxuXHRsaWdodG5lc3M6IGdldHNldCgnaHNsJywgMiwgbWF4Zm4oMTAwKSksXG5cblx0c2F0dXJhdGlvbnY6IGdldHNldCgnaHN2JywgMSwgbWF4Zm4oMTAwKSksXG5cdHZhbHVlOiBnZXRzZXQoJ2hzdicsIDIsIG1heGZuKDEwMCkpLFxuXG5cdGNocm9tYTogZ2V0c2V0KCdoY2cnLCAxLCBtYXhmbigxMDApKSxcblx0Z3JheTogZ2V0c2V0KCdoY2cnLCAyLCBtYXhmbigxMDApKSxcblxuXHR3aGl0ZTogZ2V0c2V0KCdod2InLCAxLCBtYXhmbigxMDApKSxcblx0d2JsYWNrOiBnZXRzZXQoJ2h3YicsIDIsIG1heGZuKDEwMCkpLFxuXG5cdGN5YW46IGdldHNldCgnY215aycsIDAsIG1heGZuKDEwMCkpLFxuXHRtYWdlbnRhOiBnZXRzZXQoJ2NteWsnLCAxLCBtYXhmbigxMDApKSxcblx0eWVsbG93OiBnZXRzZXQoJ2NteWsnLCAyLCBtYXhmbigxMDApKSxcblx0YmxhY2s6IGdldHNldCgnY215aycsIDMsIG1heGZuKDEwMCkpLFxuXG5cdHg6IGdldHNldCgneHl6JywgMCwgbWF4Zm4oMTAwKSksXG5cdHk6IGdldHNldCgneHl6JywgMSwgbWF4Zm4oMTAwKSksXG5cdHo6IGdldHNldCgneHl6JywgMiwgbWF4Zm4oMTAwKSksXG5cblx0bDogZ2V0c2V0KCdsYWInLCAwLCBtYXhmbigxMDApKSxcblx0YTogZ2V0c2V0KCdsYWInLCAxKSxcblx0YjogZ2V0c2V0KCdsYWInLCAyKSxcblxuXHRrZXl3b3JkOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IodmFsKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29udmVydFt0aGlzLm1vZGVsXS5rZXl3b3JkKHRoaXMuY29sb3IpO1xuXHR9LFxuXG5cdGhleDogZnVuY3Rpb24gKHZhbCkge1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKHZhbCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbG9yU3RyaW5nLnRvLmhleCh0aGlzLnJnYigpLnJvdW5kKCkuY29sb3IpO1xuXHR9LFxuXG5cdHJnYk51bWJlcjogZnVuY3Rpb24gKCkge1xuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpLmNvbG9yO1xuXHRcdHJldHVybiAoKHJnYlswXSAmIDB4RkYpIDw8IDE2KSB8ICgocmdiWzFdICYgMHhGRikgPDwgOCkgfCAocmdiWzJdICYgMHhGRik7XG5cdH0sXG5cblx0bHVtaW5vc2l0eTogZnVuY3Rpb24gKCkge1xuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jcmVsYXRpdmVsdW1pbmFuY2VkZWZcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKS5jb2xvcjtcblxuXHRcdHZhciBsdW0gPSBbXTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHJnYi5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGNoYW4gPSByZ2JbaV0gLyAyNTU7XG5cdFx0XHRsdW1baV0gPSAoY2hhbiA8PSAwLjAzOTI4KSA/IGNoYW4gLyAxMi45MiA6IE1hdGgucG93KCgoY2hhbiArIDAuMDU1KSAvIDEuMDU1KSwgMi40KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gMC4yMTI2ICogbHVtWzBdICsgMC43MTUyICogbHVtWzFdICsgMC4wNzIyICogbHVtWzJdO1xuXHR9LFxuXG5cdGNvbnRyYXN0OiBmdW5jdGlvbiAoY29sb3IyKSB7XG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNjb250cmFzdC1yYXRpb2RlZlxuXHRcdHZhciBsdW0xID0gdGhpcy5sdW1pbm9zaXR5KCk7XG5cdFx0dmFyIGx1bTIgPSBjb2xvcjIubHVtaW5vc2l0eSgpO1xuXG5cdFx0aWYgKGx1bTEgPiBsdW0yKSB7XG5cdFx0XHRyZXR1cm4gKGx1bTEgKyAwLjA1KSAvIChsdW0yICsgMC4wNSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChsdW0yICsgMC4wNSkgLyAobHVtMSArIDAuMDUpO1xuXHR9LFxuXG5cdGxldmVsOiBmdW5jdGlvbiAoY29sb3IyKSB7XG5cdFx0dmFyIGNvbnRyYXN0UmF0aW8gPSB0aGlzLmNvbnRyYXN0KGNvbG9yMik7XG5cdFx0aWYgKGNvbnRyYXN0UmF0aW8gPj0gNy4xKSB7XG5cdFx0XHRyZXR1cm4gJ0FBQSc7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChjb250cmFzdFJhdGlvID49IDQuNSkgPyAnQUEnIDogJyc7XG5cdH0sXG5cblx0aXNEYXJrOiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gWUlRIGVxdWF0aW9uIGZyb20gaHR0cDovLzI0d2F5cy5vcmcvMjAxMC9jYWxjdWxhdGluZy1jb2xvci1jb250cmFzdFxuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpLmNvbG9yO1xuXHRcdHZhciB5aXEgPSAocmdiWzBdICogMjk5ICsgcmdiWzFdICogNTg3ICsgcmdiWzJdICogMTE0KSAvIDEwMDA7XG5cdFx0cmV0dXJuIHlpcSA8IDEyODtcblx0fSxcblxuXHRpc0xpZ2h0OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuICF0aGlzLmlzRGFyaygpO1xuXHR9LFxuXG5cdG5lZ2F0ZTogZnVuY3Rpb24gKCkge1xuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0XHRyZ2IuY29sb3JbaV0gPSAyNTUgLSByZ2IuY29sb3JbaV07XG5cdFx0fVxuXHRcdHJldHVybiByZ2I7XG5cdH0sXG5cblx0bGlnaHRlbjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMuaHNsKCk7XG5cdFx0aHNsLmNvbG9yWzJdICs9IGhzbC5jb2xvclsyXSAqIHJhdGlvO1xuXHRcdHJldHVybiBoc2w7XG5cdH0sXG5cblx0ZGFya2VuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHNsID0gdGhpcy5oc2woKTtcblx0XHRoc2wuY29sb3JbMl0gLT0gaHNsLmNvbG9yWzJdICogcmF0aW87XG5cdFx0cmV0dXJuIGhzbDtcblx0fSxcblxuXHRzYXR1cmF0ZTogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMuaHNsKCk7XG5cdFx0aHNsLmNvbG9yWzFdICs9IGhzbC5jb2xvclsxXSAqIHJhdGlvO1xuXHRcdHJldHVybiBoc2w7XG5cdH0sXG5cblx0ZGVzYXR1cmF0ZTogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMuaHNsKCk7XG5cdFx0aHNsLmNvbG9yWzFdIC09IGhzbC5jb2xvclsxXSAqIHJhdGlvO1xuXHRcdHJldHVybiBoc2w7XG5cdH0sXG5cblx0d2hpdGVuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHdiID0gdGhpcy5od2IoKTtcblx0XHRod2IuY29sb3JbMV0gKz0gaHdiLmNvbG9yWzFdICogcmF0aW87XG5cdFx0cmV0dXJuIGh3Yjtcblx0fSxcblxuXHRibGFja2VuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHdiID0gdGhpcy5od2IoKTtcblx0XHRod2IuY29sb3JbMl0gKz0gaHdiLmNvbG9yWzJdICogcmF0aW87XG5cdFx0cmV0dXJuIGh3Yjtcblx0fSxcblxuXHRncmF5c2NhbGU6IGZ1bmN0aW9uICgpIHtcblx0XHQvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dyYXlzY2FsZSNDb252ZXJ0aW5nX2NvbG9yX3RvX2dyYXlzY2FsZVxuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpLmNvbG9yO1xuXHRcdHZhciB2YWwgPSByZ2JbMF0gKiAwLjMgKyByZ2JbMV0gKiAwLjU5ICsgcmdiWzJdICogMC4xMTtcblx0XHRyZXR1cm4gQ29sb3IucmdiKHZhbCwgdmFsLCB2YWwpO1xuXHR9LFxuXG5cdGZhZGU6IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHJldHVybiB0aGlzLmFscGhhKHRoaXMudmFscGhhIC0gKHRoaXMudmFscGhhICogcmF0aW8pKTtcblx0fSxcblxuXHRvcGFxdWVyOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHRyZXR1cm4gdGhpcy5hbHBoYSh0aGlzLnZhbHBoYSArICh0aGlzLnZhbHBoYSAqIHJhdGlvKSk7XG5cdH0sXG5cblx0cm90YXRlOiBmdW5jdGlvbiAoZGVncmVlcykge1xuXHRcdHZhciBoc2wgPSB0aGlzLmhzbCgpO1xuXHRcdHZhciBodWUgPSBoc2wuY29sb3JbMF07XG5cdFx0aHVlID0gKGh1ZSArIGRlZ3JlZXMpICUgMzYwO1xuXHRcdGh1ZSA9IGh1ZSA8IDAgPyAzNjAgKyBodWUgOiBodWU7XG5cdFx0aHNsLmNvbG9yWzBdID0gaHVlO1xuXHRcdHJldHVybiBoc2w7XG5cdH0sXG5cblx0bWl4OiBmdW5jdGlvbiAobWl4aW5Db2xvciwgd2VpZ2h0KSB7XG5cdFx0Ly8gcG9ydGVkIGZyb20gc2FzcyBpbXBsZW1lbnRhdGlvbiBpbiBDXG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3Nhc3MvbGlic2Fzcy9ibG9iLzBlNmI0YTI4NTAwOTIzNTZhYTNlY2UwN2M2YjI0OWYwMjIxY2FjZWQvZnVuY3Rpb25zLmNwcCNMMjA5XG5cdFx0aWYgKCFtaXhpbkNvbG9yIHx8ICFtaXhpbkNvbG9yLnJnYikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdBcmd1bWVudCB0byBcIm1peFwiIHdhcyBub3QgYSBDb2xvciBpbnN0YW5jZSwgYnV0IHJhdGhlciBhbiBpbnN0YW5jZSBvZiAnICsgdHlwZW9mIG1peGluQ29sb3IpO1xuXHRcdH1cblx0XHR2YXIgY29sb3IxID0gbWl4aW5Db2xvci5yZ2IoKTtcblx0XHR2YXIgY29sb3IyID0gdGhpcy5yZ2IoKTtcblx0XHR2YXIgcCA9IHdlaWdodCA9PT0gdW5kZWZpbmVkID8gMC41IDogd2VpZ2h0O1xuXG5cdFx0dmFyIHcgPSAyICogcCAtIDE7XG5cdFx0dmFyIGEgPSBjb2xvcjEuYWxwaGEoKSAtIGNvbG9yMi5hbHBoYSgpO1xuXG5cdFx0dmFyIHcxID0gKCgodyAqIGEgPT09IC0xKSA/IHcgOiAodyArIGEpIC8gKDEgKyB3ICogYSkpICsgMSkgLyAyLjA7XG5cdFx0dmFyIHcyID0gMSAtIHcxO1xuXG5cdFx0cmV0dXJuIENvbG9yLnJnYihcblx0XHRcdFx0dzEgKiBjb2xvcjEucmVkKCkgKyB3MiAqIGNvbG9yMi5yZWQoKSxcblx0XHRcdFx0dzEgKiBjb2xvcjEuZ3JlZW4oKSArIHcyICogY29sb3IyLmdyZWVuKCksXG5cdFx0XHRcdHcxICogY29sb3IxLmJsdWUoKSArIHcyICogY29sb3IyLmJsdWUoKSxcblx0XHRcdFx0Y29sb3IxLmFscGhhKCkgKiBwICsgY29sb3IyLmFscGhhKCkgKiAoMSAtIHApKTtcblx0fVxufTtcblxuLy8gbW9kZWwgY29udmVyc2lvbiBtZXRob2RzIGFuZCBzdGF0aWMgY29uc3RydWN0b3JzXG5PYmplY3Qua2V5cyhjb252ZXJ0KS5mb3JFYWNoKGZ1bmN0aW9uIChtb2RlbCkge1xuXHRpZiAoc2tpcHBlZE1vZGVscy5pbmRleE9mKG1vZGVsKSAhPT0gLTEpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHR2YXIgY2hhbm5lbHMgPSBjb252ZXJ0W21vZGVsXS5jaGFubmVscztcblxuXHQvLyBjb252ZXJzaW9uIG1ldGhvZHNcblx0Q29sb3IucHJvdG90eXBlW21vZGVsXSA9IGZ1bmN0aW9uICgpIHtcblx0XHRpZiAodGhpcy5tb2RlbCA9PT0gbW9kZWwpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IodGhpcyk7XG5cdFx0fVxuXG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IoYXJndW1lbnRzLCBtb2RlbCk7XG5cdFx0fVxuXG5cdFx0dmFyIG5ld0FscGhhID0gdHlwZW9mIGFyZ3VtZW50c1tjaGFubmVsc10gPT09ICdudW1iZXInID8gY2hhbm5lbHMgOiB0aGlzLnZhbHBoYTtcblx0XHRyZXR1cm4gbmV3IENvbG9yKGFzc2VydEFycmF5KGNvbnZlcnRbdGhpcy5tb2RlbF1bbW9kZWxdLnJhdyh0aGlzLmNvbG9yKSkuY29uY2F0KG5ld0FscGhhKSwgbW9kZWwpO1xuXHR9O1xuXG5cdC8vICdzdGF0aWMnIGNvbnN0cnVjdGlvbiBtZXRob2RzXG5cdENvbG9yW21vZGVsXSA9IGZ1bmN0aW9uIChjb2xvcikge1xuXHRcdGlmICh0eXBlb2YgY29sb3IgPT09ICdudW1iZXInKSB7XG5cdFx0XHRjb2xvciA9IHplcm9BcnJheShfc2xpY2UuY2FsbChhcmd1bWVudHMpLCBjaGFubmVscyk7XG5cdFx0fVxuXHRcdHJldHVybiBuZXcgQ29sb3IoY29sb3IsIG1vZGVsKTtcblx0fTtcbn0pO1xuXG5mdW5jdGlvbiByb3VuZFRvKG51bSwgcGxhY2VzKSB7XG5cdHJldHVybiBOdW1iZXIobnVtLnRvRml4ZWQocGxhY2VzKSk7XG59XG5cbmZ1bmN0aW9uIHJvdW5kVG9QbGFjZShwbGFjZXMpIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChudW0pIHtcblx0XHRyZXR1cm4gcm91bmRUbyhudW0sIHBsYWNlcyk7XG5cdH07XG59XG5cbmZ1bmN0aW9uIGdldHNldChtb2RlbCwgY2hhbm5lbCwgbW9kaWZpZXIpIHtcblx0bW9kZWwgPSBBcnJheS5pc0FycmF5KG1vZGVsKSA/IG1vZGVsIDogW21vZGVsXTtcblxuXHRtb2RlbC5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7XG5cdFx0KGxpbWl0ZXJzW21dIHx8IChsaW1pdGVyc1ttXSA9IFtdKSlbY2hhbm5lbF0gPSBtb2RpZmllcjtcblx0fSk7XG5cblx0bW9kZWwgPSBtb2RlbFswXTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gKHZhbCkge1xuXHRcdHZhciByZXN1bHQ7XG5cblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0aWYgKG1vZGlmaWVyKSB7XG5cdFx0XHRcdHZhbCA9IG1vZGlmaWVyKHZhbCk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3VsdCA9IHRoaXNbbW9kZWxdKCk7XG5cdFx0XHRyZXN1bHQuY29sb3JbY2hhbm5lbF0gPSB2YWw7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdHJlc3VsdCA9IHRoaXNbbW9kZWxdKCkuY29sb3JbY2hhbm5lbF07XG5cdFx0aWYgKG1vZGlmaWVyKSB7XG5cdFx0XHRyZXN1bHQgPSBtb2RpZmllcihyZXN1bHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG59XG5cbmZ1bmN0aW9uIG1heGZuKG1heCkge1xuXHRyZXR1cm4gZnVuY3Rpb24gKHYpIHtcblx0XHRyZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4obWF4LCB2KSk7XG5cdH07XG59XG5cbmZ1bmN0aW9uIGFzc2VydEFycmF5KHZhbCkge1xuXHRyZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF07XG59XG5cbmZ1bmN0aW9uIHplcm9BcnJheShhcnIsIGxlbmd0aCkge1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKHR5cGVvZiBhcnJbaV0gIT09ICdudW1iZXInKSB7XG5cdFx0XHRhcnJbaV0gPSAwO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhcnI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29sb3I7XG4iLCIvKiFcbiAqIGNvb2tpZVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBSb21hbiBTaHR5bG1hblxuICogQ29weXJpZ2h0KGMpIDIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5leHBvcnRzLnNlcmlhbGl6ZSA9IHNlcmlhbGl6ZTtcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgX190b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggZmllbGQtY29udGVudCBpbiBSRkMgNzIzMCBzZWMgMy4yXG4gKlxuICogZmllbGQtY29udGVudCA9IGZpZWxkLXZjaGFyIFsgMSooIFNQIC8gSFRBQiApIGZpZWxkLXZjaGFyIF1cbiAqIGZpZWxkLXZjaGFyICAgPSBWQ0hBUiAvIG9icy10ZXh0XG4gKiBvYnMtdGV4dCAgICAgID0gJXg4MC1GRlxuICovXG5cbnZhciBmaWVsZENvbnRlbnRSZWdFeHAgPSAvXltcXHUwMDA5XFx1MDAyMC1cXHUwMDdlXFx1MDA4MC1cXHUwMGZmXSskLztcblxuLyoqXG4gKiBQYXJzZSBhIGNvb2tpZSBoZWFkZXIuXG4gKlxuICogUGFyc2UgdGhlIGdpdmVuIGNvb2tpZSBoZWFkZXIgc3RyaW5nIGludG8gYW4gb2JqZWN0XG4gKiBUaGUgb2JqZWN0IGhhcyB0aGUgdmFyaW91cyBjb29raWVzIGFzIGtleXMobmFtZXMpID0+IHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge29iamVjdH1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc3RyIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIHZhciBvYmogPSB7fVxuICB2YXIgb3B0ID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIGRlYyA9IG9wdC5kZWNvZGUgfHwgZGVjb2RlO1xuXG4gIHZhciBpbmRleCA9IDBcbiAgd2hpbGUgKGluZGV4IDwgc3RyLmxlbmd0aCkge1xuICAgIHZhciBlcUlkeCA9IHN0ci5pbmRleE9mKCc9JywgaW5kZXgpXG5cbiAgICAvLyBubyBtb3JlIGNvb2tpZSBwYWlyc1xuICAgIGlmIChlcUlkeCA9PT0gLTEpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgdmFyIGVuZElkeCA9IHN0ci5pbmRleE9mKCc7JywgaW5kZXgpXG5cbiAgICBpZiAoZW5kSWR4ID09PSAtMSkge1xuICAgICAgZW5kSWR4ID0gc3RyLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAoZW5kSWR4IDwgZXFJZHgpIHtcbiAgICAgIC8vIGJhY2t0cmFjayBvbiBwcmlvciBzZW1pY29sb25cbiAgICAgIGluZGV4ID0gc3RyLmxhc3RJbmRleE9mKCc7JywgZXFJZHggLSAxKSArIDFcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgdmFyIGtleSA9IHN0ci5zbGljZShpbmRleCwgZXFJZHgpLnRyaW0oKVxuXG4gICAgLy8gb25seSBhc3NpZ24gb25jZVxuICAgIGlmICh1bmRlZmluZWQgPT09IG9ialtrZXldKSB7XG4gICAgICB2YXIgdmFsID0gc3RyLnNsaWNlKGVxSWR4ICsgMSwgZW5kSWR4KS50cmltKClcblxuICAgICAgLy8gcXVvdGVkIHZhbHVlc1xuICAgICAgaWYgKHZhbC5jaGFyQ29kZUF0KDApID09PSAweDIyKSB7XG4gICAgICAgIHZhbCA9IHZhbC5zbGljZSgxLCAtMSlcbiAgICAgIH1cblxuICAgICAgb2JqW2tleV0gPSB0cnlEZWNvZGUodmFsLCBkZWMpO1xuICAgIH1cblxuICAgIGluZGV4ID0gZW5kSWR4ICsgMVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBTZXJpYWxpemUgZGF0YSBpbnRvIGEgY29va2llIGhlYWRlci5cbiAqXG4gKiBTZXJpYWxpemUgdGhlIGEgbmFtZSB2YWx1ZSBwYWlyIGludG8gYSBjb29raWUgc3RyaW5nIHN1aXRhYmxlIGZvclxuICogaHR0cCBoZWFkZXJzLiBBbiBvcHRpb25hbCBvcHRpb25zIG9iamVjdCBzcGVjaWZpZWQgY29va2llIHBhcmFtZXRlcnMuXG4gKlxuICogc2VyaWFsaXplKCdmb28nLCAnYmFyJywgeyBodHRwT25seTogdHJ1ZSB9KVxuICogICA9PiBcImZvbz1iYXI7IGh0dHBPbmx5XCJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IHZhbFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZShuYW1lLCB2YWwsIG9wdGlvbnMpIHtcbiAgdmFyIG9wdCA9IG9wdGlvbnMgfHwge307XG4gIHZhciBlbmMgPSBvcHQuZW5jb2RlIHx8IGVuY29kZTtcblxuICBpZiAodHlwZW9mIGVuYyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBlbmNvZGUgaXMgaW52YWxpZCcpO1xuICB9XG5cbiAgaWYgKCFmaWVsZENvbnRlbnRSZWdFeHAudGVzdChuYW1lKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IG5hbWUgaXMgaW52YWxpZCcpO1xuICB9XG5cbiAgdmFyIHZhbHVlID0gZW5jKHZhbCk7XG5cbiAgaWYgKHZhbHVlICYmICFmaWVsZENvbnRlbnRSZWdFeHAudGVzdCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCB2YWwgaXMgaW52YWxpZCcpO1xuICB9XG5cbiAgdmFyIHN0ciA9IG5hbWUgKyAnPScgKyB2YWx1ZTtcblxuICBpZiAobnVsbCAhPSBvcHQubWF4QWdlKSB7XG4gICAgdmFyIG1heEFnZSA9IG9wdC5tYXhBZ2UgLSAwO1xuXG4gICAgaWYgKGlzTmFOKG1heEFnZSkgfHwgIWlzRmluaXRlKG1heEFnZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBtYXhBZ2UgaXMgaW52YWxpZCcpXG4gICAgfVxuXG4gICAgc3RyICs9ICc7IE1heC1BZ2U9JyArIE1hdGguZmxvb3IobWF4QWdlKTtcbiAgfVxuXG4gIGlmIChvcHQuZG9tYWluKSB7XG4gICAgaWYgKCFmaWVsZENvbnRlbnRSZWdFeHAudGVzdChvcHQuZG9tYWluKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIGRvbWFpbiBpcyBpbnZhbGlkJyk7XG4gICAgfVxuXG4gICAgc3RyICs9ICc7IERvbWFpbj0nICsgb3B0LmRvbWFpbjtcbiAgfVxuXG4gIGlmIChvcHQucGF0aCkge1xuICAgIGlmICghZmllbGRDb250ZW50UmVnRXhwLnRlc3Qob3B0LnBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gcGF0aCBpcyBpbnZhbGlkJyk7XG4gICAgfVxuXG4gICAgc3RyICs9ICc7IFBhdGg9JyArIG9wdC5wYXRoO1xuICB9XG5cbiAgaWYgKG9wdC5leHBpcmVzKSB7XG4gICAgdmFyIGV4cGlyZXMgPSBvcHQuZXhwaXJlc1xuXG4gICAgaWYgKCFpc0RhdGUoZXhwaXJlcykgfHwgaXNOYU4oZXhwaXJlcy52YWx1ZU9mKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gZXhwaXJlcyBpcyBpbnZhbGlkJyk7XG4gICAgfVxuXG4gICAgc3RyICs9ICc7IEV4cGlyZXM9JyArIGV4cGlyZXMudG9VVENTdHJpbmcoKVxuICB9XG5cbiAgaWYgKG9wdC5odHRwT25seSkge1xuICAgIHN0ciArPSAnOyBIdHRwT25seSc7XG4gIH1cblxuICBpZiAob3B0LnNlY3VyZSkge1xuICAgIHN0ciArPSAnOyBTZWN1cmUnO1xuICB9XG5cbiAgaWYgKG9wdC5wcmlvcml0eSkge1xuICAgIHZhciBwcmlvcml0eSA9IHR5cGVvZiBvcHQucHJpb3JpdHkgPT09ICdzdHJpbmcnXG4gICAgICA/IG9wdC5wcmlvcml0eS50b0xvd2VyQ2FzZSgpXG4gICAgICA6IG9wdC5wcmlvcml0eVxuXG4gICAgc3dpdGNoIChwcmlvcml0eSkge1xuICAgICAgY2FzZSAnbG93JzpcbiAgICAgICAgc3RyICs9ICc7IFByaW9yaXR5PUxvdydcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ21lZGl1bSc6XG4gICAgICAgIHN0ciArPSAnOyBQcmlvcml0eT1NZWRpdW0nXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdoaWdoJzpcbiAgICAgICAgc3RyICs9ICc7IFByaW9yaXR5PUhpZ2gnXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gcHJpb3JpdHkgaXMgaW52YWxpZCcpXG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdC5zYW1lU2l0ZSkge1xuICAgIHZhciBzYW1lU2l0ZSA9IHR5cGVvZiBvcHQuc2FtZVNpdGUgPT09ICdzdHJpbmcnXG4gICAgICA/IG9wdC5zYW1lU2l0ZS50b0xvd2VyQ2FzZSgpIDogb3B0LnNhbWVTaXRlO1xuXG4gICAgc3dpdGNoIChzYW1lU2l0ZSkge1xuICAgICAgY2FzZSB0cnVlOlxuICAgICAgICBzdHIgKz0gJzsgU2FtZVNpdGU9U3RyaWN0JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsYXgnOlxuICAgICAgICBzdHIgKz0gJzsgU2FtZVNpdGU9TGF4JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdHJpY3QnOlxuICAgICAgICBzdHIgKz0gJzsgU2FtZVNpdGU9U3RyaWN0JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdub25lJzpcbiAgICAgICAgc3RyICs9ICc7IFNhbWVTaXRlPU5vbmUnO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBzYW1lU2l0ZSBpcyBpbnZhbGlkJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0cjtcbn1cblxuLyoqXG4gKiBVUkwtZGVjb2RlIHN0cmluZyB2YWx1ZS4gT3B0aW1pemVkIHRvIHNraXAgbmF0aXZlIGNhbGwgd2hlbiBubyAlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gZGVjb2RlIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5pbmRleE9mKCclJykgIT09IC0xXG4gICAgPyBkZWNvZGVVUklDb21wb25lbnQoc3RyKVxuICAgIDogc3RyXG59XG5cbi8qKlxuICogVVJMLWVuY29kZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGVuY29kZSAodmFsKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsKVxufVxuXG4vKipcbiAqIERldGVybWluZSBpZiB2YWx1ZSBpcyBhIERhdGUuXG4gKlxuICogQHBhcmFtIHsqfSB2YWxcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNEYXRlICh2YWwpIHtcbiAgcmV0dXJuIF9fdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBEYXRlXScgfHxcbiAgICB2YWwgaW5zdGFuY2VvZiBEYXRlXG59XG5cbi8qKlxuICogVHJ5IGRlY29kaW5nIGEgc3RyaW5nIHVzaW5nIGEgZGVjb2RpbmcgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHBhcmFtIHtmdW5jdGlvbn0gZGVjb2RlXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHRyeURlY29kZShzdHIsIGRlY29kZSkge1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGUoc3RyKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cbiIsIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcImxheW91dC1iYXNlXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtcImxheW91dC1iYXNlXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImNvc2VCYXNlXCJdID0gZmFjdG9yeShyZXF1aXJlKFwibGF5b3V0LWJhc2VcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcImNvc2VCYXNlXCJdID0gZmFjdG9yeShyb290W1wibGF5b3V0QmFzZVwiXSk7XG59KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX181NTFfXykge1xucmV0dXJuIC8qKioqKiovICgoKSA9PiB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0XCJ1c2Ugc3RyaWN0XCI7XG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlc19fID0gKHtcblxuLyoqKi8gNDU6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG52YXIgY29zZUJhc2UgPSB7fTtcblxuY29zZUJhc2UubGF5b3V0QmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKTtcbmNvc2VCYXNlLkNvU0VDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgwNik7XG5jb3NlQmFzZS5Db1NFRWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzY3KTtcbmNvc2VCYXNlLkNvU0VHcmFwaCA9IF9fd2VicGFja19yZXF1aXJlX18oODgwKTtcbmNvc2VCYXNlLkNvU0VHcmFwaE1hbmFnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU3OCk7XG5jb3NlQmFzZS5Db1NFTGF5b3V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NjUpO1xuY29zZUJhc2UuQ29TRU5vZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk5MSk7XG5jb3NlQmFzZS5Db25zdHJhaW50SGFuZGxlciA9IF9fd2VicGFja19yZXF1aXJlX18oOTAyKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb3NlQmFzZTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDgwNjpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBGRExheW91dENvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5GRExheW91dENvbnN0YW50cztcblxuZnVuY3Rpb24gQ29TRUNvbnN0YW50cygpIHt9XG5cbi8vQ29TRUNvbnN0YW50cyBpbmhlcml0cyBzdGF0aWMgcHJvcHMgaW4gRkRMYXlvdXRDb25zdGFudHNcbmZvciAodmFyIHByb3AgaW4gRkRMYXlvdXRDb25zdGFudHMpIHtcbiAgQ29TRUNvbnN0YW50c1twcm9wXSA9IEZETGF5b3V0Q29uc3RhbnRzW3Byb3BdO1xufVxuXG5Db1NFQ29uc3RhbnRzLkRFRkFVTFRfVVNFX01VTFRJX0xFVkVMX1NDQUxJTkcgPSBmYWxzZTtcbkNvU0VDb25zdGFudHMuREVGQVVMVF9SQURJQUxfU0VQQVJBVElPTiA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEg7XG5Db1NFQ29uc3RhbnRzLkRFRkFVTFRfQ09NUE9ORU5UX1NFUEVSQVRJT04gPSA2MDtcbkNvU0VDb25zdGFudHMuVElMRSA9IHRydWU7XG5Db1NFQ29uc3RhbnRzLlRJTElOR19QQURESU5HX1ZFUlRJQ0FMID0gMTA7XG5Db1NFQ29uc3RhbnRzLlRJTElOR19QQURESU5HX0hPUklaT05UQUwgPSAxMDtcbkNvU0VDb25zdGFudHMuVFJBTlNGT1JNX09OX0NPTlNUUkFJTlRfSEFORExJTkcgPSB0cnVlO1xuQ29TRUNvbnN0YW50cy5FTkZPUkNFX0NPTlNUUkFJTlRTID0gdHJ1ZTtcbkNvU0VDb25zdGFudHMuQVBQTFlfTEFZT1VUID0gdHJ1ZTtcbkNvU0VDb25zdGFudHMuUkVMQVhfTU9WRU1FTlRfT05fQ09OU1RSQUlOVFMgPSB0cnVlO1xuQ29TRUNvbnN0YW50cy5UUkVFX1JFRFVDVElPTl9PTl9JTkNSRU1FTlRBTCA9IHRydWU7IC8vIHRoaXMgc2hvdWxkIGJlIHNldCB0byBmYWxzZSBpZiB0aGVyZSB3aWxsIGJlIGEgY29uc3RyYWludFxuLy8gVGhpcyBjb25zdGFudCBpcyBmb3IgZGlmZmVyZW50aWF0aW5nIHdoZXRoZXIgYWN0dWFsIGxheW91dCBhbGdvcml0aG0gdGhhdCB1c2VzIGNvc2UtYmFzZSB3YW50cyB0byBhcHBseSBvbmx5IGluY3JlbWVudGFsIGxheW91dCBvciBcbi8vIGFuIGluY3JlbWVudGFsIGxheW91dCBvbiB0b3Agb2YgYSByYW5kb21pemVkIGxheW91dC4gSWYgaXQgaXMgb25seSBpbmNyZW1lbnRhbCBsYXlvdXQsIHRoZW4gdGhpcyBjb25zdGFudCBzaG91bGQgYmUgdHJ1ZS5cbkNvU0VDb25zdGFudHMuUFVSRV9JTkNSRU1FTlRBTCA9IENvU0VDb25zdGFudHMuREVGQVVMVF9JTkNSRU1FTlRBTDtcblxubW9kdWxlLmV4cG9ydHMgPSBDb1NFQ29uc3RhbnRzO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNzY3OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIEZETGF5b3V0RWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5GRExheW91dEVkZ2U7XG5cbmZ1bmN0aW9uIENvU0VFZGdlKHNvdXJjZSwgdGFyZ2V0LCB2RWRnZSkge1xuICBGRExheW91dEVkZ2UuY2FsbCh0aGlzLCBzb3VyY2UsIHRhcmdldCwgdkVkZ2UpO1xufVxuXG5Db1NFRWRnZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEZETGF5b3V0RWRnZS5wcm90b3R5cGUpO1xuZm9yICh2YXIgcHJvcCBpbiBGRExheW91dEVkZ2UpIHtcbiAgQ29TRUVkZ2VbcHJvcF0gPSBGRExheW91dEVkZ2VbcHJvcF07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29TRUVkZ2U7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4ODA6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG52YXIgTEdyYXBoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkxHcmFwaDtcblxuZnVuY3Rpb24gQ29TRUdyYXBoKHBhcmVudCwgZ3JhcGhNZ3IsIHZHcmFwaCkge1xuICBMR3JhcGguY2FsbCh0aGlzLCBwYXJlbnQsIGdyYXBoTWdyLCB2R3JhcGgpO1xufVxuXG5Db1NFR3JhcGgucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMR3JhcGgucHJvdG90eXBlKTtcbmZvciAodmFyIHByb3AgaW4gTEdyYXBoKSB7XG4gIENvU0VHcmFwaFtwcm9wXSA9IExHcmFwaFtwcm9wXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDb1NFR3JhcGg7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA1Nzg6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG52YXIgTEdyYXBoTWFuYWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5MR3JhcGhNYW5hZ2VyO1xuXG5mdW5jdGlvbiBDb1NFR3JhcGhNYW5hZ2VyKGxheW91dCkge1xuICBMR3JhcGhNYW5hZ2VyLmNhbGwodGhpcywgbGF5b3V0KTtcbn1cblxuQ29TRUdyYXBoTWFuYWdlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKExHcmFwaE1hbmFnZXIucHJvdG90eXBlKTtcbmZvciAodmFyIHByb3AgaW4gTEdyYXBoTWFuYWdlcikge1xuICBDb1NFR3JhcGhNYW5hZ2VyW3Byb3BdID0gTEdyYXBoTWFuYWdlcltwcm9wXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDb1NFR3JhcGhNYW5hZ2VyO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNzY1OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIEZETGF5b3V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkZETGF5b3V0O1xudmFyIENvU0VHcmFwaE1hbmFnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU3OCk7XG52YXIgQ29TRUdyYXBoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4ODApO1xudmFyIENvU0VOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5OTEpO1xudmFyIENvU0VFZGdlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NjcpO1xudmFyIENvU0VDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgwNik7XG52YXIgQ29uc3RyYWludEhhbmRsZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkwMik7XG52YXIgRkRMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuRkRMYXlvdXRDb25zdGFudHM7XG52YXIgTGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkxheW91dENvbnN0YW50cztcbnZhciBQb2ludCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5Qb2ludDtcbnZhciBQb2ludEQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuUG9pbnREO1xudmFyIERpbWVuc2lvbkQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuRGltZW5zaW9uRDtcbnZhciBMYXlvdXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuTGF5b3V0O1xudmFyIEludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuSW50ZWdlcjtcbnZhciBJR2VvbWV0cnkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuSUdlb21ldHJ5O1xudmFyIExHcmFwaCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5MR3JhcGg7XG52YXIgVHJhbnNmb3JtID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLlRyYW5zZm9ybTtcbnZhciBMaW5rZWRMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkxpbmtlZExpc3Q7XG5cbmZ1bmN0aW9uIENvU0VMYXlvdXQoKSB7XG4gIEZETGF5b3V0LmNhbGwodGhpcyk7XG5cbiAgdGhpcy50b0JlVGlsZWQgPSB7fTsgLy8gTWVtb3JpemUgaWYgYSBub2RlIGlzIHRvIGJlIHRpbGVkIG9yIGlzIHRpbGVkXG4gIHRoaXMuY29uc3RyYWludHMgPSB7fTsgLy8ga2VlcCBsYXlvdXQgY29uc3RyYWludHNcbn1cblxuQ29TRUxheW91dC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEZETGF5b3V0LnByb3RvdHlwZSk7XG5cbmZvciAodmFyIHByb3AgaW4gRkRMYXlvdXQpIHtcbiAgQ29TRUxheW91dFtwcm9wXSA9IEZETGF5b3V0W3Byb3BdO1xufVxuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5uZXdHcmFwaE1hbmFnZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBnbSA9IG5ldyBDb1NFR3JhcGhNYW5hZ2VyKHRoaXMpO1xuICB0aGlzLmdyYXBoTWFuYWdlciA9IGdtO1xuICByZXR1cm4gZ207XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5uZXdHcmFwaCA9IGZ1bmN0aW9uICh2R3JhcGgpIHtcbiAgcmV0dXJuIG5ldyBDb1NFR3JhcGgobnVsbCwgdGhpcy5ncmFwaE1hbmFnZXIsIHZHcmFwaCk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5uZXdOb2RlID0gZnVuY3Rpb24gKHZOb2RlKSB7XG4gIHJldHVybiBuZXcgQ29TRU5vZGUodGhpcy5ncmFwaE1hbmFnZXIsIHZOb2RlKTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLm5ld0VkZ2UgPSBmdW5jdGlvbiAodkVkZ2UpIHtcbiAgcmV0dXJuIG5ldyBDb1NFRWRnZShudWxsLCBudWxsLCB2RWRnZSk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5pbml0UGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHtcbiAgRkRMYXlvdXQucHJvdG90eXBlLmluaXRQYXJhbWV0ZXJzLmNhbGwodGhpcywgYXJndW1lbnRzKTtcbiAgaWYgKCF0aGlzLmlzU3ViTGF5b3V0KSB7XG4gICAgaWYgKENvU0VDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCA8IDEwKSB7XG4gICAgICB0aGlzLmlkZWFsRWRnZUxlbmd0aCA9IDEwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlkZWFsRWRnZUxlbmd0aCA9IENvU0VDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSDtcbiAgICB9XG5cbiAgICB0aGlzLnVzZVNtYXJ0SWRlYWxFZGdlTGVuZ3RoQ2FsY3VsYXRpb24gPSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfVVNFX1NNQVJUX0lERUFMX0VER0VfTEVOR1RIX0NBTENVTEFUSU9OO1xuICAgIHRoaXMuZ3Jhdml0eUNvbnN0YW50ID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1NUUkVOR1RIO1xuICAgIHRoaXMuY29tcG91bmRHcmF2aXR5Q29uc3RhbnQgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfU1RSRU5HVEg7XG4gICAgdGhpcy5ncmF2aXR5UmFuZ2VGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0dSQVZJVFlfUkFOR0VfRkFDVE9SO1xuICAgIHRoaXMuY29tcG91bmRHcmF2aXR5UmFuZ2VGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfUkFOR0VfRkFDVE9SO1xuXG4gICAgLy8gdmFyaWFibGVzIGZvciB0cmVlIHJlZHVjdGlvbiBzdXBwb3J0XG4gICAgdGhpcy5wcnVuZWROb2Rlc0FsbCA9IFtdO1xuICAgIHRoaXMuZ3Jvd1RyZWVJdGVyYXRpb25zID0gMDtcbiAgICB0aGlzLmFmdGVyR3Jvd3RoSXRlcmF0aW9ucyA9IDA7XG4gICAgdGhpcy5pc1RyZWVHcm93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5pc0dyb3d0aEZpbmlzaGVkID0gZmFsc2U7XG4gIH1cbn07XG5cbi8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IENvU0UgcmVsYXRlZCBwYXJhbWV0ZXJzIHVzZWQgYnkgc3ByaW5nIGVtYmVkZGVyLlxuQ29TRUxheW91dC5wcm90b3R5cGUuaW5pdFNwcmluZ0VtYmVkZGVyID0gZnVuY3Rpb24gKCkge1xuICBGRExheW91dC5wcm90b3R5cGUuaW5pdFNwcmluZ0VtYmVkZGVyLmNhbGwodGhpcyk7XG5cbiAgLy8gdmFyaWFibGVzIGZvciBjb29saW5nXG4gIHRoaXMuY29vbGluZ0N5Y2xlID0gMDtcbiAgdGhpcy5tYXhDb29saW5nQ3ljbGUgPSB0aGlzLm1heEl0ZXJhdGlvbnMgLyBGRExheW91dENvbnN0YW50cy5DT05WRVJHRU5DRV9DSEVDS19QRVJJT0Q7XG4gIHRoaXMuZmluYWxUZW1wZXJhdHVyZSA9IDAuMDQ7XG4gIHRoaXMuY29vbGluZ0FkanVzdGVyID0gMTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmxheW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNyZWF0ZUJlbmRzQXNOZWVkZWQgPSBMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DUkVBVEVfQkVORFNfQVNfTkVFREVEO1xuICBpZiAoY3JlYXRlQmVuZHNBc05lZWRlZCkge1xuICAgIHRoaXMuY3JlYXRlQmVuZHBvaW50cygpO1xuICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsRWRnZXMoKTtcbiAgfVxuXG4gIHRoaXMubGV2ZWwgPSAwO1xuICByZXR1cm4gdGhpcy5jbGFzc2ljTGF5b3V0KCk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5jbGFzc2ljTGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLm5vZGVzV2l0aEdyYXZpdHkgPSB0aGlzLmNhbGN1bGF0ZU5vZGVzVG9BcHBseUdyYXZpdGF0aW9uVG8oKTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIuc2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24odGhpcy5ub2Rlc1dpdGhHcmF2aXR5KTtcbiAgdGhpcy5jYWxjTm9PZkNoaWxkcmVuRm9yQWxsTm9kZXMoKTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIuY2FsY0xvd2VzdENvbW1vbkFuY2VzdG9ycygpO1xuICB0aGlzLmdyYXBoTWFuYWdlci5jYWxjSW5jbHVzaW9uVHJlZURlcHRocygpO1xuICB0aGlzLmdyYXBoTWFuYWdlci5nZXRSb290KCkuY2FsY0VzdGltYXRlZFNpemUoKTtcbiAgdGhpcy5jYWxjSWRlYWxFZGdlTGVuZ3RocygpO1xuXG4gIGlmICghdGhpcy5pbmNyZW1lbnRhbCkge1xuICAgIHZhciBmb3Jlc3QgPSB0aGlzLmdldEZsYXRGb3Jlc3QoKTtcblxuICAgIC8vIFRoZSBncmFwaCBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYXlvdXQgaXMgZmxhdCBhbmQgYSBmb3Jlc3RcbiAgICBpZiAoZm9yZXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMucG9zaXRpb25Ob2Rlc1JhZGlhbGx5KGZvcmVzdCk7XG4gICAgfVxuICAgIC8vIFRoZSBncmFwaCBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYXlvdXQgaXMgbm90IGZsYXQgb3IgYSBmb3Jlc3RcbiAgICBlbHNlIHtcbiAgICAgICAgLy8gUmVkdWNlIHRoZSB0cmVlcyB3aGVuIGluY3JlbWVudGFsIG1vZGUgaXMgbm90IGVuYWJsZWQgYW5kIGdyYXBoIGlzIG5vdCBhIGZvcmVzdCBcbiAgICAgICAgdGhpcy5yZWR1Y2VUcmVlcygpO1xuICAgICAgICAvLyBVcGRhdGUgbm9kZXMgdGhhdCBncmF2aXR5IHdpbGwgYmUgYXBwbGllZFxuICAgICAgICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKCk7XG4gICAgICAgIHZhciBhbGxOb2RlcyA9IG5ldyBTZXQodGhpcy5nZXRBbGxOb2RlcygpKTtcbiAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IHRoaXMubm9kZXNXaXRoR3Jhdml0eS5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICByZXR1cm4gYWxsTm9kZXMuaGFzKHgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ncmFwaE1hbmFnZXIuc2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24oaW50ZXJzZWN0aW9uKTtcblxuICAgICAgICB0aGlzLnBvc2l0aW9uTm9kZXNSYW5kb21seSgpO1xuICAgICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChDb1NFQ29uc3RhbnRzLlRSRUVfUkVEVUNUSU9OX09OX0lOQ1JFTUVOVEFMKSB7XG4gICAgICAvLyBSZWR1Y2UgdGhlIHRyZWVzIGluIGluY3JlbWVudGFsIG1vZGUgaWYgb25seSB0aGlzIGNvbnN0YW50IGlzIHNldCB0byB0cnVlIFxuICAgICAgdGhpcy5yZWR1Y2VUcmVlcygpO1xuICAgICAgLy8gVXBkYXRlIG5vZGVzIHRoYXQgZ3Jhdml0eSB3aWxsIGJlIGFwcGxpZWRcbiAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24oKTtcbiAgICAgIHZhciBhbGxOb2RlcyA9IG5ldyBTZXQodGhpcy5nZXRBbGxOb2RlcygpKTtcbiAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSB0aGlzLm5vZGVzV2l0aEdyYXZpdHkuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiBhbGxOb2Rlcy5oYXMoeCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKGludGVyc2VjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKHRoaXMuY29uc3RyYWludHMpLmxlbmd0aCA+IDApIHtcbiAgICBDb25zdHJhaW50SGFuZGxlci5oYW5kbGVDb25zdHJhaW50cyh0aGlzKTtcbiAgICB0aGlzLmluaXRDb25zdHJhaW50VmFyaWFibGVzKCk7XG4gIH1cblxuICB0aGlzLmluaXRTcHJpbmdFbWJlZGRlcigpO1xuICBpZiAoQ29TRUNvbnN0YW50cy5BUFBMWV9MQVlPVVQpIHtcbiAgICB0aGlzLnJ1blNwcmluZ0VtYmVkZGVyKCk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnRpY2sgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMudG90YWxJdGVyYXRpb25zKys7XG5cbiAgaWYgKHRoaXMudG90YWxJdGVyYXRpb25zID09PSB0aGlzLm1heEl0ZXJhdGlvbnMgJiYgIXRoaXMuaXNUcmVlR3Jvd2luZyAmJiAhdGhpcy5pc0dyb3d0aEZpbmlzaGVkKSB7XG4gICAgaWYgKHRoaXMucHJ1bmVkTm9kZXNBbGwubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5pc1RyZWVHcm93aW5nID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMudG90YWxJdGVyYXRpb25zICUgRkRMYXlvdXRDb25zdGFudHMuQ09OVkVSR0VOQ0VfQ0hFQ0tfUEVSSU9EID09IDAgJiYgIXRoaXMuaXNUcmVlR3Jvd2luZyAmJiAhdGhpcy5pc0dyb3d0aEZpbmlzaGVkKSB7XG4gICAgaWYgKHRoaXMuaXNDb252ZXJnZWQoKSkge1xuICAgICAgaWYgKHRoaXMucHJ1bmVkTm9kZXNBbGwubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmlzVHJlZUdyb3dpbmcgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jb29saW5nQ3ljbGUrKztcblxuICAgIGlmICh0aGlzLmxheW91dFF1YWxpdHkgPT0gMCkge1xuICAgICAgLy8gcXVhbGl0eSAtIFwiZHJhZnRcIlxuICAgICAgdGhpcy5jb29saW5nQWRqdXN0ZXIgPSB0aGlzLmNvb2xpbmdDeWNsZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubGF5b3V0UXVhbGl0eSA9PSAxKSB7XG4gICAgICAvLyBxdWFsaXR5IC0gXCJkZWZhdWx0XCJcbiAgICAgIHRoaXMuY29vbGluZ0FkanVzdGVyID0gdGhpcy5jb29saW5nQ3ljbGUgLyAzO1xuICAgIH1cblxuICAgIC8vIGNvb2xpbmcgc2NoZWR1bGUgaXMgYmFzZWQgb24gaHR0cDovL3d3dy5idGx1a2UuY29tL3NpbWFuZjEuaHRtbCAtPiBjb29saW5nIHNjaGVkdWxlIDNcbiAgICB0aGlzLmNvb2xpbmdGYWN0b3IgPSBNYXRoLm1heCh0aGlzLmluaXRpYWxDb29saW5nRmFjdG9yIC0gTWF0aC5wb3codGhpcy5jb29saW5nQ3ljbGUsIE1hdGgubG9nKDEwMCAqICh0aGlzLmluaXRpYWxDb29saW5nRmFjdG9yIC0gdGhpcy5maW5hbFRlbXBlcmF0dXJlKSkgLyBNYXRoLmxvZyh0aGlzLm1heENvb2xpbmdDeWNsZSkpIC8gMTAwICogdGhpcy5jb29saW5nQWRqdXN0ZXIsIHRoaXMuZmluYWxUZW1wZXJhdHVyZSk7XG4gICAgdGhpcy5hbmltYXRpb25QZXJpb2QgPSBNYXRoLmNlaWwodGhpcy5pbml0aWFsQW5pbWF0aW9uUGVyaW9kICogTWF0aC5zcXJ0KHRoaXMuY29vbGluZ0ZhY3RvcikpO1xuICB9XG4gIC8vIE9wZXJhdGlvbnMgd2hpbGUgdHJlZSBpcyBncm93aW5nIGFnYWluIFxuICBpZiAodGhpcy5pc1RyZWVHcm93aW5nKSB7XG4gICAgaWYgKHRoaXMuZ3Jvd1RyZWVJdGVyYXRpb25zICUgMTAgPT0gMCkge1xuICAgICAgaWYgKHRoaXMucHJ1bmVkTm9kZXNBbGwubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmdyYXBoTWFuYWdlci51cGRhdGVCb3VuZHMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVHcmlkKCk7XG4gICAgICAgIHRoaXMuZ3Jvd1RyZWUodGhpcy5wcnVuZWROb2Rlc0FsbCk7XG4gICAgICAgIC8vIFVwZGF0ZSBub2RlcyB0aGF0IGdyYXZpdHkgd2lsbCBiZSBhcHBsaWVkXG4gICAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24oKTtcbiAgICAgICAgdmFyIGFsbE5vZGVzID0gbmV3IFNldCh0aGlzLmdldEFsbE5vZGVzKCkpO1xuICAgICAgICB2YXIgaW50ZXJzZWN0aW9uID0gdGhpcy5ub2Rlc1dpdGhHcmF2aXR5LmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICAgIHJldHVybiBhbGxOb2Rlcy5oYXMoeCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmdyYXBoTWFuYWdlci5zZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbihpbnRlcnNlY3Rpb24pO1xuXG4gICAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnVwZGF0ZUJvdW5kcygpO1xuICAgICAgICB0aGlzLnVwZGF0ZUdyaWQoKTtcbiAgICAgICAgaWYgKENvU0VDb25zdGFudHMuUFVSRV9JTkNSRU1FTlRBTCkgdGhpcy5jb29saW5nRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCAvIDI7ZWxzZSB0aGlzLmNvb2xpbmdGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pc1RyZWVHcm93aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNHcm93dGhGaW5pc2hlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZ3Jvd1RyZWVJdGVyYXRpb25zKys7XG4gIH1cbiAgLy8gT3BlcmF0aW9ucyBhZnRlciBncm93dGggaXMgZmluaXNoZWRcbiAgaWYgKHRoaXMuaXNHcm93dGhGaW5pc2hlZCkge1xuICAgIGlmICh0aGlzLmlzQ29udmVyZ2VkKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5hZnRlckdyb3d0aEl0ZXJhdGlvbnMgJSAxMCA9PSAwKSB7XG4gICAgICB0aGlzLmdyYXBoTWFuYWdlci51cGRhdGVCb3VuZHMoKTtcbiAgICAgIHRoaXMudXBkYXRlR3JpZCgpO1xuICAgIH1cbiAgICBpZiAoQ29TRUNvbnN0YW50cy5QVVJFX0lOQ1JFTUVOVEFMKSB0aGlzLmNvb2xpbmdGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMIC8gMiAqICgoMTAwIC0gdGhpcy5hZnRlckdyb3d0aEl0ZXJhdGlvbnMpIC8gMTAwKTtlbHNlIHRoaXMuY29vbGluZ0ZhY3RvciA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09PTElOR19GQUNUT1JfSU5DUkVNRU5UQUwgKiAoKDEwMCAtIHRoaXMuYWZ0ZXJHcm93dGhJdGVyYXRpb25zKSAvIDEwMCk7XG4gICAgdGhpcy5hZnRlckdyb3d0aEl0ZXJhdGlvbnMrKztcbiAgfVxuXG4gIHZhciBncmlkVXBkYXRlQWxsb3dlZCA9ICF0aGlzLmlzVHJlZUdyb3dpbmcgJiYgIXRoaXMuaXNHcm93dGhGaW5pc2hlZDtcbiAgdmFyIGZvcmNlVG9Ob2RlU3Vycm91bmRpbmdVcGRhdGUgPSB0aGlzLmdyb3dUcmVlSXRlcmF0aW9ucyAlIDEwID09IDEgJiYgdGhpcy5pc1RyZWVHcm93aW5nIHx8IHRoaXMuYWZ0ZXJHcm93dGhJdGVyYXRpb25zICUgMTAgPT0gMSAmJiB0aGlzLmlzR3Jvd3RoRmluaXNoZWQ7XG5cbiAgdGhpcy50b3RhbERpc3BsYWNlbWVudCA9IDA7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLnVwZGF0ZUJvdW5kcygpO1xuICB0aGlzLmNhbGNTcHJpbmdGb3JjZXMoKTtcbiAgdGhpcy5jYWxjUmVwdWxzaW9uRm9yY2VzKGdyaWRVcGRhdGVBbGxvd2VkLCBmb3JjZVRvTm9kZVN1cnJvdW5kaW5nVXBkYXRlKTtcbiAgdGhpcy5jYWxjR3Jhdml0YXRpb25hbEZvcmNlcygpO1xuICB0aGlzLm1vdmVOb2RlcygpO1xuICB0aGlzLmFuaW1hdGUoKTtcblxuICByZXR1cm4gZmFsc2U7IC8vIExheW91dCBpcyBub3QgZW5kZWQgeWV0IHJldHVybiBmYWxzZVxufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuZ2V0UG9zaXRpb25zRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsTm9kZXMoKTtcbiAgdmFyIHBEYXRhID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmVjdCA9IGFsbE5vZGVzW2ldLnJlY3Q7XG4gICAgdmFyIGlkID0gYWxsTm9kZXNbaV0uaWQ7XG4gICAgcERhdGFbaWRdID0ge1xuICAgICAgaWQ6IGlkLFxuICAgICAgeDogcmVjdC5nZXRDZW50ZXJYKCksXG4gICAgICB5OiByZWN0LmdldENlbnRlclkoKSxcbiAgICAgIHc6IHJlY3Qud2lkdGgsXG4gICAgICBoOiByZWN0LmhlaWdodFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gcERhdGE7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5ydW5TcHJpbmdFbWJlZGRlciA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5pbml0aWFsQW5pbWF0aW9uUGVyaW9kID0gMjU7XG4gIHRoaXMuYW5pbWF0aW9uUGVyaW9kID0gdGhpcy5pbml0aWFsQW5pbWF0aW9uUGVyaW9kO1xuICB2YXIgbGF5b3V0RW5kZWQgPSBmYWxzZTtcblxuICAvLyBJZiBhbWluYXRlIG9wdGlvbiBpcyAnZHVyaW5nJyBzaWduYWwgdGhhdCBsYXlvdXQgaXMgc3VwcG9zZWQgdG8gc3RhcnQgaXRlcmF0aW5nXG4gIGlmIChGRExheW91dENvbnN0YW50cy5BTklNQVRFID09PSAnZHVyaW5nJykge1xuICAgIHRoaXMuZW1pdCgnbGF5b3V0c3RhcnRlZCcpO1xuICB9IGVsc2Uge1xuICAgIC8vIElmIGFtaW5hdGUgb3B0aW9uIGlzICdkdXJpbmcnIHRpY2soKSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBvbiBpbmRleC5qc1xuICAgIHdoaWxlICghbGF5b3V0RW5kZWQpIHtcbiAgICAgIGxheW91dEVuZGVkID0gdGhpcy50aWNrKCk7XG4gICAgfVxuXG4gICAgdGhpcy5ncmFwaE1hbmFnZXIudXBkYXRlQm91bmRzKCk7XG4gIH1cbn07XG5cbi8vIG92ZXJyaWRlcyBtb3ZlTm9kZXMgbWV0aG9kIGluIEZETGF5b3V0XG5Db1NFTGF5b3V0LnByb3RvdHlwZS5tb3ZlTm9kZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsTm9kZXMgPSB0aGlzLmdldEFsbE5vZGVzKCk7XG4gIHZhciBub2RlO1xuXG4gIC8vIGNhbGN1bGF0ZSBkaXNwbGFjZW1lbnQgZm9yIGVhY2ggbm9kZSBcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBub2RlID0gbE5vZGVzW2ldO1xuICAgIG5vZGUuY2FsY3VsYXRlRGlzcGxhY2VtZW50KCk7XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXModGhpcy5jb25zdHJhaW50cykubGVuZ3RoID4gMCkge1xuICAgIHRoaXMudXBkYXRlRGlzcGxhY2VtZW50cygpO1xuICB9XG5cbiAgLy8gbW92ZSBlYWNoIG5vZGVcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBub2RlID0gbE5vZGVzW2ldO1xuICAgIG5vZGUubW92ZSgpO1xuICB9XG59O1xuXG4vLyBjb25zdHJhaW50IHJlbGF0ZWQgbWV0aG9kczogaW5pdENvbnN0cmFpbnRWYXJpYWJsZXMgYW5kIHVwZGF0ZURpc3BsYWNlbWVudHNcblxuLy8gaW5pdGlhbGl6ZSBjb25zdHJhaW50IHJlbGF0ZWQgdmFyaWFibGVzXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5pbml0Q29uc3RyYWludFZhcmlhYmxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLmlkVG9Ob2RlTWFwID0gbmV3IE1hcCgpO1xuICB0aGlzLmZpeGVkTm9kZVNldCA9IG5ldyBTZXQoKTtcblxuICB2YXIgYWxsTm9kZXMgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxOb2RlcygpO1xuXG4gIC8vIGZpbGwgaWRUb05vZGVNYXBcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gYWxsTm9kZXNbaV07XG4gICAgdGhpcy5pZFRvTm9kZU1hcC5zZXQobm9kZS5pZCwgbm9kZSk7XG4gIH1cblxuICAvLyBjYWxjdWxhdGUgZml4ZWQgbm9kZSB3ZWlnaHQgZm9yIGdpdmVuIGNvbXBvdW5kIG5vZGVcbiAgdmFyIGNhbGN1bGF0ZUNvbXBvdW5kV2VpZ2h0ID0gZnVuY3Rpb24gY2FsY3VsYXRlQ29tcG91bmRXZWlnaHQoY29tcG91bmROb2RlKSB7XG4gICAgdmFyIG5vZGVzID0gY29tcG91bmROb2RlLmdldENoaWxkKCkuZ2V0Tm9kZXMoKTtcbiAgICB2YXIgbm9kZTtcbiAgICB2YXIgZml4ZWROb2RlV2VpZ2h0ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBub2RlID0gbm9kZXNbaV07XG4gICAgICBpZiAobm9kZS5nZXRDaGlsZCgpID09IG51bGwpIHtcbiAgICAgICAgaWYgKHNlbGYuZml4ZWROb2RlU2V0Lmhhcyhub2RlLmlkKSkge1xuICAgICAgICAgIGZpeGVkTm9kZVdlaWdodCArPSAxMDA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpeGVkTm9kZVdlaWdodCArPSBjYWxjdWxhdGVDb21wb3VuZFdlaWdodChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpeGVkTm9kZVdlaWdodDtcbiAgfTtcblxuICBpZiAodGhpcy5jb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50KSB7XG4gICAgLy8gZmlsbCBmaXhlZE5vZGVTZXRcbiAgICB0aGlzLmNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZURhdGEpIHtcbiAgICAgIHNlbGYuZml4ZWROb2RlU2V0LmFkZChub2RlRGF0YS5ub2RlSWQpO1xuICAgIH0pO1xuXG4gICAgLy8gYXNzaWduIGZpeGVkIG5vZGUgd2VpZ2h0cyB0byBjb21wb3VuZHMgaWYgdGhleSBjb250YWluIGZpeGVkIG5vZGVzXG4gICAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsTm9kZXMoKTtcbiAgICB2YXIgbm9kZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5vZGUgPSBhbGxOb2Rlc1tpXTtcbiAgICAgIGlmIChub2RlLmdldENoaWxkKCkgIT0gbnVsbCkge1xuICAgICAgICB2YXIgZml4ZWROb2RlV2VpZ2h0ID0gY2FsY3VsYXRlQ29tcG91bmRXZWlnaHQobm9kZSk7XG4gICAgICAgIGlmIChmaXhlZE5vZGVXZWlnaHQgPiAwKSB7XG4gICAgICAgICAgbm9kZS5maXhlZE5vZGVXZWlnaHQgPSBmaXhlZE5vZGVXZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5jb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcbiAgICB2YXIgbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICB2YXIgbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmZpeGVkTm9kZXNPbkhvcml6b250YWwgPSBuZXcgU2V0KCk7XG4gICAgdGhpcy5maXhlZE5vZGVzT25WZXJ0aWNhbCA9IG5ldyBTZXQoKTtcblxuICAgIC8vIGZpbGwgbWFwcyBhbmQgc2V0c1xuICAgIHRoaXMuZml4ZWROb2RlU2V0LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgc2VsZi5maXhlZE5vZGVzT25Ib3Jpem9udGFsLmFkZChub2RlSWQpO1xuICAgICAgc2VsZi5maXhlZE5vZGVzT25WZXJ0aWNhbC5hZGQobm9kZUlkKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQpIHtcbiAgICAgIGlmICh0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWwpIHtcbiAgICAgICAgdmFyIHZlcnRpY2FsQWxpZ25tZW50ID0gdGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZlcnRpY2FsQWxpZ25tZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LnNldChcImR1bW15XCIgKyBpLCBbXSk7XG4gICAgICAgICAgdmVydGljYWxBbGlnbm1lbnRbaV0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LnNldChub2RlSWQsIFwiZHVtbXlcIiArIGkpO1xuICAgICAgICAgICAgc2VsZi5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChcImR1bW15XCIgKyBpKS5wdXNoKG5vZGVJZCk7XG4gICAgICAgICAgICBpZiAoc2VsZi5maXhlZE5vZGVTZXQuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgICAgc2VsZi5maXhlZE5vZGVzT25Ib3Jpem9udGFsLmFkZChcImR1bW15XCIgKyBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsKSB7XG4gICAgICAgIHZhciBob3Jpem9udGFsQWxpZ25tZW50ID0gdGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWw7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaG9yaXpvbnRhbEFsaWdubWVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHRoaXMuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LnNldChcImR1bW15XCIgKyBpLCBbXSk7XG4gICAgICAgICAgaG9yaXpvbnRhbEFsaWdubWVudFtpXS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5zZXQobm9kZUlkLCBcImR1bW15XCIgKyBpKTtcbiAgICAgICAgICAgIHNlbGYuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChcImR1bW15XCIgKyBpKS5wdXNoKG5vZGVJZCk7XG4gICAgICAgICAgICBpZiAoc2VsZi5maXhlZE5vZGVTZXQuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgICAgc2VsZi5maXhlZE5vZGVzT25WZXJ0aWNhbC5hZGQoXCJkdW1teVwiICsgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQ29TRUNvbnN0YW50cy5SRUxBWF9NT1ZFTUVOVF9PTl9DT05TVFJBSU5UUykge1xuXG4gICAgICB0aGlzLnNodWZmbGUgPSBmdW5jdGlvbiAoYXJyYXkpIHtcbiAgICAgICAgdmFyIGosIHgsIGk7XG4gICAgICAgIGZvciAoaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPj0gMiAqIGFycmF5Lmxlbmd0aCAvIDM7IGktLSkge1xuICAgICAgICAgIGogPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaSArIDEpKTtcbiAgICAgICAgICB4ID0gYXJyYXlbaV07XG4gICAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgICAgICAgICBhcnJheVtqXSA9IHg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgfTtcblxuICAgICAgdGhpcy5ub2Rlc0luUmVsYXRpdmVIb3Jpem9udGFsID0gW107XG4gICAgICB0aGlzLm5vZGVzSW5SZWxhdGl2ZVZlcnRpY2FsID0gW107XG4gICAgICB0aGlzLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcEhvcml6b250YWwgPSBuZXcgTWFwKCk7XG4gICAgICB0aGlzLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcFZlcnRpY2FsID0gbmV3IE1hcCgpO1xuICAgICAgdGhpcy5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsID0gbmV3IE1hcCgpO1xuICAgICAgdGhpcy5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbCA9IG5ldyBNYXAoKTtcblxuICAgICAgLy8gZmlsbCBhcnJheXMgYW5kIG1hcHNcbiAgICAgIHRoaXMuY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgaWYgKGNvbnN0cmFpbnQubGVmdCkge1xuICAgICAgICAgIHZhciBub2RlSWRMZWZ0ID0gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMoY29uc3RyYWludC5sZWZ0KSA/IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGNvbnN0cmFpbnQubGVmdCkgOiBjb25zdHJhaW50LmxlZnQ7XG4gICAgICAgICAgdmFyIG5vZGVJZFJpZ2h0ID0gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMoY29uc3RyYWludC5yaWdodCkgPyBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChjb25zdHJhaW50LnJpZ2h0KSA6IGNvbnN0cmFpbnQucmlnaHQ7XG5cbiAgICAgICAgICBpZiAoIXNlbGYubm9kZXNJblJlbGF0aXZlSG9yaXpvbnRhbC5pbmNsdWRlcyhub2RlSWRMZWZ0KSkge1xuICAgICAgICAgICAgc2VsZi5ub2Rlc0luUmVsYXRpdmVIb3Jpem9udGFsLnB1c2gobm9kZUlkTGVmdCk7XG4gICAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcEhvcml6b250YWwuc2V0KG5vZGVJZExlZnQsIFtdKTtcbiAgICAgICAgICAgIGlmIChzZWxmLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKG5vZGVJZExlZnQpKSB7XG4gICAgICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5zZXQobm9kZUlkTGVmdCwgc2VsZi5pZFRvTm9kZU1hcC5nZXQoc2VsZi5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChub2RlSWRMZWZ0KVswXSkuZ2V0Q2VudGVyWCgpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5zZXQobm9kZUlkTGVmdCwgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkTGVmdCkuZ2V0Q2VudGVyWCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzZWxmLm5vZGVzSW5SZWxhdGl2ZUhvcml6b250YWwuaW5jbHVkZXMobm9kZUlkUmlnaHQpKSB7XG4gICAgICAgICAgICBzZWxmLm5vZGVzSW5SZWxhdGl2ZUhvcml6b250YWwucHVzaChub2RlSWRSaWdodCk7XG4gICAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcEhvcml6b250YWwuc2V0KG5vZGVJZFJpZ2h0LCBbXSk7XG4gICAgICAgICAgICBpZiAoc2VsZi5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhub2RlSWRSaWdodCkpIHtcbiAgICAgICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLnNldChub2RlSWRSaWdodCwgc2VsZi5pZFRvTm9kZU1hcC5nZXQoc2VsZi5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChub2RlSWRSaWdodClbMF0pLmdldENlbnRlclgoKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuc2V0KG5vZGVJZFJpZ2h0LCBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWRSaWdodCkuZ2V0Q2VudGVyWCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcEhvcml6b250YWwuZ2V0KG5vZGVJZExlZnQpLnB1c2goeyByaWdodDogbm9kZUlkUmlnaHQsIGdhcDogY29uc3RyYWludC5nYXAgfSk7XG4gICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBIb3Jpem9udGFsLmdldChub2RlSWRSaWdodCkucHVzaCh7IGxlZnQ6IG5vZGVJZExlZnQsIGdhcDogY29uc3RyYWludC5nYXAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIG5vZGVJZFRvcCA9IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMoY29uc3RyYWludC50b3ApID8gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChjb25zdHJhaW50LnRvcCkgOiBjb25zdHJhaW50LnRvcDtcbiAgICAgICAgICB2YXIgbm9kZUlkQm90dG9tID0gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhjb25zdHJhaW50LmJvdHRvbSkgPyBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGNvbnN0cmFpbnQuYm90dG9tKSA6IGNvbnN0cmFpbnQuYm90dG9tO1xuXG4gICAgICAgICAgaWYgKCFzZWxmLm5vZGVzSW5SZWxhdGl2ZVZlcnRpY2FsLmluY2x1ZGVzKG5vZGVJZFRvcCkpIHtcbiAgICAgICAgICAgIHNlbGYubm9kZXNJblJlbGF0aXZlVmVydGljYWwucHVzaChub2RlSWRUb3ApO1xuICAgICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBWZXJ0aWNhbC5zZXQobm9kZUlkVG9wLCBbXSk7XG4gICAgICAgICAgICBpZiAoc2VsZi5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKG5vZGVJZFRvcCkpIHtcbiAgICAgICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5zZXQobm9kZUlkVG9wLCBzZWxmLmlkVG9Ob2RlTWFwLmdldChzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQobm9kZUlkVG9wKVswXSkuZ2V0Q2VudGVyWSgpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuc2V0KG5vZGVJZFRvcCwgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkVG9wKS5nZXRDZW50ZXJZKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXNlbGYubm9kZXNJblJlbGF0aXZlVmVydGljYWwuaW5jbHVkZXMobm9kZUlkQm90dG9tKSkge1xuICAgICAgICAgICAgc2VsZi5ub2Rlc0luUmVsYXRpdmVWZXJ0aWNhbC5wdXNoKG5vZGVJZEJvdHRvbSk7XG4gICAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcFZlcnRpY2FsLnNldChub2RlSWRCb3R0b20sIFtdKTtcbiAgICAgICAgICAgIGlmIChzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMobm9kZUlkQm90dG9tKSkge1xuICAgICAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLnNldChub2RlSWRCb3R0b20sIHNlbGYuaWRUb05vZGVNYXAuZ2V0KHNlbGYuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChub2RlSWRCb3R0b20pWzBdKS5nZXRDZW50ZXJZKCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5zZXQobm9kZUlkQm90dG9tLCBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWRCb3R0b20pLmdldENlbnRlclkoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwVmVydGljYWwuZ2V0KG5vZGVJZFRvcCkucHVzaCh7IGJvdHRvbTogbm9kZUlkQm90dG9tLCBnYXA6IGNvbnN0cmFpbnQuZ2FwIH0pO1xuICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwVmVydGljYWwuZ2V0KG5vZGVJZEJvdHRvbSkucHVzaCh7IHRvcDogbm9kZUlkVG9wLCBnYXA6IGNvbnN0cmFpbnQuZ2FwIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHN1YkdyYXBoT25Ib3Jpem9udGFsID0gbmV3IE1hcCgpOyAvLyBzdWJncmFwaCBmcm9tIHZlcnRpY2FsIFJQIGNvbnN0cmFpbnRzXG4gICAgICB2YXIgc3ViR3JhcGhPblZlcnRpY2FsID0gbmV3IE1hcCgpOyAvLyBzdWJncmFwaCBmcm9tIHZlcnRpY2FsIFJQIGNvbnN0cmFpbnRzXG5cbiAgICAgIC8vIGNvbnN0cnVjdCBzdWJncmFwaHMgZnJvbSByZWxhdGl2ZSBwbGFjZW1lbnQgY29uc3RyYWludHMgXG4gICAgICB0aGlzLmNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgIGlmIChjb25zdHJhaW50LmxlZnQpIHtcbiAgICAgICAgICB2YXIgbGVmdCA9IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKGNvbnN0cmFpbnQubGVmdCkgPyBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChjb25zdHJhaW50LmxlZnQpIDogY29uc3RyYWludC5sZWZ0O1xuICAgICAgICAgIHZhciByaWdodCA9IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKGNvbnN0cmFpbnQucmlnaHQpID8gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoY29uc3RyYWludC5yaWdodCkgOiBjb25zdHJhaW50LnJpZ2h0O1xuICAgICAgICAgIGlmIChzdWJHcmFwaE9uSG9yaXpvbnRhbC5oYXMobGVmdCkpIHtcbiAgICAgICAgICAgIHN1YkdyYXBoT25Ib3Jpem9udGFsLmdldChsZWZ0KS5wdXNoKHJpZ2h0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3ViR3JhcGhPbkhvcml6b250YWwuc2V0KGxlZnQsIFtyaWdodF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3ViR3JhcGhPbkhvcml6b250YWwuaGFzKHJpZ2h0KSkge1xuICAgICAgICAgICAgc3ViR3JhcGhPbkhvcml6b250YWwuZ2V0KHJpZ2h0KS5wdXNoKGxlZnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJHcmFwaE9uSG9yaXpvbnRhbC5zZXQocmlnaHQsIFtsZWZ0XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciB0b3AgPSBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKGNvbnN0cmFpbnQudG9wKSA/IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoY29uc3RyYWludC50b3ApIDogY29uc3RyYWludC50b3A7XG4gICAgICAgICAgdmFyIGJvdHRvbSA9IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMoY29uc3RyYWludC5ib3R0b20pID8gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChjb25zdHJhaW50LmJvdHRvbSkgOiBjb25zdHJhaW50LmJvdHRvbTtcbiAgICAgICAgICBpZiAoc3ViR3JhcGhPblZlcnRpY2FsLmhhcyh0b3ApKSB7XG4gICAgICAgICAgICBzdWJHcmFwaE9uVmVydGljYWwuZ2V0KHRvcCkucHVzaChib3R0b20pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJHcmFwaE9uVmVydGljYWwuc2V0KHRvcCwgW2JvdHRvbV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3ViR3JhcGhPblZlcnRpY2FsLmhhcyhib3R0b20pKSB7XG4gICAgICAgICAgICBzdWJHcmFwaE9uVmVydGljYWwuZ2V0KGJvdHRvbSkucHVzaCh0b3ApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJHcmFwaE9uVmVydGljYWwuc2V0KGJvdHRvbSwgW3RvcF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCBjb21wb25lbnRzIGZyb20gYSBnaXZlbiBncmFwaCBcbiAgICAgIC8vIGFsc28gcmV0dXJucyBhbiBhcnJheSB0aGF0IGtlZXBzIHdoZXRoZXIgZWFjaCBjb21wb25lbnQgY29udGFpbnMgZml4ZWQgbm9kZVxuICAgICAgdmFyIGNvbnN0cnVjdENvbXBvbmVudHMgPSBmdW5jdGlvbiBjb25zdHJ1Y3RDb21wb25lbnRzKGdyYXBoLCBmaXhlZE5vZGVzKSB7XG4gICAgICAgIHZhciBjb21wb25lbnRzID0gW107XG4gICAgICAgIHZhciBpc0ZpeGVkID0gW107XG4gICAgICAgIHZhciBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0KCk7XG4gICAgICAgIHZhciB2aXNpdGVkID0gbmV3IFNldCgpO1xuICAgICAgICB2YXIgY291bnQgPSAwO1xuXG4gICAgICAgIGdyYXBoLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICBpZiAoIXZpc2l0ZWQuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudHNbY291bnRdID0gW107XG4gICAgICAgICAgICBpc0ZpeGVkW2NvdW50XSA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIGN1cnJlbnROb2RlID0ga2V5O1xuICAgICAgICAgICAgcXVldWUucHVzaChjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICB2aXNpdGVkLmFkZChjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICBjb21wb25lbnRzW2NvdW50XS5wdXNoKGN1cnJlbnROb2RlKTtcblxuICAgICAgICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgaWYgKGZpeGVkTm9kZXMuaGFzKGN1cnJlbnROb2RlKSkge1xuICAgICAgICAgICAgICAgIGlzRml4ZWRbY291bnRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgbmVpZ2hib3JzID0gZ3JhcGguZ2V0KGN1cnJlbnROb2RlKTtcbiAgICAgICAgICAgICAgbmVpZ2hib3JzLmZvckVhY2goZnVuY3Rpb24gKG5laWdoYm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2aXNpdGVkLmhhcyhuZWlnaGJvcikpIHtcbiAgICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2gobmVpZ2hib3IpO1xuICAgICAgICAgICAgICAgICAgdmlzaXRlZC5hZGQobmVpZ2hib3IpO1xuICAgICAgICAgICAgICAgICAgY29tcG9uZW50c1tjb3VudF0ucHVzaChuZWlnaGJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4geyBjb21wb25lbnRzOiBjb21wb25lbnRzLCBpc0ZpeGVkOiBpc0ZpeGVkIH07XG4gICAgICB9O1xuXG4gICAgICB2YXIgcmVzdWx0T25Ib3Jpem9udGFsID0gY29uc3RydWN0Q29tcG9uZW50cyhzdWJHcmFwaE9uSG9yaXpvbnRhbCwgc2VsZi5maXhlZE5vZGVzT25Ib3Jpem9udGFsKTtcbiAgICAgIHRoaXMuY29tcG9uZW50c09uSG9yaXpvbnRhbCA9IHJlc3VsdE9uSG9yaXpvbnRhbC5jb21wb25lbnRzO1xuICAgICAgdGhpcy5maXhlZENvbXBvbmVudHNPbkhvcml6b250YWwgPSByZXN1bHRPbkhvcml6b250YWwuaXNGaXhlZDtcbiAgICAgIHZhciByZXN1bHRPblZlcnRpY2FsID0gY29uc3RydWN0Q29tcG9uZW50cyhzdWJHcmFwaE9uVmVydGljYWwsIHNlbGYuZml4ZWROb2Rlc09uVmVydGljYWwpO1xuICAgICAgdGhpcy5jb21wb25lbnRzT25WZXJ0aWNhbCA9IHJlc3VsdE9uVmVydGljYWwuY29tcG9uZW50cztcbiAgICAgIHRoaXMuZml4ZWRDb21wb25lbnRzT25WZXJ0aWNhbCA9IHJlc3VsdE9uVmVydGljYWwuaXNGaXhlZDtcbiAgICB9XG4gIH1cbn07XG5cbi8vIHVwZGF0ZXMgbm9kZSBkaXNwbGFjZW1lbnRzIGJhc2VkIG9uIGNvbnN0cmFpbnRzXG5Db1NFTGF5b3V0LnByb3RvdHlwZS51cGRhdGVEaXNwbGFjZW1lbnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmICh0aGlzLmNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQpIHtcbiAgICB0aGlzLmNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZURhdGEpIHtcbiAgICAgIHZhciBmaXhlZE5vZGUgPSBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlRGF0YS5ub2RlSWQpO1xuICAgICAgZml4ZWROb2RlLmRpc3BsYWNlbWVudFggPSAwO1xuICAgICAgZml4ZWROb2RlLmRpc3BsYWNlbWVudFkgPSAwO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludCkge1xuICAgIGlmICh0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWwpIHtcbiAgICAgIHZhciBhbGxWZXJ0aWNhbEFsaWdubWVudHMgPSB0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWw7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbFZlcnRpY2FsQWxpZ25tZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdG90YWxEaXNwbGFjZW1lbnRYID0gMDtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhbGxWZXJ0aWNhbEFsaWdubWVudHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBpZiAodGhpcy5maXhlZE5vZGVTZXQuaGFzKGFsbFZlcnRpY2FsQWxpZ25tZW50c1tpXVtqXSkpIHtcbiAgICAgICAgICAgIHRvdGFsRGlzcGxhY2VtZW50WCA9IDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgdG90YWxEaXNwbGFjZW1lbnRYICs9IHRoaXMuaWRUb05vZGVNYXAuZ2V0KGFsbFZlcnRpY2FsQWxpZ25tZW50c1tpXVtqXSkuZGlzcGxhY2VtZW50WDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYXZlcmFnZURpc3BsYWNlbWVudFggPSB0b3RhbERpc3BsYWNlbWVudFggLyBhbGxWZXJ0aWNhbEFsaWdubWVudHNbaV0ubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFsbFZlcnRpY2FsQWxpZ25tZW50c1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHRoaXMuaWRUb05vZGVNYXAuZ2V0KGFsbFZlcnRpY2FsQWxpZ25tZW50c1tpXVtqXSkuZGlzcGxhY2VtZW50WCA9IGF2ZXJhZ2VEaXNwbGFjZW1lbnRYO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbCkge1xuICAgICAgdmFyIGFsbEhvcml6b250YWxBbGlnbm1lbnRzID0gdGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWw7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbEhvcml6b250YWxBbGlnbm1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0b3RhbERpc3BsYWNlbWVudFkgPSAwO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFsbEhvcml6b250YWxBbGlnbm1lbnRzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZml4ZWROb2RlU2V0LmhhcyhhbGxIb3Jpem9udGFsQWxpZ25tZW50c1tpXVtqXSkpIHtcbiAgICAgICAgICAgIHRvdGFsRGlzcGxhY2VtZW50WSA9IDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgdG90YWxEaXNwbGFjZW1lbnRZICs9IHRoaXMuaWRUb05vZGVNYXAuZ2V0KGFsbEhvcml6b250YWxBbGlnbm1lbnRzW2ldW2pdKS5kaXNwbGFjZW1lbnRZO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhdmVyYWdlRGlzcGxhY2VtZW50WSA9IHRvdGFsRGlzcGxhY2VtZW50WSAvIGFsbEhvcml6b250YWxBbGlnbm1lbnRzW2ldLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhbGxIb3Jpem9udGFsQWxpZ25tZW50c1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHRoaXMuaWRUb05vZGVNYXAuZ2V0KGFsbEhvcml6b250YWxBbGlnbm1lbnRzW2ldW2pdKS5kaXNwbGFjZW1lbnRZID0gYXZlcmFnZURpc3BsYWNlbWVudFk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5jb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcblxuICAgIGlmIChDb1NFQ29uc3RhbnRzLlJFTEFYX01PVkVNRU5UX09OX0NPTlNUUkFJTlRTKSB7XG4gICAgICAvLyBzaHVmZmxlIGFycmF5IHRvIHJhbmRvbWl6ZSBub2RlIHByb2Nlc3Npbmcgb3JkZXJcbiAgICAgIGlmICh0aGlzLnRvdGFsSXRlcmF0aW9ucyAlIDEwID09IDApIHtcbiAgICAgICAgdGhpcy5zaHVmZmxlKHRoaXMubm9kZXNJblJlbGF0aXZlSG9yaXpvbnRhbCk7XG4gICAgICAgIHRoaXMuc2h1ZmZsZSh0aGlzLm5vZGVzSW5SZWxhdGl2ZVZlcnRpY2FsKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5ub2Rlc0luUmVsYXRpdmVIb3Jpem9udGFsLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICBpZiAoIXNlbGYuZml4ZWROb2Rlc09uSG9yaXpvbnRhbC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgIHZhciBkaXNwbGFjZW1lbnQgPSAwO1xuICAgICAgICAgIGlmIChzZWxmLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgIGRpc3BsYWNlbWVudCA9IHNlbGYuaWRUb05vZGVNYXAuZ2V0KHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQobm9kZUlkKVswXSkuZGlzcGxhY2VtZW50WDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGlzcGxhY2VtZW50ID0gc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRYO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcEhvcml6b250YWwuZ2V0KG5vZGVJZCkuZm9yRWFjaChmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnQucmlnaHQpIHtcbiAgICAgICAgICAgICAgdmFyIGRpZmYgPSBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuZ2V0KGNvbnN0cmFpbnQucmlnaHQpIC0gc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLmdldChub2RlSWQpIC0gZGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgICBpZiAoZGlmZiA8IGNvbnN0cmFpbnQuZ2FwKSB7XG4gICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50IC09IGNvbnN0cmFpbnQuZ2FwIC0gZGlmZjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIGRpZmYgPSBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuZ2V0KG5vZGVJZCkgLSBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuZ2V0KGNvbnN0cmFpbnQubGVmdCkgKyBkaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgIGlmIChkaWZmIDwgY29uc3RyYWludC5nYXApIHtcbiAgICAgICAgICAgICAgICBkaXNwbGFjZW1lbnQgKz0gY29uc3RyYWludC5nYXAgLSBkaWZmO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLnNldChub2RlSWQsIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5nZXQobm9kZUlkKSArIGRpc3BsYWNlbWVudCk7XG4gICAgICAgICAgaWYgKHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgc2VsZi5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChub2RlSWQpLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWQpLmRpc3BsYWNlbWVudFggPSBkaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRYID0gZGlzcGxhY2VtZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubm9kZXNJblJlbGF0aXZlVmVydGljYWwuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgIGlmICghc2VsZi5maXhlZE5vZGVzT25Ib3Jpem9udGFsLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgdmFyIGRpc3BsYWNlbWVudCA9IDA7XG4gICAgICAgICAgaWYgKHNlbGYuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICBkaXNwbGFjZW1lbnQgPSBzZWxmLmlkVG9Ob2RlTWFwLmdldChzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQobm9kZUlkKVswXSkuZGlzcGxhY2VtZW50WTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGlzcGxhY2VtZW50ID0gc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRZO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcFZlcnRpY2FsLmdldChub2RlSWQpLmZvckVhY2goZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgIGlmIChjb25zdHJhaW50LmJvdHRvbSkge1xuICAgICAgICAgICAgICB2YXIgZGlmZiA9IHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuZ2V0KGNvbnN0cmFpbnQuYm90dG9tKSAtIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuZ2V0KG5vZGVJZCkgLSBkaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgIGlmIChkaWZmIDwgY29uc3RyYWludC5nYXApIHtcbiAgICAgICAgICAgICAgICBkaXNwbGFjZW1lbnQgLT0gY29uc3RyYWludC5nYXAgLSBkaWZmO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgZGlmZiA9IHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuZ2V0KG5vZGVJZCkgLSBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLmdldChjb25zdHJhaW50LnRvcCkgKyBkaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgIGlmIChkaWZmIDwgY29uc3RyYWludC5nYXApIHtcbiAgICAgICAgICAgICAgICBkaXNwbGFjZW1lbnQgKz0gY29uc3RyYWludC5nYXAgLSBkaWZmO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5zZXQobm9kZUlkLCBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLmdldChub2RlSWQpICsgZGlzcGxhY2VtZW50KTtcbiAgICAgICAgICBpZiAoc2VsZi5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgIHNlbGYuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChub2RlSWQpLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWQpLmRpc3BsYWNlbWVudFkgPSBkaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRZID0gZGlzcGxhY2VtZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb21wb25lbnRzT25Ib3Jpem9udGFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHNPbkhvcml6b250YWxbaV07XG4gICAgICAgIGlmICh0aGlzLmZpeGVkQ29tcG9uZW50c09uSG9yaXpvbnRhbFtpXSkge1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tcG9uZW50Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhjb21wb25lbnRbal0pKSB7XG4gICAgICAgICAgICAgIHRoaXMuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoY29tcG9uZW50W2pdKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWQpLmRpc3BsYWNlbWVudFggPSAwO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaWRUb05vZGVNYXAuZ2V0KGNvbXBvbmVudFtqXSkuZGlzcGxhY2VtZW50WCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBzdW0gPSAwO1xuICAgICAgICAgIHZhciBjb3VudCA9IDA7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21wb25lbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKGNvbXBvbmVudFtqXSkpIHtcbiAgICAgICAgICAgICAgdmFyIGFjdHVhbE5vZGVzID0gdGhpcy5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChjb21wb25lbnRbal0pO1xuICAgICAgICAgICAgICBzdW0gKz0gYWN0dWFsTm9kZXMubGVuZ3RoICogdGhpcy5pZFRvTm9kZU1hcC5nZXQoYWN0dWFsTm9kZXNbMF0pLmRpc3BsYWNlbWVudFg7XG4gICAgICAgICAgICAgIGNvdW50ICs9IGFjdHVhbE5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN1bSArPSB0aGlzLmlkVG9Ob2RlTWFwLmdldChjb21wb25lbnRbal0pLmRpc3BsYWNlbWVudFg7XG4gICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBhdmVyYWdlRGlzcGxhY2VtZW50ID0gc3VtIC8gY291bnQ7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21wb25lbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKGNvbXBvbmVudFtqXSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChjb21wb25lbnRbal0pLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICAgIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WCA9IGF2ZXJhZ2VEaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5pZFRvTm9kZU1hcC5nZXQoY29tcG9uZW50W2pdKS5kaXNwbGFjZW1lbnRYID0gYXZlcmFnZURpc3BsYWNlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbXBvbmVudHNPblZlcnRpY2FsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHNPblZlcnRpY2FsW2ldO1xuICAgICAgICBpZiAodGhpcy5maXhlZENvbXBvbmVudHNPblZlcnRpY2FsW2ldKSB7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21wb25lbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMoY29tcG9uZW50W2pdKSkge1xuICAgICAgICAgICAgICB0aGlzLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoY29tcG9uZW50W2pdKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWQpLmRpc3BsYWNlbWVudFkgPSAwO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaWRUb05vZGVNYXAuZ2V0KGNvbXBvbmVudFtqXSkuZGlzcGxhY2VtZW50WSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBzdW0gPSAwO1xuICAgICAgICAgIHZhciBjb3VudCA9IDA7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21wb25lbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMoY29tcG9uZW50W2pdKSkge1xuICAgICAgICAgICAgICB2YXIgYWN0dWFsTm9kZXMgPSB0aGlzLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoY29tcG9uZW50W2pdKTtcbiAgICAgICAgICAgICAgc3VtICs9IGFjdHVhbE5vZGVzLmxlbmd0aCAqIHRoaXMuaWRUb05vZGVNYXAuZ2V0KGFjdHVhbE5vZGVzWzBdKS5kaXNwbGFjZW1lbnRZO1xuICAgICAgICAgICAgICBjb3VudCArPSBhY3R1YWxOb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdW0gKz0gdGhpcy5pZFRvTm9kZU1hcC5nZXQoY29tcG9uZW50W2pdKS5kaXNwbGFjZW1lbnRZO1xuICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgYXZlcmFnZURpc3BsYWNlbWVudCA9IHN1bSAvIGNvdW50O1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tcG9uZW50Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKGNvbXBvbmVudFtqXSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGNvbXBvbmVudFtqXSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRZID0gYXZlcmFnZURpc3BsYWNlbWVudDtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmlkVG9Ob2RlTWFwLmdldChjb21wb25lbnRbal0pLmRpc3BsYWNlbWVudFkgPSBhdmVyYWdlRGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuY2FsY3VsYXRlTm9kZXNUb0FwcGx5R3Jhdml0YXRpb25UbyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5vZGVMaXN0ID0gW107XG4gIHZhciBncmFwaDtcblxuICB2YXIgZ3JhcGhzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0R3JhcGhzKCk7XG4gIHZhciBzaXplID0gZ3JhcGhzLmxlbmd0aDtcbiAgdmFyIGk7XG4gIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICBncmFwaCA9IGdyYXBoc1tpXTtcblxuICAgIGdyYXBoLnVwZGF0ZUNvbm5lY3RlZCgpO1xuXG4gICAgaWYgKCFncmFwaC5pc0Nvbm5lY3RlZCkge1xuICAgICAgbm9kZUxpc3QgPSBub2RlTGlzdC5jb25jYXQoZ3JhcGguZ2V0Tm9kZXMoKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vZGVMaXN0O1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuY3JlYXRlQmVuZHBvaW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVkZ2VzID0gW107XG4gIGVkZ2VzID0gZWRnZXMuY29uY2F0KHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEFsbEVkZ2VzKCkpO1xuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIGk7XG4gIGZvciAoaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlZGdlID0gZWRnZXNbaV07XG5cbiAgICBpZiAoIXZpc2l0ZWQuaGFzKGVkZ2UpKSB7XG4gICAgICB2YXIgc291cmNlID0gZWRnZS5nZXRTb3VyY2UoKTtcbiAgICAgIHZhciB0YXJnZXQgPSBlZGdlLmdldFRhcmdldCgpO1xuXG4gICAgICBpZiAoc291cmNlID09IHRhcmdldCkge1xuICAgICAgICBlZGdlLmdldEJlbmRwb2ludHMoKS5wdXNoKG5ldyBQb2ludEQoKSk7XG4gICAgICAgIGVkZ2UuZ2V0QmVuZHBvaW50cygpLnB1c2gobmV3IFBvaW50RCgpKTtcbiAgICAgICAgdGhpcy5jcmVhdGVEdW1teU5vZGVzRm9yQmVuZHBvaW50cyhlZGdlKTtcbiAgICAgICAgdmlzaXRlZC5hZGQoZWRnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZWRnZUxpc3QgPSBbXTtcblxuICAgICAgICBlZGdlTGlzdCA9IGVkZ2VMaXN0LmNvbmNhdChzb3VyY2UuZ2V0RWRnZUxpc3RUb05vZGUodGFyZ2V0KSk7XG4gICAgICAgIGVkZ2VMaXN0ID0gZWRnZUxpc3QuY29uY2F0KHRhcmdldC5nZXRFZGdlTGlzdFRvTm9kZShzb3VyY2UpKTtcblxuICAgICAgICBpZiAoIXZpc2l0ZWQuaGFzKGVkZ2VMaXN0WzBdKSkge1xuICAgICAgICAgIGlmIChlZGdlTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2YXIgaztcbiAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBlZGdlTGlzdC5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICB2YXIgbXVsdGlFZGdlID0gZWRnZUxpc3Rba107XG4gICAgICAgICAgICAgIG11bHRpRWRnZS5nZXRCZW5kcG9pbnRzKCkucHVzaChuZXcgUG9pbnREKCkpO1xuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUR1bW15Tm9kZXNGb3JCZW5kcG9pbnRzKG11bHRpRWRnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVkZ2VMaXN0LmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgICAgIHZpc2l0ZWQuYWRkKGVkZ2UpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZpc2l0ZWQuc2l6ZSA9PSBlZGdlcy5sZW5ndGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUucG9zaXRpb25Ob2Rlc1JhZGlhbGx5ID0gZnVuY3Rpb24gKGZvcmVzdCkge1xuICAvLyBXZSB0aWxlIHRoZSB0cmVlcyB0byBhIGdyaWQgcm93IGJ5IHJvdzsgZmlyc3QgdHJlZSBzdGFydHMgYXQgKDAsMClcbiAgdmFyIGN1cnJlbnRTdGFydGluZ1BvaW50ID0gbmV3IFBvaW50KDAsIDApO1xuICB2YXIgbnVtYmVyT2ZDb2x1bW5zID0gTWF0aC5jZWlsKE1hdGguc3FydChmb3Jlc3QubGVuZ3RoKSk7XG4gIHZhciBoZWlnaHQgPSAwO1xuICB2YXIgY3VycmVudFkgPSAwO1xuICB2YXIgY3VycmVudFggPSAwO1xuICB2YXIgcG9pbnQgPSBuZXcgUG9pbnREKDAsIDApO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZm9yZXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGkgJSBudW1iZXJPZkNvbHVtbnMgPT0gMCkge1xuICAgICAgLy8gU3RhcnQgb2YgYSBuZXcgcm93LCBtYWtlIHRoZSB4IGNvb3JkaW5hdGUgMCwgaW5jcmVtZW50IHRoZVxuICAgICAgLy8geSBjb29yZGluYXRlIHdpdGggdGhlIG1heCBoZWlnaHQgb2YgdGhlIHByZXZpb3VzIHJvd1xuICAgICAgY3VycmVudFggPSAwO1xuICAgICAgY3VycmVudFkgPSBoZWlnaHQ7XG5cbiAgICAgIGlmIChpICE9IDApIHtcbiAgICAgICAgY3VycmVudFkgKz0gQ29TRUNvbnN0YW50cy5ERUZBVUxUX0NPTVBPTkVOVF9TRVBFUkFUSU9OO1xuICAgICAgfVxuXG4gICAgICBoZWlnaHQgPSAwO1xuICAgIH1cblxuICAgIHZhciB0cmVlID0gZm9yZXN0W2ldO1xuXG4gICAgLy8gRmluZCB0aGUgY2VudGVyIG9mIHRoZSB0cmVlXG4gICAgdmFyIGNlbnRlck5vZGUgPSBMYXlvdXQuZmluZENlbnRlck9mVHJlZSh0cmVlKTtcblxuICAgIC8vIFNldCB0aGUgc3RhcmluZyBwb2ludCBvZiB0aGUgbmV4dCB0cmVlXG4gICAgY3VycmVudFN0YXJ0aW5nUG9pbnQueCA9IGN1cnJlbnRYO1xuICAgIGN1cnJlbnRTdGFydGluZ1BvaW50LnkgPSBjdXJyZW50WTtcblxuICAgIC8vIERvIGEgcmFkaWFsIGxheW91dCBzdGFydGluZyB3aXRoIHRoZSBjZW50ZXJcbiAgICBwb2ludCA9IENvU0VMYXlvdXQucmFkaWFsTGF5b3V0KHRyZWUsIGNlbnRlck5vZGUsIGN1cnJlbnRTdGFydGluZ1BvaW50KTtcblxuICAgIGlmIChwb2ludC55ID4gaGVpZ2h0KSB7XG4gICAgICBoZWlnaHQgPSBNYXRoLmZsb29yKHBvaW50LnkpO1xuICAgIH1cblxuICAgIGN1cnJlbnRYID0gTWF0aC5mbG9vcihwb2ludC54ICsgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0NPTVBPTkVOVF9TRVBFUkFUSU9OKTtcbiAgfVxuXG4gIHRoaXMudHJhbnNmb3JtKG5ldyBQb2ludEQoTGF5b3V0Q29uc3RhbnRzLldPUkxEX0NFTlRFUl9YIC0gcG9pbnQueCAvIDIsIExheW91dENvbnN0YW50cy5XT1JMRF9DRU5URVJfWSAtIHBvaW50LnkgLyAyKSk7XG59O1xuXG5Db1NFTGF5b3V0LnJhZGlhbExheW91dCA9IGZ1bmN0aW9uICh0cmVlLCBjZW50ZXJOb2RlLCBzdGFydGluZ1BvaW50KSB7XG4gIHZhciByYWRpYWxTZXAgPSBNYXRoLm1heCh0aGlzLm1heERpYWdvbmFsSW5UcmVlKHRyZWUpLCBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfUkFESUFMX1NFUEFSQVRJT04pO1xuICBDb1NFTGF5b3V0LmJyYW5jaFJhZGlhbExheW91dChjZW50ZXJOb2RlLCBudWxsLCAwLCAzNTksIDAsIHJhZGlhbFNlcCk7XG4gIHZhciBib3VuZHMgPSBMR3JhcGguY2FsY3VsYXRlQm91bmRzKHRyZWUpO1xuXG4gIHZhciB0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKCk7XG4gIHRyYW5zZm9ybS5zZXREZXZpY2VPcmdYKGJvdW5kcy5nZXRNaW5YKCkpO1xuICB0cmFuc2Zvcm0uc2V0RGV2aWNlT3JnWShib3VuZHMuZ2V0TWluWSgpKTtcbiAgdHJhbnNmb3JtLnNldFdvcmxkT3JnWChzdGFydGluZ1BvaW50LngpO1xuICB0cmFuc2Zvcm0uc2V0V29ybGRPcmdZKHN0YXJ0aW5nUG9pbnQueSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSB0cmVlW2ldO1xuICAgIG5vZGUudHJhbnNmb3JtKHRyYW5zZm9ybSk7XG4gIH1cblxuICB2YXIgYm90dG9tUmlnaHQgPSBuZXcgUG9pbnREKGJvdW5kcy5nZXRNYXhYKCksIGJvdW5kcy5nZXRNYXhZKCkpO1xuXG4gIHJldHVybiB0cmFuc2Zvcm0uaW52ZXJzZVRyYW5zZm9ybVBvaW50KGJvdHRvbVJpZ2h0KTtcbn07XG5cbkNvU0VMYXlvdXQuYnJhbmNoUmFkaWFsTGF5b3V0ID0gZnVuY3Rpb24gKG5vZGUsIHBhcmVudE9mTm9kZSwgc3RhcnRBbmdsZSwgZW5kQW5nbGUsIGRpc3RhbmNlLCByYWRpYWxTZXBhcmF0aW9uKSB7XG4gIC8vIEZpcnN0LCBwb3NpdGlvbiB0aGlzIG5vZGUgYnkgZmluZGluZyBpdHMgYW5nbGUuXG4gIHZhciBoYWxmSW50ZXJ2YWwgPSAoZW5kQW5nbGUgLSBzdGFydEFuZ2xlICsgMSkgLyAyO1xuXG4gIGlmIChoYWxmSW50ZXJ2YWwgPCAwKSB7XG4gICAgaGFsZkludGVydmFsICs9IDE4MDtcbiAgfVxuXG4gIHZhciBub2RlQW5nbGUgPSAoaGFsZkludGVydmFsICsgc3RhcnRBbmdsZSkgJSAzNjA7XG4gIHZhciB0ZXRhID0gbm9kZUFuZ2xlICogSUdlb21ldHJ5LlRXT19QSSAvIDM2MDtcblxuICAvLyBNYWtlIHBvbGFyIHRvIGphdmEgY29yZGluYXRlIGNvbnZlcnNpb24uXG4gIHZhciBjb3NfdGV0YSA9IE1hdGguY29zKHRldGEpO1xuICB2YXIgeF8gPSBkaXN0YW5jZSAqIE1hdGguY29zKHRldGEpO1xuICB2YXIgeV8gPSBkaXN0YW5jZSAqIE1hdGguc2luKHRldGEpO1xuXG4gIG5vZGUuc2V0Q2VudGVyKHhfLCB5Xyk7XG5cbiAgLy8gVHJhdmVyc2UgYWxsIG5laWdoYm9ycyBvZiB0aGlzIG5vZGUgYW5kIHJlY3Vyc2l2ZWx5IGNhbGwgdGhpc1xuICAvLyBmdW5jdGlvbi5cbiAgdmFyIG5laWdoYm9yRWRnZXMgPSBbXTtcbiAgbmVpZ2hib3JFZGdlcyA9IG5laWdoYm9yRWRnZXMuY29uY2F0KG5vZGUuZ2V0RWRnZXMoKSk7XG4gIHZhciBjaGlsZENvdW50ID0gbmVpZ2hib3JFZGdlcy5sZW5ndGg7XG5cbiAgaWYgKHBhcmVudE9mTm9kZSAhPSBudWxsKSB7XG4gICAgY2hpbGRDb3VudC0tO1xuICB9XG5cbiAgdmFyIGJyYW5jaENvdW50ID0gMDtcblxuICB2YXIgaW5jRWRnZXNDb3VudCA9IG5laWdoYm9yRWRnZXMubGVuZ3RoO1xuICB2YXIgc3RhcnRJbmRleDtcblxuICB2YXIgZWRnZXMgPSBub2RlLmdldEVkZ2VzQmV0d2VlbihwYXJlbnRPZk5vZGUpO1xuXG4gIC8vIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBlZGdlcywgcHJ1bmUgdGhlbSB1bnRpbCB0aGVyZSByZW1haW5zIG9ubHkgb25lXG4gIC8vIGVkZ2UuXG4gIHdoaWxlIChlZGdlcy5sZW5ndGggPiAxKSB7XG4gICAgLy9uZWlnaGJvckVkZ2VzLnJlbW92ZShlZGdlcy5yZW1vdmUoMCkpO1xuICAgIHZhciB0ZW1wID0gZWRnZXNbMF07XG4gICAgZWRnZXMuc3BsaWNlKDAsIDEpO1xuICAgIHZhciBpbmRleCA9IG5laWdoYm9yRWRnZXMuaW5kZXhPZih0ZW1wKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgbmVpZ2hib3JFZGdlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICBpbmNFZGdlc0NvdW50LS07XG4gICAgY2hpbGRDb3VudC0tO1xuICB9XG5cbiAgaWYgKHBhcmVudE9mTm9kZSAhPSBudWxsKSB7XG4gICAgLy9hc3NlcnQgZWRnZXMubGVuZ3RoID09IDE7XG4gICAgc3RhcnRJbmRleCA9IChuZWlnaGJvckVkZ2VzLmluZGV4T2YoZWRnZXNbMF0pICsgMSkgJSBpbmNFZGdlc0NvdW50O1xuICB9IGVsc2Uge1xuICAgIHN0YXJ0SW5kZXggPSAwO1xuICB9XG5cbiAgdmFyIHN0ZXBBbmdsZSA9IE1hdGguYWJzKGVuZEFuZ2xlIC0gc3RhcnRBbmdsZSkgLyBjaGlsZENvdW50O1xuXG4gIGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBicmFuY2hDb3VudCAhPSBjaGlsZENvdW50OyBpID0gKytpICUgaW5jRWRnZXNDb3VudCkge1xuICAgIHZhciBjdXJyZW50TmVpZ2hib3IgPSBuZWlnaGJvckVkZ2VzW2ldLmdldE90aGVyRW5kKG5vZGUpO1xuXG4gICAgLy8gRG9uJ3QgYmFjayB0cmF2ZXJzZSB0byByb290IG5vZGUgaW4gY3VycmVudCB0cmVlLlxuICAgIGlmIChjdXJyZW50TmVpZ2hib3IgPT0gcGFyZW50T2ZOb2RlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGRTdGFydEFuZ2xlID0gKHN0YXJ0QW5nbGUgKyBicmFuY2hDb3VudCAqIHN0ZXBBbmdsZSkgJSAzNjA7XG4gICAgdmFyIGNoaWxkRW5kQW5nbGUgPSAoY2hpbGRTdGFydEFuZ2xlICsgc3RlcEFuZ2xlKSAlIDM2MDtcblxuICAgIENvU0VMYXlvdXQuYnJhbmNoUmFkaWFsTGF5b3V0KGN1cnJlbnROZWlnaGJvciwgbm9kZSwgY2hpbGRTdGFydEFuZ2xlLCBjaGlsZEVuZEFuZ2xlLCBkaXN0YW5jZSArIHJhZGlhbFNlcGFyYXRpb24sIHJhZGlhbFNlcGFyYXRpb24pO1xuXG4gICAgYnJhbmNoQ291bnQrKztcbiAgfVxufTtcblxuQ29TRUxheW91dC5tYXhEaWFnb25hbEluVHJlZSA9IGZ1bmN0aW9uICh0cmVlKSB7XG4gIHZhciBtYXhEaWFnb25hbCA9IEludGVnZXIuTUlOX1ZBTFVFO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHJlZS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gdHJlZVtpXTtcbiAgICB2YXIgZGlhZ29uYWwgPSBub2RlLmdldERpYWdvbmFsKCk7XG5cbiAgICBpZiAoZGlhZ29uYWwgPiBtYXhEaWFnb25hbCkge1xuICAgICAgbWF4RGlhZ29uYWwgPSBkaWFnb25hbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWF4RGlhZ29uYWw7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5jYWxjUmVwdWxzaW9uUmFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIGZvcm11bGEgaXMgMiB4IChsZXZlbCArIDEpIHggaWRlYWxFZGdlTGVuZ3RoXG4gIHJldHVybiAyICogKHRoaXMubGV2ZWwgKyAxKSAqIHRoaXMuaWRlYWxFZGdlTGVuZ3RoO1xufTtcblxuLy8gVGlsaW5nIG1ldGhvZHNcblxuLy8gR3JvdXAgemVybyBkZWdyZWUgbWVtYmVycyB3aG9zZSBwYXJlbnRzIGFyZSBub3QgdG8gYmUgdGlsZWQsIGNyZWF0ZSBkdW1teSBwYXJlbnRzIHdoZXJlIG5lZWRlZCBhbmQgZmlsbCBtZW1iZXJHcm91cHMgYnkgdGhlaXIgZHVtbXAgcGFyZW50IGlkJ3NcbkNvU0VMYXlvdXQucHJvdG90eXBlLmdyb3VwWmVyb0RlZ3JlZU1lbWJlcnMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgLy8gYXJyYXkgb2YgW3BhcmVudF9pZCB4IG9uZURlZ3JlZU5vZGVfaWRdXG4gIHZhciB0ZW1wTWVtYmVyR3JvdXBzID0ge307IC8vIEEgdGVtcG9yYXJ5IG1hcCBvZiBwYXJlbnQgbm9kZSBhbmQgaXRzIHplcm8gZGVncmVlIG1lbWJlcnNcbiAgdGhpcy5tZW1iZXJHcm91cHMgPSB7fTsgLy8gQSBtYXAgb2YgZHVtbXkgcGFyZW50IG5vZGUgYW5kIGl0cyB6ZXJvIGRlZ3JlZSBtZW1iZXJzIHdob3NlIHBhcmVudHMgYXJlIG5vdCB0byBiZSB0aWxlZFxuICB0aGlzLmlkVG9EdW1teU5vZGUgPSB7fTsgLy8gQSBtYXAgb2YgaWQgdG8gZHVtbXkgbm9kZSBcblxuICB2YXIgemVyb0RlZ3JlZSA9IFtdOyAvLyBMaXN0IG9mIHplcm8gZGVncmVlIG5vZGVzIHdob3NlIHBhcmVudHMgYXJlIG5vdCB0byBiZSB0aWxlZFxuICB2YXIgYWxsTm9kZXMgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxOb2RlcygpO1xuXG4gIC8vIEZpbGwgemVybyBkZWdyZWUgbGlzdFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBhbGxOb2Rlc1tpXTtcbiAgICB2YXIgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnQoKTtcbiAgICAvLyBJZiBhIG5vZGUgaGFzIHplcm8gZGVncmVlIGFuZCBpdHMgcGFyZW50IGlzIG5vdCB0byBiZSB0aWxlZCBpZiBleGlzdHMgYWRkIHRoYXQgbm9kZSB0byB6ZXJvRGVncmVzIGxpc3RcbiAgICBpZiAodGhpcy5nZXROb2RlRGVncmVlV2l0aENoaWxkcmVuKG5vZGUpID09PSAwICYmIChwYXJlbnQuaWQgPT0gdW5kZWZpbmVkIHx8ICF0aGlzLmdldFRvQmVUaWxlZChwYXJlbnQpKSkge1xuICAgICAgemVyb0RlZ3JlZS5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENyZWF0ZSBhIG1hcCBvZiBwYXJlbnQgbm9kZSBhbmQgaXRzIHplcm8gZGVncmVlIG1lbWJlcnNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB6ZXJvRGVncmVlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSB6ZXJvRGVncmVlW2ldOyAvLyBaZXJvIGRlZ3JlZSBub2RlIGl0c2VsZlxuICAgIHZhciBwX2lkID0gbm9kZS5nZXRQYXJlbnQoKS5pZDsgLy8gUGFyZW50IGlkXG5cbiAgICBpZiAodHlwZW9mIHRlbXBNZW1iZXJHcm91cHNbcF9pZF0gPT09IFwidW5kZWZpbmVkXCIpIHRlbXBNZW1iZXJHcm91cHNbcF9pZF0gPSBbXTtcblxuICAgIHRlbXBNZW1iZXJHcm91cHNbcF9pZF0gPSB0ZW1wTWVtYmVyR3JvdXBzW3BfaWRdLmNvbmNhdChub2RlKTsgLy8gUHVzaCBub2RlIHRvIHRoZSBsaXN0IGJlbG9uZ3MgdG8gaXRzIHBhcmVudCBpbiB0ZW1wTWVtYmVyR3JvdXBzXG4gIH1cblxuICAvLyBJZiB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIG5vZGVzIGF0IGEgbGV2ZWwsIGNyZWF0ZSBhIGR1bW15IGNvbXBvdW5kIGZvciB0aGVtXG4gIE9iamVjdC5rZXlzKHRlbXBNZW1iZXJHcm91cHMpLmZvckVhY2goZnVuY3Rpb24gKHBfaWQpIHtcbiAgICBpZiAodGVtcE1lbWJlckdyb3Vwc1twX2lkXS5sZW5ndGggPiAxKSB7XG4gICAgICB2YXIgZHVtbXlDb21wb3VuZElkID0gXCJEdW1teUNvbXBvdW5kX1wiICsgcF9pZDsgLy8gVGhlIGlkIG9mIGR1bW15IGNvbXBvdW5kIHdoaWNoIHdpbGwgYmUgY3JlYXRlZCBzb29uXG4gICAgICBzZWxmLm1lbWJlckdyb3Vwc1tkdW1teUNvbXBvdW5kSWRdID0gdGVtcE1lbWJlckdyb3Vwc1twX2lkXTsgLy8gQWRkIGR1bW15IGNvbXBvdW5kIHRvIG1lbWJlckdyb3Vwc1xuXG4gICAgICB2YXIgcGFyZW50ID0gdGVtcE1lbWJlckdyb3Vwc1twX2lkXVswXS5nZXRQYXJlbnQoKTsgLy8gVGhlIHBhcmVudCBvZiB6ZXJvIGRlZ3JlZSBub2RlcyB3aWxsIGJlIHRoZSBwYXJlbnQgb2YgbmV3IGR1bW15IGNvbXBvdW5kXG5cbiAgICAgIC8vIENyZWF0ZSBhIGR1bW15IGNvbXBvdW5kIHdpdGggY2FsY3VsYXRlZCBpZFxuICAgICAgdmFyIGR1bW15Q29tcG91bmQgPSBuZXcgQ29TRU5vZGUoc2VsZi5ncmFwaE1hbmFnZXIpO1xuICAgICAgZHVtbXlDb21wb3VuZC5pZCA9IGR1bW15Q29tcG91bmRJZDtcbiAgICAgIGR1bW15Q29tcG91bmQucGFkZGluZ0xlZnQgPSBwYXJlbnQucGFkZGluZ0xlZnQgfHwgMDtcbiAgICAgIGR1bW15Q29tcG91bmQucGFkZGluZ1JpZ2h0ID0gcGFyZW50LnBhZGRpbmdSaWdodCB8fCAwO1xuICAgICAgZHVtbXlDb21wb3VuZC5wYWRkaW5nQm90dG9tID0gcGFyZW50LnBhZGRpbmdCb3R0b20gfHwgMDtcbiAgICAgIGR1bW15Q29tcG91bmQucGFkZGluZ1RvcCA9IHBhcmVudC5wYWRkaW5nVG9wIHx8IDA7XG5cbiAgICAgIHNlbGYuaWRUb0R1bW15Tm9kZVtkdW1teUNvbXBvdW5kSWRdID0gZHVtbXlDb21wb3VuZDtcblxuICAgICAgdmFyIGR1bW15UGFyZW50R3JhcGggPSBzZWxmLmdldEdyYXBoTWFuYWdlcigpLmFkZChzZWxmLm5ld0dyYXBoKCksIGR1bW15Q29tcG91bmQpO1xuICAgICAgdmFyIHBhcmVudEdyYXBoID0gcGFyZW50LmdldENoaWxkKCk7XG5cbiAgICAgIC8vIEFkZCBkdW1teSBjb21wb3VuZCB0byBwYXJlbnQgdGhlIGdyYXBoXG4gICAgICBwYXJlbnRHcmFwaC5hZGQoZHVtbXlDb21wb3VuZCk7XG5cbiAgICAgIC8vIEZvciBlYWNoIHplcm8gZGVncmVlIG5vZGUgaW4gdGhpcyBsZXZlbCByZW1vdmUgaXQgZnJvbSBpdHMgcGFyZW50IGdyYXBoIGFuZCBhZGQgaXQgdG8gdGhlIGdyYXBoIG9mIGR1bW15IHBhcmVudFxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZW1wTWVtYmVyR3JvdXBzW3BfaWRdLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlID0gdGVtcE1lbWJlckdyb3Vwc1twX2lkXVtpXTtcblxuICAgICAgICBwYXJlbnRHcmFwaC5yZW1vdmUobm9kZSk7XG4gICAgICAgIGR1bW15UGFyZW50R3JhcGguYWRkKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5jbGVhckNvbXBvdW5kcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNoaWxkR3JhcGhNYXAgPSB7fTtcbiAgdmFyIGlkVG9Ob2RlID0ge307XG5cbiAgLy8gR2V0IGNvbXBvdW5kIG9yZGVyaW5nIGJ5IGZpbmRpbmcgdGhlIGlubmVyIG9uZSBmaXJzdFxuICB0aGlzLnBlcmZvcm1ERlNPbkNvbXBvdW5kcygpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb21wb3VuZE9yZGVyLmxlbmd0aDsgaSsrKSB7XG5cbiAgICBpZFRvTm9kZVt0aGlzLmNvbXBvdW5kT3JkZXJbaV0uaWRdID0gdGhpcy5jb21wb3VuZE9yZGVyW2ldO1xuICAgIGNoaWxkR3JhcGhNYXBbdGhpcy5jb21wb3VuZE9yZGVyW2ldLmlkXSA9IFtdLmNvbmNhdCh0aGlzLmNvbXBvdW5kT3JkZXJbaV0uZ2V0Q2hpbGQoKS5nZXROb2RlcygpKTtcblxuICAgIC8vIFJlbW92ZSBjaGlsZHJlbiBvZiBjb21wb3VuZHNcbiAgICB0aGlzLmdyYXBoTWFuYWdlci5yZW1vdmUodGhpcy5jb21wb3VuZE9yZGVyW2ldLmdldENoaWxkKCkpO1xuICAgIHRoaXMuY29tcG91bmRPcmRlcltpXS5jaGlsZCA9IG51bGw7XG4gIH1cblxuICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbE5vZGVzKCk7XG5cbiAgLy8gVGlsZSB0aGUgcmVtb3ZlZCBjaGlsZHJlblxuICB0aGlzLnRpbGVDb21wb3VuZE1lbWJlcnMoY2hpbGRHcmFwaE1hcCwgaWRUb05vZGUpO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuY2xlYXJaZXJvRGVncmVlTWVtYmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgdGlsZWRaZXJvRGVncmVlUGFjayA9IHRoaXMudGlsZWRaZXJvRGVncmVlUGFjayA9IFtdO1xuXG4gIE9iamVjdC5rZXlzKHRoaXMubWVtYmVyR3JvdXBzKS5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBjb21wb3VuZE5vZGUgPSBzZWxmLmlkVG9EdW1teU5vZGVbaWRdOyAvLyBHZXQgdGhlIGR1bW15IGNvbXBvdW5kXG5cbiAgICB0aWxlZFplcm9EZWdyZWVQYWNrW2lkXSA9IHNlbGYudGlsZU5vZGVzKHNlbGYubWVtYmVyR3JvdXBzW2lkXSwgY29tcG91bmROb2RlLnBhZGRpbmdMZWZ0ICsgY29tcG91bmROb2RlLnBhZGRpbmdSaWdodCk7XG5cbiAgICAvLyBTZXQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGR1bW15IGNvbXBvdW5kIGFzIGNhbGN1bGF0ZWRcbiAgICBjb21wb3VuZE5vZGUucmVjdC53aWR0aCA9IHRpbGVkWmVyb0RlZ3JlZVBhY2tbaWRdLndpZHRoO1xuICAgIGNvbXBvdW5kTm9kZS5yZWN0LmhlaWdodCA9IHRpbGVkWmVyb0RlZ3JlZVBhY2tbaWRdLmhlaWdodDtcbiAgICBjb21wb3VuZE5vZGUuc2V0Q2VudGVyKHRpbGVkWmVyb0RlZ3JlZVBhY2tbaWRdLmNlbnRlclgsIHRpbGVkWmVyb0RlZ3JlZVBhY2tbaWRdLmNlbnRlclkpO1xuXG4gICAgLy8gY29tcG91bmQgbGVmdCBhbmQgdG9wIG1hcmdpbmdzIGZvciBsYWJlbHNcbiAgICAvLyB3aGVuIG5vZGUgbGFiZWxzIGFyZSBpbmNsdWRlZCwgdGhlc2UgdmFsdWVzIG1heSBiZSBzZXQgdG8gZGlmZmVyZW50IHZhbHVlcyBiZWxvdyBhbmQgYXJlIHVzZWQgaW4gdGlsaW5nUG9zdExheW91dCxcbiAgICAvLyBvdGhlcndpc2UgdGhleSBzdGF5IGFzIHplcm9cbiAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5MZWZ0ID0gMDtcbiAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5Ub3AgPSAwO1xuXG4gICAgLy8gVXBkYXRlIGNvbXBvdW5kIGJvdW5kcyBjb25zaWRlcmluZyBpdHMgbGFiZWwgcHJvcGVydGllcyBhbmQgc2V0IGxhYmVsIG1hcmdpbnMgZm9yIGxlZnQgYW5kIHRvcFxuICAgIGlmIChDb1NFQ29uc3RhbnRzLk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUykge1xuXG4gICAgICB2YXIgd2lkdGggPSBjb21wb3VuZE5vZGUucmVjdC53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSBjb21wb3VuZE5vZGUucmVjdC5oZWlnaHQ7XG5cbiAgICAgIGlmIChjb21wb3VuZE5vZGUubGFiZWxXaWR0aCkge1xuICAgICAgICBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcImxlZnRcIikge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5yZWN0LnggLT0gY29tcG91bmROb2RlLmxhYmVsV2lkdGg7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldFdpZHRoKHdpZHRoICsgY29tcG91bmROb2RlLmxhYmVsV2lkdGgpO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpbkxlZnQgPSBjb21wb3VuZE5vZGUubGFiZWxXaWR0aDtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NIb3Jpem9udGFsID09IFwiY2VudGVyXCIgJiYgY29tcG91bmROb2RlLmxhYmVsV2lkdGggPiB3aWR0aCkge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5yZWN0LnggLT0gKGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoIC0gd2lkdGgpIC8gMjtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0V2lkdGgoY29tcG91bmROb2RlLmxhYmVsV2lkdGgpO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpbkxlZnQgPSAoY29tcG91bmROb2RlLmxhYmVsV2lkdGggLSB3aWR0aCkgLyAyO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc0hvcml6b250YWwgPT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldFdpZHRoKHdpZHRoICsgY29tcG91bmROb2RlLmxhYmVsV2lkdGgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQpIHtcbiAgICAgICAgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc1ZlcnRpY2FsID09IFwidG9wXCIpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUucmVjdC55IC09IGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodDtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0SGVpZ2h0KGhlaWdodCArIGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCk7XG4gICAgICAgICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luVG9wID0gY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0O1xuICAgICAgICB9IGVsc2UgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc1ZlcnRpY2FsID09IFwiY2VudGVyXCIgJiYgY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0ID4gaGVpZ2h0KSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnJlY3QueSAtPSAoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0IC0gaGVpZ2h0KSAvIDI7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldEhlaWdodChjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQpO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpblRvcCA9IChjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQgLSBoZWlnaHQpIC8gMjtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NWZXJ0aWNhbCA9PSBcImJvdHRvbVwiKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldEhlaWdodChoZWlnaHQgKyBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnJlcG9wdWxhdGVDb21wb3VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIGZvciAodmFyIGkgPSB0aGlzLmNvbXBvdW5kT3JkZXIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgbENvbXBvdW5kTm9kZSA9IHRoaXMuY29tcG91bmRPcmRlcltpXTtcbiAgICB2YXIgaWQgPSBsQ29tcG91bmROb2RlLmlkO1xuICAgIHZhciBob3Jpem9udGFsTWFyZ2luID0gbENvbXBvdW5kTm9kZS5wYWRkaW5nTGVmdDtcbiAgICB2YXIgdmVydGljYWxNYXJnaW4gPSBsQ29tcG91bmROb2RlLnBhZGRpbmdUb3A7XG4gICAgdmFyIGxhYmVsTWFyZ2luTGVmdCA9IGxDb21wb3VuZE5vZGUubGFiZWxNYXJnaW5MZWZ0O1xuICAgIHZhciBsYWJlbE1hcmdpblRvcCA9IGxDb21wb3VuZE5vZGUubGFiZWxNYXJnaW5Ub3A7XG5cbiAgICB0aGlzLmFkanVzdExvY2F0aW9ucyh0aGlzLnRpbGVkTWVtYmVyUGFja1tpZF0sIGxDb21wb3VuZE5vZGUucmVjdC54LCBsQ29tcG91bmROb2RlLnJlY3QueSwgaG9yaXpvbnRhbE1hcmdpbiwgdmVydGljYWxNYXJnaW4sIGxhYmVsTWFyZ2luTGVmdCwgbGFiZWxNYXJnaW5Ub3ApO1xuICB9XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5yZXBvcHVsYXRlWmVyb0RlZ3JlZU1lbWJlcnMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHRpbGVkUGFjayA9IHRoaXMudGlsZWRaZXJvRGVncmVlUGFjaztcblxuICBPYmplY3Qua2V5cyh0aWxlZFBhY2spLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGNvbXBvdW5kTm9kZSA9IHNlbGYuaWRUb0R1bW15Tm9kZVtpZF07IC8vIEdldCB0aGUgZHVtbXkgY29tcG91bmQgYnkgaXRzIGlkXG4gICAgdmFyIGhvcml6b250YWxNYXJnaW4gPSBjb21wb3VuZE5vZGUucGFkZGluZ0xlZnQ7XG4gICAgdmFyIHZlcnRpY2FsTWFyZ2luID0gY29tcG91bmROb2RlLnBhZGRpbmdUb3A7XG4gICAgdmFyIGxhYmVsTWFyZ2luTGVmdCA9IGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpbkxlZnQ7XG4gICAgdmFyIGxhYmVsTWFyZ2luVG9wID0gY29tcG91bmROb2RlLmxhYmVsTWFyZ2luVG9wO1xuXG4gICAgLy8gQWRqdXN0IHRoZSBwb3NpdGlvbnMgb2Ygbm9kZXMgd3J0IGl0cyBjb21wb3VuZFxuICAgIHNlbGYuYWRqdXN0TG9jYXRpb25zKHRpbGVkUGFja1tpZF0sIGNvbXBvdW5kTm9kZS5yZWN0LngsIGNvbXBvdW5kTm9kZS5yZWN0LnksIGhvcml6b250YWxNYXJnaW4sIHZlcnRpY2FsTWFyZ2luLCBsYWJlbE1hcmdpbkxlZnQsIGxhYmVsTWFyZ2luVG9wKTtcbiAgfSk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5nZXRUb0JlVGlsZWQgPSBmdW5jdGlvbiAobm9kZSkge1xuICB2YXIgaWQgPSBub2RlLmlkO1xuICAvL2ZpcnN0bHkgY2hlY2sgdGhlIHByZXZpb3VzIHJlc3VsdHNcbiAgaWYgKHRoaXMudG9CZVRpbGVkW2lkXSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMudG9CZVRpbGVkW2lkXTtcbiAgfVxuXG4gIC8vb25seSBjb21wb3VuZCBub2RlcyBhcmUgdG8gYmUgdGlsZWRcbiAgdmFyIGNoaWxkR3JhcGggPSBub2RlLmdldENoaWxkKCk7XG4gIGlmIChjaGlsZEdyYXBoID09IG51bGwpIHtcbiAgICB0aGlzLnRvQmVUaWxlZFtpZF0gPSBmYWxzZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgY2hpbGRyZW4gPSBjaGlsZEdyYXBoLmdldE5vZGVzKCk7IC8vIEdldCB0aGUgY2hpbGRyZW4gbm9kZXNcblxuICAvL2EgY29tcG91bmQgbm9kZSBpcyBub3QgdG8gYmUgdGlsZWQgaWYgYWxsIG9mIGl0cyBjb21wb3VuZCBjaGlsZHJlbiBhcmUgbm90IHRvIGJlIHRpbGVkXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdGhlQ2hpbGQgPSBjaGlsZHJlbltpXTtcblxuICAgIGlmICh0aGlzLmdldE5vZGVEZWdyZWUodGhlQ2hpbGQpID4gMCkge1xuICAgICAgdGhpcy50b0JlVGlsZWRbaWRdID0gZmFsc2U7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy9wYXNzIHRoZSBjaGlsZHJlbiBub3QgaGF2aW5nIHRoZSBjb21wb3VuZCBzdHJ1Y3R1cmVcbiAgICBpZiAodGhlQ2hpbGQuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgICB0aGlzLnRvQmVUaWxlZFt0aGVDaGlsZC5pZF0gPSBmYWxzZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5nZXRUb0JlVGlsZWQodGhlQ2hpbGQpKSB7XG4gICAgICB0aGlzLnRvQmVUaWxlZFtpZF0gPSBmYWxzZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgdGhpcy50b0JlVGlsZWRbaWRdID0gdHJ1ZTtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vLyBHZXQgZGVncmVlIG9mIGEgbm9kZSBkZXBlbmRpbmcgb2YgaXRzIGVkZ2VzIGFuZCBpbmRlcGVuZGVudCBvZiBpdHMgY2hpbGRyZW5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmdldE5vZGVEZWdyZWUgPSBmdW5jdGlvbiAobm9kZSkge1xuICB2YXIgaWQgPSBub2RlLmlkO1xuICB2YXIgZWRnZXMgPSBub2RlLmdldEVkZ2VzKCk7XG4gIHZhciBkZWdyZWUgPSAwO1xuXG4gIC8vIEZvciB0aGUgZWRnZXMgY29ubmVjdGVkXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWRnZSA9IGVkZ2VzW2ldO1xuICAgIGlmIChlZGdlLmdldFNvdXJjZSgpLmlkICE9PSBlZGdlLmdldFRhcmdldCgpLmlkKSB7XG4gICAgICBkZWdyZWUgPSBkZWdyZWUgKyAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVncmVlO1xufTtcblxuLy8gR2V0IGRlZ3JlZSBvZiBhIG5vZGUgd2l0aCBpdHMgY2hpbGRyZW5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmdldE5vZGVEZWdyZWVXaXRoQ2hpbGRyZW4gPSBmdW5jdGlvbiAobm9kZSkge1xuICB2YXIgZGVncmVlID0gdGhpcy5nZXROb2RlRGVncmVlKG5vZGUpO1xuICBpZiAobm9kZS5nZXRDaGlsZCgpID09IG51bGwpIHtcbiAgICByZXR1cm4gZGVncmVlO1xuICB9XG4gIHZhciBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGQoKS5nZXROb2RlcygpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgZGVncmVlICs9IHRoaXMuZ2V0Tm9kZURlZ3JlZVdpdGhDaGlsZHJlbihjaGlsZCk7XG4gIH1cbiAgcmV0dXJuIGRlZ3JlZTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnBlcmZvcm1ERlNPbkNvbXBvdW5kcyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5jb21wb3VuZE9yZGVyID0gW107XG4gIHRoaXMuZmlsbENvbXBleE9yZGVyQnlERlModGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldE5vZGVzKCkpO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuZmlsbENvbXBleE9yZGVyQnlERlMgPSBmdW5jdGlvbiAoY2hpbGRyZW4pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgIGlmIChjaGlsZC5nZXRDaGlsZCgpICE9IG51bGwpIHtcbiAgICAgIHRoaXMuZmlsbENvbXBleE9yZGVyQnlERlMoY2hpbGQuZ2V0Q2hpbGQoKS5nZXROb2RlcygpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ2V0VG9CZVRpbGVkKGNoaWxkKSkge1xuICAgICAgdGhpcy5jb21wb3VuZE9yZGVyLnB1c2goY2hpbGQpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4qIFRoaXMgbWV0aG9kIHBsYWNlcyBlYWNoIHplcm8gZGVncmVlIG1lbWJlciB3cnQgZ2l2ZW4gKHgseSkgY29vcmRpbmF0ZXMgKHRvcCBsZWZ0KS5cbiovXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5hZGp1c3RMb2NhdGlvbnMgPSBmdW5jdGlvbiAob3JnYW5pemF0aW9uLCB4LCB5LCBjb21wb3VuZEhvcml6b250YWxNYXJnaW4sIGNvbXBvdW5kVmVydGljYWxNYXJnaW4sIGNvbXBvdW5kTGFiZWxNYXJnaW5MZWZ0LCBjb21wb3VuZExhYmVsTWFyZ2luVG9wKSB7XG4gIHggKz0gY29tcG91bmRIb3Jpem9udGFsTWFyZ2luICsgY29tcG91bmRMYWJlbE1hcmdpbkxlZnQ7XG4gIHkgKz0gY29tcG91bmRWZXJ0aWNhbE1hcmdpbiArIGNvbXBvdW5kTGFiZWxNYXJnaW5Ub3A7XG5cbiAgdmFyIGxlZnQgPSB4O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgb3JnYW5pemF0aW9uLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcm93ID0gb3JnYW5pemF0aW9uLnJvd3NbaV07XG4gICAgeCA9IGxlZnQ7XG4gICAgdmFyIG1heEhlaWdodCA9IDA7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJvdy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIGxub2RlID0gcm93W2pdO1xuXG4gICAgICBsbm9kZS5yZWN0LnggPSB4OyAvLyArIGxub2RlLnJlY3Qud2lkdGggLyAyO1xuICAgICAgbG5vZGUucmVjdC55ID0geTsgLy8gKyBsbm9kZS5yZWN0LmhlaWdodCAvIDI7XG5cbiAgICAgIHggKz0gbG5vZGUucmVjdC53aWR0aCArIG9yZ2FuaXphdGlvbi5ob3Jpem9udGFsUGFkZGluZztcblxuICAgICAgaWYgKGxub2RlLnJlY3QuaGVpZ2h0ID4gbWF4SGVpZ2h0KSBtYXhIZWlnaHQgPSBsbm9kZS5yZWN0LmhlaWdodDtcbiAgICB9XG5cbiAgICB5ICs9IG1heEhlaWdodCArIG9yZ2FuaXphdGlvbi52ZXJ0aWNhbFBhZGRpbmc7XG4gIH1cbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnRpbGVDb21wb3VuZE1lbWJlcnMgPSBmdW5jdGlvbiAoY2hpbGRHcmFwaE1hcCwgaWRUb05vZGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLnRpbGVkTWVtYmVyUGFjayA9IFtdO1xuXG4gIE9iamVjdC5rZXlzKGNoaWxkR3JhcGhNYXApLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgLy8gR2V0IHRoZSBjb21wb3VuZCBub2RlXG4gICAgdmFyIGNvbXBvdW5kTm9kZSA9IGlkVG9Ob2RlW2lkXTtcblxuICAgIHNlbGYudGlsZWRNZW1iZXJQYWNrW2lkXSA9IHNlbGYudGlsZU5vZGVzKGNoaWxkR3JhcGhNYXBbaWRdLCBjb21wb3VuZE5vZGUucGFkZGluZ0xlZnQgKyBjb21wb3VuZE5vZGUucGFkZGluZ1JpZ2h0KTtcblxuICAgIGNvbXBvdW5kTm9kZS5yZWN0LndpZHRoID0gc2VsZi50aWxlZE1lbWJlclBhY2tbaWRdLndpZHRoO1xuICAgIGNvbXBvdW5kTm9kZS5yZWN0LmhlaWdodCA9IHNlbGYudGlsZWRNZW1iZXJQYWNrW2lkXS5oZWlnaHQ7XG4gICAgY29tcG91bmROb2RlLnNldENlbnRlcihzZWxmLnRpbGVkTWVtYmVyUGFja1tpZF0uY2VudGVyWCwgc2VsZi50aWxlZE1lbWJlclBhY2tbaWRdLmNlbnRlclkpO1xuXG4gICAgLy8gY29tcG91bmQgbGVmdCBhbmQgdG9wIG1hcmdpbmdzIGZvciBsYWJlbHNcbiAgICAvLyB3aGVuIG5vZGUgbGFiZWxzIGFyZSBpbmNsdWRlZCwgdGhlc2UgdmFsdWVzIG1heSBiZSBzZXQgdG8gZGlmZmVyZW50IHZhbHVlcyBiZWxvdyBhbmQgYXJlIHVzZWQgaW4gdGlsaW5nUG9zdExheW91dCxcbiAgICAvLyBvdGhlcndpc2UgdGhleSBzdGF5IGFzIHplcm9cbiAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5MZWZ0ID0gMDtcbiAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5Ub3AgPSAwO1xuXG4gICAgLy8gVXBkYXRlIGNvbXBvdW5kIGJvdW5kcyBjb25zaWRlcmluZyBpdHMgbGFiZWwgcHJvcGVydGllcyBhbmQgc2V0IGxhYmVsIG1hcmdpbnMgZm9yIGxlZnQgYW5kIHRvcFxuICAgIGlmIChDb1NFQ29uc3RhbnRzLk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUykge1xuXG4gICAgICB2YXIgd2lkdGggPSBjb21wb3VuZE5vZGUucmVjdC53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSBjb21wb3VuZE5vZGUucmVjdC5oZWlnaHQ7XG5cbiAgICAgIGlmIChjb21wb3VuZE5vZGUubGFiZWxXaWR0aCkge1xuICAgICAgICBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcImxlZnRcIikge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5yZWN0LnggLT0gY29tcG91bmROb2RlLmxhYmVsV2lkdGg7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldFdpZHRoKHdpZHRoICsgY29tcG91bmROb2RlLmxhYmVsV2lkdGgpO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpbkxlZnQgPSBjb21wb3VuZE5vZGUubGFiZWxXaWR0aDtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NIb3Jpem9udGFsID09IFwiY2VudGVyXCIgJiYgY29tcG91bmROb2RlLmxhYmVsV2lkdGggPiB3aWR0aCkge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5yZWN0LnggLT0gKGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoIC0gd2lkdGgpIC8gMjtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0V2lkdGgoY29tcG91bmROb2RlLmxhYmVsV2lkdGgpO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpbkxlZnQgPSAoY29tcG91bmROb2RlLmxhYmVsV2lkdGggLSB3aWR0aCkgLyAyO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc0hvcml6b250YWwgPT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldFdpZHRoKHdpZHRoICsgY29tcG91bmROb2RlLmxhYmVsV2lkdGgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQpIHtcbiAgICAgICAgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc1ZlcnRpY2FsID09IFwidG9wXCIpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUucmVjdC55IC09IGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodDtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0SGVpZ2h0KGhlaWdodCArIGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCk7XG4gICAgICAgICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luVG9wID0gY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0O1xuICAgICAgICB9IGVsc2UgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc1ZlcnRpY2FsID09IFwiY2VudGVyXCIgJiYgY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0ID4gaGVpZ2h0KSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnJlY3QueSAtPSAoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0IC0gaGVpZ2h0KSAvIDI7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldEhlaWdodChjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQpO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpblRvcCA9IChjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQgLSBoZWlnaHQpIC8gMjtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NWZXJ0aWNhbCA9PSBcImJvdHRvbVwiKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldEhlaWdodChoZWlnaHQgKyBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnRpbGVOb2RlcyA9IGZ1bmN0aW9uIChub2RlcywgbWluV2lkdGgpIHtcbiAgdmFyIGhvcml6b250YWxPcmcgPSB0aGlzLnRpbGVOb2Rlc0J5RmF2b3JpbmdEaW0obm9kZXMsIG1pbldpZHRoLCB0cnVlKTtcbiAgdmFyIHZlcnRpY2FsT3JnID0gdGhpcy50aWxlTm9kZXNCeUZhdm9yaW5nRGltKG5vZGVzLCBtaW5XaWR0aCwgZmFsc2UpO1xuXG4gIHZhciBob3Jpem9udGFsUmF0aW8gPSB0aGlzLmdldE9yZ1JhdGlvKGhvcml6b250YWxPcmcpO1xuICB2YXIgdmVydGljYWxSYXRpbyA9IHRoaXMuZ2V0T3JnUmF0aW8odmVydGljYWxPcmcpO1xuICB2YXIgYmVzdE9yZztcblxuICAvLyB0aGUgYmVzdCByYXRpbyBpcyB0aGUgb25lIHRoYXQgaXMgY2xvc2VyIHRvIDEgc2luY2UgdGhlIHJhdGlvcyBhcmUgYWxyZWFkeSBub3JtYWxpemVkXG4gIC8vIGFuZCB0aGUgYmVzdCBvcmdhbml6YXRpb24gaXMgdGhlIG9uZSB0aGF0IGhhcyB0aGUgYmVzdCByYXRpb1xuICBpZiAodmVydGljYWxSYXRpbyA8IGhvcml6b250YWxSYXRpbykge1xuICAgIGJlc3RPcmcgPSB2ZXJ0aWNhbE9yZztcbiAgfSBlbHNlIHtcbiAgICBiZXN0T3JnID0gaG9yaXpvbnRhbE9yZztcbiAgfVxuXG4gIHJldHVybiBiZXN0T3JnO1xufTtcblxuLy8gZ2V0IHRoZSB3aWR0aC9oZWlnaHQgcmF0aW8gb2YgdGhlIG9yZ2FuaXphdGlvbiB0aGF0IGlzIG5vcm1hbGl6ZWQgc28gdGhhdCBpdCB3aWxsIG5vdCBiZSBsZXNzIHRoYW4gMVxuQ29TRUxheW91dC5wcm90b3R5cGUuZ2V0T3JnUmF0aW8gPSBmdW5jdGlvbiAob3JnYW5pemF0aW9uKSB7XG4gIC8vIGdldCBkaW1lbnNpb25zIGFuZCBjYWxjdWxhdGUgdGhlIGluaXRpYWwgcmF0aW9cbiAgdmFyIHdpZHRoID0gb3JnYW5pemF0aW9uLndpZHRoO1xuICB2YXIgaGVpZ2h0ID0gb3JnYW5pemF0aW9uLmhlaWdodDtcbiAgdmFyIHJhdGlvID0gd2lkdGggLyBoZWlnaHQ7XG5cbiAgLy8gaWYgdGhlIGluaXRpYWwgcmF0aW8gaXMgbGVzcyB0aGVuIDEgdGhlbiBpbnZlcnNlIGl0XG4gIGlmIChyYXRpbyA8IDEpIHtcbiAgICByYXRpbyA9IDEgLyByYXRpbztcbiAgfVxuXG4gIC8vIHJldHVybiB0aGUgbm9ybWFsaXplZCByYXRpb1xuICByZXR1cm4gcmF0aW87XG59O1xuXG4vKlxuICogQ2FsY3VsYXRlcyB0aGUgaWRlYWwgd2lkdGggZm9yIHRoZSByb3dzLiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXRcbiAqIGVhY2ggbm9kZSBoYXMgdGhlIHNhbWUgc2l6ZXMgYW5kIGNhbGN1bGF0ZXMgdGhlIGlkZWFsIHJvdyB3aWR0aCB0aGF0XG4gKiBhcHByb3hpbWF0ZXMgYSBzcXVhcmUgc2hhcGVkIGNvbXBsZXggYWNjb3JkaW5nbHkuIEhvd2V2ZXIsIHNpbmNlIG5vZGVzIHdvdWxkXG4gKiBoYXZlIGRpZmZlcmVudCBzaXplcyBzb21lIHJvd3Mgd291bGQgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMgYW5kIHRoZSByZXN1bHRpbmdcbiAqIHNoYXBlIHdvdWxkIG5vdCBiZSBhbiBleGFjdCBzcXVhcmUuXG4gKi9cbkNvU0VMYXlvdXQucHJvdG90eXBlLmNhbGNJZGVhbFJvd1dpZHRoID0gZnVuY3Rpb24gKG1lbWJlcnMsIGZhdm9ySG9yaXpvbnRhbERpbSkge1xuICAvLyBUbyBhcHByb3hpbWF0ZSBhIHNxdWFyZSBzaGFwZWQgY29tcGxleCB3ZSBuZWVkIHRvIG1ha2UgY29tcGxleCB3aWR0aCBlcXVhbCB0byBjb21wbGV4IGhlaWdodC5cbiAgLy8gVG8gYWNoaWV2ZSB0aGlzIHdlIG5lZWQgdG8gc29sdmUgdGhlIGZvbGxvd2luZyBlcXVhdGlvbiBzeXN0ZW0gZm9yIGhjOlxuICAvLyAoeCArIGJ4KSAqIGhjIC0gYnggPSAoeSArIGJ5KSAqIHZjIC0gYnksIGhjICogdmMgPSBuXG4gIC8vIHdoZXJlIHggaXMgdGhlIGF2YXJhZ2Ugd2lkdGggb2YgdGhlIG5vZGVzLCB5IGlzIHRoZSBhdmFyYWdlIGhlaWdodCBvZiBub2Rlc1xuICAvLyBieCBhbmQgYnkgYXJlIHRoZSBidWZmZXIgc2l6ZXMgaW4gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZGltZW5zaW9ucyBhY2NvcmRpbmdseSxcbiAgLy8gaGMgYW5kIHZjIGFyZSB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZGltZW5zaW9uc1xuICAvLyBuIGlzIG51bWJlciBvZiBtZW1iZXJzLlxuXG4gIHZhciB2ZXJ0aWNhbFBhZGRpbmcgPSBDb1NFQ29uc3RhbnRzLlRJTElOR19QQURESU5HX1ZFUlRJQ0FMO1xuICB2YXIgaG9yaXpvbnRhbFBhZGRpbmcgPSBDb1NFQ29uc3RhbnRzLlRJTElOR19QQURESU5HX0hPUklaT05UQUw7XG5cbiAgLy8gbnVtYmVyIG9mIG1lbWJlcnNcbiAgdmFyIG1lbWJlcnNTaXplID0gbWVtYmVycy5sZW5ndGg7XG5cbiAgLy8gc3VtIG9mIHRoZSB3aWR0aCBvZiBhbGwgbWVtYmVyc1xuICB2YXIgdG90YWxXaWR0aCA9IDA7XG5cbiAgLy8gc3VtIG9mIHRoZSBoZWlnaHQgb2YgYWxsIG1lbWJlcnNcbiAgdmFyIHRvdGFsSGVpZ2h0ID0gMDtcblxuICB2YXIgbWF4V2lkdGggPSAwO1xuXG4gIC8vIHRyYXZlcnNlIGFsbCBtZW1iZXJzIHRvIGNhbGN1bGF0ZSB0b3RhbCB3aWR0aCBhbmQgdG90YWwgaGVpZ2h0IGFuZCBnZXQgdGhlIG1heGltdW0gbWVtYmVycyB3aWR0aFxuICBtZW1iZXJzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB0b3RhbFdpZHRoICs9IG5vZGUuZ2V0V2lkdGgoKTtcbiAgICB0b3RhbEhlaWdodCArPSBub2RlLmdldEhlaWdodCgpO1xuXG4gICAgaWYgKG5vZGUuZ2V0V2lkdGgoKSA+IG1heFdpZHRoKSB7XG4gICAgICBtYXhXaWR0aCA9IG5vZGUuZ2V0V2lkdGgoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIGF2ZXJhZ2Ugd2lkdGggb2YgdGhlIG1lbWJlcnNcbiAgdmFyIGF2ZXJhZ2VXaWR0aCA9IHRvdGFsV2lkdGggLyBtZW1iZXJzU2l6ZTtcblxuICAvLyBhdmVyYWdlIGhlaWdodCBvZiB0aGUgbWVtYmVyc1xuICB2YXIgYXZlcmFnZUhlaWdodCA9IHRvdGFsSGVpZ2h0IC8gbWVtYmVyc1NpemU7XG5cbiAgLy8gc29sdmluZyB0aGUgaW5pdGlhbCBlcXVhdGlvbiBzeXN0ZW0gZm9yIHRoZSBoYyB5aWVsZHMgdGhlIGZvbGxvd2luZyBzZWNvbmQgZGVncmVlIGVxdWF0aW9uOlxuICAvLyBoY14yICogKHgrYngpICsgaGMgKiAoYnkgLSBieCkgLSBuICogKHkgKyBieSkgPSAwXG5cbiAgLy8gdGhlIGRlbHRhIHZhbHVlIHRvIHNvbHZlIHRoZSBlcXVhdGlvbiBhYm92ZSBmb3IgaGNcbiAgdmFyIGRlbHRhID0gTWF0aC5wb3codmVydGljYWxQYWRkaW5nIC0gaG9yaXpvbnRhbFBhZGRpbmcsIDIpICsgNCAqIChhdmVyYWdlV2lkdGggKyBob3Jpem9udGFsUGFkZGluZykgKiAoYXZlcmFnZUhlaWdodCArIHZlcnRpY2FsUGFkZGluZykgKiBtZW1iZXJzU2l6ZTtcblxuICAvLyBzb2x2ZSB0aGUgZXF1YXRpb24gdXNpbmcgZGVsdGEgdmFsdWUgdG8gY2FsY3VsYXRlIHRoZSBob3Jpem9udGFsIGNvdW50XG4gIC8vIHRoYXQgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIGFuIGlkZWFsIHJvd1xuICB2YXIgaG9yaXpvbnRhbENvdW50RG91YmxlID0gKGhvcml6b250YWxQYWRkaW5nIC0gdmVydGljYWxQYWRkaW5nICsgTWF0aC5zcXJ0KGRlbHRhKSkgLyAoMiAqIChhdmVyYWdlV2lkdGggKyBob3Jpem9udGFsUGFkZGluZykpO1xuICAvLyByb3VuZCB0aGUgY2FsY3VsYXRlZCBob3Jpem9udGFsIGNvdW50IHVwIG9yIGRvd24gYWNjb3JkaW5nIHRvIHRoZSBmYXZvcmVkIGRpbWVuc2lvblxuICB2YXIgaG9yaXpvbnRhbENvdW50O1xuXG4gIGlmIChmYXZvckhvcml6b250YWxEaW0pIHtcbiAgICBob3Jpem9udGFsQ291bnQgPSBNYXRoLmNlaWwoaG9yaXpvbnRhbENvdW50RG91YmxlKTtcbiAgICAvLyBpZiBob3Jpem9udGFsQ291bnQgY291bnQgaXMgbm90IGEgZmxvYXQgdmFsdWUgdGhlbiBib3RoIG9mIHJvdW5kaW5nIHRvIGZsb29yIGFuZCBjZWlsXG4gICAgLy8gd2lsbCB5aWVsZCB0aGUgc2FtZSB2YWx1ZXMuIEluc3RlYWQgb2YgcmVwZWF0aW5nIHRoZSBzYW1lIGNhbGN1bGF0aW9uIHRyeSBnb2luZyB1cFxuICAgIC8vIHdoaWxlIGZhdm9yaW5nIGhvcml6b250YWwgZGltZW5zaW9uIGluIHN1Y2ggY2FzZXNcbiAgICBpZiAoaG9yaXpvbnRhbENvdW50ID09IGhvcml6b250YWxDb3VudERvdWJsZSkge1xuICAgICAgaG9yaXpvbnRhbENvdW50Kys7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGhvcml6b250YWxDb3VudCA9IE1hdGguZmxvb3IoaG9yaXpvbnRhbENvdW50RG91YmxlKTtcbiAgfVxuXG4gIC8vIGlkZWFsIHdpZHRoIHRvIGJlIGNhbGN1bGF0ZWRcbiAgdmFyIGlkZWFsV2lkdGggPSBob3Jpem9udGFsQ291bnQgKiAoYXZlcmFnZVdpZHRoICsgaG9yaXpvbnRhbFBhZGRpbmcpIC0gaG9yaXpvbnRhbFBhZGRpbmc7XG5cbiAgLy8gaWYgbWF4IHdpZHRoIGlzIGJpZ2dlciB0aGFuIGNhbGN1bGF0ZWQgaWRlYWwgd2lkdGggcmVzZXQgaWRlYWwgd2lkdGggdG8gaXRcbiAgaWYgKG1heFdpZHRoID4gaWRlYWxXaWR0aCkge1xuICAgIGlkZWFsV2lkdGggPSBtYXhXaWR0aDtcbiAgfVxuXG4gIC8vIGFkZCB0aGUgbGVmdC1yaWdodCBtYXJnaW5zIHRvIHRoZSBpZGVhbCByb3cgd2lkdGhcbiAgaWRlYWxXaWR0aCArPSBob3Jpem9udGFsUGFkZGluZyAqIDI7XG5cbiAgLy8gcmV0dXJuIHRoZSBpZGVhbCByb3cgd2lkdGgxXG4gIHJldHVybiBpZGVhbFdpZHRoO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUudGlsZU5vZGVzQnlGYXZvcmluZ0RpbSA9IGZ1bmN0aW9uIChub2RlcywgbWluV2lkdGgsIGZhdm9ySG9yaXpvbnRhbERpbSkge1xuICB2YXIgdmVydGljYWxQYWRkaW5nID0gQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19WRVJUSUNBTDtcbiAgdmFyIGhvcml6b250YWxQYWRkaW5nID0gQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19IT1JJWk9OVEFMO1xuICB2YXIgdGlsaW5nQ29tcGFyZUJ5ID0gQ29TRUNvbnN0YW50cy5USUxJTkdfQ09NUEFSRV9CWTtcbiAgdmFyIG9yZ2FuaXphdGlvbiA9IHtcbiAgICByb3dzOiBbXSxcbiAgICByb3dXaWR0aDogW10sXG4gICAgcm93SGVpZ2h0OiBbXSxcbiAgICB3aWR0aDogMCxcbiAgICBoZWlnaHQ6IG1pbldpZHRoLCAvLyBhc3N1bWUgbWluSGVpZ2h0IGVxdWFscyB0byBtaW5XaWR0aFxuICAgIHZlcnRpY2FsUGFkZGluZzogdmVydGljYWxQYWRkaW5nLFxuICAgIGhvcml6b250YWxQYWRkaW5nOiBob3Jpem9udGFsUGFkZGluZyxcbiAgICBjZW50ZXJYOiAwLFxuICAgIGNlbnRlclk6IDBcbiAgfTtcblxuICBpZiAodGlsaW5nQ29tcGFyZUJ5KSB7XG4gICAgb3JnYW5pemF0aW9uLmlkZWFsUm93V2lkdGggPSB0aGlzLmNhbGNJZGVhbFJvd1dpZHRoKG5vZGVzLCBmYXZvckhvcml6b250YWxEaW0pO1xuICB9XG5cbiAgdmFyIGdldE5vZGVBcmVhID0gZnVuY3Rpb24gZ2V0Tm9kZUFyZWEobikge1xuICAgIHJldHVybiBuLnJlY3Qud2lkdGggKiBuLnJlY3QuaGVpZ2h0O1xuICB9O1xuXG4gIHZhciBhcmVhQ29tcGFyZUZjbiA9IGZ1bmN0aW9uIGFyZWFDb21wYXJlRmNuKG4xLCBuMikge1xuICAgIHJldHVybiBnZXROb2RlQXJlYShuMikgLSBnZXROb2RlQXJlYShuMSk7XG4gIH07XG5cbiAgLy8gU29ydCB0aGUgbm9kZXMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiB0aGVpciBhcmVhc1xuICBub2Rlcy5zb3J0KGZ1bmN0aW9uIChuMSwgbjIpIHtcbiAgICB2YXIgY21wQnkgPSBhcmVhQ29tcGFyZUZjbjtcbiAgICBpZiAob3JnYW5pemF0aW9uLmlkZWFsUm93V2lkdGgpIHtcbiAgICAgIGNtcEJ5ID0gdGlsaW5nQ29tcGFyZUJ5O1xuICAgICAgcmV0dXJuIGNtcEJ5KG4xLmlkLCBuMi5pZCk7XG4gICAgfVxuICAgIHJldHVybiBjbXBCeShuMSwgbjIpO1xuICB9KTtcblxuICAvLyBDcmVhdGUgdGhlIG9yZ2FuaXphdGlvbiAtPiBjYWxjdWxhdGUgY29tcG91bmQgY2VudGVyXG4gIHZhciBzdW1DZW50ZXJYID0gMDtcbiAgdmFyIHN1bUNlbnRlclkgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGxOb2RlID0gbm9kZXNbaV07XG5cbiAgICBzdW1DZW50ZXJYICs9IGxOb2RlLmdldENlbnRlclgoKTtcbiAgICBzdW1DZW50ZXJZICs9IGxOb2RlLmdldENlbnRlclkoKTtcbiAgfVxuXG4gIG9yZ2FuaXphdGlvbi5jZW50ZXJYID0gc3VtQ2VudGVyWCAvIG5vZGVzLmxlbmd0aDtcbiAgb3JnYW5pemF0aW9uLmNlbnRlclkgPSBzdW1DZW50ZXJZIC8gbm9kZXMubGVuZ3RoO1xuXG4gIC8vIENyZWF0ZSB0aGUgb3JnYW5pemF0aW9uIC0+IHRpbGUgbWVtYmVyc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGxOb2RlID0gbm9kZXNbaV07XG5cbiAgICBpZiAob3JnYW5pemF0aW9uLnJvd3MubGVuZ3RoID09IDApIHtcbiAgICAgIHRoaXMuaW5zZXJ0Tm9kZVRvUm93KG9yZ2FuaXphdGlvbiwgbE5vZGUsIDAsIG1pbldpZHRoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2FuQWRkSG9yaXpvbnRhbChvcmdhbml6YXRpb24sIGxOb2RlLnJlY3Qud2lkdGgsIGxOb2RlLnJlY3QuaGVpZ2h0KSkge1xuICAgICAgdmFyIHJvd0luZGV4ID0gb3JnYW5pemF0aW9uLnJvd3MubGVuZ3RoIC0gMTtcbiAgICAgIGlmICghb3JnYW5pemF0aW9uLmlkZWFsUm93V2lkdGgpIHtcbiAgICAgICAgcm93SW5kZXggPSB0aGlzLmdldFNob3J0ZXN0Um93SW5kZXgob3JnYW5pemF0aW9uKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5zZXJ0Tm9kZVRvUm93KG9yZ2FuaXphdGlvbiwgbE5vZGUsIHJvd0luZGV4LCBtaW5XaWR0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5zZXJ0Tm9kZVRvUm93KG9yZ2FuaXphdGlvbiwgbE5vZGUsIG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aCwgbWluV2lkdGgpO1xuICAgIH1cblxuICAgIHRoaXMuc2hpZnRUb0xhc3RSb3cob3JnYW5pemF0aW9uKTtcbiAgfVxuXG4gIHJldHVybiBvcmdhbml6YXRpb247XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5pbnNlcnROb2RlVG9Sb3cgPSBmdW5jdGlvbiAob3JnYW5pemF0aW9uLCBub2RlLCByb3dJbmRleCwgbWluV2lkdGgpIHtcbiAgdmFyIG1pbkNvbXBvdW5kU2l6ZSA9IG1pbldpZHRoO1xuXG4gIC8vIEFkZCBuZXcgcm93IGlmIG5lZWRlZFxuICBpZiAocm93SW5kZXggPT0gb3JnYW5pemF0aW9uLnJvd3MubGVuZ3RoKSB7XG4gICAgdmFyIHNlY29uZERpbWVuc2lvbiA9IFtdO1xuXG4gICAgb3JnYW5pemF0aW9uLnJvd3MucHVzaChzZWNvbmREaW1lbnNpb24pO1xuICAgIG9yZ2FuaXphdGlvbi5yb3dXaWR0aC5wdXNoKG1pbkNvbXBvdW5kU2l6ZSk7XG4gICAgb3JnYW5pemF0aW9uLnJvd0hlaWdodC5wdXNoKDApO1xuICB9XG5cbiAgLy8gVXBkYXRlIHJvdyB3aWR0aFxuICB2YXIgdyA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtyb3dJbmRleF0gKyBub2RlLnJlY3Qud2lkdGg7XG5cbiAgaWYgKG9yZ2FuaXphdGlvbi5yb3dzW3Jvd0luZGV4XS5sZW5ndGggPiAwKSB7XG4gICAgdyArPSBvcmdhbml6YXRpb24uaG9yaXpvbnRhbFBhZGRpbmc7XG4gIH1cblxuICBvcmdhbml6YXRpb24ucm93V2lkdGhbcm93SW5kZXhdID0gdztcbiAgLy8gVXBkYXRlIGNvbXBvdW5kIHdpZHRoXG4gIGlmIChvcmdhbml6YXRpb24ud2lkdGggPCB3KSB7XG4gICAgb3JnYW5pemF0aW9uLndpZHRoID0gdztcbiAgfVxuXG4gIC8vIFVwZGF0ZSBoZWlnaHRcbiAgdmFyIGggPSBub2RlLnJlY3QuaGVpZ2h0O1xuICBpZiAocm93SW5kZXggPiAwKSBoICs9IG9yZ2FuaXphdGlvbi52ZXJ0aWNhbFBhZGRpbmc7XG5cbiAgdmFyIGV4dHJhSGVpZ2h0ID0gMDtcbiAgaWYgKGggPiBvcmdhbml6YXRpb24ucm93SGVpZ2h0W3Jvd0luZGV4XSkge1xuICAgIGV4dHJhSGVpZ2h0ID0gb3JnYW5pemF0aW9uLnJvd0hlaWdodFtyb3dJbmRleF07XG4gICAgb3JnYW5pemF0aW9uLnJvd0hlaWdodFtyb3dJbmRleF0gPSBoO1xuICAgIGV4dHJhSGVpZ2h0ID0gb3JnYW5pemF0aW9uLnJvd0hlaWdodFtyb3dJbmRleF0gLSBleHRyYUhlaWdodDtcbiAgfVxuXG4gIG9yZ2FuaXphdGlvbi5oZWlnaHQgKz0gZXh0cmFIZWlnaHQ7XG5cbiAgLy8gSW5zZXJ0IG5vZGVcbiAgb3JnYW5pemF0aW9uLnJvd3Nbcm93SW5kZXhdLnB1c2gobm9kZSk7XG59O1xuXG4vL1NjYW5zIHRoZSByb3dzIG9mIGFuIG9yZ2FuaXphdGlvbiBhbmQgcmV0dXJucyB0aGUgb25lIHdpdGggdGhlIG1pbiB3aWR0aFxuQ29TRUxheW91dC5wcm90b3R5cGUuZ2V0U2hvcnRlc3RSb3dJbmRleCA9IGZ1bmN0aW9uIChvcmdhbml6YXRpb24pIHtcbiAgdmFyIHIgPSAtMTtcbiAgdmFyIG1pbiA9IE51bWJlci5NQVhfVkFMVUU7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcmdhbml6YXRpb24ucm93cy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChvcmdhbml6YXRpb24ucm93V2lkdGhbaV0gPCBtaW4pIHtcbiAgICAgIHIgPSBpO1xuICAgICAgbWluID0gb3JnYW5pemF0aW9uLnJvd1dpZHRoW2ldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcjtcbn07XG5cbi8vU2NhbnMgdGhlIHJvd3Mgb2YgYW4gb3JnYW5pemF0aW9uIGFuZCByZXR1cm5zIHRoZSBvbmUgd2l0aCB0aGUgbWF4IHdpZHRoXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5nZXRMb25nZXN0Um93SW5kZXggPSBmdW5jdGlvbiAob3JnYW5pemF0aW9uKSB7XG4gIHZhciByID0gLTE7XG4gIHZhciBtYXggPSBOdW1iZXIuTUlOX1ZBTFVFO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgb3JnYW5pemF0aW9uLnJvd3MubGVuZ3RoOyBpKyspIHtcblxuICAgIGlmIChvcmdhbml6YXRpb24ucm93V2lkdGhbaV0gPiBtYXgpIHtcbiAgICAgIHIgPSBpO1xuICAgICAgbWF4ID0gb3JnYW5pemF0aW9uLnJvd1dpZHRoW2ldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByO1xufTtcblxuLyoqXG4qIFRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIGFkZGluZyBleHRyYSB3aWR0aCB0byB0aGUgb3JnYW5pemF0aW9uIHZpb2xhdGVzXG4qIHRoZSBhc3BlY3QgcmF0aW8oMSkgb3Igbm90LlxuKi9cbkNvU0VMYXlvdXQucHJvdG90eXBlLmNhbkFkZEhvcml6b250YWwgPSBmdW5jdGlvbiAob3JnYW5pemF0aW9uLCBleHRyYVdpZHRoLCBleHRyYUhlaWdodCkge1xuXG4gIC8vIGlmIHRoZXJlIGlzIGFuIGlkZWFsIHJvdyB3aWR0aCBzcGVjaWZpZWQgdXNlIGl0IGluc3RlYWQgb2YgY2hlY2tpbmcgdGhlIGFzcGVjdCByYXRpb1xuICBpZiAob3JnYW5pemF0aW9uLmlkZWFsUm93V2lkdGgpIHtcbiAgICB2YXIgbGFzdFJvd0luZGV4ID0gb3JnYW5pemF0aW9uLnJvd3MubGVuZ3RoIC0gMTtcbiAgICB2YXIgbGFzdFJvd1dpZHRoID0gb3JnYW5pemF0aW9uLnJvd1dpZHRoW2xhc3RSb3dJbmRleF07XG5cbiAgICAvLyBjaGVjayBhbmQgcmV0dXJuIGlmIGlkZWFsIHJvdyB3aWR0aCB3aWxsIGJlIGV4Y2VlZCBpZiB0aGUgbm9kZSBpcyBhZGRlZCB0byB0aGUgcm93XG4gICAgcmV0dXJuIGxhc3RSb3dXaWR0aCArIGV4dHJhV2lkdGggKyBvcmdhbml6YXRpb24uaG9yaXpvbnRhbFBhZGRpbmcgPD0gb3JnYW5pemF0aW9uLmlkZWFsUm93V2lkdGg7XG4gIH1cblxuICB2YXIgc3JpID0gdGhpcy5nZXRTaG9ydGVzdFJvd0luZGV4KG9yZ2FuaXphdGlvbik7XG5cbiAgaWYgKHNyaSA8IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBtaW4gPSBvcmdhbml6YXRpb24ucm93V2lkdGhbc3JpXTtcblxuICBpZiAobWluICsgb3JnYW5pemF0aW9uLmhvcml6b250YWxQYWRkaW5nICsgZXh0cmFXaWR0aCA8PSBvcmdhbml6YXRpb24ud2lkdGgpIHJldHVybiB0cnVlO1xuXG4gIHZhciBoRGlmZiA9IDA7XG5cbiAgLy8gQWRkaW5nIHRvIGFuIGV4aXN0aW5nIHJvd1xuICBpZiAob3JnYW5pemF0aW9uLnJvd0hlaWdodFtzcmldIDwgZXh0cmFIZWlnaHQpIHtcbiAgICBpZiAoc3JpID4gMCkgaERpZmYgPSBleHRyYUhlaWdodCArIG9yZ2FuaXphdGlvbi52ZXJ0aWNhbFBhZGRpbmcgLSBvcmdhbml6YXRpb24ucm93SGVpZ2h0W3NyaV07XG4gIH1cblxuICB2YXIgYWRkX3RvX3Jvd19yYXRpbztcbiAgaWYgKG9yZ2FuaXphdGlvbi53aWR0aCAtIG1pbiA+PSBleHRyYVdpZHRoICsgb3JnYW5pemF0aW9uLmhvcml6b250YWxQYWRkaW5nKSB7XG4gICAgYWRkX3RvX3Jvd19yYXRpbyA9IChvcmdhbml6YXRpb24uaGVpZ2h0ICsgaERpZmYpIC8gKG1pbiArIGV4dHJhV2lkdGggKyBvcmdhbml6YXRpb24uaG9yaXpvbnRhbFBhZGRpbmcpO1xuICB9IGVsc2Uge1xuICAgIGFkZF90b19yb3dfcmF0aW8gPSAob3JnYW5pemF0aW9uLmhlaWdodCArIGhEaWZmKSAvIG9yZ2FuaXphdGlvbi53aWR0aDtcbiAgfVxuXG4gIC8vIEFkZGluZyBhIG5ldyByb3cgZm9yIHRoaXMgbm9kZVxuICBoRGlmZiA9IGV4dHJhSGVpZ2h0ICsgb3JnYW5pemF0aW9uLnZlcnRpY2FsUGFkZGluZztcbiAgdmFyIGFkZF9uZXdfcm93X3JhdGlvO1xuICBpZiAob3JnYW5pemF0aW9uLndpZHRoIDwgZXh0cmFXaWR0aCkge1xuICAgIGFkZF9uZXdfcm93X3JhdGlvID0gKG9yZ2FuaXphdGlvbi5oZWlnaHQgKyBoRGlmZikgLyBleHRyYVdpZHRoO1xuICB9IGVsc2Uge1xuICAgIGFkZF9uZXdfcm93X3JhdGlvID0gKG9yZ2FuaXphdGlvbi5oZWlnaHQgKyBoRGlmZikgLyBvcmdhbml6YXRpb24ud2lkdGg7XG4gIH1cblxuICBpZiAoYWRkX25ld19yb3dfcmF0aW8gPCAxKSBhZGRfbmV3X3Jvd19yYXRpbyA9IDEgLyBhZGRfbmV3X3Jvd19yYXRpbztcblxuICBpZiAoYWRkX3RvX3Jvd19yYXRpbyA8IDEpIGFkZF90b19yb3dfcmF0aW8gPSAxIC8gYWRkX3RvX3Jvd19yYXRpbztcblxuICByZXR1cm4gYWRkX3RvX3Jvd19yYXRpbyA8IGFkZF9uZXdfcm93X3JhdGlvO1xufTtcblxuLy9JZiBtb3ZpbmcgdGhlIGxhc3Qgbm9kZSBmcm9tIHRoZSBsb25nZXN0IHJvdyBhbmQgYWRkaW5nIGl0IHRvIHRoZSBsYXN0XG4vL3JvdyBtYWtlcyB0aGUgYm91bmRpbmcgYm94IHNtYWxsZXIsIGRvIGl0LlxuQ29TRUxheW91dC5wcm90b3R5cGUuc2hpZnRUb0xhc3RSb3cgPSBmdW5jdGlvbiAob3JnYW5pemF0aW9uKSB7XG4gIHZhciBsb25nZXN0ID0gdGhpcy5nZXRMb25nZXN0Um93SW5kZXgob3JnYW5pemF0aW9uKTtcbiAgdmFyIGxhc3QgPSBvcmdhbml6YXRpb24ucm93V2lkdGgubGVuZ3RoIC0gMTtcbiAgdmFyIHJvdyA9IG9yZ2FuaXphdGlvbi5yb3dzW2xvbmdlc3RdO1xuICB2YXIgbm9kZSA9IHJvd1tyb3cubGVuZ3RoIC0gMV07XG5cbiAgdmFyIGRpZmYgPSBub2RlLndpZHRoICsgb3JnYW5pemF0aW9uLmhvcml6b250YWxQYWRkaW5nO1xuXG4gIC8vIENoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBvbiB0aGUgbGFzdCByb3dcbiAgaWYgKG9yZ2FuaXphdGlvbi53aWR0aCAtIG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtsYXN0XSA+IGRpZmYgJiYgbG9uZ2VzdCAhPSBsYXN0KSB7XG4gICAgLy8gUmVtb3ZlIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIGxvbmdlc3Qgcm93XG4gICAgcm93LnNwbGljZSgtMSwgMSk7XG5cbiAgICAvLyBQdXNoIGl0IHRvIHRoZSBsYXN0IHJvd1xuICAgIG9yZ2FuaXphdGlvbi5yb3dzW2xhc3RdLnB1c2gobm9kZSk7XG5cbiAgICBvcmdhbml6YXRpb24ucm93V2lkdGhbbG9uZ2VzdF0gPSBvcmdhbml6YXRpb24ucm93V2lkdGhbbG9uZ2VzdF0gLSBkaWZmO1xuICAgIG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtsYXN0XSA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtsYXN0XSArIGRpZmY7XG4gICAgb3JnYW5pemF0aW9uLndpZHRoID0gb3JnYW5pemF0aW9uLnJvd1dpZHRoW2luc3RhbmNlLmdldExvbmdlc3RSb3dJbmRleChvcmdhbml6YXRpb24pXTtcblxuICAgIC8vIFVwZGF0ZSBoZWlnaHRzIG9mIHRoZSBvcmdhbml6YXRpb25cbiAgICB2YXIgbWF4SGVpZ2h0ID0gTnVtYmVyLk1JTl9WQUxVRTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvdy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJvd1tpXS5oZWlnaHQgPiBtYXhIZWlnaHQpIG1heEhlaWdodCA9IHJvd1tpXS5oZWlnaHQ7XG4gICAgfVxuICAgIGlmIChsb25nZXN0ID4gMCkgbWF4SGVpZ2h0ICs9IG9yZ2FuaXphdGlvbi52ZXJ0aWNhbFBhZGRpbmc7XG5cbiAgICB2YXIgcHJldlRvdGFsID0gb3JnYW5pemF0aW9uLnJvd0hlaWdodFtsb25nZXN0XSArIG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbbGFzdF07XG5cbiAgICBvcmdhbml6YXRpb24ucm93SGVpZ2h0W2xvbmdlc3RdID0gbWF4SGVpZ2h0O1xuICAgIGlmIChvcmdhbml6YXRpb24ucm93SGVpZ2h0W2xhc3RdIDwgbm9kZS5oZWlnaHQgKyBvcmdhbml6YXRpb24udmVydGljYWxQYWRkaW5nKSBvcmdhbml6YXRpb24ucm93SGVpZ2h0W2xhc3RdID0gbm9kZS5oZWlnaHQgKyBvcmdhbml6YXRpb24udmVydGljYWxQYWRkaW5nO1xuXG4gICAgdmFyIGZpbmFsVG90YWwgPSBvcmdhbml6YXRpb24ucm93SGVpZ2h0W2xvbmdlc3RdICsgb3JnYW5pemF0aW9uLnJvd0hlaWdodFtsYXN0XTtcbiAgICBvcmdhbml6YXRpb24uaGVpZ2h0ICs9IGZpbmFsVG90YWwgLSBwcmV2VG90YWw7XG5cbiAgICB0aGlzLnNoaWZ0VG9MYXN0Um93KG9yZ2FuaXphdGlvbik7XG4gIH1cbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnRpbGluZ1ByZUxheW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKENvU0VDb25zdGFudHMuVElMRSkge1xuICAgIC8vIEZpbmQgemVybyBkZWdyZWUgbm9kZXMgYW5kIGNyZWF0ZSBhIGNvbXBvdW5kIGZvciBlYWNoIGxldmVsXG4gICAgdGhpcy5ncm91cFplcm9EZWdyZWVNZW1iZXJzKCk7XG4gICAgLy8gVGlsZSBhbmQgY2xlYXIgY2hpbGRyZW4gb2YgZWFjaCBjb21wb3VuZFxuICAgIHRoaXMuY2xlYXJDb21wb3VuZHMoKTtcbiAgICAvLyBTZXBhcmF0ZWx5IHRpbGUgYW5kIGNsZWFyIHplcm8gZGVncmVlIG5vZGVzIGZvciBlYWNoIGxldmVsXG4gICAgdGhpcy5jbGVhclplcm9EZWdyZWVNZW1iZXJzKCk7XG4gIH1cbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnRpbGluZ1Bvc3RMYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChDb1NFQ29uc3RhbnRzLlRJTEUpIHtcbiAgICB0aGlzLnJlcG9wdWxhdGVaZXJvRGVncmVlTWVtYmVycygpO1xuICAgIHRoaXMucmVwb3B1bGF0ZUNvbXBvdW5kcygpO1xuICB9XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VjdGlvbjogVHJlZSBSZWR1Y3Rpb24gbWV0aG9kc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlZHVjZSB0cmVlcyBcbkNvU0VMYXlvdXQucHJvdG90eXBlLnJlZHVjZVRyZWVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcHJ1bmVkTm9kZXNBbGwgPSBbXTtcbiAgdmFyIGNvbnRhaW5zTGVhZiA9IHRydWU7XG4gIHZhciBub2RlO1xuXG4gIHdoaWxlIChjb250YWluc0xlYWYpIHtcbiAgICB2YXIgYWxsTm9kZXMgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxOb2RlcygpO1xuICAgIHZhciBwcnVuZWROb2Rlc0luU3RlcFRlbXAgPSBbXTtcbiAgICBjb250YWluc0xlYWYgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5vZGUgPSBhbGxOb2Rlc1tpXTtcbiAgICAgIGlmIChub2RlLmdldEVkZ2VzKCkubGVuZ3RoID09IDEgJiYgIW5vZGUuZ2V0RWRnZXMoKVswXS5pc0ludGVyR3JhcGggJiYgbm9kZS5nZXRDaGlsZCgpID09IG51bGwpIHtcbiAgICAgICAgaWYgKENvU0VDb25zdGFudHMuUFVSRV9JTkNSRU1FTlRBTCkge1xuICAgICAgICAgIHZhciBvdGhlckVuZCA9IG5vZGUuZ2V0RWRnZXMoKVswXS5nZXRPdGhlckVuZChub2RlKTtcbiAgICAgICAgICB2YXIgcmVsYXRpdmVQb3NpdGlvbiA9IG5ldyBEaW1lbnNpb25EKG5vZGUuZ2V0Q2VudGVyWCgpIC0gb3RoZXJFbmQuZ2V0Q2VudGVyWCgpLCBub2RlLmdldENlbnRlclkoKSAtIG90aGVyRW5kLmdldENlbnRlclkoKSk7XG4gICAgICAgICAgcHJ1bmVkTm9kZXNJblN0ZXBUZW1wLnB1c2goW25vZGUsIG5vZGUuZ2V0RWRnZXMoKVswXSwgbm9kZS5nZXRPd25lcigpLCByZWxhdGl2ZVBvc2l0aW9uXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJ1bmVkTm9kZXNJblN0ZXBUZW1wLnB1c2goW25vZGUsIG5vZGUuZ2V0RWRnZXMoKVswXSwgbm9kZS5nZXRPd25lcigpXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGFpbnNMZWFmID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbnRhaW5zTGVhZiA9PSB0cnVlKSB7XG4gICAgICB2YXIgcHJ1bmVkTm9kZXNJblN0ZXAgPSBbXTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcHJ1bmVkTm9kZXNJblN0ZXBUZW1wLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChwcnVuZWROb2Rlc0luU3RlcFRlbXBbal1bMF0uZ2V0RWRnZXMoKS5sZW5ndGggPT0gMSkge1xuICAgICAgICAgIHBydW5lZE5vZGVzSW5TdGVwLnB1c2gocHJ1bmVkTm9kZXNJblN0ZXBUZW1wW2pdKTtcbiAgICAgICAgICBwcnVuZWROb2Rlc0luU3RlcFRlbXBbal1bMF0uZ2V0T3duZXIoKS5yZW1vdmUocHJ1bmVkTm9kZXNJblN0ZXBUZW1wW2pdWzBdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHJ1bmVkTm9kZXNBbGwucHVzaChwcnVuZWROb2Rlc0luU3RlcCk7XG4gICAgICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbE5vZGVzKCk7XG4gICAgICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbEVkZ2VzKCk7XG4gICAgfVxuICB9XG4gIHRoaXMucHJ1bmVkTm9kZXNBbGwgPSBwcnVuZWROb2Rlc0FsbDtcbn07XG5cbi8vIEdyb3cgdHJlZSBvbmUgc3RlcCBcbkNvU0VMYXlvdXQucHJvdG90eXBlLmdyb3dUcmVlID0gZnVuY3Rpb24gKHBydW5lZE5vZGVzQWxsKSB7XG4gIHZhciBsZW5ndGhPZlBydW5lZE5vZGVzSW5TdGVwID0gcHJ1bmVkTm9kZXNBbGwubGVuZ3RoO1xuICB2YXIgcHJ1bmVkTm9kZXNJblN0ZXAgPSBwcnVuZWROb2Rlc0FsbFtsZW5ndGhPZlBydW5lZE5vZGVzSW5TdGVwIC0gMV07XG5cbiAgdmFyIG5vZGVEYXRhO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBydW5lZE5vZGVzSW5TdGVwLmxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZURhdGEgPSBwcnVuZWROb2Rlc0luU3RlcFtpXTtcblxuICAgIHRoaXMuZmluZFBsYWNlZm9yUHJ1bmVkTm9kZShub2RlRGF0YSk7XG5cbiAgICBub2RlRGF0YVsyXS5hZGQobm9kZURhdGFbMF0pO1xuICAgIG5vZGVEYXRhWzJdLmFkZChub2RlRGF0YVsxXSwgbm9kZURhdGFbMV0uc291cmNlLCBub2RlRGF0YVsxXS50YXJnZXQpO1xuICB9XG5cbiAgcHJ1bmVkTm9kZXNBbGwuc3BsaWNlKHBydW5lZE5vZGVzQWxsLmxlbmd0aCAtIDEsIDEpO1xuICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbE5vZGVzKCk7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsRWRnZXMoKTtcbn07XG5cbi8vIEZpbmQgYW4gYXBwcm9wcmlhdGUgcG9zaXRpb24gdG8gcmVwbGFjZSBwcnVuZWQgbm9kZSwgdGhpcyBtZXRob2QgY2FuIGJlIGltcHJvdmVkXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5maW5kUGxhY2Vmb3JQcnVuZWROb2RlID0gZnVuY3Rpb24gKG5vZGVEYXRhKSB7XG5cbiAgdmFyIGdyaWRGb3JQcnVuZWROb2RlO1xuICB2YXIgbm9kZVRvQ29ubmVjdDtcbiAgdmFyIHBydW5lZE5vZGUgPSBub2RlRGF0YVswXTtcbiAgaWYgKHBydW5lZE5vZGUgPT0gbm9kZURhdGFbMV0uc291cmNlKSB7XG4gICAgbm9kZVRvQ29ubmVjdCA9IG5vZGVEYXRhWzFdLnRhcmdldDtcbiAgfSBlbHNlIHtcbiAgICBub2RlVG9Db25uZWN0ID0gbm9kZURhdGFbMV0uc291cmNlO1xuICB9XG5cbiAgaWYgKENvU0VDb25zdGFudHMuUFVSRV9JTkNSRU1FTlRBTCkge1xuICAgIHBydW5lZE5vZGUuc2V0Q2VudGVyKG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWCgpICsgbm9kZURhdGFbM10uZ2V0V2lkdGgoKSwgbm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJZKCkgKyBub2RlRGF0YVszXS5nZXRIZWlnaHQoKSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHN0YXJ0R3JpZFggPSBub2RlVG9Db25uZWN0LnN0YXJ0WDtcbiAgICB2YXIgZmluaXNoR3JpZFggPSBub2RlVG9Db25uZWN0LmZpbmlzaFg7XG4gICAgdmFyIHN0YXJ0R3JpZFkgPSBub2RlVG9Db25uZWN0LnN0YXJ0WTtcbiAgICB2YXIgZmluaXNoR3JpZFkgPSBub2RlVG9Db25uZWN0LmZpbmlzaFk7XG5cbiAgICB2YXIgdXBOb2RlQ291bnQgPSAwO1xuICAgIHZhciBkb3duTm9kZUNvdW50ID0gMDtcbiAgICB2YXIgcmlnaHROb2RlQ291bnQgPSAwO1xuICAgIHZhciBsZWZ0Tm9kZUNvdW50ID0gMDtcbiAgICB2YXIgY29udHJvbFJlZ2lvbnMgPSBbdXBOb2RlQ291bnQsIHJpZ2h0Tm9kZUNvdW50LCBkb3duTm9kZUNvdW50LCBsZWZ0Tm9kZUNvdW50XTtcblxuICAgIGlmIChzdGFydEdyaWRZID4gMCkge1xuICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0R3JpZFg7IGkgPD0gZmluaXNoR3JpZFg7IGkrKykge1xuICAgICAgICBjb250cm9sUmVnaW9uc1swXSArPSB0aGlzLmdyaWRbaV1bc3RhcnRHcmlkWSAtIDFdLmxlbmd0aCArIHRoaXMuZ3JpZFtpXVtzdGFydEdyaWRZXS5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmluaXNoR3JpZFggPCB0aGlzLmdyaWQubGVuZ3RoIC0gMSkge1xuICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0R3JpZFk7IGkgPD0gZmluaXNoR3JpZFk7IGkrKykge1xuICAgICAgICBjb250cm9sUmVnaW9uc1sxXSArPSB0aGlzLmdyaWRbZmluaXNoR3JpZFggKyAxXVtpXS5sZW5ndGggKyB0aGlzLmdyaWRbZmluaXNoR3JpZFhdW2ldLmxlbmd0aCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaW5pc2hHcmlkWSA8IHRoaXMuZ3JpZFswXS5sZW5ndGggLSAxKSB7XG4gICAgICBmb3IgKHZhciBpID0gc3RhcnRHcmlkWDsgaSA8PSBmaW5pc2hHcmlkWDsgaSsrKSB7XG4gICAgICAgIGNvbnRyb2xSZWdpb25zWzJdICs9IHRoaXMuZ3JpZFtpXVtmaW5pc2hHcmlkWSArIDFdLmxlbmd0aCArIHRoaXMuZ3JpZFtpXVtmaW5pc2hHcmlkWV0ubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0YXJ0R3JpZFggPiAwKSB7XG4gICAgICBmb3IgKHZhciBpID0gc3RhcnRHcmlkWTsgaSA8PSBmaW5pc2hHcmlkWTsgaSsrKSB7XG4gICAgICAgIGNvbnRyb2xSZWdpb25zWzNdICs9IHRoaXMuZ3JpZFtzdGFydEdyaWRYIC0gMV1baV0ubGVuZ3RoICsgdGhpcy5ncmlkW3N0YXJ0R3JpZFhdW2ldLmxlbmd0aCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBtaW4gPSBJbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICB2YXIgbWluQ291bnQ7XG4gICAgdmFyIG1pbkluZGV4O1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29udHJvbFJlZ2lvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChjb250cm9sUmVnaW9uc1tqXSA8IG1pbikge1xuICAgICAgICBtaW4gPSBjb250cm9sUmVnaW9uc1tqXTtcbiAgICAgICAgbWluQ291bnQgPSAxO1xuICAgICAgICBtaW5JbmRleCA9IGo7XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xSZWdpb25zW2pdID09IG1pbikge1xuICAgICAgICBtaW5Db3VudCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtaW5Db3VudCA9PSAzICYmIG1pbiA9PSAwKSB7XG4gICAgICBpZiAoY29udHJvbFJlZ2lvbnNbMF0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1sxXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzJdID09IDApIHtcbiAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAxO1xuICAgICAgfSBlbHNlIGlmIChjb250cm9sUmVnaW9uc1swXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzFdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbM10gPT0gMCkge1xuICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDA7XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xSZWdpb25zWzBdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbMl0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1szXSA9PSAwKSB7XG4gICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMztcbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbFJlZ2lvbnNbMV0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1syXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzNdID09IDApIHtcbiAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAyO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobWluQ291bnQgPT0gMiAmJiBtaW4gPT0gMCkge1xuICAgICAgdmFyIHJhbmRvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDIpO1xuICAgICAgaWYgKGNvbnRyb2xSZWdpb25zWzBdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbMV0gPT0gMCkge1xuICAgICAgICA7XG4gICAgICAgIGlmIChyYW5kb20gPT0gMCkge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbFJlZ2lvbnNbMF0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1syXSA9PSAwKSB7XG4gICAgICAgIGlmIChyYW5kb20gPT0gMCkge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbFJlZ2lvbnNbMF0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1szXSA9PSAwKSB7XG4gICAgICAgIGlmIChyYW5kb20gPT0gMCkge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbFJlZ2lvbnNbMV0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1syXSA9PSAwKSB7XG4gICAgICAgIGlmIChyYW5kb20gPT0gMCkge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbFJlZ2lvbnNbMV0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1szXSA9PSAwKSB7XG4gICAgICAgIGlmIChyYW5kb20gPT0gMCkge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChyYW5kb20gPT0gMCkge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1pbkNvdW50ID09IDQgJiYgbWluID09IDApIHtcbiAgICAgIHZhciByYW5kb20gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA0KTtcbiAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gcmFuZG9tO1xuICAgIH0gZWxzZSB7XG4gICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IG1pbkluZGV4O1xuICAgIH1cblxuICAgIGlmIChncmlkRm9yUHJ1bmVkTm9kZSA9PSAwKSB7XG4gICAgICBwcnVuZWROb2RlLnNldENlbnRlcihub2RlVG9Db25uZWN0LmdldENlbnRlclgoKSwgbm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJZKCkgLSBub2RlVG9Db25uZWN0LmdldEhlaWdodCgpIC8gMiAtIEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggLSBwcnVuZWROb2RlLmdldEhlaWdodCgpIC8gMik7XG4gICAgfSBlbHNlIGlmIChncmlkRm9yUHJ1bmVkTm9kZSA9PSAxKSB7XG4gICAgICBwcnVuZWROb2RlLnNldENlbnRlcihub2RlVG9Db25uZWN0LmdldENlbnRlclgoKSArIG5vZGVUb0Nvbm5lY3QuZ2V0V2lkdGgoKSAvIDIgKyBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIICsgcHJ1bmVkTm9kZS5nZXRXaWR0aCgpIC8gMiwgbm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJZKCkpO1xuICAgIH0gZWxzZSBpZiAoZ3JpZEZvclBydW5lZE5vZGUgPT0gMikge1xuICAgICAgcHJ1bmVkTm9kZS5zZXRDZW50ZXIobm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJYKCksIG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWSgpICsgbm9kZVRvQ29ubmVjdC5nZXRIZWlnaHQoKSAvIDIgKyBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIICsgcHJ1bmVkTm9kZS5nZXRIZWlnaHQoKSAvIDIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcnVuZWROb2RlLnNldENlbnRlcihub2RlVG9Db25uZWN0LmdldENlbnRlclgoKSAtIG5vZGVUb0Nvbm5lY3QuZ2V0V2lkdGgoKSAvIDIgLSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIC0gcHJ1bmVkTm9kZS5nZXRXaWR0aCgpIC8gMiwgbm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJZKCkpO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb1NFTGF5b3V0O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gOTkxOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIEZETGF5b3V0Tm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5GRExheW91dE5vZGU7XG52YXIgSU1hdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuSU1hdGg7XG5cbmZ1bmN0aW9uIENvU0VOb2RlKGdtLCBsb2MsIHNpemUsIHZOb2RlKSB7XG4gIEZETGF5b3V0Tm9kZS5jYWxsKHRoaXMsIGdtLCBsb2MsIHNpemUsIHZOb2RlKTtcbn1cblxuQ29TRU5vZGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShGRExheW91dE5vZGUucHJvdG90eXBlKTtcbmZvciAodmFyIHByb3AgaW4gRkRMYXlvdXROb2RlKSB7XG4gIENvU0VOb2RlW3Byb3BdID0gRkRMYXlvdXROb2RlW3Byb3BdO1xufVxuXG5Db1NFTm9kZS5wcm90b3R5cGUuY2FsY3VsYXRlRGlzcGxhY2VtZW50ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbGF5b3V0ID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0TGF5b3V0KCk7XG4gIC8vIHRoaXMgY2hlY2sgaXMgZm9yIGNvbXBvdW5kIG5vZGVzIHRoYXQgY29udGFpbiBmaXhlZCBub2Rlc1xuICBpZiAodGhpcy5nZXRDaGlsZCgpICE9IG51bGwgJiYgdGhpcy5maXhlZE5vZGVXZWlnaHQpIHtcbiAgICB0aGlzLmRpc3BsYWNlbWVudFggKz0gbGF5b3V0LmNvb2xpbmdGYWN0b3IgKiAodGhpcy5zcHJpbmdGb3JjZVggKyB0aGlzLnJlcHVsc2lvbkZvcmNlWCArIHRoaXMuZ3Jhdml0YXRpb25Gb3JjZVgpIC8gdGhpcy5maXhlZE5vZGVXZWlnaHQ7XG4gICAgdGhpcy5kaXNwbGFjZW1lbnRZICs9IGxheW91dC5jb29saW5nRmFjdG9yICogKHRoaXMuc3ByaW5nRm9yY2VZICsgdGhpcy5yZXB1bHNpb25Gb3JjZVkgKyB0aGlzLmdyYXZpdGF0aW9uRm9yY2VZKSAvIHRoaXMuZml4ZWROb2RlV2VpZ2h0O1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZGlzcGxhY2VtZW50WCArPSBsYXlvdXQuY29vbGluZ0ZhY3RvciAqICh0aGlzLnNwcmluZ0ZvcmNlWCArIHRoaXMucmVwdWxzaW9uRm9yY2VYICsgdGhpcy5ncmF2aXRhdGlvbkZvcmNlWCkgLyB0aGlzLm5vT2ZDaGlsZHJlbjtcbiAgICB0aGlzLmRpc3BsYWNlbWVudFkgKz0gbGF5b3V0LmNvb2xpbmdGYWN0b3IgKiAodGhpcy5zcHJpbmdGb3JjZVkgKyB0aGlzLnJlcHVsc2lvbkZvcmNlWSArIHRoaXMuZ3Jhdml0YXRpb25Gb3JjZVkpIC8gdGhpcy5ub09mQ2hpbGRyZW47XG4gIH1cblxuICBpZiAoTWF0aC5hYnModGhpcy5kaXNwbGFjZW1lbnRYKSA+IGxheW91dC5jb29saW5nRmFjdG9yICogbGF5b3V0Lm1heE5vZGVEaXNwbGFjZW1lbnQpIHtcbiAgICB0aGlzLmRpc3BsYWNlbWVudFggPSBsYXlvdXQuY29vbGluZ0ZhY3RvciAqIGxheW91dC5tYXhOb2RlRGlzcGxhY2VtZW50ICogSU1hdGguc2lnbih0aGlzLmRpc3BsYWNlbWVudFgpO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKHRoaXMuZGlzcGxhY2VtZW50WSkgPiBsYXlvdXQuY29vbGluZ0ZhY3RvciAqIGxheW91dC5tYXhOb2RlRGlzcGxhY2VtZW50KSB7XG4gICAgdGhpcy5kaXNwbGFjZW1lbnRZID0gbGF5b3V0LmNvb2xpbmdGYWN0b3IgKiBsYXlvdXQubWF4Tm9kZURpc3BsYWNlbWVudCAqIElNYXRoLnNpZ24odGhpcy5kaXNwbGFjZW1lbnRZKTtcbiAgfVxuXG4gIC8vIG5vbi1lbXB0eSBjb21wb3VuZCBub2RlLCBwcm9wb2dhdGUgbW92ZW1lbnQgdG8gY2hpbGRyZW4gYXMgd2VsbFxuICBpZiAodGhpcy5jaGlsZCAmJiB0aGlzLmNoaWxkLmdldE5vZGVzKCkubGVuZ3RoID4gMCkge1xuICAgIHRoaXMucHJvcG9nYXRlRGlzcGxhY2VtZW50VG9DaGlsZHJlbih0aGlzLmRpc3BsYWNlbWVudFgsIHRoaXMuZGlzcGxhY2VtZW50WSk7XG4gIH1cbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5wcm9wb2dhdGVEaXNwbGFjZW1lbnRUb0NoaWxkcmVuID0gZnVuY3Rpb24gKGRYLCBkWSkge1xuICB2YXIgbm9kZXMgPSB0aGlzLmdldENoaWxkKCkuZ2V0Tm9kZXMoKTtcbiAgdmFyIG5vZGU7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBub2RlID0gbm9kZXNbaV07XG4gICAgaWYgKG5vZGUuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgICBub2RlLmRpc3BsYWNlbWVudFggKz0gZFg7XG4gICAgICBub2RlLmRpc3BsYWNlbWVudFkgKz0gZFk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUucHJvcG9nYXRlRGlzcGxhY2VtZW50VG9DaGlsZHJlbihkWCwgZFkpO1xuICAgIH1cbiAgfVxufTtcblxuQ29TRU5vZGUucHJvdG90eXBlLm1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsYXlvdXQgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRMYXlvdXQoKTtcblxuICAvLyBhIHNpbXBsZSBub2RlIG9yIGFuIGVtcHR5IGNvbXBvdW5kIG5vZGUsIG1vdmUgaXRcbiAgaWYgKHRoaXMuY2hpbGQgPT0gbnVsbCB8fCB0aGlzLmNoaWxkLmdldE5vZGVzKCkubGVuZ3RoID09IDApIHtcbiAgICB0aGlzLm1vdmVCeSh0aGlzLmRpc3BsYWNlbWVudFgsIHRoaXMuZGlzcGxhY2VtZW50WSk7XG5cbiAgICBsYXlvdXQudG90YWxEaXNwbGFjZW1lbnQgKz0gTWF0aC5hYnModGhpcy5kaXNwbGFjZW1lbnRYKSArIE1hdGguYWJzKHRoaXMuZGlzcGxhY2VtZW50WSk7XG4gIH1cblxuICB0aGlzLnNwcmluZ0ZvcmNlWCA9IDA7XG4gIHRoaXMuc3ByaW5nRm9yY2VZID0gMDtcbiAgdGhpcy5yZXB1bHNpb25Gb3JjZVggPSAwO1xuICB0aGlzLnJlcHVsc2lvbkZvcmNlWSA9IDA7XG4gIHRoaXMuZ3Jhdml0YXRpb25Gb3JjZVggPSAwO1xuICB0aGlzLmdyYXZpdGF0aW9uRm9yY2VZID0gMDtcbiAgdGhpcy5kaXNwbGFjZW1lbnRYID0gMDtcbiAgdGhpcy5kaXNwbGFjZW1lbnRZID0gMDtcbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5zZXRQcmVkMSA9IGZ1bmN0aW9uIChwcmVkMSkge1xuICB0aGlzLnByZWQxID0gcHJlZDE7XG59O1xuXG5Db1NFTm9kZS5wcm90b3R5cGUuZ2V0UHJlZDEgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBwcmVkMTtcbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5nZXRQcmVkMiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHByZWQyO1xufTtcblxuQ29TRU5vZGUucHJvdG90eXBlLnNldE5leHQgPSBmdW5jdGlvbiAobmV4dCkge1xuICB0aGlzLm5leHQgPSBuZXh0O1xufTtcblxuQ29TRU5vZGUucHJvdG90eXBlLmdldE5leHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXh0O1xufTtcblxuQ29TRU5vZGUucHJvdG90eXBlLnNldFByb2Nlc3NlZCA9IGZ1bmN0aW9uIChwcm9jZXNzZWQpIHtcbiAgdGhpcy5wcm9jZXNzZWQgPSBwcm9jZXNzZWQ7XG59O1xuXG5Db1NFTm9kZS5wcm90b3R5cGUuaXNQcm9jZXNzZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBwcm9jZXNzZWQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvU0VOb2RlO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gOTAyOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSBlbHNlIHsgcmV0dXJuIEFycmF5LmZyb20oYXJyKTsgfSB9XG5cbnZhciBDb1NFQ29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MDYpO1xudmFyIExpbmtlZExpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuTGlua2VkTGlzdDtcbnZhciBNYXRyaXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuTWF0cml4O1xudmFyIFNWRCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5TVkQ7XG5cbmZ1bmN0aW9uIENvbnN0cmFpbnRIYW5kbGVyKCkge31cblxuQ29uc3RyYWludEhhbmRsZXIuaGFuZGxlQ29uc3RyYWludHMgPSBmdW5jdGlvbiAobGF5b3V0KSB7XG4gIC8vICBsZXQgbGF5b3V0ID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0TGF5b3V0KCk7XG5cbiAgLy8gZ2V0IGNvbnN0cmFpbnRzIGZyb20gbGF5b3V0XG4gIHZhciBjb25zdHJhaW50cyA9IHt9O1xuICBjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50ID0gbGF5b3V0LmNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQ7XG4gIGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQgPSBsYXlvdXQuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludDtcbiAgY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50ID0gbGF5b3V0LmNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludDtcblxuICB2YXIgaWRUb05vZGVNYXAgPSBuZXcgTWFwKCk7XG4gIHZhciBub2RlSW5kZXhlcyA9IG5ldyBNYXAoKTtcbiAgdmFyIHhDb29yZHMgPSBbXTtcbiAgdmFyIHlDb29yZHMgPSBbXTtcblxuICB2YXIgYWxsTm9kZXMgPSBsYXlvdXQuZ2V0QWxsTm9kZXMoKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgLy8gZmlsbCBpbmRleCBtYXAgYW5kIGNvb3JkaW5hdGVzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IGFsbE5vZGVzW2ldO1xuICAgIGlmIChub2RlLmdldENoaWxkKCkgPT0gbnVsbCkge1xuICAgICAgbm9kZUluZGV4ZXMuc2V0KG5vZGUuaWQsIGluZGV4KyspO1xuICAgICAgeENvb3Jkcy5wdXNoKG5vZGUuZ2V0Q2VudGVyWCgpKTtcbiAgICAgIHlDb29yZHMucHVzaChub2RlLmdldENlbnRlclkoKSk7XG4gICAgICBpZFRvTm9kZU1hcC5zZXQobm9kZS5pZCwgbm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlcmUgZXhpc3RzIHJlbGF0aXZlIHBsYWNlbWVudCBjb25zdHJhaW50IHdpdGhvdXQgZ2FwIHZhbHVlLCBzZXQgaXQgdG8gZGVmYXVsdCBcbiAgaWYgKGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCkge1xuICAgIGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICBpZiAoIWNvbnN0cmFpbnQuZ2FwICYmIGNvbnN0cmFpbnQuZ2FwICE9IDApIHtcbiAgICAgICAgaWYgKGNvbnN0cmFpbnQubGVmdCkge1xuICAgICAgICAgIGNvbnN0cmFpbnQuZ2FwID0gQ29TRUNvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIICsgaWRUb05vZGVNYXAuZ2V0KGNvbnN0cmFpbnQubGVmdCkuZ2V0V2lkdGgoKSAvIDIgKyBpZFRvTm9kZU1hcC5nZXQoY29uc3RyYWludC5yaWdodCkuZ2V0V2lkdGgoKSAvIDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3RyYWludC5nYXAgPSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggKyBpZFRvTm9kZU1hcC5nZXQoY29uc3RyYWludC50b3ApLmdldEhlaWdodCgpIC8gMiArIGlkVG9Ob2RlTWFwLmdldChjb25zdHJhaW50LmJvdHRvbSkuZ2V0SGVpZ2h0KCkgLyAyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiBhdXhpbGlhcnkgZnVuY3Rpb25zICovXG5cbiAgLy8gY2FsY3VsYXRlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gcG9zaXRpb24gb2JqZWN0c1xuICB2YXIgY2FsY3VsYXRlUG9zaXRpb25EaWZmID0gZnVuY3Rpb24gY2FsY3VsYXRlUG9zaXRpb25EaWZmKHBvczEsIHBvczIpIHtcbiAgICByZXR1cm4geyB4OiBwb3MxLnggLSBwb3MyLngsIHk6IHBvczEueSAtIHBvczIueSB9O1xuICB9O1xuXG4gIC8vIGNhbGN1bGF0ZSBhdmVyYWdlIHBvc2l0aW9uIG9mIHRoZSBub2Rlc1xuICB2YXIgY2FsY3VsYXRlQXZnUG9zaXRpb24gPSBmdW5jdGlvbiBjYWxjdWxhdGVBdmdQb3NpdGlvbihub2RlSWRTZXQpIHtcbiAgICB2YXIgeFBvc1N1bSA9IDA7XG4gICAgdmFyIHlQb3NTdW0gPSAwO1xuICAgIG5vZGVJZFNldC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgIHhQb3NTdW0gKz0geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV07XG4gICAgICB5UG9zU3VtICs9IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgeDogeFBvc1N1bSAvIG5vZGVJZFNldC5zaXplLCB5OiB5UG9zU3VtIC8gbm9kZUlkU2V0LnNpemUgfTtcbiAgfTtcblxuICAvLyBmaW5kIGFuIGFwcHJvcHJpYXRlIHBvc2l0aW9uaW5nIGZvciB0aGUgbm9kZXMgaW4gYSBnaXZlbiBncmFwaCBhY2NvcmRpbmcgdG8gcmVsYXRpdmUgcGxhY2VtZW50IGNvbnN0cmFpbnRzXG4gIC8vIHRoaXMgZnVuY3Rpb24gYWxzbyB0YWtlcyB0aGUgZml4ZWQgbm9kZXMgYW5kIGFsaWdubWVudCBjb25zdHJhaW50cyBpbnRvIGFjY291bnRcbiAgLy8gZ3JhcGg6IGRhZyB0byBiZSBldmFsdWF0ZWQsIGRpcmVjdGlvbjogXCJob3Jpem9udGFsXCIgb3IgXCJ2ZXJ0aWNhbFwiLCBcbiAgLy8gZml4ZWROb2Rlczogc2V0IG9mIGZpeGVkIG5vZGVzIHRvIGNvbnNpZGVyIGR1cmluZyBldmFsdWF0aW9uLCBkdW1teVBvc2l0aW9uczogYXBwcm9wcmlhdGUgY29vcmRpbmF0ZXMgb2YgdGhlIGR1bW15IG5vZGVzICBcbiAgdmFyIGZpbmRBcHByb3ByaWF0ZVBvc2l0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQgPSBmdW5jdGlvbiBmaW5kQXBwcm9wcmlhdGVQb3NpdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50KGdyYXBoLCBkaXJlY3Rpb24sIGZpeGVkTm9kZXMsIGR1bW15UG9zaXRpb25zLCBjb21wb25lbnRTb3VyY2VzKSB7XG5cbiAgICAvLyBmaW5kIHVuaW9uIG9mIHR3byBzZXRzXG4gICAgZnVuY3Rpb24gc2V0VW5pb24oc2V0QSwgc2V0Qikge1xuICAgICAgdmFyIHVuaW9uID0gbmV3IFNldChzZXRBKTtcbiAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlO1xuICAgICAgdmFyIF9pdGVyYXRvckVycm9yID0gdW5kZWZpbmVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBzZXRCW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IChfc3RlcCA9IF9pdGVyYXRvci5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZSkge1xuICAgICAgICAgIHZhciBlbGVtID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgICB1bmlvbi5hZGQoZWxlbSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG4gICAgICAgIF9pdGVyYXRvckVycm9yID0gZXJyO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gJiYgX2l0ZXJhdG9yLnJldHVybikge1xuICAgICAgICAgICAgX2l0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdW5pb247XG4gICAgfVxuXG4gICAgLy8gZmluZCBpbmRlZ3JlZSBjb3VudCBmb3IgZWFjaCBub2RlXG4gICAgdmFyIGluRGVncmVlcyA9IG5ldyBNYXAoKTtcblxuICAgIGdyYXBoLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIGluRGVncmVlcy5zZXQoa2V5LCAwKTtcbiAgICB9KTtcbiAgICBncmFwaC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChhZGphY2VudCkge1xuICAgICAgICBpbkRlZ3JlZXMuc2V0KGFkamFjZW50LmlkLCBpbkRlZ3JlZXMuZ2V0KGFkamFjZW50LmlkKSArIDEpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB2YXIgcG9zaXRpb25NYXAgPSBuZXcgTWFwKCk7IC8vIGtlZXBzIHRoZSBwb3NpdGlvbiBmb3IgZWFjaCBub2RlXG4gICAgdmFyIHBhc3RNYXAgPSBuZXcgTWFwKCk7IC8vIGtlZXBzIHRoZSBwcmVkZWNlc3NvcnMocGFzdCkgb2YgYSBub2RlXG4gICAgdmFyIHF1ZXVlID0gbmV3IExpbmtlZExpc3QoKTtcbiAgICBpbkRlZ3JlZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgaWYgKHZhbHVlID09IDApIHtcbiAgICAgICAgcXVldWUucHVzaChrZXkpO1xuICAgICAgICBpZiAoIWZpeGVkTm9kZXMpIHtcbiAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQoa2V5LCBub2RlSW5kZXhlcy5oYXMoa2V5KSA/IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGtleSldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KGtleSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQoa2V5LCBub2RlSW5kZXhlcy5oYXMoa2V5KSA/IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGtleSldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KGtleSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcG9zaXRpb25NYXAuc2V0KGtleSwgTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaXhlZE5vZGVzKSB7XG4gICAgICAgIHBhc3RNYXAuc2V0KGtleSwgbmV3IFNldChba2V5XSkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gYWxpZ24gc291cmNlcyBvZiBlYWNoIGNvbXBvbmVudCBpbiBlbmZvcmNlbWVudCBwaGFzZVxuICAgIGlmIChmaXhlZE5vZGVzKSB7XG4gICAgICBjb21wb25lbnRTb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCkge1xuICAgICAgICB2YXIgZml4ZWRJZHMgPSBbXTtcbiAgICAgICAgY29tcG9uZW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgIGlmIChmaXhlZE5vZGVzLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICBmaXhlZElkcy5wdXNoKG5vZGVJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGZpeGVkSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB2YXIgcG9zaXRpb24gPSAwO1xuICAgICAgICAgIGZpeGVkSWRzLmZvckVhY2goZnVuY3Rpb24gKGZpeGVkSWQpIHtcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gXCJob3Jpem9udGFsXCIpIHtcbiAgICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KGZpeGVkSWQsIG5vZGVJbmRleGVzLmhhcyhmaXhlZElkKSA/IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGZpeGVkSWQpXSA6IGR1bW15UG9zaXRpb25zLmdldChmaXhlZElkKSk7XG4gICAgICAgICAgICAgIHBvc2l0aW9uICs9IHBvc2l0aW9uTWFwLmdldChmaXhlZElkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChmaXhlZElkLCBub2RlSW5kZXhlcy5oYXMoZml4ZWRJZCkgPyB5Q29vcmRzW25vZGVJbmRleGVzLmdldChmaXhlZElkKV0gOiBkdW1teVBvc2l0aW9ucy5nZXQoZml4ZWRJZCkpO1xuICAgICAgICAgICAgICBwb3NpdGlvbiArPSBwb3NpdGlvbk1hcC5nZXQoZml4ZWRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiAvIGZpeGVkSWRzLmxlbmd0aDtcbiAgICAgICAgICBjb21wb25lbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBpZiAoIWZpeGVkTm9kZXMuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KG5vZGVJZCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBfcG9zaXRpb24gPSAwO1xuICAgICAgICAgIGNvbXBvbmVudC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gXCJob3Jpem9udGFsXCIpIHtcbiAgICAgICAgICAgICAgX3Bvc2l0aW9uICs9IG5vZGVJbmRleGVzLmhhcyhub2RlSWQpID8geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0gOiBkdW1teVBvc2l0aW9ucy5nZXQobm9kZUlkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIF9wb3NpdGlvbiArPSBub2RlSW5kZXhlcy5oYXMobm9kZUlkKSA/IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KG5vZGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX3Bvc2l0aW9uID0gX3Bvc2l0aW9uIC8gY29tcG9uZW50Lmxlbmd0aDtcbiAgICAgICAgICBjb21wb25lbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQobm9kZUlkLCBfcG9zaXRpb24pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgcG9zaXRpb25zIG9mIHRoZSBub2Rlc1xuXG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICB2YXIgY3VycmVudE5vZGUgPSBxdWV1ZS5zaGlmdCgpO1xuICAgICAgdmFyIG5laWdoYm9ycyA9IGdyYXBoLmdldChjdXJyZW50Tm9kZSk7XG4gICAgICBuZWlnaGJvcnMuZm9yRWFjaChmdW5jdGlvbiAobmVpZ2hib3IpIHtcbiAgICAgICAgaWYgKHBvc2l0aW9uTWFwLmdldChuZWlnaGJvci5pZCkgPCBwb3NpdGlvbk1hcC5nZXQoY3VycmVudE5vZGUpICsgbmVpZ2hib3IuZ2FwKSB7XG4gICAgICAgICAgaWYgKGZpeGVkTm9kZXMgJiYgZml4ZWROb2Rlcy5oYXMobmVpZ2hib3IuaWQpKSB7XG4gICAgICAgICAgICB2YXIgZml4ZWRQb3NpdGlvbiA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gXCJob3Jpem9udGFsXCIpIHtcbiAgICAgICAgICAgICAgZml4ZWRQb3NpdGlvbiA9IG5vZGVJbmRleGVzLmhhcyhuZWlnaGJvci5pZCkgPyB4Q29vcmRzW25vZGVJbmRleGVzLmdldChuZWlnaGJvci5pZCldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KG5laWdoYm9yLmlkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZpeGVkUG9zaXRpb24gPSBub2RlSW5kZXhlcy5oYXMobmVpZ2hib3IuaWQpID8geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobmVpZ2hib3IuaWQpXSA6IGR1bW15UG9zaXRpb25zLmdldChuZWlnaGJvci5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQobmVpZ2hib3IuaWQsIGZpeGVkUG9zaXRpb24pOyAvLyBUT0RPOiBtYXkgZG8gdW5uZWNlc3Nhcnkgd29ya1xuICAgICAgICAgICAgaWYgKGZpeGVkUG9zaXRpb24gPCBwb3NpdGlvbk1hcC5nZXQoY3VycmVudE5vZGUpICsgbmVpZ2hib3IuZ2FwKSB7XG4gICAgICAgICAgICAgIHZhciBkaWZmID0gcG9zaXRpb25NYXAuZ2V0KGN1cnJlbnROb2RlKSArIG5laWdoYm9yLmdhcCAtIGZpeGVkUG9zaXRpb247XG4gICAgICAgICAgICAgIHBhc3RNYXAuZ2V0KGN1cnJlbnROb2RlKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQobm9kZUlkLCBwb3NpdGlvbk1hcC5nZXQobm9kZUlkKSAtIGRpZmYpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KG5laWdoYm9yLmlkLCBwb3NpdGlvbk1hcC5nZXQoY3VycmVudE5vZGUpICsgbmVpZ2hib3IuZ2FwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW5EZWdyZWVzLnNldChuZWlnaGJvci5pZCwgaW5EZWdyZWVzLmdldChuZWlnaGJvci5pZCkgLSAxKTtcbiAgICAgICAgaWYgKGluRGVncmVlcy5nZXQobmVpZ2hib3IuaWQpID09IDApIHtcbiAgICAgICAgICBxdWV1ZS5wdXNoKG5laWdoYm9yLmlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZml4ZWROb2Rlcykge1xuICAgICAgICAgIHBhc3RNYXAuc2V0KG5laWdoYm9yLmlkLCBzZXRVbmlvbihwYXN0TWFwLmdldChjdXJyZW50Tm9kZSksIHBhc3RNYXAuZ2V0KG5laWdoYm9yLmlkKSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPSAwKSB7XG4gICAgICBfbG9vcCgpO1xuICAgIH1cblxuICAgIC8vIHJlYWRqdXN0IHBvc2l0aW9uIG9mIHRoZSBub2RlcyBhZnRlciBlbmZvcmNlbWVudFxuICAgIGlmIChmaXhlZE5vZGVzKSB7XG4gICAgICAvLyBmaW5kIGluZGVncmVlIGNvdW50IGZvciBlYWNoIG5vZGVcbiAgICAgIHZhciBzaW5rTm9kZXMgPSBuZXcgU2V0KCk7XG5cbiAgICAgIGdyYXBoLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgc2lua05vZGVzLmFkZChrZXkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdmFyIF9jb21wb25lbnRzID0gW107XG4gICAgICBwYXN0TWFwLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgaWYgKHNpbmtOb2Rlcy5oYXMoa2V5KSkge1xuICAgICAgICAgIHZhciBpc0ZpeGVkQ29tcG9uZW50ID0gZmFsc2U7XG4gICAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yID0gdHJ1ZTtcbiAgICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IyID0gZmFsc2U7XG4gICAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yMiA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gdmFsdWVbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDI7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSAoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiA9IHRydWUpIHtcbiAgICAgICAgICAgICAgdmFyIG5vZGVJZCA9IF9zdGVwMi52YWx1ZTtcblxuICAgICAgICAgICAgICBpZiAoZml4ZWROb2Rlcy5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgICAgIGlzRml4ZWRDb21wb25lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvcjIgPSB0cnVlO1xuICAgICAgICAgICAgX2l0ZXJhdG9yRXJyb3IyID0gZXJyO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yICYmIF9pdGVyYXRvcjIucmV0dXJuKSB7XG4gICAgICAgICAgICAgICAgX2l0ZXJhdG9yMi5yZXR1cm4oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMikge1xuICAgICAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yMjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghaXNGaXhlZENvbXBvbmVudCkge1xuICAgICAgICAgICAgdmFyIGlzRXhpc3QgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBleGlzdEF0ID0gdm9pZCAwO1xuICAgICAgICAgICAgX2NvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50LCBpbmRleCkge1xuICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmhhcyhbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHZhbHVlKSlbMF0pKSB7XG4gICAgICAgICAgICAgICAgaXNFeGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZXhpc3RBdCA9IGluZGV4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghaXNFeGlzdCkge1xuICAgICAgICAgICAgICBfY29tcG9uZW50cy5wdXNoKG5ldyBTZXQodmFsdWUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgICAgIF9jb21wb25lbnRzW2V4aXN0QXRdLmFkZChlbGUpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBfY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQsIGluZGV4KSB7XG4gICAgICAgIHZhciBtaW5CZWZvcmUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIHZhciBtaW5BZnRlciA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgdmFyIG1heEJlZm9yZSA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICAgICAgdmFyIG1heEFmdGVyID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuXG4gICAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMyA9IHRydWU7XG4gICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjMgPSBmYWxzZTtcbiAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yMyA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjMgPSBjb21wb25lbnRbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDM7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjMgPSAoX3N0ZXAzID0gX2l0ZXJhdG9yMy5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMyA9IHRydWUpIHtcbiAgICAgICAgICAgIHZhciBub2RlSWQgPSBfc3RlcDMudmFsdWU7XG5cbiAgICAgICAgICAgIHZhciBwb3NCZWZvcmUgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICAgICAgICAgIHBvc0JlZm9yZSA9IG5vZGVJbmRleGVzLmhhcyhub2RlSWQpID8geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0gOiBkdW1teVBvc2l0aW9ucy5nZXQobm9kZUlkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBvc0JlZm9yZSA9IG5vZGVJbmRleGVzLmhhcyhub2RlSWQpID8geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0gOiBkdW1teVBvc2l0aW9ucy5nZXQobm9kZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBwb3NBZnRlciA9IHBvc2l0aW9uTWFwLmdldChub2RlSWQpO1xuICAgICAgICAgICAgaWYgKHBvc0JlZm9yZSA8IG1pbkJlZm9yZSkge1xuICAgICAgICAgICAgICBtaW5CZWZvcmUgPSBwb3NCZWZvcmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9zQmVmb3JlID4gbWF4QmVmb3JlKSB7XG4gICAgICAgICAgICAgIG1heEJlZm9yZSA9IHBvc0JlZm9yZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb3NBZnRlciA8IG1pbkFmdGVyKSB7XG4gICAgICAgICAgICAgIG1pbkFmdGVyID0gcG9zQWZ0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9zQWZ0ZXIgPiBtYXhBZnRlcikge1xuICAgICAgICAgICAgICBtYXhBZnRlciA9IHBvc0FmdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IzID0gdHJ1ZTtcbiAgICAgICAgICBfaXRlcmF0b3JFcnJvcjMgPSBlcnI7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjMgJiYgX2l0ZXJhdG9yMy5yZXR1cm4pIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yMy5yZXR1cm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMykge1xuICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRpZmYgPSAobWluQmVmb3JlICsgbWF4QmVmb3JlKSAvIDIgLSAobWluQWZ0ZXIgKyBtYXhBZnRlcikgLyAyO1xuXG4gICAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNCA9IHRydWU7XG4gICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjQgPSBmYWxzZTtcbiAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yNCA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjQgPSBjb21wb25lbnRbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDQ7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjQgPSAoX3N0ZXA0ID0gX2l0ZXJhdG9yNC5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNCA9IHRydWUpIHtcbiAgICAgICAgICAgIHZhciBfbm9kZUlkID0gX3N0ZXA0LnZhbHVlO1xuXG4gICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQoX25vZGVJZCwgcG9zaXRpb25NYXAuZ2V0KF9ub2RlSWQpICsgZGlmZik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvcjQgPSB0cnVlO1xuICAgICAgICAgIF9pdGVyYXRvckVycm9yNCA9IGVycjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNCAmJiBfaXRlcmF0b3I0LnJldHVybikge1xuICAgICAgICAgICAgICBfaXRlcmF0b3I0LnJldHVybigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3I0KSB7XG4gICAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwb3NpdGlvbk1hcDtcbiAgfTtcblxuICAvLyBmaW5kIHRyYW5zZm9ybWF0aW9uIGJhc2VkIG9uIHJlbC4gcGxhY2VtZW50IGNvbnN0cmFpbnRzIGlmIHRoZXJlIGFyZSBib3RoIGFsaWdubWVudCBhbmQgcmVsLiBwbGFjZW1lbnQgY29uc3RyYWludHNcbiAgLy8gb3IgaWYgdGhlcmUgYXJlIG9ubHkgcmVsLiBwbGFjZW1lbnQgY29udHJhaW50cyB3aGVyZSB0aGUgbGFyZ2VzdCBjb21wb25lbnQgaXNuJ3Qgc3VmZmljaWVudGx5IGxhcmdlXG4gIHZhciBhcHBseVJlZmxlY3Rpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudCA9IGZ1bmN0aW9uIGFwcGx5UmVmbGVjdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50KHJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludHMpIHtcbiAgICAvLyB2YXJpYWJsZXMgdG8gY291bnQgdm90ZXNcbiAgICB2YXIgcmVmbGVjdE9uWSA9IDAsXG4gICAgICAgIG5vdFJlZmxlY3RPblkgPSAwO1xuICAgIHZhciByZWZsZWN0T25YID0gMCxcbiAgICAgICAgbm90UmVmbGVjdE9uWCA9IDA7XG5cbiAgICByZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgIGlmIChjb25zdHJhaW50LmxlZnQpIHtcbiAgICAgICAgeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQoY29uc3RyYWludC5sZWZ0KV0gLSB4Q29vcmRzW25vZGVJbmRleGVzLmdldChjb25zdHJhaW50LnJpZ2h0KV0gPj0gMCA/IHJlZmxlY3RPblkrKyA6IG5vdFJlZmxlY3RPblkrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGNvbnN0cmFpbnQudG9wKV0gLSB5Q29vcmRzW25vZGVJbmRleGVzLmdldChjb25zdHJhaW50LmJvdHRvbSldID49IDAgPyByZWZsZWN0T25YKysgOiBub3RSZWZsZWN0T25YKys7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAocmVmbGVjdE9uWSA+IG5vdFJlZmxlY3RPblkgJiYgcmVmbGVjdE9uWCA+IG5vdFJlZmxlY3RPblgpIHtcbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBub2RlSW5kZXhlcy5zaXplOyBfaSsrKSB7XG4gICAgICAgIHhDb29yZHNbX2ldID0gLTEgKiB4Q29vcmRzW19pXTtcbiAgICAgICAgeUNvb3Jkc1tfaV0gPSAtMSAqIHlDb29yZHNbX2ldO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVmbGVjdE9uWSA+IG5vdFJlZmxlY3RPblkpIHtcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG5vZGVJbmRleGVzLnNpemU7IF9pMisrKSB7XG4gICAgICAgIHhDb29yZHNbX2kyXSA9IC0xICogeENvb3Jkc1tfaTJdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVmbGVjdE9uWCA+IG5vdFJlZmxlY3RPblgpIHtcbiAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IG5vZGVJbmRleGVzLnNpemU7IF9pMysrKSB7XG4gICAgICAgIHlDb29yZHNbX2kzXSA9IC0xICogeUNvb3Jkc1tfaTNdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBmaW5kIHdlYWtseSBjb25uZWN0ZWQgY29tcG9uZW50cyBpbiB1bmRpcmVjdGVkIGdyYXBoXG4gIHZhciBmaW5kQ29tcG9uZW50cyA9IGZ1bmN0aW9uIGZpbmRDb21wb25lbnRzKGdyYXBoKSB7XG4gICAgLy8gZmluZCB3ZWFrbHkgY29ubmVjdGVkIGNvbXBvbmVudHMgaW4gZGFnXG4gICAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgICB2YXIgcXVldWUgPSBuZXcgTGlua2VkTGlzdCgpO1xuICAgIHZhciB2aXNpdGVkID0gbmV3IFNldCgpO1xuICAgIHZhciBjb3VudCA9IDA7XG5cbiAgICBncmFwaC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGtleSkpIHtcbiAgICAgICAgY29tcG9uZW50c1tjb3VudF0gPSBbXTtcbiAgICAgICAgdmFyIF9jdXJyZW50Tm9kZSA9IGtleTtcbiAgICAgICAgcXVldWUucHVzaChfY3VycmVudE5vZGUpO1xuICAgICAgICB2aXNpdGVkLmFkZChfY3VycmVudE5vZGUpO1xuICAgICAgICBjb21wb25lbnRzW2NvdW50XS5wdXNoKF9jdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgX2N1cnJlbnROb2RlID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICB2YXIgbmVpZ2hib3JzID0gZ3JhcGguZ2V0KF9jdXJyZW50Tm9kZSk7XG4gICAgICAgICAgbmVpZ2hib3JzLmZvckVhY2goZnVuY3Rpb24gKG5laWdoYm9yKSB7XG4gICAgICAgICAgICBpZiAoIXZpc2l0ZWQuaGFzKG5laWdoYm9yLmlkKSkge1xuICAgICAgICAgICAgICBxdWV1ZS5wdXNoKG5laWdoYm9yLmlkKTtcbiAgICAgICAgICAgICAgdmlzaXRlZC5hZGQobmVpZ2hib3IuaWQpO1xuICAgICAgICAgICAgICBjb21wb25lbnRzW2NvdW50XS5wdXNoKG5laWdoYm9yLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb3VudCsrO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjb21wb25lbnRzO1xuICB9O1xuXG4gIC8vIHJldHVybiB1bmRpcmVjdGVkIHZlcnNpb24gb2YgZ2l2ZW4gZGFnXG4gIHZhciBkYWdUb1VuZGlyZWN0ZWQgPSBmdW5jdGlvbiBkYWdUb1VuZGlyZWN0ZWQoZGFnKSB7XG4gICAgdmFyIHVuZGlyZWN0ZWQgPSBuZXcgTWFwKCk7XG5cbiAgICBkYWcuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgdW5kaXJlY3RlZC5zZXQoa2V5LCBbXSk7XG4gICAgfSk7XG5cbiAgICBkYWcuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAoYWRqYWNlbnQpIHtcbiAgICAgICAgdW5kaXJlY3RlZC5nZXQoa2V5KS5wdXNoKGFkamFjZW50KTtcbiAgICAgICAgdW5kaXJlY3RlZC5nZXQoYWRqYWNlbnQuaWQpLnB1c2goeyBpZDoga2V5LCBnYXA6IGFkamFjZW50LmdhcCwgZGlyZWN0aW9uOiBhZGphY2VudC5kaXJlY3Rpb24gfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB1bmRpcmVjdGVkO1xuICB9O1xuXG4gIC8vIHJldHVybiByZXZlcnNlZCAoZGlyZWN0aW9ucyBpbnZlcnRlZCkgdmVyc2lvbiBvZiBnaXZlbiBkYWdcbiAgdmFyIGRhZ1RvUmV2ZXJzZWQgPSBmdW5jdGlvbiBkYWdUb1JldmVyc2VkKGRhZykge1xuICAgIHZhciByZXZlcnNlZCA9IG5ldyBNYXAoKTtcblxuICAgIGRhZy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICByZXZlcnNlZC5zZXQoa2V5LCBbXSk7XG4gICAgfSk7XG5cbiAgICBkYWcuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAoYWRqYWNlbnQpIHtcbiAgICAgICAgcmV2ZXJzZWQuZ2V0KGFkamFjZW50LmlkKS5wdXNoKHsgaWQ6IGtleSwgZ2FwOiBhZGphY2VudC5nYXAsIGRpcmVjdGlvbjogYWRqYWNlbnQuZGlyZWN0aW9uIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmV2ZXJzZWQ7XG4gIH07XG5cbiAgLyoqKiogIGFwcGx5IHRyYW5zZm9ybWF0aW9uIHRvIHRoZSBpbml0aWFsIGRyYWZ0IGxheW91dCB0byBiZXR0ZXIgYWxpZ24gd2l0aCBjb25zdHJhaW5lZCBub2RlcyAqKioqL1xuICAvLyBzb2x2ZSB0aGUgT3J0aG9nb25hbCBQcm9jcnVzdGVhbiBQcm9ibGVtIHRvIHJvdGF0ZSBhbmQvb3IgcmVmbGVjdCBpbml0aWFsIGRyYWZ0IGxheW91dFxuICAvLyBoZXJlIHdlIGZvbGxvdyB0aGUgc29sdXRpb24gaW4gQ2hhcHRlciAyMC4yIG9mIEJvcmcsIEkuICYgR3JvZW5lbiwgUC4gKDIwMDUpIE1vZGVybiBNdWx0aWRpbWVuc2lvbmFsIFNjYWxpbmc6IFRoZW9yeSBhbmQgQXBwbGljYXRpb25zIFxuXG4gIC8qIGNvbnN0cnVjdCBzb3VyY2UgYW5kIHRhcmdldCBjb25maWd1cmF0aW9ucyAqL1xuXG4gIHZhciB0YXJnZXRNYXRyaXggPSBbXTsgLy8gQSAtIHRhcmdldCBjb25maWd1cmF0aW9uXG4gIHZhciBzb3VyY2VNYXRyaXggPSBbXTsgLy8gQiAtIHNvdXJjZSBjb25maWd1cmF0aW9uIFxuICB2YXIgc3RhbmRhcmRUcmFuc2Zvcm1hdGlvbiA9IGZhbHNlOyAvLyBmYWxzZSBmb3Igbm8gdHJhbnNmb3JtYXRpb24sIHRydWUgZm9yIHN0YW5kYXJ0IChQcm9jcnVzdGVzKSB0cmFuc2Zvcm1hdGlvbiAocm90YXRpb24gYW5kL29yIHJlZmxlY3Rpb24pXG4gIHZhciByZWZsZWN0aW9uVHlwZSA9IGZhbHNlOyAvLyBmYWxzZS90cnVlIGZvciByZWZsZWN0aW9uIGNoZWNrLCAncmVmbGVjdE9uWCcsICdyZWZsZWN0T25ZJyBvciAncmVmbGVjdE9uQm90aCcgZm9yIHJlZmxlY3Rpb24gdHlwZSBpZiBuZWNlc3NhcnlcbiAgdmFyIGZpeGVkTm9kZXMgPSBuZXcgU2V0KCk7XG4gIHZhciBkYWcgPSBuZXcgTWFwKCk7IC8vIGFkamFjZW5jeSBsaXN0IHRvIGtlZXAgZGlyZWN0ZWQgYWN5Y2xpYyBncmFwaCAoZGFnKSB0aGF0IGNvbnNpc3RzIG9mIHJlbGF0aXZlIHBsYWNlbWVudCBjb25zdHJhaW50c1xuICB2YXIgZGFnVW5kaXJlY3RlZCA9IG5ldyBNYXAoKTsgLy8gdW5kaXJlY3RlZCB2ZXJzaW9uIG9mIHRoZSBkYWdcbiAgdmFyIGNvbXBvbmVudHMgPSBbXTsgLy8gd2Vha2x5IGNvbm5lY3RlZCBjb21wb25lbnRzXG5cbiAgLy8gZmlsbCBmaXhlZE5vZGVzIGNvbGxlY3Rpb24gdG8gdXNlIGxhdGVyXG4gIGlmIChjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50KSB7XG4gICAgY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlRGF0YSkge1xuICAgICAgZml4ZWROb2Rlcy5hZGQobm9kZURhdGEubm9kZUlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGNvbnN0cnVjdCBkYWcgZnJvbSByZWxhdGl2ZSBwbGFjZW1lbnQgY29uc3RyYWludHMgXG4gIGlmIChjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcbiAgICAvLyBjb25zdHJ1Y3QgYm90aCBkaXJlY3RlZCBhbmQgdW5kaXJlY3RlZCB2ZXJzaW9uIG9mIHRoZSBkYWdcbiAgICBjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgaWYgKGNvbnN0cmFpbnQubGVmdCkge1xuICAgICAgICBpZiAoZGFnLmhhcyhjb25zdHJhaW50LmxlZnQpKSB7XG4gICAgICAgICAgZGFnLmdldChjb25zdHJhaW50LmxlZnQpLnB1c2goeyBpZDogY29uc3RyYWludC5yaWdodCwgZ2FwOiBjb25zdHJhaW50LmdhcCwgZGlyZWN0aW9uOiBcImhvcml6b250YWxcIiB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkYWcuc2V0KGNvbnN0cmFpbnQubGVmdCwgW3sgaWQ6IGNvbnN0cmFpbnQucmlnaHQsIGdhcDogY29uc3RyYWludC5nYXAsIGRpcmVjdGlvbjogXCJob3Jpem9udGFsXCIgfV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGFnLmhhcyhjb25zdHJhaW50LnJpZ2h0KSkge1xuICAgICAgICAgIGRhZy5zZXQoY29uc3RyYWludC5yaWdodCwgW10pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZGFnLmhhcyhjb25zdHJhaW50LnRvcCkpIHtcbiAgICAgICAgICBkYWcuZ2V0KGNvbnN0cmFpbnQudG9wKS5wdXNoKHsgaWQ6IGNvbnN0cmFpbnQuYm90dG9tLCBnYXA6IGNvbnN0cmFpbnQuZ2FwLCBkaXJlY3Rpb246IFwidmVydGljYWxcIiB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkYWcuc2V0KGNvbnN0cmFpbnQudG9wLCBbeyBpZDogY29uc3RyYWludC5ib3R0b20sIGdhcDogY29uc3RyYWludC5nYXAsIGRpcmVjdGlvbjogXCJ2ZXJ0aWNhbFwiIH1dKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRhZy5oYXMoY29uc3RyYWludC5ib3R0b20pKSB7XG4gICAgICAgICAgZGFnLnNldChjb25zdHJhaW50LmJvdHRvbSwgW10pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBkYWdVbmRpcmVjdGVkID0gZGFnVG9VbmRpcmVjdGVkKGRhZyk7XG4gICAgY29tcG9uZW50cyA9IGZpbmRDb21wb25lbnRzKGRhZ1VuZGlyZWN0ZWQpO1xuICB9XG5cbiAgaWYgKENvU0VDb25zdGFudHMuVFJBTlNGT1JNX09OX0NPTlNUUkFJTlRfSEFORExJTkcpIHtcbiAgICAvLyBmaXJzdCBjaGVjayBmaXhlZCBub2RlIGNvbnN0cmFpbnRcbiAgICBpZiAoY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludCAmJiBjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50Lmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZURhdGEsIGkpIHtcbiAgICAgICAgdGFyZ2V0TWF0cml4W2ldID0gW25vZGVEYXRhLnBvc2l0aW9uLngsIG5vZGVEYXRhLnBvc2l0aW9uLnldO1xuICAgICAgICBzb3VyY2VNYXRyaXhbaV0gPSBbeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZURhdGEubm9kZUlkKV0sIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVEYXRhLm5vZGVJZCldXTtcbiAgICAgIH0pO1xuICAgICAgc3RhbmRhcmRUcmFuc2Zvcm1hdGlvbiA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50KSB7XG4gICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyB0aGVuIGNoZWNrIGFsaWdubWVudCBjb25zdHJhaW50XG4gICAgICAgIHZhciBjb3VudCA9IDA7XG4gICAgICAgIGlmIChjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsKSB7XG4gICAgICAgICAgdmFyIHZlcnRpY2FsQWxpZ24gPSBjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsO1xuXG4gICAgICAgICAgdmFyIF9sb29wMiA9IGZ1bmN0aW9uIF9sb29wMihfaTQpIHtcbiAgICAgICAgICAgIHZhciBhbGlnbm1lbnRTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICB2ZXJ0aWNhbEFsaWduW19pNF0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgIGFsaWdubWVudFNldC5hZGQobm9kZUlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IG5ldyBTZXQoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShhbGlnbm1lbnRTZXQpKS5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZpeGVkTm9kZXMuaGFzKHgpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgdmFyIHhQb3MgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoaW50ZXJzZWN0aW9uLnNpemUgPiAwKSB4UG9zID0geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQoaW50ZXJzZWN0aW9uLnZhbHVlcygpLm5leHQoKS52YWx1ZSldO2Vsc2UgeFBvcyA9IGNhbGN1bGF0ZUF2Z1Bvc2l0aW9uKGFsaWdubWVudFNldCkueDtcblxuICAgICAgICAgICAgdmVydGljYWxBbGlnbltfaTRdLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICB0YXJnZXRNYXRyaXhbY291bnRdID0gW3hQb3MsIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldXTtcbiAgICAgICAgICAgICAgc291cmNlTWF0cml4W2NvdW50XSA9IFt4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSwgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV1dO1xuICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IHZlcnRpY2FsQWxpZ24ubGVuZ3RoOyBfaTQrKykge1xuICAgICAgICAgICAgX2xvb3AyKF9pNCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YW5kYXJkVHJhbnNmb3JtYXRpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWwpIHtcbiAgICAgICAgICB2YXIgaG9yaXpvbnRhbEFsaWduID0gY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsO1xuXG4gICAgICAgICAgdmFyIF9sb29wMyA9IGZ1bmN0aW9uIF9sb29wMyhfaTUpIHtcbiAgICAgICAgICAgIHZhciBhbGlnbm1lbnRTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBob3Jpem9udGFsQWxpZ25bX2k1XS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgYWxpZ25tZW50U2V0LmFkZChub2RlSWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgaW50ZXJzZWN0aW9uID0gbmV3IFNldChbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGFsaWdubWVudFNldCkpLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICByZXR1cm4gZml4ZWROb2Rlcy5oYXMoeCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB2YXIgeVBvcyA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmIChpbnRlcnNlY3Rpb24uc2l6ZSA+IDApIHlQb3MgPSB4Q29vcmRzW25vZGVJbmRleGVzLmdldChpbnRlcnNlY3Rpb24udmFsdWVzKCkubmV4dCgpLnZhbHVlKV07ZWxzZSB5UG9zID0gY2FsY3VsYXRlQXZnUG9zaXRpb24oYWxpZ25tZW50U2V0KS55O1xuXG4gICAgICAgICAgICBob3Jpem9udGFsQWxpZ25bX2k1XS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgdGFyZ2V0TWF0cml4W2NvdW50XSA9IFt4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSwgeVBvc107XG4gICAgICAgICAgICAgIHNvdXJjZU1hdHJpeFtjb3VudF0gPSBbeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0sIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldXTtcbiAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBob3Jpem9udGFsQWxpZ24ubGVuZ3RoOyBfaTUrKykge1xuICAgICAgICAgICAgX2xvb3AzKF9pNSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YW5kYXJkVHJhbnNmb3JtYXRpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcbiAgICAgICAgICByZWZsZWN0aW9uVHlwZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG4gICAgfSBlbHNlIGlmIChjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcbiAgICAgIC8vIGZpbmFsbHkgY2hlY2sgcmVsYXRpdmUgcGxhY2VtZW50IGNvbnN0cmFpbnRcbiAgICAgIC8vIGZpbmQgbGFyZ2VzdCBjb21wb25lbnQgaW4gZGFnXG4gICAgICB2YXIgbGFyZ2VzdENvbXBvbmVudFNpemUgPSAwO1xuICAgICAgdmFyIGxhcmdlc3RDb21wb25lbnRJbmRleCA9IDA7XG4gICAgICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBjb21wb25lbnRzLmxlbmd0aDsgX2k2KyspIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudHNbX2k2XS5sZW5ndGggPiBsYXJnZXN0Q29tcG9uZW50U2l6ZSkge1xuICAgICAgICAgIGxhcmdlc3RDb21wb25lbnRTaXplID0gY29tcG9uZW50c1tfaTZdLmxlbmd0aDtcbiAgICAgICAgICBsYXJnZXN0Q29tcG9uZW50SW5kZXggPSBfaTY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGlmIGxhcmdlc3QgY29tcG9uZW50IGlzbid0IGRvbWluYW50LCB0aGVuIHRha2UgdGhlIHZvdGVzIGZvciByZWZsZWN0aW9uXG4gICAgICBpZiAobGFyZ2VzdENvbXBvbmVudFNpemUgPCBkYWdVbmRpcmVjdGVkLnNpemUgLyAyKSB7XG4gICAgICAgIGFwcGx5UmVmbGVjdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50KGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCk7XG4gICAgICAgIHN0YW5kYXJkVHJhbnNmb3JtYXRpb24gPSBmYWxzZTtcbiAgICAgICAgcmVmbGVjdGlvblR5cGUgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHVzZSBsYXJnZXN0IGNvbXBvbmVudCBmb3IgdHJhbnNmb3JtYXRpb25cbiAgICAgICAgLy8gY29uc3RydWN0IGhvcml6b250YWwgYW5kIHZlcnRpY2FsIHN1YmdyYXBocyBpbiB0aGUgbGFyZ2VzdCBjb21wb25lbnRcbiAgICAgICAgdmFyIHN1YkdyYXBoT25Ib3Jpem9udGFsID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgc3ViR3JhcGhPblZlcnRpY2FsID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgY29uc3RyYWludHNJbmxhcmdlc3RDb21wb25lbnQgPSBbXTtcblxuICAgICAgICBjb21wb25lbnRzW2xhcmdlc3RDb21wb25lbnRJbmRleF0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgZGFnLmdldChub2RlSWQpLmZvckVhY2goZnVuY3Rpb24gKGFkamFjZW50KSB7XG4gICAgICAgICAgICBpZiAoYWRqYWNlbnQuZGlyZWN0aW9uID09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICAgICAgICAgIGlmIChzdWJHcmFwaE9uSG9yaXpvbnRhbC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgICAgIHN1YkdyYXBoT25Ib3Jpem9udGFsLmdldChub2RlSWQpLnB1c2goYWRqYWNlbnQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN1YkdyYXBoT25Ib3Jpem9udGFsLnNldChub2RlSWQsIFthZGphY2VudF0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghc3ViR3JhcGhPbkhvcml6b250YWwuaGFzKGFkamFjZW50LmlkKSkge1xuICAgICAgICAgICAgICAgIHN1YkdyYXBoT25Ib3Jpem9udGFsLnNldChhZGphY2VudC5pZCwgW10pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0cmFpbnRzSW5sYXJnZXN0Q29tcG9uZW50LnB1c2goeyBsZWZ0OiBub2RlSWQsIHJpZ2h0OiBhZGphY2VudC5pZCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChzdWJHcmFwaE9uVmVydGljYWwuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgICAgICBzdWJHcmFwaE9uVmVydGljYWwuZ2V0KG5vZGVJZCkucHVzaChhZGphY2VudCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3ViR3JhcGhPblZlcnRpY2FsLnNldChub2RlSWQsIFthZGphY2VudF0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghc3ViR3JhcGhPblZlcnRpY2FsLmhhcyhhZGphY2VudC5pZCkpIHtcbiAgICAgICAgICAgICAgICBzdWJHcmFwaE9uVmVydGljYWwuc2V0KGFkamFjZW50LmlkLCBbXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3RyYWludHNJbmxhcmdlc3RDb21wb25lbnQucHVzaCh7IHRvcDogbm9kZUlkLCBib3R0b206IGFkamFjZW50LmlkIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBhcHBseVJlZmxlY3Rpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChjb25zdHJhaW50c0lubGFyZ2VzdENvbXBvbmVudCk7XG4gICAgICAgIHJlZmxlY3Rpb25UeXBlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIGFwcHJvcHJpYXRlIHBvc2l0aW9uaW5nIGZvciBzdWJncmFwaHNcbiAgICAgICAgdmFyIHBvc2l0aW9uTWFwSG9yaXpvbnRhbCA9IGZpbmRBcHByb3ByaWF0ZVBvc2l0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQoc3ViR3JhcGhPbkhvcml6b250YWwsIFwiaG9yaXpvbnRhbFwiKTtcbiAgICAgICAgdmFyIHBvc2l0aW9uTWFwVmVydGljYWwgPSBmaW5kQXBwcm9wcmlhdGVQb3NpdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50KHN1YkdyYXBoT25WZXJ0aWNhbCwgXCJ2ZXJ0aWNhbFwiKTtcblxuICAgICAgICAvLyBjb25zdHJ1Y3Qgc291cmNlIGFuZCB0YXJnZXQgY29uZmlndXJhdGlvblxuICAgICAgICBjb21wb25lbnRzW2xhcmdlc3RDb21wb25lbnRJbmRleF0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkLCBpKSB7XG4gICAgICAgICAgc291cmNlTWF0cml4W2ldID0gW3hDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldLCB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXV07XG4gICAgICAgICAgdGFyZ2V0TWF0cml4W2ldID0gW107XG4gICAgICAgICAgaWYgKHBvc2l0aW9uTWFwSG9yaXpvbnRhbC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgdGFyZ2V0TWF0cml4W2ldWzBdID0gcG9zaXRpb25NYXBIb3Jpem9udGFsLmdldChub2RlSWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRNYXRyaXhbaV1bMF0gPSB4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHBvc2l0aW9uTWFwVmVydGljYWwuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgIHRhcmdldE1hdHJpeFtpXVsxXSA9IHBvc2l0aW9uTWFwVmVydGljYWwuZ2V0KG5vZGVJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldE1hdHJpeFtpXVsxXSA9IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3RhbmRhcmRUcmFuc2Zvcm1hdGlvbiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgdHJhbnNmb3JtYXRpb24gaXMgcmVxdWlyZWQsIHRoZW4gY2FsY3VsYXRlIGFuZCBhcHBseSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXhcbiAgICBpZiAoc3RhbmRhcmRUcmFuc2Zvcm1hdGlvbikge1xuICAgICAgLyogY2FsY3VsYXRlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAqL1xuICAgICAgdmFyIHRyYW5zZm9ybWF0aW9uTWF0cml4ID0gdm9pZCAwO1xuICAgICAgdmFyIHRhcmdldE1hdHJpeFRyYW5zcG9zZSA9IE1hdHJpeC50cmFuc3Bvc2UodGFyZ2V0TWF0cml4KTsgLy8gQSdcbiAgICAgIHZhciBzb3VyY2VNYXRyaXhUcmFuc3Bvc2UgPSBNYXRyaXgudHJhbnNwb3NlKHNvdXJjZU1hdHJpeCk7IC8vIEInXG5cbiAgICAgIC8vIGNlbnRyYWxpemUgdHJhbnNwb3NlIG1hdHJpY2VzXG4gICAgICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCB0YXJnZXRNYXRyaXhUcmFuc3Bvc2UubGVuZ3RoOyBfaTcrKykge1xuICAgICAgICB0YXJnZXRNYXRyaXhUcmFuc3Bvc2VbX2k3XSA9IE1hdHJpeC5tdWx0R2FtbWEodGFyZ2V0TWF0cml4VHJhbnNwb3NlW19pN10pO1xuICAgICAgICBzb3VyY2VNYXRyaXhUcmFuc3Bvc2VbX2k3XSA9IE1hdHJpeC5tdWx0R2FtbWEoc291cmNlTWF0cml4VHJhbnNwb3NlW19pN10pO1xuICAgICAgfVxuXG4gICAgICAvLyBkbyBhY3R1YWwgY2FsY3VsYXRpb24gZm9yIHRyYW5zZm9ybWF0aW9uIG1hdHJpeFxuICAgICAgdmFyIHRlbXBNYXRyaXggPSBNYXRyaXgubXVsdE1hdCh0YXJnZXRNYXRyaXhUcmFuc3Bvc2UsIE1hdHJpeC50cmFuc3Bvc2Uoc291cmNlTWF0cml4VHJhbnNwb3NlKSk7IC8vIHRlbXBNYXRyaXggPSBBJ0JcbiAgICAgIHZhciBTVkRSZXN1bHQgPSBTVkQuc3ZkKHRlbXBNYXRyaXgpOyAvLyBTVkQoQSdCKSA9IFVTVicsIHN2ZCBmdW5jdGlvbiByZXR1cm5zIFUsIFMgYW5kIFYgXG4gICAgICB0cmFuc2Zvcm1hdGlvbk1hdHJpeCA9IE1hdHJpeC5tdWx0TWF0KFNWRFJlc3VsdC5WLCBNYXRyaXgudHJhbnNwb3NlKFNWRFJlc3VsdC5VKSk7IC8vIHRyYW5zZm9ybWF0aW9uTWF0cml4ID0gVCA9IFZVJ1xuXG4gICAgICAvKiBhcHBseSBmb3VuZCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdG8gb2J0YWluIGZpbmFsIGRyYWZ0IGxheW91dCAqL1xuICAgICAgZm9yICh2YXIgX2k4ID0gMDsgX2k4IDwgbm9kZUluZGV4ZXMuc2l6ZTsgX2k4KyspIHtcbiAgICAgICAgdmFyIHRlbXAxID0gW3hDb29yZHNbX2k4XSwgeUNvb3Jkc1tfaThdXTtcbiAgICAgICAgdmFyIHRlbXAyID0gW3RyYW5zZm9ybWF0aW9uTWF0cml4WzBdWzBdLCB0cmFuc2Zvcm1hdGlvbk1hdHJpeFsxXVswXV07XG4gICAgICAgIHZhciB0ZW1wMyA9IFt0cmFuc2Zvcm1hdGlvbk1hdHJpeFswXVsxXSwgdHJhbnNmb3JtYXRpb25NYXRyaXhbMV1bMV1dO1xuICAgICAgICB4Q29vcmRzW19pOF0gPSBNYXRyaXguZG90UHJvZHVjdCh0ZW1wMSwgdGVtcDIpO1xuICAgICAgICB5Q29vcmRzW19pOF0gPSBNYXRyaXguZG90UHJvZHVjdCh0ZW1wMSwgdGVtcDMpO1xuICAgICAgfVxuXG4gICAgICAvLyBhcHBsaWVkIG9ubHkgYm90aCBhbGlnbm1lbnQgYW5kIHJlbC4gcGxhY2VtZW50IGNvbnN0cmFpbnRzIGV4aXN0XG4gICAgICBpZiAocmVmbGVjdGlvblR5cGUpIHtcbiAgICAgICAgYXBwbHlSZWZsZWN0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQoY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoQ29TRUNvbnN0YW50cy5FTkZPUkNFX0NPTlNUUkFJTlRTKSB7XG4gICAgLyoqKiogIGVuZm9yY2UgY29uc3RyYWludHMgb24gdGhlIHRyYW5zZm9ybWVkIGRyYWZ0IGxheW91dCAqKioqL1xuXG4gICAgLyogZmlyc3QgZW5mb3JjZSBmaXhlZCBub2RlIGNvbnN0cmFpbnQgKi9cblxuICAgIGlmIChjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50ICYmIGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIHRyYW5zbGF0aW9uQW1vdW50ID0geyB4OiAwLCB5OiAwIH07XG4gICAgICBjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVEYXRhLCBpKSB7XG4gICAgICAgIHZhciBwb3NJblRoZW9yeSA9IHsgeDogeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZURhdGEubm9kZUlkKV0sIHk6IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVEYXRhLm5vZGVJZCldIH07XG4gICAgICAgIHZhciBwb3NEZXNpcmVkID0gbm9kZURhdGEucG9zaXRpb247XG4gICAgICAgIHZhciBwb3NEaWZmID0gY2FsY3VsYXRlUG9zaXRpb25EaWZmKHBvc0Rlc2lyZWQsIHBvc0luVGhlb3J5KTtcbiAgICAgICAgdHJhbnNsYXRpb25BbW91bnQueCArPSBwb3NEaWZmLng7XG4gICAgICAgIHRyYW5zbGF0aW9uQW1vdW50LnkgKz0gcG9zRGlmZi55O1xuICAgICAgfSk7XG4gICAgICB0cmFuc2xhdGlvbkFtb3VudC54IC89IGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQubGVuZ3RoO1xuICAgICAgdHJhbnNsYXRpb25BbW91bnQueSAvPSBjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50Lmxlbmd0aDtcblxuICAgICAgeENvb3Jkcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwgaSkge1xuICAgICAgICB4Q29vcmRzW2ldICs9IHRyYW5zbGF0aW9uQW1vdW50Lng7XG4gICAgICB9KTtcblxuICAgICAgeUNvb3Jkcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwgaSkge1xuICAgICAgICB5Q29vcmRzW2ldICs9IHRyYW5zbGF0aW9uQW1vdW50Lnk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlRGF0YSkge1xuICAgICAgICB4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlRGF0YS5ub2RlSWQpXSA9IG5vZGVEYXRhLnBvc2l0aW9uLng7XG4gICAgICAgIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVEYXRhLm5vZGVJZCldID0gbm9kZURhdGEucG9zaXRpb24ueTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qIHRoZW4gZW5mb3JjZSBhbGlnbm1lbnQgY29uc3RyYWludCAqL1xuXG4gICAgaWYgKGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQpIHtcbiAgICAgIGlmIChjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsKSB7XG4gICAgICAgIHZhciB4QWxpZ24gPSBjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsO1xuXG4gICAgICAgIHZhciBfbG9vcDQgPSBmdW5jdGlvbiBfbG9vcDQoX2k5KSB7XG4gICAgICAgICAgdmFyIGFsaWdubWVudFNldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICB4QWxpZ25bX2k5XS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIGFsaWdubWVudFNldC5hZGQobm9kZUlkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgaW50ZXJzZWN0aW9uID0gbmV3IFNldChbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGFsaWdubWVudFNldCkpLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIGZpeGVkTm9kZXMuaGFzKHgpO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgICB2YXIgeFBvcyA9IHZvaWQgMDtcbiAgICAgICAgICBpZiAoaW50ZXJzZWN0aW9uLnNpemUgPiAwKSB4UG9zID0geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQoaW50ZXJzZWN0aW9uLnZhbHVlcygpLm5leHQoKS52YWx1ZSldO2Vsc2UgeFBvcyA9IGNhbGN1bGF0ZUF2Z1Bvc2l0aW9uKGFsaWdubWVudFNldCkueDtcblxuICAgICAgICAgIGFsaWdubWVudFNldC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIGlmICghZml4ZWROb2Rlcy5oYXMobm9kZUlkKSkgeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0gPSB4UG9zO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAodmFyIF9pOSA9IDA7IF9pOSA8IHhBbGlnbi5sZW5ndGg7IF9pOSsrKSB7XG4gICAgICAgICAgX2xvb3A0KF9pOSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWwpIHtcbiAgICAgICAgdmFyIHlBbGlnbiA9IGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbDtcblxuICAgICAgICB2YXIgX2xvb3A1ID0gZnVuY3Rpb24gX2xvb3A1KF9pMTApIHtcbiAgICAgICAgICB2YXIgYWxpZ25tZW50U2V0ID0gbmV3IFNldCgpO1xuICAgICAgICAgIHlBbGlnbltfaTEwXS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIGFsaWdubWVudFNldC5hZGQobm9kZUlkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgaW50ZXJzZWN0aW9uID0gbmV3IFNldChbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGFsaWdubWVudFNldCkpLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIGZpeGVkTm9kZXMuaGFzKHgpO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgICB2YXIgeVBvcyA9IHZvaWQgMDtcbiAgICAgICAgICBpZiAoaW50ZXJzZWN0aW9uLnNpemUgPiAwKSB5UG9zID0geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQoaW50ZXJzZWN0aW9uLnZhbHVlcygpLm5leHQoKS52YWx1ZSldO2Vsc2UgeVBvcyA9IGNhbGN1bGF0ZUF2Z1Bvc2l0aW9uKGFsaWdubWVudFNldCkueTtcblxuICAgICAgICAgIGFsaWdubWVudFNldC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIGlmICghZml4ZWROb2Rlcy5oYXMobm9kZUlkKSkgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0gPSB5UG9zO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAodmFyIF9pMTAgPSAwOyBfaTEwIDwgeUFsaWduLmxlbmd0aDsgX2kxMCsrKSB7XG4gICAgICAgICAgX2xvb3A1KF9pMTApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogZmluYWxseSBlbmZvcmNlIHJlbGF0aXZlIHBsYWNlbWVudCBjb25zdHJhaW50ICovXG5cbiAgICBpZiAoY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB7XG4gICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBkdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBkdW1teVBvc2l0aW9uc0ZvclZlcnRpY2FsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgZHVtbXlQb3NpdGlvbnNGb3JIb3Jpem9udGFsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgZml4ZWROb2Rlc09uSG9yaXpvbnRhbCA9IG5ldyBTZXQoKTtcbiAgICAgICAgdmFyIGZpeGVkTm9kZXNPblZlcnRpY2FsID0gbmV3IFNldCgpO1xuXG4gICAgICAgIC8vIGZpbGwgbWFwcyBhbmQgc2V0cyAgICAgIFxuICAgICAgICBmaXhlZE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgIGZpeGVkTm9kZXNPbkhvcml6b250YWwuYWRkKG5vZGVJZCk7XG4gICAgICAgICAgZml4ZWROb2Rlc09uVmVydGljYWwuYWRkKG5vZGVJZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50KSB7XG4gICAgICAgICAgaWYgKGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWwpIHtcbiAgICAgICAgICAgIHZhciB2ZXJ0aWNhbEFsaWdubWVudCA9IGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWw7XG5cbiAgICAgICAgICAgIHZhciBfbG9vcDYgPSBmdW5jdGlvbiBfbG9vcDYoX2kxMSkge1xuICAgICAgICAgICAgICBkdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LnNldChcImR1bW15XCIgKyBfaTExLCBbXSk7XG4gICAgICAgICAgICAgIHZlcnRpY2FsQWxpZ25tZW50W19pMTFdLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICAgIG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuc2V0KG5vZGVJZCwgXCJkdW1teVwiICsgX2kxMSk7XG4gICAgICAgICAgICAgICAgZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoXCJkdW1teVwiICsgX2kxMSkucHVzaChub2RlSWQpO1xuICAgICAgICAgICAgICAgIGlmIChmaXhlZE5vZGVzLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICAgICAgICBmaXhlZE5vZGVzT25Ib3Jpem9udGFsLmFkZChcImR1bW15XCIgKyBfaTExKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBkdW1teVBvc2l0aW9uc0ZvclZlcnRpY2FsQWxpZ25tZW50LnNldChcImR1bW15XCIgKyBfaTExLCB4Q29vcmRzW25vZGVJbmRleGVzLmdldCh2ZXJ0aWNhbEFsaWdubWVudFtfaTExXVswXSldKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGZvciAodmFyIF9pMTEgPSAwOyBfaTExIDwgdmVydGljYWxBbGlnbm1lbnQubGVuZ3RoOyBfaTExKyspIHtcbiAgICAgICAgICAgICAgX2xvb3A2KF9pMTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsKSB7XG4gICAgICAgICAgICB2YXIgaG9yaXpvbnRhbEFsaWdubWVudCA9IGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbDtcblxuICAgICAgICAgICAgdmFyIF9sb29wNyA9IGZ1bmN0aW9uIF9sb29wNyhfaTEyKSB7XG4gICAgICAgICAgICAgIGR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5zZXQoXCJkdW1teVwiICsgX2kxMiwgW10pO1xuICAgICAgICAgICAgICBob3Jpem9udGFsQWxpZ25tZW50W19pMTJdLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICAgIG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5zZXQobm9kZUlkLCBcImR1bW15XCIgKyBfaTEyKTtcbiAgICAgICAgICAgICAgICBkdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KFwiZHVtbXlcIiArIF9pMTIpLnB1c2gobm9kZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAoZml4ZWROb2Rlcy5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgICAgICAgZml4ZWROb2Rlc09uVmVydGljYWwuYWRkKFwiZHVtbXlcIiArIF9pMTIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGR1bW15UG9zaXRpb25zRm9ySG9yaXpvbnRhbEFsaWdubWVudC5zZXQoXCJkdW1teVwiICsgX2kxMiwgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQoaG9yaXpvbnRhbEFsaWdubWVudFtfaTEyXVswXSldKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGZvciAodmFyIF9pMTIgPSAwOyBfaTEyIDwgaG9yaXpvbnRhbEFsaWdubWVudC5sZW5ndGg7IF9pMTIrKykge1xuICAgICAgICAgICAgICBfbG9vcDcoX2kxMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uc3RydWN0IGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGRhZ3MgKHN1YmdyYXBocykgZnJvbSBvdmVyYWxsIGRhZ1xuICAgICAgICB2YXIgZGFnT25Ib3Jpem9udGFsID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgZGFnT25WZXJ0aWNhbCA9IG5ldyBNYXAoKTtcblxuICAgICAgICB2YXIgX2xvb3A4ID0gZnVuY3Rpb24gX2xvb3A4KG5vZGVJZCkge1xuICAgICAgICAgIGRhZy5nZXQobm9kZUlkKS5mb3JFYWNoKGZ1bmN0aW9uIChhZGphY2VudCkge1xuICAgICAgICAgICAgdmFyIHNvdXJjZUlkID0gdm9pZCAwO1xuICAgICAgICAgICAgdmFyIHRhcmdldE5vZGUgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoYWRqYWNlbnRbXCJkaXJlY3Rpb25cIl0gPT0gXCJob3Jpem9udGFsXCIpIHtcbiAgICAgICAgICAgICAgc291cmNlSWQgPSBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChub2RlSWQpID8gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQobm9kZUlkKSA6IG5vZGVJZDtcbiAgICAgICAgICAgICAgaWYgKG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGFkamFjZW50LmlkKSkge1xuICAgICAgICAgICAgICAgIHRhcmdldE5vZGUgPSB7IGlkOiBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChhZGphY2VudC5pZCksIGdhcDogYWRqYWNlbnQuZ2FwLCBkaXJlY3Rpb246IGFkamFjZW50LmRpcmVjdGlvbiB9O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldE5vZGUgPSBhZGphY2VudDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZGFnT25Ib3Jpem9udGFsLmhhcyhzb3VyY2VJZCkpIHtcbiAgICAgICAgICAgICAgICBkYWdPbkhvcml6b250YWwuZ2V0KHNvdXJjZUlkKS5wdXNoKHRhcmdldE5vZGUpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhZ09uSG9yaXpvbnRhbC5zZXQoc291cmNlSWQsIFt0YXJnZXROb2RlXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFkYWdPbkhvcml6b250YWwuaGFzKHRhcmdldE5vZGUuaWQpKSB7XG4gICAgICAgICAgICAgICAgZGFnT25Ib3Jpem9udGFsLnNldCh0YXJnZXROb2RlLmlkLCBbXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNvdXJjZUlkID0gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChub2RlSWQpID8gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChub2RlSWQpIDogbm9kZUlkO1xuICAgICAgICAgICAgICBpZiAobm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChhZGphY2VudC5pZCkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXROb2RlID0geyBpZDogbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChhZGphY2VudC5pZCksIGdhcDogYWRqYWNlbnQuZ2FwLCBkaXJlY3Rpb246IGFkamFjZW50LmRpcmVjdGlvbiB9O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldE5vZGUgPSBhZGphY2VudDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZGFnT25WZXJ0aWNhbC5oYXMoc291cmNlSWQpKSB7XG4gICAgICAgICAgICAgICAgZGFnT25WZXJ0aWNhbC5nZXQoc291cmNlSWQpLnB1c2godGFyZ2V0Tm9kZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGFnT25WZXJ0aWNhbC5zZXQoc291cmNlSWQsIFt0YXJnZXROb2RlXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFkYWdPblZlcnRpY2FsLmhhcyh0YXJnZXROb2RlLmlkKSkge1xuICAgICAgICAgICAgICAgIGRhZ09uVmVydGljYWwuc2V0KHRhcmdldE5vZGUuaWQsIFtdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNSA9IHRydWU7XG4gICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjUgPSBmYWxzZTtcbiAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yNSA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjUgPSBkYWcua2V5cygpW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA1OyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb241ID0gKF9zdGVwNSA9IF9pdGVyYXRvcjUubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjUgPSB0cnVlKSB7XG4gICAgICAgICAgICB2YXIgbm9kZUlkID0gX3N0ZXA1LnZhbHVlO1xuXG4gICAgICAgICAgICBfbG9vcDgobm9kZUlkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBmaW5kIHNvdXJjZSBub2RlcyBvZiBlYWNoIGNvbXBvbmVudCBpbiBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBkYWdzXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yNSA9IHRydWU7XG4gICAgICAgICAgX2l0ZXJhdG9yRXJyb3I1ID0gZXJyO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb241ICYmIF9pdGVyYXRvcjUucmV0dXJuKSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvcjUucmV0dXJuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjUpIHtcbiAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I1O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB1bmRpcmVjdGVkT25Ib3Jpem9udGFsID0gZGFnVG9VbmRpcmVjdGVkKGRhZ09uSG9yaXpvbnRhbCk7XG4gICAgICAgIHZhciB1bmRpcmVjdGVkT25WZXJ0aWNhbCA9IGRhZ1RvVW5kaXJlY3RlZChkYWdPblZlcnRpY2FsKTtcbiAgICAgICAgdmFyIGNvbXBvbmVudHNPbkhvcml6b250YWwgPSBmaW5kQ29tcG9uZW50cyh1bmRpcmVjdGVkT25Ib3Jpem9udGFsKTtcbiAgICAgICAgdmFyIGNvbXBvbmVudHNPblZlcnRpY2FsID0gZmluZENvbXBvbmVudHModW5kaXJlY3RlZE9uVmVydGljYWwpO1xuICAgICAgICB2YXIgcmV2ZXJzZWREYWdPbkhvcml6b250YWwgPSBkYWdUb1JldmVyc2VkKGRhZ09uSG9yaXpvbnRhbCk7XG4gICAgICAgIHZhciByZXZlcnNlZERhZ09uVmVydGljYWwgPSBkYWdUb1JldmVyc2VkKGRhZ09uVmVydGljYWwpO1xuICAgICAgICB2YXIgY29tcG9uZW50U291cmNlc09uSG9yaXpvbnRhbCA9IFtdO1xuICAgICAgICB2YXIgY29tcG9uZW50U291cmNlc09uVmVydGljYWwgPSBbXTtcblxuICAgICAgICBjb21wb25lbnRzT25Ib3Jpem9udGFsLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgICBjb21wb25lbnRTb3VyY2VzT25Ib3Jpem9udGFsW2luZGV4XSA9IFtdO1xuICAgICAgICAgIGNvbXBvbmVudC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIGlmIChyZXZlcnNlZERhZ09uSG9yaXpvbnRhbC5nZXQobm9kZUlkKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICBjb21wb25lbnRTb3VyY2VzT25Ib3Jpem9udGFsW2luZGV4XS5wdXNoKG5vZGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbXBvbmVudHNPblZlcnRpY2FsLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgICBjb21wb25lbnRTb3VyY2VzT25WZXJ0aWNhbFtpbmRleF0gPSBbXTtcbiAgICAgICAgICBjb21wb25lbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBpZiAocmV2ZXJzZWREYWdPblZlcnRpY2FsLmdldChub2RlSWQpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudFNvdXJjZXNPblZlcnRpY2FsW2luZGV4XS5wdXNoKG5vZGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBhcHByb3ByaWF0ZSBwb3NpdGlvbmluZyBmb3Igc3ViZ3JhcGhzXG4gICAgICAgIHZhciBwb3NpdGlvbk1hcEhvcml6b250YWwgPSBmaW5kQXBwcm9wcmlhdGVQb3NpdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50KGRhZ09uSG9yaXpvbnRhbCwgXCJob3Jpem9udGFsXCIsIGZpeGVkTm9kZXNPbkhvcml6b250YWwsIGR1bW15UG9zaXRpb25zRm9yVmVydGljYWxBbGlnbm1lbnQsIGNvbXBvbmVudFNvdXJjZXNPbkhvcml6b250YWwpO1xuICAgICAgICB2YXIgcG9zaXRpb25NYXBWZXJ0aWNhbCA9IGZpbmRBcHByb3ByaWF0ZVBvc2l0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQoZGFnT25WZXJ0aWNhbCwgXCJ2ZXJ0aWNhbFwiLCBmaXhlZE5vZGVzT25WZXJ0aWNhbCwgZHVtbXlQb3NpdGlvbnNGb3JIb3Jpem9udGFsQWxpZ25tZW50LCBjb21wb25lbnRTb3VyY2VzT25WZXJ0aWNhbCk7XG5cbiAgICAgICAgLy8gdXBkYXRlIHBvc2l0aW9ucyBvZiB0aGUgbm9kZXMgYmFzZWQgb24gcmVsYXRpdmUgcGxhY2VtZW50IGNvbnN0cmFpbnRzXG5cbiAgICAgICAgdmFyIF9sb29wOSA9IGZ1bmN0aW9uIF9sb29wOShrZXkpIHtcbiAgICAgICAgICBpZiAoZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoa2V5KSkge1xuICAgICAgICAgICAgZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoa2V5KS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0gPSBwb3NpdGlvbk1hcEhvcml6b250YWwuZ2V0KGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQoa2V5KV0gPSBwb3NpdGlvbk1hcEhvcml6b250YWwuZ2V0KGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNiA9IHRydWU7XG4gICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjYgPSBmYWxzZTtcbiAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yNiA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjYgPSBwb3NpdGlvbk1hcEhvcml6b250YWwua2V5cygpW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA2OyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb242ID0gKF9zdGVwNiA9IF9pdGVyYXRvcjYubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjYgPSB0cnVlKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gX3N0ZXA2LnZhbHVlO1xuXG4gICAgICAgICAgICBfbG9vcDkoa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yNiA9IHRydWU7XG4gICAgICAgICAgX2l0ZXJhdG9yRXJyb3I2ID0gZXJyO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb242ICYmIF9pdGVyYXRvcjYucmV0dXJuKSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvcjYucmV0dXJuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjYpIHtcbiAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfbG9vcDEwID0gZnVuY3Rpb24gX2xvb3AxMChrZXkpIHtcbiAgICAgICAgICBpZiAoZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChrZXkpKSB7XG4gICAgICAgICAgICBkdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGtleSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldID0gcG9zaXRpb25NYXBWZXJ0aWNhbC5nZXQoa2V5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB5Q29vcmRzW25vZGVJbmRleGVzLmdldChrZXkpXSA9IHBvc2l0aW9uTWFwVmVydGljYWwuZ2V0KGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNyA9IHRydWU7XG4gICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjcgPSBmYWxzZTtcbiAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yNyA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjcgPSBwb3NpdGlvbk1hcFZlcnRpY2FsLmtleXMoKVtTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwNzsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNyA9IChfc3RlcDcgPSBfaXRlcmF0b3I3Lm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb243ID0gdHJ1ZSkge1xuICAgICAgICAgICAgdmFyIGtleSA9IF9zdGVwNy52YWx1ZTtcblxuICAgICAgICAgICAgX2xvb3AxMChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3I3ID0gdHJ1ZTtcbiAgICAgICAgICBfaXRlcmF0b3JFcnJvcjcgPSBlcnI7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjcgJiYgX2l0ZXJhdG9yNy5yZXR1cm4pIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yNy5yZXR1cm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yNykge1xuICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFzc2lnbiBuZXcgY29vcmRpbmF0ZXMgdG8gbm9kZXMgYWZ0ZXIgY29uc3RyYWludCBoYW5kbGluZ1xuICBmb3IgKHZhciBfaTEzID0gMDsgX2kxMyA8IGFsbE5vZGVzLmxlbmd0aDsgX2kxMysrKSB7XG4gICAgdmFyIF9ub2RlID0gYWxsTm9kZXNbX2kxM107XG4gICAgaWYgKF9ub2RlLmdldENoaWxkKCkgPT0gbnVsbCkge1xuICAgICAgX25vZGUuc2V0Q2VudGVyKHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KF9ub2RlLmlkKV0sIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KF9ub2RlLmlkKV0pO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb25zdHJhaW50SGFuZGxlcjtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU1MTpcbi8qKiovICgobW9kdWxlKSA9PiB7XG5cbm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNTUxX187XG5cbi8qKiovIH0pXG5cbi8qKioqKiovIFx0fSk7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcbi8qKioqKiovIFx0XHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi8gXHRcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvLyBzdGFydHVwXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHQvLyBUaGlzIGVudHJ5IG1vZHVsZSBpcyByZWZlcmVuY2VkIGJ5IG90aGVyIG1vZHVsZXMgc28gaXQgY2FuJ3QgYmUgaW5saW5lZFxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDUpO1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19leHBvcnRzX187XG4vKioqKioqLyB9KSgpXG47XG59KTsiLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLl9kYXNoLXVuZG8tcmVkbyB7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIGJvdHRvbTogMzBweDtcbiAgICBsZWZ0OiAzMHB4O1xuICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgei1pbmRleDogOTk5OTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7XG5cbn1cbi5fZGFzaC11bmRvLXJlZG8+ZGl2IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4uX2Rhc2gtdW5kby1yZWRvLWxpbmsge1xuICAgIGNvbG9yOiAjMDA3NEQ5O1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG9wYWNpdHk6IDAuMjtcbn1cbi5fZGFzaC11bmRvLXJlZG8tbGluazpob3ZlciB7XG4gICAgb3BhY2l0eTogMTtcbn1cbi5fZGFzaC11bmRvLXJlZG8tbGluayAuX2Rhc2gtaWNvbi11bmRvIHtcbiAgICBmb250LXNpemU6IDIwcHg7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTtcbn1cbi5fZGFzaC11bmRvLXJlZG8tbGluayAuX2Rhc2gtaWNvbi1yZWRvIHtcbiAgICBmb250LXNpemU6IDIwcHg7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpO1xufVxuLl9kYXNoLXVuZG8tcmVkby1saW5rIC5fZGFzaC11bmRvLXJlZG8tbGFiZWwge1xuICAgIGZvbnQtc2l6ZTogMTVweDtcbn1cbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2NvbXBvbmVudHMvY29yZS9Ub29sYmFyLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGVBQWU7SUFDZixZQUFZO0lBQ1osVUFBVTtJQUNWLGVBQWU7SUFDZixrQkFBa0I7SUFDbEIsYUFBYTtJQUNiLDBDQUEwQzs7QUFFOUM7QUFDQTtJQUNJLGtCQUFrQjtBQUN0QjtBQUNBO0lBQ0ksY0FBYztJQUNkLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsa0JBQWtCO0lBQ2xCLHFCQUFxQjtJQUNyQixZQUFZO0FBQ2hCO0FBQ0E7SUFDSSxVQUFVO0FBQ2Q7QUFDQTtJQUNJLGVBQWU7SUFDZix5QkFBeUI7QUFDN0I7QUFDQTtJQUNJLGVBQWU7SUFDZix3QkFBd0I7QUFDNUI7QUFDQTtJQUNJLGVBQWU7QUFDbkJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLl9kYXNoLXVuZG8tcmVkbyB7XFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXG4gICAgYm90dG9tOiAzMHB4O1xcbiAgICBsZWZ0OiAzMHB4O1xcbiAgICBmb250LXNpemU6IDIwcHg7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgei1pbmRleDogOTk5OTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcblxcbn1cXG4uX2Rhc2gtdW5kby1yZWRvPmRpdiB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuLl9kYXNoLXVuZG8tcmVkby1saW5rIHtcXG4gICAgY29sb3I6ICMwMDc0RDk7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XFxuICAgIG1hcmdpbi1yaWdodDogMTBweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBvcGFjaXR5OiAwLjI7XFxufVxcbi5fZGFzaC11bmRvLXJlZG8tbGluazpob3ZlciB7XFxuICAgIG9wYWNpdHk6IDE7XFxufVxcbi5fZGFzaC11bmRvLXJlZG8tbGluayAuX2Rhc2gtaWNvbi11bmRvIHtcXG4gICAgZm9udC1zaXplOiAyMHB4O1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpO1xcbn1cXG4uX2Rhc2gtdW5kby1yZWRvLWxpbmsgLl9kYXNoLWljb24tcmVkbyB7XFxuICAgIGZvbnQtc2l6ZTogMjBweDtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpO1xcbn1cXG4uX2Rhc2gtdW5kby1yZWRvLWxpbmsgLl9kYXNoLXVuZG8tcmVkby1sYWJlbCB7XFxuICAgIGZvbnQtc2l6ZTogMTVweDtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAuZGFzaC1jYWxsYmFjay1kYWctLWNvbnRhaW5lciB7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICBib3R0b206IDE2NXB4O1xuICAgIHJpZ2h0OiAxNnB4O1xuICAgIHdpZHRoOiA4MHZ3O1xuICAgIGhlaWdodDogY2FsYygxMDB2aCAtIDE4MHB4KTtcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIC8qIHNoYWRvdy0xICovXG4gICAgYm94LXNoYWRvdzogMHB4IDZweCAxNnB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjE2NSksXG4gICAgICAgIDBweCAycHggNnB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjEyKSxcbiAgICAgICAgMHB4IDBweCAxcHggcmdiYSg4MCwgMTAzLCAxMzIsIDAuMzIpO1xufVxuXG4uZGFzaC1jYWxsYmFjay1kYWctLWluZm8ge1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcGFkZGluZzogOHB4O1xuICAgIGJvdHRvbTogMTZweDtcbiAgICBsZWZ0OiAxNnB4O1xuICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gMzJweCk7XG4gICAgbWF4LWhlaWdodDogNTAlO1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjkpO1xuICAgIGJvcmRlcjogMnB4IHNvbGlkICNjY2M7XG4gICAgZm9udC1mYW1pbHk6IFwiQXJpYWxcIiwgc2Fucy1zZXJpZjtcbn1cblxuLmRhc2gtY2FsbGJhY2stZGFnLS1tZXNzYWdlIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgbGluZS1oZWlnaHQ6IDJlbTtcbiAgICBmb250LWZhbWlseTogXCJBcmlhbFwiLCBzYW5zLXNlcmlmO1xufVxuXG4uZGFzaC1jYWxsYmFjay1kYWctLWxheW91dFNlbGVjdG9yIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAxMHB4O1xuICAgIHJpZ2h0OiAxMHB4O1xufVxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY29tcG9uZW50cy9lcnJvci9DYWxsYmFja0dyYXBoL0NhbGxiYWNrR3JhcGhDb250YWluZXIuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZixhQUFhO0lBQ2IsV0FBVztJQUNYLFdBQVc7SUFDWCwyQkFBMkI7SUFDM0IsY0FBYztJQUNkLHNCQUFzQjtJQUN0QixtQkFBbUI7SUFDbkIscUJBQXFCO0lBQ3JCLGFBQWE7SUFDYjs7NENBRXdDO0FBQzVDOztBQUVBO0lBQ0ksa0JBQWtCO0lBQ2xCLGtCQUFrQjtJQUNsQixZQUFZO0lBQ1osWUFBWTtJQUNaLFVBQVU7SUFDViw0QkFBNEI7SUFDNUIsZUFBZTtJQUNmLGNBQWM7SUFDZCxzQkFBc0I7SUFDdEIsaUNBQWlDO0lBQ2pDLHNCQUFzQjtJQUN0QixnQ0FBZ0M7QUFDcEM7O0FBRUE7SUFDSSxhQUFhO0lBQ2Isc0JBQXNCO0lBQ3RCLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsWUFBWTtJQUNaLGdCQUFnQjtJQUNoQixnQ0FBZ0M7QUFDcEM7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsU0FBUztJQUNULFdBQVc7QUFDZlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuZGFzaC1jYWxsYmFjay1kYWctLWNvbnRhaW5lciB7XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcbiAgICBib3R0b206IDE2NXB4O1xcbiAgICByaWdodDogMTZweDtcXG4gICAgd2lkdGg6IDgwdnc7XFxuICAgIGhlaWdodDogY2FsYygxMDB2aCAtIDE4MHB4KTtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgLyogc2hhZG93LTEgKi9cXG4gICAgYm94LXNoYWRvdzogMHB4IDZweCAxNnB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjE2NSksXFxuICAgICAgICAwcHggMnB4IDZweCByZ2JhKDgwLCAxMDMsIDEzMiwgMC4xMiksXFxuICAgICAgICAwcHggMHB4IDFweCByZ2JhKDgwLCAxMDMsIDEzMiwgMC4zMik7XFxufVxcblxcbi5kYXNoLWNhbGxiYWNrLWRhZy0taW5mbyB7XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBwYWRkaW5nOiA4cHg7XFxuICAgIGJvdHRvbTogMTZweDtcXG4gICAgbGVmdDogMTZweDtcXG4gICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSAzMnB4KTtcXG4gICAgbWF4LWhlaWdodDogNTAlO1xcbiAgICBvdmVyZmxvdzogYXV0bztcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjkpO1xcbiAgICBib3JkZXI6IDJweCBzb2xpZCAjY2NjO1xcbiAgICBmb250LWZhbWlseTogXFxcIkFyaWFsXFxcIiwgc2Fucy1zZXJpZjtcXG59XFxuXFxuLmRhc2gtY2FsbGJhY2stZGFnLS1tZXNzYWdlIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGhlaWdodDogMTAwJTtcXG4gICAgbGluZS1oZWlnaHQ6IDJlbTtcXG4gICAgZm9udC1mYW1pbHk6IFxcXCJBcmlhbFxcXCIsIHNhbnMtc2VyaWY7XFxufVxcblxcbi5kYXNoLWNhbGxiYWNrLWRhZy0tbGF5b3V0U2VsZWN0b3Ige1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMTBweDtcXG4gICAgcmlnaHQ6IDEwcHg7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLmVycm9yLWNvbnRhaW5lciB7XG4gICAgbWFyZ2luLXRvcDogMTBweDtcbn1cblxuLmRhc2gtZmUtZXJyb3JfX2ljb24teCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAwO1xuICAgIHRvcDogMDtcbiAgICBjb2xvcjogI0I5QzJDRTtcbiAgICBmb250LXNpemU6IDIwcHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIG1hcmdpbi1yaWdodDogMTBweFxufVxuXG4uZGFzaC1mZS1lcnJvcl9faWNvbi14OmhvdmVyXG57XG4gY29sb3I6I2ExYTliNTtcbn1cblxuXG4uZGFzaC1mZS1lcnJvcnMge1xuICAgIG1pbi13aWR0aDogMzg2cHg7XG4gICAgbWF4LXdpZHRoOiA2NTBweDtcbiAgICBtYXgtaGVpZ2h0OiA0NTBweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi5kYXNoLWZlLWVycm9yX19pY29uLWVycm9yIHtcbiAgICB3aWR0aDogMjBweDtcbiAgICBoZWlnaHQ6IDIwcHg7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbi1yaWdodDogMTZweDtcbn1cbi5kYXNoLWZlLWVycm9yX19pY29uLWNsb3NlIHtcbiAgICB3aWR0aDogMTBweDtcbiAgICBoZWlnaHQ6IDEwcHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAxMnB4O1xuICAgIHRvcDogMTJweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4uZGFzaC1mZS1lcnJvcl9faWNvbi1hcnJvdyB7XG4gICAgd2lkdGg6IDhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgbWFyZ2luOiAwcHggOHB4O1xufVxuLmRhc2gtZmUtZXJyb3ItdG9wIHtcbiAgICBoZWlnaHQ6IDIwcHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuLmRhc2gtZmUtZXJyb3ItdG9wX19ncm91cDpmaXJzdC1jaGlsZCB7XG4gICAgLypcbiAgICAgKiA3NyUgaXMgdGhlIG1heGltdW0gc3BhY2UgYWxsb3dlZCBiYXNlZCBvZmYgb2YgdGhlIG90aGVyIGVsZW1lbnRzXG4gICAgICogaW4gdGhlIHRvcCBwYXJ0IG9mIHRoZSBlcnJvciBjb250YWluZXIgKHRpbWVzdGFtcCAmIGNvbGxhcHNlIGFycm93KS5cbiAgICAgKiB0aGlzIHdhcyBtYW51YWxseSBkZXRlcm1pbmVkICovXG4gICAgd2lkdGg6IDc3JTtcbn1cbi5kYXNoLWZlLWVycm9yLXRvcF9fZ3JvdXAge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG4uZGFzaC1mZS1lcnJvcl9fdGl0bGUge1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgbWFyZ2luOiAwcHg7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICBwYWRkaW5nOiAwcHg7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG4uZGFzaC1mZS1lcnJvcl9fdGltZXN0YW1wIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7XG59XG4uZGFzaC1mZS1lcnJvcl9fY29sbGFwc2UtLWZsaXBwZWQge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbiAgICAtbXMtdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xufVxuXG4uZGFzaC1mZS1lcnJvcl9faW5mb190aXRsZSB7XG4gICAgbWFyZ2luOiAwO1xuICAgIGNvbG9yOiAjNTA2Nzg0O1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmNmZhO1xuICAgIGJvcmRlcjogMnB4IHNvbGlkICNkZmU4ZjM7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7XG4gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDtcbiAgICBwYWRkaW5nOiAxMHB4O1xufVxuXG4uZGFzaC1mZS1lcnJvcl9faW5mbyB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2RmZThmMztcbiAgICBtYXJnaW46IDAgMCAxZW0gMDtcbiAgICBwYWRkaW5nOiAxMHB4O1xuXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcbiAgICBjb2xvcjogIzUwNjc4NDtcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG59XG5cbi5kYXNoLWZlLWVycm9yX19jdXJ2ZWQge1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cblxuLmRhc2gtZmUtZXJyb3JfX2N1cnZlZC10b3Age1xuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDtcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4O1xuICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDBweDtcbn1cblxuLmRhc2gtZmUtZXJyb3JfX2N1cnZlZC1ib3R0b20ge1xuICAgIGJvcmRlci1yYWRpdXMtYm90dG9tLWxlZnQ6IDRweDtcbiAgICBib3JkZXItcmFkaXVzLWJvdHRvbS1yaWdodDogNHB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkVGRUY7XG59XG5cbi5kYXNoLWJlLWVycm9yX19zdCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZkZjNmNDtcbiAgICBtaW4td2lkdGg6IDM4NnB4O1xuICAgIG1heC13aWR0aDogNjUwcHg7XG4gICAgLyogaWZyYW1lIGNvbnRhaW5lciBoYW5kbGVzIHRoZSBzY3JvbGxpbmcgKi9cbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuLmRhc2gtYmUtZXJyb3JfX3N0ciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZkZjNmNDtcbiAgICBtaW4td2lkdGg6IDM4NnB4O1xuICAgIG1heC13aWR0aDogNjUwcHg7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbn1cbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvRnJvbnRFbmQvRnJvbnRFbmRFcnJvci5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsUUFBUTtJQUNSLE1BQU07SUFDTixjQUFjO0lBQ2QsZUFBZTtJQUNmLGVBQWU7SUFDZjtBQUNKOztBQUVBOztDQUVDLGFBQWE7QUFDZDs7O0FBR0E7SUFDSSxnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQixxQkFBcUI7QUFDekI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsWUFBWTtJQUNaLHFCQUFxQjtJQUNyQixrQkFBa0I7QUFDdEI7QUFDQTtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLFdBQVc7SUFDWCxTQUFTO0lBQ1QscUJBQXFCO0FBQ3pCO0FBQ0E7SUFDSSxVQUFVO0lBQ1YsWUFBWTtJQUNaLGVBQWU7QUFDbkI7QUFDQTtJQUNJLFlBQVk7SUFDWixhQUFhO0lBQ2IsOEJBQThCO0lBQzlCLFdBQVc7SUFDWCxlQUFlO0FBQ25CO0FBQ0E7SUFDSTs7O3FDQUdpQztJQUNqQyxVQUFVO0FBQ2Q7QUFDQTtJQUNJLG9CQUFvQjtJQUNwQixtQkFBbUI7QUFDdkI7QUFDQTtJQUNJLGdCQUFnQjtJQUNoQixXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLFlBQVk7SUFDWixlQUFlO0lBQ2YscUJBQXFCO0lBQ3JCLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsZ0JBQWdCO0FBQ3BCO0FBQ0E7SUFDSSxrQkFBa0I7QUFDdEI7QUFDQTtJQUNJLGlDQUFpQztJQUNqQyw2QkFBNkI7SUFDN0IseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0ksU0FBUztJQUNULGNBQWM7SUFDZCxlQUFlO0lBQ2YseUJBQXlCO0lBQ3pCLHlCQUF5QjtJQUN6QixzQkFBc0I7SUFDdEIsMkJBQTJCO0lBQzNCLDRCQUE0QjtJQUM1QixhQUFhO0FBQ2pCOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLGlCQUFpQjtJQUNqQixhQUFhOztJQUViLHVCQUF1QjtJQUN2Qix5QkFBeUI7SUFDekIsY0FBYztJQUNkLGNBQWM7SUFDZCxxQkFBcUI7QUFDekI7O0FBRUE7SUFDSSxrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSwyQkFBMkI7SUFDM0IsNEJBQTRCO0lBQzVCLHdCQUF3QjtBQUM1Qjs7QUFFQTtJQUNJLDhCQUE4QjtJQUM5QiwrQkFBK0I7SUFDL0IseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsMkNBQTJDO0lBQzNDLGdCQUFnQjtJQUNoQixxQkFBcUI7QUFDekI7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixjQUFjO0lBQ2QscUJBQXFCO0lBQ3JCLHFCQUFxQjtBQUN6QlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuZXJyb3ItY29udGFpbmVyIHtcXG4gICAgbWFyZ2luLXRvcDogMTBweDtcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2ljb24teCB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIHRvcDogMDtcXG4gICAgY29sb3I6ICNCOUMyQ0U7XFxuICAgIGZvbnQtc2l6ZTogMjBweDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBtYXJnaW4tcmlnaHQ6IDEwcHhcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2ljb24teDpob3ZlclxcbntcXG4gY29sb3I6I2ExYTliNTtcXG59XFxuXFxuXFxuLmRhc2gtZmUtZXJyb3JzIHtcXG4gICAgbWluLXdpZHRoOiAzODZweDtcXG4gICAgbWF4LXdpZHRoOiA2NTBweDtcXG4gICAgbWF4LWhlaWdodDogNDUwcHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2ljb24tZXJyb3Ige1xcbiAgICB3aWR0aDogMjBweDtcXG4gICAgaGVpZ2h0OiAyMHB4O1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIG1hcmdpbi1yaWdodDogMTZweDtcXG59XFxuLmRhc2gtZmUtZXJyb3JfX2ljb24tY2xvc2Uge1xcbiAgICB3aWR0aDogMTBweDtcXG4gICAgaGVpZ2h0OiAxMHB4O1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHJpZ2h0OiAxMnB4O1xcbiAgICB0b3A6IDEycHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuLmRhc2gtZmUtZXJyb3JfX2ljb24tYXJyb3cge1xcbiAgICB3aWR0aDogOHB4O1xcbiAgICBoZWlnaHQ6IDI4cHg7XFxuICAgIG1hcmdpbjogMHB4IDhweDtcXG59XFxuLmRhc2gtZmUtZXJyb3ItdG9wIHtcXG4gICAgaGVpZ2h0OiAyMHB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5kYXNoLWZlLWVycm9yLXRvcF9fZ3JvdXA6Zmlyc3QtY2hpbGQge1xcbiAgICAvKlxcbiAgICAgKiA3NyUgaXMgdGhlIG1heGltdW0gc3BhY2UgYWxsb3dlZCBiYXNlZCBvZmYgb2YgdGhlIG90aGVyIGVsZW1lbnRzXFxuICAgICAqIGluIHRoZSB0b3AgcGFydCBvZiB0aGUgZXJyb3IgY29udGFpbmVyICh0aW1lc3RhbXAgJiBjb2xsYXBzZSBhcnJvdykuXFxuICAgICAqIHRoaXMgd2FzIG1hbnVhbGx5IGRldGVybWluZWQgKi9cXG4gICAgd2lkdGg6IDc3JTtcXG59XFxuLmRhc2gtZmUtZXJyb3ItdG9wX19ncm91cCB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9fdGl0bGUge1xcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xcbiAgICBtYXJnaW46IDBweDtcXG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcXG4gICAgcGFkZGluZzogMHB4O1xcbiAgICBmb250LXNpemU6IDE0cHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxufVxcbi5kYXNoLWZlLWVycm9yX190aW1lc3RhbXAge1xcbiAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7XFxufVxcbi5kYXNoLWZlLWVycm9yX19jb2xsYXBzZS0tZmxpcHBlZCB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gICAgLW1zLXRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19pbmZvX3RpdGxlIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBjb2xvcjogIzUwNjc4NDtcXG4gICAgZm9udC1zaXplOiAxNnB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmNmZhO1xcbiAgICBib3JkZXI6IDJweCBzb2xpZCAjZGZlOGYzO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7XFxuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7XFxuICAgIHBhZGRpbmc6IDEwcHg7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19pbmZvIHtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2RmZThmMztcXG4gICAgbWFyZ2luOiAwIDAgMWVtIDA7XFxuICAgIHBhZGRpbmc6IDEwcHg7XFxuXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgICBib3JkZXI6IDJweCBzb2xpZCAjZGZlOGYzO1xcbiAgICBjb2xvcjogIzUwNjc4NDtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2N1cnZlZCB7XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2N1cnZlZC10b3Age1xcbiAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7XFxuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7XFxuICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDBweDtcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2N1cnZlZC1ib3R0b20ge1xcbiAgICBib3JkZXItcmFkaXVzLWJvdHRvbS1sZWZ0OiA0cHg7XFxuICAgIGJvcmRlci1yYWRpdXMtYm90dG9tLXJpZ2h0OiA0cHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkVGRUY7XFxufVxcblxcbi5kYXNoLWJlLWVycm9yX19zdCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZGYzZjQ7XFxuICAgIG1pbi13aWR0aDogMzg2cHg7XFxuICAgIG1heC13aWR0aDogNjUwcHg7XFxuICAgIC8qIGlmcmFtZSBjb250YWluZXIgaGFuZGxlcyB0aGUgc2Nyb2xsaW5nICovXFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuXFxuLmRhc2gtYmUtZXJyb3JfX3N0ciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZGYzZjQ7XFxuICAgIG1pbi13aWR0aDogMzg2cHg7XFxuICAgIG1heC13aWR0aDogNjUwcHg7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAuZGFzaC1lcnJvci1tZW51IHtcbiAgICBtYXgtd2lkdGg6IDUwJTtcbiAgICBtYXgtaGVpZ2h0OiA2MCU7XG4gICAgZGlzcGxheTogY29udGVudHM7XG4gICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgZm9udC12YXJpYW50LWxpZ2F0dXJlczogY29tbW9uLWxpZ2F0dXJlcztcbiAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xufVxuXG4uZGFzaC1lcnJvci1jYXJkIHtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIC8qIHNoYWRvdy0xICovXG4gICAgYm94LXNoYWRvdzogMHB4IDZweCAxNnB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjE2NSksXG4gICAgICAgIDBweCAycHggNnB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjEyKSxcbiAgICAgICAgMHB4IDBweCAxcHggcmdiYSg4MCwgMTAzLCAxMzIsIDAuMzIpO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgdG9wOiAxNnB4O1xuICAgIHJpZ2h0OiAxNnB4O1xuICAgIGFuaW1hdGlvbjogZGFzaC1lcnJvci1jYXJkLWFuaW1hdGlvbiAwLjVzO1xuICAgIHBhZGRpbmc6IDI0cHg7XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcblxufVxuLmRhc2gtZXJyb3ItY2FyZC0tYWxlcnRzLXRyYXkge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IC0zMDBweDtcbiAgICBsZWZ0OiAtMXB4O1xuICAgIGFuaW1hdGlvbjogbm9uZTtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNlY2VjZWM7XG4gICAgYm9yZGVyLWJvdHRvbTogMDtcbiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwcHg7XG4gICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDBweDtcbiAgICB3aWR0aDogNDIycHg7XG59XG4uZGFzaC1lcnJvci1jYXJkLS1jb250YWluZXIge1xuICAgIHBhZGRpbmc6IDEwcHggMTBweDtcbiAgICB3aWR0aDogNjAwcHg7XG4gICAgbWF4LXdpZHRoOiA4MDBweDtcbiAgICBtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNTBweCk7XG4gICAgbWFyZ2luOiAxMHB4O1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIHotaW5kZXg6IDExMDA7ICAvKiBhYm92ZSB0aGUgcGxvdGx5LmpzIHRvb2xiYXIgYW5kIEJvb3RzdHJhcCBjb21wb25lbnRzICovXG59XG5cbi5kYXNoLWVycm9yLWNhcmRfX3RvcGJhciB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAzMnB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4uZGFzaC1lcnJvci1jYXJkX19tZXNzYWdlIHtcbiAgICBmb250LXNpemU6IDE0cHg7XG59XG5cbi5kYXNoLWVycm9yLWNhcmRfX21lc3NhZ2UgPiBzdHJvbmcge1xuICAgIGNvbG9yOiAjZmY0NTAwO1xufVxuXG4uZGFzaC1lcnJvci1jYXJkX19jb250ZW50IHtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIHBhZGRpbmc6IDEwcHggMTBweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMjUpLFxuICAgICAgICAwcHggMXB4IDNweCByZ2JhKDE2MiwgMTc3LCAxOTgsIDAuMzIpO1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICBtYXJnaW4tYm90dG9tOiA4cHg7XG59XG5cbi5kYXNoLWVycm9yLWNhcmRfX2xpc3QtaXRlbSB7XG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMjUpLFxuICAgICAgICAwcHggMXB4IDNweCByZ2JhKDE2MiwgMTc3LCAxOTgsIDAuMzIpO1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICBwYWRkaW5nOiAxMHB4IDEwcHg7XG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbkBrZXlmcmFtZXMgZGFzaC1lcnJvci1jYXJkLWFuaW1hdGlvbiB7XG4gICAgZnJvbSB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLjEpO1xuICAgICAgICAtbW96LXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcbiAgICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjEpO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICAgICAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgICAgICAtbXMtdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICB9XG59XG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0dsb2JhbEVycm9yT3ZlcmxheS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxjQUFjO0lBQ2QsZUFBZTtJQUNmLGlCQUFpQjtJQUNqQixzQkFBc0I7SUFDdEIsZUFBZTtJQUNmLHdDQUF3QztJQUN4QyxzQkFBc0I7QUFDMUI7O0FBRUE7SUFDSSxzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLHFCQUFxQjtJQUNyQixhQUFhO0lBQ2I7OzRDQUV3QztJQUN4QyxrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLFNBQVM7SUFDVCxXQUFXO0lBQ1gseUNBQXlDO0lBQ3pDLGFBQWE7SUFDYixnQkFBZ0I7SUFDaEIsdUJBQXVCOztBQUUzQjtBQUNBO0lBQ0ksa0JBQWtCO0lBQ2xCLFdBQVc7SUFDWCxVQUFVO0lBQ1YsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQix5QkFBeUI7SUFDekIsZ0JBQWdCO0lBQ2hCLDhCQUE4QjtJQUM5QiwrQkFBK0I7SUFDL0IsWUFBWTtBQUNoQjtBQUNBO0lBQ0ksa0JBQWtCO0lBQ2xCLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsOEJBQThCO0lBQzlCLFlBQVk7SUFDWixjQUFjO0lBQ2QsYUFBYSxHQUFHLHlEQUF5RDtBQUM3RTs7QUFFQTtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osYUFBYTtJQUNiLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsa0JBQWtCO0FBQ3RCO0FBQ0E7SUFDSSxlQUFlO0FBQ25COztBQUVBO0lBQ0ksY0FBYztBQUNsQjs7QUFFQTtJQUNJLHNCQUFzQjtJQUN0QixrQkFBa0I7SUFDbEIsdUJBQXVCO0lBQ3ZCOzZDQUN5QztJQUN6QyxrQkFBa0I7SUFDbEIsa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksbUJBQW1CO0lBQ25COzZDQUN5QztJQUN6QyxrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixhQUFhO0lBQ2IsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0k7UUFDSSxVQUFVO1FBQ1YsNkJBQTZCO1FBQzdCLDBCQUEwQjtRQUMxQix5QkFBeUI7UUFDekIscUJBQXFCO0lBQ3pCO0lBQ0E7UUFDSSxVQUFVO1FBQ1YsMkJBQTJCO1FBQzNCLHdCQUF3QjtRQUN4Qix1QkFBdUI7UUFDdkIsbUJBQW1CO0lBQ3ZCO0FBQ0pcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLmRhc2gtZXJyb3ItbWVudSB7XFxuICAgIG1heC13aWR0aDogNTAlO1xcbiAgICBtYXgtaGVpZ2h0OiA2MCU7XFxuICAgIGRpc3BsYXk6IGNvbnRlbnRzO1xcbiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xcbiAgICBmb250LXNpemU6IDE0cHg7XFxuICAgIGZvbnQtdmFyaWFudC1saWdhdHVyZXM6IGNvbW1vbi1saWdhdHVyZXM7XFxuICAgIGNvbG9yOiByZ2IoNTAsIDUwLCA1MCk7XFxufVxcblxcbi5kYXNoLWVycm9yLWNhcmQge1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIC8qIHNoYWRvdy0xICovXFxuICAgIGJveC1zaGFkb3c6IDBweCA2cHggMTZweCByZ2JhKDgwLCAxMDMsIDEzMiwgMC4xNjUpLFxcbiAgICAgICAgMHB4IDJweCA2cHggcmdiYSg4MCwgMTAzLCAxMzIsIDAuMTIpLFxcbiAgICAgICAgMHB4IDBweCAxcHggcmdiYSg4MCwgMTAzLCAxMzIsIDAuMzIpO1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXG4gICAgdG9wOiAxNnB4O1xcbiAgICByaWdodDogMTZweDtcXG4gICAgYW5pbWF0aW9uOiBkYXNoLWVycm9yLWNhcmQtYW5pbWF0aW9uIDAuNXM7XFxuICAgIHBhZGRpbmc6IDI0cHg7XFxuICAgIHRleHQtYWxpZ246IGxlZnQ7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcblxcbn1cXG4uZGFzaC1lcnJvci1jYXJkLS1hbGVydHMtdHJheSB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAtMzAwcHg7XFxuICAgIGxlZnQ6IC0xcHg7XFxuICAgIGFuaW1hdGlvbjogbm9uZTtcXG4gICAgYm94LXNoYWRvdzogbm9uZTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2VjZWNlYztcXG4gICAgYm9yZGVyLWJvdHRvbTogMDtcXG4gICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMHB4O1xcbiAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMHB4O1xcbiAgICB3aWR0aDogNDIycHg7XFxufVxcbi5kYXNoLWVycm9yLWNhcmQtLWNvbnRhaW5lciB7XFxuICAgIHBhZGRpbmc6IDEwcHggMTBweDtcXG4gICAgd2lkdGg6IDYwMHB4O1xcbiAgICBtYXgtd2lkdGg6IDgwMHB4O1xcbiAgICBtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNTBweCk7XFxuICAgIG1hcmdpbjogMTBweDtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIHotaW5kZXg6IDExMDA7ICAvKiBhYm92ZSB0aGUgcGxvdGx5LmpzIHRvb2xiYXIgYW5kIEJvb3RzdHJhcCBjb21wb25lbnRzICovXFxufVxcblxcbi5kYXNoLWVycm9yLWNhcmRfX3RvcGJhciB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBoZWlnaHQ6IDMycHg7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcbi5kYXNoLWVycm9yLWNhcmRfX21lc3NhZ2Uge1xcbiAgICBmb250LXNpemU6IDE0cHg7XFxufVxcblxcbi5kYXNoLWVycm9yLWNhcmRfX21lc3NhZ2UgPiBzdHJvbmcge1xcbiAgICBjb2xvcjogI2ZmNDUwMDtcXG59XFxuXFxuLmRhc2gtZXJyb3ItY2FyZF9fY29udGVudCB7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIHBhZGRpbmc6IDEwcHggMTBweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgIGJveC1zaGFkb3c6IDBweCAwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4yNSksXFxuICAgICAgICAwcHggMXB4IDNweCByZ2JhKDE2MiwgMTc3LCAxOTgsIDAuMzIpO1xcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XFxuICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG59XFxuXFxuLmRhc2gtZXJyb3ItY2FyZF9fbGlzdC1pdGVtIHtcXG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcXG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjI1KSxcXG4gICAgICAgIDBweCAxcHggM3B4IHJnYmEoMTYyLCAxNzcsIDE5OCwgMC4zMik7XFxuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcXG4gICAgcGFkZGluZzogMTBweCAxMHB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG5cXG5Aa2V5ZnJhbWVzIGRhc2gtZXJyb3ItY2FyZC1hbmltYXRpb24ge1xcbiAgICBmcm9tIHtcXG4gICAgICAgIG9wYWNpdHk6IDA7XFxuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgICAgIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxLjEpO1xcbiAgICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgfVxcbiAgICB0byB7XFxuICAgICAgICBvcGFjaXR5OiAxO1xcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICAgICAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMSk7XFxuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICB9XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLnBlcmN5LXNob3cge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbkBtZWRpYSBvbmx5IHBlcmN5IHtcbiAgICAucGVyY3ktaGlkZSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICAgIC5wZXJjeS1zaG93IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxufVxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY29tcG9uZW50cy9lcnJvci9QZXJjeS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxhQUFhO0FBQ2pCOztBQUVBO0lBQ0k7UUFDSSxhQUFhO0lBQ2pCO0lBQ0E7UUFDSSxjQUFjO0lBQ2xCO0FBQ0pcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLnBlcmN5LXNob3cge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG5AbWVkaWEgb25seSBwZXJjeSB7XFxuICAgIC5wZXJjeS1oaWRlIHtcXG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIH1cXG4gICAgLnBlcmN5LXNob3cge1xcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XFxuICAgIH1cXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAuZGFzaC1kZWJ1Zy1tZW51IHtcbiAgICB0cmFuc2l0aW9uOiAwLjNzO1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICBib3R0b206IDM1cHg7XG4gICAgcmlnaHQ6IDM1cHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHotaW5kZXg6IDEwMDAxO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMxMTlkZmY7XG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTtcbiAgICB3aWR0aDogNjRweDtcbiAgICBoZWlnaHQ6IDY0cHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuLmRhc2gtZGVidWctbWVudS0tb3BlbiB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoLTE4MGRlZyk7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnU6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMxMDhkZTQ7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX2ljb24ge1xuICAgIHdpZHRoOiBhdXRvO1xuICAgIGhlaWdodDogMjRweDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fb3V0ZXIge1xuICAgIHRyYW5zaXRpb246IDAuM3M7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgYm90dG9tOiAyN3B4O1xuICAgIHJpZ2h0OiAyN3B4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB6LWluZGV4OiAxMDAwMDtcbiAgICBoZWlnaHQ6IDgwcHg7XG4gICAgYm9yZGVyLXJhZGl1czogNDBweDtcbiAgICBwYWRkaW5nOiA1cHggNzhweCA1cHggNXB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjI1KSxcbiAgICAgICAgMHB4IDFweCAzcHggcmdiYSgxNjIsIDE3NywgMTk4LCAwLjMyKTtcbn1cbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyLS1jbG9zZWQge1xuICAgIGhlaWdodDogNjBweDtcbiAgICB3aWR0aDogNjBweDtcbiAgICBib3R0b206IDM3cHg7XG4gICAgcmlnaHQ6IDM3cHg7XG4gICAgcGFkZGluZzogMDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fY29udGVudCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHdpZHRoOiA3NHB4O1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X19idXR0b24ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQjlDMkNFO1xuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgd2lkdGg6IDY0cHg7XG4gICAgaGVpZ2h0OiA2NHB4O1xuICAgIGZvbnQtc2l6ZTogMTBweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XG4gICAgY29sb3I6ICNmZmY7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYTFhOWI1O1xufVxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1lbmFibGVkIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDBDQzk2O1xufVxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1lbmFibGVkOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDNiYjhhO1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tbGFiZWwge1xuICAgIGN1cnNvcjogaW5oZXJpdDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uOjpiZWZvcmUge1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3R0b206IDExMCU7XG4gICAgbGVmdDogNTAlO1xuICAgIG1hcmdpbi1sZWZ0OiAtNjBweDtcbiAgICBwYWRkaW5nOiA3cHg7XG4gICAgd2lkdGg6IDEyMHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDY4LDY4LDY4LDAuNyk7XG4gICAgY29sb3I6ICNmZmY7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGZvbnQtc2l6ZTogMTBweDtcbiAgICBsaW5lLWhlaWdodDogMS4yO1xufVxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uOmhvdmVyOjpiZWZvcmUge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG59XG4uZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tLWNhbGxiYWNrczo6YmVmb3JlIHtcbiAgICBjb250ZW50OiBcIlRvZ2dsZSBDYWxsYmFjayBHcmFwaFwiO1xufVxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1lcnJvcnM6OmJlZm9yZSB7XG4gICAgY29udGVudDogXCJUb2dnbGUgRXJyb3JzXCI7XG59XG4uZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tLWF2YWlsYWJsZSxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tYXZhaWxhYmxlOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDBDQzk2O1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbn1cbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tYXZhaWxhYmxlOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IFwiU2VydmVyIEF2YWlsYWJsZVwiO1xufVxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS11bmF2YWlsYWJsZSxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tdW5hdmFpbGFibGU6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGMTU2NEU7XG4gICAgY3Vyc29yOiBkZWZhdWx0O1xufVxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS11bmF2YWlsYWJsZTo6YmVmb3JlIHtcbiAgICBjb250ZW50OiBcIlNlcnZlciBVbmF2YWlsYWJsZS4gQ2hlY2sgaWYgdGhlIHByb2Nlc3MgaGFzIGhhbHRlZCBvciBjcmFzaGVkLlwiO1xufVxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1jb2xkLFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1jb2xkOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkREQTY4O1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbn1cbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tY29sZDo6YmVmb3JlIHtcbiAgICBjb250ZW50OiBcIkhvdCBSZWxvYWQgRGlzYWJsZWRcIjtcbn1cblxuLmRhc2gtZGVidWctYWxlcnQge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBmb250LXNpemU6IDEwcHg7XG59XG5cbi5kYXNoLWRlYnVnLWFsZXJ0LWxhYmVsIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICBib3R0b206IDgxcHg7XG4gICAgcmlnaHQ6IDI5cHg7XG4gICAgei1pbmRleDogMTAwMDI7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGJveC1zaGFkb3c6IDBweCAwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4yNSksXG4gICAgICAgIDBweCAxcHggM3B4IHJnYmEoMTYyLCAxNzcsIDE5OCwgMC4zMik7XG4gICAgYm9yZGVyLXJhZGl1czogMzJweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBwYWRkaW5nOiA0cHg7XG4gICAgY29sb3I6IHJnYig1MCwgNTAsIDUwKTtcbn1cblxuLmRhc2gtZGVidWctZXJyb3ItY291bnQge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIG1hcmdpbjogMCAzcHg7XG59XG5cbi5kYXNoLWRlYnVnLWRpc2Nvbm5lY3RlZCB7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIG1hcmdpbi1sZWZ0OiAzcHg7XG59XG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvRGVidWdNZW51LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGdCQUFnQjtJQUNoQixlQUFlO0lBQ2YsWUFBWTtJQUNaLFdBQVc7SUFDWCxhQUFhO0lBQ2IsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixjQUFjO0lBQ2QseUJBQXlCO0lBQ3pCLG1CQUFtQjtJQUNuQixXQUFXO0lBQ1gsWUFBWTtJQUNaLGVBQWU7QUFDbkI7QUFDQTtJQUNJLDBCQUEwQjtBQUM5Qjs7QUFFQTtJQUNJLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLHNCQUFzQjtJQUN0QixlQUFlO0lBQ2YsWUFBWTtJQUNaLFdBQVc7SUFDWCxhQUFhO0lBQ2IsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixjQUFjO0lBQ2QsWUFBWTtJQUNaLG1CQUFtQjtJQUNuQix5QkFBeUI7SUFDekIsc0JBQXNCO0lBQ3RCOzZDQUN5QztBQUM3QztBQUNBO0lBQ0ksWUFBWTtJQUNaLFdBQVc7SUFDWCxZQUFZO0lBQ1osV0FBVztJQUNYLFVBQVU7QUFDZDs7QUFFQTtJQUNJLGFBQWE7SUFDYixXQUFXO0lBQ1gsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIseUJBQXlCO0lBQ3pCLG1CQUFtQjtJQUNuQixXQUFXO0lBQ1gsWUFBWTtJQUNaLGVBQWU7SUFDZixhQUFhO0lBQ2Isc0JBQXNCO0lBQ3RCLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsaUNBQWlDO0lBQ2pDLFdBQVc7SUFDWCxlQUFlO0FBQ25CO0FBQ0E7SUFDSSx5QkFBeUI7QUFDN0I7QUFDQTtJQUNJLHlCQUF5QjtBQUM3QjtBQUNBO0lBQ0kseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0ksZUFBZTtBQUNuQjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixvQkFBb0I7SUFDcEIsa0JBQWtCO0lBQ2xCLHNCQUFzQjtJQUN0QixZQUFZO0lBQ1osU0FBUztJQUNULGtCQUFrQjtJQUNsQixZQUFZO0lBQ1osWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixvQ0FBb0M7SUFDcEMsV0FBVztJQUNYLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsZ0JBQWdCO0FBQ3BCO0FBQ0E7SUFDSSxtQkFBbUI7QUFDdkI7QUFDQTtJQUNJLGdDQUFnQztBQUNwQztBQUNBO0lBQ0ksd0JBQXdCO0FBQzVCO0FBQ0E7O0lBRUkseUJBQXlCO0lBQ3pCLGVBQWU7QUFDbkI7QUFDQTtJQUNJLDJCQUEyQjtBQUMvQjtBQUNBOztJQUVJLHlCQUF5QjtJQUN6QixlQUFlO0FBQ25CO0FBQ0E7SUFDSSwwRUFBMEU7QUFDOUU7QUFDQTs7SUFFSSx5QkFBeUI7SUFDekIsZUFBZTtBQUNuQjtBQUNBO0lBQ0ksOEJBQThCO0FBQ2xDOztBQUVBO0lBQ0ksYUFBYTtJQUNiLG1CQUFtQjtJQUNuQixlQUFlO0FBQ25COztBQUVBO0lBQ0ksYUFBYTtJQUNiLGVBQWU7SUFDZixZQUFZO0lBQ1osV0FBVztJQUNYLGNBQWM7SUFDZCxlQUFlO0lBQ2Y7NkNBQ3lDO0lBQ3pDLG1CQUFtQjtJQUNuQix1QkFBdUI7SUFDdkIsWUFBWTtJQUNaLHNCQUFzQjtBQUMxQjs7QUFFQTtJQUNJLGNBQWM7SUFDZCxhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksZUFBZTtJQUNmLGdCQUFnQjtBQUNwQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuZGFzaC1kZWJ1Zy1tZW51IHtcXG4gICAgdHJhbnNpdGlvbjogMC4zcztcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcbiAgICBib3R0b206IDM1cHg7XFxuICAgIHJpZ2h0OiAzNXB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgei1pbmRleDogMTAwMDE7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMxMTlkZmY7XFxuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XFxuICAgIHdpZHRoOiA2NHB4O1xcbiAgICBoZWlnaHQ6IDY0cHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLmRhc2gtZGVidWctbWVudS0tb3BlbiB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKC0xODBkZWcpO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51OmhvdmVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzEwOGRlNDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9faWNvbiB7XFxuICAgIHdpZHRoOiBhdXRvO1xcbiAgICBoZWlnaHQ6IDI0cHg7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyIHtcXG4gICAgdHJhbnNpdGlvbjogMC4zcztcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcbiAgICBib3R0b206IDI3cHg7XFxuICAgIHJpZ2h0OiAyN3B4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgei1pbmRleDogMTAwMDA7XFxuICAgIGhlaWdodDogODBweDtcXG4gICAgYm9yZGVyLXJhZGl1czogNDBweDtcXG4gICAgcGFkZGluZzogNXB4IDc4cHggNXB4IDVweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjI1KSxcXG4gICAgICAgIDBweCAxcHggM3B4IHJnYmEoMTYyLCAxNzcsIDE5OCwgMC4zMik7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyLS1jbG9zZWQge1xcbiAgICBoZWlnaHQ6IDYwcHg7XFxuICAgIHdpZHRoOiA2MHB4O1xcbiAgICBib3R0b206IDM3cHg7XFxuICAgIHJpZ2h0OiAzN3B4O1xcbiAgICBwYWRkaW5nOiAwO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19jb250ZW50IHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIGhlaWdodDogMTAwJTtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLWNvbnRhaW5lciB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICB3aWR0aDogNzRweDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uIHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQjlDMkNFO1xcbiAgICBib3JkZXItcmFkaXVzOiAxMDAlO1xcbiAgICB3aWR0aDogNjRweDtcXG4gICAgaGVpZ2h0OiA2NHB4O1xcbiAgICBmb250LXNpemU6IDEwcHg7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XFxuICAgIGNvbG9yOiAjZmZmO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbjpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNhMWE5YjU7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tZW5hYmxlZCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMENDOTY7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tZW5hYmxlZDpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwM2JiOGE7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi1sYWJlbCB7XFxuICAgIGN1cnNvcjogaW5oZXJpdDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uOjpiZWZvcmUge1xcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XFxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIGJvdHRvbTogMTEwJTtcXG4gICAgbGVmdDogNTAlO1xcbiAgICBtYXJnaW4tbGVmdDogLTYwcHg7XFxuICAgIHBhZGRpbmc6IDdweDtcXG4gICAgd2lkdGg6IDEyMHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNjgsNjgsNjgsMC43KTtcXG4gICAgY29sb3I6ICNmZmY7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgZm9udC1zaXplOiAxMHB4O1xcbiAgICBsaW5lLWhlaWdodDogMS4yO1xcbn1cXG4uZGFzaC1kZWJ1Zy1tZW51X19idXR0b246aG92ZXI6OmJlZm9yZSB7XFxuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tY2FsbGJhY2tzOjpiZWZvcmUge1xcbiAgICBjb250ZW50OiBcXFwiVG9nZ2xlIENhbGxiYWNrIEdyYXBoXFxcIjtcXG59XFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1lcnJvcnM6OmJlZm9yZSB7XFxuICAgIGNvbnRlbnQ6IFxcXCJUb2dnbGUgRXJyb3JzXFxcIjtcXG59XFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1hdmFpbGFibGUsXFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1hdmFpbGFibGU6aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDBDQzk2O1xcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tYXZhaWxhYmxlOjpiZWZvcmUge1xcbiAgICBjb250ZW50OiBcXFwiU2VydmVyIEF2YWlsYWJsZVxcXCI7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tdW5hdmFpbGFibGUsXFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS11bmF2YWlsYWJsZTpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNGMTU2NEU7XFxuICAgIGN1cnNvcjogZGVmYXVsdDtcXG59XFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS11bmF2YWlsYWJsZTo6YmVmb3JlIHtcXG4gICAgY29udGVudDogXFxcIlNlcnZlciBVbmF2YWlsYWJsZS4gQ2hlY2sgaWYgdGhlIHByb2Nlc3MgaGFzIGhhbHRlZCBvciBjcmFzaGVkLlxcXCI7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tY29sZCxcXG4uZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tLWNvbGQ6aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkREQTY4O1xcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tY29sZDo6YmVmb3JlIHtcXG4gICAgY29udGVudDogXFxcIkhvdCBSZWxvYWQgRGlzYWJsZWRcXFwiO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1hbGVydCB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGZvbnQtc2l6ZTogMTBweDtcXG59XFxuXFxuLmRhc2gtZGVidWctYWxlcnQtbGFiZWwge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxuICAgIGJvdHRvbTogODFweDtcXG4gICAgcmlnaHQ6IDI5cHg7XFxuICAgIHotaW5kZXg6IDEwMDAyO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGJveC1zaGFkb3c6IDBweCAwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4yNSksXFxuICAgICAgICAwcHggMXB4IDNweCByZ2JhKDE2MiwgMTc3LCAxOTgsIDAuMzIpO1xcbiAgICBib3JkZXItcmFkaXVzOiAzMnB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgcGFkZGluZzogNHB4O1xcbiAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1lcnJvci1jb3VudCB7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBtYXJnaW46IDAgM3B4O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1kaXNjb25uZWN0ZWQge1xcbiAgICBmb250LXNpemU6IDE0cHg7XFxuICAgIG1hcmdpbi1sZWZ0OiAzcHg7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcpIHtcbiAgdmFyIGxpc3QgPSBbXTtcblxuICAvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gXCJcIjtcbiAgICAgIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2YgaXRlbVs1XSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgKz0gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtKTtcbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSkuam9pbihcIlwiKTtcbiAgfTtcblxuICAvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxuICBsaXN0LmkgPSBmdW5jdGlvbiBpKG1vZHVsZXMsIG1lZGlhLCBkZWR1cGUsIHN1cHBvcnRzLCBsYXllcikge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgdW5kZWZpbmVkXV07XG4gICAgfVxuICAgIHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG4gICAgaWYgKGRlZHVwZSkge1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBpZCA9IHRoaXNba11bMF07XG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIF9rID0gMDsgX2sgPCBtb2R1bGVzLmxlbmd0aDsgX2srKykge1xuICAgICAgdmFyIGl0ZW0gPSBbXS5jb25jYXQobW9kdWxlc1tfa10pO1xuICAgICAgaWYgKGRlZHVwZSAmJiBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBsYXllciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW1bNV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtZWRpYSkge1xuICAgICAgICBpZiAoIWl0ZW1bMl0pIHtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3VwcG9ydHMpIHtcbiAgICAgICAgaWYgKCFpdGVtWzRdKSB7XG4gICAgICAgICAgaXRlbVs0XSA9IFwiXCIuY29uY2F0KHN1cHBvcnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNF0gPSBzdXBwb3J0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGxpc3Q7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXTtcbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICBpZiAodHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShjc3NNYXBwaW5nKSkpKTtcbiAgICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07IiwiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiZGFncmVcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW1wiZGFncmVcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiY3l0b3NjYXBlRGFncmVcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJkYWdyZVwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiY3l0b3NjYXBlRGFncmVcIl0gPSBmYWN0b3J5KHJvb3RbXCJkYWdyZVwiXSk7XG59KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX180X18pIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuLyoqKioqKi8gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuLyoqKioqKi8gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gbnM7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgaW1wbCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7IC8vIHJlZ2lzdGVycyB0aGUgZXh0ZW5zaW9uIG9uIGEgY3l0b3NjYXBlIGxpYiByZWZcblxuXG52YXIgcmVnaXN0ZXIgPSBmdW5jdGlvbiByZWdpc3RlcihjeXRvc2NhcGUpIHtcbiAgaWYgKCFjeXRvc2NhcGUpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gY2FuJ3QgcmVnaXN0ZXIgaWYgY3l0b3NjYXBlIHVuc3BlY2lmaWVkXG5cblxuICBjeXRvc2NhcGUoJ2xheW91dCcsICdkYWdyZScsIGltcGwpOyAvLyByZWdpc3RlciB3aXRoIGN5dG9zY2FwZS5qc1xufTtcblxuaWYgKHR5cGVvZiBjeXRvc2NhcGUgIT09ICd1bmRlZmluZWQnKSB7XG4gIC8vIGV4cG9zZSB0byBnbG9iYWwgY3l0b3NjYXBlIChpLmUuIHdpbmRvdy5jeXRvc2NhcGUpXG4gIHJlZ2lzdGVyKGN5dG9zY2FwZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVnaXN0ZXI7XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbnZhciBpc0Z1bmN0aW9uID0gZnVuY3Rpb24gaXNGdW5jdGlvbihvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cbnZhciBkZWZhdWx0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cbnZhciBhc3NpZ24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG52YXIgZGFncmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpOyAvLyBjb25zdHJ1Y3RvclxuLy8gb3B0aW9ucyA6IG9iamVjdCBjb250YWluaW5nIGxheW91dCBvcHRpb25zXG5cblxuZnVuY3Rpb24gRGFncmVMYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBhc3NpZ24oe30sIGRlZmF1bHRzLCBvcHRpb25zKTtcbn0gLy8gcnVucyB0aGUgbGF5b3V0XG5cblxuRGFncmVMYXlvdXQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBsYXlvdXQgPSB0aGlzO1xuICB2YXIgY3kgPSBvcHRpb25zLmN5OyAvLyBjeSBpcyBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlZCBmb3IgdXMgaW4gdGhlIGNvbnN0cnVjdG9yXG5cbiAgdmFyIGVsZXMgPSBvcHRpb25zLmVsZXM7XG5cbiAgdmFyIGdldFZhbCA9IGZ1bmN0aW9uIGdldFZhbChlbGUsIHZhbCkge1xuICAgIHJldHVybiBpc0Z1bmN0aW9uKHZhbCkgPyB2YWwuYXBwbHkoZWxlLCBbZWxlXSkgOiB2YWw7XG4gIH07XG5cbiAgdmFyIGJiID0gb3B0aW9ucy5ib3VuZGluZ0JveCB8fCB7XG4gICAgeDE6IDAsXG4gICAgeTE6IDAsXG4gICAgdzogY3kud2lkdGgoKSxcbiAgICBoOiBjeS5oZWlnaHQoKVxuICB9O1xuXG4gIGlmIChiYi54MiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYmIueDIgPSBiYi54MSArIGJiLnc7XG4gIH1cblxuICBpZiAoYmIudyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYmIudyA9IGJiLngyIC0gYmIueDE7XG4gIH1cblxuICBpZiAoYmIueTIgPT09IHVuZGVmaW5lZCkge1xuICAgIGJiLnkyID0gYmIueTEgKyBiYi5oO1xuICB9XG5cbiAgaWYgKGJiLmggPT09IHVuZGVmaW5lZCkge1xuICAgIGJiLmggPSBiYi55MiAtIGJiLnkxO1xuICB9XG5cbiAgdmFyIGcgPSBuZXcgZGFncmUuZ3JhcGhsaWIuR3JhcGgoe1xuICAgIG11bHRpZ3JhcGg6IHRydWUsXG4gICAgY29tcG91bmQ6IHRydWVcbiAgfSk7XG4gIHZhciBnT2JqID0ge307XG5cbiAgdmFyIHNldEdPYmogPSBmdW5jdGlvbiBzZXRHT2JqKG5hbWUsIHZhbCkge1xuICAgIGlmICh2YWwgIT0gbnVsbCkge1xuICAgICAgZ09ialtuYW1lXSA9IHZhbDtcbiAgICB9XG4gIH07XG5cbiAgc2V0R09iaignbm9kZXNlcCcsIG9wdGlvbnMubm9kZVNlcCk7XG4gIHNldEdPYmooJ2VkZ2VzZXAnLCBvcHRpb25zLmVkZ2VTZXApO1xuICBzZXRHT2JqKCdyYW5rc2VwJywgb3B0aW9ucy5yYW5rU2VwKTtcbiAgc2V0R09iaigncmFua2RpcicsIG9wdGlvbnMucmFua0Rpcik7XG4gIHNldEdPYmooJ2FsaWduJywgb3B0aW9ucy5hbGlnbik7XG4gIHNldEdPYmooJ3JhbmtlcicsIG9wdGlvbnMucmFua2VyKTtcbiAgc2V0R09iaignYWN5Y2xpY2VyJywgb3B0aW9ucy5hY3ljbGljZXIpO1xuICBnLnNldEdyYXBoKGdPYmopO1xuICBnLnNldERlZmF1bHRFZGdlTGFiZWwoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7fTtcbiAgfSk7XG4gIGcuc2V0RGVmYXVsdE5vZGVMYWJlbChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9KTsgLy8gYWRkIG5vZGVzIHRvIGRhZ3JlXG5cbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpO1xuXG4gIGlmIChpc0Z1bmN0aW9uKG9wdGlvbnMuc29ydCkpIHtcbiAgICBub2RlcyA9IG5vZGVzLnNvcnQob3B0aW9ucy5zb3J0KTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgIHZhciBuYmIgPSBub2RlLmxheW91dERpbWVuc2lvbnMob3B0aW9ucyk7XG4gICAgZy5zZXROb2RlKG5vZGUuaWQoKSwge1xuICAgICAgd2lkdGg6IG5iYi53LFxuICAgICAgaGVpZ2h0OiBuYmIuaCxcbiAgICAgIG5hbWU6IG5vZGUuaWQoKVxuICAgIH0pOyAvLyBjb25zb2xlLmxvZyggZy5ub2RlKG5vZGUuaWQoKSkgKTtcbiAgfSAvLyBzZXQgY29tcG91bmQgcGFyZW50c1xuXG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5vZGVzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBfbm9kZSA9IG5vZGVzW19pXTtcblxuICAgIGlmIChfbm9kZS5pc0NoaWxkKCkpIHtcbiAgICAgIGcuc2V0UGFyZW50KF9ub2RlLmlkKCksIF9ub2RlLnBhcmVudCgpLmlkKCkpO1xuICAgIH1cbiAgfSAvLyBhZGQgZWRnZXMgdG8gZGFncmVcblxuXG4gIHZhciBlZGdlcyA9IGVsZXMuZWRnZXMoKS5zdGRGaWx0ZXIoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICByZXR1cm4gIWVkZ2Uuc291cmNlKCkuaXNQYXJlbnQoKSAmJiAhZWRnZS50YXJnZXQoKS5pc1BhcmVudCgpOyAvLyBkYWdyZSBjYW4ndCBoYW5kbGUgZWRnZXMgb24gY29tcG91bmQgbm9kZXNcbiAgfSk7XG5cbiAgaWYgKGlzRnVuY3Rpb24ob3B0aW9ucy5zb3J0KSkge1xuICAgIGVkZ2VzID0gZWRnZXMuc29ydChvcHRpb25zLnNvcnQpO1xuICB9XG5cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgZWRnZXMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciBlZGdlID0gZWRnZXNbX2kyXTtcbiAgICBnLnNldEVkZ2UoZWRnZS5zb3VyY2UoKS5pZCgpLCBlZGdlLnRhcmdldCgpLmlkKCksIHtcbiAgICAgIG1pbmxlbjogZ2V0VmFsKGVkZ2UsIG9wdGlvbnMubWluTGVuKSxcbiAgICAgIHdlaWdodDogZ2V0VmFsKGVkZ2UsIG9wdGlvbnMuZWRnZVdlaWdodCksXG4gICAgICBuYW1lOiBlZGdlLmlkKClcbiAgICB9LCBlZGdlLmlkKCkpOyAvLyBjb25zb2xlLmxvZyggZy5lZGdlKGVkZ2Uuc291cmNlKCkuaWQoKSwgZWRnZS50YXJnZXQoKS5pZCgpLCBlZGdlLmlkKCkpICk7XG4gIH1cblxuICBkYWdyZS5sYXlvdXQoZyk7XG4gIHZhciBnTm9kZUlkcyA9IGcubm9kZXMoKTtcblxuICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBnTm9kZUlkcy5sZW5ndGg7IF9pMysrKSB7XG4gICAgdmFyIGlkID0gZ05vZGVJZHNbX2kzXTtcbiAgICB2YXIgbiA9IGcubm9kZShpZCk7XG4gICAgY3kuZ2V0RWxlbWVudEJ5SWQoaWQpLnNjcmF0Y2goKS5kYWdyZSA9IG47XG4gIH1cblxuICB2YXIgZGFncmVCQjtcblxuICBpZiAob3B0aW9ucy5ib3VuZGluZ0JveCkge1xuICAgIGRhZ3JlQkIgPSB7XG4gICAgICB4MTogSW5maW5pdHksXG4gICAgICB4MjogLUluZmluaXR5LFxuICAgICAgeTE6IEluZmluaXR5LFxuICAgICAgeTI6IC1JbmZpbml0eVxuICAgIH07XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgdmFyIGRNb2RlbCA9IG5vZGUuc2NyYXRjaCgpLmRhZ3JlO1xuICAgICAgZGFncmVCQi54MSA9IE1hdGgubWluKGRhZ3JlQkIueDEsIGRNb2RlbC54KTtcbiAgICAgIGRhZ3JlQkIueDIgPSBNYXRoLm1heChkYWdyZUJCLngyLCBkTW9kZWwueCk7XG4gICAgICBkYWdyZUJCLnkxID0gTWF0aC5taW4oZGFncmVCQi55MSwgZE1vZGVsLnkpO1xuICAgICAgZGFncmVCQi55MiA9IE1hdGgubWF4KGRhZ3JlQkIueTIsIGRNb2RlbC55KTtcbiAgICB9KTtcbiAgICBkYWdyZUJCLncgPSBkYWdyZUJCLngyIC0gZGFncmVCQi54MTtcbiAgICBkYWdyZUJCLmggPSBkYWdyZUJCLnkyIC0gZGFncmVCQi55MTtcbiAgfSBlbHNlIHtcbiAgICBkYWdyZUJCID0gYmI7XG4gIH1cblxuICB2YXIgY29uc3RyYWluUG9zID0gZnVuY3Rpb24gY29uc3RyYWluUG9zKHApIHtcbiAgICBpZiAob3B0aW9ucy5ib3VuZGluZ0JveCkge1xuICAgICAgdmFyIHhQY3QgPSBkYWdyZUJCLncgPT09IDAgPyAwIDogKHAueCAtIGRhZ3JlQkIueDEpIC8gZGFncmVCQi53O1xuICAgICAgdmFyIHlQY3QgPSBkYWdyZUJCLmggPT09IDAgPyAwIDogKHAueSAtIGRhZ3JlQkIueTEpIC8gZGFncmVCQi5oO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogYmIueDEgKyB4UGN0ICogYmIudyxcbiAgICAgICAgeTogYmIueTEgKyB5UGN0ICogYmIuaFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICB9O1xuXG4gIG5vZGVzLmxheW91dFBvc2l0aW9ucyhsYXlvdXQsIG9wdGlvbnMsIGZ1bmN0aW9uIChlbGUpIHtcbiAgICBlbGUgPSBfdHlwZW9mKGVsZSkgPT09IFwib2JqZWN0XCIgPyBlbGUgOiB0aGlzO1xuICAgIHZhciBkTW9kZWwgPSBlbGUuc2NyYXRjaCgpLmRhZ3JlO1xuICAgIHJldHVybiBjb25zdHJhaW5Qb3Moe1xuICAgICAgeDogZE1vZGVsLngsXG4gICAgICB5OiBkTW9kZWwueVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhZ3JlTGF5b3V0O1xuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxudmFyIGRlZmF1bHRzID0ge1xuICAvLyBkYWdyZSBhbGdvIG9wdGlvbnMsIHVzZXMgZGVmYXVsdCB2YWx1ZSBvbiB1bmRlZmluZWRcbiAgbm9kZVNlcDogdW5kZWZpbmVkLFxuICAvLyB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIGFkamFjZW50IG5vZGVzIGluIHRoZSBzYW1lIHJhbmtcbiAgZWRnZVNlcDogdW5kZWZpbmVkLFxuICAvLyB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIGFkamFjZW50IGVkZ2VzIGluIHRoZSBzYW1lIHJhbmtcbiAgcmFua1NlcDogdW5kZWZpbmVkLFxuICAvLyB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIGFkamFjZW50IG5vZGVzIGluIHRoZSBzYW1lIHJhbmtcbiAgcmFua0RpcjogdW5kZWZpbmVkLFxuICAvLyAnVEInIGZvciB0b3AgdG8gYm90dG9tIGZsb3csICdMUicgZm9yIGxlZnQgdG8gcmlnaHQsXG4gIGFsaWduOiB1bmRlZmluZWQsXG4gIC8vIGFsaWdubWVudCBmb3IgcmFuayBub2Rlcy4gQ2FuIGJlICdVTCcsICdVUicsICdETCcsIG9yICdEUicsIHdoZXJlIFUgPSB1cCwgRCA9IGRvd24sIEwgPSBsZWZ0LCBhbmQgUiA9IHJpZ2h0XG4gIGFjeWNsaWNlcjogdW5kZWZpbmVkLFxuICAvLyBJZiBzZXQgdG8gJ2dyZWVkeScsIHVzZXMgYSBncmVlZHkgaGV1cmlzdGljIGZvciBmaW5kaW5nIGEgZmVlZGJhY2sgYXJjIHNldCBmb3IgYSBncmFwaC5cbiAgLy8gQSBmZWVkYmFjayBhcmMgc2V0IGlzIGEgc2V0IG9mIGVkZ2VzIHRoYXQgY2FuIGJlIHJlbW92ZWQgdG8gbWFrZSBhIGdyYXBoIGFjeWNsaWMuXG4gIHJhbmtlcjogdW5kZWZpbmVkLFxuICAvLyBUeXBlIG9mIGFsZ29yaXRobSB0byBhc3NpZ25zIGEgcmFuayB0byBlYWNoIG5vZGUgaW4gdGhlIGlucHV0IGdyYXBoLlxuICAvLyBQb3NzaWJsZSB2YWx1ZXM6IG5ldHdvcmstc2ltcGxleCwgdGlnaHQtdHJlZSBvciBsb25nZXN0LXBhdGhcbiAgbWluTGVuOiBmdW5jdGlvbiBtaW5MZW4oZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICAvLyBudW1iZXIgb2YgcmFua3MgdG8ga2VlcCBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBvZiB0aGUgZWRnZVxuICBlZGdlV2VpZ2h0OiBmdW5jdGlvbiBlZGdlV2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgLy8gaGlnaGVyIHdlaWdodCBlZGdlcyBhcmUgZ2VuZXJhbGx5IG1hZGUgc2hvcnRlciBhbmQgc3RyYWlnaHRlciB0aGFuIGxvd2VyIHdlaWdodCBlZGdlc1xuICAvLyBnZW5lcmFsIGxheW91dCBvcHRpb25zXG4gIGZpdDogdHJ1ZSxcbiAgLy8gd2hldGhlciB0byBmaXQgdG8gdmlld3BvcnRcbiAgcGFkZGluZzogMzAsXG4gIC8vIGZpdCBwYWRkaW5nXG4gIHNwYWNpbmdGYWN0b3I6IHVuZGVmaW5lZCxcbiAgLy8gQXBwbGllcyBhIG11bHRpcGxpY2F0aXZlIGZhY3RvciAoPjApIHRvIGV4cGFuZCBvciBjb21wcmVzcyB0aGUgb3ZlcmFsbCBhcmVhIHRoYXQgdGhlIG5vZGVzIHRha2UgdXBcbiAgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzOiBmYWxzZSxcbiAgLy8gd2hldGhlciBsYWJlbHMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGRldGVybWluaW5nIHRoZSBzcGFjZSB1c2VkIGJ5IGEgbm9kZVxuICBhbmltYXRlOiBmYWxzZSxcbiAgLy8gd2hldGhlciB0byB0cmFuc2l0aW9uIHRoZSBub2RlIHBvc2l0aW9uc1xuICBhbmltYXRlRmlsdGVyOiBmdW5jdGlvbiBhbmltYXRlRmlsdGVyKG5vZGUsIGkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLy8gd2hldGhlciB0byBhbmltYXRlIHNwZWNpZmljIG5vZGVzIHdoZW4gYW5pbWF0aW9uIGlzIG9uOyBub24tYW5pbWF0ZWQgbm9kZXMgaW1tZWRpYXRlbHkgZ28gdG8gdGhlaXIgZmluYWwgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWRcbiAgYm91bmRpbmdCb3g6IHVuZGVmaW5lZCxcbiAgLy8gY29uc3RyYWluIGxheW91dCBib3VuZHM7IHsgeDEsIHkxLCB4MiwgeTIgfSBvciB7IHgxLCB5MSwgdywgaCB9XG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvcykge1xuICAgIHJldHVybiBwb3M7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBhcHBsaWVzIGEgdHJhbnNmb3JtIHRvIHRoZSBmaW5hbCBub2RlIHBvc2l0aW9uXG4gIHJlYWR5OiBmdW5jdGlvbiByZWFkeSgpIHt9LFxuICAvLyBvbiBsYXlvdXRyZWFkeVxuICBzb3J0OiB1bmRlZmluZWQsXG4gIC8vIGEgc29ydGluZyBmdW5jdGlvbiB0byBvcmRlciB0aGUgbm9kZXMgYW5kIGVkZ2VzOyBlLmcuIGZ1bmN0aW9uKGEsIGIpeyByZXR1cm4gYS5kYXRhKCd3ZWlnaHQnKSAtIGIuZGF0YSgnd2VpZ2h0JykgfVxuICAvLyBiZWNhdXNlIGN5dG9zY2FwZSBkYWdyZSBjcmVhdGVzIGEgZGlyZWN0ZWQgZ3JhcGgsIGFuZCBkaXJlY3RlZCBncmFwaHMgdXNlIHRoZSBub2RlIG9yZGVyIGFzIGEgdGllIGJyZWFrZXIgd2hlblxuICAvLyBkZWZpbmluZyB0aGUgdG9wb2xvZ3kgb2YgYSBncmFwaCwgdGhpcyBzb3J0IGZ1bmN0aW9uIGNhbiBoZWxwIGVuc3VyZSB0aGUgY29ycmVjdCBvcmRlciBvZiB0aGUgbm9kZXMvZWRnZXMuXG4gIC8vIHRoaXMgZmVhdHVyZSBpcyBtb3N0IHVzZWZ1bCB3aGVuIGFkZGluZyBhbmQgcmVtb3ZpbmcgdGhlIHNhbWUgbm9kZXMgYW5kIGVkZ2VzIG11bHRpcGxlIHRpbWVzIGluIGEgZ3JhcGguXG4gIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7fSAvLyBvbiBsYXlvdXRzdG9wXG5cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGRlZmF1bHRzO1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuLy8gU2ltcGxlLCBpbnRlcm5hbCBPYmplY3QuYXNzaWduKCkgcG9seWZpbGwgZm9yIG9wdGlvbnMgb2JqZWN0cyBldGMuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5hc3NpZ24gIT0gbnVsbCA/IE9iamVjdC5hc3NpZ24uYmluZChPYmplY3QpIDogZnVuY3Rpb24gKHRndCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgc3JjcyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgc3Jjc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBzcmNzLmZvckVhY2goZnVuY3Rpb24gKHNyYykge1xuICAgIE9iamVjdC5rZXlzKHNyYykuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgcmV0dXJuIHRndFtrXSA9IHNyY1trXTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiB0Z3Q7XG59O1xuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX180X187XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTtcbn0pOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMjMsIFRoZSBDeXRvc2NhcGUgQ29uc29ydGl1bS5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mXG4gKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSDigJxTb2Z0d2FyZeKAnSksIHRvIGRlYWwgaW5cbiAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG9cbiAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzXG4gKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG9cbiAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIOKAnEFTIElT4oCdLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBkZWJvdW5jZSA9IHJlcXVpcmUoJ2xvZGFzaC9kZWJvdW5jZScpO1xudmFyIEhlYXAgPSByZXF1aXJlKCdoZWFwJyk7XG52YXIgZ2V0ID0gcmVxdWlyZSgnbG9kYXNoL2dldCcpO1xudmFyIHNldCA9IHJlcXVpcmUoJ2xvZGFzaC9zZXQnKTtcbnZhciB0b1BhdGggPSByZXF1aXJlKCdsb2Rhc2gvdG9QYXRoJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wRGVmYXVsdExlZ2FjeSAoZSkgeyByZXR1cm4gZSAmJiB0eXBlb2YgZSA9PT0gJ29iamVjdCcgJiYgJ2RlZmF1bHQnIGluIGUgPyBlIDogeyAnZGVmYXVsdCc6IGUgfTsgfVxuXG52YXIgZGVib3VuY2VfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0TGVnYWN5KGRlYm91bmNlKTtcbnZhciBIZWFwX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdExlZ2FjeShIZWFwKTtcbnZhciBnZXRfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0TGVnYWN5KGdldCk7XG52YXIgc2V0X19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdExlZ2FjeShzZXQpO1xudmFyIHRvUGF0aF9fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9faW50ZXJvcERlZmF1bHRMZWdhY3kodG9QYXRoKTtcblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICB9IDogZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gIH0sIF90eXBlb2Yob2JqKTtcbn1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7XG4gIHZhciBfaSA9IGFyciA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXTtcblxuICBpZiAoX2kgPT0gbnVsbCkgcmV0dXJuO1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcblxuICB2YXIgX3MsIF9lO1xuXG4gIHRyeSB7XG4gICAgZm9yIChfaSA9IF9pLmNhbGwoYXJyKTsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2QgPSB0cnVlO1xuICAgIF9lID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9hcnI7XG59XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldO1xuXG4gIHJldHVybiBhcnIyO1xufVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuXG52YXIgd2luZG93JDEgPSB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiB3aW5kb3c7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxudmFyIG5hdmlnYXRvciA9IHdpbmRvdyQxID8gd2luZG93JDEubmF2aWdhdG9yIDogbnVsbDtcbndpbmRvdyQxID8gd2luZG93JDEuZG9jdW1lbnQgOiBudWxsO1xuXG52YXIgdHlwZW9mc3RyID0gX3R5cGVvZignJyk7XG5cbnZhciB0eXBlb2ZvYmogPSBfdHlwZW9mKHt9KTtcblxudmFyIHR5cGVvZmZuID0gX3R5cGVvZihmdW5jdGlvbiAoKSB7fSk7XG5cbnZhciB0eXBlb2ZodG1sZWxlID0gdHlwZW9mIEhUTUxFbGVtZW50ID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YoSFRNTEVsZW1lbnQpO1xuXG52YXIgaW5zdGFuY2VTdHIgPSBmdW5jdGlvbiBpbnN0YW5jZVN0cihvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouaW5zdGFuY2VTdHJpbmcgJiYgZm4kNihvYmouaW5zdGFuY2VTdHJpbmcpID8gb2JqLmluc3RhbmNlU3RyaW5nKCkgOiBudWxsO1xufTtcblxudmFyIHN0cmluZyA9IGZ1bmN0aW9uIHN0cmluZyhvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PSB0eXBlb2ZzdHI7XG59O1xudmFyIGZuJDYgPSBmdW5jdGlvbiBmbihvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PT0gdHlwZW9mZm47XG59O1xudmFyIGFycmF5ID0gZnVuY3Rpb24gYXJyYXkob2JqKSB7XG4gIHJldHVybiAhZWxlbWVudE9yQ29sbGVjdGlvbihvYmopICYmIChBcnJheS5pc0FycmF5ID8gQXJyYXkuaXNBcnJheShvYmopIDogb2JqICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgQXJyYXkpO1xufTtcbnZhciBwbGFpbk9iamVjdCA9IGZ1bmN0aW9uIHBsYWluT2JqZWN0KG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgX3R5cGVvZihvYmopID09PSB0eXBlb2ZvYmogJiYgIWFycmF5KG9iaikgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBPYmplY3Q7XG59O1xudmFyIG9iamVjdCA9IGZ1bmN0aW9uIG9iamVjdChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PT0gdHlwZW9mb2JqO1xufTtcbnZhciBudW1iZXIkMSA9IGZ1bmN0aW9uIG51bWJlcihvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PT0gX3R5cGVvZigxKSAmJiAhaXNOYU4ob2JqKTtcbn07XG52YXIgaW50ZWdlciA9IGZ1bmN0aW9uIGludGVnZXIob2JqKSB7XG4gIHJldHVybiBudW1iZXIkMShvYmopICYmIE1hdGguZmxvb3Iob2JqKSA9PT0gb2JqO1xufTtcbnZhciBodG1sRWxlbWVudCA9IGZ1bmN0aW9uIGh0bWxFbGVtZW50KG9iaikge1xuICBpZiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZmh0bWxlbGUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsICE9IG9iaiAmJiBvYmogaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbiAgfVxufTtcbnZhciBlbGVtZW50T3JDb2xsZWN0aW9uID0gZnVuY3Rpb24gZWxlbWVudE9yQ29sbGVjdGlvbihvYmopIHtcbiAgcmV0dXJuIGVsZW1lbnQob2JqKSB8fCBjb2xsZWN0aW9uKG9iaik7XG59O1xudmFyIGVsZW1lbnQgPSBmdW5jdGlvbiBlbGVtZW50KG9iaikge1xuICByZXR1cm4gaW5zdGFuY2VTdHIob2JqKSA9PT0gJ2NvbGxlY3Rpb24nICYmIG9iai5fcHJpdmF0ZS5zaW5nbGU7XG59O1xudmFyIGNvbGxlY3Rpb24gPSBmdW5jdGlvbiBjb2xsZWN0aW9uKG9iaikge1xuICByZXR1cm4gaW5zdGFuY2VTdHIob2JqKSA9PT0gJ2NvbGxlY3Rpb24nICYmICFvYmouX3ByaXZhdGUuc2luZ2xlO1xufTtcbnZhciBjb3JlID0gZnVuY3Rpb24gY29yZShvYmopIHtcbiAgcmV0dXJuIGluc3RhbmNlU3RyKG9iaikgPT09ICdjb3JlJztcbn07XG52YXIgc3R5bGVzaGVldCA9IGZ1bmN0aW9uIHN0eWxlc2hlZXQob2JqKSB7XG4gIHJldHVybiBpbnN0YW5jZVN0cihvYmopID09PSAnc3R5bGVzaGVldCc7XG59O1xudmFyIGV2ZW50ID0gZnVuY3Rpb24gZXZlbnQob2JqKSB7XG4gIHJldHVybiBpbnN0YW5jZVN0cihvYmopID09PSAnZXZlbnQnO1xufTtcbnZhciBlbXB0eVN0cmluZyA9IGZ1bmN0aW9uIGVtcHR5U3RyaW5nKG9iaikge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsKSB7XG4gICAgLy8gbnVsbCBpcyBlbXB0eVxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKG9iaiA9PT0gJycgfHwgb2JqLm1hdGNoKC9eXFxzKyQvKSkge1xuICAgIHJldHVybiB0cnVlOyAvLyBlbXB0eSBzdHJpbmcgaXMgZW1wdHlcbiAgfVxuXG4gIHJldHVybiBmYWxzZTsgLy8gb3RoZXJ3aXNlLCB3ZSBkb24ndCBrbm93IHdoYXQgd2UndmUgZ290XG59O1xudmFyIGRvbUVsZW1lbnQgPSBmdW5jdGlvbiBkb21FbGVtZW50KG9iaikge1xuICBpZiAodHlwZW9mIEhUTUxFbGVtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTsgLy8gd2UncmUgbm90IGluIGEgYnJvd3NlciBzbyBpdCBkb2Vzbid0IG1hdHRlclxuICB9IGVsc2Uge1xuICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbiAgfVxufTtcbnZhciBib3VuZGluZ0JveCA9IGZ1bmN0aW9uIGJvdW5kaW5nQm94KG9iaikge1xuICByZXR1cm4gcGxhaW5PYmplY3Qob2JqKSAmJiBudW1iZXIkMShvYmoueDEpICYmIG51bWJlciQxKG9iai54MikgJiYgbnVtYmVyJDEob2JqLnkxKSAmJiBudW1iZXIkMShvYmoueTIpO1xufTtcbnZhciBwcm9taXNlID0gZnVuY3Rpb24gcHJvbWlzZShvYmopIHtcbiAgcmV0dXJuIG9iamVjdChvYmopICYmIGZuJDYob2JqLnRoZW4pO1xufTtcbnZhciBtcyA9IGZ1bmN0aW9uIG1zKCkge1xuICByZXR1cm4gbmF2aWdhdG9yICYmIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL21zaWV8dHJpZGVudHxlZGdlL2kpO1xufTsgLy8gcHJvYmFibHkgYSBiZXR0ZXIgd2F5IHRvIGRldGVjdCB0aGlzLi4uXG5cbnZhciBtZW1vaXplID0gZnVuY3Rpb24gbWVtb2l6ZShmbiwga2V5Rm4pIHtcbiAgaWYgKCFrZXlGbikge1xuICAgIGtleUZuID0gZnVuY3Rpb24ga2V5Rm4oKSB7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICAgIH1cblxuICAgICAgdmFyIGFyZ3MgPSBbXTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhcmdzLmpvaW4oJyQnKTtcbiAgICB9O1xuICB9XG5cbiAgdmFyIG1lbW9pemVkRm4gPSBmdW5jdGlvbiBtZW1vaXplZEZuKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgcmV0O1xuICAgIHZhciBrID0ga2V5Rm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgdmFyIGNhY2hlID0gbWVtb2l6ZWRGbi5jYWNoZTtcblxuICAgIGlmICghKHJldCA9IGNhY2hlW2tdKSkge1xuICAgICAgcmV0ID0gY2FjaGVba10gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9O1xuXG4gIG1lbW9pemVkRm4uY2FjaGUgPSB7fTtcbiAgcmV0dXJuIG1lbW9pemVkRm47XG59O1xuXG52YXIgY2FtZWwyZGFzaCA9IG1lbW9pemUoZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbQS1aXSkvZywgZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gJy0nICsgdi50b0xvd2VyQ2FzZSgpO1xuICB9KTtcbn0pO1xudmFyIGRhc2gyY2FtZWwgPSBtZW1vaXplKGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oLVxcdykvZywgZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gdlsxXS50b1VwcGVyQ2FzZSgpO1xuICB9KTtcbn0pO1xudmFyIHByZXBlbmRDYW1lbCA9IG1lbW9pemUoZnVuY3Rpb24gKHByZWZpeCwgc3RyKSB7XG4gIHJldHVybiBwcmVmaXggKyBzdHJbMF0udG9VcHBlckNhc2UoKSArIHN0ci5zdWJzdHJpbmcoMSk7XG59LCBmdW5jdGlvbiAocHJlZml4LCBzdHIpIHtcbiAgcmV0dXJuIHByZWZpeCArICckJyArIHN0cjtcbn0pO1xudmFyIGNhcGl0YWxpemUgPSBmdW5jdGlvbiBjYXBpdGFsaXplKHN0cikge1xuICBpZiAoZW1wdHlTdHJpbmcoc3RyKSkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnN1YnN0cmluZygxKTtcbn07XG5cbnZhciBudW1iZXIgPSAnKD86Wy0rXT8oPzooPzpcXFxcZCt8XFxcXGQqXFxcXC5cXFxcZCspKD86W0VlXVsrLV0/XFxcXGQrKT8pKSc7XG52YXIgcmdiYSA9ICdyZ2JbYV0/XFxcXCgoJyArIG51bWJlciArICdbJV0/KVxcXFxzKixcXFxccyooJyArIG51bWJlciArICdbJV0/KVxcXFxzKixcXFxccyooJyArIG51bWJlciArICdbJV0/KSg/OlxcXFxzKixcXFxccyooJyArIG51bWJlciArICcpKT9cXFxcKSc7XG52YXIgcmdiYU5vQmFja1JlZnMgPSAncmdiW2FdP1xcXFwoKD86JyArIG51bWJlciArICdbJV0/KVxcXFxzKixcXFxccyooPzonICsgbnVtYmVyICsgJ1slXT8pXFxcXHMqLFxcXFxzKig/OicgKyBudW1iZXIgKyAnWyVdPykoPzpcXFxccyosXFxcXHMqKD86JyArIG51bWJlciArICcpKT9cXFxcKSc7XG52YXIgaHNsYSA9ICdoc2xbYV0/XFxcXCgoJyArIG51bWJlciArICcpXFxcXHMqLFxcXFxzKignICsgbnVtYmVyICsgJ1slXSlcXFxccyosXFxcXHMqKCcgKyBudW1iZXIgKyAnWyVdKSg/OlxcXFxzKixcXFxccyooJyArIG51bWJlciArICcpKT9cXFxcKSc7XG52YXIgaHNsYU5vQmFja1JlZnMgPSAnaHNsW2FdP1xcXFwoKD86JyArIG51bWJlciArICcpXFxcXHMqLFxcXFxzKig/OicgKyBudW1iZXIgKyAnWyVdKVxcXFxzKixcXFxccyooPzonICsgbnVtYmVyICsgJ1slXSkoPzpcXFxccyosXFxcXHMqKD86JyArIG51bWJlciArICcpKT9cXFxcKSc7XG52YXIgaGV4MyA9ICdcXFxcI1swLTlhLWZBLUZdezN9JztcbnZhciBoZXg2ID0gJ1xcXFwjWzAtOWEtZkEtRl17Nn0nO1xuXG52YXIgYXNjZW5kaW5nID0gZnVuY3Rpb24gYXNjZW5kaW5nKGEsIGIpIHtcbiAgaWYgKGEgPCBiKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9IGVsc2UgaWYgKGEgPiBiKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG52YXIgZGVzY2VuZGluZyA9IGZ1bmN0aW9uIGRlc2NlbmRpbmcoYSwgYikge1xuICByZXR1cm4gLTEgKiBhc2NlbmRpbmcoYSwgYik7XG59O1xuXG52YXIgZXh0ZW5kID0gT2JqZWN0LmFzc2lnbiAhPSBudWxsID8gT2JqZWN0LmFzc2lnbi5iaW5kKE9iamVjdCkgOiBmdW5jdGlvbiAodGd0KSB7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuXG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBvYmogPSBhcmdzW2ldO1xuXG4gICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGtleXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBrID0ga2V5c1tqXTtcbiAgICAgIHRndFtrXSA9IG9ialtrXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGd0O1xufTtcblxudmFyIGhleDJ0dXBsZSA9IGZ1bmN0aW9uIGhleDJ0dXBsZShoZXgpIHtcbiAgaWYgKCEoaGV4Lmxlbmd0aCA9PT0gNCB8fCBoZXgubGVuZ3RoID09PSA3KSB8fCBoZXhbMF0gIT09ICcjJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBzaG9ydEhleCA9IGhleC5sZW5ndGggPT09IDQ7XG4gIHZhciByLCBnLCBiO1xuICB2YXIgYmFzZSA9IDE2O1xuXG4gIGlmIChzaG9ydEhleCkge1xuICAgIHIgPSBwYXJzZUludChoZXhbMV0gKyBoZXhbMV0sIGJhc2UpO1xuICAgIGcgPSBwYXJzZUludChoZXhbMl0gKyBoZXhbMl0sIGJhc2UpO1xuICAgIGIgPSBwYXJzZUludChoZXhbM10gKyBoZXhbM10sIGJhc2UpO1xuICB9IGVsc2Uge1xuICAgIHIgPSBwYXJzZUludChoZXhbMV0gKyBoZXhbMl0sIGJhc2UpO1xuICAgIGcgPSBwYXJzZUludChoZXhbM10gKyBoZXhbNF0sIGJhc2UpO1xuICAgIGIgPSBwYXJzZUludChoZXhbNV0gKyBoZXhbNl0sIGJhc2UpO1xuICB9XG5cbiAgcmV0dXJuIFtyLCBnLCBiXTtcbn07IC8vIGdldCBbciwgZywgYiwgYV0gZnJvbSBoc2woMCwgMCwgMCkgb3IgaHNsYSgwLCAwLCAwLCAwKVxuXG52YXIgaHNsMnR1cGxlID0gZnVuY3Rpb24gaHNsMnR1cGxlKGhzbCkge1xuICB2YXIgcmV0O1xuICB2YXIgaCwgcywgbCwgYSwgciwgZywgYjtcblxuICBmdW5jdGlvbiBodWUycmdiKHAsIHEsIHQpIHtcbiAgICBpZiAodCA8IDApIHQgKz0gMTtcbiAgICBpZiAodCA+IDEpIHQgLT0gMTtcbiAgICBpZiAodCA8IDEgLyA2KSByZXR1cm4gcCArIChxIC0gcCkgKiA2ICogdDtcbiAgICBpZiAodCA8IDEgLyAyKSByZXR1cm4gcTtcbiAgICBpZiAodCA8IDIgLyAzKSByZXR1cm4gcCArIChxIC0gcCkgKiAoMiAvIDMgLSB0KSAqIDY7XG4gICAgcmV0dXJuIHA7XG4gIH1cblxuICB2YXIgbSA9IG5ldyBSZWdFeHAoJ14nICsgaHNsYSArICckJykuZXhlYyhoc2wpO1xuXG4gIGlmIChtKSB7XG4gICAgLy8gZ2V0IGh1ZVxuICAgIGggPSBwYXJzZUludChtWzFdKTtcblxuICAgIGlmIChoIDwgMCkge1xuICAgICAgaCA9ICgzNjAgLSAtMSAqIGggJSAzNjApICUgMzYwO1xuICAgIH0gZWxzZSBpZiAoaCA+IDM2MCkge1xuICAgICAgaCA9IGggJSAzNjA7XG4gICAgfVxuXG4gICAgaCAvPSAzNjA7IC8vIG5vcm1hbGlzZSBvbiBbMCwgMV1cblxuICAgIHMgPSBwYXJzZUZsb2F0KG1bMl0pO1xuXG4gICAgaWYgKHMgPCAwIHx8IHMgPiAxMDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIHNhdHVyYXRpb24gaXMgWzAsIDEwMF1cblxuXG4gICAgcyA9IHMgLyAxMDA7IC8vIG5vcm1hbGlzZSBvbiBbMCwgMV1cblxuICAgIGwgPSBwYXJzZUZsb2F0KG1bM10pO1xuXG4gICAgaWYgKGwgPCAwIHx8IGwgPiAxMDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGxpZ2h0bmVzcyBpcyBbMCwgMTAwXVxuXG5cbiAgICBsID0gbCAvIDEwMDsgLy8gbm9ybWFsaXNlIG9uIFswLCAxXVxuXG4gICAgYSA9IG1bNF07XG5cbiAgICBpZiAoYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhID0gcGFyc2VGbG9hdChhKTtcblxuICAgICAgaWYgKGEgPCAwIHx8IGEgPiAxKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gYWxwaGEgaXMgWzAsIDFdXG5cbiAgICB9IC8vIG5vdywgY29udmVydCB0byByZ2JcbiAgICAvLyBjb2RlIGZyb20gaHR0cDovL21qaWphY2tzb24uY29tLzIwMDgvMDIvcmdiLXRvLWhzbC1hbmQtcmdiLXRvLWhzdi1jb2xvci1tb2RlbC1jb252ZXJzaW9uLWFsZ29yaXRobXMtaW4tamF2YXNjcmlwdFxuXG5cbiAgICBpZiAocyA9PT0gMCkge1xuICAgICAgciA9IGcgPSBiID0gTWF0aC5yb3VuZChsICogMjU1KTsgLy8gYWNocm9tYXRpY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcSA9IGwgPCAwLjUgPyBsICogKDEgKyBzKSA6IGwgKyBzIC0gbCAqIHM7XG4gICAgICB2YXIgcCA9IDIgKiBsIC0gcTtcbiAgICAgIHIgPSBNYXRoLnJvdW5kKDI1NSAqIGh1ZTJyZ2IocCwgcSwgaCArIDEgLyAzKSk7XG4gICAgICBnID0gTWF0aC5yb3VuZCgyNTUgKiBodWUycmdiKHAsIHEsIGgpKTtcbiAgICAgIGIgPSBNYXRoLnJvdW5kKDI1NSAqIGh1ZTJyZ2IocCwgcSwgaCAtIDEgLyAzKSk7XG4gICAgfVxuXG4gICAgcmV0ID0gW3IsIGcsIGIsIGFdO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07IC8vIGdldCBbciwgZywgYiwgYV0gZnJvbSByZ2IoMCwgMCwgMCkgb3IgcmdiYSgwLCAwLCAwLCAwKVxuXG52YXIgcmdiMnR1cGxlID0gZnVuY3Rpb24gcmdiMnR1cGxlKHJnYikge1xuICB2YXIgcmV0O1xuICB2YXIgbSA9IG5ldyBSZWdFeHAoJ14nICsgcmdiYSArICckJykuZXhlYyhyZ2IpO1xuXG4gIGlmIChtKSB7XG4gICAgcmV0ID0gW107XG4gICAgdmFyIGlzUGN0ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMTsgaSA8PSAzOyBpKyspIHtcbiAgICAgIHZhciBjaGFubmVsID0gbVtpXTtcblxuICAgICAgaWYgKGNoYW5uZWxbY2hhbm5lbC5sZW5ndGggLSAxXSA9PT0gJyUnKSB7XG4gICAgICAgIGlzUGN0W2ldID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY2hhbm5lbCA9IHBhcnNlRmxvYXQoY2hhbm5lbCk7XG5cbiAgICAgIGlmIChpc1BjdFtpXSkge1xuICAgICAgICBjaGFubmVsID0gY2hhbm5lbCAvIDEwMCAqIDI1NTsgLy8gbm9ybWFsaXNlIHRvIFswLCAyNTVdXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFubmVsIDwgMCB8fCBjaGFubmVsID4gMjU1KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gaW52YWxpZCBjaGFubmVsIHZhbHVlXG5cblxuICAgICAgcmV0LnB1c2goTWF0aC5mbG9vcihjaGFubmVsKSk7XG4gICAgfVxuXG4gICAgdmFyIGF0TGVhc3RPbmVJc1BjdCA9IGlzUGN0WzFdIHx8IGlzUGN0WzJdIHx8IGlzUGN0WzNdO1xuICAgIHZhciBhbGxBcmVQY3QgPSBpc1BjdFsxXSAmJiBpc1BjdFsyXSAmJiBpc1BjdFszXTtcblxuICAgIGlmIChhdExlYXN0T25lSXNQY3QgJiYgIWFsbEFyZVBjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gbXVzdCBhbGwgYmUgcGVyY2VudCB2YWx1ZXMgaWYgb25lIGlzXG5cblxuICAgIHZhciBhbHBoYSA9IG1bNF07XG5cbiAgICBpZiAoYWxwaGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWxwaGEgPSBwYXJzZUZsb2F0KGFscGhhKTtcblxuICAgICAgaWYgKGFscGhhIDwgMCB8fCBhbHBoYSA+IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBpbnZhbGlkIGFscGhhIHZhbHVlXG5cblxuICAgICAgcmV0LnB1c2goYWxwaGEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59O1xudmFyIGNvbG9ybmFtZTJ0dXBsZSA9IGZ1bmN0aW9uIGNvbG9ybmFtZTJ0dXBsZShjb2xvcikge1xuICByZXR1cm4gY29sb3JzW2NvbG9yLnRvTG93ZXJDYXNlKCldO1xufTtcbnZhciBjb2xvcjJ0dXBsZSA9IGZ1bmN0aW9uIGNvbG9yMnR1cGxlKGNvbG9yKSB7XG4gIHJldHVybiAoYXJyYXkoY29sb3IpID8gY29sb3IgOiBudWxsKSB8fCBjb2xvcm5hbWUydHVwbGUoY29sb3IpIHx8IGhleDJ0dXBsZShjb2xvcikgfHwgcmdiMnR1cGxlKGNvbG9yKSB8fCBoc2wydHVwbGUoY29sb3IpO1xufTtcbnZhciBjb2xvcnMgPSB7XG4gIC8vIHNwZWNpYWwgY29sb3VyIG5hbWVzXG4gIHRyYW5zcGFyZW50OiBbMCwgMCwgMCwgMF0sXG4gIC8vIE5CIGFscGhhID09PSAwXG4gIC8vIHJlZ3VsYXIgY29sb3Vyc1xuICBhbGljZWJsdWU6IFsyNDAsIDI0OCwgMjU1XSxcbiAgYW50aXF1ZXdoaXRlOiBbMjUwLCAyMzUsIDIxNV0sXG4gIGFxdWE6IFswLCAyNTUsIDI1NV0sXG4gIGFxdWFtYXJpbmU6IFsxMjcsIDI1NSwgMjEyXSxcbiAgYXp1cmU6IFsyNDAsIDI1NSwgMjU1XSxcbiAgYmVpZ2U6IFsyNDUsIDI0NSwgMjIwXSxcbiAgYmlzcXVlOiBbMjU1LCAyMjgsIDE5Nl0sXG4gIGJsYWNrOiBbMCwgMCwgMF0sXG4gIGJsYW5jaGVkYWxtb25kOiBbMjU1LCAyMzUsIDIwNV0sXG4gIGJsdWU6IFswLCAwLCAyNTVdLFxuICBibHVldmlvbGV0OiBbMTM4LCA0MywgMjI2XSxcbiAgYnJvd246IFsxNjUsIDQyLCA0Ml0sXG4gIGJ1cmx5d29vZDogWzIyMiwgMTg0LCAxMzVdLFxuICBjYWRldGJsdWU6IFs5NSwgMTU4LCAxNjBdLFxuICBjaGFydHJldXNlOiBbMTI3LCAyNTUsIDBdLFxuICBjaG9jb2xhdGU6IFsyMTAsIDEwNSwgMzBdLFxuICBjb3JhbDogWzI1NSwgMTI3LCA4MF0sXG4gIGNvcm5mbG93ZXJibHVlOiBbMTAwLCAxNDksIDIzN10sXG4gIGNvcm5zaWxrOiBbMjU1LCAyNDgsIDIyMF0sXG4gIGNyaW1zb246IFsyMjAsIDIwLCA2MF0sXG4gIGN5YW46IFswLCAyNTUsIDI1NV0sXG4gIGRhcmtibHVlOiBbMCwgMCwgMTM5XSxcbiAgZGFya2N5YW46IFswLCAxMzksIDEzOV0sXG4gIGRhcmtnb2xkZW5yb2Q6IFsxODQsIDEzNCwgMTFdLFxuICBkYXJrZ3JheTogWzE2OSwgMTY5LCAxNjldLFxuICBkYXJrZ3JlZW46IFswLCAxMDAsIDBdLFxuICBkYXJrZ3JleTogWzE2OSwgMTY5LCAxNjldLFxuICBkYXJra2hha2k6IFsxODksIDE4MywgMTA3XSxcbiAgZGFya21hZ2VudGE6IFsxMzksIDAsIDEzOV0sXG4gIGRhcmtvbGl2ZWdyZWVuOiBbODUsIDEwNywgNDddLFxuICBkYXJrb3JhbmdlOiBbMjU1LCAxNDAsIDBdLFxuICBkYXJrb3JjaGlkOiBbMTUzLCA1MCwgMjA0XSxcbiAgZGFya3JlZDogWzEzOSwgMCwgMF0sXG4gIGRhcmtzYWxtb246IFsyMzMsIDE1MCwgMTIyXSxcbiAgZGFya3NlYWdyZWVuOiBbMTQzLCAxODgsIDE0M10sXG4gIGRhcmtzbGF0ZWJsdWU6IFs3MiwgNjEsIDEzOV0sXG4gIGRhcmtzbGF0ZWdyYXk6IFs0NywgNzksIDc5XSxcbiAgZGFya3NsYXRlZ3JleTogWzQ3LCA3OSwgNzldLFxuICBkYXJrdHVycXVvaXNlOiBbMCwgMjA2LCAyMDldLFxuICBkYXJrdmlvbGV0OiBbMTQ4LCAwLCAyMTFdLFxuICBkZWVwcGluazogWzI1NSwgMjAsIDE0N10sXG4gIGRlZXBza3libHVlOiBbMCwgMTkxLCAyNTVdLFxuICBkaW1ncmF5OiBbMTA1LCAxMDUsIDEwNV0sXG4gIGRpbWdyZXk6IFsxMDUsIDEwNSwgMTA1XSxcbiAgZG9kZ2VyYmx1ZTogWzMwLCAxNDQsIDI1NV0sXG4gIGZpcmVicmljazogWzE3OCwgMzQsIDM0XSxcbiAgZmxvcmFsd2hpdGU6IFsyNTUsIDI1MCwgMjQwXSxcbiAgZm9yZXN0Z3JlZW46IFszNCwgMTM5LCAzNF0sXG4gIGZ1Y2hzaWE6IFsyNTUsIDAsIDI1NV0sXG4gIGdhaW5zYm9ybzogWzIyMCwgMjIwLCAyMjBdLFxuICBnaG9zdHdoaXRlOiBbMjQ4LCAyNDgsIDI1NV0sXG4gIGdvbGQ6IFsyNTUsIDIxNSwgMF0sXG4gIGdvbGRlbnJvZDogWzIxOCwgMTY1LCAzMl0sXG4gIGdyYXk6IFsxMjgsIDEyOCwgMTI4XSxcbiAgZ3JleTogWzEyOCwgMTI4LCAxMjhdLFxuICBncmVlbjogWzAsIDEyOCwgMF0sXG4gIGdyZWVueWVsbG93OiBbMTczLCAyNTUsIDQ3XSxcbiAgaG9uZXlkZXc6IFsyNDAsIDI1NSwgMjQwXSxcbiAgaG90cGluazogWzI1NSwgMTA1LCAxODBdLFxuICBpbmRpYW5yZWQ6IFsyMDUsIDkyLCA5Ml0sXG4gIGluZGlnbzogWzc1LCAwLCAxMzBdLFxuICBpdm9yeTogWzI1NSwgMjU1LCAyNDBdLFxuICBraGFraTogWzI0MCwgMjMwLCAxNDBdLFxuICBsYXZlbmRlcjogWzIzMCwgMjMwLCAyNTBdLFxuICBsYXZlbmRlcmJsdXNoOiBbMjU1LCAyNDAsIDI0NV0sXG4gIGxhd25ncmVlbjogWzEyNCwgMjUyLCAwXSxcbiAgbGVtb25jaGlmZm9uOiBbMjU1LCAyNTAsIDIwNV0sXG4gIGxpZ2h0Ymx1ZTogWzE3MywgMjE2LCAyMzBdLFxuICBsaWdodGNvcmFsOiBbMjQwLCAxMjgsIDEyOF0sXG4gIGxpZ2h0Y3lhbjogWzIyNCwgMjU1LCAyNTVdLFxuICBsaWdodGdvbGRlbnJvZHllbGxvdzogWzI1MCwgMjUwLCAyMTBdLFxuICBsaWdodGdyYXk6IFsyMTEsIDIxMSwgMjExXSxcbiAgbGlnaHRncmVlbjogWzE0NCwgMjM4LCAxNDRdLFxuICBsaWdodGdyZXk6IFsyMTEsIDIxMSwgMjExXSxcbiAgbGlnaHRwaW5rOiBbMjU1LCAxODIsIDE5M10sXG4gIGxpZ2h0c2FsbW9uOiBbMjU1LCAxNjAsIDEyMl0sXG4gIGxpZ2h0c2VhZ3JlZW46IFszMiwgMTc4LCAxNzBdLFxuICBsaWdodHNreWJsdWU6IFsxMzUsIDIwNiwgMjUwXSxcbiAgbGlnaHRzbGF0ZWdyYXk6IFsxMTksIDEzNiwgMTUzXSxcbiAgbGlnaHRzbGF0ZWdyZXk6IFsxMTksIDEzNiwgMTUzXSxcbiAgbGlnaHRzdGVlbGJsdWU6IFsxNzYsIDE5NiwgMjIyXSxcbiAgbGlnaHR5ZWxsb3c6IFsyNTUsIDI1NSwgMjI0XSxcbiAgbGltZTogWzAsIDI1NSwgMF0sXG4gIGxpbWVncmVlbjogWzUwLCAyMDUsIDUwXSxcbiAgbGluZW46IFsyNTAsIDI0MCwgMjMwXSxcbiAgbWFnZW50YTogWzI1NSwgMCwgMjU1XSxcbiAgbWFyb29uOiBbMTI4LCAwLCAwXSxcbiAgbWVkaXVtYXF1YW1hcmluZTogWzEwMiwgMjA1LCAxNzBdLFxuICBtZWRpdW1ibHVlOiBbMCwgMCwgMjA1XSxcbiAgbWVkaXVtb3JjaGlkOiBbMTg2LCA4NSwgMjExXSxcbiAgbWVkaXVtcHVycGxlOiBbMTQ3LCAxMTIsIDIxOV0sXG4gIG1lZGl1bXNlYWdyZWVuOiBbNjAsIDE3OSwgMTEzXSxcbiAgbWVkaXVtc2xhdGVibHVlOiBbMTIzLCAxMDQsIDIzOF0sXG4gIG1lZGl1bXNwcmluZ2dyZWVuOiBbMCwgMjUwLCAxNTRdLFxuICBtZWRpdW10dXJxdW9pc2U6IFs3MiwgMjA5LCAyMDRdLFxuICBtZWRpdW12aW9sZXRyZWQ6IFsxOTksIDIxLCAxMzNdLFxuICBtaWRuaWdodGJsdWU6IFsyNSwgMjUsIDExMl0sXG4gIG1pbnRjcmVhbTogWzI0NSwgMjU1LCAyNTBdLFxuICBtaXN0eXJvc2U6IFsyNTUsIDIyOCwgMjI1XSxcbiAgbW9jY2FzaW46IFsyNTUsIDIyOCwgMTgxXSxcbiAgbmF2YWpvd2hpdGU6IFsyNTUsIDIyMiwgMTczXSxcbiAgbmF2eTogWzAsIDAsIDEyOF0sXG4gIG9sZGxhY2U6IFsyNTMsIDI0NSwgMjMwXSxcbiAgb2xpdmU6IFsxMjgsIDEyOCwgMF0sXG4gIG9saXZlZHJhYjogWzEwNywgMTQyLCAzNV0sXG4gIG9yYW5nZTogWzI1NSwgMTY1LCAwXSxcbiAgb3JhbmdlcmVkOiBbMjU1LCA2OSwgMF0sXG4gIG9yY2hpZDogWzIxOCwgMTEyLCAyMTRdLFxuICBwYWxlZ29sZGVucm9kOiBbMjM4LCAyMzIsIDE3MF0sXG4gIHBhbGVncmVlbjogWzE1MiwgMjUxLCAxNTJdLFxuICBwYWxldHVycXVvaXNlOiBbMTc1LCAyMzgsIDIzOF0sXG4gIHBhbGV2aW9sZXRyZWQ6IFsyMTksIDExMiwgMTQ3XSxcbiAgcGFwYXlhd2hpcDogWzI1NSwgMjM5LCAyMTNdLFxuICBwZWFjaHB1ZmY6IFsyNTUsIDIxOCwgMTg1XSxcbiAgcGVydTogWzIwNSwgMTMzLCA2M10sXG4gIHBpbms6IFsyNTUsIDE5MiwgMjAzXSxcbiAgcGx1bTogWzIyMSwgMTYwLCAyMjFdLFxuICBwb3dkZXJibHVlOiBbMTc2LCAyMjQsIDIzMF0sXG4gIHB1cnBsZTogWzEyOCwgMCwgMTI4XSxcbiAgcmVkOiBbMjU1LCAwLCAwXSxcbiAgcm9zeWJyb3duOiBbMTg4LCAxNDMsIDE0M10sXG4gIHJveWFsYmx1ZTogWzY1LCAxMDUsIDIyNV0sXG4gIHNhZGRsZWJyb3duOiBbMTM5LCA2OSwgMTldLFxuICBzYWxtb246IFsyNTAsIDEyOCwgMTE0XSxcbiAgc2FuZHlicm93bjogWzI0NCwgMTY0LCA5Nl0sXG4gIHNlYWdyZWVuOiBbNDYsIDEzOSwgODddLFxuICBzZWFzaGVsbDogWzI1NSwgMjQ1LCAyMzhdLFxuICBzaWVubmE6IFsxNjAsIDgyLCA0NV0sXG4gIHNpbHZlcjogWzE5MiwgMTkyLCAxOTJdLFxuICBza3libHVlOiBbMTM1LCAyMDYsIDIzNV0sXG4gIHNsYXRlYmx1ZTogWzEwNiwgOTAsIDIwNV0sXG4gIHNsYXRlZ3JheTogWzExMiwgMTI4LCAxNDRdLFxuICBzbGF0ZWdyZXk6IFsxMTIsIDEyOCwgMTQ0XSxcbiAgc25vdzogWzI1NSwgMjUwLCAyNTBdLFxuICBzcHJpbmdncmVlbjogWzAsIDI1NSwgMTI3XSxcbiAgc3RlZWxibHVlOiBbNzAsIDEzMCwgMTgwXSxcbiAgdGFuOiBbMjEwLCAxODAsIDE0MF0sXG4gIHRlYWw6IFswLCAxMjgsIDEyOF0sXG4gIHRoaXN0bGU6IFsyMTYsIDE5MSwgMjE2XSxcbiAgdG9tYXRvOiBbMjU1LCA5OSwgNzFdLFxuICB0dXJxdW9pc2U6IFs2NCwgMjI0LCAyMDhdLFxuICB2aW9sZXQ6IFsyMzgsIDEzMCwgMjM4XSxcbiAgd2hlYXQ6IFsyNDUsIDIyMiwgMTc5XSxcbiAgd2hpdGU6IFsyNTUsIDI1NSwgMjU1XSxcbiAgd2hpdGVzbW9rZTogWzI0NSwgMjQ1LCAyNDVdLFxuICB5ZWxsb3c6IFsyNTUsIDI1NSwgMF0sXG4gIHllbGxvd2dyZWVuOiBbMTU0LCAyMDUsIDUwXVxufTtcblxudmFyIHNldE1hcCA9IGZ1bmN0aW9uIHNldE1hcChvcHRpb25zKSB7XG4gIHZhciBvYmogPSBvcHRpb25zLm1hcDtcbiAgdmFyIGtleXMgPSBvcHRpb25zLmtleXM7XG4gIHZhciBsID0ga2V5cy5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgIGlmIChwbGFpbk9iamVjdChrZXkpKSB7XG4gICAgICB0aHJvdyBFcnJvcignVHJpZWQgdG8gc2V0IG1hcCB3aXRoIG9iamVjdCBrZXknKTtcbiAgICB9XG5cbiAgICBpZiAoaSA8IGtleXMubGVuZ3RoIC0gMSkge1xuICAgICAgLy8gZXh0ZW5kIHRoZSBtYXAgaWYgbmVjZXNzYXJ5XG4gICAgICBpZiAob2JqW2tleV0gPT0gbnVsbCkge1xuICAgICAgICBvYmpba2V5XSA9IHt9O1xuICAgICAgfVxuXG4gICAgICBvYmogPSBvYmpba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc2V0IHRoZSB2YWx1ZVxuICAgICAgb2JqW2tleV0gPSBvcHRpb25zLnZhbHVlO1xuICAgIH1cbiAgfVxufTsgLy8gZ2V0cyB0aGUgdmFsdWUgaW4gYSBtYXAgZXZlbiBpZiBpdCdzIG5vdCBidWlsdCBpbiBwbGFjZXNcblxudmFyIGdldE1hcCA9IGZ1bmN0aW9uIGdldE1hcChvcHRpb25zKSB7XG4gIHZhciBvYmogPSBvcHRpb25zLm1hcDtcbiAgdmFyIGtleXMgPSBvcHRpb25zLmtleXM7XG4gIHZhciBsID0ga2V5cy5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgIGlmIChwbGFpbk9iamVjdChrZXkpKSB7XG4gICAgICB0aHJvdyBFcnJvcignVHJpZWQgdG8gZ2V0IG1hcCB3aXRoIG9iamVjdCBrZXknKTtcbiAgICB9XG5cbiAgICBvYmogPSBvYmpba2V5XTtcblxuICAgIGlmIChvYmogPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTsgLy8gZGVsZXRlcyB0aGUgZW50cnkgaW4gdGhlIG1hcFxuXG52YXIgcGVyZm9ybWFuY2UgPSB3aW5kb3ckMSA/IHdpbmRvdyQxLnBlcmZvcm1hbmNlIDogbnVsbDtcbnZhciBwbm93ID0gcGVyZm9ybWFuY2UgJiYgcGVyZm9ybWFuY2Uubm93ID8gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KCk7XG59IDogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRGF0ZS5ub3coKTtcbn07XG5cbnZhciByYWYgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh3aW5kb3ckMSkge1xuICAgIGlmICh3aW5kb3ckMS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgd2luZG93JDEucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICh3aW5kb3ckMS5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgd2luZG93JDEubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICh3aW5kb3ckMS53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgd2luZG93JDEud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICh3aW5kb3ckMS5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChmbikge1xuICAgICAgICB3aW5kb3ckMS5tc1JlcXVlc3RBbmltYXRpb25GcmFtZShmbik7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICBpZiAoZm4pIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBmbihwbm93KCkpO1xuICAgICAgfSwgMTAwMCAvIDYwKTtcbiAgICB9XG4gIH07XG59KCk7XG5cbnZhciByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pIHtcbiAgcmV0dXJuIHJhZihmbik7XG59O1xudmFyIHBlcmZvcm1hbmNlTm93ID0gcG5vdztcblxudmFyIERFRkFVTFRfSEFTSF9TRUVEID0gOTI2MTtcbnZhciBLID0gNjU1OTk7IC8vIDM3IGFsc28gd29ya3MgcHJldHR5IHdlbGxcblxudmFyIERFRkFVTFRfSEFTSF9TRUVEX0FMVCA9IDUzODE7XG52YXIgaGFzaEl0ZXJhYmxlSW50cyA9IGZ1bmN0aW9uIGhhc2hJdGVyYWJsZUludHMoaXRlcmF0b3IpIHtcbiAgdmFyIHNlZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IERFRkFVTFRfSEFTSF9TRUVEO1xuICAvLyBzZGJtL3N0cmluZy1oYXNoXG4gIHZhciBoYXNoID0gc2VlZDtcbiAgdmFyIGVudHJ5O1xuXG4gIGZvciAoOzspIHtcbiAgICBlbnRyeSA9IGl0ZXJhdG9yLm5leHQoKTtcblxuICAgIGlmIChlbnRyeS5kb25lKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBoYXNoID0gaGFzaCAqIEsgKyBlbnRyeS52YWx1ZSB8IDA7XG4gIH1cblxuICByZXR1cm4gaGFzaDtcbn07XG52YXIgaGFzaEludCA9IGZ1bmN0aW9uIGhhc2hJbnQobnVtKSB7XG4gIHZhciBzZWVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBERUZBVUxUX0hBU0hfU0VFRDtcbiAgLy8gc2RibS9zdHJpbmctaGFzaFxuICByZXR1cm4gc2VlZCAqIEsgKyBudW0gfCAwO1xufTtcbnZhciBoYXNoSW50QWx0ID0gZnVuY3Rpb24gaGFzaEludEFsdChudW0pIHtcbiAgdmFyIHNlZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IERFRkFVTFRfSEFTSF9TRUVEX0FMVDtcbiAgLy8gZGpiMi9zdHJpbmctaGFzaFxuICByZXR1cm4gKHNlZWQgPDwgNSkgKyBzZWVkICsgbnVtIHwgMDtcbn07XG52YXIgY29tYmluZUhhc2hlcyA9IGZ1bmN0aW9uIGNvbWJpbmVIYXNoZXMoaGFzaDEsIGhhc2gyKSB7XG4gIHJldHVybiBoYXNoMSAqIDB4MjAwMDAwICsgaGFzaDI7XG59O1xudmFyIGNvbWJpbmVIYXNoZXNBcnJheSA9IGZ1bmN0aW9uIGNvbWJpbmVIYXNoZXNBcnJheShoYXNoZXMpIHtcbiAgcmV0dXJuIGhhc2hlc1swXSAqIDB4MjAwMDAwICsgaGFzaGVzWzFdO1xufTtcbnZhciBoYXNoQXJyYXlzID0gZnVuY3Rpb24gaGFzaEFycmF5cyhoYXNoZXMxLCBoYXNoZXMyKSB7XG4gIHJldHVybiBbaGFzaEludChoYXNoZXMxWzBdLCBoYXNoZXMyWzBdKSwgaGFzaEludEFsdChoYXNoZXMxWzFdLCBoYXNoZXMyWzFdKV07XG59O1xudmFyIGhhc2hJbnRzQXJyYXkgPSBmdW5jdGlvbiBoYXNoSW50c0FycmF5KGludHMsIHNlZWQpIHtcbiAgdmFyIGVudHJ5ID0ge1xuICAgIHZhbHVlOiAwLFxuICAgIGRvbmU6IGZhbHNlXG4gIH07XG4gIHZhciBpID0gMDtcbiAgdmFyIGxlbmd0aCA9IGludHMubGVuZ3RoO1xuICB2YXIgaXRlcmF0b3IgPSB7XG4gICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICAgIGVudHJ5LnZhbHVlID0gaW50c1tpKytdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cnkuZG9uZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBoYXNoSXRlcmFibGVJbnRzKGl0ZXJhdG9yLCBzZWVkKTtcbn07XG52YXIgaGFzaFN0cmluZyA9IGZ1bmN0aW9uIGhhc2hTdHJpbmcoc3RyLCBzZWVkKSB7XG4gIHZhciBlbnRyeSA9IHtcbiAgICB2YWx1ZTogMCxcbiAgICBkb25lOiBmYWxzZVxuICB9O1xuICB2YXIgaSA9IDA7XG4gIHZhciBsZW5ndGggPSBzdHIubGVuZ3RoO1xuICB2YXIgaXRlcmF0b3IgPSB7XG4gICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICAgIGVudHJ5LnZhbHVlID0gc3RyLmNoYXJDb2RlQXQoaSsrKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudHJ5LmRvbmUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gaGFzaEl0ZXJhYmxlSW50cyhpdGVyYXRvciwgc2VlZCk7XG59O1xudmFyIGhhc2hTdHJpbmdzID0gZnVuY3Rpb24gaGFzaFN0cmluZ3MoKSB7XG4gIHJldHVybiBoYXNoU3RyaW5nc0FycmF5KGFyZ3VtZW50cyk7XG59O1xudmFyIGhhc2hTdHJpbmdzQXJyYXkgPSBmdW5jdGlvbiBoYXNoU3RyaW5nc0FycmF5KHN0cnMpIHtcbiAgdmFyIGhhc2g7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHN0ciA9IHN0cnNbaV07XG5cbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgaGFzaCA9IGhhc2hTdHJpbmcoc3RyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGFzaCA9IGhhc2hTdHJpbmcoc3RyLCBoYXNoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaGFzaDtcbn07XG5cbi8qZ2xvYmFsIGNvbnNvbGUgKi9cbnZhciB3YXJuaW5nc0VuYWJsZWQgPSB0cnVlO1xudmFyIHdhcm5TdXBwb3J0ZWQgPSBjb25zb2xlLndhcm4gIT0gbnVsbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG5cbnZhciB0cmFjZVN1cHBvcnRlZCA9IGNvbnNvbGUudHJhY2UgIT0gbnVsbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG5cbnZhciBNQVhfSU5UJDEgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fCA5MDA3MTk5MjU0NzQwOTkxO1xudmFyIHRydWVpZnkgPSBmdW5jdGlvbiB0cnVlaWZ5KCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgZmFsc2lmeSA9IGZ1bmN0aW9uIGZhbHNpZnkoKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG52YXIgemVyb2lmeSA9IGZ1bmN0aW9uIHplcm9pZnkoKSB7XG4gIHJldHVybiAwO1xufTtcbnZhciBub29wJDEgPSBmdW5jdGlvbiBub29wKCkge307XG52YXIgZXJyb3IgPSBmdW5jdGlvbiBlcnJvcihtc2cpIHtcbiAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG59O1xudmFyIHdhcm5pbmdzID0gZnVuY3Rpb24gd2FybmluZ3MoZW5hYmxlZCkge1xuICBpZiAoZW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgd2FybmluZ3NFbmFibGVkID0gISFlbmFibGVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB3YXJuaW5nc0VuYWJsZWQ7XG4gIH1cbn07XG52YXIgd2FybiA9IGZ1bmN0aW9uIHdhcm4obXNnKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgaWYgKCF3YXJuaW5ncygpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHdhcm5TdXBwb3J0ZWQpIHtcbiAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhtc2cpO1xuXG4gICAgaWYgKHRyYWNlU3VwcG9ydGVkKSB7XG4gICAgICBjb25zb2xlLnRyYWNlKCk7XG4gICAgfVxuICB9XG59O1xuLyogZXNsaW50LWVuYWJsZSAqL1xuXG52YXIgY2xvbmUgPSBmdW5jdGlvbiBjbG9uZShvYmopIHtcbiAgcmV0dXJuIGV4dGVuZCh7fSwgb2JqKTtcbn07IC8vIGdldHMgYSBzaGFsbG93IGNvcHkgb2YgdGhlIGFyZ3VtZW50XG5cbnZhciBjb3B5ID0gZnVuY3Rpb24gY29weShvYmopIHtcbiAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGlmIChhcnJheShvYmopKSB7XG4gICAgcmV0dXJuIG9iai5zbGljZSgpO1xuICB9IGVsc2UgaWYgKHBsYWluT2JqZWN0KG9iaikpIHtcbiAgICByZXR1cm4gY2xvbmUob2JqKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG59O1xudmFyIGNvcHlBcnJheSA9IGZ1bmN0aW9uIGNvcHlBcnJheShhcnIpIHtcbiAgcmV0dXJuIGFyci5zbGljZSgpO1xufTtcbnZhciB1dWlkID0gZnVuY3Rpb24gdXVpZChhLCBiXG4vKiBwbGFjZWhvbGRlcnMgKi9cbikge1xuICBmb3IgKCAvLyBsb29wIDopXG4gIGIgPSBhID0gJyc7IC8vIGIgLSByZXN1bHQgLCBhIC0gbnVtZXJpYyBsZXRpYWJsZVxuICBhKysgPCAzNjsgLy9cbiAgYiArPSBhICogNTEgJiA1MiAvLyBpZiBcImFcIiBpcyBub3QgOSBvciAxNCBvciAxOSBvciAyNFxuICA/IC8vICByZXR1cm4gYSByYW5kb20gbnVtYmVyIG9yIDRcbiAgKGEgXiAxNSAvLyBpZiBcImFcIiBpcyBub3QgMTVcbiAgPyAvLyBnZW5lcmF0ZSBhIHJhbmRvbSBudW1iZXIgZnJvbSAwIHRvIDE1XG4gIDggXiBNYXRoLnJhbmRvbSgpICogKGEgXiAyMCA/IDE2IDogNCkgLy8gdW5sZXNzIFwiYVwiIGlzIDIwLCBpbiB3aGljaCBjYXNlIGEgcmFuZG9tIG51bWJlciBmcm9tIDggdG8gMTFcbiAgOiA0IC8vICBvdGhlcndpc2UgNFxuICApLnRvU3RyaW5nKDE2KSA6ICctJyAvLyAgaW4gb3RoZXIgY2FzZXMgKGlmIFwiYVwiIGlzIDksMTQsMTksMjQpIGluc2VydCBcIi1cIlxuICApIHtcbiAgfVxuXG4gIHJldHVybiBiO1xufTtcbnZhciBfc3RhdGljRW1wdHlPYmplY3QgPSB7fTtcbnZhciBzdGF0aWNFbXB0eU9iamVjdCA9IGZ1bmN0aW9uIHN0YXRpY0VtcHR5T2JqZWN0KCkge1xuICByZXR1cm4gX3N0YXRpY0VtcHR5T2JqZWN0O1xufTtcbnZhciBkZWZhdWx0cyRnID0gZnVuY3Rpb24gZGVmYXVsdHMoX2RlZmF1bHRzKSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoX2RlZmF1bHRzKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgdmFyIGZpbGxlZE9wdHMgPSB7fTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICB2YXIgb3B0VmFsID0gb3B0cyA9PSBudWxsID8gdW5kZWZpbmVkIDogb3B0c1trZXldO1xuICAgICAgZmlsbGVkT3B0c1trZXldID0gb3B0VmFsID09PSB1bmRlZmluZWQgPyBfZGVmYXVsdHNba2V5XSA6IG9wdFZhbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmlsbGVkT3B0cztcbiAgfTtcbn07XG52YXIgcmVtb3ZlRnJvbUFycmF5ID0gZnVuY3Rpb24gcmVtb3ZlRnJvbUFycmF5KGFyciwgZWxlLCBvbmVDb3B5KSB7XG4gIGZvciAodmFyIGkgPSBhcnIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoYXJyW2ldID09PSBlbGUpIHtcbiAgICAgIGFyci5zcGxpY2UoaSwgMSk7XG5cbiAgICAgIGlmIChvbmVDb3B5KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbnZhciBjbGVhckFycmF5ID0gZnVuY3Rpb24gY2xlYXJBcnJheShhcnIpIHtcbiAgYXJyLnNwbGljZSgwLCBhcnIubGVuZ3RoKTtcbn07XG52YXIgcHVzaCA9IGZ1bmN0aW9uIHB1c2goYXJyLCBvdGhlckFycikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG90aGVyQXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsID0gb3RoZXJBcnJbaV07XG4gICAgYXJyLnB1c2goZWwpO1xuICB9XG59O1xudmFyIGdldFByZWZpeGVkUHJvcGVydHkgPSBmdW5jdGlvbiBnZXRQcmVmaXhlZFByb3BlcnR5KG9iaiwgcHJvcE5hbWUsIHByZWZpeCkge1xuICBpZiAocHJlZml4KSB7XG4gICAgcHJvcE5hbWUgPSBwcmVwZW5kQ2FtZWwocHJlZml4LCBwcm9wTmFtZSk7IC8vIGUuZy4gKGxhYmVsV2lkdGgsIHNvdXJjZSkgPT4gc291cmNlTGFiZWxXaWR0aFxuICB9XG5cbiAgcmV0dXJuIG9ialtwcm9wTmFtZV07XG59O1xudmFyIHNldFByZWZpeGVkUHJvcGVydHkgPSBmdW5jdGlvbiBzZXRQcmVmaXhlZFByb3BlcnR5KG9iaiwgcHJvcE5hbWUsIHByZWZpeCwgdmFsdWUpIHtcbiAgaWYgKHByZWZpeCkge1xuICAgIHByb3BOYW1lID0gcHJlcGVuZENhbWVsKHByZWZpeCwgcHJvcE5hbWUpOyAvLyBlLmcuIChsYWJlbFdpZHRoLCBzb3VyY2UpID0+IHNvdXJjZUxhYmVsV2lkdGhcbiAgfVxuXG4gIG9ialtwcm9wTmFtZV0gPSB2YWx1ZTtcbn07XG5cbi8qIGdsb2JhbCBNYXAgKi9cbnZhciBPYmplY3RNYXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBPYmplY3RNYXAoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE9iamVjdE1hcCk7XG5cbiAgICB0aGlzLl9vYmogPSB7fTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhPYmplY3RNYXAsIFt7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQoa2V5LCB2YWwpIHtcbiAgICAgIHRoaXMuX29ialtrZXldID0gdmFsO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVsZXRlKGtleSkge1xuICAgICAgdGhpcy5fb2JqW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2xlYXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB0aGlzLl9vYmogPSB7fTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9vYmpba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX29ialtrZXldO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBPYmplY3RNYXA7XG59KCk7XG5cbnZhciBNYXAkMSA9IHR5cGVvZiBNYXAgIT09ICd1bmRlZmluZWQnID8gTWFwIDogT2JqZWN0TWFwO1xuXG4vKiBnbG9iYWwgU2V0ICovXG52YXIgdW5kZWYgPSBcInVuZGVmaW5lZFwiIDtcblxudmFyIE9iamVjdFNldCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE9iamVjdFNldChhcnJheU9yT2JqZWN0U2V0KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE9iamVjdFNldCk7XG5cbiAgICB0aGlzLl9vYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuc2l6ZSA9IDA7XG5cbiAgICBpZiAoYXJyYXlPck9iamVjdFNldCAhPSBudWxsKSB7XG4gICAgICB2YXIgYXJyO1xuXG4gICAgICBpZiAoYXJyYXlPck9iamVjdFNldC5pbnN0YW5jZVN0cmluZyAhPSBudWxsICYmIGFycmF5T3JPYmplY3RTZXQuaW5zdGFuY2VTdHJpbmcoKSA9PT0gdGhpcy5pbnN0YW5jZVN0cmluZygpKSB7XG4gICAgICAgIGFyciA9IGFycmF5T3JPYmplY3RTZXQudG9BcnJheSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJyID0gYXJyYXlPck9iamVjdFNldDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5hZGQoYXJyW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoT2JqZWN0U2V0LCBbe1xuICAgIGtleTogXCJpbnN0YW5jZVN0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnN0YW5jZVN0cmluZygpIHtcbiAgICAgIHJldHVybiAnc2V0JztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZCh2YWwpIHtcbiAgICAgIHZhciBvID0gdGhpcy5fb2JqO1xuXG4gICAgICBpZiAob1t2YWxdICE9PSAxKSB7XG4gICAgICAgIG9bdmFsXSA9IDE7XG4gICAgICAgIHRoaXMuc2l6ZSsrO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZWxldGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2RlbGV0ZSh2YWwpIHtcbiAgICAgIHZhciBvID0gdGhpcy5fb2JqO1xuXG4gICAgICBpZiAob1t2YWxdID09PSAxKSB7XG4gICAgICAgIG9bdmFsXSA9IDA7XG4gICAgICAgIHRoaXMuc2l6ZS0tO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbGVhclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIHRoaXMuX29iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXModmFsKSB7XG4gICAgICByZXR1cm4gdGhpcy5fb2JqW3ZhbF0gPT09IDE7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvQXJyYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9BcnJheSgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9vYmopLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5oYXMoa2V5KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb3JFYWNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvQXJyYXkoKS5mb3JFYWNoKGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gT2JqZWN0U2V0O1xufSgpO1xuXG52YXIgU2V0JDEgPSAodHlwZW9mIFNldCA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKFNldCkpICE9PSB1bmRlZiA/IFNldCA6IE9iamVjdFNldDtcblxudmFyIEVsZW1lbnQgPSBmdW5jdGlvbiBFbGVtZW50KGN5LCBwYXJhbXMpIHtcbiAgdmFyIHJlc3RvcmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHRydWU7XG5cbiAgaWYgKGN5ID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSB1bmRlZmluZWQgfHwgIWNvcmUoY3kpKSB7XG4gICAgZXJyb3IoJ0FuIGVsZW1lbnQgbXVzdCBoYXZlIGEgY29yZSByZWZlcmVuY2UgYW5kIHBhcmFtZXRlcnMgc2V0Jyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGdyb3VwID0gcGFyYW1zLmdyb3VwOyAvLyB0cnkgdG8gYXV0b21hdGljYWxseSBpbmZlciB0aGUgZ3JvdXAgaWYgdW5zcGVjaWZpZWRcblxuICBpZiAoZ3JvdXAgPT0gbnVsbCkge1xuICAgIGlmIChwYXJhbXMuZGF0YSAmJiBwYXJhbXMuZGF0YS5zb3VyY2UgIT0gbnVsbCAmJiBwYXJhbXMuZGF0YS50YXJnZXQgIT0gbnVsbCkge1xuICAgICAgZ3JvdXAgPSAnZWRnZXMnO1xuICAgIH0gZWxzZSB7XG4gICAgICBncm91cCA9ICdub2Rlcyc7XG4gICAgfVxuICB9IC8vIHZhbGlkYXRlIGdyb3VwXG5cblxuICBpZiAoZ3JvdXAgIT09ICdub2RlcycgJiYgZ3JvdXAgIT09ICdlZGdlcycpIHtcbiAgICBlcnJvcignQW4gZWxlbWVudCBtdXN0IGJlIG9mIHR5cGUgYG5vZGVzYCBvciBgZWRnZXNgOyB5b3Ugc3BlY2lmaWVkIGAnICsgZ3JvdXAgKyAnYCcpO1xuICAgIHJldHVybjtcbiAgfSAvLyBtYWtlIHRoZSBlbGVtZW50IGFycmF5LWxpa2UsIGp1c3QgbGlrZSBhIGNvbGxlY3Rpb25cblxuXG4gIHRoaXMubGVuZ3RoID0gMTtcbiAgdGhpc1swXSA9IHRoaXM7IC8vIE5PVEU6IHdoZW4gc29tZXRoaW5nIGlzIGFkZGVkIGhlcmUsIGFkZCBhbHNvIHRvIGVsZS5qc29uKClcblxuICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlID0ge1xuICAgIGN5OiBjeSxcbiAgICBzaW5nbGU6IHRydWUsXG4gICAgLy8gaW5kaWNhdGVzIHRoaXMgaXMgYW4gZWxlbWVudFxuICAgIGRhdGE6IHBhcmFtcy5kYXRhIHx8IHt9LFxuICAgIC8vIGRhdGEgb2JqZWN0XG4gICAgcG9zaXRpb246IHBhcmFtcy5wb3NpdGlvbiB8fCB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH0sXG4gICAgLy8gKHgsIHkpIHBvc2l0aW9uIHBhaXJcbiAgICBhdXRvV2lkdGg6IHVuZGVmaW5lZCxcbiAgICAvLyB3aWR0aCBhbmQgaGVpZ2h0IG9mIG5vZGVzIGNhbGN1bGF0ZWQgYnkgdGhlIHJlbmRlcmVyIHdoZW4gc2V0IHRvIHNwZWNpYWwgJ2F1dG8nIHZhbHVlXG4gICAgYXV0b0hlaWdodDogdW5kZWZpbmVkLFxuICAgIGF1dG9QYWRkaW5nOiB1bmRlZmluZWQsXG4gICAgY29tcG91bmRCb3VuZHNDbGVhbjogZmFsc2UsXG4gICAgLy8gd2hldGhlciB0aGUgY29tcG91bmQgZGltZW5zaW9ucyBuZWVkIHRvIGJlIHJlY2FsY3VsYXRlZCB0aGUgbmV4dCB0aW1lIGRpbWVuc2lvbnMgYXJlIHJlYWRcbiAgICBsaXN0ZW5lcnM6IFtdLFxuICAgIC8vIGFycmF5IG9mIGJvdW5kIGxpc3RlbmVyc1xuICAgIGdyb3VwOiBncm91cCxcbiAgICAvLyBzdHJpbmc7ICdub2Rlcycgb3IgJ2VkZ2VzJ1xuICAgIHN0eWxlOiB7fSxcbiAgICAvLyBwcm9wZXJ0aWVzIGFzIHNldCBieSB0aGUgc3R5bGVcbiAgICByc3R5bGU6IHt9LFxuICAgIC8vIHByb3BlcnRpZXMgZm9yIHN0eWxlIHNlbnQgZnJvbSB0aGUgcmVuZGVyZXIgdG8gdGhlIGNvcmVcbiAgICBzdHlsZUN4dHM6IFtdLFxuICAgIC8vIGFwcGxpZWQgc3R5bGUgY29udGV4dHMgZnJvbSB0aGUgc3R5bGVyXG4gICAgc3R5bGVLZXlzOiB7fSxcbiAgICAvLyBwZXItZ3JvdXAga2V5cyBvZiBzdHlsZSBwcm9wZXJ0eSB2YWx1ZXNcbiAgICByZW1vdmVkOiB0cnVlLFxuICAgIC8vIHdoZXRoZXIgaXQncyBpbnNpZGUgdGhlIHZpczsgdHJ1ZSBpZiByZW1vdmVkIChzZXQgdHJ1ZSBoZXJlIHNpbmNlIHdlIGNhbGwgcmVzdG9yZSlcbiAgICBzZWxlY3RlZDogcGFyYW1zLnNlbGVjdGVkID8gdHJ1ZSA6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgaXQncyBzZWxlY3RlZFxuICAgIHNlbGVjdGFibGU6IHBhcmFtcy5zZWxlY3RhYmxlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcGFyYW1zLnNlbGVjdGFibGUgPyB0cnVlIDogZmFsc2UsXG4gICAgLy8gd2hldGhlciBpdCdzIHNlbGVjdGFibGVcbiAgICBsb2NrZWQ6IHBhcmFtcy5sb2NrZWQgPyB0cnVlIDogZmFsc2UsXG4gICAgLy8gd2hldGhlciB0aGUgZWxlbWVudCBpcyBsb2NrZWQgKGNhbm5vdCBiZSBtb3ZlZClcbiAgICBncmFiYmVkOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIGdyYWJiZWQgYnkgdGhlIG1vdXNlOyByZW5kZXJlciBzZXRzIHRoaXMgcHJpdmF0ZWx5XG4gICAgZ3JhYmJhYmxlOiBwYXJhbXMuZ3JhYmJhYmxlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcGFyYW1zLmdyYWJiYWJsZSA/IHRydWUgOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIHRoZSBlbGVtZW50IGNhbiBiZSBncmFiYmVkXG4gICAgcGFubmFibGU6IHBhcmFtcy5wYW5uYWJsZSA9PT0gdW5kZWZpbmVkID8gZ3JvdXAgPT09ICdlZGdlcycgPyB0cnVlIDogZmFsc2UgOiBwYXJhbXMucGFubmFibGUgPyB0cnVlIDogZmFsc2UsXG4gICAgLy8gd2hldGhlciB0aGUgZWxlbWVudCBoYXMgcGFzc3Rocm91Z2ggcGFubmluZyBlbmFibGVkXG4gICAgYWN0aXZlOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIGFjdGl2ZSBmcm9tIHVzZXIgaW50ZXJhY3Rpb25cbiAgICBjbGFzc2VzOiBuZXcgU2V0JDEoKSxcbiAgICAvLyBtYXAgKCBjbGFzc05hbWUgPT4gdHJ1ZSApXG4gICAgYW5pbWF0aW9uOiB7XG4gICAgICAvLyBvYmplY3QgZm9yIGN1cnJlbnRseS1ydW5uaW5nIGFuaW1hdGlvbnNcbiAgICAgIGN1cnJlbnQ6IFtdLFxuICAgICAgcXVldWU6IFtdXG4gICAgfSxcbiAgICByc2NyYXRjaDoge30sXG4gICAgLy8gb2JqZWN0IGluIHdoaWNoIHRoZSByZW5kZXJlciBjYW4gc3RvcmUgaW5mb3JtYXRpb25cbiAgICBzY3JhdGNoOiBwYXJhbXMuc2NyYXRjaCB8fCB7fSxcbiAgICAvLyBzY3JhdGNoIG9iamVjdHNcbiAgICBlZGdlczogW10sXG4gICAgLy8gYXJyYXkgb2YgY29ubmVjdGVkIGVkZ2VzXG4gICAgY2hpbGRyZW46IFtdLFxuICAgIC8vIGFycmF5IG9mIGNoaWxkcmVuXG4gICAgcGFyZW50OiBwYXJhbXMucGFyZW50ICYmIHBhcmFtcy5wYXJlbnQuaXNOb2RlKCkgPyBwYXJhbXMucGFyZW50IDogbnVsbCxcbiAgICAvLyBwYXJlbnQgcmVmXG4gICAgdHJhdmVyc2FsQ2FjaGU6IHt9LFxuICAgIC8vIGNhY2hlIG9mIG91dHB1dCBvZiB0cmF2ZXJzYWwgZnVuY3Rpb25zXG4gICAgYmFja2dyb3VuZGluZzogZmFsc2UsXG4gICAgLy8gd2hldGhlciBiYWNrZ3JvdW5kIGltYWdlcyBhcmUgbG9hZGluZ1xuICAgIGJiQ2FjaGU6IG51bGwsXG4gICAgLy8gY2FjaGUgb2YgdGhlIGN1cnJlbnQgYm91bmRpbmcgYm94XG4gICAgYmJDYWNoZVNoaWZ0OiB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH0sXG4gICAgLy8gc2hpZnQgYXBwbGllZCB0byBjYWNoZWQgYmIgdG8gYmUgYXBwbGllZCBvbiBuZXh0IGdldFxuICAgIGJvZHlCb3VuZHM6IG51bGwsXG4gICAgLy8gYm91bmRzIGNhY2hlIG9mIGVsZW1lbnQgYm9keSwgdy9vIG92ZXJsYXlcbiAgICBvdmVybGF5Qm91bmRzOiBudWxsLFxuICAgIC8vIGJvdW5kcyBjYWNoZSBvZiBlbGVtZW50IGJvZHksIGluY2x1ZGluZyBvdmVybGF5XG4gICAgbGFiZWxCb3VuZHM6IHtcbiAgICAgIC8vIGJvdW5kcyBjYWNoZSBvZiBsYWJlbHNcbiAgICAgIGFsbDogbnVsbCxcbiAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgIHRhcmdldDogbnVsbCxcbiAgICAgIG1haW46IG51bGxcbiAgICB9LFxuICAgIGFycm93Qm91bmRzOiB7XG4gICAgICAvLyBib3VuZHMgY2FjaGUgb2YgZWRnZSBhcnJvd3NcbiAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgIHRhcmdldDogbnVsbCxcbiAgICAgICdtaWQtc291cmNlJzogbnVsbCxcbiAgICAgICdtaWQtdGFyZ2V0JzogbnVsbFxuICAgIH1cbiAgfTtcblxuICBpZiAoX3AucG9zaXRpb24ueCA9PSBudWxsKSB7XG4gICAgX3AucG9zaXRpb24ueCA9IDA7XG4gIH1cblxuICBpZiAoX3AucG9zaXRpb24ueSA9PSBudWxsKSB7XG4gICAgX3AucG9zaXRpb24ueSA9IDA7XG4gIH0gLy8gcmVuZGVyZWRQb3NpdGlvbiBvdmVycmlkZXMgaWYgc3BlY2lmaWVkXG5cblxuICBpZiAocGFyYW1zLnJlbmRlcmVkUG9zaXRpb24pIHtcbiAgICB2YXIgcnBvcyA9IHBhcmFtcy5yZW5kZXJlZFBvc2l0aW9uO1xuICAgIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICBfcC5wb3NpdGlvbiA9IHtcbiAgICAgIHg6IChycG9zLnggLSBwYW4ueCkgLyB6b29tLFxuICAgICAgeTogKHJwb3MueSAtIHBhbi55KSAvIHpvb21cbiAgICB9O1xuICB9XG5cbiAgdmFyIGNsYXNzZXMgPSBbXTtcblxuICBpZiAoYXJyYXkocGFyYW1zLmNsYXNzZXMpKSB7XG4gICAgY2xhc3NlcyA9IHBhcmFtcy5jbGFzc2VzO1xuICB9IGVsc2UgaWYgKHN0cmluZyhwYXJhbXMuY2xhc3NlcykpIHtcbiAgICBjbGFzc2VzID0gcGFyYW1zLmNsYXNzZXMuc3BsaXQoL1xccysvKTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gY2xhc3Nlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIgY2xzID0gY2xhc3Nlc1tpXTtcblxuICAgIGlmICghY2xzIHx8IGNscyA9PT0gJycpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIF9wLmNsYXNzZXMuYWRkKGNscyk7XG4gIH1cblxuICB0aGlzLmNyZWF0ZUVtaXR0ZXIoKTtcbiAgdmFyIGJ5cGFzcyA9IHBhcmFtcy5zdHlsZSB8fCBwYXJhbXMuY3NzO1xuXG4gIGlmIChieXBhc3MpIHtcbiAgICB3YXJuKCdTZXR0aW5nIGEgYHN0eWxlYCBieXBhc3MgYXQgZWxlbWVudCBjcmVhdGlvbiBzaG91bGQgYmUgZG9uZSBvbmx5IHdoZW4gYWJzb2x1dGVseSBuZWNlc3NhcnkuICBUcnkgdG8gdXNlIHRoZSBzdHlsZXNoZWV0IGluc3RlYWQuJyk7XG4gICAgdGhpcy5zdHlsZShieXBhc3MpO1xuICB9XG5cbiAgaWYgKHJlc3RvcmUgPT09IHVuZGVmaW5lZCB8fCByZXN0b3JlKSB7XG4gICAgdGhpcy5yZXN0b3JlKCk7XG4gIH1cbn07XG5cbnZhciBkZWZpbmVTZWFyY2ggPSBmdW5jdGlvbiBkZWZpbmVTZWFyY2gocGFyYW1zKSB7XG4gIHBhcmFtcyA9IHtcbiAgICBiZnM6IHBhcmFtcy5iZnMgfHwgIXBhcmFtcy5kZnMsXG4gICAgZGZzOiBwYXJhbXMuZGZzIHx8ICFwYXJhbXMuYmZzXG4gIH07IC8vIGZyb20gcHNldWRvY29kZSBvbiB3aWtpcGVkaWFcblxuICByZXR1cm4gZnVuY3Rpb24gc2VhcmNoRm4ocm9vdHMsIGZuLCBkaXJlY3RlZCkge1xuICAgIHZhciBvcHRpb25zO1xuXG4gICAgaWYgKHBsYWluT2JqZWN0KHJvb3RzKSAmJiAhZWxlbWVudE9yQ29sbGVjdGlvbihyb290cykpIHtcbiAgICAgIG9wdGlvbnMgPSByb290cztcbiAgICAgIHJvb3RzID0gb3B0aW9ucy5yb290cyB8fCBvcHRpb25zLnJvb3Q7XG4gICAgICBmbiA9IG9wdGlvbnMudmlzaXQ7XG4gICAgICBkaXJlY3RlZCA9IG9wdGlvbnMuZGlyZWN0ZWQ7XG4gICAgfVxuXG4gICAgZGlyZWN0ZWQgPSBhcmd1bWVudHMubGVuZ3RoID09PSAyICYmICFmbiQ2KGZuKSA/IGZuIDogZGlyZWN0ZWQ7XG4gICAgZm4gPSBmbiQ2KGZuKSA/IGZuIDogZnVuY3Rpb24gKCkge307XG4gICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgICB2YXIgdiA9IHJvb3RzID0gc3RyaW5nKHJvb3RzKSA/IHRoaXMuZmlsdGVyKHJvb3RzKSA6IHJvb3RzO1xuICAgIHZhciBRID0gW107XG4gICAgdmFyIGNvbm5lY3RlZE5vZGVzID0gW107XG4gICAgdmFyIGNvbm5lY3RlZEJ5ID0ge307XG4gICAgdmFyIGlkMmRlcHRoID0ge307XG4gICAgdmFyIFYgPSB7fTtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGZvdW5kO1xuXG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgICAgbm9kZXMgPSBfdGhpcyRieUdyb3VwLm5vZGVzLFxuICAgICAgICBlZGdlcyA9IF90aGlzJGJ5R3JvdXAuZWRnZXM7IC8vIGVucXVldWUgdlxuXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHYubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2aSA9IHZbaV07XG4gICAgICB2YXIgdmlJZCA9IHZpLmlkKCk7XG5cbiAgICAgIGlmICh2aS5pc05vZGUoKSkge1xuICAgICAgICBRLnVuc2hpZnQodmkpO1xuXG4gICAgICAgIGlmIChwYXJhbXMuYmZzKSB7XG4gICAgICAgICAgVlt2aUlkXSA9IHRydWU7XG4gICAgICAgICAgY29ubmVjdGVkTm9kZXMucHVzaCh2aSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZDJkZXB0aFt2aUlkXSA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICB2YXIgdiA9IHBhcmFtcy5iZnMgPyBRLnNoaWZ0KCkgOiBRLnBvcCgpO1xuICAgICAgdmFyIHZJZCA9IHYuaWQoKTtcblxuICAgICAgaWYgKHBhcmFtcy5kZnMpIHtcbiAgICAgICAgaWYgKFZbdklkXSkge1xuICAgICAgICAgIHJldHVybiBcImNvbnRpbnVlXCI7XG4gICAgICAgIH1cblxuICAgICAgICBWW3ZJZF0gPSB0cnVlO1xuICAgICAgICBjb25uZWN0ZWROb2Rlcy5wdXNoKHYpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGVwdGggPSBpZDJkZXB0aFt2SWRdO1xuICAgICAgdmFyIHByZXZFZGdlID0gY29ubmVjdGVkQnlbdklkXTtcbiAgICAgIHZhciBzcmMgPSBwcmV2RWRnZSAhPSBudWxsID8gcHJldkVkZ2Uuc291cmNlKCkgOiBudWxsO1xuICAgICAgdmFyIHRndCA9IHByZXZFZGdlICE9IG51bGwgPyBwcmV2RWRnZS50YXJnZXQoKSA6IG51bGw7XG4gICAgICB2YXIgcHJldk5vZGUgPSBwcmV2RWRnZSA9PSBudWxsID8gdW5kZWZpbmVkIDogdi5zYW1lKHNyYykgPyB0Z3RbMF0gOiBzcmNbMF07XG4gICAgICB2YXIgcmV0ID0gdm9pZCAwO1xuICAgICAgcmV0ID0gZm4odiwgcHJldkVkZ2UsIHByZXZOb2RlLCBqKyssIGRlcHRoKTtcblxuICAgICAgaWYgKHJldCA9PT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZCA9IHY7XG4gICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICB9XG5cbiAgICAgIHZhciB2d0VkZ2VzID0gdi5jb25uZWN0ZWRFZGdlcygpLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gKCFkaXJlY3RlZCB8fCBlLnNvdXJjZSgpLnNhbWUodikpICYmIGVkZ2VzLmhhcyhlKTtcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCB2d0VkZ2VzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgdmFyIGUgPSB2d0VkZ2VzW19pMl07XG4gICAgICAgIHZhciB3ID0gZS5jb25uZWN0ZWROb2RlcygpLmZpbHRlcihmdW5jdGlvbiAobikge1xuICAgICAgICAgIHJldHVybiAhbi5zYW1lKHYpICYmIG5vZGVzLmhhcyhuKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB3SWQgPSB3LmlkKCk7XG5cbiAgICAgICAgaWYgKHcubGVuZ3RoICE9PSAwICYmICFWW3dJZF0pIHtcbiAgICAgICAgICB3ID0gd1swXTtcbiAgICAgICAgICBRLnB1c2godyk7XG5cbiAgICAgICAgICBpZiAocGFyYW1zLmJmcykge1xuICAgICAgICAgICAgVlt3SWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbm5lY3RlZE5vZGVzLnB1c2godyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29ubmVjdGVkQnlbd0lkXSA9IGU7XG4gICAgICAgICAgaWQyZGVwdGhbd0lkXSA9IGlkMmRlcHRoW3ZJZF0gKyAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdoaWxlIChRLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdmFyIF9yZXQgPSBfbG9vcCgpO1xuXG4gICAgICBpZiAoX3JldCA9PT0gXCJjb250aW51ZVwiKSBjb250aW51ZTtcbiAgICAgIGlmIChfcmV0ID09PSBcImJyZWFrXCIpIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBjb25uZWN0ZWRFbGVzID0gY3kuY29sbGVjdGlvbigpO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGNvbm5lY3RlZE5vZGVzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIG5vZGUgPSBjb25uZWN0ZWROb2Rlc1tfaV07XG4gICAgICB2YXIgZWRnZSA9IGNvbm5lY3RlZEJ5W25vZGUuaWQoKV07XG5cbiAgICAgIGlmIChlZGdlICE9IG51bGwpIHtcbiAgICAgICAgY29ubmVjdGVkRWxlcy5wdXNoKGVkZ2UpO1xuICAgICAgfVxuXG4gICAgICBjb25uZWN0ZWRFbGVzLnB1c2gobm9kZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGg6IGN5LmNvbGxlY3Rpb24oY29ubmVjdGVkRWxlcyksXG4gICAgICBmb3VuZDogY3kuY29sbGVjdGlvbihmb3VuZClcbiAgICB9O1xuICB9O1xufTsgLy8gc2VhcmNoLCBzcGFubmluZyB0cmVlcywgZXRjXG5cblxudmFyIGVsZXNmbiR2ID0ge1xuICBicmVhZHRoRmlyc3RTZWFyY2g6IGRlZmluZVNlYXJjaCh7XG4gICAgYmZzOiB0cnVlXG4gIH0pLFxuICBkZXB0aEZpcnN0U2VhcmNoOiBkZWZpbmVTZWFyY2goe1xuICAgIGRmczogdHJ1ZVxuICB9KVxufTsgLy8gbmljZSwgc2hvcnQgbWF0aGVtYXRpY2FsIGFsaWFzXG5cbmVsZXNmbiR2LmJmcyA9IGVsZXNmbiR2LmJyZWFkdGhGaXJzdFNlYXJjaDtcbmVsZXNmbiR2LmRmcyA9IGVsZXNmbiR2LmRlcHRoRmlyc3RTZWFyY2g7XG5cbnZhciBkaWprc3RyYURlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIHJvb3Q6IG51bGwsXG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgZGlyZWN0ZWQ6IGZhbHNlXG59KTtcbnZhciBlbGVzZm4kdSA9IHtcbiAgZGlqa3N0cmE6IGZ1bmN0aW9uIGRpamtzdHJhKG9wdGlvbnMpIHtcbiAgICBpZiAoIXBsYWluT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgIHJvb3Q6IGFyZ3NbMF0sXG4gICAgICAgIHdlaWdodDogYXJnc1sxXSxcbiAgICAgICAgZGlyZWN0ZWQ6IGFyZ3NbMl1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9kaWprc3RyYURlZmF1bHRzID0gZGlqa3N0cmFEZWZhdWx0cyhvcHRpb25zKSxcbiAgICAgICAgcm9vdCA9IF9kaWprc3RyYURlZmF1bHRzLnJvb3QsXG4gICAgICAgIHdlaWdodCA9IF9kaWprc3RyYURlZmF1bHRzLndlaWdodCxcbiAgICAgICAgZGlyZWN0ZWQgPSBfZGlqa3N0cmFEZWZhdWx0cy5kaXJlY3RlZDtcblxuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICB2YXIgd2VpZ2h0Rm4gPSB3ZWlnaHQ7XG4gICAgdmFyIHNvdXJjZSA9IHN0cmluZyhyb290KSA/IHRoaXMuZmlsdGVyKHJvb3QpWzBdIDogcm9vdFswXTtcbiAgICB2YXIgZGlzdCA9IHt9O1xuICAgIHZhciBwcmV2ID0ge307XG4gICAgdmFyIGtub3duRGlzdCA9IHt9O1xuXG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgICAgbm9kZXMgPSBfdGhpcyRieUdyb3VwLm5vZGVzLFxuICAgICAgICBlZGdlcyA9IF90aGlzJGJ5R3JvdXAuZWRnZXM7XG5cbiAgICBlZGdlcy51bm1lcmdlQnkoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc0xvb3AoKTtcbiAgICB9KTtcblxuICAgIHZhciBnZXREaXN0ID0gZnVuY3Rpb24gZ2V0RGlzdChub2RlKSB7XG4gICAgICByZXR1cm4gZGlzdFtub2RlLmlkKCldO1xuICAgIH07XG5cbiAgICB2YXIgc2V0RGlzdCA9IGZ1bmN0aW9uIHNldERpc3Qobm9kZSwgZCkge1xuICAgICAgZGlzdFtub2RlLmlkKCldID0gZDtcbiAgICAgIFEudXBkYXRlSXRlbShub2RlKTtcbiAgICB9O1xuXG4gICAgdmFyIFEgPSBuZXcgSGVhcF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBnZXREaXN0KGEpIC0gZ2V0RGlzdChiKTtcbiAgICB9KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICBkaXN0W25vZGUuaWQoKV0gPSBub2RlLnNhbWUoc291cmNlKSA/IDAgOiBJbmZpbml0eTtcbiAgICAgIFEucHVzaChub2RlKTtcbiAgICB9XG5cbiAgICB2YXIgZGlzdEJldHdlZW4gPSBmdW5jdGlvbiBkaXN0QmV0d2Vlbih1LCB2KSB7XG4gICAgICB2YXIgdXZzID0gKGRpcmVjdGVkID8gdS5lZGdlc1RvKHYpIDogdS5lZGdlc1dpdGgodikpLmludGVyc2VjdChlZGdlcyk7XG4gICAgICB2YXIgc21hbGxlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuICAgICAgdmFyIHNtYWxsZXN0RWRnZTtcblxuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHV2cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGVkZ2UgPSB1dnNbX2ldO1xuXG4gICAgICAgIHZhciBfd2VpZ2h0ID0gd2VpZ2h0Rm4oZWRnZSk7XG5cbiAgICAgICAgaWYgKF93ZWlnaHQgPCBzbWFsbGVzdERpc3RhbmNlIHx8ICFzbWFsbGVzdEVkZ2UpIHtcbiAgICAgICAgICBzbWFsbGVzdERpc3RhbmNlID0gX3dlaWdodDtcbiAgICAgICAgICBzbWFsbGVzdEVkZ2UgPSBlZGdlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVkZ2U6IHNtYWxsZXN0RWRnZSxcbiAgICAgICAgZGlzdDogc21hbGxlc3REaXN0YW5jZVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgd2hpbGUgKFEuc2l6ZSgpID4gMCkge1xuICAgICAgdmFyIHUgPSBRLnBvcCgpO1xuICAgICAgdmFyIHNtYWxsZXRzRGlzdCA9IGdldERpc3QodSk7XG4gICAgICB2YXIgdWlkID0gdS5pZCgpO1xuICAgICAga25vd25EaXN0W3VpZF0gPSBzbWFsbGV0c0Rpc3Q7XG5cbiAgICAgIGlmIChzbWFsbGV0c0Rpc3QgPT09IEluZmluaXR5KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmVpZ2hib3JzID0gdS5uZWlnaGJvcmhvb2QoKS5pbnRlcnNlY3Qobm9kZXMpO1xuXG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBuZWlnaGJvcnMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICB2YXIgdiA9IG5laWdoYm9yc1tfaTJdO1xuICAgICAgICB2YXIgdmlkID0gdi5pZCgpO1xuICAgICAgICB2YXIgdkRpc3QgPSBkaXN0QmV0d2Vlbih1LCB2KTtcbiAgICAgICAgdmFyIGFsdCA9IHNtYWxsZXRzRGlzdCArIHZEaXN0LmRpc3Q7XG5cbiAgICAgICAgaWYgKGFsdCA8IGdldERpc3QodikpIHtcbiAgICAgICAgICBzZXREaXN0KHYsIGFsdCk7XG4gICAgICAgICAgcHJldlt2aWRdID0ge1xuICAgICAgICAgICAgbm9kZTogdSxcbiAgICAgICAgICAgIGVkZ2U6IHZEaXN0LmVkZ2VcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9IC8vIGZvclxuXG4gICAgfSAvLyB3aGlsZVxuXG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlzdGFuY2VUbzogZnVuY3Rpb24gZGlzdGFuY2VUbyhub2RlKSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBzdHJpbmcobm9kZSkgPyBub2Rlcy5maWx0ZXIobm9kZSlbMF0gOiBub2RlWzBdO1xuICAgICAgICByZXR1cm4ga25vd25EaXN0W3RhcmdldC5pZCgpXTtcbiAgICAgIH0sXG4gICAgICBwYXRoVG86IGZ1bmN0aW9uIHBhdGhUbyhub2RlKSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBzdHJpbmcobm9kZSkgPyBub2Rlcy5maWx0ZXIobm9kZSlbMF0gOiBub2RlWzBdO1xuICAgICAgICB2YXIgUyA9IFtdO1xuICAgICAgICB2YXIgdSA9IHRhcmdldDtcbiAgICAgICAgdmFyIHVpZCA9IHUuaWQoKTtcblxuICAgICAgICBpZiAodGFyZ2V0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBTLnVuc2hpZnQodGFyZ2V0KTtcblxuICAgICAgICAgIHdoaWxlIChwcmV2W3VpZF0pIHtcbiAgICAgICAgICAgIHZhciBwID0gcHJldlt1aWRdO1xuICAgICAgICAgICAgUy51bnNoaWZ0KHAuZWRnZSk7XG4gICAgICAgICAgICBTLnVuc2hpZnQocC5ub2RlKTtcbiAgICAgICAgICAgIHUgPSBwLm5vZGU7XG4gICAgICAgICAgICB1aWQgPSB1LmlkKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVsZXMuc3Bhd24oUyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcblxudmFyIGVsZXNmbiR0ID0ge1xuICAvLyBrcnVza2FsJ3MgYWxnb3JpdGhtIChmaW5kcyBtaW4gc3Bhbm5pbmcgdHJlZSwgYXNzdW1pbmcgdW5kaXJlY3RlZCBncmFwaClcbiAgLy8gaW1wbGVtZW50ZWQgZnJvbSBwc2V1ZG9jb2RlIGZyb20gd2lraXBlZGlhXG4gIGtydXNrYWw6IGZ1bmN0aW9uIGtydXNrYWwod2VpZ2h0Rm4pIHtcbiAgICB3ZWlnaHRGbiA9IHdlaWdodEZuIHx8IGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9O1xuXG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgICAgbm9kZXMgPSBfdGhpcyRieUdyb3VwLm5vZGVzLFxuICAgICAgICBlZGdlcyA9IF90aGlzJGJ5R3JvdXAuZWRnZXM7XG5cbiAgICB2YXIgbnVtTm9kZXMgPSBub2Rlcy5sZW5ndGg7XG4gICAgdmFyIGZvcmVzdCA9IG5ldyBBcnJheShudW1Ob2Rlcyk7XG4gICAgdmFyIEEgPSBub2RlczsgLy8gYXNzdW1lcyBieUdyb3VwKCkgY3JlYXRlcyBuZXcgY29sbGVjdGlvbnMgdGhhdCBjYW4gYmUgc2FmZWx5IG11dGF0ZWRcblxuICAgIHZhciBmaW5kU2V0SW5kZXggPSBmdW5jdGlvbiBmaW5kU2V0SW5kZXgoZWxlKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcmVzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlcyA9IGZvcmVzdFtpXTtcblxuICAgICAgICBpZiAoZWxlcy5oYXMoZWxlKSkge1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTsgLy8gc3RhcnQgd2l0aCBvbmUgZm9yZXN0IHBlciBub2RlXG5cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTm9kZXM7IGkrKykge1xuICAgICAgZm9yZXN0W2ldID0gdGhpcy5zcGF3bihub2Rlc1tpXSk7XG4gICAgfVxuXG4gICAgdmFyIFMgPSBlZGdlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gd2VpZ2h0Rm4oYSkgLSB3ZWlnaHRGbihiKTtcbiAgICB9KTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBTLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIGVkZ2UgPSBTW19pXTtcbiAgICAgIHZhciB1ID0gZWRnZS5zb3VyY2UoKVswXTtcbiAgICAgIHZhciB2ID0gZWRnZS50YXJnZXQoKVswXTtcbiAgICAgIHZhciBzZXRVSW5kZXggPSBmaW5kU2V0SW5kZXgodSk7XG4gICAgICB2YXIgc2V0VkluZGV4ID0gZmluZFNldEluZGV4KHYpO1xuICAgICAgdmFyIHNldFUgPSBmb3Jlc3Rbc2V0VUluZGV4XTtcbiAgICAgIHZhciBzZXRWID0gZm9yZXN0W3NldFZJbmRleF07XG5cbiAgICAgIGlmIChzZXRVSW5kZXggIT09IHNldFZJbmRleCkge1xuICAgICAgICBBLm1lcmdlKGVkZ2UpOyAvLyBjb21iaW5lIGZvcmVzdHMgZm9yIHUgYW5kIHZcblxuICAgICAgICBzZXRVLm1lcmdlKHNldFYpO1xuICAgICAgICBmb3Jlc3Quc3BsaWNlKHNldFZJbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEE7XG4gIH1cbn07XG5cbnZhciBhU3RhckRlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIHJvb3Q6IG51bGwsXG4gIGdvYWw6IG51bGwsXG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgaGV1cmlzdGljOiBmdW5jdGlvbiBoZXVyaXN0aWMoZWRnZSkge1xuICAgIHJldHVybiAwO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2Vcbn0pO1xudmFyIGVsZXNmbiRzID0ge1xuICAvLyBJbXBsZW1lbnRlZCBmcm9tIHBzZXVkb2NvZGUgZnJvbSB3aWtpcGVkaWFcbiAgYVN0YXI6IGZ1bmN0aW9uIGFTdGFyKG9wdGlvbnMpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG5cbiAgICB2YXIgX2FTdGFyRGVmYXVsdHMgPSBhU3RhckRlZmF1bHRzKG9wdGlvbnMpLFxuICAgICAgICByb290ID0gX2FTdGFyRGVmYXVsdHMucm9vdCxcbiAgICAgICAgZ29hbCA9IF9hU3RhckRlZmF1bHRzLmdvYWwsXG4gICAgICAgIGhldXJpc3RpYyA9IF9hU3RhckRlZmF1bHRzLmhldXJpc3RpYyxcbiAgICAgICAgZGlyZWN0ZWQgPSBfYVN0YXJEZWZhdWx0cy5kaXJlY3RlZCxcbiAgICAgICAgd2VpZ2h0ID0gX2FTdGFyRGVmYXVsdHMud2VpZ2h0O1xuXG4gICAgcm9vdCA9IGN5LmNvbGxlY3Rpb24ocm9vdClbMF07XG4gICAgZ29hbCA9IGN5LmNvbGxlY3Rpb24oZ29hbClbMF07XG4gICAgdmFyIHNpZCA9IHJvb3QuaWQoKTtcbiAgICB2YXIgdGlkID0gZ29hbC5pZCgpO1xuICAgIHZhciBnU2NvcmUgPSB7fTtcbiAgICB2YXIgZlNjb3JlID0ge307XG4gICAgdmFyIGNsb3NlZFNldElkcyA9IHt9O1xuICAgIHZhciBvcGVuU2V0ID0gbmV3IEhlYXBfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZlNjb3JlW2EuaWQoKV0gLSBmU2NvcmVbYi5pZCgpXTtcbiAgICB9KTtcbiAgICB2YXIgb3BlblNldElkcyA9IG5ldyBTZXQkMSgpO1xuICAgIHZhciBjYW1lRnJvbSA9IHt9O1xuICAgIHZhciBjYW1lRnJvbUVkZ2UgPSB7fTtcblxuICAgIHZhciBhZGRUb09wZW5TZXQgPSBmdW5jdGlvbiBhZGRUb09wZW5TZXQoZWxlLCBpZCkge1xuICAgICAgb3BlblNldC5wdXNoKGVsZSk7XG4gICAgICBvcGVuU2V0SWRzLmFkZChpZCk7XG4gICAgfTtcblxuICAgIHZhciBjTWluLCBjTWluSWQ7XG5cbiAgICB2YXIgcG9wRnJvbU9wZW5TZXQgPSBmdW5jdGlvbiBwb3BGcm9tT3BlblNldCgpIHtcbiAgICAgIGNNaW4gPSBvcGVuU2V0LnBvcCgpO1xuICAgICAgY01pbklkID0gY01pbi5pZCgpO1xuICAgICAgb3BlblNldElkc1tcImRlbGV0ZVwiXShjTWluSWQpO1xuICAgIH07XG5cbiAgICB2YXIgaXNJbk9wZW5TZXQgPSBmdW5jdGlvbiBpc0luT3BlblNldChpZCkge1xuICAgICAgcmV0dXJuIG9wZW5TZXRJZHMuaGFzKGlkKTtcbiAgICB9O1xuXG4gICAgYWRkVG9PcGVuU2V0KHJvb3QsIHNpZCk7XG4gICAgZ1Njb3JlW3NpZF0gPSAwO1xuICAgIGZTY29yZVtzaWRdID0gaGV1cmlzdGljKHJvb3QpOyAvLyBDb3VudGVyXG5cbiAgICB2YXIgc3RlcHMgPSAwOyAvLyBNYWluIGxvb3BcblxuICAgIHdoaWxlIChvcGVuU2V0LnNpemUoKSA+IDApIHtcbiAgICAgIHBvcEZyb21PcGVuU2V0KCk7XG4gICAgICBzdGVwcysrOyAvLyBJZiB3ZSd2ZSBmb3VuZCBvdXIgZ29hbCwgdGhlbiB3ZSBhcmUgZG9uZVxuXG4gICAgICBpZiAoY01pbklkID09PSB0aWQpIHtcbiAgICAgICAgdmFyIHBhdGggPSBbXTtcbiAgICAgICAgdmFyIHBhdGhOb2RlID0gZ29hbDtcbiAgICAgICAgdmFyIHBhdGhOb2RlSWQgPSB0aWQ7XG4gICAgICAgIHZhciBwYXRoRWRnZSA9IGNhbWVGcm9tRWRnZVtwYXRoTm9kZUlkXTtcblxuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgcGF0aC51bnNoaWZ0KHBhdGhOb2RlKTtcblxuICAgICAgICAgIGlmIChwYXRoRWRnZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBwYXRoLnVuc2hpZnQocGF0aEVkZ2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhdGhOb2RlID0gY2FtZUZyb21bcGF0aE5vZGVJZF07XG5cbiAgICAgICAgICBpZiAocGF0aE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGF0aE5vZGVJZCA9IHBhdGhOb2RlLmlkKCk7XG4gICAgICAgICAgcGF0aEVkZ2UgPSBjYW1lRnJvbUVkZ2VbcGF0aE5vZGVJZF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZvdW5kOiB0cnVlLFxuICAgICAgICAgIGRpc3RhbmNlOiBnU2NvcmVbY01pbklkXSxcbiAgICAgICAgICBwYXRoOiB0aGlzLnNwYXduKHBhdGgpLFxuICAgICAgICAgIHN0ZXBzOiBzdGVwc1xuICAgICAgICB9O1xuICAgICAgfSAvLyBBZGQgY01pbiB0byBwcm9jZXNzZWQgbm9kZXNcblxuXG4gICAgICBjbG9zZWRTZXRJZHNbY01pbklkXSA9IHRydWU7IC8vIFVwZGF0ZSBzY29yZXMgZm9yIG5laWdoYm9ycyBvZiBjTWluXG4gICAgICAvLyBUYWtlIGludG8gYWNjb3VudCBpZiBncmFwaCBpcyBkaXJlY3RlZCBvciBub3RcblxuICAgICAgdmFyIHZ3RWRnZXMgPSBjTWluLl9wcml2YXRlLmVkZ2VzO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZ3RWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGUgPSB2d0VkZ2VzW2ldOyAvLyBlZGdlIG11c3QgYmUgaW4gc2V0IG9mIGNhbGxpbmcgZWxlc1xuXG4gICAgICAgIGlmICghdGhpcy5oYXNFbGVtZW50V2l0aElkKGUuaWQoKSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSAvLyBjTWluIG11c3QgYmUgdGhlIHNvdXJjZSBvZiBlZGdlIGlmIGRpcmVjdGVkXG5cblxuICAgICAgICBpZiAoZGlyZWN0ZWQgJiYgZS5kYXRhKCdzb3VyY2UnKSAhPT0gY01pbklkKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgd1NyYyA9IGUuc291cmNlKCk7XG4gICAgICAgIHZhciB3VGd0ID0gZS50YXJnZXQoKTtcbiAgICAgICAgdmFyIHcgPSB3U3JjLmlkKCkgIT09IGNNaW5JZCA/IHdTcmMgOiB3VGd0O1xuICAgICAgICB2YXIgd2lkID0gdy5pZCgpOyAvLyBub2RlIG11c3QgYmUgaW4gc2V0IG9mIGNhbGxpbmcgZWxlc1xuXG4gICAgICAgIGlmICghdGhpcy5oYXNFbGVtZW50V2l0aElkKHdpZCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSAvLyBpZiBub2RlIGlzIGluIGNsb3NlZFNldCwgaWdub3JlIGl0XG5cblxuICAgICAgICBpZiAoY2xvc2VkU2V0SWRzW3dpZF0pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSAvLyBOZXcgdGVudGF0aXZlIHNjb3JlIGZvciBub2RlIHdcblxuXG4gICAgICAgIHZhciB0ZW1wU2NvcmUgPSBnU2NvcmVbY01pbklkXSArIHdlaWdodChlKTsgLy8gVXBkYXRlIGdTY29yZSBmb3Igbm9kZSB3IGlmOlxuICAgICAgICAvLyAgIHcgbm90IHByZXNlbnQgaW4gb3BlblNldFxuICAgICAgICAvLyBPUlxuICAgICAgICAvLyAgIHRlbnRhdGl2ZSBnU2NvcmUgaXMgbGVzcyB0aGFuIHByZXZpb3VzIHZhbHVlXG4gICAgICAgIC8vIHcgbm90IGluIG9wZW5TZXRcblxuICAgICAgICBpZiAoIWlzSW5PcGVuU2V0KHdpZCkpIHtcbiAgICAgICAgICBnU2NvcmVbd2lkXSA9IHRlbXBTY29yZTtcbiAgICAgICAgICBmU2NvcmVbd2lkXSA9IHRlbXBTY29yZSArIGhldXJpc3RpYyh3KTtcbiAgICAgICAgICBhZGRUb09wZW5TZXQodywgd2lkKTtcbiAgICAgICAgICBjYW1lRnJvbVt3aWRdID0gY01pbjtcbiAgICAgICAgICBjYW1lRnJvbUVkZ2Vbd2lkXSA9IGU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gLy8gdyBhbHJlYWR5IGluIG9wZW5TZXQsIGJ1dCB3aXRoIGdyZWF0ZXIgZ1Njb3JlXG5cblxuICAgICAgICBpZiAodGVtcFNjb3JlIDwgZ1Njb3JlW3dpZF0pIHtcbiAgICAgICAgICBnU2NvcmVbd2lkXSA9IHRlbXBTY29yZTtcbiAgICAgICAgICBmU2NvcmVbd2lkXSA9IHRlbXBTY29yZSArIGhldXJpc3RpYyh3KTtcbiAgICAgICAgICBjYW1lRnJvbVt3aWRdID0gY01pbjtcbiAgICAgICAgICBjYW1lRnJvbUVkZ2Vbd2lkXSA9IGU7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gRW5kIG9mIG5laWdoYm9ycyB1cGRhdGVcblxuICAgIH0gLy8gRW5kIG9mIG1haW4gbG9vcFxuICAgIC8vIElmIHdlJ3ZlIHJlYWNoZWQgaGVyZSwgdGhlbiB3ZSd2ZSBub3QgcmVhY2hlZCBvdXIgZ29hbFxuXG5cbiAgICByZXR1cm4ge1xuICAgICAgZm91bmQ6IGZhbHNlLFxuICAgICAgZGlzdGFuY2U6IHVuZGVmaW5lZCxcbiAgICAgIHBhdGg6IHVuZGVmaW5lZCxcbiAgICAgIHN0ZXBzOiBzdGVwc1xuICAgIH07XG4gIH1cbn07IC8vIGVsZXNmblxuXG52YXIgZmxveWRXYXJzaGFsbERlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgZGlyZWN0ZWQ6IGZhbHNlXG59KTtcbnZhciBlbGVzZm4kciA9IHtcbiAgLy8gSW1wbGVtZW50ZWQgZnJvbSBwc2V1ZG9jb2RlIGZyb20gd2lraXBlZGlhXG4gIGZsb3lkV2Fyc2hhbGw6IGZ1bmN0aW9uIGZsb3lkV2Fyc2hhbGwob3B0aW9ucykge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcblxuICAgIHZhciBfZmxveWRXYXJzaGFsbERlZmF1bHQgPSBmbG95ZFdhcnNoYWxsRGVmYXVsdHMob3B0aW9ucyksXG4gICAgICAgIHdlaWdodCA9IF9mbG95ZFdhcnNoYWxsRGVmYXVsdC53ZWlnaHQsXG4gICAgICAgIGRpcmVjdGVkID0gX2Zsb3lkV2Fyc2hhbGxEZWZhdWx0LmRpcmVjdGVkO1xuXG4gICAgdmFyIHdlaWdodEZuID0gd2VpZ2h0O1xuXG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgICAgbm9kZXMgPSBfdGhpcyRieUdyb3VwLm5vZGVzLFxuICAgICAgICBlZGdlcyA9IF90aGlzJGJ5R3JvdXAuZWRnZXM7XG5cbiAgICB2YXIgTiA9IG5vZGVzLmxlbmd0aDtcbiAgICB2YXIgTnNxID0gTiAqIE47XG5cbiAgICB2YXIgaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2Yobm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGVzLmluZGV4T2Yobm9kZSk7XG4gICAgfTtcblxuICAgIHZhciBhdEluZGV4ID0gZnVuY3Rpb24gYXRJbmRleChpKSB7XG4gICAgICByZXR1cm4gbm9kZXNbaV07XG4gICAgfTsgLy8gSW5pdGlhbGl6ZSBkaXN0YW5jZSBtYXRyaXhcblxuXG4gICAgdmFyIGRpc3QgPSBuZXcgQXJyYXkoTnNxKTtcblxuICAgIGZvciAodmFyIG4gPSAwOyBuIDwgTnNxOyBuKyspIHtcbiAgICAgIHZhciBqID0gbiAlIE47XG4gICAgICB2YXIgaSA9IChuIC0gaikgLyBOO1xuXG4gICAgICBpZiAoaSA9PT0gaikge1xuICAgICAgICBkaXN0W25dID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3Rbbl0gPSBJbmZpbml0eTtcbiAgICAgIH1cbiAgICB9IC8vIEluaXRpYWxpemUgbWF0cml4IHVzZWQgZm9yIHBhdGggcmVjb25zdHJ1Y3Rpb25cbiAgICAvLyBJbml0aWFsaXplIGRpc3RhbmNlIG1hdHJpeFxuXG5cbiAgICB2YXIgbmV4dCA9IG5ldyBBcnJheShOc3EpO1xuICAgIHZhciBlZGdlTmV4dCA9IG5ldyBBcnJheShOc3EpOyAvLyBQcm9jZXNzIGVkZ2VzXG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZWRnZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgZWRnZSA9IGVkZ2VzW19pXTtcbiAgICAgIHZhciBzcmMgPSBlZGdlLnNvdXJjZSgpWzBdO1xuICAgICAgdmFyIHRndCA9IGVkZ2UudGFyZ2V0KClbMF07XG5cbiAgICAgIGlmIChzcmMgPT09IHRndCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gZXhjbHVkZSBsb29wc1xuXG5cbiAgICAgIHZhciBzID0gaW5kZXhPZihzcmMpO1xuICAgICAgdmFyIHQgPSBpbmRleE9mKHRndCk7XG4gICAgICB2YXIgc3QgPSBzICogTiArIHQ7IC8vIHNvdXJjZSB0byB0YXJnZXQgaW5kZXhcblxuICAgICAgdmFyIF93ZWlnaHQgPSB3ZWlnaHRGbihlZGdlKTsgLy8gQ2hlY2sgaWYgYWxyZWFkeSBwcm9jZXNzIGFub3RoZXIgZWRnZSBiZXR3ZWVuIHNhbWUgMiBub2Rlc1xuXG5cbiAgICAgIGlmIChkaXN0W3N0XSA+IF93ZWlnaHQpIHtcbiAgICAgICAgZGlzdFtzdF0gPSBfd2VpZ2h0O1xuICAgICAgICBuZXh0W3N0XSA9IHQ7XG4gICAgICAgIGVkZ2VOZXh0W3N0XSA9IGVkZ2U7XG4gICAgICB9IC8vIElmIHVuZGlyZWN0ZWQgZ3JhcGgsIHByb2Nlc3MgJ3JldmVyc2VkJyBlZGdlXG5cblxuICAgICAgaWYgKCFkaXJlY3RlZCkge1xuICAgICAgICB2YXIgdHMgPSB0ICogTiArIHM7IC8vIHRhcmdldCB0byBzb3VyY2UgaW5kZXhcblxuICAgICAgICBpZiAoIWRpcmVjdGVkICYmIGRpc3RbdHNdID4gX3dlaWdodCkge1xuICAgICAgICAgIGRpc3RbdHNdID0gX3dlaWdodDtcbiAgICAgICAgICBuZXh0W3RzXSA9IHM7XG4gICAgICAgICAgZWRnZU5leHRbdHNdID0gZWRnZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gTWFpbiBsb29wXG5cblxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgTjsgaysrKSB7XG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBOOyBfaTIrKykge1xuICAgICAgICB2YXIgaWsgPSBfaTIgKiBOICsgaztcblxuICAgICAgICBmb3IgKHZhciBfaiA9IDA7IF9qIDwgTjsgX2orKykge1xuICAgICAgICAgIHZhciBpaiA9IF9pMiAqIE4gKyBfajtcbiAgICAgICAgICB2YXIga2ogPSBrICogTiArIF9qO1xuXG4gICAgICAgICAgaWYgKGRpc3RbaWtdICsgZGlzdFtral0gPCBkaXN0W2lqXSkge1xuICAgICAgICAgICAgZGlzdFtpal0gPSBkaXN0W2lrXSArIGRpc3Rba2pdO1xuICAgICAgICAgICAgbmV4dFtpal0gPSBuZXh0W2lrXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZ2V0QXJnRWxlID0gZnVuY3Rpb24gZ2V0QXJnRWxlKGVsZSkge1xuICAgICAgcmV0dXJuIChzdHJpbmcoZWxlKSA/IGN5LmZpbHRlcihlbGUpIDogZWxlKVswXTtcbiAgICB9O1xuXG4gICAgdmFyIGluZGV4T2ZBcmdFbGUgPSBmdW5jdGlvbiBpbmRleE9mQXJnRWxlKGVsZSkge1xuICAgICAgcmV0dXJuIGluZGV4T2YoZ2V0QXJnRWxlKGVsZSkpO1xuICAgIH07XG5cbiAgICB2YXIgcmVzID0ge1xuICAgICAgZGlzdGFuY2U6IGZ1bmN0aW9uIGRpc3RhbmNlKGZyb20sIHRvKSB7XG4gICAgICAgIHZhciBpID0gaW5kZXhPZkFyZ0VsZShmcm9tKTtcbiAgICAgICAgdmFyIGogPSBpbmRleE9mQXJnRWxlKHRvKTtcbiAgICAgICAgcmV0dXJuIGRpc3RbaSAqIE4gKyBqXTtcbiAgICAgIH0sXG4gICAgICBwYXRoOiBmdW5jdGlvbiBwYXRoKGZyb20sIHRvKSB7XG4gICAgICAgIHZhciBpID0gaW5kZXhPZkFyZ0VsZShmcm9tKTtcbiAgICAgICAgdmFyIGogPSBpbmRleE9mQXJnRWxlKHRvKTtcbiAgICAgICAgdmFyIGZyb21Ob2RlID0gYXRJbmRleChpKTtcblxuICAgICAgICBpZiAoaSA9PT0gaikge1xuICAgICAgICAgIHJldHVybiBmcm9tTm9kZS5jb2xsZWN0aW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dFtpICogTiArIGpdID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHBhdGggPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICAgIHZhciBwcmV2ID0gaTtcbiAgICAgICAgdmFyIGVkZ2U7XG4gICAgICAgIHBhdGgubWVyZ2UoZnJvbU5vZGUpO1xuXG4gICAgICAgIHdoaWxlIChpICE9PSBqKSB7XG4gICAgICAgICAgcHJldiA9IGk7XG4gICAgICAgICAgaSA9IG5leHRbaSAqIE4gKyBqXTtcbiAgICAgICAgICBlZGdlID0gZWRnZU5leHRbcHJldiAqIE4gKyBpXTtcbiAgICAgICAgICBwYXRoLm1lcmdlKGVkZ2UpO1xuICAgICAgICAgIHBhdGgubWVyZ2UoYXRJbmRleChpKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiByZXM7XG4gIH0gLy8gZmxveWRXYXJzaGFsbFxuXG59OyAvLyBlbGVzZm5cblxudmFyIGJlbGxtYW5Gb3JkRGVmYXVsdHMgPSBkZWZhdWx0cyRnKHtcbiAgd2VpZ2h0OiBmdW5jdGlvbiB3ZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2UsXG4gIHJvb3Q6IG51bGxcbn0pO1xudmFyIGVsZXNmbiRxID0ge1xuICAvLyBJbXBsZW1lbnRlZCBmcm9tIHBzZXVkb2NvZGUgZnJvbSB3aWtpcGVkaWFcbiAgYmVsbG1hbkZvcmQ6IGZ1bmN0aW9uIGJlbGxtYW5Gb3JkKG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIF9iZWxsbWFuRm9yZERlZmF1bHRzID0gYmVsbG1hbkZvcmREZWZhdWx0cyhvcHRpb25zKSxcbiAgICAgICAgd2VpZ2h0ID0gX2JlbGxtYW5Gb3JkRGVmYXVsdHMud2VpZ2h0LFxuICAgICAgICBkaXJlY3RlZCA9IF9iZWxsbWFuRm9yZERlZmF1bHRzLmRpcmVjdGVkLFxuICAgICAgICByb290ID0gX2JlbGxtYW5Gb3JkRGVmYXVsdHMucm9vdDtcblxuICAgIHZhciB3ZWlnaHRGbiA9IHdlaWdodDtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuXG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgICAgZWRnZXMgPSBfdGhpcyRieUdyb3VwLmVkZ2VzLFxuICAgICAgICBub2RlcyA9IF90aGlzJGJ5R3JvdXAubm9kZXM7XG5cbiAgICB2YXIgbnVtTm9kZXMgPSBub2Rlcy5sZW5ndGg7XG4gICAgdmFyIGluZm9NYXAgPSBuZXcgTWFwJDEoKTtcbiAgICB2YXIgaGFzTmVnYXRpdmVXZWlnaHRDeWNsZSA9IGZhbHNlO1xuICAgIHZhciBuZWdhdGl2ZVdlaWdodEN5Y2xlcyA9IFtdO1xuICAgIHJvb3QgPSBjeS5jb2xsZWN0aW9uKHJvb3QpWzBdOyAvLyBpbiBjYXNlIHNlbGVjdG9yIHBhc3NlZFxuXG4gICAgZWRnZXMudW5tZXJnZUJ5KGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICByZXR1cm4gZWRnZS5pc0xvb3AoKTtcbiAgICB9KTtcbiAgICB2YXIgbnVtRWRnZXMgPSBlZGdlcy5sZW5ndGg7XG5cbiAgICB2YXIgZ2V0SW5mbyA9IGZ1bmN0aW9uIGdldEluZm8obm9kZSkge1xuICAgICAgdmFyIG9iaiA9IGluZm9NYXAuZ2V0KG5vZGUuaWQoKSk7XG5cbiAgICAgIGlmICghb2JqKSB7XG4gICAgICAgIG9iaiA9IHt9O1xuICAgICAgICBpbmZvTWFwLnNldChub2RlLmlkKCksIG9iaik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcblxuICAgIHZhciBnZXROb2RlRnJvbVRvID0gZnVuY3Rpb24gZ2V0Tm9kZUZyb21Ubyh0bykge1xuICAgICAgcmV0dXJuIChzdHJpbmcodG8pID8gY3kuJCh0bykgOiB0bylbMF07XG4gICAgfTtcblxuICAgIHZhciBkaXN0YW5jZVRvID0gZnVuY3Rpb24gZGlzdGFuY2VUbyh0bykge1xuICAgICAgcmV0dXJuIGdldEluZm8oZ2V0Tm9kZUZyb21Ubyh0bykpLmRpc3Q7XG4gICAgfTtcblxuICAgIHZhciBwYXRoVG8gPSBmdW5jdGlvbiBwYXRoVG8odG8pIHtcbiAgICAgIHZhciB0aGlzU3RhcnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHJvb3Q7XG4gICAgICB2YXIgZW5kID0gZ2V0Tm9kZUZyb21Ubyh0byk7XG4gICAgICB2YXIgcGF0aCA9IFtdO1xuICAgICAgdmFyIG5vZGUgPSBlbmQ7XG5cbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5zcGF3bigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9nZXRJbmZvID0gZ2V0SW5mbyhub2RlKSxcbiAgICAgICAgICAgIGVkZ2UgPSBfZ2V0SW5mby5lZGdlLFxuICAgICAgICAgICAgcHJlZCA9IF9nZXRJbmZvLnByZWQ7XG5cbiAgICAgICAgcGF0aC51bnNoaWZ0KG5vZGVbMF0pO1xuXG4gICAgICAgIGlmIChub2RlLnNhbWUodGhpc1N0YXJ0KSAmJiBwYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlZGdlICE9IG51bGwpIHtcbiAgICAgICAgICBwYXRoLnVuc2hpZnQoZWRnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gcHJlZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVsZXMuc3Bhd24ocGF0aCk7XG4gICAgfTsgLy8gSW5pdGlhbGl6YXRpb25zIHsgZGlzdCwgcHJlZCwgZWRnZSB9XG5cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTm9kZXM7IGkrKykge1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIHZhciBpbmZvID0gZ2V0SW5mbyhub2RlKTtcblxuICAgICAgaWYgKG5vZGUuc2FtZShyb290KSkge1xuICAgICAgICBpbmZvLmRpc3QgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5mby5kaXN0ID0gSW5maW5pdHk7XG4gICAgICB9XG5cbiAgICAgIGluZm8ucHJlZCA9IG51bGw7XG4gICAgICBpbmZvLmVkZ2UgPSBudWxsO1xuICAgIH0gLy8gRWRnZXMgcmVsYXhhdGlvblxuXG5cbiAgICB2YXIgcmVwbGFjZWRFZGdlID0gZmFsc2U7XG5cbiAgICB2YXIgY2hlY2tGb3JFZGdlUmVwbGFjZW1lbnQgPSBmdW5jdGlvbiBjaGVja0ZvckVkZ2VSZXBsYWNlbWVudChub2RlMSwgbm9kZTIsIGVkZ2UsIGluZm8xLCBpbmZvMiwgd2VpZ2h0KSB7XG4gICAgICB2YXIgZGlzdCA9IGluZm8xLmRpc3QgKyB3ZWlnaHQ7XG5cbiAgICAgIGlmIChkaXN0IDwgaW5mbzIuZGlzdCAmJiAhZWRnZS5zYW1lKGluZm8xLmVkZ2UpKSB7XG4gICAgICAgIGluZm8yLmRpc3QgPSBkaXN0O1xuICAgICAgICBpbmZvMi5wcmVkID0gbm9kZTE7XG4gICAgICAgIGluZm8yLmVkZ2UgPSBlZGdlO1xuICAgICAgICByZXBsYWNlZEVkZ2UgPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgbnVtTm9kZXM7IF9pKyspIHtcbiAgICAgIHJlcGxhY2VkRWRnZSA9IGZhbHNlO1xuXG4gICAgICBmb3IgKHZhciBlID0gMDsgZSA8IG51bUVkZ2VzOyBlKyspIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tlXTtcbiAgICAgICAgdmFyIHNyYyA9IGVkZ2Uuc291cmNlKCk7XG4gICAgICAgIHZhciB0Z3QgPSBlZGdlLnRhcmdldCgpO1xuXG4gICAgICAgIHZhciBfd2VpZ2h0ID0gd2VpZ2h0Rm4oZWRnZSk7XG5cbiAgICAgICAgdmFyIHNyY0luZm8gPSBnZXRJbmZvKHNyYyk7XG4gICAgICAgIHZhciB0Z3RJbmZvID0gZ2V0SW5mbyh0Z3QpO1xuICAgICAgICBjaGVja0ZvckVkZ2VSZXBsYWNlbWVudChzcmMsIHRndCwgZWRnZSwgc3JjSW5mbywgdGd0SW5mbywgX3dlaWdodCk7IC8vIElmIHVuZGlyZWN0ZWQgZ3JhcGgsIHdlIG5lZWQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlICdyZXZlcnNlJyBlZGdlXG5cbiAgICAgICAgaWYgKCFkaXJlY3RlZCkge1xuICAgICAgICAgIGNoZWNrRm9yRWRnZVJlcGxhY2VtZW50KHRndCwgc3JjLCBlZGdlLCB0Z3RJbmZvLCBzcmNJbmZvLCBfd2VpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXJlcGxhY2VkRWRnZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVwbGFjZWRFZGdlKSB7XG4gICAgICAvLyBDaGVjayBmb3IgbmVnYXRpdmUgd2VpZ2h0IGN5Y2xlc1xuICAgICAgdmFyIG5lZ2F0aXZlV2VpZ2h0Q3ljbGVJZHMgPSBbXTtcblxuICAgICAgZm9yICh2YXIgX2UgPSAwOyBfZSA8IG51bUVkZ2VzOyBfZSsrKSB7XG4gICAgICAgIHZhciBfZWRnZSA9IGVkZ2VzW19lXTtcblxuICAgICAgICB2YXIgX3NyYyA9IF9lZGdlLnNvdXJjZSgpO1xuXG4gICAgICAgIHZhciBfdGd0ID0gX2VkZ2UudGFyZ2V0KCk7XG5cbiAgICAgICAgdmFyIF93ZWlnaHQyID0gd2VpZ2h0Rm4oX2VkZ2UpO1xuXG4gICAgICAgIHZhciBzcmNEaXN0ID0gZ2V0SW5mbyhfc3JjKS5kaXN0O1xuICAgICAgICB2YXIgdGd0RGlzdCA9IGdldEluZm8oX3RndCkuZGlzdDtcblxuICAgICAgICBpZiAoc3JjRGlzdCArIF93ZWlnaHQyIDwgdGd0RGlzdCB8fCAhZGlyZWN0ZWQgJiYgdGd0RGlzdCArIF93ZWlnaHQyIDwgc3JjRGlzdCkge1xuICAgICAgICAgIGlmICghaGFzTmVnYXRpdmVXZWlnaHRDeWNsZSkge1xuICAgICAgICAgICAgd2FybignR3JhcGggY29udGFpbnMgYSBuZWdhdGl2ZSB3ZWlnaHQgY3ljbGUgZm9yIEJlbGxtYW4tRm9yZCcpO1xuICAgICAgICAgICAgaGFzTmVnYXRpdmVXZWlnaHRDeWNsZSA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG9wdGlvbnMuZmluZE5lZ2F0aXZlV2VpZ2h0Q3ljbGVzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgdmFyIG5lZ2F0aXZlTm9kZXMgPSBbXTtcblxuICAgICAgICAgICAgaWYgKHNyY0Rpc3QgKyBfd2VpZ2h0MiA8IHRndERpc3QpIHtcbiAgICAgICAgICAgICAgbmVnYXRpdmVOb2Rlcy5wdXNoKF9zcmMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWRpcmVjdGVkICYmIHRndERpc3QgKyBfd2VpZ2h0MiA8IHNyY0Rpc3QpIHtcbiAgICAgICAgICAgICAgbmVnYXRpdmVOb2Rlcy5wdXNoKF90Z3QpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbnVtTmVnYXRpdmVOb2RlcyA9IG5lZ2F0aXZlTm9kZXMubGVuZ3RoO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IG51bU5lZ2F0aXZlTm9kZXM7IG4rKykge1xuICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBuZWdhdGl2ZU5vZGVzW25dO1xuICAgICAgICAgICAgICB2YXIgY3ljbGUgPSBbc3RhcnRdO1xuICAgICAgICAgICAgICBjeWNsZS5wdXNoKGdldEluZm8oc3RhcnQpLmVkZ2UpO1xuICAgICAgICAgICAgICB2YXIgX25vZGUgPSBnZXRJbmZvKHN0YXJ0KS5wcmVkO1xuXG4gICAgICAgICAgICAgIHdoaWxlIChjeWNsZS5pbmRleE9mKF9ub2RlKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjeWNsZS5wdXNoKF9ub2RlKTtcbiAgICAgICAgICAgICAgICBjeWNsZS5wdXNoKGdldEluZm8oX25vZGUpLmVkZ2UpO1xuICAgICAgICAgICAgICAgIF9ub2RlID0gZ2V0SW5mbyhfbm9kZSkucHJlZDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGN5Y2xlID0gY3ljbGUuc2xpY2UoY3ljbGUuaW5kZXhPZihfbm9kZSkpO1xuICAgICAgICAgICAgICB2YXIgc21hbGxlc3RJZCA9IGN5Y2xlWzBdLmlkKCk7XG4gICAgICAgICAgICAgIHZhciBzbWFsbGVzdEluZGV4ID0gMDtcblxuICAgICAgICAgICAgICBmb3IgKHZhciBjID0gMjsgYyA8IGN5Y2xlLmxlbmd0aDsgYyArPSAyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN5Y2xlW2NdLmlkKCkgPCBzbWFsbGVzdElkKSB7XG4gICAgICAgICAgICAgICAgICBzbWFsbGVzdElkID0gY3ljbGVbY10uaWQoKTtcbiAgICAgICAgICAgICAgICAgIHNtYWxsZXN0SW5kZXggPSBjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGN5Y2xlID0gY3ljbGUuc2xpY2Uoc21hbGxlc3RJbmRleCkuY29uY2F0KGN5Y2xlLnNsaWNlKDAsIHNtYWxsZXN0SW5kZXgpKTtcbiAgICAgICAgICAgICAgY3ljbGUucHVzaChjeWNsZVswXSk7XG4gICAgICAgICAgICAgIHZhciBjeWNsZUlkID0gY3ljbGUubWFwKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbC5pZCgpO1xuICAgICAgICAgICAgICB9KS5qb2luKFwiLFwiKTtcblxuICAgICAgICAgICAgICBpZiAobmVnYXRpdmVXZWlnaHRDeWNsZUlkcy5pbmRleE9mKGN5Y2xlSWQpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG5lZ2F0aXZlV2VpZ2h0Q3ljbGVzLnB1c2goZWxlcy5zcGF3bihjeWNsZSkpO1xuICAgICAgICAgICAgICAgIG5lZ2F0aXZlV2VpZ2h0Q3ljbGVJZHMucHVzaChjeWNsZUlkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlzdGFuY2VUbzogZGlzdGFuY2VUbyxcbiAgICAgIHBhdGhUbzogcGF0aFRvLFxuICAgICAgaGFzTmVnYXRpdmVXZWlnaHRDeWNsZTogaGFzTmVnYXRpdmVXZWlnaHRDeWNsZSxcbiAgICAgIG5lZ2F0aXZlV2VpZ2h0Q3ljbGVzOiBuZWdhdGl2ZVdlaWdodEN5Y2xlc1xuICAgIH07XG4gIH0gLy8gYmVsbG1hbkZvcmRcblxufTsgLy8gZWxlc2ZuXG5cbnZhciBzcXJ0MiA9IE1hdGguc3FydCgyKTsgLy8gRnVuY3Rpb24gd2hpY2ggY29sYXBzZXMgMiAobWV0YSkgbm9kZXMgaW50byBvbmVcbi8vIFVwZGF0ZXMgdGhlIHJlbWFpbmluZyBlZGdlIGxpc3RzXG4vLyBSZWNlaXZlcyBhcyBhIHBhcmFtYXRlciB0aGUgZWRnZSB3aGljaCBjYXVzZXMgdGhlIGNvbGxhcHNlXG5cbnZhciBjb2xsYXBzZSA9IGZ1bmN0aW9uIGNvbGxhcHNlKGVkZ2VJbmRleCwgbm9kZU1hcCwgcmVtYWluaW5nRWRnZXMpIHtcbiAgaWYgKHJlbWFpbmluZ0VkZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGVycm9yKFwiS2FyZ2VyLVN0ZWluIG11c3QgYmUgcnVuIG9uIGEgY29ubmVjdGVkIChzdWIpZ3JhcGhcIik7XG4gIH1cblxuICB2YXIgZWRnZUluZm8gPSByZW1haW5pbmdFZGdlc1tlZGdlSW5kZXhdO1xuICB2YXIgc291cmNlSW4gPSBlZGdlSW5mb1sxXTtcbiAgdmFyIHRhcmdldEluID0gZWRnZUluZm9bMl07XG4gIHZhciBwYXJ0aXRpb24xID0gbm9kZU1hcFtzb3VyY2VJbl07XG4gIHZhciBwYXJ0aXRpb24yID0gbm9kZU1hcFt0YXJnZXRJbl07XG4gIHZhciBuZXdFZGdlcyA9IHJlbWFpbmluZ0VkZ2VzOyAvLyByZS11c2UgYXJyYXlcbiAgLy8gRGVsZXRlIGFsbCBlZGdlcyBiZXR3ZWVuIHBhcnRpdGlvbjEgYW5kIHBhcnRpdGlvbjJcblxuICBmb3IgKHZhciBpID0gbmV3RWRnZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgZWRnZSA9IG5ld0VkZ2VzW2ldO1xuICAgIHZhciBzcmMgPSBlZGdlWzFdO1xuICAgIHZhciB0Z3QgPSBlZGdlWzJdO1xuXG4gICAgaWYgKG5vZGVNYXBbc3JjXSA9PT0gcGFydGl0aW9uMSAmJiBub2RlTWFwW3RndF0gPT09IHBhcnRpdGlvbjIgfHwgbm9kZU1hcFtzcmNdID09PSBwYXJ0aXRpb24yICYmIG5vZGVNYXBbdGd0XSA9PT0gcGFydGl0aW9uMSkge1xuICAgICAgbmV3RWRnZXMuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfSAvLyBBbGwgZWRnZXMgcG9pbnRpbmcgdG8gcGFydGl0aW9uMiBzaG91bGQgbm93IHBvaW50IHRvIHBhcnRpdGlvbjFcblxuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBuZXdFZGdlcy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgX2VkZ2UgPSBuZXdFZGdlc1tfaV07XG5cbiAgICBpZiAoX2VkZ2VbMV0gPT09IHBhcnRpdGlvbjIpIHtcbiAgICAgIC8vIENoZWNrIHNvdXJjZVxuICAgICAgbmV3RWRnZXNbX2ldID0gX2VkZ2Uuc2xpY2UoKTsgLy8gY29weVxuXG4gICAgICBuZXdFZGdlc1tfaV1bMV0gPSBwYXJ0aXRpb24xO1xuICAgIH0gZWxzZSBpZiAoX2VkZ2VbMl0gPT09IHBhcnRpdGlvbjIpIHtcbiAgICAgIC8vIENoZWNrIHRhcmdldFxuICAgICAgbmV3RWRnZXNbX2ldID0gX2VkZ2Uuc2xpY2UoKTsgLy8gY29weVxuXG4gICAgICBuZXdFZGdlc1tfaV1bMl0gPSBwYXJ0aXRpb24xO1xuICAgIH1cbiAgfSAvLyBNb3ZlIGFsbCBub2RlcyBmcm9tIHBhcnRpdGlvbjIgdG8gcGFydGl0aW9uMVxuXG5cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbm9kZU1hcC5sZW5ndGg7IF9pMisrKSB7XG4gICAgaWYgKG5vZGVNYXBbX2kyXSA9PT0gcGFydGl0aW9uMikge1xuICAgICAgbm9kZU1hcFtfaTJdID0gcGFydGl0aW9uMTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3RWRnZXM7XG59OyAvLyBDb250cmFjdHMgYSBncmFwaCB1bnRpbCB3ZSByZWFjaCBhIGNlcnRhaW4gbnVtYmVyIG9mIG1ldGEgbm9kZXNcblxuXG52YXIgY29udHJhY3RVbnRpbCA9IGZ1bmN0aW9uIGNvbnRyYWN0VW50aWwobWV0YU5vZGVNYXAsIHJlbWFpbmluZ0VkZ2VzLCBzaXplLCBzaXplTGltaXQpIHtcbiAgd2hpbGUgKHNpemUgPiBzaXplTGltaXQpIHtcbiAgICAvLyBDaG9vc2UgYW4gZWRnZSByYW5kb21seVxuICAgIHZhciBlZGdlSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiByZW1haW5pbmdFZGdlcy5sZW5ndGgpOyAvLyBDb2xsYXBzZSBncmFwaCBiYXNlZCBvbiBlZGdlXG5cbiAgICByZW1haW5pbmdFZGdlcyA9IGNvbGxhcHNlKGVkZ2VJbmRleCwgbWV0YU5vZGVNYXAsIHJlbWFpbmluZ0VkZ2VzKTtcbiAgICBzaXplLS07XG4gIH1cblxuICByZXR1cm4gcmVtYWluaW5nRWRnZXM7XG59O1xuXG52YXIgZWxlc2ZuJHAgPSB7XG4gIC8vIENvbXB1dGVzIHRoZSBtaW5pbXVtIGN1dCBvZiBhbiB1bmRpcmVjdGVkIGdyYXBoXG4gIC8vIFJldHVybnMgdGhlIGNvcnJlY3QgYW5zd2VyIHdpdGggaGlnaCBwcm9iYWJpbGl0eVxuICBrYXJnZXJTdGVpbjogZnVuY3Rpb24ga2FyZ2VyU3RlaW4oKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBfdGhpcyRieUdyb3VwID0gdGhpcy5ieUdyb3VwKCksXG4gICAgICAgIG5vZGVzID0gX3RoaXMkYnlHcm91cC5ub2RlcyxcbiAgICAgICAgZWRnZXMgPSBfdGhpcyRieUdyb3VwLmVkZ2VzO1xuXG4gICAgZWRnZXMudW5tZXJnZUJ5KGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICByZXR1cm4gZWRnZS5pc0xvb3AoKTtcbiAgICB9KTtcbiAgICB2YXIgbnVtTm9kZXMgPSBub2Rlcy5sZW5ndGg7XG4gICAgdmFyIG51bUVkZ2VzID0gZWRnZXMubGVuZ3RoO1xuICAgIHZhciBudW1JdGVyID0gTWF0aC5jZWlsKE1hdGgucG93KE1hdGgubG9nKG51bU5vZGVzKSAvIE1hdGguTE4yLCAyKSk7XG4gICAgdmFyIHN0b3BTaXplID0gTWF0aC5mbG9vcihudW1Ob2RlcyAvIHNxcnQyKTtcblxuICAgIGlmIChudW1Ob2RlcyA8IDIpIHtcbiAgICAgIGVycm9yKCdBdCBsZWFzdCAyIG5vZGVzIGFyZSByZXF1aXJlZCBmb3IgS2FyZ2VyLVN0ZWluIGFsZ29yaXRobScpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IC8vIE5vdyBzdG9yZSBlZGdlIGRlc3RpbmF0aW9uIGFzIGluZGV4ZXNcbiAgICAvLyBGb3JtYXQgZm9yIGVhY2ggZWRnZSAoZWRnZSBpbmRleCwgc291cmNlIG5vZGUgaW5kZXgsIHRhcmdldCBub2RlIGluZGV4KVxuXG5cbiAgICB2YXIgZWRnZUluZGV4ZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtRWRnZXM7IGkrKykge1xuICAgICAgdmFyIGUgPSBlZGdlc1tpXTtcbiAgICAgIGVkZ2VJbmRleGVzLnB1c2goW2ksIG5vZGVzLmluZGV4T2YoZS5zb3VyY2UoKSksIG5vZGVzLmluZGV4T2YoZS50YXJnZXQoKSldKTtcbiAgICB9IC8vIFdlIHdpbGwgc3RvcmUgdGhlIGJlc3QgY3V0IGZvdW5kIGhlcmVcblxuXG4gICAgdmFyIG1pbkN1dFNpemUgPSBJbmZpbml0eTtcbiAgICB2YXIgbWluQ3V0RWRnZUluZGV4ZXMgPSBbXTtcbiAgICB2YXIgbWluQ3V0Tm9kZU1hcCA9IG5ldyBBcnJheShudW1Ob2Rlcyk7IC8vIEluaXRpYWwgbWV0YSBub2RlIHBhcnRpdGlvblxuXG4gICAgdmFyIG1ldGFOb2RlTWFwID0gbmV3IEFycmF5KG51bU5vZGVzKTtcbiAgICB2YXIgbWV0YU5vZGVNYXAyID0gbmV3IEFycmF5KG51bU5vZGVzKTtcblxuICAgIHZhciBjb3B5Tm9kZXNNYXAgPSBmdW5jdGlvbiBjb3B5Tm9kZXNNYXAoZnJvbSwgdG8pIHtcbiAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IG51bU5vZGVzOyBfaTMrKykge1xuICAgICAgICB0b1tfaTNdID0gZnJvbVtfaTNdO1xuICAgICAgfVxuICAgIH07IC8vIE1haW4gbG9vcFxuXG5cbiAgICBmb3IgKHZhciBpdGVyID0gMDsgaXRlciA8PSBudW1JdGVyOyBpdGVyKyspIHtcbiAgICAgIC8vIFJlc2V0IG1ldGEgbm9kZSBwYXJ0aXRpb25cbiAgICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG51bU5vZGVzOyBfaTQrKykge1xuICAgICAgICBtZXRhTm9kZU1hcFtfaTRdID0gX2k0O1xuICAgICAgfSAvLyBDb250cmFjdCB1bnRpbCBzdG9wIHBvaW50IChzdG9wU2l6ZSBub2RlcylcblxuXG4gICAgICB2YXIgZWRnZXNTdGF0ZSA9IGNvbnRyYWN0VW50aWwobWV0YU5vZGVNYXAsIGVkZ2VJbmRleGVzLnNsaWNlKCksIG51bU5vZGVzLCBzdG9wU2l6ZSk7XG4gICAgICB2YXIgZWRnZXNTdGF0ZTIgPSBlZGdlc1N0YXRlLnNsaWNlKCk7IC8vIGNvcHlcbiAgICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGNvbGFwc2VkIG5vZGVzIHN0YXRlXG5cbiAgICAgIGNvcHlOb2Rlc01hcChtZXRhTm9kZU1hcCwgbWV0YU5vZGVNYXAyKTsgLy8gUnVuIDIgaXRlcmF0aW9ucyBzdGFydGluZyBpbiB0aGUgc3RvcCBzdGF0ZVxuXG4gICAgICB2YXIgcmVzMSA9IGNvbnRyYWN0VW50aWwobWV0YU5vZGVNYXAsIGVkZ2VzU3RhdGUsIHN0b3BTaXplLCAyKTtcbiAgICAgIHZhciByZXMyID0gY29udHJhY3RVbnRpbChtZXRhTm9kZU1hcDIsIGVkZ2VzU3RhdGUyLCBzdG9wU2l6ZSwgMik7IC8vIElzIGFueSBvZiB0aGUgMiByZXN1bHRzIHRoZSBiZXN0IGN1dCBzbyBmYXI/XG5cbiAgICAgIGlmIChyZXMxLmxlbmd0aCA8PSByZXMyLmxlbmd0aCAmJiByZXMxLmxlbmd0aCA8IG1pbkN1dFNpemUpIHtcbiAgICAgICAgbWluQ3V0U2l6ZSA9IHJlczEubGVuZ3RoO1xuICAgICAgICBtaW5DdXRFZGdlSW5kZXhlcyA9IHJlczE7XG4gICAgICAgIGNvcHlOb2Rlc01hcChtZXRhTm9kZU1hcCwgbWluQ3V0Tm9kZU1hcCk7XG4gICAgICB9IGVsc2UgaWYgKHJlczIubGVuZ3RoIDw9IHJlczEubGVuZ3RoICYmIHJlczIubGVuZ3RoIDwgbWluQ3V0U2l6ZSkge1xuICAgICAgICBtaW5DdXRTaXplID0gcmVzMi5sZW5ndGg7XG4gICAgICAgIG1pbkN1dEVkZ2VJbmRleGVzID0gcmVzMjtcbiAgICAgICAgY29weU5vZGVzTWFwKG1ldGFOb2RlTWFwMiwgbWluQ3V0Tm9kZU1hcCk7XG4gICAgICB9XG4gICAgfSAvLyBlbmQgb2YgbWFpbiBsb29wXG4gICAgLy8gQ29uc3RydWN0IHJlc3VsdFxuXG5cbiAgICB2YXIgY3V0ID0gdGhpcy5zcGF3bihtaW5DdXRFZGdlSW5kZXhlcy5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBlZGdlc1tlWzBdXTtcbiAgICB9KSk7XG4gICAgdmFyIHBhcnRpdGlvbjEgPSB0aGlzLnNwYXduKCk7XG4gICAgdmFyIHBhcnRpdGlvbjIgPSB0aGlzLnNwYXduKCk7IC8vIHRyYXZlcnNlIG1ldGFOb2RlTWFwIGZvciBiZXN0IGN1dFxuXG4gICAgdmFyIHdpdG5lc3NOb2RlUGFydGl0aW9uID0gbWluQ3V0Tm9kZU1hcFswXTtcblxuICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IG1pbkN1dE5vZGVNYXAubGVuZ3RoOyBfaTUrKykge1xuICAgICAgdmFyIHBhcnRpdGlvbklkID0gbWluQ3V0Tm9kZU1hcFtfaTVdO1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tfaTVdO1xuXG4gICAgICBpZiAocGFydGl0aW9uSWQgPT09IHdpdG5lc3NOb2RlUGFydGl0aW9uKSB7XG4gICAgICAgIHBhcnRpdGlvbjEubWVyZ2Uobm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0aXRpb24yLm1lcmdlKG5vZGUpO1xuICAgICAgfVxuICAgIH0gLy8gY29uc3RydWN0IGNvbXBvbmVudHMgY29ycmVzcG9uZGluZyB0byBlYWNoIGRpc2pvaW50IHN1YnNldCBvZiBub2Rlc1xuXG5cbiAgICB2YXIgY29uc3RydWN0Q29tcG9uZW50ID0gZnVuY3Rpb24gY29uc3RydWN0Q29tcG9uZW50KHN1YnNldCkge1xuICAgICAgdmFyIGNvbXBvbmVudCA9IF90aGlzLnNwYXduKCk7XG5cbiAgICAgIHN1YnNldC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGNvbXBvbmVudC5tZXJnZShub2RlKTtcbiAgICAgICAgbm9kZS5jb25uZWN0ZWRFZGdlcygpLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgICAvLyBlbnN1cmUgZWRnZSBpcyB3aXRoaW4gY2FsbGluZyBjb2xsZWN0aW9uIGFuZCBlZGdlIGlzIG5vdCBpbiBjdXRcbiAgICAgICAgICBpZiAoX3RoaXMuY29udGFpbnMoZWRnZSkgJiYgIWN1dC5jb250YWlucyhlZGdlKSkge1xuICAgICAgICAgICAgY29tcG9uZW50Lm1lcmdlKGVkZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfTtcblxuICAgIHZhciBjb21wb25lbnRzID0gW2NvbnN0cnVjdENvbXBvbmVudChwYXJ0aXRpb24xKSwgY29uc3RydWN0Q29tcG9uZW50KHBhcnRpdGlvbjIpXTtcbiAgICB2YXIgcmV0ID0ge1xuICAgICAgY3V0OiBjdXQsXG4gICAgICBjb21wb25lbnRzOiBjb21wb25lbnRzLFxuICAgICAgLy8gbi5iLiBwYXJ0aXRpb25zIGFyZSBpbmNsdWRlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIG9sZCBhcGkgc3BlY1xuICAgICAgLy8gKGNvdWxkIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgdmVyc2lvbilcbiAgICAgIHBhcnRpdGlvbjE6IHBhcnRpdGlvbjEsXG4gICAgICBwYXJ0aXRpb24yOiBwYXJ0aXRpb24yXG4gICAgfTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG59OyAvLyBlbGVzZm5cblxudmFyIGNvcHlQb3NpdGlvbiA9IGZ1bmN0aW9uIGNvcHlQb3NpdGlvbihwKSB7XG4gIHJldHVybiB7XG4gICAgeDogcC54LFxuICAgIHk6IHAueVxuICB9O1xufTtcbnZhciBtb2RlbFRvUmVuZGVyZWRQb3NpdGlvbiA9IGZ1bmN0aW9uIG1vZGVsVG9SZW5kZXJlZFBvc2l0aW9uKHAsIHpvb20sIHBhbikge1xuICByZXR1cm4ge1xuICAgIHg6IHAueCAqIHpvb20gKyBwYW4ueCxcbiAgICB5OiBwLnkgKiB6b29tICsgcGFuLnlcbiAgfTtcbn07XG52YXIgcmVuZGVyZWRUb01vZGVsUG9zaXRpb24gPSBmdW5jdGlvbiByZW5kZXJlZFRvTW9kZWxQb3NpdGlvbihwLCB6b29tLCBwYW4pIHtcbiAgcmV0dXJuIHtcbiAgICB4OiAocC54IC0gcGFuLngpIC8gem9vbSxcbiAgICB5OiAocC55IC0gcGFuLnkpIC8gem9vbVxuICB9O1xufTtcbnZhciBhcnJheTJwb2ludCA9IGZ1bmN0aW9uIGFycmF5MnBvaW50KGFycikge1xuICByZXR1cm4ge1xuICAgIHg6IGFyclswXSxcbiAgICB5OiBhcnJbMV1cbiAgfTtcbn07XG52YXIgbWluID0gZnVuY3Rpb24gbWluKGFycikge1xuICB2YXIgYmVnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gIHZhciBlbmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGFyci5sZW5ndGg7XG4gIHZhciBtaW4gPSBJbmZpbml0eTtcblxuICBmb3IgKHZhciBpID0gYmVnaW47IGkgPCBlbmQ7IGkrKykge1xuICAgIHZhciB2YWwgPSBhcnJbaV07XG5cbiAgICBpZiAoaXNGaW5pdGUodmFsKSkge1xuICAgICAgbWluID0gTWF0aC5taW4odmFsLCBtaW4pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtaW47XG59O1xudmFyIG1heCA9IGZ1bmN0aW9uIG1heChhcnIpIHtcbiAgdmFyIGJlZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICB2YXIgZW5kID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBhcnIubGVuZ3RoO1xuICB2YXIgbWF4ID0gLUluZmluaXR5O1xuXG4gIGZvciAodmFyIGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7XG4gICAgdmFyIHZhbCA9IGFycltpXTtcblxuICAgIGlmIChpc0Zpbml0ZSh2YWwpKSB7XG4gICAgICBtYXggPSBNYXRoLm1heCh2YWwsIG1heCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1heDtcbn07XG52YXIgbWVhbiA9IGZ1bmN0aW9uIG1lYW4oYXJyKSB7XG4gIHZhciBiZWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgdmFyIGVuZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogYXJyLmxlbmd0aDtcbiAgdmFyIHRvdGFsID0gMDtcbiAgdmFyIG4gPSAwO1xuXG4gIGZvciAodmFyIGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7XG4gICAgdmFyIHZhbCA9IGFycltpXTtcblxuICAgIGlmIChpc0Zpbml0ZSh2YWwpKSB7XG4gICAgICB0b3RhbCArPSB2YWw7XG4gICAgICBuKys7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvdGFsIC8gbjtcbn07XG52YXIgbWVkaWFuID0gZnVuY3Rpb24gbWVkaWFuKGFycikge1xuICB2YXIgYmVnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gIHZhciBlbmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGFyci5sZW5ndGg7XG4gIHZhciBjb3B5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB0cnVlO1xuICB2YXIgc29ydCA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdHJ1ZTtcbiAgdmFyIGluY2x1ZGVIb2xlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDogdHJ1ZTtcblxuICBpZiAoY29weSkge1xuICAgIGFyciA9IGFyci5zbGljZShiZWdpbiwgZW5kKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoZW5kIDwgYXJyLmxlbmd0aCkge1xuICAgICAgYXJyLnNwbGljZShlbmQsIGFyci5sZW5ndGggLSBlbmQpO1xuICAgIH1cblxuICAgIGlmIChiZWdpbiA+IDApIHtcbiAgICAgIGFyci5zcGxpY2UoMCwgYmVnaW4pO1xuICAgIH1cbiAgfSAvLyBhbGwgbm9uIGZpbml0ZSAoZS5nLiBJbmZpbml0eSwgTmFOKSBlbGVtZW50cyBtdXN0IGJlIC1JbmZpbml0eSBzbyB0aGV5IGdvIHRvIHRoZSBzdGFydFxuXG5cbiAgdmFyIG9mZiA9IDA7IC8vIG9mZnNldCBmcm9tIG5vbi1maW5pdGUgdmFsdWVzXG5cbiAgZm9yICh2YXIgaSA9IGFyci5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciB2ID0gYXJyW2ldO1xuXG4gICAgaWYgKGluY2x1ZGVIb2xlcykge1xuICAgICAgaWYgKCFpc0Zpbml0ZSh2KSkge1xuICAgICAgICBhcnJbaV0gPSAtSW5maW5pdHk7XG4gICAgICAgIG9mZisrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBqdXN0IHJlbW92ZSBpdCBpZiB3ZSBkb24ndCB3YW50IHRvIGNvbnNpZGVyIGhvbGVzXG4gICAgICBhcnIuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzb3J0KSB7XG4gICAgYXJyLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhIC0gYjtcbiAgICB9KTsgLy8gcmVxdWlyZXMgY29weSA9IHRydWUgaWYgeW91IGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBvcmlnXG4gIH1cblxuICB2YXIgbGVuID0gYXJyLmxlbmd0aDtcbiAgdmFyIG1pZCA9IE1hdGguZmxvb3IobGVuIC8gMik7XG5cbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICByZXR1cm4gYXJyW21pZCArIDEgKyBvZmZdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAoYXJyW21pZCAtIDEgKyBvZmZdICsgYXJyW21pZCArIG9mZl0pIC8gMjtcbiAgfVxufTtcbnZhciBkZWcycmFkID0gZnVuY3Rpb24gZGVnMnJhZChkZWcpIHtcbiAgcmV0dXJuIE1hdGguUEkgKiBkZWcgLyAxODA7XG59O1xudmFyIGdldEFuZ2xlRnJvbURpc3AgPSBmdW5jdGlvbiBnZXRBbmdsZUZyb21EaXNwKGRpc3BYLCBkaXNwWSkge1xuICByZXR1cm4gTWF0aC5hdGFuMihkaXNwWSwgZGlzcFgpIC0gTWF0aC5QSSAvIDI7XG59O1xudmFyIGxvZzIgPSBNYXRoLmxvZzIgfHwgZnVuY3Rpb24gKG4pIHtcbiAgcmV0dXJuIE1hdGgubG9nKG4pIC8gTWF0aC5sb2coMik7XG59O1xudmFyIHNpZ251bSA9IGZ1bmN0aW9uIHNpZ251bSh4KSB7XG4gIGlmICh4ID4gMCkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2UgaWYgKHggPCAwKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAwO1xuICB9XG59O1xudmFyIGRpc3QgPSBmdW5jdGlvbiBkaXN0KHAxLCBwMikge1xuICByZXR1cm4gTWF0aC5zcXJ0KHNxZGlzdChwMSwgcDIpKTtcbn07XG52YXIgc3FkaXN0ID0gZnVuY3Rpb24gc3FkaXN0KHAxLCBwMikge1xuICB2YXIgZHggPSBwMi54IC0gcDEueDtcbiAgdmFyIGR5ID0gcDIueSAtIHAxLnk7XG4gIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbn07XG52YXIgaW5QbGFjZVN1bU5vcm1hbGl6ZSA9IGZ1bmN0aW9uIGluUGxhY2VTdW1Ob3JtYWxpemUodikge1xuICB2YXIgbGVuZ3RoID0gdi5sZW5ndGg7IC8vIEZpcnN0LCBnZXQgc3VtIG9mIGFsbCBlbGVtZW50c1xuXG4gIHZhciB0b3RhbCA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIHRvdGFsICs9IHZbaV07XG4gIH0gLy8gTm93LCBkaXZpZGUgZWFjaCBieSB0aGUgc3VtIG9mIGFsbCBlbGVtZW50c1xuXG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxlbmd0aDsgX2krKykge1xuICAgIHZbX2ldID0gdltfaV0gLyB0b3RhbDtcbiAgfVxuXG4gIHJldHVybiB2O1xufTtcblxudmFyIHFiZXppZXJBdCA9IGZ1bmN0aW9uIHFiZXppZXJBdChwMCwgcDEsIHAyLCB0KSB7XG4gIHJldHVybiAoMSAtIHQpICogKDEgLSB0KSAqIHAwICsgMiAqICgxIC0gdCkgKiB0ICogcDEgKyB0ICogdCAqIHAyO1xufTtcbnZhciBxYmV6aWVyUHRBdCA9IGZ1bmN0aW9uIHFiZXppZXJQdEF0KHAwLCBwMSwgcDIsIHQpIHtcbiAgcmV0dXJuIHtcbiAgICB4OiBxYmV6aWVyQXQocDAueCwgcDEueCwgcDIueCwgdCksXG4gICAgeTogcWJlemllckF0KHAwLnksIHAxLnksIHAyLnksIHQpXG4gIH07XG59O1xudmFyIGxpbmVBdCA9IGZ1bmN0aW9uIGxpbmVBdChwMCwgcDEsIHQsIGQpIHtcbiAgdmFyIHZlYyA9IHtcbiAgICB4OiBwMS54IC0gcDAueCxcbiAgICB5OiBwMS55IC0gcDAueVxuICB9O1xuICB2YXIgdmVjRGlzdCA9IGRpc3QocDAsIHAxKTtcbiAgdmFyIG5vcm1WZWMgPSB7XG4gICAgeDogdmVjLnggLyB2ZWNEaXN0LFxuICAgIHk6IHZlYy55IC8gdmVjRGlzdFxuICB9O1xuICB0ID0gdCA9PSBudWxsID8gMCA6IHQ7XG4gIGQgPSBkICE9IG51bGwgPyBkIDogdCAqIHZlY0Rpc3Q7XG4gIHJldHVybiB7XG4gICAgeDogcDAueCArIG5vcm1WZWMueCAqIGQsXG4gICAgeTogcDAueSArIG5vcm1WZWMueSAqIGRcbiAgfTtcbn07XG52YXIgYm91bmQgPSBmdW5jdGlvbiBib3VuZChtaW4sIHZhbCwgbWF4KSB7XG4gIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgdmFsKSk7XG59OyAvLyBtYWtlcyBhIGZ1bGwgYmIgKHgxLCB5MSwgeDIsIHkyLCB3LCBoKSBmcm9tIGltcGxpY2l0IHBhcmFtc1xuXG52YXIgbWFrZUJvdW5kaW5nQm94ID0gZnVuY3Rpb24gbWFrZUJvdW5kaW5nQm94KGJiKSB7XG4gIGlmIChiYiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHgxOiBJbmZpbml0eSxcbiAgICAgIHkxOiBJbmZpbml0eSxcbiAgICAgIHgyOiAtSW5maW5pdHksXG4gICAgICB5MjogLUluZmluaXR5LFxuICAgICAgdzogMCxcbiAgICAgIGg6IDBcbiAgICB9O1xuICB9IGVsc2UgaWYgKGJiLngxICE9IG51bGwgJiYgYmIueTEgIT0gbnVsbCkge1xuICAgIGlmIChiYi54MiAhPSBudWxsICYmIGJiLnkyICE9IG51bGwgJiYgYmIueDIgPj0gYmIueDEgJiYgYmIueTIgPj0gYmIueTEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHgxOiBiYi54MSxcbiAgICAgICAgeTE6IGJiLnkxLFxuICAgICAgICB4MjogYmIueDIsXG4gICAgICAgIHkyOiBiYi55MixcbiAgICAgICAgdzogYmIueDIgLSBiYi54MSxcbiAgICAgICAgaDogYmIueTIgLSBiYi55MVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGJiLncgIT0gbnVsbCAmJiBiYi5oICE9IG51bGwgJiYgYmIudyA+PSAwICYmIGJiLmggPj0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDE6IGJiLngxLFxuICAgICAgICB5MTogYmIueTEsXG4gICAgICAgIHgyOiBiYi54MSArIGJiLncsXG4gICAgICAgIHkyOiBiYi55MSArIGJiLmgsXG4gICAgICAgIHc6IGJiLncsXG4gICAgICAgIGg6IGJiLmhcbiAgICAgIH07XG4gICAgfVxuICB9XG59O1xudmFyIGNvcHlCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIGNvcHlCb3VuZGluZ0JveChiYikge1xuICByZXR1cm4ge1xuICAgIHgxOiBiYi54MSxcbiAgICB4MjogYmIueDIsXG4gICAgdzogYmIudyxcbiAgICB5MTogYmIueTEsXG4gICAgeTI6IGJiLnkyLFxuICAgIGg6IGJiLmhcbiAgfTtcbn07XG52YXIgY2xlYXJCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIGNsZWFyQm91bmRpbmdCb3goYmIpIHtcbiAgYmIueDEgPSBJbmZpbml0eTtcbiAgYmIueTEgPSBJbmZpbml0eTtcbiAgYmIueDIgPSAtSW5maW5pdHk7XG4gIGJiLnkyID0gLUluZmluaXR5O1xuICBiYi53ID0gMDtcbiAgYmIuaCA9IDA7XG59O1xudmFyIHVwZGF0ZUJvdW5kaW5nQm94ID0gZnVuY3Rpb24gdXBkYXRlQm91bmRpbmdCb3goYmIxLCBiYjIpIHtcbiAgLy8gdXBkYXRlIGJiMSB3aXRoIGJiMiBib3VuZHNcbiAgYmIxLngxID0gTWF0aC5taW4oYmIxLngxLCBiYjIueDEpO1xuICBiYjEueDIgPSBNYXRoLm1heChiYjEueDIsIGJiMi54Mik7XG4gIGJiMS53ID0gYmIxLngyIC0gYmIxLngxO1xuICBiYjEueTEgPSBNYXRoLm1pbihiYjEueTEsIGJiMi55MSk7XG4gIGJiMS55MiA9IE1hdGgubWF4KGJiMS55MiwgYmIyLnkyKTtcbiAgYmIxLmggPSBiYjEueTIgLSBiYjEueTE7XG59O1xudmFyIGV4cGFuZEJvdW5kaW5nQm94QnlQb2ludCA9IGZ1bmN0aW9uIGV4cGFuZEJvdW5kaW5nQm94QnlQb2ludChiYiwgeCwgeSkge1xuICBiYi54MSA9IE1hdGgubWluKGJiLngxLCB4KTtcbiAgYmIueDIgPSBNYXRoLm1heChiYi54MiwgeCk7XG4gIGJiLncgPSBiYi54MiAtIGJiLngxO1xuICBiYi55MSA9IE1hdGgubWluKGJiLnkxLCB5KTtcbiAgYmIueTIgPSBNYXRoLm1heChiYi55MiwgeSk7XG4gIGJiLmggPSBiYi55MiAtIGJiLnkxO1xufTtcbnZhciBleHBhbmRCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIGV4cGFuZEJvdW5kaW5nQm94KGJiKSB7XG4gIHZhciBwYWRkaW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICBiYi54MSAtPSBwYWRkaW5nO1xuICBiYi54MiArPSBwYWRkaW5nO1xuICBiYi55MSAtPSBwYWRkaW5nO1xuICBiYi55MiArPSBwYWRkaW5nO1xuICBiYi53ID0gYmIueDIgLSBiYi54MTtcbiAgYmIuaCA9IGJiLnkyIC0gYmIueTE7XG4gIHJldHVybiBiYjtcbn07XG52YXIgZXhwYW5kQm91bmRpbmdCb3hTaWRlcyA9IGZ1bmN0aW9uIGV4cGFuZEJvdW5kaW5nQm94U2lkZXMoYmIpIHtcbiAgdmFyIHBhZGRpbmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFswXTtcbiAgdmFyIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdDtcblxuICBpZiAocGFkZGluZy5sZW5ndGggPT09IDEpIHtcbiAgICB0b3AgPSByaWdodCA9IGJvdHRvbSA9IGxlZnQgPSBwYWRkaW5nWzBdO1xuICB9IGVsc2UgaWYgKHBhZGRpbmcubGVuZ3RoID09PSAyKSB7XG4gICAgdG9wID0gYm90dG9tID0gcGFkZGluZ1swXTtcbiAgICBsZWZ0ID0gcmlnaHQgPSBwYWRkaW5nWzFdO1xuICB9IGVsc2UgaWYgKHBhZGRpbmcubGVuZ3RoID09PSA0KSB7XG4gICAgdmFyIF9wYWRkaW5nID0gX3NsaWNlZFRvQXJyYXkocGFkZGluZywgNCk7XG5cbiAgICB0b3AgPSBfcGFkZGluZ1swXTtcbiAgICByaWdodCA9IF9wYWRkaW5nWzFdO1xuICAgIGJvdHRvbSA9IF9wYWRkaW5nWzJdO1xuICAgIGxlZnQgPSBfcGFkZGluZ1szXTtcbiAgfVxuXG4gIGJiLngxIC09IGxlZnQ7XG4gIGJiLngyICs9IHJpZ2h0O1xuICBiYi55MSAtPSB0b3A7XG4gIGJiLnkyICs9IGJvdHRvbTtcbiAgYmIudyA9IGJiLngyIC0gYmIueDE7XG4gIGJiLmggPSBiYi55MiAtIGJiLnkxO1xuICByZXR1cm4gYmI7XG59O1xuXG52YXIgYXNzaWduQm91bmRpbmdCb3ggPSBmdW5jdGlvbiBhc3NpZ25Cb3VuZGluZ0JveChiYjEsIGJiMikge1xuICBiYjEueDEgPSBiYjIueDE7XG4gIGJiMS55MSA9IGJiMi55MTtcbiAgYmIxLngyID0gYmIyLngyO1xuICBiYjEueTIgPSBiYjIueTI7XG4gIGJiMS53ID0gYmIxLngyIC0gYmIxLngxO1xuICBiYjEuaCA9IGJiMS55MiAtIGJiMS55MTtcbn07XG52YXIgYm91bmRpbmdCb3hlc0ludGVyc2VjdCA9IGZ1bmN0aW9uIGJvdW5kaW5nQm94ZXNJbnRlcnNlY3QoYmIxLCBiYjIpIHtcbiAgLy8gY2FzZTogb25lIGJiIHRvIHJpZ2h0IG9mIG90aGVyXG4gIGlmIChiYjEueDEgPiBiYjIueDIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoYmIyLngxID4gYmIxLngyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIGNhc2U6IG9uZSBiYiB0byBsZWZ0IG9mIG90aGVyXG5cblxuICBpZiAoYmIxLngyIDwgYmIyLngxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGJiMi54MiA8IGJiMS54MSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBjYXNlOiBvbmUgYmIgYWJvdmUgb3RoZXJcblxuXG4gIGlmIChiYjEueTIgPCBiYjIueTEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoYmIyLnkyIDwgYmIxLnkxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIGNhc2U6IG9uZSBiYiBiZWxvdyBvdGhlclxuXG5cbiAgaWYgKGJiMS55MSA+IGJiMi55Mikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChiYjIueTEgPiBiYjEueTIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gb3RoZXJ3aXNlLCBtdXN0IGhhdmUgc29tZSBvdmVybGFwXG5cblxuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgaW5Cb3VuZGluZ0JveCA9IGZ1bmN0aW9uIGluQm91bmRpbmdCb3goYmIsIHgsIHkpIHtcbiAgcmV0dXJuIGJiLngxIDw9IHggJiYgeCA8PSBiYi54MiAmJiBiYi55MSA8PSB5ICYmIHkgPD0gYmIueTI7XG59O1xudmFyIHBvaW50SW5Cb3VuZGluZ0JveCA9IGZ1bmN0aW9uIHBvaW50SW5Cb3VuZGluZ0JveChiYiwgcHQpIHtcbiAgcmV0dXJuIGluQm91bmRpbmdCb3goYmIsIHB0LngsIHB0LnkpO1xufTtcbnZhciBib3VuZGluZ0JveEluQm91bmRpbmdCb3ggPSBmdW5jdGlvbiBib3VuZGluZ0JveEluQm91bmRpbmdCb3goYmIxLCBiYjIpIHtcbiAgcmV0dXJuIGluQm91bmRpbmdCb3goYmIxLCBiYjIueDEsIGJiMi55MSkgJiYgaW5Cb3VuZGluZ0JveChiYjEsIGJiMi54MiwgYmIyLnkyKTtcbn07XG52YXIgcm91bmRSZWN0YW5nbGVJbnRlcnNlY3RMaW5lID0gZnVuY3Rpb24gcm91bmRSZWN0YW5nbGVJbnRlcnNlY3RMaW5lKHgsIHksIG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZykge1xuICB2YXIgY29ybmVyUmFkaXVzID0gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCk7XG4gIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjsgLy8gQ2hlY2sgaW50ZXJzZWN0aW9ucyB3aXRoIHN0cmFpZ2h0IGxpbmUgc2VnbWVudHNcblxuICB2YXIgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9uczsgLy8gVG9wIHNlZ21lbnQsIGxlZnQgdG8gcmlnaHRcblxuICB7XG4gICAgdmFyIHRvcFN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzIC0gcGFkZGluZztcbiAgICB2YXIgdG9wU3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0IC0gcGFkZGluZztcbiAgICB2YXIgdG9wRW5kWCA9IG5vZGVYICsgaGFsZldpZHRoIC0gY29ybmVyUmFkaXVzICsgcGFkZGluZztcbiAgICB2YXIgdG9wRW5kWSA9IHRvcFN0YXJ0WTtcbiAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gZmluaXRlTGluZXNJbnRlcnNlY3QoeCwgeSwgbm9kZVgsIG5vZGVZLCB0b3BTdGFydFgsIHRvcFN0YXJ0WSwgdG9wRW5kWCwgdG9wRW5kWSwgZmFsc2UpO1xuXG4gICAgaWYgKHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnM7XG4gICAgfVxuICB9IC8vIFJpZ2h0IHNlZ21lbnQsIHRvcCB0byBib3R0b21cblxuICB7XG4gICAgdmFyIHJpZ2h0U3RhcnRYID0gbm9kZVggKyBoYWxmV2lkdGggKyBwYWRkaW5nO1xuICAgIHZhciByaWdodFN0YXJ0WSA9IG5vZGVZIC0gaGFsZkhlaWdodCArIGNvcm5lclJhZGl1cyAtIHBhZGRpbmc7XG4gICAgdmFyIHJpZ2h0RW5kWCA9IHJpZ2h0U3RhcnRYO1xuICAgIHZhciByaWdodEVuZFkgPSBub2RlWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nO1xuICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBmaW5pdGVMaW5lc0ludGVyc2VjdCh4LCB5LCBub2RlWCwgbm9kZVksIHJpZ2h0U3RhcnRYLCByaWdodFN0YXJ0WSwgcmlnaHRFbmRYLCByaWdodEVuZFksIGZhbHNlKTtcblxuICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgIH1cbiAgfSAvLyBCb3R0b20gc2VnbWVudCwgbGVmdCB0byByaWdodFxuXG4gIHtcbiAgICB2YXIgYm90dG9tU3RhcnRYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXMgLSBwYWRkaW5nO1xuICAgIHZhciBib3R0b21TdGFydFkgPSBub2RlWSArIGhhbGZIZWlnaHQgKyBwYWRkaW5nO1xuICAgIHZhciBib3R0b21FbmRYID0gbm9kZVggKyBoYWxmV2lkdGggLSBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nO1xuICAgIHZhciBib3R0b21FbmRZID0gYm90dG9tU3RhcnRZO1xuICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBmaW5pdGVMaW5lc0ludGVyc2VjdCh4LCB5LCBub2RlWCwgbm9kZVksIGJvdHRvbVN0YXJ0WCwgYm90dG9tU3RhcnRZLCBib3R0b21FbmRYLCBib3R0b21FbmRZLCBmYWxzZSk7XG5cbiAgICBpZiAoc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucztcbiAgICB9XG4gIH0gLy8gTGVmdCBzZWdtZW50LCB0b3AgdG8gYm90dG9tXG5cbiAge1xuICAgIHZhciBsZWZ0U3RhcnRYID0gbm9kZVggLSBoYWxmV2lkdGggLSBwYWRkaW5nO1xuICAgIHZhciBsZWZ0U3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyUmFkaXVzIC0gcGFkZGluZztcbiAgICB2YXIgbGVmdEVuZFggPSBsZWZ0U3RhcnRYO1xuICAgIHZhciBsZWZ0RW5kWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1cyArIHBhZGRpbmc7XG4gICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IGZpbml0ZUxpbmVzSW50ZXJzZWN0KHgsIHksIG5vZGVYLCBub2RlWSwgbGVmdFN0YXJ0WCwgbGVmdFN0YXJ0WSwgbGVmdEVuZFgsIGxlZnRFbmRZLCBmYWxzZSk7XG5cbiAgICBpZiAoc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucztcbiAgICB9XG4gIH0gLy8gQ2hlY2sgaW50ZXJzZWN0aW9ucyB3aXRoIGFyYyBzZWdtZW50c1xuXG4gIHZhciBhcmNJbnRlcnNlY3Rpb25zOyAvLyBUb3AgTGVmdFxuXG4gIHtcbiAgICB2YXIgdG9wTGVmdENlbnRlclggPSBub2RlWCAtIGhhbGZXaWR0aCArIGNvcm5lclJhZGl1cztcbiAgICB2YXIgdG9wTGVmdENlbnRlclkgPSBub2RlWSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJSYWRpdXM7XG4gICAgYXJjSW50ZXJzZWN0aW9ucyA9IGludGVyc2VjdExpbmVDaXJjbGUoeCwgeSwgbm9kZVgsIG5vZGVZLCB0b3BMZWZ0Q2VudGVyWCwgdG9wTGVmdENlbnRlclksIGNvcm5lclJhZGl1cyArIHBhZGRpbmcpOyAvLyBFbnN1cmUgdGhlIGludGVyc2VjdGlvbiBpcyBvbiB0aGUgZGVzaXJlZCBxdWFydGVyIG9mIHRoZSBjaXJjbGVcblxuICAgIGlmIChhcmNJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDAgJiYgYXJjSW50ZXJzZWN0aW9uc1swXSA8PSB0b3BMZWZ0Q2VudGVyWCAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdIDw9IHRvcExlZnRDZW50ZXJZKSB7XG4gICAgICByZXR1cm4gW2FyY0ludGVyc2VjdGlvbnNbMF0sIGFyY0ludGVyc2VjdGlvbnNbMV1dO1xuICAgIH1cbiAgfSAvLyBUb3AgUmlnaHRcblxuICB7XG4gICAgdmFyIHRvcFJpZ2h0Q2VudGVyWCA9IG5vZGVYICsgaGFsZldpZHRoIC0gY29ybmVyUmFkaXVzO1xuICAgIHZhciB0b3BSaWdodENlbnRlclkgPSBub2RlWSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJSYWRpdXM7XG4gICAgYXJjSW50ZXJzZWN0aW9ucyA9IGludGVyc2VjdExpbmVDaXJjbGUoeCwgeSwgbm9kZVgsIG5vZGVZLCB0b3BSaWdodENlbnRlclgsIHRvcFJpZ2h0Q2VudGVyWSwgY29ybmVyUmFkaXVzICsgcGFkZGluZyk7IC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuXG4gICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMCAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdID49IHRvcFJpZ2h0Q2VudGVyWCAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdIDw9IHRvcFJpZ2h0Q2VudGVyWSkge1xuICAgICAgcmV0dXJuIFthcmNJbnRlcnNlY3Rpb25zWzBdLCBhcmNJbnRlcnNlY3Rpb25zWzFdXTtcbiAgICB9XG4gIH0gLy8gQm90dG9tIFJpZ2h0XG5cbiAge1xuICAgIHZhciBib3R0b21SaWdodENlbnRlclggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cztcbiAgICB2YXIgYm90dG9tUmlnaHRDZW50ZXJZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzO1xuICAgIGFyY0ludGVyc2VjdGlvbnMgPSBpbnRlcnNlY3RMaW5lQ2lyY2xlKHgsIHksIG5vZGVYLCBub2RlWSwgYm90dG9tUmlnaHRDZW50ZXJYLCBib3R0b21SaWdodENlbnRlclksIGNvcm5lclJhZGl1cyArIHBhZGRpbmcpOyAvLyBFbnN1cmUgdGhlIGludGVyc2VjdGlvbiBpcyBvbiB0aGUgZGVzaXJlZCBxdWFydGVyIG9mIHRoZSBjaXJjbGVcblxuICAgIGlmIChhcmNJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDAgJiYgYXJjSW50ZXJzZWN0aW9uc1swXSA+PSBib3R0b21SaWdodENlbnRlclggJiYgYXJjSW50ZXJzZWN0aW9uc1sxXSA+PSBib3R0b21SaWdodENlbnRlclkpIHtcbiAgICAgIHJldHVybiBbYXJjSW50ZXJzZWN0aW9uc1swXSwgYXJjSW50ZXJzZWN0aW9uc1sxXV07XG4gICAgfVxuICB9IC8vIEJvdHRvbSBMZWZ0XG5cbiAge1xuICAgIHZhciBib3R0b21MZWZ0Q2VudGVyWCA9IG5vZGVYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzO1xuICAgIHZhciBib3R0b21MZWZ0Q2VudGVyWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1cztcbiAgICBhcmNJbnRlcnNlY3Rpb25zID0gaW50ZXJzZWN0TGluZUNpcmNsZSh4LCB5LCBub2RlWCwgbm9kZVksIGJvdHRvbUxlZnRDZW50ZXJYLCBib3R0b21MZWZ0Q2VudGVyWSwgY29ybmVyUmFkaXVzICsgcGFkZGluZyk7IC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuXG4gICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMCAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdIDw9IGJvdHRvbUxlZnRDZW50ZXJYICYmIGFyY0ludGVyc2VjdGlvbnNbMV0gPj0gYm90dG9tTGVmdENlbnRlclkpIHtcbiAgICAgIHJldHVybiBbYXJjSW50ZXJzZWN0aW9uc1swXSwgYXJjSW50ZXJzZWN0aW9uc1sxXV07XG4gICAgfVxuICB9XG4gIHJldHVybiBbXTsgLy8gaWYgbm90aGluZ1xufTtcbnZhciBpbkxpbmVWaWNpbml0eSA9IGZ1bmN0aW9uIGluTGluZVZpY2luaXR5KHgsIHksIGx4MSwgbHkxLCBseDIsIGx5MiwgdG9sZXJhbmNlKSB7XG4gIHZhciB0ID0gdG9sZXJhbmNlO1xuICB2YXIgeDEgPSBNYXRoLm1pbihseDEsIGx4Mik7XG4gIHZhciB4MiA9IE1hdGgubWF4KGx4MSwgbHgyKTtcbiAgdmFyIHkxID0gTWF0aC5taW4obHkxLCBseTIpO1xuICB2YXIgeTIgPSBNYXRoLm1heChseTEsIGx5Mik7XG4gIHJldHVybiB4MSAtIHQgPD0geCAmJiB4IDw9IHgyICsgdCAmJiB5MSAtIHQgPD0geSAmJiB5IDw9IHkyICsgdDtcbn07XG52YXIgaW5CZXppZXJWaWNpbml0eSA9IGZ1bmN0aW9uIGluQmV6aWVyVmljaW5pdHkoeCwgeSwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgdG9sZXJhbmNlKSB7XG4gIHZhciBiYiA9IHtcbiAgICB4MTogTWF0aC5taW4oeDEsIHgzLCB4MikgLSB0b2xlcmFuY2UsXG4gICAgeDI6IE1hdGgubWF4KHgxLCB4MywgeDIpICsgdG9sZXJhbmNlLFxuICAgIHkxOiBNYXRoLm1pbih5MSwgeTMsIHkyKSAtIHRvbGVyYW5jZSxcbiAgICB5MjogTWF0aC5tYXgoeTEsIHkzLCB5MikgKyB0b2xlcmFuY2VcbiAgfTsgLy8gaWYgb3V0c2lkZSB0aGUgcm91Z2ggYm91bmRpbmcgYm94IGZvciB0aGUgYmV6aWVyLCB0aGVuIGl0IGNhbid0IGJlIGEgaGl0XG5cbiAgaWYgKHggPCBiYi54MSB8fCB4ID4gYmIueDIgfHwgeSA8IGJiLnkxIHx8IHkgPiBiYi55Mikge1xuICAgIC8vIGNvbnNvbGUubG9nKCdiZXppZXIgb3V0IG9mIHJvdWdoIGJiJylcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2RvIG1vcmUgZXhwZW5zaXZlIGNoZWNrJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG52YXIgc29sdmVRdWFkcmF0aWMgPSBmdW5jdGlvbiBzb2x2ZVF1YWRyYXRpYyhhLCBiLCBjLCB2YWwpIHtcbiAgYyAtPSB2YWw7XG4gIHZhciByID0gYiAqIGIgLSA0ICogYSAqIGM7XG5cbiAgaWYgKHIgPCAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIHNxcnRSID0gTWF0aC5zcXJ0KHIpO1xuICB2YXIgZGVub20gPSAyICogYTtcbiAgdmFyIHJvb3QxID0gKC1iICsgc3FydFIpIC8gZGVub207XG4gIHZhciByb290MiA9ICgtYiAtIHNxcnRSKSAvIGRlbm9tO1xuICByZXR1cm4gW3Jvb3QxLCByb290Ml07XG59O1xudmFyIHNvbHZlQ3ViaWMgPSBmdW5jdGlvbiBzb2x2ZUN1YmljKGEsIGIsIGMsIGQsIHJlc3VsdCkge1xuICAvLyBTb2x2ZXMgYSBjdWJpYyBmdW5jdGlvbiwgcmV0dXJucyByb290IGluIGZvcm0gW3IxLCBpMSwgcjIsIGkyLCByMywgaTNdLCB3aGVyZVxuICAvLyByIGlzIHRoZSByZWFsIGNvbXBvbmVudCwgaSBpcyB0aGUgaW1hZ2luYXJ5IGNvbXBvbmVudFxuICAvLyBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ2FyZGFubyBtZXRob2QgZnJvbSB0aGUgeWVhciAxNTQ1XG4gIC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3ViaWNfZnVuY3Rpb24jVGhlX25hdHVyZV9vZl90aGVfcm9vdHNcbiAgdmFyIGVwc2lsb24gPSAwLjAwMDAxOyAvLyBhdm9pZCBkaXZpc2lvbiBieSB6ZXJvIHdoaWxlIGtlZXBpbmcgdGhlIG92ZXJhbGwgZXhwcmVzc2lvbiBjbG9zZSBpbiB2YWx1ZVxuXG4gIGlmIChhID09PSAwKSB7XG4gICAgYSA9IGVwc2lsb247XG4gIH1cblxuICBiIC89IGE7XG4gIGMgLz0gYTtcbiAgZCAvPSBhO1xuICB2YXIgZGlzY3JpbWluYW50LCBxLCByLCBkdW0xLCBzLCB0LCB0ZXJtMSwgcjEzO1xuICBxID0gKDMuMCAqIGMgLSBiICogYikgLyA5LjA7XG4gIHIgPSAtKDI3LjAgKiBkKSArIGIgKiAoOS4wICogYyAtIDIuMCAqIChiICogYikpO1xuICByIC89IDU0LjA7XG4gIGRpc2NyaW1pbmFudCA9IHEgKiBxICogcSArIHIgKiByO1xuICByZXN1bHRbMV0gPSAwO1xuICB0ZXJtMSA9IGIgLyAzLjA7XG5cbiAgaWYgKGRpc2NyaW1pbmFudCA+IDApIHtcbiAgICBzID0gciArIE1hdGguc3FydChkaXNjcmltaW5hbnQpO1xuICAgIHMgPSBzIDwgMCA/IC1NYXRoLnBvdygtcywgMS4wIC8gMy4wKSA6IE1hdGgucG93KHMsIDEuMCAvIDMuMCk7XG4gICAgdCA9IHIgLSBNYXRoLnNxcnQoZGlzY3JpbWluYW50KTtcbiAgICB0ID0gdCA8IDAgPyAtTWF0aC5wb3coLXQsIDEuMCAvIDMuMCkgOiBNYXRoLnBvdyh0LCAxLjAgLyAzLjApO1xuICAgIHJlc3VsdFswXSA9IC10ZXJtMSArIHMgKyB0O1xuICAgIHRlcm0xICs9IChzICsgdCkgLyAyLjA7XG4gICAgcmVzdWx0WzRdID0gcmVzdWx0WzJdID0gLXRlcm0xO1xuICAgIHRlcm0xID0gTWF0aC5zcXJ0KDMuMCkgKiAoLXQgKyBzKSAvIDI7XG4gICAgcmVzdWx0WzNdID0gdGVybTE7XG4gICAgcmVzdWx0WzVdID0gLXRlcm0xO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJlc3VsdFs1XSA9IHJlc3VsdFszXSA9IDA7XG5cbiAgaWYgKGRpc2NyaW1pbmFudCA9PT0gMCkge1xuICAgIHIxMyA9IHIgPCAwID8gLU1hdGgucG93KC1yLCAxLjAgLyAzLjApIDogTWF0aC5wb3cociwgMS4wIC8gMy4wKTtcbiAgICByZXN1bHRbMF0gPSAtdGVybTEgKyAyLjAgKiByMTM7XG4gICAgcmVzdWx0WzRdID0gcmVzdWx0WzJdID0gLShyMTMgKyB0ZXJtMSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcSA9IC1xO1xuICBkdW0xID0gcSAqIHEgKiBxO1xuICBkdW0xID0gTWF0aC5hY29zKHIgLyBNYXRoLnNxcnQoZHVtMSkpO1xuICByMTMgPSAyLjAgKiBNYXRoLnNxcnQocSk7XG4gIHJlc3VsdFswXSA9IC10ZXJtMSArIHIxMyAqIE1hdGguY29zKGR1bTEgLyAzLjApO1xuICByZXN1bHRbMl0gPSAtdGVybTEgKyByMTMgKiBNYXRoLmNvcygoZHVtMSArIDIuMCAqIE1hdGguUEkpIC8gMy4wKTtcbiAgcmVzdWx0WzRdID0gLXRlcm0xICsgcjEzICogTWF0aC5jb3MoKGR1bTEgKyA0LjAgKiBNYXRoLlBJKSAvIDMuMCk7XG4gIHJldHVybjtcbn07XG52YXIgc3FkaXN0VG9RdWFkcmF0aWNCZXppZXIgPSBmdW5jdGlvbiBzcWRpc3RUb1F1YWRyYXRpY0Jlemllcih4LCB5LCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKSB7XG4gIC8vIEZpbmQgbWluaW11bSBkaXN0YW5jZSBieSB1c2luZyB0aGUgbWluaW11bSBvZiB0aGUgZGlzdGFuY2VcbiAgLy8gZnVuY3Rpb24gYmV0d2VlbiB0aGUgZ2l2ZW4gcG9pbnQgYW5kIHRoZSBjdXJ2ZVxuICAvLyBUaGlzIGdpdmVzIHRoZSBjb2VmZmljaWVudHMgb2YgdGhlIHJlc3VsdGluZyBjdWJpYyBlcXVhdGlvblxuICAvLyB3aG9zZSByb290cyB0ZWxsIHVzIHdoZXJlIGEgcG9zc2libGUgbWluaW11bSBpc1xuICAvLyAoQ29lZmZpY2llbnRzIGFyZSBkaXZpZGVkIGJ5IDQpXG4gIHZhciBhID0gMS4wICogeDEgKiB4MSAtIDQgKiB4MSAqIHgyICsgMiAqIHgxICogeDMgKyA0ICogeDIgKiB4MiAtIDQgKiB4MiAqIHgzICsgeDMgKiB4MyArIHkxICogeTEgLSA0ICogeTEgKiB5MiArIDIgKiB5MSAqIHkzICsgNCAqIHkyICogeTIgLSA0ICogeTIgKiB5MyArIHkzICogeTM7XG4gIHZhciBiID0gMS4wICogOSAqIHgxICogeDIgLSAzICogeDEgKiB4MSAtIDMgKiB4MSAqIHgzIC0gNiAqIHgyICogeDIgKyAzICogeDIgKiB4MyArIDkgKiB5MSAqIHkyIC0gMyAqIHkxICogeTEgLSAzICogeTEgKiB5MyAtIDYgKiB5MiAqIHkyICsgMyAqIHkyICogeTM7XG4gIHZhciBjID0gMS4wICogMyAqIHgxICogeDEgLSA2ICogeDEgKiB4MiArIHgxICogeDMgLSB4MSAqIHggKyAyICogeDIgKiB4MiArIDIgKiB4MiAqIHggLSB4MyAqIHggKyAzICogeTEgKiB5MSAtIDYgKiB5MSAqIHkyICsgeTEgKiB5MyAtIHkxICogeSArIDIgKiB5MiAqIHkyICsgMiAqIHkyICogeSAtIHkzICogeTtcbiAgdmFyIGQgPSAxLjAgKiB4MSAqIHgyIC0geDEgKiB4MSArIHgxICogeCAtIHgyICogeCArIHkxICogeTIgLSB5MSAqIHkxICsgeTEgKiB5IC0geTIgKiB5OyAvLyBkZWJ1ZyhcImNvZWZmaWNpZW50czogXCIgKyBhIC8gYSArIFwiLCBcIiArIGIgLyBhICsgXCIsIFwiICsgYyAvIGEgKyBcIiwgXCIgKyBkIC8gYSk7XG5cbiAgdmFyIHJvb3RzID0gW107IC8vIFVzZSB0aGUgY3ViaWMgc29sdmluZyBhbGdvcml0aG1cblxuICBzb2x2ZUN1YmljKGEsIGIsIGMsIGQsIHJvb3RzKTtcbiAgdmFyIHplcm9UaHJlc2hvbGQgPSAwLjAwMDAwMDE7XG4gIHZhciBwYXJhbXMgPSBbXTtcblxuICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgNjsgaW5kZXggKz0gMikge1xuICAgIGlmIChNYXRoLmFicyhyb290c1tpbmRleCArIDFdKSA8IHplcm9UaHJlc2hvbGQgJiYgcm9vdHNbaW5kZXhdID49IDAgJiYgcm9vdHNbaW5kZXhdIDw9IDEuMCkge1xuICAgICAgcGFyYW1zLnB1c2gocm9vdHNbaW5kZXhdKTtcbiAgICB9XG4gIH1cblxuICBwYXJhbXMucHVzaCgxLjApO1xuICBwYXJhbXMucHVzaCgwLjApO1xuICB2YXIgbWluRGlzdGFuY2VTcXVhcmVkID0gLTE7XG4gIHZhciBjdXJYLCBjdXJZLCBkaXN0U3F1YXJlZDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgIGN1clggPSBNYXRoLnBvdygxLjAgLSBwYXJhbXNbaV0sIDIuMCkgKiB4MSArIDIuMCAqICgxIC0gcGFyYW1zW2ldKSAqIHBhcmFtc1tpXSAqIHgyICsgcGFyYW1zW2ldICogcGFyYW1zW2ldICogeDM7XG4gICAgY3VyWSA9IE1hdGgucG93KDEgLSBwYXJhbXNbaV0sIDIuMCkgKiB5MSArIDIgKiAoMS4wIC0gcGFyYW1zW2ldKSAqIHBhcmFtc1tpXSAqIHkyICsgcGFyYW1zW2ldICogcGFyYW1zW2ldICogeTM7XG4gICAgZGlzdFNxdWFyZWQgPSBNYXRoLnBvdyhjdXJYIC0geCwgMikgKyBNYXRoLnBvdyhjdXJZIC0geSwgMik7IC8vIGRlYnVnKCdkaXN0YW5jZSBmb3IgcGFyYW0gJyArIHBhcmFtc1tpXSArIFwiOiBcIiArIE1hdGguc3FydChkaXN0U3F1YXJlZCkpO1xuXG4gICAgaWYgKG1pbkRpc3RhbmNlU3F1YXJlZCA+PSAwKSB7XG4gICAgICBpZiAoZGlzdFNxdWFyZWQgPCBtaW5EaXN0YW5jZVNxdWFyZWQpIHtcbiAgICAgICAgbWluRGlzdGFuY2VTcXVhcmVkID0gZGlzdFNxdWFyZWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1pbkRpc3RhbmNlU3F1YXJlZCA9IGRpc3RTcXVhcmVkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtaW5EaXN0YW5jZVNxdWFyZWQ7XG59O1xudmFyIHNxZGlzdFRvRmluaXRlTGluZSA9IGZ1bmN0aW9uIHNxZGlzdFRvRmluaXRlTGluZSh4LCB5LCB4MSwgeTEsIHgyLCB5Mikge1xuICB2YXIgb2Zmc2V0ID0gW3ggLSB4MSwgeSAtIHkxXTtcbiAgdmFyIGxpbmUgPSBbeDIgLSB4MSwgeTIgLSB5MV07XG4gIHZhciBsaW5lU3EgPSBsaW5lWzBdICogbGluZVswXSArIGxpbmVbMV0gKiBsaW5lWzFdO1xuICB2YXIgaHlwU3EgPSBvZmZzZXRbMF0gKiBvZmZzZXRbMF0gKyBvZmZzZXRbMV0gKiBvZmZzZXRbMV07XG4gIHZhciBkb3RQcm9kdWN0ID0gb2Zmc2V0WzBdICogbGluZVswXSArIG9mZnNldFsxXSAqIGxpbmVbMV07XG4gIHZhciBhZGpTcSA9IGRvdFByb2R1Y3QgKiBkb3RQcm9kdWN0IC8gbGluZVNxO1xuXG4gIGlmIChkb3RQcm9kdWN0IDwgMCkge1xuICAgIHJldHVybiBoeXBTcTtcbiAgfVxuXG4gIGlmIChhZGpTcSA+IGxpbmVTcSkge1xuICAgIHJldHVybiAoeCAtIHgyKSAqICh4IC0geDIpICsgKHkgLSB5MikgKiAoeSAtIHkyKTtcbiAgfVxuXG4gIHJldHVybiBoeXBTcSAtIGFkalNxO1xufTtcbnZhciBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMgPSBmdW5jdGlvbiBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgcG9pbnRzKSB7XG4gIHZhciB4MSwgeTEsIHgyLCB5MjtcbiAgdmFyIHkzOyAvLyBJbnRlcnNlY3Qgd2l0aCB2ZXJ0aWNhbCBsaW5lIHRocm91Z2ggKHgsIHkpXG5cbiAgdmFyIHVwID0gMDsgLy8gbGV0IGRvd24gPSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aCAvIDI7IGkrKykge1xuICAgIHgxID0gcG9pbnRzW2kgKiAyXTtcbiAgICB5MSA9IHBvaW50c1tpICogMiArIDFdO1xuXG4gICAgaWYgKGkgKyAxIDwgcG9pbnRzLmxlbmd0aCAvIDIpIHtcbiAgICAgIHgyID0gcG9pbnRzWyhpICsgMSkgKiAyXTtcbiAgICAgIHkyID0gcG9pbnRzWyhpICsgMSkgKiAyICsgMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHgyID0gcG9pbnRzWyhpICsgMSAtIHBvaW50cy5sZW5ndGggLyAyKSAqIDJdO1xuICAgICAgeTIgPSBwb2ludHNbKGkgKyAxIC0gcG9pbnRzLmxlbmd0aCAvIDIpICogMiArIDFdO1xuICAgIH1cblxuICAgIGlmICh4MSA9PSB4ICYmIHgyID09IHgpIDsgZWxzZSBpZiAoeDEgPj0geCAmJiB4ID49IHgyIHx8IHgxIDw9IHggJiYgeCA8PSB4Mikge1xuICAgICAgeTMgPSAoeCAtIHgxKSAvICh4MiAtIHgxKSAqICh5MiAtIHkxKSArIHkxO1xuXG4gICAgICBpZiAoeTMgPiB5KSB7XG4gICAgICAgIHVwKys7XG4gICAgICB9IC8vIGlmKCB5MyA8IHkgKXtcbiAgICAgIC8vIGRvd24rKztcbiAgICAgIC8vIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gIH1cblxuICBpZiAodXAgJSAyID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xudmFyIHBvaW50SW5zaWRlUG9seWdvbiA9IGZ1bmN0aW9uIHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCBiYXNlUG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBkaXJlY3Rpb24sIHBhZGRpbmcpIHtcbiAgdmFyIHRyYW5zZm9ybWVkUG9pbnRzID0gbmV3IEFycmF5KGJhc2VQb2ludHMubGVuZ3RoKTsgLy8gR2l2ZXMgbmVnYXRpdmUgYW5nbGVcblxuICB2YXIgYW5nbGU7XG5cbiAgaWYgKGRpcmVjdGlvblswXSAhPSBudWxsKSB7XG4gICAgYW5nbGUgPSBNYXRoLmF0YW4oZGlyZWN0aW9uWzFdIC8gZGlyZWN0aW9uWzBdKTtcblxuICAgIGlmIChkaXJlY3Rpb25bMF0gPCAwKSB7XG4gICAgICBhbmdsZSA9IGFuZ2xlICsgTWF0aC5QSSAvIDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFuZ2xlID0gLWFuZ2xlIC0gTWF0aC5QSSAvIDI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGFuZ2xlID0gZGlyZWN0aW9uO1xuICB9XG5cbiAgdmFyIGNvcyA9IE1hdGguY29zKC1hbmdsZSk7XG4gIHZhciBzaW4gPSBNYXRoLnNpbigtYW5nbGUpOyAvLyAgICBjb25zb2xlLmxvZyhcImJhc2U6IFwiICsgYmFzZVBvaW50cyk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFuc2Zvcm1lZFBvaW50cy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICB0cmFuc2Zvcm1lZFBvaW50c1tpICogMl0gPSB3aWR0aCAvIDIgKiAoYmFzZVBvaW50c1tpICogMl0gKiBjb3MgLSBiYXNlUG9pbnRzW2kgKiAyICsgMV0gKiBzaW4pO1xuICAgIHRyYW5zZm9ybWVkUG9pbnRzW2kgKiAyICsgMV0gPSBoZWlnaHQgLyAyICogKGJhc2VQb2ludHNbaSAqIDIgKyAxXSAqIGNvcyArIGJhc2VQb2ludHNbaSAqIDJdICogc2luKTtcbiAgICB0cmFuc2Zvcm1lZFBvaW50c1tpICogMl0gKz0gY2VudGVyWDtcbiAgICB0cmFuc2Zvcm1lZFBvaW50c1tpICogMiArIDFdICs9IGNlbnRlclk7XG4gIH1cblxuICB2YXIgcG9pbnRzO1xuXG4gIGlmIChwYWRkaW5nID4gMCkge1xuICAgIHZhciBleHBhbmRlZExpbmVTZXQgPSBleHBhbmRQb2x5Z29uKHRyYW5zZm9ybWVkUG9pbnRzLCAtcGFkZGluZyk7XG4gICAgcG9pbnRzID0gam9pbkxpbmVzKGV4cGFuZGVkTGluZVNldCk7XG4gIH0gZWxzZSB7XG4gICAgcG9pbnRzID0gdHJhbnNmb3JtZWRQb2ludHM7XG4gIH1cblxuICByZXR1cm4gcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIHBvaW50cyk7XG59O1xudmFyIHBvaW50SW5zaWRlUm91bmRQb2x5Z29uID0gZnVuY3Rpb24gcG9pbnRJbnNpZGVSb3VuZFBvbHlnb24oeCwgeSwgYmFzZVBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCkge1xuICB2YXIgY3V0UG9seWdvblBvaW50cyA9IG5ldyBBcnJheShiYXNlUG9pbnRzLmxlbmd0aCk7XG4gIHZhciBoYWxmVyA9IHdpZHRoIC8gMjtcbiAgdmFyIGhhbGZIID0gaGVpZ2h0IC8gMjtcbiAgdmFyIGNvcm5lclJhZGl1cyA9IGdldFJvdW5kUG9seWdvblJhZGl1cyh3aWR0aCwgaGVpZ2h0KTtcbiAgdmFyIHNxdWFyZWRDb3JuZXJSYWRpdXMgPSBjb3JuZXJSYWRpdXMgKiBjb3JuZXJSYWRpdXM7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYXNlUG9pbnRzLmxlbmd0aCAvIDQ7IGkrKykge1xuICAgIHZhciBzb3VyY2VVdiA9IHZvaWQgMCxcbiAgICAgICAgZGVzdFV2ID0gdm9pZCAwO1xuXG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIHNvdXJjZVV2ID0gYmFzZVBvaW50cy5sZW5ndGggLSAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2VVdiA9IGkgKiA0IC0gMjtcbiAgICB9XG5cbiAgICBkZXN0VXYgPSBpICogNCArIDI7XG4gICAgdmFyIHB4ID0gY2VudGVyWCArIGhhbGZXICogYmFzZVBvaW50c1tpICogNF07XG4gICAgdmFyIHB5ID0gY2VudGVyWSArIGhhbGZIICogYmFzZVBvaW50c1tpICogNCArIDFdO1xuICAgIHZhciBjb3NUaGV0YSA9IC1iYXNlUG9pbnRzW3NvdXJjZVV2XSAqIGJhc2VQb2ludHNbZGVzdFV2XSAtIGJhc2VQb2ludHNbc291cmNlVXYgKyAxXSAqIGJhc2VQb2ludHNbZGVzdFV2ICsgMV07XG4gICAgdmFyIG9mZnNldCA9IGNvcm5lclJhZGl1cyAvIE1hdGgudGFuKE1hdGguYWNvcyhjb3NUaGV0YSkgLyAyKTtcbiAgICB2YXIgY3AweCA9IHB4IC0gb2Zmc2V0ICogYmFzZVBvaW50c1tzb3VyY2VVdl07XG4gICAgdmFyIGNwMHkgPSBweSAtIG9mZnNldCAqIGJhc2VQb2ludHNbc291cmNlVXYgKyAxXTtcbiAgICB2YXIgY3AxeCA9IHB4ICsgb2Zmc2V0ICogYmFzZVBvaW50c1tkZXN0VXZdO1xuICAgIHZhciBjcDF5ID0gcHkgKyBvZmZzZXQgKiBiYXNlUG9pbnRzW2Rlc3RVdiArIDFdO1xuICAgIGN1dFBvbHlnb25Qb2ludHNbaSAqIDRdID0gY3AweDtcbiAgICBjdXRQb2x5Z29uUG9pbnRzW2kgKiA0ICsgMV0gPSBjcDB5O1xuICAgIGN1dFBvbHlnb25Qb2ludHNbaSAqIDQgKyAyXSA9IGNwMXg7XG4gICAgY3V0UG9seWdvblBvaW50c1tpICogNCArIDNdID0gY3AxeTtcbiAgICB2YXIgb3J0aHggPSBiYXNlUG9pbnRzW3NvdXJjZVV2ICsgMV07XG4gICAgdmFyIG9ydGh5ID0gLWJhc2VQb2ludHNbc291cmNlVXZdO1xuICAgIHZhciBjb3NBbHBoYSA9IG9ydGh4ICogYmFzZVBvaW50c1tkZXN0VXZdICsgb3J0aHkgKiBiYXNlUG9pbnRzW2Rlc3RVdiArIDFdO1xuXG4gICAgaWYgKGNvc0FscGhhIDwgMCkge1xuICAgICAgb3J0aHggKj0gLTE7XG4gICAgICBvcnRoeSAqPSAtMTtcbiAgICB9XG5cbiAgICB2YXIgY3ggPSBjcDB4ICsgb3J0aHggKiBjb3JuZXJSYWRpdXM7XG4gICAgdmFyIGN5ID0gY3AweSArIG9ydGh5ICogY29ybmVyUmFkaXVzO1xuICAgIHZhciBzcXVhcmVkRGlzdGFuY2UgPSBNYXRoLnBvdyhjeCAtIHgsIDIpICsgTWF0aC5wb3coY3kgLSB5LCAyKTtcblxuICAgIGlmIChzcXVhcmVkRGlzdGFuY2UgPD0gc3F1YXJlZENvcm5lclJhZGl1cykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBjdXRQb2x5Z29uUG9pbnRzKTtcbn07XG52YXIgam9pbkxpbmVzID0gZnVuY3Rpb24gam9pbkxpbmVzKGxpbmVTZXQpIHtcbiAgdmFyIHZlcnRpY2VzID0gbmV3IEFycmF5KGxpbmVTZXQubGVuZ3RoIC8gMik7XG4gIHZhciBjdXJyZW50TGluZVN0YXJ0WCwgY3VycmVudExpbmVTdGFydFksIGN1cnJlbnRMaW5lRW5kWCwgY3VycmVudExpbmVFbmRZO1xuICB2YXIgbmV4dExpbmVTdGFydFgsIG5leHRMaW5lU3RhcnRZLCBuZXh0TGluZUVuZFgsIG5leHRMaW5lRW5kWTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVTZXQubGVuZ3RoIC8gNDsgaSsrKSB7XG4gICAgY3VycmVudExpbmVTdGFydFggPSBsaW5lU2V0W2kgKiA0XTtcbiAgICBjdXJyZW50TGluZVN0YXJ0WSA9IGxpbmVTZXRbaSAqIDQgKyAxXTtcbiAgICBjdXJyZW50TGluZUVuZFggPSBsaW5lU2V0W2kgKiA0ICsgMl07XG4gICAgY3VycmVudExpbmVFbmRZID0gbGluZVNldFtpICogNCArIDNdO1xuXG4gICAgaWYgKGkgPCBsaW5lU2V0Lmxlbmd0aCAvIDQgLSAxKSB7XG4gICAgICBuZXh0TGluZVN0YXJ0WCA9IGxpbmVTZXRbKGkgKyAxKSAqIDRdO1xuICAgICAgbmV4dExpbmVTdGFydFkgPSBsaW5lU2V0WyhpICsgMSkgKiA0ICsgMV07XG4gICAgICBuZXh0TGluZUVuZFggPSBsaW5lU2V0WyhpICsgMSkgKiA0ICsgMl07XG4gICAgICBuZXh0TGluZUVuZFkgPSBsaW5lU2V0WyhpICsgMSkgKiA0ICsgM107XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRMaW5lU3RhcnRYID0gbGluZVNldFswXTtcbiAgICAgIG5leHRMaW5lU3RhcnRZID0gbGluZVNldFsxXTtcbiAgICAgIG5leHRMaW5lRW5kWCA9IGxpbmVTZXRbMl07XG4gICAgICBuZXh0TGluZUVuZFkgPSBsaW5lU2V0WzNdO1xuICAgIH1cblxuICAgIHZhciBpbnRlcnNlY3Rpb24gPSBmaW5pdGVMaW5lc0ludGVyc2VjdChjdXJyZW50TGluZVN0YXJ0WCwgY3VycmVudExpbmVTdGFydFksIGN1cnJlbnRMaW5lRW5kWCwgY3VycmVudExpbmVFbmRZLCBuZXh0TGluZVN0YXJ0WCwgbmV4dExpbmVTdGFydFksIG5leHRMaW5lRW5kWCwgbmV4dExpbmVFbmRZLCB0cnVlKTtcbiAgICB2ZXJ0aWNlc1tpICogMl0gPSBpbnRlcnNlY3Rpb25bMF07XG4gICAgdmVydGljZXNbaSAqIDIgKyAxXSA9IGludGVyc2VjdGlvblsxXTtcbiAgfVxuXG4gIHJldHVybiB2ZXJ0aWNlcztcbn07XG52YXIgZXhwYW5kUG9seWdvbiA9IGZ1bmN0aW9uIGV4cGFuZFBvbHlnb24ocG9pbnRzLCBwYWQpIHtcbiAgdmFyIGV4cGFuZGVkTGluZVNldCA9IG5ldyBBcnJheShwb2ludHMubGVuZ3RoICogMik7XG4gIHZhciBjdXJyZW50UG9pbnRYLCBjdXJyZW50UG9pbnRZLCBuZXh0UG9pbnRYLCBuZXh0UG9pbnRZO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aCAvIDI7IGkrKykge1xuICAgIGN1cnJlbnRQb2ludFggPSBwb2ludHNbaSAqIDJdO1xuICAgIGN1cnJlbnRQb2ludFkgPSBwb2ludHNbaSAqIDIgKyAxXTtcblxuICAgIGlmIChpIDwgcG9pbnRzLmxlbmd0aCAvIDIgLSAxKSB7XG4gICAgICBuZXh0UG9pbnRYID0gcG9pbnRzWyhpICsgMSkgKiAyXTtcbiAgICAgIG5leHRQb2ludFkgPSBwb2ludHNbKGkgKyAxKSAqIDIgKyAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dFBvaW50WCA9IHBvaW50c1swXTtcbiAgICAgIG5leHRQb2ludFkgPSBwb2ludHNbMV07XG4gICAgfSAvLyBDdXJyZW50IGxpbmU6IFtjdXJyZW50UG9pbnRYLCBjdXJyZW50UG9pbnRZXSB0byBbbmV4dFBvaW50WCwgbmV4dFBvaW50WV1cbiAgICAvLyBBc3N1bWUgQ0NXIHBvbHlnb24gd2luZGluZ1xuXG5cbiAgICB2YXIgb2Zmc2V0WCA9IG5leHRQb2ludFkgLSBjdXJyZW50UG9pbnRZO1xuICAgIHZhciBvZmZzZXRZID0gLShuZXh0UG9pbnRYIC0gY3VycmVudFBvaW50WCk7IC8vIE5vcm1hbGl6ZVxuXG4gICAgdmFyIG9mZnNldExlbmd0aCA9IE1hdGguc3FydChvZmZzZXRYICogb2Zmc2V0WCArIG9mZnNldFkgKiBvZmZzZXRZKTtcbiAgICB2YXIgbm9ybWFsaXplZE9mZnNldFggPSBvZmZzZXRYIC8gb2Zmc2V0TGVuZ3RoO1xuICAgIHZhciBub3JtYWxpemVkT2Zmc2V0WSA9IG9mZnNldFkgLyBvZmZzZXRMZW5ndGg7XG4gICAgZXhwYW5kZWRMaW5lU2V0W2kgKiA0XSA9IGN1cnJlbnRQb2ludFggKyBub3JtYWxpemVkT2Zmc2V0WCAqIHBhZDtcbiAgICBleHBhbmRlZExpbmVTZXRbaSAqIDQgKyAxXSA9IGN1cnJlbnRQb2ludFkgKyBub3JtYWxpemVkT2Zmc2V0WSAqIHBhZDtcbiAgICBleHBhbmRlZExpbmVTZXRbaSAqIDQgKyAyXSA9IG5leHRQb2ludFggKyBub3JtYWxpemVkT2Zmc2V0WCAqIHBhZDtcbiAgICBleHBhbmRlZExpbmVTZXRbaSAqIDQgKyAzXSA9IG5leHRQb2ludFkgKyBub3JtYWxpemVkT2Zmc2V0WSAqIHBhZDtcbiAgfVxuXG4gIHJldHVybiBleHBhbmRlZExpbmVTZXQ7XG59O1xudmFyIGludGVyc2VjdExpbmVFbGxpcHNlID0gZnVuY3Rpb24gaW50ZXJzZWN0TGluZUVsbGlwc2UoeCwgeSwgY2VudGVyWCwgY2VudGVyWSwgZWxsaXBzZVdyYWRpdXMsIGVsbGlwc2VIcmFkaXVzKSB7XG4gIHZhciBkaXNwWCA9IGNlbnRlclggLSB4O1xuICB2YXIgZGlzcFkgPSBjZW50ZXJZIC0geTtcbiAgZGlzcFggLz0gZWxsaXBzZVdyYWRpdXM7XG4gIGRpc3BZIC89IGVsbGlwc2VIcmFkaXVzO1xuICB2YXIgbGVuID0gTWF0aC5zcXJ0KGRpc3BYICogZGlzcFggKyBkaXNwWSAqIGRpc3BZKTtcbiAgdmFyIG5ld0xlbmd0aCA9IGxlbiAtIDE7XG5cbiAgaWYgKG5ld0xlbmd0aCA8IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgbGVuUHJvcG9ydGlvbiA9IG5ld0xlbmd0aCAvIGxlbjtcbiAgcmV0dXJuIFsoY2VudGVyWCAtIHgpICogbGVuUHJvcG9ydGlvbiArIHgsIChjZW50ZXJZIC0geSkgKiBsZW5Qcm9wb3J0aW9uICsgeV07XG59O1xudmFyIGNoZWNrSW5FbGxpcHNlID0gZnVuY3Rpb24gY2hlY2tJbkVsbGlwc2UoeCwgeSwgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSwgcGFkZGluZykge1xuICB4IC09IGNlbnRlclg7XG4gIHkgLT0gY2VudGVyWTtcbiAgeCAvPSB3aWR0aCAvIDIgKyBwYWRkaW5nO1xuICB5IC89IGhlaWdodCAvIDIgKyBwYWRkaW5nO1xuICByZXR1cm4geCAqIHggKyB5ICogeSA8PSAxO1xufTsgLy8gUmV0dXJucyBpbnRlcnNlY3Rpb25zIG9mIGluY3JlYXNpbmcgZGlzdGFuY2UgZnJvbSBsaW5lJ3Mgc3RhcnQgcG9pbnRcblxudmFyIGludGVyc2VjdExpbmVDaXJjbGUgPSBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lQ2lyY2xlKHgxLCB5MSwgeDIsIHkyLCBjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXMpIHtcbiAgLy8gQ2FsY3VsYXRlIGQsIGRpcmVjdGlvbiB2ZWN0b3Igb2YgbGluZVxuICB2YXIgZCA9IFt4MiAtIHgxLCB5MiAtIHkxXTsgLy8gRGlyZWN0aW9uIHZlY3RvciBvZiBsaW5lXG5cbiAgdmFyIGYgPSBbeDEgLSBjZW50ZXJYLCB5MSAtIGNlbnRlclldO1xuICB2YXIgYSA9IGRbMF0gKiBkWzBdICsgZFsxXSAqIGRbMV07XG4gIHZhciBiID0gMiAqIChmWzBdICogZFswXSArIGZbMV0gKiBkWzFdKTtcbiAgdmFyIGMgPSBmWzBdICogZlswXSArIGZbMV0gKiBmWzFdIC0gcmFkaXVzICogcmFkaXVzO1xuICB2YXIgZGlzY3JpbWluYW50ID0gYiAqIGIgLSA0ICogYSAqIGM7XG5cbiAgaWYgKGRpc2NyaW1pbmFudCA8IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgdDEgPSAoLWIgKyBNYXRoLnNxcnQoZGlzY3JpbWluYW50KSkgLyAoMiAqIGEpO1xuICB2YXIgdDIgPSAoLWIgLSBNYXRoLnNxcnQoZGlzY3JpbWluYW50KSkgLyAoMiAqIGEpO1xuICB2YXIgdE1pbiA9IE1hdGgubWluKHQxLCB0Mik7XG4gIHZhciB0TWF4ID0gTWF0aC5tYXgodDEsIHQyKTtcbiAgdmFyIGluUmFuZ2VQYXJhbXMgPSBbXTtcblxuICBpZiAodE1pbiA+PSAwICYmIHRNaW4gPD0gMSkge1xuICAgIGluUmFuZ2VQYXJhbXMucHVzaCh0TWluKTtcbiAgfVxuXG4gIGlmICh0TWF4ID49IDAgJiYgdE1heCA8PSAxKSB7XG4gICAgaW5SYW5nZVBhcmFtcy5wdXNoKHRNYXgpO1xuICB9XG5cbiAgaWYgKGluUmFuZ2VQYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIG5lYXJJbnRlcnNlY3Rpb25YID0gaW5SYW5nZVBhcmFtc1swXSAqIGRbMF0gKyB4MTtcbiAgdmFyIG5lYXJJbnRlcnNlY3Rpb25ZID0gaW5SYW5nZVBhcmFtc1swXSAqIGRbMV0gKyB5MTtcblxuICBpZiAoaW5SYW5nZVBhcmFtcy5sZW5ndGggPiAxKSB7XG4gICAgaWYgKGluUmFuZ2VQYXJhbXNbMF0gPT0gaW5SYW5nZVBhcmFtc1sxXSkge1xuICAgICAgcmV0dXJuIFtuZWFySW50ZXJzZWN0aW9uWCwgbmVhckludGVyc2VjdGlvblldO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZmFySW50ZXJzZWN0aW9uWCA9IGluUmFuZ2VQYXJhbXNbMV0gKiBkWzBdICsgeDE7XG4gICAgICB2YXIgZmFySW50ZXJzZWN0aW9uWSA9IGluUmFuZ2VQYXJhbXNbMV0gKiBkWzFdICsgeTE7XG4gICAgICByZXR1cm4gW25lYXJJbnRlcnNlY3Rpb25YLCBuZWFySW50ZXJzZWN0aW9uWSwgZmFySW50ZXJzZWN0aW9uWCwgZmFySW50ZXJzZWN0aW9uWV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBbbmVhckludGVyc2VjdGlvblgsIG5lYXJJbnRlcnNlY3Rpb25ZXTtcbiAgfVxufTtcbnZhciBtaWRPZlRocmVlID0gZnVuY3Rpb24gbWlkT2ZUaHJlZShhLCBiLCBjKSB7XG4gIGlmIChiIDw9IGEgJiYgYSA8PSBjIHx8IGMgPD0gYSAmJiBhIDw9IGIpIHtcbiAgICByZXR1cm4gYTtcbiAgfSBlbHNlIGlmIChhIDw9IGIgJiYgYiA8PSBjIHx8IGMgPD0gYiAmJiBiIDw9IGEpIHtcbiAgICByZXR1cm4gYjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYztcbiAgfVxufTsgLy8gKHgxLHkxKT0+KHgyLHkyKSBpbnRlcnNlY3Qgd2l0aCAoeDMseTMpPT4oeDQseTQpXG5cbnZhciBmaW5pdGVMaW5lc0ludGVyc2VjdCA9IGZ1bmN0aW9uIGZpbml0ZUxpbmVzSW50ZXJzZWN0KHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NCwgaW5maW5pdGVMaW5lcykge1xuICB2YXIgZHgxMyA9IHgxIC0geDM7XG4gIHZhciBkeDIxID0geDIgLSB4MTtcbiAgdmFyIGR4NDMgPSB4NCAtIHgzO1xuICB2YXIgZHkxMyA9IHkxIC0geTM7XG4gIHZhciBkeTIxID0geTIgLSB5MTtcbiAgdmFyIGR5NDMgPSB5NCAtIHkzO1xuICB2YXIgdWFfdCA9IGR4NDMgKiBkeTEzIC0gZHk0MyAqIGR4MTM7XG4gIHZhciB1Yl90ID0gZHgyMSAqIGR5MTMgLSBkeTIxICogZHgxMztcbiAgdmFyIHVfYiA9IGR5NDMgKiBkeDIxIC0gZHg0MyAqIGR5MjE7XG5cbiAgaWYgKHVfYiAhPT0gMCkge1xuICAgIHZhciB1YSA9IHVhX3QgLyB1X2I7XG4gICAgdmFyIHViID0gdWJfdCAvIHVfYjtcbiAgICB2YXIgZmxwdFRocmVzaG9sZCA9IDAuMDAxO1xuXG4gICAgdmFyIF9taW4gPSAwIC0gZmxwdFRocmVzaG9sZDtcblxuICAgIHZhciBfbWF4ID0gMSArIGZscHRUaHJlc2hvbGQ7XG5cbiAgICBpZiAoX21pbiA8PSB1YSAmJiB1YSA8PSBfbWF4ICYmIF9taW4gPD0gdWIgJiYgdWIgPD0gX21heCkge1xuICAgICAgcmV0dXJuIFt4MSArIHVhICogZHgyMSwgeTEgKyB1YSAqIGR5MjFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWluZmluaXRlTGluZXMpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFt4MSArIHVhICogZHgyMSwgeTEgKyB1YSAqIGR5MjFdO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAodWFfdCA9PT0gMCB8fCB1Yl90ID09PSAwKSB7XG4gICAgICAvLyBQYXJhbGxlbCwgY29pbmNpZGVudCBsaW5lcy4gQ2hlY2sgaWYgb3ZlcmxhcFxuICAgICAgLy8gQ2hlY2sgZW5kcG9pbnQgb2Ygc2Vjb25kIGxpbmVcbiAgICAgIGlmIChtaWRPZlRocmVlKHgxLCB4MiwgeDQpID09PSB4NCkge1xuICAgICAgICByZXR1cm4gW3g0LCB5NF07XG4gICAgICB9IC8vIENoZWNrIHN0YXJ0IHBvaW50IG9mIHNlY29uZCBsaW5lXG5cblxuICAgICAgaWYgKG1pZE9mVGhyZWUoeDEsIHgyLCB4MykgPT09IHgzKSB7XG4gICAgICAgIHJldHVybiBbeDMsIHkzXTtcbiAgICAgIH0gLy8gRW5kcG9pbnQgb2YgZmlyc3QgbGluZVxuXG5cbiAgICAgIGlmIChtaWRPZlRocmVlKHgzLCB4NCwgeDIpID09PSB4Mikge1xuICAgICAgICByZXR1cm4gW3gyLCB5Ml07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUGFyYWxsZWwsIG5vbi1jb2luY2lkZW50XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG59OyAvLyBtYXRoLnBvbHlnb25JbnRlcnNlY3RMaW5lKCB4LCB5LCBiYXNlUG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nIClcbi8vIGludGVyc2VjdCBhIG5vZGUgcG9seWdvbiAocHRzIHRyYW5zZm9ybWVkKVxuLy9cbi8vIG1hdGgucG9seWdvbkludGVyc2VjdExpbmUoIHgsIHksIGJhc2VQb2ludHMsIGNlbnRlclgsIGNlbnRlclkgKVxuLy8gaW50ZXJzZWN0IHRoZSBwb2ludHMgKG5vIHRyYW5zZm9ybSlcblxudmFyIHBvbHlnb25JbnRlcnNlY3RMaW5lID0gZnVuY3Rpb24gcG9seWdvbkludGVyc2VjdExpbmUoeCwgeSwgYmFzZVBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZykge1xuICB2YXIgaW50ZXJzZWN0aW9ucyA9IFtdO1xuICB2YXIgaW50ZXJzZWN0aW9uO1xuICB2YXIgdHJhbnNmb3JtZWRQb2ludHMgPSBuZXcgQXJyYXkoYmFzZVBvaW50cy5sZW5ndGgpO1xuICB2YXIgZG9UcmFuc2Zvcm0gPSB0cnVlO1xuXG4gIGlmICh3aWR0aCA9PSBudWxsKSB7XG4gICAgZG9UcmFuc2Zvcm0gPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBwb2ludHM7XG5cbiAgaWYgKGRvVHJhbnNmb3JtKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFuc2Zvcm1lZFBvaW50cy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICAgIHRyYW5zZm9ybWVkUG9pbnRzW2kgKiAyXSA9IGJhc2VQb2ludHNbaSAqIDJdICogd2lkdGggKyBjZW50ZXJYO1xuICAgICAgdHJhbnNmb3JtZWRQb2ludHNbaSAqIDIgKyAxXSA9IGJhc2VQb2ludHNbaSAqIDIgKyAxXSAqIGhlaWdodCArIGNlbnRlclk7XG4gICAgfVxuXG4gICAgaWYgKHBhZGRpbmcgPiAwKSB7XG4gICAgICB2YXIgZXhwYW5kZWRMaW5lU2V0ID0gZXhwYW5kUG9seWdvbih0cmFuc2Zvcm1lZFBvaW50cywgLXBhZGRpbmcpO1xuICAgICAgcG9pbnRzID0gam9pbkxpbmVzKGV4cGFuZGVkTGluZVNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvaW50cyA9IHRyYW5zZm9ybWVkUG9pbnRzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBwb2ludHMgPSBiYXNlUG9pbnRzO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRYLCBjdXJyZW50WSwgbmV4dFgsIG5leHRZO1xuXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHBvaW50cy5sZW5ndGggLyAyOyBfaTIrKykge1xuICAgIGN1cnJlbnRYID0gcG9pbnRzW19pMiAqIDJdO1xuICAgIGN1cnJlbnRZID0gcG9pbnRzW19pMiAqIDIgKyAxXTtcblxuICAgIGlmIChfaTIgPCBwb2ludHMubGVuZ3RoIC8gMiAtIDEpIHtcbiAgICAgIG5leHRYID0gcG9pbnRzWyhfaTIgKyAxKSAqIDJdO1xuICAgICAgbmV4dFkgPSBwb2ludHNbKF9pMiArIDEpICogMiArIDFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0WCA9IHBvaW50c1swXTtcbiAgICAgIG5leHRZID0gcG9pbnRzWzFdO1xuICAgIH1cblxuICAgIGludGVyc2VjdGlvbiA9IGZpbml0ZUxpbmVzSW50ZXJzZWN0KHgsIHksIGNlbnRlclgsIGNlbnRlclksIGN1cnJlbnRYLCBjdXJyZW50WSwgbmV4dFgsIG5leHRZKTtcblxuICAgIGlmIChpbnRlcnNlY3Rpb24ubGVuZ3RoICE9PSAwKSB7XG4gICAgICBpbnRlcnNlY3Rpb25zLnB1c2goaW50ZXJzZWN0aW9uWzBdLCBpbnRlcnNlY3Rpb25bMV0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbnRlcnNlY3Rpb25zO1xufTtcbnZhciByb3VuZFBvbHlnb25JbnRlcnNlY3RMaW5lID0gZnVuY3Rpb24gcm91bmRQb2x5Z29uSW50ZXJzZWN0TGluZSh4LCB5LCBiYXNlUG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nKSB7XG4gIHZhciBpbnRlcnNlY3Rpb25zID0gW107XG4gIHZhciBpbnRlcnNlY3Rpb247XG4gIHZhciBsaW5lcyA9IG5ldyBBcnJheShiYXNlUG9pbnRzLmxlbmd0aCk7XG4gIHZhciBoYWxmVyA9IHdpZHRoIC8gMjtcbiAgdmFyIGhhbGZIID0gaGVpZ2h0IC8gMjtcbiAgdmFyIGNvcm5lclJhZGl1cyA9IGdldFJvdW5kUG9seWdvblJhZGl1cyh3aWR0aCwgaGVpZ2h0KTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGJhc2VQb2ludHMubGVuZ3RoIC8gNDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZVV2ID0gdm9pZCAwLFxuICAgICAgICBkZXN0VXYgPSB2b2lkIDA7XG5cbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgc291cmNlVXYgPSBiYXNlUG9pbnRzLmxlbmd0aCAtIDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvdXJjZVV2ID0gaSAqIDQgLSAyO1xuICAgIH1cblxuICAgIGRlc3RVdiA9IGkgKiA0ICsgMjtcbiAgICB2YXIgcHggPSBjZW50ZXJYICsgaGFsZlcgKiBiYXNlUG9pbnRzW2kgKiA0XTtcbiAgICB2YXIgcHkgPSBjZW50ZXJZICsgaGFsZkggKiBiYXNlUG9pbnRzW2kgKiA0ICsgMV07XG4gICAgdmFyIGNvc1RoZXRhID0gLWJhc2VQb2ludHNbc291cmNlVXZdICogYmFzZVBvaW50c1tkZXN0VXZdIC0gYmFzZVBvaW50c1tzb3VyY2VVdiArIDFdICogYmFzZVBvaW50c1tkZXN0VXYgKyAxXTtcbiAgICB2YXIgb2Zmc2V0ID0gY29ybmVyUmFkaXVzIC8gTWF0aC50YW4oTWF0aC5hY29zKGNvc1RoZXRhKSAvIDIpO1xuICAgIHZhciBjcDB4ID0gcHggLSBvZmZzZXQgKiBiYXNlUG9pbnRzW3NvdXJjZVV2XTtcbiAgICB2YXIgY3AweSA9IHB5IC0gb2Zmc2V0ICogYmFzZVBvaW50c1tzb3VyY2VVdiArIDFdO1xuICAgIHZhciBjcDF4ID0gcHggKyBvZmZzZXQgKiBiYXNlUG9pbnRzW2Rlc3RVdl07XG4gICAgdmFyIGNwMXkgPSBweSArIG9mZnNldCAqIGJhc2VQb2ludHNbZGVzdFV2ICsgMV07XG5cbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgbGluZXNbYmFzZVBvaW50cy5sZW5ndGggLSAyXSA9IGNwMHg7XG4gICAgICBsaW5lc1tiYXNlUG9pbnRzLmxlbmd0aCAtIDFdID0gY3AweTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXNbaSAqIDQgLSAyXSA9IGNwMHg7XG4gICAgICBsaW5lc1tpICogNCAtIDFdID0gY3AweTtcbiAgICB9XG5cbiAgICBsaW5lc1tpICogNF0gPSBjcDF4O1xuICAgIGxpbmVzW2kgKiA0ICsgMV0gPSBjcDF5O1xuICAgIHZhciBvcnRoeCA9IGJhc2VQb2ludHNbc291cmNlVXYgKyAxXTtcbiAgICB2YXIgb3J0aHkgPSAtYmFzZVBvaW50c1tzb3VyY2VVdl07XG4gICAgdmFyIGNvc0FscGhhID0gb3J0aHggKiBiYXNlUG9pbnRzW2Rlc3RVdl0gKyBvcnRoeSAqIGJhc2VQb2ludHNbZGVzdFV2ICsgMV07XG5cbiAgICBpZiAoY29zQWxwaGEgPCAwKSB7XG4gICAgICBvcnRoeCAqPSAtMTtcbiAgICAgIG9ydGh5ICo9IC0xO1xuICAgIH1cblxuICAgIHZhciBjeCA9IGNwMHggKyBvcnRoeCAqIGNvcm5lclJhZGl1cztcbiAgICB2YXIgY3kgPSBjcDB5ICsgb3J0aHkgKiBjb3JuZXJSYWRpdXM7XG4gICAgaW50ZXJzZWN0aW9uID0gaW50ZXJzZWN0TGluZUNpcmNsZSh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLCBjeCwgY3ksIGNvcm5lclJhZGl1cyk7XG5cbiAgICBpZiAoaW50ZXJzZWN0aW9uLmxlbmd0aCAhPT0gMCkge1xuICAgICAgaW50ZXJzZWN0aW9ucy5wdXNoKGludGVyc2VjdGlvblswXSwgaW50ZXJzZWN0aW9uWzFdKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBsaW5lcy5sZW5ndGggLyA0OyBfaTMrKykge1xuICAgIGludGVyc2VjdGlvbiA9IGZpbml0ZUxpbmVzSW50ZXJzZWN0KHgsIHksIGNlbnRlclgsIGNlbnRlclksIGxpbmVzW19pMyAqIDRdLCBsaW5lc1tfaTMgKiA0ICsgMV0sIGxpbmVzW19pMyAqIDQgKyAyXSwgbGluZXNbX2kzICogNCArIDNdLCBmYWxzZSk7XG5cbiAgICBpZiAoaW50ZXJzZWN0aW9uLmxlbmd0aCAhPT0gMCkge1xuICAgICAgaW50ZXJzZWN0aW9ucy5wdXNoKGludGVyc2VjdGlvblswXSwgaW50ZXJzZWN0aW9uWzFdKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaW50ZXJzZWN0aW9ucy5sZW5ndGggPiAyKSB7XG4gICAgdmFyIGxvd2VzdEludGVyc2VjdGlvbiA9IFtpbnRlcnNlY3Rpb25zWzBdLCBpbnRlcnNlY3Rpb25zWzFdXTtcbiAgICB2YXIgbG93ZXN0U3F1YXJlZERpc3RhbmNlID0gTWF0aC5wb3cobG93ZXN0SW50ZXJzZWN0aW9uWzBdIC0geCwgMikgKyBNYXRoLnBvdyhsb3dlc3RJbnRlcnNlY3Rpb25bMV0gLSB5LCAyKTtcblxuICAgIGZvciAodmFyIF9pNCA9IDE7IF9pNCA8IGludGVyc2VjdGlvbnMubGVuZ3RoIC8gMjsgX2k0KyspIHtcbiAgICAgIHZhciBzcXVhcmVkRGlzdGFuY2UgPSBNYXRoLnBvdyhpbnRlcnNlY3Rpb25zW19pNCAqIDJdIC0geCwgMikgKyBNYXRoLnBvdyhpbnRlcnNlY3Rpb25zW19pNCAqIDIgKyAxXSAtIHksIDIpO1xuXG4gICAgICBpZiAoc3F1YXJlZERpc3RhbmNlIDw9IGxvd2VzdFNxdWFyZWREaXN0YW5jZSkge1xuICAgICAgICBsb3dlc3RJbnRlcnNlY3Rpb25bMF0gPSBpbnRlcnNlY3Rpb25zW19pNCAqIDJdO1xuICAgICAgICBsb3dlc3RJbnRlcnNlY3Rpb25bMV0gPSBpbnRlcnNlY3Rpb25zW19pNCAqIDIgKyAxXTtcbiAgICAgICAgbG93ZXN0U3F1YXJlZERpc3RhbmNlID0gc3F1YXJlZERpc3RhbmNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsb3dlc3RJbnRlcnNlY3Rpb247XG4gIH1cblxuICByZXR1cm4gaW50ZXJzZWN0aW9ucztcbn07XG52YXIgc2hvcnRlbkludGVyc2VjdGlvbiA9IGZ1bmN0aW9uIHNob3J0ZW5JbnRlcnNlY3Rpb24oaW50ZXJzZWN0aW9uLCBvZmZzZXQsIGFtb3VudCkge1xuICB2YXIgZGlzcCA9IFtpbnRlcnNlY3Rpb25bMF0gLSBvZmZzZXRbMF0sIGludGVyc2VjdGlvblsxXSAtIG9mZnNldFsxXV07XG4gIHZhciBsZW5ndGggPSBNYXRoLnNxcnQoZGlzcFswXSAqIGRpc3BbMF0gKyBkaXNwWzFdICogZGlzcFsxXSk7XG4gIHZhciBsZW5SYXRpbyA9IChsZW5ndGggLSBhbW91bnQpIC8gbGVuZ3RoO1xuXG4gIGlmIChsZW5SYXRpbyA8IDApIHtcbiAgICBsZW5SYXRpbyA9IDAuMDAwMDE7XG4gIH1cblxuICByZXR1cm4gW29mZnNldFswXSArIGxlblJhdGlvICogZGlzcFswXSwgb2Zmc2V0WzFdICsgbGVuUmF0aW8gKiBkaXNwWzFdXTtcbn07XG52YXIgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlID0gZnVuY3Rpb24gZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKHNpZGVzLCByb3RhdGlvblJhZGlhbnMpIHtcbiAgdmFyIHBvaW50cyA9IGdlbmVyYXRlVW5pdE5nb25Qb2ludHMoc2lkZXMsIHJvdGF0aW9uUmFkaWFucyk7XG4gIHBvaW50cyA9IGZpdFBvbHlnb25Ub1NxdWFyZShwb2ludHMpO1xuICByZXR1cm4gcG9pbnRzO1xufTtcbnZhciBmaXRQb2x5Z29uVG9TcXVhcmUgPSBmdW5jdGlvbiBmaXRQb2x5Z29uVG9TcXVhcmUocG9pbnRzKSB7XG4gIHZhciB4LCB5O1xuICB2YXIgc2lkZXMgPSBwb2ludHMubGVuZ3RoIC8gMjtcbiAgdmFyIG1pblggPSBJbmZpbml0eSxcbiAgICAgIG1pblkgPSBJbmZpbml0eSxcbiAgICAgIG1heFggPSAtSW5maW5pdHksXG4gICAgICBtYXhZID0gLUluZmluaXR5O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2lkZXM7IGkrKykge1xuICAgIHggPSBwb2ludHNbMiAqIGldO1xuICAgIHkgPSBwb2ludHNbMiAqIGkgKyAxXTtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeCk7XG4gICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHgpO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5KTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSk7XG4gIH0gLy8gc3RyZXRjaCBmYWN0b3JzXG5cblxuICB2YXIgc3ggPSAyIC8gKG1heFggLSBtaW5YKTtcbiAgdmFyIHN5ID0gMiAvIChtYXhZIC0gbWluWSk7XG5cbiAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgc2lkZXM7IF9pNSsrKSB7XG4gICAgeCA9IHBvaW50c1syICogX2k1XSA9IHBvaW50c1syICogX2k1XSAqIHN4O1xuICAgIHkgPSBwb2ludHNbMiAqIF9pNSArIDFdID0gcG9pbnRzWzIgKiBfaTUgKyAxXSAqIHN5O1xuICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCB4KTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgeCk7XG4gICAgbWluWSA9IE1hdGgubWluKG1pblksIHkpO1xuICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCB5KTtcbiAgfVxuXG4gIGlmIChtaW5ZIDwgLTEpIHtcbiAgICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBzaWRlczsgX2k2KyspIHtcbiAgICAgIHkgPSBwb2ludHNbMiAqIF9pNiArIDFdID0gcG9pbnRzWzIgKiBfaTYgKyAxXSArICgtMSAtIG1pblkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwb2ludHM7XG59O1xudmFyIGdlbmVyYXRlVW5pdE5nb25Qb2ludHMgPSBmdW5jdGlvbiBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzKHNpZGVzLCByb3RhdGlvblJhZGlhbnMpIHtcbiAgdmFyIGluY3JlbWVudCA9IDEuMCAvIHNpZGVzICogMiAqIE1hdGguUEk7XG4gIHZhciBzdGFydEFuZ2xlID0gc2lkZXMgJSAyID09PSAwID8gTWF0aC5QSSAvIDIuMCArIGluY3JlbWVudCAvIDIuMCA6IE1hdGguUEkgLyAyLjA7XG4gIHN0YXJ0QW5nbGUgKz0gcm90YXRpb25SYWRpYW5zO1xuICB2YXIgcG9pbnRzID0gbmV3IEFycmF5KHNpZGVzICogMik7XG4gIHZhciBjdXJyZW50QW5nbGU7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWRlczsgaSsrKSB7XG4gICAgY3VycmVudEFuZ2xlID0gaSAqIGluY3JlbWVudCArIHN0YXJ0QW5nbGU7XG4gICAgcG9pbnRzWzIgKiBpXSA9IE1hdGguY29zKGN1cnJlbnRBbmdsZSk7IC8vIHhcblxuICAgIHBvaW50c1syICogaSArIDFdID0gTWF0aC5zaW4oLWN1cnJlbnRBbmdsZSk7IC8vIHlcbiAgfVxuXG4gIHJldHVybiBwb2ludHM7XG59OyAvLyBTZXQgdGhlIGRlZmF1bHQgcmFkaXVzLCB1bmxlc3MgaGFsZiBvZiB3aWR0aCBvciBoZWlnaHQgaXMgc21hbGxlciB0aGFuIGRlZmF1bHRcblxudmFyIGdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzID0gZnVuY3Rpb24gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCkge1xuICByZXR1cm4gTWF0aC5taW4od2lkdGggLyA0LCBoZWlnaHQgLyA0LCA4KTtcbn07IC8vIFNldCB0aGUgZGVmYXVsdCByYWRpdXNcblxudmFyIGdldFJvdW5kUG9seWdvblJhZGl1cyA9IGZ1bmN0aW9uIGdldFJvdW5kUG9seWdvblJhZGl1cyh3aWR0aCwgaGVpZ2h0KSB7XG4gIHJldHVybiBNYXRoLm1pbih3aWR0aCAvIDEwLCBoZWlnaHQgLyAxMCwgOCk7XG59O1xudmFyIGdldEN1dFJlY3RhbmdsZUNvcm5lckxlbmd0aCA9IGZ1bmN0aW9uIGdldEN1dFJlY3RhbmdsZUNvcm5lckxlbmd0aCgpIHtcbiAgcmV0dXJuIDg7XG59O1xudmFyIGJlemllclB0c1RvUXVhZENvZWZmID0gZnVuY3Rpb24gYmV6aWVyUHRzVG9RdWFkQ29lZmYocDAsIHAxLCBwMikge1xuICByZXR1cm4gW3AwIC0gMiAqIHAxICsgcDIsIDIgKiAocDEgLSBwMCksIHAwXTtcbn07IC8vIGdldCBjdXJ2ZSB3aWR0aCwgaGVpZ2h0LCBhbmQgY29udHJvbCBwb2ludCBwb3NpdGlvbiBvZmZzZXRzIGFzIGEgcGVyY2VudGFnZSBvZiBub2RlIGhlaWdodCAvIHdpZHRoXG5cbnZhciBnZXRCYXJyZWxDdXJ2ZUNvbnN0YW50cyA9IGZ1bmN0aW9uIGdldEJhcnJlbEN1cnZlQ29uc3RhbnRzKHdpZHRoLCBoZWlnaHQpIHtcbiAgcmV0dXJuIHtcbiAgICBoZWlnaHRPZmZzZXQ6IE1hdGgubWluKDE1LCAwLjA1ICogaGVpZ2h0KSxcbiAgICB3aWR0aE9mZnNldDogTWF0aC5taW4oMTAwLCAwLjI1ICogd2lkdGgpLFxuICAgIGN0cmxQdE9mZnNldFBjdDogMC4wNVxuICB9O1xufTtcblxudmFyIHBhZ2VSYW5rRGVmYXVsdHMgPSBkZWZhdWx0cyRnKHtcbiAgZGFtcGluZ0ZhY3RvcjogMC44LFxuICBwcmVjaXNpb246IDAuMDAwMDAxLFxuICBpdGVyYXRpb25zOiAyMDAsXG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxufSk7XG52YXIgZWxlc2ZuJG8gPSB7XG4gIHBhZ2VSYW5rOiBmdW5jdGlvbiBwYWdlUmFuayhvcHRpb25zKSB7XG4gICAgdmFyIF9wYWdlUmFua0RlZmF1bHRzID0gcGFnZVJhbmtEZWZhdWx0cyhvcHRpb25zKSxcbiAgICAgICAgZGFtcGluZ0ZhY3RvciA9IF9wYWdlUmFua0RlZmF1bHRzLmRhbXBpbmdGYWN0b3IsXG4gICAgICAgIHByZWNpc2lvbiA9IF9wYWdlUmFua0RlZmF1bHRzLnByZWNpc2lvbixcbiAgICAgICAgaXRlcmF0aW9ucyA9IF9wYWdlUmFua0RlZmF1bHRzLml0ZXJhdGlvbnMsXG4gICAgICAgIHdlaWdodCA9IF9wYWdlUmFua0RlZmF1bHRzLndlaWdodDtcblxuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG5cbiAgICB2YXIgX3RoaXMkYnlHcm91cCA9IHRoaXMuYnlHcm91cCgpLFxuICAgICAgICBub2RlcyA9IF90aGlzJGJ5R3JvdXAubm9kZXMsXG4gICAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcztcblxuICAgIHZhciBudW1Ob2RlcyA9IG5vZGVzLmxlbmd0aDtcbiAgICB2YXIgbnVtTm9kZXNTcWQgPSBudW1Ob2RlcyAqIG51bU5vZGVzO1xuICAgIHZhciBudW1FZGdlcyA9IGVkZ2VzLmxlbmd0aDsgLy8gQ29uc3RydWN0IHRyYW5zcG9zZWQgYWRqYWNlbmN5IG1hdHJpeFxuICAgIC8vIEZpcnN0IGxldHMgaGF2ZSBhIHplcm9lZCBtYXRyaXggb2YgdGhlIHJpZ2h0IHNpemVcbiAgICAvLyBXZSdsbCBhbHNvIGtlZXAgdHJhY2sgb2YgdGhlIHN1bSBvZiBlYWNoIGNvbHVtblxuXG4gICAgdmFyIG1hdHJpeCA9IG5ldyBBcnJheShudW1Ob2Rlc1NxZCk7XG4gICAgdmFyIGNvbHVtblN1bSA9IG5ldyBBcnJheShudW1Ob2Rlcyk7XG4gICAgdmFyIGFkZGl0aW9uYWxQcm9iID0gKDEgLSBkYW1waW5nRmFjdG9yKSAvIG51bU5vZGVzOyAvLyBDcmVhdGUgbnVsbCBtYXRyaXhcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTm9kZXM7IGkrKykge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBudW1Ob2RlczsgaisrKSB7XG4gICAgICAgIHZhciBuID0gaSAqIG51bU5vZGVzICsgajtcbiAgICAgICAgbWF0cml4W25dID0gMDtcbiAgICAgIH1cblxuICAgICAgY29sdW1uU3VtW2ldID0gMDtcbiAgICB9IC8vIE5vdywgcHJvY2VzcyBlZGdlc1xuXG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbnVtRWRnZXM7IF9pKyspIHtcbiAgICAgIHZhciBlZGdlID0gZWRnZXNbX2ldO1xuICAgICAgdmFyIHNyY0lkID0gZWRnZS5kYXRhKCdzb3VyY2UnKTtcbiAgICAgIHZhciB0Z3RJZCA9IGVkZ2UuZGF0YSgndGFyZ2V0Jyk7IC8vIERvbid0IGluY2x1ZGUgbG9vcHMgaW4gdGhlIG1hdHJpeFxuXG4gICAgICBpZiAoc3JjSWQgPT09IHRndElkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcyA9IG5vZGVzLmluZGV4T2ZJZChzcmNJZCk7XG4gICAgICB2YXIgdCA9IG5vZGVzLmluZGV4T2ZJZCh0Z3RJZCk7XG4gICAgICB2YXIgdyA9IHdlaWdodChlZGdlKTtcblxuICAgICAgdmFyIF9uID0gdCAqIG51bU5vZGVzICsgczsgLy8gVXBkYXRlIG1hdHJpeFxuXG5cbiAgICAgIG1hdHJpeFtfbl0gKz0gdzsgLy8gVXBkYXRlIGNvbHVtbiBzdW1cblxuICAgICAgY29sdW1uU3VtW3NdICs9IHc7XG4gICAgfSAvLyBBZGQgYWRkaXRpb25hbCBwcm9iYWJpbGl0eSBiYXNlZCBvbiBkYW1waW5nIGZhY3RvclxuICAgIC8vIEFsc28sIHRha2UgaW50byBhY2NvdW50IGNvbHVtbnMgdGhhdCBoYXZlIHN1bSA9IDBcblxuXG4gICAgdmFyIHAgPSAxLjAgLyBudW1Ob2RlcyArIGFkZGl0aW9uYWxQcm9iOyAvLyBTaG9ydGhhbmRcbiAgICAvLyBUcmF2ZXJzZSBtYXRyaXgsIGNvbHVtbiBieSBjb2x1bW5cblxuICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBudW1Ob2RlczsgX2orKykge1xuICAgICAgaWYgKGNvbHVtblN1bVtfal0gPT09IDApIHtcbiAgICAgICAgLy8gTm8gJ2xpbmtzJyBvdXQgZnJvbSBub2RlIGp0aCwgYXNzdW1lIGVxdWFsIHByb2JhYmlsaXR5IGZvciBlYWNoIHBvc3NpYmxlIG5vZGVcbiAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbnVtTm9kZXM7IF9pMisrKSB7XG4gICAgICAgICAgdmFyIF9uMiA9IF9pMiAqIG51bU5vZGVzICsgX2o7XG5cbiAgICAgICAgICBtYXRyaXhbX24yXSA9IHA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vZGUganRoIGhhcyBvdXRnb2luZyBsaW5rLCBjb21wdXRlIG5vcm1hbGl6ZWQgcHJvYmFiaWxpdGllc1xuICAgICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBudW1Ob2RlczsgX2kzKyspIHtcbiAgICAgICAgICB2YXIgX24zID0gX2kzICogbnVtTm9kZXMgKyBfajtcblxuICAgICAgICAgIG1hdHJpeFtfbjNdID0gbWF0cml4W19uM10gLyBjb2x1bW5TdW1bX2pdICsgYWRkaXRpb25hbFByb2I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIENvbXB1dGUgZG9taW5hbnQgZWlnZW52ZWN0b3IgdXNpbmcgcG93ZXIgbWV0aG9kXG5cblxuICAgIHZhciBlaWdlbnZlY3RvciA9IG5ldyBBcnJheShudW1Ob2Rlcyk7XG4gICAgdmFyIHRlbXAgPSBuZXcgQXJyYXkobnVtTm9kZXMpO1xuICAgIHZhciBwcmV2aW91czsgLy8gU3RhcnQgd2l0aCBhIHZlY3RvciBvZiBhbGwgMSdzXG4gICAgLy8gQWxzbywgaW5pdGlhbGl6ZSBhIG51bGwgdmVjdG9yIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyBzaG9ydGhhbmRcblxuICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG51bU5vZGVzOyBfaTQrKykge1xuICAgICAgZWlnZW52ZWN0b3JbX2k0XSA9IDE7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaXRlciA9IDA7IGl0ZXIgPCBpdGVyYXRpb25zOyBpdGVyKyspIHtcbiAgICAgIC8vIFRlbXAgYXJyYXkgd2l0aCBhbGwgMCdzXG4gICAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBudW1Ob2RlczsgX2k1KyspIHtcbiAgICAgICAgdGVtcFtfaTVdID0gMDtcbiAgICAgIH0gLy8gTXVsdGlwbHkgbWF0cml4IHdpdGggcHJldmlvdXMgcmVzdWx0XG5cblxuICAgICAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgbnVtTm9kZXM7IF9pNisrKSB7XG4gICAgICAgIGZvciAodmFyIF9qMiA9IDA7IF9qMiA8IG51bU5vZGVzOyBfajIrKykge1xuICAgICAgICAgIHZhciBfbjQgPSBfaTYgKiBudW1Ob2RlcyArIF9qMjtcblxuICAgICAgICAgIHRlbXBbX2k2XSArPSBtYXRyaXhbX240XSAqIGVpZ2VudmVjdG9yW19qMl07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaW5QbGFjZVN1bU5vcm1hbGl6ZSh0ZW1wKTtcbiAgICAgIHByZXZpb3VzID0gZWlnZW52ZWN0b3I7XG4gICAgICBlaWdlbnZlY3RvciA9IHRlbXA7XG4gICAgICB0ZW1wID0gcHJldmlvdXM7XG4gICAgICB2YXIgZGlmZiA9IDA7IC8vIENvbXB1dGUgZGlmZmVyZW5jZSAoc3F1YXJlZCBtb2R1bGUpIG9mIGJvdGggdmVjdG9yc1xuXG4gICAgICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCBudW1Ob2RlczsgX2k3KyspIHtcbiAgICAgICAgdmFyIGRlbHRhID0gcHJldmlvdXNbX2k3XSAtIGVpZ2VudmVjdG9yW19pN107XG4gICAgICAgIGRpZmYgKz0gZGVsdGEgKiBkZWx0YTtcbiAgICAgIH0gLy8gSWYgZGlmZmVyZW5jZSBpcyBsZXNzIHRoYW4gdGhlIGRlc2lyZWQgdGhyZXNob2xkLCBzdG9wIGl0ZXJhdGluZ1xuXG5cbiAgICAgIGlmIChkaWZmIDwgcHJlY2lzaW9uKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gLy8gQ29uc3RydWN0IHJlc3VsdFxuXG5cbiAgICB2YXIgcmVzID0ge1xuICAgICAgcmFuazogZnVuY3Rpb24gcmFuayhub2RlKSB7XG4gICAgICAgIG5vZGUgPSBjeS5jb2xsZWN0aW9uKG5vZGUpWzBdO1xuICAgICAgICByZXR1cm4gZWlnZW52ZWN0b3Jbbm9kZXMuaW5kZXhPZihub2RlKV07XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gcmVzO1xuICB9IC8vIHBhZ2VSYW5rXG5cbn07IC8vIGVsZXNmblxuXG52YXIgZGVmYXVsdHMkZiA9IGRlZmF1bHRzJGcoe1xuICByb290OiBudWxsLFxuICB3ZWlnaHQ6IGZ1bmN0aW9uIHdlaWdodChlZGdlKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0sXG4gIGRpcmVjdGVkOiBmYWxzZSxcbiAgYWxwaGE6IDBcbn0pO1xudmFyIGVsZXNmbiRuID0ge1xuICBkZWdyZWVDZW50cmFsaXR5Tm9ybWFsaXplZDogZnVuY3Rpb24gZGVncmVlQ2VudHJhbGl0eU5vcm1hbGl6ZWQob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBkZWZhdWx0cyRmKG9wdGlvbnMpO1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gICAgdmFyIG51bU5vZGVzID0gbm9kZXMubGVuZ3RoO1xuXG4gICAgaWYgKCFvcHRpb25zLmRpcmVjdGVkKSB7XG4gICAgICB2YXIgZGVncmVlcyA9IHt9O1xuICAgICAgdmFyIG1heERlZ3JlZSA9IDA7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTm9kZXM7IGkrKykge1xuICAgICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldOyAvLyBhZGQgY3VycmVudCBub2RlIHRvIHRoZSBjdXJyZW50IG9wdGlvbnMgb2JqZWN0IGFuZCBjYWxsIGRlZ3JlZUNlbnRyYWxpdHlcblxuICAgICAgICBvcHRpb25zLnJvb3QgPSBub2RlO1xuICAgICAgICB2YXIgY3VyckRlZ3JlZSA9IHRoaXMuZGVncmVlQ2VudHJhbGl0eShvcHRpb25zKTtcblxuICAgICAgICBpZiAobWF4RGVncmVlIDwgY3VyckRlZ3JlZS5kZWdyZWUpIHtcbiAgICAgICAgICBtYXhEZWdyZWUgPSBjdXJyRGVncmVlLmRlZ3JlZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZ3JlZXNbbm9kZS5pZCgpXSA9IGN1cnJEZWdyZWUuZGVncmVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZWdyZWU6IGZ1bmN0aW9uIGRlZ3JlZShub2RlKSB7XG4gICAgICAgICAgaWYgKG1heERlZ3JlZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHN0cmluZyhub2RlKSkge1xuICAgICAgICAgICAgLy8gZnJvbSBpcyBhIHNlbGVjdG9yIHN0cmluZ1xuICAgICAgICAgICAgbm9kZSA9IGN5LmZpbHRlcihub2RlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZGVncmVlc1tub2RlLmlkKCldIC8gbWF4RGVncmVlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgaW5kZWdyZWVzID0ge307XG4gICAgICB2YXIgb3V0ZGVncmVlcyA9IHt9O1xuICAgICAgdmFyIG1heEluZGVncmVlID0gMDtcbiAgICAgIHZhciBtYXhPdXRkZWdyZWUgPSAwO1xuXG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbnVtTm9kZXM7IF9pKyspIHtcbiAgICAgICAgdmFyIF9ub2RlID0gbm9kZXNbX2ldO1xuXG4gICAgICAgIHZhciBpZCA9IF9ub2RlLmlkKCk7IC8vIGFkZCBjdXJyZW50IG5vZGUgdG8gdGhlIGN1cnJlbnQgb3B0aW9ucyBvYmplY3QgYW5kIGNhbGwgZGVncmVlQ2VudHJhbGl0eVxuXG5cbiAgICAgICAgb3B0aW9ucy5yb290ID0gX25vZGU7XG5cbiAgICAgICAgdmFyIF9jdXJyRGVncmVlID0gdGhpcy5kZWdyZWVDZW50cmFsaXR5KG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChtYXhJbmRlZ3JlZSA8IF9jdXJyRGVncmVlLmluZGVncmVlKSBtYXhJbmRlZ3JlZSA9IF9jdXJyRGVncmVlLmluZGVncmVlO1xuICAgICAgICBpZiAobWF4T3V0ZGVncmVlIDwgX2N1cnJEZWdyZWUub3V0ZGVncmVlKSBtYXhPdXRkZWdyZWUgPSBfY3VyckRlZ3JlZS5vdXRkZWdyZWU7XG4gICAgICAgIGluZGVncmVlc1tpZF0gPSBfY3VyckRlZ3JlZS5pbmRlZ3JlZTtcbiAgICAgICAgb3V0ZGVncmVlc1tpZF0gPSBfY3VyckRlZ3JlZS5vdXRkZWdyZWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGluZGVncmVlOiBmdW5jdGlvbiBpbmRlZ3JlZShub2RlKSB7XG4gICAgICAgICAgaWYgKG1heEluZGVncmVlID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzdHJpbmcobm9kZSkpIHtcbiAgICAgICAgICAgIC8vIGZyb20gaXMgYSBzZWxlY3RvciBzdHJpbmdcbiAgICAgICAgICAgIG5vZGUgPSBjeS5maWx0ZXIobm9kZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGluZGVncmVlc1tub2RlLmlkKCldIC8gbWF4SW5kZWdyZWU7XG4gICAgICAgIH0sXG4gICAgICAgIG91dGRlZ3JlZTogZnVuY3Rpb24gb3V0ZGVncmVlKG5vZGUpIHtcbiAgICAgICAgICBpZiAobWF4T3V0ZGVncmVlID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc3RyaW5nKG5vZGUpKSB7XG4gICAgICAgICAgICAvLyBmcm9tIGlzIGEgc2VsZWN0b3Igc3RyaW5nXG4gICAgICAgICAgICBub2RlID0gY3kuZmlsdGVyKG5vZGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBvdXRkZWdyZWVzW25vZGUuaWQoKV0gLyBtYXhPdXRkZWdyZWU7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9LFxuICAvLyBkZWdyZWVDZW50cmFsaXR5Tm9ybWFsaXplZFxuICAvLyBJbXBsZW1lbnRlZCBmcm9tIHRoZSBhbGdvcml0aG0gaW4gT3BzYWhsJ3MgcGFwZXJcbiAgLy8gXCJOb2RlIGNlbnRyYWxpdHkgaW4gd2VpZ2h0ZWQgbmV0d29ya3M6IEdlbmVyYWxpemluZyBkZWdyZWUgYW5kIHNob3J0ZXN0IHBhdGhzXCJcbiAgLy8gY2hlY2sgdGhlIGhlYWRpbmcgMiBcIkRlZ3JlZVwiXG4gIGRlZ3JlZUNlbnRyYWxpdHk6IGZ1bmN0aW9uIGRlZ3JlZUNlbnRyYWxpdHkob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBkZWZhdWx0cyRmKG9wdGlvbnMpO1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgY2FsbGluZ0VsZXMgPSB0aGlzO1xuICAgIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICAgIHJvb3QgPSBfb3B0aW9ucy5yb290LFxuICAgICAgICB3ZWlnaHQgPSBfb3B0aW9ucy53ZWlnaHQsXG4gICAgICAgIGRpcmVjdGVkID0gX29wdGlvbnMuZGlyZWN0ZWQsXG4gICAgICAgIGFscGhhID0gX29wdGlvbnMuYWxwaGE7XG4gICAgcm9vdCA9IGN5LmNvbGxlY3Rpb24ocm9vdClbMF07XG5cbiAgICBpZiAoIWRpcmVjdGVkKSB7XG4gICAgICB2YXIgY29ubkVkZ2VzID0gcm9vdC5jb25uZWN0ZWRFZGdlcygpLmludGVyc2VjdGlvbihjYWxsaW5nRWxlcyk7XG4gICAgICB2YXIgayA9IGNvbm5FZGdlcy5sZW5ndGg7XG4gICAgICB2YXIgcyA9IDA7IC8vIE5vdywgc3VtIGVkZ2Ugd2VpZ2h0c1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5FZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzICs9IHdlaWdodChjb25uRWRnZXNbaV0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZWdyZWU6IE1hdGgucG93KGssIDEgLSBhbHBoYSkgKiBNYXRoLnBvdyhzLCBhbHBoYSlcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBlZGdlcyA9IHJvb3QuY29ubmVjdGVkRWRnZXMoKTtcbiAgICAgIHZhciBpbmNvbWluZyA9IGVkZ2VzLmZpbHRlcihmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICByZXR1cm4gZWRnZS50YXJnZXQoKS5zYW1lKHJvb3QpICYmIGNhbGxpbmdFbGVzLmhhcyhlZGdlKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIG91dGdvaW5nID0gZWRnZXMuZmlsdGVyKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgIHJldHVybiBlZGdlLnNvdXJjZSgpLnNhbWUocm9vdCkgJiYgY2FsbGluZ0VsZXMuaGFzKGVkZ2UpO1xuICAgICAgfSk7XG4gICAgICB2YXIga19pbiA9IGluY29taW5nLmxlbmd0aDtcbiAgICAgIHZhciBrX291dCA9IG91dGdvaW5nLmxlbmd0aDtcbiAgICAgIHZhciBzX2luID0gMDtcbiAgICAgIHZhciBzX291dCA9IDA7IC8vIE5vdywgc3VtIGluY29taW5nIGVkZ2Ugd2VpZ2h0c1xuXG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBpbmNvbWluZy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIHNfaW4gKz0gd2VpZ2h0KGluY29taW5nW19pMl0pO1xuICAgICAgfSAvLyBOb3csIHN1bSBvdXRnb2luZyBlZGdlIHdlaWdodHNcblxuXG4gICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBvdXRnb2luZy5sZW5ndGg7IF9pMysrKSB7XG4gICAgICAgIHNfb3V0ICs9IHdlaWdodChvdXRnb2luZ1tfaTNdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5kZWdyZWU6IE1hdGgucG93KGtfaW4sIDEgLSBhbHBoYSkgKiBNYXRoLnBvdyhzX2luLCBhbHBoYSksXG4gICAgICAgIG91dGRlZ3JlZTogTWF0aC5wb3coa19vdXQsIDEgLSBhbHBoYSkgKiBNYXRoLnBvdyhzX291dCwgYWxwaGEpXG4gICAgICB9O1xuICAgIH1cbiAgfSAvLyBkZWdyZWVDZW50cmFsaXR5XG5cbn07IC8vIGVsZXNmblxuLy8gbmljZSwgc2hvcnQgbWF0aGVtYXRpY2FsIGFsaWFzXG5cbmVsZXNmbiRuLmRjID0gZWxlc2ZuJG4uZGVncmVlQ2VudHJhbGl0eTtcbmVsZXNmbiRuLmRjbiA9IGVsZXNmbiRuLmRlZ3JlZUNlbnRyYWxpdHlOb3JtYWxpc2VkID0gZWxlc2ZuJG4uZGVncmVlQ2VudHJhbGl0eU5vcm1hbGl6ZWQ7XG5cbnZhciBkZWZhdWx0cyRlID0gZGVmYXVsdHMkZyh7XG4gIGhhcm1vbmljOiB0cnVlLFxuICB3ZWlnaHQ6IGZ1bmN0aW9uIHdlaWdodCgpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgZGlyZWN0ZWQ6IGZhbHNlLFxuICByb290OiBudWxsXG59KTtcbnZhciBlbGVzZm4kbSA9IHtcbiAgY2xvc2VuZXNzQ2VudHJhbGl0eU5vcm1hbGl6ZWQ6IGZ1bmN0aW9uIGNsb3NlbmVzc0NlbnRyYWxpdHlOb3JtYWxpemVkKG9wdGlvbnMpIHtcbiAgICB2YXIgX2RlZmF1bHRzID0gZGVmYXVsdHMkZShvcHRpb25zKSxcbiAgICAgICAgaGFybW9uaWMgPSBfZGVmYXVsdHMuaGFybW9uaWMsXG4gICAgICAgIHdlaWdodCA9IF9kZWZhdWx0cy53ZWlnaHQsXG4gICAgICAgIGRpcmVjdGVkID0gX2RlZmF1bHRzLmRpcmVjdGVkO1xuXG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBjbG9zZW5lc3NlcyA9IHt9O1xuICAgIHZhciBtYXhDbG9zZW5lc3MgPSAwO1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgICB2YXIgZncgPSB0aGlzLmZsb3lkV2Fyc2hhbGwoe1xuICAgICAgd2VpZ2h0OiB3ZWlnaHQsXG4gICAgICBkaXJlY3RlZDogZGlyZWN0ZWRcbiAgICB9KTsgLy8gQ29tcHV0ZSBjbG9zZW5lc3MgZm9yIGV2ZXJ5IG5vZGUgYW5kIGZpbmQgdGhlIG1heGltdW0gY2xvc2VuZXNzXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY3VyckNsb3NlbmVzcyA9IDA7XG4gICAgICB2YXIgbm9kZV9pID0gbm9kZXNbaV07XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbm9kZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKGkgIT09IGopIHtcbiAgICAgICAgICB2YXIgZCA9IGZ3LmRpc3RhbmNlKG5vZGVfaSwgbm9kZXNbal0pO1xuXG4gICAgICAgICAgaWYgKGhhcm1vbmljKSB7XG4gICAgICAgICAgICBjdXJyQ2xvc2VuZXNzICs9IDEgLyBkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXJyQ2xvc2VuZXNzICs9IGQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghaGFybW9uaWMpIHtcbiAgICAgICAgY3VyckNsb3NlbmVzcyA9IDEgLyBjdXJyQ2xvc2VuZXNzO1xuICAgICAgfVxuXG4gICAgICBpZiAobWF4Q2xvc2VuZXNzIDwgY3VyckNsb3NlbmVzcykge1xuICAgICAgICBtYXhDbG9zZW5lc3MgPSBjdXJyQ2xvc2VuZXNzO1xuICAgICAgfVxuXG4gICAgICBjbG9zZW5lc3Nlc1tub2RlX2kuaWQoKV0gPSBjdXJyQ2xvc2VuZXNzO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjbG9zZW5lc3M6IGZ1bmN0aW9uIGNsb3NlbmVzcyhub2RlKSB7XG4gICAgICAgIGlmIChtYXhDbG9zZW5lc3MgPT0gMCkge1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmluZyhub2RlKSkge1xuICAgICAgICAgIC8vIGZyb20gaXMgYSBzZWxlY3RvciBzdHJpbmdcbiAgICAgICAgICBub2RlID0gY3kuZmlsdGVyKG5vZGUpWzBdLmlkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZnJvbSBpcyBhIG5vZGVcbiAgICAgICAgICBub2RlID0gbm9kZS5pZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNsb3NlbmVzc2VzW25vZGVdIC8gbWF4Q2xvc2VuZXNzO1xuICAgICAgfVxuICAgIH07XG4gIH0sXG4gIC8vIEltcGxlbWVudGVkIGZyb20gcHNldWRvY29kZSBmcm9tIHdpa2lwZWRpYVxuICBjbG9zZW5lc3NDZW50cmFsaXR5OiBmdW5jdGlvbiBjbG9zZW5lc3NDZW50cmFsaXR5KG9wdGlvbnMpIHtcbiAgICB2YXIgX2RlZmF1bHRzMiA9IGRlZmF1bHRzJGUob3B0aW9ucyksXG4gICAgICAgIHJvb3QgPSBfZGVmYXVsdHMyLnJvb3QsXG4gICAgICAgIHdlaWdodCA9IF9kZWZhdWx0czIud2VpZ2h0LFxuICAgICAgICBkaXJlY3RlZCA9IF9kZWZhdWx0czIuZGlyZWN0ZWQsXG4gICAgICAgIGhhcm1vbmljID0gX2RlZmF1bHRzMi5oYXJtb25pYztcblxuICAgIHJvb3QgPSB0aGlzLmZpbHRlcihyb290KVswXTsgLy8gd2UgbmVlZCBkaXN0YW5jZSBmcm9tIHRoaXMgbm9kZSB0byBldmVyeSBvdGhlciBub2RlXG5cbiAgICB2YXIgZGlqa3N0cmEgPSB0aGlzLmRpamtzdHJhKHtcbiAgICAgIHJvb3Q6IHJvb3QsXG4gICAgICB3ZWlnaHQ6IHdlaWdodCxcbiAgICAgIGRpcmVjdGVkOiBkaXJlY3RlZFxuICAgIH0pO1xuICAgIHZhciB0b3RhbERpc3RhbmNlID0gMDtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbiA9IG5vZGVzW2ldO1xuXG4gICAgICBpZiAoIW4uc2FtZShyb290KSkge1xuICAgICAgICB2YXIgZCA9IGRpamtzdHJhLmRpc3RhbmNlVG8obik7XG5cbiAgICAgICAgaWYgKGhhcm1vbmljKSB7XG4gICAgICAgICAgdG90YWxEaXN0YW5jZSArPSAxIC8gZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b3RhbERpc3RhbmNlICs9IGQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaGFybW9uaWMgPyB0b3RhbERpc3RhbmNlIDogMSAvIHRvdGFsRGlzdGFuY2U7XG4gIH0gLy8gY2xvc2VuZXNzQ2VudHJhbGl0eVxuXG59OyAvLyBlbGVzZm5cbi8vIG5pY2UsIHNob3J0IG1hdGhlbWF0aWNhbCBhbGlhc1xuXG5lbGVzZm4kbS5jYyA9IGVsZXNmbiRtLmNsb3NlbmVzc0NlbnRyYWxpdHk7XG5lbGVzZm4kbS5jY24gPSBlbGVzZm4kbS5jbG9zZW5lc3NDZW50cmFsaXR5Tm9ybWFsaXNlZCA9IGVsZXNmbiRtLmNsb3NlbmVzc0NlbnRyYWxpdHlOb3JtYWxpemVkO1xuXG52YXIgZGVmYXVsdHMkZCA9IGRlZmF1bHRzJGcoe1xuICB3ZWlnaHQ6IG51bGwsXG4gIGRpcmVjdGVkOiBmYWxzZVxufSk7XG52YXIgZWxlc2ZuJGwgPSB7XG4gIC8vIEltcGxlbWVudGVkIGZyb20gdGhlIGFsZ29yaXRobSBpbiB0aGUgcGFwZXIgXCJPbiBWYXJpYW50cyBvZiBTaG9ydGVzdC1QYXRoIEJldHdlZW5uZXNzIENlbnRyYWxpdHkgYW5kIHRoZWlyIEdlbmVyaWMgQ29tcHV0YXRpb25cIiBieSBVbHJpayBCcmFuZGVzXG4gIGJldHdlZW5uZXNzQ2VudHJhbGl0eTogZnVuY3Rpb24gYmV0d2Vlbm5lc3NDZW50cmFsaXR5KG9wdGlvbnMpIHtcbiAgICB2YXIgX2RlZmF1bHRzID0gZGVmYXVsdHMkZChvcHRpb25zKSxcbiAgICAgICAgZGlyZWN0ZWQgPSBfZGVmYXVsdHMuZGlyZWN0ZWQsXG4gICAgICAgIHdlaWdodCA9IF9kZWZhdWx0cy53ZWlnaHQ7XG5cbiAgICB2YXIgd2VpZ2h0ZWQgPSB3ZWlnaHQgIT0gbnVsbDtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7IC8vIHN0YXJ0aW5nXG5cbiAgICB2YXIgViA9IHRoaXMubm9kZXMoKTtcbiAgICB2YXIgQSA9IHt9O1xuICAgIHZhciBfQyA9IHt9O1xuICAgIHZhciBtYXggPSAwO1xuICAgIHZhciBDID0ge1xuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWwpIHtcbiAgICAgICAgX0Nba2V5XSA9IHZhbDtcblxuICAgICAgICBpZiAodmFsID4gbWF4KSB7XG4gICAgICAgICAgbWF4ID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICAgIHJldHVybiBfQ1trZXldO1xuICAgICAgfVxuICAgIH07IC8vIEEgY29udGFpbnMgdGhlIG5laWdoYm9yaG9vZHMgb2YgZXZlcnkgbm9kZVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBWLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdiA9IFZbaV07XG4gICAgICB2YXIgdmlkID0gdi5pZCgpO1xuXG4gICAgICBpZiAoZGlyZWN0ZWQpIHtcbiAgICAgICAgQVt2aWRdID0gdi5vdXRnb2VycygpLm5vZGVzKCk7IC8vIGdldCBvdXRnb2VycyBvZiBldmVyeSBub2RlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBBW3ZpZF0gPSB2Lm9wZW5OZWlnaGJvcmhvb2QoKS5ub2RlcygpOyAvLyBnZXQgbmVpZ2hib3JzIG9mIGV2ZXJ5IG5vZGVcbiAgICAgIH1cblxuICAgICAgQy5zZXQodmlkLCAwKTtcbiAgICB9XG5cbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChzKSB7XG4gICAgICB2YXIgc2lkID0gVltzXS5pZCgpO1xuICAgICAgdmFyIFMgPSBbXTsgLy8gc3RhY2tcblxuICAgICAgdmFyIFAgPSB7fTtcbiAgICAgIHZhciBnID0ge307XG4gICAgICB2YXIgZCA9IHt9O1xuICAgICAgdmFyIFEgPSBuZXcgSGVhcF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGRbYV0gLSBkW2JdO1xuICAgICAgfSk7IC8vIHF1ZXVlXG4gICAgICAvLyBpbml0IGRpY3Rpb25hcmllc1xuXG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgVi5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIF92aWQgPSBWW19pXS5pZCgpO1xuXG4gICAgICAgIFBbX3ZpZF0gPSBbXTtcbiAgICAgICAgZ1tfdmlkXSA9IDA7XG4gICAgICAgIGRbX3ZpZF0gPSBJbmZpbml0eTtcbiAgICAgIH1cblxuICAgICAgZ1tzaWRdID0gMTsgLy8gc2lnbWFcblxuICAgICAgZFtzaWRdID0gMDsgLy8gZGlzdGFuY2UgdG8gc1xuXG4gICAgICBRLnB1c2goc2lkKTtcblxuICAgICAgd2hpbGUgKCFRLmVtcHR5KCkpIHtcbiAgICAgICAgdmFyIF92ID0gUS5wb3AoKTtcblxuICAgICAgICBTLnB1c2goX3YpO1xuXG4gICAgICAgIGlmICh3ZWlnaHRlZCkge1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgQVtfdl0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHZhciB3ID0gQVtfdl1bal07XG4gICAgICAgICAgICB2YXIgdkVsZSA9IGN5LmdldEVsZW1lbnRCeUlkKF92KTtcbiAgICAgICAgICAgIHZhciBlZGdlID0gdm9pZCAwO1xuXG4gICAgICAgICAgICBpZiAodkVsZS5lZGdlc1RvKHcpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgZWRnZSA9IHZFbGUuZWRnZXNUbyh3KVswXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVkZ2UgPSB3LmVkZ2VzVG8odkVsZSlbMF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBlZGdlV2VpZ2h0ID0gd2VpZ2h0KGVkZ2UpO1xuICAgICAgICAgICAgdyA9IHcuaWQoKTtcblxuICAgICAgICAgICAgaWYgKGRbd10gPiBkW192XSArIGVkZ2VXZWlnaHQpIHtcbiAgICAgICAgICAgICAgZFt3XSA9IGRbX3ZdICsgZWRnZVdlaWdodDtcblxuICAgICAgICAgICAgICBpZiAoUS5ub2Rlcy5pbmRleE9mKHcpIDwgMCkge1xuICAgICAgICAgICAgICAgIC8vaWYgdyBpcyBub3QgaW4gUVxuICAgICAgICAgICAgICAgIFEucHVzaCh3KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgcG9zaXRpb24gaWYgdyBpcyBpbiBRXG4gICAgICAgICAgICAgICAgUS51cGRhdGVJdGVtKHcpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZ1t3XSA9IDA7XG4gICAgICAgICAgICAgIFBbd10gPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRbd10gPT0gZFtfdl0gKyBlZGdlV2VpZ2h0KSB7XG4gICAgICAgICAgICAgIGdbd10gPSBnW3ddICsgZ1tfdl07XG4gICAgICAgICAgICAgIFBbd10ucHVzaChfdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBBW192XS5sZW5ndGg7IF9qKyspIHtcbiAgICAgICAgICAgIHZhciBfdyA9IEFbX3ZdW19qXS5pZCgpO1xuXG4gICAgICAgICAgICBpZiAoZFtfd10gPT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgICAgUS5wdXNoKF93KTtcbiAgICAgICAgICAgICAgZFtfd10gPSBkW192XSArIDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkW193XSA9PSBkW192XSArIDEpIHtcbiAgICAgICAgICAgICAgZ1tfd10gPSBnW193XSArIGdbX3ZdO1xuXG4gICAgICAgICAgICAgIFBbX3ddLnB1c2goX3YpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgZSA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBWLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgZVtWW19pMl0uaWQoKV0gPSAwO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAoUy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBfdzIgPSBTLnBvcCgpO1xuXG4gICAgICAgIGZvciAodmFyIF9qMiA9IDA7IF9qMiA8IFBbX3cyXS5sZW5ndGg7IF9qMisrKSB7XG4gICAgICAgICAgdmFyIF92MiA9IFBbX3cyXVtfajJdO1xuICAgICAgICAgIGVbX3YyXSA9IGVbX3YyXSArIGdbX3YyXSAvIGdbX3cyXSAqICgxICsgZVtfdzJdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfdzIgIT0gVltzXS5pZCgpKSB7XG4gICAgICAgICAgQy5zZXQoX3cyLCBDLmdldChfdzIpICsgZVtfdzJdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKHZhciBzID0gMDsgcyA8IFYubGVuZ3RoOyBzKyspIHtcbiAgICAgIF9sb29wKHMpO1xuICAgIH1cblxuICAgIHZhciByZXQgPSB7XG4gICAgICBiZXR3ZWVubmVzczogZnVuY3Rpb24gYmV0d2Vlbm5lc3Mobm9kZSkge1xuICAgICAgICB2YXIgaWQgPSBjeS5jb2xsZWN0aW9uKG5vZGUpLmlkKCk7XG4gICAgICAgIHJldHVybiBDLmdldChpZCk7XG4gICAgICB9LFxuICAgICAgYmV0d2Vlbm5lc3NOb3JtYWxpemVkOiBmdW5jdGlvbiBiZXR3ZWVubmVzc05vcm1hbGl6ZWQobm9kZSkge1xuICAgICAgICBpZiAobWF4ID09IDApIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpZCA9IGN5LmNvbGxlY3Rpb24obm9kZSkuaWQoKTtcbiAgICAgICAgcmV0dXJuIEMuZ2V0KGlkKSAvIG1heDtcbiAgICAgIH1cbiAgICB9OyAvLyBhbGlhc1xuXG4gICAgcmV0LmJldHdlZW5uZXNzTm9ybWFsaXNlZCA9IHJldC5iZXR3ZWVubmVzc05vcm1hbGl6ZWQ7XG4gICAgcmV0dXJuIHJldDtcbiAgfSAvLyBiZXR3ZWVubmVzc0NlbnRyYWxpdHlcblxufTsgLy8gZWxlc2ZuXG4vLyBuaWNlLCBzaG9ydCBtYXRoZW1hdGljYWwgYWxpYXNcblxuZWxlc2ZuJGwuYmMgPSBlbGVzZm4kbC5iZXR3ZWVubmVzc0NlbnRyYWxpdHk7XG5cbi8vIEltcGxlbWVudGVkIGJ5IFpvZSBYaSBAem9leGkgZm9yIEdTT0MgMjAxNlxuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cblxudmFyIGRlZmF1bHRzJGMgPSBkZWZhdWx0cyRnKHtcbiAgZXhwYW5kRmFjdG9yOiAyLFxuICAvLyBhZmZlY3RzIHRpbWUgb2YgY29tcHV0YXRpb24gYW5kIGNsdXN0ZXIgZ3JhbnVsYXJpdHkgdG8gc29tZSBleHRlbnQ6IE0gKiBNXG4gIGluZmxhdGVGYWN0b3I6IDIsXG4gIC8vIGFmZmVjdHMgY2x1c3RlciBncmFudWxhcml0eSAodGhlIGdyZWF0ZXIgdGhlIHZhbHVlLCB0aGUgbW9yZSBjbHVzdGVycyk6IE0oaSxqKSAvIEUoailcbiAgbXVsdEZhY3RvcjogMSxcbiAgLy8gb3B0aW9uYWwgc2VsZiBsb29wcyBmb3IgZWFjaCBub2RlLiBVc2UgYSBuZXV0cmFsIHZhbHVlIHRvIGltcHJvdmUgY2x1c3RlciBjb21wdXRhdGlvbnMuXG4gIG1heEl0ZXJhdGlvbnM6IDIwLFxuICAvLyBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIG9mIHRoZSBNQ0wgYWxnb3JpdGhtIGluIGEgc2luZ2xlIHJ1blxuICBhdHRyaWJ1dGVzOiBbLy8gYXR0cmlidXRlcy9mZWF0dXJlcyB1c2VkIHRvIGdyb3VwIG5vZGVzLCBpZS4gc2ltaWxhcml0eSB2YWx1ZXMgYmV0d2VlbiBub2Rlc1xuICBmdW5jdGlvbiAoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9XVxufSk7XG4vKiBlc2xpbnQtZW5hYmxlICovXG5cbnZhciBzZXRPcHRpb25zJDMgPSBmdW5jdGlvbiBzZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRlZmF1bHRzJGMob3B0aW9ucyk7XG59O1xuLyogZXNsaW50LWVuYWJsZSAqL1xuXG5cbnZhciBnZXRTaW1pbGFyaXR5JDEgPSBmdW5jdGlvbiBnZXRTaW1pbGFyaXR5KGVkZ2UsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIHRvdGFsID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICB0b3RhbCArPSBhdHRyaWJ1dGVzW2ldKGVkZ2UpO1xuICB9XG5cbiAgcmV0dXJuIHRvdGFsO1xufTtcblxudmFyIGFkZExvb3BzID0gZnVuY3Rpb24gYWRkTG9vcHMoTSwgbiwgdmFsKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgTVtpICogbiArIGldID0gdmFsO1xuICB9XG59O1xuXG52YXIgbm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKE0sIG4pIHtcbiAgdmFyIHN1bTtcblxuICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCBuOyBjb2wrKykge1xuICAgIHN1bSA9IDA7XG5cbiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBuOyByb3crKykge1xuICAgICAgc3VtICs9IE1bcm93ICogbiArIGNvbF07XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX3JvdyA9IDA7IF9yb3cgPCBuOyBfcm93KyspIHtcbiAgICAgIE1bX3JvdyAqIG4gKyBjb2xdID0gTVtfcm93ICogbiArIGNvbF0gLyBzdW07XG4gICAgfVxuICB9XG59OyAvLyBUT0RPOiBibG9ja2VkIG1hdHJpeCBtdWx0aXBsaWNhdGlvbj9cblxuXG52YXIgbW11bHQgPSBmdW5jdGlvbiBtbXVsdChBLCBCLCBuKSB7XG4gIHZhciBDID0gbmV3IEFycmF5KG4gKiBuKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbjsgaisrKSB7XG4gICAgICBDW2kgKiBuICsgal0gPSAwO1xuICAgIH1cblxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbjsgaysrKSB7XG4gICAgICBmb3IgKHZhciBfaiA9IDA7IF9qIDwgbjsgX2orKykge1xuICAgICAgICBDW2kgKiBuICsgX2pdICs9IEFbaSAqIG4gKyBrXSAqIEJbayAqIG4gKyBfal07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIEM7XG59O1xuXG52YXIgZXhwYW5kID0gZnVuY3Rpb24gZXhwYW5kKE0sIG4sIGV4cGFuZEZhY3RvclxuLyoqIHBvd2VyICoqL1xuKSB7XG4gIHZhciBfTSA9IE0uc2xpY2UoMCk7XG5cbiAgZm9yICh2YXIgcCA9IDE7IHAgPCBleHBhbmRGYWN0b3I7IHArKykge1xuICAgIE0gPSBtbXVsdChNLCBfTSwgbik7XG4gIH1cblxuICByZXR1cm4gTTtcbn07XG5cbnZhciBpbmZsYXRlID0gZnVuY3Rpb24gaW5mbGF0ZShNLCBuLCBpbmZsYXRlRmFjdG9yXG4vKiogciAqKi9cbikge1xuICB2YXIgX00gPSBuZXcgQXJyYXkobiAqIG4pOyAvLyBNKGksaikgXiBpbmZsYXRlUG93ZXJcblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbiAqIG47IGkrKykge1xuICAgIF9NW2ldID0gTWF0aC5wb3coTVtpXSwgaW5mbGF0ZUZhY3Rvcik7XG4gIH1cblxuICBub3JtYWxpemUoX00sIG4pO1xuICByZXR1cm4gX007XG59O1xuXG52YXIgaGFzQ29udmVyZ2VkID0gZnVuY3Rpb24gaGFzQ29udmVyZ2VkKE0sIF9NLCBuMiwgcm91bmRGYWN0b3IpIHtcbiAgLy8gQ2hlY2sgdGhhdCBib3RoIG1hdHJpY2VzIGhhdmUgdGhlIHNhbWUgZWxlbWVudHMgKGksailcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuMjsgaSsrKSB7XG4gICAgdmFyIHYxID0gTWF0aC5yb3VuZChNW2ldICogTWF0aC5wb3coMTAsIHJvdW5kRmFjdG9yKSkgLyBNYXRoLnBvdygxMCwgcm91bmRGYWN0b3IpOyAvLyB0cnVuY2F0ZSB0byAncm91bmRGYWN0b3InIGRlY2ltYWwgcGxhY2VzXG5cbiAgICB2YXIgdjIgPSBNYXRoLnJvdW5kKF9NW2ldICogTWF0aC5wb3coMTAsIHJvdW5kRmFjdG9yKSkgLyBNYXRoLnBvdygxMCwgcm91bmRGYWN0b3IpO1xuXG4gICAgaWYgKHYxICE9PSB2Mikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxudmFyIGFzc2lnbiQyID0gZnVuY3Rpb24gYXNzaWduKE0sIG4sIG5vZGVzLCBjeSkge1xuICB2YXIgY2x1c3RlcnMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIHZhciBjbHVzdGVyID0gW107XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgLy8gUm93LXdpc2UgYXR0cmFjdG9ycyBhbmQgZWxlbWVudHMgdGhhdCB0aGV5IGF0dHJhY3QgYmVsb25nIGluIHNhbWUgY2x1c3RlclxuICAgICAgaWYgKE1hdGgucm91bmQoTVtpICogbiArIGpdICogMTAwMCkgLyAxMDAwID4gMCkge1xuICAgICAgICBjbHVzdGVyLnB1c2gobm9kZXNbal0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjbHVzdGVyLmxlbmd0aCAhPT0gMCkge1xuICAgICAgY2x1c3RlcnMucHVzaChjeS5jb2xsZWN0aW9uKGNsdXN0ZXIpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xuXG52YXIgaXNEdXBsaWNhdGUgPSBmdW5jdGlvbiBpc0R1cGxpY2F0ZShjMSwgYzIpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjMS5sZW5ndGg7IGkrKykge1xuICAgIGlmICghYzJbaV0gfHwgYzFbaV0uaWQoKSAhPT0gYzJbaV0uaWQoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxudmFyIHJlbW92ZUR1cGxpY2F0ZXMgPSBmdW5jdGlvbiByZW1vdmVEdXBsaWNhdGVzKGNsdXN0ZXJzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNsdXN0ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoaSAhPSBqICYmIGlzRHVwbGljYXRlKGNsdXN0ZXJzW2ldLCBjbHVzdGVyc1tqXSkpIHtcbiAgICAgICAgY2x1c3RlcnMuc3BsaWNlKGosIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjbHVzdGVycztcbn07XG5cbnZhciBtYXJrb3ZDbHVzdGVyaW5nID0gZnVuY3Rpb24gbWFya292Q2x1c3RlcmluZyhvcHRpb25zKSB7XG4gIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgdmFyIGVkZ2VzID0gdGhpcy5lZGdlcygpO1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7IC8vIFNldCBwYXJhbWV0ZXJzIG9mIGFsZ29yaXRobTpcblxuICB2YXIgb3B0cyA9IHNldE9wdGlvbnMkMyhvcHRpb25zKTsgLy8gTWFwIGVhY2ggbm9kZSB0byBpdHMgcG9zaXRpb24gaW4gbm9kZSBhcnJheVxuXG4gIHZhciBpZDJwb3NpdGlvbiA9IHt9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZDJwb3NpdGlvbltub2Rlc1tpXS5pZCgpXSA9IGk7XG4gIH0gLy8gR2VuZXJhdGUgc3RvY2hhc3RpYyBtYXRyaXggTSBmcm9tIGlucHV0IGdyYXBoIEcgKHNob3VsZCBiZSBzeW1tZXRyaWMvdW5kaXJlY3RlZClcblxuXG4gIHZhciBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgbjIgPSBuICogbjtcblxuICB2YXIgTSA9IG5ldyBBcnJheShuMiksXG4gICAgICBfTTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbjI7IF9pKyspIHtcbiAgICBNW19pXSA9IDA7XG4gIH1cblxuICBmb3IgKHZhciBlID0gMDsgZSA8IGVkZ2VzLmxlbmd0aDsgZSsrKSB7XG4gICAgdmFyIGVkZ2UgPSBlZGdlc1tlXTtcbiAgICB2YXIgX2kyID0gaWQycG9zaXRpb25bZWRnZS5zb3VyY2UoKS5pZCgpXTtcbiAgICB2YXIgaiA9IGlkMnBvc2l0aW9uW2VkZ2UudGFyZ2V0KCkuaWQoKV07XG4gICAgdmFyIHNpbSA9IGdldFNpbWlsYXJpdHkkMShlZGdlLCBvcHRzLmF0dHJpYnV0ZXMpO1xuICAgIE1bX2kyICogbiArIGpdICs9IHNpbTsgLy8gRyBzaG91bGQgYmUgc3ltbWV0cmljIGFuZCB1bmRpcmVjdGVkXG5cbiAgICBNW2ogKiBuICsgX2kyXSArPSBzaW07XG4gIH0gLy8gQmVnaW4gTWFya292IGNsdXN0ZXIgYWxnb3JpdGhtXG4gIC8vIFN0ZXAgMTogQWRkIHNlbGYgbG9vcHMgdG8gZWFjaCBub2RlLCBpZS4gYWRkIG11bHRGYWN0b3IgdG8gbWF0cml4IGRpYWdvbmFsXG5cblxuICBhZGRMb29wcyhNLCBuLCBvcHRzLm11bHRGYWN0b3IpOyAvLyBTdGVwIDI6IE0gPSBub3JtYWxpemUoIE0gKTtcblxuICBub3JtYWxpemUoTSwgbik7XG4gIHZhciBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuXG4gIHdoaWxlIChpc1N0aWxsTW92aW5nICYmIGl0ZXJhdGlvbnMgPCBvcHRzLm1heEl0ZXJhdGlvbnMpIHtcbiAgICBpc1N0aWxsTW92aW5nID0gZmFsc2U7IC8vIFN0ZXAgMzpcblxuICAgIF9NID0gZXhwYW5kKE0sIG4sIG9wdHMuZXhwYW5kRmFjdG9yKTsgLy8gU3RlcCA0OlxuXG4gICAgTSA9IGluZmxhdGUoX00sIG4sIG9wdHMuaW5mbGF0ZUZhY3Rvcik7IC8vIFN0ZXAgNTogY2hlY2sgdG8gc2VlIGlmIH5zdGVhZHkgc3RhdGUgaGFzIGJlZW4gcmVhY2hlZFxuXG4gICAgaWYgKCFoYXNDb252ZXJnZWQoTSwgX00sIG4yLCA0KSkge1xuICAgICAgaXNTdGlsbE1vdmluZyA9IHRydWU7XG4gICAgfVxuXG4gICAgaXRlcmF0aW9ucysrO1xuICB9IC8vIEJ1aWxkIGNsdXN0ZXJzIGZyb20gbWF0cml4XG5cblxuICB2YXIgY2x1c3RlcnMgPSBhc3NpZ24kMihNLCBuLCBub2RlcywgY3kpOyAvLyBSZW1vdmUgZHVwbGljYXRlIGNsdXN0ZXJzIGR1ZSB0byBzeW1tZXRyeSBvZiBncmFwaCBhbmQgTSBtYXRyaXhcblxuICBjbHVzdGVycyA9IHJlbW92ZUR1cGxpY2F0ZXMoY2x1c3RlcnMpO1xuICByZXR1cm4gY2x1c3RlcnM7XG59O1xuXG52YXIgbWFya292Q2x1c3RlcmluZyQxID0ge1xuICBtYXJrb3ZDbHVzdGVyaW5nOiBtYXJrb3ZDbHVzdGVyaW5nLFxuICBtY2w6IG1hcmtvdkNsdXN0ZXJpbmdcbn07XG5cbi8vIENvbW1vbiBkaXN0YW5jZSBtZXRyaWNzIGZvciBjbHVzdGVyaW5nIGFsZ29yaXRobXNcblxudmFyIGlkZW50aXR5ID0gZnVuY3Rpb24gaWRlbnRpdHkoeCkge1xuICByZXR1cm4geDtcbn07XG5cbnZhciBhYnNEaWZmID0gZnVuY3Rpb24gYWJzRGlmZihwLCBxKSB7XG4gIHJldHVybiBNYXRoLmFicyhxIC0gcCk7XG59O1xuXG52YXIgYWRkQWJzRGlmZiA9IGZ1bmN0aW9uIGFkZEFic0RpZmYodG90YWwsIHAsIHEpIHtcbiAgcmV0dXJuIHRvdGFsICsgYWJzRGlmZihwLCBxKTtcbn07XG5cbnZhciBhZGRTcXVhcmVkRGlmZiA9IGZ1bmN0aW9uIGFkZFNxdWFyZWREaWZmKHRvdGFsLCBwLCBxKSB7XG4gIHJldHVybiB0b3RhbCArIE1hdGgucG93KHEgLSBwLCAyKTtcbn07XG5cbnZhciBzcXJ0ID0gZnVuY3Rpb24gc3FydCh4KSB7XG4gIHJldHVybiBNYXRoLnNxcnQoeCk7XG59O1xuXG52YXIgbWF4QWJzRGlmZiA9IGZ1bmN0aW9uIG1heEFic0RpZmYoY3VycmVudE1heCwgcCwgcSkge1xuICByZXR1cm4gTWF0aC5tYXgoY3VycmVudE1heCwgYWJzRGlmZihwLCBxKSk7XG59O1xuXG52YXIgZ2V0RGlzdGFuY2UgPSBmdW5jdGlvbiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIGluaXQsIHZpc2l0KSB7XG4gIHZhciBwb3N0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiBpZGVudGl0eTtcbiAgdmFyIHJldCA9IGluaXQ7XG4gIHZhciBwLCBxO1xuXG4gIGZvciAodmFyIGRpbSA9IDA7IGRpbSA8IGxlbmd0aDsgZGltKyspIHtcbiAgICBwID0gZ2V0UChkaW0pO1xuICAgIHEgPSBnZXRRKGRpbSk7XG4gICAgcmV0ID0gdmlzaXQocmV0LCBwLCBxKTtcbiAgfVxuXG4gIHJldHVybiBwb3N0KHJldCk7XG59O1xuXG52YXIgZGlzdGFuY2VzID0ge1xuICBldWNsaWRlYW46IGZ1bmN0aW9uIGV1Y2xpZGVhbihsZW5ndGgsIGdldFAsIGdldFEpIHtcbiAgICBpZiAobGVuZ3RoID49IDIpIHtcbiAgICAgIHJldHVybiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIDAsIGFkZFNxdWFyZWREaWZmLCBzcXJ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZm9yIHNpbmdsZSBhdHRyIGNhc2UsIG1vcmUgZWZmaWNpZW50IHRvIGF2b2lkIHNxcnRcbiAgICAgIHJldHVybiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIDAsIGFkZEFic0RpZmYpO1xuICAgIH1cbiAgfSxcbiAgc3F1YXJlZEV1Y2xpZGVhbjogZnVuY3Rpb24gc3F1YXJlZEV1Y2xpZGVhbihsZW5ndGgsIGdldFAsIGdldFEpIHtcbiAgICByZXR1cm4gZ2V0RGlzdGFuY2UobGVuZ3RoLCBnZXRQLCBnZXRRLCAwLCBhZGRTcXVhcmVkRGlmZik7XG4gIH0sXG4gIG1hbmhhdHRhbjogZnVuY3Rpb24gbWFuaGF0dGFuKGxlbmd0aCwgZ2V0UCwgZ2V0USkge1xuICAgIHJldHVybiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIDAsIGFkZEFic0RpZmYpO1xuICB9LFxuICBtYXg6IGZ1bmN0aW9uIG1heChsZW5ndGgsIGdldFAsIGdldFEpIHtcbiAgICByZXR1cm4gZ2V0RGlzdGFuY2UobGVuZ3RoLCBnZXRQLCBnZXRRLCAtSW5maW5pdHksIG1heEFic0RpZmYpO1xuICB9XG59OyAvLyBpbiBjYXNlIHRoZSB1c2VyIGFjY2lkZW50YWxseSBkb2Vzbid0IHVzZSBjYW1lbCBjYXNlXG5cbmRpc3RhbmNlc1snc3F1YXJlZC1ldWNsaWRlYW4nXSA9IGRpc3RhbmNlc1snc3F1YXJlZEV1Y2xpZGVhbiddO1xuZGlzdGFuY2VzWydzcXVhcmVkZXVjbGlkZWFuJ10gPSBkaXN0YW5jZXNbJ3NxdWFyZWRFdWNsaWRlYW4nXTtcbmZ1bmN0aW9uIGNsdXN0ZXJpbmdEaXN0YW5jZSAobWV0aG9kLCBsZW5ndGgsIGdldFAsIGdldFEsIG5vZGVQLCBub2RlUSkge1xuICB2YXIgaW1wbDtcblxuICBpZiAoZm4kNihtZXRob2QpKSB7XG4gICAgaW1wbCA9IG1ldGhvZDtcbiAgfSBlbHNlIHtcbiAgICBpbXBsID0gZGlzdGFuY2VzW21ldGhvZF0gfHwgZGlzdGFuY2VzLmV1Y2xpZGVhbjtcbiAgfVxuXG4gIGlmIChsZW5ndGggPT09IDAgJiYgZm4kNihtZXRob2QpKSB7XG4gICAgcmV0dXJuIGltcGwobm9kZVAsIG5vZGVRKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW1wbChsZW5ndGgsIGdldFAsIGdldFEsIG5vZGVQLCBub2RlUSk7XG4gIH1cbn1cblxudmFyIGRlZmF1bHRzJGIgPSBkZWZhdWx0cyRnKHtcbiAgazogMixcbiAgbTogMixcbiAgc2Vuc2l0aXZpdHlUaHJlc2hvbGQ6IDAuMDAwMSxcbiAgZGlzdGFuY2U6ICdldWNsaWRlYW4nLFxuICBtYXhJdGVyYXRpb25zOiAxMCxcbiAgYXR0cmlidXRlczogW10sXG4gIHRlc3RNb2RlOiBmYWxzZSxcbiAgdGVzdENlbnRyb2lkczogbnVsbFxufSk7XG5cbnZhciBzZXRPcHRpb25zJDIgPSBmdW5jdGlvbiBzZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRlZmF1bHRzJGIob3B0aW9ucyk7XG59O1xuLyogZXNsaW50LWVuYWJsZSAqL1xuXG5cbnZhciBnZXREaXN0ID0gZnVuY3Rpb24gZ2V0RGlzdCh0eXBlLCBub2RlLCBjZW50cm9pZCwgYXR0cmlidXRlcywgbW9kZSkge1xuICB2YXIgbm9Ob2RlUCA9IG1vZGUgIT09ICdrTWVkb2lkcyc7XG4gIHZhciBnZXRQID0gbm9Ob2RlUCA/IGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGNlbnRyb2lkW2ldO1xuICB9IDogZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gYXR0cmlidXRlc1tpXShjZW50cm9pZCk7XG4gIH07XG5cbiAgdmFyIGdldFEgPSBmdW5jdGlvbiBnZXRRKGkpIHtcbiAgICByZXR1cm4gYXR0cmlidXRlc1tpXShub2RlKTtcbiAgfTtcblxuICB2YXIgbm9kZVAgPSBjZW50cm9pZDtcbiAgdmFyIG5vZGVRID0gbm9kZTtcbiAgcmV0dXJuIGNsdXN0ZXJpbmdEaXN0YW5jZSh0eXBlLCBhdHRyaWJ1dGVzLmxlbmd0aCwgZ2V0UCwgZ2V0USwgbm9kZVAsIG5vZGVRKTtcbn07XG5cbnZhciByYW5kb21DZW50cm9pZHMgPSBmdW5jdGlvbiByYW5kb21DZW50cm9pZHMobm9kZXMsIGssIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIG5kaW0gPSBhdHRyaWJ1dGVzLmxlbmd0aDtcbiAgdmFyIG1pbiA9IG5ldyBBcnJheShuZGltKTtcbiAgdmFyIG1heCA9IG5ldyBBcnJheShuZGltKTtcbiAgdmFyIGNlbnRyb2lkcyA9IG5ldyBBcnJheShrKTtcbiAgdmFyIGNlbnRyb2lkID0gbnVsbDsgLy8gRmluZCBtaW4sIG1heCB2YWx1ZXMgZm9yIGVhY2ggYXR0cmlidXRlIGRpbWVuc2lvblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbmRpbTsgaSsrKSB7XG4gICAgbWluW2ldID0gbm9kZXMubWluKGF0dHJpYnV0ZXNbaV0pLnZhbHVlO1xuICAgIG1heFtpXSA9IG5vZGVzLm1heChhdHRyaWJ1dGVzW2ldKS52YWx1ZTtcbiAgfSAvLyBCdWlsZCBrIGNlbnRyb2lkcywgZWFjaCByZXByZXNlbnRlZCBhcyBhbiBuLWRpbSBmZWF0dXJlIHZlY3RvclxuXG5cbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBrOyBjKyspIHtcbiAgICBjZW50cm9pZCA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5kaW07IF9pKyspIHtcbiAgICAgIGNlbnRyb2lkW19pXSA9IE1hdGgucmFuZG9tKCkgKiAobWF4W19pXSAtIG1pbltfaV0pICsgbWluW19pXTsgLy8gcmFuZG9tIGluaXRpYWwgdmFsdWVcbiAgICB9XG5cbiAgICBjZW50cm9pZHNbY10gPSBjZW50cm9pZDtcbiAgfVxuXG4gIHJldHVybiBjZW50cm9pZHM7XG59O1xuXG52YXIgY2xhc3NpZnkgPSBmdW5jdGlvbiBjbGFzc2lmeShub2RlLCBjZW50cm9pZHMsIGRpc3RhbmNlLCBhdHRyaWJ1dGVzLCB0eXBlKSB7XG4gIHZhciBtaW4gPSBJbmZpbml0eTtcbiAgdmFyIGluZGV4ID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNlbnRyb2lkcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkaXN0ID0gZ2V0RGlzdChkaXN0YW5jZSwgbm9kZSwgY2VudHJvaWRzW2ldLCBhdHRyaWJ1dGVzLCB0eXBlKTtcblxuICAgIGlmIChkaXN0IDwgbWluKSB7XG4gICAgICBtaW4gPSBkaXN0O1xuICAgICAgaW5kZXggPSBpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbmRleDtcbn07XG5cbnZhciBidWlsZENsdXN0ZXIgPSBmdW5jdGlvbiBidWlsZENsdXN0ZXIoY2VudHJvaWQsIG5vZGVzLCBhc3NpZ25tZW50KSB7XG4gIHZhciBjbHVzdGVyID0gW107XG4gIHZhciBub2RlID0gbnVsbDtcblxuICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgbm9kZSA9IG5vZGVzW25dO1xuXG4gICAgaWYgKGFzc2lnbm1lbnRbbm9kZS5pZCgpXSA9PT0gY2VudHJvaWQpIHtcbiAgICAgIC8vY29uc29sZS5sb2coXCJOb2RlIFwiICsgbm9kZS5pZCgpICsgXCIgaXMgYXNzb2NpYXRlZCB3aXRoIG1lZG9pZCAjOiBcIiArIG0pO1xuICAgICAgY2x1c3Rlci5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjbHVzdGVyO1xufTtcblxudmFyIGhhdmVWYWx1ZXNDb252ZXJnZWQgPSBmdW5jdGlvbiBoYXZlVmFsdWVzQ29udmVyZ2VkKHYxLCB2Miwgc2Vuc2l0aXZpdHlUaHJlc2hvbGQpIHtcbiAgcmV0dXJuIE1hdGguYWJzKHYyIC0gdjEpIDw9IHNlbnNpdGl2aXR5VGhyZXNob2xkO1xufTtcblxudmFyIGhhdmVNYXRyaWNlc0NvbnZlcmdlZCA9IGZ1bmN0aW9uIGhhdmVNYXRyaWNlc0NvbnZlcmdlZCh2MSwgdjIsIHNlbnNpdGl2aXR5VGhyZXNob2xkKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdjEubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHYxW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgZGlmZiA9IE1hdGguYWJzKHYxW2ldW2pdIC0gdjJbaV1bal0pO1xuXG4gICAgICBpZiAoZGlmZiA+IHNlbnNpdGl2aXR5VGhyZXNob2xkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbnZhciBzZWVuQmVmb3JlID0gZnVuY3Rpb24gc2VlbkJlZm9yZShub2RlLCBtZWRvaWRzLCBuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgaWYgKG5vZGUgPT09IG1lZG9pZHNbaV0pIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxudmFyIHJhbmRvbU1lZG9pZHMgPSBmdW5jdGlvbiByYW5kb21NZWRvaWRzKG5vZGVzLCBrKSB7XG4gIHZhciBtZWRvaWRzID0gbmV3IEFycmF5KGspOyAvLyBGb3Igc21hbGwgZGF0YSBzZXRzLCB0aGUgcHJvYmFiaWxpdHkgb2YgbWVkb2lkIGNvbmZsaWN0IGlzIGdyZWF0ZXIsXG4gIC8vIHNvIHdlIG5lZWQgdG8gY2hlY2sgdG8gc2VlIGlmIHdlJ3ZlIGFscmVhZHkgc2VlbiBvciBjaG9zZSB0aGlzIG5vZGUgYmVmb3JlLlxuXG4gIGlmIChub2Rlcy5sZW5ndGggPCA1MCkge1xuICAgIC8vIFJhbmRvbWx5IHNlbGVjdCBrIG1lZG9pZHMgZnJvbSB0aGUgbiBub2Rlc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgazsgaSsrKSB7XG4gICAgICB2YXIgbm9kZSA9IG5vZGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5vZGVzLmxlbmd0aCldOyAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGNob3NlbiB0aGlzIG5vZGUgdG8gYmUgYSBtZWRvaWQsIGRvbid0IGNob29zZSBpdCBhZ2FpbiAoZm9yIHNtYWxsIGRhdGEgc2V0cykuXG4gICAgICAvLyBJbnN0ZWFkIGNob29zZSBhIGRpZmZlcmVudCByYW5kb20gbm9kZS5cblxuICAgICAgd2hpbGUgKHNlZW5CZWZvcmUobm9kZSwgbWVkb2lkcywgaSkpIHtcbiAgICAgICAgbm9kZSA9IG5vZGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5vZGVzLmxlbmd0aCldO1xuICAgICAgfVxuXG4gICAgICBtZWRvaWRzW2ldID0gbm9kZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVsYXRpdmVseSBsYXJnZSBkYXRhIHNldCwgc28gcHJldHR5IHNhZmUgdG8gbm90IGNoZWNrIGFuZCBqdXN0IHNlbGVjdCByYW5kb20gbm9kZXNcbiAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBrOyBfaTIrKykge1xuICAgICAgbWVkb2lkc1tfaTJdID0gbm9kZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbm9kZXMubGVuZ3RoKV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1lZG9pZHM7XG59O1xuXG52YXIgZmluZENvc3QgPSBmdW5jdGlvbiBmaW5kQ29zdChwb3RlbnRpYWxOZXdNZWRvaWQsIGNsdXN0ZXIsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIGNvc3QgPSAwO1xuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgY2x1c3Rlci5sZW5ndGg7IG4rKykge1xuICAgIGNvc3QgKz0gZ2V0RGlzdCgnbWFuaGF0dGFuJywgY2x1c3RlcltuXSwgcG90ZW50aWFsTmV3TWVkb2lkLCBhdHRyaWJ1dGVzLCAna01lZG9pZHMnKTtcbiAgfVxuXG4gIHJldHVybiBjb3N0O1xufTtcblxudmFyIGtNZWFucyA9IGZ1bmN0aW9uIGtNZWFucyhvcHRpb25zKSB7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICB2YXIgbm9kZSA9IG51bGw7IC8vIFNldCBwYXJhbWV0ZXJzIG9mIGFsZ29yaXRobTogIyBvZiBjbHVzdGVycywgZGlzdGFuY2UgbWV0cmljLCBldGMuXG5cbiAgdmFyIG9wdHMgPSBzZXRPcHRpb25zJDIob3B0aW9ucyk7IC8vIEJlZ2luIGstbWVhbnMgYWxnb3JpdGhtXG5cbiAgdmFyIGNsdXN0ZXJzID0gbmV3IEFycmF5KG9wdHMuayk7XG4gIHZhciBhc3NpZ25tZW50ID0ge307XG4gIHZhciBjZW50cm9pZHM7IC8vIFN0ZXAgMTogSW5pdGlhbGl6ZSBjZW50cm9pZCBwb3NpdGlvbnNcblxuICBpZiAob3B0cy50ZXN0TW9kZSkge1xuICAgIGlmICh0eXBlb2Ygb3B0cy50ZXN0Q2VudHJvaWRzID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVE9ETzogaW1wbGVtZW50IGEgc2VlZGVkIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLlxuICAgICAgb3B0cy50ZXN0Q2VudHJvaWRzO1xuICAgICAgY2VudHJvaWRzID0gcmFuZG9tQ2VudHJvaWRzKG5vZGVzLCBvcHRzLmssIG9wdHMuYXR0cmlidXRlcyk7XG4gICAgfSBlbHNlIGlmIChfdHlwZW9mKG9wdHMudGVzdENlbnRyb2lkcykgPT09ICdvYmplY3QnKSB7XG4gICAgICBjZW50cm9pZHMgPSBvcHRzLnRlc3RDZW50cm9pZHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNlbnRyb2lkcyA9IHJhbmRvbUNlbnRyb2lkcyhub2Rlcywgb3B0cy5rLCBvcHRzLmF0dHJpYnV0ZXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjZW50cm9pZHMgPSByYW5kb21DZW50cm9pZHMobm9kZXMsIG9wdHMuaywgb3B0cy5hdHRyaWJ1dGVzKTtcbiAgfVxuXG4gIHZhciBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuXG4gIHdoaWxlIChpc1N0aWxsTW92aW5nICYmIGl0ZXJhdGlvbnMgPCBvcHRzLm1heEl0ZXJhdGlvbnMpIHtcbiAgICAvLyBTdGVwIDI6IEFzc2lnbiBub2RlcyB0byB0aGUgbmVhcmVzdCBjZW50cm9pZFxuICAgIGZvciAodmFyIG4gPSAwOyBuIDwgbm9kZXMubGVuZ3RoOyBuKyspIHtcbiAgICAgIG5vZGUgPSBub2Rlc1tuXTsgLy8gRGV0ZXJtaW5lIHdoaWNoIGNsdXN0ZXIgdGhpcyBub2RlIGJlbG9uZ3MgdG86IG5vZGUgaWQgPT4gY2x1c3RlciAjXG5cbiAgICAgIGFzc2lnbm1lbnRbbm9kZS5pZCgpXSA9IGNsYXNzaWZ5KG5vZGUsIGNlbnRyb2lkcywgb3B0cy5kaXN0YW5jZSwgb3B0cy5hdHRyaWJ1dGVzLCAna01lYW5zJyk7XG4gICAgfSAvLyBTdGVwIDM6IEZvciBlYWNoIG9mIHRoZSBrIGNsdXN0ZXJzLCB1cGRhdGUgaXRzIGNlbnRyb2lkXG5cblxuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIGMgPSAwOyBjIDwgb3B0cy5rOyBjKyspIHtcbiAgICAgIC8vIEdldCBhbGwgbm9kZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyBjbHVzdGVyXG4gICAgICB2YXIgY2x1c3RlciA9IGJ1aWxkQ2x1c3RlcihjLCBub2RlcywgYXNzaWdubWVudCk7XG5cbiAgICAgIGlmIChjbHVzdGVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBJZiBjbHVzdGVyIGlzIGVtcHR5LCBicmVhayBvdXQgZWFybHkgJiBtb3ZlIHRvIG5leHQgY2x1c3RlclxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gVXBkYXRlIGNlbnRyb2lkcyBieSBjYWxjdWxhdGluZyBhdmcgb2YgYWxsIG5vZGVzIHdpdGhpbiB0aGUgY2x1c3Rlci5cblxuXG4gICAgICB2YXIgbmRpbSA9IG9wdHMuYXR0cmlidXRlcy5sZW5ndGg7XG4gICAgICB2YXIgY2VudHJvaWQgPSBjZW50cm9pZHNbY107IC8vIFsgZGltXzEsIGRpbV8yLCBkaW1fMywgLi4uICwgZGltX24gXVxuXG4gICAgICB2YXIgbmV3Q2VudHJvaWQgPSBuZXcgQXJyYXkobmRpbSk7XG4gICAgICB2YXIgc3VtID0gbmV3IEFycmF5KG5kaW0pO1xuXG4gICAgICBmb3IgKHZhciBkID0gMDsgZCA8IG5kaW07IGQrKykge1xuICAgICAgICBzdW1bZF0gPSAwLjA7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbHVzdGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgbm9kZSA9IGNsdXN0ZXJbaV07XG4gICAgICAgICAgc3VtW2RdICs9IG9wdHMuYXR0cmlidXRlc1tkXShub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld0NlbnRyb2lkW2RdID0gc3VtW2RdIC8gY2x1c3Rlci5sZW5ndGg7IC8vIENoZWNrIHRvIHNlZSBpZiBhbGdvcml0aG0gaGFzIGNvbnZlcmdlZCwgaS5lLiB3aGVuIGNlbnRyb2lkcyBubyBsb25nZXIgY2hhbmdlXG5cbiAgICAgICAgaWYgKCFoYXZlVmFsdWVzQ29udmVyZ2VkKG5ld0NlbnRyb2lkW2RdLCBjZW50cm9pZFtkXSwgb3B0cy5zZW5zaXRpdml0eVRocmVzaG9sZCkpIHtcbiAgICAgICAgICBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjZW50cm9pZHNbY10gPSBuZXdDZW50cm9pZDtcbiAgICAgIGNsdXN0ZXJzW2NdID0gY3kuY29sbGVjdGlvbihjbHVzdGVyKTtcbiAgICB9XG5cbiAgICBpdGVyYXRpb25zKys7XG4gIH1cblxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xuXG52YXIga01lZG9pZHMgPSBmdW5jdGlvbiBrTWVkb2lkcyhvcHRpb25zKSB7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICB2YXIgbm9kZSA9IG51bGw7XG4gIHZhciBvcHRzID0gc2V0T3B0aW9ucyQyKG9wdGlvbnMpOyAvLyBCZWdpbiBrLW1lZG9pZHMgYWxnb3JpdGhtXG5cbiAgdmFyIGNsdXN0ZXJzID0gbmV3IEFycmF5KG9wdHMuayk7XG4gIHZhciBtZWRvaWRzO1xuICB2YXIgYXNzaWdubWVudCA9IHt9O1xuICB2YXIgY3VyQ29zdDtcbiAgdmFyIG1pbkNvc3RzID0gbmV3IEFycmF5KG9wdHMuayk7IC8vIG1pbmltdW0gY29zdCBjb25maWd1cmF0aW9uIGZvciBlYWNoIGNsdXN0ZXJcbiAgLy8gU3RlcCAxOiBJbml0aWFsaXplIGsgbWVkb2lkc1xuXG4gIGlmIChvcHRzLnRlc3RNb2RlKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRzLnRlc3RDZW50cm9pZHMgPT09ICdudW1iZXInKSA7IGVsc2UgaWYgKF90eXBlb2Yob3B0cy50ZXN0Q2VudHJvaWRzKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIG1lZG9pZHMgPSBvcHRzLnRlc3RDZW50cm9pZHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lZG9pZHMgPSByYW5kb21NZWRvaWRzKG5vZGVzLCBvcHRzLmspO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBtZWRvaWRzID0gcmFuZG9tTWVkb2lkcyhub2Rlcywgb3B0cy5rKTtcbiAgfVxuXG4gIHZhciBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuXG4gIHdoaWxlIChpc1N0aWxsTW92aW5nICYmIGl0ZXJhdGlvbnMgPCBvcHRzLm1heEl0ZXJhdGlvbnMpIHtcbiAgICAvLyBTdGVwIDI6IEFzc2lnbiBub2RlcyB0byB0aGUgbmVhcmVzdCBtZWRvaWRcbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgICBub2RlID0gbm9kZXNbbl07IC8vIERldGVybWluZSB3aGljaCBjbHVzdGVyIHRoaXMgbm9kZSBiZWxvbmdzIHRvOiBub2RlIGlkID0+IGNsdXN0ZXIgI1xuXG4gICAgICBhc3NpZ25tZW50W25vZGUuaWQoKV0gPSBjbGFzc2lmeShub2RlLCBtZWRvaWRzLCBvcHRzLmRpc3RhbmNlLCBvcHRzLmF0dHJpYnV0ZXMsICdrTWVkb2lkcycpO1xuICAgIH1cblxuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTsgLy8gU3RlcCAzOiBGb3IgZWFjaCBtZWRvaWQgbSwgYW5kIGZvciBlYWNoIG5vZGUgYXNzb2NpYXRlZCB3aXRoIG1lZGlvZCBtLFxuICAgIC8vIHNlbGVjdCB0aGUgbm9kZSB3aXRoIHRoZSBsb3dlc3QgY29uZmlndXJhdGlvbiBjb3N0IGFzIG5ldyBtZWRvaWQuXG5cbiAgICBmb3IgKHZhciBtID0gMDsgbSA8IG1lZG9pZHMubGVuZ3RoOyBtKyspIHtcbiAgICAgIC8vIEdldCBhbGwgbm9kZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyBtZWRvaWRcbiAgICAgIHZhciBjbHVzdGVyID0gYnVpbGRDbHVzdGVyKG0sIG5vZGVzLCBhc3NpZ25tZW50KTtcblxuICAgICAgaWYgKGNsdXN0ZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIElmIGNsdXN0ZXIgaXMgZW1wdHksIGJyZWFrIG91dCBlYXJseSAmIG1vdmUgdG8gbmV4dCBjbHVzdGVyXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBtaW5Db3N0c1ttXSA9IGZpbmRDb3N0KG1lZG9pZHNbbV0sIGNsdXN0ZXIsIG9wdHMuYXR0cmlidXRlcyk7IC8vIG9yaWdpbmFsIGNvc3RcbiAgICAgIC8vIFNlbGVjdCBkaWZmZXJlbnQgbWVkb2lkIGlmIGl0cyBjb25maWd1cmF0aW9uIGhhcyB0aGUgbG93ZXN0IGNvc3RcblxuICAgICAgZm9yICh2YXIgX24gPSAwOyBfbiA8IGNsdXN0ZXIubGVuZ3RoOyBfbisrKSB7XG4gICAgICAgIGN1ckNvc3QgPSBmaW5kQ29zdChjbHVzdGVyW19uXSwgY2x1c3Rlciwgb3B0cy5hdHRyaWJ1dGVzKTtcblxuICAgICAgICBpZiAoY3VyQ29zdCA8IG1pbkNvc3RzW21dKSB7XG4gICAgICAgICAgbWluQ29zdHNbbV0gPSBjdXJDb3N0O1xuICAgICAgICAgIG1lZG9pZHNbbV0gPSBjbHVzdGVyW19uXTtcbiAgICAgICAgICBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjbHVzdGVyc1ttXSA9IGN5LmNvbGxlY3Rpb24oY2x1c3Rlcik7XG4gICAgfVxuXG4gICAgaXRlcmF0aW9ucysrO1xuICB9XG5cbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcblxudmFyIHVwZGF0ZUNlbnRyb2lkcyA9IGZ1bmN0aW9uIHVwZGF0ZUNlbnRyb2lkcyhjZW50cm9pZHMsIG5vZGVzLCBVLCB3ZWlnaHQsIG9wdHMpIHtcbiAgdmFyIG51bWVyYXRvciwgZGVub21pbmF0b3I7XG5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCBub2Rlcy5sZW5ndGg7IG4rKykge1xuICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY2VudHJvaWRzLmxlbmd0aDsgYysrKSB7XG4gICAgICB3ZWlnaHRbbl1bY10gPSBNYXRoLnBvdyhVW25dW2NdLCBvcHRzLm0pO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIF9jID0gMDsgX2MgPCBjZW50cm9pZHMubGVuZ3RoOyBfYysrKSB7XG4gICAgZm9yICh2YXIgZGltID0gMDsgZGltIDwgb3B0cy5hdHRyaWJ1dGVzLmxlbmd0aDsgZGltKyspIHtcbiAgICAgIG51bWVyYXRvciA9IDA7XG4gICAgICBkZW5vbWluYXRvciA9IDA7XG5cbiAgICAgIGZvciAodmFyIF9uMiA9IDA7IF9uMiA8IG5vZGVzLmxlbmd0aDsgX24yKyspIHtcbiAgICAgICAgbnVtZXJhdG9yICs9IHdlaWdodFtfbjJdW19jXSAqIG9wdHMuYXR0cmlidXRlc1tkaW1dKG5vZGVzW19uMl0pO1xuICAgICAgICBkZW5vbWluYXRvciArPSB3ZWlnaHRbX24yXVtfY107XG4gICAgICB9XG5cbiAgICAgIGNlbnRyb2lkc1tfY11bZGltXSA9IG51bWVyYXRvciAvIGRlbm9taW5hdG9yO1xuICAgIH1cbiAgfVxufTtcblxudmFyIHVwZGF0ZU1lbWJlcnNoaXAgPSBmdW5jdGlvbiB1cGRhdGVNZW1iZXJzaGlwKFUsIF9VLCBjZW50cm9pZHMsIG5vZGVzLCBvcHRzKSB7XG4gIC8vIFNhdmUgcHJldmlvdXMgc3RlcFxuICBmb3IgKHZhciBpID0gMDsgaSA8IFUubGVuZ3RoOyBpKyspIHtcbiAgICBfVVtpXSA9IFVbaV0uc2xpY2UoKTtcbiAgfVxuXG4gIHZhciBzdW0sIG51bWVyYXRvciwgZGVub21pbmF0b3I7XG4gIHZhciBwb3cgPSAyIC8gKG9wdHMubSAtIDEpO1xuXG4gIGZvciAodmFyIGMgPSAwOyBjIDwgY2VudHJvaWRzLmxlbmd0aDsgYysrKSB7XG4gICAgZm9yICh2YXIgbiA9IDA7IG4gPCBub2Rlcy5sZW5ndGg7IG4rKykge1xuICAgICAgc3VtID0gMDtcblxuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBjZW50cm9pZHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgLy8gYWdhaW5zdCBhbGwgb3RoZXIgY2VudHJvaWRzXG4gICAgICAgIG51bWVyYXRvciA9IGdldERpc3Qob3B0cy5kaXN0YW5jZSwgbm9kZXNbbl0sIGNlbnRyb2lkc1tjXSwgb3B0cy5hdHRyaWJ1dGVzLCAnY21lYW5zJyk7XG4gICAgICAgIGRlbm9taW5hdG9yID0gZ2V0RGlzdChvcHRzLmRpc3RhbmNlLCBub2Rlc1tuXSwgY2VudHJvaWRzW2tdLCBvcHRzLmF0dHJpYnV0ZXMsICdjbWVhbnMnKTtcbiAgICAgICAgc3VtICs9IE1hdGgucG93KG51bWVyYXRvciAvIGRlbm9taW5hdG9yLCBwb3cpO1xuICAgICAgfVxuXG4gICAgICBVW25dW2NdID0gMSAvIHN1bTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBhc3NpZ24kMSA9IGZ1bmN0aW9uIGFzc2lnbihub2RlcywgVSwgb3B0cywgY3kpIHtcbiAgdmFyIGNsdXN0ZXJzID0gbmV3IEFycmF5KG9wdHMuayk7XG5cbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBjbHVzdGVycy5sZW5ndGg7IGMrKykge1xuICAgIGNsdXN0ZXJzW2NdID0gW107XG4gIH1cblxuICB2YXIgbWF4O1xuICB2YXIgaW5kZXg7XG5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCBVLmxlbmd0aDsgbisrKSB7XG4gICAgLy8gZm9yIGVhY2ggbm9kZSAoVSBpcyBOIHggQyBtYXRyaXgpXG4gICAgbWF4ID0gLUluZmluaXR5O1xuICAgIGluZGV4ID0gLTE7IC8vIERldGVybWluZSB3aGljaCBjbHVzdGVyIHRoZSBub2RlIGlzIG1vc3QgbGlrZWx5IHRvIGJlbG9uZyBpblxuXG4gICAgZm9yICh2YXIgX2MyID0gMDsgX2MyIDwgVVswXS5sZW5ndGg7IF9jMisrKSB7XG4gICAgICBpZiAoVVtuXVtfYzJdID4gbWF4KSB7XG4gICAgICAgIG1heCA9IFVbbl1bX2MyXTtcbiAgICAgICAgaW5kZXggPSBfYzI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2x1c3RlcnNbaW5kZXhdLnB1c2gobm9kZXNbbl0pO1xuICB9IC8vIFR1cm4gZXZlcnkgYXJyYXkgaW50byBhIGNvbGxlY3Rpb24gb2Ygbm9kZXNcblxuXG4gIGZvciAodmFyIF9jMyA9IDA7IF9jMyA8IGNsdXN0ZXJzLmxlbmd0aDsgX2MzKyspIHtcbiAgICBjbHVzdGVyc1tfYzNdID0gY3kuY29sbGVjdGlvbihjbHVzdGVyc1tfYzNdKTtcbiAgfVxuXG4gIHJldHVybiBjbHVzdGVycztcbn07XG5cbnZhciBmdXp6eUNNZWFucyA9IGZ1bmN0aW9uIGZ1enp5Q01lYW5zKG9wdGlvbnMpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gIHZhciBvcHRzID0gc2V0T3B0aW9ucyQyKG9wdGlvbnMpOyAvLyBCZWdpbiBmdXp6eSBjLW1lYW5zIGFsZ29yaXRobVxuXG4gIHZhciBjbHVzdGVycztcbiAgdmFyIGNlbnRyb2lkcztcbiAgdmFyIFU7XG5cbiAgdmFyIF9VO1xuXG4gIHZhciB3ZWlnaHQ7IC8vIFN0ZXAgMTogSW5pdGlhbGl6ZSBsZXRpYWJsZXMuXG5cbiAgX1UgPSBuZXcgQXJyYXkobm9kZXMubGVuZ3RoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gTiB4IEMgbWF0cml4XG4gICAgX1VbaV0gPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgfVxuXG4gIFUgPSBuZXcgQXJyYXkobm9kZXMubGVuZ3RoKTtcblxuICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBub2Rlcy5sZW5ndGg7IF9pMysrKSB7XG4gICAgLy8gTiB4IEMgbWF0cml4XG4gICAgVVtfaTNdID0gbmV3IEFycmF5KG9wdHMuayk7XG4gIH1cblxuICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBub2Rlcy5sZW5ndGg7IF9pNCsrKSB7XG4gICAgdmFyIHRvdGFsID0gMDtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgb3B0cy5rOyBqKyspIHtcbiAgICAgIFVbX2k0XVtqXSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICB0b3RhbCArPSBVW19pNF1bal07XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IG9wdHMuazsgX2orKykge1xuICAgICAgVVtfaTRdW19qXSA9IFVbX2k0XVtfal0gLyB0b3RhbDtcbiAgICB9XG4gIH1cblxuICBjZW50cm9pZHMgPSBuZXcgQXJyYXkob3B0cy5rKTtcblxuICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBvcHRzLms7IF9pNSsrKSB7XG4gICAgY2VudHJvaWRzW19pNV0gPSBuZXcgQXJyYXkob3B0cy5hdHRyaWJ1dGVzLmxlbmd0aCk7XG4gIH1cblxuICB3ZWlnaHQgPSBuZXcgQXJyYXkobm9kZXMubGVuZ3RoKTtcblxuICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBub2Rlcy5sZW5ndGg7IF9pNisrKSB7XG4gICAgLy8gTiB4IEMgbWF0cml4XG4gICAgd2VpZ2h0W19pNl0gPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgfSAvLyBlbmQgaW5pdCBGQ01cblxuXG4gIHZhciBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuXG4gIHdoaWxlIChpc1N0aWxsTW92aW5nICYmIGl0ZXJhdGlvbnMgPCBvcHRzLm1heEl0ZXJhdGlvbnMpIHtcbiAgICBpc1N0aWxsTW92aW5nID0gZmFsc2U7IC8vIFN0ZXAgMjogQ2FsY3VsYXRlIHRoZSBjZW50cm9pZHMgZm9yIGVhY2ggc3RlcC5cblxuICAgIHVwZGF0ZUNlbnRyb2lkcyhjZW50cm9pZHMsIG5vZGVzLCBVLCB3ZWlnaHQsIG9wdHMpOyAvLyBTdGVwIDM6IFVwZGF0ZSB0aGUgcGFydGl0aW9uIG1hdHJpeCBVLlxuXG4gICAgdXBkYXRlTWVtYmVyc2hpcChVLCBfVSwgY2VudHJvaWRzLCBub2Rlcywgb3B0cyk7IC8vIFN0ZXAgNDogQ2hlY2sgZm9yIGNvbnZlcmdlbmNlLlxuXG4gICAgaWYgKCFoYXZlTWF0cmljZXNDb252ZXJnZWQoVSwgX1UsIG9wdHMuc2Vuc2l0aXZpdHlUaHJlc2hvbGQpKSB7XG4gICAgICBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpdGVyYXRpb25zKys7XG4gIH0gLy8gQXNzaWduIG5vZGVzIHRvIGNsdXN0ZXJzIHdpdGggaGlnaGVzdCBwcm9iYWJpbGl0eS5cblxuXG4gIGNsdXN0ZXJzID0gYXNzaWduJDEobm9kZXMsIFUsIG9wdHMsIGN5KTtcbiAgcmV0dXJuIHtcbiAgICBjbHVzdGVyczogY2x1c3RlcnMsXG4gICAgZGVncmVlT2ZNZW1iZXJzaGlwOiBVXG4gIH07XG59O1xuXG52YXIga0NsdXN0ZXJpbmcgPSB7XG4gIGtNZWFuczoga01lYW5zLFxuICBrTWVkb2lkczoga01lZG9pZHMsXG4gIGZ1enp5Q01lYW5zOiBmdXp6eUNNZWFucyxcbiAgZmNtOiBmdXp6eUNNZWFuc1xufTtcblxuLy8gSW1wbGVtZW50ZWQgYnkgWm9lIFhpIEB6b2V4aSBmb3IgR1NPQyAyMDE2XG52YXIgZGVmYXVsdHMkYSA9IGRlZmF1bHRzJGcoe1xuICBkaXN0YW5jZTogJ2V1Y2xpZGVhbicsXG4gIC8vIGRpc3RhbmNlIG1ldHJpYyB0byBjb21wYXJlIG5vZGVzXG4gIGxpbmthZ2U6ICdtaW4nLFxuICAvLyBsaW5rYWdlIGNyaXRlcmlvbiA6IGhvdyB0byBkZXRlcm1pbmUgdGhlIGRpc3RhbmNlIGJldHdlZW4gY2x1c3RlcnMgb2Ygbm9kZXNcbiAgbW9kZTogJ3RocmVzaG9sZCcsXG4gIC8vIG1vZGU6J3RocmVzaG9sZCcgPT4gY2x1c3RlcnMgbXVzdCBiZSB0aHJlc2hvbGQgZGlzdGFuY2UgYXBhcnRcbiAgdGhyZXNob2xkOiBJbmZpbml0eSxcbiAgLy8gdGhlIGRpc3RhbmNlIHRocmVzaG9sZFxuICAvLyBtb2RlOidkZW5kcm9ncmFtJyA9PiB0aGUgbm9kZXMgYXJlIG9yZ2FuaXNlZCBhcyBsZWF2ZXMgaW4gYSB0cmVlIChzaWJsaW5ncyBhcmUgY2xvc2UpLCBtZXJnaW5nIG1ha2VzIGNsdXN0ZXJzXG4gIGFkZERlbmRyb2dyYW06IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIGFkZCB0aGUgZGVuZHJvZ3JhbSB0byB0aGUgZ3JhcGggZm9yIHZpelxuICBkZW5kcm9ncmFtRGVwdGg6IDAsXG4gIC8vIGRlcHRoIGF0IHdoaWNoIGRlbmRyb2dyYW0gYnJhbmNoZXMgYXJlIG1lcmdlZCBpbnRvIHRoZSByZXR1cm5lZCBjbHVzdGVyc1xuICBhdHRyaWJ1dGVzOiBbXSAvLyBhcnJheSBvZiBhdHRyIGZ1bmN0aW9uc1xuXG59KTtcbnZhciBsaW5rYWdlQWxpYXNlcyA9IHtcbiAgJ3NpbmdsZSc6ICdtaW4nLFxuICAnY29tcGxldGUnOiAnbWF4J1xufTtcblxudmFyIHNldE9wdGlvbnMkMSA9IGZ1bmN0aW9uIHNldE9wdGlvbnMob3B0aW9ucykge1xuICB2YXIgb3B0cyA9IGRlZmF1bHRzJGEob3B0aW9ucyk7XG4gIHZhciBwcmVmZXJyZWRBbGlhcyA9IGxpbmthZ2VBbGlhc2VzW29wdHMubGlua2FnZV07XG5cbiAgaWYgKHByZWZlcnJlZEFsaWFzICE9IG51bGwpIHtcbiAgICBvcHRzLmxpbmthZ2UgPSBwcmVmZXJyZWRBbGlhcztcbiAgfVxuXG4gIHJldHVybiBvcHRzO1xufTtcblxudmFyIG1lcmdlQ2xvc2VzdCA9IGZ1bmN0aW9uIG1lcmdlQ2xvc2VzdChjbHVzdGVycywgaW5kZXgsIGRpc3RzLCBtaW5zLCBvcHRzKSB7XG4gIC8vIEZpbmQgdHdvIGNsb3Nlc3QgY2x1c3RlcnMgZnJvbSBjYWNoZWQgbWluc1xuICB2YXIgbWluS2V5ID0gMDtcbiAgdmFyIG1pbiA9IEluZmluaXR5O1xuICB2YXIgZGlzdDtcbiAgdmFyIGF0dHJzID0gb3B0cy5hdHRyaWJ1dGVzO1xuXG4gIHZhciBnZXREaXN0ID0gZnVuY3Rpb24gZ2V0RGlzdChuMSwgbjIpIHtcbiAgICByZXR1cm4gY2x1c3RlcmluZ0Rpc3RhbmNlKG9wdHMuZGlzdGFuY2UsIGF0dHJzLmxlbmd0aCwgZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBhdHRyc1tpXShuMSk7XG4gICAgfSwgZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBhdHRyc1tpXShuMik7XG4gICAgfSwgbjEsIG4yKTtcbiAgfTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNsdXN0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGNsdXN0ZXJzW2ldLmtleTtcbiAgICB2YXIgX2Rpc3QgPSBkaXN0c1trZXldW21pbnNba2V5XV07XG5cbiAgICBpZiAoX2Rpc3QgPCBtaW4pIHtcbiAgICAgIG1pbktleSA9IGtleTtcbiAgICAgIG1pbiA9IF9kaXN0O1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRzLm1vZGUgPT09ICd0aHJlc2hvbGQnICYmIG1pbiA+PSBvcHRzLnRocmVzaG9sZCB8fCBvcHRzLm1vZGUgPT09ICdkZW5kcm9ncmFtJyAmJiBjbHVzdGVycy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgYzEgPSBpbmRleFttaW5LZXldO1xuICB2YXIgYzIgPSBpbmRleFttaW5zW21pbktleV1dO1xuICB2YXIgbWVyZ2VkOyAvLyBNZXJnZSB0d28gY2xvc2VzdCBjbHVzdGVyc1xuXG4gIGlmIChvcHRzLm1vZGUgPT09ICdkZW5kcm9ncmFtJykge1xuICAgIG1lcmdlZCA9IHtcbiAgICAgIGxlZnQ6IGMxLFxuICAgICAgcmlnaHQ6IGMyLFxuICAgICAga2V5OiBjMS5rZXlcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIG1lcmdlZCA9IHtcbiAgICAgIHZhbHVlOiBjMS52YWx1ZS5jb25jYXQoYzIudmFsdWUpLFxuICAgICAga2V5OiBjMS5rZXlcbiAgICB9O1xuICB9XG5cbiAgY2x1c3RlcnNbYzEuaW5kZXhdID0gbWVyZ2VkO1xuICBjbHVzdGVycy5zcGxpY2UoYzIuaW5kZXgsIDEpO1xuICBpbmRleFtjMS5rZXldID0gbWVyZ2VkOyAvLyBVcGRhdGUgZGlzdGFuY2VzIHdpdGggbmV3IG1lcmdlZCBjbHVzdGVyXG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGNsdXN0ZXJzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBjdXIgPSBjbHVzdGVyc1tfaV07XG5cbiAgICBpZiAoYzEua2V5ID09PSBjdXIua2V5KSB7XG4gICAgICBkaXN0ID0gSW5maW5pdHk7XG4gICAgfSBlbHNlIGlmIChvcHRzLmxpbmthZ2UgPT09ICdtaW4nKSB7XG4gICAgICBkaXN0ID0gZGlzdHNbYzEua2V5XVtjdXIua2V5XTtcblxuICAgICAgaWYgKGRpc3RzW2MxLmtleV1bY3VyLmtleV0gPiBkaXN0c1tjMi5rZXldW2N1ci5rZXldKSB7XG4gICAgICAgIGRpc3QgPSBkaXN0c1tjMi5rZXldW2N1ci5rZXldO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0cy5saW5rYWdlID09PSAnbWF4Jykge1xuICAgICAgZGlzdCA9IGRpc3RzW2MxLmtleV1bY3VyLmtleV07XG5cbiAgICAgIGlmIChkaXN0c1tjMS5rZXldW2N1ci5rZXldIDwgZGlzdHNbYzIua2V5XVtjdXIua2V5XSkge1xuICAgICAgICBkaXN0ID0gZGlzdHNbYzIua2V5XVtjdXIua2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wdHMubGlua2FnZSA9PT0gJ21lYW4nKSB7XG4gICAgICBkaXN0ID0gKGRpc3RzW2MxLmtleV1bY3VyLmtleV0gKiBjMS5zaXplICsgZGlzdHNbYzIua2V5XVtjdXIua2V5XSAqIGMyLnNpemUpIC8gKGMxLnNpemUgKyBjMi5zaXplKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdHMubW9kZSA9PT0gJ2RlbmRyb2dyYW0nKSBkaXN0ID0gZ2V0RGlzdChjdXIudmFsdWUsIGMxLnZhbHVlKTtlbHNlIGRpc3QgPSBnZXREaXN0KGN1ci52YWx1ZVswXSwgYzEudmFsdWVbMF0pO1xuICAgIH1cblxuICAgIGRpc3RzW2MxLmtleV1bY3VyLmtleV0gPSBkaXN0c1tjdXIua2V5XVtjMS5rZXldID0gZGlzdDsgLy8gZGlzdGFuY2UgbWF0cml4IGlzIHN5bW1ldHJpY1xuICB9IC8vIFVwZGF0ZSBjYWNoZWQgbWluc1xuXG5cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgY2x1c3RlcnMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciBrZXkxID0gY2x1c3RlcnNbX2kyXS5rZXk7XG5cbiAgICBpZiAobWluc1trZXkxXSA9PT0gYzEua2V5IHx8IG1pbnNba2V5MV0gPT09IGMyLmtleSkge1xuICAgICAgdmFyIF9taW4gPSBrZXkxO1xuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNsdXN0ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBrZXkyID0gY2x1c3RlcnNbal0ua2V5O1xuXG4gICAgICAgIGlmIChkaXN0c1trZXkxXVtrZXkyXSA8IGRpc3RzW2tleTFdW19taW5dKSB7XG4gICAgICAgICAgX21pbiA9IGtleTI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbWluc1trZXkxXSA9IF9taW47XG4gICAgfVxuXG4gICAgY2x1c3RlcnNbX2kyXS5pbmRleCA9IF9pMjtcbiAgfSAvLyBDbGVhbiB1cCBtZXRhIGRhdGEgdXNlZCBmb3IgY2x1c3RlcmluZ1xuXG5cbiAgYzEua2V5ID0gYzIua2V5ID0gYzEuaW5kZXggPSBjMi5pbmRleCA9IG51bGw7XG4gIHJldHVybiB0cnVlO1xufTtcblxudmFyIGdldEFsbENoaWxkcmVuID0gZnVuY3Rpb24gZ2V0QWxsQ2hpbGRyZW4ocm9vdCwgYXJyLCBjeSkge1xuICBpZiAoIXJvb3QpIHJldHVybjtcblxuICBpZiAocm9vdC52YWx1ZSkge1xuICAgIGFyci5wdXNoKHJvb3QudmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIGlmIChyb290LmxlZnQpIGdldEFsbENoaWxkcmVuKHJvb3QubGVmdCwgYXJyKTtcbiAgICBpZiAocm9vdC5yaWdodCkgZ2V0QWxsQ2hpbGRyZW4ocm9vdC5yaWdodCwgYXJyKTtcbiAgfVxufTtcblxudmFyIGJ1aWxkRGVuZHJvZ3JhbSA9IGZ1bmN0aW9uIGJ1aWxkRGVuZHJvZ3JhbShyb290LCBjeSkge1xuICBpZiAoIXJvb3QpIHJldHVybiAnJztcblxuICBpZiAocm9vdC5sZWZ0ICYmIHJvb3QucmlnaHQpIHtcbiAgICB2YXIgbGVmdFN0ciA9IGJ1aWxkRGVuZHJvZ3JhbShyb290LmxlZnQsIGN5KTtcbiAgICB2YXIgcmlnaHRTdHIgPSBidWlsZERlbmRyb2dyYW0ocm9vdC5yaWdodCwgY3kpO1xuICAgIHZhciBub2RlID0gY3kuYWRkKHtcbiAgICAgIGdyb3VwOiAnbm9kZXMnLFxuICAgICAgZGF0YToge1xuICAgICAgICBpZDogbGVmdFN0ciArICcsJyArIHJpZ2h0U3RyXG4gICAgICB9XG4gICAgfSk7XG4gICAgY3kuYWRkKHtcbiAgICAgIGdyb3VwOiAnZWRnZXMnLFxuICAgICAgZGF0YToge1xuICAgICAgICBzb3VyY2U6IGxlZnRTdHIsXG4gICAgICAgIHRhcmdldDogbm9kZS5pZCgpXG4gICAgICB9XG4gICAgfSk7XG4gICAgY3kuYWRkKHtcbiAgICAgIGdyb3VwOiAnZWRnZXMnLFxuICAgICAgZGF0YToge1xuICAgICAgICBzb3VyY2U6IHJpZ2h0U3RyLFxuICAgICAgICB0YXJnZXQ6IG5vZGUuaWQoKVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBub2RlLmlkKCk7XG4gIH0gZWxzZSBpZiAocm9vdC52YWx1ZSkge1xuICAgIHJldHVybiByb290LnZhbHVlLmlkKCk7XG4gIH1cbn07XG5cbnZhciBidWlsZENsdXN0ZXJzRnJvbVRyZWUgPSBmdW5jdGlvbiBidWlsZENsdXN0ZXJzRnJvbVRyZWUocm9vdCwgaywgY3kpIHtcbiAgaWYgKCFyb290KSByZXR1cm4gW107XG4gIHZhciBsZWZ0ID0gW10sXG4gICAgICByaWdodCA9IFtdLFxuICAgICAgbGVhdmVzID0gW107XG5cbiAgaWYgKGsgPT09IDApIHtcbiAgICAvLyBkb24ndCBjdXQgdHJlZSwgc2ltcGx5IHJldHVybiBhbGwgbm9kZXMgYXMgMSBzaW5nbGUgY2x1c3RlclxuICAgIGlmIChyb290LmxlZnQpIGdldEFsbENoaWxkcmVuKHJvb3QubGVmdCwgbGVmdCk7XG4gICAgaWYgKHJvb3QucmlnaHQpIGdldEFsbENoaWxkcmVuKHJvb3QucmlnaHQsIHJpZ2h0KTtcbiAgICBsZWF2ZXMgPSBsZWZ0LmNvbmNhdChyaWdodCk7XG4gICAgcmV0dXJuIFtjeS5jb2xsZWN0aW9uKGxlYXZlcyldO1xuICB9IGVsc2UgaWYgKGsgPT09IDEpIHtcbiAgICAvLyBjdXQgYXQgcm9vdFxuICAgIGlmIChyb290LnZhbHVlKSB7XG4gICAgICAvLyBsZWFmIG5vZGVcbiAgICAgIHJldHVybiBbY3kuY29sbGVjdGlvbihyb290LnZhbHVlKV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyb290LmxlZnQpIGdldEFsbENoaWxkcmVuKHJvb3QubGVmdCwgbGVmdCk7XG4gICAgICBpZiAocm9vdC5yaWdodCkgZ2V0QWxsQ2hpbGRyZW4ocm9vdC5yaWdodCwgcmlnaHQpO1xuICAgICAgcmV0dXJuIFtjeS5jb2xsZWN0aW9uKGxlZnQpLCBjeS5jb2xsZWN0aW9uKHJpZ2h0KV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChyb290LnZhbHVlKSB7XG4gICAgICByZXR1cm4gW2N5LmNvbGxlY3Rpb24ocm9vdC52YWx1ZSldO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocm9vdC5sZWZ0KSBsZWZ0ID0gYnVpbGRDbHVzdGVyc0Zyb21UcmVlKHJvb3QubGVmdCwgayAtIDEsIGN5KTtcbiAgICAgIGlmIChyb290LnJpZ2h0KSByaWdodCA9IGJ1aWxkQ2x1c3RlcnNGcm9tVHJlZShyb290LnJpZ2h0LCBrIC0gMSwgY3kpO1xuICAgICAgcmV0dXJuIGxlZnQuY29uY2F0KHJpZ2h0KTtcbiAgICB9XG4gIH1cbn07XG4vKiBlc2xpbnQtZW5hYmxlICovXG5cblxudmFyIGhpZXJhcmNoaWNhbENsdXN0ZXJpbmcgPSBmdW5jdGlvbiBoaWVyYXJjaGljYWxDbHVzdGVyaW5nKG9wdGlvbnMpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7IC8vIFNldCBwYXJhbWV0ZXJzIG9mIGFsZ29yaXRobTogbGlua2FnZSB0eXBlLCBkaXN0YW5jZSBtZXRyaWMsIGV0Yy5cblxuICB2YXIgb3B0cyA9IHNldE9wdGlvbnMkMShvcHRpb25zKTtcbiAgdmFyIGF0dHJzID0gb3B0cy5hdHRyaWJ1dGVzO1xuXG4gIHZhciBnZXREaXN0ID0gZnVuY3Rpb24gZ2V0RGlzdChuMSwgbjIpIHtcbiAgICByZXR1cm4gY2x1c3RlcmluZ0Rpc3RhbmNlKG9wdHMuZGlzdGFuY2UsIGF0dHJzLmxlbmd0aCwgZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBhdHRyc1tpXShuMSk7XG4gICAgfSwgZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBhdHRyc1tpXShuMik7XG4gICAgfSwgbjEsIG4yKTtcbiAgfTsgLy8gQmVnaW4gaGllcmFyY2hpY2FsIGFsZ29yaXRobVxuXG5cbiAgdmFyIGNsdXN0ZXJzID0gW107XG4gIHZhciBkaXN0cyA9IFtdOyAvLyBkaXN0YW5jZXMgYmV0d2VlbiBlYWNoIHBhaXIgb2YgY2x1c3RlcnNcblxuICB2YXIgbWlucyA9IFtdOyAvLyBjbG9zZXN0IGNsdXN0ZXIgZm9yIGVhY2ggY2x1c3RlclxuXG4gIHZhciBpbmRleCA9IFtdOyAvLyBoYXNoIG9mIGFsbCBjbHVzdGVycyBieSBrZXlcbiAgLy8gSW4gYWdnbG9tZXJhdGl2ZSAoYm90dG9tLXVwKSBjbHVzdGVyaW5nLCBlYWNoIG5vZGUgc3RhcnRzIGFzIGl0cyBvd24gY2x1c3RlclxuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgbm9kZXMubGVuZ3RoOyBuKyspIHtcbiAgICB2YXIgY2x1c3RlciA9IHtcbiAgICAgIHZhbHVlOiBvcHRzLm1vZGUgPT09ICdkZW5kcm9ncmFtJyA/IG5vZGVzW25dIDogW25vZGVzW25dXSxcbiAgICAgIGtleTogbixcbiAgICAgIGluZGV4OiBuXG4gICAgfTtcbiAgICBjbHVzdGVyc1tuXSA9IGNsdXN0ZXI7XG4gICAgaW5kZXhbbl0gPSBjbHVzdGVyO1xuICAgIGRpc3RzW25dID0gW107XG4gICAgbWluc1tuXSA9IDA7XG4gIH0gLy8gQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIGVhY2ggcGFpciBvZiBjbHVzdGVyc1xuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDw9IGk7IGorKykge1xuICAgICAgdmFyIGRpc3QgPSB2b2lkIDA7XG5cbiAgICAgIGlmIChvcHRzLm1vZGUgPT09ICdkZW5kcm9ncmFtJykge1xuICAgICAgICAvLyBtb2RlcyBzdG9yZSBjbHVzdGVyIHZhbHVlcyBkaWZmZXJlbnRseVxuICAgICAgICBkaXN0ID0gaSA9PT0gaiA/IEluZmluaXR5IDogZ2V0RGlzdChjbHVzdGVyc1tpXS52YWx1ZSwgY2x1c3RlcnNbal0udmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzdCA9IGkgPT09IGogPyBJbmZpbml0eSA6IGdldERpc3QoY2x1c3RlcnNbaV0udmFsdWVbMF0sIGNsdXN0ZXJzW2pdLnZhbHVlWzBdKTtcbiAgICAgIH1cblxuICAgICAgZGlzdHNbaV1bal0gPSBkaXN0O1xuICAgICAgZGlzdHNbal1baV0gPSBkaXN0O1xuXG4gICAgICBpZiAoZGlzdCA8IGRpc3RzW2ldW21pbnNbaV1dKSB7XG4gICAgICAgIG1pbnNbaV0gPSBqOyAvLyBDYWNoZSBtaW5zOiBjbG9zZXN0IGNsdXN0ZXIgdG8gY2x1c3RlciBpIGlzIGNsdXN0ZXIgalxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBGaW5kIHRoZSBjbG9zZXN0IHBhaXIgb2YgY2x1c3RlcnMgYW5kIG1lcmdlIHRoZW0gaW50byBhIHNpbmdsZSBjbHVzdGVyLlxuICAvLyBVcGRhdGUgZGlzdGFuY2VzIGJldHdlZW4gbmV3IGNsdXN0ZXIgYW5kIGVhY2ggb2YgdGhlIG9sZCBjbHVzdGVycywgYW5kIGxvb3AgdW50aWwgdGhyZXNob2xkIHJlYWNoZWQuXG5cblxuICB2YXIgbWVyZ2VkID0gbWVyZ2VDbG9zZXN0KGNsdXN0ZXJzLCBpbmRleCwgZGlzdHMsIG1pbnMsIG9wdHMpO1xuXG4gIHdoaWxlIChtZXJnZWQpIHtcbiAgICBtZXJnZWQgPSBtZXJnZUNsb3Nlc3QoY2x1c3RlcnMsIGluZGV4LCBkaXN0cywgbWlucywgb3B0cyk7XG4gIH1cblxuICB2YXIgcmV0Q2x1c3RlcnM7IC8vIERlbmRyb2dyYW0gbW9kZSBidWlsZHMgdGhlIGhpZXJhcmNoeSBhbmQgYWRkcyBpbnRlcm1lZGlhcnkgbm9kZXMgKyBlZGdlc1xuICAvLyBpbiBhZGRpdGlvbiB0byByZXR1cm5pbmcgdGhlIGNsdXN0ZXJzLlxuXG4gIGlmIChvcHRzLm1vZGUgPT09ICdkZW5kcm9ncmFtJykge1xuICAgIHJldENsdXN0ZXJzID0gYnVpbGRDbHVzdGVyc0Zyb21UcmVlKGNsdXN0ZXJzWzBdLCBvcHRzLmRlbmRyb2dyYW1EZXB0aCwgY3kpO1xuICAgIGlmIChvcHRzLmFkZERlbmRyb2dyYW0pIGJ1aWxkRGVuZHJvZ3JhbShjbHVzdGVyc1swXSwgY3kpO1xuICB9IGVsc2Uge1xuICAgIC8vIFJlZ3VsYXIgbW9kZSBzaW1wbHkgcmV0dXJucyB0aGUgY2x1c3RlcnNcbiAgICByZXRDbHVzdGVycyA9IG5ldyBBcnJheShjbHVzdGVycy5sZW5ndGgpO1xuICAgIGNsdXN0ZXJzLmZvckVhY2goZnVuY3Rpb24gKGNsdXN0ZXIsIGkpIHtcbiAgICAgIC8vIENsZWFuIHVwIG1ldGEgZGF0YSB1c2VkIGZvciBjbHVzdGVyaW5nXG4gICAgICBjbHVzdGVyLmtleSA9IGNsdXN0ZXIuaW5kZXggPSBudWxsO1xuICAgICAgcmV0Q2x1c3RlcnNbaV0gPSBjeS5jb2xsZWN0aW9uKGNsdXN0ZXIudmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJldENsdXN0ZXJzO1xufTtcblxudmFyIGhpZXJhcmNoaWNhbENsdXN0ZXJpbmckMSA9IHtcbiAgaGllcmFyY2hpY2FsQ2x1c3RlcmluZzogaGllcmFyY2hpY2FsQ2x1c3RlcmluZyxcbiAgaGNhOiBoaWVyYXJjaGljYWxDbHVzdGVyaW5nXG59O1xuXG4vLyBJbXBsZW1lbnRlZCBieSBab2UgWGkgQHpvZXhpIGZvciBHU09DIDIwMTZcbnZhciBkZWZhdWx0cyQ5ID0gZGVmYXVsdHMkZyh7XG4gIGRpc3RhbmNlOiAnZXVjbGlkZWFuJyxcbiAgLy8gZGlzdGFuY2UgbWV0cmljIHRvIGNvbXBhcmUgYXR0cmlidXRlcyBiZXR3ZWVuIHR3byBub2Rlc1xuICBwcmVmZXJlbmNlOiAnbWVkaWFuJyxcbiAgLy8gc3VpdGFiaWxpdHkgb2YgYSBkYXRhIHBvaW50IHRvIHNlcnZlIGFzIGFuIGV4ZW1wbGFyXG4gIGRhbXBpbmc6IDAuOCxcbiAgLy8gZGFtcGluZyBmYWN0b3IgYmV0d2VlbiBbMC41LCAxKVxuICBtYXhJdGVyYXRpb25zOiAxMDAwLFxuICAvLyBtYXggbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gcnVuXG4gIG1pbkl0ZXJhdGlvbnM6IDEwMCxcbiAgLy8gbWluIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHJ1biBpbiBvcmRlciBmb3IgY2x1c3RlcmluZyB0byBzdG9wXG4gIGF0dHJpYnV0ZXM6IFsvLyBmdW5jdGlvbnMgdG8gcXVhbnRpZnkgdGhlIHNpbWlsYXJpdHkgYmV0d2VlbiBhbnkgdHdvIHBvaW50c1xuICAgIC8vIGUuZy4gbm9kZSA9PiBub2RlLmRhdGEoJ3dlaWdodCcpXG4gIF1cbn0pO1xuXG52YXIgc2V0T3B0aW9ucyA9IGZ1bmN0aW9uIHNldE9wdGlvbnMob3B0aW9ucykge1xuICB2YXIgZG1wID0gb3B0aW9ucy5kYW1waW5nO1xuICB2YXIgcHJlZiA9IG9wdGlvbnMucHJlZmVyZW5jZTtcblxuICBpZiAoISgwLjUgPD0gZG1wICYmIGRtcCA8IDEpKSB7XG4gICAgZXJyb3IoXCJEYW1waW5nIG11c3QgcmFuZ2Ugb24gWzAuNSwgMSkuICBHb3Q6IFwiLmNvbmNhdChkbXApKTtcbiAgfVxuXG4gIHZhciB2YWxpZFByZWZzID0gWydtZWRpYW4nLCAnbWVhbicsICdtaW4nLCAnbWF4J107XG5cbiAgaWYgKCEodmFsaWRQcmVmcy5zb21lKGZ1bmN0aW9uICh2KSB7XG4gICAgcmV0dXJuIHYgPT09IHByZWY7XG4gIH0pIHx8IG51bWJlciQxKHByZWYpKSkge1xuICAgIGVycm9yKFwiUHJlZmVyZW5jZSBtdXN0IGJlIG9uZSBvZiBbXCIuY29uY2F0KHZhbGlkUHJlZnMubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgICByZXR1cm4gXCInXCIuY29uY2F0KHAsIFwiJ1wiKTtcbiAgICB9KS5qb2luKCcsICcpLCBcIl0gb3IgYSBudW1iZXIuICBHb3Q6IFwiKS5jb25jYXQocHJlZikpO1xuICB9XG5cbiAgcmV0dXJuIGRlZmF1bHRzJDkob3B0aW9ucyk7XG59O1xuLyogZXNsaW50LWVuYWJsZSAqL1xuXG5cbnZhciBnZXRTaW1pbGFyaXR5ID0gZnVuY3Rpb24gZ2V0U2ltaWxhcml0eSh0eXBlLCBuMSwgbjIsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIGF0dHIgPSBmdW5jdGlvbiBhdHRyKG4sIGkpIHtcbiAgICByZXR1cm4gYXR0cmlidXRlc1tpXShuKTtcbiAgfTsgLy8gbmIgbmVnYXRpdmUgYmVjYXVzZSBzaW1pbGFyaXR5IHNob3VsZCBoYXZlIGFuIGludmVyc2UgcmVsYXRpb25zaGlwIHRvIGRpc3RhbmNlXG5cblxuICByZXR1cm4gLWNsdXN0ZXJpbmdEaXN0YW5jZSh0eXBlLCBhdHRyaWJ1dGVzLmxlbmd0aCwgZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gYXR0cihuMSwgaSk7XG4gIH0sIGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGF0dHIobjIsIGkpO1xuICB9LCBuMSwgbjIpO1xufTtcblxudmFyIGdldFByZWZlcmVuY2UgPSBmdW5jdGlvbiBnZXRQcmVmZXJlbmNlKFMsIHByZWZlcmVuY2UpIHtcbiAgLy8gbGFyZ2VyIHByZWZlcmVuY2UgPSBncmVhdGVyICMgb2YgY2x1c3RlcnNcbiAgdmFyIHAgPSBudWxsO1xuXG4gIGlmIChwcmVmZXJlbmNlID09PSAnbWVkaWFuJykge1xuICAgIHAgPSBtZWRpYW4oUyk7XG4gIH0gZWxzZSBpZiAocHJlZmVyZW5jZSA9PT0gJ21lYW4nKSB7XG4gICAgcCA9IG1lYW4oUyk7XG4gIH0gZWxzZSBpZiAocHJlZmVyZW5jZSA9PT0gJ21pbicpIHtcbiAgICBwID0gbWluKFMpO1xuICB9IGVsc2UgaWYgKHByZWZlcmVuY2UgPT09ICdtYXgnKSB7XG4gICAgcCA9IG1heChTKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDdXN0b20gcHJlZmVyZW5jZSBudW1iZXIsIGFzIHNldCBieSB1c2VyXG4gICAgcCA9IHByZWZlcmVuY2U7XG4gIH1cblxuICByZXR1cm4gcDtcbn07XG5cbnZhciBmaW5kRXhlbXBsYXJzID0gZnVuY3Rpb24gZmluZEV4ZW1wbGFycyhuLCBSLCBBKSB7XG4gIHZhciBpbmRpY2VzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBpZiAoUltpICogbiArIGldICsgQVtpICogbiArIGldID4gMCkge1xuICAgICAgaW5kaWNlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbmRpY2VzO1xufTtcblxudmFyIGFzc2lnbkNsdXN0ZXJzID0gZnVuY3Rpb24gYXNzaWduQ2x1c3RlcnMobiwgUywgZXhlbXBsYXJzKSB7XG4gIHZhciBjbHVzdGVycyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgdmFyIGluZGV4ID0gLTE7XG4gICAgdmFyIG1heCA9IC1JbmZpbml0eTtcblxuICAgIGZvciAodmFyIGVpID0gMDsgZWkgPCBleGVtcGxhcnMubGVuZ3RoOyBlaSsrKSB7XG4gICAgICB2YXIgZSA9IGV4ZW1wbGFyc1tlaV07XG5cbiAgICAgIGlmIChTW2kgKiBuICsgZV0gPiBtYXgpIHtcbiAgICAgICAgaW5kZXggPSBlO1xuICAgICAgICBtYXggPSBTW2kgKiBuICsgZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgY2x1c3RlcnMucHVzaChpbmRleCk7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgX2VpID0gMDsgX2VpIDwgZXhlbXBsYXJzLmxlbmd0aDsgX2VpKyspIHtcbiAgICBjbHVzdGVyc1tleGVtcGxhcnNbX2VpXV0gPSBleGVtcGxhcnNbX2VpXTtcbiAgfVxuXG4gIHJldHVybiBjbHVzdGVycztcbn07XG5cbnZhciBhc3NpZ24gPSBmdW5jdGlvbiBhc3NpZ24obiwgUywgZXhlbXBsYXJzKSB7XG4gIHZhciBjbHVzdGVycyA9IGFzc2lnbkNsdXN0ZXJzKG4sIFMsIGV4ZW1wbGFycyk7XG5cbiAgZm9yICh2YXIgZWkgPSAwOyBlaSA8IGV4ZW1wbGFycy5sZW5ndGg7IGVpKyspIHtcbiAgICB2YXIgaWkgPSBbXTtcblxuICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY2x1c3RlcnMubGVuZ3RoOyBjKyspIHtcbiAgICAgIGlmIChjbHVzdGVyc1tjXSA9PT0gZXhlbXBsYXJzW2VpXSkge1xuICAgICAgICBpaS5wdXNoKGMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBtYXhJID0gLTE7XG4gICAgdmFyIG1heFN1bSA9IC1JbmZpbml0eTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWkubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzdW0gPSAwO1xuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGlpLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHN1bSArPSBTW2lpW2pdICogbiArIGlpW2ldXTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN1bSA+IG1heFN1bSkge1xuICAgICAgICBtYXhJID0gaTtcbiAgICAgICAgbWF4U3VtID0gc3VtO1xuICAgICAgfVxuICAgIH1cblxuICAgIGV4ZW1wbGFyc1tlaV0gPSBpaVttYXhJXTtcbiAgfVxuXG4gIGNsdXN0ZXJzID0gYXNzaWduQ2x1c3RlcnMobiwgUywgZXhlbXBsYXJzKTtcbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcblxudmFyIGFmZmluaXR5UHJvcGFnYXRpb24gPSBmdW5jdGlvbiBhZmZpbml0eVByb3BhZ2F0aW9uKG9wdGlvbnMpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gIHZhciBvcHRzID0gc2V0T3B0aW9ucyhvcHRpb25zKTsgLy8gTWFwIGVhY2ggbm9kZSB0byBpdHMgcG9zaXRpb24gaW4gbm9kZSBhcnJheVxuXG4gIHZhciBpZDJwb3NpdGlvbiA9IHt9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZDJwb3NpdGlvbltub2Rlc1tpXS5pZCgpXSA9IGk7XG4gIH0gLy8gQmVnaW4gYWZmaW5pdHkgcHJvcGFnYXRpb24gYWxnb3JpdGhtXG5cblxuICB2YXIgbjsgLy8gbnVtYmVyIG9mIGRhdGEgcG9pbnRzXG5cbiAgdmFyIG4yOyAvLyBzaXplIG9mIG1hdHJpY2VzXG5cbiAgdmFyIFM7IC8vIHNpbWlsYXJpdHkgbWF0cml4ICgxRCBhcnJheSlcblxuICB2YXIgcDsgLy8gcHJlZmVyZW5jZS9zdWl0YWJpbGl0eSBvZiBhIGRhdGEgcG9pbnQgdG8gc2VydmUgYXMgYW4gZXhlbXBsYXJcblxuICB2YXIgUjsgLy8gcmVzcG9uc2liaWxpdHkgbWF0cml4ICgxRCBhcnJheSlcblxuICB2YXIgQTsgLy8gYXZhaWxhYmlsaXR5IG1hdHJpeCAoMUQgYXJyYXkpXG5cbiAgbiA9IG5vZGVzLmxlbmd0aDtcbiAgbjIgPSBuICogbjsgLy8gSW5pdGlhbGl6ZSBhbmQgYnVpbGQgUyBzaW1pbGFyaXR5IG1hdHJpeFxuXG4gIFMgPSBuZXcgQXJyYXkobjIpO1xuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBuMjsgX2krKykge1xuICAgIFNbX2ldID0gLUluZmluaXR5OyAvLyBmb3IgY2FzZXMgd2hlcmUgdHdvIGRhdGEgcG9pbnRzIHNob3VsZG4ndCBiZSBsaW5rZWQgdG9nZXRoZXJcbiAgfVxuXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG47IF9pMisrKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBuOyBqKyspIHtcbiAgICAgIGlmIChfaTIgIT09IGopIHtcbiAgICAgICAgU1tfaTIgKiBuICsgal0gPSBnZXRTaW1pbGFyaXR5KG9wdHMuZGlzdGFuY2UsIG5vZGVzW19pMl0sIG5vZGVzW2pdLCBvcHRzLmF0dHJpYnV0ZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBQbGFjZSBwcmVmZXJlbmNlcyBvbiB0aGUgZGlhZ29uYWwgb2YgU1xuXG5cbiAgcCA9IGdldFByZWZlcmVuY2UoUywgb3B0cy5wcmVmZXJlbmNlKTtcblxuICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBuOyBfaTMrKykge1xuICAgIFNbX2kzICogbiArIF9pM10gPSBwO1xuICB9IC8vIEluaXRpYWxpemUgUiByZXNwb25zaWJpbGl0eSBtYXRyaXhcblxuXG4gIFIgPSBuZXcgQXJyYXkobjIpO1xuXG4gIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG4yOyBfaTQrKykge1xuICAgIFJbX2k0XSA9IDAuMDtcbiAgfSAvLyBJbml0aWFsaXplIEEgYXZhaWxhYmlsaXR5IG1hdHJpeFxuXG5cbiAgQSA9IG5ldyBBcnJheShuMik7XG5cbiAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgbjI7IF9pNSsrKSB7XG4gICAgQVtfaTVdID0gMC4wO1xuICB9XG5cbiAgdmFyIG9sZCA9IG5ldyBBcnJheShuKTtcbiAgdmFyIFJwID0gbmV3IEFycmF5KG4pO1xuICB2YXIgc2UgPSBuZXcgQXJyYXkobik7XG5cbiAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgbjsgX2k2KyspIHtcbiAgICBvbGRbX2k2XSA9IDAuMDtcbiAgICBScFtfaTZdID0gMC4wO1xuICAgIHNlW19pNl0gPSAwO1xuICB9XG5cbiAgdmFyIGUgPSBuZXcgQXJyYXkobiAqIG9wdHMubWluSXRlcmF0aW9ucyk7XG5cbiAgZm9yICh2YXIgX2k3ID0gMDsgX2k3IDwgZS5sZW5ndGg7IF9pNysrKSB7XG4gICAgZVtfaTddID0gMDtcbiAgfVxuXG4gIHZhciBpdGVyO1xuXG4gIGZvciAoaXRlciA9IDA7IGl0ZXIgPCBvcHRzLm1heEl0ZXJhdGlvbnM7IGl0ZXIrKykge1xuICAgIC8vIG1haW4gYWxnb3JpdGhtaWMgbG9vcFxuICAgIC8vIFVwZGF0ZSBSIHJlc3BvbnNpYmlsaXR5IG1hdHJpeFxuICAgIGZvciAodmFyIF9pOCA9IDA7IF9pOCA8IG47IF9pOCsrKSB7XG4gICAgICB2YXIgbWF4ID0gLUluZmluaXR5LFxuICAgICAgICAgIG1heDIgPSAtSW5maW5pdHksXG4gICAgICAgICAgbWF4SSA9IC0xLFxuICAgICAgICAgIEFTID0gMC4wO1xuXG4gICAgICBmb3IgKHZhciBfaiA9IDA7IF9qIDwgbjsgX2orKykge1xuICAgICAgICBvbGRbX2pdID0gUltfaTggKiBuICsgX2pdO1xuICAgICAgICBBUyA9IEFbX2k4ICogbiArIF9qXSArIFNbX2k4ICogbiArIF9qXTtcblxuICAgICAgICBpZiAoQVMgPj0gbWF4KSB7XG4gICAgICAgICAgbWF4MiA9IG1heDtcbiAgICAgICAgICBtYXggPSBBUztcbiAgICAgICAgICBtYXhJID0gX2o7XG4gICAgICAgIH0gZWxzZSBpZiAoQVMgPiBtYXgyKSB7XG4gICAgICAgICAgbWF4MiA9IEFTO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF9qMiA9IDA7IF9qMiA8IG47IF9qMisrKSB7XG4gICAgICAgIFJbX2k4ICogbiArIF9qMl0gPSAoMSAtIG9wdHMuZGFtcGluZykgKiAoU1tfaTggKiBuICsgX2oyXSAtIG1heCkgKyBvcHRzLmRhbXBpbmcgKiBvbGRbX2oyXTtcbiAgICAgIH1cblxuICAgICAgUltfaTggKiBuICsgbWF4SV0gPSAoMSAtIG9wdHMuZGFtcGluZykgKiAoU1tfaTggKiBuICsgbWF4SV0gLSBtYXgyKSArIG9wdHMuZGFtcGluZyAqIG9sZFttYXhJXTtcbiAgICB9IC8vIFVwZGF0ZSBBIGF2YWlsYWJpbGl0eSBtYXRyaXhcblxuXG4gICAgZm9yICh2YXIgX2k5ID0gMDsgX2k5IDwgbjsgX2k5KyspIHtcbiAgICAgIHZhciBzdW0gPSAwO1xuXG4gICAgICBmb3IgKHZhciBfajMgPSAwOyBfajMgPCBuOyBfajMrKykge1xuICAgICAgICBvbGRbX2ozXSA9IEFbX2ozICogbiArIF9pOV07XG4gICAgICAgIFJwW19qM10gPSBNYXRoLm1heCgwLCBSW19qMyAqIG4gKyBfaTldKTtcbiAgICAgICAgc3VtICs9IFJwW19qM107XG4gICAgICB9XG5cbiAgICAgIHN1bSAtPSBScFtfaTldO1xuICAgICAgUnBbX2k5XSA9IFJbX2k5ICogbiArIF9pOV07XG4gICAgICBzdW0gKz0gUnBbX2k5XTtcblxuICAgICAgZm9yICh2YXIgX2o0ID0gMDsgX2o0IDwgbjsgX2o0KyspIHtcbiAgICAgICAgQVtfajQgKiBuICsgX2k5XSA9ICgxIC0gb3B0cy5kYW1waW5nKSAqIE1hdGgubWluKDAsIHN1bSAtIFJwW19qNF0pICsgb3B0cy5kYW1waW5nICogb2xkW19qNF07XG4gICAgICB9XG5cbiAgICAgIEFbX2k5ICogbiArIF9pOV0gPSAoMSAtIG9wdHMuZGFtcGluZykgKiAoc3VtIC0gUnBbX2k5XSkgKyBvcHRzLmRhbXBpbmcgKiBvbGRbX2k5XTtcbiAgICB9IC8vIENoZWNrIGZvciBjb252ZXJnZW5jZVxuXG5cbiAgICB2YXIgSyA9IDA7XG5cbiAgICBmb3IgKHZhciBfaTEwID0gMDsgX2kxMCA8IG47IF9pMTArKykge1xuICAgICAgdmFyIEUgPSBBW19pMTAgKiBuICsgX2kxMF0gKyBSW19pMTAgKiBuICsgX2kxMF0gPiAwID8gMSA6IDA7XG4gICAgICBlW2l0ZXIgJSBvcHRzLm1pbkl0ZXJhdGlvbnMgKiBuICsgX2kxMF0gPSBFO1xuICAgICAgSyArPSBFO1xuICAgIH1cblxuICAgIGlmIChLID4gMCAmJiAoaXRlciA+PSBvcHRzLm1pbkl0ZXJhdGlvbnMgLSAxIHx8IGl0ZXIgPT0gb3B0cy5tYXhJdGVyYXRpb25zIC0gMSkpIHtcbiAgICAgIHZhciBfc3VtID0gMDtcblxuICAgICAgZm9yICh2YXIgX2kxMSA9IDA7IF9pMTEgPCBuOyBfaTExKyspIHtcbiAgICAgICAgc2VbX2kxMV0gPSAwO1xuXG4gICAgICAgIGZvciAodmFyIF9qNSA9IDA7IF9qNSA8IG9wdHMubWluSXRlcmF0aW9uczsgX2o1KyspIHtcbiAgICAgICAgICBzZVtfaTExXSArPSBlW19qNSAqIG4gKyBfaTExXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZVtfaTExXSA9PT0gMCB8fCBzZVtfaTExXSA9PT0gb3B0cy5taW5JdGVyYXRpb25zKSB7XG4gICAgICAgICAgX3N1bSsrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChfc3VtID09PSBuKSB7XG4gICAgICAgIC8vIHRoZW4gd2UgaGF2ZSBjb252ZXJnZW5jZVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gSWRlbnRpZnkgZXhlbXBsYXJzIChjbHVzdGVyIGNlbnRlcnMpXG5cblxuICB2YXIgZXhlbXBsYXJzSW5kaWNlcyA9IGZpbmRFeGVtcGxhcnMobiwgUiwgQSk7IC8vIEFzc2lnbiBub2RlcyB0byBjbHVzdGVyc1xuXG4gIHZhciBjbHVzdGVySW5kaWNlcyA9IGFzc2lnbihuLCBTLCBleGVtcGxhcnNJbmRpY2VzKTtcbiAgdmFyIGNsdXN0ZXJzID0ge307XG5cbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBleGVtcGxhcnNJbmRpY2VzLmxlbmd0aDsgYysrKSB7XG4gICAgY2x1c3RlcnNbZXhlbXBsYXJzSW5kaWNlc1tjXV0gPSBbXTtcbiAgfVxuXG4gIGZvciAodmFyIF9pMTIgPSAwOyBfaTEyIDwgbm9kZXMubGVuZ3RoOyBfaTEyKyspIHtcbiAgICB2YXIgcG9zID0gaWQycG9zaXRpb25bbm9kZXNbX2kxMl0uaWQoKV07XG5cbiAgICB2YXIgY2x1c3RlckluZGV4ID0gY2x1c3RlckluZGljZXNbcG9zXTtcblxuICAgIGlmIChjbHVzdGVySW5kZXggIT0gbnVsbCkge1xuICAgICAgLy8gdGhlIG5vZGUgbWF5IGhhdmUgbm90IGJlZW4gYXNzaWduZWQgYSBjbHVzdGVyIGlmIG5vIHZhbGlkIGF0dHJpYnV0ZXMgd2VyZSBzcGVjaWZpZWRcbiAgICAgIGNsdXN0ZXJzW2NsdXN0ZXJJbmRleF0ucHVzaChub2Rlc1tfaTEyXSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJldENsdXN0ZXJzID0gbmV3IEFycmF5KGV4ZW1wbGFyc0luZGljZXMubGVuZ3RoKTtcblxuICBmb3IgKHZhciBfYyA9IDA7IF9jIDwgZXhlbXBsYXJzSW5kaWNlcy5sZW5ndGg7IF9jKyspIHtcbiAgICByZXRDbHVzdGVyc1tfY10gPSBjeS5jb2xsZWN0aW9uKGNsdXN0ZXJzW2V4ZW1wbGFyc0luZGljZXNbX2NdXSk7XG4gIH1cblxuICByZXR1cm4gcmV0Q2x1c3RlcnM7XG59O1xuXG52YXIgYWZmaW5pdHlQcm9wYWdhdGlvbiQxID0ge1xuICBhZmZpbml0eVByb3BhZ2F0aW9uOiBhZmZpbml0eVByb3BhZ2F0aW9uLFxuICBhcDogYWZmaW5pdHlQcm9wYWdhdGlvblxufTtcblxudmFyIGhpZXJob2x6ZXJEZWZhdWx0cyA9IGRlZmF1bHRzJGcoe1xuICByb290OiB1bmRlZmluZWQsXG4gIGRpcmVjdGVkOiBmYWxzZVxufSk7XG52YXIgZWxlc2ZuJGsgPSB7XG4gIGhpZXJob2x6ZXI6IGZ1bmN0aW9uIGhpZXJob2x6ZXIob3B0aW9ucykge1xuICAgIGlmICghcGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgcm9vdDogYXJnc1swXSxcbiAgICAgICAgZGlyZWN0ZWQ6IGFyZ3NbMV1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9oaWVyaG9semVyRGVmYXVsdHMgPSBoaWVyaG9semVyRGVmYXVsdHMob3B0aW9ucyksXG4gICAgICAgIHJvb3QgPSBfaGllcmhvbHplckRlZmF1bHRzLnJvb3QsXG4gICAgICAgIGRpcmVjdGVkID0gX2hpZXJob2x6ZXJEZWZhdWx0cy5kaXJlY3RlZDtcblxuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICB2YXIgZGZsYWcgPSBmYWxzZTtcbiAgICB2YXIgb2RkSW47XG4gICAgdmFyIG9kZE91dDtcbiAgICB2YXIgc3RhcnRWZXJ0ZXg7XG4gICAgaWYgKHJvb3QpIHN0YXJ0VmVydGV4ID0gc3RyaW5nKHJvb3QpID8gdGhpcy5maWx0ZXIocm9vdClbMF0uaWQoKSA6IHJvb3RbMF0uaWQoKTtcbiAgICB2YXIgbm9kZXMgPSB7fTtcbiAgICB2YXIgZWRnZXMgPSB7fTtcblxuICAgIGlmIChkaXJlY3RlZCkge1xuICAgICAgZWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgdmFyIGlkID0gZWxlLmlkKCk7XG5cbiAgICAgICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgICAgIHZhciBpbmQgPSBlbGUuaW5kZWdyZWUodHJ1ZSk7XG4gICAgICAgICAgdmFyIG91dGQgPSBlbGUub3V0ZGVncmVlKHRydWUpO1xuICAgICAgICAgIHZhciBkMSA9IGluZCAtIG91dGQ7XG4gICAgICAgICAgdmFyIGQyID0gb3V0ZCAtIGluZDtcblxuICAgICAgICAgIGlmIChkMSA9PSAxKSB7XG4gICAgICAgICAgICBpZiAob2RkSW4pIGRmbGFnID0gdHJ1ZTtlbHNlIG9kZEluID0gaWQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChkMiA9PSAxKSB7XG4gICAgICAgICAgICBpZiAob2RkT3V0KSBkZmxhZyA9IHRydWU7ZWxzZSBvZGRPdXQgPSBpZDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGQyID4gMSB8fCBkMSA+IDEpIHtcbiAgICAgICAgICAgIGRmbGFnID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBub2Rlc1tpZF0gPSBbXTtcbiAgICAgICAgICBlbGUub3V0Z29lcnMoKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBpZiAoZS5pc0VkZ2UoKSkgbm9kZXNbaWRdLnB1c2goZS5pZCgpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlZGdlc1tpZF0gPSBbdW5kZWZpbmVkLCBlbGUudGFyZ2V0KCkuaWQoKV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcblxuICAgICAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgICAgdmFyIGQgPSBlbGUuZGVncmVlKHRydWUpO1xuXG4gICAgICAgICAgaWYgKGQgJSAyKSB7XG4gICAgICAgICAgICBpZiAoIW9kZEluKSBvZGRJbiA9IGlkO2Vsc2UgaWYgKCFvZGRPdXQpIG9kZE91dCA9IGlkO2Vsc2UgZGZsYWcgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG5vZGVzW2lkXSA9IFtdO1xuICAgICAgICAgIGVsZS5jb25uZWN0ZWRFZGdlcygpLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBub2Rlc1tpZF0ucHVzaChlLmlkKCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVkZ2VzW2lkXSA9IFtlbGUuc291cmNlKCkuaWQoKSwgZWxlLnRhcmdldCgpLmlkKCldO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgZm91bmQ6IGZhbHNlLFxuICAgICAgdHJhaWw6IHVuZGVmaW5lZFxuICAgIH07XG4gICAgaWYgKGRmbGFnKSByZXR1cm4gcmVzdWx0O2Vsc2UgaWYgKG9kZE91dCAmJiBvZGRJbikge1xuICAgICAgaWYgKGRpcmVjdGVkKSB7XG4gICAgICAgIGlmIChzdGFydFZlcnRleCAmJiBvZGRPdXQgIT0gc3RhcnRWZXJ0ZXgpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnRWZXJ0ZXggPSBvZGRPdXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhcnRWZXJ0ZXggJiYgb2RkT3V0ICE9IHN0YXJ0VmVydGV4ICYmIG9kZEluICE9IHN0YXJ0VmVydGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIGlmICghc3RhcnRWZXJ0ZXgpIHtcbiAgICAgICAgICBzdGFydFZlcnRleCA9IG9kZE91dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXN0YXJ0VmVydGV4KSBzdGFydFZlcnRleCA9IGVsZXNbMF0uaWQoKTtcbiAgICB9XG5cbiAgICB2YXIgd2FsayA9IGZ1bmN0aW9uIHdhbGsodikge1xuICAgICAgdmFyIGN1cnJlbnROb2RlID0gdjtcbiAgICAgIHZhciBzdWJ0b3VyID0gW3ZdO1xuICAgICAgdmFyIGFkaiwgYWRqVGFpbCwgYWRqSGVhZDtcblxuICAgICAgd2hpbGUgKG5vZGVzW2N1cnJlbnROb2RlXS5sZW5ndGgpIHtcbiAgICAgICAgYWRqID0gbm9kZXNbY3VycmVudE5vZGVdLnNoaWZ0KCk7XG4gICAgICAgIGFkalRhaWwgPSBlZGdlc1thZGpdWzBdO1xuICAgICAgICBhZGpIZWFkID0gZWRnZXNbYWRqXVsxXTtcblxuICAgICAgICBpZiAoY3VycmVudE5vZGUgIT0gYWRqSGVhZCkge1xuICAgICAgICAgIG5vZGVzW2FkakhlYWRdID0gbm9kZXNbYWRqSGVhZF0uZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZSAhPSBhZGo7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY3VycmVudE5vZGUgPSBhZGpIZWFkO1xuICAgICAgICB9IGVsc2UgaWYgKCFkaXJlY3RlZCAmJiBjdXJyZW50Tm9kZSAhPSBhZGpUYWlsKSB7XG4gICAgICAgICAgbm9kZXNbYWRqVGFpbF0gPSBub2Rlc1thZGpUYWlsXS5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBlICE9IGFkajtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjdXJyZW50Tm9kZSA9IGFkalRhaWw7XG4gICAgICAgIH1cblxuICAgICAgICBzdWJ0b3VyLnVuc2hpZnQoYWRqKTtcbiAgICAgICAgc3VidG91ci51bnNoaWZ0KGN1cnJlbnROb2RlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN1YnRvdXI7XG4gICAgfTtcblxuICAgIHZhciB0cmFpbCA9IFtdO1xuICAgIHZhciBzdWJ0b3VyID0gW107XG4gICAgc3VidG91ciA9IHdhbGsoc3RhcnRWZXJ0ZXgpO1xuXG4gICAgd2hpbGUgKHN1YnRvdXIubGVuZ3RoICE9IDEpIHtcbiAgICAgIGlmIChub2Rlc1tzdWJ0b3VyWzBdXS5sZW5ndGggPT0gMCkge1xuICAgICAgICB0cmFpbC51bnNoaWZ0KGVsZXMuZ2V0RWxlbWVudEJ5SWQoc3VidG91ci5zaGlmdCgpKSk7XG4gICAgICAgIHRyYWlsLnVuc2hpZnQoZWxlcy5nZXRFbGVtZW50QnlJZChzdWJ0b3VyLnNoaWZ0KCkpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YnRvdXIgPSB3YWxrKHN1YnRvdXIuc2hpZnQoKSkuY29uY2F0KHN1YnRvdXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyYWlsLnVuc2hpZnQoZWxlcy5nZXRFbGVtZW50QnlJZChzdWJ0b3VyLnNoaWZ0KCkpKTsgLy8gZmluYWwgbm9kZVxuXG4gICAgZm9yICh2YXIgZCBpbiBub2Rlcykge1xuICAgICAgaWYgKG5vZGVzW2RdLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3VsdC5mb3VuZCA9IHRydWU7XG4gICAgcmVzdWx0LnRyYWlsID0gdGhpcy5zcGF3bih0cmFpbCwgdHJ1ZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxudmFyIGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWQgPSBmdW5jdGlvbiBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkKCkge1xuICB2YXIgZWxlcyA9IHRoaXM7XG4gIHZhciBub2RlcyA9IHt9O1xuICB2YXIgaWQgPSAwO1xuICB2YXIgZWRnZUNvdW50ID0gMDtcbiAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgdmFyIHN0YWNrID0gW107XG4gIHZhciB2aXNpdGVkRWRnZXMgPSB7fTtcblxuICB2YXIgYnVpbGRDb21wb25lbnQgPSBmdW5jdGlvbiBidWlsZENvbXBvbmVudCh4LCB5KSB7XG4gICAgdmFyIGkgPSBzdGFjay5sZW5ndGggLSAxO1xuICAgIHZhciBjdXRzZXQgPSBbXTtcbiAgICB2YXIgY29tcG9uZW50ID0gZWxlcy5zcGF3bigpO1xuXG4gICAgd2hpbGUgKHN0YWNrW2ldLnggIT0geCB8fCBzdGFja1tpXS55ICE9IHkpIHtcbiAgICAgIGN1dHNldC5wdXNoKHN0YWNrLnBvcCgpLmVkZ2UpO1xuICAgICAgaS0tO1xuICAgIH1cblxuICAgIGN1dHNldC5wdXNoKHN0YWNrLnBvcCgpLmVkZ2UpO1xuICAgIGN1dHNldC5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICB2YXIgY29ubmVjdGVkTm9kZXMgPSBlZGdlLmNvbm5lY3RlZE5vZGVzKCkuaW50ZXJzZWN0aW9uKGVsZXMpO1xuICAgICAgY29tcG9uZW50Lm1lcmdlKGVkZ2UpO1xuICAgICAgY29ubmVjdGVkTm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgbm9kZUlkID0gbm9kZS5pZCgpO1xuICAgICAgICB2YXIgY29ubmVjdGVkRWRnZXMgPSBub2RlLmNvbm5lY3RlZEVkZ2VzKCkuaW50ZXJzZWN0aW9uKGVsZXMpO1xuICAgICAgICBjb21wb25lbnQubWVyZ2Uobm9kZSk7XG5cbiAgICAgICAgaWYgKCFub2Rlc1tub2RlSWRdLmN1dFZlcnRleCkge1xuICAgICAgICAgIGNvbXBvbmVudC5tZXJnZShjb25uZWN0ZWRFZGdlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tcG9uZW50Lm1lcmdlKGNvbm5lY3RlZEVkZ2VzLmZpbHRlcihmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgICAgcmV0dXJuIGVkZ2UuaXNMb29wKCk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgfTtcblxuICB2YXIgYmljb25uZWN0ZWRTZWFyY2ggPSBmdW5jdGlvbiBiaWNvbm5lY3RlZFNlYXJjaChyb290LCBjdXJyZW50Tm9kZSwgcGFyZW50KSB7XG4gICAgaWYgKHJvb3QgPT09IHBhcmVudCkgZWRnZUNvdW50ICs9IDE7XG4gICAgbm9kZXNbY3VycmVudE5vZGVdID0ge1xuICAgICAgaWQ6IGlkLFxuICAgICAgbG93OiBpZCsrLFxuICAgICAgY3V0VmVydGV4OiBmYWxzZVxuICAgIH07XG4gICAgdmFyIGVkZ2VzID0gZWxlcy5nZXRFbGVtZW50QnlJZChjdXJyZW50Tm9kZSkuY29ubmVjdGVkRWRnZXMoKS5pbnRlcnNlY3Rpb24oZWxlcyk7XG5cbiAgICBpZiAoZWRnZXMuc2l6ZSgpID09PSAwKSB7XG4gICAgICBjb21wb25lbnRzLnB1c2goZWxlcy5zcGF3bihlbGVzLmdldEVsZW1lbnRCeUlkKGN1cnJlbnROb2RlKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc291cmNlSWQsIHRhcmdldElkLCBvdGhlck5vZGVJZCwgZWRnZUlkO1xuICAgICAgZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICBzb3VyY2VJZCA9IGVkZ2Uuc291cmNlKCkuaWQoKTtcbiAgICAgICAgdGFyZ2V0SWQgPSBlZGdlLnRhcmdldCgpLmlkKCk7XG4gICAgICAgIG90aGVyTm9kZUlkID0gc291cmNlSWQgPT09IGN1cnJlbnROb2RlID8gdGFyZ2V0SWQgOiBzb3VyY2VJZDtcblxuICAgICAgICBpZiAob3RoZXJOb2RlSWQgIT09IHBhcmVudCkge1xuICAgICAgICAgIGVkZ2VJZCA9IGVkZ2UuaWQoKTtcblxuICAgICAgICAgIGlmICghdmlzaXRlZEVkZ2VzW2VkZ2VJZF0pIHtcbiAgICAgICAgICAgIHZpc2l0ZWRFZGdlc1tlZGdlSWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICB4OiBjdXJyZW50Tm9kZSxcbiAgICAgICAgICAgICAgeTogb3RoZXJOb2RlSWQsXG4gICAgICAgICAgICAgIGVkZ2U6IGVkZ2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghKG90aGVyTm9kZUlkIGluIG5vZGVzKSkge1xuICAgICAgICAgICAgYmljb25uZWN0ZWRTZWFyY2gocm9vdCwgb3RoZXJOb2RlSWQsIGN1cnJlbnROb2RlKTtcbiAgICAgICAgICAgIG5vZGVzW2N1cnJlbnROb2RlXS5sb3cgPSBNYXRoLm1pbihub2Rlc1tjdXJyZW50Tm9kZV0ubG93LCBub2Rlc1tvdGhlck5vZGVJZF0ubG93KTtcblxuICAgICAgICAgICAgaWYgKG5vZGVzW2N1cnJlbnROb2RlXS5pZCA8PSBub2Rlc1tvdGhlck5vZGVJZF0ubG93KSB7XG4gICAgICAgICAgICAgIG5vZGVzW2N1cnJlbnROb2RlXS5jdXRWZXJ0ZXggPSB0cnVlO1xuICAgICAgICAgICAgICBidWlsZENvbXBvbmVudChjdXJyZW50Tm9kZSwgb3RoZXJOb2RlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub2Rlc1tjdXJyZW50Tm9kZV0ubG93ID0gTWF0aC5taW4obm9kZXNbY3VycmVudE5vZGVdLmxvdywgbm9kZXNbb3RoZXJOb2RlSWRdLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBlbGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIHZhciBub2RlSWQgPSBlbGUuaWQoKTtcblxuICAgICAgaWYgKCEobm9kZUlkIGluIG5vZGVzKSkge1xuICAgICAgICBlZGdlQ291bnQgPSAwO1xuICAgICAgICBiaWNvbm5lY3RlZFNlYXJjaChub2RlSWQsIG5vZGVJZCk7XG4gICAgICAgIG5vZGVzW25vZGVJZF0uY3V0VmVydGV4ID0gZWRnZUNvdW50ID4gMTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICB2YXIgY3V0VmVydGljZXMgPSBPYmplY3Qua2V5cyhub2RlcykuZmlsdGVyKGZ1bmN0aW9uIChpZCkge1xuICAgIHJldHVybiBub2Rlc1tpZF0uY3V0VmVydGV4O1xuICB9KS5tYXAoZnVuY3Rpb24gKGlkKSB7XG4gICAgcmV0dXJuIGVsZXMuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBjdXQ6IGVsZXMuc3Bhd24oY3V0VmVydGljZXMpLFxuICAgIGNvbXBvbmVudHM6IGNvbXBvbmVudHNcbiAgfTtcbn07XG5cbnZhciBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkJDEgPSB7XG4gIGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWQ6IGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWQsXG4gIGh0YmM6IGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWQsXG4gIGh0YjogaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZCxcbiAgaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZENvbXBvbmVudHM6IGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWRcbn07XG5cbnZhciB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZCA9IGZ1bmN0aW9uIHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkKCkge1xuICB2YXIgZWxlcyA9IHRoaXM7XG4gIHZhciBub2RlcyA9IHt9O1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgY29tcG9uZW50cyA9IFtdO1xuICB2YXIgc3RhY2sgPSBbXTtcbiAgdmFyIGN1dCA9IGVsZXMuc3Bhd24oZWxlcyk7XG5cbiAgdmFyIHN0cm9uZ2x5Q29ubmVjdGVkU2VhcmNoID0gZnVuY3Rpb24gc3Ryb25nbHlDb25uZWN0ZWRTZWFyY2goc291cmNlTm9kZUlkKSB7XG4gICAgc3RhY2sucHVzaChzb3VyY2VOb2RlSWQpO1xuICAgIG5vZGVzW3NvdXJjZU5vZGVJZF0gPSB7XG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBsb3c6IGluZGV4KyssXG4gICAgICBleHBsb3JlZDogZmFsc2VcbiAgICB9O1xuICAgIHZhciBjb25uZWN0ZWRFZGdlcyA9IGVsZXMuZ2V0RWxlbWVudEJ5SWQoc291cmNlTm9kZUlkKS5jb25uZWN0ZWRFZGdlcygpLmludGVyc2VjdGlvbihlbGVzKTtcbiAgICBjb25uZWN0ZWRFZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICB2YXIgdGFyZ2V0Tm9kZUlkID0gZWRnZS50YXJnZXQoKS5pZCgpO1xuXG4gICAgICBpZiAodGFyZ2V0Tm9kZUlkICE9PSBzb3VyY2VOb2RlSWQpIHtcbiAgICAgICAgaWYgKCEodGFyZ2V0Tm9kZUlkIGluIG5vZGVzKSkge1xuICAgICAgICAgIHN0cm9uZ2x5Q29ubmVjdGVkU2VhcmNoKHRhcmdldE5vZGVJZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5vZGVzW3RhcmdldE5vZGVJZF0uZXhwbG9yZWQpIHtcbiAgICAgICAgICBub2Rlc1tzb3VyY2VOb2RlSWRdLmxvdyA9IE1hdGgubWluKG5vZGVzW3NvdXJjZU5vZGVJZF0ubG93LCBub2Rlc1t0YXJnZXROb2RlSWRdLmxvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChub2Rlc1tzb3VyY2VOb2RlSWRdLmluZGV4ID09PSBub2Rlc1tzb3VyY2VOb2RlSWRdLmxvdykge1xuICAgICAgdmFyIGNvbXBvbmVudE5vZGVzID0gZWxlcy5zcGF3bigpO1xuXG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIHZhciBub2RlSWQgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgY29tcG9uZW50Tm9kZXMubWVyZ2UoZWxlcy5nZXRFbGVtZW50QnlJZChub2RlSWQpKTtcbiAgICAgICAgbm9kZXNbbm9kZUlkXS5sb3cgPSBub2Rlc1tzb3VyY2VOb2RlSWRdLmluZGV4O1xuICAgICAgICBub2Rlc1tub2RlSWRdLmV4cGxvcmVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAobm9kZUlkID09PSBzb3VyY2VOb2RlSWQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgY29tcG9uZW50RWRnZXMgPSBjb21wb25lbnROb2Rlcy5lZGdlc1dpdGgoY29tcG9uZW50Tm9kZXMpO1xuICAgICAgdmFyIGNvbXBvbmVudCA9IGNvbXBvbmVudE5vZGVzLm1lcmdlKGNvbXBvbmVudEVkZ2VzKTtcbiAgICAgIGNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICAgICAgY3V0ID0gY3V0LmRpZmZlcmVuY2UoY29tcG9uZW50KTtcbiAgICB9XG4gIH07XG5cbiAgZWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICB2YXIgbm9kZUlkID0gZWxlLmlkKCk7XG5cbiAgICAgIGlmICghKG5vZGVJZCBpbiBub2RlcykpIHtcbiAgICAgICAgc3Ryb25nbHlDb25uZWN0ZWRTZWFyY2gobm9kZUlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGN1dDogY3V0LFxuICAgIGNvbXBvbmVudHM6IGNvbXBvbmVudHNcbiAgfTtcbn07XG5cbnZhciB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZCQxID0ge1xuICB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZDogdGFyamFuU3Ryb25nbHlDb25uZWN0ZWQsXG4gIHRzYzogdGFyamFuU3Ryb25nbHlDb25uZWN0ZWQsXG4gIHRzY2M6IHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkLFxuICB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZENvbXBvbmVudHM6IHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkXG59O1xuXG52YXIgZWxlc2ZuJGogPSB7fTtcbltlbGVzZm4kdiwgZWxlc2ZuJHUsIGVsZXNmbiR0LCBlbGVzZm4kcywgZWxlc2ZuJHIsIGVsZXNmbiRxLCBlbGVzZm4kcCwgZWxlc2ZuJG8sIGVsZXNmbiRuLCBlbGVzZm4kbSwgZWxlc2ZuJGwsIG1hcmtvdkNsdXN0ZXJpbmckMSwga0NsdXN0ZXJpbmcsIGhpZXJhcmNoaWNhbENsdXN0ZXJpbmckMSwgYWZmaW5pdHlQcm9wYWdhdGlvbiQxLCBlbGVzZm4kaywgaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZCQxLCB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZCQxXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoZWxlc2ZuJGosIHByb3BzKTtcbn0pO1xuXG4vKiFcbkVtYmVkZGFibGUgTWluaW11bSBTdHJpY3RseS1Db21wbGlhbnQgUHJvbWlzZXMvQSsgMS4xLjEgVGhlbmFibGVcbkNvcHlyaWdodCAoYykgMjAxMy0yMDE0IFJhbGYgUy4gRW5nZWxzY2hhbGwgKGh0dHA6Ly9lbmdlbHNjaGFsbC5jb20pXG5MaWNlbnNlZCB1bmRlciBUaGUgTUlUIExpY2Vuc2UgKGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQpXG4qL1xuXG4vKiAgcHJvbWlzZSBzdGF0ZXMgW1Byb21pc2VzL0ErIDIuMV0gICovXG52YXIgU1RBVEVfUEVORElORyA9IDA7XG4vKiAgW1Byb21pc2VzL0ErIDIuMS4xXSAgKi9cblxudmFyIFNUQVRFX0ZVTEZJTExFRCA9IDE7XG4vKiAgW1Byb21pc2VzL0ErIDIuMS4yXSAgKi9cblxudmFyIFNUQVRFX1JFSkVDVEVEID0gMjtcbi8qICBbUHJvbWlzZXMvQSsgMi4xLjNdICAqL1xuXG4vKiAgcHJvbWlzZSBvYmplY3QgY29uc3RydWN0b3IgICovXG5cbnZhciBhcGkgPSBmdW5jdGlvbiBhcGkoZXhlY3V0b3IpIHtcbiAgLyogIG9wdGlvbmFsbHkgc3VwcG9ydCBub24tY29uc3RydWN0b3IvcGxhaW4tZnVuY3Rpb24gY2FsbCAgKi9cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIGFwaSkpIHJldHVybiBuZXcgYXBpKGV4ZWN1dG9yKTtcbiAgLyogIGluaXRpYWxpemUgb2JqZWN0ICAqL1xuXG4gIHRoaXMuaWQgPSAnVGhlbmFibGUvMS4wLjcnO1xuICB0aGlzLnN0YXRlID0gU1RBVEVfUEVORElORztcbiAgLyogIGluaXRpYWwgc3RhdGUgICovXG5cbiAgdGhpcy5mdWxmaWxsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIC8qICBpbml0aWFsIHZhbHVlICAqL1xuXG4gIC8qICBbUHJvbWlzZXMvQSsgMS4zLCAyLjEuMi4yXSAgKi9cblxuICB0aGlzLnJlamVjdFJlYXNvbiA9IHVuZGVmaW5lZDtcbiAgLyogIGluaXRpYWwgcmVhc29uICovXG5cbiAgLyogIFtQcm9taXNlcy9BKyAxLjUsIDIuMS4zLjJdICAqL1xuXG4gIHRoaXMub25GdWxmaWxsZWQgPSBbXTtcbiAgLyogIGluaXRpYWwgaGFuZGxlcnMgICovXG5cbiAgdGhpcy5vblJlamVjdGVkID0gW107XG4gIC8qICBpbml0aWFsIGhhbmRsZXJzICAqL1xuXG4gIC8qICBwcm92aWRlIG9wdGlvbmFsIGluZm9ybWF0aW9uLWhpZGluZyBwcm94eSAgKi9cblxuICB0aGlzLnByb3h5ID0ge1xuICAgIHRoZW46IHRoaXMudGhlbi5iaW5kKHRoaXMpXG4gIH07XG4gIC8qICBzdXBwb3J0IG9wdGlvbmFsIGV4ZWN1dG9yIGZ1bmN0aW9uICAqL1xuXG4gIGlmICh0eXBlb2YgZXhlY3V0b3IgPT09ICdmdW5jdGlvbicpIGV4ZWN1dG9yLmNhbGwodGhpcywgdGhpcy5mdWxmaWxsLmJpbmQodGhpcyksIHRoaXMucmVqZWN0LmJpbmQodGhpcykpO1xufTtcbi8qICBwcm9taXNlIEFQSSBtZXRob2RzICAqL1xuXG5cbmFwaS5wcm90b3R5cGUgPSB7XG4gIC8qICBwcm9taXNlIHJlc29sdmluZyBtZXRob2RzICAqL1xuICBmdWxmaWxsOiBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7XG4gICAgcmV0dXJuIGRlbGl2ZXIodGhpcywgU1RBVEVfRlVMRklMTEVELCAnZnVsZmlsbFZhbHVlJywgdmFsdWUpO1xuICB9LFxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkge1xuICAgIHJldHVybiBkZWxpdmVyKHRoaXMsIFNUQVRFX1JFSkVDVEVELCAncmVqZWN0UmVhc29uJywgdmFsdWUpO1xuICB9LFxuXG4gIC8qICBcIlRoZSB0aGVuIE1ldGhvZFwiIFtQcm9taXNlcy9BKyAxLjEsIDEuMiwgMi4yXSAgKi9cbiAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgIHZhciBjdXJyID0gdGhpcztcbiAgICB2YXIgbmV4dCA9IG5ldyBhcGkoKTtcbiAgICAvKiAgW1Byb21pc2VzL0ErIDIuMi43XSAgKi9cblxuICAgIGN1cnIub25GdWxmaWxsZWQucHVzaChyZXNvbHZlcihvbkZ1bGZpbGxlZCwgbmV4dCwgJ2Z1bGZpbGwnKSk7XG4gICAgLyogIFtQcm9taXNlcy9BKyAyLjIuMi8yLjIuNl0gICovXG5cbiAgICBjdXJyLm9uUmVqZWN0ZWQucHVzaChyZXNvbHZlcihvblJlamVjdGVkLCBuZXh0LCAncmVqZWN0JykpO1xuICAgIC8qICBbUHJvbWlzZXMvQSsgMi4yLjMvMi4yLjZdICAqL1xuXG4gICAgZXhlY3V0ZShjdXJyKTtcbiAgICByZXR1cm4gbmV4dC5wcm94eTtcbiAgICAvKiAgW1Byb21pc2VzL0ErIDIuMi43LCAzLjNdICAqL1xuICB9XG59O1xuLyogIGRlbGl2ZXIgYW4gYWN0aW9uICAqL1xuXG52YXIgZGVsaXZlciA9IGZ1bmN0aW9uIGRlbGl2ZXIoY3Vyciwgc3RhdGUsIG5hbWUsIHZhbHVlKSB7XG4gIGlmIChjdXJyLnN0YXRlID09PSBTVEFURV9QRU5ESU5HKSB7XG4gICAgY3Vyci5zdGF0ZSA9IHN0YXRlO1xuICAgIC8qICBbUHJvbWlzZXMvQSsgMi4xLjIuMSwgMi4xLjMuMV0gICovXG5cbiAgICBjdXJyW25hbWVdID0gdmFsdWU7XG4gICAgLyogIFtQcm9taXNlcy9BKyAyLjEuMi4yLCAyLjEuMy4yXSAgKi9cblxuICAgIGV4ZWN1dGUoY3Vycik7XG4gIH1cblxuICByZXR1cm4gY3Vycjtcbn07XG4vKiAgZXhlY3V0ZSBhbGwgaGFuZGxlcnMgICovXG5cblxudmFyIGV4ZWN1dGUgPSBmdW5jdGlvbiBleGVjdXRlKGN1cnIpIHtcbiAgaWYgKGN1cnIuc3RhdGUgPT09IFNUQVRFX0ZVTEZJTExFRCkgZXhlY3V0ZV9oYW5kbGVycyhjdXJyLCAnb25GdWxmaWxsZWQnLCBjdXJyLmZ1bGZpbGxWYWx1ZSk7ZWxzZSBpZiAoY3Vyci5zdGF0ZSA9PT0gU1RBVEVfUkVKRUNURUQpIGV4ZWN1dGVfaGFuZGxlcnMoY3VyciwgJ29uUmVqZWN0ZWQnLCBjdXJyLnJlamVjdFJlYXNvbik7XG59O1xuLyogIGV4ZWN1dGUgcGFydGljdWxhciBzZXQgb2YgaGFuZGxlcnMgICovXG5cblxudmFyIGV4ZWN1dGVfaGFuZGxlcnMgPSBmdW5jdGlvbiBleGVjdXRlX2hhbmRsZXJzKGN1cnIsIG5hbWUsIHZhbHVlKSB7XG4gIC8qIGdsb2JhbCBzZXRJbW1lZGlhdGU6IHRydWUgKi9cblxuICAvKiBnbG9iYWwgc2V0VGltZW91dDogdHJ1ZSAqL1xuXG4gIC8qICBzaG9ydC1jaXJjdWl0IHByb2Nlc3NpbmcgICovXG4gIGlmIChjdXJyW25hbWVdLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAvKiAgaXRlcmF0ZSBvdmVyIGFsbCBoYW5kbGVycywgZXhhY3RseSBvbmNlICAqL1xuXG4gIHZhciBoYW5kbGVycyA9IGN1cnJbbmFtZV07XG4gIGN1cnJbbmFtZV0gPSBbXTtcbiAgLyogIFtQcm9taXNlcy9BKyAyLjIuMi4zLCAyLjIuMy4zXSAgKi9cblxuICB2YXIgZnVuYyA9IGZ1bmN0aW9uIGZ1bmMoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaGFuZGxlcnNbaV0odmFsdWUpO1xuICAgIH1cbiAgICAvKiAgW1Byb21pc2VzL0ErIDIuMi41XSAgKi9cblxuICB9O1xuICAvKiAgZXhlY3V0ZSBwcm9jZWR1cmUgYXN5bmNocm9ub3VzbHkgICovXG5cbiAgLyogIFtQcm9taXNlcy9BKyAyLjIuNCwgMy4xXSAgKi9cblxuXG4gIGlmICh0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSAnZnVuY3Rpb24nKSBzZXRJbW1lZGlhdGUoZnVuYyk7ZWxzZSBzZXRUaW1lb3V0KGZ1bmMsIDApO1xufTtcbi8qICBnZW5lcmF0ZSBhIHJlc29sdmVyIGZ1bmN0aW9uICAqL1xuXG5cbnZhciByZXNvbHZlciA9IGZ1bmN0aW9uIHJlc29sdmVyKGNiLCBuZXh0LCBtZXRob2QpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpXG4gICAgICAvKiAgW1Byb21pc2VzL0ErIDIuMi4xLCAyLjIuNy4zLCAyLjIuNy40XSAgKi9cbiAgICAgIG5leHRbbWV0aG9kXS5jYWxsKG5leHQsIHZhbHVlKTtcbiAgICAgIC8qICBbUHJvbWlzZXMvQSsgMi4yLjcuMywgMi4yLjcuNF0gICovXG4gICAgZWxzZSB7XG4gICAgICB2YXIgcmVzdWx0O1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBjYih2YWx1ZSk7XG4gICAgICB9XG4gICAgICAvKiAgW1Byb21pc2VzL0ErIDIuMi4yLjEsIDIuMi4zLjEsIDIuMi41LCAzLjJdICAqL1xuICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgbmV4dC5yZWplY3QoZSk7XG4gICAgICAgIC8qICBbUHJvbWlzZXMvQSsgMi4yLjcuMl0gICovXG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXNvbHZlKG5leHQsIHJlc3VsdCk7XG4gICAgICAvKiAgW1Byb21pc2VzL0ErIDIuMi43LjFdICAqL1xuICAgIH1cbiAgfTtcbn07XG4vKiAgXCJQcm9taXNlIFJlc29sdXRpb24gUHJvY2VkdXJlXCIgICovXG5cbi8qICBbUHJvbWlzZXMvQSsgMi4zXSAgKi9cblxuXG52YXIgcmVzb2x2ZSA9IGZ1bmN0aW9uIHJlc29sdmUocHJvbWlzZSwgeCkge1xuICAvKiAgc2FuaXR5IGNoZWNrIGFyZ3VtZW50cyAgKi9cblxuICAvKiAgW1Byb21pc2VzL0ErIDIuMy4xXSAgKi9cbiAgaWYgKHByb21pc2UgPT09IHggfHwgcHJvbWlzZS5wcm94eSA9PT0geCkge1xuICAgIHByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ2Nhbm5vdCByZXNvbHZlIHByb21pc2Ugd2l0aCBpdHNlbGYnKSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8qICBzdXJnaWNhbGx5IGNoZWNrIGZvciBhIFwidGhlblwiIG1ldGhvZFxuICAgIChtYWlubHkgdG8ganVzdCBjYWxsIHRoZSBcImdldHRlclwiIG9mIFwidGhlblwiIG9ubHkgb25jZSkgICovXG5cblxuICB2YXIgdGhlbjtcblxuICBpZiAoX3R5cGVvZih4KSA9PT0gJ29iamVjdCcgJiYgeCAhPT0gbnVsbCB8fCB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICB0aGVuID0geC50aGVuO1xuICAgIH1cbiAgICAvKiAgW1Byb21pc2VzL0ErIDIuMy4zLjEsIDMuNV0gICovXG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgIHByb21pc2UucmVqZWN0KGUpO1xuICAgICAgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4yXSAgKi9cblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICAvKiAgaGFuZGxlIG93biBUaGVuYWJsZXMgICAgW1Byb21pc2VzL0ErIDIuMy4yXVxuICAgIGFuZCBzaW1pbGFyIFwidGhlbmFibGVzXCIgW1Byb21pc2VzL0ErIDIuMy4zXSAgKi9cblxuXG4gIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciByZXNvbHZlZCA9IGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8qICBjYWxsIHJldHJpZXZlZCBcInRoZW5cIiBtZXRob2QgKi9cblxuICAgICAgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zXSAgKi9cbiAgICAgIHRoZW4uY2FsbCh4LFxuICAgICAgLyogIHJlc29sdmVQcm9taXNlICAqL1xuXG4gICAgICAvKiAgW1Byb21pc2VzL0ErIDIuMy4zLjMuMV0gICovXG4gICAgICBmdW5jdGlvbiAoeSkge1xuICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgcmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAvKiAgW1Byb21pc2VzL0ErIDIuMy4zLjMuM10gICovXG5cbiAgICAgICAgaWYgKHkgPT09IHgpXG4gICAgICAgICAgLyogIFtQcm9taXNlcy9BKyAzLjZdICAqL1xuICAgICAgICAgIHByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ2NpcmN1bGFyIHRoZW5hYmxlIGNoYWluJykpO2Vsc2UgcmVzb2x2ZShwcm9taXNlLCB5KTtcbiAgICAgIH0sXG4gICAgICAvKiAgcmVqZWN0UHJvbWlzZSAgKi9cblxuICAgICAgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjJdICAqL1xuICAgICAgZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm47XG4gICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjNdICAqL1xuXG4gICAgICAgIHByb21pc2UucmVqZWN0KHIpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKCFyZXNvbHZlZClcbiAgICAgICAgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjNdICAqL1xuICAgICAgICBwcm9taXNlLnJlamVjdChlKTtcbiAgICAgIC8qICBbUHJvbWlzZXMvQSsgMi4zLjMuMy40XSAgKi9cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cbiAgLyogIGhhbmRsZSBvdGhlciB2YWx1ZXMgICovXG5cblxuICBwcm9taXNlLmZ1bGZpbGwoeCk7XG4gIC8qICBbUHJvbWlzZXMvQSsgMi4zLjQsIDIuMy4zLjRdICAqL1xufTsgLy8gc28gd2UgYWx3YXlzIGhhdmUgUHJvbWlzZS5hbGwoKVxuXG5cbmFwaS5hbGwgPSBmdW5jdGlvbiAocHMpIHtcbiAgcmV0dXJuIG5ldyBhcGkoZnVuY3Rpb24gKHJlc29sdmVBbGwsIHJlamVjdEFsbCkge1xuICAgIHZhciB2YWxzID0gbmV3IEFycmF5KHBzLmxlbmd0aCk7XG4gICAgdmFyIGRvbmVDb3VudCA9IDA7XG5cbiAgICB2YXIgZnVsZmlsbCA9IGZ1bmN0aW9uIGZ1bGZpbGwoaSwgdmFsKSB7XG4gICAgICB2YWxzW2ldID0gdmFsO1xuICAgICAgZG9uZUNvdW50Kys7XG5cbiAgICAgIGlmIChkb25lQ291bnQgPT09IHBzLmxlbmd0aCkge1xuICAgICAgICByZXNvbHZlQWxsKHZhbHMpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgdmFyIHAgPSBwc1tpXTtcbiAgICAgICAgdmFyIGlzUHJvbWlzZSA9IHAgIT0gbnVsbCAmJiBwLnRoZW4gIT0gbnVsbDtcblxuICAgICAgICBpZiAoaXNQcm9taXNlKSB7XG4gICAgICAgICAgcC50aGVuKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgIGZ1bGZpbGwoaSwgdmFsKTtcbiAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3RBbGwoZXJyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgdmFsID0gcDtcbiAgICAgICAgICBmdWxmaWxsKGksIHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH0pKGkpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5hcGkucmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgcmV0dXJuIG5ldyBhcGkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHJlc29sdmUodmFsKTtcbiAgfSk7XG59O1xuXG5hcGkucmVqZWN0ID0gZnVuY3Rpb24gKHZhbCkge1xuICByZXR1cm4gbmV3IGFwaShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgcmVqZWN0KHZhbCk7XG4gIH0pO1xufTtcblxudmFyIFByb21pc2UkMSA9IHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJyA/IFByb21pc2UgOiBhcGk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxudmFyIEFuaW1hdGlvbiA9IGZ1bmN0aW9uIEFuaW1hdGlvbih0YXJnZXQsIG9wdHMsIG9wdHMyKSB7XG4gIHZhciBpc0NvcmUgPSBjb3JlKHRhcmdldCk7XG4gIHZhciBpc0VsZSA9ICFpc0NvcmU7XG5cbiAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZSA9IGV4dGVuZCh7XG4gICAgZHVyYXRpb246IDEwMDBcbiAgfSwgb3B0cywgb3B0czIpO1xuXG4gIF9wLnRhcmdldCA9IHRhcmdldDtcbiAgX3Auc3R5bGUgPSBfcC5zdHlsZSB8fCBfcC5jc3M7XG4gIF9wLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgX3AucGxheWluZyA9IGZhbHNlO1xuICBfcC5ob29rZWQgPSBmYWxzZTtcbiAgX3AuYXBwbHlpbmcgPSBmYWxzZTtcbiAgX3AucHJvZ3Jlc3MgPSAwO1xuICBfcC5jb21wbGV0ZXMgPSBbXTtcbiAgX3AuZnJhbWVzID0gW107XG5cbiAgaWYgKF9wLmNvbXBsZXRlICYmIGZuJDYoX3AuY29tcGxldGUpKSB7XG4gICAgX3AuY29tcGxldGVzLnB1c2goX3AuY29tcGxldGUpO1xuICB9XG5cbiAgaWYgKGlzRWxlKSB7XG4gICAgdmFyIHBvcyA9IHRhcmdldC5wb3NpdGlvbigpO1xuICAgIF9wLnN0YXJ0UG9zaXRpb24gPSBfcC5zdGFydFBvc2l0aW9uIHx8IHtcbiAgICAgIHg6IHBvcy54LFxuICAgICAgeTogcG9zLnlcbiAgICB9O1xuICAgIF9wLnN0YXJ0U3R5bGUgPSBfcC5zdGFydFN0eWxlIHx8IHRhcmdldC5jeSgpLnN0eWxlKCkuZ2V0QW5pbWF0aW9uU3RhcnRTdHlsZSh0YXJnZXQsIF9wLnN0eWxlKTtcbiAgfVxuXG4gIGlmIChpc0NvcmUpIHtcbiAgICB2YXIgcGFuID0gdGFyZ2V0LnBhbigpO1xuICAgIF9wLnN0YXJ0UGFuID0ge1xuICAgICAgeDogcGFuLngsXG4gICAgICB5OiBwYW4ueVxuICAgIH07XG4gICAgX3Auc3RhcnRab29tID0gdGFyZ2V0Lnpvb20oKTtcbiAgfSAvLyBmb3IgZnV0dXJlIHRpbWVsaW5lL2FuaW1hdGlvbnMgaW1wbFxuXG5cbiAgdGhpcy5sZW5ndGggPSAxO1xuICB0aGlzWzBdID0gdGhpcztcbn07XG5cbnZhciBhbmlmbiA9IEFuaW1hdGlvbi5wcm90b3R5cGU7XG5leHRlbmQoYW5pZm4sIHtcbiAgaW5zdGFuY2VTdHJpbmc6IGZ1bmN0aW9uIGluc3RhbmNlU3RyaW5nKCkge1xuICAgIHJldHVybiAnYW5pbWF0aW9uJztcbiAgfSxcbiAgaG9vazogZnVuY3Rpb24gaG9vaygpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuXG4gICAgaWYgKCFfcC5ob29rZWQpIHtcbiAgICAgIC8vIGFkZCB0byB0YXJnZXQncyBhbmltYXRpb24gcXVldWVcbiAgICAgIHZhciBxO1xuICAgICAgdmFyIHRBbmkgPSBfcC50YXJnZXQuX3ByaXZhdGUuYW5pbWF0aW9uO1xuXG4gICAgICBpZiAoX3AucXVldWUpIHtcbiAgICAgICAgcSA9IHRBbmkucXVldWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxID0gdEFuaS5jdXJyZW50O1xuICAgICAgfVxuXG4gICAgICBxLnB1c2godGhpcyk7IC8vIGFkZCB0byB0aGUgYW5pbWF0aW9uIGxvb3AgcG9vbFxuXG4gICAgICBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihfcC50YXJnZXQpKSB7XG4gICAgICAgIF9wLnRhcmdldC5jeSgpLmFkZFRvQW5pbWF0aW9uUG9vbChfcC50YXJnZXQpO1xuICAgICAgfVxuXG4gICAgICBfcC5ob29rZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBwbGF5OiBmdW5jdGlvbiBwbGF5KCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7IC8vIGF1dG9yZXdpbmRcblxuICAgIGlmIChfcC5wcm9ncmVzcyA9PT0gMSkge1xuICAgICAgX3AucHJvZ3Jlc3MgPSAwO1xuICAgIH1cblxuICAgIF9wLnBsYXlpbmcgPSB0cnVlO1xuICAgIF9wLnN0YXJ0ZWQgPSBmYWxzZTsgLy8gbmVlZHMgdG8gYmUgc3RhcnRlZCBieSBhbmltYXRpb24gbG9vcFxuXG4gICAgX3Auc3RvcHBlZCA9IGZhbHNlO1xuICAgIHRoaXMuaG9vaygpOyAvLyB0aGUgYW5pbWF0aW9uIGxvb3Agd2lsbCBzdGFydCB0aGUgYW5pbWF0aW9uLi4uXG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcGxheWluZzogZnVuY3Rpb24gcGxheWluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5wbGF5aW5nO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24gYXBwbHkoKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBfcC5hcHBseWluZyA9IHRydWU7XG4gICAgX3Auc3RhcnRlZCA9IGZhbHNlOyAvLyBuZWVkcyB0byBiZSBzdGFydGVkIGJ5IGFuaW1hdGlvbiBsb29wXG5cbiAgICBfcC5zdG9wcGVkID0gZmFsc2U7XG4gICAgdGhpcy5ob29rKCk7IC8vIHRoZSBhbmltYXRpb24gbG9vcCB3aWxsIGFwcGx5IHRoZSBhbmltYXRpb24gYXQgdGhpcyBwcm9ncmVzc1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGFwcGx5aW5nOiBmdW5jdGlvbiBhcHBseWluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5hcHBseWluZztcbiAgfSxcbiAgcGF1c2U6IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgX3AucGxheWluZyA9IGZhbHNlO1xuICAgIF9wLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIF9wLnBsYXlpbmcgPSBmYWxzZTtcbiAgICBfcC5zdGFydGVkID0gZmFsc2U7XG4gICAgX3Auc3RvcHBlZCA9IHRydWU7IC8vIHRvIGJlIHJlbW92ZWQgZnJvbSBhbmltYXRpb24gcXVldWVzXG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmV3aW5kOiBmdW5jdGlvbiByZXdpbmQoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvZ3Jlc3MoMCk7XG4gIH0sXG4gIGZhc3Rmb3J3YXJkOiBmdW5jdGlvbiBmYXN0Zm9yd2FyZCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9ncmVzcygxKTtcbiAgfSxcbiAgdGltZTogZnVuY3Rpb24gdGltZSh0KSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcblxuICAgIGlmICh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBfcC5wcm9ncmVzcyAqIF9wLmR1cmF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9ncmVzcyh0IC8gX3AuZHVyYXRpb24pO1xuICAgIH1cbiAgfSxcbiAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIHByb2dyZXNzKHApIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciB3YXNQbGF5aW5nID0gX3AucGxheWluZztcblxuICAgIGlmIChwID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBfcC5wcm9ncmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHdhc1BsYXlpbmcpIHtcbiAgICAgICAgdGhpcy5wYXVzZSgpO1xuICAgICAgfVxuXG4gICAgICBfcC5wcm9ncmVzcyA9IHA7XG4gICAgICBfcC5zdGFydGVkID0gZmFsc2U7XG5cbiAgICAgIGlmICh3YXNQbGF5aW5nKSB7XG4gICAgICAgIHRoaXMucGxheSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBjb21wbGV0ZWQ6IGZ1bmN0aW9uIGNvbXBsZXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5wcm9ncmVzcyA9PT0gMTtcbiAgfSxcbiAgcmV2ZXJzZTogZnVuY3Rpb24gcmV2ZXJzZSgpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciB3YXNQbGF5aW5nID0gX3AucGxheWluZztcblxuICAgIGlmICh3YXNQbGF5aW5nKSB7XG4gICAgICB0aGlzLnBhdXNlKCk7XG4gICAgfVxuXG4gICAgX3AucHJvZ3Jlc3MgPSAxIC0gX3AucHJvZ3Jlc3M7XG4gICAgX3Auc3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgdmFyIHN3YXAgPSBmdW5jdGlvbiBzd2FwKGEsIGIpIHtcbiAgICAgIHZhciBfcGEgPSBfcFthXTtcblxuICAgICAgaWYgKF9wYSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3BbYV0gPSBfcFtiXTtcbiAgICAgIF9wW2JdID0gX3BhO1xuICAgIH07XG5cbiAgICBzd2FwKCd6b29tJywgJ3N0YXJ0Wm9vbScpO1xuICAgIHN3YXAoJ3BhbicsICdzdGFydFBhbicpO1xuICAgIHN3YXAoJ3Bvc2l0aW9uJywgJ3N0YXJ0UG9zaXRpb24nKTsgLy8gc3dhcCBzdHlsZXNcblxuICAgIGlmIChfcC5zdHlsZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfcC5zdHlsZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcHJvcCA9IF9wLnN0eWxlW2ldO1xuICAgICAgICB2YXIgbmFtZSA9IHByb3AubmFtZTtcbiAgICAgICAgdmFyIHN0YXJ0U3R5bGVQcm9wID0gX3Auc3RhcnRTdHlsZVtuYW1lXTtcbiAgICAgICAgX3Auc3RhcnRTdHlsZVtuYW1lXSA9IHByb3A7XG4gICAgICAgIF9wLnN0eWxlW2ldID0gc3RhcnRTdHlsZVByb3A7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdhc1BsYXlpbmcpIHtcbiAgICAgIHRoaXMucGxheSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBwcm9taXNlOiBmdW5jdGlvbiBwcm9taXNlKHR5cGUpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciBhcnI7XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2ZyYW1lJzpcbiAgICAgICAgYXJyID0gX3AuZnJhbWVzO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgIGNhc2UgJ2NvbXBsZXRlJzpcbiAgICAgIGNhc2UgJ2NvbXBsZXRlZCc6XG4gICAgICAgIGFyciA9IF9wLmNvbXBsZXRlcztcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBhcnIucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59KTtcbmFuaWZuLmNvbXBsZXRlID0gYW5pZm4uY29tcGxldGVkO1xuYW5pZm4ucnVuID0gYW5pZm4ucGxheTtcbmFuaWZuLnJ1bm5pbmcgPSBhbmlmbi5wbGF5aW5nO1xuXG52YXIgZGVmaW5lJDMgPSB7XG4gIGFuaW1hdGVkOiBmdW5jdGlvbiBhbmltYXRlZCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gYW5pbWF0ZWRJbXBsKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNlbGZJc0FycmF5TGlrZSA9IHNlbGYubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgICB2YXIgYWxsID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZiA6IFtzZWxmXTsgLy8gcHV0IGluIGFycmF5IGlmIG5vdCBhcnJheS1saWtlXG5cbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcblxuICAgICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBlbGUgPSBhbGxbMF07XG5cbiAgICAgIGlmIChlbGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5hbmltYXRpb24uY3VycmVudC5sZW5ndGggPiAwO1xuICAgICAgfVxuICAgIH07XG4gIH0sXG4gIC8vIGFuaW1hdGVkXG4gIGNsZWFyUXVldWU6IGZ1bmN0aW9uIGNsZWFyUXVldWUoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGNsZWFyUXVldWVJbXBsKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNlbGZJc0FycmF5TGlrZSA9IHNlbGYubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgICB2YXIgYWxsID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZiA6IFtzZWxmXTsgLy8gcHV0IGluIGFycmF5IGlmIG5vdCBhcnJheS1saWtlXG5cbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcblxuICAgICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGFsbFtpXTtcbiAgICAgICAgZWxlLl9wcml2YXRlLmFuaW1hdGlvbi5xdWV1ZSA9IFtdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9LFxuICAvLyBjbGVhclF1ZXVlXG4gIGRlbGF5OiBmdW5jdGlvbiBkZWxheSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gZGVsYXlJbXBsKHRpbWUsIGNvbXBsZXRlKSB7XG4gICAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5IHx8IHRoaXM7XG5cbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmFuaW1hdGUoe1xuICAgICAgICBkZWxheTogdGltZSxcbiAgICAgICAgZHVyYXRpb246IHRpbWUsXG4gICAgICAgIGNvbXBsZXRlOiBjb21wbGV0ZVxuICAgICAgfSk7XG4gICAgfTtcbiAgfSxcbiAgLy8gZGVsYXlcbiAgZGVsYXlBbmltYXRpb246IGZ1bmN0aW9uIGRlbGF5QW5pbWF0aW9uKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBkZWxheUFuaW1hdGlvbkltcGwodGltZSwgY29tcGxldGUpIHtcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcblxuICAgICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0aW9uKHtcbiAgICAgICAgZGVsYXk6IHRpbWUsXG4gICAgICAgIGR1cmF0aW9uOiB0aW1lLFxuICAgICAgICBjb21wbGV0ZTogY29tcGxldGVcbiAgICAgIH0pO1xuICAgIH07XG4gIH0sXG4gIC8vIGRlbGF5XG4gIGFuaW1hdGlvbjogZnVuY3Rpb24gYW5pbWF0aW9uKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBhbmltYXRpb25JbXBsKHByb3BlcnRpZXMsIHBhcmFtcykge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNlbGZJc0FycmF5TGlrZSA9IHNlbGYubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgICB2YXIgYWxsID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZiA6IFtzZWxmXTsgLy8gcHV0IGluIGFycmF5IGlmIG5vdCBhcnJheS1saWtlXG5cbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcbiAgICAgIHZhciBpc0NvcmUgPSAhc2VsZklzQXJyYXlMaWtlO1xuICAgICAgdmFyIGlzRWxlcyA9ICFpc0NvcmU7XG5cbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIHZhciBzdHlsZSA9IGN5LnN0eWxlKCk7XG4gICAgICBwcm9wZXJ0aWVzID0gZXh0ZW5kKHt9LCBwcm9wZXJ0aWVzLCBwYXJhbXMpO1xuICAgICAgdmFyIHByb3BlcnRpZXNFbXB0eSA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpLmxlbmd0aCA9PT0gMDtcblxuICAgICAgaWYgKHByb3BlcnRpZXNFbXB0eSkge1xuICAgICAgICByZXR1cm4gbmV3IEFuaW1hdGlvbihhbGxbMF0sIHByb3BlcnRpZXMpOyAvLyBub3RoaW5nIHRvIGFuaW1hdGVcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BlcnRpZXMuZHVyYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wZXJ0aWVzLmR1cmF0aW9uID0gNDAwO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKHByb3BlcnRpZXMuZHVyYXRpb24pIHtcbiAgICAgICAgY2FzZSAnc2xvdyc6XG4gICAgICAgICAgcHJvcGVydGllcy5kdXJhdGlvbiA9IDYwMDtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdmYXN0JzpcbiAgICAgICAgICBwcm9wZXJ0aWVzLmR1cmF0aW9uID0gMjAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNFbGVzKSB7XG4gICAgICAgIHByb3BlcnRpZXMuc3R5bGUgPSBzdHlsZS5nZXRQcm9wc0xpc3QocHJvcGVydGllcy5zdHlsZSB8fCBwcm9wZXJ0aWVzLmNzcyk7XG4gICAgICAgIHByb3BlcnRpZXMuY3NzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNFbGVzICYmIHByb3BlcnRpZXMucmVuZGVyZWRQb3NpdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIHZhciBycG9zID0gcHJvcGVydGllcy5yZW5kZXJlZFBvc2l0aW9uO1xuICAgICAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgICAgICBwcm9wZXJ0aWVzLnBvc2l0aW9uID0gcmVuZGVyZWRUb01vZGVsUG9zaXRpb24ocnBvcywgem9vbSwgcGFuKTtcbiAgICAgIH0gLy8gb3ZlcnJpZGUgcGFuIHcvIHBhbkJ5IGlmIHNldFxuXG5cbiAgICAgIGlmIChpc0NvcmUgJiYgcHJvcGVydGllcy5wYW5CeSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBwYW5CeSA9IHByb3BlcnRpZXMucGFuQnk7XG4gICAgICAgIHZhciBjeVBhbiA9IGN5LnBhbigpO1xuICAgICAgICBwcm9wZXJ0aWVzLnBhbiA9IHtcbiAgICAgICAgICB4OiBjeVBhbi54ICsgcGFuQnkueCxcbiAgICAgICAgICB5OiBjeVBhbi55ICsgcGFuQnkueVxuICAgICAgICB9O1xuICAgICAgfSAvLyBvdmVycmlkZSBwYW4gdy8gY2VudGVyIGlmIHNldFxuXG5cbiAgICAgIHZhciBjZW50ZXIgPSBwcm9wZXJ0aWVzLmNlbnRlciB8fCBwcm9wZXJ0aWVzLmNlbnRyZTtcblxuICAgICAgaWYgKGlzQ29yZSAmJiBjZW50ZXIgIT0gbnVsbCkge1xuICAgICAgICB2YXIgY2VudGVyUGFuID0gY3kuZ2V0Q2VudGVyUGFuKGNlbnRlci5lbGVzLCBwcm9wZXJ0aWVzLnpvb20pO1xuXG4gICAgICAgIGlmIChjZW50ZXJQYW4gIT0gbnVsbCkge1xuICAgICAgICAgIHByb3BlcnRpZXMucGFuID0gY2VudGVyUGFuO1xuICAgICAgICB9XG4gICAgICB9IC8vIG92ZXJyaWRlIHBhbiAmIHpvb20gdy8gZml0IGlmIHNldFxuXG5cbiAgICAgIGlmIChpc0NvcmUgJiYgcHJvcGVydGllcy5maXQgIT0gbnVsbCkge1xuICAgICAgICB2YXIgZml0ID0gcHJvcGVydGllcy5maXQ7XG4gICAgICAgIHZhciBmaXRWcCA9IGN5LmdldEZpdFZpZXdwb3J0KGZpdC5lbGVzIHx8IGZpdC5ib3VuZGluZ0JveCwgZml0LnBhZGRpbmcpO1xuXG4gICAgICAgIGlmIChmaXRWcCAhPSBudWxsKSB7XG4gICAgICAgICAgcHJvcGVydGllcy5wYW4gPSBmaXRWcC5wYW47XG4gICAgICAgICAgcHJvcGVydGllcy56b29tID0gZml0VnAuem9vbTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBvdmVycmlkZSB6b29tICgmIHBvdGVudGlhbGx5IHBhbikgdy8gem9vbSBvYmogaWYgc2V0XG5cblxuICAgICAgaWYgKGlzQ29yZSAmJiBwbGFpbk9iamVjdChwcm9wZXJ0aWVzLnpvb20pKSB7XG4gICAgICAgIHZhciB2cCA9IGN5LmdldFpvb21lZFZpZXdwb3J0KHByb3BlcnRpZXMuem9vbSk7XG5cbiAgICAgICAgaWYgKHZwICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAodnAuem9vbWVkKSB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLnpvb20gPSB2cC56b29tO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2cC5wYW5uZWQpIHtcbiAgICAgICAgICAgIHByb3BlcnRpZXMucGFuID0gdnAucGFuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wZXJ0aWVzLnpvb20gPSBudWxsOyAvLyBhbiBpbmF2YWxpZCB6b29tIChlLmcuIG5vIGRlbHRhKSBnZXRzIGF1dG9tYXRpY2FsbHkgZGVzdHJveWVkXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBBbmltYXRpb24oYWxsWzBdLCBwcm9wZXJ0aWVzKTtcbiAgICB9O1xuICB9LFxuICAvLyBhbmltYXRlXG4gIGFuaW1hdGU6IGZ1bmN0aW9uIGFuaW1hdGUoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGFuaW1hdGVJbXBsKHByb3BlcnRpZXMsIHBhcmFtcykge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNlbGZJc0FycmF5TGlrZSA9IHNlbGYubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgICB2YXIgYWxsID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZiA6IFtzZWxmXTsgLy8gcHV0IGluIGFycmF5IGlmIG5vdCBhcnJheS1saWtlXG5cbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcblxuICAgICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcykge1xuICAgICAgICBwcm9wZXJ0aWVzID0gZXh0ZW5kKHt9LCBwcm9wZXJ0aWVzLCBwYXJhbXMpO1xuICAgICAgfSAvLyBtYW51YWxseSBob29rIGFuZCBydW4gdGhlIGFuaW1hdGlvblxuXG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBhbGxbaV07XG4gICAgICAgIHZhciBxdWV1ZSA9IGVsZS5hbmltYXRlZCgpICYmIChwcm9wZXJ0aWVzLnF1ZXVlID09PSB1bmRlZmluZWQgfHwgcHJvcGVydGllcy5xdWV1ZSk7XG4gICAgICAgIHZhciBhbmkgPSBlbGUuYW5pbWF0aW9uKHByb3BlcnRpZXMsIHF1ZXVlID8ge1xuICAgICAgICAgIHF1ZXVlOiB0cnVlXG4gICAgICAgIH0gOiB1bmRlZmluZWQpO1xuICAgICAgICBhbmkucGxheSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgICB9O1xuICB9LFxuICAvLyBhbmltYXRlXG4gIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHN0b3BJbXBsKGNsZWFyUXVldWUsIGp1bXBUb0VuZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNlbGZJc0FycmF5TGlrZSA9IHNlbGYubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgICB2YXIgYWxsID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZiA6IFtzZWxmXTsgLy8gcHV0IGluIGFycmF5IGlmIG5vdCBhcnJheS1saWtlXG5cbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcblxuICAgICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGFsbFtpXTtcbiAgICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgICAgICB2YXIgYW5pcyA9IF9wLmFuaW1hdGlvbi5jdXJyZW50O1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYW5pcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHZhciBhbmkgPSBhbmlzW2pdO1xuICAgICAgICAgIHZhciBhbmlfcCA9IGFuaS5fcHJpdmF0ZTtcblxuICAgICAgICAgIGlmIChqdW1wVG9FbmQpIHtcbiAgICAgICAgICAgIC8vIG5leHQgaXRlcmF0aW9uIG9mIHRoZSBhbmltYXRpb24gbG9vcCwgdGhlIGFuaW1hdGlvblxuICAgICAgICAgICAgLy8gd2lsbCBnbyBzdHJhaWdodCB0byB0aGUgZW5kIGFuZCBiZSByZW1vdmVkXG4gICAgICAgICAgICBhbmlfcC5kdXJhdGlvbiA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIGNsZWFyIHRoZSBxdWV1ZSBvZiBmdXR1cmUgYW5pbWF0aW9uc1xuXG5cbiAgICAgICAgaWYgKGNsZWFyUXVldWUpIHtcbiAgICAgICAgICBfcC5hbmltYXRpb24ucXVldWUgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghanVtcFRvRW5kKSB7XG4gICAgICAgICAgX3AuYW5pbWF0aW9uLmN1cnJlbnQgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfSAvLyB3ZSBoYXZlIHRvIG5vdGlmeSAodGhlIGFuaW1hdGlvbiBsb29wIGRvZXNuJ3QgZG8gaXQgZm9yIHVzIG9uIGBzdG9wYClcblxuXG4gICAgICBjeS5ub3RpZnkoJ2RyYXcnKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gIH0gLy8gc3RvcFxuXG59OyAvLyBkZWZpbmVcblxudmFyIGRlZmluZSQyID0ge1xuICAvLyBhY2Nlc3MgZGF0YSBmaWVsZFxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKHBhcmFtcykge1xuICAgIHZhciBkZWZhdWx0cyA9IHtcbiAgICAgIGZpZWxkOiAnZGF0YScsXG4gICAgICBiaW5kaW5nRXZlbnQ6ICdkYXRhJyxcbiAgICAgIGFsbG93QmluZGluZzogZmFsc2UsXG4gICAgICBhbGxvd1NldHRpbmc6IGZhbHNlLFxuICAgICAgYWxsb3dHZXR0aW5nOiBmYWxzZSxcbiAgICAgIHNldHRpbmdFdmVudDogJ2RhdGEnLFxuICAgICAgc2V0dGluZ1RyaWdnZXJzRXZlbnQ6IGZhbHNlLFxuICAgICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgICAgaW1tdXRhYmxlS2V5czoge30sXG4gICAgICAvLyBrZXkgPT4gdHJ1ZSBpZiBpbW11dGFibGVcbiAgICAgIHVwZGF0ZVN0eWxlOiBmYWxzZSxcbiAgICAgIGJlZm9yZUdldDogZnVuY3Rpb24gYmVmb3JlR2V0KHNlbGYpIHt9LFxuICAgICAgYmVmb3JlU2V0OiBmdW5jdGlvbiBiZWZvcmVTZXQoc2VsZiwgb2JqKSB7fSxcbiAgICAgIG9uU2V0OiBmdW5jdGlvbiBvblNldChzZWxmKSB7fSxcbiAgICAgIGNhblNldDogZnVuY3Rpb24gY2FuU2V0KHNlbGYpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfTtcbiAgICBwYXJhbXMgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBwYXJhbXMpO1xuICAgIHJldHVybiBmdW5jdGlvbiBkYXRhSW1wbChuYW1lLCB2YWx1ZSkge1xuICAgICAgdmFyIHAgPSBwYXJhbXM7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcblxuICAgICAgdmFyIHNpbmdsZSA9IHNlbGZJc0FycmF5TGlrZSA/IHNlbGZbMF0gOiBzZWxmOyAvLyAuZGF0YSgnZm9vJywgLi4uKVxuXG4gICAgICBpZiAoc3RyaW5nKG5hbWUpKSB7XG4gICAgICAgIC8vIHNldCBvciBnZXQgcHJvcGVydHlcbiAgICAgICAgdmFyIGlzUGF0aExpa2UgPSBuYW1lLmluZGV4T2YoJy4nKSAhPT0gLTE7IC8vIHRoZXJlIG1pZ2h0IGJlIGEgbm9ybWFsIGZpZWxkIHdpdGggYSBkb3QgXG5cbiAgICAgICAgdmFyIHBhdGggPSBpc1BhdGhMaWtlICYmIHRvUGF0aF9fZGVmYXVsdFtcImRlZmF1bHRcIl0obmFtZSk7IC8vIC5kYXRhKCdmb28nKVxuXG4gICAgICAgIGlmIChwLmFsbG93R2V0dGluZyAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gZ2V0XG4gICAgICAgICAgdmFyIHJldDtcblxuICAgICAgICAgIGlmIChzaW5nbGUpIHtcbiAgICAgICAgICAgIHAuYmVmb3JlR2V0KHNpbmdsZSk7IC8vIGNoZWNrIGlmIGl0J3MgcGF0aCBhbmQgYSBmaWVsZCB3aXRoIHRoZSBzYW1lIG5hbWUgZG9lc24ndCBleGlzdFxuXG4gICAgICAgICAgICBpZiAocGF0aCAmJiBzaW5nbGUuX3ByaXZhdGVbcC5maWVsZF1bbmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXQgPSBnZXRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHNpbmdsZS5fcHJpdmF0ZVtwLmZpZWxkXSwgcGF0aCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXQgPSBzaW5nbGUuX3ByaXZhdGVbcC5maWVsZF1bbmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJldDsgLy8gLmRhdGEoJ2ZvbycsICdiYXInKVxuICAgICAgICB9IGVsc2UgaWYgKHAuYWxsb3dTZXR0aW5nICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBzZXRcbiAgICAgICAgICB2YXIgdmFsaWQgPSAhcC5pbW11dGFibGVLZXlzW25hbWVdO1xuXG4gICAgICAgICAgaWYgKHZhbGlkKSB7XG4gICAgICAgICAgICB2YXIgY2hhbmdlID0gX2RlZmluZVByb3BlcnR5KHt9LCBuYW1lLCB2YWx1ZSk7XG5cbiAgICAgICAgICAgIHAuYmVmb3JlU2V0KHNlbGYsIGNoYW5nZSk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gYWxsLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICB2YXIgZWxlID0gYWxsW2ldO1xuXG4gICAgICAgICAgICAgIGlmIChwLmNhblNldChlbGUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhdGggJiYgc2luZ2xlLl9wcml2YXRlW3AuZmllbGRdW25hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIHNldF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZWxlLl9wcml2YXRlW3AuZmllbGRdLCBwYXRoLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGVsZS5fcHJpdmF0ZVtwLmZpZWxkXVtuYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAvLyB1cGRhdGUgbWFwcGVycyBpZiBhc2tlZFxuXG5cbiAgICAgICAgICAgIGlmIChwLnVwZGF0ZVN0eWxlKSB7XG4gICAgICAgICAgICAgIHNlbGYudXBkYXRlU3R5bGUoKTtcbiAgICAgICAgICAgIH0gLy8gY2FsbCBvblNldCBjYWxsYmFja1xuXG5cbiAgICAgICAgICAgIHAub25TZXQoc2VsZik7XG5cbiAgICAgICAgICAgIGlmIChwLnNldHRpbmdUcmlnZ2Vyc0V2ZW50KSB7XG4gICAgICAgICAgICAgIHNlbGZbcC50cmlnZ2VyRm5OYW1lXShwLnNldHRpbmdFdmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIC5kYXRhKHsgJ2Zvbyc6ICdiYXInIH0pXG5cbiAgICAgIH0gZWxzZSBpZiAocC5hbGxvd1NldHRpbmcgJiYgcGxhaW5PYmplY3QobmFtZSkpIHtcbiAgICAgICAgLy8gZXh0ZW5kXG4gICAgICAgIHZhciBvYmogPSBuYW1lO1xuICAgICAgICB2YXIgaywgdjtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgICBwLmJlZm9yZVNldChzZWxmLCBvYmopO1xuXG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBrZXlzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgIGsgPSBrZXlzW19pXTtcbiAgICAgICAgICB2ID0gb2JqW2tdO1xuXG4gICAgICAgICAgdmFyIF92YWxpZCA9ICFwLmltbXV0YWJsZUtleXNba107XG5cbiAgICAgICAgICBpZiAoX3ZhbGlkKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFsbC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICB2YXIgX2VsZSA9IGFsbFtqXTtcblxuICAgICAgICAgICAgICBpZiAocC5jYW5TZXQoX2VsZSkpIHtcbiAgICAgICAgICAgICAgICBfZWxlLl9wcml2YXRlW3AuZmllbGRdW2tdID0gdjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyB1cGRhdGUgbWFwcGVycyBpZiBhc2tlZFxuXG5cbiAgICAgICAgaWYgKHAudXBkYXRlU3R5bGUpIHtcbiAgICAgICAgICBzZWxmLnVwZGF0ZVN0eWxlKCk7XG4gICAgICAgIH0gLy8gY2FsbCBvblNldCBjYWxsYmFja1xuXG5cbiAgICAgICAgcC5vblNldChzZWxmKTtcblxuICAgICAgICBpZiAocC5zZXR0aW5nVHJpZ2dlcnNFdmVudCkge1xuICAgICAgICAgIHNlbGZbcC50cmlnZ2VyRm5OYW1lXShwLnNldHRpbmdFdmVudCk7XG4gICAgICAgIH0gLy8gLmRhdGEoZnVuY3Rpb24oKXsgLi4uIH0pXG5cbiAgICAgIH0gZWxzZSBpZiAocC5hbGxvd0JpbmRpbmcgJiYgZm4kNihuYW1lKSkge1xuICAgICAgICAvLyBiaW5kIHRvIGV2ZW50XG4gICAgICAgIHZhciBmbiA9IG5hbWU7XG4gICAgICAgIHNlbGYub24ocC5iaW5kaW5nRXZlbnQsIGZuKTsgLy8gLmRhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwLmFsbG93R2V0dGluZyAmJiBuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gZ2V0IHdob2xlIG9iamVjdFxuICAgICAgICB2YXIgX3JldDtcblxuICAgICAgICBpZiAoc2luZ2xlKSB7XG4gICAgICAgICAgcC5iZWZvcmVHZXQoc2luZ2xlKTtcbiAgICAgICAgICBfcmV0ID0gc2luZ2xlLl9wcml2YXRlW3AuZmllbGRdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIF9yZXQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmOyAvLyBtYWludGFpbiBjaGFpbmFiaWxpdHlcbiAgICB9OyAvLyBmdW5jdGlvblxuICB9LFxuICAvLyBkYXRhXG4gIC8vIHJlbW92ZSBkYXRhIGZpZWxkXG4gIHJlbW92ZURhdGE6IGZ1bmN0aW9uIHJlbW92ZURhdGEocGFyYW1zKSB7XG4gICAgdmFyIGRlZmF1bHRzID0ge1xuICAgICAgZmllbGQ6ICdkYXRhJyxcbiAgICAgIGV2ZW50OiAnZGF0YScsXG4gICAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgICB0cmlnZ2VyRXZlbnQ6IGZhbHNlLFxuICAgICAgaW1tdXRhYmxlS2V5czoge30gLy8ga2V5ID0+IHRydWUgaWYgaW1tdXRhYmxlXG5cbiAgICB9O1xuICAgIHBhcmFtcyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIHBhcmFtcyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHJlbW92ZURhdGFJbXBsKG5hbWVzKSB7XG4gICAgICB2YXIgcCA9IHBhcmFtcztcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBzZWxmSXNBcnJheUxpa2UgPSBzZWxmLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGFsbCA9IHNlbGZJc0FycmF5TGlrZSA/IHNlbGYgOiBbc2VsZl07IC8vIHB1dCBpbiBhcnJheSBpZiBub3QgYXJyYXktbGlrZVxuICAgICAgLy8gLnJlbW92ZURhdGEoJ2ZvbyBiYXInKVxuXG4gICAgICBpZiAoc3RyaW5nKG5hbWVzKSkge1xuICAgICAgICAvLyB0aGVuIGdldCB0aGUgbGlzdCBvZiBrZXlzLCBhbmQgZGVsZXRlIHRoZW1cbiAgICAgICAgdmFyIGtleXMgPSBuYW1lcy5zcGxpdCgvXFxzKy8pO1xuICAgICAgICB2YXIgbCA9IGtleXMubGVuZ3RoO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgLy8gZGVsZXRlIGVhY2ggbm9uLWVtcHR5IGtleVxuICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICAgICAgaWYgKGVtcHR5U3RyaW5nKGtleSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciB2YWxpZCA9ICFwLmltbXV0YWJsZUtleXNba2V5XTsgLy8gbm90IHZhbGlkIGlmIGltbXV0YWJsZVxuXG4gICAgICAgICAgaWYgKHZhbGlkKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpX2EgPSAwLCBsX2EgPSBhbGwubGVuZ3RoOyBpX2EgPCBsX2E7IGlfYSsrKSB7XG4gICAgICAgICAgICAgIGFsbFtpX2FdLl9wcml2YXRlW3AuZmllbGRdW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHAudHJpZ2dlckV2ZW50KSB7XG4gICAgICAgICAgc2VsZltwLnRyaWdnZXJGbk5hbWVdKHAuZXZlbnQpO1xuICAgICAgICB9IC8vIC5yZW1vdmVEYXRhKClcblxuICAgICAgfSBlbHNlIGlmIChuYW1lcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIHRoZW4gZGVsZXRlIGFsbCBrZXlzXG4gICAgICAgIGZvciAodmFyIF9pX2EgPSAwLCBfbF9hID0gYWxsLmxlbmd0aDsgX2lfYSA8IF9sX2E7IF9pX2ErKykge1xuICAgICAgICAgIHZhciBfcHJpdmF0ZUZpZWxkcyA9IGFsbFtfaV9hXS5fcHJpdmF0ZVtwLmZpZWxkXTtcblxuICAgICAgICAgIHZhciBfa2V5cyA9IE9iamVjdC5rZXlzKF9wcml2YXRlRmllbGRzKTtcblxuICAgICAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IF9rZXlzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgICAgIHZhciBfa2V5ID0gX2tleXNbX2kyXTtcbiAgICAgICAgICAgIHZhciB2YWxpZEtleVRvRGVsZXRlID0gIXAuaW1tdXRhYmxlS2V5c1tfa2V5XTtcblxuICAgICAgICAgICAgaWYgKHZhbGlkS2V5VG9EZWxldGUpIHtcbiAgICAgICAgICAgICAgX3ByaXZhdGVGaWVsZHNbX2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHAudHJpZ2dlckV2ZW50KSB7XG4gICAgICAgICAgc2VsZltwLnRyaWdnZXJGbk5hbWVdKHAuZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmOyAvLyBtYWludGFpbiBjaGFpbmluZ1xuICAgIH07IC8vIGZ1bmN0aW9uXG4gIH0gLy8gcmVtb3ZlRGF0YVxuXG59OyAvLyBkZWZpbmVcblxudmFyIGRlZmluZSQxID0ge1xuICBldmVudEFsaWFzZXNPbjogZnVuY3Rpb24gZXZlbnRBbGlhc2VzT24ocHJvdG8pIHtcbiAgICB2YXIgcCA9IHByb3RvO1xuICAgIHAuYWRkTGlzdGVuZXIgPSBwLmxpc3RlbiA9IHAuYmluZCA9IHAub247XG4gICAgcC51bmxpc3RlbiA9IHAudW5iaW5kID0gcC5vZmYgPSBwLnJlbW92ZUxpc3RlbmVyO1xuICAgIHAudHJpZ2dlciA9IHAuZW1pdDsgLy8gdGhpcyBpcyBqdXN0IGEgd3JhcHBlciBhbGlhcyBvZiAub24oKVxuXG4gICAgcC5wb24gPSBwLnByb21pc2VPbiA9IGZ1bmN0aW9uIChldmVudHMsIHNlbGVjdG9yKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uIGNhbGxiYWNrKGUpIHtcbiAgICAgICAgICBzZWxmLm9mZi5hcHBseShzZWxmLCBvZmZBcmdzKTtcbiAgICAgICAgICByZXNvbHZlKGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBvbkFyZ3MgPSBhcmdzLmNvbmNhdChbY2FsbGJhY2tdKTtcbiAgICAgICAgdmFyIG9mZkFyZ3MgPSBvbkFyZ3MuY29uY2F0KFtdKTtcbiAgICAgICAgc2VsZi5vbi5hcHBseShzZWxmLCBvbkFyZ3MpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxufTsgLy8gZGVmaW5lXG5cbi8vIHVzZSB0aGlzIG1vZHVsZSB0byBjaGVycnkgcGljayBmdW5jdGlvbnMgaW50byB5b3VyIHByb3RvdHlwZVxudmFyIGRlZmluZSA9IHt9O1xuW2RlZmluZSQzLCBkZWZpbmUkMiwgZGVmaW5lJDFdLmZvckVhY2goZnVuY3Rpb24gKG0pIHtcbiAgZXh0ZW5kKGRlZmluZSwgbSk7XG59KTtcblxudmFyIGVsZXNmbiRpID0ge1xuICBhbmltYXRlOiBkZWZpbmUuYW5pbWF0ZSgpLFxuICBhbmltYXRpb246IGRlZmluZS5hbmltYXRpb24oKSxcbiAgYW5pbWF0ZWQ6IGRlZmluZS5hbmltYXRlZCgpLFxuICBjbGVhclF1ZXVlOiBkZWZpbmUuY2xlYXJRdWV1ZSgpLFxuICBkZWxheTogZGVmaW5lLmRlbGF5KCksXG4gIGRlbGF5QW5pbWF0aW9uOiBkZWZpbmUuZGVsYXlBbmltYXRpb24oKSxcbiAgc3RvcDogZGVmaW5lLnN0b3AoKVxufTtcblxudmFyIGVsZXNmbiRoID0ge1xuICBjbGFzc2VzOiBmdW5jdGlvbiBjbGFzc2VzKF9jbGFzc2VzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKF9jbGFzc2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZXQgPSBbXTtcblxuICAgICAgc2VsZlswXS5fcHJpdmF0ZS5jbGFzc2VzLmZvckVhY2goZnVuY3Rpb24gKGNscykge1xuICAgICAgICByZXR1cm4gcmV0LnB1c2goY2xzKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0gZWxzZSBpZiAoIWFycmF5KF9jbGFzc2VzKSkge1xuICAgICAgLy8gZXh0cmFjdCBjbGFzc2VzIGZyb20gc3RyaW5nXG4gICAgICBfY2xhc3NlcyA9IChfY2xhc3NlcyB8fCAnJykubWF0Y2goL1xcUysvZykgfHwgW107XG4gICAgfVxuXG4gICAgdmFyIGNoYW5nZWQgPSBbXTtcbiAgICB2YXIgY2xhc3Nlc1NldCA9IG5ldyBTZXQkMShfY2xhc3Nlcyk7IC8vIGNoZWNrIGFuZCB1cGRhdGUgZWFjaCBlbGVcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2VsZi5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIGVsZSA9IHNlbGZbal07XG4gICAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgICB2YXIgZWxlQ2xhc3NlcyA9IF9wLmNsYXNzZXM7XG4gICAgICB2YXIgY2hhbmdlZEVsZSA9IGZhbHNlOyAvLyBjaGVjayBpZiBlbGUgaGFzIGFsbCBvZiB0aGUgcGFzc2VkIGNsYXNzZXNcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfY2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2xzID0gX2NsYXNzZXNbaV07XG4gICAgICAgIHZhciBlbGVIYXNDbGFzcyA9IGVsZUNsYXNzZXMuaGFzKGNscyk7XG5cbiAgICAgICAgaWYgKCFlbGVIYXNDbGFzcykge1xuICAgICAgICAgIGNoYW5nZWRFbGUgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IC8vIGNoZWNrIGlmIGVsZSBoYXMgY2xhc3NlcyBvdXRzaWRlIG9mIHRob3NlIHBhc3NlZFxuXG5cbiAgICAgIGlmICghY2hhbmdlZEVsZSkge1xuICAgICAgICBjaGFuZ2VkRWxlID0gZWxlQ2xhc3Nlcy5zaXplICE9PSBfY2xhc3Nlcy5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VkRWxlKSB7XG4gICAgICAgIF9wLmNsYXNzZXMgPSBjbGFzc2VzU2V0O1xuICAgICAgICBjaGFuZ2VkLnB1c2goZWxlKTtcbiAgICAgIH1cbiAgICB9IC8vIHRyaWdnZXIgdXBkYXRlIHN0eWxlIG9uIHRob3NlIGVsZXMgdGhhdCBoYWQgY2xhc3MgY2hhbmdlc1xuXG5cbiAgICBpZiAoY2hhbmdlZC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNwYXduKGNoYW5nZWQpLnVwZGF0ZVN0eWxlKCkuZW1pdCgnY2xhc3MnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZjtcbiAgfSxcbiAgYWRkQ2xhc3M6IGZ1bmN0aW9uIGFkZENsYXNzKGNsYXNzZXMpIHtcbiAgICByZXR1cm4gdGhpcy50b2dnbGVDbGFzcyhjbGFzc2VzLCB0cnVlKTtcbiAgfSxcbiAgaGFzQ2xhc3M6IGZ1bmN0aW9uIGhhc0NsYXNzKGNsYXNzTmFtZSkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHJldHVybiBlbGUgIT0gbnVsbCAmJiBlbGUuX3ByaXZhdGUuY2xhc3Nlcy5oYXMoY2xhc3NOYW1lKTtcbiAgfSxcbiAgdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uIHRvZ2dsZUNsYXNzKGNsYXNzZXMsIHRvZ2dsZSkge1xuICAgIGlmICghYXJyYXkoY2xhc3NlcykpIHtcbiAgICAgIC8vIGV4dHJhY3QgY2xhc3NlcyBmcm9tIHN0cmluZ1xuICAgICAgY2xhc3NlcyA9IGNsYXNzZXMubWF0Y2goL1xcUysvZykgfHwgW107XG4gICAgfVxuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB0b2dnbGVVbmRlZmQgPSB0b2dnbGUgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgY2hhbmdlZCA9IFtdOyAvLyBlbGVzIHdobyBoYWQgY2xhc3NlcyBjaGFuZ2VkXG5cbiAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBzZWxmLmxlbmd0aDsgaSA8IGlsOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBzZWxmW2ldO1xuICAgICAgdmFyIGVsZUNsYXNzZXMgPSBlbGUuX3ByaXZhdGUuY2xhc3NlcztcbiAgICAgIHZhciBjaGFuZ2VkRWxlID0gZmFsc2U7XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2xhc3Nlcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgY2xzID0gY2xhc3Nlc1tqXTtcbiAgICAgICAgdmFyIGhhc0NsYXNzID0gZWxlQ2xhc3Nlcy5oYXMoY2xzKTtcbiAgICAgICAgdmFyIGNoYW5nZWROb3cgPSBmYWxzZTtcblxuICAgICAgICBpZiAodG9nZ2xlIHx8IHRvZ2dsZVVuZGVmZCAmJiAhaGFzQ2xhc3MpIHtcbiAgICAgICAgICBlbGVDbGFzc2VzLmFkZChjbHMpO1xuICAgICAgICAgIGNoYW5nZWROb3cgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKCF0b2dnbGUgfHwgdG9nZ2xlVW5kZWZkICYmIGhhc0NsYXNzKSB7XG4gICAgICAgICAgZWxlQ2xhc3Nlc1tcImRlbGV0ZVwiXShjbHMpO1xuICAgICAgICAgIGNoYW5nZWROb3cgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjaGFuZ2VkRWxlICYmIGNoYW5nZWROb3cpIHtcbiAgICAgICAgICBjaGFuZ2VkLnB1c2goZWxlKTtcbiAgICAgICAgICBjaGFuZ2VkRWxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBmb3IgaiBjbGFzc2VzXG5cbiAgICB9IC8vIGZvciBpIGVsZXNcbiAgICAvLyB0cmlnZ2VyIHVwZGF0ZSBzdHlsZSBvbiB0aG9zZSBlbGVzIHRoYXQgaGFkIGNsYXNzIGNoYW5nZXNcblxuXG4gICAgaWYgKGNoYW5nZWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zcGF3bihjaGFuZ2VkKS51cGRhdGVTdHlsZSgpLmVtaXQoJ2NsYXNzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG4gIH0sXG4gIHJlbW92ZUNsYXNzOiBmdW5jdGlvbiByZW1vdmVDbGFzcyhjbGFzc2VzKSB7XG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlQ2xhc3MoY2xhc3NlcywgZmFsc2UpO1xuICB9LFxuICBmbGFzaENsYXNzOiBmdW5jdGlvbiBmbGFzaENsYXNzKGNsYXNzZXMsIGR1cmF0aW9uKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKGR1cmF0aW9uID09IG51bGwpIHtcbiAgICAgIGR1cmF0aW9uID0gMjUwO1xuICAgIH0gZWxzZSBpZiAoZHVyYXRpb24gPT09IDApIHtcbiAgICAgIHJldHVybiBzZWxmOyAvLyBub3RoaW5nIHRvIGRvIHJlYWxseVxuICAgIH1cblxuICAgIHNlbGYuYWRkQ2xhc3MoY2xhc3Nlcyk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLnJlbW92ZUNsYXNzKGNsYXNzZXMpO1xuICAgIH0sIGR1cmF0aW9uKTtcbiAgICByZXR1cm4gc2VsZjtcbiAgfVxufTtcbmVsZXNmbiRoLmNsYXNzTmFtZSA9IGVsZXNmbiRoLmNsYXNzTmFtZXMgPSBlbGVzZm4kaC5jbGFzc2VzO1xuXG52YXIgdG9rZW5zID0ge1xuICBtZXRhQ2hhcjogJ1tcXFxcIVxcXFxcIlxcXFwjXFxcXCRcXFxcJVxcXFwmXFxcXFxcJ1xcXFwoXFxcXClcXFxcKlxcXFwrXFxcXCxcXFxcLlxcXFwvXFxcXDpcXFxcO1xcXFw8XFxcXD1cXFxcPlxcXFw/XFxcXEBcXFxcW1xcXFxdXFxcXF5cXFxcYFxcXFx7XFxcXHxcXFxcfVxcXFx+XScsXG4gIC8vIGNoYXJzIHdlIG5lZWQgdG8gZXNjYXBlIGluIGxldCBuYW1lcywgZXRjXG4gIGNvbXBhcmF0b3JPcDogJz18XFxcXCE9fD58Pj18PHw8PXxcXFxcJD18XFxcXF49fFxcXFwqPScsXG4gIC8vIGJpbmFyeSBjb21wYXJpc29uIG9wICh1c2VkIGluIGRhdGEgc2VsZWN0b3JzKVxuICBib29sT3A6ICdcXFxcP3xcXFxcIXxcXFxcXicsXG4gIC8vIGJvb2xlYW4gKHVuYXJ5KSBvcGVyYXRvcnMgKHVzZWQgaW4gZGF0YSBzZWxlY3RvcnMpXG4gIHN0cmluZzogJ1wiKD86XFxcXFxcXFxcInxbXlwiXSkqXCInICsgJ3wnICsgXCInKD86XFxcXFxcXFwnfFteJ10pKidcIixcbiAgLy8gc3RyaW5nIGxpdGVyYWxzICh1c2VkIGluIGRhdGEgc2VsZWN0b3JzKSAtLSBkb3VibGVxdW90ZXMgfCBzaW5nbGVxdW90ZXNcbiAgbnVtYmVyOiBudW1iZXIsXG4gIC8vIG51bWJlciBsaXRlcmFsICh1c2VkIGluIGRhdGEgc2VsZWN0b3JzKSAtLS0gZS5nLiAwLjEyMzQsIDEyMzQsIDEyZTEyM1xuICBtZXRhOiAnZGVncmVlfGluZGVncmVlfG91dGRlZ3JlZScsXG4gIC8vIGFsbG93ZWQgbWV0YWRhdGEgZmllbGRzIChpLmUuIGFsbG93ZWQgZnVuY3Rpb25zIHRvIHVzZSBmcm9tIENvbGxlY3Rpb24pXG4gIHNlcGFyYXRvcjogJ1xcXFxzKixcXFxccyonLFxuICAvLyBxdWVyaWVzIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWFzLCBlLmcuIGVkZ2VbZm9vID0gJ2JhciddLCBub2RlLnNvbWVDbGFzc1xuICBkZXNjZW5kYW50OiAnXFxcXHMrJyxcbiAgY2hpbGQ6ICdcXFxccys+XFxcXHMrJyxcbiAgc3ViamVjdDogJ1xcXFwkJyxcbiAgZ3JvdXA6ICdub2RlfGVkZ2V8XFxcXConLFxuICBkaXJlY3RlZEVkZ2U6ICdcXFxccystPlxcXFxzKycsXG4gIHVuZGlyZWN0ZWRFZGdlOiAnXFxcXHMrPC0+XFxcXHMrJ1xufTtcbnRva2Vucy52YXJpYWJsZSA9ICcoPzpbXFxcXHctLl18KD86XFxcXFxcXFwnICsgdG9rZW5zLm1ldGFDaGFyICsgJykpKyc7IC8vIGEgdmFyaWFibGUgbmFtZSBjYW4gaGF2ZSBsZXR0ZXJzLCBudW1iZXJzLCBkYXNoZXMsIGFuZCBwZXJpb2RzXG5cbnRva2Vucy5jbGFzc05hbWUgPSAnKD86W1xcXFx3LV18KD86XFxcXFxcXFwnICsgdG9rZW5zLm1ldGFDaGFyICsgJykpKyc7IC8vIGEgY2xhc3MgbmFtZSBoYXMgdGhlIHNhbWUgcnVsZXMgYXMgYSB2YXJpYWJsZSBleGNlcHQgaXQgY2FuJ3QgaGF2ZSBhICcuJyBpbiB0aGUgbmFtZVxuXG50b2tlbnMudmFsdWUgPSB0b2tlbnMuc3RyaW5nICsgJ3wnICsgdG9rZW5zLm51bWJlcjsgLy8gYSB2YWx1ZSBsaXRlcmFsLCBlaXRoZXIgYSBzdHJpbmcgb3IgbnVtYmVyXG5cbnRva2Vucy5pZCA9IHRva2Vucy52YXJpYWJsZTsgLy8gYW4gZWxlbWVudCBpZCAoZm9sbG93cyB2YXJpYWJsZSBjb252ZW50aW9ucylcblxuKGZ1bmN0aW9uICgpIHtcbiAgdmFyIG9wcywgb3AsIGk7IC8vIGFkZCBAIHZhcmlhbnRzIHRvIGNvbXBhcmF0b3JPcFxuXG4gIG9wcyA9IHRva2Vucy5jb21wYXJhdG9yT3Auc3BsaXQoJ3wnKTtcblxuICBmb3IgKGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3AgPSBvcHNbaV07XG4gICAgdG9rZW5zLmNvbXBhcmF0b3JPcCArPSAnfEAnICsgb3A7XG4gIH0gLy8gYWRkICEgdmFyaWFudHMgdG8gY29tcGFyYXRvck9wXG5cblxuICBvcHMgPSB0b2tlbnMuY29tcGFyYXRvck9wLnNwbGl0KCd8Jyk7XG5cbiAgZm9yIChpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykge1xuICAgIG9wID0gb3BzW2ldO1xuXG4gICAgaWYgKG9wLmluZGV4T2YoJyEnKSA+PSAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIHNraXAgb3BzIHRoYXQgZXhwbGljaXRseSBjb250YWluICFcblxuXG4gICAgaWYgKG9wID09PSAnPScpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gLy8gc2tpcCA9IGIvYyAhPSBpcyBleHBsaWNpdGx5IGRlZmluZWRcblxuXG4gICAgdG9rZW5zLmNvbXBhcmF0b3JPcCArPSAnfFxcXFwhJyArIG9wO1xuICB9XG59KSgpO1xuXG4vKipcbiAqIE1ha2UgYSBuZXcgcXVlcnkgb2JqZWN0XG4gKlxuICogQHByb3AgdHlwZSB7VHlwZX0gVGhlIHR5cGUgZW51bSAoaW50KSBvZiB0aGUgcXVlcnlcbiAqIEBwcm9wIGNoZWNrcyBMaXN0IG9mIGNoZWNrcyB0byBtYWtlIGFnYWluc3QgYW4gZWxlIHRvIHRlc3QgZm9yIGEgbWF0Y2hcbiAqL1xudmFyIG5ld1F1ZXJ5ID0gZnVuY3Rpb24gbmV3UXVlcnkoKSB7XG4gIHJldHVybiB7XG4gICAgY2hlY2tzOiBbXVxuICB9O1xufTtcblxuLyoqXG4gKiBBIGNoZWNrIHR5cGUgZW51bS1saWtlIG9iamVjdC4gIFVzZXMgaW50ZWdlciB2YWx1ZXMgZm9yIGZhc3QgbWF0Y2goKSBsb29rdXAuXG4gKiBUaGUgb3JkZXJpbmcgZG9lcyBub3QgbWF0dGVyIGFzIGxvbmcgYXMgdGhlIGludHMgYXJlIHVuaXF1ZS5cbiAqL1xudmFyIFR5cGUgPSB7XG4gIC8qKiBFLmcuIG5vZGUgKi9cbiAgR1JPVVA6IDAsXG5cbiAgLyoqIEEgY29sbGVjdGlvbiBvZiBlbGVtZW50cyAqL1xuICBDT0xMRUNUSU9OOiAxLFxuXG4gIC8qKiBBIGZpbHRlcihlbGUpIGZ1bmN0aW9uICovXG4gIEZJTFRFUjogMixcblxuICAvKiogRS5nLiBbZm9vID4gMV0gKi9cbiAgREFUQV9DT01QQVJFOiAzLFxuXG4gIC8qKiBFLmcuIFtmb29dICovXG4gIERBVEFfRVhJU1Q6IDQsXG5cbiAgLyoqIEUuZy4gWz9mb29dICovXG4gIERBVEFfQk9PTDogNSxcblxuICAvKiogRS5nLiBbW2RlZ3JlZSA+IDJdXSAqL1xuICBNRVRBX0NPTVBBUkU6IDYsXG5cbiAgLyoqIEUuZy4gOnNlbGVjdGVkICovXG4gIFNUQVRFOiA3LFxuXG4gIC8qKiBFLmcuICNmb28gKi9cbiAgSUQ6IDgsXG5cbiAgLyoqIEUuZy4gLmZvbyAqL1xuICBDTEFTUzogOSxcblxuICAvKiogRS5nLiAjZm9vIDwtPiAjYmFyICovXG4gIFVORElSRUNURURfRURHRTogMTAsXG5cbiAgLyoqIEUuZy4gI2ZvbyAtPiAjYmFyICovXG4gIERJUkVDVEVEX0VER0U6IDExLFxuXG4gIC8qKiBFLmcuICQjZm9vIC0+ICNiYXIgKi9cbiAgTk9ERV9TT1VSQ0U6IDEyLFxuXG4gIC8qKiBFLmcuICNmb28gLT4gJCNiYXIgKi9cbiAgTk9ERV9UQVJHRVQ6IDEzLFxuXG4gIC8qKiBFLmcuICQjZm9vIDwtPiAjYmFyICovXG4gIE5PREVfTkVJR0hCT1I6IDE0LFxuXG4gIC8qKiBFLmcuICNmb28gPiAjYmFyICovXG4gIENISUxEOiAxNSxcblxuICAvKiogRS5nLiAjZm9vICNiYXIgKi9cbiAgREVTQ0VOREFOVDogMTYsXG5cbiAgLyoqIEUuZy4gJCNmb28gPiAjYmFyICovXG4gIFBBUkVOVDogMTcsXG5cbiAgLyoqIEUuZy4gJCNmb28gI2JhciAqL1xuICBBTkNFU1RPUjogMTgsXG5cbiAgLyoqIEUuZy4gI2ZvbyA+ICRiYXIgPiAjYmF6ICovXG4gIENPTVBPVU5EX1NQTElUOiAxOSxcblxuICAvKiogQWx3YXlzIG1hdGNoZXMsIHVzZWZ1bCBwbGFjZWhvbGRlciBmb3Igc3ViamVjdCBpbiBgQ09NUE9VTkRfU1BMSVRgICovXG4gIFRSVUU6IDIwXG59O1xuXG52YXIgc3RhdGVTZWxlY3RvcnMgPSBbe1xuICBzZWxlY3RvcjogJzpzZWxlY3RlZCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5zZWxlY3RlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnVuc2VsZWN0ZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLnNlbGVjdGVkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6c2VsZWN0YWJsZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5zZWxlY3RhYmxlKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6dW5zZWxlY3RhYmxlJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5zZWxlY3RhYmxlKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6bG9ja2VkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmxvY2tlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnVubG9ja2VkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5sb2NrZWQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzp2aXNpYmxlJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLnZpc2libGUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpoaWRkZW4nLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLnZpc2libGUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzp0cmFuc3BhcmVudCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS50cmFuc3BhcmVudCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmdyYWJiZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuZ3JhYmJlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmZyZWUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLmdyYWJiZWQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpyZW1vdmVkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLnJlbW92ZWQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzppbnNpZGUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLnJlbW92ZWQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpncmFiYmFibGUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuZ3JhYmJhYmxlKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6dW5ncmFiYmFibGUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLmdyYWJiYWJsZSgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmFuaW1hdGVkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmFuaW1hdGVkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6dW5hbmltYXRlZCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuYW5pbWF0ZWQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpwYXJlbnQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuaXNQYXJlbnQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpjaGlsZGxlc3MnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuaXNDaGlsZGxlc3MoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpjaGlsZCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5pc0NoaWxkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6b3JwaGFuJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmlzT3JwaGFuKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6bm9ub3JwaGFuJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmlzQ2hpbGQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpjb21wb3VuZCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgcmV0dXJuIGVsZS5pc1BhcmVudCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWxlLnNvdXJjZSgpLmlzUGFyZW50KCkgfHwgZWxlLnRhcmdldCgpLmlzUGFyZW50KCk7XG4gICAgfVxuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmxvb3AnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuaXNMb29wKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6c2ltcGxlJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmlzU2ltcGxlKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6YWN0aXZlJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmFjdGl2ZSgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmluYWN0aXZlJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5hY3RpdmUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpiYWNrZ3JvdW5kaW5nJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmJhY2tncm91bmRpbmcoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpub25iYWNrZ3JvdW5kaW5nJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5iYWNrZ3JvdW5kaW5nKCk7XG4gIH1cbn1dLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgLy8gbi5iLiBzZWxlY3RvcnMgdGhhdCBhcmUgc3RhcnRpbmcgc3Vic3RyaW5ncyBvZiBvdGhlcnMgbXVzdCBoYXZlIHRoZSBsb25nZXIgb25lcyBmaXJzdFxuICByZXR1cm4gZGVzY2VuZGluZyhhLnNlbGVjdG9yLCBiLnNlbGVjdG9yKTtcbn0pO1xuXG52YXIgbG9va3VwID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsVG9GbiA9IHt9O1xuICB2YXIgcztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlU2VsZWN0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgcyA9IHN0YXRlU2VsZWN0b3JzW2ldO1xuICAgIHNlbFRvRm5bcy5zZWxlY3Rvcl0gPSBzLm1hdGNoZXM7XG4gIH1cblxuICByZXR1cm4gc2VsVG9Gbjtcbn0oKTtcblxudmFyIHN0YXRlU2VsZWN0b3JNYXRjaGVzID0gZnVuY3Rpb24gc3RhdGVTZWxlY3Rvck1hdGNoZXMoc2VsLCBlbGUpIHtcbiAgcmV0dXJuIGxvb2t1cFtzZWxdKGVsZSk7XG59O1xudmFyIHN0YXRlU2VsZWN0b3JSZWdleCA9ICcoJyArIHN0YXRlU2VsZWN0b3JzLm1hcChmdW5jdGlvbiAocykge1xuICByZXR1cm4gcy5zZWxlY3Rvcjtcbn0pLmpvaW4oJ3wnKSArICcpJztcblxuLy8gc28gdGhhdCB2YWx1ZXMgZ2V0IGNvbXBhcmVkIHByb3Blcmx5IGluIFNlbGVjdG9yLmZpbHRlcigpXG5cbnZhciBjbGVhbk1ldGFDaGFycyA9IGZ1bmN0aW9uIGNsZWFuTWV0YUNoYXJzKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFxcXFxcXFwoJyArIHRva2Vucy5tZXRhQ2hhciArICcpJywgJ2cnKSwgZnVuY3Rpb24gKG1hdGNoLCAkMSkge1xuICAgIHJldHVybiAkMTtcbiAgfSk7XG59O1xuXG52YXIgcmVwbGFjZUxhc3RRdWVyeSA9IGZ1bmN0aW9uIHJlcGxhY2VMYXN0UXVlcnkoc2VsZWN0b3IsIGV4YW1pbmluZ1F1ZXJ5LCByZXBsYWNlbWVudFF1ZXJ5KSB7XG4gIHNlbGVjdG9yW3NlbGVjdG9yLmxlbmd0aCAtIDFdID0gcmVwbGFjZW1lbnRRdWVyeTtcbn07IC8vIE5PVEU6IGFkZCBuZXcgZXhwcmVzc2lvbiBzeW50YXggaGVyZSB0byBoYXZlIGl0IHJlY29nbmlzZWQgYnkgdGhlIHBhcnNlcjtcbi8vIC0gYSBxdWVyeSBjb250YWlucyBhbGwgYWRqYWNlbnQgKGkuZS4gbm8gc2VwYXJhdG9yIGluIGJldHdlZW4pIGV4cHJlc3Npb25zO1xuLy8gLSB0aGUgY3VycmVudCBxdWVyeSBpcyBzdG9yZWQgaW4gc2VsZWN0b3JbaV1cbi8vIC0geW91IG5lZWQgdG8gY2hlY2sgdGhlIHF1ZXJ5IG9iamVjdHMgaW4gbWF0Y2goKSBmb3IgaXQgYWN0dWFsbHkgZmlsdGVyIHByb3Blcmx5LCBidXQgdGhhdCdzIHByZXR0eSBzdHJhaWdodCBmb3J3YXJkXG5cblxudmFyIGV4cHJzID0gW3tcbiAgbmFtZTogJ2dyb3VwJyxcbiAgLy8ganVzdCB1c2VkIGZvciBpZGVudGlmeWluZyB3aGVuIGRlYnVnZ2luZ1xuICBxdWVyeTogdHJ1ZSxcbiAgcmVnZXg6ICcoJyArIHRva2Vucy5ncm91cCArICcpJyxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSwgX3JlZikge1xuICAgIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDEpLFxuICAgICAgICBncm91cCA9IF9yZWYyWzBdO1xuXG4gICAgcXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgdHlwZTogVHlwZS5HUk9VUCxcbiAgICAgIHZhbHVlOiBncm91cCA9PT0gJyonID8gZ3JvdXAgOiBncm91cCArICdzJ1xuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdzdGF0ZScsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogc3RhdGVTZWxlY3RvclJlZ2V4LFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5LCBfcmVmMykge1xuICAgIHZhciBfcmVmNCA9IF9zbGljZWRUb0FycmF5KF9yZWYzLCAxKSxcbiAgICAgICAgc3RhdGUgPSBfcmVmNFswXTtcblxuICAgIHF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgIHR5cGU6IFR5cGUuU1RBVEUsXG4gICAgICB2YWx1ZTogc3RhdGVcbiAgICB9KTtcbiAgfVxufSwge1xuICBuYW1lOiAnaWQnLFxuICBxdWVyeTogdHJ1ZSxcbiAgcmVnZXg6ICdcXFxcIygnICsgdG9rZW5zLmlkICsgJyknLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5LCBfcmVmNSkge1xuICAgIHZhciBfcmVmNiA9IF9zbGljZWRUb0FycmF5KF9yZWY1LCAxKSxcbiAgICAgICAgaWQgPSBfcmVmNlswXTtcblxuICAgIHF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgIHR5cGU6IFR5cGUuSUQsXG4gICAgICB2YWx1ZTogY2xlYW5NZXRhQ2hhcnMoaWQpXG4gICAgfSk7XG4gIH1cbn0sIHtcbiAgbmFtZTogJ2NsYXNzTmFtZScsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogJ1xcXFwuKCcgKyB0b2tlbnMuY2xhc3NOYW1lICsgJyknLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5LCBfcmVmNykge1xuICAgIHZhciBfcmVmOCA9IF9zbGljZWRUb0FycmF5KF9yZWY3LCAxKSxcbiAgICAgICAgY2xhc3NOYW1lID0gX3JlZjhbMF07XG5cbiAgICBxdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICB0eXBlOiBUeXBlLkNMQVNTLFxuICAgICAgdmFsdWU6IGNsZWFuTWV0YUNoYXJzKGNsYXNzTmFtZSlcbiAgICB9KTtcbiAgfVxufSwge1xuICBuYW1lOiAnZGF0YUV4aXN0cycsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogJ1xcXFxbXFxcXHMqKCcgKyB0b2tlbnMudmFyaWFibGUgKyAnKVxcXFxzKlxcXFxdJyxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSwgX3JlZjkpIHtcbiAgICB2YXIgX3JlZjEwID0gX3NsaWNlZFRvQXJyYXkoX3JlZjksIDEpLFxuICAgICAgICB2YXJpYWJsZSA9IF9yZWYxMFswXTtcblxuICAgIHF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgIHR5cGU6IFR5cGUuREFUQV9FWElTVCxcbiAgICAgIGZpZWxkOiBjbGVhbk1ldGFDaGFycyh2YXJpYWJsZSlcbiAgICB9KTtcbiAgfVxufSwge1xuICBuYW1lOiAnZGF0YUNvbXBhcmUnLFxuICBxdWVyeTogdHJ1ZSxcbiAgcmVnZXg6ICdcXFxcW1xcXFxzKignICsgdG9rZW5zLnZhcmlhYmxlICsgJylcXFxccyooJyArIHRva2Vucy5jb21wYXJhdG9yT3AgKyAnKVxcXFxzKignICsgdG9rZW5zLnZhbHVlICsgJylcXFxccypcXFxcXScsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnksIF9yZWYxMSkge1xuICAgIHZhciBfcmVmMTIgPSBfc2xpY2VkVG9BcnJheShfcmVmMTEsIDMpLFxuICAgICAgICB2YXJpYWJsZSA9IF9yZWYxMlswXSxcbiAgICAgICAgY29tcGFyYXRvck9wID0gX3JlZjEyWzFdLFxuICAgICAgICB2YWx1ZSA9IF9yZWYxMlsyXTtcblxuICAgIHZhciB2YWx1ZUlzU3RyaW5nID0gbmV3IFJlZ0V4cCgnXicgKyB0b2tlbnMuc3RyaW5nICsgJyQnKS5leGVjKHZhbHVlKSAhPSBudWxsO1xuXG4gICAgaWYgKHZhbHVlSXNTdHJpbmcpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgIH1cblxuICAgIHF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgIHR5cGU6IFR5cGUuREFUQV9DT01QQVJFLFxuICAgICAgZmllbGQ6IGNsZWFuTWV0YUNoYXJzKHZhcmlhYmxlKSxcbiAgICAgIG9wZXJhdG9yOiBjb21wYXJhdG9yT3AsXG4gICAgICB2YWx1ZTogdmFsdWVcbiAgICB9KTtcbiAgfVxufSwge1xuICBuYW1lOiAnZGF0YUJvb2wnLFxuICBxdWVyeTogdHJ1ZSxcbiAgcmVnZXg6ICdcXFxcW1xcXFxzKignICsgdG9rZW5zLmJvb2xPcCArICcpXFxcXHMqKCcgKyB0b2tlbnMudmFyaWFibGUgKyAnKVxcXFxzKlxcXFxdJyxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSwgX3JlZjEzKSB7XG4gICAgdmFyIF9yZWYxNCA9IF9zbGljZWRUb0FycmF5KF9yZWYxMywgMiksXG4gICAgICAgIGJvb2xPcCA9IF9yZWYxNFswXSxcbiAgICAgICAgdmFyaWFibGUgPSBfcmVmMTRbMV07XG5cbiAgICBxdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICB0eXBlOiBUeXBlLkRBVEFfQk9PTCxcbiAgICAgIGZpZWxkOiBjbGVhbk1ldGFDaGFycyh2YXJpYWJsZSksXG4gICAgICBvcGVyYXRvcjogYm9vbE9wXG4gICAgfSk7XG4gIH1cbn0sIHtcbiAgbmFtZTogJ21ldGFDb21wYXJlJyxcbiAgcXVlcnk6IHRydWUsXG4gIHJlZ2V4OiAnXFxcXFtcXFxcW1xcXFxzKignICsgdG9rZW5zLm1ldGEgKyAnKVxcXFxzKignICsgdG9rZW5zLmNvbXBhcmF0b3JPcCArICcpXFxcXHMqKCcgKyB0b2tlbnMubnVtYmVyICsgJylcXFxccypcXFxcXVxcXFxdJyxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSwgX3JlZjE1KSB7XG4gICAgdmFyIF9yZWYxNiA9IF9zbGljZWRUb0FycmF5KF9yZWYxNSwgMyksXG4gICAgICAgIG1ldGEgPSBfcmVmMTZbMF0sXG4gICAgICAgIGNvbXBhcmF0b3JPcCA9IF9yZWYxNlsxXSxcbiAgICAgICAgbnVtYmVyID0gX3JlZjE2WzJdO1xuXG4gICAgcXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgdHlwZTogVHlwZS5NRVRBX0NPTVBBUkUsXG4gICAgICBmaWVsZDogY2xlYW5NZXRhQ2hhcnMobWV0YSksXG4gICAgICBvcGVyYXRvcjogY29tcGFyYXRvck9wLFxuICAgICAgdmFsdWU6IHBhcnNlRmxvYXQobnVtYmVyKVxuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICduZXh0UXVlcnknLFxuICBzZXBhcmF0b3I6IHRydWUsXG4gIHJlZ2V4OiB0b2tlbnMuc2VwYXJhdG9yLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5KSB7XG4gICAgdmFyIGN1cnJlbnRTdWJqZWN0ID0gc2VsZWN0b3IuY3VycmVudFN1YmplY3Q7XG4gICAgdmFyIGVkZ2VDb3VudCA9IHNlbGVjdG9yLmVkZ2VDb3VudDtcbiAgICB2YXIgY29tcG91bmRDb3VudCA9IHNlbGVjdG9yLmNvbXBvdW5kQ291bnQ7XG4gICAgdmFyIGxhc3RRID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV07XG5cbiAgICBpZiAoY3VycmVudFN1YmplY3QgIT0gbnVsbCkge1xuICAgICAgbGFzdFEuc3ViamVjdCA9IGN1cnJlbnRTdWJqZWN0O1xuICAgICAgc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPSBudWxsO1xuICAgIH1cblxuICAgIGxhc3RRLmVkZ2VDb3VudCA9IGVkZ2VDb3VudDtcbiAgICBsYXN0US5jb21wb3VuZENvdW50ID0gY29tcG91bmRDb3VudDtcbiAgICBzZWxlY3Rvci5lZGdlQ291bnQgPSAwO1xuICAgIHNlbGVjdG9yLmNvbXBvdW5kQ291bnQgPSAwOyAvLyBnbyBvbiB0byBuZXh0IHF1ZXJ5XG5cbiAgICB2YXIgbmV4dFF1ZXJ5ID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoKytdID0gbmV3UXVlcnkoKTtcbiAgICByZXR1cm4gbmV4dFF1ZXJ5OyAvLyB0aGlzIGlzIHRoZSBuZXcgcXVlcnkgdG8gYmUgZmlsbGVkIGJ5IHRoZSBmb2xsb3dpbmcgZXhwcnNcbiAgfVxufSwge1xuICBuYW1lOiAnZGlyZWN0ZWRFZGdlJyxcbiAgc2VwYXJhdG9yOiB0cnVlLFxuICByZWdleDogdG9rZW5zLmRpcmVjdGVkRWRnZSxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSkge1xuICAgIGlmIChzZWxlY3Rvci5jdXJyZW50U3ViamVjdCA9PSBudWxsKSB7XG4gICAgICAvLyB1bmRpcmVjdGVkIGVkZ2VcbiAgICAgIHZhciBlZGdlUXVlcnkgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIHNvdXJjZSA9IHF1ZXJ5O1xuICAgICAgdmFyIHRhcmdldCA9IG5ld1F1ZXJ5KCk7XG4gICAgICBlZGdlUXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLkRJUkVDVEVEX0VER0UsXG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICB0YXJnZXQ6IHRhcmdldFxuICAgICAgfSk7IC8vIHRoZSBxdWVyeSBpbiB0aGUgc2VsZWN0b3Igc2hvdWxkIGJlIHRoZSBlZGdlIHJhdGhlciB0aGFuIHRoZSBzb3VyY2VcblxuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgcXVlcnksIGVkZ2VRdWVyeSk7XG4gICAgICBzZWxlY3Rvci5lZGdlQ291bnQrKzsgLy8gd2UncmUgbm93IHBvcHVsYXRpbmcgdGhlIHRhcmdldCBxdWVyeSB3aXRoIGV4cHJlc3Npb25zIHRoYXQgZm9sbG93XG5cbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNvdXJjZS90YXJnZXRcbiAgICAgIHZhciBzcmNUZ3RRID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBfc291cmNlID0gcXVlcnk7XG5cbiAgICAgIHZhciBfdGFyZ2V0ID0gbmV3UXVlcnkoKTtcblxuICAgICAgc3JjVGd0US5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuTk9ERV9TT1VSQ0UsXG4gICAgICAgIHNvdXJjZTogX3NvdXJjZSxcbiAgICAgICAgdGFyZ2V0OiBfdGFyZ2V0XG4gICAgICB9KTsgLy8gdGhlIHF1ZXJ5IGluIHRoZSBzZWxlY3RvciBzaG91bGQgYmUgdGhlIG5laWdoYm91cmhvb2QgcmF0aGVyIHRoYW4gdGhlIG5vZGVcblxuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgcXVlcnksIHNyY1RndFEpO1xuICAgICAgc2VsZWN0b3IuZWRnZUNvdW50Kys7XG4gICAgICByZXR1cm4gX3RhcmdldDsgLy8gbm93IHBvcHVsYXRpbmcgdGhlIHRhcmdldCB3aXRoIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbnNcbiAgICB9XG4gIH1cbn0sIHtcbiAgbmFtZTogJ3VuZGlyZWN0ZWRFZGdlJyxcbiAgc2VwYXJhdG9yOiB0cnVlLFxuICByZWdleDogdG9rZW5zLnVuZGlyZWN0ZWRFZGdlLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5KSB7XG4gICAgaWYgKHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID09IG51bGwpIHtcbiAgICAgIC8vIHVuZGlyZWN0ZWQgZWRnZVxuICAgICAgdmFyIGVkZ2VRdWVyeSA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgc291cmNlID0gcXVlcnk7XG4gICAgICB2YXIgdGFyZ2V0ID0gbmV3UXVlcnkoKTtcbiAgICAgIGVkZ2VRdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuVU5ESVJFQ1RFRF9FREdFLFxuICAgICAgICBub2RlczogW3NvdXJjZSwgdGFyZ2V0XVxuICAgICAgfSk7IC8vIHRoZSBxdWVyeSBpbiB0aGUgc2VsZWN0b3Igc2hvdWxkIGJlIHRoZSBlZGdlIHJhdGhlciB0aGFuIHRoZSBzb3VyY2VcblxuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgcXVlcnksIGVkZ2VRdWVyeSk7XG4gICAgICBzZWxlY3Rvci5lZGdlQ291bnQrKzsgLy8gd2UncmUgbm93IHBvcHVsYXRpbmcgdGhlIHRhcmdldCBxdWVyeSB3aXRoIGV4cHJlc3Npb25zIHRoYXQgZm9sbG93XG5cbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5laWdoYm91cmhvb2RcbiAgICAgIHZhciBuaG9vZFEgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIG5vZGUgPSBxdWVyeTtcbiAgICAgIHZhciBuZWlnaGJvciA9IG5ld1F1ZXJ5KCk7XG4gICAgICBuaG9vZFEuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLk5PREVfTkVJR0hCT1IsXG4gICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgIG5laWdoYm9yOiBuZWlnaGJvclxuICAgICAgfSk7IC8vIHRoZSBxdWVyeSBpbiB0aGUgc2VsZWN0b3Igc2hvdWxkIGJlIHRoZSBuZWlnaGJvdXJob29kIHJhdGhlciB0aGFuIHRoZSBub2RlXG5cbiAgICAgIHJlcGxhY2VMYXN0UXVlcnkoc2VsZWN0b3IsIHF1ZXJ5LCBuaG9vZFEpO1xuICAgICAgcmV0dXJuIG5laWdoYm9yOyAvLyBub3cgcG9wdWxhdGluZyB0aGUgbmVpZ2hib3Igd2l0aCBmb2xsb3dpbmcgZXhwcmVzc2lvbnNcbiAgICB9XG4gIH1cbn0sIHtcbiAgbmFtZTogJ2NoaWxkJyxcbiAgc2VwYXJhdG9yOiB0cnVlLFxuICByZWdleDogdG9rZW5zLmNoaWxkLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5KSB7XG4gICAgaWYgKHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID09IG51bGwpIHtcbiAgICAgIC8vIGRlZmF1bHQ6IGNoaWxkIHF1ZXJ5XG4gICAgICB2YXIgcGFyZW50Q2hpbGRRdWVyeSA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgY2hpbGQgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIHBhcmVudCA9IHNlbGVjdG9yW3NlbGVjdG9yLmxlbmd0aCAtIDFdO1xuICAgICAgcGFyZW50Q2hpbGRRdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuQ0hJTEQsXG4gICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICBjaGlsZDogY2hpbGRcbiAgICAgIH0pOyAvLyB0aGUgcXVlcnkgaW4gdGhlIHNlbGVjdG9yIHNob3VsZCBiZSB0aGUgJz4nIGl0c2VsZlxuXG4gICAgICByZXBsYWNlTGFzdFF1ZXJ5KHNlbGVjdG9yLCBxdWVyeSwgcGFyZW50Q2hpbGRRdWVyeSk7XG4gICAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50Kys7IC8vIHdlJ3JlIG5vdyBwb3B1bGF0aW5nIHRoZSBjaGlsZCBxdWVyeSB3aXRoIGV4cHJlc3Npb25zIHRoYXQgZm9sbG93XG5cbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID09PSBxdWVyeSkge1xuICAgICAgLy8gY29tcG91bmQgc3BsaXQgcXVlcnlcbiAgICAgIHZhciBjb21wb3VuZCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgbGVmdCA9IHNlbGVjdG9yW3NlbGVjdG9yLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIHJpZ2h0ID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBzdWJqZWN0ID0gbmV3UXVlcnkoKTtcblxuICAgICAgdmFyIF9jaGlsZCA9IG5ld1F1ZXJ5KCk7XG5cbiAgICAgIHZhciBfcGFyZW50ID0gbmV3UXVlcnkoKTsgLy8gc2V0IHVwIHRoZSByb290IGNvbXBvdW5kIHFcblxuXG4gICAgICBjb21wb3VuZC5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuQ09NUE9VTkRfU1BMSVQsXG4gICAgICAgIGxlZnQ6IGxlZnQsXG4gICAgICAgIHJpZ2h0OiByaWdodCxcbiAgICAgICAgc3ViamVjdDogc3ViamVjdFxuICAgICAgfSk7IC8vIHBvcHVsYXRlIHRoZSBzdWJqZWN0IGFuZCByZXBsYWNlIHRoZSBxIGF0IHRoZSBvbGQgc3BvdCAod2l0aGluIGxlZnQpIHdpdGggVFJVRVxuXG4gICAgICBzdWJqZWN0LmNoZWNrcyA9IHF1ZXJ5LmNoZWNrczsgLy8gdGFrZSB0aGUgY2hlY2tzIGZyb20gdGhlIGxlZnRcblxuICAgICAgcXVlcnkuY2hlY2tzID0gW3tcbiAgICAgICAgdHlwZTogVHlwZS5UUlVFXG4gICAgICB9XTsgLy8gY2hlY2tzIHVuZGVyIGxlZnQgcmVmcyB0aGUgc3ViamVjdCBpbXBsaWNpdGx5XG4gICAgICAvLyBzZXQgdXAgdGhlIHJpZ2h0IHFcblxuICAgICAgX3BhcmVudC5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuVFJVRVxuICAgICAgfSk7IC8vIHBhcmVudCBpbXBsaWNpdGx5IHJlZnMgdGhlIHN1YmplY3RcblxuXG4gICAgICByaWdodC5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuUEFSRU5ULFxuICAgICAgICAvLyB0eXBlIGlzIHN3YXBwZWQgb24gcmlnaHQgc2lkZSBxdWVyaWVzXG4gICAgICAgIHBhcmVudDogX3BhcmVudCxcbiAgICAgICAgY2hpbGQ6IF9jaGlsZCAvLyBlbXB0eSBmb3Igbm93XG5cbiAgICAgIH0pO1xuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgbGVmdCwgY29tcG91bmQpOyAvLyB1cGRhdGUgdGhlIHJlZiBzaW5jZSB3ZSBtb3ZlZCB0aGluZ3MgYXJvdW5kIGZvciBgcXVlcnlgXG5cbiAgICAgIHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID0gc3ViamVjdDtcbiAgICAgIHNlbGVjdG9yLmNvbXBvdW5kQ291bnQrKztcbiAgICAgIHJldHVybiBfY2hpbGQ7IC8vIG5vdyBwb3B1bGF0aW5nIHRoZSByaWdodCBzaWRlJ3MgY2hpbGRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcGFyZW50IHF1ZXJ5XG4gICAgICAvLyBpbmZvIGZvciBwYXJlbnQgcXVlcnlcbiAgICAgIHZhciBfcGFyZW50MiA9IG5ld1F1ZXJ5KCk7XG5cbiAgICAgIHZhciBfY2hpbGQyID0gbmV3UXVlcnkoKTtcblxuICAgICAgdmFyIHBjUUNoZWNrcyA9IFt7XG4gICAgICAgIHR5cGU6IFR5cGUuUEFSRU5ULFxuICAgICAgICBwYXJlbnQ6IF9wYXJlbnQyLFxuICAgICAgICBjaGlsZDogX2NoaWxkMlxuICAgICAgfV07IC8vIHRoZSBwYXJlbnQtY2hpbGQgcXVlcnkgdGFrZXMgdGhlIHBsYWNlIG9mIHRoZSBxdWVyeSBwcmV2aW91c2x5IGJlaW5nIHBvcHVsYXRlZFxuXG4gICAgICBfcGFyZW50Mi5jaGVja3MgPSBxdWVyeS5jaGVja3M7IC8vIHRoZSBwcmV2aW91cyBxdWVyeSBjb250YWlucyB0aGUgY2hlY2tzIGZvciB0aGUgcGFyZW50XG5cbiAgICAgIHF1ZXJ5LmNoZWNrcyA9IHBjUUNoZWNrczsgLy8gcGMgcXVlcnkgdGFrZXMgb3ZlclxuXG4gICAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50Kys7XG4gICAgICByZXR1cm4gX2NoaWxkMjsgLy8gd2UncmUgbm93IHBvcHVsYXRpbmcgdGhlIGNoaWxkXG4gICAgfVxuICB9XG59LCB7XG4gIG5hbWU6ICdkZXNjZW5kYW50JyxcbiAgc2VwYXJhdG9yOiB0cnVlLFxuICByZWdleDogdG9rZW5zLmRlc2NlbmRhbnQsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnkpIHtcbiAgICBpZiAoc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPT0gbnVsbCkge1xuICAgICAgLy8gZGVmYXVsdDogZGVzY2VuZGFudCBxdWVyeVxuICAgICAgdmFyIGFuY0NoUXVlcnkgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIGRlc2NlbmRhbnQgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIGFuY2VzdG9yID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV07XG4gICAgICBhbmNDaFF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5ERVNDRU5EQU5ULFxuICAgICAgICBhbmNlc3RvcjogYW5jZXN0b3IsXG4gICAgICAgIGRlc2NlbmRhbnQ6IGRlc2NlbmRhbnRcbiAgICAgIH0pOyAvLyB0aGUgcXVlcnkgaW4gdGhlIHNlbGVjdG9yIHNob3VsZCBiZSB0aGUgJz4nIGl0c2VsZlxuXG4gICAgICByZXBsYWNlTGFzdFF1ZXJ5KHNlbGVjdG9yLCBxdWVyeSwgYW5jQ2hRdWVyeSk7XG4gICAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50Kys7IC8vIHdlJ3JlIG5vdyBwb3B1bGF0aW5nIHRoZSBkZXNjZW5kYW50IHF1ZXJ5IHdpdGggZXhwcmVzc2lvbnMgdGhhdCBmb2xsb3dcblxuICAgICAgcmV0dXJuIGRlc2NlbmRhbnQ7XG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5jdXJyZW50U3ViamVjdCA9PT0gcXVlcnkpIHtcbiAgICAgIC8vIGNvbXBvdW5kIHNwbGl0IHF1ZXJ5XG4gICAgICB2YXIgY29tcG91bmQgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIGxlZnQgPSBzZWxlY3RvcltzZWxlY3Rvci5sZW5ndGggLSAxXTtcbiAgICAgIHZhciByaWdodCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgc3ViamVjdCA9IG5ld1F1ZXJ5KCk7XG5cbiAgICAgIHZhciBfZGVzY2VuZGFudCA9IG5ld1F1ZXJ5KCk7XG5cbiAgICAgIHZhciBfYW5jZXN0b3IgPSBuZXdRdWVyeSgpOyAvLyBzZXQgdXAgdGhlIHJvb3QgY29tcG91bmQgcVxuXG5cbiAgICAgIGNvbXBvdW5kLmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5DT01QT1VORF9TUExJVCxcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgcmlnaHQ6IHJpZ2h0LFxuICAgICAgICBzdWJqZWN0OiBzdWJqZWN0XG4gICAgICB9KTsgLy8gcG9wdWxhdGUgdGhlIHN1YmplY3QgYW5kIHJlcGxhY2UgdGhlIHEgYXQgdGhlIG9sZCBzcG90ICh3aXRoaW4gbGVmdCkgd2l0aCBUUlVFXG5cbiAgICAgIHN1YmplY3QuY2hlY2tzID0gcXVlcnkuY2hlY2tzOyAvLyB0YWtlIHRoZSBjaGVja3MgZnJvbSB0aGUgbGVmdFxuXG4gICAgICBxdWVyeS5jaGVja3MgPSBbe1xuICAgICAgICB0eXBlOiBUeXBlLlRSVUVcbiAgICAgIH1dOyAvLyBjaGVja3MgdW5kZXIgbGVmdCByZWZzIHRoZSBzdWJqZWN0IGltcGxpY2l0bHlcbiAgICAgIC8vIHNldCB1cCB0aGUgcmlnaHQgcVxuXG4gICAgICBfYW5jZXN0b3IuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLlRSVUVcbiAgICAgIH0pOyAvLyBhbmNlc3RvciBpbXBsaWNpdGx5IHJlZnMgdGhlIHN1YmplY3RcblxuXG4gICAgICByaWdodC5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuQU5DRVNUT1IsXG4gICAgICAgIC8vIHR5cGUgaXMgc3dhcHBlZCBvbiByaWdodCBzaWRlIHF1ZXJpZXNcbiAgICAgICAgYW5jZXN0b3I6IF9hbmNlc3RvcixcbiAgICAgICAgZGVzY2VuZGFudDogX2Rlc2NlbmRhbnQgLy8gZW1wdHkgZm9yIG5vd1xuXG4gICAgICB9KTtcbiAgICAgIHJlcGxhY2VMYXN0UXVlcnkoc2VsZWN0b3IsIGxlZnQsIGNvbXBvdW5kKTsgLy8gdXBkYXRlIHRoZSByZWYgc2luY2Ugd2UgbW92ZWQgdGhpbmdzIGFyb3VuZCBmb3IgYHF1ZXJ5YFxuXG4gICAgICBzZWxlY3Rvci5jdXJyZW50U3ViamVjdCA9IHN1YmplY3Q7XG4gICAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50Kys7XG4gICAgICByZXR1cm4gX2Rlc2NlbmRhbnQ7IC8vIG5vdyBwb3B1bGF0aW5nIHRoZSByaWdodCBzaWRlJ3MgZGVzY2VuZGFudFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhbmNlc3RvciBxdWVyeVxuICAgICAgLy8gaW5mbyBmb3IgcGFyZW50IHF1ZXJ5XG4gICAgICB2YXIgX2FuY2VzdG9yMiA9IG5ld1F1ZXJ5KCk7XG5cbiAgICAgIHZhciBfZGVzY2VuZGFudDIgPSBuZXdRdWVyeSgpO1xuXG4gICAgICB2YXIgYWRRQ2hlY2tzID0gW3tcbiAgICAgICAgdHlwZTogVHlwZS5BTkNFU1RPUixcbiAgICAgICAgYW5jZXN0b3I6IF9hbmNlc3RvcjIsXG4gICAgICAgIGRlc2NlbmRhbnQ6IF9kZXNjZW5kYW50MlxuICAgICAgfV07IC8vIHRoZSBwYXJlbnQtY2hpbGQgcXVlcnkgdGFrZXMgdGhlIHBsYWNlIG9mIHRoZSBxdWVyeSBwcmV2aW91c2x5IGJlaW5nIHBvcHVsYXRlZFxuXG4gICAgICBfYW5jZXN0b3IyLmNoZWNrcyA9IHF1ZXJ5LmNoZWNrczsgLy8gdGhlIHByZXZpb3VzIHF1ZXJ5IGNvbnRhaW5zIHRoZSBjaGVja3MgZm9yIHRoZSBwYXJlbnRcblxuICAgICAgcXVlcnkuY2hlY2tzID0gYWRRQ2hlY2tzOyAvLyBwYyBxdWVyeSB0YWtlcyBvdmVyXG5cbiAgICAgIHNlbGVjdG9yLmNvbXBvdW5kQ291bnQrKztcbiAgICAgIHJldHVybiBfZGVzY2VuZGFudDI7IC8vIHdlJ3JlIG5vdyBwb3B1bGF0aW5nIHRoZSBjaGlsZFxuICAgIH1cbiAgfVxufSwge1xuICBuYW1lOiAnc3ViamVjdCcsXG4gIG1vZGlmaWVyOiB0cnVlLFxuICByZWdleDogdG9rZW5zLnN1YmplY3QsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnkpIHtcbiAgICBpZiAoc2VsZWN0b3IuY3VycmVudFN1YmplY3QgIT0gbnVsbCAmJiBzZWxlY3Rvci5jdXJyZW50U3ViamVjdCAhPT0gcXVlcnkpIHtcbiAgICAgIHdhcm4oJ1JlZGVmaW5pdGlvbiBvZiBzdWJqZWN0IGluIHNlbGVjdG9yIGAnICsgc2VsZWN0b3IudG9TdHJpbmcoKSArICdgJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPSBxdWVyeTtcbiAgICB2YXIgdG9wUSA9IHNlbGVjdG9yW3NlbGVjdG9yLmxlbmd0aCAtIDFdO1xuICAgIHZhciB0b3BDaGsgPSB0b3BRLmNoZWNrc1swXTtcbiAgICB2YXIgdG9wVHlwZSA9IHRvcENoayA9PSBudWxsID8gbnVsbCA6IHRvcENoay50eXBlO1xuXG4gICAgaWYgKHRvcFR5cGUgPT09IFR5cGUuRElSRUNURURfRURHRSkge1xuICAgICAgLy8gZGlyZWN0ZWQgZWRnZSB3aXRoIHN1YmplY3Qgb24gdGhlIHRhcmdldFxuICAgICAgLy8gY2hhbmdlIHRvIHRhcmdldCBub2RlIGNoZWNrXG4gICAgICB0b3BDaGsudHlwZSA9IFR5cGUuTk9ERV9UQVJHRVQ7XG4gICAgfSBlbHNlIGlmICh0b3BUeXBlID09PSBUeXBlLlVORElSRUNURURfRURHRSkge1xuICAgICAgLy8gdW5kaXJlY3RlZCBlZGdlIHdpdGggc3ViamVjdCBvbiB0aGUgc2Vjb25kIG5vZGVcbiAgICAgIC8vIGNoYW5nZSB0byBuZWlnaGJvciBjaGVja1xuICAgICAgdG9wQ2hrLnR5cGUgPSBUeXBlLk5PREVfTkVJR0hCT1I7XG4gICAgICB0b3BDaGsubm9kZSA9IHRvcENoay5ub2Rlc1sxXTsgLy8gc2Vjb25kIG5vZGUgaXMgc3ViamVjdFxuXG4gICAgICB0b3BDaGsubmVpZ2hib3IgPSB0b3BDaGsubm9kZXNbMF07IC8vIGNsZWFuIHVwIHVudXNlZCBmaWVsZHMgZm9yIG5ldyB0eXBlXG5cbiAgICAgIHRvcENoay5ub2RlcyA9IG51bGw7XG4gICAgfVxuICB9XG59XTtcbmV4cHJzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgcmV0dXJuIGUucmVnZXhPYmogPSBuZXcgUmVnRXhwKCdeJyArIGUucmVnZXgpO1xufSk7XG5cbi8qKlxuICogT2YgYWxsIHRoZSBleHByZXNzaW9ucywgZmluZCB0aGUgZmlyc3QgbWF0Y2ggaW4gdGhlIHJlbWFpbmluZyB0ZXh0LlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbWFpbmluZyBUaGUgcmVtYWluaW5nIHRleHQgdG8gcGFyc2VcbiAqIEByZXR1cm5zIFRoZSBtYXRjaGVkIGV4cHJlc3Npb24gYW5kIHRoZSBuZXdseSByZW1haW5pbmcgdGV4dCBgeyBleHByLCBtYXRjaCwgbmFtZSwgcmVtYWluaW5nIH1gXG4gKi9cblxudmFyIGNvbnN1bWVFeHByID0gZnVuY3Rpb24gY29uc3VtZUV4cHIocmVtYWluaW5nKSB7XG4gIHZhciBleHByO1xuICB2YXIgbWF0Y2g7XG4gIHZhciBuYW1lO1xuXG4gIGZvciAodmFyIGogPSAwOyBqIDwgZXhwcnMubGVuZ3RoOyBqKyspIHtcbiAgICB2YXIgZSA9IGV4cHJzW2pdO1xuICAgIHZhciBuID0gZS5uYW1lO1xuICAgIHZhciBtID0gcmVtYWluaW5nLm1hdGNoKGUucmVnZXhPYmopO1xuXG4gICAgaWYgKG0gIT0gbnVsbCkge1xuICAgICAgbWF0Y2ggPSBtO1xuICAgICAgZXhwciA9IGU7XG4gICAgICBuYW1lID0gbjtcbiAgICAgIHZhciBjb25zdW1lZCA9IG1bMF07XG4gICAgICByZW1haW5pbmcgPSByZW1haW5pbmcuc3Vic3RyaW5nKGNvbnN1bWVkLmxlbmd0aCk7XG4gICAgICBicmVhazsgLy8gd2UndmUgY29uc3VtZWQgb25lIGV4cHIsIHNvIHdlIGNhbiByZXR1cm4gbm93XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBleHByOiBleHByLFxuICAgIG1hdGNoOiBtYXRjaCxcbiAgICBuYW1lOiBuYW1lLFxuICAgIHJlbWFpbmluZzogcmVtYWluaW5nXG4gIH07XG59O1xuLyoqXG4gKiBDb25zdW1lIGFsbCB0aGUgbGVhZGluZyB3aGl0ZXNwYWNlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtYWluaW5nIFRoZSB0ZXh0IHRvIGNvbnN1bWVcbiAqIEByZXR1cm5zIFRoZSB0ZXh0IHdpdGggdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSByZW1vdmVkXG4gKi9cblxuXG52YXIgY29uc3VtZVdoaXRlc3BhY2UgPSBmdW5jdGlvbiBjb25zdW1lV2hpdGVzcGFjZShyZW1haW5pbmcpIHtcbiAgdmFyIG1hdGNoID0gcmVtYWluaW5nLm1hdGNoKC9eXFxzKy8pO1xuXG4gIGlmIChtYXRjaCkge1xuICAgIHZhciBjb25zdW1lZCA9IG1hdGNoWzBdO1xuICAgIHJlbWFpbmluZyA9IHJlbWFpbmluZy5zdWJzdHJpbmcoY29uc3VtZWQubGVuZ3RoKTtcbiAgfVxuXG4gIHJldHVybiByZW1haW5pbmc7XG59O1xuLyoqXG4gKiBQYXJzZSB0aGUgc3RyaW5nIGFuZCBzdG9yZSB0aGUgcGFyc2VkIHJlcHJlc2VudGF0aW9uIGluIHRoZSBTZWxlY3Rvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBUaGUgc2VsZWN0b3Igc3RyaW5nXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHNlbGVjdG9yIHdhcyBzdWNjZXNzZnVsbHkgcGFyc2VkLCBgZmFsc2VgIG90aGVyd2lzZVxuICovXG5cblxudmFyIHBhcnNlID0gZnVuY3Rpb24gcGFyc2Uoc2VsZWN0b3IpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcmVtYWluaW5nID0gc2VsZi5pbnB1dFRleHQgPSBzZWxlY3RvcjtcbiAgdmFyIGN1cnJlbnRRdWVyeSA9IHNlbGZbMF0gPSBuZXdRdWVyeSgpO1xuICBzZWxmLmxlbmd0aCA9IDE7XG4gIHJlbWFpbmluZyA9IGNvbnN1bWVXaGl0ZXNwYWNlKHJlbWFpbmluZyk7IC8vIGdldCByaWQgb2YgbGVhZGluZyB3aGl0ZXNwYWNlXG5cbiAgZm9yICg7Oykge1xuICAgIHZhciBleHBySW5mbyA9IGNvbnN1bWVFeHByKHJlbWFpbmluZyk7XG5cbiAgICBpZiAoZXhwckluZm8uZXhwciA9PSBudWxsKSB7XG4gICAgICB3YXJuKCdUaGUgc2VsZWN0b3IgYCcgKyBzZWxlY3RvciArICdgaXMgaW52YWxpZCcpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXJncyA9IGV4cHJJbmZvLm1hdGNoLnNsaWNlKDEpOyAvLyBsZXQgdGhlIHRva2VuIHBvcHVsYXRlIHRoZSBzZWxlY3RvciBvYmplY3QgaW4gY3VycmVudFF1ZXJ5XG5cbiAgICAgIHZhciByZXQgPSBleHBySW5mby5leHByLnBvcHVsYXRlKHNlbGYsIGN1cnJlbnRRdWVyeSwgYXJncyk7XG5cbiAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gZXhpdCBpZiBwb3B1bGF0aW9uIGZhaWxlZFxuICAgICAgfSBlbHNlIGlmIChyZXQgIT0gbnVsbCkge1xuICAgICAgICBjdXJyZW50UXVlcnkgPSByZXQ7IC8vIGNoYW5nZSB0aGUgY3VycmVudCBxdWVyeSB0byBiZSBmaWxsZWQgaWYgdGhlIGV4cHIgc3BlY2lmaWVzXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVtYWluaW5nID0gZXhwckluZm8ucmVtYWluaW5nOyAvLyB3ZSdyZSBkb25lIHdoZW4gdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gcGFyc2VcblxuICAgIGlmIChyZW1haW5pbmcubWF0Y2goL15cXHMqJC8pKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgbGFzdFEgPSBzZWxmW3NlbGYubGVuZ3RoIC0gMV07XG5cbiAgaWYgKHNlbGYuY3VycmVudFN1YmplY3QgIT0gbnVsbCkge1xuICAgIGxhc3RRLnN1YmplY3QgPSBzZWxmLmN1cnJlbnRTdWJqZWN0O1xuICB9XG5cbiAgbGFzdFEuZWRnZUNvdW50ID0gc2VsZi5lZGdlQ291bnQ7XG4gIGxhc3RRLmNvbXBvdW5kQ291bnQgPSBzZWxmLmNvbXBvdW5kQ291bnQ7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHEgPSBzZWxmW2ldOyAvLyBpbiBmdXR1cmUsIHRoaXMgY291bGQgcG90ZW50aWFsbHkgYmUgYWxsb3dlZCBpZiB0aGVyZSB3ZXJlIG9wZXJhdG9yIHByZWNlZGVuY2UgYW5kIGRldGVjdGlvbiBvZiBpbnZhbGlkIGNvbWJpbmF0aW9uc1xuXG4gICAgaWYgKHEuY29tcG91bmRDb3VudCA+IDAgJiYgcS5lZGdlQ291bnQgPiAwKSB7XG4gICAgICB3YXJuKCdUaGUgc2VsZWN0b3IgYCcgKyBzZWxlY3RvciArICdgIGlzIGludmFsaWQgYmVjYXVzZSBpdCB1c2VzIGJvdGggYSBjb21wb3VuZCBzZWxlY3RvciBhbmQgYW4gZWRnZSBzZWxlY3RvcicpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChxLmVkZ2VDb3VudCA+IDEpIHtcbiAgICAgIHdhcm4oJ1RoZSBzZWxlY3RvciBgJyArIHNlbGVjdG9yICsgJ2AgaXMgaW52YWxpZCBiZWNhdXNlIGl0IHVzZXMgbXVsdGlwbGUgZWRnZSBzZWxlY3RvcnMnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHEuZWRnZUNvdW50ID09PSAxKSB7XG4gICAgICB3YXJuKCdUaGUgc2VsZWN0b3IgYCcgKyBzZWxlY3RvciArICdgIGlzIGRlcHJlY2F0ZWQuICBFZGdlIHNlbGVjdG9ycyBkbyBub3QgdGFrZSBlZmZlY3Qgb24gY2hhbmdlcyB0byBzb3VyY2UgYW5kIHRhcmdldCBub2RlcyBhZnRlciBhbiBlZGdlIGlzIGFkZGVkLCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gIFVzZSBhIGNsYXNzIG9yIGRhdGEgc2VsZWN0b3Igb24gZWRnZXMgaW5zdGVhZCwgdXBkYXRpbmcgdGhlIGNsYXNzIG9yIGRhdGEgb2YgYW4gZWRnZSB3aGVuIHlvdXIgYXBwIGRldGVjdHMgYSBjaGFuZ2UgaW4gc291cmNlIG9yIHRhcmdldCBub2Rlcy4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTsgLy8gc3VjY2Vzc1xufTtcbi8qKlxuICogR2V0IHRoZSBzZWxlY3RvciByZXByZXNlbnRlZCBhcyBhIHN0cmluZy4gIFRoaXMgdmFsdWUgdXNlcyBkZWZhdWx0IGZvcm1hdHRpbmcsXG4gKiBzbyB0aGluZ3MgbGlrZSBzcGFjaW5nIG1heSBkaWZmZXIgZnJvbSB0aGUgaW5wdXQgdGV4dCBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHNlbGVjdG9yIHN0cmluZ1xuICovXG5cblxudmFyIHRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIGlmICh0aGlzLnRvU3RyaW5nQ2FjaGUgIT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLnRvU3RyaW5nQ2FjaGU7XG4gIH1cblxuICB2YXIgY2xlYW4gPSBmdW5jdGlvbiBjbGVhbihvYmopIHtcbiAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGNsZWFuVmFsID0gZnVuY3Rpb24gY2xlYW5WYWwodmFsKSB7XG4gICAgaWYgKHN0cmluZyh2YWwpKSB7XG4gICAgICByZXR1cm4gJ1wiJyArIHZhbCArICdcIic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjbGVhbih2YWwpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgc3BhY2UgPSBmdW5jdGlvbiBzcGFjZSh2YWwpIHtcbiAgICByZXR1cm4gJyAnICsgdmFsICsgJyAnO1xuICB9O1xuXG4gIHZhciBjaGVja1RvU3RyaW5nID0gZnVuY3Rpb24gY2hlY2tUb1N0cmluZyhjaGVjaywgc3ViamVjdCkge1xuICAgIHZhciB0eXBlID0gY2hlY2sudHlwZSxcbiAgICAgICAgdmFsdWUgPSBjaGVjay52YWx1ZTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBUeXBlLkdST1VQOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGdyb3VwID0gY2xlYW4odmFsdWUpO1xuICAgICAgICAgIHJldHVybiBncm91cC5zdWJzdHJpbmcoMCwgZ3JvdXAubGVuZ3RoIC0gMSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBUeXBlLkRBVEFfQ09NUEFSRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBmaWVsZCA9IGNoZWNrLmZpZWxkLFxuICAgICAgICAgICAgICBvcGVyYXRvciA9IGNoZWNrLm9wZXJhdG9yO1xuICAgICAgICAgIHJldHVybiAnWycgKyBmaWVsZCArIHNwYWNlKGNsZWFuKG9wZXJhdG9yKSkgKyBjbGVhblZhbCh2YWx1ZSkgKyAnXSc7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBUeXBlLkRBVEFfQk9PTDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfb3BlcmF0b3IgPSBjaGVjay5vcGVyYXRvcixcbiAgICAgICAgICAgICAgX2ZpZWxkID0gY2hlY2suZmllbGQ7XG4gICAgICAgICAgcmV0dXJuICdbJyArIGNsZWFuKF9vcGVyYXRvcikgKyBfZmllbGQgKyAnXSc7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBUeXBlLkRBVEFfRVhJU1Q6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX2ZpZWxkMiA9IGNoZWNrLmZpZWxkO1xuICAgICAgICAgIHJldHVybiAnWycgKyBfZmllbGQyICsgJ10nO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgVHlwZS5NRVRBX0NPTVBBUkU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX29wZXJhdG9yMiA9IGNoZWNrLm9wZXJhdG9yLFxuICAgICAgICAgICAgICBfZmllbGQzID0gY2hlY2suZmllbGQ7XG4gICAgICAgICAgcmV0dXJuICdbWycgKyBfZmllbGQzICsgc3BhY2UoY2xlYW4oX29wZXJhdG9yMikpICsgY2xlYW5WYWwodmFsdWUpICsgJ11dJztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFR5cGUuU1RBVEU6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBUeXBlLklEOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuICcjJyArIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgVHlwZS5DTEFTUzpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiAnLicgKyB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFR5cGUuUEFSRU5UOlxuICAgICAgY2FzZSBUeXBlLkNISUxEOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHF1ZXJ5VG9TdHJpbmcoY2hlY2sucGFyZW50LCBzdWJqZWN0KSArIHNwYWNlKCc+JykgKyBxdWVyeVRvU3RyaW5nKGNoZWNrLmNoaWxkLCBzdWJqZWN0KTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFR5cGUuQU5DRVNUT1I6XG4gICAgICBjYXNlIFR5cGUuREVTQ0VOREFOVDpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBxdWVyeVRvU3RyaW5nKGNoZWNrLmFuY2VzdG9yLCBzdWJqZWN0KSArICcgJyArIHF1ZXJ5VG9TdHJpbmcoY2hlY2suZGVzY2VuZGFudCwgc3ViamVjdCk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBUeXBlLkNPTVBPVU5EX1NQTElUOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxocyA9IHF1ZXJ5VG9TdHJpbmcoY2hlY2subGVmdCwgc3ViamVjdCk7XG4gICAgICAgICAgdmFyIHN1YiA9IHF1ZXJ5VG9TdHJpbmcoY2hlY2suc3ViamVjdCwgc3ViamVjdCk7XG4gICAgICAgICAgdmFyIHJocyA9IHF1ZXJ5VG9TdHJpbmcoY2hlY2sucmlnaHQsIHN1YmplY3QpO1xuICAgICAgICAgIHJldHVybiBsaHMgKyAobGhzLmxlbmd0aCA+IDAgPyAnICcgOiAnJykgKyBzdWIgKyByaHM7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBUeXBlLlRSVUU6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdmFyIHF1ZXJ5VG9TdHJpbmcgPSBmdW5jdGlvbiBxdWVyeVRvU3RyaW5nKHF1ZXJ5LCBzdWJqZWN0KSB7XG4gICAgcmV0dXJuIHF1ZXJ5LmNoZWNrcy5yZWR1Y2UoZnVuY3Rpb24gKHN0ciwgY2hrLCBpKSB7XG4gICAgICByZXR1cm4gc3RyICsgKHN1YmplY3QgPT09IHF1ZXJ5ICYmIGkgPT09IDAgPyAnJCcgOiAnJykgKyBjaGVja1RvU3RyaW5nKGNoaywgc3ViamVjdCk7XG4gICAgfSwgJycpO1xuICB9O1xuXG4gIHZhciBzdHIgPSAnJztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcXVlcnkgPSB0aGlzW2ldO1xuICAgIHN0ciArPSBxdWVyeVRvU3RyaW5nKHF1ZXJ5LCBxdWVyeS5zdWJqZWN0KTtcblxuICAgIGlmICh0aGlzLmxlbmd0aCA+IDEgJiYgaSA8IHRoaXMubGVuZ3RoIC0gMSkge1xuICAgICAgc3RyICs9ICcsICc7XG4gICAgfVxuICB9XG5cbiAgdGhpcy50b1N0cmluZ0NhY2hlID0gc3RyO1xuICByZXR1cm4gc3RyO1xufTtcbnZhciBwYXJzZSQxID0ge1xuICBwYXJzZTogcGFyc2UsXG4gIHRvU3RyaW5nOiB0b1N0cmluZ1xufTtcblxudmFyIHZhbENtcCA9IGZ1bmN0aW9uIHZhbENtcChmaWVsZFZhbCwgb3BlcmF0b3IsIHZhbHVlKSB7XG4gIHZhciBtYXRjaGVzO1xuICB2YXIgaXNGaWVsZFN0ciA9IHN0cmluZyhmaWVsZFZhbCk7XG4gIHZhciBpc0ZpZWxkTnVtID0gbnVtYmVyJDEoZmllbGRWYWwpO1xuICB2YXIgaXNWYWxTdHIgPSBzdHJpbmcodmFsdWUpO1xuICB2YXIgZmllbGRTdHIsIHZhbFN0cjtcbiAgdmFyIGNhc2VJbnNlbnNpdGl2ZSA9IGZhbHNlO1xuICB2YXIgbm90RXhwciA9IGZhbHNlO1xuICB2YXIgaXNJbmVxQ21wID0gZmFsc2U7XG5cbiAgaWYgKG9wZXJhdG9yLmluZGV4T2YoJyEnKSA+PSAwKSB7XG4gICAgb3BlcmF0b3IgPSBvcGVyYXRvci5yZXBsYWNlKCchJywgJycpO1xuICAgIG5vdEV4cHIgPSB0cnVlO1xuICB9XG5cbiAgaWYgKG9wZXJhdG9yLmluZGV4T2YoJ0AnKSA+PSAwKSB7XG4gICAgb3BlcmF0b3IgPSBvcGVyYXRvci5yZXBsYWNlKCdAJywgJycpO1xuICAgIGNhc2VJbnNlbnNpdGl2ZSA9IHRydWU7XG4gIH1cblxuICBpZiAoaXNGaWVsZFN0ciB8fCBpc1ZhbFN0ciB8fCBjYXNlSW5zZW5zaXRpdmUpIHtcbiAgICBmaWVsZFN0ciA9ICFpc0ZpZWxkU3RyICYmICFpc0ZpZWxkTnVtID8gJycgOiAnJyArIGZpZWxkVmFsO1xuICAgIHZhbFN0ciA9ICcnICsgdmFsdWU7XG4gIH0gLy8gaWYgd2UncmUgZG9pbmcgYSBjYXNlIGluc2Vuc2l0aXZlIGNvbXBhcmlzb24sIHRoZW4gd2UncmUgdXNpbmcgYSBTVFJJTkcgY29tcGFyaXNvblxuICAvLyBldmVuIGlmIHdlJ3JlIGNvbXBhcmluZyBudW1iZXJzXG5cblxuICBpZiAoY2FzZUluc2Vuc2l0aXZlKSB7XG4gICAgZmllbGRWYWwgPSBmaWVsZFN0ciA9IGZpZWxkU3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsdWUgPSB2YWxTdHIgPSB2YWxTdHIudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICBjYXNlICcqPSc6XG4gICAgICBtYXRjaGVzID0gZmllbGRTdHIuaW5kZXhPZih2YWxTdHIpID49IDA7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJyQ9JzpcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFN0ci5pbmRleE9mKHZhbFN0ciwgZmllbGRTdHIubGVuZ3RoIC0gdmFsU3RyLmxlbmd0aCkgPj0gMDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnXj0nOlxuICAgICAgbWF0Y2hlcyA9IGZpZWxkU3RyLmluZGV4T2YodmFsU3RyKSA9PT0gMDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnPSc6XG4gICAgICBtYXRjaGVzID0gZmllbGRWYWwgPT09IHZhbHVlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICc+JzpcbiAgICAgIGlzSW5lcUNtcCA9IHRydWU7XG4gICAgICBtYXRjaGVzID0gZmllbGRWYWwgPiB2YWx1ZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnPj0nOlxuICAgICAgaXNJbmVxQ21wID0gdHJ1ZTtcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFZhbCA+PSB2YWx1ZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnPCc6XG4gICAgICBpc0luZXFDbXAgPSB0cnVlO1xuICAgICAgbWF0Y2hlcyA9IGZpZWxkVmFsIDwgdmFsdWU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJzw9JzpcbiAgICAgIGlzSW5lcUNtcCA9IHRydWU7XG4gICAgICBtYXRjaGVzID0gZmllbGRWYWwgPD0gdmFsdWU7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBtYXRjaGVzID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgfSAvLyBhcHBseSB0aGUgbm90IG9wLCBidXQgbnVsbCB2YWxzIGZvciBpbmVxdWFsaXRpZXMgc2hvdWxkIGFsd2F5cyBzdGF5IG5vbi1tYXRjaGluZ1xuXG5cbiAgaWYgKG5vdEV4cHIgJiYgKGZpZWxkVmFsICE9IG51bGwgfHwgIWlzSW5lcUNtcCkpIHtcbiAgICBtYXRjaGVzID0gIW1hdGNoZXM7XG4gIH1cblxuICByZXR1cm4gbWF0Y2hlcztcbn07XG52YXIgYm9vbENtcCA9IGZ1bmN0aW9uIGJvb2xDbXAoZmllbGRWYWwsIG9wZXJhdG9yKSB7XG4gIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICBjYXNlICc/JzpcbiAgICAgIHJldHVybiBmaWVsZFZhbCA/IHRydWUgOiBmYWxzZTtcblxuICAgIGNhc2UgJyEnOlxuICAgICAgcmV0dXJuIGZpZWxkVmFsID8gZmFsc2UgOiB0cnVlO1xuXG4gICAgY2FzZSAnXic6XG4gICAgICByZXR1cm4gZmllbGRWYWwgPT09IHVuZGVmaW5lZDtcbiAgfVxufTtcbnZhciBleGlzdENtcCA9IGZ1bmN0aW9uIGV4aXN0Q21wKGZpZWxkVmFsKSB7XG4gIHJldHVybiBmaWVsZFZhbCAhPT0gdW5kZWZpbmVkO1xufTtcbnZhciBkYXRhJDEgPSBmdW5jdGlvbiBkYXRhKGVsZSwgZmllbGQpIHtcbiAgcmV0dXJuIGVsZS5kYXRhKGZpZWxkKTtcbn07XG52YXIgbWV0YSA9IGZ1bmN0aW9uIG1ldGEoZWxlLCBmaWVsZCkge1xuICByZXR1cm4gZWxlW2ZpZWxkXSgpO1xufTtcblxuLyoqIEEgbG9va3VwIG9mIGBtYXRjaChjaGVjaywgZWxlKWAgZnVuY3Rpb25zIGJ5IGBUeXBlYCBpbnQgKi9cblxudmFyIG1hdGNoID0gW107XG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgcXVlcnkgbWF0Y2hlcyBmb3IgdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSBxdWVyeSBUaGUgYHsgdHlwZSwgdmFsdWUsIC4uLiB9YCBxdWVyeSBvYmplY3RcbiAqIEBwYXJhbSBlbGUgVGhlIGVsZW1lbnQgdG8gY29tcGFyZSBhZ2FpbnN0XG4qL1xuXG52YXIgbWF0Y2hlcyQxID0gZnVuY3Rpb24gbWF0Y2hlcyhxdWVyeSwgZWxlKSB7XG4gIHJldHVybiBxdWVyeS5jaGVja3MuZXZlcnkoZnVuY3Rpb24gKGNoaykge1xuICAgIHJldHVybiBtYXRjaFtjaGsudHlwZV0oY2hrLCBlbGUpO1xuICB9KTtcbn07XG5cbm1hdGNoW1R5cGUuR1JPVVBdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGdyb3VwID0gY2hlY2sudmFsdWU7XG4gIHJldHVybiBncm91cCA9PT0gJyonIHx8IGdyb3VwID09PSBlbGUuZ3JvdXAoKTtcbn07XG5cbm1hdGNoW1R5cGUuU1RBVEVdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIHN0YXRlU2VsZWN0b3IgPSBjaGVjay52YWx1ZTtcbiAgcmV0dXJuIHN0YXRlU2VsZWN0b3JNYXRjaGVzKHN0YXRlU2VsZWN0b3IsIGVsZSk7XG59O1xuXG5tYXRjaFtUeXBlLklEXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBpZCA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gZWxlLmlkKCkgPT09IGlkO1xufTtcblxubWF0Y2hbVHlwZS5DTEFTU10gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICB2YXIgY2xzID0gY2hlY2sudmFsdWU7XG4gIHJldHVybiBlbGUuaGFzQ2xhc3MoY2xzKTtcbn07XG5cbm1hdGNoW1R5cGUuTUVUQV9DT01QQVJFXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBmaWVsZCA9IGNoZWNrLmZpZWxkLFxuICAgICAgb3BlcmF0b3IgPSBjaGVjay5vcGVyYXRvcixcbiAgICAgIHZhbHVlID0gY2hlY2sudmFsdWU7XG4gIHJldHVybiB2YWxDbXAobWV0YShlbGUsIGZpZWxkKSwgb3BlcmF0b3IsIHZhbHVlKTtcbn07XG5cbm1hdGNoW1R5cGUuREFUQV9DT01QQVJFXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBmaWVsZCA9IGNoZWNrLmZpZWxkLFxuICAgICAgb3BlcmF0b3IgPSBjaGVjay5vcGVyYXRvcixcbiAgICAgIHZhbHVlID0gY2hlY2sudmFsdWU7XG4gIHJldHVybiB2YWxDbXAoZGF0YSQxKGVsZSwgZmllbGQpLCBvcGVyYXRvciwgdmFsdWUpO1xufTtcblxubWF0Y2hbVHlwZS5EQVRBX0JPT0xdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGZpZWxkID0gY2hlY2suZmllbGQsXG4gICAgICBvcGVyYXRvciA9IGNoZWNrLm9wZXJhdG9yO1xuICByZXR1cm4gYm9vbENtcChkYXRhJDEoZWxlLCBmaWVsZCksIG9wZXJhdG9yKTtcbn07XG5cbm1hdGNoW1R5cGUuREFUQV9FWElTVF0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICB2YXIgZmllbGQgPSBjaGVjay5maWVsZDtcbiAgICAgIGNoZWNrLm9wZXJhdG9yO1xuICByZXR1cm4gZXhpc3RDbXAoZGF0YSQxKGVsZSwgZmllbGQpKTtcbn07XG5cbm1hdGNoW1R5cGUuVU5ESVJFQ1RFRF9FREdFXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBxQSA9IGNoZWNrLm5vZGVzWzBdO1xuICB2YXIgcUIgPSBjaGVjay5ub2Rlc1sxXTtcbiAgdmFyIHNyYyA9IGVsZS5zb3VyY2UoKTtcbiAgdmFyIHRndCA9IGVsZS50YXJnZXQoKTtcbiAgcmV0dXJuIG1hdGNoZXMkMShxQSwgc3JjKSAmJiBtYXRjaGVzJDEocUIsIHRndCkgfHwgbWF0Y2hlcyQxKHFCLCBzcmMpICYmIG1hdGNoZXMkMShxQSwgdGd0KTtcbn07XG5cbm1hdGNoW1R5cGUuTk9ERV9ORUlHSEJPUl0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLm5vZGUsIGVsZSkgJiYgZWxlLm5laWdoYm9yaG9vZCgpLnNvbWUoZnVuY3Rpb24gKG4pIHtcbiAgICByZXR1cm4gbi5pc05vZGUoKSAmJiBtYXRjaGVzJDEoY2hlY2submVpZ2hib3IsIG4pO1xuICB9KTtcbn07XG5cbm1hdGNoW1R5cGUuRElSRUNURURfRURHRV0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLnNvdXJjZSwgZWxlLnNvdXJjZSgpKSAmJiBtYXRjaGVzJDEoY2hlY2sudGFyZ2V0LCBlbGUudGFyZ2V0KCkpO1xufTtcblxubWF0Y2hbVHlwZS5OT0RFX1NPVVJDRV0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLnNvdXJjZSwgZWxlKSAmJiBlbGUub3V0Z29lcnMoKS5zb21lKGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuIG4uaXNOb2RlKCkgJiYgbWF0Y2hlcyQxKGNoZWNrLnRhcmdldCwgbik7XG4gIH0pO1xufTtcblxubWF0Y2hbVHlwZS5OT0RFX1RBUkdFVF0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLnRhcmdldCwgZWxlKSAmJiBlbGUuaW5jb21lcnMoKS5zb21lKGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuIG4uaXNOb2RlKCkgJiYgbWF0Y2hlcyQxKGNoZWNrLnNvdXJjZSwgbik7XG4gIH0pO1xufTtcblxubWF0Y2hbVHlwZS5DSElMRF0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLmNoaWxkLCBlbGUpICYmIG1hdGNoZXMkMShjaGVjay5wYXJlbnQsIGVsZS5wYXJlbnQoKSk7XG59O1xuXG5tYXRjaFtUeXBlLlBBUkVOVF0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLnBhcmVudCwgZWxlKSAmJiBlbGUuY2hpbGRyZW4oKS5zb21lKGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0dXJuIG1hdGNoZXMkMShjaGVjay5jaGlsZCwgYyk7XG4gIH0pO1xufTtcblxubWF0Y2hbVHlwZS5ERVNDRU5EQU5UXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHJldHVybiBtYXRjaGVzJDEoY2hlY2suZGVzY2VuZGFudCwgZWxlKSAmJiBlbGUuYW5jZXN0b3JzKCkuc29tZShmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybiBtYXRjaGVzJDEoY2hlY2suYW5jZXN0b3IsIGEpO1xuICB9KTtcbn07XG5cbm1hdGNoW1R5cGUuQU5DRVNUT1JdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgcmV0dXJuIG1hdGNoZXMkMShjaGVjay5hbmNlc3RvciwgZWxlKSAmJiBlbGUuZGVzY2VuZGFudHMoKS5zb21lKGZ1bmN0aW9uIChkKSB7XG4gICAgcmV0dXJuIG1hdGNoZXMkMShjaGVjay5kZXNjZW5kYW50LCBkKTtcbiAgfSk7XG59O1xuXG5tYXRjaFtUeXBlLkNPTVBPVU5EX1NQTElUXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHJldHVybiBtYXRjaGVzJDEoY2hlY2suc3ViamVjdCwgZWxlKSAmJiBtYXRjaGVzJDEoY2hlY2subGVmdCwgZWxlKSAmJiBtYXRjaGVzJDEoY2hlY2sucmlnaHQsIGVsZSk7XG59O1xuXG5tYXRjaFtUeXBlLlRSVUVdID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbm1hdGNoW1R5cGUuQ09MTEVDVElPTl0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICB2YXIgY29sbGVjdGlvbiA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gY29sbGVjdGlvbi5oYXMoZWxlKTtcbn07XG5cbm1hdGNoW1R5cGUuRklMVEVSXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBmaWx0ZXIgPSBjaGVjay52YWx1ZTtcbiAgcmV0dXJuIGZpbHRlcihlbGUpO1xufTtcblxudmFyIGZpbHRlciA9IGZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uKSB7XG4gIHZhciBzZWxmID0gdGhpczsgLy8gZm9yIDEgaWQgI2ZvbyBxdWVyaWVzLCBqdXN0IGdldCB0aGUgZWxlbWVudFxuXG4gIGlmIChzZWxmLmxlbmd0aCA9PT0gMSAmJiBzZWxmWzBdLmNoZWNrcy5sZW5ndGggPT09IDEgJiYgc2VsZlswXS5jaGVja3NbMF0udHlwZSA9PT0gVHlwZS5JRCkge1xuICAgIHJldHVybiBjb2xsZWN0aW9uLmdldEVsZW1lbnRCeUlkKHNlbGZbMF0uY2hlY2tzWzBdLnZhbHVlKS5jb2xsZWN0aW9uKCk7XG4gIH1cblxuICB2YXIgc2VsZWN0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uIHNlbGVjdG9yRnVuY3Rpb24oZWxlbWVudCkge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2VsZi5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIHF1ZXJ5ID0gc2VsZltqXTtcblxuICAgICAgaWYgKG1hdGNoZXMkMShxdWVyeSwgZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGlmIChzZWxmLnRleHQoKSA9PSBudWxsKSB7XG4gICAgc2VsZWN0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uIHNlbGVjdG9yRnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGNvbGxlY3Rpb24uZmlsdGVyKHNlbGVjdG9yRnVuY3Rpb24pO1xufTsgLy8gZmlsdGVyXG4vLyBkb2VzIHNlbGVjdG9yIG1hdGNoIGEgc2luZ2xlIGVsZW1lbnQ/XG5cblxudmFyIG1hdGNoZXMgPSBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWxmLmxlbmd0aDsgaisrKSB7XG4gICAgdmFyIHF1ZXJ5ID0gc2VsZltqXTtcblxuICAgIGlmIChtYXRjaGVzJDEocXVlcnksIGVsZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07IC8vIG1hdGNoZXNcblxuXG52YXIgbWF0Y2hpbmcgPSB7XG4gIG1hdGNoZXM6IG1hdGNoZXMsXG4gIGZpbHRlcjogZmlsdGVyXG59O1xuXG52YXIgU2VsZWN0b3IgPSBmdW5jdGlvbiBTZWxlY3RvcihzZWxlY3Rvcikge1xuICB0aGlzLmlucHV0VGV4dCA9IHNlbGVjdG9yO1xuICB0aGlzLmN1cnJlbnRTdWJqZWN0ID0gbnVsbDtcbiAgdGhpcy5jb21wb3VuZENvdW50ID0gMDtcbiAgdGhpcy5lZGdlQ291bnQgPSAwO1xuICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgaWYgKHNlbGVjdG9yID09IG51bGwgfHwgc3RyaW5nKHNlbGVjdG9yKSAmJiBzZWxlY3Rvci5tYXRjaCgvXlxccyokLykpIDsgZWxzZSBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihzZWxlY3RvcikpIHtcbiAgICB0aGlzLmFkZFF1ZXJ5KHtcbiAgICAgIGNoZWNrczogW3tcbiAgICAgICAgdHlwZTogVHlwZS5DT0xMRUNUSU9OLFxuICAgICAgICB2YWx1ZTogc2VsZWN0b3IuY29sbGVjdGlvbigpXG4gICAgICB9XVxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGZuJDYoc2VsZWN0b3IpKSB7XG4gICAgdGhpcy5hZGRRdWVyeSh7XG4gICAgICBjaGVja3M6IFt7XG4gICAgICAgIHR5cGU6IFR5cGUuRklMVEVSLFxuICAgICAgICB2YWx1ZTogc2VsZWN0b3JcbiAgICAgIH1dXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoc3RyaW5nKHNlbGVjdG9yKSkge1xuICAgIGlmICghdGhpcy5wYXJzZShzZWxlY3RvcikpIHtcbiAgICAgIHRoaXMuaW52YWxpZCA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGVycm9yKCdBIHNlbGVjdG9yIG11c3QgYmUgY3JlYXRlZCBmcm9tIGEgc3RyaW5nOyBmb3VuZCAnKTtcbiAgfVxufTtcblxudmFyIHNlbGZuID0gU2VsZWN0b3IucHJvdG90eXBlO1xuW3BhcnNlJDEsIG1hdGNoaW5nXS5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gIHJldHVybiBleHRlbmQoc2VsZm4sIHApO1xufSk7XG5cbnNlbGZuLnRleHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmlucHV0VGV4dDtcbn07XG5cbnNlbGZuLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxlbmd0aDtcbn07XG5cbnNlbGZuLmVxID0gZnVuY3Rpb24gKGkpIHtcbiAgcmV0dXJuIHRoaXNbaV07XG59O1xuXG5zZWxmbi5zYW1lVGV4dCA9IGZ1bmN0aW9uIChvdGhlclNlbCkge1xuICByZXR1cm4gIXRoaXMuaW52YWxpZCAmJiAhb3RoZXJTZWwuaW52YWxpZCAmJiB0aGlzLnRleHQoKSA9PT0gb3RoZXJTZWwudGV4dCgpO1xufTtcblxuc2VsZm4uYWRkUXVlcnkgPSBmdW5jdGlvbiAocSkge1xuICB0aGlzW3RoaXMubGVuZ3RoKytdID0gcTtcbn07XG5cbnNlbGZuLnNlbGVjdG9yID0gc2VsZm4udG9TdHJpbmc7XG5cbnZhciBlbGVzZm4kZyA9IHtcbiAgYWxsQXJlOiBmdW5jdGlvbiBhbGxBcmUoc2VsZWN0b3IpIHtcbiAgICB2YXIgc2VsT2JqID0gbmV3IFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICByZXR1cm4gdGhpcy5ldmVyeShmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gc2VsT2JqLm1hdGNoZXMoZWxlKTtcbiAgICB9KTtcbiAgfSxcbiAgaXM6IGZ1bmN0aW9uIGlzKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNlbE9iaiA9IG5ldyBTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgcmV0dXJuIHRoaXMuc29tZShmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gc2VsT2JqLm1hdGNoZXMoZWxlKTtcbiAgICB9KTtcbiAgfSxcbiAgc29tZTogZnVuY3Rpb24gc29tZShmbiwgdGhpc0FyZykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJldCA9ICF0aGlzQXJnID8gZm4odGhpc1tpXSwgaSwgdGhpcykgOiBmbi5hcHBseSh0aGlzQXJnLCBbdGhpc1tpXSwgaSwgdGhpc10pO1xuXG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGZuLCB0aGlzQXJnKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcmV0ID0gIXRoaXNBcmcgPyBmbih0aGlzW2ldLCBpLCB0aGlzKSA6IGZuLmFwcGx5KHRoaXNBcmcsIFt0aGlzW2ldLCBpLCB0aGlzXSk7XG5cbiAgICAgIGlmICghcmV0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgc2FtZTogZnVuY3Rpb24gc2FtZShjb2xsZWN0aW9uKSB7XG4gICAgLy8gY2hlYXAgY29sbGVjdGlvbiByZWYgY2hlY2tcbiAgICBpZiAodGhpcyA9PT0gY29sbGVjdGlvbikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29sbGVjdGlvbiA9IHRoaXMuY3koKS5jb2xsZWN0aW9uKGNvbGxlY3Rpb24pO1xuICAgIHZhciB0aGlzTGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgdmFyIGNvbGxlY3Rpb25MZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDsgLy8gY2hlYXAgbGVuZ3RoIGNoZWNrXG5cbiAgICBpZiAodGhpc0xlbmd0aCAhPT0gY29sbGVjdGlvbkxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gY2hlYXAgZWxlbWVudCByZWYgY2hlY2tcblxuXG4gICAgaWYgKHRoaXNMZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB0aGlzWzBdID09PSBjb2xsZWN0aW9uWzBdO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV2ZXJ5KGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uLmhhc0VsZW1lbnRXaXRoSWQoZWxlLmlkKCkpO1xuICAgIH0pO1xuICB9LFxuICBhbnlTYW1lOiBmdW5jdGlvbiBhbnlTYW1lKGNvbGxlY3Rpb24pIHtcbiAgICBjb2xsZWN0aW9uID0gdGhpcy5jeSgpLmNvbGxlY3Rpb24oY29sbGVjdGlvbik7XG4gICAgcmV0dXJuIHRoaXMuc29tZShmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbi5oYXNFbGVtZW50V2l0aElkKGVsZS5pZCgpKTtcbiAgICB9KTtcbiAgfSxcbiAgYWxsQXJlTmVpZ2hib3JzOiBmdW5jdGlvbiBhbGxBcmVOZWlnaGJvcnMoY29sbGVjdGlvbikge1xuICAgIGNvbGxlY3Rpb24gPSB0aGlzLmN5KCkuY29sbGVjdGlvbihjb2xsZWN0aW9uKTtcbiAgICB2YXIgbmhvb2QgPSB0aGlzLm5laWdoYm9yaG9vZCgpO1xuICAgIHJldHVybiBjb2xsZWN0aW9uLmV2ZXJ5KGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBuaG9vZC5oYXNFbGVtZW50V2l0aElkKGVsZS5pZCgpKTtcbiAgICB9KTtcbiAgfSxcbiAgY29udGFpbnM6IGZ1bmN0aW9uIGNvbnRhaW5zKGNvbGxlY3Rpb24pIHtcbiAgICBjb2xsZWN0aW9uID0gdGhpcy5jeSgpLmNvbGxlY3Rpb24oY29sbGVjdGlvbik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBjb2xsZWN0aW9uLmV2ZXJ5KGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBzZWxmLmhhc0VsZW1lbnRXaXRoSWQoZWxlLmlkKCkpO1xuICAgIH0pO1xuICB9XG59O1xuZWxlc2ZuJGcuYWxsQXJlTmVpZ2hib3VycyA9IGVsZXNmbiRnLmFsbEFyZU5laWdoYm9ycztcbmVsZXNmbiRnLmhhcyA9IGVsZXNmbiRnLmNvbnRhaW5zO1xuZWxlc2ZuJGcuZXF1YWwgPSBlbGVzZm4kZy5lcXVhbHMgPSBlbGVzZm4kZy5zYW1lO1xuXG52YXIgY2FjaGUgPSBmdW5jdGlvbiBjYWNoZShmbiwgbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gdHJhdmVyc2FsQ2FjaGUoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCkge1xuICAgIHZhciBzZWxlY3Rvck9yRWxlcyA9IGFyZzE7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIHZhciBrZXk7XG5cbiAgICBpZiAoc2VsZWN0b3JPckVsZXMgPT0gbnVsbCkge1xuICAgICAga2V5ID0gJyc7XG4gICAgfSBlbHNlIGlmIChlbGVtZW50T3JDb2xsZWN0aW9uKHNlbGVjdG9yT3JFbGVzKSAmJiBzZWxlY3Rvck9yRWxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGtleSA9IHNlbGVjdG9yT3JFbGVzLmlkKCk7XG4gICAgfVxuXG4gICAgaWYgKGVsZXMubGVuZ3RoID09PSAxICYmIGtleSkge1xuICAgICAgdmFyIF9wID0gZWxlc1swXS5fcHJpdmF0ZTtcbiAgICAgIHZhciB0Y2ggPSBfcC50cmF2ZXJzYWxDYWNoZSA9IF9wLnRyYXZlcnNhbENhY2hlIHx8IHt9O1xuICAgICAgdmFyIGNoID0gdGNoW25hbWVdID0gdGNoW25hbWVdIHx8IFtdO1xuICAgICAgdmFyIGhhc2ggPSBoYXNoU3RyaW5nKGtleSk7XG4gICAgICB2YXIgY2FjaGVIaXQgPSBjaFtoYXNoXTtcblxuICAgICAgaWYgKGNhY2hlSGl0KSB7XG4gICAgICAgIHJldHVybiBjYWNoZUhpdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjaFtoYXNoXSA9IGZuLmNhbGwoZWxlcywgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKGVsZXMsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpO1xuICAgIH1cbiAgfTtcbn07XG5cbnZhciBlbGVzZm4kZiA9IHtcbiAgcGFyZW50OiBmdW5jdGlvbiBwYXJlbnQoc2VsZWN0b3IpIHtcbiAgICB2YXIgcGFyZW50cyA9IFtdOyAvLyBvcHRpbWlzYXRpb24gZm9yIHNpbmdsZSBlbGUgY2FsbFxuXG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgcGFyZW50ID0gdGhpc1swXS5fcHJpdmF0ZS5wYXJlbnQ7XG5cbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgdmFyIF9wYXJlbnQgPSBlbGUuX3ByaXZhdGUucGFyZW50O1xuXG4gICAgICBpZiAoX3BhcmVudCkge1xuICAgICAgICBwYXJlbnRzLnB1c2goX3BhcmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ocGFyZW50cywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgcGFyZW50czogZnVuY3Rpb24gcGFyZW50cyhzZWxlY3Rvcikge1xuICAgIHZhciBwYXJlbnRzID0gW107XG4gICAgdmFyIGVsZXMgPSB0aGlzLnBhcmVudCgpO1xuXG4gICAgd2hpbGUgKGVsZXMubm9uZW1wdHkoKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgICBwYXJlbnRzLnB1c2goZWxlKTtcbiAgICAgIH1cblxuICAgICAgZWxlcyA9IGVsZXMucGFyZW50KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ocGFyZW50cywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgY29tbW9uQW5jZXN0b3JzOiBmdW5jdGlvbiBjb21tb25BbmNlc3RvcnMoc2VsZWN0b3IpIHtcbiAgICB2YXIgYW5jZXN0b3JzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIHZhciBwYXJlbnRzID0gZWxlLnBhcmVudHMoKTtcbiAgICAgIGFuY2VzdG9ycyA9IGFuY2VzdG9ycyB8fCBwYXJlbnRzO1xuICAgICAgYW5jZXN0b3JzID0gYW5jZXN0b3JzLmludGVyc2VjdChwYXJlbnRzKTsgLy8gY3VycmVudCBsaXN0IG11c3QgYmUgY29tbW9uIHdpdGggY3VycmVudCBlbGUgcGFyZW50cyBzZXRcbiAgICB9XG5cbiAgICByZXR1cm4gYW5jZXN0b3JzLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sXG4gIG9ycGhhbnM6IGZ1bmN0aW9uIG9ycGhhbnMoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5zdGRGaWx0ZXIoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc09ycGhhbigpO1xuICAgIH0pLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sXG4gIG5vbm9ycGhhbnM6IGZ1bmN0aW9uIG5vbm9ycGhhbnMoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5zdGRGaWx0ZXIoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc0NoaWxkKCk7XG4gICAgfSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgY2hpbGRyZW46IGNhY2hlKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHZhciBjaGlsZHJlbiA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIHZhciBlbGVDaGlsZHJlbiA9IGVsZS5fcHJpdmF0ZS5jaGlsZHJlbjtcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBlbGVDaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKGVsZUNoaWxkcmVuW2pdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zcGF3bihjaGlsZHJlbiwgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSwgJ2NoaWxkcmVuJyksXG4gIHNpYmxpbmdzOiBmdW5jdGlvbiBzaWJsaW5ncyhzZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLnBhcmVudCgpLmNoaWxkcmVuKCkubm90KHRoaXMpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sXG4gIGlzUGFyZW50OiBmdW5jdGlvbiBpc1BhcmVudCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcblxuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNOb2RlKCkgJiYgZWxlLl9wcml2YXRlLmNoaWxkcmVuLmxlbmd0aCAhPT0gMDtcbiAgICB9XG4gIH0sXG4gIGlzQ2hpbGRsZXNzOiBmdW5jdGlvbiBpc0NoaWxkbGVzcygpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcblxuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNOb2RlKCkgJiYgZWxlLl9wcml2YXRlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gIH0sXG4gIGlzQ2hpbGQ6IGZ1bmN0aW9uIGlzQ2hpbGQoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG5cbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzTm9kZSgpICYmIGVsZS5fcHJpdmF0ZS5wYXJlbnQgIT0gbnVsbDtcbiAgICB9XG4gIH0sXG4gIGlzT3JwaGFuOiBmdW5jdGlvbiBpc09ycGhhbigpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcblxuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNOb2RlKCkgJiYgZWxlLl9wcml2YXRlLnBhcmVudCA9PSBudWxsO1xuICAgIH1cbiAgfSxcbiAgZGVzY2VuZGFudHM6IGZ1bmN0aW9uIGRlc2NlbmRhbnRzKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZW1lbnRzID0gW107XG5cbiAgICBmdW5jdGlvbiBhZGQoZWxlcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgICBlbGVtZW50cy5wdXNoKGVsZSk7XG5cbiAgICAgICAgaWYgKGVsZS5jaGlsZHJlbigpLm5vbmVtcHR5KCkpIHtcbiAgICAgICAgICBhZGQoZWxlLmNoaWxkcmVuKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgYWRkKHRoaXMuY2hpbGRyZW4oKSk7XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oZWxlbWVudHMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGZvckVhY2hDb21wb3VuZChlbGVzLCBmbiwgaW5jbHVkZVNlbGYsIHJlY3Vyc2l2ZVN0ZXApIHtcbiAgdmFyIHEgPSBbXTtcbiAgdmFyIGRpZCA9IG5ldyBTZXQkMSgpO1xuICB2YXIgY3kgPSBlbGVzLmN5KCk7XG4gIHZhciBoYXNDb21wb3VuZHMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG5cbiAgICBpZiAoaW5jbHVkZVNlbGYpIHtcbiAgICAgIHEucHVzaChlbGUpO1xuICAgIH0gZWxzZSBpZiAoaGFzQ29tcG91bmRzKSB7XG4gICAgICByZWN1cnNpdmVTdGVwKHEsIGRpZCwgZWxlKTtcbiAgICB9XG4gIH1cblxuICB3aGlsZSAocS5sZW5ndGggPiAwKSB7XG4gICAgdmFyIF9lbGUgPSBxLnNoaWZ0KCk7XG5cbiAgICBmbihfZWxlKTtcbiAgICBkaWQuYWRkKF9lbGUuaWQoKSk7XG5cbiAgICBpZiAoaGFzQ29tcG91bmRzKSB7XG4gICAgICByZWN1cnNpdmVTdGVwKHEsIGRpZCwgX2VsZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZXM7XG59XG5cbmZ1bmN0aW9uIGFkZENoaWxkcmVuKHEsIGRpZCwgZWxlKSB7XG4gIGlmIChlbGUuaXNQYXJlbnQoKSkge1xuICAgIHZhciBjaGlsZHJlbiA9IGVsZS5fcHJpdmF0ZS5jaGlsZHJlbjtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuXG4gICAgICBpZiAoIWRpZC5oYXMoY2hpbGQuaWQoKSkpIHtcbiAgICAgICAgcS5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0gLy8gdmVyeSBlZmZpY2llbnQgdmVyc2lvbiBvZiBlbGVzLmFkZCggZWxlcy5kZXNjZW5kYW50cygpICkuZm9yRWFjaCgpXG4vLyBmb3IgaW50ZXJuYWwgdXNlXG5cblxuZWxlc2ZuJGYuZm9yRWFjaERvd24gPSBmdW5jdGlvbiAoZm4pIHtcbiAgdmFyIGluY2x1ZGVTZWxmID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICByZXR1cm4gZm9yRWFjaENvbXBvdW5kKHRoaXMsIGZuLCBpbmNsdWRlU2VsZiwgYWRkQ2hpbGRyZW4pO1xufTtcblxuZnVuY3Rpb24gYWRkUGFyZW50KHEsIGRpZCwgZWxlKSB7XG4gIGlmIChlbGUuaXNDaGlsZCgpKSB7XG4gICAgdmFyIHBhcmVudCA9IGVsZS5fcHJpdmF0ZS5wYXJlbnQ7XG5cbiAgICBpZiAoIWRpZC5oYXMocGFyZW50LmlkKCkpKSB7XG4gICAgICBxLnB1c2gocGFyZW50KTtcbiAgICB9XG4gIH1cbn1cblxuZWxlc2ZuJGYuZm9yRWFjaFVwID0gZnVuY3Rpb24gKGZuKSB7XG4gIHZhciBpbmNsdWRlU2VsZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgcmV0dXJuIGZvckVhY2hDb21wb3VuZCh0aGlzLCBmbiwgaW5jbHVkZVNlbGYsIGFkZFBhcmVudCk7XG59O1xuXG5mdW5jdGlvbiBhZGRQYXJlbnRBbmRDaGlsZHJlbihxLCBkaWQsIGVsZSkge1xuICBhZGRQYXJlbnQocSwgZGlkLCBlbGUpO1xuICBhZGRDaGlsZHJlbihxLCBkaWQsIGVsZSk7XG59XG5cbmVsZXNmbiRmLmZvckVhY2hVcEFuZERvd24gPSBmdW5jdGlvbiAoZm4pIHtcbiAgdmFyIGluY2x1ZGVTZWxmID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICByZXR1cm4gZm9yRWFjaENvbXBvdW5kKHRoaXMsIGZuLCBpbmNsdWRlU2VsZiwgYWRkUGFyZW50QW5kQ2hpbGRyZW4pO1xufTsgLy8gYWxpYXNlc1xuXG5cbmVsZXNmbiRmLmFuY2VzdG9ycyA9IGVsZXNmbiRmLnBhcmVudHM7XG5cbnZhciBmbiQ1LCBlbGVzZm4kZTtcbmZuJDUgPSBlbGVzZm4kZSA9IHtcbiAgZGF0YTogZGVmaW5lLmRhdGEoe1xuICAgIGZpZWxkOiAnZGF0YScsXG4gICAgYmluZGluZ0V2ZW50OiAnZGF0YScsXG4gICAgYWxsb3dCaW5kaW5nOiB0cnVlLFxuICAgIGFsbG93U2V0dGluZzogdHJ1ZSxcbiAgICBzZXR0aW5nRXZlbnQ6ICdkYXRhJyxcbiAgICBzZXR0aW5nVHJpZ2dlcnNFdmVudDogdHJ1ZSxcbiAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgYWxsb3dHZXR0aW5nOiB0cnVlLFxuICAgIGltbXV0YWJsZUtleXM6IHtcbiAgICAgICdpZCc6IHRydWUsXG4gICAgICAnc291cmNlJzogdHJ1ZSxcbiAgICAgICd0YXJnZXQnOiB0cnVlLFxuICAgICAgJ3BhcmVudCc6IHRydWVcbiAgICB9LFxuICAgIHVwZGF0ZVN0eWxlOiB0cnVlXG4gIH0pLFxuICByZW1vdmVEYXRhOiBkZWZpbmUucmVtb3ZlRGF0YSh7XG4gICAgZmllbGQ6ICdkYXRhJyxcbiAgICBldmVudDogJ2RhdGEnLFxuICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICB0cmlnZ2VyRXZlbnQ6IHRydWUsXG4gICAgaW1tdXRhYmxlS2V5czoge1xuICAgICAgJ2lkJzogdHJ1ZSxcbiAgICAgICdzb3VyY2UnOiB0cnVlLFxuICAgICAgJ3RhcmdldCc6IHRydWUsXG4gICAgICAncGFyZW50JzogdHJ1ZVxuICAgIH0sXG4gICAgdXBkYXRlU3R5bGU6IHRydWVcbiAgfSksXG4gIHNjcmF0Y2g6IGRlZmluZS5kYXRhKHtcbiAgICBmaWVsZDogJ3NjcmF0Y2gnLFxuICAgIGJpbmRpbmdFdmVudDogJ3NjcmF0Y2gnLFxuICAgIGFsbG93QmluZGluZzogdHJ1ZSxcbiAgICBhbGxvd1NldHRpbmc6IHRydWUsXG4gICAgc2V0dGluZ0V2ZW50OiAnc2NyYXRjaCcsXG4gICAgc2V0dGluZ1RyaWdnZXJzRXZlbnQ6IHRydWUsXG4gICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgIGFsbG93R2V0dGluZzogdHJ1ZSxcbiAgICB1cGRhdGVTdHlsZTogdHJ1ZVxuICB9KSxcbiAgcmVtb3ZlU2NyYXRjaDogZGVmaW5lLnJlbW92ZURhdGEoe1xuICAgIGZpZWxkOiAnc2NyYXRjaCcsXG4gICAgZXZlbnQ6ICdzY3JhdGNoJyxcbiAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgdHJpZ2dlckV2ZW50OiB0cnVlLFxuICAgIHVwZGF0ZVN0eWxlOiB0cnVlXG4gIH0pLFxuICByc2NyYXRjaDogZGVmaW5lLmRhdGEoe1xuICAgIGZpZWxkOiAncnNjcmF0Y2gnLFxuICAgIGFsbG93QmluZGluZzogZmFsc2UsXG4gICAgYWxsb3dTZXR0aW5nOiB0cnVlLFxuICAgIHNldHRpbmdUcmlnZ2Vyc0V2ZW50OiBmYWxzZSxcbiAgICBhbGxvd0dldHRpbmc6IHRydWVcbiAgfSksXG4gIHJlbW92ZVJzY3JhdGNoOiBkZWZpbmUucmVtb3ZlRGF0YSh7XG4gICAgZmllbGQ6ICdyc2NyYXRjaCcsXG4gICAgdHJpZ2dlckV2ZW50OiBmYWxzZVxuICB9KSxcbiAgaWQ6IGZ1bmN0aW9uIGlkKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuXG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5kYXRhLmlkO1xuICAgIH1cbiAgfVxufTsgLy8gYWxpYXNlc1xuXG5mbiQ1LmF0dHIgPSBmbiQ1LmRhdGE7XG5mbiQ1LnJlbW92ZUF0dHIgPSBmbiQ1LnJlbW92ZURhdGE7XG52YXIgZGF0YSA9IGVsZXNmbiRlO1xuXG52YXIgZWxlc2ZuJGQgPSB7fTtcblxuZnVuY3Rpb24gZGVmaW5lRGVncmVlRnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpbmNsdWRlTG9vcHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAoaW5jbHVkZUxvb3BzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGluY2x1ZGVMb29wcyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHNlbGYubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNlbGYuaXNOb2RlKCkgJiYgIXNlbGYucmVtb3ZlZCgpKSB7XG4gICAgICB2YXIgZGVncmVlID0gMDtcbiAgICAgIHZhciBub2RlID0gc2VsZlswXTtcbiAgICAgIHZhciBjb25uZWN0ZWRFZGdlcyA9IG5vZGUuX3ByaXZhdGUuZWRnZXM7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGVkRWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBjb25uZWN0ZWRFZGdlc1tpXTtcblxuICAgICAgICBpZiAoIWluY2x1ZGVMb29wcyAmJiBlZGdlLmlzTG9vcCgpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBkZWdyZWUgKz0gY2FsbGJhY2sobm9kZSwgZWRnZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWdyZWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH07XG59XG5cbmV4dGVuZChlbGVzZm4kZCwge1xuICBkZWdyZWU6IGRlZmluZURlZ3JlZUZ1bmN0aW9uKGZ1bmN0aW9uIChub2RlLCBlZGdlKSB7XG4gICAgaWYgKGVkZ2Uuc291cmNlKCkuc2FtZShlZGdlLnRhcmdldCgpKSkge1xuICAgICAgcmV0dXJuIDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfSksXG4gIGluZGVncmVlOiBkZWZpbmVEZWdyZWVGdW5jdGlvbihmdW5jdGlvbiAobm9kZSwgZWRnZSkge1xuICAgIGlmIChlZGdlLnRhcmdldCgpLnNhbWUobm9kZSkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH0pLFxuICBvdXRkZWdyZWU6IGRlZmluZURlZ3JlZUZ1bmN0aW9uKGZ1bmN0aW9uIChub2RlLCBlZGdlKSB7XG4gICAgaWYgKGVkZ2Uuc291cmNlKCkuc2FtZShub2RlKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfSlcbn0pO1xuXG5mdW5jdGlvbiBkZWZpbmVEZWdyZWVCb3VuZHNGdW5jdGlvbihkZWdyZWVGbiwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpbmNsdWRlTG9vcHMpIHtcbiAgICB2YXIgcmV0O1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBub2Rlc1tpXTtcbiAgICAgIHZhciBkZWdyZWUgPSBlbGVbZGVncmVlRm5dKGluY2x1ZGVMb29wcyk7XG5cbiAgICAgIGlmIChkZWdyZWUgIT09IHVuZGVmaW5lZCAmJiAocmV0ID09PSB1bmRlZmluZWQgfHwgY2FsbGJhY2soZGVncmVlLCByZXQpKSkge1xuICAgICAgICByZXQgPSBkZWdyZWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfTtcbn1cblxuZXh0ZW5kKGVsZXNmbiRkLCB7XG4gIG1pbkRlZ3JlZTogZGVmaW5lRGVncmVlQm91bmRzRnVuY3Rpb24oJ2RlZ3JlZScsIGZ1bmN0aW9uIChkZWdyZWUsIG1pbikge1xuICAgIHJldHVybiBkZWdyZWUgPCBtaW47XG4gIH0pLFxuICBtYXhEZWdyZWU6IGRlZmluZURlZ3JlZUJvdW5kc0Z1bmN0aW9uKCdkZWdyZWUnLCBmdW5jdGlvbiAoZGVncmVlLCBtYXgpIHtcbiAgICByZXR1cm4gZGVncmVlID4gbWF4O1xuICB9KSxcbiAgbWluSW5kZWdyZWU6IGRlZmluZURlZ3JlZUJvdW5kc0Z1bmN0aW9uKCdpbmRlZ3JlZScsIGZ1bmN0aW9uIChkZWdyZWUsIG1pbikge1xuICAgIHJldHVybiBkZWdyZWUgPCBtaW47XG4gIH0pLFxuICBtYXhJbmRlZ3JlZTogZGVmaW5lRGVncmVlQm91bmRzRnVuY3Rpb24oJ2luZGVncmVlJywgZnVuY3Rpb24gKGRlZ3JlZSwgbWF4KSB7XG4gICAgcmV0dXJuIGRlZ3JlZSA+IG1heDtcbiAgfSksXG4gIG1pbk91dGRlZ3JlZTogZGVmaW5lRGVncmVlQm91bmRzRnVuY3Rpb24oJ291dGRlZ3JlZScsIGZ1bmN0aW9uIChkZWdyZWUsIG1pbikge1xuICAgIHJldHVybiBkZWdyZWUgPCBtaW47XG4gIH0pLFxuICBtYXhPdXRkZWdyZWU6IGRlZmluZURlZ3JlZUJvdW5kc0Z1bmN0aW9uKCdvdXRkZWdyZWUnLCBmdW5jdGlvbiAoZGVncmVlLCBtYXgpIHtcbiAgICByZXR1cm4gZGVncmVlID4gbWF4O1xuICB9KVxufSk7XG5leHRlbmQoZWxlc2ZuJGQsIHtcbiAgdG90YWxEZWdyZWU6IGZ1bmN0aW9uIHRvdGFsRGVncmVlKGluY2x1ZGVMb29wcykge1xuICAgIHZhciB0b3RhbCA9IDA7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdG90YWwgKz0gbm9kZXNbaV0uZGVncmVlKGluY2x1ZGVMb29wcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvdGFsO1xuICB9XG59KTtcblxudmFyIGZuJDQsIGVsZXNmbiRjO1xuXG52YXIgYmVmb3JlUG9zaXRpb25TZXQgPSBmdW5jdGlvbiBiZWZvcmVQb3NpdGlvblNldChlbGVzLCBuZXdQb3MsIHNpbGVudCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcblxuICAgIGlmICghZWxlLmxvY2tlZCgpKSB7XG4gICAgICB2YXIgb2xkUG9zID0gZWxlLl9wcml2YXRlLnBvc2l0aW9uO1xuICAgICAgdmFyIGRlbHRhID0ge1xuICAgICAgICB4OiBuZXdQb3MueCAhPSBudWxsID8gbmV3UG9zLnggLSBvbGRQb3MueCA6IDAsXG4gICAgICAgIHk6IG5ld1Bvcy55ICE9IG51bGwgPyBuZXdQb3MueSAtIG9sZFBvcy55IDogMFxuICAgICAgfTtcblxuICAgICAgaWYgKGVsZS5pc1BhcmVudCgpICYmICEoZGVsdGEueCA9PT0gMCAmJiBkZWx0YS55ID09PSAwKSkge1xuICAgICAgICBlbGUuY2hpbGRyZW4oKS5zaGlmdChkZWx0YSwgc2lsZW50KTtcbiAgICAgIH1cblxuICAgICAgZWxlLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpO1xuICAgIH1cbiAgfVxufTtcblxudmFyIHBvc2l0aW9uRGVmID0ge1xuICBmaWVsZDogJ3Bvc2l0aW9uJyxcbiAgYmluZGluZ0V2ZW50OiAncG9zaXRpb24nLFxuICBhbGxvd0JpbmRpbmc6IHRydWUsXG4gIGFsbG93U2V0dGluZzogdHJ1ZSxcbiAgc2V0dGluZ0V2ZW50OiAncG9zaXRpb24nLFxuICBzZXR0aW5nVHJpZ2dlcnNFdmVudDogdHJ1ZSxcbiAgdHJpZ2dlckZuTmFtZTogJ2VtaXRBbmROb3RpZnknLFxuICBhbGxvd0dldHRpbmc6IHRydWUsXG4gIHZhbGlkS2V5czogWyd4JywgJ3knXSxcbiAgYmVmb3JlR2V0OiBmdW5jdGlvbiBiZWZvcmVHZXQoZWxlKSB7XG4gICAgZWxlLnVwZGF0ZUNvbXBvdW5kQm91bmRzKCk7XG4gIH0sXG4gIGJlZm9yZVNldDogZnVuY3Rpb24gYmVmb3JlU2V0KGVsZXMsIG5ld1Bvcykge1xuICAgIGJlZm9yZVBvc2l0aW9uU2V0KGVsZXMsIG5ld1BvcywgZmFsc2UpO1xuICB9LFxuICBvblNldDogZnVuY3Rpb24gb25TZXQoZWxlcykge1xuICAgIGVsZXMuZGlydHlDb21wb3VuZEJvdW5kc0NhY2hlKCk7XG4gIH0sXG4gIGNhblNldDogZnVuY3Rpb24gY2FuU2V0KGVsZSkge1xuICAgIHJldHVybiAhZWxlLmxvY2tlZCgpO1xuICB9XG59O1xuZm4kNCA9IGVsZXNmbiRjID0ge1xuICBwb3NpdGlvbjogZGVmaW5lLmRhdGEocG9zaXRpb25EZWYpLFxuICAvLyBwb3NpdGlvbiBidXQgbm8gbm90aWZpY2F0aW9uIHRvIHJlbmRlcmVyXG4gIHNpbGVudFBvc2l0aW9uOiBkZWZpbmUuZGF0YShleHRlbmQoe30sIHBvc2l0aW9uRGVmLCB7XG4gICAgYWxsb3dCaW5kaW5nOiBmYWxzZSxcbiAgICBhbGxvd1NldHRpbmc6IHRydWUsXG4gICAgc2V0dGluZ1RyaWdnZXJzRXZlbnQ6IGZhbHNlLFxuICAgIGFsbG93R2V0dGluZzogZmFsc2UsXG4gICAgYmVmb3JlU2V0OiBmdW5jdGlvbiBiZWZvcmVTZXQoZWxlcywgbmV3UG9zKSB7XG4gICAgICBiZWZvcmVQb3NpdGlvblNldChlbGVzLCBuZXdQb3MsIHRydWUpO1xuICAgIH0sXG4gICAgb25TZXQ6IGZ1bmN0aW9uIG9uU2V0KGVsZXMpIHtcbiAgICAgIGVsZXMuZGlydHlDb21wb3VuZEJvdW5kc0NhY2hlKCk7XG4gICAgfVxuICB9KSksXG4gIHBvc2l0aW9uczogZnVuY3Rpb24gcG9zaXRpb25zKHBvcywgc2lsZW50KSB7XG4gICAgaWYgKHBsYWluT2JqZWN0KHBvcykpIHtcbiAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgdGhpcy5zaWxlbnRQb3NpdGlvbihwb3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wb3NpdGlvbihwb3MpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZm4kNihwb3MpKSB7XG4gICAgICB2YXIgX2ZuID0gcG9zO1xuICAgICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgICAgY3kuc3RhcnRCYXRjaCgpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG5cbiAgICAgICAgdmFyIF9wb3MgPSB2b2lkIDA7XG5cbiAgICAgICAgaWYgKF9wb3MgPSBfZm4oZWxlLCBpKSkge1xuICAgICAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgICAgIGVsZS5zaWxlbnRQb3NpdGlvbihfcG9zKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlLnBvc2l0aW9uKF9wb3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjeS5lbmRCYXRjaCgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICBzaWxlbnRQb3NpdGlvbnM6IGZ1bmN0aW9uIHNpbGVudFBvc2l0aW9ucyhwb3MpIHtcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbnMocG9zLCB0cnVlKTtcbiAgfSxcbiAgc2hpZnQ6IGZ1bmN0aW9uIHNoaWZ0KGRpbSwgdmFsLCBzaWxlbnQpIHtcbiAgICB2YXIgZGVsdGE7XG5cbiAgICBpZiAocGxhaW5PYmplY3QoZGltKSkge1xuICAgICAgZGVsdGEgPSB7XG4gICAgICAgIHg6IG51bWJlciQxKGRpbS54KSA/IGRpbS54IDogMCxcbiAgICAgICAgeTogbnVtYmVyJDEoZGltLnkpID8gZGltLnkgOiAwXG4gICAgICB9O1xuICAgICAgc2lsZW50ID0gdmFsO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nKGRpbSkgJiYgbnVtYmVyJDEodmFsKSkge1xuICAgICAgZGVsdGEgPSB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDBcbiAgICAgIH07XG4gICAgICBkZWx0YVtkaW1dID0gdmFsO1xuICAgIH1cblxuICAgIGlmIChkZWx0YSAhPSBudWxsKSB7XG4gICAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgICBjeS5zdGFydEJhdGNoKCk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gdGhpc1tpXTsgLy8gZXhjbHVkZSBhbnkgbm9kZSB0aGF0IGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgY2FsbGluZyBjb2xsZWN0aW9uXG5cbiAgICAgICAgaWYgKGN5Lmhhc0NvbXBvdW5kTm9kZXMoKSAmJiBlbGUuaXNDaGlsZCgpICYmIGVsZS5hbmNlc3RvcnMoKS5hbnlTYW1lKHRoaXMpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcG9zID0gZWxlLnBvc2l0aW9uKCk7XG4gICAgICAgIHZhciBuZXdQb3MgPSB7XG4gICAgICAgICAgeDogcG9zLnggKyBkZWx0YS54LFxuICAgICAgICAgIHk6IHBvcy55ICsgZGVsdGEueVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgICBlbGUuc2lsZW50UG9zaXRpb24obmV3UG9zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGUucG9zaXRpb24obmV3UG9zKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjeS5lbmRCYXRjaCgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBzaWxlbnRTaGlmdDogZnVuY3Rpb24gc2lsZW50U2hpZnQoZGltLCB2YWwpIHtcbiAgICBpZiAocGxhaW5PYmplY3QoZGltKSkge1xuICAgICAgdGhpcy5zaGlmdChkaW0sIHRydWUpO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nKGRpbSkgJiYgbnVtYmVyJDEodmFsKSkge1xuICAgICAgdGhpcy5zaGlmdChkaW0sIHZhbCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIC8vIGdldC9zZXQgdGhlIHJlbmRlcmVkIChpLmUuIG9uIHNjcmVlbikgcG9zaXRvbiBvZiB0aGUgZWxlbWVudFxuICByZW5kZXJlZFBvc2l0aW9uOiBmdW5jdGlvbiByZW5kZXJlZFBvc2l0aW9uKGRpbSwgdmFsKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgICB2YXIgcnBvcyA9IHBsYWluT2JqZWN0KGRpbSkgPyBkaW0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIHNldHRpbmcgPSBycG9zICE9PSB1bmRlZmluZWQgfHwgdmFsICE9PSB1bmRlZmluZWQgJiYgc3RyaW5nKGRpbSk7XG5cbiAgICBpZiAoZWxlICYmIGVsZS5pc05vZGUoKSkge1xuICAgICAgLy8gbXVzdCBoYXZlIGFuIGVsZW1lbnQgYW5kIG11c3QgYmUgYSBub2RlIHRvIHJldHVybiBwb3NpdGlvblxuICAgICAgaWYgKHNldHRpbmcpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIF9lbGUgPSB0aGlzW2ldO1xuXG4gICAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBzZXQgb25lIGRpbWVuc2lvblxuICAgICAgICAgICAgX2VsZS5wb3NpdGlvbihkaW0sICh2YWwgLSBwYW5bZGltXSkgLyB6b29tKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJwb3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gc2V0IHdob2xlIHBvc2l0aW9uXG4gICAgICAgICAgICBfZWxlLnBvc2l0aW9uKHJlbmRlcmVkVG9Nb2RlbFBvc2l0aW9uKHJwb3MsIHpvb20sIHBhbikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZ2V0dGluZ1xuICAgICAgICB2YXIgcG9zID0gZWxlLnBvc2l0aW9uKCk7XG4gICAgICAgIHJwb3MgPSBtb2RlbFRvUmVuZGVyZWRQb3NpdGlvbihwb3MsIHpvb20sIHBhbik7XG5cbiAgICAgICAgaWYgKGRpbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gdGhlbiByZXR1cm4gdGhlIHdob2xlIHJlbmRlcmVkIHBvc2l0aW9uXG4gICAgICAgICAgcmV0dXJuIHJwb3M7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdGhlbiByZXR1cm4gdGhlIHNwZWNpZmllZCBkaW1lbnNpb25cbiAgICAgICAgICByZXR1cm4gcnBvc1tkaW1dO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghc2V0dGluZykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gZm9yIGVtcHR5IGNvbGxlY3Rpb24gY2FzZVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICAvLyBnZXQvc2V0IHRoZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgcGFyZW50XG4gIHJlbGF0aXZlUG9zaXRpb246IGZ1bmN0aW9uIHJlbGF0aXZlUG9zaXRpb24oZGltLCB2YWwpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIHBwb3MgPSBwbGFpbk9iamVjdChkaW0pID8gZGltIDogdW5kZWZpbmVkO1xuICAgIHZhciBzZXR0aW5nID0gcHBvcyAhPT0gdW5kZWZpbmVkIHx8IHZhbCAhPT0gdW5kZWZpbmVkICYmIHN0cmluZyhkaW0pO1xuICAgIHZhciBoYXNDb21wb3VuZE5vZGVzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuXG4gICAgaWYgKGVsZSAmJiBlbGUuaXNOb2RlKCkpIHtcbiAgICAgIC8vIG11c3QgaGF2ZSBhbiBlbGVtZW50IGFuZCBtdXN0IGJlIGEgbm9kZSB0byByZXR1cm4gcG9zaXRpb25cbiAgICAgIGlmIChzZXR0aW5nKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBfZWxlMiA9IHRoaXNbaV07XG4gICAgICAgICAgdmFyIHBhcmVudCA9IGhhc0NvbXBvdW5kTm9kZXMgPyBfZWxlMi5wYXJlbnQoKSA6IG51bGw7XG4gICAgICAgICAgdmFyIGhhc1BhcmVudCA9IHBhcmVudCAmJiBwYXJlbnQubGVuZ3RoID4gMDtcbiAgICAgICAgICB2YXIgcmVsYXRpdmVUb1BhcmVudCA9IGhhc1BhcmVudDtcblxuICAgICAgICAgIGlmIChoYXNQYXJlbnQpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudFswXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgb3JpZ2luID0gcmVsYXRpdmVUb1BhcmVudCA/IHBhcmVudC5wb3NpdGlvbigpIDoge1xuICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgIHk6IDBcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBzZXQgb25lIGRpbWVuc2lvblxuICAgICAgICAgICAgX2VsZTIucG9zaXRpb24oZGltLCB2YWwgKyBvcmlnaW5bZGltXSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcG9zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHNldCB3aG9sZSBwb3NpdGlvblxuICAgICAgICAgICAgX2VsZTIucG9zaXRpb24oe1xuICAgICAgICAgICAgICB4OiBwcG9zLnggKyBvcmlnaW4ueCxcbiAgICAgICAgICAgICAgeTogcHBvcy55ICsgb3JpZ2luLnlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZ2V0dGluZ1xuICAgICAgICB2YXIgcG9zID0gZWxlLnBvc2l0aW9uKCk7XG5cbiAgICAgICAgdmFyIF9wYXJlbnQgPSBoYXNDb21wb3VuZE5vZGVzID8gZWxlLnBhcmVudCgpIDogbnVsbDtcblxuICAgICAgICB2YXIgX2hhc1BhcmVudCA9IF9wYXJlbnQgJiYgX3BhcmVudC5sZW5ndGggPiAwO1xuXG4gICAgICAgIHZhciBfcmVsYXRpdmVUb1BhcmVudCA9IF9oYXNQYXJlbnQ7XG5cbiAgICAgICAgaWYgKF9oYXNQYXJlbnQpIHtcbiAgICAgICAgICBfcGFyZW50ID0gX3BhcmVudFswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfb3JpZ2luID0gX3JlbGF0aXZlVG9QYXJlbnQgPyBfcGFyZW50LnBvc2l0aW9uKCkgOiB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH07XG5cbiAgICAgICAgcHBvcyA9IHtcbiAgICAgICAgICB4OiBwb3MueCAtIF9vcmlnaW4ueCxcbiAgICAgICAgICB5OiBwb3MueSAtIF9vcmlnaW4ueVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChkaW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSB3aG9sZSByZW5kZXJlZCBwb3NpdGlvblxuICAgICAgICAgIHJldHVybiBwcG9zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSBzcGVjaWZpZWQgZGltZW5zaW9uXG4gICAgICAgICAgcmV0dXJuIHBwb3NbZGltXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXNldHRpbmcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIGZvciBlbXB0eSBjb2xsZWN0aW9uIGNhc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfVxufTsgLy8gYWxpYXNlc1xuXG5mbiQ0Lm1vZGVsUG9zaXRpb24gPSBmbiQ0LnBvaW50ID0gZm4kNC5wb3NpdGlvbjtcbmZuJDQubW9kZWxQb3NpdGlvbnMgPSBmbiQ0LnBvaW50cyA9IGZuJDQucG9zaXRpb25zO1xuZm4kNC5yZW5kZXJlZFBvaW50ID0gZm4kNC5yZW5kZXJlZFBvc2l0aW9uO1xuZm4kNC5yZWxhdGl2ZVBvaW50ID0gZm4kNC5yZWxhdGl2ZVBvc2l0aW9uO1xudmFyIHBvc2l0aW9uID0gZWxlc2ZuJGM7XG5cbnZhciBmbiQzLCBlbGVzZm4kYjtcbmZuJDMgPSBlbGVzZm4kYiA9IHt9O1xuXG5lbGVzZm4kYi5yZW5kZXJlZEJvdW5kaW5nQm94ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgdmFyIGJiID0gdGhpcy5ib3VuZGluZ0JveChvcHRpb25zKTtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICB2YXIgeDEgPSBiYi54MSAqIHpvb20gKyBwYW4ueDtcbiAgdmFyIHgyID0gYmIueDIgKiB6b29tICsgcGFuLng7XG4gIHZhciB5MSA9IGJiLnkxICogem9vbSArIHBhbi55O1xuICB2YXIgeTIgPSBiYi55MiAqIHpvb20gKyBwYW4ueTtcbiAgcmV0dXJuIHtcbiAgICB4MTogeDEsXG4gICAgeDI6IHgyLFxuICAgIHkxOiB5MSxcbiAgICB5MjogeTIsXG4gICAgdzogeDIgLSB4MSxcbiAgICBoOiB5MiAtIHkxXG4gIH07XG59O1xuXG5lbGVzZm4kYi5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzaWxlbnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG5cbiAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSB8fCAhY3kuaGFzQ29tcG91bmROb2RlcygpKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0aGlzLmZvckVhY2hVcChmdW5jdGlvbiAoZWxlKSB7XG4gICAgaWYgKGVsZS5pc1BhcmVudCgpKSB7XG4gICAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgICBfcC5jb21wb3VuZEJvdW5kc0NsZWFuID0gZmFsc2U7XG4gICAgICBfcC5iYkNhY2hlID0gbnVsbDtcblxuICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgZWxlLmVtaXRBbmROb3RpZnkoJ2JvdW5kcycpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZWxlc2ZuJGIudXBkYXRlQ29tcG91bmRCb3VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBmb3JjZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG4gIHZhciBjeSA9IHRoaXMuY3koKTsgLy8gbm90IHBvc3NpYmxlIHRvIGRvIG9uIG5vbi1jb21wb3VuZCBncmFwaHMgb3Igd2l0aCB0aGUgc3R5bGUgZGlzYWJsZWRcblxuICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpIHx8ICFjeS5oYXNDb21wb3VuZE5vZGVzKCkpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSAvLyBzYXZlIGN5Y2xlcyB3aGVuIGJhdGNoaW5nIC0tIGJ1dCBib3VuZHMgd2lsbCBiZSBzdGFsZSAob3Igbm90IGV4aXN0IHlldClcblxuXG4gIGlmICghZm9yY2UgJiYgY3kuYmF0Y2hpbmcoKSkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlKHBhcmVudCkge1xuICAgIGlmICghcGFyZW50LmlzUGFyZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgX3AgPSBwYXJlbnQuX3ByaXZhdGU7XG4gICAgdmFyIGNoaWxkcmVuID0gcGFyZW50LmNoaWxkcmVuKCk7XG4gICAgdmFyIGluY2x1ZGVMYWJlbHMgPSBwYXJlbnQucHN0eWxlKCdjb21wb3VuZC1zaXppbmctd3J0LWxhYmVscycpLnZhbHVlID09PSAnaW5jbHVkZSc7XG4gICAgdmFyIG1pbiA9IHtcbiAgICAgIHdpZHRoOiB7XG4gICAgICAgIHZhbDogcGFyZW50LnBzdHlsZSgnbWluLXdpZHRoJykucGZWYWx1ZSxcbiAgICAgICAgbGVmdDogcGFyZW50LnBzdHlsZSgnbWluLXdpZHRoLWJpYXMtbGVmdCcpLFxuICAgICAgICByaWdodDogcGFyZW50LnBzdHlsZSgnbWluLXdpZHRoLWJpYXMtcmlnaHQnKVxuICAgICAgfSxcbiAgICAgIGhlaWdodDoge1xuICAgICAgICB2YWw6IHBhcmVudC5wc3R5bGUoJ21pbi1oZWlnaHQnKS5wZlZhbHVlLFxuICAgICAgICB0b3A6IHBhcmVudC5wc3R5bGUoJ21pbi1oZWlnaHQtYmlhcy10b3AnKSxcbiAgICAgICAgYm90dG9tOiBwYXJlbnQucHN0eWxlKCdtaW4taGVpZ2h0LWJpYXMtYm90dG9tJylcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBiYiA9IGNoaWxkcmVuLmJvdW5kaW5nQm94KHtcbiAgICAgIGluY2x1ZGVMYWJlbHM6IGluY2x1ZGVMYWJlbHMsXG4gICAgICBpbmNsdWRlT3ZlcmxheXM6IGZhbHNlLFxuICAgICAgLy8gdXBkYXRpbmcgdGhlIGNvbXBvdW5kIGJvdW5kcyBoYXBwZW5zIG91dHNpZGUgb2YgdGhlIHJlZ3VsYXJcbiAgICAgIC8vIGNhY2hlIGN5Y2xlIChpLmUuIGJlZm9yZSBmaXJlZCBldmVudHMpXG4gICAgICB1c2VDYWNoZTogZmFsc2VcbiAgICB9KTtcbiAgICB2YXIgcG9zID0gX3AucG9zaXRpb247IC8vIGlmIGNoaWxkcmVuIHRha2UgdXAgemVybyBhcmVhIHRoZW4ga2VlcCBwb3NpdGlvbiBhbmQgZmFsbCBiYWNrIG9uIHN0eWxlc2hlZXQgdy9oXG5cbiAgICBpZiAoYmIudyA9PT0gMCB8fCBiYi5oID09PSAwKSB7XG4gICAgICBiYiA9IHtcbiAgICAgICAgdzogcGFyZW50LnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlLFxuICAgICAgICBoOiBwYXJlbnQucHN0eWxlKCdoZWlnaHQnKS5wZlZhbHVlXG4gICAgICB9O1xuICAgICAgYmIueDEgPSBwb3MueCAtIGJiLncgLyAyO1xuICAgICAgYmIueDIgPSBwb3MueCArIGJiLncgLyAyO1xuICAgICAgYmIueTEgPSBwb3MueSAtIGJiLmggLyAyO1xuICAgICAgYmIueTIgPSBwb3MueSArIGJiLmggLyAyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVCaWFzVmFsdWVzKHByb3BEaWZmLCBwcm9wQmlhcywgcHJvcEJpYXNDb21wbGVtZW50KSB7XG4gICAgICB2YXIgYmlhc0RpZmYgPSAwO1xuICAgICAgdmFyIGJpYXNDb21wbGVtZW50RGlmZiA9IDA7XG4gICAgICB2YXIgYmlhc1RvdGFsID0gcHJvcEJpYXMgKyBwcm9wQmlhc0NvbXBsZW1lbnQ7XG5cbiAgICAgIGlmIChwcm9wRGlmZiA+IDAgJiYgYmlhc1RvdGFsID4gMCkge1xuICAgICAgICBiaWFzRGlmZiA9IHByb3BCaWFzIC8gYmlhc1RvdGFsICogcHJvcERpZmY7XG4gICAgICAgIGJpYXNDb21wbGVtZW50RGlmZiA9IHByb3BCaWFzQ29tcGxlbWVudCAvIGJpYXNUb3RhbCAqIHByb3BEaWZmO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBiaWFzRGlmZjogYmlhc0RpZmYsXG4gICAgICAgIGJpYXNDb21wbGVtZW50RGlmZjogYmlhc0NvbXBsZW1lbnREaWZmXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVQYWRkaW5nVmFsdWVzKHdpZHRoLCBoZWlnaHQsIHBhZGRpbmdPYmplY3QsIHJlbGF0aXZlVG8pIHtcbiAgICAgIC8vIEFzc3VtaW5nIHBlcmNlbnRhZ2UgaXMgbnVtYmVyIGZyb20gMCB0byAxXG4gICAgICBpZiAocGFkZGluZ09iamVjdC51bml0cyA9PT0gJyUnKSB7XG4gICAgICAgIHN3aXRjaCAocmVsYXRpdmVUbykge1xuICAgICAgICAgIGNhc2UgJ3dpZHRoJzpcbiAgICAgICAgICAgIHJldHVybiB3aWR0aCA+IDAgPyBwYWRkaW5nT2JqZWN0LnBmVmFsdWUgKiB3aWR0aCA6IDA7XG5cbiAgICAgICAgICBjYXNlICdoZWlnaHQnOlxuICAgICAgICAgICAgcmV0dXJuIGhlaWdodCA+IDAgPyBwYWRkaW5nT2JqZWN0LnBmVmFsdWUgKiBoZWlnaHQgOiAwO1xuXG4gICAgICAgICAgY2FzZSAnYXZlcmFnZSc6XG4gICAgICAgICAgICByZXR1cm4gd2lkdGggPiAwICYmIGhlaWdodCA+IDAgPyBwYWRkaW5nT2JqZWN0LnBmVmFsdWUgKiAod2lkdGggKyBoZWlnaHQpIC8gMiA6IDA7XG5cbiAgICAgICAgICBjYXNlICdtaW4nOlxuICAgICAgICAgICAgcmV0dXJuIHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwID8gd2lkdGggPiBoZWlnaHQgPyBwYWRkaW5nT2JqZWN0LnBmVmFsdWUgKiBoZWlnaHQgOiBwYWRkaW5nT2JqZWN0LnBmVmFsdWUgKiB3aWR0aCA6IDA7XG5cbiAgICAgICAgICBjYXNlICdtYXgnOlxuICAgICAgICAgICAgcmV0dXJuIHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwID8gd2lkdGggPiBoZWlnaHQgPyBwYWRkaW5nT2JqZWN0LnBmVmFsdWUgKiB3aWR0aCA6IHBhZGRpbmdPYmplY3QucGZWYWx1ZSAqIGhlaWdodCA6IDA7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocGFkZGluZ09iamVjdC51bml0cyA9PT0gJ3B4Jykge1xuICAgICAgICByZXR1cm4gcGFkZGluZ09iamVjdC5wZlZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGxlZnRWYWwgPSBtaW4ud2lkdGgubGVmdC52YWx1ZTtcblxuICAgIGlmIChtaW4ud2lkdGgubGVmdC51bml0cyA9PT0gJ3B4JyAmJiBtaW4ud2lkdGgudmFsID4gMCkge1xuICAgICAgbGVmdFZhbCA9IGxlZnRWYWwgKiAxMDAgLyBtaW4ud2lkdGgudmFsO1xuICAgIH1cblxuICAgIHZhciByaWdodFZhbCA9IG1pbi53aWR0aC5yaWdodC52YWx1ZTtcblxuICAgIGlmIChtaW4ud2lkdGgucmlnaHQudW5pdHMgPT09ICdweCcgJiYgbWluLndpZHRoLnZhbCA+IDApIHtcbiAgICAgIHJpZ2h0VmFsID0gcmlnaHRWYWwgKiAxMDAgLyBtaW4ud2lkdGgudmFsO1xuICAgIH1cblxuICAgIHZhciB0b3BWYWwgPSBtaW4uaGVpZ2h0LnRvcC52YWx1ZTtcblxuICAgIGlmIChtaW4uaGVpZ2h0LnRvcC51bml0cyA9PT0gJ3B4JyAmJiBtaW4uaGVpZ2h0LnZhbCA+IDApIHtcbiAgICAgIHRvcFZhbCA9IHRvcFZhbCAqIDEwMCAvIG1pbi5oZWlnaHQudmFsO1xuICAgIH1cblxuICAgIHZhciBib3R0b21WYWwgPSBtaW4uaGVpZ2h0LmJvdHRvbS52YWx1ZTtcblxuICAgIGlmIChtaW4uaGVpZ2h0LmJvdHRvbS51bml0cyA9PT0gJ3B4JyAmJiBtaW4uaGVpZ2h0LnZhbCA+IDApIHtcbiAgICAgIGJvdHRvbVZhbCA9IGJvdHRvbVZhbCAqIDEwMCAvIG1pbi5oZWlnaHQudmFsO1xuICAgIH1cblxuICAgIHZhciB3aWR0aEJpYXNEaWZmcyA9IGNvbXB1dGVCaWFzVmFsdWVzKG1pbi53aWR0aC52YWwgLSBiYi53LCBsZWZ0VmFsLCByaWdodFZhbCk7XG4gICAgdmFyIGRpZmZMZWZ0ID0gd2lkdGhCaWFzRGlmZnMuYmlhc0RpZmY7XG4gICAgdmFyIGRpZmZSaWdodCA9IHdpZHRoQmlhc0RpZmZzLmJpYXNDb21wbGVtZW50RGlmZjtcbiAgICB2YXIgaGVpZ2h0Qmlhc0RpZmZzID0gY29tcHV0ZUJpYXNWYWx1ZXMobWluLmhlaWdodC52YWwgLSBiYi5oLCB0b3BWYWwsIGJvdHRvbVZhbCk7XG4gICAgdmFyIGRpZmZUb3AgPSBoZWlnaHRCaWFzRGlmZnMuYmlhc0RpZmY7XG4gICAgdmFyIGRpZmZCb3R0b20gPSBoZWlnaHRCaWFzRGlmZnMuYmlhc0NvbXBsZW1lbnREaWZmO1xuICAgIF9wLmF1dG9QYWRkaW5nID0gY29tcHV0ZVBhZGRpbmdWYWx1ZXMoYmIudywgYmIuaCwgcGFyZW50LnBzdHlsZSgncGFkZGluZycpLCBwYXJlbnQucHN0eWxlKCdwYWRkaW5nLXJlbGF0aXZlLXRvJykudmFsdWUpO1xuICAgIF9wLmF1dG9XaWR0aCA9IE1hdGgubWF4KGJiLncsIG1pbi53aWR0aC52YWwpO1xuICAgIHBvcy54ID0gKC1kaWZmTGVmdCArIGJiLngxICsgYmIueDIgKyBkaWZmUmlnaHQpIC8gMjtcbiAgICBfcC5hdXRvSGVpZ2h0ID0gTWF0aC5tYXgoYmIuaCwgbWluLmhlaWdodC52YWwpO1xuICAgIHBvcy55ID0gKC1kaWZmVG9wICsgYmIueTEgKyBiYi55MiArIGRpZmZCb3R0b20pIC8gMjtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcblxuICAgIGlmICghX3AuY29tcG91bmRCb3VuZHNDbGVhbiB8fCBmb3JjZSkge1xuICAgICAgdXBkYXRlKGVsZSk7XG5cbiAgICAgIGlmICghY3kuYmF0Y2hpbmcoKSkge1xuICAgICAgICBfcC5jb21wb3VuZEJvdW5kc0NsZWFuID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbnZhciBub25pbmYgPSBmdW5jdGlvbiBub25pbmYoeCkge1xuICBpZiAoeCA9PT0gSW5maW5pdHkgfHwgeCA9PT0gLUluZmluaXR5KSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICByZXR1cm4geDtcbn07XG5cbnZhciB1cGRhdGVCb3VuZHMgPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHMoYiwgeDEsIHkxLCB4MiwgeTIpIHtcbiAgLy8gZG9uJ3QgdXBkYXRlIHdpdGggemVybyBhcmVhIGJveGVzXG4gIGlmICh4MiAtIHgxID09PSAwIHx8IHkyIC0geTEgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH0gLy8gZG9uJ3QgdXBkYXRlIHdpdGggbnVsbCBkaW1cblxuXG4gIGlmICh4MSA9PSBudWxsIHx8IHkxID09IG51bGwgfHwgeDIgPT0gbnVsbCB8fCB5MiA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYi54MSA9IHgxIDwgYi54MSA/IHgxIDogYi54MTtcbiAgYi54MiA9IHgyID4gYi54MiA/IHgyIDogYi54MjtcbiAgYi55MSA9IHkxIDwgYi55MSA/IHkxIDogYi55MTtcbiAgYi55MiA9IHkyID4gYi55MiA/IHkyIDogYi55MjtcbiAgYi53ID0gYi54MiAtIGIueDE7XG4gIGIuaCA9IGIueTIgLSBiLnkxO1xufTtcblxudmFyIHVwZGF0ZUJvdW5kc0Zyb21Cb3ggPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHNGcm9tQm94KGIsIGIyKSB7XG4gIGlmIChiMiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGI7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlQm91bmRzKGIsIGIyLngxLCBiMi55MSwgYjIueDIsIGIyLnkyKTtcbn07XG5cbnZhciBwcmVmaXhlZFByb3BlcnR5ID0gZnVuY3Rpb24gcHJlZml4ZWRQcm9wZXJ0eShvYmosIGZpZWxkLCBwcmVmaXgpIHtcbiAgcmV0dXJuIGdldFByZWZpeGVkUHJvcGVydHkob2JqLCBmaWVsZCwgcHJlZml4KTtcbn07XG5cbnZhciB1cGRhdGVCb3VuZHNGcm9tQXJyb3cgPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHNGcm9tQXJyb3coYm91bmRzLCBlbGUsIHByZWZpeCkge1xuICBpZiAoZWxlLmN5KCkuaGVhZGxlc3MoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHJzdHlsZSA9IF9wLnJzdHlsZTtcbiAgdmFyIGhhbGZBclcgPSByc3R5bGUuYXJyb3dXaWR0aCAvIDI7XG4gIHZhciBhcnJvd1R5cGUgPSBlbGUucHN0eWxlKHByZWZpeCArICctYXJyb3ctc2hhcGUnKS52YWx1ZTtcbiAgdmFyIHg7XG4gIHZhciB5O1xuXG4gIGlmIChhcnJvd1R5cGUgIT09ICdub25lJykge1xuICAgIGlmIChwcmVmaXggPT09ICdzb3VyY2UnKSB7XG4gICAgICB4ID0gcnN0eWxlLnNyY1g7XG4gICAgICB5ID0gcnN0eWxlLnNyY1k7XG4gICAgfSBlbHNlIGlmIChwcmVmaXggPT09ICd0YXJnZXQnKSB7XG4gICAgICB4ID0gcnN0eWxlLnRndFg7XG4gICAgICB5ID0gcnN0eWxlLnRndFk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHggPSByc3R5bGUubWlkWDtcbiAgICAgIHkgPSByc3R5bGUubWlkWTtcbiAgICB9IC8vIGFsd2F5cyBzdG9yZSB0aGUgaW5kaXZpZHVhbCBhcnJvdyBib3VuZHNcblxuXG4gICAgdmFyIGJicyA9IF9wLmFycm93Qm91bmRzID0gX3AuYXJyb3dCb3VuZHMgfHwge307XG4gICAgdmFyIGJiID0gYmJzW3ByZWZpeF0gPSBiYnNbcHJlZml4XSB8fCB7fTtcbiAgICBiYi54MSA9IHggLSBoYWxmQXJXO1xuICAgIGJiLnkxID0geSAtIGhhbGZBclc7XG4gICAgYmIueDIgPSB4ICsgaGFsZkFyVztcbiAgICBiYi55MiA9IHkgKyBoYWxmQXJXO1xuICAgIGJiLncgPSBiYi54MiAtIGJiLngxO1xuICAgIGJiLmggPSBiYi55MiAtIGJiLnkxO1xuICAgIGV4cGFuZEJvdW5kaW5nQm94KGJiLCAxKTtcbiAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBiYi54MSwgYmIueTEsIGJiLngyLCBiYi55Mik7XG4gIH1cbn07XG5cbnZhciB1cGRhdGVCb3VuZHNGcm9tTGFiZWwgPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHNGcm9tTGFiZWwoYm91bmRzLCBlbGUsIHByZWZpeCkge1xuICBpZiAoZWxlLmN5KCkuaGVhZGxlc3MoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwcmVmaXhEYXNoO1xuXG4gIGlmIChwcmVmaXgpIHtcbiAgICBwcmVmaXhEYXNoID0gcHJlZml4ICsgJy0nO1xuICB9IGVsc2Uge1xuICAgIHByZWZpeERhc2ggPSAnJztcbiAgfVxuXG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHJzdHlsZSA9IF9wLnJzdHlsZTtcbiAgdmFyIGxhYmVsID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ2xhYmVsJykuc3RyVmFsdWU7XG5cbiAgaWYgKGxhYmVsKSB7XG4gICAgdmFyIGhhbGlnbiA9IGVsZS5wc3R5bGUoJ3RleHQtaGFsaWduJyk7XG4gICAgdmFyIHZhbGlnbiA9IGVsZS5wc3R5bGUoJ3RleHQtdmFsaWduJyk7XG4gICAgdmFyIGxhYmVsV2lkdGggPSBwcmVmaXhlZFByb3BlcnR5KHJzdHlsZSwgJ2xhYmVsV2lkdGgnLCBwcmVmaXgpO1xuICAgIHZhciBsYWJlbEhlaWdodCA9IHByZWZpeGVkUHJvcGVydHkocnN0eWxlLCAnbGFiZWxIZWlnaHQnLCBwcmVmaXgpO1xuICAgIHZhciBsYWJlbFggPSBwcmVmaXhlZFByb3BlcnR5KHJzdHlsZSwgJ2xhYmVsWCcsIHByZWZpeCk7XG4gICAgdmFyIGxhYmVsWSA9IHByZWZpeGVkUHJvcGVydHkocnN0eWxlLCAnbGFiZWxZJywgcHJlZml4KTtcbiAgICB2YXIgbWFyZ2luWCA9IGVsZS5wc3R5bGUocHJlZml4RGFzaCArICd0ZXh0LW1hcmdpbi14JykucGZWYWx1ZTtcbiAgICB2YXIgbWFyZ2luWSA9IGVsZS5wc3R5bGUocHJlZml4RGFzaCArICd0ZXh0LW1hcmdpbi15JykucGZWYWx1ZTtcbiAgICB2YXIgaXNFZGdlID0gZWxlLmlzRWRnZSgpO1xuICAgIHZhciByb3RhdGlvbiA9IGVsZS5wc3R5bGUocHJlZml4RGFzaCArICd0ZXh0LXJvdGF0aW9uJyk7XG4gICAgdmFyIG91dGxpbmVXaWR0aCA9IGVsZS5wc3R5bGUoJ3RleHQtb3V0bGluZS13aWR0aCcpLnBmVmFsdWU7XG4gICAgdmFyIGJvcmRlcldpZHRoID0gZWxlLnBzdHlsZSgndGV4dC1ib3JkZXItd2lkdGgnKS5wZlZhbHVlO1xuICAgIHZhciBoYWxmQm9yZGVyV2lkdGggPSBib3JkZXJXaWR0aCAvIDI7XG4gICAgdmFyIHBhZGRpbmcgPSBlbGUucHN0eWxlKCd0ZXh0LWJhY2tncm91bmQtcGFkZGluZycpLnBmVmFsdWU7XG4gICAgdmFyIG1hcmdpbk9mRXJyb3IgPSAyOyAvLyBleHBhbmQgdG8gd29yayBhcm91bmQgYnJvd3NlciBkaW1lbnNpb24gaW5hY2N1cmFjaWVzXG5cbiAgICB2YXIgbGggPSBsYWJlbEhlaWdodDtcbiAgICB2YXIgbHcgPSBsYWJlbFdpZHRoO1xuICAgIHZhciBsd18yID0gbHcgLyAyO1xuICAgIHZhciBsaF8yID0gbGggLyAyO1xuICAgIHZhciBseDEsIGx4MiwgbHkxLCBseTI7XG5cbiAgICBpZiAoaXNFZGdlKSB7XG4gICAgICBseDEgPSBsYWJlbFggLSBsd18yO1xuICAgICAgbHgyID0gbGFiZWxYICsgbHdfMjtcbiAgICAgIGx5MSA9IGxhYmVsWSAtIGxoXzI7XG4gICAgICBseTIgPSBsYWJlbFkgKyBsaF8yO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKGhhbGlnbi52YWx1ZSkge1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICBseDEgPSBsYWJlbFggLSBsdztcbiAgICAgICAgICBseDIgPSBsYWJlbFg7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgICBseDEgPSBsYWJlbFggLSBsd18yO1xuICAgICAgICAgIGx4MiA9IGxhYmVsWCArIGx3XzI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIGx4MSA9IGxhYmVsWDtcbiAgICAgICAgICBseDIgPSBsYWJlbFggKyBsdztcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgc3dpdGNoICh2YWxpZ24udmFsdWUpIHtcbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICBseTEgPSBsYWJlbFkgLSBsaDtcbiAgICAgICAgICBseTIgPSBsYWJlbFk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgICBseTEgPSBsYWJlbFkgLSBsaF8yO1xuICAgICAgICAgIGx5MiA9IGxhYmVsWSArIGxoXzI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICBseTEgPSBsYWJlbFk7XG4gICAgICAgICAgbHkyID0gbGFiZWxZICsgbGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSAvLyBzaGlmdCBieSBtYXJnaW4gYW5kIGV4cGFuZCBieSBvdXRsaW5lIGFuZCBib3JkZXJcblxuXG4gICAgbHgxICs9IG1hcmdpblggLSBNYXRoLm1heChvdXRsaW5lV2lkdGgsIGhhbGZCb3JkZXJXaWR0aCkgLSBwYWRkaW5nIC0gbWFyZ2luT2ZFcnJvcjtcbiAgICBseDIgKz0gbWFyZ2luWCArIE1hdGgubWF4KG91dGxpbmVXaWR0aCwgaGFsZkJvcmRlcldpZHRoKSArIHBhZGRpbmcgKyBtYXJnaW5PZkVycm9yO1xuICAgIGx5MSArPSBtYXJnaW5ZIC0gTWF0aC5tYXgob3V0bGluZVdpZHRoLCBoYWxmQm9yZGVyV2lkdGgpIC0gcGFkZGluZyAtIG1hcmdpbk9mRXJyb3I7XG4gICAgbHkyICs9IG1hcmdpblkgKyBNYXRoLm1heChvdXRsaW5lV2lkdGgsIGhhbGZCb3JkZXJXaWR0aCkgKyBwYWRkaW5nICsgbWFyZ2luT2ZFcnJvcjsgLy8gYWx3YXlzIHN0b3JlIHRoZSB1bnJvdGF0ZWQgbGFiZWwgYm91bmRzIHNlcGFyYXRlbHlcblxuICAgIHZhciBiYlByZWZpeCA9IHByZWZpeCB8fCAnbWFpbic7XG4gICAgdmFyIGJicyA9IF9wLmxhYmVsQm91bmRzO1xuICAgIHZhciBiYiA9IGJic1tiYlByZWZpeF0gPSBiYnNbYmJQcmVmaXhdIHx8IHt9O1xuICAgIGJiLngxID0gbHgxO1xuICAgIGJiLnkxID0gbHkxO1xuICAgIGJiLngyID0gbHgyO1xuICAgIGJiLnkyID0gbHkyO1xuICAgIGJiLncgPSBseDIgLSBseDE7XG4gICAgYmIuaCA9IGx5MiAtIGx5MTtcbiAgICB2YXIgaXNBdXRvcm90YXRlID0gaXNFZGdlICYmIHJvdGF0aW9uLnN0clZhbHVlID09PSAnYXV0b3JvdGF0ZSc7XG4gICAgdmFyIGlzUGZWYWx1ZSA9IHJvdGF0aW9uLnBmVmFsdWUgIT0gbnVsbCAmJiByb3RhdGlvbi5wZlZhbHVlICE9PSAwO1xuXG4gICAgaWYgKGlzQXV0b3JvdGF0ZSB8fCBpc1BmVmFsdWUpIHtcbiAgICAgIHZhciB0aGV0YSA9IGlzQXV0b3JvdGF0ZSA/IHByZWZpeGVkUHJvcGVydHkoX3AucnN0eWxlLCAnbGFiZWxBbmdsZScsIHByZWZpeCkgOiByb3RhdGlvbi5wZlZhbHVlO1xuICAgICAgdmFyIGNvcyA9IE1hdGguY29zKHRoZXRhKTtcbiAgICAgIHZhciBzaW4gPSBNYXRoLnNpbih0aGV0YSk7IC8vIHJvdGF0aW9uIHBvaW50IChkZWZhdWx0IHZhbHVlIGZvciBjZW50ZXItY2VudGVyKVxuXG4gICAgICB2YXIgeG8gPSAobHgxICsgbHgyKSAvIDI7XG4gICAgICB2YXIgeW8gPSAobHkxICsgbHkyKSAvIDI7XG5cbiAgICAgIGlmICghaXNFZGdlKSB7XG4gICAgICAgIHN3aXRjaCAoaGFsaWduLnZhbHVlKSB7XG4gICAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgICB4byA9IGx4MjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgICAgeG8gPSBseDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAodmFsaWduLnZhbHVlKSB7XG4gICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgIHlvID0gbHkyO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgICAgeW8gPSBseTE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgcm90YXRlID0gZnVuY3Rpb24gcm90YXRlKHgsIHkpIHtcbiAgICAgICAgeCA9IHggLSB4bztcbiAgICAgICAgeSA9IHkgLSB5bztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiB4ICogY29zIC0geSAqIHNpbiArIHhvLFxuICAgICAgICAgIHk6IHggKiBzaW4gKyB5ICogY29zICsgeW9cbiAgICAgICAgfTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBweDF5MSA9IHJvdGF0ZShseDEsIGx5MSk7XG4gICAgICB2YXIgcHgxeTIgPSByb3RhdGUobHgxLCBseTIpO1xuICAgICAgdmFyIHB4MnkxID0gcm90YXRlKGx4MiwgbHkxKTtcbiAgICAgIHZhciBweDJ5MiA9IHJvdGF0ZShseDIsIGx5Mik7XG4gICAgICBseDEgPSBNYXRoLm1pbihweDF5MS54LCBweDF5Mi54LCBweDJ5MS54LCBweDJ5Mi54KTtcbiAgICAgIGx4MiA9IE1hdGgubWF4KHB4MXkxLngsIHB4MXkyLngsIHB4MnkxLngsIHB4MnkyLngpO1xuICAgICAgbHkxID0gTWF0aC5taW4ocHgxeTEueSwgcHgxeTIueSwgcHgyeTEueSwgcHgyeTIueSk7XG4gICAgICBseTIgPSBNYXRoLm1heChweDF5MS55LCBweDF5Mi55LCBweDJ5MS55LCBweDJ5Mi55KTtcbiAgICB9XG5cbiAgICB2YXIgYmJQcmVmaXhSb3QgPSBiYlByZWZpeCArICdSb3QnO1xuICAgIHZhciBiYlJvdCA9IGJic1tiYlByZWZpeFJvdF0gPSBiYnNbYmJQcmVmaXhSb3RdIHx8IHt9O1xuICAgIGJiUm90LngxID0gbHgxO1xuICAgIGJiUm90LnkxID0gbHkxO1xuICAgIGJiUm90LngyID0gbHgyO1xuICAgIGJiUm90LnkyID0gbHkyO1xuICAgIGJiUm90LncgPSBseDIgLSBseDE7XG4gICAgYmJSb3QuaCA9IGx5MiAtIGx5MTtcbiAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBseDEsIGx5MSwgbHgyLCBseTIpO1xuICAgIHVwZGF0ZUJvdW5kcyhfcC5sYWJlbEJvdW5kcy5hbGwsIGx4MSwgbHkxLCBseDIsIGx5Mik7XG4gIH1cblxuICByZXR1cm4gYm91bmRzO1xufTsgLy8gZ2V0IHRoZSBib3VuZGluZyBib3ggb2YgdGhlIGVsZW1lbnRzIChpbiByYXcgbW9kZWwgcG9zaXRpb24pXG5cblxudmFyIGJvdW5kaW5nQm94SW1wbCA9IGZ1bmN0aW9uIGJvdW5kaW5nQm94SW1wbChlbGUsIG9wdGlvbnMpIHtcbiAgdmFyIGN5ID0gZWxlLl9wcml2YXRlLmN5O1xuICB2YXIgc3R5bGVFbmFibGVkID0gY3kuc3R5bGVFbmFibGVkKCk7XG4gIHZhciBoZWFkbGVzcyA9IGN5LmhlYWRsZXNzKCk7XG4gIHZhciBib3VuZHMgPSBtYWtlQm91bmRpbmdCb3goKTtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgaXNOb2RlID0gZWxlLmlzTm9kZSgpO1xuICB2YXIgaXNFZGdlID0gZWxlLmlzRWRnZSgpO1xuICB2YXIgZXgxLCBleDIsIGV5MSwgZXkyOyAvLyBleHRyZW1hIG9mIGJvZHkgLyBsaW5lc1xuXG4gIHZhciB4LCB5OyAvLyBub2RlIHBvc1xuXG4gIHZhciByc3R5bGUgPSBfcC5yc3R5bGU7XG4gIHZhciBtYW51YWxFeHBhbnNpb24gPSBpc05vZGUgJiYgc3R5bGVFbmFibGVkID8gZWxlLnBzdHlsZSgnYm91bmRzLWV4cGFuc2lvbicpLnBmVmFsdWUgOiBbMF07IC8vIG11c3QgdXNlIGBkaXNwbGF5YCBwcm9wIG9ubHksIGFzIHJlYWRpbmcgYGNvbXBvdW5kLndpZHRoKClgIGNhdXNlcyByZWN1cnNpb25cbiAgLy8gKG90aGVyIGZhY3RvcnMgbGlrZSB3aWR0aCB2YWx1ZXMgd2lsbCBiZSBjb25zaWRlcmVkIGxhdGVyIGluIHRoaXMgZnVuY3Rpb24gYW55d2F5KVxuXG4gIHZhciBpc0Rpc3BsYXllZCA9IGZ1bmN0aW9uIGlzRGlzcGxheWVkKGVsZSkge1xuICAgIHJldHVybiBlbGUucHN0eWxlKCdkaXNwbGF5JykudmFsdWUgIT09ICdub25lJztcbiAgfTtcblxuICB2YXIgZGlzcGxheWVkID0gIXN0eWxlRW5hYmxlZCB8fCBpc0Rpc3BsYXllZChlbGUpIC8vIG11c3QgdGFrZSBpbnRvIGFjY291bnQgY29ubmVjdGVkIG5vZGVzIGIvYyBvZiBpbXBsaWNpdCBlZGdlIGhpZGluZyBvbiBkaXNwbGF5Om5vbmUgbm9kZVxuICAmJiAoIWlzRWRnZSB8fCBpc0Rpc3BsYXllZChlbGUuc291cmNlKCkpICYmIGlzRGlzcGxheWVkKGVsZS50YXJnZXQoKSkpO1xuXG4gIGlmIChkaXNwbGF5ZWQpIHtcbiAgICAvLyBkaXNwbGF5ZWQgc3VmZmljZXMsIHNpbmNlIHdlIHdpbGwgZmluZCB6ZXJvIGFyZWEgZWxlcyBhbnl3YXlcbiAgICB2YXIgb3ZlcmxheU9wYWNpdHkgPSAwO1xuICAgIHZhciBvdmVybGF5UGFkZGluZyA9IDA7XG5cbiAgICBpZiAoc3R5bGVFbmFibGVkICYmIG9wdGlvbnMuaW5jbHVkZU92ZXJsYXlzKSB7XG4gICAgICBvdmVybGF5T3BhY2l0eSA9IGVsZS5wc3R5bGUoJ292ZXJsYXktb3BhY2l0eScpLnZhbHVlO1xuXG4gICAgICBpZiAob3ZlcmxheU9wYWNpdHkgIT09IDApIHtcbiAgICAgICAgb3ZlcmxheVBhZGRpbmcgPSBlbGUucHN0eWxlKCdvdmVybGF5LXBhZGRpbmcnKS52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdW5kZXJsYXlPcGFjaXR5ID0gMDtcbiAgICB2YXIgdW5kZXJsYXlQYWRkaW5nID0gMDtcblxuICAgIGlmIChzdHlsZUVuYWJsZWQgJiYgb3B0aW9ucy5pbmNsdWRlVW5kZXJsYXlzKSB7XG4gICAgICB1bmRlcmxheU9wYWNpdHkgPSBlbGUucHN0eWxlKCd1bmRlcmxheS1vcGFjaXR5JykudmFsdWU7XG5cbiAgICAgIGlmICh1bmRlcmxheU9wYWNpdHkgIT09IDApIHtcbiAgICAgICAgdW5kZXJsYXlQYWRkaW5nID0gZWxlLnBzdHlsZSgndW5kZXJsYXktcGFkZGluZycpLnZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwYWRkaW5nID0gTWF0aC5tYXgob3ZlcmxheVBhZGRpbmcsIHVuZGVybGF5UGFkZGluZyk7XG4gICAgdmFyIHcgPSAwO1xuICAgIHZhciB3SGFsZiA9IDA7XG5cbiAgICBpZiAoc3R5bGVFbmFibGVkKSB7XG4gICAgICB3ID0gZWxlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuICAgICAgd0hhbGYgPSB3IC8gMjtcbiAgICB9XG5cbiAgICBpZiAoaXNOb2RlICYmIG9wdGlvbnMuaW5jbHVkZU5vZGVzKSB7XG4gICAgICB2YXIgcG9zID0gZWxlLnBvc2l0aW9uKCk7XG4gICAgICB4ID0gcG9zLng7XG4gICAgICB5ID0gcG9zLnk7XG5cbiAgICAgIHZhciBfdyA9IGVsZS5vdXRlcldpZHRoKCk7XG5cbiAgICAgIHZhciBoYWxmVyA9IF93IC8gMjtcbiAgICAgIHZhciBoID0gZWxlLm91dGVySGVpZ2h0KCk7XG4gICAgICB2YXIgaGFsZkggPSBoIC8gMjsgLy8gaGFuZGxlIG5vZGUgZGltZW5zaW9uc1xuICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICBleDEgPSB4IC0gaGFsZlc7XG4gICAgICBleDIgPSB4ICsgaGFsZlc7XG4gICAgICBleTEgPSB5IC0gaGFsZkg7XG4gICAgICBleTIgPSB5ICsgaGFsZkg7XG4gICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBleDEsIGV5MSwgZXgyLCBleTIpO1xuICAgIH0gZWxzZSBpZiAoaXNFZGdlICYmIG9wdGlvbnMuaW5jbHVkZUVkZ2VzKSB7XG4gICAgICBpZiAoc3R5bGVFbmFibGVkICYmICFoZWFkbGVzcykge1xuICAgICAgICB2YXIgY3VydmVTdHlsZSA9IGVsZS5wc3R5bGUoJ2N1cnZlLXN0eWxlJykuc3RyVmFsdWU7IC8vIGhhbmRsZSBlZGdlIGRpbWVuc2lvbnMgKHJvdWdoIGJveCBlc3RpbWF0ZSlcbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgIGV4MSA9IE1hdGgubWluKHJzdHlsZS5zcmNYLCByc3R5bGUubWlkWCwgcnN0eWxlLnRndFgpO1xuICAgICAgICBleDIgPSBNYXRoLm1heChyc3R5bGUuc3JjWCwgcnN0eWxlLm1pZFgsIHJzdHlsZS50Z3RYKTtcbiAgICAgICAgZXkxID0gTWF0aC5taW4ocnN0eWxlLnNyY1ksIHJzdHlsZS5taWRZLCByc3R5bGUudGd0WSk7XG4gICAgICAgIGV5MiA9IE1hdGgubWF4KHJzdHlsZS5zcmNZLCByc3R5bGUubWlkWSwgcnN0eWxlLnRndFkpOyAvLyB0YWtlIGludG8gYWNjb3VudCBlZGdlIHdpZHRoXG5cbiAgICAgICAgZXgxIC09IHdIYWxmO1xuICAgICAgICBleDIgKz0gd0hhbGY7XG4gICAgICAgIGV5MSAtPSB3SGFsZjtcbiAgICAgICAgZXkyICs9IHdIYWxmO1xuICAgICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBleDEsIGV5MSwgZXgyLCBleTIpOyAvLyBwcmVjaXNlIGVkZ2VzXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICBpZiAoY3VydmVTdHlsZSA9PT0gJ2hheXN0YWNrJykge1xuICAgICAgICAgIHZhciBocHRzID0gcnN0eWxlLmhheXN0YWNrUHRzO1xuXG4gICAgICAgICAgaWYgKGhwdHMgJiYgaHB0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGV4MSA9IGhwdHNbMF0ueDtcbiAgICAgICAgICAgIGV5MSA9IGhwdHNbMF0ueTtcbiAgICAgICAgICAgIGV4MiA9IGhwdHNbMV0ueDtcbiAgICAgICAgICAgIGV5MiA9IGhwdHNbMV0ueTtcblxuICAgICAgICAgICAgaWYgKGV4MSA+IGV4Mikge1xuICAgICAgICAgICAgICB2YXIgdGVtcCA9IGV4MTtcbiAgICAgICAgICAgICAgZXgxID0gZXgyO1xuICAgICAgICAgICAgICBleDIgPSB0ZW1wO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXkxID4gZXkyKSB7XG4gICAgICAgICAgICAgIHZhciBfdGVtcCA9IGV5MTtcbiAgICAgICAgICAgICAgZXkxID0gZXkyO1xuICAgICAgICAgICAgICBleTIgPSBfdGVtcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdXBkYXRlQm91bmRzKGJvdW5kcywgZXgxIC0gd0hhbGYsIGV5MSAtIHdIYWxmLCBleDIgKyB3SGFsZiwgZXkyICsgd0hhbGYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjdXJ2ZVN0eWxlID09PSAnYmV6aWVyJyB8fCBjdXJ2ZVN0eWxlID09PSAndW5idW5kbGVkLWJlemllcicgfHwgY3VydmVTdHlsZSA9PT0gJ3NlZ21lbnRzJyB8fCBjdXJ2ZVN0eWxlID09PSAndGF4aScpIHtcbiAgICAgICAgICB2YXIgcHRzO1xuXG4gICAgICAgICAgc3dpdGNoIChjdXJ2ZVN0eWxlKSB7XG4gICAgICAgICAgICBjYXNlICdiZXppZXInOlxuICAgICAgICAgICAgY2FzZSAndW5idW5kbGVkLWJlemllcic6XG4gICAgICAgICAgICAgIHB0cyA9IHJzdHlsZS5iZXppZXJQdHM7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdzZWdtZW50cyc6XG4gICAgICAgICAgICBjYXNlICd0YXhpJzpcbiAgICAgICAgICAgICAgcHRzID0gcnN0eWxlLmxpbmVQdHM7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwdHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwdHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgdmFyIHB0ID0gcHRzW2pdO1xuICAgICAgICAgICAgICBleDEgPSBwdC54IC0gd0hhbGY7XG4gICAgICAgICAgICAgIGV4MiA9IHB0LnggKyB3SGFsZjtcbiAgICAgICAgICAgICAgZXkxID0gcHQueSAtIHdIYWxmO1xuICAgICAgICAgICAgICBleTIgPSBwdC55ICsgd0hhbGY7XG4gICAgICAgICAgICAgIHVwZGF0ZUJvdW5kcyhib3VuZHMsIGV4MSwgZXkxLCBleDIsIGV5Mik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIGJlemllci1saWtlIG9yIHNlZ21lbnQtbGlrZSBlZGdlXG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGhlYWRsZXNzIG9yIHN0eWxlIGRpc2FibGVkXG4gICAgICAgIC8vIGZhbGxiYWNrIG9uIHNvdXJjZSBhbmQgdGFyZ2V0IHBvc2l0aW9uc1xuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgdmFyIG4xID0gZWxlLnNvdXJjZSgpO1xuICAgICAgICB2YXIgbjFwb3MgPSBuMS5wb3NpdGlvbigpO1xuICAgICAgICB2YXIgbjIgPSBlbGUudGFyZ2V0KCk7XG4gICAgICAgIHZhciBuMnBvcyA9IG4yLnBvc2l0aW9uKCk7XG4gICAgICAgIGV4MSA9IG4xcG9zLng7XG4gICAgICAgIGV4MiA9IG4ycG9zLng7XG4gICAgICAgIGV5MSA9IG4xcG9zLnk7XG4gICAgICAgIGV5MiA9IG4ycG9zLnk7XG5cbiAgICAgICAgaWYgKGV4MSA+IGV4Mikge1xuICAgICAgICAgIHZhciBfdGVtcDIgPSBleDE7XG4gICAgICAgICAgZXgxID0gZXgyO1xuICAgICAgICAgIGV4MiA9IF90ZW1wMjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleTEgPiBleTIpIHtcbiAgICAgICAgICB2YXIgX3RlbXAzID0gZXkxO1xuICAgICAgICAgIGV5MSA9IGV5MjtcbiAgICAgICAgICBleTIgPSBfdGVtcDM7XG4gICAgICAgIH0gLy8gdGFrZSBpbnRvIGFjY291bnQgZWRnZSB3aWR0aFxuXG5cbiAgICAgICAgZXgxIC09IHdIYWxmO1xuICAgICAgICBleDIgKz0gd0hhbGY7XG4gICAgICAgIGV5MSAtPSB3SGFsZjtcbiAgICAgICAgZXkyICs9IHdIYWxmO1xuICAgICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBleDEsIGV5MSwgZXgyLCBleTIpO1xuICAgICAgfSAvLyBoZWFkbGVzcyBvciBzdHlsZSBkaXNhYmxlZFxuXG4gICAgfSAvLyBlZGdlc1xuICAgIC8vIGhhbmRsZSBlZGdlIGFycm93IHNpemVcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblxuICAgIGlmIChzdHlsZUVuYWJsZWQgJiYgb3B0aW9ucy5pbmNsdWRlRWRnZXMgJiYgaXNFZGdlKSB7XG4gICAgICB1cGRhdGVCb3VuZHNGcm9tQXJyb3coYm91bmRzLCBlbGUsICdtaWQtc291cmNlJyk7XG4gICAgICB1cGRhdGVCb3VuZHNGcm9tQXJyb3coYm91bmRzLCBlbGUsICdtaWQtdGFyZ2V0Jyk7XG4gICAgICB1cGRhdGVCb3VuZHNGcm9tQXJyb3coYm91bmRzLCBlbGUsICdzb3VyY2UnKTtcbiAgICAgIHVwZGF0ZUJvdW5kc0Zyb21BcnJvdyhib3VuZHMsIGVsZSwgJ3RhcmdldCcpO1xuICAgIH0gLy8gZ2hvc3RcbiAgICAvLy8vLy8vL1xuXG5cbiAgICBpZiAoc3R5bGVFbmFibGVkKSB7XG4gICAgICB2YXIgZ2hvc3QgPSBlbGUucHN0eWxlKCdnaG9zdCcpLnZhbHVlID09PSAneWVzJztcblxuICAgICAgaWYgKGdob3N0KSB7XG4gICAgICAgIHZhciBneCA9IGVsZS5wc3R5bGUoJ2dob3N0LW9mZnNldC14JykucGZWYWx1ZTtcbiAgICAgICAgdmFyIGd5ID0gZWxlLnBzdHlsZSgnZ2hvc3Qtb2Zmc2V0LXknKS5wZlZhbHVlO1xuICAgICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBib3VuZHMueDEgKyBneCwgYm91bmRzLnkxICsgZ3ksIGJvdW5kcy54MiArIGd4LCBib3VuZHMueTIgKyBneSk7XG4gICAgICB9XG4gICAgfSAvLyBhbHdheXMgc3RvcmUgdGhlIGJvZHkgYm91bmRzIHNlcGFyYXRlbHkgZnJvbSB0aGUgbGFiZWxzXG5cblxuICAgIHZhciBiYkJvZHkgPSBfcC5ib2R5Qm91bmRzID0gX3AuYm9keUJvdW5kcyB8fCB7fTtcbiAgICBhc3NpZ25Cb3VuZGluZ0JveChiYkJvZHksIGJvdW5kcyk7XG4gICAgZXhwYW5kQm91bmRpbmdCb3hTaWRlcyhiYkJvZHksIG1hbnVhbEV4cGFuc2lvbik7XG4gICAgZXhwYW5kQm91bmRpbmdCb3goYmJCb2R5LCAxKTsgLy8gZXhwYW5kIHRvIHdvcmsgYXJvdW5kIGJyb3dzZXIgZGltZW5zaW9uIGluYWNjdXJhY2llc1xuICAgIC8vIG92ZXJsYXlcbiAgICAvLy8vLy8vLy8vXG5cbiAgICBpZiAoc3R5bGVFbmFibGVkKSB7XG4gICAgICBleDEgPSBib3VuZHMueDE7XG4gICAgICBleDIgPSBib3VuZHMueDI7XG4gICAgICBleTEgPSBib3VuZHMueTE7XG4gICAgICBleTIgPSBib3VuZHMueTI7XG4gICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBleDEgLSBwYWRkaW5nLCBleTEgLSBwYWRkaW5nLCBleDIgKyBwYWRkaW5nLCBleTIgKyBwYWRkaW5nKTtcbiAgICB9IC8vIGFsd2F5cyBzdG9yZSB0aGUgYm9keSBib3VuZHMgc2VwYXJhdGVseSBmcm9tIHRoZSBsYWJlbHNcblxuXG4gICAgdmFyIGJiT3ZlcmxheSA9IF9wLm92ZXJsYXlCb3VuZHMgPSBfcC5vdmVybGF5Qm91bmRzIHx8IHt9O1xuICAgIGFzc2lnbkJvdW5kaW5nQm94KGJiT3ZlcmxheSwgYm91bmRzKTtcbiAgICBleHBhbmRCb3VuZGluZ0JveFNpZGVzKGJiT3ZlcmxheSwgbWFudWFsRXhwYW5zaW9uKTtcbiAgICBleHBhbmRCb3VuZGluZ0JveChiYk92ZXJsYXksIDEpOyAvLyBleHBhbmQgdG8gd29yayBhcm91bmQgYnJvd3NlciBkaW1lbnNpb24gaW5hY2N1cmFjaWVzXG4gICAgLy8gaGFuZGxlIGxhYmVsIGRpbWVuc2lvbnNcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgdmFyIGJiTGFiZWxzID0gX3AubGFiZWxCb3VuZHMgPSBfcC5sYWJlbEJvdW5kcyB8fCB7fTtcblxuICAgIGlmIChiYkxhYmVscy5hbGwgIT0gbnVsbCkge1xuICAgICAgY2xlYXJCb3VuZGluZ0JveChiYkxhYmVscy5hbGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYkxhYmVscy5hbGwgPSBtYWtlQm91bmRpbmdCb3goKTtcbiAgICB9XG5cbiAgICBpZiAoc3R5bGVFbmFibGVkICYmIG9wdGlvbnMuaW5jbHVkZUxhYmVscykge1xuICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZU1haW5MYWJlbHMpIHtcbiAgICAgICAgdXBkYXRlQm91bmRzRnJvbUxhYmVsKGJvdW5kcywgZWxlLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRWRnZSkge1xuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlU291cmNlTGFiZWxzKSB7XG4gICAgICAgICAgdXBkYXRlQm91bmRzRnJvbUxhYmVsKGJvdW5kcywgZWxlLCAnc291cmNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlVGFyZ2V0TGFiZWxzKSB7XG4gICAgICAgICAgdXBkYXRlQm91bmRzRnJvbUxhYmVsKGJvdW5kcywgZWxlLCAndGFyZ2V0Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIHN0eWxlIGVuYWJsZWQgZm9yIGxhYmVsc1xuXG4gIH0gLy8gaWYgZGlzcGxheWVkXG5cblxuICBib3VuZHMueDEgPSBub25pbmYoYm91bmRzLngxKTtcbiAgYm91bmRzLnkxID0gbm9uaW5mKGJvdW5kcy55MSk7XG4gIGJvdW5kcy54MiA9IG5vbmluZihib3VuZHMueDIpO1xuICBib3VuZHMueTIgPSBub25pbmYoYm91bmRzLnkyKTtcbiAgYm91bmRzLncgPSBub25pbmYoYm91bmRzLngyIC0gYm91bmRzLngxKTtcbiAgYm91bmRzLmggPSBub25pbmYoYm91bmRzLnkyIC0gYm91bmRzLnkxKTtcblxuICBpZiAoYm91bmRzLncgPiAwICYmIGJvdW5kcy5oID4gMCAmJiBkaXNwbGF5ZWQpIHtcbiAgICBleHBhbmRCb3VuZGluZ0JveFNpZGVzKGJvdW5kcywgbWFudWFsRXhwYW5zaW9uKTsgLy8gZXhwYW5kIGJvdW5kcyBieSAxIGJlY2F1c2UgYW50aWFsaWFzaW5nIGNhbiBpbmNyZWFzZSB0aGUgdmlzdWFsL2VmZmVjdGl2ZSBzaXplIGJ5IDEgb24gYWxsIHNpZGVzXG5cbiAgICBleHBhbmRCb3VuZGluZ0JveChib3VuZHMsIDEpO1xuICB9XG5cbiAgcmV0dXJuIGJvdW5kcztcbn07XG5cbnZhciBnZXRLZXkgPSBmdW5jdGlvbiBnZXRLZXkob3B0cykge1xuICB2YXIgaSA9IDA7XG5cbiAgdmFyIHRmID0gZnVuY3Rpb24gdGYodmFsKSB7XG4gICAgcmV0dXJuICh2YWwgPyAxIDogMCkgPDwgaSsrO1xuICB9O1xuXG4gIHZhciBrZXkgPSAwO1xuICBrZXkgKz0gdGYob3B0cy5pbmN1ZGVOb2Rlcyk7XG4gIGtleSArPSB0ZihvcHRzLmluY2x1ZGVFZGdlcyk7XG4gIGtleSArPSB0ZihvcHRzLmluY2x1ZGVMYWJlbHMpO1xuICBrZXkgKz0gdGYob3B0cy5pbmNsdWRlTWFpbkxhYmVscyk7XG4gIGtleSArPSB0ZihvcHRzLmluY2x1ZGVTb3VyY2VMYWJlbHMpO1xuICBrZXkgKz0gdGYob3B0cy5pbmNsdWRlVGFyZ2V0TGFiZWxzKTtcbiAga2V5ICs9IHRmKG9wdHMuaW5jbHVkZU92ZXJsYXlzKTtcbiAgcmV0dXJuIGtleTtcbn07XG5cbnZhciBnZXRCb3VuZGluZ0JveFBvc0tleSA9IGZ1bmN0aW9uIGdldEJvdW5kaW5nQm94UG9zS2V5KGVsZSkge1xuICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgdmFyIHAxID0gZWxlLnNvdXJjZSgpLnBvc2l0aW9uKCk7XG4gICAgdmFyIHAyID0gZWxlLnRhcmdldCgpLnBvc2l0aW9uKCk7XG5cbiAgICB2YXIgciA9IGZ1bmN0aW9uIHIoeCkge1xuICAgICAgcmV0dXJuIE1hdGgucm91bmQoeCk7XG4gICAgfTtcblxuICAgIHJldHVybiBoYXNoSW50c0FycmF5KFtyKHAxLngpLCByKHAxLnkpLCByKHAyLngpLCByKHAyLnkpXSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG5cbnZhciBjYWNoZWRCb3VuZGluZ0JveEltcGwgPSBmdW5jdGlvbiBjYWNoZWRCb3VuZGluZ0JveEltcGwoZWxlLCBvcHRzKSB7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIGJiO1xuICB2YXIgaXNFZGdlID0gZWxlLmlzRWRnZSgpO1xuICB2YXIga2V5ID0gb3B0cyA9PSBudWxsID8gZGVmQmJPcHRzS2V5IDogZ2V0S2V5KG9wdHMpO1xuICB2YXIgdXNpbmdEZWZPcHRzID0ga2V5ID09PSBkZWZCYk9wdHNLZXk7XG4gIHZhciBjdXJyUG9zS2V5ID0gZ2V0Qm91bmRpbmdCb3hQb3NLZXkoZWxlKTtcbiAgdmFyIGlzUG9zS2V5U2FtZSA9IF9wLmJiQ2FjaGVQb3NLZXkgPT09IGN1cnJQb3NLZXk7XG4gIHZhciB1c2VDYWNoZSA9IG9wdHMudXNlQ2FjaGUgJiYgaXNQb3NLZXlTYW1lO1xuXG4gIHZhciBpc0RpcnR5ID0gZnVuY3Rpb24gaXNEaXJ0eShlbGUpIHtcbiAgICByZXR1cm4gZWxlLl9wcml2YXRlLmJiQ2FjaGUgPT0gbnVsbCB8fCBlbGUuX3ByaXZhdGUuc3R5bGVEaXJ0eTtcbiAgfTtcblxuICB2YXIgbmVlZFJlY2FsYyA9ICF1c2VDYWNoZSB8fCBpc0RpcnR5KGVsZSkgfHwgaXNFZGdlICYmIGlzRGlydHkoZWxlLnNvdXJjZSgpKSB8fCBpc0RpcnR5KGVsZS50YXJnZXQoKSk7XG5cbiAgaWYgKG5lZWRSZWNhbGMpIHtcbiAgICBpZiAoIWlzUG9zS2V5U2FtZSkge1xuICAgICAgZWxlLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZSh1c2VDYWNoZSk7XG4gICAgfVxuXG4gICAgYmIgPSBib3VuZGluZ0JveEltcGwoZWxlLCBkZWZCYk9wdHMpO1xuICAgIF9wLmJiQ2FjaGUgPSBiYjtcbiAgICBfcC5iYkNhY2hlUG9zS2V5ID0gY3VyclBvc0tleTtcbiAgfSBlbHNlIHtcbiAgICBiYiA9IF9wLmJiQ2FjaGU7XG4gIH0gLy8gbm90IHVzaW5nIGRlZiBvcHRzID0+IG5lZWQgdG8gYnVpbGQgdXAgYmIgZnJvbSBjb21iaW5hdGlvbiBvZiBzdWIgYmJzXG5cblxuICBpZiAoIXVzaW5nRGVmT3B0cykge1xuICAgIHZhciBpc05vZGUgPSBlbGUuaXNOb2RlKCk7XG4gICAgYmIgPSBtYWtlQm91bmRpbmdCb3goKTtcblxuICAgIGlmIChvcHRzLmluY2x1ZGVOb2RlcyAmJiBpc05vZGUgfHwgb3B0cy5pbmNsdWRlRWRnZXMgJiYgIWlzTm9kZSkge1xuICAgICAgaWYgKG9wdHMuaW5jbHVkZU92ZXJsYXlzKSB7XG4gICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21Cb3goYmIsIF9wLm92ZXJsYXlCb3VuZHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXBkYXRlQm91bmRzRnJvbUJveChiYiwgX3AuYm9keUJvdW5kcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuaW5jbHVkZUxhYmVscykge1xuICAgICAgaWYgKG9wdHMuaW5jbHVkZU1haW5MYWJlbHMgJiYgKCFpc0VkZ2UgfHwgb3B0cy5pbmNsdWRlU291cmNlTGFiZWxzICYmIG9wdHMuaW5jbHVkZVRhcmdldExhYmVscykpIHtcbiAgICAgICAgdXBkYXRlQm91bmRzRnJvbUJveChiYiwgX3AubGFiZWxCb3VuZHMuYWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcHRzLmluY2x1ZGVNYWluTGFiZWxzKSB7XG4gICAgICAgICAgdXBkYXRlQm91bmRzRnJvbUJveChiYiwgX3AubGFiZWxCb3VuZHMubWFpblJvdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0cy5pbmNsdWRlU291cmNlTGFiZWxzKSB7XG4gICAgICAgICAgdXBkYXRlQm91bmRzRnJvbUJveChiYiwgX3AubGFiZWxCb3VuZHMuc291cmNlUm90KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRzLmluY2x1ZGVUYXJnZXRMYWJlbHMpIHtcbiAgICAgICAgICB1cGRhdGVCb3VuZHNGcm9tQm94KGJiLCBfcC5sYWJlbEJvdW5kcy50YXJnZXRSb3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgYmIudyA9IGJiLngyIC0gYmIueDE7XG4gICAgYmIuaCA9IGJiLnkyIC0gYmIueTE7XG4gIH1cblxuICByZXR1cm4gYmI7XG59O1xuXG52YXIgZGVmQmJPcHRzID0ge1xuICBpbmNsdWRlTm9kZXM6IHRydWUsXG4gIGluY2x1ZGVFZGdlczogdHJ1ZSxcbiAgaW5jbHVkZUxhYmVsczogdHJ1ZSxcbiAgaW5jbHVkZU1haW5MYWJlbHM6IHRydWUsXG4gIGluY2x1ZGVTb3VyY2VMYWJlbHM6IHRydWUsXG4gIGluY2x1ZGVUYXJnZXRMYWJlbHM6IHRydWUsXG4gIGluY2x1ZGVPdmVybGF5czogdHJ1ZSxcbiAgaW5jbHVkZVVuZGVybGF5czogdHJ1ZSxcbiAgdXNlQ2FjaGU6IHRydWVcbn07XG52YXIgZGVmQmJPcHRzS2V5ID0gZ2V0S2V5KGRlZkJiT3B0cyk7XG52YXIgZmlsbGVkQmJPcHRzID0gZGVmYXVsdHMkZyhkZWZCYk9wdHMpO1xuXG5lbGVzZm4kYi5ib3VuZGluZ0JveCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBib3VuZHM7IC8vIHRoZSBtYWluIHVzZWNhc2UgaXMgZWxlLmJvdW5kaW5nQm94KCkgZm9yIGEgc2luZ2xlIGVsZW1lbnQgd2l0aCBuby9kZWYgb3B0aW9uc1xuICAvLyBzcGVjaWZpZWQgcy50LiB0aGUgY2FjaGUgaXMgdXNlZCwgc28gY2hlY2sgZm9yIHRoaXMgY2FzZSB0byBtYWtlIGl0IGZhc3RlciBieVxuICAvLyBhdm9pZGluZyB0aGUgb3ZlcmhlYWQgb2YgdGhlIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uXG5cbiAgaWYgKHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXNbMF0uX3ByaXZhdGUuYmJDYWNoZSAhPSBudWxsICYmICF0aGlzWzBdLl9wcml2YXRlLnN0eWxlRGlydHkgJiYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnVzZUNhY2hlID09PSB1bmRlZmluZWQgfHwgb3B0aW9ucy51c2VDYWNoZSA9PT0gdHJ1ZSkpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBvcHRpb25zID0gZGVmQmJPcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zID0gZmlsbGVkQmJPcHRzKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGJvdW5kcyA9IGNhY2hlZEJvdW5kaW5nQm94SW1wbCh0aGlzWzBdLCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICBib3VuZHMgPSBtYWtlQm91bmRpbmdCb3goKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCBkZWZCYk9wdHM7XG4gICAgdmFyIG9wdHMgPSBmaWxsZWRCYk9wdHMob3B0aW9ucyk7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIHZhciBjeSA9IGVsZXMuY3koKTtcbiAgICB2YXIgc3R5bGVFbmFibGVkID0gY3kuc3R5bGVFbmFibGVkKCk7XG5cbiAgICBpZiAoc3R5bGVFbmFibGVkKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgICAgdmFyIGN1cnJQb3NLZXkgPSBnZXRCb3VuZGluZ0JveFBvc0tleShlbGUpO1xuICAgICAgICB2YXIgaXNQb3NLZXlTYW1lID0gX3AuYmJDYWNoZVBvc0tleSA9PT0gY3VyclBvc0tleTtcbiAgICAgICAgdmFyIHVzZUNhY2hlID0gb3B0cy51c2VDYWNoZSAmJiBpc1Bvc0tleVNhbWUgJiYgIV9wLnN0eWxlRGlydHk7XG4gICAgICAgIGVsZS5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUodXNlQ2FjaGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQ29tcG91bmRCb3VuZHMoIW9wdGlvbnMudXNlQ2FjaGUpO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGVsZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2VsZSA9IGVsZXNbX2ldO1xuICAgICAgdXBkYXRlQm91bmRzRnJvbUJveChib3VuZHMsIGNhY2hlZEJvdW5kaW5nQm94SW1wbChfZWxlLCBvcHRzKSk7XG4gICAgfVxuICB9XG5cbiAgYm91bmRzLngxID0gbm9uaW5mKGJvdW5kcy54MSk7XG4gIGJvdW5kcy55MSA9IG5vbmluZihib3VuZHMueTEpO1xuICBib3VuZHMueDIgPSBub25pbmYoYm91bmRzLngyKTtcbiAgYm91bmRzLnkyID0gbm9uaW5mKGJvdW5kcy55Mik7XG4gIGJvdW5kcy53ID0gbm9uaW5mKGJvdW5kcy54MiAtIGJvdW5kcy54MSk7XG4gIGJvdW5kcy5oID0gbm9uaW5mKGJvdW5kcy55MiAtIGJvdW5kcy55MSk7XG4gIHJldHVybiBib3VuZHM7XG59O1xuXG5lbGVzZm4kYi5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUgPSBmdW5jdGlvbiAoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBfcCA9IHRoaXNbaV0uX3ByaXZhdGU7XG4gICAgX3AuYmJDYWNoZSA9IG51bGw7XG4gICAgX3AuYmJDYWNoZVBvc0tleSA9IG51bGw7XG4gICAgX3AuYm9keUJvdW5kcyA9IG51bGw7XG4gICAgX3Aub3ZlcmxheUJvdW5kcyA9IG51bGw7XG4gICAgX3AubGFiZWxCb3VuZHMuYWxsID0gbnVsbDtcbiAgICBfcC5sYWJlbEJvdW5kcy5zb3VyY2UgPSBudWxsO1xuICAgIF9wLmxhYmVsQm91bmRzLnRhcmdldCA9IG51bGw7XG4gICAgX3AubGFiZWxCb3VuZHMubWFpbiA9IG51bGw7XG4gICAgX3AubGFiZWxCb3VuZHMuc291cmNlUm90ID0gbnVsbDtcbiAgICBfcC5sYWJlbEJvdW5kcy50YXJnZXRSb3QgPSBudWxsO1xuICAgIF9wLmxhYmVsQm91bmRzLm1haW5Sb3QgPSBudWxsO1xuICAgIF9wLmFycm93Qm91bmRzLnNvdXJjZSA9IG51bGw7XG4gICAgX3AuYXJyb3dCb3VuZHMudGFyZ2V0ID0gbnVsbDtcbiAgICBfcC5hcnJvd0JvdW5kc1snbWlkLXNvdXJjZSddID0gbnVsbDtcbiAgICBfcC5hcnJvd0JvdW5kc1snbWlkLXRhcmdldCddID0gbnVsbDtcbiAgfVxuXG4gIHRoaXMuZW1pdEFuZE5vdGlmeSgnYm91bmRzJyk7XG4gIHJldHVybiB0aGlzO1xufTsgLy8gcHJpdmF0ZSBoZWxwZXIgdG8gZ2V0IGJvdW5kaW5nIGJveCBmb3IgY3VzdG9tIG5vZGUgcG9zaXRpb25zXG4vLyAtIGdvb2QgZm9yIHBlcmYgaW4gY2VydGFpbiBjYXNlcyBidXQgY3VycmVudGx5IHJlcXVpcmVzIGRpcnR5aW5nIHRoZSByZW5kZXJlZCBzdHlsZVxuLy8gLSB3b3VsZCBiZSBiZXR0ZXIgdG8gbm90IG1vZGlmeSB0aGUgbm9kZXMgYnV0IHRoZSBub2RlcyBhcmUgcmVhZCBkaXJlY3RseSBldmVyeXdoZXJlIGluIHRoZSByZW5kZXJlci4uLlxuLy8gLSB0cnkgdG8gdXNlIGZvciBvbmx5IHRoaW5ncyBsaWtlIGRpc2NyZXRlIGxheW91dHMgd2hlcmUgdGhlIG5vZGUgcG9zaXRpb24gd291bGQgY2hhbmdlIGFueXdheVxuXG5cbmVsZXNmbiRiLmJvdW5kaW5nQm94QXQgPSBmdW5jdGlvbiAoZm4pIHtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gIHZhciBoYXNDb21wb3VuZE5vZGVzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICB2YXIgcGFyZW50cyA9IGN5LmNvbGxlY3Rpb24oKTtcblxuICBpZiAoaGFzQ29tcG91bmROb2Rlcykge1xuICAgIHBhcmVudHMgPSBub2Rlcy5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHJldHVybiBub2RlLmlzUGFyZW50KCk7XG4gICAgfSk7XG4gICAgbm9kZXMgPSBub2Rlcy5ub3QocGFyZW50cyk7XG4gIH1cblxuICBpZiAocGxhaW5PYmplY3QoZm4pKSB7XG4gICAgdmFyIG9iaiA9IGZuO1xuXG4gICAgZm4gPSBmdW5jdGlvbiBmbigpIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBzdG9yZU9sZFBvcyA9IGZ1bmN0aW9uIHN0b3JlT2xkUG9zKG5vZGUsIGkpIHtcbiAgICByZXR1cm4gbm9kZS5fcHJpdmF0ZS5iYkF0T2xkUG9zID0gZm4obm9kZSwgaSk7XG4gIH07XG5cbiAgdmFyIGdldE9sZFBvcyA9IGZ1bmN0aW9uIGdldE9sZFBvcyhub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuX3ByaXZhdGUuYmJBdE9sZFBvcztcbiAgfTtcblxuICBjeS5zdGFydEJhdGNoKCk7XG4gIG5vZGVzLmZvckVhY2goc3RvcmVPbGRQb3MpLnNpbGVudFBvc2l0aW9ucyhmbik7XG5cbiAgaWYgKGhhc0NvbXBvdW5kTm9kZXMpIHtcbiAgICBwYXJlbnRzLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpO1xuICAgIHBhcmVudHMuZGlydHlCb3VuZGluZ0JveENhY2hlKCk7XG4gICAgcGFyZW50cy51cGRhdGVDb21wb3VuZEJvdW5kcyh0cnVlKTsgLy8gZm9yY2UgdXBkYXRlIGIvYyB3ZSdyZSBpbnNpZGUgYSBiYXRjaCBjeWNsZVxuICB9XG5cbiAgdmFyIGJiID0gY29weUJvdW5kaW5nQm94KHRoaXMuYm91bmRpbmdCb3goe1xuICAgIHVzZUNhY2hlOiBmYWxzZVxuICB9KSk7XG4gIG5vZGVzLnNpbGVudFBvc2l0aW9ucyhnZXRPbGRQb3MpO1xuXG4gIGlmIChoYXNDb21wb3VuZE5vZGVzKSB7XG4gICAgcGFyZW50cy5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUoKTtcbiAgICBwYXJlbnRzLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpO1xuICAgIHBhcmVudHMudXBkYXRlQ29tcG91bmRCb3VuZHModHJ1ZSk7IC8vIGZvcmNlIHVwZGF0ZSBiL2Mgd2UncmUgaW5zaWRlIGEgYmF0Y2ggY3ljbGVcbiAgfVxuXG4gIGN5LmVuZEJhdGNoKCk7XG4gIHJldHVybiBiYjtcbn07XG5cbmZuJDMuYm91bmRpbmdib3ggPSBmbiQzLmJiID0gZm4kMy5ib3VuZGluZ0JveDtcbmZuJDMucmVuZGVyZWRCb3VuZGluZ2JveCA9IGZuJDMucmVuZGVyZWRCb3VuZGluZ0JveDtcbnZhciBib3VuZHMgPSBlbGVzZm4kYjtcblxudmFyIGZuJDIsIGVsZXNmbiRhO1xuZm4kMiA9IGVsZXNmbiRhID0ge307XG5cbnZhciBkZWZpbmVEaW1GbnMgPSBmdW5jdGlvbiBkZWZpbmVEaW1GbnMob3B0cykge1xuICBvcHRzLnVwcGVyY2FzZU5hbWUgPSBjYXBpdGFsaXplKG9wdHMubmFtZSk7XG4gIG9wdHMuYXV0b05hbWUgPSAnYXV0bycgKyBvcHRzLnVwcGVyY2FzZU5hbWU7XG4gIG9wdHMubGFiZWxOYW1lID0gJ2xhYmVsJyArIG9wdHMudXBwZXJjYXNlTmFtZTtcbiAgb3B0cy5vdXRlck5hbWUgPSAnb3V0ZXInICsgb3B0cy51cHBlcmNhc2VOYW1lO1xuICBvcHRzLnVwcGVyY2FzZU91dGVyTmFtZSA9IGNhcGl0YWxpemUob3B0cy5vdXRlck5hbWUpO1xuXG4gIGZuJDJbb3B0cy5uYW1lXSA9IGZ1bmN0aW9uIGRpbUltcGwoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgIHZhciBjeSA9IF9wLmN5O1xuICAgIHZhciBzdHlsZUVuYWJsZWQgPSBjeS5fcHJpdmF0ZS5zdHlsZUVuYWJsZWQ7XG5cbiAgICBpZiAoZWxlKSB7XG4gICAgICBpZiAoc3R5bGVFbmFibGVkKSB7XG4gICAgICAgIGlmIChlbGUuaXNQYXJlbnQoKSkge1xuICAgICAgICAgIGVsZS51cGRhdGVDb21wb3VuZEJvdW5kcygpO1xuICAgICAgICAgIHJldHVybiBfcFtvcHRzLmF1dG9OYW1lXSB8fCAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGQgPSBlbGUucHN0eWxlKG9wdHMubmFtZSk7XG5cbiAgICAgICAgc3dpdGNoIChkLnN0clZhbHVlKSB7XG4gICAgICAgICAgY2FzZSAnbGFiZWwnOlxuICAgICAgICAgICAgZWxlLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZSgpO1xuICAgICAgICAgICAgcmV0dXJuIF9wLnJzdHlsZVtvcHRzLmxhYmVsTmFtZV0gfHwgMDtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZC5wZlZhbHVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgZm4kMlsnb3V0ZXInICsgb3B0cy51cHBlcmNhc2VOYW1lXSA9IGZ1bmN0aW9uIG91dGVyRGltSW1wbCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgdmFyIGN5ID0gX3AuY3k7XG4gICAgdmFyIHN0eWxlRW5hYmxlZCA9IGN5Ll9wcml2YXRlLnN0eWxlRW5hYmxlZDtcblxuICAgIGlmIChlbGUpIHtcbiAgICAgIGlmIChzdHlsZUVuYWJsZWQpIHtcbiAgICAgICAgdmFyIGRpbSA9IGVsZVtvcHRzLm5hbWVdKCk7XG4gICAgICAgIHZhciBib3JkZXIgPSBlbGUucHN0eWxlKCdib3JkZXItd2lkdGgnKS5wZlZhbHVlOyAvLyBuLmIuIDEvMiBlYWNoIHNpZGVcblxuICAgICAgICB2YXIgcGFkZGluZyA9IDIgKiBlbGUucGFkZGluZygpO1xuICAgICAgICByZXR1cm4gZGltICsgYm9yZGVyICsgcGFkZGluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBmbiQyWydyZW5kZXJlZCcgKyBvcHRzLnVwcGVyY2FzZU5hbWVdID0gZnVuY3Rpb24gcmVuZGVyZWREaW1JbXBsKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuXG4gICAgaWYgKGVsZSkge1xuICAgICAgdmFyIGQgPSBlbGVbb3B0cy5uYW1lXSgpO1xuICAgICAgcmV0dXJuIGQgKiB0aGlzLmN5KCkuem9vbSgpO1xuICAgIH1cbiAgfTtcblxuICBmbiQyWydyZW5kZXJlZCcgKyBvcHRzLnVwcGVyY2FzZU91dGVyTmFtZV0gPSBmdW5jdGlvbiByZW5kZXJlZE91dGVyRGltSW1wbCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcblxuICAgIGlmIChlbGUpIHtcbiAgICAgIHZhciBvZCA9IGVsZVtvcHRzLm91dGVyTmFtZV0oKTtcbiAgICAgIHJldHVybiBvZCAqIHRoaXMuY3koKS56b29tKCk7XG4gICAgfVxuICB9O1xufTtcblxuZGVmaW5lRGltRm5zKHtcbiAgbmFtZTogJ3dpZHRoJ1xufSk7XG5kZWZpbmVEaW1GbnMoe1xuICBuYW1lOiAnaGVpZ2h0J1xufSk7XG5cbmVsZXNmbiRhLnBhZGRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG5cbiAgaWYgKGVsZS5pc1BhcmVudCgpKSB7XG4gICAgZWxlLnVwZGF0ZUNvbXBvdW5kQm91bmRzKCk7XG5cbiAgICBpZiAoX3AuYXV0b1BhZGRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIF9wLmF1dG9QYWRkaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWxlLnBzdHlsZSgncGFkZGluZycpLnBmVmFsdWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBlbGUucHN0eWxlKCdwYWRkaW5nJykucGZWYWx1ZTtcbiAgfVxufTtcblxuZWxlc2ZuJGEucGFkZGVkSGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgcmV0dXJuIGVsZS5oZWlnaHQoKSArIDIgKiBlbGUucGFkZGluZygpO1xufTtcblxuZWxlc2ZuJGEucGFkZGVkV2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICByZXR1cm4gZWxlLndpZHRoKCkgKyAyICogZWxlLnBhZGRpbmcoKTtcbn07XG5cbnZhciB3aWR0aEhlaWdodCA9IGVsZXNmbiRhO1xuXG52YXIgaWZFZGdlID0gZnVuY3Rpb24gaWZFZGdlKGVsZSwgZ2V0VmFsdWUpIHtcbiAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgIHJldHVybiBnZXRWYWx1ZShlbGUpO1xuICB9XG59O1xuXG52YXIgaWZFZGdlUmVuZGVyZWRQb3NpdGlvbiA9IGZ1bmN0aW9uIGlmRWRnZVJlbmRlcmVkUG9zaXRpb24oZWxlLCBnZXRQb2ludCkge1xuICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgdmFyIGN5ID0gZWxlLmN5KCk7XG4gICAgcmV0dXJuIG1vZGVsVG9SZW5kZXJlZFBvc2l0aW9uKGdldFBvaW50KGVsZSksIGN5Lnpvb20oKSwgY3kucGFuKCkpO1xuICB9XG59O1xuXG52YXIgaWZFZGdlUmVuZGVyZWRQb3NpdGlvbnMgPSBmdW5jdGlvbiBpZkVkZ2VSZW5kZXJlZFBvc2l0aW9ucyhlbGUsIGdldFBvaW50cykge1xuICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgdmFyIGN5ID0gZWxlLmN5KCk7XG4gICAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgIHJldHVybiBnZXRQb2ludHMoZWxlKS5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICAgIHJldHVybiBtb2RlbFRvUmVuZGVyZWRQb3NpdGlvbihwLCB6b29tLCBwYW4pO1xuICAgIH0pO1xuICB9XG59O1xuXG52YXIgY29udHJvbFBvaW50cyA9IGZ1bmN0aW9uIGNvbnRyb2xQb2ludHMoZWxlKSB7XG4gIHJldHVybiBlbGUucmVuZGVyZXIoKS5nZXRDb250cm9sUG9pbnRzKGVsZSk7XG59O1xuXG52YXIgc2VnbWVudFBvaW50cyA9IGZ1bmN0aW9uIHNlZ21lbnRQb2ludHMoZWxlKSB7XG4gIHJldHVybiBlbGUucmVuZGVyZXIoKS5nZXRTZWdtZW50UG9pbnRzKGVsZSk7XG59O1xuXG52YXIgc291cmNlRW5kcG9pbnQgPSBmdW5jdGlvbiBzb3VyY2VFbmRwb2ludChlbGUpIHtcbiAgcmV0dXJuIGVsZS5yZW5kZXJlcigpLmdldFNvdXJjZUVuZHBvaW50KGVsZSk7XG59O1xuXG52YXIgdGFyZ2V0RW5kcG9pbnQgPSBmdW5jdGlvbiB0YXJnZXRFbmRwb2ludChlbGUpIHtcbiAgcmV0dXJuIGVsZS5yZW5kZXJlcigpLmdldFRhcmdldEVuZHBvaW50KGVsZSk7XG59O1xuXG52YXIgbWlkcG9pbnQgPSBmdW5jdGlvbiBtaWRwb2ludChlbGUpIHtcbiAgcmV0dXJuIGVsZS5yZW5kZXJlcigpLmdldEVkZ2VNaWRwb2ludChlbGUpO1xufTtcblxudmFyIHB0cyA9IHtcbiAgY29udHJvbFBvaW50czoge1xuICAgIGdldDogY29udHJvbFBvaW50cyxcbiAgICBtdWx0OiB0cnVlXG4gIH0sXG4gIHNlZ21lbnRQb2ludHM6IHtcbiAgICBnZXQ6IHNlZ21lbnRQb2ludHMsXG4gICAgbXVsdDogdHJ1ZVxuICB9LFxuICBzb3VyY2VFbmRwb2ludDoge1xuICAgIGdldDogc291cmNlRW5kcG9pbnRcbiAgfSxcbiAgdGFyZ2V0RW5kcG9pbnQ6IHtcbiAgICBnZXQ6IHRhcmdldEVuZHBvaW50XG4gIH0sXG4gIG1pZHBvaW50OiB7XG4gICAgZ2V0OiBtaWRwb2ludFxuICB9XG59O1xuXG52YXIgcmVuZGVyZWROYW1lID0gZnVuY3Rpb24gcmVuZGVyZWROYW1lKG5hbWUpIHtcbiAgcmV0dXJuICdyZW5kZXJlZCcgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnN1YnN0cigxKTtcbn07XG5cbnZhciBlZGdlUG9pbnRzID0gT2JqZWN0LmtleXMocHRzKS5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwgbmFtZSkge1xuICB2YXIgc3BlYyA9IHB0c1tuYW1lXTtcbiAgdmFyIHJOYW1lID0gcmVuZGVyZWROYW1lKG5hbWUpO1xuXG4gIG9ialtuYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaWZFZGdlKHRoaXMsIHNwZWMuZ2V0KTtcbiAgfTtcblxuICBpZiAoc3BlYy5tdWx0KSB7XG4gICAgb2JqW3JOYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBpZkVkZ2VSZW5kZXJlZFBvc2l0aW9ucyh0aGlzLCBzcGVjLmdldCk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBvYmpbck5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGlmRWRnZVJlbmRlcmVkUG9zaXRpb24odGhpcywgc3BlYy5nZXQpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gb2JqO1xufSwge30pO1xuXG52YXIgZGltZW5zaW9ucyA9IGV4dGVuZCh7fSwgcG9zaXRpb24sIGJvdW5kcywgd2lkdGhIZWlnaHQsIGVkZ2VQb2ludHMpO1xuXG4vKiFcbkV2ZW50IG9iamVjdCBiYXNlZCBvbiBqUXVlcnkgZXZlbnRzLCBNSVQgbGljZW5zZVxuXG5odHRwczovL2pxdWVyeS5vcmcvbGljZW5zZS9cbmh0dHBzOi8vdGxkcmxlZ2FsLmNvbS9saWNlbnNlL21pdC1saWNlbnNlXG5odHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9ibG9iL21hc3Rlci9zcmMvZXZlbnQuanNcbiovXG52YXIgRXZlbnQgPSBmdW5jdGlvbiBFdmVudChzcmMsIHByb3BzKSB7XG4gIHRoaXMucmVjeWNsZShzcmMsIHByb3BzKTtcbn07XG5cbmZ1bmN0aW9uIHJldHVybkZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG4gIHJldHVybiB0cnVlO1xufSAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWxcblxuXG5FdmVudC5wcm90b3R5cGUgPSB7XG4gIGluc3RhbmNlU3RyaW5nOiBmdW5jdGlvbiBpbnN0YW5jZVN0cmluZygpIHtcbiAgICByZXR1cm4gJ2V2ZW50JztcbiAgfSxcbiAgcmVjeWNsZTogZnVuY3Rpb24gcmVjeWNsZShzcmMsIHByb3BzKSB7XG4gICAgdGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVybkZhbHNlO1xuXG4gICAgaWYgKHNyYyAhPSBudWxsICYmIHNyYy5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgLy8gQnJvd3NlciBFdmVudCBvYmplY3RcbiAgICAgIHRoaXMudHlwZSA9IHNyYy50eXBlOyAvLyBFdmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHByZXZlbnRlZFxuICAgICAgLy8gYnkgYSBoYW5kbGVyIGxvd2VyIGRvd24gdGhlIHRyZWU7IHJlZmxlY3QgdGhlIGNvcnJlY3QgdmFsdWUuXG5cbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgPyByZXR1cm5UcnVlIDogcmV0dXJuRmFsc2U7XG4gICAgfSBlbHNlIGlmIChzcmMgIT0gbnVsbCAmJiBzcmMudHlwZSkge1xuICAgICAgLy8gUGxhaW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIGV2ZW50IGRldGFpbHNcbiAgICAgIHByb3BzID0gc3JjO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFdmVudCBzdHJpbmdcbiAgICAgIHRoaXMudHlwZSA9IHNyYztcbiAgICB9IC8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0XG5cblxuICAgIGlmIChwcm9wcyAhPSBudWxsKSB7XG4gICAgICAvLyBtb3JlIGVmZmljaWVudCB0byBtYW51YWxseSBjb3B5IGZpZWxkcyB3ZSB1c2VcbiAgICAgIHRoaXMub3JpZ2luYWxFdmVudCA9IHByb3BzLm9yaWdpbmFsRXZlbnQ7XG4gICAgICB0aGlzLnR5cGUgPSBwcm9wcy50eXBlICE9IG51bGwgPyBwcm9wcy50eXBlIDogdGhpcy50eXBlO1xuICAgICAgdGhpcy5jeSA9IHByb3BzLmN5O1xuICAgICAgdGhpcy50YXJnZXQgPSBwcm9wcy50YXJnZXQ7XG4gICAgICB0aGlzLnBvc2l0aW9uID0gcHJvcHMucG9zaXRpb247XG4gICAgICB0aGlzLnJlbmRlcmVkUG9zaXRpb24gPSBwcm9wcy5yZW5kZXJlZFBvc2l0aW9uO1xuICAgICAgdGhpcy5uYW1lc3BhY2UgPSBwcm9wcy5uYW1lc3BhY2U7XG4gICAgICB0aGlzLmxheW91dCA9IHByb3BzLmxheW91dDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jeSAhPSBudWxsICYmIHRoaXMucG9zaXRpb24gIT0gbnVsbCAmJiB0aGlzLnJlbmRlcmVkUG9zaXRpb24gPT0gbnVsbCkge1xuICAgICAgLy8gY3JlYXRlIGEgcmVuZGVyZWQgcG9zaXRpb24gYmFzZWQgb24gdGhlIHBhc3NlZCBwb3NpdGlvblxuICAgICAgdmFyIHBvcyA9IHRoaXMucG9zaXRpb247XG4gICAgICB2YXIgem9vbSA9IHRoaXMuY3kuem9vbSgpO1xuICAgICAgdmFyIHBhbiA9IHRoaXMuY3kucGFuKCk7XG4gICAgICB0aGlzLnJlbmRlcmVkUG9zaXRpb24gPSB7XG4gICAgICAgIHg6IHBvcy54ICogem9vbSArIHBhbi54LFxuICAgICAgICB5OiBwb3MueSAqIHpvb20gKyBwYW4ueVxuICAgICAgfTtcbiAgICB9IC8vIENyZWF0ZSBhIHRpbWVzdGFtcCBpZiBpbmNvbWluZyBldmVudCBkb2Vzbid0IGhhdmUgb25lXG5cblxuICAgIHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTtcbiAgfSxcbiAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uIHByZXZlbnREZWZhdWx0KCkge1xuICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTtcbiAgICB2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuICAgIGlmICghZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gaWYgcHJldmVudERlZmF1bHQgZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnRcblxuXG4gICAgaWYgKGUucHJldmVudERlZmF1bHQpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH0sXG4gIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKCkge1xuICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuICAgIHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG4gICAgaWYgKCFlKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBpZiBzdG9wUHJvcGFnYXRpb24gZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnRcblxuXG4gICAgaWYgKGUuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgfSxcbiAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbiBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSB7XG4gICAgdGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG4gICAgdGhpcy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfSxcbiAgaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSxcbiAgaXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuICBpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2Vcbn07XG5cbnZhciBldmVudFJlZ2V4ID0gL14oW14uXSspKFxcLig/OlteLl0rKSk/JC87IC8vIHJlZ2V4IGZvciBtYXRjaGluZyBldmVudCBzdHJpbmdzIChlLmcuIFwiY2xpY2submFtZXNwYWNlXCIpXG5cbnZhciB1bml2ZXJzYWxOYW1lc3BhY2UgPSAnLionOyAvLyBtYXRjaGVzIGFzIGlmIG5vIG5hbWVzcGFjZSBzcGVjaWZpZWQgYW5kIHByZXZlbnRzIHVzZXJzIGZyb20gdW5iaW5kaW5nIGFjY2lkZW50YWxseVxuXG52YXIgZGVmYXVsdHMkOCA9IHtcbiAgcXVhbGlmaWVyQ29tcGFyZTogZnVuY3Rpb24gcXVhbGlmaWVyQ29tcGFyZShxMSwgcTIpIHtcbiAgICByZXR1cm4gcTEgPT09IHEyO1xuICB9LFxuICBldmVudE1hdGNoZXM6IGZ1bmN0aW9uXG4gICAgLypjb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmoqL1xuICBldmVudE1hdGNoZXMoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGFkZEV2ZW50RmllbGRzOiBmdW5jdGlvblxuICAgIC8qY29udGV4dCwgZXZ0Ki9cbiAgYWRkRXZlbnRGaWVsZHMoKSB7fSxcbiAgY2FsbGJhY2tDb250ZXh0OiBmdW5jdGlvbiBjYWxsYmFja0NvbnRleHQoY29udGV4dFxuICAvKiwgbGlzdGVuZXIsIGV2ZW50T2JqKi9cbiAgKSB7XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH0sXG4gIGJlZm9yZUVtaXQ6IGZ1bmN0aW9uXG4gICAgLyogY29udGV4dCwgbGlzdGVuZXIsIGV2ZW50T2JqICovXG4gIGJlZm9yZUVtaXQoKSB7fSxcbiAgYWZ0ZXJFbWl0OiBmdW5jdGlvblxuICAgIC8qIGNvbnRleHQsIGxpc3RlbmVyLCBldmVudE9iaiAqL1xuICBhZnRlckVtaXQoKSB7fSxcbiAgYnViYmxlOiBmdW5jdGlvblxuICAgIC8qY29udGV4dCovXG4gIGJ1YmJsZSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIHBhcmVudDogZnVuY3Rpb25cbiAgICAvKmNvbnRleHQqL1xuICBwYXJlbnQoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG4gIGNvbnRleHQ6IG51bGxcbn07XG52YXIgZGVmYXVsdHNLZXlzID0gT2JqZWN0LmtleXMoZGVmYXVsdHMkOCk7XG52YXIgZW1wdHlPcHRzID0ge307XG5cbmZ1bmN0aW9uIEVtaXR0ZXIoKSB7XG4gIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBlbXB0eU9wdHM7XG4gIHZhciBjb250ZXh0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG5cbiAgLy8gbWljcm8tb3B0aW1pc2F0aW9uIHZzIE9iamVjdC5hc3NpZ24oKSAtLSByZWR1Y2VzIEVsZW1lbnQgaW5zdGFudGlhdGlvbiB0aW1lXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGVmYXVsdHNLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGRlZmF1bHRzS2V5c1tpXTtcbiAgICB0aGlzW2tleV0gPSBvcHRzW2tleV0gfHwgZGVmYXVsdHMkOFtrZXldO1xuICB9XG5cbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dCB8fCB0aGlzLmNvbnRleHQ7XG4gIHRoaXMubGlzdGVuZXJzID0gW107XG4gIHRoaXMuZW1pdHRpbmcgPSAwO1xufVxuXG52YXIgcCA9IEVtaXR0ZXIucHJvdG90eXBlO1xuXG52YXIgZm9yRWFjaEV2ZW50ID0gZnVuY3Rpb24gZm9yRWFjaEV2ZW50KHNlbGYsIGhhbmRsZXIsIGV2ZW50cywgcXVhbGlmaWVyLCBjYWxsYmFjaywgY29uZiwgY29uZk92ZXJyaWRlcykge1xuICBpZiAoZm4kNihxdWFsaWZpZXIpKSB7XG4gICAgY2FsbGJhY2sgPSBxdWFsaWZpZXI7XG4gICAgcXVhbGlmaWVyID0gbnVsbDtcbiAgfVxuXG4gIGlmIChjb25mT3ZlcnJpZGVzKSB7XG4gICAgaWYgKGNvbmYgPT0gbnVsbCkge1xuICAgICAgY29uZiA9IGNvbmZPdmVycmlkZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmYgPSBleHRlbmQoe30sIGNvbmYsIGNvbmZPdmVycmlkZXMpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBldmVudExpc3QgPSBhcnJheShldmVudHMpID8gZXZlbnRzIDogZXZlbnRzLnNwbGl0KC9cXHMrLyk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZXZ0ID0gZXZlbnRMaXN0W2ldO1xuXG4gICAgaWYgKGVtcHR5U3RyaW5nKGV2dCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBtYXRjaCA9IGV2dC5tYXRjaChldmVudFJlZ2V4KTsgLy8gdHlwZVsubmFtZXNwYWNlXVxuXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICB2YXIgdHlwZSA9IG1hdGNoWzFdO1xuICAgICAgdmFyIG5hbWVzcGFjZSA9IG1hdGNoWzJdID8gbWF0Y2hbMl0gOiBudWxsO1xuICAgICAgdmFyIHJldCA9IGhhbmRsZXIoc2VsZiwgZXZ0LCB0eXBlLCBuYW1lc3BhY2UsIHF1YWxpZmllciwgY2FsbGJhY2ssIGNvbmYpO1xuXG4gICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gYWxsb3cgZXhpdGluZyBlYXJseVxuXG4gICAgfVxuICB9XG59O1xuXG52YXIgbWFrZUV2ZW50T2JqID0gZnVuY3Rpb24gbWFrZUV2ZW50T2JqKHNlbGYsIG9iaikge1xuICBzZWxmLmFkZEV2ZW50RmllbGRzKHNlbGYuY29udGV4dCwgb2JqKTtcbiAgcmV0dXJuIG5ldyBFdmVudChvYmoudHlwZSwgb2JqKTtcbn07XG5cbnZhciBmb3JFYWNoRXZlbnRPYmogPSBmdW5jdGlvbiBmb3JFYWNoRXZlbnRPYmooc2VsZiwgaGFuZGxlciwgZXZlbnRzKSB7XG4gIGlmIChldmVudChldmVudHMpKSB7XG4gICAgaGFuZGxlcihzZWxmLCBldmVudHMpO1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmIChwbGFpbk9iamVjdChldmVudHMpKSB7XG4gICAgaGFuZGxlcihzZWxmLCBtYWtlRXZlbnRPYmooc2VsZiwgZXZlbnRzKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGV2ZW50TGlzdCA9IGFycmF5KGV2ZW50cykgPyBldmVudHMgOiBldmVudHMuc3BsaXQoL1xccysvKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50TGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBldnQgPSBldmVudExpc3RbaV07XG5cbiAgICBpZiAoZW1wdHlTdHJpbmcoZXZ0KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIG1hdGNoID0gZXZ0Lm1hdGNoKGV2ZW50UmVnZXgpOyAvLyB0eXBlWy5uYW1lc3BhY2VdXG5cbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHZhciB0eXBlID0gbWF0Y2hbMV07XG4gICAgICB2YXIgbmFtZXNwYWNlID0gbWF0Y2hbMl0gPyBtYXRjaFsyXSA6IG51bGw7XG4gICAgICB2YXIgZXZlbnRPYmogPSBtYWtlRXZlbnRPYmooc2VsZiwge1xuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSxcbiAgICAgICAgdGFyZ2V0OiBzZWxmLmNvbnRleHRcbiAgICAgIH0pO1xuICAgICAgaGFuZGxlcihzZWxmLCBldmVudE9iaik7XG4gICAgfVxuICB9XG59O1xuXG5wLm9uID0gcC5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudHMsIHF1YWxpZmllciwgY2FsbGJhY2ssIGNvbmYsIGNvbmZPdmVycmlkZXMpIHtcbiAgZm9yRWFjaEV2ZW50KHRoaXMsIGZ1bmN0aW9uIChzZWxmLCBldmVudCwgdHlwZSwgbmFtZXNwYWNlLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mKSB7XG4gICAgaWYgKGZuJDYoY2FsbGJhY2spKSB7XG4gICAgICBzZWxmLmxpc3RlbmVycy5wdXNoKHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICAvLyBmdWxsIGV2ZW50IHN0cmluZ1xuICAgICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICAgIC8vIGNhbGxiYWNrIHRvIHJ1blxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAvLyB0aGUgZXZlbnQgdHlwZSAoZS5nLiAnY2xpY2snKVxuICAgICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSxcbiAgICAgICAgLy8gdGhlIGV2ZW50IG5hbWVzcGFjZSAoZS5nLiBcIi5mb29cIilcbiAgICAgICAgcXVhbGlmaWVyOiBxdWFsaWZpZXIsXG4gICAgICAgIC8vIGEgcmVzdHJpY3Rpb24gb24gd2hldGhlciB0byBtYXRjaCB0aGlzIGVtaXR0ZXJcbiAgICAgICAgY29uZjogY29uZiAvLyBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25cblxuICAgICAgfSk7XG4gICAgfVxuICB9LCBldmVudHMsIHF1YWxpZmllciwgY2FsbGJhY2ssIGNvbmYsIGNvbmZPdmVycmlkZXMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnAub25lID0gZnVuY3Rpb24gKGV2ZW50cywgcXVhbGlmaWVyLCBjYWxsYmFjaywgY29uZikge1xuICByZXR1cm4gdGhpcy5vbihldmVudHMsIHF1YWxpZmllciwgY2FsbGJhY2ssIGNvbmYsIHtcbiAgICBvbmU6IHRydWVcbiAgfSk7XG59O1xuXG5wLnJlbW92ZUxpc3RlbmVyID0gcC5vZmYgPSBmdW5jdGlvbiAoZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgaWYgKHRoaXMuZW1pdHRpbmcgIT09IDApIHtcbiAgICB0aGlzLmxpc3RlbmVycyA9IGNvcHlBcnJheSh0aGlzLmxpc3RlbmVycyk7XG4gIH1cblxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnM7XG5cbiAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoaSkge1xuICAgIHZhciBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTtcbiAgICBmb3JFYWNoRXZlbnQoX3RoaXMsIGZ1bmN0aW9uIChzZWxmLCBldmVudCwgdHlwZSwgbmFtZXNwYWNlLCBxdWFsaWZpZXIsIGNhbGxiYWNrXG4gICAgLyosIGNvbmYqL1xuICAgICkge1xuICAgICAgaWYgKChsaXN0ZW5lci50eXBlID09PSB0eXBlIHx8IGV2ZW50cyA9PT0gJyonKSAmJiAoIW5hbWVzcGFjZSAmJiBsaXN0ZW5lci5uYW1lc3BhY2UgIT09ICcuKicgfHwgbGlzdGVuZXIubmFtZXNwYWNlID09PSBuYW1lc3BhY2UpICYmICghcXVhbGlmaWVyIHx8IHNlbGYucXVhbGlmaWVyQ29tcGFyZShsaXN0ZW5lci5xdWFsaWZpZXIsIHF1YWxpZmllcikpICYmICghY2FsbGJhY2sgfHwgbGlzdGVuZXIuY2FsbGJhY2sgPT09IGNhbGxiYWNrKSkge1xuICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSwgZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mKTtcbiAgfTtcblxuICBmb3IgKHZhciBpID0gbGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgX2xvb3AoaSk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbnAucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZW1vdmVMaXN0ZW5lcignKicpO1xufTtcblxucC5lbWl0ID0gcC50cmlnZ2VyID0gZnVuY3Rpb24gKGV2ZW50cywgZXh0cmFQYXJhbXMsIG1hbnVhbENhbGxiYWNrKSB7XG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycztcbiAgdmFyIG51bUxpc3RlbmVyc0JlZm9yZUVtaXQgPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICB0aGlzLmVtaXR0aW5nKys7XG5cbiAgaWYgKCFhcnJheShleHRyYVBhcmFtcykpIHtcbiAgICBleHRyYVBhcmFtcyA9IFtleHRyYVBhcmFtc107XG4gIH1cblxuICBmb3JFYWNoRXZlbnRPYmoodGhpcywgZnVuY3Rpb24gKHNlbGYsIGV2ZW50T2JqKSB7XG4gICAgaWYgKG1hbnVhbENhbGxiYWNrICE9IG51bGwpIHtcbiAgICAgIGxpc3RlbmVycyA9IFt7XG4gICAgICAgIGV2ZW50OiBldmVudE9iai5ldmVudCxcbiAgICAgICAgdHlwZTogZXZlbnRPYmoudHlwZSxcbiAgICAgICAgbmFtZXNwYWNlOiBldmVudE9iai5uYW1lc3BhY2UsXG4gICAgICAgIGNhbGxiYWNrOiBtYW51YWxDYWxsYmFja1xuICAgICAgfV07XG4gICAgICBudW1MaXN0ZW5lcnNCZWZvcmVFbWl0ID0gbGlzdGVuZXJzLmxlbmd0aDtcbiAgICB9XG5cbiAgICB2YXIgX2xvb3AyID0gZnVuY3Rpb24gX2xvb3AyKGkpIHtcbiAgICAgIHZhciBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTtcblxuICAgICAgaWYgKGxpc3RlbmVyLnR5cGUgPT09IGV2ZW50T2JqLnR5cGUgJiYgKCFsaXN0ZW5lci5uYW1lc3BhY2UgfHwgbGlzdGVuZXIubmFtZXNwYWNlID09PSBldmVudE9iai5uYW1lc3BhY2UgfHwgbGlzdGVuZXIubmFtZXNwYWNlID09PSB1bml2ZXJzYWxOYW1lc3BhY2UpICYmIHNlbGYuZXZlbnRNYXRjaGVzKHNlbGYuY29udGV4dCwgbGlzdGVuZXIsIGV2ZW50T2JqKSkge1xuICAgICAgICB2YXIgYXJncyA9IFtldmVudE9ial07XG5cbiAgICAgICAgaWYgKGV4dHJhUGFyYW1zICE9IG51bGwpIHtcbiAgICAgICAgICBwdXNoKGFyZ3MsIGV4dHJhUGFyYW1zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYuYmVmb3JlRW1pdChzZWxmLmNvbnRleHQsIGxpc3RlbmVyLCBldmVudE9iaik7XG5cbiAgICAgICAgaWYgKGxpc3RlbmVyLmNvbmYgJiYgbGlzdGVuZXIuY29uZi5vbmUpIHtcbiAgICAgICAgICBzZWxmLmxpc3RlbmVycyA9IHNlbGYubGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbiAobCkge1xuICAgICAgICAgICAgcmV0dXJuIGwgIT09IGxpc3RlbmVyO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNvbnRleHQgPSBzZWxmLmNhbGxiYWNrQ29udGV4dChzZWxmLmNvbnRleHQsIGxpc3RlbmVyLCBldmVudE9iaik7XG4gICAgICAgIHZhciByZXQgPSBsaXN0ZW5lci5jYWxsYmFjay5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgc2VsZi5hZnRlckVtaXQoc2VsZi5jb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmopO1xuXG4gICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgZXZlbnRPYmouc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZXZlbnRPYmoucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBpZiBsaXN0ZW5lciBtYXRjaGVzXG5cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1MaXN0ZW5lcnNCZWZvcmVFbWl0OyBpKyspIHtcbiAgICAgIF9sb29wMihpKTtcbiAgICB9IC8vIGZvciBsaXN0ZW5lclxuXG5cbiAgICBpZiAoc2VsZi5idWJibGUoc2VsZi5jb250ZXh0KSAmJiAhZXZlbnRPYmouaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgc2VsZi5wYXJlbnQoc2VsZi5jb250ZXh0KS5lbWl0KGV2ZW50T2JqLCBleHRyYVBhcmFtcyk7XG4gICAgfVxuICB9LCBldmVudHMpO1xuICB0aGlzLmVtaXR0aW5nLS07XG4gIHJldHVybiB0aGlzO1xufTtcblxudmFyIGVtaXR0ZXJPcHRpb25zJDEgPSB7XG4gIHF1YWxpZmllckNvbXBhcmU6IGZ1bmN0aW9uIHF1YWxpZmllckNvbXBhcmUoc2VsZWN0b3IxLCBzZWxlY3RvcjIpIHtcbiAgICBpZiAoc2VsZWN0b3IxID09IG51bGwgfHwgc2VsZWN0b3IyID09IG51bGwpIHtcbiAgICAgIHJldHVybiBzZWxlY3RvcjEgPT0gbnVsbCAmJiBzZWxlY3RvcjIgPT0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNlbGVjdG9yMS5zYW1lVGV4dChzZWxlY3RvcjIpO1xuICAgIH1cbiAgfSxcbiAgZXZlbnRNYXRjaGVzOiBmdW5jdGlvbiBldmVudE1hdGNoZXMoZWxlLCBsaXN0ZW5lciwgZXZlbnRPYmopIHtcbiAgICB2YXIgc2VsZWN0b3IgPSBsaXN0ZW5lci5xdWFsaWZpZXI7XG5cbiAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVsZSAhPT0gZXZlbnRPYmoudGFyZ2V0ICYmIGVsZW1lbnQoZXZlbnRPYmoudGFyZ2V0KSAmJiBzZWxlY3Rvci5tYXRjaGVzKGV2ZW50T2JqLnRhcmdldCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGFkZEV2ZW50RmllbGRzOiBmdW5jdGlvbiBhZGRFdmVudEZpZWxkcyhlbGUsIGV2dCkge1xuICAgIGV2dC5jeSA9IGVsZS5jeSgpO1xuICAgIGV2dC50YXJnZXQgPSBlbGU7XG4gIH0sXG4gIGNhbGxiYWNrQ29udGV4dDogZnVuY3Rpb24gY2FsbGJhY2tDb250ZXh0KGVsZSwgbGlzdGVuZXIsIGV2ZW50T2JqKSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyLnF1YWxpZmllciAhPSBudWxsID8gZXZlbnRPYmoudGFyZ2V0IDogZWxlO1xuICB9LFxuICBiZWZvcmVFbWl0OiBmdW5jdGlvbiBiZWZvcmVFbWl0KGNvbnRleHQsIGxpc3RlbmVyXG4gIC8qLCBldmVudE9iaiovXG4gICkge1xuICAgIGlmIChsaXN0ZW5lci5jb25mICYmIGxpc3RlbmVyLmNvbmYub25jZSkge1xuICAgICAgbGlzdGVuZXIuY29uZi5vbmNlQ29sbGVjdGlvbi5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lci5ldmVudCwgbGlzdGVuZXIucXVhbGlmaWVyLCBsaXN0ZW5lci5jYWxsYmFjayk7XG4gICAgfVxuICB9LFxuICBidWJibGU6IGZ1bmN0aW9uIGJ1YmJsZSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgcGFyZW50OiBmdW5jdGlvbiBwYXJlbnQoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5pc0NoaWxkKCkgPyBlbGUucGFyZW50KCkgOiBlbGUuY3koKTtcbiAgfVxufTtcblxudmFyIGFyZ1NlbGVjdG9yJDEgPSBmdW5jdGlvbiBhcmdTZWxlY3RvcihhcmcpIHtcbiAgaWYgKHN0cmluZyhhcmcpKSB7XG4gICAgcmV0dXJuIG5ldyBTZWxlY3RvcihhcmcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhcmc7XG4gIH1cbn07XG5cbnZhciBlbGVzZm4kOSA9IHtcbiAgY3JlYXRlRW1pdHRlcjogZnVuY3Rpb24gY3JlYXRlRW1pdHRlcigpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuXG4gICAgICBpZiAoIV9wLmVtaXR0ZXIpIHtcbiAgICAgICAgX3AuZW1pdHRlciA9IG5ldyBFbWl0dGVyKGVtaXR0ZXJPcHRpb25zJDEsIGVsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGVtaXR0ZXI6IGZ1bmN0aW9uIGVtaXR0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuZW1pdHRlcjtcbiAgfSxcbiAgb246IGZ1bmN0aW9uIG9uKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGFyZ1NlbCA9IGFyZ1NlbGVjdG9yJDEoc2VsZWN0b3IpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGVsZS5lbWl0dGVyKCkub24oZXZlbnRzLCBhcmdTZWwsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmVtb3ZlTGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGFyZ1NlbCA9IGFyZ1NlbGVjdG9yJDEoc2VsZWN0b3IpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGVsZS5lbWl0dGVyKCkucmVtb3ZlTGlzdGVuZXIoZXZlbnRzLCBhcmdTZWwsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmVtb3ZlQWxsTGlzdGVuZXJzOiBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnMoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGVsZS5lbWl0dGVyKCkucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIG9uZTogZnVuY3Rpb24gb25lKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGFyZ1NlbCA9IGFyZ1NlbGVjdG9yJDEoc2VsZWN0b3IpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGVsZS5lbWl0dGVyKCkub25lKGV2ZW50cywgYXJnU2VsLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIG9uY2U6IGZ1bmN0aW9uIG9uY2UoZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB2YXIgYXJnU2VsID0gYXJnU2VsZWN0b3IkMShzZWxlY3Rvcik7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgZWxlLmVtaXR0ZXIoKS5vbihldmVudHMsIGFyZ1NlbCwgY2FsbGJhY2ssIHtcbiAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgb25jZUNvbGxlY3Rpb246IHRoaXNcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgZW1pdDogZnVuY3Rpb24gZW1pdChldmVudHMsIGV4dHJhUGFyYW1zKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGVsZS5lbWl0dGVyKCkuZW1pdChldmVudHMsIGV4dHJhUGFyYW1zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZW1pdEFuZE5vdGlmeTogZnVuY3Rpb24gZW1pdEFuZE5vdGlmeShldmVudCwgZXh0cmFQYXJhbXMpIHtcbiAgICAvLyBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGVtcHR5IGNvbGxlY3Rpb25zIGRvbid0IG5lZWQgdG8gbm90aWZ5IGFueXRoaW5nXG4gICAgLy8gbm90aWZ5IHJlbmRlcmVyXG5cblxuICAgIHRoaXMuY3koKS5ub3RpZnkoZXZlbnQsIHRoaXMpO1xuICAgIHRoaXMuZW1pdChldmVudCwgZXh0cmFQYXJhbXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59O1xuZGVmaW5lLmV2ZW50QWxpYXNlc09uKGVsZXNmbiQ5KTtcblxudmFyIGVsZXNmbiQ4ID0ge1xuICBub2RlczogZnVuY3Rpb24gbm9kZXMoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc05vZGUoKTtcbiAgICB9KS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LFxuICBlZGdlczogZnVuY3Rpb24gZWRnZXMoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc0VkZ2UoKTtcbiAgICB9KS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LFxuICAvLyBpbnRlcm5hbCBoZWxwZXIgdG8gZ2V0IG5vZGVzIGFuZCBlZGdlcyBhcyBzZXBhcmF0ZSBjb2xsZWN0aW9ucyB3aXRoIHNpbmdsZSBpdGVyYXRpb24gb3ZlciBlbGVtZW50c1xuICBieUdyb3VwOiBmdW5jdGlvbiBieUdyb3VwKCkge1xuICAgIHZhciBub2RlcyA9IHRoaXMuc3Bhd24oKTtcbiAgICB2YXIgZWRnZXMgPSB0aGlzLnNwYXduKCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuXG4gICAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgIG5vZGVzLnB1c2goZWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVkZ2VzLnB1c2goZWxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbm9kZXM6IG5vZGVzLFxuICAgICAgZWRnZXM6IGVkZ2VzXG4gICAgfTtcbiAgfSxcbiAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIoX2ZpbHRlciwgdGhpc0FyZykge1xuICAgIGlmIChfZmlsdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGNoZWNrIHRoaXMgZmlyc3QgYi9jIGl0J3MgdGhlIG1vc3QgY29tbW9uL3BlcmZvcm1hbnQgY2FzZVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIGlmIChzdHJpbmcoX2ZpbHRlcikgfHwgZWxlbWVudE9yQ29sbGVjdGlvbihfZmlsdGVyKSkge1xuICAgICAgcmV0dXJuIG5ldyBTZWxlY3RvcihfZmlsdGVyKS5maWx0ZXIodGhpcyk7XG4gICAgfSBlbHNlIGlmIChmbiQ2KF9maWx0ZXIpKSB7XG4gICAgICB2YXIgZmlsdGVyRWxlcyA9IHRoaXMuc3Bhd24oKTtcbiAgICAgIHZhciBlbGVzID0gdGhpcztcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgICB2YXIgaW5jbHVkZSA9IHRoaXNBcmcgPyBfZmlsdGVyLmFwcGx5KHRoaXNBcmcsIFtlbGUsIGksIGVsZXNdKSA6IF9maWx0ZXIoZWxlLCBpLCBlbGVzKTtcblxuICAgICAgICBpZiAoaW5jbHVkZSkge1xuICAgICAgICAgIGZpbHRlckVsZXMucHVzaChlbGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWx0ZXJFbGVzO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNwYXduKCk7IC8vIGlmIG5vdCBoYW5kbGVkIGJ5IGFib3ZlLCBnaXZlICdlbSBhbiBlbXB0eSBjb2xsZWN0aW9uXG4gIH0sXG4gIG5vdDogZnVuY3Rpb24gbm90KHRvUmVtb3ZlKSB7XG4gICAgaWYgKCF0b1JlbW92ZSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzdHJpbmcodG9SZW1vdmUpKSB7XG4gICAgICAgIHRvUmVtb3ZlID0gdGhpcy5maWx0ZXIodG9SZW1vdmUpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZWxlbWVudHMgPSB0aGlzLnNwYXduKCk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXNbaV07XG4gICAgICAgIHZhciByZW1vdmUgPSB0b1JlbW92ZS5oYXMoZWxlbWVudCk7XG5cbiAgICAgICAgaWYgKCFyZW1vdmUpIHtcbiAgICAgICAgICBlbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbGVtZW50cztcbiAgICB9XG4gIH0sXG4gIGFic29sdXRlQ29tcGxlbWVudDogZnVuY3Rpb24gYWJzb2x1dGVDb21wbGVtZW50KCkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICByZXR1cm4gY3kubXV0YWJsZUVsZW1lbnRzKCkubm90KHRoaXMpO1xuICB9LFxuICBpbnRlcnNlY3Q6IGZ1bmN0aW9uIGludGVyc2VjdChvdGhlcikge1xuICAgIC8vIGlmIGEgc2VsZWN0b3IgaXMgc3BlY2lmaWVkLCB0aGVuIGZpbHRlciBieSBpdCBpbnN0ZWFkXG4gICAgaWYgKHN0cmluZyhvdGhlcikpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IG90aGVyO1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9XG5cbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLnNwYXduKCk7XG4gICAgdmFyIGNvbDEgPSB0aGlzO1xuICAgIHZhciBjb2wyID0gb3RoZXI7XG4gICAgdmFyIGNvbDFTbWFsbGVyID0gdGhpcy5sZW5ndGggPCBvdGhlci5sZW5ndGg7XG4gICAgdmFyIGNvbFMgPSBjb2wxU21hbGxlciA/IGNvbDEgOiBjb2wyO1xuICAgIHZhciBjb2xMID0gY29sMVNtYWxsZXIgPyBjb2wyIDogY29sMTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sUy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IGNvbFNbaV07XG5cbiAgICAgIGlmIChjb2xMLmhhcyhlbGUpKSB7XG4gICAgICAgIGVsZW1lbnRzLnB1c2goZWxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHM7XG4gIH0sXG4gIHhvcjogZnVuY3Rpb24geG9yKG90aGVyKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcblxuICAgIGlmIChzdHJpbmcob3RoZXIpKSB7XG4gICAgICBvdGhlciA9IGN5LiQob3RoZXIpO1xuICAgIH1cblxuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuc3Bhd24oKTtcbiAgICB2YXIgY29sMSA9IHRoaXM7XG4gICAgdmFyIGNvbDIgPSBvdGhlcjtcblxuICAgIHZhciBhZGQgPSBmdW5jdGlvbiBhZGQoY29sLCBvdGhlcikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2wubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGNvbFtpXTtcbiAgICAgICAgdmFyIGlkID0gZWxlLl9wcml2YXRlLmRhdGEuaWQ7XG4gICAgICAgIHZhciBpbk90aGVyID0gb3RoZXIuaGFzRWxlbWVudFdpdGhJZChpZCk7XG5cbiAgICAgICAgaWYgKCFpbk90aGVyKSB7XG4gICAgICAgICAgZWxlbWVudHMucHVzaChlbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGFkZChjb2wxLCBjb2wyKTtcbiAgICBhZGQoY29sMiwgY29sMSk7XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9LFxuICBkaWZmOiBmdW5jdGlvbiBkaWZmKG90aGVyKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcblxuICAgIGlmIChzdHJpbmcob3RoZXIpKSB7XG4gICAgICBvdGhlciA9IGN5LiQob3RoZXIpO1xuICAgIH1cblxuICAgIHZhciBsZWZ0ID0gdGhpcy5zcGF3bigpO1xuICAgIHZhciByaWdodCA9IHRoaXMuc3Bhd24oKTtcbiAgICB2YXIgYm90aCA9IHRoaXMuc3Bhd24oKTtcbiAgICB2YXIgY29sMSA9IHRoaXM7XG4gICAgdmFyIGNvbDIgPSBvdGhlcjtcblxuICAgIHZhciBhZGQgPSBmdW5jdGlvbiBhZGQoY29sLCBvdGhlciwgcmV0RWxlcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2wubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGNvbFtpXTtcbiAgICAgICAgdmFyIGlkID0gZWxlLl9wcml2YXRlLmRhdGEuaWQ7XG4gICAgICAgIHZhciBpbk90aGVyID0gb3RoZXIuaGFzRWxlbWVudFdpdGhJZChpZCk7XG5cbiAgICAgICAgaWYgKGluT3RoZXIpIHtcbiAgICAgICAgICBib3RoLm1lcmdlKGVsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0RWxlcy5wdXNoKGVsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgYWRkKGNvbDEsIGNvbDIsIGxlZnQpO1xuICAgIGFkZChjb2wyLCBjb2wxLCByaWdodCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IGxlZnQsXG4gICAgICByaWdodDogcmlnaHQsXG4gICAgICBib3RoOiBib3RoXG4gICAgfTtcbiAgfSxcbiAgYWRkOiBmdW5jdGlvbiBhZGQodG9BZGQpIHtcbiAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuXG4gICAgaWYgKCF0b0FkZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKHN0cmluZyh0b0FkZCkpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IHRvQWRkO1xuICAgICAgdG9BZGQgPSBjeS5tdXRhYmxlRWxlbWVudHMoKS5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH1cblxuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuc3Bhd25TZWxmKCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvQWRkLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdG9BZGRbaV07XG4gICAgICB2YXIgYWRkID0gIXRoaXMuaGFzKGVsZSk7XG5cbiAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgZWxlbWVudHMucHVzaChlbGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50cztcbiAgfSxcbiAgLy8gaW4gcGxhY2UgbWVyZ2Ugb24gY2FsbGluZyBjb2xsZWN0aW9uXG4gIG1lcmdlOiBmdW5jdGlvbiBtZXJnZSh0b0FkZCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgdmFyIGN5ID0gX3AuY3k7XG5cbiAgICBpZiAoIXRvQWRkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAodG9BZGQgJiYgc3RyaW5nKHRvQWRkKSkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gdG9BZGQ7XG4gICAgICB0b0FkZCA9IGN5Lm11dGFibGVFbGVtZW50cygpLmZpbHRlcihzZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgdmFyIG1hcCA9IF9wLm1hcDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9BZGQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0b0FkZEVsZSA9IHRvQWRkW2ldO1xuICAgICAgdmFyIGlkID0gdG9BZGRFbGUuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICAgIHZhciBhZGQgPSAhbWFwLmhhcyhpZCk7XG5cbiAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5sZW5ndGgrKztcbiAgICAgICAgdGhpc1tpbmRleF0gPSB0b0FkZEVsZTtcbiAgICAgICAgbWFwLnNldChpZCwge1xuICAgICAgICAgIGVsZTogdG9BZGRFbGUsXG4gICAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICB1bm1lcmdlQXQ6IGZ1bmN0aW9uIHVubWVyZ2VBdChpKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgbWFwID0gX3AubWFwOyAvLyByZW1vdmUgZWxlXG5cbiAgICB0aGlzW2ldID0gdW5kZWZpbmVkO1xuICAgIG1hcFtcImRlbGV0ZVwiXShpZCk7XG4gICAgdmFyIHVubWVyZ2VkTGFzdEVsZSA9IGkgPT09IHRoaXMubGVuZ3RoIC0gMTsgLy8gcmVwbGFjZSBlbXB0eSBzcG90IHdpdGggbGFzdCBlbGUgaW4gY29sbGVjdGlvblxuXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMSAmJiAhdW5tZXJnZWRMYXN0RWxlKSB7XG4gICAgICB2YXIgbGFzdEVsZUkgPSB0aGlzLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgbGFzdEVsZSA9IHRoaXNbbGFzdEVsZUldO1xuICAgICAgdmFyIGxhc3RFbGVJZCA9IGxhc3RFbGUuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICAgIHRoaXNbbGFzdEVsZUldID0gdW5kZWZpbmVkO1xuICAgICAgdGhpc1tpXSA9IGxhc3RFbGU7XG4gICAgICBtYXAuc2V0KGxhc3RFbGVJZCwge1xuICAgICAgICBlbGU6IGxhc3RFbGUsXG4gICAgICAgIGluZGV4OiBpXG4gICAgICB9KTtcbiAgICB9IC8vIHRoZSBjb2xsZWN0aW9uIGlzIG5vdyAxIGVsZSBzbWFsbGVyXG5cblxuICAgIHRoaXMubGVuZ3RoLS07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIC8vIHJlbW92ZSBzaW5nbGUgZWxlIGluIHBsYWNlIGluIGNhbGxpbmcgY29sbGVjdGlvblxuICB1bm1lcmdlT25lOiBmdW5jdGlvbiB1bm1lcmdlT25lKGVsZSkge1xuICAgIGVsZSA9IGVsZVswXTtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciBpZCA9IGVsZS5fcHJpdmF0ZS5kYXRhLmlkO1xuICAgIHZhciBtYXAgPSBfcC5tYXA7XG4gICAgdmFyIGVudHJ5ID0gbWFwLmdldChpZCk7XG5cbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICByZXR1cm4gdGhpczsgLy8gbm8gbmVlZCB0byByZW1vdmVcbiAgICB9XG5cbiAgICB2YXIgaSA9IGVudHJ5LmluZGV4O1xuICAgIHRoaXMudW5tZXJnZUF0KGkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICAvLyByZW1vdmUgZWxlcyBpbiBwbGFjZSBvbiBjYWxsaW5nIGNvbGxlY3Rpb25cbiAgdW5tZXJnZTogZnVuY3Rpb24gdW5tZXJnZSh0b1JlbW92ZSkge1xuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG5cbiAgICBpZiAoIXRvUmVtb3ZlKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAodG9SZW1vdmUgJiYgc3RyaW5nKHRvUmVtb3ZlKSkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gdG9SZW1vdmU7XG4gICAgICB0b1JlbW92ZSA9IGN5Lm11dGFibGVFbGVtZW50cygpLmZpbHRlcihzZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b1JlbW92ZS5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy51bm1lcmdlT25lKHRvUmVtb3ZlW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgdW5tZXJnZUJ5OiBmdW5jdGlvbiB1bm1lcmdlQnkodG9SbUZuKSB7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuXG4gICAgICBpZiAodG9SbUZuKGVsZSkpIHtcbiAgICAgICAgdGhpcy51bm1lcmdlQXQoaSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIG1hcDogZnVuY3Rpb24gbWFwKG1hcEZuLCB0aGlzQXJnKSB7XG4gICAgdmFyIGFyciA9IFtdO1xuICAgIHZhciBlbGVzID0gdGhpcztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICB2YXIgcmV0ID0gdGhpc0FyZyA/IG1hcEZuLmFwcGx5KHRoaXNBcmcsIFtlbGUsIGksIGVsZXNdKSA6IG1hcEZuKGVsZSwgaSwgZWxlcyk7XG4gICAgICBhcnIucHVzaChyZXQpO1xuICAgIH1cblxuICAgIHJldHVybiBhcnI7XG4gIH0sXG4gIHJlZHVjZTogZnVuY3Rpb24gcmVkdWNlKGZuLCBpbml0aWFsVmFsdWUpIHtcbiAgICB2YXIgdmFsID0gaW5pdGlhbFZhbHVlO1xuICAgIHZhciBlbGVzID0gdGhpcztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsID0gZm4odmFsLCBlbGVzW2ldLCBpLCBlbGVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsO1xuICB9LFxuICBtYXg6IGZ1bmN0aW9uIG1heCh2YWxGbiwgdGhpc0FyZykge1xuICAgIHZhciBtYXggPSAtSW5maW5pdHk7XG4gICAgdmFyIG1heEVsZTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgdmFyIHZhbCA9IHRoaXNBcmcgPyB2YWxGbi5hcHBseSh0aGlzQXJnLCBbZWxlLCBpLCBlbGVzXSkgOiB2YWxGbihlbGUsIGksIGVsZXMpO1xuXG4gICAgICBpZiAodmFsID4gbWF4KSB7XG4gICAgICAgIG1heCA9IHZhbDtcbiAgICAgICAgbWF4RWxlID0gZWxlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogbWF4LFxuICAgICAgZWxlOiBtYXhFbGVcbiAgICB9O1xuICB9LFxuICBtaW46IGZ1bmN0aW9uIG1pbih2YWxGbiwgdGhpc0FyZykge1xuICAgIHZhciBtaW4gPSBJbmZpbml0eTtcbiAgICB2YXIgbWluRWxlO1xuICAgIHZhciBlbGVzID0gdGhpcztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICB2YXIgdmFsID0gdGhpc0FyZyA/IHZhbEZuLmFwcGx5KHRoaXNBcmcsIFtlbGUsIGksIGVsZXNdKSA6IHZhbEZuKGVsZSwgaSwgZWxlcyk7XG5cbiAgICAgIGlmICh2YWwgPCBtaW4pIHtcbiAgICAgICAgbWluID0gdmFsO1xuICAgICAgICBtaW5FbGUgPSBlbGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBtaW4sXG4gICAgICBlbGU6IG1pbkVsZVxuICAgIH07XG4gIH1cbn07IC8vIGFsaWFzZXNcblxudmFyIGZuJDEgPSBlbGVzZm4kODtcbmZuJDFbJ3UnXSA9IGZuJDFbJ3wnXSA9IGZuJDFbJysnXSA9IGZuJDEudW5pb24gPSBmbiQxLm9yID0gZm4kMS5hZGQ7XG5mbiQxWydcXFxcJ10gPSBmbiQxWychJ10gPSBmbiQxWyctJ10gPSBmbiQxLmRpZmZlcmVuY2UgPSBmbiQxLnJlbGF0aXZlQ29tcGxlbWVudCA9IGZuJDEuc3VidHJhY3QgPSBmbiQxLm5vdDtcbmZuJDFbJ24nXSA9IGZuJDFbJyYnXSA9IGZuJDFbJy4nXSA9IGZuJDEuYW5kID0gZm4kMS5pbnRlcnNlY3Rpb24gPSBmbiQxLmludGVyc2VjdDtcbmZuJDFbJ14nXSA9IGZuJDFbJygrKSddID0gZm4kMVsnKC0pJ10gPSBmbiQxLnN5bW1ldHJpY0RpZmZlcmVuY2UgPSBmbiQxLnN5bWRpZmYgPSBmbiQxLnhvcjtcbmZuJDEuZm5GaWx0ZXIgPSBmbiQxLmZpbHRlckZuID0gZm4kMS5zdGRGaWx0ZXIgPSBmbiQxLmZpbHRlcjtcbmZuJDEuY29tcGxlbWVudCA9IGZuJDEuYWJzY29tcCA9IGZuJDEuYWJzb2x1dGVDb21wbGVtZW50O1xuXG52YXIgZWxlc2ZuJDcgPSB7XG4gIGlzTm9kZTogZnVuY3Rpb24gaXNOb2RlKCkge1xuICAgIHJldHVybiB0aGlzLmdyb3VwKCkgPT09ICdub2Rlcyc7XG4gIH0sXG4gIGlzRWRnZTogZnVuY3Rpb24gaXNFZGdlKCkge1xuICAgIHJldHVybiB0aGlzLmdyb3VwKCkgPT09ICdlZGdlcyc7XG4gIH0sXG4gIGlzTG9vcDogZnVuY3Rpb24gaXNMb29wKCkge1xuICAgIHJldHVybiB0aGlzLmlzRWRnZSgpICYmIHRoaXMuc291cmNlKClbMF0gPT09IHRoaXMudGFyZ2V0KClbMF07XG4gIH0sXG4gIGlzU2ltcGxlOiBmdW5jdGlvbiBpc1NpbXBsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0VkZ2UoKSAmJiB0aGlzLnNvdXJjZSgpWzBdICE9PSB0aGlzLnRhcmdldCgpWzBdO1xuICB9LFxuICBncm91cDogZnVuY3Rpb24gZ3JvdXAoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG5cbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLl9wcml2YXRlLmdyb3VwO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiAgRWxlbWVudHMgYXJlIGRyYXduIGluIGEgc3BlY2lmaWMgb3JkZXIgYmFzZWQgb24gY29tcG91bmQgZGVwdGggKGxvdyB0byBoaWdoKSwgdGhlIGVsZW1lbnQgdHlwZSAobm9kZXMgYWJvdmUgZWRnZXMpLFxuICogIGFuZCB6LWluZGV4IChsb3cgdG8gaGlnaCkuICBUaGVzZSBzdHlsZXMgYWZmZWN0IGhvdyB0aGlzIGFwcGxpZXM6XG4gKlxuICogIHotY29tcG91bmQtZGVwdGg6IE1heSBiZSBgYm90dG9tIHwgb3JwaGFuIHwgYXV0byB8IHRvcGAuICBUaGUgZmlyc3QgZHJhd24gaXMgYGJvdHRvbWAsIHRoZW4gYG9ycGhhbmAgd2hpY2ggaXMgdGhlXG4gKiAgICAgIHNhbWUgZGVwdGggYXMgdGhlIHJvb3Qgb2YgdGhlIGNvbXBvdW5kIGdyYXBoLCBmb2xsb3dlZCBieSB0aGUgZGVmYXVsdCB2YWx1ZSBgYXV0b2Agd2hpY2ggZHJhd3MgaW4gb3JkZXIgZnJvbVxuICogICAgICByb290IHRvIGxlYXZlcyBvZiB0aGUgY29tcG91bmQgZ3JhcGguICBUaGUgbGFzdCBkcmF3biBpcyBgdG9wYC5cbiAqICB6LWluZGV4LWNvbXBhcmU6IE1heSBiZSBgYXV0byB8IG1hbnVhbGAuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgYXV0b2Agd2hpY2ggYWx3YXlzIGRyYXdzIGVkZ2VzIHVuZGVyIG5vZGVzLlxuICogICAgICBgbWFudWFsYCBpZ25vcmVzIHRoaXMgY29udmVudGlvbiBhbmQgZHJhd3MgYmFzZWQgb24gdGhlIGB6LWluZGV4YCB2YWx1ZSBzZXR0aW5nLlxuICogIHotaW5kZXg6IEFuIGludGVnZXIgdmFsdWUgdGhhdCBhZmZlY3RzIHRoZSByZWxhdGl2ZSBkcmF3IG9yZGVyIG9mIGVsZW1lbnRzLiAgSW4gZ2VuZXJhbCwgYW4gZWxlbWVudCB3aXRoIGEgaGlnaGVyXG4gKiAgICAgIGB6LWluZGV4YCB3aWxsIGJlIGRyYXduIG9uIHRvcCBvZiBhbiBlbGVtZW50IHdpdGggYSBsb3dlciBgei1pbmRleGAuXG4gKi9cblxudmFyIHpJbmRleFNvcnQgPSBmdW5jdGlvbiB6SW5kZXhTb3J0KGEsIGIpIHtcbiAgdmFyIGN5ID0gYS5jeSgpO1xuICB2YXIgaGFzQ29tcG91bmROb2RlcyA9IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcblxuICBmdW5jdGlvbiBnZXREZXB0aChlbGUpIHtcbiAgICB2YXIgc3R5bGUgPSBlbGUucHN0eWxlKCd6LWNvbXBvdW5kLWRlcHRoJyk7XG5cbiAgICBpZiAoc3R5bGUudmFsdWUgPT09ICdhdXRvJykge1xuICAgICAgcmV0dXJuIGhhc0NvbXBvdW5kTm9kZXMgPyBlbGUuekRlcHRoKCkgOiAwO1xuICAgIH0gZWxzZSBpZiAoc3R5bGUudmFsdWUgPT09ICdib3R0b20nKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmIChzdHlsZS52YWx1ZSA9PT0gJ3RvcCcpIHtcbiAgICAgIHJldHVybiBNQVhfSU5UJDE7XG4gICAgfSAvLyAnb3JwaGFuJ1xuXG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHZhciBkZXB0aERpZmYgPSBnZXREZXB0aChhKSAtIGdldERlcHRoKGIpO1xuXG4gIGlmIChkZXB0aERpZmYgIT09IDApIHtcbiAgICByZXR1cm4gZGVwdGhEaWZmO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RWxlRGVwdGgoZWxlKSB7XG4gICAgdmFyIHN0eWxlID0gZWxlLnBzdHlsZSgnei1pbmRleC1jb21wYXJlJyk7XG5cbiAgICBpZiAoc3R5bGUudmFsdWUgPT09ICdhdXRvJykge1xuICAgICAgcmV0dXJuIGVsZS5pc05vZGUoKSA/IDEgOiAwO1xuICAgIH0gLy8gJ21hbnVhbCdcblxuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICB2YXIgZWxlRGlmZiA9IGdldEVsZURlcHRoKGEpIC0gZ2V0RWxlRGVwdGgoYik7XG5cbiAgaWYgKGVsZURpZmYgIT09IDApIHtcbiAgICByZXR1cm4gZWxlRGlmZjtcbiAgfVxuXG4gIHZhciB6RGlmZiA9IGEucHN0eWxlKCd6LWluZGV4JykudmFsdWUgLSBiLnBzdHlsZSgnei1pbmRleCcpLnZhbHVlO1xuXG4gIGlmICh6RGlmZiAhPT0gMCkge1xuICAgIHJldHVybiB6RGlmZjtcbiAgfSAvLyBjb21wYXJlIGluZGljZXMgaW4gdGhlIGNvcmUgKG9yZGVyIGFkZGVkIHRvIGdyYXBoIHcvIGxhc3Qgb24gdG9wKVxuXG5cbiAgcmV0dXJuIGEucG9vbEluZGV4KCkgLSBiLnBvb2xJbmRleCgpO1xufTtcblxudmFyIGVsZXNmbiQ2ID0ge1xuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGZuLCB0aGlzQXJnKSB7XG4gICAgaWYgKGZuJDYoZm4pKSB7XG4gICAgICB2YXIgTiA9IHRoaXMubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgICAgdmFyIHJldCA9IHRoaXNBcmcgPyBmbi5hcHBseSh0aGlzQXJnLCBbZWxlLCBpLCB0aGlzXSkgOiBmbihlbGUsIGksIHRoaXMpO1xuXG4gICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gLy8gZXhpdCBlYWNoIGVhcmx5IG9uIHJldHVybiBmYWxzZVxuXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHRvQXJyYXk6IGZ1bmN0aW9uIHRvQXJyYXkoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFycmF5LnB1c2godGhpc1tpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycmF5O1xuICB9LFxuICBzbGljZTogZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIHZhciB0aGlzU2l6ZSA9IHRoaXMubGVuZ3RoO1xuXG4gICAgaWYgKGVuZCA9PSBudWxsKSB7XG4gICAgICBlbmQgPSB0aGlzU2l6ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPT0gbnVsbCkge1xuICAgICAgc3RhcnQgPSAwO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgIHN0YXJ0ID0gdGhpc1NpemUgKyBzdGFydDtcbiAgICB9XG5cbiAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgZW5kID0gdGhpc1NpemUgKyBlbmQ7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpID49IDAgJiYgaSA8IGVuZCAmJiBpIDwgdGhpc1NpemU7IGkrKykge1xuICAgICAgYXJyYXkucHVzaCh0aGlzW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zcGF3bihhcnJheSk7XG4gIH0sXG4gIHNpemU6IGZ1bmN0aW9uIHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoO1xuICB9LFxuICBlcTogZnVuY3Rpb24gZXEoaSkge1xuICAgIHJldHVybiB0aGlzW2ldIHx8IHRoaXMuc3Bhd24oKTtcbiAgfSxcbiAgZmlyc3Q6IGZ1bmN0aW9uIGZpcnN0KCkge1xuICAgIHJldHVybiB0aGlzWzBdIHx8IHRoaXMuc3Bhd24oKTtcbiAgfSxcbiAgbGFzdDogZnVuY3Rpb24gbGFzdCgpIHtcbiAgICByZXR1cm4gdGhpc1t0aGlzLmxlbmd0aCAtIDFdIHx8IHRoaXMuc3Bhd24oKTtcbiAgfSxcbiAgZW1wdHk6IGZ1bmN0aW9uIGVtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMDtcbiAgfSxcbiAgbm9uZW1wdHk6IGZ1bmN0aW9uIG5vbmVtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy5lbXB0eSgpO1xuICB9LFxuICBzb3J0OiBmdW5jdGlvbiBzb3J0KHNvcnRGbikge1xuICAgIGlmICghZm4kNihzb3J0Rm4pKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgc29ydGVkID0gdGhpcy50b0FycmF5KCkuc29ydChzb3J0Rm4pO1xuICAgIHJldHVybiB0aGlzLnNwYXduKHNvcnRlZCk7XG4gIH0sXG4gIHNvcnRCeVpJbmRleDogZnVuY3Rpb24gc29ydEJ5WkluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLnNvcnQoekluZGV4U29ydCk7XG4gIH0sXG4gIHpEZXB0aDogZnVuY3Rpb24gekRlcHRoKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuXG4gICAgaWYgKCFlbGUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSAvLyBsZXQgY3kgPSBlbGUuY3koKTtcblxuXG4gICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgIHZhciBncm91cCA9IF9wLmdyb3VwO1xuXG4gICAgaWYgKGdyb3VwID09PSAnbm9kZXMnKSB7XG4gICAgICB2YXIgZGVwdGggPSBfcC5kYXRhLnBhcmVudCA/IGVsZS5wYXJlbnRzKCkuc2l6ZSgpIDogMDtcblxuICAgICAgaWYgKCFlbGUuaXNQYXJlbnQoKSkge1xuICAgICAgICByZXR1cm4gTUFYX0lOVCQxIC0gMTsgLy8gY2hpbGRsZXNzIG5vZGVzIGFsd2F5cyBvbiB0b3BcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlcHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc3JjID0gX3Auc291cmNlO1xuICAgICAgdmFyIHRndCA9IF9wLnRhcmdldDtcbiAgICAgIHZhciBzcmNEZXB0aCA9IHNyYy56RGVwdGgoKTtcbiAgICAgIHZhciB0Z3REZXB0aCA9IHRndC56RGVwdGgoKTtcbiAgICAgIHJldHVybiBNYXRoLm1heChzcmNEZXB0aCwgdGd0RGVwdGgsIDApOyAvLyBkZXB0aCBvZiBkZWVwZXN0IHBhcmVudFxuICAgIH1cbiAgfVxufTtcbmVsZXNmbiQ2LmVhY2ggPSBlbGVzZm4kNi5mb3JFYWNoO1xuXG52YXIgZGVmaW5lU3ltYm9sSXRlcmF0b3IgPSBmdW5jdGlvbiBkZWZpbmVTeW1ib2xJdGVyYXRvcigpIHtcbiAgdmFyIHR5cGVvZlVuZGVmID0gXCJ1bmRlZmluZWRcIiA7XG4gIHZhciBpc0l0ZXJhdG9yU3VwcG9ydGVkID0gKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihTeW1ib2wpKSAhPSB0eXBlb2ZVbmRlZiAmJiBfdHlwZW9mKFN5bWJvbC5pdGVyYXRvcikgIT0gdHlwZW9mVW5kZWY7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICBpZiAoaXNJdGVyYXRvclN1cHBvcnRlZCkge1xuICAgIGVsZXNmbiQ2W1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgICB2YXIgZW50cnkgPSB7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9O1xuICAgICAgdmFyIGkgPSAwO1xuICAgICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgICAgcmV0dXJuIF9kZWZpbmVQcm9wZXJ0eSh7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGVudHJ5LnZhbHVlID0gX3RoaXNbaSsrXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW50cnkudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBlbnRyeS5kb25lID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgICAgIH1cbiAgICAgIH0sIFN5bWJvbC5pdGVyYXRvciwgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxufTtcblxuZGVmaW5lU3ltYm9sSXRlcmF0b3IoKTtcblxudmFyIGdldExheW91dERpbWVuc2lvbk9wdGlvbnMgPSBkZWZhdWx0cyRnKHtcbiAgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzOiBmYWxzZVxufSk7XG52YXIgZWxlc2ZuJDUgPSB7XG4gIC8vIENhbGN1bGF0ZXMgYW5kIHJldHVybnMgbm9kZSBkaW1lbnNpb25zIHsgeCwgeSB9IGJhc2VkIG9uIG9wdGlvbnMgZ2l2ZW5cbiAgbGF5b3V0RGltZW5zaW9uczogZnVuY3Rpb24gbGF5b3V0RGltZW5zaW9ucyhvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IGdldExheW91dERpbWVuc2lvbk9wdGlvbnMob3B0aW9ucyk7XG4gICAgdmFyIGRpbXM7XG5cbiAgICBpZiAoIXRoaXMudGFrZXNVcFNwYWNlKCkpIHtcbiAgICAgIGRpbXMgPSB7XG4gICAgICAgIHc6IDAsXG4gICAgICAgIGg6IDBcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLm5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVscykge1xuICAgICAgdmFyIGJiRGltID0gdGhpcy5ib3VuZGluZ0JveCgpO1xuICAgICAgZGltcyA9IHtcbiAgICAgICAgdzogYmJEaW0udyxcbiAgICAgICAgaDogYmJEaW0uaFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGltcyA9IHtcbiAgICAgICAgdzogdGhpcy5vdXRlcldpZHRoKCksXG4gICAgICAgIGg6IHRoaXMub3V0ZXJIZWlnaHQoKVxuICAgICAgfTtcbiAgICB9IC8vIHNhbml0aXNlIHRoZSBkaW1lbnNpb25zIGZvciBleHRlcm5hbCBsYXlvdXRzIChhdm9pZCBkaXZpc2lvbiBieSB6ZXJvKVxuXG5cbiAgICBpZiAoZGltcy53ID09PSAwIHx8IGRpbXMuaCA9PT0gMCkge1xuICAgICAgZGltcy53ID0gZGltcy5oID0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGltcztcbiAgfSxcbiAgLy8gdXNpbmcgc3RhbmRhcmQgbGF5b3V0IG9wdGlvbnMsIGFwcGx5IHBvc2l0aW9uIGZ1bmN0aW9uICh3LyBvciB3L28gYW5pbWF0aW9uKVxuICBsYXlvdXRQb3NpdGlvbnM6IGZ1bmN0aW9uIGxheW91dFBvc2l0aW9ucyhsYXlvdXQsIG9wdGlvbnMsIGZuKSB7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpLmZpbHRlcihmdW5jdGlvbiAobikge1xuICAgICAgcmV0dXJuICFuLmlzUGFyZW50KCk7XG4gICAgfSk7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBsYXlvdXRFbGVzID0gb3B0aW9ucy5lbGVzOyAvLyBub2RlcyAmIGVkZ2VzXG5cbiAgICB2YXIgZ2V0TWVtb2l6ZUtleSA9IGZ1bmN0aW9uIGdldE1lbW9pemVLZXkobm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGUuaWQoKTtcbiAgICB9O1xuXG4gICAgdmFyIGZuTWVtID0gbWVtb2l6ZShmbiwgZ2V0TWVtb2l6ZUtleSk7IC8vIG1lbW9pemVkIHZlcnNpb24gb2YgcG9zaXRpb24gZnVuY3Rpb25cblxuICAgIGxheW91dC5lbWl0KHtcbiAgICAgIHR5cGU6ICdsYXlvdXRzdGFydCcsXG4gICAgICBsYXlvdXQ6IGxheW91dFxuICAgIH0pO1xuICAgIGxheW91dC5hbmltYXRpb25zID0gW107XG5cbiAgICB2YXIgY2FsY3VsYXRlU3BhY2luZyA9IGZ1bmN0aW9uIGNhbGN1bGF0ZVNwYWNpbmcoc3BhY2luZywgbm9kZXNCYiwgcG9zKSB7XG4gICAgICB2YXIgY2VudGVyID0ge1xuICAgICAgICB4OiBub2Rlc0JiLngxICsgbm9kZXNCYi53IC8gMixcbiAgICAgICAgeTogbm9kZXNCYi55MSArIG5vZGVzQmIuaCAvIDJcbiAgICAgIH07XG4gICAgICB2YXIgc3BhY2luZ1ZlY3RvciA9IHtcbiAgICAgICAgLy8gc2NhbGUgZnJvbSBjZW50ZXIgb2YgYm91bmRpbmcgYm94IChub3QgbmVjZXNzYXJpbHkgMCwwKVxuICAgICAgICB4OiAocG9zLnggLSBjZW50ZXIueCkgKiBzcGFjaW5nLFxuICAgICAgICB5OiAocG9zLnkgLSBjZW50ZXIueSkgKiBzcGFjaW5nXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogY2VudGVyLnggKyBzcGFjaW5nVmVjdG9yLngsXG4gICAgICAgIHk6IGNlbnRlci55ICsgc3BhY2luZ1ZlY3Rvci55XG4gICAgICB9O1xuICAgIH07XG5cbiAgICB2YXIgdXNlU3BhY2luZ0ZhY3RvciA9IG9wdGlvbnMuc3BhY2luZ0ZhY3RvciAmJiBvcHRpb25zLnNwYWNpbmdGYWN0b3IgIT09IDE7XG5cbiAgICB2YXIgc3BhY2luZ0JiID0gZnVuY3Rpb24gc3BhY2luZ0JiKCkge1xuICAgICAgaWYgKCF1c2VTcGFjaW5nRmFjdG9yKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgYmIgPSBtYWtlQm91bmRpbmdCb3goKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICB2YXIgcG9zID0gZm5NZW0obm9kZSwgaSk7XG4gICAgICAgIGV4cGFuZEJvdW5kaW5nQm94QnlQb2ludChiYiwgcG9zLngsIHBvcy55KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGJiO1xuICAgIH07XG5cbiAgICB2YXIgYmIgPSBzcGFjaW5nQmIoKTtcbiAgICB2YXIgZ2V0RmluYWxQb3MgPSBtZW1vaXplKGZ1bmN0aW9uIChub2RlLCBpKSB7XG4gICAgICB2YXIgbmV3UG9zID0gZm5NZW0obm9kZSwgaSk7XG5cbiAgICAgIGlmICh1c2VTcGFjaW5nRmFjdG9yKSB7XG4gICAgICAgIHZhciBzcGFjaW5nID0gTWF0aC5hYnMob3B0aW9ucy5zcGFjaW5nRmFjdG9yKTtcbiAgICAgICAgbmV3UG9zID0gY2FsY3VsYXRlU3BhY2luZyhzcGFjaW5nLCBiYiwgbmV3UG9zKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMudHJhbnNmb3JtICE9IG51bGwpIHtcbiAgICAgICAgbmV3UG9zID0gb3B0aW9ucy50cmFuc2Zvcm0obm9kZSwgbmV3UG9zKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld1BvcztcbiAgICB9LCBnZXRNZW1vaXplS2V5KTtcblxuICAgIGlmIChvcHRpb25zLmFuaW1hdGUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgdmFyIG5ld1BvcyA9IGdldEZpbmFsUG9zKG5vZGUsIGkpO1xuICAgICAgICB2YXIgYW5pbWF0ZU5vZGUgPSBvcHRpb25zLmFuaW1hdGVGaWx0ZXIgPT0gbnVsbCB8fCBvcHRpb25zLmFuaW1hdGVGaWx0ZXIobm9kZSwgaSk7XG5cbiAgICAgICAgaWYgKGFuaW1hdGVOb2RlKSB7XG4gICAgICAgICAgdmFyIGFuaSA9IG5vZGUuYW5pbWF0aW9uKHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBuZXdQb3MsXG4gICAgICAgICAgICBkdXJhdGlvbjogb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvbixcbiAgICAgICAgICAgIGVhc2luZzogb3B0aW9ucy5hbmltYXRpb25FYXNpbmdcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBsYXlvdXQuYW5pbWF0aW9ucy5wdXNoKGFuaSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9kZS5wb3NpdGlvbihuZXdQb3MpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmZpdCkge1xuICAgICAgICB2YXIgZml0QW5pID0gY3kuYW5pbWF0aW9uKHtcbiAgICAgICAgICBmaXQ6IHtcbiAgICAgICAgICAgIGJvdW5kaW5nQm94OiBsYXlvdXRFbGVzLmJvdW5kaW5nQm94QXQoZ2V0RmluYWxQb3MpLFxuICAgICAgICAgICAgcGFkZGluZzogb3B0aW9ucy5wYWRkaW5nXG4gICAgICAgICAgfSxcbiAgICAgICAgICBkdXJhdGlvbjogb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvbixcbiAgICAgICAgICBlYXNpbmc6IG9wdGlvbnMuYW5pbWF0aW9uRWFzaW5nXG4gICAgICAgIH0pO1xuICAgICAgICBsYXlvdXQuYW5pbWF0aW9ucy5wdXNoKGZpdEFuaSk7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuem9vbSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMucGFuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIHpvb21QYW5BbmkgPSBjeS5hbmltYXRpb24oe1xuICAgICAgICAgIHpvb206IG9wdGlvbnMuem9vbSxcbiAgICAgICAgICBwYW46IG9wdGlvbnMucGFuLFxuICAgICAgICAgIGR1cmF0aW9uOiBvcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uLFxuICAgICAgICAgIGVhc2luZzogb3B0aW9ucy5hbmltYXRpb25FYXNpbmdcbiAgICAgICAgfSk7XG4gICAgICAgIGxheW91dC5hbmltYXRpb25zLnB1c2goem9vbVBhbkFuaSk7XG4gICAgICB9XG5cbiAgICAgIGxheW91dC5hbmltYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKGFuaSkge1xuICAgICAgICByZXR1cm4gYW5pLnBsYXkoKTtcbiAgICAgIH0pO1xuICAgICAgbGF5b3V0Lm9uZSgnbGF5b3V0cmVhZHknLCBvcHRpb25zLnJlYWR5KTtcbiAgICAgIGxheW91dC5lbWl0KHtcbiAgICAgICAgdHlwZTogJ2xheW91dHJlYWR5JyxcbiAgICAgICAgbGF5b3V0OiBsYXlvdXRcbiAgICAgIH0pO1xuICAgICAgUHJvbWlzZSQxLmFsbChsYXlvdXQuYW5pbWF0aW9ucy5tYXAoZnVuY3Rpb24gKGFuaSkge1xuICAgICAgICByZXR1cm4gYW5pLnByb21pc2UoKTtcbiAgICAgIH0pKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGF5b3V0Lm9uZSgnbGF5b3V0c3RvcCcsIG9wdGlvbnMuc3RvcCk7XG4gICAgICAgIGxheW91dC5lbWl0KHtcbiAgICAgICAgICB0eXBlOiAnbGF5b3V0c3RvcCcsXG4gICAgICAgICAgbGF5b3V0OiBsYXlvdXRcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZXMucG9zaXRpb25zKGdldEZpbmFsUG9zKTtcblxuICAgICAgaWYgKG9wdGlvbnMuZml0KSB7XG4gICAgICAgIGN5LmZpdChvcHRpb25zLmVsZXMsIG9wdGlvbnMucGFkZGluZyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnpvb20gIT0gbnVsbCkge1xuICAgICAgICBjeS56b29tKG9wdGlvbnMuem9vbSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnBhbikge1xuICAgICAgICBjeS5wYW4ob3B0aW9ucy5wYW4pO1xuICAgICAgfVxuXG4gICAgICBsYXlvdXQub25lKCdsYXlvdXRyZWFkeScsIG9wdGlvbnMucmVhZHkpO1xuICAgICAgbGF5b3V0LmVtaXQoe1xuICAgICAgICB0eXBlOiAnbGF5b3V0cmVhZHknLFxuICAgICAgICBsYXlvdXQ6IGxheW91dFxuICAgICAgfSk7XG4gICAgICBsYXlvdXQub25lKCdsYXlvdXRzdG9wJywgb3B0aW9ucy5zdG9wKTtcbiAgICAgIGxheW91dC5lbWl0KHtcbiAgICAgICAgdHlwZTogJ2xheW91dHN0b3AnLFxuICAgICAgICBsYXlvdXQ6IGxheW91dFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIGxheW91dDogZnVuY3Rpb24gbGF5b3V0KG9wdGlvbnMpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgcmV0dXJuIGN5Lm1ha2VMYXlvdXQoZXh0ZW5kKHt9LCBvcHRpb25zLCB7XG4gICAgICBlbGVzOiB0aGlzXG4gICAgfSkpO1xuICB9XG59OyAvLyBhbGlhc2VzOlxuXG5lbGVzZm4kNS5jcmVhdGVMYXlvdXQgPSBlbGVzZm4kNS5tYWtlTGF5b3V0ID0gZWxlc2ZuJDUubGF5b3V0O1xuXG5mdW5jdGlvbiBzdHlsZUNhY2hlKGtleSwgZm4sIGVsZSkge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBjYWNoZSA9IF9wLnN0eWxlQ2FjaGUgPSBfcC5zdHlsZUNhY2hlIHx8IFtdO1xuICB2YXIgdmFsO1xuXG4gIGlmICgodmFsID0gY2FjaGVba2V5XSkgIT0gbnVsbCkge1xuICAgIHJldHVybiB2YWw7XG4gIH0gZWxzZSB7XG4gICAgdmFsID0gY2FjaGVba2V5XSA9IGZuKGVsZSk7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWNoZVN0eWxlRnVuY3Rpb24oa2V5LCBmbikge1xuICBrZXkgPSBoYXNoU3RyaW5nKGtleSk7XG4gIHJldHVybiBmdW5jdGlvbiBjYWNoZWRTdHlsZUZ1bmN0aW9uKGVsZSkge1xuICAgIHJldHVybiBzdHlsZUNhY2hlKGtleSwgZm4sIGVsZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNhY2hlUHJvdG90eXBlU3R5bGVGdW5jdGlvbihrZXksIGZuKSB7XG4gIGtleSA9IGhhc2hTdHJpbmcoa2V5KTtcblxuICB2YXIgc2VsZkZuID0gZnVuY3Rpb24gc2VsZkZuKGVsZSkge1xuICAgIHJldHVybiBmbi5jYWxsKGVsZSk7XG4gIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGNhY2hlZFByb3RvdHlwZVN0eWxlRnVuY3Rpb24oKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG5cbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gc3R5bGVDYWNoZShrZXksIHNlbGZGbiwgZWxlKTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBlbGVzZm4kNCA9IHtcbiAgcmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlOiBmdW5jdGlvbiByZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUodXNlQ2FjaGUpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIHJlbmRlcmVyID0gY3kucmVuZGVyZXIoKTtcbiAgICB2YXIgc3R5bGVFbmFibGVkID0gY3kuc3R5bGVFbmFibGVkKCk7XG5cbiAgICBpZiAocmVuZGVyZXIgJiYgc3R5bGVFbmFibGVkKSB7XG4gICAgICByZW5kZXJlci5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUodGhpcywgdXNlQ2FjaGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBkaXJ0eVN0eWxlQ2FjaGU6IGZ1bmN0aW9uIGRpcnR5U3R5bGVDYWNoZSgpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG5cbiAgICB2YXIgZGlydHkgPSBmdW5jdGlvbiBkaXJ0eShlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuX3ByaXZhdGUuc3R5bGVDYWNoZSA9IG51bGw7XG4gICAgfTtcblxuICAgIGlmIChjeS5oYXNDb21wb3VuZE5vZGVzKCkpIHtcbiAgICAgIHZhciBlbGVzO1xuICAgICAgZWxlcyA9IHRoaXMuc3Bhd25TZWxmKCkubWVyZ2UodGhpcy5kZXNjZW5kYW50cygpKS5tZXJnZSh0aGlzLnBhcmVudHMoKSk7XG4gICAgICBlbGVzLm1lcmdlKGVsZXMuY29ubmVjdGVkRWRnZXMoKSk7XG4gICAgICBlbGVzLmZvckVhY2goZGlydHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICBkaXJ0eShlbGUpO1xuICAgICAgICBlbGUuY29ubmVjdGVkRWRnZXMoKS5mb3JFYWNoKGRpcnR5KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICAvLyBmdWxseSB1cGRhdGVzIChyZWNhbGN1bGF0ZXMpIHRoZSBzdHlsZSBmb3IgdGhlIGVsZW1lbnRzXG4gIHVwZGF0ZVN0eWxlOiBmdW5jdGlvbiB1cGRhdGVTdHlsZShub3RpZnlSZW5kZXJlcikge1xuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG5cbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAoY3kuYmF0Y2hpbmcoKSkge1xuICAgICAgdmFyIGJFbGVzID0gY3kuX3ByaXZhdGUuYmF0Y2hTdHlsZUVsZXM7XG4gICAgICBiRWxlcy5tZXJnZSh0aGlzKTtcbiAgICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZyBhbmQgZXhpdCBlYXJseSB3aGVuIGJhdGNoaW5nXG4gICAgfVxuXG4gICAgdmFyIGhhc0NvbXBvdW5kcyA9IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgICB2YXIgdXBkYXRlZEVsZXMgPSB0aGlzO1xuICAgIG5vdGlmeVJlbmRlcmVyID0gbm90aWZ5UmVuZGVyZXIgfHwgbm90aWZ5UmVuZGVyZXIgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBmYWxzZTtcblxuICAgIGlmIChoYXNDb21wb3VuZHMpIHtcbiAgICAgIC8vIHRoZW4gYWRkIGV2ZXJ5dGhpbmcgdXAgYW5kIGRvd24gZm9yIGNvbXBvdW5kIHNlbGVjdG9yIGNoZWNrc1xuICAgICAgdXBkYXRlZEVsZXMgPSB0aGlzLnNwYXduU2VsZigpLm1lcmdlKHRoaXMuZGVzY2VuZGFudHMoKSkubWVyZ2UodGhpcy5wYXJlbnRzKCkpO1xuICAgIH0gLy8gbGV0IGNoYW5nZWRFbGVzID0gc3R5bGUuYXBwbHkoIHVwZGF0ZWRFbGVzICk7XG5cblxuICAgIHZhciBjaGFuZ2VkRWxlcyA9IHVwZGF0ZWRFbGVzO1xuXG4gICAgaWYgKG5vdGlmeVJlbmRlcmVyKSB7XG4gICAgICBjaGFuZ2VkRWxlcy5lbWl0QW5kTm90aWZ5KCdzdHlsZScpOyAvLyBsZXQgcmVuZGVyZXIga25vdyB3ZSBjaGFuZ2VkIHN0eWxlXG4gICAgfSBlbHNlIHtcbiAgICAgIGNoYW5nZWRFbGVzLmVtaXQoJ3N0eWxlJyk7IC8vIGp1c3QgZmlyZSB0aGUgZXZlbnRcbiAgICB9XG5cbiAgICB1cGRhdGVkRWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuX3ByaXZhdGUuc3R5bGVEaXJ0eSA9IHRydWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIC8vIHByaXZhdGU6IGNsZWFycyBkaXJ0eSBmbGFnIGFuZCByZWNhbGN1bGF0ZXMgc3R5bGVcbiAgY2xlYW5TdHlsZTogZnVuY3Rpb24gY2xlYW5TdHlsZSgpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG5cbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcblxuICAgICAgaWYgKGVsZS5fcHJpdmF0ZS5zdHlsZURpcnR5KSB7XG4gICAgICAgIC8vIG4uYi4gdGhpcyBmbGFnIHNob3VsZCBiZSBzZXQgYmVmb3JlIGFwcGx5KCkgdG8gYXZvaWQgcG90ZW50aWFsIGluZmluaXRlIHJlY3Vyc2lvblxuICAgICAgICBlbGUuX3ByaXZhdGUuc3R5bGVEaXJ0eSA9IGZhbHNlO1xuICAgICAgICBjeS5zdHlsZSgpLmFwcGx5KGVsZSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvLyBnZXQgdGhlIGludGVybmFsIHBhcnNlZCBzdHlsZSBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlcbiAgcGFyc2VkU3R5bGU6IGZ1bmN0aW9uIHBhcnNlZFN0eWxlKHByb3BlcnR5KSB7XG4gICAgdmFyIGluY2x1ZGVOb25EZWZhdWx0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBjeSA9IGVsZS5jeSgpO1xuXG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChlbGUpIHtcbiAgICAgIHRoaXMuY2xlYW5TdHlsZSgpO1xuICAgICAgdmFyIG92ZXJyaWRkZW5TdHlsZSA9IGVsZS5fcHJpdmF0ZS5zdHlsZVtwcm9wZXJ0eV07XG5cbiAgICAgIGlmIChvdmVycmlkZGVuU3R5bGUgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGRlblN0eWxlO1xuICAgICAgfSBlbHNlIGlmIChpbmNsdWRlTm9uRGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gY3kuc3R5bGUoKS5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBudW1lcmljU3R5bGU6IGZ1bmN0aW9uIG51bWVyaWNTdHlsZShwcm9wZXJ0eSkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuXG4gICAgaWYgKCFlbGUuY3koKS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChlbGUpIHtcbiAgICAgIHZhciBwc3R5bGUgPSBlbGUucHN0eWxlKHByb3BlcnR5KTtcbiAgICAgIHJldHVybiBwc3R5bGUucGZWYWx1ZSAhPT0gdW5kZWZpbmVkID8gcHN0eWxlLnBmVmFsdWUgOiBwc3R5bGUudmFsdWU7XG4gICAgfVxuICB9LFxuICBudW1lcmljU3R5bGVVbml0czogZnVuY3Rpb24gbnVtZXJpY1N0eWxlVW5pdHMocHJvcGVydHkpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcblxuICAgIGlmICghZWxlLmN5KCkuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLnBzdHlsZShwcm9wZXJ0eSkudW5pdHM7XG4gICAgfVxuICB9LFxuICAvLyBnZXQgdGhlIHNwZWNpZmllZCBjc3MgcHJvcGVydHkgYXMgYSByZW5kZXJlZCB2YWx1ZSAoaS5lLiBvbi1zY3JlZW4gdmFsdWUpXG4gIC8vIG9yIGdldCB0aGUgd2hvbGUgcmVuZGVyZWQgc3R5bGUgaWYgbm8gcHJvcGVydHkgc3BlY2lmaWVkIChOQiBkb2Vzbid0IGFsbG93IHNldHRpbmcpXG4gIHJlbmRlcmVkU3R5bGU6IGZ1bmN0aW9uIHJlbmRlcmVkU3R5bGUocHJvcGVydHkpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG5cbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgZWxlID0gdGhpc1swXTtcblxuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBjeS5zdHlsZSgpLmdldFJlbmRlcmVkU3R5bGUoZWxlLCBwcm9wZXJ0eSk7XG4gICAgfVxuICB9LFxuICAvLyByZWFkIHRoZSBjYWxjdWxhdGVkIGNzcyBzdHlsZSBvZiB0aGUgZWxlbWVudCBvciBvdmVycmlkZSB0aGUgc3R5bGUgKHZpYSBhIGJ5cGFzcylcbiAgc3R5bGU6IGZ1bmN0aW9uIHN0eWxlKG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuXG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdmFyIHVwZGF0ZVRyYW5zaXRpb25zID0gZmFsc2U7XG4gICAgdmFyIHN0eWxlID0gY3kuc3R5bGUoKTtcblxuICAgIGlmIChwbGFpbk9iamVjdChuYW1lKSkge1xuICAgICAgLy8gdGhlbiBleHRlbmQgdGhlIGJ5cGFzc1xuICAgICAgdmFyIHByb3BzID0gbmFtZTtcbiAgICAgIHN0eWxlLmFwcGx5QnlwYXNzKHRoaXMsIHByb3BzLCB1cGRhdGVUcmFuc2l0aW9ucyk7XG4gICAgICB0aGlzLmVtaXRBbmROb3RpZnkoJ3N0eWxlJyk7IC8vIGxldCB0aGUgcmVuZGVyZXIga25vdyB3ZSd2ZSB1cGRhdGVkIHN0eWxlXG4gICAgfSBlbHNlIGlmIChzdHJpbmcobmFtZSkpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIHRoZW4gZ2V0IHRoZSBwcm9wZXJ0eSBmcm9tIHRoZSBzdHlsZVxuICAgICAgICB2YXIgZWxlID0gdGhpc1swXTtcblxuICAgICAgICBpZiAoZWxlKSB7XG4gICAgICAgICAgcmV0dXJuIHN0eWxlLmdldFN0eWxlUHJvcGVydHlWYWx1ZShlbGUsIG5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGVtcHR5IGNvbGxlY3Rpb24gPT4gY2FuJ3QgZ2V0IGFueSB2YWx1ZVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdGhlbiBzZXQgdGhlIGJ5cGFzcyB3aXRoIHRoZSBwcm9wZXJ0eSB2YWx1ZVxuICAgICAgICBzdHlsZS5hcHBseUJ5cGFzcyh0aGlzLCBuYW1lLCB2YWx1ZSwgdXBkYXRlVHJhbnNpdGlvbnMpO1xuICAgICAgICB0aGlzLmVtaXRBbmROb3RpZnkoJ3N0eWxlJyk7IC8vIGxldCB0aGUgcmVuZGVyZXIga25vdyB3ZSd2ZSB1cGRhdGVkIHN0eWxlXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBfZWxlID0gdGhpc1swXTtcblxuICAgICAgaWYgKF9lbGUpIHtcbiAgICAgICAgcmV0dXJuIHN0eWxlLmdldFJhd1N0eWxlKF9lbGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZW1wdHkgY29sbGVjdGlvbiA9PiBjYW4ndCBnZXQgYW55IHZhbHVlXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgcmVtb3ZlU3R5bGU6IGZ1bmN0aW9uIHJlbW92ZVN0eWxlKG5hbWVzKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuXG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdmFyIHVwZGF0ZVRyYW5zaXRpb25zID0gZmFsc2U7XG4gICAgdmFyIHN0eWxlID0gY3kuc3R5bGUoKTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG5cbiAgICBpZiAobmFtZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgICBzdHlsZS5yZW1vdmVBbGxCeXBhc3NlcyhlbGUsIHVwZGF0ZVRyYW5zaXRpb25zKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZXMgPSBuYW1lcy5zcGxpdCgvXFxzKy8pO1xuXG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZWxlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIF9lbGUyID0gZWxlc1tfaV07XG4gICAgICAgIHN0eWxlLnJlbW92ZUJ5cGFzc2VzKF9lbGUyLCBuYW1lcywgdXBkYXRlVHJhbnNpdGlvbnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZW1pdEFuZE5vdGlmeSgnc3R5bGUnKTsgLy8gbGV0IHRoZSByZW5kZXJlciBrbm93IHdlJ3ZlIHVwZGF0ZWQgc3R5bGVcblxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICBzaG93OiBmdW5jdGlvbiBzaG93KCkge1xuICAgIHRoaXMuY3NzKCdkaXNwbGF5JywgJ2VsZW1lbnQnKTtcbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgaGlkZTogZnVuY3Rpb24gaGlkZSgpIHtcbiAgICB0aGlzLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIGVmZmVjdGl2ZU9wYWNpdHk6IGZ1bmN0aW9uIGVmZmVjdGl2ZU9wYWNpdHkoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuXG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgdmFyIGhhc0NvbXBvdW5kTm9kZXMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG5cbiAgICBpZiAoZWxlKSB7XG4gICAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgICB2YXIgcGFyZW50T3BhY2l0eSA9IGVsZS5wc3R5bGUoJ29wYWNpdHknKS52YWx1ZTtcblxuICAgICAgaWYgKCFoYXNDb21wb3VuZE5vZGVzKSB7XG4gICAgICAgIHJldHVybiBwYXJlbnRPcGFjaXR5O1xuICAgICAgfVxuXG4gICAgICB2YXIgcGFyZW50cyA9ICFfcC5kYXRhLnBhcmVudCA/IG51bGwgOiBlbGUucGFyZW50cygpO1xuXG4gICAgICBpZiAocGFyZW50cykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgcGFyZW50ID0gcGFyZW50c1tpXTtcbiAgICAgICAgICB2YXIgb3BhY2l0eSA9IHBhcmVudC5wc3R5bGUoJ29wYWNpdHknKS52YWx1ZTtcbiAgICAgICAgICBwYXJlbnRPcGFjaXR5ID0gb3BhY2l0eSAqIHBhcmVudE9wYWNpdHk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcmVudE9wYWNpdHk7XG4gICAgfVxuICB9LFxuICB0cmFuc3BhcmVudDogZnVuY3Rpb24gdHJhbnNwYXJlbnQoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuXG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBoYXNDb21wb3VuZE5vZGVzID0gZWxlLmN5KCkuaGFzQ29tcG91bmROb2RlcygpO1xuXG4gICAgaWYgKGVsZSkge1xuICAgICAgaWYgKCFoYXNDb21wb3VuZE5vZGVzKSB7XG4gICAgICAgIHJldHVybiBlbGUucHN0eWxlKCdvcGFjaXR5JykudmFsdWUgPT09IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWxlLmVmZmVjdGl2ZU9wYWNpdHkoKSA9PT0gMDtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGJhY2tncm91bmRpbmc6IGZ1bmN0aW9uIGJhY2tncm91bmRpbmcoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuXG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHJldHVybiBlbGUuX3ByaXZhdGUuYmFja2dyb3VuZGluZyA/IHRydWUgOiBmYWxzZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gY2hlY2tDb21wb3VuZChlbGUsIHBhcmVudE9rKSB7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHBhcmVudHMgPSBfcC5kYXRhLnBhcmVudCA/IGVsZS5wYXJlbnRzKCkgOiBudWxsO1xuXG4gIGlmIChwYXJlbnRzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFyZW50ID0gcGFyZW50c1tpXTtcblxuICAgICAgaWYgKCFwYXJlbnRPayhwYXJlbnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZGVmaW5lRGVyaXZlZFN0YXRlRnVuY3Rpb24oc3BlY3MpIHtcbiAgdmFyIG9rID0gc3BlY3Mub2s7XG4gIHZhciBlZGdlT2tWaWFOb2RlID0gc3BlY3MuZWRnZU9rVmlhTm9kZSB8fCBzcGVjcy5vaztcbiAgdmFyIHBhcmVudE9rID0gc3BlY3MucGFyZW50T2sgfHwgc3BlY3Mub2s7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuXG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIGhhc0NvbXBvdW5kTm9kZXMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG5cbiAgICBpZiAoZWxlKSB7XG4gICAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG5cbiAgICAgIGlmICghb2soZWxlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgICAgcmV0dXJuICFoYXNDb21wb3VuZE5vZGVzIHx8IGNoZWNrQ29tcG91bmQoZWxlLCBwYXJlbnRPayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgc3JjID0gX3Auc291cmNlO1xuICAgICAgICB2YXIgdGd0ID0gX3AudGFyZ2V0O1xuICAgICAgICByZXR1cm4gZWRnZU9rVmlhTm9kZShzcmMpICYmICghaGFzQ29tcG91bmROb2RlcyB8fCBjaGVja0NvbXBvdW5kKHNyYywgZWRnZU9rVmlhTm9kZSkpICYmIChzcmMgPT09IHRndCB8fCBlZGdlT2tWaWFOb2RlKHRndCkgJiYgKCFoYXNDb21wb3VuZE5vZGVzIHx8IGNoZWNrQ29tcG91bmQodGd0LCBlZGdlT2tWaWFOb2RlKSkpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxudmFyIGVsZVRha2VzVXBTcGFjZSA9IGNhY2hlU3R5bGVGdW5jdGlvbignZWxlVGFrZXNVcFNwYWNlJywgZnVuY3Rpb24gKGVsZSkge1xuICByZXR1cm4gZWxlLnBzdHlsZSgnZGlzcGxheScpLnZhbHVlID09PSAnZWxlbWVudCcgJiYgZWxlLndpZHRoKCkgIT09IDAgJiYgKGVsZS5pc05vZGUoKSA/IGVsZS5oZWlnaHQoKSAhPT0gMCA6IHRydWUpO1xufSk7XG5lbGVzZm4kNC50YWtlc1VwU3BhY2UgPSBjYWNoZVByb3RvdHlwZVN0eWxlRnVuY3Rpb24oJ3Rha2VzVXBTcGFjZScsIGRlZmluZURlcml2ZWRTdGF0ZUZ1bmN0aW9uKHtcbiAgb2s6IGVsZVRha2VzVXBTcGFjZVxufSkpO1xudmFyIGVsZUludGVyYWN0aXZlID0gY2FjaGVTdHlsZUZ1bmN0aW9uKCdlbGVJbnRlcmFjdGl2ZScsIGZ1bmN0aW9uIChlbGUpIHtcbiAgcmV0dXJuIGVsZS5wc3R5bGUoJ2V2ZW50cycpLnZhbHVlID09PSAneWVzJyAmJiBlbGUucHN0eWxlKCd2aXNpYmlsaXR5JykudmFsdWUgPT09ICd2aXNpYmxlJyAmJiBlbGVUYWtlc1VwU3BhY2UoZWxlKTtcbn0pO1xudmFyIHBhcmVudEludGVyYWN0aXZlID0gY2FjaGVTdHlsZUZ1bmN0aW9uKCdwYXJlbnRJbnRlcmFjdGl2ZScsIGZ1bmN0aW9uIChwYXJlbnQpIHtcbiAgcmV0dXJuIHBhcmVudC5wc3R5bGUoJ3Zpc2liaWxpdHknKS52YWx1ZSA9PT0gJ3Zpc2libGUnICYmIGVsZVRha2VzVXBTcGFjZShwYXJlbnQpO1xufSk7XG5lbGVzZm4kNC5pbnRlcmFjdGl2ZSA9IGNhY2hlUHJvdG90eXBlU3R5bGVGdW5jdGlvbignaW50ZXJhY3RpdmUnLCBkZWZpbmVEZXJpdmVkU3RhdGVGdW5jdGlvbih7XG4gIG9rOiBlbGVJbnRlcmFjdGl2ZSxcbiAgcGFyZW50T2s6IHBhcmVudEludGVyYWN0aXZlLFxuICBlZGdlT2tWaWFOb2RlOiBlbGVUYWtlc1VwU3BhY2Vcbn0pKTtcblxuZWxlc2ZuJDQubm9uaW50ZXJhY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuXG4gIGlmIChlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5pbnRlcmFjdGl2ZSgpO1xuICB9XG59O1xuXG52YXIgZWxlVmlzaWJsZSA9IGNhY2hlU3R5bGVGdW5jdGlvbignZWxlVmlzaWJsZScsIGZ1bmN0aW9uIChlbGUpIHtcbiAgcmV0dXJuIGVsZS5wc3R5bGUoJ3Zpc2liaWxpdHknKS52YWx1ZSA9PT0gJ3Zpc2libGUnICYmIGVsZS5wc3R5bGUoJ29wYWNpdHknKS5wZlZhbHVlICE9PSAwICYmIGVsZVRha2VzVXBTcGFjZShlbGUpO1xufSk7XG52YXIgZWRnZVZpc2libGVWaWFOb2RlID0gZWxlVGFrZXNVcFNwYWNlO1xuZWxlc2ZuJDQudmlzaWJsZSA9IGNhY2hlUHJvdG90eXBlU3R5bGVGdW5jdGlvbigndmlzaWJsZScsIGRlZmluZURlcml2ZWRTdGF0ZUZ1bmN0aW9uKHtcbiAgb2s6IGVsZVZpc2libGUsXG4gIGVkZ2VPa1ZpYU5vZGU6IGVkZ2VWaXNpYmxlVmlhTm9kZVxufSkpO1xuXG5lbGVzZm4kNC5oaWRkZW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuXG4gIGlmIChlbGUpIHtcbiAgICByZXR1cm4gIWVsZS52aXNpYmxlKCk7XG4gIH1cbn07XG5cbmVsZXNmbiQ0LmlzQnVuZGxlZEJlemllciA9IGNhY2hlUHJvdG90eXBlU3R5bGVGdW5jdGlvbignaXNCdW5kbGVkQmV6aWVyJywgZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuY3koKS5zdHlsZUVuYWJsZWQoKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAhdGhpcy5yZW1vdmVkKCkgJiYgdGhpcy5wc3R5bGUoJ2N1cnZlLXN0eWxlJykudmFsdWUgPT09ICdiZXppZXInICYmIHRoaXMudGFrZXNVcFNwYWNlKCk7XG59KTtcbmVsZXNmbiQ0LmJ5cGFzcyA9IGVsZXNmbiQ0LmNzcyA9IGVsZXNmbiQ0LnN0eWxlO1xuZWxlc2ZuJDQucmVuZGVyZWRDc3MgPSBlbGVzZm4kNC5yZW5kZXJlZFN0eWxlO1xuZWxlc2ZuJDQucmVtb3ZlQnlwYXNzID0gZWxlc2ZuJDQucmVtb3ZlQ3NzID0gZWxlc2ZuJDQucmVtb3ZlU3R5bGU7XG5lbGVzZm4kNC5wc3R5bGUgPSBlbGVzZm4kNC5wYXJzZWRTdHlsZTtcblxudmFyIGVsZXNmbiQzID0ge307XG5cbmZ1bmN0aW9uIGRlZmluZVN3aXRjaEZ1bmN0aW9uKHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHZhciBjaGFuZ2VkRWxlcyA9IFtdOyAvLyBlLmcuIGN5Lm5vZGVzKCkuc2VsZWN0KCBkYXRhLCBoYW5kbGVyIClcblxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgdmFyIGRhdGEgPSBhcmdzWzBdO1xuICAgICAgdmFyIGhhbmRsZXIgPSBhcmdzWzFdO1xuICAgICAgdGhpcy5vbihwYXJhbXMuZXZlbnQsIGRhdGEsIGhhbmRsZXIpO1xuICAgIH0gLy8gZS5nLiBjeS5ub2RlcygpLnNlbGVjdCggaGFuZGxlciApXG4gICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgZm4kNihhcmdzWzBdKSkge1xuICAgICAgdmFyIF9oYW5kbGVyID0gYXJnc1swXTtcbiAgICAgIHRoaXMub24ocGFyYW1zLmV2ZW50LCBfaGFuZGxlcik7XG4gICAgfSAvLyBlLmcuIGN5Lm5vZGVzKCkuc2VsZWN0KClcbiAgICAvLyBlLmcuIChwcml2YXRlKSBjeS5ub2RlcygpLnNlbGVjdChbJ3RhcHNlbGVjdCddKVxuICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAwIHx8IGFyZ3MubGVuZ3RoID09PSAxICYmIGFycmF5KGFyZ3NbMF0pKSB7XG4gICAgICB2YXIgYWRkbEV2ZW50cyA9IGFyZ3MubGVuZ3RoID09PSAxID8gYXJnc1swXSA6IG51bGw7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgICAgdmFyIGFibGUgPSAhcGFyYW1zLmFibGVGaWVsZCB8fCBlbGUuX3ByaXZhdGVbcGFyYW1zLmFibGVGaWVsZF07XG4gICAgICAgIHZhciBjaGFuZ2VkID0gZWxlLl9wcml2YXRlW3BhcmFtcy5maWVsZF0gIT0gcGFyYW1zLnZhbHVlO1xuXG4gICAgICAgIGlmIChwYXJhbXMub3ZlcnJpZGVBYmxlKSB7XG4gICAgICAgICAgdmFyIG92ZXJyaWRlQWJsZSA9IHBhcmFtcy5vdmVycmlkZUFibGUoZWxlKTtcblxuICAgICAgICAgIGlmIChvdmVycmlkZUFibGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYWJsZSA9IG92ZXJyaWRlQWJsZTtcblxuICAgICAgICAgICAgaWYgKCFvdmVycmlkZUFibGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9IC8vIHRvIHNhdmUgY3ljbGVzIGFzc3VtZSBub3QgYWJsZSBmb3IgYWxsIG9uIG92ZXJyaWRlXG5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWJsZSkge1xuICAgICAgICAgIGVsZS5fcHJpdmF0ZVtwYXJhbXMuZmllbGRdID0gcGFyYW1zLnZhbHVlO1xuXG4gICAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgIGNoYW5nZWRFbGVzLnB1c2goZWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGNoYW5nZWRDb2xsID0gdGhpcy5zcGF3bihjaGFuZ2VkRWxlcyk7XG4gICAgICBjaGFuZ2VkQ29sbC51cGRhdGVTdHlsZSgpOyAvLyBjaGFuZ2Ugb2Ygc3RhdGUgPT4gcG9zc2libGUgY2hhbmdlIG9mIHN0eWxlXG5cbiAgICAgIGNoYW5nZWRDb2xsLmVtaXQocGFyYW1zLmV2ZW50KTtcblxuICAgICAgaWYgKGFkZGxFdmVudHMpIHtcbiAgICAgICAgY2hhbmdlZENvbGwuZW1pdChhZGRsRXZlbnRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVmaW5lU3dpdGNoU2V0KHBhcmFtcykge1xuICBlbGVzZm4kM1twYXJhbXMuZmllbGRdID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuXG4gICAgaWYgKGVsZSkge1xuICAgICAgaWYgKHBhcmFtcy5vdmVycmlkZUZpZWxkKSB7XG4gICAgICAgIHZhciB2YWwgPSBwYXJhbXMub3ZlcnJpZGVGaWVsZChlbGUpO1xuXG4gICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVsZS5fcHJpdmF0ZVtwYXJhbXMuZmllbGRdO1xuICAgIH1cbiAgfTtcblxuICBlbGVzZm4kM1twYXJhbXMub25dID0gZGVmaW5lU3dpdGNoRnVuY3Rpb24oe1xuICAgIGV2ZW50OiBwYXJhbXMub24sXG4gICAgZmllbGQ6IHBhcmFtcy5maWVsZCxcbiAgICBhYmxlRmllbGQ6IHBhcmFtcy5hYmxlRmllbGQsXG4gICAgb3ZlcnJpZGVBYmxlOiBwYXJhbXMub3ZlcnJpZGVBYmxlLFxuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuICBlbGVzZm4kM1twYXJhbXMub2ZmXSA9IGRlZmluZVN3aXRjaEZ1bmN0aW9uKHtcbiAgICBldmVudDogcGFyYW1zLm9mZixcbiAgICBmaWVsZDogcGFyYW1zLmZpZWxkLFxuICAgIGFibGVGaWVsZDogcGFyYW1zLmFibGVGaWVsZCxcbiAgICBvdmVycmlkZUFibGU6IHBhcmFtcy5vdmVycmlkZUFibGUsXG4gICAgdmFsdWU6IGZhbHNlXG4gIH0pO1xufVxuXG5kZWZpbmVTd2l0Y2hTZXQoe1xuICBmaWVsZDogJ2xvY2tlZCcsXG4gIG92ZXJyaWRlRmllbGQ6IGZ1bmN0aW9uIG92ZXJyaWRlRmllbGQoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5jeSgpLmF1dG9sb2NrKCkgPyB0cnVlIDogdW5kZWZpbmVkO1xuICB9LFxuICBvbjogJ2xvY2snLFxuICBvZmY6ICd1bmxvY2snXG59KTtcbmRlZmluZVN3aXRjaFNldCh7XG4gIGZpZWxkOiAnZ3JhYmJhYmxlJyxcbiAgb3ZlcnJpZGVGaWVsZDogZnVuY3Rpb24gb3ZlcnJpZGVGaWVsZChlbGUpIHtcbiAgICByZXR1cm4gZWxlLmN5KCkuYXV0b3VuZ3JhYmlmeSgpIHx8IGVsZS5wYW5uYWJsZSgpID8gZmFsc2UgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIG9uOiAnZ3JhYmlmeScsXG4gIG9mZjogJ3VuZ3JhYmlmeSdcbn0pO1xuZGVmaW5lU3dpdGNoU2V0KHtcbiAgZmllbGQ6ICdzZWxlY3RlZCcsXG4gIGFibGVGaWVsZDogJ3NlbGVjdGFibGUnLFxuICBvdmVycmlkZUFibGU6IGZ1bmN0aW9uIG92ZXJyaWRlQWJsZShlbGUpIHtcbiAgICByZXR1cm4gZWxlLmN5KCkuYXV0b3Vuc2VsZWN0aWZ5KCkgPyBmYWxzZSA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgb246ICdzZWxlY3QnLFxuICBvZmY6ICd1bnNlbGVjdCdcbn0pO1xuZGVmaW5lU3dpdGNoU2V0KHtcbiAgZmllbGQ6ICdzZWxlY3RhYmxlJyxcbiAgb3ZlcnJpZGVGaWVsZDogZnVuY3Rpb24gb3ZlcnJpZGVGaWVsZChlbGUpIHtcbiAgICByZXR1cm4gZWxlLmN5KCkuYXV0b3Vuc2VsZWN0aWZ5KCkgPyBmYWxzZSA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgb246ICdzZWxlY3RpZnknLFxuICBvZmY6ICd1bnNlbGVjdGlmeSdcbn0pO1xuZWxlc2ZuJDMuZGVzZWxlY3QgPSBlbGVzZm4kMy51bnNlbGVjdDtcblxuZWxlc2ZuJDMuZ3JhYmJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG5cbiAgaWYgKGVsZSkge1xuICAgIHJldHVybiBlbGUuX3ByaXZhdGUuZ3JhYmJlZDtcbiAgfVxufTtcblxuZGVmaW5lU3dpdGNoU2V0KHtcbiAgZmllbGQ6ICdhY3RpdmUnLFxuICBvbjogJ2FjdGl2YXRlJyxcbiAgb2ZmOiAndW5hY3RpdmF0ZSdcbn0pO1xuZGVmaW5lU3dpdGNoU2V0KHtcbiAgZmllbGQ6ICdwYW5uYWJsZScsXG4gIG9uOiAncGFuaWZ5JyxcbiAgb2ZmOiAndW5wYW5pZnknXG59KTtcblxuZWxlc2ZuJDMuaW5hY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuXG4gIGlmIChlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5fcHJpdmF0ZS5hY3RpdmU7XG4gIH1cbn07XG5cbnZhciBlbGVzZm4kMiA9IHt9OyAvLyBEQUcgZnVuY3Rpb25zXG4vLy8vLy8vLy8vLy8vLy8vXG5cbnZhciBkZWZpbmVEYWdFeHRyZW1pdHkgPSBmdW5jdGlvbiBkZWZpbmVEYWdFeHRyZW1pdHkocGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbiBkYWdFeHRyZW1pdHlJbXBsKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIHZhciByZXQgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG5cbiAgICAgIGlmICghZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGlzcXVhbGlmaWVkID0gZmFsc2U7XG4gICAgICB2YXIgZWRnZXMgPSBlbGUuY29ubmVjdGVkRWRnZXMoKTtcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBlZGdlcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgZWRnZSA9IGVkZ2VzW2pdO1xuICAgICAgICB2YXIgc3JjID0gZWRnZS5zb3VyY2UoKTtcbiAgICAgICAgdmFyIHRndCA9IGVkZ2UudGFyZ2V0KCk7XG5cbiAgICAgICAgaWYgKHBhcmFtcy5ub0luY29taW5nRWRnZXMgJiYgdGd0ID09PSBlbGUgJiYgc3JjICE9PSBlbGUgfHwgcGFyYW1zLm5vT3V0Z29pbmdFZGdlcyAmJiBzcmMgPT09IGVsZSAmJiB0Z3QgIT09IGVsZSkge1xuICAgICAgICAgIGRpc3F1YWxpZmllZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFkaXNxdWFsaWZpZWQpIHtcbiAgICAgICAgcmV0LnB1c2goZWxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zcGF3bihyZXQsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH07XG59O1xuXG52YXIgZGVmaW5lRGFnT25lSG9wID0gZnVuY3Rpb24gZGVmaW5lRGFnT25lSG9wKHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIHZhciBvRWxlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gZWxlc1tpXTtcblxuICAgICAgaWYgKCFlbGUuaXNOb2RlKCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBlZGdlcyA9IGVsZS5jb25uZWN0ZWRFZGdlcygpO1xuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGVkZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBlZGdlID0gZWRnZXNbal07XG4gICAgICAgIHZhciBzcmMgPSBlZGdlLnNvdXJjZSgpO1xuICAgICAgICB2YXIgdGd0ID0gZWRnZS50YXJnZXQoKTtcblxuICAgICAgICBpZiAocGFyYW1zLm91dGdvaW5nICYmIHNyYyA9PT0gZWxlKSB7XG4gICAgICAgICAgb0VsZXMucHVzaChlZGdlKTtcbiAgICAgICAgICBvRWxlcy5wdXNoKHRndCk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFyYW1zLmluY29taW5nICYmIHRndCA9PT0gZWxlKSB7XG4gICAgICAgICAgb0VsZXMucHVzaChlZGdlKTtcbiAgICAgICAgICBvRWxlcy5wdXNoKHNyYyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zcGF3bihvRWxlcywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfTtcbn07XG5cbnZhciBkZWZpbmVEYWdBbGxIb3BzID0gZnVuY3Rpb24gZGVmaW5lRGFnQWxsSG9wcyhwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICB2YXIgc0VsZXMgPSBbXTtcbiAgICB2YXIgc0VsZXNJZHMgPSB7fTtcblxuICAgIGZvciAoOzspIHtcbiAgICAgIHZhciBuZXh0ID0gcGFyYW1zLm91dGdvaW5nID8gZWxlcy5vdXRnb2VycygpIDogZWxlcy5pbmNvbWVycygpO1xuXG4gICAgICBpZiAobmV4dC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IC8vIGRvbmUgaWYgbm9uZSBsZWZ0XG5cblxuICAgICAgdmFyIG5ld05leHQgPSBmYWxzZTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBuID0gbmV4dFtpXTtcbiAgICAgICAgdmFyIG5pZCA9IG4uaWQoKTtcblxuICAgICAgICBpZiAoIXNFbGVzSWRzW25pZF0pIHtcbiAgICAgICAgICBzRWxlc0lkc1tuaWRdID0gdHJ1ZTtcbiAgICAgICAgICBzRWxlcy5wdXNoKG4pO1xuICAgICAgICAgIG5ld05leHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghbmV3TmV4dCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gZG9uZSBpZiB0b3VjaGVkIGFsbCBvdXRnb2VycyBhbHJlYWR5XG5cblxuICAgICAgZWxlcyA9IG5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oc0VsZXMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH07XG59O1xuXG5lbGVzZm4kMi5jbGVhclRyYXZlcnNhbENhY2hlID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzW2ldLl9wcml2YXRlLnRyYXZlcnNhbENhY2hlID0gbnVsbDtcbiAgfVxufTtcblxuZXh0ZW5kKGVsZXNmbiQyLCB7XG4gIC8vIGdldCB0aGUgcm9vdCBub2RlcyBpbiB0aGUgREFHXG4gIHJvb3RzOiBkZWZpbmVEYWdFeHRyZW1pdHkoe1xuICAgIG5vSW5jb21pbmdFZGdlczogdHJ1ZVxuICB9KSxcbiAgLy8gZ2V0IHRoZSBsZWFmIG5vZGVzIGluIHRoZSBEQUdcbiAgbGVhdmVzOiBkZWZpbmVEYWdFeHRyZW1pdHkoe1xuICAgIG5vT3V0Z29pbmdFZGdlczogdHJ1ZVxuICB9KSxcbiAgLy8gbm9ybWFsbHkgY2FsbGVkIGNoaWxkcmVuIGluIGdyYXBoIHRoZW9yeVxuICAvLyB0aGVzZSBub2RlcyA9ZWRnZXM9PiBvdXRnb2luZyBub2Rlc1xuICBvdXRnb2VyczogY2FjaGUoZGVmaW5lRGFnT25lSG9wKHtcbiAgICBvdXRnb2luZzogdHJ1ZVxuICB9KSwgJ291dGdvZXJzJyksXG4gIC8vIGFrYSBEQUcgZGVzY2VuZGFudHNcbiAgc3VjY2Vzc29yczogZGVmaW5lRGFnQWxsSG9wcyh7XG4gICAgb3V0Z29pbmc6IHRydWVcbiAgfSksXG4gIC8vIG5vcm1hbGx5IGNhbGxlZCBwYXJlbnRzIGluIGdyYXBoIHRoZW9yeVxuICAvLyB0aGVzZSBub2RlcyA8PWVkZ2VzPSBpbmNvbWluZyBub2Rlc1xuICBpbmNvbWVyczogY2FjaGUoZGVmaW5lRGFnT25lSG9wKHtcbiAgICBpbmNvbWluZzogdHJ1ZVxuICB9KSwgJ2luY29tZXJzJyksXG4gIC8vIGFrYSBEQUcgYW5jZXN0b3JzXG4gIHByZWRlY2Vzc29yczogZGVmaW5lRGFnQWxsSG9wcyh7XG4gICAgaW5jb21pbmc6IHRydWVcbiAgfSlcbn0pOyAvLyBOZWlnaGJvdXJob29kIGZ1bmN0aW9uc1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuZXh0ZW5kKGVsZXNmbiQyLCB7XG4gIG5laWdoYm9yaG9vZDogY2FjaGUoZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZW1lbnRzID0gW107XG4gICAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gZm9yIGFsbCBub2Rlc1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIHZhciBjb25uZWN0ZWRFZGdlcyA9IG5vZGUuY29ubmVjdGVkRWRnZXMoKTsgLy8gZm9yIGVhY2ggY29ubmVjdGVkIGVkZ2UsIGFkZCB0aGUgZWRnZSBhbmQgdGhlIG90aGVyIG5vZGVcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb25uZWN0ZWRFZGdlcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgZWRnZSA9IGNvbm5lY3RlZEVkZ2VzW2pdO1xuICAgICAgICB2YXIgc3JjID0gZWRnZS5zb3VyY2UoKTtcbiAgICAgICAgdmFyIHRndCA9IGVkZ2UudGFyZ2V0KCk7XG4gICAgICAgIHZhciBvdGhlck5vZGUgPSBub2RlID09PSBzcmMgPyB0Z3QgOiBzcmM7IC8vIG5lZWQgY2hlY2sgaW4gY2FzZSBvZiBsb29wXG5cbiAgICAgICAgaWYgKG90aGVyTm9kZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZWxlbWVudHMucHVzaChvdGhlck5vZGVbMF0pOyAvLyBhZGQgbm9kZSAxIGhvcCBhd2F5XG4gICAgICAgIH0gLy8gYWRkIGNvbm5lY3RlZCBlZGdlXG5cblxuICAgICAgICBlbGVtZW50cy5wdXNoKGVkZ2VbMF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNwYXduKGVsZW1lbnRzLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LCAnbmVpZ2hib3Job29kJyksXG4gIGNsb3NlZE5laWdoYm9yaG9vZDogZnVuY3Rpb24gY2xvc2VkTmVpZ2hib3Job29kKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMubmVpZ2hib3Job29kKCkuYWRkKHRoaXMpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sXG4gIG9wZW5OZWlnaGJvcmhvb2Q6IGZ1bmN0aW9uIG9wZW5OZWlnaGJvcmhvb2Qoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5uZWlnaGJvcmhvb2Qoc2VsZWN0b3IpO1xuICB9XG59KTsgLy8gYWxpYXNlc1xuXG5lbGVzZm4kMi5uZWlnaGJvdXJob29kID0gZWxlc2ZuJDIubmVpZ2hib3Job29kO1xuZWxlc2ZuJDIuY2xvc2VkTmVpZ2hib3VyaG9vZCA9IGVsZXNmbiQyLmNsb3NlZE5laWdoYm9yaG9vZDtcbmVsZXNmbiQyLm9wZW5OZWlnaGJvdXJob29kID0gZWxlc2ZuJDIub3Blbk5laWdoYm9yaG9vZDsgLy8gRWRnZSBmdW5jdGlvbnNcbi8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4dGVuZChlbGVzZm4kMiwge1xuICBzb3VyY2U6IGNhY2hlKGZ1bmN0aW9uIHNvdXJjZUltcGwoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICB2YXIgc3JjO1xuXG4gICAgaWYgKGVsZSkge1xuICAgICAgc3JjID0gZWxlLl9wcml2YXRlLnNvdXJjZSB8fCBlbGUuY3koKS5jb2xsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNyYyAmJiBzZWxlY3RvciA/IHNyYy5maWx0ZXIoc2VsZWN0b3IpIDogc3JjO1xuICB9LCAnc291cmNlJyksXG4gIHRhcmdldDogY2FjaGUoZnVuY3Rpb24gdGFyZ2V0SW1wbChzZWxlY3Rvcikge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciB0Z3Q7XG5cbiAgICBpZiAoZWxlKSB7XG4gICAgICB0Z3QgPSBlbGUuX3ByaXZhdGUudGFyZ2V0IHx8IGVsZS5jeSgpLmNvbGxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGd0ICYmIHNlbGVjdG9yID8gdGd0LmZpbHRlcihzZWxlY3RvcikgOiB0Z3Q7XG4gIH0sICd0YXJnZXQnKSxcbiAgc291cmNlczogZGVmaW5lU291cmNlRnVuY3Rpb24oe1xuICAgIGF0dHI6ICdzb3VyY2UnXG4gIH0pLFxuICB0YXJnZXRzOiBkZWZpbmVTb3VyY2VGdW5jdGlvbih7XG4gICAgYXR0cjogJ3RhcmdldCdcbiAgfSlcbn0pO1xuXG5mdW5jdGlvbiBkZWZpbmVTb3VyY2VGdW5jdGlvbihwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNvdXJjZUltcGwoc2VsZWN0b3IpIHtcbiAgICB2YXIgc291cmNlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIHZhciBzcmMgPSBlbGUuX3ByaXZhdGVbcGFyYW1zLmF0dHJdO1xuXG4gICAgICBpZiAoc3JjKSB7XG4gICAgICAgIHNvdXJjZXMucHVzaChzcmMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNwYXduKHNvdXJjZXMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH07XG59XG5cbmV4dGVuZChlbGVzZm4kMiwge1xuICBlZGdlc1dpdGg6IGNhY2hlKGRlZmluZUVkZ2VzV2l0aEZ1bmN0aW9uKCksICdlZGdlc1dpdGgnKSxcbiAgZWRnZXNUbzogY2FjaGUoZGVmaW5lRWRnZXNXaXRoRnVuY3Rpb24oe1xuICAgIHRoaXNJc1NyYzogdHJ1ZVxuICB9KSwgJ2VkZ2VzVG8nKVxufSk7XG5cbmZ1bmN0aW9uIGRlZmluZUVkZ2VzV2l0aEZ1bmN0aW9uKHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24gZWRnZXNXaXRoSW1wbChvdGhlck5vZGVzKSB7XG4gICAgdmFyIGVsZW1lbnRzID0gW107XG4gICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgICB2YXIgcCA9IHBhcmFtcyB8fCB7fTsgLy8gZ2V0IGVsZW1lbnRzIGlmIGEgc2VsZWN0b3IgaXMgc3BlY2lmaWVkXG5cbiAgICBpZiAoc3RyaW5nKG90aGVyTm9kZXMpKSB7XG4gICAgICBvdGhlck5vZGVzID0gY3kuJChvdGhlck5vZGVzKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBoID0gMDsgaCA8IG90aGVyTm9kZXMubGVuZ3RoOyBoKyspIHtcbiAgICAgIHZhciBlZGdlcyA9IG90aGVyTm9kZXNbaF0uX3ByaXZhdGUuZWRnZXM7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tpXTtcbiAgICAgICAgdmFyIGVkZ2VEYXRhID0gZWRnZS5fcHJpdmF0ZS5kYXRhO1xuICAgICAgICB2YXIgdGhpc1RvT3RoZXIgPSB0aGlzLmhhc0VsZW1lbnRXaXRoSWQoZWRnZURhdGEuc291cmNlKSAmJiBvdGhlck5vZGVzLmhhc0VsZW1lbnRXaXRoSWQoZWRnZURhdGEudGFyZ2V0KTtcbiAgICAgICAgdmFyIG90aGVyVG9UaGlzID0gb3RoZXJOb2Rlcy5oYXNFbGVtZW50V2l0aElkKGVkZ2VEYXRhLnNvdXJjZSkgJiYgdGhpcy5oYXNFbGVtZW50V2l0aElkKGVkZ2VEYXRhLnRhcmdldCk7XG4gICAgICAgIHZhciBlZGdlQ29ubmVjdHNUaGlzQW5kT3RoZXIgPSB0aGlzVG9PdGhlciB8fCBvdGhlclRvVGhpcztcblxuICAgICAgICBpZiAoIWVkZ2VDb25uZWN0c1RoaXNBbmRPdGhlcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHAudGhpc0lzU3JjIHx8IHAudGhpc0lzVGd0KSB7XG4gICAgICAgICAgaWYgKHAudGhpc0lzU3JjICYmICF0aGlzVG9PdGhlcikge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHAudGhpc0lzVGd0ICYmICFvdGhlclRvVGhpcykge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudHMucHVzaChlZGdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zcGF3bihlbGVtZW50cywgdHJ1ZSk7XG4gIH07XG59XG5cbmV4dGVuZChlbGVzZm4kMiwge1xuICBjb25uZWN0ZWRFZGdlczogY2FjaGUoZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgdmFyIHJldEVsZXMgPSBbXTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gZWxlc1tpXTtcblxuICAgICAgaWYgKCFub2RlLmlzTm9kZSgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgZWRnZXMgPSBub2RlLl9wcml2YXRlLmVkZ2VzO1xuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGVkZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBlZGdlID0gZWRnZXNbal07XG4gICAgICAgIHJldEVsZXMucHVzaChlZGdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zcGF3bihyZXRFbGVzLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LCAnY29ubmVjdGVkRWRnZXMnKSxcbiAgY29ubmVjdGVkTm9kZXM6IGNhY2hlKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHZhciByZXRFbGVzID0gW107XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWRnZSA9IGVsZXNbaV07XG5cbiAgICAgIGlmICghZWRnZS5pc0VkZ2UoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcmV0RWxlcy5wdXNoKGVkZ2Uuc291cmNlKClbMF0pO1xuICAgICAgcmV0RWxlcy5wdXNoKGVkZ2UudGFyZ2V0KClbMF0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNwYXduKHJldEVsZXMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sICdjb25uZWN0ZWROb2RlcycpLFxuICBwYXJhbGxlbEVkZ2VzOiBjYWNoZShkZWZpbmVQYXJhbGxlbEVkZ2VzRnVuY3Rpb24oKSwgJ3BhcmFsbGVsRWRnZXMnKSxcbiAgY29kaXJlY3RlZEVkZ2VzOiBjYWNoZShkZWZpbmVQYXJhbGxlbEVkZ2VzRnVuY3Rpb24oe1xuICAgIGNvZGlyZWN0ZWQ6IHRydWVcbiAgfSksICdjb2RpcmVjdGVkRWRnZXMnKVxufSk7XG5cbmZ1bmN0aW9uIGRlZmluZVBhcmFsbGVsRWRnZXNGdW5jdGlvbihwYXJhbXMpIHtcbiAgdmFyIGRlZmF1bHRzID0ge1xuICAgIGNvZGlyZWN0ZWQ6IGZhbHNlXG4gIH07XG4gIHBhcmFtcyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIHBhcmFtcyk7XG4gIHJldHVybiBmdW5jdGlvbiBwYXJhbGxlbEVkZ2VzSW1wbChzZWxlY3Rvcikge1xuICAgIC8vIG1pY3JvLW9wdGltaXNlZCBmb3IgcmVuZGVyZXJcbiAgICB2YXIgZWxlbWVudHMgPSBbXTtcbiAgICB2YXIgZWRnZXMgPSB0aGlzLmVkZ2VzKCk7XG4gICAgdmFyIHAgPSBwYXJhbXM7IC8vIGxvb2sgYXQgYWxsIHRoZSBlZGdlcyBpbiB0aGUgY29sbGVjdGlvblxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVkZ2UxID0gZWRnZXNbaV07XG4gICAgICB2YXIgZWRnZTFfcCA9IGVkZ2UxLl9wcml2YXRlO1xuICAgICAgdmFyIHNyYzEgPSBlZGdlMV9wLnNvdXJjZTtcbiAgICAgIHZhciBzcmNpZDEgPSBzcmMxLl9wcml2YXRlLmRhdGEuaWQ7XG4gICAgICB2YXIgdGd0aWQxID0gZWRnZTFfcC5kYXRhLnRhcmdldDtcbiAgICAgIHZhciBzcmNFZGdlczEgPSBzcmMxLl9wcml2YXRlLmVkZ2VzOyAvLyBsb29rIGF0IGVkZ2VzIGNvbm5lY3RlZCB0byB0aGUgc3JjIG5vZGUgb2YgdGhpcyBlZGdlXG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3JjRWRnZXMxLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBlZGdlMiA9IHNyY0VkZ2VzMVtqXTtcbiAgICAgICAgdmFyIGVkZ2UyZGF0YSA9IGVkZ2UyLl9wcml2YXRlLmRhdGE7XG4gICAgICAgIHZhciB0Z3RpZDIgPSBlZGdlMmRhdGEudGFyZ2V0O1xuICAgICAgICB2YXIgc3JjaWQyID0gZWRnZTJkYXRhLnNvdXJjZTtcbiAgICAgICAgdmFyIGNvZGlyZWN0ZWQgPSB0Z3RpZDIgPT09IHRndGlkMSAmJiBzcmNpZDIgPT09IHNyY2lkMTtcbiAgICAgICAgdmFyIG9wcGRpcmVjdGVkID0gc3JjaWQxID09PSB0Z3RpZDIgJiYgdGd0aWQxID09PSBzcmNpZDI7XG5cbiAgICAgICAgaWYgKHAuY29kaXJlY3RlZCAmJiBjb2RpcmVjdGVkIHx8ICFwLmNvZGlyZWN0ZWQgJiYgKGNvZGlyZWN0ZWQgfHwgb3BwZGlyZWN0ZWQpKSB7XG4gICAgICAgICAgZWxlbWVudHMucHVzaChlZGdlMik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zcGF3bihlbGVtZW50cywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfTtcbn0gLy8gTWlzYyBmdW5jdGlvbnNcbi8vLy8vLy8vLy8vLy8vLy8vXG5cblxuZXh0ZW5kKGVsZXNmbiQyLCB7XG4gIGNvbXBvbmVudHM6IGZ1bmN0aW9uIGNvbXBvbmVudHMocm9vdCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgY3kgPSBzZWxmLmN5KCk7XG4gICAgdmFyIHZpc2l0ZWQgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgdmFyIHVudmlzaXRlZCA9IHJvb3QgPT0gbnVsbCA/IHNlbGYubm9kZXMoKSA6IHJvb3Qubm9kZXMoKTtcbiAgICB2YXIgY29tcG9uZW50cyA9IFtdO1xuXG4gICAgaWYgKHJvb3QgIT0gbnVsbCAmJiB1bnZpc2l0ZWQuZW1wdHkoKSkge1xuICAgICAgLy8gcm9vdCBtYXkgY29udGFpbiBvbmx5IGVkZ2VzXG4gICAgICB1bnZpc2l0ZWQgPSByb290LnNvdXJjZXMoKTsgLy8gZG9lc24ndCBtYXR0ZXIgd2hpY2ggbm9kZSB0byB1c2UgKHVuZGlyZWN0ZWQpLCBzbyBqdXN0IHVzZSB0aGUgc291cmNlIHNpZGVzXG4gICAgfVxuXG4gICAgdmFyIHZpc2l0SW5Db21wb25lbnQgPSBmdW5jdGlvbiB2aXNpdEluQ29tcG9uZW50KG5vZGUsIGNvbXBvbmVudCkge1xuICAgICAgdmlzaXRlZC5tZXJnZShub2RlKTtcbiAgICAgIHVudmlzaXRlZC51bm1lcmdlKG5vZGUpO1xuICAgICAgY29tcG9uZW50Lm1lcmdlKG5vZGUpO1xuICAgIH07XG5cbiAgICBpZiAodW52aXNpdGVkLmVtcHR5KCkpIHtcbiAgICAgIHJldHVybiBzZWxmLnNwYXduKCk7XG4gICAgfVxuXG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICAvLyBlYWNoIGl0ZXJhdGlvbiB5aWVsZHMgYSBjb21wb25lbnRcbiAgICAgIHZhciBjbXB0ID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgY29tcG9uZW50cy5wdXNoKGNtcHQpO1xuICAgICAgdmFyIHJvb3QgPSB1bnZpc2l0ZWRbMF07XG4gICAgICB2aXNpdEluQ29tcG9uZW50KHJvb3QsIGNtcHQpO1xuICAgICAgc2VsZi5iZnMoe1xuICAgICAgICBkaXJlY3RlZDogZmFsc2UsXG4gICAgICAgIHJvb3RzOiByb290LFxuICAgICAgICB2aXNpdDogZnVuY3Rpb24gdmlzaXQodikge1xuICAgICAgICAgIHJldHVybiB2aXNpdEluQ29tcG9uZW50KHYsIGNtcHQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNtcHQuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBub2RlLmNvbm5lY3RlZEVkZ2VzKCkuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIC8vIGNvbm5lY3RlZEVkZ2VzKCkgdXN1YWxseSBjYWNoZWRcbiAgICAgICAgICBpZiAoc2VsZi5oYXMoZSkgJiYgY21wdC5oYXMoZS5zb3VyY2UoKSkgJiYgY21wdC5oYXMoZS50YXJnZXQoKSkpIHtcbiAgICAgICAgICAgIC8vIGhhcygpIGlzIGNoZWFwXG4gICAgICAgICAgICBjbXB0Lm1lcmdlKGUpOyAvLyBmb3JFYWNoKCkgb25seSBjb25zaWRlcnMgbm9kZXMgLS0gc2V0cyBOIGF0IGNhbGwgdGltZVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgZG8ge1xuICAgICAgX2xvb3AoKTtcbiAgICB9IHdoaWxlICh1bnZpc2l0ZWQubGVuZ3RoID4gMCk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50cztcbiAgfSxcbiAgY29tcG9uZW50OiBmdW5jdGlvbiBjb21wb25lbnQoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgcmV0dXJuIGVsZS5jeSgpLm11dGFibGVFbGVtZW50cygpLmNvbXBvbmVudHMoZWxlKVswXTtcbiAgfVxufSk7XG5lbGVzZm4kMi5jb21wb25lbnRzT2YgPSBlbGVzZm4kMi5jb21wb25lbnRzO1xuXG52YXIgQ29sbGVjdGlvbiA9IGZ1bmN0aW9uIENvbGxlY3Rpb24oY3ksIGVsZW1lbnRzKSB7XG4gIHZhciB1bmlxdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuICB2YXIgcmVtb3ZlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogZmFsc2U7XG5cbiAgaWYgKGN5ID09PSB1bmRlZmluZWQpIHtcbiAgICBlcnJvcignQSBjb2xsZWN0aW9uIG11c3QgaGF2ZSBhIHJlZmVyZW5jZSB0byB0aGUgY29yZScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBtYXAgPSBuZXcgTWFwJDEoKTtcbiAgdmFyIGNyZWF0ZWRFbGVtZW50cyA9IGZhbHNlO1xuXG4gIGlmICghZWxlbWVudHMpIHtcbiAgICBlbGVtZW50cyA9IFtdO1xuICB9IGVsc2UgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDAgJiYgcGxhaW5PYmplY3QoZWxlbWVudHNbMF0pICYmICFlbGVtZW50KGVsZW1lbnRzWzBdKSkge1xuICAgIGNyZWF0ZWRFbGVtZW50cyA9IHRydWU7IC8vIG1ha2UgZWxlbWVudHMgZnJvbSBqc29uIGFuZCByZXN0b3JlIGFsbCBhdCBvbmNlIGxhdGVyXG5cbiAgICB2YXIgZWxlcyA9IFtdO1xuICAgIHZhciBlbGVzSWRzID0gbmV3IFNldCQxKCk7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGVsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdmFyIGpzb24gPSBlbGVtZW50c1tpXTtcblxuICAgICAgaWYgKGpzb24uZGF0YSA9PSBudWxsKSB7XG4gICAgICAgIGpzb24uZGF0YSA9IHt9O1xuICAgICAgfVxuXG4gICAgICB2YXIgX2RhdGEgPSBqc29uLmRhdGE7IC8vIG1ha2Ugc3VyZSBuZXdseSBjcmVhdGVkIGVsZW1lbnRzIGhhdmUgdmFsaWQgaWRzXG5cbiAgICAgIGlmIChfZGF0YS5pZCA9PSBudWxsKSB7XG4gICAgICAgIF9kYXRhLmlkID0gdXVpZCgpO1xuICAgICAgfSBlbHNlIGlmIChjeS5oYXNFbGVtZW50V2l0aElkKF9kYXRhLmlkKSB8fCBlbGVzSWRzLmhhcyhfZGF0YS5pZCkpIHtcbiAgICAgICAgY29udGludWU7IC8vIGNhbid0IGNyZWF0ZSBlbGVtZW50IGlmIHByaW9yIGlkIGFscmVhZHkgZXhpc3RzXG4gICAgICB9XG5cbiAgICAgIHZhciBlbGUgPSBuZXcgRWxlbWVudChjeSwganNvbiwgZmFsc2UpO1xuICAgICAgZWxlcy5wdXNoKGVsZSk7XG4gICAgICBlbGVzSWRzLmFkZChfZGF0YS5pZCk7XG4gICAgfVxuXG4gICAgZWxlbWVudHMgPSBlbGVzO1xuICB9XG5cbiAgdGhpcy5sZW5ndGggPSAwO1xuXG4gIGZvciAodmFyIF9pID0gMCwgX2wgPSBlbGVtZW50cy5sZW5ndGg7IF9pIDwgX2w7IF9pKyspIHtcbiAgICB2YXIgZWxlbWVudCQxID0gZWxlbWVudHNbX2ldWzBdOyAvLyBbMF0gaW4gY2FzZSBlbGVtZW50cyBpcyBhbiBhcnJheSBvZiBjb2xsZWN0aW9ucywgcmF0aGVyIHRoYW4gYXJyYXkgb2YgZWxlbWVudHNcblxuICAgIGlmIChlbGVtZW50JDEgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGlkID0gZWxlbWVudCQxLl9wcml2YXRlLmRhdGEuaWQ7XG5cbiAgICBpZiAoIXVuaXF1ZSB8fCAhbWFwLmhhcyhpZCkpIHtcbiAgICAgIGlmICh1bmlxdWUpIHtcbiAgICAgICAgbWFwLnNldChpZCwge1xuICAgICAgICAgIGluZGV4OiB0aGlzLmxlbmd0aCxcbiAgICAgICAgICBlbGU6IGVsZW1lbnQkMVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpc1t0aGlzLmxlbmd0aF0gPSBlbGVtZW50JDE7XG4gICAgICB0aGlzLmxlbmd0aCsrO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMuX3ByaXZhdGUgPSB7XG4gICAgZWxlczogdGhpcyxcbiAgICBjeTogY3ksXG5cbiAgICBnZXQgbWFwKCkge1xuICAgICAgaWYgKHRoaXMubGF6eU1hcCA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMucmVidWlsZE1hcCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5sYXp5TWFwO1xuICAgIH0sXG5cbiAgICBzZXQgbWFwKG0pIHtcbiAgICAgIHRoaXMubGF6eU1hcCA9IG07XG4gICAgfSxcblxuICAgIHJlYnVpbGRNYXA6IGZ1bmN0aW9uIHJlYnVpbGRNYXAoKSB7XG4gICAgICB2YXIgbSA9IHRoaXMubGF6eU1hcCA9IG5ldyBNYXAkMSgpO1xuICAgICAgdmFyIGVsZXMgPSB0aGlzLmVsZXM7XG5cbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGVsZXMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICB2YXIgX2VsZSA9IGVsZXNbX2kyXTtcbiAgICAgICAgbS5zZXQoX2VsZS5pZCgpLCB7XG4gICAgICAgICAgaW5kZXg6IF9pMixcbiAgICAgICAgICBlbGU6IF9lbGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGlmICh1bmlxdWUpIHtcbiAgICB0aGlzLl9wcml2YXRlLm1hcCA9IG1hcDtcbiAgfSAvLyByZXN0b3JlIHRoZSBlbGVtZW50cyBpZiB3ZSBjcmVhdGVkIHRoZW0gZnJvbSBqc29uXG5cblxuICBpZiAoY3JlYXRlZEVsZW1lbnRzICYmICFyZW1vdmVkKSB7XG4gICAgdGhpcy5yZXN0b3JlKCk7XG4gIH1cbn07IC8vIEZ1bmN0aW9uc1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8ga2VlcCB0aGUgcHJvdG90eXBlcyBpbiBzeW5jIChhbiBlbGVtZW50IGhhcyB0aGUgc2FtZSBmdW5jdGlvbnMgYXMgYSBjb2xsZWN0aW9uKVxuLy8gYW5kIHVzZSBlbGVmbiBhbmQgZWxlc2ZuIGFzIHNob3J0aGFuZHMgdG8gdGhlIHByb3RvdHlwZXNcblxuXG52YXIgZWxlc2ZuJDEgPSBFbGVtZW50LnByb3RvdHlwZSA9IENvbGxlY3Rpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShBcnJheS5wcm90b3R5cGUpO1xuXG5lbGVzZm4kMS5pbnN0YW5jZVN0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdjb2xsZWN0aW9uJztcbn07XG5cbmVsZXNmbiQxLnNwYXduID0gZnVuY3Rpb24gKGVsZXMsIHVuaXF1ZSkge1xuICByZXR1cm4gbmV3IENvbGxlY3Rpb24odGhpcy5jeSgpLCBlbGVzLCB1bmlxdWUpO1xufTtcblxuZWxlc2ZuJDEuc3Bhd25TZWxmID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5zcGF3bih0aGlzKTtcbn07XG5cbmVsZXNmbiQxLmN5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5jeTtcbn07XG5cbmVsZXNmbiQxLnJlbmRlcmVyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5jeS5yZW5kZXJlcigpO1xufTtcblxuZWxlc2ZuJDEuZWxlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXNbMF07XG59O1xuXG5lbGVzZm4kMS5jb2xsZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICBpZiAoY29sbGVjdGlvbih0aGlzKSkge1xuICAgIHJldHVybiB0aGlzO1xuICB9IGVsc2Uge1xuICAgIC8vIGFuIGVsZW1lbnRcbiAgICByZXR1cm4gbmV3IENvbGxlY3Rpb24odGhpcy5fcHJpdmF0ZS5jeSwgW3RoaXNdKTtcbiAgfVxufTtcblxuZWxlc2ZuJDEudW5pcXVlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IENvbGxlY3Rpb24odGhpcy5fcHJpdmF0ZS5jeSwgdGhpcywgdHJ1ZSk7XG59O1xuXG5lbGVzZm4kMS5oYXNFbGVtZW50V2l0aElkID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlkID0gJycgKyBpZDsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcblxuICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5tYXAuaGFzKGlkKTtcbn07XG5cbmVsZXNmbiQxLmdldEVsZW1lbnRCeUlkID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlkID0gJycgKyBpZDsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcblxuICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuXG4gIHZhciBlbnRyeSA9IHRoaXMuX3ByaXZhdGUubWFwLmdldChpZCk7XG5cbiAgcmV0dXJuIGVudHJ5ID8gZW50cnkuZWxlIDogbmV3IENvbGxlY3Rpb24oY3kpOyAvLyBnZXQgZWxlIG9yIGVtcHR5IGNvbGxlY3Rpb25cbn07XG5cbmVsZXNmbiQxLiRpZCA9IGVsZXNmbiQxLmdldEVsZW1lbnRCeUlkO1xuXG5lbGVzZm4kMS5wb29sSW5kZXggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gIHZhciBlbGVzID0gY3kuX3ByaXZhdGUuZWxlbWVudHM7XG4gIHZhciBpZCA9IHRoaXNbMF0uX3ByaXZhdGUuZGF0YS5pZDtcbiAgcmV0dXJuIGVsZXMuX3ByaXZhdGUubWFwLmdldChpZCkuaW5kZXg7XG59O1xuXG5lbGVzZm4kMS5pbmRleE9mID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgaWQgPSBlbGVbMF0uX3ByaXZhdGUuZGF0YS5pZDtcbiAgcmV0dXJuIHRoaXMuX3ByaXZhdGUubWFwLmdldChpZCkuaW5kZXg7XG59O1xuXG5lbGVzZm4kMS5pbmRleE9mSWQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgaWQgPSAnJyArIGlkOyAvLyBpZCBtdXN0IGJlIHN0cmluZ1xuXG4gIHJldHVybiB0aGlzLl9wcml2YXRlLm1hcC5nZXQoaWQpLmluZGV4O1xufTtcblxuZWxlc2ZuJDEuanNvbiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGVsZSA9IHRoaXMuZWxlbWVudCgpO1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG5cbiAgaWYgKGVsZSA9PSBudWxsICYmIG9iaikge1xuICAgIHJldHVybiB0aGlzO1xuICB9IC8vIGNhbid0IHNldCB0byBubyBlbGVzXG5cblxuICBpZiAoZWxlID09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IC8vIGNhbid0IGdldCBmcm9tIG5vIGVsZXNcblxuXG4gIHZhciBwID0gZWxlLl9wcml2YXRlO1xuXG4gIGlmIChwbGFpbk9iamVjdChvYmopKSB7XG4gICAgLy8gc2V0XG4gICAgY3kuc3RhcnRCYXRjaCgpO1xuXG4gICAgaWYgKG9iai5kYXRhKSB7XG4gICAgICBlbGUuZGF0YShvYmouZGF0YSk7XG4gICAgICB2YXIgX2RhdGEyID0gcC5kYXRhO1xuXG4gICAgICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgICAgIC8vIHNvdXJjZSBhbmQgdGFyZ2V0IGFyZSBpbW11dGFibGUgdmlhIGRhdGEoKVxuICAgICAgICB2YXIgbW92ZSA9IGZhbHNlO1xuICAgICAgICB2YXIgc3BlYyA9IHt9O1xuICAgICAgICB2YXIgc3JjID0gb2JqLmRhdGEuc291cmNlO1xuICAgICAgICB2YXIgdGd0ID0gb2JqLmRhdGEudGFyZ2V0O1xuXG4gICAgICAgIGlmIChzcmMgIT0gbnVsbCAmJiBzcmMgIT0gX2RhdGEyLnNvdXJjZSkge1xuICAgICAgICAgIHNwZWMuc291cmNlID0gJycgKyBzcmM7IC8vIGlkIG11c3QgYmUgc3RyaW5nXG5cbiAgICAgICAgICBtb3ZlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0Z3QgIT0gbnVsbCAmJiB0Z3QgIT0gX2RhdGEyLnRhcmdldCkge1xuICAgICAgICAgIHNwZWMudGFyZ2V0ID0gJycgKyB0Z3Q7IC8vIGlkIG11c3QgYmUgc3RyaW5nXG5cbiAgICAgICAgICBtb3ZlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb3ZlKSB7XG4gICAgICAgICAgZWxlID0gZWxlLm1vdmUoc3BlYyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHBhcmVudCBpcyBpbW11dGFibGUgdmlhIGRhdGEoKVxuICAgICAgICB2YXIgbmV3UGFyZW50VmFsU3BlY2QgPSAoJ3BhcmVudCcgaW4gb2JqLmRhdGEpO1xuICAgICAgICB2YXIgcGFyZW50ID0gb2JqLmRhdGEucGFyZW50O1xuXG4gICAgICAgIGlmIChuZXdQYXJlbnRWYWxTcGVjZCAmJiAocGFyZW50ICE9IG51bGwgfHwgX2RhdGEyLnBhcmVudCAhPSBudWxsKSAmJiBwYXJlbnQgIT0gX2RhdGEyLnBhcmVudCkge1xuICAgICAgICAgIGlmIChwYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gY2FuJ3Qgc2V0IHVuZGVmaW5lZCBpbXBlcmF0aXZlbHksIHNvIHVzZSBudWxsXG4gICAgICAgICAgICBwYXJlbnQgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcGFyZW50ID0gJycgKyBwYXJlbnQ7IC8vIGlkIG11c3QgYmUgc3RyaW5nXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZWxlID0gZWxlLm1vdmUoe1xuICAgICAgICAgICAgcGFyZW50OiBwYXJlbnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvYmoucG9zaXRpb24pIHtcbiAgICAgIGVsZS5wb3NpdGlvbihvYmoucG9zaXRpb24pO1xuICAgIH0gLy8gaWdub3JlIGdyb3VwIC0tIGltbXV0YWJsZVxuXG5cbiAgICB2YXIgY2hlY2tTd2l0Y2ggPSBmdW5jdGlvbiBjaGVja1N3aXRjaChrLCB0cnVlRm5OYW1lLCBmYWxzZUZuTmFtZSkge1xuICAgICAgdmFyIG9ial9rID0gb2JqW2tdO1xuXG4gICAgICBpZiAob2JqX2sgIT0gbnVsbCAmJiBvYmpfayAhPT0gcFtrXSkge1xuICAgICAgICBpZiAob2JqX2spIHtcbiAgICAgICAgICBlbGVbdHJ1ZUZuTmFtZV0oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVbZmFsc2VGbk5hbWVdKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY2hlY2tTd2l0Y2goJ3JlbW92ZWQnLCAncmVtb3ZlJywgJ3Jlc3RvcmUnKTtcbiAgICBjaGVja1N3aXRjaCgnc2VsZWN0ZWQnLCAnc2VsZWN0JywgJ3Vuc2VsZWN0Jyk7XG4gICAgY2hlY2tTd2l0Y2goJ3NlbGVjdGFibGUnLCAnc2VsZWN0aWZ5JywgJ3Vuc2VsZWN0aWZ5Jyk7XG4gICAgY2hlY2tTd2l0Y2goJ2xvY2tlZCcsICdsb2NrJywgJ3VubG9jaycpO1xuICAgIGNoZWNrU3dpdGNoKCdncmFiYmFibGUnLCAnZ3JhYmlmeScsICd1bmdyYWJpZnknKTtcbiAgICBjaGVja1N3aXRjaCgncGFubmFibGUnLCAncGFuaWZ5JywgJ3VucGFuaWZ5Jyk7XG5cbiAgICBpZiAob2JqLmNsYXNzZXMgIT0gbnVsbCkge1xuICAgICAgZWxlLmNsYXNzZXMob2JqLmNsYXNzZXMpO1xuICAgIH1cblxuICAgIGN5LmVuZEJhdGNoKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gZWxzZSBpZiAob2JqID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBnZXRcbiAgICB2YXIganNvbiA9IHtcbiAgICAgIGRhdGE6IGNvcHkocC5kYXRhKSxcbiAgICAgIHBvc2l0aW9uOiBjb3B5KHAucG9zaXRpb24pLFxuICAgICAgZ3JvdXA6IHAuZ3JvdXAsXG4gICAgICByZW1vdmVkOiBwLnJlbW92ZWQsXG4gICAgICBzZWxlY3RlZDogcC5zZWxlY3RlZCxcbiAgICAgIHNlbGVjdGFibGU6IHAuc2VsZWN0YWJsZSxcbiAgICAgIGxvY2tlZDogcC5sb2NrZWQsXG4gICAgICBncmFiYmFibGU6IHAuZ3JhYmJhYmxlLFxuICAgICAgcGFubmFibGU6IHAucGFubmFibGUsXG4gICAgICBjbGFzc2VzOiBudWxsXG4gICAgfTtcbiAgICBqc29uLmNsYXNzZXMgPSAnJztcbiAgICB2YXIgaSA9IDA7XG4gICAgcC5jbGFzc2VzLmZvckVhY2goZnVuY3Rpb24gKGNscykge1xuICAgICAgcmV0dXJuIGpzb24uY2xhc3NlcyArPSBpKysgPT09IDAgPyBjbHMgOiAnICcgKyBjbHM7XG4gICAgfSk7XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbn07XG5cbmVsZXNmbiQxLmpzb25zID0gZnVuY3Rpb24gKCkge1xuICB2YXIganNvbnMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICB2YXIganNvbiA9IGVsZS5qc29uKCk7XG4gICAganNvbnMucHVzaChqc29uKTtcbiAgfVxuXG4gIHJldHVybiBqc29ucztcbn07XG5cbmVsZXNmbiQxLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gIHZhciBlbGVzQXJyID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgdmFyIGpzb24gPSBlbGUuanNvbigpO1xuICAgIHZhciBjbG9uZSA9IG5ldyBFbGVtZW50KGN5LCBqc29uLCBmYWxzZSk7IC8vIE5CIG5vIHJlc3RvcmVcblxuICAgIGVsZXNBcnIucHVzaChjbG9uZSk7XG4gIH1cblxuICByZXR1cm4gbmV3IENvbGxlY3Rpb24oY3ksIGVsZXNBcnIpO1xufTtcblxuZWxlc2ZuJDEuY29weSA9IGVsZXNmbiQxLmNsb25lO1xuXG5lbGVzZm4kMS5yZXN0b3JlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm90aWZ5UmVuZGVyZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7XG4gIHZhciBhZGRUb1Bvb2wgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGN5ID0gc2VsZi5jeSgpO1xuICB2YXIgY3lfcCA9IGN5Ll9wcml2YXRlOyAvLyBjcmVhdGUgYXJyYXlzIG9mIG5vZGVzIGFuZCBlZGdlcywgc2luY2Ugd2UgbmVlZCB0b1xuICAvLyByZXN0b3JlIHRoZSBub2RlcyBmaXJzdFxuXG4gIHZhciBub2RlcyA9IFtdO1xuICB2YXIgZWRnZXMgPSBbXTtcbiAgdmFyIGVsZW1lbnRzO1xuXG4gIGZvciAodmFyIF9pMyA9IDAsIGwgPSBzZWxmLmxlbmd0aDsgX2kzIDwgbDsgX2kzKyspIHtcbiAgICB2YXIgZWxlID0gc2VsZltfaTNdO1xuXG4gICAgaWYgKGFkZFRvUG9vbCAmJiAhZWxlLnJlbW92ZWQoKSkge1xuICAgICAgLy8gZG9uJ3QgbmVlZCB0byBoYW5kbGUgdGhpcyBlbGVcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gLy8ga2VlcCBub2RlcyBmaXJzdCBpbiB0aGUgYXJyYXkgYW5kIGVkZ2VzIGFmdGVyXG5cblxuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIC8vIHB1dCB0byBmcm9udCBvZiBhcnJheSBpZiBub2RlXG4gICAgICBub2Rlcy5wdXNoKGVsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHB1dCB0byBlbmQgb2YgYXJyYXkgaWYgZWRnZVxuICAgICAgZWRnZXMucHVzaChlbGUpO1xuICAgIH1cbiAgfVxuXG4gIGVsZW1lbnRzID0gbm9kZXMuY29uY2F0KGVkZ2VzKTtcbiAgdmFyIGk7XG5cbiAgdmFyIHJlbW92ZUZyb21FbGVtZW50cyA9IGZ1bmN0aW9uIHJlbW92ZUZyb21FbGVtZW50cygpIHtcbiAgICBlbGVtZW50cy5zcGxpY2UoaSwgMSk7XG4gICAgaS0tO1xuICB9OyAvLyBub3csIHJlc3RvcmUgZWFjaCBlbGVtZW50XG5cblxuICBmb3IgKGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgX2VsZTIgPSBlbGVtZW50c1tpXTtcbiAgICB2YXIgX3ByaXZhdGUgPSBfZWxlMi5fcHJpdmF0ZTtcbiAgICB2YXIgX2RhdGEzID0gX3ByaXZhdGUuZGF0YTsgLy8gdGhlIHRyYXZlcnNhbCBjYWNoZSBzaG91bGQgc3RhcnQgZnJlc2ggd2hlbiBlbGUgaXMgYWRkZWRcblxuICAgIF9lbGUyLmNsZWFyVHJhdmVyc2FsQ2FjaGUoKTsgLy8gc2V0IGlkIGFuZCB2YWxpZGF0ZVxuXG5cbiAgICBpZiAoIWFkZFRvUG9vbCAmJiAhX3ByaXZhdGUucmVtb3ZlZCkgOyBlbHNlIGlmIChfZGF0YTMuaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgX2RhdGEzLmlkID0gdXVpZCgpO1xuICAgIH0gZWxzZSBpZiAobnVtYmVyJDEoX2RhdGEzLmlkKSkge1xuICAgICAgX2RhdGEzLmlkID0gJycgKyBfZGF0YTMuaWQ7IC8vIG5vdyBpdCdzIGEgc3RyaW5nXG4gICAgfSBlbHNlIGlmIChlbXB0eVN0cmluZyhfZGF0YTMuaWQpIHx8ICFzdHJpbmcoX2RhdGEzLmlkKSkge1xuICAgICAgZXJyb3IoJ0NhbiBub3QgY3JlYXRlIGVsZW1lbnQgd2l0aCBpbnZhbGlkIHN0cmluZyBJRCBgJyArIF9kYXRhMy5pZCArICdgJyk7IC8vIGNhbid0IGNyZWF0ZSBlbGVtZW50IGlmIGl0IGhhcyBlbXB0eSBzdHJpbmcgYXMgaWQgb3Igbm9uLXN0cmluZyBpZFxuXG4gICAgICByZW1vdmVGcm9tRWxlbWVudHMoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAoY3kuaGFzRWxlbWVudFdpdGhJZChfZGF0YTMuaWQpKSB7XG4gICAgICBlcnJvcignQ2FuIG5vdCBjcmVhdGUgc2Vjb25kIGVsZW1lbnQgd2l0aCBJRCBgJyArIF9kYXRhMy5pZCArICdgJyk7IC8vIGNhbid0IGNyZWF0ZSBlbGVtZW50IGlmIG9uZSBhbHJlYWR5IGhhcyB0aGF0IGlkXG5cbiAgICAgIHJlbW92ZUZyb21FbGVtZW50cygpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGlkID0gX2RhdGEzLmlkOyAvLyBpZCBpcyBmaW5hbGlzZWQsIG5vdyBsZXQncyBrZWVwIGEgcmVmXG5cbiAgICBpZiAoX2VsZTIuaXNOb2RlKCkpIHtcbiAgICAgIC8vIGV4dHJhIGNoZWNrcyBmb3Igbm9kZXNcbiAgICAgIHZhciBwb3MgPSBfcHJpdmF0ZS5wb3NpdGlvbjsgLy8gbWFrZSBzdXJlIHRoZSBub2RlcyBoYXZlIGEgZGVmaW5lZCBwb3NpdGlvblxuXG4gICAgICBpZiAocG9zLnggPT0gbnVsbCkge1xuICAgICAgICBwb3MueCA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChwb3MueSA9PSBudWxsKSB7XG4gICAgICAgIHBvcy55ID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoX2VsZTIuaXNFZGdlKCkpIHtcbiAgICAgIC8vIGV4dHJhIGNoZWNrcyBmb3IgZWRnZXNcbiAgICAgIHZhciBlZGdlID0gX2VsZTI7XG4gICAgICB2YXIgZmllbGRzID0gWydzb3VyY2UnLCAndGFyZ2V0J107XG4gICAgICB2YXIgZmllbGRzTGVuZ3RoID0gZmllbGRzLmxlbmd0aDtcbiAgICAgIHZhciBiYWRTb3VyY2VPclRhcmdldCA9IGZhbHNlO1xuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGZpZWxkc0xlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBmaWVsZCA9IGZpZWxkc1tqXTtcbiAgICAgICAgdmFyIHZhbCA9IF9kYXRhM1tmaWVsZF07XG5cbiAgICAgICAgaWYgKG51bWJlciQxKHZhbCkpIHtcbiAgICAgICAgICB2YWwgPSBfZGF0YTNbZmllbGRdID0gJycgKyBfZGF0YTNbZmllbGRdOyAvLyBub3cgc3RyaW5nXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsID09IG51bGwgfHwgdmFsID09PSAnJykge1xuICAgICAgICAgIC8vIGNhbid0IGNyZWF0ZSBpZiBzb3VyY2Ugb3IgdGFyZ2V0IGlzIG5vdCBkZWZpbmVkIHByb3Blcmx5XG4gICAgICAgICAgZXJyb3IoJ0NhbiBub3QgY3JlYXRlIGVkZ2UgYCcgKyBpZCArICdgIHdpdGggdW5zcGVjaWZpZWQgJyArIGZpZWxkKTtcbiAgICAgICAgICBiYWRTb3VyY2VPclRhcmdldCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoIWN5Lmhhc0VsZW1lbnRXaXRoSWQodmFsKSkge1xuICAgICAgICAgIC8vIGNhbid0IGNyZWF0ZSBlZGdlIGlmIG9uZSBvZiBpdHMgbm9kZXMgZG9lc24ndCBleGlzdFxuICAgICAgICAgIGVycm9yKCdDYW4gbm90IGNyZWF0ZSBlZGdlIGAnICsgaWQgKyAnYCB3aXRoIG5vbmV4aXN0YW50ICcgKyBmaWVsZCArICcgYCcgKyB2YWwgKyAnYCcpO1xuICAgICAgICAgIGJhZFNvdXJjZU9yVGFyZ2V0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYmFkU291cmNlT3JUYXJnZXQpIHtcbiAgICAgICAgcmVtb3ZlRnJvbUVsZW1lbnRzKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBjYW4ndCBjcmVhdGUgdGhpc1xuXG5cbiAgICAgIHZhciBzcmMgPSBjeS5nZXRFbGVtZW50QnlJZChfZGF0YTMuc291cmNlKTtcbiAgICAgIHZhciB0Z3QgPSBjeS5nZXRFbGVtZW50QnlJZChfZGF0YTMudGFyZ2V0KTsgLy8gb25seSBvbmUgZWRnZSBpbiBub2RlIGlmIGxvb3BcblxuICAgICAgaWYgKHNyYy5zYW1lKHRndCkpIHtcbiAgICAgICAgc3JjLl9wcml2YXRlLmVkZ2VzLnB1c2goZWRnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzcmMuX3ByaXZhdGUuZWRnZXMucHVzaChlZGdlKTtcblxuICAgICAgICB0Z3QuX3ByaXZhdGUuZWRnZXMucHVzaChlZGdlKTtcbiAgICAgIH1cblxuICAgICAgZWRnZS5fcHJpdmF0ZS5zb3VyY2UgPSBzcmM7XG4gICAgICBlZGdlLl9wcml2YXRlLnRhcmdldCA9IHRndDtcbiAgICB9IC8vIGlmIGlzIGVkZ2VcbiAgICAvLyBjcmVhdGUgbW9jayBpZHMgLyBpbmRleGVzIG1hcHMgZm9yIGVsZW1lbnQgc28gaXQgY2FuIGJlIHVzZWQgbGlrZSBjb2xsZWN0aW9uc1xuXG5cbiAgICBfcHJpdmF0ZS5tYXAgPSBuZXcgTWFwJDEoKTtcblxuICAgIF9wcml2YXRlLm1hcC5zZXQoaWQsIHtcbiAgICAgIGVsZTogX2VsZTIsXG4gICAgICBpbmRleDogMFxuICAgIH0pO1xuXG4gICAgX3ByaXZhdGUucmVtb3ZlZCA9IGZhbHNlO1xuXG4gICAgaWYgKGFkZFRvUG9vbCkge1xuICAgICAgY3kuYWRkVG9Qb29sKF9lbGUyKTtcbiAgICB9XG4gIH0gLy8gZm9yIGVhY2ggZWxlbWVudFxuICAvLyBkbyBjb21wb3VuZCBub2RlIHNhbml0eSBjaGVja3NcblxuXG4gIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG5vZGVzLmxlbmd0aDsgX2k0KyspIHtcbiAgICAvLyBlYWNoIG5vZGVcbiAgICB2YXIgbm9kZSA9IG5vZGVzW19pNF07XG4gICAgdmFyIF9kYXRhNCA9IG5vZGUuX3ByaXZhdGUuZGF0YTtcblxuICAgIGlmIChudW1iZXIkMShfZGF0YTQucGFyZW50KSkge1xuICAgICAgLy8gdGhlbiBhdXRvbWFrZSBzdHJpbmdcbiAgICAgIF9kYXRhNC5wYXJlbnQgPSAnJyArIF9kYXRhNC5wYXJlbnQ7XG4gICAgfVxuXG4gICAgdmFyIHBhcmVudElkID0gX2RhdGE0LnBhcmVudDtcbiAgICB2YXIgc3BlY2lmaWVkUGFyZW50ID0gcGFyZW50SWQgIT0gbnVsbDtcblxuICAgIGlmIChzcGVjaWZpZWRQYXJlbnQgfHwgbm9kZS5fcHJpdmF0ZS5wYXJlbnQpIHtcbiAgICAgIHZhciBwYXJlbnQgPSBub2RlLl9wcml2YXRlLnBhcmVudCA/IGN5LmNvbGxlY3Rpb24oKS5tZXJnZShub2RlLl9wcml2YXRlLnBhcmVudCkgOiBjeS5nZXRFbGVtZW50QnlJZChwYXJlbnRJZCk7XG5cbiAgICAgIGlmIChwYXJlbnQuZW1wdHkoKSkge1xuICAgICAgICAvLyBub24tZXhpc3RhbnQgcGFyZW50OyBqdXN0IHJlbW92ZSBpdFxuICAgICAgICBfZGF0YTQucGFyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIGlmIChwYXJlbnRbMF0ucmVtb3ZlZCgpKSB7XG4gICAgICAgIHdhcm4oJ05vZGUgYWRkZWQgd2l0aCBtaXNzaW5nIHBhcmVudCwgcmVmZXJlbmNlIHRvIHBhcmVudCByZW1vdmVkJyk7XG4gICAgICAgIF9kYXRhNC5wYXJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIG5vZGUuX3ByaXZhdGUucGFyZW50ID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBzZWxmQXNQYXJlbnQgPSBmYWxzZTtcbiAgICAgICAgdmFyIGFuY2VzdG9yID0gcGFyZW50O1xuXG4gICAgICAgIHdoaWxlICghYW5jZXN0b3IuZW1wdHkoKSkge1xuICAgICAgICAgIGlmIChub2RlLnNhbWUoYW5jZXN0b3IpKSB7XG4gICAgICAgICAgICAvLyBtYXJrIHNlbGYgYXMgcGFyZW50IGFuZCByZW1vdmUgZnJvbSBkYXRhXG4gICAgICAgICAgICBzZWxmQXNQYXJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgX2RhdGE0LnBhcmVudCA9IHVuZGVmaW5lZDsgLy8gcmVtb3ZlIHBhcmVudCByZWZlcmVuY2VcbiAgICAgICAgICAgIC8vIGV4aXQgb3Igd2UgbG9vcCBmb3JldmVyXG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNlbGZBc1BhcmVudCkge1xuICAgICAgICAgIC8vIGNvbm5lY3Qgd2l0aCBjaGlsZHJlblxuICAgICAgICAgIHBhcmVudFswXS5fcHJpdmF0ZS5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuXG4gICAgICAgICAgbm9kZS5fcHJpdmF0ZS5wYXJlbnQgPSBwYXJlbnRbMF07IC8vIGxldCB0aGUgY29yZSBrbm93IHdlIGhhdmUgYSBjb21wb3VuZCBncmFwaFxuXG4gICAgICAgICAgY3lfcC5oYXNDb21wb3VuZE5vZGVzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBlbHNlXG5cbiAgICB9IC8vIGlmIHNwZWNpZmllZCBwYXJlbnRcblxuICB9IC8vIGZvciBlYWNoIG5vZGVcblxuXG4gIGlmIChlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIHJlc3RvcmVkID0gZWxlbWVudHMubGVuZ3RoID09PSBzZWxmLmxlbmd0aCA/IHNlbGYgOiBuZXcgQ29sbGVjdGlvbihjeSwgZWxlbWVudHMpO1xuXG4gICAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgcmVzdG9yZWQubGVuZ3RoOyBfaTUrKykge1xuICAgICAgdmFyIF9lbGUzID0gcmVzdG9yZWRbX2k1XTtcblxuICAgICAgaWYgKF9lbGUzLmlzTm9kZSgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBhZGRpbmcgYW4gZWRnZSBpbnZhbGlkYXRlcyB0aGUgdHJhdmVyc2FsIGNhY2hlcyBmb3IgdGhlIHBhcmFsbGVsIGVkZ2VzXG5cblxuICAgICAgX2VsZTMucGFyYWxsZWxFZGdlcygpLmNsZWFyVHJhdmVyc2FsQ2FjaGUoKTsgLy8gYWRkaW5nIGFuIGVkZ2UgaW52YWxpZGF0ZXMgdGhlIHRyYXZlcnNhbCBjYWNoZSBmb3IgdGhlIGNvbm5lY3RlZCBub2Rlc1xuXG5cbiAgICAgIF9lbGUzLnNvdXJjZSgpLmNsZWFyVHJhdmVyc2FsQ2FjaGUoKTtcblxuICAgICAgX2VsZTMudGFyZ2V0KCkuY2xlYXJUcmF2ZXJzYWxDYWNoZSgpO1xuICAgIH1cblxuICAgIHZhciB0b1VwZGF0ZVN0eWxlO1xuXG4gICAgaWYgKGN5X3AuaGFzQ29tcG91bmROb2Rlcykge1xuICAgICAgdG9VcGRhdGVTdHlsZSA9IGN5LmNvbGxlY3Rpb24oKS5tZXJnZShyZXN0b3JlZCkubWVyZ2UocmVzdG9yZWQuY29ubmVjdGVkTm9kZXMoKSkubWVyZ2UocmVzdG9yZWQucGFyZW50KCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0b1VwZGF0ZVN0eWxlID0gcmVzdG9yZWQ7XG4gICAgfVxuXG4gICAgdG9VcGRhdGVTdHlsZS5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUoKS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKS51cGRhdGVTdHlsZShub3RpZnlSZW5kZXJlcik7XG5cbiAgICBpZiAobm90aWZ5UmVuZGVyZXIpIHtcbiAgICAgIHJlc3RvcmVkLmVtaXRBbmROb3RpZnkoJ2FkZCcpO1xuICAgIH0gZWxzZSBpZiAoYWRkVG9Qb29sKSB7XG4gICAgICByZXN0b3JlZC5lbWl0KCdhZGQnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2VsZjsgLy8gY2hhaW5hYmlsaXR5XG59O1xuXG5lbGVzZm4kMS5yZW1vdmVkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgcmV0dXJuIGVsZSAmJiBlbGUuX3ByaXZhdGUucmVtb3ZlZDtcbn07XG5cbmVsZXNmbiQxLmluc2lkZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIHJldHVybiBlbGUgJiYgIWVsZS5fcHJpdmF0ZS5yZW1vdmVkO1xufTtcblxuZWxlc2ZuJDEucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm90aWZ5UmVuZGVyZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7XG4gIHZhciByZW1vdmVGcm9tUG9vbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgZWxlc1RvUmVtb3ZlID0gW107XG4gIHZhciBlbGVzVG9SZW1vdmVJZHMgPSB7fTtcbiAgdmFyIGN5ID0gc2VsZi5fcHJpdmF0ZS5jeTsgLy8gYWRkIGNvbm5lY3RlZCBlZGdlc1xuXG4gIGZ1bmN0aW9uIGFkZENvbm5lY3RlZEVkZ2VzKG5vZGUpIHtcbiAgICB2YXIgZWRnZXMgPSBub2RlLl9wcml2YXRlLmVkZ2VzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgYWRkKGVkZ2VzW2ldKTtcbiAgICB9XG4gIH0gLy8gYWRkIGRlc2NlbmRhbnQgbm9kZXNcblxuXG4gIGZ1bmN0aW9uIGFkZENoaWxkcmVuKG5vZGUpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLl9wcml2YXRlLmNoaWxkcmVuO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgYWRkKGNoaWxkcmVuW2ldKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhZGQoZWxlKSB7XG4gICAgdmFyIGFscmVhZHlBZGRlZCA9IGVsZXNUb1JlbW92ZUlkc1tlbGUuaWQoKV07XG5cbiAgICBpZiAocmVtb3ZlRnJvbVBvb2wgJiYgZWxlLnJlbW92ZWQoKSB8fCBhbHJlYWR5QWRkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlc1RvUmVtb3ZlSWRzW2VsZS5pZCgpXSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgZWxlc1RvUmVtb3ZlLnB1c2goZWxlKTsgLy8gbm9kZXMgYXJlIHJlbW92ZWQgbGFzdFxuXG4gICAgICBhZGRDb25uZWN0ZWRFZGdlcyhlbGUpO1xuICAgICAgYWRkQ2hpbGRyZW4oZWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlc1RvUmVtb3ZlLnVuc2hpZnQoZWxlKTsgLy8gZWRnZXMgYXJlIHJlbW92ZWQgZmlyc3RcbiAgICB9XG4gIH0gLy8gbWFrZSB0aGUgbGlzdCBvZiBlbGVtZW50cyB0byByZW1vdmVcbiAgLy8gKG1heSBiZSByZW1vdmluZyBtb3JlIHRoYW4gc3BlY2lmaWVkIGR1ZSB0byBjb25uZWN0ZWQgZWRnZXMgZXRjKVxuXG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBzZWxmLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBlbGUgPSBzZWxmW2ldO1xuICAgIGFkZChlbGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlRWRnZVJlZihub2RlLCBlZGdlKSB7XG4gICAgdmFyIGNvbm5lY3RlZEVkZ2VzID0gbm9kZS5fcHJpdmF0ZS5lZGdlcztcbiAgICByZW1vdmVGcm9tQXJyYXkoY29ubmVjdGVkRWRnZXMsIGVkZ2UpOyAvLyByZW1vdmluZyBhbiBlZGdlcyBpbnZhbGlkYXRlcyB0aGUgdHJhdmVyc2FsIGNhY2hlIGZvciBpdHMgbm9kZXNcblxuICAgIG5vZGUuY2xlYXJUcmF2ZXJzYWxDYWNoZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlUGFyYWxsZWxSZWYocGxsRWRnZSkge1xuICAgIC8vIHJlbW92aW5nIGFuIGVkZ2UgaW52YWxpZGF0ZXMgdGhlIHRyYXZlcnNhbCBjYWNoZXMgZm9yIHRoZSBwYXJhbGxlbCBlZGdlc1xuICAgIHBsbEVkZ2UuY2xlYXJUcmF2ZXJzYWxDYWNoZSgpO1xuICB9XG5cbiAgdmFyIGFsdGVyZWRQYXJlbnRzID0gW107XG4gIGFsdGVyZWRQYXJlbnRzLmlkcyA9IHt9O1xuXG4gIGZ1bmN0aW9uIHJlbW92ZUNoaWxkUmVmKHBhcmVudCwgZWxlKSB7XG4gICAgZWxlID0gZWxlWzBdO1xuICAgIHBhcmVudCA9IHBhcmVudFswXTtcbiAgICB2YXIgY2hpbGRyZW4gPSBwYXJlbnQuX3ByaXZhdGUuY2hpbGRyZW47XG4gICAgdmFyIHBpZCA9IHBhcmVudC5pZCgpO1xuICAgIHJlbW92ZUZyb21BcnJheShjaGlsZHJlbiwgZWxlKTsgLy8gcmVtb3ZlIHBhcmVudCA9PiBjaGlsZCByZWZcblxuICAgIGVsZS5fcHJpdmF0ZS5wYXJlbnQgPSBudWxsOyAvLyByZW1vdmUgY2hpbGQgPT4gcGFyZW50IHJlZlxuXG4gICAgaWYgKCFhbHRlcmVkUGFyZW50cy5pZHNbcGlkXSkge1xuICAgICAgYWx0ZXJlZFBhcmVudHMuaWRzW3BpZF0gPSB0cnVlO1xuICAgICAgYWx0ZXJlZFBhcmVudHMucHVzaChwYXJlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHNlbGYuZGlydHlDb21wb3VuZEJvdW5kc0NhY2hlKCk7XG5cbiAgaWYgKHJlbW92ZUZyb21Qb29sKSB7XG4gICAgY3kucmVtb3ZlRnJvbVBvb2woZWxlc1RvUmVtb3ZlKTsgLy8gcmVtb3ZlIGZyb20gY29yZSBwb29sXG4gIH1cblxuICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBlbGVzVG9SZW1vdmUubGVuZ3RoOyBfaTYrKykge1xuICAgIHZhciBfZWxlNCA9IGVsZXNUb1JlbW92ZVtfaTZdO1xuXG4gICAgaWYgKF9lbGU0LmlzRWRnZSgpKSB7XG4gICAgICAvLyByZW1vdmUgcmVmZXJlbmNlcyB0byB0aGlzIGVkZ2UgaW4gaXRzIGNvbm5lY3RlZCBub2Rlc1xuICAgICAgdmFyIHNyYyA9IF9lbGU0LnNvdXJjZSgpWzBdO1xuXG4gICAgICB2YXIgdGd0ID0gX2VsZTQudGFyZ2V0KClbMF07XG5cbiAgICAgIHJlbW92ZUVkZ2VSZWYoc3JjLCBfZWxlNCk7XG4gICAgICByZW1vdmVFZGdlUmVmKHRndCwgX2VsZTQpO1xuXG4gICAgICB2YXIgcGxsRWRnZXMgPSBfZWxlNC5wYXJhbGxlbEVkZ2VzKCk7XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGxsRWRnZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIHBsbEVkZ2UgPSBwbGxFZGdlc1tqXTtcbiAgICAgICAgcmVtb3ZlUGFyYWxsZWxSZWYocGxsRWRnZSk7XG5cbiAgICAgICAgaWYgKHBsbEVkZ2UuaXNCdW5kbGVkQmV6aWVyKCkpIHtcbiAgICAgICAgICBwbGxFZGdlLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHJlbW92ZSByZWZlcmVuY2UgdG8gcGFyZW50XG4gICAgICB2YXIgcGFyZW50ID0gX2VsZTQucGFyZW50KCk7XG5cbiAgICAgIGlmIChwYXJlbnQubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHJlbW92ZUNoaWxkUmVmKHBhcmVudCwgX2VsZTQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZW1vdmVGcm9tUG9vbCkge1xuICAgICAgLy8gbWFyayBhcyByZW1vdmVkXG4gICAgICBfZWxlNC5fcHJpdmF0ZS5yZW1vdmVkID0gdHJ1ZTtcbiAgICB9XG4gIH0gLy8gY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSBjb21wb3VuZCBncmFwaCBvciBub3RcblxuXG4gIHZhciBlbGVzU3RpbGxJbnNpZGUgPSBjeS5fcHJpdmF0ZS5lbGVtZW50cztcbiAgY3kuX3ByaXZhdGUuaGFzQ29tcG91bmROb2RlcyA9IGZhbHNlO1xuXG4gIGZvciAodmFyIF9pNyA9IDA7IF9pNyA8IGVsZXNTdGlsbEluc2lkZS5sZW5ndGg7IF9pNysrKSB7XG4gICAgdmFyIF9lbGU1ID0gZWxlc1N0aWxsSW5zaWRlW19pN107XG5cbiAgICBpZiAoX2VsZTUuaXNQYXJlbnQoKSkge1xuICAgICAgY3kuX3ByaXZhdGUuaGFzQ29tcG91bmROb2RlcyA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgcmVtb3ZlZEVsZW1lbnRzID0gbmV3IENvbGxlY3Rpb24odGhpcy5jeSgpLCBlbGVzVG9SZW1vdmUpO1xuXG4gIGlmIChyZW1vdmVkRWxlbWVudHMuc2l6ZSgpID4gMCkge1xuICAgIC8vIG11c3QgbWFudWFsbHkgbm90aWZ5IHNpbmNlIHRyaWdnZXIgd29uJ3QgZG8gdGhpcyBhdXRvbWF0aWNhbGx5IG9uY2UgcmVtb3ZlZFxuICAgIGlmIChub3RpZnlSZW5kZXJlcikge1xuICAgICAgcmVtb3ZlZEVsZW1lbnRzLmVtaXRBbmROb3RpZnkoJ3JlbW92ZScpO1xuICAgIH0gZWxzZSBpZiAocmVtb3ZlRnJvbVBvb2wpIHtcbiAgICAgIHJlbW92ZWRFbGVtZW50cy5lbWl0KCdyZW1vdmUnKTtcbiAgICB9XG4gIH0gLy8gdGhlIHBhcmVudHMgd2hvIHdlcmUgbW9kaWZpZWQgYnkgdGhlIHJlbW92YWwgbmVlZCB0aGVpciBzdHlsZSB1cGRhdGVkXG5cblxuICBmb3IgKHZhciBfaTggPSAwOyBfaTggPCBhbHRlcmVkUGFyZW50cy5sZW5ndGg7IF9pOCsrKSB7XG4gICAgdmFyIF9lbGU2ID0gYWx0ZXJlZFBhcmVudHNbX2k4XTtcblxuICAgIGlmICghcmVtb3ZlRnJvbVBvb2wgfHwgIV9lbGU2LnJlbW92ZWQoKSkge1xuICAgICAgX2VsZTYudXBkYXRlU3R5bGUoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVtb3ZlZEVsZW1lbnRzO1xufTtcblxuZWxlc2ZuJDEubW92ZSA9IGZ1bmN0aW9uIChzdHJ1Y3QpIHtcbiAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgdmFyIGVsZXMgPSB0aGlzOyAvLyBqdXN0IGNsZWFuIHVwIHJlZnMsIGNhY2hlcywgZXRjLiBpbiB0aGUgc2FtZSB3YXkgYXMgd2hlbiByZW1vdmluZyBhbmQgdGhlbiByZXN0b3JpbmdcbiAgLy8gKG91ciBjYWxscyB0byByZW1vdmUvcmVzdG9yZSBkbyBub3QgcmVtb3ZlIGZyb20gdGhlIGdyYXBoIG9yIG1ha2UgZXZlbnRzKVxuXG4gIHZhciBub3RpZnlSZW5kZXJlciA9IGZhbHNlO1xuICB2YXIgbW9kaWZ5UG9vbCA9IGZhbHNlO1xuXG4gIHZhciB0b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKGlkKSB7XG4gICAgcmV0dXJuIGlkID09IG51bGwgPyBpZCA6ICcnICsgaWQ7XG4gIH07IC8vIGlkIG11c3QgYmUgc3RyaW5nXG5cblxuICBpZiAoc3RydWN0LnNvdXJjZSAhPT0gdW5kZWZpbmVkIHx8IHN0cnVjdC50YXJnZXQgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBzcmNJZCA9IHRvU3RyaW5nKHN0cnVjdC5zb3VyY2UpO1xuICAgIHZhciB0Z3RJZCA9IHRvU3RyaW5nKHN0cnVjdC50YXJnZXQpO1xuICAgIHZhciBzcmNFeGlzdHMgPSBzcmNJZCAhPSBudWxsICYmIGN5Lmhhc0VsZW1lbnRXaXRoSWQoc3JjSWQpO1xuICAgIHZhciB0Z3RFeGlzdHMgPSB0Z3RJZCAhPSBudWxsICYmIGN5Lmhhc0VsZW1lbnRXaXRoSWQodGd0SWQpO1xuXG4gICAgaWYgKHNyY0V4aXN0cyB8fCB0Z3RFeGlzdHMpIHtcbiAgICAgIGN5LmJhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gYXZvaWQgZHVwbGljYXRlIHN0eWxlIHVwZGF0ZXNcbiAgICAgICAgZWxlcy5yZW1vdmUobm90aWZ5UmVuZGVyZXIsIG1vZGlmeVBvb2wpOyAvLyBjbGVhbiB1cCByZWZzIGV0Yy5cblxuICAgICAgICBlbGVzLmVtaXRBbmROb3RpZnkoJ21vdmVvdXQnKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgICB2YXIgX2RhdGE1ID0gZWxlLl9wcml2YXRlLmRhdGE7XG5cbiAgICAgICAgICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgICAgICAgICBpZiAoc3JjRXhpc3RzKSB7XG4gICAgICAgICAgICAgIF9kYXRhNS5zb3VyY2UgPSBzcmNJZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRndEV4aXN0cykge1xuICAgICAgICAgICAgICBfZGF0YTUudGFyZ2V0ID0gdGd0SWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZWxlcy5yZXN0b3JlKG5vdGlmeVJlbmRlcmVyLCBtb2RpZnlQb29sKTsgLy8gbWFrZSBuZXcgcmVmcywgc3R5bGUsIGV0Yy5cbiAgICAgIH0pO1xuICAgICAgZWxlcy5lbWl0QW5kTm90aWZ5KCdtb3ZlJyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHN0cnVjdC5wYXJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIG1vdmUgbm9kZSB0byBuZXcgcGFyZW50XG4gICAgdmFyIHBhcmVudElkID0gdG9TdHJpbmcoc3RydWN0LnBhcmVudCk7XG4gICAgdmFyIHBhcmVudEV4aXN0cyA9IHBhcmVudElkID09PSBudWxsIHx8IGN5Lmhhc0VsZW1lbnRXaXRoSWQocGFyZW50SWQpO1xuXG4gICAgaWYgKHBhcmVudEV4aXN0cykge1xuICAgICAgdmFyIHBpZFRvQXNzaWduID0gcGFyZW50SWQgPT09IG51bGwgPyB1bmRlZmluZWQgOiBwYXJlbnRJZDtcbiAgICAgIGN5LmJhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gYXZvaWQgZHVwbGljYXRlIHN0eWxlIHVwZGF0ZXNcbiAgICAgICAgdmFyIHVwZGF0ZWQgPSBlbGVzLnJlbW92ZShub3RpZnlSZW5kZXJlciwgbW9kaWZ5UG9vbCk7IC8vIGNsZWFuIHVwIHJlZnMgZXRjLlxuXG4gICAgICAgIHVwZGF0ZWQuZW1pdEFuZE5vdGlmeSgnbW92ZW91dCcpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgICAgIHZhciBfZGF0YTYgPSBlbGUuX3ByaXZhdGUuZGF0YTtcblxuICAgICAgICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgICAgICAgIF9kYXRhNi5wYXJlbnQgPSBwaWRUb0Fzc2lnbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVkLnJlc3RvcmUobm90aWZ5UmVuZGVyZXIsIG1vZGlmeVBvb2wpOyAvLyBtYWtlIG5ldyByZWZzLCBzdHlsZSwgZXRjLlxuICAgICAgfSk7XG4gICAgICBlbGVzLmVtaXRBbmROb3RpZnkoJ21vdmUnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbltlbGVzZm4kaiwgZWxlc2ZuJGksIGVsZXNmbiRoLCBlbGVzZm4kZywgZWxlc2ZuJGYsIGRhdGEsIGVsZXNmbiRkLCBkaW1lbnNpb25zLCBlbGVzZm4kOSwgZWxlc2ZuJDgsIGVsZXNmbiQ3LCBlbGVzZm4kNiwgZWxlc2ZuJDUsIGVsZXNmbiQ0LCBlbGVzZm4kMywgZWxlc2ZuJDJdLmZvckVhY2goZnVuY3Rpb24gKHByb3BzKSB7XG4gIGV4dGVuZChlbGVzZm4kMSwgcHJvcHMpO1xufSk7XG5cbnZhciBjb3JlZm4kOSA9IHtcbiAgYWRkOiBmdW5jdGlvbiBhZGQob3B0cykge1xuICAgIHZhciBlbGVtZW50cztcbiAgICB2YXIgY3kgPSB0aGlzOyAvLyBhZGQgdGhlIGVsZW1lbnRzXG5cbiAgICBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihvcHRzKSkge1xuICAgICAgdmFyIGVsZXMgPSBvcHRzO1xuXG4gICAgICBpZiAoZWxlcy5fcHJpdmF0ZS5jeSA9PT0gY3kpIHtcbiAgICAgICAgLy8gc2FtZSBpbnN0YW5jZSA9PiBqdXN0IHJlc3RvcmVcbiAgICAgICAgZWxlbWVudHMgPSBlbGVzLnJlc3RvcmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSwgY29weSBmcm9tIGpzb25cbiAgICAgICAgdmFyIGpzb25zID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgICAganNvbnMucHVzaChlbGUuanNvbigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnRzID0gbmV3IENvbGxlY3Rpb24oY3ksIGpzb25zKTtcbiAgICAgIH1cbiAgICB9IC8vIHNwZWNpZnkgYW4gYXJyYXkgb2Ygb3B0aW9uc1xuICAgIGVsc2UgaWYgKGFycmF5KG9wdHMpKSB7XG4gICAgICB2YXIgX2pzb25zID0gb3B0cztcbiAgICAgIGVsZW1lbnRzID0gbmV3IENvbGxlY3Rpb24oY3ksIF9qc29ucyk7XG4gICAgfSAvLyBzcGVjaWZ5IHZpYSBvcHRzLm5vZGVzIGFuZCBvcHRzLmVkZ2VzXG4gICAgZWxzZSBpZiAocGxhaW5PYmplY3Qob3B0cykgJiYgKGFycmF5KG9wdHMubm9kZXMpIHx8IGFycmF5KG9wdHMuZWRnZXMpKSkge1xuICAgICAgdmFyIGVsZXNCeUdyb3VwID0gb3B0cztcbiAgICAgIHZhciBfanNvbnMyID0gW107XG4gICAgICB2YXIgZ3JzID0gWydub2RlcycsICdlZGdlcyddO1xuXG4gICAgICBmb3IgKHZhciBfaSA9IDAsIGlsID0gZ3JzLmxlbmd0aDsgX2kgPCBpbDsgX2krKykge1xuICAgICAgICB2YXIgZ3JvdXAgPSBncnNbX2ldO1xuICAgICAgICB2YXIgZWxlc0FycmF5ID0gZWxlc0J5R3JvdXBbZ3JvdXBdO1xuXG4gICAgICAgIGlmIChhcnJheShlbGVzQXJyYXkpKSB7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGpsID0gZWxlc0FycmF5Lmxlbmd0aDsgaiA8IGpsOyBqKyspIHtcbiAgICAgICAgICAgIHZhciBqc29uID0gZXh0ZW5kKHtcbiAgICAgICAgICAgICAgZ3JvdXA6IGdyb3VwXG4gICAgICAgICAgICB9LCBlbGVzQXJyYXlbal0pO1xuXG4gICAgICAgICAgICBfanNvbnMyLnB1c2goanNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnRzID0gbmV3IENvbGxlY3Rpb24oY3ksIF9qc29uczIpO1xuICAgIH0gLy8gc3BlY2lmeSBvcHRpb25zIGZvciBvbmUgZWxlbWVudFxuICAgIGVsc2Uge1xuICAgICAgdmFyIF9qc29uID0gb3B0cztcbiAgICAgIGVsZW1lbnRzID0gbmV3IEVsZW1lbnQoY3ksIF9qc29uKS5jb2xsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9LFxuICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShjb2xsZWN0aW9uKSB7XG4gICAgaWYgKGVsZW1lbnRPckNvbGxlY3Rpb24oY29sbGVjdGlvbikpIDsgZWxzZSBpZiAoc3RyaW5nKGNvbGxlY3Rpb24pKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBjb2xsZWN0aW9uO1xuICAgICAgY29sbGVjdGlvbiA9IHRoaXMuJChzZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbGxlY3Rpb24ucmVtb3ZlKCk7XG4gIH1cbn07XG5cbi8qIGdsb2JhbCBGbG9hdDMyQXJyYXkgKi9cblxuLyohIEJlemllciBjdXJ2ZSBmdW5jdGlvbiBnZW5lcmF0b3IuIENvcHlyaWdodCBHYWV0YW4gUmVuYXVkZWF1LiBNSVQgTGljZW5zZTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NSVRfTGljZW5zZSAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVDdWJpY0JlemllcihtWDEsIG1ZMSwgbVgyLCBtWTIpIHtcbiAgdmFyIE5FV1RPTl9JVEVSQVRJT05TID0gNCxcbiAgICAgIE5FV1RPTl9NSU5fU0xPUEUgPSAwLjAwMSxcbiAgICAgIFNVQkRJVklTSU9OX1BSRUNJU0lPTiA9IDAuMDAwMDAwMSxcbiAgICAgIFNVQkRJVklTSU9OX01BWF9JVEVSQVRJT05TID0gMTAsXG4gICAgICBrU3BsaW5lVGFibGVTaXplID0gMTEsXG4gICAgICBrU2FtcGxlU3RlcFNpemUgPSAxLjAgLyAoa1NwbGluZVRhYmxlU2l6ZSAtIDEuMCksXG4gICAgICBmbG9hdDMyQXJyYXlTdXBwb3J0ZWQgPSB0eXBlb2YgRmxvYXQzMkFycmF5ICE9PSAndW5kZWZpbmVkJztcbiAgLyogTXVzdCBjb250YWluIGZvdXIgYXJndW1lbnRzLiAqL1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSA0KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qIEFyZ3VtZW50cyBtdXN0IGJlIG51bWJlcnMuICovXG5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzW2ldICE9PSBcIm51bWJlclwiIHx8IGlzTmFOKGFyZ3VtZW50c1tpXSkgfHwgIWlzRmluaXRlKGFyZ3VtZW50c1tpXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgLyogWCB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgWzAsIDFdIHJhbmdlLiAqL1xuXG5cbiAgbVgxID0gTWF0aC5taW4obVgxLCAxKTtcbiAgbVgyID0gTWF0aC5taW4obVgyLCAxKTtcbiAgbVgxID0gTWF0aC5tYXgobVgxLCAwKTtcbiAgbVgyID0gTWF0aC5tYXgobVgyLCAwKTtcbiAgdmFyIG1TYW1wbGVWYWx1ZXMgPSBmbG9hdDMyQXJyYXlTdXBwb3J0ZWQgPyBuZXcgRmxvYXQzMkFycmF5KGtTcGxpbmVUYWJsZVNpemUpIDogbmV3IEFycmF5KGtTcGxpbmVUYWJsZVNpemUpO1xuXG4gIGZ1bmN0aW9uIEEoYUExLCBhQTIpIHtcbiAgICByZXR1cm4gMS4wIC0gMy4wICogYUEyICsgMy4wICogYUExO1xuICB9XG5cbiAgZnVuY3Rpb24gQihhQTEsIGFBMikge1xuICAgIHJldHVybiAzLjAgKiBhQTIgLSA2LjAgKiBhQTE7XG4gIH1cblxuICBmdW5jdGlvbiBDKGFBMSkge1xuICAgIHJldHVybiAzLjAgKiBhQTE7XG4gIH1cblxuICBmdW5jdGlvbiBjYWxjQmV6aWVyKGFULCBhQTEsIGFBMikge1xuICAgIHJldHVybiAoKEEoYUExLCBhQTIpICogYVQgKyBCKGFBMSwgYUEyKSkgKiBhVCArIEMoYUExKSkgKiBhVDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNsb3BlKGFULCBhQTEsIGFBMikge1xuICAgIHJldHVybiAzLjAgKiBBKGFBMSwgYUEyKSAqIGFUICogYVQgKyAyLjAgKiBCKGFBMSwgYUEyKSAqIGFUICsgQyhhQTEpO1xuICB9XG5cbiAgZnVuY3Rpb24gbmV3dG9uUmFwaHNvbkl0ZXJhdGUoYVgsIGFHdWVzc1QpIHtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgTkVXVE9OX0lURVJBVElPTlM7ICsrX2kpIHtcbiAgICAgIHZhciBjdXJyZW50U2xvcGUgPSBnZXRTbG9wZShhR3Vlc3NULCBtWDEsIG1YMik7XG5cbiAgICAgIGlmIChjdXJyZW50U2xvcGUgPT09IDAuMCkge1xuICAgICAgICByZXR1cm4gYUd1ZXNzVDtcbiAgICAgIH1cblxuICAgICAgdmFyIGN1cnJlbnRYID0gY2FsY0JlemllcihhR3Vlc3NULCBtWDEsIG1YMikgLSBhWDtcbiAgICAgIGFHdWVzc1QgLT0gY3VycmVudFggLyBjdXJyZW50U2xvcGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFHdWVzc1Q7XG4gIH1cblxuICBmdW5jdGlvbiBjYWxjU2FtcGxlVmFsdWVzKCkge1xuICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGtTcGxpbmVUYWJsZVNpemU7ICsrX2kyKSB7XG4gICAgICBtU2FtcGxlVmFsdWVzW19pMl0gPSBjYWxjQmV6aWVyKF9pMiAqIGtTYW1wbGVTdGVwU2l6ZSwgbVgxLCBtWDIpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGJpbmFyeVN1YmRpdmlkZShhWCwgYUEsIGFCKSB7XG4gICAgdmFyIGN1cnJlbnRYLFxuICAgICAgICBjdXJyZW50VCxcbiAgICAgICAgaSA9IDA7XG5cbiAgICBkbyB7XG4gICAgICBjdXJyZW50VCA9IGFBICsgKGFCIC0gYUEpIC8gMi4wO1xuICAgICAgY3VycmVudFggPSBjYWxjQmV6aWVyKGN1cnJlbnRULCBtWDEsIG1YMikgLSBhWDtcblxuICAgICAgaWYgKGN1cnJlbnRYID4gMC4wKSB7XG4gICAgICAgIGFCID0gY3VycmVudFQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhQSA9IGN1cnJlbnRUO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKE1hdGguYWJzKGN1cnJlbnRYKSA+IFNVQkRJVklTSU9OX1BSRUNJU0lPTiAmJiArK2kgPCBTVUJESVZJU0lPTl9NQVhfSVRFUkFUSU9OUyk7XG5cbiAgICByZXR1cm4gY3VycmVudFQ7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRURm9yWChhWCkge1xuICAgIHZhciBpbnRlcnZhbFN0YXJ0ID0gMC4wLFxuICAgICAgICBjdXJyZW50U2FtcGxlID0gMSxcbiAgICAgICAgbGFzdFNhbXBsZSA9IGtTcGxpbmVUYWJsZVNpemUgLSAxO1xuXG4gICAgZm9yICg7IGN1cnJlbnRTYW1wbGUgIT09IGxhc3RTYW1wbGUgJiYgbVNhbXBsZVZhbHVlc1tjdXJyZW50U2FtcGxlXSA8PSBhWDsgKytjdXJyZW50U2FtcGxlKSB7XG4gICAgICBpbnRlcnZhbFN0YXJ0ICs9IGtTYW1wbGVTdGVwU2l6ZTtcbiAgICB9XG5cbiAgICAtLWN1cnJlbnRTYW1wbGU7XG4gICAgdmFyIGRpc3QgPSAoYVggLSBtU2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGVdKSAvIChtU2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGUgKyAxXSAtIG1TYW1wbGVWYWx1ZXNbY3VycmVudFNhbXBsZV0pLFxuICAgICAgICBndWVzc0ZvclQgPSBpbnRlcnZhbFN0YXJ0ICsgZGlzdCAqIGtTYW1wbGVTdGVwU2l6ZSxcbiAgICAgICAgaW5pdGlhbFNsb3BlID0gZ2V0U2xvcGUoZ3Vlc3NGb3JULCBtWDEsIG1YMik7XG5cbiAgICBpZiAoaW5pdGlhbFNsb3BlID49IE5FV1RPTl9NSU5fU0xPUEUpIHtcbiAgICAgIHJldHVybiBuZXd0b25SYXBoc29uSXRlcmF0ZShhWCwgZ3Vlc3NGb3JUKTtcbiAgICB9IGVsc2UgaWYgKGluaXRpYWxTbG9wZSA9PT0gMC4wKSB7XG4gICAgICByZXR1cm4gZ3Vlc3NGb3JUO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYmluYXJ5U3ViZGl2aWRlKGFYLCBpbnRlcnZhbFN0YXJ0LCBpbnRlcnZhbFN0YXJ0ICsga1NhbXBsZVN0ZXBTaXplKTtcbiAgICB9XG4gIH1cblxuICB2YXIgX3ByZWNvbXB1dGVkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gcHJlY29tcHV0ZSgpIHtcbiAgICBfcHJlY29tcHV0ZWQgPSB0cnVlO1xuXG4gICAgaWYgKG1YMSAhPT0gbVkxIHx8IG1YMiAhPT0gbVkyKSB7XG4gICAgICBjYWxjU2FtcGxlVmFsdWVzKCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGYgPSBmdW5jdGlvbiBmKGFYKSB7XG4gICAgaWYgKCFfcHJlY29tcHV0ZWQpIHtcbiAgICAgIHByZWNvbXB1dGUoKTtcbiAgICB9XG5cbiAgICBpZiAobVgxID09PSBtWTEgJiYgbVgyID09PSBtWTIpIHtcbiAgICAgIHJldHVybiBhWDtcbiAgICB9XG5cbiAgICBpZiAoYVggPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGlmIChhWCA9PT0gMSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbGNCZXppZXIoZ2V0VEZvclgoYVgpLCBtWTEsIG1ZMik7XG4gIH07XG5cbiAgZi5nZXRDb250cm9sUG9pbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBbe1xuICAgICAgeDogbVgxLFxuICAgICAgeTogbVkxXG4gICAgfSwge1xuICAgICAgeDogbVgyLFxuICAgICAgeTogbVkyXG4gICAgfV07XG4gIH07XG5cbiAgdmFyIHN0ciA9IFwiZ2VuZXJhdGVCZXppZXIoXCIgKyBbbVgxLCBtWTEsIG1YMiwgbVkyXSArIFwiKVwiO1xuXG4gIGYudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfTtcblxuICByZXR1cm4gZjtcbn1cblxuLyohIFJ1bmdlLUt1dHRhIHNwcmluZyBwaHlzaWNzIGZ1bmN0aW9uIGdlbmVyYXRvci4gQWRhcHRlZCBmcm9tIEZyYW1lci5qcywgY29weXJpZ2h0IEtvZW4gQm9rLiBNSVQgTGljZW5zZTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NSVRfTGljZW5zZSAqL1xuXG4vKiBHaXZlbiBhIHRlbnNpb24sIGZyaWN0aW9uLCBhbmQgZHVyYXRpb24sIGEgc2ltdWxhdGlvbiBhdCA2MEZQUyB3aWxsIGZpcnN0IHJ1biB3aXRob3V0IGEgZGVmaW5lZCBkdXJhdGlvbiBpbiBvcmRlciB0byBjYWxjdWxhdGUgdGhlIGZ1bGwgcGF0aC4gQSBzZWNvbmQgcGFzc1xuICAgdGhlbiBhZGp1c3RzIHRoZSB0aW1lIGRlbHRhIC0tIHVzaW5nIHRoZSByZWxhdGlvbiBiZXR3ZWVuIGFjdHVhbCB0aW1lIGFuZCBkdXJhdGlvbiAtLSB0byBjYWxjdWxhdGUgdGhlIHBhdGggZm9yIHRoZSBkdXJhdGlvbi1jb25zdHJhaW5lZCBhbmltYXRpb24uICovXG52YXIgZ2VuZXJhdGVTcHJpbmdSSzQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIHNwcmluZ0FjY2VsZXJhdGlvbkZvclN0YXRlKHN0YXRlKSB7XG4gICAgcmV0dXJuIC1zdGF0ZS50ZW5zaW9uICogc3RhdGUueCAtIHN0YXRlLmZyaWN0aW9uICogc3RhdGUudjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNwcmluZ0V2YWx1YXRlU3RhdGVXaXRoRGVyaXZhdGl2ZShpbml0aWFsU3RhdGUsIGR0LCBkZXJpdmF0aXZlKSB7XG4gICAgdmFyIHN0YXRlID0ge1xuICAgICAgeDogaW5pdGlhbFN0YXRlLnggKyBkZXJpdmF0aXZlLmR4ICogZHQsXG4gICAgICB2OiBpbml0aWFsU3RhdGUudiArIGRlcml2YXRpdmUuZHYgKiBkdCxcbiAgICAgIHRlbnNpb246IGluaXRpYWxTdGF0ZS50ZW5zaW9uLFxuICAgICAgZnJpY3Rpb246IGluaXRpYWxTdGF0ZS5mcmljdGlvblxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGR4OiBzdGF0ZS52LFxuICAgICAgZHY6IHNwcmluZ0FjY2VsZXJhdGlvbkZvclN0YXRlKHN0YXRlKVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBzcHJpbmdJbnRlZ3JhdGVTdGF0ZShzdGF0ZSwgZHQpIHtcbiAgICB2YXIgYSA9IHtcbiAgICAgIGR4OiBzdGF0ZS52LFxuICAgICAgZHY6IHNwcmluZ0FjY2VsZXJhdGlvbkZvclN0YXRlKHN0YXRlKVxuICAgIH0sXG4gICAgICAgIGIgPSBzcHJpbmdFdmFsdWF0ZVN0YXRlV2l0aERlcml2YXRpdmUoc3RhdGUsIGR0ICogMC41LCBhKSxcbiAgICAgICAgYyA9IHNwcmluZ0V2YWx1YXRlU3RhdGVXaXRoRGVyaXZhdGl2ZShzdGF0ZSwgZHQgKiAwLjUsIGIpLFxuICAgICAgICBkID0gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKHN0YXRlLCBkdCwgYyksXG4gICAgICAgIGR4ZHQgPSAxLjAgLyA2LjAgKiAoYS5keCArIDIuMCAqIChiLmR4ICsgYy5keCkgKyBkLmR4KSxcbiAgICAgICAgZHZkdCA9IDEuMCAvIDYuMCAqIChhLmR2ICsgMi4wICogKGIuZHYgKyBjLmR2KSArIGQuZHYpO1xuICAgIHN0YXRlLnggPSBzdGF0ZS54ICsgZHhkdCAqIGR0O1xuICAgIHN0YXRlLnYgPSBzdGF0ZS52ICsgZHZkdCAqIGR0O1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBzcHJpbmdSSzRGYWN0b3J5KHRlbnNpb24sIGZyaWN0aW9uLCBkdXJhdGlvbikge1xuICAgIHZhciBpbml0U3RhdGUgPSB7XG4gICAgICB4OiAtMSxcbiAgICAgIHY6IDAsXG4gICAgICB0ZW5zaW9uOiBudWxsLFxuICAgICAgZnJpY3Rpb246IG51bGxcbiAgICB9LFxuICAgICAgICBwYXRoID0gWzBdLFxuICAgICAgICB0aW1lX2xhcHNlZCA9IDAsXG4gICAgICAgIHRvbGVyYW5jZSA9IDEgLyAxMDAwMCxcbiAgICAgICAgRFQgPSAxNiAvIDEwMDAsXG4gICAgICAgIGhhdmVfZHVyYXRpb24sXG4gICAgICAgIGR0LFxuICAgICAgICBsYXN0X3N0YXRlO1xuICAgIHRlbnNpb24gPSBwYXJzZUZsb2F0KHRlbnNpb24pIHx8IDUwMDtcbiAgICBmcmljdGlvbiA9IHBhcnNlRmxvYXQoZnJpY3Rpb24pIHx8IDIwO1xuICAgIGR1cmF0aW9uID0gZHVyYXRpb24gfHwgbnVsbDtcbiAgICBpbml0U3RhdGUudGVuc2lvbiA9IHRlbnNpb247XG4gICAgaW5pdFN0YXRlLmZyaWN0aW9uID0gZnJpY3Rpb247XG4gICAgaGF2ZV9kdXJhdGlvbiA9IGR1cmF0aW9uICE9PSBudWxsO1xuICAgIC8qIENhbGN1bGF0ZSB0aGUgYWN0dWFsIHRpbWUgaXQgdGFrZXMgZm9yIHRoaXMgYW5pbWF0aW9uIHRvIGNvbXBsZXRlIHdpdGggdGhlIHByb3ZpZGVkIGNvbmRpdGlvbnMuICovXG5cbiAgICBpZiAoaGF2ZV9kdXJhdGlvbikge1xuICAgICAgLyogUnVuIHRoZSBzaW11bGF0aW9uIHdpdGhvdXQgYSBkdXJhdGlvbi4gKi9cbiAgICAgIHRpbWVfbGFwc2VkID0gc3ByaW5nUks0RmFjdG9yeSh0ZW5zaW9uLCBmcmljdGlvbik7XG4gICAgICAvKiBDb21wdXRlIHRoZSBhZGp1c3RlZCB0aW1lIGRlbHRhLiAqL1xuXG4gICAgICBkdCA9IHRpbWVfbGFwc2VkIC8gZHVyYXRpb24gKiBEVDtcbiAgICB9IGVsc2Uge1xuICAgICAgZHQgPSBEVDtcbiAgICB9XG5cbiAgICBmb3IgKDs7KSB7XG4gICAgICAvKiBOZXh0L3N0ZXAgZnVuY3Rpb24gLiovXG4gICAgICBsYXN0X3N0YXRlID0gc3ByaW5nSW50ZWdyYXRlU3RhdGUobGFzdF9zdGF0ZSB8fCBpbml0U3RhdGUsIGR0KTtcbiAgICAgIC8qIFN0b3JlIHRoZSBwb3NpdGlvbi4gKi9cblxuICAgICAgcGF0aC5wdXNoKDEgKyBsYXN0X3N0YXRlLngpO1xuICAgICAgdGltZV9sYXBzZWQgKz0gMTY7XG4gICAgICAvKiBJZiB0aGUgY2hhbmdlIHRocmVzaG9sZCBpcyByZWFjaGVkLCBicmVhay4gKi9cblxuICAgICAgaWYgKCEoTWF0aC5hYnMobGFzdF9zdGF0ZS54KSA+IHRvbGVyYW5jZSAmJiBNYXRoLmFicyhsYXN0X3N0YXRlLnYpID4gdG9sZXJhbmNlKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgLyogSWYgZHVyYXRpb24gaXMgbm90IGRlZmluZWQsIHJldHVybiB0aGUgYWN0dWFsIHRpbWUgcmVxdWlyZWQgZm9yIGNvbXBsZXRpbmcgdGhpcyBhbmltYXRpb24uIE90aGVyd2lzZSwgcmV0dXJuIGEgY2xvc3VyZSB0aGF0IGhvbGRzIHRoZVxuICAgICAgIGNvbXB1dGVkIHBhdGggYW5kIHJldHVybnMgYSBzbmFwc2hvdCBvZiB0aGUgcG9zaXRpb24gYWNjb3JkaW5nIHRvIGEgZ2l2ZW4gcGVyY2VudENvbXBsZXRlLiAqL1xuXG5cbiAgICByZXR1cm4gIWhhdmVfZHVyYXRpb24gPyB0aW1lX2xhcHNlZCA6IGZ1bmN0aW9uIChwZXJjZW50Q29tcGxldGUpIHtcbiAgICAgIHJldHVybiBwYXRoW3BlcmNlbnRDb21wbGV0ZSAqIChwYXRoLmxlbmd0aCAtIDEpIHwgMF07XG4gICAgfTtcbiAgfTtcbn0oKTtcblxudmFyIGN1YmljQmV6aWVyID0gZnVuY3Rpb24gY3ViaWNCZXppZXIodDEsIHAxLCB0MiwgcDIpIHtcbiAgdmFyIGJlemllciA9IGdlbmVyYXRlQ3ViaWNCZXppZXIodDEsIHAxLCB0MiwgcDIpO1xuICByZXR1cm4gZnVuY3Rpb24gKHN0YXJ0LCBlbmQsIHBlcmNlbnQpIHtcbiAgICByZXR1cm4gc3RhcnQgKyAoZW5kIC0gc3RhcnQpICogYmV6aWVyKHBlcmNlbnQpO1xuICB9O1xufTtcblxudmFyIGVhc2luZ3MgPSB7XG4gICdsaW5lYXInOiBmdW5jdGlvbiBsaW5lYXIoc3RhcnQsIGVuZCwgcGVyY2VudCkge1xuICAgIHJldHVybiBzdGFydCArIChlbmQgLSBzdGFydCkgKiBwZXJjZW50O1xuICB9LFxuICAvLyBkZWZhdWx0IGVhc2luZ3NcbiAgJ2Vhc2UnOiBjdWJpY0JlemllcigwLjI1LCAwLjEsIDAuMjUsIDEpLFxuICAnZWFzZS1pbic6IGN1YmljQmV6aWVyKDAuNDIsIDAsIDEsIDEpLFxuICAnZWFzZS1vdXQnOiBjdWJpY0JlemllcigwLCAwLCAwLjU4LCAxKSxcbiAgJ2Vhc2UtaW4tb3V0JzogY3ViaWNCZXppZXIoMC40MiwgMCwgMC41OCwgMSksXG4gIC8vIHNpbmVcbiAgJ2Vhc2UtaW4tc2luZSc6IGN1YmljQmV6aWVyKDAuNDcsIDAsIDAuNzQ1LCAwLjcxNSksXG4gICdlYXNlLW91dC1zaW5lJzogY3ViaWNCZXppZXIoMC4zOSwgMC41NzUsIDAuNTY1LCAxKSxcbiAgJ2Vhc2UtaW4tb3V0LXNpbmUnOiBjdWJpY0JlemllcigwLjQ0NSwgMC4wNSwgMC41NSwgMC45NSksXG4gIC8vIHF1YWRcbiAgJ2Vhc2UtaW4tcXVhZCc6IGN1YmljQmV6aWVyKDAuNTUsIDAuMDg1LCAwLjY4LCAwLjUzKSxcbiAgJ2Vhc2Utb3V0LXF1YWQnOiBjdWJpY0JlemllcigwLjI1LCAwLjQ2LCAwLjQ1LCAwLjk0KSxcbiAgJ2Vhc2UtaW4tb3V0LXF1YWQnOiBjdWJpY0JlemllcigwLjQ1NSwgMC4wMywgMC41MTUsIDAuOTU1KSxcbiAgLy8gY3ViaWNcbiAgJ2Vhc2UtaW4tY3ViaWMnOiBjdWJpY0JlemllcigwLjU1LCAwLjA1NSwgMC42NzUsIDAuMTkpLFxuICAnZWFzZS1vdXQtY3ViaWMnOiBjdWJpY0JlemllcigwLjIxNSwgMC42MSwgMC4zNTUsIDEpLFxuICAnZWFzZS1pbi1vdXQtY3ViaWMnOiBjdWJpY0JlemllcigwLjY0NSwgMC4wNDUsIDAuMzU1LCAxKSxcbiAgLy8gcXVhcnRcbiAgJ2Vhc2UtaW4tcXVhcnQnOiBjdWJpY0JlemllcigwLjg5NSwgMC4wMywgMC42ODUsIDAuMjIpLFxuICAnZWFzZS1vdXQtcXVhcnQnOiBjdWJpY0JlemllcigwLjE2NSwgMC44NCwgMC40NCwgMSksXG4gICdlYXNlLWluLW91dC1xdWFydCc6IGN1YmljQmV6aWVyKDAuNzcsIDAsIDAuMTc1LCAxKSxcbiAgLy8gcXVpbnRcbiAgJ2Vhc2UtaW4tcXVpbnQnOiBjdWJpY0JlemllcigwLjc1NSwgMC4wNSwgMC44NTUsIDAuMDYpLFxuICAnZWFzZS1vdXQtcXVpbnQnOiBjdWJpY0JlemllcigwLjIzLCAxLCAwLjMyLCAxKSxcbiAgJ2Vhc2UtaW4tb3V0LXF1aW50JzogY3ViaWNCZXppZXIoMC44NiwgMCwgMC4wNywgMSksXG4gIC8vIGV4cG9cbiAgJ2Vhc2UtaW4tZXhwbyc6IGN1YmljQmV6aWVyKDAuOTUsIDAuMDUsIDAuNzk1LCAwLjAzNSksXG4gICdlYXNlLW91dC1leHBvJzogY3ViaWNCZXppZXIoMC4xOSwgMSwgMC4yMiwgMSksXG4gICdlYXNlLWluLW91dC1leHBvJzogY3ViaWNCZXppZXIoMSwgMCwgMCwgMSksXG4gIC8vIGNpcmNcbiAgJ2Vhc2UtaW4tY2lyYyc6IGN1YmljQmV6aWVyKDAuNiwgMC4wNCwgMC45OCwgMC4zMzUpLFxuICAnZWFzZS1vdXQtY2lyYyc6IGN1YmljQmV6aWVyKDAuMDc1LCAwLjgyLCAwLjE2NSwgMSksXG4gICdlYXNlLWluLW91dC1jaXJjJzogY3ViaWNCZXppZXIoMC43ODUsIDAuMTM1LCAwLjE1LCAwLjg2KSxcbiAgLy8gdXNlciBwYXJhbSBlYXNpbmdzLi4uXG4gICdzcHJpbmcnOiBmdW5jdGlvbiBzcHJpbmcodGVuc2lvbiwgZnJpY3Rpb24sIGR1cmF0aW9uKSB7XG4gICAgaWYgKGR1cmF0aW9uID09PSAwKSB7XG4gICAgICAvLyBjYW4ndCBnZXQgYSBzcHJpbmcgdy8gZHVyYXRpb24gMFxuICAgICAgcmV0dXJuIGVhc2luZ3MubGluZWFyOyAvLyBkdXJhdGlvbiAwID0+IGp1bXAgdG8gZW5kIHNvIGltcGwgZG9lc24ndCBtYXR0ZXJcbiAgICB9XG5cbiAgICB2YXIgc3ByaW5nID0gZ2VuZXJhdGVTcHJpbmdSSzQodGVuc2lvbiwgZnJpY3Rpb24sIGR1cmF0aW9uKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXJ0LCBlbmQsIHBlcmNlbnQpIHtcbiAgICAgIHJldHVybiBzdGFydCArIChlbmQgLSBzdGFydCkgKiBzcHJpbmcocGVyY2VudCk7XG4gICAgfTtcbiAgfSxcbiAgJ2N1YmljLWJlemllcic6IGN1YmljQmV6aWVyXG59O1xuXG5mdW5jdGlvbiBnZXRFYXNlZFZhbHVlKHR5cGUsIHN0YXJ0LCBlbmQsIHBlcmNlbnQsIGVhc2luZ0ZuKSB7XG4gIGlmIChwZXJjZW50ID09PSAxKSB7XG4gICAgcmV0dXJuIGVuZDtcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gZW5kKSB7XG4gICAgcmV0dXJuIGVuZDtcbiAgfVxuXG4gIHZhciB2YWwgPSBlYXNpbmdGbihzdGFydCwgZW5kLCBwZXJjZW50KTtcblxuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIGlmICh0eXBlLnJvdW5kVmFsdWUgfHwgdHlwZS5jb2xvcikge1xuICAgIHZhbCA9IE1hdGgucm91bmQodmFsKTtcbiAgfVxuXG4gIGlmICh0eXBlLm1pbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsID0gTWF0aC5tYXgodmFsLCB0eXBlLm1pbik7XG4gIH1cblxuICBpZiAodHlwZS5tYXggIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbCA9IE1hdGgubWluKHZhbCwgdHlwZS5tYXgpO1xuICB9XG5cbiAgcmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUocHJvcCwgc3BlYykge1xuICBpZiAocHJvcC5wZlZhbHVlICE9IG51bGwgfHwgcHJvcC52YWx1ZSAhPSBudWxsKSB7XG4gICAgaWYgKHByb3AucGZWYWx1ZSAhPSBudWxsICYmIChzcGVjID09IG51bGwgfHwgc3BlYy50eXBlLnVuaXRzICE9PSAnJScpKSB7XG4gICAgICByZXR1cm4gcHJvcC5wZlZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJvcC52YWx1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHByb3A7XG4gIH1cbn1cblxuZnVuY3Rpb24gZWFzZShzdGFydFByb3AsIGVuZFByb3AsIHBlcmNlbnQsIGVhc2luZ0ZuLCBwcm9wU3BlYykge1xuICB2YXIgdHlwZSA9IHByb3BTcGVjICE9IG51bGwgPyBwcm9wU3BlYy50eXBlIDogbnVsbDtcblxuICBpZiAocGVyY2VudCA8IDApIHtcbiAgICBwZXJjZW50ID0gMDtcbiAgfSBlbHNlIGlmIChwZXJjZW50ID4gMSkge1xuICAgIHBlcmNlbnQgPSAxO1xuICB9XG5cbiAgdmFyIHN0YXJ0ID0gZ2V0VmFsdWUoc3RhcnRQcm9wLCBwcm9wU3BlYyk7XG4gIHZhciBlbmQgPSBnZXRWYWx1ZShlbmRQcm9wLCBwcm9wU3BlYyk7XG5cbiAgaWYgKG51bWJlciQxKHN0YXJ0KSAmJiBudW1iZXIkMShlbmQpKSB7XG4gICAgcmV0dXJuIGdldEVhc2VkVmFsdWUodHlwZSwgc3RhcnQsIGVuZCwgcGVyY2VudCwgZWFzaW5nRm4pO1xuICB9IGVsc2UgaWYgKGFycmF5KHN0YXJ0KSAmJiBhcnJheShlbmQpKSB7XG4gICAgdmFyIGVhc2VkQXJyID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNpID0gc3RhcnRbaV07XG4gICAgICB2YXIgZWkgPSBlbmRbaV07XG5cbiAgICAgIGlmIChzaSAhPSBudWxsICYmIGVpICE9IG51bGwpIHtcbiAgICAgICAgdmFyIHZhbCA9IGdldEVhc2VkVmFsdWUodHlwZSwgc2ksIGVpLCBwZXJjZW50LCBlYXNpbmdGbik7XG4gICAgICAgIGVhc2VkQXJyLnB1c2godmFsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVhc2VkQXJyLnB1c2goZWkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlYXNlZEFycjtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHN0ZXAkMShzZWxmLCBhbmksIG5vdywgaXNDb3JlKSB7XG4gIHZhciBpc0VsZXMgPSAhaXNDb3JlO1xuICB2YXIgX3AgPSBzZWxmLl9wcml2YXRlO1xuICB2YXIgYW5pX3AgPSBhbmkuX3ByaXZhdGU7XG4gIHZhciBwRWFzaW5nID0gYW5pX3AuZWFzaW5nO1xuICB2YXIgc3RhcnRUaW1lID0gYW5pX3Auc3RhcnRUaW1lO1xuICB2YXIgY3kgPSBpc0NvcmUgPyBzZWxmIDogc2VsZi5jeSgpO1xuICB2YXIgc3R5bGUgPSBjeS5zdHlsZSgpO1xuXG4gIGlmICghYW5pX3AuZWFzaW5nSW1wbCkge1xuICAgIGlmIChwRWFzaW5nID09IG51bGwpIHtcbiAgICAgIC8vIHVzZSBkZWZhdWx0XG4gICAgICBhbmlfcC5lYXNpbmdJbXBsID0gZWFzaW5nc1snbGluZWFyJ107XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZW4gZGVmaW5lIHcvIG5hbWVcbiAgICAgIHZhciBlYXNpbmdWYWxzO1xuXG4gICAgICBpZiAoc3RyaW5nKHBFYXNpbmcpKSB7XG4gICAgICAgIHZhciBlYXNpbmdQcm9wID0gc3R5bGUucGFyc2UoJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJywgcEVhc2luZyk7XG4gICAgICAgIGVhc2luZ1ZhbHMgPSBlYXNpbmdQcm9wLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdGhlbiBhc3N1bWUgcHJlcGFyc2VkIGFycmF5XG4gICAgICAgIGVhc2luZ1ZhbHMgPSBwRWFzaW5nO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmFtZSwgYXJncztcblxuICAgICAgaWYgKHN0cmluZyhlYXNpbmdWYWxzKSkge1xuICAgICAgICBuYW1lID0gZWFzaW5nVmFscztcbiAgICAgICAgYXJncyA9IFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmFtZSA9IGVhc2luZ1ZhbHNbMV07XG4gICAgICAgIGFyZ3MgPSBlYXNpbmdWYWxzLnNsaWNlKDIpLm1hcChmdW5jdGlvbiAobikge1xuICAgICAgICAgIHJldHVybiArbjtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gY3JlYXRlIHdpdGggYXJnc1xuICAgICAgICBpZiAobmFtZSA9PT0gJ3NwcmluZycpIHtcbiAgICAgICAgICBhcmdzLnB1c2goYW5pX3AuZHVyYXRpb24pOyAvLyBuZWVkIGR1cmF0aW9uIHRvIGdlbmVyYXRlIHNwcmluZ1xuICAgICAgICB9XG5cbiAgICAgICAgYW5pX3AuZWFzaW5nSW1wbCA9IGVhc2luZ3NbbmFtZV0uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzdGF0aWMgaW1wbCBieSBuYW1lXG4gICAgICAgIGFuaV9wLmVhc2luZ0ltcGwgPSBlYXNpbmdzW25hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBlYXNpbmcgPSBhbmlfcC5lYXNpbmdJbXBsO1xuICB2YXIgcGVyY2VudDtcblxuICBpZiAoYW5pX3AuZHVyYXRpb24gPT09IDApIHtcbiAgICBwZXJjZW50ID0gMTtcbiAgfSBlbHNlIHtcbiAgICBwZXJjZW50ID0gKG5vdyAtIHN0YXJ0VGltZSkgLyBhbmlfcC5kdXJhdGlvbjtcbiAgfVxuXG4gIGlmIChhbmlfcC5hcHBseWluZykge1xuICAgIHBlcmNlbnQgPSBhbmlfcC5wcm9ncmVzcztcbiAgfVxuXG4gIGlmIChwZXJjZW50IDwgMCkge1xuICAgIHBlcmNlbnQgPSAwO1xuICB9IGVsc2UgaWYgKHBlcmNlbnQgPiAxKSB7XG4gICAgcGVyY2VudCA9IDE7XG4gIH1cblxuICBpZiAoYW5pX3AuZGVsYXkgPT0gbnVsbCkge1xuICAgIC8vIHRoZW4gdXBkYXRlXG4gICAgdmFyIHN0YXJ0UG9zID0gYW5pX3Auc3RhcnRQb3NpdGlvbjtcbiAgICB2YXIgZW5kUG9zID0gYW5pX3AucG9zaXRpb247XG5cbiAgICBpZiAoZW5kUG9zICYmIGlzRWxlcyAmJiAhc2VsZi5sb2NrZWQoKSkge1xuICAgICAgdmFyIG5ld1BvcyA9IHt9O1xuXG4gICAgICBpZiAodmFsaWQoc3RhcnRQb3MueCwgZW5kUG9zLngpKSB7XG4gICAgICAgIG5ld1Bvcy54ID0gZWFzZShzdGFydFBvcy54LCBlbmRQb3MueCwgcGVyY2VudCwgZWFzaW5nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbGlkKHN0YXJ0UG9zLnksIGVuZFBvcy55KSkge1xuICAgICAgICBuZXdQb3MueSA9IGVhc2Uoc3RhcnRQb3MueSwgZW5kUG9zLnksIHBlcmNlbnQsIGVhc2luZyk7XG4gICAgICB9XG5cbiAgICAgIHNlbGYucG9zaXRpb24obmV3UG9zKTtcbiAgICB9XG5cbiAgICB2YXIgc3RhcnRQYW4gPSBhbmlfcC5zdGFydFBhbjtcbiAgICB2YXIgZW5kUGFuID0gYW5pX3AucGFuO1xuICAgIHZhciBwYW4gPSBfcC5wYW47XG4gICAgdmFyIGFuaW1hdGluZ1BhbiA9IGVuZFBhbiAhPSBudWxsICYmIGlzQ29yZTtcblxuICAgIGlmIChhbmltYXRpbmdQYW4pIHtcbiAgICAgIGlmICh2YWxpZChzdGFydFBhbi54LCBlbmRQYW4ueCkpIHtcbiAgICAgICAgcGFuLnggPSBlYXNlKHN0YXJ0UGFuLngsIGVuZFBhbi54LCBwZXJjZW50LCBlYXNpbmcpO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsaWQoc3RhcnRQYW4ueSwgZW5kUGFuLnkpKSB7XG4gICAgICAgIHBhbi55ID0gZWFzZShzdGFydFBhbi55LCBlbmRQYW4ueSwgcGVyY2VudCwgZWFzaW5nKTtcbiAgICAgIH1cblxuICAgICAgc2VsZi5lbWl0KCdwYW4nKTtcbiAgICB9XG5cbiAgICB2YXIgc3RhcnRab29tID0gYW5pX3Auc3RhcnRab29tO1xuICAgIHZhciBlbmRab29tID0gYW5pX3Auem9vbTtcbiAgICB2YXIgYW5pbWF0aW5nWm9vbSA9IGVuZFpvb20gIT0gbnVsbCAmJiBpc0NvcmU7XG5cbiAgICBpZiAoYW5pbWF0aW5nWm9vbSkge1xuICAgICAgaWYgKHZhbGlkKHN0YXJ0Wm9vbSwgZW5kWm9vbSkpIHtcbiAgICAgICAgX3Auem9vbSA9IGJvdW5kKF9wLm1pblpvb20sIGVhc2Uoc3RhcnRab29tLCBlbmRab29tLCBwZXJjZW50LCBlYXNpbmcpLCBfcC5tYXhab29tKTtcbiAgICAgIH1cblxuICAgICAgc2VsZi5lbWl0KCd6b29tJyk7XG4gICAgfVxuXG4gICAgaWYgKGFuaW1hdGluZ1BhbiB8fCBhbmltYXRpbmdab29tKSB7XG4gICAgICBzZWxmLmVtaXQoJ3ZpZXdwb3J0Jyk7XG4gICAgfVxuXG4gICAgdmFyIHByb3BzID0gYW5pX3Auc3R5bGU7XG5cbiAgICBpZiAocHJvcHMgJiYgcHJvcHMubGVuZ3RoID4gMCAmJiBpc0VsZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHByb3AgPSBwcm9wc1tpXTtcbiAgICAgICAgdmFyIF9uYW1lID0gcHJvcC5uYW1lO1xuICAgICAgICB2YXIgZW5kID0gcHJvcDtcbiAgICAgICAgdmFyIHN0YXJ0ID0gYW5pX3Auc3RhcnRTdHlsZVtfbmFtZV07XG4gICAgICAgIHZhciBwcm9wU3BlYyA9IHN0eWxlLnByb3BlcnRpZXNbc3RhcnQubmFtZV07XG4gICAgICAgIHZhciBlYXNlZFZhbCA9IGVhc2Uoc3RhcnQsIGVuZCwgcGVyY2VudCwgZWFzaW5nLCBwcm9wU3BlYyk7XG4gICAgICAgIHN0eWxlLm92ZXJyaWRlQnlwYXNzKHNlbGYsIF9uYW1lLCBlYXNlZFZhbCk7XG4gICAgICB9IC8vIGZvciBwcm9wc1xuXG5cbiAgICAgIHNlbGYuZW1pdCgnc3R5bGUnKTtcbiAgICB9IC8vIGlmXG5cbiAgfVxuXG4gIGFuaV9wLnByb2dyZXNzID0gcGVyY2VudDtcbiAgcmV0dXJuIHBlcmNlbnQ7XG59XG5cbmZ1bmN0aW9uIHZhbGlkKHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09IG51bGwgfHwgZW5kID09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAobnVtYmVyJDEoc3RhcnQpICYmIG51bWJlciQxKGVuZCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChzdGFydCAmJiBlbmQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gc3RhcnRBbmltYXRpb24oc2VsZiwgYW5pLCBub3csIGlzQ29yZSkge1xuICB2YXIgYW5pX3AgPSBhbmkuX3ByaXZhdGU7XG4gIGFuaV9wLnN0YXJ0ZWQgPSB0cnVlO1xuICBhbmlfcC5zdGFydFRpbWUgPSBub3cgLSBhbmlfcC5wcm9ncmVzcyAqIGFuaV9wLmR1cmF0aW9uO1xufVxuXG5mdW5jdGlvbiBzdGVwQWxsKG5vdywgY3kpIHtcbiAgdmFyIGVsZXMgPSBjeS5fcHJpdmF0ZS5hbmlFbGVzO1xuICB2YXIgZG9uZUVsZXMgPSBbXTtcblxuICBmdW5jdGlvbiBzdGVwT25lKGVsZSwgaXNDb3JlKSB7XG4gICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgIHZhciBjdXJyZW50ID0gX3AuYW5pbWF0aW9uLmN1cnJlbnQ7XG4gICAgdmFyIHF1ZXVlID0gX3AuYW5pbWF0aW9uLnF1ZXVlO1xuICAgIHZhciByYW5BbmlzID0gZmFsc2U7IC8vIGlmIG5vdGhpbmcgY3VycmVudGx5IGFuaW1hdGluZywgZ2V0IHNvbWV0aGluZyBmcm9tIHRoZSBxdWV1ZVxuXG4gICAgaWYgKGN1cnJlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICB2YXIgbmV4dCA9IHF1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgIGN1cnJlbnQucHVzaChuZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2FsbGJhY2tzID0gZnVuY3Rpb24gY2FsbGJhY2tzKF9jYWxsYmFja3MpIHtcbiAgICAgIGZvciAodmFyIGogPSBfY2FsbGJhY2tzLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIHZhciBjYiA9IF9jYWxsYmFja3Nbal07XG4gICAgICAgIGNiKCk7XG4gICAgICB9XG5cbiAgICAgIF9jYWxsYmFja3Muc3BsaWNlKDAsIF9jYWxsYmFja3MubGVuZ3RoKTtcbiAgICB9OyAvLyBzdGVwIGFuZCByZW1vdmUgaWYgZG9uZVxuXG5cbiAgICBmb3IgKHZhciBpID0gY3VycmVudC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGFuaSA9IGN1cnJlbnRbaV07XG4gICAgICB2YXIgYW5pX3AgPSBhbmkuX3ByaXZhdGU7XG5cbiAgICAgIGlmIChhbmlfcC5zdG9wcGVkKSB7XG4gICAgICAgIGN1cnJlbnQuc3BsaWNlKGksIDEpO1xuICAgICAgICBhbmlfcC5ob29rZWQgPSBmYWxzZTtcbiAgICAgICAgYW5pX3AucGxheWluZyA9IGZhbHNlO1xuICAgICAgICBhbmlfcC5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIGNhbGxiYWNrcyhhbmlfcC5mcmFtZXMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhbmlfcC5wbGF5aW5nICYmICFhbmlfcC5hcHBseWluZykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gYW4gYXBwbHkoKSB3aGlsZSBwbGF5aW5nIHNob3VsZG4ndCBkbyBhbnl0aGluZ1xuXG5cbiAgICAgIGlmIChhbmlfcC5wbGF5aW5nICYmIGFuaV9wLmFwcGx5aW5nKSB7XG4gICAgICAgIGFuaV9wLmFwcGx5aW5nID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghYW5pX3Auc3RhcnRlZCkge1xuICAgICAgICBzdGFydEFuaW1hdGlvbihlbGUsIGFuaSwgbm93KTtcbiAgICAgIH1cblxuICAgICAgc3RlcCQxKGVsZSwgYW5pLCBub3csIGlzQ29yZSk7XG5cbiAgICAgIGlmIChhbmlfcC5hcHBseWluZykge1xuICAgICAgICBhbmlfcC5hcHBseWluZyA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjYWxsYmFja3MoYW5pX3AuZnJhbWVzKTtcblxuICAgICAgaWYgKGFuaV9wLnN0ZXAgIT0gbnVsbCkge1xuICAgICAgICBhbmlfcC5zdGVwKG5vdyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhbmkuY29tcGxldGVkKCkpIHtcbiAgICAgICAgY3VycmVudC5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGFuaV9wLmhvb2tlZCA9IGZhbHNlO1xuICAgICAgICBhbmlfcC5wbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIGFuaV9wLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgY2FsbGJhY2tzKGFuaV9wLmNvbXBsZXRlcyk7XG4gICAgICB9XG5cbiAgICAgIHJhbkFuaXMgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghaXNDb3JlICYmIGN1cnJlbnQubGVuZ3RoID09PSAwICYmIHF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZG9uZUVsZXMucHVzaChlbGUpO1xuICAgIH1cblxuICAgIHJldHVybiByYW5BbmlzO1xuICB9IC8vIHN0ZXBFbGVtZW50XG4gIC8vIGhhbmRsZSBhbGwgZWxlc1xuXG5cbiAgdmFyIHJhbkVsZUFuaSA9IGZhbHNlO1xuXG4gIGZvciAodmFyIGUgPSAwOyBlIDwgZWxlcy5sZW5ndGg7IGUrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2VdO1xuICAgIHZhciBoYW5kbGVkVGhpc0VsZSA9IHN0ZXBPbmUoZWxlKTtcbiAgICByYW5FbGVBbmkgPSByYW5FbGVBbmkgfHwgaGFuZGxlZFRoaXNFbGU7XG4gIH0gLy8gZWFjaCBlbGVtZW50XG5cblxuICB2YXIgcmFuQ29yZUFuaSA9IHN0ZXBPbmUoY3ksIHRydWUpOyAvLyBub3RpZnkgcmVuZGVyZXJcblxuICBpZiAocmFuRWxlQW5pIHx8IHJhbkNvcmVBbmkpIHtcbiAgICBpZiAoZWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjeS5ub3RpZnkoJ2RyYXcnLCBlbGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3kubm90aWZ5KCdkcmF3Jyk7XG4gICAgfVxuICB9IC8vIHJlbW92ZSBlbGVtZW50cyBmcm9tIGxpc3Qgb2YgY3VycmVudGx5IGFuaW1hdGluZyBpZiBpdHMgcXVldWVzIGFyZSBlbXB0eVxuXG5cbiAgZWxlcy51bm1lcmdlKGRvbmVFbGVzKTtcbiAgY3kuZW1pdCgnc3RlcCcpO1xufSAvLyBzdGVwQWxsXG5cbnZhciBjb3JlZm4kOCA9IHtcbiAgLy8gcHVsbCBpbiBhbmltYXRpb24gZnVuY3Rpb25zXG4gIGFuaW1hdGU6IGRlZmluZS5hbmltYXRlKCksXG4gIGFuaW1hdGlvbjogZGVmaW5lLmFuaW1hdGlvbigpLFxuICBhbmltYXRlZDogZGVmaW5lLmFuaW1hdGVkKCksXG4gIGNsZWFyUXVldWU6IGRlZmluZS5jbGVhclF1ZXVlKCksXG4gIGRlbGF5OiBkZWZpbmUuZGVsYXkoKSxcbiAgZGVsYXlBbmltYXRpb246IGRlZmluZS5kZWxheUFuaW1hdGlvbigpLFxuICBzdG9wOiBkZWZpbmUuc3RvcCgpLFxuICBhZGRUb0FuaW1hdGlvblBvb2w6IGZ1bmN0aW9uIGFkZFRvQW5pbWF0aW9uUG9vbChlbGVzKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcblxuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIHNhdmUgY3ljbGVzIHdoZW4gbm8gc3R5bGUgdXNlZFxuXG5cbiAgICBjeS5fcHJpdmF0ZS5hbmlFbGVzLm1lcmdlKGVsZXMpO1xuICB9LFxuICBzdG9wQW5pbWF0aW9uTG9vcDogZnVuY3Rpb24gc3RvcEFuaW1hdGlvbkxvb3AoKSB7XG4gICAgdGhpcy5fcHJpdmF0ZS5hbmltYXRpb25zUnVubmluZyA9IGZhbHNlO1xuICB9LFxuICBzdGFydEFuaW1hdGlvbkxvb3A6IGZ1bmN0aW9uIHN0YXJ0QW5pbWF0aW9uTG9vcCgpIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIGN5Ll9wcml2YXRlLmFuaW1hdGlvbnNSdW5uaW5nID0gdHJ1ZTtcblxuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIHNhdmUgY3ljbGVzIHdoZW4gbm8gc3R5bGUgdXNlZFxuICAgIC8vIE5CIHRoZSBhbmltYXRpb24gbG9vcCB3aWxsIGV4ZWMgaW4gaGVhZGxlc3MgZW52aXJvbm1lbnRzIGlmIHN0eWxlIGVuYWJsZWRcbiAgICAvLyBhbmQgZXhwbGljaXQgY3kuZGVzdHJveSgpIGlzIG5lY2Vzc2FyeSB0byBzdG9wIHRoZSBsb29wXG5cblxuICAgIGZ1bmN0aW9uIGhlYWRsZXNzU3RlcCgpIHtcbiAgICAgIGlmICghY3kuX3ByaXZhdGUuYW5pbWF0aW9uc1J1bm5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gYW5pbWF0aW9uU3RlcChub3cpIHtcbiAgICAgICAgc3RlcEFsbChub3csIGN5KTtcbiAgICAgICAgaGVhZGxlc3NTdGVwKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgcmVuZGVyZXIgPSBjeS5yZW5kZXJlcigpO1xuXG4gICAgaWYgKHJlbmRlcmVyICYmIHJlbmRlcmVyLmJlZm9yZVJlbmRlcikge1xuICAgICAgLy8gbGV0IHRoZSByZW5kZXJlciBzY2hlZHVsZSBhbmltYXRpb25zXG4gICAgICByZW5kZXJlci5iZWZvcmVSZW5kZXIoZnVuY3Rpb24gcmVuZGVyZXJBbmltYXRpb25TdGVwKHdpbGxEcmF3LCBub3cpIHtcbiAgICAgICAgc3RlcEFsbChub3csIGN5KTtcbiAgICAgIH0sIHJlbmRlcmVyLmJlZm9yZVJlbmRlclByaW9yaXRpZXMuYW5pbWF0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG1hbmFnZSB0aGUgYW5pbWF0aW9uIGxvb3Agb3Vyc2VsdmVzXG4gICAgICBoZWFkbGVzc1N0ZXAoKTsgLy8gZmlyc3QgY2FsbFxuICAgIH1cbiAgfVxufTtcblxudmFyIGVtaXR0ZXJPcHRpb25zID0ge1xuICBxdWFsaWZpZXJDb21wYXJlOiBmdW5jdGlvbiBxdWFsaWZpZXJDb21wYXJlKHNlbGVjdG9yMSwgc2VsZWN0b3IyKSB7XG4gICAgaWYgKHNlbGVjdG9yMSA9PSBudWxsIHx8IHNlbGVjdG9yMiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gc2VsZWN0b3IxID09IG51bGwgJiYgc2VsZWN0b3IyID09IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzZWxlY3RvcjEuc2FtZVRleHQoc2VsZWN0b3IyKTtcbiAgICB9XG4gIH0sXG4gIGV2ZW50TWF0Y2hlczogZnVuY3Rpb24gZXZlbnRNYXRjaGVzKGN5LCBsaXN0ZW5lciwgZXZlbnRPYmopIHtcbiAgICB2YXIgc2VsZWN0b3IgPSBsaXN0ZW5lci5xdWFsaWZpZXI7XG5cbiAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGN5ICE9PSBldmVudE9iai50YXJnZXQgJiYgZWxlbWVudChldmVudE9iai50YXJnZXQpICYmIHNlbGVjdG9yLm1hdGNoZXMoZXZlbnRPYmoudGFyZ2V0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgYWRkRXZlbnRGaWVsZHM6IGZ1bmN0aW9uIGFkZEV2ZW50RmllbGRzKGN5LCBldnQpIHtcbiAgICBldnQuY3kgPSBjeTtcbiAgICBldnQudGFyZ2V0ID0gY3k7XG4gIH0sXG4gIGNhbGxiYWNrQ29udGV4dDogZnVuY3Rpb24gY2FsbGJhY2tDb250ZXh0KGN5LCBsaXN0ZW5lciwgZXZlbnRPYmopIHtcbiAgICByZXR1cm4gbGlzdGVuZXIucXVhbGlmaWVyICE9IG51bGwgPyBldmVudE9iai50YXJnZXQgOiBjeTtcbiAgfVxufTtcblxudmFyIGFyZ1NlbGVjdG9yID0gZnVuY3Rpb24gYXJnU2VsZWN0b3IoYXJnKSB7XG4gIGlmIChzdHJpbmcoYXJnKSkge1xuICAgIHJldHVybiBuZXcgU2VsZWN0b3IoYXJnKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYXJnO1xuICB9XG59O1xuXG52YXIgZWxlc2ZuID0ge1xuICBjcmVhdGVFbWl0dGVyOiBmdW5jdGlvbiBjcmVhdGVFbWl0dGVyKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG5cbiAgICBpZiAoIV9wLmVtaXR0ZXIpIHtcbiAgICAgIF9wLmVtaXR0ZXIgPSBuZXcgRW1pdHRlcihlbWl0dGVyT3B0aW9ucywgdGhpcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGVtaXR0ZXI6IGZ1bmN0aW9uIGVtaXR0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuZW1pdHRlcjtcbiAgfSxcbiAgb246IGZ1bmN0aW9uIG9uKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5lbWl0dGVyKCkub24oZXZlbnRzLCBhcmdTZWxlY3RvcihzZWxlY3RvciksIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmVtb3ZlTGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5lbWl0dGVyKCkucmVtb3ZlTGlzdGVuZXIoZXZlbnRzLCBhcmdTZWxlY3RvcihzZWxlY3RvciksIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmVtb3ZlQWxsTGlzdGVuZXJzOiBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5lbWl0dGVyKCkucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIG9uZTogZnVuY3Rpb24gb25lKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5lbWl0dGVyKCkub25lKGV2ZW50cywgYXJnU2VsZWN0b3Ioc2VsZWN0b3IpLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIG9uY2U6IGZ1bmN0aW9uIG9uY2UoZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5vbmUoZXZlbnRzLCBhcmdTZWxlY3RvcihzZWxlY3RvciksIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZW1pdDogZnVuY3Rpb24gZW1pdChldmVudHMsIGV4dHJhUGFyYW1zKSB7XG4gICAgdGhpcy5lbWl0dGVyKCkuZW1pdChldmVudHMsIGV4dHJhUGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZW1pdEFuZE5vdGlmeTogZnVuY3Rpb24gZW1pdEFuZE5vdGlmeShldmVudCwgZWxlcykge1xuICAgIHRoaXMuZW1pdChldmVudCk7XG4gICAgdGhpcy5ub3RpZnkoZXZlbnQsIGVsZXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59O1xuZGVmaW5lLmV2ZW50QWxpYXNlc09uKGVsZXNmbik7XG5cbnZhciBjb3JlZm4kNyA9IHtcbiAgcG5nOiBmdW5jdGlvbiBwbmcob3B0aW9ucykge1xuICAgIHZhciByZW5kZXJlciA9IHRoaXMuX3ByaXZhdGUucmVuZGVyZXI7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIHJlbmRlcmVyLnBuZyhvcHRpb25zKTtcbiAgfSxcbiAganBnOiBmdW5jdGlvbiBqcGcob3B0aW9ucykge1xuICAgIHZhciByZW5kZXJlciA9IHRoaXMuX3ByaXZhdGUucmVuZGVyZXI7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5iZyA9IG9wdGlvbnMuYmcgfHwgJyNmZmYnO1xuICAgIHJldHVybiByZW5kZXJlci5qcGcob3B0aW9ucyk7XG4gIH1cbn07XG5jb3JlZm4kNy5qcGVnID0gY29yZWZuJDcuanBnO1xuXG52YXIgY29yZWZuJDYgPSB7XG4gIGxheW91dDogZnVuY3Rpb24gbGF5b3V0KG9wdGlvbnMpIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuXG4gICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0xheW91dCBvcHRpb25zIG11c3QgYmUgc3BlY2lmaWVkIHRvIG1ha2UgYSBsYXlvdXQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5uYW1lID09IG51bGwpIHtcbiAgICAgIGVycm9yKCdBIGBuYW1lYCBtdXN0IGJlIHNwZWNpZmllZCB0byBtYWtlIGEgbGF5b3V0Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgdmFyIExheW91dCA9IGN5LmV4dGVuc2lvbignbGF5b3V0JywgbmFtZSk7XG5cbiAgICBpZiAoTGF5b3V0ID09IG51bGwpIHtcbiAgICAgIGVycm9yKCdObyBzdWNoIGxheW91dCBgJyArIG5hbWUgKyAnYCBmb3VuZC4gIERpZCB5b3UgZm9yZ2V0IHRvIGltcG9ydCBpdCBhbmQgYGN5dG9zY2FwZS51c2UoKWAgaXQ/Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGVsZXM7XG5cbiAgICBpZiAoc3RyaW5nKG9wdGlvbnMuZWxlcykpIHtcbiAgICAgIGVsZXMgPSBjeS4kKG9wdGlvbnMuZWxlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZXMgPSBvcHRpb25zLmVsZXMgIT0gbnVsbCA/IG9wdGlvbnMuZWxlcyA6IGN5LiQoKTtcbiAgICB9XG5cbiAgICB2YXIgbGF5b3V0ID0gbmV3IExheW91dChleHRlbmQoe30sIG9wdGlvbnMsIHtcbiAgICAgIGN5OiBjeSxcbiAgICAgIGVsZXM6IGVsZXNcbiAgICB9KSk7XG4gICAgcmV0dXJuIGxheW91dDtcbiAgfVxufTtcbmNvcmVmbiQ2LmNyZWF0ZUxheW91dCA9IGNvcmVmbiQ2Lm1ha2VMYXlvdXQgPSBjb3JlZm4kNi5sYXlvdXQ7XG5cbnZhciBjb3JlZm4kNSA9IHtcbiAgbm90aWZ5OiBmdW5jdGlvbiBub3RpZnkoZXZlbnROYW1lLCBldmVudEVsZXMpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuXG4gICAgaWYgKHRoaXMuYmF0Y2hpbmcoKSkge1xuICAgICAgX3AuYmF0Y2hOb3RpZmljYXRpb25zID0gX3AuYmF0Y2hOb3RpZmljYXRpb25zIHx8IHt9O1xuICAgICAgdmFyIGVsZXMgPSBfcC5iYXRjaE5vdGlmaWNhdGlvbnNbZXZlbnROYW1lXSA9IF9wLmJhdGNoTm90aWZpY2F0aW9uc1tldmVudE5hbWVdIHx8IHRoaXMuY29sbGVjdGlvbigpO1xuXG4gICAgICBpZiAoZXZlbnRFbGVzICE9IG51bGwpIHtcbiAgICAgICAgZWxlcy5tZXJnZShldmVudEVsZXMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47IC8vIG5vdGlmaWNhdGlvbnMgYXJlIGRpc2FibGVkIGR1cmluZyBiYXRjaGluZ1xuICAgIH1cblxuICAgIGlmICghX3Aubm90aWZpY2F0aW9uc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGV4aXQgb24gZGlzYWJsZWRcblxuXG4gICAgdmFyIHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcigpOyAvLyBleGl0IGlmIGRlc3Ryb3koKSBjYWxsZWQgb24gY29yZSBvciByZW5kZXJlciBpbiBiZXR3ZWVuIGZyYW1lcyAjMTQ5OSAjMTUyOFxuXG4gICAgaWYgKHRoaXMuZGVzdHJveWVkKCkgfHwgIXJlbmRlcmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmVuZGVyZXIubm90aWZ5KGV2ZW50TmFtZSwgZXZlbnRFbGVzKTtcbiAgfSxcbiAgbm90aWZpY2F0aW9uczogZnVuY3Rpb24gbm90aWZpY2F0aW9ucyhib29sKSB7XG4gICAgdmFyIHAgPSB0aGlzLl9wcml2YXRlO1xuXG4gICAgaWYgKGJvb2wgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHAubm90aWZpY2F0aW9uc0VuYWJsZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHAubm90aWZpY2F0aW9uc0VuYWJsZWQgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBub05vdGlmaWNhdGlvbnM6IGZ1bmN0aW9uIG5vTm90aWZpY2F0aW9ucyhjYWxsYmFjaykge1xuICAgIHRoaXMubm90aWZpY2F0aW9ucyhmYWxzZSk7XG4gICAgY2FsbGJhY2soKTtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnModHJ1ZSk7XG4gIH0sXG4gIGJhdGNoaW5nOiBmdW5jdGlvbiBiYXRjaGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5iYXRjaENvdW50ID4gMDtcbiAgfSxcbiAgc3RhcnRCYXRjaDogZnVuY3Rpb24gc3RhcnRCYXRjaCgpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuXG4gICAgaWYgKF9wLmJhdGNoQ291bnQgPT0gbnVsbCkge1xuICAgICAgX3AuYmF0Y2hDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKF9wLmJhdGNoQ291bnQgPT09IDApIHtcbiAgICAgIF9wLmJhdGNoU3R5bGVFbGVzID0gdGhpcy5jb2xsZWN0aW9uKCk7XG4gICAgICBfcC5iYXRjaE5vdGlmaWNhdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBfcC5iYXRjaENvdW50Kys7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGVuZEJhdGNoOiBmdW5jdGlvbiBlbmRCYXRjaCgpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuXG4gICAgaWYgKF9wLmJhdGNoQ291bnQgPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9wLmJhdGNoQ291bnQtLTtcblxuICAgIGlmIChfcC5iYXRjaENvdW50ID09PSAwKSB7XG4gICAgICAvLyB1cGRhdGUgc3R5bGUgZm9yIGRpcnR5IGVsZXNcbiAgICAgIF9wLmJhdGNoU3R5bGVFbGVzLnVwZGF0ZVN0eWxlKCk7XG5cbiAgICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXIoKTsgLy8gbm90aWZ5IHRoZSByZW5kZXJlciBvZiBxdWV1ZWQgZWxlcyBhbmQgZXZlbnQgdHlwZXNcblxuICAgICAgT2JqZWN0LmtleXMoX3AuYmF0Y2hOb3RpZmljYXRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgICAgdmFyIGVsZXMgPSBfcC5iYXRjaE5vdGlmaWNhdGlvbnNbZXZlbnROYW1lXTtcblxuICAgICAgICBpZiAoZWxlcy5lbXB0eSgpKSB7XG4gICAgICAgICAgcmVuZGVyZXIubm90aWZ5KGV2ZW50TmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVuZGVyZXIubm90aWZ5KGV2ZW50TmFtZSwgZWxlcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBiYXRjaDogZnVuY3Rpb24gYmF0Y2goY2FsbGJhY2spIHtcbiAgICB0aGlzLnN0YXJ0QmF0Y2goKTtcbiAgICBjYWxsYmFjaygpO1xuICAgIHRoaXMuZW5kQmF0Y2goKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgLy8gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIGJhdGNoRGF0YTogZnVuY3Rpb24gYmF0Y2hEYXRhKG1hcCkge1xuICAgIHZhciBjeSA9IHRoaXM7XG4gICAgcmV0dXJuIHRoaXMuYmF0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGlkcyA9IE9iamVjdC5rZXlzKG1hcCk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBpZCA9IGlkc1tpXTtcbiAgICAgICAgdmFyIGRhdGEgPSBtYXBbaWRdO1xuICAgICAgICB2YXIgZWxlID0gY3kuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICBlbGUuZGF0YShkYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufTtcblxudmFyIHJlbmRlcmVyRGVmYXVsdHMgPSBkZWZhdWx0cyRnKHtcbiAgaGlkZUVkZ2VzT25WaWV3cG9ydDogZmFsc2UsXG4gIHRleHR1cmVPblZpZXdwb3J0OiBmYWxzZSxcbiAgbW90aW9uQmx1cjogZmFsc2UsXG4gIG1vdGlvbkJsdXJPcGFjaXR5OiAwLjA1LFxuICBwaXhlbFJhdGlvOiB1bmRlZmluZWQsXG4gIGRlc2t0b3BUYXBUaHJlc2hvbGQ6IDQsXG4gIHRvdWNoVGFwVGhyZXNob2xkOiA4LFxuICB3aGVlbFNlbnNpdGl2aXR5OiAxLFxuICBkZWJ1ZzogZmFsc2UsXG4gIHNob3dGcHM6IGZhbHNlXG59KTtcbnZhciBjb3JlZm4kNCA9IHtcbiAgcmVuZGVyVG86IGZ1bmN0aW9uIHJlbmRlclRvKGNvbnRleHQsIHpvb20sIHBhbiwgcHhSYXRpbykge1xuICAgIHZhciByID0gdGhpcy5fcHJpdmF0ZS5yZW5kZXJlcjtcbiAgICByLnJlbmRlclRvKGNvbnRleHQsIHpvb20sIHBhbiwgcHhSYXRpbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHJlbmRlcmVyOiBmdW5jdGlvbiByZW5kZXJlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5yZW5kZXJlcjtcbiAgfSxcbiAgZm9yY2VSZW5kZXI6IGZ1bmN0aW9uIGZvcmNlUmVuZGVyKCkge1xuICAgIHRoaXMubm90aWZ5KCdkcmF3Jyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHJlc2l6ZTogZnVuY3Rpb24gcmVzaXplKCkge1xuICAgIHRoaXMuaW52YWxpZGF0ZVNpemUoKTtcbiAgICB0aGlzLmVtaXRBbmROb3RpZnkoJ3Jlc2l6ZScpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBpbml0UmVuZGVyZXI6IGZ1bmN0aW9uIGluaXRSZW5kZXJlcihvcHRpb25zKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICB2YXIgUmVuZGVyZXJQcm90byA9IGN5LmV4dGVuc2lvbigncmVuZGVyZXInLCBvcHRpb25zLm5hbWUpO1xuXG4gICAgaWYgKFJlbmRlcmVyUHJvdG8gPT0gbnVsbCkge1xuICAgICAgZXJyb3IoXCJDYW4gbm90IGluaXRpYWxpc2U6IE5vIHN1Y2ggcmVuZGVyZXIgYFwiLmNvbmNhdChvcHRpb25zLm5hbWUsIFwiYCBmb3VuZC4gRGlkIHlvdSBmb3JnZXQgdG8gaW1wb3J0IGl0IGFuZCBgY3l0b3NjYXBlLnVzZSgpYCBpdD9cIikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLndoZWVsU2Vuc2l0aXZpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgd2FybihcIllvdSBoYXZlIHNldCBhIGN1c3RvbSB3aGVlbCBzZW5zaXRpdml0eS4gIFRoaXMgd2lsbCBtYWtlIHlvdXIgYXBwIHpvb20gdW5uYXR1cmFsbHkgd2hlbiB1c2luZyBtYWluc3RyZWFtIG1pY2UuICBZb3Ugc2hvdWxkIGNoYW5nZSB0aGlzIHZhbHVlIGZyb20gdGhlIGRlZmF1bHQgb25seSBpZiB5b3UgY2FuIGd1YXJhbnRlZSB0aGF0IGFsbCB5b3VyIHVzZXJzIHdpbGwgdXNlIHRoZSBzYW1lIGhhcmR3YXJlIGFuZCBPUyBjb25maWd1cmF0aW9uIGFzIHlvdXIgY3VycmVudCBtYWNoaW5lLlwiKTtcbiAgICB9XG5cbiAgICB2YXIgck9wdHMgPSByZW5kZXJlckRlZmF1bHRzKG9wdGlvbnMpO1xuICAgIHJPcHRzLmN5ID0gY3k7XG4gICAgY3kuX3ByaXZhdGUucmVuZGVyZXIgPSBuZXcgUmVuZGVyZXJQcm90byhyT3B0cyk7XG4gICAgdGhpcy5ub3RpZnkoJ2luaXQnKTtcbiAgfSxcbiAgZGVzdHJveVJlbmRlcmVyOiBmdW5jdGlvbiBkZXN0cm95UmVuZGVyZXIoKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICBjeS5ub3RpZnkoJ2Rlc3Ryb3knKTsgLy8gZGVzdHJveSB0aGUgcmVuZGVyZXJcblxuICAgIHZhciBkb21FbGUgPSBjeS5jb250YWluZXIoKTtcblxuICAgIGlmIChkb21FbGUpIHtcbiAgICAgIGRvbUVsZS5fY3lyZWcgPSBudWxsO1xuXG4gICAgICB3aGlsZSAoZG9tRWxlLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBkb21FbGUucmVtb3ZlQ2hpbGQoZG9tRWxlLmNoaWxkTm9kZXNbMF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGN5Ll9wcml2YXRlLnJlbmRlcmVyID0gbnVsbDsgLy8gdG8gYmUgZXh0cmEgc2FmZSwgcmVtb3ZlIHRoZSByZWZcblxuICAgIGN5Lm11dGFibGVFbGVtZW50cygpLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgICAgX3AucnNjcmF0Y2ggPSB7fTtcbiAgICAgIF9wLnJzdHlsZSA9IHt9O1xuICAgICAgX3AuYW5pbWF0aW9uLmN1cnJlbnQgPSBbXTtcbiAgICAgIF9wLmFuaW1hdGlvbi5xdWV1ZSA9IFtdO1xuICAgIH0pO1xuICB9LFxuICBvblJlbmRlcjogZnVuY3Rpb24gb25SZW5kZXIoZm4pIHtcbiAgICByZXR1cm4gdGhpcy5vbigncmVuZGVyJywgZm4pO1xuICB9LFxuICBvZmZSZW5kZXI6IGZ1bmN0aW9uIG9mZlJlbmRlcihmbikge1xuICAgIHJldHVybiB0aGlzLm9mZigncmVuZGVyJywgZm4pO1xuICB9XG59O1xuY29yZWZuJDQuaW52YWxpZGF0ZURpbWVuc2lvbnMgPSBjb3JlZm4kNC5yZXNpemU7XG5cbnZhciBjb3JlZm4kMyA9IHtcbiAgLy8gZ2V0IGEgY29sbGVjdGlvblxuICAvLyAtIGVtcHR5IGNvbGxlY3Rpb24gb24gbm8gYXJnc1xuICAvLyAtIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgaW4gdGhlIGdyYXBoIG9uIHNlbGVjdG9yIGFyZ1xuICAvLyAtIGd1YXJhbnRlZSBhIHJldHVybmVkIGNvbGxlY3Rpb24gd2hlbiBlbGVtZW50cyBvciBjb2xsZWN0aW9uIHNwZWNpZmllZFxuICBjb2xsZWN0aW9uOiBmdW5jdGlvbiBjb2xsZWN0aW9uKGVsZXMsIG9wdHMpIHtcbiAgICBpZiAoc3RyaW5nKGVsZXMpKSB7XG4gICAgICByZXR1cm4gdGhpcy4kKGVsZXMpO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihlbGVzKSkge1xuICAgICAgcmV0dXJuIGVsZXMuY29sbGVjdGlvbigpO1xuICAgIH0gZWxzZSBpZiAoYXJyYXkoZWxlcykpIHtcbiAgICAgIGlmICghb3B0cykge1xuICAgICAgICBvcHRzID0ge307XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbih0aGlzLCBlbGVzLCBvcHRzLnVuaXF1ZSwgb3B0cy5yZW1vdmVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IENvbGxlY3Rpb24odGhpcyk7XG4gIH0sXG4gIG5vZGVzOiBmdW5jdGlvbiBub2RlcyhzZWxlY3Rvcikge1xuICAgIHZhciBub2RlcyA9IHRoaXMuJChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzTm9kZSgpO1xuICAgIH0pO1xuXG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gbm9kZXMuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZXM7XG4gIH0sXG4gIGVkZ2VzOiBmdW5jdGlvbiBlZGdlcyhzZWxlY3Rvcikge1xuICAgIHZhciBlZGdlcyA9IHRoaXMuJChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzRWRnZSgpO1xuICAgIH0pO1xuXG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gZWRnZXMuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWRnZXM7XG4gIH0sXG4gIC8vIHNlYXJjaCB0aGUgZ3JhcGggbGlrZSBqUXVlcnlcbiAgJDogZnVuY3Rpb24gJChzZWxlY3Rvcikge1xuICAgIHZhciBlbGVzID0gdGhpcy5fcHJpdmF0ZS5lbGVtZW50cztcblxuICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIGVsZXMuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsZXMuc3Bhd25TZWxmKCk7XG4gICAgfVxuICB9LFxuICBtdXRhYmxlRWxlbWVudHM6IGZ1bmN0aW9uIG11dGFibGVFbGVtZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5lbGVtZW50cztcbiAgfVxufTsgLy8gYWxpYXNlc1xuXG5jb3JlZm4kMy5lbGVtZW50cyA9IGNvcmVmbiQzLmZpbHRlciA9IGNvcmVmbiQzLiQ7XG5cbnZhciBzdHlmbiQ4ID0ge307IC8vIGtleXMgZm9yIHN0eWxlIGJsb2NrcywgZS5nLiB0dGZmdHRcblxudmFyIFRSVUUgPSAndCc7XG52YXIgRkFMU0UgPSAnZic7IC8vIChwb3RlbnRpYWxseSBleHBlbnNpdmUgY2FsY3VsYXRpb24pXG4vLyBhcHBseSB0aGUgc3R5bGUgdG8gdGhlIGVsZW1lbnQgYmFzZWQgb25cbi8vIC0gaXRzIGJ5cGFzc1xuLy8gLSB3aGF0IHNlbGVjdG9ycyBtYXRjaCBpdFxuXG5zdHlmbiQ4LmFwcGx5ID0gZnVuY3Rpb24gKGVsZXMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgX3AgPSBzZWxmLl9wcml2YXRlO1xuICB2YXIgY3kgPSBfcC5jeTtcbiAgdmFyIHVwZGF0ZWRFbGVzID0gY3kuY29sbGVjdGlvbigpO1xuXG4gIGZvciAodmFyIGllID0gMDsgaWUgPCBlbGVzLmxlbmd0aDsgaWUrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2llXTtcbiAgICB2YXIgY3h0TWV0YSA9IHNlbGYuZ2V0Q29udGV4dE1ldGEoZWxlKTtcblxuICAgIGlmIChjeHRNZXRhLmVtcHR5KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgY3h0U3R5bGUgPSBzZWxmLmdldENvbnRleHRTdHlsZShjeHRNZXRhKTtcbiAgICB2YXIgYXBwID0gc2VsZi5hcHBseUNvbnRleHRTdHlsZShjeHRNZXRhLCBjeHRTdHlsZSwgZWxlKTtcblxuICAgIGlmIChlbGUuX3ByaXZhdGUuYXBwbGllZEluaXRTdHlsZSkge1xuICAgICAgc2VsZi51cGRhdGVUcmFuc2l0aW9ucyhlbGUsIGFwcC5kaWZmUHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGUuX3ByaXZhdGUuYXBwbGllZEluaXRTdHlsZSA9IHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGhpbnRzRGlmZiA9IHNlbGYudXBkYXRlU3R5bGVIaW50cyhlbGUpO1xuXG4gICAgaWYgKGhpbnRzRGlmZikge1xuICAgICAgdXBkYXRlZEVsZXMucHVzaChlbGUpO1xuICAgIH1cbiAgfSAvLyBmb3IgZWxlbWVudHNcblxuXG4gIHJldHVybiB1cGRhdGVkRWxlcztcbn07XG5cbnN0eWZuJDguZ2V0UHJvcGVydGllc0RpZmYgPSBmdW5jdGlvbiAob2xkQ3h0S2V5LCBuZXdDeHRLZXkpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY2FjaGUgPSBzZWxmLl9wcml2YXRlLnByb3BEaWZmcyA9IHNlbGYuX3ByaXZhdGUucHJvcERpZmZzIHx8IHt9O1xuICB2YXIgZHVhbEN4dEtleSA9IG9sZEN4dEtleSArICctJyArIG5ld0N4dEtleTtcbiAgdmFyIGNhY2hlZFZhbCA9IGNhY2hlW2R1YWxDeHRLZXldO1xuXG4gIGlmIChjYWNoZWRWYWwpIHtcbiAgICByZXR1cm4gY2FjaGVkVmFsO1xuICB9XG5cbiAgdmFyIGRpZmZQcm9wcyA9IFtdO1xuICB2YXIgYWRkZWRQcm9wID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGN4dCA9IHNlbGZbaV07XG4gICAgdmFyIG9sZEhhc0N4dCA9IG9sZEN4dEtleVtpXSA9PT0gVFJVRTtcbiAgICB2YXIgbmV3SGFzQ3h0ID0gbmV3Q3h0S2V5W2ldID09PSBUUlVFO1xuICAgIHZhciBjeHRIYXNEaWZmZWQgPSBvbGRIYXNDeHQgIT09IG5ld0hhc0N4dDtcbiAgICB2YXIgY3h0SGFzTWFwcGVkUHJvcHMgPSBjeHQubWFwcGVkUHJvcGVydGllcy5sZW5ndGggPiAwO1xuXG4gICAgaWYgKGN4dEhhc0RpZmZlZCB8fCBuZXdIYXNDeHQgJiYgY3h0SGFzTWFwcGVkUHJvcHMpIHtcbiAgICAgIHZhciBwcm9wcyA9IHZvaWQgMDtcblxuICAgICAgaWYgKGN4dEhhc0RpZmZlZCAmJiBjeHRIYXNNYXBwZWRQcm9wcykge1xuICAgICAgICBwcm9wcyA9IGN4dC5wcm9wZXJ0aWVzOyAvLyBzdWZmaWNlcyBiL2MgbWFwcGVkUHJvcGVydGllcyBpcyBhIHN1YnNldCBvZiBwcm9wZXJ0aWVzXG4gICAgICB9IGVsc2UgaWYgKGN4dEhhc0RpZmZlZCkge1xuICAgICAgICBwcm9wcyA9IGN4dC5wcm9wZXJ0aWVzOyAvLyBuZWVkIHRvIGNoZWNrIHRoZW0gYWxsXG4gICAgICB9IGVsc2UgaWYgKGN4dEhhc01hcHBlZFByb3BzKSB7XG4gICAgICAgIHByb3BzID0gY3h0Lm1hcHBlZFByb3BlcnRpZXM7IC8vIG9ubHkgbmVlZCB0byBjaGVjayBtYXBwZWRcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgcHJvcCA9IHByb3BzW2pdO1xuICAgICAgICB2YXIgbmFtZSA9IHByb3AubmFtZTsgLy8gaWYgYSBsYXRlciBjb250ZXh0IG92ZXJyaWRlcyB0aGlzIHByb3BlcnR5LCB0aGVuIHRoZSBmYWN0IHRoYXQgdGhpcyBjb250ZXh0IGhhcyBzd2l0Y2hlZC9kaWZmZWQgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgLy8gKHNlbWkgZXhwZW5zaXZlIGNoZWNrIHNpbmNlIGl0IG1ha2VzIHRoaXMgZnVuY3Rpb24gTyhuXjIpIG9uIGNvbnRleHQgbGVuZ3RoLCBidXQgd29ydGggaXQgc2luY2Ugb3ZlcmFsbCByZXN1bHRcbiAgICAgICAgLy8gaXMgY2FjaGVkKVxuXG4gICAgICAgIHZhciBsYXRlckN4dE92ZXJyaWRlcyA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAodmFyIGsgPSBpICsgMTsgayA8IHNlbGYubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICB2YXIgbGF0ZXJDeHQgPSBzZWxmW2tdO1xuICAgICAgICAgIHZhciBoYXNMYXRlckN4dCA9IG5ld0N4dEtleVtrXSA9PT0gVFJVRTtcblxuICAgICAgICAgIGlmICghaGFzTGF0ZXJDeHQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gLy8gY2FuJ3Qgb3ZlcnJpZGUgdW5sZXNzIHRoZSBjb250ZXh0IGlzIGFjdGl2ZVxuXG5cbiAgICAgICAgICBsYXRlckN4dE92ZXJyaWRlcyA9IGxhdGVyQ3h0LnByb3BlcnRpZXNbcHJvcC5uYW1lXSAhPSBudWxsO1xuXG4gICAgICAgICAgaWYgKGxhdGVyQ3h0T3ZlcnJpZGVzKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9IC8vIGV4aXQgZWFybHkgYXMgbG9uZyBhcyBvbmUgbGF0ZXIgY29udGV4dCBvdmVycmlkZXNcblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFhZGRlZFByb3BbbmFtZV0gJiYgIWxhdGVyQ3h0T3ZlcnJpZGVzKSB7XG4gICAgICAgICAgYWRkZWRQcm9wW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgICBkaWZmUHJvcHMucHVzaChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBmb3IgcHJvcHNcblxuICAgIH0gLy8gaWZcblxuICB9IC8vIGZvciBjb250ZXh0c1xuXG5cbiAgY2FjaGVbZHVhbEN4dEtleV0gPSBkaWZmUHJvcHM7XG4gIHJldHVybiBkaWZmUHJvcHM7XG59O1xuXG5zdHlmbiQ4LmdldENvbnRleHRNZXRhID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBjeHRLZXkgPSAnJztcbiAgdmFyIGRpZmZQcm9wcztcbiAgdmFyIHByZXZLZXkgPSBlbGUuX3ByaXZhdGUuc3R5bGVDeHRLZXkgfHwgJyc7IC8vIGdldCB0aGUgY3h0IGtleVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjb250ZXh0ID0gc2VsZltpXTtcbiAgICB2YXIgY29udGV4dFNlbGVjdG9yTWF0Y2hlcyA9IGNvbnRleHQuc2VsZWN0b3IgJiYgY29udGV4dC5zZWxlY3Rvci5tYXRjaGVzKGVsZSk7IC8vIE5COiBjb250ZXh0LnNlbGVjdG9yIG1heSBiZSBudWxsIGZvciAnY29yZSdcblxuICAgIGlmIChjb250ZXh0U2VsZWN0b3JNYXRjaGVzKSB7XG4gICAgICBjeHRLZXkgKz0gVFJVRTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3h0S2V5ICs9IEZBTFNFO1xuICAgIH1cbiAgfSAvLyBmb3IgY29udGV4dFxuXG5cbiAgZGlmZlByb3BzID0gc2VsZi5nZXRQcm9wZXJ0aWVzRGlmZihwcmV2S2V5LCBjeHRLZXkpO1xuICBlbGUuX3ByaXZhdGUuc3R5bGVDeHRLZXkgPSBjeHRLZXk7XG4gIHJldHVybiB7XG4gICAga2V5OiBjeHRLZXksXG4gICAgZGlmZlByb3BOYW1lczogZGlmZlByb3BzLFxuICAgIGVtcHR5OiBkaWZmUHJvcHMubGVuZ3RoID09PSAwXG4gIH07XG59OyAvLyBnZXRzIGEgY29tcHV0ZWQgZWxlIHN0eWxlIG9iamVjdCBiYXNlZCBvbiBtYXRjaGVkIGNvbnRleHRzXG5cblxuc3R5Zm4kOC5nZXRDb250ZXh0U3R5bGUgPSBmdW5jdGlvbiAoY3h0TWV0YSkge1xuICB2YXIgY3h0S2V5ID0gY3h0TWV0YS5rZXk7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGN4dFN0eWxlcyA9IHRoaXMuX3ByaXZhdGUuY29udGV4dFN0eWxlcyA9IHRoaXMuX3ByaXZhdGUuY29udGV4dFN0eWxlcyB8fCB7fTsgLy8gaWYgYWxyZWFkeSBjb21wdXRlZCBzdHlsZSwgcmV0dXJuZWQgY2FjaGVkIGNvcHlcblxuICBpZiAoY3h0U3R5bGVzW2N4dEtleV0pIHtcbiAgICByZXR1cm4gY3h0U3R5bGVzW2N4dEtleV07XG4gIH1cblxuICB2YXIgc3R5bGUgPSB7XG4gICAgX3ByaXZhdGU6IHtcbiAgICAgIGtleTogY3h0S2V5XG4gICAgfVxuICB9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjeHQgPSBzZWxmW2ldO1xuICAgIHZhciBoYXNDeHQgPSBjeHRLZXlbaV0gPT09IFRSVUU7XG5cbiAgICBpZiAoIWhhc0N4dCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBjeHQucHJvcGVydGllcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIHByb3AgPSBjeHQucHJvcGVydGllc1tqXTtcbiAgICAgIHN0eWxlW3Byb3AubmFtZV0gPSBwcm9wO1xuICAgIH1cbiAgfVxuXG4gIGN4dFN0eWxlc1tjeHRLZXldID0gc3R5bGU7XG4gIHJldHVybiBzdHlsZTtcbn07XG5cbnN0eWZuJDguYXBwbHlDb250ZXh0U3R5bGUgPSBmdW5jdGlvbiAoY3h0TWV0YSwgY3h0U3R5bGUsIGVsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBkaWZmUHJvcHMgPSBjeHRNZXRhLmRpZmZQcm9wTmFtZXM7XG4gIHZhciByZXREaWZmUHJvcHMgPSB7fTtcbiAgdmFyIHR5cGVzID0gc2VsZi50eXBlcztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRpZmZQcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkaWZmUHJvcE5hbWUgPSBkaWZmUHJvcHNbaV07XG4gICAgdmFyIGN4dFByb3AgPSBjeHRTdHlsZVtkaWZmUHJvcE5hbWVdO1xuICAgIHZhciBlbGVQcm9wID0gZWxlLnBzdHlsZShkaWZmUHJvcE5hbWUpO1xuXG4gICAgaWYgKCFjeHRQcm9wKSB7XG4gICAgICAvLyBubyBjb250ZXh0IHByb3AgbWVhbnMgZGVsZXRlXG4gICAgICBpZiAoIWVsZVByb3ApIHtcbiAgICAgICAgY29udGludWU7IC8vIG5vIGV4aXN0aW5nIHByb3AgbWVhbnMgbm90aGluZyBuZWVkcyB0byBiZSByZW1vdmVkXG4gICAgICAgIC8vIG5iIGFmZmVjdHMgaW5pdGlhbCBhcHBsaWNhdGlvbiBvbiBtYXBwZWQgdmFsdWVzIGxpa2UgY29udHJvbC1wb2ludC1kaXN0YW5jZXNcbiAgICAgIH0gZWxzZSBpZiAoZWxlUHJvcC5ieXBhc3MpIHtcbiAgICAgICAgY3h0UHJvcCA9IHtcbiAgICAgICAgICBuYW1lOiBkaWZmUHJvcE5hbWUsXG4gICAgICAgICAgZGVsZXRlQnlwYXNzZWQ6IHRydWVcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN4dFByb3AgPSB7XG4gICAgICAgICAgbmFtZTogZGlmZlByb3BOYW1lLFxuICAgICAgICAgIFwiZGVsZXRlXCI6IHRydWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IC8vIHNhdmUgY3ljbGVzIHdoZW4gdGhlIGNvbnRleHQgcHJvcCBkb2Vzbid0IG5lZWQgdG8gYmUgYXBwbGllZFxuXG5cbiAgICBpZiAoZWxlUHJvcCA9PT0gY3h0UHJvcCkge1xuICAgICAgY29udGludWU7XG4gICAgfSAvLyBzYXZlIGN5Y2xlcyB3aGVuIGEgbWFwcGVkIGNvbnRleHQgcHJvcCBkb2Vzbid0IG5lZWQgdG8gYmUgYXBwbGllZFxuXG5cbiAgICBpZiAoY3h0UHJvcC5tYXBwZWQgPT09IHR5cGVzLmZuIC8vIGNvbnRleHQgcHJvcCBpcyBmdW5jdGlvbiBtYXBwZXJcbiAgICAmJiBlbGVQcm9wICE9IG51bGwgLy8gc29tZSBwcm9wcyBjYW4gYmUgbnVsbCBldmVuIGJ5IGRlZmF1bHQgKGUuZy4gYSBwcm9wIHRoYXQgb3ZlcnJpZGVzIGFub3RoZXIgb25lKVxuICAgICYmIGVsZVByb3AubWFwcGluZyAhPSBudWxsIC8vIGVsZSBwcm9wIGlzIGEgY29uY3JldGUgdmFsdWUgZnJvbSBmcm9tIGEgbWFwcGVyXG4gICAgJiYgZWxlUHJvcC5tYXBwaW5nLnZhbHVlID09PSBjeHRQcm9wLnZhbHVlIC8vIHRoZSBjdXJyZW50IHByb3Agb24gdGhlIGVsZSBpcyBhIGZsYXQgcHJvcCB2YWx1ZSBmb3IgdGhlIGZ1bmN0aW9uIG1hcHBlclxuICAgICkge1xuICAgICAgLy8gTkIgZG9uJ3Qgd3JpdGUgdG8gY3h0UHJvcCwgYXMgaXQncyBzaGFyZWQgYW1vbmcgZWxlcyAoc3RvcmVkIGluIHN0eWxlc2hlZXQpXG4gICAgICB2YXIgbWFwcGluZyA9IGVsZVByb3AubWFwcGluZzsgLy8gY2FuIHdyaXRlIHRvIG1hcHBpbmcsIGFzIGl0J3MgYSBwZXItZWxlIGNvcHlcblxuICAgICAgdmFyIGZuVmFsdWUgPSBtYXBwaW5nLmZuVmFsdWUgPSBjeHRQcm9wLnZhbHVlKGVsZSk7IC8vIHRlbXBvcmFyaWx5IGNhY2hlIHRoZSB2YWx1ZSBpbiBjYXNlIG9mIGEgbWlzc1xuXG4gICAgICBpZiAoZm5WYWx1ZSA9PT0gbWFwcGluZy5wcmV2Rm5WYWx1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmV0RGlmZlByb3AgPSByZXREaWZmUHJvcHNbZGlmZlByb3BOYW1lXSA9IHtcbiAgICAgIHByZXY6IGVsZVByb3BcbiAgICB9O1xuICAgIHNlbGYuYXBwbHlQYXJzZWRQcm9wZXJ0eShlbGUsIGN4dFByb3ApO1xuICAgIHJldERpZmZQcm9wLm5leHQgPSBlbGUucHN0eWxlKGRpZmZQcm9wTmFtZSk7XG5cbiAgICBpZiAocmV0RGlmZlByb3AubmV4dCAmJiByZXREaWZmUHJvcC5uZXh0LmJ5cGFzcykge1xuICAgICAgcmV0RGlmZlByb3AubmV4dCA9IHJldERpZmZQcm9wLm5leHQuYnlwYXNzZWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBkaWZmUHJvcHM6IHJldERpZmZQcm9wc1xuICB9O1xufTtcblxuc3R5Zm4kOC51cGRhdGVTdHlsZUhpbnRzID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHByb3BOYW1lcyA9IHNlbGYucHJvcGVydHlHcm91cE5hbWVzO1xuICB2YXIgcHJvcEdyS2V5cyA9IHNlbGYucHJvcGVydHlHcm91cEtleXM7XG5cbiAgdmFyIHByb3BIYXNoID0gZnVuY3Rpb24gcHJvcEhhc2goZWxlLCBwcm9wTmFtZXMsIHNlZWRLZXkpIHtcbiAgICByZXR1cm4gc2VsZi5nZXRQcm9wZXJ0aWVzSGFzaChlbGUsIHByb3BOYW1lcywgc2VlZEtleSk7XG4gIH07XG5cbiAgdmFyIG9sZFN0eWxlS2V5ID0gX3Auc3R5bGVLZXk7XG5cbiAgaWYgKGVsZS5yZW1vdmVkKCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgaXNOb2RlID0gX3AuZ3JvdXAgPT09ICdub2Rlcyc7IC8vIGdldCB0aGUgc3R5bGUga2V5IGhhc2hlcyBwZXIgcHJvcCBncm91cFxuICAvLyBidXQgbGF6aWx5IC0tIG9ubHkgdXNlIG5vbi1kZWZhdWx0IHByb3AgdmFsdWVzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGhhc2hlc1xuICAvL1xuXG4gIHZhciBvdmVycmlkZGVuU3R5bGVzID0gZWxlLl9wcml2YXRlLnN0eWxlO1xuICBwcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhvdmVycmlkZGVuU3R5bGVzKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BHcktleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZ3JLZXkgPSBwcm9wR3JLZXlzW2ldO1xuICAgIF9wLnN0eWxlS2V5c1tncktleV0gPSBbREVGQVVMVF9IQVNIX1NFRUQsIERFRkFVTFRfSEFTSF9TRUVEX0FMVF07XG4gIH1cblxuICB2YXIgdXBkYXRlR3JLZXkxID0gZnVuY3Rpb24gdXBkYXRlR3JLZXkxKHZhbCwgZ3JLZXkpIHtcbiAgICByZXR1cm4gX3Auc3R5bGVLZXlzW2dyS2V5XVswXSA9IGhhc2hJbnQodmFsLCBfcC5zdHlsZUtleXNbZ3JLZXldWzBdKTtcbiAgfTtcblxuICB2YXIgdXBkYXRlR3JLZXkyID0gZnVuY3Rpb24gdXBkYXRlR3JLZXkyKHZhbCwgZ3JLZXkpIHtcbiAgICByZXR1cm4gX3Auc3R5bGVLZXlzW2dyS2V5XVsxXSA9IGhhc2hJbnRBbHQodmFsLCBfcC5zdHlsZUtleXNbZ3JLZXldWzFdKTtcbiAgfTtcblxuICB2YXIgdXBkYXRlR3JLZXkgPSBmdW5jdGlvbiB1cGRhdGVHcktleSh2YWwsIGdyS2V5KSB7XG4gICAgdXBkYXRlR3JLZXkxKHZhbCwgZ3JLZXkpO1xuICAgIHVwZGF0ZUdyS2V5Mih2YWwsIGdyS2V5KTtcbiAgfTtcblxuICB2YXIgdXBkYXRlR3JLZXlXU3RyID0gZnVuY3Rpb24gdXBkYXRlR3JLZXlXU3RyKHN0clZhbCwgZ3JLZXkpIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHN0clZhbC5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIGNoID0gc3RyVmFsLmNoYXJDb2RlQXQoaik7XG4gICAgICB1cGRhdGVHcktleTEoY2gsIGdyS2V5KTtcbiAgICAgIHVwZGF0ZUdyS2V5MihjaCwgZ3JLZXkpO1xuICAgIH1cbiAgfTsgLy8gLSBoYXNoaW5nIHdvcmtzIG9uIDMyIGJpdCBpbnRzIGIvYyB3ZSB1c2UgYml0d2lzZSBvcHNcbiAgLy8gLSBzbWFsbCBudW1iZXJzIGdldCBjdXQgb2ZmIChlLmcuIDAuMTIzIGlzIHNlZW4gYXMgMCBieSB0aGUgaGFzaGluZyBmdW5jdGlvbilcbiAgLy8gLSByYWlzZSB1cCBzbWFsbCBudW1iZXJzIHNvIG1vcmUgc2lnbmlmaWNhbnQgZGlnaXRzIGFyZSBzZWVuIGJ5IGhhc2hpbmdcbiAgLy8gLSBtYWtlIHNtYWxsIG51bWJlcnMgbGFyZ2VyIHRoYW4gYSBub3JtYWwgdmFsdWUgdG8gYXZvaWQgY29sbGlzaW9uc1xuICAvLyAtIHdvcmtzIGluIHByYWN0aWNlIGFuZCBpdCdzIHJlbGF0aXZlbHkgY2hlYXBcblxuXG4gIHZhciBOID0gMjAwMDAwMDAwMDtcblxuICB2YXIgY2xlYW5OdW0gPSBmdW5jdGlvbiBjbGVhbk51bSh2YWwpIHtcbiAgICByZXR1cm4gLTEyOCA8IHZhbCAmJiB2YWwgPCAxMjggJiYgTWF0aC5mbG9vcih2YWwpICE9PSB2YWwgPyBOIC0gKHZhbCAqIDEwMjQgfCAwKSA6IHZhbDtcbiAgfTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgcHJvcE5hbWVzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBuYW1lID0gcHJvcE5hbWVzW19pXTtcbiAgICB2YXIgcGFyc2VkUHJvcCA9IG92ZXJyaWRkZW5TdHlsZXNbbmFtZV07XG5cbiAgICBpZiAocGFyc2VkUHJvcCA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgcHJvcEluZm8gPSB0aGlzLnByb3BlcnRpZXNbbmFtZV07XG4gICAgdmFyIHR5cGUgPSBwcm9wSW5mby50eXBlO1xuICAgIHZhciBfZ3JLZXkgPSBwcm9wSW5mby5ncm91cEtleTtcbiAgICB2YXIgbm9ybWFsaXplZE51bWJlclZhbCA9IHZvaWQgMDtcblxuICAgIGlmIChwcm9wSW5mby5oYXNoT3ZlcnJpZGUgIT0gbnVsbCkge1xuICAgICAgbm9ybWFsaXplZE51bWJlclZhbCA9IHByb3BJbmZvLmhhc2hPdmVycmlkZShlbGUsIHBhcnNlZFByb3ApO1xuICAgIH0gZWxzZSBpZiAocGFyc2VkUHJvcC5wZlZhbHVlICE9IG51bGwpIHtcbiAgICAgIG5vcm1hbGl6ZWROdW1iZXJWYWwgPSBwYXJzZWRQcm9wLnBmVmFsdWU7XG4gICAgfSAvLyBtaWdodCBub3QgYmUgYSBudW1iZXIgaWYgaXQgYWxsb3dzIGVudW1zXG5cblxuICAgIHZhciBudW1iZXJWYWwgPSBwcm9wSW5mby5lbnVtcyA9PSBudWxsID8gcGFyc2VkUHJvcC52YWx1ZSA6IG51bGw7XG4gICAgdmFyIGhhdmVOb3JtTnVtID0gbm9ybWFsaXplZE51bWJlclZhbCAhPSBudWxsO1xuICAgIHZhciBoYXZlVW5pdGVkTnVtID0gbnVtYmVyVmFsICE9IG51bGw7XG4gICAgdmFyIGhhdmVOdW0gPSBoYXZlTm9ybU51bSB8fCBoYXZlVW5pdGVkTnVtO1xuICAgIHZhciB1bml0cyA9IHBhcnNlZFByb3AudW5pdHM7IC8vIG51bWJlcnMgYXJlIGNoZWFwZXIgdG8gaGFzaCB0aGFuIHN0cmluZ3NcbiAgICAvLyAxIGhhc2ggb3AgdnMgbiBoYXNoIG9wcyAoZm9yIGxlbmd0aCBuIHN0cmluZylcblxuICAgIGlmICh0eXBlLm51bWJlciAmJiBoYXZlTnVtICYmICF0eXBlLm11bHRpcGxlKSB7XG4gICAgICB2YXIgdiA9IGhhdmVOb3JtTnVtID8gbm9ybWFsaXplZE51bWJlclZhbCA6IG51bWJlclZhbDtcbiAgICAgIHVwZGF0ZUdyS2V5KGNsZWFuTnVtKHYpLCBfZ3JLZXkpO1xuXG4gICAgICBpZiAoIWhhdmVOb3JtTnVtICYmIHVuaXRzICE9IG51bGwpIHtcbiAgICAgICAgdXBkYXRlR3JLZXlXU3RyKHVuaXRzLCBfZ3JLZXkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGVHcktleVdTdHIocGFyc2VkUHJvcC5zdHJWYWx1ZSwgX2dyS2V5KTtcbiAgICB9XG4gIH0gLy8gb3ZlcmFsbCBzdHlsZSBrZXlcbiAgLy9cblxuXG4gIHZhciBoYXNoID0gW0RFRkFVTFRfSEFTSF9TRUVELCBERUZBVUxUX0hBU0hfU0VFRF9BTFRdO1xuXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHByb3BHcktleXMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciBfZ3JLZXkyID0gcHJvcEdyS2V5c1tfaTJdO1xuICAgIHZhciBnckhhc2ggPSBfcC5zdHlsZUtleXNbX2dyS2V5Ml07XG4gICAgaGFzaFswXSA9IGhhc2hJbnQoZ3JIYXNoWzBdLCBoYXNoWzBdKTtcbiAgICBoYXNoWzFdID0gaGFzaEludEFsdChnckhhc2hbMV0sIGhhc2hbMV0pO1xuICB9XG5cbiAgX3Auc3R5bGVLZXkgPSBjb21iaW5lSGFzaGVzKGhhc2hbMF0sIGhhc2hbMV0pOyAvLyBsYWJlbCBkaW1zXG4gIC8vXG5cbiAgdmFyIHNrID0gX3Auc3R5bGVLZXlzO1xuICBfcC5sYWJlbERpbXNLZXkgPSBjb21iaW5lSGFzaGVzQXJyYXkoc2subGFiZWxEaW1lbnNpb25zKTtcbiAgdmFyIGxhYmVsS2V5cyA9IHByb3BIYXNoKGVsZSwgWydsYWJlbCddLCBzay5sYWJlbERpbWVuc2lvbnMpO1xuICBfcC5sYWJlbEtleSA9IGNvbWJpbmVIYXNoZXNBcnJheShsYWJlbEtleXMpO1xuICBfcC5sYWJlbFN0eWxlS2V5ID0gY29tYmluZUhhc2hlc0FycmF5KGhhc2hBcnJheXMoc2suY29tbW9uTGFiZWwsIGxhYmVsS2V5cykpO1xuXG4gIGlmICghaXNOb2RlKSB7XG4gICAgdmFyIHNvdXJjZUxhYmVsS2V5cyA9IHByb3BIYXNoKGVsZSwgWydzb3VyY2UtbGFiZWwnXSwgc2subGFiZWxEaW1lbnNpb25zKTtcbiAgICBfcC5zb3VyY2VMYWJlbEtleSA9IGNvbWJpbmVIYXNoZXNBcnJheShzb3VyY2VMYWJlbEtleXMpO1xuICAgIF9wLnNvdXJjZUxhYmVsU3R5bGVLZXkgPSBjb21iaW5lSGFzaGVzQXJyYXkoaGFzaEFycmF5cyhzay5jb21tb25MYWJlbCwgc291cmNlTGFiZWxLZXlzKSk7XG4gICAgdmFyIHRhcmdldExhYmVsS2V5cyA9IHByb3BIYXNoKGVsZSwgWyd0YXJnZXQtbGFiZWwnXSwgc2subGFiZWxEaW1lbnNpb25zKTtcbiAgICBfcC50YXJnZXRMYWJlbEtleSA9IGNvbWJpbmVIYXNoZXNBcnJheSh0YXJnZXRMYWJlbEtleXMpO1xuICAgIF9wLnRhcmdldExhYmVsU3R5bGVLZXkgPSBjb21iaW5lSGFzaGVzQXJyYXkoaGFzaEFycmF5cyhzay5jb21tb25MYWJlbCwgdGFyZ2V0TGFiZWxLZXlzKSk7XG4gIH0gLy8gbm9kZVxuICAvL1xuXG5cbiAgaWYgKGlzTm9kZSkge1xuICAgIHZhciBfcCRzdHlsZUtleXMgPSBfcC5zdHlsZUtleXMsXG4gICAgICAgIG5vZGVCb2R5ID0gX3Akc3R5bGVLZXlzLm5vZGVCb2R5LFxuICAgICAgICBub2RlQm9yZGVyID0gX3Akc3R5bGVLZXlzLm5vZGVCb3JkZXIsXG4gICAgICAgIGJhY2tncm91bmRJbWFnZSA9IF9wJHN0eWxlS2V5cy5iYWNrZ3JvdW5kSW1hZ2UsXG4gICAgICAgIGNvbXBvdW5kID0gX3Akc3R5bGVLZXlzLmNvbXBvdW5kLFxuICAgICAgICBwaWUgPSBfcCRzdHlsZUtleXMucGllO1xuICAgIHZhciBub2RlS2V5cyA9IFtub2RlQm9keSwgbm9kZUJvcmRlciwgYmFja2dyb3VuZEltYWdlLCBjb21wb3VuZCwgcGllXS5maWx0ZXIoZnVuY3Rpb24gKGspIHtcbiAgICAgIHJldHVybiBrICE9IG51bGw7XG4gICAgfSkucmVkdWNlKGhhc2hBcnJheXMsIFtERUZBVUxUX0hBU0hfU0VFRCwgREVGQVVMVF9IQVNIX1NFRURfQUxUXSk7XG4gICAgX3Aubm9kZUtleSA9IGNvbWJpbmVIYXNoZXNBcnJheShub2RlS2V5cyk7XG4gICAgX3AuaGFzUGllID0gcGllICE9IG51bGwgJiYgcGllWzBdICE9PSBERUZBVUxUX0hBU0hfU0VFRCAmJiBwaWVbMV0gIT09IERFRkFVTFRfSEFTSF9TRUVEX0FMVDtcbiAgfVxuXG4gIHJldHVybiBvbGRTdHlsZUtleSAhPT0gX3Auc3R5bGVLZXk7XG59O1xuXG5zdHlmbiQ4LmNsZWFyU3R5bGVIaW50cyA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICBfcC5zdHlsZUN4dEtleSA9ICcnO1xuICBfcC5zdHlsZUtleXMgPSB7fTtcbiAgX3Auc3R5bGVLZXkgPSBudWxsO1xuICBfcC5sYWJlbEtleSA9IG51bGw7XG4gIF9wLmxhYmVsU3R5bGVLZXkgPSBudWxsO1xuICBfcC5zb3VyY2VMYWJlbEtleSA9IG51bGw7XG4gIF9wLnNvdXJjZUxhYmVsU3R5bGVLZXkgPSBudWxsO1xuICBfcC50YXJnZXRMYWJlbEtleSA9IG51bGw7XG4gIF9wLnRhcmdldExhYmVsU3R5bGVLZXkgPSBudWxsO1xuICBfcC5ub2RlS2V5ID0gbnVsbDtcbiAgX3AuaGFzUGllID0gbnVsbDtcbn07IC8vIGFwcGx5IGEgcHJvcGVydHkgdG8gdGhlIHN0eWxlIChmb3IgaW50ZXJuYWwgdXNlKVxuLy8gcmV0dXJucyB3aGV0aGVyIGFwcGxpY2F0aW9uIHdhcyBzdWNjZXNzZnVsXG4vL1xuLy8gbm93LCB0aGlzIGZ1bmN0aW9uIGZsYXR0ZW5zIHRoZSBwcm9wZXJ0eSwgYW5kIGhlcmUncyBob3c6XG4vL1xuLy8gZm9yIHBhcnNlZFByb3A6eyBieXBhc3M6IHRydWUsIGRlbGV0ZUJ5cGFzczogdHJ1ZSB9XG4vLyBubyBwcm9wZXJ0eSBpcyBnZW5lcmF0ZWQsIGluc3RlYWQgdGhlIGJ5cGFzcyBwcm9wZXJ0eSBpbiB0aGVcbi8vIGVsZW1lbnQncyBzdHlsZSBpcyByZXBsYWNlZCBieSB3aGF0J3MgcG9pbnRlZCB0byBieSB0aGUgYGJ5cGFzc2VkYFxuLy8gZmllbGQgaW4gdGhlIGJ5cGFzcyBwcm9wZXJ0eSAoaS5lLiByZXN0b3JpbmcgdGhlIHByb3BlcnR5IHRoZVxuLy8gYnlwYXNzIHdhcyBvdmVycmlkaW5nKVxuLy9cbi8vIGZvciBwYXJzZWRQcm9wOnsgbWFwcGVkOiB0cnV0aHkgfVxuLy8gdGhlIGdlbmVyYXRlZCBmbGF0dGVuZWRQcm9wOnsgbWFwcGluZzogcHJvcCB9XG4vL1xuLy8gZm9yIHBhcnNlZFByb3A6eyBieXBhc3M6IHRydWUgfVxuLy8gdGhlIGdlbmVyYXRlZCBmbGF0dGVuZWRQcm9wOnsgYnlwYXNzZWQ6IHBhcnNlZFByb3AgfVxuXG5cbnN0eWZuJDguYXBwbHlQYXJzZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChlbGUsIHBhcnNlZFByb3ApIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcHJvcCA9IHBhcnNlZFByb3A7XG4gIHZhciBzdHlsZSA9IGVsZS5fcHJpdmF0ZS5zdHlsZTtcbiAgdmFyIGZsYXRQcm9wO1xuICB2YXIgdHlwZXMgPSBzZWxmLnR5cGVzO1xuICB2YXIgdHlwZSA9IHNlbGYucHJvcGVydGllc1twcm9wLm5hbWVdLnR5cGU7XG4gIHZhciBwcm9wSXNCeXBhc3MgPSBwcm9wLmJ5cGFzcztcbiAgdmFyIG9yaWdQcm9wID0gc3R5bGVbcHJvcC5uYW1lXTtcbiAgdmFyIG9yaWdQcm9wSXNCeXBhc3MgPSBvcmlnUHJvcCAmJiBvcmlnUHJvcC5ieXBhc3M7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIGZsYXRQcm9wTWFwcGluZyA9ICdtYXBwaW5nJztcblxuICB2YXIgZ2V0VmFsID0gZnVuY3Rpb24gZ2V0VmFsKHApIHtcbiAgICBpZiAocCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHAucGZWYWx1ZSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gcC5wZlZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcC52YWx1ZTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGNoZWNrVHJpZ2dlcnMgPSBmdW5jdGlvbiBjaGVja1RyaWdnZXJzKCkge1xuICAgIHZhciBmcm9tVmFsID0gZ2V0VmFsKG9yaWdQcm9wKTtcbiAgICB2YXIgdG9WYWwgPSBnZXRWYWwocHJvcCk7XG4gICAgc2VsZi5jaGVja1RyaWdnZXJzKGVsZSwgcHJvcC5uYW1lLCBmcm9tVmFsLCB0b1ZhbCk7XG4gIH07XG5cbiAgaWYgKHByb3AgJiYgcHJvcC5uYW1lLnN1YnN0cigwLCAzKSA9PT0gJ3BpZScpIHtcbiAgICB3YXJuKCdUaGUgcGllIHN0eWxlIHByb3BlcnRpZXMgYXJlIGRlcHJlY2F0ZWQuICBDcmVhdGUgY2hhcnRzIHVzaW5nIGJhY2tncm91bmQgaW1hZ2VzIGluc3RlYWQuJyk7XG4gIH0gLy8gZWRnZSBzYW5pdHkgY2hlY2tzIHRvIHByZXZlbnQgdGhlIGNsaWVudCBmcm9tIG1ha2luZyBzZXJpb3VzIG1pc3Rha2VzXG5cblxuICBpZiAocGFyc2VkUHJvcC5uYW1lID09PSAnY3VydmUtc3R5bGUnICYmIGVsZS5pc0VkZ2UoKSAmJiAoIC8vIGxvb3BzIG11c3QgYmUgYnVuZGxlZCBiZXppZXJzXG4gIHBhcnNlZFByb3AudmFsdWUgIT09ICdiZXppZXInICYmIGVsZS5pc0xvb3AoKSB8fCAvLyBlZGdlcyBjb25uZWN0ZWQgdG8gY29tcG91bmQgbm9kZXMgY2FuIG5vdCBiZSBoYXlzdGFja3NcbiAgcGFyc2VkUHJvcC52YWx1ZSA9PT0gJ2hheXN0YWNrJyAmJiAoZWxlLnNvdXJjZSgpLmlzUGFyZW50KCkgfHwgZWxlLnRhcmdldCgpLmlzUGFyZW50KCkpKSkge1xuICAgIHByb3AgPSBwYXJzZWRQcm9wID0gdGhpcy5wYXJzZShwYXJzZWRQcm9wLm5hbWUsICdiZXppZXInLCBwcm9wSXNCeXBhc3MpO1xuICB9XG5cbiAgaWYgKHByb3BbXCJkZWxldGVcIl0pIHtcbiAgICAvLyBkZWxldGUgdGhlIHByb3BlcnR5IGFuZCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgb24gZmFsc2V5IHZhbHVlXG4gICAgc3R5bGVbcHJvcC5uYW1lXSA9IHVuZGVmaW5lZDtcbiAgICBjaGVja1RyaWdnZXJzKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAocHJvcC5kZWxldGVCeXBhc3NlZCkge1xuICAgIC8vIGRlbGV0ZSB0aGUgcHJvcGVydHkgdGhhdCB0aGVcbiAgICBpZiAoIW9yaWdQcm9wKSB7XG4gICAgICBjaGVja1RyaWdnZXJzKCk7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gY2FuJ3QgZGVsZXRlIGlmIG5vIHByb3BcbiAgICB9IGVsc2UgaWYgKG9yaWdQcm9wLmJ5cGFzcykge1xuICAgICAgLy8gZGVsZXRlIGJ5cGFzc2VkXG4gICAgICBvcmlnUHJvcC5ieXBhc3NlZCA9IHVuZGVmaW5lZDtcbiAgICAgIGNoZWNrVHJpZ2dlcnMoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIHdlJ3JlIHVuc3VjY2Vzc2Z1bCBkZWxldGluZyB0aGUgYnlwYXNzZWRcbiAgICB9XG4gIH0gLy8gY2hlY2sgaWYgd2UgbmVlZCB0byBkZWxldGUgdGhlIGN1cnJlbnQgYnlwYXNzXG5cblxuICBpZiAocHJvcC5kZWxldGVCeXBhc3MpIHtcbiAgICAvLyB0aGVuIHRoaXMgcHJvcGVydHkgaXMganVzdCBoZXJlIHRvIGluZGljYXRlIHdlIG5lZWQgdG8gZGVsZXRlXG4gICAgaWYgKCFvcmlnUHJvcCkge1xuICAgICAgY2hlY2tUcmlnZ2VycygpO1xuICAgICAgcmV0dXJuIHRydWU7IC8vIHByb3BlcnR5IGlzIGFscmVhZHkgbm90IGRlZmluZWRcbiAgICB9IGVsc2UgaWYgKG9yaWdQcm9wLmJ5cGFzcykge1xuICAgICAgLy8gdGhlbiByZXBsYWNlIHRoZSBieXBhc3MgcHJvcGVydHkgd2l0aCB0aGUgb3JpZ2luYWxcbiAgICAgIC8vIGJlY2F1c2UgdGhlIGJ5cGFzc2VkIHByb3BlcnR5IHdhcyBhbHJlYWR5IGFwcGxpZWQgKGFuZCB0aGVyZWZvcmUgcGFyc2VkKSwgd2UgY2FuIGp1c3QgcmVwbGFjZSBpdCAobm8gcmVhcHBseWluZyBuZWNlc3NhcnkpXG4gICAgICBzdHlsZVtwcm9wLm5hbWVdID0gb3JpZ1Byb3AuYnlwYXNzZWQ7XG4gICAgICBjaGVja1RyaWdnZXJzKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlOyAvLyB3ZSdyZSB1bnN1Y2Nlc3NmdWwgZGVsZXRpbmcgdGhlIGJ5cGFzc1xuICAgIH1cbiAgfVxuXG4gIHZhciBwcmludE1hcHBpbmdFcnIgPSBmdW5jdGlvbiBwcmludE1hcHBpbmdFcnIoKSB7XG4gICAgd2FybignRG8gbm90IGFzc2lnbiBtYXBwaW5ncyB0byBlbGVtZW50cyB3aXRob3V0IGNvcnJlc3BvbmRpbmcgZGF0YSAoaS5lLiBlbGUgYCcgKyBlbGUuaWQoKSArICdgIGhhcyBubyBtYXBwaW5nIGZvciBwcm9wZXJ0eSBgJyArIHByb3AubmFtZSArICdgIHdpdGggZGF0YSBmaWVsZCBgJyArIHByb3AuZmllbGQgKyAnYCk7IHRyeSBhIGBbJyArIHByb3AuZmllbGQgKyAnXWAgc2VsZWN0b3IgdG8gbGltaXQgc2NvcGUgdG8gZWxlbWVudHMgd2l0aCBgJyArIHByb3AuZmllbGQgKyAnYCBkZWZpbmVkJyk7XG4gIH07IC8vIHB1dCB0aGUgcHJvcGVydHkgaW4gdGhlIHN0eWxlIG9iamVjdHNcblxuXG4gIHN3aXRjaCAocHJvcC5tYXBwZWQpIHtcbiAgICAvLyBmbGF0dGVuIHRoZSBwcm9wZXJ0eSBpZiBtYXBwZWRcbiAgICBjYXNlIHR5cGVzLm1hcERhdGE6XG4gICAgICB7XG4gICAgICAgIC8vIGZsYXR0ZW4gdGhlIGZpZWxkIChlLmcuIGRhdGEuZm9vLmJhcilcbiAgICAgICAgdmFyIGZpZWxkcyA9IHByb3AuZmllbGQuc3BsaXQoJy4nKTtcbiAgICAgICAgdmFyIGZpZWxkVmFsID0gX3AuZGF0YTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGggJiYgZmllbGRWYWw7IGkrKykge1xuICAgICAgICAgIHZhciBmaWVsZCA9IGZpZWxkc1tpXTtcbiAgICAgICAgICBmaWVsZFZhbCA9IGZpZWxkVmFsW2ZpZWxkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWVsZFZhbCA9PSBudWxsKSB7XG4gICAgICAgICAgcHJpbnRNYXBwaW5nRXJyKCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHBlcmNlbnQ7XG5cbiAgICAgICAgaWYgKCFudW1iZXIkMShmaWVsZFZhbCkpIHtcbiAgICAgICAgICAvLyB0aGVuIGRvbid0IGFwcGx5IGFuZCBmYWxsIGJhY2sgb24gdGhlIGV4aXN0aW5nIHN0eWxlXG4gICAgICAgICAgd2FybignRG8gbm90IHVzZSBjb250aW51b3VzIG1hcHBlcnMgd2l0aG91dCBzcGVjaWZ5aW5nIG51bWVyaWMgZGF0YSAoaS5lLiBgJyArIHByb3AuZmllbGQgKyAnOiAnICsgZmllbGRWYWwgKyAnYCBmb3IgYCcgKyBlbGUuaWQoKSArICdgIGlzIG5vbi1udW1lcmljKScpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgZmllbGRXaWR0aCA9IHByb3AuZmllbGRNYXggLSBwcm9wLmZpZWxkTWluO1xuXG4gICAgICAgICAgaWYgKGZpZWxkV2lkdGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIHNhZmV0eSBjaGVjayAtLSBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IGFzIG5vIHByb3BzIG9mIHplcm8gcmFuZ2Ugc2hvdWxkIGJlIHBhc3NlZCBoZXJlXG4gICAgICAgICAgICBwZXJjZW50ID0gMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVyY2VudCA9IChmaWVsZFZhbCAtIHByb3AuZmllbGRNaW4pIC8gZmllbGRXaWR0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gbWFrZSBzdXJlIHRvIGJvdW5kIHBlcmNlbnQgdmFsdWVcblxuXG4gICAgICAgIGlmIChwZXJjZW50IDwgMCkge1xuICAgICAgICAgIHBlcmNlbnQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHBlcmNlbnQgPiAxKSB7XG4gICAgICAgICAgcGVyY2VudCA9IDE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZS5jb2xvcikge1xuICAgICAgICAgIHZhciByMSA9IHByb3AudmFsdWVNaW5bMF07XG4gICAgICAgICAgdmFyIHIyID0gcHJvcC52YWx1ZU1heFswXTtcbiAgICAgICAgICB2YXIgZzEgPSBwcm9wLnZhbHVlTWluWzFdO1xuICAgICAgICAgIHZhciBnMiA9IHByb3AudmFsdWVNYXhbMV07XG4gICAgICAgICAgdmFyIGIxID0gcHJvcC52YWx1ZU1pblsyXTtcbiAgICAgICAgICB2YXIgYjIgPSBwcm9wLnZhbHVlTWF4WzJdO1xuICAgICAgICAgIHZhciBhMSA9IHByb3AudmFsdWVNaW5bM10gPT0gbnVsbCA/IDEgOiBwcm9wLnZhbHVlTWluWzNdO1xuICAgICAgICAgIHZhciBhMiA9IHByb3AudmFsdWVNYXhbM10gPT0gbnVsbCA/IDEgOiBwcm9wLnZhbHVlTWF4WzNdO1xuICAgICAgICAgIHZhciBjbHIgPSBbTWF0aC5yb3VuZChyMSArIChyMiAtIHIxKSAqIHBlcmNlbnQpLCBNYXRoLnJvdW5kKGcxICsgKGcyIC0gZzEpICogcGVyY2VudCksIE1hdGgucm91bmQoYjEgKyAoYjIgLSBiMSkgKiBwZXJjZW50KSwgTWF0aC5yb3VuZChhMSArIChhMiAtIGExKSAqIHBlcmNlbnQpXTtcbiAgICAgICAgICBmbGF0UHJvcCA9IHtcbiAgICAgICAgICAgIC8vIGNvbG91cnMgYXJlIHNpbXBsZSwgc28ganVzdCBjcmVhdGUgdGhlIGZsYXQgcHJvcGVydHkgaW5zdGVhZCBvZiBleHBlbnNpdmUgc3RyaW5nIHBhcnNpbmdcbiAgICAgICAgICAgIGJ5cGFzczogcHJvcC5ieXBhc3MsXG4gICAgICAgICAgICAvLyB3ZSdyZSBhIGJ5cGFzcyBpZiB0aGUgbWFwcGluZyBwcm9wZXJ0eSBpcyBhIGJ5cGFzc1xuICAgICAgICAgICAgbmFtZTogcHJvcC5uYW1lLFxuICAgICAgICAgICAgdmFsdWU6IGNscixcbiAgICAgICAgICAgIHN0clZhbHVlOiAncmdiKCcgKyBjbHJbMF0gKyAnLCAnICsgY2xyWzFdICsgJywgJyArIGNsclsyXSArICcpJ1xuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZS5udW1iZXIpIHtcbiAgICAgICAgICB2YXIgY2FsY1ZhbHVlID0gcHJvcC52YWx1ZU1pbiArIChwcm9wLnZhbHVlTWF4IC0gcHJvcC52YWx1ZU1pbikgKiBwZXJjZW50O1xuICAgICAgICAgIGZsYXRQcm9wID0gdGhpcy5wYXJzZShwcm9wLm5hbWUsIGNhbGNWYWx1ZSwgcHJvcC5ieXBhc3MsIGZsYXRQcm9wTWFwcGluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBjYW4gb25seSBtYXAgdG8gY29sb3VycyBhbmQgbnVtYmVyc1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmbGF0UHJvcCkge1xuICAgICAgICAgIC8vIGlmIHdlIGNhbid0IGZsYXR0ZW4gdGhlIHByb3BlcnR5LCB0aGVuIGRvbid0IGFwcGx5IHRoZSBwcm9wZXJ0eSBhbmQgZmFsbCBiYWNrIG9uIHRoZSBleGlzdGluZyBzdHlsZVxuICAgICAgICAgIHByaW50TWFwcGluZ0VycigpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZsYXRQcm9wLm1hcHBpbmcgPSBwcm9wOyAvLyBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBtYXBwaW5nXG5cbiAgICAgICAgcHJvcCA9IGZsYXRQcm9wOyAvLyB0aGUgZmxhdHRlbmVkIChtYXBwZWQpIHByb3BlcnR5IGlzIHRoZSBvbmUgd2Ugd2FudFxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIC8vIGRpcmVjdCBtYXBwaW5nXG5cbiAgICBjYXNlIHR5cGVzLmRhdGE6XG4gICAgICB7XG4gICAgICAgIC8vIGZsYXR0ZW4gdGhlIGZpZWxkIChlLmcuIGRhdGEuZm9vLmJhcilcbiAgICAgICAgdmFyIF9maWVsZHMgPSBwcm9wLmZpZWxkLnNwbGl0KCcuJyk7XG5cbiAgICAgICAgdmFyIF9maWVsZFZhbCA9IF9wLmRhdGE7XG5cbiAgICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgX2ZpZWxkcy5sZW5ndGggJiYgX2ZpZWxkVmFsOyBfaTMrKykge1xuICAgICAgICAgIHZhciBfZmllbGQgPSBfZmllbGRzW19pM107XG4gICAgICAgICAgX2ZpZWxkVmFsID0gX2ZpZWxkVmFsW19maWVsZF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX2ZpZWxkVmFsICE9IG51bGwpIHtcbiAgICAgICAgICBmbGF0UHJvcCA9IHRoaXMucGFyc2UocHJvcC5uYW1lLCBfZmllbGRWYWwsIHByb3AuYnlwYXNzLCBmbGF0UHJvcE1hcHBpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmbGF0UHJvcCkge1xuICAgICAgICAgIC8vIGlmIHdlIGNhbid0IGZsYXR0ZW4gdGhlIHByb3BlcnR5LCB0aGVuIGRvbid0IGFwcGx5IGFuZCBmYWxsIGJhY2sgb24gdGhlIGV4aXN0aW5nIHN0eWxlXG4gICAgICAgICAgcHJpbnRNYXBwaW5nRXJyKCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZmxhdFByb3AubWFwcGluZyA9IHByb3A7IC8vIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIG1hcHBpbmdcblxuICAgICAgICBwcm9wID0gZmxhdFByb3A7IC8vIHRoZSBmbGF0dGVuZWQgKG1hcHBlZCkgcHJvcGVydHkgaXMgdGhlIG9uZSB3ZSB3YW50XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIHR5cGVzLmZuOlxuICAgICAge1xuICAgICAgICB2YXIgZm4gPSBwcm9wLnZhbHVlO1xuICAgICAgICB2YXIgZm5SZXRWYWwgPSBwcm9wLmZuVmFsdWUgIT0gbnVsbCA/IHByb3AuZm5WYWx1ZSA6IGZuKGVsZSk7IC8vIGNoZWNrIGZvciBjYWNoZWQgdmFsdWUgYmVmb3JlIGNhbGxpbmcgZnVuY3Rpb25cblxuICAgICAgICBwcm9wLnByZXZGblZhbHVlID0gZm5SZXRWYWw7XG5cbiAgICAgICAgaWYgKGZuUmV0VmFsID09IG51bGwpIHtcbiAgICAgICAgICB3YXJuKCdDdXN0b20gZnVuY3Rpb24gbWFwcGVycyBtYXkgbm90IHJldHVybiBudWxsIChpLmUuIGAnICsgcHJvcC5uYW1lICsgJ2AgZm9yIGVsZSBgJyArIGVsZS5pZCgpICsgJ2AgaXMgbnVsbCknKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmbGF0UHJvcCA9IHRoaXMucGFyc2UocHJvcC5uYW1lLCBmblJldFZhbCwgcHJvcC5ieXBhc3MsIGZsYXRQcm9wTWFwcGluZyk7XG5cbiAgICAgICAgaWYgKCFmbGF0UHJvcCkge1xuICAgICAgICAgIHdhcm4oJ0N1c3RvbSBmdW5jdGlvbiBtYXBwZXJzIG1heSBub3QgcmV0dXJuIGludmFsaWQgdmFsdWVzIGZvciB0aGUgcHJvcGVydHkgdHlwZSAoaS5lLiBgJyArIHByb3AubmFtZSArICdgIGZvciBlbGUgYCcgKyBlbGUuaWQoKSArICdgIGlzIGludmFsaWQpJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZmxhdFByb3AubWFwcGluZyA9IGNvcHkocHJvcCk7IC8vIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIG1hcHBpbmdcblxuICAgICAgICBwcm9wID0gZmxhdFByb3A7IC8vIHRoZSBmbGF0dGVuZWQgKG1hcHBlZCkgcHJvcGVydHkgaXMgdGhlIG9uZSB3ZSB3YW50XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGJyZWFrO1xuICAgIC8vIGp1c3Qgc2V0IHRoZSBwcm9wZXJ0eVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBub3QgYSB2YWxpZCBtYXBwaW5nXG4gIH0gLy8gaWYgdGhlIHByb3BlcnR5IGlzIGEgYnlwYXNzIHByb3BlcnR5LCB0aGVuIGxpbmsgdGhlIHJlc3VsdGFudCBwcm9wZXJ0eSB0byB0aGUgb3JpZ2luYWwgb25lXG5cblxuICBpZiAocHJvcElzQnlwYXNzKSB7XG4gICAgaWYgKG9yaWdQcm9wSXNCeXBhc3MpIHtcbiAgICAgIC8vIHRoZW4gdGhpcyBieXBhc3Mgb3ZlcnJpZGVzIHRoZSBleGlzdGluZyBvbmVcbiAgICAgIHByb3AuYnlwYXNzZWQgPSBvcmlnUHJvcC5ieXBhc3NlZDsgLy8gc3RlYWwgYnlwYXNzZWQgcHJvcCBmcm9tIG9sZCBieXBhc3NcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhlbiBsaW5rIHRoZSBvcmlnIHByb3AgdG8gdGhlIG5ldyBieXBhc3NcbiAgICAgIHByb3AuYnlwYXNzZWQgPSBvcmlnUHJvcDtcbiAgICB9XG5cbiAgICBzdHlsZVtwcm9wLm5hbWVdID0gcHJvcDsgLy8gYW5kIHNldFxuICB9IGVsc2Uge1xuICAgIC8vIHByb3AgaXMgbm90IGJ5cGFzc1xuICAgIGlmIChvcmlnUHJvcElzQnlwYXNzKSB7XG4gICAgICAvLyB0aGVuIGtlZXAgdGhlIG9yaWcgcHJvcCAoc2luY2UgaXQncyBhIGJ5cGFzcykgYW5kIGxpbmsgdG8gdGhlIG5ldyBwcm9wXG4gICAgICBvcmlnUHJvcC5ieXBhc3NlZCA9IHByb3A7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZW4ganVzdCByZXBsYWNlIHRoZSBvbGQgcHJvcCB3aXRoIHRoZSBuZXcgb25lXG4gICAgICBzdHlsZVtwcm9wLm5hbWVdID0gcHJvcDtcbiAgICB9XG4gIH1cblxuICBjaGVja1RyaWdnZXJzKCk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuc3R5Zm4kOC5jbGVhbkVsZW1lbnRzID0gZnVuY3Rpb24gKGVsZXMsIGtlZXBCeXBhc3Nlcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICB0aGlzLmNsZWFyU3R5bGVIaW50cyhlbGUpO1xuICAgIGVsZS5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUoKTtcbiAgICBlbGUuZGlydHlCb3VuZGluZ0JveENhY2hlKCk7XG5cbiAgICBpZiAoIWtlZXBCeXBhc3Nlcykge1xuICAgICAgZWxlLl9wcml2YXRlLnN0eWxlID0ge307XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdHlsZSA9IGVsZS5fcHJpdmF0ZS5zdHlsZTtcbiAgICAgIHZhciBwcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhzdHlsZSk7XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcHJvcE5hbWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBwcm9wTmFtZSA9IHByb3BOYW1lc1tqXTtcbiAgICAgICAgdmFyIGVsZVByb3AgPSBzdHlsZVtwcm9wTmFtZV07XG5cbiAgICAgICAgaWYgKGVsZVByb3AgIT0gbnVsbCkge1xuICAgICAgICAgIGlmIChlbGVQcm9wLmJ5cGFzcykge1xuICAgICAgICAgICAgZWxlUHJvcC5ieXBhc3NlZCA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlW3Byb3BOYW1lXSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59OyAvLyB1cGRhdGVzIHRoZSB2aXN1YWwgc3R5bGUgZm9yIGFsbCBlbGVtZW50cyAodXNlZnVsIGZvciBtYW51YWwgc3R5bGUgbW9kaWZpY2F0aW9uIGFmdGVyIGluaXQpXG5cblxuc3R5Zm4kOC51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gIHZhciBlbGVzID0gY3kubXV0YWJsZUVsZW1lbnRzKCk7XG4gIGVsZXMudXBkYXRlU3R5bGUoKTtcbn07IC8vIGRpZmZQcm9wcyA6IHsgbmFtZSA9PiB7IHByZXYsIG5leHQgfSB9XG5cblxuc3R5Zm4kOC51cGRhdGVUcmFuc2l0aW9ucyA9IGZ1bmN0aW9uIChlbGUsIGRpZmZQcm9wcykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHByb3BzID0gZWxlLnBzdHlsZSgndHJhbnNpdGlvbi1wcm9wZXJ0eScpLnZhbHVlO1xuICB2YXIgZHVyYXRpb24gPSBlbGUucHN0eWxlKCd0cmFuc2l0aW9uLWR1cmF0aW9uJykucGZWYWx1ZTtcbiAgdmFyIGRlbGF5ID0gZWxlLnBzdHlsZSgndHJhbnNpdGlvbi1kZWxheScpLnBmVmFsdWU7XG5cbiAgaWYgKHByb3BzLmxlbmd0aCA+IDAgJiYgZHVyYXRpb24gPiAwKSB7XG4gICAgdmFyIHN0eWxlID0ge307IC8vIGJ1aWxkIHVwIHRoZSBzdHlsZSB0byBhbmltYXRlIHRvd2FyZHNcblxuICAgIHZhciBhbnlQcmV2ID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHByb3BzW2ldO1xuICAgICAgdmFyIHN0eVByb3AgPSBlbGUucHN0eWxlKHByb3ApO1xuICAgICAgdmFyIGRpZmZQcm9wID0gZGlmZlByb3BzW3Byb3BdO1xuXG4gICAgICBpZiAoIWRpZmZQcm9wKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJldlByb3AgPSBkaWZmUHJvcC5wcmV2O1xuICAgICAgdmFyIGZyb21Qcm9wID0gcHJldlByb3A7XG4gICAgICB2YXIgdG9Qcm9wID0gZGlmZlByb3AubmV4dCAhPSBudWxsID8gZGlmZlByb3AubmV4dCA6IHN0eVByb3A7XG4gICAgICB2YXIgZGlmZiA9IGZhbHNlO1xuICAgICAgdmFyIGluaXRWYWwgPSB2b2lkIDA7XG4gICAgICB2YXIgaW5pdER0ID0gMC4wMDAwMDE7IC8vIGRlbHRhIHRpbWUgJSB2YWx1ZSBmb3IgaW5pdFZhbCAoYWxsb3dzIGFuaW1hdGluZyBvdXQgb2YgaW5pdCB6ZXJvIG9wYWNpdHkpXG5cbiAgICAgIGlmICghZnJvbVByb3ApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIGNvbnNpZGVyIHB4IHZhbHVlc1xuXG5cbiAgICAgIGlmIChudW1iZXIkMShmcm9tUHJvcC5wZlZhbHVlKSAmJiBudW1iZXIkMSh0b1Byb3AucGZWYWx1ZSkpIHtcbiAgICAgICAgZGlmZiA9IHRvUHJvcC5wZlZhbHVlIC0gZnJvbVByb3AucGZWYWx1ZTsgLy8gbm9uemVybyBpcyB0cnV0aHlcblxuICAgICAgICBpbml0VmFsID0gZnJvbVByb3AucGZWYWx1ZSArIGluaXREdCAqIGRpZmY7IC8vIGNvbnNpZGVyIG51bWVyaWNhbCB2YWx1ZXNcbiAgICAgIH0gZWxzZSBpZiAobnVtYmVyJDEoZnJvbVByb3AudmFsdWUpICYmIG51bWJlciQxKHRvUHJvcC52YWx1ZSkpIHtcbiAgICAgICAgZGlmZiA9IHRvUHJvcC52YWx1ZSAtIGZyb21Qcm9wLnZhbHVlOyAvLyBub256ZXJvIGlzIHRydXRoeVxuXG4gICAgICAgIGluaXRWYWwgPSBmcm9tUHJvcC52YWx1ZSArIGluaXREdCAqIGRpZmY7IC8vIGNvbnNpZGVyIGNvbG91ciB2YWx1ZXNcbiAgICAgIH0gZWxzZSBpZiAoYXJyYXkoZnJvbVByb3AudmFsdWUpICYmIGFycmF5KHRvUHJvcC52YWx1ZSkpIHtcbiAgICAgICAgZGlmZiA9IGZyb21Qcm9wLnZhbHVlWzBdICE9PSB0b1Byb3AudmFsdWVbMF0gfHwgZnJvbVByb3AudmFsdWVbMV0gIT09IHRvUHJvcC52YWx1ZVsxXSB8fCBmcm9tUHJvcC52YWx1ZVsyXSAhPT0gdG9Qcm9wLnZhbHVlWzJdO1xuICAgICAgICBpbml0VmFsID0gZnJvbVByb3Auc3RyVmFsdWU7XG4gICAgICB9IC8vIHRoZSBwcmV2aW91cyB2YWx1ZSBpcyBnb29kIGZvciBhbiBhbmltYXRpb24gb25seSBpZiBpdCdzIGRpZmZlcmVudFxuXG5cbiAgICAgIGlmIChkaWZmKSB7XG4gICAgICAgIHN0eWxlW3Byb3BdID0gdG9Qcm9wLnN0clZhbHVlOyAvLyB0byB2YWxcblxuICAgICAgICB0aGlzLmFwcGx5QnlwYXNzKGVsZSwgcHJvcCwgaW5pdFZhbCk7IC8vIGZyb20gdmFsXG5cbiAgICAgICAgYW55UHJldiA9IHRydWU7XG4gICAgICB9XG4gICAgfSAvLyBlbmQgaWYgcHJvcHMgYWxsb3cgYW5pXG4gICAgLy8gY2FuJ3QgdHJhbnNpdGlvbiBpZiB0aGVyZSdzIG5vdGhpbmcgcHJldmlvdXMgdG8gdHJhbnNpdGlvbiBmcm9tXG5cblxuICAgIGlmICghYW55UHJldikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF9wLnRyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgIG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgICAgZWxlLmRlbGF5QW5pbWF0aW9uKGRlbGF5KS5wbGF5KCkucHJvbWlzZSgpLnRoZW4ocmVzb2x2ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZWxlLmFuaW1hdGlvbih7XG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICBlYXNpbmc6IGVsZS5wc3R5bGUoJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJykudmFsdWUsXG4gICAgICAgIHF1ZXVlOiBmYWxzZVxuICAgICAgfSkucGxheSgpLnByb21pc2UoKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGlmKCAhaXNCeXBhc3MgKXtcbiAgICAgIHNlbGYucmVtb3ZlQnlwYXNzZXMoZWxlLCBwcm9wcyk7XG4gICAgICBlbGUuZW1pdEFuZE5vdGlmeSgnc3R5bGUnKTsgLy8gfVxuXG4gICAgICBfcC50cmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoX3AudHJhbnNpdGlvbmluZykge1xuICAgIHRoaXMucmVtb3ZlQnlwYXNzZXMoZWxlLCBwcm9wcyk7XG4gICAgZWxlLmVtaXRBbmROb3RpZnkoJ3N0eWxlJyk7XG4gICAgX3AudHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICB9XG59O1xuXG5zdHlmbiQ4LmNoZWNrVHJpZ2dlciA9IGZ1bmN0aW9uIChlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSwgZ2V0VHJpZ2dlciwgb25UcmlnZ2VyKSB7XG4gIHZhciBwcm9wID0gdGhpcy5wcm9wZXJ0aWVzW25hbWVdO1xuICB2YXIgdHJpZ2dlckNoZWNrID0gZ2V0VHJpZ2dlcihwcm9wKTtcblxuICBpZiAodHJpZ2dlckNoZWNrICE9IG51bGwgJiYgdHJpZ2dlckNoZWNrKGZyb21WYWx1ZSwgdG9WYWx1ZSkpIHtcbiAgICBvblRyaWdnZXIocHJvcCk7XG4gIH1cbn07XG5cbnN0eWZuJDguY2hlY2taT3JkZXJUcmlnZ2VyID0gZnVuY3Rpb24gKGVsZSwgbmFtZSwgZnJvbVZhbHVlLCB0b1ZhbHVlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5jaGVja1RyaWdnZXIoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUsIGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgcmV0dXJuIHByb3AudHJpZ2dlcnNaT3JkZXI7XG4gIH0sIGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpcy5fcHJpdmF0ZS5jeS5ub3RpZnkoJ3pvcmRlcicsIGVsZSk7XG4gIH0pO1xufTtcblxuc3R5Zm4kOC5jaGVja0JvdW5kc1RyaWdnZXIgPSBmdW5jdGlvbiAoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUpIHtcbiAgdGhpcy5jaGVja1RyaWdnZXIoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUsIGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgcmV0dXJuIHByb3AudHJpZ2dlcnNCb3VuZHM7XG4gIH0sIGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgZWxlLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpO1xuICAgIGVsZS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTsgLy8gaWYgdGhlIHByb3AgY2hhbmdlIG1ha2VzIHRoZSBiYiBvZiBwbGwgYmV6aWVyIGVkZ2VzIGludmFsaWQsXG4gICAgLy8gdGhlbiBkaXJ0eSB0aGUgcGxsIGVkZ2UgYmIgY2FjaGUgYXMgd2VsbFxuXG4gICAgaWYgKCAvLyBvbmx5IGZvciBiZXppZXJzIC0tIHNvIHBlcmZvcm1hbmNlIG9mIG90aGVyIGVkZ2VzIGlzbid0IGFmZmVjdGVkXG4gICAgcHJvcC50cmlnZ2Vyc0JvdW5kc09mUGFyYWxsZWxCZXppZXJzICYmIChuYW1lID09PSAnY3VydmUtc3R5bGUnICYmIChmcm9tVmFsdWUgPT09ICdiZXppZXInIHx8IHRvVmFsdWUgPT09ICdiZXppZXInKSB8fCBuYW1lID09PSAnZGlzcGxheScgJiYgKGZyb21WYWx1ZSA9PT0gJ25vbmUnIHx8IHRvVmFsdWUgPT09ICdub25lJykpKSB7XG4gICAgICBlbGUucGFyYWxsZWxFZGdlcygpLmZvckVhY2goZnVuY3Rpb24gKHBsbEVkZ2UpIHtcbiAgICAgICAgaWYgKHBsbEVkZ2UuaXNCdW5kbGVkQmV6aWVyKCkpIHtcbiAgICAgICAgICBwbGxFZGdlLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufTtcblxuc3R5Zm4kOC5jaGVja1RyaWdnZXJzID0gZnVuY3Rpb24gKGVsZSwgbmFtZSwgZnJvbVZhbHVlLCB0b1ZhbHVlKSB7XG4gIGVsZS5kaXJ0eVN0eWxlQ2FjaGUoKTtcbiAgdGhpcy5jaGVja1pPcmRlclRyaWdnZXIoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUpO1xuICB0aGlzLmNoZWNrQm91bmRzVHJpZ2dlcihlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSk7XG59O1xuXG52YXIgc3R5Zm4kNyA9IHt9OyAvLyBieXBhc3NlcyBhcmUgYXBwbGllZCB0byBhbiBleGlzdGluZyBzdHlsZSBvbiBhbiBlbGVtZW50LCBhbmQganVzdCB0YWNrZWQgb24gdGVtcG9yYXJpbHlcbi8vIHJldHVybnMgdHJ1ZSBpZmYgYXBwbGljYXRpb24gd2FzIHN1Y2Nlc3NmdWwgZm9yIGF0IGxlYXN0IDEgc3BlY2lmaWVkIHByb3BlcnR5XG5cbnN0eWZuJDcuYXBwbHlCeXBhc3MgPSBmdW5jdGlvbiAoZWxlcywgbmFtZSwgdmFsdWUsIHVwZGF0ZVRyYW5zaXRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHByb3BzID0gW107XG4gIHZhciBpc0J5cGFzcyA9IHRydWU7IC8vIHB1dCBhbGwgdGhlIHByb3BlcnRpZXMgKGNhbiBzcGVjaWZ5IG9uZSBvciBtYW55KSBpbiBhbiBhcnJheSBhZnRlciBwYXJzaW5nIHRoZW1cblxuICBpZiAobmFtZSA9PT0gJyonIHx8IG5hbWUgPT09ICcqKicpIHtcbiAgICAvLyBhcHBseSB0byBhbGwgcHJvcGVydHkgbmFtZXNcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHByb3AgPSBzZWxmLnByb3BlcnRpZXNbaV07XG4gICAgICAgIHZhciBfbmFtZSA9IHByb3AubmFtZTtcbiAgICAgICAgdmFyIHBhcnNlZFByb3AgPSB0aGlzLnBhcnNlKF9uYW1lLCB2YWx1ZSwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKHBhcnNlZFByb3ApIHtcbiAgICAgICAgICBwcm9wcy5wdXNoKHBhcnNlZFByb3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHN0cmluZyhuYW1lKSkge1xuICAgIC8vIHRoZW4gcGFyc2UgdGhlIHNpbmdsZSBwcm9wZXJ0eVxuICAgIHZhciBfcGFyc2VkUHJvcCA9IHRoaXMucGFyc2UobmFtZSwgdmFsdWUsIHRydWUpO1xuXG4gICAgaWYgKF9wYXJzZWRQcm9wKSB7XG4gICAgICBwcm9wcy5wdXNoKF9wYXJzZWRQcm9wKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocGxhaW5PYmplY3QobmFtZSkpIHtcbiAgICAvLyB0aGVuIHBhcnNlIGVhY2ggcHJvcGVydHlcbiAgICB2YXIgc3BlY2lmaWVkUHJvcHMgPSBuYW1lO1xuICAgIHVwZGF0ZVRyYW5zaXRpb25zID0gdmFsdWU7XG4gICAgdmFyIG5hbWVzID0gT2JqZWN0LmtleXMoc3BlY2lmaWVkUHJvcHMpO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5hbWVzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9uYW1lMiA9IG5hbWVzW19pXTtcbiAgICAgIHZhciBfdmFsdWUgPSBzcGVjaWZpZWRQcm9wc1tfbmFtZTJdO1xuXG4gICAgICBpZiAoX3ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdHJ5IGNhbWVsIGNhc2UgbmFtZSB0b29cbiAgICAgICAgX3ZhbHVlID0gc3BlY2lmaWVkUHJvcHNbZGFzaDJjYW1lbChfbmFtZTIpXTtcbiAgICAgIH1cblxuICAgICAgaWYgKF92YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBfcGFyc2VkUHJvcDIgPSB0aGlzLnBhcnNlKF9uYW1lMiwgX3ZhbHVlLCB0cnVlKTtcblxuICAgICAgICBpZiAoX3BhcnNlZFByb3AyKSB7XG4gICAgICAgICAgcHJvcHMucHVzaChfcGFyc2VkUHJvcDIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGNhbid0IGRvIGFueXRoaW5nIHdpdGhvdXQgd2VsbCBkZWZpbmVkIHByb3BlcnRpZXNcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gd2UndmUgZmFpbGVkIGlmIHRoZXJlIGFyZSBubyB2YWxpZCBwcm9wZXJ0aWVzXG5cblxuICBpZiAocHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIG5vdywgYXBwbHkgdGhlIGJ5cGFzcyBwcm9wZXJ0aWVzIG9uIHRoZSBlbGVtZW50c1xuXG5cbiAgdmFyIHJldCA9IGZhbHNlOyAvLyByZXR1cm4gdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgc3VjY2VzZnVsIGJ5cGFzcyBhcHBsaWVkXG5cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgZWxlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgLy8gZm9yIGVhY2ggZWxlXG4gICAgdmFyIGVsZSA9IGVsZXNbX2kyXTtcbiAgICB2YXIgZGlmZlByb3BzID0ge307XG4gICAgdmFyIGRpZmZQcm9wID0gdm9pZCAwO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wcy5sZW5ndGg7IGorKykge1xuICAgICAgLy8gZm9yIGVhY2ggcHJvcFxuICAgICAgdmFyIF9wcm9wID0gcHJvcHNbal07XG5cbiAgICAgIGlmICh1cGRhdGVUcmFuc2l0aW9ucykge1xuICAgICAgICB2YXIgcHJldlByb3AgPSBlbGUucHN0eWxlKF9wcm9wLm5hbWUpO1xuICAgICAgICBkaWZmUHJvcCA9IGRpZmZQcm9wc1tfcHJvcC5uYW1lXSA9IHtcbiAgICAgICAgICBwcmV2OiBwcmV2UHJvcFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXQgPSB0aGlzLmFwcGx5UGFyc2VkUHJvcGVydHkoZWxlLCBjb3B5KF9wcm9wKSkgfHwgcmV0O1xuXG4gICAgICBpZiAodXBkYXRlVHJhbnNpdGlvbnMpIHtcbiAgICAgICAgZGlmZlByb3AubmV4dCA9IGVsZS5wc3R5bGUoX3Byb3AubmFtZSk7XG4gICAgICB9XG4gICAgfSAvLyBmb3IgcHJvcHNcblxuXG4gICAgaWYgKHJldCkge1xuICAgICAgdGhpcy51cGRhdGVTdHlsZUhpbnRzKGVsZSk7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZVRyYW5zaXRpb25zKSB7XG4gICAgICB0aGlzLnVwZGF0ZVRyYW5zaXRpb25zKGVsZSwgZGlmZlByb3BzLCBpc0J5cGFzcyk7XG4gICAgfVxuICB9IC8vIGZvciBlbGVzXG5cblxuICByZXR1cm4gcmV0O1xufTsgLy8gb25seSB1c2VmdWwgaW4gc3BlY2lmaWMgY2FzZXMgbGlrZSBhbmltYXRpb25cblxuXG5zdHlmbiQ3Lm92ZXJyaWRlQnlwYXNzID0gZnVuY3Rpb24gKGVsZXMsIG5hbWUsIHZhbHVlKSB7XG4gIG5hbWUgPSBjYW1lbDJkYXNoKG5hbWUpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHZhciBwcm9wID0gZWxlLl9wcml2YXRlLnN0eWxlW25hbWVdO1xuICAgIHZhciB0eXBlID0gdGhpcy5wcm9wZXJ0aWVzW25hbWVdLnR5cGU7XG4gICAgdmFyIGlzQ29sb3IgPSB0eXBlLmNvbG9yO1xuICAgIHZhciBpc011bHRpID0gdHlwZS5tdXRpcGxlO1xuICAgIHZhciBvbGRWYWx1ZSA9ICFwcm9wID8gbnVsbCA6IHByb3AucGZWYWx1ZSAhPSBudWxsID8gcHJvcC5wZlZhbHVlIDogcHJvcC52YWx1ZTtcblxuICAgIGlmICghcHJvcCB8fCAhcHJvcC5ieXBhc3MpIHtcbiAgICAgIC8vIG5lZWQgYSBieXBhc3MgaWYgb25lIGRvZXNuJ3QgZXhpc3RcbiAgICAgIHRoaXMuYXBwbHlCeXBhc3MoZWxlLCBuYW1lLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb3AudmFsdWUgPSB2YWx1ZTtcblxuICAgICAgaWYgKHByb3AucGZWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHByb3AucGZWYWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNDb2xvcikge1xuICAgICAgICBwcm9wLnN0clZhbHVlID0gJ3JnYignICsgdmFsdWUuam9pbignLCcpICsgJyknO1xuICAgICAgfSBlbHNlIGlmIChpc011bHRpKSB7XG4gICAgICAgIHByb3Auc3RyVmFsdWUgPSB2YWx1ZS5qb2luKCcgJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9wLnN0clZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVTdHlsZUhpbnRzKGVsZSk7XG4gICAgfVxuXG4gICAgdGhpcy5jaGVja1RyaWdnZXJzKGVsZSwgbmFtZSwgb2xkVmFsdWUsIHZhbHVlKTtcbiAgfVxufTtcblxuc3R5Zm4kNy5yZW1vdmVBbGxCeXBhc3NlcyA9IGZ1bmN0aW9uIChlbGVzLCB1cGRhdGVUcmFuc2l0aW9ucykge1xuICByZXR1cm4gdGhpcy5yZW1vdmVCeXBhc3NlcyhlbGVzLCB0aGlzLnByb3BlcnR5TmFtZXMsIHVwZGF0ZVRyYW5zaXRpb25zKTtcbn07XG5cbnN0eWZuJDcucmVtb3ZlQnlwYXNzZXMgPSBmdW5jdGlvbiAoZWxlcywgcHJvcHMsIHVwZGF0ZVRyYW5zaXRpb25zKSB7XG4gIHZhciBpc0J5cGFzcyA9IHRydWU7XG5cbiAgZm9yICh2YXIgaiA9IDA7IGogPCBlbGVzLmxlbmd0aDsgaisrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbal07XG4gICAgdmFyIGRpZmZQcm9wcyA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBwcm9wc1tpXTtcbiAgICAgIHZhciBwcm9wID0gdGhpcy5wcm9wZXJ0aWVzW25hbWVdO1xuICAgICAgdmFyIHByZXZQcm9wID0gZWxlLnBzdHlsZShwcm9wLm5hbWUpO1xuXG4gICAgICBpZiAoIXByZXZQcm9wIHx8ICFwcmV2UHJvcC5ieXBhc3MpIHtcbiAgICAgICAgLy8gaWYgYSBieXBhc3MgZG9lc24ndCBleGlzdCBmb3IgdGhlIHByb3AsIG5vdGhpbmcgbmVlZHMgdG8gYmUgcmVtb3ZlZFxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHZhbHVlID0gJyc7IC8vIGVtcHR5ID0+IHJlbW92ZSBieXBhc3NcblxuICAgICAgdmFyIHBhcnNlZFByb3AgPSB0aGlzLnBhcnNlKG5hbWUsIHZhbHVlLCB0cnVlKTtcbiAgICAgIHZhciBkaWZmUHJvcCA9IGRpZmZQcm9wc1twcm9wLm5hbWVdID0ge1xuICAgICAgICBwcmV2OiBwcmV2UHJvcFxuICAgICAgfTtcbiAgICAgIHRoaXMuYXBwbHlQYXJzZWRQcm9wZXJ0eShlbGUsIHBhcnNlZFByb3ApO1xuICAgICAgZGlmZlByb3AubmV4dCA9IGVsZS5wc3R5bGUocHJvcC5uYW1lKTtcbiAgICB9IC8vIGZvciBwcm9wc1xuXG5cbiAgICB0aGlzLnVwZGF0ZVN0eWxlSGludHMoZWxlKTtcblxuICAgIGlmICh1cGRhdGVUcmFuc2l0aW9ucykge1xuICAgICAgdGhpcy51cGRhdGVUcmFuc2l0aW9ucyhlbGUsIGRpZmZQcm9wcywgaXNCeXBhc3MpO1xuICAgIH1cbiAgfSAvLyBmb3IgZWxlc1xuXG59O1xuXG52YXIgc3R5Zm4kNiA9IHt9OyAvLyBnZXRzIHdoYXQgYW4gZW0gc2l6ZSBjb3JyZXNwb25kcyB0byBpbiBwaXhlbHMgcmVsYXRpdmUgdG8gYSBkb20gZWxlbWVudFxuXG5zdHlmbiQ2LmdldEVtU2l6ZUluUGl4ZWxzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcHggPSB0aGlzLmNvbnRhaW5lckNzcygnZm9udC1zaXplJyk7XG5cbiAgaWYgKHB4ICE9IG51bGwpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdChweCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDE7IC8vIGZvciBoZWFkbGVzc1xuICB9XG59OyAvLyBnZXRzIGNzcyBwcm9wZXJ0eSBmcm9tIHRoZSBjb3JlIGNvbnRhaW5lclxuXG5cbnN0eWZuJDYuY29udGFpbmVyQ3NzID0gZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gIHZhciBkb21FbGVtZW50ID0gY3kuY29udGFpbmVyKCk7XG5cbiAgaWYgKHdpbmRvdyQxICYmIGRvbUVsZW1lbnQgJiYgd2luZG93JDEuZ2V0Q29tcHV0ZWRTdHlsZSkge1xuICAgIHJldHVybiB3aW5kb3ckMS5nZXRDb21wdXRlZFN0eWxlKGRvbUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUocHJvcE5hbWUpO1xuICB9XG59O1xuXG52YXIgc3R5Zm4kNSA9IHt9OyAvLyBnZXRzIHRoZSByZW5kZXJlZCBzdHlsZSBmb3IgYW4gZWxlbWVudFxuXG5zdHlmbiQ1LmdldFJlbmRlcmVkU3R5bGUgPSBmdW5jdGlvbiAoZWxlLCBwcm9wKSB7XG4gIGlmIChwcm9wKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3R5bGVQcm9wZXJ0eVZhbHVlKGVsZSwgcHJvcCwgdHJ1ZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmF3U3R5bGUoZWxlLCB0cnVlKTtcbiAgfVxufTsgLy8gZ2V0cyB0aGUgcmF3IHN0eWxlIGZvciBhbiBlbGVtZW50XG5cblxuc3R5Zm4kNS5nZXRSYXdTdHlsZSA9IGZ1bmN0aW9uIChlbGUsIGlzUmVuZGVyZWRWYWwpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBlbGUgPSBlbGVbMF07IC8vIGluc3VyZSBpdCdzIGFuIGVsZW1lbnRcblxuICBpZiAoZWxlKSB7XG4gICAgdmFyIHJzdHlsZSA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gc2VsZi5wcm9wZXJ0aWVzW2ldO1xuICAgICAgdmFyIHZhbCA9IHNlbGYuZ2V0U3R5bGVQcm9wZXJ0eVZhbHVlKGVsZSwgcHJvcC5uYW1lLCBpc1JlbmRlcmVkVmFsKTtcblxuICAgICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICAgIHJzdHlsZVtwcm9wLm5hbWVdID0gdmFsO1xuICAgICAgICByc3R5bGVbZGFzaDJjYW1lbChwcm9wLm5hbWUpXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcnN0eWxlO1xuICB9XG59O1xuXG5zdHlmbiQ1LmdldEluZGV4ZWRTdHlsZSA9IGZ1bmN0aW9uIChlbGUsIHByb3BlcnR5LCBzdWJwcm9wZXJ0eSwgaW5kZXgpIHtcbiAgdmFyIHBzdHlsZSA9IGVsZS5wc3R5bGUocHJvcGVydHkpW3N1YnByb3BlcnR5XVtpbmRleF07XG4gIHJldHVybiBwc3R5bGUgIT0gbnVsbCA/IHBzdHlsZSA6IGVsZS5jeSgpLnN0eWxlKCkuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5KVtzdWJwcm9wZXJ0eV1bMF07XG59O1xuXG5zdHlmbiQ1LmdldFN0eWxlUHJvcGVydHlWYWx1ZSA9IGZ1bmN0aW9uIChlbGUsIHByb3BOYW1lLCBpc1JlbmRlcmVkVmFsKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgZWxlID0gZWxlWzBdOyAvLyBpbnN1cmUgaXQncyBhbiBlbGVtZW50XG5cbiAgaWYgKGVsZSkge1xuICAgIHZhciBwcm9wID0gc2VsZi5wcm9wZXJ0aWVzW3Byb3BOYW1lXTtcblxuICAgIGlmIChwcm9wLmFsaWFzKSB7XG4gICAgICBwcm9wID0gcHJvcC5wb2ludHNUbztcbiAgICB9XG5cbiAgICB2YXIgdHlwZSA9IHByb3AudHlwZTtcbiAgICB2YXIgc3R5bGVQcm9wID0gZWxlLnBzdHlsZShwcm9wLm5hbWUpO1xuXG4gICAgaWYgKHN0eWxlUHJvcCkge1xuICAgICAgdmFyIHZhbHVlID0gc3R5bGVQcm9wLnZhbHVlLFxuICAgICAgICAgIHVuaXRzID0gc3R5bGVQcm9wLnVuaXRzLFxuICAgICAgICAgIHN0clZhbHVlID0gc3R5bGVQcm9wLnN0clZhbHVlO1xuXG4gICAgICBpZiAoaXNSZW5kZXJlZFZhbCAmJiB0eXBlLm51bWJlciAmJiB2YWx1ZSAhPSBudWxsICYmIG51bWJlciQxKHZhbHVlKSkge1xuICAgICAgICB2YXIgem9vbSA9IGVsZS5jeSgpLnpvb20oKTtcblxuICAgICAgICB2YXIgZ2V0UmVuZGVyZWRWYWx1ZSA9IGZ1bmN0aW9uIGdldFJlbmRlcmVkVmFsdWUodmFsKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbCAqIHpvb207XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGdldFZhbHVlU3RyaW5nV2l0aFVuaXRzID0gZnVuY3Rpb24gZ2V0VmFsdWVTdHJpbmdXaXRoVW5pdHModmFsLCB1bml0cykge1xuICAgICAgICAgIHJldHVybiBnZXRSZW5kZXJlZFZhbHVlKHZhbCkgKyB1bml0cztcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgaXNBcnJheVZhbHVlID0gYXJyYXkodmFsdWUpO1xuICAgICAgICB2YXIgaGF2ZVVuaXRzID0gaXNBcnJheVZhbHVlID8gdW5pdHMuZXZlcnkoZnVuY3Rpb24gKHUpIHtcbiAgICAgICAgICByZXR1cm4gdSAhPSBudWxsO1xuICAgICAgICB9KSA6IHVuaXRzICE9IG51bGw7XG5cbiAgICAgICAgaWYgKGhhdmVVbml0cykge1xuICAgICAgICAgIGlmIChpc0FycmF5VmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAoZnVuY3Rpb24gKHYsIGkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlU3RyaW5nV2l0aFVuaXRzKHYsIHVuaXRzW2ldKTtcbiAgICAgICAgICAgIH0pLmpvaW4oJyAnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlU3RyaW5nV2l0aFVuaXRzKHZhbHVlLCB1bml0cyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChpc0FycmF5VmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZyh2KSA/IHYgOiAnJyArIGdldFJlbmRlcmVkVmFsdWUodik7XG4gICAgICAgICAgICB9KS5qb2luKCcgJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnJyArIGdldFJlbmRlcmVkVmFsdWUodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdHJWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdHJWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuc3R5Zm4kNS5nZXRBbmltYXRpb25TdGFydFN0eWxlID0gZnVuY3Rpb24gKGVsZSwgYW5pUHJvcHMpIHtcbiAgdmFyIHJzdHlsZSA9IHt9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYW5pUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYW5pUHJvcCA9IGFuaVByb3BzW2ldO1xuICAgIHZhciBuYW1lID0gYW5pUHJvcC5uYW1lO1xuICAgIHZhciBzdHlsZVByb3AgPSBlbGUucHN0eWxlKG5hbWUpO1xuXG4gICAgaWYgKHN0eWxlUHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyB0aGVuIG1ha2UgYSBwcm9wIG9mIGl0XG4gICAgICBpZiAocGxhaW5PYmplY3Qoc3R5bGVQcm9wKSkge1xuICAgICAgICBzdHlsZVByb3AgPSB0aGlzLnBhcnNlKG5hbWUsIHN0eWxlUHJvcC5zdHJWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHlsZVByb3AgPSB0aGlzLnBhcnNlKG5hbWUsIHN0eWxlUHJvcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0eWxlUHJvcCkge1xuICAgICAgcnN0eWxlW25hbWVdID0gc3R5bGVQcm9wO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByc3R5bGU7XG59O1xuXG5zdHlmbiQ1LmdldFByb3BzTGlzdCA9IGZ1bmN0aW9uIChwcm9wc09iaikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByc3R5bGUgPSBbXTtcbiAgdmFyIHN0eWxlID0gcHJvcHNPYmo7XG4gIHZhciBwcm9wcyA9IHNlbGYucHJvcGVydGllcztcblxuICBpZiAoc3R5bGUpIHtcbiAgICB2YXIgbmFtZXMgPSBPYmplY3Qua2V5cyhzdHlsZSk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IG5hbWVzW2ldO1xuICAgICAgdmFyIHZhbCA9IHN0eWxlW25hbWVdO1xuICAgICAgdmFyIHByb3AgPSBwcm9wc1tuYW1lXSB8fCBwcm9wc1tjYW1lbDJkYXNoKG5hbWUpXTtcbiAgICAgIHZhciBzdHlsZVByb3AgPSB0aGlzLnBhcnNlKHByb3AubmFtZSwgdmFsKTtcblxuICAgICAgaWYgKHN0eWxlUHJvcCkge1xuICAgICAgICByc3R5bGUucHVzaChzdHlsZVByb3ApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByc3R5bGU7XG59O1xuXG5zdHlmbiQ1LmdldE5vbkRlZmF1bHRQcm9wZXJ0aWVzSGFzaCA9IGZ1bmN0aW9uIChlbGUsIHByb3BOYW1lcywgc2VlZCkge1xuICB2YXIgaGFzaCA9IHNlZWQuc2xpY2UoKTtcbiAgdmFyIG5hbWUsIHZhbCwgc3RyVmFsLCBjaFZhbDtcbiAgdmFyIGksIGo7XG5cbiAgZm9yIChpID0gMDsgaSA8IHByb3BOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgIG5hbWUgPSBwcm9wTmFtZXNbaV07XG4gICAgdmFsID0gZWxlLnBzdHlsZShuYW1lLCBmYWxzZSk7XG5cbiAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAodmFsLnBmVmFsdWUgIT0gbnVsbCkge1xuICAgICAgaGFzaFswXSA9IGhhc2hJbnQoY2hWYWwsIGhhc2hbMF0pO1xuICAgICAgaGFzaFsxXSA9IGhhc2hJbnRBbHQoY2hWYWwsIGhhc2hbMV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHJWYWwgPSB2YWwuc3RyVmFsdWU7XG5cbiAgICAgIGZvciAoaiA9IDA7IGogPCBzdHJWYWwubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY2hWYWwgPSBzdHJWYWwuY2hhckNvZGVBdChqKTtcbiAgICAgICAgaGFzaFswXSA9IGhhc2hJbnQoY2hWYWwsIGhhc2hbMF0pO1xuICAgICAgICBoYXNoWzFdID0gaGFzaEludEFsdChjaFZhbCwgaGFzaFsxXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGhhc2g7XG59O1xuXG5zdHlmbiQ1LmdldFByb3BlcnRpZXNIYXNoID0gc3R5Zm4kNS5nZXROb25EZWZhdWx0UHJvcGVydGllc0hhc2g7XG5cbnZhciBzdHlmbiQ0ID0ge307XG5cbnN0eWZuJDQuYXBwZW5kRnJvbUpzb24gPSBmdW5jdGlvbiAoanNvbikge1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwganNvbi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjb250ZXh0ID0ganNvbltpXTtcbiAgICB2YXIgc2VsZWN0b3IgPSBjb250ZXh0LnNlbGVjdG9yO1xuICAgIHZhciBwcm9wcyA9IGNvbnRleHQuc3R5bGUgfHwgY29udGV4dC5jc3M7XG4gICAgdmFyIG5hbWVzID0gT2JqZWN0LmtleXMocHJvcHMpO1xuICAgIHN0eWxlLnNlbGVjdG9yKHNlbGVjdG9yKTsgLy8gYXBwbHkgc2VsZWN0b3JcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbmFtZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBuYW1lID0gbmFtZXNbal07XG4gICAgICB2YXIgdmFsdWUgPSBwcm9wc1tuYW1lXTtcbiAgICAgIHN0eWxlLmNzcyhuYW1lLCB2YWx1ZSk7IC8vIGFwcGx5IHByb3BlcnR5XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0eWxlO1xufTsgLy8gYWNjZXNzaWJsZSBjeS5zdHlsZSgpIGZ1bmN0aW9uXG5cblxuc3R5Zm4kNC5mcm9tSnNvbiA9IGZ1bmN0aW9uIChqc29uKSB7XG4gIHZhciBzdHlsZSA9IHRoaXM7XG4gIHN0eWxlLnJlc2V0VG9EZWZhdWx0KCk7XG4gIHN0eWxlLmFwcGVuZEZyb21Kc29uKGpzb24pO1xuICByZXR1cm4gc3R5bGU7XG59OyAvLyBnZXQganNvbiBmcm9tIGN5LnN0eWxlKCkgYXBpXG5cblxuc3R5Zm4kNC5qc29uID0gZnVuY3Rpb24gKCkge1xuICB2YXIganNvbiA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSB0aGlzLmRlZmF1bHRMZW5ndGg7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGN4dCA9IHRoaXNbaV07XG4gICAgdmFyIHNlbGVjdG9yID0gY3h0LnNlbGVjdG9yO1xuICAgIHZhciBwcm9wcyA9IGN4dC5wcm9wZXJ0aWVzO1xuICAgIHZhciBjc3MgPSB7fTtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcHJvcHMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBwcm9wID0gcHJvcHNbal07XG4gICAgICBjc3NbcHJvcC5uYW1lXSA9IHByb3Auc3RyVmFsdWU7XG4gICAgfVxuXG4gICAganNvbi5wdXNoKHtcbiAgICAgIHNlbGVjdG9yOiAhc2VsZWN0b3IgPyAnY29yZScgOiBzZWxlY3Rvci50b1N0cmluZygpLFxuICAgICAgc3R5bGU6IGNzc1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGpzb247XG59O1xuXG52YXIgc3R5Zm4kMyA9IHt9O1xuXG5zdHlmbiQzLmFwcGVuZEZyb21TdHJpbmcgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHN0eWxlID0gdGhpcztcbiAgdmFyIHJlbWFpbmluZyA9ICcnICsgc3RyaW5nO1xuICB2YXIgc2VsQW5kQmxvY2tTdHI7XG4gIHZhciBibG9ja1JlbTtcbiAgdmFyIHByb3BBbmRWYWxTdHI7IC8vIHJlbW92ZSBjb21tZW50cyBmcm9tIHRoZSBzdHlsZSBzdHJpbmdcblxuICByZW1haW5pbmcgPSByZW1haW5pbmcucmVwbGFjZSgvWy9dWypdKFxcc3wuKSs/WypdWy9dL2csICcnKTtcblxuICBmdW5jdGlvbiByZW1vdmVTZWxBbmRCbG9ja0Zyb21SZW1haW5pbmcoKSB7XG4gICAgLy8gcmVtb3ZlIHRoZSBwYXJzZWQgc2VsZWN0b3IgYW5kIGJsb2NrIGZyb20gdGhlIHJlbWFpbmluZyB0ZXh0IHRvIHBhcnNlXG4gICAgaWYgKHJlbWFpbmluZy5sZW5ndGggPiBzZWxBbmRCbG9ja1N0ci5sZW5ndGgpIHtcbiAgICAgIHJlbWFpbmluZyA9IHJlbWFpbmluZy5zdWJzdHIoc2VsQW5kQmxvY2tTdHIubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVtYWluaW5nID0gJyc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlUHJvcEFuZFZhbEZyb21SZW0oKSB7XG4gICAgLy8gcmVtb3ZlIHRoZSBwYXJzZWQgcHJvcGVydHkgYW5kIHZhbHVlIGZyb20gdGhlIHJlbWFpbmluZyBibG9jayB0ZXh0IHRvIHBhcnNlXG4gICAgaWYgKGJsb2NrUmVtLmxlbmd0aCA+IHByb3BBbmRWYWxTdHIubGVuZ3RoKSB7XG4gICAgICBibG9ja1JlbSA9IGJsb2NrUmVtLnN1YnN0cihwcm9wQW5kVmFsU3RyLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJsb2NrUmVtID0gJyc7XG4gICAgfVxuICB9XG5cbiAgZm9yICg7Oykge1xuICAgIHZhciBub3RoaW5nTGVmdFRvUGFyc2UgPSByZW1haW5pbmcubWF0Y2goL15cXHMqJC8pO1xuXG4gICAgaWYgKG5vdGhpbmdMZWZ0VG9QYXJzZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIHNlbEFuZEJsb2NrID0gcmVtYWluaW5nLm1hdGNoKC9eXFxzKigoPzoufFxccykrPylcXHMqXFx7KCg/Oi58XFxzKSs/KVxcfS8pO1xuXG4gICAgaWYgKCFzZWxBbmRCbG9jaykge1xuICAgICAgd2FybignSGFsdGluZyBzdHlsZXNoZWV0IHBhcnNpbmc6IFN0cmluZyBzdHlsZXNoZWV0IGNvbnRhaW5zIG1vcmUgdG8gcGFyc2UgYnV0IG5vIHNlbGVjdG9yIGFuZCBibG9jayBmb3VuZCBpbjogJyArIHJlbWFpbmluZyk7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBzZWxBbmRCbG9ja1N0ciA9IHNlbEFuZEJsb2NrWzBdOyAvLyBwYXJzZSB0aGUgc2VsZWN0b3JcblxuICAgIHZhciBzZWxlY3RvclN0ciA9IHNlbEFuZEJsb2NrWzFdO1xuXG4gICAgaWYgKHNlbGVjdG9yU3RyICE9PSAnY29yZScpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IG5ldyBTZWxlY3RvcihzZWxlY3RvclN0cik7XG5cbiAgICAgIGlmIChzZWxlY3Rvci5pbnZhbGlkKSB7XG4gICAgICAgIHdhcm4oJ1NraXBwaW5nIHBhcnNpbmcgb2YgYmxvY2s6IEludmFsaWQgc2VsZWN0b3IgZm91bmQgaW4gc3RyaW5nIHN0eWxlc2hlZXQ6ICcgKyBzZWxlY3RvclN0cik7IC8vIHNraXAgdGhpcyBzZWxlY3RvciBhbmQgYmxvY2tcblxuICAgICAgICByZW1vdmVTZWxBbmRCbG9ja0Zyb21SZW1haW5pbmcoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfSAvLyBwYXJzZSB0aGUgYmxvY2sgb2YgcHJvcGVydGllcyBhbmQgdmFsdWVzXG5cblxuICAgIHZhciBibG9ja1N0ciA9IHNlbEFuZEJsb2NrWzJdO1xuICAgIHZhciBpbnZhbGlkQmxvY2sgPSBmYWxzZTtcbiAgICBibG9ja1JlbSA9IGJsb2NrU3RyO1xuICAgIHZhciBwcm9wcyA9IFtdO1xuXG4gICAgZm9yICg7Oykge1xuICAgICAgdmFyIF9ub3RoaW5nTGVmdFRvUGFyc2UgPSBibG9ja1JlbS5tYXRjaCgvXlxccyokLyk7XG5cbiAgICAgIGlmIChfbm90aGluZ0xlZnRUb1BhcnNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJvcEFuZFZhbCA9IGJsb2NrUmVtLm1hdGNoKC9eXFxzKiguKz8pXFxzKjpcXHMqKC4rPykoPzpcXHMqO3xcXHMqJCkvKTtcblxuICAgICAgaWYgKCFwcm9wQW5kVmFsKSB7XG4gICAgICAgIHdhcm4oJ1NraXBwaW5nIHBhcnNpbmcgb2YgYmxvY2s6IEludmFsaWQgZm9ybWF0dGluZyBvZiBzdHlsZSBwcm9wZXJ0eSBhbmQgdmFsdWUgZGVmaW5pdGlvbnMgZm91bmQgaW46JyArIGJsb2NrU3RyKTtcbiAgICAgICAgaW52YWxpZEJsb2NrID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHByb3BBbmRWYWxTdHIgPSBwcm9wQW5kVmFsWzBdO1xuICAgICAgdmFyIHByb3BTdHIgPSBwcm9wQW5kVmFsWzFdO1xuICAgICAgdmFyIHZhbFN0ciA9IHByb3BBbmRWYWxbMl07XG4gICAgICB2YXIgcHJvcCA9IHNlbGYucHJvcGVydGllc1twcm9wU3RyXTtcblxuICAgICAgaWYgKCFwcm9wKSB7XG4gICAgICAgIHdhcm4oJ1NraXBwaW5nIHByb3BlcnR5OiBJbnZhbGlkIHByb3BlcnR5IG5hbWUgaW46ICcgKyBwcm9wQW5kVmFsU3RyKTsgLy8gc2tpcCB0aGlzIHByb3BlcnR5IGluIHRoZSBibG9ja1xuXG4gICAgICAgIHJlbW92ZVByb3BBbmRWYWxGcm9tUmVtKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcGFyc2VkUHJvcCA9IHN0eWxlLnBhcnNlKHByb3BTdHIsIHZhbFN0cik7XG5cbiAgICAgIGlmICghcGFyc2VkUHJvcCkge1xuICAgICAgICB3YXJuKCdTa2lwcGluZyBwcm9wZXJ0eTogSW52YWxpZCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluOiAnICsgcHJvcEFuZFZhbFN0cik7IC8vIHNraXAgdGhpcyBwcm9wZXJ0eSBpbiB0aGUgYmxvY2tcblxuICAgICAgICByZW1vdmVQcm9wQW5kVmFsRnJvbVJlbSgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHJvcHMucHVzaCh7XG4gICAgICAgIG5hbWU6IHByb3BTdHIsXG4gICAgICAgIHZhbDogdmFsU3RyXG4gICAgICB9KTtcbiAgICAgIHJlbW92ZVByb3BBbmRWYWxGcm9tUmVtKCk7XG4gICAgfVxuXG4gICAgaWYgKGludmFsaWRCbG9jaykge1xuICAgICAgcmVtb3ZlU2VsQW5kQmxvY2tGcm9tUmVtYWluaW5nKCk7XG4gICAgICBicmVhaztcbiAgICB9IC8vIHB1dCB0aGUgcGFyc2VkIGJsb2NrIGluIHRoZSBzdHlsZVxuXG5cbiAgICBzdHlsZS5zZWxlY3RvcihzZWxlY3RvclN0cik7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgX3Byb3AgPSBwcm9wc1tpXTtcbiAgICAgIHN0eWxlLmNzcyhfcHJvcC5uYW1lLCBfcHJvcC52YWwpO1xuICAgIH1cblxuICAgIHJlbW92ZVNlbEFuZEJsb2NrRnJvbVJlbWFpbmluZygpO1xuICB9XG5cbiAgcmV0dXJuIHN0eWxlO1xufTtcblxuc3R5Zm4kMy5mcm9tU3RyaW5nID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuICBzdHlsZS5yZXNldFRvRGVmYXVsdCgpO1xuICBzdHlsZS5hcHBlbmRGcm9tU3RyaW5nKHN0cmluZyk7XG4gIHJldHVybiBzdHlsZTtcbn07XG5cbnZhciBzdHlmbiQyID0ge307XG5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBudW1iZXIkMSA9IG51bWJlcjtcbiAgdmFyIHJnYmEgPSByZ2JhTm9CYWNrUmVmcztcbiAgdmFyIGhzbGEgPSBoc2xhTm9CYWNrUmVmcztcbiAgdmFyIGhleDMkMSA9IGhleDM7XG4gIHZhciBoZXg2JDEgPSBoZXg2O1xuXG4gIHZhciBkYXRhID0gZnVuY3Rpb24gZGF0YShwcmVmaXgpIHtcbiAgICByZXR1cm4gJ14nICsgcHJlZml4ICsgJ1xcXFxzKlxcXFwoXFxcXHMqKFtcXFxcd1xcXFwuXSspXFxcXHMqXFxcXCkkJztcbiAgfTtcblxuICB2YXIgbWFwRGF0YSA9IGZ1bmN0aW9uIG1hcERhdGEocHJlZml4KSB7XG4gICAgdmFyIG1hcEFyZyA9IG51bWJlciQxICsgJ3xcXFxcdyt8JyArIHJnYmEgKyAnfCcgKyBoc2xhICsgJ3wnICsgaGV4MyQxICsgJ3wnICsgaGV4NiQxO1xuICAgIHJldHVybiAnXicgKyBwcmVmaXggKyAnXFxcXHMqXFxcXCgoW1xcXFx3XFxcXC5dKylcXFxccypcXFxcLFxcXFxzKignICsgbnVtYmVyJDEgKyAnKVxcXFxzKlxcXFwsXFxcXHMqKCcgKyBudW1iZXIkMSArICcpXFxcXHMqLFxcXFxzKignICsgbWFwQXJnICsgJylcXFxccypcXFxcLFxcXFxzKignICsgbWFwQXJnICsgJylcXFxcKSQnO1xuICB9O1xuXG4gIHZhciB1cmxSZWdleGVzID0gWydedXJsXFxcXHMqXFxcXChcXFxccypbXFwnXCJdPyguKz8pW1xcJ1wiXT9cXFxccypcXFxcKSQnLCAnXihub25lKSQnLCAnXiguKykkJ107IC8vIGVhY2ggdmlzdWFsIHN0eWxlIHByb3BlcnR5IGhhcyBhIHR5cGUgYW5kIG5lZWRzIHRvIGJlIHZhbGlkYXRlZCBhY2NvcmRpbmcgdG8gaXRcblxuICBzdHlmbiQyLnR5cGVzID0ge1xuICAgIHRpbWU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG1pbjogMCxcbiAgICAgIHVuaXRzOiAnc3xtcycsXG4gICAgICBpbXBsaWNpdFVuaXRzOiAnbXMnXG4gICAgfSxcbiAgICBwZXJjZW50OiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IDEwMCxcbiAgICAgIHVuaXRzOiAnJScsXG4gICAgICBpbXBsaWNpdFVuaXRzOiAnJSdcbiAgICB9LFxuICAgIHBlcmNlbnRhZ2VzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IDEwMCxcbiAgICAgIHVuaXRzOiAnJScsXG4gICAgICBpbXBsaWNpdFVuaXRzOiAnJScsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgemVyb09uZU51bWJlcjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxLFxuICAgICAgdW5pdGxlc3M6IHRydWVcbiAgICB9LFxuICAgIHplcm9PbmVOdW1iZXJzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IDEsXG4gICAgICB1bml0bGVzczogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBuT25lT25lTnVtYmVyOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IC0xLFxuICAgICAgbWF4OiAxLFxuICAgICAgdW5pdGxlc3M6IHRydWVcbiAgICB9LFxuICAgIG5vbk5lZ2F0aXZlSW50OiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBpbnRlZ2VyOiB0cnVlLFxuICAgICAgdW5pdGxlc3M6IHRydWVcbiAgICB9LFxuICAgIHBvc2l0aW9uOiB7XG4gICAgICBlbnVtczogWydwYXJlbnQnLCAnb3JpZ2luJ11cbiAgICB9LFxuICAgIG5vZGVTaXplOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBlbnVtczogWydsYWJlbCddXG4gICAgfSxcbiAgICBudW1iZXI6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICBudW1iZXJzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICB1bml0bGVzczogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBwb3NpdGl2ZU51bWJlcjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgdW5pdGxlc3M6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBzdHJpY3RNaW46IHRydWVcbiAgICB9LFxuICAgIHNpemU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG1pbjogMFxuICAgIH0sXG4gICAgYmlkaXJlY3Rpb25hbFNpemU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZVxuICAgIH0sXG4gICAgLy8gYWxsb3dzIG5lZ2F0aXZlXG4gICAgYmlkaXJlY3Rpb25hbFNpemVNYXliZVBlcmNlbnQ6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIGFsbG93UGVyY2VudDogdHJ1ZVxuICAgIH0sXG4gICAgLy8gYWxsb3dzIG5lZ2F0aXZlXG4gICAgYmlkaXJlY3Rpb25hbFNpemVzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgLy8gYWxsb3dzIG5lZ2F0aXZlXG4gICAgc2l6ZU1heWJlUGVyY2VudDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgYWxsb3dQZXJjZW50OiB0cnVlXG4gICAgfSxcbiAgICBheGlzRGlyZWN0aW9uOiB7XG4gICAgICBlbnVtczogWydob3Jpem9udGFsJywgJ2xlZnR3YXJkJywgJ3JpZ2h0d2FyZCcsICd2ZXJ0aWNhbCcsICd1cHdhcmQnLCAnZG93bndhcmQnLCAnYXV0byddXG4gICAgfSxcbiAgICBwYWRkaW5nUmVsYXRpdmVUbzoge1xuICAgICAgZW51bXM6IFsnd2lkdGgnLCAnaGVpZ2h0JywgJ2F2ZXJhZ2UnLCAnbWluJywgJ21heCddXG4gICAgfSxcbiAgICBiZ1dIOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBhbGxvd1BlcmNlbnQ6IHRydWUsXG4gICAgICBlbnVtczogWydhdXRvJ10sXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgYmdQb3M6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIGFsbG93UGVyY2VudDogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBiZ1JlbGF0aXZlVG86IHtcbiAgICAgIGVudW1zOiBbJ2lubmVyJywgJ2luY2x1ZGUtcGFkZGluZyddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGJnUmVwZWF0OiB7XG4gICAgICBlbnVtczogWydyZXBlYXQnLCAncmVwZWF0LXgnLCAncmVwZWF0LXknLCAnbm8tcmVwZWF0J10sXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgYmdGaXQ6IHtcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAnY29udGFpbicsICdjb3ZlciddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGJnQ3Jvc3NPcmlnaW46IHtcbiAgICAgIGVudW1zOiBbJ2Fub255bW91cycsICd1c2UtY3JlZGVudGlhbHMnLCAnbnVsbCddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGJnQ2xpcDoge1xuICAgICAgZW51bXM6IFsnbm9uZScsICdub2RlJ10sXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgYmdDb250YWlubWVudDoge1xuICAgICAgZW51bXM6IFsnaW5zaWRlJywgJ292ZXInXSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBjb2xvcjoge1xuICAgICAgY29sb3I6IHRydWVcbiAgICB9LFxuICAgIGNvbG9yczoge1xuICAgICAgY29sb3I6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgZmlsbDoge1xuICAgICAgZW51bXM6IFsnc29saWQnLCAnbGluZWFyLWdyYWRpZW50JywgJ3JhZGlhbC1ncmFkaWVudCddXG4gICAgfSxcbiAgICBib29sOiB7XG4gICAgICBlbnVtczogWyd5ZXMnLCAnbm8nXVxuICAgIH0sXG4gICAgYm9vbHM6IHtcbiAgICAgIGVudW1zOiBbJ3llcycsICdubyddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGxpbmVTdHlsZToge1xuICAgICAgZW51bXM6IFsnc29saWQnLCAnZG90dGVkJywgJ2Rhc2hlZCddXG4gICAgfSxcbiAgICBsaW5lQ2FwOiB7XG4gICAgICBlbnVtczogWydidXR0JywgJ3JvdW5kJywgJ3NxdWFyZSddXG4gICAgfSxcbiAgICBib3JkZXJTdHlsZToge1xuICAgICAgZW51bXM6IFsnc29saWQnLCAnZG90dGVkJywgJ2Rhc2hlZCcsICdkb3VibGUnXVxuICAgIH0sXG4gICAgY3VydmVTdHlsZToge1xuICAgICAgZW51bXM6IFsnYmV6aWVyJywgJ3VuYnVuZGxlZC1iZXppZXInLCAnaGF5c3RhY2snLCAnc2VnbWVudHMnLCAnc3RyYWlnaHQnLCAnc3RyYWlnaHQtdHJpYW5nbGUnLCAndGF4aSddXG4gICAgfSxcbiAgICBmb250RmFtaWx5OiB7XG4gICAgICByZWdleDogJ14oW1xcXFx3LSBcXFxcXCJdKyg/OlxcXFxzKixcXFxccypbXFxcXHctIFxcXFxcIl0rKSopJCdcbiAgICB9LFxuICAgIGZvbnRTdHlsZToge1xuICAgICAgZW51bXM6IFsnaXRhbGljJywgJ25vcm1hbCcsICdvYmxpcXVlJ11cbiAgICB9LFxuICAgIGZvbnRXZWlnaHQ6IHtcbiAgICAgIGVudW1zOiBbJ25vcm1hbCcsICdib2xkJywgJ2JvbGRlcicsICdsaWdodGVyJywgJzEwMCcsICcyMDAnLCAnMzAwJywgJzQwMCcsICc1MDAnLCAnNjAwJywgJzgwMCcsICc5MDAnLCAxMDAsIDIwMCwgMzAwLCA0MDAsIDUwMCwgNjAwLCA3MDAsIDgwMCwgOTAwXVxuICAgIH0sXG4gICAgdGV4dERlY29yYXRpb246IHtcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAndW5kZXJsaW5lJywgJ292ZXJsaW5lJywgJ2xpbmUtdGhyb3VnaCddXG4gICAgfSxcbiAgICB0ZXh0VHJhbnNmb3JtOiB7XG4gICAgICBlbnVtczogWydub25lJywgJ3VwcGVyY2FzZScsICdsb3dlcmNhc2UnXVxuICAgIH0sXG4gICAgdGV4dFdyYXA6IHtcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAnd3JhcCcsICdlbGxpcHNpcyddXG4gICAgfSxcbiAgICB0ZXh0T3ZlcmZsb3dXcmFwOiB7XG4gICAgICBlbnVtczogWyd3aGl0ZXNwYWNlJywgJ2FueXdoZXJlJ11cbiAgICB9LFxuICAgIHRleHRCYWNrZ3JvdW5kU2hhcGU6IHtcbiAgICAgIGVudW1zOiBbJ3JlY3RhbmdsZScsICdyb3VuZHJlY3RhbmdsZScsICdyb3VuZC1yZWN0YW5nbGUnXVxuICAgIH0sXG4gICAgbm9kZVNoYXBlOiB7XG4gICAgICBlbnVtczogWydyZWN0YW5nbGUnLCAncm91bmRyZWN0YW5nbGUnLCAncm91bmQtcmVjdGFuZ2xlJywgJ2N1dHJlY3RhbmdsZScsICdjdXQtcmVjdGFuZ2xlJywgJ2JvdHRvbXJvdW5kcmVjdGFuZ2xlJywgJ2JvdHRvbS1yb3VuZC1yZWN0YW5nbGUnLCAnYmFycmVsJywgJ2VsbGlwc2UnLCAndHJpYW5nbGUnLCAncm91bmQtdHJpYW5nbGUnLCAnc3F1YXJlJywgJ3BlbnRhZ29uJywgJ3JvdW5kLXBlbnRhZ29uJywgJ2hleGFnb24nLCAncm91bmQtaGV4YWdvbicsICdjb25jYXZlaGV4YWdvbicsICdjb25jYXZlLWhleGFnb24nLCAnaGVwdGFnb24nLCAncm91bmQtaGVwdGFnb24nLCAnb2N0YWdvbicsICdyb3VuZC1vY3RhZ29uJywgJ3RhZycsICdyb3VuZC10YWcnLCAnc3RhcicsICdkaWFtb25kJywgJ3JvdW5kLWRpYW1vbmQnLCAndmVlJywgJ3Job21ib2lkJywgJ3JpZ2h0LXJob21ib2lkJywgJ3BvbHlnb24nXVxuICAgIH0sXG4gICAgb3ZlcmxheVNoYXBlOiB7XG4gICAgICBlbnVtczogWydyb3VuZHJlY3RhbmdsZScsICdyb3VuZC1yZWN0YW5nbGUnLCAnZWxsaXBzZSddXG4gICAgfSxcbiAgICBjb21wb3VuZEluY2x1ZGVMYWJlbHM6IHtcbiAgICAgIGVudW1zOiBbJ2luY2x1ZGUnLCAnZXhjbHVkZSddXG4gICAgfSxcbiAgICBhcnJvd1NoYXBlOiB7XG4gICAgICBlbnVtczogWyd0ZWUnLCAndHJpYW5nbGUnLCAndHJpYW5nbGUtdGVlJywgJ2NpcmNsZS10cmlhbmdsZScsICd0cmlhbmdsZS1jcm9zcycsICd0cmlhbmdsZS1iYWNrY3VydmUnLCAndmVlJywgJ3NxdWFyZScsICdjaXJjbGUnLCAnZGlhbW9uZCcsICdjaGV2cm9uJywgJ25vbmUnXVxuICAgIH0sXG4gICAgYXJyb3dGaWxsOiB7XG4gICAgICBlbnVtczogWydmaWxsZWQnLCAnaG9sbG93J11cbiAgICB9LFxuICAgIGRpc3BsYXk6IHtcbiAgICAgIGVudW1zOiBbJ2VsZW1lbnQnLCAnbm9uZSddXG4gICAgfSxcbiAgICB2aXNpYmlsaXR5OiB7XG4gICAgICBlbnVtczogWydoaWRkZW4nLCAndmlzaWJsZSddXG4gICAgfSxcbiAgICB6Q29tcG91bmREZXB0aDoge1xuICAgICAgZW51bXM6IFsnYm90dG9tJywgJ29ycGhhbicsICdhdXRvJywgJ3RvcCddXG4gICAgfSxcbiAgICB6SW5kZXhDb21wYXJlOiB7XG4gICAgICBlbnVtczogWydhdXRvJywgJ21hbnVhbCddXG4gICAgfSxcbiAgICB2YWxpZ246IHtcbiAgICAgIGVudW1zOiBbJ3RvcCcsICdjZW50ZXInLCAnYm90dG9tJ11cbiAgICB9LFxuICAgIGhhbGlnbjoge1xuICAgICAgZW51bXM6IFsnbGVmdCcsICdjZW50ZXInLCAncmlnaHQnXVxuICAgIH0sXG4gICAganVzdGlmaWNhdGlvbjoge1xuICAgICAgZW51bXM6IFsnbGVmdCcsICdjZW50ZXInLCAncmlnaHQnLCAnYXV0byddXG4gICAgfSxcbiAgICB0ZXh0OiB7XG4gICAgICBzdHJpbmc6IHRydWVcbiAgICB9LFxuICAgIGRhdGE6IHtcbiAgICAgIG1hcHBpbmc6IHRydWUsXG4gICAgICByZWdleDogZGF0YSgnZGF0YScpXG4gICAgfSxcbiAgICBsYXlvdXREYXRhOiB7XG4gICAgICBtYXBwaW5nOiB0cnVlLFxuICAgICAgcmVnZXg6IGRhdGEoJ2xheW91dERhdGEnKVxuICAgIH0sXG4gICAgc2NyYXRjaDoge1xuICAgICAgbWFwcGluZzogdHJ1ZSxcbiAgICAgIHJlZ2V4OiBkYXRhKCdzY3JhdGNoJylcbiAgICB9LFxuICAgIG1hcERhdGE6IHtcbiAgICAgIG1hcHBpbmc6IHRydWUsXG4gICAgICByZWdleDogbWFwRGF0YSgnbWFwRGF0YScpXG4gICAgfSxcbiAgICBtYXBMYXlvdXREYXRhOiB7XG4gICAgICBtYXBwaW5nOiB0cnVlLFxuICAgICAgcmVnZXg6IG1hcERhdGEoJ21hcExheW91dERhdGEnKVxuICAgIH0sXG4gICAgbWFwU2NyYXRjaDoge1xuICAgICAgbWFwcGluZzogdHJ1ZSxcbiAgICAgIHJlZ2V4OiBtYXBEYXRhKCdtYXBTY3JhdGNoJylcbiAgICB9LFxuICAgIGZuOiB7XG4gICAgICBtYXBwaW5nOiB0cnVlLFxuICAgICAgZm46IHRydWVcbiAgICB9LFxuICAgIHVybDoge1xuICAgICAgcmVnZXhlczogdXJsUmVnZXhlcyxcbiAgICAgIHNpbmdsZVJlZ2V4TWF0Y2hWYWx1ZTogdHJ1ZVxuICAgIH0sXG4gICAgdXJsczoge1xuICAgICAgcmVnZXhlczogdXJsUmVnZXhlcyxcbiAgICAgIHNpbmdsZVJlZ2V4TWF0Y2hWYWx1ZTogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBwcm9wTGlzdDoge1xuICAgICAgcHJvcExpc3Q6IHRydWVcbiAgICB9LFxuICAgIGFuZ2xlOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICB1bml0czogJ2RlZ3xyYWQnLFxuICAgICAgaW1wbGljaXRVbml0czogJ3JhZCdcbiAgICB9LFxuICAgIHRleHRSb3RhdGlvbjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgdW5pdHM6ICdkZWd8cmFkJyxcbiAgICAgIGltcGxpY2l0VW5pdHM6ICdyYWQnLFxuICAgICAgZW51bXM6IFsnbm9uZScsICdhdXRvcm90YXRlJ11cbiAgICB9LFxuICAgIHBvbHlnb25Qb2ludExpc3Q6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgZXZlbk11bHRpcGxlOiB0cnVlLFxuICAgICAgbWluOiAtMSxcbiAgICAgIG1heDogMSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICBlZGdlRGlzdGFuY2VzOiB7XG4gICAgICBlbnVtczogWydpbnRlcnNlY3Rpb24nLCAnbm9kZS1wb3NpdGlvbiddXG4gICAgfSxcbiAgICBlZGdlRW5kcG9pbnQ6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgdW5pdHM6ICclfHB4fGVtfGRlZ3xyYWQnLFxuICAgICAgaW1wbGljaXRVbml0czogJ3B4JyxcbiAgICAgIGVudW1zOiBbJ2luc2lkZS10by1ub2RlJywgJ291dHNpZGUtdG8tbm9kZScsICdvdXRzaWRlLXRvLW5vZGUtb3ItbGFiZWwnLCAnb3V0c2lkZS10by1saW5lJywgJ291dHNpZGUtdG8tbGluZS1vci1sYWJlbCddLFxuICAgICAgc2luZ2xlRW51bTogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSh2YWxBcnIsIHVuaXRzQXJyKSB7XG4gICAgICAgIHN3aXRjaCAodmFsQXJyLmxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIC8vIGNhbiBiZSAlIG9yIHB4IG9ubHlcbiAgICAgICAgICAgIHJldHVybiB1bml0c0FyclswXSAhPT0gJ2RlZycgJiYgdW5pdHNBcnJbMF0gIT09ICdyYWQnICYmIHVuaXRzQXJyWzFdICE9PSAnZGVnJyAmJiB1bml0c0FyclsxXSAhPT0gJ3JhZCc7XG5cbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAvLyBjYW4gYmUgZW51bSwgZGVnLCBvciByYWQgb25seVxuICAgICAgICAgICAgcmV0dXJuIHN0cmluZyh2YWxBcnJbMF0pIHx8IHVuaXRzQXJyWzBdID09PSAnZGVnJyB8fCB1bml0c0FyclswXSA9PT0gJ3JhZCc7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBlYXNpbmc6IHtcbiAgICAgIHJlZ2V4ZXM6IFsnXihzcHJpbmcpXFxcXHMqXFxcXChcXFxccyooJyArIG51bWJlciQxICsgJylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIkMSArICcpXFxcXHMqXFxcXCkkJywgJ14oY3ViaWMtYmV6aWVyKVxcXFxzKlxcXFwoXFxcXHMqKCcgKyBudW1iZXIkMSArICcpXFxcXHMqLFxcXFxzKignICsgbnVtYmVyJDEgKyAnKVxcXFxzKixcXFxccyooJyArIG51bWJlciQxICsgJylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIkMSArICcpXFxcXHMqXFxcXCkkJ10sXG4gICAgICBlbnVtczogWydsaW5lYXInLCAnZWFzZScsICdlYXNlLWluJywgJ2Vhc2Utb3V0JywgJ2Vhc2UtaW4tb3V0JywgJ2Vhc2UtaW4tc2luZScsICdlYXNlLW91dC1zaW5lJywgJ2Vhc2UtaW4tb3V0LXNpbmUnLCAnZWFzZS1pbi1xdWFkJywgJ2Vhc2Utb3V0LXF1YWQnLCAnZWFzZS1pbi1vdXQtcXVhZCcsICdlYXNlLWluLWN1YmljJywgJ2Vhc2Utb3V0LWN1YmljJywgJ2Vhc2UtaW4tb3V0LWN1YmljJywgJ2Vhc2UtaW4tcXVhcnQnLCAnZWFzZS1vdXQtcXVhcnQnLCAnZWFzZS1pbi1vdXQtcXVhcnQnLCAnZWFzZS1pbi1xdWludCcsICdlYXNlLW91dC1xdWludCcsICdlYXNlLWluLW91dC1xdWludCcsICdlYXNlLWluLWV4cG8nLCAnZWFzZS1vdXQtZXhwbycsICdlYXNlLWluLW91dC1leHBvJywgJ2Vhc2UtaW4tY2lyYycsICdlYXNlLW91dC1jaXJjJywgJ2Vhc2UtaW4tb3V0LWNpcmMnXVxuICAgIH0sXG4gICAgZ3JhZGllbnREaXJlY3Rpb246IHtcbiAgICAgIGVudW1zOiBbJ3RvLWJvdHRvbScsICd0by10b3AnLCAndG8tbGVmdCcsICd0by1yaWdodCcsICd0by1ib3R0b20tcmlnaHQnLCAndG8tYm90dG9tLWxlZnQnLCAndG8tdG9wLXJpZ2h0JywgJ3RvLXRvcC1sZWZ0JywgJ3RvLXJpZ2h0LWJvdHRvbScsICd0by1sZWZ0LWJvdHRvbScsICd0by1yaWdodC10b3AnLCAndG8tbGVmdC10b3AnIC8vIGRpZmZlcmVudCBvcmRlclxuICAgICAgXVxuICAgIH0sXG4gICAgYm91bmRzRXhwYW5zaW9uOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICAgIG1pbjogMCxcbiAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSh2YWxBcnIpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHZhbEFyci5sZW5ndGg7XG4gICAgICAgIHJldHVybiBsZW5ndGggPT09IDEgfHwgbGVuZ3RoID09PSAyIHx8IGxlbmd0aCA9PT0gNDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHZhciBkaWZmID0ge1xuICAgIHplcm9Ob25aZXJvOiBmdW5jdGlvbiB6ZXJvTm9uWmVybyh2YWwxLCB2YWwyKSB7XG4gICAgICBpZiAoKHZhbDEgPT0gbnVsbCB8fCB2YWwyID09IG51bGwpICYmIHZhbDEgIT09IHZhbDIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7IC8vIG51bGwgY2FzZXMgY291bGQgcmVwcmVzZW50IGFueSB2YWx1ZVxuICAgICAgfVxuXG4gICAgICBpZiAodmFsMSA9PSAwICYmIHZhbDIgIT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAodmFsMSAhPSAwICYmIHZhbDIgPT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFueTogZnVuY3Rpb24gYW55KHZhbDEsIHZhbDIpIHtcbiAgICAgIHJldHVybiB2YWwxICE9IHZhbDI7XG4gICAgfSxcbiAgICBlbXB0eU5vbkVtcHR5OiBmdW5jdGlvbiBlbXB0eU5vbkVtcHR5KHN0cjEsIHN0cjIpIHtcbiAgICAgIHZhciBlbXB0eTEgPSBlbXB0eVN0cmluZyhzdHIxKTtcbiAgICAgIHZhciBlbXB0eTIgPSBlbXB0eVN0cmluZyhzdHIyKTtcbiAgICAgIHJldHVybiBlbXB0eTEgJiYgIWVtcHR5MiB8fCAhZW1wdHkxICYmIGVtcHR5MjtcbiAgICB9XG4gIH07IC8vIGRlZmluZSB2aXN1YWwgc3R5bGUgcHJvcGVydGllc1xuICAvL1xuICAvLyAtIG4uYi4gYWRkaW5nIGEgbmV3IGdyb3VwIG9mIHByb3BzIG1heSByZXF1aXJlIHVwZGF0ZXMgdG8gdXBkYXRlU3R5bGVIaW50cygpXG4gIC8vIC0gYWRkaW5nIG5ldyBwcm9wcyB0byBhbiBleGlzdGluZyBncm91cCBnZXRzIGhhbmRsZWQgYXV0b21hdGljYWxseVxuXG4gIHZhciB0ID0gc3R5Zm4kMi50eXBlcztcbiAgdmFyIG1haW5MYWJlbCA9IFt7XG4gICAgbmFtZTogJ2xhYmVsJyxcbiAgICB0eXBlOiB0LnRleHQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55LFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLmVtcHR5Tm9uRW1wdHlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LXJvdGF0aW9uJyxcbiAgICB0eXBlOiB0LnRleHRSb3RhdGlvbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW1hcmdpbi14JyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtbWFyZ2luLXknLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgc291cmNlTGFiZWwgPSBbe1xuICAgIG5hbWU6ICdzb3VyY2UtbGFiZWwnLFxuICAgIHR5cGU6IHQudGV4dCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzb3VyY2UtdGV4dC1yb3RhdGlvbicsXG4gICAgdHlwZTogdC50ZXh0Um90YXRpb24sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc291cmNlLXRleHQtbWFyZ2luLXgnLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc291cmNlLXRleHQtbWFyZ2luLXknLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc291cmNlLXRleHQtb2Zmc2V0JyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgdGFyZ2V0TGFiZWwgPSBbe1xuICAgIG5hbWU6ICd0YXJnZXQtbGFiZWwnLFxuICAgIHR5cGU6IHQudGV4dCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXJnZXQtdGV4dC1yb3RhdGlvbicsXG4gICAgdHlwZTogdC50ZXh0Um90YXRpb24sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGFyZ2V0LXRleHQtbWFyZ2luLXgnLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGFyZ2V0LXRleHQtbWFyZ2luLXknLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGFyZ2V0LXRleHQtb2Zmc2V0JyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgbGFiZWxEaW1lbnNpb25zID0gW3tcbiAgICBuYW1lOiAnZm9udC1mYW1pbHknLFxuICAgIHR5cGU6IHQuZm9udEZhbWlseSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdmb250LXN0eWxlJyxcbiAgICB0eXBlOiB0LmZvbnRTdHlsZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdmb250LXdlaWdodCcsXG4gICAgdHlwZTogdC5mb250V2VpZ2h0LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2ZvbnQtc2l6ZScsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtdHJhbnNmb3JtJyxcbiAgICB0eXBlOiB0LnRleHRUcmFuc2Zvcm0sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC13cmFwJyxcbiAgICB0eXBlOiB0LnRleHRXcmFwLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtb3ZlcmZsb3ctd3JhcCcsXG4gICAgdHlwZTogdC50ZXh0T3ZlcmZsb3dXcmFwLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtbWF4LXdpZHRoJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1vdXRsaW5lLXdpZHRoJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1oZWlnaHQnLFxuICAgIHR5cGU6IHQucG9zaXRpdmVOdW1iZXIsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgY29tbW9uTGFiZWwgPSBbe1xuICAgIG5hbWU6ICd0ZXh0LXZhbGlnbicsXG4gICAgdHlwZTogdC52YWxpZ24sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1oYWxpZ24nLFxuICAgIHR5cGU6IHQuaGFsaWduLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2NvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1vdXRsaW5lLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1vdXRsaW5lLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYmFja2dyb3VuZC1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYmFja2dyb3VuZC1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWJhY2tncm91bmQtcGFkZGluZycsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYm9yZGVyLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYm9yZGVyLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1ib3JkZXItd2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWJvcmRlci1zdHlsZScsXG4gICAgdHlwZTogdC5ib3JkZXJTdHlsZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWJhY2tncm91bmQtc2hhcGUnLFxuICAgIHR5cGU6IHQudGV4dEJhY2tncm91bmRTaGFwZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWp1c3RpZmljYXRpb24nLFxuICAgIHR5cGU6IHQuanVzdGlmaWNhdGlvblxuICB9XTtcbiAgdmFyIGJlaGF2aW9yID0gW3tcbiAgICBuYW1lOiAnZXZlbnRzJyxcbiAgICB0eXBlOiB0LmJvb2xcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWV2ZW50cycsXG4gICAgdHlwZTogdC5ib29sXG4gIH1dO1xuICB2YXIgdmlzaWJpbGl0eSA9IFt7XG4gICAgbmFtZTogJ2Rpc3BsYXknLFxuICAgIHR5cGU6IHQuZGlzcGxheSxcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi5hbnksXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55LFxuICAgIHRyaWdnZXJzQm91bmRzT2ZQYXJhbGxlbEJlemllcnM6IHRydWVcbiAgfSwge1xuICAgIG5hbWU6ICd2aXNpYmlsaXR5JyxcbiAgICB0eXBlOiB0LnZpc2liaWxpdHksXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyLFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLnplcm9Ob25aZXJvXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdtaW4tem9vbWVkLWZvbnQtc2l6ZScsXG4gICAgdHlwZTogdC5zaXplXG4gIH0sIHtcbiAgICBuYW1lOiAnei1jb21wb3VuZC1kZXB0aCcsXG4gICAgdHlwZTogdC56Q29tcG91bmREZXB0aCxcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd6LWluZGV4LWNvbXBhcmUnLFxuICAgIHR5cGU6IHQuekluZGV4Q29tcGFyZSxcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd6LWluZGV4JyxcbiAgICB0eXBlOiB0Lm5vbk5lZ2F0aXZlSW50LFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLmFueVxuICB9XTtcbiAgdmFyIG92ZXJsYXkgPSBbe1xuICAgIG5hbWU6ICdvdmVybGF5LXBhZGRpbmcnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdvdmVybGF5LWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnb3ZlcmxheS1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXIsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuemVyb05vblplcm9cbiAgfSwge1xuICAgIG5hbWU6ICdvdmVybGF5LXNoYXBlJyxcbiAgICB0eXBlOiB0Lm92ZXJsYXlTaGFwZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciB1bmRlcmxheSA9IFt7XG4gICAgbmFtZTogJ3VuZGVybGF5LXBhZGRpbmcnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd1bmRlcmxheS1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ3VuZGVybGF5LW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlcixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi56ZXJvTm9uWmVyb1xuICB9LCB7XG4gICAgbmFtZTogJ3VuZGVybGF5LXNoYXBlJyxcbiAgICB0eXBlOiB0Lm92ZXJsYXlTaGFwZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciB0cmFuc2l0aW9uID0gW3tcbiAgICBuYW1lOiAndHJhbnNpdGlvbi1wcm9wZXJ0eScsXG4gICAgdHlwZTogdC5wcm9wTGlzdFxuICB9LCB7XG4gICAgbmFtZTogJ3RyYW5zaXRpb24tZHVyYXRpb24nLFxuICAgIHR5cGU6IHQudGltZVxuICB9LCB7XG4gICAgbmFtZTogJ3RyYW5zaXRpb24tZGVsYXknLFxuICAgIHR5cGU6IHQudGltZVxuICB9LCB7XG4gICAgbmFtZTogJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJyxcbiAgICB0eXBlOiB0LmVhc2luZ1xuICB9XTtcblxuICB2YXIgbm9kZVNpemVIYXNoT3ZlcnJpZGUgPSBmdW5jdGlvbiBub2RlU2l6ZUhhc2hPdmVycmlkZShlbGUsIHBhcnNlZFByb3ApIHtcbiAgICBpZiAocGFyc2VkUHJvcC52YWx1ZSA9PT0gJ2xhYmVsJykge1xuICAgICAgcmV0dXJuIC1lbGUucG9vbEluZGV4KCk7IC8vIG5vIGhhc2gga2V5IGhpdHMgaXMgdXNpbmcgbGFiZWwgc2l6ZSAoaGl0cmF0ZSBmb3IgcGVyZiBwcm9iYWJseSBsb3cgYW55d2F5KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcGFyc2VkUHJvcC5wZlZhbHVlO1xuICAgIH1cbiAgfTtcblxuICB2YXIgbm9kZUJvZHkgPSBbe1xuICAgIG5hbWU6ICdoZWlnaHQnLFxuICAgIHR5cGU6IHQubm9kZVNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55LFxuICAgIGhhc2hPdmVycmlkZTogbm9kZVNpemVIYXNoT3ZlcnJpZGVcbiAgfSwge1xuICAgIG5hbWU6ICd3aWR0aCcsXG4gICAgdHlwZTogdC5ub2RlU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnksXG4gICAgaGFzaE92ZXJyaWRlOiBub2RlU2l6ZUhhc2hPdmVycmlkZVxuICB9LCB7XG4gICAgbmFtZTogJ3NoYXBlJyxcbiAgICB0eXBlOiB0Lm5vZGVTaGFwZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzaGFwZS1wb2x5Z29uLXBvaW50cycsXG4gICAgdHlwZTogdC5wb2x5Z29uUG9pbnRMaXN0LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWZpbGwnLFxuICAgIHR5cGU6IHQuZmlsbFxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1ibGFja2VuJyxcbiAgICB0eXBlOiB0Lm5PbmVPbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWdyYWRpZW50LXN0b3AtY29sb3JzJyxcbiAgICB0eXBlOiB0LmNvbG9yc1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtZ3JhZGllbnQtc3RvcC1wb3NpdGlvbnMnLFxuICAgIHR5cGU6IHQucGVyY2VudGFnZXNcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWdyYWRpZW50LWRpcmVjdGlvbicsXG4gICAgdHlwZTogdC5ncmFkaWVudERpcmVjdGlvblxuICB9LCB7XG4gICAgbmFtZTogJ3BhZGRpbmcnLFxuICAgIHR5cGU6IHQuc2l6ZU1heWJlUGVyY2VudCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdwYWRkaW5nLXJlbGF0aXZlLXRvJyxcbiAgICB0eXBlOiB0LnBhZGRpbmdSZWxhdGl2ZVRvLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2JvdW5kcy1leHBhbnNpb24nLFxuICAgIHR5cGU6IHQuYm91bmRzRXhwYW5zaW9uLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9XTtcbiAgdmFyIG5vZGVCb3JkZXIgPSBbe1xuICAgIG5hbWU6ICdib3JkZXItY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdib3JkZXItb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAnYm9yZGVyLXdpZHRoJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnYm9yZGVyLXN0eWxlJyxcbiAgICB0eXBlOiB0LmJvcmRlclN0eWxlXG4gIH1dO1xuICB2YXIgYmFja2dyb3VuZEltYWdlID0gW3tcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1pbWFnZScsXG4gICAgdHlwZTogdC51cmxzXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1pbWFnZS1jcm9zc29yaWdpbicsXG4gICAgdHlwZTogdC5iZ0Nyb3NzT3JpZ2luXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1pbWFnZS1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJzXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1pbWFnZS1jb250YWlubWVudCcsXG4gICAgdHlwZTogdC5iZ0NvbnRhaW5tZW50XG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1pbWFnZS1zbW9vdGhpbmcnLFxuICAgIHR5cGU6IHQuYm9vbHNcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXgnLFxuICAgIHR5cGU6IHQuYmdQb3NcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXknLFxuICAgIHR5cGU6IHQuYmdQb3NcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLXdpZHRoLXJlbGF0aXZlLXRvJyxcbiAgICB0eXBlOiB0LmJnUmVsYXRpdmVUb1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtaGVpZ2h0LXJlbGF0aXZlLXRvJyxcbiAgICB0eXBlOiB0LmJnUmVsYXRpdmVUb1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtcmVwZWF0JyxcbiAgICB0eXBlOiB0LmJnUmVwZWF0XG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1maXQnLFxuICAgIHR5cGU6IHQuYmdGaXRcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWNsaXAnLFxuICAgIHR5cGU6IHQuYmdDbGlwXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC13aWR0aCcsXG4gICAgdHlwZTogdC5iZ1dIXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1oZWlnaHQnLFxuICAgIHR5cGU6IHQuYmdXSFxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtb2Zmc2V0LXgnLFxuICAgIHR5cGU6IHQuYmdQb3NcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLW9mZnNldC15JyxcbiAgICB0eXBlOiB0LmJnUG9zXG4gIH1dO1xuICB2YXIgY29tcG91bmQgPSBbe1xuICAgIG5hbWU6ICdwb3NpdGlvbicsXG4gICAgdHlwZTogdC5wb3NpdGlvbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdjb21wb3VuZC1zaXppbmctd3J0LWxhYmVscycsXG4gICAgdHlwZTogdC5jb21wb3VuZEluY2x1ZGVMYWJlbHMsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbWluLXdpZHRoJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbWluLXdpZHRoLWJpYXMtbGVmdCcsXG4gICAgdHlwZTogdC5zaXplTWF5YmVQZXJjZW50LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ21pbi13aWR0aC1iaWFzLXJpZ2h0JyxcbiAgICB0eXBlOiB0LnNpemVNYXliZVBlcmNlbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbWluLWhlaWdodCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ21pbi1oZWlnaHQtYmlhcy10b3AnLFxuICAgIHR5cGU6IHQuc2l6ZU1heWJlUGVyY2VudCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdtaW4taGVpZ2h0LWJpYXMtYm90dG9tJyxcbiAgICB0eXBlOiB0LnNpemVNYXliZVBlcmNlbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgZWRnZUxpbmUgPSBbe1xuICAgIG5hbWU6ICdsaW5lLXN0eWxlJyxcbiAgICB0eXBlOiB0LmxpbmVTdHlsZVxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWZpbGwnLFxuICAgIHR5cGU6IHQuZmlsbFxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtY2FwJyxcbiAgICB0eXBlOiB0LmxpbmVDYXBcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtZGFzaC1wYXR0ZXJuJyxcbiAgICB0eXBlOiB0Lm51bWJlcnNcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWRhc2gtb2Zmc2V0JyxcbiAgICB0eXBlOiB0Lm51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtZ3JhZGllbnQtc3RvcC1jb2xvcnMnLFxuICAgIHR5cGU6IHQuY29sb3JzXG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1ncmFkaWVudC1zdG9wLXBvc2l0aW9ucycsXG4gICAgdHlwZTogdC5wZXJjZW50YWdlc1xuICB9LCB7XG4gICAgbmFtZTogJ2N1cnZlLXN0eWxlJyxcbiAgICB0eXBlOiB0LmN1cnZlU3R5bGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55LFxuICAgIHRyaWdnZXJzQm91bmRzT2ZQYXJhbGxlbEJlemllcnM6IHRydWVcbiAgfSwge1xuICAgIG5hbWU6ICdoYXlzdGFjay1yYWRpdXMnLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlcixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzb3VyY2UtZW5kcG9pbnQnLFxuICAgIHR5cGU6IHQuZWRnZUVuZHBvaW50LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RhcmdldC1lbmRwb2ludCcsXG4gICAgdHlwZTogdC5lZGdlRW5kcG9pbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnY29udHJvbC1wb2ludC1zdGVwLXNpemUnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdjb250cm9sLXBvaW50LWRpc3RhbmNlcycsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZXMsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnY29udHJvbC1wb2ludC13ZWlnaHRzJyxcbiAgICB0eXBlOiB0Lm51bWJlcnMsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc2VnbWVudC1kaXN0YW5jZXMnLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemVzLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NlZ21lbnQtd2VpZ2h0cycsXG4gICAgdHlwZTogdC5udW1iZXJzLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RheGktdHVybicsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZU1heWJlUGVyY2VudCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXhpLXR1cm4tbWluLWRpc3RhbmNlJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGF4aS1kaXJlY3Rpb24nLFxuICAgIHR5cGU6IHQuYXhpc0RpcmVjdGlvbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdlZGdlLWRpc3RhbmNlcycsXG4gICAgdHlwZTogdC5lZGdlRGlzdGFuY2VzLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2Fycm93LXNjYWxlJyxcbiAgICB0eXBlOiB0LnBvc2l0aXZlTnVtYmVyLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2xvb3AtZGlyZWN0aW9uJyxcbiAgICB0eXBlOiB0LmFuZ2xlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2xvb3Atc3dlZXAnLFxuICAgIHR5cGU6IHQuYW5nbGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc291cmNlLWRpc3RhbmNlLWZyb20tbm9kZScsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RhcmdldC1kaXN0YW5jZS1mcm9tLW5vZGUnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBnaG9zdCA9IFt7XG4gICAgbmFtZTogJ2dob3N0JyxcbiAgICB0eXBlOiB0LmJvb2wsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZ2hvc3Qtb2Zmc2V0LXgnLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZ2hvc3Qtb2Zmc2V0LXknLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZ2hvc3Qtb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH1dO1xuICB2YXIgY29yZSA9IFt7XG4gICAgbmFtZTogJ3NlbGVjdGlvbi1ib3gtY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdzZWxlY3Rpb24tYm94LW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnc2VsZWN0aW9uLWJveC1ib3JkZXItd2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZVxuICB9LCB7XG4gICAgbmFtZTogJ2FjdGl2ZS1iZy1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ2FjdGl2ZS1iZy1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdhY3RpdmUtYmctc2l6ZScsXG4gICAgdHlwZTogdC5zaXplXG4gIH0sIHtcbiAgICBuYW1lOiAnb3V0c2lkZS10ZXh0dXJlLWJnLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnb3V0c2lkZS10ZXh0dXJlLWJnLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9XTsgLy8gcGllIGJhY2tncm91bmRzIGZvciBub2Rlc1xuXG4gIHZhciBwaWUgPSBbXTtcbiAgc3R5Zm4kMi5waWVCYWNrZ3JvdW5kTiA9IDE2OyAvLyBiZWNhdXNlIHRoZSBwaWUgcHJvcGVydGllcyBhcmUgbnVtYmVyZWQsIGdpdmUgYWNjZXNzIHRvIGEgY29uc3RhbnQgTiAoZm9yIHJlbmRlcmVyIHVzZSlcblxuICBwaWUucHVzaCh7XG4gICAgbmFtZTogJ3BpZS1zaXplJyxcbiAgICB0eXBlOiB0LnNpemVNYXliZVBlcmNlbnRcbiAgfSk7XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPD0gc3R5Zm4kMi5waWVCYWNrZ3JvdW5kTjsgaSsrKSB7XG4gICAgcGllLnB1c2goe1xuICAgICAgbmFtZTogJ3BpZS0nICsgaSArICctYmFja2dyb3VuZC1jb2xvcicsXG4gICAgICB0eXBlOiB0LmNvbG9yXG4gICAgfSk7XG4gICAgcGllLnB1c2goe1xuICAgICAgbmFtZTogJ3BpZS0nICsgaSArICctYmFja2dyb3VuZC1zaXplJyxcbiAgICAgIHR5cGU6IHQucGVyY2VudFxuICAgIH0pO1xuICAgIHBpZS5wdXNoKHtcbiAgICAgIG5hbWU6ICdwaWUtJyArIGkgKyAnLWJhY2tncm91bmQtb3BhY2l0eScsXG4gICAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgICB9KTtcbiAgfSAvLyBlZGdlIGFycm93c1xuXG5cbiAgdmFyIGVkZ2VBcnJvdyA9IFtdO1xuICB2YXIgYXJyb3dQcmVmaXhlcyA9IHN0eWZuJDIuYXJyb3dQcmVmaXhlcyA9IFsnc291cmNlJywgJ21pZC1zb3VyY2UnLCAndGFyZ2V0JywgJ21pZC10YXJnZXQnXTtcbiAgW3tcbiAgICBuYW1lOiAnYXJyb3ctc2hhcGUnLFxuICAgIHR5cGU6IHQuYXJyb3dTaGFwZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdhcnJvdy1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ2Fycm93LWZpbGwnLFxuICAgIHR5cGU6IHQuYXJyb3dGaWxsXG4gIH1dLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICBhcnJvd1ByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHByZWZpeCkge1xuICAgICAgdmFyIG5hbWUgPSBwcmVmaXggKyAnLScgKyBwcm9wLm5hbWU7XG4gICAgICB2YXIgdHlwZSA9IHByb3AudHlwZSxcbiAgICAgICAgICB0cmlnZ2Vyc0JvdW5kcyA9IHByb3AudHJpZ2dlcnNCb3VuZHM7XG4gICAgICBlZGdlQXJyb3cucHVzaCh7XG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIHRyaWdnZXJzQm91bmRzOiB0cmlnZ2Vyc0JvdW5kc1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sIHt9KTtcbiAgdmFyIHByb3BzID0gc3R5Zm4kMi5wcm9wZXJ0aWVzID0gW10uY29uY2F0KGJlaGF2aW9yLCB0cmFuc2l0aW9uLCB2aXNpYmlsaXR5LCBvdmVybGF5LCB1bmRlcmxheSwgZ2hvc3QsIGNvbW1vbkxhYmVsLCBsYWJlbERpbWVuc2lvbnMsIG1haW5MYWJlbCwgc291cmNlTGFiZWwsIHRhcmdldExhYmVsLCBub2RlQm9keSwgbm9kZUJvcmRlciwgYmFja2dyb3VuZEltYWdlLCBwaWUsIGNvbXBvdW5kLCBlZGdlTGluZSwgZWRnZUFycm93LCBjb3JlKTtcbiAgdmFyIHByb3BHcm91cHMgPSBzdHlmbiQyLnByb3BlcnR5R3JvdXBzID0ge1xuICAgIC8vIGNvbW1vbiB0byBhbGwgZWxlc1xuICAgIGJlaGF2aW9yOiBiZWhhdmlvcixcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uLFxuICAgIHZpc2liaWxpdHk6IHZpc2liaWxpdHksXG4gICAgb3ZlcmxheTogb3ZlcmxheSxcbiAgICB1bmRlcmxheTogdW5kZXJsYXksXG4gICAgZ2hvc3Q6IGdob3N0LFxuICAgIC8vIGxhYmVsc1xuICAgIGNvbW1vbkxhYmVsOiBjb21tb25MYWJlbCxcbiAgICBsYWJlbERpbWVuc2lvbnM6IGxhYmVsRGltZW5zaW9ucyxcbiAgICBtYWluTGFiZWw6IG1haW5MYWJlbCxcbiAgICBzb3VyY2VMYWJlbDogc291cmNlTGFiZWwsXG4gICAgdGFyZ2V0TGFiZWw6IHRhcmdldExhYmVsLFxuICAgIC8vIG5vZGUgcHJvcHNcbiAgICBub2RlQm9keTogbm9kZUJvZHksXG4gICAgbm9kZUJvcmRlcjogbm9kZUJvcmRlcixcbiAgICBiYWNrZ3JvdW5kSW1hZ2U6IGJhY2tncm91bmRJbWFnZSxcbiAgICBwaWU6IHBpZSxcbiAgICBjb21wb3VuZDogY29tcG91bmQsXG4gICAgLy8gZWRnZSBwcm9wc1xuICAgIGVkZ2VMaW5lOiBlZGdlTGluZSxcbiAgICBlZGdlQXJyb3c6IGVkZ2VBcnJvdyxcbiAgICBjb3JlOiBjb3JlXG4gIH07XG4gIHZhciBwcm9wR3JvdXBOYW1lcyA9IHN0eWZuJDIucHJvcGVydHlHcm91cE5hbWVzID0ge307XG4gIHZhciBwcm9wR3JvdXBLZXlzID0gc3R5Zm4kMi5wcm9wZXJ0eUdyb3VwS2V5cyA9IE9iamVjdC5rZXlzKHByb3BHcm91cHMpO1xuICBwcm9wR3JvdXBLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHByb3BHcm91cE5hbWVzW2tleV0gPSBwcm9wR3JvdXBzW2tleV0ubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICByZXR1cm4gcHJvcC5uYW1lO1xuICAgIH0pO1xuICAgIHByb3BHcm91cHNba2V5XS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICByZXR1cm4gcHJvcC5ncm91cEtleSA9IGtleTtcbiAgICB9KTtcbiAgfSk7IC8vIGRlZmluZSBhbGlhc2VzXG5cbiAgdmFyIGFsaWFzZXMgPSBzdHlmbiQyLmFsaWFzZXMgPSBbe1xuICAgIG5hbWU6ICdjb250ZW50JyxcbiAgICBwb2ludHNUbzogJ2xhYmVsJ1xuICB9LCB7XG4gICAgbmFtZTogJ2NvbnRyb2wtcG9pbnQtZGlzdGFuY2UnLFxuICAgIHBvaW50c1RvOiAnY29udHJvbC1wb2ludC1kaXN0YW5jZXMnXG4gIH0sIHtcbiAgICBuYW1lOiAnY29udHJvbC1wb2ludC13ZWlnaHQnLFxuICAgIHBvaW50c1RvOiAnY29udHJvbC1wb2ludC13ZWlnaHRzJ1xuICB9LCB7XG4gICAgbmFtZTogJ2VkZ2UtdGV4dC1yb3RhdGlvbicsXG4gICAgcG9pbnRzVG86ICd0ZXh0LXJvdGF0aW9uJ1xuICB9LCB7XG4gICAgbmFtZTogJ3BhZGRpbmctbGVmdCcsXG4gICAgcG9pbnRzVG86ICdwYWRkaW5nJ1xuICB9LCB7XG4gICAgbmFtZTogJ3BhZGRpbmctcmlnaHQnLFxuICAgIHBvaW50c1RvOiAncGFkZGluZydcbiAgfSwge1xuICAgIG5hbWU6ICdwYWRkaW5nLXRvcCcsXG4gICAgcG9pbnRzVG86ICdwYWRkaW5nJ1xuICB9LCB7XG4gICAgbmFtZTogJ3BhZGRpbmctYm90dG9tJyxcbiAgICBwb2ludHNUbzogJ3BhZGRpbmcnXG4gIH1dOyAvLyBsaXN0IG9mIHByb3BlcnR5IG5hbWVzXG5cbiAgc3R5Zm4kMi5wcm9wZXJ0eU5hbWVzID0gcHJvcHMubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIHAubmFtZTtcbiAgfSk7IC8vIGFsbG93IGFjY2VzcyBvZiBwcm9wZXJ0aWVzIGJ5IG5hbWUgKCBlLmcuIHN0eWxlLnByb3BlcnRpZXMuaGVpZ2h0IClcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgcHJvcHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIHByb3AgPSBwcm9wc1tfaV07XG4gICAgcHJvcHNbcHJvcC5uYW1lXSA9IHByb3A7IC8vIGFsbG93IGxvb2t1cCBieSBuYW1lXG4gIH0gLy8gbWFwIGFsaWFzZXNcblxuXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGFsaWFzZXMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciBhbGlhcyA9IGFsaWFzZXNbX2kyXTtcbiAgICB2YXIgcG9pbnRzVG9Qcm9wID0gcHJvcHNbYWxpYXMucG9pbnRzVG9dO1xuICAgIHZhciBhbGlhc1Byb3AgPSB7XG4gICAgICBuYW1lOiBhbGlhcy5uYW1lLFxuICAgICAgYWxpYXM6IHRydWUsXG4gICAgICBwb2ludHNUbzogcG9pbnRzVG9Qcm9wXG4gICAgfTsgLy8gYWRkIGFsaWFzIHByb3AgZm9yIHBhcnNpbmdcblxuICAgIHByb3BzLnB1c2goYWxpYXNQcm9wKTtcbiAgICBwcm9wc1thbGlhcy5uYW1lXSA9IGFsaWFzUHJvcDsgLy8gYWxsb3cgbG9va3VwIGJ5IG5hbWVcbiAgfVxufSkoKTtcblxuc3R5Zm4kMi5nZXREZWZhdWx0UHJvcGVydHkgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gdGhpcy5nZXREZWZhdWx0UHJvcGVydGllcygpW25hbWVdO1xufTtcblxuc3R5Zm4kMi5nZXREZWZhdWx0UHJvcGVydGllcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcblxuICBpZiAoX3AuZGVmYXVsdFByb3BlcnRpZXMgIT0gbnVsbCkge1xuICAgIHJldHVybiBfcC5kZWZhdWx0UHJvcGVydGllcztcbiAgfVxuXG4gIHZhciByYXdQcm9wcyA9IGV4dGVuZCh7XG4gICAgLy8gY29yZSBwcm9wc1xuICAgICdzZWxlY3Rpb24tYm94LWNvbG9yJzogJyNkZGQnLFxuICAgICdzZWxlY3Rpb24tYm94LW9wYWNpdHknOiAwLjY1LFxuICAgICdzZWxlY3Rpb24tYm94LWJvcmRlci1jb2xvcic6ICcjYWFhJyxcbiAgICAnc2VsZWN0aW9uLWJveC1ib3JkZXItd2lkdGgnOiAxLFxuICAgICdhY3RpdmUtYmctY29sb3InOiAnYmxhY2snLFxuICAgICdhY3RpdmUtYmctb3BhY2l0eSc6IDAuMTUsXG4gICAgJ2FjdGl2ZS1iZy1zaXplJzogMzAsXG4gICAgJ291dHNpZGUtdGV4dHVyZS1iZy1jb2xvcic6ICcjMDAwJyxcbiAgICAnb3V0c2lkZS10ZXh0dXJlLWJnLW9wYWNpdHknOiAwLjEyNSxcbiAgICAvLyBjb21tb24gbm9kZS9lZGdlIHByb3BzXG4gICAgJ2V2ZW50cyc6ICd5ZXMnLFxuICAgICd0ZXh0LWV2ZW50cyc6ICdubycsXG4gICAgJ3RleHQtdmFsaWduJzogJ3RvcCcsXG4gICAgJ3RleHQtaGFsaWduJzogJ2NlbnRlcicsXG4gICAgJ3RleHQtanVzdGlmaWNhdGlvbic6ICdhdXRvJyxcbiAgICAnbGluZS1oZWlnaHQnOiAxLFxuICAgICdjb2xvcic6ICcjMDAwJyxcbiAgICAndGV4dC1vdXRsaW5lLWNvbG9yJzogJyMwMDAnLFxuICAgICd0ZXh0LW91dGxpbmUtd2lkdGgnOiAwLFxuICAgICd0ZXh0LW91dGxpbmUtb3BhY2l0eSc6IDEsXG4gICAgJ3RleHQtb3BhY2l0eSc6IDEsXG4gICAgJ3RleHQtZGVjb3JhdGlvbic6ICdub25lJyxcbiAgICAndGV4dC10cmFuc2Zvcm0nOiAnbm9uZScsXG4gICAgJ3RleHQtd3JhcCc6ICdub25lJyxcbiAgICAndGV4dC1vdmVyZmxvdy13cmFwJzogJ3doaXRlc3BhY2UnLFxuICAgICd0ZXh0LW1heC13aWR0aCc6IDk5OTksXG4gICAgJ3RleHQtYmFja2dyb3VuZC1jb2xvcic6ICcjMDAwJyxcbiAgICAndGV4dC1iYWNrZ3JvdW5kLW9wYWNpdHknOiAwLFxuICAgICd0ZXh0LWJhY2tncm91bmQtc2hhcGUnOiAncmVjdGFuZ2xlJyxcbiAgICAndGV4dC1iYWNrZ3JvdW5kLXBhZGRpbmcnOiAwLFxuICAgICd0ZXh0LWJvcmRlci1vcGFjaXR5JzogMCxcbiAgICAndGV4dC1ib3JkZXItd2lkdGgnOiAwLFxuICAgICd0ZXh0LWJvcmRlci1zdHlsZSc6ICdzb2xpZCcsXG4gICAgJ3RleHQtYm9yZGVyLWNvbG9yJzogJyMwMDAnLFxuICAgICdmb250LWZhbWlseSc6ICdIZWx2ZXRpY2EgTmV1ZSwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmJyxcbiAgICAnZm9udC1zdHlsZSc6ICdub3JtYWwnLFxuICAgICdmb250LXdlaWdodCc6ICdub3JtYWwnLFxuICAgICdmb250LXNpemUnOiAxNixcbiAgICAnbWluLXpvb21lZC1mb250LXNpemUnOiAwLFxuICAgICd0ZXh0LXJvdGF0aW9uJzogJ25vbmUnLFxuICAgICdzb3VyY2UtdGV4dC1yb3RhdGlvbic6ICdub25lJyxcbiAgICAndGFyZ2V0LXRleHQtcm90YXRpb24nOiAnbm9uZScsXG4gICAgJ3Zpc2liaWxpdHknOiAndmlzaWJsZScsXG4gICAgJ2Rpc3BsYXknOiAnZWxlbWVudCcsXG4gICAgJ29wYWNpdHknOiAxLFxuICAgICd6LWNvbXBvdW5kLWRlcHRoJzogJ2F1dG8nLFxuICAgICd6LWluZGV4LWNvbXBhcmUnOiAnYXV0bycsXG4gICAgJ3otaW5kZXgnOiAwLFxuICAgICdsYWJlbCc6ICcnLFxuICAgICd0ZXh0LW1hcmdpbi14JzogMCxcbiAgICAndGV4dC1tYXJnaW4teSc6IDAsXG4gICAgJ3NvdXJjZS1sYWJlbCc6ICcnLFxuICAgICdzb3VyY2UtdGV4dC1vZmZzZXQnOiAwLFxuICAgICdzb3VyY2UtdGV4dC1tYXJnaW4teCc6IDAsXG4gICAgJ3NvdXJjZS10ZXh0LW1hcmdpbi15JzogMCxcbiAgICAndGFyZ2V0LWxhYmVsJzogJycsXG4gICAgJ3RhcmdldC10ZXh0LW9mZnNldCc6IDAsXG4gICAgJ3RhcmdldC10ZXh0LW1hcmdpbi14JzogMCxcbiAgICAndGFyZ2V0LXRleHQtbWFyZ2luLXknOiAwLFxuICAgICdvdmVybGF5LW9wYWNpdHknOiAwLFxuICAgICdvdmVybGF5LWNvbG9yJzogJyMwMDAnLFxuICAgICdvdmVybGF5LXBhZGRpbmcnOiAxMCxcbiAgICAnb3ZlcmxheS1zaGFwZSc6ICdyb3VuZC1yZWN0YW5nbGUnLFxuICAgICd1bmRlcmxheS1vcGFjaXR5JzogMCxcbiAgICAndW5kZXJsYXktY29sb3InOiAnIzAwMCcsXG4gICAgJ3VuZGVybGF5LXBhZGRpbmcnOiAxMCxcbiAgICAndW5kZXJsYXktc2hhcGUnOiAncm91bmQtcmVjdGFuZ2xlJyxcbiAgICAndHJhbnNpdGlvbi1wcm9wZXJ0eSc6ICdub25lJyxcbiAgICAndHJhbnNpdGlvbi1kdXJhdGlvbic6IDAsXG4gICAgJ3RyYW5zaXRpb24tZGVsYXknOiAwLFxuICAgICd0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbic6ICdsaW5lYXInLFxuICAgIC8vIG5vZGUgcHJvcHNcbiAgICAnYmFja2dyb3VuZC1ibGFja2VuJzogMCxcbiAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjOTk5JyxcbiAgICAnYmFja2dyb3VuZC1maWxsJzogJ3NvbGlkJyxcbiAgICAnYmFja2dyb3VuZC1vcGFjaXR5JzogMSxcbiAgICAnYmFja2dyb3VuZC1pbWFnZSc6ICdub25lJyxcbiAgICAnYmFja2dyb3VuZC1pbWFnZS1jcm9zc29yaWdpbic6ICdhbm9ueW1vdXMnLFxuICAgICdiYWNrZ3JvdW5kLWltYWdlLW9wYWNpdHknOiAxLFxuICAgICdiYWNrZ3JvdW5kLWltYWdlLWNvbnRhaW5tZW50JzogJ2luc2lkZScsXG4gICAgJ2JhY2tncm91bmQtaW1hZ2Utc21vb3RoaW5nJzogJ3llcycsXG4gICAgJ2JhY2tncm91bmQtcG9zaXRpb24teCc6ICc1MCUnLFxuICAgICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXknOiAnNTAlJyxcbiAgICAnYmFja2dyb3VuZC1vZmZzZXQteCc6IDAsXG4gICAgJ2JhY2tncm91bmQtb2Zmc2V0LXknOiAwLFxuICAgICdiYWNrZ3JvdW5kLXdpZHRoLXJlbGF0aXZlLXRvJzogJ2luY2x1ZGUtcGFkZGluZycsXG4gICAgJ2JhY2tncm91bmQtaGVpZ2h0LXJlbGF0aXZlLXRvJzogJ2luY2x1ZGUtcGFkZGluZycsXG4gICAgJ2JhY2tncm91bmQtcmVwZWF0JzogJ25vLXJlcGVhdCcsXG4gICAgJ2JhY2tncm91bmQtZml0JzogJ25vbmUnLFxuICAgICdiYWNrZ3JvdW5kLWNsaXAnOiAnbm9kZScsXG4gICAgJ2JhY2tncm91bmQtd2lkdGgnOiAnYXV0bycsXG4gICAgJ2JhY2tncm91bmQtaGVpZ2h0JzogJ2F1dG8nLFxuICAgICdib3JkZXItY29sb3InOiAnIzAwMCcsXG4gICAgJ2JvcmRlci1vcGFjaXR5JzogMSxcbiAgICAnYm9yZGVyLXdpZHRoJzogMCxcbiAgICAnYm9yZGVyLXN0eWxlJzogJ3NvbGlkJyxcbiAgICAnaGVpZ2h0JzogMzAsXG4gICAgJ3dpZHRoJzogMzAsXG4gICAgJ3NoYXBlJzogJ2VsbGlwc2UnLFxuICAgICdzaGFwZS1wb2x5Z29uLXBvaW50cyc6ICctMSwgLTEsICAgMSwgLTEsICAgMSwgMSwgICAtMSwgMScsXG4gICAgJ2JvdW5kcy1leHBhbnNpb24nOiAwLFxuICAgIC8vIG5vZGUgZ3JhZGllbnRcbiAgICAnYmFja2dyb3VuZC1ncmFkaWVudC1kaXJlY3Rpb24nOiAndG8tYm90dG9tJyxcbiAgICAnYmFja2dyb3VuZC1ncmFkaWVudC1zdG9wLWNvbG9ycyc6ICcjOTk5JyxcbiAgICAnYmFja2dyb3VuZC1ncmFkaWVudC1zdG9wLXBvc2l0aW9ucyc6ICcwJScsXG4gICAgLy8gZ2hvc3QgcHJvcHNcbiAgICAnZ2hvc3QnOiAnbm8nLFxuICAgICdnaG9zdC1vZmZzZXQteSc6IDAsXG4gICAgJ2dob3N0LW9mZnNldC14JzogMCxcbiAgICAnZ2hvc3Qtb3BhY2l0eSc6IDAsXG4gICAgLy8gY29tcG91bmQgcHJvcHNcbiAgICAncGFkZGluZyc6IDAsXG4gICAgJ3BhZGRpbmctcmVsYXRpdmUtdG8nOiAnd2lkdGgnLFxuICAgICdwb3NpdGlvbic6ICdvcmlnaW4nLFxuICAgICdjb21wb3VuZC1zaXppbmctd3J0LWxhYmVscyc6ICdpbmNsdWRlJyxcbiAgICAnbWluLXdpZHRoJzogMCxcbiAgICAnbWluLXdpZHRoLWJpYXMtbGVmdCc6IDAsXG4gICAgJ21pbi13aWR0aC1iaWFzLXJpZ2h0JzogMCxcbiAgICAnbWluLWhlaWdodCc6IDAsXG4gICAgJ21pbi1oZWlnaHQtYmlhcy10b3AnOiAwLFxuICAgICdtaW4taGVpZ2h0LWJpYXMtYm90dG9tJzogMFxuICB9LCB7XG4gICAgLy8gbm9kZSBwaWUgYmdcbiAgICAncGllLXNpemUnOiAnMTAwJSdcbiAgfSwgW3tcbiAgICBuYW1lOiAncGllLXt7aX19LWJhY2tncm91bmQtY29sb3InLFxuICAgIHZhbHVlOiAnYmxhY2snXG4gIH0sIHtcbiAgICBuYW1lOiAncGllLXt7aX19LWJhY2tncm91bmQtc2l6ZScsXG4gICAgdmFsdWU6ICcwJSdcbiAgfSwge1xuICAgIG5hbWU6ICdwaWUte3tpfX0tYmFja2dyb3VuZC1vcGFjaXR5JyxcbiAgICB2YWx1ZTogMVxuICB9XS5yZWR1Y2UoZnVuY3Rpb24gKGNzcywgcHJvcCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IHN0eWZuJDIucGllQmFja2dyb3VuZE47IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBwcm9wLm5hbWUucmVwbGFjZSgne3tpfX0nLCBpKTtcbiAgICAgIHZhciB2YWwgPSBwcm9wLnZhbHVlO1xuICAgICAgY3NzW25hbWVdID0gdmFsO1xuICAgIH1cblxuICAgIHJldHVybiBjc3M7XG4gIH0sIHt9KSwge1xuICAgIC8vIGVkZ2UgcHJvcHNcbiAgICAnbGluZS1zdHlsZSc6ICdzb2xpZCcsXG4gICAgJ2xpbmUtY29sb3InOiAnIzk5OScsXG4gICAgJ2xpbmUtZmlsbCc6ICdzb2xpZCcsXG4gICAgJ2xpbmUtY2FwJzogJ2J1dHQnLFxuICAgICdsaW5lLW9wYWNpdHknOiAxLFxuICAgICdsaW5lLWdyYWRpZW50LXN0b3AtY29sb3JzJzogJyM5OTknLFxuICAgICdsaW5lLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJzogJzAlJyxcbiAgICAnY29udHJvbC1wb2ludC1zdGVwLXNpemUnOiA0MCxcbiAgICAnY29udHJvbC1wb2ludC13ZWlnaHRzJzogMC41LFxuICAgICdzZWdtZW50LXdlaWdodHMnOiAwLjUsXG4gICAgJ3NlZ21lbnQtZGlzdGFuY2VzJzogMjAsXG4gICAgJ3RheGktdHVybic6ICc1MCUnLFxuICAgICd0YXhpLXR1cm4tbWluLWRpc3RhbmNlJzogMTAsXG4gICAgJ3RheGktZGlyZWN0aW9uJzogJ2F1dG8nLFxuICAgICdlZGdlLWRpc3RhbmNlcyc6ICdpbnRlcnNlY3Rpb24nLFxuICAgICdjdXJ2ZS1zdHlsZSc6ICdoYXlzdGFjaycsXG4gICAgJ2hheXN0YWNrLXJhZGl1cyc6IDAsXG4gICAgJ2Fycm93LXNjYWxlJzogMSxcbiAgICAnbG9vcC1kaXJlY3Rpb24nOiAnLTQ1ZGVnJyxcbiAgICAnbG9vcC1zd2VlcCc6ICctOTBkZWcnLFxuICAgICdzb3VyY2UtZGlzdGFuY2UtZnJvbS1ub2RlJzogMCxcbiAgICAndGFyZ2V0LWRpc3RhbmNlLWZyb20tbm9kZSc6IDAsXG4gICAgJ3NvdXJjZS1lbmRwb2ludCc6ICdvdXRzaWRlLXRvLW5vZGUnLFxuICAgICd0YXJnZXQtZW5kcG9pbnQnOiAnb3V0c2lkZS10by1ub2RlJyxcbiAgICAnbGluZS1kYXNoLXBhdHRlcm4nOiBbNiwgM10sXG4gICAgJ2xpbmUtZGFzaC1vZmZzZXQnOiAwXG4gIH0sIFt7XG4gICAgbmFtZTogJ2Fycm93LXNoYXBlJyxcbiAgICB2YWx1ZTogJ25vbmUnXG4gIH0sIHtcbiAgICBuYW1lOiAnYXJyb3ctY29sb3InLFxuICAgIHZhbHVlOiAnIzk5OSdcbiAgfSwge1xuICAgIG5hbWU6ICdhcnJvdy1maWxsJyxcbiAgICB2YWx1ZTogJ2ZpbGxlZCdcbiAgfV0ucmVkdWNlKGZ1bmN0aW9uIChjc3MsIHByb3ApIHtcbiAgICBzdHlmbiQyLmFycm93UHJlZml4ZXMuZm9yRWFjaChmdW5jdGlvbiAocHJlZml4KSB7XG4gICAgICB2YXIgbmFtZSA9IHByZWZpeCArICctJyArIHByb3AubmFtZTtcbiAgICAgIHZhciB2YWwgPSBwcm9wLnZhbHVlO1xuICAgICAgY3NzW25hbWVdID0gdmFsO1xuICAgIH0pO1xuICAgIHJldHVybiBjc3M7XG4gIH0sIHt9KSk7XG4gIHZhciBwYXJzZWRQcm9wcyA9IHt9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHByb3AgPSB0aGlzLnByb3BlcnRpZXNbaV07XG5cbiAgICBpZiAocHJvcC5wb2ludHNUbykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIG5hbWUgPSBwcm9wLm5hbWU7XG4gICAgdmFyIHZhbCA9IHJhd1Byb3BzW25hbWVdO1xuICAgIHZhciBwYXJzZWRQcm9wID0gdGhpcy5wYXJzZShuYW1lLCB2YWwpO1xuICAgIHBhcnNlZFByb3BzW25hbWVdID0gcGFyc2VkUHJvcDtcbiAgfVxuXG4gIF9wLmRlZmF1bHRQcm9wZXJ0aWVzID0gcGFyc2VkUHJvcHM7XG4gIHJldHVybiBfcC5kZWZhdWx0UHJvcGVydGllcztcbn07XG5cbnN0eWZuJDIuYWRkRGVmYXVsdFN0eWxlc2hlZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc2VsZWN0b3IoJzpwYXJlbnQnKS5jc3Moe1xuICAgICdzaGFwZSc6ICdyZWN0YW5nbGUnLFxuICAgICdwYWRkaW5nJzogMTAsXG4gICAgJ2JhY2tncm91bmQtY29sb3InOiAnI2VlZScsXG4gICAgJ2JvcmRlci1jb2xvcic6ICcjY2NjJyxcbiAgICAnYm9yZGVyLXdpZHRoJzogMVxuICB9KS5zZWxlY3RvcignZWRnZScpLmNzcyh7XG4gICAgJ3dpZHRoJzogM1xuICB9KS5zZWxlY3RvcignOmxvb3AnKS5jc3Moe1xuICAgICdjdXJ2ZS1zdHlsZSc6ICdiZXppZXInXG4gIH0pLnNlbGVjdG9yKCdlZGdlOmNvbXBvdW5kJykuY3NzKHtcbiAgICAnY3VydmUtc3R5bGUnOiAnYmV6aWVyJyxcbiAgICAnc291cmNlLWVuZHBvaW50JzogJ291dHNpZGUtdG8tbGluZScsXG4gICAgJ3RhcmdldC1lbmRwb2ludCc6ICdvdXRzaWRlLXRvLWxpbmUnXG4gIH0pLnNlbGVjdG9yKCc6c2VsZWN0ZWQnKS5jc3Moe1xuICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJyMwMTY5RDknLFxuICAgICdsaW5lLWNvbG9yJzogJyMwMTY5RDknLFxuICAgICdzb3VyY2UtYXJyb3ctY29sb3InOiAnIzAxNjlEOScsXG4gICAgJ3RhcmdldC1hcnJvdy1jb2xvcic6ICcjMDE2OUQ5JyxcbiAgICAnbWlkLXNvdXJjZS1hcnJvdy1jb2xvcic6ICcjMDE2OUQ5JyxcbiAgICAnbWlkLXRhcmdldC1hcnJvdy1jb2xvcic6ICcjMDE2OUQ5J1xuICB9KS5zZWxlY3RvcignOnBhcmVudDpzZWxlY3RlZCcpLmNzcyh7XG4gICAgJ2JhY2tncm91bmQtY29sb3InOiAnI0NDRTFGOScsXG4gICAgJ2JvcmRlci1jb2xvcic6ICcjYWVjOGU1J1xuICB9KS5zZWxlY3RvcignOmFjdGl2ZScpLmNzcyh7XG4gICAgJ292ZXJsYXktY29sb3InOiAnYmxhY2snLFxuICAgICdvdmVybGF5LXBhZGRpbmcnOiAxMCxcbiAgICAnb3ZlcmxheS1vcGFjaXR5JzogMC4yNVxuICB9KTtcbiAgdGhpcy5kZWZhdWx0TGVuZ3RoID0gdGhpcy5sZW5ndGg7XG59O1xuXG52YXIgc3R5Zm4kMSA9IHt9OyAvLyBhIGNhY2hpbmcgbGF5ZXIgZm9yIHByb3BlcnR5IHBhcnNpbmdcblxuc3R5Zm4kMS5wYXJzZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgcHJvcElzQnlwYXNzLCBwcm9wSXNGbGF0KSB7XG4gIHZhciBzZWxmID0gdGhpczsgLy8gZnVuY3Rpb24gdmFsdWVzIGNhbid0IGJlIGNhY2hlZCBpbiBhbGwgY2FzZXMsIGFuZCB0aGVyZSBpc24ndCBtdWNoIGJlbmVmaXQgb2YgY2FjaGluZyB0aGVtIGFueXdheVxuXG4gIGlmIChmbiQ2KHZhbHVlKSkge1xuICAgIHJldHVybiBzZWxmLnBhcnNlSW1wbFdhcm4obmFtZSwgdmFsdWUsIHByb3BJc0J5cGFzcywgcHJvcElzRmxhdCk7XG4gIH1cblxuICB2YXIgZmxhdEtleSA9IHByb3BJc0ZsYXQgPT09ICdtYXBwaW5nJyB8fCBwcm9wSXNGbGF0ID09PSB0cnVlIHx8IHByb3BJc0ZsYXQgPT09IGZhbHNlIHx8IHByb3BJc0ZsYXQgPT0gbnVsbCA/ICdkb250Y2FyZScgOiBwcm9wSXNGbGF0O1xuICB2YXIgYnlwYXNzS2V5ID0gcHJvcElzQnlwYXNzID8gJ3QnIDogJ2YnO1xuICB2YXIgdmFsdWVLZXkgPSAnJyArIHZhbHVlO1xuICB2YXIgYXJnSGFzaCA9IGhhc2hTdHJpbmdzKG5hbWUsIHZhbHVlS2V5LCBieXBhc3NLZXksIGZsYXRLZXkpO1xuICB2YXIgcHJvcENhY2hlID0gc2VsZi5wcm9wQ2FjaGUgPSBzZWxmLnByb3BDYWNoZSB8fCBbXTtcbiAgdmFyIHJldDtcblxuICBpZiAoIShyZXQgPSBwcm9wQ2FjaGVbYXJnSGFzaF0pKSB7XG4gICAgcmV0ID0gcHJvcENhY2hlW2FyZ0hhc2hdID0gc2VsZi5wYXJzZUltcGxXYXJuKG5hbWUsIHZhbHVlLCBwcm9wSXNCeXBhc3MsIHByb3BJc0ZsYXQpO1xuICB9IC8vIC0gYnlwYXNzZXMgY2FuJ3QgYmUgc2hhcmVkIGIvYyB0aGUgdmFsdWUgY2FuIGJlIGNoYW5nZWQgYnkgYW5pbWF0aW9ucyBvciBvdGhlcndpc2Ugb3ZlcnJpZGRlblxuICAvLyAtIG1hcHBpbmdzIGNhbid0IGJlIHNoYXJlZCBiL2MgbWFwcGluZ3MgYXJlIHBlci1lbGVtZW50XG5cblxuICBpZiAocHJvcElzQnlwYXNzIHx8IHByb3BJc0ZsYXQgPT09ICdtYXBwaW5nJykge1xuICAgIC8vIG5lZWQgYSBjb3B5IHNpbmNlIHByb3BzIGFyZSBtdXRhdGVkIGxhdGVyIGluIHRoZWlyIGxpZmVjeWNsZXNcbiAgICByZXQgPSBjb3B5KHJldCk7XG5cbiAgICBpZiAocmV0KSB7XG4gICAgICByZXQudmFsdWUgPSBjb3B5KHJldC52YWx1ZSk7IC8vIGJlY2F1c2UgaXQgY291bGQgYmUgYW4gYXJyYXksIGUuZy4gY29sb3VyXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbnN0eWZuJDEucGFyc2VJbXBsV2FybiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgcHJvcElzQnlwYXNzLCBwcm9wSXNGbGF0KSB7XG4gIHZhciBwcm9wID0gdGhpcy5wYXJzZUltcGwobmFtZSwgdmFsdWUsIHByb3BJc0J5cGFzcywgcHJvcElzRmxhdCk7XG5cbiAgaWYgKCFwcm9wICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICB3YXJuKFwiVGhlIHN0eWxlIHByb3BlcnR5IGBcIi5jb25jYXQobmFtZSwgXCI6IFwiKS5jb25jYXQodmFsdWUsIFwiYCBpcyBpbnZhbGlkXCIpKTtcbiAgfVxuXG4gIGlmIChwcm9wICYmIChwcm9wLm5hbWUgPT09ICd3aWR0aCcgfHwgcHJvcC5uYW1lID09PSAnaGVpZ2h0JykgJiYgdmFsdWUgPT09ICdsYWJlbCcpIHtcbiAgICB3YXJuKCdUaGUgc3R5bGUgdmFsdWUgb2YgYGxhYmVsYCBpcyBkZXByZWNhdGVkIGZvciBgJyArIHByb3AubmFtZSArICdgJyk7XG4gIH1cblxuICByZXR1cm4gcHJvcDtcbn07IC8vIHBhcnNlIGEgcHJvcGVydHk7IHJldHVybiBudWxsIG9uIGludmFsaWQ7IHJldHVybiBwYXJzZWQgcHJvcGVydHkgb3RoZXJ3aXNlXG4vLyBmaWVsZHMgOlxuLy8gLSBuYW1lIDogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5XG4vLyAtIHZhbHVlIDogdGhlIHBhcnNlZCwgbmF0aXZlLXR5cGVkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eVxuLy8gLSBzdHJWYWx1ZSA6IGEgc3RyaW5nIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvcGVydHkgdmFsdWUgaW4gdmFsaWQgY3NzXG4vLyAtIGJ5cGFzcyA6IHRydWUgaWZmIHRoZSBwcm9wZXJ0eSBpcyBhIGJ5cGFzcyBwcm9wZXJ0eVxuXG5cbnN0eWZuJDEucGFyc2VJbXBsID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBwcm9wSXNCeXBhc3MsIHByb3BJc0ZsYXQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBuYW1lID0gY2FtZWwyZGFzaChuYW1lKTsgLy8gbWFrZSBzdXJlIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIGluIGRhc2ggZm9ybSAoZS5nLiAncHJvcGVydHktbmFtZScgbm90ICdwcm9wZXJ0eU5hbWUnKVxuXG4gIHZhciBwcm9wZXJ0eSA9IHNlbGYucHJvcGVydGllc1tuYW1lXTtcbiAgdmFyIHBhc3NlZFZhbHVlID0gdmFsdWU7XG4gIHZhciB0eXBlcyA9IHNlbGYudHlwZXM7XG5cbiAgaWYgKCFwcm9wZXJ0eSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIHJldHVybiBudWxsIG9uIHByb3BlcnR5IG9mIHVua25vd24gbmFtZVxuXG5cbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBjYW4ndCBhc3NpZ24gdW5kZWZpbmVkXG4gIC8vIHRoZSBwcm9wZXJ0eSBtYXkgYmUgYW4gYWxpYXNcblxuXG4gIGlmIChwcm9wZXJ0eS5hbGlhcykge1xuICAgIHByb3BlcnR5ID0gcHJvcGVydHkucG9pbnRzVG87XG4gICAgbmFtZSA9IHByb3BlcnR5Lm5hbWU7XG4gIH1cblxuICB2YXIgdmFsdWVJc1N0cmluZyA9IHN0cmluZyh2YWx1ZSk7XG5cbiAgaWYgKHZhbHVlSXNTdHJpbmcpIHtcbiAgICAvLyB0cmltIHRoZSB2YWx1ZSB0byBtYWtlIHBhcnNpbmcgZWFzaWVyXG4gICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XG4gIH1cblxuICB2YXIgdHlwZSA9IHByb3BlcnR5LnR5cGU7XG5cbiAgaWYgKCF0eXBlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gbm8gdHlwZSwgbm8gbHVja1xuICAvLyBjaGVjayBpZiBieXBhc3MgaXMgbnVsbCBvciBlbXB0eSBzdHJpbmcgKGkuZS4gaW5kaWNhdGlvbiB0byBkZWxldGUgYnlwYXNzIHByb3BlcnR5KVxuXG5cbiAgaWYgKHByb3BJc0J5cGFzcyAmJiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsKSkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgYnlwYXNzOiB0cnVlLFxuICAgICAgZGVsZXRlQnlwYXNzOiB0cnVlXG4gICAgfTtcbiAgfSAvLyBjaGVjayBpZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uIHVzZWQgYXMgYSBtYXBwZXJcblxuXG4gIGlmIChmbiQ2KHZhbHVlKSkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgc3RyVmFsdWU6ICdmbicsXG4gICAgICBtYXBwZWQ6IHR5cGVzLmZuLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuICB9IC8vIGNoZWNrIGlmIHZhbHVlIGlzIG1hcHBlZFxuXG5cbiAgdmFyIGRhdGEsIG1hcERhdGE7XG5cbiAgaWYgKCF2YWx1ZUlzU3RyaW5nIHx8IHByb3BJc0ZsYXQgfHwgdmFsdWUubGVuZ3RoIDwgNyB8fCB2YWx1ZVsxXSAhPT0gJ2EnKSA7IGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA+PSA3ICYmIHZhbHVlWzBdID09PSAnZCcgJiYgKGRhdGEgPSBuZXcgUmVnRXhwKHR5cGVzLmRhdGEucmVnZXgpLmV4ZWModmFsdWUpKSkge1xuICAgIGlmIChwcm9wSXNCeXBhc3MpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIG1hcHBlcnMgbm90IGFsbG93ZWQgaW4gYnlwYXNzXG5cblxuICAgIHZhciBtYXBwZWQgPSB0eXBlcy5kYXRhO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICBzdHJWYWx1ZTogJycgKyB2YWx1ZSxcbiAgICAgIG1hcHBlZDogbWFwcGVkLFxuICAgICAgZmllbGQ6IGRhdGFbMV0sXG4gICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgIH07XG4gIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoID49IDEwICYmIHZhbHVlWzBdID09PSAnbScgJiYgKG1hcERhdGEgPSBuZXcgUmVnRXhwKHR5cGVzLm1hcERhdGEucmVnZXgpLmV4ZWModmFsdWUpKSkge1xuICAgIGlmIChwcm9wSXNCeXBhc3MpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIG1hcHBlcnMgbm90IGFsbG93ZWQgaW4gYnlwYXNzXG5cblxuICAgIGlmICh0eXBlLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBpbXBvc3NpYmxlIHRvIG1hcCB0byBudW1cblxuXG4gICAgdmFyIF9tYXBwZWQgPSB0eXBlcy5tYXBEYXRhOyAvLyB3ZSBjYW4gbWFwIG9ubHkgaWYgdGhlIHR5cGUgaXMgYSBjb2xvdXIgb3IgYSBudW1iZXJcblxuICAgIGlmICghKHR5cGUuY29sb3IgfHwgdHlwZS5udW1iZXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlTWluID0gdGhpcy5wYXJzZShuYW1lLCBtYXBEYXRhWzRdKTsgLy8gcGFyc2UgdG8gdmFsaWRhdGVcblxuICAgIGlmICghdmFsdWVNaW4gfHwgdmFsdWVNaW4ubWFwcGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBjYW4ndCBiZSBpbnZhbGlkIG9yIG1hcHBlZFxuXG5cbiAgICB2YXIgdmFsdWVNYXggPSB0aGlzLnBhcnNlKG5hbWUsIG1hcERhdGFbNV0pOyAvLyBwYXJzZSB0byB2YWxpZGF0ZVxuXG4gICAgaWYgKCF2YWx1ZU1heCB8fCB2YWx1ZU1heC5tYXBwZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIGNhbid0IGJlIGludmFsaWQgb3IgbWFwcGVkXG4gICAgLy8gY2hlY2sgaWYgdmFsdWVNaW4gYW5kIHZhbHVlTWF4IGFyZSB0aGUgc2FtZVxuXG5cbiAgICBpZiAodmFsdWVNaW4ucGZWYWx1ZSA9PT0gdmFsdWVNYXgucGZWYWx1ZSB8fCB2YWx1ZU1pbi5zdHJWYWx1ZSA9PT0gdmFsdWVNYXguc3RyVmFsdWUpIHtcbiAgICAgIHdhcm4oJ2AnICsgbmFtZSArICc6ICcgKyB2YWx1ZSArICdgIGlzIG5vdCBhIHZhbGlkIG1hcHBlciBiZWNhdXNlIHRoZSBvdXRwdXQgcmFuZ2UgaXMgemVybzsgY29udmVydGluZyB0byBgJyArIG5hbWUgKyAnOiAnICsgdmFsdWVNaW4uc3RyVmFsdWUgKyAnYCcpO1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2UobmFtZSwgdmFsdWVNaW4uc3RyVmFsdWUpOyAvLyBjYW4ndCBtYWtlIG11Y2ggb2YgYSBtYXBwZXIgd2l0aG91dCBhIHJhbmdlXG4gICAgfSBlbHNlIGlmICh0eXBlLmNvbG9yKSB7XG4gICAgICB2YXIgYzEgPSB2YWx1ZU1pbi52YWx1ZTtcbiAgICAgIHZhciBjMiA9IHZhbHVlTWF4LnZhbHVlO1xuICAgICAgdmFyIHNhbWUgPSBjMVswXSA9PT0gYzJbMF0gLy8gcmVkXG4gICAgICAmJiBjMVsxXSA9PT0gYzJbMV0gLy8gZ3JlZW5cbiAgICAgICYmIGMxWzJdID09PSBjMlsyXSAvLyBibHVlXG4gICAgICAmJiAoIC8vIG9wdGlvbmFsIGFscGhhXG4gICAgICBjMVszXSA9PT0gYzJbM10gLy8gc2FtZSBhbHBoYSBvdXRyaWdodFxuICAgICAgfHwgKGMxWzNdID09IG51bGwgfHwgYzFbM10gPT09IDEgLy8gZnVsbCBvcGFjaXR5IGZvciBjb2xvdXIgMT9cbiAgICAgICkgJiYgKGMyWzNdID09IG51bGwgfHwgYzJbM10gPT09IDEpIC8vIGZ1bGwgb3BhY2l0eSBmb3IgY29sb3VyIDI/XG4gICAgICApO1xuXG4gICAgICBpZiAoc2FtZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IC8vIGNhbid0IG1ha2UgYSBtYXBwZXIgd2l0aG91dCBhIHJhbmdlXG5cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiBtYXBEYXRhLFxuICAgICAgc3RyVmFsdWU6ICcnICsgdmFsdWUsXG4gICAgICBtYXBwZWQ6IF9tYXBwZWQsXG4gICAgICBmaWVsZDogbWFwRGF0YVsxXSxcbiAgICAgIGZpZWxkTWluOiBwYXJzZUZsb2F0KG1hcERhdGFbMl0pLFxuICAgICAgLy8gbWluICYgbWF4IGFyZSBudW1lcmljXG4gICAgICBmaWVsZE1heDogcGFyc2VGbG9hdChtYXBEYXRhWzNdKSxcbiAgICAgIHZhbHVlTWluOiB2YWx1ZU1pbi52YWx1ZSxcbiAgICAgIHZhbHVlTWF4OiB2YWx1ZU1heC52YWx1ZSxcbiAgICAgIGJ5cGFzczogcHJvcElzQnlwYXNzXG4gICAgfTtcbiAgfVxuXG4gIGlmICh0eXBlLm11bHRpcGxlICYmIHByb3BJc0ZsYXQgIT09ICdtdWx0aXBsZScpIHtcbiAgICB2YXIgdmFscztcblxuICAgIGlmICh2YWx1ZUlzU3RyaW5nKSB7XG4gICAgICB2YWxzID0gdmFsdWUuc3BsaXQoL1xccysvKTtcbiAgICB9IGVsc2UgaWYgKGFycmF5KHZhbHVlKSkge1xuICAgICAgdmFscyA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWxzID0gW3ZhbHVlXTtcbiAgICB9XG5cbiAgICBpZiAodHlwZS5ldmVuTXVsdGlwbGUgJiYgdmFscy5sZW5ndGggJSAyICE9PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgdmFsQXJyID0gW107XG4gICAgdmFyIHVuaXRzQXJyID0gW107XG4gICAgdmFyIHBmVmFsQXJyID0gW107XG4gICAgdmFyIHN0clZhbCA9ICcnO1xuICAgIHZhciBoYXNFbnVtID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwID0gc2VsZi5wYXJzZShuYW1lLCB2YWxzW2ldLCBwcm9wSXNCeXBhc3MsICdtdWx0aXBsZScpO1xuICAgICAgaGFzRW51bSA9IGhhc0VudW0gfHwgc3RyaW5nKHAudmFsdWUpO1xuICAgICAgdmFsQXJyLnB1c2gocC52YWx1ZSk7XG4gICAgICBwZlZhbEFyci5wdXNoKHAucGZWYWx1ZSAhPSBudWxsID8gcC5wZlZhbHVlIDogcC52YWx1ZSk7XG4gICAgICB1bml0c0Fyci5wdXNoKHAudW5pdHMpO1xuICAgICAgc3RyVmFsICs9IChpID4gMCA/ICcgJyA6ICcnKSArIHAuc3RyVmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUudmFsaWRhdGUgJiYgIXR5cGUudmFsaWRhdGUodmFsQXJyLCB1bml0c0FycikpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0eXBlLnNpbmdsZUVudW0gJiYgaGFzRW51bSkge1xuICAgICAgaWYgKHZhbEFyci5sZW5ndGggPT09IDEgJiYgc3RyaW5nKHZhbEFyclswXSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgIHZhbHVlOiB2YWxBcnJbMF0sXG4gICAgICAgICAgc3RyVmFsdWU6IHZhbEFyclswXSxcbiAgICAgICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsQXJyLFxuICAgICAgcGZWYWx1ZTogcGZWYWxBcnIsXG4gICAgICBzdHJWYWx1ZTogc3RyVmFsLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3MsXG4gICAgICB1bml0czogdW5pdHNBcnJcbiAgICB9O1xuICB9IC8vIHNldmVyYWwgdHlwZXMgYWxzbyBhbGxvdyBlbnVtc1xuXG5cbiAgdmFyIGNoZWNrRW51bXMgPSBmdW5jdGlvbiBjaGVja0VudW1zKCkge1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCB0eXBlLmVudW1zLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIGVuID0gdHlwZS5lbnVtc1tfaV07XG5cbiAgICAgIGlmIChlbiA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBzdHJWYWx1ZTogJycgKyB2YWx1ZSxcbiAgICAgICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9OyAvLyBjaGVjayB0aGUgdHlwZSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBvYmplY3RcblxuXG4gIGlmICh0eXBlLm51bWJlcikge1xuICAgIHZhciB1bml0cztcbiAgICB2YXIgaW1wbGljaXRVbml0cyA9ICdweCc7IC8vIG5vdCBzZXQgPT4gcHhcblxuICAgIGlmICh0eXBlLnVuaXRzKSB7XG4gICAgICAvLyB1c2Ugc3BlY2lmaWVkIHVuaXRzIGlmIHNldFxuICAgICAgdW5pdHMgPSB0eXBlLnVuaXRzO1xuICAgIH1cblxuICAgIGlmICh0eXBlLmltcGxpY2l0VW5pdHMpIHtcbiAgICAgIGltcGxpY2l0VW5pdHMgPSB0eXBlLmltcGxpY2l0VW5pdHM7XG4gICAgfVxuXG4gICAgaWYgKCF0eXBlLnVuaXRsZXNzKSB7XG4gICAgICBpZiAodmFsdWVJc1N0cmluZykge1xuICAgICAgICB2YXIgdW5pdHNSZWdleCA9ICdweHxlbScgKyAodHlwZS5hbGxvd1BlcmNlbnQgPyAnfFxcXFwlJyA6ICcnKTtcblxuICAgICAgICBpZiAodW5pdHMpIHtcbiAgICAgICAgICB1bml0c1JlZ2V4ID0gdW5pdHM7XG4gICAgICAgIH0gLy8gb25seSBhbGxvdyBleHBsaWNpdCB1bml0cyBpZiBzbyBzZXRcblxuXG4gICAgICAgIHZhciBtYXRjaCA9IHZhbHVlLm1hdGNoKCdeKCcgKyBudW1iZXIgKyAnKSgnICsgdW5pdHNSZWdleCArICcpPycgKyAnJCcpO1xuXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIHZhbHVlID0gbWF0Y2hbMV07XG4gICAgICAgICAgdW5pdHMgPSBtYXRjaFsyXSB8fCBpbXBsaWNpdFVuaXRzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCF1bml0cyB8fCB0eXBlLmltcGxpY2l0VW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBpbXBsaWNpdFVuaXRzOyAvLyBpbXBsaWNpdGx5IHB4IGlmIHVuc3BlY2lmaWVkXG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTsgLy8gaWYgbm90IGEgbnVtYmVyIGFuZCBlbnVtcyBub3QgYWxsb3dlZCwgdGhlbiB0aGUgdmFsdWUgaXMgaW52YWxpZFxuXG4gICAgaWYgKGlzTmFOKHZhbHVlKSAmJiB0eXBlLmVudW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gLy8gY2hlY2sgaWYgdGhpcyBudW1iZXIgdHlwZSBhbHNvIGFjY2VwdHMgc3BlY2lhbCBrZXl3b3JkcyBpbiBwbGFjZSBvZiBudW1iZXJzXG4gICAgLy8gKGkuZS4gYGxlZnRgLCBgYXV0b2AsIGV0YylcblxuXG4gICAgaWYgKGlzTmFOKHZhbHVlKSAmJiB0eXBlLmVudW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbHVlID0gcGFzc2VkVmFsdWU7XG4gICAgICByZXR1cm4gY2hlY2tFbnVtcygpO1xuICAgIH0gLy8gY2hlY2sgaWYgdmFsdWUgbXVzdCBiZSBhbiBpbnRlZ2VyXG5cblxuICAgIGlmICh0eXBlLmludGVnZXIgJiYgIWludGVnZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IC8vIGNoZWNrIHZhbHVlIGlzIHdpdGhpbiByYW5nZVxuXG5cbiAgICBpZiAodHlwZS5taW4gIT09IHVuZGVmaW5lZCAmJiAodmFsdWUgPCB0eXBlLm1pbiB8fCB0eXBlLnN0cmljdE1pbiAmJiB2YWx1ZSA9PT0gdHlwZS5taW4pIHx8IHR5cGUubWF4ICE9PSB1bmRlZmluZWQgJiYgKHZhbHVlID4gdHlwZS5tYXggfHwgdHlwZS5zdHJpY3RNYXggJiYgdmFsdWUgPT09IHR5cGUubWF4KSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIHJldCA9IHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBzdHJWYWx1ZTogJycgKyB2YWx1ZSArICh1bml0cyA/IHVuaXRzIDogJycpLFxuICAgICAgdW5pdHM6IHVuaXRzLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9OyAvLyBub3JtYWxpc2UgdmFsdWUgaW4gcGl4ZWxzXG5cbiAgICBpZiAodHlwZS51bml0bGVzcyB8fCB1bml0cyAhPT0gJ3B4JyAmJiB1bml0cyAhPT0gJ2VtJykge1xuICAgICAgcmV0LnBmVmFsdWUgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0LnBmVmFsdWUgPSB1bml0cyA9PT0gJ3B4JyB8fCAhdW5pdHMgPyB2YWx1ZSA6IHRoaXMuZ2V0RW1TaXplSW5QaXhlbHMoKSAqIHZhbHVlO1xuICAgIH0gLy8gbm9ybWFsaXNlIHZhbHVlIGluIG1zXG5cblxuICAgIGlmICh1bml0cyA9PT0gJ21zJyB8fCB1bml0cyA9PT0gJ3MnKSB7XG4gICAgICByZXQucGZWYWx1ZSA9IHVuaXRzID09PSAnbXMnID8gdmFsdWUgOiAxMDAwICogdmFsdWU7XG4gICAgfSAvLyBub3JtYWxpc2UgdmFsdWUgaW4gcmFkXG5cblxuICAgIGlmICh1bml0cyA9PT0gJ2RlZycgfHwgdW5pdHMgPT09ICdyYWQnKSB7XG4gICAgICByZXQucGZWYWx1ZSA9IHVuaXRzID09PSAncmFkJyA/IHZhbHVlIDogZGVnMnJhZCh2YWx1ZSk7XG4gICAgfSAvLyBub3JtYWxpemUgdmFsdWUgaW4gJVxuXG5cbiAgICBpZiAodW5pdHMgPT09ICclJykge1xuICAgICAgcmV0LnBmVmFsdWUgPSB2YWx1ZSAvIDEwMDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9IGVsc2UgaWYgKHR5cGUucHJvcExpc3QpIHtcbiAgICB2YXIgcHJvcHMgPSBbXTtcbiAgICB2YXIgcHJvcHNTdHIgPSAnJyArIHZhbHVlO1xuXG4gICAgaWYgKHByb3BzU3RyID09PSAnbm9uZScpIDsgZWxzZSB7XG4gICAgICAvLyBnbyBvdmVyIGVhY2ggcHJvcFxuICAgICAgdmFyIHByb3BzU3BsaXQgPSBwcm9wc1N0ci5zcGxpdCgvXFxzKixcXHMqfFxccysvKTtcblxuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgcHJvcHNTcGxpdC5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIHZhciBwcm9wTmFtZSA9IHByb3BzU3BsaXRbX2kyXS50cmltKCk7XG5cbiAgICAgICAgaWYgKHNlbGYucHJvcGVydGllc1twcm9wTmFtZV0pIHtcbiAgICAgICAgICBwcm9wcy5wdXNoKHByb3BOYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3YXJuKCdgJyArIHByb3BOYW1lICsgJ2AgaXMgbm90IGEgdmFsaWQgcHJvcGVydHkgbmFtZScpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogcHJvcHMsXG4gICAgICBzdHJWYWx1ZTogcHJvcHMubGVuZ3RoID09PSAwID8gJ25vbmUnIDogcHJvcHMuam9pbignICcpLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuICB9IGVsc2UgaWYgKHR5cGUuY29sb3IpIHtcbiAgICB2YXIgdHVwbGUgPSBjb2xvcjJ0dXBsZSh2YWx1ZSk7XG5cbiAgICBpZiAoIXR1cGxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiB0dXBsZSxcbiAgICAgIHBmVmFsdWU6IHR1cGxlLFxuICAgICAgc3RyVmFsdWU6ICdyZ2IoJyArIHR1cGxlWzBdICsgJywnICsgdHVwbGVbMV0gKyAnLCcgKyB0dXBsZVsyXSArICcpJyxcbiAgICAgIC8vIG4uYi4gbm8gc3BhY2VzIGIvYyBvZiBtdWx0aXBsZSBzdXBwb3J0XG4gICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZS5yZWdleCB8fCB0eXBlLnJlZ2V4ZXMpIHtcbiAgICAvLyBmaXJzdCBjaGVjayBlbnVtc1xuICAgIGlmICh0eXBlLmVudW1zKSB7XG4gICAgICB2YXIgZW51bVByb3AgPSBjaGVja0VudW1zKCk7XG5cbiAgICAgIGlmIChlbnVtUHJvcCkge1xuICAgICAgICByZXR1cm4gZW51bVByb3A7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlZ2V4ZXMgPSB0eXBlLnJlZ2V4ZXMgPyB0eXBlLnJlZ2V4ZXMgOiBbdHlwZS5yZWdleF07XG5cbiAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCByZWdleGVzLmxlbmd0aDsgX2kzKyspIHtcbiAgICAgIHZhciByZWdleCA9IG5ldyBSZWdFeHAocmVnZXhlc1tfaTNdKTsgLy8gbWFrZSBhIHJlZ2V4IGZyb20gdGhlIHR5cGUgc3RyaW5nXG5cbiAgICAgIHZhciBtID0gcmVnZXguZXhlYyh2YWx1ZSk7XG5cbiAgICAgIGlmIChtKSB7XG4gICAgICAgIC8vIHJlZ2V4IG1hdGNoZXNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgIHZhbHVlOiB0eXBlLnNpbmdsZVJlZ2V4TWF0Y2hWYWx1ZSA/IG1bMV0gOiBtLFxuICAgICAgICAgIHN0clZhbHVlOiAnJyArIHZhbHVlLFxuICAgICAgICAgIGJ5cGFzczogcHJvcElzQnlwYXNzXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7IC8vIGRpZG4ndCBtYXRjaCBhbnlcbiAgfSBlbHNlIGlmICh0eXBlLnN0cmluZykge1xuICAgIC8vIGp1c3QgcmV0dXJuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogJycgKyB2YWx1ZSxcbiAgICAgIHN0clZhbHVlOiAnJyArIHZhbHVlLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuICB9IGVsc2UgaWYgKHR5cGUuZW51bXMpIHtcbiAgICAvLyBjaGVjayBlbnVtcyBsYXN0IGJlY2F1c2UgaXQncyBhIGNvbWJvIHR5cGUgaW4gb3RoZXJzXG4gICAgcmV0dXJuIGNoZWNrRW51bXMoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDsgLy8gbm90IGEgdHlwZSB3ZSBjYW4gaGFuZGxlXG4gIH1cbn07XG5cbnZhciBTdHlsZSA9IGZ1bmN0aW9uIFN0eWxlKGN5KSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTdHlsZSkpIHtcbiAgICByZXR1cm4gbmV3IFN0eWxlKGN5KTtcbiAgfVxuXG4gIGlmICghY29yZShjeSkpIHtcbiAgICBlcnJvcignQSBzdHlsZSBtdXN0IGhhdmUgYSBjb3JlIHJlZmVyZW5jZScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuX3ByaXZhdGUgPSB7XG4gICAgY3k6IGN5LFxuICAgIGNvcmVTdHlsZToge31cbiAgfTtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICB0aGlzLnJlc2V0VG9EZWZhdWx0KCk7XG59O1xuXG52YXIgc3R5Zm4gPSBTdHlsZS5wcm90b3R5cGU7XG5cbnN0eWZuLmluc3RhbmNlU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ3N0eWxlJztcbn07IC8vIHJlbW92ZSBhbGwgY29udGV4dHNcblxuXG5zdHlmbi5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgdmFyIGN5ID0gX3AuY3k7XG4gIHZhciBlbGVzID0gY3kuZWxlbWVudHMoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzW2ldID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgdGhpcy5sZW5ndGggPSAwO1xuICBfcC5jb250ZXh0U3R5bGVzID0ge307XG4gIF9wLnByb3BEaWZmcyA9IHt9O1xuICB0aGlzLmNsZWFuRWxlbWVudHMoZWxlcywgdHJ1ZSk7XG4gIGVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgdmFyIGVsZV9wID0gZWxlWzBdLl9wcml2YXRlO1xuICAgIGVsZV9wLnN0eWxlRGlydHkgPSB0cnVlO1xuICAgIGVsZV9wLmFwcGxpZWRJbml0U3R5bGUgPSBmYWxzZTtcbiAgfSk7XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxuc3R5Zm4ucmVzZXRUb0RlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuY2xlYXIoKTtcbiAgdGhpcy5hZGREZWZhdWx0U3R5bGVzaGVldCgpO1xuICByZXR1cm4gdGhpcztcbn07IC8vIGJ1aWxkcyBhIHN0eWxlIG9iamVjdCBmb3IgdGhlICdjb3JlJyBzZWxlY3RvclxuXG5cbnN0eWZuLmNvcmUgPSBmdW5jdGlvbiAocHJvcE5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuY29yZVN0eWxlW3Byb3BOYW1lXSB8fCB0aGlzLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wTmFtZSk7XG59OyAvLyBjcmVhdGUgYSBuZXcgY29udGV4dCBmcm9tIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3Igc3RyaW5nIGFuZCBzd2l0Y2ggdG8gdGhhdCBjb250ZXh0XG5cblxuc3R5Zm4uc2VsZWN0b3IgPSBmdW5jdGlvbiAoc2VsZWN0b3JTdHIpIHtcbiAgLy8gJ2NvcmUnIGlzIGEgc3BlY2lhbCBjYXNlIGFuZCBkb2VzIG5vdCBuZWVkIGEgc2VsZWN0b3JcbiAgdmFyIHNlbGVjdG9yID0gc2VsZWN0b3JTdHIgPT09ICdjb3JlJyA/IG51bGwgOiBuZXcgU2VsZWN0b3Ioc2VsZWN0b3JTdHIpO1xuICB2YXIgaSA9IHRoaXMubGVuZ3RoKys7IC8vIG5ldyBjb250ZXh0IG1lYW5zIG5ldyBpbmRleFxuXG4gIHRoaXNbaV0gPSB7XG4gICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgIHByb3BlcnRpZXM6IFtdLFxuICAgIG1hcHBlZFByb3BlcnRpZXM6IFtdLFxuICAgIGluZGV4OiBpXG4gIH07XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTsgLy8gYWRkIG9uZSBvciBtYW55IGNzcyBydWxlcyB0byB0aGUgY3VycmVudCBjb250ZXh0XG5cblxuc3R5Zm4uY3NzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuXG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgIHZhciBtYXAgPSBhcmdzWzBdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gc2VsZi5wcm9wZXJ0aWVzW2ldO1xuICAgICAgdmFyIG1hcFZhbCA9IG1hcFtwcm9wLm5hbWVdO1xuXG4gICAgICBpZiAobWFwVmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWFwVmFsID0gbWFwW2Rhc2gyY2FtZWwocHJvcC5uYW1lKV07XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXBWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNzc1J1bGUocHJvcC5uYW1lLCBtYXBWYWwpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgIHRoaXMuY3NzUnVsZShhcmdzWzBdLCBhcmdzWzFdKTtcbiAgfSAvLyBkbyBub3RoaW5nIGlmIGFyZ3MgYXJlIGludmFsaWRcblxuXG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxuc3R5Zm4uc3R5bGUgPSBzdHlmbi5jc3M7IC8vIGFkZCBhIHNpbmdsZSBjc3MgcnVsZSB0byB0aGUgY3VycmVudCBjb250ZXh0XG5cbnN0eWZuLmNzc1J1bGUgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgLy8gbmFtZS12YWx1ZSBwYWlyXG4gIHZhciBwcm9wZXJ0eSA9IHRoaXMucGFyc2UobmFtZSwgdmFsdWUpOyAvLyBhZGQgcHJvcGVydHkgdG8gY3VycmVudCBjb250ZXh0IGlmIHZhbGlkXG5cbiAgaWYgKHByb3BlcnR5KSB7XG4gICAgdmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7XG4gICAgdGhpc1tpXS5wcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkpO1xuICAgIHRoaXNbaV0ucHJvcGVydGllc1twcm9wZXJ0eS5uYW1lXSA9IHByb3BlcnR5OyAvLyBhbGxvdyBhY2Nlc3MgYnkgbmFtZSBhcyB3ZWxsXG5cbiAgICBpZiAocHJvcGVydHkubmFtZS5tYXRjaCgvcGllLShcXGQrKS1iYWNrZ3JvdW5kLXNpemUvKSAmJiBwcm9wZXJ0eS52YWx1ZSkge1xuICAgICAgdGhpcy5fcHJpdmF0ZS5oYXNQaWUgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wZXJ0eS5tYXBwZWQpIHtcbiAgICAgIHRoaXNbaV0ubWFwcGVkUHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTtcbiAgICB9IC8vIGFkZCB0byBjb3JlIHN0eWxlIGlmIG5lY2Vzc2FyeVxuXG5cbiAgICB2YXIgY3VycmVudFNlbGVjdG9ySXNDb3JlID0gIXRoaXNbaV0uc2VsZWN0b3I7XG5cbiAgICBpZiAoY3VycmVudFNlbGVjdG9ySXNDb3JlKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLmNvcmVTdHlsZVtwcm9wZXJ0eS5uYW1lXSA9IHByb3BlcnR5O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxuc3R5Zm4uYXBwZW5kID0gZnVuY3Rpb24gKHN0eWxlKSB7XG4gIGlmIChzdHlsZXNoZWV0KHN0eWxlKSkge1xuICAgIHN0eWxlLmFwcGVuZFRvU3R5bGUodGhpcyk7XG4gIH0gZWxzZSBpZiAoYXJyYXkoc3R5bGUpKSB7XG4gICAgdGhpcy5hcHBlbmRGcm9tSnNvbihzdHlsZSk7XG4gIH0gZWxzZSBpZiAoc3RyaW5nKHN0eWxlKSkge1xuICAgIHRoaXMuYXBwZW5kRnJvbVN0cmluZyhzdHlsZSk7XG4gIH0gLy8geW91IHByb2JhYmx5IHdvdWxkbid0IHdhbnQgdG8gYXBwZW5kIGEgU3R5bGUsIHNpbmNlIHlvdSdkIGR1cGxpY2F0ZSB0aGUgZGVmYXVsdCBwYXJ0c1xuXG5cbiAgcmV0dXJuIHRoaXM7XG59OyAvLyBzdGF0aWMgZnVuY3Rpb25cblxuXG5TdHlsZS5mcm9tSnNvbiA9IGZ1bmN0aW9uIChjeSwganNvbikge1xuICB2YXIgc3R5bGUgPSBuZXcgU3R5bGUoY3kpO1xuICBzdHlsZS5mcm9tSnNvbihqc29uKTtcbiAgcmV0dXJuIHN0eWxlO1xufTtcblxuU3R5bGUuZnJvbVN0cmluZyA9IGZ1bmN0aW9uIChjeSwgc3RyaW5nKSB7XG4gIHJldHVybiBuZXcgU3R5bGUoY3kpLmZyb21TdHJpbmcoc3RyaW5nKTtcbn07XG5cbltzdHlmbiQ4LCBzdHlmbiQ3LCBzdHlmbiQ2LCBzdHlmbiQ1LCBzdHlmbiQ0LCBzdHlmbiQzLCBzdHlmbiQyLCBzdHlmbiQxXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoc3R5Zm4sIHByb3BzKTtcbn0pO1xuU3R5bGUudHlwZXMgPSBzdHlmbi50eXBlcztcblN0eWxlLnByb3BlcnRpZXMgPSBzdHlmbi5wcm9wZXJ0aWVzO1xuU3R5bGUucHJvcGVydHlHcm91cHMgPSBzdHlmbi5wcm9wZXJ0eUdyb3VwcztcblN0eWxlLnByb3BlcnR5R3JvdXBOYW1lcyA9IHN0eWZuLnByb3BlcnR5R3JvdXBOYW1lcztcblN0eWxlLnByb3BlcnR5R3JvdXBLZXlzID0gc3R5Zm4ucHJvcGVydHlHcm91cEtleXM7XG5cbnZhciBjb3JlZm4kMiA9IHtcbiAgc3R5bGU6IGZ1bmN0aW9uIHN0eWxlKG5ld1N0eWxlKSB7XG4gICAgaWYgKG5ld1N0eWxlKSB7XG4gICAgICB2YXIgcyA9IHRoaXMuc2V0U3R5bGUobmV3U3R5bGUpO1xuICAgICAgcy51cGRhdGUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5zdHlsZTtcbiAgfSxcbiAgc2V0U3R5bGU6IGZ1bmN0aW9uIHNldFN0eWxlKHN0eWxlKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcblxuICAgIGlmIChzdHlsZXNoZWV0KHN0eWxlKSkge1xuICAgICAgX3Auc3R5bGUgPSBzdHlsZS5nZW5lcmF0ZVN0eWxlKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoYXJyYXkoc3R5bGUpKSB7XG4gICAgICBfcC5zdHlsZSA9IFN0eWxlLmZyb21Kc29uKHRoaXMsIHN0eWxlKTtcbiAgICB9IGVsc2UgaWYgKHN0cmluZyhzdHlsZSkpIHtcbiAgICAgIF9wLnN0eWxlID0gU3R5bGUuZnJvbVN0cmluZyh0aGlzLCBzdHlsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9wLnN0eWxlID0gU3R5bGUodGhpcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9wLnN0eWxlO1xuICB9LFxuICAvLyBlLmcuIGN5LmRhdGEoKSBjaGFuZ2VkID0+IHJlY2FsYyBlbGUgbWFwcGVyc1xuICB1cGRhdGVTdHlsZTogZnVuY3Rpb24gdXBkYXRlU3R5bGUoKSB7XG4gICAgdGhpcy5tdXRhYmxlRWxlbWVudHMoKS51cGRhdGVTdHlsZSgpOyAvLyBqdXN0IHNlbmQgdG8gYWxsIGVsZXNcbiAgfVxufTtcblxudmFyIGRlZmF1bHRTZWxlY3Rpb25UeXBlID0gJ3NpbmdsZSc7XG52YXIgY29yZWZuJDEgPSB7XG4gIGF1dG9sb2NrOiBmdW5jdGlvbiBhdXRvbG9jayhib29sKSB7XG4gICAgaWYgKGJvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcHJpdmF0ZS5hdXRvbG9jayA9IGJvb2wgPyB0cnVlIDogZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmF1dG9sb2NrO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICBhdXRvdW5ncmFiaWZ5OiBmdW5jdGlvbiBhdXRvdW5ncmFiaWZ5KGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLmF1dG91bmdyYWJpZnkgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5hdXRvdW5ncmFiaWZ5O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICBhdXRvdW5zZWxlY3RpZnk6IGZ1bmN0aW9uIGF1dG91bnNlbGVjdGlmeShib29sKSB7XG4gICAgaWYgKGJvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcHJpdmF0ZS5hdXRvdW5zZWxlY3RpZnkgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5hdXRvdW5zZWxlY3RpZnk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIHNlbGVjdGlvblR5cGU6IGZ1bmN0aW9uIHNlbGVjdGlvblR5cGUoc2VsVHlwZSkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG5cbiAgICBpZiAoX3Auc2VsZWN0aW9uVHlwZSA9PSBudWxsKSB7XG4gICAgICBfcC5zZWxlY3Rpb25UeXBlID0gZGVmYXVsdFNlbGVjdGlvblR5cGU7XG4gICAgfVxuXG4gICAgaWYgKHNlbFR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHNlbFR5cGUgPT09ICdhZGRpdGl2ZScgfHwgc2VsVHlwZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgX3Auc2VsZWN0aW9uVHlwZSA9IHNlbFR5cGU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBfcC5zZWxlY3Rpb25UeXBlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBwYW5uaW5nRW5hYmxlZDogZnVuY3Rpb24gcGFubmluZ0VuYWJsZWQoYm9vbCkge1xuICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUucGFubmluZ0VuYWJsZWQgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5wYW5uaW5nRW5hYmxlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgdXNlclBhbm5pbmdFbmFibGVkOiBmdW5jdGlvbiB1c2VyUGFubmluZ0VuYWJsZWQoYm9vbCkge1xuICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUudXNlclBhbm5pbmdFbmFibGVkID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUudXNlclBhbm5pbmdFbmFibGVkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICB6b29taW5nRW5hYmxlZDogZnVuY3Rpb24gem9vbWluZ0VuYWJsZWQoYm9vbCkge1xuICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUuem9vbWluZ0VuYWJsZWQgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS56b29taW5nRW5hYmxlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgdXNlclpvb21pbmdFbmFibGVkOiBmdW5jdGlvbiB1c2VyWm9vbWluZ0VuYWJsZWQoYm9vbCkge1xuICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUudXNlclpvb21pbmdFbmFibGVkID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUudXNlclpvb21pbmdFbmFibGVkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICBib3hTZWxlY3Rpb25FbmFibGVkOiBmdW5jdGlvbiBib3hTZWxlY3Rpb25FbmFibGVkKGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLmJveFNlbGVjdGlvbkVuYWJsZWQgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5ib3hTZWxlY3Rpb25FbmFibGVkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICBwYW46IGZ1bmN0aW9uIHBhbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgcGFuID0gdGhpcy5fcHJpdmF0ZS5wYW47XG4gICAgdmFyIGRpbSwgdmFsLCBkaW1zLCB4LCB5O1xuXG4gICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICAvLyAucGFuKClcbiAgICAgICAgcmV0dXJuIHBhbjtcblxuICAgICAgY2FzZSAxOlxuICAgICAgICBpZiAoc3RyaW5nKGFyZ3NbMF0pKSB7XG4gICAgICAgICAgLy8gLnBhbigneCcpXG4gICAgICAgICAgZGltID0gYXJnc1swXTtcbiAgICAgICAgICByZXR1cm4gcGFuW2RpbV07XG4gICAgICAgIH0gZWxzZSBpZiAocGxhaW5PYmplY3QoYXJnc1swXSkpIHtcbiAgICAgICAgICAvLyAucGFuKHsgeDogMCwgeTogMTAwIH0pXG4gICAgICAgICAgaWYgKCF0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaW1zID0gYXJnc1swXTtcbiAgICAgICAgICB4ID0gZGltcy54O1xuICAgICAgICAgIHkgPSBkaW1zLnk7XG5cbiAgICAgICAgICBpZiAobnVtYmVyJDEoeCkpIHtcbiAgICAgICAgICAgIHBhbi54ID0geDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobnVtYmVyJDEoeSkpIHtcbiAgICAgICAgICAgIHBhbi55ID0geTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmVtaXQoJ3BhbiB2aWV3cG9ydCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMjpcbiAgICAgICAgLy8gLnBhbigneCcsIDEwMClcbiAgICAgICAgaWYgKCF0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBkaW0gPSBhcmdzWzBdO1xuICAgICAgICB2YWwgPSBhcmdzWzFdO1xuXG4gICAgICAgIGlmICgoZGltID09PSAneCcgfHwgZGltID09PSAneScpICYmIG51bWJlciQxKHZhbCkpIHtcbiAgICAgICAgICBwYW5bZGltXSA9IHZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW1pdCgncGFuIHZpZXdwb3J0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gaW52YWxpZFxuICAgIH1cblxuICAgIHRoaXMubm90aWZ5KCd2aWV3cG9ydCcpO1xuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICBwYW5CeTogZnVuY3Rpb24gcGFuQnkoYXJnMCwgYXJnMSkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHZhciBwYW4gPSB0aGlzLl9wcml2YXRlLnBhbjtcbiAgICB2YXIgZGltLCB2YWwsIGRpbXMsIHgsIHk7XG5cbiAgICBpZiAoIXRoaXMuX3ByaXZhdGUucGFubmluZ0VuYWJsZWQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaWYgKHBsYWluT2JqZWN0KGFyZzApKSB7XG4gICAgICAgICAgLy8gLnBhbkJ5KHsgeDogMCwgeTogMTAwIH0pXG4gICAgICAgICAgZGltcyA9IGFyZ3NbMF07XG4gICAgICAgICAgeCA9IGRpbXMueDtcbiAgICAgICAgICB5ID0gZGltcy55O1xuXG4gICAgICAgICAgaWYgKG51bWJlciQxKHgpKSB7XG4gICAgICAgICAgICBwYW4ueCArPSB4O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChudW1iZXIkMSh5KSkge1xuICAgICAgICAgICAgcGFuLnkgKz0geTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmVtaXQoJ3BhbiB2aWV3cG9ydCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMjpcbiAgICAgICAgLy8gLnBhbkJ5KCd4JywgMTAwKVxuICAgICAgICBkaW0gPSBhcmcwO1xuICAgICAgICB2YWwgPSBhcmcxO1xuXG4gICAgICAgIGlmICgoZGltID09PSAneCcgfHwgZGltID09PSAneScpICYmIG51bWJlciQxKHZhbCkpIHtcbiAgICAgICAgICBwYW5bZGltXSArPSB2YWw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVtaXQoJ3BhbiB2aWV3cG9ydCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIC8vIGludmFsaWRcbiAgICB9XG5cbiAgICB0aGlzLm5vdGlmeSgndmlld3BvcnQnKTtcbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgZml0OiBmdW5jdGlvbiBmaXQoZWxlbWVudHMsIHBhZGRpbmcpIHtcbiAgICB2YXIgdmlld3BvcnRTdGF0ZSA9IHRoaXMuZ2V0Rml0Vmlld3BvcnQoZWxlbWVudHMsIHBhZGRpbmcpO1xuXG4gICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgICBfcC56b29tID0gdmlld3BvcnRTdGF0ZS56b29tO1xuICAgICAgX3AucGFuID0gdmlld3BvcnRTdGF0ZS5wYW47XG4gICAgICB0aGlzLmVtaXQoJ3BhbiB6b29tIHZpZXdwb3J0Jyk7XG4gICAgICB0aGlzLm5vdGlmeSgndmlld3BvcnQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgZ2V0Rml0Vmlld3BvcnQ6IGZ1bmN0aW9uIGdldEZpdFZpZXdwb3J0KGVsZW1lbnRzLCBwYWRkaW5nKSB7XG4gICAgaWYgKG51bWJlciQxKGVsZW1lbnRzKSAmJiBwYWRkaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGVsZW1lbnRzIGlzIG9wdGlvbmFsXG4gICAgICBwYWRkaW5nID0gZWxlbWVudHM7XG4gICAgICBlbGVtZW50cyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3ByaXZhdGUucGFubmluZ0VuYWJsZWQgfHwgIXRoaXMuX3ByaXZhdGUuem9vbWluZ0VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYmI7XG5cbiAgICBpZiAoc3RyaW5nKGVsZW1lbnRzKSkge1xuICAgICAgdmFyIHNlbCA9IGVsZW1lbnRzO1xuICAgICAgZWxlbWVudHMgPSB0aGlzLiQoc2VsKTtcbiAgICB9IGVsc2UgaWYgKGJvdW5kaW5nQm94KGVsZW1lbnRzKSkge1xuICAgICAgLy8gYXNzdW1lIGJiXG4gICAgICB2YXIgYmJlID0gZWxlbWVudHM7XG4gICAgICBiYiA9IHtcbiAgICAgICAgeDE6IGJiZS54MSxcbiAgICAgICAgeTE6IGJiZS55MSxcbiAgICAgICAgeDI6IGJiZS54MixcbiAgICAgICAgeTI6IGJiZS55MlxuICAgICAgfTtcbiAgICAgIGJiLncgPSBiYi54MiAtIGJiLngxO1xuICAgICAgYmIuaCA9IGJiLnkyIC0gYmIueTE7XG4gICAgfSBlbHNlIGlmICghZWxlbWVudE9yQ29sbGVjdGlvbihlbGVtZW50cykpIHtcbiAgICAgIGVsZW1lbnRzID0gdGhpcy5tdXRhYmxlRWxlbWVudHMoKTtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihlbGVtZW50cykgJiYgZWxlbWVudHMuZW1wdHkoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gY2FuJ3QgZml0IHRvIG5vdGhpbmdcblxuXG4gICAgYmIgPSBiYiB8fCBlbGVtZW50cy5ib3VuZGluZ0JveCgpO1xuICAgIHZhciB3ID0gdGhpcy53aWR0aCgpO1xuICAgIHZhciBoID0gdGhpcy5oZWlnaHQoKTtcbiAgICB2YXIgem9vbTtcbiAgICBwYWRkaW5nID0gbnVtYmVyJDEocGFkZGluZykgPyBwYWRkaW5nIDogMDtcblxuICAgIGlmICghaXNOYU4odykgJiYgIWlzTmFOKGgpICYmIHcgPiAwICYmIGggPiAwICYmICFpc05hTihiYi53KSAmJiAhaXNOYU4oYmIuaCkgJiYgYmIudyA+IDAgJiYgYmIuaCA+IDApIHtcbiAgICAgIHpvb20gPSBNYXRoLm1pbigodyAtIDIgKiBwYWRkaW5nKSAvIGJiLncsIChoIC0gMiAqIHBhZGRpbmcpIC8gYmIuaCk7IC8vIGNyb3Agem9vbVxuXG4gICAgICB6b29tID0gem9vbSA+IHRoaXMuX3ByaXZhdGUubWF4Wm9vbSA/IHRoaXMuX3ByaXZhdGUubWF4Wm9vbSA6IHpvb207XG4gICAgICB6b29tID0gem9vbSA8IHRoaXMuX3ByaXZhdGUubWluWm9vbSA/IHRoaXMuX3ByaXZhdGUubWluWm9vbSA6IHpvb207XG4gICAgICB2YXIgcGFuID0ge1xuICAgICAgICAvLyBub3cgcGFuIHRvIG1pZGRsZVxuICAgICAgICB4OiAodyAtIHpvb20gKiAoYmIueDEgKyBiYi54MikpIC8gMixcbiAgICAgICAgeTogKGggLSB6b29tICogKGJiLnkxICsgYmIueTIpKSAvIDJcbiAgICAgIH07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB6b29tOiB6b29tLFxuICAgICAgICBwYW46IHBhblxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG4gIHpvb21SYW5nZTogZnVuY3Rpb24gem9vbVJhbmdlKG1pbiwgbWF4KSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcblxuICAgIGlmIChtYXggPT0gbnVsbCkge1xuICAgICAgdmFyIG9wdHMgPSBtaW47XG4gICAgICBtaW4gPSBvcHRzLm1pbjtcbiAgICAgIG1heCA9IG9wdHMubWF4O1xuICAgIH1cblxuICAgIGlmIChudW1iZXIkMShtaW4pICYmIG51bWJlciQxKG1heCkgJiYgbWluIDw9IG1heCkge1xuICAgICAgX3AubWluWm9vbSA9IG1pbjtcbiAgICAgIF9wLm1heFpvb20gPSBtYXg7XG4gICAgfSBlbHNlIGlmIChudW1iZXIkMShtaW4pICYmIG1heCA9PT0gdW5kZWZpbmVkICYmIG1pbiA8PSBfcC5tYXhab29tKSB7XG4gICAgICBfcC5taW5ab29tID0gbWluO1xuICAgIH0gZWxzZSBpZiAobnVtYmVyJDEobWF4KSAmJiBtaW4gPT09IHVuZGVmaW5lZCAmJiBtYXggPj0gX3AubWluWm9vbSkge1xuICAgICAgX3AubWF4Wm9vbSA9IG1heDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgbWluWm9vbTogZnVuY3Rpb24gbWluWm9vbSh6b29tKSB7XG4gICAgaWYgKHpvb20gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUubWluWm9vbTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuem9vbVJhbmdlKHtcbiAgICAgICAgbWluOiB6b29tXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIG1heFpvb206IGZ1bmN0aW9uIG1heFpvb20oem9vbSkge1xuICAgIGlmICh6b29tID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLm1heFpvb207XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnpvb21SYW5nZSh7XG4gICAgICAgIG1heDogem9vbVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICBnZXRab29tZWRWaWV3cG9ydDogZnVuY3Rpb24gZ2V0Wm9vbWVkVmlld3BvcnQocGFyYW1zKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgY3VycmVudFBhbiA9IF9wLnBhbjtcbiAgICB2YXIgY3VycmVudFpvb20gPSBfcC56b29tO1xuICAgIHZhciBwb3M7IC8vIGluIHJlbmRlcmVkIHB4XG5cbiAgICB2YXIgem9vbTtcbiAgICB2YXIgYmFpbCA9IGZhbHNlO1xuXG4gICAgaWYgKCFfcC56b29taW5nRW5hYmxlZCkge1xuICAgICAgLy8gem9vbWluZyBkaXNhYmxlZFxuICAgICAgYmFpbCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG51bWJlciQxKHBhcmFtcykpIHtcbiAgICAgIC8vIHRoZW4gc2V0IHRoZSB6b29tXG4gICAgICB6b29tID0gcGFyYW1zO1xuICAgIH0gZWxzZSBpZiAocGxhaW5PYmplY3QocGFyYW1zKSkge1xuICAgICAgLy8gdGhlbiB6b29tIGFib3V0IGEgcG9pbnRcbiAgICAgIHpvb20gPSBwYXJhbXMubGV2ZWw7XG5cbiAgICAgIGlmIChwYXJhbXMucG9zaXRpb24gIT0gbnVsbCkge1xuICAgICAgICBwb3MgPSBtb2RlbFRvUmVuZGVyZWRQb3NpdGlvbihwYXJhbXMucG9zaXRpb24sIGN1cnJlbnRab29tLCBjdXJyZW50UGFuKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnJlbmRlcmVkUG9zaXRpb24gIT0gbnVsbCkge1xuICAgICAgICBwb3MgPSBwYXJhbXMucmVuZGVyZWRQb3NpdGlvbjtcbiAgICAgIH1cblxuICAgICAgaWYgKHBvcyAhPSBudWxsICYmICFfcC5wYW5uaW5nRW5hYmxlZCkge1xuICAgICAgICAvLyBwYW5uaW5nIGRpc2FibGVkXG4gICAgICAgIGJhaWwgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gLy8gY3JvcCB6b29tXG5cblxuICAgIHpvb20gPSB6b29tID4gX3AubWF4Wm9vbSA/IF9wLm1heFpvb20gOiB6b29tO1xuICAgIHpvb20gPSB6b29tIDwgX3AubWluWm9vbSA/IF9wLm1pblpvb20gOiB6b29tOyAvLyBjYW4ndCB6b29tIHdpdGggaW52YWxpZCBwYXJhbXNcblxuICAgIGlmIChiYWlsIHx8ICFudW1iZXIkMSh6b29tKSB8fCB6b29tID09PSBjdXJyZW50Wm9vbSB8fCBwb3MgIT0gbnVsbCAmJiAoIW51bWJlciQxKHBvcy54KSB8fCAhbnVtYmVyJDEocG9zLnkpKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHBvcyAhPSBudWxsKSB7XG4gICAgICAvLyBzZXQgem9vbSBhYm91dCBwb3NpdGlvblxuICAgICAgdmFyIHBhbjEgPSBjdXJyZW50UGFuO1xuICAgICAgdmFyIHpvb20xID0gY3VycmVudFpvb207XG4gICAgICB2YXIgem9vbTIgPSB6b29tO1xuICAgICAgdmFyIHBhbjIgPSB7XG4gICAgICAgIHg6IC16b29tMiAvIHpvb20xICogKHBvcy54IC0gcGFuMS54KSArIHBvcy54LFxuICAgICAgICB5OiAtem9vbTIgLyB6b29tMSAqIChwb3MueSAtIHBhbjEueSkgKyBwb3MueVxuICAgICAgfTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHpvb21lZDogdHJ1ZSxcbiAgICAgICAgcGFubmVkOiB0cnVlLFxuICAgICAgICB6b29tOiB6b29tMixcbiAgICAgICAgcGFuOiBwYW4yXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBqdXN0IHNldCB0aGUgem9vbVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgem9vbWVkOiB0cnVlLFxuICAgICAgICBwYW5uZWQ6IGZhbHNlLFxuICAgICAgICB6b29tOiB6b29tLFxuICAgICAgICBwYW46IGN1cnJlbnRQYW5cbiAgICAgIH07XG4gICAgfVxuICB9LFxuICB6b29tOiBmdW5jdGlvbiB6b29tKHBhcmFtcykge1xuICAgIGlmIChwYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gZ2V0XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS56b29tO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzZXRcbiAgICAgIHZhciB2cCA9IHRoaXMuZ2V0Wm9vbWVkVmlld3BvcnQocGFyYW1zKTtcbiAgICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG5cbiAgICAgIGlmICh2cCA9PSBudWxsIHx8ICF2cC56b29tZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIF9wLnpvb20gPSB2cC56b29tO1xuXG4gICAgICBpZiAodnAucGFubmVkKSB7XG4gICAgICAgIF9wLnBhbi54ID0gdnAucGFuLng7XG4gICAgICAgIF9wLnBhbi55ID0gdnAucGFuLnk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW1pdCgnem9vbScgKyAodnAucGFubmVkID8gJyBwYW4nIDogJycpICsgJyB2aWV3cG9ydCcpO1xuICAgICAgdGhpcy5ub3RpZnkoJ3ZpZXdwb3J0Jyk7XG4gICAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgICB9XG4gIH0sXG4gIHZpZXdwb3J0OiBmdW5jdGlvbiB2aWV3cG9ydChvcHRzKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgem9vbURlZmQgPSB0cnVlO1xuICAgIHZhciBwYW5EZWZkID0gdHJ1ZTtcbiAgICB2YXIgZXZlbnRzID0gW107IC8vIHRvIHRyaWdnZXJcblxuICAgIHZhciB6b29tRmFpbGVkID0gZmFsc2U7XG4gICAgdmFyIHBhbkZhaWxlZCA9IGZhbHNlO1xuXG4gICAgaWYgKCFvcHRzKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAoIW51bWJlciQxKG9wdHMuem9vbSkpIHtcbiAgICAgIHpvb21EZWZkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFwbGFpbk9iamVjdChvcHRzLnBhbikpIHtcbiAgICAgIHBhbkRlZmQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXpvb21EZWZkICYmICFwYW5EZWZkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAoem9vbURlZmQpIHtcbiAgICAgIHZhciB6ID0gb3B0cy56b29tO1xuXG4gICAgICBpZiAoeiA8IF9wLm1pblpvb20gfHwgeiA+IF9wLm1heFpvb20gfHwgIV9wLnpvb21pbmdFbmFibGVkKSB7XG4gICAgICAgIHpvb21GYWlsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3Auem9vbSA9IHo7XG4gICAgICAgIGV2ZW50cy5wdXNoKCd6b29tJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhbkRlZmQgJiYgKCF6b29tRmFpbGVkIHx8ICFvcHRzLmNhbmNlbE9uRmFpbGVkWm9vbSkgJiYgX3AucGFubmluZ0VuYWJsZWQpIHtcbiAgICAgIHZhciBwID0gb3B0cy5wYW47XG5cbiAgICAgIGlmIChudW1iZXIkMShwLngpKSB7XG4gICAgICAgIF9wLnBhbi54ID0gcC54O1xuICAgICAgICBwYW5GYWlsZWQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bWJlciQxKHAueSkpIHtcbiAgICAgICAgX3AucGFuLnkgPSBwLnk7XG4gICAgICAgIHBhbkZhaWxlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXBhbkZhaWxlZCkge1xuICAgICAgICBldmVudHMucHVzaCgncGFuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBldmVudHMucHVzaCgndmlld3BvcnQnKTtcbiAgICAgIHRoaXMuZW1pdChldmVudHMuam9pbignICcpKTtcbiAgICAgIHRoaXMubm90aWZ5KCd2aWV3cG9ydCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICBjZW50ZXI6IGZ1bmN0aW9uIGNlbnRlcihlbGVtZW50cykge1xuICAgIHZhciBwYW4gPSB0aGlzLmdldENlbnRlclBhbihlbGVtZW50cyk7XG5cbiAgICBpZiAocGFuKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLnBhbiA9IHBhbjtcbiAgICAgIHRoaXMuZW1pdCgncGFuIHZpZXdwb3J0Jyk7XG4gICAgICB0aGlzLm5vdGlmeSgndmlld3BvcnQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgZ2V0Q2VudGVyUGFuOiBmdW5jdGlvbiBnZXRDZW50ZXJQYW4oZWxlbWVudHMsIHpvb20pIHtcbiAgICBpZiAoIXRoaXMuX3ByaXZhdGUucGFubmluZ0VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc3RyaW5nKGVsZW1lbnRzKSkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gZWxlbWVudHM7XG4gICAgICBlbGVtZW50cyA9IHRoaXMubXV0YWJsZUVsZW1lbnRzKCkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9IGVsc2UgaWYgKCFlbGVtZW50T3JDb2xsZWN0aW9uKGVsZW1lbnRzKSkge1xuICAgICAgZWxlbWVudHMgPSB0aGlzLm11dGFibGVFbGVtZW50cygpO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGNhbid0IGNlbnRyZSBwYW4gdG8gbm90aGluZ1xuXG5cbiAgICB2YXIgYmIgPSBlbGVtZW50cy5ib3VuZGluZ0JveCgpO1xuICAgIHZhciB3ID0gdGhpcy53aWR0aCgpO1xuICAgIHZhciBoID0gdGhpcy5oZWlnaHQoKTtcbiAgICB6b29tID0gem9vbSA9PT0gdW5kZWZpbmVkID8gdGhpcy5fcHJpdmF0ZS56b29tIDogem9vbTtcbiAgICB2YXIgcGFuID0ge1xuICAgICAgLy8gbWlkZGxlXG4gICAgICB4OiAodyAtIHpvb20gKiAoYmIueDEgKyBiYi54MikpIC8gMixcbiAgICAgIHk6IChoIC0gem9vbSAqIChiYi55MSArIGJiLnkyKSkgLyAyXG4gICAgfTtcbiAgICByZXR1cm4gcGFuO1xuICB9LFxuICByZXNldDogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgaWYgKCF0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkIHx8ICF0aGlzLl9wcml2YXRlLnpvb21pbmdFbmFibGVkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLnZpZXdwb3J0KHtcbiAgICAgIHBhbjoge1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwXG4gICAgICB9LFxuICAgICAgem9vbTogMVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICBpbnZhbGlkYXRlU2l6ZTogZnVuY3Rpb24gaW52YWxpZGF0ZVNpemUoKSB7XG4gICAgdGhpcy5fcHJpdmF0ZS5zaXplQ2FjaGUgPSBudWxsO1xuICB9LFxuICBzaXplOiBmdW5jdGlvbiBzaXplKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgdmFyIGNvbnRhaW5lciA9IF9wLmNvbnRhaW5lcjtcbiAgICByZXR1cm4gX3Auc2l6ZUNhY2hlID0gX3Auc2l6ZUNhY2hlIHx8IChjb250YWluZXIgPyBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc3R5bGUgPSB3aW5kb3ckMS5nZXRDb21wdXRlZFN0eWxlKGNvbnRhaW5lcik7XG5cbiAgICAgIHZhciB2YWwgPSBmdW5jdGlvbiB2YWwobmFtZSkge1xuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoOiBjb250YWluZXIuY2xpZW50V2lkdGggLSB2YWwoJ3BhZGRpbmctbGVmdCcpIC0gdmFsKCdwYWRkaW5nLXJpZ2h0JyksXG4gICAgICAgIGhlaWdodDogY29udGFpbmVyLmNsaWVudEhlaWdodCAtIHZhbCgncGFkZGluZy10b3AnKSAtIHZhbCgncGFkZGluZy1ib3R0b20nKVxuICAgICAgfTtcbiAgICB9KCkgOiB7XG4gICAgICAvLyBmYWxsYmFjayBpZiBubyBjb250YWluZXIgKG5vdCAwIGIvYyBjYW4gYmUgdXNlZCBmb3IgZGl2aWRpbmcgZXRjKVxuICAgICAgd2lkdGg6IDEsXG4gICAgICBoZWlnaHQ6IDFcbiAgICB9KTtcbiAgfSxcbiAgd2lkdGg6IGZ1bmN0aW9uIHdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLnNpemUoKS53aWR0aDtcbiAgfSxcbiAgaGVpZ2h0OiBmdW5jdGlvbiBoZWlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZSgpLmhlaWdodDtcbiAgfSxcbiAgZXh0ZW50OiBmdW5jdGlvbiBleHRlbnQoKSB7XG4gICAgdmFyIHBhbiA9IHRoaXMuX3ByaXZhdGUucGFuO1xuICAgIHZhciB6b29tID0gdGhpcy5fcHJpdmF0ZS56b29tO1xuICAgIHZhciByYiA9IHRoaXMucmVuZGVyZWRFeHRlbnQoKTtcbiAgICB2YXIgYiA9IHtcbiAgICAgIHgxOiAocmIueDEgLSBwYW4ueCkgLyB6b29tLFxuICAgICAgeDI6IChyYi54MiAtIHBhbi54KSAvIHpvb20sXG4gICAgICB5MTogKHJiLnkxIC0gcGFuLnkpIC8gem9vbSxcbiAgICAgIHkyOiAocmIueTIgLSBwYW4ueSkgLyB6b29tXG4gICAgfTtcbiAgICBiLncgPSBiLngyIC0gYi54MTtcbiAgICBiLmggPSBiLnkyIC0gYi55MTtcbiAgICByZXR1cm4gYjtcbiAgfSxcbiAgcmVuZGVyZWRFeHRlbnQ6IGZ1bmN0aW9uIHJlbmRlcmVkRXh0ZW50KCkge1xuICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICB2YXIgaGVpZ2h0ID0gdGhpcy5oZWlnaHQoKTtcbiAgICByZXR1cm4ge1xuICAgICAgeDE6IDAsXG4gICAgICB5MTogMCxcbiAgICAgIHgyOiB3aWR0aCxcbiAgICAgIHkyOiBoZWlnaHQsXG4gICAgICB3OiB3aWR0aCxcbiAgICAgIGg6IGhlaWdodFxuICAgIH07XG4gIH0sXG4gIG11bHRpQ2xpY2tEZWJvdW5jZVRpbWU6IGZ1bmN0aW9uIG11bHRpQ2xpY2tEZWJvdW5jZVRpbWUoX2ludCkge1xuICAgIGlmIChfaW50KSB0aGlzLl9wcml2YXRlLm11bHRpQ2xpY2tEZWJvdW5jZVRpbWUgPSBfaW50O2Vsc2UgcmV0dXJuIHRoaXMuX3ByaXZhdGUubXVsdGlDbGlja0RlYm91bmNlVGltZTtcbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfVxufTsgLy8gYWxpYXNlc1xuXG5jb3JlZm4kMS5jZW50cmUgPSBjb3JlZm4kMS5jZW50ZXI7IC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cbmNvcmVmbiQxLmF1dG9sb2NrTm9kZXMgPSBjb3JlZm4kMS5hdXRvbG9jaztcbmNvcmVmbiQxLmF1dG91bmdyYWJpZnlOb2RlcyA9IGNvcmVmbiQxLmF1dG91bmdyYWJpZnk7XG5cbnZhciBmbiA9IHtcbiAgZGF0YTogZGVmaW5lLmRhdGEoe1xuICAgIGZpZWxkOiAnZGF0YScsXG4gICAgYmluZGluZ0V2ZW50OiAnZGF0YScsXG4gICAgYWxsb3dCaW5kaW5nOiB0cnVlLFxuICAgIGFsbG93U2V0dGluZzogdHJ1ZSxcbiAgICBzZXR0aW5nRXZlbnQ6ICdkYXRhJyxcbiAgICBzZXR0aW5nVHJpZ2dlcnNFdmVudDogdHJ1ZSxcbiAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgYWxsb3dHZXR0aW5nOiB0cnVlLFxuICAgIHVwZGF0ZVN0eWxlOiB0cnVlXG4gIH0pLFxuICByZW1vdmVEYXRhOiBkZWZpbmUucmVtb3ZlRGF0YSh7XG4gICAgZmllbGQ6ICdkYXRhJyxcbiAgICBldmVudDogJ2RhdGEnLFxuICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICB0cmlnZ2VyRXZlbnQ6IHRydWUsXG4gICAgdXBkYXRlU3R5bGU6IHRydWVcbiAgfSksXG4gIHNjcmF0Y2g6IGRlZmluZS5kYXRhKHtcbiAgICBmaWVsZDogJ3NjcmF0Y2gnLFxuICAgIGJpbmRpbmdFdmVudDogJ3NjcmF0Y2gnLFxuICAgIGFsbG93QmluZGluZzogdHJ1ZSxcbiAgICBhbGxvd1NldHRpbmc6IHRydWUsXG4gICAgc2V0dGluZ0V2ZW50OiAnc2NyYXRjaCcsXG4gICAgc2V0dGluZ1RyaWdnZXJzRXZlbnQ6IHRydWUsXG4gICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgIGFsbG93R2V0dGluZzogdHJ1ZSxcbiAgICB1cGRhdGVTdHlsZTogdHJ1ZVxuICB9KSxcbiAgcmVtb3ZlU2NyYXRjaDogZGVmaW5lLnJlbW92ZURhdGEoe1xuICAgIGZpZWxkOiAnc2NyYXRjaCcsXG4gICAgZXZlbnQ6ICdzY3JhdGNoJyxcbiAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgdHJpZ2dlckV2ZW50OiB0cnVlLFxuICAgIHVwZGF0ZVN0eWxlOiB0cnVlXG4gIH0pXG59OyAvLyBhbGlhc2VzXG5cbmZuLmF0dHIgPSBmbi5kYXRhO1xuZm4ucmVtb3ZlQXR0ciA9IGZuLnJlbW92ZURhdGE7XG5cbnZhciBDb3JlID0gZnVuY3Rpb24gQ29yZShvcHRzKSB7XG4gIHZhciBjeSA9IHRoaXM7XG4gIG9wdHMgPSBleHRlbmQoe30sIG9wdHMpO1xuICB2YXIgY29udGFpbmVyID0gb3B0cy5jb250YWluZXI7IC8vIGFsbG93IGZvciBwYXNzaW5nIGEgd3JhcHBlZCBqcXVlcnkgb2JqZWN0XG4gIC8vIGUuZy4gY3l0b3NjYXBlKHsgY29udGFpbmVyOiAkKCcjY3knKSB9KVxuXG4gIGlmIChjb250YWluZXIgJiYgIWh0bWxFbGVtZW50KGNvbnRhaW5lcikgJiYgaHRtbEVsZW1lbnQoY29udGFpbmVyWzBdKSkge1xuICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lclswXTtcbiAgfVxuXG4gIHZhciByZWcgPSBjb250YWluZXIgPyBjb250YWluZXIuX2N5cmVnIDogbnVsbDsgLy8gZS5nLiBhbHJlYWR5IHJlZ2lzdGVyZWQgc29tZSBpbmZvIChlLmcuIHJlYWRpZXMpIHZpYSBqcXVlcnlcblxuICByZWcgPSByZWcgfHwge307XG5cbiAgaWYgKHJlZyAmJiByZWcuY3kpIHtcbiAgICByZWcuY3kuZGVzdHJveSgpO1xuICAgIHJlZyA9IHt9OyAvLyBvbGQgaW5zdGFuY2UgPT4gcmVwbGFjZSByZWcgY29tcGxldGVseVxuICB9XG5cbiAgdmFyIHJlYWRpZXMgPSByZWcucmVhZGllcyA9IHJlZy5yZWFkaWVzIHx8IFtdO1xuXG4gIGlmIChjb250YWluZXIpIHtcbiAgICBjb250YWluZXIuX2N5cmVnID0gcmVnO1xuICB9IC8vIG1ha2Ugc3VyZSBjb250YWluZXIgYXNzb2MnZCByZWcgcG9pbnRzIHRvIHRoaXMgY3lcblxuXG4gIHJlZy5jeSA9IGN5O1xuICB2YXIgaGVhZCA9IHdpbmRvdyQxICE9PSB1bmRlZmluZWQgJiYgY29udGFpbmVyICE9PSB1bmRlZmluZWQgJiYgIW9wdHMuaGVhZGxlc3M7XG4gIHZhciBvcHRpb25zID0gb3B0cztcbiAgb3B0aW9ucy5sYXlvdXQgPSBleHRlbmQoe1xuICAgIG5hbWU6IGhlYWQgPyAnZ3JpZCcgOiAnbnVsbCdcbiAgfSwgb3B0aW9ucy5sYXlvdXQpO1xuICBvcHRpb25zLnJlbmRlcmVyID0gZXh0ZW5kKHtcbiAgICBuYW1lOiBoZWFkID8gJ2NhbnZhcycgOiAnbnVsbCdcbiAgfSwgb3B0aW9ucy5yZW5kZXJlcik7XG5cbiAgdmFyIGRlZlZhbCA9IGZ1bmN0aW9uIGRlZlZhbChkZWYsIHZhbCwgYWx0VmFsKSB7XG4gICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH0gZWxzZSBpZiAoYWx0VmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBhbHRWYWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBkZWY7XG4gICAgfVxuICB9O1xuXG4gIHZhciBfcCA9IHRoaXMuX3ByaXZhdGUgPSB7XG4gICAgY29udGFpbmVyOiBjb250YWluZXIsXG4gICAgLy8gaHRtbCBkb20gZWxlIGNvbnRhaW5lclxuICAgIHJlYWR5OiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIHJlYWR5IGhhcyBiZWVuIHRyaWdnZXJlZFxuICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgLy8gY2FjaGVkIG9wdGlvbnNcbiAgICBlbGVtZW50czogbmV3IENvbGxlY3Rpb24odGhpcyksXG4gICAgLy8gZWxlbWVudHMgaW4gdGhlIGdyYXBoXG4gICAgbGlzdGVuZXJzOiBbXSxcbiAgICAvLyBsaXN0IG9mIGxpc3RlbmVyc1xuICAgIGFuaUVsZXM6IG5ldyBDb2xsZWN0aW9uKHRoaXMpLFxuICAgIC8vIGVsZW1lbnRzIGJlaW5nIGFuaW1hdGVkXG4gICAgZGF0YTogb3B0aW9ucy5kYXRhIHx8IHt9LFxuICAgIC8vIGRhdGEgZm9yIHRoZSBjb3JlXG4gICAgc2NyYXRjaDoge30sXG4gICAgLy8gc2NyYXRjaCBvYmplY3QgZm9yIGNvcmVcbiAgICBsYXlvdXQ6IG51bGwsXG4gICAgcmVuZGVyZXI6IG51bGwsXG4gICAgZGVzdHJveWVkOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIGRlc3Ryb3kgd2FzIGNhbGxlZFxuICAgIG5vdGlmaWNhdGlvbnNFbmFibGVkOiB0cnVlLFxuICAgIC8vIHdoZXRoZXIgbm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byB0aGUgcmVuZGVyZXJcbiAgICBtaW5ab29tOiAxZS01MCxcbiAgICBtYXhab29tOiAxZTUwLFxuICAgIHpvb21pbmdFbmFibGVkOiBkZWZWYWwodHJ1ZSwgb3B0aW9ucy56b29taW5nRW5hYmxlZCksXG4gICAgdXNlclpvb21pbmdFbmFibGVkOiBkZWZWYWwodHJ1ZSwgb3B0aW9ucy51c2VyWm9vbWluZ0VuYWJsZWQpLFxuICAgIHBhbm5pbmdFbmFibGVkOiBkZWZWYWwodHJ1ZSwgb3B0aW9ucy5wYW5uaW5nRW5hYmxlZCksXG4gICAgdXNlclBhbm5pbmdFbmFibGVkOiBkZWZWYWwodHJ1ZSwgb3B0aW9ucy51c2VyUGFubmluZ0VuYWJsZWQpLFxuICAgIGJveFNlbGVjdGlvbkVuYWJsZWQ6IGRlZlZhbCh0cnVlLCBvcHRpb25zLmJveFNlbGVjdGlvbkVuYWJsZWQpLFxuICAgIGF1dG9sb2NrOiBkZWZWYWwoZmFsc2UsIG9wdGlvbnMuYXV0b2xvY2ssIG9wdGlvbnMuYXV0b2xvY2tOb2RlcyksXG4gICAgYXV0b3VuZ3JhYmlmeTogZGVmVmFsKGZhbHNlLCBvcHRpb25zLmF1dG91bmdyYWJpZnksIG9wdGlvbnMuYXV0b3VuZ3JhYmlmeU5vZGVzKSxcbiAgICBhdXRvdW5zZWxlY3RpZnk6IGRlZlZhbChmYWxzZSwgb3B0aW9ucy5hdXRvdW5zZWxlY3RpZnkpLFxuICAgIHN0eWxlRW5hYmxlZDogb3B0aW9ucy5zdHlsZUVuYWJsZWQgPT09IHVuZGVmaW5lZCA/IGhlYWQgOiBvcHRpb25zLnN0eWxlRW5hYmxlZCxcbiAgICB6b29tOiBudW1iZXIkMShvcHRpb25zLnpvb20pID8gb3B0aW9ucy56b29tIDogMSxcbiAgICBwYW46IHtcbiAgICAgIHg6IHBsYWluT2JqZWN0KG9wdGlvbnMucGFuKSAmJiBudW1iZXIkMShvcHRpb25zLnBhbi54KSA/IG9wdGlvbnMucGFuLnggOiAwLFxuICAgICAgeTogcGxhaW5PYmplY3Qob3B0aW9ucy5wYW4pICYmIG51bWJlciQxKG9wdGlvbnMucGFuLnkpID8gb3B0aW9ucy5wYW4ueSA6IDBcbiAgICB9LFxuICAgIGFuaW1hdGlvbjoge1xuICAgICAgLy8gb2JqZWN0IGZvciBjdXJyZW50bHktcnVubmluZyBhbmltYXRpb25zXG4gICAgICBjdXJyZW50OiBbXSxcbiAgICAgIHF1ZXVlOiBbXVxuICAgIH0sXG4gICAgaGFzQ29tcG91bmROb2RlczogZmFsc2UsXG4gICAgbXVsdGlDbGlja0RlYm91bmNlVGltZTogZGVmVmFsKDI1MCwgb3B0aW9ucy5tdWx0aUNsaWNrRGVib3VuY2VUaW1lKVxuICB9O1xuXG4gIHRoaXMuY3JlYXRlRW1pdHRlcigpOyAvLyBzZXQgc2VsZWN0aW9uIHR5cGVcblxuICB0aGlzLnNlbGVjdGlvblR5cGUob3B0aW9ucy5zZWxlY3Rpb25UeXBlKTsgLy8gaW5pdCB6b29tIGJvdW5kc1xuXG4gIHRoaXMuem9vbVJhbmdlKHtcbiAgICBtaW46IG9wdGlvbnMubWluWm9vbSxcbiAgICBtYXg6IG9wdGlvbnMubWF4Wm9vbVxuICB9KTtcblxuICB2YXIgbG9hZEV4dERhdGEgPSBmdW5jdGlvbiBsb2FkRXh0RGF0YShleHREYXRhLCBuZXh0KSB7XG4gICAgdmFyIGFueUlzUHJvbWlzZSA9IGV4dERhdGEuc29tZShwcm9taXNlKTtcblxuICAgIGlmIChhbnlJc1Byb21pc2UpIHtcbiAgICAgIHJldHVybiBQcm9taXNlJDEuYWxsKGV4dERhdGEpLnRoZW4obmV4dCk7IC8vIGxvYWQgYWxsIGRhdGEgYXN5bmNocm9ub3VzbHksIHRoZW4gZXhlYyByZXN0IG9mIGluaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dChleHREYXRhKTsgLy8gZXhlYyBzeW5jaHJvbm91c2x5IGZvciBjb252ZW5pZW5jZVxuICAgIH1cbiAgfTsgLy8gc3RhcnQgd2l0aCB0aGUgZGVmYXVsdCBzdHlsZXNoZWV0IHNvIHdlIGhhdmUgc29tZXRoaW5nIGJlZm9yZSBsb2FkaW5nIGFuIGV4dGVybmFsIHN0eWxlc2hlZXRcblxuXG4gIGlmIChfcC5zdHlsZUVuYWJsZWQpIHtcbiAgICBjeS5zZXRTdHlsZShbXSk7XG4gIH0gLy8gY3JlYXRlIHRoZSByZW5kZXJlclxuXG5cbiAgdmFyIHJlbmRlcmVyT3B0aW9ucyA9IGV4dGVuZCh7fSwgb3B0aW9ucywgb3B0aW9ucy5yZW5kZXJlcik7IC8vIGFsbG93IHJlbmRlcmluZyBoaW50cyBpbiB0b3AgbGV2ZWwgb3B0aW9uc1xuXG4gIGN5LmluaXRSZW5kZXJlcihyZW5kZXJlck9wdGlvbnMpO1xuXG4gIHZhciBzZXRFbGVzQW5kTGF5b3V0ID0gZnVuY3Rpb24gc2V0RWxlc0FuZExheW91dChlbGVtZW50cywgb25sb2FkLCBvbmRvbmUpIHtcbiAgICBjeS5ub3RpZmljYXRpb25zKGZhbHNlKTsgLy8gcmVtb3ZlIG9sZCBlbGVtZW50c1xuXG4gICAgdmFyIG9sZEVsZXMgPSBjeS5tdXRhYmxlRWxlbWVudHMoKTtcblxuICAgIGlmIChvbGRFbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9sZEVsZXMucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnRzICE9IG51bGwpIHtcbiAgICAgIGlmIChwbGFpbk9iamVjdChlbGVtZW50cykgfHwgYXJyYXkoZWxlbWVudHMpKSB7XG4gICAgICAgIGN5LmFkZChlbGVtZW50cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY3kub25lKCdsYXlvdXRyZWFkeScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBjeS5ub3RpZmljYXRpb25zKHRydWUpO1xuICAgICAgY3kuZW1pdChlKTsgLy8gd2UgbWlzc2VkIHRoaXMgZXZlbnQgYnkgdHVybmluZyBub3RpZmljYXRpb25zIG9mZiwgc28gcGFzcyBpdCBvblxuXG4gICAgICBjeS5vbmUoJ2xvYWQnLCBvbmxvYWQpO1xuICAgICAgY3kuZW1pdEFuZE5vdGlmeSgnbG9hZCcpO1xuICAgIH0pLm9uZSgnbGF5b3V0c3RvcCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGN5Lm9uZSgnZG9uZScsIG9uZG9uZSk7XG4gICAgICBjeS5lbWl0KCdkb25lJyk7XG4gICAgfSk7XG4gICAgdmFyIGxheW91dE9wdHMgPSBleHRlbmQoe30sIGN5Ll9wcml2YXRlLm9wdGlvbnMubGF5b3V0KTtcbiAgICBsYXlvdXRPcHRzLmVsZXMgPSBjeS5lbGVtZW50cygpO1xuICAgIGN5LmxheW91dChsYXlvdXRPcHRzKS5ydW4oKTtcbiAgfTtcblxuICBsb2FkRXh0RGF0YShbb3B0aW9ucy5zdHlsZSwgb3B0aW9ucy5lbGVtZW50c10sIGZ1bmN0aW9uICh0aGVucykge1xuICAgIHZhciBpbml0U3R5bGUgPSB0aGVuc1swXTtcbiAgICB2YXIgaW5pdEVsZXMgPSB0aGVuc1sxXTsgLy8gaW5pdCBzdHlsZVxuXG4gICAgaWYgKF9wLnN0eWxlRW5hYmxlZCkge1xuICAgICAgY3kuc3R5bGUoKS5hcHBlbmQoaW5pdFN0eWxlKTtcbiAgICB9IC8vIGluaXRpYWwgbG9hZFxuXG5cbiAgICBzZXRFbGVzQW5kTGF5b3V0KGluaXRFbGVzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBvbnJlYWR5XG4gICAgICBjeS5zdGFydEFuaW1hdGlvbkxvb3AoKTtcbiAgICAgIF9wLnJlYWR5ID0gdHJ1ZTsgLy8gaWYgYSByZWFkeSBjYWxsYmFjayBpcyBzcGVjaWZpZWQgYXMgYW4gb3B0aW9uLCB0aGUgYmluZCBpdFxuXG4gICAgICBpZiAoZm4kNihvcHRpb25zLnJlYWR5KSkge1xuICAgICAgICBjeS5vbigncmVhZHknLCBvcHRpb25zLnJlYWR5KTtcbiAgICAgIH0gLy8gYmluZCBhbGwgdGhlIHJlYWR5IGhhbmRsZXJzIHJlZ2lzdGVyZWQgYmVmb3JlIGNyZWF0aW5nIHRoaXMgaW5zdGFuY2VcblxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlYWRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGZuID0gcmVhZGllc1tpXTtcbiAgICAgICAgY3kub24oJ3JlYWR5JywgZm4pO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVnKSB7XG4gICAgICAgIHJlZy5yZWFkaWVzID0gW107XG4gICAgICB9IC8vIGNsZWFyIGIvYyB3ZSd2ZSBib3VuZCB0aGVtIGFsbCBhbmQgZG9uJ3Qgd2FudCB0byBrZWVwIGl0IGFyb3VuZCBpbiBjYXNlIGEgbmV3IGNvcmUgdXNlcyB0aGUgc2FtZSBkaXYgZXRjXG5cblxuICAgICAgY3kuZW1pdCgncmVhZHknKTtcbiAgICB9LCBvcHRpb25zLmRvbmUpO1xuICB9KTtcbn07XG5cbnZhciBjb3JlZm4gPSBDb3JlLnByb3RvdHlwZTsgLy8gc2hvcnQgYWxpYXNcblxuZXh0ZW5kKGNvcmVmbiwge1xuICBpbnN0YW5jZVN0cmluZzogZnVuY3Rpb24gaW5zdGFuY2VTdHJpbmcoKSB7XG4gICAgcmV0dXJuICdjb3JlJztcbiAgfSxcbiAgaXNSZWFkeTogZnVuY3Rpb24gaXNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5yZWFkeTtcbiAgfSxcbiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuZGVzdHJveWVkO1xuICB9LFxuICByZWFkeTogZnVuY3Rpb24gcmVhZHkoZm4pIHtcbiAgICBpZiAodGhpcy5pc1JlYWR5KCkpIHtcbiAgICAgIHRoaXMuZW1pdHRlcigpLmVtaXQoJ3JlYWR5JywgW10sIGZuKTsgLy8ganVzdCBjYWxscyBmbiBhcyB0aG91Z2ggdHJpZ2dlcmVkIHZpYSByZWFkeSBldmVudFxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uKCdyZWFkeScsIGZuKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIGlmIChjeS5kZXN0cm95ZWQoKSkgcmV0dXJuO1xuICAgIGN5LnN0b3BBbmltYXRpb25Mb29wKCk7XG4gICAgY3kuZGVzdHJveVJlbmRlcmVyKCk7XG4gICAgdGhpcy5lbWl0KCdkZXN0cm95Jyk7XG4gICAgY3kuX3ByaXZhdGUuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICByZXR1cm4gY3k7XG4gIH0sXG4gIGhhc0VsZW1lbnRXaXRoSWQ6IGZ1bmN0aW9uIGhhc0VsZW1lbnRXaXRoSWQoaWQpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5lbGVtZW50cy5oYXNFbGVtZW50V2l0aElkKGlkKTtcbiAgfSxcbiAgZ2V0RWxlbWVudEJ5SWQ6IGZ1bmN0aW9uIGdldEVsZW1lbnRCeUlkKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuZWxlbWVudHMuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICB9LFxuICBoYXNDb21wb3VuZE5vZGVzOiBmdW5jdGlvbiBoYXNDb21wb3VuZE5vZGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmhhc0NvbXBvdW5kTm9kZXM7XG4gIH0sXG4gIGhlYWRsZXNzOiBmdW5jdGlvbiBoZWFkbGVzcygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5yZW5kZXJlci5pc0hlYWRsZXNzKCk7XG4gIH0sXG4gIHN0eWxlRW5hYmxlZDogZnVuY3Rpb24gc3R5bGVFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnN0eWxlRW5hYmxlZDtcbiAgfSxcbiAgYWRkVG9Qb29sOiBmdW5jdGlvbiBhZGRUb1Bvb2woZWxlcykge1xuICAgIHRoaXMuX3ByaXZhdGUuZWxlbWVudHMubWVyZ2UoZWxlcyk7XG5cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgcmVtb3ZlRnJvbVBvb2w6IGZ1bmN0aW9uIHJlbW92ZUZyb21Qb29sKGVsZXMpIHtcbiAgICB0aGlzLl9wcml2YXRlLmVsZW1lbnRzLnVubWVyZ2UoZWxlcyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY29udGFpbmVyOiBmdW5jdGlvbiBjb250YWluZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuY29udGFpbmVyIHx8IG51bGw7XG4gIH0sXG4gIG1vdW50OiBmdW5jdGlvbiBtb3VudChjb250YWluZXIpIHtcbiAgICBpZiAoY29udGFpbmVyID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIHZhciBfcCA9IGN5Ll9wcml2YXRlO1xuICAgIHZhciBvcHRpb25zID0gX3Aub3B0aW9ucztcblxuICAgIGlmICghaHRtbEVsZW1lbnQoY29udGFpbmVyKSAmJiBodG1sRWxlbWVudChjb250YWluZXJbMF0pKSB7XG4gICAgICBjb250YWluZXIgPSBjb250YWluZXJbMF07XG4gICAgfVxuXG4gICAgY3kuc3RvcEFuaW1hdGlvbkxvb3AoKTtcbiAgICBjeS5kZXN0cm95UmVuZGVyZXIoKTtcbiAgICBfcC5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgX3Auc3R5bGVFbmFibGVkID0gdHJ1ZTtcbiAgICBjeS5pbnZhbGlkYXRlU2l6ZSgpO1xuICAgIGN5LmluaXRSZW5kZXJlcihleHRlbmQoe30sIG9wdGlvbnMsIG9wdGlvbnMucmVuZGVyZXIsIHtcbiAgICAgIC8vIGFsbG93IGN1c3RvbSByZW5kZXJlciBuYW1lIHRvIGJlIHJlLXVzZWQsIG90aGVyd2lzZSB1c2UgY2FudmFzXG4gICAgICBuYW1lOiBvcHRpb25zLnJlbmRlcmVyLm5hbWUgPT09ICdudWxsJyA/ICdjYW52YXMnIDogb3B0aW9ucy5yZW5kZXJlci5uYW1lXG4gICAgfSkpO1xuICAgIGN5LnN0YXJ0QW5pbWF0aW9uTG9vcCgpO1xuICAgIGN5LnN0eWxlKG9wdGlvbnMuc3R5bGUpO1xuICAgIGN5LmVtaXQoJ21vdW50Jyk7XG4gICAgcmV0dXJuIGN5O1xuICB9LFxuICB1bm1vdW50OiBmdW5jdGlvbiB1bm1vdW50KCkge1xuICAgIHZhciBjeSA9IHRoaXM7XG4gICAgY3kuc3RvcEFuaW1hdGlvbkxvb3AoKTtcbiAgICBjeS5kZXN0cm95UmVuZGVyZXIoKTtcbiAgICBjeS5pbml0UmVuZGVyZXIoe1xuICAgICAgbmFtZTogJ251bGwnXG4gICAgfSk7XG4gICAgY3kuZW1pdCgndW5tb3VudCcpO1xuICAgIHJldHVybiBjeTtcbiAgfSxcbiAgb3B0aW9uczogZnVuY3Rpb24gb3B0aW9ucygpIHtcbiAgICByZXR1cm4gY29weSh0aGlzLl9wcml2YXRlLm9wdGlvbnMpO1xuICB9LFxuICBqc29uOiBmdW5jdGlvbiBqc29uKG9iaikge1xuICAgIHZhciBjeSA9IHRoaXM7XG4gICAgdmFyIF9wID0gY3kuX3ByaXZhdGU7XG4gICAgdmFyIGVsZXMgPSBjeS5tdXRhYmxlRWxlbWVudHMoKTtcblxuICAgIHZhciBnZXRGcmVzaFJlZiA9IGZ1bmN0aW9uIGdldEZyZXNoUmVmKGVsZSkge1xuICAgICAgcmV0dXJuIGN5LmdldEVsZW1lbnRCeUlkKGVsZS5pZCgpKTtcbiAgICB9O1xuXG4gICAgaWYgKHBsYWluT2JqZWN0KG9iaikpIHtcbiAgICAgIC8vIHNldFxuICAgICAgY3kuc3RhcnRCYXRjaCgpO1xuXG4gICAgICBpZiAob2JqLmVsZW1lbnRzKSB7XG4gICAgICAgIHZhciBpZEluSnNvbiA9IHt9O1xuXG4gICAgICAgIHZhciB1cGRhdGVFbGVzID0gZnVuY3Rpb24gdXBkYXRlRWxlcyhqc29ucywgZ3IpIHtcbiAgICAgICAgICB2YXIgdG9BZGQgPSBbXTtcbiAgICAgICAgICB2YXIgdG9Nb2QgPSBbXTtcblxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwganNvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBqc29uID0ganNvbnNbaV07XG5cbiAgICAgICAgICAgIGlmICghanNvbi5kYXRhLmlkKSB7XG4gICAgICAgICAgICAgIHdhcm4oJ2N5Lmpzb24oKSBjYW5ub3QgaGFuZGxlIGVsZW1lbnRzIHdpdGhvdXQgYW4gSUQgYXR0cmlidXRlJyk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgaWQgPSAnJyArIGpzb24uZGF0YS5pZDsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcblxuICAgICAgICAgICAgdmFyIGVsZSA9IGN5LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgICAgIGlkSW5Kc29uW2lkXSA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmIChlbGUubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgIC8vIGV4aXN0aW5nIGVsZW1lbnQgc2hvdWxkIGJlIHVwZGF0ZWRcbiAgICAgICAgICAgICAgdG9Nb2QucHVzaCh7XG4gICAgICAgICAgICAgICAgZWxlOiBlbGUsXG4gICAgICAgICAgICAgICAganNvbjoganNvblxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBzaG91bGQgYmUgYWRkZWRcbiAgICAgICAgICAgICAgaWYgKGdyKSB7XG4gICAgICAgICAgICAgICAganNvbi5ncm91cCA9IGdyO1xuICAgICAgICAgICAgICAgIHRvQWRkLnB1c2goanNvbik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9BZGQucHVzaChqc29uKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGN5LmFkZCh0b0FkZCk7XG5cbiAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdG9Nb2QubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgX3RvTW9kJF9pID0gdG9Nb2RbX2ldLFxuICAgICAgICAgICAgICAgIF9lbGUgPSBfdG9Nb2QkX2kuZWxlLFxuICAgICAgICAgICAgICAgIF9qc29uID0gX3RvTW9kJF9pLmpzb247XG5cbiAgICAgICAgICAgIF9lbGUuanNvbihfanNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChhcnJheShvYmouZWxlbWVudHMpKSB7XG4gICAgICAgICAgLy8gZWxlbWVudHM6IFtdXG4gICAgICAgICAgdXBkYXRlRWxlcyhvYmouZWxlbWVudHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGVsZW1lbnRzOiB7IG5vZGVzOiBbXSwgZWRnZXM6IFtdIH1cbiAgICAgICAgICB2YXIgZ3JzID0gWydub2RlcycsICdlZGdlcyddO1xuXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBnciA9IGdyc1tpXTtcbiAgICAgICAgICAgIHZhciBlbGVtZW50cyA9IG9iai5lbGVtZW50c1tncl07XG5cbiAgICAgICAgICAgIGlmIChhcnJheShlbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgdXBkYXRlRWxlcyhlbGVtZW50cywgZ3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwYXJlbnRzVG9SZW1vdmUgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICAgIGVsZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gIWlkSW5Kc29uW2VsZS5pZCgpXTtcbiAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgaWYgKGVsZS5pc1BhcmVudCgpKSB7XG4gICAgICAgICAgICBwYXJlbnRzVG9SZW1vdmUubWVyZ2UoZWxlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlLnJlbW92ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7IC8vIHNvIHRoYXQgY2hpbGRyZW4gYXJlIG5vdCByZW1vdmVkIHcvcGFyZW50XG5cbiAgICAgICAgcGFyZW50c1RvUmVtb3ZlLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgIHJldHVybiBlbGUuY2hpbGRyZW4oKS5tb3ZlKHtcbiAgICAgICAgICAgIHBhcmVudDogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTsgLy8gaW50ZXJtZWRpYXRlIHBhcmVudHMgbWF5IGJlIG1vdmVkIGJ5IHByaW9yIGxpbmUsIHNvIG1ha2Ugc3VyZSB3ZSByZW1vdmUgYnkgZnJlc2ggcmVmc1xuXG4gICAgICAgIHBhcmVudHNUb1JlbW92ZS5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0RnJlc2hSZWYoZWxlKS5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvYmouc3R5bGUpIHtcbiAgICAgICAgY3kuc3R5bGUob2JqLnN0eWxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9iai56b29tICE9IG51bGwgJiYgb2JqLnpvb20gIT09IF9wLnpvb20pIHtcbiAgICAgICAgY3kuem9vbShvYmouem9vbSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvYmoucGFuKSB7XG4gICAgICAgIGlmIChvYmoucGFuLnggIT09IF9wLnBhbi54IHx8IG9iai5wYW4ueSAhPT0gX3AucGFuLnkpIHtcbiAgICAgICAgICBjeS5wYW4ob2JqLnBhbik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG9iai5kYXRhKSB7XG4gICAgICAgIGN5LmRhdGEob2JqLmRhdGEpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZmllbGRzID0gWydtaW5ab29tJywgJ21heFpvb20nLCAnem9vbWluZ0VuYWJsZWQnLCAndXNlclpvb21pbmdFbmFibGVkJywgJ3Bhbm5pbmdFbmFibGVkJywgJ3VzZXJQYW5uaW5nRW5hYmxlZCcsICdib3hTZWxlY3Rpb25FbmFibGVkJywgJ2F1dG9sb2NrJywgJ2F1dG91bmdyYWJpZnknLCAnYXV0b3Vuc2VsZWN0aWZ5JywgJ211bHRpQ2xpY2tEZWJvdW5jZVRpbWUnXTtcblxuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgZmllbGRzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgdmFyIGYgPSBmaWVsZHNbX2kyXTtcblxuICAgICAgICBpZiAob2JqW2ZdICE9IG51bGwpIHtcbiAgICAgICAgICBjeVtmXShvYmpbZl0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGN5LmVuZEJhdGNoKCk7XG4gICAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZ2V0XG4gICAgICB2YXIgZmxhdCA9ICEhb2JqO1xuICAgICAgdmFyIGpzb24gPSB7fTtcblxuICAgICAgaWYgKGZsYXQpIHtcbiAgICAgICAganNvbi5lbGVtZW50cyA9IHRoaXMuZWxlbWVudHMoKS5tYXAoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgIHJldHVybiBlbGUuanNvbigpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGpzb24uZWxlbWVudHMgPSB7fTtcbiAgICAgICAgZWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICB2YXIgZ3JvdXAgPSBlbGUuZ3JvdXAoKTtcblxuICAgICAgICAgIGlmICghanNvbi5lbGVtZW50c1tncm91cF0pIHtcbiAgICAgICAgICAgIGpzb24uZWxlbWVudHNbZ3JvdXBdID0gW107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAganNvbi5lbGVtZW50c1tncm91cF0ucHVzaChlbGUuanNvbigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9wcml2YXRlLnN0eWxlRW5hYmxlZCkge1xuICAgICAgICBqc29uLnN0eWxlID0gY3kuc3R5bGUoKS5qc29uKCk7XG4gICAgICB9XG5cbiAgICAgIGpzb24uZGF0YSA9IGNvcHkoY3kuZGF0YSgpKTtcbiAgICAgIHZhciBvcHRpb25zID0gX3Aub3B0aW9ucztcbiAgICAgIGpzb24uem9vbWluZ0VuYWJsZWQgPSBfcC56b29taW5nRW5hYmxlZDtcbiAgICAgIGpzb24udXNlclpvb21pbmdFbmFibGVkID0gX3AudXNlclpvb21pbmdFbmFibGVkO1xuICAgICAganNvbi56b29tID0gX3Auem9vbTtcbiAgICAgIGpzb24ubWluWm9vbSA9IF9wLm1pblpvb207XG4gICAgICBqc29uLm1heFpvb20gPSBfcC5tYXhab29tO1xuICAgICAganNvbi5wYW5uaW5nRW5hYmxlZCA9IF9wLnBhbm5pbmdFbmFibGVkO1xuICAgICAganNvbi51c2VyUGFubmluZ0VuYWJsZWQgPSBfcC51c2VyUGFubmluZ0VuYWJsZWQ7XG4gICAgICBqc29uLnBhbiA9IGNvcHkoX3AucGFuKTtcbiAgICAgIGpzb24uYm94U2VsZWN0aW9uRW5hYmxlZCA9IF9wLmJveFNlbGVjdGlvbkVuYWJsZWQ7XG4gICAgICBqc29uLnJlbmRlcmVyID0gY29weShvcHRpb25zLnJlbmRlcmVyKTtcbiAgICAgIGpzb24uaGlkZUVkZ2VzT25WaWV3cG9ydCA9IG9wdGlvbnMuaGlkZUVkZ2VzT25WaWV3cG9ydDtcbiAgICAgIGpzb24udGV4dHVyZU9uVmlld3BvcnQgPSBvcHRpb25zLnRleHR1cmVPblZpZXdwb3J0O1xuICAgICAganNvbi53aGVlbFNlbnNpdGl2aXR5ID0gb3B0aW9ucy53aGVlbFNlbnNpdGl2aXR5O1xuICAgICAganNvbi5tb3Rpb25CbHVyID0gb3B0aW9ucy5tb3Rpb25CbHVyO1xuICAgICAganNvbi5tdWx0aUNsaWNrRGVib3VuY2VUaW1lID0gb3B0aW9ucy5tdWx0aUNsaWNrRGVib3VuY2VUaW1lO1xuICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxuICB9XG59KTtcbmNvcmVmbi4kaWQgPSBjb3JlZm4uZ2V0RWxlbWVudEJ5SWQ7XG5bY29yZWZuJDksIGNvcmVmbiQ4LCBlbGVzZm4sIGNvcmVmbiQ3LCBjb3JlZm4kNiwgY29yZWZuJDUsIGNvcmVmbiQ0LCBjb3JlZm4kMywgY29yZWZuJDIsIGNvcmVmbiQxLCBmbl0uZm9yRWFjaChmdW5jdGlvbiAocHJvcHMpIHtcbiAgZXh0ZW5kKGNvcmVmbiwgcHJvcHMpO1xufSk7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG5cbnZhciBkZWZhdWx0cyQ3ID0ge1xuICBmaXQ6IHRydWUsXG4gIC8vIHdoZXRoZXIgdG8gZml0IHRoZSB2aWV3cG9ydCB0byB0aGUgZ3JhcGhcbiAgZGlyZWN0ZWQ6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRoZSB0cmVlIGlzIGRpcmVjdGVkIGRvd253YXJkcyAob3IgZWRnZXMgY2FuIHBvaW50IGluIGFueSBkaXJlY3Rpb24gaWYgZmFsc2UpXG4gIHBhZGRpbmc6IDMwLFxuICAvLyBwYWRkaW5nIG9uIGZpdFxuICBjaXJjbGU6IGZhbHNlLFxuICAvLyBwdXQgZGVwdGhzIGluIGNvbmNlbnRyaWMgY2lyY2xlcyBpZiB0cnVlLCBwdXQgZGVwdGhzIHRvcCBkb3duIGlmIGZhbHNlXG4gIGdyaWQ6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIGNyZWF0ZSBhbiBldmVuIGdyaWQgaW50byB3aGljaCB0aGUgREFHIGlzIHBsYWNlZCAoY2lyY2xlOmZhbHNlIG9ubHkpXG4gIHNwYWNpbmdGYWN0b3I6IDEuNzUsXG4gIC8vIHBvc2l0aXZlIHNwYWNpbmcgZmFjdG9yLCBsYXJnZXIgPT4gbW9yZSBzcGFjZSBiZXR3ZWVuIG5vZGVzIChOLkIuIG4vYSBpZiBjYXVzZXMgb3ZlcmxhcClcbiAgYm91bmRpbmdCb3g6IHVuZGVmaW5lZCxcbiAgLy8gY29uc3RyYWluIGxheW91dCBib3VuZHM7IHsgeDEsIHkxLCB4MiwgeTIgfSBvciB7IHgxLCB5MSwgdywgaCB9XG4gIGF2b2lkT3ZlcmxhcDogdHJ1ZSxcbiAgLy8gcHJldmVudHMgbm9kZSBvdmVybGFwLCBtYXkgb3ZlcmZsb3cgYm91bmRpbmdCb3ggaWYgbm90IGVub3VnaCBzcGFjZVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBFeGNsdWRlcyB0aGUgbGFiZWwgd2hlbiBjYWxjdWxhdGluZyBub2RlIGJvdW5kaW5nIGJveGVzIGZvciB0aGUgbGF5b3V0IGFsZ29yaXRobVxuICByb290czogdW5kZWZpbmVkLFxuICAvLyB0aGUgcm9vdHMgb2YgdGhlIHRyZWVzXG4gIGRlcHRoU29ydDogdW5kZWZpbmVkLFxuICAvLyBhIHNvcnRpbmcgZnVuY3Rpb24gdG8gb3JkZXIgbm9kZXMgYXQgZXF1YWwgZGVwdGguIGUuZy4gZnVuY3Rpb24oYSwgYil7IHJldHVybiBhLmRhdGEoJ3dlaWdodCcpIC0gYi5kYXRhKCd3ZWlnaHQnKSB9XG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWQsXG4gIGFuaW1hdGVGaWx0ZXI6IGZ1bmN0aW9uIGFuaW1hdGVGaWx0ZXIobm9kZSwgaSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvLyBhIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBub2RlIHNob3VsZCBiZSBhbmltYXRlZC4gIEFsbCBub2RlcyBhbmltYXRlZCBieSBkZWZhdWx0IG9uIGFuaW1hdGUgZW5hYmxlZC4gIE5vbi1hbmltYXRlZCBub2RlcyBhcmUgcG9zaXRpb25lZCBpbW1lZGlhdGVseSB3aGVuIHRoZSBsYXlvdXQgc3RhcnRzXG4gIHJlYWR5OiB1bmRlZmluZWQsXG4gIC8vIGNhbGxiYWNrIG9uIGxheW91dHJlYWR5XG4gIHN0b3A6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0c3RvcFxuICB0cmFuc2Zvcm06IGZ1bmN0aW9uIHRyYW5zZm9ybShub2RlLCBwb3NpdGlvbikge1xuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfSAvLyB0cmFuc2Zvcm0gYSBnaXZlbiBub2RlIHBvc2l0aW9uLiBVc2VmdWwgZm9yIGNoYW5naW5nIGZsb3cgZGlyZWN0aW9uIGluIGRpc2NyZXRlIGxheW91dHNcblxufTtcbnZhciBkZXByZWNhdGVkT3B0aW9uRGVmYXVsdHMgPSB7XG4gIG1heGltYWw6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHNoaWZ0IG5vZGVzIGRvd24gdGhlaXIgbmF0dXJhbCBCRlMgZGVwdGhzIGluIG9yZGVyIHRvIGF2b2lkIHVwd2FyZHMgZWRnZXMgKERBR1Mgb25seSk7IHNldHRpbmcgYWN5Y2xpYyB0byB0cnVlIHNldHMgbWF4aW1hbCB0byB0cnVlIGFsc29cbiAgYWN5Y2xpYzogZmFsc2UgLy8gd2hldGhlciB0aGUgdHJlZSBpcyBhY3ljbGljIGFuZCB0aHVzIGEgbm9kZSBjb3VsZCBiZSBzaGlmdGVkIChkdWUgdG8gdGhlIG1heGltYWwgb3B0aW9uKSBtdWx0aXBsZSB0aW1lcyB3aXRob3V0IGNhdXNpbmcgYW4gaW5maW5pdGUgbG9vcDsgc2V0dGluZyB0byB0cnVlIHNldHMgbWF4aW1hbCB0byB0cnVlIGFsc287IGlmIHlvdSBhcmUgdW5jZXJ0YWluIHdoZXRoZXIgYSB0cmVlIGlzIGFjeWNsaWMsIHNldCB0byBmYWxzZSB0byBhdm9pZCBwb3RlbnRpYWwgaW5maW5pdGUgbG9vcHNcblxufTtcbi8qIGVzbGludC1lbmFibGUgKi9cblxudmFyIGdldEluZm8gPSBmdW5jdGlvbiBnZXRJbmZvKGVsZSkge1xuICByZXR1cm4gZWxlLnNjcmF0Y2goJ2JyZWFkdGhmaXJzdCcpO1xufTtcblxudmFyIHNldEluZm8gPSBmdW5jdGlvbiBzZXRJbmZvKGVsZSwgb2JqKSB7XG4gIHJldHVybiBlbGUuc2NyYXRjaCgnYnJlYWR0aGZpcnN0Jywgb2JqKTtcbn07XG5cbmZ1bmN0aW9uIEJyZWFkdGhGaXJzdExheW91dChvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMkNywgZGVwcmVjYXRlZE9wdGlvbkRlZmF1bHRzLCBvcHRpb25zKTtcbn1cblxuQnJlYWR0aEZpcnN0TGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBwYXJhbXMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBvcHRpb25zID0gcGFyYW1zO1xuICB2YXIgY3kgPSBwYXJhbXMuY3k7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCkuZmlsdGVyKGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuICFuLmlzUGFyZW50KCk7XG4gIH0pO1xuICB2YXIgZ3JhcGggPSBlbGVzO1xuICB2YXIgZGlyZWN0ZWQgPSBvcHRpb25zLmRpcmVjdGVkO1xuICB2YXIgbWF4aW1hbCA9IG9wdGlvbnMuYWN5Y2xpYyB8fCBvcHRpb25zLm1heGltYWwgfHwgb3B0aW9ucy5tYXhpbWFsQWRqdXN0bWVudHMgPiAwOyAvLyBtYXhpbWFsQWRqdXN0bWVudHMgZm9yIGNvbXBhdC4gdy8gb2xkIGNvZGU7IGFsc28sIHNldHRpbmcgYWN5Y2xpYyB0byB0cnVlIHNldHMgbWF4aW1hbCB0byB0cnVlXG5cbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KG9wdGlvbnMuYm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDoge1xuICAgIHgxOiAwLFxuICAgIHkxOiAwLFxuICAgIHc6IGN5LndpZHRoKCksXG4gICAgaDogY3kuaGVpZ2h0KClcbiAgfSk7XG4gIHZhciByb290cztcblxuICBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihvcHRpb25zLnJvb3RzKSkge1xuICAgIHJvb3RzID0gb3B0aW9ucy5yb290cztcbiAgfSBlbHNlIGlmIChhcnJheShvcHRpb25zLnJvb3RzKSkge1xuICAgIHZhciByb290c0FycmF5ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbnMucm9vdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpZCA9IG9wdGlvbnMucm9vdHNbaV07XG4gICAgICB2YXIgZWxlID0gY3kuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgcm9vdHNBcnJheS5wdXNoKGVsZSk7XG4gICAgfVxuXG4gICAgcm9vdHMgPSBjeS5jb2xsZWN0aW9uKHJvb3RzQXJyYXkpO1xuICB9IGVsc2UgaWYgKHN0cmluZyhvcHRpb25zLnJvb3RzKSkge1xuICAgIHJvb3RzID0gY3kuJChvcHRpb25zLnJvb3RzKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoZGlyZWN0ZWQpIHtcbiAgICAgIHJvb3RzID0gbm9kZXMucm9vdHMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGNvbXBvbmVudHMgPSBlbGVzLmNvbXBvbmVudHMoKTtcbiAgICAgIHJvb3RzID0gY3kuY29sbGVjdGlvbigpO1xuXG4gICAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChfaSkge1xuICAgICAgICB2YXIgY29tcCA9IGNvbXBvbmVudHNbX2ldO1xuICAgICAgICB2YXIgbWF4RGVncmVlID0gY29tcC5tYXhEZWdyZWUoZmFsc2UpO1xuICAgICAgICB2YXIgY29tcFJvb3RzID0gY29tcC5maWx0ZXIoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgIHJldHVybiBlbGUuZGVncmVlKGZhbHNlKSA9PT0gbWF4RGVncmVlO1xuICAgICAgICB9KTtcbiAgICAgICAgcm9vdHMgPSByb290cy5hZGQoY29tcFJvb3RzKTtcbiAgICAgIH07XG5cbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBjb21wb25lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBfbG9vcChfaSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGRlcHRocyA9IFtdO1xuICB2YXIgZm91bmRCeUJmcyA9IHt9O1xuXG4gIHZhciBhZGRUb0RlcHRoID0gZnVuY3Rpb24gYWRkVG9EZXB0aChlbGUsIGQpIHtcbiAgICBpZiAoZGVwdGhzW2RdID09IG51bGwpIHtcbiAgICAgIGRlcHRoc1tkXSA9IFtdO1xuICAgIH1cblxuICAgIHZhciBpID0gZGVwdGhzW2RdLmxlbmd0aDtcbiAgICBkZXB0aHNbZF0ucHVzaChlbGUpO1xuICAgIHNldEluZm8oZWxlLCB7XG4gICAgICBpbmRleDogaSxcbiAgICAgIGRlcHRoOiBkXG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGNoYW5nZURlcHRoID0gZnVuY3Rpb24gY2hhbmdlRGVwdGgoZWxlLCBuZXdEZXB0aCkge1xuICAgIHZhciBfZ2V0SW5mbyA9IGdldEluZm8oZWxlKSxcbiAgICAgICAgZGVwdGggPSBfZ2V0SW5mby5kZXB0aCxcbiAgICAgICAgaW5kZXggPSBfZ2V0SW5mby5pbmRleDtcblxuICAgIGRlcHRoc1tkZXB0aF1baW5kZXhdID0gbnVsbDtcbiAgICBhZGRUb0RlcHRoKGVsZSwgbmV3RGVwdGgpO1xuICB9OyAvLyBmaW5kIHRoZSBkZXB0aHMgb2YgdGhlIG5vZGVzXG5cblxuICBncmFwaC5iZnMoe1xuICAgIHJvb3RzOiByb290cyxcbiAgICBkaXJlY3RlZDogb3B0aW9ucy5kaXJlY3RlZCxcbiAgICB2aXNpdDogZnVuY3Rpb24gdmlzaXQobm9kZSwgZWRnZSwgcE5vZGUsIGksIGRlcHRoKSB7XG4gICAgICB2YXIgZWxlID0gbm9kZVswXTtcbiAgICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuICAgICAgYWRkVG9EZXB0aChlbGUsIGRlcHRoKTtcbiAgICAgIGZvdW5kQnlCZnNbaWRdID0gdHJ1ZTtcbiAgICB9XG4gIH0pOyAvLyBjaGVjayBmb3Igbm9kZXMgbm90IGZvdW5kIGJ5IGJmc1xuXG4gIHZhciBvcnBoYW5Ob2RlcyA9IFtdO1xuXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG5vZGVzLmxlbmd0aDsgX2kyKyspIHtcbiAgICB2YXIgX2VsZSA9IG5vZGVzW19pMl07XG5cbiAgICBpZiAoZm91bmRCeUJmc1tfZWxlLmlkKCldKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3JwaGFuTm9kZXMucHVzaChfZWxlKTtcbiAgICB9XG4gIH0gLy8gYXNzaWduIHRoZSBub2RlcyBhIGRlcHRoIGFuZCBpbmRleFxuXG5cbiAgdmFyIGFzc2lnbkRlcHRoc0F0ID0gZnVuY3Rpb24gYXNzaWduRGVwdGhzQXQoaSkge1xuICAgIHZhciBlbGVzID0gZGVwdGhzW2ldO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBlbGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgX2VsZTIgPSBlbGVzW2pdO1xuXG4gICAgICBpZiAoX2VsZTIgPT0gbnVsbCkge1xuICAgICAgICBlbGVzLnNwbGljZShqLCAxKTtcbiAgICAgICAgai0tO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgc2V0SW5mbyhfZWxlMiwge1xuICAgICAgICBkZXB0aDogaSxcbiAgICAgICAgaW5kZXg6IGpcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB2YXIgYXNzaWduRGVwdGhzID0gZnVuY3Rpb24gYXNzaWduRGVwdGhzKCkge1xuICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGRlcHRocy5sZW5ndGg7IF9pMysrKSB7XG4gICAgICBhc3NpZ25EZXB0aHNBdChfaTMpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgYWRqdXN0TWF4aW1hbGx5ID0gZnVuY3Rpb24gYWRqdXN0TWF4aW1hbGx5KGVsZSwgc2hpZnRlZCkge1xuICAgIHZhciBlSW5mbyA9IGdldEluZm8oZWxlKTtcbiAgICB2YXIgaW5jb21lcnMgPSBlbGUuaW5jb21lcnMoKS5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7XG4gICAgICByZXR1cm4gZWwuaXNOb2RlKCkgJiYgZWxlcy5oYXMoZWwpO1xuICAgIH0pO1xuICAgIHZhciBtYXhEZXB0aCA9IC0xO1xuICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBpbmNvbWVycy5sZW5ndGg7IGsrKykge1xuICAgICAgdmFyIGluY21yID0gaW5jb21lcnNba107XG4gICAgICB2YXIgaUluZm8gPSBnZXRJbmZvKGluY21yKTtcbiAgICAgIG1heERlcHRoID0gTWF0aC5tYXgobWF4RGVwdGgsIGlJbmZvLmRlcHRoKTtcbiAgICB9XG5cbiAgICBpZiAoZUluZm8uZGVwdGggPD0gbWF4RGVwdGgpIHtcbiAgICAgIGlmICghb3B0aW9ucy5hY3ljbGljICYmIHNoaWZ0ZWRbaWRdKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3RGVwdGggPSBtYXhEZXB0aCArIDE7XG4gICAgICBjaGFuZ2VEZXB0aChlbGUsIG5ld0RlcHRoKTtcbiAgICAgIHNoaWZ0ZWRbaWRdID0gbmV3RGVwdGg7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07IC8vIGZvciB0aGUgZGlyZWN0ZWQgY2FzZSwgdHJ5IHRvIG1ha2UgdGhlIGVkZ2VzIGFsbCBnbyBkb3duIChpLmUuIGRlcHRoIGkgPT4gZGVwdGggaSArIDEpXG5cblxuICBpZiAoZGlyZWN0ZWQgJiYgbWF4aW1hbCkge1xuICAgIHZhciBRID0gW107XG4gICAgdmFyIHNoaWZ0ZWQgPSB7fTtcblxuICAgIHZhciBlbnF1ZXVlID0gZnVuY3Rpb24gZW5xdWV1ZShuKSB7XG4gICAgICByZXR1cm4gUS5wdXNoKG4pO1xuICAgIH07XG5cbiAgICB2YXIgZGVxdWV1ZSA9IGZ1bmN0aW9uIGRlcXVldWUoKSB7XG4gICAgICByZXR1cm4gUS5zaGlmdCgpO1xuICAgIH07XG5cbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICByZXR1cm4gUS5wdXNoKG4pO1xuICAgIH0pO1xuXG4gICAgd2hpbGUgKFEubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIF9lbGUzID0gZGVxdWV1ZSgpO1xuXG4gICAgICB2YXIgZGlkU2hpZnQgPSBhZGp1c3RNYXhpbWFsbHkoX2VsZTMsIHNoaWZ0ZWQpO1xuXG4gICAgICBpZiAoZGlkU2hpZnQpIHtcbiAgICAgICAgX2VsZTMub3V0Z29lcnMoKS5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgcmV0dXJuIGVsLmlzTm9kZSgpICYmIGVsZXMuaGFzKGVsKTtcbiAgICAgICAgfSkuZm9yRWFjaChlbnF1ZXVlKTtcbiAgICAgIH0gZWxzZSBpZiAoZGlkU2hpZnQgPT09IG51bGwpIHtcbiAgICAgICAgd2FybignRGV0ZWN0ZWQgZG91YmxlIG1heGltYWwgc2hpZnQgZm9yIG5vZGUgYCcgKyBfZWxlMy5pZCgpICsgJ2AuICBCYWlsaW5nIG1heGltYWwgYWRqdXN0bWVudCBkdWUgdG8gY3ljbGUuICBVc2UgYG9wdGlvbnMubWF4aW1hbDogdHJ1ZWAgb25seSBvbiBEQUdzLicpO1xuICAgICAgICBicmVhazsgLy8gZXhpdCBvbiBmYWlsdXJlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXNzaWduRGVwdGhzKCk7IC8vIGNsZWFyIGhvbGVzXG4gIC8vIGZpbmQgbWluIGRpc3RhbmNlIHdlIG5lZWQgdG8gbGVhdmUgYmV0d2VlbiBub2Rlc1xuXG4gIHZhciBtaW5EaXN0YW5jZSA9IDA7XG5cbiAgaWYgKG9wdGlvbnMuYXZvaWRPdmVybGFwKSB7XG4gICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgbm9kZXMubGVuZ3RoOyBfaTQrKykge1xuICAgICAgdmFyIG4gPSBub2Rlc1tfaTRdO1xuICAgICAgdmFyIG5iYiA9IG4ubGF5b3V0RGltZW5zaW9ucyhvcHRpb25zKTtcbiAgICAgIHZhciB3ID0gbmJiLnc7XG4gICAgICB2YXIgaCA9IG5iYi5oO1xuICAgICAgbWluRGlzdGFuY2UgPSBNYXRoLm1heChtaW5EaXN0YW5jZSwgdywgaCk7XG4gICAgfVxuICB9IC8vIGdldCB0aGUgd2VpZ2h0ZWQgcGVyY2VudCBmb3IgYW4gZWxlbWVudCBiYXNlZCBvbiBpdHMgY29ubmVjdGl2aXR5IHRvIG90aGVyIGxldmVsc1xuXG5cbiAgdmFyIGNhY2hlZFdlaWdodGVkUGVyY2VudCA9IHt9O1xuXG4gIHZhciBnZXRXZWlnaHRlZFBlcmNlbnQgPSBmdW5jdGlvbiBnZXRXZWlnaHRlZFBlcmNlbnQoZWxlKSB7XG4gICAgaWYgKGNhY2hlZFdlaWdodGVkUGVyY2VudFtlbGUuaWQoKV0pIHtcbiAgICAgIHJldHVybiBjYWNoZWRXZWlnaHRlZFBlcmNlbnRbZWxlLmlkKCldO1xuICAgIH1cblxuICAgIHZhciBlbGVEZXB0aCA9IGdldEluZm8oZWxlKS5kZXB0aDtcbiAgICB2YXIgbmVpZ2hib3JzID0gZWxlLm5laWdoYm9yaG9vZCgpO1xuICAgIHZhciBwZXJjZW50ID0gMDtcbiAgICB2YXIgc2FtcGxlcyA9IDA7XG5cbiAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBuZWlnaGJvcnMubGVuZ3RoOyBfaTUrKykge1xuICAgICAgdmFyIG5laWdoYm9yID0gbmVpZ2hib3JzW19pNV07XG5cbiAgICAgIGlmIChuZWlnaGJvci5pc0VkZ2UoKSB8fCBuZWlnaGJvci5pc1BhcmVudCgpIHx8ICFub2Rlcy5oYXMobmVpZ2hib3IpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgYmYgPSBnZXRJbmZvKG5laWdoYm9yKTtcblxuICAgICAgaWYgKGJmID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBpbmRleCA9IGJmLmluZGV4O1xuICAgICAgdmFyIGRlcHRoID0gYmYuZGVwdGg7IC8vIHVuYXNzaWduZWQgbmVpZ2hib3VycyBzaG91bGRuJ3QgYWZmZWN0IHRoZSBvcmRlcmluZ1xuXG4gICAgICBpZiAoaW5kZXggPT0gbnVsbCB8fCBkZXB0aCA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbkRlcHRoID0gZGVwdGhzW2RlcHRoXS5sZW5ndGg7XG5cbiAgICAgIGlmIChkZXB0aCA8IGVsZURlcHRoKSB7XG4gICAgICAgIC8vIG9ubHkgZ2V0IGluZmx1ZW5jZWQgYnkgZWxlbWVudHMgYWJvdmVcbiAgICAgICAgcGVyY2VudCArPSBpbmRleCAvIG5EZXB0aDtcbiAgICAgICAgc2FtcGxlcysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNhbXBsZXMgPSBNYXRoLm1heCgxLCBzYW1wbGVzKTtcbiAgICBwZXJjZW50ID0gcGVyY2VudCAvIHNhbXBsZXM7XG5cbiAgICBpZiAoc2FtcGxlcyA9PT0gMCkge1xuICAgICAgLy8gcHV0IGxvbmUgbm9kZXMgYXQgdGhlIHN0YXJ0XG4gICAgICBwZXJjZW50ID0gMDtcbiAgICB9XG5cbiAgICBjYWNoZWRXZWlnaHRlZFBlcmNlbnRbZWxlLmlkKCldID0gcGVyY2VudDtcbiAgICByZXR1cm4gcGVyY2VudDtcbiAgfTsgLy8gcmVhcnJhbmdlIHRoZSBpbmRpY2VzIGluIGVhY2ggZGVwdGggbGV2ZWwgYmFzZWQgb24gY29ubmVjdGl2aXR5XG5cblxuICB2YXIgc29ydEZuID0gZnVuY3Rpb24gc29ydEZuKGEsIGIpIHtcbiAgICB2YXIgYXBjdCA9IGdldFdlaWdodGVkUGVyY2VudChhKTtcbiAgICB2YXIgYnBjdCA9IGdldFdlaWdodGVkUGVyY2VudChiKTtcbiAgICB2YXIgZGlmZiA9IGFwY3QgLSBicGN0O1xuXG4gICAgaWYgKGRpZmYgPT09IDApIHtcbiAgICAgIHJldHVybiBhc2NlbmRpbmcoYS5pZCgpLCBiLmlkKCkpOyAvLyBtYWtlIHN1cmUgc29ydCBkb2Vzbid0IGhhdmUgZG9uJ3QtY2FyZSBjb21wYXJpc29uc1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGlmZjtcbiAgICB9XG4gIH07XG5cbiAgaWYgKG9wdGlvbnMuZGVwdGhTb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBzb3J0Rm4gPSBvcHRpb25zLmRlcHRoU29ydDtcbiAgfSAvLyBzb3J0IGVhY2ggbGV2ZWwgdG8gbWFrZSBjb25uZWN0ZWQgbm9kZXMgY2xvc2VyXG5cblxuICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBkZXB0aHMubGVuZ3RoOyBfaTYrKykge1xuICAgIGRlcHRoc1tfaTZdLnNvcnQoc29ydEZuKTtcblxuICAgIGFzc2lnbkRlcHRoc0F0KF9pNik7XG4gIH0gLy8gYXNzaWduIG9ycGhhbiBub2RlcyB0byBhIG5ldyB0b3AtbGV2ZWwgZGVwdGhcblxuXG4gIHZhciBvcnBoYW5EZXB0aCA9IFtdO1xuXG4gIGZvciAodmFyIF9pNyA9IDA7IF9pNyA8IG9ycGhhbk5vZGVzLmxlbmd0aDsgX2k3KyspIHtcbiAgICBvcnBoYW5EZXB0aC5wdXNoKG9ycGhhbk5vZGVzW19pN10pO1xuICB9XG5cbiAgZGVwdGhzLnVuc2hpZnQob3JwaGFuRGVwdGgpO1xuICBhc3NpZ25EZXB0aHMoKTtcbiAgdmFyIGJpZ2dlc3REZXB0aFNpemUgPSAwO1xuXG4gIGZvciAodmFyIF9pOCA9IDA7IF9pOCA8IGRlcHRocy5sZW5ndGg7IF9pOCsrKSB7XG4gICAgYmlnZ2VzdERlcHRoU2l6ZSA9IE1hdGgubWF4KGRlcHRoc1tfaThdLmxlbmd0aCwgYmlnZ2VzdERlcHRoU2l6ZSk7XG4gIH1cblxuICB2YXIgY2VudGVyID0ge1xuICAgIHg6IGJiLngxICsgYmIudyAvIDIsXG4gICAgeTogYmIueDEgKyBiYi5oIC8gMlxuICB9O1xuICB2YXIgbWF4RGVwdGhTaXplID0gZGVwdGhzLnJlZHVjZShmdW5jdGlvbiAobWF4LCBlbGVzKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KG1heCwgZWxlcy5sZW5ndGgpO1xuICB9LCAwKTtcblxuICB2YXIgZ2V0UG9zaXRpb24gPSBmdW5jdGlvbiBnZXRQb3NpdGlvbihlbGUpIHtcbiAgICB2YXIgX2dldEluZm8yID0gZ2V0SW5mbyhlbGUpLFxuICAgICAgICBkZXB0aCA9IF9nZXRJbmZvMi5kZXB0aCxcbiAgICAgICAgaW5kZXggPSBfZ2V0SW5mbzIuaW5kZXg7XG5cbiAgICB2YXIgZGVwdGhTaXplID0gZGVwdGhzW2RlcHRoXS5sZW5ndGg7XG4gICAgdmFyIGRpc3RhbmNlWCA9IE1hdGgubWF4KGJiLncgLyAoKG9wdGlvbnMuZ3JpZCA/IG1heERlcHRoU2l6ZSA6IGRlcHRoU2l6ZSkgKyAxKSwgbWluRGlzdGFuY2UpO1xuICAgIHZhciBkaXN0YW5jZVkgPSBNYXRoLm1heChiYi5oIC8gKGRlcHRocy5sZW5ndGggKyAxKSwgbWluRGlzdGFuY2UpO1xuICAgIHZhciByYWRpdXNTdGVwU2l6ZSA9IE1hdGgubWluKGJiLncgLyAyIC8gZGVwdGhzLmxlbmd0aCwgYmIuaCAvIDIgLyBkZXB0aHMubGVuZ3RoKTtcbiAgICByYWRpdXNTdGVwU2l6ZSA9IE1hdGgubWF4KHJhZGl1c1N0ZXBTaXplLCBtaW5EaXN0YW5jZSk7XG5cbiAgICBpZiAoIW9wdGlvbnMuY2lyY2xlKSB7XG4gICAgICB2YXIgZXBvcyA9IHtcbiAgICAgICAgeDogY2VudGVyLnggKyAoaW5kZXggKyAxIC0gKGRlcHRoU2l6ZSArIDEpIC8gMikgKiBkaXN0YW5jZVgsXG4gICAgICAgIHk6IChkZXB0aCArIDEpICogZGlzdGFuY2VZXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGVwb3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByYWRpdXMgPSByYWRpdXNTdGVwU2l6ZSAqIGRlcHRoICsgcmFkaXVzU3RlcFNpemUgLSAoZGVwdGhzLmxlbmd0aCA+IDAgJiYgZGVwdGhzWzBdLmxlbmd0aCA8PSAzID8gcmFkaXVzU3RlcFNpemUgLyAyIDogMCk7XG4gICAgICB2YXIgdGhldGEgPSAyICogTWF0aC5QSSAvIGRlcHRoc1tkZXB0aF0ubGVuZ3RoICogaW5kZXg7XG5cbiAgICAgIGlmIChkZXB0aCA9PT0gMCAmJiBkZXB0aHNbMF0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJhZGl1cyA9IDE7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IGNlbnRlci54ICsgcmFkaXVzICogTWF0aC5jb3ModGhldGEpLFxuICAgICAgICB5OiBjZW50ZXIueSArIHJhZGl1cyAqIE1hdGguc2luKHRoZXRhKVxuICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgZWxlcy5ub2RlcygpLmxheW91dFBvc2l0aW9ucyh0aGlzLCBvcHRpb25zLCBnZXRQb3NpdGlvbik7XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxudmFyIGRlZmF1bHRzJDYgPSB7XG4gIGZpdDogdHJ1ZSxcbiAgLy8gd2hldGhlciB0byBmaXQgdGhlIHZpZXdwb3J0IHRvIHRoZSBncmFwaFxuICBwYWRkaW5nOiAzMCxcbiAgLy8gdGhlIHBhZGRpbmcgb24gZml0XG4gIGJvdW5kaW5nQm94OiB1bmRlZmluZWQsXG4gIC8vIGNvbnN0cmFpbiBsYXlvdXQgYm91bmRzOyB7IHgxLCB5MSwgeDIsIHkyIH0gb3IgeyB4MSwgeTEsIHcsIGggfVxuICBhdm9pZE92ZXJsYXA6IHRydWUsXG4gIC8vIHByZXZlbnRzIG5vZGUgb3ZlcmxhcCwgbWF5IG92ZXJmbG93IGJvdW5kaW5nQm94IGFuZCByYWRpdXMgaWYgbm90IGVub3VnaCBzcGFjZVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBFeGNsdWRlcyB0aGUgbGFiZWwgd2hlbiBjYWxjdWxhdGluZyBub2RlIGJvdW5kaW5nIGJveGVzIGZvciB0aGUgbGF5b3V0IGFsZ29yaXRobVxuICBzcGFjaW5nRmFjdG9yOiB1bmRlZmluZWQsXG4gIC8vIEFwcGxpZXMgYSBtdWx0aXBsaWNhdGl2ZSBmYWN0b3IgKD4wKSB0byBleHBhbmQgb3IgY29tcHJlc3MgdGhlIG92ZXJhbGwgYXJlYSB0aGF0IHRoZSBub2RlcyB0YWtlIHVwXG4gIHJhZGl1czogdW5kZWZpbmVkLFxuICAvLyB0aGUgcmFkaXVzIG9mIHRoZSBjaXJjbGVcbiAgc3RhcnRBbmdsZTogMyAvIDIgKiBNYXRoLlBJLFxuICAvLyB3aGVyZSBub2RlcyBzdGFydCBpbiByYWRpYW5zXG4gIHN3ZWVwOiB1bmRlZmluZWQsXG4gIC8vIGhvdyBtYW55IHJhZGlhbnMgc2hvdWxkIGJlIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBsYXN0IG5vZGUgKGRlZmF1bHRzIHRvIGZ1bGwgY2lyY2xlKVxuICBjbG9ja3dpc2U6IHRydWUsXG4gIC8vIHdoZXRoZXIgdGhlIGxheW91dCBzaG91bGQgZ28gY2xvY2t3aXNlICh0cnVlKSBvciBjb3VudGVyY2xvY2t3aXNlL2FudGljbG9ja3dpc2UgKGZhbHNlKVxuICBzb3J0OiB1bmRlZmluZWQsXG4gIC8vIGEgc29ydGluZyBmdW5jdGlvbiB0byBvcmRlciB0aGUgbm9kZXM7IGUuZy4gZnVuY3Rpb24oYSwgYil7IHJldHVybiBhLmRhdGEoJ3dlaWdodCcpIC0gYi5kYXRhKCd3ZWlnaHQnKSB9XG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWRcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLiAgQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkLiAgTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgcmVhZHk6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRzdG9wXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9IC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0cyBcblxufTtcblxuZnVuY3Rpb24gQ2lyY2xlTGF5b3V0KG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cyQ2LCBvcHRpb25zKTtcbn1cblxuQ2lyY2xlTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBwYXJhbXMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBvcHRpb25zID0gcGFyYW1zO1xuICB2YXIgY3kgPSBwYXJhbXMuY3k7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuICB2YXIgY2xvY2t3aXNlID0gb3B0aW9ucy5jb3VudGVyY2xvY2t3aXNlICE9PSB1bmRlZmluZWQgPyAhb3B0aW9ucy5jb3VudGVyY2xvY2t3aXNlIDogb3B0aW9ucy5jbG9ja3dpc2U7XG4gIHZhciBub2RlcyA9IGVsZXMubm9kZXMoKS5ub3QoJzpwYXJlbnQnKTtcblxuICBpZiAob3B0aW9ucy5zb3J0KSB7XG4gICAgbm9kZXMgPSBub2Rlcy5zb3J0KG9wdGlvbnMuc29ydCk7XG4gIH1cblxuICB2YXIgYmIgPSBtYWtlQm91bmRpbmdCb3gob3B0aW9ucy5ib3VuZGluZ0JveCA/IG9wdGlvbnMuYm91bmRpbmdCb3ggOiB7XG4gICAgeDE6IDAsXG4gICAgeTE6IDAsXG4gICAgdzogY3kud2lkdGgoKSxcbiAgICBoOiBjeS5oZWlnaHQoKVxuICB9KTtcbiAgdmFyIGNlbnRlciA9IHtcbiAgICB4OiBiYi54MSArIGJiLncgLyAyLFxuICAgIHk6IGJiLnkxICsgYmIuaCAvIDJcbiAgfTtcbiAgdmFyIHN3ZWVwID0gb3B0aW9ucy5zd2VlcCA9PT0gdW5kZWZpbmVkID8gMiAqIE1hdGguUEkgLSAyICogTWF0aC5QSSAvIG5vZGVzLmxlbmd0aCA6IG9wdGlvbnMuc3dlZXA7XG4gIHZhciBkVGhldGEgPSBzd2VlcCAvIE1hdGgubWF4KDEsIG5vZGVzLmxlbmd0aCAtIDEpO1xuICB2YXIgcjtcbiAgdmFyIG1pbkRpc3RhbmNlID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG4gPSBub2Rlc1tpXTtcbiAgICB2YXIgbmJiID0gbi5sYXlvdXREaW1lbnNpb25zKG9wdGlvbnMpO1xuICAgIHZhciB3ID0gbmJiLnc7XG4gICAgdmFyIGggPSBuYmIuaDtcbiAgICBtaW5EaXN0YW5jZSA9IE1hdGgubWF4KG1pbkRpc3RhbmNlLCB3LCBoKTtcbiAgfVxuXG4gIGlmIChudW1iZXIkMShvcHRpb25zLnJhZGl1cykpIHtcbiAgICByID0gb3B0aW9ucy5yYWRpdXM7XG4gIH0gZWxzZSBpZiAobm9kZXMubGVuZ3RoIDw9IDEpIHtcbiAgICByID0gMDtcbiAgfSBlbHNlIHtcbiAgICByID0gTWF0aC5taW4oYmIuaCwgYmIudykgLyAyIC0gbWluRGlzdGFuY2U7XG4gIH0gLy8gY2FsY3VsYXRlIHRoZSByYWRpdXNcblxuXG4gIGlmIChub2Rlcy5sZW5ndGggPiAxICYmIG9wdGlvbnMuYXZvaWRPdmVybGFwKSB7XG4gICAgLy8gYnV0IG9ubHkgaWYgbW9yZSB0aGFuIG9uZSBub2RlIChjYW4ndCBvdmVybGFwKVxuICAgIG1pbkRpc3RhbmNlICo9IDEuNzU7IC8vIGp1c3QgdG8gaGF2ZSBzb21lIG5pY2Ugc3BhY2luZ1xuXG4gICAgdmFyIGRjb3MgPSBNYXRoLmNvcyhkVGhldGEpIC0gTWF0aC5jb3MoMCk7XG4gICAgdmFyIGRzaW4gPSBNYXRoLnNpbihkVGhldGEpIC0gTWF0aC5zaW4oMCk7XG4gICAgdmFyIHJNaW4gPSBNYXRoLnNxcnQobWluRGlzdGFuY2UgKiBtaW5EaXN0YW5jZSAvIChkY29zICogZGNvcyArIGRzaW4gKiBkc2luKSk7IC8vIHMudC4gbm8gbm9kZXMgb3ZlcmxhcHBpbmdcblxuICAgIHIgPSBNYXRoLm1heChyTWluLCByKTtcbiAgfVxuXG4gIHZhciBnZXRQb3MgPSBmdW5jdGlvbiBnZXRQb3MoZWxlLCBpKSB7XG4gICAgdmFyIHRoZXRhID0gb3B0aW9ucy5zdGFydEFuZ2xlICsgaSAqIGRUaGV0YSAqIChjbG9ja3dpc2UgPyAxIDogLTEpO1xuICAgIHZhciByeCA9IHIgKiBNYXRoLmNvcyh0aGV0YSk7XG4gICAgdmFyIHJ5ID0gciAqIE1hdGguc2luKHRoZXRhKTtcbiAgICB2YXIgcG9zID0ge1xuICAgICAgeDogY2VudGVyLnggKyByeCxcbiAgICAgIHk6IGNlbnRlci55ICsgcnlcbiAgICB9O1xuICAgIHJldHVybiBwb3M7XG4gIH07XG5cbiAgZWxlcy5ub2RlcygpLmxheW91dFBvc2l0aW9ucyh0aGlzLCBvcHRpb25zLCBnZXRQb3MpO1xuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbnZhciBkZWZhdWx0cyQ1ID0ge1xuICBmaXQ6IHRydWUsXG4gIC8vIHdoZXRoZXIgdG8gZml0IHRoZSB2aWV3cG9ydCB0byB0aGUgZ3JhcGhcbiAgcGFkZGluZzogMzAsXG4gIC8vIHRoZSBwYWRkaW5nIG9uIGZpdFxuICBzdGFydEFuZ2xlOiAzIC8gMiAqIE1hdGguUEksXG4gIC8vIHdoZXJlIG5vZGVzIHN0YXJ0IGluIHJhZGlhbnNcbiAgc3dlZXA6IHVuZGVmaW5lZCxcbiAgLy8gaG93IG1hbnkgcmFkaWFucyBzaG91bGQgYmUgYmV0d2VlbiB0aGUgZmlyc3QgYW5kIGxhc3Qgbm9kZSAoZGVmYXVsdHMgdG8gZnVsbCBjaXJjbGUpXG4gIGNsb2Nrd2lzZTogdHJ1ZSxcbiAgLy8gd2hldGhlciB0aGUgbGF5b3V0IHNob3VsZCBnbyBjbG9ja3dpc2UgKHRydWUpIG9yIGNvdW50ZXJjbG9ja3dpc2UvYW50aWNsb2Nrd2lzZSAoZmFsc2UpXG4gIGVxdWlkaXN0YW50OiBmYWxzZSxcbiAgLy8gd2hldGhlciBsZXZlbHMgaGF2ZSBhbiBlcXVhbCByYWRpYWwgZGlzdGFuY2UgYmV0d2VuIHRoZW0sIG1heSBjYXVzZSBib3VuZGluZyBib3ggb3ZlcmZsb3dcbiAgbWluTm9kZVNwYWNpbmc6IDEwLFxuICAvLyBtaW4gc3BhY2luZyBiZXR3ZWVuIG91dHNpZGUgb2Ygbm9kZXMgKHVzZWQgZm9yIHJhZGl1cyBhZGp1c3RtZW50KVxuICBib3VuZGluZ0JveDogdW5kZWZpbmVkLFxuICAvLyBjb25zdHJhaW4gbGF5b3V0IGJvdW5kczsgeyB4MSwgeTEsIHgyLCB5MiB9IG9yIHsgeDEsIHkxLCB3LCBoIH1cbiAgYXZvaWRPdmVybGFwOiB0cnVlLFxuICAvLyBwcmV2ZW50cyBub2RlIG92ZXJsYXAsIG1heSBvdmVyZmxvdyBib3VuZGluZ0JveCBpZiBub3QgZW5vdWdoIHNwYWNlXG4gIG5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsczogZmFsc2UsXG4gIC8vIEV4Y2x1ZGVzIHRoZSBsYWJlbCB3aGVuIGNhbGN1bGF0aW5nIG5vZGUgYm91bmRpbmcgYm94ZXMgZm9yIHRoZSBsYXlvdXQgYWxnb3JpdGhtXG4gIGhlaWdodDogdW5kZWZpbmVkLFxuICAvLyBoZWlnaHQgb2YgbGF5b3V0IGFyZWEgKG92ZXJyaWRlcyBjb250YWluZXIgaGVpZ2h0KVxuICB3aWR0aDogdW5kZWZpbmVkLFxuICAvLyB3aWR0aCBvZiBsYXlvdXQgYXJlYSAob3ZlcnJpZGVzIGNvbnRhaW5lciB3aWR0aClcbiAgc3BhY2luZ0ZhY3RvcjogdW5kZWZpbmVkLFxuICAvLyBBcHBsaWVzIGEgbXVsdGlwbGljYXRpdmUgZmFjdG9yICg+MCkgdG8gZXhwYW5kIG9yIGNvbXByZXNzIHRoZSBvdmVyYWxsIGFyZWEgdGhhdCB0aGUgbm9kZXMgdGFrZSB1cFxuICBjb25jZW50cmljOiBmdW5jdGlvbiBjb25jZW50cmljKG5vZGUpIHtcbiAgICAvLyByZXR1cm5zIG51bWVyaWMgdmFsdWUgZm9yIGVhY2ggbm9kZSwgcGxhY2luZyBoaWdoZXIgbm9kZXMgaW4gbGV2ZWxzIHRvd2FyZHMgdGhlIGNlbnRyZVxuICAgIHJldHVybiBub2RlLmRlZ3JlZSgpO1xuICB9LFxuICBsZXZlbFdpZHRoOiBmdW5jdGlvbiBsZXZlbFdpZHRoKG5vZGVzKSB7XG4gICAgLy8gdGhlIHZhcmlhdGlvbiBvZiBjb25jZW50cmljIHZhbHVlcyBpbiBlYWNoIGxldmVsXG4gICAgcmV0dXJuIG5vZGVzLm1heERlZ3JlZSgpIC8gNDtcbiAgfSxcbiAgYW5pbWF0ZTogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gdHJhbnNpdGlvbiB0aGUgbm9kZSBwb3NpdGlvbnNcbiAgYW5pbWF0aW9uRHVyYXRpb246IDUwMCxcbiAgLy8gZHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zIGlmIGVuYWJsZWRcbiAgYW5pbWF0aW9uRWFzaW5nOiB1bmRlZmluZWQsXG4gIC8vIGVhc2luZyBvZiBhbmltYXRpb24gaWYgZW5hYmxlZFxuICBhbmltYXRlRmlsdGVyOiBmdW5jdGlvbiBhbmltYXRlRmlsdGVyKG5vZGUsIGkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLy8gYSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgbm9kZSBzaG91bGQgYmUgYW5pbWF0ZWQuICBBbGwgbm9kZXMgYW5pbWF0ZWQgYnkgZGVmYXVsdCBvbiBhbmltYXRlIGVuYWJsZWQuICBOb24tYW5pbWF0ZWQgbm9kZXMgYXJlIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgbGF5b3V0IHN0YXJ0c1xuICByZWFkeTogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRyZWFkeVxuICBzdG9wOiB1bmRlZmluZWQsXG4gIC8vIGNhbGxiYWNrIG9uIGxheW91dHN0b3BcbiAgdHJhbnNmb3JtOiBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSwgcG9zaXRpb24pIHtcbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH0gLy8gdHJhbnNmb3JtIGEgZ2l2ZW4gbm9kZSBwb3NpdGlvbi4gVXNlZnVsIGZvciBjaGFuZ2luZyBmbG93IGRpcmVjdGlvbiBpbiBkaXNjcmV0ZSBsYXlvdXRzXG5cbn07XG5cbmZ1bmN0aW9uIENvbmNlbnRyaWNMYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRzJDUsIG9wdGlvbnMpO1xufVxuXG5Db25jZW50cmljTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBwYXJhbXMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBvcHRpb25zID0gcGFyYW1zO1xuICB2YXIgY2xvY2t3aXNlID0gb3B0aW9ucy5jb3VudGVyY2xvY2t3aXNlICE9PSB1bmRlZmluZWQgPyAhb3B0aW9ucy5jb3VudGVyY2xvY2t3aXNlIDogb3B0aW9ucy5jbG9ja3dpc2U7XG4gIHZhciBjeSA9IHBhcmFtcy5jeTtcbiAgdmFyIGVsZXMgPSBvcHRpb25zLmVsZXM7XG4gIHZhciBub2RlcyA9IGVsZXMubm9kZXMoKS5ub3QoJzpwYXJlbnQnKTtcbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KG9wdGlvbnMuYm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDoge1xuICAgIHgxOiAwLFxuICAgIHkxOiAwLFxuICAgIHc6IGN5LndpZHRoKCksXG4gICAgaDogY3kuaGVpZ2h0KClcbiAgfSk7XG4gIHZhciBjZW50ZXIgPSB7XG4gICAgeDogYmIueDEgKyBiYi53IC8gMixcbiAgICB5OiBiYi55MSArIGJiLmggLyAyXG4gIH07XG4gIHZhciBub2RlVmFsdWVzID0gW107IC8vIHsgbm9kZSwgdmFsdWUgfVxuXG4gIHZhciBtYXhOb2RlU2l6ZSA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgdmFyIHZhbHVlID0gdm9pZCAwOyAvLyBjYWxjdWxhdGUgdGhlIG5vZGUgdmFsdWVcblxuICAgIHZhbHVlID0gb3B0aW9ucy5jb25jZW50cmljKG5vZGUpO1xuICAgIG5vZGVWYWx1ZXMucHVzaCh7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBub2RlOiBub2RlXG4gICAgfSk7IC8vIGZvciBzdHlsZSBtYXBwaW5nXG5cbiAgICBub2RlLl9wcml2YXRlLnNjcmF0Y2guY29uY2VudHJpYyA9IHZhbHVlO1xuICB9IC8vIGluIGNhc2Ugd2UgdXNlZCB0aGUgYGNvbmNlbnRyaWNgIGluIHN0eWxlXG5cblxuICBub2Rlcy51cGRhdGVTdHlsZSgpOyAvLyBjYWxjdWxhdGUgbWF4IHNpemUgbm93IGJhc2VkIG9uIHBvdGVudGlhbGx5IHVwZGF0ZWQgbWFwcGVyc1xuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBub2Rlcy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgX25vZGUgPSBub2Rlc1tfaV07XG5cbiAgICB2YXIgbmJiID0gX25vZGUubGF5b3V0RGltZW5zaW9ucyhvcHRpb25zKTtcblxuICAgIG1heE5vZGVTaXplID0gTWF0aC5tYXgobWF4Tm9kZVNpemUsIG5iYi53LCBuYmIuaCk7XG4gIH0gLy8gc29ydCBub2RlIHZhbHVlcyBpbiBkZXNjcmVhc2luZyBvcmRlclxuXG5cbiAgbm9kZVZhbHVlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGIudmFsdWUgLSBhLnZhbHVlO1xuICB9KTtcbiAgdmFyIGxldmVsV2lkdGggPSBvcHRpb25zLmxldmVsV2lkdGgobm9kZXMpOyAvLyBwdXQgdGhlIHZhbHVlcyBpbnRvIGxldmVsc1xuXG4gIHZhciBsZXZlbHMgPSBbW11dO1xuICB2YXIgY3VycmVudExldmVsID0gbGV2ZWxzWzBdO1xuXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG5vZGVWYWx1ZXMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciB2YWwgPSBub2RlVmFsdWVzW19pMl07XG5cbiAgICBpZiAoY3VycmVudExldmVsLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBkaWZmID0gTWF0aC5hYnMoY3VycmVudExldmVsWzBdLnZhbHVlIC0gdmFsLnZhbHVlKTtcblxuICAgICAgaWYgKGRpZmYgPj0gbGV2ZWxXaWR0aCkge1xuICAgICAgICBjdXJyZW50TGV2ZWwgPSBbXTtcbiAgICAgICAgbGV2ZWxzLnB1c2goY3VycmVudExldmVsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjdXJyZW50TGV2ZWwucHVzaCh2YWwpO1xuICB9IC8vIGNyZWF0ZSBwb3NpdGlvbnMgZnJvbSBsZXZlbHNcblxuXG4gIHZhciBtaW5EaXN0ID0gbWF4Tm9kZVNpemUgKyBvcHRpb25zLm1pbk5vZGVTcGFjaW5nOyAvLyBtaW4gZGlzdCBiZXR3ZWVuIG5vZGVzXG5cbiAgaWYgKCFvcHRpb25zLmF2b2lkT3ZlcmxhcCkge1xuICAgIC8vIHRoZW4gc3RyaWN0bHkgY29uc3RyYWluIHRvIGJiXG4gICAgdmFyIGZpcnN0THZsSGFzTXVsdGkgPSBsZXZlbHMubGVuZ3RoID4gMCAmJiBsZXZlbHNbMF0ubGVuZ3RoID4gMTtcbiAgICB2YXIgbWF4UiA9IE1hdGgubWluKGJiLncsIGJiLmgpIC8gMiAtIG1pbkRpc3Q7XG4gICAgdmFyIHJTdGVwID0gbWF4UiAvIChsZXZlbHMubGVuZ3RoICsgZmlyc3RMdmxIYXNNdWx0aSA/IDEgOiAwKTtcbiAgICBtaW5EaXN0ID0gTWF0aC5taW4obWluRGlzdCwgclN0ZXApO1xuICB9IC8vIGZpbmQgdGhlIG1ldHJpY3MgZm9yIGVhY2ggbGV2ZWxcblxuXG4gIHZhciByID0gMDtcblxuICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBsZXZlbHMubGVuZ3RoOyBfaTMrKykge1xuICAgIHZhciBsZXZlbCA9IGxldmVsc1tfaTNdO1xuICAgIHZhciBzd2VlcCA9IG9wdGlvbnMuc3dlZXAgPT09IHVuZGVmaW5lZCA/IDIgKiBNYXRoLlBJIC0gMiAqIE1hdGguUEkgLyBsZXZlbC5sZW5ndGggOiBvcHRpb25zLnN3ZWVwO1xuICAgIHZhciBkVGhldGEgPSBsZXZlbC5kVGhldGEgPSBzd2VlcCAvIE1hdGgubWF4KDEsIGxldmVsLmxlbmd0aCAtIDEpOyAvLyBjYWxjdWxhdGUgdGhlIHJhZGl1c1xuXG4gICAgaWYgKGxldmVsLmxlbmd0aCA+IDEgJiYgb3B0aW9ucy5hdm9pZE92ZXJsYXApIHtcbiAgICAgIC8vIGJ1dCBvbmx5IGlmIG1vcmUgdGhhbiBvbmUgbm9kZSAoY2FuJ3Qgb3ZlcmxhcClcbiAgICAgIHZhciBkY29zID0gTWF0aC5jb3MoZFRoZXRhKSAtIE1hdGguY29zKDApO1xuICAgICAgdmFyIGRzaW4gPSBNYXRoLnNpbihkVGhldGEpIC0gTWF0aC5zaW4oMCk7XG4gICAgICB2YXIgck1pbiA9IE1hdGguc3FydChtaW5EaXN0ICogbWluRGlzdCAvIChkY29zICogZGNvcyArIGRzaW4gKiBkc2luKSk7IC8vIHMudC4gbm8gbm9kZXMgb3ZlcmxhcHBpbmdcblxuICAgICAgciA9IE1hdGgubWF4KHJNaW4sIHIpO1xuICAgIH1cblxuICAgIGxldmVsLnIgPSByO1xuICAgIHIgKz0gbWluRGlzdDtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmVxdWlkaXN0YW50KSB7XG4gICAgdmFyIHJEZWx0YU1heCA9IDA7XG4gICAgdmFyIF9yID0gMDtcblxuICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IGxldmVscy5sZW5ndGg7IF9pNCsrKSB7XG4gICAgICB2YXIgX2xldmVsID0gbGV2ZWxzW19pNF07XG4gICAgICB2YXIgckRlbHRhID0gX2xldmVsLnIgLSBfcjtcbiAgICAgIHJEZWx0YU1heCA9IE1hdGgubWF4KHJEZWx0YU1heCwgckRlbHRhKTtcbiAgICB9XG5cbiAgICBfciA9IDA7XG5cbiAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBsZXZlbHMubGVuZ3RoOyBfaTUrKykge1xuICAgICAgdmFyIF9sZXZlbDIgPSBsZXZlbHNbX2k1XTtcblxuICAgICAgaWYgKF9pNSA9PT0gMCkge1xuICAgICAgICBfciA9IF9sZXZlbDIucjtcbiAgICAgIH1cblxuICAgICAgX2xldmVsMi5yID0gX3I7XG4gICAgICBfciArPSByRGVsdGFNYXg7XG4gICAgfVxuICB9IC8vIGNhbGN1bGF0ZSB0aGUgbm9kZSBwb3NpdGlvbnNcblxuXG4gIHZhciBwb3MgPSB7fTsgLy8gaWQgPT4gcG9zaXRpb25cblxuICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBsZXZlbHMubGVuZ3RoOyBfaTYrKykge1xuICAgIHZhciBfbGV2ZWwzID0gbGV2ZWxzW19pNl07XG4gICAgdmFyIF9kVGhldGEgPSBfbGV2ZWwzLmRUaGV0YTtcbiAgICB2YXIgX3IyID0gX2xldmVsMy5yO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBfbGV2ZWwzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgX3ZhbCA9IF9sZXZlbDNbal07XG4gICAgICB2YXIgdGhldGEgPSBvcHRpb25zLnN0YXJ0QW5nbGUgKyAoY2xvY2t3aXNlID8gMSA6IC0xKSAqIF9kVGhldGEgKiBqO1xuICAgICAgdmFyIHAgPSB7XG4gICAgICAgIHg6IGNlbnRlci54ICsgX3IyICogTWF0aC5jb3ModGhldGEpLFxuICAgICAgICB5OiBjZW50ZXIueSArIF9yMiAqIE1hdGguc2luKHRoZXRhKVxuICAgICAgfTtcbiAgICAgIHBvc1tfdmFsLm5vZGUuaWQoKV0gPSBwO1xuICAgIH1cbiAgfSAvLyBwb3NpdGlvbiB0aGUgbm9kZXNcblxuXG4gIGVsZXMubm9kZXMoKS5sYXlvdXRQb3NpdGlvbnModGhpcywgb3B0aW9ucywgZnVuY3Rpb24gKGVsZSkge1xuICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuICAgIHJldHVybiBwb3NbaWRdO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG4vKlxuVGhlIENvU0UgbGF5b3V0IHdhcyB3cml0dGVuIGJ5IEdlcmFyZG8gSHVjay5cbmh0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9nZXJhcmRvaHVjay9cblxuQmFzZWQgb24gdGhlIGZvbGxvd2luZyBhcnRpY2xlOlxuaHR0cDovL2RsLmFjbS5vcmcvY2l0YXRpb24uY2ZtP2lkPTE0OTgwNDdcblxuTW9kaWZpY2F0aW9ucyB0cmFja2VkIG9uIEdpdGh1Yi5cbiovXG52YXIgREVCVUc7XG4vKipcbiAqIEBicmllZiA6ICBkZWZhdWx0IGxheW91dCBvcHRpb25zXG4gKi9cblxudmFyIGRlZmF1bHRzJDQgPSB7XG4gIC8vIENhbGxlZCBvbiBgbGF5b3V0cmVhZHlgXG4gIHJlYWR5OiBmdW5jdGlvbiByZWFkeSgpIHt9LFxuICAvLyBDYWxsZWQgb24gYGxheW91dHN0b3BgXG4gIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7fSxcbiAgLy8gV2hldGhlciB0byBhbmltYXRlIHdoaWxlIHJ1bm5pbmcgdGhlIGxheW91dFxuICAvLyB0cnVlIDogQW5pbWF0ZSBjb250aW51b3VzbHkgYXMgdGhlIGxheW91dCBpcyBydW5uaW5nXG4gIC8vIGZhbHNlIDogSnVzdCBzaG93IHRoZSBlbmQgcmVzdWx0XG4gIC8vICdlbmQnIDogQW5pbWF0ZSB3aXRoIHRoZSBlbmQgcmVzdWx0LCBmcm9tIHRoZSBpbml0aWFsIHBvc2l0aW9ucyB0byB0aGUgZW5kIHBvc2l0aW9uc1xuICBhbmltYXRlOiB0cnVlLFxuICAvLyBFYXNpbmcgb2YgdGhlIGFuaW1hdGlvbiBmb3IgYW5pbWF0ZTonZW5kJ1xuICBhbmltYXRpb25FYXNpbmc6IHVuZGVmaW5lZCxcbiAgLy8gVGhlIGR1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gZm9yIGFuaW1hdGU6J2VuZCdcbiAgYW5pbWF0aW9uRHVyYXRpb246IHVuZGVmaW5lZCxcbiAgLy8gQSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgbm9kZSBzaG91bGQgYmUgYW5pbWF0ZWRcbiAgLy8gQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkXG4gIC8vIE5vbi1hbmltYXRlZCBub2RlcyBhcmUgcG9zaXRpb25lZCBpbW1lZGlhdGVseSB3aGVuIHRoZSBsYXlvdXQgc3RhcnRzXG4gIGFuaW1hdGVGaWx0ZXI6IGZ1bmN0aW9uIGFuaW1hdGVGaWx0ZXIobm9kZSwgaSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvLyBUaGUgbGF5b3V0IGFuaW1hdGVzIG9ubHkgYWZ0ZXIgdGhpcyBtYW55IG1pbGxpc2Vjb25kcyBmb3IgYW5pbWF0ZTp0cnVlXG4gIC8vIChwcmV2ZW50cyBmbGFzaGluZyBvbiBmYXN0IHJ1bnMpXG4gIGFuaW1hdGlvblRocmVzaG9sZDogMjUwLFxuICAvLyBOdW1iZXIgb2YgaXRlcmF0aW9ucyBiZXR3ZWVuIGNvbnNlY3V0aXZlIHNjcmVlbiBwb3NpdGlvbnMgdXBkYXRlXG4gIHJlZnJlc2g6IDIwLFxuICAvLyBXaGV0aGVyIHRvIGZpdCB0aGUgbmV0d29yayB2aWV3IGFmdGVyIHdoZW4gZG9uZVxuICBmaXQ6IHRydWUsXG4gIC8vIFBhZGRpbmcgb24gZml0XG4gIHBhZGRpbmc6IDMwLFxuICAvLyBDb25zdHJhaW4gbGF5b3V0IGJvdW5kczsgeyB4MSwgeTEsIHgyLCB5MiB9IG9yIHsgeDEsIHkxLCB3LCBoIH1cbiAgYm91bmRpbmdCb3g6IHVuZGVmaW5lZCxcbiAgLy8gRXhjbHVkZXMgdGhlIGxhYmVsIHdoZW4gY2FsY3VsYXRpbmcgbm9kZSBib3VuZGluZyBib3hlcyBmb3IgdGhlIGxheW91dCBhbGdvcml0aG1cbiAgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzOiBmYWxzZSxcbiAgLy8gUmFuZG9taXplIHRoZSBpbml0aWFsIHBvc2l0aW9ucyBvZiB0aGUgbm9kZXMgKHRydWUpIG9yIHVzZSBleGlzdGluZyBwb3NpdGlvbnMgKGZhbHNlKVxuICByYW5kb21pemU6IGZhbHNlLFxuICAvLyBFeHRyYSBzcGFjaW5nIGJldHdlZW4gY29tcG9uZW50cyBpbiBub24tY29tcG91bmQgZ3JhcGhzXG4gIGNvbXBvbmVudFNwYWNpbmc6IDQwLFxuICAvLyBOb2RlIHJlcHVsc2lvbiAobm9uIG92ZXJsYXBwaW5nKSBtdWx0aXBsaWVyXG4gIG5vZGVSZXB1bHNpb246IGZ1bmN0aW9uIG5vZGVSZXB1bHNpb24obm9kZSkge1xuICAgIHJldHVybiAyMDQ4O1xuICB9LFxuICAvLyBOb2RlIHJlcHVsc2lvbiAob3ZlcmxhcHBpbmcpIG11bHRpcGxpZXJcbiAgbm9kZU92ZXJsYXA6IDQsXG4gIC8vIElkZWFsIGVkZ2UgKG5vbiBuZXN0ZWQpIGxlbmd0aFxuICBpZGVhbEVkZ2VMZW5ndGg6IGZ1bmN0aW9uIGlkZWFsRWRnZUxlbmd0aChlZGdlKSB7XG4gICAgcmV0dXJuIDMyO1xuICB9LFxuICAvLyBEaXZpc29yIHRvIGNvbXB1dGUgZWRnZSBmb3JjZXNcbiAgZWRnZUVsYXN0aWNpdHk6IGZ1bmN0aW9uIGVkZ2VFbGFzdGljaXR5KGVkZ2UpIHtcbiAgICByZXR1cm4gMzI7XG4gIH0sXG4gIC8vIE5lc3RpbmcgZmFjdG9yIChtdWx0aXBsaWVyKSB0byBjb21wdXRlIGlkZWFsIGVkZ2UgbGVuZ3RoIGZvciBuZXN0ZWQgZWRnZXNcbiAgbmVzdGluZ0ZhY3RvcjogMS4yLFxuICAvLyBHcmF2aXR5IGZvcmNlIChjb25zdGFudClcbiAgZ3Jhdml0eTogMSxcbiAgLy8gTWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBwZXJmb3JtXG4gIG51bUl0ZXI6IDEwMDAsXG4gIC8vIEluaXRpYWwgdGVtcGVyYXR1cmUgKG1heGltdW0gbm9kZSBkaXNwbGFjZW1lbnQpXG4gIGluaXRpYWxUZW1wOiAxMDAwLFxuICAvLyBDb29saW5nIGZhY3RvciAoaG93IHRoZSB0ZW1wZXJhdHVyZSBpcyByZWR1Y2VkIGJldHdlZW4gY29uc2VjdXRpdmUgaXRlcmF0aW9uc1xuICBjb29saW5nRmFjdG9yOiAwLjk5LFxuICAvLyBMb3dlciB0ZW1wZXJhdHVyZSB0aHJlc2hvbGQgKGJlbG93IHRoaXMgcG9pbnQgdGhlIGxheW91dCB3aWxsIGVuZClcbiAgbWluVGVtcDogMS4wXG59O1xuLyoqXG4gKiBAYnJpZWYgICAgICAgOiBjb25zdHJ1Y3RvclxuICogQGFyZyBvcHRpb25zIDogb2JqZWN0IGNvbnRhaW5pbmcgbGF5b3V0IG9wdGlvbnNcbiAqL1xuXG5mdW5jdGlvbiBDb3NlTGF5b3V0KG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cyQ0LCBvcHRpb25zKTtcbiAgdGhpcy5vcHRpb25zLmxheW91dCA9IHRoaXM7XG59XG4vKipcbiAqIEBicmllZiA6IHJ1bnMgdGhlIGxheW91dFxuICovXG5cblxuQ29zZUxheW91dC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgdmFyIGN5ID0gb3B0aW9ucy5jeTtcbiAgdmFyIGxheW91dCA9IHRoaXM7XG4gIGxheW91dC5zdG9wcGVkID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMuYW5pbWF0ZSA9PT0gdHJ1ZSB8fCBvcHRpb25zLmFuaW1hdGUgPT09IGZhbHNlKSB7XG4gICAgbGF5b3V0LmVtaXQoe1xuICAgICAgdHlwZTogJ2xheW91dHN0YXJ0JyxcbiAgICAgIGxheW91dDogbGF5b3V0XG4gICAgfSk7XG4gIH0gLy8gU2V0IERFQlVHIC0gR2xvYmFsIHZhcmlhYmxlXG5cblxuICBpZiAodHJ1ZSA9PT0gb3B0aW9ucy5kZWJ1Zykge1xuICAgIERFQlVHID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBERUJVRyA9IGZhbHNlO1xuICB9IC8vIEluaXRpYWxpemUgbGF5b3V0IGluZm9cblxuXG4gIHZhciBsYXlvdXRJbmZvID0gY3JlYXRlTGF5b3V0SW5mbyhjeSwgbGF5b3V0LCBvcHRpb25zKTsgLy8gU2hvdyBMYXlvdXRJbmZvIGNvbnRlbnRzIGlmIGRlYnVnZ2luZ1xuXG4gIGlmIChERUJVRykge1xuICAgIHByaW50TGF5b3V0SW5mbyhsYXlvdXRJbmZvKTtcbiAgfSAvLyBJZiByZXF1aXJlZCwgcmFuZG9taXplIG5vZGUgcG9zaXRpb25zXG5cblxuICBpZiAob3B0aW9ucy5yYW5kb21pemUpIHtcbiAgICByYW5kb21pemVQb3NpdGlvbnMobGF5b3V0SW5mbyk7XG4gIH1cblxuICB2YXIgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2VOb3coKTtcblxuICB2YXIgcmVmcmVzaCA9IGZ1bmN0aW9uIHJlZnJlc2goKSB7XG4gICAgcmVmcmVzaFBvc2l0aW9ucyhsYXlvdXRJbmZvLCBjeSwgb3B0aW9ucyk7IC8vIEZpdCB0aGUgZ3JhcGggaWYgbmVjZXNzYXJ5XG5cbiAgICBpZiAodHJ1ZSA9PT0gb3B0aW9ucy5maXQpIHtcbiAgICAgIGN5LmZpdChvcHRpb25zLnBhZGRpbmcpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgbWFpbkxvb3AgPSBmdW5jdGlvbiBtYWluTG9vcChpKSB7XG4gICAgaWYgKGxheW91dC5zdG9wcGVkIHx8IGkgPj0gb3B0aW9ucy5udW1JdGVyKSB7XG4gICAgICAvLyBsb2dEZWJ1ZyhcIkxheW91dCBtYW51YWxseSBzdG9wcGVkLiBTdG9wcGluZyBjb21wdXRhdGlvbiBpbiBzdGVwIFwiICsgaSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBEbyBvbmUgc3RlcCBpbiB0aGUgcGhpc2ljYWwgc2ltdWxhdGlvblxuXG5cbiAgICBzdGVwKGxheW91dEluZm8sIG9wdGlvbnMpOyAvLyBVcGRhdGUgdGVtcGVyYXR1cmVcblxuICAgIGxheW91dEluZm8udGVtcGVyYXR1cmUgPSBsYXlvdXRJbmZvLnRlbXBlcmF0dXJlICogb3B0aW9ucy5jb29saW5nRmFjdG9yOyAvLyBsb2dEZWJ1ZyhcIk5ldyB0ZW1wZXJhdHVyZTogXCIgKyBsYXlvdXRJbmZvLnRlbXBlcmF0dXJlKTtcblxuICAgIGlmIChsYXlvdXRJbmZvLnRlbXBlcmF0dXJlIDwgb3B0aW9ucy5taW5UZW1wKSB7XG4gICAgICAvLyBsb2dEZWJ1ZyhcIlRlbXBlcmF0dXJlIGRyb3AgYmVsb3cgbWluaW11bSB0aHJlc2hvbGQuIFN0b3BwaW5nIGNvbXB1dGF0aW9uIGluIHN0ZXAgXCIgKyBpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICB2YXIgZG9uZSA9IGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgaWYgKG9wdGlvbnMuYW5pbWF0ZSA9PT0gdHJ1ZSB8fCBvcHRpb25zLmFuaW1hdGUgPT09IGZhbHNlKSB7XG4gICAgICByZWZyZXNoKCk7IC8vIExheW91dCBoYXMgZmluaXNoZWRcblxuICAgICAgbGF5b3V0Lm9uZSgnbGF5b3V0c3RvcCcsIG9wdGlvbnMuc3RvcCk7XG4gICAgICBsYXlvdXQuZW1pdCh7XG4gICAgICAgIHR5cGU6ICdsYXlvdXRzdG9wJyxcbiAgICAgICAgbGF5b3V0OiBsYXlvdXRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbm9kZXMgPSBvcHRpb25zLmVsZXMubm9kZXMoKTtcbiAgICAgIHZhciBnZXRTY2FsZWRQb3MgPSBnZXRTY2FsZUluQm91bmRzRm4obGF5b3V0SW5mbywgb3B0aW9ucywgbm9kZXMpO1xuICAgICAgbm9kZXMubGF5b3V0UG9zaXRpb25zKGxheW91dCwgb3B0aW9ucywgZ2V0U2NhbGVkUG9zKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGkgPSAwO1xuICB2YXIgbG9vcFJldCA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMuYW5pbWF0ZSA9PT0gdHJ1ZSkge1xuICAgIHZhciBmcmFtZSA9IGZ1bmN0aW9uIGZyYW1lKCkge1xuICAgICAgdmFyIGYgPSAwO1xuXG4gICAgICB3aGlsZSAobG9vcFJldCAmJiBmIDwgb3B0aW9ucy5yZWZyZXNoKSB7XG4gICAgICAgIGxvb3BSZXQgPSBtYWluTG9vcChpKTtcbiAgICAgICAgaSsrO1xuICAgICAgICBmKys7XG4gICAgICB9XG5cbiAgICAgIGlmICghbG9vcFJldCkge1xuICAgICAgICAvLyBpdCdzIGRvbmVcbiAgICAgICAgc2VwYXJhdGVDb21wb25lbnRzKGxheW91dEluZm8sIG9wdGlvbnMpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbm93ID0gcGVyZm9ybWFuY2VOb3coKTtcblxuICAgICAgICBpZiAobm93IC0gc3RhcnRUaW1lID49IG9wdGlvbnMuYW5pbWF0aW9uVGhyZXNob2xkKSB7XG4gICAgICAgICAgcmVmcmVzaCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZyYW1lKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZnJhbWUoKTtcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAobG9vcFJldCkge1xuICAgICAgbG9vcFJldCA9IG1haW5Mb29wKGkpO1xuICAgICAgaSsrO1xuICAgIH1cblxuICAgIHNlcGFyYXRlQ29tcG9uZW50cyhsYXlvdXRJbmZvLCBvcHRpb25zKTtcbiAgICBkb25lKCk7XG4gIH1cblxuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG4vKipcbiAqIEBicmllZiA6IGNhbGxlZCBvbiBjb250aW51b3VzIGxheW91dHMgdG8gc3RvcCB0aGVtIGJlZm9yZSB0aGV5IGZpbmlzaFxuICovXG5cblxuQ29zZUxheW91dC5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zdG9wcGVkID0gdHJ1ZTtcblxuICBpZiAodGhpcy50aHJlYWQpIHtcbiAgICB0aGlzLnRocmVhZC5zdG9wKCk7XG4gIH1cblxuICB0aGlzLmVtaXQoJ2xheW91dHN0b3AnKTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG5Db3NlTGF5b3V0LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy50aHJlYWQpIHtcbiAgICB0aGlzLnRocmVhZC5zdG9wKCk7XG4gIH1cblxuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG4vKipcbiAqIEBicmllZiAgICAgOiBDcmVhdGVzIGFuIG9iamVjdCB3aGljaCBpcyBjb250YWlucyBhbGwgdGhlIGRhdGFcbiAqICAgICAgICAgICAgICB1c2VkIGluIHRoZSBsYXlvdXQgcHJvY2Vzc1xuICogQGFyZyBjeSAgICA6IGN5dG9zY2FwZS5qcyBvYmplY3RcbiAqIEByZXR1cm4gICAgOiBsYXlvdXRJbmZvIG9iamVjdCBpbml0aWFsaXplZFxuICovXG5cblxudmFyIGNyZWF0ZUxheW91dEluZm8gPSBmdW5jdGlvbiBjcmVhdGVMYXlvdXRJbmZvKGN5LCBsYXlvdXQsIG9wdGlvbnMpIHtcbiAgLy8gU2hvcnRjdXRcbiAgdmFyIGVkZ2VzID0gb3B0aW9ucy5lbGVzLmVkZ2VzKCk7XG4gIHZhciBub2RlcyA9IG9wdGlvbnMuZWxlcy5ub2RlcygpO1xuICB2YXIgYmIgPSBtYWtlQm91bmRpbmdCb3gob3B0aW9ucy5ib3VuZGluZ0JveCA/IG9wdGlvbnMuYm91bmRpbmdCb3ggOiB7XG4gICAgeDE6IDAsXG4gICAgeTE6IDAsXG4gICAgdzogY3kud2lkdGgoKSxcbiAgICBoOiBjeS5oZWlnaHQoKVxuICB9KTtcbiAgdmFyIGxheW91dEluZm8gPSB7XG4gICAgaXNDb21wb3VuZDogY3kuaGFzQ29tcG91bmROb2RlcygpLFxuICAgIGxheW91dE5vZGVzOiBbXSxcbiAgICBpZFRvSW5kZXg6IHt9LFxuICAgIG5vZGVTaXplOiBub2Rlcy5zaXplKCksXG4gICAgZ3JhcGhTZXQ6IFtdLFxuICAgIGluZGV4VG9HcmFwaDogW10sXG4gICAgbGF5b3V0RWRnZXM6IFtdLFxuICAgIGVkZ2VTaXplOiBlZGdlcy5zaXplKCksXG4gICAgdGVtcGVyYXR1cmU6IG9wdGlvbnMuaW5pdGlhbFRlbXAsXG4gICAgY2xpZW50V2lkdGg6IGJiLncsXG4gICAgY2xpZW50SGVpZ2h0OiBiYi5oLFxuICAgIGJvdW5kaW5nQm94OiBiYlxuICB9O1xuICB2YXIgY29tcG9uZW50cyA9IG9wdGlvbnMuZWxlcy5jb21wb25lbnRzKCk7XG4gIHZhciBpZDJjbXB0SWQgPSB7fTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50c1tpXTtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tcG9uZW50Lmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgbm9kZSA9IGNvbXBvbmVudFtqXTtcbiAgICAgIGlkMmNtcHRJZFtub2RlLmlkKCldID0gaTtcbiAgICB9XG4gIH0gLy8gSXRlcmF0ZSBvdmVyIGFsbCBub2RlcywgY3JlYXRpbmcgbGF5b3V0IG5vZGVzXG5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8ubm9kZVNpemU7IGkrKykge1xuICAgIHZhciBuID0gbm9kZXNbaV07XG4gICAgdmFyIG5iYiA9IG4ubGF5b3V0RGltZW5zaW9ucyhvcHRpb25zKTtcbiAgICB2YXIgdGVtcE5vZGUgPSB7fTtcbiAgICB0ZW1wTm9kZS5pc0xvY2tlZCA9IG4ubG9ja2VkKCk7XG4gICAgdGVtcE5vZGUuaWQgPSBuLmRhdGEoJ2lkJyk7XG4gICAgdGVtcE5vZGUucGFyZW50SWQgPSBuLmRhdGEoJ3BhcmVudCcpO1xuICAgIHRlbXBOb2RlLmNtcHRJZCA9IGlkMmNtcHRJZFtuLmlkKCldO1xuICAgIHRlbXBOb2RlLmNoaWxkcmVuID0gW107XG4gICAgdGVtcE5vZGUucG9zaXRpb25YID0gbi5wb3NpdGlvbigneCcpO1xuICAgIHRlbXBOb2RlLnBvc2l0aW9uWSA9IG4ucG9zaXRpb24oJ3knKTtcbiAgICB0ZW1wTm9kZS5vZmZzZXRYID0gMDtcbiAgICB0ZW1wTm9kZS5vZmZzZXRZID0gMDtcbiAgICB0ZW1wTm9kZS5oZWlnaHQgPSBuYmIudztcbiAgICB0ZW1wTm9kZS53aWR0aCA9IG5iYi5oO1xuICAgIHRlbXBOb2RlLm1heFggPSB0ZW1wTm9kZS5wb3NpdGlvblggKyB0ZW1wTm9kZS53aWR0aCAvIDI7XG4gICAgdGVtcE5vZGUubWluWCA9IHRlbXBOb2RlLnBvc2l0aW9uWCAtIHRlbXBOb2RlLndpZHRoIC8gMjtcbiAgICB0ZW1wTm9kZS5tYXhZID0gdGVtcE5vZGUucG9zaXRpb25ZICsgdGVtcE5vZGUuaGVpZ2h0IC8gMjtcbiAgICB0ZW1wTm9kZS5taW5ZID0gdGVtcE5vZGUucG9zaXRpb25ZIC0gdGVtcE5vZGUuaGVpZ2h0IC8gMjtcbiAgICB0ZW1wTm9kZS5wYWRMZWZ0ID0gcGFyc2VGbG9hdChuLnN0eWxlKCdwYWRkaW5nJykpO1xuICAgIHRlbXBOb2RlLnBhZFJpZ2h0ID0gcGFyc2VGbG9hdChuLnN0eWxlKCdwYWRkaW5nJykpO1xuICAgIHRlbXBOb2RlLnBhZFRvcCA9IHBhcnNlRmxvYXQobi5zdHlsZSgncGFkZGluZycpKTtcbiAgICB0ZW1wTm9kZS5wYWRCb3R0b20gPSBwYXJzZUZsb2F0KG4uc3R5bGUoJ3BhZGRpbmcnKSk7IC8vIGZvcmNlc1xuXG4gICAgdGVtcE5vZGUubm9kZVJlcHVsc2lvbiA9IGZuJDYob3B0aW9ucy5ub2RlUmVwdWxzaW9uKSA/IG9wdGlvbnMubm9kZVJlcHVsc2lvbihuKSA6IG9wdGlvbnMubm9kZVJlcHVsc2lvbjsgLy8gQWRkIG5ldyBub2RlXG5cbiAgICBsYXlvdXRJbmZvLmxheW91dE5vZGVzLnB1c2godGVtcE5vZGUpOyAvLyBBZGQgZW50cnkgdG8gaWQtaW5kZXggbWFwXG5cbiAgICBsYXlvdXRJbmZvLmlkVG9JbmRleFt0ZW1wTm9kZS5pZF0gPSBpO1xuICB9IC8vIElubGluZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHF1ZXVlLCB1c2VkIGZvciB0cmF2ZXJzaW5nIHRoZSBncmFwaCBpbiBCRlMgb3JkZXJcblxuXG4gIHZhciBxdWV1ZSA9IFtdO1xuICB2YXIgc3RhcnQgPSAwOyAvLyBQb2ludHMgdG8gdGhlIHN0YXJ0IHRoZSBxdWV1ZVxuXG4gIHZhciBlbmQgPSAtMTsgLy8gUG9pbnRzIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlXG5cbiAgdmFyIHRlbXBHcmFwaCA9IFtdOyAvLyBTZWNvbmQgcGFzcyB0byBhZGQgY2hpbGQgaW5mb3JtYXRpb24gYW5kXG4gIC8vIGluaXRpYWxpemUgcXVldWUgZm9yIGhpZXJhcmNoaWNhbCB0cmF2ZXJzYWxcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8ubm9kZVNpemU7IGkrKykge1xuICAgIHZhciBuID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tpXTtcbiAgICB2YXIgcF9pZCA9IG4ucGFyZW50SWQ7IC8vIENoZWNrIGlmIG5vZGUgbiBoYXMgYSBwYXJlbnQgbm9kZVxuXG4gICAgaWYgKG51bGwgIT0gcF9pZCkge1xuICAgICAgLy8gQWRkIG5vZGUgSWQgdG8gcGFyZW50J3MgbGlzdCBvZiBjaGlsZHJlblxuICAgICAgbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtwX2lkXV0uY2hpbGRyZW4ucHVzaChuLmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgYSBub2RlIGRvZXNuJ3QgaGF2ZSBhIHBhcmVudCwgdGhlbiBpdCdzIGluIHRoZSByb290IGdyYXBoXG4gICAgICBxdWV1ZVsrK2VuZF0gPSBuLmlkO1xuICAgICAgdGVtcEdyYXBoLnB1c2gobi5pZCk7XG4gICAgfVxuICB9IC8vIEFkZCByb290IGdyYXBoIHRvIGdyYXBoU2V0XG5cblxuICBsYXlvdXRJbmZvLmdyYXBoU2V0LnB1c2godGVtcEdyYXBoKTsgLy8gVHJhdmVyc2UgdGhlIGdyYXBoLCBsZXZlbCBieSBsZXZlbCxcblxuICB3aGlsZSAoc3RhcnQgPD0gZW5kKSB7XG4gICAgLy8gR2V0IHRoZSBub2RlIHRvIHZpc2l0IGFuZCByZW1vdmUgaXQgZnJvbSBxdWV1ZVxuICAgIHZhciBub2RlX2lkID0gcXVldWVbc3RhcnQrK107XG4gICAgdmFyIG5vZGVfaXggPSBsYXlvdXRJbmZvLmlkVG9JbmRleFtub2RlX2lkXTtcbiAgICB2YXIgbm9kZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbm9kZV9peF07XG4gICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcblxuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBBZGQgY2hpbGRyZW4gbm9kZXMgYXMgYSBuZXcgZ3JhcGggdG8gZ3JhcGggc2V0XG4gICAgICBsYXlvdXRJbmZvLmdyYXBoU2V0LnB1c2goY2hpbGRyZW4pOyAvLyBBZGQgY2hpbGRyZW4gdG8gcXVlIHF1ZXVlIHRvIGJlIHZpc2l0ZWRcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBxdWV1ZVsrK2VuZF0gPSBjaGlsZHJlbltpXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ3JlYXRlIGluZGV4VG9HcmFwaCBtYXBcblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5ncmFwaFNldC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBncmFwaCA9IGxheW91dEluZm8uZ3JhcGhTZXRbaV07XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGdyYXBoLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgaW5kZXggPSBsYXlvdXRJbmZvLmlkVG9JbmRleFtncmFwaFtqXV07XG4gICAgICBsYXlvdXRJbmZvLmluZGV4VG9HcmFwaFtpbmRleF0gPSBpO1xuICAgIH1cbiAgfSAvLyBJdGVyYXRlIG92ZXIgYWxsIGVkZ2VzLCBjcmVhdGluZyBMYXlvdXQgRWRnZXNcblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5lZGdlU2l6ZTsgaSsrKSB7XG4gICAgdmFyIGUgPSBlZGdlc1tpXTtcbiAgICB2YXIgdGVtcEVkZ2UgPSB7fTtcbiAgICB0ZW1wRWRnZS5pZCA9IGUuZGF0YSgnaWQnKTtcbiAgICB0ZW1wRWRnZS5zb3VyY2VJZCA9IGUuZGF0YSgnc291cmNlJyk7XG4gICAgdGVtcEVkZ2UudGFyZ2V0SWQgPSBlLmRhdGEoJ3RhcmdldCcpOyAvLyBDb21wdXRlIGlkZWFsIGxlbmd0aFxuXG4gICAgdmFyIGlkZWFsTGVuZ3RoID0gZm4kNihvcHRpb25zLmlkZWFsRWRnZUxlbmd0aCkgPyBvcHRpb25zLmlkZWFsRWRnZUxlbmd0aChlKSA6IG9wdGlvbnMuaWRlYWxFZGdlTGVuZ3RoO1xuICAgIHZhciBlbGFzdGljaXR5ID0gZm4kNihvcHRpb25zLmVkZ2VFbGFzdGljaXR5KSA/IG9wdGlvbnMuZWRnZUVsYXN0aWNpdHkoZSkgOiBvcHRpb25zLmVkZ2VFbGFzdGljaXR5OyAvLyBDaGVjayBpZiBpdCdzIGFuIGludGVyIGdyYXBoIGVkZ2VcblxuICAgIHZhciBzb3VyY2VJeCA9IGxheW91dEluZm8uaWRUb0luZGV4W3RlbXBFZGdlLnNvdXJjZUlkXTtcbiAgICB2YXIgdGFyZ2V0SXggPSBsYXlvdXRJbmZvLmlkVG9JbmRleFt0ZW1wRWRnZS50YXJnZXRJZF07XG4gICAgdmFyIHNvdXJjZUdyYXBoID0gbGF5b3V0SW5mby5pbmRleFRvR3JhcGhbc291cmNlSXhdO1xuICAgIHZhciB0YXJnZXRHcmFwaCA9IGxheW91dEluZm8uaW5kZXhUb0dyYXBoW3RhcmdldEl4XTtcblxuICAgIGlmIChzb3VyY2VHcmFwaCAhPSB0YXJnZXRHcmFwaCkge1xuICAgICAgLy8gRmluZCBsb3dlc3QgY29tbW9uIGdyYXBoIGFuY2VzdG9yXG4gICAgICB2YXIgbGNhID0gZmluZExDQSh0ZW1wRWRnZS5zb3VyY2VJZCwgdGVtcEVkZ2UudGFyZ2V0SWQsIGxheW91dEluZm8pOyAvLyBDb21wdXRlIHN1bSBvZiBub2RlIGRlcHRocywgcmVsYXRpdmUgdG8gbGNhIGdyYXBoXG5cbiAgICAgIHZhciBsY2FHcmFwaCA9IGxheW91dEluZm8uZ3JhcGhTZXRbbGNhXTtcbiAgICAgIHZhciBkZXB0aCA9IDA7IC8vIFNvdXJjZSBkZXB0aFxuXG4gICAgICB2YXIgdGVtcE5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW3NvdXJjZUl4XTtcblxuICAgICAgd2hpbGUgKC0xID09PSBsY2FHcmFwaC5pbmRleE9mKHRlbXBOb2RlLmlkKSkge1xuICAgICAgICB0ZW1wTm9kZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbdGVtcE5vZGUucGFyZW50SWRdXTtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH0gLy8gVGFyZ2V0IGRlcHRoXG5cblxuICAgICAgdGVtcE5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW3RhcmdldEl4XTtcblxuICAgICAgd2hpbGUgKC0xID09PSBsY2FHcmFwaC5pbmRleE9mKHRlbXBOb2RlLmlkKSkge1xuICAgICAgICB0ZW1wTm9kZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbdGVtcE5vZGUucGFyZW50SWRdXTtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH0gLy8gbG9nRGVidWcoJ0xDQSBvZiBub2RlcyAnICsgdGVtcEVkZ2Uuc291cmNlSWQgKyAnIGFuZCAnICsgdGVtcEVkZ2UudGFyZ2V0SWQgK1xuICAgICAgLy8gIFwiLiBJbmRleDogXCIgKyBsY2EgKyBcIiBDb250ZW50czogXCIgKyBsY2FHcmFwaC50b1N0cmluZygpICtcbiAgICAgIC8vICBcIi4gRGVwdGg6IFwiICsgZGVwdGgpO1xuICAgICAgLy8gVXBkYXRlIGlkZWFsTGVuZ3RoXG5cblxuICAgICAgaWRlYWxMZW5ndGggKj0gZGVwdGggKiBvcHRpb25zLm5lc3RpbmdGYWN0b3I7XG4gICAgfVxuXG4gICAgdGVtcEVkZ2UuaWRlYWxMZW5ndGggPSBpZGVhbExlbmd0aDtcbiAgICB0ZW1wRWRnZS5lbGFzdGljaXR5ID0gZWxhc3RpY2l0eTtcbiAgICBsYXlvdXRJbmZvLmxheW91dEVkZ2VzLnB1c2godGVtcEVkZ2UpO1xuICB9IC8vIEZpbmFsbHksIHJldHVybiBsYXlvdXRJbmZvIG9iamVjdFxuXG5cbiAgcmV0dXJuIGxheW91dEluZm87XG59O1xuLyoqXG4gKiBAYnJpZWYgOiBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBpbmRleCBvZiB0aGUgbG93ZXN0IGNvbW1vblxuICogICAgICAgICAgZ3JhcGggYW5jZXN0b3IgYmV0d2VlbiAyIG5vZGVzIGluIHRoZSBzdWJ0cmVlXG4gKiAgICAgICAgICAoZnJvbSB0aGUgZ3JhcGggaGllcmFyY2h5IGluZHVjZWQgdHJlZSkgd2hvc2VcbiAqICAgICAgICAgIHJvb3QgaXMgZ3JhcGhJeFxuICpcbiAqIEBhcmcgbm9kZTE6IG5vZGUxJ3MgSURcbiAqIEBhcmcgbm9kZTI6IG5vZGUyJ3MgSURcbiAqIEBhcmcgbGF5b3V0SW5mbzogbGF5b3V0SW5mbyBvYmplY3RcbiAqXG4gKi9cblxuXG52YXIgZmluZExDQSA9IGZ1bmN0aW9uIGZpbmRMQ0Eobm9kZTEsIG5vZGUyLCBsYXlvdXRJbmZvKSB7XG4gIC8vIEZpbmQgdGhlaXIgY29tbW9uIGFuY2VzdGVyLCBzdGFydGluZyBmcm9tIHRoZSByb290IGdyYXBoXG4gIHZhciByZXMgPSBmaW5kTENBX2F1eChub2RlMSwgbm9kZTIsIDAsIGxheW91dEluZm8pO1xuXG4gIGlmICgyID4gcmVzLmNvdW50KSB7XG4gICAgLy8gSWYgYXV4IGZ1bmN0aW9uIGNvdWxkbid0IGZpbmQgdGhlIGNvbW1vbiBhbmNlc3RlcixcbiAgICAvLyB0aGVuIGl0IGlzIHRoZSByb290IGdyYXBoXG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlcy5ncmFwaDtcbiAgfVxufTtcbi8qKlxuICogQGJyaWVmICAgICAgICAgIDogQXV4aWxpYXJ5IGZ1bmN0aW9uIHVzZWQgZm9yIExDQSBjb21wdXRhdGlvblxuICpcbiAqIEBhcmcgbm9kZTEgICAgICA6IG5vZGUxJ3MgSURcbiAqIEBhcmcgbm9kZTIgICAgICA6IG5vZGUyJ3MgSURcbiAqIEBhcmcgZ3JhcGhJeCAgICA6IHN1YmdyYXBoIGluZGV4XG4gKiBAYXJnIGxheW91dEluZm8gOiBsYXlvdXRJbmZvIG9iamVjdFxuICpcbiAqIEByZXR1cm4gICAgICAgICA6IG9iamVjdCBvZiB0aGUgZm9ybSB7Y291bnQ6IFgsIGdyYXBoOiBZfSwgd2hlcmU6XG4gKiAgICAgICAgICAgICAgICAgICBYIGlzIHRoZSBudW1iZXIgb2YgYW5jZXN0b3JzIChtYXg6IDIpIGZvdW5kIGluXG4gKiAgICAgICAgICAgICAgICAgICBncmFwaEl4IChhbmQgaXQncyBzdWJncmFwaHMpLFxuICogICAgICAgICAgICAgICAgICAgWSBpcyB0aGUgZ3JhcGggaW5kZXggb2YgdGhlIGxvd2VzdCBncmFwaCBjb250YWluaW5nXG4gKiAgICAgICAgICAgICAgICAgICBhbGwgWCBub2Rlc1xuICovXG5cblxudmFyIGZpbmRMQ0FfYXV4ID0gZnVuY3Rpb24gZmluZExDQV9hdXgobm9kZTEsIG5vZGUyLCBncmFwaEl4LCBsYXlvdXRJbmZvKSB7XG4gIHZhciBncmFwaCA9IGxheW91dEluZm8uZ3JhcGhTZXRbZ3JhcGhJeF07IC8vIElmIGJvdGggbm9kZXMgYmVsb25ncyB0byBncmFwaEl4XG5cbiAgaWYgKC0xIDwgZ3JhcGguaW5kZXhPZihub2RlMSkgJiYgLTEgPCBncmFwaC5pbmRleE9mKG5vZGUyKSkge1xuICAgIHJldHVybiB7XG4gICAgICBjb3VudDogMixcbiAgICAgIGdyYXBoOiBncmFwaEl4XG4gICAgfTtcbiAgfSAvLyBNYWtlIHJlY3Vyc2l2ZSBjYWxscyBmb3IgYWxsIHN1YmdyYXBoc1xuXG5cbiAgdmFyIGMgPSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JhcGgubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZUlkID0gZ3JhcGhbaV07XG4gICAgdmFyIG5vZGVJeCA9IGxheW91dEluZm8uaWRUb0luZGV4W25vZGVJZF07XG4gICAgdmFyIGNoaWxkcmVuID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tub2RlSXhdLmNoaWxkcmVuOyAvLyBJZiB0aGUgbm9kZSBoYXMgbm8gY2hpbGQsIHNraXAgaXRcblxuICAgIGlmICgwID09PSBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBjaGlsZEdyYXBoSXggPSBsYXlvdXRJbmZvLmluZGV4VG9HcmFwaFtsYXlvdXRJbmZvLmlkVG9JbmRleFtjaGlsZHJlblswXV1dO1xuICAgIHZhciByZXN1bHQgPSBmaW5kTENBX2F1eChub2RlMSwgbm9kZTIsIGNoaWxkR3JhcGhJeCwgbGF5b3V0SW5mbyk7XG5cbiAgICBpZiAoMCA9PT0gcmVzdWx0LmNvdW50KSB7XG4gICAgICAvLyBOZWl0aGVyIG5vZGUxIG5vciBub2RlMiBhcmUgcHJlc2VudCBpbiB0aGlzIHN1YmdyYXBoXG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKDEgPT09IHJlc3VsdC5jb3VudCkge1xuICAgICAgLy8gT25lIG9mIChub2RlMSwgbm9kZTIpIGlzIHByZXNlbnQgaW4gdGhpcyBzdWJncmFwaFxuICAgICAgYysrO1xuXG4gICAgICBpZiAoMiA9PT0gYykge1xuICAgICAgICAvLyBXZSd2ZSBhbHJlYWR5IGZvdW5kIGJvdGggbm9kZXMsIG5vIG5lZWQgdG8ga2VlcCBzZWFyY2hpbmdcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEJvdGggbm9kZXMgYXJlIHByZXNlbnQgaW4gdGhpcyBzdWJncmFwaFxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNvdW50OiBjLFxuICAgIGdyYXBoOiBncmFwaEl4XG4gIH07XG59O1xuLyoqXG4gKiBAYnJpZWY6IHByaW50c0xheW91dEluZm8gaW50byBqcyBjb25zb2xlXG4gKiAgICAgICAgIE9ubHkgdXNlZCBmb3IgZGViYnVnaW5nXG4gKi9cblxuXG52YXIgcHJpbnRMYXlvdXRJbmZvOyBcbi8qKlxuICogQGJyaWVmIDogUmFuZG9taXplcyB0aGUgcG9zaXRpb24gb2YgYWxsIG5vZGVzXG4gKi9cblxuXG52YXIgcmFuZG9taXplUG9zaXRpb25zID0gZnVuY3Rpb24gcmFuZG9taXplUG9zaXRpb25zKGxheW91dEluZm8sIGN5KSB7XG4gIHZhciB3aWR0aCA9IGxheW91dEluZm8uY2xpZW50V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBsYXlvdXRJbmZvLmNsaWVudEhlaWdodDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8ubm9kZVNpemU7IGkrKykge1xuICAgIHZhciBuID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tpXTsgLy8gTm8gbmVlZCB0byByYW5kb21pemUgY29tcG91bmQgbm9kZXMgb3IgbG9ja2VkIG5vZGVzXG5cbiAgICBpZiAoMCA9PT0gbi5jaGlsZHJlbi5sZW5ndGggJiYgIW4uaXNMb2NrZWQpIHtcbiAgICAgIG4ucG9zaXRpb25YID0gTWF0aC5yYW5kb20oKSAqIHdpZHRoO1xuICAgICAgbi5wb3NpdGlvblkgPSBNYXRoLnJhbmRvbSgpICogaGVpZ2h0O1xuICAgIH1cbiAgfVxufTtcblxudmFyIGdldFNjYWxlSW5Cb3VuZHNGbiA9IGZ1bmN0aW9uIGdldFNjYWxlSW5Cb3VuZHNGbihsYXlvdXRJbmZvLCBvcHRpb25zLCBub2Rlcykge1xuICB2YXIgYmIgPSBsYXlvdXRJbmZvLmJvdW5kaW5nQm94O1xuICB2YXIgY29zZUJCID0ge1xuICAgIHgxOiBJbmZpbml0eSxcbiAgICB4MjogLUluZmluaXR5LFxuICAgIHkxOiBJbmZpbml0eSxcbiAgICB5MjogLUluZmluaXR5XG4gIH07XG5cbiAgaWYgKG9wdGlvbnMuYm91bmRpbmdCb3gpIHtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICB2YXIgbG5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W25vZGUuZGF0YSgnaWQnKV1dO1xuICAgICAgY29zZUJCLngxID0gTWF0aC5taW4oY29zZUJCLngxLCBsbm9kZS5wb3NpdGlvblgpO1xuICAgICAgY29zZUJCLngyID0gTWF0aC5tYXgoY29zZUJCLngyLCBsbm9kZS5wb3NpdGlvblgpO1xuICAgICAgY29zZUJCLnkxID0gTWF0aC5taW4oY29zZUJCLnkxLCBsbm9kZS5wb3NpdGlvblkpO1xuICAgICAgY29zZUJCLnkyID0gTWF0aC5tYXgoY29zZUJCLnkyLCBsbm9kZS5wb3NpdGlvblkpO1xuICAgIH0pO1xuICAgIGNvc2VCQi53ID0gY29zZUJCLngyIC0gY29zZUJCLngxO1xuICAgIGNvc2VCQi5oID0gY29zZUJCLnkyIC0gY29zZUJCLnkxO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChlbGUsIGkpIHtcbiAgICB2YXIgbG5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W2VsZS5kYXRhKCdpZCcpXV07XG5cbiAgICBpZiAob3B0aW9ucy5ib3VuZGluZ0JveCkge1xuICAgICAgLy8gdGhlbiBhZGQgZXh0cmEgYm91bmRpbmcgYm94IGNvbnN0cmFpbnRcbiAgICAgIHZhciBwY3RYID0gKGxub2RlLnBvc2l0aW9uWCAtIGNvc2VCQi54MSkgLyBjb3NlQkIudztcbiAgICAgIHZhciBwY3RZID0gKGxub2RlLnBvc2l0aW9uWSAtIGNvc2VCQi55MSkgLyBjb3NlQkIuaDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IGJiLngxICsgcGN0WCAqIGJiLncsXG4gICAgICAgIHk6IGJiLnkxICsgcGN0WSAqIGJiLmhcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IGxub2RlLnBvc2l0aW9uWCxcbiAgICAgICAgeTogbG5vZGUucG9zaXRpb25ZXG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn07XG4vKipcbiAqIEBicmllZiAgICAgICAgICA6IFVwZGF0ZXMgdGhlIHBvc2l0aW9ucyBvZiBub2RlcyBpbiB0aGUgbmV0d29ya1xuICogQGFyZyBsYXlvdXRJbmZvIDogTGF5b3V0SW5mbyBvYmplY3RcbiAqIEBhcmcgY3kgICAgICAgICA6IEN5dG9zY2FwZSBvYmplY3RcbiAqIEBhcmcgb3B0aW9ucyAgICA6IExheW91dCBvcHRpb25zXG4gKi9cblxuXG52YXIgcmVmcmVzaFBvc2l0aW9ucyA9IGZ1bmN0aW9uIHJlZnJlc2hQb3NpdGlvbnMobGF5b3V0SW5mbywgY3ksIG9wdGlvbnMpIHtcbiAgLy8gdmFyIHMgPSAnUmVmcmVzaGluZyBwb3NpdGlvbnMnO1xuICAvLyBsb2dEZWJ1ZyhzKTtcbiAgdmFyIGxheW91dCA9IG9wdGlvbnMubGF5b3V0O1xuICB2YXIgbm9kZXMgPSBvcHRpb25zLmVsZXMubm9kZXMoKTtcbiAgdmFyIGdldFNjYWxlZFBvcyA9IGdldFNjYWxlSW5Cb3VuZHNGbihsYXlvdXRJbmZvLCBvcHRpb25zLCBub2Rlcyk7XG4gIG5vZGVzLnBvc2l0aW9ucyhnZXRTY2FsZWRQb3MpOyAvLyBUcmlnZ2VyIGxheW91dFJlYWR5IG9ubHkgb24gZmlyc3QgY2FsbFxuXG4gIGlmICh0cnVlICE9PSBsYXlvdXRJbmZvLnJlYWR5KSB7XG4gICAgLy8gcyA9ICdUcmlnZ2VyaW5nIGxheW91dHJlYWR5JztcbiAgICAvLyBsb2dEZWJ1ZyhzKTtcbiAgICBsYXlvdXRJbmZvLnJlYWR5ID0gdHJ1ZTtcbiAgICBsYXlvdXQub25lKCdsYXlvdXRyZWFkeScsIG9wdGlvbnMucmVhZHkpO1xuICAgIGxheW91dC5lbWl0KHtcbiAgICAgIHR5cGU6ICdsYXlvdXRyZWFkeScsXG4gICAgICBsYXlvdXQ6IHRoaXNcbiAgICB9KTtcbiAgfVxufTtcbi8qKlxuICogQGJyaWVmIDogTG9ncyBhIGRlYnVnIG1lc3NhZ2UgaW4gSlMgY29uc29sZSwgaWYgREVCVUcgaXMgT05cbiAqL1xuLy8gdmFyIGxvZ0RlYnVnID0gZnVuY3Rpb24odGV4dCkge1xuLy8gICBpZiAoREVCVUcpIHtcbi8vICAgICBjb25zb2xlLmRlYnVnKHRleHQpO1xuLy8gICB9XG4vLyB9O1xuXG4vKipcbiAqIEBicmllZiAgICAgICAgICA6IFBlcmZvcm1zIG9uZSBpdGVyYXRpb24gb2YgdGhlIHBoeXNpY2FsIHNpbXVsYXRpb25cbiAqIEBhcmcgbGF5b3V0SW5mbyA6IExheW91dEluZm8gb2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAqIEBhcmcgY3kgICAgICAgICA6IEN5dG9zY2FwZSBvYmplY3RcbiAqIEBhcmcgb3B0aW9ucyAgICA6IExheW91dCBvcHRpb25zXG4gKi9cblxuXG52YXIgc3RlcCA9IGZ1bmN0aW9uIHN0ZXAobGF5b3V0SW5mbywgb3B0aW9ucywgX3N0ZXApIHtcbiAgLy8gdmFyIHMgPSBcIlxcblxcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcIjtcbiAgLy8gcyArPSBcIlxcblNURVA6IFwiICsgc3RlcDtcbiAgLy8gcyArPSBcIlxcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcXG5cIjtcbiAgLy8gbG9nRGVidWcocyk7XG4gIC8vIENhbGN1bGF0ZSBub2RlIHJlcHVsc2lvbnNcbiAgY2FsY3VsYXRlTm9kZUZvcmNlcyhsYXlvdXRJbmZvLCBvcHRpb25zKTsgLy8gQ2FsY3VsYXRlIGVkZ2UgZm9yY2VzXG5cbiAgY2FsY3VsYXRlRWRnZUZvcmNlcyhsYXlvdXRJbmZvKTsgLy8gQ2FsY3VsYXRlIGdyYXZpdHkgZm9yY2VzXG5cbiAgY2FsY3VsYXRlR3Jhdml0eUZvcmNlcyhsYXlvdXRJbmZvLCBvcHRpb25zKTsgLy8gUHJvcGFnYXRlIGZvcmNlcyBmcm9tIHBhcmVudCB0byBjaGlsZFxuXG4gIHByb3BhZ2F0ZUZvcmNlcyhsYXlvdXRJbmZvKTsgLy8gVXBkYXRlIHBvc2l0aW9ucyBiYXNlZCBvbiBjYWxjdWxhdGVkIGZvcmNlc1xuXG4gIHVwZGF0ZVBvc2l0aW9ucyhsYXlvdXRJbmZvKTtcbn07XG4vKipcbiAqIEBicmllZiA6IENvbXB1dGVzIHRoZSBub2RlIHJlcHVsc2lvbiBmb3JjZXNcbiAqL1xuXG5cbnZhciBjYWxjdWxhdGVOb2RlRm9yY2VzID0gZnVuY3Rpb24gY2FsY3VsYXRlTm9kZUZvcmNlcyhsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG4gIC8vIEdvIHRocm91Z2ggZWFjaCBvZiB0aGUgZ3JhcGhzIGluIGdyYXBoU2V0XG4gIC8vIE5vZGVzIG9ubHkgcmVwZWwgZWFjaCBvdGhlciBpZiB0aGV5IGJlbG9uZyB0byB0aGUgc2FtZSBncmFwaFxuICAvLyB2YXIgcyA9ICdjYWxjdWxhdGVOb2RlRm9yY2VzJztcbiAgLy8gbG9nRGVidWcocyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5ncmFwaFNldC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBncmFwaCA9IGxheW91dEluZm8uZ3JhcGhTZXRbaV07XG4gICAgdmFyIG51bU5vZGVzID0gZ3JhcGgubGVuZ3RoOyAvLyBzID0gXCJTZXQ6IFwiICsgZ3JhcGgudG9TdHJpbmcoKTtcbiAgICAvLyBsb2dEZWJ1ZyhzKTtcbiAgICAvLyBOb3cgZ2V0IGFsbCB0aGUgcGFpcnMgb2Ygbm9kZXNcbiAgICAvLyBPbmx5IGdldCBlYWNoIHBhaXIgb25jZSwgKEEsIEIpID0gKEIsIEEpXG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG51bU5vZGVzOyBqKyspIHtcbiAgICAgIHZhciBub2RlMSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbZ3JhcGhbal1dXTtcblxuICAgICAgZm9yICh2YXIgayA9IGogKyAxOyBrIDwgbnVtTm9kZXM7IGsrKykge1xuICAgICAgICB2YXIgbm9kZTIgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W2dyYXBoW2tdXV07XG4gICAgICAgIG5vZGVSZXB1bHNpb24obm9kZTEsIG5vZGUyLCBsYXlvdXRJbmZvLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbnZhciByYW5kb21EaXN0YW5jZSA9IGZ1bmN0aW9uIHJhbmRvbURpc3RhbmNlKG1heCkge1xuICByZXR1cm4gLW1heCArIDIgKiBtYXggKiBNYXRoLnJhbmRvbSgpO1xufTtcbi8qKlxuICogQGJyaWVmIDogQ29tcHV0ZSB0aGUgbm9kZSByZXB1bHNpb24gZm9yY2VzIGJldHdlZW4gYSBwYWlyIG9mIG5vZGVzXG4gKi9cblxuXG52YXIgbm9kZVJlcHVsc2lvbiA9IGZ1bmN0aW9uIG5vZGVSZXB1bHNpb24obm9kZTEsIG5vZGUyLCBsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG4gIC8vIHZhciBzID0gXCJOb2RlIHJlcHVsc2lvbi4gTm9kZTE6IFwiICsgbm9kZTEuaWQgKyBcIiBOb2RlMjogXCIgKyBub2RlMi5pZDtcbiAgdmFyIGNtcHRJZDEgPSBub2RlMS5jbXB0SWQ7XG4gIHZhciBjbXB0SWQyID0gbm9kZTIuY21wdElkO1xuXG4gIGlmIChjbXB0SWQxICE9PSBjbXB0SWQyICYmICFsYXlvdXRJbmZvLmlzQ29tcG91bmQpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gR2V0IGRpcmVjdGlvbiBvZiBsaW5lIGNvbm5lY3RpbmcgYm90aCBub2RlIGNlbnRlcnNcblxuXG4gIHZhciBkaXJlY3Rpb25YID0gbm9kZTIucG9zaXRpb25YIC0gbm9kZTEucG9zaXRpb25YO1xuICB2YXIgZGlyZWN0aW9uWSA9IG5vZGUyLnBvc2l0aW9uWSAtIG5vZGUxLnBvc2l0aW9uWTtcbiAgdmFyIG1heFJhbmREaXN0ID0gMTsgLy8gcyArPSBcIlxcbmRpcmVjdGlvblg6IFwiICsgZGlyZWN0aW9uWCArIFwiLCBkaXJlY3Rpb25ZOiBcIiArIGRpcmVjdGlvblk7XG4gIC8vIElmIGJvdGggY2VudGVycyBhcmUgdGhlIHNhbWUsIGFwcGx5IGEgcmFuZG9tIGZvcmNlXG5cbiAgaWYgKDAgPT09IGRpcmVjdGlvblggJiYgMCA9PT0gZGlyZWN0aW9uWSkge1xuICAgIGRpcmVjdGlvblggPSByYW5kb21EaXN0YW5jZShtYXhSYW5kRGlzdCk7XG4gICAgZGlyZWN0aW9uWSA9IHJhbmRvbURpc3RhbmNlKG1heFJhbmREaXN0KTtcbiAgfVxuXG4gIHZhciBvdmVybGFwID0gbm9kZXNPdmVybGFwKG5vZGUxLCBub2RlMiwgZGlyZWN0aW9uWCwgZGlyZWN0aW9uWSk7XG5cbiAgaWYgKG92ZXJsYXAgPiAwKSB7XG4gICAgLy8gcyArPSBcIlxcbk5vZGVzIERPIG92ZXJsYXAuXCI7XG4gICAgLy8gcyArPSBcIlxcbk92ZXJsYXA6IFwiICsgb3ZlcmxhcDtcbiAgICAvLyBJZiBub2RlcyBvdmVybGFwLCByZXB1bHNpb24gZm9yY2UgaXMgcHJvcG9ydGlvbmFsXG4gICAgLy8gdG8gdGhlIG92ZXJsYXBcbiAgICB2YXIgZm9yY2UgPSBvcHRpb25zLm5vZGVPdmVybGFwICogb3ZlcmxhcDsgLy8gQ29tcHV0ZSB0aGUgbW9kdWxlIGFuZCBjb21wb25lbnRzIG9mIHRoZSBmb3JjZSB2ZWN0b3JcblxuICAgIHZhciBkaXN0YW5jZSA9IE1hdGguc3FydChkaXJlY3Rpb25YICogZGlyZWN0aW9uWCArIGRpcmVjdGlvblkgKiBkaXJlY3Rpb25ZKTsgLy8gcyArPSBcIlxcbkRpc3RhbmNlOiBcIiArIGRpc3RhbmNlO1xuXG4gICAgdmFyIGZvcmNlWCA9IGZvcmNlICogZGlyZWN0aW9uWCAvIGRpc3RhbmNlO1xuICAgIHZhciBmb3JjZVkgPSBmb3JjZSAqIGRpcmVjdGlvblkgLyBkaXN0YW5jZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBzICs9IFwiXFxuTm9kZXMgZG8gTk9UIG92ZXJsYXAuXCI7XG4gICAgLy8gSWYgdGhlcmUncyBubyBvdmVybGFwLCBmb3JjZSBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsXG4gICAgLy8gdG8gc3F1YXJlZCBkaXN0YW5jZVxuICAgIC8vIEdldCBjbGlwcGluZyBwb2ludHMgZm9yIGJvdGggbm9kZXNcbiAgICB2YXIgcG9pbnQxID0gZmluZENsaXBwaW5nUG9pbnQobm9kZTEsIGRpcmVjdGlvblgsIGRpcmVjdGlvblkpO1xuICAgIHZhciBwb2ludDIgPSBmaW5kQ2xpcHBpbmdQb2ludChub2RlMiwgLTEgKiBkaXJlY3Rpb25YLCAtMSAqIGRpcmVjdGlvblkpOyAvLyBVc2UgY2xpcHBpbmcgcG9pbnRzIHRvIGNvbXB1dGUgZGlzdGFuY2VcblxuICAgIHZhciBkaXN0YW5jZVggPSBwb2ludDIueCAtIHBvaW50MS54O1xuICAgIHZhciBkaXN0YW5jZVkgPSBwb2ludDIueSAtIHBvaW50MS55O1xuICAgIHZhciBkaXN0YW5jZVNxciA9IGRpc3RhbmNlWCAqIGRpc3RhbmNlWCArIGRpc3RhbmNlWSAqIGRpc3RhbmNlWTtcbiAgICB2YXIgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGlzdGFuY2VTcXIpOyAvLyBzICs9IFwiXFxuRGlzdGFuY2U6IFwiICsgZGlzdGFuY2U7XG4gICAgLy8gQ29tcHV0ZSB0aGUgbW9kdWxlIGFuZCBjb21wb25lbnRzIG9mIHRoZSBmb3JjZSB2ZWN0b3JcblxuICAgIHZhciBmb3JjZSA9IChub2RlMS5ub2RlUmVwdWxzaW9uICsgbm9kZTIubm9kZVJlcHVsc2lvbikgLyBkaXN0YW5jZVNxcjtcbiAgICB2YXIgZm9yY2VYID0gZm9yY2UgKiBkaXN0YW5jZVggLyBkaXN0YW5jZTtcbiAgICB2YXIgZm9yY2VZID0gZm9yY2UgKiBkaXN0YW5jZVkgLyBkaXN0YW5jZTtcbiAgfSAvLyBBcHBseSBmb3JjZVxuXG5cbiAgaWYgKCFub2RlMS5pc0xvY2tlZCkge1xuICAgIG5vZGUxLm9mZnNldFggLT0gZm9yY2VYO1xuICAgIG5vZGUxLm9mZnNldFkgLT0gZm9yY2VZO1xuICB9XG5cbiAgaWYgKCFub2RlMi5pc0xvY2tlZCkge1xuICAgIG5vZGUyLm9mZnNldFggKz0gZm9yY2VYO1xuICAgIG5vZGUyLm9mZnNldFkgKz0gZm9yY2VZO1xuICB9IC8vIHMgKz0gXCJcXG5Gb3JjZVg6IFwiICsgZm9yY2VYICsgXCIgRm9yY2VZOiBcIiArIGZvcmNlWTtcbiAgLy8gbG9nRGVidWcocyk7XG5cblxuICByZXR1cm47XG59O1xuLyoqXG4gKiBAYnJpZWYgIDogRGV0ZXJtaW5lcyB3aGV0aGVyIHR3byBub2RlcyBvdmVybGFwIG9yIG5vdFxuICogQHJldHVybiA6IEFtb3VudCBvZiBvdmVybGFwcGluZyAoMCA9PiBubyBvdmVybGFwKVxuICovXG5cblxudmFyIG5vZGVzT3ZlcmxhcCA9IGZ1bmN0aW9uIG5vZGVzT3ZlcmxhcChub2RlMSwgbm9kZTIsIGRYLCBkWSkge1xuICBpZiAoZFggPiAwKSB7XG4gICAgdmFyIG92ZXJsYXBYID0gbm9kZTEubWF4WCAtIG5vZGUyLm1pblg7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG92ZXJsYXBYID0gbm9kZTIubWF4WCAtIG5vZGUxLm1pblg7XG4gIH1cblxuICBpZiAoZFkgPiAwKSB7XG4gICAgdmFyIG92ZXJsYXBZID0gbm9kZTEubWF4WSAtIG5vZGUyLm1pblk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG92ZXJsYXBZID0gbm9kZTIubWF4WSAtIG5vZGUxLm1pblk7XG4gIH1cblxuICBpZiAob3ZlcmxhcFggPj0gMCAmJiBvdmVybGFwWSA+PSAwKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydChvdmVybGFwWCAqIG92ZXJsYXBYICsgb3ZlcmxhcFkgKiBvdmVybGFwWSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG4vKipcbiAqIEBicmllZiA6IEZpbmRzIHRoZSBwb2ludCBpbiB3aGljaCBhbiBlZGdlIChkaXJlY3Rpb24gZFgsIGRZKSBpbnRlcnNlY3RzXG4gKiAgICAgICAgICB0aGUgcmVjdGFuZ3VsYXIgYm91bmRpbmcgYm94IG9mIGl0J3Mgc291cmNlL3RhcmdldCBub2RlXG4gKi9cblxuXG52YXIgZmluZENsaXBwaW5nUG9pbnQgPSBmdW5jdGlvbiBmaW5kQ2xpcHBpbmdQb2ludChub2RlLCBkWCwgZFkpIHtcbiAgLy8gU2hvcmN1dHNcbiAgdmFyIFggPSBub2RlLnBvc2l0aW9uWDtcbiAgdmFyIFkgPSBub2RlLnBvc2l0aW9uWTtcbiAgdmFyIEggPSBub2RlLmhlaWdodCB8fCAxO1xuICB2YXIgVyA9IG5vZGUud2lkdGggfHwgMTtcbiAgdmFyIGRpclNsb3BlID0gZFkgLyBkWDtcbiAgdmFyIG5vZGVTbG9wZSA9IEggLyBXOyAvLyB2YXIgcyA9ICdDb21wdXRpbmcgY2xpcHBpbmcgcG9pbnQgb2Ygbm9kZSAnICsgbm9kZS5pZCArXG4gIC8vICAgXCIgLiBIZWlnaHQ6ICBcIiArIEggKyBcIiwgV2lkdGg6IFwiICsgVyArXG4gIC8vICAgXCJcXG5EaXJlY3Rpb24gXCIgKyBkWCArIFwiLCBcIiArIGRZO1xuICAvL1xuICAvLyBDb21wdXRlIGludGVyc2VjdGlvblxuXG4gIHZhciByZXMgPSB7fTsgLy8gQ2FzZTogVmVydGljYWwgZGlyZWN0aW9uICh1cClcblxuICBpZiAoMCA9PT0gZFggJiYgMCA8IGRZKSB7XG4gICAgcmVzLnggPSBYOyAvLyBzICs9IFwiXFxuVXAgZGlyZWN0aW9uXCI7XG5cbiAgICByZXMueSA9IFkgKyBIIC8gMjtcbiAgICByZXR1cm4gcmVzO1xuICB9IC8vIENhc2U6IFZlcnRpY2FsIGRpcmVjdGlvbiAoZG93bilcblxuXG4gIGlmICgwID09PSBkWCAmJiAwID4gZFkpIHtcbiAgICByZXMueCA9IFg7XG4gICAgcmVzLnkgPSBZICsgSCAvIDI7IC8vIHMgKz0gXCJcXG5Eb3duIGRpcmVjdGlvblwiO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfSAvLyBDYXNlOiBJbnRlcnNlY3RzIHRoZSByaWdodCBib3JkZXJcblxuXG4gIGlmICgwIDwgZFggJiYgLTEgKiBub2RlU2xvcGUgPD0gZGlyU2xvcGUgJiYgZGlyU2xvcGUgPD0gbm9kZVNsb3BlKSB7XG4gICAgcmVzLnggPSBYICsgVyAvIDI7XG4gICAgcmVzLnkgPSBZICsgVyAqIGRZIC8gMiAvIGRYOyAvLyBzICs9IFwiXFxuUmlnaHRib3JkZXJcIjtcblxuICAgIHJldHVybiByZXM7XG4gIH0gLy8gQ2FzZTogSW50ZXJzZWN0cyB0aGUgbGVmdCBib3JkZXJcblxuXG4gIGlmICgwID4gZFggJiYgLTEgKiBub2RlU2xvcGUgPD0gZGlyU2xvcGUgJiYgZGlyU2xvcGUgPD0gbm9kZVNsb3BlKSB7XG4gICAgcmVzLnggPSBYIC0gVyAvIDI7XG4gICAgcmVzLnkgPSBZIC0gVyAqIGRZIC8gMiAvIGRYOyAvLyBzICs9IFwiXFxuTGVmdGJvcmRlclwiO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfSAvLyBDYXNlOiBJbnRlcnNlY3RzIHRoZSB0b3AgYm9yZGVyXG5cblxuICBpZiAoMCA8IGRZICYmIChkaXJTbG9wZSA8PSAtMSAqIG5vZGVTbG9wZSB8fCBkaXJTbG9wZSA+PSBub2RlU2xvcGUpKSB7XG4gICAgcmVzLnggPSBYICsgSCAqIGRYIC8gMiAvIGRZO1xuICAgIHJlcy55ID0gWSArIEggLyAyOyAvLyBzICs9IFwiXFxuVG9wIGJvcmRlclwiO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfSAvLyBDYXNlOiBJbnRlcnNlY3RzIHRoZSBib3R0b20gYm9yZGVyXG5cblxuICBpZiAoMCA+IGRZICYmIChkaXJTbG9wZSA8PSAtMSAqIG5vZGVTbG9wZSB8fCBkaXJTbG9wZSA+PSBub2RlU2xvcGUpKSB7XG4gICAgcmVzLnggPSBYIC0gSCAqIGRYIC8gMiAvIGRZO1xuICAgIHJlcy55ID0gWSAtIEggLyAyOyAvLyBzICs9IFwiXFxuQm90dG9tIGJvcmRlclwiO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfSAvLyBzICs9IFwiXFxuQ2xpcHBpbmcgcG9pbnQgZm91bmQgYXQgXCIgKyByZXMueCArIFwiLCBcIiArIHJlcy55O1xuICAvLyBsb2dEZWJ1ZyhzKTtcblxuXG4gIHJldHVybiByZXM7XG59O1xuLyoqXG4gKiBAYnJpZWYgOiBDYWxjdWxhdGVzIGFsbCBlZGdlIGZvcmNlc1xuICovXG5cblxudmFyIGNhbGN1bGF0ZUVkZ2VGb3JjZXMgPSBmdW5jdGlvbiBjYWxjdWxhdGVFZGdlRm9yY2VzKGxheW91dEluZm8sIG9wdGlvbnMpIHtcbiAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBlZGdlc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8uZWRnZVNpemU7IGkrKykge1xuICAgIC8vIEdldCBlZGdlLCBzb3VyY2UgJiB0YXJnZXQgbm9kZXNcbiAgICB2YXIgZWRnZSA9IGxheW91dEluZm8ubGF5b3V0RWRnZXNbaV07XG4gICAgdmFyIHNvdXJjZUl4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbZWRnZS5zb3VyY2VJZF07XG4gICAgdmFyIHNvdXJjZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbc291cmNlSXhdO1xuICAgIHZhciB0YXJnZXRJeCA9IGxheW91dEluZm8uaWRUb0luZGV4W2VkZ2UudGFyZ2V0SWRdO1xuICAgIHZhciB0YXJnZXQgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW3RhcmdldEl4XTsgLy8gR2V0IGRpcmVjdGlvbiBvZiBsaW5lIGNvbm5lY3RpbmcgYm90aCBub2RlIGNlbnRlcnNcblxuICAgIHZhciBkaXJlY3Rpb25YID0gdGFyZ2V0LnBvc2l0aW9uWCAtIHNvdXJjZS5wb3NpdGlvblg7XG4gICAgdmFyIGRpcmVjdGlvblkgPSB0YXJnZXQucG9zaXRpb25ZIC0gc291cmNlLnBvc2l0aW9uWTsgLy8gSWYgYm90aCBjZW50ZXJzIGFyZSB0aGUgc2FtZSwgZG8gbm90aGluZy5cbiAgICAvLyBBIHJhbmRvbSBmb3JjZSBoYXMgYWxyZWFkeSBiZWVuIGFwcGxpZWQgYXMgbm9kZSByZXB1bHNpb25cblxuICAgIGlmICgwID09PSBkaXJlY3Rpb25YICYmIDAgPT09IGRpcmVjdGlvblkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gLy8gR2V0IGNsaXBwaW5nIHBvaW50cyBmb3IgYm90aCBub2Rlc1xuXG5cbiAgICB2YXIgcG9pbnQxID0gZmluZENsaXBwaW5nUG9pbnQoc291cmNlLCBkaXJlY3Rpb25YLCBkaXJlY3Rpb25ZKTtcbiAgICB2YXIgcG9pbnQyID0gZmluZENsaXBwaW5nUG9pbnQodGFyZ2V0LCAtMSAqIGRpcmVjdGlvblgsIC0xICogZGlyZWN0aW9uWSk7XG4gICAgdmFyIGx4ID0gcG9pbnQyLnggLSBwb2ludDEueDtcbiAgICB2YXIgbHkgPSBwb2ludDIueSAtIHBvaW50MS55O1xuICAgIHZhciBsID0gTWF0aC5zcXJ0KGx4ICogbHggKyBseSAqIGx5KTtcbiAgICB2YXIgZm9yY2UgPSBNYXRoLnBvdyhlZGdlLmlkZWFsTGVuZ3RoIC0gbCwgMikgLyBlZGdlLmVsYXN0aWNpdHk7XG5cbiAgICBpZiAoMCAhPT0gbCkge1xuICAgICAgdmFyIGZvcmNlWCA9IGZvcmNlICogbHggLyBsO1xuICAgICAgdmFyIGZvcmNlWSA9IGZvcmNlICogbHkgLyBsO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZm9yY2VYID0gMDtcbiAgICAgIHZhciBmb3JjZVkgPSAwO1xuICAgIH0gLy8gQWRkIHRoaXMgZm9yY2UgdG8gdGFyZ2V0IGFuZCBzb3VyY2Ugbm9kZXNcblxuXG4gICAgaWYgKCFzb3VyY2UuaXNMb2NrZWQpIHtcbiAgICAgIHNvdXJjZS5vZmZzZXRYICs9IGZvcmNlWDtcbiAgICAgIHNvdXJjZS5vZmZzZXRZICs9IGZvcmNlWTtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldC5pc0xvY2tlZCkge1xuICAgICAgdGFyZ2V0Lm9mZnNldFggLT0gZm9yY2VYO1xuICAgICAgdGFyZ2V0Lm9mZnNldFkgLT0gZm9yY2VZO1xuICAgIH0gLy8gdmFyIHMgPSAnRWRnZSBmb3JjZSBiZXR3ZWVuIG5vZGVzICcgKyBzb3VyY2UuaWQgKyAnIGFuZCAnICsgdGFyZ2V0LmlkO1xuICAgIC8vIHMgKz0gXCJcXG5EaXN0YW5jZTogXCIgKyBsICsgXCIgRm9yY2U6IChcIiArIGZvcmNlWCArIFwiLCBcIiArIGZvcmNlWSArIFwiKVwiO1xuICAgIC8vIGxvZ0RlYnVnKHMpO1xuXG4gIH1cbn07XG4vKipcbiAqIEBicmllZiA6IENvbXB1dGVzIGdyYXZpdHkgZm9yY2VzIGZvciBhbGwgbm9kZXNcbiAqL1xuXG5cbnZhciBjYWxjdWxhdGVHcmF2aXR5Rm9yY2VzID0gZnVuY3Rpb24gY2FsY3VsYXRlR3Jhdml0eUZvcmNlcyhsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLmdyYXZpdHkgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZGlzdFRocmVzaG9sZCA9IDE7IC8vIHZhciBzID0gJ2NhbGN1bGF0ZUdyYXZpdHlGb3JjZXMnO1xuICAvLyBsb2dEZWJ1ZyhzKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8uZ3JhcGhTZXQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZ3JhcGggPSBsYXlvdXRJbmZvLmdyYXBoU2V0W2ldO1xuICAgIHZhciBudW1Ob2RlcyA9IGdyYXBoLmxlbmd0aDsgLy8gcyA9IFwiU2V0OiBcIiArIGdyYXBoLnRvU3RyaW5nKCk7XG4gICAgLy8gbG9nRGVidWcocyk7XG4gICAgLy8gQ29tcHV0ZSBncmFwaCBjZW50ZXJcblxuICAgIGlmICgwID09PSBpKSB7XG4gICAgICB2YXIgY2VudGVyWCA9IGxheW91dEluZm8uY2xpZW50SGVpZ2h0IC8gMjtcbiAgICAgIHZhciBjZW50ZXJZID0gbGF5b3V0SW5mby5jbGllbnRXaWR0aCAvIDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEdldCBQYXJlbnQgbm9kZSBmb3IgdGhpcyBncmFwaCwgYW5kIHVzZSBpdHMgcG9zaXRpb24gYXMgY2VudGVyXG4gICAgICB2YXIgdGVtcCA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbZ3JhcGhbMF1dXTtcbiAgICAgIHZhciBwYXJlbnQgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W3RlbXAucGFyZW50SWRdXTtcbiAgICAgIHZhciBjZW50ZXJYID0gcGFyZW50LnBvc2l0aW9uWDtcbiAgICAgIHZhciBjZW50ZXJZID0gcGFyZW50LnBvc2l0aW9uWTtcbiAgICB9IC8vIHMgPSBcIkNlbnRlciBmb3VuZCBhdDogXCIgKyBjZW50ZXJYICsgXCIsIFwiICsgY2VudGVyWTtcbiAgICAvLyBsb2dEZWJ1ZyhzKTtcbiAgICAvLyBBcHBseSBmb3JjZSB0byBhbGwgbm9kZXMgaW4gZ3JhcGhcblxuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBudW1Ob2RlczsgaisrKSB7XG4gICAgICB2YXIgbm9kZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbZ3JhcGhbal1dXTsgLy8gcyA9IFwiTm9kZTogXCIgKyBub2RlLmlkO1xuXG4gICAgICBpZiAobm9kZS5pc0xvY2tlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGR4ID0gY2VudGVyWCAtIG5vZGUucG9zaXRpb25YO1xuICAgICAgdmFyIGR5ID0gY2VudGVyWSAtIG5vZGUucG9zaXRpb25ZO1xuICAgICAgdmFyIGQgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuXG4gICAgICBpZiAoZCA+IGRpc3RUaHJlc2hvbGQpIHtcbiAgICAgICAgdmFyIGZ4ID0gb3B0aW9ucy5ncmF2aXR5ICogZHggLyBkO1xuICAgICAgICB2YXIgZnkgPSBvcHRpb25zLmdyYXZpdHkgKiBkeSAvIGQ7XG4gICAgICAgIG5vZGUub2Zmc2V0WCArPSBmeDtcbiAgICAgICAgbm9kZS5vZmZzZXRZICs9IGZ5OyAvLyBzICs9IFwiOiBBcHBsaWVkIGZvcmNlOiBcIiArIGZ4ICsgXCIsIFwiICsgZnk7XG4gICAgICB9IC8vIGxvZ0RlYnVnKHMpO1xuXG4gICAgfVxuICB9XG59O1xuLyoqXG4gKiBAYnJpZWYgICAgICAgICAgOiBUaGlzIGZ1bmN0aW9uIHByb3BhZ2F0ZXMgdGhlIGV4aXN0aW5nIG9mZnNldHMgZnJvbVxuICogICAgICAgICAgICAgICAgICAgcGFyZW50IG5vZGVzIHRvIGl0cyBkZXNjZW5kZW50cy5cbiAqIEBhcmcgbGF5b3V0SW5mbyA6IGxheW91dEluZm8gT2JqZWN0XG4gKiBAYXJnIGN5ICAgICAgICAgOiBjeXRvc2NhcGUgT2JqZWN0XG4gKiBAYXJnIG9wdGlvbnMgICAgOiBMYXlvdXQgb3B0aW9uc1xuICovXG5cblxudmFyIHByb3BhZ2F0ZUZvcmNlcyA9IGZ1bmN0aW9uIHByb3BhZ2F0ZUZvcmNlcyhsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG4gIC8vIElubGluZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHF1ZXVlLCB1c2VkIGZvciB0cmF2ZXJzaW5nIHRoZSBncmFwaCBpbiBCRlMgb3JkZXJcbiAgdmFyIHF1ZXVlID0gW107XG4gIHZhciBzdGFydCA9IDA7IC8vIFBvaW50cyB0byB0aGUgc3RhcnQgdGhlIHF1ZXVlXG5cbiAgdmFyIGVuZCA9IC0xOyAvLyBQb2ludHMgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWVcbiAgLy8gbG9nRGVidWcoJ3Byb3BhZ2F0ZUZvcmNlcycpO1xuICAvLyBTdGFydCBieSB2aXNpdGluZyB0aGUgbm9kZXMgaW4gdGhlIHJvb3QgZ3JhcGhcblxuICBxdWV1ZS5wdXNoLmFwcGx5KHF1ZXVlLCBsYXlvdXRJbmZvLmdyYXBoU2V0WzBdKTtcbiAgZW5kICs9IGxheW91dEluZm8uZ3JhcGhTZXRbMF0ubGVuZ3RoOyAvLyBUcmF2ZXJzZSB0aGUgZ3JhcGgsIGxldmVsIGJ5IGxldmVsLFxuXG4gIHdoaWxlIChzdGFydCA8PSBlbmQpIHtcbiAgICAvLyBHZXQgdGhlIG5vZGUgdG8gdmlzaXQgYW5kIHJlbW92ZSBpdCBmcm9tIHF1ZXVlXG4gICAgdmFyIG5vZGVJZCA9IHF1ZXVlW3N0YXJ0KytdO1xuICAgIHZhciBub2RlSW5kZXggPSBsYXlvdXRJbmZvLmlkVG9JbmRleFtub2RlSWRdO1xuICAgIHZhciBub2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tub2RlSW5kZXhdO1xuICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47IC8vIFdlIG9ubHkgbmVlZCB0byBwcm9jZXNzIHRoZSBub2RlIGlmIGl0J3MgY29tcG91bmRcblxuICAgIGlmICgwIDwgY2hpbGRyZW4ubGVuZ3RoICYmICFub2RlLmlzTG9ja2VkKSB7XG4gICAgICB2YXIgb2ZmWCA9IG5vZGUub2Zmc2V0WDtcbiAgICAgIHZhciBvZmZZID0gbm9kZS5vZmZzZXRZOyAvLyB2YXIgcyA9IFwiUHJvcGFnYXRpbmcgb2Zmc2V0IGZyb20gcGFyZW50IG5vZGUgOiBcIiArIG5vZGUuaWQgK1xuICAgICAgLy8gICBcIi4gT2Zmc2V0WDogXCIgKyBvZmZYICsgXCIuIE9mZnNldFk6IFwiICsgb2ZmWTtcbiAgICAgIC8vIHMgKz0gXCJcXG4gQ2hpbGRyZW46IFwiICsgY2hpbGRyZW4udG9TdHJpbmcoKTtcbiAgICAgIC8vIGxvZ0RlYnVnKHMpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZE5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W2NoaWxkcmVuW2ldXV07IC8vIFByb3BhZ2F0ZSBvZmZzZXRcblxuICAgICAgICBjaGlsZE5vZGUub2Zmc2V0WCArPSBvZmZYO1xuICAgICAgICBjaGlsZE5vZGUub2Zmc2V0WSArPSBvZmZZOyAvLyBBZGQgY2hpbGRyZW4gdG8gcXVldWUgdG8gYmUgdmlzaXRlZFxuXG4gICAgICAgIHF1ZXVlWysrZW5kXSA9IGNoaWxkcmVuW2ldO1xuICAgICAgfSAvLyBSZXNldCBwYXJlbnQgb2Zmc2V0c1xuXG5cbiAgICAgIG5vZGUub2Zmc2V0WCA9IDA7XG4gICAgICBub2RlLm9mZnNldFkgPSAwO1xuICAgIH1cbiAgfVxufTtcbi8qKlxuICogQGJyaWVmIDogVXBkYXRlcyB0aGUgbGF5b3V0IG1vZGVsIHBvc2l0aW9ucywgYmFzZWQgb25cbiAqICAgICAgICAgIHRoZSBhY2N1bXVsYXRlZCBmb3JjZXNcbiAqL1xuXG5cbnZhciB1cGRhdGVQb3NpdGlvbnMgPSBmdW5jdGlvbiB1cGRhdGVQb3NpdGlvbnMobGF5b3V0SW5mbywgb3B0aW9ucykge1xuICAvLyB2YXIgcyA9ICdVcGRhdGluZyBwb3NpdGlvbnMnO1xuICAvLyBsb2dEZWJ1ZyhzKTtcbiAgLy8gUmVzZXQgYm91bmRhcmllcyBmb3IgY29tcG91bmQgbm9kZXNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLm5vZGVTaXplOyBpKyspIHtcbiAgICB2YXIgbiA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbaV07XG5cbiAgICBpZiAoMCA8IG4uY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAvLyBsb2dEZWJ1ZyhcIlJlc2V0dGluZyBib3VuZGFyaWVzIG9mIGNvbXBvdW5kIG5vZGU6IFwiICsgbi5pZCk7XG4gICAgICBuLm1heFggPSB1bmRlZmluZWQ7XG4gICAgICBuLm1pblggPSB1bmRlZmluZWQ7XG4gICAgICBuLm1heFkgPSB1bmRlZmluZWQ7XG4gICAgICBuLm1pblkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLm5vZGVTaXplOyBpKyspIHtcbiAgICB2YXIgbiA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbaV07XG5cbiAgICBpZiAoMCA8IG4uY2hpbGRyZW4ubGVuZ3RoIHx8IG4uaXNMb2NrZWQpIHtcbiAgICAgIC8vIE5vIG5lZWQgdG8gc2V0IGNvbXBvdW5kIG9yIGxvY2tlZCBub2RlIHBvc2l0aW9uXG4gICAgICAvLyBsb2dEZWJ1ZyhcIlNraXBwaW5nIHBvc2l0aW9uIHVwZGF0ZSBvZiBub2RlOiBcIiArIG4uaWQpO1xuICAgICAgY29udGludWU7XG4gICAgfSAvLyBzID0gXCJOb2RlOiBcIiArIG4uaWQgKyBcIiBQcmV2aW91cyBwb3NpdGlvbjogKFwiICtcbiAgICAvLyBuLnBvc2l0aW9uWCArIFwiLCBcIiArIG4ucG9zaXRpb25ZICsgXCIpLlwiO1xuICAgIC8vIExpbWl0IGRpc3BsYWNlbWVudCBpbiBvcmRlciB0byBpbXByb3ZlIHN0YWJpbGl0eVxuXG5cbiAgICB2YXIgdGVtcEZvcmNlID0gbGltaXRGb3JjZShuLm9mZnNldFgsIG4ub2Zmc2V0WSwgbGF5b3V0SW5mby50ZW1wZXJhdHVyZSk7XG4gICAgbi5wb3NpdGlvblggKz0gdGVtcEZvcmNlLng7XG4gICAgbi5wb3NpdGlvblkgKz0gdGVtcEZvcmNlLnk7XG4gICAgbi5vZmZzZXRYID0gMDtcbiAgICBuLm9mZnNldFkgPSAwO1xuICAgIG4ubWluWCA9IG4ucG9zaXRpb25YIC0gbi53aWR0aDtcbiAgICBuLm1heFggPSBuLnBvc2l0aW9uWCArIG4ud2lkdGg7XG4gICAgbi5taW5ZID0gbi5wb3NpdGlvblkgLSBuLmhlaWdodDtcbiAgICBuLm1heFkgPSBuLnBvc2l0aW9uWSArIG4uaGVpZ2h0OyAvLyBzICs9IFwiIE5ldyBQb3NpdGlvbjogKFwiICsgbi5wb3NpdGlvblggKyBcIiwgXCIgKyBuLnBvc2l0aW9uWSArIFwiKS5cIjtcbiAgICAvLyBsb2dEZWJ1ZyhzKTtcbiAgICAvLyBVcGRhdGUgYW5jZXN0cnkgYm91ZGFyaWVzXG5cbiAgICB1cGRhdGVBbmNlc3RyeUJvdW5kYXJpZXMobiwgbGF5b3V0SW5mbyk7XG4gIH0gLy8gVXBkYXRlIHNpemUsIHBvc2l0aW9uIG9mIGNvbXB1bmQgbm9kZXNcblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5ub2RlU2l6ZTsgaSsrKSB7XG4gICAgdmFyIG4gPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2ldO1xuXG4gICAgaWYgKDAgPCBuLmNoaWxkcmVuLmxlbmd0aCAmJiAhbi5pc0xvY2tlZCkge1xuICAgICAgbi5wb3NpdGlvblggPSAobi5tYXhYICsgbi5taW5YKSAvIDI7XG4gICAgICBuLnBvc2l0aW9uWSA9IChuLm1heFkgKyBuLm1pblkpIC8gMjtcbiAgICAgIG4ud2lkdGggPSBuLm1heFggLSBuLm1pblg7XG4gICAgICBuLmhlaWdodCA9IG4ubWF4WSAtIG4ubWluWTsgLy8gcyA9IFwiVXBkYXRpbmcgcG9zaXRpb24sIHNpemUgb2YgY29tcG91bmQgbm9kZSBcIiArIG4uaWQ7XG4gICAgICAvLyBzICs9IFwiXFxuUG9zaXRpb25YOiBcIiArIG4ucG9zaXRpb25YICsgXCIsIFBvc2l0aW9uWTogXCIgKyBuLnBvc2l0aW9uWTtcbiAgICAgIC8vIHMgKz0gXCJcXG5XaWR0aDogXCIgKyBuLndpZHRoICsgXCIsIEhlaWdodDogXCIgKyBuLmhlaWdodDtcbiAgICAgIC8vIGxvZ0RlYnVnKHMpO1xuICAgIH1cbiAgfVxufTtcbi8qKlxuICogQGJyaWVmIDogTGltaXRzIGEgZm9yY2UgKGZvcmNlWCwgZm9yY2VZKSB0byBiZSBub3RcbiAqICAgICAgICAgIGdyZWF0ZXIgKGluIG1vZHVsbykgdGhhbiBtYXguXG4gOCAgICAgICAgICBQcmVzZXJ2ZXMgZm9yY2UgZGlyZWN0aW9uLlxuICAqL1xuXG5cbnZhciBsaW1pdEZvcmNlID0gZnVuY3Rpb24gbGltaXRGb3JjZShmb3JjZVgsIGZvcmNlWSwgbWF4KSB7XG4gIC8vIHZhciBzID0gXCJMaW1pdGluZyBmb3JjZTogKFwiICsgZm9yY2VYICsgXCIsIFwiICsgZm9yY2VZICsgXCIpLiBNYXg6IFwiICsgbWF4O1xuICB2YXIgZm9yY2UgPSBNYXRoLnNxcnQoZm9yY2VYICogZm9yY2VYICsgZm9yY2VZICogZm9yY2VZKTtcblxuICBpZiAoZm9yY2UgPiBtYXgpIHtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgeDogbWF4ICogZm9yY2VYIC8gZm9yY2UsXG4gICAgICB5OiBtYXggKiBmb3JjZVkgLyBmb3JjZVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdmFyIHJlcyA9IHtcbiAgICAgIHg6IGZvcmNlWCxcbiAgICAgIHk6IGZvcmNlWVxuICAgIH07XG4gIH0gLy8gcyArPSBcIi5cXG5SZXN1bHQ6IChcIiArIHJlcy54ICsgXCIsIFwiICsgcmVzLnkgKyBcIilcIjtcbiAgLy8gbG9nRGVidWcocyk7XG5cblxuICByZXR1cm4gcmVzO1xufTtcbi8qKlxuICogQGJyaWVmIDogRnVuY3Rpb24gdXNlZCBmb3Iga2VlcGluZyB0cmFjayBvZiBjb21wb3VuZCBub2RlXG4gKiAgICAgICAgICBzaXplcywgc2luY2UgdGhleSBzaG91bGQgYm91bmQgYWxsIHRoZWlyIHN1Ym5vZGVzLlxuICovXG5cblxudmFyIHVwZGF0ZUFuY2VzdHJ5Qm91bmRhcmllcyA9IGZ1bmN0aW9uIHVwZGF0ZUFuY2VzdHJ5Qm91bmRhcmllcyhub2RlLCBsYXlvdXRJbmZvKSB7XG4gIC8vIHZhciBzID0gXCJQcm9wYWdhdGluZyBuZXcgcG9zaXRpb24vc2l6ZSBvZiBub2RlIFwiICsgbm9kZS5pZDtcbiAgdmFyIHBhcmVudElkID0gbm9kZS5wYXJlbnRJZDtcblxuICBpZiAobnVsbCA9PSBwYXJlbnRJZCkge1xuICAgIC8vIElmIHRoZXJlJ3Mgbm8gcGFyZW50LCB3ZSBhcmUgZG9uZVxuICAgIC8vIHMgKz0gXCIuIE5vIHBhcmVudCBub2RlLlwiO1xuICAgIC8vIGxvZ0RlYnVnKHMpO1xuICAgIHJldHVybjtcbiAgfSAvLyBHZXQgUGFyZW50IE5vZGVcblxuXG4gIHZhciBwID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtwYXJlbnRJZF1dO1xuICB2YXIgZmxhZyA9IGZhbHNlOyAvLyBNYXhYXG5cbiAgaWYgKG51bGwgPT0gcC5tYXhYIHx8IG5vZGUubWF4WCArIHAucGFkUmlnaHQgPiBwLm1heFgpIHtcbiAgICBwLm1heFggPSBub2RlLm1heFggKyBwLnBhZFJpZ2h0O1xuICAgIGZsYWcgPSB0cnVlOyAvLyBzICs9IFwiXFxuTmV3IG1heFggZm9yIHBhcmVudCBub2RlIFwiICsgcC5pZCArIFwiOiBcIiArIHAubWF4WDtcbiAgfSAvLyBNaW5YXG5cblxuICBpZiAobnVsbCA9PSBwLm1pblggfHwgbm9kZS5taW5YIC0gcC5wYWRMZWZ0IDwgcC5taW5YKSB7XG4gICAgcC5taW5YID0gbm9kZS5taW5YIC0gcC5wYWRMZWZ0O1xuICAgIGZsYWcgPSB0cnVlOyAvLyBzICs9IFwiXFxuTmV3IG1pblggZm9yIHBhcmVudCBub2RlIFwiICsgcC5pZCArIFwiOiBcIiArIHAubWluWDtcbiAgfSAvLyBNYXhZXG5cblxuICBpZiAobnVsbCA9PSBwLm1heFkgfHwgbm9kZS5tYXhZICsgcC5wYWRCb3R0b20gPiBwLm1heFkpIHtcbiAgICBwLm1heFkgPSBub2RlLm1heFkgKyBwLnBhZEJvdHRvbTtcbiAgICBmbGFnID0gdHJ1ZTsgLy8gcyArPSBcIlxcbk5ldyBtYXhZIGZvciBwYXJlbnQgbm9kZSBcIiArIHAuaWQgKyBcIjogXCIgKyBwLm1heFk7XG4gIH0gLy8gTWluWVxuXG5cbiAgaWYgKG51bGwgPT0gcC5taW5ZIHx8IG5vZGUubWluWSAtIHAucGFkVG9wIDwgcC5taW5ZKSB7XG4gICAgcC5taW5ZID0gbm9kZS5taW5ZIC0gcC5wYWRUb3A7XG4gICAgZmxhZyA9IHRydWU7IC8vIHMgKz0gXCJcXG5OZXcgbWluWSBmb3IgcGFyZW50IG5vZGUgXCIgKyBwLmlkICsgXCI6IFwiICsgcC5taW5ZO1xuICB9IC8vIElmIHVwZGF0ZWQgYm91bmRhcmllcywgcHJvcGFnYXRlIGNoYW5nZXMgdXB3YXJkXG5cblxuICBpZiAoZmxhZykge1xuICAgIC8vIGxvZ0RlYnVnKHMpO1xuICAgIHJldHVybiB1cGRhdGVBbmNlc3RyeUJvdW5kYXJpZXMocCwgbGF5b3V0SW5mbyk7XG4gIH0gLy8gcyArPSBcIi4gTm8gY2hhbmdlcyBpbiBib3VuZGFyaWVzL3Bvc2l0aW9uIG9mIHBhcmVudCBub2RlIFwiICsgcC5pZDtcbiAgLy8gbG9nRGVidWcocyk7XG5cblxuICByZXR1cm47XG59O1xuXG52YXIgc2VwYXJhdGVDb21wb25lbnRzID0gZnVuY3Rpb24gc2VwYXJhdGVDb21wb25lbnRzKGxheW91dEluZm8sIG9wdGlvbnMpIHtcbiAgdmFyIG5vZGVzID0gbGF5b3V0SW5mby5sYXlvdXROb2RlcztcbiAgdmFyIGNvbXBvbmVudHMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICB2YXIgY2lkID0gbm9kZS5jbXB0SWQ7XG4gICAgdmFyIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbY2lkXSA9IGNvbXBvbmVudHNbY2lkXSB8fCBbXTtcbiAgICBjb21wb25lbnQucHVzaChub2RlKTtcbiAgfVxuXG4gIHZhciB0b3RhbEEgPSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjID0gY29tcG9uZW50c1tpXTtcblxuICAgIGlmICghYykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgYy54MSA9IEluZmluaXR5O1xuICAgIGMueDIgPSAtSW5maW5pdHk7XG4gICAgYy55MSA9IEluZmluaXR5O1xuICAgIGMueTIgPSAtSW5maW5pdHk7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBuID0gY1tqXTtcbiAgICAgIGMueDEgPSBNYXRoLm1pbihjLngxLCBuLnBvc2l0aW9uWCAtIG4ud2lkdGggLyAyKTtcbiAgICAgIGMueDIgPSBNYXRoLm1heChjLngyLCBuLnBvc2l0aW9uWCArIG4ud2lkdGggLyAyKTtcbiAgICAgIGMueTEgPSBNYXRoLm1pbihjLnkxLCBuLnBvc2l0aW9uWSAtIG4uaGVpZ2h0IC8gMik7XG4gICAgICBjLnkyID0gTWF0aC5tYXgoYy55Miwgbi5wb3NpdGlvblkgKyBuLmhlaWdodCAvIDIpO1xuICAgIH1cblxuICAgIGMudyA9IGMueDIgLSBjLngxO1xuICAgIGMuaCA9IGMueTIgLSBjLnkxO1xuICAgIHRvdGFsQSArPSBjLncgKiBjLmg7XG4gIH1cblxuICBjb21wb25lbnRzLnNvcnQoZnVuY3Rpb24gKGMxLCBjMikge1xuICAgIHJldHVybiBjMi53ICogYzIuaCAtIGMxLncgKiBjMS5oO1xuICB9KTtcbiAgdmFyIHggPSAwO1xuICB2YXIgeSA9IDA7XG4gIHZhciB1c2VkVyA9IDA7XG4gIHZhciByb3dIID0gMDtcbiAgdmFyIG1heFJvd1cgPSBNYXRoLnNxcnQodG90YWxBKSAqIGxheW91dEluZm8uY2xpZW50V2lkdGggLyBsYXlvdXRJbmZvLmNsaWVudEhlaWdodDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYyA9IGNvbXBvbmVudHNbaV07XG5cbiAgICBpZiAoIWMpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgYy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIG4gPSBjW2pdO1xuXG4gICAgICBpZiAoIW4uaXNMb2NrZWQpIHtcbiAgICAgICAgbi5wb3NpdGlvblggKz0geCAtIGMueDE7XG4gICAgICAgIG4ucG9zaXRpb25ZICs9IHkgLSBjLnkxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHggKz0gYy53ICsgb3B0aW9ucy5jb21wb25lbnRTcGFjaW5nO1xuICAgIHVzZWRXICs9IGMudyArIG9wdGlvbnMuY29tcG9uZW50U3BhY2luZztcbiAgICByb3dIID0gTWF0aC5tYXgocm93SCwgYy5oKTtcblxuICAgIGlmICh1c2VkVyA+IG1heFJvd1cpIHtcbiAgICAgIHkgKz0gcm93SCArIG9wdGlvbnMuY29tcG9uZW50U3BhY2luZztcbiAgICAgIHggPSAwO1xuICAgICAgdXNlZFcgPSAwO1xuICAgICAgcm93SCA9IDA7XG4gICAgfVxuICB9XG59O1xuXG52YXIgZGVmYXVsdHMkMyA9IHtcbiAgZml0OiB0cnVlLFxuICAvLyB3aGV0aGVyIHRvIGZpdCB0aGUgdmlld3BvcnQgdG8gdGhlIGdyYXBoXG4gIHBhZGRpbmc6IDMwLFxuICAvLyBwYWRkaW5nIHVzZWQgb24gZml0XG4gIGJvdW5kaW5nQm94OiB1bmRlZmluZWQsXG4gIC8vIGNvbnN0cmFpbiBsYXlvdXQgYm91bmRzOyB7IHgxLCB5MSwgeDIsIHkyIH0gb3IgeyB4MSwgeTEsIHcsIGggfVxuICBhdm9pZE92ZXJsYXA6IHRydWUsXG4gIC8vIHByZXZlbnRzIG5vZGUgb3ZlcmxhcCwgbWF5IG92ZXJmbG93IGJvdW5kaW5nQm94IGlmIG5vdCBlbm91Z2ggc3BhY2VcbiAgYXZvaWRPdmVybGFwUGFkZGluZzogMTAsXG4gIC8vIGV4dHJhIHNwYWNpbmcgYXJvdW5kIG5vZGVzIHdoZW4gYXZvaWRPdmVybGFwOiB0cnVlXG4gIG5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsczogZmFsc2UsXG4gIC8vIEV4Y2x1ZGVzIHRoZSBsYWJlbCB3aGVuIGNhbGN1bGF0aW5nIG5vZGUgYm91bmRpbmcgYm94ZXMgZm9yIHRoZSBsYXlvdXQgYWxnb3JpdGhtXG4gIHNwYWNpbmdGYWN0b3I6IHVuZGVmaW5lZCxcbiAgLy8gQXBwbGllcyBhIG11bHRpcGxpY2F0aXZlIGZhY3RvciAoPjApIHRvIGV4cGFuZCBvciBjb21wcmVzcyB0aGUgb3ZlcmFsbCBhcmVhIHRoYXQgdGhlIG5vZGVzIHRha2UgdXBcbiAgY29uZGVuc2U6IGZhbHNlLFxuICAvLyB1c2VzIGFsbCBhdmFpbGFibGUgc3BhY2Ugb24gZmFsc2UsIHVzZXMgbWluaW1hbCBzcGFjZSBvbiB0cnVlXG4gIHJvd3M6IHVuZGVmaW5lZCxcbiAgLy8gZm9yY2UgbnVtIG9mIHJvd3MgaW4gdGhlIGdyaWRcbiAgY29sczogdW5kZWZpbmVkLFxuICAvLyBmb3JjZSBudW0gb2YgY29sdW1ucyBpbiB0aGUgZ3JpZFxuICBwb3NpdGlvbjogZnVuY3Rpb24gcG9zaXRpb24obm9kZSkge30sXG4gIC8vIHJldHVybnMgeyByb3csIGNvbCB9IGZvciBlbGVtZW50XG4gIHNvcnQ6IHVuZGVmaW5lZCxcbiAgLy8gYSBzb3J0aW5nIGZ1bmN0aW9uIHRvIG9yZGVyIHRoZSBub2RlczsgZS5nLiBmdW5jdGlvbihhLCBiKXsgcmV0dXJuIGEuZGF0YSgnd2VpZ2h0JykgLSBiLmRhdGEoJ3dlaWdodCcpIH1cbiAgYW5pbWF0ZTogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gdHJhbnNpdGlvbiB0aGUgbm9kZSBwb3NpdGlvbnNcbiAgYW5pbWF0aW9uRHVyYXRpb246IDUwMCxcbiAgLy8gZHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zIGlmIGVuYWJsZWRcbiAgYW5pbWF0aW9uRWFzaW5nOiB1bmRlZmluZWQsXG4gIC8vIGVhc2luZyBvZiBhbmltYXRpb24gaWYgZW5hYmxlZFxuICBhbmltYXRlRmlsdGVyOiBmdW5jdGlvbiBhbmltYXRlRmlsdGVyKG5vZGUsIGkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLy8gYSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgbm9kZSBzaG91bGQgYmUgYW5pbWF0ZWQuICBBbGwgbm9kZXMgYW5pbWF0ZWQgYnkgZGVmYXVsdCBvbiBhbmltYXRlIGVuYWJsZWQuICBOb24tYW5pbWF0ZWQgbm9kZXMgYXJlIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgbGF5b3V0IHN0YXJ0c1xuICByZWFkeTogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRyZWFkeVxuICBzdG9wOiB1bmRlZmluZWQsXG4gIC8vIGNhbGxiYWNrIG9uIGxheW91dHN0b3BcbiAgdHJhbnNmb3JtOiBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSwgcG9zaXRpb24pIHtcbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH0gLy8gdHJhbnNmb3JtIGEgZ2l2ZW4gbm9kZSBwb3NpdGlvbi4gVXNlZnVsIGZvciBjaGFuZ2luZyBmbG93IGRpcmVjdGlvbiBpbiBkaXNjcmV0ZSBsYXlvdXRzIFxuXG59O1xuXG5mdW5jdGlvbiBHcmlkTGF5b3V0KG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cyQzLCBvcHRpb25zKTtcbn1cblxuR3JpZExheW91dC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcGFyYW1zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgb3B0aW9ucyA9IHBhcmFtcztcbiAgdmFyIGN5ID0gcGFyYW1zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpLm5vdCgnOnBhcmVudCcpO1xuXG4gIGlmIChvcHRpb25zLnNvcnQpIHtcbiAgICBub2RlcyA9IG5vZGVzLnNvcnQob3B0aW9ucy5zb3J0KTtcbiAgfVxuXG4gIHZhciBiYiA9IG1ha2VCb3VuZGluZ0JveChvcHRpb25zLmJvdW5kaW5nQm94ID8gb3B0aW9ucy5ib3VuZGluZ0JveCA6IHtcbiAgICB4MTogMCxcbiAgICB5MTogMCxcbiAgICB3OiBjeS53aWR0aCgpLFxuICAgIGg6IGN5LmhlaWdodCgpXG4gIH0pO1xuXG4gIGlmIChiYi5oID09PSAwIHx8IGJiLncgPT09IDApIHtcbiAgICBlbGVzLm5vZGVzKCkubGF5b3V0UG9zaXRpb25zKHRoaXMsIG9wdGlvbnMsIGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IGJiLngxLFxuICAgICAgICB5OiBiYi55MVxuICAgICAgfTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICAvLyB3aWR0aC9oZWlnaHQgKiBzcGxpdHNeMiA9IGNlbGxzIHdoZXJlIHNwbGl0cyBpcyBudW1iZXIgb2YgdGltZXMgdG8gc3BsaXQgd2lkdGhcbiAgICB2YXIgY2VsbHMgPSBub2Rlcy5zaXplKCk7XG4gICAgdmFyIHNwbGl0cyA9IE1hdGguc3FydChjZWxscyAqIGJiLmggLyBiYi53KTtcbiAgICB2YXIgcm93cyA9IE1hdGgucm91bmQoc3BsaXRzKTtcbiAgICB2YXIgY29scyA9IE1hdGgucm91bmQoYmIudyAvIGJiLmggKiBzcGxpdHMpO1xuXG4gICAgdmFyIHNtYWxsID0gZnVuY3Rpb24gc21hbGwodmFsKSB7XG4gICAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKHJvd3MsIGNvbHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG1pbiA9IE1hdGgubWluKHJvd3MsIGNvbHMpO1xuXG4gICAgICAgIGlmIChtaW4gPT0gcm93cykge1xuICAgICAgICAgIHJvd3MgPSB2YWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29scyA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgbGFyZ2UgPSBmdW5jdGlvbiBsYXJnZSh2YWwpIHtcbiAgICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgocm93cywgY29scyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbWF4ID0gTWF0aC5tYXgocm93cywgY29scyk7XG5cbiAgICAgICAgaWYgKG1heCA9PSByb3dzKSB7XG4gICAgICAgICAgcm93cyA9IHZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2xzID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBvUm93cyA9IG9wdGlvbnMucm93cztcbiAgICB2YXIgb0NvbHMgPSBvcHRpb25zLmNvbHMgIT0gbnVsbCA/IG9wdGlvbnMuY29scyA6IG9wdGlvbnMuY29sdW1uczsgLy8gaWYgcm93cyBvciBjb2x1bW5zIHdlcmUgc2V0IGluIG9wdGlvbnMsIHVzZSB0aG9zZSB2YWx1ZXNcblxuICAgIGlmIChvUm93cyAhPSBudWxsICYmIG9Db2xzICE9IG51bGwpIHtcbiAgICAgIHJvd3MgPSBvUm93cztcbiAgICAgIGNvbHMgPSBvQ29scztcbiAgICB9IGVsc2UgaWYgKG9Sb3dzICE9IG51bGwgJiYgb0NvbHMgPT0gbnVsbCkge1xuICAgICAgcm93cyA9IG9Sb3dzO1xuICAgICAgY29scyA9IE1hdGguY2VpbChjZWxscyAvIHJvd3MpO1xuICAgIH0gZWxzZSBpZiAob1Jvd3MgPT0gbnVsbCAmJiBvQ29scyAhPSBudWxsKSB7XG4gICAgICBjb2xzID0gb0NvbHM7XG4gICAgICByb3dzID0gTWF0aC5jZWlsKGNlbGxzIC8gY29scyk7XG4gICAgfSAvLyBvdGhlcndpc2UgdXNlIHRoZSBhdXRvbWF0aWMgdmFsdWVzIGFuZCBhZGp1c3QgYWNjb3JkaW5nbHlcbiAgICAvLyBpZiByb3VuZGluZyB3YXMgdXAsIHNlZSBpZiB3ZSBjYW4gcmVkdWNlIHJvd3Mgb3IgY29sdW1uc1xuICAgIGVsc2UgaWYgKGNvbHMgKiByb3dzID4gY2VsbHMpIHtcbiAgICAgIHZhciBzbSA9IHNtYWxsKCk7XG4gICAgICB2YXIgbGcgPSBsYXJnZSgpOyAvLyByZWR1Y2luZyB0aGUgc21hbGwgc2lkZSB0YWtlcyBhd2F5IHRoZSBtb3N0IGNlbGxzLCBzbyB0cnkgaXQgZmlyc3RcblxuICAgICAgaWYgKChzbSAtIDEpICogbGcgPj0gY2VsbHMpIHtcbiAgICAgICAgc21hbGwoc20gLSAxKTtcbiAgICAgIH0gZWxzZSBpZiAoKGxnIC0gMSkgKiBzbSA+PSBjZWxscykge1xuICAgICAgICBsYXJnZShsZyAtIDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiByb3VuZGluZyB3YXMgdG9vIGxvdywgYWRkIHJvd3Mgb3IgY29sdW1uc1xuICAgICAgd2hpbGUgKGNvbHMgKiByb3dzIDwgY2VsbHMpIHtcbiAgICAgICAgdmFyIF9zbSA9IHNtYWxsKCk7XG5cbiAgICAgICAgdmFyIF9sZyA9IGxhcmdlKCk7IC8vIHRyeSB0byBhZGQgdG8gbGFyZ2VyIHNpZGUgZmlyc3QgKGFkZHMgbGVzcyBpbiBtdWx0aXBsaWNhdGlvbilcblxuXG4gICAgICAgIGlmICgoX2xnICsgMSkgKiBfc20gPj0gY2VsbHMpIHtcbiAgICAgICAgICBsYXJnZShfbGcgKyAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzbWFsbChfc20gKyAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjZWxsV2lkdGggPSBiYi53IC8gY29scztcbiAgICB2YXIgY2VsbEhlaWdodCA9IGJiLmggLyByb3dzO1xuXG4gICAgaWYgKG9wdGlvbnMuY29uZGVuc2UpIHtcbiAgICAgIGNlbGxXaWR0aCA9IDA7XG4gICAgICBjZWxsSGVpZ2h0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hdm9pZE92ZXJsYXApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgdmFyIHBvcyA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb247XG5cbiAgICAgICAgaWYgKHBvcy54ID09IG51bGwgfHwgcG9zLnkgPT0gbnVsbCkge1xuICAgICAgICAgIC8vIGZvciBiYlxuICAgICAgICAgIHBvcy54ID0gMDtcbiAgICAgICAgICBwb3MueSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbmJiID0gbm9kZS5sYXlvdXREaW1lbnNpb25zKG9wdGlvbnMpO1xuICAgICAgICB2YXIgcCA9IG9wdGlvbnMuYXZvaWRPdmVybGFwUGFkZGluZztcbiAgICAgICAgdmFyIHcgPSBuYmIudyArIHA7XG4gICAgICAgIHZhciBoID0gbmJiLmggKyBwO1xuICAgICAgICBjZWxsV2lkdGggPSBNYXRoLm1heChjZWxsV2lkdGgsIHcpO1xuICAgICAgICBjZWxsSGVpZ2h0ID0gTWF0aC5tYXgoY2VsbEhlaWdodCwgaCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNlbGxVc2VkID0ge307IC8vIGUuZy4gJ2MtMC0yJyA9PiB0cnVlXG5cbiAgICB2YXIgdXNlZCA9IGZ1bmN0aW9uIHVzZWQocm93LCBjb2wpIHtcbiAgICAgIHJldHVybiBjZWxsVXNlZFsnYy0nICsgcm93ICsgJy0nICsgY29sXSA/IHRydWUgOiBmYWxzZTtcbiAgICB9O1xuXG4gICAgdmFyIHVzZSA9IGZ1bmN0aW9uIHVzZShyb3csIGNvbCkge1xuICAgICAgY2VsbFVzZWRbJ2MtJyArIHJvdyArICctJyArIGNvbF0gPSB0cnVlO1xuICAgIH07IC8vIHRvIGtlZXAgdHJhY2sgb2YgY3VycmVudCBjZWxsIHBvc2l0aW9uXG5cblxuICAgIHZhciByb3cgPSAwO1xuICAgIHZhciBjb2wgPSAwO1xuXG4gICAgdmFyIG1vdmVUb05leHRDZWxsID0gZnVuY3Rpb24gbW92ZVRvTmV4dENlbGwoKSB7XG4gICAgICBjb2wrKztcblxuICAgICAgaWYgKGNvbCA+PSBjb2xzKSB7XG4gICAgICAgIGNvbCA9IDA7XG4gICAgICAgIHJvdysrO1xuICAgICAgfVxuICAgIH07IC8vIGdldCBhIGNhY2hlIG9mIGFsbCB0aGUgbWFudWFsIHBvc2l0aW9uc1xuXG5cbiAgICB2YXIgaWQybWFuUG9zID0ge307XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbm9kZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX25vZGUgPSBub2Rlc1tfaV07XG4gICAgICB2YXIgcmNQb3MgPSBvcHRpb25zLnBvc2l0aW9uKF9ub2RlKTtcblxuICAgICAgaWYgKHJjUG9zICYmIChyY1Bvcy5yb3cgIT09IHVuZGVmaW5lZCB8fCByY1Bvcy5jb2wgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgLy8gbXVzdCBoYXZlIGF0IGxlYXN0IHJvdyBvciBjb2wgZGVmJ2RcbiAgICAgICAgdmFyIF9wb3MgPSB7XG4gICAgICAgICAgcm93OiByY1Bvcy5yb3csXG4gICAgICAgICAgY29sOiByY1Bvcy5jb2xcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoX3Bvcy5jb2wgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIGZpbmQgdW51c2VkIGNvbFxuICAgICAgICAgIF9wb3MuY29sID0gMDtcblxuICAgICAgICAgIHdoaWxlICh1c2VkKF9wb3Mucm93LCBfcG9zLmNvbCkpIHtcbiAgICAgICAgICAgIF9wb3MuY29sKys7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKF9wb3Mucm93ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBmaW5kIHVudXNlZCByb3dcbiAgICAgICAgICBfcG9zLnJvdyA9IDA7XG5cbiAgICAgICAgICB3aGlsZSAodXNlZChfcG9zLnJvdywgX3Bvcy5jb2wpKSB7XG4gICAgICAgICAgICBfcG9zLnJvdysrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlkMm1hblBvc1tfbm9kZS5pZCgpXSA9IF9wb3M7XG4gICAgICAgIHVzZShfcG9zLnJvdywgX3Bvcy5jb2wpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBnZXRQb3MgPSBmdW5jdGlvbiBnZXRQb3MoZWxlbWVudCwgaSkge1xuICAgICAgdmFyIHgsIHk7XG5cbiAgICAgIGlmIChlbGVtZW50LmxvY2tlZCgpIHx8IGVsZW1lbnQuaXNQYXJlbnQoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IC8vIHNlZSBpZiB3ZSBoYXZlIGEgbWFudWFsIHBvc2l0aW9uIHNldFxuXG5cbiAgICAgIHZhciByY1BvcyA9IGlkMm1hblBvc1tlbGVtZW50LmlkKCldO1xuXG4gICAgICBpZiAocmNQb3MpIHtcbiAgICAgICAgeCA9IHJjUG9zLmNvbCAqIGNlbGxXaWR0aCArIGNlbGxXaWR0aCAvIDIgKyBiYi54MTtcbiAgICAgICAgeSA9IHJjUG9zLnJvdyAqIGNlbGxIZWlnaHQgKyBjZWxsSGVpZ2h0IC8gMiArIGJiLnkxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlIHNldCBhdXRvbWF0aWNhbGx5XG4gICAgICAgIHdoaWxlICh1c2VkKHJvdywgY29sKSkge1xuICAgICAgICAgIG1vdmVUb05leHRDZWxsKCk7XG4gICAgICAgIH1cblxuICAgICAgICB4ID0gY29sICogY2VsbFdpZHRoICsgY2VsbFdpZHRoIC8gMiArIGJiLngxO1xuICAgICAgICB5ID0gcm93ICogY2VsbEhlaWdodCArIGNlbGxIZWlnaHQgLyAyICsgYmIueTE7XG4gICAgICAgIHVzZShyb3csIGNvbCk7XG4gICAgICAgIG1vdmVUb05leHRDZWxsKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHlcbiAgICAgIH07XG4gICAgfTtcblxuICAgIG5vZGVzLmxheW91dFBvc2l0aW9ucyh0aGlzLCBvcHRpb25zLCBnZXRQb3MpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG52YXIgZGVmYXVsdHMkMiA9IHtcbiAgcmVhZHk6IGZ1bmN0aW9uIHJlYWR5KCkge30sXG4gIC8vIG9uIGxheW91dHJlYWR5XG4gIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7fSAvLyBvbiBsYXlvdXRzdG9wXG5cbn07IC8vIGNvbnN0cnVjdG9yXG4vLyBvcHRpb25zIDogb2JqZWN0IGNvbnRhaW5pbmcgbGF5b3V0IG9wdGlvbnNcblxuZnVuY3Rpb24gTnVsbExheW91dChvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMkMiwgb3B0aW9ucyk7XG59IC8vIHJ1bnMgdGhlIGxheW91dFxuXG5cbk51bGxMYXlvdXQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzOyAvLyBlbGVtZW50cyB0byBjb25zaWRlciBpbiB0aGUgbGF5b3V0XG5cbiAgdmFyIGxheW91dCA9IHRoaXM7IC8vIGN5IGlzIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVkIGZvciB1cyBpbiB0aGUgY29uc3RydWN0b3JcbiAgLy8gKGRpc2FibGUgZXNsaW50IGZvciBuZXh0IGxpbmUgYXMgdGhpcyBzZXJ2ZXMgYXMgZXhhbXBsZSBsYXlvdXQgY29kZSB0byBleHRlcm5hbCBkZXZlbG9wZXJzKVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcblxuICBvcHRpb25zLmN5O1xuICBsYXlvdXQuZW1pdCgnbGF5b3V0c3RhcnQnKTsgLy8gcHV0cyBhbGwgbm9kZXMgYXQgKDAsIDApXG4gIC8vIG4uYi4gbW9zdCBsYXlvdXRzIHdvdWxkIHVzZSBsYXlvdXRQb3NpdGlvbnMoKSwgaW5zdGVhZCBvZiBwb3NpdGlvbnMoKSBhbmQgbWFudWFsIGV2ZW50c1xuXG4gIGVsZXMubm9kZXMoKS5wb3NpdGlvbnMoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH07XG4gIH0pOyAvLyB0cmlnZ2VyIGxheW91dHJlYWR5IHdoZW4gZWFjaCBub2RlIGhhcyBoYWQgaXRzIHBvc2l0aW9uIHNldCBhdCBsZWFzdCBvbmNlXG5cbiAgbGF5b3V0Lm9uZSgnbGF5b3V0cmVhZHknLCBvcHRpb25zLnJlYWR5KTtcbiAgbGF5b3V0LmVtaXQoJ2xheW91dHJlYWR5Jyk7IC8vIHRyaWdnZXIgbGF5b3V0c3RvcCB3aGVuIHRoZSBsYXlvdXQgc3RvcHMgKGUuZy4gZmluaXNoZXMpXG5cbiAgbGF5b3V0Lm9uZSgnbGF5b3V0c3RvcCcsIG9wdGlvbnMuc3RvcCk7XG4gIGxheW91dC5lbWl0KCdsYXlvdXRzdG9wJyk7XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTsgLy8gY2FsbGVkIG9uIGNvbnRpbnVvdXMgbGF5b3V0cyB0byBzdG9wIHRoZW0gYmVmb3JlIHRoZXkgZmluaXNoXG5cblxuTnVsbExheW91dC5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG52YXIgZGVmYXVsdHMkMSA9IHtcbiAgcG9zaXRpb25zOiB1bmRlZmluZWQsXG4gIC8vIG1hcCBvZiAobm9kZSBpZCkgPT4gKHBvc2l0aW9uIG9iaik7IG9yIGZ1bmN0aW9uKG5vZGUpeyByZXR1cm4gc29tUG9zOyB9XG4gIHpvb206IHVuZGVmaW5lZCxcbiAgLy8gdGhlIHpvb20gbGV2ZWwgdG8gc2V0IChwcm9iIHdhbnQgZml0ID0gZmFsc2UgaWYgc2V0KVxuICBwYW46IHVuZGVmaW5lZCxcbiAgLy8gdGhlIHBhbiBsZXZlbCB0byBzZXQgKHByb2Igd2FudCBmaXQgPSBmYWxzZSBpZiBzZXQpXG4gIGZpdDogdHJ1ZSxcbiAgLy8gd2hldGhlciB0byBmaXQgdG8gdmlld3BvcnRcbiAgcGFkZGluZzogMzAsXG4gIC8vIHBhZGRpbmcgb24gZml0XG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWRcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLiAgQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkLiAgTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgcmVhZHk6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRzdG9wXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9IC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0c1xuXG59O1xuXG5mdW5jdGlvbiBQcmVzZXRMYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRzJDEsIG9wdGlvbnMpO1xufVxuXG5QcmVzZXRMYXlvdXQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCk7XG4gIHZhciBwb3NJc0ZuID0gZm4kNihvcHRpb25zLnBvc2l0aW9ucyk7XG5cbiAgZnVuY3Rpb24gZ2V0UG9zaXRpb24obm9kZSkge1xuICAgIGlmIChvcHRpb25zLnBvc2l0aW9ucyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY29weVBvc2l0aW9uKG5vZGUucG9zaXRpb24oKSk7XG4gICAgfVxuXG4gICAgaWYgKHBvc0lzRm4pIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnBvc2l0aW9ucyhub2RlKTtcbiAgICB9XG5cbiAgICB2YXIgcG9zID0gb3B0aW9ucy5wb3NpdGlvbnNbbm9kZS5fcHJpdmF0ZS5kYXRhLmlkXTtcblxuICAgIGlmIChwb3MgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvcztcbiAgfVxuXG4gIG5vZGVzLmxheW91dFBvc2l0aW9ucyh0aGlzLCBvcHRpb25zLCBmdW5jdGlvbiAobm9kZSwgaSkge1xuICAgIHZhciBwb3NpdGlvbiA9IGdldFBvc2l0aW9uKG5vZGUpO1xuXG4gICAgaWYgKG5vZGUubG9ja2VkKCkgfHwgcG9zaXRpb24gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfSk7XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxudmFyIGRlZmF1bHRzID0ge1xuICBmaXQ6IHRydWUsXG4gIC8vIHdoZXRoZXIgdG8gZml0IHRvIHZpZXdwb3J0XG4gIHBhZGRpbmc6IDMwLFxuICAvLyBmaXQgcGFkZGluZ1xuICBib3VuZGluZ0JveDogdW5kZWZpbmVkLFxuICAvLyBjb25zdHJhaW4gbGF5b3V0IGJvdW5kczsgeyB4MSwgeTEsIHgyLCB5MiB9IG9yIHsgeDEsIHkxLCB3LCBoIH1cbiAgYW5pbWF0ZTogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gdHJhbnNpdGlvbiB0aGUgbm9kZSBwb3NpdGlvbnNcbiAgYW5pbWF0aW9uRHVyYXRpb246IDUwMCxcbiAgLy8gZHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zIGlmIGVuYWJsZWRcbiAgYW5pbWF0aW9uRWFzaW5nOiB1bmRlZmluZWQsXG4gIC8vIGVhc2luZyBvZiBhbmltYXRpb24gaWYgZW5hYmxlZFxuICBhbmltYXRlRmlsdGVyOiBmdW5jdGlvbiBhbmltYXRlRmlsdGVyKG5vZGUsIGkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLy8gYSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgbm9kZSBzaG91bGQgYmUgYW5pbWF0ZWQuICBBbGwgbm9kZXMgYW5pbWF0ZWQgYnkgZGVmYXVsdCBvbiBhbmltYXRlIGVuYWJsZWQuICBOb24tYW5pbWF0ZWQgbm9kZXMgYXJlIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgbGF5b3V0IHN0YXJ0c1xuICByZWFkeTogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRyZWFkeVxuICBzdG9wOiB1bmRlZmluZWQsXG4gIC8vIGNhbGxiYWNrIG9uIGxheW91dHN0b3BcbiAgdHJhbnNmb3JtOiBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSwgcG9zaXRpb24pIHtcbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH0gLy8gdHJhbnNmb3JtIGEgZ2l2ZW4gbm9kZSBwb3NpdGlvbi4gVXNlZnVsIGZvciBjaGFuZ2luZyBmbG93IGRpcmVjdGlvbiBpbiBkaXNjcmV0ZSBsYXlvdXRzIFxuXG59O1xuXG5mdW5jdGlvbiBSYW5kb21MYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBvcHRpb25zKTtcbn1cblxuUmFuZG9tTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KG9wdGlvbnMuYm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDoge1xuICAgIHgxOiAwLFxuICAgIHkxOiAwLFxuICAgIHc6IGN5LndpZHRoKCksXG4gICAgaDogY3kuaGVpZ2h0KClcbiAgfSk7XG5cbiAgdmFyIGdldFBvcyA9IGZ1bmN0aW9uIGdldFBvcyhub2RlLCBpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGJiLngxICsgTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogYmIudyksXG4gICAgICB5OiBiYi55MSArIE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIGJiLmgpXG4gICAgfTtcbiAgfTtcblxuICBlbGVzLm5vZGVzKCkubGF5b3V0UG9zaXRpb25zKHRoaXMsIG9wdGlvbnMsIGdldFBvcyk7XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxudmFyIGxheW91dCA9IFt7XG4gIG5hbWU6ICdicmVhZHRoZmlyc3QnLFxuICBpbXBsOiBCcmVhZHRoRmlyc3RMYXlvdXRcbn0sIHtcbiAgbmFtZTogJ2NpcmNsZScsXG4gIGltcGw6IENpcmNsZUxheW91dFxufSwge1xuICBuYW1lOiAnY29uY2VudHJpYycsXG4gIGltcGw6IENvbmNlbnRyaWNMYXlvdXRcbn0sIHtcbiAgbmFtZTogJ2Nvc2UnLFxuICBpbXBsOiBDb3NlTGF5b3V0XG59LCB7XG4gIG5hbWU6ICdncmlkJyxcbiAgaW1wbDogR3JpZExheW91dFxufSwge1xuICBuYW1lOiAnbnVsbCcsXG4gIGltcGw6IE51bGxMYXlvdXRcbn0sIHtcbiAgbmFtZTogJ3ByZXNldCcsXG4gIGltcGw6IFByZXNldExheW91dFxufSwge1xuICBuYW1lOiAncmFuZG9tJyxcbiAgaW1wbDogUmFuZG9tTGF5b3V0XG59XTtcblxuZnVuY3Rpb24gTnVsbFJlbmRlcmVyKG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgdGhpcy5ub3RpZmljYXRpb25zID0gMDsgLy8gZm9yIHRlc3Rpbmdcbn1cblxudmFyIG5vb3AgPSBmdW5jdGlvbiBub29wKCkge307XG5cbnZhciB0aHJvd0ltZ0VyciA9IGZ1bmN0aW9uIHRocm93SW1nRXJyKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ0EgaGVhZGxlc3MgaW5zdGFuY2UgY2FuIG5vdCByZW5kZXIgaW1hZ2VzJyk7XG59O1xuXG5OdWxsUmVuZGVyZXIucHJvdG90eXBlID0ge1xuICByZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGU6IG5vb3AsXG4gIG5vdGlmeTogZnVuY3Rpb24gbm90aWZ5KCkge1xuICAgIHRoaXMubm90aWZpY2F0aW9ucysrO1xuICB9LFxuICBpbml0OiBub29wLFxuICBpc0hlYWRsZXNzOiBmdW5jdGlvbiBpc0hlYWRsZXNzKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBwbmc6IHRocm93SW1nRXJyLFxuICBqcGc6IHRocm93SW1nRXJyXG59O1xuXG52YXIgQlJwJGYgPSB7fTtcbkJScCRmLmFycm93U2hhcGVXaWR0aCA9IDAuMztcblxuQlJwJGYucmVnaXN0ZXJBcnJvd1NoYXBlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFycm93U2hhcGVzID0gdGhpcy5hcnJvd1NoYXBlcyA9IHt9O1xuICB2YXIgcmVuZGVyZXIgPSB0aGlzOyAvLyBDb250cmFjdCBmb3IgYXJyb3cgc2hhcGVzOlxuICAvLyAwLCAwIGlzIGFycm93IHRpcFxuICAvLyAoMCwgMSkgaXMgZGlyZWN0aW9uIHRvd2FyZHMgbm9kZVxuICAvLyAoMSwgMCkgaXMgcmlnaHRcbiAgLy9cbiAgLy8gZnVuY3Rpb25hbCBhcGk6XG4gIC8vIGNvbGxpZGU6IGNoZWNrIHgsIHkgaW4gc2hhcGVcbiAgLy8gcm91Z2hDb2xsaWRlOiBjYWxsZWQgYmVmb3JlIGNvbGxpZGUsIG5vIGZhbHNlIG5lZ2F0aXZlc1xuICAvLyBkcmF3OiBkcmF3XG4gIC8vIHNwYWNpbmc6IGRpc3QoYXJyb3dUaXAsIG5vZGVCb3VuZGFyeSlcbiAgLy8gZ2FwOiBkaXN0KGVkZ2VUaXAsIG5vZGVCb3VuZGFyeSksIGVkZ2VUaXAgbWF5ICE9IGFycm93VGlwXG5cbiAgdmFyIGJiQ29sbGlkZSA9IGZ1bmN0aW9uIGJiQ29sbGlkZSh4LCB5LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCwgcGFkZGluZykge1xuICAgIHZhciB4MSA9IHRyYW5zbGF0aW9uLnggLSBzaXplIC8gMiAtIHBhZGRpbmc7XG4gICAgdmFyIHgyID0gdHJhbnNsYXRpb24ueCArIHNpemUgLyAyICsgcGFkZGluZztcbiAgICB2YXIgeTEgPSB0cmFuc2xhdGlvbi55IC0gc2l6ZSAvIDIgLSBwYWRkaW5nO1xuICAgIHZhciB5MiA9IHRyYW5zbGF0aW9uLnkgKyBzaXplIC8gMiArIHBhZGRpbmc7XG4gICAgdmFyIGluc2lkZSA9IHgxIDw9IHggJiYgeCA8PSB4MiAmJiB5MSA8PSB5ICYmIHkgPD0geTI7XG4gICAgcmV0dXJuIGluc2lkZTtcbiAgfTtcblxuICB2YXIgdHJhbnNmb3JtID0gZnVuY3Rpb24gdHJhbnNmb3JtKHgsIHksIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbikge1xuICAgIHZhciB4Um90YXRlZCA9IHggKiBNYXRoLmNvcyhhbmdsZSkgLSB5ICogTWF0aC5zaW4oYW5nbGUpO1xuICAgIHZhciB5Um90YXRlZCA9IHggKiBNYXRoLnNpbihhbmdsZSkgKyB5ICogTWF0aC5jb3MoYW5nbGUpO1xuICAgIHZhciB4U2NhbGVkID0geFJvdGF0ZWQgKiBzaXplO1xuICAgIHZhciB5U2NhbGVkID0geVJvdGF0ZWQgKiBzaXplO1xuICAgIHZhciB4VHJhbnNsYXRlZCA9IHhTY2FsZWQgKyB0cmFuc2xhdGlvbi54O1xuICAgIHZhciB5VHJhbnNsYXRlZCA9IHlTY2FsZWQgKyB0cmFuc2xhdGlvbi55O1xuICAgIHJldHVybiB7XG4gICAgICB4OiB4VHJhbnNsYXRlZCxcbiAgICAgIHk6IHlUcmFuc2xhdGVkXG4gICAgfTtcbiAgfTtcblxuICB2YXIgdHJhbnNmb3JtUG9pbnRzID0gZnVuY3Rpb24gdHJhbnNmb3JtUG9pbnRzKHB0cywgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uKSB7XG4gICAgdmFyIHJldFB0cyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwdHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIHZhciB4ID0gcHRzW2ldO1xuICAgICAgdmFyIHkgPSBwdHNbaSArIDFdO1xuICAgICAgcmV0UHRzLnB1c2godHJhbnNmb3JtKHgsIHksIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbikpO1xuICAgIH1cblxuICAgIHJldHVybiByZXRQdHM7XG4gIH07XG5cbiAgdmFyIHBvaW50c1RvQXJyID0gZnVuY3Rpb24gcG9pbnRzVG9BcnIocHRzKSB7XG4gICAgdmFyIHJldCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwID0gcHRzW2ldO1xuICAgICAgcmV0LnB1c2gocC54LCBwLnkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH07XG5cbiAgdmFyIHN0YW5kYXJkR2FwID0gZnVuY3Rpb24gc3RhbmRhcmRHYXAoZWRnZSkge1xuICAgIHJldHVybiBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlICogZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykucGZWYWx1ZSAqIDI7XG4gIH07XG5cbiAgdmFyIGRlZmluZUFycm93U2hhcGUgPSBmdW5jdGlvbiBkZWZpbmVBcnJvd1NoYXBlKG5hbWUsIGRlZm4pIHtcbiAgICBpZiAoc3RyaW5nKGRlZm4pKSB7XG4gICAgICBkZWZuID0gYXJyb3dTaGFwZXNbZGVmbl07XG4gICAgfVxuXG4gICAgYXJyb3dTaGFwZXNbbmFtZV0gPSBleHRlbmQoe1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHBvaW50czogWy0wLjE1LCAtMC4zLCAwLjE1LCAtMC4zLCAwLjE1LCAwLjMsIC0wLjE1LCAwLjNdLFxuICAgICAgY29sbGlkZTogZnVuY3Rpb24gY29sbGlkZSh4LCB5LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIHBhZGRpbmcpIHtcbiAgICAgICAgdmFyIHBvaW50cyA9IHBvaW50c1RvQXJyKHRyYW5zZm9ybVBvaW50cyh0aGlzLnBvaW50cywgc2l6ZSArIDIgKiBwYWRkaW5nLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICAgICAgdmFyIGluc2lkZSA9IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBwb2ludHMpO1xuICAgICAgICByZXR1cm4gaW5zaWRlO1xuICAgICAgfSxcbiAgICAgIHJvdWdoQ29sbGlkZTogYmJDb2xsaWRlLFxuICAgICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pIHtcbiAgICAgICAgdmFyIHBvaW50cyA9IHRyYW5zZm9ybVBvaW50cyh0aGlzLnBvaW50cywgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uKTtcbiAgICAgICAgcmVuZGVyZXIuYXJyb3dTaGFwZUltcGwoJ3BvbHlnb24nKShjb250ZXh0LCBwb2ludHMpO1xuICAgICAgfSxcbiAgICAgIHNwYWNpbmc6IGZ1bmN0aW9uIHNwYWNpbmcoZWRnZSkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0sXG4gICAgICBnYXA6IHN0YW5kYXJkR2FwXG4gICAgfSwgZGVmbik7XG4gIH07XG5cbiAgZGVmaW5lQXJyb3dTaGFwZSgnbm9uZScsIHtcbiAgICBjb2xsaWRlOiBmYWxzaWZ5LFxuICAgIHJvdWdoQ29sbGlkZTogZmFsc2lmeSxcbiAgICBkcmF3OiBub29wJDEsXG4gICAgc3BhY2luZzogemVyb2lmeSxcbiAgICBnYXA6IHplcm9pZnlcbiAgfSk7XG4gIGRlZmluZUFycm93U2hhcGUoJ3RyaWFuZ2xlJywge1xuICAgIHBvaW50czogWy0wLjE1LCAtMC4zLCAwLCAwLCAwLjE1LCAtMC4zXVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnYXJyb3cnLCAndHJpYW5nbGUnKTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgndHJpYW5nbGUtYmFja2N1cnZlJywge1xuICAgIHBvaW50czogYXJyb3dTaGFwZXNbJ3RyaWFuZ2xlJ10ucG9pbnRzLFxuICAgIGNvbnRyb2xQb2ludDogWzAsIC0wLjE1XSxcbiAgICByb3VnaENvbGxpZGU6IGJiQ29sbGlkZSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKSB7XG4gICAgICB2YXIgcHRzVHJhbnMgPSB0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHMsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICB2YXIgY3RybFB0ID0gdGhpcy5jb250cm9sUG9pbnQ7XG4gICAgICB2YXIgY3RybFB0VHJhbnMgPSB0cmFuc2Zvcm0oY3RybFB0WzBdLCBjdHJsUHRbMV0sIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICByZW5kZXJlci5hcnJvd1NoYXBlSW1wbCh0aGlzLm5hbWUpKGNvbnRleHQsIHB0c1RyYW5zLCBjdHJsUHRUcmFucyk7XG4gICAgfSxcbiAgICBnYXA6IGZ1bmN0aW9uIGdhcChlZGdlKSB7XG4gICAgICByZXR1cm4gc3RhbmRhcmRHYXAoZWRnZSkgKiAwLjg7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgndHJpYW5nbGUtdGVlJywge1xuICAgIHBvaW50czogWzAsIDAsIDAuMTUsIC0wLjMsIC0wLjE1LCAtMC4zLCAwLCAwXSxcbiAgICBwb2ludHNUZWU6IFstMC4xNSwgLTAuNCwgLTAuMTUsIC0wLjUsIDAuMTUsIC0wLjUsIDAuMTUsIC0wLjRdLFxuICAgIGNvbGxpZGU6IGZ1bmN0aW9uIGNvbGxpZGUoeCwgeSwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBlZGdlV2lkdGgsIHBhZGRpbmcpIHtcbiAgICAgIHZhciB0cmlQdHMgPSBwb2ludHNUb0Fycih0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHMsIHNpemUgKyAyICogcGFkZGluZywgYW5nbGUsIHRyYW5zbGF0aW9uKSk7XG4gICAgICB2YXIgdGVlUHRzID0gcG9pbnRzVG9BcnIodHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzVGVlLCBzaXplICsgMiAqIHBhZGRpbmcsIGFuZ2xlLCB0cmFuc2xhdGlvbikpO1xuICAgICAgdmFyIGluc2lkZSA9IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCB0cmlQdHMpIHx8IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCB0ZWVQdHMpO1xuICAgICAgcmV0dXJuIGluc2lkZTtcbiAgICB9LFxuICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBlZGdlV2lkdGgpIHtcbiAgICAgIHZhciB0cmlQdHMgPSB0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHMsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICB2YXIgdGVlUHRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzVGVlLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgcmVuZGVyZXIuYXJyb3dTaGFwZUltcGwodGhpcy5uYW1lKShjb250ZXh0LCB0cmlQdHMsIHRlZVB0cyk7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnY2lyY2xlLXRyaWFuZ2xlJywge1xuICAgIHJhZGl1czogMC4xNSxcbiAgICBwb2ludHNUcjogWzAsIC0wLjE1LCAwLjE1LCAtMC40NSwgLTAuMTUsIC0wLjQ1LCAwLCAtMC4xNV0sXG4gICAgY29sbGlkZTogZnVuY3Rpb24gY29sbGlkZSh4LCB5LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCwgcGFkZGluZykge1xuICAgICAgdmFyIHQgPSB0cmFuc2xhdGlvbjtcbiAgICAgIHZhciBjaXJjbGVJbnNpZGUgPSBNYXRoLnBvdyh0LnggLSB4LCAyKSArIE1hdGgucG93KHQueSAtIHksIDIpIDw9IE1hdGgucG93KChzaXplICsgMiAqIHBhZGRpbmcpICogdGhpcy5yYWRpdXMsIDIpO1xuICAgICAgdmFyIHRyaVB0cyA9IHBvaW50c1RvQXJyKHRyYW5zZm9ybVBvaW50cyh0aGlzLnBvaW50cywgc2l6ZSArIDIgKiBwYWRkaW5nLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICAgIHJldHVybiBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgdHJpUHRzKSB8fCBjaXJjbGVJbnNpZGU7XG4gICAgfSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKSB7XG4gICAgICB2YXIgdHJpUHRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzVHIsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICByZW5kZXJlci5hcnJvd1NoYXBlSW1wbCh0aGlzLm5hbWUpKGNvbnRleHQsIHRyaVB0cywgdHJhbnNsYXRpb24ueCwgdHJhbnNsYXRpb24ueSwgdGhpcy5yYWRpdXMgKiBzaXplKTtcbiAgICB9LFxuICAgIHNwYWNpbmc6IGZ1bmN0aW9uIHNwYWNpbmcoZWRnZSkge1xuICAgICAgcmV0dXJuIHJlbmRlcmVyLmdldEFycm93V2lkdGgoZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZSwgZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykudmFsdWUpICogdGhpcy5yYWRpdXM7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgndHJpYW5nbGUtY3Jvc3MnLCB7XG4gICAgcG9pbnRzOiBbMCwgMCwgMC4xNSwgLTAuMywgLTAuMTUsIC0wLjMsIDAsIDBdLFxuICAgIGJhc2VDcm9zc0xpbmVQdHM6IFstMC4xNSwgLTAuNCwgLy8gZmlyc3QgaGFsZiBvZiB0aGUgcmVjdGFuZ2xlXG4gICAgLTAuMTUsIC0wLjQsIDAuMTUsIC0wLjQsIC8vIHNlY29uZCBoYWxmIG9mIHRoZSByZWN0YW5nbGVcbiAgICAwLjE1LCAtMC40XSxcbiAgICBjcm9zc0xpbmVQdHM6IGZ1bmN0aW9uIGNyb3NzTGluZVB0cyhzaXplLCBlZGdlV2lkdGgpIHtcbiAgICAgIC8vIHNoaWZ0IHBvaW50cyBzbyB0aGF0IHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBjcm9zcyBwb2ludHMgbWF0Y2hlcyBlZGdlIHdpZHRoXG4gICAgICB2YXIgcCA9IHRoaXMuYmFzZUNyb3NzTGluZVB0cy5zbGljZSgpO1xuICAgICAgdmFyIHNoaWZ0RmFjdG9yID0gZWRnZVdpZHRoIC8gc2l6ZTtcbiAgICAgIHZhciB5MCA9IDM7XG4gICAgICB2YXIgeTEgPSA1O1xuICAgICAgcFt5MF0gPSBwW3kwXSAtIHNoaWZ0RmFjdG9yO1xuICAgICAgcFt5MV0gPSBwW3kxXSAtIHNoaWZ0RmFjdG9yO1xuICAgICAgcmV0dXJuIHA7XG4gICAgfSxcbiAgICBjb2xsaWRlOiBmdW5jdGlvbiBjb2xsaWRlKHgsIHksIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoLCBwYWRkaW5nKSB7XG4gICAgICB2YXIgdHJpUHRzID0gcG9pbnRzVG9BcnIodHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzLCBzaXplICsgMiAqIHBhZGRpbmcsIGFuZ2xlLCB0cmFuc2xhdGlvbikpO1xuICAgICAgdmFyIHRlZVB0cyA9IHBvaW50c1RvQXJyKHRyYW5zZm9ybVBvaW50cyh0aGlzLmNyb3NzTGluZVB0cyhzaXplLCBlZGdlV2lkdGgpLCBzaXplICsgMiAqIHBhZGRpbmcsIGFuZ2xlLCB0cmFuc2xhdGlvbikpO1xuICAgICAgdmFyIGluc2lkZSA9IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCB0cmlQdHMpIHx8IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCB0ZWVQdHMpO1xuICAgICAgcmV0dXJuIGluc2lkZTtcbiAgICB9LFxuICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBlZGdlV2lkdGgpIHtcbiAgICAgIHZhciB0cmlQdHMgPSB0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHMsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICB2YXIgY3Jvc3NMaW5lUHRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMuY3Jvc3NMaW5lUHRzKHNpemUsIGVkZ2VXaWR0aCksIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICByZW5kZXJlci5hcnJvd1NoYXBlSW1wbCh0aGlzLm5hbWUpKGNvbnRleHQsIHRyaVB0cywgY3Jvc3NMaW5lUHRzKTtcbiAgICB9XG4gIH0pO1xuICBkZWZpbmVBcnJvd1NoYXBlKCd2ZWUnLCB7XG4gICAgcG9pbnRzOiBbLTAuMTUsIC0wLjMsIDAsIDAsIDAuMTUsIC0wLjMsIDAsIC0wLjE1XSxcbiAgICBnYXA6IGZ1bmN0aW9uIGdhcChlZGdlKSB7XG4gICAgICByZXR1cm4gc3RhbmRhcmRHYXAoZWRnZSkgKiAwLjUyNTtcbiAgICB9XG4gIH0pO1xuICBkZWZpbmVBcnJvd1NoYXBlKCdjaXJjbGUnLCB7XG4gICAgcmFkaXVzOiAwLjE1LFxuICAgIGNvbGxpZGU6IGZ1bmN0aW9uIGNvbGxpZGUoeCwgeSwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBlZGdlV2lkdGgsIHBhZGRpbmcpIHtcbiAgICAgIHZhciB0ID0gdHJhbnNsYXRpb247XG4gICAgICB2YXIgaW5zaWRlID0gTWF0aC5wb3codC54IC0geCwgMikgKyBNYXRoLnBvdyh0LnkgLSB5LCAyKSA8PSBNYXRoLnBvdygoc2l6ZSArIDIgKiBwYWRkaW5nKSAqIHRoaXMucmFkaXVzLCAyKTtcbiAgICAgIHJldHVybiBpbnNpZGU7XG4gICAgfSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKSB7XG4gICAgICByZW5kZXJlci5hcnJvd1NoYXBlSW1wbCh0aGlzLm5hbWUpKGNvbnRleHQsIHRyYW5zbGF0aW9uLngsIHRyYW5zbGF0aW9uLnksIHRoaXMucmFkaXVzICogc2l6ZSk7XG4gICAgfSxcbiAgICBzcGFjaW5nOiBmdW5jdGlvbiBzcGFjaW5nKGVkZ2UpIHtcbiAgICAgIHJldHVybiByZW5kZXJlci5nZXRBcnJvd1dpZHRoKGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWUsIGVkZ2UucHN0eWxlKCdhcnJvdy1zY2FsZScpLnZhbHVlKSAqIHRoaXMucmFkaXVzO1xuICAgIH1cbiAgfSk7XG4gIGRlZmluZUFycm93U2hhcGUoJ3RlZScsIHtcbiAgICBwb2ludHM6IFstMC4xNSwgMCwgLTAuMTUsIC0wLjEsIDAuMTUsIC0wLjEsIDAuMTUsIDBdLFxuICAgIHNwYWNpbmc6IGZ1bmN0aW9uIHNwYWNpbmcoZWRnZSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSxcbiAgICBnYXA6IGZ1bmN0aW9uIGdhcChlZGdlKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH0pO1xuICBkZWZpbmVBcnJvd1NoYXBlKCdzcXVhcmUnLCB7XG4gICAgcG9pbnRzOiBbLTAuMTUsIDAuMDAsIDAuMTUsIDAuMDAsIDAuMTUsIC0wLjMsIC0wLjE1LCAtMC4zXVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnZGlhbW9uZCcsIHtcbiAgICBwb2ludHM6IFstMC4xNSwgLTAuMTUsIDAsIC0wLjMsIDAuMTUsIC0wLjE1LCAwLCAwXSxcbiAgICBnYXA6IGZ1bmN0aW9uIGdhcChlZGdlKSB7XG4gICAgICByZXR1cm4gZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZSAqIGVkZ2UucHN0eWxlKCdhcnJvdy1zY2FsZScpLnZhbHVlO1xuICAgIH1cbiAgfSk7XG4gIGRlZmluZUFycm93U2hhcGUoJ2NoZXZyb24nLCB7XG4gICAgcG9pbnRzOiBbMCwgMCwgLTAuMTUsIC0wLjE1LCAtMC4xLCAtMC4yLCAwLCAtMC4xLCAwLjEsIC0wLjIsIDAuMTUsIC0wLjE1XSxcbiAgICBnYXA6IGZ1bmN0aW9uIGdhcChlZGdlKSB7XG4gICAgICByZXR1cm4gMC45NSAqIGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWUgKiBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZTtcbiAgICB9XG4gIH0pO1xufTtcblxudmFyIEJScCRlID0ge307IC8vIFByb2plY3QgbW91c2VcblxuQlJwJGUucHJvamVjdEludG9WaWV3cG9ydCA9IGZ1bmN0aW9uIChjbGllbnRYLCBjbGllbnRZKSB7XG4gIHZhciBjeSA9IHRoaXMuY3k7XG4gIHZhciBvZmZzZXRzID0gdGhpcy5maW5kQ29udGFpbmVyQ2xpZW50Q29vcmRzKCk7XG4gIHZhciBvZmZzZXRMZWZ0ID0gb2Zmc2V0c1swXTtcbiAgdmFyIG9mZnNldFRvcCA9IG9mZnNldHNbMV07XG4gIHZhciBzY2FsZSA9IG9mZnNldHNbNF07XG4gIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gIHZhciB4ID0gKChjbGllbnRYIC0gb2Zmc2V0TGVmdCkgLyBzY2FsZSAtIHBhbi54KSAvIHpvb207XG4gIHZhciB5ID0gKChjbGllbnRZIC0gb2Zmc2V0VG9wKSAvIHNjYWxlIC0gcGFuLnkpIC8gem9vbTtcbiAgcmV0dXJuIFt4LCB5XTtcbn07XG5cbkJScCRlLmZpbmRDb250YWluZXJDbGllbnRDb29yZHMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmNvbnRhaW5lckJCKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyQkI7XG4gIH1cblxuICB2YXIgY29udGFpbmVyID0gdGhpcy5jb250YWluZXI7XG4gIHZhciByZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc3R5bGUgPSB3aW5kb3ckMS5nZXRDb21wdXRlZFN0eWxlKGNvbnRhaW5lcik7XG5cbiAgdmFyIHN0eWxlVmFsdWUgPSBmdW5jdGlvbiBzdHlsZVZhbHVlKG5hbWUpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpKTtcbiAgfTtcblxuICB2YXIgcGFkZGluZyA9IHtcbiAgICBsZWZ0OiBzdHlsZVZhbHVlKCdwYWRkaW5nLWxlZnQnKSxcbiAgICByaWdodDogc3R5bGVWYWx1ZSgncGFkZGluZy1yaWdodCcpLFxuICAgIHRvcDogc3R5bGVWYWx1ZSgncGFkZGluZy10b3AnKSxcbiAgICBib3R0b206IHN0eWxlVmFsdWUoJ3BhZGRpbmctYm90dG9tJylcbiAgfTtcbiAgdmFyIGJvcmRlciA9IHtcbiAgICBsZWZ0OiBzdHlsZVZhbHVlKCdib3JkZXItbGVmdC13aWR0aCcpLFxuICAgIHJpZ2h0OiBzdHlsZVZhbHVlKCdib3JkZXItcmlnaHQtd2lkdGgnKSxcbiAgICB0b3A6IHN0eWxlVmFsdWUoJ2JvcmRlci10b3Atd2lkdGgnKSxcbiAgICBib3R0b206IHN0eWxlVmFsdWUoJ2JvcmRlci1ib3R0b20td2lkdGgnKVxuICB9O1xuICB2YXIgY2xpZW50V2lkdGggPSBjb250YWluZXIuY2xpZW50V2lkdGg7XG4gIHZhciBjbGllbnRIZWlnaHQgPSBjb250YWluZXIuY2xpZW50SGVpZ2h0O1xuICB2YXIgcGFkZGluZ0hvciA9IHBhZGRpbmcubGVmdCArIHBhZGRpbmcucmlnaHQ7XG4gIHZhciBwYWRkaW5nVmVyID0gcGFkZGluZy50b3AgKyBwYWRkaW5nLmJvdHRvbTtcbiAgdmFyIGJvcmRlckhvciA9IGJvcmRlci5sZWZ0ICsgYm9yZGVyLnJpZ2h0O1xuICB2YXIgc2NhbGUgPSByZWN0LndpZHRoIC8gKGNsaWVudFdpZHRoICsgYm9yZGVySG9yKTtcbiAgdmFyIHVuc2NhbGVkVyA9IGNsaWVudFdpZHRoIC0gcGFkZGluZ0hvcjtcbiAgdmFyIHVuc2NhbGVkSCA9IGNsaWVudEhlaWdodCAtIHBhZGRpbmdWZXI7XG4gIHZhciBsZWZ0ID0gcmVjdC5sZWZ0ICsgcGFkZGluZy5sZWZ0ICsgYm9yZGVyLmxlZnQ7XG4gIHZhciB0b3AgPSByZWN0LnRvcCArIHBhZGRpbmcudG9wICsgYm9yZGVyLnRvcDtcbiAgcmV0dXJuIHRoaXMuY29udGFpbmVyQkIgPSBbbGVmdCwgdG9wLCB1bnNjYWxlZFcsIHVuc2NhbGVkSCwgc2NhbGVdO1xufTtcblxuQlJwJGUuaW52YWxpZGF0ZUNvbnRhaW5lckNsaWVudENvb3Jkc0NhY2hlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNvbnRhaW5lckJCID0gbnVsbDtcbn07XG5cbkJScCRlLmZpbmROZWFyZXN0RWxlbWVudCA9IGZ1bmN0aW9uICh4LCB5LCBpbnRlcmFjdGl2ZUVsZW1lbnRzT25seSwgaXNUb3VjaCkge1xuICByZXR1cm4gdGhpcy5maW5kTmVhcmVzdEVsZW1lbnRzKHgsIHksIGludGVyYWN0aXZlRWxlbWVudHNPbmx5LCBpc1RvdWNoKVswXTtcbn07XG5cbkJScCRlLmZpbmROZWFyZXN0RWxlbWVudHMgPSBmdW5jdGlvbiAoeCwgeSwgaW50ZXJhY3RpdmVFbGVtZW50c09ubHksIGlzVG91Y2gpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBlbGVzID0gci5nZXRDYWNoZWRaU29ydGVkRWxlcygpO1xuICB2YXIgbmVhciA9IFtdOyAvLyAxIG5vZGUgbWF4LCAxIGVkZ2UgbWF4XG5cbiAgdmFyIHpvb20gPSByLmN5Lnpvb20oKTtcbiAgdmFyIGhhc0NvbXBvdW5kcyA9IHIuY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICB2YXIgZWRnZVRocmVzaG9sZCA9IChpc1RvdWNoID8gMjQgOiA4KSAvIHpvb207XG4gIHZhciBub2RlVGhyZXNob2xkID0gKGlzVG91Y2ggPyA4IDogMikgLyB6b29tO1xuICB2YXIgbGFiZWxUaHJlc2hvbGQgPSAoaXNUb3VjaCA/IDggOiAyKSAvIHpvb207XG4gIHZhciBtaW5TcURpc3QgPSBJbmZpbml0eTtcbiAgdmFyIG5lYXJFZGdlO1xuICB2YXIgbmVhck5vZGU7XG5cbiAgaWYgKGludGVyYWN0aXZlRWxlbWVudHNPbmx5KSB7XG4gICAgZWxlcyA9IGVsZXMuaW50ZXJhY3RpdmU7XG4gIH1cblxuICBmdW5jdGlvbiBhZGRFbGUoZWxlLCBzcURpc3QpIHtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICBpZiAobmVhck5vZGUpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBjYW4ndCByZXBsYWNlIG5vZGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5lYXJOb2RlID0gZWxlO1xuICAgICAgICBuZWFyLnB1c2goZWxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWxlLmlzRWRnZSgpICYmIChzcURpc3QgPT0gbnVsbCB8fCBzcURpc3QgPCBtaW5TcURpc3QpKSB7XG4gICAgICBpZiAobmVhckVkZ2UpIHtcbiAgICAgICAgLy8gdGhlbiByZXBsYWNlIGV4aXN0aW5nIGVkZ2VcbiAgICAgICAgLy8gY2FuIHJlcGxhY2Ugb25seSBpZiBzYW1lIHotaW5kZXhcbiAgICAgICAgaWYgKG5lYXJFZGdlLnBzdHlsZSgnei1jb21wb3VuZC1kZXB0aCcpLnZhbHVlID09PSBlbGUucHN0eWxlKCd6LWNvbXBvdW5kLWRlcHRoJykudmFsdWUgJiYgbmVhckVkZ2UucHN0eWxlKCd6LWNvbXBvdW5kLWRlcHRoJykudmFsdWUgPT09IGVsZS5wc3R5bGUoJ3otY29tcG91bmQtZGVwdGgnKS52YWx1ZSkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVhci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5lYXJbaV0uaXNFZGdlKCkpIHtcbiAgICAgICAgICAgICAgbmVhcltpXSA9IGVsZTtcbiAgICAgICAgICAgICAgbmVhckVkZ2UgPSBlbGU7XG4gICAgICAgICAgICAgIG1pblNxRGlzdCA9IHNxRGlzdCAhPSBudWxsID8gc3FEaXN0IDogbWluU3FEaXN0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5lYXIucHVzaChlbGUpO1xuICAgICAgICBuZWFyRWRnZSA9IGVsZTtcbiAgICAgICAgbWluU3FEaXN0ID0gc3FEaXN0ICE9IG51bGwgPyBzcURpc3QgOiBtaW5TcURpc3Q7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tOb2RlKG5vZGUpIHtcbiAgICB2YXIgd2lkdGggPSBub2RlLm91dGVyV2lkdGgoKSArIDIgKiBub2RlVGhyZXNob2xkO1xuICAgIHZhciBoZWlnaHQgPSBub2RlLm91dGVySGVpZ2h0KCkgKyAyICogbm9kZVRocmVzaG9sZDtcbiAgICB2YXIgaHcgPSB3aWR0aCAvIDI7XG4gICAgdmFyIGhoID0gaGVpZ2h0IC8gMjtcbiAgICB2YXIgcG9zID0gbm9kZS5wb3NpdGlvbigpO1xuXG4gICAgaWYgKHBvcy54IC0gaHcgPD0geCAmJiB4IDw9IHBvcy54ICsgaHcgLy8gYmIgY2hlY2sgeFxuICAgICYmIHBvcy55IC0gaGggPD0geSAmJiB5IDw9IHBvcy55ICsgaGggLy8gYmIgY2hlY2sgeVxuICAgICkge1xuICAgICAgdmFyIHNoYXBlID0gci5ub2RlU2hhcGVzW3NlbGYuZ2V0Tm9kZVNoYXBlKG5vZGUpXTtcblxuICAgICAgaWYgKHNoYXBlLmNoZWNrUG9pbnQoeCwgeSwgMCwgd2lkdGgsIGhlaWdodCwgcG9zLngsIHBvcy55KSkge1xuICAgICAgICBhZGRFbGUobm9kZSwgMCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNoZWNrRWRnZShlZGdlKSB7XG4gICAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgICB2YXIgc3R5bGVXaWR0aCA9IGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWU7XG4gICAgdmFyIHNjYWxlID0gZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykudmFsdWU7XG4gICAgdmFyIHdpZHRoID0gc3R5bGVXaWR0aCAvIDIgKyBlZGdlVGhyZXNob2xkOyAvLyBtb3JlIGxpa2UgYSBkaXN0YW5jZSByYWRpdXMgZnJvbSBjZW50cmVcblxuICAgIHZhciB3aWR0aFNxID0gd2lkdGggKiB3aWR0aDtcbiAgICB2YXIgd2lkdGgyID0gd2lkdGggKiAyO1xuICAgIHZhciBzcmMgPSBfcC5zb3VyY2U7XG4gICAgdmFyIHRndCA9IF9wLnRhcmdldDtcbiAgICB2YXIgc3FEaXN0O1xuXG4gICAgaWYgKHJzLmVkZ2VUeXBlID09PSAnc2VnbWVudHMnIHx8IHJzLmVkZ2VUeXBlID09PSAnc3RyYWlnaHQnIHx8IHJzLmVkZ2VUeXBlID09PSAnaGF5c3RhY2snKSB7XG4gICAgICB2YXIgcHRzID0gcnMuYWxscHRzO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSArIDMgPCBwdHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgaWYgKGluTGluZVZpY2luaXR5KHgsIHksIHB0c1tpXSwgcHRzW2kgKyAxXSwgcHRzW2kgKyAyXSwgcHRzW2kgKyAzXSwgd2lkdGgyKSAmJiB3aWR0aFNxID4gKHNxRGlzdCA9IHNxZGlzdFRvRmluaXRlTGluZSh4LCB5LCBwdHNbaV0sIHB0c1tpICsgMV0sIHB0c1tpICsgMl0sIHB0c1tpICsgM10pKSkge1xuICAgICAgICAgIGFkZEVsZShlZGdlLCBzcURpc3QpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChycy5lZGdlVHlwZSA9PT0gJ2JlemllcicgfHwgcnMuZWRnZVR5cGUgPT09ICdtdWx0aWJlemllcicgfHwgcnMuZWRnZVR5cGUgPT09ICdzZWxmJyB8fCBycy5lZGdlVHlwZSA9PT0gJ2NvbXBvdW5kJykge1xuICAgICAgdmFyIHB0cyA9IHJzLmFsbHB0cztcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgKyA1IDwgcnMuYWxscHRzLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIGlmIChpbkJlemllclZpY2luaXR5KHgsIHksIHB0c1tpXSwgcHRzW2kgKyAxXSwgcHRzW2kgKyAyXSwgcHRzW2kgKyAzXSwgcHRzW2kgKyA0XSwgcHRzW2kgKyA1XSwgd2lkdGgyKSAmJiB3aWR0aFNxID4gKHNxRGlzdCA9IHNxZGlzdFRvUXVhZHJhdGljQmV6aWVyKHgsIHksIHB0c1tpXSwgcHRzW2kgKyAxXSwgcHRzW2kgKyAyXSwgcHRzW2kgKyAzXSwgcHRzW2kgKyA0XSwgcHRzW2kgKyA1XSkpKSB7XG4gICAgICAgICAgYWRkRWxlKGVkZ2UsIHNxRGlzdCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIGlmIHdlJ3JlIGNsb3NlIHRvIHRoZSBlZGdlIGJ1dCBkaWRuJ3QgaGl0IGl0LCBtYXliZSB3ZSBoaXQgaXRzIGFycm93c1xuXG5cbiAgICB2YXIgc3JjID0gc3JjIHx8IF9wLnNvdXJjZTtcbiAgICB2YXIgdGd0ID0gdGd0IHx8IF9wLnRhcmdldDtcbiAgICB2YXIgYXJTaXplID0gc2VsZi5nZXRBcnJvd1dpZHRoKHN0eWxlV2lkdGgsIHNjYWxlKTtcbiAgICB2YXIgYXJyb3dzID0gW3tcbiAgICAgIG5hbWU6ICdzb3VyY2UnLFxuICAgICAgeDogcnMuYXJyb3dTdGFydFgsXG4gICAgICB5OiBycy5hcnJvd1N0YXJ0WSxcbiAgICAgIGFuZ2xlOiBycy5zcmNBcnJvd0FuZ2xlXG4gICAgfSwge1xuICAgICAgbmFtZTogJ3RhcmdldCcsXG4gICAgICB4OiBycy5hcnJvd0VuZFgsXG4gICAgICB5OiBycy5hcnJvd0VuZFksXG4gICAgICBhbmdsZTogcnMudGd0QXJyb3dBbmdsZVxuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdtaWQtc291cmNlJyxcbiAgICAgIHg6IHJzLm1pZFgsXG4gICAgICB5OiBycy5taWRZLFxuICAgICAgYW5nbGU6IHJzLm1pZHNyY0Fycm93QW5nbGVcbiAgICB9LCB7XG4gICAgICBuYW1lOiAnbWlkLXRhcmdldCcsXG4gICAgICB4OiBycy5taWRYLFxuICAgICAgeTogcnMubWlkWSxcbiAgICAgIGFuZ2xlOiBycy5taWR0Z3RBcnJvd0FuZ2xlXG4gICAgfV07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGFyID0gYXJyb3dzW2ldO1xuICAgICAgdmFyIHNoYXBlID0gci5hcnJvd1NoYXBlc1tlZGdlLnBzdHlsZShhci5uYW1lICsgJy1hcnJvdy1zaGFwZScpLnZhbHVlXTtcbiAgICAgIHZhciBlZGdlV2lkdGggPSBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuXG4gICAgICBpZiAoc2hhcGUucm91Z2hDb2xsaWRlKHgsIHksIGFyU2l6ZSwgYXIuYW5nbGUsIHtcbiAgICAgICAgeDogYXIueCxcbiAgICAgICAgeTogYXIueVxuICAgICAgfSwgZWRnZVdpZHRoLCBlZGdlVGhyZXNob2xkKSAmJiBzaGFwZS5jb2xsaWRlKHgsIHksIGFyU2l6ZSwgYXIuYW5nbGUsIHtcbiAgICAgICAgeDogYXIueCxcbiAgICAgICAgeTogYXIueVxuICAgICAgfSwgZWRnZVdpZHRoLCBlZGdlVGhyZXNob2xkKSkge1xuICAgICAgICBhZGRFbGUoZWRnZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gLy8gZm9yIGNvbXBvdW5kIGdyYXBocywgaGl0dGluZyBlZGdlIG1heSBhY3R1YWxseSB3YW50IGEgY29ubmVjdGVkIG5vZGUgaW5zdGVhZCAoYi9jIGVkZ2UgbWF5IGhhdmUgZ3JlYXRlciB6LWluZGV4IHByZWNlZGVuY2UpXG5cblxuICAgIGlmIChoYXNDb21wb3VuZHMgJiYgbmVhci5sZW5ndGggPiAwKSB7XG4gICAgICBjaGVja05vZGUoc3JjKTtcbiAgICAgIGNoZWNrTm9kZSh0Z3QpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXByb3Aob2JqLCBuYW1lLCBwcmUpIHtcbiAgICByZXR1cm4gZ2V0UHJlZml4ZWRQcm9wZXJ0eShvYmosIG5hbWUsIHByZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjaGVja0xhYmVsKGVsZSwgcHJlZml4KSB7XG4gICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgIHZhciB0aCA9IGxhYmVsVGhyZXNob2xkO1xuICAgIHZhciBwcmVmaXhEYXNoO1xuXG4gICAgaWYgKHByZWZpeCkge1xuICAgICAgcHJlZml4RGFzaCA9IHByZWZpeCArICctJztcbiAgICB9IGVsc2Uge1xuICAgICAgcHJlZml4RGFzaCA9ICcnO1xuICAgIH1cblxuICAgIGVsZS5ib3VuZGluZ0JveCgpO1xuICAgIHZhciBiYiA9IF9wLmxhYmVsQm91bmRzW3ByZWZpeCB8fCAnbWFpbiddO1xuICAgIHZhciB0ZXh0ID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ2xhYmVsJykudmFsdWU7XG4gICAgdmFyIGV2ZW50c0VuYWJsZWQgPSBlbGUucHN0eWxlKCd0ZXh0LWV2ZW50cycpLnN0clZhbHVlID09PSAneWVzJztcblxuICAgIGlmICghZXZlbnRzRW5hYmxlZCB8fCAhdGV4dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBseCA9IHByZXByb3AoX3AucnNjcmF0Y2gsICdsYWJlbFgnLCBwcmVmaXgpO1xuICAgIHZhciBseSA9IHByZXByb3AoX3AucnNjcmF0Y2gsICdsYWJlbFknLCBwcmVmaXgpO1xuICAgIHZhciB0aGV0YSA9IHByZXByb3AoX3AucnNjcmF0Y2gsICdsYWJlbEFuZ2xlJywgcHJlZml4KTtcbiAgICB2YXIgb3ggPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAndGV4dC1tYXJnaW4teCcpLnBmVmFsdWU7XG4gICAgdmFyIG95ID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ3RleHQtbWFyZ2luLXknKS5wZlZhbHVlO1xuICAgIHZhciBseDEgPSBiYi54MSAtIHRoIC0gb3g7IC8vICgtb3gsIC1veSkgYXMgYmIgYWxyZWFkeSBpbmNsdWRlcyBtYXJnaW5cblxuICAgIHZhciBseDIgPSBiYi54MiArIHRoIC0gb3g7IC8vIGFuZCByb3RhdGlvbiBpcyBhYm91dCAobHgsIGx5KVxuXG4gICAgdmFyIGx5MSA9IGJiLnkxIC0gdGggLSBveTtcbiAgICB2YXIgbHkyID0gYmIueTIgKyB0aCAtIG95O1xuXG4gICAgaWYgKHRoZXRhKSB7XG4gICAgICB2YXIgY29zID0gTWF0aC5jb3ModGhldGEpO1xuICAgICAgdmFyIHNpbiA9IE1hdGguc2luKHRoZXRhKTtcblxuICAgICAgdmFyIHJvdGF0ZSA9IGZ1bmN0aW9uIHJvdGF0ZSh4LCB5KSB7XG4gICAgICAgIHggPSB4IC0gbHg7XG4gICAgICAgIHkgPSB5IC0gbHk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogeCAqIGNvcyAtIHkgKiBzaW4gKyBseCxcbiAgICAgICAgICB5OiB4ICogc2luICsgeSAqIGNvcyArIGx5XG4gICAgICAgIH07XG4gICAgICB9O1xuXG4gICAgICB2YXIgcHgxeTEgPSByb3RhdGUobHgxLCBseTEpO1xuICAgICAgdmFyIHB4MXkyID0gcm90YXRlKGx4MSwgbHkyKTtcbiAgICAgIHZhciBweDJ5MSA9IHJvdGF0ZShseDIsIGx5MSk7XG4gICAgICB2YXIgcHgyeTIgPSByb3RhdGUobHgyLCBseTIpO1xuICAgICAgdmFyIHBvaW50cyA9IFsvLyB3aXRoIHRoZSBtYXJnaW4gYWRkZWQgYWZ0ZXIgdGhlIHJvdGF0aW9uIGlzIGFwcGxpZWRcbiAgICAgIHB4MXkxLnggKyBveCwgcHgxeTEueSArIG95LCBweDJ5MS54ICsgb3gsIHB4MnkxLnkgKyBveSwgcHgyeTIueCArIG94LCBweDJ5Mi55ICsgb3ksIHB4MXkyLnggKyBveCwgcHgxeTIueSArIG95XTtcblxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBwb2ludHMpKSB7XG4gICAgICAgIGFkZEVsZShlbGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZG8gYSBjaGVhcGVyIGJiIGNoZWNrXG4gICAgICBpZiAoaW5Cb3VuZGluZ0JveChiYiwgeCwgeSkpIHtcbiAgICAgICAgYWRkRWxlKGVsZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSBlbGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgLy8gcmV2ZXJzZSBvcmRlciBmb3IgcHJlY2VkZW5jZVxuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuXG4gICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgY2hlY2tOb2RlKGVsZSkgfHwgY2hlY2tMYWJlbChlbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGVuIGVkZ2VcbiAgICAgIGNoZWNrRWRnZShlbGUpIHx8IGNoZWNrTGFiZWwoZWxlKSB8fCBjaGVja0xhYmVsKGVsZSwgJ3NvdXJjZScpIHx8IGNoZWNrTGFiZWwoZWxlLCAndGFyZ2V0Jyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5lYXI7XG59OyAvLyAnR2l2ZSBtZSBldmVyeXRoaW5nIGZyb20gdGhpcyBib3gnXG5cblxuQlJwJGUuZ2V0QWxsSW5Cb3ggPSBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIpIHtcbiAgdmFyIGVsZXMgPSB0aGlzLmdldENhY2hlZFpTb3J0ZWRFbGVzKCkuaW50ZXJhY3RpdmU7XG4gIHZhciBib3ggPSBbXTtcbiAgdmFyIHgxYyA9IE1hdGgubWluKHgxLCB4Mik7XG4gIHZhciB4MmMgPSBNYXRoLm1heCh4MSwgeDIpO1xuICB2YXIgeTFjID0gTWF0aC5taW4oeTEsIHkyKTtcbiAgdmFyIHkyYyA9IE1hdGgubWF4KHkxLCB5Mik7XG4gIHgxID0geDFjO1xuICB4MiA9IHgyYztcbiAgeTEgPSB5MWM7XG4gIHkyID0geTJjO1xuICB2YXIgYm94QmIgPSBtYWtlQm91bmRpbmdCb3goe1xuICAgIHgxOiB4MSxcbiAgICB5MTogeTEsXG4gICAgeDI6IHgyLFxuICAgIHkyOiB5MlxuICB9KTtcblxuICBmb3IgKHZhciBlID0gMDsgZSA8IGVsZXMubGVuZ3RoOyBlKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tlXTtcblxuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIHZhciBub2RlID0gZWxlO1xuICAgICAgdmFyIG5vZGVCYiA9IG5vZGUuYm91bmRpbmdCb3goe1xuICAgICAgICBpbmNsdWRlTm9kZXM6IHRydWUsXG4gICAgICAgIGluY2x1ZGVFZGdlczogZmFsc2UsXG4gICAgICAgIGluY2x1ZGVMYWJlbHM6IGZhbHNlXG4gICAgICB9KTtcblxuICAgICAgaWYgKGJvdW5kaW5nQm94ZXNJbnRlcnNlY3QoYm94QmIsIG5vZGVCYikgJiYgIWJvdW5kaW5nQm94SW5Cb3VuZGluZ0JveChub2RlQmIsIGJveEJiKSkge1xuICAgICAgICBib3gucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGVkZ2UgPSBlbGU7XG4gICAgICB2YXIgX3AgPSBlZGdlLl9wcml2YXRlO1xuICAgICAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG5cbiAgICAgIGlmIChycy5zdGFydFggIT0gbnVsbCAmJiBycy5zdGFydFkgIT0gbnVsbCAmJiAhaW5Cb3VuZGluZ0JveChib3hCYiwgcnMuc3RhcnRYLCBycy5zdGFydFkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocnMuZW5kWCAhPSBudWxsICYmIHJzLmVuZFkgIT0gbnVsbCAmJiAhaW5Cb3VuZGluZ0JveChib3hCYiwgcnMuZW5kWCwgcnMuZW5kWSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChycy5lZGdlVHlwZSA9PT0gJ2JlemllcicgfHwgcnMuZWRnZVR5cGUgPT09ICdtdWx0aWJlemllcicgfHwgcnMuZWRnZVR5cGUgPT09ICdzZWxmJyB8fCBycy5lZGdlVHlwZSA9PT0gJ2NvbXBvdW5kJyB8fCBycy5lZGdlVHlwZSA9PT0gJ3NlZ21lbnRzJyB8fCBycy5lZGdlVHlwZSA9PT0gJ2hheXN0YWNrJykge1xuICAgICAgICB2YXIgcHRzID0gX3AucnN0eWxlLmJlemllclB0cyB8fCBfcC5yc3R5bGUubGluZVB0cyB8fCBfcC5yc3R5bGUuaGF5c3RhY2tQdHM7XG4gICAgICAgIHZhciBhbGxJbnNpZGUgPSB0cnVlO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCFwb2ludEluQm91bmRpbmdCb3goYm94QmIsIHB0c1tpXSkpIHtcbiAgICAgICAgICAgIGFsbEluc2lkZSA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFsbEluc2lkZSkge1xuICAgICAgICAgIGJveC5wdXNoKGVkZ2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJzLmVkZ2VUeXBlID09PSAnaGF5c3RhY2snIHx8IHJzLmVkZ2VUeXBlID09PSAnc3RyYWlnaHQnKSB7XG4gICAgICAgIGJveC5wdXNoKGVkZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBib3g7XG59O1xuXG52YXIgQlJwJGQgPSB7fTtcblxuQlJwJGQuY2FsY3VsYXRlQXJyb3dBbmdsZXMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgaXNIYXlzdGFjayA9IHJzLmVkZ2VUeXBlID09PSAnaGF5c3RhY2snO1xuICB2YXIgaXNCZXppZXIgPSBycy5lZGdlVHlwZSA9PT0gJ2Jlemllcic7XG4gIHZhciBpc011bHRpYmV6aWVyID0gcnMuZWRnZVR5cGUgPT09ICdtdWx0aWJlemllcic7XG4gIHZhciBpc1NlZ21lbnRzID0gcnMuZWRnZVR5cGUgPT09ICdzZWdtZW50cyc7XG4gIHZhciBpc0NvbXBvdW5kID0gcnMuZWRnZVR5cGUgPT09ICdjb21wb3VuZCc7XG4gIHZhciBpc1NlbGYgPSBycy5lZGdlVHlwZSA9PT0gJ3NlbGYnOyAvLyBEaXNwbGFjZW1lbnQgZ2l2ZXMgZGlyZWN0aW9uIGZvciBhcnJvd2hlYWQgb3JpZW50YXRpb25cblxuICB2YXIgZGlzcFgsIGRpc3BZO1xuICB2YXIgc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksIG1pZFgsIG1pZFk7XG5cbiAgaWYgKGlzSGF5c3RhY2spIHtcbiAgICBzdGFydFggPSBycy5oYXlzdGFja1B0c1swXTtcbiAgICBzdGFydFkgPSBycy5oYXlzdGFja1B0c1sxXTtcbiAgICBlbmRYID0gcnMuaGF5c3RhY2tQdHNbMl07XG4gICAgZW5kWSA9IHJzLmhheXN0YWNrUHRzWzNdO1xuICB9IGVsc2Uge1xuICAgIHN0YXJ0WCA9IHJzLmFycm93U3RhcnRYO1xuICAgIHN0YXJ0WSA9IHJzLmFycm93U3RhcnRZO1xuICAgIGVuZFggPSBycy5hcnJvd0VuZFg7XG4gICAgZW5kWSA9IHJzLmFycm93RW5kWTtcbiAgfVxuXG4gIG1pZFggPSBycy5taWRYO1xuICBtaWRZID0gcnMubWlkWTsgLy8gc291cmNlXG4gIC8vXG5cbiAgaWYgKGlzU2VnbWVudHMpIHtcbiAgICBkaXNwWCA9IHN0YXJ0WCAtIHJzLnNlZ3B0c1swXTtcbiAgICBkaXNwWSA9IHN0YXJ0WSAtIHJzLnNlZ3B0c1sxXTtcbiAgfSBlbHNlIGlmIChpc011bHRpYmV6aWVyIHx8IGlzQ29tcG91bmQgfHwgaXNTZWxmIHx8IGlzQmV6aWVyKSB7XG4gICAgdmFyIHB0cyA9IHJzLmFsbHB0cztcbiAgICB2YXIgYlggPSBxYmV6aWVyQXQocHRzWzBdLCBwdHNbMl0sIHB0c1s0XSwgMC4xKTtcbiAgICB2YXIgYlkgPSBxYmV6aWVyQXQocHRzWzFdLCBwdHNbM10sIHB0c1s1XSwgMC4xKTtcbiAgICBkaXNwWCA9IHN0YXJ0WCAtIGJYO1xuICAgIGRpc3BZID0gc3RhcnRZIC0gYlk7XG4gIH0gZWxzZSB7XG4gICAgZGlzcFggPSBzdGFydFggLSBtaWRYO1xuICAgIGRpc3BZID0gc3RhcnRZIC0gbWlkWTtcbiAgfVxuXG4gIHJzLnNyY0Fycm93QW5nbGUgPSBnZXRBbmdsZUZyb21EaXNwKGRpc3BYLCBkaXNwWSk7IC8vIG1pZCB0YXJnZXRcbiAgLy9cblxuICB2YXIgbWlkWCA9IHJzLm1pZFg7XG4gIHZhciBtaWRZID0gcnMubWlkWTtcblxuICBpZiAoaXNIYXlzdGFjaykge1xuICAgIG1pZFggPSAoc3RhcnRYICsgZW5kWCkgLyAyO1xuICAgIG1pZFkgPSAoc3RhcnRZICsgZW5kWSkgLyAyO1xuICB9XG5cbiAgZGlzcFggPSBlbmRYIC0gc3RhcnRYO1xuICBkaXNwWSA9IGVuZFkgLSBzdGFydFk7XG5cbiAgaWYgKGlzU2VnbWVudHMpIHtcbiAgICB2YXIgcHRzID0gcnMuYWxscHRzO1xuXG4gICAgaWYgKHB0cy5sZW5ndGggLyAyICUgMiA9PT0gMCkge1xuICAgICAgdmFyIGkyID0gcHRzLmxlbmd0aCAvIDI7XG4gICAgICB2YXIgaTEgPSBpMiAtIDI7XG4gICAgICBkaXNwWCA9IHB0c1tpMl0gLSBwdHNbaTFdO1xuICAgICAgZGlzcFkgPSBwdHNbaTIgKyAxXSAtIHB0c1tpMSArIDFdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgaTIgPSBwdHMubGVuZ3RoIC8gMiAtIDE7XG4gICAgICB2YXIgaTEgPSBpMiAtIDI7XG4gICAgICB2YXIgaTMgPSBpMiArIDI7XG4gICAgICBkaXNwWCA9IHB0c1tpMl0gLSBwdHNbaTFdO1xuICAgICAgZGlzcFkgPSBwdHNbaTIgKyAxXSAtIHB0c1tpMSArIDFdO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc011bHRpYmV6aWVyIHx8IGlzQ29tcG91bmQgfHwgaXNTZWxmKSB7XG4gICAgdmFyIHB0cyA9IHJzLmFsbHB0cztcbiAgICB2YXIgY3B0cyA9IHJzLmN0cmxwdHM7XG4gICAgdmFyIGJwMHgsIGJwMHk7XG4gICAgdmFyIGJwMXgsIGJwMXk7XG5cbiAgICBpZiAoY3B0cy5sZW5ndGggLyAyICUgMiA9PT0gMCkge1xuICAgICAgdmFyIHAwID0gcHRzLmxlbmd0aCAvIDIgLSAxOyAvLyBzdGFydHB0XG5cbiAgICAgIHZhciBpYyA9IHAwICsgMjtcbiAgICAgIHZhciBwMSA9IGljICsgMjtcbiAgICAgIGJwMHggPSBxYmV6aWVyQXQocHRzW3AwXSwgcHRzW2ljXSwgcHRzW3AxXSwgMC4wKTtcbiAgICAgIGJwMHkgPSBxYmV6aWVyQXQocHRzW3AwICsgMV0sIHB0c1tpYyArIDFdLCBwdHNbcDEgKyAxXSwgMC4wKTtcbiAgICAgIGJwMXggPSBxYmV6aWVyQXQocHRzW3AwXSwgcHRzW2ljXSwgcHRzW3AxXSwgMC4wMDAxKTtcbiAgICAgIGJwMXkgPSBxYmV6aWVyQXQocHRzW3AwICsgMV0sIHB0c1tpYyArIDFdLCBwdHNbcDEgKyAxXSwgMC4wMDAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGljID0gcHRzLmxlbmd0aCAvIDIgLSAxOyAvLyBjdHJwdFxuXG4gICAgICB2YXIgcDAgPSBpYyAtIDI7IC8vIHN0YXJ0cHRcblxuICAgICAgdmFyIHAxID0gaWMgKyAyOyAvLyBlbmRwdFxuXG4gICAgICBicDB4ID0gcWJlemllckF0KHB0c1twMF0sIHB0c1tpY10sIHB0c1twMV0sIDAuNDk5OSk7XG4gICAgICBicDB5ID0gcWJlemllckF0KHB0c1twMCArIDFdLCBwdHNbaWMgKyAxXSwgcHRzW3AxICsgMV0sIDAuNDk5OSk7XG4gICAgICBicDF4ID0gcWJlemllckF0KHB0c1twMF0sIHB0c1tpY10sIHB0c1twMV0sIDAuNSk7XG4gICAgICBicDF5ID0gcWJlemllckF0KHB0c1twMCArIDFdLCBwdHNbaWMgKyAxXSwgcHRzW3AxICsgMV0sIDAuNSk7XG4gICAgfVxuXG4gICAgZGlzcFggPSBicDF4IC0gYnAweDtcbiAgICBkaXNwWSA9IGJwMXkgLSBicDB5O1xuICB9XG5cbiAgcnMubWlkdGd0QXJyb3dBbmdsZSA9IGdldEFuZ2xlRnJvbURpc3AoZGlzcFgsIGRpc3BZKTtcbiAgcnMubWlkRGlzcFggPSBkaXNwWDtcbiAgcnMubWlkRGlzcFkgPSBkaXNwWTsgLy8gbWlkIHNvdXJjZVxuICAvL1xuXG4gIGRpc3BYICo9IC0xO1xuICBkaXNwWSAqPSAtMTtcblxuICBpZiAoaXNTZWdtZW50cykge1xuICAgIHZhciBwdHMgPSBycy5hbGxwdHM7XG5cbiAgICBpZiAocHRzLmxlbmd0aCAvIDIgJSAyID09PSAwKSA7IGVsc2Uge1xuICAgICAgdmFyIGkyID0gcHRzLmxlbmd0aCAvIDIgLSAxO1xuICAgICAgdmFyIGkzID0gaTIgKyAyO1xuICAgICAgZGlzcFggPSAtKHB0c1tpM10gLSBwdHNbaTJdKTtcbiAgICAgIGRpc3BZID0gLShwdHNbaTMgKyAxXSAtIHB0c1tpMiArIDFdKTtcbiAgICB9XG4gIH1cblxuICBycy5taWRzcmNBcnJvd0FuZ2xlID0gZ2V0QW5nbGVGcm9tRGlzcChkaXNwWCwgZGlzcFkpOyAvLyB0YXJnZXRcbiAgLy9cblxuICBpZiAoaXNTZWdtZW50cykge1xuICAgIGRpc3BYID0gZW5kWCAtIHJzLnNlZ3B0c1tycy5zZWdwdHMubGVuZ3RoIC0gMl07XG4gICAgZGlzcFkgPSBlbmRZIC0gcnMuc2VncHRzW3JzLnNlZ3B0cy5sZW5ndGggLSAxXTtcbiAgfSBlbHNlIGlmIChpc011bHRpYmV6aWVyIHx8IGlzQ29tcG91bmQgfHwgaXNTZWxmIHx8IGlzQmV6aWVyKSB7XG4gICAgdmFyIHB0cyA9IHJzLmFsbHB0cztcbiAgICB2YXIgbCA9IHB0cy5sZW5ndGg7XG4gICAgdmFyIGJYID0gcWJlemllckF0KHB0c1tsIC0gNl0sIHB0c1tsIC0gNF0sIHB0c1tsIC0gMl0sIDAuOSk7XG4gICAgdmFyIGJZID0gcWJlemllckF0KHB0c1tsIC0gNV0sIHB0c1tsIC0gM10sIHB0c1tsIC0gMV0sIDAuOSk7XG4gICAgZGlzcFggPSBlbmRYIC0gYlg7XG4gICAgZGlzcFkgPSBlbmRZIC0gYlk7XG4gIH0gZWxzZSB7XG4gICAgZGlzcFggPSBlbmRYIC0gbWlkWDtcbiAgICBkaXNwWSA9IGVuZFkgLSBtaWRZO1xuICB9XG5cbiAgcnMudGd0QXJyb3dBbmdsZSA9IGdldEFuZ2xlRnJvbURpc3AoZGlzcFgsIGRpc3BZKTtcbn07XG5cbkJScCRkLmdldEFycm93V2lkdGggPSBCUnAkZC5nZXRBcnJvd0hlaWdodCA9IGZ1bmN0aW9uIChlZGdlV2lkdGgsIHNjYWxlKSB7XG4gIHZhciBjYWNoZSA9IHRoaXMuYXJyb3dXaWR0aENhY2hlID0gdGhpcy5hcnJvd1dpZHRoQ2FjaGUgfHwge307XG4gIHZhciBjYWNoZWRWYWwgPSBjYWNoZVtlZGdlV2lkdGggKyAnLCAnICsgc2NhbGVdO1xuXG4gIGlmIChjYWNoZWRWYWwpIHtcbiAgICByZXR1cm4gY2FjaGVkVmFsO1xuICB9XG5cbiAgY2FjaGVkVmFsID0gTWF0aC5tYXgoTWF0aC5wb3coZWRnZVdpZHRoICogMTMuMzcsIDAuOSksIDI5KSAqIHNjYWxlO1xuICBjYWNoZVtlZGdlV2lkdGggKyAnLCAnICsgc2NhbGVdID0gY2FjaGVkVmFsO1xuICByZXR1cm4gY2FjaGVkVmFsO1xufTtcblxudmFyIEJScCRjID0ge307XG5cbkJScCRjLmZpbmRIYXlzdGFja1BvaW50cyA9IGZ1bmN0aW9uIChlZGdlcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVkZ2UgPSBlZGdlc1tpXTtcbiAgICB2YXIgX3AgPSBlZGdlLl9wcml2YXRlO1xuICAgIHZhciBycyA9IF9wLnJzY3JhdGNoO1xuXG4gICAgaWYgKCFycy5oYXlzdGFjaykge1xuICAgICAgdmFyIGFuZ2xlID0gTWF0aC5yYW5kb20oKSAqIDIgKiBNYXRoLlBJO1xuICAgICAgcnMuc291cmNlID0ge1xuICAgICAgICB4OiBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgIHk6IE1hdGguc2luKGFuZ2xlKVxuICAgICAgfTtcbiAgICAgIGFuZ2xlID0gTWF0aC5yYW5kb20oKSAqIDIgKiBNYXRoLlBJO1xuICAgICAgcnMudGFyZ2V0ID0ge1xuICAgICAgICB4OiBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgIHk6IE1hdGguc2luKGFuZ2xlKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgc3JjID0gX3Auc291cmNlO1xuICAgIHZhciB0Z3QgPSBfcC50YXJnZXQ7XG4gICAgdmFyIHNyY1BvcyA9IHNyYy5wb3NpdGlvbigpO1xuICAgIHZhciB0Z3RQb3MgPSB0Z3QucG9zaXRpb24oKTtcbiAgICB2YXIgc3JjVyA9IHNyYy53aWR0aCgpO1xuICAgIHZhciB0Z3RXID0gdGd0LndpZHRoKCk7XG4gICAgdmFyIHNyY0ggPSBzcmMuaGVpZ2h0KCk7XG4gICAgdmFyIHRndEggPSB0Z3QuaGVpZ2h0KCk7XG4gICAgdmFyIHJhZGl1cyA9IGVkZ2UucHN0eWxlKCdoYXlzdGFjay1yYWRpdXMnKS52YWx1ZTtcbiAgICB2YXIgaGFsZlJhZGl1cyA9IHJhZGl1cyAvIDI7IC8vIGIvYyBoYXZlIHRvIGhhbGYgd2lkdGgvaGVpZ2h0XG5cbiAgICBycy5oYXlzdGFja1B0cyA9IHJzLmFsbHB0cyA9IFtycy5zb3VyY2UueCAqIHNyY1cgKiBoYWxmUmFkaXVzICsgc3JjUG9zLngsIHJzLnNvdXJjZS55ICogc3JjSCAqIGhhbGZSYWRpdXMgKyBzcmNQb3MueSwgcnMudGFyZ2V0LnggKiB0Z3RXICogaGFsZlJhZGl1cyArIHRndFBvcy54LCBycy50YXJnZXQueSAqIHRndEggKiBoYWxmUmFkaXVzICsgdGd0UG9zLnldO1xuICAgIHJzLm1pZFggPSAocnMuYWxscHRzWzBdICsgcnMuYWxscHRzWzJdKSAvIDI7XG4gICAgcnMubWlkWSA9IChycy5hbGxwdHNbMV0gKyBycy5hbGxwdHNbM10pIC8gMjsgLy8gYWx3YXlzIG92ZXJyaWRlIGFzIGhheXN0YWNrIGluIGNhc2Ugc2V0IHRvIGRpZmZlcmVudCB0eXBlIHByZXZpb3VzbHlcblxuICAgIHJzLmVkZ2VUeXBlID0gJ2hheXN0YWNrJztcbiAgICBycy5oYXlzdGFjayA9IHRydWU7XG4gICAgdGhpcy5zdG9yZUVkZ2VQcm9qZWN0aW9ucyhlZGdlKTtcbiAgICB0aGlzLmNhbGN1bGF0ZUFycm93QW5nbGVzKGVkZ2UpO1xuICAgIHRoaXMucmVjYWxjdWxhdGVFZGdlTGFiZWxQcm9qZWN0aW9ucyhlZGdlKTtcbiAgICB0aGlzLmNhbGN1bGF0ZUxhYmVsQW5nbGVzKGVkZ2UpO1xuICB9XG59O1xuXG5CUnAkYy5maW5kU2VnbWVudHNQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSwgcGFpckluZm8pIHtcbiAgLy8gU2VnbWVudHMgKG11bHRpcGxlIHN0cmFpZ2h0IGxpbmVzKVxuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgcG9zUHRzID0gcGFpckluZm8ucG9zUHRzLFxuICAgICAgaW50ZXJzZWN0aW9uUHRzID0gcGFpckluZm8uaW50ZXJzZWN0aW9uUHRzLFxuICAgICAgdmVjdG9yTm9ybUludmVyc2UgPSBwYWlySW5mby52ZWN0b3JOb3JtSW52ZXJzZTtcbiAgdmFyIGVkZ2VEaXN0YW5jZXMgPSBlZGdlLnBzdHlsZSgnZWRnZS1kaXN0YW5jZXMnKS52YWx1ZTtcbiAgdmFyIHNlZ21lbnRXcyA9IGVkZ2UucHN0eWxlKCdzZWdtZW50LXdlaWdodHMnKTtcbiAgdmFyIHNlZ21lbnREcyA9IGVkZ2UucHN0eWxlKCdzZWdtZW50LWRpc3RhbmNlcycpO1xuICB2YXIgc2VnbWVudHNOID0gTWF0aC5taW4oc2VnbWVudFdzLnBmVmFsdWUubGVuZ3RoLCBzZWdtZW50RHMucGZWYWx1ZS5sZW5ndGgpO1xuICBycy5lZGdlVHlwZSA9ICdzZWdtZW50cyc7XG4gIHJzLnNlZ3B0cyA9IFtdO1xuXG4gIGZvciAodmFyIHMgPSAwOyBzIDwgc2VnbWVudHNOOyBzKyspIHtcbiAgICB2YXIgdyA9IHNlZ21lbnRXcy5wZlZhbHVlW3NdO1xuICAgIHZhciBkID0gc2VnbWVudERzLnBmVmFsdWVbc107XG4gICAgdmFyIHcxID0gMSAtIHc7XG4gICAgdmFyIHcyID0gdztcbiAgICB2YXIgbWlkcHRQdHMgPSBlZGdlRGlzdGFuY2VzID09PSAnbm9kZS1wb3NpdGlvbicgPyBwb3NQdHMgOiBpbnRlcnNlY3Rpb25QdHM7XG4gICAgdmFyIGFkanVzdGVkTWlkcHQgPSB7XG4gICAgICB4OiBtaWRwdFB0cy54MSAqIHcxICsgbWlkcHRQdHMueDIgKiB3MixcbiAgICAgIHk6IG1pZHB0UHRzLnkxICogdzEgKyBtaWRwdFB0cy55MiAqIHcyXG4gICAgfTtcbiAgICBycy5zZWdwdHMucHVzaChhZGp1c3RlZE1pZHB0LnggKyB2ZWN0b3JOb3JtSW52ZXJzZS54ICogZCwgYWRqdXN0ZWRNaWRwdC55ICsgdmVjdG9yTm9ybUludmVyc2UueSAqIGQpO1xuICB9XG59O1xuXG5CUnAkYy5maW5kTG9vcFBvaW50cyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbywgaSwgZWRnZUlzVW5idW5kbGVkKSB7XG4gIC8vIFNlbGYtZWRnZVxuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgZGlyQ291bnRzID0gcGFpckluZm8uZGlyQ291bnRzLFxuICAgICAgc3JjUG9zID0gcGFpckluZm8uc3JjUG9zO1xuICB2YXIgY3RybHB0RGlzdHMgPSBlZGdlLnBzdHlsZSgnY29udHJvbC1wb2ludC1kaXN0YW5jZXMnKTtcbiAgdmFyIGN0cmxwdERpc3QgPSBjdHJscHREaXN0cyA/IGN0cmxwdERpc3RzLnBmVmFsdWVbMF0gOiB1bmRlZmluZWQ7XG4gIHZhciBsb29wRGlyID0gZWRnZS5wc3R5bGUoJ2xvb3AtZGlyZWN0aW9uJykucGZWYWx1ZTtcbiAgdmFyIGxvb3BTd3AgPSBlZGdlLnBzdHlsZSgnbG9vcC1zd2VlcCcpLnBmVmFsdWU7XG4gIHZhciBzdGVwU2l6ZSA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LXN0ZXAtc2l6ZScpLnBmVmFsdWU7XG4gIHJzLmVkZ2VUeXBlID0gJ3NlbGYnO1xuICB2YXIgaiA9IGk7XG4gIHZhciBsb29wRGlzdCA9IHN0ZXBTaXplO1xuXG4gIGlmIChlZGdlSXNVbmJ1bmRsZWQpIHtcbiAgICBqID0gMDtcbiAgICBsb29wRGlzdCA9IGN0cmxwdERpc3Q7XG4gIH1cblxuICB2YXIgbG9vcEFuZ2xlID0gbG9vcERpciAtIE1hdGguUEkgLyAyO1xuICB2YXIgb3V0QW5nbGUgPSBsb29wQW5nbGUgLSBsb29wU3dwIC8gMjtcbiAgdmFyIGluQW5nbGUgPSBsb29wQW5nbGUgKyBsb29wU3dwIC8gMjsgLy8gaW5jcmVhc2UgYnkgc3RlcCBzaXplIGZvciBvdmVybGFwcGluZyBsb29wcywga2V5ZWQgb24gZGlyZWN0aW9uIGFuZCBzd2VlcCB2YWx1ZXNcblxuICB2YXIgZGMgPSBTdHJpbmcobG9vcERpciArICdfJyArIGxvb3BTd3ApO1xuICBqID0gZGlyQ291bnRzW2RjXSA9PT0gdW5kZWZpbmVkID8gZGlyQ291bnRzW2RjXSA9IDAgOiArK2RpckNvdW50c1tkY107XG4gIHJzLmN0cmxwdHMgPSBbc3JjUG9zLnggKyBNYXRoLmNvcyhvdXRBbmdsZSkgKiAxLjQgKiBsb29wRGlzdCAqIChqIC8gMyArIDEpLCBzcmNQb3MueSArIE1hdGguc2luKG91dEFuZ2xlKSAqIDEuNCAqIGxvb3BEaXN0ICogKGogLyAzICsgMSksIHNyY1Bvcy54ICsgTWF0aC5jb3MoaW5BbmdsZSkgKiAxLjQgKiBsb29wRGlzdCAqIChqIC8gMyArIDEpLCBzcmNQb3MueSArIE1hdGguc2luKGluQW5nbGUpICogMS40ICogbG9vcERpc3QgKiAoaiAvIDMgKyAxKV07XG59O1xuXG5CUnAkYy5maW5kQ29tcG91bmRMb29wUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UsIHBhaXJJbmZvLCBpLCBlZGdlSXNVbmJ1bmRsZWQpIHtcbiAgLy8gQ29tcG91bmQgZWRnZVxuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICBycy5lZGdlVHlwZSA9ICdjb21wb3VuZCc7XG4gIHZhciBzcmNQb3MgPSBwYWlySW5mby5zcmNQb3MsXG4gICAgICB0Z3RQb3MgPSBwYWlySW5mby50Z3RQb3MsXG4gICAgICBzcmNXID0gcGFpckluZm8uc3JjVyxcbiAgICAgIHNyY0ggPSBwYWlySW5mby5zcmNILFxuICAgICAgdGd0VyA9IHBhaXJJbmZvLnRndFcsXG4gICAgICB0Z3RIID0gcGFpckluZm8udGd0SDtcbiAgdmFyIHN0ZXBTaXplID0gZWRnZS5wc3R5bGUoJ2NvbnRyb2wtcG9pbnQtc3RlcC1zaXplJykucGZWYWx1ZTtcbiAgdmFyIGN0cmxwdERpc3RzID0gZWRnZS5wc3R5bGUoJ2NvbnRyb2wtcG9pbnQtZGlzdGFuY2VzJyk7XG4gIHZhciBjdHJscHREaXN0ID0gY3RybHB0RGlzdHMgPyBjdHJscHREaXN0cy5wZlZhbHVlWzBdIDogdW5kZWZpbmVkO1xuICB2YXIgaiA9IGk7XG4gIHZhciBsb29wRGlzdCA9IHN0ZXBTaXplO1xuXG4gIGlmIChlZGdlSXNVbmJ1bmRsZWQpIHtcbiAgICBqID0gMDtcbiAgICBsb29wRGlzdCA9IGN0cmxwdERpc3Q7XG4gIH1cblxuICB2YXIgbG9vcFcgPSA1MDtcbiAgdmFyIGxvb3BhUG9zID0ge1xuICAgIHg6IHNyY1Bvcy54IC0gc3JjVyAvIDIsXG4gICAgeTogc3JjUG9zLnkgLSBzcmNIIC8gMlxuICB9O1xuICB2YXIgbG9vcGJQb3MgPSB7XG4gICAgeDogdGd0UG9zLnggLSB0Z3RXIC8gMixcbiAgICB5OiB0Z3RQb3MueSAtIHRndEggLyAyXG4gIH07XG4gIHZhciBsb29wUG9zID0ge1xuICAgIHg6IE1hdGgubWluKGxvb3BhUG9zLngsIGxvb3BiUG9zLngpLFxuICAgIHk6IE1hdGgubWluKGxvb3BhUG9zLnksIGxvb3BiUG9zLnkpXG4gIH07IC8vIGF2b2lkcyBjYXNlcyB3aXRoIGltcG9zc2libGUgYmV6aWVyc1xuXG4gIHZhciBtaW5Db21wb3VuZFN0cmV0Y2ggPSAwLjU7XG4gIHZhciBjb21wb3VuZFN0cmV0Y2hBID0gTWF0aC5tYXgobWluQ29tcG91bmRTdHJldGNoLCBNYXRoLmxvZyhzcmNXICogMC4wMSkpO1xuICB2YXIgY29tcG91bmRTdHJldGNoQiA9IE1hdGgubWF4KG1pbkNvbXBvdW5kU3RyZXRjaCwgTWF0aC5sb2codGd0VyAqIDAuMDEpKTtcbiAgcnMuY3RybHB0cyA9IFtsb29wUG9zLngsIGxvb3BQb3MueSAtICgxICsgTWF0aC5wb3cobG9vcFcsIDEuMTIpIC8gMTAwKSAqIGxvb3BEaXN0ICogKGogLyAzICsgMSkgKiBjb21wb3VuZFN0cmV0Y2hBLCBsb29wUG9zLnggLSAoMSArIE1hdGgucG93KGxvb3BXLCAxLjEyKSAvIDEwMCkgKiBsb29wRGlzdCAqIChqIC8gMyArIDEpICogY29tcG91bmRTdHJldGNoQiwgbG9vcFBvcy55XTtcbn07XG5cbkJScCRjLmZpbmRTdHJhaWdodEVkZ2VQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICAvLyBTdHJhaWdodCBlZGdlIHdpdGhpbiBidW5kbGVcbiAgZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaC5lZGdlVHlwZSA9ICdzdHJhaWdodCc7XG59O1xuXG5CUnAkYy5maW5kQmV6aWVyUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UsIHBhaXJJbmZvLCBpLCBlZGdlSXNVbmJ1bmRsZWQsIGVkZ2VJc1N3YXBwZWQpIHtcbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIHZlY3Rvck5vcm1JbnZlcnNlID0gcGFpckluZm8udmVjdG9yTm9ybUludmVyc2UsXG4gICAgICBwb3NQdHMgPSBwYWlySW5mby5wb3NQdHMsXG4gICAgICBpbnRlcnNlY3Rpb25QdHMgPSBwYWlySW5mby5pbnRlcnNlY3Rpb25QdHM7XG4gIHZhciBlZGdlRGlzdGFuY2VzID0gZWRnZS5wc3R5bGUoJ2VkZ2UtZGlzdGFuY2VzJykudmFsdWU7XG4gIHZhciBzdGVwU2l6ZSA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LXN0ZXAtc2l6ZScpLnBmVmFsdWU7XG4gIHZhciBjdHJscHREaXN0cyA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LWRpc3RhbmNlcycpO1xuICB2YXIgY3RybHB0V3MgPSBlZGdlLnBzdHlsZSgnY29udHJvbC1wb2ludC13ZWlnaHRzJyk7XG4gIHZhciBiZXppZXJOID0gY3RybHB0RGlzdHMgJiYgY3RybHB0V3MgPyBNYXRoLm1pbihjdHJscHREaXN0cy52YWx1ZS5sZW5ndGgsIGN0cmxwdFdzLnZhbHVlLmxlbmd0aCkgOiAxO1xuICB2YXIgY3RybHB0RGlzdCA9IGN0cmxwdERpc3RzID8gY3RybHB0RGlzdHMucGZWYWx1ZVswXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGN0cmxwdFdlaWdodCA9IGN0cmxwdFdzLnZhbHVlWzBdOyAvLyAoTXVsdGkpYmV6aWVyXG5cbiAgdmFyIG11bHRpID0gZWRnZUlzVW5idW5kbGVkO1xuICBycy5lZGdlVHlwZSA9IG11bHRpID8gJ211bHRpYmV6aWVyJyA6ICdiZXppZXInO1xuICBycy5jdHJscHRzID0gW107XG5cbiAgZm9yICh2YXIgYiA9IDA7IGIgPCBiZXppZXJOOyBiKyspIHtcbiAgICB2YXIgbm9ybWN0cmxwdERpc3QgPSAoMC41IC0gcGFpckluZm8uZWxlcy5sZW5ndGggLyAyICsgaSkgKiBzdGVwU2l6ZSAqIChlZGdlSXNTd2FwcGVkID8gLTEgOiAxKTtcbiAgICB2YXIgbWFuY3RybHB0RGlzdCA9IHZvaWQgMDtcbiAgICB2YXIgc2lnbiA9IHNpZ251bShub3JtY3RybHB0RGlzdCk7XG5cbiAgICBpZiAobXVsdGkpIHtcbiAgICAgIGN0cmxwdERpc3QgPSBjdHJscHREaXN0cyA/IGN0cmxwdERpc3RzLnBmVmFsdWVbYl0gOiBzdGVwU2l6ZTsgLy8gZmFsbCBiYWNrIG9uIHN0ZXAgc2l6ZVxuXG4gICAgICBjdHJscHRXZWlnaHQgPSBjdHJscHRXcy52YWx1ZVtiXTtcbiAgICB9XG5cbiAgICBpZiAoZWRnZUlzVW5idW5kbGVkKSB7XG4gICAgICAvLyBtdWx0aSBvciBzaW5nbGUgdW5idW5kbGVkXG4gICAgICBtYW5jdHJscHREaXN0ID0gY3RybHB0RGlzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFuY3RybHB0RGlzdCA9IGN0cmxwdERpc3QgIT09IHVuZGVmaW5lZCA/IHNpZ24gKiBjdHJscHREaXN0IDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHZhciBkaXN0YW5jZUZyb21NaWRwb2ludCA9IG1hbmN0cmxwdERpc3QgIT09IHVuZGVmaW5lZCA/IG1hbmN0cmxwdERpc3QgOiBub3JtY3RybHB0RGlzdDtcbiAgICB2YXIgdzEgPSAxIC0gY3RybHB0V2VpZ2h0O1xuICAgIHZhciB3MiA9IGN0cmxwdFdlaWdodDtcbiAgICB2YXIgbWlkcHRQdHMgPSBlZGdlRGlzdGFuY2VzID09PSAnbm9kZS1wb3NpdGlvbicgPyBwb3NQdHMgOiBpbnRlcnNlY3Rpb25QdHM7XG4gICAgdmFyIGFkanVzdGVkTWlkcHQgPSB7XG4gICAgICB4OiBtaWRwdFB0cy54MSAqIHcxICsgbWlkcHRQdHMueDIgKiB3MixcbiAgICAgIHk6IG1pZHB0UHRzLnkxICogdzEgKyBtaWRwdFB0cy55MiAqIHcyXG4gICAgfTtcbiAgICBycy5jdHJscHRzLnB1c2goYWRqdXN0ZWRNaWRwdC54ICsgdmVjdG9yTm9ybUludmVyc2UueCAqIGRpc3RhbmNlRnJvbU1pZHBvaW50LCBhZGp1c3RlZE1pZHB0LnkgKyB2ZWN0b3JOb3JtSW52ZXJzZS55ICogZGlzdGFuY2VGcm9tTWlkcG9pbnQpO1xuICB9XG59O1xuXG5CUnAkYy5maW5kVGF4aVBvaW50cyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbykge1xuICAvLyBUYXhpY2FiIGdlb21ldHJ5IHdpdGggdHdvIHR1cm5zIG1heGltdW1cbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgcnMuZWRnZVR5cGUgPSAnc2VnbWVudHMnO1xuICB2YXIgVkVSVElDQUwgPSAndmVydGljYWwnO1xuICB2YXIgSE9SSVpPTlRBTCA9ICdob3Jpem9udGFsJztcbiAgdmFyIExFRlRXQVJEID0gJ2xlZnR3YXJkJztcbiAgdmFyIFJJR0hUV0FSRCA9ICdyaWdodHdhcmQnO1xuICB2YXIgRE9XTldBUkQgPSAnZG93bndhcmQnO1xuICB2YXIgVVBXQVJEID0gJ3Vwd2FyZCc7XG4gIHZhciBBVVRPID0gJ2F1dG8nO1xuICB2YXIgcG9zUHRzID0gcGFpckluZm8ucG9zUHRzLFxuICAgICAgc3JjVyA9IHBhaXJJbmZvLnNyY1csXG4gICAgICBzcmNIID0gcGFpckluZm8uc3JjSCxcbiAgICAgIHRndFcgPSBwYWlySW5mby50Z3RXLFxuICAgICAgdGd0SCA9IHBhaXJJbmZvLnRndEg7XG4gIHZhciBlZGdlRGlzdGFuY2VzID0gZWRnZS5wc3R5bGUoJ2VkZ2UtZGlzdGFuY2VzJykudmFsdWU7XG4gIHZhciBkSW5jbHVkZXNOb2RlQm9keSA9IGVkZ2VEaXN0YW5jZXMgIT09ICdub2RlLXBvc2l0aW9uJztcbiAgdmFyIHRheGlEaXIgPSBlZGdlLnBzdHlsZSgndGF4aS1kaXJlY3Rpb24nKS52YWx1ZTtcbiAgdmFyIHJhd1RheGlEaXIgPSB0YXhpRGlyOyAvLyB1bnByb2Nlc3NlZCB2YWx1ZVxuXG4gIHZhciB0YXhpVHVybiA9IGVkZ2UucHN0eWxlKCd0YXhpLXR1cm4nKTtcbiAgdmFyIHR1cm5Jc1BlcmNlbnQgPSB0YXhpVHVybi51bml0cyA9PT0gJyUnO1xuICB2YXIgdGF4aVR1cm5QZlZhbCA9IHRheGlUdXJuLnBmVmFsdWU7XG4gIHZhciB0dXJuSXNOZWdhdGl2ZSA9IHRheGlUdXJuUGZWYWwgPCAwOyAvLyBpLmUuIGZyb20gdGFyZ2V0IHNpZGVcblxuICB2YXIgbWluRCA9IGVkZ2UucHN0eWxlKCd0YXhpLXR1cm4tbWluLWRpc3RhbmNlJykucGZWYWx1ZTtcbiAgdmFyIGR3ID0gZEluY2x1ZGVzTm9kZUJvZHkgPyAoc3JjVyArIHRndFcpIC8gMiA6IDA7XG4gIHZhciBkaCA9IGRJbmNsdWRlc05vZGVCb2R5ID8gKHNyY0ggKyB0Z3RIKSAvIDIgOiAwO1xuICB2YXIgcGR4ID0gcG9zUHRzLngyIC0gcG9zUHRzLngxO1xuICB2YXIgcGR5ID0gcG9zUHRzLnkyIC0gcG9zUHRzLnkxOyAvLyB0YWtlIGF3YXkgdGhlIGVmZmVjdGl2ZSB3L2ggZnJvbSB0aGUgbWFnbml0dWRlIG9mIHRoZSBkZWx0YSB2YWx1ZVxuXG4gIHZhciBzdWJEV0ggPSBmdW5jdGlvbiBzdWJEV0goZHh5LCBkd2gpIHtcbiAgICBpZiAoZHh5ID4gMCkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KGR4eSAtIGR3aCwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBNYXRoLm1pbihkeHkgKyBkd2gsIDApO1xuICAgIH1cbiAgfTtcblxuICB2YXIgZHggPSBzdWJEV0gocGR4LCBkdyk7XG4gIHZhciBkeSA9IHN1YkRXSChwZHksIGRoKTtcbiAgdmFyIGlzRXhwbGljaXREaXIgPSBmYWxzZTtcblxuICBpZiAocmF3VGF4aURpciA9PT0gQVVUTykge1xuICAgIHRheGlEaXIgPSBNYXRoLmFicyhkeCkgPiBNYXRoLmFicyhkeSkgPyBIT1JJWk9OVEFMIDogVkVSVElDQUw7XG4gIH0gZWxzZSBpZiAocmF3VGF4aURpciA9PT0gVVBXQVJEIHx8IHJhd1RheGlEaXIgPT09IERPV05XQVJEKSB7XG4gICAgdGF4aURpciA9IFZFUlRJQ0FMO1xuICAgIGlzRXhwbGljaXREaXIgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHJhd1RheGlEaXIgPT09IExFRlRXQVJEIHx8IHJhd1RheGlEaXIgPT09IFJJR0hUV0FSRCkge1xuICAgIHRheGlEaXIgPSBIT1JJWk9OVEFMO1xuICAgIGlzRXhwbGljaXREaXIgPSB0cnVlO1xuICB9XG5cbiAgdmFyIGlzVmVydCA9IHRheGlEaXIgPT09IFZFUlRJQ0FMO1xuICB2YXIgbCA9IGlzVmVydCA/IGR5IDogZHg7XG4gIHZhciBwbCA9IGlzVmVydCA/IHBkeSA6IHBkeDtcbiAgdmFyIHNnbkwgPSBzaWdudW0ocGwpO1xuICB2YXIgZm9yY2VkRGlyID0gZmFsc2U7XG5cbiAgaWYgKCEoaXNFeHBsaWNpdERpciAmJiAodHVybklzUGVyY2VudCB8fCB0dXJuSXNOZWdhdGl2ZSkpIC8vIGZvcmNpbmcgaW4gdGhpcyBjYXNlIHdvdWxkIGNhdXNlIHdlaXJkIGdyb3dpbmcgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvblxuICAmJiAocmF3VGF4aURpciA9PT0gRE9XTldBUkQgJiYgcGwgPCAwIHx8IHJhd1RheGlEaXIgPT09IFVQV0FSRCAmJiBwbCA+IDAgfHwgcmF3VGF4aURpciA9PT0gTEVGVFdBUkQgJiYgcGwgPiAwIHx8IHJhd1RheGlEaXIgPT09IFJJR0hUV0FSRCAmJiBwbCA8IDApKSB7XG4gICAgc2duTCAqPSAtMTtcbiAgICBsID0gc2duTCAqIE1hdGguYWJzKGwpO1xuICAgIGZvcmNlZERpciA9IHRydWU7XG4gIH1cblxuICB2YXIgZDtcblxuICBpZiAodHVybklzUGVyY2VudCkge1xuICAgIHZhciBwID0gdGF4aVR1cm5QZlZhbCA8IDAgPyAxICsgdGF4aVR1cm5QZlZhbCA6IHRheGlUdXJuUGZWYWw7XG4gICAgZCA9IHAgKiBsO1xuICB9IGVsc2Uge1xuICAgIHZhciBrID0gdGF4aVR1cm5QZlZhbCA8IDAgPyBsIDogMDtcbiAgICBkID0gayArIHRheGlUdXJuUGZWYWwgKiBzZ25MO1xuICB9XG5cbiAgdmFyIGdldElzVG9vQ2xvc2UgPSBmdW5jdGlvbiBnZXRJc1Rvb0Nsb3NlKGQpIHtcbiAgICByZXR1cm4gTWF0aC5hYnMoZCkgPCBtaW5EIHx8IE1hdGguYWJzKGQpID49IE1hdGguYWJzKGwpO1xuICB9O1xuXG4gIHZhciBpc1Rvb0Nsb3NlU3JjID0gZ2V0SXNUb29DbG9zZShkKTtcbiAgdmFyIGlzVG9vQ2xvc2VUZ3QgPSBnZXRJc1Rvb0Nsb3NlKE1hdGguYWJzKGwpIC0gTWF0aC5hYnMoZCkpO1xuICB2YXIgaXNUb29DbG9zZSA9IGlzVG9vQ2xvc2VTcmMgfHwgaXNUb29DbG9zZVRndDtcblxuICBpZiAoaXNUb29DbG9zZSAmJiAhZm9yY2VkRGlyKSB7XG4gICAgLy8gbm9uLWlkZWFsIHJvdXRpbmdcbiAgICBpZiAoaXNWZXJ0KSB7XG4gICAgICAvLyB2ZXJ0aWNhbCBmYWxsYmFja3NcbiAgICAgIHZhciBsU2hhcGVJbnNpZGVTcmMgPSBNYXRoLmFicyhwbCkgPD0gc3JjSCAvIDI7XG4gICAgICB2YXIgbFNoYXBlSW5zaWRlVGd0ID0gTWF0aC5hYnMocGR4KSA8PSB0Z3RXIC8gMjtcblxuICAgICAgaWYgKGxTaGFwZUluc2lkZVNyYykge1xuICAgICAgICAvLyBob3Jpem9udGFsIFotc2hhcGUgKGRpcmVjdGlvbiBub3QgcmVzcGVjdGVkKVxuICAgICAgICB2YXIgeCA9IChwb3NQdHMueDEgKyBwb3NQdHMueDIpIC8gMjtcbiAgICAgICAgdmFyIHkxID0gcG9zUHRzLnkxLFxuICAgICAgICAgICAgeTIgPSBwb3NQdHMueTI7XG4gICAgICAgIHJzLnNlZ3B0cyA9IFt4LCB5MSwgeCwgeTJdO1xuICAgICAgfSBlbHNlIGlmIChsU2hhcGVJbnNpZGVUZ3QpIHtcbiAgICAgICAgLy8gdmVydGljYWwgWi1zaGFwZSAoZGlzdGFuY2Ugbm90IHJlc3BlY3RlZClcbiAgICAgICAgdmFyIHkgPSAocG9zUHRzLnkxICsgcG9zUHRzLnkyKSAvIDI7XG4gICAgICAgIHZhciB4MSA9IHBvc1B0cy54MSxcbiAgICAgICAgICAgIHgyID0gcG9zUHRzLngyO1xuICAgICAgICBycy5zZWdwdHMgPSBbeDEsIHksIHgyLCB5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEwtc2hhcGUgZmFsbGJhY2sgKHR1cm4gZGlzdGFuY2Ugbm90IHJlc3BlY3RlZCwgYnV0IHdvcmtzIHdlbGwgd2l0aCB0cmVlIHNpYmxpbmdzKVxuICAgICAgICBycy5zZWdwdHMgPSBbcG9zUHRzLngxLCBwb3NQdHMueTJdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBob3Jpem9udGFsIGZhbGxiYWNrc1xuICAgICAgdmFyIF9sU2hhcGVJbnNpZGVTcmMgPSBNYXRoLmFicyhwbCkgPD0gc3JjVyAvIDI7XG5cbiAgICAgIHZhciBfbFNoYXBlSW5zaWRlVGd0ID0gTWF0aC5hYnMocGR5KSA8PSB0Z3RIIC8gMjtcblxuICAgICAgaWYgKF9sU2hhcGVJbnNpZGVTcmMpIHtcbiAgICAgICAgLy8gdmVydGljYWwgWi1zaGFwZSAoZGlyZWN0aW9uIG5vdCByZXNwZWN0ZWQpXG4gICAgICAgIHZhciBfeSA9IChwb3NQdHMueTEgKyBwb3NQdHMueTIpIC8gMjtcblxuICAgICAgICB2YXIgX3ggPSBwb3NQdHMueDEsXG4gICAgICAgICAgICBfeDIgPSBwb3NQdHMueDI7XG4gICAgICAgIHJzLnNlZ3B0cyA9IFtfeCwgX3ksIF94MiwgX3ldO1xuICAgICAgfSBlbHNlIGlmIChfbFNoYXBlSW5zaWRlVGd0KSB7XG4gICAgICAgIC8vIGhvcml6b250YWwgWi1zaGFwZSAodHVybiBkaXN0YW5jZSBub3QgcmVzcGVjdGVkKVxuICAgICAgICB2YXIgX3gzID0gKHBvc1B0cy54MSArIHBvc1B0cy54MikgLyAyO1xuXG4gICAgICAgIHZhciBfeTIgPSBwb3NQdHMueTEsXG4gICAgICAgICAgICBfeTMgPSBwb3NQdHMueTI7XG4gICAgICAgIHJzLnNlZ3B0cyA9IFtfeDMsIF95MiwgX3gzLCBfeTNdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTC1zaGFwZSAodHVybiBkaXN0YW5jZSBub3QgcmVzcGVjdGVkLCBidXQgd29ya3Mgd2VsbCBmb3IgdHJlZSBzaWJsaW5ncylcbiAgICAgICAgcnMuc2VncHRzID0gW3Bvc1B0cy54MiwgcG9zUHRzLnkxXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gaWRlYWwgcm91dGluZ1xuICAgIGlmIChpc1ZlcnQpIHtcbiAgICAgIHZhciBfeTQgPSBwb3NQdHMueTEgKyBkICsgKGRJbmNsdWRlc05vZGVCb2R5ID8gc3JjSCAvIDIgKiBzZ25MIDogMCk7XG5cbiAgICAgIHZhciBfeDQgPSBwb3NQdHMueDEsXG4gICAgICAgICAgX3g1ID0gcG9zUHRzLngyO1xuICAgICAgcnMuc2VncHRzID0gW194NCwgX3k0LCBfeDUsIF95NF07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGhvcml6b250YWxcbiAgICAgIHZhciBfeDYgPSBwb3NQdHMueDEgKyBkICsgKGRJbmNsdWRlc05vZGVCb2R5ID8gc3JjVyAvIDIgKiBzZ25MIDogMCk7XG5cbiAgICAgIHZhciBfeTUgPSBwb3NQdHMueTEsXG4gICAgICAgICAgX3k2ID0gcG9zUHRzLnkyO1xuICAgICAgcnMuc2VncHRzID0gW194NiwgX3k1LCBfeDYsIF95Nl07XG4gICAgfVxuICB9XG59O1xuXG5CUnAkYy50cnlUb0NvcnJlY3RJbnZhbGlkUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UsIHBhaXJJbmZvKSB7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7IC8vIGNhbiBvbmx5IGNvcnJlY3QgYmV6aWVycyBmb3Igbm93Li4uXG5cbiAgaWYgKHJzLmVkZ2VUeXBlID09PSAnYmV6aWVyJykge1xuICAgIHZhciBzcmNQb3MgPSBwYWlySW5mby5zcmNQb3MsXG4gICAgICAgIHRndFBvcyA9IHBhaXJJbmZvLnRndFBvcyxcbiAgICAgICAgc3JjVyA9IHBhaXJJbmZvLnNyY1csXG4gICAgICAgIHNyY0ggPSBwYWlySW5mby5zcmNILFxuICAgICAgICB0Z3RXID0gcGFpckluZm8udGd0VyxcbiAgICAgICAgdGd0SCA9IHBhaXJJbmZvLnRndEgsXG4gICAgICAgIHNyY1NoYXBlID0gcGFpckluZm8uc3JjU2hhcGUsXG4gICAgICAgIHRndFNoYXBlID0gcGFpckluZm8udGd0U2hhcGU7XG4gICAgdmFyIGJhZFN0YXJ0ID0gIW51bWJlciQxKHJzLnN0YXJ0WCkgfHwgIW51bWJlciQxKHJzLnN0YXJ0WSk7XG4gICAgdmFyIGJhZEFTdGFydCA9ICFudW1iZXIkMShycy5hcnJvd1N0YXJ0WCkgfHwgIW51bWJlciQxKHJzLmFycm93U3RhcnRZKTtcbiAgICB2YXIgYmFkRW5kID0gIW51bWJlciQxKHJzLmVuZFgpIHx8ICFudW1iZXIkMShycy5lbmRZKTtcbiAgICB2YXIgYmFkQUVuZCA9ICFudW1iZXIkMShycy5hcnJvd0VuZFgpIHx8ICFudW1iZXIkMShycy5hcnJvd0VuZFkpO1xuICAgIHZhciBtaW5DcEFEaXN0RmFjdG9yID0gMztcbiAgICB2YXIgYXJyb3dXID0gdGhpcy5nZXRBcnJvd1dpZHRoKGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWUsIGVkZ2UucHN0eWxlKCdhcnJvdy1zY2FsZScpLnZhbHVlKSAqIHRoaXMuYXJyb3dTaGFwZVdpZHRoO1xuICAgIHZhciBtaW5DcEFEaXN0ID0gbWluQ3BBRGlzdEZhY3RvciAqIGFycm93VztcbiAgICB2YXIgc3RhcnRBQ3BEaXN0ID0gZGlzdCh7XG4gICAgICB4OiBycy5jdHJscHRzWzBdLFxuICAgICAgeTogcnMuY3RybHB0c1sxXVxuICAgIH0sIHtcbiAgICAgIHg6IHJzLnN0YXJ0WCxcbiAgICAgIHk6IHJzLnN0YXJ0WVxuICAgIH0pO1xuICAgIHZhciBjbG9zZVN0YXJ0QUNwID0gc3RhcnRBQ3BEaXN0IDwgbWluQ3BBRGlzdDtcbiAgICB2YXIgZW5kQUNwRGlzdCA9IGRpc3Qoe1xuICAgICAgeDogcnMuY3RybHB0c1swXSxcbiAgICAgIHk6IHJzLmN0cmxwdHNbMV1cbiAgICB9LCB7XG4gICAgICB4OiBycy5lbmRYLFxuICAgICAgeTogcnMuZW5kWVxuICAgIH0pO1xuICAgIHZhciBjbG9zZUVuZEFDcCA9IGVuZEFDcERpc3QgPCBtaW5DcEFEaXN0O1xuICAgIHZhciBvdmVybGFwcGluZyA9IGZhbHNlO1xuXG4gICAgaWYgKGJhZFN0YXJ0IHx8IGJhZEFTdGFydCB8fCBjbG9zZVN0YXJ0QUNwKSB7XG4gICAgICBvdmVybGFwcGluZyA9IHRydWU7IC8vIHByb2plY3QgY29udHJvbCBwb2ludCBhbG9uZyBsaW5lIGZyb20gc3JjIGNlbnRyZSB0byBvdXRzaWRlIHRoZSBzcmMgc2hhcGVcbiAgICAgIC8vIChvdGhlcndpc2UgaW50ZXJzZWN0aW9uIHdpbGwgeWllbGQgbm90aGluZylcblxuICAgICAgdmFyIGNwRCA9IHtcbiAgICAgICAgLy8gZGVsdGFcbiAgICAgICAgeDogcnMuY3RybHB0c1swXSAtIHNyY1Bvcy54LFxuICAgICAgICB5OiBycy5jdHJscHRzWzFdIC0gc3JjUG9zLnlcbiAgICAgIH07XG4gICAgICB2YXIgY3BMID0gTWF0aC5zcXJ0KGNwRC54ICogY3BELnggKyBjcEQueSAqIGNwRC55KTsgLy8gbGVuZ3RoIG9mIGxpbmVcblxuICAgICAgdmFyIGNwTSA9IHtcbiAgICAgICAgLy8gbm9ybWFsaXNlZCBkZWx0YVxuICAgICAgICB4OiBjcEQueCAvIGNwTCxcbiAgICAgICAgeTogY3BELnkgLyBjcExcbiAgICAgIH07XG4gICAgICB2YXIgcmFkaXVzID0gTWF0aC5tYXgoc3JjVywgc3JjSCk7XG4gICAgICB2YXIgY3BQcm9qID0ge1xuICAgICAgICAvLyAqMiByYWRpdXMgZ3VhcmFudGVlcyBvdXRzaWRlIHNoYXBlXG4gICAgICAgIHg6IHJzLmN0cmxwdHNbMF0gKyBjcE0ueCAqIDIgKiByYWRpdXMsXG4gICAgICAgIHk6IHJzLmN0cmxwdHNbMV0gKyBjcE0ueSAqIDIgKiByYWRpdXNcbiAgICAgIH07XG4gICAgICB2YXIgc3JjQ3RybFB0SW50biA9IHNyY1NoYXBlLmludGVyc2VjdExpbmUoc3JjUG9zLngsIHNyY1Bvcy55LCBzcmNXLCBzcmNILCBjcFByb2oueCwgY3BQcm9qLnksIDApO1xuXG4gICAgICBpZiAoY2xvc2VTdGFydEFDcCkge1xuICAgICAgICBycy5jdHJscHRzWzBdID0gcnMuY3RybHB0c1swXSArIGNwTS54ICogKG1pbkNwQURpc3QgLSBzdGFydEFDcERpc3QpO1xuICAgICAgICBycy5jdHJscHRzWzFdID0gcnMuY3RybHB0c1sxXSArIGNwTS55ICogKG1pbkNwQURpc3QgLSBzdGFydEFDcERpc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcnMuY3RybHB0c1swXSA9IHNyY0N0cmxQdEludG5bMF0gKyBjcE0ueCAqIG1pbkNwQURpc3Q7XG4gICAgICAgIHJzLmN0cmxwdHNbMV0gPSBzcmNDdHJsUHRJbnRuWzFdICsgY3BNLnkgKiBtaW5DcEFEaXN0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChiYWRFbmQgfHwgYmFkQUVuZCB8fCBjbG9zZUVuZEFDcCkge1xuICAgICAgb3ZlcmxhcHBpbmcgPSB0cnVlOyAvLyBwcm9qZWN0IGNvbnRyb2wgcG9pbnQgYWxvbmcgbGluZSBmcm9tIHRndCBjZW50cmUgdG8gb3V0c2lkZSB0aGUgdGd0IHNoYXBlXG4gICAgICAvLyAob3RoZXJ3aXNlIGludGVyc2VjdGlvbiB3aWxsIHlpZWxkIG5vdGhpbmcpXG5cbiAgICAgIHZhciBfY3BEID0ge1xuICAgICAgICAvLyBkZWx0YVxuICAgICAgICB4OiBycy5jdHJscHRzWzBdIC0gdGd0UG9zLngsXG4gICAgICAgIHk6IHJzLmN0cmxwdHNbMV0gLSB0Z3RQb3MueVxuICAgICAgfTtcblxuICAgICAgdmFyIF9jcEwgPSBNYXRoLnNxcnQoX2NwRC54ICogX2NwRC54ICsgX2NwRC55ICogX2NwRC55KTsgLy8gbGVuZ3RoIG9mIGxpbmVcblxuXG4gICAgICB2YXIgX2NwTSA9IHtcbiAgICAgICAgLy8gbm9ybWFsaXNlZCBkZWx0YVxuICAgICAgICB4OiBfY3BELnggLyBfY3BMLFxuICAgICAgICB5OiBfY3BELnkgLyBfY3BMXG4gICAgICB9O1xuXG4gICAgICB2YXIgX3JhZGl1cyA9IE1hdGgubWF4KHNyY1csIHNyY0gpO1xuXG4gICAgICB2YXIgX2NwUHJvaiA9IHtcbiAgICAgICAgLy8gKjIgcmFkaXVzIGd1YXJhbnRlZXMgb3V0c2lkZSBzaGFwZVxuICAgICAgICB4OiBycy5jdHJscHRzWzBdICsgX2NwTS54ICogMiAqIF9yYWRpdXMsXG4gICAgICAgIHk6IHJzLmN0cmxwdHNbMV0gKyBfY3BNLnkgKiAyICogX3JhZGl1c1xuICAgICAgfTtcbiAgICAgIHZhciB0Z3RDdHJsUHRJbnRuID0gdGd0U2hhcGUuaW50ZXJzZWN0TGluZSh0Z3RQb3MueCwgdGd0UG9zLnksIHRndFcsIHRndEgsIF9jcFByb2oueCwgX2NwUHJvai55LCAwKTtcblxuICAgICAgaWYgKGNsb3NlRW5kQUNwKSB7XG4gICAgICAgIHJzLmN0cmxwdHNbMF0gPSBycy5jdHJscHRzWzBdICsgX2NwTS54ICogKG1pbkNwQURpc3QgLSBlbmRBQ3BEaXN0KTtcbiAgICAgICAgcnMuY3RybHB0c1sxXSA9IHJzLmN0cmxwdHNbMV0gKyBfY3BNLnkgKiAobWluQ3BBRGlzdCAtIGVuZEFDcERpc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcnMuY3RybHB0c1swXSA9IHRndEN0cmxQdEludG5bMF0gKyBfY3BNLnggKiBtaW5DcEFEaXN0O1xuICAgICAgICBycy5jdHJscHRzWzFdID0gdGd0Q3RybFB0SW50blsxXSArIF9jcE0ueSAqIG1pbkNwQURpc3Q7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG92ZXJsYXBwaW5nKSB7XG4gICAgICAvLyByZWNhbGMgZW5kcHRzXG4gICAgICB0aGlzLmZpbmRFbmRwb2ludHMoZWRnZSk7XG4gICAgfVxuICB9XG59O1xuXG5CUnAkYy5zdG9yZUFsbHB0cyA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG5cbiAgaWYgKHJzLmVkZ2VUeXBlID09PSAnbXVsdGliZXppZXInIHx8IHJzLmVkZ2VUeXBlID09PSAnYmV6aWVyJyB8fCBycy5lZGdlVHlwZSA9PT0gJ3NlbGYnIHx8IHJzLmVkZ2VUeXBlID09PSAnY29tcG91bmQnKSB7XG4gICAgcnMuYWxscHRzID0gW107XG4gICAgcnMuYWxscHRzLnB1c2gocnMuc3RhcnRYLCBycy5zdGFydFkpO1xuXG4gICAgZm9yICh2YXIgYiA9IDA7IGIgKyAxIDwgcnMuY3RybHB0cy5sZW5ndGg7IGIgKz0gMikge1xuICAgICAgLy8gY3RybCBwdCBpdHNlbGZcbiAgICAgIHJzLmFsbHB0cy5wdXNoKHJzLmN0cmxwdHNbYl0sIHJzLmN0cmxwdHNbYiArIDFdKTsgLy8gdGhlIG1pZHB0IGJldHdlZW4gY3RybHB0cyBhcyBpbnRlcm1lZGlhdGUgZGVzdGluYXRpb24gcHRzXG5cbiAgICAgIGlmIChiICsgMyA8IHJzLmN0cmxwdHMubGVuZ3RoKSB7XG4gICAgICAgIHJzLmFsbHB0cy5wdXNoKChycy5jdHJscHRzW2JdICsgcnMuY3RybHB0c1tiICsgMl0pIC8gMiwgKHJzLmN0cmxwdHNbYiArIDFdICsgcnMuY3RybHB0c1tiICsgM10pIC8gMik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcnMuYWxscHRzLnB1c2gocnMuZW5kWCwgcnMuZW5kWSk7XG4gICAgdmFyIG0sIG10O1xuXG4gICAgaWYgKHJzLmN0cmxwdHMubGVuZ3RoIC8gMiAlIDIgPT09IDApIHtcbiAgICAgIG0gPSBycy5hbGxwdHMubGVuZ3RoIC8gMiAtIDE7XG4gICAgICBycy5taWRYID0gcnMuYWxscHRzW21dO1xuICAgICAgcnMubWlkWSA9IHJzLmFsbHB0c1ttICsgMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSBycy5hbGxwdHMubGVuZ3RoIC8gMiAtIDM7XG4gICAgICBtdCA9IDAuNTtcbiAgICAgIHJzLm1pZFggPSBxYmV6aWVyQXQocnMuYWxscHRzW21dLCBycy5hbGxwdHNbbSArIDJdLCBycy5hbGxwdHNbbSArIDRdLCBtdCk7XG4gICAgICBycy5taWRZID0gcWJlemllckF0KHJzLmFsbHB0c1ttICsgMV0sIHJzLmFsbHB0c1ttICsgM10sIHJzLmFsbHB0c1ttICsgNV0sIG10KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocnMuZWRnZVR5cGUgPT09ICdzdHJhaWdodCcpIHtcbiAgICAvLyBuZWVkIHRvIGNhbGMgdGhlc2UgYWZ0ZXIgZW5kcHRzXG4gICAgcnMuYWxscHRzID0gW3JzLnN0YXJ0WCwgcnMuc3RhcnRZLCBycy5lbmRYLCBycy5lbmRZXTsgLy8gZGVmYXVsdCBtaWRwdCBmb3IgbGFiZWxzIGV0Y1xuXG4gICAgcnMubWlkWCA9IChycy5zdGFydFggKyBycy5lbmRYICsgcnMuYXJyb3dTdGFydFggKyBycy5hcnJvd0VuZFgpIC8gNDtcbiAgICBycy5taWRZID0gKHJzLnN0YXJ0WSArIHJzLmVuZFkgKyBycy5hcnJvd1N0YXJ0WSArIHJzLmFycm93RW5kWSkgLyA0O1xuICB9IGVsc2UgaWYgKHJzLmVkZ2VUeXBlID09PSAnc2VnbWVudHMnKSB7XG4gICAgcnMuYWxscHRzID0gW107XG4gICAgcnMuYWxscHRzLnB1c2gocnMuc3RhcnRYLCBycy5zdGFydFkpO1xuICAgIHJzLmFsbHB0cy5wdXNoLmFwcGx5KHJzLmFsbHB0cywgcnMuc2VncHRzKTtcbiAgICBycy5hbGxwdHMucHVzaChycy5lbmRYLCBycy5lbmRZKTtcblxuICAgIGlmIChycy5zZWdwdHMubGVuZ3RoICUgNCA9PT0gMCkge1xuICAgICAgdmFyIGkyID0gcnMuc2VncHRzLmxlbmd0aCAvIDI7XG4gICAgICB2YXIgaTEgPSBpMiAtIDI7XG4gICAgICBycy5taWRYID0gKHJzLnNlZ3B0c1tpMV0gKyBycy5zZWdwdHNbaTJdKSAvIDI7XG4gICAgICBycy5taWRZID0gKHJzLnNlZ3B0c1tpMSArIDFdICsgcnMuc2VncHRzW2kyICsgMV0pIC8gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9pID0gcnMuc2VncHRzLmxlbmd0aCAvIDIgLSAxO1xuXG4gICAgICBycy5taWRYID0gcnMuc2VncHRzW19pXTtcbiAgICAgIHJzLm1pZFkgPSBycy5zZWdwdHNbX2kgKyAxXTtcbiAgICB9XG4gIH1cbn07XG5cbkJScCRjLmNoZWNrRm9ySW52YWxpZEVkZ2VXYXJuaW5nID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHJzID0gZWRnZVswXS5fcHJpdmF0ZS5yc2NyYXRjaDtcblxuICBpZiAocnMubm9kZXNPdmVybGFwIHx8IG51bWJlciQxKHJzLnN0YXJ0WCkgJiYgbnVtYmVyJDEocnMuc3RhcnRZKSAmJiBudW1iZXIkMShycy5lbmRYKSAmJiBudW1iZXIkMShycy5lbmRZKSkge1xuICAgIHJzLmxvZ2dlZEVyciA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIGlmICghcnMubG9nZ2VkRXJyKSB7XG4gICAgICBycy5sb2dnZWRFcnIgPSB0cnVlO1xuICAgICAgd2FybignRWRnZSBgJyArIGVkZ2UuaWQoKSArICdgIGhhcyBpbnZhbGlkIGVuZHBvaW50cyBhbmQgc28gaXQgaXMgaW1wb3NzaWJsZSB0byBkcmF3LiAgQWRqdXN0IHlvdXIgZWRnZSBzdHlsZSAoZS5nLiBjb250cm9sIHBvaW50cykgYWNjb3JkaW5nbHkgb3IgdXNlIGFuIGFsdGVybmF0aXZlIGVkZ2UgdHlwZS4gIFRoaXMgaXMgZXhwZWN0ZWQgYmVoYXZpb3VyIHdoZW4gdGhlIHNvdXJjZSBub2RlIGFuZCB0aGUgdGFyZ2V0IG5vZGUgb3ZlcmxhcC4nKTtcbiAgICB9XG4gIH1cbn07XG5cbkJScCRjLmZpbmRFZGdlQ29udHJvbFBvaW50cyA9IGZ1bmN0aW9uIChlZGdlcykge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIGlmICghZWRnZXMgfHwgZWRnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgY3kgPSByLmN5O1xuICB2YXIgaGFzQ29tcG91bmRzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICB2YXIgaGFzaFRhYmxlID0ge1xuICAgIG1hcDogbmV3IE1hcCQxKCksXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQocGFpcklkKSB7XG4gICAgICB2YXIgbWFwMiA9IHRoaXMubWFwLmdldChwYWlySWRbMF0pO1xuXG4gICAgICBpZiAobWFwMiAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBtYXAyLmdldChwYWlySWRbMV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChwYWlySWQsIHZhbCkge1xuICAgICAgdmFyIG1hcDIgPSB0aGlzLm1hcC5nZXQocGFpcklkWzBdKTtcblxuICAgICAgaWYgKG1hcDIgPT0gbnVsbCkge1xuICAgICAgICBtYXAyID0gbmV3IE1hcCQxKCk7XG4gICAgICAgIHRoaXMubWFwLnNldChwYWlySWRbMF0sIG1hcDIpO1xuICAgICAgfVxuXG4gICAgICBtYXAyLnNldChwYWlySWRbMV0sIHZhbCk7XG4gICAgfVxuICB9O1xuICB2YXIgcGFpcklkcyA9IFtdO1xuICB2YXIgaGF5c3RhY2tFZGdlcyA9IFtdOyAvLyBjcmVhdGUgYSB0YWJsZSBvZiBlZGdlIChzcmMsIHRndCkgPT4gbGlzdCBvZiBlZGdlcyBiZXR3ZWVuIHRoZW1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVkZ2UgPSBlZGdlc1tpXTtcbiAgICB2YXIgX3AgPSBlZGdlLl9wcml2YXRlO1xuICAgIHZhciBjdXJ2ZVN0eWxlID0gZWRnZS5wc3R5bGUoJ2N1cnZlLXN0eWxlJykudmFsdWU7IC8vIGlnbm9yZSBlZGdlcyB3aG8gYXJlIG5vdCB0byBiZSBkaXNwbGF5ZWRcbiAgICAvLyB0aGV5IHNob3VsZG4ndCB0YWtlIHVwIHNwYWNlXG5cbiAgICBpZiAoZWRnZS5yZW1vdmVkKCkgfHwgIWVkZ2UudGFrZXNVcFNwYWNlKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJ2ZVN0eWxlID09PSAnaGF5c3RhY2snKSB7XG4gICAgICBoYXlzdGFja0VkZ2VzLnB1c2goZWRnZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgZWRnZUlzVW5idW5kbGVkID0gY3VydmVTdHlsZSA9PT0gJ3VuYnVuZGxlZC1iZXppZXInIHx8IGN1cnZlU3R5bGUgPT09ICdzZWdtZW50cycgfHwgY3VydmVTdHlsZSA9PT0gJ3N0cmFpZ2h0JyB8fCBjdXJ2ZVN0eWxlID09PSAnc3RyYWlnaHQtdHJpYW5nbGUnIHx8IGN1cnZlU3R5bGUgPT09ICd0YXhpJztcbiAgICB2YXIgZWRnZUlzQmV6aWVyID0gY3VydmVTdHlsZSA9PT0gJ3VuYnVuZGxlZC1iZXppZXInIHx8IGN1cnZlU3R5bGUgPT09ICdiZXppZXInO1xuICAgIHZhciBzcmMgPSBfcC5zb3VyY2U7XG4gICAgdmFyIHRndCA9IF9wLnRhcmdldDtcbiAgICB2YXIgc3JjSW5kZXggPSBzcmMucG9vbEluZGV4KCk7XG4gICAgdmFyIHRndEluZGV4ID0gdGd0LnBvb2xJbmRleCgpO1xuICAgIHZhciBwYWlySWQgPSBbc3JjSW5kZXgsIHRndEluZGV4XS5zb3J0KCk7XG4gICAgdmFyIHRhYmxlRW50cnkgPSBoYXNoVGFibGUuZ2V0KHBhaXJJZCk7XG5cbiAgICBpZiAodGFibGVFbnRyeSA9PSBudWxsKSB7XG4gICAgICB0YWJsZUVudHJ5ID0ge1xuICAgICAgICBlbGVzOiBbXVxuICAgICAgfTtcbiAgICAgIGhhc2hUYWJsZS5zZXQocGFpcklkLCB0YWJsZUVudHJ5KTtcbiAgICAgIHBhaXJJZHMucHVzaChwYWlySWQpO1xuICAgIH1cblxuICAgIHRhYmxlRW50cnkuZWxlcy5wdXNoKGVkZ2UpO1xuXG4gICAgaWYgKGVkZ2VJc1VuYnVuZGxlZCkge1xuICAgICAgdGFibGVFbnRyeS5oYXNVbmJ1bmRsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChlZGdlSXNCZXppZXIpIHtcbiAgICAgIHRhYmxlRW50cnkuaGFzQmV6aWVyID0gdHJ1ZTtcbiAgICB9XG4gIH0gLy8gZm9yIGVhY2ggcGFpciAoc3JjLCB0Z3QpLCBjcmVhdGUgdGhlIGN0cmwgcHRzXG4gIC8vIE5lc3RlZCBmb3IgbG9vcCBpcyBPSzsgdG90YWwgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgZm9yIGJvdGggbG9vcHMgPSBlZGdlQ291bnRcblxuXG4gIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKHApIHtcbiAgICB2YXIgcGFpcklkID0gcGFpcklkc1twXTtcbiAgICB2YXIgcGFpckluZm8gPSBoYXNoVGFibGUuZ2V0KHBhaXJJZCk7XG4gICAgdmFyIHN3YXBwZWRwYWlySW5mbyA9IHZvaWQgMDtcblxuICAgIGlmICghcGFpckluZm8uaGFzVW5idW5kbGVkKSB7XG4gICAgICB2YXIgcGxsRWRnZXMgPSBwYWlySW5mby5lbGVzWzBdLnBhcmFsbGVsRWRnZXMoKS5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUuaXNCdW5kbGVkQmV6aWVyKCk7XG4gICAgICB9KTtcbiAgICAgIGNsZWFyQXJyYXkocGFpckluZm8uZWxlcyk7XG4gICAgICBwbGxFZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgIHJldHVybiBwYWlySW5mby5lbGVzLnB1c2goZWRnZSk7XG4gICAgICB9KTsgLy8gZm9yIGVhY2ggcGFpciBpZCwgdGhlIGVkZ2VzIHNob3VsZCBiZSBzb3J0ZWQgYnkgaW5kZXhcblxuICAgICAgcGFpckluZm8uZWxlcy5zb3J0KGZ1bmN0aW9uIChlZGdlMSwgZWRnZTIpIHtcbiAgICAgICAgcmV0dXJuIGVkZ2UxLnBvb2xJbmRleCgpIC0gZWRnZTIucG9vbEluZGV4KCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgZmlyc3RFZGdlID0gcGFpckluZm8uZWxlc1swXTtcbiAgICB2YXIgc3JjID0gZmlyc3RFZGdlLnNvdXJjZSgpO1xuICAgIHZhciB0Z3QgPSBmaXJzdEVkZ2UudGFyZ2V0KCk7IC8vIG1ha2Ugc3VyZSBzcmMvdGd0IGRpc3RpbmN0aW9uIGlzIGNvbnNpc3RlbnQgdy5yLnQuIHBhaXJJZFxuXG4gICAgaWYgKHNyYy5wb29sSW5kZXgoKSA+IHRndC5wb29sSW5kZXgoKSkge1xuICAgICAgdmFyIHRlbXAgPSBzcmM7XG4gICAgICBzcmMgPSB0Z3Q7XG4gICAgICB0Z3QgPSB0ZW1wO1xuICAgIH1cblxuICAgIHZhciBzcmNQb3MgPSBwYWlySW5mby5zcmNQb3MgPSBzcmMucG9zaXRpb24oKTtcbiAgICB2YXIgdGd0UG9zID0gcGFpckluZm8udGd0UG9zID0gdGd0LnBvc2l0aW9uKCk7XG4gICAgdmFyIHNyY1cgPSBwYWlySW5mby5zcmNXID0gc3JjLm91dGVyV2lkdGgoKTtcbiAgICB2YXIgc3JjSCA9IHBhaXJJbmZvLnNyY0ggPSBzcmMub3V0ZXJIZWlnaHQoKTtcbiAgICB2YXIgdGd0VyA9IHBhaXJJbmZvLnRndFcgPSB0Z3Qub3V0ZXJXaWR0aCgpO1xuICAgIHZhciB0Z3RIID0gcGFpckluZm8udGd0SCA9IHRndC5vdXRlckhlaWdodCgpO1xuXG4gICAgdmFyIHNyY1NoYXBlID0gcGFpckluZm8uc3JjU2hhcGUgPSByLm5vZGVTaGFwZXNbX3RoaXMuZ2V0Tm9kZVNoYXBlKHNyYyldO1xuXG4gICAgdmFyIHRndFNoYXBlID0gcGFpckluZm8udGd0U2hhcGUgPSByLm5vZGVTaGFwZXNbX3RoaXMuZ2V0Tm9kZVNoYXBlKHRndCldO1xuXG4gICAgcGFpckluZm8uZGlyQ291bnRzID0ge1xuICAgICAgJ25vcnRoJzogMCxcbiAgICAgICd3ZXN0JzogMCxcbiAgICAgICdzb3V0aCc6IDAsXG4gICAgICAnZWFzdCc6IDAsXG4gICAgICAnbm9ydGh3ZXN0JzogMCxcbiAgICAgICdzb3V0aHdlc3QnOiAwLFxuICAgICAgJ25vcnRoZWFzdCc6IDAsXG4gICAgICAnc291dGhlYXN0JzogMFxuICAgIH07XG5cbiAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBwYWlySW5mby5lbGVzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgIHZhciBfZWRnZSA9IHBhaXJJbmZvLmVsZXNbX2kyXTtcbiAgICAgIHZhciBycyA9IF9lZGdlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuXG4gICAgICB2YXIgX2N1cnZlU3R5bGUgPSBfZWRnZS5wc3R5bGUoJ2N1cnZlLXN0eWxlJykudmFsdWU7XG5cbiAgICAgIHZhciBfZWRnZUlzVW5idW5kbGVkID0gX2N1cnZlU3R5bGUgPT09ICd1bmJ1bmRsZWQtYmV6aWVyJyB8fCBfY3VydmVTdHlsZSA9PT0gJ3NlZ21lbnRzJyB8fCBfY3VydmVTdHlsZSA9PT0gJ3RheGknOyAvLyB3aGV0aGVyIHRoZSBub3JtYWxpc2VkIHBhaXIgb3JkZXIgaXMgdGhlIHJldmVyc2Ugb2YgdGhlIGVkZ2UncyBzcmMtdGd0IG9yZGVyXG5cblxuICAgICAgdmFyIGVkZ2VJc1N3YXBwZWQgPSAhc3JjLnNhbWUoX2VkZ2Uuc291cmNlKCkpO1xuXG4gICAgICBpZiAoIXBhaXJJbmZvLmNhbGN1bGF0ZWRJbnRlcnNlY3Rpb24gJiYgc3JjICE9PSB0Z3QgJiYgKHBhaXJJbmZvLmhhc0JlemllciB8fCBwYWlySW5mby5oYXNVbmJ1bmRsZWQpKSB7XG4gICAgICAgIHBhaXJJbmZvLmNhbGN1bGF0ZWRJbnRlcnNlY3Rpb24gPSB0cnVlOyAvLyBwdCBvdXRzaWRlIHNyYyBzaGFwZSB0byBjYWxjIGRpc3RhbmNlL2Rpc3BsYWNlbWVudCBmcm9tIHNyYyB0byB0Z3RcblxuICAgICAgICB2YXIgc3JjT3V0c2lkZSA9IHNyY1NoYXBlLmludGVyc2VjdExpbmUoc3JjUG9zLngsIHNyY1Bvcy55LCBzcmNXLCBzcmNILCB0Z3RQb3MueCwgdGd0UG9zLnksIDApO1xuICAgICAgICB2YXIgc3JjSW50biA9IHBhaXJJbmZvLnNyY0ludG4gPSBzcmNPdXRzaWRlOyAvLyBwdCBvdXRzaWRlIHRndCBzaGFwZSB0byBjYWxjIGRpc3RhbmNlL2Rpc3BsYWNlbWVudCBmcm9tIHNyYyB0byB0Z3RcblxuICAgICAgICB2YXIgdGd0T3V0c2lkZSA9IHRndFNoYXBlLmludGVyc2VjdExpbmUodGd0UG9zLngsIHRndFBvcy55LCB0Z3RXLCB0Z3RILCBzcmNQb3MueCwgc3JjUG9zLnksIDApO1xuICAgICAgICB2YXIgdGd0SW50biA9IHBhaXJJbmZvLnRndEludG4gPSB0Z3RPdXRzaWRlO1xuICAgICAgICB2YXIgaW50ZXJzZWN0aW9uUHRzID0gcGFpckluZm8uaW50ZXJzZWN0aW9uUHRzID0ge1xuICAgICAgICAgIHgxOiBzcmNPdXRzaWRlWzBdLFxuICAgICAgICAgIHgyOiB0Z3RPdXRzaWRlWzBdLFxuICAgICAgICAgIHkxOiBzcmNPdXRzaWRlWzFdLFxuICAgICAgICAgIHkyOiB0Z3RPdXRzaWRlWzFdXG4gICAgICAgIH07XG4gICAgICAgIHZhciBwb3NQdHMgPSBwYWlySW5mby5wb3NQdHMgPSB7XG4gICAgICAgICAgeDE6IHNyY1Bvcy54LFxuICAgICAgICAgIHgyOiB0Z3RQb3MueCxcbiAgICAgICAgICB5MTogc3JjUG9zLnksXG4gICAgICAgICAgeTI6IHRndFBvcy55XG4gICAgICAgIH07XG4gICAgICAgIHZhciBkeSA9IHRndE91dHNpZGVbMV0gLSBzcmNPdXRzaWRlWzFdO1xuICAgICAgICB2YXIgZHggPSB0Z3RPdXRzaWRlWzBdIC0gc3JjT3V0c2lkZVswXTtcbiAgICAgICAgdmFyIGwgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgICAgICB2YXIgdmVjdG9yID0gcGFpckluZm8udmVjdG9yID0ge1xuICAgICAgICAgIHg6IGR4LFxuICAgICAgICAgIHk6IGR5XG4gICAgICAgIH07XG4gICAgICAgIHZhciB2ZWN0b3JOb3JtID0gcGFpckluZm8udmVjdG9yTm9ybSA9IHtcbiAgICAgICAgICB4OiB2ZWN0b3IueCAvIGwsXG4gICAgICAgICAgeTogdmVjdG9yLnkgLyBsXG4gICAgICAgIH07XG4gICAgICAgIHZhciB2ZWN0b3JOb3JtSW52ZXJzZSA9IHtcbiAgICAgICAgICB4OiAtdmVjdG9yTm9ybS55LFxuICAgICAgICAgIHk6IHZlY3Rvck5vcm0ueFxuICAgICAgICB9OyAvLyBpZiBub2RlIHNoYXBlcyBvdmVybGFwLCB0aGVuIG5vIGN0cmwgcHRzIHRvIGRyYXdcblxuICAgICAgICBwYWlySW5mby5ub2Rlc092ZXJsYXAgPSAhbnVtYmVyJDEobCkgfHwgdGd0U2hhcGUuY2hlY2tQb2ludChzcmNPdXRzaWRlWzBdLCBzcmNPdXRzaWRlWzFdLCAwLCB0Z3RXLCB0Z3RILCB0Z3RQb3MueCwgdGd0UG9zLnkpIHx8IHNyY1NoYXBlLmNoZWNrUG9pbnQodGd0T3V0c2lkZVswXSwgdGd0T3V0c2lkZVsxXSwgMCwgc3JjVywgc3JjSCwgc3JjUG9zLngsIHNyY1Bvcy55KTtcbiAgICAgICAgcGFpckluZm8udmVjdG9yTm9ybUludmVyc2UgPSB2ZWN0b3JOb3JtSW52ZXJzZTtcbiAgICAgICAgc3dhcHBlZHBhaXJJbmZvID0ge1xuICAgICAgICAgIG5vZGVzT3ZlcmxhcDogcGFpckluZm8ubm9kZXNPdmVybGFwLFxuICAgICAgICAgIGRpckNvdW50czogcGFpckluZm8uZGlyQ291bnRzLFxuICAgICAgICAgIGNhbGN1bGF0ZWRJbnRlcnNlY3Rpb246IHRydWUsXG4gICAgICAgICAgaGFzQmV6aWVyOiBwYWlySW5mby5oYXNCZXppZXIsXG4gICAgICAgICAgaGFzVW5idW5kbGVkOiBwYWlySW5mby5oYXNVbmJ1bmRsZWQsXG4gICAgICAgICAgZWxlczogcGFpckluZm8uZWxlcyxcbiAgICAgICAgICBzcmNQb3M6IHRndFBvcyxcbiAgICAgICAgICB0Z3RQb3M6IHNyY1BvcyxcbiAgICAgICAgICBzcmNXOiB0Z3RXLFxuICAgICAgICAgIHNyY0g6IHRndEgsXG4gICAgICAgICAgdGd0Vzogc3JjVyxcbiAgICAgICAgICB0Z3RIOiBzcmNILFxuICAgICAgICAgIHNyY0ludG46IHRndEludG4sXG4gICAgICAgICAgdGd0SW50bjogc3JjSW50bixcbiAgICAgICAgICBzcmNTaGFwZTogdGd0U2hhcGUsXG4gICAgICAgICAgdGd0U2hhcGU6IHNyY1NoYXBlLFxuICAgICAgICAgIHBvc1B0czoge1xuICAgICAgICAgICAgeDE6IHBvc1B0cy54MixcbiAgICAgICAgICAgIHkxOiBwb3NQdHMueTIsXG4gICAgICAgICAgICB4MjogcG9zUHRzLngxLFxuICAgICAgICAgICAgeTI6IHBvc1B0cy55MVxuICAgICAgICAgIH0sXG4gICAgICAgICAgaW50ZXJzZWN0aW9uUHRzOiB7XG4gICAgICAgICAgICB4MTogaW50ZXJzZWN0aW9uUHRzLngyLFxuICAgICAgICAgICAgeTE6IGludGVyc2VjdGlvblB0cy55MixcbiAgICAgICAgICAgIHgyOiBpbnRlcnNlY3Rpb25QdHMueDEsXG4gICAgICAgICAgICB5MjogaW50ZXJzZWN0aW9uUHRzLnkxXG4gICAgICAgICAgfSxcbiAgICAgICAgICB2ZWN0b3I6IHtcbiAgICAgICAgICAgIHg6IC12ZWN0b3IueCxcbiAgICAgICAgICAgIHk6IC12ZWN0b3IueVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdmVjdG9yTm9ybToge1xuICAgICAgICAgICAgeDogLXZlY3Rvck5vcm0ueCxcbiAgICAgICAgICAgIHk6IC12ZWN0b3JOb3JtLnlcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZlY3Rvck5vcm1JbnZlcnNlOiB7XG4gICAgICAgICAgICB4OiAtdmVjdG9yTm9ybUludmVyc2UueCxcbiAgICAgICAgICAgIHk6IC12ZWN0b3JOb3JtSW52ZXJzZS55XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB2YXIgcGFzc2VkUGFpckluZm8gPSBlZGdlSXNTd2FwcGVkID8gc3dhcHBlZHBhaXJJbmZvIDogcGFpckluZm87XG4gICAgICBycy5ub2Rlc092ZXJsYXAgPSBwYXNzZWRQYWlySW5mby5ub2Rlc092ZXJsYXA7XG4gICAgICBycy5zcmNJbnRuID0gcGFzc2VkUGFpckluZm8uc3JjSW50bjtcbiAgICAgIHJzLnRndEludG4gPSBwYXNzZWRQYWlySW5mby50Z3RJbnRuO1xuXG4gICAgICBpZiAoaGFzQ29tcG91bmRzICYmIChzcmMuaXNQYXJlbnQoKSB8fCBzcmMuaXNDaGlsZCgpIHx8IHRndC5pc1BhcmVudCgpIHx8IHRndC5pc0NoaWxkKCkpICYmIChzcmMucGFyZW50cygpLmFueVNhbWUodGd0KSB8fCB0Z3QucGFyZW50cygpLmFueVNhbWUoc3JjKSB8fCBzcmMuc2FtZSh0Z3QpICYmIHNyYy5pc1BhcmVudCgpKSkge1xuICAgICAgICBfdGhpcy5maW5kQ29tcG91bmRMb29wUG9pbnRzKF9lZGdlLCBwYXNzZWRQYWlySW5mbywgX2kyLCBfZWRnZUlzVW5idW5kbGVkKTtcbiAgICAgIH0gZWxzZSBpZiAoc3JjID09PSB0Z3QpIHtcbiAgICAgICAgX3RoaXMuZmluZExvb3BQb2ludHMoX2VkZ2UsIHBhc3NlZFBhaXJJbmZvLCBfaTIsIF9lZGdlSXNVbmJ1bmRsZWQpO1xuICAgICAgfSBlbHNlIGlmIChfY3VydmVTdHlsZSA9PT0gJ3NlZ21lbnRzJykge1xuICAgICAgICBfdGhpcy5maW5kU2VnbWVudHNQb2ludHMoX2VkZ2UsIHBhc3NlZFBhaXJJbmZvKTtcbiAgICAgIH0gZWxzZSBpZiAoX2N1cnZlU3R5bGUgPT09ICd0YXhpJykge1xuICAgICAgICBfdGhpcy5maW5kVGF4aVBvaW50cyhfZWRnZSwgcGFzc2VkUGFpckluZm8pO1xuICAgICAgfSBlbHNlIGlmIChfY3VydmVTdHlsZSA9PT0gJ3N0cmFpZ2h0JyB8fCAhX2VkZ2VJc1VuYnVuZGxlZCAmJiBwYWlySW5mby5lbGVzLmxlbmd0aCAlIDIgPT09IDEgJiYgX2kyID09PSBNYXRoLmZsb29yKHBhaXJJbmZvLmVsZXMubGVuZ3RoIC8gMikpIHtcbiAgICAgICAgX3RoaXMuZmluZFN0cmFpZ2h0RWRnZVBvaW50cyhfZWRnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5maW5kQmV6aWVyUG9pbnRzKF9lZGdlLCBwYXNzZWRQYWlySW5mbywgX2kyLCBfZWRnZUlzVW5idW5kbGVkLCBlZGdlSXNTd2FwcGVkKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuZmluZEVuZHBvaW50cyhfZWRnZSk7XG5cbiAgICAgIF90aGlzLnRyeVRvQ29ycmVjdEludmFsaWRQb2ludHMoX2VkZ2UsIHBhc3NlZFBhaXJJbmZvKTtcblxuICAgICAgX3RoaXMuY2hlY2tGb3JJbnZhbGlkRWRnZVdhcm5pbmcoX2VkZ2UpO1xuXG4gICAgICBfdGhpcy5zdG9yZUFsbHB0cyhfZWRnZSk7XG5cbiAgICAgIF90aGlzLnN0b3JlRWRnZVByb2plY3Rpb25zKF9lZGdlKTtcblxuICAgICAgX3RoaXMuY2FsY3VsYXRlQXJyb3dBbmdsZXMoX2VkZ2UpO1xuXG4gICAgICBfdGhpcy5yZWNhbGN1bGF0ZUVkZ2VMYWJlbFByb2plY3Rpb25zKF9lZGdlKTtcblxuICAgICAgX3RoaXMuY2FsY3VsYXRlTGFiZWxBbmdsZXMoX2VkZ2UpO1xuICAgIH0gLy8gZm9yIHBhaXIgZWRnZXNcblxuICB9O1xuXG4gIGZvciAodmFyIHAgPSAwOyBwIDwgcGFpcklkcy5sZW5ndGg7IHArKykge1xuICAgIF9sb29wKHApO1xuICB9IC8vIGZvciBwYWlyIGlkc1xuICAvLyBoYXlzdGFja3MgYXZvaWQgdGhlIGV4cGVuc2Ugb2YgcGFpckluZm8gc3R1ZmYgKGludGVyc2VjdGlvbnMgZXRjLilcblxuXG4gIHRoaXMuZmluZEhheXN0YWNrUG9pbnRzKGhheXN0YWNrRWRnZXMpO1xufTtcblxuZnVuY3Rpb24gZ2V0UHRzKHB0cykge1xuICB2YXIgcmV0UHRzID0gW107XG5cbiAgaWYgKHB0cyA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwdHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgeCA9IHB0c1tpXTtcbiAgICB2YXIgeSA9IHB0c1tpICsgMV07XG4gICAgcmV0UHRzLnB1c2goe1xuICAgICAgeDogeCxcbiAgICAgIHk6IHlcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXRQdHM7XG59XG5cbkJScCRjLmdldFNlZ21lbnRQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcnMgPSBlZGdlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgdHlwZSA9IHJzLmVkZ2VUeXBlO1xuXG4gIGlmICh0eXBlID09PSAnc2VnbWVudHMnKSB7XG4gICAgdGhpcy5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUoZWRnZSk7XG4gICAgcmV0dXJuIGdldFB0cyhycy5zZWdwdHMpO1xuICB9XG59O1xuXG5CUnAkYy5nZXRDb250cm9sUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHJzID0gZWRnZVswXS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIHR5cGUgPSBycy5lZGdlVHlwZTtcblxuICBpZiAodHlwZSA9PT0gJ2JlemllcicgfHwgdHlwZSA9PT0gJ211bHRpYmV6aWVyJyB8fCB0eXBlID09PSAnc2VsZicgfHwgdHlwZSA9PT0gJ2NvbXBvdW5kJykge1xuICAgIHRoaXMucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKGVkZ2UpO1xuICAgIHJldHVybiBnZXRQdHMocnMuY3RybHB0cyk7XG4gIH1cbn07XG5cbkJScCRjLmdldEVkZ2VNaWRwb2ludCA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2VbMF0uX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHRoaXMucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKGVkZ2UpO1xuICByZXR1cm4ge1xuICAgIHg6IHJzLm1pZFgsXG4gICAgeTogcnMubWlkWVxuICB9O1xufTtcblxudmFyIEJScCRiID0ge307XG5cbkJScCRiLm1hbnVhbEVuZHB0VG9QeCA9IGZ1bmN0aW9uIChub2RlLCBwcm9wKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIG5wb3MgPSBub2RlLnBvc2l0aW9uKCk7XG4gIHZhciB3ID0gbm9kZS5vdXRlcldpZHRoKCk7XG4gIHZhciBoID0gbm9kZS5vdXRlckhlaWdodCgpO1xuXG4gIGlmIChwcm9wLnZhbHVlLmxlbmd0aCA9PT0gMikge1xuICAgIHZhciBwID0gW3Byb3AucGZWYWx1ZVswXSwgcHJvcC5wZlZhbHVlWzFdXTtcblxuICAgIGlmIChwcm9wLnVuaXRzWzBdID09PSAnJScpIHtcbiAgICAgIHBbMF0gPSBwWzBdICogdztcbiAgICB9XG5cbiAgICBpZiAocHJvcC51bml0c1sxXSA9PT0gJyUnKSB7XG4gICAgICBwWzFdID0gcFsxXSAqIGg7XG4gICAgfVxuXG4gICAgcFswXSArPSBucG9zLng7XG4gICAgcFsxXSArPSBucG9zLnk7XG4gICAgcmV0dXJuIHA7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGFuZ2xlID0gcHJvcC5wZlZhbHVlWzBdO1xuICAgIGFuZ2xlID0gLU1hdGguUEkgLyAyICsgYW5nbGU7IC8vIHN0YXJ0IGF0IDEyIG8nY2xvY2tcblxuICAgIHZhciBsID0gMiAqIE1hdGgubWF4KHcsIGgpO1xuICAgIHZhciBfcCA9IFtucG9zLnggKyBNYXRoLmNvcyhhbmdsZSkgKiBsLCBucG9zLnkgKyBNYXRoLnNpbihhbmdsZSkgKiBsXTtcbiAgICByZXR1cm4gci5ub2RlU2hhcGVzW3RoaXMuZ2V0Tm9kZVNoYXBlKG5vZGUpXS5pbnRlcnNlY3RMaW5lKG5wb3MueCwgbnBvcy55LCB3LCBoLCBfcFswXSwgX3BbMV0sIDApO1xuICB9XG59O1xuXG5CUnAkYi5maW5kRW5kcG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgaW50ZXJzZWN0O1xuICB2YXIgc291cmNlID0gZWRnZS5zb3VyY2UoKVswXTtcbiAgdmFyIHRhcmdldCA9IGVkZ2UudGFyZ2V0KClbMF07XG4gIHZhciBzcmNQb3MgPSBzb3VyY2UucG9zaXRpb24oKTtcbiAgdmFyIHRndFBvcyA9IHRhcmdldC5wb3NpdGlvbigpO1xuICB2YXIgdGd0QXJTaGFwZSA9IGVkZ2UucHN0eWxlKCd0YXJnZXQtYXJyb3ctc2hhcGUnKS52YWx1ZTtcbiAgdmFyIHNyY0FyU2hhcGUgPSBlZGdlLnBzdHlsZSgnc291cmNlLWFycm93LXNoYXBlJykudmFsdWU7XG4gIHZhciB0Z3REaXN0ID0gZWRnZS5wc3R5bGUoJ3RhcmdldC1kaXN0YW5jZS1mcm9tLW5vZGUnKS5wZlZhbHVlO1xuICB2YXIgc3JjRGlzdCA9IGVkZ2UucHN0eWxlKCdzb3VyY2UtZGlzdGFuY2UtZnJvbS1ub2RlJykucGZWYWx1ZTtcbiAgdmFyIGN1cnZlU3R5bGUgPSBlZGdlLnBzdHlsZSgnY3VydmUtc3R5bGUnKS52YWx1ZTtcbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIGV0ID0gcnMuZWRnZVR5cGU7XG4gIHZhciB0YXhpID0gY3VydmVTdHlsZSA9PT0gJ3RheGknO1xuICB2YXIgc2VsZiA9IGV0ID09PSAnc2VsZicgfHwgZXQgPT09ICdjb21wb3VuZCc7XG4gIHZhciBiZXppZXIgPSBldCA9PT0gJ2JlemllcicgfHwgZXQgPT09ICdtdWx0aWJlemllcicgfHwgc2VsZjtcbiAgdmFyIG11bHRpID0gZXQgIT09ICdiZXppZXInO1xuICB2YXIgbGluZXMgPSBldCA9PT0gJ3N0cmFpZ2h0JyB8fCBldCA9PT0gJ3NlZ21lbnRzJztcbiAgdmFyIHNlZ21lbnRzID0gZXQgPT09ICdzZWdtZW50cyc7XG4gIHZhciBoYXNFbmRwdHMgPSBiZXppZXIgfHwgbXVsdGkgfHwgbGluZXM7XG4gIHZhciBvdmVycmlkZUVuZHB0cyA9IHNlbGYgfHwgdGF4aTtcbiAgdmFyIHNyY01hbkVuZHB0ID0gZWRnZS5wc3R5bGUoJ3NvdXJjZS1lbmRwb2ludCcpO1xuICB2YXIgc3JjTWFuRW5kcHRWYWwgPSBvdmVycmlkZUVuZHB0cyA/ICdvdXRzaWRlLXRvLW5vZGUnIDogc3JjTWFuRW5kcHQudmFsdWU7XG4gIHZhciB0Z3RNYW5FbmRwdCA9IGVkZ2UucHN0eWxlKCd0YXJnZXQtZW5kcG9pbnQnKTtcbiAgdmFyIHRndE1hbkVuZHB0VmFsID0gb3ZlcnJpZGVFbmRwdHMgPyAnb3V0c2lkZS10by1ub2RlJyA6IHRndE1hbkVuZHB0LnZhbHVlO1xuICBycy5zcmNNYW5FbmRwdCA9IHNyY01hbkVuZHB0O1xuICBycy50Z3RNYW5FbmRwdCA9IHRndE1hbkVuZHB0O1xuICB2YXIgcDE7IC8vIGxhc3Qga25vd24gcG9pbnQgb2YgZWRnZSBvbiB0YXJnZXQgc2lkZVxuXG4gIHZhciBwMjsgLy8gbGFzdCBrbm93biBwb2ludCBvZiBlZGdlIG9uIHNvdXJjZSBzaWRlXG5cbiAgdmFyIHAxX2k7IC8vIHBvaW50IHRvIGludGVyc2VjdCB3aXRoIHRhcmdldCBzaGFwZVxuXG4gIHZhciBwMl9pOyAvLyBwb2ludCB0byBpbnRlcnNlY3Qgd2l0aCBzb3VyY2Ugc2hhcGVcblxuICBpZiAoYmV6aWVyKSB7XG4gICAgdmFyIGNwU3RhcnQgPSBbcnMuY3RybHB0c1swXSwgcnMuY3RybHB0c1sxXV07XG4gICAgdmFyIGNwRW5kID0gbXVsdGkgPyBbcnMuY3RybHB0c1tycy5jdHJscHRzLmxlbmd0aCAtIDJdLCBycy5jdHJscHRzW3JzLmN0cmxwdHMubGVuZ3RoIC0gMV1dIDogY3BTdGFydDtcbiAgICBwMSA9IGNwRW5kO1xuICAgIHAyID0gY3BTdGFydDtcbiAgfSBlbHNlIGlmIChsaW5lcykge1xuICAgIHZhciBzcmNBcnJvd0Zyb21QdCA9ICFzZWdtZW50cyA/IFt0Z3RQb3MueCwgdGd0UG9zLnldIDogcnMuc2VncHRzLnNsaWNlKDAsIDIpO1xuICAgIHZhciB0Z3RBcnJvd0Zyb21QdCA9ICFzZWdtZW50cyA/IFtzcmNQb3MueCwgc3JjUG9zLnldIDogcnMuc2VncHRzLnNsaWNlKHJzLnNlZ3B0cy5sZW5ndGggLSAyKTtcbiAgICBwMSA9IHRndEFycm93RnJvbVB0O1xuICAgIHAyID0gc3JjQXJyb3dGcm9tUHQ7XG4gIH1cblxuICBpZiAodGd0TWFuRW5kcHRWYWwgPT09ICdpbnNpZGUtdG8tbm9kZScpIHtcbiAgICBpbnRlcnNlY3QgPSBbdGd0UG9zLngsIHRndFBvcy55XTtcbiAgfSBlbHNlIGlmICh0Z3RNYW5FbmRwdC51bml0cykge1xuICAgIGludGVyc2VjdCA9IHRoaXMubWFudWFsRW5kcHRUb1B4KHRhcmdldCwgdGd0TWFuRW5kcHQpO1xuICB9IGVsc2UgaWYgKHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lJykge1xuICAgIGludGVyc2VjdCA9IHJzLnRndEludG47IC8vIHVzZSBjYWNoZWQgdmFsdWUgZnJvbSBjdHJscHQgY2FsY1xuICB9IGVsc2Uge1xuICAgIGlmICh0Z3RNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbm9kZScgfHwgdGd0TWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLW5vZGUtb3ItbGFiZWwnKSB7XG4gICAgICBwMV9pID0gcDE7XG4gICAgfSBlbHNlIGlmICh0Z3RNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZScgfHwgdGd0TWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLWxpbmUtb3ItbGFiZWwnKSB7XG4gICAgICBwMV9pID0gW3NyY1Bvcy54LCBzcmNQb3MueV07XG4gICAgfVxuXG4gICAgaW50ZXJzZWN0ID0gci5ub2RlU2hhcGVzW3RoaXMuZ2V0Tm9kZVNoYXBlKHRhcmdldCldLmludGVyc2VjdExpbmUodGd0UG9zLngsIHRndFBvcy55LCB0YXJnZXQub3V0ZXJXaWR0aCgpLCB0YXJnZXQub3V0ZXJIZWlnaHQoKSwgcDFfaVswXSwgcDFfaVsxXSwgMCk7XG5cbiAgICBpZiAodGd0TWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLW5vZGUtb3ItbGFiZWwnIHx8IHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lLW9yLWxhYmVsJykge1xuICAgICAgdmFyIHRycyA9IHRhcmdldC5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICAgIHZhciBsdyA9IHRycy5sYWJlbFdpZHRoO1xuICAgICAgdmFyIGxoID0gdHJzLmxhYmVsSGVpZ2h0O1xuICAgICAgdmFyIGx4ID0gdHJzLmxhYmVsWDtcbiAgICAgIHZhciBseSA9IHRycy5sYWJlbFk7XG4gICAgICB2YXIgbHcyID0gbHcgLyAyO1xuICAgICAgdmFyIGxoMiA9IGxoIC8gMjtcbiAgICAgIHZhciB2YSA9IHRhcmdldC5wc3R5bGUoJ3RleHQtdmFsaWduJykudmFsdWU7XG5cbiAgICAgIGlmICh2YSA9PT0gJ3RvcCcpIHtcbiAgICAgICAgbHkgLT0gbGgyO1xuICAgICAgfSBlbHNlIGlmICh2YSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgbHkgKz0gbGgyO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGEgPSB0YXJnZXQucHN0eWxlKCd0ZXh0LWhhbGlnbicpLnZhbHVlO1xuXG4gICAgICBpZiAoaGEgPT09ICdsZWZ0Jykge1xuICAgICAgICBseCAtPSBsdzI7XG4gICAgICB9IGVsc2UgaWYgKGhhID09PSAncmlnaHQnKSB7XG4gICAgICAgIGx4ICs9IGx3MjtcbiAgICAgIH1cblxuICAgICAgdmFyIGxhYmVsSW50ZXJzZWN0ID0gcG9seWdvbkludGVyc2VjdExpbmUocDFfaVswXSwgcDFfaVsxXSwgW2x4IC0gbHcyLCBseSAtIGxoMiwgbHggKyBsdzIsIGx5IC0gbGgyLCBseCArIGx3MiwgbHkgKyBsaDIsIGx4IC0gbHcyLCBseSArIGxoMl0sIHRndFBvcy54LCB0Z3RQb3MueSk7XG5cbiAgICAgIGlmIChsYWJlbEludGVyc2VjdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciByZWZQdCA9IHNyY1BvcztcbiAgICAgICAgdmFyIGludFNxZGlzdCA9IHNxZGlzdChyZWZQdCwgYXJyYXkycG9pbnQoaW50ZXJzZWN0KSk7XG4gICAgICAgIHZhciBsYWJJbnRTcWRpc3QgPSBzcWRpc3QocmVmUHQsIGFycmF5MnBvaW50KGxhYmVsSW50ZXJzZWN0KSk7XG4gICAgICAgIHZhciBtaW5TcURpc3QgPSBpbnRTcWRpc3Q7XG5cbiAgICAgICAgaWYgKGxhYkludFNxZGlzdCA8IGludFNxZGlzdCkge1xuICAgICAgICAgIGludGVyc2VjdCA9IGxhYmVsSW50ZXJzZWN0O1xuICAgICAgICAgIG1pblNxRGlzdCA9IGxhYkludFNxZGlzdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYWJlbEludGVyc2VjdC5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgdmFyIGxhYkludDJTcURpc3QgPSBzcWRpc3QocmVmUHQsIHtcbiAgICAgICAgICAgIHg6IGxhYmVsSW50ZXJzZWN0WzJdLFxuICAgICAgICAgICAgeTogbGFiZWxJbnRlcnNlY3RbM11cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChsYWJJbnQyU3FEaXN0IDwgbWluU3FEaXN0KSB7XG4gICAgICAgICAgICBpbnRlcnNlY3QgPSBbbGFiZWxJbnRlcnNlY3RbMl0sIGxhYmVsSW50ZXJzZWN0WzNdXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgYXJyb3dFbmQgPSBzaG9ydGVuSW50ZXJzZWN0aW9uKGludGVyc2VjdCwgcDEsIHIuYXJyb3dTaGFwZXNbdGd0QXJTaGFwZV0uc3BhY2luZyhlZGdlKSArIHRndERpc3QpO1xuICB2YXIgZWRnZUVuZCA9IHNob3J0ZW5JbnRlcnNlY3Rpb24oaW50ZXJzZWN0LCBwMSwgci5hcnJvd1NoYXBlc1t0Z3RBclNoYXBlXS5nYXAoZWRnZSkgKyB0Z3REaXN0KTtcbiAgcnMuZW5kWCA9IGVkZ2VFbmRbMF07XG4gIHJzLmVuZFkgPSBlZGdlRW5kWzFdO1xuICBycy5hcnJvd0VuZFggPSBhcnJvd0VuZFswXTtcbiAgcnMuYXJyb3dFbmRZID0gYXJyb3dFbmRbMV07XG5cbiAgaWYgKHNyY01hbkVuZHB0VmFsID09PSAnaW5zaWRlLXRvLW5vZGUnKSB7XG4gICAgaW50ZXJzZWN0ID0gW3NyY1Bvcy54LCBzcmNQb3MueV07XG4gIH0gZWxzZSBpZiAoc3JjTWFuRW5kcHQudW5pdHMpIHtcbiAgICBpbnRlcnNlY3QgPSB0aGlzLm1hbnVhbEVuZHB0VG9QeChzb3VyY2UsIHNyY01hbkVuZHB0KTtcbiAgfSBlbHNlIGlmIChzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZScpIHtcbiAgICBpbnRlcnNlY3QgPSBycy5zcmNJbnRuOyAvLyB1c2UgY2FjaGVkIHZhbHVlIGZyb20gY3RybHB0IGNhbGNcbiAgfSBlbHNlIHtcbiAgICBpZiAoc3JjTWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLW5vZGUnIHx8IHNyY01hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1ub2RlLW9yLWxhYmVsJykge1xuICAgICAgcDJfaSA9IHAyO1xuICAgIH0gZWxzZSBpZiAoc3JjTWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLWxpbmUnIHx8IHNyY01hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lLW9yLWxhYmVsJykge1xuICAgICAgcDJfaSA9IFt0Z3RQb3MueCwgdGd0UG9zLnldO1xuICAgIH1cblxuICAgIGludGVyc2VjdCA9IHIubm9kZVNoYXBlc1t0aGlzLmdldE5vZGVTaGFwZShzb3VyY2UpXS5pbnRlcnNlY3RMaW5lKHNyY1Bvcy54LCBzcmNQb3MueSwgc291cmNlLm91dGVyV2lkdGgoKSwgc291cmNlLm91dGVySGVpZ2h0KCksIHAyX2lbMF0sIHAyX2lbMV0sIDApO1xuXG4gICAgaWYgKHNyY01hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1ub2RlLW9yLWxhYmVsJyB8fCBzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZS1vci1sYWJlbCcpIHtcbiAgICAgIHZhciBzcnMgPSBzb3VyY2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgICB2YXIgX2x3ID0gc3JzLmxhYmVsV2lkdGg7XG4gICAgICB2YXIgX2xoID0gc3JzLmxhYmVsSGVpZ2h0O1xuICAgICAgdmFyIF9seCA9IHNycy5sYWJlbFg7XG4gICAgICB2YXIgX2x5ID0gc3JzLmxhYmVsWTtcblxuICAgICAgdmFyIF9sdzIgPSBfbHcgLyAyO1xuXG4gICAgICB2YXIgX2xoMiA9IF9saCAvIDI7XG5cbiAgICAgIHZhciBfdmEgPSBzb3VyY2UucHN0eWxlKCd0ZXh0LXZhbGlnbicpLnZhbHVlO1xuXG4gICAgICBpZiAoX3ZhID09PSAndG9wJykge1xuICAgICAgICBfbHkgLT0gX2xoMjtcbiAgICAgIH0gZWxzZSBpZiAoX3ZhID09PSAnYm90dG9tJykge1xuICAgICAgICBfbHkgKz0gX2xoMjtcbiAgICAgIH1cblxuICAgICAgdmFyIF9oYSA9IHNvdXJjZS5wc3R5bGUoJ3RleHQtaGFsaWduJykudmFsdWU7XG5cbiAgICAgIGlmIChfaGEgPT09ICdsZWZ0Jykge1xuICAgICAgICBfbHggLT0gX2x3MjtcbiAgICAgIH0gZWxzZSBpZiAoX2hhID09PSAncmlnaHQnKSB7XG4gICAgICAgIF9seCArPSBfbHcyO1xuICAgICAgfVxuXG4gICAgICB2YXIgX2xhYmVsSW50ZXJzZWN0ID0gcG9seWdvbkludGVyc2VjdExpbmUocDJfaVswXSwgcDJfaVsxXSwgW19seCAtIF9sdzIsIF9seSAtIF9saDIsIF9seCArIF9sdzIsIF9seSAtIF9saDIsIF9seCArIF9sdzIsIF9seSArIF9saDIsIF9seCAtIF9sdzIsIF9seSArIF9saDJdLCBzcmNQb3MueCwgc3JjUG9zLnkpO1xuXG4gICAgICBpZiAoX2xhYmVsSW50ZXJzZWN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIF9yZWZQdCA9IHRndFBvcztcblxuICAgICAgICB2YXIgX2ludFNxZGlzdCA9IHNxZGlzdChfcmVmUHQsIGFycmF5MnBvaW50KGludGVyc2VjdCkpO1xuXG4gICAgICAgIHZhciBfbGFiSW50U3FkaXN0ID0gc3FkaXN0KF9yZWZQdCwgYXJyYXkycG9pbnQoX2xhYmVsSW50ZXJzZWN0KSk7XG5cbiAgICAgICAgdmFyIF9taW5TcURpc3QgPSBfaW50U3FkaXN0O1xuXG4gICAgICAgIGlmIChfbGFiSW50U3FkaXN0IDwgX2ludFNxZGlzdCkge1xuICAgICAgICAgIGludGVyc2VjdCA9IFtfbGFiZWxJbnRlcnNlY3RbMF0sIF9sYWJlbEludGVyc2VjdFsxXV07XG4gICAgICAgICAgX21pblNxRGlzdCA9IF9sYWJJbnRTcWRpc3Q7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX2xhYmVsSW50ZXJzZWN0Lmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICB2YXIgX2xhYkludDJTcURpc3QgPSBzcWRpc3QoX3JlZlB0LCB7XG4gICAgICAgICAgICB4OiBfbGFiZWxJbnRlcnNlY3RbMl0sXG4gICAgICAgICAgICB5OiBfbGFiZWxJbnRlcnNlY3RbM11cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChfbGFiSW50MlNxRGlzdCA8IF9taW5TcURpc3QpIHtcbiAgICAgICAgICAgIGludGVyc2VjdCA9IFtfbGFiZWxJbnRlcnNlY3RbMl0sIF9sYWJlbEludGVyc2VjdFszXV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGFycm93U3RhcnQgPSBzaG9ydGVuSW50ZXJzZWN0aW9uKGludGVyc2VjdCwgcDIsIHIuYXJyb3dTaGFwZXNbc3JjQXJTaGFwZV0uc3BhY2luZyhlZGdlKSArIHNyY0Rpc3QpO1xuICB2YXIgZWRnZVN0YXJ0ID0gc2hvcnRlbkludGVyc2VjdGlvbihpbnRlcnNlY3QsIHAyLCByLmFycm93U2hhcGVzW3NyY0FyU2hhcGVdLmdhcChlZGdlKSArIHNyY0Rpc3QpO1xuICBycy5zdGFydFggPSBlZGdlU3RhcnRbMF07XG4gIHJzLnN0YXJ0WSA9IGVkZ2VTdGFydFsxXTtcbiAgcnMuYXJyb3dTdGFydFggPSBhcnJvd1N0YXJ0WzBdO1xuICBycy5hcnJvd1N0YXJ0WSA9IGFycm93U3RhcnRbMV07XG5cbiAgaWYgKGhhc0VuZHB0cykge1xuICAgIGlmICghbnVtYmVyJDEocnMuc3RhcnRYKSB8fCAhbnVtYmVyJDEocnMuc3RhcnRZKSB8fCAhbnVtYmVyJDEocnMuZW5kWCkgfHwgIW51bWJlciQxKHJzLmVuZFkpKSB7XG4gICAgICBycy5iYWRMaW5lID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcnMuYmFkTGluZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxufTtcblxuQlJwJGIuZ2V0U291cmNlRW5kcG9pbnQgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcnMgPSBlZGdlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICB0aGlzLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZShlZGdlKTtcblxuICBzd2l0Y2ggKHJzLmVkZ2VUeXBlKSB7XG4gICAgY2FzZSAnaGF5c3RhY2snOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogcnMuaGF5c3RhY2tQdHNbMF0sXG4gICAgICAgIHk6IHJzLmhheXN0YWNrUHRzWzFdXG4gICAgICB9O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHJzLmFycm93U3RhcnRYLFxuICAgICAgICB5OiBycy5hcnJvd1N0YXJ0WVxuICAgICAgfTtcbiAgfVxufTtcblxuQlJwJGIuZ2V0VGFyZ2V0RW5kcG9pbnQgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcnMgPSBlZGdlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICB0aGlzLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZShlZGdlKTtcblxuICBzd2l0Y2ggKHJzLmVkZ2VUeXBlKSB7XG4gICAgY2FzZSAnaGF5c3RhY2snOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogcnMuaGF5c3RhY2tQdHNbMl0sXG4gICAgICAgIHk6IHJzLmhheXN0YWNrUHRzWzNdXG4gICAgICB9O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHJzLmFycm93RW5kWCxcbiAgICAgICAgeTogcnMuYXJyb3dFbmRZXG4gICAgICB9O1xuICB9XG59O1xuXG52YXIgQlJwJGEgPSB7fTtcblxuZnVuY3Rpb24gcHVzaEJlemllclB0cyhyLCBlZGdlLCBwdHMpIHtcbiAgdmFyIHFiZXppZXJBdCQxID0gZnVuY3Rpb24gcWJlemllckF0JDEocDEsIHAyLCBwMywgdCkge1xuICAgIHJldHVybiBxYmV6aWVyQXQocDEsIHAyLCBwMywgdCk7XG4gIH07XG5cbiAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgdmFyIGJwdHMgPSBfcC5yc3R5bGUuYmV6aWVyUHRzO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgci5iZXppZXJQcm9qUGN0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwID0gci5iZXppZXJQcm9qUGN0c1tpXTtcbiAgICBicHRzLnB1c2goe1xuICAgICAgeDogcWJlemllckF0JDEocHRzWzBdLCBwdHNbMl0sIHB0c1s0XSwgcCksXG4gICAgICB5OiBxYmV6aWVyQXQkMShwdHNbMV0sIHB0c1szXSwgcHRzWzVdLCBwKVxuICAgIH0pO1xuICB9XG59XG5cbkJScCRhLnN0b3JlRWRnZVByb2plY3Rpb25zID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHZhciBldCA9IHJzLmVkZ2VUeXBlOyAvLyBjbGVhciB0aGUgY2FjaGVkIHBvaW50cyBzdGF0ZVxuXG4gIF9wLnJzdHlsZS5iZXppZXJQdHMgPSBudWxsO1xuICBfcC5yc3R5bGUubGluZVB0cyA9IG51bGw7XG4gIF9wLnJzdHlsZS5oYXlzdGFja1B0cyA9IG51bGw7XG5cbiAgaWYgKGV0ID09PSAnbXVsdGliZXppZXInIHx8IGV0ID09PSAnYmV6aWVyJyB8fCBldCA9PT0gJ3NlbGYnIHx8IGV0ID09PSAnY29tcG91bmQnKSB7XG4gICAgX3AucnN0eWxlLmJlemllclB0cyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgKyA1IDwgcnMuYWxscHRzLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICBwdXNoQmV6aWVyUHRzKHRoaXMsIGVkZ2UsIHJzLmFsbHB0cy5zbGljZShpLCBpICsgNikpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChldCA9PT0gJ3NlZ21lbnRzJykge1xuICAgIHZhciBscHRzID0gX3AucnN0eWxlLmxpbmVQdHMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpICsgMSA8IHJzLmFsbHB0cy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgbHB0cy5wdXNoKHtcbiAgICAgICAgeDogcnMuYWxscHRzW2ldLFxuICAgICAgICB5OiBycy5hbGxwdHNbaSArIDFdXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXQgPT09ICdoYXlzdGFjaycpIHtcbiAgICB2YXIgaHB0cyA9IHJzLmhheXN0YWNrUHRzO1xuICAgIF9wLnJzdHlsZS5oYXlzdGFja1B0cyA9IFt7XG4gICAgICB4OiBocHRzWzBdLFxuICAgICAgeTogaHB0c1sxXVxuICAgIH0sIHtcbiAgICAgIHg6IGhwdHNbMl0sXG4gICAgICB5OiBocHRzWzNdXG4gICAgfV07XG4gIH1cblxuICBfcC5yc3R5bGUuYXJyb3dXaWR0aCA9IHRoaXMuZ2V0QXJyb3dXaWR0aChlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlLCBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZSkgKiB0aGlzLmFycm93U2hhcGVXaWR0aDtcbn07XG5cbkJScCRhLnJlY2FsY3VsYXRlRWRnZVByb2plY3Rpb25zID0gZnVuY3Rpb24gKGVkZ2VzKSB7XG4gIHRoaXMuZmluZEVkZ2VDb250cm9sUG9pbnRzKGVkZ2VzKTtcbn07XG5cbi8qIGdsb2JhbCBkb2N1bWVudCAqL1xuXG52YXIgQlJwJDkgPSB7fTtcblxuQlJwJDkucmVjYWxjdWxhdGVOb2RlTGFiZWxQcm9qZWN0aW9uID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIGNvbnRlbnQgPSBub2RlLnBzdHlsZSgnbGFiZWwnKS5zdHJWYWx1ZTtcblxuICBpZiAoZW1wdHlTdHJpbmcoY29udGVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgdGV4dFgsIHRleHRZO1xuICB2YXIgX3AgPSBub2RlLl9wcml2YXRlO1xuICB2YXIgbm9kZVdpZHRoID0gbm9kZS53aWR0aCgpO1xuICB2YXIgbm9kZUhlaWdodCA9IG5vZGUuaGVpZ2h0KCk7XG4gIHZhciBwYWRkaW5nID0gbm9kZS5wYWRkaW5nKCk7XG4gIHZhciBub2RlUG9zID0gbm9kZS5wb3NpdGlvbigpO1xuICB2YXIgdGV4dEhhbGlnbiA9IG5vZGUucHN0eWxlKCd0ZXh0LWhhbGlnbicpLnN0clZhbHVlO1xuICB2YXIgdGV4dFZhbGlnbiA9IG5vZGUucHN0eWxlKCd0ZXh0LXZhbGlnbicpLnN0clZhbHVlO1xuICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgdmFyIHJzdHlsZSA9IF9wLnJzdHlsZTtcblxuICBzd2l0Y2ggKHRleHRIYWxpZ24pIHtcbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIHRleHRYID0gbm9kZVBvcy54IC0gbm9kZVdpZHRoIC8gMiAtIHBhZGRpbmc7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHRleHRYID0gbm9kZVBvcy54ICsgbm9kZVdpZHRoIC8gMiArIHBhZGRpbmc7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBlLmcuIGNlbnRlclxuICAgICAgdGV4dFggPSBub2RlUG9zLng7XG4gIH1cblxuICBzd2l0Y2ggKHRleHRWYWxpZ24pIHtcbiAgICBjYXNlICd0b3AnOlxuICAgICAgdGV4dFkgPSBub2RlUG9zLnkgLSBub2RlSGVpZ2h0IC8gMiAtIHBhZGRpbmc7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICB0ZXh0WSA9IG5vZGVQb3MueSArIG5vZGVIZWlnaHQgLyAyICsgcGFkZGluZztcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGUuZy4gbWlkZGxlXG4gICAgICB0ZXh0WSA9IG5vZGVQb3MueTtcbiAgfVxuXG4gIHJzLmxhYmVsWCA9IHRleHRYO1xuICBycy5sYWJlbFkgPSB0ZXh0WTtcbiAgcnN0eWxlLmxhYmVsWCA9IHRleHRYO1xuICByc3R5bGUubGFiZWxZID0gdGV4dFk7XG4gIHRoaXMuY2FsY3VsYXRlTGFiZWxBbmdsZXMobm9kZSk7XG4gIHRoaXMuYXBwbHlMYWJlbERpbWVuc2lvbnMobm9kZSk7XG59O1xuXG52YXIgbGluZUFuZ2xlRnJvbURlbHRhID0gZnVuY3Rpb24gbGluZUFuZ2xlRnJvbURlbHRhKGR4LCBkeSkge1xuICB2YXIgYW5nbGUgPSBNYXRoLmF0YW4oZHkgLyBkeCk7XG5cbiAgaWYgKGR4ID09PSAwICYmIGFuZ2xlIDwgMCkge1xuICAgIGFuZ2xlID0gYW5nbGUgKiAtMTtcbiAgfVxuXG4gIHJldHVybiBhbmdsZTtcbn07XG5cbnZhciBsaW5lQW5nbGUgPSBmdW5jdGlvbiBsaW5lQW5nbGUocDAsIHAxKSB7XG4gIHZhciBkeCA9IHAxLnggLSBwMC54O1xuICB2YXIgZHkgPSBwMS55IC0gcDAueTtcbiAgcmV0dXJuIGxpbmVBbmdsZUZyb21EZWx0YShkeCwgZHkpO1xufTtcblxudmFyIGJlemllckFuZ2xlID0gZnVuY3Rpb24gYmV6aWVyQW5nbGUocDAsIHAxLCBwMiwgdCkge1xuICB2YXIgdDAgPSBib3VuZCgwLCB0IC0gMC4wMDEsIDEpO1xuICB2YXIgdDEgPSBib3VuZCgwLCB0ICsgMC4wMDEsIDEpO1xuICB2YXIgbHAwID0gcWJlemllclB0QXQocDAsIHAxLCBwMiwgdDApO1xuICB2YXIgbHAxID0gcWJlemllclB0QXQocDAsIHAxLCBwMiwgdDEpO1xuICByZXR1cm4gbGluZUFuZ2xlKGxwMCwgbHAxKTtcbn07XG5cbkJScCQ5LnJlY2FsY3VsYXRlRWRnZUxhYmVsUHJvamVjdGlvbnMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcDtcbiAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGNvbnRlbnQgPSB7XG4gICAgbWlkOiBlZGdlLnBzdHlsZSgnbGFiZWwnKS5zdHJWYWx1ZSxcbiAgICBzb3VyY2U6IGVkZ2UucHN0eWxlKCdzb3VyY2UtbGFiZWwnKS5zdHJWYWx1ZSxcbiAgICB0YXJnZXQ6IGVkZ2UucHN0eWxlKCd0YXJnZXQtbGFiZWwnKS5zdHJWYWx1ZVxuICB9O1xuXG4gIGlmIChjb250ZW50Lm1pZCB8fCBjb250ZW50LnNvdXJjZSB8fCBjb250ZW50LnRhcmdldCkgOyBlbHNlIHtcbiAgICByZXR1cm47IC8vIG5vIGxhYmVscyA9PiBubyBjYWxjc1xuICB9IC8vIGFkZCBjZW50ZXIgcG9pbnQgdG8gc3R5bGUgc28gYm91bmRpbmcgYm94IGNhbGN1bGF0aW9ucyBjYW4gdXNlIGl0XG4gIC8vXG5cblxuICBwID0ge1xuICAgIHg6IHJzLm1pZFgsXG4gICAgeTogcnMubWlkWVxuICB9O1xuXG4gIHZhciBzZXRScyA9IGZ1bmN0aW9uIHNldFJzKHByb3BOYW1lLCBwcmVmaXgsIHZhbHVlKSB7XG4gICAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgcHJvcE5hbWUsIHByZWZpeCwgdmFsdWUpO1xuICAgIHNldFByZWZpeGVkUHJvcGVydHkoX3AucnN0eWxlLCBwcm9wTmFtZSwgcHJlZml4LCB2YWx1ZSk7XG4gIH07XG5cbiAgc2V0UnMoJ2xhYmVsWCcsIG51bGwsIHAueCk7XG4gIHNldFJzKCdsYWJlbFknLCBudWxsLCBwLnkpO1xuICB2YXIgbWlkQW5nbGUgPSBsaW5lQW5nbGVGcm9tRGVsdGEocnMubWlkRGlzcFgsIHJzLm1pZERpc3BZKTtcbiAgc2V0UnMoJ2xhYmVsQXV0b0FuZ2xlJywgbnVsbCwgbWlkQW5nbGUpO1xuXG4gIHZhciBjcmVhdGVDb250cm9sUG9pbnRJbmZvID0gZnVuY3Rpb24gY3JlYXRlQ29udHJvbFBvaW50SW5mbygpIHtcbiAgICBpZiAoY3JlYXRlQ29udHJvbFBvaW50SW5mby5jYWNoZSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUNvbnRyb2xQb2ludEluZm8uY2FjaGU7XG4gICAgfSAvLyB1c2UgY2FjaGUgc28gb25seSAxeCBwZXIgZWRnZVxuXG5cbiAgICB2YXIgY3RybHB0cyA9IFtdOyAvLyBzdG9yZSBlYWNoIGN0cmxwdCBpbmZvIGluaXRcblxuICAgIGZvciAodmFyIGkgPSAwOyBpICsgNSA8IHJzLmFsbHB0cy5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgdmFyIHAwID0ge1xuICAgICAgICB4OiBycy5hbGxwdHNbaV0sXG4gICAgICAgIHk6IHJzLmFsbHB0c1tpICsgMV1cbiAgICAgIH07XG4gICAgICB2YXIgcDEgPSB7XG4gICAgICAgIHg6IHJzLmFsbHB0c1tpICsgMl0sXG4gICAgICAgIHk6IHJzLmFsbHB0c1tpICsgM11cbiAgICAgIH07IC8vIGN0cmxwdFxuXG4gICAgICB2YXIgcDIgPSB7XG4gICAgICAgIHg6IHJzLmFsbHB0c1tpICsgNF0sXG4gICAgICAgIHk6IHJzLmFsbHB0c1tpICsgNV1cbiAgICAgIH07XG4gICAgICBjdHJscHRzLnB1c2goe1xuICAgICAgICBwMDogcDAsXG4gICAgICAgIHAxOiBwMSxcbiAgICAgICAgcDI6IHAyLFxuICAgICAgICBzdGFydERpc3Q6IDAsXG4gICAgICAgIGxlbmd0aDogMCxcbiAgICAgICAgc2VnbWVudHM6IFtdXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgYnB0cyA9IF9wLnJzdHlsZS5iZXppZXJQdHM7XG4gICAgdmFyIG5Qcm9qcyA9IHIuYmV6aWVyUHJvalBjdHMubGVuZ3RoO1xuXG4gICAgZnVuY3Rpb24gYWRkU2VnbWVudChjcCwgcDAsIHAxLCB0MCwgdDEpIHtcbiAgICAgIHZhciBsZW5ndGggPSBkaXN0KHAwLCBwMSk7XG4gICAgICB2YXIgcHJldlNlZ21lbnQgPSBjcC5zZWdtZW50c1tjcC5zZWdtZW50cy5sZW5ndGggLSAxXTtcbiAgICAgIHZhciBzZWdtZW50ID0ge1xuICAgICAgICBwMDogcDAsXG4gICAgICAgIHAxOiBwMSxcbiAgICAgICAgdDA6IHQwLFxuICAgICAgICB0MTogdDEsXG4gICAgICAgIHN0YXJ0RGlzdDogcHJldlNlZ21lbnQgPyBwcmV2U2VnbWVudC5zdGFydERpc3QgKyBwcmV2U2VnbWVudC5sZW5ndGggOiAwLFxuICAgICAgICBsZW5ndGg6IGxlbmd0aFxuICAgICAgfTtcbiAgICAgIGNwLnNlZ21lbnRzLnB1c2goc2VnbWVudCk7XG4gICAgICBjcC5sZW5ndGggKz0gbGVuZ3RoO1xuICAgIH0gLy8gdXBkYXRlIGVhY2ggY3RybHB0IHdpdGggc2VnbWVudCBpbmZvXG5cblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBjdHJscHRzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIGNwID0gY3RybHB0c1tfaV07XG4gICAgICB2YXIgcHJldkNwID0gY3RybHB0c1tfaSAtIDFdO1xuXG4gICAgICBpZiAocHJldkNwKSB7XG4gICAgICAgIGNwLnN0YXJ0RGlzdCA9IHByZXZDcC5zdGFydERpc3QgKyBwcmV2Q3AubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBhZGRTZWdtZW50KGNwLCBjcC5wMCwgYnB0c1tfaSAqIG5Qcm9qc10sIDAsIHIuYmV6aWVyUHJvalBjdHNbMF0pOyAvLyBmaXJzdFxuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5Qcm9qcyAtIDE7IGorKykge1xuICAgICAgICBhZGRTZWdtZW50KGNwLCBicHRzW19pICogblByb2pzICsgal0sIGJwdHNbX2kgKiBuUHJvanMgKyBqICsgMV0sIHIuYmV6aWVyUHJvalBjdHNbal0sIHIuYmV6aWVyUHJvalBjdHNbaiArIDFdKTtcbiAgICAgIH1cblxuICAgICAgYWRkU2VnbWVudChjcCwgYnB0c1tfaSAqIG5Qcm9qcyArIG5Qcm9qcyAtIDFdLCBjcC5wMiwgci5iZXppZXJQcm9qUGN0c1tuUHJvanMgLSAxXSwgMSk7IC8vIGxhc3RcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlQ29udHJvbFBvaW50SW5mby5jYWNoZSA9IGN0cmxwdHM7XG4gIH07XG5cbiAgdmFyIGNhbGN1bGF0ZUVuZFByb2plY3Rpb24gPSBmdW5jdGlvbiBjYWxjdWxhdGVFbmRQcm9qZWN0aW9uKHByZWZpeCkge1xuICAgIHZhciBhbmdsZTtcbiAgICB2YXIgaXNTcmMgPSBwcmVmaXggPT09ICdzb3VyY2UnO1xuXG4gICAgaWYgKCFjb250ZW50W3ByZWZpeF0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgb2Zmc2V0ID0gZWRnZS5wc3R5bGUocHJlZml4ICsgJy10ZXh0LW9mZnNldCcpLnBmVmFsdWU7XG5cbiAgICBzd2l0Y2ggKHJzLmVkZ2VUeXBlKSB7XG4gICAgICBjYXNlICdzZWxmJzpcbiAgICAgIGNhc2UgJ2NvbXBvdW5kJzpcbiAgICAgIGNhc2UgJ2Jlemllcic6XG4gICAgICBjYXNlICdtdWx0aWJlemllcic6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgY3BzID0gY3JlYXRlQ29udHJvbFBvaW50SW5mbygpO1xuICAgICAgICAgIHZhciBzZWxlY3RlZDtcbiAgICAgICAgICB2YXIgc3RhcnREaXN0ID0gMDtcbiAgICAgICAgICB2YXIgdG90YWxEaXN0ID0gMDsgLy8gZmluZCB0aGUgc2VnbWVudCB3ZSdyZSBvblxuXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBfY3AgPSBjcHNbaXNTcmMgPyBpIDogY3BzLmxlbmd0aCAtIDEgLSBpXTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBfY3Auc2VnbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgdmFyIF9zZWcgPSBfY3Auc2VnbWVudHNbaXNTcmMgPyBqIDogX2NwLnNlZ21lbnRzLmxlbmd0aCAtIDEgLSBqXTtcbiAgICAgICAgICAgICAgdmFyIGxhc3RTZWcgPSBpID09PSBjcHMubGVuZ3RoIC0gMSAmJiBqID09PSBfY3Auc2VnbWVudHMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgc3RhcnREaXN0ID0gdG90YWxEaXN0O1xuICAgICAgICAgICAgICB0b3RhbERpc3QgKz0gX3NlZy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgaWYgKHRvdGFsRGlzdCA+PSBvZmZzZXQgfHwgbGFzdFNlZykge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkID0ge1xuICAgICAgICAgICAgICAgICAgY3A6IF9jcCxcbiAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IF9zZWdcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgY3AgPSBzZWxlY3RlZC5jcDtcbiAgICAgICAgICB2YXIgc2VnID0gc2VsZWN0ZWQuc2VnbWVudDtcbiAgICAgICAgICB2YXIgdFNlZ21lbnQgPSAob2Zmc2V0IC0gc3RhcnREaXN0KSAvIHNlZy5sZW5ndGg7XG4gICAgICAgICAgdmFyIHNlZ0R0ID0gc2VnLnQxIC0gc2VnLnQwO1xuICAgICAgICAgIHZhciB0ID0gaXNTcmMgPyBzZWcudDAgKyBzZWdEdCAqIHRTZWdtZW50IDogc2VnLnQxIC0gc2VnRHQgKiB0U2VnbWVudDtcbiAgICAgICAgICB0ID0gYm91bmQoMCwgdCwgMSk7XG4gICAgICAgICAgcCA9IHFiZXppZXJQdEF0KGNwLnAwLCBjcC5wMSwgY3AucDIsIHQpO1xuICAgICAgICAgIGFuZ2xlID0gYmV6aWVyQW5nbGUoY3AucDAsIGNwLnAxLCBjcC5wMiwgdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAnc3RyYWlnaHQnOlxuICAgICAgY2FzZSAnc2VnbWVudHMnOlxuICAgICAgY2FzZSAnaGF5c3RhY2snOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGQgPSAwLFxuICAgICAgICAgICAgICBkaSxcbiAgICAgICAgICAgICAgZDA7XG4gICAgICAgICAgdmFyIHAwLCBwMTtcbiAgICAgICAgICB2YXIgbCA9IHJzLmFsbHB0cy5sZW5ndGg7XG5cbiAgICAgICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgKyAzIDwgbDsgX2kyICs9IDIpIHtcbiAgICAgICAgICAgIGlmIChpc1NyYykge1xuICAgICAgICAgICAgICBwMCA9IHtcbiAgICAgICAgICAgICAgICB4OiBycy5hbGxwdHNbX2kyXSxcbiAgICAgICAgICAgICAgICB5OiBycy5hbGxwdHNbX2kyICsgMV1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgcDEgPSB7XG4gICAgICAgICAgICAgICAgeDogcnMuYWxscHRzW19pMiArIDJdLFxuICAgICAgICAgICAgICAgIHk6IHJzLmFsbHB0c1tfaTIgKyAzXVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcDAgPSB7XG4gICAgICAgICAgICAgICAgeDogcnMuYWxscHRzW2wgLSAyIC0gX2kyXSxcbiAgICAgICAgICAgICAgICB5OiBycy5hbGxwdHNbbCAtIDEgLSBfaTJdXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHAxID0ge1xuICAgICAgICAgICAgICAgIHg6IHJzLmFsbHB0c1tsIC0gNCAtIF9pMl0sXG4gICAgICAgICAgICAgICAgeTogcnMuYWxscHRzW2wgLSAzIC0gX2kyXVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkaSA9IGRpc3QocDAsIHAxKTtcbiAgICAgICAgICAgIGQwID0gZDtcbiAgICAgICAgICAgIGQgKz0gZGk7XG5cbiAgICAgICAgICAgIGlmIChkID49IG9mZnNldCkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgcEQgPSBvZmZzZXQgLSBkMDtcblxuICAgICAgICAgIHZhciBfdCA9IHBEIC8gZGk7XG5cbiAgICAgICAgICBfdCA9IGJvdW5kKDAsIF90LCAxKTtcbiAgICAgICAgICBwID0gbGluZUF0KHAwLCBwMSwgX3QpO1xuICAgICAgICAgIGFuZ2xlID0gbGluZUFuZ2xlKHAwLCBwMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRScygnbGFiZWxYJywgcHJlZml4LCBwLngpO1xuICAgIHNldFJzKCdsYWJlbFknLCBwcmVmaXgsIHAueSk7XG4gICAgc2V0UnMoJ2xhYmVsQXV0b0FuZ2xlJywgcHJlZml4LCBhbmdsZSk7XG4gIH07XG5cbiAgY2FsY3VsYXRlRW5kUHJvamVjdGlvbignc291cmNlJyk7XG4gIGNhbGN1bGF0ZUVuZFByb2plY3Rpb24oJ3RhcmdldCcpO1xuICB0aGlzLmFwcGx5TGFiZWxEaW1lbnNpb25zKGVkZ2UpO1xufTtcblxuQlJwJDkuYXBwbHlMYWJlbERpbWVuc2lvbnMgPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHRoaXMuYXBwbHlQcmVmaXhlZExhYmVsRGltZW5zaW9ucyhlbGUpO1xuXG4gIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICB0aGlzLmFwcGx5UHJlZml4ZWRMYWJlbERpbWVuc2lvbnMoZWxlLCAnc291cmNlJyk7XG4gICAgdGhpcy5hcHBseVByZWZpeGVkTGFiZWxEaW1lbnNpb25zKGVsZSwgJ3RhcmdldCcpO1xuICB9XG59O1xuXG5CUnAkOS5hcHBseVByZWZpeGVkTGFiZWxEaW1lbnNpb25zID0gZnVuY3Rpb24gKGVsZSwgcHJlZml4KSB7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHRleHQgPSB0aGlzLmdldExhYmVsVGV4dChlbGUsIHByZWZpeCk7XG4gIHZhciBsYWJlbERpbXMgPSB0aGlzLmNhbGN1bGF0ZUxhYmVsRGltZW5zaW9ucyhlbGUsIHRleHQpO1xuICB2YXIgbGluZUhlaWdodCA9IGVsZS5wc3R5bGUoJ2xpbmUtaGVpZ2h0JykucGZWYWx1ZTtcbiAgdmFyIHRleHRXcmFwID0gZWxlLnBzdHlsZSgndGV4dC13cmFwJykuc3RyVmFsdWU7XG4gIHZhciBsaW5lcyA9IGdldFByZWZpeGVkUHJvcGVydHkoX3AucnNjcmF0Y2gsICdsYWJlbFdyYXBDYWNoZWRMaW5lcycsIHByZWZpeCkgfHwgW107XG4gIHZhciBudW1MaW5lcyA9IHRleHRXcmFwICE9PSAnd3JhcCcgPyAxIDogTWF0aC5tYXgobGluZXMubGVuZ3RoLCAxKTtcbiAgdmFyIG5vcm1QZXJMaW5lSGVpZ2h0ID0gbGFiZWxEaW1zLmhlaWdodCAvIG51bUxpbmVzO1xuICB2YXIgbGFiZWxMaW5lSGVpZ2h0ID0gbm9ybVBlckxpbmVIZWlnaHQgKiBsaW5lSGVpZ2h0O1xuICB2YXIgd2lkdGggPSBsYWJlbERpbXMud2lkdGg7XG4gIHZhciBoZWlnaHQgPSBsYWJlbERpbXMuaGVpZ2h0ICsgKG51bUxpbmVzIC0gMSkgKiAobGluZUhlaWdodCAtIDEpICogbm9ybVBlckxpbmVIZWlnaHQ7XG4gIHNldFByZWZpeGVkUHJvcGVydHkoX3AucnN0eWxlLCAnbGFiZWxXaWR0aCcsIHByZWZpeCwgd2lkdGgpO1xuICBzZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzY3JhdGNoLCAnbGFiZWxXaWR0aCcsIHByZWZpeCwgd2lkdGgpO1xuICBzZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzdHlsZSwgJ2xhYmVsSGVpZ2h0JywgcHJlZml4LCBoZWlnaHQpO1xuICBzZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzY3JhdGNoLCAnbGFiZWxIZWlnaHQnLCBwcmVmaXgsIGhlaWdodCk7XG4gIHNldFByZWZpeGVkUHJvcGVydHkoX3AucnNjcmF0Y2gsICdsYWJlbExpbmVIZWlnaHQnLCBwcmVmaXgsIGxhYmVsTGluZUhlaWdodCk7XG59O1xuXG5CUnAkOS5nZXRMYWJlbFRleHQgPSBmdW5jdGlvbiAoZWxlLCBwcmVmaXgpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcGZkID0gcHJlZml4ID8gcHJlZml4ICsgJy0nIDogJyc7XG4gIHZhciB0ZXh0ID0gZWxlLnBzdHlsZShwZmQgKyAnbGFiZWwnKS5zdHJWYWx1ZTtcbiAgdmFyIHRleHRUcmFuc2Zvcm0gPSBlbGUucHN0eWxlKCd0ZXh0LXRyYW5zZm9ybScpLnZhbHVlO1xuXG4gIHZhciByc2NyYXRjaCA9IGZ1bmN0aW9uIHJzY3JhdGNoKHByb3BOYW1lLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgcHJvcE5hbWUsIHByZWZpeCwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgcHJvcE5hbWUsIHByZWZpeCk7XG4gICAgfVxuICB9OyAvLyBmb3IgZW1wdHkgdGV4dCwgc2tpcCBhbGwgcHJvY2Vzc2luZ1xuXG5cbiAgaWYgKCF0ZXh0KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHRleHRUcmFuc2Zvcm0gPT0gJ25vbmUnKSA7IGVsc2UgaWYgKHRleHRUcmFuc2Zvcm0gPT0gJ3VwcGVyY2FzZScpIHtcbiAgICB0ZXh0ID0gdGV4dC50b1VwcGVyQ2FzZSgpO1xuICB9IGVsc2UgaWYgKHRleHRUcmFuc2Zvcm0gPT0gJ2xvd2VyY2FzZScpIHtcbiAgICB0ZXh0ID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgdmFyIHdyYXBTdHlsZSA9IGVsZS5wc3R5bGUoJ3RleHQtd3JhcCcpLnZhbHVlO1xuXG4gIGlmICh3cmFwU3R5bGUgPT09ICd3cmFwJykge1xuICAgIHZhciBsYWJlbEtleSA9IHJzY3JhdGNoKCdsYWJlbEtleScpOyAvLyBzYXZlIHJlY2FsYyBpZiB0aGUgbGFiZWwgaXMgdGhlIHNhbWUgYXMgYmVmb3JlXG5cbiAgICBpZiAobGFiZWxLZXkgIT0gbnVsbCAmJiByc2NyYXRjaCgnbGFiZWxXcmFwS2V5JykgPT09IGxhYmVsS2V5KSB7XG4gICAgICByZXR1cm4gcnNjcmF0Y2goJ2xhYmVsV3JhcENhY2hlZFRleHQnKTtcbiAgICB9XG5cbiAgICB2YXIgendzcCA9IFwiXFx1MjAwQlwiO1xuICAgIHZhciBsaW5lcyA9IHRleHQuc3BsaXQoJ1xcbicpO1xuICAgIHZhciBtYXhXID0gZWxlLnBzdHlsZSgndGV4dC1tYXgtd2lkdGgnKS5wZlZhbHVlO1xuICAgIHZhciBvdmVyZmxvdyA9IGVsZS5wc3R5bGUoJ3RleHQtb3ZlcmZsb3ctd3JhcCcpLnZhbHVlO1xuICAgIHZhciBvdmVyZmxvd0FueSA9IG92ZXJmbG93ID09PSAnYW55d2hlcmUnO1xuICAgIHZhciB3cmFwcGVkTGluZXMgPSBbXTtcbiAgICB2YXIgd29yZHNSZWdleCA9IC9bXFxzXFx1MjAwYl0rLztcbiAgICB2YXIgd29yZFNlcGFyYXRvciA9IG92ZXJmbG93QW55ID8gJycgOiAnICc7XG5cbiAgICBmb3IgKHZhciBsID0gMDsgbCA8IGxpbmVzLmxlbmd0aDsgbCsrKSB7XG4gICAgICB2YXIgbGluZSA9IGxpbmVzW2xdO1xuICAgICAgdmFyIGxpbmVEaW1zID0gdGhpcy5jYWxjdWxhdGVMYWJlbERpbWVuc2lvbnMoZWxlLCBsaW5lKTtcbiAgICAgIHZhciBsaW5lVyA9IGxpbmVEaW1zLndpZHRoO1xuXG4gICAgICBpZiAob3ZlcmZsb3dBbnkpIHtcbiAgICAgICAgdmFyIHByb2Nlc3NlZExpbmUgPSBsaW5lLnNwbGl0KCcnKS5qb2luKHp3c3ApO1xuICAgICAgICBsaW5lID0gcHJvY2Vzc2VkTGluZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxpbmVXID4gbWF4Vykge1xuICAgICAgICAvLyBsaW5lIGlzIHRvbyBsb25nXG4gICAgICAgIHZhciB3b3JkcyA9IGxpbmUuc3BsaXQod29yZHNSZWdleCk7XG4gICAgICAgIHZhciBzdWJsaW5lID0gJyc7XG5cbiAgICAgICAgZm9yICh2YXIgdyA9IDA7IHcgPCB3b3Jkcy5sZW5ndGg7IHcrKykge1xuICAgICAgICAgIHZhciB3b3JkID0gd29yZHNbd107XG4gICAgICAgICAgdmFyIHRlc3RMaW5lID0gc3VibGluZS5sZW5ndGggPT09IDAgPyB3b3JkIDogc3VibGluZSArIHdvcmRTZXBhcmF0b3IgKyB3b3JkO1xuICAgICAgICAgIHZhciB0ZXN0RGltcyA9IHRoaXMuY2FsY3VsYXRlTGFiZWxEaW1lbnNpb25zKGVsZSwgdGVzdExpbmUpO1xuICAgICAgICAgIHZhciB0ZXN0VyA9IHRlc3REaW1zLndpZHRoO1xuXG4gICAgICAgICAgaWYgKHRlc3RXIDw9IG1heFcpIHtcbiAgICAgICAgICAgIC8vIHdvcmQgZml0cyBvbiBjdXJyZW50IGxpbmVcbiAgICAgICAgICAgIHN1YmxpbmUgKz0gd29yZCArIHdvcmRTZXBhcmF0b3I7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHdvcmQgc3RhcnRzIG5ldyBsaW5lXG4gICAgICAgICAgICBpZiAoc3VibGluZSkge1xuICAgICAgICAgICAgICB3cmFwcGVkTGluZXMucHVzaChzdWJsaW5lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3VibGluZSA9IHdvcmQgKyB3b3JkU2VwYXJhdG9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBpZiB0aGVyZSdzIHJlbWFpbmluZyB0ZXh0LCBwdXQgaXQgaW4gYSB3cmFwcGVkIGxpbmVcblxuXG4gICAgICAgIGlmICghc3VibGluZS5tYXRjaCgvXltcXHNcXHUyMDBiXSskLykpIHtcbiAgICAgICAgICB3cmFwcGVkTGluZXMucHVzaChzdWJsaW5lKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbGluZSBpcyBhbHJlYWR5IHNob3J0IGVub3VnaFxuICAgICAgICB3cmFwcGVkTGluZXMucHVzaChsaW5lKTtcbiAgICAgIH1cbiAgICB9IC8vIGZvclxuXG5cbiAgICByc2NyYXRjaCgnbGFiZWxXcmFwQ2FjaGVkTGluZXMnLCB3cmFwcGVkTGluZXMpO1xuICAgIHRleHQgPSByc2NyYXRjaCgnbGFiZWxXcmFwQ2FjaGVkVGV4dCcsIHdyYXBwZWRMaW5lcy5qb2luKCdcXG4nKSk7XG4gICAgcnNjcmF0Y2goJ2xhYmVsV3JhcEtleScsIGxhYmVsS2V5KTtcbiAgfSBlbHNlIGlmICh3cmFwU3R5bGUgPT09ICdlbGxpcHNpcycpIHtcbiAgICB2YXIgX21heFcgPSBlbGUucHN0eWxlKCd0ZXh0LW1heC13aWR0aCcpLnBmVmFsdWU7XG4gICAgdmFyIGVsbGlwc2l6ZWQgPSAnJztcbiAgICB2YXIgZWxsaXBzaXMgPSBcIlxcdTIwMjZcIjtcbiAgICB2YXIgaW5jTGFzdENoID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5jYWxjdWxhdGVMYWJlbERpbWVuc2lvbnMoZWxlLCB0ZXh0KS53aWR0aCA8IF9tYXhXKSB7XG4gICAgICAvLyB0aGUgbGFiZWwgYWxyZWFkeSBmaXRzXG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3aWR0aFdpdGhOZXh0Q2ggPSB0aGlzLmNhbGN1bGF0ZUxhYmVsRGltZW5zaW9ucyhlbGUsIGVsbGlwc2l6ZWQgKyB0ZXh0W2ldICsgZWxsaXBzaXMpLndpZHRoO1xuXG4gICAgICBpZiAod2lkdGhXaXRoTmV4dENoID4gX21heFcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGVsbGlwc2l6ZWQgKz0gdGV4dFtpXTtcblxuICAgICAgaWYgKGkgPT09IHRleHQubGVuZ3RoIC0gMSkge1xuICAgICAgICBpbmNMYXN0Q2ggPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaW5jTGFzdENoKSB7XG4gICAgICBlbGxpcHNpemVkICs9IGVsbGlwc2lzO1xuICAgIH1cblxuICAgIHJldHVybiBlbGxpcHNpemVkO1xuICB9IC8vIGlmIGVsbGlwc2l6ZVxuXG5cbiAgcmV0dXJuIHRleHQ7XG59O1xuXG5CUnAkOS5nZXRMYWJlbEp1c3RpZmljYXRpb24gPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHZhciBqdXN0aWZpY2F0aW9uID0gZWxlLnBzdHlsZSgndGV4dC1qdXN0aWZpY2F0aW9uJykuc3RyVmFsdWU7XG4gIHZhciB0ZXh0SGFsaWduID0gZWxlLnBzdHlsZSgndGV4dC1oYWxpZ24nKS5zdHJWYWx1ZTtcblxuICBpZiAoanVzdGlmaWNhdGlvbiA9PT0gJ2F1dG8nKSB7XG4gICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgc3dpdGNoICh0ZXh0SGFsaWduKSB7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgIHJldHVybiAncmlnaHQnO1xuXG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICByZXR1cm4gJ2xlZnQnO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuICdjZW50ZXInO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2NlbnRlcic7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBqdXN0aWZpY2F0aW9uO1xuICB9XG59O1xuXG5CUnAkOS5jYWxjdWxhdGVMYWJlbERpbWVuc2lvbnMgPSBmdW5jdGlvbiAoZWxlLCB0ZXh0KSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGNhY2hlS2V5ID0gaGFzaFN0cmluZyh0ZXh0LCBlbGUuX3ByaXZhdGUubGFiZWxEaW1zS2V5KTtcbiAgdmFyIGNhY2hlID0gci5sYWJlbERpbUNhY2hlIHx8IChyLmxhYmVsRGltQ2FjaGUgPSBbXSk7XG4gIHZhciBleGlzdGluZ1ZhbCA9IGNhY2hlW2NhY2hlS2V5XTtcblxuICBpZiAoZXhpc3RpbmdWYWwgIT0gbnVsbCkge1xuICAgIHJldHVybiBleGlzdGluZ1ZhbDtcbiAgfVxuXG4gIHZhciBwYWRkaW5nID0gMDsgLy8gYWRkIHBhZGRpbmcgYXJvdW5kIHRleHQgZGltcywgYXMgdGhlIG1lYXN1cmVtZW50IGlzbid0IHRoYXQgYWNjdXJhdGVcblxuICB2YXIgZlN0eWxlID0gZWxlLnBzdHlsZSgnZm9udC1zdHlsZScpLnN0clZhbHVlO1xuICB2YXIgc2l6ZSA9IGVsZS5wc3R5bGUoJ2ZvbnQtc2l6ZScpLnBmVmFsdWU7XG4gIHZhciBmYW1pbHkgPSBlbGUucHN0eWxlKCdmb250LWZhbWlseScpLnN0clZhbHVlO1xuICB2YXIgd2VpZ2h0ID0gZWxlLnBzdHlsZSgnZm9udC13ZWlnaHQnKS5zdHJWYWx1ZTtcbiAgdmFyIGNhbnZhcyA9IHRoaXMubGFiZWxDYWxjQ2FudmFzO1xuICB2YXIgYzJkID0gdGhpcy5sYWJlbENhbGNDYW52YXNDb250ZXh0O1xuXG4gIGlmICghY2FudmFzKSB7XG4gICAgY2FudmFzID0gdGhpcy5sYWJlbENhbGNDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjMmQgPSB0aGlzLmxhYmVsQ2FsY0NhbnZhc0NvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICB2YXIgZHMgPSBjYW52YXMuc3R5bGU7XG4gICAgZHMucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGRzLmxlZnQgPSAnLTk5OTlweCc7XG4gICAgZHMudG9wID0gJy05OTk5cHgnO1xuICAgIGRzLnpJbmRleCA9ICctMSc7XG4gICAgZHMudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgIGRzLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gIH1cblxuICBjMmQuZm9udCA9IFwiXCIuY29uY2F0KGZTdHlsZSwgXCIgXCIpLmNvbmNhdCh3ZWlnaHQsIFwiIFwiKS5jb25jYXQoc2l6ZSwgXCJweCBcIikuY29uY2F0KGZhbWlseSk7XG4gIHZhciB3aWR0aCA9IDA7XG4gIHZhciBoZWlnaHQgPSAwO1xuICB2YXIgbGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGxpbmUgPSBsaW5lc1tpXTtcbiAgICB2YXIgbWV0cmljcyA9IGMyZC5tZWFzdXJlVGV4dChsaW5lKTtcbiAgICB2YXIgdyA9IE1hdGguY2VpbChtZXRyaWNzLndpZHRoKTtcbiAgICB2YXIgaCA9IHNpemU7XG4gICAgd2lkdGggPSBNYXRoLm1heCh3LCB3aWR0aCk7XG4gICAgaGVpZ2h0ICs9IGg7XG4gIH1cblxuICB3aWR0aCArPSBwYWRkaW5nO1xuICBoZWlnaHQgKz0gcGFkZGluZztcbiAgcmV0dXJuIGNhY2hlW2NhY2hlS2V5XSA9IHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn07XG5cbkJScCQ5LmNhbGN1bGF0ZUxhYmVsQW5nbGUgPSBmdW5jdGlvbiAoZWxlLCBwcmVmaXgpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgdmFyIGlzRWRnZSA9IGVsZS5pc0VkZ2UoKTtcbiAgdmFyIHByZWZpeERhc2ggPSBwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJztcbiAgdmFyIHJvdCA9IGVsZS5wc3R5bGUocHJlZml4RGFzaCArICd0ZXh0LXJvdGF0aW9uJyk7XG4gIHZhciByb3RTdHIgPSByb3Quc3RyVmFsdWU7XG5cbiAgaWYgKHJvdFN0ciA9PT0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSBpZiAoaXNFZGdlICYmIHJvdFN0ciA9PT0gJ2F1dG9yb3RhdGUnKSB7XG4gICAgcmV0dXJuIHJzLmxhYmVsQXV0b0FuZ2xlO1xuICB9IGVsc2UgaWYgKHJvdFN0ciA9PT0gJ2F1dG9yb3RhdGUnKSB7XG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJvdC5wZlZhbHVlO1xuICB9XG59O1xuXG5CUnAkOS5jYWxjdWxhdGVMYWJlbEFuZ2xlcyA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgaXNFZGdlID0gZWxlLmlzRWRnZSgpO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBycyA9IF9wLnJzY3JhdGNoO1xuICBycy5sYWJlbEFuZ2xlID0gci5jYWxjdWxhdGVMYWJlbEFuZ2xlKGVsZSk7XG5cbiAgaWYgKGlzRWRnZSkge1xuICAgIHJzLnNvdXJjZUxhYmVsQW5nbGUgPSByLmNhbGN1bGF0ZUxhYmVsQW5nbGUoZWxlLCAnc291cmNlJyk7XG4gICAgcnMudGFyZ2V0TGFiZWxBbmdsZSA9IHIuY2FsY3VsYXRlTGFiZWxBbmdsZShlbGUsICd0YXJnZXQnKTtcbiAgfVxufTtcblxudmFyIEJScCQ4ID0ge307XG52YXIgVE9PX1NNQUxMX0NVVF9SRUNUID0gMjg7XG52YXIgd2FybmVkQ3V0UmVjdCA9IGZhbHNlO1xuXG5CUnAkOC5nZXROb2RlU2hhcGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBzaGFwZSA9IG5vZGUucHN0eWxlKCdzaGFwZScpLnZhbHVlO1xuXG4gIGlmIChzaGFwZSA9PT0gJ2N1dHJlY3RhbmdsZScgJiYgKG5vZGUud2lkdGgoKSA8IFRPT19TTUFMTF9DVVRfUkVDVCB8fCBub2RlLmhlaWdodCgpIDwgVE9PX1NNQUxMX0NVVF9SRUNUKSkge1xuICAgIGlmICghd2FybmVkQ3V0UmVjdCkge1xuICAgICAgd2FybignVGhlIGBjdXRyZWN0YW5nbGVgIG5vZGUgc2hhcGUgY2FuIG5vdCBiZSB1c2VkIGF0IHNtYWxsIHNpemVzIHNvIGByZWN0YW5nbGVgIGlzIHVzZWQgaW5zdGVhZCcpO1xuICAgICAgd2FybmVkQ3V0UmVjdCA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuICdyZWN0YW5nbGUnO1xuICB9XG5cbiAgaWYgKG5vZGUuaXNQYXJlbnQoKSkge1xuICAgIGlmIChzaGFwZSA9PT0gJ3JlY3RhbmdsZScgfHwgc2hhcGUgPT09ICdyb3VuZHJlY3RhbmdsZScgfHwgc2hhcGUgPT09ICdyb3VuZC1yZWN0YW5nbGUnIHx8IHNoYXBlID09PSAnY3V0cmVjdGFuZ2xlJyB8fCBzaGFwZSA9PT0gJ2N1dC1yZWN0YW5nbGUnIHx8IHNoYXBlID09PSAnYmFycmVsJykge1xuICAgICAgcmV0dXJuIHNoYXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ3JlY3RhbmdsZSc7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNoYXBlID09PSAncG9seWdvbicpIHtcbiAgICB2YXIgcG9pbnRzID0gbm9kZS5wc3R5bGUoJ3NoYXBlLXBvbHlnb24tcG9pbnRzJykudmFsdWU7XG4gICAgcmV0dXJuIHIubm9kZVNoYXBlcy5tYWtlUG9seWdvbihwb2ludHMpLm5hbWU7XG4gIH1cblxuICByZXR1cm4gc2hhcGU7XG59O1xuXG52YXIgQlJwJDcgPSB7fTtcblxuQlJwJDcucmVnaXN0ZXJDYWxjdWxhdGlvbkxpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeTtcbiAgdmFyIGVsZXNUb1VwZGF0ZSA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgdmFyIHIgPSB0aGlzO1xuXG4gIHZhciBlbnF1ZXVlID0gZnVuY3Rpb24gZW5xdWV1ZShlbGVzKSB7XG4gICAgdmFyIGRpcnR5U3R5bGVDYWNoZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gICAgZWxlc1RvVXBkYXRlLm1lcmdlKGVsZXMpO1xuXG4gICAgaWYgKGRpcnR5U3R5bGVDYWNoZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgICAgICB2YXIgcnN0eWxlID0gX3AucnN0eWxlO1xuICAgICAgICByc3R5bGUuY2xlYW4gPSBmYWxzZTtcbiAgICAgICAgcnN0eWxlLmNsZWFuQ29ubmVjdGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHIuYmluZGVyKGN5KS5vbignYm91bmRzLiogZGlydHkuKicsIGZ1bmN0aW9uIG9uRGlydHlCb3VuZHMoZSkge1xuICAgIHZhciBlbGUgPSBlLnRhcmdldDtcbiAgICBlbnF1ZXVlKGVsZSk7XG4gIH0pLm9uKCdzdHlsZS4qIGJhY2tncm91bmQuKicsIGZ1bmN0aW9uIG9uRGlydHlTdHlsZShlKSB7XG4gICAgdmFyIGVsZSA9IGUudGFyZ2V0O1xuICAgIGVucXVldWUoZWxlLCBmYWxzZSk7XG4gIH0pO1xuXG4gIHZhciB1cGRhdGVFbGVDYWxjcyA9IGZ1bmN0aW9uIHVwZGF0ZUVsZUNhbGNzKHdpbGxEcmF3KSB7XG4gICAgaWYgKHdpbGxEcmF3KSB7XG4gICAgICB2YXIgZm5zID0gci5vblVwZGF0ZUVsZUNhbGNzRm5zOyAvLyBiZWNhdXNlIHdlIG5lZWQgdG8gaGF2ZSB1cC10by1kYXRlIHN0eWxlIChlLmcuIHN0eWxlc2hlZXQgbWFwcGVycylcbiAgICAgIC8vIGJlZm9yZSBjYWxjdWxhdGluZyByZW5kZXJlZCBzdHlsZSAoYW5kIHBzdHlsZSBtaWdodCBub3QgYmUgY2FsbGVkIHlldClcblxuICAgICAgZWxlc1RvVXBkYXRlLmNsZWFuU3R5bGUoKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzVG9VcGRhdGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGVsZXNUb1VwZGF0ZVtpXTtcbiAgICAgICAgdmFyIHJzdHlsZSA9IGVsZS5fcHJpdmF0ZS5yc3R5bGU7XG5cbiAgICAgICAgaWYgKGVsZS5pc05vZGUoKSAmJiAhcnN0eWxlLmNsZWFuQ29ubmVjdGVkKSB7XG4gICAgICAgICAgZW5xdWV1ZShlbGUuY29ubmVjdGVkRWRnZXMoKSk7XG4gICAgICAgICAgcnN0eWxlLmNsZWFuQ29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZm5zKSB7XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBmbnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgdmFyIGZuID0gZm5zW19pXTtcbiAgICAgICAgICBmbih3aWxsRHJhdywgZWxlc1RvVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZShlbGVzVG9VcGRhdGUpO1xuICAgICAgZWxlc1RvVXBkYXRlID0gY3kuY29sbGVjdGlvbigpO1xuICAgIH1cbiAgfTtcblxuICByLmZsdXNoUmVuZGVyZWRTdHlsZVF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICAgIHVwZGF0ZUVsZUNhbGNzKHRydWUpO1xuICB9O1xuXG4gIHIuYmVmb3JlUmVuZGVyKHVwZGF0ZUVsZUNhbGNzLCByLmJlZm9yZVJlbmRlclByaW9yaXRpZXMuZWxlQ2FsY3MpO1xufTtcblxuQlJwJDcub25VcGRhdGVFbGVDYWxjcyA9IGZ1bmN0aW9uIChmbikge1xuICB2YXIgZm5zID0gdGhpcy5vblVwZGF0ZUVsZUNhbGNzRm5zID0gdGhpcy5vblVwZGF0ZUVsZUNhbGNzRm5zIHx8IFtdO1xuICBmbnMucHVzaChmbik7XG59O1xuXG5CUnAkNy5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUgPSBmdW5jdGlvbiAoZWxlcywgdXNlQ2FjaGUpIHtcbiAgdmFyIGlzQ2xlYW5Db25uZWN0ZWQgPSBmdW5jdGlvbiBpc0NsZWFuQ29ubmVjdGVkKGVsZSkge1xuICAgIHJldHVybiBlbGUuX3ByaXZhdGUucnN0eWxlLmNsZWFuQ29ubmVjdGVkO1xuICB9O1xuXG4gIHZhciBlZGdlcyA9IFtdO1xuICB2YXIgbm9kZXMgPSBbXTsgLy8gdGhlIHJlbmRlcmVyIGNhbid0IGJlIHVzZWQgZm9yIGNhbGNzIHdoZW4gZGVzdHJveWVkLCBlLmcuIGVsZS5ib3VuZGluZ0JveCgpXG5cbiAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIHVzZSBjYWNoZSBieSBkZWZhdWx0IGZvciBwZXJmXG5cblxuICBpZiAodXNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgIHVzZUNhY2hlID0gdHJ1ZTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICB2YXIgcnN0eWxlID0gX3AucnN0eWxlOyAvLyBhbiBlZGdlIG1heSBiZSBpbXBsaWNpdGx5IGRpcnR5IGIvYyBvZiBvbmUgb2YgaXRzIGNvbm5lY3RlZCBub2Rlc1xuICAgIC8vIChhbmQgYSByZXF1ZXN0IGZvciByZWNhbGMgbWF5IGNvbWUgaW4gYmV0d2VlbiBmcmFtZXMpXG5cbiAgICBpZiAoZWxlLmlzRWRnZSgpICYmICghaXNDbGVhbkNvbm5lY3RlZChlbGUuc291cmNlKCkpIHx8ICFpc0NsZWFuQ29ubmVjdGVkKGVsZS50YXJnZXQoKSkpKSB7XG4gICAgICByc3R5bGUuY2xlYW4gPSBmYWxzZTtcbiAgICB9IC8vIG9ubHkgdXBkYXRlIGlmIGRpcnR5IGFuZCBpbiBncmFwaFxuXG5cbiAgICBpZiAodXNlQ2FjaGUgJiYgcnN0eWxlLmNsZWFuIHx8IGVsZS5yZW1vdmVkKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gLy8gb25seSB1cGRhdGUgaWYgbm90IGRpc3BsYXk6IG5vbmVcblxuXG4gICAgaWYgKGVsZS5wc3R5bGUoJ2Rpc3BsYXknKS52YWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoX3AuZ3JvdXAgPT09ICdub2RlcycpIHtcbiAgICAgIG5vZGVzLnB1c2goZWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZWRnZXNcbiAgICAgIGVkZ2VzLnB1c2goZWxlKTtcbiAgICB9XG5cbiAgICByc3R5bGUuY2xlYW4gPSB0cnVlO1xuICB9IC8vIHVwZGF0ZSBub2RlIGRhdGEgZnJvbSBwcm9qZWN0aW9uc1xuXG5cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbm9kZXMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciBfZWxlID0gbm9kZXNbX2kyXTtcbiAgICB2YXIgX3AyID0gX2VsZS5fcHJpdmF0ZTtcbiAgICB2YXIgX3JzdHlsZSA9IF9wMi5yc3R5bGU7XG5cbiAgICB2YXIgcG9zID0gX2VsZS5wb3NpdGlvbigpO1xuXG4gICAgdGhpcy5yZWNhbGN1bGF0ZU5vZGVMYWJlbFByb2plY3Rpb24oX2VsZSk7XG4gICAgX3JzdHlsZS5ub2RlWCA9IHBvcy54O1xuICAgIF9yc3R5bGUubm9kZVkgPSBwb3MueTtcbiAgICBfcnN0eWxlLm5vZGVXID0gX2VsZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZTtcbiAgICBfcnN0eWxlLm5vZGVIID0gX2VsZS5wc3R5bGUoJ2hlaWdodCcpLnBmVmFsdWU7XG4gIH1cblxuICB0aGlzLnJlY2FsY3VsYXRlRWRnZVByb2plY3Rpb25zKGVkZ2VzKTsgLy8gdXBkYXRlIGVkZ2UgZGF0YSBmcm9tIHByb2plY3Rpb25zXG5cbiAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgZWRnZXMubGVuZ3RoOyBfaTMrKykge1xuICAgIHZhciBfZWxlMiA9IGVkZ2VzW19pM107XG4gICAgdmFyIF9wMyA9IF9lbGUyLl9wcml2YXRlO1xuICAgIHZhciBfcnN0eWxlMiA9IF9wMy5yc3R5bGU7XG4gICAgdmFyIHJzID0gX3AzLnJzY3JhdGNoOyAvLyB1cGRhdGUgcnN0eWxlIHBvc2l0aW9uc1xuXG4gICAgX3JzdHlsZTIuc3JjWCA9IHJzLmFycm93U3RhcnRYO1xuICAgIF9yc3R5bGUyLnNyY1kgPSBycy5hcnJvd1N0YXJ0WTtcbiAgICBfcnN0eWxlMi50Z3RYID0gcnMuYXJyb3dFbmRYO1xuICAgIF9yc3R5bGUyLnRndFkgPSBycy5hcnJvd0VuZFk7XG4gICAgX3JzdHlsZTIubWlkWCA9IHJzLm1pZFg7XG4gICAgX3JzdHlsZTIubWlkWSA9IHJzLm1pZFk7XG4gICAgX3JzdHlsZTIubGFiZWxBbmdsZSA9IHJzLmxhYmVsQW5nbGU7XG4gICAgX3JzdHlsZTIuc291cmNlTGFiZWxBbmdsZSA9IHJzLnNvdXJjZUxhYmVsQW5nbGU7XG4gICAgX3JzdHlsZTIudGFyZ2V0TGFiZWxBbmdsZSA9IHJzLnRhcmdldExhYmVsQW5nbGU7XG4gIH1cbn07XG5cbnZhciBCUnAkNiA9IHt9O1xuXG5CUnAkNi51cGRhdGVDYWNoZWRHcmFiYmVkRWxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZXMgPSB0aGlzLmNhY2hlZFpTb3J0ZWRFbGVzO1xuXG4gIGlmICghZWxlcykge1xuICAgIC8vIGp1c3QgbGV0IHRoaXMgYmUgcmVjYWxjdWxhdGVkIG9uIHRoZSBuZXh0IHogc29ydCB0aWNrXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZWxlcy5kcmFnID0gW107XG4gIGVsZXMubm9uZHJhZyA9IFtdO1xuICB2YXIgZ3JhYlRhcmdldHMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICB2YXIgcnMgPSBlbGUuX3ByaXZhdGUucnNjcmF0Y2g7XG5cbiAgICBpZiAoZWxlLmdyYWJiZWQoKSAmJiAhZWxlLmlzUGFyZW50KCkpIHtcbiAgICAgIGdyYWJUYXJnZXRzLnB1c2goZWxlKTtcbiAgICB9IGVsc2UgaWYgKHJzLmluRHJhZ0xheWVyKSB7XG4gICAgICBlbGVzLmRyYWcucHVzaChlbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVzLm5vbmRyYWcucHVzaChlbGUpO1xuICAgIH1cbiAgfSAvLyBwdXQgdGhlIGdyYWIgdGFyZ2V0IG5vZGVzIGxhc3Qgc28gaXQncyBvbiB0b3Agb2YgaXRzIG5laWdoYm91cmhvb2RcblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JhYlRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZ3JhYlRhcmdldHNbaV07XG4gICAgZWxlcy5kcmFnLnB1c2goZWxlKTtcbiAgfVxufTtcblxuQlJwJDYuaW52YWxpZGF0ZUNhY2hlZFpTb3J0ZWRFbGVzID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNhY2hlZFpTb3J0ZWRFbGVzID0gbnVsbDtcbn07XG5cbkJScCQ2LmdldENhY2hlZFpTb3J0ZWRFbGVzID0gZnVuY3Rpb24gKGZvcmNlUmVjYWxjKSB7XG4gIGlmIChmb3JjZVJlY2FsYyB8fCAhdGhpcy5jYWNoZWRaU29ydGVkRWxlcykge1xuICAgIHZhciBlbGVzID0gdGhpcy5jeS5tdXRhYmxlRWxlbWVudHMoKS50b0FycmF5KCk7XG4gICAgZWxlcy5zb3J0KHpJbmRleFNvcnQpO1xuICAgIGVsZXMuaW50ZXJhY3RpdmUgPSBlbGVzLmZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmludGVyYWN0aXZlKCk7XG4gICAgfSk7XG4gICAgdGhpcy5jYWNoZWRaU29ydGVkRWxlcyA9IGVsZXM7XG4gICAgdGhpcy51cGRhdGVDYWNoZWRHcmFiYmVkRWxlcygpO1xuICB9IGVsc2Uge1xuICAgIGVsZXMgPSB0aGlzLmNhY2hlZFpTb3J0ZWRFbGVzO1xuICB9XG5cbiAgcmV0dXJuIGVsZXM7XG59O1xuXG52YXIgQlJwJDUgPSB7fTtcbltCUnAkZSwgQlJwJGQsIEJScCRjLCBCUnAkYiwgQlJwJGEsIEJScCQ5LCBCUnAkOCwgQlJwJDcsIEJScCQ2XS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoQlJwJDUsIHByb3BzKTtcbn0pO1xuXG52YXIgQlJwJDQgPSB7fTtcblxuQlJwJDQuZ2V0Q2FjaGVkSW1hZ2UgPSBmdW5jdGlvbiAodXJsLCBjcm9zc09yaWdpbiwgb25Mb2FkKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGltYWdlQ2FjaGUgPSByLmltYWdlQ2FjaGUgPSByLmltYWdlQ2FjaGUgfHwge307XG4gIHZhciBjYWNoZSA9IGltYWdlQ2FjaGVbdXJsXTtcblxuICBpZiAoY2FjaGUpIHtcbiAgICBpZiAoIWNhY2hlLmltYWdlLmNvbXBsZXRlKSB7XG4gICAgICBjYWNoZS5pbWFnZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FjaGUuaW1hZ2U7XG4gIH0gZWxzZSB7XG4gICAgY2FjaGUgPSBpbWFnZUNhY2hlW3VybF0gPSBpbWFnZUNhY2hlW3VybF0gfHwge307XG4gICAgdmFyIGltYWdlID0gY2FjaGUuaW1hZ2UgPSBuZXcgSW1hZ2UoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gICAgaW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIG9uTG9hZCk7XG4gICAgaW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpbWFnZS5lcnJvciA9IHRydWU7XG4gICAgfSk7IC8vICMxNTgyIHNhZmFyaSBkb2Vzbid0IGxvYWQgZGF0YSB1cmlzIHdpdGggY3Jvc3NPcmlnaW4gcHJvcGVybHlcbiAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTIzOTc4XG5cbiAgICB2YXIgZGF0YVVyaVByZWZpeCA9ICdkYXRhOic7XG4gICAgdmFyIGlzRGF0YVVyaSA9IHVybC5zdWJzdHJpbmcoMCwgZGF0YVVyaVByZWZpeC5sZW5ndGgpLnRvTG93ZXJDYXNlKCkgPT09IGRhdGFVcmlQcmVmaXg7XG5cbiAgICBpZiAoIWlzRGF0YVVyaSkge1xuICAgICAgLy8gaWYgY3Jvc3NvcmlnaW4gaXMgJ251bGwnKHN0cmluZ2lmaWVkKSwgdGhlbiBtYW51YWxseSBzZXQgaXQgdG8gbnVsbCBcbiAgICAgIGNyb3NzT3JpZ2luID0gY3Jvc3NPcmlnaW4gPT09ICdudWxsJyA/IG51bGwgOiBjcm9zc09yaWdpbjtcbiAgICAgIGltYWdlLmNyb3NzT3JpZ2luID0gY3Jvc3NPcmlnaW47IC8vIHByZXZlbnQgdGFpbnRlZCBjYW52YXNcbiAgICB9XG5cbiAgICBpbWFnZS5zcmMgPSB1cmw7XG4gICAgcmV0dXJuIGltYWdlO1xuICB9XG59O1xuXG52YXIgQlJwJDMgPSB7fTtcbi8qIGdsb2JhbCBkb2N1bWVudCwgd2luZG93LCBSZXNpemVPYnNlcnZlciwgTXV0YXRpb25PYnNlcnZlciAqL1xuXG5CUnAkMy5yZWdpc3RlckJpbmRpbmcgPSBmdW5jdGlvbiAodGFyZ2V0LCBldmVudCwgaGFuZGxlciwgdXNlQ2FwdHVyZSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cywgWzFdKTsgLy8gY29weVxuXG4gIHZhciBiID0gdGhpcy5iaW5kZXIodGFyZ2V0KTtcbiAgcmV0dXJuIGIub24uYXBwbHkoYiwgYXJncyk7XG59O1xuXG5CUnAkMy5iaW5kZXIgPSBmdW5jdGlvbiAodGd0KSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIHRndElzRG9tID0gdGd0ID09PSB3aW5kb3cgfHwgdGd0ID09PSBkb2N1bWVudCB8fCB0Z3QgPT09IGRvY3VtZW50LmJvZHkgfHwgZG9tRWxlbWVudCh0Z3QpO1xuXG4gIGlmIChyLnN1cHBvcnRzUGFzc2l2ZUV2ZW50cyA9PSBudWxsKSB7XG4gICAgLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vV0lDRy9FdmVudExpc3RlbmVyT3B0aW9ucy9ibG9iL2doLXBhZ2VzL2V4cGxhaW5lci5tZCNmZWF0dXJlLWRldGVjdGlvblxuICAgIHZhciBzdXBwb3J0c1Bhc3NpdmUgPSBmYWxzZTtcblxuICAgIHRyeSB7XG4gICAgICB2YXIgb3B0cyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHN1cHBvcnRzUGFzc2l2ZSA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBudWxsLCBvcHRzKTtcbiAgICB9IGNhdGNoIChlcnIpIHsvLyBub3Qgc3VwcG9ydGVkXG4gICAgfVxuXG4gICAgci5zdXBwb3J0c1Bhc3NpdmVFdmVudHMgPSBzdXBwb3J0c1Bhc3NpdmU7XG4gIH1cblxuICB2YXIgb24gPSBmdW5jdGlvbiBvbihldmVudCwgaGFuZGxlciwgdXNlQ2FwdHVyZSkge1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblxuICAgIGlmICh0Z3RJc0RvbSAmJiByLnN1cHBvcnRzUGFzc2l2ZUV2ZW50cykge1xuICAgICAgLy8gcmVwbGFjZSB1c2VDYXB0dXJlIHcvIG9wdHMgb2JqXG4gICAgICBhcmdzWzJdID0ge1xuICAgICAgICBjYXB0dXJlOiB1c2VDYXB0dXJlICE9IG51bGwgPyB1c2VDYXB0dXJlIDogZmFsc2UsXG4gICAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgICAgICBvbmNlOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByLmJpbmRpbmdzLnB1c2goe1xuICAgICAgdGFyZ2V0OiB0Z3QsXG4gICAgICBhcmdzOiBhcmdzXG4gICAgfSk7XG4gICAgKHRndC5hZGRFdmVudExpc3RlbmVyIHx8IHRndC5vbikuYXBwbHkodGd0LCBhcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIG9uOiBvbixcbiAgICBhZGRFdmVudExpc3RlbmVyOiBvbixcbiAgICBhZGRMaXN0ZW5lcjogb24sXG4gICAgYmluZDogb25cbiAgfTtcbn07XG5cbkJScCQzLm5vZGVJc0RyYWdnYWJsZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHJldHVybiBub2RlICYmIG5vZGUuaXNOb2RlKCkgJiYgIW5vZGUubG9ja2VkKCkgJiYgbm9kZS5ncmFiYmFibGUoKTtcbn07XG5cbkJScCQzLm5vZGVJc0dyYWJiYWJsZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHJldHVybiB0aGlzLm5vZGVJc0RyYWdnYWJsZShub2RlKSAmJiBub2RlLmludGVyYWN0aXZlKCk7XG59O1xuXG5CUnAkMy5sb2FkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgciA9IHRoaXM7XG5cbiAgdmFyIGlzU2VsZWN0ZWQgPSBmdW5jdGlvbiBpc1NlbGVjdGVkKGVsZSkge1xuICAgIHJldHVybiBlbGUuc2VsZWN0ZWQoKTtcbiAgfTtcblxuICB2YXIgdHJpZ2dlckV2ZW50cyA9IGZ1bmN0aW9uIHRyaWdnZXJFdmVudHModGFyZ2V0LCBuYW1lcywgZSwgcG9zaXRpb24pIHtcbiAgICBpZiAodGFyZ2V0ID09IG51bGwpIHtcbiAgICAgIHRhcmdldCA9IHIuY3k7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgIHRhcmdldC5lbWl0KHtcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdHlwZTogbmFtZSxcbiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGlzTXVsdFNlbEtleURvd24gPSBmdW5jdGlvbiBpc011bHRTZWxLZXlEb3duKGUpIHtcbiAgICByZXR1cm4gZS5zaGlmdEtleSB8fCBlLm1ldGFLZXkgfHwgZS5jdHJsS2V5OyAvLyBtYXliZSBlLmFsdEtleVxuICB9O1xuXG4gIHZhciBhbGxvd1Bhbm5pbmdQYXNzdGhyb3VnaCA9IGZ1bmN0aW9uIGFsbG93UGFubmluZ1Bhc3N0aHJvdWdoKGRvd24sIGRvd25zKSB7XG4gICAgdmFyIGFsbG93UGFzc3Rocm91Z2ggPSB0cnVlO1xuXG4gICAgaWYgKHIuY3kuaGFzQ29tcG91bmROb2RlcygpICYmIGRvd24gJiYgZG93bi5wYW5uYWJsZSgpKSB7XG4gICAgICAvLyBhIGdyYWJiYWJsZSBjb21wb3VuZCBub2RlIGJlbG93IHRoZSBlbGUgPT4gbm8gcGFzc3Rocm91Z2ggcGFubmluZ1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGRvd25zICYmIGkgPCBkb3ducy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZG93biA9IGRvd25zW2ldOyAvL2lmIGFueSBwYXJlbnQgbm9kZSBpbiBldmVudCBoaWVyYXJjaHkgaXNuJ3QgcGFubmFibGUsIHJlamVjdCBwYXNzdGhyb3VnaFxuXG4gICAgICAgIGlmIChkb3duLmlzTm9kZSgpICYmIGRvd24uaXNQYXJlbnQoKSAmJiAhZG93bi5wYW5uYWJsZSgpKSB7XG4gICAgICAgICAgYWxsb3dQYXNzdGhyb3VnaCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGFsbG93UGFzc3Rocm91Z2ggPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBhbGxvd1Bhc3N0aHJvdWdoO1xuICB9O1xuXG4gIHZhciBzZXRHcmFiYmVkID0gZnVuY3Rpb24gc2V0R3JhYmJlZChlbGUpIHtcbiAgICBlbGVbMF0uX3ByaXZhdGUuZ3JhYmJlZCA9IHRydWU7XG4gIH07XG5cbiAgdmFyIHNldEZyZWVkID0gZnVuY3Rpb24gc2V0RnJlZWQoZWxlKSB7XG4gICAgZWxlWzBdLl9wcml2YXRlLmdyYWJiZWQgPSBmYWxzZTtcbiAgfTtcblxuICB2YXIgc2V0SW5EcmFnTGF5ZXIgPSBmdW5jdGlvbiBzZXRJbkRyYWdMYXllcihlbGUpIHtcbiAgICBlbGVbMF0uX3ByaXZhdGUucnNjcmF0Y2guaW5EcmFnTGF5ZXIgPSB0cnVlO1xuICB9O1xuXG4gIHZhciBzZXRPdXREcmFnTGF5ZXIgPSBmdW5jdGlvbiBzZXRPdXREcmFnTGF5ZXIoZWxlKSB7XG4gICAgZWxlWzBdLl9wcml2YXRlLnJzY3JhdGNoLmluRHJhZ0xheWVyID0gZmFsc2U7XG4gIH07XG5cbiAgdmFyIHNldEdyYWJUYXJnZXQgPSBmdW5jdGlvbiBzZXRHcmFiVGFyZ2V0KGVsZSkge1xuICAgIGVsZVswXS5fcHJpdmF0ZS5yc2NyYXRjaC5pc0dyYWJUYXJnZXQgPSB0cnVlO1xuICB9O1xuXG4gIHZhciByZW1vdmVHcmFiVGFyZ2V0ID0gZnVuY3Rpb24gcmVtb3ZlR3JhYlRhcmdldChlbGUpIHtcbiAgICBlbGVbMF0uX3ByaXZhdGUucnNjcmF0Y2guaXNHcmFiVGFyZ2V0ID0gZmFsc2U7XG4gIH07XG5cbiAgdmFyIGFkZFRvRHJhZ0xpc3QgPSBmdW5jdGlvbiBhZGRUb0RyYWdMaXN0KGVsZSwgb3B0cykge1xuICAgIHZhciBsaXN0ID0gb3B0cy5hZGRUb0xpc3Q7XG4gICAgdmFyIGxpc3RIYXNFbGUgPSBsaXN0LmhhcyhlbGUpO1xuXG4gICAgaWYgKCFsaXN0SGFzRWxlICYmIGVsZS5ncmFiYmFibGUoKSAmJiAhZWxlLmxvY2tlZCgpKSB7XG4gICAgICBsaXN0Lm1lcmdlKGVsZSk7XG4gICAgICBzZXRHcmFiYmVkKGVsZSk7XG4gICAgfVxuICB9OyAvLyBoZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGNoaWxkIG5vZGVzIGFuZCBpbm5lciBlZGdlc1xuICAvLyBvZiBhIGNvbXBvdW5kIG5vZGUgdG8gYmUgZHJhZ2dlZCBhcyB3ZWxsIGFzIHRoZSBncmFiYmVkIGFuZCBzZWxlY3RlZCBub2Rlc1xuXG5cbiAgdmFyIGFkZERlc2NlbmRhbnRzVG9EcmFnID0gZnVuY3Rpb24gYWRkRGVzY2VuZGFudHNUb0RyYWcobm9kZSwgb3B0cykge1xuICAgIGlmICghbm9kZS5jeSgpLmhhc0NvbXBvdW5kTm9kZXMoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmluRHJhZ0xheWVyID09IG51bGwgJiYgb3B0cy5hZGRUb0xpc3QgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gbm90aGluZyB0byBkb1xuXG5cbiAgICB2YXIgaW5uZXJOb2RlcyA9IG5vZGUuZGVzY2VuZGFudHMoKTtcblxuICAgIGlmIChvcHRzLmluRHJhZ0xheWVyKSB7XG4gICAgICBpbm5lck5vZGVzLmZvckVhY2goc2V0SW5EcmFnTGF5ZXIpO1xuICAgICAgaW5uZXJOb2Rlcy5jb25uZWN0ZWRFZGdlcygpLmZvckVhY2goc2V0SW5EcmFnTGF5ZXIpO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmFkZFRvTGlzdCkge1xuICAgICAgYWRkVG9EcmFnTGlzdChpbm5lck5vZGVzLCBvcHRzKTtcbiAgICB9XG4gIH07IC8vIGFkZHMgdGhlIGdpdmVuIG5vZGVzIGFuZCBpdHMgbmVpZ2hib3VyaG9vZCB0byB0aGUgZHJhZyBsYXllclxuXG5cbiAgdmFyIGFkZE5vZGVzVG9EcmFnID0gZnVuY3Rpb24gYWRkTm9kZXNUb0RyYWcobm9kZXMsIG9wdHMpIHtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICB2YXIgaGFzQ29tcG91bmROb2RlcyA9IG5vZGVzLmN5KCkuaGFzQ29tcG91bmROb2RlcygpO1xuXG4gICAgaWYgKG9wdHMuaW5EcmFnTGF5ZXIpIHtcbiAgICAgIG5vZGVzLmZvckVhY2goc2V0SW5EcmFnTGF5ZXIpO1xuICAgICAgbm9kZXMubmVpZ2hib3Job29kKCkuc3RkRmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgcmV0dXJuICFoYXNDb21wb3VuZE5vZGVzIHx8IGVsZS5pc0VkZ2UoKTtcbiAgICAgIH0pLmZvckVhY2goc2V0SW5EcmFnTGF5ZXIpO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmFkZFRvTGlzdCkge1xuICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgIGFkZFRvRHJhZ0xpc3QoZWxlLCBvcHRzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGFkZERlc2NlbmRhbnRzVG9EcmFnKG5vZGVzLCBvcHRzKTsgLy8gYWx3YXlzIGFkZCB0byBkcmFnXG4gICAgLy8gYWxzbyBhZGQgbm9kZXMgYW5kIGVkZ2VzIHJlbGF0ZWQgdG8gdGhlIHRvcG1vc3QgYW5jZXN0b3JcblxuICAgIHVwZGF0ZUFuY2VzdG9yc0luRHJhZ0xheWVyKG5vZGVzLCB7XG4gICAgICBpbkRyYWdMYXllcjogb3B0cy5pbkRyYWdMYXllclxuICAgIH0pO1xuICAgIHIudXBkYXRlQ2FjaGVkR3JhYmJlZEVsZXMoKTtcbiAgfTtcblxuICB2YXIgYWRkTm9kZVRvRHJhZyA9IGFkZE5vZGVzVG9EcmFnO1xuXG4gIHZhciBmcmVlRHJhZ2dlZEVsZW1lbnRzID0gZnVuY3Rpb24gZnJlZURyYWdnZWRFbGVtZW50cyhncmFiYmVkRWxlcykge1xuICAgIGlmICghZ3JhYmJlZEVsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGp1c3QgZ28gb3ZlciBhbGwgZWxlbWVudHMgcmF0aGVyIHRoYW4gZG9pbmcgYSBidW5jaCBvZiAocG9zc2libHkgZXhwZW5zaXZlKSB0cmF2ZXJzYWxzXG5cblxuICAgIHIuZ2V0Q2FjaGVkWlNvcnRlZEVsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHNldEZyZWVkKGVsZSk7XG4gICAgICBzZXRPdXREcmFnTGF5ZXIoZWxlKTtcbiAgICAgIHJlbW92ZUdyYWJUYXJnZXQoZWxlKTtcbiAgICB9KTtcbiAgICByLnVwZGF0ZUNhY2hlZEdyYWJiZWRFbGVzKCk7XG4gIH07IC8vIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggYW5jZXN0b3Igbm9kZXMgYW5kIGVkZ2VzIHNob3VsZCBnb1xuICAvLyB0byB0aGUgZHJhZyBsYXllciAob3Igc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSBkcmFnIGxheWVyKS5cblxuXG4gIHZhciB1cGRhdGVBbmNlc3RvcnNJbkRyYWdMYXllciA9IGZ1bmN0aW9uIHVwZGF0ZUFuY2VzdG9yc0luRHJhZ0xheWVyKG5vZGUsIG9wdHMpIHtcbiAgICBpZiAob3B0cy5pbkRyYWdMYXllciA9PSBudWxsICYmIG9wdHMuYWRkVG9MaXN0ID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIG5vdGhpbmcgdG8gZG9cblxuXG4gICAgaWYgKCFub2RlLmN5KCkuaGFzQ29tcG91bmROb2RlcygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBmaW5kIHRvcC1sZXZlbCBwYXJlbnRcblxuXG4gICAgdmFyIHBhcmVudCA9IG5vZGUuYW5jZXN0b3JzKCkub3JwaGFucygpOyAvLyBubyBwYXJlbnQgbm9kZTogbm8gbm9kZXMgdG8gYWRkIHRvIHRoZSBkcmFnIGxheWVyXG5cbiAgICBpZiAocGFyZW50LnNhbWUobm9kZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbm9kZXMgPSBwYXJlbnQuZGVzY2VuZGFudHMoKS5zcGF3blNlbGYoKS5tZXJnZShwYXJlbnQpLnVubWVyZ2Uobm9kZSkudW5tZXJnZShub2RlLmRlc2NlbmRhbnRzKCkpO1xuICAgIHZhciBlZGdlcyA9IG5vZGVzLmNvbm5lY3RlZEVkZ2VzKCk7XG5cbiAgICBpZiAob3B0cy5pbkRyYWdMYXllcikge1xuICAgICAgZWRnZXMuZm9yRWFjaChzZXRJbkRyYWdMYXllcik7XG4gICAgICBub2Rlcy5mb3JFYWNoKHNldEluRHJhZ0xheWVyKTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5hZGRUb0xpc3QpIHtcbiAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICBhZGRUb0RyYWdMaXN0KGVsZSwgb3B0cyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGJsdXJBY3RpdmVEb21FbGVtZW50ID0gZnVuY3Rpb24gYmx1ckFjdGl2ZURvbUVsZW1lbnQoKSB7XG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIgIT0gbnVsbCkge1xuICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYXZlTXV0YXRpb25zQXBpID0gdHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnO1xuICB2YXIgaGF2ZVJlc2l6ZU9ic2VydmVyQXBpID0gdHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJzsgLy8gd2F0Y2ggZm9yIHdoZW4gdGhlIGN5IGNvbnRhaW5lciBpcyByZW1vdmVkIGZyb20gdGhlIGRvbVxuXG4gIGlmIChoYXZlTXV0YXRpb25zQXBpKSB7XG4gICAgci5yZW1vdmVPYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChtdXRucykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdXRucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbXV0biA9IG11dG5zW2ldO1xuICAgICAgICB2YXIgck5vZGVzID0gbXV0bi5yZW1vdmVkTm9kZXM7XG5cbiAgICAgICAgaWYgKHJOb2Rlcykge1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgck5vZGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgck5vZGUgPSByTm9kZXNbal07XG5cbiAgICAgICAgICAgIGlmIChyTm9kZSA9PT0gci5jb250YWluZXIpIHtcbiAgICAgICAgICAgICAgci5kZXN0cm95KCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHIuY29udGFpbmVyLnBhcmVudE5vZGUpIHtcbiAgICAgIHIucmVtb3ZlT2JzZXJ2ZXIub2JzZXJ2ZShyLmNvbnRhaW5lci5wYXJlbnROb2RlLCB7XG4gICAgICAgIGNoaWxkTGlzdDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnRE9NTm9kZVJlbW92ZWQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgci5kZXN0cm95KCk7XG4gICAgfSk7XG4gIH1cblxuICB2YXIgb25SZXNpemUgPSBkZWJvdW5jZV9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZnVuY3Rpb24gKCkge1xuICAgIHIuY3kucmVzaXplKCk7XG4gIH0sIDEwMCk7XG5cbiAgaWYgKGhhdmVNdXRhdGlvbnNBcGkpIHtcbiAgICByLnN0eWxlT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihvblJlc2l6ZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICAgIHIuc3R5bGVPYnNlcnZlci5vYnNlcnZlKHIuY29udGFpbmVyLCB7XG4gICAgICBhdHRyaWJ1dGVzOiB0cnVlXG4gICAgfSk7XG4gIH0gLy8gYXV0byByZXNpemVcblxuXG4gIHIucmVnaXN0ZXJCaW5kaW5nKHdpbmRvdywgJ3Jlc2l6ZScsIG9uUmVzaXplKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gIGlmIChoYXZlUmVzaXplT2JzZXJ2ZXJBcGkpIHtcbiAgICByLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKG9uUmVzaXplKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gICAgci5yZXNpemVPYnNlcnZlci5vYnNlcnZlKHIuY29udGFpbmVyKTtcbiAgfVxuXG4gIHZhciBmb3JFYWNoVXAgPSBmdW5jdGlvbiBmb3JFYWNoVXAoZG9tRWxlLCBmbikge1xuICAgIHdoaWxlIChkb21FbGUgIT0gbnVsbCkge1xuICAgICAgZm4oZG9tRWxlKTtcbiAgICAgIGRvbUVsZSA9IGRvbUVsZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgfTtcblxuICB2YXIgaW52YWxpZGF0ZUNvb3JkcyA9IGZ1bmN0aW9uIGludmFsaWRhdGVDb29yZHMoKSB7XG4gICAgci5pbnZhbGlkYXRlQ29udGFpbmVyQ2xpZW50Q29vcmRzQ2FjaGUoKTtcbiAgfTtcblxuICBmb3JFYWNoVXAoci5jb250YWluZXIsIGZ1bmN0aW9uIChkb21FbGUpIHtcbiAgICByLnJlZ2lzdGVyQmluZGluZyhkb21FbGUsICd0cmFuc2l0aW9uZW5kJywgaW52YWxpZGF0ZUNvb3Jkcyk7XG4gICAgci5yZWdpc3RlckJpbmRpbmcoZG9tRWxlLCAnYW5pbWF0aW9uZW5kJywgaW52YWxpZGF0ZUNvb3Jkcyk7XG4gICAgci5yZWdpc3RlckJpbmRpbmcoZG9tRWxlLCAnc2Nyb2xsJywgaW52YWxpZGF0ZUNvb3Jkcyk7XG4gIH0pOyAvLyBzdG9wIHJpZ2h0IGNsaWNrIG1lbnUgZnJvbSBhcHBlYXJpbmcgb24gY3lcblxuICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ2NvbnRleHRtZW51JywgZnVuY3Rpb24gKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH0pO1xuXG4gIHZhciBpbkJveFNlbGVjdGlvbiA9IGZ1bmN0aW9uIGluQm94U2VsZWN0aW9uKCkge1xuICAgIHJldHVybiByLnNlbGVjdGlvbls0XSAhPT0gMDtcbiAgfTtcblxuICB2YXIgZXZlbnRJbkNvbnRhaW5lciA9IGZ1bmN0aW9uIGV2ZW50SW5Db250YWluZXIoZSkge1xuICAgIC8vIHNhdmUgY3ljbGVzIGlmIG1vdXNlIGV2ZW50cyBhcmVuJ3QgdG8gYmUgY2FwdHVyZWRcbiAgICB2YXIgY29udGFpbmVyUGFnZUNvb3JkcyA9IHIuZmluZENvbnRhaW5lckNsaWVudENvb3JkcygpO1xuICAgIHZhciB4ID0gY29udGFpbmVyUGFnZUNvb3Jkc1swXTtcbiAgICB2YXIgeSA9IGNvbnRhaW5lclBhZ2VDb29yZHNbMV07XG4gICAgdmFyIHdpZHRoID0gY29udGFpbmVyUGFnZUNvb3Jkc1syXTtcbiAgICB2YXIgaGVpZ2h0ID0gY29udGFpbmVyUGFnZUNvb3Jkc1szXTtcbiAgICB2YXIgcG9zaXRpb25zID0gZS50b3VjaGVzID8gZS50b3VjaGVzIDogW2VdO1xuICAgIHZhciBhdExlYXN0T25lUG9zSW5zaWRlID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHAgPSBwb3NpdGlvbnNbaV07XG5cbiAgICAgIGlmICh4IDw9IHAuY2xpZW50WCAmJiBwLmNsaWVudFggPD0geCArIHdpZHRoICYmIHkgPD0gcC5jbGllbnRZICYmIHAuY2xpZW50WSA8PSB5ICsgaGVpZ2h0KSB7XG4gICAgICAgIGF0TGVhc3RPbmVQb3NJbnNpZGUgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWF0TGVhc3RPbmVQb3NJbnNpZGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgY29udGFpbmVyID0gci5jb250YWluZXI7XG4gICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0O1xuICAgIHZhciB0UGFyZW50ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgdmFyIGNvbnRhaW5lcklzVGFyZ2V0ID0gZmFsc2U7XG5cbiAgICB3aGlsZSAodFBhcmVudCkge1xuICAgICAgaWYgKHRQYXJlbnQgPT09IGNvbnRhaW5lcikge1xuICAgICAgICBjb250YWluZXJJc1RhcmdldCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB0UGFyZW50ID0gdFBhcmVudC5wYXJlbnROb2RlO1xuICAgIH1cblxuICAgIGlmICghY29udGFpbmVySXNUYXJnZXQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIGlmIHRhcmdldCBpcyBvdXRpc2RlIGN5IGNvbnRhaW5lciwgdGhlbiB0aGlzIGV2ZW50IGlzIG5vdCBmb3IgdXNcblxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07IC8vIFByaW1hcnkga2V5XG5cblxuICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ21vdXNlZG93bicsIGZ1bmN0aW9uIG1vdXNlZG93bkhhbmRsZXIoZSkge1xuICAgIGlmICghZXZlbnRJbkNvbnRhaW5lcihlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBibHVyQWN0aXZlRG9tRWxlbWVudCgpO1xuICAgIHIuaG92ZXJEYXRhLmNhcHR1cmUgPSB0cnVlO1xuICAgIHIuaG92ZXJEYXRhLndoaWNoID0gZS53aGljaDtcbiAgICB2YXIgY3kgPSByLmN5O1xuICAgIHZhciBncG9zID0gW2UuY2xpZW50WCwgZS5jbGllbnRZXTtcbiAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGdwb3NbMF0sIGdwb3NbMV0pO1xuICAgIHZhciBzZWxlY3QgPSByLnNlbGVjdGlvbjtcbiAgICB2YXIgbmVhcnMgPSByLmZpbmROZWFyZXN0RWxlbWVudHMocG9zWzBdLCBwb3NbMV0sIHRydWUsIGZhbHNlKTtcbiAgICB2YXIgbmVhciA9IG5lYXJzWzBdO1xuICAgIHZhciBkcmFnZ2VkRWxlbWVudHMgPSByLmRyYWdEYXRhLnBvc3NpYmxlRHJhZ0VsZW1lbnRzO1xuICAgIHIuaG92ZXJEYXRhLm1kb3duUG9zID0gcG9zO1xuICAgIHIuaG92ZXJEYXRhLm1kb3duR1BvcyA9IGdwb3M7XG5cbiAgICB2YXIgY2hlY2tGb3JUYXBob2xkID0gZnVuY3Rpb24gY2hlY2tGb3JUYXBob2xkKCkge1xuICAgICAgci5ob3ZlckRhdGEudGFwaG9sZENhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgY2xlYXJUaW1lb3V0KHIuaG92ZXJEYXRhLnRhcGhvbGRUaW1lb3V0KTtcbiAgICAgIHIuaG92ZXJEYXRhLnRhcGhvbGRUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChyLmhvdmVyRGF0YS50YXBob2xkQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBlbGUgPSByLmhvdmVyRGF0YS5kb3duO1xuXG4gICAgICAgICAgaWYgKGVsZSkge1xuICAgICAgICAgICAgZWxlLmVtaXQoe1xuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgICB0eXBlOiAndGFwaG9sZCcsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3kuZW1pdCh7XG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICAgIHR5cGU6ICd0YXBob2xkJyxcbiAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgci50YXBob2xkRHVyYXRpb24pO1xuICAgIH07IC8vIFJpZ2h0IGNsaWNrIGJ1dHRvblxuXG5cbiAgICBpZiAoZS53aGljaCA9PSAzKSB7XG4gICAgICByLmhvdmVyRGF0YS5jeHRTdGFydGVkID0gdHJ1ZTtcbiAgICAgIHZhciBjeHRFdnQgPSB7XG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHR5cGU6ICdjeHR0YXBzdGFydCcsXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAobmVhcikge1xuICAgICAgICBuZWFyLmFjdGl2YXRlKCk7XG4gICAgICAgIG5lYXIuZW1pdChjeHRFdnQpO1xuICAgICAgICByLmhvdmVyRGF0YS5kb3duID0gbmVhcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN5LmVtaXQoY3h0RXZ0KTtcbiAgICAgIH1cblxuICAgICAgci5ob3ZlckRhdGEuZG93blRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgIHIuaG92ZXJEYXRhLmN4dERyYWdnZWQgPSBmYWxzZTsgLy8gUHJpbWFyeSBidXR0b25cbiAgICB9IGVsc2UgaWYgKGUud2hpY2ggPT0gMSkge1xuICAgICAgaWYgKG5lYXIpIHtcbiAgICAgICAgbmVhci5hY3RpdmF0ZSgpO1xuICAgICAgfSAvLyBFbGVtZW50IGRyYWdnaW5nXG5cblxuICAgICAge1xuICAgICAgICAvLyBJZiBzb21ldGhpbmcgaXMgdW5kZXIgdGhlIGN1cnNvciBhbmQgaXQgaXMgZHJhZ2dhYmxlLCBwcmVwYXJlIHRvIGdyYWIgaXRcbiAgICAgICAgaWYgKG5lYXIgIT0gbnVsbCkge1xuICAgICAgICAgIGlmIChyLm5vZGVJc0dyYWJiYWJsZShuZWFyKSkge1xuICAgICAgICAgICAgdmFyIG1ha2VFdmVudCA9IGZ1bmN0aW9uIG1ha2VFdmVudCh0eXBlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB2YXIgdHJpZ2dlckdyYWIgPSBmdW5jdGlvbiB0cmlnZ2VyR3JhYihlbGUpIHtcbiAgICAgICAgICAgICAgZWxlLmVtaXQobWFrZUV2ZW50KCdncmFiJykpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgc2V0R3JhYlRhcmdldChuZWFyKTtcblxuICAgICAgICAgICAgaWYgKCFuZWFyLnNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgZHJhZ2dlZEVsZW1lbnRzID0gci5kcmFnRGF0YS5wb3NzaWJsZURyYWdFbGVtZW50cyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgICAgICAgICAgYWRkTm9kZVRvRHJhZyhuZWFyLCB7XG4gICAgICAgICAgICAgICAgYWRkVG9MaXN0OiBkcmFnZ2VkRWxlbWVudHNcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIG5lYXIuZW1pdChtYWtlRXZlbnQoJ2dyYWJvbicpKS5lbWl0KG1ha2VFdmVudCgnZ3JhYicpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRyYWdnZWRFbGVtZW50cyA9IHIuZHJhZ0RhdGEucG9zc2libGVEcmFnRWxlbWVudHMgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICAgICAgICAgIHZhciBzZWxlY3RlZE5vZGVzID0gY3kuJChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZS5pc05vZGUoKSAmJiBlbGUuc2VsZWN0ZWQoKSAmJiByLm5vZGVJc0dyYWJiYWJsZShlbGUpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYWRkTm9kZXNUb0RyYWcoc2VsZWN0ZWROb2Rlcywge1xuICAgICAgICAgICAgICAgIGFkZFRvTGlzdDogZHJhZ2dlZEVsZW1lbnRzXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBuZWFyLmVtaXQobWFrZUV2ZW50KCdncmFib24nKSk7XG4gICAgICAgICAgICAgIHNlbGVjdGVkTm9kZXMuZm9yRWFjaCh0cmlnZ2VyR3JhYik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgci5ob3ZlckRhdGEuZG93biA9IG5lYXI7XG4gICAgICAgIHIuaG92ZXJEYXRhLmRvd25zID0gbmVhcnM7XG4gICAgICAgIHIuaG92ZXJEYXRhLmRvd25UaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnRzKG5lYXIsIFsnbW91c2Vkb3duJywgJ3RhcHN0YXJ0JywgJ3Ztb3VzZWRvd24nXSwgZSwge1xuICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgIHk6IHBvc1sxXVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChuZWFyID09IG51bGwpIHtcbiAgICAgICAgc2VsZWN0WzRdID0gMTtcbiAgICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0ge1xuICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgfTtcbiAgICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgIH0gZWxzZSBpZiAobmVhci5wYW5uYWJsZSgpKSB7XG4gICAgICAgIHNlbGVjdFs0XSA9IDE7IC8vIGZvciBmdXR1cmUgcGFuXG4gICAgICB9XG5cbiAgICAgIGNoZWNrRm9yVGFwaG9sZCgpO1xuICAgIH0gLy8gSW5pdGlhbGl6ZSBzZWxlY3Rpb24gYm94IGNvb3JkaW5hdGVzXG5cblxuICAgIHNlbGVjdFswXSA9IHNlbGVjdFsyXSA9IHBvc1swXTtcbiAgICBzZWxlY3RbMV0gPSBzZWxlY3RbM10gPSBwb3NbMV07XG4gIH0sIGZhbHNlKTtcbiAgci5yZWdpc3RlckJpbmRpbmcod2luZG93LCAnbW91c2Vtb3ZlJywgZnVuY3Rpb24gbW91c2Vtb3ZlSGFuZGxlcihlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIHZhciBjYXB0dXJlID0gci5ob3ZlckRhdGEuY2FwdHVyZTtcblxuICAgIGlmICghY2FwdHVyZSAmJiAhZXZlbnRJbkNvbnRhaW5lcihlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcmV2ZW50RGVmYXVsdCA9IGZhbHNlO1xuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgdmFyIGdwb3MgPSBbZS5jbGllbnRYLCBlLmNsaWVudFldO1xuICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZ3Bvc1swXSwgZ3Bvc1sxXSk7XG4gICAgdmFyIG1kb3duUG9zID0gci5ob3ZlckRhdGEubWRvd25Qb3M7XG4gICAgdmFyIG1kb3duR1BvcyA9IHIuaG92ZXJEYXRhLm1kb3duR1BvcztcbiAgICB2YXIgc2VsZWN0ID0gci5zZWxlY3Rpb247XG4gICAgdmFyIG5lYXIgPSBudWxsO1xuXG4gICAgaWYgKCFyLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgJiYgIXIuaG92ZXJEYXRhLmRyYWdnaW5nICYmICFyLmhvdmVyRGF0YS5zZWxlY3RpbmcpIHtcbiAgICAgIG5lYXIgPSByLmZpbmROZWFyZXN0RWxlbWVudChwb3NbMF0sIHBvc1sxXSwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHZhciBsYXN0ID0gci5ob3ZlckRhdGEubGFzdDtcbiAgICB2YXIgZG93biA9IHIuaG92ZXJEYXRhLmRvd247XG4gICAgdmFyIGRpc3AgPSBbcG9zWzBdIC0gc2VsZWN0WzJdLCBwb3NbMV0gLSBzZWxlY3RbM11dO1xuICAgIHZhciBkcmFnZ2VkRWxlbWVudHMgPSByLmRyYWdEYXRhLnBvc3NpYmxlRHJhZ0VsZW1lbnRzO1xuICAgIHZhciBpc092ZXJUaHJlc2hvbGREcmFnO1xuXG4gICAgaWYgKG1kb3duR1Bvcykge1xuICAgICAgdmFyIGR4ID0gZ3Bvc1swXSAtIG1kb3duR1Bvc1swXTtcbiAgICAgIHZhciBkeDIgPSBkeCAqIGR4O1xuICAgICAgdmFyIGR5ID0gZ3Bvc1sxXSAtIG1kb3duR1Bvc1sxXTtcbiAgICAgIHZhciBkeTIgPSBkeSAqIGR5O1xuICAgICAgdmFyIGRpc3QyID0gZHgyICsgZHkyO1xuICAgICAgci5ob3ZlckRhdGEuaXNPdmVyVGhyZXNob2xkRHJhZyA9IGlzT3ZlclRocmVzaG9sZERyYWcgPSBkaXN0MiA+PSByLmRlc2t0b3BUYXBUaHJlc2hvbGQyO1xuICAgIH1cblxuICAgIHZhciBtdWx0U2VsS2V5RG93biA9IGlzTXVsdFNlbEtleURvd24oZSk7XG5cbiAgICBpZiAoaXNPdmVyVGhyZXNob2xkRHJhZykge1xuICAgICAgci5ob3ZlckRhdGEudGFwaG9sZENhbmNlbGxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdmFyIHVwZGF0ZURyYWdEZWx0YSA9IGZ1bmN0aW9uIHVwZGF0ZURyYWdEZWx0YSgpIHtcbiAgICAgIHZhciBkcmFnRGVsdGEgPSByLmhvdmVyRGF0YS5kcmFnRGVsdGEgPSByLmhvdmVyRGF0YS5kcmFnRGVsdGEgfHwgW107XG5cbiAgICAgIGlmIChkcmFnRGVsdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRyYWdEZWx0YS5wdXNoKGRpc3BbMF0pO1xuICAgICAgICBkcmFnRGVsdGEucHVzaChkaXNwWzFdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyYWdEZWx0YVswXSArPSBkaXNwWzBdO1xuICAgICAgICBkcmFnRGVsdGFbMV0gKz0gZGlzcFsxXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJldmVudERlZmF1bHQgPSB0cnVlO1xuICAgIHRyaWdnZXJFdmVudHMobmVhciwgWydtb3VzZW1vdmUnLCAndm1vdXNlbW92ZScsICd0YXBkcmFnJ10sIGUsIHtcbiAgICAgIHg6IHBvc1swXSxcbiAgICAgIHk6IHBvc1sxXVxuICAgIH0pO1xuXG4gICAgdmFyIGdvSW50b0JveE1vZGUgPSBmdW5jdGlvbiBnb0ludG9Cb3hNb2RlKCkge1xuICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoIXIuaG92ZXJEYXRhLnNlbGVjdGluZykge1xuICAgICAgICBjeS5lbWl0KHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgIHR5cGU6ICdib3hzdGFydCcsXG4gICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHNlbGVjdFs0XSA9IDE7XG4gICAgICByLmhvdmVyRGF0YS5zZWxlY3RpbmcgPSB0cnVlO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIHIucmVkcmF3KCk7XG4gICAgfTsgLy8gdHJpZ2dlciBjb250ZXh0IGRyYWcgaWYgcm1vdXNlIGRvd25cblxuXG4gICAgaWYgKHIuaG92ZXJEYXRhLndoaWNoID09PSAzKSB7XG4gICAgICAvLyBidXQgb25seSBpZiBvdmVyIHRocmVzaG9sZFxuICAgICAgaWYgKGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgICAgdmFyIGN4dEV2dCA9IHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgIHR5cGU6ICdjeHRkcmFnJyxcbiAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChkb3duKSB7XG4gICAgICAgICAgZG93bi5lbWl0KGN4dEV2dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3kuZW1pdChjeHRFdnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgci5ob3ZlckRhdGEuY3h0RHJhZ2dlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKCFyLmhvdmVyRGF0YS5jeHRPdmVyIHx8IG5lYXIgIT09IHIuaG92ZXJEYXRhLmN4dE92ZXIpIHtcbiAgICAgICAgICBpZiAoci5ob3ZlckRhdGEuY3h0T3Zlcikge1xuICAgICAgICAgICAgci5ob3ZlckRhdGEuY3h0T3Zlci5lbWl0KHtcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgICAgdHlwZTogJ2N4dGRyYWdvdXQnLFxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5ob3ZlckRhdGEuY3h0T3ZlciA9IG5lYXI7XG5cbiAgICAgICAgICBpZiAobmVhcikge1xuICAgICAgICAgICAgbmVhci5lbWl0KHtcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgICAgdHlwZTogJ2N4dGRyYWdvdmVyJyxcbiAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyBDaGVjayBpZiB3ZSBhcmUgZHJhZyBwYW5uaW5nIHRoZSBlbnRpcmUgZ3JhcGhcblxuICAgIH0gZWxzZSBpZiAoci5ob3ZlckRhdGEuZHJhZ2dpbmcpIHtcbiAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcblxuICAgICAgaWYgKGN5LnBhbm5pbmdFbmFibGVkKCkgJiYgY3kudXNlclBhbm5pbmdFbmFibGVkKCkpIHtcbiAgICAgICAgdmFyIGRlbHRhUDtcblxuICAgICAgICBpZiAoci5ob3ZlckRhdGEuanVzdFN0YXJ0ZWRQYW4pIHtcbiAgICAgICAgICB2YXIgbWRQb3MgPSByLmhvdmVyRGF0YS5tZG93blBvcztcbiAgICAgICAgICBkZWx0YVAgPSB7XG4gICAgICAgICAgICB4OiAocG9zWzBdIC0gbWRQb3NbMF0pICogem9vbSxcbiAgICAgICAgICAgIHk6IChwb3NbMV0gLSBtZFBvc1sxXSkgKiB6b29tXG4gICAgICAgICAgfTtcbiAgICAgICAgICByLmhvdmVyRGF0YS5qdXN0U3RhcnRlZFBhbiA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbHRhUCA9IHtcbiAgICAgICAgICAgIHg6IGRpc3BbMF0gKiB6b29tLFxuICAgICAgICAgICAgeTogZGlzcFsxXSAqIHpvb21cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY3kucGFuQnkoZGVsdGFQKTtcbiAgICAgICAgY3kuZW1pdCgnZHJhZ3BhbicpO1xuICAgICAgICByLmhvdmVyRGF0YS5kcmFnZ2VkID0gdHJ1ZTtcbiAgICAgIH0gLy8gTmVlZHMgcmVwcm9qZWN0IGR1ZSB0byBwYW4gY2hhbmdpbmcgdmlld3BvcnRcblxuXG4gICAgICBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS5jbGllbnRYLCBlLmNsaWVudFkpOyAvLyBDaGVja3MgcHJpbWFyeSBidXR0b24gZG93biAmIG91dCBvZiB0aW1lICYgbW91c2Ugbm90IG1vdmVkIG11Y2hcbiAgICB9IGVsc2UgaWYgKHNlbGVjdFs0XSA9PSAxICYmIChkb3duID09IG51bGwgfHwgZG93bi5wYW5uYWJsZSgpKSkge1xuICAgICAgaWYgKGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgICAgaWYgKCFyLmhvdmVyRGF0YS5kcmFnZ2luZyAmJiBjeS5ib3hTZWxlY3Rpb25FbmFibGVkKCkgJiYgKG11bHRTZWxLZXlEb3duIHx8ICFjeS5wYW5uaW5nRW5hYmxlZCgpIHx8ICFjeS51c2VyUGFubmluZ0VuYWJsZWQoKSkpIHtcbiAgICAgICAgICBnb0ludG9Cb3hNb2RlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXIuaG92ZXJEYXRhLnNlbGVjdGluZyAmJiBjeS5wYW5uaW5nRW5hYmxlZCgpICYmIGN5LnVzZXJQYW5uaW5nRW5hYmxlZCgpKSB7XG4gICAgICAgICAgdmFyIGFsbG93UGFzc3Rocm91Z2ggPSBhbGxvd1Bhbm5pbmdQYXNzdGhyb3VnaChkb3duLCByLmhvdmVyRGF0YS5kb3ducyk7XG5cbiAgICAgICAgICBpZiAoYWxsb3dQYXNzdGhyb3VnaCkge1xuICAgICAgICAgICAgci5ob3ZlckRhdGEuZHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICAgICAgci5ob3ZlckRhdGEuanVzdFN0YXJ0ZWRQYW4gPSB0cnVlO1xuICAgICAgICAgICAgc2VsZWN0WzRdID0gMDtcbiAgICAgICAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IGFycmF5MnBvaW50KG1kb3duUG9zKTtcbiAgICAgICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgICAgICByLnJlZHJhdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkb3duICYmIGRvd24ucGFubmFibGUoKSAmJiBkb3duLmFjdGl2ZSgpKSB7XG4gICAgICAgICAgZG93bi51bmFjdGl2YXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRvd24gJiYgZG93bi5wYW5uYWJsZSgpICYmIGRvd24uYWN0aXZlKCkpIHtcbiAgICAgICAgZG93bi51bmFjdGl2YXRlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICgoIWRvd24gfHwgIWRvd24uZ3JhYmJlZCgpKSAmJiBuZWFyICE9IGxhc3QpIHtcbiAgICAgICAgaWYgKGxhc3QpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnRzKGxhc3QsIFsnbW91c2VvdXQnLCAndGFwZHJhZ291dCddLCBlLCB7XG4gICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZWFyKSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50cyhuZWFyLCBbJ21vdXNlb3ZlcicsICd0YXBkcmFnb3ZlciddLCBlLCB7XG4gICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHIuaG92ZXJEYXRhLmxhc3QgPSBuZWFyO1xuICAgICAgfVxuXG4gICAgICBpZiAoZG93bikge1xuICAgICAgICBpZiAoaXNPdmVyVGhyZXNob2xkRHJhZykge1xuICAgICAgICAgIC8vIHRoZW4gd2UgY2FuIHRha2UgYWN0aW9uXG4gICAgICAgICAgaWYgKGN5LmJveFNlbGVjdGlvbkVuYWJsZWQoKSAmJiBtdWx0U2VsS2V5RG93bikge1xuICAgICAgICAgICAgLy8gdGhlbiBzZWxlY3Rpb24gb3ZlcnJpZGVzXG4gICAgICAgICAgICBpZiAoZG93biAmJiBkb3duLmdyYWJiZWQoKSkge1xuICAgICAgICAgICAgICBmcmVlRHJhZ2dlZEVsZW1lbnRzKGRyYWdnZWRFbGVtZW50cyk7XG4gICAgICAgICAgICAgIGRvd24uZW1pdCgnZnJlZW9uJyk7XG4gICAgICAgICAgICAgIGRyYWdnZWRFbGVtZW50cy5lbWl0KCdmcmVlJyk7XG5cbiAgICAgICAgICAgICAgaWYgKHIuZHJhZ0RhdGEuZGlkRHJhZykge1xuICAgICAgICAgICAgICAgIGRvd24uZW1pdCgnZHJhZ2ZyZWVvbicpO1xuICAgICAgICAgICAgICAgIGRyYWdnZWRFbGVtZW50cy5lbWl0KCdkcmFnZnJlZScpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdvSW50b0JveE1vZGUoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGRvd24gJiYgZG93bi5ncmFiYmVkKCkgJiYgci5ub2RlSXNEcmFnZ2FibGUoZG93bikpIHtcbiAgICAgICAgICAgIC8vIGRyYWcgbm9kZVxuICAgICAgICAgICAgdmFyIGp1c3RTdGFydGVkRHJhZyA9ICFyLmRyYWdEYXRhLmRpZERyYWc7XG5cbiAgICAgICAgICAgIGlmIChqdXN0U3RhcnRlZERyYWcpIHtcbiAgICAgICAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHIuZHJhZ0RhdGEuZGlkRHJhZyA9IHRydWU7IC8vIGluZGljYXRlIHRoYXQgd2UgYWN0dWFsbHkgZGlkIGRyYWcgdGhlIG5vZGVcbiAgICAgICAgICAgIC8vIG5vdywgYWRkIHRoZSBlbGVtZW50cyB0byB0aGUgZHJhZyBsYXllciBpZiBub3QgZG9uZSBhbHJlYWR5XG5cbiAgICAgICAgICAgIGlmICghci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzKSB7XG4gICAgICAgICAgICAgIGFkZE5vZGVzVG9EcmFnKGRyYWdnZWRFbGVtZW50cywge1xuICAgICAgICAgICAgICAgIGluRHJhZ0xheWVyOiB0cnVlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdG90YWxTaGlmdCA9IHtcbiAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgeTogMFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKG51bWJlciQxKGRpc3BbMF0pICYmIG51bWJlciQxKGRpc3BbMV0pKSB7XG4gICAgICAgICAgICAgIHRvdGFsU2hpZnQueCArPSBkaXNwWzBdO1xuICAgICAgICAgICAgICB0b3RhbFNoaWZ0LnkgKz0gZGlzcFsxXTtcblxuICAgICAgICAgICAgICBpZiAoanVzdFN0YXJ0ZWREcmFnKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRyYWdEZWx0YSA9IHIuaG92ZXJEYXRhLmRyYWdEZWx0YTtcblxuICAgICAgICAgICAgICAgIGlmIChkcmFnRGVsdGEgJiYgbnVtYmVyJDEoZHJhZ0RlbHRhWzBdKSAmJiBudW1iZXIkMShkcmFnRGVsdGFbMV0pKSB7XG4gICAgICAgICAgICAgICAgICB0b3RhbFNoaWZ0LnggKz0gZHJhZ0RlbHRhWzBdO1xuICAgICAgICAgICAgICAgICAgdG90YWxTaGlmdC55ICs9IGRyYWdEZWx0YVsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzID0gdHJ1ZTtcbiAgICAgICAgICAgIGRyYWdnZWRFbGVtZW50cy5zaWxlbnRTaGlmdCh0b3RhbFNoaWZ0KS5lbWl0KCdwb3NpdGlvbiBkcmFnJyk7XG4gICAgICAgICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgICAgICAgICAgIHIucmVkcmF3KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG90aGVyd2lzZSBzYXZlIGRyYWcgZGVsdGEgZm9yIHdoZW4gd2UgYWN0dWFsbHkgc3RhcnQgZHJhZ2dpbmcgc28gdGhlIHJlbGF0aXZlIGdyYWIgcG9zIGlzIGNvbnN0YW50XG4gICAgICAgICAgdXBkYXRlRHJhZ0RlbHRhKCk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gcHJldmVudCB0aGUgZHJhZ2dpbmcgZnJvbSB0cmlnZ2VyaW5nIHRleHQgc2VsZWN0aW9uIG9uIHRoZSBwYWdlXG5cblxuICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlO1xuICAgIH1cblxuICAgIHNlbGVjdFsyXSA9IHBvc1swXTtcbiAgICBzZWxlY3RbM10gPSBwb3NbMV07XG5cbiAgICBpZiAocHJldmVudERlZmF1bHQpIHtcbiAgICAgIGlmIChlLnN0b3BQcm9wYWdhdGlvbikgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCBmYWxzZSk7XG4gIHZhciBjbGlja1RpbWVvdXQsIGRpZERvdWJsZUNsaWNrLCBwcmV2Q2xpY2tUaW1lU3RhbXA7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKHdpbmRvdywgJ21vdXNldXAnLCBmdW5jdGlvbiBtb3VzZXVwSGFuZGxlcihlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIHZhciBjYXB0dXJlID0gci5ob3ZlckRhdGEuY2FwdHVyZTtcblxuICAgIGlmICghY2FwdHVyZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHIuaG92ZXJEYXRhLmNhcHR1cmUgPSBmYWxzZTtcbiAgICB2YXIgY3kgPSByLmN5O1xuICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgIHZhciBzZWxlY3QgPSByLnNlbGVjdGlvbjtcbiAgICB2YXIgbmVhciA9IHIuZmluZE5lYXJlc3RFbGVtZW50KHBvc1swXSwgcG9zWzFdLCB0cnVlLCBmYWxzZSk7XG4gICAgdmFyIGRyYWdnZWRFbGVtZW50cyA9IHIuZHJhZ0RhdGEucG9zc2libGVEcmFnRWxlbWVudHM7XG4gICAgdmFyIGRvd24gPSByLmhvdmVyRGF0YS5kb3duO1xuICAgIHZhciBtdWx0U2VsS2V5RG93biA9IGlzTXVsdFNlbEtleURvd24oZSk7XG5cbiAgICBpZiAoci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uKSB7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9XG5cbiAgICByLmhvdmVyRGF0YS50YXBob2xkQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7IC8vIG5vdCBhY3RpdmUgYmcgbm93XG5cbiAgICBpZiAoZG93bikge1xuICAgICAgZG93bi51bmFjdGl2YXRlKCk7XG4gICAgfVxuXG4gICAgaWYgKHIuaG92ZXJEYXRhLndoaWNoID09PSAzKSB7XG4gICAgICB2YXIgY3h0RXZ0ID0ge1xuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0eXBlOiAnY3h0dGFwZW5kJyxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChkb3duKSB7XG4gICAgICAgIGRvd24uZW1pdChjeHRFdnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3kuZW1pdChjeHRFdnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXIuaG92ZXJEYXRhLmN4dERyYWdnZWQpIHtcbiAgICAgICAgdmFyIGN4dFRhcCA9IHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgIHR5cGU6ICdjeHR0YXAnLFxuICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGRvd24pIHtcbiAgICAgICAgICBkb3duLmVtaXQoY3h0VGFwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjeS5lbWl0KGN4dFRhcCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgci5ob3ZlckRhdGEuY3h0RHJhZ2dlZCA9IGZhbHNlO1xuICAgICAgci5ob3ZlckRhdGEud2hpY2ggPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoci5ob3ZlckRhdGEud2hpY2ggPT09IDEpIHtcbiAgICAgIHRyaWdnZXJFdmVudHMobmVhciwgWydtb3VzZXVwJywgJ3RhcGVuZCcsICd2bW91c2V1cCddLCBlLCB7XG4gICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgeTogcG9zWzFdXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyLmRyYWdEYXRhLmRpZERyYWcgJiYgLy8gZGlkbid0IG1vdmUgYSBub2RlIGFyb3VuZFxuICAgICAgIXIuaG92ZXJEYXRhLmRyYWdnZWQgJiYgLy8gZGlkbid0IHBhblxuICAgICAgIXIuaG92ZXJEYXRhLnNlbGVjdGluZyAmJiAvLyBub3QgYm94IHNlbGVjdGlvblxuICAgICAgIXIuaG92ZXJEYXRhLmlzT3ZlclRocmVzaG9sZERyYWcgLy8gZGlkbid0IG1vdmUgdG9vIG11Y2hcbiAgICAgICkge1xuICAgICAgICB0cmlnZ2VyRXZlbnRzKGRvd24sIFtcImNsaWNrXCIsIFwidGFwXCIsIFwidmNsaWNrXCJdLCBlLCB7XG4gICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICB9KTtcbiAgICAgICAgZGlkRG91YmxlQ2xpY2sgPSBmYWxzZTtcblxuICAgICAgICBpZiAoZS50aW1lU3RhbXAgLSBwcmV2Q2xpY2tUaW1lU3RhbXAgPD0gY3kubXVsdGlDbGlja0RlYm91bmNlVGltZSgpKSB7XG4gICAgICAgICAgY2xpY2tUaW1lb3V0ICYmIGNsZWFyVGltZW91dChjbGlja1RpbWVvdXQpO1xuICAgICAgICAgIGRpZERvdWJsZUNsaWNrID0gdHJ1ZTtcbiAgICAgICAgICBwcmV2Q2xpY2tUaW1lU3RhbXAgPSBudWxsO1xuICAgICAgICAgIHRyaWdnZXJFdmVudHMoZG93biwgW1wiZGJsY2xpY2tcIiwgXCJkYmx0YXBcIiwgXCJ2ZGJsY2xpY2tcIl0sIGUsIHtcbiAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNsaWNrVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGRpZERvdWJsZUNsaWNrKSByZXR1cm47XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnRzKGRvd24sIFtcIm9uZWNsaWNrXCIsIFwib25ldGFwXCIsIFwidm9uZWNsaWNrXCJdLCBlLCB7XG4gICAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LCBjeS5tdWx0aUNsaWNrRGVib3VuY2VUaW1lKCkpO1xuICAgICAgICAgIHByZXZDbGlja1RpbWVTdGFtcCA9IGUudGltZVN0YW1wO1xuICAgICAgICB9XG4gICAgICB9IC8vIERlc2VsZWN0IGFsbCBlbGVtZW50cyBpZiBub3RoaW5nIGlzIGN1cnJlbnRseSB1bmRlciB0aGUgbW91c2UgY3Vyc29yIGFuZCB3ZSBhcmVuJ3QgZHJhZ2dpbmcgc29tZXRoaW5nXG5cblxuICAgICAgaWYgKGRvd24gPT0gbnVsbCAvLyBub3QgbW91c2Vkb3duIG9uIG5vZGVcbiAgICAgICYmICFyLmRyYWdEYXRhLmRpZERyYWcgLy8gZGlkbid0IG1vdmUgdGhlIG5vZGUgYXJvdW5kXG4gICAgICAmJiAhci5ob3ZlckRhdGEuc2VsZWN0aW5nIC8vIG5vdCBib3ggc2VsZWN0aW9uXG4gICAgICAmJiAhci5ob3ZlckRhdGEuZHJhZ2dlZCAvLyBkaWRuJ3QgcGFuXG4gICAgICAmJiAhaXNNdWx0U2VsS2V5RG93bihlKSkge1xuICAgICAgICBjeS4kKGlzU2VsZWN0ZWQpLnVuc2VsZWN0KFsndGFwdW5zZWxlY3QnXSk7XG5cbiAgICAgICAgaWYgKGRyYWdnZWRFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByLmRyYWdEYXRhLnBvc3NpYmxlRHJhZ0VsZW1lbnRzID0gZHJhZ2dlZEVsZW1lbnRzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgfSAvLyBTaW5nbGUgc2VsZWN0aW9uXG5cblxuICAgICAgaWYgKG5lYXIgPT0gZG93biAmJiAhci5kcmFnRGF0YS5kaWREcmFnICYmICFyLmhvdmVyRGF0YS5zZWxlY3RpbmcpIHtcbiAgICAgICAgaWYgKG5lYXIgIT0gbnVsbCAmJiBuZWFyLl9wcml2YXRlLnNlbGVjdGFibGUpIHtcbiAgICAgICAgICBpZiAoci5ob3ZlckRhdGEuZHJhZ2dpbmcpIDsgZWxzZSBpZiAoY3kuc2VsZWN0aW9uVHlwZSgpID09PSAnYWRkaXRpdmUnIHx8IG11bHRTZWxLZXlEb3duKSB7XG4gICAgICAgICAgICBpZiAobmVhci5zZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICAgIG5lYXIudW5zZWxlY3QoWyd0YXB1bnNlbGVjdCddKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5lYXIuc2VsZWN0KFsndGFwc2VsZWN0J10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIW11bHRTZWxLZXlEb3duKSB7XG4gICAgICAgICAgICAgIGN5LiQoaXNTZWxlY3RlZCkudW5tZXJnZShuZWFyKS51bnNlbGVjdChbJ3RhcHVuc2VsZWN0J10pO1xuICAgICAgICAgICAgICBuZWFyLnNlbGVjdChbJ3RhcHNlbGVjdCddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoci5ob3ZlckRhdGEuc2VsZWN0aW5nKSB7XG4gICAgICAgIHZhciBib3ggPSBjeS5jb2xsZWN0aW9uKHIuZ2V0QWxsSW5Cb3goc2VsZWN0WzBdLCBzZWxlY3RbMV0sIHNlbGVjdFsyXSwgc2VsZWN0WzNdKSk7XG4gICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKGJveC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjeS5lbWl0KHtcbiAgICAgICAgICB0eXBlOiAnYm94ZW5kJyxcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBlbGVXb3VsZEJlU2VsZWN0ZWQgPSBmdW5jdGlvbiBlbGVXb3VsZEJlU2VsZWN0ZWQoZWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGVsZS5zZWxlY3RhYmxlKCkgJiYgIWVsZS5zZWxlY3RlZCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChjeS5zZWxlY3Rpb25UeXBlKCkgPT09ICdhZGRpdGl2ZScpIHtcbiAgICAgICAgICBib3guZW1pdCgnYm94Jykuc3RkRmlsdGVyKGVsZVdvdWxkQmVTZWxlY3RlZCkuc2VsZWN0KCkuZW1pdCgnYm94c2VsZWN0Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFtdWx0U2VsS2V5RG93bikge1xuICAgICAgICAgICAgY3kuJChpc1NlbGVjdGVkKS51bm1lcmdlKGJveCkudW5zZWxlY3QoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBib3guZW1pdCgnYm94Jykuc3RkRmlsdGVyKGVsZVdvdWxkQmVTZWxlY3RlZCkuc2VsZWN0KCkuZW1pdCgnYm94c2VsZWN0Jyk7XG4gICAgICAgIH0gLy8gYWx3YXlzIG5lZWQgcmVkcmF3IGluIGNhc2UgZWxlcyB1bnNlbGVjdGFibGVcblxuXG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICB9IC8vIENhbmNlbCBkcmFnIHBhblxuXG5cbiAgICAgIGlmIChyLmhvdmVyRGF0YS5kcmFnZ2luZykge1xuICAgICAgICByLmhvdmVyRGF0YS5kcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzZWxlY3RbNF0pIHtcbiAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICB2YXIgZG93bldhc0dyYWJiZWQgPSBkb3duICYmIGRvd24uZ3JhYmJlZCgpO1xuICAgICAgICBmcmVlRHJhZ2dlZEVsZW1lbnRzKGRyYWdnZWRFbGVtZW50cyk7XG5cbiAgICAgICAgaWYgKGRvd25XYXNHcmFiYmVkKSB7XG4gICAgICAgICAgZG93bi5lbWl0KCdmcmVlb24nKTtcbiAgICAgICAgICBkcmFnZ2VkRWxlbWVudHMuZW1pdCgnZnJlZScpO1xuXG4gICAgICAgICAgaWYgKHIuZHJhZ0RhdGEuZGlkRHJhZykge1xuICAgICAgICAgICAgZG93bi5lbWl0KCdkcmFnZnJlZW9uJyk7XG4gICAgICAgICAgICBkcmFnZ2VkRWxlbWVudHMuZW1pdCgnZHJhZ2ZyZWUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIGVsc2Ugbm90IHJpZ2h0IG1vdXNlXG5cblxuICAgIHNlbGVjdFs0XSA9IDA7XG4gICAgci5ob3ZlckRhdGEuZG93biA9IG51bGw7XG4gICAgci5ob3ZlckRhdGEuY3h0U3RhcnRlZCA9IGZhbHNlO1xuICAgIHIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcyA9IGZhbHNlO1xuICAgIHIuaG92ZXJEYXRhLnNlbGVjdGluZyA9IGZhbHNlO1xuICAgIHIuaG92ZXJEYXRhLmlzT3ZlclRocmVzaG9sZERyYWcgPSBmYWxzZTtcbiAgICByLmRyYWdEYXRhLmRpZERyYWcgPSBmYWxzZTtcbiAgICByLmhvdmVyRGF0YS5kcmFnZ2VkID0gZmFsc2U7XG4gICAgci5ob3ZlckRhdGEuZHJhZ0RlbHRhID0gW107XG4gICAgci5ob3ZlckRhdGEubWRvd25Qb3MgPSBudWxsO1xuICAgIHIuaG92ZXJEYXRhLm1kb3duR1BvcyA9IG51bGw7XG4gIH0sIGZhbHNlKTtcblxuICB2YXIgd2hlZWxIYW5kbGVyID0gZnVuY3Rpb24gd2hlZWxIYW5kbGVyKGUpIHtcbiAgICBpZiAoci5zY3JvbGxpbmdQYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyB3aGlsZSBzY3JvbGxpbmcsIGlnbm9yZSB3aGVlbC10by16b29tXG5cblxuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgIHZhciBycG9zID0gW3Bvc1swXSAqIHpvb20gKyBwYW4ueCwgcG9zWzFdICogem9vbSArIHBhbi55XTtcblxuICAgIGlmIChyLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgfHwgci5ob3ZlckRhdGEuZHJhZ2dpbmcgfHwgci5ob3ZlckRhdGEuY3h0U3RhcnRlZCB8fCBpbkJveFNlbGVjdGlvbigpKSB7XG4gICAgICAvLyBpZiBwYW4gZHJhZ2dpbmcgb3IgY3h0IGRyYWdnaW5nLCB3aGVlbCBtb3ZlbWVudHMgbWFrZSBubyB6b29tXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGN5LnBhbm5pbmdFbmFibGVkKCkgJiYgY3kudXNlclBhbm5pbmdFbmFibGVkKCkgJiYgY3kuem9vbWluZ0VuYWJsZWQoKSAmJiBjeS51c2VyWm9vbWluZ0VuYWJsZWQoKSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgci5kYXRhLndoZWVsWm9vbWluZyA9IHRydWU7XG4gICAgICBjbGVhclRpbWVvdXQoci5kYXRhLndoZWVsVGltZW91dCk7XG4gICAgICByLmRhdGEud2hlZWxUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHIuZGF0YS53aGVlbFpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICB9LCAxNTApO1xuICAgICAgdmFyIGRpZmY7XG5cbiAgICAgIGlmIChlLmRlbHRhWSAhPSBudWxsKSB7XG4gICAgICAgIGRpZmYgPSBlLmRlbHRhWSAvIC0yNTA7XG4gICAgICB9IGVsc2UgaWYgKGUud2hlZWxEZWx0YVkgIT0gbnVsbCkge1xuICAgICAgICBkaWZmID0gZS53aGVlbERlbHRhWSAvIDEwMDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaWZmID0gZS53aGVlbERlbHRhIC8gMTAwMDtcbiAgICAgIH1cblxuICAgICAgZGlmZiA9IGRpZmYgKiByLndoZWVsU2Vuc2l0aXZpdHk7XG4gICAgICB2YXIgbmVlZHNXaGVlbEZpeCA9IGUuZGVsdGFNb2RlID09PSAxO1xuXG4gICAgICBpZiAobmVlZHNXaGVlbEZpeCkge1xuICAgICAgICAvLyBmaXhlcyBzbG93IHdoZWVsIGV2ZW50cyBvbiBmZi9saW51eCBhbmQgZmYvd2luZG93c1xuICAgICAgICBkaWZmICo9IDMzO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3Wm9vbSA9IGN5Lnpvb20oKSAqIE1hdGgucG93KDEwLCBkaWZmKTtcblxuICAgICAgaWYgKGUudHlwZSA9PT0gJ2dlc3R1cmVjaGFuZ2UnKSB7XG4gICAgICAgIG5ld1pvb20gPSByLmdlc3R1cmVTdGFydFpvb20gKiBlLnNjYWxlO1xuICAgICAgfVxuXG4gICAgICBjeS56b29tKHtcbiAgICAgICAgbGV2ZWw6IG5ld1pvb20sXG4gICAgICAgIHJlbmRlcmVkUG9zaXRpb246IHtcbiAgICAgICAgICB4OiBycG9zWzBdLFxuICAgICAgICAgIHk6IHJwb3NbMV1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjeS5lbWl0KGUudHlwZSA9PT0gJ2dlc3R1cmVjaGFuZ2UnID8gJ3BpbmNoem9vbScgOiAnc2Nyb2xsem9vbScpO1xuICAgIH1cbiAgfTsgLy8gRnVuY3Rpb25zIHRvIGhlbHAgd2l0aCB3aGV0aGVyIG1vdXNlIHdoZWVsIHNob3VsZCB0cmlnZ2VyIHpvb21pbmdcbiAgLy8gLS1cblxuXG4gIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnd2hlZWwnLCB3aGVlbEhhbmRsZXIsIHRydWUpOyAvLyBkaXNhYmxlIG5vbnN0YW5kYXJkIHdoZWVsIGV2ZW50c1xuICAvLyByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ21vdXNld2hlZWwnLCB3aGVlbEhhbmRsZXIsIHRydWUpO1xuICAvLyByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ0RPTU1vdXNlU2Nyb2xsJywgd2hlZWxIYW5kbGVyLCB0cnVlKTtcbiAgLy8gci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdNb3pNb3VzZVBpeGVsU2Nyb2xsJywgd2hlZWxIYW5kbGVyLCB0cnVlKTsgLy8gb2xkZXIgZmlyZWZveFxuXG4gIHIucmVnaXN0ZXJCaW5kaW5nKHdpbmRvdywgJ3Njcm9sbCcsIGZ1bmN0aW9uIHNjcm9sbEhhbmRsZXIoZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICByLnNjcm9sbGluZ1BhZ2UgPSB0cnVlO1xuICAgIGNsZWFyVGltZW91dChyLnNjcm9sbGluZ1BhZ2VUaW1lb3V0KTtcbiAgICByLnNjcm9sbGluZ1BhZ2VUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByLnNjcm9sbGluZ1BhZ2UgPSBmYWxzZTtcbiAgICB9LCAyNTApO1xuICB9LCB0cnVlKTsgLy8gZGVza3RvcCBzYWZhcmkgcGluY2ggdG8gem9vbSBzdGFydFxuXG4gIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnZ2VzdHVyZXN0YXJ0JywgZnVuY3Rpb24gZ2VzdHVyZVN0YXJ0SGFuZGxlcihlKSB7XG4gICAgci5nZXN0dXJlU3RhcnRab29tID0gci5jeS56b29tKCk7XG5cbiAgICBpZiAoIXIuaGFzVG91Y2hTdGFydGVkKSB7XG4gICAgICAvLyBkb24ndCBhZmZlY3QgdG91Y2ggZGV2aWNlcyBsaWtlIGlwaG9uZVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSwgdHJ1ZSk7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnZ2VzdHVyZWNoYW5nZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKCFyLmhhc1RvdWNoU3RhcnRlZCkge1xuICAgICAgLy8gZG9uJ3QgYWZmZWN0IHRvdWNoIGRldmljZXMgbGlrZSBpcGhvbmVcbiAgICAgIHdoZWVsSGFuZGxlcihlKTtcbiAgICB9XG4gIH0sIHRydWUpOyAvLyBGdW5jdGlvbnMgdG8gaGVscCB3aXRoIGhhbmRsaW5nIG1vdXNlb3V0L21vdXNlb3ZlciBvbiB0aGUgQ3l0b3NjYXBlIGNvbnRhaW5lclxuICAvLyBIYW5kbGUgbW91c2VvdXQgb24gQ3l0b3NjYXBlIGNvbnRhaW5lclxuXG4gIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnbW91c2VvdXQnLCBmdW5jdGlvbiBtb3VzZU91dEhhbmRsZXIoZSkge1xuICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgIHIuY3kuZW1pdCh7XG4gICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgdHlwZTogJ21vdXNlb3V0JyxcbiAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgeTogcG9zWzFdXG4gICAgICB9XG4gICAgfSk7XG4gIH0sIGZhbHNlKTtcbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdtb3VzZW92ZXInLCBmdW5jdGlvbiBtb3VzZU92ZXJIYW5kbGVyKGUpIHtcbiAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgICByLmN5LmVtaXQoe1xuICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgIHR5cGU6ICdtb3VzZW92ZXInLFxuICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICB5OiBwb3NbMV1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgZmFsc2UpO1xuICB2YXIgZjF4MSwgZjF5MSwgZjJ4MSwgZjJ5MTsgLy8gc3RhcnRpbmcgcG9pbnRzIGZvciBwaW5jaC10by16b29tXG5cbiAgdmFyIGRpc3RhbmNlMSwgZGlzdGFuY2UxU3E7IC8vIGluaXRpYWwgZGlzdGFuY2UgYmV0d2VlbiBmaW5nZXIgMSBhbmQgZmluZ2VyIDIgZm9yIHBpbmNoLXRvLXpvb21cblxuICB2YXIgY2VudGVyMSwgbW9kZWxDZW50ZXIxOyAvLyBjZW50ZXIgcG9pbnQgb24gc3RhcnQgcGluY2ggdG8gem9vbVxuXG4gIHZhciBvZmZzZXRMZWZ0LCBvZmZzZXRUb3A7XG4gIHZhciBjb250YWluZXJXaWR0aCwgY29udGFpbmVySGVpZ2h0O1xuICB2YXIgdHdvRmluZ2Vyc1N0YXJ0SW5zaWRlO1xuXG4gIHZhciBkaXN0YW5jZSA9IGZ1bmN0aW9uIGRpc3RhbmNlKHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydCgoeDIgLSB4MSkgKiAoeDIgLSB4MSkgKyAoeTIgLSB5MSkgKiAoeTIgLSB5MSkpO1xuICB9O1xuXG4gIHZhciBkaXN0YW5jZVNxID0gZnVuY3Rpb24gZGlzdGFuY2VTcSh4MSwgeTEsIHgyLCB5Mikge1xuICAgIHJldHVybiAoeDIgLSB4MSkgKiAoeDIgLSB4MSkgKyAoeTIgLSB5MSkgKiAoeTIgLSB5MSk7XG4gIH07XG5cbiAgdmFyIHRvdWNoc3RhcnRIYW5kbGVyO1xuICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ3RvdWNoc3RhcnQnLCB0b3VjaHN0YXJ0SGFuZGxlciA9IGZ1bmN0aW9uIHRvdWNoc3RhcnRIYW5kbGVyKGUpIHtcbiAgICByLmhhc1RvdWNoU3RhcnRlZCA9IHRydWU7XG5cbiAgICBpZiAoIWV2ZW50SW5Db250YWluZXIoZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBibHVyQWN0aXZlRG9tRWxlbWVudCgpO1xuICAgIHIudG91Y2hEYXRhLmNhcHR1cmUgPSB0cnVlO1xuICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB2YXIgY3kgPSByLmN5O1xuICAgIHZhciBub3cgPSByLnRvdWNoRGF0YS5ub3c7XG4gICAgdmFyIGVhcmxpZXIgPSByLnRvdWNoRGF0YS5lYXJsaWVyO1xuXG4gICAgaWYgKGUudG91Y2hlc1swXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMF0uY2xpZW50WCwgZS50b3VjaGVzWzBdLmNsaWVudFkpO1xuICAgICAgbm93WzBdID0gcG9zWzBdO1xuICAgICAgbm93WzFdID0gcG9zWzFdO1xuICAgIH1cblxuICAgIGlmIChlLnRvdWNoZXNbMV0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzFdLmNsaWVudFgsIGUudG91Y2hlc1sxXS5jbGllbnRZKTtcbiAgICAgIG5vd1syXSA9IHBvc1swXTtcbiAgICAgIG5vd1szXSA9IHBvc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoZS50b3VjaGVzWzJdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1syXS5jbGllbnRYLCBlLnRvdWNoZXNbMl0uY2xpZW50WSk7XG4gICAgICBub3dbNF0gPSBwb3NbMF07XG4gICAgICBub3dbNV0gPSBwb3NbMV07XG4gICAgfSAvLyByZWNvcmQgc3RhcnRpbmcgcG9pbnRzIGZvciBwaW5jaC10by16b29tXG5cblxuICAgIGlmIChlLnRvdWNoZXNbMV0pIHtcbiAgICAgIHIudG91Y2hEYXRhLnNpbmdsZVRvdWNoTW92ZWQgPSB0cnVlO1xuICAgICAgZnJlZURyYWdnZWRFbGVtZW50cyhyLmRyYWdEYXRhLnRvdWNoRHJhZ0VsZXMpO1xuICAgICAgdmFyIG9mZnNldHMgPSByLmZpbmRDb250YWluZXJDbGllbnRDb29yZHMoKTtcbiAgICAgIG9mZnNldExlZnQgPSBvZmZzZXRzWzBdO1xuICAgICAgb2Zmc2V0VG9wID0gb2Zmc2V0c1sxXTtcbiAgICAgIGNvbnRhaW5lcldpZHRoID0gb2Zmc2V0c1syXTtcbiAgICAgIGNvbnRhaW5lckhlaWdodCA9IG9mZnNldHNbM107XG4gICAgICBmMXgxID0gZS50b3VjaGVzWzBdLmNsaWVudFggLSBvZmZzZXRMZWZ0O1xuICAgICAgZjF5MSA9IGUudG91Y2hlc1swXS5jbGllbnRZIC0gb2Zmc2V0VG9wO1xuICAgICAgZjJ4MSA9IGUudG91Y2hlc1sxXS5jbGllbnRYIC0gb2Zmc2V0TGVmdDtcbiAgICAgIGYyeTEgPSBlLnRvdWNoZXNbMV0uY2xpZW50WSAtIG9mZnNldFRvcDtcbiAgICAgIHR3b0ZpbmdlcnNTdGFydEluc2lkZSA9IDAgPD0gZjF4MSAmJiBmMXgxIDw9IGNvbnRhaW5lcldpZHRoICYmIDAgPD0gZjJ4MSAmJiBmMngxIDw9IGNvbnRhaW5lcldpZHRoICYmIDAgPD0gZjF5MSAmJiBmMXkxIDw9IGNvbnRhaW5lckhlaWdodCAmJiAwIDw9IGYyeTEgJiYgZjJ5MSA8PSBjb250YWluZXJIZWlnaHQ7XG4gICAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICAgIGRpc3RhbmNlMSA9IGRpc3RhbmNlKGYxeDEsIGYxeTEsIGYyeDEsIGYyeTEpO1xuICAgICAgZGlzdGFuY2UxU3EgPSBkaXN0YW5jZVNxKGYxeDEsIGYxeTEsIGYyeDEsIGYyeTEpO1xuICAgICAgY2VudGVyMSA9IFsoZjF4MSArIGYyeDEpIC8gMiwgKGYxeTEgKyBmMnkxKSAvIDJdO1xuICAgICAgbW9kZWxDZW50ZXIxID0gWyhjZW50ZXIxWzBdIC0gcGFuLngpIC8gem9vbSwgKGNlbnRlcjFbMV0gLSBwYW4ueSkgLyB6b29tXTsgLy8gY29uc2lkZXIgY29udGV4dCB0YXBcblxuICAgICAgdmFyIGN4dERpc3RUaHJlc2hvbGQgPSAyMDA7XG4gICAgICB2YXIgY3h0RGlzdFRocmVzaG9sZFNxID0gY3h0RGlzdFRocmVzaG9sZCAqIGN4dERpc3RUaHJlc2hvbGQ7XG5cbiAgICAgIGlmIChkaXN0YW5jZTFTcSA8IGN4dERpc3RUaHJlc2hvbGRTcSAmJiAhZS50b3VjaGVzWzJdKSB7XG4gICAgICAgIHZhciBuZWFyMSA9IHIuZmluZE5lYXJlc3RFbGVtZW50KG5vd1swXSwgbm93WzFdLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdmFyIG5lYXIyID0gci5maW5kTmVhcmVzdEVsZW1lbnQobm93WzJdLCBub3dbM10sIHRydWUsIHRydWUpO1xuXG4gICAgICAgIGlmIChuZWFyMSAmJiBuZWFyMS5pc05vZGUoKSkge1xuICAgICAgICAgIG5lYXIxLmFjdGl2YXRlKCkuZW1pdCh7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgdHlwZTogJ2N4dHRhcHN0YXJ0JyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgci50b3VjaERhdGEuc3RhcnQgPSBuZWFyMTtcbiAgICAgICAgfSBlbHNlIGlmIChuZWFyMiAmJiBuZWFyMi5pc05vZGUoKSkge1xuICAgICAgICAgIG5lYXIyLmFjdGl2YXRlKCkuZW1pdCh7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgdHlwZTogJ2N4dHRhcHN0YXJ0JyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgci50b3VjaERhdGEuc3RhcnQgPSBuZWFyMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjeS5lbWl0KHtcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICB0eXBlOiAnY3h0dGFwc3RhcnQnLFxuICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyLnRvdWNoRGF0YS5zdGFydCkge1xuICAgICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0Ll9wcml2YXRlLmdyYWJiZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHIudG91Y2hEYXRhLmN4dCA9IHRydWU7XG4gICAgICAgIHIudG91Y2hEYXRhLmN4dERyYWdnZWQgPSBmYWxzZTtcbiAgICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICByLnJlZHJhdygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGUudG91Y2hlc1syXSkge1xuICAgICAgLy8gaWdub3JlXG4gICAgICAvLyBzYWZhcmkgb24gaW9zIHBhbnMgdGhlIHBhZ2Ugb3RoZXJ3aXNlIChub3JtYWxseSB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gcHJldmVudGRlZmF1bHQgb24gdG91Y2htb3ZlLi4uKVxuICAgICAgaWYgKGN5LmJveFNlbGVjdGlvbkVuYWJsZWQoKSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlLnRvdWNoZXNbMV0pIDsgZWxzZSBpZiAoZS50b3VjaGVzWzBdKSB7XG4gICAgICB2YXIgbmVhcnMgPSByLmZpbmROZWFyZXN0RWxlbWVudHMobm93WzBdLCBub3dbMV0sIHRydWUsIHRydWUpO1xuICAgICAgdmFyIG5lYXIgPSBuZWFyc1swXTtcblxuICAgICAgaWYgKG5lYXIgIT0gbnVsbCkge1xuICAgICAgICBuZWFyLmFjdGl2YXRlKCk7XG4gICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0ID0gbmVhcjtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnRzID0gbmVhcnM7XG5cbiAgICAgICAgaWYgKHIubm9kZUlzR3JhYmJhYmxlKG5lYXIpKSB7XG4gICAgICAgICAgdmFyIGRyYWdnZWRFbGVzID0gci5kcmFnRGF0YS50b3VjaERyYWdFbGVzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICAgIHZhciBzZWxlY3RlZE5vZGVzID0gbnVsbDtcbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcblxuICAgICAgICAgIGlmIChuZWFyLnNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIC8vIHJlc2V0IGRyYWcgZWxlbWVudHMsIHNpbmNlIG5lYXIgd2lsbCBiZSBhZGRlZCBhZ2FpblxuICAgICAgICAgICAgc2VsZWN0ZWROb2RlcyA9IGN5LiQoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlLnNlbGVjdGVkKCkgJiYgci5ub2RlSXNHcmFiYmFibGUoZWxlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYWRkTm9kZXNUb0RyYWcoc2VsZWN0ZWROb2Rlcywge1xuICAgICAgICAgICAgICBhZGRUb0xpc3Q6IGRyYWdnZWRFbGVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWRkTm9kZVRvRHJhZyhuZWFyLCB7XG4gICAgICAgICAgICAgIGFkZFRvTGlzdDogZHJhZ2dlZEVsZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNldEdyYWJUYXJnZXQobmVhcik7XG5cbiAgICAgICAgICB2YXIgbWFrZUV2ZW50ID0gZnVuY3Rpb24gbWFrZUV2ZW50KHR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBuZWFyLmVtaXQobWFrZUV2ZW50KCdncmFib24nKSk7XG5cbiAgICAgICAgICBpZiAoc2VsZWN0ZWROb2Rlcykge1xuICAgICAgICAgICAgc2VsZWN0ZWROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICAgIG4uZW1pdChtYWtlRXZlbnQoJ2dyYWInKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmVhci5lbWl0KG1ha2VFdmVudCgnZ3JhYicpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdHJpZ2dlckV2ZW50cyhuZWFyLCBbJ3RvdWNoc3RhcnQnLCAndGFwc3RhcnQnLCAndm1vdXNlZG93biddLCBlLCB7XG4gICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgeTogbm93WzFdXG4gICAgICB9KTtcblxuICAgICAgaWYgKG5lYXIgPT0gbnVsbCkge1xuICAgICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB7XG4gICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICB9O1xuICAgICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgICByLnJlZHJhdygpO1xuICAgICAgfSAvLyBUYXAsIHRhcGhvbGRcbiAgICAgIC8vIC0tLS0tXG5cblxuICAgICAgci50b3VjaERhdGEuc2luZ2xlVG91Y2hNb3ZlZCA9IGZhbHNlO1xuICAgICAgci50b3VjaERhdGEuc2luZ2xlVG91Y2hTdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICAgIGNsZWFyVGltZW91dChyLnRvdWNoRGF0YS50YXBob2xkVGltZW91dCk7XG4gICAgICByLnRvdWNoRGF0YS50YXBob2xkVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoci50b3VjaERhdGEuc2luZ2xlVG91Y2hNb3ZlZCA9PT0gZmFsc2UgJiYgIXIucGluY2hpbmcgLy8gaWYgcGluY2hpbmcsIHRoZW4gdGFwaG9sZCB1bnNlbGVjdCBzaG91bGRuJ3QgdGFrZSBlZmZlY3RcbiAgICAgICAgJiYgIXIudG91Y2hEYXRhLnNlbGVjdGluZyAvLyBib3ggc2VsZWN0aW9uIHNob3VsZG4ndCBhbGxvdyB0YXBob2xkIHRocm91Z2hcbiAgICAgICAgKSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50cyhyLnRvdWNoRGF0YS5zdGFydCwgWyd0YXBob2xkJ10sIGUsIHtcbiAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCByLnRhcGhvbGREdXJhdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPj0gMSkge1xuICAgICAgdmFyIHNQb3MgPSByLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uID0gW107XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNQb3NbaV0gPSBlYXJsaWVyW2ldID0gbm93W2ldO1xuICAgICAgfVxuXG4gICAgICB2YXIgdG91Y2gwID0gZS50b3VjaGVzWzBdO1xuICAgICAgci50b3VjaERhdGEuc3RhcnRHUG9zaXRpb24gPSBbdG91Y2gwLmNsaWVudFgsIHRvdWNoMC5jbGllbnRZXTtcbiAgICB9XG4gIH0sIGZhbHNlKTtcbiAgdmFyIHRvdWNobW92ZUhhbmRsZXI7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKHdpbmRvdywgJ3RvdWNobW92ZScsIHRvdWNobW92ZUhhbmRsZXIgPSBmdW5jdGlvbiB0b3VjaG1vdmVIYW5kbGVyKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgdmFyIGNhcHR1cmUgPSByLnRvdWNoRGF0YS5jYXB0dXJlO1xuXG4gICAgaWYgKCFjYXB0dXJlICYmICFldmVudEluQ29udGFpbmVyKGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNlbGVjdCA9IHIuc2VsZWN0aW9uO1xuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIG5vdyA9IHIudG91Y2hEYXRhLm5vdztcbiAgICB2YXIgZWFybGllciA9IHIudG91Y2hEYXRhLmVhcmxpZXI7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG5cbiAgICBpZiAoZS50b3VjaGVzWzBdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WSk7XG4gICAgICBub3dbMF0gPSBwb3NbMF07XG4gICAgICBub3dbMV0gPSBwb3NbMV07XG4gICAgfVxuXG4gICAgaWYgKGUudG91Y2hlc1sxXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMV0uY2xpZW50WCwgZS50b3VjaGVzWzFdLmNsaWVudFkpO1xuICAgICAgbm93WzJdID0gcG9zWzBdO1xuICAgICAgbm93WzNdID0gcG9zWzFdO1xuICAgIH1cblxuICAgIGlmIChlLnRvdWNoZXNbMl0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzJdLmNsaWVudFgsIGUudG91Y2hlc1syXS5jbGllbnRZKTtcbiAgICAgIG5vd1s0XSA9IHBvc1swXTtcbiAgICAgIG5vd1s1XSA9IHBvc1sxXTtcbiAgICB9XG5cbiAgICB2YXIgc3RhcnRHUG9zID0gci50b3VjaERhdGEuc3RhcnRHUG9zaXRpb247XG4gICAgdmFyIGlzT3ZlclRocmVzaG9sZERyYWc7XG5cbiAgICBpZiAoY2FwdHVyZSAmJiBlLnRvdWNoZXNbMF0gJiYgc3RhcnRHUG9zKSB7XG4gICAgICB2YXIgZGlzcCA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5vdy5sZW5ndGg7IGorKykge1xuICAgICAgICBkaXNwW2pdID0gbm93W2pdIC0gZWFybGllcltqXTtcbiAgICAgIH1cblxuICAgICAgdmFyIGR4ID0gZS50b3VjaGVzWzBdLmNsaWVudFggLSBzdGFydEdQb3NbMF07XG4gICAgICB2YXIgZHgyID0gZHggKiBkeDtcbiAgICAgIHZhciBkeSA9IGUudG91Y2hlc1swXS5jbGllbnRZIC0gc3RhcnRHUG9zWzFdO1xuICAgICAgdmFyIGR5MiA9IGR5ICogZHk7XG4gICAgICB2YXIgZGlzdDIgPSBkeDIgKyBkeTI7XG4gICAgICBpc092ZXJUaHJlc2hvbGREcmFnID0gZGlzdDIgPj0gci50b3VjaFRhcFRocmVzaG9sZDI7XG4gICAgfSAvLyBjb250ZXh0IHN3aXBlIGNhbmNlbGxpbmdcblxuXG4gICAgaWYgKGNhcHR1cmUgJiYgci50b3VjaERhdGEuY3h0KSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB2YXIgZjF4MiA9IGUudG91Y2hlc1swXS5jbGllbnRYIC0gb2Zmc2V0TGVmdCxcbiAgICAgICAgICBmMXkyID0gZS50b3VjaGVzWzBdLmNsaWVudFkgLSBvZmZzZXRUb3A7XG4gICAgICB2YXIgZjJ4MiA9IGUudG91Y2hlc1sxXS5jbGllbnRYIC0gb2Zmc2V0TGVmdCxcbiAgICAgICAgICBmMnkyID0gZS50b3VjaGVzWzFdLmNsaWVudFkgLSBvZmZzZXRUb3A7IC8vIHZhciBkaXN0YW5jZTIgPSBkaXN0YW5jZSggZjF4MiwgZjF5MiwgZjJ4MiwgZjJ5MiApO1xuXG4gICAgICB2YXIgZGlzdGFuY2UyU3EgPSBkaXN0YW5jZVNxKGYxeDIsIGYxeTIsIGYyeDIsIGYyeTIpO1xuICAgICAgdmFyIGZhY3RvclNxID0gZGlzdGFuY2UyU3EgLyBkaXN0YW5jZTFTcTtcbiAgICAgIHZhciBkaXN0VGhyZXNob2xkID0gMTUwO1xuICAgICAgdmFyIGRpc3RUaHJlc2hvbGRTcSA9IGRpc3RUaHJlc2hvbGQgKiBkaXN0VGhyZXNob2xkO1xuICAgICAgdmFyIGZhY3RvclRocmVzaG9sZCA9IDEuNTtcbiAgICAgIHZhciBmYWN0b3JUaHJlc2hvbGRTcSA9IGZhY3RvclRocmVzaG9sZCAqIGZhY3RvclRocmVzaG9sZDsgLy8gY2FuY2VsIGN0eCBnZXN0dXJlcyBpZiB0aGUgZGlzdGFuY2UgYi90IHRoZSBmaW5nZXJzIGluY3JlYXNlc1xuXG4gICAgICBpZiAoZmFjdG9yU3EgPj0gZmFjdG9yVGhyZXNob2xkU3EgfHwgZGlzdGFuY2UyU3EgPj0gZGlzdFRocmVzaG9sZFNxKSB7XG4gICAgICAgIHIudG91Y2hEYXRhLmN4dCA9IGZhbHNlO1xuICAgICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgIHZhciBjeHRFdnQgPSB7XG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICB0eXBlOiAnY3h0dGFwZW5kJyxcbiAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChyLnRvdWNoRGF0YS5zdGFydCkge1xuICAgICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0LnVuYWN0aXZhdGUoKS5lbWl0KGN4dEV2dCk7XG4gICAgICAgICAgci50b3VjaERhdGEuc3RhcnQgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN5LmVtaXQoY3h0RXZ0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gY29udGV4dCBzd2lwZVxuXG5cbiAgICBpZiAoY2FwdHVyZSAmJiByLnRvdWNoRGF0YS5jeHQpIHtcbiAgICAgIHZhciBjeHRFdnQgPSB7XG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHR5cGU6ICdjeHRkcmFnJyxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgeTogbm93WzFdXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuXG4gICAgICBpZiAoci50b3VjaERhdGEuc3RhcnQpIHtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQuZW1pdChjeHRFdnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3kuZW1pdChjeHRFdnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoci50b3VjaERhdGEuc3RhcnQpIHtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQuX3ByaXZhdGUuZ3JhYmJlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByLnRvdWNoRGF0YS5jeHREcmFnZ2VkID0gdHJ1ZTtcbiAgICAgIHZhciBuZWFyID0gci5maW5kTmVhcmVzdEVsZW1lbnQobm93WzBdLCBub3dbMV0sIHRydWUsIHRydWUpO1xuXG4gICAgICBpZiAoIXIudG91Y2hEYXRhLmN4dE92ZXIgfHwgbmVhciAhPT0gci50b3VjaERhdGEuY3h0T3Zlcikge1xuICAgICAgICBpZiAoci50b3VjaERhdGEuY3h0T3Zlcikge1xuICAgICAgICAgIHIudG91Y2hEYXRhLmN4dE92ZXIuZW1pdCh7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgdHlwZTogJ2N4dGRyYWdvdXQnLFxuICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHIudG91Y2hEYXRhLmN4dE92ZXIgPSBuZWFyO1xuXG4gICAgICAgIGlmIChuZWFyKSB7XG4gICAgICAgICAgbmVhci5lbWl0KHtcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICB0eXBlOiAnY3h0ZHJhZ292ZXInLFxuICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBib3ggc2VsZWN0aW9uXG5cbiAgICB9IGVsc2UgaWYgKGNhcHR1cmUgJiYgZS50b3VjaGVzWzJdICYmIGN5LmJveFNlbGVjdGlvbkVuYWJsZWQoKSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5sYXN0VGhyZWVUb3VjaCA9ICtuZXcgRGF0ZSgpO1xuXG4gICAgICBpZiAoIXIudG91Y2hEYXRhLnNlbGVjdGluZykge1xuICAgICAgICBjeS5lbWl0KHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgIHR5cGU6ICdib3hzdGFydCcsXG4gICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHIudG91Y2hEYXRhLnNlbGVjdGluZyA9IHRydWU7XG4gICAgICByLnRvdWNoRGF0YS5kaWRTZWxlY3QgPSB0cnVlO1xuICAgICAgc2VsZWN0WzRdID0gMTtcblxuICAgICAgaWYgKCFzZWxlY3QgfHwgc2VsZWN0Lmxlbmd0aCA9PT0gMCB8fCBzZWxlY3RbMF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzZWxlY3RbMF0gPSAobm93WzBdICsgbm93WzJdICsgbm93WzRdKSAvIDM7XG4gICAgICAgIHNlbGVjdFsxXSA9IChub3dbMV0gKyBub3dbM10gKyBub3dbNV0pIC8gMztcbiAgICAgICAgc2VsZWN0WzJdID0gKG5vd1swXSArIG5vd1syXSArIG5vd1s0XSkgLyAzICsgMTtcbiAgICAgICAgc2VsZWN0WzNdID0gKG5vd1sxXSArIG5vd1szXSArIG5vd1s1XSkgLyAzICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGVjdFsyXSA9IChub3dbMF0gKyBub3dbMl0gKyBub3dbNF0pIC8gMztcbiAgICAgICAgc2VsZWN0WzNdID0gKG5vd1sxXSArIG5vd1szXSArIG5vd1s1XSkgLyAzO1xuICAgICAgfVxuXG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTsgLy8gcGluY2ggdG8gem9vbVxuICAgIH0gZWxzZSBpZiAoY2FwdHVyZSAmJiBlLnRvdWNoZXNbMV0gJiYgIXIudG91Y2hEYXRhLmRpZFNlbGVjdCAvLyBkb24ndCBhbGxvdyBib3ggc2VsZWN0aW9uIHRvIGRlZ3JhZGUgdG8gcGluY2gtdG8tem9vbVxuICAgICYmIGN5Lnpvb21pbmdFbmFibGVkKCkgJiYgY3kucGFubmluZ0VuYWJsZWQoKSAmJiBjeS51c2VyWm9vbWluZ0VuYWJsZWQoKSAmJiBjeS51c2VyUGFubmluZ0VuYWJsZWQoKSkge1xuICAgICAgLy8gdHdvIGZpbmdlcnMgPT4gcGluY2ggdG8gem9vbVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIHZhciBkcmFnZ2VkRWxlcyA9IHIuZHJhZ0RhdGEudG91Y2hEcmFnRWxlcztcblxuICAgICAgaWYgKGRyYWdnZWRFbGVzKSB7XG4gICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHJhZ2dlZEVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZGVfcCA9IGRyYWdnZWRFbGVzW2ldLl9wcml2YXRlO1xuICAgICAgICAgIGRlX3AuZ3JhYmJlZCA9IGZhbHNlO1xuICAgICAgICAgIGRlX3AucnNjcmF0Y2guaW5EcmFnTGF5ZXIgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgX3N0YXJ0ID0gci50b3VjaERhdGEuc3RhcnQ7IC8vICh4MiwgeTIpIGZvciBmaW5nZXJzIDEgYW5kIDJcblxuICAgICAgdmFyIGYxeDIgPSBlLnRvdWNoZXNbMF0uY2xpZW50WCAtIG9mZnNldExlZnQsXG4gICAgICAgICAgZjF5MiA9IGUudG91Y2hlc1swXS5jbGllbnRZIC0gb2Zmc2V0VG9wO1xuICAgICAgdmFyIGYyeDIgPSBlLnRvdWNoZXNbMV0uY2xpZW50WCAtIG9mZnNldExlZnQsXG4gICAgICAgICAgZjJ5MiA9IGUudG91Y2hlc1sxXS5jbGllbnRZIC0gb2Zmc2V0VG9wO1xuICAgICAgdmFyIGRpc3RhbmNlMiA9IGRpc3RhbmNlKGYxeDIsIGYxeTIsIGYyeDIsIGYyeTIpOyAvLyB2YXIgZGlzdGFuY2UyU3EgPSBkaXN0YW5jZVNxKCBmMXgyLCBmMXkyLCBmMngyLCBmMnkyICk7XG4gICAgICAvLyB2YXIgZmFjdG9yID0gTWF0aC5zcXJ0KCBkaXN0YW5jZTJTcSApIC8gTWF0aC5zcXJ0KCBkaXN0YW5jZTFTcSApO1xuXG4gICAgICB2YXIgZmFjdG9yID0gZGlzdGFuY2UyIC8gZGlzdGFuY2UxO1xuXG4gICAgICBpZiAodHdvRmluZ2Vyc1N0YXJ0SW5zaWRlKSB7XG4gICAgICAgIC8vIGRlbHRhIGZpbmdlcjFcbiAgICAgICAgdmFyIGRmMXggPSBmMXgyIC0gZjF4MTtcbiAgICAgICAgdmFyIGRmMXkgPSBmMXkyIC0gZjF5MTsgLy8gZGVsdGEgZmluZ2VyIDJcblxuICAgICAgICB2YXIgZGYyeCA9IGYyeDIgLSBmMngxO1xuICAgICAgICB2YXIgZGYyeSA9IGYyeTIgLSBmMnkxOyAvLyB0cmFuc2xhdGlvbiBpcyB0aGUgbm9ybWFsaXNlZCB2ZWN0b3Igb2YgdGhlIHR3byBmaW5nZXJzIG1vdmVtZW50XG4gICAgICAgIC8vIGkuZS4gc28gcGluY2hpbmcgY2FuY2VscyBvdXQgYW5kIG1vdmluZyB0b2dldGhlciBwYW5zXG5cbiAgICAgICAgdmFyIHR4ID0gKGRmMXggKyBkZjJ4KSAvIDI7XG4gICAgICAgIHZhciB0eSA9IChkZjF5ICsgZGYyeSkgLyAyOyAvLyBub3cgY2FsY3VsYXRlIHRoZSB6b29tXG5cbiAgICAgICAgdmFyIHpvb20xID0gY3kuem9vbSgpO1xuICAgICAgICB2YXIgem9vbTIgPSB6b29tMSAqIGZhY3RvcjtcbiAgICAgICAgdmFyIHBhbjEgPSBjeS5wYW4oKTsgLy8gdGhlIG1vZGVsIGNlbnRlciBwb2ludCBjb252ZXJ0ZWQgdG8gdGhlIGN1cnJlbnQgcmVuZGVyZWQgcG9zXG5cbiAgICAgICAgdmFyIGN0cnggPSBtb2RlbENlbnRlcjFbMF0gKiB6b29tMSArIHBhbjEueDtcbiAgICAgICAgdmFyIGN0cnkgPSBtb2RlbENlbnRlcjFbMV0gKiB6b29tMSArIHBhbjEueTtcbiAgICAgICAgdmFyIHBhbjIgPSB7XG4gICAgICAgICAgeDogLXpvb20yIC8gem9vbTEgKiAoY3RyeCAtIHBhbjEueCAtIHR4KSArIGN0cngsXG4gICAgICAgICAgeTogLXpvb20yIC8gem9vbTEgKiAoY3RyeSAtIHBhbjEueSAtIHR5KSArIGN0cnlcbiAgICAgICAgfTsgLy8gcmVtb3ZlIGRyYWdnZWQgZWxlc1xuXG4gICAgICAgIGlmIChfc3RhcnQgJiYgX3N0YXJ0LmFjdGl2ZSgpKSB7XG4gICAgICAgICAgdmFyIGRyYWdnZWRFbGVzID0gci5kcmFnRGF0YS50b3VjaERyYWdFbGVzO1xuICAgICAgICAgIGZyZWVEcmFnZ2VkRWxlbWVudHMoZHJhZ2dlZEVsZXMpO1xuICAgICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuXG4gICAgICAgICAgX3N0YXJ0LnVuYWN0aXZhdGUoKS5lbWl0KCdmcmVlb24nKTtcblxuICAgICAgICAgIGRyYWdnZWRFbGVzLmVtaXQoJ2ZyZWUnKTtcblxuICAgICAgICAgIGlmIChyLmRyYWdEYXRhLmRpZERyYWcpIHtcbiAgICAgICAgICAgIF9zdGFydC5lbWl0KCdkcmFnZnJlZW9uJyk7XG5cbiAgICAgICAgICAgIGRyYWdnZWRFbGVzLmVtaXQoJ2RyYWdmcmVlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3kudmlld3BvcnQoe1xuICAgICAgICAgIHpvb206IHpvb20yLFxuICAgICAgICAgIHBhbjogcGFuMixcbiAgICAgICAgICBjYW5jZWxPbkZhaWxlZFpvb206IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGN5LmVtaXQoJ3BpbmNoem9vbScpO1xuICAgICAgICBkaXN0YW5jZTEgPSBkaXN0YW5jZTI7XG4gICAgICAgIGYxeDEgPSBmMXgyO1xuICAgICAgICBmMXkxID0gZjF5MjtcbiAgICAgICAgZjJ4MSA9IGYyeDI7XG4gICAgICAgIGYyeTEgPSBmMnkyO1xuICAgICAgICByLnBpbmNoaW5nID0gdHJ1ZTtcbiAgICAgIH0gLy8gUmUtcHJvamVjdFxuXG5cbiAgICAgIGlmIChlLnRvdWNoZXNbMF0pIHtcbiAgICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMF0uY2xpZW50WCwgZS50b3VjaGVzWzBdLmNsaWVudFkpO1xuICAgICAgICBub3dbMF0gPSBwb3NbMF07XG4gICAgICAgIG5vd1sxXSA9IHBvc1sxXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGUudG91Y2hlc1sxXSkge1xuICAgICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1sxXS5jbGllbnRYLCBlLnRvdWNoZXNbMV0uY2xpZW50WSk7XG4gICAgICAgIG5vd1syXSA9IHBvc1swXTtcbiAgICAgICAgbm93WzNdID0gcG9zWzFdO1xuICAgICAgfVxuXG4gICAgICBpZiAoZS50b3VjaGVzWzJdKSB7XG4gICAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzJdLmNsaWVudFgsIGUudG91Y2hlc1syXS5jbGllbnRZKTtcbiAgICAgICAgbm93WzRdID0gcG9zWzBdO1xuICAgICAgICBub3dbNV0gPSBwb3NbMV07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlLnRvdWNoZXNbMF0gJiYgIXIudG91Y2hEYXRhLmRpZFNlbGVjdCAvLyBkb24ndCBhbGxvdyBib3ggc2VsZWN0aW9uIHRvIGRlZ3JhZGUgdG8gc2luZ2xlIGZpbmdlciBldmVudHMgbGlrZSBwYW5uaW5nXG4gICAgKSB7XG4gICAgICB2YXIgc3RhcnQgPSByLnRvdWNoRGF0YS5zdGFydDtcbiAgICAgIHZhciBsYXN0ID0gci50b3VjaERhdGEubGFzdDtcbiAgICAgIHZhciBuZWFyO1xuXG4gICAgICBpZiAoIXIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcyAmJiAhci5zd2lwZVBhbm5pbmcpIHtcbiAgICAgICAgbmVhciA9IHIuZmluZE5lYXJlc3RFbGVtZW50KG5vd1swXSwgbm93WzFdLCB0cnVlLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhcHR1cmUgJiYgc3RhcnQgIT0gbnVsbCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9IC8vIGRyYWdnaW5nIG5vZGVzXG5cblxuICAgICAgaWYgKGNhcHR1cmUgJiYgc3RhcnQgIT0gbnVsbCAmJiByLm5vZGVJc0RyYWdnYWJsZShzdGFydCkpIHtcbiAgICAgICAgaWYgKGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgICAgICAvLyB0aGVuIGRyYWdnaW5nIGNhbiBoYXBwZW5cbiAgICAgICAgICB2YXIgZHJhZ2dlZEVsZXMgPSByLmRyYWdEYXRhLnRvdWNoRHJhZ0VsZXM7XG4gICAgICAgICAgdmFyIGp1c3RTdGFydGVkRHJhZyA9ICFyLmRyYWdEYXRhLmRpZERyYWc7XG5cbiAgICAgICAgICBpZiAoanVzdFN0YXJ0ZWREcmFnKSB7XG4gICAgICAgICAgICBhZGROb2Rlc1RvRHJhZyhkcmFnZ2VkRWxlcywge1xuICAgICAgICAgICAgICBpbkRyYWdMYXllcjogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5kcmFnRGF0YS5kaWREcmFnID0gdHJ1ZTtcbiAgICAgICAgICB2YXIgdG90YWxTaGlmdCA9IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChudW1iZXIkMShkaXNwWzBdKSAmJiBudW1iZXIkMShkaXNwWzFdKSkge1xuICAgICAgICAgICAgdG90YWxTaGlmdC54ICs9IGRpc3BbMF07XG4gICAgICAgICAgICB0b3RhbFNoaWZ0LnkgKz0gZGlzcFsxXTtcblxuICAgICAgICAgICAgaWYgKGp1c3RTdGFydGVkRHJhZykge1xuICAgICAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgICAgICAgdmFyIGRyYWdEZWx0YSA9IHIudG91Y2hEYXRhLmRyYWdEZWx0YTtcblxuICAgICAgICAgICAgICBpZiAoZHJhZ0RlbHRhICYmIG51bWJlciQxKGRyYWdEZWx0YVswXSkgJiYgbnVtYmVyJDEoZHJhZ0RlbHRhWzFdKSkge1xuICAgICAgICAgICAgICAgIHRvdGFsU2hpZnQueCArPSBkcmFnRGVsdGFbMF07XG4gICAgICAgICAgICAgICAgdG90YWxTaGlmdC55ICs9IGRyYWdEZWx0YVsxXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcyA9IHRydWU7XG4gICAgICAgICAgZHJhZ2dlZEVsZXMuc2lsZW50U2hpZnQodG90YWxTaGlmdCkuZW1pdCgncG9zaXRpb24gZHJhZycpO1xuICAgICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuXG4gICAgICAgICAgaWYgKHIudG91Y2hEYXRhLnN0YXJ0UG9zaXRpb25bMF0gPT0gZWFybGllclswXSAmJiByLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uWzFdID09IGVhcmxpZXJbMV0pIHtcbiAgICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHIucmVkcmF3KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gb3RoZXJ3aXNlIGtlZXAgdHJhY2sgb2YgZHJhZyBkZWx0YSBmb3IgbGF0ZXJcbiAgICAgICAgICB2YXIgZHJhZ0RlbHRhID0gci50b3VjaERhdGEuZHJhZ0RlbHRhID0gci50b3VjaERhdGEuZHJhZ0RlbHRhIHx8IFtdO1xuXG4gICAgICAgICAgaWYgKGRyYWdEZWx0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGRyYWdEZWx0YS5wdXNoKGRpc3BbMF0pO1xuICAgICAgICAgICAgZHJhZ0RlbHRhLnB1c2goZGlzcFsxXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRyYWdEZWx0YVswXSArPSBkaXNwWzBdO1xuICAgICAgICAgICAgZHJhZ0RlbHRhWzFdICs9IGRpc3BbMV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vIHRvdWNobW92ZVxuXG5cbiAgICAgIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50cyhzdGFydCB8fCBuZWFyLCBbJ3RvdWNobW92ZScsICd0YXBkcmFnJywgJ3Ztb3VzZW1vdmUnXSwgZSwge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCghc3RhcnQgfHwgIXN0YXJ0LmdyYWJiZWQoKSkgJiYgbmVhciAhPSBsYXN0KSB7XG4gICAgICAgICAgaWYgKGxhc3QpIHtcbiAgICAgICAgICAgIGxhc3QuZW1pdCh7XG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICAgIHR5cGU6ICd0YXBkcmFnb3V0JyxcbiAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChuZWFyKSB7XG4gICAgICAgICAgICBuZWFyLmVtaXQoe1xuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgICB0eXBlOiAndGFwZHJhZ292ZXInLFxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgci50b3VjaERhdGEubGFzdCA9IG5lYXI7XG4gICAgICB9IC8vIGNoZWNrIHRvIGNhbmNlbCB0YXBob2xkXG5cbiAgICAgIGlmIChjYXB0dXJlKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKG5vd1tpXSAmJiByLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uW2ldICYmIGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgICAgICAgIHIudG91Y2hEYXRhLnNpbmdsZVRvdWNoTW92ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyBwYW5uaW5nXG5cblxuICAgICAgaWYgKGNhcHR1cmUgJiYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQucGFubmFibGUoKSkgJiYgY3kucGFubmluZ0VuYWJsZWQoKSAmJiBjeS51c2VyUGFubmluZ0VuYWJsZWQoKSkge1xuICAgICAgICB2YXIgYWxsb3dQYXNzdGhyb3VnaCA9IGFsbG93UGFubmluZ1Bhc3N0aHJvdWdoKHN0YXJ0LCByLnRvdWNoRGF0YS5zdGFydHMpO1xuXG4gICAgICAgIGlmIChhbGxvd1Bhc3N0aHJvdWdoKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgaWYgKCFyLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24pIHtcbiAgICAgICAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IGFycmF5MnBvaW50KHIudG91Y2hEYXRhLnN0YXJ0UG9zaXRpb24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyLnN3aXBlUGFubmluZykge1xuICAgICAgICAgICAgY3kucGFuQnkoe1xuICAgICAgICAgICAgICB4OiBkaXNwWzBdICogem9vbSxcbiAgICAgICAgICAgICAgeTogZGlzcFsxXSAqIHpvb21cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY3kuZW1pdCgnZHJhZ3BhbicpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNPdmVyVGhyZXNob2xkRHJhZykge1xuICAgICAgICAgICAgci5zd2lwZVBhbm5pbmcgPSB0cnVlO1xuICAgICAgICAgICAgY3kucGFuQnkoe1xuICAgICAgICAgICAgICB4OiBkeCAqIHpvb20sXG4gICAgICAgICAgICAgIHk6IGR5ICogem9vbVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjeS5lbWl0KCdkcmFncGFuJyk7XG5cbiAgICAgICAgICAgIGlmIChzdGFydCkge1xuICAgICAgICAgICAgICBzdGFydC51bmFjdGl2YXRlKCk7XG4gICAgICAgICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gUmUtcHJvamVjdFxuXG5cbiAgICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMF0uY2xpZW50WCwgZS50b3VjaGVzWzBdLmNsaWVudFkpO1xuICAgICAgICBub3dbMF0gPSBwb3NbMF07XG4gICAgICAgIG5vd1sxXSA9IHBvc1sxXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5vdy5sZW5ndGg7IGorKykge1xuICAgICAgZWFybGllcltqXSA9IG5vd1tqXTtcbiAgICB9IC8vIHRoZSBhY3RpdmUgYmcgaW5kaWNhdG9yIHNob3VsZCBiZSByZW1vdmVkIHdoZW4gbWFraW5nIGEgc3dpcGUgdGhhdCBpcyBuZWl0aGVyIGZvciBkcmFnZ2luZyBub2RlcyBvciBwYW5uaW5nXG5cblxuICAgIGlmIChjYXB0dXJlICYmIGUudG91Y2hlcy5sZW5ndGggPiAwICYmICFyLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgJiYgIXIuc3dpcGVQYW5uaW5nICYmIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiAhPSBudWxsKSB7XG4gICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9XG4gIH0sIGZhbHNlKTtcbiAgdmFyIHRvdWNoY2FuY2VsSGFuZGxlcjtcbiAgci5yZWdpc3RlckJpbmRpbmcod2luZG93LCAndG91Y2hjYW5jZWwnLCB0b3VjaGNhbmNlbEhhbmRsZXIgPSBmdW5jdGlvbiB0b3VjaGNhbmNlbEhhbmRsZXIoZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB2YXIgc3RhcnQgPSByLnRvdWNoRGF0YS5zdGFydDtcbiAgICByLnRvdWNoRGF0YS5jYXB0dXJlID0gZmFsc2U7XG5cbiAgICBpZiAoc3RhcnQpIHtcbiAgICAgIHN0YXJ0LnVuYWN0aXZhdGUoKTtcbiAgICB9XG4gIH0pO1xuICB2YXIgdG91Y2hlbmRIYW5kbGVyLCBkaWREb3VibGVUb3VjaCwgdG91Y2hUaW1lb3V0LCBwcmV2VG91Y2hUaW1lU3RhbXA7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKHdpbmRvdywgJ3RvdWNoZW5kJywgdG91Y2hlbmRIYW5kbGVyID0gZnVuY3Rpb24gdG91Y2hlbmRIYW5kbGVyKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIHN0YXJ0ID0gci50b3VjaERhdGEuc3RhcnQ7XG4gICAgdmFyIGNhcHR1cmUgPSByLnRvdWNoRGF0YS5jYXB0dXJlO1xuXG4gICAgaWYgKGNhcHR1cmUpIHtcbiAgICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHIudG91Y2hEYXRhLmNhcHR1cmUgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNlbGVjdCA9IHIuc2VsZWN0aW9uO1xuICAgIHIuc3dpcGVQYW5uaW5nID0gZmFsc2U7XG4gICAgci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzID0gZmFsc2U7XG4gICAgdmFyIGN5ID0gci5jeTtcbiAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICB2YXIgbm93ID0gci50b3VjaERhdGEubm93O1xuICAgIHZhciBlYXJsaWVyID0gci50b3VjaERhdGEuZWFybGllcjtcblxuICAgIGlmIChlLnRvdWNoZXNbMF0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzBdLmNsaWVudFgsIGUudG91Y2hlc1swXS5jbGllbnRZKTtcbiAgICAgIG5vd1swXSA9IHBvc1swXTtcbiAgICAgIG5vd1sxXSA9IHBvc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoZS50b3VjaGVzWzFdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1sxXS5jbGllbnRYLCBlLnRvdWNoZXNbMV0uY2xpZW50WSk7XG4gICAgICBub3dbMl0gPSBwb3NbMF07XG4gICAgICBub3dbM10gPSBwb3NbMV07XG4gICAgfVxuXG4gICAgaWYgKGUudG91Y2hlc1syXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMl0uY2xpZW50WCwgZS50b3VjaGVzWzJdLmNsaWVudFkpO1xuICAgICAgbm93WzRdID0gcG9zWzBdO1xuICAgICAgbm93WzVdID0gcG9zWzFdO1xuICAgIH1cblxuICAgIGlmIChzdGFydCkge1xuICAgICAgc3RhcnQudW5hY3RpdmF0ZSgpO1xuICAgIH1cblxuICAgIHZhciBjdHhUYXBlbmQ7XG5cbiAgICBpZiAoci50b3VjaERhdGEuY3h0KSB7XG4gICAgICBjdHhUYXBlbmQgPSB7XG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHR5cGU6ICdjeHR0YXBlbmQnLFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaWYgKHN0YXJ0KSB7XG4gICAgICAgIHN0YXJ0LmVtaXQoY3R4VGFwZW5kKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN5LmVtaXQoY3R4VGFwZW5kKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyLnRvdWNoRGF0YS5jeHREcmFnZ2VkKSB7XG4gICAgICAgIHZhciBjdHhUYXAgPSB7XG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICB0eXBlOiAnY3h0dGFwJyxcbiAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChzdGFydCkge1xuICAgICAgICAgIHN0YXJ0LmVtaXQoY3R4VGFwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjeS5lbWl0KGN0eFRhcCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHIudG91Y2hEYXRhLnN0YXJ0KSB7XG4gICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0Ll9wcml2YXRlLmdyYWJiZWQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgci50b3VjaERhdGEuY3h0ID0gZmFsc2U7XG4gICAgICByLnRvdWNoRGF0YS5zdGFydCA9IG51bGw7XG4gICAgICByLnJlZHJhdygpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gbm8gbW9yZSBib3ggc2VsZWN0aW9uIGlmIHdlIGRvbid0IGhhdmUgdGhyZWUgZmluZ2Vyc1xuXG5cbiAgICBpZiAoIWUudG91Y2hlc1syXSAmJiBjeS5ib3hTZWxlY3Rpb25FbmFibGVkKCkgJiYgci50b3VjaERhdGEuc2VsZWN0aW5nKSB7XG4gICAgICByLnRvdWNoRGF0YS5zZWxlY3RpbmcgPSBmYWxzZTtcbiAgICAgIHZhciBib3ggPSBjeS5jb2xsZWN0aW9uKHIuZ2V0QWxsSW5Cb3goc2VsZWN0WzBdLCBzZWxlY3RbMV0sIHNlbGVjdFsyXSwgc2VsZWN0WzNdKSk7XG4gICAgICBzZWxlY3RbMF0gPSB1bmRlZmluZWQ7XG4gICAgICBzZWxlY3RbMV0gPSB1bmRlZmluZWQ7XG4gICAgICBzZWxlY3RbMl0gPSB1bmRlZmluZWQ7XG4gICAgICBzZWxlY3RbM10gPSB1bmRlZmluZWQ7XG4gICAgICBzZWxlY3RbNF0gPSAwO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIGN5LmVtaXQoe1xuICAgICAgICB0eXBlOiAnYm94ZW5kJyxcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgeTogbm93WzFdXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB2YXIgZWxlV291bGRCZVNlbGVjdGVkID0gZnVuY3Rpb24gZWxlV291bGRCZVNlbGVjdGVkKGVsZSkge1xuICAgICAgICByZXR1cm4gZWxlLnNlbGVjdGFibGUoKSAmJiAhZWxlLnNlbGVjdGVkKCk7XG4gICAgICB9O1xuXG4gICAgICBib3guZW1pdCgnYm94Jykuc3RkRmlsdGVyKGVsZVdvdWxkQmVTZWxlY3RlZCkuc2VsZWN0KCkuZW1pdCgnYm94c2VsZWN0Jyk7XG5cbiAgICAgIGlmIChib3gubm9uZW1wdHkoKSkge1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgci5yZWRyYXcoKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgIT0gbnVsbCkge1xuICAgICAgc3RhcnQudW5hY3RpdmF0ZSgpO1xuICAgIH1cblxuICAgIGlmIChlLnRvdWNoZXNbMl0pIHtcbiAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChlLnRvdWNoZXNbMV0pIDsgZWxzZSBpZiAoZS50b3VjaGVzWzBdKSA7IGVsc2UgaWYgKCFlLnRvdWNoZXNbMF0pIHtcbiAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICB2YXIgZHJhZ2dlZEVsZXMgPSByLmRyYWdEYXRhLnRvdWNoRHJhZ0VsZXM7XG5cbiAgICAgIGlmIChzdGFydCAhPSBudWxsKSB7XG4gICAgICAgIHZhciBzdGFydFdhc0dyYWJiZWQgPSBzdGFydC5fcHJpdmF0ZS5ncmFiYmVkO1xuICAgICAgICBmcmVlRHJhZ2dlZEVsZW1lbnRzKGRyYWdnZWRFbGVzKTtcbiAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuXG4gICAgICAgIGlmIChzdGFydFdhc0dyYWJiZWQpIHtcbiAgICAgICAgICBzdGFydC5lbWl0KCdmcmVlb24nKTtcbiAgICAgICAgICBkcmFnZ2VkRWxlcy5lbWl0KCdmcmVlJyk7XG5cbiAgICAgICAgICBpZiAoci5kcmFnRGF0YS5kaWREcmFnKSB7XG4gICAgICAgICAgICBzdGFydC5lbWl0KCdkcmFnZnJlZW9uJyk7XG4gICAgICAgICAgICBkcmFnZ2VkRWxlcy5lbWl0KCdkcmFnZnJlZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRyaWdnZXJFdmVudHMoc3RhcnQsIFsndG91Y2hlbmQnLCAndGFwZW5kJywgJ3Ztb3VzZXVwJywgJ3RhcGRyYWdvdXQnXSwgZSwge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfSk7XG4gICAgICAgIHN0YXJ0LnVuYWN0aXZhdGUoKTtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG5lYXIgPSByLmZpbmROZWFyZXN0RWxlbWVudChub3dbMF0sIG5vd1sxXSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRyaWdnZXJFdmVudHMobmVhciwgWyd0b3VjaGVuZCcsICd0YXBlbmQnLCAndm1vdXNldXAnLCAndGFwZHJhZ291dCddLCBlLCB7XG4gICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGR4ID0gci50b3VjaERhdGEuc3RhcnRQb3NpdGlvblswXSAtIG5vd1swXTtcbiAgICAgIHZhciBkeDIgPSBkeCAqIGR4O1xuICAgICAgdmFyIGR5ID0gci50b3VjaERhdGEuc3RhcnRQb3NpdGlvblsxXSAtIG5vd1sxXTtcbiAgICAgIHZhciBkeTIgPSBkeSAqIGR5O1xuICAgICAgdmFyIGRpc3QyID0gZHgyICsgZHkyO1xuICAgICAgdmFyIHJkaXN0MiA9IGRpc3QyICogem9vbSAqIHpvb207IC8vIFRhcCBldmVudCwgcm91Z2hseSBzYW1lIGFzIG1vdXNlIGNsaWNrIGV2ZW50IGZvciB0b3VjaFxuXG4gICAgICBpZiAoIXIudG91Y2hEYXRhLnNpbmdsZVRvdWNoTW92ZWQpIHtcbiAgICAgICAgaWYgKCFzdGFydCkge1xuICAgICAgICAgIGN5LiQoJzpzZWxlY3RlZCcpLnVuc2VsZWN0KFsndGFwdW5zZWxlY3QnXSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cmlnZ2VyRXZlbnRzKHN0YXJ0LCBbJ3RhcCcsICd2Y2xpY2snXSwgZSwge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfSk7XG4gICAgICAgIGRpZERvdWJsZVRvdWNoID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGUudGltZVN0YW1wIC0gcHJldlRvdWNoVGltZVN0YW1wIDw9IGN5Lm11bHRpQ2xpY2tEZWJvdW5jZVRpbWUoKSkge1xuICAgICAgICAgIHRvdWNoVGltZW91dCAmJiBjbGVhclRpbWVvdXQodG91Y2hUaW1lb3V0KTtcbiAgICAgICAgICBkaWREb3VibGVUb3VjaCA9IHRydWU7XG4gICAgICAgICAgcHJldlRvdWNoVGltZVN0YW1wID0gbnVsbDtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnRzKHN0YXJ0LCBbJ2RibHRhcCcsICd2ZGJsY2xpY2snXSwgZSwge1xuICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG91Y2hUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoZGlkRG91YmxlVG91Y2gpIHJldHVybjtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudHMoc3RhcnQsIFsnb25ldGFwJywgJ3ZvbmVjbGljayddLCBlLCB7XG4gICAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LCBjeS5tdWx0aUNsaWNrRGVib3VuY2VUaW1lKCkpO1xuICAgICAgICAgIHByZXZUb3VjaFRpbWVTdGFtcCA9IGUudGltZVN0YW1wO1xuICAgICAgICB9XG4gICAgICB9IC8vIFByZXBhcmUgdG8gc2VsZWN0IHRoZSBjdXJyZW50bHkgdG91Y2hlZCBub2RlLCBvbmx5IGlmIGl0IGhhc24ndCBiZWVuIGRyYWdnZWQgcGFzdCBhIGNlcnRhaW4gZGlzdGFuY2VcblxuXG4gICAgICBpZiAoc3RhcnQgIT0gbnVsbCAmJiAhci5kcmFnRGF0YS5kaWREcmFnIC8vIGRpZG4ndCBkcmFnIG5vZGVzIGFyb3VuZFxuICAgICAgJiYgc3RhcnQuX3ByaXZhdGUuc2VsZWN0YWJsZSAmJiByZGlzdDIgPCByLnRvdWNoVGFwVGhyZXNob2xkMiAmJiAhci5waW5jaGluZyAvLyBwaW5jaCB0byB6b29tIHNob3VsZCBub3QgYWZmZWN0IHNlbGVjdGlvblxuICAgICAgKSB7XG4gICAgICAgIGlmIChjeS5zZWxlY3Rpb25UeXBlKCkgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgY3kuJChpc1NlbGVjdGVkKS51bm1lcmdlKHN0YXJ0KS51bnNlbGVjdChbJ3RhcHVuc2VsZWN0J10pO1xuICAgICAgICAgIHN0YXJ0LnNlbGVjdChbJ3RhcHNlbGVjdCddKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoc3RhcnQuc2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgc3RhcnQudW5zZWxlY3QoWyd0YXB1bnNlbGVjdCddKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhcnQuc2VsZWN0KFsndGFwc2VsZWN0J10pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICByLnRvdWNoRGF0YS5zaW5nbGVUb3VjaE1vdmVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5vdy5sZW5ndGg7IGorKykge1xuICAgICAgZWFybGllcltqXSA9IG5vd1tqXTtcbiAgICB9XG5cbiAgICByLmRyYWdEYXRhLmRpZERyYWcgPSBmYWxzZTsgLy8gcmVzZXQgZm9yIG5leHQgdG91Y2hzdGFydFxuXG4gICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHIudG91Y2hEYXRhLmRyYWdEZWx0YSA9IFtdO1xuICAgICAgci50b3VjaERhdGEuc3RhcnRQb3NpdGlvbiA9IG51bGw7XG4gICAgICByLnRvdWNoRGF0YS5zdGFydEdQb3NpdGlvbiA9IG51bGw7XG4gICAgICByLnRvdWNoRGF0YS5kaWRTZWxlY3QgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA8IDIpIHtcbiAgICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8vIHRoZSBvbGQgc3RhcnQgZ2xvYmFsIHBvcyduIG1heSBub3QgYmUgdGhlIHNhbWUgZmluZ2VyIHRoYXQgcmVtYWluc1xuICAgICAgICByLnRvdWNoRGF0YS5zdGFydEdQb3NpdGlvbiA9IFtlLnRvdWNoZXNbMF0uY2xpZW50WCwgZS50b3VjaGVzWzBdLmNsaWVudFldO1xuICAgICAgfVxuXG4gICAgICByLnBpbmNoaW5nID0gZmFsc2U7XG4gICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgIHIucmVkcmF3KCk7XG4gICAgfSAvL3IucmVkcmF3KCk7XG5cbiAgfSwgZmFsc2UpOyAvLyBmYWxsYmFjayBjb21wYXRpYmlsaXR5IGxheWVyIGZvciBtcyBwb2ludGVyIGV2ZW50c1xuXG4gIGlmICh0eXBlb2YgVG91Y2hFdmVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB2YXIgcG9pbnRlcnMgPSBbXTtcblxuICAgIHZhciBtYWtlVG91Y2ggPSBmdW5jdGlvbiBtYWtlVG91Y2goZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2xpZW50WDogZS5jbGllbnRYLFxuICAgICAgICBjbGllbnRZOiBlLmNsaWVudFksXG4gICAgICAgIGZvcmNlOiAxLFxuICAgICAgICBpZGVudGlmaWVyOiBlLnBvaW50ZXJJZCxcbiAgICAgICAgcGFnZVg6IGUucGFnZVgsXG4gICAgICAgIHBhZ2VZOiBlLnBhZ2VZLFxuICAgICAgICByYWRpdXNYOiBlLndpZHRoIC8gMixcbiAgICAgICAgcmFkaXVzWTogZS5oZWlnaHQgLyAyLFxuICAgICAgICBzY3JlZW5YOiBlLnNjcmVlblgsXG4gICAgICAgIHNjcmVlblk6IGUuc2NyZWVuWSxcbiAgICAgICAgdGFyZ2V0OiBlLnRhcmdldFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdmFyIG1ha2VQb2ludGVyID0gZnVuY3Rpb24gbWFrZVBvaW50ZXIoZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXZlbnQ6IGUsXG4gICAgICAgIHRvdWNoOiBtYWtlVG91Y2goZSlcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHZhciBhZGRQb2ludGVyID0gZnVuY3Rpb24gYWRkUG9pbnRlcihlKSB7XG4gICAgICBwb2ludGVycy5wdXNoKG1ha2VQb2ludGVyKGUpKTtcbiAgICB9O1xuXG4gICAgdmFyIHJlbW92ZVBvaW50ZXIgPSBmdW5jdGlvbiByZW1vdmVQb2ludGVyKGUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHAgPSBwb2ludGVyc1tpXTtcblxuICAgICAgICBpZiAocC5ldmVudC5wb2ludGVySWQgPT09IGUucG9pbnRlcklkKSB7XG4gICAgICAgICAgcG9pbnRlcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgdXBkYXRlUG9pbnRlciA9IGZ1bmN0aW9uIHVwZGF0ZVBvaW50ZXIoZSkge1xuICAgICAgdmFyIHAgPSBwb2ludGVycy5maWx0ZXIoZnVuY3Rpb24gKHApIHtcbiAgICAgICAgcmV0dXJuIHAuZXZlbnQucG9pbnRlcklkID09PSBlLnBvaW50ZXJJZDtcbiAgICAgIH0pWzBdO1xuICAgICAgcC5ldmVudCA9IGU7XG4gICAgICBwLnRvdWNoID0gbWFrZVRvdWNoKGUpO1xuICAgIH07XG5cbiAgICB2YXIgYWRkVG91Y2hlc1RvRXZlbnQgPSBmdW5jdGlvbiBhZGRUb3VjaGVzVG9FdmVudChlKSB7XG4gICAgICBlLnRvdWNoZXMgPSBwb2ludGVycy5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICAgICAgcmV0dXJuIHAudG91Y2g7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgdmFyIHBvaW50ZXJJc01vdXNlID0gZnVuY3Rpb24gcG9pbnRlcklzTW91c2UoZSkge1xuICAgICAgcmV0dXJuIGUucG9pbnRlclR5cGUgPT09ICdtb3VzZScgfHwgZS5wb2ludGVyVHlwZSA9PT0gNDtcbiAgICB9O1xuXG4gICAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdwb2ludGVyZG93bicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAocG9pbnRlcklzTW91c2UoZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBtb3VzZSBhbHJlYWR5IGhhbmRsZWRcblxuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBhZGRQb2ludGVyKGUpO1xuICAgICAgYWRkVG91Y2hlc1RvRXZlbnQoZSk7XG4gICAgICB0b3VjaHN0YXJ0SGFuZGxlcihlKTtcbiAgICB9KTtcbiAgICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ3BvaW50ZXJ1cCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAocG9pbnRlcklzTW91c2UoZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBtb3VzZSBhbHJlYWR5IGhhbmRsZWRcblxuXG4gICAgICByZW1vdmVQb2ludGVyKGUpO1xuICAgICAgYWRkVG91Y2hlc1RvRXZlbnQoZSk7XG4gICAgICB0b3VjaGVuZEhhbmRsZXIoZSk7XG4gICAgfSk7XG4gICAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdwb2ludGVyY2FuY2VsJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChwb2ludGVySXNNb3VzZShlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIG1vdXNlIGFscmVhZHkgaGFuZGxlZFxuXG5cbiAgICAgIHJlbW92ZVBvaW50ZXIoZSk7XG4gICAgICBhZGRUb3VjaGVzVG9FdmVudChlKTtcbiAgICAgIHRvdWNoY2FuY2VsSGFuZGxlcihlKTtcbiAgICB9KTtcbiAgICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ3BvaW50ZXJtb3ZlJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChwb2ludGVySXNNb3VzZShlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIG1vdXNlIGFscmVhZHkgaGFuZGxlZFxuXG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHVwZGF0ZVBvaW50ZXIoZSk7XG4gICAgICBhZGRUb3VjaGVzVG9FdmVudChlKTtcbiAgICAgIHRvdWNobW92ZUhhbmRsZXIoZSk7XG4gICAgfSk7XG4gIH1cbn07XG5cbnZhciBCUnAkMiA9IHt9O1xuXG5CUnAkMi5nZW5lcmF0ZVBvbHlnb24gPSBmdW5jdGlvbiAobmFtZSwgcG9pbnRzKSB7XG4gIHJldHVybiB0aGlzLm5vZGVTaGFwZXNbbmFtZV0gPSB7XG4gICAgcmVuZGVyZXI6IHRoaXMsXG4gICAgbmFtZTogbmFtZSxcbiAgICBwb2ludHM6IHBvaW50cyxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCgncG9seWdvbicsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHRoaXMucG9pbnRzKTtcbiAgICB9LFxuICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIGludGVyc2VjdExpbmUobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nKSB7XG4gICAgICByZXR1cm4gcG9seWdvbkludGVyc2VjdExpbmUoeCwgeSwgdGhpcy5wb2ludHMsIG5vZGVYLCBub2RlWSwgd2lkdGggLyAyLCBoZWlnaHQgLyAyLCBwYWRkaW5nKTtcbiAgICB9LFxuICAgIGNoZWNrUG9pbnQ6IGZ1bmN0aW9uIGNoZWNrUG9pbnQoeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSkge1xuICAgICAgcmV0dXJuIHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgWzAsIC0xXSwgcGFkZGluZyk7XG4gICAgfVxuICB9O1xufTtcblxuQlJwJDIuZ2VuZXJhdGVFbGxpcHNlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ub2RlU2hhcGVzWydlbGxpcHNlJ10gPSB7XG4gICAgcmVuZGVyZXI6IHRoaXMsXG4gICAgbmFtZTogJ2VsbGlwc2UnLFxuICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKHRoaXMubmFtZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfSxcbiAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZykge1xuICAgICAgcmV0dXJuIGludGVyc2VjdExpbmVFbGxpcHNlKHgsIHksIG5vZGVYLCBub2RlWSwgd2lkdGggLyAyICsgcGFkZGluZywgaGVpZ2h0IC8gMiArIHBhZGRpbmcpO1xuICAgIH0sXG4gICAgY2hlY2tQb2ludDogZnVuY3Rpb24gY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZKSB7XG4gICAgICByZXR1cm4gY2hlY2tJbkVsbGlwc2UoeCwgeSwgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSwgcGFkZGluZyk7XG4gICAgfVxuICB9O1xufTtcblxuQlJwJDIuZ2VuZXJhdGVSb3VuZFBvbHlnb24gPSBmdW5jdGlvbiAobmFtZSwgcG9pbnRzKSB7XG4gIC8vIFByZS1jb21wdXRlIGNvbnRyb2wgcG9pbnRzXG4gIC8vIFNpbmNlIHRoZXNlIHBvaW50cyBkZXBlbmQgb24gdGhlIHJhZGl1cyBsZW5ndGggKHdoaWNoIGluIHR1cm5zIGRlcGVuZCBvbiB0aGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBub2RlKSB3ZSB3aWxsIG9ubHkgcHJlLWNvbXB1dGVcbiAgLy8gdGhlIHVuaXQgdmVjdG9ycy5cbiAgLy8gRm9yIHNpbXBsaWNpdHkgdGhlIGxheW91dCB3aWxsIGJlOlxuICAvLyBbIHAwLCBVbml0VmVjdG9yUDBQMSwgcDEsIFVuaVZlY3RvclAxUDIsIC4uLiwgcG4sIFVuaXRWZWN0b3JQblAwIF1cbiAgdmFyIGFsbFBvaW50cyA9IG5ldyBBcnJheShwb2ludHMubGVuZ3RoICogMik7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZUluZGV4ID0gaSAqIDI7XG4gICAgdmFyIGRlc3RJbmRleCA9IHZvaWQgMDtcblxuICAgIGlmIChpIDwgcG9pbnRzLmxlbmd0aCAvIDIgLSAxKSB7XG4gICAgICBkZXN0SW5kZXggPSAoaSArIDEpICogMjtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVzdEluZGV4ID0gMDtcbiAgICB9XG5cbiAgICBhbGxQb2ludHNbaSAqIDRdID0gcG9pbnRzW3NvdXJjZUluZGV4XTtcbiAgICBhbGxQb2ludHNbaSAqIDQgKyAxXSA9IHBvaW50c1tzb3VyY2VJbmRleCArIDFdO1xuICAgIHZhciB4RGVzdCA9IHBvaW50c1tkZXN0SW5kZXhdIC0gcG9pbnRzW3NvdXJjZUluZGV4XTtcbiAgICB2YXIgeURlc3QgPSBwb2ludHNbZGVzdEluZGV4ICsgMV0gLSBwb2ludHNbc291cmNlSW5kZXggKyAxXTtcbiAgICB2YXIgbm9ybSA9IE1hdGguc3FydCh4RGVzdCAqIHhEZXN0ICsgeURlc3QgKiB5RGVzdCk7XG4gICAgYWxsUG9pbnRzW2kgKiA0ICsgMl0gPSB4RGVzdCAvIG5vcm07XG4gICAgYWxsUG9pbnRzW2kgKiA0ICsgM10gPSB5RGVzdCAvIG5vcm07XG4gIH1cblxuICByZXR1cm4gdGhpcy5ub2RlU2hhcGVzW25hbWVdID0ge1xuICAgIHJlbmRlcmVyOiB0aGlzLFxuICAgIG5hbWU6IG5hbWUsXG4gICAgcG9pbnRzOiBhbGxQb2ludHMsXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLm5vZGVTaGFwZUltcGwoJ3JvdW5kLXBvbHlnb24nLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB0aGlzLnBvaW50cyk7XG4gICAgfSxcbiAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZykge1xuICAgICAgcmV0dXJuIHJvdW5kUG9seWdvbkludGVyc2VjdExpbmUoeCwgeSwgdGhpcy5wb2ludHMsIG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkpIHtcbiAgICAgIHJldHVybiBwb2ludEluc2lkZVJvdW5kUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfVxuICB9O1xufTtcblxuQlJwJDIuZ2VuZXJhdGVSb3VuZFJlY3RhbmdsZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1sncm91bmQtcmVjdGFuZ2xlJ10gPSB0aGlzLm5vZGVTaGFwZXNbJ3JvdW5kcmVjdGFuZ2xlJ10gPSB7XG4gICAgcmVuZGVyZXI6IHRoaXMsXG4gICAgbmFtZTogJ3JvdW5kLXJlY3RhbmdsZScsXG4gICAgcG9pbnRzOiBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCksXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLm5vZGVTaGFwZUltcGwodGhpcy5uYW1lLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9LFxuICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIGludGVyc2VjdExpbmUobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nKSB7XG4gICAgICByZXR1cm4gcm91bmRSZWN0YW5nbGVJbnRlcnNlY3RMaW5lKHgsIHksIG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZyk7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkpIHtcbiAgICAgIHZhciBjb3JuZXJSYWRpdXMgPSBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHZhciBkaWFtID0gY29ybmVyUmFkaXVzICogMjsgLy8gQ2hlY2sgaEJveFxuXG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0IC0gZGlhbSwgWzAsIC0xXSwgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IC8vIENoZWNrIHZCb3hcblxuXG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCAtIGRpYW0sIGhlaWdodCwgWzAsIC0xXSwgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IC8vIENoZWNrIHRvcCBsZWZ0IHF1YXJ0ZXIgY2lyY2xlXG5cblxuICAgICAgaWYgKGNoZWNrSW5FbGxpcHNlKHgsIHksIGRpYW0sIGRpYW0sIGNlbnRlclggLSB3aWR0aCAvIDIgKyBjb3JuZXJSYWRpdXMsIGNlbnRlclkgLSBoZWlnaHQgLyAyICsgY29ybmVyUmFkaXVzLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gQ2hlY2sgdG9wIHJpZ2h0IHF1YXJ0ZXIgY2lyY2xlXG5cblxuICAgICAgaWYgKGNoZWNrSW5FbGxpcHNlKHgsIHksIGRpYW0sIGRpYW0sIGNlbnRlclggKyB3aWR0aCAvIDIgLSBjb3JuZXJSYWRpdXMsIGNlbnRlclkgLSBoZWlnaHQgLyAyICsgY29ybmVyUmFkaXVzLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gQ2hlY2sgYm90dG9tIHJpZ2h0IHF1YXJ0ZXIgY2lyY2xlXG5cblxuICAgICAgaWYgKGNoZWNrSW5FbGxpcHNlKHgsIHksIGRpYW0sIGRpYW0sIGNlbnRlclggKyB3aWR0aCAvIDIgLSBjb3JuZXJSYWRpdXMsIGNlbnRlclkgKyBoZWlnaHQgLyAyIC0gY29ybmVyUmFkaXVzLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gQ2hlY2sgYm90dG9tIGxlZnQgcXVhcnRlciBjaXJjbGVcblxuXG4gICAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSwgZGlhbSwgZGlhbSwgY2VudGVyWCAtIHdpZHRoIC8gMiArIGNvcm5lclJhZGl1cywgY2VudGVyWSArIGhlaWdodCAvIDIgLSBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xufTtcblxuQlJwJDIuZ2VuZXJhdGVDdXRSZWN0YW5nbGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLm5vZGVTaGFwZXNbJ2N1dC1yZWN0YW5nbGUnXSA9IHRoaXMubm9kZVNoYXBlc1snY3V0cmVjdGFuZ2xlJ10gPSB7XG4gICAgcmVuZGVyZXI6IHRoaXMsXG4gICAgbmFtZTogJ2N1dC1yZWN0YW5nbGUnLFxuICAgIGNvcm5lckxlbmd0aDogZ2V0Q3V0UmVjdGFuZ2xlQ29ybmVyTGVuZ3RoKCksXG4gICAgcG9pbnRzOiBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCksXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLm5vZGVTaGFwZUltcGwodGhpcy5uYW1lLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9LFxuICAgIGdlbmVyYXRlQ3V0VHJpYW5nbGVQdHM6IGZ1bmN0aW9uIGdlbmVyYXRlQ3V0VHJpYW5nbGVQdHMod2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSkge1xuICAgICAgdmFyIGNsID0gdGhpcy5jb3JuZXJMZW5ndGg7XG4gICAgICB2YXIgaGggPSBoZWlnaHQgLyAyO1xuICAgICAgdmFyIGh3ID0gd2lkdGggLyAyO1xuICAgICAgdmFyIHhCZWdpbiA9IGNlbnRlclggLSBodztcbiAgICAgIHZhciB4RW5kID0gY2VudGVyWCArIGh3O1xuICAgICAgdmFyIHlCZWdpbiA9IGNlbnRlclkgLSBoaDtcbiAgICAgIHZhciB5RW5kID0gY2VudGVyWSArIGhoOyAvLyBwb2ludHMgYXJlIGluIGNsb2Nrd2lzZSBvcmRlciwgaW5uZXIgKGltYWdpbmFyeSkgdHJpYW5nbGUgcHQgb24gWzQsIDVdXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvcExlZnQ6IFt4QmVnaW4sIHlCZWdpbiArIGNsLCB4QmVnaW4gKyBjbCwgeUJlZ2luLCB4QmVnaW4gKyBjbCwgeUJlZ2luICsgY2xdLFxuICAgICAgICB0b3BSaWdodDogW3hFbmQgLSBjbCwgeUJlZ2luLCB4RW5kLCB5QmVnaW4gKyBjbCwgeEVuZCAtIGNsLCB5QmVnaW4gKyBjbF0sXG4gICAgICAgIGJvdHRvbVJpZ2h0OiBbeEVuZCwgeUVuZCAtIGNsLCB4RW5kIC0gY2wsIHlFbmQsIHhFbmQgLSBjbCwgeUVuZCAtIGNsXSxcbiAgICAgICAgYm90dG9tTGVmdDogW3hCZWdpbiArIGNsLCB5RW5kLCB4QmVnaW4sIHlFbmQgLSBjbCwgeEJlZ2luICsgY2wsIHlFbmQgLSBjbF1cbiAgICAgIH07XG4gICAgfSxcbiAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZykge1xuICAgICAgdmFyIGNQdHMgPSB0aGlzLmdlbmVyYXRlQ3V0VHJpYW5nbGVQdHMod2lkdGggKyAyICogcGFkZGluZywgaGVpZ2h0ICsgMiAqIHBhZGRpbmcsIG5vZGVYLCBub2RlWSk7XG4gICAgICB2YXIgcHRzID0gW10uY29uY2F0LmFwcGx5KFtdLCBbY1B0cy50b3BMZWZ0LnNwbGljZSgwLCA0KSwgY1B0cy50b3BSaWdodC5zcGxpY2UoMCwgNCksIGNQdHMuYm90dG9tUmlnaHQuc3BsaWNlKDAsIDQpLCBjUHRzLmJvdHRvbUxlZnQuc3BsaWNlKDAsIDQpXSk7XG4gICAgICByZXR1cm4gcG9seWdvbkludGVyc2VjdExpbmUoeCwgeSwgcHRzLCBub2RlWCwgbm9kZVkpO1xuICAgIH0sXG4gICAgY2hlY2tQb2ludDogZnVuY3Rpb24gY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZKSB7XG4gICAgICAvLyBDaGVjayBoQm94XG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0IC0gMiAqIHRoaXMuY29ybmVyTGVuZ3RoLCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gQ2hlY2sgdkJveFxuXG5cbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgdGhpcy5wb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoIC0gMiAqIHRoaXMuY29ybmVyTGVuZ3RoLCBoZWlnaHQsIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgY3V0VHJpYW5nbGVQdHMgPSB0aGlzLmdlbmVyYXRlQ3V0VHJpYW5nbGVQdHMod2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSk7XG4gICAgICByZXR1cm4gcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIGN1dFRyaWFuZ2xlUHRzLnRvcExlZnQpIHx8IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBjdXRUcmlhbmdsZVB0cy50b3BSaWdodCkgfHwgcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIGN1dFRyaWFuZ2xlUHRzLmJvdHRvbVJpZ2h0KSB8fCBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgY3V0VHJpYW5nbGVQdHMuYm90dG9tTGVmdCk7XG4gICAgfVxuICB9O1xufTtcblxuQlJwJDIuZ2VuZXJhdGVCYXJyZWwgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLm5vZGVTaGFwZXNbJ2JhcnJlbCddID0ge1xuICAgIHJlbmRlcmVyOiB0aGlzLFxuICAgIG5hbWU6ICdiYXJyZWwnLFxuICAgIHBvaW50czogZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDQsIDApLFxuICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKHRoaXMubmFtZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfSxcbiAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZykge1xuICAgICAgLy8gdXNlIHR3byBmaXhlZCB0IHZhbHVlcyBmb3IgdGhlIGJlemllciBjdXJ2ZSBhcHByb3hpbWF0aW9uXG4gICAgICB2YXIgdDAgPSAwLjE1O1xuICAgICAgdmFyIHQxID0gMC41O1xuICAgICAgdmFyIHQyID0gMC44NTtcbiAgICAgIHZhciBiUHRzID0gdGhpcy5nZW5lcmF0ZUJhcnJlbEJlemllclB0cyh3aWR0aCArIDIgKiBwYWRkaW5nLCBoZWlnaHQgKyAyICogcGFkZGluZywgbm9kZVgsIG5vZGVZKTtcblxuICAgICAgdmFyIGFwcHJveGltYXRlQmFycmVsQ3VydmVQdHMgPSBmdW5jdGlvbiBhcHByb3hpbWF0ZUJhcnJlbEN1cnZlUHRzKHB0cykge1xuICAgICAgICAvLyBhcHByb3hpbWF0ZSBjdXJ2ZSBwdHMgYmFzZWQgb24gdGhlIHR3byB0IHZhbHVlc1xuICAgICAgICB2YXIgbTAgPSBxYmV6aWVyUHRBdCh7XG4gICAgICAgICAgeDogcHRzWzBdLFxuICAgICAgICAgIHk6IHB0c1sxXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogcHRzWzJdLFxuICAgICAgICAgIHk6IHB0c1szXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogcHRzWzRdLFxuICAgICAgICAgIHk6IHB0c1s1XVxuICAgICAgICB9LCB0MCk7XG4gICAgICAgIHZhciBtMSA9IHFiZXppZXJQdEF0KHtcbiAgICAgICAgICB4OiBwdHNbMF0sXG4gICAgICAgICAgeTogcHRzWzFdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBwdHNbMl0sXG4gICAgICAgICAgeTogcHRzWzNdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBwdHNbNF0sXG4gICAgICAgICAgeTogcHRzWzVdXG4gICAgICAgIH0sIHQxKTtcbiAgICAgICAgdmFyIG0yID0gcWJlemllclB0QXQoe1xuICAgICAgICAgIHg6IHB0c1swXSxcbiAgICAgICAgICB5OiBwdHNbMV1cbiAgICAgICAgfSwge1xuICAgICAgICAgIHg6IHB0c1syXSxcbiAgICAgICAgICB5OiBwdHNbM11cbiAgICAgICAgfSwge1xuICAgICAgICAgIHg6IHB0c1s0XSxcbiAgICAgICAgICB5OiBwdHNbNV1cbiAgICAgICAgfSwgdDIpO1xuICAgICAgICByZXR1cm4gW3B0c1swXSwgcHRzWzFdLCBtMC54LCBtMC55LCBtMS54LCBtMS55LCBtMi54LCBtMi55LCBwdHNbNF0sIHB0c1s1XV07XG4gICAgICB9O1xuXG4gICAgICB2YXIgcHRzID0gW10uY29uY2F0KGFwcHJveGltYXRlQmFycmVsQ3VydmVQdHMoYlB0cy50b3BMZWZ0KSwgYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyhiUHRzLnRvcFJpZ2h0KSwgYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyhiUHRzLmJvdHRvbVJpZ2h0KSwgYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyhiUHRzLmJvdHRvbUxlZnQpKTtcbiAgICAgIHJldHVybiBwb2x5Z29uSW50ZXJzZWN0TGluZSh4LCB5LCBwdHMsIG5vZGVYLCBub2RlWSk7XG4gICAgfSxcbiAgICBnZW5lcmF0ZUJhcnJlbEJlemllclB0czogZnVuY3Rpb24gZ2VuZXJhdGVCYXJyZWxCZXppZXJQdHMod2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSkge1xuICAgICAgdmFyIGhoID0gaGVpZ2h0IC8gMjtcbiAgICAgIHZhciBodyA9IHdpZHRoIC8gMjtcbiAgICAgIHZhciB4QmVnaW4gPSBjZW50ZXJYIC0gaHc7XG4gICAgICB2YXIgeEVuZCA9IGNlbnRlclggKyBodztcbiAgICAgIHZhciB5QmVnaW4gPSBjZW50ZXJZIC0gaGg7XG4gICAgICB2YXIgeUVuZCA9IGNlbnRlclkgKyBoaDtcbiAgICAgIHZhciBjdXJ2ZUNvbnN0YW50cyA9IGdldEJhcnJlbEN1cnZlQ29uc3RhbnRzKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdmFyIGhPZmZzZXQgPSBjdXJ2ZUNvbnN0YW50cy5oZWlnaHRPZmZzZXQ7XG4gICAgICB2YXIgd09mZnNldCA9IGN1cnZlQ29uc3RhbnRzLndpZHRoT2Zmc2V0O1xuICAgICAgdmFyIGN0cmxQdFhPZmZzZXQgPSBjdXJ2ZUNvbnN0YW50cy5jdHJsUHRPZmZzZXRQY3QgKiB3aWR0aDsgLy8gcG9pbnRzIGFyZSBpbiBjbG9ja3dpc2Ugb3JkZXIsIGlubmVyIChpbWFnaW5hcnkpIGNvbnRyb2wgcHQgb24gWzQsIDVdXG5cbiAgICAgIHZhciBwdHMgPSB7XG4gICAgICAgIHRvcExlZnQ6IFt4QmVnaW4sIHlCZWdpbiArIGhPZmZzZXQsIHhCZWdpbiArIGN0cmxQdFhPZmZzZXQsIHlCZWdpbiwgeEJlZ2luICsgd09mZnNldCwgeUJlZ2luXSxcbiAgICAgICAgdG9wUmlnaHQ6IFt4RW5kIC0gd09mZnNldCwgeUJlZ2luLCB4RW5kIC0gY3RybFB0WE9mZnNldCwgeUJlZ2luLCB4RW5kLCB5QmVnaW4gKyBoT2Zmc2V0XSxcbiAgICAgICAgYm90dG9tUmlnaHQ6IFt4RW5kLCB5RW5kIC0gaE9mZnNldCwgeEVuZCAtIGN0cmxQdFhPZmZzZXQsIHlFbmQsIHhFbmQgLSB3T2Zmc2V0LCB5RW5kXSxcbiAgICAgICAgYm90dG9tTGVmdDogW3hCZWdpbiArIHdPZmZzZXQsIHlFbmQsIHhCZWdpbiArIGN0cmxQdFhPZmZzZXQsIHlFbmQsIHhCZWdpbiwgeUVuZCAtIGhPZmZzZXRdXG4gICAgICB9O1xuICAgICAgcHRzLnRvcExlZnQuaXNUb3AgPSB0cnVlO1xuICAgICAgcHRzLnRvcFJpZ2h0LmlzVG9wID0gdHJ1ZTtcbiAgICAgIHB0cy5ib3R0b21MZWZ0LmlzQm90dG9tID0gdHJ1ZTtcbiAgICAgIHB0cy5ib3R0b21SaWdodC5pc0JvdHRvbSA9IHRydWU7XG4gICAgICByZXR1cm4gcHRzO1xuICAgIH0sXG4gICAgY2hlY2tQb2ludDogZnVuY3Rpb24gY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZKSB7XG4gICAgICB2YXIgY3VydmVDb25zdGFudHMgPSBnZXRCYXJyZWxDdXJ2ZUNvbnN0YW50cyh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHZhciBoT2Zmc2V0ID0gY3VydmVDb25zdGFudHMuaGVpZ2h0T2Zmc2V0O1xuICAgICAgdmFyIHdPZmZzZXQgPSBjdXJ2ZUNvbnN0YW50cy53aWR0aE9mZnNldDsgLy8gQ2hlY2sgaEJveFxuXG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0IC0gMiAqIGhPZmZzZXQsIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSAvLyBDaGVjayB2Qm94XG5cblxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLSAyICogd09mZnNldCwgaGVpZ2h0LCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGJhcnJlbEN1cnZlUHRzID0gdGhpcy5nZW5lcmF0ZUJhcnJlbEJlemllclB0cyh3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZKTtcblxuICAgICAgdmFyIGdldEN1cnZlVCA9IGZ1bmN0aW9uIGdldEN1cnZlVCh4LCB5LCBjdXJ2ZVB0cykge1xuICAgICAgICB2YXIgeDAgPSBjdXJ2ZVB0c1s0XTtcbiAgICAgICAgdmFyIHgxID0gY3VydmVQdHNbMl07XG4gICAgICAgIHZhciB4MiA9IGN1cnZlUHRzWzBdO1xuICAgICAgICB2YXIgeTAgPSBjdXJ2ZVB0c1s1XTsgLy8gdmFyIHkxID0gY3VydmVQdHNbIDMgXTtcblxuICAgICAgICB2YXIgeTIgPSBjdXJ2ZVB0c1sxXTtcbiAgICAgICAgdmFyIHhNaW4gPSBNYXRoLm1pbih4MCwgeDIpO1xuICAgICAgICB2YXIgeE1heCA9IE1hdGgubWF4KHgwLCB4Mik7XG4gICAgICAgIHZhciB5TWluID0gTWF0aC5taW4oeTAsIHkyKTtcbiAgICAgICAgdmFyIHlNYXggPSBNYXRoLm1heCh5MCwgeTIpO1xuXG4gICAgICAgIGlmICh4TWluIDw9IHggJiYgeCA8PSB4TWF4ICYmIHlNaW4gPD0geSAmJiB5IDw9IHlNYXgpIHtcbiAgICAgICAgICB2YXIgY29lZmYgPSBiZXppZXJQdHNUb1F1YWRDb2VmZih4MCwgeDEsIHgyKTtcbiAgICAgICAgICB2YXIgcm9vdHMgPSBzb2x2ZVF1YWRyYXRpYyhjb2VmZlswXSwgY29lZmZbMV0sIGNvZWZmWzJdLCB4KTtcbiAgICAgICAgICB2YXIgdmFsaWRSb290cyA9IHJvb3RzLmZpbHRlcihmdW5jdGlvbiAocikge1xuICAgICAgICAgICAgcmV0dXJuIDAgPD0gciAmJiByIDw9IDE7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAodmFsaWRSb290cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsaWRSb290c1swXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG5cbiAgICAgIHZhciBjdXJ2ZVJlZ2lvbnMgPSBPYmplY3Qua2V5cyhiYXJyZWxDdXJ2ZVB0cyk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3VydmVSZWdpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjb3JuZXIgPSBjdXJ2ZVJlZ2lvbnNbaV07XG4gICAgICAgIHZhciBjb3JuZXJQdHMgPSBiYXJyZWxDdXJ2ZVB0c1tjb3JuZXJdO1xuICAgICAgICB2YXIgdCA9IGdldEN1cnZlVCh4LCB5LCBjb3JuZXJQdHMpO1xuXG4gICAgICAgIGlmICh0ID09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB5MCA9IGNvcm5lclB0c1s1XTtcbiAgICAgICAgdmFyIHkxID0gY29ybmVyUHRzWzNdO1xuICAgICAgICB2YXIgeTIgPSBjb3JuZXJQdHNbMV07XG4gICAgICAgIHZhciBiZXpZID0gcWJlemllckF0KHkwLCB5MSwgeTIsIHQpO1xuXG4gICAgICAgIGlmIChjb3JuZXJQdHMuaXNUb3AgJiYgYmV6WSA8PSB5KSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29ybmVyUHRzLmlzQm90dG9tICYmIHkgPD0gYmV6WSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG59O1xuXG5CUnAkMi5nZW5lcmF0ZUJvdHRvbVJvdW5kcmVjdGFuZ2xlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ub2RlU2hhcGVzWydib3R0b20tcm91bmQtcmVjdGFuZ2xlJ10gPSB0aGlzLm5vZGVTaGFwZXNbJ2JvdHRvbXJvdW5kcmVjdGFuZ2xlJ10gPSB7XG4gICAgcmVuZGVyZXI6IHRoaXMsXG4gICAgbmFtZTogJ2JvdHRvbS1yb3VuZC1yZWN0YW5nbGUnLFxuICAgIHBvaW50czogZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDQsIDApLFxuICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKHRoaXMubmFtZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfSxcbiAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZykge1xuICAgICAgdmFyIHRvcFN0YXJ0WCA9IG5vZGVYIC0gKHdpZHRoIC8gMiArIHBhZGRpbmcpO1xuICAgICAgdmFyIHRvcFN0YXJ0WSA9IG5vZGVZIC0gKGhlaWdodCAvIDIgKyBwYWRkaW5nKTtcbiAgICAgIHZhciB0b3BFbmRZID0gdG9wU3RhcnRZO1xuICAgICAgdmFyIHRvcEVuZFggPSBub2RlWCArICh3aWR0aCAvIDIgKyBwYWRkaW5nKTtcbiAgICAgIHZhciB0b3BJbnRlcnNlY3Rpb25zID0gZmluaXRlTGluZXNJbnRlcnNlY3QoeCwgeSwgbm9kZVgsIG5vZGVZLCB0b3BTdGFydFgsIHRvcFN0YXJ0WSwgdG9wRW5kWCwgdG9wRW5kWSwgZmFsc2UpO1xuXG4gICAgICBpZiAodG9wSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiB0b3BJbnRlcnNlY3Rpb25zO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcm91bmRSZWN0YW5nbGVJbnRlcnNlY3RMaW5lKHgsIHksIG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZyk7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkpIHtcbiAgICAgIHZhciBjb3JuZXJSYWRpdXMgPSBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHZhciBkaWFtID0gMiAqIGNvcm5lclJhZGl1czsgLy8gQ2hlY2sgaEJveFxuXG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0IC0gZGlhbSwgWzAsIC0xXSwgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IC8vIENoZWNrIHZCb3hcblxuXG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCAtIGRpYW0sIGhlaWdodCwgWzAsIC0xXSwgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IC8vIGNoZWNrIG5vbi1yb3VuZGVkIHRvcCBzaWRlXG5cblxuICAgICAgdmFyIG91dGVyV2lkdGggPSB3aWR0aCAvIDIgKyAyICogcGFkZGluZztcbiAgICAgIHZhciBvdXRlckhlaWdodCA9IGhlaWdodCAvIDIgKyAyICogcGFkZGluZztcbiAgICAgIHZhciBwb2ludHMgPSBbY2VudGVyWCAtIG91dGVyV2lkdGgsIGNlbnRlclkgLSBvdXRlckhlaWdodCwgY2VudGVyWCAtIG91dGVyV2lkdGgsIGNlbnRlclksIGNlbnRlclggKyBvdXRlcldpZHRoLCBjZW50ZXJZLCBjZW50ZXJYICsgb3V0ZXJXaWR0aCwgY2VudGVyWSAtIG91dGVySGVpZ2h0XTtcblxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBwb2ludHMpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSAvLyBDaGVjayBib3R0b20gcmlnaHQgcXVhcnRlciBjaXJjbGVcblxuXG4gICAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSwgZGlhbSwgZGlhbSwgY2VudGVyWCArIHdpZHRoIC8gMiAtIGNvcm5lclJhZGl1cywgY2VudGVyWSArIGhlaWdodCAvIDIgLSBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSAvLyBDaGVjayBib3R0b20gbGVmdCBxdWFydGVyIGNpcmNsZVxuXG5cbiAgICAgIGlmIChjaGVja0luRWxsaXBzZSh4LCB5LCBkaWFtLCBkaWFtLCBjZW50ZXJYIC0gd2lkdGggLyAyICsgY29ybmVyUmFkaXVzLCBjZW50ZXJZICsgaGVpZ2h0IC8gMiAtIGNvcm5lclJhZGl1cywgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG59O1xuXG5CUnAkMi5yZWdpc3Rlck5vZGVTaGFwZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBub2RlU2hhcGVzID0gdGhpcy5ub2RlU2hhcGVzID0ge307XG4gIHZhciByZW5kZXJlciA9IHRoaXM7XG4gIHRoaXMuZ2VuZXJhdGVFbGxpcHNlKCk7XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCd0cmlhbmdsZScsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSgzLCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLXRyaWFuZ2xlJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDMsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3JlY3RhbmdsZScsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg0LCAwKSk7XG4gIG5vZGVTaGFwZXNbJ3NxdWFyZSddID0gbm9kZVNoYXBlc1sncmVjdGFuZ2xlJ107XG4gIHRoaXMuZ2VuZXJhdGVSb3VuZFJlY3RhbmdsZSgpO1xuICB0aGlzLmdlbmVyYXRlQ3V0UmVjdGFuZ2xlKCk7XG4gIHRoaXMuZ2VuZXJhdGVCYXJyZWwoKTtcbiAgdGhpcy5nZW5lcmF0ZUJvdHRvbVJvdW5kcmVjdGFuZ2xlKCk7XG4gIHtcbiAgICB2YXIgZGlhbW9uZFBvaW50cyA9IFswLCAxLCAxLCAwLCAwLCAtMSwgLTEsIDBdO1xuICAgIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdkaWFtb25kJywgZGlhbW9uZFBvaW50cyk7XG4gICAgdGhpcy5nZW5lcmF0ZVJvdW5kUG9seWdvbigncm91bmQtZGlhbW9uZCcsIGRpYW1vbmRQb2ludHMpO1xuICB9XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdwZW50YWdvbicsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg1LCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLXBlbnRhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDUsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ2hleGFnb24nLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNiwgMCkpO1xuICB0aGlzLmdlbmVyYXRlUm91bmRQb2x5Z29uKCdyb3VuZC1oZXhhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDYsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ2hlcHRhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDcsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVJvdW5kUG9seWdvbigncm91bmQtaGVwdGFnb24nLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNywgMCkpO1xuICB0aGlzLmdlbmVyYXRlUG9seWdvbignb2N0YWdvbicsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg4LCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLW9jdGFnb24nLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoOCwgMCkpO1xuICB2YXIgc3RhcjVQb2ludHMgPSBuZXcgQXJyYXkoMjApO1xuICB7XG4gICAgdmFyIG91dGVyUG9pbnRzID0gZ2VuZXJhdGVVbml0TmdvblBvaW50cyg1LCAwKTtcbiAgICB2YXIgaW5uZXJQb2ludHMgPSBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzKDUsIE1hdGguUEkgLyA1KTsgLy8gT3V0ZXIgcmFkaXVzIGlzIDE7IGlubmVyIHJhZGl1cyBvZiBzdGFyIGlzIHNtYWxsZXJcblxuICAgIHZhciBpbm5lclJhZGl1cyA9IDAuNSAqICgzIC0gTWF0aC5zcXJ0KDUpKTtcbiAgICBpbm5lclJhZGl1cyAqPSAxLjU3O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbm5lclBvaW50cy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICAgIGlubmVyUG9pbnRzW2kgKiAyXSAqPSBpbm5lclJhZGl1cztcbiAgICAgIGlubmVyUG9pbnRzW2kgKiAyICsgMV0gKj0gaW5uZXJSYWRpdXM7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyMCAvIDQ7IGkrKykge1xuICAgICAgc3RhcjVQb2ludHNbaSAqIDRdID0gb3V0ZXJQb2ludHNbaSAqIDJdO1xuICAgICAgc3RhcjVQb2ludHNbaSAqIDQgKyAxXSA9IG91dGVyUG9pbnRzW2kgKiAyICsgMV07XG4gICAgICBzdGFyNVBvaW50c1tpICogNCArIDJdID0gaW5uZXJQb2ludHNbaSAqIDJdO1xuICAgICAgc3RhcjVQb2ludHNbaSAqIDQgKyAzXSA9IGlubmVyUG9pbnRzW2kgKiAyICsgMV07XG4gICAgfVxuICB9XG4gIHN0YXI1UG9pbnRzID0gZml0UG9seWdvblRvU3F1YXJlKHN0YXI1UG9pbnRzKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3N0YXInLCBzdGFyNVBvaW50cyk7XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCd2ZWUnLCBbLTEsIC0xLCAwLCAtMC4zMzMsIDEsIC0xLCAwLCAxXSk7XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdyaG9tYm9pZCcsIFstMSwgLTEsIDAuMzMzLCAtMSwgMSwgMSwgLTAuMzMzLCAxXSk7XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdyaWdodC1yaG9tYm9pZCcsIFstMC4zMzMsIC0xLCAxLCAtMSwgMC4zMzMsIDEsIC0xLCAxXSk7XG4gIHRoaXMubm9kZVNoYXBlc1snY29uY2F2ZWhleGFnb24nXSA9IHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdjb25jYXZlLWhleGFnb24nLCBbLTEsIC0wLjk1LCAtMC43NSwgMCwgLTEsIDAuOTUsIDEsIDAuOTUsIDAuNzUsIDAsIDEsIC0wLjk1XSk7XG4gIHtcbiAgICB2YXIgdGFnUG9pbnRzID0gWy0xLCAtMSwgMC4yNSwgLTEsIDEsIDAsIDAuMjUsIDEsIC0xLCAxXTtcbiAgICB0aGlzLmdlbmVyYXRlUG9seWdvbigndGFnJywgdGFnUG9pbnRzKTtcbiAgICB0aGlzLmdlbmVyYXRlUm91bmRQb2x5Z29uKCdyb3VuZC10YWcnLCB0YWdQb2ludHMpO1xuICB9XG5cbiAgbm9kZVNoYXBlcy5tYWtlUG9seWdvbiA9IGZ1bmN0aW9uIChwb2ludHMpIHtcbiAgICAvLyB1c2UgY2FjaGluZyBvbiB1c2VyLXNwZWNpZmllZCBwb2x5Z29ucyBzbyB0aGV5IGFyZSBhcyBmYXN0IGFzIG5hdGl2ZSBzaGFwZXNcbiAgICB2YXIga2V5ID0gcG9pbnRzLmpvaW4oJyQnKTtcbiAgICB2YXIgbmFtZSA9ICdwb2x5Z29uLScgKyBrZXk7XG4gICAgdmFyIHNoYXBlO1xuXG4gICAgaWYgKHNoYXBlID0gdGhpc1tuYW1lXSkge1xuICAgICAgLy8gZ290IGNhY2hlZCBzaGFwZVxuICAgICAgcmV0dXJuIHNoYXBlO1xuICAgIH0gLy8gY3JlYXRlIGFuZCBjYWNoZSBuZXcgc2hhcGVcblxuXG4gICAgcmV0dXJuIHJlbmRlcmVyLmdlbmVyYXRlUG9seWdvbihuYW1lLCBwb2ludHMpO1xuICB9O1xufTtcblxudmFyIEJScCQxID0ge307XG5cbkJScCQxLnRpbWVUb1JlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucmVkcmF3VG90YWxUaW1lIC8gdGhpcy5yZWRyYXdDb3VudDtcbn07XG5cbkJScCQxLnJlZHJhdyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHN0YXRpY0VtcHR5T2JqZWN0KCk7XG4gIHZhciByID0gdGhpcztcblxuICBpZiAoci5hdmVyYWdlUmVkcmF3VGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgci5hdmVyYWdlUmVkcmF3VGltZSA9IDA7XG4gIH1cblxuICBpZiAoci5sYXN0UmVkcmF3VGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgci5sYXN0UmVkcmF3VGltZSA9IDA7XG4gIH1cblxuICBpZiAoci5sYXN0RHJhd1RpbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHIubGFzdERyYXdUaW1lID0gMDtcbiAgfVxuXG4gIHIucmVxdWVzdGVkRnJhbWUgPSB0cnVlO1xuICByLnJlbmRlck9wdGlvbnMgPSBvcHRpb25zO1xufTtcblxuQlJwJDEuYmVmb3JlUmVuZGVyID0gZnVuY3Rpb24gKGZuLCBwcmlvcml0eSkge1xuICAvLyB0aGUgcmVuZGVyZXIgY2FuJ3QgYWRkIHRpY2sgY2FsbGJhY2tzIHdoZW4gZGVzdHJveWVkXG4gIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChwcmlvcml0eSA9PSBudWxsKSB7XG4gICAgZXJyb3IoJ1ByaW9yaXR5IGlzIG5vdCBvcHRpb25hbCBmb3IgYmVmb3JlUmVuZGVyJyk7XG4gIH1cblxuICB2YXIgY2JzID0gdGhpcy5iZWZvcmVSZW5kZXJDYWxsYmFja3M7XG4gIGNicy5wdXNoKHtcbiAgICBmbjogZm4sXG4gICAgcHJpb3JpdHk6IHByaW9yaXR5XG4gIH0pOyAvLyBoaWdoZXIgcHJpb3JpdHkgY2FsbGJhY2tzIGV4ZWN1dGVkIGZpcnN0XG5cbiAgY2JzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYi5wcmlvcml0eSAtIGEucHJpb3JpdHk7XG4gIH0pO1xufTtcblxudmFyIGJlZm9yZVJlbmRlckNhbGxiYWNrcyA9IGZ1bmN0aW9uIGJlZm9yZVJlbmRlckNhbGxiYWNrcyhyLCB3aWxsRHJhdywgc3RhcnRUaW1lKSB7XG4gIHZhciBjYnMgPSByLmJlZm9yZVJlbmRlckNhbGxiYWNrcztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNicy5sZW5ndGg7IGkrKykge1xuICAgIGNic1tpXS5mbih3aWxsRHJhdywgc3RhcnRUaW1lKTtcbiAgfVxufTtcblxuQlJwJDEuc3RhcnRSZW5kZXJMb29wID0gZnVuY3Rpb24gKCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjeSA9IHIuY3k7XG5cbiAgaWYgKHIucmVuZGVyTG9vcFN0YXJ0ZWQpIHtcbiAgICByZXR1cm47XG4gIH0gZWxzZSB7XG4gICAgci5yZW5kZXJMb29wU3RhcnRlZCA9IHRydWU7XG4gIH1cblxuICB2YXIgcmVuZGVyRm4gPSBmdW5jdGlvbiByZW5kZXJGbihyZXF1ZXN0VGltZSkge1xuICAgIGlmIChyLmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjeS5iYXRjaGluZygpKSA7IGVsc2UgaWYgKHIucmVxdWVzdGVkRnJhbWUgJiYgIXIuc2tpcEZyYW1lKSB7XG4gICAgICBiZWZvcmVSZW5kZXJDYWxsYmFja3MociwgdHJ1ZSwgcmVxdWVzdFRpbWUpO1xuICAgICAgdmFyIHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gICAgICByLnJlbmRlcihyLnJlbmRlck9wdGlvbnMpO1xuICAgICAgdmFyIGVuZFRpbWUgPSByLmxhc3REcmF3VGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG5cbiAgICAgIGlmIChyLmF2ZXJhZ2VSZWRyYXdUaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgci5hdmVyYWdlUmVkcmF3VGltZSA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChyLnJlZHJhd0NvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgci5yZWRyYXdDb3VudCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHIucmVkcmF3Q291bnQrKztcblxuICAgICAgaWYgKHIucmVkcmF3VG90YWxUaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgci5yZWRyYXdUb3RhbFRpbWUgPSAwO1xuICAgICAgfVxuXG4gICAgICB2YXIgZHVyYXRpb24gPSBlbmRUaW1lIC0gc3RhcnRUaW1lO1xuICAgICAgci5yZWRyYXdUb3RhbFRpbWUgKz0gZHVyYXRpb247XG4gICAgICByLmxhc3RSZWRyYXdUaW1lID0gZHVyYXRpb247IC8vIHVzZSBhIHdlaWdodGVkIGF2ZXJhZ2Ugd2l0aCBhIGJpYXMgZnJvbSB0aGUgcHJldmlvdXMgYXZlcmFnZSBzbyB3ZSBkb24ndCBzcGlrZSBzbyBlYXNpbHlcblxuICAgICAgci5hdmVyYWdlUmVkcmF3VGltZSA9IHIuYXZlcmFnZVJlZHJhd1RpbWUgLyAyICsgZHVyYXRpb24gLyAyO1xuICAgICAgci5yZXF1ZXN0ZWRGcmFtZSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBiZWZvcmVSZW5kZXJDYWxsYmFja3MociwgZmFsc2UsIHJlcXVlc3RUaW1lKTtcbiAgICB9XG5cbiAgICByLnNraXBGcmFtZSA9IGZhbHNlO1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShyZW5kZXJGbik7XG4gIH07XG5cbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlbmRlckZuKTtcbn07XG5cbnZhciBCYXNlUmVuZGVyZXIgPSBmdW5jdGlvbiBCYXNlUmVuZGVyZXIob3B0aW9ucykge1xuICB0aGlzLmluaXQob3B0aW9ucyk7XG59O1xuXG52YXIgQlIgPSBCYXNlUmVuZGVyZXI7XG52YXIgQlJwID0gQlIucHJvdG90eXBlO1xuQlJwLmNsaWVudEZ1bmN0aW9ucyA9IFsncmVkcmF3SGludCcsICdyZW5kZXInLCAncmVuZGVyVG8nLCAnbWF0Y2hDYW52YXNTaXplJywgJ25vZGVTaGFwZUltcGwnLCAnYXJyb3dTaGFwZUltcGwnXTtcblxuQlJwLmluaXQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICB2YXIgciA9IHRoaXM7XG4gIHIub3B0aW9ucyA9IG9wdGlvbnM7XG4gIHIuY3kgPSBvcHRpb25zLmN5O1xuICB2YXIgY3RyID0gci5jb250YWluZXIgPSBvcHRpb25zLmN5LmNvbnRhaW5lcigpOyAvLyBwcmVwZW5kIGEgc3R5bGVzaGVldCBpbiB0aGUgaGVhZCBzdWNoIHRoYXRcblxuICBpZiAod2luZG93JDEpIHtcbiAgICB2YXIgZG9jdW1lbnQgPSB3aW5kb3ckMS5kb2N1bWVudDtcbiAgICB2YXIgaGVhZCA9IGRvY3VtZW50LmhlYWQ7XG4gICAgdmFyIHN0eWxlc2hlZXRJZCA9ICdfX19fX19fX19fY3l0b3NjYXBlX3N0eWxlc2hlZXQnO1xuICAgIHZhciBjbGFzc05hbWUgPSAnX19fX19fX19fX2N5dG9zY2FwZV9jb250YWluZXInO1xuICAgIHZhciBzdHlsZXNoZWV0QWxyZWFkeUV4aXN0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN0eWxlc2hlZXRJZCkgIT0gbnVsbDtcblxuICAgIGlmIChjdHIuY2xhc3NOYW1lLmluZGV4T2YoY2xhc3NOYW1lKSA8IDApIHtcbiAgICAgIGN0ci5jbGFzc05hbWUgPSAoY3RyLmNsYXNzTmFtZSB8fCAnJykgKyAnICcgKyBjbGFzc05hbWU7XG4gICAgfVxuXG4gICAgaWYgKCFzdHlsZXNoZWV0QWxyZWFkeUV4aXN0cykge1xuICAgICAgdmFyIHN0eWxlc2hlZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgc3R5bGVzaGVldC5pZCA9IHN0eWxlc2hlZXRJZDtcbiAgICAgIHN0eWxlc2hlZXQudGV4dENvbnRlbnQgPSAnLicgKyBjbGFzc05hbWUgKyAnIHsgcG9zaXRpb246IHJlbGF0aXZlOyB9JztcbiAgICAgIGhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlc2hlZXQsIGhlYWQuY2hpbGRyZW5bMF0pOyAvLyBmaXJzdCBzbyBsb3dlc3QgcHJpb3JpdHlcbiAgICB9XG5cbiAgICB2YXIgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdyQxLmdldENvbXB1dGVkU3R5bGUoY3RyKTtcbiAgICB2YXIgcG9zaXRpb24gPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3Bvc2l0aW9uJyk7XG5cbiAgICBpZiAocG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XG4gICAgICB3YXJuKCdBIEN5dG9zY2FwZSBjb250YWluZXIgaGFzIHN0eWxlIHBvc2l0aW9uOnN0YXRpYyBhbmQgc28gY2FuIG5vdCB1c2UgVUkgZXh0ZW5zaW9ucyBwcm9wZXJseScpO1xuICAgIH1cbiAgfVxuXG4gIHIuc2VsZWN0aW9uID0gW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF07IC8vIENvb3JkaW5hdGVzIGZvciBzZWxlY3Rpb24gYm94LCBwbHVzIGVuYWJsZWQgZmxhZ1xuXG4gIHIuYmV6aWVyUHJvalBjdHMgPSBbMC4wNSwgMC4yMjUsIDAuNCwgMC41LCAwLjYsIDAuNzc1LCAwLjk1XTsgLy8tLVBvaW50ZXItcmVsYXRlZCBkYXRhXG5cbiAgci5ob3ZlckRhdGEgPSB7XG4gICAgZG93bjogbnVsbCxcbiAgICBsYXN0OiBudWxsLFxuICAgIGRvd25UaW1lOiBudWxsLFxuICAgIHRyaWdnZXJNb2RlOiBudWxsLFxuICAgIGRyYWdnaW5nOiBmYWxzZSxcbiAgICBpbml0aWFsUGFuOiBbbnVsbCwgbnVsbF0sXG4gICAgY2FwdHVyZTogZmFsc2VcbiAgfTtcbiAgci5kcmFnRGF0YSA9IHtcbiAgICBwb3NzaWJsZURyYWdFbGVtZW50czogW11cbiAgfTtcbiAgci50b3VjaERhdGEgPSB7XG4gICAgc3RhcnQ6IG51bGwsXG4gICAgY2FwdHVyZTogZmFsc2UsXG4gICAgLy8gVGhlc2UgMyBmaWVsZHMgcmVsYXRlZCB0byB0YXAsIHRhcGhvbGQgZXZlbnRzXG4gICAgc3RhcnRQb3NpdGlvbjogW251bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGxdLFxuICAgIHNpbmdsZVRvdWNoU3RhcnRUaW1lOiBudWxsLFxuICAgIHNpbmdsZVRvdWNoTW92ZWQ6IHRydWUsXG4gICAgbm93OiBbbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbF0sXG4gICAgZWFybGllcjogW251bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGxdXG4gIH07XG4gIHIucmVkcmF3cyA9IDA7XG4gIHIuc2hvd0ZwcyA9IG9wdGlvbnMuc2hvd0ZwcztcbiAgci5kZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG4gIHIuaGlkZUVkZ2VzT25WaWV3cG9ydCA9IG9wdGlvbnMuaGlkZUVkZ2VzT25WaWV3cG9ydDtcbiAgci50ZXh0dXJlT25WaWV3cG9ydCA9IG9wdGlvbnMudGV4dHVyZU9uVmlld3BvcnQ7XG4gIHIud2hlZWxTZW5zaXRpdml0eSA9IG9wdGlvbnMud2hlZWxTZW5zaXRpdml0eTtcbiAgci5tb3Rpb25CbHVyRW5hYmxlZCA9IG9wdGlvbnMubW90aW9uQmx1cjsgLy8gb24gYnkgZGVmYXVsdFxuXG4gIHIuZm9yY2VkUGl4ZWxSYXRpbyA9IG51bWJlciQxKG9wdGlvbnMucGl4ZWxSYXRpbykgPyBvcHRpb25zLnBpeGVsUmF0aW8gOiBudWxsO1xuICByLm1vdGlvbkJsdXIgPSBvcHRpb25zLm1vdGlvbkJsdXI7IC8vIGZvciBpbml0aWFsIGtpY2sgb2ZmXG5cbiAgci5tb3Rpb25CbHVyT3BhY2l0eSA9IG9wdGlvbnMubW90aW9uQmx1ck9wYWNpdHk7XG4gIHIubW90aW9uQmx1clRyYW5zcGFyZW5jeSA9IDEgLSByLm1vdGlvbkJsdXJPcGFjaXR5O1xuICByLm1vdGlvbkJsdXJQeFJhdGlvID0gMTtcbiAgci5tYlB4UkJsdXJyeSA9IDE7IC8vMC44O1xuXG4gIHIubWluTWJMb3dRdWFsRnJhbWVzID0gNDtcbiAgci5mdWxsUXVhbGl0eU1iID0gZmFsc2U7XG4gIHIuY2xlYXJlZEZvck1vdGlvbkJsdXIgPSBbXTtcbiAgci5kZXNrdG9wVGFwVGhyZXNob2xkID0gb3B0aW9ucy5kZXNrdG9wVGFwVGhyZXNob2xkO1xuICByLmRlc2t0b3BUYXBUaHJlc2hvbGQyID0gb3B0aW9ucy5kZXNrdG9wVGFwVGhyZXNob2xkICogb3B0aW9ucy5kZXNrdG9wVGFwVGhyZXNob2xkO1xuICByLnRvdWNoVGFwVGhyZXNob2xkID0gb3B0aW9ucy50b3VjaFRhcFRocmVzaG9sZDtcbiAgci50b3VjaFRhcFRocmVzaG9sZDIgPSBvcHRpb25zLnRvdWNoVGFwVGhyZXNob2xkICogb3B0aW9ucy50b3VjaFRhcFRocmVzaG9sZDtcbiAgci50YXBob2xkRHVyYXRpb24gPSA1MDA7XG4gIHIuYmluZGluZ3MgPSBbXTtcbiAgci5iZWZvcmVSZW5kZXJDYWxsYmFja3MgPSBbXTtcbiAgci5iZWZvcmVSZW5kZXJQcmlvcml0aWVzID0ge1xuICAgIC8vIGhpZ2hlciBwcmlvcml0eSBleGVjcyBiZWZvcmUgbG93ZXIgb25lXG4gICAgYW5pbWF0aW9uczogNDAwLFxuICAgIGVsZUNhbGNzOiAzMDAsXG4gICAgZWxlVHhyRGVxOiAyMDAsXG4gICAgbHlyVHhyRGVxOiAxNTAsXG4gICAgbHlyVHhyU2tpcDogMTAwXG4gIH07XG4gIHIucmVnaXN0ZXJOb2RlU2hhcGVzKCk7XG4gIHIucmVnaXN0ZXJBcnJvd1NoYXBlcygpO1xuICByLnJlZ2lzdGVyQ2FsY3VsYXRpb25MaXN0ZW5lcnMoKTtcbn07XG5cbkJScC5ub3RpZnkgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBlbGVzKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGN5ID0gci5jeTsgLy8gdGhlIHJlbmRlcmVyIGNhbid0IGJlIG5vdGlmaWVkIGFmdGVyIGl0J3MgZGVzdHJveWVkXG5cbiAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGV2ZW50TmFtZSA9PT0gJ2luaXQnKSB7XG4gICAgci5sb2FkKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGV2ZW50TmFtZSA9PT0gJ2Rlc3Ryb3knKSB7XG4gICAgci5kZXN0cm95KCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGV2ZW50TmFtZSA9PT0gJ2FkZCcgfHwgZXZlbnROYW1lID09PSAncmVtb3ZlJyB8fCBldmVudE5hbWUgPT09ICdtb3ZlJyAmJiBjeS5oYXNDb21wb3VuZE5vZGVzKCkgfHwgZXZlbnROYW1lID09PSAnbG9hZCcgfHwgZXZlbnROYW1lID09PSAnem9yZGVyJyB8fCBldmVudE5hbWUgPT09ICdtb3VudCcpIHtcbiAgICByLmludmFsaWRhdGVDYWNoZWRaU29ydGVkRWxlcygpO1xuICB9XG5cbiAgaWYgKGV2ZW50TmFtZSA9PT0gJ3ZpZXdwb3J0Jykge1xuICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gIH1cblxuICBpZiAoZXZlbnROYW1lID09PSAnbG9hZCcgfHwgZXZlbnROYW1lID09PSAncmVzaXplJyB8fCBldmVudE5hbWUgPT09ICdtb3VudCcpIHtcbiAgICByLmludmFsaWRhdGVDb250YWluZXJDbGllbnRDb29yZHNDYWNoZSgpO1xuICAgIHIubWF0Y2hDYW52YXNTaXplKHIuY29udGFpbmVyKTtcbiAgfVxuXG4gIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgdGhpcy5zdGFydFJlbmRlckxvb3AoKTtcbiAgdGhpcy5yZWRyYXcoKTtcbn07XG5cbkJScC5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHIuZGVzdHJveWVkID0gdHJ1ZTtcbiAgci5jeS5zdG9wQW5pbWF0aW9uTG9vcCgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgci5iaW5kaW5ncy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBiaW5kaW5nID0gci5iaW5kaW5nc1tpXTtcbiAgICB2YXIgYiA9IGJpbmRpbmc7XG4gICAgdmFyIHRndCA9IGIudGFyZ2V0O1xuICAgICh0Z3Qub2ZmIHx8IHRndC5yZW1vdmVFdmVudExpc3RlbmVyKS5hcHBseSh0Z3QsIGIuYXJncyk7XG4gIH1cblxuICByLmJpbmRpbmdzID0gW107XG4gIHIuYmVmb3JlUmVuZGVyQ2FsbGJhY2tzID0gW107XG4gIHIub25VcGRhdGVFbGVDYWxjc0ZucyA9IFtdO1xuXG4gIGlmIChyLnJlbW92ZU9ic2VydmVyKSB7XG4gICAgci5yZW1vdmVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gIH1cblxuICBpZiAoci5zdHlsZU9ic2VydmVyKSB7XG4gICAgci5zdHlsZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIGlmIChyLnJlc2l6ZU9ic2VydmVyKSB7XG4gICAgci5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gIH1cblxuICBpZiAoci5sYWJlbENhbGNEaXYpIHtcbiAgICB0cnkge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChyLmxhYmVsQ2FsY0Rpdik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICB9IGNhdGNoIChlKSB7Ly8gaWUxMCBpc3N1ZSAjMTAxNFxuICAgIH1cbiAgfVxufTtcblxuQlJwLmlzSGVhZGxlc3MgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbltCUnAkZiwgQlJwJDUsIEJScCQ0LCBCUnAkMywgQlJwJDIsIEJScCQxXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoQlJwLCBwcm9wcyk7XG59KTtcblxudmFyIGZ1bGxGcHNUaW1lID0gMTAwMCAvIDYwOyAvLyBhc3N1bWUgNjAgZnJhbWVzIHBlciBzZWNvbmRcblxudmFyIGRlZnMgPSB7XG4gIHNldHVwRGVxdWV1ZWluZzogZnVuY3Rpb24gc2V0dXBEZXF1ZXVlaW5nKG9wdHMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gc2V0dXBEZXF1ZXVlaW5nSW1wbCgpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciByID0gdGhpcy5yZW5kZXJlcjtcblxuICAgICAgaWYgKHNlbGYuZGVxdWV1ZWluZ1NldHVwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYuZGVxdWV1ZWluZ1NldHVwID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHF1ZXVlUmVkcmF3ID0gZGVib3VuY2VfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICByLnJlZHJhdygpO1xuICAgICAgfSwgb3B0cy5kZXFSZWRyYXdUaHJlc2hvbGQpO1xuXG4gICAgICB2YXIgZGVxdWV1ZSA9IGZ1bmN0aW9uIGRlcXVldWUod2lsbERyYXcsIGZyYW1lU3RhcnRUaW1lKSB7XG4gICAgICAgIHZhciBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZU5vdygpO1xuICAgICAgICB2YXIgYXZnUmVuZGVyVGltZSA9IHIuYXZlcmFnZVJlZHJhd1RpbWU7XG4gICAgICAgIHZhciByZW5kZXJUaW1lID0gci5sYXN0UmVkcmF3VGltZTtcbiAgICAgICAgdmFyIGRlcWQgPSBbXTtcbiAgICAgICAgdmFyIGV4dGVudCA9IHIuY3kuZXh0ZW50KCk7XG4gICAgICAgIHZhciBwaXhlbFJhdGlvID0gci5nZXRQaXhlbFJhdGlvKCk7IC8vIGlmIHdlIGFyZW4ndCBpbiBhIHRpY2sgdGhhdCBjYXVzZXMgYSBkcmF3LCB0aGVuIHRoZSByZW5kZXJlZCBzdHlsZVxuICAgICAgICAvLyBxdWV1ZSB3b24ndCBhdXRvbWF0aWNhbGx5IGJlIGZsdXNoZWQgYmVmb3JlIGRlcXVldWVpbmcgc3RhcnRzXG5cbiAgICAgICAgaWYgKCF3aWxsRHJhdykge1xuICAgICAgICAgIHIuZmx1c2hSZW5kZXJlZFN0eWxlUXVldWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgICAgICAgICB2YXIgbm93ID0gcGVyZm9ybWFuY2VOb3coKTtcbiAgICAgICAgICB2YXIgZHVyYXRpb24gPSBub3cgLSBzdGFydFRpbWU7XG4gICAgICAgICAgdmFyIGZyYW1lRHVyYXRpb24gPSBub3cgLSBmcmFtZVN0YXJ0VGltZTtcblxuICAgICAgICAgIGlmIChyZW5kZXJUaW1lIDwgZnVsbEZwc1RpbWUpIHtcbiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHJlbmRlcmluZyBmYXN0ZXIgdGhhbiB0aGUgaWRlYWwgZnBzLCB0aGVuIGRvIGRlcXVldWVpbmdcbiAgICAgICAgICAgIC8vIGR1cmluZyBhbGwgb2YgdGhlIHJlbWFpbmluZyBmcmFtZSB0aW1lXG4gICAgICAgICAgICB2YXIgdGltZUF2YWlsYWJsZSA9IGZ1bGxGcHNUaW1lIC0gKHdpbGxEcmF3ID8gYXZnUmVuZGVyVGltZSA6IDApO1xuXG4gICAgICAgICAgICBpZiAoZnJhbWVEdXJhdGlvbiA+PSBvcHRzLmRlcUZhc3RDb3N0ICogdGltZUF2YWlsYWJsZSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHdpbGxEcmF3KSB7XG4gICAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+PSBvcHRzLmRlcUNvc3QgKiByZW5kZXJUaW1lIHx8IGR1cmF0aW9uID49IG9wdHMuZGVxQXZnQ29zdCAqIGF2Z1JlbmRlclRpbWUpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChmcmFtZUR1cmF0aW9uID49IG9wdHMuZGVxTm9EcmF3Q29zdCAqIGZ1bGxGcHNUaW1lKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciB0aGlzRGVxZCA9IG9wdHMuZGVxKHNlbGYsIHBpeGVsUmF0aW8sIGV4dGVudCk7XG5cbiAgICAgICAgICBpZiAodGhpc0RlcWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzRGVxZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBkZXFkLnB1c2godGhpc0RlcWRbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gY2FsbGJhY2tzIG9uIGRlcXVldWVcblxuXG4gICAgICAgIGlmIChkZXFkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBvcHRzLm9uRGVxZChzZWxmLCBkZXFkKTtcblxuICAgICAgICAgIGlmICghd2lsbERyYXcgJiYgb3B0cy5zaG91bGRSZWRyYXcoc2VsZiwgZGVxZCwgcGl4ZWxSYXRpbywgZXh0ZW50KSkge1xuICAgICAgICAgICAgcXVldWVSZWRyYXcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHZhciBwcmlvcml0eSA9IG9wdHMucHJpb3JpdHkgfHwgbm9vcCQxO1xuICAgICAgci5iZWZvcmVSZW5kZXIoZGVxdWV1ZSwgcHJpb3JpdHkoc2VsZikpO1xuICAgIH07XG4gIH1cbn07XG5cbi8vIFVzZXMga2V5cyBzbyBlbGVtZW50cyBtYXkgc2hhcmUgdGhlIHNhbWUgY2FjaGUuXG5cbnZhciBFbGVtZW50VGV4dHVyZUNhY2hlTG9va3VwID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRWxlbWVudFRleHR1cmVDYWNoZUxvb2t1cChnZXRLZXkpIHtcbiAgICB2YXIgZG9lc0VsZUludmFsaWRhdGVLZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNpZnk7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRWxlbWVudFRleHR1cmVDYWNoZUxvb2t1cCk7XG5cbiAgICB0aGlzLmlkc0J5S2V5ID0gbmV3IE1hcCQxKCk7XG4gICAgdGhpcy5rZXlGb3JJZCA9IG5ldyBNYXAkMSgpO1xuICAgIHRoaXMuY2FjaGVzQnlMdmwgPSBuZXcgTWFwJDEoKTtcbiAgICB0aGlzLmx2bHMgPSBbXTtcbiAgICB0aGlzLmdldEtleSA9IGdldEtleTtcbiAgICB0aGlzLmRvZXNFbGVJbnZhbGlkYXRlS2V5ID0gZG9lc0VsZUludmFsaWRhdGVLZXk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRWxlbWVudFRleHR1cmVDYWNoZUxvb2t1cCwgW3tcbiAgICBrZXk6IFwiZ2V0SWRzRm9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldElkc0ZvcihrZXkpIHtcbiAgICAgIGlmIChrZXkgPT0gbnVsbCkge1xuICAgICAgICBlcnJvcihcIkNhbiBub3QgZ2V0IGlkIGxpc3QgZm9yIG51bGwga2V5XCIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaWRzQnlLZXkgPSB0aGlzLmlkc0J5S2V5O1xuICAgICAgdmFyIGlkcyA9IHRoaXMuaWRzQnlLZXkuZ2V0KGtleSk7XG5cbiAgICAgIGlmICghaWRzKSB7XG4gICAgICAgIGlkcyA9IG5ldyBTZXQkMSgpO1xuICAgICAgICBpZHNCeUtleS5zZXQoa2V5LCBpZHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaWRzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRJZEZvcktleVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRJZEZvcktleShrZXksIGlkKSB7XG4gICAgICBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5nZXRJZHNGb3Ioa2V5KS5hZGQoaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZWxldGVJZEZvcktleVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWxldGVJZEZvcktleShrZXksIGlkKSB7XG4gICAgICBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5nZXRJZHNGb3Ioa2V5KVtcImRlbGV0ZVwiXShpZCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldE51bWJlck9mSWRzRm9yS2V5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE51bWJlck9mSWRzRm9yS2V5KGtleSkge1xuICAgICAgaWYgKGtleSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SWRzRm9yKGtleSkuc2l6ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXBkYXRlS2V5TWFwcGluZ0ZvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVLZXlNYXBwaW5nRm9yKGVsZSkge1xuICAgICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgICB2YXIgcHJldktleSA9IHRoaXMua2V5Rm9ySWQuZ2V0KGlkKTtcbiAgICAgIHZhciBjdXJyS2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgICAgIHRoaXMuZGVsZXRlSWRGb3JLZXkocHJldktleSwgaWQpO1xuICAgICAgdGhpcy5hZGRJZEZvcktleShjdXJyS2V5LCBpZCk7XG4gICAgICB0aGlzLmtleUZvcklkLnNldChpZCwgY3VycktleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZUtleU1hcHBpbmdGb3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVsZXRlS2V5TWFwcGluZ0ZvcihlbGUpIHtcbiAgICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuICAgICAgdmFyIHByZXZLZXkgPSB0aGlzLmtleUZvcklkLmdldChpZCk7XG4gICAgICB0aGlzLmRlbGV0ZUlkRm9yS2V5KHByZXZLZXksIGlkKTtcbiAgICAgIHRoaXMua2V5Rm9ySWRbXCJkZWxldGVcIl0oaWQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJrZXlIYXNDaGFuZ2VkRm9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGtleUhhc0NoYW5nZWRGb3IoZWxlKSB7XG4gICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICAgIHZhciBwcmV2S2V5ID0gdGhpcy5rZXlGb3JJZC5nZXQoaWQpO1xuICAgICAgdmFyIG5ld0tleSA9IHRoaXMuZ2V0S2V5KGVsZSk7XG4gICAgICByZXR1cm4gcHJldktleSAhPT0gbmV3S2V5O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc0ludmFsaWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNJbnZhbGlkKGVsZSkge1xuICAgICAgcmV0dXJuIHRoaXMua2V5SGFzQ2hhbmdlZEZvcihlbGUpIHx8IHRoaXMuZG9lc0VsZUludmFsaWRhdGVLZXkoZWxlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q2FjaGVzQXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q2FjaGVzQXQobHZsKSB7XG4gICAgICB2YXIgY2FjaGVzQnlMdmwgPSB0aGlzLmNhY2hlc0J5THZsLFxuICAgICAgICAgIGx2bHMgPSB0aGlzLmx2bHM7XG4gICAgICB2YXIgY2FjaGVzID0gY2FjaGVzQnlMdmwuZ2V0KGx2bCk7XG5cbiAgICAgIGlmICghY2FjaGVzKSB7XG4gICAgICAgIGNhY2hlcyA9IG5ldyBNYXAkMSgpO1xuICAgICAgICBjYWNoZXNCeUx2bC5zZXQobHZsLCBjYWNoZXMpO1xuICAgICAgICBsdmxzLnB1c2gobHZsKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNhY2hlcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q2FjaGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q2FjaGUoa2V5LCBsdmwpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldENhY2hlc0F0KGx2bCkuZ2V0KGtleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoZWxlLCBsdmwpIHtcbiAgICAgIHZhciBrZXkgPSB0aGlzLmdldEtleShlbGUpO1xuICAgICAgdmFyIGNhY2hlID0gdGhpcy5nZXRDYWNoZShrZXksIGx2bCk7IC8vIGdldHRpbmcgZm9yIGFuIGVsZW1lbnQgbWF5IG5lZWQgdG8gYWRkIHRvIHRoZSBpZCBsaXN0IGIvYyBlbGVzIGNhbiBzaGFyZSBrZXlzXG5cbiAgICAgIGlmIChjYWNoZSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMudXBkYXRlS2V5TWFwcGluZ0ZvcihlbGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2FjaGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEZvckNhY2hlZEtleVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRGb3JDYWNoZWRLZXkoZWxlLCBsdmwpIHtcbiAgICAgIHZhciBrZXkgPSB0aGlzLmtleUZvcklkLmdldChlbGUuaWQoKSk7IC8vIG4uYi4gdXNlIGNhY2hlZCBrZXksIG5vdCBuZXdseSBjb21wdXRlZCBrZXlcblxuICAgICAgdmFyIGNhY2hlID0gdGhpcy5nZXRDYWNoZShrZXksIGx2bCk7XG4gICAgICByZXR1cm4gY2FjaGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc0NhY2hlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhc0NhY2hlKGtleSwgbHZsKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDYWNoZXNBdChsdmwpLmhhcyhrZXkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzKGVsZSwgbHZsKSB7XG4gICAgICB2YXIga2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgICAgIHJldHVybiB0aGlzLmhhc0NhY2hlKGtleSwgbHZsKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Q2FjaGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Q2FjaGUoa2V5LCBsdmwsIGNhY2hlKSB7XG4gICAgICBjYWNoZS5rZXkgPSBrZXk7XG4gICAgICB0aGlzLmdldENhY2hlc0F0KGx2bCkuc2V0KGtleSwgY2FjaGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0KGVsZSwgbHZsLCBjYWNoZSkge1xuICAgICAgdmFyIGtleSA9IHRoaXMuZ2V0S2V5KGVsZSk7XG4gICAgICB0aGlzLnNldENhY2hlKGtleSwgbHZsLCBjYWNoZSk7XG4gICAgICB0aGlzLnVwZGF0ZUtleU1hcHBpbmdGb3IoZWxlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlQ2FjaGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVsZXRlQ2FjaGUoa2V5LCBsdmwpIHtcbiAgICAgIHRoaXMuZ2V0Q2FjaGVzQXQobHZsKVtcImRlbGV0ZVwiXShrZXkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZWxldGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2RlbGV0ZShlbGUsIGx2bCkge1xuICAgICAgdmFyIGtleSA9IHRoaXMuZ2V0S2V5KGVsZSk7XG4gICAgICB0aGlzLmRlbGV0ZUNhY2hlKGtleSwgbHZsKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW52YWxpZGF0ZUtleVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnZhbGlkYXRlS2V5KGtleSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdGhpcy5sdmxzLmZvckVhY2goZnVuY3Rpb24gKGx2bCkge1xuICAgICAgICByZXR1cm4gX3RoaXMuZGVsZXRlQ2FjaGUoa2V5LCBsdmwpO1xuICAgICAgfSk7XG4gICAgfSAvLyByZXR1cm5zIHRydWUgaWYgbm8gb3RoZXIgZWxlcyByZWZlcmVuY2UgdGhlIGludmFsaWRhdGVkIGNhY2hlIChuLmIuIG90aGVyIGVsZXMgbWF5IG5lZWQgdGhlIGNhY2hlIHdpdGggdGhlIHNhbWUga2V5KVxuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW52YWxpZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnZhbGlkYXRlKGVsZSkge1xuICAgICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgICB2YXIga2V5ID0gdGhpcy5rZXlGb3JJZC5nZXQoaWQpOyAvLyBuLmIuIHVzZSBzdG9yZWQga2V5IHJhdGhlciB0aGFuIGN1cnJlbnQgKHBvdGVudGlhbCBrZXkpXG5cbiAgICAgIHRoaXMuZGVsZXRlS2V5TWFwcGluZ0ZvcihlbGUpO1xuICAgICAgdmFyIGVudGlyZUtleUludmFsaWRhdGVkID0gdGhpcy5kb2VzRWxlSW52YWxpZGF0ZUtleShlbGUpO1xuXG4gICAgICBpZiAoZW50aXJlS2V5SW52YWxpZGF0ZWQpIHtcbiAgICAgICAgLy8gY2xlYXIgbWFwcGluZyBmb3IgY3VycmVudCBrZXlcbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlS2V5KGtleSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbnRpcmVLZXlJbnZhbGlkYXRlZCB8fCB0aGlzLmdldE51bWJlck9mSWRzRm9yS2V5KGtleSkgPT09IDA7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEVsZW1lbnRUZXh0dXJlQ2FjaGVMb29rdXA7XG59KCk7XG5cbnZhciBtaW5UeHJIID0gMjU7IC8vIHRoZSBzaXplIG9mIHRoZSB0ZXh0dXJlIGNhY2hlIGZvciBzbWFsbCBoZWlnaHQgZWxlcyAoc3BlY2lhbCBjYXNlKVxuXG52YXIgdHhyU3RlcEggPSA1MDsgLy8gdGhlIG1pbiBzaXplIG9mIHRoZSByZWd1bGFyIGNhY2hlLCBhbmQgdGhlIHNpemUgaXQgaW5jcmVhc2VzIHdpdGggZWFjaCBzdGVwIHVwXG5cbnZhciBtaW5MdmwkMSA9IC00OyAvLyB3aGVuIHNjYWxpbmcgc21hbGxlciB0aGFuIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byByZS1yZW5kZXJcblxudmFyIG1heEx2bCQxID0gMzsgLy8gd2hlbiBsYXJnZXIgdGhhbiB0aGlzIHNjYWxlIGp1c3QgcmVuZGVyIGRpcmVjdGx5IChjYWNoaW5nIGlzIG5vdCBoZWxwZnVsKVxuXG52YXIgbWF4Wm9vbSQxID0gNy45OTsgLy8gYmV5b25kIHRoaXMgem9vbSBsZXZlbCwgbGF5ZXJlZCB0ZXh0dXJlcyBhcmUgbm90IHVzZWRcblxudmFyIGVsZVR4clNwYWNpbmcgPSA4OyAvLyBzcGFjaW5nIGJldHdlZW4gZWxlbWVudHMgb24gdGV4dHVyZXMgdG8gYXZvaWQgYmxpdHRpbmcgb3ZlcmxhcHNcblxudmFyIGRlZlR4cldpZHRoID0gMTAyNDsgLy8gZGVmYXVsdC9taW5pbXVtIHRleHR1cmUgd2lkdGhcblxudmFyIG1heFR4clcgPSAxMDI0OyAvLyB0aGUgbWF4aW11bSB3aWR0aCBvZiBhIHRleHR1cmVcblxudmFyIG1heFR4ckggPSAxMDI0OyAvLyB0aGUgbWF4aW11bSBoZWlnaHQgb2YgYSB0ZXh0dXJlXG5cbnZhciBtaW5VdGlsaXR5ID0gMC4yOyAvLyBpZiB1c2FnZSBvZiB0ZXh0dXJlIGlzIGxlc3MgdGhhbiB0aGlzLCBpdCBpcyByZXRpcmVkXG5cbnZhciBtYXhGdWxsbmVzcyA9IDAuODsgLy8gZnVsbG5lc3Mgb2YgdGV4dHVyZSBhZnRlciB3aGljaCBxdWV1ZSByZW1vdmFsIGlzIGNoZWNrZWRcblxudmFyIG1heEZ1bGxuZXNzQ2hlY2tzID0gMTA7IC8vIGRlcXVldWVkIGFmdGVyIHRoaXMgbWFueSBjaGVja3NcblxudmFyIGRlcUNvc3QkMSA9IDAuMTU7IC8vICUgb2YgYWRkJ2wgcmVuZGVyaW5nIGNvc3QgYWxsb3dlZCBmb3IgZGVxdWV1aW5nIGVsZSBjYWNoZXMgZWFjaCBmcmFtZVxuXG52YXIgZGVxQXZnQ29zdCQxID0gMC4xOyAvLyAlIG9mIGFkZCdsIHJlbmRlcmluZyBjb3N0IGNvbXBhcmVkIHRvIGF2ZXJhZ2Ugb3ZlcmFsbCByZWRyYXcgdGltZVxuXG52YXIgZGVxTm9EcmF3Q29zdCQxID0gMC45OyAvLyAlIG9mIGF2ZyBmcmFtZSB0aW1lIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGRlcXVldWVpbmcgd2hlbiBub3QgZHJhd2luZ1xuXG52YXIgZGVxRmFzdENvc3QkMSA9IDAuOTsgLy8gJSBvZiBmcmFtZSB0aW1lIHRvIGJlIHVzZWQgd2hlbiA+NjBmcHNcblxudmFyIGRlcVJlZHJhd1RocmVzaG9sZCQxID0gMTAwOyAvLyB0aW1lIHRvIGJhdGNoIHJlZHJhd3MgdG9nZXRoZXIgZnJvbSBkZXF1ZXVlaW5nIHRvIGFsbG93IG1vcmUgZGVxdWV1ZWluZyBjYWxjcyB0byBoYXBwZW4gaW4gdGhlIG1lYW53aGlsZVxuXG52YXIgbWF4RGVxU2l6ZSQxID0gMTsgLy8gbnVtYmVyIG9mIGVsZXMgdG8gZGVxdWV1ZSBhbmQgcmVuZGVyIGF0IGhpZ2hlciB0ZXh0dXJlIGluIGVhY2ggYmF0Y2hcblxudmFyIGdldFR4clJlYXNvbnMgPSB7XG4gIGRlcXVldWU6ICdkZXF1ZXVlJyxcbiAgZG93bnNjYWxlOiAnZG93bnNjYWxlJyxcbiAgaGlnaFF1YWxpdHk6ICdoaWdoUXVhbGl0eSdcbn07XG52YXIgaW5pdERlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIGdldEtleTogbnVsbCxcbiAgZG9lc0VsZUludmFsaWRhdGVLZXk6IGZhbHNpZnksXG4gIGRyYXdFbGVtZW50OiBudWxsLFxuICBnZXRCb3VuZGluZ0JveDogbnVsbCxcbiAgZ2V0Um90YXRpb25Qb2ludDogbnVsbCxcbiAgZ2V0Um90YXRpb25PZmZzZXQ6IG51bGwsXG4gIGlzVmlzaWJsZTogdHJ1ZWlmeSxcbiAgYWxsb3dFZGdlVHhyQ2FjaGluZzogdHJ1ZSxcbiAgYWxsb3dQYXJlbnRUeHJDYWNoaW5nOiB0cnVlXG59KTtcblxudmFyIEVsZW1lbnRUZXh0dXJlQ2FjaGUgPSBmdW5jdGlvbiBFbGVtZW50VGV4dHVyZUNhY2hlKHJlbmRlcmVyLCBpbml0T3B0aW9ucykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgc2VsZi5vbkRlcXVldWVzID0gW107XG4gIHZhciBvcHRzID0gaW5pdERlZmF1bHRzKGluaXRPcHRpb25zKTtcbiAgZXh0ZW5kKHNlbGYsIG9wdHMpO1xuICBzZWxmLmxvb2t1cCA9IG5ldyBFbGVtZW50VGV4dHVyZUNhY2hlTG9va3VwKG9wdHMuZ2V0S2V5LCBvcHRzLmRvZXNFbGVJbnZhbGlkYXRlS2V5KTtcbiAgc2VsZi5zZXR1cERlcXVldWVpbmcoKTtcbn07XG5cbnZhciBFVENwID0gRWxlbWVudFRleHR1cmVDYWNoZS5wcm90b3R5cGU7XG5FVENwLnJlYXNvbnMgPSBnZXRUeHJSZWFzb25zOyAvLyB0aGUgbGlzdCBvZiB0ZXh0dXJlcyBpbiB3aGljaCBuZXcgc3VidGV4dHVyZXMgZm9yIGVsZW1lbnRzIGNhbiBiZSBwbGFjZWRcblxuRVRDcC5nZXRUZXh0dXJlUXVldWUgPSBmdW5jdGlvbiAodHhySCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYuZWxlSW1nQ2FjaGVzID0gc2VsZi5lbGVJbWdDYWNoZXMgfHwge307XG4gIHJldHVybiBzZWxmLmVsZUltZ0NhY2hlc1t0eHJIXSA9IHNlbGYuZWxlSW1nQ2FjaGVzW3R4ckhdIHx8IFtdO1xufTsgLy8gdGhlIGxpc3Qgb2YgdXN1c2VkIHRleHR1cmVzIHdoaWNoIGNhbiBiZSByZWN5Y2xlZCAoaW4gdXNlIGluIHRleHR1cmUgcXVldWUpXG5cblxuRVRDcC5nZXRSZXRpcmVkVGV4dHVyZVF1ZXVlID0gZnVuY3Rpb24gKHR4ckgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcnR4dHJRcyA9IHNlbGYuZWxlSW1nQ2FjaGVzLnJldGlyZWQgPSBzZWxmLmVsZUltZ0NhY2hlcy5yZXRpcmVkIHx8IHt9O1xuICB2YXIgcnR4dHJRID0gcnR4dHJRc1t0eHJIXSA9IHJ0eHRyUXNbdHhySF0gfHwgW107XG4gIHJldHVybiBydHh0clE7XG59OyAvLyBxdWV1ZSBvZiBlbGVtZW50IGRyYXcgcmVxdWVzdHMgYXQgZGlmZmVyZW50IHNjYWxlIGxldmVsc1xuXG5cbkVUQ3AuZ2V0RWxlbWVudFF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBxID0gc2VsZi5lbGVDYWNoZVF1ZXVlID0gc2VsZi5lbGVDYWNoZVF1ZXVlIHx8IG5ldyBIZWFwX19kZWZhdWx0W1wiZGVmYXVsdFwiXShmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLnJlcXMgLSBhLnJlcXM7XG4gIH0pO1xuICByZXR1cm4gcTtcbn07IC8vIHF1ZXVlIG9mIGVsZW1lbnQgZHJhdyByZXF1ZXN0cyBhdCBkaWZmZXJlbnQgc2NhbGUgbGV2ZWxzIChlbGVtZW50IGlkIGxvb2t1cClcblxuXG5FVENwLmdldEVsZW1lbnRLZXlUb1F1ZXVlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBrMnEgPSBzZWxmLmVsZUtleVRvQ2FjaGVRdWV1ZSA9IHNlbGYuZWxlS2V5VG9DYWNoZVF1ZXVlIHx8IHt9O1xuICByZXR1cm4gazJxO1xufTtcblxuRVRDcC5nZXRFbGVtZW50ID0gZnVuY3Rpb24gKGVsZSwgYmIsIHB4UmF0aW8sIGx2bCwgcmVhc29uKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHIgPSB0aGlzLnJlbmRlcmVyO1xuICB2YXIgem9vbSA9IHIuY3kuem9vbSgpO1xuICB2YXIgbG9va3VwID0gdGhpcy5sb29rdXA7XG5cbiAgaWYgKCFiYiB8fCBiYi53ID09PSAwIHx8IGJiLmggPT09IDAgfHwgaXNOYU4oYmIudykgfHwgaXNOYU4oYmIuaCkgfHwgIWVsZS52aXNpYmxlKCkgfHwgZWxlLnJlbW92ZWQoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKCFzZWxmLmFsbG93RWRnZVR4ckNhY2hpbmcgJiYgZWxlLmlzRWRnZSgpIHx8ICFzZWxmLmFsbG93UGFyZW50VHhyQ2FjaGluZyAmJiBlbGUuaXNQYXJlbnQoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGx2bCA9PSBudWxsKSB7XG4gICAgbHZsID0gTWF0aC5jZWlsKGxvZzIoem9vbSAqIHB4UmF0aW8pKTtcbiAgfVxuXG4gIGlmIChsdmwgPCBtaW5MdmwkMSkge1xuICAgIGx2bCA9IG1pbkx2bCQxO1xuICB9IGVsc2UgaWYgKHpvb20gPj0gbWF4Wm9vbSQxIHx8IGx2bCA+IG1heEx2bCQxKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgc2NhbGUgPSBNYXRoLnBvdygyLCBsdmwpO1xuICB2YXIgZWxlU2NhbGVkSCA9IGJiLmggKiBzY2FsZTtcbiAgdmFyIGVsZVNjYWxlZFcgPSBiYi53ICogc2NhbGU7XG4gIHZhciBzY2FsZWRMYWJlbFNob3duID0gci5lbGVUZXh0QmlnZ2VyVGhhbk1pbihlbGUsIHNjYWxlKTtcblxuICBpZiAoIXRoaXMuaXNWaXNpYmxlKGVsZSwgc2NhbGVkTGFiZWxTaG93bikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBlbGVDYWNoZSA9IGxvb2t1cC5nZXQoZWxlLCBsdmwpOyAvLyBpZiB0aGlzIGdldCB3YXMgb24gYW4gdW51c2VkL2ludmFsaWRhdGVkIGNhY2hlLCB0aGVuIHJlc3RvcmUgdGhlIHRleHR1cmUgdXNhZ2UgbWV0cmljXG5cbiAgaWYgKGVsZUNhY2hlICYmIGVsZUNhY2hlLmludmFsaWRhdGVkKSB7XG4gICAgZWxlQ2FjaGUuaW52YWxpZGF0ZWQgPSBmYWxzZTtcbiAgICBlbGVDYWNoZS50ZXh0dXJlLmludmFsaWRhdGVkV2lkdGggLT0gZWxlQ2FjaGUud2lkdGg7XG4gIH1cblxuICBpZiAoZWxlQ2FjaGUpIHtcbiAgICByZXR1cm4gZWxlQ2FjaGU7XG4gIH1cblxuICB2YXIgdHhySDsgLy8gd2hpY2ggdGV4dHVyZSBoZWlnaHQgdGhpcyBlbGUgYmVsb25ncyB0b1xuXG4gIGlmIChlbGVTY2FsZWRIIDw9IG1pblR4ckgpIHtcbiAgICB0eHJIID0gbWluVHhySDtcbiAgfSBlbHNlIGlmIChlbGVTY2FsZWRIIDw9IHR4clN0ZXBIKSB7XG4gICAgdHhySCA9IHR4clN0ZXBIO1xuICB9IGVsc2Uge1xuICAgIHR4ckggPSBNYXRoLmNlaWwoZWxlU2NhbGVkSCAvIHR4clN0ZXBIKSAqIHR4clN0ZXBIO1xuICB9XG5cbiAgaWYgKGVsZVNjYWxlZEggPiBtYXhUeHJIIHx8IGVsZVNjYWxlZFcgPiBtYXhUeHJXKSB7XG4gICAgcmV0dXJuIG51bGw7IC8vIGNhY2hpbmcgbGFyZ2UgZWxlbWVudHMgaXMgbm90IGVmZmljaWVudFxuICB9XG5cbiAgdmFyIHR4clEgPSBzZWxmLmdldFRleHR1cmVRdWV1ZSh0eHJIKTsgLy8gZmlyc3QgdHJ5IHRoZSBzZWNvbmQgbGFzdCBvbmUgaW4gY2FzZSBpdCBoYXMgc3BhY2UgYXQgdGhlIGVuZFxuXG4gIHZhciB0eHIgPSB0eHJRW3R4clEubGVuZ3RoIC0gMl07XG5cbiAgdmFyIGFkZE5ld1R4ciA9IGZ1bmN0aW9uIGFkZE5ld1R4cigpIHtcbiAgICByZXR1cm4gc2VsZi5yZWN5Y2xlVGV4dHVyZSh0eHJILCBlbGVTY2FsZWRXKSB8fCBzZWxmLmFkZFRleHR1cmUodHhySCwgZWxlU2NhbGVkVyk7XG4gIH07IC8vIHRyeSB0aGUgbGFzdCBvbmUgaWYgdGhlcmUgaXMgbm8gc2Vjb25kIGxhc3Qgb25lXG5cblxuICBpZiAoIXR4cikge1xuICAgIHR4ciA9IHR4clFbdHhyUS5sZW5ndGggLSAxXTtcbiAgfSAvLyBpZiB0aGUgbGFzdCBvbmUgZG9lc24ndCBleGlzdCwgd2UgbmVlZCBhIGZpcnN0IG9uZVxuXG5cbiAgaWYgKCF0eHIpIHtcbiAgICB0eHIgPSBhZGROZXdUeHIoKTtcbiAgfSAvLyBpZiB0aGVyZSdzIG5vIHJvb20gaW4gdGhlIGN1cnJlbnQgdGV4dHVyZSwgd2UgbmVlZCBhIG5ldyBvbmVcblxuXG4gIGlmICh0eHIud2lkdGggLSB0eHIudXNlZFdpZHRoIDwgZWxlU2NhbGVkVykge1xuICAgIHR4ciA9IGFkZE5ld1R4cigpO1xuICB9XG5cbiAgdmFyIHNjYWxhYmxlRnJvbSA9IGZ1bmN0aW9uIHNjYWxhYmxlRnJvbShvdGhlckNhY2hlKSB7XG4gICAgcmV0dXJuIG90aGVyQ2FjaGUgJiYgb3RoZXJDYWNoZS5zY2FsZWRMYWJlbFNob3duID09PSBzY2FsZWRMYWJlbFNob3duO1xuICB9O1xuXG4gIHZhciBkZXFpbmcgPSByZWFzb24gJiYgcmVhc29uID09PSBnZXRUeHJSZWFzb25zLmRlcXVldWU7XG4gIHZhciBoaWdoUXVhbGl0eVJlcSA9IHJlYXNvbiAmJiByZWFzb24gPT09IGdldFR4clJlYXNvbnMuaGlnaFF1YWxpdHk7XG4gIHZhciBkb3duc2NhbGVSZXEgPSByZWFzb24gJiYgcmVhc29uID09PSBnZXRUeHJSZWFzb25zLmRvd25zY2FsZTtcbiAgdmFyIGhpZ2hlckNhY2hlOyAvLyB0aGUgbmVhcmVzdCBjYWNoZSB3aXRoIGEgaGlnaGVyIGxldmVsXG5cbiAgZm9yICh2YXIgbCA9IGx2bCArIDE7IGwgPD0gbWF4THZsJDE7IGwrKykge1xuICAgIHZhciBjID0gbG9va3VwLmdldChlbGUsIGwpO1xuXG4gICAgaWYgKGMpIHtcbiAgICAgIGhpZ2hlckNhY2hlID0gYztcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBvbmVVcENhY2hlID0gaGlnaGVyQ2FjaGUgJiYgaGlnaGVyQ2FjaGUubGV2ZWwgPT09IGx2bCArIDEgPyBoaWdoZXJDYWNoZSA6IG51bGw7XG5cbiAgdmFyIGRvd25zY2FsZSA9IGZ1bmN0aW9uIGRvd25zY2FsZSgpIHtcbiAgICB0eHIuY29udGV4dC5kcmF3SW1hZ2Uob25lVXBDYWNoZS50ZXh0dXJlLmNhbnZhcywgb25lVXBDYWNoZS54LCAwLCBvbmVVcENhY2hlLndpZHRoLCBvbmVVcENhY2hlLmhlaWdodCwgdHhyLnVzZWRXaWR0aCwgMCwgZWxlU2NhbGVkVywgZWxlU2NhbGVkSCk7XG4gIH07IC8vIHJlc2V0IGVsZSBhcmVhIGluIHRleHR1cmVcblxuXG4gIHR4ci5jb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgdHhyLmNvbnRleHQuY2xlYXJSZWN0KHR4ci51c2VkV2lkdGgsIDAsIGVsZVNjYWxlZFcsIHR4ckgpO1xuXG4gIGlmIChzY2FsYWJsZUZyb20ob25lVXBDYWNoZSkpIHtcbiAgICAvLyB0aGVuIHdlIGNhbiByZWxhdGl2ZWx5IGNoZWFwbHkgcmVzY2FsZSB0aGUgZXhpc3RpbmcgaW1hZ2Ugdy9vIHJlcmVuZGVyaW5nXG4gICAgZG93bnNjYWxlKCk7XG4gIH0gZWxzZSBpZiAoc2NhbGFibGVGcm9tKGhpZ2hlckNhY2hlKSkge1xuICAgIC8vIHRoZW4gdXNlIHRoZSBoaWdoZXIgY2FjaGUgZm9yIG5vdyBhbmQgcXVldWUgdGhlIG5leHQgbGV2ZWwgZG93blxuICAgIC8vIHRvIGNoZWFwbHkgc2NhbGUgdG93YXJkcyB0aGUgc21hbGxlciBsZXZlbFxuICAgIGlmIChoaWdoUXVhbGl0eVJlcSkge1xuICAgICAgZm9yICh2YXIgX2wgPSBoaWdoZXJDYWNoZS5sZXZlbDsgX2wgPiBsdmw7IF9sLS0pIHtcbiAgICAgICAgb25lVXBDYWNoZSA9IHNlbGYuZ2V0RWxlbWVudChlbGUsIGJiLCBweFJhdGlvLCBfbCwgZ2V0VHhyUmVhc29ucy5kb3duc2NhbGUpO1xuICAgICAgfVxuXG4gICAgICBkb3duc2NhbGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5xdWV1ZUVsZW1lbnQoZWxlLCBoaWdoZXJDYWNoZS5sZXZlbCAtIDEpO1xuICAgICAgcmV0dXJuIGhpZ2hlckNhY2hlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgbG93ZXJDYWNoZTsgLy8gdGhlIG5lYXJlc3QgY2FjaGUgd2l0aCBhIGxvd2VyIGxldmVsXG5cbiAgICBpZiAoIWRlcWluZyAmJiAhaGlnaFF1YWxpdHlSZXEgJiYgIWRvd25zY2FsZVJlcSkge1xuICAgICAgZm9yICh2YXIgX2wyID0gbHZsIC0gMTsgX2wyID49IG1pbkx2bCQxOyBfbDItLSkge1xuICAgICAgICB2YXIgX2MgPSBsb29rdXAuZ2V0KGVsZSwgX2wyKTtcblxuICAgICAgICBpZiAoX2MpIHtcbiAgICAgICAgICBsb3dlckNhY2hlID0gX2M7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2NhbGFibGVGcm9tKGxvd2VyQ2FjaGUpKSB7XG4gICAgICAvLyB0aGVuIHVzZSB0aGUgbG93ZXIgcXVhbGl0eSBjYWNoZSBmb3Igbm93IGFuZCBxdWV1ZSB0aGUgYmV0dGVyIG9uZSBmb3IgbGF0ZXJcbiAgICAgIHNlbGYucXVldWVFbGVtZW50KGVsZSwgbHZsKTtcbiAgICAgIHJldHVybiBsb3dlckNhY2hlO1xuICAgIH1cblxuICAgIHR4ci5jb250ZXh0LnRyYW5zbGF0ZSh0eHIudXNlZFdpZHRoLCAwKTtcbiAgICB0eHIuY29udGV4dC5zY2FsZShzY2FsZSwgc2NhbGUpO1xuICAgIHRoaXMuZHJhd0VsZW1lbnQodHhyLmNvbnRleHQsIGVsZSwgYmIsIHNjYWxlZExhYmVsU2hvd24sIGZhbHNlKTtcbiAgICB0eHIuY29udGV4dC5zY2FsZSgxIC8gc2NhbGUsIDEgLyBzY2FsZSk7XG4gICAgdHhyLmNvbnRleHQudHJhbnNsYXRlKC10eHIudXNlZFdpZHRoLCAwKTtcbiAgfVxuXG4gIGVsZUNhY2hlID0ge1xuICAgIHg6IHR4ci51c2VkV2lkdGgsXG4gICAgdGV4dHVyZTogdHhyLFxuICAgIGxldmVsOiBsdmwsXG4gICAgc2NhbGU6IHNjYWxlLFxuICAgIHdpZHRoOiBlbGVTY2FsZWRXLFxuICAgIGhlaWdodDogZWxlU2NhbGVkSCxcbiAgICBzY2FsZWRMYWJlbFNob3duOiBzY2FsZWRMYWJlbFNob3duXG4gIH07XG4gIHR4ci51c2VkV2lkdGggKz0gTWF0aC5jZWlsKGVsZVNjYWxlZFcgKyBlbGVUeHJTcGFjaW5nKTtcbiAgdHhyLmVsZUNhY2hlcy5wdXNoKGVsZUNhY2hlKTtcbiAgbG9va3VwLnNldChlbGUsIGx2bCwgZWxlQ2FjaGUpO1xuICBzZWxmLmNoZWNrVGV4dHVyZUZ1bGxuZXNzKHR4cik7XG4gIHJldHVybiBlbGVDYWNoZTtcbn07XG5cbkVUQ3AuaW52YWxpZGF0ZUVsZW1lbnRzID0gZnVuY3Rpb24gKGVsZXMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5pbnZhbGlkYXRlRWxlbWVudChlbGVzW2ldKTtcbiAgfVxufTtcblxuRVRDcC5pbnZhbGlkYXRlRWxlbWVudCA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgbG9va3VwID0gc2VsZi5sb29rdXA7XG4gIHZhciBjYWNoZXMgPSBbXTtcbiAgdmFyIGludmFsaWQgPSBsb29rdXAuaXNJbnZhbGlkKGVsZSk7XG5cbiAgaWYgKCFpbnZhbGlkKSB7XG4gICAgcmV0dXJuOyAvLyBvdmVycmlkZSB0aGUgaW52YWxpZGF0aW9uIHJlcXVlc3QgaWYgdGhlIGVsZW1lbnQga2V5IGhhcyBub3QgY2hhbmdlZFxuICB9XG5cbiAgZm9yICh2YXIgbHZsID0gbWluTHZsJDE7IGx2bCA8PSBtYXhMdmwkMTsgbHZsKyspIHtcbiAgICB2YXIgY2FjaGUgPSBsb29rdXAuZ2V0Rm9yQ2FjaGVkS2V5KGVsZSwgbHZsKTtcblxuICAgIGlmIChjYWNoZSkge1xuICAgICAgY2FjaGVzLnB1c2goY2FjaGUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBub090aGVyRWxlc1VzZUNhY2hlID0gbG9va3VwLmludmFsaWRhdGUoZWxlKTtcblxuICBpZiAobm9PdGhlckVsZXNVc2VDYWNoZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgX2NhY2hlID0gY2FjaGVzW2ldO1xuICAgICAgdmFyIHR4ciA9IF9jYWNoZS50ZXh0dXJlOyAvLyByZW1vdmUgc3BhY2UgZnJvbSB0aGUgdGV4dHVyZSBpdCBiZWxvbmdzIHRvXG5cbiAgICAgIHR4ci5pbnZhbGlkYXRlZFdpZHRoICs9IF9jYWNoZS53aWR0aDsgLy8gbWFyayB0aGUgY2FjaGUgYXMgaW52YWxpZGF0ZWRcblxuICAgICAgX2NhY2hlLmludmFsaWRhdGVkID0gdHJ1ZTsgLy8gcmV0aXJlIHRoZSB0ZXh0dXJlIGlmIGl0cyB1dGlsaXR5IGlzIGxvd1xuXG4gICAgICBzZWxmLmNoZWNrVGV4dHVyZVV0aWxpdHkodHhyKTtcbiAgICB9XG4gIH0gLy8gcmVtb3ZlIGZyb20gcXVldWUgc2luY2UgdGhlIG9sZCByZXEgd2FzIGZvciB0aGUgb2xkIHN0YXRlXG5cblxuICBzZWxmLnJlbW92ZUZyb21RdWV1ZShlbGUpO1xufTtcblxuRVRDcC5jaGVja1RleHR1cmVVdGlsaXR5ID0gZnVuY3Rpb24gKHR4cikge1xuICAvLyBpbnZhbGlkYXRlIGFsbCBlbnRyaWVzIGluIHRoZSBjYWNoZSBpZiB0aGUgY2FjaGUgc2l6ZSBpcyBzbWFsbFxuICBpZiAodHhyLmludmFsaWRhdGVkV2lkdGggPj0gbWluVXRpbGl0eSAqIHR4ci53aWR0aCkge1xuICAgIHRoaXMucmV0aXJlVGV4dHVyZSh0eHIpO1xuICB9XG59O1xuXG5FVENwLmNoZWNrVGV4dHVyZUZ1bGxuZXNzID0gZnVuY3Rpb24gKHR4cikge1xuICAvLyBpZiB0ZXh0dXJlIGhhcyBiZWVuIG1vc3RseSBmaWxsZWQgYW5kIHBhc3NlZCBvdmVyIHNldmVyYWwgdGltZXMsIHJlbW92ZVxuICAvLyBpdCBmcm9tIHRoZSBxdWV1ZSBzbyB3ZSBkb24ndCBuZWVkIHRvIHdhc3RlIHRpbWUgbG9va2luZyBhdCBpdCB0byBwdXQgbmV3IHRoaW5nc1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0eHJRID0gc2VsZi5nZXRUZXh0dXJlUXVldWUodHhyLmhlaWdodCk7XG5cbiAgaWYgKHR4ci51c2VkV2lkdGggLyB0eHIud2lkdGggPiBtYXhGdWxsbmVzcyAmJiB0eHIuZnVsbG5lc3NDaGVja3MgPj0gbWF4RnVsbG5lc3NDaGVja3MpIHtcbiAgICByZW1vdmVGcm9tQXJyYXkodHhyUSwgdHhyKTtcbiAgfSBlbHNlIHtcbiAgICB0eHIuZnVsbG5lc3NDaGVja3MrKztcbiAgfVxufTtcblxuRVRDcC5yZXRpcmVUZXh0dXJlID0gZnVuY3Rpb24gKHR4cikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0eHJIID0gdHhyLmhlaWdodDtcbiAgdmFyIHR4clEgPSBzZWxmLmdldFRleHR1cmVRdWV1ZSh0eHJIKTtcbiAgdmFyIGxvb2t1cCA9IHRoaXMubG9va3VwOyAvLyByZXRpcmUgdGhlIHRleHR1cmUgZnJvbSB0aGUgYWN0aXZlIC8gc2VhcmNoYWJsZSBxdWV1ZTpcblxuICByZW1vdmVGcm9tQXJyYXkodHhyUSwgdHhyKTtcbiAgdHhyLnJldGlyZWQgPSB0cnVlOyAvLyByZW1vdmUgdGhlIHJlZnMgZnJvbSB0aGUgZWxlcyB0byB0aGUgY2FjaGVzOlxuXG4gIHZhciBlbGVDYWNoZXMgPSB0eHIuZWxlQ2FjaGVzO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlQ2FjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZUNhY2hlID0gZWxlQ2FjaGVzW2ldO1xuICAgIGxvb2t1cC5kZWxldGVDYWNoZShlbGVDYWNoZS5rZXksIGVsZUNhY2hlLmxldmVsKTtcbiAgfVxuXG4gIGNsZWFyQXJyYXkoZWxlQ2FjaGVzKTsgLy8gYWRkIHRoZSB0ZXh0dXJlIHRvIGEgcmV0aXJlZCBxdWV1ZSBzbyBpdCBjYW4gYmUgcmVjeWNsZWQgaW4gZnV0dXJlOlxuXG4gIHZhciBydHh0clEgPSBzZWxmLmdldFJldGlyZWRUZXh0dXJlUXVldWUodHhySCk7XG4gIHJ0eHRyUS5wdXNoKHR4cik7XG59O1xuXG5FVENwLmFkZFRleHR1cmUgPSBmdW5jdGlvbiAodHhySCwgbWluVykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0eHJRID0gc2VsZi5nZXRUZXh0dXJlUXVldWUodHhySCk7XG4gIHZhciB0eHIgPSB7fTtcbiAgdHhyUS5wdXNoKHR4cik7XG4gIHR4ci5lbGVDYWNoZXMgPSBbXTtcbiAgdHhyLmhlaWdodCA9IHR4ckg7XG4gIHR4ci53aWR0aCA9IE1hdGgubWF4KGRlZlR4cldpZHRoLCBtaW5XKTtcbiAgdHhyLnVzZWRXaWR0aCA9IDA7XG4gIHR4ci5pbnZhbGlkYXRlZFdpZHRoID0gMDtcbiAgdHhyLmZ1bGxuZXNzQ2hlY2tzID0gMDtcbiAgdHhyLmNhbnZhcyA9IHNlbGYucmVuZGVyZXIubWFrZU9mZnNjcmVlbkNhbnZhcyh0eHIud2lkdGgsIHR4ci5oZWlnaHQpO1xuICB0eHIuY29udGV4dCA9IHR4ci5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgcmV0dXJuIHR4cjtcbn07XG5cbkVUQ3AucmVjeWNsZVRleHR1cmUgPSBmdW5jdGlvbiAodHhySCwgbWluVykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0eHJRID0gc2VsZi5nZXRUZXh0dXJlUXVldWUodHhySCk7XG4gIHZhciBydHh0clEgPSBzZWxmLmdldFJldGlyZWRUZXh0dXJlUXVldWUodHhySCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBydHh0clEubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdHhyID0gcnR4dHJRW2ldO1xuXG4gICAgaWYgKHR4ci53aWR0aCA+PSBtaW5XKSB7XG4gICAgICB0eHIucmV0aXJlZCA9IGZhbHNlO1xuICAgICAgdHhyLnVzZWRXaWR0aCA9IDA7XG4gICAgICB0eHIuaW52YWxpZGF0ZWRXaWR0aCA9IDA7XG4gICAgICB0eHIuZnVsbG5lc3NDaGVja3MgPSAwO1xuICAgICAgY2xlYXJBcnJheSh0eHIuZWxlQ2FjaGVzKTtcbiAgICAgIHR4ci5jb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICAgIHR4ci5jb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB0eHIud2lkdGgsIHR4ci5oZWlnaHQpO1xuICAgICAgcmVtb3ZlRnJvbUFycmF5KHJ0eHRyUSwgdHhyKTtcbiAgICAgIHR4clEucHVzaCh0eHIpO1xuICAgICAgcmV0dXJuIHR4cjtcbiAgICB9XG4gIH1cbn07XG5cbkVUQ3AucXVldWVFbGVtZW50ID0gZnVuY3Rpb24gKGVsZSwgbHZsKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHEgPSBzZWxmLmdldEVsZW1lbnRRdWV1ZSgpO1xuICB2YXIgazJxID0gc2VsZi5nZXRFbGVtZW50S2V5VG9RdWV1ZSgpO1xuICB2YXIga2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgdmFyIGV4aXN0aW5nUmVxID0gazJxW2tleV07XG5cbiAgaWYgKGV4aXN0aW5nUmVxKSB7XG4gICAgLy8gdXNlIHRoZSBtYXggbHZsIGIvYyBpbiBiZXR3ZWVuIGx2bHMgYXJlIGNoZWFwIHRvIG1ha2VcbiAgICBleGlzdGluZ1JlcS5sZXZlbCA9IE1hdGgubWF4KGV4aXN0aW5nUmVxLmxldmVsLCBsdmwpO1xuICAgIGV4aXN0aW5nUmVxLmVsZXMubWVyZ2UoZWxlKTtcbiAgICBleGlzdGluZ1JlcS5yZXFzKys7XG4gICAgcS51cGRhdGVJdGVtKGV4aXN0aW5nUmVxKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcmVxID0ge1xuICAgICAgZWxlczogZWxlLnNwYXduKCkubWVyZ2UoZWxlKSxcbiAgICAgIGxldmVsOiBsdmwsXG4gICAgICByZXFzOiAxLFxuICAgICAga2V5OiBrZXlcbiAgICB9O1xuICAgIHEucHVzaChyZXEpO1xuICAgIGsycVtrZXldID0gcmVxO1xuICB9XG59O1xuXG5FVENwLmRlcXVldWUgPSBmdW5jdGlvbiAocHhSYXRpb1xuLyosIGV4dGVudCovXG4pIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcSA9IHNlbGYuZ2V0RWxlbWVudFF1ZXVlKCk7XG4gIHZhciBrMnEgPSBzZWxmLmdldEVsZW1lbnRLZXlUb1F1ZXVlKCk7XG4gIHZhciBkZXF1ZXVlZCA9IFtdO1xuICB2YXIgbG9va3VwID0gc2VsZi5sb29rdXA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXhEZXFTaXplJDE7IGkrKykge1xuICAgIGlmIChxLnNpemUoKSA+IDApIHtcbiAgICAgIHZhciByZXEgPSBxLnBvcCgpO1xuICAgICAgdmFyIGtleSA9IHJlcS5rZXk7XG4gICAgICB2YXIgZWxlID0gcmVxLmVsZXNbMF07IC8vIGFsbCBlbGVzIGhhdmUgdGhlIHNhbWUga2V5XG5cbiAgICAgIHZhciBjYWNoZUV4aXN0cyA9IGxvb2t1cC5oYXNDYWNoZShlbGUsIHJlcS5sZXZlbCk7IC8vIGNsZWFyIG91dCB0aGUga2V5IHRvIHJlcSBsb29rdXBcblxuICAgICAgazJxW2tleV0gPSBudWxsOyAvLyBkZXF1ZXVlaW5nIGlzbid0IG5lY2Vzc2FyeSB3aXRoIGFuIGV4aXN0aW5nIGNhY2hlXG5cbiAgICAgIGlmIChjYWNoZUV4aXN0cykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZGVxdWV1ZWQucHVzaChyZXEpO1xuICAgICAgdmFyIGJiID0gc2VsZi5nZXRCb3VuZGluZ0JveChlbGUpO1xuICAgICAgc2VsZi5nZXRFbGVtZW50KGVsZSwgYmIsIHB4UmF0aW8sIHJlcS5sZXZlbCwgZ2V0VHhyUmVhc29ucy5kZXF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRlcXVldWVkO1xufTtcblxuRVRDcC5yZW1vdmVGcm9tUXVldWUgPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHEgPSBzZWxmLmdldEVsZW1lbnRRdWV1ZSgpO1xuICB2YXIgazJxID0gc2VsZi5nZXRFbGVtZW50S2V5VG9RdWV1ZSgpO1xuICB2YXIga2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgdmFyIHJlcSA9IGsycVtrZXldO1xuXG4gIGlmIChyZXEgIT0gbnVsbCkge1xuICAgIGlmIChyZXEuZWxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIHJlbW92ZSBpZiBsYXN0IGVsZSBpbiB0aGUgcmVxXG4gICAgICAvLyBicmluZyB0byBmcm9udCBvZiBxdWV1ZVxuICAgICAgcmVxLnJlcXMgPSBNQVhfSU5UJDE7XG4gICAgICBxLnVwZGF0ZUl0ZW0ocmVxKTtcbiAgICAgIHEucG9wKCk7IC8vIHJlbW92ZSBmcm9tIHF1ZXVlXG5cbiAgICAgIGsycVtrZXldID0gbnVsbDsgLy8gcmVtb3ZlIGZyb20gbG9va3VwIG1hcFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdGhlcndpc2UganVzdCByZW1vdmUgZWxlIGZyb20gcmVxXG4gICAgICByZXEuZWxlcy51bm1lcmdlKGVsZSk7XG4gICAgfVxuICB9XG59O1xuXG5FVENwLm9uRGVxdWV1ZSA9IGZ1bmN0aW9uIChmbikge1xuICB0aGlzLm9uRGVxdWV1ZXMucHVzaChmbik7XG59O1xuXG5FVENwLm9mZkRlcXVldWUgPSBmdW5jdGlvbiAoZm4pIHtcbiAgcmVtb3ZlRnJvbUFycmF5KHRoaXMub25EZXF1ZXVlcywgZm4pO1xufTtcblxuRVRDcC5zZXR1cERlcXVldWVpbmcgPSBkZWZzLnNldHVwRGVxdWV1ZWluZyh7XG4gIGRlcVJlZHJhd1RocmVzaG9sZDogZGVxUmVkcmF3VGhyZXNob2xkJDEsXG4gIGRlcUNvc3Q6IGRlcUNvc3QkMSxcbiAgZGVxQXZnQ29zdDogZGVxQXZnQ29zdCQxLFxuICBkZXFOb0RyYXdDb3N0OiBkZXFOb0RyYXdDb3N0JDEsXG4gIGRlcUZhc3RDb3N0OiBkZXFGYXN0Q29zdCQxLFxuICBkZXE6IGZ1bmN0aW9uIGRlcShzZWxmLCBweFJhdGlvLCBleHRlbnQpIHtcbiAgICByZXR1cm4gc2VsZi5kZXF1ZXVlKHB4UmF0aW8sIGV4dGVudCk7XG4gIH0sXG4gIG9uRGVxZDogZnVuY3Rpb24gb25EZXFkKHNlbGYsIGRlcWQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYub25EZXF1ZXVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGZuID0gc2VsZi5vbkRlcXVldWVzW2ldO1xuICAgICAgZm4oZGVxZCk7XG4gICAgfVxuICB9LFxuICBzaG91bGRSZWRyYXc6IGZ1bmN0aW9uIHNob3VsZFJlZHJhdyhzZWxmLCBkZXFkLCBweFJhdGlvLCBleHRlbnQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlcWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGVzID0gZGVxZFtpXS5lbGVzO1xuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGVsZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGJiID0gZWxlc1tqXS5ib3VuZGluZ0JveCgpO1xuXG4gICAgICAgIGlmIChib3VuZGluZ0JveGVzSW50ZXJzZWN0KGJiLCBleHRlbnQpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIHByaW9yaXR5OiBmdW5jdGlvbiBwcmlvcml0eShzZWxmKSB7XG4gICAgcmV0dXJuIHNlbGYucmVuZGVyZXIuYmVmb3JlUmVuZGVyUHJpb3JpdGllcy5lbGVUeHJEZXE7XG4gIH1cbn0pO1xuXG52YXIgZGVmTnVtTGF5ZXJzID0gMTsgLy8gZGVmYXVsdCBudW1iZXIgb2YgbGF5ZXJzIHRvIHVzZVxuXG52YXIgbWluTHZsID0gLTQ7IC8vIHdoZW4gc2NhbGluZyBzbWFsbGVyIHRoYW4gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIHJlLXJlbmRlclxuXG52YXIgbWF4THZsID0gMjsgLy8gd2hlbiBsYXJnZXIgdGhhbiB0aGlzIHNjYWxlIGp1c3QgcmVuZGVyIGRpcmVjdGx5IChjYWNoaW5nIGlzIG5vdCBoZWxwZnVsKVxuXG52YXIgbWF4Wm9vbSA9IDMuOTk7IC8vIGJleW9uZCB0aGlzIHpvb20gbGV2ZWwsIGxheWVyZWQgdGV4dHVyZXMgYXJlIG5vdCB1c2VkXG5cbnZhciBkZXFSZWRyYXdUaHJlc2hvbGQgPSA1MDsgLy8gdGltZSB0byBiYXRjaCByZWRyYXdzIHRvZ2V0aGVyIGZyb20gZGVxdWV1ZWluZyB0byBhbGxvdyBtb3JlIGRlcXVldWVpbmcgY2FsY3MgdG8gaGFwcGVuIGluIHRoZSBtZWFud2hpbGVcblxudmFyIHJlZmluZUVsZURlYm91bmNlVGltZSA9IDUwOyAvLyB0aW1lIHRvIGRlYm91bmNlIHNoYXJwZXIgZWxlIHRleHR1cmUgdXBkYXRlc1xuXG52YXIgZGVxQ29zdCA9IDAuMTU7IC8vICUgb2YgYWRkJ2wgcmVuZGVyaW5nIGNvc3QgYWxsb3dlZCBmb3IgZGVxdWV1aW5nIGVsZSBjYWNoZXMgZWFjaCBmcmFtZVxuXG52YXIgZGVxQXZnQ29zdCA9IDAuMTsgLy8gJSBvZiBhZGQnbCByZW5kZXJpbmcgY29zdCBjb21wYXJlZCB0byBhdmVyYWdlIG92ZXJhbGwgcmVkcmF3IHRpbWVcblxudmFyIGRlcU5vRHJhd0Nvc3QgPSAwLjk7IC8vICUgb2YgYXZnIGZyYW1lIHRpbWUgdGhhdCBjYW4gYmUgdXNlZCBmb3IgZGVxdWV1ZWluZyB3aGVuIG5vdCBkcmF3aW5nXG5cbnZhciBkZXFGYXN0Q29zdCA9IDAuOTsgLy8gJSBvZiBmcmFtZSB0aW1lIHRvIGJlIHVzZWQgd2hlbiA+NjBmcHNcblxudmFyIG1heERlcVNpemUgPSAxOyAvLyBudW1iZXIgb2YgZWxlcyB0byBkZXF1ZXVlIGFuZCByZW5kZXIgYXQgaGlnaGVyIHRleHR1cmUgaW4gZWFjaCBiYXRjaFxuXG52YXIgaW52YWxpZFRocmVzaG9sZCA9IDI1MDsgLy8gdGltZSB0aHJlc2hvbGQgZm9yIGRpc2FibGluZyBiL2Mgb2YgaW52YWxpZGF0aW9uc1xuXG52YXIgbWF4TGF5ZXJBcmVhID0gNDAwMCAqIDQwMDA7IC8vIGxheWVycyBjYW4ndCBiZSBiaWdnZXIgdGhhbiB0aGlzXG5cbnZhciB1c2VIaWdoUXVhbGl0eUVsZVR4clJlcXMgPSB0cnVlOyAvLyB3aGV0aGVyIHRvIHVzZSBoaWdoIHF1YWxpdHkgZWxlIHR4ciByZXF1ZXN0cyAoZ2VuZXJhbGx5IGZhc3RlciBhbmQgY2hlYXBlciBpbiB0aGUgbG9uZ3Rlcm0pXG4vLyB2YXIgbG9nID0gZnVuY3Rpb24oKXsgY29uc29sZS5sb2cuYXBwbHkoIGNvbnNvbGUsIGFyZ3VtZW50cyApOyB9O1xuXG52YXIgTGF5ZXJlZFRleHR1cmVDYWNoZSA9IGZ1bmN0aW9uIExheWVyZWRUZXh0dXJlQ2FjaGUocmVuZGVyZXIpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgciA9IHNlbGYucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgdmFyIGN5ID0gci5jeTtcbiAgc2VsZi5sYXllcnNCeUxldmVsID0ge307IC8vIGUuZy4gMiA9PiBbIGxheWVyMSwgbGF5ZXIyLCAuLi4sIGxheWVyTiBdXG5cbiAgc2VsZi5maXJzdEdldCA9IHRydWU7XG4gIHNlbGYubGFzdEludmFsaWRhdGlvblRpbWUgPSBwZXJmb3JtYW5jZU5vdygpIC0gMiAqIGludmFsaWRUaHJlc2hvbGQ7XG4gIHNlbGYuc2tpcHBpbmcgPSBmYWxzZTtcbiAgc2VsZi5lbGVUeHJEZXFzID0gY3kuY29sbGVjdGlvbigpO1xuICBzZWxmLnNjaGVkdWxlRWxlbWVudFJlZmluZW1lbnQgPSBkZWJvdW5jZV9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZnVuY3Rpb24gKCkge1xuICAgIHNlbGYucmVmaW5lRWxlbWVudFRleHR1cmVzKHNlbGYuZWxlVHhyRGVxcyk7XG4gICAgc2VsZi5lbGVUeHJEZXFzLnVubWVyZ2Uoc2VsZi5lbGVUeHJEZXFzKTtcbiAgfSwgcmVmaW5lRWxlRGVib3VuY2VUaW1lKTtcbiAgci5iZWZvcmVSZW5kZXIoZnVuY3Rpb24gKHdpbGxEcmF3LCBub3cpIHtcbiAgICBpZiAobm93IC0gc2VsZi5sYXN0SW52YWxpZGF0aW9uVGltZSA8PSBpbnZhbGlkVGhyZXNob2xkKSB7XG4gICAgICBzZWxmLnNraXBwaW5nID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5za2lwcGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfSwgci5iZWZvcmVSZW5kZXJQcmlvcml0aWVzLmx5clR4clNraXApO1xuXG4gIHZhciBxU29ydCA9IGZ1bmN0aW9uIHFTb3J0KGEsIGIpIHtcbiAgICByZXR1cm4gYi5yZXFzIC0gYS5yZXFzO1xuICB9O1xuXG4gIHNlbGYubGF5ZXJzUXVldWUgPSBuZXcgSGVhcF9fZGVmYXVsdFtcImRlZmF1bHRcIl0ocVNvcnQpO1xuICBzZWxmLnNldHVwRGVxdWV1ZWluZygpO1xufTtcblxudmFyIExUQ3AgPSBMYXllcmVkVGV4dHVyZUNhY2hlLnByb3RvdHlwZTtcbnZhciBsYXllcklkUG9vbCA9IDA7XG52YXIgTUFYX0lOVCA9IE1hdGgucG93KDIsIDUzKSAtIDE7XG5cbkxUQ3AubWFrZUxheWVyID0gZnVuY3Rpb24gKGJiLCBsdmwpIHtcbiAgdmFyIHNjYWxlID0gTWF0aC5wb3coMiwgbHZsKTtcbiAgdmFyIHcgPSBNYXRoLmNlaWwoYmIudyAqIHNjYWxlKTtcbiAgdmFyIGggPSBNYXRoLmNlaWwoYmIuaCAqIHNjYWxlKTtcbiAgdmFyIGNhbnZhcyA9IHRoaXMucmVuZGVyZXIubWFrZU9mZnNjcmVlbkNhbnZhcyh3LCBoKTtcbiAgdmFyIGxheWVyID0ge1xuICAgIGlkOiBsYXllcklkUG9vbCA9ICsrbGF5ZXJJZFBvb2wgJSBNQVhfSU5ULFxuICAgIGJiOiBiYixcbiAgICBsZXZlbDogbHZsLFxuICAgIHdpZHRoOiB3LFxuICAgIGhlaWdodDogaCxcbiAgICBjYW52YXM6IGNhbnZhcyxcbiAgICBjb250ZXh0OiBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSxcbiAgICBlbGVzOiBbXSxcbiAgICBlbGVzUXVldWU6IFtdLFxuICAgIHJlcXM6IDBcbiAgfTsgLy8gbG9nKCdtYWtlIGxheWVyICVzIHdpdGggdyAlcyBhbmQgaCAlcyBhbmQgbHZsICVzJywgbGF5ZXIuaWQsIGxheWVyLndpZHRoLCBsYXllci5oZWlnaHQsIGxheWVyLmxldmVsKTtcblxuICB2YXIgY3h0ID0gbGF5ZXIuY29udGV4dDtcbiAgdmFyIGR4ID0gLWxheWVyLmJiLngxO1xuICB2YXIgZHkgPSAtbGF5ZXIuYmIueTE7IC8vIGRvIHRoZSB0cmFuc2Zvcm0gb24gY3JlYXRpb24gdG8gc2F2ZSBjeWNsZXMgKGl0J3MgdGhlIHNhbWUgZm9yIGFsbCBlbGVzKVxuXG4gIGN4dC5zY2FsZShzY2FsZSwgc2NhbGUpO1xuICBjeHQudHJhbnNsYXRlKGR4LCBkeSk7XG4gIHJldHVybiBsYXllcjtcbn07XG5cbkxUQ3AuZ2V0TGF5ZXJzID0gZnVuY3Rpb24gKGVsZXMsIHB4UmF0aW8sIGx2bCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByID0gc2VsZi5yZW5kZXJlcjtcbiAgdmFyIGN5ID0gci5jeTtcbiAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gIHZhciBmaXJzdEdldCA9IHNlbGYuZmlyc3RHZXQ7XG4gIHNlbGYuZmlyc3RHZXQgPSBmYWxzZTsgLy8gbG9nKCctLVxcbmdldCBsYXllcnMgd2l0aCAlcyBlbGVzJywgZWxlcy5sZW5ndGgpO1xuICAvL2xvZyBlbGVzLm1hcChmdW5jdGlvbihlbGUpeyByZXR1cm4gZWxlLmlkKCkgfSkgKTtcblxuICBpZiAobHZsID09IG51bGwpIHtcbiAgICBsdmwgPSBNYXRoLmNlaWwobG9nMih6b29tICogcHhSYXRpbykpO1xuXG4gICAgaWYgKGx2bCA8IG1pbkx2bCkge1xuICAgICAgbHZsID0gbWluTHZsO1xuICAgIH0gZWxzZSBpZiAoem9vbSA+PSBtYXhab29tIHx8IGx2bCA+IG1heEx2bCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgc2VsZi52YWxpZGF0ZUxheWVyc0VsZXNPcmRlcmluZyhsdmwsIGVsZXMpO1xuICB2YXIgbGF5ZXJzQnlMdmwgPSBzZWxmLmxheWVyc0J5TGV2ZWw7XG4gIHZhciBzY2FsZSA9IE1hdGgucG93KDIsIGx2bCk7XG4gIHZhciBsYXllcnMgPSBsYXllcnNCeUx2bFtsdmxdID0gbGF5ZXJzQnlMdmxbbHZsXSB8fCBbXTtcbiAgdmFyIGJiO1xuICB2YXIgbHZsQ29tcGxldGUgPSBzZWxmLmxldmVsSXNDb21wbGV0ZShsdmwsIGVsZXMpO1xuICB2YXIgdG1wTGF5ZXJzO1xuXG4gIHZhciBjaGVja1RlbXBMZXZlbHMgPSBmdW5jdGlvbiBjaGVja1RlbXBMZXZlbHMoKSB7XG4gICAgdmFyIGNhblVzZUFzVG1wTHZsID0gZnVuY3Rpb24gY2FuVXNlQXNUbXBMdmwobCkge1xuICAgICAgc2VsZi52YWxpZGF0ZUxheWVyc0VsZXNPcmRlcmluZyhsLCBlbGVzKTtcblxuICAgICAgaWYgKHNlbGYubGV2ZWxJc0NvbXBsZXRlKGwsIGVsZXMpKSB7XG4gICAgICAgIHRtcExheWVycyA9IGxheWVyc0J5THZsW2xdO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIGNoZWNrTHZscyA9IGZ1bmN0aW9uIGNoZWNrTHZscyhkaXIpIHtcbiAgICAgIGlmICh0bXBMYXllcnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBsID0gbHZsICsgZGlyOyBtaW5MdmwgPD0gbCAmJiBsIDw9IG1heEx2bDsgbCArPSBkaXIpIHtcbiAgICAgICAgaWYgKGNhblVzZUFzVG1wTHZsKGwpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY2hlY2tMdmxzKCsxKTtcbiAgICBjaGVja0x2bHMoLTEpOyAvLyByZW1vdmUgdGhlIGludmFsaWQgbGF5ZXJzOyB0aGV5IHdpbGwgYmUgcmVwbGFjZWQgYXMgbmVlZGVkIGxhdGVyIGluIHRoaXMgZnVuY3Rpb25cblxuICAgIGZvciAodmFyIGkgPSBsYXllcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBsYXllciA9IGxheWVyc1tpXTtcblxuICAgICAgaWYgKGxheWVyLmludmFsaWQpIHtcbiAgICAgICAgcmVtb3ZlRnJvbUFycmF5KGxheWVycywgbGF5ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBpZiAoIWx2bENvbXBsZXRlKSB7XG4gICAgLy8gaWYgdGhlIGN1cnJlbnQgbGV2ZWwgaXMgaW5jb21wbGV0ZSwgdGhlbiB1c2UgdGhlIGNsb3Nlc3QsIGJlc3QgcXVhbGl0eSBsYXllcnNldCB0ZW1wb3JhcmlseVxuICAgIC8vIGFuZCBsYXRlciBxdWV1ZSB0aGUgY3VycmVudCBsYXllcnNldCBzbyB3ZSBjYW4gZ2V0IHRoZSBwcm9wZXIgcXVhbGl0eSBsZXZlbCBzb29uXG4gICAgY2hlY2tUZW1wTGV2ZWxzKCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbG9nKCdsZXZlbCBjb21wbGV0ZSwgdXNpbmcgZXhpc3RpbmcgbGF5ZXJzXFxuLS0nKTtcbiAgICByZXR1cm4gbGF5ZXJzO1xuICB9XG5cbiAgdmFyIGdldEJiID0gZnVuY3Rpb24gZ2V0QmIoKSB7XG4gICAgaWYgKCFiYikge1xuICAgICAgYmIgPSBtYWtlQm91bmRpbmdCb3goKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHVwZGF0ZUJvdW5kaW5nQm94KGJiLCBlbGVzW2ldLmJvdW5kaW5nQm94KCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiYjtcbiAgfTtcblxuICB2YXIgbWFrZUxheWVyID0gZnVuY3Rpb24gbWFrZUxheWVyKG9wdHMpIHtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICB2YXIgYWZ0ZXIgPSBvcHRzLmFmdGVyO1xuICAgIGdldEJiKCk7XG4gICAgdmFyIGFyZWEgPSBiYi53ICogc2NhbGUgKiAoYmIuaCAqIHNjYWxlKTtcblxuICAgIGlmIChhcmVhID4gbWF4TGF5ZXJBcmVhKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbGF5ZXIgPSBzZWxmLm1ha2VMYXllcihiYiwgbHZsKTtcblxuICAgIGlmIChhZnRlciAhPSBudWxsKSB7XG4gICAgICB2YXIgaW5kZXggPSBsYXllcnMuaW5kZXhPZihhZnRlcikgKyAxO1xuICAgICAgbGF5ZXJzLnNwbGljZShpbmRleCwgMCwgbGF5ZXIpO1xuICAgIH0gZWxzZSBpZiAob3B0cy5pbnNlcnQgPT09IHVuZGVmaW5lZCB8fCBvcHRzLmluc2VydCkge1xuICAgICAgLy8gbm8gYWZ0ZXIgc3BlY2lmaWVkID0+IGZpcnN0IGxheWVyIG1hZGUgc28gcHV0IGF0IHN0YXJ0XG4gICAgICBsYXllcnMudW5zaGlmdChsYXllcik7XG4gICAgfSAvLyBpZiggdG1wTGF5ZXJzICl7XG4gICAgLy9zZWxmLnF1ZXVlTGF5ZXIoIGxheWVyICk7XG4gICAgLy8gfVxuXG5cbiAgICByZXR1cm4gbGF5ZXI7XG4gIH07XG5cbiAgaWYgKHNlbGYuc2tpcHBpbmcgJiYgIWZpcnN0R2V0KSB7XG4gICAgLy8gbG9nKCdza2lwIGxheWVycycpO1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIGxvZygnZG8gbGF5ZXJzJyk7XG5cblxuICB2YXIgbGF5ZXIgPSBudWxsO1xuICB2YXIgbWF4RWxlc1BlckxheWVyID0gZWxlcy5sZW5ndGggLyBkZWZOdW1MYXllcnM7XG4gIHZhciBhbGxvd0xhenlRdWV1ZWluZyA9ICFmaXJzdEdldDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICB2YXIgcnMgPSBlbGUuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgdmFyIGNhY2hlcyA9IHJzLmltZ0xheWVyQ2FjaGVzID0gcnMuaW1nTGF5ZXJDYWNoZXMgfHwge307IC8vIGxvZygnbG9vayBhdCBlbGUnLCBlbGUuaWQoKSk7XG5cbiAgICB2YXIgZXhpc3RpbmdMYXllciA9IGNhY2hlc1tsdmxdO1xuXG4gICAgaWYgKGV4aXN0aW5nTGF5ZXIpIHtcbiAgICAgIC8vIHJldXNlIGxheWVyIGZvciBsYXRlciBlbGVzXG4gICAgICAvLyBsb2coJ3JldXNlIGxheWVyIGZvcicsIGVsZS5pZCgpKTtcbiAgICAgIGxheWVyID0gZXhpc3RpbmdMYXllcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghbGF5ZXIgfHwgbGF5ZXIuZWxlcy5sZW5ndGggPj0gbWF4RWxlc1BlckxheWVyIHx8ICFib3VuZGluZ0JveEluQm91bmRpbmdCb3gobGF5ZXIuYmIsIGVsZS5ib3VuZGluZ0JveCgpKSkge1xuICAgICAgLy8gbG9nKCdtYWtlIG5ldyBsYXllciBmb3IgZWxlICVzJywgZWxlLmlkKCkpO1xuICAgICAgbGF5ZXIgPSBtYWtlTGF5ZXIoe1xuICAgICAgICBpbnNlcnQ6IHRydWUsXG4gICAgICAgIGFmdGVyOiBsYXllclxuICAgICAgfSk7IC8vIGlmIG5vdyBsYXllciBjYW4gYmUgYnVpbHQgdGhlbiB3ZSBjYW4ndCB1c2UgbGF5ZXJzIGF0IHRoaXMgbGV2ZWxcblxuICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0gLy8gbG9nKCduZXcgbGF5ZXIgd2l0aCBpZCAlcycsIGxheWVyLmlkKTtcblxuICAgIH1cblxuICAgIGlmICh0bXBMYXllcnMgfHwgYWxsb3dMYXp5UXVldWVpbmcpIHtcbiAgICAgIC8vIGxvZygncXVldWUgZWxlICVzIGluIGxheWVyICVzJywgZWxlLmlkKCksIGxheWVyLmlkKTtcbiAgICAgIHNlbGYucXVldWVMYXllcihsYXllciwgZWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbG9nKCdkcmF3IGVsZSAlcyBpbiBsYXllciAlcycsIGVsZS5pZCgpLCBsYXllci5pZCk7XG4gICAgICBzZWxmLmRyYXdFbGVJbkxheWVyKGxheWVyLCBlbGUsIGx2bCwgcHhSYXRpbyk7XG4gICAgfVxuXG4gICAgbGF5ZXIuZWxlcy5wdXNoKGVsZSk7XG4gICAgY2FjaGVzW2x2bF0gPSBsYXllcjtcbiAgfSAvLyBsb2coJy0tJyk7XG5cblxuICBpZiAodG1wTGF5ZXJzKSB7XG4gICAgLy8gdGhlbiB3ZSBvbmx5IHF1ZXVlZCB0aGUgY3VycmVudCBsYXllcnNldCBhbmQgY2FuJ3QgZHJhdyBpdCB5ZXRcbiAgICByZXR1cm4gdG1wTGF5ZXJzO1xuICB9XG5cbiAgaWYgKGFsbG93TGF6eVF1ZXVlaW5nKSB7XG4gICAgLy8gbG9nKCdsYXp5IHF1ZXVlIGxldmVsJywgbHZsKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBsYXllcnM7XG59OyAvLyBhIGxheWVyIG1heSB3YW50IHRvIHVzZSBhbiBlbGUgY2FjaGUgb2YgYSBoaWdoZXIgbGV2ZWwgdG8gYXZvaWQgYmx1cnJpbmVzc1xuLy8gc28gdGhlIGxheWVyIGxldmVsIG1pZ2h0IG5vdCBlcXVhbCB0aGUgZWxlIGxldmVsXG5cblxuTFRDcC5nZXRFbGVMZXZlbEZvckxheWVyTGV2ZWwgPSBmdW5jdGlvbiAobHZsLCBweFJhdGlvKSB7XG4gIHJldHVybiBsdmw7XG59O1xuXG5MVENwLmRyYXdFbGVJbkxheWVyID0gZnVuY3Rpb24gKGxheWVyLCBlbGUsIGx2bCwgcHhSYXRpbykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByID0gdGhpcy5yZW5kZXJlcjtcbiAgdmFyIGNvbnRleHQgPSBsYXllci5jb250ZXh0O1xuICB2YXIgYmIgPSBlbGUuYm91bmRpbmdCb3goKTtcblxuICBpZiAoYmIudyA9PT0gMCB8fCBiYi5oID09PSAwIHx8ICFlbGUudmlzaWJsZSgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbHZsID0gc2VsZi5nZXRFbGVMZXZlbEZvckxheWVyTGV2ZWwobHZsLCBweFJhdGlvKTtcblxuICB7XG4gICAgci5zZXRJbWdTbW9vdGhpbmcoY29udGV4dCwgZmFsc2UpO1xuICB9XG5cbiAge1xuICAgIHIuZHJhd0NhY2hlZEVsZW1lbnQoY29udGV4dCwgZWxlLCBudWxsLCBudWxsLCBsdmwsIHVzZUhpZ2hRdWFsaXR5RWxlVHhyUmVxcyk7XG4gIH1cblxuICB7XG4gICAgci5zZXRJbWdTbW9vdGhpbmcoY29udGV4dCwgdHJ1ZSk7XG4gIH1cbn07XG5cbkxUQ3AubGV2ZWxJc0NvbXBsZXRlID0gZnVuY3Rpb24gKGx2bCwgZWxlcykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBsYXllcnMgPSBzZWxmLmxheWVyc0J5TGV2ZWxbbHZsXTtcblxuICBpZiAoIWxheWVycyB8fCBsYXllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIG51bUVsZXNJbkxheWVycyA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbGF5ZXIgPSBsYXllcnNbaV07IC8vIGlmIHRoZXJlIGFyZSBhbnkgZWxlcyBuZWVkZWQgdG8gYmUgZHJhd24geWV0LCB0aGUgbGV2ZWwgaXMgbm90IGNvbXBsZXRlXG5cbiAgICBpZiAobGF5ZXIucmVxcyA+IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIGlmIHRoZSBsYXllciBpcyBpbnZhbGlkLCB0aGUgbGV2ZWwgaXMgbm90IGNvbXBsZXRlXG5cblxuICAgIGlmIChsYXllci5pbnZhbGlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbnVtRWxlc0luTGF5ZXJzICs9IGxheWVyLmVsZXMubGVuZ3RoO1xuICB9IC8vIHdlIHNob3VsZCBoYXZlIGV4YWN0bHkgdGhlIG51bWJlciBvZiBlbGVzIHBhc3NlZCBpbiB0byBiZSBjb21wbGV0ZVxuXG5cbiAgaWYgKG51bUVsZXNJbkxheWVycyAhPT0gZWxlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkxUQ3AudmFsaWRhdGVMYXllcnNFbGVzT3JkZXJpbmcgPSBmdW5jdGlvbiAobHZsLCBlbGVzKSB7XG4gIHZhciBsYXllcnMgPSB0aGlzLmxheWVyc0J5TGV2ZWxbbHZsXTtcblxuICBpZiAoIWxheWVycykge1xuICAgIHJldHVybjtcbiAgfSAvLyBpZiBpbiBhIGxheWVyIHRoZSBlbGVzIGFyZSBub3QgaW4gdGhlIHNhbWUgb3JkZXIsIHRoZW4gdGhlIGxheWVyIGlzIGludmFsaWRcbiAgLy8gKGkuZS4gdGhlcmUgaXMgYW4gZWxlIGluIGJldHdlZW4gdGhlIGVsZXMgaW4gdGhlIGxheWVyKVxuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbGF5ZXIgPSBsYXllcnNbaV07XG4gICAgdmFyIG9mZnNldCA9IC0xOyAvLyBmaW5kIHRoZSBvZmZzZXRcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWxlcy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGxheWVyLmVsZXNbMF0gPT09IGVsZXNbal0pIHtcbiAgICAgICAgb2Zmc2V0ID0gajtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgIC8vIHRoZW4gdGhlIGxheWVyIGhhcyBub25leGlzdGVudCBlbGVtZW50cyBhbmQgaXMgaW52YWxpZFxuICAgICAgdGhpcy5pbnZhbGlkYXRlTGF5ZXIobGF5ZXIpO1xuICAgICAgY29udGludWU7XG4gICAgfSAvLyB0aGUgZWxlcyBpbiB0aGUgbGF5ZXIgbXVzdCBiZSBpbiB0aGUgc2FtZSBjb250aW51b3VzIG9yZGVyLCBlbHNlIHRoZSBsYXllciBpcyBpbnZhbGlkXG5cblxuICAgIHZhciBvID0gb2Zmc2V0O1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBsYXllci5lbGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAobGF5ZXIuZWxlc1tqXSAhPT0gZWxlc1tvICsgal0pIHtcbiAgICAgICAgLy8gbG9nKCdpbnZhbGlkYXRlIGJhc2VkIG9uIG9yZGVyaW5nJywgbGF5ZXIuaWQpO1xuICAgICAgICB0aGlzLmludmFsaWRhdGVMYXllcihsYXllcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuTFRDcC51cGRhdGVFbGVtZW50c0luTGF5ZXJzID0gZnVuY3Rpb24gKGVsZXMsIHVwZGF0ZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBpc0VsZXMgPSBlbGVtZW50KGVsZXNbMF0pOyAvLyBjb2xsZWN0IHVkcGF0ZWQgZWxlbWVudHMgKGNhc2NhZGVkIGZyb20gdGhlIGxheWVycykgYW5kIHVwZGF0ZSBlYWNoXG4gIC8vIGxheWVyIGl0c2VsZiBhbG9uZyB0aGUgd2F5XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJlcSA9IGlzRWxlcyA/IG51bGwgOiBlbGVzW2ldO1xuICAgIHZhciBlbGUgPSBpc0VsZXMgPyBlbGVzW2ldIDogZWxlc1tpXS5lbGU7XG4gICAgdmFyIHJzID0gZWxlLl9wcml2YXRlLnJzY3JhdGNoO1xuICAgIHZhciBjYWNoZXMgPSBycy5pbWdMYXllckNhY2hlcyA9IHJzLmltZ0xheWVyQ2FjaGVzIHx8IHt9O1xuXG4gICAgZm9yICh2YXIgbCA9IG1pbkx2bDsgbCA8PSBtYXhMdmw7IGwrKykge1xuICAgICAgdmFyIGxheWVyID0gY2FjaGVzW2xdO1xuXG4gICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBpZiB1cGRhdGUgaXMgYSByZXF1ZXN0IGZyb20gdGhlIGVsZSBjYWNoZSwgdGhlbiBpdCBhZmZlY3RzIG9ubHlcbiAgICAgIC8vIHRoZSBtYXRjaGluZyBsZXZlbFxuXG5cbiAgICAgIGlmIChyZXEgJiYgc2VsZi5nZXRFbGVMZXZlbEZvckxheWVyTGV2ZWwobGF5ZXIubGV2ZWwpICE9PSByZXEubGV2ZWwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZShsYXllciwgZWxlLCByZXEpO1xuICAgIH1cbiAgfVxufTtcblxuTFRDcC5oYXZlTGF5ZXJzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBoYXZlTGF5ZXJzID0gZmFsc2U7XG5cbiAgZm9yICh2YXIgbCA9IG1pbkx2bDsgbCA8PSBtYXhMdmw7IGwrKykge1xuICAgIHZhciBsYXllcnMgPSBzZWxmLmxheWVyc0J5TGV2ZWxbbF07XG5cbiAgICBpZiAobGF5ZXJzICYmIGxheWVycy5sZW5ndGggPiAwKSB7XG4gICAgICBoYXZlTGF5ZXJzID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBoYXZlTGF5ZXJzO1xufTtcblxuTFRDcC5pbnZhbGlkYXRlRWxlbWVudHMgPSBmdW5jdGlvbiAoZWxlcykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKGVsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc2VsZi5sYXN0SW52YWxpZGF0aW9uVGltZSA9IHBlcmZvcm1hbmNlTm93KCk7IC8vIGxvZygndXBkYXRlIGludmFsaWRhdGUgbGF5ZXIgdGltZSBmcm9tIGVsZXMnKTtcblxuICBpZiAoZWxlcy5sZW5ndGggPT09IDAgfHwgIXNlbGYuaGF2ZUxheWVycygpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc2VsZi51cGRhdGVFbGVtZW50c0luTGF5ZXJzKGVsZXMsIGZ1bmN0aW9uIGludmFsQXNzb2NMYXllcnMobGF5ZXIsIGVsZSwgcmVxKSB7XG4gICAgc2VsZi5pbnZhbGlkYXRlTGF5ZXIobGF5ZXIpO1xuICB9KTtcbn07XG5cbkxUQ3AuaW52YWxpZGF0ZUxheWVyID0gZnVuY3Rpb24gKGxheWVyKSB7XG4gIC8vIGxvZygndXBkYXRlIGludmFsaWRhdGUgbGF5ZXIgdGltZScpO1xuICB0aGlzLmxhc3RJbnZhbGlkYXRpb25UaW1lID0gcGVyZm9ybWFuY2VOb3coKTtcblxuICBpZiAobGF5ZXIuaW52YWxpZCkge1xuICAgIHJldHVybjtcbiAgfSAvLyBzYXZlIGN5Y2xlc1xuXG5cbiAgdmFyIGx2bCA9IGxheWVyLmxldmVsO1xuICB2YXIgZWxlcyA9IGxheWVyLmVsZXM7XG4gIHZhciBsYXllcnMgPSB0aGlzLmxheWVyc0J5TGV2ZWxbbHZsXTsgLy8gbG9nKCdpbnZhbGlkYXRlIGxheWVyJywgbGF5ZXIuaWQgKTtcblxuICByZW1vdmVGcm9tQXJyYXkobGF5ZXJzLCBsYXllcik7IC8vIGxheWVyLmVsZXMgPSBbXTtcblxuICBsYXllci5lbGVzUXVldWUgPSBbXTtcbiAgbGF5ZXIuaW52YWxpZCA9IHRydWU7XG5cbiAgaWYgKGxheWVyLnJlcGxhY2VtZW50KSB7XG4gICAgbGF5ZXIucmVwbGFjZW1lbnQuaW52YWxpZCA9IHRydWU7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY2FjaGVzID0gZWxlc1tpXS5fcHJpdmF0ZS5yc2NyYXRjaC5pbWdMYXllckNhY2hlcztcblxuICAgIGlmIChjYWNoZXMpIHtcbiAgICAgIGNhY2hlc1tsdmxdID0gbnVsbDtcbiAgICB9XG4gIH1cbn07XG5cbkxUQ3AucmVmaW5lRWxlbWVudFRleHR1cmVzID0gZnVuY3Rpb24gKGVsZXMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzOyAvLyBsb2coJ3JlZmluZScsIGVsZXMubGVuZ3RoKTtcblxuICBzZWxmLnVwZGF0ZUVsZW1lbnRzSW5MYXllcnMoZWxlcywgZnVuY3Rpb24gcmVmaW5lRWFjaEVsZShsYXllciwgZWxlLCByZXEpIHtcbiAgICB2YXIgckx5ciA9IGxheWVyLnJlcGxhY2VtZW50O1xuXG4gICAgaWYgKCFyTHlyKSB7XG4gICAgICByTHlyID0gbGF5ZXIucmVwbGFjZW1lbnQgPSBzZWxmLm1ha2VMYXllcihsYXllci5iYiwgbGF5ZXIubGV2ZWwpO1xuICAgICAgckx5ci5yZXBsYWNlcyA9IGxheWVyO1xuICAgICAgckx5ci5lbGVzID0gbGF5ZXIuZWxlczsgLy8gbG9nKCdtYWtlIHJlcGxhY2VtZW50IGxheWVyICVzIGZvciAlcyB3aXRoIGxldmVsICVzJywgckx5ci5pZCwgbGF5ZXIuaWQsIHJMeXIubGV2ZWwpO1xuICAgIH1cblxuICAgIGlmICghckx5ci5yZXFzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJMeXIuZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzZWxmLnF1ZXVlTGF5ZXIockx5ciwgckx5ci5lbGVzW2ldKTtcbiAgICAgIH0gLy8gbG9nKCdxdWV1ZSByZXBsYWNlbWVudCBsYXllciByZWZpbmVtZW50Jywgckx5ci5pZCk7XG5cbiAgICB9XG4gIH0pO1xufTtcblxuTFRDcC5lbnF1ZXVlRWxlbWVudFJlZmluZW1lbnQgPSBmdW5jdGlvbiAoZWxlKSB7XG5cbiAgdGhpcy5lbGVUeHJEZXFzLm1lcmdlKGVsZSk7XG4gIHRoaXMuc2NoZWR1bGVFbGVtZW50UmVmaW5lbWVudCgpO1xufTtcblxuTFRDcC5xdWV1ZUxheWVyID0gZnVuY3Rpb24gKGxheWVyLCBlbGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcSA9IHNlbGYubGF5ZXJzUXVldWU7XG4gIHZhciBlbGVzUSA9IGxheWVyLmVsZXNRdWV1ZTtcbiAgdmFyIGhhc0lkID0gZWxlc1EuaGFzSWQgPSBlbGVzUS5oYXNJZCB8fCB7fTsgLy8gaWYgYSBsYXllciBpcyBnb2luZyB0byBiZSByZXBsYWNlZCwgcXVldWluZyBpcyBhIHdhc3RlIG9mIHRpbWVcblxuICBpZiAobGF5ZXIucmVwbGFjZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZWxlKSB7XG4gICAgaWYgKGhhc0lkW2VsZS5pZCgpXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVsZXNRLnB1c2goZWxlKTtcbiAgICBoYXNJZFtlbGUuaWQoKV0gPSB0cnVlO1xuICB9XG5cbiAgaWYgKGxheWVyLnJlcXMpIHtcbiAgICBsYXllci5yZXFzKys7XG4gICAgcS51cGRhdGVJdGVtKGxheWVyKTtcbiAgfSBlbHNlIHtcbiAgICBsYXllci5yZXFzID0gMTtcbiAgICBxLnB1c2gobGF5ZXIpO1xuICB9XG59O1xuXG5MVENwLmRlcXVldWUgPSBmdW5jdGlvbiAocHhSYXRpbykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBxID0gc2VsZi5sYXllcnNRdWV1ZTtcbiAgdmFyIGRlcWQgPSBbXTtcbiAgdmFyIGVsZURlcXMgPSAwO1xuXG4gIHdoaWxlIChlbGVEZXFzIDwgbWF4RGVxU2l6ZSkge1xuICAgIGlmIChxLnNpemUoKSA9PT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGxheWVyID0gcS5wZWVrKCk7IC8vIGlmIGEgbGF5ZXIgaGFzIGJlZW4gb3Igd2lsbCBiZSByZXBsYWNlZCwgdGhlbiBkb24ndCB3YXN0ZSB0aW1lIHdpdGggaXRcblxuICAgIGlmIChsYXllci5yZXBsYWNlbWVudCkge1xuICAgICAgLy8gbG9nKCdsYXllciAlcyBpbiBxdWV1ZSBza2lwcGVkIGIvYyBpdCBhbHJlYWR5IGhhcyBhIHJlcGxhY2VtZW50JywgbGF5ZXIuaWQpO1xuICAgICAgcS5wb3AoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gLy8gaWYgdGhpcyBpcyBhIHJlcGxhY2VtZW50IGxheWVyIHRoYXQgaGFzIGJlZW4gc3VwZXJjZWRlZCwgdGhlbiBmb3JnZXQgaXRcblxuXG4gICAgaWYgKGxheWVyLnJlcGxhY2VzICYmIGxheWVyICE9PSBsYXllci5yZXBsYWNlcy5yZXBsYWNlbWVudCkge1xuICAgICAgLy8gbG9nKCdsYXllciBpcyBubyBsb25nZXIgdGhlIG1vc3QgdXB0b2RhdGUgcmVwbGFjZW1lbnQ7IGRlcXVldWVkJywgbGF5ZXIuaWQpXG4gICAgICBxLnBvcCgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGxheWVyLmludmFsaWQpIHtcbiAgICAgIC8vIGxvZygncmVwbGFjZW1lbnQgbGF5ZXIgJXMgaXMgaW52YWxpZDsgZGVxdWV1ZWQnLCBsYXllci5pZCk7XG4gICAgICBxLnBvcCgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGVsZSA9IGxheWVyLmVsZXNRdWV1ZS5zaGlmdCgpO1xuXG4gICAgaWYgKGVsZSkge1xuICAgICAgLy8gbG9nKCdkZXF1ZXVlIGxheWVyICVzJywgbGF5ZXIuaWQpO1xuICAgICAgc2VsZi5kcmF3RWxlSW5MYXllcihsYXllciwgZWxlLCBsYXllci5sZXZlbCwgcHhSYXRpbyk7XG4gICAgICBlbGVEZXFzKys7XG4gICAgfVxuXG4gICAgaWYgKGRlcWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyB3ZSBuZWVkIG9ubHkgb25lIGVudHJ5IGluIGRlcWQgdG8gcXVldWUgcmVkcmF3aW5nIGV0Y1xuICAgICAgZGVxZC5wdXNoKHRydWUpO1xuICAgIH0gLy8gaWYgdGhlIGxheWVyIGhhcyBhbGwgaXRzIGVsZXMgZG9uZSwgdGhlbiByZW1vdmUgZnJvbSB0aGUgcXVldWVcblxuXG4gICAgaWYgKGxheWVyLmVsZXNRdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHEucG9wKCk7XG4gICAgICBsYXllci5yZXFzID0gMDsgLy8gbG9nKCdkZXF1ZXVlIG9mIGxheWVyICVzIGNvbXBsZXRlJywgbGF5ZXIuaWQpO1xuICAgICAgLy8gd2hlbiBhIHJlcGxhY2VtZW50IGxheWVyIGlzIGRlcXVldWVkLCBpdCByZXBsYWNlcyB0aGUgb2xkIGxheWVyIGluIHRoZSBsZXZlbFxuXG4gICAgICBpZiAobGF5ZXIucmVwbGFjZXMpIHtcbiAgICAgICAgc2VsZi5hcHBseUxheWVyUmVwbGFjZW1lbnQobGF5ZXIpO1xuICAgICAgfVxuXG4gICAgICBzZWxmLnJlcXVlc3RSZWRyYXcoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVxZDtcbn07XG5cbkxUQ3AuYXBwbHlMYXllclJlcGxhY2VtZW50ID0gZnVuY3Rpb24gKGxheWVyKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGxheWVyc0luTGV2ZWwgPSBzZWxmLmxheWVyc0J5TGV2ZWxbbGF5ZXIubGV2ZWxdO1xuICB2YXIgcmVwbGFjZWQgPSBsYXllci5yZXBsYWNlcztcbiAgdmFyIGluZGV4ID0gbGF5ZXJzSW5MZXZlbC5pbmRleE9mKHJlcGxhY2VkKTsgLy8gaWYgdGhlIHJlcGxhY2VkIGxheWVyIGlzIG5vdCBpbiB0aGUgYWN0aXZlIGxpc3QgZm9yIHRoZSBsZXZlbCwgdGhlbiByZXBsYWNpbmdcbiAgLy8gcmVmcyB3b3VsZCBiZSBhIG1pc3Rha2UgKGkuZS4gb3ZlcndyaXRpbmcgdGhlIHRydWUgYWN0aXZlIGxheWVyKVxuXG4gIGlmIChpbmRleCA8IDAgfHwgcmVwbGFjZWQuaW52YWxpZCkge1xuICAgIC8vIGxvZygncmVwbGFjZW1lbnQgbGF5ZXIgd291bGQgaGF2ZSBubyBlZmZlY3QnLCBsYXllci5pZCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGF5ZXJzSW5MZXZlbFtpbmRleF0gPSBsYXllcjsgLy8gcmVwbGFjZSBsZXZlbCByZWZcbiAgLy8gcmVwbGFjZSByZWZzIGluIGVsZXNcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheWVyLmVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgX3AgPSBsYXllci5lbGVzW2ldLl9wcml2YXRlO1xuICAgIHZhciBjYWNoZSA9IF9wLmltZ0xheWVyQ2FjaGVzID0gX3AuaW1nTGF5ZXJDYWNoZXMgfHwge307XG5cbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlW2xheWVyLmxldmVsXSA9IGxheWVyO1xuICAgIH1cbiAgfSAvLyBsb2coJ2FwcGx5IHJlcGxhY2VtZW50IGxheWVyICVzIG92ZXIgJXMnLCBsYXllci5pZCwgcmVwbGFjZWQuaWQpO1xuXG5cbiAgc2VsZi5yZXF1ZXN0UmVkcmF3KCk7XG59O1xuXG5MVENwLnJlcXVlc3RSZWRyYXcgPSBkZWJvdW5jZV9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZnVuY3Rpb24gKCkge1xuICB2YXIgciA9IHRoaXMucmVuZGVyZXI7XG4gIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgci5yZWRyYXcoKTtcbn0sIDEwMCk7XG5MVENwLnNldHVwRGVxdWV1ZWluZyA9IGRlZnMuc2V0dXBEZXF1ZXVlaW5nKHtcbiAgZGVxUmVkcmF3VGhyZXNob2xkOiBkZXFSZWRyYXdUaHJlc2hvbGQsXG4gIGRlcUNvc3Q6IGRlcUNvc3QsXG4gIGRlcUF2Z0Nvc3Q6IGRlcUF2Z0Nvc3QsXG4gIGRlcU5vRHJhd0Nvc3Q6IGRlcU5vRHJhd0Nvc3QsXG4gIGRlcUZhc3RDb3N0OiBkZXFGYXN0Q29zdCxcbiAgZGVxOiBmdW5jdGlvbiBkZXEoc2VsZiwgcHhSYXRpbykge1xuICAgIHJldHVybiBzZWxmLmRlcXVldWUocHhSYXRpbyk7XG4gIH0sXG4gIG9uRGVxZDogbm9vcCQxLFxuICBzaG91bGRSZWRyYXc6IHRydWVpZnksXG4gIHByaW9yaXR5OiBmdW5jdGlvbiBwcmlvcml0eShzZWxmKSB7XG4gICAgcmV0dXJuIHNlbGYucmVuZGVyZXIuYmVmb3JlUmVuZGVyUHJpb3JpdGllcy5seXJUeHJEZXE7XG4gIH1cbn0pO1xuXG52YXIgQ1JwJGEgPSB7fTtcbnZhciBpbXBsO1xuXG5mdW5jdGlvbiBwb2x5Z29uKGNvbnRleHQsIHBvaW50cykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwdCA9IHBvaW50c1tpXTtcbiAgICBjb250ZXh0LmxpbmVUbyhwdC54LCBwdC55KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmlhbmdsZUJhY2tjdXJ2ZShjb250ZXh0LCBwb2ludHMsIGNvbnRyb2xQb2ludCkge1xuICB2YXIgZmlyc3RQdDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwdCA9IHBvaW50c1tpXTtcblxuICAgIGlmIChpID09PSAwKSB7XG4gICAgICBmaXJzdFB0ID0gcHQ7XG4gICAgfVxuXG4gICAgY29udGV4dC5saW5lVG8ocHQueCwgcHQueSk7XG4gIH1cblxuICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oY29udHJvbFBvaW50LngsIGNvbnRyb2xQb2ludC55LCBmaXJzdFB0LngsIGZpcnN0UHQueSk7XG59XG5cbmZ1bmN0aW9uIHRyaWFuZ2xlVGVlKGNvbnRleHQsIHRyaWFuZ2xlUG9pbnRzLCB0ZWVQb2ludHMpIHtcbiAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgfVxuXG4gIHZhciB0cmlQdHMgPSB0cmlhbmdsZVBvaW50cztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRyaVB0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwdCA9IHRyaVB0c1tpXTtcbiAgICBjb250ZXh0LmxpbmVUbyhwdC54LCBwdC55KTtcbiAgfVxuXG4gIHZhciB0ZWVQdHMgPSB0ZWVQb2ludHM7XG4gIHZhciBmaXJzdFRlZVB0ID0gdGVlUG9pbnRzWzBdO1xuICBjb250ZXh0Lm1vdmVUbyhmaXJzdFRlZVB0LngsIGZpcnN0VGVlUHQueSk7XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPCB0ZWVQdHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHQgPSB0ZWVQdHNbaV07XG4gICAgY29udGV4dC5saW5lVG8ocHQueCwgcHQueSk7XG4gIH1cblxuICBpZiAoY29udGV4dC5jbG9zZVBhdGgpIHtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNpcmNsZVRyaWFuZ2xlKGNvbnRleHQsIHRyaWFuZ2xlUG9pbnRzLCByeCwgcnksIHIpIHtcbiAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgfVxuXG4gIGNvbnRleHQuYXJjKHJ4LCByeSwgciwgMCwgTWF0aC5QSSAqIDIsIGZhbHNlKTtcbiAgdmFyIHRyaVB0cyA9IHRyaWFuZ2xlUG9pbnRzO1xuICB2YXIgZmlyc3RUclB0ID0gdHJpUHRzWzBdO1xuICBjb250ZXh0Lm1vdmVUbyhmaXJzdFRyUHQueCwgZmlyc3RUclB0LnkpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHJpUHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHB0ID0gdHJpUHRzW2ldO1xuICAgIGNvbnRleHQubGluZVRvKHB0LngsIHB0LnkpO1xuICB9XG5cbiAgaWYgKGNvbnRleHQuY2xvc2VQYXRoKSB7XG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjaXJjbGUoY29udGV4dCwgcngsIHJ5LCByKSB7XG4gIGNvbnRleHQuYXJjKHJ4LCByeSwgciwgMCwgTWF0aC5QSSAqIDIsIGZhbHNlKTtcbn1cblxuQ1JwJGEuYXJyb3dTaGFwZUltcGwgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gKGltcGwgfHwgKGltcGwgPSB7XG4gICAgJ3BvbHlnb24nOiBwb2x5Z29uLFxuICAgICd0cmlhbmdsZS1iYWNrY3VydmUnOiB0cmlhbmdsZUJhY2tjdXJ2ZSxcbiAgICAndHJpYW5nbGUtdGVlJzogdHJpYW5nbGVUZWUsXG4gICAgJ2NpcmNsZS10cmlhbmdsZSc6IGNpcmNsZVRyaWFuZ2xlLFxuICAgICd0cmlhbmdsZS1jcm9zcyc6IHRyaWFuZ2xlVGVlLFxuICAgICdjaXJjbGUnOiBjaXJjbGVcbiAgfSkpW25hbWVdO1xufTtcblxudmFyIENScCQ5ID0ge307XG5cbkNScCQ5LmRyYXdFbGVtZW50ID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgc2hpZnRUb09yaWdpbldpdGhCYiwgc2hvd0xhYmVsLCBzaG93T3ZlcmxheSwgc2hvd09wYWNpdHkpIHtcbiAgdmFyIHIgPSB0aGlzO1xuXG4gIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICByLmRyYXdOb2RlKGNvbnRleHQsIGVsZSwgc2hpZnRUb09yaWdpbldpdGhCYiwgc2hvd0xhYmVsLCBzaG93T3ZlcmxheSwgc2hvd09wYWNpdHkpO1xuICB9IGVsc2Uge1xuICAgIHIuZHJhd0VkZ2UoY29udGV4dCwgZWxlLCBzaGlmdFRvT3JpZ2luV2l0aEJiLCBzaG93TGFiZWwsIHNob3dPdmVybGF5LCBzaG93T3BhY2l0eSk7XG4gIH1cbn07XG5cbkNScCQ5LmRyYXdFbGVtZW50T3ZlcmxheSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUpIHtcbiAgdmFyIHIgPSB0aGlzO1xuXG4gIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICByLmRyYXdOb2RlT3ZlcmxheShjb250ZXh0LCBlbGUpO1xuICB9IGVsc2Uge1xuICAgIHIuZHJhd0VkZ2VPdmVybGF5KGNvbnRleHQsIGVsZSk7XG4gIH1cbn07XG5cbkNScCQ5LmRyYXdFbGVtZW50VW5kZXJsYXkgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlKSB7XG4gIHZhciByID0gdGhpcztcblxuICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgci5kcmF3Tm9kZVVuZGVybGF5KGNvbnRleHQsIGVsZSk7XG4gIH0gZWxzZSB7XG4gICAgci5kcmF3RWRnZVVuZGVybGF5KGNvbnRleHQsIGVsZSk7XG4gIH1cbn07XG5cbkNScCQ5LmRyYXdDYWNoZWRFbGVtZW50UG9ydGlvbiA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUsIGVsZVR4ckNhY2hlLCBweFJhdGlvLCBsdmwsIHJlYXNvbiwgZ2V0Um90YXRpb24sIGdldE9wYWNpdHkpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgYmIgPSBlbGVUeHJDYWNoZS5nZXRCb3VuZGluZ0JveChlbGUpO1xuXG4gIGlmIChiYi53ID09PSAwIHx8IGJiLmggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH0gLy8gaWdub3JlIHplcm8gc2l6ZSBjYXNlXG5cblxuICB2YXIgZWxlQ2FjaGUgPSBlbGVUeHJDYWNoZS5nZXRFbGVtZW50KGVsZSwgYmIsIHB4UmF0aW8sIGx2bCwgcmVhc29uKTtcblxuICBpZiAoZWxlQ2FjaGUgIT0gbnVsbCkge1xuICAgIHZhciBvcGFjaXR5ID0gZ2V0T3BhY2l0eShyLCBlbGUpO1xuXG4gICAgaWYgKG9wYWNpdHkgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdGhldGEgPSBnZXRSb3RhdGlvbihyLCBlbGUpO1xuICAgIHZhciB4MSA9IGJiLngxLFxuICAgICAgICB5MSA9IGJiLnkxLFxuICAgICAgICB3ID0gYmIudyxcbiAgICAgICAgaCA9IGJiLmg7XG4gICAgdmFyIHgsIHksIHN4LCBzeSwgc21vb3RoO1xuXG4gICAgaWYgKHRoZXRhICE9PSAwKSB7XG4gICAgICB2YXIgcm90UHQgPSBlbGVUeHJDYWNoZS5nZXRSb3RhdGlvblBvaW50KGVsZSk7XG4gICAgICBzeCA9IHJvdFB0Lng7XG4gICAgICBzeSA9IHJvdFB0Lnk7XG4gICAgICBjb250ZXh0LnRyYW5zbGF0ZShzeCwgc3kpO1xuICAgICAgY29udGV4dC5yb3RhdGUodGhldGEpO1xuICAgICAgc21vb3RoID0gci5nZXRJbWdTbW9vdGhpbmcoY29udGV4dCk7XG5cbiAgICAgIGlmICghc21vb3RoKSB7XG4gICAgICAgIHIuc2V0SW1nU21vb3RoaW5nKGNvbnRleHQsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICB2YXIgb2ZmID0gZWxlVHhyQ2FjaGUuZ2V0Um90YXRpb25PZmZzZXQoZWxlKTtcbiAgICAgIHggPSBvZmYueDtcbiAgICAgIHkgPSBvZmYueTtcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IHgxO1xuICAgICAgeSA9IHkxO1xuICAgIH1cblxuICAgIHZhciBvbGRHbG9iYWxBbHBoYTtcblxuICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7XG4gICAgICBvbGRHbG9iYWxBbHBoYSA9IGNvbnRleHQuZ2xvYmFsQWxwaGE7XG4gICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb2xkR2xvYmFsQWxwaGEgKiBvcGFjaXR5O1xuICAgIH1cblxuICAgIGNvbnRleHQuZHJhd0ltYWdlKGVsZUNhY2hlLnRleHR1cmUuY2FudmFzLCBlbGVDYWNoZS54LCAwLCBlbGVDYWNoZS53aWR0aCwgZWxlQ2FjaGUuaGVpZ2h0LCB4LCB5LCB3LCBoKTtcblxuICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7XG4gICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb2xkR2xvYmFsQWxwaGE7XG4gICAgfVxuXG4gICAgaWYgKHRoZXRhICE9PSAwKSB7XG4gICAgICBjb250ZXh0LnJvdGF0ZSgtdGhldGEpO1xuICAgICAgY29udGV4dC50cmFuc2xhdGUoLXN4LCAtc3kpO1xuXG4gICAgICBpZiAoIXNtb290aCkge1xuICAgICAgICByLnNldEltZ1Ntb290aGluZyhjb250ZXh0LCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGVsZVR4ckNhY2hlLmRyYXdFbGVtZW50KGNvbnRleHQsIGVsZSk7IC8vIGRpcmVjdCBkcmF3IGZhbGxiYWNrXG4gIH1cbn07XG5cbnZhciBnZXRaZXJvUm90YXRpb24gPSBmdW5jdGlvbiBnZXRaZXJvUm90YXRpb24oKSB7XG4gIHJldHVybiAwO1xufTtcblxudmFyIGdldExhYmVsUm90YXRpb24gPSBmdW5jdGlvbiBnZXRMYWJlbFJvdGF0aW9uKHIsIGVsZSkge1xuICByZXR1cm4gci5nZXRUZXh0QW5nbGUoZWxlLCBudWxsKTtcbn07XG5cbnZhciBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uID0gZnVuY3Rpb24gZ2V0U291cmNlTGFiZWxSb3RhdGlvbihyLCBlbGUpIHtcbiAgcmV0dXJuIHIuZ2V0VGV4dEFuZ2xlKGVsZSwgJ3NvdXJjZScpO1xufTtcblxudmFyIGdldFRhcmdldExhYmVsUm90YXRpb24gPSBmdW5jdGlvbiBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uKHIsIGVsZSkge1xuICByZXR1cm4gci5nZXRUZXh0QW5nbGUoZWxlLCAndGFyZ2V0Jyk7XG59O1xuXG52YXIgZ2V0T3BhY2l0eSA9IGZ1bmN0aW9uIGdldE9wYWNpdHkociwgZWxlKSB7XG4gIHJldHVybiBlbGUuZWZmZWN0aXZlT3BhY2l0eSgpO1xufTtcblxudmFyIGdldFRleHRPcGFjaXR5ID0gZnVuY3Rpb24gZ2V0VGV4dE9wYWNpdHkoZSwgZWxlKSB7XG4gIHJldHVybiBlbGUucHN0eWxlKCd0ZXh0LW9wYWNpdHknKS5wZlZhbHVlICogZWxlLmVmZmVjdGl2ZU9wYWNpdHkoKTtcbn07XG5cbkNScCQ5LmRyYXdDYWNoZWRFbGVtZW50ID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgcHhSYXRpbywgZXh0ZW50LCBsdmwsIHJlcXVlc3RIaWdoUXVhbGl0eSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBfciRkYXRhID0gci5kYXRhLFxuICAgICAgZWxlVHhyQ2FjaGUgPSBfciRkYXRhLmVsZVR4ckNhY2hlLFxuICAgICAgbGJsVHhyQ2FjaGUgPSBfciRkYXRhLmxibFR4ckNhY2hlLFxuICAgICAgc2xiVHhyQ2FjaGUgPSBfciRkYXRhLnNsYlR4ckNhY2hlLFxuICAgICAgdGxiVHhyQ2FjaGUgPSBfciRkYXRhLnRsYlR4ckNhY2hlO1xuICB2YXIgYmIgPSBlbGUuYm91bmRpbmdCb3goKTtcbiAgdmFyIHJlYXNvbiA9IHJlcXVlc3RIaWdoUXVhbGl0eSA9PT0gdHJ1ZSA/IGVsZVR4ckNhY2hlLnJlYXNvbnMuaGlnaFF1YWxpdHkgOiBudWxsO1xuXG4gIGlmIChiYi53ID09PSAwIHx8IGJiLmggPT09IDAgfHwgIWVsZS52aXNpYmxlKCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWV4dGVudCB8fCBib3VuZGluZ0JveGVzSW50ZXJzZWN0KGJiLCBleHRlbnQpKSB7XG4gICAgdmFyIGlzRWRnZSA9IGVsZS5pc0VkZ2UoKTtcblxuICAgIHZhciBiYWRMaW5lID0gZWxlLmVsZW1lbnQoKS5fcHJpdmF0ZS5yc2NyYXRjaC5iYWRMaW5lO1xuXG4gICAgci5kcmF3RWxlbWVudFVuZGVybGF5KGNvbnRleHQsIGVsZSk7XG4gICAgci5kcmF3Q2FjaGVkRWxlbWVudFBvcnRpb24oY29udGV4dCwgZWxlLCBlbGVUeHJDYWNoZSwgcHhSYXRpbywgbHZsLCByZWFzb24sIGdldFplcm9Sb3RhdGlvbiwgZ2V0T3BhY2l0eSk7XG5cbiAgICBpZiAoIWlzRWRnZSB8fCAhYmFkTGluZSkge1xuICAgICAgci5kcmF3Q2FjaGVkRWxlbWVudFBvcnRpb24oY29udGV4dCwgZWxlLCBsYmxUeHJDYWNoZSwgcHhSYXRpbywgbHZsLCByZWFzb24sIGdldExhYmVsUm90YXRpb24sIGdldFRleHRPcGFjaXR5KTtcbiAgICB9XG5cbiAgICBpZiAoaXNFZGdlICYmICFiYWRMaW5lKSB7XG4gICAgICByLmRyYXdDYWNoZWRFbGVtZW50UG9ydGlvbihjb250ZXh0LCBlbGUsIHNsYlR4ckNhY2hlLCBweFJhdGlvLCBsdmwsIHJlYXNvbiwgZ2V0U291cmNlTGFiZWxSb3RhdGlvbiwgZ2V0VGV4dE9wYWNpdHkpO1xuICAgICAgci5kcmF3Q2FjaGVkRWxlbWVudFBvcnRpb24oY29udGV4dCwgZWxlLCB0bGJUeHJDYWNoZSwgcHhSYXRpbywgbHZsLCByZWFzb24sIGdldFRhcmdldExhYmVsUm90YXRpb24sIGdldFRleHRPcGFjaXR5KTtcbiAgICB9XG5cbiAgICByLmRyYXdFbGVtZW50T3ZlcmxheShjb250ZXh0LCBlbGUpO1xuICB9XG59O1xuXG5DUnAkOS5kcmF3RWxlbWVudHMgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlcykge1xuICB2YXIgciA9IHRoaXM7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgci5kcmF3RWxlbWVudChjb250ZXh0LCBlbGUpO1xuICB9XG59O1xuXG5DUnAkOS5kcmF3Q2FjaGVkRWxlbWVudHMgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlcywgcHhSYXRpbywgZXh0ZW50KSB7XG4gIHZhciByID0gdGhpcztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICByLmRyYXdDYWNoZWRFbGVtZW50KGNvbnRleHQsIGVsZSwgcHhSYXRpbywgZXh0ZW50KTtcbiAgfVxufTtcblxuQ1JwJDkuZHJhd0NhY2hlZE5vZGVzID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZXMsIHB4UmF0aW8sIGV4dGVudCkge1xuICB2YXIgciA9IHRoaXM7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG5cbiAgICBpZiAoIWVsZS5pc05vZGUoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgci5kcmF3Q2FjaGVkRWxlbWVudChjb250ZXh0LCBlbGUsIHB4UmF0aW8sIGV4dGVudCk7XG4gIH1cbn07XG5cbkNScCQ5LmRyYXdMYXllcmVkRWxlbWVudHMgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlcywgcHhSYXRpbywgZXh0ZW50KSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGxheWVycyA9IHIuZGF0YS5seXJUeHJDYWNoZS5nZXRMYXllcnMoZWxlcywgcHhSYXRpbyk7XG5cbiAgaWYgKGxheWVycykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbGF5ZXIgPSBsYXllcnNbaV07XG4gICAgICB2YXIgYmIgPSBsYXllci5iYjtcblxuICAgICAgaWYgKGJiLncgPT09IDAgfHwgYmIuaCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5kcmF3SW1hZ2UobGF5ZXIuY2FudmFzLCBiYi54MSwgYmIueTEsIGJiLncsIGJiLmgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBmYWxsIGJhY2sgb24gcGxhaW4gY2FjaGluZyBpZiBubyBsYXllcnNcbiAgICByLmRyYXdDYWNoZWRFbGVtZW50cyhjb250ZXh0LCBlbGVzLCBweFJhdGlvLCBleHRlbnQpO1xuICB9XG59O1xuXG4vKiBnbG9iYWwgUGF0aDJEICovXG52YXIgQ1JwJDggPSB7fTtcblxuQ1JwJDguZHJhd0VkZ2UgPSBmdW5jdGlvbiAoY29udGV4dCwgZWRnZSwgc2hpZnRUb09yaWdpbldpdGhCYikge1xuICB2YXIgZHJhd0xhYmVsID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB0cnVlO1xuICB2YXIgc2hvdWxkRHJhd092ZXJsYXkgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHRydWU7XG4gIHZhciBzaG91bGREcmF3T3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDogdHJ1ZTtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuXG4gIGlmIChzaG91bGREcmF3T3BhY2l0eSAmJiAhZWRnZS52aXNpYmxlKCkpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gaWYgYmV6aWVyIGN0cmwgcHRzIGNhbiBub3QgYmUgY2FsY3VsYXRlZCwgdGhlbiBkaWVcblxuXG4gIGlmIChycy5iYWRMaW5lIHx8IHJzLmFsbHB0cyA9PSBudWxsIHx8IGlzTmFOKHJzLmFsbHB0c1swXSkpIHtcbiAgICAvLyBpc05hTiBpbiBjYXNlIGVkZ2UgaXMgaW1wb3NzaWJsZSBhbmQgYnJvd3NlciBidWdzIChlLmcuIHNhZmFyaSlcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgYmI7XG5cbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBiYiA9IHNoaWZ0VG9PcmlnaW5XaXRoQmI7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLWJiLngxLCAtYmIueTEpO1xuICB9XG5cbiAgdmFyIG9wYWNpdHkgPSBzaG91bGREcmF3T3BhY2l0eSA/IGVkZ2UucHN0eWxlKCdvcGFjaXR5JykudmFsdWUgOiAxO1xuICB2YXIgbGluZU9wYWNpdHkgPSBzaG91bGREcmF3T3BhY2l0eSA/IGVkZ2UucHN0eWxlKCdsaW5lLW9wYWNpdHknKS52YWx1ZSA6IDE7XG4gIHZhciBjdXJ2ZVN0eWxlID0gZWRnZS5wc3R5bGUoJ2N1cnZlLXN0eWxlJykudmFsdWU7XG4gIHZhciBsaW5lU3R5bGUgPSBlZGdlLnBzdHlsZSgnbGluZS1zdHlsZScpLnZhbHVlO1xuICB2YXIgZWRnZVdpZHRoID0gZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZTtcbiAgdmFyIGxpbmVDYXAgPSBlZGdlLnBzdHlsZSgnbGluZS1jYXAnKS52YWx1ZTtcbiAgdmFyIGVmZmVjdGl2ZUxpbmVPcGFjaXR5ID0gb3BhY2l0eSAqIGxpbmVPcGFjaXR5OyAvLyBzZXBhcmF0ZSBhcnJvdyBvcGFjaXR5IHdvdWxkIHJlcXVpcmUgYXJyb3ctb3BhY2l0eSBwcm9wZXJ0eVxuXG4gIHZhciBlZmZlY3RpdmVBcnJvd09wYWNpdHkgPSBvcGFjaXR5ICogbGluZU9wYWNpdHk7XG5cbiAgdmFyIGRyYXdMaW5lID0gZnVuY3Rpb24gZHJhd0xpbmUoKSB7XG4gICAgdmFyIHN0cm9rZU9wYWNpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGVmZmVjdGl2ZUxpbmVPcGFjaXR5O1xuXG4gICAgaWYgKGN1cnZlU3R5bGUgPT09ICdzdHJhaWdodC10cmlhbmdsZScpIHtcbiAgICAgIHIuZWxlU3Ryb2tlU3R5bGUoY29udGV4dCwgZWRnZSwgc3Ryb2tlT3BhY2l0eSk7XG4gICAgICByLmRyYXdFZGdlVHJpYW5nbGVQYXRoKGVkZ2UsIGNvbnRleHQsIHJzLmFsbHB0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gZWRnZVdpZHRoO1xuICAgICAgY29udGV4dC5saW5lQ2FwID0gbGluZUNhcDtcbiAgICAgIHIuZWxlU3Ryb2tlU3R5bGUoY29udGV4dCwgZWRnZSwgc3Ryb2tlT3BhY2l0eSk7XG4gICAgICByLmRyYXdFZGdlUGF0aChlZGdlLCBjb250ZXh0LCBycy5hbGxwdHMsIGxpbmVTdHlsZSk7XG4gICAgICBjb250ZXh0LmxpbmVDYXAgPSAnYnV0dCc7IC8vIHJlc2V0IGZvciBvdGhlciBkcmF3aW5nIGZ1bmN0aW9uc1xuICAgIH1cbiAgfTtcblxuICB2YXIgZHJhd092ZXJsYXkgPSBmdW5jdGlvbiBkcmF3T3ZlcmxheSgpIHtcbiAgICBpZiAoIXNob3VsZERyYXdPdmVybGF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgci5kcmF3RWRnZU92ZXJsYXkoY29udGV4dCwgZWRnZSk7XG4gIH07XG5cbiAgdmFyIGRyYXdVbmRlcmxheSA9IGZ1bmN0aW9uIGRyYXdVbmRlcmxheSgpIHtcbiAgICBpZiAoIXNob3VsZERyYXdPdmVybGF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgci5kcmF3RWRnZVVuZGVybGF5KGNvbnRleHQsIGVkZ2UpO1xuICB9O1xuXG4gIHZhciBkcmF3QXJyb3dzID0gZnVuY3Rpb24gZHJhd0Fycm93cygpIHtcbiAgICB2YXIgYXJyb3dPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBlZmZlY3RpdmVBcnJvd09wYWNpdHk7XG4gICAgci5kcmF3QXJyb3doZWFkcyhjb250ZXh0LCBlZGdlLCBhcnJvd09wYWNpdHkpO1xuICB9O1xuXG4gIHZhciBkcmF3VGV4dCA9IGZ1bmN0aW9uIGRyYXdUZXh0KCkge1xuICAgIHIuZHJhd0VsZW1lbnRUZXh0KGNvbnRleHQsIGVkZ2UsIG51bGwsIGRyYXdMYWJlbCk7XG4gIH07XG5cbiAgY29udGV4dC5saW5lSm9pbiA9ICdyb3VuZCc7XG4gIHZhciBnaG9zdCA9IGVkZ2UucHN0eWxlKCdnaG9zdCcpLnZhbHVlID09PSAneWVzJztcblxuICBpZiAoZ2hvc3QpIHtcbiAgICB2YXIgZ3ggPSBlZGdlLnBzdHlsZSgnZ2hvc3Qtb2Zmc2V0LXgnKS5wZlZhbHVlO1xuICAgIHZhciBneSA9IGVkZ2UucHN0eWxlKCdnaG9zdC1vZmZzZXQteScpLnBmVmFsdWU7XG4gICAgdmFyIGdob3N0T3BhY2l0eSA9IGVkZ2UucHN0eWxlKCdnaG9zdC1vcGFjaXR5JykudmFsdWU7XG4gICAgdmFyIGVmZmVjdGl2ZUdob3N0T3BhY2l0eSA9IGVmZmVjdGl2ZUxpbmVPcGFjaXR5ICogZ2hvc3RPcGFjaXR5O1xuICAgIGNvbnRleHQudHJhbnNsYXRlKGd4LCBneSk7XG4gICAgZHJhd0xpbmUoZWZmZWN0aXZlR2hvc3RPcGFjaXR5KTtcbiAgICBkcmF3QXJyb3dzKGVmZmVjdGl2ZUdob3N0T3BhY2l0eSk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLWd4LCAtZ3kpO1xuICB9XG5cbiAgZHJhd1VuZGVybGF5KCk7XG4gIGRyYXdMaW5lKCk7XG4gIGRyYXdBcnJvd3MoKTtcbiAgZHJhd092ZXJsYXkoKTtcbiAgZHJhd1RleHQoKTtcblxuICBpZiAoc2hpZnRUb09yaWdpbldpdGhCYikge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKGJiLngxLCBiYi55MSk7XG4gIH1cbn07XG5cbnZhciBkcmF3RWRnZU92ZXJsYXlVbmRlcmxheSA9IGZ1bmN0aW9uIGRyYXdFZGdlT3ZlcmxheVVuZGVybGF5KG92ZXJsYXlPclVuZGVybGF5KSB7XG4gIGlmICghWydvdmVybGF5JywgJ3VuZGVybGF5J10uaW5jbHVkZXMob3ZlcmxheU9yVW5kZXJsYXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0YXRlJyk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGNvbnRleHQsIGVkZ2UpIHtcbiAgICBpZiAoIWVkZ2UudmlzaWJsZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG9wYWNpdHkgPSBlZGdlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItb3BhY2l0eVwiKSkudmFsdWU7XG5cbiAgICBpZiAob3BhY2l0eSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciByID0gdGhpcztcbiAgICB2YXIgdXNlUGF0aHMgPSByLnVzZVBhdGhzKCk7XG4gICAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICB2YXIgcGFkZGluZyA9IGVkZ2UucHN0eWxlKFwiXCIuY29uY2F0KG92ZXJsYXlPclVuZGVybGF5LCBcIi1wYWRkaW5nXCIpKS5wZlZhbHVlO1xuICAgIHZhciB3aWR0aCA9IDIgKiBwYWRkaW5nO1xuICAgIHZhciBjb2xvciA9IGVkZ2UucHN0eWxlKFwiXCIuY29uY2F0KG92ZXJsYXlPclVuZGVybGF5LCBcIi1jb2xvclwiKSkudmFsdWU7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSB3aWR0aDtcblxuICAgIGlmIChycy5lZGdlVHlwZSA9PT0gJ3NlbGYnICYmICF1c2VQYXRocykge1xuICAgICAgY29udGV4dC5saW5lQ2FwID0gJ2J1dHQnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0LmxpbmVDYXAgPSAncm91bmQnO1xuICAgIH1cblxuICAgIHIuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgICByLmRyYXdFZGdlUGF0aChlZGdlLCBjb250ZXh0LCBycy5hbGxwdHMsICdzb2xpZCcpO1xuICB9O1xufTtcblxuQ1JwJDguZHJhd0VkZ2VPdmVybGF5ID0gZHJhd0VkZ2VPdmVybGF5VW5kZXJsYXkoJ292ZXJsYXknKTtcbkNScCQ4LmRyYXdFZGdlVW5kZXJsYXkgPSBkcmF3RWRnZU92ZXJsYXlVbmRlcmxheSgndW5kZXJsYXknKTtcblxuQ1JwJDguZHJhd0VkZ2VQYXRoID0gZnVuY3Rpb24gKGVkZ2UsIGNvbnRleHQsIHB0cywgdHlwZSkge1xuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgY2FudmFzQ3h0ID0gY29udGV4dDtcbiAgdmFyIHBhdGg7XG4gIHZhciBwYXRoQ2FjaGVIaXQgPSBmYWxzZTtcbiAgdmFyIHVzZVBhdGhzID0gdGhpcy51c2VQYXRocygpO1xuICB2YXIgbGluZURhc2hQYXR0ZXJuID0gZWRnZS5wc3R5bGUoJ2xpbmUtZGFzaC1wYXR0ZXJuJykucGZWYWx1ZTtcbiAgdmFyIGxpbmVEYXNoT2Zmc2V0ID0gZWRnZS5wc3R5bGUoJ2xpbmUtZGFzaC1vZmZzZXQnKS5wZlZhbHVlO1xuXG4gIGlmICh1c2VQYXRocykge1xuICAgIHZhciBwYXRoQ2FjaGVLZXkgPSBwdHMuam9pbignJCcpO1xuICAgIHZhciBrZXlNYXRjaGVzID0gcnMucGF0aENhY2hlS2V5ICYmIHJzLnBhdGhDYWNoZUtleSA9PT0gcGF0aENhY2hlS2V5O1xuXG4gICAgaWYgKGtleU1hdGNoZXMpIHtcbiAgICAgIHBhdGggPSBjb250ZXh0ID0gcnMucGF0aENhY2hlO1xuICAgICAgcGF0aENhY2hlSGl0ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aCA9IGNvbnRleHQgPSBuZXcgUGF0aDJEKCk7XG4gICAgICBycy5wYXRoQ2FjaGVLZXkgPSBwYXRoQ2FjaGVLZXk7XG4gICAgICBycy5wYXRoQ2FjaGUgPSBwYXRoO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjYW52YXNDeHQuc2V0TGluZURhc2gpIHtcbiAgICAvLyBmb3IgdmVyeSBvdXRvZmRhdGUgYnJvd3NlcnNcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2RvdHRlZCc6XG4gICAgICAgIGNhbnZhc0N4dC5zZXRMaW5lRGFzaChbMSwgMV0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZGFzaGVkJzpcbiAgICAgICAgY2FudmFzQ3h0LnNldExpbmVEYXNoKGxpbmVEYXNoUGF0dGVybik7XG4gICAgICAgIGNhbnZhc0N4dC5saW5lRGFzaE9mZnNldCA9IGxpbmVEYXNoT2Zmc2V0O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnc29saWQnOlxuICAgICAgICBjYW52YXNDeHQuc2V0TGluZURhc2goW10pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoIXBhdGhDYWNoZUhpdCAmJiAhcnMuYmFkTGluZSkge1xuICAgIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICB9XG5cbiAgICBjb250ZXh0Lm1vdmVUbyhwdHNbMF0sIHB0c1sxXSk7XG5cbiAgICBzd2l0Y2ggKHJzLmVkZ2VUeXBlKSB7XG4gICAgICBjYXNlICdiZXppZXInOlxuICAgICAgY2FzZSAnc2VsZic6XG4gICAgICBjYXNlICdjb21wb3VuZCc6XG4gICAgICBjYXNlICdtdWx0aWJlemllcic6XG4gICAgICAgIGZvciAodmFyIGkgPSAyOyBpICsgMyA8IHB0cy5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICAgIGNvbnRleHQucXVhZHJhdGljQ3VydmVUbyhwdHNbaV0sIHB0c1tpICsgMV0sIHB0c1tpICsgMl0sIHB0c1tpICsgM10pO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3N0cmFpZ2h0JzpcbiAgICAgIGNhc2UgJ3NlZ21lbnRzJzpcbiAgICAgIGNhc2UgJ2hheXN0YWNrJzpcbiAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSArIDEgPCBwdHMubGVuZ3RoOyBfaSArPSAyKSB7XG4gICAgICAgICAgY29udGV4dC5saW5lVG8ocHRzW19pXSwgcHRzW19pICsgMV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgY29udGV4dCA9IGNhbnZhc0N4dDtcblxuICBpZiAodXNlUGF0aHMpIHtcbiAgICBjb250ZXh0LnN0cm9rZShwYXRoKTtcbiAgfSBlbHNlIHtcbiAgICBjb250ZXh0LnN0cm9rZSgpO1xuICB9IC8vIHJlc2V0IGFueSBsaW5lIGRhc2hlc1xuXG5cbiAgaWYgKGNvbnRleHQuc2V0TGluZURhc2gpIHtcbiAgICAvLyBmb3IgdmVyeSBvdXRvZmRhdGUgYnJvd3NlcnNcbiAgICBjb250ZXh0LnNldExpbmVEYXNoKFtdKTtcbiAgfVxufTtcblxuQ1JwJDguZHJhd0VkZ2VUcmlhbmdsZVBhdGggPSBmdW5jdGlvbiAoZWRnZSwgY29udGV4dCwgcHRzKSB7XG4gIC8vIHVzZSBsaW5lIHN0cm9rZSBzdHlsZSBmb3IgdHJpYW5nbGUgZmlsbCBzdHlsZVxuICBjb250ZXh0LmZpbGxTdHlsZSA9IGNvbnRleHQuc3Ryb2tlU3R5bGU7XG4gIHZhciBlZGdlV2lkdGggPSBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpICsgMSA8IHB0cy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciB2ZWN0b3IgPSBbcHRzW2kgKyAyXSAtIHB0c1tpXSwgcHRzW2kgKyAzXSAtIHB0c1tpICsgMV1dO1xuICAgIHZhciBsZW5ndGggPSBNYXRoLnNxcnQodmVjdG9yWzBdICogdmVjdG9yWzBdICsgdmVjdG9yWzFdICogdmVjdG9yWzFdKTtcbiAgICB2YXIgbm9ybWFsID0gW3ZlY3RvclsxXSAvIGxlbmd0aCwgLXZlY3RvclswXSAvIGxlbmd0aF07XG4gICAgdmFyIHRyaWFuZ2xlSGVhZCA9IFtub3JtYWxbMF0gKiBlZGdlV2lkdGggLyAyLCBub3JtYWxbMV0gKiBlZGdlV2lkdGggLyAyXTtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIGNvbnRleHQubW92ZVRvKHB0c1tpXSAtIHRyaWFuZ2xlSGVhZFswXSwgcHRzW2kgKyAxXSAtIHRyaWFuZ2xlSGVhZFsxXSk7XG4gICAgY29udGV4dC5saW5lVG8ocHRzW2ldICsgdHJpYW5nbGVIZWFkWzBdLCBwdHNbaSArIDFdICsgdHJpYW5nbGVIZWFkWzFdKTtcbiAgICBjb250ZXh0LmxpbmVUbyhwdHNbaSArIDJdLCBwdHNbaSArIDNdKTtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICB9XG59O1xuXG5DUnAkOC5kcmF3QXJyb3doZWFkcyA9IGZ1bmN0aW9uIChjb250ZXh0LCBlZGdlLCBvcGFjaXR5KSB7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBpc0hheXN0YWNrID0gcnMuZWRnZVR5cGUgPT09ICdoYXlzdGFjayc7XG5cbiAgaWYgKCFpc0hheXN0YWNrKSB7XG4gICAgdGhpcy5kcmF3QXJyb3doZWFkKGNvbnRleHQsIGVkZ2UsICdzb3VyY2UnLCBycy5hcnJvd1N0YXJ0WCwgcnMuYXJyb3dTdGFydFksIHJzLnNyY0Fycm93QW5nbGUsIG9wYWNpdHkpO1xuICB9XG5cbiAgdGhpcy5kcmF3QXJyb3doZWFkKGNvbnRleHQsIGVkZ2UsICdtaWQtdGFyZ2V0JywgcnMubWlkWCwgcnMubWlkWSwgcnMubWlkdGd0QXJyb3dBbmdsZSwgb3BhY2l0eSk7XG4gIHRoaXMuZHJhd0Fycm93aGVhZChjb250ZXh0LCBlZGdlLCAnbWlkLXNvdXJjZScsIHJzLm1pZFgsIHJzLm1pZFksIHJzLm1pZHNyY0Fycm93QW5nbGUsIG9wYWNpdHkpO1xuXG4gIGlmICghaXNIYXlzdGFjaykge1xuICAgIHRoaXMuZHJhd0Fycm93aGVhZChjb250ZXh0LCBlZGdlLCAndGFyZ2V0JywgcnMuYXJyb3dFbmRYLCBycy5hcnJvd0VuZFksIHJzLnRndEFycm93QW5nbGUsIG9wYWNpdHkpO1xuICB9XG59O1xuXG5DUnAkOC5kcmF3QXJyb3doZWFkID0gZnVuY3Rpb24gKGNvbnRleHQsIGVkZ2UsIHByZWZpeCwgeCwgeSwgYW5nbGUsIG9wYWNpdHkpIHtcbiAgaWYgKGlzTmFOKHgpIHx8IHggPT0gbnVsbCB8fCBpc05hTih5KSB8fCB5ID09IG51bGwgfHwgaXNOYU4oYW5nbGUpIHx8IGFuZ2xlID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBhcnJvd1NoYXBlID0gZWRnZS5wc3R5bGUocHJlZml4ICsgJy1hcnJvdy1zaGFwZScpLnZhbHVlO1xuXG4gIGlmIChhcnJvd1NoYXBlID09PSAnbm9uZScpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgYXJyb3dDbGVhckZpbGwgPSBlZGdlLnBzdHlsZShwcmVmaXggKyAnLWFycm93LWZpbGwnKS52YWx1ZSA9PT0gJ2hvbGxvdycgPyAnYm90aCcgOiAnZmlsbGVkJztcbiAgdmFyIGFycm93RmlsbCA9IGVkZ2UucHN0eWxlKHByZWZpeCArICctYXJyb3ctZmlsbCcpLnZhbHVlO1xuICB2YXIgZWRnZVdpZHRoID0gZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZTtcbiAgdmFyIGVkZ2VPcGFjaXR5ID0gZWRnZS5wc3R5bGUoJ29wYWNpdHknKS52YWx1ZTtcblxuICBpZiAob3BhY2l0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgb3BhY2l0eSA9IGVkZ2VPcGFjaXR5O1xuICB9XG5cbiAgdmFyIGdjbyA9IGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uO1xuXG4gIGlmIChvcGFjaXR5ICE9PSAxIHx8IGFycm93RmlsbCA9PT0gJ2hvbGxvdycpIHtcbiAgICAvLyB0aGVuIGV4dHJhIGNsZWFyIGlzIG5lZWRlZFxuICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLW91dCc7XG4gICAgc2VsZi5jb2xvckZpbGxTdHlsZShjb250ZXh0LCAyNTUsIDI1NSwgMjU1LCAxKTtcbiAgICBzZWxmLmNvbG9yU3Ryb2tlU3R5bGUoY29udGV4dCwgMjU1LCAyNTUsIDI1NSwgMSk7XG4gICAgc2VsZi5kcmF3QXJyb3dTaGFwZShlZGdlLCBjb250ZXh0LCBhcnJvd0NsZWFyRmlsbCwgZWRnZVdpZHRoLCBhcnJvd1NoYXBlLCB4LCB5LCBhbmdsZSk7XG4gICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBnY287XG4gIH0gLy8gb3RoZXJ3aXNlLCB0aGUgb3BhcXVlIGFycm93IGNsZWFycyBpdCBmb3IgZnJlZSA6KVxuXG5cbiAgdmFyIGNvbG9yID0gZWRnZS5wc3R5bGUocHJlZml4ICsgJy1hcnJvdy1jb2xvcicpLnZhbHVlO1xuICBzZWxmLmNvbG9yRmlsbFN0eWxlKGNvbnRleHQsIGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0sIG9wYWNpdHkpO1xuICBzZWxmLmNvbG9yU3Ryb2tlU3R5bGUoY29udGV4dCwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgb3BhY2l0eSk7XG4gIHNlbGYuZHJhd0Fycm93U2hhcGUoZWRnZSwgY29udGV4dCwgYXJyb3dGaWxsLCBlZGdlV2lkdGgsIGFycm93U2hhcGUsIHgsIHksIGFuZ2xlKTtcbn07XG5cbkNScCQ4LmRyYXdBcnJvd1NoYXBlID0gZnVuY3Rpb24gKGVkZ2UsIGNvbnRleHQsIGZpbGwsIGVkZ2VXaWR0aCwgc2hhcGUsIHgsIHksIGFuZ2xlKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIHVzZVBhdGhzID0gdGhpcy51c2VQYXRocygpICYmIHNoYXBlICE9PSAndHJpYW5nbGUtY3Jvc3MnO1xuICB2YXIgcGF0aENhY2hlSGl0ID0gZmFsc2U7XG4gIHZhciBwYXRoO1xuICB2YXIgY2FudmFzQ29udGV4dCA9IGNvbnRleHQ7XG4gIHZhciB0cmFuc2xhdGlvbiA9IHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcbiAgdmFyIHNjYWxlID0gZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykudmFsdWU7XG4gIHZhciBzaXplID0gdGhpcy5nZXRBcnJvd1dpZHRoKGVkZ2VXaWR0aCwgc2NhbGUpO1xuICB2YXIgc2hhcGVJbXBsID0gci5hcnJvd1NoYXBlc1tzaGFwZV07XG5cbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgdmFyIGNhY2hlID0gci5hcnJvd1BhdGhDYWNoZSA9IHIuYXJyb3dQYXRoQ2FjaGUgfHwgW107XG4gICAgdmFyIGtleSA9IGhhc2hTdHJpbmcoc2hhcGUpO1xuICAgIHZhciBjYWNoZWRQYXRoID0gY2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWRQYXRoICE9IG51bGwpIHtcbiAgICAgIHBhdGggPSBjb250ZXh0ID0gY2FjaGVkUGF0aDtcbiAgICAgIHBhdGhDYWNoZUhpdCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGggPSBjb250ZXh0ID0gbmV3IFBhdGgyRCgpO1xuICAgICAgY2FjaGVba2V5XSA9IHBhdGg7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFwYXRoQ2FjaGVIaXQpIHtcbiAgICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgfVxuXG4gICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAvLyBzdG9yZSBpbiB0aGUgcGF0aCBjYWNoZSB3aXRoIHZhbHVlcyBlYXNpbHkgbWFuaXB1bGF0ZWQgbGF0ZXJcbiAgICAgIHNoYXBlSW1wbC5kcmF3KGNvbnRleHQsIDEsIDAsIHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMFxuICAgICAgfSwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNoYXBlSW1wbC5kcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGV4dC5jbG9zZVBhdGgpIHtcbiAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgfVxuICB9XG5cbiAgY29udGV4dCA9IGNhbnZhc0NvbnRleHQ7XG5cbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgLy8gc2V0IHRyYW5zZm9ybSB0byBhcnJvdyBwb3NpdGlvbi9vcmllbnRhdGlvblxuICAgIGNvbnRleHQudHJhbnNsYXRlKHgsIHkpO1xuICAgIGNvbnRleHQucm90YXRlKGFuZ2xlKTtcbiAgICBjb250ZXh0LnNjYWxlKHNpemUsIHNpemUpO1xuICB9XG5cbiAgaWYgKGZpbGwgPT09ICdmaWxsZWQnIHx8IGZpbGwgPT09ICdib3RoJykge1xuICAgIGlmICh1c2VQYXRocykge1xuICAgICAgY29udGV4dC5maWxsKHBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZmlsbCA9PT0gJ2hvbGxvdycgfHwgZmlsbCA9PT0gJ2JvdGgnKSB7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSAoc2hhcGVJbXBsLm1hdGNoRWRnZVdpZHRoID8gZWRnZVdpZHRoIDogMSkgLyAodXNlUGF0aHMgPyBzaXplIDogMSk7XG4gICAgY29udGV4dC5saW5lSm9pbiA9ICdtaXRlcic7XG5cbiAgICBpZiAodXNlUGF0aHMpIHtcbiAgICAgIGNvbnRleHQuc3Ryb2tlKHBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh1c2VQYXRocykge1xuICAgIC8vIHJlc2V0IHRyYW5zZm9ybSBieSBhcHBseWluZyBpbnZlcnNlXG4gICAgY29udGV4dC5zY2FsZSgxIC8gc2l6ZSwgMSAvIHNpemUpO1xuICAgIGNvbnRleHQucm90YXRlKC1hbmdsZSk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLXgsIC15KTtcbiAgfVxufTtcblxudmFyIENScCQ3ID0ge307XG5cbkNScCQ3LnNhZmVEcmF3SW1hZ2UgPSBmdW5jdGlvbiAoY29udGV4dCwgaW1nLCBpeCwgaXksIGl3LCBpaCwgeCwgeSwgdywgaCkge1xuICAvLyBkZXRlY3QgcHJvYmxlbWF0aWMgY2FzZXMgZm9yIG9sZCBicm93c2VycyB3aXRoIGJhZCBpbWFnZXMgKGNoZWFwZXIgdGhhbiB0cnktY2F0Y2gpXG4gIGlmIChpdyA8PSAwIHx8IGloIDw9IDAgfHwgdyA8PSAwIHx8IGggPD0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29udGV4dC5kcmF3SW1hZ2UoaW1nLCBpeCwgaXksIGl3LCBpaCwgeCwgeSwgdywgaCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB3YXJuKGUpO1xuICB9XG59O1xuXG5DUnAkNy5kcmF3SW5zY3JpYmVkSW1hZ2UgPSBmdW5jdGlvbiAoY29udGV4dCwgaW1nLCBub2RlLCBpbmRleCwgbm9kZU9wYWNpdHkpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgcG9zID0gbm9kZS5wb3NpdGlvbigpO1xuICB2YXIgbm9kZVggPSBwb3MueDtcbiAgdmFyIG5vZGVZID0gcG9zLnk7XG4gIHZhciBzdHlsZU9iaiA9IG5vZGUuY3koKS5zdHlsZSgpO1xuICB2YXIgZ2V0SW5kZXhlZFN0eWxlID0gc3R5bGVPYmouZ2V0SW5kZXhlZFN0eWxlLmJpbmQoc3R5bGVPYmopO1xuICB2YXIgZml0ID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWZpdCcsICd2YWx1ZScsIGluZGV4KTtcbiAgdmFyIHJlcGVhdCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1yZXBlYXQnLCAndmFsdWUnLCBpbmRleCk7XG4gIHZhciBub2RlVyA9IG5vZGUud2lkdGgoKTtcbiAgdmFyIG5vZGVIID0gbm9kZS5oZWlnaHQoKTtcbiAgdmFyIHBhZGRpbmdYMiA9IG5vZGUucGFkZGluZygpICogMjtcbiAgdmFyIG5vZGVUVyA9IG5vZGVXICsgKGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC13aWR0aC1yZWxhdGl2ZS10bycsICd2YWx1ZScsIGluZGV4KSA9PT0gJ2lubmVyJyA/IDAgOiBwYWRkaW5nWDIpO1xuICB2YXIgbm9kZVRIID0gbm9kZUggKyAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWhlaWdodC1yZWxhdGl2ZS10bycsICd2YWx1ZScsIGluZGV4KSA9PT0gJ2lubmVyJyA/IDAgOiBwYWRkaW5nWDIpO1xuICB2YXIgcnMgPSBub2RlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgY2xpcCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1jbGlwJywgJ3ZhbHVlJywgaW5kZXgpO1xuICB2YXIgc2hvdWxkQ2xpcCA9IGNsaXAgPT09ICdub2RlJztcbiAgdmFyIGltZ09wYWNpdHkgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtaW1hZ2Utb3BhY2l0eScsICd2YWx1ZScsIGluZGV4KSAqIG5vZGVPcGFjaXR5O1xuICB2YXIgc21vb3RoID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWltYWdlLXNtb290aGluZycsICd2YWx1ZScsIGluZGV4KTtcbiAgdmFyIGltZ1cgPSBpbWcud2lkdGggfHwgaW1nLmNhY2hlZFc7XG4gIHZhciBpbWdIID0gaW1nLmhlaWdodCB8fCBpbWcuY2FjaGVkSDsgLy8gd29ya2Fyb3VuZCBmb3IgYnJva2VuIGJyb3dzZXJzIGxpa2UgaWVcblxuICBpZiAobnVsbCA9PSBpbWdXIHx8IG51bGwgPT0gaW1nSCkge1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaW1nKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gICAgaW1nVyA9IGltZy5jYWNoZWRXID0gaW1nLndpZHRoIHx8IGltZy5vZmZzZXRXaWR0aDtcbiAgICBpbWdIID0gaW1nLmNhY2hlZEggPSBpbWcuaGVpZ2h0IHx8IGltZy5vZmZzZXRIZWlnaHQ7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChpbWcpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gIH1cblxuICB2YXIgdyA9IGltZ1c7XG4gIHZhciBoID0gaW1nSDtcblxuICBpZiAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXdpZHRoJywgJ3ZhbHVlJywgaW5kZXgpICE9PSAnYXV0bycpIHtcbiAgICBpZiAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXdpZHRoJywgJ3VuaXRzJywgaW5kZXgpID09PSAnJScpIHtcbiAgICAgIHcgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtd2lkdGgnLCAncGZWYWx1ZScsIGluZGV4KSAqIG5vZGVUVztcbiAgICB9IGVsc2Uge1xuICAgICAgdyA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC13aWR0aCcsICdwZlZhbHVlJywgaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtaGVpZ2h0JywgJ3ZhbHVlJywgaW5kZXgpICE9PSAnYXV0bycpIHtcbiAgICBpZiAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWhlaWdodCcsICd1bml0cycsIGluZGV4KSA9PT0gJyUnKSB7XG4gICAgICBoID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWhlaWdodCcsICdwZlZhbHVlJywgaW5kZXgpICogbm9kZVRIO1xuICAgIH0gZWxzZSB7XG4gICAgICBoID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWhlaWdodCcsICdwZlZhbHVlJywgaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh3ID09PSAwIHx8IGggPT09IDApIHtcbiAgICByZXR1cm47IC8vIG5vIHBvaW50IGluIGRyYXdpbmcgZW1wdHkgaW1hZ2UgKGFuZCBjaHJvbWUgaXMgYnJva2VuIGluIHRoaXMgY2FzZSlcbiAgfVxuXG4gIGlmIChmaXQgPT09ICdjb250YWluJykge1xuICAgIHZhciBzY2FsZSA9IE1hdGgubWluKG5vZGVUVyAvIHcsIG5vZGVUSCAvIGgpO1xuICAgIHcgKj0gc2NhbGU7XG4gICAgaCAqPSBzY2FsZTtcbiAgfSBlbHNlIGlmIChmaXQgPT09ICdjb3ZlcicpIHtcbiAgICB2YXIgc2NhbGUgPSBNYXRoLm1heChub2RlVFcgLyB3LCBub2RlVEggLyBoKTtcbiAgICB3ICo9IHNjYWxlO1xuICAgIGggKj0gc2NhbGU7XG4gIH1cblxuICB2YXIgeCA9IG5vZGVYIC0gbm9kZVRXIC8gMjsgLy8gbGVmdFxuXG4gIHZhciBwb3NYVW5pdHMgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtcG9zaXRpb24teCcsICd1bml0cycsIGluZGV4KTtcbiAgdmFyIHBvc1hQZlZhbCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1wb3NpdGlvbi14JywgJ3BmVmFsdWUnLCBpbmRleCk7XG5cbiAgaWYgKHBvc1hVbml0cyA9PT0gJyUnKSB7XG4gICAgeCArPSAobm9kZVRXIC0gdykgKiBwb3NYUGZWYWw7XG4gIH0gZWxzZSB7XG4gICAgeCArPSBwb3NYUGZWYWw7XG4gIH1cblxuICB2YXIgb2ZmWFVuaXRzID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLW9mZnNldC14JywgJ3VuaXRzJywgaW5kZXgpO1xuICB2YXIgb2ZmWFBmVmFsID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLW9mZnNldC14JywgJ3BmVmFsdWUnLCBpbmRleCk7XG5cbiAgaWYgKG9mZlhVbml0cyA9PT0gJyUnKSB7XG4gICAgeCArPSAobm9kZVRXIC0gdykgKiBvZmZYUGZWYWw7XG4gIH0gZWxzZSB7XG4gICAgeCArPSBvZmZYUGZWYWw7XG4gIH1cblxuICB2YXIgeSA9IG5vZGVZIC0gbm9kZVRIIC8gMjsgLy8gdG9wXG5cbiAgdmFyIHBvc1lVbml0cyA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1wb3NpdGlvbi15JywgJ3VuaXRzJywgaW5kZXgpO1xuICB2YXIgcG9zWVBmVmFsID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXknLCAncGZWYWx1ZScsIGluZGV4KTtcblxuICBpZiAocG9zWVVuaXRzID09PSAnJScpIHtcbiAgICB5ICs9IChub2RlVEggLSBoKSAqIHBvc1lQZlZhbDtcbiAgfSBlbHNlIHtcbiAgICB5ICs9IHBvc1lQZlZhbDtcbiAgfVxuXG4gIHZhciBvZmZZVW5pdHMgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtb2Zmc2V0LXknLCAndW5pdHMnLCBpbmRleCk7XG4gIHZhciBvZmZZUGZWYWwgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtb2Zmc2V0LXknLCAncGZWYWx1ZScsIGluZGV4KTtcblxuICBpZiAob2ZmWVVuaXRzID09PSAnJScpIHtcbiAgICB5ICs9IChub2RlVEggLSBoKSAqIG9mZllQZlZhbDtcbiAgfSBlbHNlIHtcbiAgICB5ICs9IG9mZllQZlZhbDtcbiAgfVxuXG4gIGlmIChycy5wYXRoQ2FjaGUpIHtcbiAgICB4IC09IG5vZGVYO1xuICAgIHkgLT0gbm9kZVk7XG4gICAgbm9kZVggPSAwO1xuICAgIG5vZGVZID0gMDtcbiAgfVxuXG4gIHZhciBnQWxwaGEgPSBjb250ZXh0Lmdsb2JhbEFscGhhO1xuICBjb250ZXh0Lmdsb2JhbEFscGhhID0gaW1nT3BhY2l0eTtcbiAgdmFyIHNtb290aGluZ0VuYWJsZWQgPSByLmdldEltZ1Ntb290aGluZyhjb250ZXh0KTtcbiAgdmFyIGlzU21vb3RoaW5nU3dpdGNoZWQgPSBmYWxzZTtcblxuICBpZiAoc21vb3RoID09PSAnbm8nICYmIHNtb290aGluZ0VuYWJsZWQpIHtcbiAgICByLnNldEltZ1Ntb290aGluZyhjb250ZXh0LCBmYWxzZSk7XG4gICAgaXNTbW9vdGhpbmdTd2l0Y2hlZCA9IHRydWU7XG4gIH0gZWxzZSBpZiAoc21vb3RoID09PSAneWVzJyAmJiAhc21vb3RoaW5nRW5hYmxlZCkge1xuICAgIHIuc2V0SW1nU21vb3RoaW5nKGNvbnRleHQsIHRydWUpO1xuICAgIGlzU21vb3RoaW5nU3dpdGNoZWQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKHJlcGVhdCA9PT0gJ25vLXJlcGVhdCcpIHtcbiAgICBpZiAoc2hvdWxkQ2xpcCkge1xuICAgICAgY29udGV4dC5zYXZlKCk7XG5cbiAgICAgIGlmIChycy5wYXRoQ2FjaGUpIHtcbiAgICAgICAgY29udGV4dC5jbGlwKHJzLnBhdGhDYWNoZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByLm5vZGVTaGFwZXNbci5nZXROb2RlU2hhcGUobm9kZSldLmRyYXcoY29udGV4dCwgbm9kZVgsIG5vZGVZLCBub2RlVFcsIG5vZGVUSCk7XG4gICAgICAgIGNvbnRleHQuY2xpcCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHIuc2FmZURyYXdJbWFnZShjb250ZXh0LCBpbWcsIDAsIDAsIGltZ1csIGltZ0gsIHgsIHksIHcsIGgpO1xuXG4gICAgaWYgKHNob3VsZENsaXApIHtcbiAgICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgcGF0dGVybiA9IGNvbnRleHQuY3JlYXRlUGF0dGVybihpbWcsIHJlcGVhdCk7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBwYXR0ZXJuO1xuICAgIHIubm9kZVNoYXBlc1tyLmdldE5vZGVTaGFwZShub2RlKV0uZHJhdyhjb250ZXh0LCBub2RlWCwgbm9kZVksIG5vZGVUVywgbm9kZVRIKTtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSh4LCB5KTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgteCwgLXkpO1xuICB9XG5cbiAgY29udGV4dC5nbG9iYWxBbHBoYSA9IGdBbHBoYTtcblxuICBpZiAoaXNTbW9vdGhpbmdTd2l0Y2hlZCkge1xuICAgIHIuc2V0SW1nU21vb3RoaW5nKGNvbnRleHQsIHNtb290aGluZ0VuYWJsZWQpO1xuICB9XG59O1xuXG52YXIgQ1JwJDYgPSB7fTtcblxuQ1JwJDYuZWxlVGV4dEJpZ2dlclRoYW5NaW4gPSBmdW5jdGlvbiAoZWxlLCBzY2FsZSkge1xuICBpZiAoIXNjYWxlKSB7XG4gICAgdmFyIHpvb20gPSBlbGUuY3koKS56b29tKCk7XG4gICAgdmFyIHB4UmF0aW8gPSB0aGlzLmdldFBpeGVsUmF0aW8oKTtcbiAgICB2YXIgbHZsID0gTWF0aC5jZWlsKGxvZzIoem9vbSAqIHB4UmF0aW8pKTsgLy8gdGhlIGVmZmVjdGl2ZSB0ZXh0dXJlIGxldmVsXG5cbiAgICBzY2FsZSA9IE1hdGgucG93KDIsIGx2bCk7XG4gIH1cblxuICB2YXIgY29tcHV0ZWRTaXplID0gZWxlLnBzdHlsZSgnZm9udC1zaXplJykucGZWYWx1ZSAqIHNjYWxlO1xuICB2YXIgbWluU2l6ZSA9IGVsZS5wc3R5bGUoJ21pbi16b29tZWQtZm9udC1zaXplJykucGZWYWx1ZTtcblxuICBpZiAoY29tcHV0ZWRTaXplIDwgbWluU2l6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuQ1JwJDYuZHJhd0VsZW1lbnRUZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgc2hpZnRUb09yaWdpbldpdGhCYiwgZm9yY2UsIHByZWZpeCkge1xuICB2YXIgdXNlRWxlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDogdHJ1ZTtcbiAgdmFyIHIgPSB0aGlzO1xuXG4gIGlmIChmb3JjZSA9PSBudWxsKSB7XG4gICAgaWYgKHVzZUVsZU9wYWNpdHkgJiYgIXIuZWxlVGV4dEJpZ2dlclRoYW5NaW4oZWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSBlbHNlIGlmIChmb3JjZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgdmFyIGxhYmVsID0gZWxlLnBzdHlsZSgnbGFiZWwnKTtcblxuICAgIGlmICghbGFiZWwgfHwgIWxhYmVsLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGp1c3RpZmljYXRpb24gPSByLmdldExhYmVsSnVzdGlmaWNhdGlvbihlbGUpO1xuICAgIGNvbnRleHQudGV4dEFsaWduID0ganVzdGlmaWNhdGlvbjtcbiAgICBjb250ZXh0LnRleHRCYXNlbGluZSA9ICdib3R0b20nO1xuICB9IGVsc2Uge1xuICAgIHZhciBiYWRMaW5lID0gZWxlLmVsZW1lbnQoKS5fcHJpdmF0ZS5yc2NyYXRjaC5iYWRMaW5lO1xuXG4gICAgdmFyIF9sYWJlbCA9IGVsZS5wc3R5bGUoJ2xhYmVsJyk7XG5cbiAgICB2YXIgc3JjTGFiZWwgPSBlbGUucHN0eWxlKCdzb3VyY2UtbGFiZWwnKTtcbiAgICB2YXIgdGd0TGFiZWwgPSBlbGUucHN0eWxlKCd0YXJnZXQtbGFiZWwnKTtcblxuICAgIGlmIChiYWRMaW5lIHx8ICghX2xhYmVsIHx8ICFfbGFiZWwudmFsdWUpICYmICghc3JjTGFiZWwgfHwgIXNyY0xhYmVsLnZhbHVlKSAmJiAoIXRndExhYmVsIHx8ICF0Z3RMYWJlbC52YWx1ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb250ZXh0LnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgIGNvbnRleHQudGV4dEJhc2VsaW5lID0gJ2JvdHRvbSc7XG4gIH1cblxuICB2YXIgYXBwbHlSb3RhdGlvbiA9ICFzaGlmdFRvT3JpZ2luV2l0aEJiO1xuICB2YXIgYmI7XG5cbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBiYiA9IHNoaWZ0VG9PcmlnaW5XaXRoQmI7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLWJiLngxLCAtYmIueTEpO1xuICB9XG5cbiAgaWYgKHByZWZpeCA9PSBudWxsKSB7XG4gICAgci5kcmF3VGV4dChjb250ZXh0LCBlbGUsIG51bGwsIGFwcGx5Um90YXRpb24sIHVzZUVsZU9wYWNpdHkpO1xuXG4gICAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgICAgci5kcmF3VGV4dChjb250ZXh0LCBlbGUsICdzb3VyY2UnLCBhcHBseVJvdGF0aW9uLCB1c2VFbGVPcGFjaXR5KTtcbiAgICAgIHIuZHJhd1RleHQoY29udGV4dCwgZWxlLCAndGFyZ2V0JywgYXBwbHlSb3RhdGlvbiwgdXNlRWxlT3BhY2l0eSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHIuZHJhd1RleHQoY29udGV4dCwgZWxlLCBwcmVmaXgsIGFwcGx5Um90YXRpb24sIHVzZUVsZU9wYWNpdHkpO1xuICB9XG5cbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZShiYi54MSwgYmIueTEpO1xuICB9XG59O1xuXG5DUnAkNi5nZXRGb250Q2FjaGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICB2YXIgY2FjaGU7XG4gIHRoaXMuZm9udENhY2hlcyA9IHRoaXMuZm9udENhY2hlcyB8fCBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZm9udENhY2hlcy5sZW5ndGg7IGkrKykge1xuICAgIGNhY2hlID0gdGhpcy5mb250Q2FjaGVzW2ldO1xuXG4gICAgaWYgKGNhY2hlLmNvbnRleHQgPT09IGNvbnRleHQpIHtcbiAgICAgIHJldHVybiBjYWNoZTtcbiAgICB9XG4gIH1cblxuICBjYWNoZSA9IHtcbiAgICBjb250ZXh0OiBjb250ZXh0XG4gIH07XG4gIHRoaXMuZm9udENhY2hlcy5wdXNoKGNhY2hlKTtcbiAgcmV0dXJuIGNhY2hlO1xufTsgLy8gc2V0IHVwIGNhbnZhcyBjb250ZXh0IHdpdGggZm9udFxuLy8gcmV0dXJucyB0cmFuc2Zvcm1lZCB0ZXh0IHN0cmluZ1xuXG5cbkNScCQ2LnNldHVwVGV4dFN0eWxlID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSkge1xuICB2YXIgdXNlRWxlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcbiAgLy8gRm9udCBzdHlsZVxuICB2YXIgbGFiZWxTdHlsZSA9IGVsZS5wc3R5bGUoJ2ZvbnQtc3R5bGUnKS5zdHJWYWx1ZTtcbiAgdmFyIGxhYmVsU2l6ZSA9IGVsZS5wc3R5bGUoJ2ZvbnQtc2l6ZScpLnBmVmFsdWUgKyAncHgnO1xuICB2YXIgbGFiZWxGYW1pbHkgPSBlbGUucHN0eWxlKCdmb250LWZhbWlseScpLnN0clZhbHVlO1xuICB2YXIgbGFiZWxXZWlnaHQgPSBlbGUucHN0eWxlKCdmb250LXdlaWdodCcpLnN0clZhbHVlO1xuICB2YXIgb3BhY2l0eSA9IHVzZUVsZU9wYWNpdHkgPyBlbGUuZWZmZWN0aXZlT3BhY2l0eSgpICogZWxlLnBzdHlsZSgndGV4dC1vcGFjaXR5JykudmFsdWUgOiAxO1xuICB2YXIgb3V0bGluZU9wYWNpdHkgPSBlbGUucHN0eWxlKCd0ZXh0LW91dGxpbmUtb3BhY2l0eScpLnZhbHVlICogb3BhY2l0eTtcbiAgdmFyIGNvbG9yID0gZWxlLnBzdHlsZSgnY29sb3InKS52YWx1ZTtcbiAgdmFyIG91dGxpbmVDb2xvciA9IGVsZS5wc3R5bGUoJ3RleHQtb3V0bGluZS1jb2xvcicpLnZhbHVlO1xuICBjb250ZXh0LmZvbnQgPSBsYWJlbFN0eWxlICsgJyAnICsgbGFiZWxXZWlnaHQgKyAnICcgKyBsYWJlbFNpemUgKyAnICcgKyBsYWJlbEZhbWlseTtcbiAgY29udGV4dC5saW5lSm9pbiA9ICdyb3VuZCc7IC8vIHNvIHRleHQgb3V0bGluZXMgYXJlbid0IGphZ2dlZFxuXG4gIHRoaXMuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgb3BhY2l0eSk7XG4gIHRoaXMuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBvdXRsaW5lQ29sb3JbMF0sIG91dGxpbmVDb2xvclsxXSwgb3V0bGluZUNvbG9yWzJdLCBvdXRsaW5lT3BhY2l0eSk7XG59OyAvLyBUT0RPIGVuc3VyZSByZS11c2VkXG5cblxuZnVuY3Rpb24gcm91bmRSZWN0KGN0eCwgeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICB2YXIgcmFkaXVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiA1O1xuICBjdHguYmVnaW5QYXRoKCk7XG4gIGN0eC5tb3ZlVG8oeCArIHJhZGl1cywgeSk7XG4gIGN0eC5saW5lVG8oeCArIHdpZHRoIC0gcmFkaXVzLCB5KTtcbiAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCArIHdpZHRoLCB5LCB4ICsgd2lkdGgsIHkgKyByYWRpdXMpO1xuICBjdHgubGluZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCAtIHJhZGl1cyk7XG4gIGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCArIHdpZHRoIC0gcmFkaXVzLCB5ICsgaGVpZ2h0KTtcbiAgY3R4LmxpbmVUbyh4ICsgcmFkaXVzLCB5ICsgaGVpZ2h0KTtcbiAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCwgeSArIGhlaWdodCwgeCwgeSArIGhlaWdodCAtIHJhZGl1cyk7XG4gIGN0eC5saW5lVG8oeCwgeSArIHJhZGl1cyk7XG4gIGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHgsIHksIHggKyByYWRpdXMsIHkpO1xuICBjdHguY2xvc2VQYXRoKCk7XG4gIGN0eC5maWxsKCk7XG59XG5cbkNScCQ2LmdldFRleHRBbmdsZSA9IGZ1bmN0aW9uIChlbGUsIHByZWZpeCkge1xuICB2YXIgdGhldGE7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHJzY3JhdGNoID0gX3AucnNjcmF0Y2g7XG4gIHZhciBwZGFzaCA9IHByZWZpeCA/IHByZWZpeCArICctJyA6ICcnO1xuICB2YXIgcm90YXRpb24gPSBlbGUucHN0eWxlKHBkYXNoICsgJ3RleHQtcm90YXRpb24nKTtcbiAgdmFyIHRleHRBbmdsZSA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbEFuZ2xlJywgcHJlZml4KTtcblxuICBpZiAocm90YXRpb24uc3RyVmFsdWUgPT09ICdhdXRvcm90YXRlJykge1xuICAgIHRoZXRhID0gZWxlLmlzRWRnZSgpID8gdGV4dEFuZ2xlIDogMDtcbiAgfSBlbHNlIGlmIChyb3RhdGlvbi5zdHJWYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgdGhldGEgPSAwO1xuICB9IGVsc2Uge1xuICAgIHRoZXRhID0gcm90YXRpb24ucGZWYWx1ZTtcbiAgfVxuXG4gIHJldHVybiB0aGV0YTtcbn07XG5cbkNScCQ2LmRyYXdUZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgcHJlZml4KSB7XG4gIHZhciBhcHBseVJvdGF0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB0cnVlO1xuICB2YXIgdXNlRWxlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdHJ1ZTtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcnNjcmF0Y2ggPSBfcC5yc2NyYXRjaDtcbiAgdmFyIHBhcmVudE9wYWNpdHkgPSB1c2VFbGVPcGFjaXR5ID8gZWxlLmVmZmVjdGl2ZU9wYWNpdHkoKSA6IDE7XG5cbiAgaWYgKHVzZUVsZU9wYWNpdHkgJiYgKHBhcmVudE9wYWNpdHkgPT09IDAgfHwgZWxlLnBzdHlsZSgndGV4dC1vcGFjaXR5JykudmFsdWUgPT09IDApKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIHVzZSAnbWFpbicgYXMgYW4gYWxpYXMgZm9yIHRoZSBtYWluIGxhYmVsIChpLmUuIG51bGwgcHJlZml4KVxuXG5cbiAgaWYgKHByZWZpeCA9PT0gJ21haW4nKSB7XG4gICAgcHJlZml4ID0gbnVsbDtcbiAgfVxuXG4gIHZhciB0ZXh0WCA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbFgnLCBwcmVmaXgpO1xuICB2YXIgdGV4dFkgPSBnZXRQcmVmaXhlZFByb3BlcnR5KHJzY3JhdGNoLCAnbGFiZWxZJywgcHJlZml4KTtcbiAgdmFyIG9yZ1RleHRYLCBvcmdUZXh0WTsgLy8gdXNlZCBmb3Igcm90YXRpb25cblxuICB2YXIgdGV4dCA9IHRoaXMuZ2V0TGFiZWxUZXh0KGVsZSwgcHJlZml4KTtcblxuICBpZiAodGV4dCAhPSBudWxsICYmIHRleHQgIT09ICcnICYmICFpc05hTih0ZXh0WCkgJiYgIWlzTmFOKHRleHRZKSkge1xuICAgIHRoaXMuc2V0dXBUZXh0U3R5bGUoY29udGV4dCwgZWxlLCB1c2VFbGVPcGFjaXR5KTtcbiAgICB2YXIgcGRhc2ggPSBwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJztcbiAgICB2YXIgdGV4dFcgPSBnZXRQcmVmaXhlZFByb3BlcnR5KHJzY3JhdGNoLCAnbGFiZWxXaWR0aCcsIHByZWZpeCk7XG4gICAgdmFyIHRleHRIID0gZ2V0UHJlZml4ZWRQcm9wZXJ0eShyc2NyYXRjaCwgJ2xhYmVsSGVpZ2h0JywgcHJlZml4KTtcbiAgICB2YXIgbWFyZ2luWCA9IGVsZS5wc3R5bGUocGRhc2ggKyAndGV4dC1tYXJnaW4teCcpLnBmVmFsdWU7XG4gICAgdmFyIG1hcmdpblkgPSBlbGUucHN0eWxlKHBkYXNoICsgJ3RleHQtbWFyZ2luLXknKS5wZlZhbHVlO1xuICAgIHZhciBpc0VkZ2UgPSBlbGUuaXNFZGdlKCk7XG4gICAgdmFyIGhhbGlnbiA9IGVsZS5wc3R5bGUoJ3RleHQtaGFsaWduJykudmFsdWU7XG4gICAgdmFyIHZhbGlnbiA9IGVsZS5wc3R5bGUoJ3RleHQtdmFsaWduJykudmFsdWU7XG5cbiAgICBpZiAoaXNFZGdlKSB7XG4gICAgICBoYWxpZ24gPSAnY2VudGVyJztcbiAgICAgIHZhbGlnbiA9ICdjZW50ZXInO1xuICAgIH1cblxuICAgIHRleHRYICs9IG1hcmdpblg7XG4gICAgdGV4dFkgKz0gbWFyZ2luWTtcbiAgICB2YXIgdGhldGE7XG5cbiAgICBpZiAoIWFwcGx5Um90YXRpb24pIHtcbiAgICAgIHRoZXRhID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhldGEgPSB0aGlzLmdldFRleHRBbmdsZShlbGUsIHByZWZpeCk7XG4gICAgfVxuXG4gICAgaWYgKHRoZXRhICE9PSAwKSB7XG4gICAgICBvcmdUZXh0WCA9IHRleHRYO1xuICAgICAgb3JnVGV4dFkgPSB0ZXh0WTtcbiAgICAgIGNvbnRleHQudHJhbnNsYXRlKG9yZ1RleHRYLCBvcmdUZXh0WSk7XG4gICAgICBjb250ZXh0LnJvdGF0ZSh0aGV0YSk7XG4gICAgICB0ZXh0WCA9IDA7XG4gICAgICB0ZXh0WSA9IDA7XG4gICAgfVxuXG4gICAgc3dpdGNoICh2YWxpZ24pIHtcbiAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICB0ZXh0WSArPSB0ZXh0SCAvIDI7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICB0ZXh0WSArPSB0ZXh0SDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGJhY2tncm91bmRPcGFjaXR5ID0gZWxlLnBzdHlsZSgndGV4dC1iYWNrZ3JvdW5kLW9wYWNpdHknKS52YWx1ZTtcbiAgICB2YXIgYm9yZGVyT3BhY2l0eSA9IGVsZS5wc3R5bGUoJ3RleHQtYm9yZGVyLW9wYWNpdHknKS52YWx1ZTtcbiAgICB2YXIgdGV4dEJvcmRlcldpZHRoID0gZWxlLnBzdHlsZSgndGV4dC1ib3JkZXItd2lkdGgnKS5wZlZhbHVlO1xuICAgIHZhciBiYWNrZ3JvdW5kUGFkZGluZyA9IGVsZS5wc3R5bGUoJ3RleHQtYmFja2dyb3VuZC1wYWRkaW5nJykucGZWYWx1ZTtcblxuICAgIGlmIChiYWNrZ3JvdW5kT3BhY2l0eSA+IDAgfHwgdGV4dEJvcmRlcldpZHRoID4gMCAmJiBib3JkZXJPcGFjaXR5ID4gMCkge1xuICAgICAgdmFyIGJnWCA9IHRleHRYIC0gYmFja2dyb3VuZFBhZGRpbmc7XG5cbiAgICAgIHN3aXRjaCAoaGFsaWduKSB7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgIGJnWCAtPSB0ZXh0VztcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICAgIGJnWCAtPSB0ZXh0VyAvIDI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHZhciBiZ1kgPSB0ZXh0WSAtIHRleHRIIC0gYmFja2dyb3VuZFBhZGRpbmc7XG4gICAgICB2YXIgYmdXID0gdGV4dFcgKyAyICogYmFja2dyb3VuZFBhZGRpbmc7XG4gICAgICB2YXIgYmdIID0gdGV4dEggKyAyICogYmFja2dyb3VuZFBhZGRpbmc7XG5cbiAgICAgIGlmIChiYWNrZ3JvdW5kT3BhY2l0eSA+IDApIHtcbiAgICAgICAgdmFyIHRleHRGaWxsID0gY29udGV4dC5maWxsU3R5bGU7XG4gICAgICAgIHZhciB0ZXh0QmFja2dyb3VuZENvbG9yID0gZWxlLnBzdHlsZSgndGV4dC1iYWNrZ3JvdW5kLWNvbG9yJykudmFsdWU7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJ3JnYmEoJyArIHRleHRCYWNrZ3JvdW5kQ29sb3JbMF0gKyAnLCcgKyB0ZXh0QmFja2dyb3VuZENvbG9yWzFdICsgJywnICsgdGV4dEJhY2tncm91bmRDb2xvclsyXSArICcsJyArIGJhY2tncm91bmRPcGFjaXR5ICogcGFyZW50T3BhY2l0eSArICcpJztcbiAgICAgICAgdmFyIHN0eWxlU2hhcGUgPSBlbGUucHN0eWxlKCd0ZXh0LWJhY2tncm91bmQtc2hhcGUnKS5zdHJWYWx1ZTtcblxuICAgICAgICBpZiAoc3R5bGVTaGFwZS5pbmRleE9mKCdyb3VuZCcpID09PSAwKSB7XG4gICAgICAgICAgcm91bmRSZWN0KGNvbnRleHQsIGJnWCwgYmdZLCBiZ1csIGJnSCwgMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5maWxsUmVjdChiZ1gsIGJnWSwgYmdXLCBiZ0gpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSB0ZXh0RmlsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRleHRCb3JkZXJXaWR0aCA+IDAgJiYgYm9yZGVyT3BhY2l0eSA+IDApIHtcbiAgICAgICAgdmFyIHRleHRTdHJva2UgPSBjb250ZXh0LnN0cm9rZVN0eWxlO1xuICAgICAgICB2YXIgdGV4dExpbmVXaWR0aCA9IGNvbnRleHQubGluZVdpZHRoO1xuICAgICAgICB2YXIgdGV4dEJvcmRlckNvbG9yID0gZWxlLnBzdHlsZSgndGV4dC1ib3JkZXItY29sb3InKS52YWx1ZTtcbiAgICAgICAgdmFyIHRleHRCb3JkZXJTdHlsZSA9IGVsZS5wc3R5bGUoJ3RleHQtYm9yZGVyLXN0eWxlJykudmFsdWU7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAncmdiYSgnICsgdGV4dEJvcmRlckNvbG9yWzBdICsgJywnICsgdGV4dEJvcmRlckNvbG9yWzFdICsgJywnICsgdGV4dEJvcmRlckNvbG9yWzJdICsgJywnICsgYm9yZGVyT3BhY2l0eSAqIHBhcmVudE9wYWNpdHkgKyAnKSc7XG4gICAgICAgIGNvbnRleHQubGluZVdpZHRoID0gdGV4dEJvcmRlcldpZHRoO1xuXG4gICAgICAgIGlmIChjb250ZXh0LnNldExpbmVEYXNoKSB7XG4gICAgICAgICAgLy8gZm9yIHZlcnkgb3V0b2ZkYXRlIGJyb3dzZXJzXG4gICAgICAgICAgc3dpdGNoICh0ZXh0Qm9yZGVyU3R5bGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2RvdHRlZCc6XG4gICAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goWzEsIDFdKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ2Rhc2hlZCc6XG4gICAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goWzQsIDJdKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ2RvdWJsZSc6XG4gICAgICAgICAgICAgIGNvbnRleHQubGluZVdpZHRoID0gdGV4dEJvcmRlcldpZHRoIC8gNDsgLy8gNTAlIHJlc2VydmVkIGZvciB3aGl0ZSBiZXR3ZWVuIHRoZSB0d28gYm9yZGVyc1xuXG4gICAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goW10pO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnc29saWQnOlxuICAgICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFtdKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5zdHJva2VSZWN0KGJnWCwgYmdZLCBiZ1csIGJnSCk7XG5cbiAgICAgICAgaWYgKHRleHRCb3JkZXJTdHlsZSA9PT0gJ2RvdWJsZScpIHtcbiAgICAgICAgICB2YXIgd2hpdGVXaWR0aCA9IHRleHRCb3JkZXJXaWR0aCAvIDI7XG4gICAgICAgICAgY29udGV4dC5zdHJva2VSZWN0KGJnWCArIHdoaXRlV2lkdGgsIGJnWSArIHdoaXRlV2lkdGgsIGJnVyAtIHdoaXRlV2lkdGggKiAyLCBiZ0ggLSB3aGl0ZVdpZHRoICogMik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5zZXRMaW5lRGFzaCkge1xuICAgICAgICAgIC8vIGZvciB2ZXJ5IG91dG9mZGF0ZSBicm93c2Vyc1xuICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goW10pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5saW5lV2lkdGggPSB0ZXh0TGluZVdpZHRoO1xuICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gdGV4dFN0cm9rZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbGluZVdpZHRoID0gMiAqIGVsZS5wc3R5bGUoJ3RleHQtb3V0bGluZS13aWR0aCcpLnBmVmFsdWU7IC8vICoyIGIvYyB0aGUgc3Ryb2tlIGlzIGRyYXduIGNlbnRyZWQgb24gdGhlIG1pZGRsZVxuXG4gICAgaWYgKGxpbmVXaWR0aCA+IDApIHtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgIH1cblxuICAgIGlmIChlbGUucHN0eWxlKCd0ZXh0LXdyYXAnKS52YWx1ZSA9PT0gJ3dyYXAnKSB7XG4gICAgICB2YXIgbGluZXMgPSBnZXRQcmVmaXhlZFByb3BlcnR5KHJzY3JhdGNoLCAnbGFiZWxXcmFwQ2FjaGVkTGluZXMnLCBwcmVmaXgpO1xuICAgICAgdmFyIGxpbmVIZWlnaHQgPSBnZXRQcmVmaXhlZFByb3BlcnR5KHJzY3JhdGNoLCAnbGFiZWxMaW5lSGVpZ2h0JywgcHJlZml4KTtcbiAgICAgIHZhciBoYWxmVGV4dFcgPSB0ZXh0VyAvIDI7XG4gICAgICB2YXIganVzdGlmaWNhdGlvbiA9IHRoaXMuZ2V0TGFiZWxKdXN0aWZpY2F0aW9uKGVsZSk7XG5cbiAgICAgIGlmIChqdXN0aWZpY2F0aW9uID09PSAnYXV0bycpIDsgZWxzZSBpZiAoaGFsaWduID09PSAnbGVmdCcpIHtcbiAgICAgICAgLy8gYXV0byBqdXN0aWZpY2F0aW9uIDogcmlnaHRcbiAgICAgICAgaWYgKGp1c3RpZmljYXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgIHRleHRYICs9IC10ZXh0VztcbiAgICAgICAgfSBlbHNlIGlmIChqdXN0aWZpY2F0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgICAgIHRleHRYICs9IC1oYWxmVGV4dFc7XG4gICAgICAgIH0gLy8gZWxzZSBzYW1lIGFzIGF1dG9cblxuICAgICAgfSBlbHNlIGlmIChoYWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgIC8vIGF1dG8ganVzdGZpY2F0aW9uIDogY2VudGVyXG4gICAgICAgIGlmIChqdXN0aWZpY2F0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICB0ZXh0WCArPSAtaGFsZlRleHRXO1xuICAgICAgICB9IGVsc2UgaWYgKGp1c3RpZmljYXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICB0ZXh0WCArPSBoYWxmVGV4dFc7XG4gICAgICAgIH0gLy8gZWxzZSBzYW1lIGFzIGF1dG9cblxuICAgICAgfSBlbHNlIGlmIChoYWxpZ24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgLy8gYXV0byBqdXN0aWZpY2F0aW9uIDogbGVmdFxuICAgICAgICBpZiAoanVzdGlmaWNhdGlvbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICB0ZXh0WCArPSBoYWxmVGV4dFc7XG4gICAgICAgIH0gZWxzZSBpZiAoanVzdGlmaWNhdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIHRleHRYICs9IHRleHRXO1xuICAgICAgICB9IC8vIGVsc2Ugc2FtZSBhcyBhdXRvXG5cbiAgICAgIH1cblxuICAgICAgc3dpdGNoICh2YWxpZ24pIHtcbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICB0ZXh0WSAtPSAobGluZXMubGVuZ3RoIC0gMSkgKiBsaW5lSGVpZ2h0O1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgdGV4dFkgLT0gKGxpbmVzLmxlbmd0aCAtIDEpICogbGluZUhlaWdodDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBsaW5lcy5sZW5ndGg7IGwrKykge1xuICAgICAgICBpZiAobGluZVdpZHRoID4gMCkge1xuICAgICAgICAgIGNvbnRleHQuc3Ryb2tlVGV4dChsaW5lc1tsXSwgdGV4dFgsIHRleHRZKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQuZmlsbFRleHQobGluZXNbbF0sIHRleHRYLCB0ZXh0WSk7XG4gICAgICAgIHRleHRZICs9IGxpbmVIZWlnaHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChsaW5lV2lkdGggPiAwKSB7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlVGV4dCh0ZXh0LCB0ZXh0WCwgdGV4dFkpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0LmZpbGxUZXh0KHRleHQsIHRleHRYLCB0ZXh0WSk7XG4gICAgfVxuXG4gICAgaWYgKHRoZXRhICE9PSAwKSB7XG4gICAgICBjb250ZXh0LnJvdGF0ZSgtdGhldGEpO1xuICAgICAgY29udGV4dC50cmFuc2xhdGUoLW9yZ1RleHRYLCAtb3JnVGV4dFkpO1xuICAgIH1cbiAgfVxufTtcblxuLyogZ2xvYmFsIFBhdGgyRCAqL1xudmFyIENScCQ1ID0ge307XG5cbkNScCQ1LmRyYXdOb2RlID0gZnVuY3Rpb24gKGNvbnRleHQsIG5vZGUsIHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgdmFyIGRyYXdMYWJlbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogdHJ1ZTtcbiAgdmFyIHNob3VsZERyYXdPdmVybGF5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB0cnVlO1xuICB2YXIgc2hvdWxkRHJhd09wYWNpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IHRydWU7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIG5vZGVXaWR0aCwgbm9kZUhlaWdodDtcbiAgdmFyIF9wID0gbm9kZS5fcHJpdmF0ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHZhciBwb3MgPSBub2RlLnBvc2l0aW9uKCk7XG5cbiAgaWYgKCFudW1iZXIkMShwb3MueCkgfHwgIW51bWJlciQxKHBvcy55KSkge1xuICAgIHJldHVybjsgLy8gY2FuJ3QgZHJhdyBub2RlIHdpdGggdW5kZWZpbmVkIHBvc2l0aW9uXG4gIH1cblxuICBpZiAoc2hvdWxkRHJhd09wYWNpdHkgJiYgIW5vZGUudmlzaWJsZSgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGVsZU9wYWNpdHkgPSBzaG91bGREcmF3T3BhY2l0eSA/IG5vZGUuZWZmZWN0aXZlT3BhY2l0eSgpIDogMTtcbiAgdmFyIHVzZVBhdGhzID0gci51c2VQYXRocygpO1xuICB2YXIgcGF0aDtcbiAgdmFyIHBhdGhDYWNoZUhpdCA9IGZhbHNlO1xuICB2YXIgcGFkZGluZyA9IG5vZGUucGFkZGluZygpO1xuICBub2RlV2lkdGggPSBub2RlLndpZHRoKCkgKyAyICogcGFkZGluZztcbiAgbm9kZUhlaWdodCA9IG5vZGUuaGVpZ2h0KCkgKyAyICogcGFkZGluZzsgLy9cbiAgLy8gc2V0dXAgc2hpZnRcblxuICB2YXIgYmI7XG5cbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBiYiA9IHNoaWZ0VG9PcmlnaW5XaXRoQmI7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLWJiLngxLCAtYmIueTEpO1xuICB9IC8vXG4gIC8vIGxvYWQgYmcgaW1hZ2VcblxuXG4gIHZhciBiZ0ltZ1Byb3AgPSBub2RlLnBzdHlsZSgnYmFja2dyb3VuZC1pbWFnZScpO1xuICB2YXIgdXJscyA9IGJnSW1nUHJvcC52YWx1ZTtcbiAgdmFyIHVybERlZmluZWQgPSBuZXcgQXJyYXkodXJscy5sZW5ndGgpO1xuICB2YXIgaW1hZ2UgPSBuZXcgQXJyYXkodXJscy5sZW5ndGgpO1xuICB2YXIgbnVtSW1hZ2VzID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdXJsID0gdXJsc1tpXTtcbiAgICB2YXIgZGVmZCA9IHVybERlZmluZWRbaV0gPSB1cmwgIT0gbnVsbCAmJiB1cmwgIT09ICdub25lJztcblxuICAgIGlmIChkZWZkKSB7XG4gICAgICB2YXIgYmdJbWdDcm9zc09yaWdpbiA9IG5vZGUuY3koKS5zdHlsZSgpLmdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1pbWFnZS1jcm9zc29yaWdpbicsICd2YWx1ZScsIGkpO1xuICAgICAgbnVtSW1hZ2VzKys7IC8vIGdldCBpbWFnZSwgYW5kIGlmIG5vdCBsb2FkZWQgdGhlbiBhc2sgdG8gcmVkcmF3IHdoZW4gbGF0ZXIgbG9hZGVkXG5cbiAgICAgIGltYWdlW2ldID0gci5nZXRDYWNoZWRJbWFnZSh1cmwsIGJnSW1nQ3Jvc3NPcmlnaW4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3AuYmFja2dyb3VuZFRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIG5vZGUuZW1pdEFuZE5vdGlmeSgnYmFja2dyb3VuZCcpO1xuICAgICAgfSk7XG4gICAgfVxuICB9IC8vXG4gIC8vIHNldHVwIHN0eWxlc1xuXG5cbiAgdmFyIGRhcmtuZXNzID0gbm9kZS5wc3R5bGUoJ2JhY2tncm91bmQtYmxhY2tlbicpLnZhbHVlO1xuICB2YXIgYm9yZGVyV2lkdGggPSBub2RlLnBzdHlsZSgnYm9yZGVyLXdpZHRoJykucGZWYWx1ZTtcbiAgdmFyIGJnT3BhY2l0eSA9IG5vZGUucHN0eWxlKCdiYWNrZ3JvdW5kLW9wYWNpdHknKS52YWx1ZSAqIGVsZU9wYWNpdHk7XG4gIHZhciBib3JkZXJDb2xvciA9IG5vZGUucHN0eWxlKCdib3JkZXItY29sb3InKS52YWx1ZTtcbiAgdmFyIGJvcmRlclN0eWxlID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1zdHlsZScpLnZhbHVlO1xuICB2YXIgYm9yZGVyT3BhY2l0eSA9IG5vZGUucHN0eWxlKCdib3JkZXItb3BhY2l0eScpLnZhbHVlICogZWxlT3BhY2l0eTtcbiAgY29udGV4dC5saW5lSm9pbiA9ICdtaXRlcic7IC8vIHNvIGJvcmRlcnMgYXJlIHNxdWFyZSB3aXRoIHRoZSBub2RlIHNoYXBlXG5cbiAgdmFyIHNldHVwU2hhcGVDb2xvciA9IGZ1bmN0aW9uIHNldHVwU2hhcGVDb2xvcigpIHtcbiAgICB2YXIgYmdPcHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGJnT3BhY2l0eTtcbiAgICByLmVsZUZpbGxTdHlsZShjb250ZXh0LCBub2RlLCBiZ09weSk7XG4gIH07XG5cbiAgdmFyIHNldHVwQm9yZGVyQ29sb3IgPSBmdW5jdGlvbiBzZXR1cEJvcmRlckNvbG9yKCkge1xuICAgIHZhciBiZHJPcHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGJvcmRlck9wYWNpdHk7XG4gICAgci5jb2xvclN0cm9rZVN0eWxlKGNvbnRleHQsIGJvcmRlckNvbG9yWzBdLCBib3JkZXJDb2xvclsxXSwgYm9yZGVyQ29sb3JbMl0sIGJkck9weSk7XG4gIH07IC8vXG4gIC8vIHNldHVwIHNoYXBlXG5cblxuICB2YXIgc3R5bGVTaGFwZSA9IG5vZGUucHN0eWxlKCdzaGFwZScpLnN0clZhbHVlO1xuICB2YXIgc2hhcGVQdHMgPSBub2RlLnBzdHlsZSgnc2hhcGUtcG9seWdvbi1wb2ludHMnKS5wZlZhbHVlO1xuXG4gIGlmICh1c2VQYXRocykge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKHBvcy54LCBwb3MueSk7XG4gICAgdmFyIHBhdGhDYWNoZSA9IHIubm9kZVBhdGhDYWNoZSA9IHIubm9kZVBhdGhDYWNoZSB8fCBbXTtcbiAgICB2YXIga2V5ID0gaGFzaFN0cmluZ3Moc3R5bGVTaGFwZSA9PT0gJ3BvbHlnb24nID8gc3R5bGVTaGFwZSArICcsJyArIHNoYXBlUHRzLmpvaW4oJywnKSA6IHN0eWxlU2hhcGUsICcnICsgbm9kZUhlaWdodCwgJycgKyBub2RlV2lkdGgpO1xuICAgIHZhciBjYWNoZWRQYXRoID0gcGF0aENhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkUGF0aCAhPSBudWxsKSB7XG4gICAgICBwYXRoID0gY2FjaGVkUGF0aDtcbiAgICAgIHBhdGhDYWNoZUhpdCA9IHRydWU7XG4gICAgICBycy5wYXRoQ2FjaGUgPSBwYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRoID0gbmV3IFBhdGgyRCgpO1xuICAgICAgcGF0aENhY2hlW2tleV0gPSBycy5wYXRoQ2FjaGUgPSBwYXRoO1xuICAgIH1cbiAgfVxuXG4gIHZhciBkcmF3U2hhcGUgPSBmdW5jdGlvbiBkcmF3U2hhcGUoKSB7XG4gICAgaWYgKCFwYXRoQ2FjaGVIaXQpIHtcbiAgICAgIHZhciBucG9zID0gcG9zO1xuXG4gICAgICBpZiAodXNlUGF0aHMpIHtcbiAgICAgICAgbnBvcyA9IHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDBcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgci5ub2RlU2hhcGVzW3IuZ2V0Tm9kZVNoYXBlKG5vZGUpXS5kcmF3KHBhdGggfHwgY29udGV4dCwgbnBvcy54LCBucG9zLnksIG5vZGVXaWR0aCwgbm9kZUhlaWdodCk7XG4gICAgfVxuXG4gICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICBjb250ZXh0LmZpbGwocGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgZHJhd0ltYWdlcyA9IGZ1bmN0aW9uIGRyYXdJbWFnZXMoKSB7XG4gICAgdmFyIG5vZGVPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBlbGVPcGFjaXR5O1xuICAgIHZhciBpbnNpZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gICAgdmFyIHByZXZCZ2luZyA9IF9wLmJhY2tncm91bmRpbmc7XG4gICAgdmFyIHRvdGFsQ29tcGxldGVkID0gMDtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBpbWFnZS5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBiZ0NvbnRhaW5tZW50ID0gbm9kZS5jeSgpLnN0eWxlKCkuZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWltYWdlLWNvbnRhaW5tZW50JywgJ3ZhbHVlJywgX2kpO1xuXG4gICAgICBpZiAoaW5zaWRlICYmIGJnQ29udGFpbm1lbnQgPT09ICdvdmVyJyB8fCAhaW5zaWRlICYmIGJnQ29udGFpbm1lbnQgPT09ICdpbnNpZGUnKSB7XG4gICAgICAgIHRvdGFsQ29tcGxldGVkKys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodXJsRGVmaW5lZFtfaV0gJiYgaW1hZ2VbX2ldLmNvbXBsZXRlICYmICFpbWFnZVtfaV0uZXJyb3IpIHtcbiAgICAgICAgdG90YWxDb21wbGV0ZWQrKztcbiAgICAgICAgci5kcmF3SW5zY3JpYmVkSW1hZ2UoY29udGV4dCwgaW1hZ2VbX2ldLCBub2RlLCBfaSwgbm9kZU9wYWNpdHkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9wLmJhY2tncm91bmRpbmcgPSAhKHRvdGFsQ29tcGxldGVkID09PSBudW1JbWFnZXMpO1xuXG4gICAgaWYgKHByZXZCZ2luZyAhPT0gX3AuYmFja2dyb3VuZGluZykge1xuICAgICAgLy8gdXBkYXRlIHN0eWxlIGIvYyA6YmFja2dyb3VuZGluZyBzdGF0ZSBjaGFuZ2VkXG4gICAgICBub2RlLnVwZGF0ZVN0eWxlKGZhbHNlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGRyYXdQaWUgPSBmdW5jdGlvbiBkcmF3UGllKCkge1xuICAgIHZhciByZWRyYXdTaGFwZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG4gICAgdmFyIHBpZU9wYWNpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGVsZU9wYWNpdHk7XG5cbiAgICBpZiAoci5oYXNQaWUobm9kZSkpIHtcbiAgICAgIHIuZHJhd1BpZShjb250ZXh0LCBub2RlLCBwaWVPcGFjaXR5KTsgLy8gcmVkcmF3L3Jlc3RvcmUgcGF0aCBpZiBzdGVwcyBhZnRlciBwaWUgbmVlZCBpdFxuXG4gICAgICBpZiAocmVkcmF3U2hhcGUpIHtcbiAgICAgICAgaWYgKCF1c2VQYXRocykge1xuICAgICAgICAgIHIubm9kZVNoYXBlc1tyLmdldE5vZGVTaGFwZShub2RlKV0uZHJhdyhjb250ZXh0LCBwb3MueCwgcG9zLnksIG5vZGVXaWR0aCwgbm9kZUhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdmFyIGRhcmtlbiA9IGZ1bmN0aW9uIGRhcmtlbigpIHtcbiAgICB2YXIgZGFya2VuT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZWxlT3BhY2l0eTtcbiAgICB2YXIgb3BhY2l0eSA9IChkYXJrbmVzcyA+IDAgPyBkYXJrbmVzcyA6IC1kYXJrbmVzcykgKiBkYXJrZW5PcGFjaXR5O1xuICAgIHZhciBjID0gZGFya25lc3MgPiAwID8gMCA6IDI1NTtcblxuICAgIGlmIChkYXJrbmVzcyAhPT0gMCkge1xuICAgICAgci5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBjLCBjLCBjLCBvcGFjaXR5KTtcblxuICAgICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAgIGNvbnRleHQuZmlsbChwYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB2YXIgZHJhd0JvcmRlciA9IGZ1bmN0aW9uIGRyYXdCb3JkZXIoKSB7XG4gICAgaWYgKGJvcmRlcldpZHRoID4gMCkge1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSBib3JkZXJXaWR0aDtcbiAgICAgIGNvbnRleHQubGluZUNhcCA9ICdidXR0JztcblxuICAgICAgaWYgKGNvbnRleHQuc2V0TGluZURhc2gpIHtcbiAgICAgICAgLy8gZm9yIHZlcnkgb3V0b2ZkYXRlIGJyb3dzZXJzXG4gICAgICAgIHN3aXRjaCAoYm9yZGVyU3R5bGUpIHtcbiAgICAgICAgICBjYXNlICdkb3R0ZWQnOlxuICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbMSwgMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdkYXNoZWQnOlxuICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbNCwgMl0pO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdzb2xpZCc6XG4gICAgICAgICAgY2FzZSAnZG91YmxlJzpcbiAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goW10pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKHBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dC5zdHJva2UoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJvcmRlclN0eWxlID09PSAnZG91YmxlJykge1xuICAgICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IGJvcmRlcldpZHRoIC8gMztcbiAgICAgICAgdmFyIGdjbyA9IGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uO1xuICAgICAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdkZXN0aW5hdGlvbi1vdXQnO1xuXG4gICAgICAgIGlmICh1c2VQYXRocykge1xuICAgICAgICAgIGNvbnRleHQuc3Ryb2tlKHBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGdjbztcbiAgICAgIH0gLy8gcmVzZXQgaW4gY2FzZSB3ZSBjaGFuZ2VkIHRoZSBib3JkZXIgc3R5bGVcblxuXG4gICAgICBpZiAoY29udGV4dC5zZXRMaW5lRGFzaCkge1xuICAgICAgICAvLyBmb3IgdmVyeSBvdXRvZmRhdGUgYnJvd3NlcnNcbiAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHZhciBkcmF3T3ZlcmxheSA9IGZ1bmN0aW9uIGRyYXdPdmVybGF5KCkge1xuICAgIGlmIChzaG91bGREcmF3T3ZlcmxheSkge1xuICAgICAgci5kcmF3Tm9kZU92ZXJsYXkoY29udGV4dCwgbm9kZSwgcG9zLCBub2RlV2lkdGgsIG5vZGVIZWlnaHQpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgZHJhd1VuZGVybGF5ID0gZnVuY3Rpb24gZHJhd1VuZGVybGF5KCkge1xuICAgIGlmIChzaG91bGREcmF3T3ZlcmxheSkge1xuICAgICAgci5kcmF3Tm9kZVVuZGVybGF5KGNvbnRleHQsIG5vZGUsIHBvcywgbm9kZVdpZHRoLCBub2RlSGVpZ2h0KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGRyYXdUZXh0ID0gZnVuY3Rpb24gZHJhd1RleHQoKSB7XG4gICAgci5kcmF3RWxlbWVudFRleHQoY29udGV4dCwgbm9kZSwgbnVsbCwgZHJhd0xhYmVsKTtcbiAgfTtcblxuICB2YXIgZ2hvc3QgPSBub2RlLnBzdHlsZSgnZ2hvc3QnKS52YWx1ZSA9PT0gJ3llcyc7XG5cbiAgaWYgKGdob3N0KSB7XG4gICAgdmFyIGd4ID0gbm9kZS5wc3R5bGUoJ2dob3N0LW9mZnNldC14JykucGZWYWx1ZTtcbiAgICB2YXIgZ3kgPSBub2RlLnBzdHlsZSgnZ2hvc3Qtb2Zmc2V0LXknKS5wZlZhbHVlO1xuICAgIHZhciBnaG9zdE9wYWNpdHkgPSBub2RlLnBzdHlsZSgnZ2hvc3Qtb3BhY2l0eScpLnZhbHVlO1xuICAgIHZhciBlZmZHaG9zdE9wYWNpdHkgPSBnaG9zdE9wYWNpdHkgKiBlbGVPcGFjaXR5O1xuICAgIGNvbnRleHQudHJhbnNsYXRlKGd4LCBneSk7XG4gICAgc2V0dXBTaGFwZUNvbG9yKGdob3N0T3BhY2l0eSAqIGJnT3BhY2l0eSk7XG4gICAgZHJhd1NoYXBlKCk7XG4gICAgZHJhd0ltYWdlcyhlZmZHaG9zdE9wYWNpdHksIHRydWUpO1xuICAgIHNldHVwQm9yZGVyQ29sb3IoZ2hvc3RPcGFjaXR5ICogYm9yZGVyT3BhY2l0eSk7XG4gICAgZHJhd0JvcmRlcigpO1xuICAgIGRyYXdQaWUoZGFya25lc3MgIT09IDAgfHwgYm9yZGVyV2lkdGggIT09IDApO1xuICAgIGRyYXdJbWFnZXMoZWZmR2hvc3RPcGFjaXR5LCBmYWxzZSk7XG4gICAgZGFya2VuKGVmZkdob3N0T3BhY2l0eSk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLWd4LCAtZ3kpO1xuICB9XG5cbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLXBvcy54LCAtcG9zLnkpO1xuICB9XG5cbiAgZHJhd1VuZGVybGF5KCk7XG5cbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgY29udGV4dC50cmFuc2xhdGUocG9zLngsIHBvcy55KTtcbiAgfVxuXG4gIHNldHVwU2hhcGVDb2xvcigpO1xuICBkcmF3U2hhcGUoKTtcbiAgZHJhd0ltYWdlcyhlbGVPcGFjaXR5LCB0cnVlKTtcbiAgc2V0dXBCb3JkZXJDb2xvcigpO1xuICBkcmF3Qm9yZGVyKCk7XG4gIGRyYXdQaWUoZGFya25lc3MgIT09IDAgfHwgYm9yZGVyV2lkdGggIT09IDApO1xuICBkcmF3SW1hZ2VzKGVsZU9wYWNpdHksIGZhbHNlKTtcbiAgZGFya2VuKCk7XG5cbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLXBvcy54LCAtcG9zLnkpO1xuICB9XG5cbiAgZHJhd1RleHQoKTtcbiAgZHJhd092ZXJsYXkoKTsgLy9cbiAgLy8gY2xlYW4gdXAgc2hpZnRcblxuICBpZiAoc2hpZnRUb09yaWdpbldpdGhCYikge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKGJiLngxLCBiYi55MSk7XG4gIH1cbn07XG5cbnZhciBkcmF3Tm9kZU92ZXJsYXlVbmRlcmxheSA9IGZ1bmN0aW9uIGRyYXdOb2RlT3ZlcmxheVVuZGVybGF5KG92ZXJsYXlPclVuZGVybGF5KSB7XG4gIGlmICghWydvdmVybGF5JywgJ3VuZGVybGF5J10uaW5jbHVkZXMob3ZlcmxheU9yVW5kZXJsYXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0YXRlJyk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGNvbnRleHQsIG5vZGUsIHBvcywgbm9kZVdpZHRoLCBub2RlSGVpZ2h0KSB7XG4gICAgdmFyIHIgPSB0aGlzO1xuXG4gICAgaWYgKCFub2RlLnZpc2libGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwYWRkaW5nID0gbm9kZS5wc3R5bGUoXCJcIi5jb25jYXQob3ZlcmxheU9yVW5kZXJsYXksIFwiLXBhZGRpbmdcIikpLnBmVmFsdWU7XG4gICAgdmFyIG9wYWNpdHkgPSBub2RlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItb3BhY2l0eVwiKSkudmFsdWU7XG4gICAgdmFyIGNvbG9yID0gbm9kZS5wc3R5bGUoXCJcIi5jb25jYXQob3ZlcmxheU9yVW5kZXJsYXksIFwiLWNvbG9yXCIpKS52YWx1ZTtcbiAgICB2YXIgc2hhcGUgPSBub2RlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItc2hhcGVcIikpLnZhbHVlO1xuXG4gICAgaWYgKG9wYWNpdHkgPiAwKSB7XG4gICAgICBwb3MgPSBwb3MgfHwgbm9kZS5wb3NpdGlvbigpO1xuXG4gICAgICBpZiAobm9kZVdpZHRoID09IG51bGwgfHwgbm9kZUhlaWdodCA9PSBudWxsKSB7XG4gICAgICAgIHZhciBfcGFkZGluZyA9IG5vZGUucGFkZGluZygpO1xuXG4gICAgICAgIG5vZGVXaWR0aCA9IG5vZGUud2lkdGgoKSArIDIgKiBfcGFkZGluZztcbiAgICAgICAgbm9kZUhlaWdodCA9IG5vZGUuaGVpZ2h0KCkgKyAyICogX3BhZGRpbmc7XG4gICAgICB9XG5cbiAgICAgIHIuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgb3BhY2l0eSk7XG4gICAgICByLm5vZGVTaGFwZXNbc2hhcGVdLmRyYXcoY29udGV4dCwgcG9zLngsIHBvcy55LCBub2RlV2lkdGggKyBwYWRkaW5nICogMiwgbm9kZUhlaWdodCArIHBhZGRpbmcgKiAyKTtcbiAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIH1cbiAgfTtcbn07XG5cbkNScCQ1LmRyYXdOb2RlT3ZlcmxheSA9IGRyYXdOb2RlT3ZlcmxheVVuZGVybGF5KCdvdmVybGF5Jyk7XG5DUnAkNS5kcmF3Tm9kZVVuZGVybGF5ID0gZHJhd05vZGVPdmVybGF5VW5kZXJsYXkoJ3VuZGVybGF5Jyk7IC8vIGRvZXMgdGhlIG5vZGUgaGF2ZSBhdCBsZWFzdCBvbmUgcGllIHBpZWNlP1xuXG5DUnAkNS5oYXNQaWUgPSBmdW5jdGlvbiAobm9kZSkge1xuICBub2RlID0gbm9kZVswXTsgLy8gZW5zdXJlIGVsZSByZWZcblxuICByZXR1cm4gbm9kZS5fcHJpdmF0ZS5oYXNQaWU7XG59O1xuXG5DUnAkNS5kcmF3UGllID0gZnVuY3Rpb24gKGNvbnRleHQsIG5vZGUsIG5vZGVPcGFjaXR5LCBwb3MpIHtcbiAgbm9kZSA9IG5vZGVbMF07IC8vIGVuc3VyZSBlbGUgcmVmXG5cbiAgcG9zID0gcG9zIHx8IG5vZGUucG9zaXRpb24oKTtcbiAgdmFyIGN5U3R5bGUgPSBub2RlLmN5KCkuc3R5bGUoKTtcbiAgdmFyIHBpZVNpemUgPSBub2RlLnBzdHlsZSgncGllLXNpemUnKTtcbiAgdmFyIHggPSBwb3MueDtcbiAgdmFyIHkgPSBwb3MueTtcbiAgdmFyIG5vZGVXID0gbm9kZS53aWR0aCgpO1xuICB2YXIgbm9kZUggPSBub2RlLmhlaWdodCgpO1xuICB2YXIgcmFkaXVzID0gTWF0aC5taW4obm9kZVcsIG5vZGVIKSAvIDI7IC8vIG11c3QgZml0IGluIG5vZGVcblxuICB2YXIgbGFzdFBlcmNlbnQgPSAwOyAvLyB3aGF0ICUgdG8gY29udGludWUgZHJhd2luZyBwaWUgc2xpY2VzIGZyb20gb24gWzAsIDFdXG5cbiAgdmFyIHVzZVBhdGhzID0gdGhpcy51c2VQYXRocygpO1xuXG4gIGlmICh1c2VQYXRocykge1xuICAgIHggPSAwO1xuICAgIHkgPSAwO1xuICB9XG5cbiAgaWYgKHBpZVNpemUudW5pdHMgPT09ICclJykge1xuICAgIHJhZGl1cyA9IHJhZGl1cyAqIHBpZVNpemUucGZWYWx1ZTtcbiAgfSBlbHNlIGlmIChwaWVTaXplLnBmVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJhZGl1cyA9IHBpZVNpemUucGZWYWx1ZSAvIDI7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMTsgaSA8PSBjeVN0eWxlLnBpZUJhY2tncm91bmROOyBpKyspIHtcbiAgICAvLyAxLi5OXG4gICAgdmFyIHNpemUgPSBub2RlLnBzdHlsZSgncGllLScgKyBpICsgJy1iYWNrZ3JvdW5kLXNpemUnKS52YWx1ZTtcbiAgICB2YXIgY29sb3IgPSBub2RlLnBzdHlsZSgncGllLScgKyBpICsgJy1iYWNrZ3JvdW5kLWNvbG9yJykudmFsdWU7XG4gICAgdmFyIG9wYWNpdHkgPSBub2RlLnBzdHlsZSgncGllLScgKyBpICsgJy1iYWNrZ3JvdW5kLW9wYWNpdHknKS52YWx1ZSAqIG5vZGVPcGFjaXR5O1xuICAgIHZhciBwZXJjZW50ID0gc2l6ZSAvIDEwMDsgLy8gbWFwIGludGVnZXIgcmFuZ2UgWzAsIDEwMF0gdG8gWzAsIDFdXG4gICAgLy8gcGVyY2VudCBjYW4ndCBwdXNoIGJleW9uZCAxXG5cbiAgICBpZiAocGVyY2VudCArIGxhc3RQZXJjZW50ID4gMSkge1xuICAgICAgcGVyY2VudCA9IDEgLSBsYXN0UGVyY2VudDtcbiAgICB9XG5cbiAgICB2YXIgYW5nbGVTdGFydCA9IDEuNSAqIE1hdGguUEkgKyAyICogTWF0aC5QSSAqIGxhc3RQZXJjZW50OyAvLyBzdGFydCBhdCAxMiBvJ2Nsb2NrIGFuZCBnbyBjbG9ja3dpc2VcblxuICAgIHZhciBhbmdsZURlbHRhID0gMiAqIE1hdGguUEkgKiBwZXJjZW50O1xuICAgIHZhciBhbmdsZUVuZCA9IGFuZ2xlU3RhcnQgKyBhbmdsZURlbHRhOyAvLyBpZ25vcmUgaWZcbiAgICAvLyAtIHplcm8gc2l6ZVxuICAgIC8vIC0gd2UncmUgYWxyZWFkeSBiZXlvbmQgdGhlIGZ1bGwgY2lyY2xlXG4gICAgLy8gLSBhZGRpbmcgdGhlIGN1cnJlbnQgc2xpY2Ugd291bGQgZ28gYmV5b25kIHRoZSBmdWxsIGNpcmNsZVxuXG4gICAgaWYgKHNpemUgPT09IDAgfHwgbGFzdFBlcmNlbnQgPj0gMSB8fCBsYXN0UGVyY2VudCArIHBlcmNlbnQgPiAxKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIGNvbnRleHQubW92ZVRvKHgsIHkpO1xuICAgIGNvbnRleHQuYXJjKHgsIHksIHJhZGl1cywgYW5nbGVTdGFydCwgYW5nbGVFbmQpO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgICBsYXN0UGVyY2VudCArPSBwZXJjZW50O1xuICB9XG59O1xuXG52YXIgQ1JwJDQgPSB7fTtcbnZhciBtb3Rpb25CbHVyRGVsYXkgPSAxMDA7IC8vIHZhciBpc0ZpcmVmb3ggPSB0eXBlb2YgSW5zdGFsbFRyaWdnZXIgIT09ICd1bmRlZmluZWQnO1xuXG5DUnAkNC5nZXRQaXhlbFJhdGlvID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY29udGV4dCA9IHRoaXMuZGF0YS5jb250ZXh0c1swXTtcblxuICBpZiAodGhpcy5mb3JjZWRQaXhlbFJhdGlvICE9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JjZWRQaXhlbFJhdGlvO1xuICB9XG5cbiAgdmFyIGJhY2tpbmdTdG9yZSA9IGNvbnRleHQuYmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjb250ZXh0LndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY29udGV4dC5tb3pCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IGNvbnRleHQubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IGNvbnRleHQub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY29udGV4dC5iYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IDE7XG4gIHJldHVybiAod2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSkgLyBiYWNraW5nU3RvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbn07XG5cbkNScCQ0LnBhaW50Q2FjaGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICB2YXIgY2FjaGVzID0gdGhpcy5wYWludENhY2hlcyA9IHRoaXMucGFpbnRDYWNoZXMgfHwgW107XG4gIHZhciBuZWVkVG9DcmVhdGVDYWNoZSA9IHRydWU7XG4gIHZhciBjYWNoZTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNhY2hlcy5sZW5ndGg7IGkrKykge1xuICAgIGNhY2hlID0gY2FjaGVzW2ldO1xuXG4gICAgaWYgKGNhY2hlLmNvbnRleHQgPT09IGNvbnRleHQpIHtcbiAgICAgIG5lZWRUb0NyZWF0ZUNhY2hlID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAobmVlZFRvQ3JlYXRlQ2FjaGUpIHtcbiAgICBjYWNoZSA9IHtcbiAgICAgIGNvbnRleHQ6IGNvbnRleHRcbiAgICB9O1xuICAgIGNhY2hlcy5wdXNoKGNhY2hlKTtcbiAgfVxuXG4gIHJldHVybiBjYWNoZTtcbn07XG5cbkNScCQ0LmNyZWF0ZUdyYWRpZW50U3R5bGVGb3IgPSBmdW5jdGlvbiAoY29udGV4dCwgc2hhcGVTdHlsZU5hbWUsIGVsZSwgZmlsbCwgb3BhY2l0eSkge1xuICB2YXIgZ3JhZGllbnRTdHlsZTtcbiAgdmFyIHVzZVBhdGhzID0gdGhpcy51c2VQYXRocygpO1xuICB2YXIgY29sb3JzID0gZWxlLnBzdHlsZShzaGFwZVN0eWxlTmFtZSArICctZ3JhZGllbnQtc3RvcC1jb2xvcnMnKS52YWx1ZSxcbiAgICAgIHBvc2l0aW9ucyA9IGVsZS5wc3R5bGUoc2hhcGVTdHlsZU5hbWUgKyAnLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJykucGZWYWx1ZTtcblxuICBpZiAoZmlsbCA9PT0gJ3JhZGlhbC1ncmFkaWVudCcpIHtcbiAgICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgICB2YXIgc3RhcnQgPSBlbGUuc291cmNlRW5kcG9pbnQoKSxcbiAgICAgICAgICBlbmQgPSBlbGUudGFyZ2V0RW5kcG9pbnQoKSxcbiAgICAgICAgICBtaWQgPSBlbGUubWlkcG9pbnQoKTtcbiAgICAgIHZhciBkMSA9IGRpc3Qoc3RhcnQsIG1pZCk7XG4gICAgICB2YXIgZDIgPSBkaXN0KGVuZCwgbWlkKTtcbiAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZVJhZGlhbEdyYWRpZW50KG1pZC54LCBtaWQueSwgMCwgbWlkLngsIG1pZC55LCBNYXRoLm1heChkMSwgZDIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHBvcyA9IHVzZVBhdGhzID8ge1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwXG4gICAgICB9IDogZWxlLnBvc2l0aW9uKCksXG4gICAgICAgICAgd2lkdGggPSBlbGUucGFkZGVkV2lkdGgoKSxcbiAgICAgICAgICBoZWlnaHQgPSBlbGUucGFkZGVkSGVpZ2h0KCk7XG4gICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVSYWRpYWxHcmFkaWVudChwb3MueCwgcG9zLnksIDAsIHBvcy54LCBwb3MueSwgTWF0aC5tYXgod2lkdGgsIGhlaWdodCkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgICB2YXIgX3N0YXJ0ID0gZWxlLnNvdXJjZUVuZHBvaW50KCksXG4gICAgICAgICAgX2VuZCA9IGVsZS50YXJnZXRFbmRwb2ludCgpO1xuXG4gICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfc3RhcnQueCwgX3N0YXJ0LnksIF9lbmQueCwgX2VuZC55KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9wb3MgPSB1c2VQYXRocyA/IHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMFxuICAgICAgfSA6IGVsZS5wb3NpdGlvbigpLFxuICAgICAgICAgIF93aWR0aCA9IGVsZS5wYWRkZWRXaWR0aCgpLFxuICAgICAgICAgIF9oZWlnaHQgPSBlbGUucGFkZGVkSGVpZ2h0KCksXG4gICAgICAgICAgaGFsZldpZHRoID0gX3dpZHRoIC8gMixcbiAgICAgICAgICBoYWxmSGVpZ2h0ID0gX2hlaWdodCAvIDI7XG5cbiAgICAgIHZhciBkaXJlY3Rpb24gPSBlbGUucHN0eWxlKCdiYWNrZ3JvdW5kLWdyYWRpZW50LWRpcmVjdGlvbicpLnZhbHVlO1xuXG4gICAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgICBjYXNlICd0by1ib3R0b20nOlxuICAgICAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZUxpbmVhckdyYWRpZW50KF9wb3MueCwgX3Bvcy55IC0gaGFsZkhlaWdodCwgX3Bvcy54LCBfcG9zLnkgKyBoYWxmSGVpZ2h0KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICd0by10b3AnOlxuICAgICAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZUxpbmVhckdyYWRpZW50KF9wb3MueCwgX3Bvcy55ICsgaGFsZkhlaWdodCwgX3Bvcy54LCBfcG9zLnkgLSBoYWxmSGVpZ2h0KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICd0by1sZWZ0JzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggKyBoYWxmV2lkdGgsIF9wb3MueSwgX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3RvLXJpZ2h0JzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggLSBoYWxmV2lkdGgsIF9wb3MueSwgX3Bvcy54ICsgaGFsZldpZHRoLCBfcG9zLnkpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3RvLWJvdHRvbS1yaWdodCc6XG4gICAgICAgIGNhc2UgJ3RvLXJpZ2h0LWJvdHRvbSc6XG4gICAgICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkgLSBoYWxmSGVpZ2h0LCBfcG9zLnggKyBoYWxmV2lkdGgsIF9wb3MueSArIGhhbGZIZWlnaHQpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3RvLXRvcC1yaWdodCc6XG4gICAgICAgIGNhc2UgJ3RvLXJpZ2h0LXRvcCc6XG4gICAgICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkgKyBoYWxmSGVpZ2h0LCBfcG9zLnggKyBoYWxmV2lkdGgsIF9wb3MueSAtIGhhbGZIZWlnaHQpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3RvLWJvdHRvbS1sZWZ0JzpcbiAgICAgICAgY2FzZSAndG8tbGVmdC1ib3R0b20nOlxuICAgICAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZUxpbmVhckdyYWRpZW50KF9wb3MueCArIGhhbGZXaWR0aCwgX3Bvcy55IC0gaGFsZkhlaWdodCwgX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkgKyBoYWxmSGVpZ2h0KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICd0by10b3AtbGVmdCc6XG4gICAgICAgIGNhc2UgJ3RvLWxlZnQtdG9wJzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggKyBoYWxmV2lkdGgsIF9wb3MueSArIGhhbGZIZWlnaHQsIF9wb3MueCAtIGhhbGZXaWR0aCwgX3Bvcy55IC0gaGFsZkhlaWdodCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFncmFkaWVudFN0eWxlKSByZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBncmFkaWVudCBzdHlsZVxuXG4gIHZhciBoYXNQb3NpdGlvbnMgPSBwb3NpdGlvbnMubGVuZ3RoID09PSBjb2xvcnMubGVuZ3RoO1xuICB2YXIgbGVuZ3RoID0gY29sb3JzLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgZ3JhZGllbnRTdHlsZS5hZGRDb2xvclN0b3AoaGFzUG9zaXRpb25zID8gcG9zaXRpb25zW2ldIDogaSAvIChsZW5ndGggLSAxKSwgJ3JnYmEoJyArIGNvbG9yc1tpXVswXSArICcsJyArIGNvbG9yc1tpXVsxXSArICcsJyArIGNvbG9yc1tpXVsyXSArICcsJyArIG9wYWNpdHkgKyAnKScpO1xuICB9XG5cbiAgcmV0dXJuIGdyYWRpZW50U3R5bGU7XG59O1xuXG5DUnAkNC5ncmFkaWVudEZpbGxTdHlsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUsIGZpbGwsIG9wYWNpdHkpIHtcbiAgdmFyIGdyYWRpZW50U3R5bGUgPSB0aGlzLmNyZWF0ZUdyYWRpZW50U3R5bGVGb3IoY29udGV4dCwgJ2JhY2tncm91bmQnLCBlbGUsIGZpbGwsIG9wYWNpdHkpO1xuICBpZiAoIWdyYWRpZW50U3R5bGUpIHJldHVybiBudWxsOyAvLyBlcnJvclxuXG4gIGNvbnRleHQuZmlsbFN0eWxlID0gZ3JhZGllbnRTdHlsZTtcbn07XG5cbkNScCQ0LmNvbG9yRmlsbFN0eWxlID0gZnVuY3Rpb24gKGNvbnRleHQsIHIsIGcsIGIsIGEpIHtcbiAgY29udGV4dC5maWxsU3R5bGUgPSAncmdiYSgnICsgciArICcsJyArIGcgKyAnLCcgKyBiICsgJywnICsgYSArICcpJzsgLy8gdHVybiBvZmYgZm9yIG5vdywgc2VlbXMgY29udGV4dCBkb2VzIGl0cyBvd24gY2FjaGluZ1xuICAvLyB2YXIgY2FjaGUgPSB0aGlzLnBhaW50Q2FjaGUoY29udGV4dCk7XG4gIC8vIHZhciBmaWxsU3R5bGUgPSAncmdiYSgnICsgciArICcsJyArIGcgKyAnLCcgKyBiICsgJywnICsgYSArICcpJztcbiAgLy8gaWYoIGNhY2hlLmZpbGxTdHlsZSAhPT0gZmlsbFN0eWxlICl7XG4gIC8vICAgY29udGV4dC5maWxsU3R5bGUgPSBjYWNoZS5maWxsU3R5bGUgPSBmaWxsU3R5bGU7XG4gIC8vIH1cbn07XG5cbkNScCQ0LmVsZUZpbGxTdHlsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUsIG9wYWNpdHkpIHtcbiAgdmFyIGJhY2tncm91bmRGaWxsID0gZWxlLnBzdHlsZSgnYmFja2dyb3VuZC1maWxsJykudmFsdWU7XG5cbiAgaWYgKGJhY2tncm91bmRGaWxsID09PSAnbGluZWFyLWdyYWRpZW50JyB8fCBiYWNrZ3JvdW5kRmlsbCA9PT0gJ3JhZGlhbC1ncmFkaWVudCcpIHtcbiAgICB0aGlzLmdyYWRpZW50RmlsbFN0eWxlKGNvbnRleHQsIGVsZSwgYmFja2dyb3VuZEZpbGwsIG9wYWNpdHkpO1xuICB9IGVsc2Uge1xuICAgIHZhciBiYWNrZ3JvdW5kQ29sb3IgPSBlbGUucHN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJykudmFsdWU7XG4gICAgdGhpcy5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBiYWNrZ3JvdW5kQ29sb3JbMF0sIGJhY2tncm91bmRDb2xvclsxXSwgYmFja2dyb3VuZENvbG9yWzJdLCBvcGFjaXR5KTtcbiAgfVxufTtcblxuQ1JwJDQuZ3JhZGllbnRTdHJva2VTdHlsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUsIGZpbGwsIG9wYWNpdHkpIHtcbiAgdmFyIGdyYWRpZW50U3R5bGUgPSB0aGlzLmNyZWF0ZUdyYWRpZW50U3R5bGVGb3IoY29udGV4dCwgJ2xpbmUnLCBlbGUsIGZpbGwsIG9wYWNpdHkpO1xuICBpZiAoIWdyYWRpZW50U3R5bGUpIHJldHVybiBudWxsOyAvLyBlcnJvclxuXG4gIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBncmFkaWVudFN0eWxlO1xufTtcblxuQ1JwJDQuY29sb3JTdHJva2VTdHlsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCByLCBnLCBiLCBhKSB7XG4gIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAncmdiYSgnICsgciArICcsJyArIGcgKyAnLCcgKyBiICsgJywnICsgYSArICcpJzsgLy8gdHVybiBvZmYgZm9yIG5vdywgc2VlbXMgY29udGV4dCBkb2VzIGl0cyBvd24gY2FjaGluZ1xuICAvLyB2YXIgY2FjaGUgPSB0aGlzLnBhaW50Q2FjaGUoY29udGV4dCk7XG4gIC8vIHZhciBzdHJva2VTdHlsZSA9ICdyZ2JhKCcgKyByICsgJywnICsgZyArICcsJyArIGIgKyAnLCcgKyBhICsgJyknO1xuICAvLyBpZiggY2FjaGUuc3Ryb2tlU3R5bGUgIT09IHN0cm9rZVN0eWxlICl7XG4gIC8vICAgY29udGV4dC5zdHJva2VTdHlsZSA9IGNhY2hlLnN0cm9rZVN0eWxlID0gc3Ryb2tlU3R5bGU7XG4gIC8vIH1cbn07XG5cbkNScCQ0LmVsZVN0cm9rZVN0eWxlID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgb3BhY2l0eSkge1xuICB2YXIgbGluZUZpbGwgPSBlbGUucHN0eWxlKCdsaW5lLWZpbGwnKS52YWx1ZTtcblxuICBpZiAobGluZUZpbGwgPT09ICdsaW5lYXItZ3JhZGllbnQnIHx8IGxpbmVGaWxsID09PSAncmFkaWFsLWdyYWRpZW50Jykge1xuICAgIHRoaXMuZ3JhZGllbnRTdHJva2VTdHlsZShjb250ZXh0LCBlbGUsIGxpbmVGaWxsLCBvcGFjaXR5KTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGluZUNvbG9yID0gZWxlLnBzdHlsZSgnbGluZS1jb2xvcicpLnZhbHVlO1xuICAgIHRoaXMuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBsaW5lQ29sb3JbMF0sIGxpbmVDb2xvclsxXSwgbGluZUNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgfVxufTsgLy8gUmVzaXplIGNhbnZhc1xuXG5cbkNScCQ0Lm1hdGNoQ2FudmFzU2l6ZSA9IGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgZGF0YSA9IHIuZGF0YTtcbiAgdmFyIGJiID0gci5maW5kQ29udGFpbmVyQ2xpZW50Q29vcmRzKCk7XG4gIHZhciB3aWR0aCA9IGJiWzJdO1xuICB2YXIgaGVpZ2h0ID0gYmJbM107XG4gIHZhciBwaXhlbFJhdGlvID0gci5nZXRQaXhlbFJhdGlvKCk7XG4gIHZhciBtYlB4UmF0aW8gPSByLm1vdGlvbkJsdXJQeFJhdGlvO1xuXG4gIGlmIChjb250YWluZXIgPT09IHIuZGF0YS5idWZmZXJDYW52YXNlc1tyLk1PVElPTkJMVVJfQlVGRkVSX05PREVdIHx8IGNvbnRhaW5lciA9PT0gci5kYXRhLmJ1ZmZlckNhbnZhc2VzW3IuTU9USU9OQkxVUl9CVUZGRVJfRFJBR10pIHtcbiAgICBwaXhlbFJhdGlvID0gbWJQeFJhdGlvO1xuICB9XG5cbiAgdmFyIGNhbnZhc1dpZHRoID0gd2lkdGggKiBwaXhlbFJhdGlvO1xuICB2YXIgY2FudmFzSGVpZ2h0ID0gaGVpZ2h0ICogcGl4ZWxSYXRpbztcbiAgdmFyIGNhbnZhcztcblxuICBpZiAoY2FudmFzV2lkdGggPT09IHIuY2FudmFzV2lkdGggJiYgY2FudmFzSGVpZ2h0ID09PSByLmNhbnZhc0hlaWdodCkge1xuICAgIHJldHVybjsgLy8gc2F2ZSBjeWNsZXMgaWYgc2FtZVxuICB9XG5cbiAgci5mb250Q2FjaGVzID0gbnVsbDsgLy8gcmVzaXppbmcgcmVzZXRzIHRoZSBzdHlsZVxuXG4gIHZhciBjYW52YXNDb250YWluZXIgPSBkYXRhLmNhbnZhc0NvbnRhaW5lcjtcbiAgY2FudmFzQ29udGFpbmVyLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuICBjYW52YXNDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHIuQ0FOVkFTX0xBWUVSUzsgaSsrKSB7XG4gICAgY2FudmFzID0gZGF0YS5jYW52YXNlc1tpXTtcbiAgICBjYW52YXMud2lkdGggPSBjYW52YXNXaWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gY2FudmFzSGVpZ2h0O1xuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgci5CVUZGRVJfQ09VTlQ7IGkrKykge1xuICAgIGNhbnZhcyA9IGRhdGEuYnVmZmVyQ2FudmFzZXNbaV07XG4gICAgY2FudmFzLndpZHRoID0gY2FudmFzV2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGNhbnZhc0hlaWdodDtcbiAgICBjYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gIH1cblxuICByLnRleHR1cmVNdWx0ID0gMTtcblxuICBpZiAocGl4ZWxSYXRpbyA8PSAxKSB7XG4gICAgY2FudmFzID0gZGF0YS5idWZmZXJDYW52YXNlc1tyLlRFWFRVUkVfQlVGRkVSXTtcbiAgICByLnRleHR1cmVNdWx0ID0gMjtcbiAgICBjYW52YXMud2lkdGggPSBjYW52YXNXaWR0aCAqIHIudGV4dHVyZU11bHQ7XG4gICAgY2FudmFzLmhlaWdodCA9IGNhbnZhc0hlaWdodCAqIHIudGV4dHVyZU11bHQ7XG4gIH1cblxuICByLmNhbnZhc1dpZHRoID0gY2FudmFzV2lkdGg7XG4gIHIuY2FudmFzSGVpZ2h0ID0gY2FudmFzSGVpZ2h0O1xufTtcblxuQ1JwJDQucmVuZGVyVG8gPSBmdW5jdGlvbiAoY3h0LCB6b29tLCBwYW4sIHB4UmF0aW8pIHtcbiAgdGhpcy5yZW5kZXIoe1xuICAgIGZvcmNlZENvbnRleHQ6IGN4dCxcbiAgICBmb3JjZWRab29tOiB6b29tLFxuICAgIGZvcmNlZFBhbjogcGFuLFxuICAgIGRyYXdBbGxMYXllcnM6IHRydWUsXG4gICAgZm9yY2VkUHhSYXRpbzogcHhSYXRpb1xuICB9KTtcbn07XG5cbkNScCQ0LnJlbmRlciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHN0YXRpY0VtcHR5T2JqZWN0KCk7XG4gIHZhciBmb3JjZWRDb250ZXh0ID0gb3B0aW9ucy5mb3JjZWRDb250ZXh0O1xuICB2YXIgZHJhd0FsbExheWVycyA9IG9wdGlvbnMuZHJhd0FsbExheWVycztcbiAgdmFyIGRyYXdPbmx5Tm9kZUxheWVyID0gb3B0aW9ucy5kcmF3T25seU5vZGVMYXllcjtcbiAgdmFyIGZvcmNlZFpvb20gPSBvcHRpb25zLmZvcmNlZFpvb207XG4gIHZhciBmb3JjZWRQYW4gPSBvcHRpb25zLmZvcmNlZFBhbjtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgcGl4ZWxSYXRpbyA9IG9wdGlvbnMuZm9yY2VkUHhSYXRpbyA9PT0gdW5kZWZpbmVkID8gdGhpcy5nZXRQaXhlbFJhdGlvKCkgOiBvcHRpb25zLmZvcmNlZFB4UmF0aW87XG4gIHZhciBjeSA9IHIuY3k7XG4gIHZhciBkYXRhID0gci5kYXRhO1xuICB2YXIgbmVlZERyYXcgPSBkYXRhLmNhbnZhc05lZWRzUmVkcmF3O1xuICB2YXIgdGV4dHVyZURyYXcgPSByLnRleHR1cmVPblZpZXdwb3J0ICYmICFmb3JjZWRDb250ZXh0ICYmIChyLnBpbmNoaW5nIHx8IHIuaG92ZXJEYXRhLmRyYWdnaW5nIHx8IHIuc3dpcGVQYW5uaW5nIHx8IHIuZGF0YS53aGVlbFpvb21pbmcpO1xuICB2YXIgbW90aW9uQmx1ciA9IG9wdGlvbnMubW90aW9uQmx1ciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5tb3Rpb25CbHVyIDogci5tb3Rpb25CbHVyO1xuICB2YXIgbWJQeFJhdGlvID0gci5tb3Rpb25CbHVyUHhSYXRpbztcbiAgdmFyIGhhc0NvbXBvdW5kTm9kZXMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gIHZhciBpbk5vZGVEcmFnR2VzdHVyZSA9IHIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcztcbiAgdmFyIGluQm94U2VsZWN0aW9uID0gci5ob3ZlckRhdGEuc2VsZWN0aW5nIHx8IHIudG91Y2hEYXRhLnNlbGVjdGluZyA/IHRydWUgOiBmYWxzZTtcbiAgbW90aW9uQmx1ciA9IG1vdGlvbkJsdXIgJiYgIWZvcmNlZENvbnRleHQgJiYgci5tb3Rpb25CbHVyRW5hYmxlZCAmJiAhaW5Cb3hTZWxlY3Rpb247XG4gIHZhciBtb3Rpb25CbHVyRmFkZUVmZmVjdCA9IG1vdGlvbkJsdXI7XG5cbiAgaWYgKCFmb3JjZWRDb250ZXh0KSB7XG4gICAgaWYgKHIucHJldlB4UmF0aW8gIT09IHBpeGVsUmF0aW8pIHtcbiAgICAgIHIuaW52YWxpZGF0ZUNvbnRhaW5lckNsaWVudENvb3Jkc0NhY2hlKCk7XG4gICAgICByLm1hdGNoQ2FudmFzU2l6ZShyLmNvbnRhaW5lcik7XG4gICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgIH1cblxuICAgIHIucHJldlB4UmF0aW8gPSBwaXhlbFJhdGlvO1xuICB9XG5cbiAgaWYgKCFmb3JjZWRDb250ZXh0ICYmIHIubW90aW9uQmx1clRpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQoci5tb3Rpb25CbHVyVGltZW91dCk7XG4gIH1cblxuICBpZiAobW90aW9uQmx1cikge1xuICAgIGlmIChyLm1iRnJhbWVzID09IG51bGwpIHtcbiAgICAgIHIubWJGcmFtZXMgPSAwO1xuICAgIH1cblxuICAgIHIubWJGcmFtZXMrKztcblxuICAgIGlmIChyLm1iRnJhbWVzIDwgMykge1xuICAgICAgLy8gbmVlZCBzZXZlcmFsIGZyYW1lcyBiZWZvcmUgZXZlbiBoaWdoIHF1YWxpdHkgbW90aW9uYmx1clxuICAgICAgbW90aW9uQmx1ckZhZGVFZmZlY3QgPSBmYWxzZTtcbiAgICB9IC8vIGdvIHRvIGxvd2VyIHF1YWxpdHkgYmx1cnJ5IGZyYW1lcyB3aGVuIHNldmVyYWwgbS9iIGZyYW1lcyBoYXZlIGJlZW4gcmVuZGVyZWQgKGF2b2lkcyBmbGFzaGluZylcblxuXG4gICAgaWYgKHIubWJGcmFtZXMgPiByLm1pbk1iTG93UXVhbEZyYW1lcykge1xuICAgICAgLy9yLmZ1bGxRdWFsaXR5TWIgPSBmYWxzZTtcbiAgICAgIHIubW90aW9uQmx1clB4UmF0aW8gPSByLm1iUHhSQmx1cnJ5O1xuICAgIH1cbiAgfVxuXG4gIGlmIChyLmNsZWFyaW5nTW90aW9uQmx1cikge1xuICAgIHIubW90aW9uQmx1clB4UmF0aW8gPSAxO1xuICB9IC8vIGIvYyBkcmF3VG9Db250ZXh0KCkgbWF5IGJlIGFzeW5jIHcuci50LiByZWRyYXcoKSwga2VlcCB0cmFjayBvZiBsYXN0IHRleHR1cmUgZnJhbWVcbiAgLy8gYmVjYXVzZSBhIHJvZ3VlIGFzeW5jIHRleHR1cmUgZnJhbWUgd291bGQgY2xlYXIgbmVlZERyYXdcblxuXG4gIGlmIChyLnRleHR1cmVEcmF3TGFzdEZyYW1lICYmICF0ZXh0dXJlRHJhdykge1xuICAgIG5lZWREcmF3W3IuTk9ERV0gPSB0cnVlO1xuICAgIG5lZWREcmF3W3IuU0VMRUNUX0JPWF0gPSB0cnVlO1xuICB9XG5cbiAgdmFyIHN0eWxlID0gY3kuc3R5bGUoKTtcbiAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gIHZhciBlZmZlY3RpdmVab29tID0gZm9yY2VkWm9vbSAhPT0gdW5kZWZpbmVkID8gZm9yY2VkWm9vbSA6IHpvb207XG4gIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgdmFyIGVmZmVjdGl2ZVBhbiA9IHtcbiAgICB4OiBwYW4ueCxcbiAgICB5OiBwYW4ueVxuICB9O1xuICB2YXIgdnAgPSB7XG4gICAgem9vbTogem9vbSxcbiAgICBwYW46IHtcbiAgICAgIHg6IHBhbi54LFxuICAgICAgeTogcGFuLnlcbiAgICB9XG4gIH07XG4gIHZhciBwcmV2VnAgPSByLnByZXZWaWV3cG9ydDtcbiAgdmFyIHZpZXdwb3J0SXNEaWZmID0gcHJldlZwID09PSB1bmRlZmluZWQgfHwgdnAuem9vbSAhPT0gcHJldlZwLnpvb20gfHwgdnAucGFuLnggIT09IHByZXZWcC5wYW4ueCB8fCB2cC5wYW4ueSAhPT0gcHJldlZwLnBhbi55OyAvLyB3ZSB3YW50IHRoZSBsb3cgcXVhbGl0eSBtb3Rpb25ibHVyIG9ubHkgd2hlbiB0aGUgdmlld3BvcnQgaXMgYmVpbmcgbWFuaXB1bGF0ZWQgZXRjICh3aGVyZSBpdCdzIG5vdCBub3RpY2VkKVxuXG4gIGlmICghdmlld3BvcnRJc0RpZmYgJiYgIShpbk5vZGVEcmFnR2VzdHVyZSAmJiAhaGFzQ29tcG91bmROb2RlcykpIHtcbiAgICByLm1vdGlvbkJsdXJQeFJhdGlvID0gMTtcbiAgfVxuXG4gIGlmIChmb3JjZWRQYW4pIHtcbiAgICBlZmZlY3RpdmVQYW4gPSBmb3JjZWRQYW47XG4gIH0gLy8gYXBwbHkgcGl4ZWwgcmF0aW9cblxuXG4gIGVmZmVjdGl2ZVpvb20gKj0gcGl4ZWxSYXRpbztcbiAgZWZmZWN0aXZlUGFuLnggKj0gcGl4ZWxSYXRpbztcbiAgZWZmZWN0aXZlUGFuLnkgKj0gcGl4ZWxSYXRpbztcbiAgdmFyIGVsZXMgPSByLmdldENhY2hlZFpTb3J0ZWRFbGVzKCk7XG5cbiAgZnVuY3Rpb24gbWJjbGVhcihjb250ZXh0LCB4LCB5LCB3LCBoKSB7XG4gICAgdmFyIGdjbyA9IGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uO1xuICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLW91dCc7XG4gICAgci5jb2xvckZpbGxTdHlsZShjb250ZXh0LCAyNTUsIDI1NSwgMjU1LCByLm1vdGlvbkJsdXJUcmFuc3BhcmVuY3kpO1xuICAgIGNvbnRleHQuZmlsbFJlY3QoeCwgeSwgdywgaCk7XG4gICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBnY287XG4gIH1cblxuICBmdW5jdGlvbiBzZXRDb250ZXh0VHJhbnNmb3JtKGNvbnRleHQsIGNsZWFyKSB7XG4gICAgdmFyIGVQYW4sIGVab29tLCB3LCBoO1xuXG4gICAgaWYgKCFyLmNsZWFyaW5nTW90aW9uQmx1ciAmJiAoY29udGV4dCA9PT0gZGF0YS5idWZmZXJDb250ZXh0c1tyLk1PVElPTkJMVVJfQlVGRkVSX05PREVdIHx8IGNvbnRleHQgPT09IGRhdGEuYnVmZmVyQ29udGV4dHNbci5NT1RJT05CTFVSX0JVRkZFUl9EUkFHXSkpIHtcbiAgICAgIGVQYW4gPSB7XG4gICAgICAgIHg6IHBhbi54ICogbWJQeFJhdGlvLFxuICAgICAgICB5OiBwYW4ueSAqIG1iUHhSYXRpb1xuICAgICAgfTtcbiAgICAgIGVab29tID0gem9vbSAqIG1iUHhSYXRpbztcbiAgICAgIHcgPSByLmNhbnZhc1dpZHRoICogbWJQeFJhdGlvO1xuICAgICAgaCA9IHIuY2FudmFzSGVpZ2h0ICogbWJQeFJhdGlvO1xuICAgIH0gZWxzZSB7XG4gICAgICBlUGFuID0gZWZmZWN0aXZlUGFuO1xuICAgICAgZVpvb20gPSBlZmZlY3RpdmVab29tO1xuICAgICAgdyA9IHIuY2FudmFzV2lkdGg7XG4gICAgICBoID0gci5jYW52YXNIZWlnaHQ7XG4gICAgfVxuXG4gICAgY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG5cbiAgICBpZiAoY2xlYXIgPT09ICdtb3Rpb25CbHVyJykge1xuICAgICAgbWJjbGVhcihjb250ZXh0LCAwLCAwLCB3LCBoKTtcbiAgICB9IGVsc2UgaWYgKCFmb3JjZWRDb250ZXh0ICYmIChjbGVhciA9PT0gdW5kZWZpbmVkIHx8IGNsZWFyKSkge1xuICAgICAgY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdywgaCk7XG4gICAgfVxuXG4gICAgaWYgKCFkcmF3QWxsTGF5ZXJzKSB7XG4gICAgICBjb250ZXh0LnRyYW5zbGF0ZShlUGFuLngsIGVQYW4ueSk7XG4gICAgICBjb250ZXh0LnNjYWxlKGVab29tLCBlWm9vbSk7XG4gICAgfVxuXG4gICAgaWYgKGZvcmNlZFBhbikge1xuICAgICAgY29udGV4dC50cmFuc2xhdGUoZm9yY2VkUGFuLngsIGZvcmNlZFBhbi55KTtcbiAgICB9XG5cbiAgICBpZiAoZm9yY2VkWm9vbSkge1xuICAgICAgY29udGV4dC5zY2FsZShmb3JjZWRab29tLCBmb3JjZWRab29tKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXRleHR1cmVEcmF3KSB7XG4gICAgci50ZXh0dXJlRHJhd0xhc3RGcmFtZSA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKHRleHR1cmVEcmF3KSB7XG4gICAgci50ZXh0dXJlRHJhd0xhc3RGcmFtZSA9IHRydWU7XG5cbiAgICBpZiAoIXIudGV4dHVyZUNhY2hlKSB7XG4gICAgICByLnRleHR1cmVDYWNoZSA9IHt9O1xuICAgICAgci50ZXh0dXJlQ2FjaGUuYmIgPSBjeS5tdXRhYmxlRWxlbWVudHMoKS5ib3VuZGluZ0JveCgpO1xuICAgICAgci50ZXh0dXJlQ2FjaGUudGV4dHVyZSA9IHIuZGF0YS5idWZmZXJDYW52YXNlc1tyLlRFWFRVUkVfQlVGRkVSXTtcbiAgICAgIHZhciBjeHQgPSByLmRhdGEuYnVmZmVyQ29udGV4dHNbci5URVhUVVJFX0JVRkZFUl07XG4gICAgICBjeHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgY3h0LmNsZWFyUmVjdCgwLCAwLCByLmNhbnZhc1dpZHRoICogci50ZXh0dXJlTXVsdCwgci5jYW52YXNIZWlnaHQgKiByLnRleHR1cmVNdWx0KTtcbiAgICAgIHIucmVuZGVyKHtcbiAgICAgICAgZm9yY2VkQ29udGV4dDogY3h0LFxuICAgICAgICBkcmF3T25seU5vZGVMYXllcjogdHJ1ZSxcbiAgICAgICAgZm9yY2VkUHhSYXRpbzogcGl4ZWxSYXRpbyAqIHIudGV4dHVyZU11bHRcbiAgICAgIH0pO1xuICAgICAgdmFyIHZwID0gci50ZXh0dXJlQ2FjaGUudmlld3BvcnQgPSB7XG4gICAgICAgIHpvb206IGN5Lnpvb20oKSxcbiAgICAgICAgcGFuOiBjeS5wYW4oKSxcbiAgICAgICAgd2lkdGg6IHIuY2FudmFzV2lkdGgsXG4gICAgICAgIGhlaWdodDogci5jYW52YXNIZWlnaHRcbiAgICAgIH07XG4gICAgICB2cC5tcGFuID0ge1xuICAgICAgICB4OiAoMCAtIHZwLnBhbi54KSAvIHZwLnpvb20sXG4gICAgICAgIHk6ICgwIC0gdnAucGFuLnkpIC8gdnAuem9vbVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBuZWVkRHJhd1tyLkRSQUddID0gZmFsc2U7XG4gICAgbmVlZERyYXdbci5OT0RFXSA9IGZhbHNlO1xuICAgIHZhciBjb250ZXh0ID0gZGF0YS5jb250ZXh0c1tyLk5PREVdO1xuICAgIHZhciB0ZXh0dXJlID0gci50ZXh0dXJlQ2FjaGUudGV4dHVyZTtcbiAgICB2YXIgdnAgPSByLnRleHR1cmVDYWNoZS52aWV3cG9ydDtcbiAgICBjb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcblxuICAgIGlmIChtb3Rpb25CbHVyKSB7XG4gICAgICBtYmNsZWFyKGNvbnRleHQsIDAsIDAsIHZwLndpZHRoLCB2cC5oZWlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB2cC53aWR0aCwgdnAuaGVpZ2h0KTtcbiAgICB9XG5cbiAgICB2YXIgb3V0c2lkZUJnQ29sb3IgPSBzdHlsZS5jb3JlKCdvdXRzaWRlLXRleHR1cmUtYmctY29sb3InKS52YWx1ZTtcbiAgICB2YXIgb3V0c2lkZUJnT3BhY2l0eSA9IHN0eWxlLmNvcmUoJ291dHNpZGUtdGV4dHVyZS1iZy1vcGFjaXR5JykudmFsdWU7XG4gICAgci5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBvdXRzaWRlQmdDb2xvclswXSwgb3V0c2lkZUJnQ29sb3JbMV0sIG91dHNpZGVCZ0NvbG9yWzJdLCBvdXRzaWRlQmdPcGFjaXR5KTtcbiAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIHZwLndpZHRoLCB2cC5oZWlnaHQpO1xuICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgIHNldENvbnRleHRUcmFuc2Zvcm0oY29udGV4dCwgZmFsc2UpO1xuICAgIGNvbnRleHQuY2xlYXJSZWN0KHZwLm1wYW4ueCwgdnAubXBhbi55LCB2cC53aWR0aCAvIHZwLnpvb20gLyBwaXhlbFJhdGlvLCB2cC5oZWlnaHQgLyB2cC56b29tIC8gcGl4ZWxSYXRpbyk7XG4gICAgY29udGV4dC5kcmF3SW1hZ2UodGV4dHVyZSwgdnAubXBhbi54LCB2cC5tcGFuLnksIHZwLndpZHRoIC8gdnAuem9vbSAvIHBpeGVsUmF0aW8sIHZwLmhlaWdodCAvIHZwLnpvb20gLyBwaXhlbFJhdGlvKTtcbiAgfSBlbHNlIGlmIChyLnRleHR1cmVPblZpZXdwb3J0ICYmICFmb3JjZWRDb250ZXh0KSB7XG4gICAgLy8gY2xlYXIgdGhlIGNhY2hlIHNpbmNlIHdlIGRvbid0IG5lZWQgaXRcbiAgICByLnRleHR1cmVDYWNoZSA9IG51bGw7XG4gIH1cblxuICB2YXIgZXh0ZW50ID0gY3kuZXh0ZW50KCk7XG4gIHZhciB2cE1hbmlwID0gci5waW5jaGluZyB8fCByLmhvdmVyRGF0YS5kcmFnZ2luZyB8fCByLnN3aXBlUGFubmluZyB8fCByLmRhdGEud2hlZWxab29taW5nIHx8IHIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcyB8fCByLmN5LmFuaW1hdGVkKCk7XG4gIHZhciBoaWRlRWRnZXMgPSByLmhpZGVFZGdlc09uVmlld3BvcnQgJiYgdnBNYW5pcDtcbiAgdmFyIG5lZWRNYkNsZWFyID0gW107XG4gIG5lZWRNYkNsZWFyW3IuTk9ERV0gPSAhbmVlZERyYXdbci5OT0RFXSAmJiBtb3Rpb25CbHVyICYmICFyLmNsZWFyZWRGb3JNb3Rpb25CbHVyW3IuTk9ERV0gfHwgci5jbGVhcmluZ01vdGlvbkJsdXI7XG5cbiAgaWYgKG5lZWRNYkNsZWFyW3IuTk9ERV0pIHtcbiAgICByLmNsZWFyZWRGb3JNb3Rpb25CbHVyW3IuTk9ERV0gPSB0cnVlO1xuICB9XG5cbiAgbmVlZE1iQ2xlYXJbci5EUkFHXSA9ICFuZWVkRHJhd1tyLkRSQUddICYmIG1vdGlvbkJsdXIgJiYgIXIuY2xlYXJlZEZvck1vdGlvbkJsdXJbci5EUkFHXSB8fCByLmNsZWFyaW5nTW90aW9uQmx1cjtcblxuICBpZiAobmVlZE1iQ2xlYXJbci5EUkFHXSkge1xuICAgIHIuY2xlYXJlZEZvck1vdGlvbkJsdXJbci5EUkFHXSA9IHRydWU7XG4gIH1cblxuICBpZiAobmVlZERyYXdbci5OT0RFXSB8fCBkcmF3QWxsTGF5ZXJzIHx8IGRyYXdPbmx5Tm9kZUxheWVyIHx8IG5lZWRNYkNsZWFyW3IuTk9ERV0pIHtcbiAgICB2YXIgdXNlQnVmZmVyID0gbW90aW9uQmx1ciAmJiAhbmVlZE1iQ2xlYXJbci5OT0RFXSAmJiBtYlB4UmF0aW8gIT09IDE7XG4gICAgdmFyIGNvbnRleHQgPSBmb3JjZWRDb250ZXh0IHx8ICh1c2VCdWZmZXIgPyByLmRhdGEuYnVmZmVyQ29udGV4dHNbci5NT1RJT05CTFVSX0JVRkZFUl9OT0RFXSA6IGRhdGEuY29udGV4dHNbci5OT0RFXSk7XG4gICAgdmFyIGNsZWFyID0gbW90aW9uQmx1ciAmJiAhdXNlQnVmZmVyID8gJ21vdGlvbkJsdXInIDogdW5kZWZpbmVkO1xuICAgIHNldENvbnRleHRUcmFuc2Zvcm0oY29udGV4dCwgY2xlYXIpO1xuXG4gICAgaWYgKGhpZGVFZGdlcykge1xuICAgICAgci5kcmF3Q2FjaGVkTm9kZXMoY29udGV4dCwgZWxlcy5ub25kcmFnLCBwaXhlbFJhdGlvLCBleHRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByLmRyYXdMYXllcmVkRWxlbWVudHMoY29udGV4dCwgZWxlcy5ub25kcmFnLCBwaXhlbFJhdGlvLCBleHRlbnQpO1xuICAgIH1cblxuICAgIGlmIChyLmRlYnVnKSB7XG4gICAgICByLmRyYXdEZWJ1Z1BvaW50cyhjb250ZXh0LCBlbGVzLm5vbmRyYWcpO1xuICAgIH1cblxuICAgIGlmICghZHJhd0FsbExheWVycyAmJiAhbW90aW9uQmx1cikge1xuICAgICAgbmVlZERyYXdbci5OT0RFXSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghZHJhd09ubHlOb2RlTGF5ZXIgJiYgKG5lZWREcmF3W3IuRFJBR10gfHwgZHJhd0FsbExheWVycyB8fCBuZWVkTWJDbGVhcltyLkRSQUddKSkge1xuICAgIHZhciB1c2VCdWZmZXIgPSBtb3Rpb25CbHVyICYmICFuZWVkTWJDbGVhcltyLkRSQUddICYmIG1iUHhSYXRpbyAhPT0gMTtcbiAgICB2YXIgY29udGV4dCA9IGZvcmNlZENvbnRleHQgfHwgKHVzZUJ1ZmZlciA/IHIuZGF0YS5idWZmZXJDb250ZXh0c1tyLk1PVElPTkJMVVJfQlVGRkVSX0RSQUddIDogZGF0YS5jb250ZXh0c1tyLkRSQUddKTtcbiAgICBzZXRDb250ZXh0VHJhbnNmb3JtKGNvbnRleHQsIG1vdGlvbkJsdXIgJiYgIXVzZUJ1ZmZlciA/ICdtb3Rpb25CbHVyJyA6IHVuZGVmaW5lZCk7XG5cbiAgICBpZiAoaGlkZUVkZ2VzKSB7XG4gICAgICByLmRyYXdDYWNoZWROb2Rlcyhjb250ZXh0LCBlbGVzLmRyYWcsIHBpeGVsUmF0aW8sIGV4dGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHIuZHJhd0NhY2hlZEVsZW1lbnRzKGNvbnRleHQsIGVsZXMuZHJhZywgcGl4ZWxSYXRpbywgZXh0ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoci5kZWJ1Zykge1xuICAgICAgci5kcmF3RGVidWdQb2ludHMoY29udGV4dCwgZWxlcy5kcmFnKTtcbiAgICB9XG5cbiAgICBpZiAoIWRyYXdBbGxMYXllcnMgJiYgIW1vdGlvbkJsdXIpIHtcbiAgICAgIG5lZWREcmF3W3IuRFJBR10gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpZiAoci5zaG93RnBzIHx8ICFkcmF3T25seU5vZGVMYXllciAmJiBuZWVkRHJhd1tyLlNFTEVDVF9CT1hdICYmICFkcmF3QWxsTGF5ZXJzKSB7XG4gICAgdmFyIGNvbnRleHQgPSBmb3JjZWRDb250ZXh0IHx8IGRhdGEuY29udGV4dHNbci5TRUxFQ1RfQk9YXTtcbiAgICBzZXRDb250ZXh0VHJhbnNmb3JtKGNvbnRleHQpO1xuXG4gICAgaWYgKHIuc2VsZWN0aW9uWzRdID09IDEgJiYgKHIuaG92ZXJEYXRhLnNlbGVjdGluZyB8fCByLnRvdWNoRGF0YS5zZWxlY3RpbmcpKSB7XG4gICAgICB2YXIgem9vbSA9IHIuY3kuem9vbSgpO1xuICAgICAgdmFyIGJvcmRlcldpZHRoID0gc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1ib3JkZXItd2lkdGgnKS52YWx1ZSAvIHpvb207XG4gICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IGJvcmRlcldpZHRoO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAncmdiYSgnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1jb2xvcicpLnZhbHVlWzBdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1jb2xvcicpLnZhbHVlWzFdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1jb2xvcicpLnZhbHVlWzJdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1vcGFjaXR5JykudmFsdWUgKyAnKSc7XG4gICAgICBjb250ZXh0LmZpbGxSZWN0KHIuc2VsZWN0aW9uWzBdLCByLnNlbGVjdGlvblsxXSwgci5zZWxlY3Rpb25bMl0gLSByLnNlbGVjdGlvblswXSwgci5zZWxlY3Rpb25bM10gLSByLnNlbGVjdGlvblsxXSk7XG5cbiAgICAgIGlmIChib3JkZXJXaWR0aCA+IDApIHtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9ICdyZ2JhKCcgKyBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LWJvcmRlci1jb2xvcicpLnZhbHVlWzBdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1ib3JkZXItY29sb3InKS52YWx1ZVsxXSArICcsJyArIHN0eWxlLmNvcmUoJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLWNvbG9yJykudmFsdWVbMl0gKyAnLCcgKyBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LW9wYWNpdHknKS52YWx1ZSArICcpJztcbiAgICAgICAgY29udGV4dC5zdHJva2VSZWN0KHIuc2VsZWN0aW9uWzBdLCByLnNlbGVjdGlvblsxXSwgci5zZWxlY3Rpb25bMl0gLSByLnNlbGVjdGlvblswXSwgci5zZWxlY3Rpb25bM10gLSByLnNlbGVjdGlvblsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gJiYgIXIuaG92ZXJEYXRhLnNlbGVjdGluZykge1xuICAgICAgdmFyIHpvb20gPSByLmN5Lnpvb20oKTtcbiAgICAgIHZhciBwb3MgPSBkYXRhLmJnQWN0aXZlUG9zaXN0aW9uO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAncmdiYSgnICsgc3R5bGUuY29yZSgnYWN0aXZlLWJnLWNvbG9yJykudmFsdWVbMF0gKyAnLCcgKyBzdHlsZS5jb3JlKCdhY3RpdmUtYmctY29sb3InKS52YWx1ZVsxXSArICcsJyArIHN0eWxlLmNvcmUoJ2FjdGl2ZS1iZy1jb2xvcicpLnZhbHVlWzJdICsgJywnICsgc3R5bGUuY29yZSgnYWN0aXZlLWJnLW9wYWNpdHknKS52YWx1ZSArICcpJztcbiAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICBjb250ZXh0LmFyYyhwb3MueCwgcG9zLnksIHN0eWxlLmNvcmUoJ2FjdGl2ZS1iZy1zaXplJykucGZWYWx1ZSAvIHpvb20sIDAsIDIgKiBNYXRoLlBJKTtcbiAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIH1cblxuICAgIHZhciB0aW1lVG9SZW5kZXIgPSByLmxhc3RSZWRyYXdUaW1lO1xuXG4gICAgaWYgKHIuc2hvd0ZwcyAmJiB0aW1lVG9SZW5kZXIpIHtcbiAgICAgIHRpbWVUb1JlbmRlciA9IE1hdGgucm91bmQodGltZVRvUmVuZGVyKTtcbiAgICAgIHZhciBmcHMgPSBNYXRoLnJvdW5kKDEwMDAgLyB0aW1lVG9SZW5kZXIpO1xuICAgICAgY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2JhKDI1NSwgMCwgMCwgMC43NSknO1xuICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9ICdyZ2JhKDI1NSwgMCwgMCwgMC43NSknO1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSAxO1xuICAgICAgY29udGV4dC5maWxsVGV4dCgnMSBmcmFtZSA9ICcgKyB0aW1lVG9SZW5kZXIgKyAnIG1zID0gJyArIGZwcyArICcgZnBzJywgMCwgMjApO1xuICAgICAgdmFyIG1heEZwcyA9IDYwO1xuICAgICAgY29udGV4dC5zdHJva2VSZWN0KDAsIDMwLCAyNTAsIDIwKTtcbiAgICAgIGNvbnRleHQuZmlsbFJlY3QoMCwgMzAsIDI1MCAqIE1hdGgubWluKGZwcyAvIG1heEZwcywgMSksIDIwKTtcbiAgICB9XG5cbiAgICBpZiAoIWRyYXdBbGxMYXllcnMpIHtcbiAgICAgIG5lZWREcmF3W3IuU0VMRUNUX0JPWF0gPSBmYWxzZTtcbiAgICB9XG4gIH0gLy8gbW90aW9uYmx1cjogYmxpdCByZW5kZXJlZCBibHVycnkgZnJhbWVzXG5cblxuICBpZiAobW90aW9uQmx1ciAmJiBtYlB4UmF0aW8gIT09IDEpIHtcbiAgICB2YXIgY3h0Tm9kZSA9IGRhdGEuY29udGV4dHNbci5OT0RFXTtcbiAgICB2YXIgdHh0Tm9kZSA9IHIuZGF0YS5idWZmZXJDYW52YXNlc1tyLk1PVElPTkJMVVJfQlVGRkVSX05PREVdO1xuICAgIHZhciBjeHREcmFnID0gZGF0YS5jb250ZXh0c1tyLkRSQUddO1xuICAgIHZhciB0eHREcmFnID0gci5kYXRhLmJ1ZmZlckNhbnZhc2VzW3IuTU9USU9OQkxVUl9CVUZGRVJfRFJBR107XG5cbiAgICB2YXIgZHJhd01vdGlvbkJsdXIgPSBmdW5jdGlvbiBkcmF3TW90aW9uQmx1cihjeHQsIHR4dCwgbmVlZENsZWFyKSB7XG4gICAgICBjeHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuXG4gICAgICBpZiAobmVlZENsZWFyIHx8ICFtb3Rpb25CbHVyRmFkZUVmZmVjdCkge1xuICAgICAgICBjeHQuY2xlYXJSZWN0KDAsIDAsIHIuY2FudmFzV2lkdGgsIHIuY2FudmFzSGVpZ2h0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1iY2xlYXIoY3h0LCAwLCAwLCByLmNhbnZhc1dpZHRoLCByLmNhbnZhc0hlaWdodCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBweHIgPSBtYlB4UmF0aW87XG4gICAgICBjeHQuZHJhd0ltYWdlKHR4dCwgLy8gaW1nXG4gICAgICAwLCAwLCAvLyBzeCwgc3lcbiAgICAgIHIuY2FudmFzV2lkdGggKiBweHIsIHIuY2FudmFzSGVpZ2h0ICogcHhyLCAvLyBzdywgc2hcbiAgICAgIDAsIDAsIC8vIHgsIHlcbiAgICAgIHIuY2FudmFzV2lkdGgsIHIuY2FudmFzSGVpZ2h0IC8vIHcsIGhcbiAgICAgICk7XG4gICAgfTtcblxuICAgIGlmIChuZWVkRHJhd1tyLk5PREVdIHx8IG5lZWRNYkNsZWFyW3IuTk9ERV0pIHtcbiAgICAgIGRyYXdNb3Rpb25CbHVyKGN4dE5vZGUsIHR4dE5vZGUsIG5lZWRNYkNsZWFyW3IuTk9ERV0pO1xuICAgICAgbmVlZERyYXdbci5OT0RFXSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChuZWVkRHJhd1tyLkRSQUddIHx8IG5lZWRNYkNsZWFyW3IuRFJBR10pIHtcbiAgICAgIGRyYXdNb3Rpb25CbHVyKGN4dERyYWcsIHR4dERyYWcsIG5lZWRNYkNsZWFyW3IuRFJBR10pO1xuICAgICAgbmVlZERyYXdbci5EUkFHXSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHIucHJldlZpZXdwb3J0ID0gdnA7XG5cbiAgaWYgKHIuY2xlYXJpbmdNb3Rpb25CbHVyKSB7XG4gICAgci5jbGVhcmluZ01vdGlvbkJsdXIgPSBmYWxzZTtcbiAgICByLm1vdGlvbkJsdXJDbGVhcmVkID0gdHJ1ZTtcbiAgICByLm1vdGlvbkJsdXIgPSB0cnVlO1xuICB9XG5cbiAgaWYgKG1vdGlvbkJsdXIpIHtcbiAgICByLm1vdGlvbkJsdXJUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByLm1vdGlvbkJsdXJUaW1lb3V0ID0gbnVsbDtcbiAgICAgIHIuY2xlYXJlZEZvck1vdGlvbkJsdXJbci5OT0RFXSA9IGZhbHNlO1xuICAgICAgci5jbGVhcmVkRm9yTW90aW9uQmx1cltyLkRSQUddID0gZmFsc2U7XG4gICAgICByLm1vdGlvbkJsdXIgPSBmYWxzZTtcbiAgICAgIHIuY2xlYXJpbmdNb3Rpb25CbHVyID0gIXRleHR1cmVEcmF3O1xuICAgICAgci5tYkZyYW1lcyA9IDA7XG4gICAgICBuZWVkRHJhd1tyLk5PREVdID0gdHJ1ZTtcbiAgICAgIG5lZWREcmF3W3IuRFJBR10gPSB0cnVlO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9LCBtb3Rpb25CbHVyRGVsYXkpO1xuICB9XG5cbiAgaWYgKCFmb3JjZWRDb250ZXh0KSB7XG4gICAgY3kuZW1pdCgncmVuZGVyJyk7XG4gIH1cbn07XG5cbnZhciBDUnAkMyA9IHt9OyAvLyBATyBQb2x5Z29uIGRyYXdpbmdcblxuQ1JwJDMuZHJhd1BvbHlnb25QYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBvaW50cykge1xuICB2YXIgaGFsZlcgPSB3aWR0aCAvIDI7XG4gIHZhciBoYWxmSCA9IGhlaWdodCAvIDI7XG5cbiAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgfVxuXG4gIGNvbnRleHQubW92ZVRvKHggKyBoYWxmVyAqIHBvaW50c1swXSwgeSArIGhhbGZIICogcG9pbnRzWzFdKTtcblxuICBmb3IgKHZhciBpID0gMTsgaSA8IHBvaW50cy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZlcgKiBwb2ludHNbaSAqIDJdLCB5ICsgaGFsZkggKiBwb2ludHNbaSAqIDIgKyAxXSk7XG4gIH1cblxuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcblxuQ1JwJDMuZHJhd1JvdW5kUG9seWdvblBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzKSB7XG4gIHZhciBoYWxmVyA9IHdpZHRoIC8gMjtcbiAgdmFyIGhhbGZIID0gaGVpZ2h0IC8gMjtcbiAgdmFyIGNvcm5lclJhZGl1cyA9IGdldFJvdW5kUG9seWdvblJhZGl1cyh3aWR0aCwgaGVpZ2h0KTtcblxuICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICB9XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHBvaW50cy5sZW5ndGggLyA0OyBfaSsrKSB7XG4gICAgdmFyIHNvdXJjZVV2ID0gdm9pZCAwLFxuICAgICAgICBkZXN0VXYgPSB2b2lkIDA7XG5cbiAgICBpZiAoX2kgPT09IDApIHtcbiAgICAgIHNvdXJjZVV2ID0gcG9pbnRzLmxlbmd0aCAtIDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvdXJjZVV2ID0gX2kgKiA0IC0gMjtcbiAgICB9XG5cbiAgICBkZXN0VXYgPSBfaSAqIDQgKyAyO1xuICAgIHZhciBweCA9IHggKyBoYWxmVyAqIHBvaW50c1tfaSAqIDRdO1xuICAgIHZhciBweSA9IHkgKyBoYWxmSCAqIHBvaW50c1tfaSAqIDQgKyAxXTtcbiAgICB2YXIgY29zVGhldGEgPSAtcG9pbnRzW3NvdXJjZVV2XSAqIHBvaW50c1tkZXN0VXZdIC0gcG9pbnRzW3NvdXJjZVV2ICsgMV0gKiBwb2ludHNbZGVzdFV2ICsgMV07XG4gICAgdmFyIG9mZnNldCA9IGNvcm5lclJhZGl1cyAvIE1hdGgudGFuKE1hdGguYWNvcyhjb3NUaGV0YSkgLyAyKTtcbiAgICB2YXIgY3AweCA9IHB4IC0gb2Zmc2V0ICogcG9pbnRzW3NvdXJjZVV2XTtcbiAgICB2YXIgY3AweSA9IHB5IC0gb2Zmc2V0ICogcG9pbnRzW3NvdXJjZVV2ICsgMV07XG4gICAgdmFyIGNwMXggPSBweCArIG9mZnNldCAqIHBvaW50c1tkZXN0VXZdO1xuICAgIHZhciBjcDF5ID0gcHkgKyBvZmZzZXQgKiBwb2ludHNbZGVzdFV2ICsgMV07XG5cbiAgICBpZiAoX2kgPT09IDApIHtcbiAgICAgIGNvbnRleHQubW92ZVRvKGNwMHgsIGNwMHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0LmxpbmVUbyhjcDB4LCBjcDB5KTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmFyY1RvKHB4LCBweSwgY3AxeCwgY3AxeSwgY29ybmVyUmFkaXVzKTtcbiAgfVxuXG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG59OyAvLyBSb3VuZCByZWN0YW5nbGUgZHJhd2luZ1xuXG5cbkNScCQzLmRyYXdSb3VuZFJlY3RhbmdsZVBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICB2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG4gIHZhciBjb3JuZXJSYWRpdXMgPSBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KTtcblxuICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICB9IC8vIFN0YXJ0IGF0IHRvcCBtaWRkbGVcblxuXG4gIGNvbnRleHQubW92ZVRvKHgsIHkgLSBoYWxmSGVpZ2h0KTsgLy8gQXJjIGZyb20gbWlkZGxlIHRvcCB0byByaWdodCBzaWRlXG5cbiAgY29udGV4dC5hcmNUbyh4ICsgaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCwgeCArIGhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzKTsgLy8gQXJjIGZyb20gcmlnaHQgc2lkZSB0byBib3R0b21cblxuICBjb250ZXh0LmFyY1RvKHggKyBoYWxmV2lkdGgsIHkgKyBoYWxmSGVpZ2h0LCB4LCB5ICsgaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzKTsgLy8gQXJjIGZyb20gYm90dG9tIHRvIGxlZnQgc2lkZVxuXG4gIGNvbnRleHQuYXJjVG8oeCAtIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQsIHggLSBoYWxmV2lkdGgsIHksIGNvcm5lclJhZGl1cyk7IC8vIEFyYyBmcm9tIGxlZnQgc2lkZSB0byB0b3BCb3JkZXJcblxuICBjb250ZXh0LmFyY1RvKHggLSBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0LCB4LCB5IC0gaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzKTsgLy8gSm9pbiBsaW5lXG5cbiAgY29udGV4dC5saW5lVG8oeCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcblxuQ1JwJDMuZHJhd0JvdHRvbVJvdW5kUmVjdGFuZ2xlUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgdmFyIGNvcm5lclJhZGl1cyA9IGdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuXG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH0gLy8gU3RhcnQgYXQgdG9wIG1pZGRsZVxuXG5cbiAgY29udGV4dC5tb3ZlVG8oeCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCk7XG4gIGNvbnRleHQubGluZVRvKHggKyBoYWxmV2lkdGgsIHkpO1xuICBjb250ZXh0LmFyY1RvKHggKyBoYWxmV2lkdGgsIHkgKyBoYWxmSGVpZ2h0LCB4LCB5ICsgaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzKTtcbiAgY29udGV4dC5hcmNUbyh4IC0gaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCAtIGhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzKTtcbiAgY29udGV4dC5saW5lVG8oeCAtIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmxpbmVUbyh4LCB5IC0gaGFsZkhlaWdodCk7XG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG59O1xuXG5DUnAkMy5kcmF3Q3V0UmVjdGFuZ2xlUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgdmFyIGNvcm5lckxlbmd0aCA9IGdldEN1dFJlY3RhbmdsZUNvcm5lckxlbmd0aCgpO1xuXG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cblxuICBjb250ZXh0Lm1vdmVUbyh4IC0gaGFsZldpZHRoICsgY29ybmVyTGVuZ3RoLCB5IC0gaGFsZkhlaWdodCk7XG4gIGNvbnRleHQubGluZVRvKHggKyBoYWxmV2lkdGggLSBjb3JuZXJMZW5ndGgsIHkgLSBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5saW5lVG8oeCArIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJMZW5ndGgpO1xuICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCAtIGNvcm5lckxlbmd0aCk7XG4gIGNvbnRleHQubGluZVRvKHggKyBoYWxmV2lkdGggLSBjb3JuZXJMZW5ndGgsIHkgKyBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5saW5lVG8oeCAtIGhhbGZXaWR0aCArIGNvcm5lckxlbmd0aCwgeSArIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmxpbmVUbyh4IC0gaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCAtIGNvcm5lckxlbmd0aCk7XG4gIGNvbnRleHQubGluZVRvKHggLSBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyTGVuZ3RoKTtcbiAgY29udGV4dC5jbG9zZVBhdGgoKTtcbn07XG5cbkNScCQzLmRyYXdCYXJyZWxQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuICB2YXIgeEJlZ2luID0geCAtIGhhbGZXaWR0aDtcbiAgdmFyIHhFbmQgPSB4ICsgaGFsZldpZHRoO1xuICB2YXIgeUJlZ2luID0geSAtIGhhbGZIZWlnaHQ7XG4gIHZhciB5RW5kID0geSArIGhhbGZIZWlnaHQ7XG4gIHZhciBiYXJyZWxDdXJ2ZUNvbnN0YW50cyA9IGdldEJhcnJlbEN1cnZlQ29uc3RhbnRzKHdpZHRoLCBoZWlnaHQpO1xuICB2YXIgd09mZnNldCA9IGJhcnJlbEN1cnZlQ29uc3RhbnRzLndpZHRoT2Zmc2V0O1xuICB2YXIgaE9mZnNldCA9IGJhcnJlbEN1cnZlQ29uc3RhbnRzLmhlaWdodE9mZnNldDtcbiAgdmFyIGN0cmxQdFhPZmZzZXQgPSBiYXJyZWxDdXJ2ZUNvbnN0YW50cy5jdHJsUHRPZmZzZXRQY3QgKiB3T2Zmc2V0O1xuXG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cblxuICBjb250ZXh0Lm1vdmVUbyh4QmVnaW4sIHlCZWdpbiArIGhPZmZzZXQpO1xuICBjb250ZXh0LmxpbmVUbyh4QmVnaW4sIHlFbmQgLSBoT2Zmc2V0KTtcbiAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKHhCZWdpbiArIGN0cmxQdFhPZmZzZXQsIHlFbmQsIHhCZWdpbiArIHdPZmZzZXQsIHlFbmQpO1xuICBjb250ZXh0LmxpbmVUbyh4RW5kIC0gd09mZnNldCwgeUVuZCk7XG4gIGNvbnRleHQucXVhZHJhdGljQ3VydmVUbyh4RW5kIC0gY3RybFB0WE9mZnNldCwgeUVuZCwgeEVuZCwgeUVuZCAtIGhPZmZzZXQpO1xuICBjb250ZXh0LmxpbmVUbyh4RW5kLCB5QmVnaW4gKyBoT2Zmc2V0KTtcbiAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKHhFbmQgLSBjdHJsUHRYT2Zmc2V0LCB5QmVnaW4sIHhFbmQgLSB3T2Zmc2V0LCB5QmVnaW4pO1xuICBjb250ZXh0LmxpbmVUbyh4QmVnaW4gKyB3T2Zmc2V0LCB5QmVnaW4pO1xuICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oeEJlZ2luICsgY3RybFB0WE9mZnNldCwgeUJlZ2luLCB4QmVnaW4sIHlCZWdpbiArIGhPZmZzZXQpO1xuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcblxudmFyIHNpbjAgPSBNYXRoLnNpbigwKTtcbnZhciBjb3MwID0gTWF0aC5jb3MoMCk7XG52YXIgc2luID0ge307XG52YXIgY29zID0ge307XG52YXIgZWxsaXBzZVN0ZXBTaXplID0gTWF0aC5QSSAvIDQwO1xuXG5mb3IgKHZhciBpID0gMCAqIE1hdGguUEk7IGkgPCAyICogTWF0aC5QSTsgaSArPSBlbGxpcHNlU3RlcFNpemUpIHtcbiAgc2luW2ldID0gTWF0aC5zaW4oaSk7XG4gIGNvc1tpXSA9IE1hdGguY29zKGkpO1xufVxuXG5DUnAkMy5kcmF3RWxsaXBzZVBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCkge1xuICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICB9XG5cbiAgaWYgKGNvbnRleHQuZWxsaXBzZSkge1xuICAgIGNvbnRleHQuZWxsaXBzZShjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIsIDAsIDAsIDIgKiBNYXRoLlBJKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgeFBvcywgeVBvcztcbiAgICB2YXIgcncgPSB3aWR0aCAvIDI7XG4gICAgdmFyIHJoID0gaGVpZ2h0IC8gMjtcblxuICAgIGZvciAodmFyIGkgPSAwICogTWF0aC5QSTsgaSA8IDIgKiBNYXRoLlBJOyBpICs9IGVsbGlwc2VTdGVwU2l6ZSkge1xuICAgICAgeFBvcyA9IGNlbnRlclggLSBydyAqIHNpbltpXSAqIHNpbjAgKyBydyAqIGNvc1tpXSAqIGNvczA7XG4gICAgICB5UG9zID0gY2VudGVyWSArIHJoICogY29zW2ldICogc2luMCArIHJoICogc2luW2ldICogY29zMDtcblxuICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgY29udGV4dC5tb3ZlVG8oeFBvcywgeVBvcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZXh0LmxpbmVUbyh4UG9zLCB5UG9zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcblxuLyogZ2xvYmFsIGF0b2IsIEFycmF5QnVmZmVyLCBVaW50OEFycmF5LCBCbG9iICovXG52YXIgQ1JwJDIgPSB7fTtcblxuQ1JwJDIuY3JlYXRlQnVmZmVyID0gZnVuY3Rpb24gKHcsIGgpIHtcbiAgdmFyIGJ1ZmZlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgYnVmZmVyLndpZHRoID0gdztcbiAgYnVmZmVyLmhlaWdodCA9IGg7XG4gIHJldHVybiBbYnVmZmVyLCBidWZmZXIuZ2V0Q29udGV4dCgnMmQnKV07XG59O1xuXG5DUnAkMi5idWZmZXJDYW52YXNJbWFnZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBjeSA9IHRoaXMuY3k7XG4gIHZhciBlbGVzID0gY3kubXV0YWJsZUVsZW1lbnRzKCk7XG4gIHZhciBiYiA9IGVsZXMuYm91bmRpbmdCb3goKTtcbiAgdmFyIGN0clJlY3QgPSB0aGlzLmZpbmRDb250YWluZXJDbGllbnRDb29yZHMoKTtcbiAgdmFyIHdpZHRoID0gb3B0aW9ucy5mdWxsID8gTWF0aC5jZWlsKGJiLncpIDogY3RyUmVjdFsyXTtcbiAgdmFyIGhlaWdodCA9IG9wdGlvbnMuZnVsbCA/IE1hdGguY2VpbChiYi5oKSA6IGN0clJlY3RbM107XG4gIHZhciBzcGVjZE1heERpbXMgPSBudW1iZXIkMShvcHRpb25zLm1heFdpZHRoKSB8fCBudW1iZXIkMShvcHRpb25zLm1heEhlaWdodCk7XG4gIHZhciBweFJhdGlvID0gdGhpcy5nZXRQaXhlbFJhdGlvKCk7XG4gIHZhciBzY2FsZSA9IDE7XG5cbiAgaWYgKG9wdGlvbnMuc2NhbGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHdpZHRoICo9IG9wdGlvbnMuc2NhbGU7XG4gICAgaGVpZ2h0ICo9IG9wdGlvbnMuc2NhbGU7XG4gICAgc2NhbGUgPSBvcHRpb25zLnNjYWxlO1xuICB9IGVsc2UgaWYgKHNwZWNkTWF4RGltcykge1xuICAgIHZhciBtYXhTY2FsZVcgPSBJbmZpbml0eTtcbiAgICB2YXIgbWF4U2NhbGVIID0gSW5maW5pdHk7XG5cbiAgICBpZiAobnVtYmVyJDEob3B0aW9ucy5tYXhXaWR0aCkpIHtcbiAgICAgIG1heFNjYWxlVyA9IHNjYWxlICogb3B0aW9ucy5tYXhXaWR0aCAvIHdpZHRoO1xuICAgIH1cblxuICAgIGlmIChudW1iZXIkMShvcHRpb25zLm1heEhlaWdodCkpIHtcbiAgICAgIG1heFNjYWxlSCA9IHNjYWxlICogb3B0aW9ucy5tYXhIZWlnaHQgLyBoZWlnaHQ7XG4gICAgfVxuXG4gICAgc2NhbGUgPSBNYXRoLm1pbihtYXhTY2FsZVcsIG1heFNjYWxlSCk7XG4gICAgd2lkdGggKj0gc2NhbGU7XG4gICAgaGVpZ2h0ICo9IHNjYWxlO1xuICB9XG5cbiAgaWYgKCFzcGVjZE1heERpbXMpIHtcbiAgICB3aWR0aCAqPSBweFJhdGlvO1xuICAgIGhlaWdodCAqPSBweFJhdGlvO1xuICAgIHNjYWxlICo9IHB4UmF0aW87XG4gIH1cblxuICB2YXIgYnVmZkNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgYnVmZkNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICBidWZmQ2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgYnVmZkNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgYnVmZkNhbnZhcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuICB2YXIgYnVmZkN4dCA9IGJ1ZmZDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTsgLy8gUmFzdGVyaXplIHRoZSBsYXllcnMsIGJ1dCBvbmx5IGlmIGNvbnRhaW5lciBoYXMgbm9uemVybyBzaXplXG5cbiAgaWYgKHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwKSB7XG4gICAgYnVmZkN4dC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgYnVmZkN4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnc291cmNlLW92ZXInO1xuICAgIHZhciB6c29ydGVkRWxlcyA9IHRoaXMuZ2V0Q2FjaGVkWlNvcnRlZEVsZXMoKTtcblxuICAgIGlmIChvcHRpb25zLmZ1bGwpIHtcbiAgICAgIC8vIGRyYXcgdGhlIGZ1bGwgYm91bmRzIG9mIHRoZSBncmFwaFxuICAgICAgYnVmZkN4dC50cmFuc2xhdGUoLWJiLngxICogc2NhbGUsIC1iYi55MSAqIHNjYWxlKTtcbiAgICAgIGJ1ZmZDeHQuc2NhbGUoc2NhbGUsIHNjYWxlKTtcbiAgICAgIHRoaXMuZHJhd0VsZW1lbnRzKGJ1ZmZDeHQsIHpzb3J0ZWRFbGVzKTtcbiAgICAgIGJ1ZmZDeHQuc2NhbGUoMSAvIHNjYWxlLCAxIC8gc2NhbGUpO1xuICAgICAgYnVmZkN4dC50cmFuc2xhdGUoYmIueDEgKiBzY2FsZSwgYmIueTEgKiBzY2FsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRyYXcgdGhlIGN1cnJlbnQgdmlld1xuICAgICAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICAgICAgdmFyIHRyYW5zbGF0aW9uID0ge1xuICAgICAgICB4OiBwYW4ueCAqIHNjYWxlLFxuICAgICAgICB5OiBwYW4ueSAqIHNjYWxlXG4gICAgICB9O1xuICAgICAgc2NhbGUgKj0gY3kuem9vbSgpO1xuICAgICAgYnVmZkN4dC50cmFuc2xhdGUodHJhbnNsYXRpb24ueCwgdHJhbnNsYXRpb24ueSk7XG4gICAgICBidWZmQ3h0LnNjYWxlKHNjYWxlLCBzY2FsZSk7XG4gICAgICB0aGlzLmRyYXdFbGVtZW50cyhidWZmQ3h0LCB6c29ydGVkRWxlcyk7XG4gICAgICBidWZmQ3h0LnNjYWxlKDEgLyBzY2FsZSwgMSAvIHNjYWxlKTtcbiAgICAgIGJ1ZmZDeHQudHJhbnNsYXRlKC10cmFuc2xhdGlvbi54LCAtdHJhbnNsYXRpb24ueSk7XG4gICAgfSAvLyBuZWVkIHRvIGZpbGwgYmcgYXQgZW5kIGxpa2UgdGhpcyBpbiBvcmRlciB0byBmaWxsIGNsZWFyZWQgdHJhbnNwYXJlbnQgcGl4ZWxzIGluIGpwZ3NcblxuXG4gICAgaWYgKG9wdGlvbnMuYmcpIHtcbiAgICAgIGJ1ZmZDeHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLW92ZXInO1xuICAgICAgYnVmZkN4dC5maWxsU3R5bGUgPSBvcHRpb25zLmJnO1xuICAgICAgYnVmZkN4dC5yZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgYnVmZkN4dC5maWxsKCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1ZmZDYW52YXM7XG59O1xuXG5mdW5jdGlvbiBiNjRUb0Jsb2IoYjY0LCBtaW1lVHlwZSkge1xuICB2YXIgYnl0ZXMgPSBhdG9iKGI2NCk7XG4gIHZhciBidWZmID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVzLmxlbmd0aCk7XG4gIHZhciBidWZmVWludDggPSBuZXcgVWludDhBcnJheShidWZmKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgYnVmZlVpbnQ4W2ldID0gYnl0ZXMuY2hhckNvZGVBdChpKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgQmxvYihbYnVmZl0sIHtcbiAgICB0eXBlOiBtaW1lVHlwZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYjY0VXJpVG9CNjQoYjY0dXJpKSB7XG4gIHZhciBpID0gYjY0dXJpLmluZGV4T2YoJywnKTtcbiAgcmV0dXJuIGI2NHVyaS5zdWJzdHIoaSArIDEpO1xufVxuXG5mdW5jdGlvbiBvdXRwdXQob3B0aW9ucywgY2FudmFzLCBtaW1lVHlwZSkge1xuICB2YXIgZ2V0QjY0VXJpID0gZnVuY3Rpb24gZ2V0QjY0VXJpKCkge1xuICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKG1pbWVUeXBlLCBvcHRpb25zLnF1YWxpdHkpO1xuICB9O1xuXG4gIHN3aXRjaCAob3B0aW9ucy5vdXRwdXQpIHtcbiAgICBjYXNlICdibG9iLXByb21pc2UnOlxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbnZhcy50b0Jsb2IoZnVuY3Rpb24gKGJsb2IpIHtcbiAgICAgICAgICAgIGlmIChibG9iICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShibG9iKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ2BjYW52YXMudG9CbG9iKClgIHNlbnQgYSBudWxsIHZhbHVlIGluIGl0cyBjYWxsYmFjaycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBtaW1lVHlwZSwgb3B0aW9ucy5xdWFsaXR5KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgY2FzZSAnYmxvYic6XG4gICAgICByZXR1cm4gYjY0VG9CbG9iKGI2NFVyaVRvQjY0KGdldEI2NFVyaSgpKSwgbWltZVR5cGUpO1xuXG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgIHJldHVybiBiNjRVcmlUb0I2NChnZXRCNjRVcmkoKSk7XG5cbiAgICBjYXNlICdiYXNlNjR1cmknOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZ2V0QjY0VXJpKCk7XG4gIH1cbn1cblxuQ1JwJDIucG5nID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG91dHB1dChvcHRpb25zLCB0aGlzLmJ1ZmZlckNhbnZhc0ltYWdlKG9wdGlvbnMpLCAnaW1hZ2UvcG5nJyk7XG59O1xuXG5DUnAkMi5qcGcgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICByZXR1cm4gb3V0cHV0KG9wdGlvbnMsIHRoaXMuYnVmZmVyQ2FudmFzSW1hZ2Uob3B0aW9ucyksICdpbWFnZS9qcGVnJyk7XG59O1xuXG52YXIgQ1JwJDEgPSB7fTtcblxuQ1JwJDEubm9kZVNoYXBlSW1wbCA9IGZ1bmN0aW9uIChuYW1lLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwb2ludHMpIHtcbiAgc3dpdGNoIChuYW1lKSB7XG4gICAgY2FzZSAnZWxsaXBzZSc6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3RWxsaXBzZVBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICBjYXNlICdwb2x5Z29uJzpcbiAgICAgIHJldHVybiB0aGlzLmRyYXdQb2x5Z29uUGF0aChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwb2ludHMpO1xuXG4gICAgY2FzZSAncm91bmQtcG9seWdvbic6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3Um91bmRQb2x5Z29uUGF0aChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwb2ludHMpO1xuXG4gICAgY2FzZSAncm91bmRyZWN0YW5nbGUnOlxuICAgIGNhc2UgJ3JvdW5kLXJlY3RhbmdsZSc6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3Um91bmRSZWN0YW5nbGVQYXRoKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgY2FzZSAnY3V0cmVjdGFuZ2xlJzpcbiAgICBjYXNlICdjdXQtcmVjdGFuZ2xlJzpcbiAgICAgIHJldHVybiB0aGlzLmRyYXdDdXRSZWN0YW5nbGVQYXRoKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgY2FzZSAnYm90dG9tcm91bmRyZWN0YW5nbGUnOlxuICAgIGNhc2UgJ2JvdHRvbS1yb3VuZC1yZWN0YW5nbGUnOlxuICAgICAgcmV0dXJuIHRoaXMuZHJhd0JvdHRvbVJvdW5kUmVjdGFuZ2xlUGF0aChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgIGNhc2UgJ2JhcnJlbCc6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3QmFycmVsUGF0aChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgfVxufTtcblxudmFyIENSID0gQ2FudmFzUmVuZGVyZXI7XG52YXIgQ1JwID0gQ2FudmFzUmVuZGVyZXIucHJvdG90eXBlO1xuQ1JwLkNBTlZBU19MQVlFUlMgPSAzOyAvL1xuXG5DUnAuU0VMRUNUX0JPWCA9IDA7XG5DUnAuRFJBRyA9IDE7XG5DUnAuTk9ERSA9IDI7XG5DUnAuQlVGRkVSX0NPVU5UID0gMzsgLy9cblxuQ1JwLlRFWFRVUkVfQlVGRkVSID0gMDtcbkNScC5NT1RJT05CTFVSX0JVRkZFUl9OT0RFID0gMTtcbkNScC5NT1RJT05CTFVSX0JVRkZFUl9EUkFHID0gMjtcblxuZnVuY3Rpb24gQ2FudmFzUmVuZGVyZXIob3B0aW9ucykge1xuICB2YXIgciA9IHRoaXM7XG4gIHIuZGF0YSA9IHtcbiAgICBjYW52YXNlczogbmV3IEFycmF5KENScC5DQU5WQVNfTEFZRVJTKSxcbiAgICBjb250ZXh0czogbmV3IEFycmF5KENScC5DQU5WQVNfTEFZRVJTKSxcbiAgICBjYW52YXNOZWVkc1JlZHJhdzogbmV3IEFycmF5KENScC5DQU5WQVNfTEFZRVJTKSxcbiAgICBidWZmZXJDYW52YXNlczogbmV3IEFycmF5KENScC5CVUZGRVJfQ09VTlQpLFxuICAgIGJ1ZmZlckNvbnRleHRzOiBuZXcgQXJyYXkoQ1JwLkNBTlZBU19MQVlFUlMpXG4gIH07XG4gIHZhciB0YXBIbE9mZkF0dHIgPSAnLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yJztcbiAgdmFyIHRhcEhsT2ZmU3R5bGUgPSAncmdiYSgwLDAsMCwwKSc7XG4gIHIuZGF0YS5jYW52YXNDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gIHZhciBjb250YWluZXJTdHlsZSA9IHIuZGF0YS5jYW52YXNDb250YWluZXIuc3R5bGU7XG4gIHIuZGF0YS5jYW52YXNDb250YWluZXIuc3R5bGVbdGFwSGxPZmZBdHRyXSA9IHRhcEhsT2ZmU3R5bGU7XG4gIGNvbnRhaW5lclN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgY29udGFpbmVyU3R5bGUuekluZGV4ID0gJzAnO1xuICBjb250YWluZXJTdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICB2YXIgY29udGFpbmVyID0gb3B0aW9ucy5jeS5jb250YWluZXIoKTtcbiAgY29udGFpbmVyLmFwcGVuZENoaWxkKHIuZGF0YS5jYW52YXNDb250YWluZXIpO1xuICBjb250YWluZXIuc3R5bGVbdGFwSGxPZmZBdHRyXSA9IHRhcEhsT2ZmU3R5bGU7XG4gIHZhciBzdHlsZU1hcCA9IHtcbiAgICAnLXdlYmtpdC11c2VyLXNlbGVjdCc6ICdub25lJyxcbiAgICAnLW1vei11c2VyLXNlbGVjdCc6ICctbW96LW5vbmUnLFxuICAgICd1c2VyLXNlbGVjdCc6ICdub25lJyxcbiAgICAnLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yJzogJ3JnYmEoMCwwLDAsMCknLFxuICAgICdvdXRsaW5lLXN0eWxlJzogJ25vbmUnXG4gIH07XG5cbiAgaWYgKG1zKCkpIHtcbiAgICBzdHlsZU1hcFsnLW1zLXRvdWNoLWFjdGlvbiddID0gJ25vbmUnO1xuICAgIHN0eWxlTWFwWyd0b3VjaC1hY3Rpb24nXSA9ICdub25lJztcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgQ1JwLkNBTlZBU19MQVlFUlM7IGkrKykge1xuICAgIHZhciBjYW52YXMgPSByLmRhdGEuY2FudmFzZXNbaV0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gICAgci5kYXRhLmNvbnRleHRzW2ldID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgT2JqZWN0LmtleXMoc3R5bGVNYXApLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgIGNhbnZhcy5zdHlsZVtrXSA9IHN0eWxlTWFwW2tdO1xuICAgIH0pO1xuICAgIGNhbnZhcy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnZGF0YS1pZCcsICdsYXllcicgKyBpKTtcbiAgICBjYW52YXMuc3R5bGUuekluZGV4ID0gU3RyaW5nKENScC5DQU5WQVNfTEFZRVJTIC0gaSk7XG4gICAgci5kYXRhLmNhbnZhc0NvbnRhaW5lci5hcHBlbmRDaGlsZChjYW52YXMpO1xuICAgIHIuZGF0YS5jYW52YXNOZWVkc1JlZHJhd1tpXSA9IGZhbHNlO1xuICB9XG5cbiAgci5kYXRhLnRvcENhbnZhcyA9IHIuZGF0YS5jYW52YXNlc1swXTtcbiAgci5kYXRhLmNhbnZhc2VzW0NScC5OT0RFXS5zZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnLCAnbGF5ZXInICsgQ1JwLk5PREUgKyAnLW5vZGUnKTtcbiAgci5kYXRhLmNhbnZhc2VzW0NScC5TRUxFQ1RfQk9YXS5zZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnLCAnbGF5ZXInICsgQ1JwLlNFTEVDVF9CT1ggKyAnLXNlbGVjdGJveCcpO1xuICByLmRhdGEuY2FudmFzZXNbQ1JwLkRSQUddLnNldEF0dHJpYnV0ZSgnZGF0YS1pZCcsICdsYXllcicgKyBDUnAuRFJBRyArICctZHJhZycpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgQ1JwLkJVRkZFUl9DT1VOVDsgaSsrKSB7XG4gICAgci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICAgIHIuZGF0YS5idWZmZXJDb250ZXh0c1tpXSA9IHIuZGF0YS5idWZmZXJDYW52YXNlc1tpXS5nZXRDb250ZXh0KCcyZCcpO1xuICAgIHIuZGF0YS5idWZmZXJDYW52YXNlc1tpXS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldLnNldEF0dHJpYnV0ZSgnZGF0YS1pZCcsICdidWZmZXInICsgaSk7XG4gICAgci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldLnN0eWxlLnpJbmRleCA9IFN0cmluZygtaSAtIDEpO1xuICAgIHIuZGF0YS5idWZmZXJDYW52YXNlc1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7IC8vci5kYXRhLmNhbnZhc0NvbnRhaW5lci5hcHBlbmRDaGlsZChyLmRhdGEuYnVmZmVyQ2FudmFzZXNbaV0pO1xuICB9XG5cbiAgci5wYXRoc0VuYWJsZWQgPSB0cnVlO1xuICB2YXIgZW1wdHlCYiA9IG1ha2VCb3VuZGluZ0JveCgpO1xuXG4gIHZhciBnZXRCb3hDZW50ZXIgPSBmdW5jdGlvbiBnZXRCb3hDZW50ZXIoYmIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogKGJiLngxICsgYmIueDIpIC8gMixcbiAgICAgIHk6IChiYi55MSArIGJiLnkyKSAvIDJcbiAgICB9O1xuICB9O1xuXG4gIHZhciBnZXRDZW50ZXJPZmZzZXQgPSBmdW5jdGlvbiBnZXRDZW50ZXJPZmZzZXQoYmIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogLWJiLncgLyAyLFxuICAgICAgeTogLWJiLmggLyAyXG4gICAgfTtcbiAgfTtcblxuICB2YXIgYmFja2dyb3VuZFRpbWVzdGFtcEhhc0NoYW5nZWQgPSBmdW5jdGlvbiBiYWNrZ3JvdW5kVGltZXN0YW1wSGFzQ2hhbmdlZChlbGUpIHtcbiAgICB2YXIgX3AgPSBlbGVbMF0uX3ByaXZhdGU7XG4gICAgdmFyIHNhbWUgPSBfcC5vbGRCYWNrZ3JvdW5kVGltZXN0YW1wID09PSBfcC5iYWNrZ3JvdW5kVGltZXN0YW1wO1xuICAgIHJldHVybiAhc2FtZTtcbiAgfTtcblxuICB2YXIgZ2V0U3R5bGVLZXkgPSBmdW5jdGlvbiBnZXRTdHlsZUtleShlbGUpIHtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLm5vZGVLZXk7XG4gIH07XG5cbiAgdmFyIGdldExhYmVsS2V5ID0gZnVuY3Rpb24gZ2V0TGFiZWxLZXkoZWxlKSB7XG4gICAgcmV0dXJuIGVsZVswXS5fcHJpdmF0ZS5sYWJlbFN0eWxlS2V5O1xuICB9O1xuXG4gIHZhciBnZXRTb3VyY2VMYWJlbEtleSA9IGZ1bmN0aW9uIGdldFNvdXJjZUxhYmVsS2V5KGVsZSkge1xuICAgIHJldHVybiBlbGVbMF0uX3ByaXZhdGUuc291cmNlTGFiZWxTdHlsZUtleTtcbiAgfTtcblxuICB2YXIgZ2V0VGFyZ2V0TGFiZWxLZXkgPSBmdW5jdGlvbiBnZXRUYXJnZXRMYWJlbEtleShlbGUpIHtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLnRhcmdldExhYmVsU3R5bGVLZXk7XG4gIH07XG5cbiAgdmFyIGRyYXdFbGVtZW50ID0gZnVuY3Rpb24gZHJhd0VsZW1lbnQoY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgdXNlRWxlT3BhY2l0eSkge1xuICAgIHJldHVybiByLmRyYXdFbGVtZW50KGNvbnRleHQsIGVsZSwgYmIsIGZhbHNlLCBmYWxzZSwgdXNlRWxlT3BhY2l0eSk7XG4gIH07XG5cbiAgdmFyIGRyYXdMYWJlbCA9IGZ1bmN0aW9uIGRyYXdMYWJlbChjb250ZXh0LCBlbGUsIGJiLCBzY2FsZWRMYWJlbFNob3duLCB1c2VFbGVPcGFjaXR5KSB7XG4gICAgcmV0dXJuIHIuZHJhd0VsZW1lbnRUZXh0KGNvbnRleHQsIGVsZSwgYmIsIHNjYWxlZExhYmVsU2hvd24sICdtYWluJywgdXNlRWxlT3BhY2l0eSk7XG4gIH07XG5cbiAgdmFyIGRyYXdTb3VyY2VMYWJlbCA9IGZ1bmN0aW9uIGRyYXdTb3VyY2VMYWJlbChjb250ZXh0LCBlbGUsIGJiLCBzY2FsZWRMYWJlbFNob3duLCB1c2VFbGVPcGFjaXR5KSB7XG4gICAgcmV0dXJuIHIuZHJhd0VsZW1lbnRUZXh0KGNvbnRleHQsIGVsZSwgYmIsIHNjYWxlZExhYmVsU2hvd24sICdzb3VyY2UnLCB1c2VFbGVPcGFjaXR5KTtcbiAgfTtcblxuICB2YXIgZHJhd1RhcmdldExhYmVsID0gZnVuY3Rpb24gZHJhd1RhcmdldExhYmVsKGNvbnRleHQsIGVsZSwgYmIsIHNjYWxlZExhYmVsU2hvd24sIHVzZUVsZU9wYWNpdHkpIHtcbiAgICByZXR1cm4gci5kcmF3RWxlbWVudFRleHQoY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgJ3RhcmdldCcsIHVzZUVsZU9wYWNpdHkpO1xuICB9O1xuXG4gIHZhciBnZXRFbGVtZW50Qm94ID0gZnVuY3Rpb24gZ2V0RWxlbWVudEJveChlbGUpIHtcbiAgICBlbGUuYm91bmRpbmdCb3goKTtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLmJvZHlCb3VuZHM7XG4gIH07XG5cbiAgdmFyIGdldExhYmVsQm94ID0gZnVuY3Rpb24gZ2V0TGFiZWxCb3goZWxlKSB7XG4gICAgZWxlLmJvdW5kaW5nQm94KCk7XG4gICAgcmV0dXJuIGVsZVswXS5fcHJpdmF0ZS5sYWJlbEJvdW5kcy5tYWluIHx8IGVtcHR5QmI7XG4gIH07XG5cbiAgdmFyIGdldFNvdXJjZUxhYmVsQm94ID0gZnVuY3Rpb24gZ2V0U291cmNlTGFiZWxCb3goZWxlKSB7XG4gICAgZWxlLmJvdW5kaW5nQm94KCk7XG4gICAgcmV0dXJuIGVsZVswXS5fcHJpdmF0ZS5sYWJlbEJvdW5kcy5zb3VyY2UgfHwgZW1wdHlCYjtcbiAgfTtcblxuICB2YXIgZ2V0VGFyZ2V0TGFiZWxCb3ggPSBmdW5jdGlvbiBnZXRUYXJnZXRMYWJlbEJveChlbGUpIHtcbiAgICBlbGUuYm91bmRpbmdCb3goKTtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLmxhYmVsQm91bmRzLnRhcmdldCB8fCBlbXB0eUJiO1xuICB9O1xuXG4gIHZhciBpc0xhYmVsVmlzaWJsZUF0U2NhbGUgPSBmdW5jdGlvbiBpc0xhYmVsVmlzaWJsZUF0U2NhbGUoZWxlLCBzY2FsZWRMYWJlbFNob3duKSB7XG4gICAgcmV0dXJuIHNjYWxlZExhYmVsU2hvd247XG4gIH07XG5cbiAgdmFyIGdldEVsZW1lbnRSb3RhdGlvblBvaW50ID0gZnVuY3Rpb24gZ2V0RWxlbWVudFJvdGF0aW9uUG9pbnQoZWxlKSB7XG4gICAgcmV0dXJuIGdldEJveENlbnRlcihnZXRFbGVtZW50Qm94KGVsZSkpO1xuICB9O1xuXG4gIHZhciBhZGRUZXh0TWFyZ2luID0gZnVuY3Rpb24gYWRkVGV4dE1hcmdpbihwcmVmaXgsIHB0LCBlbGUpIHtcbiAgICB2YXIgcHJlID0gcHJlZml4ID8gcHJlZml4ICsgJy0nIDogJyc7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHB0LnggKyBlbGUucHN0eWxlKHByZSArICd0ZXh0LW1hcmdpbi14JykucGZWYWx1ZSxcbiAgICAgIHk6IHB0LnkgKyBlbGUucHN0eWxlKHByZSArICd0ZXh0LW1hcmdpbi15JykucGZWYWx1ZVxuICAgIH07XG4gIH07XG5cbiAgdmFyIGdldFJzUHQgPSBmdW5jdGlvbiBnZXRSc1B0KGVsZSwgeCwgeSkge1xuICAgIHZhciBycyA9IGVsZVswXS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICByZXR1cm4ge1xuICAgICAgeDogcnNbeF0sXG4gICAgICB5OiByc1t5XVxuICAgIH07XG4gIH07XG5cbiAgdmFyIGdldExhYmVsUm90YXRpb25Qb2ludCA9IGZ1bmN0aW9uIGdldExhYmVsUm90YXRpb25Qb2ludChlbGUpIHtcbiAgICByZXR1cm4gYWRkVGV4dE1hcmdpbignJywgZ2V0UnNQdChlbGUsICdsYWJlbFgnLCAnbGFiZWxZJyksIGVsZSk7XG4gIH07XG5cbiAgdmFyIGdldFNvdXJjZUxhYmVsUm90YXRpb25Qb2ludCA9IGZ1bmN0aW9uIGdldFNvdXJjZUxhYmVsUm90YXRpb25Qb2ludChlbGUpIHtcbiAgICByZXR1cm4gYWRkVGV4dE1hcmdpbignc291cmNlJywgZ2V0UnNQdChlbGUsICdzb3VyY2VMYWJlbFgnLCAnc291cmNlTGFiZWxZJyksIGVsZSk7XG4gIH07XG5cbiAgdmFyIGdldFRhcmdldExhYmVsUm90YXRpb25Qb2ludCA9IGZ1bmN0aW9uIGdldFRhcmdldExhYmVsUm90YXRpb25Qb2ludChlbGUpIHtcbiAgICByZXR1cm4gYWRkVGV4dE1hcmdpbigndGFyZ2V0JywgZ2V0UnNQdChlbGUsICd0YXJnZXRMYWJlbFgnLCAndGFyZ2V0TGFiZWxZJyksIGVsZSk7XG4gIH07XG5cbiAgdmFyIGdldEVsZW1lbnRSb3RhdGlvbk9mZnNldCA9IGZ1bmN0aW9uIGdldEVsZW1lbnRSb3RhdGlvbk9mZnNldChlbGUpIHtcbiAgICByZXR1cm4gZ2V0Q2VudGVyT2Zmc2V0KGdldEVsZW1lbnRCb3goZWxlKSk7XG4gIH07XG5cbiAgdmFyIGdldFNvdXJjZUxhYmVsUm90YXRpb25PZmZzZXQgPSBmdW5jdGlvbiBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uT2Zmc2V0KGVsZSkge1xuICAgIHJldHVybiBnZXRDZW50ZXJPZmZzZXQoZ2V0U291cmNlTGFiZWxCb3goZWxlKSk7XG4gIH07XG5cbiAgdmFyIGdldFRhcmdldExhYmVsUm90YXRpb25PZmZzZXQgPSBmdW5jdGlvbiBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uT2Zmc2V0KGVsZSkge1xuICAgIHJldHVybiBnZXRDZW50ZXJPZmZzZXQoZ2V0VGFyZ2V0TGFiZWxCb3goZWxlKSk7XG4gIH07XG5cbiAgdmFyIGdldExhYmVsUm90YXRpb25PZmZzZXQgPSBmdW5jdGlvbiBnZXRMYWJlbFJvdGF0aW9uT2Zmc2V0KGVsZSkge1xuICAgIHZhciBiYiA9IGdldExhYmVsQm94KGVsZSk7XG4gICAgdmFyIHAgPSBnZXRDZW50ZXJPZmZzZXQoZ2V0TGFiZWxCb3goZWxlKSk7XG5cbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICBzd2l0Y2ggKGVsZS5wc3R5bGUoJ3RleHQtaGFsaWduJykudmFsdWUpIHtcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgcC54ID0gLWJiLnc7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIHAueCA9IDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZWxlLnBzdHlsZSgndGV4dC12YWxpZ24nKS52YWx1ZSkge1xuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgIHAueSA9IC1iYi5oO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgcC55ID0gMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcDtcbiAgfTtcblxuICB2YXIgZWxlVHhyQ2FjaGUgPSByLmRhdGEuZWxlVHhyQ2FjaGUgPSBuZXcgRWxlbWVudFRleHR1cmVDYWNoZShyLCB7XG4gICAgZ2V0S2V5OiBnZXRTdHlsZUtleSxcbiAgICBkb2VzRWxlSW52YWxpZGF0ZUtleTogYmFja2dyb3VuZFRpbWVzdGFtcEhhc0NoYW5nZWQsXG4gICAgZHJhd0VsZW1lbnQ6IGRyYXdFbGVtZW50LFxuICAgIGdldEJvdW5kaW5nQm94OiBnZXRFbGVtZW50Qm94LFxuICAgIGdldFJvdGF0aW9uUG9pbnQ6IGdldEVsZW1lbnRSb3RhdGlvblBvaW50LFxuICAgIGdldFJvdGF0aW9uT2Zmc2V0OiBnZXRFbGVtZW50Um90YXRpb25PZmZzZXQsXG4gICAgYWxsb3dFZGdlVHhyQ2FjaGluZzogZmFsc2UsXG4gICAgYWxsb3dQYXJlbnRUeHJDYWNoaW5nOiBmYWxzZVxuICB9KTtcbiAgdmFyIGxibFR4ckNhY2hlID0gci5kYXRhLmxibFR4ckNhY2hlID0gbmV3IEVsZW1lbnRUZXh0dXJlQ2FjaGUociwge1xuICAgIGdldEtleTogZ2V0TGFiZWxLZXksXG4gICAgZHJhd0VsZW1lbnQ6IGRyYXdMYWJlbCxcbiAgICBnZXRCb3VuZGluZ0JveDogZ2V0TGFiZWxCb3gsXG4gICAgZ2V0Um90YXRpb25Qb2ludDogZ2V0TGFiZWxSb3RhdGlvblBvaW50LFxuICAgIGdldFJvdGF0aW9uT2Zmc2V0OiBnZXRMYWJlbFJvdGF0aW9uT2Zmc2V0LFxuICAgIGlzVmlzaWJsZTogaXNMYWJlbFZpc2libGVBdFNjYWxlXG4gIH0pO1xuICB2YXIgc2xiVHhyQ2FjaGUgPSByLmRhdGEuc2xiVHhyQ2FjaGUgPSBuZXcgRWxlbWVudFRleHR1cmVDYWNoZShyLCB7XG4gICAgZ2V0S2V5OiBnZXRTb3VyY2VMYWJlbEtleSxcbiAgICBkcmF3RWxlbWVudDogZHJhd1NvdXJjZUxhYmVsLFxuICAgIGdldEJvdW5kaW5nQm94OiBnZXRTb3VyY2VMYWJlbEJveCxcbiAgICBnZXRSb3RhdGlvblBvaW50OiBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uUG9pbnQsXG4gICAgZ2V0Um90YXRpb25PZmZzZXQ6IGdldFNvdXJjZUxhYmVsUm90YXRpb25PZmZzZXQsXG4gICAgaXNWaXNpYmxlOiBpc0xhYmVsVmlzaWJsZUF0U2NhbGVcbiAgfSk7XG4gIHZhciB0bGJUeHJDYWNoZSA9IHIuZGF0YS50bGJUeHJDYWNoZSA9IG5ldyBFbGVtZW50VGV4dHVyZUNhY2hlKHIsIHtcbiAgICBnZXRLZXk6IGdldFRhcmdldExhYmVsS2V5LFxuICAgIGRyYXdFbGVtZW50OiBkcmF3VGFyZ2V0TGFiZWwsXG4gICAgZ2V0Qm91bmRpbmdCb3g6IGdldFRhcmdldExhYmVsQm94LFxuICAgIGdldFJvdGF0aW9uUG9pbnQ6IGdldFRhcmdldExhYmVsUm90YXRpb25Qb2ludCxcbiAgICBnZXRSb3RhdGlvbk9mZnNldDogZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvbk9mZnNldCxcbiAgICBpc1Zpc2libGU6IGlzTGFiZWxWaXNpYmxlQXRTY2FsZVxuICB9KTtcbiAgdmFyIGx5clR4ckNhY2hlID0gci5kYXRhLmx5clR4ckNhY2hlID0gbmV3IExheWVyZWRUZXh0dXJlQ2FjaGUocik7XG4gIHIub25VcGRhdGVFbGVDYWxjcyhmdW5jdGlvbiBpbnZhbGlkYXRlVGV4dHVyZUNhY2hlcyh3aWxsRHJhdywgZWxlcykge1xuICAgIC8vIGVhY2ggY2FjaGUgc2hvdWxkIGNoZWNrIGZvciBzdWIta2V5IGRpZmYgdG8gc2VlIHRoYXQgdGhlIHVwZGF0ZSBhZmZlY3RzIHRoYXQgY2FjaGUgcGFydGljdWxhcmx5XG4gICAgZWxlVHhyQ2FjaGUuaW52YWxpZGF0ZUVsZW1lbnRzKGVsZXMpO1xuICAgIGxibFR4ckNhY2hlLmludmFsaWRhdGVFbGVtZW50cyhlbGVzKTtcbiAgICBzbGJUeHJDYWNoZS5pbnZhbGlkYXRlRWxlbWVudHMoZWxlcyk7XG4gICAgdGxiVHhyQ2FjaGUuaW52YWxpZGF0ZUVsZW1lbnRzKGVsZXMpOyAvLyBhbnkgY2hhbmdlIGludmFsaWRhdGVzIHRoZSBsYXllcnNcblxuICAgIGx5clR4ckNhY2hlLmludmFsaWRhdGVFbGVtZW50cyhlbGVzKTsgLy8gdXBkYXRlIHRoZSBvbGQgYmcgdGltZXN0YW1wIHNvIGRpZmZzIGNhbiBiZSBkb25lIGluIHRoZSBlbGUgdHhyIGNhY2hlc1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGVsZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX3AgPSBlbGVzW19pXS5fcHJpdmF0ZTtcbiAgICAgIF9wLm9sZEJhY2tncm91bmRUaW1lc3RhbXAgPSBfcC5iYWNrZ3JvdW5kVGltZXN0YW1wO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIHJlZmluZUluTGF5ZXJzID0gZnVuY3Rpb24gcmVmaW5lSW5MYXllcnMocmVxcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVxcy5sZW5ndGg7IGkrKykge1xuICAgICAgbHlyVHhyQ2FjaGUuZW5xdWV1ZUVsZW1lbnRSZWZpbmVtZW50KHJlcXNbaV0uZWxlKTtcbiAgICB9XG4gIH07XG5cbiAgZWxlVHhyQ2FjaGUub25EZXF1ZXVlKHJlZmluZUluTGF5ZXJzKTtcbiAgbGJsVHhyQ2FjaGUub25EZXF1ZXVlKHJlZmluZUluTGF5ZXJzKTtcbiAgc2xiVHhyQ2FjaGUub25EZXF1ZXVlKHJlZmluZUluTGF5ZXJzKTtcbiAgdGxiVHhyQ2FjaGUub25EZXF1ZXVlKHJlZmluZUluTGF5ZXJzKTtcbn1cblxuQ1JwLnJlZHJhd0hpbnQgPSBmdW5jdGlvbiAoZ3JvdXAsIGJvb2wpIHtcbiAgdmFyIHIgPSB0aGlzO1xuXG4gIHN3aXRjaCAoZ3JvdXApIHtcbiAgICBjYXNlICdlbGVzJzpcbiAgICAgIHIuZGF0YS5jYW52YXNOZWVkc1JlZHJhd1tDUnAuTk9ERV0gPSBib29sO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkcmFnJzpcbiAgICAgIHIuZGF0YS5jYW52YXNOZWVkc1JlZHJhd1tDUnAuRFJBR10gPSBib29sO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgci5kYXRhLmNhbnZhc05lZWRzUmVkcmF3W0NScC5TRUxFQ1RfQk9YXSA9IGJvb2w7XG4gICAgICBicmVhaztcbiAgfVxufTsgLy8gd2hldGhlciB0byB1c2UgUGF0aDJEIGNhY2hpbmcgZm9yIGRyYXdpbmdcblxuXG52YXIgcGF0aHNJbXBsZCA9IHR5cGVvZiBQYXRoMkQgIT09ICd1bmRlZmluZWQnO1xuXG5DUnAucGF0aDJkRW5hYmxlZCA9IGZ1bmN0aW9uIChvbikge1xuICBpZiAob24gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0aGlzLnBhdGhzRW5hYmxlZDtcbiAgfVxuXG4gIHRoaXMucGF0aHNFbmFibGVkID0gb24gPyB0cnVlIDogZmFsc2U7XG59O1xuXG5DUnAudXNlUGF0aHMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBwYXRoc0ltcGxkICYmIHRoaXMucGF0aHNFbmFibGVkO1xufTtcblxuQ1JwLnNldEltZ1Ntb290aGluZyA9IGZ1bmN0aW9uIChjb250ZXh0LCBib29sKSB7XG4gIGlmIChjb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZCAhPSBudWxsKSB7XG4gICAgY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBib29sO1xuICB9IGVsc2Uge1xuICAgIGNvbnRleHQud2Via2l0SW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gYm9vbDtcbiAgICBjb250ZXh0Lm1vekltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGJvb2w7XG4gICAgY29udGV4dC5tc0ltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGJvb2w7XG4gIH1cbn07XG5cbkNScC5nZXRJbWdTbW9vdGhpbmcgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICBpZiAoY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgIT0gbnVsbCkge1xuICAgIHJldHVybiBjb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29udGV4dC53ZWJraXRJbWFnZVNtb290aGluZ0VuYWJsZWQgfHwgY29udGV4dC5tb3pJbWFnZVNtb290aGluZ0VuYWJsZWQgfHwgY29udGV4dC5tc0ltYWdlU21vb3RoaW5nRW5hYmxlZDtcbiAgfVxufTtcblxuQ1JwLm1ha2VPZmZzY3JlZW5DYW52YXMgPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuICB2YXIgY2FudmFzO1xuXG4gIGlmICgodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKE9mZnNjcmVlbkNhbnZhcykpICE9PSAoXCJ1bmRlZmluZWRcIiApKSB7XG4gICAgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgfSBlbHNlIHtcbiAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgfVxuXG4gIHJldHVybiBjYW52YXM7XG59O1xuXG5bQ1JwJGEsIENScCQ5LCBDUnAkOCwgQ1JwJDcsIENScCQ2LCBDUnAkNSwgQ1JwJDQsIENScCQzLCBDUnAkMiwgQ1JwJDFdLmZvckVhY2goZnVuY3Rpb24gKHByb3BzKSB7XG4gIGV4dGVuZChDUnAsIHByb3BzKTtcbn0pO1xuXG52YXIgcmVuZGVyZXIgPSBbe1xuICBuYW1lOiAnbnVsbCcsXG4gIGltcGw6IE51bGxSZW5kZXJlclxufSwge1xuICBuYW1lOiAnYmFzZScsXG4gIGltcGw6IEJSXG59LCB7XG4gIG5hbWU6ICdjYW52YXMnLFxuICBpbXBsOiBDUlxufV07XG5cbnZhciBpbmNFeHRzID0gW3tcbiAgdHlwZTogJ2xheW91dCcsXG4gIGV4dGVuc2lvbnM6IGxheW91dFxufSwge1xuICB0eXBlOiAncmVuZGVyZXInLFxuICBleHRlbnNpb25zOiByZW5kZXJlclxufV07XG5cbnZhciBleHRlbnNpb25zID0ge307IC8vIHJlZ2lzdGVyZWQgbW9kdWxlcyBmb3IgZXh0ZW5zaW9ucywgaW5kZXhlZCBieSBuYW1lXG5cbnZhciBtb2R1bGVzID0ge307XG5cbmZ1bmN0aW9uIHNldEV4dGVuc2lvbih0eXBlLCBuYW1lLCByZWdpc3RyYW50KSB7XG4gIHZhciBleHQgPSByZWdpc3RyYW50O1xuXG4gIHZhciBvdmVycmlkZUVyciA9IGZ1bmN0aW9uIG92ZXJyaWRlRXJyKGZpZWxkKSB7XG4gICAgd2FybignQ2FuIG5vdCByZWdpc3RlciBgJyArIG5hbWUgKyAnYCBmb3IgYCcgKyB0eXBlICsgJ2Agc2luY2UgYCcgKyBmaWVsZCArICdgIGFscmVhZHkgZXhpc3RzIGluIHRoZSBwcm90b3R5cGUgYW5kIGNhbiBub3QgYmUgb3ZlcnJpZGRlbicpO1xuICB9O1xuXG4gIGlmICh0eXBlID09PSAnY29yZScpIHtcbiAgICBpZiAoQ29yZS5wcm90b3R5cGVbbmFtZV0pIHtcbiAgICAgIHJldHVybiBvdmVycmlkZUVycihuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgQ29yZS5wcm90b3R5cGVbbmFtZV0gPSByZWdpc3RyYW50O1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlID09PSAnY29sbGVjdGlvbicpIHtcbiAgICBpZiAoQ29sbGVjdGlvbi5wcm90b3R5cGVbbmFtZV0pIHtcbiAgICAgIHJldHVybiBvdmVycmlkZUVycihuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgQ29sbGVjdGlvbi5wcm90b3R5cGVbbmFtZV0gPSByZWdpc3RyYW50O1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbGF5b3V0Jykge1xuICAgIC8vIGZpbGwgaW4gbWlzc2luZyBsYXlvdXQgZnVuY3Rpb25zIGluIHRoZSBwcm90b3R5cGVcbiAgICB2YXIgTGF5b3V0ID0gZnVuY3Rpb24gTGF5b3V0KG9wdGlvbnMpIHtcbiAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICByZWdpc3RyYW50LmNhbGwodGhpcywgb3B0aW9ucyk7IC8vIG1ha2Ugc3VyZSBsYXlvdXQgaGFzIF9wcml2YXRlIGZvciB1c2Ugdy8gc3RkIGFwaXMgbGlrZSAub24oKVxuXG4gICAgICBpZiAoIXBsYWluT2JqZWN0KHRoaXMuX3ByaXZhdGUpKSB7XG4gICAgICAgIHRoaXMuX3ByaXZhdGUgPSB7fTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcHJpdmF0ZS5jeSA9IG9wdGlvbnMuY3k7XG4gICAgICB0aGlzLl9wcml2YXRlLmxpc3RlbmVycyA9IFtdO1xuICAgICAgdGhpcy5jcmVhdGVFbWl0dGVyKCk7XG4gICAgfTtcblxuICAgIHZhciBsYXlvdXRQcm90byA9IExheW91dC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHJlZ2lzdHJhbnQucHJvdG90eXBlKTtcbiAgICB2YXIgb3B0TGF5b3V0Rm5zID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdExheW91dEZucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGZuTmFtZSA9IG9wdExheW91dEZuc1tpXTtcblxuICAgICAgbGF5b3V0UHJvdG9bZm5OYW1lXSA9IGxheW91dFByb3RvW2ZuTmFtZV0gfHwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH07XG4gICAgfSAvLyBlaXRoZXIgLnN0YXJ0KCkgb3IgLnJ1bigpIGlzIGRlZmluZWQsIHNvIGF1dG9nZW4gdGhlIG90aGVyXG5cblxuICAgIGlmIChsYXlvdXRQcm90by5zdGFydCAmJiAhbGF5b3V0UHJvdG8ucnVuKSB7XG4gICAgICBsYXlvdXRQcm90by5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc3RhcnQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoIWxheW91dFByb3RvLnN0YXJ0ICYmIGxheW91dFByb3RvLnJ1bikge1xuICAgICAgbGF5b3V0UHJvdG8uc3RhcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucnVuKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgcmVnU3RvcCA9IHJlZ2lzdHJhbnQucHJvdG90eXBlLnN0b3A7XG5cbiAgICBsYXlvdXRQcm90by5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9wdHMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgIGlmIChvcHRzICYmIG9wdHMuYW5pbWF0ZSkge1xuICAgICAgICB2YXIgYW5pcyA9IHRoaXMuYW5pbWF0aW9ucztcblxuICAgICAgICBpZiAoYW5pcykge1xuICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhbmlzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYW5pc1tfaV0uc3RvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmVnU3RvcCkge1xuICAgICAgICByZWdTdG9wLmNhbGwodGhpcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVtaXQoJ2xheW91dHN0b3AnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIGlmICghbGF5b3V0UHJvdG8uZGVzdHJveSkge1xuICAgICAgbGF5b3V0UHJvdG8uZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGxheW91dFByb3RvLmN5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuY3k7XG4gICAgfTtcblxuICAgIHZhciBnZXRDeSA9IGZ1bmN0aW9uIGdldEN5KGxheW91dCkge1xuICAgICAgcmV0dXJuIGxheW91dC5fcHJpdmF0ZS5jeTtcbiAgICB9O1xuXG4gICAgdmFyIGVtaXR0ZXJPcHRzID0ge1xuICAgICAgYWRkRXZlbnRGaWVsZHM6IGZ1bmN0aW9uIGFkZEV2ZW50RmllbGRzKGxheW91dCwgZXZ0KSB7XG4gICAgICAgIGV2dC5sYXlvdXQgPSBsYXlvdXQ7XG4gICAgICAgIGV2dC5jeSA9IGdldEN5KGxheW91dCk7XG4gICAgICAgIGV2dC50YXJnZXQgPSBsYXlvdXQ7XG4gICAgICB9LFxuICAgICAgYnViYmxlOiBmdW5jdGlvbiBidWJibGUoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIHBhcmVudDogZnVuY3Rpb24gcGFyZW50KGxheW91dCkge1xuICAgICAgICByZXR1cm4gZ2V0Q3kobGF5b3V0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGV4dGVuZChsYXlvdXRQcm90bywge1xuICAgICAgY3JlYXRlRW1pdHRlcjogZnVuY3Rpb24gY3JlYXRlRW1pdHRlcigpIHtcbiAgICAgICAgdGhpcy5fcHJpdmF0ZS5lbWl0dGVyID0gbmV3IEVtaXR0ZXIoZW1pdHRlck9wdHMsIHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICBlbWl0dGVyOiBmdW5jdGlvbiBlbWl0dGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5lbWl0dGVyO1xuICAgICAgfSxcbiAgICAgIG9uOiBmdW5jdGlvbiBvbihldnQsIGNiKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcigpLm9uKGV2dCwgY2IpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICBvbmU6IGZ1bmN0aW9uIG9uZShldnQsIGNiKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcigpLm9uZShldnQsIGNiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgICAgb25jZTogZnVuY3Rpb24gb25jZShldnQsIGNiKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcigpLm9uZShldnQsIGNiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgICAgcmVtb3ZlTGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2dCwgY2IpIHtcbiAgICAgICAgdGhpcy5lbWl0dGVyKCkucmVtb3ZlTGlzdGVuZXIoZXZ0LCBjYik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZUFsbExpc3RlbmVyczogZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKCkge1xuICAgICAgICB0aGlzLmVtaXR0ZXIoKS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgICAgZW1pdDogZnVuY3Rpb24gZW1pdChldnQsIHBhcmFtcykge1xuICAgICAgICB0aGlzLmVtaXR0ZXIoKS5lbWl0KGV2dCwgcGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZGVmaW5lLmV2ZW50QWxpYXNlc09uKGxheW91dFByb3RvKTtcbiAgICBleHQgPSBMYXlvdXQ7IC8vIHJlcGxhY2Ugd2l0aCBvdXIgd3JhcHBlZCBsYXlvdXRcbiAgfSBlbHNlIGlmICh0eXBlID09PSAncmVuZGVyZXInICYmIG5hbWUgIT09ICdudWxsJyAmJiBuYW1lICE9PSAnYmFzZScpIHtcbiAgICAvLyB1c2VyIHJlZ2lzdGVyZWQgcmVuZGVyZXJzIGluaGVyaXQgZnJvbSBiYXNlXG4gICAgdmFyIEJhc2VSZW5kZXJlciA9IGdldEV4dGVuc2lvbigncmVuZGVyZXInLCAnYmFzZScpO1xuICAgIHZhciBiUHJvdG8gPSBCYXNlUmVuZGVyZXIucHJvdG90eXBlO1xuICAgIHZhciBSZWdpc3RyYW50UmVuZGVyZXIgPSByZWdpc3RyYW50O1xuICAgIHZhciByUHJvdG8gPSByZWdpc3RyYW50LnByb3RvdHlwZTtcblxuICAgIHZhciBSZW5kZXJlciA9IGZ1bmN0aW9uIFJlbmRlcmVyKCkge1xuICAgICAgQmFzZVJlbmRlcmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBSZWdpc3RyYW50UmVuZGVyZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgdmFyIHByb3RvID0gUmVuZGVyZXIucHJvdG90eXBlO1xuXG4gICAgZm9yICh2YXIgcE5hbWUgaW4gYlByb3RvKSB7XG4gICAgICB2YXIgcFZhbCA9IGJQcm90b1twTmFtZV07XG4gICAgICB2YXIgZXhpc3RzSW5SID0gclByb3RvW3BOYW1lXSAhPSBudWxsO1xuXG4gICAgICBpZiAoZXhpc3RzSW5SKSB7XG4gICAgICAgIHJldHVybiBvdmVycmlkZUVycihwTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHByb3RvW3BOYW1lXSA9IHBWYWw7IC8vIHRha2UgaW1wbCBmcm9tIGJhc2VcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfcE5hbWUgaW4gclByb3RvKSB7XG4gICAgICBwcm90b1tfcE5hbWVdID0gclByb3RvW19wTmFtZV07IC8vIHRha2UgaW1wbCBmcm9tIHJlZ2lzdHJhbnRcbiAgICB9XG5cbiAgICBiUHJvdG8uY2xpZW50RnVuY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHByb3RvW25hbWVdID0gcHJvdG9bbmFtZV0gfHwgZnVuY3Rpb24gKCkge1xuICAgICAgICBlcnJvcignUmVuZGVyZXIgZG9lcyBub3QgaW1wbGVtZW50IGByZW5kZXJlci4nICsgbmFtZSArICcoKWAgb24gaXRzIHByb3RvdHlwZScpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBleHQgPSBSZW5kZXJlcjtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnX19wcm90b19fJyB8fCB0eXBlID09PSAnY29uc3RydWN0b3InIHx8IHR5cGUgPT09ICdwcm90b3R5cGUnKSB7XG4gICAgLy8gdG8gYXZvaWQgcG90ZW50aWFsIHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICByZXR1cm4gZXJyb3IodHlwZSArICcgaXMgYW4gaWxsZWdhbCB0eXBlIHRvIGJlIHJlZ2lzdGVyZWQsIHBvc3NpYmx5IGxlYWQgdG8gcHJvdG90eXBlIHBvbGx1dGlvbnMnKTtcbiAgfVxuXG4gIHJldHVybiBzZXRNYXAoe1xuICAgIG1hcDogZXh0ZW5zaW9ucyxcbiAgICBrZXlzOiBbdHlwZSwgbmFtZV0sXG4gICAgdmFsdWU6IGV4dFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uKHR5cGUsIG5hbWUpIHtcbiAgcmV0dXJuIGdldE1hcCh7XG4gICAgbWFwOiBleHRlbnNpb25zLFxuICAgIGtleXM6IFt0eXBlLCBuYW1lXVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2V0TW9kdWxlKHR5cGUsIG5hbWUsIG1vZHVsZVR5cGUsIG1vZHVsZU5hbWUsIHJlZ2lzdHJhbnQpIHtcbiAgcmV0dXJuIHNldE1hcCh7XG4gICAgbWFwOiBtb2R1bGVzLFxuICAgIGtleXM6IFt0eXBlLCBuYW1lLCBtb2R1bGVUeXBlLCBtb2R1bGVOYW1lXSxcbiAgICB2YWx1ZTogcmVnaXN0cmFudFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0TW9kdWxlKHR5cGUsIG5hbWUsIG1vZHVsZVR5cGUsIG1vZHVsZU5hbWUpIHtcbiAgcmV0dXJuIGdldE1hcCh7XG4gICAgbWFwOiBtb2R1bGVzLFxuICAgIGtleXM6IFt0eXBlLCBuYW1lLCBtb2R1bGVUeXBlLCBtb2R1bGVOYW1lXVxuICB9KTtcbn1cblxudmFyIGV4dGVuc2lvbiA9IGZ1bmN0aW9uIGV4dGVuc2lvbigpIHtcbiAgLy8gZS5nLiBleHRlbnNpb24oJ3JlbmRlcmVyJywgJ3N2ZycpXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9IC8vIGUuZy4gZXh0ZW5zaW9uKCdyZW5kZXJlcicsICdzdmcnLCB7IC4uLiB9KVxuICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgcmV0dXJuIHNldEV4dGVuc2lvbi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9IC8vIGUuZy4gZXh0ZW5zaW9uKCdyZW5kZXJlcicsICdzdmcnLCAnbm9kZVNoYXBlJywgJ2VsbGlwc2UnKVxuICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0KSB7XG4gICAgcmV0dXJuIGdldE1vZHVsZS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9IC8vIGUuZy4gZXh0ZW5zaW9uKCdyZW5kZXJlcicsICdzdmcnLCAnbm9kZVNoYXBlJywgJ2VsbGlwc2UnLCB7IC4uLiB9KVxuICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA1KSB7XG4gICAgcmV0dXJuIHNldE1vZHVsZS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9IGVsc2Uge1xuICAgIGVycm9yKCdJbnZhbGlkIGV4dGVuc2lvbiBhY2Nlc3Mgc3ludGF4Jyk7XG4gIH1cbn07IC8vIGFsbG93cyBhIGNvcmUgaW5zdGFuY2UgdG8gYWNjZXNzIGV4dGVuc2lvbnMgaW50ZXJuYWxseVxuXG5cbkNvcmUucHJvdG90eXBlLmV4dGVuc2lvbiA9IGV4dGVuc2lvbjsgLy8gaW5jbHVkZWQgZXh0ZW5zaW9uc1xuXG5pbmNFeHRzLmZvckVhY2goZnVuY3Rpb24gKGdyb3VwKSB7XG4gIGdyb3VwLmV4dGVuc2lvbnMuZm9yRWFjaChmdW5jdGlvbiAoZXh0KSB7XG4gICAgc2V0RXh0ZW5zaW9uKGdyb3VwLnR5cGUsIGV4dC5uYW1lLCBleHQuaW1wbCk7XG4gIH0pO1xufSk7XG5cbi8vICh1c2VmdWwgZm9yIGluaXQpXG5cbnZhciBTdHlsZXNoZWV0ID0gZnVuY3Rpb24gU3R5bGVzaGVldCgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFN0eWxlc2hlZXQpKSB7XG4gICAgcmV0dXJuIG5ldyBTdHlsZXNoZWV0KCk7XG4gIH1cblxuICB0aGlzLmxlbmd0aCA9IDA7XG59O1xuXG52YXIgc2hlZXRmbiA9IFN0eWxlc2hlZXQucHJvdG90eXBlO1xuXG5zaGVldGZuLmluc3RhbmNlU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ3N0eWxlc2hlZXQnO1xufTsgLy8ganVzdCBzdG9yZSB0aGUgc2VsZWN0b3IgdG8gYmUgcGFyc2VkIGxhdGVyXG5cblxuc2hlZXRmbi5zZWxlY3RvciA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICB2YXIgaSA9IHRoaXMubGVuZ3RoKys7XG4gIHRoaXNbaV0gPSB7XG4gICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgIHByb3BlcnRpZXM6IFtdXG4gIH07XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTsgLy8ganVzdCBzdG9yZSB0aGUgcHJvcGVydHkgdG8gYmUgcGFyc2VkIGxhdGVyXG5cblxuc2hlZXRmbi5jc3MgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgdmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7XG5cbiAgaWYgKHN0cmluZyhuYW1lKSkge1xuICAgIHRoaXNbaV0ucHJvcGVydGllcy5wdXNoKHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWVcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChwbGFpbk9iamVjdChuYW1lKSkge1xuICAgIHZhciBtYXAgPSBuYW1lO1xuICAgIHZhciBwcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhtYXApO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wTmFtZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBrZXkgPSBwcm9wTmFtZXNbal07XG4gICAgICB2YXIgbWFwVmFsID0gbWFwW2tleV07XG5cbiAgICAgIGlmIChtYXBWYWwgPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHByb3AgPSBTdHlsZS5wcm9wZXJ0aWVzW2tleV0gfHwgU3R5bGUucHJvcGVydGllc1tkYXNoMmNhbWVsKGtleSldO1xuXG4gICAgICBpZiAocHJvcCA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgX25hbWUgPSBwcm9wLm5hbWU7XG4gICAgICB2YXIgX3ZhbHVlID0gbWFwVmFsO1xuICAgICAgdGhpc1tpXS5wcm9wZXJ0aWVzLnB1c2goe1xuICAgICAgICBuYW1lOiBfbmFtZSxcbiAgICAgICAgdmFsdWU6IF92YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG5zaGVldGZuLnN0eWxlID0gc2hlZXRmbi5jc3M7IC8vIGdlbmVyYXRlIGEgcmVhbCBzdHlsZSBvYmplY3QgZnJvbSB0aGUgZHVtbXkgc3R5bGVzaGVldFxuXG5zaGVldGZuLmdlbmVyYXRlU3R5bGUgPSBmdW5jdGlvbiAoY3kpIHtcbiAgdmFyIHN0eWxlID0gbmV3IFN0eWxlKGN5KTtcbiAgcmV0dXJuIHRoaXMuYXBwZW5kVG9TdHlsZShzdHlsZSk7XG59OyAvLyBhcHBlbmQgYSBkdW1teSBzdHlsZXNoZWV0IG9iamVjdCBvbiBhIHJlYWwgc3R5bGUgb2JqZWN0XG5cblxuc2hlZXRmbi5hcHBlbmRUb1N0eWxlID0gZnVuY3Rpb24gKHN0eWxlKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjb250ZXh0ID0gdGhpc1tpXTtcbiAgICB2YXIgc2VsZWN0b3IgPSBjb250ZXh0LnNlbGVjdG9yO1xuICAgIHZhciBwcm9wcyA9IGNvbnRleHQucHJvcGVydGllcztcbiAgICBzdHlsZS5zZWxlY3RvcihzZWxlY3Rvcik7IC8vIGFwcGx5IHNlbGVjdG9yXG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHByb3BzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgcHJvcCA9IHByb3BzW2pdO1xuICAgICAgc3R5bGUuY3NzKHByb3AubmFtZSwgcHJvcC52YWx1ZSk7IC8vIGFwcGx5IHByb3BlcnR5XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0eWxlO1xufTtcblxudmFyIHZlcnNpb24gPSBcIjMuMjUuMFwiO1xuXG52YXIgY3l0b3NjYXBlID0gZnVuY3Rpb24gY3l0b3NjYXBlKG9wdGlvbnMpIHtcbiAgLy8gaWYgbm8gb3B0aW9ucyBzcGVjaWZpZWQsIHVzZSBkZWZhdWx0XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH0gLy8gY3JlYXRlIGluc3RhbmNlXG5cblxuICBpZiAocGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICByZXR1cm4gbmV3IENvcmUob3B0aW9ucyk7XG4gIH0gLy8gYWxsb3cgZm9yIHJlZ2lzdHJhdGlvbiBvZiBleHRlbnNpb25zXG4gIGVsc2UgaWYgKHN0cmluZyhvcHRpb25zKSkge1xuICAgIHJldHVybiBleHRlbnNpb24uYXBwbHkoZXh0ZW5zaW9uLCBhcmd1bWVudHMpO1xuICB9XG59OyAvLyBlLmcuIGN5dG9zY2FwZS51c2UoIHJlcXVpcmUoJ2N5dG9zY2FwZS1mb28nKSwgYmFyIClcblxuXG5jeXRvc2NhcGUudXNlID0gZnVuY3Rpb24gKGV4dCkge1xuICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7IC8vIGFyZ3MgdG8gcGFzcyB0byBleHRcblxuICBhcmdzLnVuc2hpZnQoY3l0b3NjYXBlKTsgLy8gY3l0b3NjYXBlIGlzIGZpcnN0IGFyZyB0byBleHRcblxuICBleHQuYXBwbHkobnVsbCwgYXJncyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuY3l0b3NjYXBlLndhcm5pbmdzID0gZnVuY3Rpb24gKGJvb2wpIHtcbiAgcmV0dXJuIHdhcm5pbmdzKGJvb2wpO1xufTsgLy8gcmVwbGFjZWQgYnkgYnVpbGQgc3lzdGVtXG5cblxuY3l0b3NjYXBlLnZlcnNpb24gPSB2ZXJzaW9uOyAvLyBleHBvc2UgcHVibGljIGFwaXMgKG1vc3RseSBmb3IgZXh0ZW5zaW9ucylcblxuY3l0b3NjYXBlLnN0eWxlc2hlZXQgPSBjeXRvc2NhcGUuU3R5bGVzaGVldCA9IFN0eWxlc2hlZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gY3l0b3NjYXBlO1xuIiwiLypcbkNvcHlyaWdodCAoYykgMjAxMi0yMDE0IENocmlzIFBldHRpdHRcblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuVEhFIFNPRlRXQVJFLlxuKi9cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdyYXBobGliOiByZXF1aXJlKFwiLi9saWIvZ3JhcGhsaWJcIiksXG5cbiAgbGF5b3V0OiByZXF1aXJlKFwiLi9saWIvbGF5b3V0XCIpLFxuICBkZWJ1ZzogcmVxdWlyZShcIi4vbGliL2RlYnVnXCIpLFxuICB1dGlsOiB7XG4gICAgdGltZTogcmVxdWlyZShcIi4vbGliL3V0aWxcIikudGltZSxcbiAgICBub3RpbWU6IHJlcXVpcmUoXCIuL2xpYi91dGlsXCIpLm5vdGltZVxuICB9LFxuICB2ZXJzaW9uOiByZXF1aXJlKFwiLi9saWIvdmVyc2lvblwiKVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBncmVlZHlGQVMgPSByZXF1aXJlKFwiLi9ncmVlZHktZmFzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcnVuOiBydW4sXG4gIHVuZG86IHVuZG9cbn07XG5cbmZ1bmN0aW9uIHJ1bihnKSB7XG4gIHZhciBmYXMgPSAoZy5ncmFwaCgpLmFjeWNsaWNlciA9PT0gXCJncmVlZHlcIlxuICAgID8gZ3JlZWR5RkFTKGcsIHdlaWdodEZuKGcpKVxuICAgIDogZGZzRkFTKGcpKTtcbiAgXy5mb3JFYWNoKGZhcywgZnVuY3Rpb24oZSkge1xuICAgIHZhciBsYWJlbCA9IGcuZWRnZShlKTtcbiAgICBnLnJlbW92ZUVkZ2UoZSk7XG4gICAgbGFiZWwuZm9yd2FyZE5hbWUgPSBlLm5hbWU7XG4gICAgbGFiZWwucmV2ZXJzZWQgPSB0cnVlO1xuICAgIGcuc2V0RWRnZShlLncsIGUudiwgbGFiZWwsIF8udW5pcXVlSWQoXCJyZXZcIikpO1xuICB9KTtcblxuICBmdW5jdGlvbiB3ZWlnaHRGbihnKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiBnLmVkZ2UoZSkud2VpZ2h0O1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZGZzRkFTKGcpIHtcbiAgdmFyIGZhcyA9IFtdO1xuICB2YXIgc3RhY2sgPSB7fTtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIGlmIChfLmhhcyh2aXNpdGVkLCB2KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgICBzdGFja1t2XSA9IHRydWU7XG4gICAgXy5mb3JFYWNoKGcub3V0RWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGlmIChfLmhhcyhzdGFjaywgZS53KSkge1xuICAgICAgICBmYXMucHVzaChlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRmcyhlLncpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGRlbGV0ZSBzdGFja1t2XTtcbiAgfVxuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGRmcyk7XG4gIHJldHVybiBmYXM7XG59XG5cbmZ1bmN0aW9uIHVuZG8oZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGxhYmVsID0gZy5lZGdlKGUpO1xuICAgIGlmIChsYWJlbC5yZXZlcnNlZCkge1xuICAgICAgZy5yZW1vdmVFZGdlKGUpO1xuXG4gICAgICB2YXIgZm9yd2FyZE5hbWUgPSBsYWJlbC5mb3J3YXJkTmFtZTtcbiAgICAgIGRlbGV0ZSBsYWJlbC5yZXZlcnNlZDtcbiAgICAgIGRlbGV0ZSBsYWJlbC5mb3J3YXJkTmFtZTtcbiAgICAgIGcuc2V0RWRnZShlLncsIGUudiwgbGFiZWwsIGZvcndhcmROYW1lKTtcbiAgICB9XG4gIH0pO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gYWRkQm9yZGVyU2VnbWVudHM7XG5cbmZ1bmN0aW9uIGFkZEJvcmRlclNlZ21lbnRzKGcpIHtcbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBnLmNoaWxkcmVuKHYpO1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIF8uZm9yRWFjaChjaGlsZHJlbiwgZGZzKTtcbiAgICB9XG5cbiAgICBpZiAoXy5oYXMobm9kZSwgXCJtaW5SYW5rXCIpKSB7XG4gICAgICBub2RlLmJvcmRlckxlZnQgPSBbXTtcbiAgICAgIG5vZGUuYm9yZGVyUmlnaHQgPSBbXTtcbiAgICAgIGZvciAodmFyIHJhbmsgPSBub2RlLm1pblJhbmssIG1heFJhbmsgPSBub2RlLm1heFJhbmsgKyAxO1xuICAgICAgICByYW5rIDwgbWF4UmFuaztcbiAgICAgICAgKytyYW5rKSB7XG4gICAgICAgIGFkZEJvcmRlck5vZGUoZywgXCJib3JkZXJMZWZ0XCIsIFwiX2JsXCIsIHYsIG5vZGUsIHJhbmspO1xuICAgICAgICBhZGRCb3JkZXJOb2RlKGcsIFwiYm9yZGVyUmlnaHRcIiwgXCJfYnJcIiwgdiwgbm9kZSwgcmFuayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgXy5mb3JFYWNoKGcuY2hpbGRyZW4oKSwgZGZzKTtcbn1cblxuZnVuY3Rpb24gYWRkQm9yZGVyTm9kZShnLCBwcm9wLCBwcmVmaXgsIHNnLCBzZ05vZGUsIHJhbmspIHtcbiAgdmFyIGxhYmVsID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCByYW5rOiByYW5rLCBib3JkZXJUeXBlOiBwcm9wIH07XG4gIHZhciBwcmV2ID0gc2dOb2RlW3Byb3BdW3JhbmsgLSAxXTtcbiAgdmFyIGN1cnIgPSB1dGlsLmFkZER1bW15Tm9kZShnLCBcImJvcmRlclwiLCBsYWJlbCwgcHJlZml4KTtcbiAgc2dOb2RlW3Byb3BdW3JhbmtdID0gY3VycjtcbiAgZy5zZXRQYXJlbnQoY3Vyciwgc2cpO1xuICBpZiAocHJldikge1xuICAgIGcuc2V0RWRnZShwcmV2LCBjdXJyLCB7IHdlaWdodDogMSB9KTtcbiAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYWRqdXN0OiBhZGp1c3QsXG4gIHVuZG86IHVuZG9cbn07XG5cbmZ1bmN0aW9uIGFkanVzdChnKSB7XG4gIHZhciByYW5rRGlyID0gZy5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJhbmtEaXIgPT09IFwibHJcIiB8fCByYW5rRGlyID09PSBcInJsXCIpIHtcbiAgICBzd2FwV2lkdGhIZWlnaHQoZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5kbyhnKSB7XG4gIHZhciByYW5rRGlyID0gZy5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJhbmtEaXIgPT09IFwiYnRcIiB8fCByYW5rRGlyID09PSBcInJsXCIpIHtcbiAgICByZXZlcnNlWShnKTtcbiAgfVxuXG4gIGlmIChyYW5rRGlyID09PSBcImxyXCIgfHwgcmFua0RpciA9PT0gXCJybFwiKSB7XG4gICAgc3dhcFhZKGcpO1xuICAgIHN3YXBXaWR0aEhlaWdodChnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzd2FwV2lkdGhIZWlnaHQoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHN3YXBXaWR0aEhlaWdodE9uZShnLm5vZGUodikpOyB9KTtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkgeyBzd2FwV2lkdGhIZWlnaHRPbmUoZy5lZGdlKGUpKTsgfSk7XG59XG5cbmZ1bmN0aW9uIHN3YXBXaWR0aEhlaWdodE9uZShhdHRycykge1xuICB2YXIgdyA9IGF0dHJzLndpZHRoO1xuICBhdHRycy53aWR0aCA9IGF0dHJzLmhlaWdodDtcbiAgYXR0cnMuaGVpZ2h0ID0gdztcbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVkoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHJldmVyc2VZT25lKGcubm9kZSh2KSk7IH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBfLmZvckVhY2goZWRnZS5wb2ludHMsIHJldmVyc2VZT25lKTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ5XCIpKSB7XG4gICAgICByZXZlcnNlWU9uZShlZGdlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXZlcnNlWU9uZShhdHRycykge1xuICBhdHRycy55ID0gLWF0dHJzLnk7XG59XG5cbmZ1bmN0aW9uIHN3YXBYWShnKSB7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgc3dhcFhZT25lKGcubm9kZSh2KSk7IH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBfLmZvckVhY2goZWRnZS5wb2ludHMsIHN3YXBYWU9uZSk7XG4gICAgaWYgKF8uaGFzKGVkZ2UsIFwieFwiKSkge1xuICAgICAgc3dhcFhZT25lKGVkZ2UpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHN3YXBYWU9uZShhdHRycykge1xuICB2YXIgeCA9IGF0dHJzLng7XG4gIGF0dHJzLnggPSBhdHRycy55O1xuICBhdHRycy55ID0geDtcbn1cbiIsIi8qXG4gKiBTaW1wbGUgZG91Ymx5IGxpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uIGRlcml2ZWQgZnJvbSBDb3JtZW4sIGV0IGFsLixcbiAqIFwiSW50cm9kdWN0aW9uIHRvIEFsZ29yaXRobXNcIi5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpc3Q7XG5cbmZ1bmN0aW9uIExpc3QoKSB7XG4gIHZhciBzZW50aW5lbCA9IHt9O1xuICBzZW50aW5lbC5fbmV4dCA9IHNlbnRpbmVsLl9wcmV2ID0gc2VudGluZWw7XG4gIHRoaXMuX3NlbnRpbmVsID0gc2VudGluZWw7XG59XG5cbkxpc3QucHJvdG90eXBlLmRlcXVldWUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbnRpbmVsID0gdGhpcy5fc2VudGluZWw7XG4gIHZhciBlbnRyeSA9IHNlbnRpbmVsLl9wcmV2O1xuICBpZiAoZW50cnkgIT09IHNlbnRpbmVsKSB7XG4gICAgdW5saW5rKGVudHJ5KTtcbiAgICByZXR1cm4gZW50cnk7XG4gIH1cbn07XG5cbkxpc3QucHJvdG90eXBlLmVucXVldWUgPSBmdW5jdGlvbihlbnRyeSkge1xuICB2YXIgc2VudGluZWwgPSB0aGlzLl9zZW50aW5lbDtcbiAgaWYgKGVudHJ5Ll9wcmV2ICYmIGVudHJ5Ll9uZXh0KSB7XG4gICAgdW5saW5rKGVudHJ5KTtcbiAgfVxuICBlbnRyeS5fbmV4dCA9IHNlbnRpbmVsLl9uZXh0O1xuICBzZW50aW5lbC5fbmV4dC5fcHJldiA9IGVudHJ5O1xuICBzZW50aW5lbC5fbmV4dCA9IGVudHJ5O1xuICBlbnRyeS5fcHJldiA9IHNlbnRpbmVsO1xufTtcblxuTGlzdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN0cnMgPSBbXTtcbiAgdmFyIHNlbnRpbmVsID0gdGhpcy5fc2VudGluZWw7XG4gIHZhciBjdXJyID0gc2VudGluZWwuX3ByZXY7XG4gIHdoaWxlIChjdXJyICE9PSBzZW50aW5lbCkge1xuICAgIHN0cnMucHVzaChKU09OLnN0cmluZ2lmeShjdXJyLCBmaWx0ZXJPdXRMaW5rcykpO1xuICAgIGN1cnIgPSBjdXJyLl9wcmV2O1xuICB9XG4gIHJldHVybiBcIltcIiArIHN0cnMuam9pbihcIiwgXCIpICsgXCJdXCI7XG59O1xuXG5mdW5jdGlvbiB1bmxpbmsoZW50cnkpIHtcbiAgZW50cnkuX3ByZXYuX25leHQgPSBlbnRyeS5fbmV4dDtcbiAgZW50cnkuX25leHQuX3ByZXYgPSBlbnRyeS5fcHJldjtcbiAgZGVsZXRlIGVudHJ5Ll9uZXh0O1xuICBkZWxldGUgZW50cnkuX3ByZXY7XG59XG5cbmZ1bmN0aW9uIGZpbHRlck91dExpbmtzKGssIHYpIHtcbiAgaWYgKGsgIT09IFwiX25leHRcIiAmJiBrICE9PSBcIl9wcmV2XCIpIHtcbiAgICByZXR1cm4gdjtcbiAgfVxufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaGxpYlwiKS5HcmFwaDtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRlYnVnT3JkZXJpbmc6IGRlYnVnT3JkZXJpbmdcbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBkZWJ1Z09yZGVyaW5nKGcpIHtcbiAgdmFyIGxheWVyTWF0cml4ID0gdXRpbC5idWlsZExheWVyTWF0cml4KGcpO1xuXG4gIHZhciBoID0gbmV3IEdyYXBoKHsgY29tcG91bmQ6IHRydWUsIG11bHRpZ3JhcGg6IHRydWUgfSkuc2V0R3JhcGgoe30pO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBoLnNldE5vZGUodiwgeyBsYWJlbDogdiB9KTtcbiAgICBoLnNldFBhcmVudCh2LCBcImxheWVyXCIgKyBnLm5vZGUodikucmFuayk7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICBoLnNldEVkZ2UoZS52LCBlLncsIHt9LCBlLm5hbWUpO1xuICB9KTtcblxuICBfLmZvckVhY2gobGF5ZXJNYXRyaXgsIGZ1bmN0aW9uKGxheWVyLCBpKSB7XG4gICAgdmFyIGxheWVyViA9IFwibGF5ZXJcIiArIGk7XG4gICAgaC5zZXROb2RlKGxheWVyViwgeyByYW5rOiBcInNhbWVcIiB9KTtcbiAgICBfLnJlZHVjZShsYXllciwgZnVuY3Rpb24odSwgdikge1xuICAgICAgaC5zZXRFZGdlKHUsIHYsIHsgc3R5bGU6IFwiaW52aXNcIiB9KTtcbiAgICAgIHJldHVybiB2O1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gaDtcbn1cbiIsIi8qIGdsb2JhbCB3aW5kb3cgKi9cblxudmFyIGdyYXBobGliO1xuXG5pZiAodHlwZW9mIHJlcXVpcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICB0cnkge1xuICAgIGdyYXBobGliID0gcmVxdWlyZShcImdyYXBobGliXCIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gY29udGludWUgcmVnYXJkbGVzcyBvZiBlcnJvclxuICB9XG59XG5cbmlmICghZ3JhcGhsaWIpIHtcbiAgZ3JhcGhsaWIgPSB3aW5kb3cuZ3JhcGhsaWI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ3JhcGhsaWI7XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuL2dyYXBobGliXCIpLkdyYXBoO1xudmFyIExpc3QgPSByZXF1aXJlKFwiLi9kYXRhL2xpc3RcIik7XG5cbi8qXG4gKiBBIGdyZWVkeSBoZXVyaXN0aWMgZm9yIGZpbmRpbmcgYSBmZWVkYmFjayBhcmMgc2V0IGZvciBhIGdyYXBoLiBBIGZlZWRiYWNrXG4gKiBhcmMgc2V0IGlzIGEgc2V0IG9mIGVkZ2VzIHRoYXQgY2FuIGJlIHJlbW92ZWQgdG8gbWFrZSBhIGdyYXBoIGFjeWNsaWMuXG4gKiBUaGUgYWxnb3JpdGhtIGNvbWVzIGZyb206IFAuIEVhZGVzLCBYLiBMaW4sIGFuZCBXLiBGLiBTbXl0aCwgXCJBIGZhc3QgYW5kXG4gKiBlZmZlY3RpdmUgaGV1cmlzdGljIGZvciB0aGUgZmVlZGJhY2sgYXJjIHNldCBwcm9ibGVtLlwiIFRoaXMgaW1wbGVtZW50YXRpb25cbiAqIGFkanVzdHMgdGhhdCBmcm9tIHRoZSBwYXBlciB0byBhbGxvdyBmb3Igd2VpZ2h0ZWQgZWRnZXMuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZ3JlZWR5RkFTO1xuXG52YXIgREVGQVVMVF9XRUlHSFRfRk4gPSBfLmNvbnN0YW50KDEpO1xuXG5mdW5jdGlvbiBncmVlZHlGQVMoZywgd2VpZ2h0Rm4pIHtcbiAgaWYgKGcubm9kZUNvdW50KCkgPD0gMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgc3RhdGUgPSBidWlsZFN0YXRlKGcsIHdlaWdodEZuIHx8IERFRkFVTFRfV0VJR0hUX0ZOKTtcbiAgdmFyIHJlc3VsdHMgPSBkb0dyZWVkeUZBUyhzdGF0ZS5ncmFwaCwgc3RhdGUuYnVja2V0cywgc3RhdGUuemVyb0lkeCk7XG5cbiAgLy8gRXhwYW5kIG11bHRpLWVkZ2VzXG4gIHJldHVybiBfLmZsYXR0ZW4oXy5tYXAocmVzdWx0cywgZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiBnLm91dEVkZ2VzKGUudiwgZS53KTtcbiAgfSksIHRydWUpO1xufVxuXG5mdW5jdGlvbiBkb0dyZWVkeUZBUyhnLCBidWNrZXRzLCB6ZXJvSWR4KSB7XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciBzb3VyY2VzID0gYnVja2V0c1tidWNrZXRzLmxlbmd0aCAtIDFdO1xuICB2YXIgc2lua3MgPSBidWNrZXRzWzBdO1xuXG4gIHZhciBlbnRyeTtcbiAgd2hpbGUgKGcubm9kZUNvdW50KCkpIHtcbiAgICB3aGlsZSAoKGVudHJ5ID0gc2lua3MuZGVxdWV1ZSgpKSkgICB7IHJlbW92ZU5vZGUoZywgYnVja2V0cywgemVyb0lkeCwgZW50cnkpOyB9XG4gICAgd2hpbGUgKChlbnRyeSA9IHNvdXJjZXMuZGVxdWV1ZSgpKSkgeyByZW1vdmVOb2RlKGcsIGJ1Y2tldHMsIHplcm9JZHgsIGVudHJ5KTsgfVxuICAgIGlmIChnLm5vZGVDb3VudCgpKSB7XG4gICAgICBmb3IgKHZhciBpID0gYnVja2V0cy5sZW5ndGggLSAyOyBpID4gMDsgLS1pKSB7XG4gICAgICAgIGVudHJ5ID0gYnVja2V0c1tpXS5kZXF1ZXVlKCk7XG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChyZW1vdmVOb2RlKGcsIGJ1Y2tldHMsIHplcm9JZHgsIGVudHJ5LCB0cnVlKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZShnLCBidWNrZXRzLCB6ZXJvSWR4LCBlbnRyeSwgY29sbGVjdFByZWRlY2Vzc29ycykge1xuICB2YXIgcmVzdWx0cyA9IGNvbGxlY3RQcmVkZWNlc3NvcnMgPyBbXSA6IHVuZGVmaW5lZDtcblxuICBfLmZvckVhY2goZy5pbkVkZ2VzKGVudHJ5LnYpLCBmdW5jdGlvbihlZGdlKSB7XG4gICAgdmFyIHdlaWdodCA9IGcuZWRnZShlZGdlKTtcbiAgICB2YXIgdUVudHJ5ID0gZy5ub2RlKGVkZ2Uudik7XG5cbiAgICBpZiAoY29sbGVjdFByZWRlY2Vzc29ycykge1xuICAgICAgcmVzdWx0cy5wdXNoKHsgdjogZWRnZS52LCB3OiBlZGdlLncgfSk7XG4gICAgfVxuXG4gICAgdUVudHJ5Lm91dCAtPSB3ZWlnaHQ7XG4gICAgYXNzaWduQnVja2V0KGJ1Y2tldHMsIHplcm9JZHgsIHVFbnRyeSk7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChnLm91dEVkZ2VzKGVudHJ5LnYpLCBmdW5jdGlvbihlZGdlKSB7XG4gICAgdmFyIHdlaWdodCA9IGcuZWRnZShlZGdlKTtcbiAgICB2YXIgdyA9IGVkZ2UudztcbiAgICB2YXIgd0VudHJ5ID0gZy5ub2RlKHcpO1xuICAgIHdFbnRyeVtcImluXCJdIC09IHdlaWdodDtcbiAgICBhc3NpZ25CdWNrZXQoYnVja2V0cywgemVyb0lkeCwgd0VudHJ5KTtcbiAgfSk7XG5cbiAgZy5yZW1vdmVOb2RlKGVudHJ5LnYpO1xuXG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBidWlsZFN0YXRlKGcsIHdlaWdodEZuKSB7XG4gIHZhciBmYXNHcmFwaCA9IG5ldyBHcmFwaCgpO1xuICB2YXIgbWF4SW4gPSAwO1xuICB2YXIgbWF4T3V0ID0gMDtcblxuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgZmFzR3JhcGguc2V0Tm9kZSh2LCB7IHY6IHYsIFwiaW5cIjogMCwgb3V0OiAwIH0pO1xuICB9KTtcblxuICAvLyBBZ2dyZWdhdGUgd2VpZ2h0cyBvbiBub2RlcywgYnV0IGFsc28gc3VtIHRoZSB3ZWlnaHRzIGFjcm9zcyBtdWx0aS1lZGdlc1xuICAvLyBpbnRvIGEgc2luZ2xlIGVkZ2UgZm9yIHRoZSBmYXNHcmFwaC5cbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBwcmV2V2VpZ2h0ID0gZmFzR3JhcGguZWRnZShlLnYsIGUudykgfHwgMDtcbiAgICB2YXIgd2VpZ2h0ID0gd2VpZ2h0Rm4oZSk7XG4gICAgdmFyIGVkZ2VXZWlnaHQgPSBwcmV2V2VpZ2h0ICsgd2VpZ2h0O1xuICAgIGZhc0dyYXBoLnNldEVkZ2UoZS52LCBlLncsIGVkZ2VXZWlnaHQpO1xuICAgIG1heE91dCA9IE1hdGgubWF4KG1heE91dCwgZmFzR3JhcGgubm9kZShlLnYpLm91dCArPSB3ZWlnaHQpO1xuICAgIG1heEluICA9IE1hdGgubWF4KG1heEluLCAgZmFzR3JhcGgubm9kZShlLncpW1wiaW5cIl0gICs9IHdlaWdodCk7XG4gIH0pO1xuXG4gIHZhciBidWNrZXRzID0gXy5yYW5nZShtYXhPdXQgKyBtYXhJbiArIDMpLm1hcChmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBMaXN0KCk7IH0pO1xuICB2YXIgemVyb0lkeCA9IG1heEluICsgMTtcblxuICBfLmZvckVhY2goZmFzR3JhcGgubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIGFzc2lnbkJ1Y2tldChidWNrZXRzLCB6ZXJvSWR4LCBmYXNHcmFwaC5ub2RlKHYpKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgZ3JhcGg6IGZhc0dyYXBoLCBidWNrZXRzOiBidWNrZXRzLCB6ZXJvSWR4OiB6ZXJvSWR4IH07XG59XG5cbmZ1bmN0aW9uIGFzc2lnbkJ1Y2tldChidWNrZXRzLCB6ZXJvSWR4LCBlbnRyeSkge1xuICBpZiAoIWVudHJ5Lm91dCkge1xuICAgIGJ1Y2tldHNbMF0uZW5xdWV1ZShlbnRyeSk7XG4gIH0gZWxzZSBpZiAoIWVudHJ5W1wiaW5cIl0pIHtcbiAgICBidWNrZXRzW2J1Y2tldHMubGVuZ3RoIC0gMV0uZW5xdWV1ZShlbnRyeSk7XG4gIH0gZWxzZSB7XG4gICAgYnVja2V0c1tlbnRyeS5vdXQgLSBlbnRyeVtcImluXCJdICsgemVyb0lkeF0uZW5xdWV1ZShlbnRyeSk7XG4gIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBhY3ljbGljID0gcmVxdWlyZShcIi4vYWN5Y2xpY1wiKTtcbnZhciBub3JtYWxpemUgPSByZXF1aXJlKFwiLi9ub3JtYWxpemVcIik7XG52YXIgcmFuayA9IHJlcXVpcmUoXCIuL3JhbmtcIik7XG52YXIgbm9ybWFsaXplUmFua3MgPSByZXF1aXJlKFwiLi91dGlsXCIpLm5vcm1hbGl6ZVJhbmtzO1xudmFyIHBhcmVudER1bW15Q2hhaW5zID0gcmVxdWlyZShcIi4vcGFyZW50LWR1bW15LWNoYWluc1wiKTtcbnZhciByZW1vdmVFbXB0eVJhbmtzID0gcmVxdWlyZShcIi4vdXRpbFwiKS5yZW1vdmVFbXB0eVJhbmtzO1xudmFyIG5lc3RpbmdHcmFwaCA9IHJlcXVpcmUoXCIuL25lc3RpbmctZ3JhcGhcIik7XG52YXIgYWRkQm9yZGVyU2VnbWVudHMgPSByZXF1aXJlKFwiLi9hZGQtYm9yZGVyLXNlZ21lbnRzXCIpO1xudmFyIGNvb3JkaW5hdGVTeXN0ZW0gPSByZXF1aXJlKFwiLi9jb29yZGluYXRlLXN5c3RlbVwiKTtcbnZhciBvcmRlciA9IHJlcXVpcmUoXCIuL29yZGVyXCIpO1xudmFyIHBvc2l0aW9uID0gcmVxdWlyZShcIi4vcG9zaXRpb25cIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaGxpYlwiKS5HcmFwaDtcblxubW9kdWxlLmV4cG9ydHMgPSBsYXlvdXQ7XG5cbmZ1bmN0aW9uIGxheW91dChnLCBvcHRzKSB7XG4gIHZhciB0aW1lID0gb3B0cyAmJiBvcHRzLmRlYnVnVGltaW5nID8gdXRpbC50aW1lIDogdXRpbC5ub3RpbWU7XG4gIHRpbWUoXCJsYXlvdXRcIiwgZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxheW91dEdyYXBoID0gXG4gICAgICB0aW1lKFwiICBidWlsZExheW91dEdyYXBoXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gYnVpbGRMYXlvdXRHcmFwaChnKTsgfSk7XG4gICAgdGltZShcIiAgcnVuTGF5b3V0XCIsICAgICAgICBmdW5jdGlvbigpIHsgcnVuTGF5b3V0KGxheW91dEdyYXBoLCB0aW1lKTsgfSk7XG4gICAgdGltZShcIiAgdXBkYXRlSW5wdXRHcmFwaFwiLCBmdW5jdGlvbigpIHsgdXBkYXRlSW5wdXRHcmFwaChnLCBsYXlvdXRHcmFwaCk7IH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuTGF5b3V0KGcsIHRpbWUpIHtcbiAgdGltZShcIiAgICBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzXCIsIGZ1bmN0aW9uKCkgeyBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzKGcpOyB9KTtcbiAgdGltZShcIiAgICByZW1vdmVTZWxmRWRnZXNcIiwgICAgICAgIGZ1bmN0aW9uKCkgeyByZW1vdmVTZWxmRWRnZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFjeWNsaWNcIiwgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IGFjeWNsaWMucnVuKGcpOyB9KTtcbiAgdGltZShcIiAgICBuZXN0aW5nR3JhcGgucnVuXCIsICAgICAgIGZ1bmN0aW9uKCkgeyBuZXN0aW5nR3JhcGgucnVuKGcpOyB9KTtcbiAgdGltZShcIiAgICByYW5rXCIsICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByYW5rKHV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpKTsgfSk7XG4gIHRpbWUoXCIgICAgaW5qZWN0RWRnZUxhYmVsUHJveGllc1wiLCBmdW5jdGlvbigpIHsgaW5qZWN0RWRnZUxhYmVsUHJveGllcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgcmVtb3ZlRW1wdHlSYW5rc1wiLCAgICAgICBmdW5jdGlvbigpIHsgcmVtb3ZlRW1wdHlSYW5rcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgbmVzdGluZ0dyYXBoLmNsZWFudXBcIiwgICBmdW5jdGlvbigpIHsgbmVzdGluZ0dyYXBoLmNsZWFudXAoZyk7IH0pO1xuICB0aW1lKFwiICAgIG5vcm1hbGl6ZVJhbmtzXCIsICAgICAgICAgZnVuY3Rpb24oKSB7IG5vcm1hbGl6ZVJhbmtzKGcpOyB9KTtcbiAgdGltZShcIiAgICBhc3NpZ25SYW5rTWluTWF4XCIsICAgICAgIGZ1bmN0aW9uKCkgeyBhc3NpZ25SYW5rTWluTWF4KGcpOyB9KTtcbiAgdGltZShcIiAgICByZW1vdmVFZGdlTGFiZWxQcm94aWVzXCIsIGZ1bmN0aW9uKCkgeyByZW1vdmVFZGdlTGFiZWxQcm94aWVzKGcpOyB9KTtcbiAgdGltZShcIiAgICBub3JtYWxpemUucnVuXCIsICAgICAgICAgIGZ1bmN0aW9uKCkgeyBub3JtYWxpemUucnVuKGcpOyB9KTtcbiAgdGltZShcIiAgICBwYXJlbnREdW1teUNoYWluc1wiLCAgICAgIGZ1bmN0aW9uKCkgeyBwYXJlbnREdW1teUNoYWlucyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgYWRkQm9yZGVyU2VnbWVudHNcIiwgICAgICBmdW5jdGlvbigpIHsgYWRkQm9yZGVyU2VnbWVudHMoZyk7IH0pO1xuICB0aW1lKFwiICAgIG9yZGVyXCIsICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IG9yZGVyKGcpOyB9KTtcbiAgdGltZShcIiAgICBpbnNlcnRTZWxmRWRnZXNcIiwgICAgICAgIGZ1bmN0aW9uKCkgeyBpbnNlcnRTZWxmRWRnZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFkanVzdENvb3JkaW5hdGVTeXN0ZW1cIiwgZnVuY3Rpb24oKSB7IGNvb3JkaW5hdGVTeXN0ZW0uYWRqdXN0KGcpOyB9KTtcbiAgdGltZShcIiAgICBwb3NpdGlvblwiLCAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyBwb3NpdGlvbihnKTsgfSk7XG4gIHRpbWUoXCIgICAgcG9zaXRpb25TZWxmRWRnZXNcIiwgICAgICBmdW5jdGlvbigpIHsgcG9zaXRpb25TZWxmRWRnZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIHJlbW92ZUJvcmRlck5vZGVzXCIsICAgICAgZnVuY3Rpb24oKSB7IHJlbW92ZUJvcmRlck5vZGVzKGcpOyB9KTtcbiAgdGltZShcIiAgICBub3JtYWxpemUudW5kb1wiLCAgICAgICAgIGZ1bmN0aW9uKCkgeyBub3JtYWxpemUudW5kbyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgZml4dXBFZGdlTGFiZWxDb29yZHNcIiwgICBmdW5jdGlvbigpIHsgZml4dXBFZGdlTGFiZWxDb29yZHMoZyk7IH0pO1xuICB0aW1lKFwiICAgIHVuZG9Db29yZGluYXRlU3lzdGVtXCIsICAgZnVuY3Rpb24oKSB7IGNvb3JkaW5hdGVTeXN0ZW0udW5kbyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgdHJhbnNsYXRlR3JhcGhcIiwgICAgICAgICBmdW5jdGlvbigpIHsgdHJhbnNsYXRlR3JhcGgoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFzc2lnbk5vZGVJbnRlcnNlY3RzXCIsICAgZnVuY3Rpb24oKSB7IGFzc2lnbk5vZGVJbnRlcnNlY3RzKGcpOyB9KTtcbiAgdGltZShcIiAgICByZXZlcnNlUG9pbnRzXCIsICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXZlcnNlUG9pbnRzRm9yUmV2ZXJzZWRFZGdlcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgYWN5Y2xpYy51bmRvXCIsICAgICAgICAgICBmdW5jdGlvbigpIHsgYWN5Y2xpYy51bmRvKGcpOyB9KTtcbn1cblxuLypcbiAqIENvcGllcyBmaW5hbCBsYXlvdXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGF5b3V0IGdyYXBoIGJhY2sgdG8gdGhlIGlucHV0XG4gKiBncmFwaC4gVGhpcyBwcm9jZXNzIG9ubHkgY29waWVzIHdoaXRlbGlzdGVkIGF0dHJpYnV0ZXMgZnJvbSB0aGUgbGF5b3V0IGdyYXBoXG4gKiB0byB0aGUgaW5wdXQgZ3JhcGgsIHNvIGl0IHNlcnZlcyBhcyBhIGdvb2QgcGxhY2UgdG8gZGV0ZXJtaW5lIHdoYXRcbiAqIGF0dHJpYnV0ZXMgY2FuIGluZmx1ZW5jZSBsYXlvdXQuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUlucHV0R3JhcGgoaW5wdXRHcmFwaCwgbGF5b3V0R3JhcGgpIHtcbiAgXy5mb3JFYWNoKGlucHV0R3JhcGgubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBpbnB1dExhYmVsID0gaW5wdXRHcmFwaC5ub2RlKHYpO1xuICAgIHZhciBsYXlvdXRMYWJlbCA9IGxheW91dEdyYXBoLm5vZGUodik7XG5cbiAgICBpZiAoaW5wdXRMYWJlbCkge1xuICAgICAgaW5wdXRMYWJlbC54ID0gbGF5b3V0TGFiZWwueDtcbiAgICAgIGlucHV0TGFiZWwueSA9IGxheW91dExhYmVsLnk7XG5cbiAgICAgIGlmIChsYXlvdXRHcmFwaC5jaGlsZHJlbih2KS5sZW5ndGgpIHtcbiAgICAgICAgaW5wdXRMYWJlbC53aWR0aCA9IGxheW91dExhYmVsLndpZHRoO1xuICAgICAgICBpbnB1dExhYmVsLmhlaWdodCA9IGxheW91dExhYmVsLmhlaWdodDtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChpbnB1dEdyYXBoLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgaW5wdXRMYWJlbCA9IGlucHV0R3JhcGguZWRnZShlKTtcbiAgICB2YXIgbGF5b3V0TGFiZWwgPSBsYXlvdXRHcmFwaC5lZGdlKGUpO1xuXG4gICAgaW5wdXRMYWJlbC5wb2ludHMgPSBsYXlvdXRMYWJlbC5wb2ludHM7XG4gICAgaWYgKF8uaGFzKGxheW91dExhYmVsLCBcInhcIikpIHtcbiAgICAgIGlucHV0TGFiZWwueCA9IGxheW91dExhYmVsLng7XG4gICAgICBpbnB1dExhYmVsLnkgPSBsYXlvdXRMYWJlbC55O1xuICAgIH1cbiAgfSk7XG5cbiAgaW5wdXRHcmFwaC5ncmFwaCgpLndpZHRoID0gbGF5b3V0R3JhcGguZ3JhcGgoKS53aWR0aDtcbiAgaW5wdXRHcmFwaC5ncmFwaCgpLmhlaWdodCA9IGxheW91dEdyYXBoLmdyYXBoKCkuaGVpZ2h0O1xufVxuXG52YXIgZ3JhcGhOdW1BdHRycyA9IFtcIm5vZGVzZXBcIiwgXCJlZGdlc2VwXCIsIFwicmFua3NlcFwiLCBcIm1hcmdpbnhcIiwgXCJtYXJnaW55XCJdO1xudmFyIGdyYXBoRGVmYXVsdHMgPSB7IHJhbmtzZXA6IDUwLCBlZGdlc2VwOiAyMCwgbm9kZXNlcDogNTAsIHJhbmtkaXI6IFwidGJcIiB9O1xudmFyIGdyYXBoQXR0cnMgPSBbXCJhY3ljbGljZXJcIiwgXCJyYW5rZXJcIiwgXCJyYW5rZGlyXCIsIFwiYWxpZ25cIl07XG52YXIgbm9kZU51bUF0dHJzID0gW1wid2lkdGhcIiwgXCJoZWlnaHRcIl07XG52YXIgbm9kZURlZmF1bHRzID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG52YXIgZWRnZU51bUF0dHJzID0gW1wibWlubGVuXCIsIFwid2VpZ2h0XCIsIFwid2lkdGhcIiwgXCJoZWlnaHRcIiwgXCJsYWJlbG9mZnNldFwiXTtcbnZhciBlZGdlRGVmYXVsdHMgPSB7XG4gIG1pbmxlbjogMSwgd2VpZ2h0OiAxLCB3aWR0aDogMCwgaGVpZ2h0OiAwLFxuICBsYWJlbG9mZnNldDogMTAsIGxhYmVscG9zOiBcInJcIlxufTtcbnZhciBlZGdlQXR0cnMgPSBbXCJsYWJlbHBvc1wiXTtcblxuLypcbiAqIENvbnN0cnVjdHMgYSBuZXcgZ3JhcGggZnJvbSB0aGUgaW5wdXQgZ3JhcGgsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBsYXlvdXQuXG4gKiBUaGlzIHByb2Nlc3MgY29waWVzIG9ubHkgd2hpdGVsaXN0ZWQgYXR0cmlidXRlcyBmcm9tIHRoZSBpbnB1dCBncmFwaCB0byB0aGVcbiAqIGxheW91dCBncmFwaC4gVGh1cyB0aGlzIGZ1bmN0aW9uIHNlcnZlcyBhcyBhIGdvb2QgcGxhY2UgdG8gZGV0ZXJtaW5lIHdoYXRcbiAqIGF0dHJpYnV0ZXMgY2FuIGluZmx1ZW5jZSBsYXlvdXQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkTGF5b3V0R3JhcGgoaW5wdXRHcmFwaCkge1xuICB2YXIgZyA9IG5ldyBHcmFwaCh7IG11bHRpZ3JhcGg6IHRydWUsIGNvbXBvdW5kOiB0cnVlIH0pO1xuICB2YXIgZ3JhcGggPSBjYW5vbmljYWxpemUoaW5wdXRHcmFwaC5ncmFwaCgpKTtcblxuICBnLnNldEdyYXBoKF8ubWVyZ2Uoe30sXG4gICAgZ3JhcGhEZWZhdWx0cyxcbiAgICBzZWxlY3ROdW1iZXJBdHRycyhncmFwaCwgZ3JhcGhOdW1BdHRycyksXG4gICAgXy5waWNrKGdyYXBoLCBncmFwaEF0dHJzKSkpO1xuXG4gIF8uZm9yRWFjaChpbnB1dEdyYXBoLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLm5vZGUodikpO1xuICAgIGcuc2V0Tm9kZSh2LCBfLmRlZmF1bHRzKHNlbGVjdE51bWJlckF0dHJzKG5vZGUsIG5vZGVOdW1BdHRycyksIG5vZGVEZWZhdWx0cykpO1xuICAgIGcuc2V0UGFyZW50KHYsIGlucHV0R3JhcGgucGFyZW50KHYpKTtcbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGlucHV0R3JhcGguZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gY2Fub25pY2FsaXplKGlucHV0R3JhcGguZWRnZShlKSk7XG4gICAgZy5zZXRFZGdlKGUsIF8ubWVyZ2Uoe30sXG4gICAgICBlZGdlRGVmYXVsdHMsXG4gICAgICBzZWxlY3ROdW1iZXJBdHRycyhlZGdlLCBlZGdlTnVtQXR0cnMpLFxuICAgICAgXy5waWNrKGVkZ2UsIGVkZ2VBdHRycykpKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGc7XG59XG5cbi8qXG4gKiBUaGlzIGlkZWEgY29tZXMgZnJvbSB0aGUgR2Fuc25lciBwYXBlcjogdG8gYWNjb3VudCBmb3IgZWRnZSBsYWJlbHMgaW4gb3VyXG4gKiBsYXlvdXQgd2Ugc3BsaXQgZWFjaCByYW5rIGluIGhhbGYgYnkgZG91YmxpbmcgbWlubGVuIGFuZCBoYWx2aW5nIHJhbmtzZXAuXG4gKiBUaGVuIHdlIGNhbiBwbGFjZSBsYWJlbHMgYXQgdGhlc2UgbWlkLXBvaW50cyBiZXR3ZWVuIG5vZGVzLlxuICpcbiAqIFdlIGFsc28gYWRkIHNvbWUgbWluaW1hbCBwYWRkaW5nIHRvIHRoZSB3aWR0aCB0byBwdXNoIHRoZSBsYWJlbCBmb3IgdGhlIGVkZ2VcbiAqIGF3YXkgZnJvbSB0aGUgZWRnZSBpdHNlbGYgYSBiaXQuXG4gKi9cbmZ1bmN0aW9uIG1ha2VTcGFjZUZvckVkZ2VMYWJlbHMoZykge1xuICB2YXIgZ3JhcGggPSBnLmdyYXBoKCk7XG4gIGdyYXBoLnJhbmtzZXAgLz0gMjtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIGVkZ2UubWlubGVuICo9IDI7XG4gICAgaWYgKGVkZ2UubGFiZWxwb3MudG9Mb3dlckNhc2UoKSAhPT0gXCJjXCIpIHtcbiAgICAgIGlmIChncmFwaC5yYW5rZGlyID09PSBcIlRCXCIgfHwgZ3JhcGgucmFua2RpciA9PT0gXCJCVFwiKSB7XG4gICAgICAgIGVkZ2Uud2lkdGggKz0gZWRnZS5sYWJlbG9mZnNldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVkZ2UuaGVpZ2h0ICs9IGVkZ2UubGFiZWxvZmZzZXQ7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuLypcbiAqIENyZWF0ZXMgdGVtcG9yYXJ5IGR1bW15IG5vZGVzIHRoYXQgY2FwdHVyZSB0aGUgcmFuayBpbiB3aGljaCBlYWNoIGVkZ2Unc1xuICogbGFiZWwgaXMgZ29pbmcgdG8sIGlmIGl0IGhhcyBvbmUgb2Ygbm9uLXplcm8gd2lkdGggYW5kIGhlaWdodC4gV2UgZG8gdGhpc1xuICogc28gdGhhdCB3ZSBjYW4gc2FmZWx5IHJlbW92ZSBlbXB0eSByYW5rcyB3aGlsZSBwcmVzZXJ2aW5nIGJhbGFuY2UgZm9yIHRoZVxuICogbGFiZWwncyBwb3NpdGlvbi5cbiAqL1xuZnVuY3Rpb24gaW5qZWN0RWRnZUxhYmVsUHJveGllcyhnKSB7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBpZiAoZWRnZS53aWR0aCAmJiBlZGdlLmhlaWdodCkge1xuICAgICAgdmFyIHYgPSBnLm5vZGUoZS52KTtcbiAgICAgIHZhciB3ID0gZy5ub2RlKGUudyk7XG4gICAgICB2YXIgbGFiZWwgPSB7IHJhbms6ICh3LnJhbmsgLSB2LnJhbmspIC8gMiArIHYucmFuaywgZTogZSB9O1xuICAgICAgdXRpbC5hZGREdW1teU5vZGUoZywgXCJlZGdlLXByb3h5XCIsIGxhYmVsLCBcIl9lcFwiKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25SYW5rTWluTWF4KGcpIHtcbiAgdmFyIG1heFJhbmsgPSAwO1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKG5vZGUuYm9yZGVyVG9wKSB7XG4gICAgICBub2RlLm1pblJhbmsgPSBnLm5vZGUobm9kZS5ib3JkZXJUb3ApLnJhbms7XG4gICAgICBub2RlLm1heFJhbmsgPSBnLm5vZGUobm9kZS5ib3JkZXJCb3R0b20pLnJhbms7XG4gICAgICBtYXhSYW5rID0gXy5tYXgobWF4UmFuaywgbm9kZS5tYXhSYW5rKTtcbiAgICB9XG4gIH0pO1xuICBnLmdyYXBoKCkubWF4UmFuayA9IG1heFJhbms7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVkZ2VMYWJlbFByb3hpZXMoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKG5vZGUuZHVtbXkgPT09IFwiZWRnZS1wcm94eVwiKSB7XG4gICAgICBnLmVkZ2Uobm9kZS5lKS5sYWJlbFJhbmsgPSBub2RlLnJhbms7XG4gICAgICBnLnJlbW92ZU5vZGUodik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdHJhbnNsYXRlR3JhcGgoZykge1xuICB2YXIgbWluWCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgdmFyIG1heFggPSAwO1xuICB2YXIgbWluWSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgdmFyIG1heFkgPSAwO1xuICB2YXIgZ3JhcGhMYWJlbCA9IGcuZ3JhcGgoKTtcbiAgdmFyIG1hcmdpblggPSBncmFwaExhYmVsLm1hcmdpbnggfHwgMDtcbiAgdmFyIG1hcmdpblkgPSBncmFwaExhYmVsLm1hcmdpbnkgfHwgMDtcblxuICBmdW5jdGlvbiBnZXRFeHRyZW1lcyhhdHRycykge1xuICAgIHZhciB4ID0gYXR0cnMueDtcbiAgICB2YXIgeSA9IGF0dHJzLnk7XG4gICAgdmFyIHcgPSBhdHRycy53aWR0aDtcbiAgICB2YXIgaCA9IGF0dHJzLmhlaWdodDtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeCAtIHcgLyAyKTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgeCArIHcgLyAyKTtcbiAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgeSAtIGggLyAyKTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSArIGggLyAyKTtcbiAgfVxuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgZ2V0RXh0cmVtZXMoZy5ub2RlKHYpKTsgfSk7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ4XCIpKSB7XG4gICAgICBnZXRFeHRyZW1lcyhlZGdlKTtcbiAgICB9XG4gIH0pO1xuXG4gIG1pblggLT0gbWFyZ2luWDtcbiAgbWluWSAtPSBtYXJnaW5ZO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBub2RlLnggLT0gbWluWDtcbiAgICBub2RlLnkgLT0gbWluWTtcbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIF8uZm9yRWFjaChlZGdlLnBvaW50cywgZnVuY3Rpb24ocCkge1xuICAgICAgcC54IC09IG1pblg7XG4gICAgICBwLnkgLT0gbWluWTtcbiAgICB9KTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ4XCIpKSB7IGVkZ2UueCAtPSBtaW5YOyB9XG4gICAgaWYgKF8uaGFzKGVkZ2UsIFwieVwiKSkgeyBlZGdlLnkgLT0gbWluWTsgfVxuICB9KTtcblxuICBncmFwaExhYmVsLndpZHRoID0gbWF4WCAtIG1pblggKyBtYXJnaW5YO1xuICBncmFwaExhYmVsLmhlaWdodCA9IG1heFkgLSBtaW5ZICsgbWFyZ2luWTtcbn1cblxuZnVuY3Rpb24gYXNzaWduTm9kZUludGVyc2VjdHMoZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgdmFyIG5vZGVWID0gZy5ub2RlKGUudik7XG4gICAgdmFyIG5vZGVXID0gZy5ub2RlKGUudyk7XG4gICAgdmFyIHAxLCBwMjtcbiAgICBpZiAoIWVkZ2UucG9pbnRzKSB7XG4gICAgICBlZGdlLnBvaW50cyA9IFtdO1xuICAgICAgcDEgPSBub2RlVztcbiAgICAgIHAyID0gbm9kZVY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHAxID0gZWRnZS5wb2ludHNbMF07XG4gICAgICBwMiA9IGVkZ2UucG9pbnRzW2VkZ2UucG9pbnRzLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICBlZGdlLnBvaW50cy51bnNoaWZ0KHV0aWwuaW50ZXJzZWN0UmVjdChub2RlViwgcDEpKTtcbiAgICBlZGdlLnBvaW50cy5wdXNoKHV0aWwuaW50ZXJzZWN0UmVjdChub2RlVywgcDIpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGZpeHVwRWRnZUxhYmVsQ29vcmRzKGcpIHtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIGlmIChfLmhhcyhlZGdlLCBcInhcIikpIHtcbiAgICAgIGlmIChlZGdlLmxhYmVscG9zID09PSBcImxcIiB8fCBlZGdlLmxhYmVscG9zID09PSBcInJcIikge1xuICAgICAgICBlZGdlLndpZHRoIC09IGVkZ2UubGFiZWxvZmZzZXQ7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGVkZ2UubGFiZWxwb3MpIHtcbiAgICAgIGNhc2UgXCJsXCI6IGVkZ2UueCAtPSBlZGdlLndpZHRoIC8gMiArIGVkZ2UubGFiZWxvZmZzZXQ7IGJyZWFrO1xuICAgICAgY2FzZSBcInJcIjogZWRnZS54ICs9IGVkZ2Uud2lkdGggLyAyICsgZWRnZS5sYWJlbG9mZnNldDsgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVBvaW50c0ZvclJldmVyc2VkRWRnZXMoZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgaWYgKGVkZ2UucmV2ZXJzZWQpIHtcbiAgICAgIGVkZ2UucG9pbnRzLnJldmVyc2UoKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVCb3JkZXJOb2RlcyhnKSB7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoZy5jaGlsZHJlbih2KS5sZW5ndGgpIHtcbiAgICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgICAgdmFyIHQgPSBnLm5vZGUobm9kZS5ib3JkZXJUb3ApO1xuICAgICAgdmFyIGIgPSBnLm5vZGUobm9kZS5ib3JkZXJCb3R0b20pO1xuICAgICAgdmFyIGwgPSBnLm5vZGUoXy5sYXN0KG5vZGUuYm9yZGVyTGVmdCkpO1xuICAgICAgdmFyIHIgPSBnLm5vZGUoXy5sYXN0KG5vZGUuYm9yZGVyUmlnaHQpKTtcblxuICAgICAgbm9kZS53aWR0aCA9IE1hdGguYWJzKHIueCAtIGwueCk7XG4gICAgICBub2RlLmhlaWdodCA9IE1hdGguYWJzKGIueSAtIHQueSk7XG4gICAgICBub2RlLnggPSBsLnggKyBub2RlLndpZHRoIC8gMjtcbiAgICAgIG5vZGUueSA9IHQueSArIG5vZGUuaGVpZ2h0IC8gMjtcbiAgICB9XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoZy5ub2RlKHYpLmR1bW15ID09PSBcImJvcmRlclwiKSB7XG4gICAgICBnLnJlbW92ZU5vZGUodik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU2VsZkVkZ2VzKGcpIHtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIGlmIChlLnYgPT09IGUudykge1xuICAgICAgdmFyIG5vZGUgPSBnLm5vZGUoZS52KTtcbiAgICAgIGlmICghbm9kZS5zZWxmRWRnZXMpIHtcbiAgICAgICAgbm9kZS5zZWxmRWRnZXMgPSBbXTtcbiAgICAgIH1cbiAgICAgIG5vZGUuc2VsZkVkZ2VzLnB1c2goeyBlOiBlLCBsYWJlbDogZy5lZGdlKGUpIH0pO1xuICAgICAgZy5yZW1vdmVFZGdlKGUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGluc2VydFNlbGZFZGdlcyhnKSB7XG4gIHZhciBsYXllcnMgPSB1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7XG4gIF8uZm9yRWFjaChsYXllcnMsIGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgdmFyIG9yZGVyU2hpZnQgPSAwO1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odiwgaSkge1xuICAgICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgICBub2RlLm9yZGVyID0gaSArIG9yZGVyU2hpZnQ7XG4gICAgICBfLmZvckVhY2gobm9kZS5zZWxmRWRnZXMsIGZ1bmN0aW9uKHNlbGZFZGdlKSB7XG4gICAgICAgIHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwic2VsZmVkZ2VcIiwge1xuICAgICAgICAgIHdpZHRoOiBzZWxmRWRnZS5sYWJlbC53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHNlbGZFZGdlLmxhYmVsLmhlaWdodCxcbiAgICAgICAgICByYW5rOiBub2RlLnJhbmssXG4gICAgICAgICAgb3JkZXI6IGkgKyAoKytvcmRlclNoaWZ0KSxcbiAgICAgICAgICBlOiBzZWxmRWRnZS5lLFxuICAgICAgICAgIGxhYmVsOiBzZWxmRWRnZS5sYWJlbFxuICAgICAgICB9LCBcIl9zZVwiKTtcbiAgICAgIH0pO1xuICAgICAgZGVsZXRlIG5vZGUuc2VsZkVkZ2VzO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcG9zaXRpb25TZWxmRWRnZXMoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKG5vZGUuZHVtbXkgPT09IFwic2VsZmVkZ2VcIikge1xuICAgICAgdmFyIHNlbGZOb2RlID0gZy5ub2RlKG5vZGUuZS52KTtcbiAgICAgIHZhciB4ID0gc2VsZk5vZGUueCArIHNlbGZOb2RlLndpZHRoIC8gMjtcbiAgICAgIHZhciB5ID0gc2VsZk5vZGUueTtcbiAgICAgIHZhciBkeCA9IG5vZGUueCAtIHg7XG4gICAgICB2YXIgZHkgPSBzZWxmTm9kZS5oZWlnaHQgLyAyO1xuICAgICAgZy5zZXRFZGdlKG5vZGUuZSwgbm9kZS5sYWJlbCk7XG4gICAgICBnLnJlbW92ZU5vZGUodik7XG4gICAgICBub2RlLmxhYmVsLnBvaW50cyA9IFtcbiAgICAgICAgeyB4OiB4ICsgMiAqIGR4IC8gMywgeTogeSAtIGR5IH0sXG4gICAgICAgIHsgeDogeCArIDUgKiBkeCAvIDYsIHk6IHkgLSBkeSB9LFxuICAgICAgICB7IHg6IHggKyAgICAgZHggICAgLCB5OiB5IH0sXG4gICAgICAgIHsgeDogeCArIDUgKiBkeCAvIDYsIHk6IHkgKyBkeSB9LFxuICAgICAgICB7IHg6IHggKyAyICogZHggLyAzLCB5OiB5ICsgZHkgfVxuICAgICAgXTtcbiAgICAgIG5vZGUubGFiZWwueCA9IG5vZGUueDtcbiAgICAgIG5vZGUubGFiZWwueSA9IG5vZGUueTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZWxlY3ROdW1iZXJBdHRycyhvYmosIGF0dHJzKSB7XG4gIHJldHVybiBfLm1hcFZhbHVlcyhfLnBpY2sob2JqLCBhdHRycyksIE51bWJlcik7XG59XG5cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShhdHRycykge1xuICB2YXIgbmV3QXR0cnMgPSB7fTtcbiAgXy5mb3JFYWNoKGF0dHJzLCBmdW5jdGlvbih2LCBrKSB7XG4gICAgbmV3QXR0cnNbay50b0xvd2VyQ2FzZSgpXSA9IHY7XG4gIH0pO1xuICByZXR1cm4gbmV3QXR0cnM7XG59XG4iLCIvKiBnbG9iYWwgd2luZG93ICovXG5cbnZhciBsb2Rhc2g7XG5cbmlmICh0eXBlb2YgcmVxdWlyZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gIHRyeSB7XG4gICAgbG9kYXNoID0ge1xuICAgICAgY2xvbmVEZWVwOiByZXF1aXJlKFwibG9kYXNoL2Nsb25lRGVlcFwiKSxcbiAgICAgIGNvbnN0YW50OiByZXF1aXJlKFwibG9kYXNoL2NvbnN0YW50XCIpLFxuICAgICAgZGVmYXVsdHM6IHJlcXVpcmUoXCJsb2Rhc2gvZGVmYXVsdHNcIiksXG4gICAgICBlYWNoOiByZXF1aXJlKFwibG9kYXNoL2VhY2hcIiksXG4gICAgICBmaWx0ZXI6IHJlcXVpcmUoXCJsb2Rhc2gvZmlsdGVyXCIpLFxuICAgICAgZmluZDogcmVxdWlyZShcImxvZGFzaC9maW5kXCIpLFxuICAgICAgZmxhdHRlbjogcmVxdWlyZShcImxvZGFzaC9mbGF0dGVuXCIpLFxuICAgICAgZm9yRWFjaDogcmVxdWlyZShcImxvZGFzaC9mb3JFYWNoXCIpLFxuICAgICAgZm9ySW46IHJlcXVpcmUoXCJsb2Rhc2gvZm9ySW5cIiksXG4gICAgICBoYXM6ICByZXF1aXJlKFwibG9kYXNoL2hhc1wiKSxcbiAgICAgIGlzVW5kZWZpbmVkOiByZXF1aXJlKFwibG9kYXNoL2lzVW5kZWZpbmVkXCIpLFxuICAgICAgbGFzdDogcmVxdWlyZShcImxvZGFzaC9sYXN0XCIpLFxuICAgICAgbWFwOiByZXF1aXJlKFwibG9kYXNoL21hcFwiKSxcbiAgICAgIG1hcFZhbHVlczogcmVxdWlyZShcImxvZGFzaC9tYXBWYWx1ZXNcIiksXG4gICAgICBtYXg6IHJlcXVpcmUoXCJsb2Rhc2gvbWF4XCIpLFxuICAgICAgbWVyZ2U6IHJlcXVpcmUoXCJsb2Rhc2gvbWVyZ2VcIiksXG4gICAgICBtaW46IHJlcXVpcmUoXCJsb2Rhc2gvbWluXCIpLFxuICAgICAgbWluQnk6IHJlcXVpcmUoXCJsb2Rhc2gvbWluQnlcIiksXG4gICAgICBub3c6IHJlcXVpcmUoXCJsb2Rhc2gvbm93XCIpLFxuICAgICAgcGljazogcmVxdWlyZShcImxvZGFzaC9waWNrXCIpLFxuICAgICAgcmFuZ2U6IHJlcXVpcmUoXCJsb2Rhc2gvcmFuZ2VcIiksXG4gICAgICByZWR1Y2U6IHJlcXVpcmUoXCJsb2Rhc2gvcmVkdWNlXCIpLFxuICAgICAgc29ydEJ5OiByZXF1aXJlKFwibG9kYXNoL3NvcnRCeVwiKSxcbiAgICAgIHVuaXF1ZUlkOiByZXF1aXJlKFwibG9kYXNoL3VuaXF1ZUlkXCIpLFxuICAgICAgdmFsdWVzOiByZXF1aXJlKFwibG9kYXNoL3ZhbHVlc1wiKSxcbiAgICAgIHppcE9iamVjdDogcmVxdWlyZShcImxvZGFzaC96aXBPYmplY3RcIiksXG4gICAgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGNvbnRpbnVlIHJlZ2FyZGxlc3Mgb2YgZXJyb3JcbiAgfVxufVxuXG5pZiAoIWxvZGFzaCkge1xuICBsb2Rhc2ggPSB3aW5kb3cuXztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsb2Rhc2g7XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHJ1bjogcnVuLFxuICBjbGVhbnVwOiBjbGVhbnVwXG59O1xuXG4vKlxuICogQSBuZXN0aW5nIGdyYXBoIGNyZWF0ZXMgZHVtbXkgbm9kZXMgZm9yIHRoZSB0b3BzIGFuZCBib3R0b21zIG9mIHN1YmdyYXBocyxcbiAqIGFkZHMgYXBwcm9wcmlhdGUgZWRnZXMgdG8gZW5zdXJlIHRoYXQgYWxsIGNsdXN0ZXIgbm9kZXMgYXJlIHBsYWNlZCBiZXR3ZWVuXG4gKiB0aGVzZSBib3VuZHJpZXMsIGFuZCBlbnN1cmVzIHRoYXQgdGhlIGdyYXBoIGlzIGNvbm5lY3RlZC5cbiAqXG4gKiBJbiBhZGRpdGlvbiB3ZSBlbnN1cmUsIHRocm91Z2ggdGhlIHVzZSBvZiB0aGUgbWlubGVuIHByb3BlcnR5LCB0aGF0IG5vZGVzXG4gKiBhbmQgc3ViZ3JhcGggYm9yZGVyIG5vZGVzIHRvIG5vdCBlbmQgdXAgb24gdGhlIHNhbWUgcmFuay5cbiAqXG4gKiBQcmVjb25kaXRpb25zOlxuICpcbiAqICAgIDEuIElucHV0IGdyYXBoIGlzIGEgREFHXG4gKiAgICAyLiBOb2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGggaGFzIGEgbWlubGVuIGF0dHJpYnV0ZVxuICpcbiAqIFBvc3Rjb25kaXRpb25zOlxuICpcbiAqICAgIDEuIElucHV0IGdyYXBoIGlzIGNvbm5lY3RlZC5cbiAqICAgIDIuIER1bW15IG5vZGVzIGFyZSBhZGRlZCBmb3IgdGhlIHRvcHMgYW5kIGJvdHRvbXMgb2Ygc3ViZ3JhcGhzLlxuICogICAgMy4gVGhlIG1pbmxlbiBhdHRyaWJ1dGUgZm9yIG5vZGVzIGlzIGFkanVzdGVkIHRvIGVuc3VyZSBub2RlcyBkbyBub3RcbiAqICAgICAgIGdldCBwbGFjZWQgb24gdGhlIHNhbWUgcmFuayBhcyBzdWJncmFwaCBib3JkZXIgbm9kZXMuXG4gKlxuICogVGhlIG5lc3RpbmcgZ3JhcGggaWRlYSBjb21lcyBmcm9tIFNhbmRlciwgXCJMYXlvdXQgb2YgQ29tcG91bmQgRGlyZWN0ZWRcbiAqIEdyYXBocy5cIlxuICovXG5mdW5jdGlvbiBydW4oZykge1xuICB2YXIgcm9vdCA9IHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwicm9vdFwiLCB7fSwgXCJfcm9vdFwiKTtcbiAgdmFyIGRlcHRocyA9IHRyZWVEZXB0aHMoZyk7XG4gIHZhciBoZWlnaHQgPSBfLm1heChfLnZhbHVlcyhkZXB0aHMpKSAtIDE7IC8vIE5vdGU6IGRlcHRocyBpcyBhbiBPYmplY3Qgbm90IGFuIGFycmF5XG4gIHZhciBub2RlU2VwID0gMiAqIGhlaWdodCArIDE7XG5cbiAgZy5ncmFwaCgpLm5lc3RpbmdSb290ID0gcm9vdDtcblxuICAvLyBNdWx0aXBseSBtaW5sZW4gYnkgbm9kZVNlcCB0byBhbGlnbiBub2RlcyBvbiBub24tYm9yZGVyIHJhbmtzLlxuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7IGcuZWRnZShlKS5taW5sZW4gKj0gbm9kZVNlcDsgfSk7XG5cbiAgLy8gQ2FsY3VsYXRlIGEgd2VpZ2h0IHRoYXQgaXMgc3VmZmljaWVudCB0byBrZWVwIHN1YmdyYXBocyB2ZXJ0aWNhbGx5IGNvbXBhY3RcbiAgdmFyIHdlaWdodCA9IHN1bVdlaWdodHMoZykgKyAxO1xuXG4gIC8vIENyZWF0ZSBib3JkZXIgbm9kZXMgYW5kIGxpbmsgdGhlbSB1cFxuICBfLmZvckVhY2goZy5jaGlsZHJlbigpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgIGRmcyhnLCByb290LCBub2RlU2VwLCB3ZWlnaHQsIGhlaWdodCwgZGVwdGhzLCBjaGlsZCk7XG4gIH0pO1xuXG4gIC8vIFNhdmUgdGhlIG11bHRpcGxpZXIgZm9yIG5vZGUgbGF5ZXJzIGZvciBsYXRlciByZW1vdmFsIG9mIGVtcHR5IGJvcmRlclxuICAvLyBsYXllcnMuXG4gIGcuZ3JhcGgoKS5ub2RlUmFua0ZhY3RvciA9IG5vZGVTZXA7XG59XG5cbmZ1bmN0aW9uIGRmcyhnLCByb290LCBub2RlU2VwLCB3ZWlnaHQsIGhlaWdodCwgZGVwdGhzLCB2KSB7XG4gIHZhciBjaGlsZHJlbiA9IGcuY2hpbGRyZW4odik7XG4gIGlmICghY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgaWYgKHYgIT09IHJvb3QpIHtcbiAgICAgIGcuc2V0RWRnZShyb290LCB2LCB7IHdlaWdodDogMCwgbWlubGVuOiBub2RlU2VwIH0pO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgdG9wID0gdXRpbC5hZGRCb3JkZXJOb2RlKGcsIFwiX2J0XCIpO1xuICB2YXIgYm90dG9tID0gdXRpbC5hZGRCb3JkZXJOb2RlKGcsIFwiX2JiXCIpO1xuICB2YXIgbGFiZWwgPSBnLm5vZGUodik7XG5cbiAgZy5zZXRQYXJlbnQodG9wLCB2KTtcbiAgbGFiZWwuYm9yZGVyVG9wID0gdG9wO1xuICBnLnNldFBhcmVudChib3R0b20sIHYpO1xuICBsYWJlbC5ib3JkZXJCb3R0b20gPSBib3R0b207XG5cbiAgXy5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgIGRmcyhnLCByb290LCBub2RlU2VwLCB3ZWlnaHQsIGhlaWdodCwgZGVwdGhzLCBjaGlsZCk7XG5cbiAgICB2YXIgY2hpbGROb2RlID0gZy5ub2RlKGNoaWxkKTtcbiAgICB2YXIgY2hpbGRUb3AgPSBjaGlsZE5vZGUuYm9yZGVyVG9wID8gY2hpbGROb2RlLmJvcmRlclRvcCA6IGNoaWxkO1xuICAgIHZhciBjaGlsZEJvdHRvbSA9IGNoaWxkTm9kZS5ib3JkZXJCb3R0b20gPyBjaGlsZE5vZGUuYm9yZGVyQm90dG9tIDogY2hpbGQ7XG4gICAgdmFyIHRoaXNXZWlnaHQgPSBjaGlsZE5vZGUuYm9yZGVyVG9wID8gd2VpZ2h0IDogMiAqIHdlaWdodDtcbiAgICB2YXIgbWlubGVuID0gY2hpbGRUb3AgIT09IGNoaWxkQm90dG9tID8gMSA6IGhlaWdodCAtIGRlcHRoc1t2XSArIDE7XG5cbiAgICBnLnNldEVkZ2UodG9wLCBjaGlsZFRvcCwge1xuICAgICAgd2VpZ2h0OiB0aGlzV2VpZ2h0LFxuICAgICAgbWlubGVuOiBtaW5sZW4sXG4gICAgICBuZXN0aW5nRWRnZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgZy5zZXRFZGdlKGNoaWxkQm90dG9tLCBib3R0b20sIHtcbiAgICAgIHdlaWdodDogdGhpc1dlaWdodCxcbiAgICAgIG1pbmxlbjogbWlubGVuLFxuICAgICAgbmVzdGluZ0VkZ2U6IHRydWVcbiAgICB9KTtcbiAgfSk7XG5cbiAgaWYgKCFnLnBhcmVudCh2KSkge1xuICAgIGcuc2V0RWRnZShyb290LCB0b3AsIHsgd2VpZ2h0OiAwLCBtaW5sZW46IGhlaWdodCArIGRlcHRoc1t2XSB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmVlRGVwdGhzKGcpIHtcbiAgdmFyIGRlcHRocyA9IHt9O1xuICBmdW5jdGlvbiBkZnModiwgZGVwdGgpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBnLmNoaWxkcmVuKHYpO1xuICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIF8uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgZGZzKGNoaWxkLCBkZXB0aCArIDEpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGRlcHRoc1t2XSA9IGRlcHRoO1xuICB9XG4gIF8uZm9yRWFjaChnLmNoaWxkcmVuKCksIGZ1bmN0aW9uKHYpIHsgZGZzKHYsIDEpOyB9KTtcbiAgcmV0dXJuIGRlcHRocztcbn1cblxuZnVuY3Rpb24gc3VtV2VpZ2h0cyhnKSB7XG4gIHJldHVybiBfLnJlZHVjZShnLmVkZ2VzKCksIGZ1bmN0aW9uKGFjYywgZSkge1xuICAgIHJldHVybiBhY2MgKyBnLmVkZ2UoZSkud2VpZ2h0O1xuICB9LCAwKTtcbn1cblxuZnVuY3Rpb24gY2xlYW51cChnKSB7XG4gIHZhciBncmFwaExhYmVsID0gZy5ncmFwaCgpO1xuICBnLnJlbW92ZU5vZGUoZ3JhcGhMYWJlbC5uZXN0aW5nUm9vdCk7XG4gIGRlbGV0ZSBncmFwaExhYmVsLm5lc3RpbmdSb290O1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgaWYgKGVkZ2UubmVzdGluZ0VkZ2UpIHtcbiAgICAgIGcucmVtb3ZlRWRnZShlKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcnVuOiBydW4sXG4gIHVuZG86IHVuZG9cbn07XG5cbi8qXG4gKiBCcmVha3MgYW55IGxvbmcgZWRnZXMgaW4gdGhlIGdyYXBoIGludG8gc2hvcnQgc2VnbWVudHMgdGhhdCBzcGFuIDEgbGF5ZXJcbiAqIGVhY2guIFRoaXMgb3BlcmF0aW9uIGlzIHVuZG9hYmxlIHdpdGggdGhlIGRlbm9ybWFsaXplIGZ1bmN0aW9uLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIFRoZSBpbnB1dCBncmFwaCBpcyBhIERBRy5cbiAqICAgIDIuIEVhY2ggbm9kZSBpbiB0aGUgZ3JhcGggaGFzIGEgXCJyYW5rXCIgcHJvcGVydHkuXG4gKlxuICogUG9zdC1jb25kaXRpb246XG4gKlxuICogICAgMS4gQWxsIGVkZ2VzIGluIHRoZSBncmFwaCBoYXZlIGEgbGVuZ3RoIG9mIDEuXG4gKiAgICAyLiBEdW1teSBub2RlcyBhcmUgYWRkZWQgd2hlcmUgZWRnZXMgaGF2ZSBiZWVuIHNwbGl0IGludG8gc2VnbWVudHMuXG4gKiAgICAzLiBUaGUgZ3JhcGggaXMgYXVnbWVudGVkIHdpdGggYSBcImR1bW15Q2hhaW5zXCIgYXR0cmlidXRlIHdoaWNoIGNvbnRhaW5zXG4gKiAgICAgICB0aGUgZmlyc3QgZHVtbXkgaW4gZWFjaCBjaGFpbiBvZiBkdW1teSBub2RlcyBwcm9kdWNlZC5cbiAqL1xuZnVuY3Rpb24gcnVuKGcpIHtcbiAgZy5ncmFwaCgpLmR1bW15Q2hhaW5zID0gW107XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGVkZ2UpIHsgbm9ybWFsaXplRWRnZShnLCBlZGdlKTsgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVkZ2UoZywgZSkge1xuICB2YXIgdiA9IGUudjtcbiAgdmFyIHZSYW5rID0gZy5ub2RlKHYpLnJhbms7XG4gIHZhciB3ID0gZS53O1xuICB2YXIgd1JhbmsgPSBnLm5vZGUodykucmFuaztcbiAgdmFyIG5hbWUgPSBlLm5hbWU7XG4gIHZhciBlZGdlTGFiZWwgPSBnLmVkZ2UoZSk7XG4gIHZhciBsYWJlbFJhbmsgPSBlZGdlTGFiZWwubGFiZWxSYW5rO1xuXG4gIGlmICh3UmFuayA9PT0gdlJhbmsgKyAxKSByZXR1cm47XG5cbiAgZy5yZW1vdmVFZGdlKGUpO1xuXG4gIHZhciBkdW1teSwgYXR0cnMsIGk7XG4gIGZvciAoaSA9IDAsICsrdlJhbms7IHZSYW5rIDwgd1Jhbms7ICsraSwgKyt2UmFuaykge1xuICAgIGVkZ2VMYWJlbC5wb2ludHMgPSBbXTtcbiAgICBhdHRycyA9IHtcbiAgICAgIHdpZHRoOiAwLCBoZWlnaHQ6IDAsXG4gICAgICBlZGdlTGFiZWw6IGVkZ2VMYWJlbCwgZWRnZU9iajogZSxcbiAgICAgIHJhbms6IHZSYW5rXG4gICAgfTtcbiAgICBkdW1teSA9IHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwiZWRnZVwiLCBhdHRycywgXCJfZFwiKTtcbiAgICBpZiAodlJhbmsgPT09IGxhYmVsUmFuaykge1xuICAgICAgYXR0cnMud2lkdGggPSBlZGdlTGFiZWwud2lkdGg7XG4gICAgICBhdHRycy5oZWlnaHQgPSBlZGdlTGFiZWwuaGVpZ2h0O1xuICAgICAgYXR0cnMuZHVtbXkgPSBcImVkZ2UtbGFiZWxcIjtcbiAgICAgIGF0dHJzLmxhYmVscG9zID0gZWRnZUxhYmVsLmxhYmVscG9zO1xuICAgIH1cbiAgICBnLnNldEVkZ2UodiwgZHVtbXksIHsgd2VpZ2h0OiBlZGdlTGFiZWwud2VpZ2h0IH0sIG5hbWUpO1xuICAgIGlmIChpID09PSAwKSB7XG4gICAgICBnLmdyYXBoKCkuZHVtbXlDaGFpbnMucHVzaChkdW1teSk7XG4gICAgfVxuICAgIHYgPSBkdW1teTtcbiAgfVxuXG4gIGcuc2V0RWRnZSh2LCB3LCB7IHdlaWdodDogZWRnZUxhYmVsLndlaWdodCB9LCBuYW1lKTtcbn1cblxuZnVuY3Rpb24gdW5kbyhnKSB7XG4gIF8uZm9yRWFjaChnLmdyYXBoKCkuZHVtbXlDaGFpbnMsIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICB2YXIgb3JpZ0xhYmVsID0gbm9kZS5lZGdlTGFiZWw7XG4gICAgdmFyIHc7XG4gICAgZy5zZXRFZGdlKG5vZGUuZWRnZU9iaiwgb3JpZ0xhYmVsKTtcbiAgICB3aGlsZSAobm9kZS5kdW1teSkge1xuICAgICAgdyA9IGcuc3VjY2Vzc29ycyh2KVswXTtcbiAgICAgIGcucmVtb3ZlTm9kZSh2KTtcbiAgICAgIG9yaWdMYWJlbC5wb2ludHMucHVzaCh7IHg6IG5vZGUueCwgeTogbm9kZS55IH0pO1xuICAgICAgaWYgKG5vZGUuZHVtbXkgPT09IFwiZWRnZS1sYWJlbFwiKSB7XG4gICAgICAgIG9yaWdMYWJlbC54ID0gbm9kZS54O1xuICAgICAgICBvcmlnTGFiZWwueSA9IG5vZGUueTtcbiAgICAgICAgb3JpZ0xhYmVsLndpZHRoID0gbm9kZS53aWR0aDtcbiAgICAgICAgb3JpZ0xhYmVsLmhlaWdodCA9IG5vZGUuaGVpZ2h0O1xuICAgICAgfVxuICAgICAgdiA9IHc7XG4gICAgICBub2RlID0gZy5ub2RlKHYpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gYWRkU3ViZ3JhcGhDb25zdHJhaW50cztcblxuZnVuY3Rpb24gYWRkU3ViZ3JhcGhDb25zdHJhaW50cyhnLCBjZywgdnMpIHtcbiAgdmFyIHByZXYgPSB7fSxcbiAgICByb290UHJldjtcblxuICBfLmZvckVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgY2hpbGQgPSBnLnBhcmVudCh2KSxcbiAgICAgIHBhcmVudCxcbiAgICAgIHByZXZDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIHBhcmVudCA9IGcucGFyZW50KGNoaWxkKTtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgcHJldkNoaWxkID0gcHJldltwYXJlbnRdO1xuICAgICAgICBwcmV2W3BhcmVudF0gPSBjaGlsZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByZXZDaGlsZCA9IHJvb3RQcmV2O1xuICAgICAgICByb290UHJldiA9IGNoaWxkO1xuICAgICAgfVxuICAgICAgaWYgKHByZXZDaGlsZCAmJiBwcmV2Q2hpbGQgIT09IGNoaWxkKSB7XG4gICAgICAgIGNnLnNldEVkZ2UocHJldkNoaWxkLCBjaGlsZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNoaWxkID0gcGFyZW50O1xuICAgIH1cbiAgfSk7XG5cbiAgLypcbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB2ID8gZy5jaGlsZHJlbih2KSA6IGcuY2hpbGRyZW4oKTtcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICB2YXIgbWluID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgICAgICAgIHN1YmdyYXBocyA9IFtdO1xuICAgICAgXy5lYWNoKGNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICB2YXIgY2hpbGRNaW4gPSBkZnMoY2hpbGQpO1xuICAgICAgICBpZiAoZy5jaGlsZHJlbihjaGlsZCkubGVuZ3RoKSB7XG4gICAgICAgICAgc3ViZ3JhcGhzLnB1c2goeyB2OiBjaGlsZCwgb3JkZXI6IGNoaWxkTWluIH0pO1xuICAgICAgICB9XG4gICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgY2hpbGRNaW4pO1xuICAgICAgfSk7XG4gICAgICBfLnJlZHVjZShfLnNvcnRCeShzdWJncmFwaHMsIFwib3JkZXJcIiksIGZ1bmN0aW9uKHByZXYsIGN1cnIpIHtcbiAgICAgICAgY2cuc2V0RWRnZShwcmV2LnYsIGN1cnIudik7XG4gICAgICAgIHJldHVybiBjdXJyO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWluO1xuICAgIH1cbiAgICByZXR1cm4gZy5ub2RlKHYpLm9yZGVyO1xuICB9XG4gIGRmcyh1bmRlZmluZWQpO1xuICAqL1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhcnljZW50ZXI7XG5cbmZ1bmN0aW9uIGJhcnljZW50ZXIoZywgbW92YWJsZSkge1xuICByZXR1cm4gXy5tYXAobW92YWJsZSwgZnVuY3Rpb24odikge1xuICAgIHZhciBpblYgPSBnLmluRWRnZXModik7XG4gICAgaWYgKCFpblYubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyB2OiB2IH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXN1bHQgPSBfLnJlZHVjZShpblYsIGZ1bmN0aW9uKGFjYywgZSkge1xuICAgICAgICB2YXIgZWRnZSA9IGcuZWRnZShlKSxcbiAgICAgICAgICBub2RlVSA9IGcubm9kZShlLnYpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1bTogYWNjLnN1bSArIChlZGdlLndlaWdodCAqIG5vZGVVLm9yZGVyKSxcbiAgICAgICAgICB3ZWlnaHQ6IGFjYy53ZWlnaHQgKyBlZGdlLndlaWdodFxuICAgICAgICB9O1xuICAgICAgfSwgeyBzdW06IDAsIHdlaWdodDogMCB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdjogdixcbiAgICAgICAgYmFyeWNlbnRlcjogcmVzdWx0LnN1bSAvIHJlc3VsdC53ZWlnaHQsXG4gICAgICAgIHdlaWdodDogcmVzdWx0LndlaWdodFxuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuXG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuR3JhcGg7XG5cbm1vZHVsZS5leHBvcnRzID0gYnVpbGRMYXllckdyYXBoO1xuXG4vKlxuICogQ29uc3RydWN0cyBhIGdyYXBoIHRoYXQgY2FuIGJlIHVzZWQgdG8gc29ydCBhIGxheWVyIG9mIG5vZGVzLiBUaGUgZ3JhcGggd2lsbFxuICogY29udGFpbiBhbGwgYmFzZSBhbmQgc3ViZ3JhcGggbm9kZXMgZnJvbSB0aGUgcmVxdWVzdCBsYXllciBpbiB0aGVpciBvcmlnaW5hbFxuICogaGllcmFyY2h5IGFuZCBhbnkgZWRnZXMgdGhhdCBhcmUgaW5jaWRlbnQgb24gdGhlc2Ugbm9kZXMgYW5kIGFyZSBvZiB0aGUgdHlwZVxuICogcmVxdWVzdGVkIGJ5IHRoZSBcInJlbGF0aW9uc2hpcFwiIHBhcmFtZXRlci5cbiAqXG4gKiBOb2RlcyBmcm9tIHRoZSByZXF1ZXN0ZWQgcmFuayB0aGF0IGRvIG5vdCBoYXZlIHBhcmVudHMgYXJlIGFzc2lnbmVkIGEgcm9vdFxuICogbm9kZSBpbiB0aGUgb3V0cHV0IGdyYXBoLCB3aGljaCBpcyBzZXQgaW4gdGhlIHJvb3QgZ3JhcGggYXR0cmlidXRlLiBUaGlzXG4gKiBtYWtlcyBpdCBlYXN5IHRvIHdhbGsgdGhlIGhpZXJhcmNoeSBvZiBtb3ZhYmxlIG5vZGVzIGR1cmluZyBvcmRlcmluZy5cbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBJbnB1dCBncmFwaCBpcyBhIERBR1xuICogICAgMi4gQmFzZSBub2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGggaGF2ZSBhIHJhbmsgYXR0cmlidXRlXG4gKiAgICAzLiBTdWJncmFwaCBub2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGggaGFzIG1pblJhbmsgYW5kIG1heFJhbmsgYXR0cmlidXRlc1xuICogICAgNC4gRWRnZXMgaGF2ZSBhbiBhc3NpZ25lZCB3ZWlnaHRcbiAqXG4gKiBQb3N0LWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gT3V0cHV0IGdyYXBoIGhhcyBhbGwgbm9kZXMgaW4gdGhlIG1vdmFibGUgcmFuayB3aXRoIHByZXNlcnZlZFxuICogICAgICAgaGllcmFyY2h5LlxuICogICAgMi4gUm9vdCBub2RlcyBpbiB0aGUgbW92YWJsZSBsYXllciBhcmUgbWFkZSBjaGlsZHJlbiBvZiB0aGUgbm9kZVxuICogICAgICAgaW5kaWNhdGVkIGJ5IHRoZSByb290IGF0dHJpYnV0ZSBvZiB0aGUgZ3JhcGguXG4gKiAgICAzLiBOb24tbW92YWJsZSBub2RlcyBpbmNpZGVudCBvbiBtb3ZhYmxlIG5vZGVzLCBzZWxlY3RlZCBieSB0aGVcbiAqICAgICAgIHJlbGF0aW9uc2hpcCBwYXJhbWV0ZXIsIGFyZSBpbmNsdWRlZCBpbiB0aGUgZ3JhcGggKHdpdGhvdXQgaGllcmFyY2h5KS5cbiAqICAgIDQuIEVkZ2VzIGluY2lkZW50IG9uIG1vdmFibGUgbm9kZXMsIHNlbGVjdGVkIGJ5IHRoZSByZWxhdGlvbnNoaXBcbiAqICAgICAgIHBhcmFtZXRlciwgYXJlIGFkZGVkIHRvIHRoZSBvdXRwdXQgZ3JhcGguXG4gKiAgICA1LiBUaGUgd2VpZ2h0cyBmb3IgY29waWVkIGVkZ2VzIGFyZSBhZ2dyZWdhdGVkIGFzIG5lZWQsIHNpbmNlIHRoZSBvdXRwdXRcbiAqICAgICAgIGdyYXBoIGlzIG5vdCBhIG11bHRpLWdyYXBoLlxuICovXG5mdW5jdGlvbiBidWlsZExheWVyR3JhcGgoZywgcmFuaywgcmVsYXRpb25zaGlwKSB7XG4gIHZhciByb290ID0gY3JlYXRlUm9vdE5vZGUoZyksXG4gICAgcmVzdWx0ID0gbmV3IEdyYXBoKHsgY29tcG91bmQ6IHRydWUgfSkuc2V0R3JhcGgoeyByb290OiByb290IH0pXG4gICAgICAuc2V0RGVmYXVsdE5vZGVMYWJlbChmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodik7IH0pO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KSxcbiAgICAgIHBhcmVudCA9IGcucGFyZW50KHYpO1xuXG4gICAgaWYgKG5vZGUucmFuayA9PT0gcmFuayB8fCBub2RlLm1pblJhbmsgPD0gcmFuayAmJiByYW5rIDw9IG5vZGUubWF4UmFuaykge1xuICAgICAgcmVzdWx0LnNldE5vZGUodik7XG4gICAgICByZXN1bHQuc2V0UGFyZW50KHYsIHBhcmVudCB8fCByb290KTtcblxuICAgICAgLy8gVGhpcyBhc3N1bWVzIHdlIGhhdmUgb25seSBzaG9ydCBlZGdlcyFcbiAgICAgIF8uZm9yRWFjaChnW3JlbGF0aW9uc2hpcF0odiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdmFyIHUgPSBlLnYgPT09IHYgPyBlLncgOiBlLnYsXG4gICAgICAgICAgZWRnZSA9IHJlc3VsdC5lZGdlKHUsIHYpLFxuICAgICAgICAgIHdlaWdodCA9ICFfLmlzVW5kZWZpbmVkKGVkZ2UpID8gZWRnZS53ZWlnaHQgOiAwO1xuICAgICAgICByZXN1bHQuc2V0RWRnZSh1LCB2LCB7IHdlaWdodDogZy5lZGdlKGUpLndlaWdodCArIHdlaWdodCB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoXy5oYXMobm9kZSwgXCJtaW5SYW5rXCIpKSB7XG4gICAgICAgIHJlc3VsdC5zZXROb2RlKHYsIHtcbiAgICAgICAgICBib3JkZXJMZWZ0OiBub2RlLmJvcmRlckxlZnRbcmFua10sXG4gICAgICAgICAgYm9yZGVyUmlnaHQ6IG5vZGUuYm9yZGVyUmlnaHRbcmFua11cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSb290Tm9kZShnKSB7XG4gIHZhciB2O1xuICB3aGlsZSAoZy5oYXNOb2RlKCh2ID0gXy51bmlxdWVJZChcIl9yb290XCIpKSkpO1xuICByZXR1cm4gdjtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY3Jvc3NDb3VudDtcblxuLypcbiAqIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGxheWVyaW5nIChhbiBhcnJheSBvZiBsYXllcnMsIGVhY2ggd2l0aCBhbiBhcnJheSBvZlxuICogb3JkZXJlcmQgbm9kZXMpIGFuZCBhIGdyYXBoIGFuZCByZXR1cm5zIGEgd2VpZ2h0ZWQgY3Jvc3NpbmcgY291bnQuXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gSW5wdXQgZ3JhcGggbXVzdCBiZSBzaW1wbGUgKG5vdCBhIG11bHRpZ3JhcGgpLCBkaXJlY3RlZCwgYW5kIGluY2x1ZGVcbiAqICAgICAgIG9ubHkgc2ltcGxlIGVkZ2VzLlxuICogICAgMi4gRWRnZXMgaW4gdGhlIGlucHV0IGdyYXBoIG11c3QgaGF2ZSBhc3NpZ25lZCB3ZWlnaHRzLlxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBUaGUgZ3JhcGggYW5kIGxheWVyaW5nIG1hdHJpeCBhcmUgbGVmdCB1bmNoYW5nZWQuXG4gKlxuICogVGhpcyBhbGdvcml0aG0gaXMgZGVyaXZlZCBmcm9tIEJhcnRoLCBldCBhbC4sIFwiQmlsYXllciBDcm9zcyBDb3VudGluZy5cIlxuICovXG5mdW5jdGlvbiBjcm9zc0NvdW50KGcsIGxheWVyaW5nKSB7XG4gIHZhciBjYyA9IDA7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbGF5ZXJpbmcubGVuZ3RoOyArK2kpIHtcbiAgICBjYyArPSB0d29MYXllckNyb3NzQ291bnQoZywgbGF5ZXJpbmdbaS0xXSwgbGF5ZXJpbmdbaV0pO1xuICB9XG4gIHJldHVybiBjYztcbn1cblxuZnVuY3Rpb24gdHdvTGF5ZXJDcm9zc0NvdW50KGcsIG5vcnRoTGF5ZXIsIHNvdXRoTGF5ZXIpIHtcbiAgLy8gU29ydCBhbGwgb2YgdGhlIGVkZ2VzIGJldHdlZW4gdGhlIG5vcnRoIGFuZCBzb3V0aCBsYXllcnMgYnkgdGhlaXIgcG9zaXRpb25cbiAgLy8gaW4gdGhlIG5vcnRoIGxheWVyIGFuZCB0aGVuIHRoZSBzb3V0aC4gTWFwIHRoZXNlIGVkZ2VzIHRvIHRoZSBwb3NpdGlvbiBvZlxuICAvLyB0aGVpciBoZWFkIGluIHRoZSBzb3V0aCBsYXllci5cbiAgdmFyIHNvdXRoUG9zID0gXy56aXBPYmplY3Qoc291dGhMYXllcixcbiAgICBfLm1hcChzb3V0aExheWVyLCBmdW5jdGlvbiAodiwgaSkgeyByZXR1cm4gaTsgfSkpO1xuICB2YXIgc291dGhFbnRyaWVzID0gXy5mbGF0dGVuKF8ubWFwKG5vcnRoTGF5ZXIsIGZ1bmN0aW9uKHYpIHtcbiAgICByZXR1cm4gXy5zb3J0QnkoXy5tYXAoZy5vdXRFZGdlcyh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuIHsgcG9zOiBzb3V0aFBvc1tlLnddLCB3ZWlnaHQ6IGcuZWRnZShlKS53ZWlnaHQgfTtcbiAgICB9KSwgXCJwb3NcIik7XG4gIH0pLCB0cnVlKTtcblxuICAvLyBCdWlsZCB0aGUgYWNjdW11bGF0b3IgdHJlZVxuICB2YXIgZmlyc3RJbmRleCA9IDE7XG4gIHdoaWxlIChmaXJzdEluZGV4IDwgc291dGhMYXllci5sZW5ndGgpIGZpcnN0SW5kZXggPDw9IDE7XG4gIHZhciB0cmVlU2l6ZSA9IDIgKiBmaXJzdEluZGV4IC0gMTtcbiAgZmlyc3RJbmRleCAtPSAxO1xuICB2YXIgdHJlZSA9IF8ubWFwKG5ldyBBcnJheSh0cmVlU2l6ZSksIGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfSk7XG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSB3ZWlnaHRlZCBjcm9zc2luZ3NcbiAgdmFyIGNjID0gMDtcbiAgXy5mb3JFYWNoKHNvdXRoRW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgdmFyIGluZGV4ID0gZW50cnkucG9zICsgZmlyc3RJbmRleDtcbiAgICB0cmVlW2luZGV4XSArPSBlbnRyeS53ZWlnaHQ7XG4gICAgdmFyIHdlaWdodFN1bSA9IDA7XG4gICAgd2hpbGUgKGluZGV4ID4gMCkge1xuICAgICAgaWYgKGluZGV4ICUgMikge1xuICAgICAgICB3ZWlnaHRTdW0gKz0gdHJlZVtpbmRleCArIDFdO1xuICAgICAgfVxuICAgICAgaW5kZXggPSAoaW5kZXggLSAxKSA+PiAxO1xuICAgICAgdHJlZVtpbmRleF0gKz0gZW50cnkud2VpZ2h0O1xuICAgIH1cbiAgICBjYyArPSBlbnRyeS53ZWlnaHQgKiB3ZWlnaHRTdW07XG4gIH0pKTtcblxuICByZXR1cm4gY2M7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIGluaXRPcmRlciA9IHJlcXVpcmUoXCIuL2luaXQtb3JkZXJcIik7XG52YXIgY3Jvc3NDb3VudCA9IHJlcXVpcmUoXCIuL2Nyb3NzLWNvdW50XCIpO1xudmFyIHNvcnRTdWJncmFwaCA9IHJlcXVpcmUoXCIuL3NvcnQtc3ViZ3JhcGhcIik7XG52YXIgYnVpbGRMYXllckdyYXBoID0gcmVxdWlyZShcIi4vYnVpbGQtbGF5ZXItZ3JhcGhcIik7XG52YXIgYWRkU3ViZ3JhcGhDb25zdHJhaW50cyA9IHJlcXVpcmUoXCIuL2FkZC1zdWJncmFwaC1jb25zdHJhaW50c1wiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuLi9ncmFwaGxpYlwiKS5HcmFwaDtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4uL3V0aWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gb3JkZXI7XG5cbi8qXG4gKiBBcHBsaWVzIGhldXJpc3RpY3MgdG8gbWluaW1pemUgZWRnZSBjcm9zc2luZ3MgaW4gdGhlIGdyYXBoIGFuZCBzZXRzIHRoZSBiZXN0XG4gKiBvcmRlciBzb2x1dGlvbiBhcyBhbiBvcmRlciBhdHRyaWJ1dGUgb24gZWFjaCBub2RlLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEdyYXBoIG11c3QgYmUgREFHXG4gKiAgICAyLiBHcmFwaCBub2RlcyBtdXN0IGJlIG9iamVjdHMgd2l0aCBhIFwicmFua1wiIGF0dHJpYnV0ZVxuICogICAgMy4gR3JhcGggZWRnZXMgbXVzdCBoYXZlIHRoZSBcIndlaWdodFwiIGF0dHJpYnV0ZVxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBHcmFwaCBub2RlcyB3aWxsIGhhdmUgYW4gXCJvcmRlclwiIGF0dHJpYnV0ZSBiYXNlZCBvbiB0aGUgcmVzdWx0cyBvZiB0aGVcbiAqICAgICAgIGFsZ29yaXRobS5cbiAqL1xuZnVuY3Rpb24gb3JkZXIoZykge1xuICB2YXIgbWF4UmFuayA9IHV0aWwubWF4UmFuayhnKSxcbiAgICBkb3duTGF5ZXJHcmFwaHMgPSBidWlsZExheWVyR3JhcGhzKGcsIF8ucmFuZ2UoMSwgbWF4UmFuayArIDEpLCBcImluRWRnZXNcIiksXG4gICAgdXBMYXllckdyYXBocyA9IGJ1aWxkTGF5ZXJHcmFwaHMoZywgXy5yYW5nZShtYXhSYW5rIC0gMSwgLTEsIC0xKSwgXCJvdXRFZGdlc1wiKTtcblxuICB2YXIgbGF5ZXJpbmcgPSBpbml0T3JkZXIoZyk7XG4gIGFzc2lnbk9yZGVyKGcsIGxheWVyaW5nKTtcblxuICB2YXIgYmVzdENDID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgIGJlc3Q7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxhc3RCZXN0ID0gMDsgbGFzdEJlc3QgPCA0OyArK2ksICsrbGFzdEJlc3QpIHtcbiAgICBzd2VlcExheWVyR3JhcGhzKGkgJSAyID8gZG93bkxheWVyR3JhcGhzIDogdXBMYXllckdyYXBocywgaSAlIDQgPj0gMik7XG5cbiAgICBsYXllcmluZyA9IHV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtcbiAgICB2YXIgY2MgPSBjcm9zc0NvdW50KGcsIGxheWVyaW5nKTtcbiAgICBpZiAoY2MgPCBiZXN0Q0MpIHtcbiAgICAgIGxhc3RCZXN0ID0gMDtcbiAgICAgIGJlc3QgPSBfLmNsb25lRGVlcChsYXllcmluZyk7XG4gICAgICBiZXN0Q0MgPSBjYztcbiAgICB9XG4gIH1cblxuICBhc3NpZ25PcmRlcihnLCBiZXN0KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRMYXllckdyYXBocyhnLCByYW5rcywgcmVsYXRpb25zaGlwKSB7XG4gIHJldHVybiBfLm1hcChyYW5rcywgZnVuY3Rpb24ocmFuaykge1xuICAgIHJldHVybiBidWlsZExheWVyR3JhcGgoZywgcmFuaywgcmVsYXRpb25zaGlwKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHN3ZWVwTGF5ZXJHcmFwaHMobGF5ZXJHcmFwaHMsIGJpYXNSaWdodCkge1xuICB2YXIgY2cgPSBuZXcgR3JhcGgoKTtcbiAgXy5mb3JFYWNoKGxheWVyR3JhcGhzLCBmdW5jdGlvbihsZykge1xuICAgIHZhciByb290ID0gbGcuZ3JhcGgoKS5yb290O1xuICAgIHZhciBzb3J0ZWQgPSBzb3J0U3ViZ3JhcGgobGcsIHJvb3QsIGNnLCBiaWFzUmlnaHQpO1xuICAgIF8uZm9yRWFjaChzb3J0ZWQudnMsIGZ1bmN0aW9uKHYsIGkpIHtcbiAgICAgIGxnLm5vZGUodikub3JkZXIgPSBpO1xuICAgIH0pO1xuICAgIGFkZFN1YmdyYXBoQ29uc3RyYWludHMobGcsIGNnLCBzb3J0ZWQudnMpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXNzaWduT3JkZXIoZywgbGF5ZXJpbmcpIHtcbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odiwgaSkge1xuICAgICAgZy5ub2RlKHYpLm9yZGVyID0gaTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGluaXRPcmRlcjtcblxuLypcbiAqIEFzc2lnbnMgYW4gaW5pdGlhbCBvcmRlciB2YWx1ZSBmb3IgZWFjaCBub2RlIGJ5IHBlcmZvcm1pbmcgYSBERlMgc2VhcmNoXG4gKiBzdGFydGluZyBmcm9tIG5vZGVzIGluIHRoZSBmaXJzdCByYW5rLiBOb2RlcyBhcmUgYXNzaWduZWQgYW4gb3JkZXIgaW4gdGhlaXJcbiAqIHJhbmsgYXMgdGhleSBhcmUgZmlyc3QgdmlzaXRlZC5cbiAqXG4gKiBUaGlzIGFwcHJvYWNoIGNvbWVzIGZyb20gR2Fuc25lciwgZXQgYWwuLCBcIkEgVGVjaG5pcXVlIGZvciBEcmF3aW5nIERpcmVjdGVkXG4gKiBHcmFwaHMuXCJcbiAqXG4gKiBSZXR1cm5zIGEgbGF5ZXJpbmcgbWF0cml4IHdpdGggYW4gYXJyYXkgcGVyIGxheWVyIGFuZCBlYWNoIGxheWVyIHNvcnRlZCBieVxuICogdGhlIG9yZGVyIG9mIGl0cyBub2Rlcy5cbiAqL1xuZnVuY3Rpb24gaW5pdE9yZGVyKGcpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgdmFyIHNpbXBsZU5vZGVzID0gXy5maWx0ZXIoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuICFnLmNoaWxkcmVuKHYpLmxlbmd0aDtcbiAgfSk7XG4gIHZhciBtYXhSYW5rID0gXy5tYXgoXy5tYXAoc2ltcGxlTm9kZXMsIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5yYW5rOyB9KSk7XG4gIHZhciBsYXllcnMgPSBfLm1hcChfLnJhbmdlKG1heFJhbmsgKyAxKSwgZnVuY3Rpb24oKSB7IHJldHVybiBbXTsgfSk7XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICBpZiAoXy5oYXModmlzaXRlZCwgdikpIHJldHVybjtcbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBsYXllcnNbbm9kZS5yYW5rXS5wdXNoKHYpO1xuICAgIF8uZm9yRWFjaChnLnN1Y2Nlc3NvcnModiksIGRmcyk7XG4gIH1cblxuICB2YXIgb3JkZXJlZFZzID0gXy5zb3J0Qnkoc2ltcGxlTm9kZXMsIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5yYW5rOyB9KTtcbiAgXy5mb3JFYWNoKG9yZGVyZWRWcywgZGZzKTtcblxuICByZXR1cm4gbGF5ZXJzO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXNvbHZlQ29uZmxpY3RzO1xuXG4vKlxuICogR2l2ZW4gYSBsaXN0IG9mIGVudHJpZXMgb2YgdGhlIGZvcm0ge3YsIGJhcnljZW50ZXIsIHdlaWdodH0gYW5kIGFcbiAqIGNvbnN0cmFpbnQgZ3JhcGggdGhpcyBmdW5jdGlvbiB3aWxsIHJlc29sdmUgYW55IGNvbmZsaWN0cyBiZXR3ZWVuIHRoZVxuICogY29uc3RyYWludCBncmFwaCBhbmQgdGhlIGJhcnljZW50ZXJzIGZvciB0aGUgZW50cmllcy4gSWYgdGhlIGJhcnljZW50ZXJzIGZvclxuICogYW4gZW50cnkgd291bGQgdmlvbGF0ZSBhIGNvbnN0cmFpbnQgaW4gdGhlIGNvbnN0cmFpbnQgZ3JhcGggdGhlbiB3ZSBjb2FsZXNjZVxuICogdGhlIG5vZGVzIGluIHRoZSBjb25mbGljdCBpbnRvIGEgbmV3IG5vZGUgdGhhdCByZXNwZWN0cyB0aGUgY29udHJhaW50IGFuZFxuICogYWdncmVnYXRlcyBiYXJ5Y2VudGVyIGFuZCB3ZWlnaHQgaW5mb3JtYXRpb24uXG4gKlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgZGVzY3JpcHRpb24gaW4gRm9yc3RlciwgXCJBIEZhc3QgYW5kXG4gKiBTaW1wbGUgSHVlcmlzdGljIGZvciBDb25zdHJhaW5lZCBUd28tTGV2ZWwgQ3Jvc3NpbmcgUmVkdWN0aW9uLFwiIHRob3VnaHQgaXRcbiAqIGRpZmZlcnMgaW4gc29tZSBzcGVjaWZpYyBkZXRhaWxzLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEVhY2ggZW50cnkgaGFzIHRoZSBmb3JtIHt2LCBiYXJ5Y2VudGVyLCB3ZWlnaHR9LCBvciBpZiB0aGUgbm9kZSBoYXNcbiAqICAgICAgIG5vIGJhcnljZW50ZXIsIHRoZW4ge3Z9LlxuICpcbiAqIFJldHVybnM6XG4gKlxuICogICAgQSBuZXcgbGlzdCBvZiBlbnRyaWVzIG9mIHRoZSBmb3JtIHt2cywgaSwgYmFyeWNlbnRlciwgd2VpZ2h0fS4gVGhlIGxpc3RcbiAqICAgIGB2c2AgbWF5IGVpdGhlciBiZSBhIHNpbmdsZXRvbiBvciBpdCBtYXkgYmUgYW4gYWdncmVnYXRpb24gb2Ygbm9kZXNcbiAqICAgIG9yZGVyZWQgc3VjaCB0aGF0IHRoZXkgZG8gbm90IHZpb2xhdGUgY29uc3RyYWludHMgZnJvbSB0aGUgY29uc3RyYWludFxuICogICAgZ3JhcGguIFRoZSBwcm9wZXJ0eSBgaWAgaXMgdGhlIGxvd2VzdCBvcmlnaW5hbCBpbmRleCBvZiBhbnkgb2YgdGhlXG4gKiAgICBlbGVtZW50cyBpbiBgdnNgLlxuICovXG5mdW5jdGlvbiByZXNvbHZlQ29uZmxpY3RzKGVudHJpZXMsIGNnKSB7XG4gIHZhciBtYXBwZWRFbnRyaWVzID0ge307XG4gIF8uZm9yRWFjaChlbnRyaWVzLCBmdW5jdGlvbihlbnRyeSwgaSkge1xuICAgIHZhciB0bXAgPSBtYXBwZWRFbnRyaWVzW2VudHJ5LnZdID0ge1xuICAgICAgaW5kZWdyZWU6IDAsXG4gICAgICBcImluXCI6IFtdLFxuICAgICAgb3V0OiBbXSxcbiAgICAgIHZzOiBbZW50cnkudl0sXG4gICAgICBpOiBpXG4gICAgfTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZW50cnkuYmFyeWNlbnRlcikpIHtcbiAgICAgIHRtcC5iYXJ5Y2VudGVyID0gZW50cnkuYmFyeWNlbnRlcjtcbiAgICAgIHRtcC53ZWlnaHQgPSBlbnRyeS53ZWlnaHQ7XG4gICAgfVxuICB9KTtcblxuICBfLmZvckVhY2goY2cuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlbnRyeVYgPSBtYXBwZWRFbnRyaWVzW2Uudl07XG4gICAgdmFyIGVudHJ5VyA9IG1hcHBlZEVudHJpZXNbZS53XTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZW50cnlWKSAmJiAhXy5pc1VuZGVmaW5lZChlbnRyeVcpKSB7XG4gICAgICBlbnRyeVcuaW5kZWdyZWUrKztcbiAgICAgIGVudHJ5Vi5vdXQucHVzaChtYXBwZWRFbnRyaWVzW2Uud10pO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIHNvdXJjZVNldCA9IF8uZmlsdGVyKG1hcHBlZEVudHJpZXMsIGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgcmV0dXJuICFlbnRyeS5pbmRlZ3JlZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGRvUmVzb2x2ZUNvbmZsaWN0cyhzb3VyY2VTZXQpO1xufVxuXG5mdW5jdGlvbiBkb1Jlc29sdmVDb25mbGljdHMoc291cmNlU2V0KSB7XG4gIHZhciBlbnRyaWVzID0gW107XG5cbiAgZnVuY3Rpb24gaGFuZGxlSW4odkVudHJ5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHVFbnRyeSkge1xuICAgICAgaWYgKHVFbnRyeS5tZXJnZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNVbmRlZmluZWQodUVudHJ5LmJhcnljZW50ZXIpIHx8XG4gICAgICAgICAgXy5pc1VuZGVmaW5lZCh2RW50cnkuYmFyeWNlbnRlcikgfHxcbiAgICAgICAgICB1RW50cnkuYmFyeWNlbnRlciA+PSB2RW50cnkuYmFyeWNlbnRlcikge1xuICAgICAgICBtZXJnZUVudHJpZXModkVudHJ5LCB1RW50cnkpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVPdXQodkVudHJ5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHdFbnRyeSkge1xuICAgICAgd0VudHJ5W1wiaW5cIl0ucHVzaCh2RW50cnkpO1xuICAgICAgaWYgKC0td0VudHJ5LmluZGVncmVlID09PSAwKSB7XG4gICAgICAgIHNvdXJjZVNldC5wdXNoKHdFbnRyeSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHdoaWxlIChzb3VyY2VTZXQubGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gc291cmNlU2V0LnBvcCgpO1xuICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgXy5mb3JFYWNoKGVudHJ5W1wiaW5cIl0ucmV2ZXJzZSgpLCBoYW5kbGVJbihlbnRyeSkpO1xuICAgIF8uZm9yRWFjaChlbnRyeS5vdXQsIGhhbmRsZU91dChlbnRyeSkpO1xuICB9XG5cbiAgcmV0dXJuIF8ubWFwKF8uZmlsdGVyKGVudHJpZXMsIGZ1bmN0aW9uKGVudHJ5KSB7IHJldHVybiAhZW50cnkubWVyZ2VkOyB9KSxcbiAgICBmdW5jdGlvbihlbnRyeSkge1xuICAgICAgcmV0dXJuIF8ucGljayhlbnRyeSwgW1widnNcIiwgXCJpXCIsIFwiYmFyeWNlbnRlclwiLCBcIndlaWdodFwiXSk7XG4gICAgfSk7XG5cbn1cblxuZnVuY3Rpb24gbWVyZ2VFbnRyaWVzKHRhcmdldCwgc291cmNlKSB7XG4gIHZhciBzdW0gPSAwO1xuICB2YXIgd2VpZ2h0ID0gMDtcblxuICBpZiAodGFyZ2V0LndlaWdodCkge1xuICAgIHN1bSArPSB0YXJnZXQuYmFyeWNlbnRlciAqIHRhcmdldC53ZWlnaHQ7XG4gICAgd2VpZ2h0ICs9IHRhcmdldC53ZWlnaHQ7XG4gIH1cblxuICBpZiAoc291cmNlLndlaWdodCkge1xuICAgIHN1bSArPSBzb3VyY2UuYmFyeWNlbnRlciAqIHNvdXJjZS53ZWlnaHQ7XG4gICAgd2VpZ2h0ICs9IHNvdXJjZS53ZWlnaHQ7XG4gIH1cblxuICB0YXJnZXQudnMgPSBzb3VyY2UudnMuY29uY2F0KHRhcmdldC52cyk7XG4gIHRhcmdldC5iYXJ5Y2VudGVyID0gc3VtIC8gd2VpZ2h0O1xuICB0YXJnZXQud2VpZ2h0ID0gd2VpZ2h0O1xuICB0YXJnZXQuaSA9IE1hdGgubWluKHNvdXJjZS5pLCB0YXJnZXQuaSk7XG4gIHNvdXJjZS5tZXJnZWQgPSB0cnVlO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIGJhcnljZW50ZXIgPSByZXF1aXJlKFwiLi9iYXJ5Y2VudGVyXCIpO1xudmFyIHJlc29sdmVDb25mbGljdHMgPSByZXF1aXJlKFwiLi9yZXNvbHZlLWNvbmZsaWN0c1wiKTtcbnZhciBzb3J0ID0gcmVxdWlyZShcIi4vc29ydFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzb3J0U3ViZ3JhcGg7XG5cbmZ1bmN0aW9uIHNvcnRTdWJncmFwaChnLCB2LCBjZywgYmlhc1JpZ2h0KSB7XG4gIHZhciBtb3ZhYmxlID0gZy5jaGlsZHJlbih2KTtcbiAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gIHZhciBibCA9IG5vZGUgPyBub2RlLmJvcmRlckxlZnQgOiB1bmRlZmluZWQ7XG4gIHZhciBiciA9IG5vZGUgPyBub2RlLmJvcmRlclJpZ2h0OiB1bmRlZmluZWQ7XG4gIHZhciBzdWJncmFwaHMgPSB7fTtcblxuICBpZiAoYmwpIHtcbiAgICBtb3ZhYmxlID0gXy5maWx0ZXIobW92YWJsZSwgZnVuY3Rpb24odykge1xuICAgICAgcmV0dXJuIHcgIT09IGJsICYmIHcgIT09IGJyO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGJhcnljZW50ZXJzID0gYmFyeWNlbnRlcihnLCBtb3ZhYmxlKTtcbiAgXy5mb3JFYWNoKGJhcnljZW50ZXJzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIGlmIChnLmNoaWxkcmVuKGVudHJ5LnYpLmxlbmd0aCkge1xuICAgICAgdmFyIHN1YmdyYXBoUmVzdWx0ID0gc29ydFN1YmdyYXBoKGcsIGVudHJ5LnYsIGNnLCBiaWFzUmlnaHQpO1xuICAgICAgc3ViZ3JhcGhzW2VudHJ5LnZdID0gc3ViZ3JhcGhSZXN1bHQ7XG4gICAgICBpZiAoXy5oYXMoc3ViZ3JhcGhSZXN1bHQsIFwiYmFyeWNlbnRlclwiKSkge1xuICAgICAgICBtZXJnZUJhcnljZW50ZXJzKGVudHJ5LCBzdWJncmFwaFJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICB2YXIgZW50cmllcyA9IHJlc29sdmVDb25mbGljdHMoYmFyeWNlbnRlcnMsIGNnKTtcbiAgZXhwYW5kU3ViZ3JhcGhzKGVudHJpZXMsIHN1YmdyYXBocyk7XG5cbiAgdmFyIHJlc3VsdCA9IHNvcnQoZW50cmllcywgYmlhc1JpZ2h0KTtcblxuICBpZiAoYmwpIHtcbiAgICByZXN1bHQudnMgPSBfLmZsYXR0ZW4oW2JsLCByZXN1bHQudnMsIGJyXSwgdHJ1ZSk7XG4gICAgaWYgKGcucHJlZGVjZXNzb3JzKGJsKS5sZW5ndGgpIHtcbiAgICAgIHZhciBibFByZWQgPSBnLm5vZGUoZy5wcmVkZWNlc3NvcnMoYmwpWzBdKSxcbiAgICAgICAgYnJQcmVkID0gZy5ub2RlKGcucHJlZGVjZXNzb3JzKGJyKVswXSk7XG4gICAgICBpZiAoIV8uaGFzKHJlc3VsdCwgXCJiYXJ5Y2VudGVyXCIpKSB7XG4gICAgICAgIHJlc3VsdC5iYXJ5Y2VudGVyID0gMDtcbiAgICAgICAgcmVzdWx0LndlaWdodCA9IDA7XG4gICAgICB9XG4gICAgICByZXN1bHQuYmFyeWNlbnRlciA9IChyZXN1bHQuYmFyeWNlbnRlciAqIHJlc3VsdC53ZWlnaHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxQcmVkLm9yZGVyICsgYnJQcmVkLm9yZGVyKSAvIChyZXN1bHQud2VpZ2h0ICsgMik7XG4gICAgICByZXN1bHQud2VpZ2h0ICs9IDI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZXhwYW5kU3ViZ3JhcGhzKGVudHJpZXMsIHN1YmdyYXBocykge1xuICBfLmZvckVhY2goZW50cmllcywgZnVuY3Rpb24oZW50cnkpIHtcbiAgICBlbnRyeS52cyA9IF8uZmxhdHRlbihlbnRyeS52cy5tYXAoZnVuY3Rpb24odikge1xuICAgICAgaWYgKHN1YmdyYXBoc1t2XSkge1xuICAgICAgICByZXR1cm4gc3ViZ3JhcGhzW3ZdLnZzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHY7XG4gICAgfSksIHRydWUpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VCYXJ5Y2VudGVycyh0YXJnZXQsIG90aGVyKSB7XG4gIGlmICghXy5pc1VuZGVmaW5lZCh0YXJnZXQuYmFyeWNlbnRlcikpIHtcbiAgICB0YXJnZXQuYmFyeWNlbnRlciA9ICh0YXJnZXQuYmFyeWNlbnRlciAqIHRhcmdldC53ZWlnaHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLmJhcnljZW50ZXIgKiBvdGhlci53ZWlnaHQpIC9cbiAgICAgICAgICAgICAgICAgICAgICAgICh0YXJnZXQud2VpZ2h0ICsgb3RoZXIud2VpZ2h0KTtcbiAgICB0YXJnZXQud2VpZ2h0ICs9IG90aGVyLndlaWdodDtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQuYmFyeWNlbnRlciA9IG90aGVyLmJhcnljZW50ZXI7XG4gICAgdGFyZ2V0LndlaWdodCA9IG90aGVyLndlaWdodDtcbiAgfVxufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzb3J0O1xuXG5mdW5jdGlvbiBzb3J0KGVudHJpZXMsIGJpYXNSaWdodCkge1xuICB2YXIgcGFydHMgPSB1dGlsLnBhcnRpdGlvbihlbnRyaWVzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIHJldHVybiBfLmhhcyhlbnRyeSwgXCJiYXJ5Y2VudGVyXCIpO1xuICB9KTtcbiAgdmFyIHNvcnRhYmxlID0gcGFydHMubGhzLFxuICAgIHVuc29ydGFibGUgPSBfLnNvcnRCeShwYXJ0cy5yaHMsIGZ1bmN0aW9uKGVudHJ5KSB7IHJldHVybiAtZW50cnkuaTsgfSksXG4gICAgdnMgPSBbXSxcbiAgICBzdW0gPSAwLFxuICAgIHdlaWdodCA9IDAsXG4gICAgdnNJbmRleCA9IDA7XG5cbiAgc29ydGFibGUuc29ydChjb21wYXJlV2l0aEJpYXMoISFiaWFzUmlnaHQpKTtcblxuICB2c0luZGV4ID0gY29uc3VtZVVuc29ydGFibGUodnMsIHVuc29ydGFibGUsIHZzSW5kZXgpO1xuXG4gIF8uZm9yRWFjaChzb3J0YWJsZSwgZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgdnNJbmRleCArPSBlbnRyeS52cy5sZW5ndGg7XG4gICAgdnMucHVzaChlbnRyeS52cyk7XG4gICAgc3VtICs9IGVudHJ5LmJhcnljZW50ZXIgKiBlbnRyeS53ZWlnaHQ7XG4gICAgd2VpZ2h0ICs9IGVudHJ5LndlaWdodDtcbiAgICB2c0luZGV4ID0gY29uc3VtZVVuc29ydGFibGUodnMsIHVuc29ydGFibGUsIHZzSW5kZXgpO1xuICB9KTtcblxuICB2YXIgcmVzdWx0ID0geyB2czogXy5mbGF0dGVuKHZzLCB0cnVlKSB9O1xuICBpZiAod2VpZ2h0KSB7XG4gICAgcmVzdWx0LmJhcnljZW50ZXIgPSBzdW0gLyB3ZWlnaHQ7XG4gICAgcmVzdWx0LndlaWdodCA9IHdlaWdodDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjb25zdW1lVW5zb3J0YWJsZSh2cywgdW5zb3J0YWJsZSwgaW5kZXgpIHtcbiAgdmFyIGxhc3Q7XG4gIHdoaWxlICh1bnNvcnRhYmxlLmxlbmd0aCAmJiAobGFzdCA9IF8ubGFzdCh1bnNvcnRhYmxlKSkuaSA8PSBpbmRleCkge1xuICAgIHVuc29ydGFibGUucG9wKCk7XG4gICAgdnMucHVzaChsYXN0LnZzKTtcbiAgICBpbmRleCsrO1xuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuZnVuY3Rpb24gY29tcGFyZVdpdGhCaWFzKGJpYXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGVudHJ5ViwgZW50cnlXKSB7XG4gICAgaWYgKGVudHJ5Vi5iYXJ5Y2VudGVyIDwgZW50cnlXLmJhcnljZW50ZXIpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5Vi5iYXJ5Y2VudGVyID4gZW50cnlXLmJhcnljZW50ZXIpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIHJldHVybiAhYmlhcyA/IGVudHJ5Vi5pIC0gZW50cnlXLmkgOiBlbnRyeVcuaSAtIGVudHJ5Vi5pO1xuICB9O1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50RHVtbXlDaGFpbnM7XG5cbmZ1bmN0aW9uIHBhcmVudER1bW15Q2hhaW5zKGcpIHtcbiAgdmFyIHBvc3RvcmRlck51bXMgPSBwb3N0b3JkZXIoZyk7XG5cbiAgXy5mb3JFYWNoKGcuZ3JhcGgoKS5kdW1teUNoYWlucywgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIHZhciBlZGdlT2JqID0gbm9kZS5lZGdlT2JqO1xuICAgIHZhciBwYXRoRGF0YSA9IGZpbmRQYXRoKGcsIHBvc3RvcmRlck51bXMsIGVkZ2VPYmoudiwgZWRnZU9iai53KTtcbiAgICB2YXIgcGF0aCA9IHBhdGhEYXRhLnBhdGg7XG4gICAgdmFyIGxjYSA9IHBhdGhEYXRhLmxjYTtcbiAgICB2YXIgcGF0aElkeCA9IDA7XG4gICAgdmFyIHBhdGhWID0gcGF0aFtwYXRoSWR4XTtcbiAgICB2YXIgYXNjZW5kaW5nID0gdHJ1ZTtcblxuICAgIHdoaWxlICh2ICE9PSBlZGdlT2JqLncpIHtcbiAgICAgIG5vZGUgPSBnLm5vZGUodik7XG5cbiAgICAgIGlmIChhc2NlbmRpbmcpIHtcbiAgICAgICAgd2hpbGUgKChwYXRoViA9IHBhdGhbcGF0aElkeF0pICE9PSBsY2EgJiZcbiAgICAgICAgICAgICAgIGcubm9kZShwYXRoVikubWF4UmFuayA8IG5vZGUucmFuaykge1xuICAgICAgICAgIHBhdGhJZHgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXRoViA9PT0gbGNhKSB7XG4gICAgICAgICAgYXNjZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhc2NlbmRpbmcpIHtcbiAgICAgICAgd2hpbGUgKHBhdGhJZHggPCBwYXRoLmxlbmd0aCAtIDEgJiZcbiAgICAgICAgICAgICAgIGcubm9kZShwYXRoViA9IHBhdGhbcGF0aElkeCArIDFdKS5taW5SYW5rIDw9IG5vZGUucmFuaykge1xuICAgICAgICAgIHBhdGhJZHgrKztcbiAgICAgICAgfVxuICAgICAgICBwYXRoViA9IHBhdGhbcGF0aElkeF07XG4gICAgICB9XG5cbiAgICAgIGcuc2V0UGFyZW50KHYsIHBhdGhWKTtcbiAgICAgIHYgPSBnLnN1Y2Nlc3NvcnModilbMF07XG4gICAgfVxuICB9KTtcbn1cblxuLy8gRmluZCBhIHBhdGggZnJvbSB2IHRvIHcgdGhyb3VnaCB0aGUgbG93ZXN0IGNvbW1vbiBhbmNlc3RvciAoTENBKS4gUmV0dXJuIHRoZVxuLy8gZnVsbCBwYXRoIGFuZCB0aGUgTENBLlxuZnVuY3Rpb24gZmluZFBhdGgoZywgcG9zdG9yZGVyTnVtcywgdiwgdykge1xuICB2YXIgdlBhdGggPSBbXTtcbiAgdmFyIHdQYXRoID0gW107XG4gIHZhciBsb3cgPSBNYXRoLm1pbihwb3N0b3JkZXJOdW1zW3ZdLmxvdywgcG9zdG9yZGVyTnVtc1t3XS5sb3cpO1xuICB2YXIgbGltID0gTWF0aC5tYXgocG9zdG9yZGVyTnVtc1t2XS5saW0sIHBvc3RvcmRlck51bXNbd10ubGltKTtcbiAgdmFyIHBhcmVudDtcbiAgdmFyIGxjYTtcblxuICAvLyBUcmF2ZXJzZSB1cCBmcm9tIHYgdG8gZmluZCB0aGUgTENBXG4gIHBhcmVudCA9IHY7XG4gIGRvIHtcbiAgICBwYXJlbnQgPSBnLnBhcmVudChwYXJlbnQpO1xuICAgIHZQYXRoLnB1c2gocGFyZW50KTtcbiAgfSB3aGlsZSAocGFyZW50ICYmXG4gICAgICAgICAgIChwb3N0b3JkZXJOdW1zW3BhcmVudF0ubG93ID4gbG93IHx8IGxpbSA+IHBvc3RvcmRlck51bXNbcGFyZW50XS5saW0pKTtcbiAgbGNhID0gcGFyZW50O1xuXG4gIC8vIFRyYXZlcnNlIGZyb20gdyB0byBMQ0FcbiAgcGFyZW50ID0gdztcbiAgd2hpbGUgKChwYXJlbnQgPSBnLnBhcmVudChwYXJlbnQpKSAhPT0gbGNhKSB7XG4gICAgd1BhdGgucHVzaChwYXJlbnQpO1xuICB9XG5cbiAgcmV0dXJuIHsgcGF0aDogdlBhdGguY29uY2F0KHdQYXRoLnJldmVyc2UoKSksIGxjYTogbGNhIH07XG59XG5cbmZ1bmN0aW9uIHBvc3RvcmRlcihnKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgdmFyIGxpbSA9IDA7XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgbG93ID0gbGltO1xuICAgIF8uZm9yRWFjaChnLmNoaWxkcmVuKHYpLCBkZnMpO1xuICAgIHJlc3VsdFt2XSA9IHsgbG93OiBsb3csIGxpbTogbGltKysgfTtcbiAgfVxuICBfLmZvckVhY2goZy5jaGlsZHJlbigpLCBkZnMpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4uL2dyYXBobGliXCIpLkdyYXBoO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcblxuLypcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGNvb3JkaW5hdGUgYXNzaWdubWVudCBiYXNlZCBvbiBCcmFuZGVzIGFuZCBLw7ZwZiwgXCJGYXN0XG4gKiBhbmQgU2ltcGxlIEhvcml6b250YWwgQ29vcmRpbmF0ZSBBc3NpZ25tZW50LlwiXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBvc2l0aW9uWDogcG9zaXRpb25YLFxuICBmaW5kVHlwZTFDb25mbGljdHM6IGZpbmRUeXBlMUNvbmZsaWN0cyxcbiAgZmluZFR5cGUyQ29uZmxpY3RzOiBmaW5kVHlwZTJDb25mbGljdHMsXG4gIGFkZENvbmZsaWN0OiBhZGRDb25mbGljdCxcbiAgaGFzQ29uZmxpY3Q6IGhhc0NvbmZsaWN0LFxuICB2ZXJ0aWNhbEFsaWdubWVudDogdmVydGljYWxBbGlnbm1lbnQsXG4gIGhvcml6b250YWxDb21wYWN0aW9uOiBob3Jpem9udGFsQ29tcGFjdGlvbixcbiAgYWxpZ25Db29yZGluYXRlczogYWxpZ25Db29yZGluYXRlcyxcbiAgZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQ6IGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50LFxuICBiYWxhbmNlOiBiYWxhbmNlXG59O1xuXG4vKlxuICogTWFya3MgYWxsIGVkZ2VzIGluIHRoZSBncmFwaCB3aXRoIGEgdHlwZS0xIGNvbmZsaWN0IHdpdGggdGhlIFwidHlwZTFDb25mbGljdFwiXG4gKiBwcm9wZXJ0eS4gQSB0eXBlLTEgY29uZmxpY3QgaXMgb25lIHdoZXJlIGEgbm9uLWlubmVyIHNlZ21lbnQgY3Jvc3NlcyBhblxuICogaW5uZXIgc2VnbWVudC4gQW4gaW5uZXIgc2VnbWVudCBpcyBhbiBlZGdlIHdpdGggYm90aCBpbmNpZGVudCBub2RlcyBtYXJrZWRcbiAqIHdpdGggdGhlIFwiZHVtbXlcIiBwcm9wZXJ0eS5cbiAqXG4gKiBUaGlzIGFsZ29yaXRobSBzY2FucyBsYXllciBieSBsYXllciwgc3RhcnRpbmcgd2l0aCB0aGUgc2Vjb25kLCBmb3IgdHlwZS0xXG4gKiBjb25mbGljdHMgYmV0d2VlbiB0aGUgY3VycmVudCBsYXllciBhbmQgdGhlIHByZXZpb3VzIGxheWVyLiBGb3IgZWFjaCBsYXllclxuICogaXQgc2NhbnMgdGhlIG5vZGVzIGZyb20gbGVmdCB0byByaWdodCB1bnRpbCBpdCByZWFjaGVzIG9uZSB0aGF0IGlzIGluY2lkZW50XG4gKiBvbiBhbiBpbm5lciBzZWdtZW50LiBJdCB0aGVuIHNjYW5zIHByZWRlY2Vzc29ycyB0byBkZXRlcm1pbmUgaWYgdGhleSBoYXZlXG4gKiBlZGdlcyB0aGF0IGNyb3NzIHRoYXQgaW5uZXIgc2VnbWVudC4gQXQgdGhlIGVuZCBhIGZpbmFsIHNjYW4gaXMgZG9uZSBmb3IgYWxsXG4gKiBub2RlcyBvbiB0aGUgY3VycmVudCByYW5rIHRvIHNlZSBpZiB0aGV5IGNyb3NzIHRoZSBsYXN0IHZpc2l0ZWQgaW5uZXJcbiAqIHNlZ21lbnQuXG4gKlxuICogVGhpcyBhbGdvcml0aG0gKHNhZmVseSkgYXNzdW1lcyB0aGF0IGEgZHVtbXkgbm9kZSB3aWxsIG9ubHkgYmUgaW5jaWRlbnQgb24gYVxuICogc2luZ2xlIG5vZGUgaW4gdGhlIGxheWVycyBiZWluZyBzY2FubmVkLlxuICovXG5mdW5jdGlvbiBmaW5kVHlwZTFDb25mbGljdHMoZywgbGF5ZXJpbmcpIHtcbiAgdmFyIGNvbmZsaWN0cyA9IHt9O1xuXG4gIGZ1bmN0aW9uIHZpc2l0TGF5ZXIocHJldkxheWVyLCBsYXllcikge1xuICAgIHZhclxuICAgICAgLy8gbGFzdCB2aXNpdGVkIG5vZGUgaW4gdGhlIHByZXZpb3VzIGxheWVyIHRoYXQgaXMgaW5jaWRlbnQgb24gYW4gaW5uZXJcbiAgICAgIC8vIHNlZ21lbnQuXG4gICAgICBrMCA9IDAsXG4gICAgICAvLyBUcmFja3MgdGhlIGxhc3Qgbm9kZSBpbiB0aGlzIGxheWVyIHNjYW5uZWQgZm9yIGNyb3NzaW5ncyB3aXRoIGEgdHlwZS0xXG4gICAgICAvLyBzZWdtZW50LlxuICAgICAgc2NhblBvcyA9IDAsXG4gICAgICBwcmV2TGF5ZXJMZW5ndGggPSBwcmV2TGF5ZXIubGVuZ3RoLFxuICAgICAgbGFzdE5vZGUgPSBfLmxhc3QobGF5ZXIpO1xuXG4gICAgXy5mb3JFYWNoKGxheWVyLCBmdW5jdGlvbih2LCBpKSB7XG4gICAgICB2YXIgdyA9IGZpbmRPdGhlcklubmVyU2VnbWVudE5vZGUoZywgdiksXG4gICAgICAgIGsxID0gdyA/IGcubm9kZSh3KS5vcmRlciA6IHByZXZMYXllckxlbmd0aDtcblxuICAgICAgaWYgKHcgfHwgdiA9PT0gbGFzdE5vZGUpIHtcbiAgICAgICAgXy5mb3JFYWNoKGxheWVyLnNsaWNlKHNjYW5Qb3MsIGkgKzEpLCBmdW5jdGlvbihzY2FuTm9kZSkge1xuICAgICAgICAgIF8uZm9yRWFjaChnLnByZWRlY2Vzc29ycyhzY2FuTm9kZSksIGZ1bmN0aW9uKHUpIHtcbiAgICAgICAgICAgIHZhciB1TGFiZWwgPSBnLm5vZGUodSksXG4gICAgICAgICAgICAgIHVQb3MgPSB1TGFiZWwub3JkZXI7XG4gICAgICAgICAgICBpZiAoKHVQb3MgPCBrMCB8fCBrMSA8IHVQb3MpICYmXG4gICAgICAgICAgICAgICAgISh1TGFiZWwuZHVtbXkgJiYgZy5ub2RlKHNjYW5Ob2RlKS5kdW1teSkpIHtcbiAgICAgICAgICAgICAgYWRkQ29uZmxpY3QoY29uZmxpY3RzLCB1LCBzY2FuTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzY2FuUG9zID0gaSArIDE7XG4gICAgICAgIGswID0gazE7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbGF5ZXI7XG4gIH1cblxuICBfLnJlZHVjZShsYXllcmluZywgdmlzaXRMYXllcik7XG4gIHJldHVybiBjb25mbGljdHM7XG59XG5cbmZ1bmN0aW9uIGZpbmRUeXBlMkNvbmZsaWN0cyhnLCBsYXllcmluZykge1xuICB2YXIgY29uZmxpY3RzID0ge307XG5cbiAgZnVuY3Rpb24gc2Nhbihzb3V0aCwgc291dGhQb3MsIHNvdXRoRW5kLCBwcmV2Tm9ydGhCb3JkZXIsIG5leHROb3J0aEJvcmRlcikge1xuICAgIHZhciB2O1xuICAgIF8uZm9yRWFjaChfLnJhbmdlKHNvdXRoUG9zLCBzb3V0aEVuZCksIGZ1bmN0aW9uKGkpIHtcbiAgICAgIHYgPSBzb3V0aFtpXTtcbiAgICAgIGlmIChnLm5vZGUodikuZHVtbXkpIHtcbiAgICAgICAgXy5mb3JFYWNoKGcucHJlZGVjZXNzb3JzKHYpLCBmdW5jdGlvbih1KSB7XG4gICAgICAgICAgdmFyIHVOb2RlID0gZy5ub2RlKHUpO1xuICAgICAgICAgIGlmICh1Tm9kZS5kdW1teSAmJlxuICAgICAgICAgICAgICAodU5vZGUub3JkZXIgPCBwcmV2Tm9ydGhCb3JkZXIgfHwgdU5vZGUub3JkZXIgPiBuZXh0Tm9ydGhCb3JkZXIpKSB7XG4gICAgICAgICAgICBhZGRDb25mbGljdChjb25mbGljdHMsIHUsIHYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIHZpc2l0TGF5ZXIobm9ydGgsIHNvdXRoKSB7XG4gICAgdmFyIHByZXZOb3J0aFBvcyA9IC0xLFxuICAgICAgbmV4dE5vcnRoUG9zLFxuICAgICAgc291dGhQb3MgPSAwO1xuXG4gICAgXy5mb3JFYWNoKHNvdXRoLCBmdW5jdGlvbih2LCBzb3V0aExvb2thaGVhZCkge1xuICAgICAgaWYgKGcubm9kZSh2KS5kdW1teSA9PT0gXCJib3JkZXJcIikge1xuICAgICAgICB2YXIgcHJlZGVjZXNzb3JzID0gZy5wcmVkZWNlc3NvcnModik7XG4gICAgICAgIGlmIChwcmVkZWNlc3NvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgbmV4dE5vcnRoUG9zID0gZy5ub2RlKHByZWRlY2Vzc29yc1swXSkub3JkZXI7XG4gICAgICAgICAgc2Nhbihzb3V0aCwgc291dGhQb3MsIHNvdXRoTG9va2FoZWFkLCBwcmV2Tm9ydGhQb3MsIG5leHROb3J0aFBvcyk7XG4gICAgICAgICAgc291dGhQb3MgPSBzb3V0aExvb2thaGVhZDtcbiAgICAgICAgICBwcmV2Tm9ydGhQb3MgPSBuZXh0Tm9ydGhQb3M7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNjYW4oc291dGgsIHNvdXRoUG9zLCBzb3V0aC5sZW5ndGgsIG5leHROb3J0aFBvcywgbm9ydGgubGVuZ3RoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBzb3V0aDtcbiAgfVxuXG4gIF8ucmVkdWNlKGxheWVyaW5nLCB2aXNpdExheWVyKTtcbiAgcmV0dXJuIGNvbmZsaWN0cztcbn1cblxuZnVuY3Rpb24gZmluZE90aGVySW5uZXJTZWdtZW50Tm9kZShnLCB2KSB7XG4gIGlmIChnLm5vZGUodikuZHVtbXkpIHtcbiAgICByZXR1cm4gXy5maW5kKGcucHJlZGVjZXNzb3JzKHYpLCBmdW5jdGlvbih1KSB7XG4gICAgICByZXR1cm4gZy5ub2RlKHUpLmR1bW15O1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZENvbmZsaWN0KGNvbmZsaWN0cywgdiwgdykge1xuICBpZiAodiA+IHcpIHtcbiAgICB2YXIgdG1wID0gdjtcbiAgICB2ID0gdztcbiAgICB3ID0gdG1wO1xuICB9XG5cbiAgdmFyIGNvbmZsaWN0c1YgPSBjb25mbGljdHNbdl07XG4gIGlmICghY29uZmxpY3RzVikge1xuICAgIGNvbmZsaWN0c1t2XSA9IGNvbmZsaWN0c1YgPSB7fTtcbiAgfVxuICBjb25mbGljdHNWW3ddID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaGFzQ29uZmxpY3QoY29uZmxpY3RzLCB2LCB3KSB7XG4gIGlmICh2ID4gdykge1xuICAgIHZhciB0bXAgPSB2O1xuICAgIHYgPSB3O1xuICAgIHcgPSB0bXA7XG4gIH1cbiAgcmV0dXJuIF8uaGFzKGNvbmZsaWN0c1t2XSwgdyk7XG59XG5cbi8qXG4gKiBUcnkgdG8gYWxpZ24gbm9kZXMgaW50byB2ZXJ0aWNhbCBcImJsb2Nrc1wiIHdoZXJlIHBvc3NpYmxlLiBUaGlzIGFsZ29yaXRobVxuICogYXR0ZW1wdHMgdG8gYWxpZ24gYSBub2RlIHdpdGggb25lIG9mIGl0cyBtZWRpYW4gbmVpZ2hib3JzLiBJZiB0aGUgZWRnZVxuICogY29ubmVjdGluZyBhIG5laWdoYm9yIGlzIGEgdHlwZS0xIGNvbmZsaWN0IHRoZW4gd2UgaWdub3JlIHRoYXQgcG9zc2liaWxpdHkuXG4gKiBJZiBhIHByZXZpb3VzIG5vZGUgaGFzIGFscmVhZHkgZm9ybWVkIGEgYmxvY2sgd2l0aCBhIG5vZGUgYWZ0ZXIgdGhlIG5vZGVcbiAqIHdlJ3JlIHRyeWluZyB0byBmb3JtIGEgYmxvY2sgd2l0aCwgd2UgYWxzbyBpZ25vcmUgdGhhdCBwb3NzaWJpbGl0eSAtIG91clxuICogYmxvY2tzIHdvdWxkIGJlIHNwbGl0IGluIHRoYXQgc2NlbmFyaW8uXG4gKi9cbmZ1bmN0aW9uIHZlcnRpY2FsQWxpZ25tZW50KGcsIGxheWVyaW5nLCBjb25mbGljdHMsIG5laWdoYm9yRm4pIHtcbiAgdmFyIHJvb3QgPSB7fSxcbiAgICBhbGlnbiA9IHt9LFxuICAgIHBvcyA9IHt9O1xuXG4gIC8vIFdlIGNhY2hlIHRoZSBwb3NpdGlvbiBoZXJlIGJhc2VkIG9uIHRoZSBsYXllcmluZyBiZWNhdXNlIHRoZSBncmFwaCBhbmRcbiAgLy8gbGF5ZXJpbmcgbWF5IGJlIG91dCBvZiBzeW5jLiBUaGUgbGF5ZXJpbmcgbWF0cml4IGlzIG1hbmlwdWxhdGVkIHRvXG4gIC8vIGdlbmVyYXRlIGRpZmZlcmVudCBleHRyZW1lIGFsaWdubWVudHMuXG4gIF8uZm9yRWFjaChsYXllcmluZywgZnVuY3Rpb24obGF5ZXIpIHtcbiAgICBfLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYsIG9yZGVyKSB7XG4gICAgICByb290W3ZdID0gdjtcbiAgICAgIGFsaWduW3ZdID0gdjtcbiAgICAgIHBvc1t2XSA9IG9yZGVyO1xuICAgIH0pO1xuICB9KTtcblxuICBfLmZvckVhY2gobGF5ZXJpbmcsIGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgdmFyIHByZXZJZHggPSAtMTtcbiAgICBfLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYpIHtcbiAgICAgIHZhciB3cyA9IG5laWdoYm9yRm4odik7XG4gICAgICBpZiAod3MubGVuZ3RoKSB7XG4gICAgICAgIHdzID0gXy5zb3J0Qnkod3MsIGZ1bmN0aW9uKHcpIHsgcmV0dXJuIHBvc1t3XTsgfSk7XG4gICAgICAgIHZhciBtcCA9ICh3cy5sZW5ndGggLSAxKSAvIDI7XG4gICAgICAgIGZvciAodmFyIGkgPSBNYXRoLmZsb29yKG1wKSwgaWwgPSBNYXRoLmNlaWwobXApOyBpIDw9IGlsOyArK2kpIHtcbiAgICAgICAgICB2YXIgdyA9IHdzW2ldO1xuICAgICAgICAgIGlmIChhbGlnblt2XSA9PT0gdiAmJlxuICAgICAgICAgICAgICBwcmV2SWR4IDwgcG9zW3ddICYmXG4gICAgICAgICAgICAgICFoYXNDb25mbGljdChjb25mbGljdHMsIHYsIHcpKSB7XG4gICAgICAgICAgICBhbGlnblt3XSA9IHY7XG4gICAgICAgICAgICBhbGlnblt2XSA9IHJvb3Rbdl0gPSByb290W3ddO1xuICAgICAgICAgICAgcHJldklkeCA9IHBvc1t3XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgcm9vdDogcm9vdCwgYWxpZ246IGFsaWduIH07XG59XG5cbmZ1bmN0aW9uIGhvcml6b250YWxDb21wYWN0aW9uKGcsIGxheWVyaW5nLCByb290LCBhbGlnbiwgcmV2ZXJzZVNlcCkge1xuICAvLyBUaGlzIHBvcnRpb24gb2YgdGhlIGFsZ29yaXRobSBkaWZmZXJzIGZyb20gQksgZHVlIHRvIGEgbnVtYmVyIG9mIHByb2JsZW1zLlxuICAvLyBJbnN0ZWFkIG9mIHRoZWlyIGFsZ29yaXRobSB3ZSBjb25zdHJ1Y3QgYSBuZXcgYmxvY2sgZ3JhcGggYW5kIGRvIHR3b1xuICAvLyBzd2VlcHMuIFRoZSBmaXJzdCBzd2VlcCBwbGFjZXMgYmxvY2tzIHdpdGggdGhlIHNtYWxsZXN0IHBvc3NpYmxlXG4gIC8vIGNvb3JkaW5hdGVzLiBUaGUgc2Vjb25kIHN3ZWVwIHJlbW92ZXMgdW51c2VkIHNwYWNlIGJ5IG1vdmluZyBibG9ja3MgdG8gdGhlXG4gIC8vIGdyZWF0ZXN0IGNvb3JkaW5hdGVzIHdpdGhvdXQgdmlvbGF0aW5nIHNlcGFyYXRpb24uXG4gIHZhciB4cyA9IHt9LFxuICAgIGJsb2NrRyA9IGJ1aWxkQmxvY2tHcmFwaChnLCBsYXllcmluZywgcm9vdCwgcmV2ZXJzZVNlcCksXG4gICAgYm9yZGVyVHlwZSA9IHJldmVyc2VTZXAgPyBcImJvcmRlckxlZnRcIiA6IFwiYm9yZGVyUmlnaHRcIjtcblxuICBmdW5jdGlvbiBpdGVyYXRlKHNldFhzRnVuYywgbmV4dE5vZGVzRnVuYykge1xuICAgIHZhciBzdGFjayA9IGJsb2NrRy5ub2RlcygpO1xuICAgIHZhciBlbGVtID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgICB3aGlsZSAoZWxlbSkge1xuICAgICAgaWYgKHZpc2l0ZWRbZWxlbV0pIHtcbiAgICAgICAgc2V0WHNGdW5jKGVsZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmlzaXRlZFtlbGVtXSA9IHRydWU7XG4gICAgICAgIHN0YWNrLnB1c2goZWxlbSk7XG4gICAgICAgIHN0YWNrID0gc3RhY2suY29uY2F0KG5leHROb2Rlc0Z1bmMoZWxlbSkpO1xuICAgICAgfVxuXG4gICAgICBlbGVtID0gc3RhY2sucG9wKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRmlyc3QgcGFzcywgYXNzaWduIHNtYWxsZXN0IGNvb3JkaW5hdGVzXG4gIGZ1bmN0aW9uIHBhc3MxKGVsZW0pIHtcbiAgICB4c1tlbGVtXSA9IGJsb2NrRy5pbkVkZ2VzKGVsZW0pLnJlZHVjZShmdW5jdGlvbihhY2MsIGUpIHtcbiAgICAgIHJldHVybiBNYXRoLm1heChhY2MsIHhzW2Uudl0gKyBibG9ja0cuZWRnZShlKSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvLyBTZWNvbmQgcGFzcywgYXNzaWduIGdyZWF0ZXN0IGNvb3JkaW5hdGVzXG4gIGZ1bmN0aW9uIHBhc3MyKGVsZW0pIHtcbiAgICB2YXIgbWluID0gYmxvY2tHLm91dEVkZ2VzKGVsZW0pLnJlZHVjZShmdW5jdGlvbihhY2MsIGUpIHtcbiAgICAgIHJldHVybiBNYXRoLm1pbihhY2MsIHhzW2Uud10gLSBibG9ja0cuZWRnZShlKSk7XG4gICAgfSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcblxuICAgIHZhciBub2RlID0gZy5ub2RlKGVsZW0pO1xuICAgIGlmIChtaW4gIT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSAmJiBub2RlLmJvcmRlclR5cGUgIT09IGJvcmRlclR5cGUpIHtcbiAgICAgIHhzW2VsZW1dID0gTWF0aC5tYXgoeHNbZWxlbV0sIG1pbik7XG4gICAgfVxuICB9XG5cbiAgaXRlcmF0ZShwYXNzMSwgYmxvY2tHLnByZWRlY2Vzc29ycy5iaW5kKGJsb2NrRykpO1xuICBpdGVyYXRlKHBhc3MyLCBibG9ja0cuc3VjY2Vzc29ycy5iaW5kKGJsb2NrRykpO1xuXG4gIC8vIEFzc2lnbiB4IGNvb3JkaW5hdGVzIHRvIGFsbCBub2Rlc1xuICBfLmZvckVhY2goYWxpZ24sIGZ1bmN0aW9uKHYpIHtcbiAgICB4c1t2XSA9IHhzW3Jvb3Rbdl1dO1xuICB9KTtcblxuICByZXR1cm4geHM7XG59XG5cblxuZnVuY3Rpb24gYnVpbGRCbG9ja0dyYXBoKGcsIGxheWVyaW5nLCByb290LCByZXZlcnNlU2VwKSB7XG4gIHZhciBibG9ja0dyYXBoID0gbmV3IEdyYXBoKCksXG4gICAgZ3JhcGhMYWJlbCA9IGcuZ3JhcGgoKSxcbiAgICBzZXBGbiA9IHNlcChncmFwaExhYmVsLm5vZGVzZXAsIGdyYXBoTGFiZWwuZWRnZXNlcCwgcmV2ZXJzZVNlcCk7XG5cbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIHZhciB1O1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odikge1xuICAgICAgdmFyIHZSb290ID0gcm9vdFt2XTtcbiAgICAgIGJsb2NrR3JhcGguc2V0Tm9kZSh2Um9vdCk7XG4gICAgICBpZiAodSkge1xuICAgICAgICB2YXIgdVJvb3QgPSByb290W3VdLFxuICAgICAgICAgIHByZXZNYXggPSBibG9ja0dyYXBoLmVkZ2UodVJvb3QsIHZSb290KTtcbiAgICAgICAgYmxvY2tHcmFwaC5zZXRFZGdlKHVSb290LCB2Um9vdCwgTWF0aC5tYXgoc2VwRm4oZywgdiwgdSksIHByZXZNYXggfHwgMCkpO1xuICAgICAgfVxuICAgICAgdSA9IHY7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiBibG9ja0dyYXBoO1xufVxuXG4vKlxuICogUmV0dXJucyB0aGUgYWxpZ25tZW50IHRoYXQgaGFzIHRoZSBzbWFsbGVzdCB3aWR0aCBvZiB0aGUgZ2l2ZW4gYWxpZ25tZW50cy5cbiAqL1xuZnVuY3Rpb24gZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQoZywgeHNzKSB7XG4gIHJldHVybiBfLm1pbkJ5KF8udmFsdWVzKHhzcyksIGZ1bmN0aW9uICh4cykge1xuICAgIHZhciBtYXggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgdmFyIG1pbiA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblxuICAgIF8uZm9ySW4oeHMsIGZ1bmN0aW9uICh4LCB2KSB7XG4gICAgICB2YXIgaGFsZldpZHRoID0gd2lkdGgoZywgdikgLyAyO1xuXG4gICAgICBtYXggPSBNYXRoLm1heCh4ICsgaGFsZldpZHRoLCBtYXgpO1xuICAgICAgbWluID0gTWF0aC5taW4oeCAtIGhhbGZXaWR0aCwgbWluKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtYXggLSBtaW47XG4gIH0pO1xufVxuXG4vKlxuICogQWxpZ24gdGhlIGNvb3JkaW5hdGVzIG9mIGVhY2ggb2YgdGhlIGxheW91dCBhbGlnbm1lbnRzIHN1Y2ggdGhhdFxuICogbGVmdC1iaWFzZWQgYWxpZ25tZW50cyBoYXZlIHRoZWlyIG1pbmltdW0gY29vcmRpbmF0ZSBhdCB0aGUgc2FtZSBwb2ludCBhc1xuICogdGhlIG1pbmltdW0gY29vcmRpbmF0ZSBvZiB0aGUgc21hbGxlc3Qgd2lkdGggYWxpZ25tZW50IGFuZCByaWdodC1iaWFzZWRcbiAqIGFsaWdubWVudHMgaGF2ZSB0aGVpciBtYXhpbXVtIGNvb3JkaW5hdGUgYXQgdGhlIHNhbWUgcG9pbnQgYXMgdGhlIG1heGltdW1cbiAqIGNvb3JkaW5hdGUgb2YgdGhlIHNtYWxsZXN0IHdpZHRoIGFsaWdubWVudC5cbiAqL1xuZnVuY3Rpb24gYWxpZ25Db29yZGluYXRlcyh4c3MsIGFsaWduVG8pIHtcbiAgdmFyIGFsaWduVG9WYWxzID0gXy52YWx1ZXMoYWxpZ25UbyksXG4gICAgYWxpZ25Ub01pbiA9IF8ubWluKGFsaWduVG9WYWxzKSxcbiAgICBhbGlnblRvTWF4ID0gXy5tYXgoYWxpZ25Ub1ZhbHMpO1xuXG4gIF8uZm9yRWFjaChbXCJ1XCIsIFwiZFwiXSwgZnVuY3Rpb24odmVydCkge1xuICAgIF8uZm9yRWFjaChbXCJsXCIsIFwiclwiXSwgZnVuY3Rpb24oaG9yaXopIHtcbiAgICAgIHZhciBhbGlnbm1lbnQgPSB2ZXJ0ICsgaG9yaXosXG4gICAgICAgIHhzID0geHNzW2FsaWdubWVudF0sXG4gICAgICAgIGRlbHRhO1xuICAgICAgaWYgKHhzID09PSBhbGlnblRvKSByZXR1cm47XG5cbiAgICAgIHZhciB4c1ZhbHMgPSBfLnZhbHVlcyh4cyk7XG4gICAgICBkZWx0YSA9IGhvcml6ID09PSBcImxcIiA/IGFsaWduVG9NaW4gLSBfLm1pbih4c1ZhbHMpIDogYWxpZ25Ub01heCAtIF8ubWF4KHhzVmFscyk7XG5cbiAgICAgIGlmIChkZWx0YSkge1xuICAgICAgICB4c3NbYWxpZ25tZW50XSA9IF8ubWFwVmFsdWVzKHhzLCBmdW5jdGlvbih4KSB7IHJldHVybiB4ICsgZGVsdGE7IH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYmFsYW5jZSh4c3MsIGFsaWduKSB7XG4gIHJldHVybiBfLm1hcFZhbHVlcyh4c3MudWwsIGZ1bmN0aW9uKGlnbm9yZSwgdikge1xuICAgIGlmIChhbGlnbikge1xuICAgICAgcmV0dXJuIHhzc1thbGlnbi50b0xvd2VyQ2FzZSgpXVt2XTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHhzID0gXy5zb3J0QnkoXy5tYXAoeHNzLCB2KSk7XG4gICAgICByZXR1cm4gKHhzWzFdICsgeHNbMl0pIC8gMjtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwb3NpdGlvblgoZykge1xuICB2YXIgbGF5ZXJpbmcgPSB1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7XG4gIHZhciBjb25mbGljdHMgPSBfLm1lcmdlKFxuICAgIGZpbmRUeXBlMUNvbmZsaWN0cyhnLCBsYXllcmluZyksXG4gICAgZmluZFR5cGUyQ29uZmxpY3RzKGcsIGxheWVyaW5nKSk7XG5cbiAgdmFyIHhzcyA9IHt9O1xuICB2YXIgYWRqdXN0ZWRMYXllcmluZztcbiAgXy5mb3JFYWNoKFtcInVcIiwgXCJkXCJdLCBmdW5jdGlvbih2ZXJ0KSB7XG4gICAgYWRqdXN0ZWRMYXllcmluZyA9IHZlcnQgPT09IFwidVwiID8gbGF5ZXJpbmcgOiBfLnZhbHVlcyhsYXllcmluZykucmV2ZXJzZSgpO1xuICAgIF8uZm9yRWFjaChbXCJsXCIsIFwiclwiXSwgZnVuY3Rpb24oaG9yaXopIHtcbiAgICAgIGlmIChob3JpeiA9PT0gXCJyXCIpIHtcbiAgICAgICAgYWRqdXN0ZWRMYXllcmluZyA9IF8ubWFwKGFkanVzdGVkTGF5ZXJpbmcsIGZ1bmN0aW9uKGlubmVyKSB7XG4gICAgICAgICAgcmV0dXJuIF8udmFsdWVzKGlubmVyKS5yZXZlcnNlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmVpZ2hib3JGbiA9ICh2ZXJ0ID09PSBcInVcIiA/IGcucHJlZGVjZXNzb3JzIDogZy5zdWNjZXNzb3JzKS5iaW5kKGcpO1xuICAgICAgdmFyIGFsaWduID0gdmVydGljYWxBbGlnbm1lbnQoZywgYWRqdXN0ZWRMYXllcmluZywgY29uZmxpY3RzLCBuZWlnaGJvckZuKTtcbiAgICAgIHZhciB4cyA9IGhvcml6b250YWxDb21wYWN0aW9uKGcsIGFkanVzdGVkTGF5ZXJpbmcsXG4gICAgICAgIGFsaWduLnJvb3QsIGFsaWduLmFsaWduLCBob3JpeiA9PT0gXCJyXCIpO1xuICAgICAgaWYgKGhvcml6ID09PSBcInJcIikge1xuICAgICAgICB4cyA9IF8ubWFwVmFsdWVzKHhzLCBmdW5jdGlvbih4KSB7IHJldHVybiAteDsgfSk7XG4gICAgICB9XG4gICAgICB4c3NbdmVydCArIGhvcml6XSA9IHhzO1xuICAgIH0pO1xuICB9KTtcblxuICB2YXIgc21hbGxlc3RXaWR0aCA9IGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50KGcsIHhzcyk7XG4gIGFsaWduQ29vcmRpbmF0ZXMoeHNzLCBzbWFsbGVzdFdpZHRoKTtcbiAgcmV0dXJuIGJhbGFuY2UoeHNzLCBnLmdyYXBoKCkuYWxpZ24pO1xufVxuXG5mdW5jdGlvbiBzZXAobm9kZVNlcCwgZWRnZVNlcCwgcmV2ZXJzZVNlcCkge1xuICByZXR1cm4gZnVuY3Rpb24oZywgdiwgdykge1xuICAgIHZhciB2TGFiZWwgPSBnLm5vZGUodik7XG4gICAgdmFyIHdMYWJlbCA9IGcubm9kZSh3KTtcbiAgICB2YXIgc3VtID0gMDtcbiAgICB2YXIgZGVsdGE7XG5cbiAgICBzdW0gKz0gdkxhYmVsLndpZHRoIC8gMjtcbiAgICBpZiAoXy5oYXModkxhYmVsLCBcImxhYmVscG9zXCIpKSB7XG4gICAgICBzd2l0Y2ggKHZMYWJlbC5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlIFwibFwiOiBkZWx0YSA9IC12TGFiZWwud2lkdGggLyAyOyBicmVhaztcbiAgICAgIGNhc2UgXCJyXCI6IGRlbHRhID0gdkxhYmVsLndpZHRoIC8gMjsgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWx0YSkge1xuICAgICAgc3VtICs9IHJldmVyc2VTZXAgPyBkZWx0YSA6IC1kZWx0YTtcbiAgICB9XG4gICAgZGVsdGEgPSAwO1xuXG4gICAgc3VtICs9ICh2TGFiZWwuZHVtbXkgPyBlZGdlU2VwIDogbm9kZVNlcCkgLyAyO1xuICAgIHN1bSArPSAod0xhYmVsLmR1bW15ID8gZWRnZVNlcCA6IG5vZGVTZXApIC8gMjtcblxuICAgIHN1bSArPSB3TGFiZWwud2lkdGggLyAyO1xuICAgIGlmIChfLmhhcyh3TGFiZWwsIFwibGFiZWxwb3NcIikpIHtcbiAgICAgIHN3aXRjaCAod0xhYmVsLmxhYmVscG9zLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgXCJsXCI6IGRlbHRhID0gd0xhYmVsLndpZHRoIC8gMjsgYnJlYWs7XG4gICAgICBjYXNlIFwiclwiOiBkZWx0YSA9IC13TGFiZWwud2lkdGggLyAyOyBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbHRhKSB7XG4gICAgICBzdW0gKz0gcmV2ZXJzZVNlcCA/IGRlbHRhIDogLWRlbHRhO1xuICAgIH1cbiAgICBkZWx0YSA9IDA7XG5cbiAgICByZXR1cm4gc3VtO1xuICB9O1xufVxuXG5mdW5jdGlvbiB3aWR0aChnLCB2KSB7XG4gIHJldHVybiBnLm5vZGUodikud2lkdGg7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcbnZhciBwb3NpdGlvblggPSByZXF1aXJlKFwiLi9ia1wiKS5wb3NpdGlvblg7XG5cbm1vZHVsZS5leHBvcnRzID0gcG9zaXRpb247XG5cbmZ1bmN0aW9uIHBvc2l0aW9uKGcpIHtcbiAgZyA9IHV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpO1xuXG4gIHBvc2l0aW9uWShnKTtcbiAgXy5mb3JFYWNoKHBvc2l0aW9uWChnKSwgZnVuY3Rpb24oeCwgdikge1xuICAgIGcubm9kZSh2KS54ID0geDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBvc2l0aW9uWShnKSB7XG4gIHZhciBsYXllcmluZyA9IHV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtcbiAgdmFyIHJhbmtTZXAgPSBnLmdyYXBoKCkucmFua3NlcDtcbiAgdmFyIHByZXZZID0gMDtcbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIHZhciBtYXhIZWlnaHQgPSBfLm1heChfLm1hcChsYXllciwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpLmhlaWdodDsgfSkpO1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odikge1xuICAgICAgZy5ub2RlKHYpLnkgPSBwcmV2WSArIG1heEhlaWdodCAvIDI7XG4gICAgfSk7XG4gICAgcHJldlkgKz0gbWF4SGVpZ2h0ICsgcmFua1NlcDtcbiAgfSk7XG59XG5cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuR3JhcGg7XG52YXIgc2xhY2sgPSByZXF1aXJlKFwiLi91dGlsXCIpLnNsYWNrO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZlYXNpYmxlVHJlZTtcblxuLypcbiAqIENvbnN0cnVjdHMgYSBzcGFubmluZyB0cmVlIHdpdGggdGlnaHQgZWRnZXMgYW5kIGFkanVzdGVkIHRoZSBpbnB1dCBub2RlJ3NcbiAqIHJhbmtzIHRvIGFjaGlldmUgdGhpcy4gQSB0aWdodCBlZGdlIGlzIG9uZSB0aGF0IGlzIGhhcyBhIGxlbmd0aCB0aGF0IG1hdGNoZXNcbiAqIGl0cyBcIm1pbmxlblwiIGF0dHJpYnV0ZS5cbiAqXG4gKiBUaGUgYmFzaWMgc3RydWN0dXJlIGZvciB0aGlzIGZ1bmN0aW9uIGlzIGRlcml2ZWQgZnJvbSBHYW5zbmVyLCBldCBhbC4sIFwiQVxuICogVGVjaG5pcXVlIGZvciBEcmF3aW5nIERpcmVjdGVkIEdyYXBocy5cIlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEdyYXBoIG11c3QgYmUgYSBEQUcuXG4gKiAgICAyLiBHcmFwaCBtdXN0IGJlIGNvbm5lY3RlZC5cbiAqICAgIDMuIEdyYXBoIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbm9kZS5cbiAqICAgIDUuIEdyYXBoIG5vZGVzIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgYXNzaWduZWQgYSBcInJhbmtcIiBwcm9wZXJ0eSB0aGF0XG4gKiAgICAgICByZXNwZWN0cyB0aGUgXCJtaW5sZW5cIiBwcm9wZXJ0eSBvZiBpbmNpZGVudCBlZGdlcy5cbiAqICAgIDYuIEdyYXBoIGVkZ2VzIG11c3QgaGF2ZSBhIFwibWlubGVuXCIgcHJvcGVydHkuXG4gKlxuICogUG9zdC1jb25kaXRpb25zOlxuICpcbiAqICAgIC0gR3JhcGggbm9kZXMgd2lsbCBoYXZlIHRoZWlyIHJhbmsgYWRqdXN0ZWQgdG8gZW5zdXJlIHRoYXQgYWxsIGVkZ2VzIGFyZVxuICogICAgICB0aWdodC5cbiAqXG4gKiBSZXR1cm5zIGEgdHJlZSAodW5kaXJlY3RlZCBncmFwaCkgdGhhdCBpcyBjb25zdHJ1Y3RlZCB1c2luZyBvbmx5IFwidGlnaHRcIlxuICogZWRnZXMuXG4gKi9cbmZ1bmN0aW9uIGZlYXNpYmxlVHJlZShnKSB7XG4gIHZhciB0ID0gbmV3IEdyYXBoKHsgZGlyZWN0ZWQ6IGZhbHNlIH0pO1xuXG4gIC8vIENob29zZSBhcmJpdHJhcnkgbm9kZSBmcm9tIHdoaWNoIHRvIHN0YXJ0IG91ciB0cmVlXG4gIHZhciBzdGFydCA9IGcubm9kZXMoKVswXTtcbiAgdmFyIHNpemUgPSBnLm5vZGVDb3VudCgpO1xuICB0LnNldE5vZGUoc3RhcnQsIHt9KTtcblxuICB2YXIgZWRnZSwgZGVsdGE7XG4gIHdoaWxlICh0aWdodFRyZWUodCwgZykgPCBzaXplKSB7XG4gICAgZWRnZSA9IGZpbmRNaW5TbGFja0VkZ2UodCwgZyk7XG4gICAgZGVsdGEgPSB0Lmhhc05vZGUoZWRnZS52KSA/IHNsYWNrKGcsIGVkZ2UpIDogLXNsYWNrKGcsIGVkZ2UpO1xuICAgIHNoaWZ0UmFua3ModCwgZywgZGVsdGEpO1xuICB9XG5cbiAgcmV0dXJuIHQ7XG59XG5cbi8qXG4gKiBGaW5kcyBhIG1heGltYWwgdHJlZSBvZiB0aWdodCBlZGdlcyBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZVxuICogdHJlZS5cbiAqL1xuZnVuY3Rpb24gdGlnaHRUcmVlKHQsIGcpIHtcbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICBfLmZvckVhY2goZy5ub2RlRWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHZhciBlZGdlViA9IGUudixcbiAgICAgICAgdyA9ICh2ID09PSBlZGdlVikgPyBlLncgOiBlZGdlVjtcbiAgICAgIGlmICghdC5oYXNOb2RlKHcpICYmICFzbGFjayhnLCBlKSkge1xuICAgICAgICB0LnNldE5vZGUodywge30pO1xuICAgICAgICB0LnNldEVkZ2Uodiwgdywge30pO1xuICAgICAgICBkZnModyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBfLmZvckVhY2godC5ub2RlcygpLCBkZnMpO1xuICByZXR1cm4gdC5ub2RlQ291bnQoKTtcbn1cblxuLypcbiAqIEZpbmRzIHRoZSBlZGdlIHdpdGggdGhlIHNtYWxsZXN0IHNsYWNrIHRoYXQgaXMgaW5jaWRlbnQgb24gdHJlZSBhbmQgcmV0dXJuc1xuICogaXQuXG4gKi9cbmZ1bmN0aW9uIGZpbmRNaW5TbGFja0VkZ2UodCwgZykge1xuICByZXR1cm4gXy5taW5CeShnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAodC5oYXNOb2RlKGUudikgIT09IHQuaGFzTm9kZShlLncpKSB7XG4gICAgICByZXR1cm4gc2xhY2soZywgZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2hpZnRSYW5rcyh0LCBnLCBkZWx0YSkge1xuICBfLmZvckVhY2godC5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgZy5ub2RlKHYpLnJhbmsgKz0gZGVsdGE7XG4gIH0pO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciByYW5rVXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG52YXIgbG9uZ2VzdFBhdGggPSByYW5rVXRpbC5sb25nZXN0UGF0aDtcbnZhciBmZWFzaWJsZVRyZWUgPSByZXF1aXJlKFwiLi9mZWFzaWJsZS10cmVlXCIpO1xudmFyIG5ldHdvcmtTaW1wbGV4ID0gcmVxdWlyZShcIi4vbmV0d29yay1zaW1wbGV4XCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJhbms7XG5cbi8qXG4gKiBBc3NpZ25zIGEgcmFuayB0byBlYWNoIG5vZGUgaW4gdGhlIGlucHV0IGdyYXBoIHRoYXQgcmVzcGVjdHMgdGhlIFwibWlubGVuXCJcbiAqIGNvbnN0cmFpbnQgc3BlY2lmaWVkIG9uIGVkZ2VzIGJldHdlZW4gbm9kZXMuXG4gKlxuICogVGhpcyBiYXNpYyBzdHJ1Y3R1cmUgaXMgZGVyaXZlZCBmcm9tIEdhbnNuZXIsIGV0IGFsLiwgXCJBIFRlY2huaXF1ZSBmb3JcbiAqIERyYXdpbmcgRGlyZWN0ZWQgR3JhcGhzLlwiXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gR3JhcGggbXVzdCBiZSBhIGNvbm5lY3RlZCBEQUdcbiAqICAgIDIuIEdyYXBoIG5vZGVzIG11c3QgYmUgb2JqZWN0c1xuICogICAgMy4gR3JhcGggZWRnZXMgbXVzdCBoYXZlIFwid2VpZ2h0XCIgYW5kIFwibWlubGVuXCIgYXR0cmlidXRlc1xuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBHcmFwaCBub2RlcyB3aWxsIGhhdmUgYSBcInJhbmtcIiBhdHRyaWJ1dGUgYmFzZWQgb24gdGhlIHJlc3VsdHMgb2YgdGhlXG4gKiAgICAgICBhbGdvcml0aG0uIFJhbmtzIGNhbiBzdGFydCBhdCBhbnkgaW5kZXggKGluY2x1ZGluZyBuZWdhdGl2ZSksIHdlJ2xsXG4gKiAgICAgICBmaXggdGhlbSB1cCBsYXRlci5cbiAqL1xuZnVuY3Rpb24gcmFuayhnKSB7XG4gIHN3aXRjaChnLmdyYXBoKCkucmFua2VyKSB7XG4gIGNhc2UgXCJuZXR3b3JrLXNpbXBsZXhcIjogbmV0d29ya1NpbXBsZXhSYW5rZXIoZyk7IGJyZWFrO1xuICBjYXNlIFwidGlnaHQtdHJlZVwiOiB0aWdodFRyZWVSYW5rZXIoZyk7IGJyZWFrO1xuICBjYXNlIFwibG9uZ2VzdC1wYXRoXCI6IGxvbmdlc3RQYXRoUmFua2VyKGcpOyBicmVhaztcbiAgZGVmYXVsdDogbmV0d29ya1NpbXBsZXhSYW5rZXIoZyk7XG4gIH1cbn1cblxuLy8gQSBmYXN0IGFuZCBzaW1wbGUgcmFua2VyLCBidXQgcmVzdWx0cyBhcmUgZmFyIGZyb20gb3B0aW1hbC5cbnZhciBsb25nZXN0UGF0aFJhbmtlciA9IGxvbmdlc3RQYXRoO1xuXG5mdW5jdGlvbiB0aWdodFRyZWVSYW5rZXIoZykge1xuICBsb25nZXN0UGF0aChnKTtcbiAgZmVhc2libGVUcmVlKGcpO1xufVxuXG5mdW5jdGlvbiBuZXR3b3JrU2ltcGxleFJhbmtlcihnKSB7XG4gIG5ldHdvcmtTaW1wbGV4KGcpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciBmZWFzaWJsZVRyZWUgPSByZXF1aXJlKFwiLi9mZWFzaWJsZS10cmVlXCIpO1xudmFyIHNsYWNrID0gcmVxdWlyZShcIi4vdXRpbFwiKS5zbGFjaztcbnZhciBpbml0UmFuayA9IHJlcXVpcmUoXCIuL3V0aWxcIikubG9uZ2VzdFBhdGg7XG52YXIgcHJlb3JkZXIgPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuYWxnLnByZW9yZGVyO1xudmFyIHBvc3RvcmRlciA9IHJlcXVpcmUoXCIuLi9ncmFwaGxpYlwiKS5hbGcucG9zdG9yZGVyO1xudmFyIHNpbXBsaWZ5ID0gcmVxdWlyZShcIi4uL3V0aWxcIikuc2ltcGxpZnk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV0d29ya1NpbXBsZXg7XG5cbi8vIEV4cG9zZSBzb21lIGludGVybmFscyBmb3IgdGVzdGluZyBwdXJwb3Nlc1xubmV0d29ya1NpbXBsZXguaW5pdExvd0xpbVZhbHVlcyA9IGluaXRMb3dMaW1WYWx1ZXM7XG5uZXR3b3JrU2ltcGxleC5pbml0Q3V0VmFsdWVzID0gaW5pdEN1dFZhbHVlcztcbm5ldHdvcmtTaW1wbGV4LmNhbGNDdXRWYWx1ZSA9IGNhbGNDdXRWYWx1ZTtcbm5ldHdvcmtTaW1wbGV4LmxlYXZlRWRnZSA9IGxlYXZlRWRnZTtcbm5ldHdvcmtTaW1wbGV4LmVudGVyRWRnZSA9IGVudGVyRWRnZTtcbm5ldHdvcmtTaW1wbGV4LmV4Y2hhbmdlRWRnZXMgPSBleGNoYW5nZUVkZ2VzO1xuXG4vKlxuICogVGhlIG5ldHdvcmsgc2ltcGxleCBhbGdvcml0aG0gYXNzaWducyByYW5rcyB0byBlYWNoIG5vZGUgaW4gdGhlIGlucHV0IGdyYXBoXG4gKiBhbmQgaXRlcmF0aXZlbHkgaW1wcm92ZXMgdGhlIHJhbmtpbmcgdG8gcmVkdWNlIHRoZSBsZW5ndGggb2YgZWRnZXMuXG4gKlxuICogUHJlY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBUaGUgaW5wdXQgZ3JhcGggbXVzdCBiZSBhIERBRy5cbiAqICAgIDIuIEFsbCBub2RlcyBpbiB0aGUgZ3JhcGggbXVzdCBoYXZlIGFuIG9iamVjdCB2YWx1ZS5cbiAqICAgIDMuIEFsbCBlZGdlcyBpbiB0aGUgZ3JhcGggbXVzdCBoYXZlIFwibWlubGVuXCIgYW5kIFwid2VpZ2h0XCIgYXR0cmlidXRlcy5cbiAqXG4gKiBQb3N0Y29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBBbGwgbm9kZXMgaW4gdGhlIGdyYXBoIHdpbGwgaGF2ZSBhbiBhc3NpZ25lZCBcInJhbmtcIiBhdHRyaWJ1dGUgdGhhdCBoYXNcbiAqICAgICAgIGJlZW4gb3B0aW1pemVkIGJ5IHRoZSBuZXR3b3JrIHNpbXBsZXggYWxnb3JpdGhtLiBSYW5rcyBzdGFydCBhdCAwLlxuICpcbiAqXG4gKiBBIHJvdWdoIHNrZXRjaCBvZiB0aGUgYWxnb3JpdGhtIGlzIGFzIGZvbGxvd3M6XG4gKlxuICogICAgMS4gQXNzaWduIGluaXRpYWwgcmFua3MgdG8gZWFjaCBub2RlLiBXZSB1c2UgdGhlIGxvbmdlc3QgcGF0aCBhbGdvcml0aG0sXG4gKiAgICAgICB3aGljaCBhc3NpZ25zIHJhbmtzIHRvIHRoZSBsb3dlc3QgcG9zaXRpb24gcG9zc2libGUuIEluIGdlbmVyYWwgdGhpc1xuICogICAgICAgbGVhZHMgdG8gdmVyeSB3aWRlIGJvdHRvbSByYW5rcyBhbmQgdW5uZWNlc3NhcmlseSBsb25nIGVkZ2VzLlxuICogICAgMi4gQ29uc3RydWN0IGEgZmVhc2libGUgdGlnaHQgdHJlZS4gQSB0aWdodCB0cmVlIGlzIG9uZSBzdWNoIHRoYXQgYWxsXG4gKiAgICAgICBlZGdlcyBpbiB0aGUgdHJlZSBoYXZlIG5vIHNsYWNrIChkaWZmZXJlbmNlIGJldHdlZW4gbGVuZ3RoIG9mIGVkZ2VcbiAqICAgICAgIGFuZCBtaW5sZW4gZm9yIHRoZSBlZGdlKS4gVGhpcyBieSBpdHNlbGYgZ3JlYXRseSBpbXByb3ZlcyB0aGUgYXNzaWduZWRcbiAqICAgICAgIHJhbmtpbmdzIGJ5IHNob3J0aW5nIGVkZ2VzLlxuICogICAgMy4gSXRlcmF0aXZlbHkgZmluZCBlZGdlcyB0aGF0IGhhdmUgbmVnYXRpdmUgY3V0IHZhbHVlcy4gR2VuZXJhbGx5IGFcbiAqICAgICAgIG5lZ2F0aXZlIGN1dCB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZWRnZSBjb3VsZCBiZSByZW1vdmVkIGFuZCBhIG5ld1xuICogICAgICAgdHJlZSBlZGdlIGNvdWxkIGJlIGFkZGVkIHRvIHByb2R1Y2UgYSBtb3JlIGNvbXBhY3QgZ3JhcGguXG4gKlxuICogTXVjaCBvZiB0aGUgYWxnb3JpdGhtcyBoZXJlIGFyZSBkZXJpdmVkIGZyb20gR2Fuc25lciwgZXQgYWwuLCBcIkEgVGVjaG5pcXVlXG4gKiBmb3IgRHJhd2luZyBEaXJlY3RlZCBHcmFwaHMuXCIgVGhlIHN0cnVjdHVyZSBvZiB0aGUgZmlsZSByb3VnaGx5IGZvbGxvd3MgdGhlXG4gKiBzdHJ1Y3R1cmUgb2YgdGhlIG92ZXJhbGwgYWxnb3JpdGhtLlxuICovXG5mdW5jdGlvbiBuZXR3b3JrU2ltcGxleChnKSB7XG4gIGcgPSBzaW1wbGlmeShnKTtcbiAgaW5pdFJhbmsoZyk7XG4gIHZhciB0ID0gZmVhc2libGVUcmVlKGcpO1xuICBpbml0TG93TGltVmFsdWVzKHQpO1xuICBpbml0Q3V0VmFsdWVzKHQsIGcpO1xuXG4gIHZhciBlLCBmO1xuICB3aGlsZSAoKGUgPSBsZWF2ZUVkZ2UodCkpKSB7XG4gICAgZiA9IGVudGVyRWRnZSh0LCBnLCBlKTtcbiAgICBleGNoYW5nZUVkZ2VzKHQsIGcsIGUsIGYpO1xuICB9XG59XG5cbi8qXG4gKiBJbml0aWFsaXplcyBjdXQgdmFsdWVzIGZvciBhbGwgZWRnZXMgaW4gdGhlIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDdXRWYWx1ZXModCwgZykge1xuICB2YXIgdnMgPSBwb3N0b3JkZXIodCwgdC5ub2RlcygpKTtcbiAgdnMgPSB2cy5zbGljZSgwLCB2cy5sZW5ndGggLSAxKTtcbiAgXy5mb3JFYWNoKHZzLCBmdW5jdGlvbih2KSB7XG4gICAgYXNzaWduQ3V0VmFsdWUodCwgZywgdik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25DdXRWYWx1ZSh0LCBnLCBjaGlsZCkge1xuICB2YXIgY2hpbGRMYWIgPSB0Lm5vZGUoY2hpbGQpO1xuICB2YXIgcGFyZW50ID0gY2hpbGRMYWIucGFyZW50O1xuICB0LmVkZ2UoY2hpbGQsIHBhcmVudCkuY3V0dmFsdWUgPSBjYWxjQ3V0VmFsdWUodCwgZywgY2hpbGQpO1xufVxuXG4vKlxuICogR2l2ZW4gdGhlIHRpZ2h0IHRyZWUsIGl0cyBncmFwaCwgYW5kIGEgY2hpbGQgaW4gdGhlIGdyYXBoIGNhbGN1bGF0ZSBhbmRcbiAqIHJldHVybiB0aGUgY3V0IHZhbHVlIGZvciB0aGUgZWRnZSBiZXR3ZWVuIHRoZSBjaGlsZCBhbmQgaXRzIHBhcmVudC5cbiAqL1xuZnVuY3Rpb24gY2FsY0N1dFZhbHVlKHQsIGcsIGNoaWxkKSB7XG4gIHZhciBjaGlsZExhYiA9IHQubm9kZShjaGlsZCk7XG4gIHZhciBwYXJlbnQgPSBjaGlsZExhYi5wYXJlbnQ7XG4gIC8vIFRydWUgaWYgdGhlIGNoaWxkIGlzIG9uIHRoZSB0YWlsIGVuZCBvZiB0aGUgZWRnZSBpbiB0aGUgZGlyZWN0ZWQgZ3JhcGhcbiAgdmFyIGNoaWxkSXNUYWlsID0gdHJ1ZTtcbiAgLy8gVGhlIGdyYXBoJ3MgdmlldyBvZiB0aGUgdHJlZSBlZGdlIHdlJ3JlIGluc3BlY3RpbmdcbiAgdmFyIGdyYXBoRWRnZSA9IGcuZWRnZShjaGlsZCwgcGFyZW50KTtcbiAgLy8gVGhlIGFjY3VtdWxhdGVkIGN1dCB2YWx1ZSBmb3IgdGhlIGVkZ2UgYmV0d2VlbiB0aGlzIG5vZGUgYW5kIGl0cyBwYXJlbnRcbiAgdmFyIGN1dFZhbHVlID0gMDtcblxuICBpZiAoIWdyYXBoRWRnZSkge1xuICAgIGNoaWxkSXNUYWlsID0gZmFsc2U7XG4gICAgZ3JhcGhFZGdlID0gZy5lZGdlKHBhcmVudCwgY2hpbGQpO1xuICB9XG5cbiAgY3V0VmFsdWUgPSBncmFwaEVkZ2Uud2VpZ2h0O1xuXG4gIF8uZm9yRWFjaChnLm5vZGVFZGdlcyhjaGlsZCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgaXNPdXRFZGdlID0gZS52ID09PSBjaGlsZCxcbiAgICAgIG90aGVyID0gaXNPdXRFZGdlID8gZS53IDogZS52O1xuXG4gICAgaWYgKG90aGVyICE9PSBwYXJlbnQpIHtcbiAgICAgIHZhciBwb2ludHNUb0hlYWQgPSBpc091dEVkZ2UgPT09IGNoaWxkSXNUYWlsLFxuICAgICAgICBvdGhlcldlaWdodCA9IGcuZWRnZShlKS53ZWlnaHQ7XG5cbiAgICAgIGN1dFZhbHVlICs9IHBvaW50c1RvSGVhZCA/IG90aGVyV2VpZ2h0IDogLW90aGVyV2VpZ2h0O1xuICAgICAgaWYgKGlzVHJlZUVkZ2UodCwgY2hpbGQsIG90aGVyKSkge1xuICAgICAgICB2YXIgb3RoZXJDdXRWYWx1ZSA9IHQuZWRnZShjaGlsZCwgb3RoZXIpLmN1dHZhbHVlO1xuICAgICAgICBjdXRWYWx1ZSArPSBwb2ludHNUb0hlYWQgPyAtb3RoZXJDdXRWYWx1ZSA6IG90aGVyQ3V0VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY3V0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIGluaXRMb3dMaW1WYWx1ZXModHJlZSwgcm9vdCkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICByb290ID0gdHJlZS5ub2RlcygpWzBdO1xuICB9XG4gIGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB7fSwgMSwgcm9vdCk7XG59XG5cbmZ1bmN0aW9uIGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB2aXNpdGVkLCBuZXh0TGltLCB2LCBwYXJlbnQpIHtcbiAgdmFyIGxvdyA9IG5leHRMaW07XG4gIHZhciBsYWJlbCA9IHRyZWUubm9kZSh2KTtcblxuICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgXy5mb3JFYWNoKHRyZWUubmVpZ2hib3JzKHYpLCBmdW5jdGlvbih3KSB7XG4gICAgaWYgKCFfLmhhcyh2aXNpdGVkLCB3KSkge1xuICAgICAgbmV4dExpbSA9IGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB2aXNpdGVkLCBuZXh0TGltLCB3LCB2KTtcbiAgICB9XG4gIH0pO1xuXG4gIGxhYmVsLmxvdyA9IGxvdztcbiAgbGFiZWwubGltID0gbmV4dExpbSsrO1xuICBpZiAocGFyZW50KSB7XG4gICAgbGFiZWwucGFyZW50ID0gcGFyZW50O1xuICB9IGVsc2Uge1xuICAgIC8vIFRPRE8gc2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlIHRoaXMgd2hlbiB3ZSBpbmNyZW1lbnRhbGx5IHVwZGF0ZSBsb3cgbGltXG4gICAgZGVsZXRlIGxhYmVsLnBhcmVudDtcbiAgfVxuXG4gIHJldHVybiBuZXh0TGltO1xufVxuXG5mdW5jdGlvbiBsZWF2ZUVkZ2UodHJlZSkge1xuICByZXR1cm4gXy5maW5kKHRyZWUuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiB0cmVlLmVkZ2UoZSkuY3V0dmFsdWUgPCAwO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZW50ZXJFZGdlKHQsIGcsIGVkZ2UpIHtcbiAgdmFyIHYgPSBlZGdlLnY7XG4gIHZhciB3ID0gZWRnZS53O1xuXG4gIC8vIEZvciB0aGUgcmVzdCBvZiB0aGlzIGZ1bmN0aW9uIHdlIGFzc3VtZSB0aGF0IHYgaXMgdGhlIHRhaWwgYW5kIHcgaXMgdGhlXG4gIC8vIGhlYWQsIHNvIGlmIHdlIGRvbid0IGhhdmUgdGhpcyBlZGdlIGluIHRoZSBncmFwaCB3ZSBzaG91bGQgZmxpcCBpdCB0b1xuICAvLyBtYXRjaCB0aGUgY29ycmVjdCBvcmllbnRhdGlvbi5cbiAgaWYgKCFnLmhhc0VkZ2UodiwgdykpIHtcbiAgICB2ID0gZWRnZS53O1xuICAgIHcgPSBlZGdlLnY7XG4gIH1cblxuICB2YXIgdkxhYmVsID0gdC5ub2RlKHYpO1xuICB2YXIgd0xhYmVsID0gdC5ub2RlKHcpO1xuICB2YXIgdGFpbExhYmVsID0gdkxhYmVsO1xuICB2YXIgZmxpcCA9IGZhbHNlO1xuXG4gIC8vIElmIHRoZSByb290IGlzIGluIHRoZSB0YWlsIG9mIHRoZSBlZGdlIHRoZW4gd2UgbmVlZCB0byBmbGlwIHRoZSBsb2dpYyB0aGF0XG4gIC8vIGNoZWNrcyBmb3IgdGhlIGhlYWQgYW5kIHRhaWwgbm9kZXMgaW4gdGhlIGNhbmRpZGF0ZXMgZnVuY3Rpb24gYmVsb3cuXG4gIGlmICh2TGFiZWwubGltID4gd0xhYmVsLmxpbSkge1xuICAgIHRhaWxMYWJlbCA9IHdMYWJlbDtcbiAgICBmbGlwID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBjYW5kaWRhdGVzID0gXy5maWx0ZXIoZy5lZGdlcygpLCBmdW5jdGlvbihlZGdlKSB7XG4gICAgcmV0dXJuIGZsaXAgPT09IGlzRGVzY2VuZGFudCh0LCB0Lm5vZGUoZWRnZS52KSwgdGFpbExhYmVsKSAmJlxuICAgICAgICAgICBmbGlwICE9PSBpc0Rlc2NlbmRhbnQodCwgdC5ub2RlKGVkZ2UudyksIHRhaWxMYWJlbCk7XG4gIH0pO1xuXG4gIHJldHVybiBfLm1pbkJ5KGNhbmRpZGF0ZXMsIGZ1bmN0aW9uKGVkZ2UpIHsgcmV0dXJuIHNsYWNrKGcsIGVkZ2UpOyB9KTtcbn1cblxuZnVuY3Rpb24gZXhjaGFuZ2VFZGdlcyh0LCBnLCBlLCBmKSB7XG4gIHZhciB2ID0gZS52O1xuICB2YXIgdyA9IGUudztcbiAgdC5yZW1vdmVFZGdlKHYsIHcpO1xuICB0LnNldEVkZ2UoZi52LCBmLncsIHt9KTtcbiAgaW5pdExvd0xpbVZhbHVlcyh0KTtcbiAgaW5pdEN1dFZhbHVlcyh0LCBnKTtcbiAgdXBkYXRlUmFua3ModCwgZyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJhbmtzKHQsIGcpIHtcbiAgdmFyIHJvb3QgPSBfLmZpbmQodC5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHJldHVybiAhZy5ub2RlKHYpLnBhcmVudDsgfSk7XG4gIHZhciB2cyA9IHByZW9yZGVyKHQsIHJvb3QpO1xuICB2cyA9IHZzLnNsaWNlKDEpO1xuICBfLmZvckVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgcGFyZW50ID0gdC5ub2RlKHYpLnBhcmVudCxcbiAgICAgIGVkZ2UgPSBnLmVkZ2UodiwgcGFyZW50KSxcbiAgICAgIGZsaXBwZWQgPSBmYWxzZTtcblxuICAgIGlmICghZWRnZSkge1xuICAgICAgZWRnZSA9IGcuZWRnZShwYXJlbnQsIHYpO1xuICAgICAgZmxpcHBlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZy5ub2RlKHYpLnJhbmsgPSBnLm5vZGUocGFyZW50KS5yYW5rICsgKGZsaXBwZWQgPyBlZGdlLm1pbmxlbiA6IC1lZGdlLm1pbmxlbik7XG4gIH0pO1xufVxuXG4vKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBlZGdlIGlzIGluIHRoZSB0cmVlLlxuICovXG5mdW5jdGlvbiBpc1RyZWVFZGdlKHRyZWUsIHUsIHYpIHtcbiAgcmV0dXJuIHRyZWUuaGFzRWRnZSh1LCB2KTtcbn1cblxuLypcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgZGVzY2VuZGFudCBvZiB0aGUgcm9vdCBub2RlIHBlciB0aGVcbiAqIGFzc2lnbmVkIGxvdyBhbmQgbGltIGF0dHJpYnV0ZXMgaW4gdGhlIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIGlzRGVzY2VuZGFudCh0cmVlLCB2TGFiZWwsIHJvb3RMYWJlbCkge1xuICByZXR1cm4gcm9vdExhYmVsLmxvdyA8PSB2TGFiZWwubGltICYmIHZMYWJlbC5saW0gPD0gcm9vdExhYmVsLmxpbTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBsb25nZXN0UGF0aDogbG9uZ2VzdFBhdGgsXG4gIHNsYWNrOiBzbGFja1xufTtcblxuLypcbiAqIEluaXRpYWxpemVzIHJhbmtzIGZvciB0aGUgaW5wdXQgZ3JhcGggdXNpbmcgdGhlIGxvbmdlc3QgcGF0aCBhbGdvcml0aG0uIFRoaXNcbiAqIGFsZ29yaXRobSBzY2FsZXMgd2VsbCBhbmQgaXMgZmFzdCBpbiBwcmFjdGljZSwgaXQgeWllbGRzIHJhdGhlciBwb29yXG4gKiBzb2x1dGlvbnMuIE5vZGVzIGFyZSBwdXNoZWQgdG8gdGhlIGxvd2VzdCBsYXllciBwb3NzaWJsZSwgbGVhdmluZyB0aGUgYm90dG9tXG4gKiByYW5rcyB3aWRlIGFuZCBsZWF2aW5nIGVkZ2VzIGxvbmdlciB0aGFuIG5lY2Vzc2FyeS4gSG93ZXZlciwgZHVlIHRvIGl0c1xuICogc3BlZWQsIHRoaXMgYWxnb3JpdGhtIGlzIGdvb2QgZm9yIGdldHRpbmcgYW4gaW5pdGlhbCByYW5raW5nIHRoYXQgY2FuIGJlIGZlZFxuICogaW50byBvdGhlciBhbGdvcml0aG1zLlxuICpcbiAqIFRoaXMgYWxnb3JpdGhtIGRvZXMgbm90IG5vcm1hbGl6ZSBsYXllcnMgYmVjYXVzZSBpdCB3aWxsIGJlIHVzZWQgYnkgb3RoZXJcbiAqIGFsZ29yaXRobXMgaW4gbW9zdCBjYXNlcy4gSWYgdXNpbmcgdGhpcyBhbGdvcml0aG0gZGlyZWN0bHksIGJlIHN1cmUgdG9cbiAqIHJ1biBub3JtYWxpemUgYXQgdGhlIGVuZC5cbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBJbnB1dCBncmFwaCBpcyBhIERBRy5cbiAqICAgIDIuIElucHV0IGdyYXBoIG5vZGUgbGFiZWxzIGNhbiBiZSBhc3NpZ25lZCBwcm9wZXJ0aWVzLlxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBFYWNoIG5vZGUgd2lsbCBiZSBhc3NpZ24gYW4gKHVubm9ybWFsaXplZCkgXCJyYW5rXCIgcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIGxvbmdlc3RQYXRoKGcpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIHZhciBsYWJlbCA9IGcubm9kZSh2KTtcbiAgICBpZiAoXy5oYXModmlzaXRlZCwgdikpIHtcbiAgICAgIHJldHVybiBsYWJlbC5yYW5rO1xuICAgIH1cbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcblxuICAgIHZhciByYW5rID0gXy5taW4oXy5tYXAoZy5vdXRFZGdlcyh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuIGRmcyhlLncpIC0gZy5lZGdlKGUpLm1pbmxlbjtcbiAgICB9KSk7XG5cbiAgICBpZiAocmFuayA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIHx8IC8vIHJldHVybiB2YWx1ZSBvZiBfLm1hcChbXSkgZm9yIExvZGFzaCAzXG4gICAgICAgIHJhbmsgPT09IHVuZGVmaW5lZCB8fCAvLyByZXR1cm4gdmFsdWUgb2YgXy5tYXAoW10pIGZvciBMb2Rhc2ggNFxuICAgICAgICByYW5rID09PSBudWxsKSB7IC8vIHJldHVybiB2YWx1ZSBvZiBfLm1hcChbbnVsbF0pXG4gICAgICByYW5rID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gKGxhYmVsLnJhbmsgPSByYW5rKTtcbiAgfVxuXG4gIF8uZm9yRWFjaChnLnNvdXJjZXMoKSwgZGZzKTtcbn1cblxuLypcbiAqIFJldHVybnMgdGhlIGFtb3VudCBvZiBzbGFjayBmb3IgdGhlIGdpdmVuIGVkZ2UuIFRoZSBzbGFjayBpcyBkZWZpbmVkIGFzIHRoZVxuICogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBsZW5ndGggb2YgdGhlIGVkZ2UgYW5kIGl0cyBtaW5pbXVtIGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gc2xhY2soZywgZSkge1xuICByZXR1cm4gZy5ub2RlKGUudykucmFuayAtIGcubm9kZShlLnYpLnJhbmsgLSBnLmVkZ2UoZSkubWlubGVuO1xufVxuIiwiLyogZXNsaW50IFwibm8tY29uc29sZVwiOiBvZmYgKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4vZ3JhcGhsaWJcIikuR3JhcGg7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhZGREdW1teU5vZGU6IGFkZER1bW15Tm9kZSxcbiAgc2ltcGxpZnk6IHNpbXBsaWZ5LFxuICBhc05vbkNvbXBvdW5kR3JhcGg6IGFzTm9uQ29tcG91bmRHcmFwaCxcbiAgc3VjY2Vzc29yV2VpZ2h0czogc3VjY2Vzc29yV2VpZ2h0cyxcbiAgcHJlZGVjZXNzb3JXZWlnaHRzOiBwcmVkZWNlc3NvcldlaWdodHMsXG4gIGludGVyc2VjdFJlY3Q6IGludGVyc2VjdFJlY3QsXG4gIGJ1aWxkTGF5ZXJNYXRyaXg6IGJ1aWxkTGF5ZXJNYXRyaXgsXG4gIG5vcm1hbGl6ZVJhbmtzOiBub3JtYWxpemVSYW5rcyxcbiAgcmVtb3ZlRW1wdHlSYW5rczogcmVtb3ZlRW1wdHlSYW5rcyxcbiAgYWRkQm9yZGVyTm9kZTogYWRkQm9yZGVyTm9kZSxcbiAgbWF4UmFuazogbWF4UmFuayxcbiAgcGFydGl0aW9uOiBwYXJ0aXRpb24sXG4gIHRpbWU6IHRpbWUsXG4gIG5vdGltZTogbm90aW1lXG59O1xuXG4vKlxuICogQWRkcyBhIGR1bW15IG5vZGUgdG8gdGhlIGdyYXBoIGFuZCByZXR1cm4gdi5cbiAqL1xuZnVuY3Rpb24gYWRkRHVtbXlOb2RlKGcsIHR5cGUsIGF0dHJzLCBuYW1lKSB7XG4gIHZhciB2O1xuICBkbyB7XG4gICAgdiA9IF8udW5pcXVlSWQobmFtZSk7XG4gIH0gd2hpbGUgKGcuaGFzTm9kZSh2KSk7XG5cbiAgYXR0cnMuZHVtbXkgPSB0eXBlO1xuICBnLnNldE5vZGUodiwgYXR0cnMpO1xuICByZXR1cm4gdjtcbn1cblxuLypcbiAqIFJldHVybnMgYSBuZXcgZ3JhcGggd2l0aCBvbmx5IHNpbXBsZSBlZGdlcy4gSGFuZGxlcyBhZ2dyZWdhdGlvbiBvZiBkYXRhXG4gKiBhc3NvY2lhdGVkIHdpdGggbXVsdGktZWRnZXMuXG4gKi9cbmZ1bmN0aW9uIHNpbXBsaWZ5KGcpIHtcbiAgdmFyIHNpbXBsaWZpZWQgPSBuZXcgR3JhcGgoKS5zZXRHcmFwaChnLmdyYXBoKCkpO1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHNpbXBsaWZpZWQuc2V0Tm9kZSh2LCBnLm5vZGUodikpOyB9KTtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBzaW1wbGVMYWJlbCA9IHNpbXBsaWZpZWQuZWRnZShlLnYsIGUudykgfHwgeyB3ZWlnaHQ6IDAsIG1pbmxlbjogMSB9O1xuICAgIHZhciBsYWJlbCA9IGcuZWRnZShlKTtcbiAgICBzaW1wbGlmaWVkLnNldEVkZ2UoZS52LCBlLncsIHtcbiAgICAgIHdlaWdodDogc2ltcGxlTGFiZWwud2VpZ2h0ICsgbGFiZWwud2VpZ2h0LFxuICAgICAgbWlubGVuOiBNYXRoLm1heChzaW1wbGVMYWJlbC5taW5sZW4sIGxhYmVsLm1pbmxlbilcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBzaW1wbGlmaWVkO1xufVxuXG5mdW5jdGlvbiBhc05vbkNvbXBvdW5kR3JhcGgoZykge1xuICB2YXIgc2ltcGxpZmllZCA9IG5ldyBHcmFwaCh7IG11bHRpZ3JhcGg6IGcuaXNNdWx0aWdyYXBoKCkgfSkuc2V0R3JhcGgoZy5ncmFwaCgpKTtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIGlmICghZy5jaGlsZHJlbih2KS5sZW5ndGgpIHtcbiAgICAgIHNpbXBsaWZpZWQuc2V0Tm9kZSh2LCBnLm5vZGUodikpO1xuICAgIH1cbiAgfSk7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICBzaW1wbGlmaWVkLnNldEVkZ2UoZSwgZy5lZGdlKGUpKTtcbiAgfSk7XG4gIHJldHVybiBzaW1wbGlmaWVkO1xufVxuXG5mdW5jdGlvbiBzdWNjZXNzb3JXZWlnaHRzKGcpIHtcbiAgdmFyIHdlaWdodE1hcCA9IF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBzdWNzID0ge307XG4gICAgXy5mb3JFYWNoKGcub3V0RWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHN1Y3NbZS53XSA9IChzdWNzW2Uud10gfHwgMCkgKyBnLmVkZ2UoZSkud2VpZ2h0O1xuICAgIH0pO1xuICAgIHJldHVybiBzdWNzO1xuICB9KTtcbiAgcmV0dXJuIF8uemlwT2JqZWN0KGcubm9kZXMoKSwgd2VpZ2h0TWFwKTtcbn1cblxuZnVuY3Rpb24gcHJlZGVjZXNzb3JXZWlnaHRzKGcpIHtcbiAgdmFyIHdlaWdodE1hcCA9IF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBwcmVkcyA9IHt9O1xuICAgIF8uZm9yRWFjaChnLmluRWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHByZWRzW2Uudl0gPSAocHJlZHNbZS52XSB8fCAwKSArIGcuZWRnZShlKS53ZWlnaHQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIHByZWRzO1xuICB9KTtcbiAgcmV0dXJuIF8uemlwT2JqZWN0KGcubm9kZXMoKSwgd2VpZ2h0TWFwKTtcbn1cblxuLypcbiAqIEZpbmRzIHdoZXJlIGEgbGluZSBzdGFydGluZyBhdCBwb2ludCAoe3gsIHl9KSB3b3VsZCBpbnRlcnNlY3QgYSByZWN0YW5nbGVcbiAqICh7eCwgeSwgd2lkdGgsIGhlaWdodH0pIGlmIGl0IHdlcmUgcG9pbnRpbmcgYXQgdGhlIHJlY3RhbmdsZSdzIGNlbnRlci5cbiAqL1xuZnVuY3Rpb24gaW50ZXJzZWN0UmVjdChyZWN0LCBwb2ludCkge1xuICB2YXIgeCA9IHJlY3QueDtcbiAgdmFyIHkgPSByZWN0Lnk7XG5cbiAgLy8gUmVjdGFuZ2xlIGludGVyc2VjdGlvbiBhbGdvcml0aG0gZnJvbTpcbiAgLy8gaHR0cDovL21hdGguc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzEwODExMy9maW5kLWVkZ2UtYmV0d2Vlbi10d28tYm94ZXNcbiAgdmFyIGR4ID0gcG9pbnQueCAtIHg7XG4gIHZhciBkeSA9IHBvaW50LnkgLSB5O1xuICB2YXIgdyA9IHJlY3Qud2lkdGggLyAyO1xuICB2YXIgaCA9IHJlY3QuaGVpZ2h0IC8gMjtcblxuICBpZiAoIWR4ICYmICFkeSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBwb3NzaWJsZSB0byBmaW5kIGludGVyc2VjdGlvbiBpbnNpZGUgb2YgdGhlIHJlY3RhbmdsZVwiKTtcbiAgfVxuXG4gIHZhciBzeCwgc3k7XG4gIGlmIChNYXRoLmFicyhkeSkgKiB3ID4gTWF0aC5hYnMoZHgpICogaCkge1xuICAgIC8vIEludGVyc2VjdGlvbiBpcyB0b3Agb3IgYm90dG9tIG9mIHJlY3QuXG4gICAgaWYgKGR5IDwgMCkge1xuICAgICAgaCA9IC1oO1xuICAgIH1cbiAgICBzeCA9IGggKiBkeCAvIGR5O1xuICAgIHN5ID0gaDtcbiAgfSBlbHNlIHtcbiAgICAvLyBJbnRlcnNlY3Rpb24gaXMgbGVmdCBvciByaWdodCBvZiByZWN0LlxuICAgIGlmIChkeCA8IDApIHtcbiAgICAgIHcgPSAtdztcbiAgICB9XG4gICAgc3ggPSB3O1xuICAgIHN5ID0gdyAqIGR5IC8gZHg7XG4gIH1cblxuICByZXR1cm4geyB4OiB4ICsgc3gsIHk6IHkgKyBzeSB9O1xufVxuXG4vKlxuICogR2l2ZW4gYSBEQUcgd2l0aCBlYWNoIG5vZGUgYXNzaWduZWQgXCJyYW5rXCIgYW5kIFwib3JkZXJcIiBwcm9wZXJ0aWVzLCB0aGlzXG4gKiBmdW5jdGlvbiB3aWxsIHByb2R1Y2UgYSBtYXRyaXggd2l0aCB0aGUgaWRzIG9mIGVhY2ggbm9kZS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRMYXllck1hdHJpeChnKSB7XG4gIHZhciBsYXllcmluZyA9IF8ubWFwKF8ucmFuZ2UobWF4UmFuayhnKSArIDEpLCBmdW5jdGlvbigpIHsgcmV0dXJuIFtdOyB9KTtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIHZhciByYW5rID0gbm9kZS5yYW5rO1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChyYW5rKSkge1xuICAgICAgbGF5ZXJpbmdbcmFua11bbm9kZS5vcmRlcl0gPSB2O1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBsYXllcmluZztcbn1cblxuLypcbiAqIEFkanVzdHMgdGhlIHJhbmtzIGZvciBhbGwgbm9kZXMgaW4gdGhlIGdyYXBoIHN1Y2ggdGhhdCBhbGwgbm9kZXMgdiBoYXZlXG4gKiByYW5rKHYpID49IDAgYW5kIGF0IGxlYXN0IG9uZSBub2RlIHcgaGFzIHJhbmsodykgPSAwLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSYW5rcyhnKSB7XG4gIHZhciBtaW4gPSBfLm1pbihfLm1hcChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5yYW5rOyB9KSk7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBpZiAoXy5oYXMobm9kZSwgXCJyYW5rXCIpKSB7XG4gICAgICBub2RlLnJhbmsgLT0gbWluO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVtcHR5UmFua3MoZykge1xuICAvLyBSYW5rcyBtYXkgbm90IHN0YXJ0IGF0IDAsIHNvIHdlIG5lZWQgdG8gb2Zmc2V0IHRoZW1cbiAgdmFyIG9mZnNldCA9IF8ubWluKF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpLnJhbms7IH0pKTtcblxuICB2YXIgbGF5ZXJzID0gW107XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgcmFuayA9IGcubm9kZSh2KS5yYW5rIC0gb2Zmc2V0O1xuICAgIGlmICghbGF5ZXJzW3JhbmtdKSB7XG4gICAgICBsYXllcnNbcmFua10gPSBbXTtcbiAgICB9XG4gICAgbGF5ZXJzW3JhbmtdLnB1c2godik7XG4gIH0pO1xuXG4gIHZhciBkZWx0YSA9IDA7XG4gIHZhciBub2RlUmFua0ZhY3RvciA9IGcuZ3JhcGgoKS5ub2RlUmFua0ZhY3RvcjtcbiAgXy5mb3JFYWNoKGxheWVycywgZnVuY3Rpb24odnMsIGkpIHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh2cykgJiYgaSAlIG5vZGVSYW5rRmFjdG9yICE9PSAwKSB7XG4gICAgICAtLWRlbHRhO1xuICAgIH0gZWxzZSBpZiAoZGVsdGEpIHtcbiAgICAgIF8uZm9yRWFjaCh2cywgZnVuY3Rpb24odikgeyBnLm5vZGUodikucmFuayArPSBkZWx0YTsgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkQm9yZGVyTm9kZShnLCBwcmVmaXgsIHJhbmssIG9yZGVyKSB7XG4gIHZhciBub2RlID0ge1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMFxuICB9O1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSB7XG4gICAgbm9kZS5yYW5rID0gcmFuaztcbiAgICBub2RlLm9yZGVyID0gb3JkZXI7XG4gIH1cbiAgcmV0dXJuIGFkZER1bW15Tm9kZShnLCBcImJvcmRlclwiLCBub2RlLCBwcmVmaXgpO1xufVxuXG5mdW5jdGlvbiBtYXhSYW5rKGcpIHtcbiAgcmV0dXJuIF8ubWF4KF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciByYW5rID0gZy5ub2RlKHYpLnJhbms7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHJhbmspKSB7XG4gICAgICByZXR1cm4gcmFuaztcbiAgICB9XG4gIH0pKTtcbn1cblxuLypcbiAqIFBhcnRpdGlvbiBhIGNvbGxlY3Rpb24gaW50byB0d28gZ3JvdXBzOiBgbGhzYCBhbmQgYHJoc2AuIElmIHRoZSBzdXBwbGllZFxuICogZnVuY3Rpb24gcmV0dXJucyB0cnVlIGZvciBhbiBlbnRyeSBpdCBnb2VzIGludG8gYGxoc2AuIE90aGVyd2lzZSBpdCBnb2VzXG4gKiBpbnRvIGByaHMuXG4gKi9cbmZ1bmN0aW9uIHBhcnRpdGlvbihjb2xsZWN0aW9uLCBmbikge1xuICB2YXIgcmVzdWx0ID0geyBsaHM6IFtdLCByaHM6IFtdIH07XG4gIF8uZm9yRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmIChmbih2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdC5saHMucHVzaCh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5yaHMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLypcbiAqIFJldHVybnMgYSBuZXcgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZm5gIHdpdGggYSB0aW1lci4gVGhlIHdyYXBwZXIgbG9ncyB0aGVcbiAqIHRpbWUgaXQgdGFrZXMgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHRpbWUobmFtZSwgZm4pIHtcbiAgdmFyIHN0YXJ0ID0gXy5ub3coKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjb25zb2xlLmxvZyhuYW1lICsgXCIgdGltZTogXCIgKyAoXy5ub3coKSAtIHN0YXJ0KSArIFwibXNcIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm90aW1lKG5hbWUsIGZuKSB7XG4gIHJldHVybiBmbigpO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjAuOC41XCI7XG4iLCIvKipcbiAqIEEgc2ltcGxlIGRlcGVuZGVuY3kgZ3JhcGhcbiAqL1xuXG4vKipcbiAqIEhlbHBlciBmb3IgY3JlYXRpbmcgYSBUb3BvbG9naWNhbCBTb3J0IHVzaW5nIERlcHRoLUZpcnN0LVNlYXJjaCBvbiBhIHNldCBvZiBlZGdlcy5cbiAqXG4gKiBEZXRlY3RzIGN5Y2xlcyBhbmQgdGhyb3dzIGFuIEVycm9yIGlmIG9uZSBpcyBkZXRlY3RlZCAodW5sZXNzIHRoZSBcImNpcmN1bGFyXCJcbiAqIHBhcmFtZXRlciBpcyBcInRydWVcIiBpbiB3aGljaCBjYXNlIGl0IGlnbm9yZXMgdGhlbSkuXG4gKlxuICogQHBhcmFtIGVkZ2VzIFRoZSBzZXQgb2YgZWRnZXMgdG8gREZTIHRocm91Z2hcbiAqIEBwYXJhbSBsZWF2ZXNPbmx5IFdoZXRoZXIgdG8gb25seSByZXR1cm4gXCJsZWFmXCIgbm9kZXMgKG9uZXMgd2hvIGhhdmUgbm8gZWRnZXMpXG4gKiBAcGFyYW0gcmVzdWx0IEFuIGFycmF5IGluIHdoaWNoIHRoZSByZXN1bHRzIHdpbGwgYmUgcG9wdWxhdGVkXG4gKiBAcGFyYW0gY2lyY3VsYXIgQSBib29sZWFuIHRvIGFsbG93IGNpcmN1bGFyIGRlcGVuZGVuY2llc1xuICovXG5mdW5jdGlvbiBjcmVhdGVERlMoZWRnZXMsIGxlYXZlc09ubHksIHJlc3VsdCwgY2lyY3VsYXIpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzdGFydCkge1xuICAgIGlmICh2aXNpdGVkW3N0YXJ0XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaW5DdXJyZW50UGF0aCA9IHt9O1xuICAgIHZhciBjdXJyZW50UGF0aCA9IFtdO1xuICAgIHZhciB0b2RvID0gW107IC8vIHVzZWQgYXMgYSBzdGFja1xuICAgIHRvZG8ucHVzaCh7IG5vZGU6IHN0YXJ0LCBwcm9jZXNzZWQ6IGZhbHNlIH0pO1xuICAgIHdoaWxlICh0b2RvLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBjdXJyZW50ID0gdG9kb1t0b2RvLmxlbmd0aCAtIDFdOyAvLyBwZWVrIGF0IHRoZSB0b2RvIHN0YWNrXG4gICAgICB2YXIgcHJvY2Vzc2VkID0gY3VycmVudC5wcm9jZXNzZWQ7XG4gICAgICB2YXIgbm9kZSA9IGN1cnJlbnQubm9kZTtcbiAgICAgIGlmICghcHJvY2Vzc2VkKSB7XG4gICAgICAgIC8vIEhhdmVuJ3QgdmlzaXRlZCBlZGdlcyB5ZXQgKHZpc2l0aW5nIHBoYXNlKVxuICAgICAgICBpZiAodmlzaXRlZFtub2RlXSkge1xuICAgICAgICAgIHRvZG8ucG9wKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5DdXJyZW50UGF0aFtub2RlXSkge1xuICAgICAgICAgIC8vIEl0J3Mgbm90IGEgREFHXG4gICAgICAgICAgaWYgKGNpcmN1bGFyKSB7XG4gICAgICAgICAgICB0b2RvLnBvcCgpO1xuICAgICAgICAgICAgLy8gSWYgd2UncmUgdG9sZXJhdGluZyBjeWNsZXMsIGRvbid0IHJldmlzaXQgdGhlIG5vZGVcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50UGF0aC5wdXNoKG5vZGUpO1xuICAgICAgICAgIHRocm93IG5ldyBEZXBHcmFwaEN5Y2xlRXJyb3IoY3VycmVudFBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5DdXJyZW50UGF0aFtub2RlXSA9IHRydWU7XG4gICAgICAgIGN1cnJlbnRQYXRoLnB1c2gobm9kZSk7XG4gICAgICAgIHZhciBub2RlRWRnZXMgPSBlZGdlc1tub2RlXTtcbiAgICAgICAgLy8gKHB1c2ggZWRnZXMgb250byB0aGUgdG9kbyBzdGFjayBpbiByZXZlcnNlIG9yZGVyIHRvIGJlIG9yZGVyLWNvbXBhdGlibGUgd2l0aCB0aGUgb2xkIERGUyBpbXBsZW1lbnRhdGlvbilcbiAgICAgICAgZm9yICh2YXIgaSA9IG5vZGVFZGdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRvZG8ucHVzaCh7IG5vZGU6IG5vZGVFZGdlc1tpXSwgcHJvY2Vzc2VkOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LnByb2Nlc3NlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBIYXZlIHZpc2l0ZWQgZWRnZXMgKHN0YWNrIHVucm9sbGluZyBwaGFzZSlcbiAgICAgICAgdG9kby5wb3AoKTtcbiAgICAgICAgY3VycmVudFBhdGgucG9wKCk7XG4gICAgICAgIGluQ3VycmVudFBhdGhbbm9kZV0gPSBmYWxzZTtcbiAgICAgICAgdmlzaXRlZFtub2RlXSA9IHRydWU7XG4gICAgICAgIGlmICghbGVhdmVzT25seSB8fCBlZGdlc1tub2RlXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXN1bHQucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgRGVwZW5kZW5jeSBHcmFwaFxuICovXG52YXIgRGVwR3JhcGggPSAoZXhwb3J0cy5EZXBHcmFwaCA9IGZ1bmN0aW9uIERlcEdyYXBoKG9wdHMpIHtcbiAgdGhpcy5ub2RlcyA9IHt9OyAvLyBOb2RlIC0+IE5vZGUvRGF0YSAodHJlYXRlZCBsaWtlIGEgU2V0KVxuICB0aGlzLm91dGdvaW5nRWRnZXMgPSB7fTsgLy8gTm9kZSAtPiBbRGVwZW5kZW5jeSBOb2RlXVxuICB0aGlzLmluY29taW5nRWRnZXMgPSB7fTsgLy8gTm9kZSAtPiBbRGVwZW5kYW50IE5vZGVdXG4gIHRoaXMuY2lyY3VsYXIgPSBvcHRzICYmICEhb3B0cy5jaXJjdWxhcjsgLy8gQWxsb3dzIGNpcmN1bGFyIGRlcHNcbn0pO1xuRGVwR3JhcGgucHJvdG90eXBlID0ge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBzaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMubm9kZXMpLmxlbmd0aDtcbiAgfSxcbiAgLyoqXG4gICAqIEFkZCBhIG5vZGUgdG8gdGhlIGRlcGVuZGVuY3kgZ3JhcGguIElmIGEgbm9kZSBhbHJlYWR5IGV4aXN0cywgdGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nLlxuICAgKi9cbiAgYWRkTm9kZTogZnVuY3Rpb24gKG5vZGUsIGRhdGEpIHtcbiAgICBpZiAoIXRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgLy8gQ2hlY2tpbmcgdGhlIGFyZ3VtZW50cyBsZW5ndGggYWxsb3dzIHRoZSB1c2VyIHRvIGFkZCBhIG5vZGUgd2l0aCB1bmRlZmluZWQgZGF0YVxuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgdGhpcy5ub2Rlc1tub2RlXSA9IGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm5vZGVzW25vZGVdID0gbm9kZTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3V0Z29pbmdFZGdlc1tub2RlXSA9IFtdO1xuICAgICAgdGhpcy5pbmNvbWluZ0VkZ2VzW25vZGVdID0gW107XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogUmVtb3ZlIGEgbm9kZSBmcm9tIHRoZSBkZXBlbmRlbmN5IGdyYXBoLiBJZiBhIG5vZGUgZG9lcyBub3QgZXhpc3QsIHRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZy5cbiAgICovXG4gIHJlbW92ZU5vZGU6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgZGVsZXRlIHRoaXMubm9kZXNbbm9kZV07XG4gICAgICBkZWxldGUgdGhpcy5vdXRnb2luZ0VkZ2VzW25vZGVdO1xuICAgICAgZGVsZXRlIHRoaXMuaW5jb21pbmdFZGdlc1tub2RlXTtcbiAgICAgIFt0aGlzLmluY29taW5nRWRnZXMsIHRoaXMub3V0Z29pbmdFZGdlc10uZm9yRWFjaChmdW5jdGlvbiAoZWRnZUxpc3QpIHtcbiAgICAgICAgT2JqZWN0LmtleXMoZWRnZUxpc3QpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHZhciBpZHggPSBlZGdlTGlzdFtrZXldLmluZGV4T2Yobm9kZSk7XG4gICAgICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgICAgICBlZGdlTGlzdFtrZXldLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG5vZGUgZXhpc3RzIGluIHRoZSBncmFwaFxuICAgKi9cbiAgaGFzTm9kZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShub2RlKTtcbiAgfSxcbiAgLyoqXG4gICAqIEdldCB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBub2RlIG5hbWVcbiAgICovXG4gIGdldE5vZGVEYXRhOiBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmICh0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzW25vZGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIFNldCB0aGUgYXNzb2NpYXRlZCBkYXRhIGZvciBhIGdpdmVuIG5vZGUgbmFtZS4gSWYgdGhlIG5vZGUgZG9lcyBub3QgZXhpc3QsIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXJyb3JcbiAgICovXG4gIHNldE5vZGVEYXRhOiBmdW5jdGlvbiAobm9kZSwgZGF0YSkge1xuICAgIGlmICh0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIHRoaXMubm9kZXNbbm9kZV0gPSBkYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEFkZCBhIGRlcGVuZGVuY3kgYmV0d2VlbiB0d28gbm9kZXMuIElmIGVpdGhlciBvZiB0aGUgbm9kZXMgZG9lcyBub3QgZXhpc3QsXG4gICAqIGFuIEVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgKi9cbiAgYWRkRGVwZW5kZW5jeTogZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gICAgaWYgKCF0aGlzLmhhc05vZGUoZnJvbSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgZnJvbSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5oYXNOb2RlKHRvKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyB0byk7XG4gICAgfVxuICAgIGlmICh0aGlzLm91dGdvaW5nRWRnZXNbZnJvbV0uaW5kZXhPZih0bykgPT09IC0xKSB7XG4gICAgICB0aGlzLm91dGdvaW5nRWRnZXNbZnJvbV0ucHVzaCh0byk7XG4gICAgfVxuICAgIGlmICh0aGlzLmluY29taW5nRWRnZXNbdG9dLmluZGV4T2YoZnJvbSkgPT09IC0xKSB7XG4gICAgICB0aGlzLmluY29taW5nRWRnZXNbdG9dLnB1c2goZnJvbSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKipcbiAgICogUmVtb3ZlIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBub2Rlcy5cbiAgICovXG4gIHJlbW92ZURlcGVuZGVuY3k6IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgIHZhciBpZHg7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShmcm9tKSkge1xuICAgICAgaWR4ID0gdGhpcy5vdXRnb2luZ0VkZ2VzW2Zyb21dLmluZGV4T2YodG8pO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHRoaXMub3V0Z29pbmdFZGdlc1tmcm9tXS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNOb2RlKHRvKSkge1xuICAgICAgaWR4ID0gdGhpcy5pbmNvbWluZ0VkZ2VzW3RvXS5pbmRleE9mKGZyb20pO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHRoaXMuaW5jb21pbmdFZGdlc1t0b10uc3BsaWNlKGlkeCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogUmV0dXJuIGEgY2xvbmUgb2YgdGhlIGRlcGVuZGVuY3kgZ3JhcGguIElmIGFueSBjdXN0b20gZGF0YSBpcyBhdHRhY2hlZFxuICAgKiB0byB0aGUgbm9kZXMsIGl0IHdpbGwgb25seSBiZSBzaGFsbG93IGNvcGllZC5cbiAgICovXG4gIGNsb25lOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHRoaXM7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBEZXBHcmFwaCgpO1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoc291cmNlLm5vZGVzKTtcbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJlc3VsdC5ub2Rlc1tuXSA9IHNvdXJjZS5ub2Rlc1tuXTtcbiAgICAgIHJlc3VsdC5vdXRnb2luZ0VkZ2VzW25dID0gc291cmNlLm91dGdvaW5nRWRnZXNbbl0uc2xpY2UoMCk7XG4gICAgICByZXN1bHQuaW5jb21pbmdFZGdlc1tuXSA9IHNvdXJjZS5pbmNvbWluZ0VkZ2VzW25dLnNsaWNlKDApO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZGlyZWN0IGRlcGVuZGVuY2llcyBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuXG4gICAqXG4gICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgZG9lcyBub3QgZXhpc3QuXG4gICAqL1xuICBkaXJlY3REZXBlbmRlbmNpZXNPZjogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAodGhpcy5oYXNOb2RlKG5vZGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5vdXRnb2luZ0VkZ2VzW25vZGVdLnNsaWNlKDApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBjb250YWluaW5nIHRoZSBub2RlcyB0aGF0IGRpcmVjdGx5IGRlcGVuZCBvbiB0aGUgc3BlY2lmaWVkIG5vZGUuXG4gICAqXG4gICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgZG9lcyBub3QgZXhpc3QuXG4gICAqL1xuICBkaXJlY3REZXBlbmRhbnRzT2Y6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5jb21pbmdFZGdlc1tub2RlXS5zbGljZSgwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbm9kZXMgdGhhdCB0aGUgc3BlY2lmaWVkIG5vZGUgZGVwZW5kcyBvbiAodHJhbnNpdGl2ZWx5KS5cbiAgICpcbiAgICogVGhyb3dzIGFuIEVycm9yIGlmIHRoZSBncmFwaCBoYXMgYSBjeWNsZSwgb3IgdGhlIHNwZWNpZmllZCBub2RlIGRvZXMgbm90IGV4aXN0LlxuICAgKlxuICAgKiBJZiBgbGVhdmVzT25seWAgaXMgdHJ1ZSwgb25seSBub2RlcyB0aGF0IGRvIG5vdCBkZXBlbmQgb24gYW55IG90aGVyIG5vZGVzIHdpbGwgYmUgcmV0dXJuZWRcbiAgICogaW4gdGhlIGFycmF5LlxuICAgKi9cbiAgZGVwZW5kZW5jaWVzT2Y6IGZ1bmN0aW9uIChub2RlLCBsZWF2ZXNPbmx5KSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgdmFyIERGUyA9IGNyZWF0ZURGUyhcbiAgICAgICAgdGhpcy5vdXRnb2luZ0VkZ2VzLFxuICAgICAgICBsZWF2ZXNPbmx5LFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHRoaXMuY2lyY3VsYXJcbiAgICAgICk7XG4gICAgICBERlMobm9kZSk7XG4gICAgICB2YXIgaWR4ID0gcmVzdWx0LmluZGV4T2Yobm9kZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgcmVzdWx0LnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBnZXQgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbm9kZXMgdGhhdCBkZXBlbmQgb24gdGhlIHNwZWNpZmllZCBub2RlICh0cmFuc2l0aXZlbHkpLlxuICAgKlxuICAgKiBUaHJvd3MgYW4gRXJyb3IgaWYgdGhlIGdyYXBoIGhhcyBhIGN5Y2xlLCBvciB0aGUgc3BlY2lmaWVkIG5vZGUgZG9lcyBub3QgZXhpc3QuXG4gICAqXG4gICAqIElmIGBsZWF2ZXNPbmx5YCBpcyB0cnVlLCBvbmx5IG5vZGVzIHRoYXQgZG8gbm90IGhhdmUgYW55IGRlcGVuZGFudHMgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgYXJyYXkuXG4gICAqL1xuICBkZXBlbmRhbnRzT2Y6IGZ1bmN0aW9uIChub2RlLCBsZWF2ZXNPbmx5KSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgdmFyIERGUyA9IGNyZWF0ZURGUyhcbiAgICAgICAgdGhpcy5pbmNvbWluZ0VkZ2VzLFxuICAgICAgICBsZWF2ZXNPbmx5LFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHRoaXMuY2lyY3VsYXJcbiAgICAgICk7XG4gICAgICBERlMobm9kZSk7XG4gICAgICB2YXIgaWR4ID0gcmVzdWx0LmluZGV4T2Yobm9kZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgcmVzdWx0LnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgdGhlIG92ZXJhbGwgcHJvY2Vzc2luZyBvcmRlciBmb3IgdGhlIGRlcGVuZGVuY3kgZ3JhcGguXG4gICAqXG4gICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgZ3JhcGggaGFzIGEgY3ljbGUuXG4gICAqXG4gICAqIElmIGBsZWF2ZXNPbmx5YCBpcyB0cnVlLCBvbmx5IG5vZGVzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBhbnkgb3RoZXIgbm9kZXMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICovXG4gIG92ZXJhbGxPcmRlcjogZnVuY3Rpb24gKGxlYXZlc09ubHkpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModGhpcy5ub2Rlcyk7XG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0OyAvLyBFbXB0eSBncmFwaFxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMuY2lyY3VsYXIpIHtcbiAgICAgICAgLy8gTG9vayBmb3IgY3ljbGVzIC0gd2UgcnVuIHRoZSBERlMgc3RhcnRpbmcgYXQgYWxsIHRoZSBub2RlcyBpbiBjYXNlIHRoZXJlXG4gICAgICAgIC8vIGFyZSBzZXZlcmFsIGRpc2Nvbm5lY3RlZCBzdWJncmFwaHMgaW5zaWRlIHRoaXMgZGVwZW5kZW5jeSBncmFwaC5cbiAgICAgICAgdmFyIEN5Y2xlREZTID0gY3JlYXRlREZTKHRoaXMub3V0Z29pbmdFZGdlcywgZmFsc2UsIFtdLCB0aGlzLmNpcmN1bGFyKTtcbiAgICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgQ3ljbGVERlMobik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgREZTID0gY3JlYXRlREZTKFxuICAgICAgICB0aGlzLm91dGdvaW5nRWRnZXMsXG4gICAgICAgIGxlYXZlc09ubHksXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgdGhpcy5jaXJjdWxhclxuICAgICAgKTtcbiAgICAgIC8vIEZpbmQgYWxsIHBvdGVudGlhbCBzdGFydGluZyBwb2ludHMgKG5vZGVzIHdpdGggbm90aGluZyBkZXBlbmRpbmcgb24gdGhlbSkgYW5cbiAgICAgIC8vIHJ1biBhIERGUyBzdGFydGluZyBhdCB0aGVzZSBwb2ludHMgdG8gZ2V0IHRoZSBvcmRlclxuICAgICAga2V5c1xuICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuaW5jb21pbmdFZGdlc1tub2RlXS5sZW5ndGggPT09IDA7XG4gICAgICAgIH0pXG4gICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgREZTKG4pO1xuICAgICAgICB9KTtcblxuICAgICAgLy8gSWYgd2UncmUgYWxsb3dpbmcgY3ljbGVzIC0gd2UgbmVlZCB0byBydW4gdGhlIERGUyBhZ2FpbnN0IGFueSByZW1haW5pbmdcbiAgICAgIC8vIG5vZGVzIHRoYXQgZGlkIG5vdCBlbmQgdXAgaW4gdGhlIGluaXRpYWwgcmVzdWx0IChhcyB0aGV5IGFyZSBwYXJ0IG9mIGFcbiAgICAgIC8vIHN1YmdyYXBoIHRoYXQgZG9lcyBub3QgaGF2ZSBhIGNsZWFyIHN0YXJ0aW5nIHBvaW50KVxuICAgICAgaWYgKHRoaXMuY2lyY3VsYXIpIHtcbiAgICAgICAga2V5c1xuICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuaW5kZXhPZihub2RlKSA9PT0gLTE7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgREZTKG4pO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBvZiBub2RlcyB0aGF0IGhhdmUgbm8gZGVwZW5kYW50cyAoaS5lLiBub3RoaW5nIGRlcGVuZHMgb24gdGhlbSkuXG4gICAqL1xuICBlbnRyeU5vZGVzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLm5vZGVzKS5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHJldHVybiBzZWxmLmluY29taW5nRWRnZXNbbm9kZV0ubGVuZ3RoID09PSAwO1xuICAgIH0pO1xuICB9XG59O1xuXG4vLyBDcmVhdGUgc29tZSBhbGlhc2VzXG5EZXBHcmFwaC5wcm90b3R5cGUuZGlyZWN0RGVwZW5kZW50c09mID0gRGVwR3JhcGgucHJvdG90eXBlLmRpcmVjdERlcGVuZGFudHNPZjtcbkRlcEdyYXBoLnByb3RvdHlwZS5kZXBlbmRlbnRzT2YgPSBEZXBHcmFwaC5wcm90b3R5cGUuZGVwZW5kYW50c09mO1xuXG4vKipcbiAqIEN5Y2xlIGVycm9yLCBpbmNsdWRpbmcgdGhlIHBhdGggb2YgdGhlIGN5Y2xlLlxuICovXG52YXIgRGVwR3JhcGhDeWNsZUVycm9yID0gKGV4cG9ydHMuRGVwR3JhcGhDeWNsZUVycm9yID0gZnVuY3Rpb24gKGN5Y2xlUGF0aCkge1xuICB2YXIgbWVzc2FnZSA9IFwiRGVwZW5kZW5jeSBDeWNsZSBGb3VuZDogXCIgKyBjeWNsZVBhdGguam9pbihcIiAtPiBcIik7XG4gIHZhciBpbnN0YW5jZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgaW5zdGFuY2UuY3ljbGVQYXRoID0gY3ljbGVQYXRoO1xuICBPYmplY3Quc2V0UHJvdG90eXBlT2YoaW5zdGFuY2UsIE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSk7XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGluc3RhbmNlLCBEZXBHcmFwaEN5Y2xlRXJyb3IpO1xuICB9XG4gIHJldHVybiBpbnN0YW5jZTtcbn0pO1xuRGVwR3JhcGhDeWNsZUVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlLCB7XG4gIGNvbnN0cnVjdG9yOiB7XG4gICAgdmFsdWU6IEVycm9yLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9XG59KTtcbk9iamVjdC5zZXRQcm90b3R5cGVPZihEZXBHcmFwaEN5Y2xlRXJyb3IsIEVycm9yKTtcbiIsIi8qKlxuICogaW5zcGlyZWQgYnkgaXMtbnVtYmVyIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1udW1iZXI+XG4gKiBidXQgc2lnbmlmaWNhbnRseSBzaW1wbGlmaWVkIGFuZCBzcGVkIHVwIGJ5IGlnbm9yaW5nIG51bWJlciBhbmQgc3RyaW5nIGNvbnN0cnVjdG9yc1xuICogaWUgdGhlc2UgcmV0dXJuIGZhbHNlOlxuICogICBuZXcgTnVtYmVyKDEpXG4gKiAgIG5ldyBTdHJpbmcoJzEnKVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGFsbEJsYW5rQ2hhckNvZGVzID0gcmVxdWlyZSgnaXMtc3RyaW5nLWJsYW5rJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obikge1xuICAgIHZhciB0eXBlID0gdHlwZW9mIG47XG4gICAgaWYodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsID0gbjtcbiAgICAgICAgbiA9ICtuO1xuICAgICAgICAvLyB3aGl0ZXNwYWNlIHN0cmluZ3MgY2FzdCB0byB6ZXJvIC0gZmlsdGVyIHRoZW0gb3V0XG4gICAgICAgIGlmKG49PT0wICYmIGFsbEJsYW5rQ2hhckNvZGVzKG9yaWdpbmFsKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIGlmKHR5cGUgIT09ICdudW1iZXInKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gbiAtIG4gPCAxO1xufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LCBDaHJpcyBQZXR0aXR0XG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuICogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXRcbiAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFXG4gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1JcbiAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSXG4gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxuICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxudmFyIGxpYiA9IHJlcXVpcmUoXCIuL2xpYlwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEdyYXBoOiBsaWIuR3JhcGgsXG4gIGpzb246IHJlcXVpcmUoXCIuL2xpYi9qc29uXCIpLFxuICBhbGc6IHJlcXVpcmUoXCIuL2xpYi9hbGdcIiksXG4gIHZlcnNpb246IGxpYi52ZXJzaW9uXG59O1xuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBvbmVudHM7XG5cbmZ1bmN0aW9uIGNvbXBvbmVudHMoZykge1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuICB2YXIgY21wdHMgPSBbXTtcbiAgdmFyIGNtcHQ7XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICBpZiAoXy5oYXModmlzaXRlZCwgdikpIHJldHVybjtcbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgICBjbXB0LnB1c2godik7XG4gICAgXy5lYWNoKGcuc3VjY2Vzc29ycyh2KSwgZGZzKTtcbiAgICBfLmVhY2goZy5wcmVkZWNlc3NvcnModiksIGRmcyk7XG4gIH1cblxuICBfLmVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgY21wdCA9IFtdO1xuICAgIGRmcyh2KTtcbiAgICBpZiAoY21wdC5sZW5ndGgpIHtcbiAgICAgIGNtcHRzLnB1c2goY21wdCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY21wdHM7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZGZzO1xuXG4vKlxuICogQSBoZWxwZXIgdGhhdCBwcmVmb3JtcyBhIHByZS0gb3IgcG9zdC1vcmRlciB0cmF2ZXJzYWwgb24gdGhlIGlucHV0IGdyYXBoXG4gKiBhbmQgcmV0dXJucyB0aGUgbm9kZXMgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSB2aXNpdGVkLiBJZiB0aGUgZ3JhcGggaXNcbiAqIHVuZGlyZWN0ZWQgdGhlbiB0aGlzIGFsZ29yaXRobSB3aWxsIG5hdmlnYXRlIHVzaW5nIG5laWdoYm9ycy4gSWYgdGhlIGdyYXBoXG4gKiBpcyBkaXJlY3RlZCB0aGVuIHRoaXMgYWxnb3JpdGhtIHdpbGwgbmF2aWdhdGUgdXNpbmcgc3VjY2Vzc29ycy5cbiAqXG4gKiBPcmRlciBtdXN0IGJlIG9uZSBvZiBcInByZVwiIG9yIFwicG9zdFwiLlxuICovXG5mdW5jdGlvbiBkZnMoZywgdnMsIG9yZGVyKSB7XG4gIGlmICghXy5pc0FycmF5KHZzKSkge1xuICAgIHZzID0gW3ZzXTtcbiAgfVxuXG4gIHZhciBuYXZpZ2F0aW9uID0gKGcuaXNEaXJlY3RlZCgpID8gZy5zdWNjZXNzb3JzIDogZy5uZWlnaGJvcnMpLmJpbmQoZyk7XG5cbiAgdmFyIGFjYyA9IFtdO1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuICBfLmVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoIWcuaGFzTm9kZSh2KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR3JhcGggZG9lcyBub3QgaGF2ZSBub2RlOiBcIiArIHYpO1xuICAgIH1cblxuICAgIGRvRGZzKGcsIHYsIG9yZGVyID09PSBcInBvc3RcIiwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKTtcbiAgfSk7XG4gIHJldHVybiBhY2M7XG59XG5cbmZ1bmN0aW9uIGRvRGZzKGcsIHYsIHBvc3RvcmRlciwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKSB7XG4gIGlmICghXy5oYXModmlzaXRlZCwgdikpIHtcbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcblxuICAgIGlmICghcG9zdG9yZGVyKSB7IGFjYy5wdXNoKHYpOyB9XG4gICAgXy5lYWNoKG5hdmlnYXRpb24odiksIGZ1bmN0aW9uKHcpIHtcbiAgICAgIGRvRGZzKGcsIHcsIHBvc3RvcmRlciwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKTtcbiAgICB9KTtcbiAgICBpZiAocG9zdG9yZGVyKSB7IGFjYy5wdXNoKHYpOyB9XG4gIH1cbn1cbiIsInZhciBkaWprc3RyYSA9IHJlcXVpcmUoXCIuL2RpamtzdHJhXCIpO1xudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRpamtzdHJhQWxsO1xuXG5mdW5jdGlvbiBkaWprc3RyYUFsbChnLCB3ZWlnaHRGdW5jLCBlZGdlRnVuYykge1xuICByZXR1cm4gXy50cmFuc2Zvcm0oZy5ub2RlcygpLCBmdW5jdGlvbihhY2MsIHYpIHtcbiAgICBhY2Nbdl0gPSBkaWprc3RyYShnLCB2LCB3ZWlnaHRGdW5jLCBlZGdlRnVuYyk7XG4gIH0sIHt9KTtcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciBQcmlvcml0eVF1ZXVlID0gcmVxdWlyZShcIi4uL2RhdGEvcHJpb3JpdHktcXVldWVcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZGlqa3N0cmE7XG5cbnZhciBERUZBVUxUX1dFSUdIVF9GVU5DID0gXy5jb25zdGFudCgxKTtcblxuZnVuY3Rpb24gZGlqa3N0cmEoZywgc291cmNlLCB3ZWlnaHRGbiwgZWRnZUZuKSB7XG4gIHJldHVybiBydW5EaWprc3RyYShnLCBTdHJpbmcoc291cmNlKSxcbiAgICB3ZWlnaHRGbiB8fCBERUZBVUxUX1dFSUdIVF9GVU5DLFxuICAgIGVkZ2VGbiB8fCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm91dEVkZ2VzKHYpOyB9KTtcbn1cblxuZnVuY3Rpb24gcnVuRGlqa3N0cmEoZywgc291cmNlLCB3ZWlnaHRGbiwgZWRnZUZuKSB7XG4gIHZhciByZXN1bHRzID0ge307XG4gIHZhciBwcSA9IG5ldyBQcmlvcml0eVF1ZXVlKCk7XG4gIHZhciB2LCB2RW50cnk7XG5cbiAgdmFyIHVwZGF0ZU5laWdoYm9ycyA9IGZ1bmN0aW9uKGVkZ2UpIHtcbiAgICB2YXIgdyA9IGVkZ2UudiAhPT0gdiA/IGVkZ2UudiA6IGVkZ2UudztcbiAgICB2YXIgd0VudHJ5ID0gcmVzdWx0c1t3XTtcbiAgICB2YXIgd2VpZ2h0ID0gd2VpZ2h0Rm4oZWRnZSk7XG4gICAgdmFyIGRpc3RhbmNlID0gdkVudHJ5LmRpc3RhbmNlICsgd2VpZ2h0O1xuXG4gICAgaWYgKHdlaWdodCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImRpamtzdHJhIGRvZXMgbm90IGFsbG93IG5lZ2F0aXZlIGVkZ2Ugd2VpZ2h0cy4gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIFwiQmFkIGVkZ2U6IFwiICsgZWRnZSArIFwiIFdlaWdodDogXCIgKyB3ZWlnaHQpO1xuICAgIH1cblxuICAgIGlmIChkaXN0YW5jZSA8IHdFbnRyeS5kaXN0YW5jZSkge1xuICAgICAgd0VudHJ5LmRpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICB3RW50cnkucHJlZGVjZXNzb3IgPSB2O1xuICAgICAgcHEuZGVjcmVhc2UodywgZGlzdGFuY2UpO1xuICAgIH1cbiAgfTtcblxuICBnLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbih2KSB7XG4gICAgdmFyIGRpc3RhbmNlID0gdiA9PT0gc291cmNlID8gMCA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICByZXN1bHRzW3ZdID0geyBkaXN0YW5jZTogZGlzdGFuY2UgfTtcbiAgICBwcS5hZGQodiwgZGlzdGFuY2UpO1xuICB9KTtcblxuICB3aGlsZSAocHEuc2l6ZSgpID4gMCkge1xuICAgIHYgPSBwcS5yZW1vdmVNaW4oKTtcbiAgICB2RW50cnkgPSByZXN1bHRzW3ZdO1xuICAgIGlmICh2RW50cnkuZGlzdGFuY2UgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZWRnZUZuKHYpLmZvckVhY2godXBkYXRlTmVpZ2hib3JzKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIHRhcmphbiA9IHJlcXVpcmUoXCIuL3RhcmphblwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmaW5kQ3ljbGVzO1xuXG5mdW5jdGlvbiBmaW5kQ3ljbGVzKGcpIHtcbiAgcmV0dXJuIF8uZmlsdGVyKHRhcmphbihnKSwgZnVuY3Rpb24oY21wdCkge1xuICAgIHJldHVybiBjbXB0Lmxlbmd0aCA+IDEgfHwgKGNtcHQubGVuZ3RoID09PSAxICYmIGcuaGFzRWRnZShjbXB0WzBdLCBjbXB0WzBdKSk7XG4gIH0pO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZsb3lkV2Fyc2hhbGw7XG5cbnZhciBERUZBVUxUX1dFSUdIVF9GVU5DID0gXy5jb25zdGFudCgxKTtcblxuZnVuY3Rpb24gZmxveWRXYXJzaGFsbChnLCB3ZWlnaHRGbiwgZWRnZUZuKSB7XG4gIHJldHVybiBydW5GbG95ZFdhcnNoYWxsKGcsXG4gICAgd2VpZ2h0Rm4gfHwgREVGQVVMVF9XRUlHSFRfRlVOQyxcbiAgICBlZGdlRm4gfHwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5vdXRFZGdlcyh2KTsgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkZsb3lkV2Fyc2hhbGwoZywgd2VpZ2h0Rm4sIGVkZ2VGbikge1xuICB2YXIgcmVzdWx0cyA9IHt9O1xuICB2YXIgbm9kZXMgPSBnLm5vZGVzKCk7XG5cbiAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbih2KSB7XG4gICAgcmVzdWx0c1t2XSA9IHt9O1xuICAgIHJlc3VsdHNbdl1bdl0gPSB7IGRpc3RhbmNlOiAwIH07XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbih3KSB7XG4gICAgICBpZiAodiAhPT0gdykge1xuICAgICAgICByZXN1bHRzW3ZdW3ddID0geyBkaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIH07XG4gICAgICB9XG4gICAgfSk7XG4gICAgZWRnZUZuKHYpLmZvckVhY2goZnVuY3Rpb24oZWRnZSkge1xuICAgICAgdmFyIHcgPSBlZGdlLnYgPT09IHYgPyBlZGdlLncgOiBlZGdlLnY7XG4gICAgICB2YXIgZCA9IHdlaWdodEZuKGVkZ2UpO1xuICAgICAgcmVzdWx0c1t2XVt3XSA9IHsgZGlzdGFuY2U6IGQsIHByZWRlY2Vzc29yOiB2IH07XG4gICAgfSk7XG4gIH0pO1xuXG4gIG5vZGVzLmZvckVhY2goZnVuY3Rpb24oaykge1xuICAgIHZhciByb3dLID0gcmVzdWx0c1trXTtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGkpIHtcbiAgICAgIHZhciByb3dJID0gcmVzdWx0c1tpXTtcbiAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24oaikge1xuICAgICAgICB2YXIgaWsgPSByb3dJW2tdO1xuICAgICAgICB2YXIga2ogPSByb3dLW2pdO1xuICAgICAgICB2YXIgaWogPSByb3dJW2pdO1xuICAgICAgICB2YXIgYWx0RGlzdGFuY2UgPSBpay5kaXN0YW5jZSArIGtqLmRpc3RhbmNlO1xuICAgICAgICBpZiAoYWx0RGlzdGFuY2UgPCBpai5kaXN0YW5jZSkge1xuICAgICAgICAgIGlqLmRpc3RhbmNlID0gYWx0RGlzdGFuY2U7XG4gICAgICAgICAgaWoucHJlZGVjZXNzb3IgPSBrai5wcmVkZWNlc3NvcjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHRzO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNvbXBvbmVudHM6IHJlcXVpcmUoXCIuL2NvbXBvbmVudHNcIiksXG4gIGRpamtzdHJhOiByZXF1aXJlKFwiLi9kaWprc3RyYVwiKSxcbiAgZGlqa3N0cmFBbGw6IHJlcXVpcmUoXCIuL2RpamtzdHJhLWFsbFwiKSxcbiAgZmluZEN5Y2xlczogcmVxdWlyZShcIi4vZmluZC1jeWNsZXNcIiksXG4gIGZsb3lkV2Fyc2hhbGw6IHJlcXVpcmUoXCIuL2Zsb3lkLXdhcnNoYWxsXCIpLFxuICBpc0FjeWNsaWM6IHJlcXVpcmUoXCIuL2lzLWFjeWNsaWNcIiksXG4gIHBvc3RvcmRlcjogcmVxdWlyZShcIi4vcG9zdG9yZGVyXCIpLFxuICBwcmVvcmRlcjogcmVxdWlyZShcIi4vcHJlb3JkZXJcIiksXG4gIHByaW06IHJlcXVpcmUoXCIuL3ByaW1cIiksXG4gIHRhcmphbjogcmVxdWlyZShcIi4vdGFyamFuXCIpLFxuICB0b3Bzb3J0OiByZXF1aXJlKFwiLi90b3Bzb3J0XCIpXG59O1xuIiwidmFyIHRvcHNvcnQgPSByZXF1aXJlKFwiLi90b3Bzb3J0XCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQWN5Y2xpYztcblxuZnVuY3Rpb24gaXNBY3ljbGljKGcpIHtcbiAgdHJ5IHtcbiAgICB0b3Bzb3J0KGcpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiB0b3Bzb3J0LkN5Y2xlRXhjZXB0aW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJ2YXIgZGZzID0gcmVxdWlyZShcIi4vZGZzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBvc3RvcmRlcjtcblxuZnVuY3Rpb24gcG9zdG9yZGVyKGcsIHZzKSB7XG4gIHJldHVybiBkZnMoZywgdnMsIFwicG9zdFwiKTtcbn1cbiIsInZhciBkZnMgPSByZXF1aXJlKFwiLi9kZnNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gcHJlb3JkZXI7XG5cbmZ1bmN0aW9uIHByZW9yZGVyKGcsIHZzKSB7XG4gIHJldHVybiBkZnMoZywgdnMsIFwicHJlXCIpO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4uL2dyYXBoXCIpO1xudmFyIFByaW9yaXR5UXVldWUgPSByZXF1aXJlKFwiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwcmltO1xuXG5mdW5jdGlvbiBwcmltKGcsIHdlaWdodEZ1bmMpIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBHcmFwaCgpO1xuICB2YXIgcGFyZW50cyA9IHt9O1xuICB2YXIgcHEgPSBuZXcgUHJpb3JpdHlRdWV1ZSgpO1xuICB2YXIgdjtcblxuICBmdW5jdGlvbiB1cGRhdGVOZWlnaGJvcnMoZWRnZSkge1xuICAgIHZhciB3ID0gZWRnZS52ID09PSB2ID8gZWRnZS53IDogZWRnZS52O1xuICAgIHZhciBwcmkgPSBwcS5wcmlvcml0eSh3KTtcbiAgICBpZiAocHJpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBlZGdlV2VpZ2h0ID0gd2VpZ2h0RnVuYyhlZGdlKTtcbiAgICAgIGlmIChlZGdlV2VpZ2h0IDwgcHJpKSB7XG4gICAgICAgIHBhcmVudHNbd10gPSB2O1xuICAgICAgICBwcS5kZWNyZWFzZSh3LCBlZGdlV2VpZ2h0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZy5ub2RlQ291bnQoKSA9PT0gMCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBfLmVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgcHEuYWRkKHYsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgcmVzdWx0LnNldE5vZGUodik7XG4gIH0pO1xuXG4gIC8vIFN0YXJ0IGZyb20gYW4gYXJiaXRyYXJ5IG5vZGVcbiAgcHEuZGVjcmVhc2UoZy5ub2RlcygpWzBdLCAwKTtcblxuICB2YXIgaW5pdCA9IGZhbHNlO1xuICB3aGlsZSAocHEuc2l6ZSgpID4gMCkge1xuICAgIHYgPSBwcS5yZW1vdmVNaW4oKTtcbiAgICBpZiAoXy5oYXMocGFyZW50cywgdikpIHtcbiAgICAgIHJlc3VsdC5zZXRFZGdlKHYsIHBhcmVudHNbdl0pO1xuICAgIH0gZWxzZSBpZiAoaW5pdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5wdXQgZ3JhcGggaXMgbm90IGNvbm5lY3RlZDogXCIgKyBnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5pdCA9IHRydWU7XG4gICAgfVxuXG4gICAgZy5ub2RlRWRnZXModikuZm9yRWFjaCh1cGRhdGVOZWlnaGJvcnMpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB0YXJqYW47XG5cbmZ1bmN0aW9uIHRhcmphbihnKSB7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBzdGFjayA9IFtdO1xuICB2YXIgdmlzaXRlZCA9IHt9OyAvLyBub2RlIGlkIC0+IHsgb25TdGFjaywgbG93bGluaywgaW5kZXggfVxuICB2YXIgcmVzdWx0cyA9IFtdO1xuXG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgdmFyIGVudHJ5ID0gdmlzaXRlZFt2XSA9IHtcbiAgICAgIG9uU3RhY2s6IHRydWUsXG4gICAgICBsb3dsaW5rOiBpbmRleCxcbiAgICAgIGluZGV4OiBpbmRleCsrXG4gICAgfTtcbiAgICBzdGFjay5wdXNoKHYpO1xuXG4gICAgZy5zdWNjZXNzb3JzKHYpLmZvckVhY2goZnVuY3Rpb24odykge1xuICAgICAgaWYgKCFfLmhhcyh2aXNpdGVkLCB3KSkge1xuICAgICAgICBkZnModyk7XG4gICAgICAgIGVudHJ5Lmxvd2xpbmsgPSBNYXRoLm1pbihlbnRyeS5sb3dsaW5rLCB2aXNpdGVkW3ddLmxvd2xpbmspO1xuICAgICAgfSBlbHNlIGlmICh2aXNpdGVkW3ddLm9uU3RhY2spIHtcbiAgICAgICAgZW50cnkubG93bGluayA9IE1hdGgubWluKGVudHJ5Lmxvd2xpbmssIHZpc2l0ZWRbd10uaW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGVudHJ5Lmxvd2xpbmsgPT09IGVudHJ5LmluZGV4KSB7XG4gICAgICB2YXIgY21wdCA9IFtdO1xuICAgICAgdmFyIHc7XG4gICAgICBkbyB7XG4gICAgICAgIHcgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgdmlzaXRlZFt3XS5vblN0YWNrID0gZmFsc2U7XG4gICAgICAgIGNtcHQucHVzaCh3KTtcbiAgICAgIH0gd2hpbGUgKHYgIT09IHcpO1xuICAgICAgcmVzdWx0cy5wdXNoKGNtcHQpO1xuICAgIH1cbiAgfVxuXG4gIGcubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoIV8uaGFzKHZpc2l0ZWQsIHYpKSB7XG4gICAgICBkZnModik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0cztcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB0b3Bzb3J0O1xudG9wc29ydC5DeWNsZUV4Y2VwdGlvbiA9IEN5Y2xlRXhjZXB0aW9uO1xuXG5mdW5jdGlvbiB0b3Bzb3J0KGcpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgdmFyIHN0YWNrID0ge307XG4gIHZhciByZXN1bHRzID0gW107XG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZSkge1xuICAgIGlmIChfLmhhcyhzdGFjaywgbm9kZSkpIHtcbiAgICAgIHRocm93IG5ldyBDeWNsZUV4Y2VwdGlvbigpO1xuICAgIH1cblxuICAgIGlmICghXy5oYXModmlzaXRlZCwgbm9kZSkpIHtcbiAgICAgIHN0YWNrW25vZGVdID0gdHJ1ZTtcbiAgICAgIHZpc2l0ZWRbbm9kZV0gPSB0cnVlO1xuICAgICAgXy5lYWNoKGcucHJlZGVjZXNzb3JzKG5vZGUpLCB2aXNpdCk7XG4gICAgICBkZWxldGUgc3RhY2tbbm9kZV07XG4gICAgICByZXN1bHRzLnB1c2gobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgXy5lYWNoKGcuc2lua3MoKSwgdmlzaXQpO1xuXG4gIGlmIChfLnNpemUodmlzaXRlZCkgIT09IGcubm9kZUNvdW50KCkpIHtcbiAgICB0aHJvdyBuZXcgQ3ljbGVFeGNlcHRpb24oKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBDeWNsZUV4Y2VwdGlvbigpIHt9XG5DeWNsZUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsgLy8gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBFcnJvciB0byBwYXNzIHRlc3RpbmciLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gUHJpb3JpdHlRdWV1ZTtcblxuLyoqXG4gKiBBIG1pbi1wcmlvcml0eSBxdWV1ZSBkYXRhIHN0cnVjdHVyZS4gVGhpcyBhbGdvcml0aG0gaXMgZGVyaXZlZCBmcm9tIENvcm1lbixcbiAqIGV0IGFsLiwgXCJJbnRyb2R1Y3Rpb24gdG8gQWxnb3JpdGhtc1wiLiBUaGUgYmFzaWMgaWRlYSBvZiBhIG1pbi1wcmlvcml0eVxuICogcXVldWUgaXMgdGhhdCB5b3UgY2FuIGVmZmljaWVudGx5IChpbiBPKDEpIHRpbWUpIGdldCB0aGUgc21hbGxlc3Qga2V5IGluXG4gKiB0aGUgcXVldWUuIEFkZGluZyBhbmQgcmVtb3ZpbmcgZWxlbWVudHMgdGFrZXMgTyhsb2cgbikgdGltZS4gQSBrZXkgY2FuXG4gKiBoYXZlIGl0cyBwcmlvcml0eSBkZWNyZWFzZWQgaW4gTyhsb2cgbikgdGltZS5cbiAqL1xuZnVuY3Rpb24gUHJpb3JpdHlRdWV1ZSgpIHtcbiAgdGhpcy5fYXJyID0gW107XG4gIHRoaXMuX2tleUluZGljZXMgPSB7fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHF1ZXVlLiBUYWtlcyBgTygxKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fYXJyLmxlbmd0aDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUga2V5cyB0aGF0IGFyZSBpbiB0aGUgcXVldWUuIFRha2VzIGBPKG4pYCB0aW1lLlxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9hcnIubWFwKGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHgua2V5OyB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgKiprZXkqKiBpcyBpbiB0aGUgcXVldWUgYW5kIGBmYWxzZWAgaWYgbm90LlxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbihrZXkpIHtcbiAgcmV0dXJuIF8uaGFzKHRoaXMuX2tleUluZGljZXMsIGtleSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHByaW9yaXR5IGZvciAqKmtleSoqLiBJZiAqKmtleSoqIGlzIG5vdCBwcmVzZW50IGluIHRoZSBxdWV1ZVxuICogdGhlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYHVuZGVmaW5lZGAuIFRha2VzIGBPKDEpYCB0aW1lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBrZXlcbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucHJpb3JpdHkgPSBmdW5jdGlvbihrZXkpIHtcbiAgdmFyIGluZGV4ID0gdGhpcy5fa2V5SW5kaWNlc1trZXldO1xuICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5O1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhlIG1pbmltdW0gZWxlbWVudCBpbiB0aGlzIHF1ZXVlLiBJZiB0aGUgcXVldWUgaXNcbiAqIGVtcHR5IHRoaXMgZnVuY3Rpb24gdGhyb3dzIGFuIEVycm9yLiBUYWtlcyBgTygxKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUubWluID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnNpemUoKSA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlF1ZXVlIHVuZGVyZmxvd1wiKTtcbiAgfVxuICByZXR1cm4gdGhpcy5fYXJyWzBdLmtleTtcbn07XG5cbi8qKlxuICogSW5zZXJ0cyBhIG5ldyBrZXkgaW50byB0aGUgcHJpb3JpdHkgcXVldWUuIElmIHRoZSBrZXkgYWxyZWFkeSBleGlzdHMgaW5cbiAqIHRoZSBxdWV1ZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYGZhbHNlYDsgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIGB0cnVlYC5cbiAqIFRha2VzIGBPKG4pYCB0aW1lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBrZXkgdGhlIGtleSB0byBhZGRcbiAqIEBwYXJhbSB7TnVtYmVyfSBwcmlvcml0eSB0aGUgaW5pdGlhbCBwcmlvcml0eSBmb3IgdGhlIGtleVxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihrZXksIHByaW9yaXR5KSB7XG4gIHZhciBrZXlJbmRpY2VzID0gdGhpcy5fa2V5SW5kaWNlcztcbiAga2V5ID0gU3RyaW5nKGtleSk7XG4gIGlmICghXy5oYXMoa2V5SW5kaWNlcywga2V5KSkge1xuICAgIHZhciBhcnIgPSB0aGlzLl9hcnI7XG4gICAgdmFyIGluZGV4ID0gYXJyLmxlbmd0aDtcbiAgICBrZXlJbmRpY2VzW2tleV0gPSBpbmRleDtcbiAgICBhcnIucHVzaCh7a2V5OiBrZXksIHByaW9yaXR5OiBwcmlvcml0eX0pO1xuICAgIHRoaXMuX2RlY3JlYXNlKGluZGV4KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIHNtYWxsZXN0IGtleSBpbiB0aGUgcXVldWUuIFRha2VzIGBPKGxvZyBuKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucmVtb3ZlTWluID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3N3YXAoMCwgdGhpcy5fYXJyLmxlbmd0aCAtIDEpO1xuICB2YXIgbWluID0gdGhpcy5fYXJyLnBvcCgpO1xuICBkZWxldGUgdGhpcy5fa2V5SW5kaWNlc1ttaW4ua2V5XTtcbiAgdGhpcy5faGVhcGlmeSgwKTtcbiAgcmV0dXJuIG1pbi5rZXk7XG59O1xuXG4vKipcbiAqIERlY3JlYXNlcyB0aGUgcHJpb3JpdHkgZm9yICoqa2V5KiogdG8gKipwcmlvcml0eSoqLiBJZiB0aGUgbmV3IHByaW9yaXR5IGlzXG4gKiBncmVhdGVyIHRoYW4gdGhlIHByZXZpb3VzIHByaW9yaXR5LCB0aGlzIGZ1bmN0aW9uIHdpbGwgdGhyb3cgYW4gRXJyb3IuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGtleSB0aGUga2V5IGZvciB3aGljaCB0byByYWlzZSBwcmlvcml0eVxuICogQHBhcmFtIHtOdW1iZXJ9IHByaW9yaXR5IHRoZSBuZXcgcHJpb3JpdHkgZm9yIHRoZSBrZXlcbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuZGVjcmVhc2UgPSBmdW5jdGlvbihrZXksIHByaW9yaXR5KSB7XG4gIHZhciBpbmRleCA9IHRoaXMuX2tleUluZGljZXNba2V5XTtcbiAgaWYgKHByaW9yaXR5ID4gdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5ldyBwcmlvcml0eSBpcyBncmVhdGVyIHRoYW4gY3VycmVudCBwcmlvcml0eS4gXCIgK1xuICAgICAgICBcIktleTogXCIgKyBrZXkgKyBcIiBPbGQ6IFwiICsgdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSArIFwiIE5ldzogXCIgKyBwcmlvcml0eSk7XG4gIH1cbiAgdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSA9IHByaW9yaXR5O1xuICB0aGlzLl9kZWNyZWFzZShpbmRleCk7XG59O1xuXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5faGVhcGlmeSA9IGZ1bmN0aW9uKGkpIHtcbiAgdmFyIGFyciA9IHRoaXMuX2FycjtcbiAgdmFyIGwgPSAyICogaTtcbiAgdmFyIHIgPSBsICsgMTtcbiAgdmFyIGxhcmdlc3QgPSBpO1xuICBpZiAobCA8IGFyci5sZW5ndGgpIHtcbiAgICBsYXJnZXN0ID0gYXJyW2xdLnByaW9yaXR5IDwgYXJyW2xhcmdlc3RdLnByaW9yaXR5ID8gbCA6IGxhcmdlc3Q7XG4gICAgaWYgKHIgPCBhcnIubGVuZ3RoKSB7XG4gICAgICBsYXJnZXN0ID0gYXJyW3JdLnByaW9yaXR5IDwgYXJyW2xhcmdlc3RdLnByaW9yaXR5ID8gciA6IGxhcmdlc3Q7XG4gICAgfVxuICAgIGlmIChsYXJnZXN0ICE9PSBpKSB7XG4gICAgICB0aGlzLl9zd2FwKGksIGxhcmdlc3QpO1xuICAgICAgdGhpcy5faGVhcGlmeShsYXJnZXN0KTtcbiAgICB9XG4gIH1cbn07XG5cblByaW9yaXR5UXVldWUucHJvdG90eXBlLl9kZWNyZWFzZSA9IGZ1bmN0aW9uKGluZGV4KSB7XG4gIHZhciBhcnIgPSB0aGlzLl9hcnI7XG4gIHZhciBwcmlvcml0eSA9IGFycltpbmRleF0ucHJpb3JpdHk7XG4gIHZhciBwYXJlbnQ7XG4gIHdoaWxlIChpbmRleCAhPT0gMCkge1xuICAgIHBhcmVudCA9IGluZGV4ID4+IDE7XG4gICAgaWYgKGFycltwYXJlbnRdLnByaW9yaXR5IDwgcHJpb3JpdHkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLl9zd2FwKGluZGV4LCBwYXJlbnQpO1xuICAgIGluZGV4ID0gcGFyZW50O1xuICB9XG59O1xuXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5fc3dhcCA9IGZ1bmN0aW9uKGksIGopIHtcbiAgdmFyIGFyciA9IHRoaXMuX2FycjtcbiAgdmFyIGtleUluZGljZXMgPSB0aGlzLl9rZXlJbmRpY2VzO1xuICB2YXIgb3JpZ0FyckkgPSBhcnJbaV07XG4gIHZhciBvcmlnQXJySiA9IGFycltqXTtcbiAgYXJyW2ldID0gb3JpZ0Fycko7XG4gIGFycltqXSA9IG9yaWdBcnJJO1xuICBrZXlJbmRpY2VzW29yaWdBcnJKLmtleV0gPSBpO1xuICBrZXlJbmRpY2VzW29yaWdBcnJJLmtleV0gPSBqO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBHcmFwaDtcblxudmFyIERFRkFVTFRfRURHRV9OQU1FID0gXCJcXHgwMFwiO1xudmFyIEdSQVBIX05PREUgPSBcIlxceDAwXCI7XG52YXIgRURHRV9LRVlfREVMSU0gPSBcIlxceDAxXCI7XG5cbi8vIEltcGxlbWVudGF0aW9uIG5vdGVzOlxuLy9cbi8vICAqIE5vZGUgaWQgcXVlcnkgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gc3RyaW5nIGlkcyBmb3IgdGhlIG5vZGVzXG4vLyAgKiBFZGdlIGlkIHF1ZXJ5IGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuIGFuIFwiZWRnZU9ialwiLCBlZGdlIG9iamVjdCwgdGhhdCBpc1xuLy8gICAgY29tcG9zZWQgb2YgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuIGVkZ2U6IHt2LCB3LCBuYW1lfS5cbi8vICAqIEludGVybmFsbHkgd2UgdXNlIGFuIFwiZWRnZUlkXCIsIGEgc3RyaW5naWZpZWQgZm9ybSBvZiB0aGUgZWRnZU9iaiwgdG9cbi8vICAgIHJlZmVyZW5jZSBlZGdlcy4gVGhpcyBpcyBiZWNhdXNlIHdlIG5lZWQgYSBwZXJmb3JtYW50IHdheSB0byBsb29rIHRoZXNlXG4vLyAgICBlZGdlcyB1cCBhbmQsIG9iamVjdCBwcm9wZXJ0aWVzLCB3aGljaCBoYXZlIHN0cmluZyBrZXlzLCBhcmUgdGhlIGNsb3Nlc3Rcbi8vICAgIHdlJ3JlIGdvaW5nIHRvIGdldCB0byBhIHBlcmZvcm1hbnQgaGFzaHRhYmxlIGluIEphdmFTY3JpcHQuXG5cbmZ1bmN0aW9uIEdyYXBoKG9wdHMpIHtcbiAgdGhpcy5faXNEaXJlY3RlZCA9IF8uaGFzKG9wdHMsIFwiZGlyZWN0ZWRcIikgPyBvcHRzLmRpcmVjdGVkIDogdHJ1ZTtcbiAgdGhpcy5faXNNdWx0aWdyYXBoID0gXy5oYXMob3B0cywgXCJtdWx0aWdyYXBoXCIpID8gb3B0cy5tdWx0aWdyYXBoIDogZmFsc2U7XG4gIHRoaXMuX2lzQ29tcG91bmQgPSBfLmhhcyhvcHRzLCBcImNvbXBvdW5kXCIpID8gb3B0cy5jb21wb3VuZCA6IGZhbHNlO1xuXG4gIC8vIExhYmVsIGZvciB0aGUgZ3JhcGggaXRzZWxmXG4gIHRoaXMuX2xhYmVsID0gdW5kZWZpbmVkO1xuXG4gIC8vIERlZmF1bHRzIHRvIGJlIHNldCB3aGVuIGNyZWF0aW5nIGEgbmV3IG5vZGVcbiAgdGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuID0gXy5jb25zdGFudCh1bmRlZmluZWQpO1xuXG4gIC8vIERlZmF1bHRzIHRvIGJlIHNldCB3aGVuIGNyZWF0aW5nIGEgbmV3IGVkZ2VcbiAgdGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuID0gXy5jb25zdGFudCh1bmRlZmluZWQpO1xuXG4gIC8vIHYgLT4gbGFiZWxcbiAgdGhpcy5fbm9kZXMgPSB7fTtcblxuICBpZiAodGhpcy5faXNDb21wb3VuZCkge1xuICAgIC8vIHYgLT4gcGFyZW50XG4gICAgdGhpcy5fcGFyZW50ID0ge307XG5cbiAgICAvLyB2IC0+IGNoaWxkcmVuXG4gICAgdGhpcy5fY2hpbGRyZW4gPSB7fTtcbiAgICB0aGlzLl9jaGlsZHJlbltHUkFQSF9OT0RFXSA9IHt9O1xuICB9XG5cbiAgLy8gdiAtPiBlZGdlT2JqXG4gIHRoaXMuX2luID0ge307XG5cbiAgLy8gdSAtPiB2IC0+IE51bWJlclxuICB0aGlzLl9wcmVkcyA9IHt9O1xuXG4gIC8vIHYgLT4gZWRnZU9ialxuICB0aGlzLl9vdXQgPSB7fTtcblxuICAvLyB2IC0+IHcgLT4gTnVtYmVyXG4gIHRoaXMuX3N1Y3MgPSB7fTtcblxuICAvLyBlIC0+IGVkZ2VPYmpcbiAgdGhpcy5fZWRnZU9ianMgPSB7fTtcblxuICAvLyBlIC0+IGxhYmVsXG4gIHRoaXMuX2VkZ2VMYWJlbHMgPSB7fTtcbn1cblxuLyogTnVtYmVyIG9mIG5vZGVzIGluIHRoZSBncmFwaC4gU2hvdWxkIG9ubHkgYmUgY2hhbmdlZCBieSB0aGUgaW1wbGVtZW50YXRpb24uICovXG5HcmFwaC5wcm90b3R5cGUuX25vZGVDb3VudCA9IDA7XG5cbi8qIE51bWJlciBvZiBlZGdlcyBpbiB0aGUgZ3JhcGguIFNob3VsZCBvbmx5IGJlIGNoYW5nZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uLiAqL1xuR3JhcGgucHJvdG90eXBlLl9lZGdlQ291bnQgPSAwO1xuXG5cbi8qID09PSBHcmFwaCBmdW5jdGlvbnMgPT09PT09PT09ICovXG5cbkdyYXBoLnByb3RvdHlwZS5pc0RpcmVjdGVkID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9pc0RpcmVjdGVkO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmlzTXVsdGlncmFwaCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5faXNNdWx0aWdyYXBoO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmlzQ29tcG91bmQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2lzQ29tcG91bmQ7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0R3JhcGggPSBmdW5jdGlvbihsYWJlbCkge1xuICB0aGlzLl9sYWJlbCA9IGxhYmVsO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5ncmFwaCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fbGFiZWw7XG59O1xuXG5cbi8qID09PSBOb2RlIGZ1bmN0aW9ucyA9PT09PT09PT09ICovXG5cbkdyYXBoLnByb3RvdHlwZS5zZXREZWZhdWx0Tm9kZUxhYmVsID0gZnVuY3Rpb24obmV3RGVmYXVsdCkge1xuICBpZiAoIV8uaXNGdW5jdGlvbihuZXdEZWZhdWx0KSkge1xuICAgIG5ld0RlZmF1bHQgPSBfLmNvbnN0YW50KG5ld0RlZmF1bHQpO1xuICB9XG4gIHRoaXMuX2RlZmF1bHROb2RlTGFiZWxGbiA9IG5ld0RlZmF1bHQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLm5vZGVDb3VudCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fbm9kZUNvdW50O1xufTtcblxuR3JhcGgucHJvdG90eXBlLm5vZGVzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBfLmtleXModGhpcy5fbm9kZXMpO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNvdXJjZXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICByZXR1cm4gXy5maWx0ZXIodGhpcy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuIF8uaXNFbXB0eShzZWxmLl9pblt2XSk7XG4gIH0pO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNpbmtzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgcmV0dXJuIF8uZmlsdGVyKHRoaXMubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHJldHVybiBfLmlzRW1wdHkoc2VsZi5fb3V0W3ZdKTtcbiAgfSk7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0Tm9kZXMgPSBmdW5jdGlvbih2cywgdmFsdWUpIHtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgXy5lYWNoKHZzLCBmdW5jdGlvbih2KSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkge1xuICAgICAgc2VsZi5zZXROb2RlKHYsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5zZXROb2RlKHYpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNldE5vZGUgPSBmdW5jdGlvbih2LCB2YWx1ZSkge1xuICBpZiAoXy5oYXModGhpcy5fbm9kZXMsIHYpKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLl9ub2Rlc1t2XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRoaXMuX25vZGVzW3ZdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyB2YWx1ZSA6IHRoaXMuX2RlZmF1bHROb2RlTGFiZWxGbih2KTtcbiAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICB0aGlzLl9wYXJlbnRbdl0gPSBHUkFQSF9OT0RFO1xuICAgIHRoaXMuX2NoaWxkcmVuW3ZdID0ge307XG4gICAgdGhpcy5fY2hpbGRyZW5bR1JBUEhfTk9ERV1bdl0gPSB0cnVlO1xuICB9XG4gIHRoaXMuX2luW3ZdID0ge307XG4gIHRoaXMuX3ByZWRzW3ZdID0ge307XG4gIHRoaXMuX291dFt2XSA9IHt9O1xuICB0aGlzLl9zdWNzW3ZdID0ge307XG4gICsrdGhpcy5fbm9kZUNvdW50O1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5ub2RlID0gZnVuY3Rpb24odikge1xuICByZXR1cm4gdGhpcy5fbm9kZXNbdl07XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaGFzTm9kZSA9IGZ1bmN0aW9uKHYpIHtcbiAgcmV0dXJuIF8uaGFzKHRoaXMuX25vZGVzLCB2KTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5yZW1vdmVOb2RlID0gIGZ1bmN0aW9uKHYpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAoXy5oYXModGhpcy5fbm9kZXMsIHYpKSB7XG4gICAgdmFyIHJlbW92ZUVkZ2UgPSBmdW5jdGlvbihlKSB7IHNlbGYucmVtb3ZlRWRnZShzZWxmLl9lZGdlT2Jqc1tlXSk7IH07XG4gICAgZGVsZXRlIHRoaXMuX25vZGVzW3ZdO1xuICAgIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgICB0aGlzLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdCh2KTtcbiAgICAgIGRlbGV0ZSB0aGlzLl9wYXJlbnRbdl07XG4gICAgICBfLmVhY2godGhpcy5jaGlsZHJlbih2KSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgc2VsZi5zZXRQYXJlbnQoY2hpbGQpO1xuICAgICAgfSk7XG4gICAgICBkZWxldGUgdGhpcy5fY2hpbGRyZW5bdl07XG4gICAgfVxuICAgIF8uZWFjaChfLmtleXModGhpcy5faW5bdl0pLCByZW1vdmVFZGdlKTtcbiAgICBkZWxldGUgdGhpcy5faW5bdl07XG4gICAgZGVsZXRlIHRoaXMuX3ByZWRzW3ZdO1xuICAgIF8uZWFjaChfLmtleXModGhpcy5fb3V0W3ZdKSwgcmVtb3ZlRWRnZSk7XG4gICAgZGVsZXRlIHRoaXMuX291dFt2XTtcbiAgICBkZWxldGUgdGhpcy5fc3Vjc1t2XTtcbiAgICAtLXRoaXMuX25vZGVDb3VudDtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zZXRQYXJlbnQgPSBmdW5jdGlvbih2LCBwYXJlbnQpIHtcbiAgaWYgKCF0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHNldCBwYXJlbnQgaW4gYSBub24tY29tcG91bmQgZ3JhcGhcIik7XG4gIH1cblxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJlbnQpKSB7XG4gICAgcGFyZW50ID0gR1JBUEhfTk9ERTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDb2VyY2UgcGFyZW50IHRvIHN0cmluZ1xuICAgIHBhcmVudCArPSBcIlwiO1xuICAgIGZvciAodmFyIGFuY2VzdG9yID0gcGFyZW50O1xuICAgICAgIV8uaXNVbmRlZmluZWQoYW5jZXN0b3IpO1xuICAgICAgYW5jZXN0b3IgPSB0aGlzLnBhcmVudChhbmNlc3RvcikpIHtcbiAgICAgIGlmIChhbmNlc3RvciA9PT0gdikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZXR0aW5nIFwiICsgcGFyZW50KyBcIiBhcyBwYXJlbnQgb2YgXCIgKyB2ICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIHdvdWxkIGNyZWF0ZSBhIGN5Y2xlXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0Tm9kZShwYXJlbnQpO1xuICB9XG5cbiAgdGhpcy5zZXROb2RlKHYpO1xuICB0aGlzLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdCh2KTtcbiAgdGhpcy5fcGFyZW50W3ZdID0gcGFyZW50O1xuICB0aGlzLl9jaGlsZHJlbltwYXJlbnRdW3ZdID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0ID0gZnVuY3Rpb24odikge1xuICBkZWxldGUgdGhpcy5fY2hpbGRyZW5bdGhpcy5fcGFyZW50W3ZdXVt2XTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5wYXJlbnQgPSBmdW5jdGlvbih2KSB7XG4gIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMuX3BhcmVudFt2XTtcbiAgICBpZiAocGFyZW50ICE9PSBHUkFQSF9OT0RFKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLmNoaWxkcmVuID0gZnVuY3Rpb24odikge1xuICBpZiAoXy5pc1VuZGVmaW5lZCh2KSkge1xuICAgIHYgPSBHUkFQSF9OT0RFO1xuICB9XG5cbiAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLl9jaGlsZHJlblt2XTtcbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIHJldHVybiBfLmtleXMoY2hpbGRyZW4pO1xuICAgIH1cbiAgfSBlbHNlIGlmICh2ID09PSBHUkFQSF9OT0RFKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZXMoKTtcbiAgfSBlbHNlIGlmICh0aGlzLmhhc05vZGUodikpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5wcmVkZWNlc3NvcnMgPSBmdW5jdGlvbih2KSB7XG4gIHZhciBwcmVkc1YgPSB0aGlzLl9wcmVkc1t2XTtcbiAgaWYgKHByZWRzVikge1xuICAgIHJldHVybiBfLmtleXMocHJlZHNWKTtcbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLnN1Y2Nlc3NvcnMgPSBmdW5jdGlvbih2KSB7XG4gIHZhciBzdWNzViA9IHRoaXMuX3N1Y3Nbdl07XG4gIGlmIChzdWNzVikge1xuICAgIHJldHVybiBfLmtleXMoc3Vjc1YpO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUubmVpZ2hib3JzID0gZnVuY3Rpb24odikge1xuICB2YXIgcHJlZHMgPSB0aGlzLnByZWRlY2Vzc29ycyh2KTtcbiAgaWYgKHByZWRzKSB7XG4gICAgcmV0dXJuIF8udW5pb24ocHJlZHMsIHRoaXMuc3VjY2Vzc29ycyh2KSk7XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5pc0xlYWYgPSBmdW5jdGlvbiAodikge1xuICB2YXIgbmVpZ2hib3JzO1xuICBpZiAodGhpcy5pc0RpcmVjdGVkKCkpIHtcbiAgICBuZWlnaGJvcnMgPSB0aGlzLnN1Y2Nlc3NvcnModik7XG4gIH0gZWxzZSB7XG4gICAgbmVpZ2hib3JzID0gdGhpcy5uZWlnaGJvcnModik7XG4gIH1cbiAgcmV0dXJuIG5laWdoYm9ycy5sZW5ndGggPT09IDA7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuZmlsdGVyTm9kZXMgPSBmdW5jdGlvbihmaWx0ZXIpIHtcbiAgdmFyIGNvcHkgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih7XG4gICAgZGlyZWN0ZWQ6IHRoaXMuX2lzRGlyZWN0ZWQsXG4gICAgbXVsdGlncmFwaDogdGhpcy5faXNNdWx0aWdyYXBoLFxuICAgIGNvbXBvdW5kOiB0aGlzLl9pc0NvbXBvdW5kXG4gIH0pO1xuXG4gIGNvcHkuc2V0R3JhcGgodGhpcy5ncmFwaCgpKTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIF8uZWFjaCh0aGlzLl9ub2RlcywgZnVuY3Rpb24odmFsdWUsIHYpIHtcbiAgICBpZiAoZmlsdGVyKHYpKSB7XG4gICAgICBjb3B5LnNldE5vZGUodiwgdmFsdWUpO1xuICAgIH1cbiAgfSk7XG5cbiAgXy5lYWNoKHRoaXMuX2VkZ2VPYmpzLCBmdW5jdGlvbihlKSB7XG4gICAgaWYgKGNvcHkuaGFzTm9kZShlLnYpICYmIGNvcHkuaGFzTm9kZShlLncpKSB7XG4gICAgICBjb3B5LnNldEVkZ2UoZSwgc2VsZi5lZGdlKGUpKTtcbiAgICB9XG4gIH0pO1xuXG4gIHZhciBwYXJlbnRzID0ge307XG4gIGZ1bmN0aW9uIGZpbmRQYXJlbnQodikge1xuICAgIHZhciBwYXJlbnQgPSBzZWxmLnBhcmVudCh2KTtcbiAgICBpZiAocGFyZW50ID09PSB1bmRlZmluZWQgfHwgY29weS5oYXNOb2RlKHBhcmVudCkpIHtcbiAgICAgIHBhcmVudHNbdl0gPSBwYXJlbnQ7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH0gZWxzZSBpZiAocGFyZW50IGluIHBhcmVudHMpIHtcbiAgICAgIHJldHVybiBwYXJlbnRzW3BhcmVudF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kUGFyZW50KHBhcmVudCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICBfLmVhY2goY29weS5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgICBjb3B5LnNldFBhcmVudCh2LCBmaW5kUGFyZW50KHYpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb3B5O1xufTtcblxuLyogPT09IEVkZ2UgZnVuY3Rpb25zID09PT09PT09PT0gKi9cblxuR3JhcGgucHJvdG90eXBlLnNldERlZmF1bHRFZGdlTGFiZWwgPSBmdW5jdGlvbihuZXdEZWZhdWx0KSB7XG4gIGlmICghXy5pc0Z1bmN0aW9uKG5ld0RlZmF1bHQpKSB7XG4gICAgbmV3RGVmYXVsdCA9IF8uY29uc3RhbnQobmV3RGVmYXVsdCk7XG4gIH1cbiAgdGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuID0gbmV3RGVmYXVsdDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuZWRnZUNvdW50ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9lZGdlQ291bnQ7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuZWRnZXMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIF8udmFsdWVzKHRoaXMuX2VkZ2VPYmpzKTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zZXRQYXRoID0gZnVuY3Rpb24odnMsIHZhbHVlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIF8ucmVkdWNlKHZzLCBmdW5jdGlvbih2LCB3KSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkge1xuICAgICAgc2VsZi5zZXRFZGdlKHYsIHcsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5zZXRFZGdlKHYsIHcpO1xuICAgIH1cbiAgICByZXR1cm4gdztcbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLypcbiAqIHNldEVkZ2UodiwgdywgW3ZhbHVlLCBbbmFtZV1dKVxuICogc2V0RWRnZSh7IHYsIHcsIFtuYW1lXSB9LCBbdmFsdWVdKVxuICovXG5HcmFwaC5wcm90b3R5cGUuc2V0RWRnZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgdiwgdywgbmFtZSwgdmFsdWU7XG4gIHZhciB2YWx1ZVNwZWNpZmllZCA9IGZhbHNlO1xuICB2YXIgYXJnMCA9IGFyZ3VtZW50c1swXTtcblxuICBpZiAodHlwZW9mIGFyZzAgPT09IFwib2JqZWN0XCIgJiYgYXJnMCAhPT0gbnVsbCAmJiBcInZcIiBpbiBhcmcwKSB7XG4gICAgdiA9IGFyZzAudjtcbiAgICB3ID0gYXJnMC53O1xuICAgIG5hbWUgPSBhcmcwLm5hbWU7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHZhbHVlID0gYXJndW1lbnRzWzFdO1xuICAgICAgdmFsdWVTcGVjaWZpZWQgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2ID0gYXJnMDtcbiAgICB3ID0gYXJndW1lbnRzWzFdO1xuICAgIG5hbWUgPSBhcmd1bWVudHNbM107XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICB2YWx1ZSA9IGFyZ3VtZW50c1syXTtcbiAgICAgIHZhbHVlU3BlY2lmaWVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2ID0gXCJcIiArIHY7XG4gIHcgPSBcIlwiICsgdztcbiAgaWYgKCFfLmlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgbmFtZSA9IFwiXCIgKyBuYW1lO1xuICB9XG5cbiAgdmFyIGUgPSBlZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSk7XG4gIGlmIChfLmhhcyh0aGlzLl9lZGdlTGFiZWxzLCBlKSkge1xuICAgIGlmICh2YWx1ZVNwZWNpZmllZCkge1xuICAgICAgdGhpcy5fZWRnZUxhYmVsc1tlXSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmICghXy5pc1VuZGVmaW5lZChuYW1lKSAmJiAhdGhpcy5faXNNdWx0aWdyYXBoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHNldCBhIG5hbWVkIGVkZ2Ugd2hlbiBpc011bHRpZ3JhcGggPSBmYWxzZVwiKTtcbiAgfVxuXG4gIC8vIEl0IGRpZG4ndCBleGlzdCwgc28gd2UgbmVlZCB0byBjcmVhdGUgaXQuXG4gIC8vIEZpcnN0IGVuc3VyZSB0aGUgbm9kZXMgZXhpc3QuXG4gIHRoaXMuc2V0Tm9kZSh2KTtcbiAgdGhpcy5zZXROb2RlKHcpO1xuXG4gIHRoaXMuX2VkZ2VMYWJlbHNbZV0gPSB2YWx1ZVNwZWNpZmllZCA/IHZhbHVlIDogdGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuKHYsIHcsIG5hbWUpO1xuXG4gIHZhciBlZGdlT2JqID0gZWRnZUFyZ3NUb09iaih0aGlzLl9pc0RpcmVjdGVkLCB2LCB3LCBuYW1lKTtcbiAgLy8gRW5zdXJlIHdlIGFkZCB1bmRpcmVjdGVkIGVkZ2VzIGluIGEgY29uc2lzdGVudCB3YXkuXG4gIHYgPSBlZGdlT2JqLnY7XG4gIHcgPSBlZGdlT2JqLnc7XG5cbiAgT2JqZWN0LmZyZWV6ZShlZGdlT2JqKTtcbiAgdGhpcy5fZWRnZU9ianNbZV0gPSBlZGdlT2JqO1xuICBpbmNyZW1lbnRPckluaXRFbnRyeSh0aGlzLl9wcmVkc1t3XSwgdik7XG4gIGluY3JlbWVudE9ySW5pdEVudHJ5KHRoaXMuX3N1Y3Nbdl0sIHcpO1xuICB0aGlzLl9pblt3XVtlXSA9IGVkZ2VPYmo7XG4gIHRoaXMuX291dFt2XVtlXSA9IGVkZ2VPYmo7XG4gIHRoaXMuX2VkZ2VDb3VudCsrO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5lZGdlID0gZnVuY3Rpb24odiwgdywgbmFtZSkge1xuICB2YXIgZSA9IChhcmd1bWVudHMubGVuZ3RoID09PSAxXG4gICAgPyBlZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCBhcmd1bWVudHNbMF0pXG4gICAgOiBlZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSkpO1xuICByZXR1cm4gdGhpcy5fZWRnZUxhYmVsc1tlXTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5oYXNFZGdlID0gZnVuY3Rpb24odiwgdywgbmFtZSkge1xuICB2YXIgZSA9IChhcmd1bWVudHMubGVuZ3RoID09PSAxXG4gICAgPyBlZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCBhcmd1bWVudHNbMF0pXG4gICAgOiBlZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSkpO1xuICByZXR1cm4gXy5oYXModGhpcy5fZWRnZUxhYmVscywgZSk7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUucmVtb3ZlRWRnZSA9IGZ1bmN0aW9uKHYsIHcsIG5hbWUpIHtcbiAgdmFyIGUgPSAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMVxuICAgID8gZWRnZU9ialRvSWQodGhpcy5faXNEaXJlY3RlZCwgYXJndW1lbnRzWzBdKVxuICAgIDogZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIHYsIHcsIG5hbWUpKTtcbiAgdmFyIGVkZ2UgPSB0aGlzLl9lZGdlT2Jqc1tlXTtcbiAgaWYgKGVkZ2UpIHtcbiAgICB2ID0gZWRnZS52O1xuICAgIHcgPSBlZGdlLnc7XG4gICAgZGVsZXRlIHRoaXMuX2VkZ2VMYWJlbHNbZV07XG4gICAgZGVsZXRlIHRoaXMuX2VkZ2VPYmpzW2VdO1xuICAgIGRlY3JlbWVudE9yUmVtb3ZlRW50cnkodGhpcy5fcHJlZHNbd10sIHYpO1xuICAgIGRlY3JlbWVudE9yUmVtb3ZlRW50cnkodGhpcy5fc3Vjc1t2XSwgdyk7XG4gICAgZGVsZXRlIHRoaXMuX2luW3ddW2VdO1xuICAgIGRlbGV0ZSB0aGlzLl9vdXRbdl1bZV07XG4gICAgdGhpcy5fZWRnZUNvdW50LS07XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaW5FZGdlcyA9IGZ1bmN0aW9uKHYsIHUpIHtcbiAgdmFyIGluViA9IHRoaXMuX2luW3ZdO1xuICBpZiAoaW5WKSB7XG4gICAgdmFyIGVkZ2VzID0gXy52YWx1ZXMoaW5WKTtcbiAgICBpZiAoIXUpIHtcbiAgICAgIHJldHVybiBlZGdlcztcbiAgICB9XG4gICAgcmV0dXJuIF8uZmlsdGVyKGVkZ2VzLCBmdW5jdGlvbihlZGdlKSB7IHJldHVybiBlZGdlLnYgPT09IHU7IH0pO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUub3V0RWRnZXMgPSBmdW5jdGlvbih2LCB3KSB7XG4gIHZhciBvdXRWID0gdGhpcy5fb3V0W3ZdO1xuICBpZiAob3V0Vikge1xuICAgIHZhciBlZGdlcyA9IF8udmFsdWVzKG91dFYpO1xuICAgIGlmICghdykge1xuICAgICAgcmV0dXJuIGVkZ2VzO1xuICAgIH1cbiAgICByZXR1cm4gXy5maWx0ZXIoZWRnZXMsIGZ1bmN0aW9uKGVkZ2UpIHsgcmV0dXJuIGVkZ2UudyA9PT0gdzsgfSk7XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5ub2RlRWRnZXMgPSBmdW5jdGlvbih2LCB3KSB7XG4gIHZhciBpbkVkZ2VzID0gdGhpcy5pbkVkZ2VzKHYsIHcpO1xuICBpZiAoaW5FZGdlcykge1xuICAgIHJldHVybiBpbkVkZ2VzLmNvbmNhdCh0aGlzLm91dEVkZ2VzKHYsIHcpKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gaW5jcmVtZW50T3JJbml0RW50cnkobWFwLCBrKSB7XG4gIGlmIChtYXBba10pIHtcbiAgICBtYXBba10rKztcbiAgfSBlbHNlIHtcbiAgICBtYXBba10gPSAxO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlY3JlbWVudE9yUmVtb3ZlRW50cnkobWFwLCBrKSB7XG4gIGlmICghLS1tYXBba10pIHsgZGVsZXRlIG1hcFtrXTsgfVxufVxuXG5mdW5jdGlvbiBlZGdlQXJnc1RvSWQoaXNEaXJlY3RlZCwgdl8sIHdfLCBuYW1lKSB7XG4gIHZhciB2ID0gXCJcIiArIHZfO1xuICB2YXIgdyA9IFwiXCIgKyB3XztcbiAgaWYgKCFpc0RpcmVjdGVkICYmIHYgPiB3KSB7XG4gICAgdmFyIHRtcCA9IHY7XG4gICAgdiA9IHc7XG4gICAgdyA9IHRtcDtcbiAgfVxuICByZXR1cm4gdiArIEVER0VfS0VZX0RFTElNICsgdyArIEVER0VfS0VZX0RFTElNICtcbiAgICAgICAgICAgICAoXy5pc1VuZGVmaW5lZChuYW1lKSA/IERFRkFVTFRfRURHRV9OQU1FIDogbmFtZSk7XG59XG5cbmZ1bmN0aW9uIGVkZ2VBcmdzVG9PYmooaXNEaXJlY3RlZCwgdl8sIHdfLCBuYW1lKSB7XG4gIHZhciB2ID0gXCJcIiArIHZfO1xuICB2YXIgdyA9IFwiXCIgKyB3XztcbiAgaWYgKCFpc0RpcmVjdGVkICYmIHYgPiB3KSB7XG4gICAgdmFyIHRtcCA9IHY7XG4gICAgdiA9IHc7XG4gICAgdyA9IHRtcDtcbiAgfVxuICB2YXIgZWRnZU9iaiA9ICB7IHY6IHYsIHc6IHcgfTtcbiAgaWYgKG5hbWUpIHtcbiAgICBlZGdlT2JqLm5hbWUgPSBuYW1lO1xuICB9XG4gIHJldHVybiBlZGdlT2JqO1xufVxuXG5mdW5jdGlvbiBlZGdlT2JqVG9JZChpc0RpcmVjdGVkLCBlZGdlT2JqKSB7XG4gIHJldHVybiBlZGdlQXJnc1RvSWQoaXNEaXJlY3RlZCwgZWRnZU9iai52LCBlZGdlT2JqLncsIGVkZ2VPYmoubmFtZSk7XG59XG4iLCIvLyBJbmNsdWRlcyBvbmx5IHRoZSBcImNvcmVcIiBvZiBncmFwaGxpYlxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEdyYXBoOiByZXF1aXJlKFwiLi9ncmFwaFwiKSxcbiAgdmVyc2lvbjogcmVxdWlyZShcIi4vdmVyc2lvblwiKVxufTtcbiIsInZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4vZ3JhcGhcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB3cml0ZTogd3JpdGUsXG4gIHJlYWQ6IHJlYWRcbn07XG5cbmZ1bmN0aW9uIHdyaXRlKGcpIHtcbiAgdmFyIGpzb24gPSB7XG4gICAgb3B0aW9uczoge1xuICAgICAgZGlyZWN0ZWQ6IGcuaXNEaXJlY3RlZCgpLFxuICAgICAgbXVsdGlncmFwaDogZy5pc011bHRpZ3JhcGgoKSxcbiAgICAgIGNvbXBvdW5kOiBnLmlzQ29tcG91bmQoKVxuICAgIH0sXG4gICAgbm9kZXM6IHdyaXRlTm9kZXMoZyksXG4gICAgZWRnZXM6IHdyaXRlRWRnZXMoZylcbiAgfTtcbiAgaWYgKCFfLmlzVW5kZWZpbmVkKGcuZ3JhcGgoKSkpIHtcbiAgICBqc29uLnZhbHVlID0gXy5jbG9uZShnLmdyYXBoKCkpO1xuICB9XG4gIHJldHVybiBqc29uO1xufVxuXG5mdW5jdGlvbiB3cml0ZU5vZGVzKGcpIHtcbiAgcmV0dXJuIF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlVmFsdWUgPSBnLm5vZGUodik7XG4gICAgdmFyIHBhcmVudCA9IGcucGFyZW50KHYpO1xuICAgIHZhciBub2RlID0geyB2OiB2IH07XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKG5vZGVWYWx1ZSkpIHtcbiAgICAgIG5vZGUudmFsdWUgPSBub2RlVmFsdWU7XG4gICAgfVxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJlbnQpKSB7XG4gICAgICBub2RlLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB3cml0ZUVkZ2VzKGcpIHtcbiAgcmV0dXJuIF8ubWFwKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlVmFsdWUgPSBnLmVkZ2UoZSk7XG4gICAgdmFyIGVkZ2UgPSB7IHY6IGUudiwgdzogZS53IH07XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGUubmFtZSkpIHtcbiAgICAgIGVkZ2UubmFtZSA9IGUubmFtZTtcbiAgICB9XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGVkZ2VWYWx1ZSkpIHtcbiAgICAgIGVkZ2UudmFsdWUgPSBlZGdlVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBlZGdlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZChqc29uKSB7XG4gIHZhciBnID0gbmV3IEdyYXBoKGpzb24ub3B0aW9ucykuc2V0R3JhcGgoanNvbi52YWx1ZSk7XG4gIF8uZWFjaChqc29uLm5vZGVzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIGcuc2V0Tm9kZShlbnRyeS52LCBlbnRyeS52YWx1ZSk7XG4gICAgaWYgKGVudHJ5LnBhcmVudCkge1xuICAgICAgZy5zZXRQYXJlbnQoZW50cnkudiwgZW50cnkucGFyZW50KTtcbiAgICB9XG4gIH0pO1xuICBfLmVhY2goanNvbi5lZGdlcywgZnVuY3Rpb24oZW50cnkpIHtcbiAgICBnLnNldEVkZ2UoeyB2OiBlbnRyeS52LCB3OiBlbnRyeS53LCBuYW1lOiBlbnRyeS5uYW1lIH0sIGVudHJ5LnZhbHVlKTtcbiAgfSk7XG4gIHJldHVybiBnO1xufVxuIiwiLyogZ2xvYmFsIHdpbmRvdyAqL1xuXG52YXIgbG9kYXNoO1xuXG5pZiAodHlwZW9mIHJlcXVpcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICB0cnkge1xuICAgIGxvZGFzaCA9IHtcbiAgICAgIGNsb25lOiByZXF1aXJlKFwibG9kYXNoL2Nsb25lXCIpLFxuICAgICAgY29uc3RhbnQ6IHJlcXVpcmUoXCJsb2Rhc2gvY29uc3RhbnRcIiksXG4gICAgICBlYWNoOiByZXF1aXJlKFwibG9kYXNoL2VhY2hcIiksXG4gICAgICBmaWx0ZXI6IHJlcXVpcmUoXCJsb2Rhc2gvZmlsdGVyXCIpLFxuICAgICAgaGFzOiAgcmVxdWlyZShcImxvZGFzaC9oYXNcIiksXG4gICAgICBpc0FycmF5OiByZXF1aXJlKFwibG9kYXNoL2lzQXJyYXlcIiksXG4gICAgICBpc0VtcHR5OiByZXF1aXJlKFwibG9kYXNoL2lzRW1wdHlcIiksXG4gICAgICBpc0Z1bmN0aW9uOiByZXF1aXJlKFwibG9kYXNoL2lzRnVuY3Rpb25cIiksXG4gICAgICBpc1VuZGVmaW5lZDogcmVxdWlyZShcImxvZGFzaC9pc1VuZGVmaW5lZFwiKSxcbiAgICAgIGtleXM6IHJlcXVpcmUoXCJsb2Rhc2gva2V5c1wiKSxcbiAgICAgIG1hcDogcmVxdWlyZShcImxvZGFzaC9tYXBcIiksXG4gICAgICByZWR1Y2U6IHJlcXVpcmUoXCJsb2Rhc2gvcmVkdWNlXCIpLFxuICAgICAgc2l6ZTogcmVxdWlyZShcImxvZGFzaC9zaXplXCIpLFxuICAgICAgdHJhbnNmb3JtOiByZXF1aXJlKFwibG9kYXNoL3RyYW5zZm9ybVwiKSxcbiAgICAgIHVuaW9uOiByZXF1aXJlKFwibG9kYXNoL3VuaW9uXCIpLFxuICAgICAgdmFsdWVzOiByZXF1aXJlKFwibG9kYXNoL3ZhbHVlc1wiKVxuICAgIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBjb250aW51ZSByZWdhcmRsZXNzIG9mIGVycm9yXG4gIH1cbn1cblxuaWYgKCFsb2Rhc2gpIHtcbiAgbG9kYXNoID0gd2luZG93Ll87XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbG9kYXNoO1xuIiwibW9kdWxlLmV4cG9ydHMgPSAnMi4xLjgnO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9oZWFwJyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuOC4wXG4oZnVuY3Rpb24oKSB7XG4gIHZhciBIZWFwLCBkZWZhdWx0Q21wLCBmbG9vciwgaGVhcGlmeSwgaGVhcHBvcCwgaGVhcHB1c2gsIGhlYXBwdXNocG9wLCBoZWFwcmVwbGFjZSwgaW5zb3J0LCBtaW4sIG5sYXJnZXN0LCBuc21hbGxlc3QsIHVwZGF0ZUl0ZW0sIF9zaWZ0ZG93biwgX3NpZnR1cDtcblxuICBmbG9vciA9IE1hdGguZmxvb3IsIG1pbiA9IE1hdGgubWluO1xuXG5cbiAgLypcbiAgRGVmYXVsdCBjb21wYXJpc29uIGZ1bmN0aW9uIHRvIGJlIHVzZWRcbiAgICovXG5cbiAgZGVmYXVsdENtcCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICBpZiAoeCA8IHkpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgaWYgKHggPiB5KSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH07XG5cblxuICAvKlxuICBJbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYW5kIGtlZXAgaXQgc29ydGVkIGFzc3VtaW5nIGEgaXMgc29ydGVkLlxuICBcbiAgSWYgeCBpcyBhbHJlYWR5IGluIGEsIGluc2VydCBpdCB0byB0aGUgcmlnaHQgb2YgdGhlIHJpZ2h0bW9zdCB4LlxuICBcbiAgT3B0aW9uYWwgYXJncyBsbyAoZGVmYXVsdCAwKSBhbmQgaGkgKGRlZmF1bHQgYS5sZW5ndGgpIGJvdW5kIHRoZSBzbGljZVxuICBvZiBhIHRvIGJlIHNlYXJjaGVkLlxuICAgKi9cblxuICBpbnNvcnQgPSBmdW5jdGlvbihhLCB4LCBsbywgaGksIGNtcCkge1xuICAgIHZhciBtaWQ7XG4gICAgaWYgKGxvID09IG51bGwpIHtcbiAgICAgIGxvID0gMDtcbiAgICB9XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICBpZiAobG8gPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xvIG11c3QgYmUgbm9uLW5lZ2F0aXZlJyk7XG4gICAgfVxuICAgIGlmIChoaSA9PSBudWxsKSB7XG4gICAgICBoaSA9IGEubGVuZ3RoO1xuICAgIH1cbiAgICB3aGlsZSAobG8gPCBoaSkge1xuICAgICAgbWlkID0gZmxvb3IoKGxvICsgaGkpIC8gMik7XG4gICAgICBpZiAoY21wKHgsIGFbbWlkXSkgPCAwKSB7XG4gICAgICAgIGhpID0gbWlkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG8gPSBtaWQgKyAxO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKFtdLnNwbGljZS5hcHBseShhLCBbbG8sIGxvIC0gbG9dLmNvbmNhdCh4KSksIHgpO1xuICB9O1xuXG5cbiAgLypcbiAgUHVzaCBpdGVtIG9udG8gaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LlxuICAgKi9cblxuICBoZWFwcHVzaCA9IGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBjbXApIHtcbiAgICBpZiAoY21wID09IG51bGwpIHtcbiAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG4gICAgfVxuICAgIGFycmF5LnB1c2goaXRlbSk7XG4gICAgcmV0dXJuIF9zaWZ0ZG93bihhcnJheSwgMCwgYXJyYXkubGVuZ3RoIC0gMSwgY21wKTtcbiAgfTtcblxuXG4gIC8qXG4gIFBvcCB0aGUgc21hbGxlc3QgaXRlbSBvZmYgdGhlIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC5cbiAgICovXG5cbiAgaGVhcHBvcCA9IGZ1bmN0aW9uKGFycmF5LCBjbXApIHtcbiAgICB2YXIgbGFzdGVsdCwgcmV0dXJuaXRlbTtcbiAgICBpZiAoY21wID09IG51bGwpIHtcbiAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG4gICAgfVxuICAgIGxhc3RlbHQgPSBhcnJheS5wb3AoKTtcbiAgICBpZiAoYXJyYXkubGVuZ3RoKSB7XG4gICAgICByZXR1cm5pdGVtID0gYXJyYXlbMF07XG4gICAgICBhcnJheVswXSA9IGxhc3RlbHQ7XG4gICAgICBfc2lmdHVwKGFycmF5LCAwLCBjbXApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm5pdGVtID0gbGFzdGVsdDtcbiAgICB9XG4gICAgcmV0dXJuIHJldHVybml0ZW07XG4gIH07XG5cblxuICAvKlxuICBQb3AgYW5kIHJldHVybiB0aGUgY3VycmVudCBzbWFsbGVzdCB2YWx1ZSwgYW5kIGFkZCB0aGUgbmV3IGl0ZW0uXG4gIFxuICBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gaGVhcHBvcCgpIGZvbGxvd2VkIGJ5IGhlYXBwdXNoKCksIGFuZCBjYW4gYmVcbiAgbW9yZSBhcHByb3ByaWF0ZSB3aGVuIHVzaW5nIGEgZml4ZWQgc2l6ZSBoZWFwLiBOb3RlIHRoYXQgdGhlIHZhbHVlXG4gIHJldHVybmVkIG1heSBiZSBsYXJnZXIgdGhhbiBpdGVtISBUaGF0IGNvbnN0cmFpbnMgcmVhc29uYWJsZSB1c2Ugb2ZcbiAgdGhpcyByb3V0aW5lIHVubGVzcyB3cml0dGVuIGFzIHBhcnQgb2YgYSBjb25kaXRpb25hbCByZXBsYWNlbWVudDpcbiAgICAgIGlmIGl0ZW0gPiBhcnJheVswXVxuICAgICAgICBpdGVtID0gaGVhcHJlcGxhY2UoYXJyYXksIGl0ZW0pXG4gICAqL1xuXG4gIGhlYXByZXBsYWNlID0gZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGNtcCkge1xuICAgIHZhciByZXR1cm5pdGVtO1xuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgcmV0dXJuaXRlbSA9IGFycmF5WzBdO1xuICAgIGFycmF5WzBdID0gaXRlbTtcbiAgICBfc2lmdHVwKGFycmF5LCAwLCBjbXApO1xuICAgIHJldHVybiByZXR1cm5pdGVtO1xuICB9O1xuXG5cbiAgLypcbiAgRmFzdCB2ZXJzaW9uIG9mIGEgaGVhcHB1c2ggZm9sbG93ZWQgYnkgYSBoZWFwcG9wLlxuICAgKi9cblxuICBoZWFwcHVzaHBvcCA9IGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBjbXApIHtcbiAgICB2YXIgX3JlZjtcbiAgICBpZiAoY21wID09IG51bGwpIHtcbiAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG4gICAgfVxuICAgIGlmIChhcnJheS5sZW5ndGggJiYgY21wKGFycmF5WzBdLCBpdGVtKSA8IDApIHtcbiAgICAgIF9yZWYgPSBbYXJyYXlbMF0sIGl0ZW1dLCBpdGVtID0gX3JlZlswXSwgYXJyYXlbMF0gPSBfcmVmWzFdO1xuICAgICAgX3NpZnR1cChhcnJheSwgMCwgY21wKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW07XG4gIH07XG5cblxuICAvKlxuICBUcmFuc2Zvcm0gbGlzdCBpbnRvIGEgaGVhcCwgaW4tcGxhY2UsIGluIE8oYXJyYXkubGVuZ3RoKSB0aW1lLlxuICAgKi9cblxuICBoZWFwaWZ5ID0gZnVuY3Rpb24oYXJyYXksIGNtcCkge1xuICAgIHZhciBpLCBfaSwgX2osIF9sZW4sIF9yZWYsIF9yZWYxLCBfcmVzdWx0cywgX3Jlc3VsdHMxO1xuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgX3JlZjEgPSAoZnVuY3Rpb24oKSB7XG4gICAgICBfcmVzdWx0czEgPSBbXTtcbiAgICAgIGZvciAodmFyIF9qID0gMCwgX3JlZiA9IGZsb29yKGFycmF5Lmxlbmd0aCAvIDIpOyAwIDw9IF9yZWYgPyBfaiA8IF9yZWYgOiBfaiA+IF9yZWY7IDAgPD0gX3JlZiA/IF9qKysgOiBfai0tKXsgX3Jlc3VsdHMxLnB1c2goX2opOyB9XG4gICAgICByZXR1cm4gX3Jlc3VsdHMxO1xuICAgIH0pLmFwcGx5KHRoaXMpLnJldmVyc2UoKTtcbiAgICBfcmVzdWx0cyA9IFtdO1xuICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgIGkgPSBfcmVmMVtfaV07XG4gICAgICBfcmVzdWx0cy5wdXNoKF9zaWZ0dXAoYXJyYXksIGksIGNtcCkpO1xuICAgIH1cbiAgICByZXR1cm4gX3Jlc3VsdHM7XG4gIH07XG5cblxuICAvKlxuICBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBnaXZlbiBpdGVtIGluIHRoZSBoZWFwLlxuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZXZlcnkgdGltZSB0aGUgaXRlbSBpcyBiZWluZyBtb2RpZmllZC5cbiAgICovXG5cbiAgdXBkYXRlSXRlbSA9IGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBjbXApIHtcbiAgICB2YXIgcG9zO1xuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgcG9zID0gYXJyYXkuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAocG9zID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBfc2lmdGRvd24oYXJyYXksIDAsIHBvcywgY21wKTtcbiAgICByZXR1cm4gX3NpZnR1cChhcnJheSwgcG9zLCBjbXApO1xuICB9O1xuXG5cbiAgLypcbiAgRmluZCB0aGUgbiBsYXJnZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cbiAgICovXG5cbiAgbmxhcmdlc3QgPSBmdW5jdGlvbihhcnJheSwgbiwgY21wKSB7XG4gICAgdmFyIGVsZW0sIHJlc3VsdCwgX2ksIF9sZW4sIF9yZWY7XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICByZXN1bHQgPSBhcnJheS5zbGljZSgwLCBuKTtcbiAgICBpZiAoIXJlc3VsdC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGhlYXBpZnkocmVzdWx0LCBjbXApO1xuICAgIF9yZWYgPSBhcnJheS5zbGljZShuKTtcbiAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgIGVsZW0gPSBfcmVmW19pXTtcbiAgICAgIGhlYXBwdXNocG9wKHJlc3VsdCwgZWxlbSwgY21wKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5zb3J0KGNtcCkucmV2ZXJzZSgpO1xuICB9O1xuXG5cbiAgLypcbiAgRmluZCB0aGUgbiBzbWFsbGVzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuXG4gICAqL1xuXG4gIG5zbWFsbGVzdCA9IGZ1bmN0aW9uKGFycmF5LCBuLCBjbXApIHtcbiAgICB2YXIgZWxlbSwgaSwgbG9zLCByZXN1bHQsIF9pLCBfaiwgX2xlbiwgX3JlZiwgX3JlZjEsIF9yZXN1bHRzO1xuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgaWYgKG4gKiAxMCA8PSBhcnJheS5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdCA9IGFycmF5LnNsaWNlKDAsIG4pLnNvcnQoY21wKTtcbiAgICAgIGlmICghcmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgbG9zID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcbiAgICAgIF9yZWYgPSBhcnJheS5zbGljZShuKTtcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICBlbGVtID0gX3JlZltfaV07XG4gICAgICAgIGlmIChjbXAoZWxlbSwgbG9zKSA8IDApIHtcbiAgICAgICAgICBpbnNvcnQocmVzdWx0LCBlbGVtLCAwLCBudWxsLCBjbXApO1xuICAgICAgICAgIHJlc3VsdC5wb3AoKTtcbiAgICAgICAgICBsb3MgPSByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBoZWFwaWZ5KGFycmF5LCBjbXApO1xuICAgIF9yZXN1bHRzID0gW107XG4gICAgZm9yIChpID0gX2ogPSAwLCBfcmVmMSA9IG1pbihuLCBhcnJheS5sZW5ndGgpOyAwIDw9IF9yZWYxID8gX2ogPCBfcmVmMSA6IF9qID4gX3JlZjE7IGkgPSAwIDw9IF9yZWYxID8gKytfaiA6IC0tX2opIHtcbiAgICAgIF9yZXN1bHRzLnB1c2goaGVhcHBvcChhcnJheSwgY21wKSk7XG4gICAgfVxuICAgIHJldHVybiBfcmVzdWx0cztcbiAgfTtcblxuICBfc2lmdGRvd24gPSBmdW5jdGlvbihhcnJheSwgc3RhcnRwb3MsIHBvcywgY21wKSB7XG4gICAgdmFyIG5ld2l0ZW0sIHBhcmVudCwgcGFyZW50cG9zO1xuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgbmV3aXRlbSA9IGFycmF5W3Bvc107XG4gICAgd2hpbGUgKHBvcyA+IHN0YXJ0cG9zKSB7XG4gICAgICBwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMTtcbiAgICAgIHBhcmVudCA9IGFycmF5W3BhcmVudHBvc107XG4gICAgICBpZiAoY21wKG5ld2l0ZW0sIHBhcmVudCkgPCAwKSB7XG4gICAgICAgIGFycmF5W3Bvc10gPSBwYXJlbnQ7XG4gICAgICAgIHBvcyA9IHBhcmVudHBvcztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5W3Bvc10gPSBuZXdpdGVtO1xuICB9O1xuXG4gIF9zaWZ0dXAgPSBmdW5jdGlvbihhcnJheSwgcG9zLCBjbXApIHtcbiAgICB2YXIgY2hpbGRwb3MsIGVuZHBvcywgbmV3aXRlbSwgcmlnaHRwb3MsIHN0YXJ0cG9zO1xuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgZW5kcG9zID0gYXJyYXkubGVuZ3RoO1xuICAgIHN0YXJ0cG9zID0gcG9zO1xuICAgIG5ld2l0ZW0gPSBhcnJheVtwb3NdO1xuICAgIGNoaWxkcG9zID0gMiAqIHBvcyArIDE7XG4gICAgd2hpbGUgKGNoaWxkcG9zIDwgZW5kcG9zKSB7XG4gICAgICByaWdodHBvcyA9IGNoaWxkcG9zICsgMTtcbiAgICAgIGlmIChyaWdodHBvcyA8IGVuZHBvcyAmJiAhKGNtcChhcnJheVtjaGlsZHBvc10sIGFycmF5W3JpZ2h0cG9zXSkgPCAwKSkge1xuICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zO1xuICAgICAgfVxuICAgICAgYXJyYXlbcG9zXSA9IGFycmF5W2NoaWxkcG9zXTtcbiAgICAgIHBvcyA9IGNoaWxkcG9zO1xuICAgICAgY2hpbGRwb3MgPSAyICogcG9zICsgMTtcbiAgICB9XG4gICAgYXJyYXlbcG9zXSA9IG5ld2l0ZW07XG4gICAgcmV0dXJuIF9zaWZ0ZG93bihhcnJheSwgc3RhcnRwb3MsIHBvcywgY21wKTtcbiAgfTtcblxuICBIZWFwID0gKGZ1bmN0aW9uKCkge1xuICAgIEhlYXAucHVzaCA9IGhlYXBwdXNoO1xuXG4gICAgSGVhcC5wb3AgPSBoZWFwcG9wO1xuXG4gICAgSGVhcC5yZXBsYWNlID0gaGVhcHJlcGxhY2U7XG5cbiAgICBIZWFwLnB1c2hwb3AgPSBoZWFwcHVzaHBvcDtcblxuICAgIEhlYXAuaGVhcGlmeSA9IGhlYXBpZnk7XG5cbiAgICBIZWFwLnVwZGF0ZUl0ZW0gPSB1cGRhdGVJdGVtO1xuXG4gICAgSGVhcC5ubGFyZ2VzdCA9IG5sYXJnZXN0O1xuXG4gICAgSGVhcC5uc21hbGxlc3QgPSBuc21hbGxlc3Q7XG5cbiAgICBmdW5jdGlvbiBIZWFwKGNtcCkge1xuICAgICAgdGhpcy5jbXAgPSBjbXAgIT0gbnVsbCA/IGNtcCA6IGRlZmF1bHRDbXA7XG4gICAgICB0aGlzLm5vZGVzID0gW107XG4gICAgfVxuXG4gICAgSGVhcC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiBoZWFwcHVzaCh0aGlzLm5vZGVzLCB4LCB0aGlzLmNtcCk7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGhlYXBwb3AodGhpcy5ub2RlcywgdGhpcy5jbXApO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2Rlc1swXTtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2Rlcy5pbmRleE9mKHgpICE9PSAtMTtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUucmVwbGFjZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiBoZWFwcmVwbGFjZSh0aGlzLm5vZGVzLCB4LCB0aGlzLmNtcCk7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLnB1c2hwb3AgPSBmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gaGVhcHB1c2hwb3AodGhpcy5ub2RlcywgeCwgdGhpcy5jbXApO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5oZWFwaWZ5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gaGVhcGlmeSh0aGlzLm5vZGVzLCB0aGlzLmNtcCk7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLnVwZGF0ZUl0ZW0gPSBmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gdXBkYXRlSXRlbSh0aGlzLm5vZGVzLCB4LCB0aGlzLmNtcCk7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2RlcyA9IFtdO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXMubGVuZ3RoID09PSAwO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2Rlcy5sZW5ndGg7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaGVhcDtcbiAgICAgIGhlYXAgPSBuZXcgSGVhcCgpO1xuICAgICAgaGVhcC5ub2RlcyA9IHRoaXMubm9kZXMuc2xpY2UoMCk7XG4gICAgICByZXR1cm4gaGVhcDtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXMuc2xpY2UoMCk7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLmluc2VydCA9IEhlYXAucHJvdG90eXBlLnB1c2g7XG5cbiAgICBIZWFwLnByb3RvdHlwZS50b3AgPSBIZWFwLnByb3RvdHlwZS5wZWVrO1xuXG4gICAgSGVhcC5wcm90b3R5cGUuZnJvbnQgPSBIZWFwLnByb3RvdHlwZS5wZWVrO1xuXG4gICAgSGVhcC5wcm90b3R5cGUuaGFzID0gSGVhcC5wcm90b3R5cGUuY29udGFpbnM7XG5cbiAgICBIZWFwLnByb3RvdHlwZS5jb3B5ID0gSGVhcC5wcm90b3R5cGUuY2xvbmU7XG5cbiAgICByZXR1cm4gSGVhcDtcblxuICB9KSgpO1xuXG4gIChmdW5jdGlvbihyb290LCBmYWN0b3J5KSB7XG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgcmV0dXJuIGRlZmluZShbXSwgZmFjdG9yeSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJvb3QuSGVhcCA9IGZhY3RvcnkoKTtcbiAgICB9XG4gIH0pKHRoaXMsIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBIZWFwO1xuICB9KTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlYWN0SXMgPSByZXF1aXJlKCdyZWFjdC1pcycpO1xuXG4vKipcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyEgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG52YXIgUkVBQ1RfU1RBVElDUyA9IHtcbiAgY2hpbGRDb250ZXh0VHlwZXM6IHRydWUsXG4gIGNvbnRleHRUeXBlOiB0cnVlLFxuICBjb250ZXh0VHlwZXM6IHRydWUsXG4gIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZGlzcGxheU5hbWU6IHRydWUsXG4gIGdldERlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yOiB0cnVlLFxuICBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM6IHRydWUsXG4gIG1peGluczogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlLFxuICB0eXBlOiB0cnVlXG59O1xudmFyIEtOT1dOX1NUQVRJQ1MgPSB7XG4gIG5hbWU6IHRydWUsXG4gIGxlbmd0aDogdHJ1ZSxcbiAgcHJvdG90eXBlOiB0cnVlLFxuICBjYWxsZXI6IHRydWUsXG4gIGNhbGxlZTogdHJ1ZSxcbiAgYXJndW1lbnRzOiB0cnVlLFxuICBhcml0eTogdHJ1ZVxufTtcbnZhciBGT1JXQVJEX1JFRl9TVEFUSUNTID0ge1xuICAnJCR0eXBlb2YnOiB0cnVlLFxuICByZW5kZXI6IHRydWUsXG4gIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZGlzcGxheU5hbWU6IHRydWUsXG4gIHByb3BUeXBlczogdHJ1ZVxufTtcbnZhciBNRU1PX1NUQVRJQ1MgPSB7XG4gICckJHR5cGVvZic6IHRydWUsXG4gIGNvbXBhcmU6IHRydWUsXG4gIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZGlzcGxheU5hbWU6IHRydWUsXG4gIHByb3BUeXBlczogdHJ1ZSxcbiAgdHlwZTogdHJ1ZVxufTtcbnZhciBUWVBFX1NUQVRJQ1MgPSB7fTtcblRZUEVfU1RBVElDU1tyZWFjdElzLkZvcndhcmRSZWZdID0gRk9SV0FSRF9SRUZfU1RBVElDUztcblRZUEVfU1RBVElDU1tyZWFjdElzLk1lbW9dID0gTUVNT19TVEFUSUNTO1xuXG5mdW5jdGlvbiBnZXRTdGF0aWNzKGNvbXBvbmVudCkge1xuICAvLyBSZWFjdCB2MTYuMTEgYW5kIGJlbG93XG4gIGlmIChyZWFjdElzLmlzTWVtbyhjb21wb25lbnQpKSB7XG4gICAgcmV0dXJuIE1FTU9fU1RBVElDUztcbiAgfSAvLyBSZWFjdCB2MTYuMTIgYW5kIGFib3ZlXG5cblxuICByZXR1cm4gVFlQRV9TVEFUSUNTW2NvbXBvbmVudFsnJCR0eXBlb2YnXV0gfHwgUkVBQ1RfU1RBVElDUztcbn1cblxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIGdldE93blByb3BlcnR5TmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG52YXIgb2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcbmZ1bmN0aW9uIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKHRhcmdldENvbXBvbmVudCwgc291cmNlQ29tcG9uZW50LCBibGFja2xpc3QpIHtcbiAgaWYgKHR5cGVvZiBzb3VyY2VDb21wb25lbnQgIT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZG9uJ3QgaG9pc3Qgb3ZlciBzdHJpbmcgKGh0bWwpIGNvbXBvbmVudHNcbiAgICBpZiAob2JqZWN0UHJvdG90eXBlKSB7XG4gICAgICB2YXIgaW5oZXJpdGVkQ29tcG9uZW50ID0gZ2V0UHJvdG90eXBlT2Yoc291cmNlQ29tcG9uZW50KTtcblxuICAgICAgaWYgKGluaGVyaXRlZENvbXBvbmVudCAmJiBpbmhlcml0ZWRDb21wb25lbnQgIT09IG9iamVjdFByb3RvdHlwZSkge1xuICAgICAgICBob2lzdE5vblJlYWN0U3RhdGljcyh0YXJnZXRDb21wb25lbnQsIGluaGVyaXRlZENvbXBvbmVudCwgYmxhY2tsaXN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXMoc291cmNlQ29tcG9uZW50KTtcblxuICAgIGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgIGtleXMgPSBrZXlzLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlQ29tcG9uZW50KSk7XG4gICAgfVxuXG4gICAgdmFyIHRhcmdldFN0YXRpY3MgPSBnZXRTdGF0aWNzKHRhcmdldENvbXBvbmVudCk7XG4gICAgdmFyIHNvdXJjZVN0YXRpY3MgPSBnZXRTdGF0aWNzKHNvdXJjZUNvbXBvbmVudCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoIUtOT1dOX1NUQVRJQ1Nba2V5XSAmJiAhKGJsYWNrbGlzdCAmJiBibGFja2xpc3Rba2V5XSkgJiYgIShzb3VyY2VTdGF0aWNzICYmIHNvdXJjZVN0YXRpY3Nba2V5XSkgJiYgISh0YXJnZXRTdGF0aWNzICYmIHRhcmdldFN0YXRpY3Nba2V5XSkpIHtcbiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlQ29tcG9uZW50LCBrZXkpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQXZvaWQgZmFpbHVyZXMgZnJvbSByZWFkLW9ubHkgcHJvcGVydGllc1xuICAgICAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldENvbXBvbmVudCwga2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0Q29tcG9uZW50O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhvaXN0Tm9uUmVhY3RTdGF0aWNzO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXNlIGludmFyaWFudCgpIHRvIGFzc2VydCBzdGF0ZSB3aGljaCB5b3VyIHByb2dyYW0gYXNzdW1lcyB0byBiZSB0cnVlLlxuICpcbiAqIFByb3ZpZGUgc3ByaW50Zi1zdHlsZSBmb3JtYXQgKG9ubHkgJXMgaXMgc3VwcG9ydGVkKSBhbmQgYXJndW1lbnRzXG4gKiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYnJva2UgYW5kIHdoYXQgeW91IHdlcmVcbiAqIGV4cGVjdGluZy5cbiAqXG4gKiBUaGUgaW52YXJpYW50IG1lc3NhZ2Ugd2lsbCBiZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGludmFyaWFudFxuICogd2lsbCByZW1haW4gdG8gZW5zdXJlIGxvZ2ljIGRvZXMgbm90IGRpZmZlciBpbiBwcm9kdWN0aW9uLlxuICovXG5cbnZhciBpbnZhcmlhbnQgPSBmdW5jdGlvbihjb25kaXRpb24sIGZvcm1hdCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhcmlhbnQgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgdmFyIGVycm9yO1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgICdNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCAnICtcbiAgICAgICAgJ2ZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuJ1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFyZ3MgPSBbYSwgYiwgYywgZCwgZSwgZl07XG4gICAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107IH0pXG4gICAgICApO1xuICAgICAgZXJyb3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICB9XG5cbiAgICBlcnJvci5mcmFtZXNUb1BvcCA9IDE7IC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgaW52YXJpYW50J3Mgb3duIGZyYW1lXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaW52YXJpYW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxuLyoqXHJcbiAqIElzIHRoaXMgc3RyaW5nIGFsbCB3aGl0ZXNwYWNlP1xyXG4gKiBUaGlzIHNvbHV0aW9uIGtpbmQgb2YgbWFrZXMgbXkgYnJhaW4gaHVydCwgYnV0IGl0J3Mgc2lnbmlmaWNhbnRseSBmYXN0ZXJcclxuICogdGhhbiAhc3RyLnRyaW0oKSBvciBhbnkgb3RoZXIgc29sdXRpb24gSSBjb3VsZCBmaW5kLlxyXG4gKlxyXG4gKiB3aGl0ZXNwYWNlIGNvZGVzIGZyb206IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2hpdGVzcGFjZV9jaGFyYWN0ZXJcclxuICogYW5kIHZlcmlmaWVkIHdpdGg6XHJcbiAqXHJcbiAqICBmb3IodmFyIGkgPSAwOyBpIDwgNjU1MzY7IGkrKykge1xyXG4gKiAgICAgIHZhciBzID0gU3RyaW5nLmZyb21DaGFyQ29kZShpKTtcclxuICogICAgICBpZigrcz09PTAgJiYgIXMudHJpbSgpKSBjb25zb2xlLmxvZyhpLCBzKTtcclxuICogIH1cclxuICpcclxuICogd2hpY2ggY291bnRzIGEgY291cGxlIG9mIHRoZXNlIGFzICpub3QqIHdoaXRlc3BhY2UsIGJ1dCBmaW5kcyBub3RoaW5nIGVsc2VcclxuICogdGhhdCAqaXMqIHdoaXRlc3BhY2UuIE5vdGUgdGhhdCBjaGFyQ29kZUF0IHN0b3BzIGF0IDE2IGJpdHMsIGJ1dCBpdCBhcHBlYXJzXHJcbiAqIHRoYXQgdGhlcmUgYXJlIG5vIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBhYm92ZSB0aGlzLCBhbmQgY29kZSBwb2ludHMgYWJvdmVcclxuICogdGhpcyBkbyBub3QgbWFwIG9udG8gd2hpdGUgc3BhY2UgY2hhcmFjdGVycy5cclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHN0cil7XHJcbiAgICB2YXIgbCA9IHN0ci5sZW5ndGgsXHJcbiAgICAgICAgYTtcclxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBhID0gc3RyLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgaWYoKGEgPCA5IHx8IGEgPiAxMykgJiYgKGEgIT09IDMyKSAmJiAoYSAhPT0gMTMzKSAmJiAoYSAhPT0gMTYwKSAmJlxyXG4gICAgICAgICAgICAoYSAhPT0gNTc2MCkgJiYgKGEgIT09IDYxNTgpICYmIChhIDwgODE5MiB8fCBhID4gODIwNSkgJiZcclxuICAgICAgICAgICAgKGEgIT09IDgyMzIpICYmIChhICE9PSA4MjMzKSAmJiAoYSAhPT0gODIzOSkgJiYgKGEgIT09IDgyODcpICYmXHJcbiAgICAgICAgICAgIChhICE9PSA4Mjg4KSAmJiAoYSAhPT0gMTIyODgpICYmIChhICE9PSA2NTI3OSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG4iLCIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJsYXlvdXRCYXNlXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcImxheW91dEJhc2VcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAyOCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIExheW91dENvbnN0YW50cygpIHt9XG5cbi8qKlxyXG4gKiBMYXlvdXQgUXVhbGl0eTogMDpkcmFmdCwgMTpkZWZhdWx0LCAyOnByb29mXHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLlFVQUxJVFkgPSAxO1xuXG4vKipcclxuICogRGVmYXVsdCBwYXJhbWV0ZXJzXHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ1JFQVRFX0JFTkRTX0FTX05FRURFRCA9IGZhbHNlO1xuTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUwgPSBmYWxzZTtcbkxheW91dENvbnN0YW50cy5ERUZBVUxUX0FOSU1BVElPTl9PTl9MQVlPVVQgPSB0cnVlO1xuTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX0RVUklOR19MQVlPVVQgPSBmYWxzZTtcbkxheW91dENvbnN0YW50cy5ERUZBVUxUX0FOSU1BVElPTl9QRVJJT0QgPSA1MDtcbkxheW91dENvbnN0YW50cy5ERUZBVUxUX1VOSUZPUk1fTEVBRl9OT0RFX1NJWkVTID0gZmFsc2U7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZWN0aW9uOiBHZW5lcmFsIG90aGVyIGNvbnN0YW50c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8qXHJcbiAqIE1hcmdpbnMgb2YgYSBncmFwaCB0byBiZSBhcHBsaWVkIG9uIGJvdWRpbmcgcmVjdGFuZ2xlIG9mIGl0cyBjb250ZW50cy4gV2VcclxuICogYXNzdW1lIG1hcmdpbnMgb24gYWxsIGZvdXIgc2lkZXMgdG8gYmUgdW5pZm9ybS5cclxuICovXG5MYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFQSF9NQVJHSU4gPSAxNTtcblxuLypcclxuICogV2hldGhlciB0byBjb25zaWRlciBsYWJlbHMgaW4gbm9kZSBkaW1lbnNpb25zIG9yIG5vdFxyXG4gKi9cbkxheW91dENvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMgPSBmYWxzZTtcblxuLypcclxuICogRGVmYXVsdCBkaW1lbnNpb24gb2YgYSBub24tY29tcG91bmQgbm9kZS5cclxuICovXG5MYXlvdXRDb25zdGFudHMuU0lNUExFX05PREVfU0laRSA9IDQwO1xuXG4vKlxyXG4gKiBEZWZhdWx0IGRpbWVuc2lvbiBvZiBhIG5vbi1jb21wb3VuZCBub2RlLlxyXG4gKi9cbkxheW91dENvbnN0YW50cy5TSU1QTEVfTk9ERV9IQUxGX1NJWkUgPSBMYXlvdXRDb25zdGFudHMuU0lNUExFX05PREVfU0laRSAvIDI7XG5cbi8qXHJcbiAqIEVtcHR5IGNvbXBvdW5kIG5vZGUgc2l6ZS4gV2hlbiBhIGNvbXBvdW5kIG5vZGUgaXMgZW1wdHksIGl0cyBib3RoXHJcbiAqIGRpbWVuc2lvbnMgc2hvdWxkIGJlIG9mIHRoaXMgdmFsdWUuXHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLkVNUFRZX0NPTVBPVU5EX05PREVfU0laRSA9IDQwO1xuXG4vKlxyXG4gKiBNaW5pbXVtIGxlbmd0aCB0aGF0IGFuIGVkZ2Ugc2hvdWxkIHRha2UgZHVyaW5nIGxheW91dFxyXG4gKi9cbkxheW91dENvbnN0YW50cy5NSU5fRURHRV9MRU5HVEggPSAxO1xuXG4vKlxyXG4gKiBXb3JsZCBib3VuZGFyaWVzIHRoYXQgbGF5b3V0IG9wZXJhdGVzIG9uXHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZID0gMTAwMDAwMDtcblxuLypcclxuICogV29ybGQgYm91bmRhcmllcyB0aGF0IHJhbmRvbSBwb3NpdGlvbmluZyBjYW4gYmUgcGVyZm9ybWVkIHdpdGhcclxuICovXG5MYXlvdXRDb25zdGFudHMuSU5JVElBTF9XT1JMRF9CT1VOREFSWSA9IExheW91dENvbnN0YW50cy5XT1JMRF9CT1VOREFSWSAvIDEwMDA7XG5cbi8qXHJcbiAqIENvb3JkaW5hdGVzIG9mIHRoZSB3b3JsZCBjZW50ZXJcclxuICovXG5MYXlvdXRDb25zdGFudHMuV09STERfQ0VOVEVSX1ggPSAxMjAwO1xuTGF5b3V0Q29uc3RhbnRzLldPUkxEX0NFTlRFUl9ZID0gOTAwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IExheW91dENvbnN0YW50cztcblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBMR3JhcGhPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xudmFyIElHZW9tZXRyeSA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7XG52YXIgSU1hdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXG5mdW5jdGlvbiBMRWRnZShzb3VyY2UsIHRhcmdldCwgdkVkZ2UpIHtcbiAgTEdyYXBoT2JqZWN0LmNhbGwodGhpcywgdkVkZ2UpO1xuXG4gIHRoaXMuaXNPdmVybGFwaW5nU291cmNlQW5kVGFyZ2V0ID0gZmFsc2U7XG4gIHRoaXMudkdyYXBoT2JqZWN0ID0gdkVkZ2U7XG4gIHRoaXMuYmVuZHBvaW50cyA9IFtdO1xuICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG59XG5cbkxFZGdlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTEdyYXBoT2JqZWN0LnByb3RvdHlwZSk7XG5cbmZvciAodmFyIHByb3AgaW4gTEdyYXBoT2JqZWN0KSB7XG4gIExFZGdlW3Byb3BdID0gTEdyYXBoT2JqZWN0W3Byb3BdO1xufVxuXG5MRWRnZS5wcm90b3R5cGUuZ2V0U291cmNlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5zb3VyY2U7XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuZ2V0VGFyZ2V0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy50YXJnZXQ7XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuaXNJbnRlckdyYXBoID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5pc0ludGVyR3JhcGg7XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuZ2V0TGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5sZW5ndGg7XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuaXNPdmVybGFwaW5nU291cmNlQW5kVGFyZ2V0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5pc092ZXJsYXBpbmdTb3VyY2VBbmRUYXJnZXQ7XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuZ2V0QmVuZHBvaW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuYmVuZHBvaW50cztcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRMY2EgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxjYTtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRTb3VyY2VJbkxjYSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuc291cmNlSW5MY2E7XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuZ2V0VGFyZ2V0SW5MY2EgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnRhcmdldEluTGNhO1xufTtcblxuTEVkZ2UucHJvdG90eXBlLmdldE90aGVyRW5kID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgaWYgKHRoaXMuc291cmNlID09PSBub2RlKSB7XG4gICAgcmV0dXJuIHRoaXMudGFyZ2V0O1xuICB9IGVsc2UgaWYgKHRoaXMudGFyZ2V0ID09PSBub2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlO1xuICB9IGVsc2Uge1xuICAgIHRocm93IFwiTm9kZSBpcyBub3QgaW5jaWRlbnQgd2l0aCB0aGlzIGVkZ2VcIjtcbiAgfVxufTtcblxuTEVkZ2UucHJvdG90eXBlLmdldE90aGVyRW5kSW5HcmFwaCA9IGZ1bmN0aW9uIChub2RlLCBncmFwaCkge1xuICB2YXIgb3RoZXJFbmQgPSB0aGlzLmdldE90aGVyRW5kKG5vZGUpO1xuICB2YXIgcm9vdCA9IGdyYXBoLmdldEdyYXBoTWFuYWdlcigpLmdldFJvb3QoKTtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChvdGhlckVuZC5nZXRPd25lcigpID09IGdyYXBoKSB7XG4gICAgICByZXR1cm4gb3RoZXJFbmQ7XG4gICAgfVxuXG4gICAgaWYgKG90aGVyRW5kLmdldE93bmVyKCkgPT0gcm9vdCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgb3RoZXJFbmQgPSBvdGhlckVuZC5nZXRPd25lcigpLmdldFBhcmVudCgpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5MRWRnZS5wcm90b3R5cGUudXBkYXRlTGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY2xpcFBvaW50Q29vcmRpbmF0ZXMgPSBuZXcgQXJyYXkoNCk7XG5cbiAgdGhpcy5pc092ZXJsYXBpbmdTb3VyY2VBbmRUYXJnZXQgPSBJR2VvbWV0cnkuZ2V0SW50ZXJzZWN0aW9uKHRoaXMudGFyZ2V0LmdldFJlY3QoKSwgdGhpcy5zb3VyY2UuZ2V0UmVjdCgpLCBjbGlwUG9pbnRDb29yZGluYXRlcyk7XG5cbiAgaWYgKCF0aGlzLmlzT3ZlcmxhcGluZ1NvdXJjZUFuZFRhcmdldCkge1xuICAgIHRoaXMubGVuZ3RoWCA9IGNsaXBQb2ludENvb3JkaW5hdGVzWzBdIC0gY2xpcFBvaW50Q29vcmRpbmF0ZXNbMl07XG4gICAgdGhpcy5sZW5ndGhZID0gY2xpcFBvaW50Q29vcmRpbmF0ZXNbMV0gLSBjbGlwUG9pbnRDb29yZGluYXRlc1szXTtcblxuICAgIGlmIChNYXRoLmFicyh0aGlzLmxlbmd0aFgpIDwgMS4wKSB7XG4gICAgICB0aGlzLmxlbmd0aFggPSBJTWF0aC5zaWduKHRoaXMubGVuZ3RoWCk7XG4gICAgfVxuXG4gICAgaWYgKE1hdGguYWJzKHRoaXMubGVuZ3RoWSkgPCAxLjApIHtcbiAgICAgIHRoaXMubGVuZ3RoWSA9IElNYXRoLnNpZ24odGhpcy5sZW5ndGhZKTtcbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGguc3FydCh0aGlzLmxlbmd0aFggKiB0aGlzLmxlbmd0aFggKyB0aGlzLmxlbmd0aFkgKiB0aGlzLmxlbmd0aFkpO1xuICB9XG59O1xuXG5MRWRnZS5wcm90b3R5cGUudXBkYXRlTGVuZ3RoU2ltcGxlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmxlbmd0aFggPSB0aGlzLnRhcmdldC5nZXRDZW50ZXJYKCkgLSB0aGlzLnNvdXJjZS5nZXRDZW50ZXJYKCk7XG4gIHRoaXMubGVuZ3RoWSA9IHRoaXMudGFyZ2V0LmdldENlbnRlclkoKSAtIHRoaXMuc291cmNlLmdldENlbnRlclkoKTtcblxuICBpZiAoTWF0aC5hYnModGhpcy5sZW5ndGhYKSA8IDEuMCkge1xuICAgIHRoaXMubGVuZ3RoWCA9IElNYXRoLnNpZ24odGhpcy5sZW5ndGhYKTtcbiAgfVxuXG4gIGlmIChNYXRoLmFicyh0aGlzLmxlbmd0aFkpIDwgMS4wKSB7XG4gICAgdGhpcy5sZW5ndGhZID0gSU1hdGguc2lnbih0aGlzLmxlbmd0aFkpO1xuICB9XG5cbiAgdGhpcy5sZW5ndGggPSBNYXRoLnNxcnQodGhpcy5sZW5ndGhYICogdGhpcy5sZW5ndGhYICsgdGhpcy5sZW5ndGhZICogdGhpcy5sZW5ndGhZKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTEVkZ2U7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBMR3JhcGhPYmplY3QodkdyYXBoT2JqZWN0KSB7XG4gIHRoaXMudkdyYXBoT2JqZWN0ID0gdkdyYXBoT2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IExHcmFwaE9iamVjdDtcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBMR3JhcGhPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xudmFyIEludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcbnZhciBSZWN0YW5nbGVEID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7XG52YXIgTGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbnZhciBSYW5kb21TZWVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7XG52YXIgUG9pbnREID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblxuZnVuY3Rpb24gTE5vZGUoZ20sIGxvYywgc2l6ZSwgdk5vZGUpIHtcbiAgLy9BbHRlcm5hdGl2ZSBjb25zdHJ1Y3RvciAxIDogTE5vZGUoTEdyYXBoTWFuYWdlciBnbSwgUG9pbnQgbG9jLCBEaW1lbnNpb24gc2l6ZSwgT2JqZWN0IHZOb2RlKVxuICBpZiAoc2l6ZSA9PSBudWxsICYmIHZOb2RlID09IG51bGwpIHtcbiAgICB2Tm9kZSA9IGxvYztcbiAgfVxuXG4gIExHcmFwaE9iamVjdC5jYWxsKHRoaXMsIHZOb2RlKTtcblxuICAvL0FsdGVybmF0aXZlIGNvbnN0cnVjdG9yIDIgOiBMTm9kZShMYXlvdXQgbGF5b3V0LCBPYmplY3Qgdk5vZGUpXG4gIGlmIChnbS5ncmFwaE1hbmFnZXIgIT0gbnVsbCkgZ20gPSBnbS5ncmFwaE1hbmFnZXI7XG5cbiAgdGhpcy5lc3RpbWF0ZWRTaXplID0gSW50ZWdlci5NSU5fVkFMVUU7XG4gIHRoaXMuaW5jbHVzaW9uVHJlZURlcHRoID0gSW50ZWdlci5NQVhfVkFMVUU7XG4gIHRoaXMudkdyYXBoT2JqZWN0ID0gdk5vZGU7XG4gIHRoaXMuZWRnZXMgPSBbXTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIgPSBnbTtcblxuICBpZiAoc2l6ZSAhPSBudWxsICYmIGxvYyAhPSBudWxsKSB0aGlzLnJlY3QgPSBuZXcgUmVjdGFuZ2xlRChsb2MueCwgbG9jLnksIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KTtlbHNlIHRoaXMucmVjdCA9IG5ldyBSZWN0YW5nbGVEKCk7XG59XG5cbkxOb2RlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTEdyYXBoT2JqZWN0LnByb3RvdHlwZSk7XG5mb3IgKHZhciBwcm9wIGluIExHcmFwaE9iamVjdCkge1xuICBMTm9kZVtwcm9wXSA9IExHcmFwaE9iamVjdFtwcm9wXTtcbn1cblxuTE5vZGUucHJvdG90eXBlLmdldEVkZ2VzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5lZGdlcztcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRDaGlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuY2hpbGQ7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0T3duZXIgPSBmdW5jdGlvbiAoKSB7XG4gIC8vICBpZiAodGhpcy5vd25lciAhPSBudWxsKSB7XG4gIC8vICAgIGlmICghKHRoaXMub3duZXIgPT0gbnVsbCB8fCB0aGlzLm93bmVyLmdldE5vZGVzKCkuaW5kZXhPZih0aGlzKSA+IC0xKSkge1xuICAvLyAgICAgIHRocm93IFwiYXNzZXJ0IGZhaWxlZFwiO1xuICAvLyAgICB9XG4gIC8vICB9XG5cbiAgcmV0dXJuIHRoaXMub3duZXI7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3Qud2lkdGg7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuc2V0V2lkdGggPSBmdW5jdGlvbiAod2lkdGgpIHtcbiAgdGhpcy5yZWN0LndpZHRoID0gd2lkdGg7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZWN0LmhlaWdodDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5zZXRIZWlnaHQgPSBmdW5jdGlvbiAoaGVpZ2h0KSB7XG4gIHRoaXMucmVjdC5oZWlnaHQgPSBoZWlnaHQ7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0Q2VudGVyWCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucmVjdC54ICsgdGhpcy5yZWN0LndpZHRoIC8gMjtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRDZW50ZXJZID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZWN0LnkgKyB0aGlzLnJlY3QuaGVpZ2h0IC8gMjtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRDZW50ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgUG9pbnREKHRoaXMucmVjdC54ICsgdGhpcy5yZWN0LndpZHRoIC8gMiwgdGhpcy5yZWN0LnkgKyB0aGlzLnJlY3QuaGVpZ2h0IC8gMik7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0TG9jYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgUG9pbnREKHRoaXMucmVjdC54LCB0aGlzLnJlY3QueSk7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0UmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucmVjdDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXREaWFnb25hbCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdGguc3FydCh0aGlzLnJlY3Qud2lkdGggKiB0aGlzLnJlY3Qud2lkdGggKyB0aGlzLnJlY3QuaGVpZ2h0ICogdGhpcy5yZWN0LmhlaWdodCk7XG59O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgaGFsZiB0aGUgZGlhZ29uYWwgbGVuZ3RoIG9mIHRoaXMgbm9kZS5cbiAqL1xuTE5vZGUucHJvdG90eXBlLmdldEhhbGZUaGVEaWFnb25hbCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdGguc3FydCh0aGlzLnJlY3QuaGVpZ2h0ICogdGhpcy5yZWN0LmhlaWdodCArIHRoaXMucmVjdC53aWR0aCAqIHRoaXMucmVjdC53aWR0aCkgLyAyO1xufTtcblxuTE5vZGUucHJvdG90eXBlLnNldFJlY3QgPSBmdW5jdGlvbiAodXBwZXJMZWZ0LCBkaW1lbnNpb24pIHtcbiAgdGhpcy5yZWN0LnggPSB1cHBlckxlZnQueDtcbiAgdGhpcy5yZWN0LnkgPSB1cHBlckxlZnQueTtcbiAgdGhpcy5yZWN0LndpZHRoID0gZGltZW5zaW9uLndpZHRoO1xuICB0aGlzLnJlY3QuaGVpZ2h0ID0gZGltZW5zaW9uLmhlaWdodDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5zZXRDZW50ZXIgPSBmdW5jdGlvbiAoY3gsIGN5KSB7XG4gIHRoaXMucmVjdC54ID0gY3ggLSB0aGlzLnJlY3Qud2lkdGggLyAyO1xuICB0aGlzLnJlY3QueSA9IGN5IC0gdGhpcy5yZWN0LmhlaWdodCAvIDI7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuc2V0TG9jYXRpb24gPSBmdW5jdGlvbiAoeCwgeSkge1xuICB0aGlzLnJlY3QueCA9IHg7XG4gIHRoaXMucmVjdC55ID0geTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5tb3ZlQnkgPSBmdW5jdGlvbiAoZHgsIGR5KSB7XG4gIHRoaXMucmVjdC54ICs9IGR4O1xuICB0aGlzLnJlY3QueSArPSBkeTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRFZGdlTGlzdFRvTm9kZSA9IGZ1bmN0aW9uICh0bykge1xuICB2YXIgZWRnZUxpc3QgPSBbXTtcbiAgdmFyIGVkZ2U7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICBzZWxmLmVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcblxuICAgIGlmIChlZGdlLnRhcmdldCA9PSB0bykge1xuICAgICAgaWYgKGVkZ2Uuc291cmNlICE9IHNlbGYpIHRocm93IFwiSW5jb3JyZWN0IGVkZ2Ugc291cmNlIVwiO1xuXG4gICAgICBlZGdlTGlzdC5wdXNoKGVkZ2UpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGVkZ2VMaXN0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldEVkZ2VzQmV0d2VlbiA9IGZ1bmN0aW9uIChvdGhlcikge1xuICB2YXIgZWRnZUxpc3QgPSBbXTtcbiAgdmFyIGVkZ2U7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLmVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcblxuICAgIGlmICghKGVkZ2Uuc291cmNlID09IHNlbGYgfHwgZWRnZS50YXJnZXQgPT0gc2VsZikpIHRocm93IFwiSW5jb3JyZWN0IGVkZ2Ugc291cmNlIGFuZC9vciB0YXJnZXRcIjtcblxuICAgIGlmIChlZGdlLnRhcmdldCA9PSBvdGhlciB8fCBlZGdlLnNvdXJjZSA9PSBvdGhlcikge1xuICAgICAgZWRnZUxpc3QucHVzaChlZGdlKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBlZGdlTGlzdDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXROZWlnaGJvcnNMaXN0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbmVpZ2hib3JzID0gbmV3IFNldCgpO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5lZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG5cbiAgICBpZiAoZWRnZS5zb3VyY2UgPT0gc2VsZikge1xuICAgICAgbmVpZ2hib3JzLmFkZChlZGdlLnRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlZGdlLnRhcmdldCAhPSBzZWxmKSB7XG4gICAgICAgIHRocm93IFwiSW5jb3JyZWN0IGluY2lkZW5jeSFcIjtcbiAgICAgIH1cblxuICAgICAgbmVpZ2hib3JzLmFkZChlZGdlLnNvdXJjZSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gbmVpZ2hib3JzO1xufTtcblxuTE5vZGUucHJvdG90eXBlLndpdGhDaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHdpdGhOZWlnaGJvcnNMaXN0ID0gbmV3IFNldCgpO1xuICB2YXIgY2hpbGROb2RlO1xuICB2YXIgY2hpbGRyZW47XG5cbiAgd2l0aE5laWdoYm9yc0xpc3QuYWRkKHRoaXMpO1xuXG4gIGlmICh0aGlzLmNoaWxkICE9IG51bGwpIHtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLmNoaWxkLmdldE5vZGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGROb2RlID0gbm9kZXNbaV07XG4gICAgICBjaGlsZHJlbiA9IGNoaWxkTm9kZS53aXRoQ2hpbGRyZW4oKTtcbiAgICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgd2l0aE5laWdoYm9yc0xpc3QuYWRkKG5vZGUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdpdGhOZWlnaGJvcnNMaXN0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldE5vT2ZDaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5vT2ZDaGlsZHJlbiA9IDA7XG4gIHZhciBjaGlsZE5vZGU7XG5cbiAgaWYgKHRoaXMuY2hpbGQgPT0gbnVsbCkge1xuICAgIG5vT2ZDaGlsZHJlbiA9IDE7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5jaGlsZC5nZXROb2RlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkTm9kZSA9IG5vZGVzW2ldO1xuXG4gICAgICBub09mQ2hpbGRyZW4gKz0gY2hpbGROb2RlLmdldE5vT2ZDaGlsZHJlbigpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChub09mQ2hpbGRyZW4gPT0gMCkge1xuICAgIG5vT2ZDaGlsZHJlbiA9IDE7XG4gIH1cbiAgcmV0dXJuIG5vT2ZDaGlsZHJlbjtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRFc3RpbWF0ZWRTaXplID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5lc3RpbWF0ZWRTaXplID09IEludGVnZXIuTUlOX1ZBTFVFKSB7XG4gICAgdGhyb3cgXCJhc3NlcnQgZmFpbGVkXCI7XG4gIH1cbiAgcmV0dXJuIHRoaXMuZXN0aW1hdGVkU2l6ZTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5jYWxjRXN0aW1hdGVkU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY2hpbGQgPT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLmVzdGltYXRlZFNpemUgPSAodGhpcy5yZWN0LndpZHRoICsgdGhpcy5yZWN0LmhlaWdodCkgLyAyO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZXN0aW1hdGVkU2l6ZSA9IHRoaXMuY2hpbGQuY2FsY0VzdGltYXRlZFNpemUoKTtcbiAgICB0aGlzLnJlY3Qud2lkdGggPSB0aGlzLmVzdGltYXRlZFNpemU7XG4gICAgdGhpcy5yZWN0LmhlaWdodCA9IHRoaXMuZXN0aW1hdGVkU2l6ZTtcblxuICAgIHJldHVybiB0aGlzLmVzdGltYXRlZFNpemU7XG4gIH1cbn07XG5cbkxOb2RlLnByb3RvdHlwZS5zY2F0dGVyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcmFuZG9tQ2VudGVyWDtcbiAgdmFyIHJhbmRvbUNlbnRlclk7XG5cbiAgdmFyIG1pblggPSAtTGF5b3V0Q29uc3RhbnRzLklOSVRJQUxfV09STERfQk9VTkRBUlk7XG4gIHZhciBtYXhYID0gTGF5b3V0Q29uc3RhbnRzLklOSVRJQUxfV09STERfQk9VTkRBUlk7XG4gIHJhbmRvbUNlbnRlclggPSBMYXlvdXRDb25zdGFudHMuV09STERfQ0VOVEVSX1ggKyBSYW5kb21TZWVkLm5leHREb3VibGUoKSAqIChtYXhYIC0gbWluWCkgKyBtaW5YO1xuXG4gIHZhciBtaW5ZID0gLUxheW91dENvbnN0YW50cy5JTklUSUFMX1dPUkxEX0JPVU5EQVJZO1xuICB2YXIgbWF4WSA9IExheW91dENvbnN0YW50cy5JTklUSUFMX1dPUkxEX0JPVU5EQVJZO1xuICByYW5kb21DZW50ZXJZID0gTGF5b3V0Q29uc3RhbnRzLldPUkxEX0NFTlRFUl9ZICsgUmFuZG9tU2VlZC5uZXh0RG91YmxlKCkgKiAobWF4WSAtIG1pblkpICsgbWluWTtcblxuICB0aGlzLnJlY3QueCA9IHJhbmRvbUNlbnRlclg7XG4gIHRoaXMucmVjdC55ID0gcmFuZG9tQ2VudGVyWTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS51cGRhdGVCb3VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmdldENoaWxkKCkgPT0gbnVsbCkge1xuICAgIHRocm93IFwiYXNzZXJ0IGZhaWxlZFwiO1xuICB9XG4gIGlmICh0aGlzLmdldENoaWxkKCkuZ2V0Tm9kZXMoKS5sZW5ndGggIT0gMCkge1xuICAgIC8vIHdyYXAgdGhlIGNoaWxkcmVuIG5vZGVzIGJ5IHJlLWFycmFuZ2luZyB0aGUgYm91bmRhcmllc1xuICAgIHZhciBjaGlsZEdyYXBoID0gdGhpcy5nZXRDaGlsZCgpO1xuICAgIGNoaWxkR3JhcGgudXBkYXRlQm91bmRzKHRydWUpO1xuXG4gICAgdGhpcy5yZWN0LnggPSBjaGlsZEdyYXBoLmdldExlZnQoKTtcbiAgICB0aGlzLnJlY3QueSA9IGNoaWxkR3JhcGguZ2V0VG9wKCk7XG5cbiAgICB0aGlzLnNldFdpZHRoKGNoaWxkR3JhcGguZ2V0UmlnaHQoKSAtIGNoaWxkR3JhcGguZ2V0TGVmdCgpKTtcbiAgICB0aGlzLnNldEhlaWdodChjaGlsZEdyYXBoLmdldEJvdHRvbSgpIC0gY2hpbGRHcmFwaC5nZXRUb3AoKSk7XG5cbiAgICAvLyBVcGRhdGUgY29tcG91bmQgYm91bmRzIGNvbnNpZGVyaW5nIGl0cyBsYWJlbCBwcm9wZXJ0aWVzICAgIFxuICAgIGlmIChMYXlvdXRDb25zdGFudHMuTk9ERV9ESU1FTlNJT05TX0lOQ0xVREVfTEFCRUxTKSB7XG5cbiAgICAgIHZhciB3aWR0aCA9IGNoaWxkR3JhcGguZ2V0UmlnaHQoKSAtIGNoaWxkR3JhcGguZ2V0TGVmdCgpO1xuICAgICAgdmFyIGhlaWdodCA9IGNoaWxkR3JhcGguZ2V0Qm90dG9tKCkgLSBjaGlsZEdyYXBoLmdldFRvcCgpO1xuXG4gICAgICBpZiAodGhpcy5sYWJlbFdpZHRoKSB7XG4gICAgICAgIGlmICh0aGlzLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcImxlZnRcIikge1xuICAgICAgICAgIHRoaXMucmVjdC54IC09IHRoaXMubGFiZWxXaWR0aDtcbiAgICAgICAgICB0aGlzLnNldFdpZHRoKHdpZHRoICsgdGhpcy5sYWJlbFdpZHRoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcImNlbnRlclwiICYmIHRoaXMubGFiZWxXaWR0aCA+IHdpZHRoKSB7XG4gICAgICAgICAgdGhpcy5yZWN0LnggLT0gKHRoaXMubGFiZWxXaWR0aCAtIHdpZHRoKSAvIDI7XG4gICAgICAgICAgdGhpcy5zZXRXaWR0aCh0aGlzLmxhYmVsV2lkdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGFiZWxQb3NIb3Jpem9udGFsID09IFwicmlnaHRcIikge1xuICAgICAgICAgIHRoaXMuc2V0V2lkdGgod2lkdGggKyB0aGlzLmxhYmVsV2lkdGgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmxhYmVsSGVpZ2h0KSB7XG4gICAgICAgIGlmICh0aGlzLmxhYmVsUG9zVmVydGljYWwgPT0gXCJ0b3BcIikge1xuICAgICAgICAgIHRoaXMucmVjdC55IC09IHRoaXMubGFiZWxIZWlnaHQ7XG4gICAgICAgICAgdGhpcy5zZXRIZWlnaHQoaGVpZ2h0ICsgdGhpcy5sYWJlbEhlaWdodCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sYWJlbFBvc1ZlcnRpY2FsID09IFwiY2VudGVyXCIgJiYgdGhpcy5sYWJlbEhlaWdodCA+IGhlaWdodCkge1xuICAgICAgICAgIHRoaXMucmVjdC55IC09ICh0aGlzLmxhYmVsSGVpZ2h0IC0gaGVpZ2h0KSAvIDI7XG4gICAgICAgICAgdGhpcy5zZXRIZWlnaHQodGhpcy5sYWJlbEhlaWdodCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sYWJlbFBvc1ZlcnRpY2FsID09IFwiYm90dG9tXCIpIHtcbiAgICAgICAgICB0aGlzLnNldEhlaWdodChoZWlnaHQgKyB0aGlzLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuTE5vZGUucHJvdG90eXBlLmdldEluY2x1c2lvblRyZWVEZXB0aCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuaW5jbHVzaW9uVHJlZURlcHRoID09IEludGVnZXIuTUFYX1ZBTFVFKSB7XG4gICAgdGhyb3cgXCJhc3NlcnQgZmFpbGVkXCI7XG4gIH1cbiAgcmV0dXJuIHRoaXMuaW5jbHVzaW9uVHJlZURlcHRoO1xufTtcblxuTE5vZGUucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uICh0cmFucykge1xuICB2YXIgbGVmdCA9IHRoaXMucmVjdC54O1xuXG4gIGlmIChsZWZ0ID4gTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZKSB7XG4gICAgbGVmdCA9IExheW91dENvbnN0YW50cy5XT1JMRF9CT1VOREFSWTtcbiAgfSBlbHNlIGlmIChsZWZ0IDwgLUxheW91dENvbnN0YW50cy5XT1JMRF9CT1VOREFSWSkge1xuICAgIGxlZnQgPSAtTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZO1xuICB9XG5cbiAgdmFyIHRvcCA9IHRoaXMucmVjdC55O1xuXG4gIGlmICh0b3AgPiBMYXlvdXRDb25zdGFudHMuV09STERfQk9VTkRBUlkpIHtcbiAgICB0b3AgPSBMYXlvdXRDb25zdGFudHMuV09STERfQk9VTkRBUlk7XG4gIH0gZWxzZSBpZiAodG9wIDwgLUxheW91dENvbnN0YW50cy5XT1JMRF9CT1VOREFSWSkge1xuICAgIHRvcCA9IC1MYXlvdXRDb25zdGFudHMuV09STERfQk9VTkRBUlk7XG4gIH1cblxuICB2YXIgbGVmdFRvcCA9IG5ldyBQb2ludEQobGVmdCwgdG9wKTtcbiAgdmFyIHZMZWZ0VG9wID0gdHJhbnMuaW52ZXJzZVRyYW5zZm9ybVBvaW50KGxlZnRUb3ApO1xuXG4gIHRoaXMuc2V0TG9jYXRpb24odkxlZnRUb3AueCwgdkxlZnRUb3AueSk7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0TGVmdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucmVjdC54O1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldFJpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZWN0LnggKyB0aGlzLnJlY3Qud2lkdGg7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0VG9wID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZWN0Lnk7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0Qm90dG9tID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZWN0LnkgKyB0aGlzLnJlY3QuaGVpZ2h0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldFBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMub3duZXIgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMub3duZXIuZ2V0UGFyZW50KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IExOb2RlO1xuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIExheW91dENvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbmZ1bmN0aW9uIEZETGF5b3V0Q29uc3RhbnRzKCkge31cblxuLy9GRExheW91dENvbnN0YW50cyBpbmhlcml0cyBzdGF0aWMgcHJvcHMgaW4gTGF5b3V0Q29uc3RhbnRzXG5mb3IgKHZhciBwcm9wIGluIExheW91dENvbnN0YW50cykge1xuICBGRExheW91dENvbnN0YW50c1twcm9wXSA9IExheW91dENvbnN0YW50c1twcm9wXTtcbn1cblxuRkRMYXlvdXRDb25zdGFudHMuTUFYX0lURVJBVElPTlMgPSAyNTAwO1xuXG5GRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIID0gNTA7XG5GRExheW91dENvbnN0YW50cy5ERUZBVUxUX1NQUklOR19TVFJFTkdUSCA9IDAuNDU7XG5GRExheW91dENvbnN0YW50cy5ERUZBVUxUX1JFUFVMU0lPTl9TVFJFTkdUSCA9IDQ1MDAuMDtcbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9TVFJFTkdUSCA9IDAuNDtcbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9TVFJFTkdUSCA9IDEuMDtcbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9SQU5HRV9GQUNUT1IgPSAzLjg7XG5GRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfUkFOR0VfRkFDVE9SID0gMS41O1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9VU0VfU01BUlRfSURFQUxfRURHRV9MRU5HVEhfQ0FMQ1VMQVRJT04gPSB0cnVlO1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9VU0VfU01BUlRfUkVQVUxTSU9OX1JBTkdFX0NBTENVTEFUSU9OID0gdHJ1ZTtcbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09PTElOR19GQUNUT1JfSU5DUkVNRU5UQUwgPSAwLjM7XG5GRExheW91dENvbnN0YW50cy5DT09MSU5HX0FEQVBUQVRJT05fRkFDVE9SID0gMC4zMztcbkZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fTE9XRVJfTk9ERV9MSU1JVCA9IDEwMDA7XG5GRExheW91dENvbnN0YW50cy5BREFQVEFUSU9OX1VQUEVSX05PREVfTElNSVQgPSA1MDAwO1xuRkRMYXlvdXRDb25zdGFudHMuTUFYX05PREVfRElTUExBQ0VNRU5UX0lOQ1JFTUVOVEFMID0gMTAwLjA7XG5GRExheW91dENvbnN0YW50cy5NQVhfTk9ERV9ESVNQTEFDRU1FTlQgPSBGRExheW91dENvbnN0YW50cy5NQVhfTk9ERV9ESVNQTEFDRU1FTlRfSU5DUkVNRU5UQUwgKiAzO1xuRkRMYXlvdXRDb25zdGFudHMuTUlOX1JFUFVMU0lPTl9ESVNUID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCAvIDEwLjA7XG5GRExheW91dENvbnN0YW50cy5DT05WRVJHRU5DRV9DSEVDS19QRVJJT0QgPSAxMDA7XG5GRExheW91dENvbnN0YW50cy5QRVJfTEVWRUxfSURFQUxfRURHRV9MRU5HVEhfRkFDVE9SID0gMC4xO1xuRkRMYXlvdXRDb25zdGFudHMuTUlOX0VER0VfTEVOR1RIID0gMTtcbkZETGF5b3V0Q29uc3RhbnRzLkdSSURfQ0FMQ1VMQVRJT05fQ0hFQ0tfUEVSSU9EID0gMTA7XG5cbm1vZHVsZS5leHBvcnRzID0gRkRMYXlvdXRDb25zdGFudHM7XG5cbi8qKiovIH0pLFxuLyogNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBQb2ludEQoeCwgeSkge1xuICBpZiAoeCA9PSBudWxsICYmIHkgPT0gbnVsbCkge1xuICAgIHRoaXMueCA9IDA7XG4gICAgdGhpcy55ID0gMDtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gIH1cbn1cblxuUG9pbnRELnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy54O1xufTtcblxuUG9pbnRELnByb3RvdHlwZS5nZXRZID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy55O1xufTtcblxuUG9pbnRELnByb3RvdHlwZS5zZXRYID0gZnVuY3Rpb24gKHgpIHtcbiAgdGhpcy54ID0geDtcbn07XG5cblBvaW50RC5wcm90b3R5cGUuc2V0WSA9IGZ1bmN0aW9uICh5KSB7XG4gIHRoaXMueSA9IHk7XG59O1xuXG5Qb2ludEQucHJvdG90eXBlLmdldERpZmZlcmVuY2UgPSBmdW5jdGlvbiAocHQpIHtcbiAgcmV0dXJuIG5ldyBEaW1lbnNpb25EKHRoaXMueCAtIHB0LngsIHRoaXMueSAtIHB0LnkpO1xufTtcblxuUG9pbnRELnByb3RvdHlwZS5nZXRDb3B5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IFBvaW50RCh0aGlzLngsIHRoaXMueSk7XG59O1xuXG5Qb2ludEQucHJvdG90eXBlLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uIChkaW0pIHtcbiAgdGhpcy54ICs9IGRpbS53aWR0aDtcbiAgdGhpcy55ICs9IGRpbS5oZWlnaHQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBQb2ludEQ7XG5cbi8qKiovIH0pLFxuLyogNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgTEdyYXBoT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbnZhciBJbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMCk7XG52YXIgTGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbnZhciBMR3JhcGhNYW5hZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcbnZhciBMTm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG52YXIgTEVkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xudmFyIFJlY3RhbmdsZUQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcbnZhciBQb2ludCA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpO1xudmFyIExpbmtlZExpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKTtcblxuZnVuY3Rpb24gTEdyYXBoKHBhcmVudCwgb2JqMiwgdkdyYXBoKSB7XG4gIExHcmFwaE9iamVjdC5jYWxsKHRoaXMsIHZHcmFwaCk7XG4gIHRoaXMuZXN0aW1hdGVkU2l6ZSA9IEludGVnZXIuTUlOX1ZBTFVFO1xuICB0aGlzLm1hcmdpbiA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0dSQVBIX01BUkdJTjtcbiAgdGhpcy5lZGdlcyA9IFtdO1xuICB0aGlzLm5vZGVzID0gW107XG4gIHRoaXMuaXNDb25uZWN0ZWQgPSBmYWxzZTtcbiAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG5cbiAgaWYgKG9iajIgIT0gbnVsbCAmJiBvYmoyIGluc3RhbmNlb2YgTEdyYXBoTWFuYWdlcikge1xuICAgIHRoaXMuZ3JhcGhNYW5hZ2VyID0gb2JqMjtcbiAgfSBlbHNlIGlmIChvYmoyICE9IG51bGwgJiYgb2JqMiBpbnN0YW5jZW9mIExheW91dCkge1xuICAgIHRoaXMuZ3JhcGhNYW5hZ2VyID0gb2JqMi5ncmFwaE1hbmFnZXI7XG4gIH1cbn1cblxuTEdyYXBoLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTEdyYXBoT2JqZWN0LnByb3RvdHlwZSk7XG5mb3IgKHZhciBwcm9wIGluIExHcmFwaE9iamVjdCkge1xuICBMR3JhcGhbcHJvcF0gPSBMR3JhcGhPYmplY3RbcHJvcF07XG59XG5cbkxHcmFwaC5wcm90b3R5cGUuZ2V0Tm9kZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLm5vZGVzO1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5nZXRFZGdlcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZWRnZXM7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmdldEdyYXBoTWFuYWdlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhNYW5hZ2VyO1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5nZXRQYXJlbnQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnBhcmVudDtcbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuZ2V0TGVmdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubGVmdDtcbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuZ2V0UmlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJpZ2h0O1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5nZXRUb3AgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnRvcDtcbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuZ2V0Qm90dG9tID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ib3R0b207XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmlzQ29ubmVjdGVkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZDtcbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKG9iajEsIHNvdXJjZU5vZGUsIHRhcmdldE5vZGUpIHtcbiAgaWYgKHNvdXJjZU5vZGUgPT0gbnVsbCAmJiB0YXJnZXROb2RlID09IG51bGwpIHtcbiAgICB2YXIgbmV3Tm9kZSA9IG9iajE7XG4gICAgaWYgKHRoaXMuZ3JhcGhNYW5hZ2VyID09IG51bGwpIHtcbiAgICAgIHRocm93IFwiR3JhcGggaGFzIG5vIGdyYXBoIG1nciFcIjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ2V0Tm9kZXMoKS5pbmRleE9mKG5ld05vZGUpID4gLTEpIHtcbiAgICAgIHRocm93IFwiTm9kZSBhbHJlYWR5IGluIGdyYXBoIVwiO1xuICAgIH1cbiAgICBuZXdOb2RlLm93bmVyID0gdGhpcztcbiAgICB0aGlzLmdldE5vZGVzKCkucHVzaChuZXdOb2RlKTtcblxuICAgIHJldHVybiBuZXdOb2RlO1xuICB9IGVsc2Uge1xuICAgIHZhciBuZXdFZGdlID0gb2JqMTtcbiAgICBpZiAoISh0aGlzLmdldE5vZGVzKCkuaW5kZXhPZihzb3VyY2VOb2RlKSA+IC0xICYmIHRoaXMuZ2V0Tm9kZXMoKS5pbmRleE9mKHRhcmdldE5vZGUpID4gLTEpKSB7XG4gICAgICB0aHJvdyBcIlNvdXJjZSBvciB0YXJnZXQgbm90IGluIGdyYXBoIVwiO1xuICAgIH1cblxuICAgIGlmICghKHNvdXJjZU5vZGUub3duZXIgPT0gdGFyZ2V0Tm9kZS5vd25lciAmJiBzb3VyY2VOb2RlLm93bmVyID09IHRoaXMpKSB7XG4gICAgICB0aHJvdyBcIkJvdGggb3duZXJzIG11c3QgYmUgdGhpcyBncmFwaCFcIjtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlTm9kZS5vd25lciAhPSB0YXJnZXROb2RlLm93bmVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBzZXQgc291cmNlIGFuZCB0YXJnZXRcbiAgICBuZXdFZGdlLnNvdXJjZSA9IHNvdXJjZU5vZGU7XG4gICAgbmV3RWRnZS50YXJnZXQgPSB0YXJnZXROb2RlO1xuXG4gICAgLy8gc2V0IGFzIGludHJhLWdyYXBoIGVkZ2VcbiAgICBuZXdFZGdlLmlzSW50ZXJHcmFwaCA9IGZhbHNlO1xuXG4gICAgLy8gYWRkIHRvIGdyYXBoIGVkZ2UgbGlzdFxuICAgIHRoaXMuZ2V0RWRnZXMoKS5wdXNoKG5ld0VkZ2UpO1xuXG4gICAgLy8gYWRkIHRvIGluY2lkZW5jeSBsaXN0c1xuICAgIHNvdXJjZU5vZGUuZWRnZXMucHVzaChuZXdFZGdlKTtcblxuICAgIGlmICh0YXJnZXROb2RlICE9IHNvdXJjZU5vZGUpIHtcbiAgICAgIHRhcmdldE5vZGUuZWRnZXMucHVzaChuZXdFZGdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RWRnZTtcbiAgfVxufTtcblxuTEdyYXBoLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBub2RlID0gb2JqO1xuICBpZiAob2JqIGluc3RhbmNlb2YgTE5vZGUpIHtcbiAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcIk5vZGUgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKCEobm9kZS5vd25lciAhPSBudWxsICYmIG5vZGUub3duZXIgPT0gdGhpcykpIHtcbiAgICAgIHRocm93IFwiT3duZXIgZ3JhcGggaXMgaW52YWxpZCFcIjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JhcGhNYW5hZ2VyID09IG51bGwpIHtcbiAgICAgIHRocm93IFwiT3duZXIgZ3JhcGggbWFuYWdlciBpcyBpbnZhbGlkIVwiO1xuICAgIH1cbiAgICAvLyByZW1vdmUgaW5jaWRlbnQgZWRnZXMgZmlyc3QgKG1ha2UgYSBjb3B5IHRvIGRvIGl0IHNhZmVseSlcbiAgICB2YXIgZWRnZXNUb0JlUmVtb3ZlZCA9IG5vZGUuZWRnZXMuc2xpY2UoKTtcbiAgICB2YXIgZWRnZTtcbiAgICB2YXIgcyA9IGVkZ2VzVG9CZVJlbW92ZWQubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgICBlZGdlID0gZWRnZXNUb0JlUmVtb3ZlZFtpXTtcblxuICAgICAgaWYgKGVkZ2UuaXNJbnRlckdyYXBoKSB7XG4gICAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlbW92ZShlZGdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVkZ2Uuc291cmNlLm93bmVyLnJlbW92ZShlZGdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBub3cgdGhlIG5vZGUgaXRzZWxmXG4gICAgdmFyIGluZGV4ID0gdGhpcy5ub2Rlcy5pbmRleE9mKG5vZGUpO1xuICAgIGlmIChpbmRleCA9PSAtMSkge1xuICAgICAgdGhyb3cgXCJOb2RlIG5vdCBpbiBvd25lciBub2RlIGxpc3QhXCI7XG4gICAgfVxuXG4gICAgdGhpcy5ub2Rlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIExFZGdlKSB7XG4gICAgdmFyIGVkZ2UgPSBvYmo7XG4gICAgaWYgKGVkZ2UgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJFZGdlIGlzIG51bGwhXCI7XG4gICAgfVxuICAgIGlmICghKGVkZ2Uuc291cmNlICE9IG51bGwgJiYgZWRnZS50YXJnZXQgIT0gbnVsbCkpIHtcbiAgICAgIHRocm93IFwiU291cmNlIGFuZC9vciB0YXJnZXQgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKCEoZWRnZS5zb3VyY2Uub3duZXIgIT0gbnVsbCAmJiBlZGdlLnRhcmdldC5vd25lciAhPSBudWxsICYmIGVkZ2Uuc291cmNlLm93bmVyID09IHRoaXMgJiYgZWRnZS50YXJnZXQub3duZXIgPT0gdGhpcykpIHtcbiAgICAgIHRocm93IFwiU291cmNlIGFuZC9vciB0YXJnZXQgb3duZXIgaXMgaW52YWxpZCFcIjtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlSW5kZXggPSBlZGdlLnNvdXJjZS5lZGdlcy5pbmRleE9mKGVkZ2UpO1xuICAgIHZhciB0YXJnZXRJbmRleCA9IGVkZ2UudGFyZ2V0LmVkZ2VzLmluZGV4T2YoZWRnZSk7XG4gICAgaWYgKCEoc291cmNlSW5kZXggPiAtMSAmJiB0YXJnZXRJbmRleCA+IC0xKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2UgYW5kL29yIHRhcmdldCBkb2Vzbid0IGtub3cgdGhpcyBlZGdlIVwiO1xuICAgIH1cblxuICAgIGVkZ2Uuc291cmNlLmVkZ2VzLnNwbGljZShzb3VyY2VJbmRleCwgMSk7XG5cbiAgICBpZiAoZWRnZS50YXJnZXQgIT0gZWRnZS5zb3VyY2UpIHtcbiAgICAgIGVkZ2UudGFyZ2V0LmVkZ2VzLnNwbGljZSh0YXJnZXRJbmRleCwgMSk7XG4gICAgfVxuXG4gICAgdmFyIGluZGV4ID0gZWRnZS5zb3VyY2Uub3duZXIuZ2V0RWRnZXMoKS5pbmRleE9mKGVkZ2UpO1xuICAgIGlmIChpbmRleCA9PSAtMSkge1xuICAgICAgdGhyb3cgXCJOb3QgaW4gb3duZXIncyBlZGdlIGxpc3QhXCI7XG4gICAgfVxuXG4gICAgZWRnZS5zb3VyY2Uub3duZXIuZ2V0RWRnZXMoKS5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLnVwZGF0ZUxlZnRUb3AgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB0b3AgPSBJbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIGxlZnQgPSBJbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIG5vZGVUb3A7XG4gIHZhciBub2RlTGVmdDtcbiAgdmFyIG1hcmdpbjtcblxuICB2YXIgbm9kZXMgPSB0aGlzLmdldE5vZGVzKCk7XG4gIHZhciBzID0gbm9kZXMubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIGxOb2RlID0gbm9kZXNbaV07XG4gICAgbm9kZVRvcCA9IGxOb2RlLmdldFRvcCgpO1xuICAgIG5vZGVMZWZ0ID0gbE5vZGUuZ2V0TGVmdCgpO1xuXG4gICAgaWYgKHRvcCA+IG5vZGVUb3ApIHtcbiAgICAgIHRvcCA9IG5vZGVUb3A7XG4gICAgfVxuXG4gICAgaWYgKGxlZnQgPiBub2RlTGVmdCkge1xuICAgICAgbGVmdCA9IG5vZGVMZWZ0O1xuICAgIH1cbiAgfVxuXG4gIC8vIERvIHdlIGhhdmUgYW55IG5vZGVzIGluIHRoaXMgZ3JhcGg/XG4gIGlmICh0b3AgPT0gSW50ZWdlci5NQVhfVkFMVUUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChub2Rlc1swXS5nZXRQYXJlbnQoKS5wYWRkaW5nTGVmdCAhPSB1bmRlZmluZWQpIHtcbiAgICBtYXJnaW4gPSBub2Rlc1swXS5nZXRQYXJlbnQoKS5wYWRkaW5nTGVmdDtcbiAgfSBlbHNlIHtcbiAgICBtYXJnaW4gPSB0aGlzLm1hcmdpbjtcbiAgfVxuXG4gIHRoaXMubGVmdCA9IGxlZnQgLSBtYXJnaW47XG4gIHRoaXMudG9wID0gdG9wIC0gbWFyZ2luO1xuXG4gIC8vIEFwcGx5IHRoZSBtYXJnaW5zIGFuZCByZXR1cm4gdGhlIHJlc3VsdFxuICByZXR1cm4gbmV3IFBvaW50KHRoaXMubGVmdCwgdGhpcy50b3ApO1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS51cGRhdGVCb3VuZHMgPSBmdW5jdGlvbiAocmVjdXJzaXZlKSB7XG4gIC8vIGNhbGN1bGF0ZSBib3VuZHNcbiAgdmFyIGxlZnQgPSBJbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIHJpZ2h0ID0gLUludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgdG9wID0gSW50ZWdlci5NQVhfVkFMVUU7XG4gIHZhciBib3R0b20gPSAtSW50ZWdlci5NQVhfVkFMVUU7XG4gIHZhciBub2RlTGVmdDtcbiAgdmFyIG5vZGVSaWdodDtcbiAgdmFyIG5vZGVUb3A7XG4gIHZhciBub2RlQm90dG9tO1xuICB2YXIgbWFyZ2luO1xuXG4gIHZhciBub2RlcyA9IHRoaXMubm9kZXM7XG4gIHZhciBzID0gbm9kZXMubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHM7IGkrKykge1xuICAgIHZhciBsTm9kZSA9IG5vZGVzW2ldO1xuXG4gICAgaWYgKHJlY3Vyc2l2ZSAmJiBsTm9kZS5jaGlsZCAhPSBudWxsKSB7XG4gICAgICBsTm9kZS51cGRhdGVCb3VuZHMoKTtcbiAgICB9XG4gICAgbm9kZUxlZnQgPSBsTm9kZS5nZXRMZWZ0KCk7XG4gICAgbm9kZVJpZ2h0ID0gbE5vZGUuZ2V0UmlnaHQoKTtcbiAgICBub2RlVG9wID0gbE5vZGUuZ2V0VG9wKCk7XG4gICAgbm9kZUJvdHRvbSA9IGxOb2RlLmdldEJvdHRvbSgpO1xuXG4gICAgaWYgKGxlZnQgPiBub2RlTGVmdCkge1xuICAgICAgbGVmdCA9IG5vZGVMZWZ0O1xuICAgIH1cblxuICAgIGlmIChyaWdodCA8IG5vZGVSaWdodCkge1xuICAgICAgcmlnaHQgPSBub2RlUmlnaHQ7XG4gICAgfVxuXG4gICAgaWYgKHRvcCA+IG5vZGVUb3ApIHtcbiAgICAgIHRvcCA9IG5vZGVUb3A7XG4gICAgfVxuXG4gICAgaWYgKGJvdHRvbSA8IG5vZGVCb3R0b20pIHtcbiAgICAgIGJvdHRvbSA9IG5vZGVCb3R0b207XG4gICAgfVxuICB9XG5cbiAgdmFyIGJvdW5kaW5nUmVjdCA9IG5ldyBSZWN0YW5nbGVEKGxlZnQsIHRvcCwgcmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3ApO1xuICBpZiAobGVmdCA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkge1xuICAgIHRoaXMubGVmdCA9IHRoaXMucGFyZW50LmdldExlZnQoKTtcbiAgICB0aGlzLnJpZ2h0ID0gdGhpcy5wYXJlbnQuZ2V0UmlnaHQoKTtcbiAgICB0aGlzLnRvcCA9IHRoaXMucGFyZW50LmdldFRvcCgpO1xuICAgIHRoaXMuYm90dG9tID0gdGhpcy5wYXJlbnQuZ2V0Qm90dG9tKCk7XG4gIH1cblxuICBpZiAobm9kZXNbMF0uZ2V0UGFyZW50KCkucGFkZGluZ0xlZnQgIT0gdW5kZWZpbmVkKSB7XG4gICAgbWFyZ2luID0gbm9kZXNbMF0uZ2V0UGFyZW50KCkucGFkZGluZ0xlZnQ7XG4gIH0gZWxzZSB7XG4gICAgbWFyZ2luID0gdGhpcy5tYXJnaW47XG4gIH1cblxuICB0aGlzLmxlZnQgPSBib3VuZGluZ1JlY3QueCAtIG1hcmdpbjtcbiAgdGhpcy5yaWdodCA9IGJvdW5kaW5nUmVjdC54ICsgYm91bmRpbmdSZWN0LndpZHRoICsgbWFyZ2luO1xuICB0aGlzLnRvcCA9IGJvdW5kaW5nUmVjdC55IC0gbWFyZ2luO1xuICB0aGlzLmJvdHRvbSA9IGJvdW5kaW5nUmVjdC55ICsgYm91bmRpbmdSZWN0LmhlaWdodCArIG1hcmdpbjtcbn07XG5cbkxHcmFwaC5jYWxjdWxhdGVCb3VuZHMgPSBmdW5jdGlvbiAobm9kZXMpIHtcbiAgdmFyIGxlZnQgPSBJbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIHJpZ2h0ID0gLUludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgdG9wID0gSW50ZWdlci5NQVhfVkFMVUU7XG4gIHZhciBib3R0b20gPSAtSW50ZWdlci5NQVhfVkFMVUU7XG4gIHZhciBub2RlTGVmdDtcbiAgdmFyIG5vZGVSaWdodDtcbiAgdmFyIG5vZGVUb3A7XG4gIHZhciBub2RlQm90dG9tO1xuXG4gIHZhciBzID0gbm9kZXMubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIGxOb2RlID0gbm9kZXNbaV07XG4gICAgbm9kZUxlZnQgPSBsTm9kZS5nZXRMZWZ0KCk7XG4gICAgbm9kZVJpZ2h0ID0gbE5vZGUuZ2V0UmlnaHQoKTtcbiAgICBub2RlVG9wID0gbE5vZGUuZ2V0VG9wKCk7XG4gICAgbm9kZUJvdHRvbSA9IGxOb2RlLmdldEJvdHRvbSgpO1xuXG4gICAgaWYgKGxlZnQgPiBub2RlTGVmdCkge1xuICAgICAgbGVmdCA9IG5vZGVMZWZ0O1xuICAgIH1cblxuICAgIGlmIChyaWdodCA8IG5vZGVSaWdodCkge1xuICAgICAgcmlnaHQgPSBub2RlUmlnaHQ7XG4gICAgfVxuXG4gICAgaWYgKHRvcCA+IG5vZGVUb3ApIHtcbiAgICAgIHRvcCA9IG5vZGVUb3A7XG4gICAgfVxuXG4gICAgaWYgKGJvdHRvbSA8IG5vZGVCb3R0b20pIHtcbiAgICAgIGJvdHRvbSA9IG5vZGVCb3R0b207XG4gICAgfVxuICB9XG5cbiAgdmFyIGJvdW5kaW5nUmVjdCA9IG5ldyBSZWN0YW5nbGVEKGxlZnQsIHRvcCwgcmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3ApO1xuXG4gIHJldHVybiBib3VuZGluZ1JlY3Q7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmdldEluY2x1c2lvblRyZWVEZXB0aCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMgPT0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50LmdldEluY2x1c2lvblRyZWVEZXB0aCgpO1xuICB9XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmdldEVzdGltYXRlZFNpemUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmVzdGltYXRlZFNpemUgPT0gSW50ZWdlci5NSU5fVkFMVUUpIHtcbiAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgfVxuICByZXR1cm4gdGhpcy5lc3RpbWF0ZWRTaXplO1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5jYWxjRXN0aW1hdGVkU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNpemUgPSAwO1xuICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzO1xuICB2YXIgcyA9IG5vZGVzLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHM7IGkrKykge1xuICAgIHZhciBsTm9kZSA9IG5vZGVzW2ldO1xuICAgIHNpemUgKz0gbE5vZGUuY2FsY0VzdGltYXRlZFNpemUoKTtcbiAgfVxuXG4gIGlmIChzaXplID09IDApIHtcbiAgICB0aGlzLmVzdGltYXRlZFNpemUgPSBMYXlvdXRDb25zdGFudHMuRU1QVFlfQ09NUE9VTkRfTk9ERV9TSVpFO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZXN0aW1hdGVkU2l6ZSA9IHNpemUgLyBNYXRoLnNxcnQodGhpcy5ub2Rlcy5sZW5ndGgpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZXN0aW1hdGVkU2l6ZTtcbn07XG5cbkxHcmFwaC5wcm90b3R5cGUudXBkYXRlQ29ubmVjdGVkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmICh0aGlzLm5vZGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgdGhpcy5pc0Nvbm5lY3RlZCA9IHRydWU7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHF1ZXVlID0gbmV3IExpbmtlZExpc3QoKTtcbiAgdmFyIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gIHZhciBjdXJyZW50Tm9kZSA9IHRoaXMubm9kZXNbMF07XG4gIHZhciBuZWlnaGJvckVkZ2VzO1xuICB2YXIgY3VycmVudE5laWdoYm9yO1xuICB2YXIgY2hpbGRyZW5PZk5vZGUgPSBjdXJyZW50Tm9kZS53aXRoQ2hpbGRyZW4oKTtcbiAgY2hpbGRyZW5PZk5vZGUuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgIHF1ZXVlLnB1c2gobm9kZSk7XG4gICAgdmlzaXRlZC5hZGQobm9kZSk7XG4gIH0pO1xuXG4gIHdoaWxlIChxdWV1ZS5sZW5ndGggIT09IDApIHtcbiAgICBjdXJyZW50Tm9kZSA9IHF1ZXVlLnNoaWZ0KCk7XG5cbiAgICAvLyBUcmF2ZXJzZSBhbGwgbmVpZ2hib3JzIG9mIHRoaXMgbm9kZVxuICAgIG5laWdoYm9yRWRnZXMgPSBjdXJyZW50Tm9kZS5nZXRFZGdlcygpO1xuICAgIHZhciBzaXplID0gbmVpZ2hib3JFZGdlcy5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgIHZhciBuZWlnaGJvckVkZ2UgPSBuZWlnaGJvckVkZ2VzW2ldO1xuICAgICAgY3VycmVudE5laWdoYm9yID0gbmVpZ2hib3JFZGdlLmdldE90aGVyRW5kSW5HcmFwaChjdXJyZW50Tm9kZSwgdGhpcyk7XG5cbiAgICAgIC8vIEFkZCB1bnZpc2l0ZWQgbmVpZ2hib3JzIHRvIHRoZSBsaXN0IHRvIHZpc2l0XG4gICAgICBpZiAoY3VycmVudE5laWdoYm9yICE9IG51bGwgJiYgIXZpc2l0ZWQuaGFzKGN1cnJlbnROZWlnaGJvcikpIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuT2ZOZWlnaGJvciA9IGN1cnJlbnROZWlnaGJvci53aXRoQ2hpbGRyZW4oKTtcblxuICAgICAgICBjaGlsZHJlbk9mTmVpZ2hib3IuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgIHF1ZXVlLnB1c2gobm9kZSk7XG4gICAgICAgICAgdmlzaXRlZC5hZGQobm9kZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRoaXMuaXNDb25uZWN0ZWQgPSBmYWxzZTtcblxuICBpZiAodmlzaXRlZC5zaXplID49IHRoaXMubm9kZXMubGVuZ3RoKSB7XG4gICAgdmFyIG5vT2ZWaXNpdGVkSW5UaGlzR3JhcGggPSAwO1xuXG4gICAgdmlzaXRlZC5mb3JFYWNoKGZ1bmN0aW9uICh2aXNpdGVkTm9kZSkge1xuICAgICAgaWYgKHZpc2l0ZWROb2RlLm93bmVyID09IHNlbGYpIHtcbiAgICAgICAgbm9PZlZpc2l0ZWRJblRoaXNHcmFwaCsrO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKG5vT2ZWaXNpdGVkSW5UaGlzR3JhcGggPT0gdGhpcy5ub2Rlcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaXNDb25uZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBMR3JhcGg7XG5cbi8qKiovIH0pLFxuLyogNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgTEdyYXBoO1xudmFyIExFZGdlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblxuZnVuY3Rpb24gTEdyYXBoTWFuYWdlcihsYXlvdXQpIHtcbiAgTEdyYXBoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTsgLy8gSXQgbWF5IGJlIGJldHRlciB0byBpbml0aWxpemUgdGhpcyBvdXQgb2YgdGhpcyBmdW5jdGlvbiBidXQgaXQgZ2l2ZXMgYW4gZXJyb3IgKFJpZ2h0LWhhbmQgc2lkZSBvZiAnaW5zdGFuY2VvZicgaXMgbm90IGNhbGxhYmxlKSBub3cuXG4gIHRoaXMubGF5b3V0ID0gbGF5b3V0O1xuXG4gIHRoaXMuZ3JhcGhzID0gW107XG4gIHRoaXMuZWRnZXMgPSBbXTtcbn1cblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuYWRkUm9vdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5ncmFwaCA9IHRoaXMubGF5b3V0Lm5ld0dyYXBoKCk7XG4gIHZhciBubm9kZSA9IHRoaXMubGF5b3V0Lm5ld05vZGUobnVsbCk7XG4gIHZhciByb290ID0gdGhpcy5hZGQobmdyYXBoLCBubm9kZSk7XG4gIHRoaXMuc2V0Um9vdEdyYXBoKHJvb3QpO1xuICByZXR1cm4gdGhpcy5yb290R3JhcGg7XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAobmV3R3JhcGgsIHBhcmVudE5vZGUsIG5ld0VkZ2UsIHNvdXJjZU5vZGUsIHRhcmdldE5vZGUpIHtcbiAgLy90aGVyZSBhcmUganVzdCAyIHBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0aGVuIGl0IGFkZHMgYW4gTEdyYXBoIGVsc2UgaXQgYWRkcyBhbiBMRWRnZVxuICBpZiAobmV3RWRnZSA9PSBudWxsICYmIHNvdXJjZU5vZGUgPT0gbnVsbCAmJiB0YXJnZXROb2RlID09IG51bGwpIHtcbiAgICBpZiAobmV3R3JhcGggPT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJHcmFwaCBpcyBudWxsIVwiO1xuICAgIH1cbiAgICBpZiAocGFyZW50Tm9kZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcIlBhcmVudCBub2RlIGlzIG51bGwhXCI7XG4gICAgfVxuICAgIGlmICh0aGlzLmdyYXBocy5pbmRleE9mKG5ld0dyYXBoKSA+IC0xKSB7XG4gICAgICB0aHJvdyBcIkdyYXBoIGFscmVhZHkgaW4gdGhpcyBncmFwaCBtZ3IhXCI7XG4gICAgfVxuXG4gICAgdGhpcy5ncmFwaHMucHVzaChuZXdHcmFwaCk7XG5cbiAgICBpZiAobmV3R3JhcGgucGFyZW50ICE9IG51bGwpIHtcbiAgICAgIHRocm93IFwiQWxyZWFkeSBoYXMgYSBwYXJlbnQhXCI7XG4gICAgfVxuICAgIGlmIChwYXJlbnROb2RlLmNoaWxkICE9IG51bGwpIHtcbiAgICAgIHRocm93IFwiQWxyZWFkeSBoYXMgYSBjaGlsZCFcIjtcbiAgICB9XG5cbiAgICBuZXdHcmFwaC5wYXJlbnQgPSBwYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUuY2hpbGQgPSBuZXdHcmFwaDtcblxuICAgIHJldHVybiBuZXdHcmFwaDtcbiAgfSBlbHNlIHtcbiAgICAvL2NoYW5nZSB0aGUgb3JkZXIgb2YgdGhlIHBhcmFtZXRlcnNcbiAgICB0YXJnZXROb2RlID0gbmV3RWRnZTtcbiAgICBzb3VyY2VOb2RlID0gcGFyZW50Tm9kZTtcbiAgICBuZXdFZGdlID0gbmV3R3JhcGg7XG4gICAgdmFyIHNvdXJjZUdyYXBoID0gc291cmNlTm9kZS5nZXRPd25lcigpO1xuICAgIHZhciB0YXJnZXRHcmFwaCA9IHRhcmdldE5vZGUuZ2V0T3duZXIoKTtcblxuICAgIGlmICghKHNvdXJjZUdyYXBoICE9IG51bGwgJiYgc291cmNlR3JhcGguZ2V0R3JhcGhNYW5hZ2VyKCkgPT0gdGhpcykpIHtcbiAgICAgIHRocm93IFwiU291cmNlIG5vdCBpbiB0aGlzIGdyYXBoIG1nciFcIjtcbiAgICB9XG4gICAgaWYgKCEodGFyZ2V0R3JhcGggIT0gbnVsbCAmJiB0YXJnZXRHcmFwaC5nZXRHcmFwaE1hbmFnZXIoKSA9PSB0aGlzKSkge1xuICAgICAgdGhyb3cgXCJUYXJnZXQgbm90IGluIHRoaXMgZ3JhcGggbWdyIVwiO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2VHcmFwaCA9PSB0YXJnZXRHcmFwaCkge1xuICAgICAgbmV3RWRnZS5pc0ludGVyR3JhcGggPSBmYWxzZTtcbiAgICAgIHJldHVybiBzb3VyY2VHcmFwaC5hZGQobmV3RWRnZSwgc291cmNlTm9kZSwgdGFyZ2V0Tm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0VkZ2UuaXNJbnRlckdyYXBoID0gdHJ1ZTtcblxuICAgICAgLy8gc2V0IHNvdXJjZSBhbmQgdGFyZ2V0XG4gICAgICBuZXdFZGdlLnNvdXJjZSA9IHNvdXJjZU5vZGU7XG4gICAgICBuZXdFZGdlLnRhcmdldCA9IHRhcmdldE5vZGU7XG5cbiAgICAgIC8vIGFkZCBlZGdlIHRvIGludGVyLWdyYXBoIGVkZ2UgbGlzdFxuICAgICAgaWYgKHRoaXMuZWRnZXMuaW5kZXhPZihuZXdFZGdlKSA+IC0xKSB7XG4gICAgICAgIHRocm93IFwiRWRnZSBhbHJlYWR5IGluIGludGVyLWdyYXBoIGVkZ2UgbGlzdCFcIjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5lZGdlcy5wdXNoKG5ld0VkZ2UpO1xuXG4gICAgICAvLyBhZGQgZWRnZSB0byBzb3VyY2UgYW5kIHRhcmdldCBpbmNpZGVuY3kgbGlzdHNcbiAgICAgIGlmICghKG5ld0VkZ2Uuc291cmNlICE9IG51bGwgJiYgbmV3RWRnZS50YXJnZXQgIT0gbnVsbCkpIHtcbiAgICAgICAgdGhyb3cgXCJFZGdlIHNvdXJjZSBhbmQvb3IgdGFyZ2V0IGlzIG51bGwhXCI7XG4gICAgICB9XG5cbiAgICAgIGlmICghKG5ld0VkZ2Uuc291cmNlLmVkZ2VzLmluZGV4T2YobmV3RWRnZSkgPT0gLTEgJiYgbmV3RWRnZS50YXJnZXQuZWRnZXMuaW5kZXhPZihuZXdFZGdlKSA9PSAtMSkpIHtcbiAgICAgICAgdGhyb3cgXCJFZGdlIGFscmVhZHkgaW4gc291cmNlIGFuZC9vciB0YXJnZXQgaW5jaWRlbmN5IGxpc3QhXCI7XG4gICAgICB9XG5cbiAgICAgIG5ld0VkZ2Uuc291cmNlLmVkZ2VzLnB1c2gobmV3RWRnZSk7XG4gICAgICBuZXdFZGdlLnRhcmdldC5lZGdlcy5wdXNoKG5ld0VkZ2UpO1xuXG4gICAgICByZXR1cm4gbmV3RWRnZTtcbiAgICB9XG4gIH1cbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChsT2JqKSB7XG4gIGlmIChsT2JqIGluc3RhbmNlb2YgTEdyYXBoKSB7XG4gICAgdmFyIGdyYXBoID0gbE9iajtcbiAgICBpZiAoZ3JhcGguZ2V0R3JhcGhNYW5hZ2VyKCkgIT0gdGhpcykge1xuICAgICAgdGhyb3cgXCJHcmFwaCBub3QgaW4gdGhpcyBncmFwaCBtZ3JcIjtcbiAgICB9XG4gICAgaWYgKCEoZ3JhcGggPT0gdGhpcy5yb290R3JhcGggfHwgZ3JhcGgucGFyZW50ICE9IG51bGwgJiYgZ3JhcGgucGFyZW50LmdyYXBoTWFuYWdlciA9PSB0aGlzKSkge1xuICAgICAgdGhyb3cgXCJJbnZhbGlkIHBhcmVudCBub2RlIVwiO1xuICAgIH1cblxuICAgIC8vIGZpcnN0IHRoZSBlZGdlcyAobWFrZSBhIGNvcHkgdG8gZG8gaXQgc2FmZWx5KVxuICAgIHZhciBlZGdlc1RvQmVSZW1vdmVkID0gW107XG5cbiAgICBlZGdlc1RvQmVSZW1vdmVkID0gZWRnZXNUb0JlUmVtb3ZlZC5jb25jYXQoZ3JhcGguZ2V0RWRnZXMoKSk7XG5cbiAgICB2YXIgZWRnZTtcbiAgICB2YXIgcyA9IGVkZ2VzVG9CZVJlbW92ZWQubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgICBlZGdlID0gZWRnZXNUb0JlUmVtb3ZlZFtpXTtcbiAgICAgIGdyYXBoLnJlbW92ZShlZGdlKTtcbiAgICB9XG5cbiAgICAvLyB0aGVuIHRoZSBub2RlcyAobWFrZSBhIGNvcHkgdG8gZG8gaXQgc2FmZWx5KVxuICAgIHZhciBub2Rlc1RvQmVSZW1vdmVkID0gW107XG5cbiAgICBub2Rlc1RvQmVSZW1vdmVkID0gbm9kZXNUb0JlUmVtb3ZlZC5jb25jYXQoZ3JhcGguZ2V0Tm9kZXMoKSk7XG5cbiAgICB2YXIgbm9kZTtcbiAgICBzID0gbm9kZXNUb0JlUmVtb3ZlZC5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgIG5vZGUgPSBub2Rlc1RvQmVSZW1vdmVkW2ldO1xuICAgICAgZ3JhcGgucmVtb3ZlKG5vZGUpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIGdyYXBoIGlzIHRoZSByb290XG4gICAgaWYgKGdyYXBoID09IHRoaXMucm9vdEdyYXBoKSB7XG4gICAgICB0aGlzLnNldFJvb3RHcmFwaChudWxsKTtcbiAgICB9XG5cbiAgICAvLyBub3cgcmVtb3ZlIHRoZSBncmFwaCBpdHNlbGZcbiAgICB2YXIgaW5kZXggPSB0aGlzLmdyYXBocy5pbmRleE9mKGdyYXBoKTtcbiAgICB0aGlzLmdyYXBocy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gYWxzbyByZXNldCB0aGUgcGFyZW50IG9mIHRoZSBncmFwaFxuICAgIGdyYXBoLnBhcmVudCA9IG51bGw7XG4gIH0gZWxzZSBpZiAobE9iaiBpbnN0YW5jZW9mIExFZGdlKSB7XG4gICAgZWRnZSA9IGxPYmo7XG4gICAgaWYgKGVkZ2UgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJFZGdlIGlzIG51bGwhXCI7XG4gICAgfVxuICAgIGlmICghZWRnZS5pc0ludGVyR3JhcGgpIHtcbiAgICAgIHRocm93IFwiTm90IGFuIGludGVyLWdyYXBoIGVkZ2UhXCI7XG4gICAgfVxuICAgIGlmICghKGVkZ2Uuc291cmNlICE9IG51bGwgJiYgZWRnZS50YXJnZXQgIT0gbnVsbCkpIHtcbiAgICAgIHRocm93IFwiU291cmNlIGFuZC9vciB0YXJnZXQgaXMgbnVsbCFcIjtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgZWRnZSBmcm9tIHNvdXJjZSBhbmQgdGFyZ2V0IG5vZGVzJyBpbmNpZGVuY3kgbGlzdHNcblxuICAgIGlmICghKGVkZ2Uuc291cmNlLmVkZ2VzLmluZGV4T2YoZWRnZSkgIT0gLTEgJiYgZWRnZS50YXJnZXQuZWRnZXMuaW5kZXhPZihlZGdlKSAhPSAtMSkpIHtcbiAgICAgIHRocm93IFwiU291cmNlIGFuZC9vciB0YXJnZXQgZG9lc24ndCBrbm93IHRoaXMgZWRnZSFcIjtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXggPSBlZGdlLnNvdXJjZS5lZGdlcy5pbmRleE9mKGVkZ2UpO1xuICAgIGVkZ2Uuc291cmNlLmVkZ2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgaW5kZXggPSBlZGdlLnRhcmdldC5lZGdlcy5pbmRleE9mKGVkZ2UpO1xuICAgIGVkZ2UudGFyZ2V0LmVkZ2VzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyByZW1vdmUgZWRnZSBmcm9tIG93bmVyIGdyYXBoIG1hbmFnZXIncyBpbnRlci1ncmFwaCBlZGdlIGxpc3RcblxuICAgIGlmICghKGVkZ2Uuc291cmNlLm93bmVyICE9IG51bGwgJiYgZWRnZS5zb3VyY2Uub3duZXIuZ2V0R3JhcGhNYW5hZ2VyKCkgIT0gbnVsbCkpIHtcbiAgICAgIHRocm93IFwiRWRnZSBvd25lciBncmFwaCBvciBvd25lciBncmFwaCBtYW5hZ2VyIGlzIG51bGwhXCI7XG4gICAgfVxuICAgIGlmIChlZGdlLnNvdXJjZS5vd25lci5nZXRHcmFwaE1hbmFnZXIoKS5lZGdlcy5pbmRleE9mKGVkZ2UpID09IC0xKSB7XG4gICAgICB0aHJvdyBcIk5vdCBpbiBvd25lciBncmFwaCBtYW5hZ2VyJ3MgZWRnZSBsaXN0IVwiO1xuICAgIH1cblxuICAgIHZhciBpbmRleCA9IGVkZ2Uuc291cmNlLm93bmVyLmdldEdyYXBoTWFuYWdlcigpLmVkZ2VzLmluZGV4T2YoZWRnZSk7XG4gICAgZWRnZS5zb3VyY2Uub3duZXIuZ2V0R3JhcGhNYW5hZ2VyKCkuZWRnZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUudXBkYXRlQm91bmRzID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLnJvb3RHcmFwaC51cGRhdGVCb3VuZHModHJ1ZSk7XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5nZXRHcmFwaHMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmdyYXBocztcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldEFsbE5vZGVzID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5hbGxOb2RlcyA9PSBudWxsKSB7XG4gICAgdmFyIG5vZGVMaXN0ID0gW107XG4gICAgdmFyIGdyYXBocyA9IHRoaXMuZ2V0R3JhcGhzKCk7XG4gICAgdmFyIHMgPSBncmFwaHMubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgICBub2RlTGlzdCA9IG5vZGVMaXN0LmNvbmNhdChncmFwaHNbaV0uZ2V0Tm9kZXMoKSk7XG4gICAgfVxuICAgIHRoaXMuYWxsTm9kZXMgPSBub2RlTGlzdDtcbiAgfVxuICByZXR1cm4gdGhpcy5hbGxOb2Rlcztcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLnJlc2V0QWxsTm9kZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuYWxsTm9kZXMgPSBudWxsO1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUucmVzZXRBbGxFZGdlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5hbGxFZGdlcyA9IG51bGw7XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5yZXNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uID0gbnVsbDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldEFsbEVkZ2VzID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5hbGxFZGdlcyA9PSBudWxsKSB7XG4gICAgdmFyIGVkZ2VMaXN0ID0gW107XG4gICAgdmFyIGdyYXBocyA9IHRoaXMuZ2V0R3JhcGhzKCk7XG4gICAgdmFyIHMgPSBncmFwaHMubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JhcGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBlZGdlTGlzdCA9IGVkZ2VMaXN0LmNvbmNhdChncmFwaHNbaV0uZ2V0RWRnZXMoKSk7XG4gICAgfVxuXG4gICAgZWRnZUxpc3QgPSBlZGdlTGlzdC5jb25jYXQodGhpcy5lZGdlcyk7XG5cbiAgICB0aGlzLmFsbEVkZ2VzID0gZWRnZUxpc3Q7XG4gIH1cbiAgcmV0dXJuIHRoaXMuYWxsRWRnZXM7XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5nZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuYWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb247XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5zZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbiA9IGZ1bmN0aW9uIChub2RlTGlzdCkge1xuICBpZiAodGhpcy5hbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbiAhPSBudWxsKSB7XG4gICAgdGhyb3cgXCJhc3NlcnQgZmFpbGVkXCI7XG4gIH1cblxuICB0aGlzLmFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uID0gbm9kZUxpc3Q7XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5nZXRSb290ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yb290R3JhcGg7XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5zZXRSb290R3JhcGggPSBmdW5jdGlvbiAoZ3JhcGgpIHtcbiAgaWYgKGdyYXBoLmdldEdyYXBoTWFuYWdlcigpICE9IHRoaXMpIHtcbiAgICB0aHJvdyBcIlJvb3Qgbm90IGluIHRoaXMgZ3JhcGggbWdyIVwiO1xuICB9XG5cbiAgdGhpcy5yb290R3JhcGggPSBncmFwaDtcbiAgLy8gcm9vdCBncmFwaCBtdXN0IGhhdmUgYSByb290IG5vZGUgYXNzb2NpYXRlZCB3aXRoIGl0IGZvciBjb252ZW5pZW5jZVxuICBpZiAoZ3JhcGgucGFyZW50ID09IG51bGwpIHtcbiAgICBncmFwaC5wYXJlbnQgPSB0aGlzLmxheW91dC5uZXdOb2RlKFwiUm9vdCBub2RlXCIpO1xuICB9XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5nZXRMYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxheW91dDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmlzT25lQW5jZXN0b3JPZk90aGVyID0gZnVuY3Rpb24gKGZpcnN0Tm9kZSwgc2Vjb25kTm9kZSkge1xuICBpZiAoIShmaXJzdE5vZGUgIT0gbnVsbCAmJiBzZWNvbmROb2RlICE9IG51bGwpKSB7XG4gICAgdGhyb3cgXCJhc3NlcnQgZmFpbGVkXCI7XG4gIH1cblxuICBpZiAoZmlyc3ROb2RlID09IHNlY29uZE5vZGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyBJcyBzZWNvbmQgbm9kZSBhbiBhbmNlc3RvciBvZiB0aGUgZmlyc3Qgb25lP1xuICB2YXIgb3duZXJHcmFwaCA9IGZpcnN0Tm9kZS5nZXRPd25lcigpO1xuICB2YXIgcGFyZW50Tm9kZTtcblxuICBkbyB7XG4gICAgcGFyZW50Tm9kZSA9IG93bmVyR3JhcGguZ2V0UGFyZW50KCk7XG5cbiAgICBpZiAocGFyZW50Tm9kZSA9PSBudWxsKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAocGFyZW50Tm9kZSA9PSBzZWNvbmROb2RlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBvd25lckdyYXBoID0gcGFyZW50Tm9kZS5nZXRPd25lcigpO1xuICAgIGlmIChvd25lckdyYXBoID09IG51bGwpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSB3aGlsZSAodHJ1ZSk7XG4gIC8vIElzIGZpcnN0IG5vZGUgYW4gYW5jZXN0b3Igb2YgdGhlIHNlY29uZCBvbmU/XG4gIG93bmVyR3JhcGggPSBzZWNvbmROb2RlLmdldE93bmVyKCk7XG5cbiAgZG8ge1xuICAgIHBhcmVudE5vZGUgPSBvd25lckdyYXBoLmdldFBhcmVudCgpO1xuXG4gICAgaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHBhcmVudE5vZGUgPT0gZmlyc3ROb2RlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBvd25lckdyYXBoID0gcGFyZW50Tm9kZS5nZXRPd25lcigpO1xuICAgIGlmIChvd25lckdyYXBoID09IG51bGwpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuY2FsY0xvd2VzdENvbW1vbkFuY2VzdG9ycyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVkZ2U7XG4gIHZhciBzb3VyY2VOb2RlO1xuICB2YXIgdGFyZ2V0Tm9kZTtcbiAgdmFyIHNvdXJjZUFuY2VzdG9yR3JhcGg7XG4gIHZhciB0YXJnZXRBbmNlc3RvckdyYXBoO1xuXG4gIHZhciBlZGdlcyA9IHRoaXMuZ2V0QWxsRWRnZXMoKTtcbiAgdmFyIHMgPSBlZGdlcy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgZWRnZSA9IGVkZ2VzW2ldO1xuXG4gICAgc291cmNlTm9kZSA9IGVkZ2Uuc291cmNlO1xuICAgIHRhcmdldE5vZGUgPSBlZGdlLnRhcmdldDtcbiAgICBlZGdlLmxjYSA9IG51bGw7XG4gICAgZWRnZS5zb3VyY2VJbkxjYSA9IHNvdXJjZU5vZGU7XG4gICAgZWRnZS50YXJnZXRJbkxjYSA9IHRhcmdldE5vZGU7XG5cbiAgICBpZiAoc291cmNlTm9kZSA9PSB0YXJnZXROb2RlKSB7XG4gICAgICBlZGdlLmxjYSA9IHNvdXJjZU5vZGUuZ2V0T3duZXIoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHNvdXJjZUFuY2VzdG9yR3JhcGggPSBzb3VyY2VOb2RlLmdldE93bmVyKCk7XG5cbiAgICB3aGlsZSAoZWRnZS5sY2EgPT0gbnVsbCkge1xuICAgICAgZWRnZS50YXJnZXRJbkxjYSA9IHRhcmdldE5vZGU7XG4gICAgICB0YXJnZXRBbmNlc3RvckdyYXBoID0gdGFyZ2V0Tm9kZS5nZXRPd25lcigpO1xuXG4gICAgICB3aGlsZSAoZWRnZS5sY2EgPT0gbnVsbCkge1xuICAgICAgICBpZiAodGFyZ2V0QW5jZXN0b3JHcmFwaCA9PSBzb3VyY2VBbmNlc3RvckdyYXBoKSB7XG4gICAgICAgICAgZWRnZS5sY2EgPSB0YXJnZXRBbmNlc3RvckdyYXBoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldEFuY2VzdG9yR3JhcGggPT0gdGhpcy5yb290R3JhcGgpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlZGdlLmxjYSAhPSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgXCJhc3NlcnQgZmFpbGVkXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWRnZS50YXJnZXRJbkxjYSA9IHRhcmdldEFuY2VzdG9yR3JhcGguZ2V0UGFyZW50KCk7XG4gICAgICAgIHRhcmdldEFuY2VzdG9yR3JhcGggPSBlZGdlLnRhcmdldEluTGNhLmdldE93bmVyKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzb3VyY2VBbmNlc3RvckdyYXBoID09IHRoaXMucm9vdEdyYXBoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWRnZS5sY2EgPT0gbnVsbCkge1xuICAgICAgICBlZGdlLnNvdXJjZUluTGNhID0gc291cmNlQW5jZXN0b3JHcmFwaC5nZXRQYXJlbnQoKTtcbiAgICAgICAgc291cmNlQW5jZXN0b3JHcmFwaCA9IGVkZ2Uuc291cmNlSW5MY2EuZ2V0T3duZXIoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWRnZS5sY2EgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJhc3NlcnQgZmFpbGVkXCI7XG4gICAgfVxuICB9XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5jYWxjTG93ZXN0Q29tbW9uQW5jZXN0b3IgPSBmdW5jdGlvbiAoZmlyc3ROb2RlLCBzZWNvbmROb2RlKSB7XG4gIGlmIChmaXJzdE5vZGUgPT0gc2Vjb25kTm9kZSkge1xuICAgIHJldHVybiBmaXJzdE5vZGUuZ2V0T3duZXIoKTtcbiAgfVxuICB2YXIgZmlyc3RPd25lckdyYXBoID0gZmlyc3ROb2RlLmdldE93bmVyKCk7XG5cbiAgZG8ge1xuICAgIGlmIChmaXJzdE93bmVyR3JhcGggPT0gbnVsbCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBzZWNvbmRPd25lckdyYXBoID0gc2Vjb25kTm9kZS5nZXRPd25lcigpO1xuXG4gICAgZG8ge1xuICAgICAgaWYgKHNlY29uZE93bmVyR3JhcGggPT0gbnVsbCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHNlY29uZE93bmVyR3JhcGggPT0gZmlyc3RPd25lckdyYXBoKSB7XG4gICAgICAgIHJldHVybiBzZWNvbmRPd25lckdyYXBoO1xuICAgICAgfVxuICAgICAgc2Vjb25kT3duZXJHcmFwaCA9IHNlY29uZE93bmVyR3JhcGguZ2V0UGFyZW50KCkuZ2V0T3duZXIoKTtcbiAgICB9IHdoaWxlICh0cnVlKTtcblxuICAgIGZpcnN0T3duZXJHcmFwaCA9IGZpcnN0T3duZXJHcmFwaC5nZXRQYXJlbnQoKS5nZXRPd25lcigpO1xuICB9IHdoaWxlICh0cnVlKTtcblxuICByZXR1cm4gZmlyc3RPd25lckdyYXBoO1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuY2FsY0luY2x1c2lvblRyZWVEZXB0aHMgPSBmdW5jdGlvbiAoZ3JhcGgsIGRlcHRoKSB7XG4gIGlmIChncmFwaCA9PSBudWxsICYmIGRlcHRoID09IG51bGwpIHtcbiAgICBncmFwaCA9IHRoaXMucm9vdEdyYXBoO1xuICAgIGRlcHRoID0gMTtcbiAgfVxuICB2YXIgbm9kZTtcblxuICB2YXIgbm9kZXMgPSBncmFwaC5nZXROb2RlcygpO1xuICB2YXIgcyA9IG5vZGVzLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICBub2RlID0gbm9kZXNbaV07XG4gICAgbm9kZS5pbmNsdXNpb25UcmVlRGVwdGggPSBkZXB0aDtcblxuICAgIGlmIChub2RlLmNoaWxkICE9IG51bGwpIHtcbiAgICAgIHRoaXMuY2FsY0luY2x1c2lvblRyZWVEZXB0aHMobm9kZS5jaGlsZCwgZGVwdGggKyAxKTtcbiAgICB9XG4gIH1cbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmluY2x1ZGVzSW52YWxpZEVkZ2UgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlZGdlO1xuICB2YXIgZWRnZXNUb1JlbW92ZSA9IFtdO1xuXG4gIHZhciBzID0gdGhpcy5lZGdlcy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgZWRnZSA9IHRoaXMuZWRnZXNbaV07XG5cbiAgICBpZiAodGhpcy5pc09uZUFuY2VzdG9yT2ZPdGhlcihlZGdlLnNvdXJjZSwgZWRnZS50YXJnZXQpKSB7XG4gICAgICBlZGdlc1RvUmVtb3ZlLnB1c2goZWRnZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVtb3ZlIGludmFsaWQgZWRnZXMgZnJvbSBncmFwaCBtYW5hZ2VyXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXNUb1JlbW92ZS5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMucmVtb3ZlKGVkZ2VzVG9SZW1vdmVbaV0pO1xuICB9XG5cbiAgLy8gSW52YWxpZCBlZGdlcyBhcmUgY2xlYXJlZCwgc28gcmV0dXJuIGZhbHNlXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTEdyYXBoTWFuYWdlcjtcblxuLyoqKi8gfSksXG4vKiA4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbi8qKlxuICogVGhpcyBjbGFzcyBtYWludGFpbnMgYSBsaXN0IG9mIHN0YXRpYyBnZW9tZXRyeSByZWxhdGVkIHV0aWxpdHkgbWV0aG9kcy5cbiAqXG4gKlxuICogQ29weXJpZ2h0OiBpLVZpcyBSZXNlYXJjaCBHcm91cCwgQmlsa2VudCBVbml2ZXJzaXR5LCAyMDA3IC0gcHJlc2VudFxuICovXG5cbnZhciBQb2ludCA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpO1xuXG5mdW5jdGlvbiBJR2VvbWV0cnkoKSB7fVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNhbGN1bGF0ZXMgKmhhbGYqIHRoZSBhbW91bnQgaW4geCBhbmQgeSBkaXJlY3Rpb25zIG9mIHRoZSB0d29cbiAqIGlucHV0IHJlY3RhbmdsZXMgbmVlZGVkIHRvIHNlcGFyYXRlIHRoZW0ga2VlcGluZyB0aGVpciByZXNwZWN0aXZlXG4gKiBwb3NpdGlvbmluZywgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBpbiB0aGUgaW5wdXQgYXJyYXkuIEFuIGlucHV0XG4gKiBzZXBhcmF0aW9uIGJ1ZmZlciBhZGRlZCB0byB0aGUgYW1vdW50IGluIGJvdGggZGlyZWN0aW9ucy4gV2UgYXNzdW1lIHRoYXRcbiAqIHRoZSB0d28gcmVjdGFuZ2xlcyBkbyBpbnRlcnNlY3QuXG4gKi9cbklHZW9tZXRyeS5jYWxjU2VwYXJhdGlvbkFtb3VudCA9IGZ1bmN0aW9uIChyZWN0QSwgcmVjdEIsIG92ZXJsYXBBbW91bnQsIHNlcGFyYXRpb25CdWZmZXIpIHtcbiAgaWYgKCFyZWN0QS5pbnRlcnNlY3RzKHJlY3RCKSkge1xuICAgIHRocm93IFwiYXNzZXJ0IGZhaWxlZFwiO1xuICB9XG5cbiAgdmFyIGRpcmVjdGlvbnMgPSBuZXcgQXJyYXkoMik7XG5cbiAgdGhpcy5kZWNpZGVEaXJlY3Rpb25zRm9yT3ZlcmxhcHBpbmdOb2RlcyhyZWN0QSwgcmVjdEIsIGRpcmVjdGlvbnMpO1xuXG4gIG92ZXJsYXBBbW91bnRbMF0gPSBNYXRoLm1pbihyZWN0QS5nZXRSaWdodCgpLCByZWN0Qi5nZXRSaWdodCgpKSAtIE1hdGgubWF4KHJlY3RBLngsIHJlY3RCLngpO1xuICBvdmVybGFwQW1vdW50WzFdID0gTWF0aC5taW4ocmVjdEEuZ2V0Qm90dG9tKCksIHJlY3RCLmdldEJvdHRvbSgpKSAtIE1hdGgubWF4KHJlY3RBLnksIHJlY3RCLnkpO1xuXG4gIC8vIHVwZGF0ZSB0aGUgb3ZlcmxhcHBpbmcgYW1vdW50cyBmb3IgdGhlIGZvbGxvd2luZyBjYXNlczpcbiAgaWYgKHJlY3RBLmdldFgoKSA8PSByZWN0Qi5nZXRYKCkgJiYgcmVjdEEuZ2V0UmlnaHQoKSA+PSByZWN0Qi5nZXRSaWdodCgpKSB7XG4gICAgLyogQ2FzZSB4LjE6XG4gICAgKlxuICAgICogcmVjdEFcbiAgICAqIFx0fCAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICogXHR8ICAgICAgICBfX19fX19fX18gICAgICB8XG4gICAgKiBcdHwgICAgICAgIHwgICAgICAgfCAgICAgIHxcbiAgICAqIFx0fF9fX19fX19ffF9fX19fX198X19fX19ffFxuICAgICogXHRcdFx0IHwgICAgICAgfFxuICAgICogICAgICAgICAgIHwgICAgICAgfFxuICAgICogICAgICAgIHJlY3RCXG4gICAgKi9cbiAgICBvdmVybGFwQW1vdW50WzBdICs9IE1hdGgubWluKHJlY3RCLmdldFgoKSAtIHJlY3RBLmdldFgoKSwgcmVjdEEuZ2V0UmlnaHQoKSAtIHJlY3RCLmdldFJpZ2h0KCkpO1xuICB9IGVsc2UgaWYgKHJlY3RCLmdldFgoKSA8PSByZWN0QS5nZXRYKCkgJiYgcmVjdEIuZ2V0UmlnaHQoKSA+PSByZWN0QS5nZXRSaWdodCgpKSB7XG4gICAgLyogQ2FzZSB4LjI6XG4gICAgKlxuICAgICogcmVjdEJcbiAgICAqIFx0fCAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICogXHR8ICAgICAgICBfX19fX19fX18gICAgICB8XG4gICAgKiBcdHwgICAgICAgIHwgICAgICAgfCAgICAgIHxcbiAgICAqIFx0fF9fX19fX19ffF9fX19fX198X19fX19ffFxuICAgICogXHRcdFx0IHwgICAgICAgfFxuICAgICogICAgICAgICAgIHwgICAgICAgfFxuICAgICogICAgICAgIHJlY3RBXG4gICAgKi9cbiAgICBvdmVybGFwQW1vdW50WzBdICs9IE1hdGgubWluKHJlY3RBLmdldFgoKSAtIHJlY3RCLmdldFgoKSwgcmVjdEIuZ2V0UmlnaHQoKSAtIHJlY3RBLmdldFJpZ2h0KCkpO1xuICB9XG4gIGlmIChyZWN0QS5nZXRZKCkgPD0gcmVjdEIuZ2V0WSgpICYmIHJlY3RBLmdldEJvdHRvbSgpID49IHJlY3RCLmdldEJvdHRvbSgpKSB7XG4gICAgLyogQ2FzZSB5LjE6XG4gICAgICogICAgICAgICAgX19fX19fX18gcmVjdEFcbiAgICAgKiAgICAgICAgIHxcbiAgICAgKiAgICAgICAgIHxcbiAgICAgKiAgIF9fX19fX3xfX19fICByZWN0QlxuICAgICAqICAgICAgICAgfCAgICB8XG4gICAgICogICAgICAgICB8ICAgIHxcbiAgICAgKiAgIF9fX19fX3xfX19ffFxuICAgICAqICAgICAgICAgfFxuICAgICAqICAgICAgICAgfFxuICAgICAqICAgICAgICAgfF9fX19fX19fXG4gICAgICpcbiAgICAgKi9cbiAgICBvdmVybGFwQW1vdW50WzFdICs9IE1hdGgubWluKHJlY3RCLmdldFkoKSAtIHJlY3RBLmdldFkoKSwgcmVjdEEuZ2V0Qm90dG9tKCkgLSByZWN0Qi5nZXRCb3R0b20oKSk7XG4gIH0gZWxzZSBpZiAocmVjdEIuZ2V0WSgpIDw9IHJlY3RBLmdldFkoKSAmJiByZWN0Qi5nZXRCb3R0b20oKSA+PSByZWN0QS5nZXRCb3R0b20oKSkge1xuICAgIC8qIENhc2UgeS4yOlxuICAgICogICAgICAgICAgX19fX19fX18gcmVjdEJcbiAgICAqICAgICAgICAgfFxuICAgICogICAgICAgICB8XG4gICAgKiAgIF9fX19fX3xfX19fICByZWN0QVxuICAgICogICAgICAgICB8ICAgIHxcbiAgICAqICAgICAgICAgfCAgICB8XG4gICAgKiAgIF9fX19fX3xfX19ffFxuICAgICogICAgICAgICB8XG4gICAgKiAgICAgICAgIHxcbiAgICAqICAgICAgICAgfF9fX19fX19fXG4gICAgKlxuICAgICovXG4gICAgb3ZlcmxhcEFtb3VudFsxXSArPSBNYXRoLm1pbihyZWN0QS5nZXRZKCkgLSByZWN0Qi5nZXRZKCksIHJlY3RCLmdldEJvdHRvbSgpIC0gcmVjdEEuZ2V0Qm90dG9tKCkpO1xuICB9XG5cbiAgLy8gZmluZCBzbG9wZSBvZiB0aGUgbGluZSBwYXNzZXMgdHdvIGNlbnRlcnNcbiAgdmFyIHNsb3BlID0gTWF0aC5hYnMoKHJlY3RCLmdldENlbnRlclkoKSAtIHJlY3RBLmdldENlbnRlclkoKSkgLyAocmVjdEIuZ2V0Q2VudGVyWCgpIC0gcmVjdEEuZ2V0Q2VudGVyWCgpKSk7XG4gIC8vIGlmIGNlbnRlcnMgYXJlIG92ZXJsYXBwZWRcbiAgaWYgKHJlY3RCLmdldENlbnRlclkoKSA9PT0gcmVjdEEuZ2V0Q2VudGVyWSgpICYmIHJlY3RCLmdldENlbnRlclgoKSA9PT0gcmVjdEEuZ2V0Q2VudGVyWCgpKSB7XG4gICAgLy8gYXNzdW1lIHRoZSBzbG9wZSBpcyAxICg0NSBkZWdyZWUpXG4gICAgc2xvcGUgPSAxLjA7XG4gIH1cblxuICB2YXIgbW92ZUJ5WSA9IHNsb3BlICogb3ZlcmxhcEFtb3VudFswXTtcbiAgdmFyIG1vdmVCeVggPSBvdmVybGFwQW1vdW50WzFdIC8gc2xvcGU7XG4gIGlmIChvdmVybGFwQW1vdW50WzBdIDwgbW92ZUJ5WCkge1xuICAgIG1vdmVCeVggPSBvdmVybGFwQW1vdW50WzBdO1xuICB9IGVsc2Uge1xuICAgIG1vdmVCeVkgPSBvdmVybGFwQW1vdW50WzFdO1xuICB9XG4gIC8vIHJldHVybiBoYWxmIHRoZSBhbW91bnQgc28gdGhhdCBpZiBlYWNoIHJlY3RhbmdsZSBpcyBtb3ZlZCBieSB0aGVzZVxuICAvLyBhbW91bnRzIGluIG9wcG9zaXRlIGRpcmVjdGlvbnMsIG92ZXJsYXAgd2lsbCBiZSByZXNvbHZlZFxuICBvdmVybGFwQW1vdW50WzBdID0gLTEgKiBkaXJlY3Rpb25zWzBdICogKG1vdmVCeVggLyAyICsgc2VwYXJhdGlvbkJ1ZmZlcik7XG4gIG92ZXJsYXBBbW91bnRbMV0gPSAtMSAqIGRpcmVjdGlvbnNbMV0gKiAobW92ZUJ5WSAvIDIgKyBzZXBhcmF0aW9uQnVmZmVyKTtcbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgZGVjaWRlcyB0aGUgc2VwYXJhdGlvbiBkaXJlY3Rpb24gb2Ygb3ZlcmxhcHBpbmcgbm9kZXNcbiAqXG4gKiBpZiBkaXJlY3Rpb25zWzBdID0gLTEsIHRoZW4gcmVjdEEgZ29lcyBsZWZ0XG4gKiBpZiBkaXJlY3Rpb25zWzBdID0gMSwgIHRoZW4gcmVjdEEgZ29lcyByaWdodFxuICogaWYgZGlyZWN0aW9uc1sxXSA9IC0xLCB0aGVuIHJlY3RBIGdvZXMgdXBcbiAqIGlmIGRpcmVjdGlvbnNbMV0gPSAxLCAgdGhlbiByZWN0QSBnb2VzIGRvd25cbiAqL1xuSUdlb21ldHJ5LmRlY2lkZURpcmVjdGlvbnNGb3JPdmVybGFwcGluZ05vZGVzID0gZnVuY3Rpb24gKHJlY3RBLCByZWN0QiwgZGlyZWN0aW9ucykge1xuICBpZiAocmVjdEEuZ2V0Q2VudGVyWCgpIDwgcmVjdEIuZ2V0Q2VudGVyWCgpKSB7XG4gICAgZGlyZWN0aW9uc1swXSA9IC0xO1xuICB9IGVsc2Uge1xuICAgIGRpcmVjdGlvbnNbMF0gPSAxO1xuICB9XG5cbiAgaWYgKHJlY3RBLmdldENlbnRlclkoKSA8IHJlY3RCLmdldENlbnRlclkoKSkge1xuICAgIGRpcmVjdGlvbnNbMV0gPSAtMTtcbiAgfSBlbHNlIHtcbiAgICBkaXJlY3Rpb25zWzFdID0gMTtcbiAgfVxufTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjYWxjdWxhdGVzIHRoZSBpbnRlcnNlY3Rpb24gKGNsaXBwaW5nKSBwb2ludHMgb2YgdGhlIHR3b1xuICogaW5wdXQgcmVjdGFuZ2xlcyB3aXRoIGxpbmUgc2VnbWVudCBkZWZpbmVkIGJ5IHRoZSBjZW50ZXJzIG9mIHRoZXNlIHR3b1xuICogcmVjdGFuZ2xlcy4gVGhlIGNsaXBwaW5nIHBvaW50cyBhcmUgc2F2ZWQgaW4gdGhlIGlucHV0IGRvdWJsZSBhcnJheSBhbmRcbiAqIHdoZXRoZXIgb3Igbm90IHRoZSB0d28gcmVjdGFuZ2xlcyBvdmVybGFwIGlzIHJldHVybmVkLlxuICovXG5JR2VvbWV0cnkuZ2V0SW50ZXJzZWN0aW9uMiA9IGZ1bmN0aW9uIChyZWN0QSwgcmVjdEIsIHJlc3VsdCkge1xuICAvL3Jlc3VsdFswLTFdIHdpbGwgY29udGFpbiBjbGlwUG9pbnQgb2YgcmVjdEEsIHJlc3VsdFsyLTNdIHdpbGwgY29udGFpbiBjbGlwUG9pbnQgb2YgcmVjdEJcbiAgdmFyIHAxeCA9IHJlY3RBLmdldENlbnRlclgoKTtcbiAgdmFyIHAxeSA9IHJlY3RBLmdldENlbnRlclkoKTtcbiAgdmFyIHAyeCA9IHJlY3RCLmdldENlbnRlclgoKTtcbiAgdmFyIHAyeSA9IHJlY3RCLmdldENlbnRlclkoKTtcblxuICAvL2lmIHR3byByZWN0YW5nbGVzIGludGVyc2VjdCwgdGhlbiBjbGlwcGluZyBwb2ludHMgYXJlIGNlbnRlcnNcbiAgaWYgKHJlY3RBLmludGVyc2VjdHMocmVjdEIpKSB7XG4gICAgcmVzdWx0WzBdID0gcDF4O1xuICAgIHJlc3VsdFsxXSA9IHAxeTtcbiAgICByZXN1bHRbMl0gPSBwMng7XG4gICAgcmVzdWx0WzNdID0gcDJ5O1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vdmFyaWFibGVzIGZvciByZWN0QVxuICB2YXIgdG9wTGVmdEF4ID0gcmVjdEEuZ2V0WCgpO1xuICB2YXIgdG9wTGVmdEF5ID0gcmVjdEEuZ2V0WSgpO1xuICB2YXIgdG9wUmlnaHRBeCA9IHJlY3RBLmdldFJpZ2h0KCk7XG4gIHZhciBib3R0b21MZWZ0QXggPSByZWN0QS5nZXRYKCk7XG4gIHZhciBib3R0b21MZWZ0QXkgPSByZWN0QS5nZXRCb3R0b20oKTtcbiAgdmFyIGJvdHRvbVJpZ2h0QXggPSByZWN0QS5nZXRSaWdodCgpO1xuICB2YXIgaGFsZldpZHRoQSA9IHJlY3RBLmdldFdpZHRoSGFsZigpO1xuICB2YXIgaGFsZkhlaWdodEEgPSByZWN0QS5nZXRIZWlnaHRIYWxmKCk7XG4gIC8vdmFyaWFibGVzIGZvciByZWN0QlxuICB2YXIgdG9wTGVmdEJ4ID0gcmVjdEIuZ2V0WCgpO1xuICB2YXIgdG9wTGVmdEJ5ID0gcmVjdEIuZ2V0WSgpO1xuICB2YXIgdG9wUmlnaHRCeCA9IHJlY3RCLmdldFJpZ2h0KCk7XG4gIHZhciBib3R0b21MZWZ0QnggPSByZWN0Qi5nZXRYKCk7XG4gIHZhciBib3R0b21MZWZ0QnkgPSByZWN0Qi5nZXRCb3R0b20oKTtcbiAgdmFyIGJvdHRvbVJpZ2h0QnggPSByZWN0Qi5nZXRSaWdodCgpO1xuICB2YXIgaGFsZldpZHRoQiA9IHJlY3RCLmdldFdpZHRoSGFsZigpO1xuICB2YXIgaGFsZkhlaWdodEIgPSByZWN0Qi5nZXRIZWlnaHRIYWxmKCk7XG5cbiAgLy9mbGFnIHdoZXRoZXIgY2xpcHBpbmcgcG9pbnRzIGFyZSBmb3VuZFxuICB2YXIgY2xpcFBvaW50QUZvdW5kID0gZmFsc2U7XG4gIHZhciBjbGlwUG9pbnRCRm91bmQgPSBmYWxzZTtcblxuICAvLyBsaW5lIGlzIHZlcnRpY2FsXG4gIGlmIChwMXggPT09IHAyeCkge1xuICAgIGlmIChwMXkgPiBwMnkpIHtcbiAgICAgIHJlc3VsdFswXSA9IHAxeDtcbiAgICAgIHJlc3VsdFsxXSA9IHRvcExlZnRBeTtcbiAgICAgIHJlc3VsdFsyXSA9IHAyeDtcbiAgICAgIHJlc3VsdFszXSA9IGJvdHRvbUxlZnRCeTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHAxeSA8IHAyeSkge1xuICAgICAgcmVzdWx0WzBdID0gcDF4O1xuICAgICAgcmVzdWx0WzFdID0gYm90dG9tTGVmdEF5O1xuICAgICAgcmVzdWx0WzJdID0gcDJ4O1xuICAgICAgcmVzdWx0WzNdID0gdG9wTGVmdEJ5O1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL25vdCBsaW5lLCByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgLy8gbGluZSBpcyBob3Jpem9udGFsXG4gIGVsc2UgaWYgKHAxeSA9PT0gcDJ5KSB7XG4gICAgICBpZiAocDF4ID4gcDJ4KSB7XG4gICAgICAgIHJlc3VsdFswXSA9IHRvcExlZnRBeDtcbiAgICAgICAgcmVzdWx0WzFdID0gcDF5O1xuICAgICAgICByZXN1bHRbMl0gPSB0b3BSaWdodEJ4O1xuICAgICAgICByZXN1bHRbM10gPSBwMnk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAocDF4IDwgcDJ4KSB7XG4gICAgICAgIHJlc3VsdFswXSA9IHRvcFJpZ2h0QXg7XG4gICAgICAgIHJlc3VsdFsxXSA9IHAxeTtcbiAgICAgICAgcmVzdWx0WzJdID0gdG9wTGVmdEJ4O1xuICAgICAgICByZXN1bHRbM10gPSBwMnk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vbm90IHZhbGlkIGxpbmUsIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvL3Nsb3BlcyBvZiByZWN0QSdzIGFuZCByZWN0QidzIGRpYWdvbmFsc1xuICAgICAgdmFyIHNsb3BlQSA9IHJlY3RBLmhlaWdodCAvIHJlY3RBLndpZHRoO1xuICAgICAgdmFyIHNsb3BlQiA9IHJlY3RCLmhlaWdodCAvIHJlY3RCLndpZHRoO1xuXG4gICAgICAvL3Nsb3BlIG9mIGxpbmUgYmV0d2VlbiBjZW50ZXIgb2YgcmVjdEEgYW5kIGNlbnRlciBvZiByZWN0QlxuICAgICAgdmFyIHNsb3BlUHJpbWUgPSAocDJ5IC0gcDF5KSAvIChwMnggLSBwMXgpO1xuICAgICAgdmFyIGNhcmRpbmFsRGlyZWN0aW9uQSA9IHZvaWQgMDtcbiAgICAgIHZhciBjYXJkaW5hbERpcmVjdGlvbkIgPSB2b2lkIDA7XG4gICAgICB2YXIgdGVtcFBvaW50QXggPSB2b2lkIDA7XG4gICAgICB2YXIgdGVtcFBvaW50QXkgPSB2b2lkIDA7XG4gICAgICB2YXIgdGVtcFBvaW50QnggPSB2b2lkIDA7XG4gICAgICB2YXIgdGVtcFBvaW50QnkgPSB2b2lkIDA7XG5cbiAgICAgIC8vZGV0ZXJtaW5lIHdoZXRoZXIgY2xpcHBpbmcgcG9pbnQgaXMgdGhlIGNvcm5lciBvZiBub2RlQVxuICAgICAgaWYgKC1zbG9wZUEgPT09IHNsb3BlUHJpbWUpIHtcbiAgICAgICAgaWYgKHAxeCA+IHAyeCkge1xuICAgICAgICAgIHJlc3VsdFswXSA9IGJvdHRvbUxlZnRBeDtcbiAgICAgICAgICByZXN1bHRbMV0gPSBib3R0b21MZWZ0QXk7XG4gICAgICAgICAgY2xpcFBvaW50QUZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRbMF0gPSB0b3BSaWdodEF4O1xuICAgICAgICAgIHJlc3VsdFsxXSA9IHRvcExlZnRBeTtcbiAgICAgICAgICBjbGlwUG9pbnRBRm91bmQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNsb3BlQSA9PT0gc2xvcGVQcmltZSkge1xuICAgICAgICBpZiAocDF4ID4gcDJ4KSB7XG4gICAgICAgICAgcmVzdWx0WzBdID0gdG9wTGVmdEF4O1xuICAgICAgICAgIHJlc3VsdFsxXSA9IHRvcExlZnRBeTtcbiAgICAgICAgICBjbGlwUG9pbnRBRm91bmQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdFswXSA9IGJvdHRvbVJpZ2h0QXg7XG4gICAgICAgICAgcmVzdWx0WzFdID0gYm90dG9tTGVmdEF5O1xuICAgICAgICAgIGNsaXBQb2ludEFGb3VuZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy9kZXRlcm1pbmUgd2hldGhlciBjbGlwcGluZyBwb2ludCBpcyB0aGUgY29ybmVyIG9mIG5vZGVCXG4gICAgICBpZiAoLXNsb3BlQiA9PT0gc2xvcGVQcmltZSkge1xuICAgICAgICBpZiAocDJ4ID4gcDF4KSB7XG4gICAgICAgICAgcmVzdWx0WzJdID0gYm90dG9tTGVmdEJ4O1xuICAgICAgICAgIHJlc3VsdFszXSA9IGJvdHRvbUxlZnRCeTtcbiAgICAgICAgICBjbGlwUG9pbnRCRm91bmQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdFsyXSA9IHRvcFJpZ2h0Qng7XG4gICAgICAgICAgcmVzdWx0WzNdID0gdG9wTGVmdEJ5O1xuICAgICAgICAgIGNsaXBQb2ludEJGb3VuZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2xvcGVCID09PSBzbG9wZVByaW1lKSB7XG4gICAgICAgIGlmIChwMnggPiBwMXgpIHtcbiAgICAgICAgICByZXN1bHRbMl0gPSB0b3BMZWZ0Qng7XG4gICAgICAgICAgcmVzdWx0WzNdID0gdG9wTGVmdEJ5O1xuICAgICAgICAgIGNsaXBQb2ludEJGb3VuZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0WzJdID0gYm90dG9tUmlnaHRCeDtcbiAgICAgICAgICByZXN1bHRbM10gPSBib3R0b21MZWZ0Qnk7XG4gICAgICAgICAgY2xpcFBvaW50QkZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvL2lmIGJvdGggY2xpcHBpbmcgcG9pbnRzIGFyZSBjb3JuZXJzXG4gICAgICBpZiAoY2xpcFBvaW50QUZvdW5kICYmIGNsaXBQb2ludEJGb3VuZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vZGV0ZXJtaW5lIENhcmRpbmFsIERpcmVjdGlvbiBvZiByZWN0YW5nbGVzXG4gICAgICBpZiAocDF4ID4gcDJ4KSB7XG4gICAgICAgIGlmIChwMXkgPiBwMnkpIHtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkEgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKHNsb3BlQSwgc2xvcGVQcmltZSwgNCk7XG4gICAgICAgICAgY2FyZGluYWxEaXJlY3Rpb25CID0gdGhpcy5nZXRDYXJkaW5hbERpcmVjdGlvbihzbG9wZUIsIHNsb3BlUHJpbWUsIDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhcmRpbmFsRGlyZWN0aW9uQSA9IHRoaXMuZ2V0Q2FyZGluYWxEaXJlY3Rpb24oLXNsb3BlQSwgc2xvcGVQcmltZSwgMyk7XG4gICAgICAgICAgY2FyZGluYWxEaXJlY3Rpb25CID0gdGhpcy5nZXRDYXJkaW5hbERpcmVjdGlvbigtc2xvcGVCLCBzbG9wZVByaW1lLCAxKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHAxeSA+IHAyeSkge1xuICAgICAgICAgIGNhcmRpbmFsRGlyZWN0aW9uQSA9IHRoaXMuZ2V0Q2FyZGluYWxEaXJlY3Rpb24oLXNsb3BlQSwgc2xvcGVQcmltZSwgMSk7XG4gICAgICAgICAgY2FyZGluYWxEaXJlY3Rpb25CID0gdGhpcy5nZXRDYXJkaW5hbERpcmVjdGlvbigtc2xvcGVCLCBzbG9wZVByaW1lLCAzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkEgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKHNsb3BlQSwgc2xvcGVQcmltZSwgMik7XG4gICAgICAgICAgY2FyZGluYWxEaXJlY3Rpb25CID0gdGhpcy5nZXRDYXJkaW5hbERpcmVjdGlvbihzbG9wZUIsIHNsb3BlUHJpbWUsIDQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvL2NhbGN1bGF0ZSBjbGlwcGluZyBQb2ludCBpZiBpdCBpcyBub3QgZm91bmQgYmVmb3JlXG4gICAgICBpZiAoIWNsaXBQb2ludEFGb3VuZCkge1xuICAgICAgICBzd2l0Y2ggKGNhcmRpbmFsRGlyZWN0aW9uQSkge1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHRlbXBQb2ludEF5ID0gdG9wTGVmdEF5O1xuICAgICAgICAgICAgdGVtcFBvaW50QXggPSBwMXggKyAtaGFsZkhlaWdodEEgLyBzbG9wZVByaW1lO1xuICAgICAgICAgICAgcmVzdWx0WzBdID0gdGVtcFBvaW50QXg7XG4gICAgICAgICAgICByZXN1bHRbMV0gPSB0ZW1wUG9pbnRBeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHRlbXBQb2ludEF4ID0gYm90dG9tUmlnaHRBeDtcbiAgICAgICAgICAgIHRlbXBQb2ludEF5ID0gcDF5ICsgaGFsZldpZHRoQSAqIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMF0gPSB0ZW1wUG9pbnRBeDtcbiAgICAgICAgICAgIHJlc3VsdFsxXSA9IHRlbXBQb2ludEF5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgdGVtcFBvaW50QXkgPSBib3R0b21MZWZ0QXk7XG4gICAgICAgICAgICB0ZW1wUG9pbnRBeCA9IHAxeCArIGhhbGZIZWlnaHRBIC8gc2xvcGVQcmltZTtcbiAgICAgICAgICAgIHJlc3VsdFswXSA9IHRlbXBQb2ludEF4O1xuICAgICAgICAgICAgcmVzdWx0WzFdID0gdGVtcFBvaW50QXk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICB0ZW1wUG9pbnRBeCA9IGJvdHRvbUxlZnRBeDtcbiAgICAgICAgICAgIHRlbXBQb2ludEF5ID0gcDF5ICsgLWhhbGZXaWR0aEEgKiBzbG9wZVByaW1lO1xuICAgICAgICAgICAgcmVzdWx0WzBdID0gdGVtcFBvaW50QXg7XG4gICAgICAgICAgICByZXN1bHRbMV0gPSB0ZW1wUG9pbnRBeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWNsaXBQb2ludEJGb3VuZCkge1xuICAgICAgICBzd2l0Y2ggKGNhcmRpbmFsRGlyZWN0aW9uQikge1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHRlbXBQb2ludEJ5ID0gdG9wTGVmdEJ5O1xuICAgICAgICAgICAgdGVtcFBvaW50QnggPSBwMnggKyAtaGFsZkhlaWdodEIgLyBzbG9wZVByaW1lO1xuICAgICAgICAgICAgcmVzdWx0WzJdID0gdGVtcFBvaW50Qng7XG4gICAgICAgICAgICByZXN1bHRbM10gPSB0ZW1wUG9pbnRCeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHRlbXBQb2ludEJ4ID0gYm90dG9tUmlnaHRCeDtcbiAgICAgICAgICAgIHRlbXBQb2ludEJ5ID0gcDJ5ICsgaGFsZldpZHRoQiAqIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMl0gPSB0ZW1wUG9pbnRCeDtcbiAgICAgICAgICAgIHJlc3VsdFszXSA9IHRlbXBQb2ludEJ5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgdGVtcFBvaW50QnkgPSBib3R0b21MZWZ0Qnk7XG4gICAgICAgICAgICB0ZW1wUG9pbnRCeCA9IHAyeCArIGhhbGZIZWlnaHRCIC8gc2xvcGVQcmltZTtcbiAgICAgICAgICAgIHJlc3VsdFsyXSA9IHRlbXBQb2ludEJ4O1xuICAgICAgICAgICAgcmVzdWx0WzNdID0gdGVtcFBvaW50Qnk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICB0ZW1wUG9pbnRCeCA9IGJvdHRvbUxlZnRCeDtcbiAgICAgICAgICAgIHRlbXBQb2ludEJ5ID0gcDJ5ICsgLWhhbGZXaWR0aEIgKiBzbG9wZVByaW1lO1xuICAgICAgICAgICAgcmVzdWx0WzJdID0gdGVtcFBvaW50Qng7XG4gICAgICAgICAgICByZXN1bHRbM10gPSB0ZW1wUG9pbnRCeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgaW4gd2hpY2ggY2FyZGluYWwgZGlyZWN0aW9uIGRvZXMgaW5wdXQgcG9pbnQgc3RheXNcbiAqIDE6IE5vcnRoXG4gKiAyOiBFYXN0XG4gKiAzOiBTb3V0aFxuICogNDogV2VzdFxuICovXG5JR2VvbWV0cnkuZ2V0Q2FyZGluYWxEaXJlY3Rpb24gPSBmdW5jdGlvbiAoc2xvcGUsIHNsb3BlUHJpbWUsIGxpbmUpIHtcbiAgaWYgKHNsb3BlID4gc2xvcGVQcmltZSkge1xuICAgIHJldHVybiBsaW5lO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAxICsgbGluZSAlIDQ7XG4gIH1cbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2FsY3VsYXRlcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gbGluZXMgZGVmaW5lZCBieVxuICogcG9pbnQgcGFpcnMgKHMxLHMyKSBhbmQgKGYxLGYyKS5cbiAqL1xuSUdlb21ldHJ5LmdldEludGVyc2VjdGlvbiA9IGZ1bmN0aW9uIChzMSwgczIsIGYxLCBmMikge1xuICBpZiAoZjIgPT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLmdldEludGVyc2VjdGlvbjIoczEsIHMyLCBmMSk7XG4gIH1cblxuICB2YXIgeDEgPSBzMS54O1xuICB2YXIgeTEgPSBzMS55O1xuICB2YXIgeDIgPSBzMi54O1xuICB2YXIgeTIgPSBzMi55O1xuICB2YXIgeDMgPSBmMS54O1xuICB2YXIgeTMgPSBmMS55O1xuICB2YXIgeDQgPSBmMi54O1xuICB2YXIgeTQgPSBmMi55O1xuICB2YXIgeCA9IHZvaWQgMCxcbiAgICAgIHkgPSB2b2lkIDA7IC8vIGludGVyc2VjdGlvbiBwb2ludFxuICB2YXIgYTEgPSB2b2lkIDAsXG4gICAgICBhMiA9IHZvaWQgMCxcbiAgICAgIGIxID0gdm9pZCAwLFxuICAgICAgYjIgPSB2b2lkIDAsXG4gICAgICBjMSA9IHZvaWQgMCxcbiAgICAgIGMyID0gdm9pZCAwOyAvLyBjb2VmZmljaWVudHMgb2YgbGluZSBlcW5zLlxuICB2YXIgZGVub20gPSB2b2lkIDA7XG5cbiAgYTEgPSB5MiAtIHkxO1xuICBiMSA9IHgxIC0geDI7XG4gIGMxID0geDIgKiB5MSAtIHgxICogeTI7IC8vIHsgYTEqeCArIGIxKnkgKyBjMSA9IDAgaXMgbGluZSAxIH1cblxuICBhMiA9IHk0IC0geTM7XG4gIGIyID0geDMgLSB4NDtcbiAgYzIgPSB4NCAqIHkzIC0geDMgKiB5NDsgLy8geyBhMip4ICsgYjIqeSArIGMyID0gMCBpcyBsaW5lIDIgfVxuXG4gIGRlbm9tID0gYTEgKiBiMiAtIGEyICogYjE7XG5cbiAgaWYgKGRlbm9tID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB4ID0gKGIxICogYzIgLSBiMiAqIGMxKSAvIGRlbm9tO1xuICB5ID0gKGEyICogYzEgLSBhMSAqIGMyKSAvIGRlbm9tO1xuXG4gIHJldHVybiBuZXcgUG9pbnQoeCwgeSk7XG59O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGZpbmRzIGFuZCByZXR1cm5zIHRoZSBhbmdsZSBvZiB0aGUgdmVjdG9yIGZyb20gdGhlICsgeC1heGlzXG4gKiBpbiBjbG9ja3dpc2UgZGlyZWN0aW9uIChjb21wYXRpYmxlIHcvIEphdmEgY29vcmRpbmF0ZSBzeXN0ZW0hKS5cbiAqL1xuSUdlb21ldHJ5LmFuZ2xlT2ZWZWN0b3IgPSBmdW5jdGlvbiAoQ3gsIEN5LCBOeCwgTnkpIHtcbiAgdmFyIENfYW5nbGUgPSB2b2lkIDA7XG5cbiAgaWYgKEN4ICE9PSBOeCkge1xuICAgIENfYW5nbGUgPSBNYXRoLmF0YW4oKE55IC0gQ3kpIC8gKE54IC0gQ3gpKTtcblxuICAgIGlmIChOeCA8IEN4KSB7XG4gICAgICBDX2FuZ2xlICs9IE1hdGguUEk7XG4gICAgfSBlbHNlIGlmIChOeSA8IEN5KSB7XG4gICAgICBDX2FuZ2xlICs9IHRoaXMuVFdPX1BJO1xuICAgIH1cbiAgfSBlbHNlIGlmIChOeSA8IEN5KSB7XG4gICAgQ19hbmdsZSA9IHRoaXMuT05FX0FORF9IQUxGX1BJOyAvLyAyNzAgZGVncmVlc1xuICB9IGVsc2Uge1xuICAgIENfYW5nbGUgPSB0aGlzLkhBTEZfUEk7IC8vIDkwIGRlZ3JlZXNcbiAgfVxuXG4gIHJldHVybiBDX2FuZ2xlO1xufTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdHdvIGxpbmUgc2VnbWVudHMgKG9uZSB3aXRoIHBvaW50XG4gKiBwMSBhbmQgcDIsIHRoZSBvdGhlciB3aXRoIHBvaW50IHAzIGFuZCBwNCkgaW50ZXJzZWN0IGF0IGEgcG9pbnQgb3RoZXJcbiAqIHRoYW4gdGhlc2UgcG9pbnRzLlxuICovXG5JR2VvbWV0cnkuZG9JbnRlcnNlY3QgPSBmdW5jdGlvbiAocDEsIHAyLCBwMywgcDQpIHtcbiAgdmFyIGEgPSBwMS54O1xuICB2YXIgYiA9IHAxLnk7XG4gIHZhciBjID0gcDIueDtcbiAgdmFyIGQgPSBwMi55O1xuICB2YXIgcCA9IHAzLng7XG4gIHZhciBxID0gcDMueTtcbiAgdmFyIHIgPSBwNC54O1xuICB2YXIgcyA9IHA0Lnk7XG4gIHZhciBkZXQgPSAoYyAtIGEpICogKHMgLSBxKSAtIChyIC0gcCkgKiAoZCAtIGIpO1xuXG4gIGlmIChkZXQgPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxhbWJkYSA9ICgocyAtIHEpICogKHIgLSBhKSArIChwIC0gcikgKiAocyAtIGIpKSAvIGRldDtcbiAgICB2YXIgZ2FtbWEgPSAoKGIgLSBkKSAqIChyIC0gYSkgKyAoYyAtIGEpICogKHMgLSBiKSkgLyBkZXQ7XG4gICAgcmV0dXJuIDAgPCBsYW1iZGEgJiYgbGFtYmRhIDwgMSAmJiAwIDwgZ2FtbWEgJiYgZ2FtbWEgPCAxO1xuICB9XG59O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNoZWNrcyBhbmQgY2FsY3VsYXRlcyB0aGUgaW50ZXJzZWN0aW9uIG9mIFxuICogYSBsaW5lIHNlZ21lbnQgYW5kIGEgY2lyY2xlLlxuICovXG5JR2VvbWV0cnkuZmluZENpcmNsZUxpbmVJbnRlcnNlY3Rpb25zID0gZnVuY3Rpb24gKEV4LCBFeSwgTHgsIEx5LCBDeCwgQ3ksIHIpIHtcblxuICAvLyBFIGlzIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgcmF5LFxuICAvLyBMIGlzIHRoZSBlbmQgcG9pbnQgb2YgdGhlIHJheSxcbiAgLy8gQyBpcyB0aGUgY2VudGVyIG9mIHNwaGVyZSB5b3UncmUgdGVzdGluZyBhZ2FpbnN0XG4gIC8vIHIgaXMgdGhlIHJhZGl1cyBvZiB0aGF0IHNwaGVyZVxuXG4gIC8vIENvbXB1dGU6XG4gIC8vIGQgPSBMIC0gRSAoIERpcmVjdGlvbiB2ZWN0b3Igb2YgcmF5LCBmcm9tIHN0YXJ0IHRvIGVuZCApXG4gIC8vIGYgPSBFIC0gQyAoIFZlY3RvciBmcm9tIGNlbnRlciBzcGhlcmUgdG8gcmF5IHN0YXJ0IClcblxuICAvLyBUaGVuIHRoZSBpbnRlcnNlY3Rpb24gaXMgZm91bmQgYnkuLlxuICAvLyBQID0gRSArIHQgKiBkXG4gIC8vIFRoaXMgaXMgYSBwYXJhbWV0cmljIGVxdWF0aW9uOlxuICAvLyBQeCA9IEV4ICsgdGR4XG4gIC8vIFB5ID0gRXkgKyB0ZHlcblxuICAvLyBnZXQgYSwgYiwgYyB2YWx1ZXNcbiAgdmFyIGEgPSAoTHggLSBFeCkgKiAoTHggLSBFeCkgKyAoTHkgLSBFeSkgKiAoTHkgLSBFeSk7XG4gIHZhciBiID0gMiAqICgoRXggLSBDeCkgKiAoTHggLSBFeCkgKyAoRXkgLSBDeSkgKiAoTHkgLSBFeSkpO1xuICB2YXIgYyA9IChFeCAtIEN4KSAqIChFeCAtIEN4KSArIChFeSAtIEN5KSAqIChFeSAtIEN5KSAtIHIgKiByO1xuXG4gIC8vIGdldCBkaXNjcmltaW5hbnRcbiAgdmFyIGRpc2MgPSBiICogYiAtIDQgKiBhICogYztcbiAgaWYgKGRpc2MgPj0gMCkge1xuICAgIC8vIGluc2VydCBpbnRvIHF1YWRyYXRpYyBmb3JtdWxhXG4gICAgdmFyIHQxID0gKC1iICsgTWF0aC5zcXJ0KGIgKiBiIC0gNCAqIGEgKiBjKSkgLyAoMiAqIGEpO1xuICAgIHZhciB0MiA9ICgtYiAtIE1hdGguc3FydChiICogYiAtIDQgKiBhICogYykpIC8gKDIgKiBhKTtcbiAgICB2YXIgaW50ZXJzZWN0aW9ucyA9IG51bGw7XG4gICAgaWYgKHQxID49IDAgJiYgdDEgPD0gMSkge1xuICAgICAgLy8gdDEgaXMgdGhlIGludGVyc2VjdGlvbiwgYW5kIGl0J3MgY2xvc2VyIHRoYW4gdDJcbiAgICAgIC8vIChzaW5jZSB0MSB1c2VzIC1iIC0gZGlzY3JpbWluYW50KVxuICAgICAgLy8gSW1wYWxlLCBQb2tlXG4gICAgICByZXR1cm4gW3QxXTtcbiAgICB9XG5cbiAgICAvLyBoZXJlIHQxIGRpZG4ndCBpbnRlcnNlY3Qgc28gd2UgYXJlIGVpdGhlciBzdGFydGVkXG4gICAgLy8gaW5zaWRlIHRoZSBzcGhlcmUgb3IgY29tcGxldGVseSBwYXN0IGl0XG4gICAgaWYgKHQyID49IDAgJiYgdDIgPD0gMSkge1xuICAgICAgLy8gRXhpdFdvdW5kXG4gICAgICByZXR1cm4gW3QyXTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZXJzZWN0aW9ucztcbiAgfSBlbHNlIHJldHVybiBudWxsO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlY3Rpb246IENsYXNzIENvbnN0YW50c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8qKlxuICogU29tZSB1c2VmdWwgcHJlLWNhbGN1bGF0ZWQgY29uc3RhbnRzXG4gKi9cbklHZW9tZXRyeS5IQUxGX1BJID0gMC41ICogTWF0aC5QSTtcbklHZW9tZXRyeS5PTkVfQU5EX0hBTEZfUEkgPSAxLjUgKiBNYXRoLlBJO1xuSUdlb21ldHJ5LlRXT19QSSA9IDIuMCAqIE1hdGguUEk7XG5JR2VvbWV0cnkuVEhSRUVfUEkgPSAzLjAgKiBNYXRoLlBJO1xuXG5tb2R1bGUuZXhwb3J0cyA9IElHZW9tZXRyeTtcblxuLyoqKi8gfSksXG4vKiA5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIElNYXRoKCkge31cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBzaWduIG9mIHRoZSBpbnB1dCB2YWx1ZS5cbiAqL1xuSU1hdGguc2lnbiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICBpZiAodmFsdWUgPiAwKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSBpZiAodmFsdWUgPCAwKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAwO1xuICB9XG59O1xuXG5JTWF0aC5mbG9vciA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPCAwID8gTWF0aC5jZWlsKHZhbHVlKSA6IE1hdGguZmxvb3IodmFsdWUpO1xufTtcblxuSU1hdGguY2VpbCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPCAwID8gTWF0aC5mbG9vcih2YWx1ZSkgOiBNYXRoLmNlaWwodmFsdWUpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBJTWF0aDtcblxuLyoqKi8gfSksXG4vKiAxMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBJbnRlZ2VyKCkge31cblxuSW50ZWdlci5NQVhfVkFMVUUgPSAyMTQ3NDgzNjQ3O1xuSW50ZWdlci5NSU5fVkFMVUUgPSAtMjE0NzQ4MzY0ODtcblxubW9kdWxlLmV4cG9ydHMgPSBJbnRlZ2VyO1xuXG4vKioqLyB9KSxcbi8qIDExICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBub2RlRnJvbSA9IGZ1bmN0aW9uIG5vZGVGcm9tKHZhbHVlKSB7XG4gIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgbmV4dDogbnVsbCwgcHJldjogbnVsbCB9O1xufTtcblxudmFyIGFkZCA9IGZ1bmN0aW9uIGFkZChwcmV2LCBub2RlLCBuZXh0LCBsaXN0KSB7XG4gIGlmIChwcmV2ICE9PSBudWxsKSB7XG4gICAgcHJldi5uZXh0ID0gbm9kZTtcbiAgfSBlbHNlIHtcbiAgICBsaXN0LmhlYWQgPSBub2RlO1xuICB9XG5cbiAgaWYgKG5leHQgIT09IG51bGwpIHtcbiAgICBuZXh0LnByZXYgPSBub2RlO1xuICB9IGVsc2Uge1xuICAgIGxpc3QudGFpbCA9IG5vZGU7XG4gIH1cblxuICBub2RlLnByZXYgPSBwcmV2O1xuICBub2RlLm5leHQgPSBuZXh0O1xuXG4gIGxpc3QubGVuZ3RoKys7XG5cbiAgcmV0dXJuIG5vZGU7XG59O1xuXG52YXIgX3JlbW92ZSA9IGZ1bmN0aW9uIF9yZW1vdmUobm9kZSwgbGlzdCkge1xuICB2YXIgcHJldiA9IG5vZGUucHJldixcbiAgICAgIG5leHQgPSBub2RlLm5leHQ7XG5cblxuICBpZiAocHJldiAhPT0gbnVsbCkge1xuICAgIHByZXYubmV4dCA9IG5leHQ7XG4gIH0gZWxzZSB7XG4gICAgbGlzdC5oZWFkID0gbmV4dDtcbiAgfVxuXG4gIGlmIChuZXh0ICE9PSBudWxsKSB7XG4gICAgbmV4dC5wcmV2ID0gcHJldjtcbiAgfSBlbHNlIHtcbiAgICBsaXN0LnRhaWwgPSBwcmV2O1xuICB9XG5cbiAgbm9kZS5wcmV2ID0gbm9kZS5uZXh0ID0gbnVsbDtcblxuICBsaXN0Lmxlbmd0aC0tO1xuXG4gIHJldHVybiBub2RlO1xufTtcblxudmFyIExpbmtlZExpc3QgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIExpbmtlZExpc3QodmFscykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTGlua2VkTGlzdCk7XG5cbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5oZWFkID0gbnVsbDtcbiAgICB0aGlzLnRhaWwgPSBudWxsO1xuXG4gICAgaWYgKHZhbHMgIT0gbnVsbCkge1xuICAgICAgdmFscy5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5wdXNoKHYpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKExpbmtlZExpc3QsIFt7XG4gICAga2V5OiBcInNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2l6ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmxlbmd0aDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5zZXJ0QmVmb3JlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluc2VydEJlZm9yZSh2YWwsIG90aGVyTm9kZSkge1xuICAgICAgcmV0dXJuIGFkZChvdGhlck5vZGUucHJldiwgbm9kZUZyb20odmFsKSwgb3RoZXJOb2RlLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5zZXJ0QWZ0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5zZXJ0QWZ0ZXIodmFsLCBvdGhlck5vZGUpIHtcbiAgICAgIHJldHVybiBhZGQob3RoZXJOb2RlLCBub2RlRnJvbSh2YWwpLCBvdGhlck5vZGUubmV4dCwgdGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImluc2VydE5vZGVCZWZvcmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5zZXJ0Tm9kZUJlZm9yZShuZXdOb2RlLCBvdGhlck5vZGUpIHtcbiAgICAgIHJldHVybiBhZGQob3RoZXJOb2RlLnByZXYsIG5ld05vZGUsIG90aGVyTm9kZSwgdGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImluc2VydE5vZGVBZnRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnNlcnROb2RlQWZ0ZXIobmV3Tm9kZSwgb3RoZXJOb2RlKSB7XG4gICAgICByZXR1cm4gYWRkKG90aGVyTm9kZSwgbmV3Tm9kZSwgb3RoZXJOb2RlLm5leHQsIHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwdXNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHB1c2godmFsKSB7XG4gICAgICByZXR1cm4gYWRkKHRoaXMudGFpbCwgbm9kZUZyb20odmFsKSwgbnVsbCwgdGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVuc2hpZnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5zaGlmdCh2YWwpIHtcbiAgICAgIHJldHVybiBhZGQobnVsbCwgbm9kZUZyb20odmFsKSwgdGhpcy5oZWFkLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZShub2RlKSB7XG4gICAgICByZXR1cm4gX3JlbW92ZShub2RlLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicG9wXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBvcCgpIHtcbiAgICAgIHJldHVybiBfcmVtb3ZlKHRoaXMudGFpbCwgdGhpcykudmFsdWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBvcE5vZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcG9wTm9kZSgpIHtcbiAgICAgIHJldHVybiBfcmVtb3ZlKHRoaXMudGFpbCwgdGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNoaWZ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNoaWZ0KCkge1xuICAgICAgcmV0dXJuIF9yZW1vdmUodGhpcy5oZWFkLCB0aGlzKS52YWx1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hpZnROb2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNoaWZ0Tm9kZSgpIHtcbiAgICAgIHJldHVybiBfcmVtb3ZlKHRoaXMuaGVhZCwgdGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldF9vYmplY3RfYXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0X29iamVjdF9hdChpbmRleCkge1xuICAgICAgaWYgKGluZGV4IDw9IHRoaXMubGVuZ3RoKCkpIHtcbiAgICAgICAgdmFyIGkgPSAxO1xuICAgICAgICB2YXIgY3VycmVudCA9IHRoaXMuaGVhZDtcbiAgICAgICAgd2hpbGUgKGkgPCBpbmRleCkge1xuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjdXJyZW50LnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRfb2JqZWN0X2F0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldF9vYmplY3RfYXQoaW5kZXgsIHZhbHVlKSB7XG4gICAgICBpZiAoaW5kZXggPD0gdGhpcy5sZW5ndGgoKSkge1xuICAgICAgICB2YXIgaSA9IDE7XG4gICAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5oZWFkO1xuICAgICAgICB3aGlsZSAoaSA8IGluZGV4KSB7XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudC52YWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBMaW5rZWRMaXN0O1xufSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpbmtlZExpc3Q7XG5cbi8qKiovIH0pLFxuLyogMTIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLypcclxuICpUaGlzIGNsYXNzIGlzIHRoZSBqYXZhc2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBQb2ludC5qYXZhIGNsYXNzIGluIGpka1xyXG4gKi9cbmZ1bmN0aW9uIFBvaW50KHgsIHksIHApIHtcbiAgdGhpcy54ID0gbnVsbDtcbiAgdGhpcy55ID0gbnVsbDtcbiAgaWYgKHggPT0gbnVsbCAmJiB5ID09IG51bGwgJiYgcCA9PSBudWxsKSB7XG4gICAgdGhpcy54ID0gMDtcbiAgICB0aGlzLnkgPSAwO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB4ID09ICdudW1iZXInICYmIHR5cGVvZiB5ID09ICdudW1iZXInICYmIHAgPT0gbnVsbCkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgfSBlbHNlIGlmICh4LmNvbnN0cnVjdG9yLm5hbWUgPT0gJ1BvaW50JyAmJiB5ID09IG51bGwgJiYgcCA9PSBudWxsKSB7XG4gICAgcCA9IHg7XG4gICAgdGhpcy54ID0gcC54O1xuICAgIHRoaXMueSA9IHAueTtcbiAgfVxufVxuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMueDtcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRZID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy55O1xufTtcblxuUG9pbnQucHJvdG90eXBlLmdldExvY2F0aW9uID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IFBvaW50KHRoaXMueCwgdGhpcy55KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5zZXRMb2NhdGlvbiA9IGZ1bmN0aW9uICh4LCB5LCBwKSB7XG4gIGlmICh4LmNvbnN0cnVjdG9yLm5hbWUgPT0gJ1BvaW50JyAmJiB5ID09IG51bGwgJiYgcCA9PSBudWxsKSB7XG4gICAgcCA9IHg7XG4gICAgdGhpcy5zZXRMb2NhdGlvbihwLngsIHAueSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHggPT0gJ251bWJlcicgJiYgdHlwZW9mIHkgPT0gJ251bWJlcicgJiYgcCA9PSBudWxsKSB7XG4gICAgLy9pZiBib3RoIHBhcmFtZXRlcnMgYXJlIGludGVnZXIganVzdCBtb3ZlICh4LHkpIGxvY2F0aW9uXG4gICAgaWYgKHBhcnNlSW50KHgpID09IHggJiYgcGFyc2VJbnQoeSkgPT0geSkge1xuICAgICAgdGhpcy5tb3ZlKHgsIHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnggPSBNYXRoLmZsb29yKHggKyAwLjUpO1xuICAgICAgdGhpcy55ID0gTWF0aC5mbG9vcih5ICsgMC41KTtcbiAgICB9XG4gIH1cbn07XG5cblBvaW50LnByb3RvdHlwZS5tb3ZlID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgdGhpcy54ID0geDtcbiAgdGhpcy55ID0geTtcbn07XG5cblBvaW50LnByb3RvdHlwZS50cmFuc2xhdGUgPSBmdW5jdGlvbiAoZHgsIGR5KSB7XG4gIHRoaXMueCArPSBkeDtcbiAgdGhpcy55ICs9IGR5O1xufTtcblxuUG9pbnQucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgaWYgKG9iai5jb25zdHJ1Y3Rvci5uYW1lID09IFwiUG9pbnRcIikge1xuICAgIHZhciBwdCA9IG9iajtcbiAgICByZXR1cm4gdGhpcy54ID09IHB0LnggJiYgdGhpcy55ID09IHB0Lnk7XG4gIH1cbiAgcmV0dXJuIHRoaXMgPT0gb2JqO1xufTtcblxuUG9pbnQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IFBvaW50KCkuY29uc3RydWN0b3IubmFtZSArIFwiW3g9XCIgKyB0aGlzLnggKyBcIix5PVwiICsgdGhpcy55ICsgXCJdXCI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvaW50O1xuXG4vKioqLyB9KSxcbi8qIDEzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIFJlY3RhbmdsZUQoeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICB0aGlzLnggPSAwO1xuICB0aGlzLnkgPSAwO1xuICB0aGlzLndpZHRoID0gMDtcbiAgdGhpcy5oZWlnaHQgPSAwO1xuXG4gIGlmICh4ICE9IG51bGwgJiYgeSAhPSBudWxsICYmIHdpZHRoICE9IG51bGwgJiYgaGVpZ2h0ICE9IG51bGwpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICB9XG59XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLmdldFggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLng7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5zZXRYID0gZnVuY3Rpb24gKHgpIHtcbiAgdGhpcy54ID0geDtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLmdldFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnk7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5zZXRZID0gZnVuY3Rpb24gKHkpIHtcbiAgdGhpcy55ID0geTtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLmdldFdpZHRoID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53aWR0aDtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLnNldFdpZHRoID0gZnVuY3Rpb24gKHdpZHRoKSB7XG4gIHRoaXMud2lkdGggPSB3aWR0aDtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLmdldEhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuaGVpZ2h0O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuc2V0SGVpZ2h0ID0gZnVuY3Rpb24gKGhlaWdodCkge1xuICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLmdldFJpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy54ICsgdGhpcy53aWR0aDtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLmdldEJvdHRvbSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMueSArIHRoaXMuaGVpZ2h0O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuaW50ZXJzZWN0cyA9IGZ1bmN0aW9uIChhKSB7XG4gIGlmICh0aGlzLmdldFJpZ2h0KCkgPCBhLngpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodGhpcy5nZXRCb3R0b20oKSA8IGEueSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChhLmdldFJpZ2h0KCkgPCB0aGlzLngpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoYS5nZXRCb3R0b20oKSA8IHRoaXMueSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0Q2VudGVyWCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMueCArIHRoaXMud2lkdGggLyAyO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0TWluWCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0WCgpO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0TWF4WCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0WCgpICsgdGhpcy53aWR0aDtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLmdldENlbnRlclkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnkgKyB0aGlzLmhlaWdodCAvIDI7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRNaW5ZID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5nZXRZKCk7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRNYXhZID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5nZXRZKCkgKyB0aGlzLmhlaWdodDtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLmdldFdpZHRoSGFsZiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2lkdGggLyAyO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0SGVpZ2h0SGFsZiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuaGVpZ2h0IC8gMjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVjdGFuZ2xlRDtcblxuLyoqKi8gfSksXG4vKiAxNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbmZ1bmN0aW9uIFVuaXF1ZUlER2VuZXJldG9yKCkge31cblxuVW5pcXVlSURHZW5lcmV0b3IubGFzdElEID0gMDtcblxuVW5pcXVlSURHZW5lcmV0b3IuY3JlYXRlSUQgPSBmdW5jdGlvbiAob2JqKSB7XG4gIGlmIChVbmlxdWVJREdlbmVyZXRvci5pc1ByaW1pdGl2ZShvYmopKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICBpZiAob2JqLnVuaXF1ZUlEICE9IG51bGwpIHtcbiAgICByZXR1cm4gb2JqLnVuaXF1ZUlEO1xuICB9XG4gIG9iai51bmlxdWVJRCA9IFVuaXF1ZUlER2VuZXJldG9yLmdldFN0cmluZygpO1xuICBVbmlxdWVJREdlbmVyZXRvci5sYXN0SUQrKztcbiAgcmV0dXJuIG9iai51bmlxdWVJRDtcbn07XG5cblVuaXF1ZUlER2VuZXJldG9yLmdldFN0cmluZyA9IGZ1bmN0aW9uIChpZCkge1xuICBpZiAoaWQgPT0gbnVsbCkgaWQgPSBVbmlxdWVJREdlbmVyZXRvci5sYXN0SUQ7XG4gIHJldHVybiBcIk9iamVjdCNcIiArIGlkICsgXCJcIjtcbn07XG5cblVuaXF1ZUlER2VuZXJldG9yLmlzUHJpbWl0aXZlID0gZnVuY3Rpb24gKGFyZykge1xuICB2YXIgdHlwZSA9IHR5cGVvZiBhcmcgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihhcmcpO1xuICByZXR1cm4gYXJnID09IG51bGwgfHwgdHlwZSAhPSBcIm9iamVjdFwiICYmIHR5cGUgIT0gXCJmdW5jdGlvblwiO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBVbmlxdWVJREdlbmVyZXRvcjtcblxuLyoqKi8gfSksXG4vKiAxNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IGVsc2UgeyByZXR1cm4gQXJyYXkuZnJvbShhcnIpOyB9IH1cblxudmFyIExheW91dENvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG52YXIgTEdyYXBoTWFuYWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oNyk7XG52YXIgTE5vZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xudmFyIExFZGdlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcbnZhciBMR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xudmFyIFBvaW50RCA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG52YXIgVHJhbnNmb3JtID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNyk7XG52YXIgRW1pdHRlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpO1xuXG5mdW5jdGlvbiBMYXlvdXQoaXNSZW1vdGVVc2UpIHtcbiAgRW1pdHRlci5jYWxsKHRoaXMpO1xuXG4gIC8vTGF5b3V0IFF1YWxpdHk6IDA6ZHJhZnQsIDE6ZGVmYXVsdCwgMjpwcm9vZlxuICB0aGlzLmxheW91dFF1YWxpdHkgPSBMYXlvdXRDb25zdGFudHMuUVVBTElUWTtcbiAgLy9XaGV0aGVyIGxheW91dCBzaG91bGQgY3JlYXRlIGJlbmRwb2ludHMgYXMgbmVlZGVkIG9yIG5vdFxuICB0aGlzLmNyZWF0ZUJlbmRzQXNOZWVkZWQgPSBMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DUkVBVEVfQkVORFNfQVNfTkVFREVEO1xuICAvL1doZXRoZXIgbGF5b3V0IHNob3VsZCBiZSBpbmNyZW1lbnRhbCBvciBub3RcbiAgdGhpcy5pbmNyZW1lbnRhbCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMO1xuICAvL1doZXRoZXIgd2UgYW5pbWF0ZSBmcm9tIGJlZm9yZSB0byBhZnRlciBsYXlvdXQgbm9kZSBwb3NpdGlvbnNcbiAgdGhpcy5hbmltYXRpb25PbkxheW91dCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0FOSU1BVElPTl9PTl9MQVlPVVQ7XG4gIC8vV2hldGhlciB3ZSBhbmltYXRlIHRoZSBsYXlvdXQgcHJvY2VzcyBvciBub3RcbiAgdGhpcy5hbmltYXRpb25EdXJpbmdMYXlvdXQgPSBMYXlvdXRDb25zdGFudHMuREVGQVVMVF9BTklNQVRJT05fRFVSSU5HX0xBWU9VVDtcbiAgLy9OdW1iZXIgaXRlcmF0aW9ucyB0aGF0IHNob3VsZCBiZSBkb25lIGJldHdlZW4gdHdvIHN1Y2Nlc3NpdmUgYW5pbWF0aW9uc1xuICB0aGlzLmFuaW1hdGlvblBlcmlvZCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0FOSU1BVElPTl9QRVJJT0Q7XG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgb3Igbm90IGxlYWYgbm9kZXMgKG5vbi1jb21wb3VuZCBub2RlcykgYXJlIG9mIHVuaWZvcm0gc2l6ZXMuIFdoZW5cclxuICAgKiB0aGV5IGFyZSwgYm90aCBzcHJpbmcgYW5kIHJlcHVsc2lvbiBmb3JjZXMgYmV0d2VlbiB0d28gbGVhZiBub2RlcyBjYW4gYmVcclxuICAgKiBjYWxjdWxhdGVkIHdpdGhvdXQgdGhlIGV4cGVuc2l2ZSBjbGlwcGluZyBwb2ludCBjYWxjdWxhdGlvbnMsIHJlc3VsdGluZ1xyXG4gICAqIGluIG1ham9yIHNwZWVkLXVwLlxyXG4gICAqL1xuICB0aGlzLnVuaWZvcm1MZWFmTm9kZVNpemVzID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfVU5JRk9STV9MRUFGX05PREVfU0laRVM7XG4gIC8qKlxyXG4gICAqIFRoaXMgaXMgdXNlZCBmb3IgY3JlYXRpb24gb2YgYmVuZHBvaW50cyBieSB1c2luZyBkdW1teSBub2RlcyBhbmQgZWRnZXMuXHJcbiAgICogTWFwcyBhbiBMRWRnZSB0byBpdHMgZHVtbXkgYmVuZHBvaW50IHBhdGguXHJcbiAgICovXG4gIHRoaXMuZWRnZVRvRHVtbXlOb2RlcyA9IG5ldyBNYXAoKTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIgPSBuZXcgTEdyYXBoTWFuYWdlcih0aGlzKTtcbiAgdGhpcy5pc0xheW91dEZpbmlzaGVkID0gZmFsc2U7XG4gIHRoaXMuaXNTdWJMYXlvdXQgPSBmYWxzZTtcbiAgdGhpcy5pc1JlbW90ZVVzZSA9IGZhbHNlO1xuXG4gIGlmIChpc1JlbW90ZVVzZSAhPSBudWxsKSB7XG4gICAgdGhpcy5pc1JlbW90ZVVzZSA9IGlzUmVtb3RlVXNlO1xuICB9XG59XG5cbkxheW91dC5SQU5ET01fU0VFRCA9IDE7XG5cbkxheW91dC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVtaXR0ZXIucHJvdG90eXBlKTtcblxuTGF5b3V0LnByb3RvdHlwZS5nZXRHcmFwaE1hbmFnZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmdyYXBoTWFuYWdlcjtcbn07XG5cbkxheW91dC5wcm90b3R5cGUuZ2V0QWxsTm9kZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxOb2RlcygpO1xufTtcblxuTGF5b3V0LnByb3RvdHlwZS5nZXRBbGxFZGdlcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEFsbEVkZ2VzKCk7XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLmdldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24oKTtcbn07XG5cbkxheW91dC5wcm90b3R5cGUubmV3R3JhcGhNYW5hZ2VyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZ20gPSBuZXcgTEdyYXBoTWFuYWdlcih0aGlzKTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIgPSBnbTtcbiAgcmV0dXJuIGdtO1xufTtcblxuTGF5b3V0LnByb3RvdHlwZS5uZXdHcmFwaCA9IGZ1bmN0aW9uICh2R3JhcGgpIHtcbiAgcmV0dXJuIG5ldyBMR3JhcGgobnVsbCwgdGhpcy5ncmFwaE1hbmFnZXIsIHZHcmFwaCk7XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLm5ld05vZGUgPSBmdW5jdGlvbiAodk5vZGUpIHtcbiAgcmV0dXJuIG5ldyBMTm9kZSh0aGlzLmdyYXBoTWFuYWdlciwgdk5vZGUpO1xufTtcblxuTGF5b3V0LnByb3RvdHlwZS5uZXdFZGdlID0gZnVuY3Rpb24gKHZFZGdlKSB7XG4gIHJldHVybiBuZXcgTEVkZ2UobnVsbCwgbnVsbCwgdkVkZ2UpO1xufTtcblxuTGF5b3V0LnByb3RvdHlwZS5jaGVja0xheW91dFN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmdyYXBoTWFuYWdlci5nZXRSb290KCkgPT0gbnVsbCB8fCB0aGlzLmdyYXBoTWFuYWdlci5nZXRSb290KCkuZ2V0Tm9kZXMoKS5sZW5ndGggPT0gMCB8fCB0aGlzLmdyYXBoTWFuYWdlci5pbmNsdWRlc0ludmFsaWRFZGdlKCk7XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLnJ1bkxheW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5pc0xheW91dEZpbmlzaGVkID0gZmFsc2U7XG5cbiAgaWYgKHRoaXMudGlsaW5nUHJlTGF5b3V0KSB7XG4gICAgdGhpcy50aWxpbmdQcmVMYXlvdXQoKTtcbiAgfVxuXG4gIHRoaXMuaW5pdFBhcmFtZXRlcnMoKTtcbiAgdmFyIGlzTGF5b3V0U3VjY2Vzc2Z1bGw7XG5cbiAgaWYgKHRoaXMuY2hlY2tMYXlvdXRTdWNjZXNzKCkpIHtcbiAgICBpc0xheW91dFN1Y2Nlc3NmdWxsID0gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgaXNMYXlvdXRTdWNjZXNzZnVsbCA9IHRoaXMubGF5b3V0KCk7XG4gIH1cblxuICBpZiAoTGF5b3V0Q29uc3RhbnRzLkFOSU1BVEUgPT09ICdkdXJpbmcnKSB7XG4gICAgLy8gSWYgdGhpcyBpcyBhICdkdXJpbmcnIGxheW91dCBhbmltYXRpb24uIExheW91dCBpcyBub3QgZmluaXNoZWQgeWV0LiBcbiAgICAvLyBXZSBuZWVkIHRvIHBlcmZvcm0gdGhlc2UgaW4gaW5kZXguanMgd2hlbiBsYXlvdXQgaXMgcmVhbGx5IGZpbmlzaGVkLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChpc0xheW91dFN1Y2Nlc3NmdWxsKSB7XG4gICAgaWYgKCF0aGlzLmlzU3ViTGF5b3V0KSB7XG4gICAgICB0aGlzLmRvUG9zdExheW91dCgpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLnRpbGluZ1Bvc3RMYXlvdXQpIHtcbiAgICB0aGlzLnRpbGluZ1Bvc3RMYXlvdXQoKTtcbiAgfVxuXG4gIHRoaXMuaXNMYXlvdXRGaW5pc2hlZCA9IHRydWU7XG5cbiAgcmV0dXJuIGlzTGF5b3V0U3VjY2Vzc2Z1bGw7XG59O1xuXG4vKipcclxuICogVGhpcyBtZXRob2QgcGVyZm9ybXMgdGhlIG9wZXJhdGlvbnMgcmVxdWlyZWQgYWZ0ZXIgbGF5b3V0LlxyXG4gKi9cbkxheW91dC5wcm90b3R5cGUuZG9Qb3N0TGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICAvL2Fzc2VydCAhaXNTdWJMYXlvdXQgOiBcIlNob3VsZCBub3QgYmUgY2FsbGVkIG9uIHN1Yi1sYXlvdXQhXCI7XG4gIC8vIFByb3BhZ2F0ZSBnZW9tZXRyaWMgY2hhbmdlcyB0byB2LWxldmVsIG9iamVjdHNcbiAgaWYgKCF0aGlzLmluY3JlbWVudGFsKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0oKTtcbiAgfVxuICB0aGlzLnVwZGF0ZSgpO1xufTtcblxuLyoqXHJcbiAqIFRoaXMgbWV0aG9kIHVwZGF0ZXMgdGhlIGdlb21ldHJ5IG9mIHRoZSB0YXJnZXQgZ3JhcGggYWNjb3JkaW5nIHRvXHJcbiAqIGNhbGN1bGF0ZWQgbGF5b3V0LlxyXG4gKi9cbkxheW91dC5wcm90b3R5cGUudXBkYXRlMiA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gdXBkYXRlIGJlbmQgcG9pbnRzXG4gIGlmICh0aGlzLmNyZWF0ZUJlbmRzQXNOZWVkZWQpIHtcbiAgICB0aGlzLmNyZWF0ZUJlbmRwb2ludHNGcm9tRHVtbXlOb2RlcygpO1xuXG4gICAgLy8gcmVzZXQgYWxsIGVkZ2VzLCBzaW5jZSB0aGUgdG9wb2xvZ3kgaGFzIGNoYW5nZWRcbiAgICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbEVkZ2VzKCk7XG4gIH1cblxuICAvLyBwZXJmb3JtIGVkZ2UsIG5vZGUgYW5kIHJvb3QgdXBkYXRlcyBpZiBsYXlvdXQgaXMgbm90IGNhbGxlZFxuICAvLyByZW1vdGVseVxuICBpZiAoIXRoaXMuaXNSZW1vdGVVc2UpIHtcbiAgICAvLyB1cGRhdGUgYWxsIGVkZ2VzXG4gICAgdmFyIGVkZ2U7XG4gICAgdmFyIGFsbEVkZ2VzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsRWRnZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbEVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBlZGdlID0gYWxsRWRnZXNbaV07XG4gICAgICAvLyAgICAgIHRoaXMudXBkYXRlKGVkZ2UpO1xuICAgIH1cblxuICAgIC8vIHJlY3Vyc2l2ZWx5IHVwZGF0ZSBub2Rlc1xuICAgIHZhciBub2RlO1xuICAgIHZhciBub2RlcyA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKS5nZXROb2RlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIC8vICAgICAgdGhpcy51cGRhdGUobm9kZSk7XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIHJvb3QgZ3JhcGhcbiAgICB0aGlzLnVwZGF0ZSh0aGlzLmdyYXBoTWFuYWdlci5nZXRSb290KCkpO1xuICB9XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgdGhpcy51cGRhdGUyKCk7XG4gIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTE5vZGUpIHtcbiAgICB2YXIgbm9kZSA9IG9iajtcbiAgICBpZiAobm9kZS5nZXRDaGlsZCgpICE9IG51bGwpIHtcbiAgICAgIC8vIHNpbmNlIG5vZGUgaXMgY29tcG91bmQsIHJlY3Vyc2l2ZWx5IHVwZGF0ZSBjaGlsZCBub2Rlc1xuICAgICAgdmFyIG5vZGVzID0gbm9kZS5nZXRDaGlsZCgpLmdldE5vZGVzKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHVwZGF0ZShub2Rlc1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIGwtbGV2ZWwgbm9kZSBpcyBhc3NvY2lhdGVkIHdpdGggYSB2LWxldmVsIGdyYXBoIG9iamVjdCxcbiAgICAvLyB0aGVuIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgdi1sZXZlbCBub2RlIGltcGxlbWVudHMgdGhlXG4gICAgLy8gaW50ZXJmYWNlIFVwZGF0YWJsZS5cbiAgICBpZiAobm9kZS52R3JhcGhPYmplY3QgIT0gbnVsbCkge1xuICAgICAgLy8gY2FzdCB0byBVcGRhdGFibGUgd2l0aG91dCBhbnkgdHlwZSBjaGVja1xuICAgICAgdmFyIHZOb2RlID0gbm9kZS52R3JhcGhPYmplY3Q7XG5cbiAgICAgIC8vIGNhbGwgdGhlIHVwZGF0ZSBtZXRob2Qgb2YgdGhlIGludGVyZmFjZVxuICAgICAgdk5vZGUudXBkYXRlKG5vZGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBMRWRnZSkge1xuICAgIHZhciBlZGdlID0gb2JqO1xuICAgIC8vIGlmIHRoZSBsLWxldmVsIGVkZ2UgaXMgYXNzb2NpYXRlZCB3aXRoIGEgdi1sZXZlbCBncmFwaCBvYmplY3QsXG4gICAgLy8gdGhlbiBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHYtbGV2ZWwgZWRnZSBpbXBsZW1lbnRzIHRoZVxuICAgIC8vIGludGVyZmFjZSBVcGRhdGFibGUuXG5cbiAgICBpZiAoZWRnZS52R3JhcGhPYmplY3QgIT0gbnVsbCkge1xuICAgICAgLy8gY2FzdCB0byBVcGRhdGFibGUgd2l0aG91dCBhbnkgdHlwZSBjaGVja1xuICAgICAgdmFyIHZFZGdlID0gZWRnZS52R3JhcGhPYmplY3Q7XG5cbiAgICAgIC8vIGNhbGwgdGhlIHVwZGF0ZSBtZXRob2Qgb2YgdGhlIGludGVyZmFjZVxuICAgICAgdkVkZ2UudXBkYXRlKGVkZ2UpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBMR3JhcGgpIHtcbiAgICB2YXIgZ3JhcGggPSBvYmo7XG4gICAgLy8gaWYgdGhlIGwtbGV2ZWwgZ3JhcGggaXMgYXNzb2NpYXRlZCB3aXRoIGEgdi1sZXZlbCBncmFwaCBvYmplY3QsXG4gICAgLy8gdGhlbiBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHYtbGV2ZWwgb2JqZWN0IGltcGxlbWVudHMgdGhlXG4gICAgLy8gaW50ZXJmYWNlIFVwZGF0YWJsZS5cblxuICAgIGlmIChncmFwaC52R3JhcGhPYmplY3QgIT0gbnVsbCkge1xuICAgICAgLy8gY2FzdCB0byBVcGRhdGFibGUgd2l0aG91dCBhbnkgdHlwZSBjaGVja1xuICAgICAgdmFyIHZHcmFwaCA9IGdyYXBoLnZHcmFwaE9iamVjdDtcblxuICAgICAgLy8gY2FsbCB0aGUgdXBkYXRlIG1ldGhvZCBvZiB0aGUgaW50ZXJmYWNlXG4gICAgICB2R3JhcGgudXBkYXRlKGdyYXBoKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxyXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNldCBhbGwgbGF5b3V0IHBhcmFtZXRlcnMgdG8gZGVmYXVsdCB2YWx1ZXNcclxuICogZGV0ZXJtaW5lZCBhdCBjb21waWxlIHRpbWUuXHJcbiAqL1xuTGF5b3V0LnByb3RvdHlwZS5pbml0UGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLmlzU3ViTGF5b3V0KSB7XG4gICAgdGhpcy5sYXlvdXRRdWFsaXR5ID0gTGF5b3V0Q29uc3RhbnRzLlFVQUxJVFk7XG4gICAgdGhpcy5hbmltYXRpb25EdXJpbmdMYXlvdXQgPSBMYXlvdXRDb25zdGFudHMuREVGQVVMVF9BTklNQVRJT05fRFVSSU5HX0xBWU9VVDtcbiAgICB0aGlzLmFuaW1hdGlvblBlcmlvZCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0FOSU1BVElPTl9QRVJJT0Q7XG4gICAgdGhpcy5hbmltYXRpb25PbkxheW91dCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0FOSU1BVElPTl9PTl9MQVlPVVQ7XG4gICAgdGhpcy5pbmNyZW1lbnRhbCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMO1xuICAgIHRoaXMuY3JlYXRlQmVuZHNBc05lZWRlZCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0NSRUFURV9CRU5EU19BU19ORUVERUQ7XG4gICAgdGhpcy51bmlmb3JtTGVhZk5vZGVTaXplcyA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX1VOSUZPUk1fTEVBRl9OT0RFX1NJWkVTO1xuICB9XG5cbiAgaWYgKHRoaXMuYW5pbWF0aW9uRHVyaW5nTGF5b3V0KSB7XG4gICAgdGhpcy5hbmltYXRpb25PbkxheW91dCA9IGZhbHNlO1xuICB9XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uIChuZXdMZWZ0VG9wKSB7XG4gIGlmIChuZXdMZWZ0VG9wID09IHVuZGVmaW5lZCkge1xuICAgIHRoaXMudHJhbnNmb3JtKG5ldyBQb2ludEQoMCwgMCkpO1xuICB9IGVsc2Uge1xuICAgIC8vIGNyZWF0ZSBhIHRyYW5zZm9ybWF0aW9uIG9iamVjdCAoZnJvbSBFY2xpcHNlIHRvIGxheW91dCkuIFdoZW4gYW5cbiAgICAvLyBpbnZlcnNlIHRyYW5zZm9ybSBpcyBhcHBsaWVkLCB3ZSBnZXQgdXBwZXItbGVmdCBjb29yZGluYXRlIG9mIHRoZVxuICAgIC8vIGRyYXdpbmcgb3IgdGhlIHJvb3QgZ3JhcGggYXQgZ2l2ZW4gaW5wdXQgY29vcmRpbmF0ZSAoc29tZSBtYXJnaW5zXG4gICAgLy8gYWxyZWFkeSBpbmNsdWRlZCBpbiBjYWxjdWxhdGlvbiBvZiBsZWZ0LXRvcCkuXG5cbiAgICB2YXIgdHJhbnMgPSBuZXcgVHJhbnNmb3JtKCk7XG4gICAgdmFyIGxlZnRUb3AgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRSb290KCkudXBkYXRlTGVmdFRvcCgpO1xuXG4gICAgaWYgKGxlZnRUb3AgIT0gbnVsbCkge1xuICAgICAgdHJhbnMuc2V0V29ybGRPcmdYKG5ld0xlZnRUb3AueCk7XG4gICAgICB0cmFucy5zZXRXb3JsZE9yZ1kobmV3TGVmdFRvcC55KTtcblxuICAgICAgdHJhbnMuc2V0RGV2aWNlT3JnWChsZWZ0VG9wLngpO1xuICAgICAgdHJhbnMuc2V0RGV2aWNlT3JnWShsZWZ0VG9wLnkpO1xuXG4gICAgICB2YXIgbm9kZXMgPSB0aGlzLmdldEFsbE5vZGVzKCk7XG4gICAgICB2YXIgbm9kZTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIG5vZGUudHJhbnNmb3JtKHRyYW5zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbkxheW91dC5wcm90b3R5cGUucG9zaXRpb25Ob2Rlc1JhbmRvbWx5ID0gZnVuY3Rpb24gKGdyYXBoKSB7XG5cbiAgaWYgKGdyYXBoID09IHVuZGVmaW5lZCkge1xuICAgIC8vYXNzZXJ0ICF0aGlzLmluY3JlbWVudGFsO1xuICAgIHRoaXMucG9zaXRpb25Ob2Rlc1JhbmRvbWx5KHRoaXMuZ2V0R3JhcGhNYW5hZ2VyKCkuZ2V0Um9vdCgpKTtcbiAgICB0aGlzLmdldEdyYXBoTWFuYWdlcigpLmdldFJvb3QoKS51cGRhdGVCb3VuZHModHJ1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxOb2RlO1xuICAgIHZhciBjaGlsZEdyYXBoO1xuXG4gICAgdmFyIG5vZGVzID0gZ3JhcGguZ2V0Tm9kZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsTm9kZSA9IG5vZGVzW2ldO1xuICAgICAgY2hpbGRHcmFwaCA9IGxOb2RlLmdldENoaWxkKCk7XG5cbiAgICAgIGlmIChjaGlsZEdyYXBoID09IG51bGwpIHtcbiAgICAgICAgbE5vZGUuc2NhdHRlcigpO1xuICAgICAgfSBlbHNlIGlmIChjaGlsZEdyYXBoLmdldE5vZGVzKCkubGVuZ3RoID09IDApIHtcbiAgICAgICAgbE5vZGUuc2NhdHRlcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wb3NpdGlvbk5vZGVzUmFuZG9tbHkoY2hpbGRHcmFwaCk7XG4gICAgICAgIGxOb2RlLnVwZGF0ZUJvdW5kcygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXHJcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBsaXN0IG9mIHRyZWVzIHdoZXJlIGVhY2ggdHJlZSBpcyByZXByZXNlbnRlZCBhcyBhXHJcbiAqIGxpc3Qgb2YgbC1ub2Rlcy4gVGhlIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiBzaXplIDAgd2hlbjpcclxuICogLSBUaGUgZ3JhcGggaXMgbm90IGZsYXQgb3JcclxuICogLSBPbmUgb2YgdGhlIGNvbXBvbmVudChzKSBvZiB0aGUgZ3JhcGggaXMgbm90IGEgdHJlZS5cclxuICovXG5MYXlvdXQucHJvdG90eXBlLmdldEZsYXRGb3Jlc3QgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBmbGF0Rm9yZXN0ID0gW107XG4gIHZhciBpc0ZvcmVzdCA9IHRydWU7XG5cbiAgLy8gUXVpY2sgcmVmZXJlbmNlIGZvciBhbGwgbm9kZXMgaW4gdGhlIGdyYXBoIG1hbmFnZXIgYXNzb2NpYXRlZCB3aXRoXG4gIC8vIHRoaXMgbGF5b3V0LiBUaGUgbGlzdCBzaG91bGQgbm90IGJlIGNoYW5nZWQuXG4gIHZhciBhbGxOb2RlcyA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKS5nZXROb2RlcygpO1xuXG4gIC8vIEZpcnN0IGJlIHN1cmUgdGhhdCB0aGUgZ3JhcGggaXMgZmxhdFxuICB2YXIgaXNGbGF0ID0gdHJ1ZTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGFsbE5vZGVzW2ldLmdldENoaWxkKCkgIT0gbnVsbCkge1xuICAgICAgaXNGbGF0ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJuIGVtcHR5IGZvcmVzdCBpZiB0aGUgZ3JhcGggaXMgbm90IGZsYXQuXG4gIGlmICghaXNGbGF0KSB7XG4gICAgcmV0dXJuIGZsYXRGb3Jlc3Q7XG4gIH1cblxuICAvLyBSdW4gQkZTIGZvciBlYWNoIGNvbXBvbmVudCBvZiB0aGUgZ3JhcGguXG5cbiAgdmFyIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gIHZhciB0b0JlVmlzaXRlZCA9IFtdO1xuICB2YXIgcGFyZW50cyA9IG5ldyBNYXAoKTtcbiAgdmFyIHVuUHJvY2Vzc2VkTm9kZXMgPSBbXTtcblxuICB1blByb2Nlc3NlZE5vZGVzID0gdW5Qcm9jZXNzZWROb2Rlcy5jb25jYXQoYWxsTm9kZXMpO1xuXG4gIC8vIEVhY2ggaXRlcmF0aW9uIG9mIHRoaXMgbG9vcCBmaW5kcyBhIGNvbXBvbmVudCBvZiB0aGUgZ3JhcGggYW5kXG4gIC8vIGRlY2lkZXMgd2hldGhlciBpdCBpcyBhIHRyZWUgb3Igbm90LiBJZiBpdCBpcyBhIHRyZWUsIGFkZHMgaXQgdG8gdGhlXG4gIC8vIGZvcmVzdCBhbmQgY29udGludWVkIHdpdGggdGhlIG5leHQgY29tcG9uZW50LlxuXG4gIHdoaWxlICh1blByb2Nlc3NlZE5vZGVzLmxlbmd0aCA+IDAgJiYgaXNGb3Jlc3QpIHtcbiAgICB0b0JlVmlzaXRlZC5wdXNoKHVuUHJvY2Vzc2VkTm9kZXNbMF0pO1xuXG4gICAgLy8gU3RhcnQgdGhlIEJGUy4gRWFjaCBpdGVyYXRpb24gb2YgdGhpcyBsb29wIHZpc2l0cyBhIG5vZGUgaW4gYVxuICAgIC8vIEJGUyBtYW5uZXIuXG4gICAgd2hpbGUgKHRvQmVWaXNpdGVkLmxlbmd0aCA+IDAgJiYgaXNGb3Jlc3QpIHtcbiAgICAgIC8vcG9vbCBvcGVyYXRpb25cbiAgICAgIHZhciBjdXJyZW50Tm9kZSA9IHRvQmVWaXNpdGVkWzBdO1xuICAgICAgdG9CZVZpc2l0ZWQuc3BsaWNlKDAsIDEpO1xuICAgICAgdmlzaXRlZC5hZGQoY3VycmVudE5vZGUpO1xuXG4gICAgICAvLyBUcmF2ZXJzZSBhbGwgbmVpZ2hib3JzIG9mIHRoaXMgbm9kZVxuICAgICAgdmFyIG5laWdoYm9yRWRnZXMgPSBjdXJyZW50Tm9kZS5nZXRFZGdlcygpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5laWdoYm9yRWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGN1cnJlbnROZWlnaGJvciA9IG5laWdoYm9yRWRnZXNbaV0uZ2V0T3RoZXJFbmQoY3VycmVudE5vZGUpO1xuXG4gICAgICAgIC8vIElmIEJGUyBpcyBub3QgZ3Jvd2luZyBmcm9tIHRoaXMgbmVpZ2hib3IuXG4gICAgICAgIGlmIChwYXJlbnRzLmdldChjdXJyZW50Tm9kZSkgIT0gY3VycmVudE5laWdoYm9yKSB7XG4gICAgICAgICAgLy8gV2UgaGF2ZW4ndCBwcmV2aW91c2x5IHZpc2l0ZWQgdGhpcyBuZWlnaGJvci5cbiAgICAgICAgICBpZiAoIXZpc2l0ZWQuaGFzKGN1cnJlbnROZWlnaGJvcikpIHtcbiAgICAgICAgICAgIHRvQmVWaXNpdGVkLnB1c2goY3VycmVudE5laWdoYm9yKTtcbiAgICAgICAgICAgIHBhcmVudHMuc2V0KGN1cnJlbnROZWlnaGJvciwgY3VycmVudE5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBTaW5jZSB3ZSBoYXZlIHByZXZpb3VzbHkgdmlzaXRlZCB0aGlzIG5laWdoYm9yIGFuZFxuICAgICAgICAgIC8vIHRoaXMgbmVpZ2hib3IgaXMgbm90IHBhcmVudCBvZiBjdXJyZW50Tm9kZSwgZ2l2ZW5cbiAgICAgICAgICAvLyBncmFwaCBjb250YWlucyBhIGNvbXBvbmVudCB0aGF0IGlzIG5vdCB0cmVlLCBoZW5jZVxuICAgICAgICAgIC8vIGl0IGlzIG5vdCBhIGZvcmVzdC5cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgaXNGb3Jlc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgZ3JhcGggY29udGFpbnMgYSBjb21wb25lbnQgdGhhdCBpcyBub3QgYSB0cmVlLiBFbXB0eVxuICAgIC8vIHByZXZpb3VzbHkgZm91bmQgdHJlZXMuIFRoZSBtZXRob2Qgd2lsbCBlbmQuXG4gICAgaWYgKCFpc0ZvcmVzdCkge1xuICAgICAgZmxhdEZvcmVzdCA9IFtdO1xuICAgIH1cbiAgICAvLyBTYXZlIGN1cnJlbnRseSB2aXNpdGVkIG5vZGVzIGFzIGEgdHJlZSBpbiBvdXIgZm9yZXN0LiBSZXNldFxuICAgIC8vIHZpc2l0ZWQgYW5kIHBhcmVudHMgbGlzdHMuIENvbnRpbnVlIHdpdGggdGhlIG5leHQgY29tcG9uZW50IG9mXG4gICAgLy8gdGhlIGdyYXBoLCBpZiBhbnkuXG4gICAgZWxzZSB7XG4gICAgICAgIHZhciB0ZW1wID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheSh2aXNpdGVkKSk7XG4gICAgICAgIGZsYXRGb3Jlc3QucHVzaCh0ZW1wKTtcbiAgICAgICAgLy9mbGF0Rm9yZXN0ID0gZmxhdEZvcmVzdC5jb25jYXQodGVtcCk7XG4gICAgICAgIC8vdW5Qcm9jZXNzZWROb2Rlcy5yZW1vdmVBbGwodmlzaXRlZCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGVtcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IHRlbXBbaV07XG4gICAgICAgICAgdmFyIGluZGV4ID0gdW5Qcm9jZXNzZWROb2Rlcy5pbmRleE9mKHZhbHVlKTtcbiAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgdW5Qcm9jZXNzZWROb2Rlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2aXNpdGVkID0gbmV3IFNldCgpO1xuICAgICAgICBwYXJlbnRzID0gbmV3IE1hcCgpO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIGZsYXRGb3Jlc3Q7XG59O1xuXG4vKipcclxuICogVGhpcyBtZXRob2QgY3JlYXRlcyBkdW1teSBub2RlcyAoYW4gbC1sZXZlbCBub2RlIHdpdGggbWluaW1hbCBkaW1lbnNpb25zKVxyXG4gKiBmb3IgdGhlIGdpdmVuIGVkZ2UgKG9uZSBwZXIgYmVuZHBvaW50KS4gVGhlIGV4aXN0aW5nIGwtbGV2ZWwgc3RydWN0dXJlXHJcbiAqIGlzIHVwZGF0ZWQgYWNjb3JkaW5nbHkuXHJcbiAqL1xuTGF5b3V0LnByb3RvdHlwZS5jcmVhdGVEdW1teU5vZGVzRm9yQmVuZHBvaW50cyA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBkdW1teU5vZGVzID0gW107XG4gIHZhciBwcmV2ID0gZWRnZS5zb3VyY2U7XG5cbiAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaE1hbmFnZXIuY2FsY0xvd2VzdENvbW1vbkFuY2VzdG9yKGVkZ2Uuc291cmNlLCBlZGdlLnRhcmdldCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlLmJlbmRwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBjcmVhdGUgbmV3IGR1bW15IG5vZGVcbiAgICB2YXIgZHVtbXlOb2RlID0gdGhpcy5uZXdOb2RlKG51bGwpO1xuICAgIGR1bW15Tm9kZS5zZXRSZWN0KG5ldyBQb2ludCgwLCAwKSwgbmV3IERpbWVuc2lvbigxLCAxKSk7XG5cbiAgICBncmFwaC5hZGQoZHVtbXlOb2RlKTtcblxuICAgIC8vIGNyZWF0ZSBuZXcgZHVtbXkgZWRnZSBiZXR3ZWVuIHByZXYgYW5kIGR1bW15IG5vZGVcbiAgICB2YXIgZHVtbXlFZGdlID0gdGhpcy5uZXdFZGdlKG51bGwpO1xuICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLmFkZChkdW1teUVkZ2UsIHByZXYsIGR1bW15Tm9kZSk7XG5cbiAgICBkdW1teU5vZGVzLmFkZChkdW1teU5vZGUpO1xuICAgIHByZXYgPSBkdW1teU5vZGU7XG4gIH1cblxuICB2YXIgZHVtbXlFZGdlID0gdGhpcy5uZXdFZGdlKG51bGwpO1xuICB0aGlzLmdyYXBoTWFuYWdlci5hZGQoZHVtbXlFZGdlLCBwcmV2LCBlZGdlLnRhcmdldCk7XG5cbiAgdGhpcy5lZGdlVG9EdW1teU5vZGVzLnNldChlZGdlLCBkdW1teU5vZGVzKTtcblxuICAvLyByZW1vdmUgcmVhbCBlZGdlIGZyb20gZ3JhcGggbWFuYWdlciBpZiBpdCBpcyBpbnRlci1ncmFwaFxuICBpZiAoZWRnZS5pc0ludGVyR3JhcGgoKSkge1xuICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlbW92ZShlZGdlKTtcbiAgfVxuICAvLyBlbHNlLCByZW1vdmUgdGhlIGVkZ2UgZnJvbSB0aGUgY3VycmVudCBncmFwaFxuICBlbHNlIHtcbiAgICAgIGdyYXBoLnJlbW92ZShlZGdlKTtcbiAgICB9XG5cbiAgcmV0dXJuIGR1bW15Tm9kZXM7XG59O1xuXG4vKipcclxuICogVGhpcyBtZXRob2QgY3JlYXRlcyBiZW5kcG9pbnRzIGZvciBlZGdlcyBmcm9tIHRoZSBkdW1teSBub2Rlc1xyXG4gKiBhdCBsLWxldmVsLlxyXG4gKi9cbkxheW91dC5wcm90b3R5cGUuY3JlYXRlQmVuZHBvaW50c0Zyb21EdW1teU5vZGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWRnZXMgPSBbXTtcbiAgZWRnZXMgPSBlZGdlcy5jb25jYXQodGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsRWRnZXMoKSk7XG4gIGVkZ2VzID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheSh0aGlzLmVkZ2VUb0R1bW15Tm9kZXMua2V5cygpKSkuY29uY2F0KGVkZ2VzKTtcblxuICBmb3IgKHZhciBrID0gMDsgayA8IGVkZ2VzLmxlbmd0aDsgaysrKSB7XG4gICAgdmFyIGxFZGdlID0gZWRnZXNba107XG5cbiAgICBpZiAobEVkZ2UuYmVuZHBvaW50cy5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgcGF0aCA9IHRoaXMuZWRnZVRvRHVtbXlOb2Rlcy5nZXQobEVkZ2UpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGR1bW15Tm9kZSA9IHBhdGhbaV07XG4gICAgICAgIHZhciBwID0gbmV3IFBvaW50RChkdW1teU5vZGUuZ2V0Q2VudGVyWCgpLCBkdW1teU5vZGUuZ2V0Q2VudGVyWSgpKTtcblxuICAgICAgICAvLyB1cGRhdGUgYmVuZHBvaW50J3MgbG9jYXRpb24gYWNjb3JkaW5nIHRvIGR1bW15IG5vZGVcbiAgICAgICAgdmFyIGVicCA9IGxFZGdlLmJlbmRwb2ludHMuZ2V0KGkpO1xuICAgICAgICBlYnAueCA9IHAueDtcbiAgICAgICAgZWJwLnkgPSBwLnk7XG5cbiAgICAgICAgLy8gcmVtb3ZlIHRoZSBkdW1teSBub2RlLCBkdW1teSBlZGdlcyBpbmNpZGVudCB3aXRoIHRoaXNcbiAgICAgICAgLy8gZHVtbXkgbm9kZSBpcyBhbHNvIHJlbW92ZWQgKHdpdGhpbiB0aGUgcmVtb3ZlIG1ldGhvZClcbiAgICAgICAgZHVtbXlOb2RlLmdldE93bmVyKCkucmVtb3ZlKGR1bW15Tm9kZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGFkZCB0aGUgcmVhbCBlZGdlIHRvIGdyYXBoXG4gICAgICB0aGlzLmdyYXBoTWFuYWdlci5hZGQobEVkZ2UsIGxFZGdlLnNvdXJjZSwgbEVkZ2UudGFyZ2V0KTtcbiAgICB9XG4gIH1cbn07XG5cbkxheW91dC50cmFuc2Zvcm0gPSBmdW5jdGlvbiAoc2xpZGVyVmFsdWUsIGRlZmF1bHRWYWx1ZSwgbWluRGl2LCBtYXhNdWwpIHtcbiAgaWYgKG1pbkRpdiAhPSB1bmRlZmluZWQgJiYgbWF4TXVsICE9IHVuZGVmaW5lZCkge1xuICAgIHZhciB2YWx1ZSA9IGRlZmF1bHRWYWx1ZTtcblxuICAgIGlmIChzbGlkZXJWYWx1ZSA8PSA1MCkge1xuICAgICAgdmFyIG1pblZhbHVlID0gZGVmYXVsdFZhbHVlIC8gbWluRGl2O1xuICAgICAgdmFsdWUgLT0gKGRlZmF1bHRWYWx1ZSAtIG1pblZhbHVlKSAvIDUwICogKDUwIC0gc2xpZGVyVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbWF4VmFsdWUgPSBkZWZhdWx0VmFsdWUgKiBtYXhNdWw7XG4gICAgICB2YWx1ZSArPSAobWF4VmFsdWUgLSBkZWZhdWx0VmFsdWUpIC8gNTAgKiAoc2xpZGVyVmFsdWUgLSA1MCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHZhciBhLCBiO1xuXG4gICAgaWYgKHNsaWRlclZhbHVlIDw9IDUwKSB7XG4gICAgICBhID0gOS4wICogZGVmYXVsdFZhbHVlIC8gNTAwLjA7XG4gICAgICBiID0gZGVmYXVsdFZhbHVlIC8gMTAuMDtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IDkuMCAqIGRlZmF1bHRWYWx1ZSAvIDUwLjA7XG4gICAgICBiID0gLTggKiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGEgKiBzbGlkZXJWYWx1ZSArIGI7XG4gIH1cbn07XG5cbi8qKlxyXG4gKiBUaGlzIG1ldGhvZCBmaW5kcyBhbmQgcmV0dXJucyB0aGUgY2VudGVyIG9mIHRoZSBnaXZlbiBub2RlcywgYXNzdW1pbmdcclxuICogdGhhdCB0aGUgZ2l2ZW4gbm9kZXMgZm9ybSBhIHRyZWUgaW4gdGhlbXNlbHZlcy5cclxuICovXG5MYXlvdXQuZmluZENlbnRlck9mVHJlZSA9IGZ1bmN0aW9uIChub2Rlcykge1xuICB2YXIgbGlzdCA9IFtdO1xuICBsaXN0ID0gbGlzdC5jb25jYXQobm9kZXMpO1xuXG4gIHZhciByZW1vdmVkTm9kZXMgPSBbXTtcbiAgdmFyIHJlbWFpbmluZ0RlZ3JlZXMgPSBuZXcgTWFwKCk7XG4gIHZhciBmb3VuZENlbnRlciA9IGZhbHNlO1xuICB2YXIgY2VudGVyTm9kZSA9IG51bGw7XG5cbiAgaWYgKGxpc3QubGVuZ3RoID09IDEgfHwgbGlzdC5sZW5ndGggPT0gMikge1xuICAgIGZvdW5kQ2VudGVyID0gdHJ1ZTtcbiAgICBjZW50ZXJOb2RlID0gbGlzdFswXTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gbGlzdFtpXTtcbiAgICB2YXIgZGVncmVlID0gbm9kZS5nZXROZWlnaGJvcnNMaXN0KCkuc2l6ZTtcbiAgICByZW1haW5pbmdEZWdyZWVzLnNldChub2RlLCBub2RlLmdldE5laWdoYm9yc0xpc3QoKS5zaXplKTtcblxuICAgIGlmIChkZWdyZWUgPT0gMSkge1xuICAgICAgcmVtb3ZlZE5vZGVzLnB1c2gobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHRlbXBMaXN0ID0gW107XG4gIHRlbXBMaXN0ID0gdGVtcExpc3QuY29uY2F0KHJlbW92ZWROb2Rlcyk7XG5cbiAgd2hpbGUgKCFmb3VuZENlbnRlcikge1xuICAgIHZhciB0ZW1wTGlzdDIgPSBbXTtcbiAgICB0ZW1wTGlzdDIgPSB0ZW1wTGlzdDIuY29uY2F0KHRlbXBMaXN0KTtcbiAgICB0ZW1wTGlzdCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbm9kZSA9IGxpc3RbaV07XG5cbiAgICAgIHZhciBpbmRleCA9IGxpc3QuaW5kZXhPZihub2RlKTtcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIGxpc3Quc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5laWdoYm91cnMgPSBub2RlLmdldE5laWdoYm9yc0xpc3QoKTtcblxuICAgICAgbmVpZ2hib3Vycy5mb3JFYWNoKGZ1bmN0aW9uIChuZWlnaGJvdXIpIHtcbiAgICAgICAgaWYgKHJlbW92ZWROb2Rlcy5pbmRleE9mKG5laWdoYm91cikgPCAwKSB7XG4gICAgICAgICAgdmFyIG90aGVyRGVncmVlID0gcmVtYWluaW5nRGVncmVlcy5nZXQobmVpZ2hib3VyKTtcbiAgICAgICAgICB2YXIgbmV3RGVncmVlID0gb3RoZXJEZWdyZWUgLSAxO1xuXG4gICAgICAgICAgaWYgKG5ld0RlZ3JlZSA9PSAxKSB7XG4gICAgICAgICAgICB0ZW1wTGlzdC5wdXNoKG5laWdoYm91cik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVtYWluaW5nRGVncmVlcy5zZXQobmVpZ2hib3VyLCBuZXdEZWdyZWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZW1vdmVkTm9kZXMgPSByZW1vdmVkTm9kZXMuY29uY2F0KHRlbXBMaXN0KTtcblxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PSAxIHx8IGxpc3QubGVuZ3RoID09IDIpIHtcbiAgICAgIGZvdW5kQ2VudGVyID0gdHJ1ZTtcbiAgICAgIGNlbnRlck5vZGUgPSBsaXN0WzBdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjZW50ZXJOb2RlO1xufTtcblxuLyoqXHJcbiAqIER1cmluZyB0aGUgY29hcnNlbmluZyBwcm9jZXNzLCB0aGlzIGxheW91dCBtYXkgYmUgcmVmZXJlbmNlZCBieSB0d28gZ3JhcGggbWFuYWdlcnNcclxuICogdGhpcyBzZXR0ZXIgZnVuY3Rpb24gZ3JhbnRzIGFjY2VzcyB0byBjaGFuZ2UgdGhlIGN1cnJlbnRseSBiZWluZyB1c2VkIGdyYXBoIG1hbmFnZXJcclxuICovXG5MYXlvdXQucHJvdG90eXBlLnNldEdyYXBoTWFuYWdlciA9IGZ1bmN0aW9uIChnbSkge1xuICB0aGlzLmdyYXBoTWFuYWdlciA9IGdtO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBMYXlvdXQ7XG5cbi8qKiovIH0pLFxuLyogMTYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gUmFuZG9tU2VlZCgpIHt9XG4vLyBhZGFwdGVkIGZyb206IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xOTMwMzcyNVxuUmFuZG9tU2VlZC5zZWVkID0gMTtcblJhbmRvbVNlZWQueCA9IDA7XG5cblJhbmRvbVNlZWQubmV4dERvdWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgUmFuZG9tU2VlZC54ID0gTWF0aC5zaW4oUmFuZG9tU2VlZC5zZWVkKyspICogMTAwMDA7XG4gIHJldHVybiBSYW5kb21TZWVkLnggLSBNYXRoLmZsb29yKFJhbmRvbVNlZWQueCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJhbmRvbVNlZWQ7XG5cbi8qKiovIH0pLFxuLyogMTcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIFBvaW50RCA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG5cbmZ1bmN0aW9uIFRyYW5zZm9ybSh4LCB5KSB7XG4gIHRoaXMubHdvcmxkT3JnWCA9IDAuMDtcbiAgdGhpcy5sd29ybGRPcmdZID0gMC4wO1xuICB0aGlzLmxkZXZpY2VPcmdYID0gMC4wO1xuICB0aGlzLmxkZXZpY2VPcmdZID0gMC4wO1xuICB0aGlzLmx3b3JsZEV4dFggPSAxLjA7XG4gIHRoaXMubHdvcmxkRXh0WSA9IDEuMDtcbiAgdGhpcy5sZGV2aWNlRXh0WCA9IDEuMDtcbiAgdGhpcy5sZGV2aWNlRXh0WSA9IDEuMDtcbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZS5nZXRXb3JsZE9yZ1ggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmx3b3JsZE9yZ1g7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnNldFdvcmxkT3JnWCA9IGZ1bmN0aW9uICh3b3gpIHtcbiAgdGhpcy5sd29ybGRPcmdYID0gd294O1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5nZXRXb3JsZE9yZ1kgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmx3b3JsZE9yZ1k7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnNldFdvcmxkT3JnWSA9IGZ1bmN0aW9uICh3b3kpIHtcbiAgdGhpcy5sd29ybGRPcmdZID0gd295O1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5nZXRXb3JsZEV4dFggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmx3b3JsZEV4dFg7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnNldFdvcmxkRXh0WCA9IGZ1bmN0aW9uICh3ZXgpIHtcbiAgdGhpcy5sd29ybGRFeHRYID0gd2V4O1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5nZXRXb3JsZEV4dFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmx3b3JsZEV4dFk7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnNldFdvcmxkRXh0WSA9IGZ1bmN0aW9uICh3ZXkpIHtcbiAgdGhpcy5sd29ybGRFeHRZID0gd2V5O1xufTtcblxuLyogRGV2aWNlIHJlbGF0ZWQgKi9cblxuVHJhbnNmb3JtLnByb3RvdHlwZS5nZXREZXZpY2VPcmdYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5sZGV2aWNlT3JnWDtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0RGV2aWNlT3JnWCA9IGZ1bmN0aW9uIChkb3gpIHtcbiAgdGhpcy5sZGV2aWNlT3JnWCA9IGRveDtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuZ2V0RGV2aWNlT3JnWSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubGRldmljZU9yZ1k7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnNldERldmljZU9yZ1kgPSBmdW5jdGlvbiAoZG95KSB7XG4gIHRoaXMubGRldmljZU9yZ1kgPSBkb3k7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldERldmljZUV4dFggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxkZXZpY2VFeHRYO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5zZXREZXZpY2VFeHRYID0gZnVuY3Rpb24gKGRleCkge1xuICB0aGlzLmxkZXZpY2VFeHRYID0gZGV4O1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5nZXREZXZpY2VFeHRZID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5sZGV2aWNlRXh0WTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0RGV2aWNlRXh0WSA9IGZ1bmN0aW9uIChkZXkpIHtcbiAgdGhpcy5sZGV2aWNlRXh0WSA9IGRleTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUudHJhbnNmb3JtWCA9IGZ1bmN0aW9uICh4KSB7XG4gIHZhciB4RGV2aWNlID0gMC4wO1xuICB2YXIgd29ybGRFeHRYID0gdGhpcy5sd29ybGRFeHRYO1xuICBpZiAod29ybGRFeHRYICE9IDAuMCkge1xuICAgIHhEZXZpY2UgPSB0aGlzLmxkZXZpY2VPcmdYICsgKHggLSB0aGlzLmx3b3JsZE9yZ1gpICogdGhpcy5sZGV2aWNlRXh0WCAvIHdvcmxkRXh0WDtcbiAgfVxuXG4gIHJldHVybiB4RGV2aWNlO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS50cmFuc2Zvcm1ZID0gZnVuY3Rpb24gKHkpIHtcbiAgdmFyIHlEZXZpY2UgPSAwLjA7XG4gIHZhciB3b3JsZEV4dFkgPSB0aGlzLmx3b3JsZEV4dFk7XG4gIGlmICh3b3JsZEV4dFkgIT0gMC4wKSB7XG4gICAgeURldmljZSA9IHRoaXMubGRldmljZU9yZ1kgKyAoeSAtIHRoaXMubHdvcmxkT3JnWSkgKiB0aGlzLmxkZXZpY2VFeHRZIC8gd29ybGRFeHRZO1xuICB9XG5cbiAgcmV0dXJuIHlEZXZpY2U7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmludmVyc2VUcmFuc2Zvcm1YID0gZnVuY3Rpb24gKHgpIHtcbiAgdmFyIHhXb3JsZCA9IDAuMDtcbiAgdmFyIGRldmljZUV4dFggPSB0aGlzLmxkZXZpY2VFeHRYO1xuICBpZiAoZGV2aWNlRXh0WCAhPSAwLjApIHtcbiAgICB4V29ybGQgPSB0aGlzLmx3b3JsZE9yZ1ggKyAoeCAtIHRoaXMubGRldmljZU9yZ1gpICogdGhpcy5sd29ybGRFeHRYIC8gZGV2aWNlRXh0WDtcbiAgfVxuXG4gIHJldHVybiB4V29ybGQ7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmludmVyc2VUcmFuc2Zvcm1ZID0gZnVuY3Rpb24gKHkpIHtcbiAgdmFyIHlXb3JsZCA9IDAuMDtcbiAgdmFyIGRldmljZUV4dFkgPSB0aGlzLmxkZXZpY2VFeHRZO1xuICBpZiAoZGV2aWNlRXh0WSAhPSAwLjApIHtcbiAgICB5V29ybGQgPSB0aGlzLmx3b3JsZE9yZ1kgKyAoeSAtIHRoaXMubGRldmljZU9yZ1kpICogdGhpcy5sd29ybGRFeHRZIC8gZGV2aWNlRXh0WTtcbiAgfVxuICByZXR1cm4geVdvcmxkO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5pbnZlcnNlVHJhbnNmb3JtUG9pbnQgPSBmdW5jdGlvbiAoaW5Qb2ludCkge1xuICB2YXIgb3V0UG9pbnQgPSBuZXcgUG9pbnREKHRoaXMuaW52ZXJzZVRyYW5zZm9ybVgoaW5Qb2ludC54KSwgdGhpcy5pbnZlcnNlVHJhbnNmb3JtWShpblBvaW50LnkpKTtcbiAgcmV0dXJuIG91dFBvaW50O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2Zvcm07XG5cbi8qKiovIH0pLFxuLyogMTggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSBlbHNlIHsgcmV0dXJuIEFycmF5LmZyb20oYXJyKTsgfSB9XG5cbnZhciBMYXlvdXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KTtcbnZhciBGRExheW91dENvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG52YXIgTGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbnZhciBJR2VvbWV0cnkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xudmFyIElNYXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblxuZnVuY3Rpb24gRkRMYXlvdXQoKSB7XG4gIExheW91dC5jYWxsKHRoaXMpO1xuXG4gIHRoaXMudXNlU21hcnRJZGVhbEVkZ2VMZW5ndGhDYWxjdWxhdGlvbiA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfVVNFX1NNQVJUX0lERUFMX0VER0VfTEVOR1RIX0NBTENVTEFUSU9OO1xuICB0aGlzLmdyYXZpdHlDb25zdGFudCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9TVFJFTkdUSDtcbiAgdGhpcy5jb21wb3VuZEdyYXZpdHlDb25zdGFudCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9TVFJFTkdUSDtcbiAgdGhpcy5ncmF2aXR5UmFuZ2VGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0dSQVZJVFlfUkFOR0VfRkFDVE9SO1xuICB0aGlzLmNvbXBvdW5kR3Jhdml0eVJhbmdlRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1JBTkdFX0ZBQ1RPUjtcbiAgdGhpcy5kaXNwbGFjZW1lbnRUaHJlc2hvbGRQZXJOb2RlID0gMy4wICogRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCAvIDEwMDtcbiAgdGhpcy5jb29saW5nRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTDtcbiAgdGhpcy5pbml0aWFsQ29vbGluZ0ZhY3RvciA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09PTElOR19GQUNUT1JfSU5DUkVNRU5UQUw7XG4gIHRoaXMudG90YWxEaXNwbGFjZW1lbnQgPSAwLjA7XG4gIHRoaXMub2xkVG90YWxEaXNwbGFjZW1lbnQgPSAwLjA7XG4gIHRoaXMubWF4SXRlcmF0aW9ucyA9IEZETGF5b3V0Q29uc3RhbnRzLk1BWF9JVEVSQVRJT05TO1xufVxuXG5GRExheW91dC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKExheW91dC5wcm90b3R5cGUpO1xuXG5mb3IgKHZhciBwcm9wIGluIExheW91dCkge1xuICBGRExheW91dFtwcm9wXSA9IExheW91dFtwcm9wXTtcbn1cblxuRkRMYXlvdXQucHJvdG90eXBlLmluaXRQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkge1xuICBMYXlvdXQucHJvdG90eXBlLmluaXRQYXJhbWV0ZXJzLmNhbGwodGhpcywgYXJndW1lbnRzKTtcblxuICB0aGlzLnRvdGFsSXRlcmF0aW9ucyA9IDA7XG4gIHRoaXMubm90QW5pbWF0ZWRJdGVyYXRpb25zID0gMDtcblxuICB0aGlzLnVzZUZSR3JpZFZhcmlhbnQgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX1VTRV9TTUFSVF9SRVBVTFNJT05fUkFOR0VfQ0FMQ1VMQVRJT047XG5cbiAgdGhpcy5ncmlkID0gW107XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuY2FsY0lkZWFsRWRnZUxlbmd0aHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlZGdlO1xuICB2YXIgb3JpZ2luYWxJZGVhbExlbmd0aDtcbiAgdmFyIGxjYURlcHRoO1xuICB2YXIgc291cmNlO1xuICB2YXIgdGFyZ2V0O1xuICB2YXIgc2l6ZU9mU291cmNlSW5MY2E7XG4gIHZhciBzaXplT2ZUYXJnZXRJbkxjYTtcblxuICB2YXIgYWxsRWRnZXMgPSB0aGlzLmdldEdyYXBoTWFuYWdlcigpLmdldEFsbEVkZ2VzKCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsRWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICBlZGdlID0gYWxsRWRnZXNbaV07XG5cbiAgICBvcmlnaW5hbElkZWFsTGVuZ3RoID0gZWRnZS5pZGVhbExlbmd0aDtcblxuICAgIGlmIChlZGdlLmlzSW50ZXJHcmFwaCkge1xuICAgICAgc291cmNlID0gZWRnZS5nZXRTb3VyY2UoKTtcbiAgICAgIHRhcmdldCA9IGVkZ2UuZ2V0VGFyZ2V0KCk7XG5cbiAgICAgIHNpemVPZlNvdXJjZUluTGNhID0gZWRnZS5nZXRTb3VyY2VJbkxjYSgpLmdldEVzdGltYXRlZFNpemUoKTtcbiAgICAgIHNpemVPZlRhcmdldEluTGNhID0gZWRnZS5nZXRUYXJnZXRJbkxjYSgpLmdldEVzdGltYXRlZFNpemUoKTtcblxuICAgICAgaWYgKHRoaXMudXNlU21hcnRJZGVhbEVkZ2VMZW5ndGhDYWxjdWxhdGlvbikge1xuICAgICAgICBlZGdlLmlkZWFsTGVuZ3RoICs9IHNpemVPZlNvdXJjZUluTGNhICsgc2l6ZU9mVGFyZ2V0SW5MY2EgLSAyICogTGF5b3V0Q29uc3RhbnRzLlNJTVBMRV9OT0RFX1NJWkU7XG4gICAgICB9XG5cbiAgICAgIGxjYURlcHRoID0gZWRnZS5nZXRMY2EoKS5nZXRJbmNsdXNpb25UcmVlRGVwdGgoKTtcblxuICAgICAgZWRnZS5pZGVhbExlbmd0aCArPSBvcmlnaW5hbElkZWFsTGVuZ3RoICogRkRMYXlvdXRDb25zdGFudHMuUEVSX0xFVkVMX0lERUFMX0VER0VfTEVOR1RIX0ZBQ1RPUiAqIChzb3VyY2UuZ2V0SW5jbHVzaW9uVHJlZURlcHRoKCkgKyB0YXJnZXQuZ2V0SW5jbHVzaW9uVHJlZURlcHRoKCkgLSAyICogbGNhRGVwdGgpO1xuICAgIH1cbiAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLmluaXRTcHJpbmdFbWJlZGRlciA9IGZ1bmN0aW9uICgpIHtcblxuICB2YXIgcyA9IHRoaXMuZ2V0QWxsTm9kZXMoKS5sZW5ndGg7XG4gIGlmICh0aGlzLmluY3JlbWVudGFsKSB7XG4gICAgaWYgKHMgPiBGRExheW91dENvbnN0YW50cy5BREFQVEFUSU9OX0xPV0VSX05PREVfTElNSVQpIHtcbiAgICAgIHRoaXMuY29vbGluZ0ZhY3RvciA9IE1hdGgubWF4KHRoaXMuY29vbGluZ0ZhY3RvciAqIEZETGF5b3V0Q29uc3RhbnRzLkNPT0xJTkdfQURBUFRBVElPTl9GQUNUT1IsIHRoaXMuY29vbGluZ0ZhY3RvciAtIChzIC0gRkRMYXlvdXRDb25zdGFudHMuQURBUFRBVElPTl9MT1dFUl9OT0RFX0xJTUlUKSAvIChGRExheW91dENvbnN0YW50cy5BREFQVEFUSU9OX1VQUEVSX05PREVfTElNSVQgLSBGRExheW91dENvbnN0YW50cy5BREFQVEFUSU9OX0xPV0VSX05PREVfTElNSVQpICogdGhpcy5jb29saW5nRmFjdG9yICogKDEgLSBGRExheW91dENvbnN0YW50cy5DT09MSU5HX0FEQVBUQVRJT05fRkFDVE9SKSk7XG4gICAgfVxuICAgIHRoaXMubWF4Tm9kZURpc3BsYWNlbWVudCA9IEZETGF5b3V0Q29uc3RhbnRzLk1BWF9OT0RFX0RJU1BMQUNFTUVOVF9JTkNSRU1FTlRBTDtcbiAgfSBlbHNlIHtcbiAgICBpZiAocyA+IEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fTE9XRVJfTk9ERV9MSU1JVCkge1xuICAgICAgdGhpcy5jb29saW5nRmFjdG9yID0gTWF0aC5tYXgoRkRMYXlvdXRDb25zdGFudHMuQ09PTElOR19BREFQVEFUSU9OX0ZBQ1RPUiwgMS4wIC0gKHMgLSBGRExheW91dENvbnN0YW50cy5BREFQVEFUSU9OX0xPV0VSX05PREVfTElNSVQpIC8gKEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fVVBQRVJfTk9ERV9MSU1JVCAtIEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fTE9XRVJfTk9ERV9MSU1JVCkgKiAoMSAtIEZETGF5b3V0Q29uc3RhbnRzLkNPT0xJTkdfQURBUFRBVElPTl9GQUNUT1IpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb29saW5nRmFjdG9yID0gMS4wO1xuICAgIH1cbiAgICB0aGlzLmluaXRpYWxDb29saW5nRmFjdG9yID0gdGhpcy5jb29saW5nRmFjdG9yO1xuICAgIHRoaXMubWF4Tm9kZURpc3BsYWNlbWVudCA9IEZETGF5b3V0Q29uc3RhbnRzLk1BWF9OT0RFX0RJU1BMQUNFTUVOVDtcbiAgfVxuXG4gIHRoaXMubWF4SXRlcmF0aW9ucyA9IE1hdGgubWF4KHRoaXMuZ2V0QWxsTm9kZXMoKS5sZW5ndGggKiA1LCB0aGlzLm1heEl0ZXJhdGlvbnMpO1xuXG4gIC8vIFJlYXNzaWduIHRoaXMgYXR0cmlidXRlIGJ5IHVzaW5nIG5ldyBjb25zdGFudCB2YWx1ZVxuICB0aGlzLmRpc3BsYWNlbWVudFRocmVzaG9sZFBlck5vZGUgPSAzLjAgKiBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIC8gMTAwO1xuICB0aGlzLnRvdGFsRGlzcGxhY2VtZW50VGhyZXNob2xkID0gdGhpcy5kaXNwbGFjZW1lbnRUaHJlc2hvbGRQZXJOb2RlICogdGhpcy5nZXRBbGxOb2RlcygpLmxlbmd0aDtcblxuICB0aGlzLnJlcHVsc2lvblJhbmdlID0gdGhpcy5jYWxjUmVwdWxzaW9uUmFuZ2UoKTtcbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjU3ByaW5nRm9yY2VzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbEVkZ2VzID0gdGhpcy5nZXRBbGxFZGdlcygpO1xuICB2YXIgZWRnZTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxFZGdlcy5sZW5ndGg7IGkrKykge1xuICAgIGVkZ2UgPSBsRWRnZXNbaV07XG5cbiAgICB0aGlzLmNhbGNTcHJpbmdGb3JjZShlZGdlLCBlZGdlLmlkZWFsTGVuZ3RoKTtcbiAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLmNhbGNSZXB1bHNpb25Gb3JjZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBncmlkVXBkYXRlQWxsb3dlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdHJ1ZTtcbiAgdmFyIGZvcmNlVG9Ob2RlU3Vycm91bmRpbmdVcGRhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gIHZhciBpLCBqO1xuICB2YXIgbm9kZUEsIG5vZGVCO1xuICB2YXIgbE5vZGVzID0gdGhpcy5nZXRBbGxOb2RlcygpO1xuICB2YXIgcHJvY2Vzc2VkTm9kZVNldDtcblxuICBpZiAodGhpcy51c2VGUkdyaWRWYXJpYW50KSB7XG4gICAgaWYgKHRoaXMudG90YWxJdGVyYXRpb25zICUgRkRMYXlvdXRDb25zdGFudHMuR1JJRF9DQUxDVUxBVElPTl9DSEVDS19QRVJJT0QgPT0gMSAmJiBncmlkVXBkYXRlQWxsb3dlZCkge1xuICAgICAgdGhpcy51cGRhdGVHcmlkKCk7XG4gICAgfVxuXG4gICAgcHJvY2Vzc2VkTm9kZVNldCA9IG5ldyBTZXQoKTtcblxuICAgIC8vIGNhbGN1bGF0ZSByZXB1bHNpb24gZm9yY2VzIGJldHdlZW4gZWFjaCBub2RlcyBhbmQgaXRzIHN1cnJvdW5kaW5nXG4gICAgZm9yIChpID0gMDsgaSA8IGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbm9kZUEgPSBsTm9kZXNbaV07XG4gICAgICB0aGlzLmNhbGN1bGF0ZVJlcHVsc2lvbkZvcmNlT2ZBTm9kZShub2RlQSwgcHJvY2Vzc2VkTm9kZVNldCwgZ3JpZFVwZGF0ZUFsbG93ZWQsIGZvcmNlVG9Ob2RlU3Vycm91bmRpbmdVcGRhdGUpO1xuICAgICAgcHJvY2Vzc2VkTm9kZVNldC5hZGQobm9kZUEpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBub2RlQSA9IGxOb2Rlc1tpXTtcblxuICAgICAgZm9yIChqID0gaSArIDE7IGogPCBsTm9kZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgbm9kZUIgPSBsTm9kZXNbal07XG5cbiAgICAgICAgLy8gSWYgYm90aCBub2RlcyBhcmUgbm90IG1lbWJlcnMgb2YgdGhlIHNhbWUgZ3JhcGgsIHNraXAuXG4gICAgICAgIGlmIChub2RlQS5nZXRPd25lcigpICE9IG5vZGVCLmdldE93bmVyKCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsY1JlcHVsc2lvbkZvcmNlKG5vZGVBLCBub2RlQik7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuY2FsY0dyYXZpdGF0aW9uYWxGb3JjZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBub2RlO1xuICB2YXIgbE5vZGVzID0gdGhpcy5nZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbigpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZSA9IGxOb2Rlc1tpXTtcbiAgICB0aGlzLmNhbGNHcmF2aXRhdGlvbmFsRm9yY2Uobm9kZSk7XG4gIH1cbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5tb3ZlTm9kZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsTm9kZXMgPSB0aGlzLmdldEFsbE5vZGVzKCk7XG4gIHZhciBub2RlO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZSA9IGxOb2Rlc1tpXTtcbiAgICBub2RlLm1vdmUoKTtcbiAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLmNhbGNTcHJpbmdGb3JjZSA9IGZ1bmN0aW9uIChlZGdlLCBpZGVhbExlbmd0aCkge1xuICB2YXIgc291cmNlTm9kZSA9IGVkZ2UuZ2V0U291cmNlKCk7XG4gIHZhciB0YXJnZXROb2RlID0gZWRnZS5nZXRUYXJnZXQoKTtcblxuICB2YXIgbGVuZ3RoO1xuICB2YXIgc3ByaW5nRm9yY2U7XG4gIHZhciBzcHJpbmdGb3JjZVg7XG4gIHZhciBzcHJpbmdGb3JjZVk7XG5cbiAgLy8gVXBkYXRlIGVkZ2UgbGVuZ3RoXG4gIGlmICh0aGlzLnVuaWZvcm1MZWFmTm9kZVNpemVzICYmIHNvdXJjZU5vZGUuZ2V0Q2hpbGQoKSA9PSBudWxsICYmIHRhcmdldE5vZGUuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgZWRnZS51cGRhdGVMZW5ndGhTaW1wbGUoKTtcbiAgfSBlbHNlIHtcbiAgICBlZGdlLnVwZGF0ZUxlbmd0aCgpO1xuXG4gICAgaWYgKGVkZ2UuaXNPdmVybGFwaW5nU291cmNlQW5kVGFyZ2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbGVuZ3RoID0gZWRnZS5nZXRMZW5ndGgoKTtcblxuICBpZiAobGVuZ3RoID09IDApIHJldHVybjtcblxuICAvLyBDYWxjdWxhdGUgc3ByaW5nIGZvcmNlc1xuICBzcHJpbmdGb3JjZSA9IGVkZ2UuZWRnZUVsYXN0aWNpdHkgKiAobGVuZ3RoIC0gaWRlYWxMZW5ndGgpO1xuXG4gIC8vIFByb2plY3QgZm9yY2Ugb250byB4IGFuZCB5IGF4ZXNcbiAgc3ByaW5nRm9yY2VYID0gc3ByaW5nRm9yY2UgKiAoZWRnZS5sZW5ndGhYIC8gbGVuZ3RoKTtcbiAgc3ByaW5nRm9yY2VZID0gc3ByaW5nRm9yY2UgKiAoZWRnZS5sZW5ndGhZIC8gbGVuZ3RoKTtcblxuICAvLyBBcHBseSBmb3JjZXMgb24gdGhlIGVuZCBub2Rlc1xuICBzb3VyY2VOb2RlLnNwcmluZ0ZvcmNlWCArPSBzcHJpbmdGb3JjZVg7XG4gIHNvdXJjZU5vZGUuc3ByaW5nRm9yY2VZICs9IHNwcmluZ0ZvcmNlWTtcbiAgdGFyZ2V0Tm9kZS5zcHJpbmdGb3JjZVggLT0gc3ByaW5nRm9yY2VYO1xuICB0YXJnZXROb2RlLnNwcmluZ0ZvcmNlWSAtPSBzcHJpbmdGb3JjZVk7XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuY2FsY1JlcHVsc2lvbkZvcmNlID0gZnVuY3Rpb24gKG5vZGVBLCBub2RlQikge1xuICB2YXIgcmVjdEEgPSBub2RlQS5nZXRSZWN0KCk7XG4gIHZhciByZWN0QiA9IG5vZGVCLmdldFJlY3QoKTtcbiAgdmFyIG92ZXJsYXBBbW91bnQgPSBuZXcgQXJyYXkoMik7XG4gIHZhciBjbGlwUG9pbnRzID0gbmV3IEFycmF5KDQpO1xuICB2YXIgZGlzdGFuY2VYO1xuICB2YXIgZGlzdGFuY2VZO1xuICB2YXIgZGlzdGFuY2VTcXVhcmVkO1xuICB2YXIgZGlzdGFuY2U7XG4gIHZhciByZXB1bHNpb25Gb3JjZTtcbiAgdmFyIHJlcHVsc2lvbkZvcmNlWDtcbiAgdmFyIHJlcHVsc2lvbkZvcmNlWTtcblxuICBpZiAocmVjdEEuaW50ZXJzZWN0cyhyZWN0QikpIC8vIHR3byBub2RlcyBvdmVybGFwXG4gICAge1xuICAgICAgLy8gY2FsY3VsYXRlIHNlcGFyYXRpb24gYW1vdW50IGluIHggYW5kIHkgZGlyZWN0aW9uc1xuICAgICAgSUdlb21ldHJ5LmNhbGNTZXBhcmF0aW9uQW1vdW50KHJlY3RBLCByZWN0Qiwgb3ZlcmxhcEFtb3VudCwgRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCAvIDIuMCk7XG5cbiAgICAgIHJlcHVsc2lvbkZvcmNlWCA9IDIgKiBvdmVybGFwQW1vdW50WzBdO1xuICAgICAgcmVwdWxzaW9uRm9yY2VZID0gMiAqIG92ZXJsYXBBbW91bnRbMV07XG5cbiAgICAgIHZhciBjaGlsZHJlbkNvbnN0YW50ID0gbm9kZUEubm9PZkNoaWxkcmVuICogbm9kZUIubm9PZkNoaWxkcmVuIC8gKG5vZGVBLm5vT2ZDaGlsZHJlbiArIG5vZGVCLm5vT2ZDaGlsZHJlbik7XG5cbiAgICAgIC8vIEFwcGx5IGZvcmNlcyBvbiB0aGUgdHdvIG5vZGVzXG4gICAgICBub2RlQS5yZXB1bHNpb25Gb3JjZVggLT0gY2hpbGRyZW5Db25zdGFudCAqIHJlcHVsc2lvbkZvcmNlWDtcbiAgICAgIG5vZGVBLnJlcHVsc2lvbkZvcmNlWSAtPSBjaGlsZHJlbkNvbnN0YW50ICogcmVwdWxzaW9uRm9yY2VZO1xuICAgICAgbm9kZUIucmVwdWxzaW9uRm9yY2VYICs9IGNoaWxkcmVuQ29uc3RhbnQgKiByZXB1bHNpb25Gb3JjZVg7XG4gICAgICBub2RlQi5yZXB1bHNpb25Gb3JjZVkgKz0gY2hpbGRyZW5Db25zdGFudCAqIHJlcHVsc2lvbkZvcmNlWTtcbiAgICB9IGVsc2UgLy8gbm8gb3ZlcmxhcFxuICAgIHtcbiAgICAgIC8vIGNhbGN1bGF0ZSBkaXN0YW5jZVxuXG4gICAgICBpZiAodGhpcy51bmlmb3JtTGVhZk5vZGVTaXplcyAmJiBub2RlQS5nZXRDaGlsZCgpID09IG51bGwgJiYgbm9kZUIuZ2V0Q2hpbGQoKSA9PSBudWxsKSAvLyBzaW1wbHkgYmFzZSByZXB1bHNpb24gb24gZGlzdGFuY2Ugb2Ygbm9kZSBjZW50ZXJzXG4gICAgICAgIHtcbiAgICAgICAgICBkaXN0YW5jZVggPSByZWN0Qi5nZXRDZW50ZXJYKCkgLSByZWN0QS5nZXRDZW50ZXJYKCk7XG4gICAgICAgICAgZGlzdGFuY2VZID0gcmVjdEIuZ2V0Q2VudGVyWSgpIC0gcmVjdEEuZ2V0Q2VudGVyWSgpO1xuICAgICAgICB9IGVsc2UgLy8gdXNlIGNsaXBwaW5nIHBvaW50c1xuICAgICAgICB7XG4gICAgICAgICAgSUdlb21ldHJ5LmdldEludGVyc2VjdGlvbihyZWN0QSwgcmVjdEIsIGNsaXBQb2ludHMpO1xuXG4gICAgICAgICAgZGlzdGFuY2VYID0gY2xpcFBvaW50c1syXSAtIGNsaXBQb2ludHNbMF07XG4gICAgICAgICAgZGlzdGFuY2VZID0gY2xpcFBvaW50c1szXSAtIGNsaXBQb2ludHNbMV07XG4gICAgICAgIH1cblxuICAgICAgLy8gTm8gcmVwdWxzaW9uIHJhbmdlLiBGUiBncmlkIHZhcmlhbnQgc2hvdWxkIHRha2UgY2FyZSBvZiB0aGlzLlxuICAgICAgaWYgKE1hdGguYWJzKGRpc3RhbmNlWCkgPCBGRExheW91dENvbnN0YW50cy5NSU5fUkVQVUxTSU9OX0RJU1QpIHtcbiAgICAgICAgZGlzdGFuY2VYID0gSU1hdGguc2lnbihkaXN0YW5jZVgpICogRkRMYXlvdXRDb25zdGFudHMuTUlOX1JFUFVMU0lPTl9ESVNUO1xuICAgICAgfVxuXG4gICAgICBpZiAoTWF0aC5hYnMoZGlzdGFuY2VZKSA8IEZETGF5b3V0Q29uc3RhbnRzLk1JTl9SRVBVTFNJT05fRElTVCkge1xuICAgICAgICBkaXN0YW5jZVkgPSBJTWF0aC5zaWduKGRpc3RhbmNlWSkgKiBGRExheW91dENvbnN0YW50cy5NSU5fUkVQVUxTSU9OX0RJU1Q7XG4gICAgICB9XG5cbiAgICAgIGRpc3RhbmNlU3F1YXJlZCA9IGRpc3RhbmNlWCAqIGRpc3RhbmNlWCArIGRpc3RhbmNlWSAqIGRpc3RhbmNlWTtcbiAgICAgIGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRpc3RhbmNlU3F1YXJlZCk7XG5cbiAgICAgIC8vIEhlcmUgd2UgdXNlIGhhbGYgb2YgdGhlIG5vZGVzJyByZXB1bHNpb24gdmFsdWVzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICByZXB1bHNpb25Gb3JjZSA9IChub2RlQS5ub2RlUmVwdWxzaW9uIC8gMiArIG5vZGVCLm5vZGVSZXB1bHNpb24gLyAyKSAqIG5vZGVBLm5vT2ZDaGlsZHJlbiAqIG5vZGVCLm5vT2ZDaGlsZHJlbiAvIGRpc3RhbmNlU3F1YXJlZDtcblxuICAgICAgLy8gUHJvamVjdCBmb3JjZSBvbnRvIHggYW5kIHkgYXhlc1xuICAgICAgcmVwdWxzaW9uRm9yY2VYID0gcmVwdWxzaW9uRm9yY2UgKiBkaXN0YW5jZVggLyBkaXN0YW5jZTtcbiAgICAgIHJlcHVsc2lvbkZvcmNlWSA9IHJlcHVsc2lvbkZvcmNlICogZGlzdGFuY2VZIC8gZGlzdGFuY2U7XG5cbiAgICAgIC8vIEFwcGx5IGZvcmNlcyBvbiB0aGUgdHdvIG5vZGVzICAgIFxuICAgICAgbm9kZUEucmVwdWxzaW9uRm9yY2VYIC09IHJlcHVsc2lvbkZvcmNlWDtcbiAgICAgIG5vZGVBLnJlcHVsc2lvbkZvcmNlWSAtPSByZXB1bHNpb25Gb3JjZVk7XG4gICAgICBub2RlQi5yZXB1bHNpb25Gb3JjZVggKz0gcmVwdWxzaW9uRm9yY2VYO1xuICAgICAgbm9kZUIucmVwdWxzaW9uRm9yY2VZICs9IHJlcHVsc2lvbkZvcmNlWTtcbiAgICB9XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuY2FsY0dyYXZpdGF0aW9uYWxGb3JjZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHZhciBvd25lckdyYXBoO1xuICB2YXIgb3duZXJDZW50ZXJYO1xuICB2YXIgb3duZXJDZW50ZXJZO1xuICB2YXIgZGlzdGFuY2VYO1xuICB2YXIgZGlzdGFuY2VZO1xuICB2YXIgYWJzRGlzdGFuY2VYO1xuICB2YXIgYWJzRGlzdGFuY2VZO1xuICB2YXIgZXN0aW1hdGVkU2l6ZTtcbiAgb3duZXJHcmFwaCA9IG5vZGUuZ2V0T3duZXIoKTtcblxuICBvd25lckNlbnRlclggPSAob3duZXJHcmFwaC5nZXRSaWdodCgpICsgb3duZXJHcmFwaC5nZXRMZWZ0KCkpIC8gMjtcbiAgb3duZXJDZW50ZXJZID0gKG93bmVyR3JhcGguZ2V0VG9wKCkgKyBvd25lckdyYXBoLmdldEJvdHRvbSgpKSAvIDI7XG4gIGRpc3RhbmNlWCA9IG5vZGUuZ2V0Q2VudGVyWCgpIC0gb3duZXJDZW50ZXJYO1xuICBkaXN0YW5jZVkgPSBub2RlLmdldENlbnRlclkoKSAtIG93bmVyQ2VudGVyWTtcbiAgYWJzRGlzdGFuY2VYID0gTWF0aC5hYnMoZGlzdGFuY2VYKSArIG5vZGUuZ2V0V2lkdGgoKSAvIDI7XG4gIGFic0Rpc3RhbmNlWSA9IE1hdGguYWJzKGRpc3RhbmNlWSkgKyBub2RlLmdldEhlaWdodCgpIC8gMjtcblxuICBpZiAobm9kZS5nZXRPd25lcigpID09IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKSkgLy8gaW4gdGhlIHJvb3QgZ3JhcGhcbiAgICB7XG4gICAgICBlc3RpbWF0ZWRTaXplID0gb3duZXJHcmFwaC5nZXRFc3RpbWF0ZWRTaXplKCkgKiB0aGlzLmdyYXZpdHlSYW5nZUZhY3RvcjtcblxuICAgICAgaWYgKGFic0Rpc3RhbmNlWCA+IGVzdGltYXRlZFNpemUgfHwgYWJzRGlzdGFuY2VZID4gZXN0aW1hdGVkU2l6ZSkge1xuICAgICAgICBub2RlLmdyYXZpdGF0aW9uRm9yY2VYID0gLXRoaXMuZ3Jhdml0eUNvbnN0YW50ICogZGlzdGFuY2VYO1xuICAgICAgICBub2RlLmdyYXZpdGF0aW9uRm9yY2VZID0gLXRoaXMuZ3Jhdml0eUNvbnN0YW50ICogZGlzdGFuY2VZO1xuICAgICAgfVxuICAgIH0gZWxzZSAvLyBpbnNpZGUgYSBjb21wb3VuZFxuICAgIHtcbiAgICAgIGVzdGltYXRlZFNpemUgPSBvd25lckdyYXBoLmdldEVzdGltYXRlZFNpemUoKSAqIHRoaXMuY29tcG91bmRHcmF2aXR5UmFuZ2VGYWN0b3I7XG5cbiAgICAgIGlmIChhYnNEaXN0YW5jZVggPiBlc3RpbWF0ZWRTaXplIHx8IGFic0Rpc3RhbmNlWSA+IGVzdGltYXRlZFNpemUpIHtcbiAgICAgICAgbm9kZS5ncmF2aXRhdGlvbkZvcmNlWCA9IC10aGlzLmdyYXZpdHlDb25zdGFudCAqIGRpc3RhbmNlWCAqIHRoaXMuY29tcG91bmRHcmF2aXR5Q29uc3RhbnQ7XG4gICAgICAgIG5vZGUuZ3Jhdml0YXRpb25Gb3JjZVkgPSAtdGhpcy5ncmF2aXR5Q29uc3RhbnQgKiBkaXN0YW5jZVkgKiB0aGlzLmNvbXBvdW5kR3Jhdml0eUNvbnN0YW50O1xuICAgICAgfVxuICAgIH1cbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5pc0NvbnZlcmdlZCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNvbnZlcmdlZDtcbiAgdmFyIG9zY2lsYXRpbmcgPSBmYWxzZTtcblxuICBpZiAodGhpcy50b3RhbEl0ZXJhdGlvbnMgPiB0aGlzLm1heEl0ZXJhdGlvbnMgLyAzKSB7XG4gICAgb3NjaWxhdGluZyA9IE1hdGguYWJzKHRoaXMudG90YWxEaXNwbGFjZW1lbnQgLSB0aGlzLm9sZFRvdGFsRGlzcGxhY2VtZW50KSA8IDI7XG4gIH1cblxuICBjb252ZXJnZWQgPSB0aGlzLnRvdGFsRGlzcGxhY2VtZW50IDwgdGhpcy50b3RhbERpc3BsYWNlbWVudFRocmVzaG9sZDtcblxuICB0aGlzLm9sZFRvdGFsRGlzcGxhY2VtZW50ID0gdGhpcy50b3RhbERpc3BsYWNlbWVudDtcblxuICByZXR1cm4gY29udmVyZ2VkIHx8IG9zY2lsYXRpbmc7XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuYW5pbWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuYW5pbWF0aW9uRHVyaW5nTGF5b3V0ICYmICF0aGlzLmlzU3ViTGF5b3V0KSB7XG4gICAgaWYgKHRoaXMubm90QW5pbWF0ZWRJdGVyYXRpb25zID09IHRoaXMuYW5pbWF0aW9uUGVyaW9kKSB7XG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgdGhpcy5ub3RBbmltYXRlZEl0ZXJhdGlvbnMgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5vdEFuaW1hdGVkSXRlcmF0aW9ucysrO1xuICAgIH1cbiAgfVxufTtcblxuLy9UaGlzIG1ldGhvZCBjYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gKHdlaWdodCkgZm9yIGFsbCBub2Rlc1xuRkRMYXlvdXQucHJvdG90eXBlLmNhbGNOb09mQ2hpbGRyZW5Gb3JBbGxOb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5vZGU7XG4gIHZhciBhbGxOb2RlcyA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEFsbE5vZGVzKCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIG5vZGUgPSBhbGxOb2Rlc1tpXTtcbiAgICBub2RlLm5vT2ZDaGlsZHJlbiA9IG5vZGUuZ2V0Tm9PZkNoaWxkcmVuKCk7XG4gIH1cbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZWN0aW9uOiBGUi1HcmlkIFZhcmlhbnQgUmVwdWxzaW9uIEZvcmNlIENhbGN1bGF0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5GRExheW91dC5wcm90b3R5cGUuY2FsY0dyaWQgPSBmdW5jdGlvbiAoZ3JhcGgpIHtcblxuICB2YXIgc2l6ZVggPSAwO1xuICB2YXIgc2l6ZVkgPSAwO1xuXG4gIHNpemVYID0gcGFyc2VJbnQoTWF0aC5jZWlsKChncmFwaC5nZXRSaWdodCgpIC0gZ3JhcGguZ2V0TGVmdCgpKSAvIHRoaXMucmVwdWxzaW9uUmFuZ2UpKTtcbiAgc2l6ZVkgPSBwYXJzZUludChNYXRoLmNlaWwoKGdyYXBoLmdldEJvdHRvbSgpIC0gZ3JhcGguZ2V0VG9wKCkpIC8gdGhpcy5yZXB1bHNpb25SYW5nZSkpO1xuXG4gIHZhciBncmlkID0gbmV3IEFycmF5KHNpemVYKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemVYOyBpKyspIHtcbiAgICBncmlkW2ldID0gbmV3IEFycmF5KHNpemVZKTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZVg7IGkrKykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2l6ZVk7IGorKykge1xuICAgICAgZ3JpZFtpXVtqXSA9IG5ldyBBcnJheSgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBncmlkO1xufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLmFkZE5vZGVUb0dyaWQgPSBmdW5jdGlvbiAodiwgbGVmdCwgdG9wKSB7XG5cbiAgdmFyIHN0YXJ0WCA9IDA7XG4gIHZhciBmaW5pc2hYID0gMDtcbiAgdmFyIHN0YXJ0WSA9IDA7XG4gIHZhciBmaW5pc2hZID0gMDtcblxuICBzdGFydFggPSBwYXJzZUludChNYXRoLmZsb29yKCh2LmdldFJlY3QoKS54IC0gbGVmdCkgLyB0aGlzLnJlcHVsc2lvblJhbmdlKSk7XG4gIGZpbmlzaFggPSBwYXJzZUludChNYXRoLmZsb29yKCh2LmdldFJlY3QoKS53aWR0aCArIHYuZ2V0UmVjdCgpLnggLSBsZWZ0KSAvIHRoaXMucmVwdWxzaW9uUmFuZ2UpKTtcbiAgc3RhcnRZID0gcGFyc2VJbnQoTWF0aC5mbG9vcigodi5nZXRSZWN0KCkueSAtIHRvcCkgLyB0aGlzLnJlcHVsc2lvblJhbmdlKSk7XG4gIGZpbmlzaFkgPSBwYXJzZUludChNYXRoLmZsb29yKCh2LmdldFJlY3QoKS5oZWlnaHQgKyB2LmdldFJlY3QoKS55IC0gdG9wKSAvIHRoaXMucmVwdWxzaW9uUmFuZ2UpKTtcblxuICBmb3IgKHZhciBpID0gc3RhcnRYOyBpIDw9IGZpbmlzaFg7IGkrKykge1xuICAgIGZvciAodmFyIGogPSBzdGFydFk7IGogPD0gZmluaXNoWTsgaisrKSB7XG4gICAgICB0aGlzLmdyaWRbaV1bal0ucHVzaCh2KTtcbiAgICAgIHYuc2V0R3JpZENvb3JkaW5hdGVzKHN0YXJ0WCwgZmluaXNoWCwgc3RhcnRZLCBmaW5pc2hZKTtcbiAgICB9XG4gIH1cbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS51cGRhdGVHcmlkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaTtcbiAgdmFyIG5vZGVBO1xuICB2YXIgbE5vZGVzID0gdGhpcy5nZXRBbGxOb2RlcygpO1xuXG4gIHRoaXMuZ3JpZCA9IHRoaXMuY2FsY0dyaWQodGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpKTtcblxuICAvLyBwdXQgYWxsIG5vZGVzIHRvIHByb3BlciBncmlkIGNlbGxzXG4gIGZvciAoaSA9IDA7IGkgPCBsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBub2RlQSA9IGxOb2Rlc1tpXTtcbiAgICB0aGlzLmFkZE5vZGVUb0dyaWQobm9kZUEsIHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKS5nZXRMZWZ0KCksIHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKS5nZXRUb3AoKSk7XG4gIH1cbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjdWxhdGVSZXB1bHNpb25Gb3JjZU9mQU5vZGUgPSBmdW5jdGlvbiAobm9kZUEsIHByb2Nlc3NlZE5vZGVTZXQsIGdyaWRVcGRhdGVBbGxvd2VkLCBmb3JjZVRvTm9kZVN1cnJvdW5kaW5nVXBkYXRlKSB7XG5cbiAgaWYgKHRoaXMudG90YWxJdGVyYXRpb25zICUgRkRMYXlvdXRDb25zdGFudHMuR1JJRF9DQUxDVUxBVElPTl9DSEVDS19QRVJJT0QgPT0gMSAmJiBncmlkVXBkYXRlQWxsb3dlZCB8fCBmb3JjZVRvTm9kZVN1cnJvdW5kaW5nVXBkYXRlKSB7XG4gICAgdmFyIHN1cnJvdW5kaW5nID0gbmV3IFNldCgpO1xuICAgIG5vZGVBLnN1cnJvdW5kaW5nID0gbmV3IEFycmF5KCk7XG4gICAgdmFyIG5vZGVCO1xuICAgIHZhciBncmlkID0gdGhpcy5ncmlkO1xuXG4gICAgZm9yICh2YXIgaSA9IG5vZGVBLnN0YXJ0WCAtIDE7IGkgPCBub2RlQS5maW5pc2hYICsgMjsgaSsrKSB7XG4gICAgICBmb3IgKHZhciBqID0gbm9kZUEuc3RhcnRZIC0gMTsgaiA8IG5vZGVBLmZpbmlzaFkgKyAyOyBqKyspIHtcbiAgICAgICAgaWYgKCEoaSA8IDAgfHwgaiA8IDAgfHwgaSA+PSBncmlkLmxlbmd0aCB8fCBqID49IGdyaWRbMF0ubGVuZ3RoKSkge1xuICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgZ3JpZFtpXVtqXS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgbm9kZUIgPSBncmlkW2ldW2pdW2tdO1xuXG4gICAgICAgICAgICAvLyBJZiBib3RoIG5vZGVzIGFyZSBub3QgbWVtYmVycyBvZiB0aGUgc2FtZSBncmFwaCwgXG4gICAgICAgICAgICAvLyBvciBib3RoIG5vZGVzIGFyZSB0aGUgc2FtZSwgc2tpcC5cbiAgICAgICAgICAgIGlmIChub2RlQS5nZXRPd25lcigpICE9IG5vZGVCLmdldE93bmVyKCkgfHwgbm9kZUEgPT0gbm9kZUIpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSByZXB1bHNpb24gZm9yY2UgYmV0d2VlblxuICAgICAgICAgICAgLy8gbm9kZUEgYW5kIG5vZGVCIGhhcyBhbHJlYWR5IGJlZW4gY2FsY3VsYXRlZFxuICAgICAgICAgICAgaWYgKCFwcm9jZXNzZWROb2RlU2V0Lmhhcyhub2RlQikgJiYgIXN1cnJvdW5kaW5nLmhhcyhub2RlQikpIHtcbiAgICAgICAgICAgICAgdmFyIGRpc3RhbmNlWCA9IE1hdGguYWJzKG5vZGVBLmdldENlbnRlclgoKSAtIG5vZGVCLmdldENlbnRlclgoKSkgLSAobm9kZUEuZ2V0V2lkdGgoKSAvIDIgKyBub2RlQi5nZXRXaWR0aCgpIC8gMik7XG4gICAgICAgICAgICAgIHZhciBkaXN0YW5jZVkgPSBNYXRoLmFicyhub2RlQS5nZXRDZW50ZXJZKCkgLSBub2RlQi5nZXRDZW50ZXJZKCkpIC0gKG5vZGVBLmdldEhlaWdodCgpIC8gMiArIG5vZGVCLmdldEhlaWdodCgpIC8gMik7XG5cbiAgICAgICAgICAgICAgLy8gaWYgdGhlIGRpc3RhbmNlIGJldHdlZW4gbm9kZUEgYW5kIG5vZGVCIFxuICAgICAgICAgICAgICAvLyBpcyBsZXNzIHRoZW4gY2FsY3VsYXRpb24gcmFuZ2VcbiAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlWCA8PSB0aGlzLnJlcHVsc2lvblJhbmdlICYmIGRpc3RhbmNlWSA8PSB0aGlzLnJlcHVsc2lvblJhbmdlKSB7XG4gICAgICAgICAgICAgICAgLy90aGVuIGFkZCBub2RlQiB0byBzdXJyb3VuZGluZyBvZiBub2RlQVxuICAgICAgICAgICAgICAgIHN1cnJvdW5kaW5nLmFkZChub2RlQik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlQS5zdXJyb3VuZGluZyA9IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoc3Vycm91bmRpbmcpKTtcbiAgfVxuICBmb3IgKGkgPSAwOyBpIDwgbm9kZUEuc3Vycm91bmRpbmcubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLmNhbGNSZXB1bHNpb25Gb3JjZShub2RlQSwgbm9kZUEuc3Vycm91bmRpbmdbaV0pO1xuICB9XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuY2FsY1JlcHVsc2lvblJhbmdlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gMC4wO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBGRExheW91dDtcblxuLyoqKi8gfSksXG4vKiAxOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgTEVkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xudmFyIEZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblxuZnVuY3Rpb24gRkRMYXlvdXRFZGdlKHNvdXJjZSwgdGFyZ2V0LCB2RWRnZSkge1xuICBMRWRnZS5jYWxsKHRoaXMsIHNvdXJjZSwgdGFyZ2V0LCB2RWRnZSk7XG5cbiAgLy8gSWRlYWwgbGVuZ3RoIGFuZCBlbGFzdGljaXR5IHZhbHVlIGZvciB0aGlzIGVkZ2VcbiAgdGhpcy5pZGVhbExlbmd0aCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEg7XG4gIHRoaXMuZWRnZUVsYXN0aWNpdHkgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX1NQUklOR19TVFJFTkdUSDtcbn1cblxuRkRMYXlvdXRFZGdlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTEVkZ2UucHJvdG90eXBlKTtcblxuZm9yICh2YXIgcHJvcCBpbiBMRWRnZSkge1xuICBGRExheW91dEVkZ2VbcHJvcF0gPSBMRWRnZVtwcm9wXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBGRExheW91dEVkZ2U7XG5cbi8qKiovIH0pLFxuLyogMjAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIExOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcbnZhciBGRExheW91dENvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cbmZ1bmN0aW9uIEZETGF5b3V0Tm9kZShnbSwgbG9jLCBzaXplLCB2Tm9kZSkge1xuICAvLyBhbHRlcm5hdGl2ZSBjb25zdHJ1Y3RvciBpcyBoYW5kbGVkIGluc2lkZSBMTm9kZVxuICBMTm9kZS5jYWxsKHRoaXMsIGdtLCBsb2MsIHNpemUsIHZOb2RlKTtcblxuICAvLyBSZXB1bHNpb24gdmFsdWUgb2YgdGhpcyBub2RlXG4gIHRoaXMubm9kZVJlcHVsc2lvbiA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfUkVQVUxTSU9OX1NUUkVOR1RIO1xuXG4gIC8vU3ByaW5nLCByZXB1bHNpb24gYW5kIGdyYXZpdGF0aW9uYWwgZm9yY2VzIGFjdGluZyBvbiB0aGlzIG5vZGVcbiAgdGhpcy5zcHJpbmdGb3JjZVggPSAwO1xuICB0aGlzLnNwcmluZ0ZvcmNlWSA9IDA7XG4gIHRoaXMucmVwdWxzaW9uRm9yY2VYID0gMDtcbiAgdGhpcy5yZXB1bHNpb25Gb3JjZVkgPSAwO1xuICB0aGlzLmdyYXZpdGF0aW9uRm9yY2VYID0gMDtcbiAgdGhpcy5ncmF2aXRhdGlvbkZvcmNlWSA9IDA7XG4gIC8vQW1vdW50IGJ5IHdoaWNoIHRoaXMgbm9kZSBpcyB0byBiZSBtb3ZlZCBpbiB0aGlzIGl0ZXJhdGlvblxuICB0aGlzLmRpc3BsYWNlbWVudFggPSAwO1xuICB0aGlzLmRpc3BsYWNlbWVudFkgPSAwO1xuXG4gIC8vU3RhcnQgYW5kIGZpbmlzaCBncmlkIGNvb3JkaW5hdGVzIHRoYXQgdGhpcyBub2RlIGlzIGZhbGxlbiBpbnRvXG4gIHRoaXMuc3RhcnRYID0gMDtcbiAgdGhpcy5maW5pc2hYID0gMDtcbiAgdGhpcy5zdGFydFkgPSAwO1xuICB0aGlzLmZpbmlzaFkgPSAwO1xuXG4gIC8vR2VvbWV0cmljIG5laWdoYm9ycyBvZiB0aGlzIG5vZGVcbiAgdGhpcy5zdXJyb3VuZGluZyA9IFtdO1xufVxuXG5GRExheW91dE5vZGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMTm9kZS5wcm90b3R5cGUpO1xuXG5mb3IgKHZhciBwcm9wIGluIExOb2RlKSB7XG4gIEZETGF5b3V0Tm9kZVtwcm9wXSA9IExOb2RlW3Byb3BdO1xufVxuXG5GRExheW91dE5vZGUucHJvdG90eXBlLnNldEdyaWRDb29yZGluYXRlcyA9IGZ1bmN0aW9uIChfc3RhcnRYLCBfZmluaXNoWCwgX3N0YXJ0WSwgX2ZpbmlzaFkpIHtcbiAgdGhpcy5zdGFydFggPSBfc3RhcnRYO1xuICB0aGlzLmZpbmlzaFggPSBfZmluaXNoWDtcbiAgdGhpcy5zdGFydFkgPSBfc3RhcnRZO1xuICB0aGlzLmZpbmlzaFkgPSBfZmluaXNoWTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRkRMYXlvdXROb2RlO1xuXG4vKioqLyB9KSxcbi8qIDIxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIERpbWVuc2lvbkQod2lkdGgsIGhlaWdodCkge1xuICB0aGlzLndpZHRoID0gMDtcbiAgdGhpcy5oZWlnaHQgPSAwO1xuICBpZiAod2lkdGggIT09IG51bGwgJiYgaGVpZ2h0ICE9PSBudWxsKSB7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICB9XG59XG5cbkRpbWVuc2lvbkQucHJvdG90eXBlLmdldFdpZHRoID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53aWR0aDtcbn07XG5cbkRpbWVuc2lvbkQucHJvdG90eXBlLnNldFdpZHRoID0gZnVuY3Rpb24gKHdpZHRoKSB7XG4gIHRoaXMud2lkdGggPSB3aWR0aDtcbn07XG5cbkRpbWVuc2lvbkQucHJvdG90eXBlLmdldEhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuaGVpZ2h0O1xufTtcblxuRGltZW5zaW9uRC5wcm90b3R5cGUuc2V0SGVpZ2h0ID0gZnVuY3Rpb24gKGhlaWdodCkge1xuICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRGltZW5zaW9uRDtcblxuLyoqKi8gfSksXG4vKiAyMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgVW5pcXVlSURHZW5lcmV0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KTtcblxuZnVuY3Rpb24gSGFzaE1hcCgpIHtcbiAgdGhpcy5tYXAgPSB7fTtcbiAgdGhpcy5rZXlzID0gW107XG59XG5cbkhhc2hNYXAucHJvdG90eXBlLnB1dCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHZhciB0aGVJZCA9IFVuaXF1ZUlER2VuZXJldG9yLmNyZWF0ZUlEKGtleSk7XG4gIGlmICghdGhpcy5jb250YWlucyh0aGVJZCkpIHtcbiAgICB0aGlzLm1hcFt0aGVJZF0gPSB2YWx1ZTtcbiAgICB0aGlzLmtleXMucHVzaChrZXkpO1xuICB9XG59O1xuXG5IYXNoTWFwLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgdmFyIHRoZUlkID0gVW5pcXVlSURHZW5lcmV0b3IuY3JlYXRlSUQoa2V5KTtcbiAgcmV0dXJuIHRoaXMubWFwW2tleV0gIT0gbnVsbDtcbn07XG5cbkhhc2hNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgdmFyIHRoZUlkID0gVW5pcXVlSURHZW5lcmV0b3IuY3JlYXRlSUQoa2V5KTtcbiAgcmV0dXJuIHRoaXMubWFwW3RoZUlkXTtcbn07XG5cbkhhc2hNYXAucHJvdG90eXBlLmtleVNldCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMua2V5cztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gSGFzaE1hcDtcblxuLyoqKi8gfSksXG4vKiAyMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgVW5pcXVlSURHZW5lcmV0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KTtcblxuZnVuY3Rpb24gSGFzaFNldCgpIHtcbiAgdGhpcy5zZXQgPSB7fTtcbn1cbjtcblxuSGFzaFNldC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKG9iaikge1xuICB2YXIgdGhlSWQgPSBVbmlxdWVJREdlbmVyZXRvci5jcmVhdGVJRChvYmopO1xuICBpZiAoIXRoaXMuY29udGFpbnModGhlSWQpKSB0aGlzLnNldFt0aGVJZF0gPSBvYmo7XG59O1xuXG5IYXNoU2V0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAob2JqKSB7XG4gIGRlbGV0ZSB0aGlzLnNldFtVbmlxdWVJREdlbmVyZXRvci5jcmVhdGVJRChvYmopXTtcbn07XG5cbkhhc2hTZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLnNldCA9IHt9O1xufTtcblxuSGFzaFNldC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB0aGlzLnNldFtVbmlxdWVJREdlbmVyZXRvci5jcmVhdGVJRChvYmopXSA9PSBvYmo7XG59O1xuXG5IYXNoU2V0LnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5zaXplKCkgPT09IDA7XG59O1xuXG5IYXNoU2V0LnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5zZXQpLmxlbmd0aDtcbn07XG5cbi8vY29uY2F0cyB0aGlzLnNldCB0byB0aGUgZ2l2ZW4gbGlzdFxuSGFzaFNldC5wcm90b3R5cGUuYWRkQWxsVG8gPSBmdW5jdGlvbiAobGlzdCkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuc2V0KTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgbGlzdC5wdXNoKHRoaXMuc2V0W2tleXNbaV1dKTtcbiAgfVxufTtcblxuSGFzaFNldC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuc2V0KS5sZW5ndGg7XG59O1xuXG5IYXNoU2V0LnByb3RvdHlwZS5hZGRBbGwgPSBmdW5jdGlvbiAobGlzdCkge1xuICB2YXIgcyA9IGxpc3QubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHM7IGkrKykge1xuICAgIHZhciB2ID0gbGlzdFtpXTtcbiAgICB0aGlzLmFkZCh2KTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBIYXNoU2V0O1xuXG4vKioqLyB9KSxcbi8qIDI0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbi8vIFNvbWUgbWF0cml4ICgxZCBhbmQgMmQgYXJyYXkpIG9wZXJhdGlvbnNcbmZ1bmN0aW9uIE1hdHJpeCgpIHt9XG5cbi8qKlxuICogbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gKiBhcnJheTEsIGFycmF5MiBhbmQgcmVzdWx0IGFyZSAyZCBhcnJheXNcbiAqL1xuTWF0cml4Lm11bHRNYXQgPSBmdW5jdGlvbiAoYXJyYXkxLCBhcnJheTIpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkxLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzdWx0W2ldID0gW107XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBhcnJheTJbMF0ubGVuZ3RoOyBqKyspIHtcbiAgICAgIHJlc3VsdFtpXVtqXSA9IDA7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IGFycmF5MVswXS5sZW5ndGg7IGsrKykge1xuICAgICAgICByZXN1bHRbaV1bal0gKz0gYXJyYXkxW2ldW2tdICogYXJyYXkyW2tdW2pdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBtYXRyaXggdHJhbnNwb3NlXG4gKiBhcnJheSBhbmQgcmVzdWx0IGFyZSAyZCBhcnJheXNcbiAqL1xuTWF0cml4LnRyYW5zcG9zZSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheVswXS5sZW5ndGg7IGkrKykge1xuICAgIHJlc3VsdFtpXSA9IFtdO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgYXJyYXkubGVuZ3RoOyBqKyspIHtcbiAgICAgIHJlc3VsdFtpXVtqXSA9IGFycmF5W2pdW2ldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIG11bHRpcGx5IGFycmF5IHdpdGggY29uc3RhbnRcbiAqIGFycmF5IGFuZCByZXN1bHQgYXJlIDFkIGFycmF5c1xuICovXG5NYXRyaXgubXVsdENvbnMgPSBmdW5jdGlvbiAoYXJyYXksIGNvbnN0YW50KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzdWx0W2ldID0gYXJyYXlbaV0gKiBjb25zdGFudDtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIHN1YnN0cmFjdCB0d28gYXJyYXlzXG4gKiBhcnJheTEsIGFycmF5MiBhbmQgcmVzdWx0IGFyZSAxZCBhcnJheXNcbiAqL1xuTWF0cml4Lm1pbnVzT3AgPSBmdW5jdGlvbiAoYXJyYXkxLCBhcnJheTIpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkxLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzdWx0W2ldID0gYXJyYXkxW2ldIC0gYXJyYXkyW2ldO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogZG90IHByb2R1Y3Qgb2YgdHdvIGFycmF5cyB3aXRoIHNhbWUgc2l6ZVxuICogYXJyYXkxIGFuZCBhcnJheTIgYXJlIDFkIGFycmF5c1xuICovXG5NYXRyaXguZG90UHJvZHVjdCA9IGZ1bmN0aW9uIChhcnJheTEsIGFycmF5Mikge1xuICB2YXIgcHJvZHVjdCA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheTEubGVuZ3RoOyBpKyspIHtcbiAgICBwcm9kdWN0ICs9IGFycmF5MVtpXSAqIGFycmF5MltpXTtcbiAgfVxuXG4gIHJldHVybiBwcm9kdWN0O1xufTtcblxuLyoqXG4gKiBtYWduaXR1ZGUgb2YgYW4gYXJyYXlcbiAqIGFycmF5IGlzIDFkIGFycmF5XG4gKi9cbk1hdHJpeC5tYWcgPSBmdW5jdGlvbiAoYXJyYXkpIHtcbiAgcmV0dXJuIE1hdGguc3FydCh0aGlzLmRvdFByb2R1Y3QoYXJyYXksIGFycmF5KSk7XG59O1xuXG4vKipcbiAqIG5vcm1hbGl6YXRpb24gb2YgYW4gYXJyYXlcbiAqIGFycmF5IGFuZCByZXN1bHQgYXJlIDFkIGFycmF5XG4gKi9cbk1hdHJpeC5ub3JtYWxpemUgPSBmdW5jdGlvbiAoYXJyYXkpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgbWFnbml0dWRlID0gdGhpcy5tYWcoYXJyYXkpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRbaV0gPSBhcnJheVtpXSAvIG1hZ25pdHVkZTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIG11bHRpcGx5IGFuIGFycmF5IHdpdGggY2VudGVyaW5nIG1hdHJpeFxuICogYXJyYXkgYW5kIHJlc3VsdCBhcmUgMWQgYXJyYXlcbiAqL1xuTWF0cml4Lm11bHRHYW1tYSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBzdW0gPSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICBzdW0gKz0gYXJyYXlbaV07XG4gIH1cblxuICBzdW0gKj0gLTEgLyBhcnJheS5sZW5ndGg7XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFycmF5Lmxlbmd0aDsgX2krKykge1xuICAgIHJlc3VsdFtfaV0gPSBzdW0gKyBhcnJheVtfaV07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogYSBzcGVjaWFsIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuICogcmVzdWx0ID0gMC41ICogQyAqIElOViAqIENeVCAqIGFycmF5XG4gKiBhcnJheSBhbmQgcmVzdWx0IGFyZSAxZCwgQyBhbmQgSU5WIGFyZSAyZCBhcnJheXNcbiAqL1xuTWF0cml4Lm11bHRMID0gZnVuY3Rpb24gKGFycmF5LCBDLCBJTlYpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgdGVtcDEgPSBbXTtcbiAgdmFyIHRlbXAyID0gW107XG5cbiAgLy8gbXVsdGlwbHkgYnkgQ15UXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgQ1swXS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzdW0gPSAwO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgQy5sZW5ndGg7IGorKykge1xuICAgICAgc3VtICs9IC0wLjUgKiBDW2pdW2ldICogYXJyYXlbal07XG4gICAgfVxuICAgIHRlbXAxW2ldID0gc3VtO1xuICB9XG4gIC8vIG11bHRpcGx5IHRoZSByZXN1bHQgYnkgSU5WXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IElOVi5sZW5ndGg7IF9pMisrKSB7XG4gICAgdmFyIF9zdW0gPSAwO1xuICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBJTlYubGVuZ3RoOyBfaisrKSB7XG4gICAgICBfc3VtICs9IElOVltfaTJdW19qXSAqIHRlbXAxW19qXTtcbiAgICB9XG4gICAgdGVtcDJbX2kyXSA9IF9zdW07XG4gIH1cbiAgLy8gbXVsdGlwbHkgdGhlIHJlc3VsdCBieSBDXG4gIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IEMubGVuZ3RoOyBfaTMrKykge1xuICAgIHZhciBfc3VtMiA9IDA7XG4gICAgZm9yICh2YXIgX2oyID0gMDsgX2oyIDwgQ1swXS5sZW5ndGg7IF9qMisrKSB7XG4gICAgICBfc3VtMiArPSBDW19pM11bX2oyXSAqIHRlbXAyW19qMl07XG4gICAgfVxuICAgIHJlc3VsdFtfaTNdID0gX3N1bTI7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBNYXRyaXg7XG5cbi8qKiovIH0pLFxuLyogMjUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuLyoqXG4gKiBBIGNsYXNzaWMgUXVpY2tzb3J0IGFsZ29yaXRobSB3aXRoIEhvYXJlJ3MgcGFydGl0aW9uXG4gKiAtIFdvcmtzIGFsc28gb24gTGlua2VkTGlzdCBvYmplY3RzXG4gKlxuICogQ29weXJpZ2h0OiBpLVZpcyBSZXNlYXJjaCBHcm91cCwgQmlsa2VudCBVbml2ZXJzaXR5LCAyMDA3IC0gcHJlc2VudFxuICovXG5cbnZhciBMaW5rZWRMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSk7XG5cbnZhciBRdWlja3NvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUXVpY2tzb3J0KEEsIGNvbXBhcmVGdW5jdGlvbikge1xuICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUXVpY2tzb3J0KTtcblxuICAgICAgICBpZiAoY29tcGFyZUZ1bmN0aW9uICE9PSBudWxsIHx8IGNvbXBhcmVGdW5jdGlvbiAhPT0gdW5kZWZpbmVkKSB0aGlzLmNvbXBhcmVGdW5jdGlvbiA9IHRoaXMuX2RlZmF1bHRDb21wYXJlRnVuY3Rpb247XG5cbiAgICAgICAgdmFyIGxlbmd0aCA9IHZvaWQgMDtcbiAgICAgICAgaWYgKEEgaW5zdGFuY2VvZiBMaW5rZWRMaXN0KSBsZW5ndGggPSBBLnNpemUoKTtlbHNlIGxlbmd0aCA9IEEubGVuZ3RoO1xuXG4gICAgICAgIHRoaXMuX3F1aWNrc29ydChBLCAwLCBsZW5ndGggLSAxKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlQ2xhc3MoUXVpY2tzb3J0LCBbe1xuICAgICAgICBrZXk6ICdfcXVpY2tzb3J0JyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9xdWlja3NvcnQoQSwgcCwgcikge1xuICAgICAgICAgICAgaWYgKHAgPCByKSB7XG4gICAgICAgICAgICAgICAgdmFyIHEgPSB0aGlzLl9wYXJ0aXRpb24oQSwgcCwgcik7XG4gICAgICAgICAgICAgICAgdGhpcy5fcXVpY2tzb3J0KEEsIHAsIHEpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3F1aWNrc29ydChBLCBxICsgMSwgcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ19wYXJ0aXRpb24nLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3BhcnRpdGlvbihBLCBwLCByKSB7XG4gICAgICAgICAgICB2YXIgeCA9IHRoaXMuX2dldChBLCBwKTtcbiAgICAgICAgICAgIHZhciBpID0gcDtcbiAgICAgICAgICAgIHZhciBqID0gcjtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuY29tcGFyZUZ1bmN0aW9uKHgsIHRoaXMuX2dldChBLCBqKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgICAgIH13aGlsZSAodGhpcy5jb21wYXJlRnVuY3Rpb24odGhpcy5fZ2V0KEEsIGkpLCB4KSkge1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfWlmIChpIDwgaikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zd2FwKEEsIGksIGopO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgcmV0dXJuIGo7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ19nZXQnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX2dldChvYmplY3QsIGluZGV4KSB7XG4gICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTGlua2VkTGlzdCkgcmV0dXJuIG9iamVjdC5nZXRfb2JqZWN0X2F0KGluZGV4KTtlbHNlIHJldHVybiBvYmplY3RbaW5kZXhdO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdfc2V0JyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9zZXQob2JqZWN0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBMaW5rZWRMaXN0KSBvYmplY3Quc2V0X29iamVjdF9hdChpbmRleCwgdmFsdWUpO2Vsc2Ugb2JqZWN0W2luZGV4XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdfc3dhcCcsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfc3dhcChBLCBpLCBqKSB7XG4gICAgICAgICAgICB2YXIgdGVtcCA9IHRoaXMuX2dldChBLCBpKTtcbiAgICAgICAgICAgIHRoaXMuX3NldChBLCBpLCB0aGlzLl9nZXQoQSwgaikpO1xuICAgICAgICAgICAgdGhpcy5fc2V0KEEsIGosIHRlbXApO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdfZGVmYXVsdENvbXBhcmVGdW5jdGlvbicsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVmYXVsdENvbXBhcmVGdW5jdGlvbihhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gYiA+IGE7XG4gICAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gUXVpY2tzb3J0O1xufSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFF1aWNrc29ydDtcblxuLyoqKi8gfSksXG4vKiAyNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG4vLyBTaW5ndWxhciBWYWx1ZSBEZWNvbXBvc2l0aW9uIGltcGxlbWVudGF0aW9uXG5mdW5jdGlvbiBTVkQoKSB7fTtcblxuLyogQmVsb3cgc2luZ3VsYXIgdmFsdWUgZGVjb21wb3NpdGlvbiAoc3ZkKSBjb2RlIGluY2x1ZGluZyBoeXBvdCBmdW5jdGlvbiBpcyBhZG9wdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2RyYWdvbmZseS1haS9KYW1hSlNcbiAgIFNvbWUgY2hhbmdlcyBhcmUgYXBwbGllZCB0byBtYWtlIHRoZSBjb2RlIGNvbXBhdGlibGUgd2l0aCB0aGUgZmNvc2UgY29kZSBhbmQgdG8gbWFrZSBpdCBpbmRlcGVuZGVudCBmcm9tIEphbWEuXG4gICBJbnB1dCBtYXRyaXggaXMgY2hhbmdlZCB0byBhIDJEIGFycmF5IGluc3RlYWQgb2YgSmFtYSBtYXRyaXguIE1hdHJpeCBkaW1lbnNpb25zIGFyZSB0YWtlbiBhY2NvcmRpbmcgdG8gMkQgYXJyYXkgaW5zdGVhZCBvZiB1c2luZyBKYW1hIGZ1bmN0aW9ucy5cbiAgIEFuIG9iamVjdCB0aGF0IGluY2x1ZGVzIHNpbmd1bGFyIHZhbHVlIGNvbXBvbmVudHMgaXMgY3JlYXRlZCBmb3IgcmV0dXJuLiBcbiAgIFRoZSB0eXBlcyBvZiBpbnB1dCBwYXJhbWV0ZXJzIG9mIHRoZSBoeXBvdCBmdW5jdGlvbiBhcmUgcmVtb3ZlZC4gXG4gICBsZXQgaXMgdXNlZCBpbnN0ZWFkIG9mIHZhciBmb3IgdGhlIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uLlxuKi9cbi8qXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDRcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9cblxuICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OXG5cbiAgIDEuIERlZmluaXRpb25zLlxuXG4gICAgICBcIkxpY2Vuc2VcIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sXG4gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC5cblxuICAgICAgXCJMaWNlbnNvclwiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieVxuICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLlxuXG4gICAgICBcIkxlZ2FsIEVudGl0eVwiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGxcbiAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb25cbiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sXG4gICAgICBcImNvbnRyb2xcIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZVxuICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3JcbiAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZVxuICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS5cblxuICAgICAgXCJZb3VcIiAob3IgXCJZb3VyXCIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHlcbiAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuXG5cbiAgICAgIFwiU291cmNlXCIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsXG4gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uXG4gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLlxuXG4gICAgICBcIk9iamVjdFwiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsXG4gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0XG4gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sXG4gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuXG5cbiAgICAgIFwiV29ya1wiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3JcbiAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGFcbiAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29ya1xuICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS5cblxuICAgICAgXCJEZXJpdmF0aXZlIFdvcmtzXCIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0XG4gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlXG4gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zXG4gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlc1xuICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluXG4gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsXG4gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLlxuXG4gICAgICBcIkNvbnRyaWJ1dGlvblwiIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nXG4gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zXG4gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHlcbiAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXJcbiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZlxuICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sIFwic3VibWl0dGVkXCJcbiAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnRcbiAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvXG4gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLFxuICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGVcbiAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dFxuICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2VcbiAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzIFwiTm90IGEgQ29udHJpYnV0aW9uLlwiXG5cbiAgICAgIFwiQ29udHJpYnV0b3JcIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHlcbiAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZFxuICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuXG5cbiAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLFxuICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGVcbiAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLFxuICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlXG4gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLlxuXG4gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcbiAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCxcbiAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlXG4gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSxcbiAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLFxuICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGVcbiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyXG4gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpXG4gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdVxuICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGFcbiAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmtcbiAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0XG4gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzXG4gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGVcbiAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC5cblxuICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGVcbiAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dFxuICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3VcbiAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG4gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvclxuICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kXG5cbiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXNcbiAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmRcblxuICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzXG4gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZFxuICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssXG4gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZlxuICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmRcblxuICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgXCJOT1RJQ0VcIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHNcbiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0XG4gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkXG4gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90XG4gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lXG4gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWRcbiAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yXG4gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsXG4gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZFxuICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50c1xuICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmRcbiAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvblxuICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlXG4gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkXG4gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkXG4gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLlxuXG4gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmRcbiAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnNcbiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3JcbiAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLFxuICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoXG4gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLlxuXG4gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsXG4gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmtcbiAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG4gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy5cbiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnlcbiAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkXG4gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuXG5cbiAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGVcbiAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvcixcbiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZVxuICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuXG5cbiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvclxuICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaFxuICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvclxuICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnNcbiAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEFcbiAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZVxuICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55XG4gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuXG5cbiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LFxuICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsXG4gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseVxuICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmVcbiAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCxcbiAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYVxuICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZVxuICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLFxuICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGxcbiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3JcbiAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy5cblxuICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZ1xuICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlcixcbiAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksXG4gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpc1xuICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHlcbiAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmXG4gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksXG4gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHlcbiAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb25cbiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LlxuXG4gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlNcblxuICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLlxuXG4gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZ1xuICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgXCJ7fVwiXG4gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZVxuICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGVcbiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYVxuICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZVxuICAgICAgc2FtZSBcInByaW50ZWQgcGFnZVwiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXJcbiAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy5cblxuICAgQ29weXJpZ2h0IHt5eXl5fSB7bmFtZSBvZiBjb3B5cmlnaHQgb3duZXJ9XG5cbiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuU1ZELnN2ZCA9IGZ1bmN0aW9uIChBKSB7XG4gIHRoaXMuVSA9IG51bGw7XG4gIHRoaXMuViA9IG51bGw7XG4gIHRoaXMucyA9IG51bGw7XG4gIHRoaXMubSA9IDA7XG4gIHRoaXMubiA9IDA7XG4gIHRoaXMubSA9IEEubGVuZ3RoO1xuICB0aGlzLm4gPSBBWzBdLmxlbmd0aDtcbiAgdmFyIG51ID0gTWF0aC5taW4odGhpcy5tLCB0aGlzLm4pO1xuICB0aGlzLnMgPSBmdW5jdGlvbiAocykge1xuICAgIHZhciBhID0gW107XG4gICAgd2hpbGUgKHMtLSA+IDApIHtcbiAgICAgIGEucHVzaCgwKTtcbiAgICB9cmV0dXJuIGE7XG4gIH0oTWF0aC5taW4odGhpcy5tICsgMSwgdGhpcy5uKSk7XG4gIHRoaXMuVSA9IGZ1bmN0aW9uIChkaW1zKSB7XG4gICAgdmFyIGFsbG9jYXRlID0gZnVuY3Rpb24gYWxsb2NhdGUoZGltcykge1xuICAgICAgaWYgKGRpbXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaW1zWzBdOyBpKyspIHtcbiAgICAgICAgICBhcnJheS5wdXNoKGFsbG9jYXRlKGRpbXMuc2xpY2UoMSkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gYWxsb2NhdGUoZGltcyk7XG4gIH0oW3RoaXMubSwgbnVdKTtcbiAgdGhpcy5WID0gZnVuY3Rpb24gKGRpbXMpIHtcbiAgICB2YXIgYWxsb2NhdGUgPSBmdW5jdGlvbiBhbGxvY2F0ZShkaW1zKSB7XG4gICAgICBpZiAoZGltcy5sZW5ndGggPT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBhcnJheSA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbXNbMF07IGkrKykge1xuICAgICAgICAgIGFycmF5LnB1c2goYWxsb2NhdGUoZGltcy5zbGljZSgxKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBhbGxvY2F0ZShkaW1zKTtcbiAgfShbdGhpcy5uLCB0aGlzLm5dKTtcbiAgdmFyIGUgPSBmdW5jdGlvbiAocykge1xuICAgIHZhciBhID0gW107XG4gICAgd2hpbGUgKHMtLSA+IDApIHtcbiAgICAgIGEucHVzaCgwKTtcbiAgICB9cmV0dXJuIGE7XG4gIH0odGhpcy5uKTtcbiAgdmFyIHdvcmsgPSBmdW5jdGlvbiAocykge1xuICAgIHZhciBhID0gW107XG4gICAgd2hpbGUgKHMtLSA+IDApIHtcbiAgICAgIGEucHVzaCgwKTtcbiAgICB9cmV0dXJuIGE7XG4gIH0odGhpcy5tKTtcbiAgdmFyIHdhbnR1ID0gdHJ1ZTtcbiAgdmFyIHdhbnR2ID0gdHJ1ZTtcbiAgdmFyIG5jdCA9IE1hdGgubWluKHRoaXMubSAtIDEsIHRoaXMubik7XG4gIHZhciBucnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLm4gLSAyLCB0aGlzLm0pKTtcbiAgZm9yICh2YXIgayA9IDA7IGsgPCBNYXRoLm1heChuY3QsIG5ydCk7IGsrKykge1xuICAgIGlmIChrIDwgbmN0KSB7XG4gICAgICB0aGlzLnNba10gPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IGs7IGkgPCB0aGlzLm07IGkrKykge1xuICAgICAgICB0aGlzLnNba10gPSBTVkQuaHlwb3QodGhpcy5zW2tdLCBBW2ldW2tdKTtcbiAgICAgIH1cbiAgICAgIDtcbiAgICAgIGlmICh0aGlzLnNba10gIT09IDAuMCkge1xuICAgICAgICBpZiAoQVtrXVtrXSA8IDAuMCkge1xuICAgICAgICAgIHRoaXMuc1trXSA9IC10aGlzLnNba107XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgX2kgPSBrOyBfaSA8IHRoaXMubTsgX2krKykge1xuICAgICAgICAgIEFbX2ldW2tdIC89IHRoaXMuc1trXTtcbiAgICAgICAgfVxuICAgICAgICA7XG4gICAgICAgIEFba11ba10gKz0gMS4wO1xuICAgICAgfVxuICAgICAgdGhpcy5zW2tdID0gLXRoaXMuc1trXTtcbiAgICB9XG4gICAgZm9yICh2YXIgaiA9IGsgKyAxOyBqIDwgdGhpcy5uOyBqKyspIHtcbiAgICAgIGlmIChmdW5jdGlvbiAobGhzLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIGxocyAmJiByaHM7XG4gICAgICB9KGsgPCBuY3QsIHRoaXMuc1trXSAhPT0gMC4wKSkge1xuICAgICAgICB2YXIgdCA9IDA7XG4gICAgICAgIGZvciAodmFyIF9pMiA9IGs7IF9pMiA8IHRoaXMubTsgX2kyKyspIHtcbiAgICAgICAgICB0ICs9IEFbX2kyXVtrXSAqIEFbX2kyXVtqXTtcbiAgICAgICAgfVxuICAgICAgICA7XG4gICAgICAgIHQgPSAtdCAvIEFba11ba107XG4gICAgICAgIGZvciAodmFyIF9pMyA9IGs7IF9pMyA8IHRoaXMubTsgX2kzKyspIHtcbiAgICAgICAgICBBW19pM11bal0gKz0gdCAqIEFbX2kzXVtrXTtcbiAgICAgICAgfVxuICAgICAgICA7XG4gICAgICB9XG4gICAgICBlW2pdID0gQVtrXVtqXTtcbiAgICB9XG4gICAgO1xuICAgIGlmIChmdW5jdGlvbiAobGhzLCByaHMpIHtcbiAgICAgIHJldHVybiBsaHMgJiYgcmhzO1xuICAgIH0od2FudHUsIGsgPCBuY3QpKSB7XG4gICAgICBmb3IgKHZhciBfaTQgPSBrOyBfaTQgPCB0aGlzLm07IF9pNCsrKSB7XG4gICAgICAgIHRoaXMuVVtfaTRdW2tdID0gQVtfaTRdW2tdO1xuICAgICAgfVxuICAgICAgO1xuICAgIH1cbiAgICBpZiAoayA8IG5ydCkge1xuICAgICAgZVtrXSA9IDA7XG4gICAgICBmb3IgKHZhciBfaTUgPSBrICsgMTsgX2k1IDwgdGhpcy5uOyBfaTUrKykge1xuICAgICAgICBlW2tdID0gU1ZELmh5cG90KGVba10sIGVbX2k1XSk7XG4gICAgICB9XG4gICAgICA7XG4gICAgICBpZiAoZVtrXSAhPT0gMC4wKSB7XG4gICAgICAgIGlmIChlW2sgKyAxXSA8IDAuMCkge1xuICAgICAgICAgIGVba10gPSAtZVtrXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBfaTYgPSBrICsgMTsgX2k2IDwgdGhpcy5uOyBfaTYrKykge1xuICAgICAgICAgIGVbX2k2XSAvPSBlW2tdO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgICAgZVtrICsgMV0gKz0gMS4wO1xuICAgICAgfVxuICAgICAgZVtrXSA9IC1lW2tdO1xuICAgICAgaWYgKGZ1bmN0aW9uIChsaHMsIHJocykge1xuICAgICAgICByZXR1cm4gbGhzICYmIHJocztcbiAgICAgIH0oayArIDEgPCB0aGlzLm0sIGVba10gIT09IDAuMCkpIHtcbiAgICAgICAgZm9yICh2YXIgX2k3ID0gayArIDE7IF9pNyA8IHRoaXMubTsgX2k3KyspIHtcbiAgICAgICAgICB3b3JrW19pN10gPSAwLjA7XG4gICAgICAgIH1cbiAgICAgICAgO1xuICAgICAgICBmb3IgKHZhciBfaiA9IGsgKyAxOyBfaiA8IHRoaXMubjsgX2orKykge1xuICAgICAgICAgIGZvciAodmFyIF9pOCA9IGsgKyAxOyBfaTggPCB0aGlzLm07IF9pOCsrKSB7XG4gICAgICAgICAgICB3b3JrW19pOF0gKz0gZVtfal0gKiBBW19pOF1bX2pdO1xuICAgICAgICAgIH1cbiAgICAgICAgICA7XG4gICAgICAgIH1cbiAgICAgICAgO1xuICAgICAgICBmb3IgKHZhciBfajIgPSBrICsgMTsgX2oyIDwgdGhpcy5uOyBfajIrKykge1xuICAgICAgICAgIHZhciBfdCA9IC1lW19qMl0gLyBlW2sgKyAxXTtcbiAgICAgICAgICBmb3IgKHZhciBfaTkgPSBrICsgMTsgX2k5IDwgdGhpcy5tOyBfaTkrKykge1xuICAgICAgICAgICAgQVtfaTldW19qMl0gKz0gX3QgKiB3b3JrW19pOV07XG4gICAgICAgICAgfVxuICAgICAgICAgIDtcbiAgICAgICAgfVxuICAgICAgICA7XG4gICAgICB9XG4gICAgICBpZiAod2FudHYpIHtcbiAgICAgICAgZm9yICh2YXIgX2kxMCA9IGsgKyAxOyBfaTEwIDwgdGhpcy5uOyBfaTEwKyspIHtcbiAgICAgICAgICB0aGlzLlZbX2kxMF1ba10gPSBlW19pMTBdO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIHAgPSBNYXRoLm1pbih0aGlzLm4sIHRoaXMubSArIDEpO1xuICBpZiAobmN0IDwgdGhpcy5uKSB7XG4gICAgdGhpcy5zW25jdF0gPSBBW25jdF1bbmN0XTtcbiAgfVxuICBpZiAodGhpcy5tIDwgcCkge1xuICAgIHRoaXMuc1twIC0gMV0gPSAwLjA7XG4gIH1cbiAgaWYgKG5ydCArIDEgPCBwKSB7XG4gICAgZVtucnRdID0gQVtucnRdW3AgLSAxXTtcbiAgfVxuICBlW3AgLSAxXSA9IDAuMDtcbiAgaWYgKHdhbnR1KSB7XG4gICAgZm9yICh2YXIgX2ozID0gbmN0OyBfajMgPCBudTsgX2ozKyspIHtcbiAgICAgIGZvciAodmFyIF9pMTEgPSAwOyBfaTExIDwgdGhpcy5tOyBfaTExKyspIHtcbiAgICAgICAgdGhpcy5VW19pMTFdW19qM10gPSAwLjA7XG4gICAgICB9XG4gICAgICA7XG4gICAgICB0aGlzLlVbX2ozXVtfajNdID0gMS4wO1xuICAgIH07XG4gICAgZm9yICh2YXIgX2sgPSBuY3QgLSAxOyBfayA+PSAwOyBfay0tKSB7XG4gICAgICBpZiAodGhpcy5zW19rXSAhPT0gMC4wKSB7XG4gICAgICAgIGZvciAodmFyIF9qNCA9IF9rICsgMTsgX2o0IDwgbnU7IF9qNCsrKSB7XG4gICAgICAgICAgdmFyIF90MiA9IDA7XG4gICAgICAgICAgZm9yICh2YXIgX2kxMiA9IF9rOyBfaTEyIDwgdGhpcy5tOyBfaTEyKyspIHtcbiAgICAgICAgICAgIF90MiArPSB0aGlzLlVbX2kxMl1bX2tdICogdGhpcy5VW19pMTJdW19qNF07XG4gICAgICAgICAgfTtcbiAgICAgICAgICBfdDIgPSAtX3QyIC8gdGhpcy5VW19rXVtfa107XG4gICAgICAgICAgZm9yICh2YXIgX2kxMyA9IF9rOyBfaTEzIDwgdGhpcy5tOyBfaTEzKyspIHtcbiAgICAgICAgICAgIHRoaXMuVVtfaTEzXVtfajRdICs9IF90MiAqIHRoaXMuVVtfaTEzXVtfa107XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yICh2YXIgX2kxNCA9IF9rOyBfaTE0IDwgdGhpcy5tOyBfaTE0KyspIHtcbiAgICAgICAgICB0aGlzLlVbX2kxNF1bX2tdID0gLXRoaXMuVVtfaTE0XVtfa107XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuVVtfa11bX2tdID0gMS4wICsgdGhpcy5VW19rXVtfa107XG4gICAgICAgIGZvciAodmFyIF9pMTUgPSAwOyBfaTE1IDwgX2sgLSAxOyBfaTE1KyspIHtcbiAgICAgICAgICB0aGlzLlVbX2kxNV1bX2tdID0gMC4wO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgX2kxNiA9IDA7IF9pMTYgPCB0aGlzLm07IF9pMTYrKykge1xuICAgICAgICAgIHRoaXMuVVtfaTE2XVtfa10gPSAwLjA7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuVVtfa11bX2tdID0gMS4wO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgaWYgKHdhbnR2KSB7XG4gICAgZm9yICh2YXIgX2syID0gdGhpcy5uIC0gMTsgX2syID49IDA7IF9rMi0tKSB7XG4gICAgICBpZiAoZnVuY3Rpb24gKGxocywgcmhzKSB7XG4gICAgICAgIHJldHVybiBsaHMgJiYgcmhzO1xuICAgICAgfShfazIgPCBucnQsIGVbX2syXSAhPT0gMC4wKSkge1xuICAgICAgICBmb3IgKHZhciBfajUgPSBfazIgKyAxOyBfajUgPCBudTsgX2o1KyspIHtcbiAgICAgICAgICB2YXIgX3QzID0gMDtcbiAgICAgICAgICBmb3IgKHZhciBfaTE3ID0gX2syICsgMTsgX2kxNyA8IHRoaXMubjsgX2kxNysrKSB7XG4gICAgICAgICAgICBfdDMgKz0gdGhpcy5WW19pMTddW19rMl0gKiB0aGlzLlZbX2kxN11bX2o1XTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIF90MyA9IC1fdDMgLyB0aGlzLlZbX2syICsgMV1bX2syXTtcbiAgICAgICAgICBmb3IgKHZhciBfaTE4ID0gX2syICsgMTsgX2kxOCA8IHRoaXMubjsgX2kxOCsrKSB7XG4gICAgICAgICAgICB0aGlzLlZbX2kxOF1bX2o1XSArPSBfdDMgKiB0aGlzLlZbX2kxOF1bX2syXTtcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgX2kxOSA9IDA7IF9pMTkgPCB0aGlzLm47IF9pMTkrKykge1xuICAgICAgICB0aGlzLlZbX2kxOV1bX2syXSA9IDAuMDtcbiAgICAgIH07XG4gICAgICB0aGlzLlZbX2syXVtfazJdID0gMS4wO1xuICAgIH07XG4gIH1cbiAgdmFyIHBwID0gcCAtIDE7XG4gIHZhciBpdGVyID0gMDtcbiAgdmFyIGVwcyA9IE1hdGgucG93KDIuMCwgLTUyLjApO1xuICB2YXIgdGlueSA9IE1hdGgucG93KDIuMCwgLTk2Ni4wKTtcbiAgd2hpbGUgKHAgPiAwKSB7XG4gICAgdmFyIF9rMyA9IHZvaWQgMDtcbiAgICB2YXIga2FzZSA9IHZvaWQgMDtcbiAgICBmb3IgKF9rMyA9IHAgLSAyOyBfazMgPj0gLTE7IF9rMy0tKSB7XG4gICAgICBpZiAoX2szID09PSAtMSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChNYXRoLmFicyhlW19rM10pIDw9IHRpbnkgKyBlcHMgKiAoTWF0aC5hYnModGhpcy5zW19rM10pICsgTWF0aC5hYnModGhpcy5zW19rMyArIDFdKSkpIHtcbiAgICAgICAgZVtfazNdID0gMC4wO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChfazMgPT09IHAgLSAyKSB7XG4gICAgICBrYXNlID0gNDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGtzID0gdm9pZCAwO1xuICAgICAgZm9yIChrcyA9IHAgLSAxOyBrcyA+PSBfazM7IGtzLS0pIHtcbiAgICAgICAgaWYgKGtzID09PSBfazMpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB2YXIgX3Q0ID0gKGtzICE9PSBwID8gTWF0aC5hYnMoZVtrc10pIDogMC4wKSArIChrcyAhPT0gX2szICsgMSA/IE1hdGguYWJzKGVba3MgLSAxXSkgOiAwLjApO1xuICAgICAgICBpZiAoTWF0aC5hYnModGhpcy5zW2tzXSkgPD0gdGlueSArIGVwcyAqIF90NCkge1xuICAgICAgICAgIHRoaXMuc1trc10gPSAwLjA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAoa3MgPT09IF9rMykge1xuICAgICAgICBrYXNlID0gMztcbiAgICAgIH0gZWxzZSBpZiAoa3MgPT09IHAgLSAxKSB7XG4gICAgICAgIGthc2UgPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAga2FzZSA9IDI7XG4gICAgICAgIF9rMyA9IGtzO1xuICAgICAgfVxuICAgIH1cbiAgICBfazMrKztcbiAgICBzd2l0Y2ggKGthc2UpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBmID0gZVtwIC0gMl07XG4gICAgICAgICAgZVtwIC0gMl0gPSAwLjA7XG4gICAgICAgICAgZm9yICh2YXIgX2o2ID0gcCAtIDI7IF9qNiA+PSBfazM7IF9qNi0tKSB7XG4gICAgICAgICAgICB2YXIgX3Q1ID0gU1ZELmh5cG90KHRoaXMuc1tfajZdLCBmKTtcbiAgICAgICAgICAgIHZhciBjcyA9IHRoaXMuc1tfajZdIC8gX3Q1O1xuICAgICAgICAgICAgdmFyIHNuID0gZiAvIF90NTtcbiAgICAgICAgICAgIHRoaXMuc1tfajZdID0gX3Q1O1xuICAgICAgICAgICAgaWYgKF9qNiAhPT0gX2szKSB7XG4gICAgICAgICAgICAgIGYgPSAtc24gKiBlW19qNiAtIDFdO1xuICAgICAgICAgICAgICBlW19qNiAtIDFdID0gY3MgKiBlW19qNiAtIDFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHdhbnR2KSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pMjAgPSAwOyBfaTIwIDwgdGhpcy5uOyBfaTIwKyspIHtcbiAgICAgICAgICAgICAgICBfdDUgPSBjcyAqIHRoaXMuVltfaTIwXVtfajZdICsgc24gKiB0aGlzLlZbX2kyMF1bcCAtIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVltfaTIwXVtwIC0gMV0gPSAtc24gKiB0aGlzLlZbX2kyMF1bX2o2XSArIGNzICogdGhpcy5WW19pMjBdW3AgLSAxXTtcbiAgICAgICAgICAgICAgICB0aGlzLlZbX2kyMF1bX2o2XSA9IF90NTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfZiA9IGVbX2szIC0gMV07XG4gICAgICAgICAgZVtfazMgLSAxXSA9IDAuMDtcbiAgICAgICAgICBmb3IgKHZhciBfajcgPSBfazM7IF9qNyA8IHA7IF9qNysrKSB7XG4gICAgICAgICAgICB2YXIgX3Q2ID0gU1ZELmh5cG90KHRoaXMuc1tfajddLCBfZik7XG4gICAgICAgICAgICB2YXIgX2NzID0gdGhpcy5zW19qN10gLyBfdDY7XG4gICAgICAgICAgICB2YXIgX3NuID0gX2YgLyBfdDY7XG4gICAgICAgICAgICB0aGlzLnNbX2o3XSA9IF90NjtcbiAgICAgICAgICAgIF9mID0gLV9zbiAqIGVbX2o3XTtcbiAgICAgICAgICAgIGVbX2o3XSA9IF9jcyAqIGVbX2o3XTtcbiAgICAgICAgICAgIGlmICh3YW50dSkge1xuICAgICAgICAgICAgICBmb3IgKHZhciBfaTIxID0gMDsgX2kyMSA8IHRoaXMubTsgX2kyMSsrKSB7XG4gICAgICAgICAgICAgICAgX3Q2ID0gX2NzICogdGhpcy5VW19pMjFdW19qN10gKyBfc24gKiB0aGlzLlVbX2kyMV1bX2szIC0gMV07XG4gICAgICAgICAgICAgICAgdGhpcy5VW19pMjFdW19rMyAtIDFdID0gLV9zbiAqIHRoaXMuVVtfaTIxXVtfajddICsgX2NzICogdGhpcy5VW19pMjFdW19rMyAtIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVtfaTIxXVtfajddID0gX3Q2O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHNjYWxlID0gTWF0aC5tYXgoTWF0aC5tYXgoTWF0aC5tYXgoTWF0aC5tYXgoTWF0aC5hYnModGhpcy5zW3AgLSAxXSksIE1hdGguYWJzKHRoaXMuc1twIC0gMl0pKSwgTWF0aC5hYnMoZVtwIC0gMl0pKSwgTWF0aC5hYnModGhpcy5zW19rM10pKSwgTWF0aC5hYnMoZVtfazNdKSk7XG4gICAgICAgICAgdmFyIHNwID0gdGhpcy5zW3AgLSAxXSAvIHNjYWxlO1xuICAgICAgICAgIHZhciBzcG0xID0gdGhpcy5zW3AgLSAyXSAvIHNjYWxlO1xuICAgICAgICAgIHZhciBlcG0xID0gZVtwIC0gMl0gLyBzY2FsZTtcbiAgICAgICAgICB2YXIgc2sgPSB0aGlzLnNbX2szXSAvIHNjYWxlO1xuICAgICAgICAgIHZhciBlayA9IGVbX2szXSAvIHNjYWxlO1xuICAgICAgICAgIHZhciBiID0gKChzcG0xICsgc3ApICogKHNwbTEgLSBzcCkgKyBlcG0xICogZXBtMSkgLyAyLjA7XG4gICAgICAgICAgdmFyIGMgPSBzcCAqIGVwbTEgKiAoc3AgKiBlcG0xKTtcbiAgICAgICAgICB2YXIgc2hpZnQgPSAwLjA7XG4gICAgICAgICAgaWYgKGZ1bmN0aW9uIChsaHMsIHJocykge1xuICAgICAgICAgICAgcmV0dXJuIGxocyB8fCByaHM7XG4gICAgICAgICAgfShiICE9PSAwLjAsIGMgIT09IDAuMCkpIHtcbiAgICAgICAgICAgIHNoaWZ0ID0gTWF0aC5zcXJ0KGIgKiBiICsgYyk7XG4gICAgICAgICAgICBpZiAoYiA8IDAuMCkge1xuICAgICAgICAgICAgICBzaGlmdCA9IC1zaGlmdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNoaWZ0ID0gYyAvIChiICsgc2hpZnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgX2YyID0gKHNrICsgc3ApICogKHNrIC0gc3ApICsgc2hpZnQ7XG4gICAgICAgICAgdmFyIGcgPSBzayAqIGVrO1xuICAgICAgICAgIGZvciAodmFyIF9qOCA9IF9rMzsgX2o4IDwgcCAtIDE7IF9qOCsrKSB7XG4gICAgICAgICAgICB2YXIgX3Q3ID0gU1ZELmh5cG90KF9mMiwgZyk7XG4gICAgICAgICAgICB2YXIgX2NzMiA9IF9mMiAvIF90NztcbiAgICAgICAgICAgIHZhciBfc24yID0gZyAvIF90NztcbiAgICAgICAgICAgIGlmIChfajggIT09IF9rMykge1xuICAgICAgICAgICAgICBlW19qOCAtIDFdID0gX3Q3O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2YyID0gX2NzMiAqIHRoaXMuc1tfajhdICsgX3NuMiAqIGVbX2o4XTtcbiAgICAgICAgICAgIGVbX2o4XSA9IF9jczIgKiBlW19qOF0gLSBfc24yICogdGhpcy5zW19qOF07XG4gICAgICAgICAgICBnID0gX3NuMiAqIHRoaXMuc1tfajggKyAxXTtcbiAgICAgICAgICAgIHRoaXMuc1tfajggKyAxXSA9IF9jczIgKiB0aGlzLnNbX2o4ICsgMV07XG4gICAgICAgICAgICBpZiAod2FudHYpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgX2kyMiA9IDA7IF9pMjIgPCB0aGlzLm47IF9pMjIrKykge1xuICAgICAgICAgICAgICAgIF90NyA9IF9jczIgKiB0aGlzLlZbX2kyMl1bX2o4XSArIF9zbjIgKiB0aGlzLlZbX2kyMl1bX2o4ICsgMV07XG4gICAgICAgICAgICAgICAgdGhpcy5WW19pMjJdW19qOCArIDFdID0gLV9zbjIgKiB0aGlzLlZbX2kyMl1bX2o4XSArIF9jczIgKiB0aGlzLlZbX2kyMl1bX2o4ICsgMV07XG4gICAgICAgICAgICAgICAgdGhpcy5WW19pMjJdW19qOF0gPSBfdDc7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdDcgPSBTVkQuaHlwb3QoX2YyLCBnKTtcbiAgICAgICAgICAgIF9jczIgPSBfZjIgLyBfdDc7XG4gICAgICAgICAgICBfc24yID0gZyAvIF90NztcbiAgICAgICAgICAgIHRoaXMuc1tfajhdID0gX3Q3O1xuICAgICAgICAgICAgX2YyID0gX2NzMiAqIGVbX2o4XSArIF9zbjIgKiB0aGlzLnNbX2o4ICsgMV07XG4gICAgICAgICAgICB0aGlzLnNbX2o4ICsgMV0gPSAtX3NuMiAqIGVbX2o4XSArIF9jczIgKiB0aGlzLnNbX2o4ICsgMV07XG4gICAgICAgICAgICBnID0gX3NuMiAqIGVbX2o4ICsgMV07XG4gICAgICAgICAgICBlW19qOCArIDFdID0gX2NzMiAqIGVbX2o4ICsgMV07XG4gICAgICAgICAgICBpZiAod2FudHUgJiYgX2o4IDwgdGhpcy5tIC0gMSkge1xuICAgICAgICAgICAgICBmb3IgKHZhciBfaTIzID0gMDsgX2kyMyA8IHRoaXMubTsgX2kyMysrKSB7XG4gICAgICAgICAgICAgICAgX3Q3ID0gX2NzMiAqIHRoaXMuVVtfaTIzXVtfajhdICsgX3NuMiAqIHRoaXMuVVtfaTIzXVtfajggKyAxXTtcbiAgICAgICAgICAgICAgICB0aGlzLlVbX2kyM11bX2o4ICsgMV0gPSAtX3NuMiAqIHRoaXMuVVtfaTIzXVtfajhdICsgX2NzMiAqIHRoaXMuVVtfaTIzXVtfajggKyAxXTtcbiAgICAgICAgICAgICAgICB0aGlzLlVbX2kyM11bX2o4XSA9IF90NztcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGVbcCAtIDJdID0gX2YyO1xuICAgICAgICAgIGl0ZXIgPSBpdGVyICsgMTtcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAodGhpcy5zW19rM10gPD0gMC4wKSB7XG4gICAgICAgICAgICB0aGlzLnNbX2szXSA9IHRoaXMuc1tfazNdIDwgMC4wID8gLXRoaXMuc1tfazNdIDogMC4wO1xuICAgICAgICAgICAgaWYgKHdhbnR2KSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pMjQgPSAwOyBfaTI0IDw9IHBwOyBfaTI0KyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLlZbX2kyNF1bX2szXSA9IC10aGlzLlZbX2kyNF1bX2szXTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgd2hpbGUgKF9rMyA8IHBwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zW19rM10gPj0gdGhpcy5zW19rMyArIDFdKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIF90OCA9IHRoaXMuc1tfazNdO1xuICAgICAgICAgICAgdGhpcy5zW19rM10gPSB0aGlzLnNbX2szICsgMV07XG4gICAgICAgICAgICB0aGlzLnNbX2szICsgMV0gPSBfdDg7XG4gICAgICAgICAgICBpZiAod2FudHYgJiYgX2szIDwgdGhpcy5uIC0gMSkge1xuICAgICAgICAgICAgICBmb3IgKHZhciBfaTI1ID0gMDsgX2kyNSA8IHRoaXMubjsgX2kyNSsrKSB7XG4gICAgICAgICAgICAgICAgX3Q4ID0gdGhpcy5WW19pMjVdW19rMyArIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVltfaTI1XVtfazMgKyAxXSA9IHRoaXMuVltfaTI1XVtfazNdO1xuICAgICAgICAgICAgICAgIHRoaXMuVltfaTI1XVtfazNdID0gX3Q4O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHdhbnR1ICYmIF9rMyA8IHRoaXMubSAtIDEpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgX2kyNiA9IDA7IF9pMjYgPCB0aGlzLm07IF9pMjYrKykge1xuICAgICAgICAgICAgICAgIF90OCA9IHRoaXMuVVtfaTI2XVtfazMgKyAxXTtcbiAgICAgICAgICAgICAgICB0aGlzLlVbX2kyNl1bX2szICsgMV0gPSB0aGlzLlVbX2kyNl1bX2szXTtcbiAgICAgICAgICAgICAgICB0aGlzLlVbX2kyNl1bX2szXSA9IF90ODtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9rMysrO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaXRlciA9IDA7XG4gICAgICAgICAgcC0tO1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH07XG4gIHZhciByZXN1bHQgPSB7IFU6IHRoaXMuVSwgVjogdGhpcy5WLCBTOiB0aGlzLnMgfTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIHNxcnQoYV4yICsgYl4yKSB3aXRob3V0IHVuZGVyL292ZXJmbG93LlxuU1ZELmh5cG90ID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgdmFyIHIgPSB2b2lkIDA7XG4gIGlmIChNYXRoLmFicyhhKSA+IE1hdGguYWJzKGIpKSB7XG4gICAgciA9IGIgLyBhO1xuICAgIHIgPSBNYXRoLmFicyhhKSAqIE1hdGguc3FydCgxICsgciAqIHIpO1xuICB9IGVsc2UgaWYgKGIgIT0gMCkge1xuICAgIHIgPSBhIC8gYjtcbiAgICByID0gTWF0aC5hYnMoYikgKiBNYXRoLnNxcnQoMSArIHIgKiByKTtcbiAgfSBlbHNlIHtcbiAgICByID0gMC4wO1xuICB9XG4gIHJldHVybiByO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBTVkQ7XG5cbi8qKiovIH0pLFxuLyogMjcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuLyoqXG4gKiAgIE5lZWRsZW1hbi1XdW5zY2ggYWxnb3JpdGhtIGlzIGFuIHByb2NlZHVyZSB0byBjb21wdXRlIHRoZSBvcHRpbWFsIGdsb2JhbCBhbGlnbm1lbnQgb2YgdHdvIHN0cmluZ1xuICogICBzZXF1ZW5jZXMgYnkgUy5CLk5lZWRsZW1hbiBhbmQgQy5ELld1bnNjaCAoMTk3MCkuXG4gKlxuICogICBBc2lkZSBmcm9tIHRoZSBpbnB1dHMsIHlvdSBjYW4gYXNzaWduIHRoZSBzY29yZXMgZm9yLFxuICogICAtIE1hdGNoOiBUaGUgdHdvIGNoYXJhY3RlcnMgYXQgdGhlIGN1cnJlbnQgaW5kZXggYXJlIHNhbWUuXG4gKiAgIC0gTWlzbWF0Y2g6IFRoZSB0d28gY2hhcmFjdGVycyBhdCB0aGUgY3VycmVudCBpbmRleCBhcmUgZGlmZmVyZW50LlxuICogICAtIEluc2VydGlvbi9EZWxldGlvbihnYXBzKTogVGhlIGJlc3QgYWxpZ25tZW50IGludm9sdmVzIG9uZSBsZXR0ZXIgYWxpZ25pbmcgdG8gYSBnYXAgaW4gdGhlIG90aGVyIHN0cmluZy5cbiAqL1xuXG52YXIgTmVlZGxlbWFuV3Vuc2NoID0gZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5lZWRsZW1hbld1bnNjaChzZXF1ZW5jZTEsIHNlcXVlbmNlMikge1xuICAgICAgICB2YXIgbWF0Y2hfc2NvcmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IDE7XG4gICAgICAgIHZhciBtaXNtYXRjaF9wZW5hbHR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiAtMTtcbiAgICAgICAgdmFyIGdhcF9wZW5hbHR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiAtMTtcblxuICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTmVlZGxlbWFuV3Vuc2NoKTtcblxuICAgICAgICB0aGlzLnNlcXVlbmNlMSA9IHNlcXVlbmNlMTtcbiAgICAgICAgdGhpcy5zZXF1ZW5jZTIgPSBzZXF1ZW5jZTI7XG4gICAgICAgIHRoaXMubWF0Y2hfc2NvcmUgPSBtYXRjaF9zY29yZTtcbiAgICAgICAgdGhpcy5taXNtYXRjaF9wZW5hbHR5ID0gbWlzbWF0Y2hfcGVuYWx0eTtcbiAgICAgICAgdGhpcy5nYXBfcGVuYWx0eSA9IGdhcF9wZW5hbHR5O1xuXG4gICAgICAgIC8vIEp1c3QgdGhlIHJlbW92ZSByZWR1bmRhbmN5XG4gICAgICAgIHRoaXMuaU1heCA9IHNlcXVlbmNlMS5sZW5ndGggKyAxO1xuICAgICAgICB0aGlzLmpNYXggPSBzZXF1ZW5jZTIubGVuZ3RoICsgMTtcblxuICAgICAgICAvLyBHcmlkIG1hdHJpeCBvZiBzY29yZXNcbiAgICAgICAgdGhpcy5ncmlkID0gbmV3IEFycmF5KHRoaXMuaU1heCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pTWF4OyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZFtpXSA9IG5ldyBBcnJheSh0aGlzLmpNYXgpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuak1heDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkW2ldW2pdID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYWNlYmFjayBtYXRyaXggKDJEIGFycmF5LCBlYWNoIGNlbGwgaXMgYW4gYXJyYXkgb2YgYm9vbGVhbiB2YWx1ZXMgZm9yIFtgRGlhZ2AsIGBVcGAsIGBMZWZ0YF0gcG9zaXRpb25zKVxuICAgICAgICB0aGlzLnRyYWNlYmFja0dyaWQgPSBuZXcgQXJyYXkodGhpcy5pTWF4KTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHRoaXMuaU1heDsgX2krKykge1xuICAgICAgICAgICAgdGhpcy50cmFjZWJhY2tHcmlkW19pXSA9IG5ldyBBcnJheSh0aGlzLmpNYXgpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBfaiA9IDA7IF9qIDwgdGhpcy5qTWF4OyBfaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFjZWJhY2tHcmlkW19pXVtfal0gPSBbbnVsbCwgbnVsbCwgbnVsbF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgYWxpZ25lZCBzZXF1ZW5jZXMgKHJldHVybiBtdWx0aXBsZSBwb3NzaWJpbGl0aWVzKVxuICAgICAgICB0aGlzLmFsaWdubWVudHMgPSBbXTtcblxuICAgICAgICAvLyBGaW5hbCBhbGlnbm1lbnQgc2NvcmVcbiAgICAgICAgdGhpcy5zY29yZSA9IC0xO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBzY29yZXMgYW5kIHRyYWNlYmFja3NcbiAgICAgICAgdGhpcy5jb21wdXRlR3JpZHMoKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlQ2xhc3MoTmVlZGxlbWFuV3Vuc2NoLCBbe1xuICAgICAgICBrZXk6IFwiZ2V0U2NvcmVcIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNjb3JlKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NvcmU7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogXCJnZXRBbGlnbm1lbnRzXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBbGlnbm1lbnRzKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWxpZ25tZW50cztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1haW4gZHluYW1pYyBwcm9ncmFtbWluZyBwcm9jZWR1cmVcblxuICAgIH0sIHtcbiAgICAgICAga2V5OiBcImNvbXB1dGVHcmlkc1wiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gY29tcHV0ZUdyaWRzKCkge1xuICAgICAgICAgICAgLy8gRmlsbCBpbiB0aGUgZmlyc3Qgcm93XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IHRoaXMuak1heDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkWzBdW2pdID0gdGhpcy5ncmlkWzBdW2ogLSAxXSArIHRoaXMuZ2FwX3BlbmFsdHk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFjZWJhY2tHcmlkWzBdW2pdID0gW2ZhbHNlLCBmYWxzZSwgdHJ1ZV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpbGwgaW4gdGhlIGZpcnN0IGNvbHVtblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCB0aGlzLmlNYXg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZFtpXVswXSA9IHRoaXMuZ3JpZFtpIC0gMV1bMF0gKyB0aGlzLmdhcF9wZW5hbHR5O1xuICAgICAgICAgICAgICAgIHRoaXMudHJhY2ViYWNrR3JpZFtpXVswXSA9IFtmYWxzZSwgdHJ1ZSwgZmFsc2VdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaWxsIHRoZSByZXN0IG9mIHRoZSBncmlkXG4gICAgICAgICAgICBmb3IgKHZhciBfaTIgPSAxOyBfaTIgPCB0aGlzLmlNYXg7IF9pMisrKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2oyID0gMTsgX2oyIDwgdGhpcy5qTWF4OyBfajIrKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBtYXggc2NvcmUocykgYW1vbmcgW2BEaWFnYCwgYFVwYCwgYExlZnRgXVxuICAgICAgICAgICAgICAgICAgICB2YXIgZGlhZyA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VxdWVuY2UxW19pMiAtIDFdID09PSB0aGlzLnNlcXVlbmNlMltfajIgLSAxXSkgZGlhZyA9IHRoaXMuZ3JpZFtfaTIgLSAxXVtfajIgLSAxXSArIHRoaXMubWF0Y2hfc2NvcmU7ZWxzZSBkaWFnID0gdGhpcy5ncmlkW19pMiAtIDFdW19qMiAtIDFdICsgdGhpcy5taXNtYXRjaF9wZW5hbHR5O1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciB1cCA9IHRoaXMuZ3JpZFtfaTIgLSAxXVtfajJdICsgdGhpcy5nYXBfcGVuYWx0eTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxlZnQgPSB0aGlzLmdyaWRbX2kyXVtfajIgLSAxXSArIHRoaXMuZ2FwX3BlbmFsdHk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgZXhpc3RzIG11bHRpcGxlIG1heCB2YWx1ZXMsIGNhcHR1cmUgdGhlbSBmb3IgbXVsdGlwbGUgcGF0aHNcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1heE9mID0gW2RpYWcsIHVwLCBsZWZ0XTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGljZXMgPSB0aGlzLmFycmF5QWxsTWF4SW5kZXhlcyhtYXhPZik7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIEdyaWRzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZFtfaTJdW19qMl0gPSBtYXhPZltpbmRpY2VzWzBdXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFjZWJhY2tHcmlkW19pMl1bX2oyXSA9IFtpbmRpY2VzLmluY2x1ZGVzKDApLCBpbmRpY2VzLmluY2x1ZGVzKDEpLCBpbmRpY2VzLmluY2x1ZGVzKDIpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBhbGlnbm1lbnQgc2NvcmVcbiAgICAgICAgICAgIHRoaXMuc2NvcmUgPSB0aGlzLmdyaWRbdGhpcy5pTWF4IC0gMV1bdGhpcy5qTWF4IC0gMV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXRzIGFsbCBwb3NzaWJsZSB2YWxpZCBzZXF1ZW5jZSBjb21iaW5hdGlvbnNcblxuICAgIH0sIHtcbiAgICAgICAga2V5OiBcImFsaWdubWVudFRyYWNlYmFja1wiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gYWxpZ25tZW50VHJhY2ViYWNrKCkge1xuICAgICAgICAgICAgdmFyIGluUHJvY2Vzc0FsaWdubWVudHMgPSBbXTtcblxuICAgICAgICAgICAgaW5Qcm9jZXNzQWxpZ25tZW50cy5wdXNoKHsgcG9zOiBbdGhpcy5zZXF1ZW5jZTEubGVuZ3RoLCB0aGlzLnNlcXVlbmNlMi5sZW5ndGhdLFxuICAgICAgICAgICAgICAgIHNlcTE6IFwiXCIsXG4gICAgICAgICAgICAgICAgc2VxMjogXCJcIlxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHdoaWxlIChpblByb2Nlc3NBbGlnbm1lbnRzWzBdKSB7XG4gICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBpblByb2Nlc3NBbGlnbm1lbnRzWzBdO1xuICAgICAgICAgICAgICAgIHZhciBkaXJlY3Rpb25zID0gdGhpcy50cmFjZWJhY2tHcmlkW2N1cnJlbnQucG9zWzBdXVtjdXJyZW50LnBvc1sxXV07XG5cbiAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uc1swXSkge1xuICAgICAgICAgICAgICAgICAgICBpblByb2Nlc3NBbGlnbm1lbnRzLnB1c2goeyBwb3M6IFtjdXJyZW50LnBvc1swXSAtIDEsIGN1cnJlbnQucG9zWzFdIC0gMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXExOiB0aGlzLnNlcXVlbmNlMVtjdXJyZW50LnBvc1swXSAtIDFdICsgY3VycmVudC5zZXExLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VxMjogdGhpcy5zZXF1ZW5jZTJbY3VycmVudC5wb3NbMV0gLSAxXSArIGN1cnJlbnQuc2VxMlxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbnNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgaW5Qcm9jZXNzQWxpZ25tZW50cy5wdXNoKHsgcG9zOiBbY3VycmVudC5wb3NbMF0gLSAxLCBjdXJyZW50LnBvc1sxXV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXExOiB0aGlzLnNlcXVlbmNlMVtjdXJyZW50LnBvc1swXSAtIDFdICsgY3VycmVudC5zZXExLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VxMjogJy0nICsgY3VycmVudC5zZXEyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uc1syXSkge1xuICAgICAgICAgICAgICAgICAgICBpblByb2Nlc3NBbGlnbm1lbnRzLnB1c2goeyBwb3M6IFtjdXJyZW50LnBvc1swXSwgY3VycmVudC5wb3NbMV0gLSAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcTE6ICctJyArIGN1cnJlbnQuc2VxMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcTI6IHRoaXMuc2VxdWVuY2UyW2N1cnJlbnQucG9zWzFdIC0gMV0gKyBjdXJyZW50LnNlcTJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQucG9zWzBdID09PSAwICYmIGN1cnJlbnQucG9zWzFdID09PSAwKSB0aGlzLmFsaWdubWVudHMucHVzaCh7IHNlcXVlbmNlMTogY3VycmVudC5zZXExLFxuICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZTI6IGN1cnJlbnQuc2VxMlxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaW5Qcm9jZXNzQWxpZ25tZW50cy5zaGlmdCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hbGlnbm1lbnRzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGVscGVyIEZ1bmN0aW9uc1xuXG4gICAgfSwge1xuICAgICAgICBrZXk6IFwiZ2V0QWxsSW5kZXhlc1wiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QWxsSW5kZXhlcyhhcnIsIHZhbCkge1xuICAgICAgICAgICAgdmFyIGluZGV4ZXMgPSBbXSxcbiAgICAgICAgICAgICAgICBpID0gLTE7XG4gICAgICAgICAgICB3aGlsZSAoKGkgPSBhcnIuaW5kZXhPZih2YWwsIGkgKyAxKSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaW5kZXhlcy5wdXNoKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGluZGV4ZXM7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogXCJhcnJheUFsbE1heEluZGV4ZXNcIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFycmF5QWxsTWF4SW5kZXhlcyhhcnJheSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsSW5kZXhlcyhhcnJheSwgTWF0aC5tYXguYXBwbHkobnVsbCwgYXJyYXkpKTtcbiAgICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBOZWVkbGVtYW5XdW5zY2g7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTmVlZGxlbWFuV3Vuc2NoO1xuXG4vKioqLyB9KSxcbi8qIDI4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBsYXlvdXRCYXNlID0gZnVuY3Rpb24gbGF5b3V0QmFzZSgpIHtcbiAgcmV0dXJuO1xufTtcblxubGF5b3V0QmFzZS5GRExheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTgpO1xubGF5b3V0QmFzZS5GRExheW91dENvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5sYXlvdXRCYXNlLkZETGF5b3V0RWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpO1xubGF5b3V0QmFzZS5GRExheW91dE5vZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTtcbmxheW91dEJhc2UuRGltZW5zaW9uRCA9IF9fd2VicGFja19yZXF1aXJlX18oMjEpO1xubGF5b3V0QmFzZS5IYXNoTWFwID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMik7XG5sYXlvdXRCYXNlLkhhc2hTZXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIzKTtcbmxheW91dEJhc2UuSUdlb21ldHJ5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcbmxheW91dEJhc2UuSU1hdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xubGF5b3V0QmFzZS5JbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMCk7XG5sYXlvdXRCYXNlLlBvaW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG5sYXlvdXRCYXNlLlBvaW50RCA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG5sYXlvdXRCYXNlLlJhbmRvbVNlZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KTtcbmxheW91dEJhc2UuUmVjdGFuZ2xlRCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xubGF5b3V0QmFzZS5UcmFuc2Zvcm0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KTtcbmxheW91dEJhc2UuVW5pcXVlSURHZW5lcmV0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KTtcbmxheW91dEJhc2UuUXVpY2tzb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7XG5sYXlvdXRCYXNlLkxpbmtlZExpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKTtcbmxheW91dEJhc2UuTEdyYXBoT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbmxheW91dEJhc2UuTEdyYXBoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcbmxheW91dEJhc2UuTEVkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xubGF5b3V0QmFzZS5MR3JhcGhNYW5hZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcbmxheW91dEJhc2UuTE5vZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xubGF5b3V0QmFzZS5MYXlvdXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KTtcbmxheW91dEJhc2UuTGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbmxheW91dEJhc2UuTmVlZGxlbWFuV3Vuc2NoID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNyk7XG5sYXlvdXRCYXNlLk1hdHJpeCA9IF9fd2VicGFja19yZXF1aXJlX18oMjQpO1xubGF5b3V0QmFzZS5TVkQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2KTtcblxubW9kdWxlLmV4cG9ydHMgPSBsYXlvdXRCYXNlO1xuXG4vKioqLyB9KSxcbi8qIDI5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIEVtaXR0ZXIoKSB7XG4gIHRoaXMubGlzdGVuZXJzID0gW107XG59XG5cbnZhciBwID0gRW1pdHRlci5wcm90b3R5cGU7XG5cbnAuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGNhbGxiYWNrKSB7XG4gIHRoaXMubGlzdGVuZXJzLnB1c2goe1xuICAgIGV2ZW50OiBldmVudCxcbiAgICBjYWxsYmFjazogY2FsbGJhY2tcbiAgfSk7XG59O1xuXG5wLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50LCBjYWxsYmFjaykge1xuICBmb3IgKHZhciBpID0gdGhpcy5saXN0ZW5lcnMubGVuZ3RoOyBpID49IDA7IGktLSkge1xuICAgIHZhciBsID0gdGhpcy5saXN0ZW5lcnNbaV07XG5cbiAgICBpZiAobC5ldmVudCA9PT0gZXZlbnQgJiYgbC5jYWxsYmFjayA9PT0gY2FsbGJhY2spIHtcbiAgICAgIHRoaXMubGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICB9XG4gIH1cbn07XG5cbnAuZW1pdCA9IGZ1bmN0aW9uIChldmVudCwgZGF0YSkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGwgPSB0aGlzLmxpc3RlbmVyc1tpXTtcblxuICAgIGlmIChldmVudCA9PT0gbC5ldmVudCkge1xuICAgICAgbC5jYWxsYmFjayhkYXRhKTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRW1pdHRlcjtcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xufSk7IiwiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHRoZSBgVHlwZUVycm9yYCBtZXNzYWdlIGZvciBcIkZ1bmN0aW9uc1wiIG1ldGhvZHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiogVXNlZCBhcyB0aGUgaW50ZXJuYWwgYXJndW1lbnQgcGxhY2Vob2xkZXIuICovXG52YXIgUExBQ0VIT0xERVIgPSAnX19sb2Rhc2hfcGxhY2Vob2xkZXJfXyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xudmFyIEJJTkRfRkxBRyA9IDEsXG4gICAgQklORF9LRVlfRkxBRyA9IDIsXG4gICAgQ1VSUllfQk9VTkRfRkxBRyA9IDQsXG4gICAgQ1VSUllfRkxBRyA9IDgsXG4gICAgQ1VSUllfUklHSFRfRkxBRyA9IDE2LFxuICAgIFBBUlRJQUxfRkxBRyA9IDMyLFxuICAgIFBBUlRJQUxfUklHSFRfRkxBRyA9IDY0LFxuICAgIEFSWV9GTEFHID0gMTI4LFxuICAgIFJFQVJHX0ZMQUcgPSAyNTYsXG4gICAgRkxJUF9GTEFHID0gNTEyO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwLFxuICAgIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxLFxuICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgsXG4gICAgTkFOID0gMCAvIDA7XG5cbi8qKiBVc2VkIHRvIGFzc29jaWF0ZSB3cmFwIG1ldGhvZHMgd2l0aCB0aGVpciBiaXQgZmxhZ3MuICovXG52YXIgd3JhcEZsYWdzID0gW1xuICBbJ2FyeScsIEFSWV9GTEFHXSxcbiAgWydiaW5kJywgQklORF9GTEFHXSxcbiAgWydiaW5kS2V5JywgQklORF9LRVlfRkxBR10sXG4gIFsnY3VycnknLCBDVVJSWV9GTEFHXSxcbiAgWydjdXJyeVJpZ2h0JywgQ1VSUllfUklHSFRfRkxBR10sXG4gIFsnZmxpcCcsIEZMSVBfRkxBR10sXG4gIFsncGFydGlhbCcsIFBBUlRJQUxfRkxBR10sXG4gIFsncGFydGlhbFJpZ2h0JywgUEFSVElBTF9SSUdIVF9GTEFHXSxcbiAgWydyZWFyZycsIFJFQVJHX0ZMQUddXG5dO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqXG4gKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAqL1xudmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW0gPSAvXlxccyt8XFxzKyQvZztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggd3JhcCBkZXRhaWwgY29tbWVudHMuICovXG52YXIgcmVXcmFwQ29tbWVudCA9IC9cXHsoPzpcXG5cXC9cXCogXFxbd3JhcHBlZCB3aXRoIC4rXFxdIFxcKlxcLyk/XFxuPy8sXG4gICAgcmVXcmFwRGV0YWlscyA9IC9cXHtcXG5cXC9cXCogXFxbd3JhcHBlZCB3aXRoICguKylcXF0gXFwqLyxcbiAgICByZVNwbGl0RGV0YWlscyA9IC8sPyAmIC87XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xudmFyIHJlSXNIb3N0Q3RvciA9IC9eXFxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXFxdJC87XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi9cbnZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxuLyoqXG4gKiBBIGZhc3RlciBhbHRlcm5hdGl2ZSB0byBgRnVuY3Rpb24jYXBwbHlgLCB0aGlzIGZ1bmN0aW9uIGludm9rZXMgYGZ1bmNgXG4gKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2AgYW5kIHRoZSBhcmd1bWVudHMgb2YgYGFyZ3NgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAqL1xuZnVuY3Rpb24gYXBwbHkoZnVuYywgdGhpc0FyZywgYXJncykge1xuICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcpO1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICB9XG4gIHJldHVybiBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xufVxuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmNsdWRlc2AgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBzcGVjaWZ5aW5nIGFuIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlJbmNsdWRlcyhhcnJheSwgdmFsdWUpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgMCkgPiAtMTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maW5kSW5kZXhgIGFuZCBgXy5maW5kTGFzdEluZGV4YCB3aXRob3V0XG4gKiBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4LCBmcm9tUmlnaHQpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIGluZGV4ID0gZnJvbUluZGV4ICsgKGZyb21SaWdodCA/IDEgOiAtMSk7XG5cbiAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIGlmICh2YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBmcm9tSW5kZXgpO1xuICB9XG4gIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYU5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbnVtYmVyIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTmFOKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbnVtYmVyIG9mIGBwbGFjZWhvbGRlcmAgb2NjdXJyZW5jZXMgaW4gYGFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcGxhY2Vob2xkZXIgY291bnQuXG4gKi9cbmZ1bmN0aW9uIGNvdW50SG9sZGVycyhhcnJheSwgcGxhY2Vob2xkZXIpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IDA7XG5cbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgaWYgKGFycmF5W2xlbmd0aF0gPT09IHBsYWNlaG9sZGVyKSB7XG4gICAgICByZXN1bHQrKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBob3N0IG9iamVjdCBpbiBJRSA8IDkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBob3N0IG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0hvc3RPYmplY3QodmFsdWUpIHtcbiAgLy8gTWFueSBob3N0IG9iamVjdHMgYXJlIGBPYmplY3RgIG9iamVjdHMgdGhhdCBjYW4gY29lcmNlIHRvIHN0cmluZ3NcbiAgLy8gZGVzcGl0ZSBoYXZpbmcgaW1wcm9wZXJseSBkZWZpbmVkIGB0b1N0cmluZ2AgbWV0aG9kcy5cbiAgdmFyIHJlc3VsdCA9IGZhbHNlO1xuICBpZiAodmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSAhISh2YWx1ZSArICcnKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUmVwbGFjZXMgYWxsIGBwbGFjZWhvbGRlcmAgZWxlbWVudHMgaW4gYGFycmF5YCB3aXRoIGFuIGludGVybmFsIHBsYWNlaG9sZGVyXG4gKiBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB0aGVpciBpbmRleGVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gcmVwbGFjZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gKi9cbmZ1bmN0aW9uIHJlcGxhY2VIb2xkZXJzKGFycmF5LCBwbGFjZWhvbGRlcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgIGlmICh2YWx1ZSA9PT0gcGxhY2Vob2xkZXIgfHwgdmFsdWUgPT09IFBMQUNFSE9MREVSKSB7XG4gICAgICBhcnJheVtpbmRleF0gPSBQTEFDRUhPTERFUjtcbiAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xudmFyIGNvcmVKc0RhdGEgPSByb290WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbnZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG59KCkpO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGlmIGEgbWV0aG9kIGlzIG5hdGl2ZS4gKi9cbnZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gIGZ1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gIC5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLCAnJDEuKj8nKSArICckJ1xuKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0Q3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4LFxuICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKiBVc2VkIHRvIHNldCBgdG9TdHJpbmdgIG1ldGhvZHMuICovXG52YXIgZGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciBmdW5jID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2RlZmluZVByb3BlcnR5JyksXG4gICAgICBuYW1lID0gZ2V0TmF0aXZlLm5hbWU7XG5cbiAgcmV0dXJuIChuYW1lICYmIG5hbWUubGVuZ3RoID4gMikgPyBmdW5jIDogdW5kZWZpbmVkO1xufSgpKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nXG4gKiBwcm9wZXJ0aWVzIHRvIHRoZSBjcmVhdGVkIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZSBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGJhc2VDcmVhdGUocHJvdG8pIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHByb3RvKSA/IG9iamVjdENyZWF0ZShwcm90bykgOiB7fTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkgfHwgaXNNYXNrZWQodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwYXR0ZXJuID0gKGlzRnVuY3Rpb24odmFsdWUpIHx8IGlzSG9zdE9iamVjdCh2YWx1ZSkpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcbiAgcmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgdGhhdCBpcyB0aGUgY29tcG9zaXRpb24gb2YgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLFxuICogcGxhY2Vob2xkZXJzLCBhbmQgcHJvdmlkZWQgYXJndW1lbnRzIGludG8gYSBzaW5nbGUgYXJyYXkgb2YgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gKiBAcGFyYW0ge0FycmF5fSBwYXJ0aWFscyBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQuXG4gKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gKiBAcGFyYW1zIHtib29sZWFufSBbaXNDdXJyaWVkXSBTcGVjaWZ5IGNvbXBvc2luZyBmb3IgYSBjdXJyaWVkIGZ1bmN0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tcG9zZWQgYXJndW1lbnRzLlxuICovXG5mdW5jdGlvbiBjb21wb3NlQXJncyhhcmdzLCBwYXJ0aWFscywgaG9sZGVycywgaXNDdXJyaWVkKSB7XG4gIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgIGhvbGRlcnNMZW5ndGggPSBob2xkZXJzLmxlbmd0aCxcbiAgICAgIGxlZnRJbmRleCA9IC0xLFxuICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgIHJhbmdlTGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3NMZW5ndGggLSBob2xkZXJzTGVuZ3RoLCAwKSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlZnRMZW5ndGggKyByYW5nZUxlbmd0aCksXG4gICAgICBpc1VuY3VycmllZCA9ICFpc0N1cnJpZWQ7XG5cbiAgd2hpbGUgKCsrbGVmdEluZGV4IDwgbGVmdExlbmd0aCkge1xuICAgIHJlc3VsdFtsZWZ0SW5kZXhdID0gcGFydGlhbHNbbGVmdEluZGV4XTtcbiAgfVxuICB3aGlsZSAoKythcmdzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7XG4gICAgaWYgKGlzVW5jdXJyaWVkIHx8IGFyZ3NJbmRleCA8IGFyZ3NMZW5ndGgpIHtcbiAgICAgIHJlc3VsdFtob2xkZXJzW2FyZ3NJbmRleF1dID0gYXJnc1thcmdzSW5kZXhdO1xuICAgIH1cbiAgfVxuICB3aGlsZSAocmFuZ2VMZW5ndGgtLSkge1xuICAgIHJlc3VsdFtsZWZ0SW5kZXgrK10gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgY29tcG9zZUFyZ3NgIGV4Y2VwdCB0aGF0IHRoZSBhcmd1bWVudHMgY29tcG9zaXRpb25cbiAqIGlzIHRhaWxvcmVkIGZvciBgXy5wYXJ0aWFsUmlnaHRgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gKiBAcGFyYW0ge0FycmF5fSBwYXJ0aWFscyBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqIEBwYXJhbXMge2Jvb2xlYW59IFtpc0N1cnJpZWRdIFNwZWNpZnkgY29tcG9zaW5nIGZvciBhIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VBcmdzUmlnaHQoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCkge1xuICB2YXIgYXJnc0luZGV4ID0gLTEsXG4gICAgICBhcmdzTGVuZ3RoID0gYXJncy5sZW5ndGgsXG4gICAgICBob2xkZXJzSW5kZXggPSAtMSxcbiAgICAgIGhvbGRlcnNMZW5ndGggPSBob2xkZXJzLmxlbmd0aCxcbiAgICAgIHJpZ2h0SW5kZXggPSAtMSxcbiAgICAgIHJpZ2h0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgcmFuZ2VMZW5ndGggPSBuYXRpdmVNYXgoYXJnc0xlbmd0aCAtIGhvbGRlcnNMZW5ndGgsIDApLFxuICAgICAgcmVzdWx0ID0gQXJyYXkocmFuZ2VMZW5ndGggKyByaWdodExlbmd0aCksXG4gICAgICBpc1VuY3VycmllZCA9ICFpc0N1cnJpZWQ7XG5cbiAgd2hpbGUgKCsrYXJnc0luZGV4IDwgcmFuZ2VMZW5ndGgpIHtcbiAgICByZXN1bHRbYXJnc0luZGV4XSA9IGFyZ3NbYXJnc0luZGV4XTtcbiAgfVxuICB2YXIgb2Zmc2V0ID0gYXJnc0luZGV4O1xuICB3aGlsZSAoKytyaWdodEluZGV4IDwgcmlnaHRMZW5ndGgpIHtcbiAgICByZXN1bHRbb2Zmc2V0ICsgcmlnaHRJbmRleF0gPSBwYXJ0aWFsc1tyaWdodEluZGV4XTtcbiAgfVxuICB3aGlsZSAoKytob2xkZXJzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7XG4gICAgaWYgKGlzVW5jdXJyaWVkIHx8IGFyZ3NJbmRleCA8IGFyZ3NMZW5ndGgpIHtcbiAgICAgIHJlc3VsdFtvZmZzZXQgKyBob2xkZXJzW2hvbGRlcnNJbmRleF1dID0gYXJnc1thcmdzSW5kZXgrK107XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgYHNvdXJjZWAgdG8gYGFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyBmcm9tLlxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuXG4gIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFycmF5W2luZGV4XSA9IHNvdXJjZVtpbmRleF07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXQgd2l0aCB0aGUgb3B0aW9uYWwgYHRoaXNgXG4gKiBiaW5kaW5nIG9mIGB0aGlzQXJnYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmluZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnKSB7XG4gIHZhciBpc0JpbmQgPSBiaXRtYXNrICYgQklORF9GTEFHLFxuICAgICAgQ3RvciA9IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICB2YXIgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuICAgIHJldHVybiBmbi5hcHBseShpc0JpbmQgPyB0aGlzQXJnIDogdGhpcywgYXJndW1lbnRzKTtcbiAgfVxuICByZXR1cm4gd3JhcHBlcjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBhbiBpbnN0YW5jZSBvZiBgQ3RvcmAgcmVnYXJkbGVzcyBvZlxuICogd2hldGhlciBpdCB3YXMgaW52b2tlZCBhcyBwYXJ0IG9mIGEgYG5ld2AgZXhwcmVzc2lvbiBvciBieSBgY2FsbGAgb3IgYGFwcGx5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gQ3RvciBUaGUgY29uc3RydWN0b3IgdG8gd3JhcC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUN0b3IoQ3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgLy8gVXNlIGEgYHN3aXRjaGAgc3RhdGVtZW50IHRvIHdvcmsgd2l0aCBjbGFzcyBjb25zdHJ1Y3RvcnMuIFNlZVxuICAgIC8vIGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtZnVuY3Rpb24tb2JqZWN0cy1jYWxsLXRoaXNhcmd1bWVudC1hcmd1bWVudHNsaXN0XG4gICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6IHJldHVybiBuZXcgQ3RvcjtcbiAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0pO1xuICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICBjYXNlIDM6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgIGNhc2UgNDogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICAgICAgY2FzZSA1OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7XG4gICAgICBjYXNlIDY6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdKTtcbiAgICAgIGNhc2UgNzogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0sIGFyZ3NbNl0pO1xuICAgIH1cbiAgICB2YXIgdGhpc0JpbmRpbmcgPSBiYXNlQ3JlYXRlKEN0b3IucHJvdG90eXBlKSxcbiAgICAgICAgcmVzdWx0ID0gQ3Rvci5hcHBseSh0aGlzQmluZGluZywgYXJncyk7XG5cbiAgICAvLyBNaW1pYyB0aGUgY29uc3RydWN0b3IncyBgcmV0dXJuYCBiZWhhdmlvci5cbiAgICAvLyBTZWUgaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTMuMi4yIGZvciBtb3JlIGRldGFpbHMuXG4gICAgcmV0dXJuIGlzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiB0aGlzQmluZGluZztcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gZW5hYmxlIGN1cnJ5aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBhcml0eSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ3VycnkoZnVuYywgYml0bWFzaywgYXJpdHkpIHtcbiAgdmFyIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICBpbmRleCA9IGxlbmd0aCxcbiAgICAgICAgcGxhY2Vob2xkZXIgPSBnZXRIb2xkZXIod3JhcHBlcik7XG5cbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgYXJnc1tpbmRleF0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgIH1cbiAgICB2YXIgaG9sZGVycyA9IChsZW5ndGggPCAzICYmIGFyZ3NbMF0gIT09IHBsYWNlaG9sZGVyICYmIGFyZ3NbbGVuZ3RoIC0gMV0gIT09IHBsYWNlaG9sZGVyKVxuICAgICAgPyBbXVxuICAgICAgOiByZXBsYWNlSG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7XG5cbiAgICBsZW5ndGggLT0gaG9sZGVycy5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCA8IGFyaXR5KSB7XG4gICAgICByZXR1cm4gY3JlYXRlUmVjdXJyeShcbiAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB1bmRlZmluZWQsXG4gICAgICAgIGFyZ3MsIGhvbGRlcnMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSAtIGxlbmd0aCk7XG4gICAgfVxuICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgcmV0dXJuIGFwcGx5KGZuLCB0aGlzLCBhcmdzKTtcbiAgfVxuICByZXR1cm4gd3JhcHBlcjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggb3B0aW9uYWwgYHRoaXNgXG4gKiBiaW5kaW5nIG9mIGB0aGlzQXJnYCwgcGFydGlhbCBhcHBsaWNhdGlvbiwgYW5kIGN1cnJ5aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gZnVuYyBUaGUgZnVuY3Rpb24gb3IgbWV0aG9kIG5hbWUgdG8gd3JhcC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG9cbiAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNSaWdodF0gVGhlIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8gdGhvc2UgcHJvdmlkZWRcbiAqICB0byB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNSaWdodF0gVGhlIGBwYXJ0aWFsc1JpZ2h0YCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUh5YnJpZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgcGFydGlhbHNSaWdodCwgaG9sZGVyc1JpZ2h0LCBhcmdQb3MsIGFyeSwgYXJpdHkpIHtcbiAgdmFyIGlzQXJ5ID0gYml0bWFzayAmIEFSWV9GTEFHLFxuICAgICAgaXNCaW5kID0gYml0bWFzayAmIEJJTkRfRkxBRyxcbiAgICAgIGlzQmluZEtleSA9IGJpdG1hc2sgJiBCSU5EX0tFWV9GTEFHLFxuICAgICAgaXNDdXJyaWVkID0gYml0bWFzayAmIChDVVJSWV9GTEFHIHwgQ1VSUllfUklHSFRfRkxBRyksXG4gICAgICBpc0ZsaXAgPSBiaXRtYXNrICYgRkxJUF9GTEFHLFxuICAgICAgQ3RvciA9IGlzQmluZEtleSA/IHVuZGVmaW5lZCA6IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgYXJncyA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgIGluZGV4ID0gbGVuZ3RoO1xuXG4gICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICB9XG4gICAgaWYgKGlzQ3VycmllZCkge1xuICAgICAgdmFyIHBsYWNlaG9sZGVyID0gZ2V0SG9sZGVyKHdyYXBwZXIpLFxuICAgICAgICAgIGhvbGRlcnNDb3VudCA9IGNvdW50SG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7XG4gICAgfVxuICAgIGlmIChwYXJ0aWFscykge1xuICAgICAgYXJncyA9IGNvbXBvc2VBcmdzKGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpO1xuICAgIH1cbiAgICBpZiAocGFydGlhbHNSaWdodCkge1xuICAgICAgYXJncyA9IGNvbXBvc2VBcmdzUmlnaHQoYXJncywgcGFydGlhbHNSaWdodCwgaG9sZGVyc1JpZ2h0LCBpc0N1cnJpZWQpO1xuICAgIH1cbiAgICBsZW5ndGggLT0gaG9sZGVyc0NvdW50O1xuICAgIGlmIChpc0N1cnJpZWQgJiYgbGVuZ3RoIDwgYXJpdHkpIHtcbiAgICAgIHZhciBuZXdIb2xkZXJzID0gcmVwbGFjZUhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuICAgICAgcmV0dXJuIGNyZWF0ZVJlY3VycnkoXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIGNyZWF0ZUh5YnJpZCwgd3JhcHBlci5wbGFjZWhvbGRlciwgdGhpc0FyZyxcbiAgICAgICAgYXJncywgbmV3SG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5IC0gbGVuZ3RoXG4gICAgICApO1xuICAgIH1cbiAgICB2YXIgdGhpc0JpbmRpbmcgPSBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcyxcbiAgICAgICAgZm4gPSBpc0JpbmRLZXkgPyB0aGlzQmluZGluZ1tmdW5jXSA6IGZ1bmM7XG5cbiAgICBsZW5ndGggPSBhcmdzLmxlbmd0aDtcbiAgICBpZiAoYXJnUG9zKSB7XG4gICAgICBhcmdzID0gcmVvcmRlcihhcmdzLCBhcmdQb3MpO1xuICAgIH0gZWxzZSBpZiAoaXNGbGlwICYmIGxlbmd0aCA+IDEpIHtcbiAgICAgIGFyZ3MucmV2ZXJzZSgpO1xuICAgIH1cbiAgICBpZiAoaXNBcnkgJiYgYXJ5IDwgbGVuZ3RoKSB7XG4gICAgICBhcmdzLmxlbmd0aCA9IGFyeTtcbiAgICB9XG4gICAgaWYgKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikge1xuICAgICAgZm4gPSBDdG9yIHx8IGNyZWF0ZUN0b3IoZm4pO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmdcbiAqIG9mIGB0aGlzQXJnYCBhbmQgYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICogIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVQYXJ0aWFsKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzKSB7XG4gIHZhciBpc0JpbmQgPSBiaXRtYXNrICYgQklORF9GTEFHLFxuICAgICAgQ3RvciA9IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICB2YXIgYXJnc0luZGV4ID0gLTEsXG4gICAgICAgIGFyZ3NMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICBsZWZ0SW5kZXggPSAtMSxcbiAgICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgYXJncyA9IEFycmF5KGxlZnRMZW5ndGggKyBhcmdzTGVuZ3RoKSxcbiAgICAgICAgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuXG4gICAgd2hpbGUgKCsrbGVmdEluZGV4IDwgbGVmdExlbmd0aCkge1xuICAgICAgYXJnc1tsZWZ0SW5kZXhdID0gcGFydGlhbHNbbGVmdEluZGV4XTtcbiAgICB9XG4gICAgd2hpbGUgKGFyZ3NMZW5ndGgtLSkge1xuICAgICAgYXJnc1tsZWZ0SW5kZXgrK10gPSBhcmd1bWVudHNbKythcmdzSW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gYXBwbHkoZm4sIGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmdzKTtcbiAgfVxuICByZXR1cm4gd3JhcHBlcjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gY29udGludWUgY3VycnlpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gd3JhcEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgYGZ1bmNgIHdyYXBwZXIuXG4gKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB2YWx1ZS5cbiAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICogIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJ5XSBUaGUgYXJpdHkgY2FwIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVSZWN1cnJ5KGZ1bmMsIGJpdG1hc2ssIHdyYXBGdW5jLCBwbGFjZWhvbGRlciwgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICB2YXIgaXNDdXJyeSA9IGJpdG1hc2sgJiBDVVJSWV9GTEFHLFxuICAgICAgbmV3SG9sZGVycyA9IGlzQ3VycnkgPyBob2xkZXJzIDogdW5kZWZpbmVkLFxuICAgICAgbmV3SG9sZGVyc1JpZ2h0ID0gaXNDdXJyeSA/IHVuZGVmaW5lZCA6IGhvbGRlcnMsXG4gICAgICBuZXdQYXJ0aWFscyA9IGlzQ3VycnkgPyBwYXJ0aWFscyA6IHVuZGVmaW5lZCxcbiAgICAgIG5ld1BhcnRpYWxzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogcGFydGlhbHM7XG5cbiAgYml0bWFzayB8PSAoaXNDdXJyeSA/IFBBUlRJQUxfRkxBRyA6IFBBUlRJQUxfUklHSFRfRkxBRyk7XG4gIGJpdG1hc2sgJj0gfihpc0N1cnJ5ID8gUEFSVElBTF9SSUdIVF9GTEFHIDogUEFSVElBTF9GTEFHKTtcblxuICBpZiAoIShiaXRtYXNrICYgQ1VSUllfQk9VTkRfRkxBRykpIHtcbiAgICBiaXRtYXNrICY9IH4oQklORF9GTEFHIHwgQklORF9LRVlfRkxBRyk7XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gd3JhcEZ1bmMoZnVuYywgYml0bWFzaywgdGhpc0FyZywgbmV3UGFydGlhbHMsIG5ld0hvbGRlcnMsIG5ld1BhcnRpYWxzUmlnaHQsIG5ld0hvbGRlcnNSaWdodCwgYXJnUG9zLCBhcnksIGFyaXR5KTtcbiAgcmVzdWx0LnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7XG4gIHJldHVybiBzZXRXcmFwVG9TdHJpbmcocmVzdWx0LCBmdW5jLCBiaXRtYXNrKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBlaXRoZXIgY3VycmllcyBvciBpbnZva2VzIGBmdW5jYCB3aXRoIG9wdGlvbmFsXG4gKiBgdGhpc2AgYmluZGluZyBhbmQgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gZnVuYyBUaGUgZnVuY3Rpb24gb3IgbWV0aG9kIG5hbWUgdG8gd3JhcC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICogIFRoZSBiaXRtYXNrIG1heSBiZSBjb21wb3NlZCBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOlxuICogICAgIDEgLSBgXy5iaW5kYFxuICogICAgIDIgLSBgXy5iaW5kS2V5YFxuICogICAgIDQgLSBgXy5jdXJyeWAgb3IgYF8uY3VycnlSaWdodGAgb2YgYSBib3VuZCBmdW5jdGlvblxuICogICAgIDggLSBgXy5jdXJyeWBcbiAqICAgIDE2IC0gYF8uY3VycnlSaWdodGBcbiAqICAgIDMyIC0gYF8ucGFydGlhbGBcbiAqICAgIDY0IC0gYF8ucGFydGlhbFJpZ2h0YFxuICogICAxMjggLSBgXy5yZWFyZ2BcbiAqICAgMjU2IC0gYF8uYXJ5YFxuICogICA1MTIgLSBgXy5mbGlwYFxuICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVdyYXAoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICB2YXIgaXNCaW5kS2V5ID0gYml0bWFzayAmIEJJTkRfS0VZX0ZMQUc7XG4gIGlmICghaXNCaW5kS2V5ICYmIHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgdmFyIGxlbmd0aCA9IHBhcnRpYWxzID8gcGFydGlhbHMubGVuZ3RoIDogMDtcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBiaXRtYXNrICY9IH4oUEFSVElBTF9GTEFHIHwgUEFSVElBTF9SSUdIVF9GTEFHKTtcbiAgICBwYXJ0aWFscyA9IGhvbGRlcnMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgYXJ5ID0gYXJ5ID09PSB1bmRlZmluZWQgPyBhcnkgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKGFyeSksIDApO1xuICBhcml0eSA9IGFyaXR5ID09PSB1bmRlZmluZWQgPyBhcml0eSA6IHRvSW50ZWdlcihhcml0eSk7XG4gIGxlbmd0aCAtPSBob2xkZXJzID8gaG9sZGVycy5sZW5ndGggOiAwO1xuXG4gIGlmIChiaXRtYXNrICYgUEFSVElBTF9SSUdIVF9GTEFHKSB7XG4gICAgdmFyIHBhcnRpYWxzUmlnaHQgPSBwYXJ0aWFscyxcbiAgICAgICAgaG9sZGVyc1JpZ2h0ID0gaG9sZGVycztcblxuICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHZhciBuZXdEYXRhID0gW1xuICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsXG4gICAgYXJnUG9zLCBhcnksIGFyaXR5XG4gIF07XG5cbiAgZnVuYyA9IG5ld0RhdGFbMF07XG4gIGJpdG1hc2sgPSBuZXdEYXRhWzFdO1xuICB0aGlzQXJnID0gbmV3RGF0YVsyXTtcbiAgcGFydGlhbHMgPSBuZXdEYXRhWzNdO1xuICBob2xkZXJzID0gbmV3RGF0YVs0XTtcbiAgYXJpdHkgPSBuZXdEYXRhWzldID0gbmV3RGF0YVs5XSA9PSBudWxsXG4gICAgPyAoaXNCaW5kS2V5ID8gMCA6IGZ1bmMubGVuZ3RoKVxuICAgIDogbmF0aXZlTWF4KG5ld0RhdGFbOV0gLSBsZW5ndGgsIDApO1xuXG4gIGlmICghYXJpdHkgJiYgYml0bWFzayAmIChDVVJSWV9GTEFHIHwgQ1VSUllfUklHSFRfRkxBRykpIHtcbiAgICBiaXRtYXNrICY9IH4oQ1VSUllfRkxBRyB8IENVUlJZX1JJR0hUX0ZMQUcpO1xuICB9XG4gIGlmICghYml0bWFzayB8fCBiaXRtYXNrID09IEJJTkRfRkxBRykge1xuICAgIHZhciByZXN1bHQgPSBjcmVhdGVCaW5kKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcpO1xuICB9IGVsc2UgaWYgKGJpdG1hc2sgPT0gQ1VSUllfRkxBRyB8fCBiaXRtYXNrID09IENVUlJZX1JJR0hUX0ZMQUcpIHtcbiAgICByZXN1bHQgPSBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSk7XG4gIH0gZWxzZSBpZiAoKGJpdG1hc2sgPT0gUEFSVElBTF9GTEFHIHx8IGJpdG1hc2sgPT0gKEJJTkRfRkxBRyB8IFBBUlRJQUxfRkxBRykpICYmICFob2xkZXJzLmxlbmd0aCkge1xuICAgIHJlc3VsdCA9IGNyZWF0ZVBhcnRpYWwoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMpO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IGNyZWF0ZUh5YnJpZC5hcHBseSh1bmRlZmluZWQsIG5ld0RhdGEpO1xuICB9XG4gIHJldHVybiBzZXRXcmFwVG9TdHJpbmcocmVzdWx0LCBmdW5jLCBiaXRtYXNrKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBhcmd1bWVudCBwbGFjZWhvbGRlciB2YWx1ZSBmb3IgYGZ1bmNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnNwZWN0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRIb2xkZXIoZnVuYykge1xuICB2YXIgb2JqZWN0ID0gZnVuYztcbiAgcmV0dXJuIG9iamVjdC5wbGFjZWhvbGRlcjtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBuYXRpdmUgZnVuY3Rpb24gYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBpZiBpdCdzIG5hdGl2ZSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG4gIHZhciB2YWx1ZSA9IGdldFZhbHVlKG9iamVjdCwga2V5KTtcbiAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB3cmFwcGVyIGRldGFpbHMgZnJvbSB0aGUgYHNvdXJjZWAgYm9keSBjb21tZW50LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIFRoZSBzb3VyY2UgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd3JhcHBlciBkZXRhaWxzLlxuICovXG5mdW5jdGlvbiBnZXRXcmFwRGV0YWlscyhzb3VyY2UpIHtcbiAgdmFyIG1hdGNoID0gc291cmNlLm1hdGNoKHJlV3JhcERldGFpbHMpO1xuICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXS5zcGxpdChyZVNwbGl0RGV0YWlscykgOiBbXTtcbn1cblxuLyoqXG4gKiBJbnNlcnRzIHdyYXBwZXIgYGRldGFpbHNgIGluIGEgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBgc291cmNlYCBib2R5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIFRoZSBzb3VyY2UgdG8gbW9kaWZ5LlxuICogQHJldHVybnMge0FycmF5fSBkZXRhaWxzIFRoZSBkZXRhaWxzIHRvIGluc2VydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIG1vZGlmaWVkIHNvdXJjZS5cbiAqL1xuZnVuY3Rpb24gaW5zZXJ0V3JhcERldGFpbHMoc291cmNlLCBkZXRhaWxzKSB7XG4gIHZhciBsZW5ndGggPSBkZXRhaWxzLmxlbmd0aCxcbiAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgZGV0YWlsc1tsYXN0SW5kZXhdID0gKGxlbmd0aCA+IDEgPyAnJiAnIDogJycpICsgZGV0YWlsc1tsYXN0SW5kZXhdO1xuICBkZXRhaWxzID0gZGV0YWlscy5qb2luKGxlbmd0aCA+IDIgPyAnLCAnIDogJyAnKTtcbiAgcmV0dXJuIHNvdXJjZS5yZXBsYWNlKHJlV3JhcENvbW1lbnQsICd7XFxuLyogW3dyYXBwZWQgd2l0aCAnICsgZGV0YWlscyArICddICovXFxuJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fCByZUlzVWludC50ZXN0KHZhbHVlKSkgJiZcbiAgICAodmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8IGxlbmd0aCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgaXRzIHNvdXJjZSBtYXNrZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNNYXNrZWQoZnVuYykge1xuICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIChtYXNrU3JjS2V5IGluIGZ1bmMpO1xufVxuXG4vKipcbiAqIFJlb3JkZXIgYGFycmF5YCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpbmRleGVzIHdoZXJlIHRoZSBlbGVtZW50IGF0XG4gKiB0aGUgZmlyc3QgaW5kZXggaXMgYXNzaWduZWQgYXMgdGhlIGZpcnN0IGVsZW1lbnQsIHRoZSBlbGVtZW50IGF0XG4gKiB0aGUgc2Vjb25kIGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBzZWNvbmQgZWxlbWVudCwgYW5kIHNvIG9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcmVvcmRlci5cbiAqIEBwYXJhbSB7QXJyYXl9IGluZGV4ZXMgVGhlIGFycmFuZ2VkIGFycmF5IGluZGV4ZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gcmVvcmRlcihhcnJheSwgaW5kZXhlcykge1xuICB2YXIgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGluZGV4ZXMubGVuZ3RoLCBhcnJMZW5ndGgpLFxuICAgICAgb2xkQXJyYXkgPSBjb3B5QXJyYXkoYXJyYXkpO1xuXG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIHZhciBpbmRleCA9IGluZGV4ZXNbbGVuZ3RoXTtcbiAgICBhcnJheVtsZW5ndGhdID0gaXNJbmRleChpbmRleCwgYXJyTGVuZ3RoKSA/IG9sZEFycmF5W2luZGV4XSA6IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgYHRvU3RyaW5nYCBtZXRob2Qgb2YgYHdyYXBwZXJgIHRvIG1pbWljIHRoZSBzb3VyY2Ugb2YgYHJlZmVyZW5jZWBcbiAqIHdpdGggd3JhcHBlciBkZXRhaWxzIGluIGEgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBzb3VyY2UgYm9keS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gd3JhcHBlciBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVmZXJlbmNlIFRoZSByZWZlcmVuY2UgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGB3cmFwcGVyYC5cbiAqL1xudmFyIHNldFdyYXBUb1N0cmluZyA9ICFkZWZpbmVQcm9wZXJ0eSA/IGlkZW50aXR5IDogZnVuY3Rpb24od3JhcHBlciwgcmVmZXJlbmNlLCBiaXRtYXNrKSB7XG4gIHZhciBzb3VyY2UgPSAocmVmZXJlbmNlICsgJycpO1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHkod3JhcHBlciwgJ3RvU3RyaW5nJywge1xuICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICdlbnVtZXJhYmxlJzogZmFsc2UsXG4gICAgJ3ZhbHVlJzogY29uc3RhbnQoaW5zZXJ0V3JhcERldGFpbHMoc291cmNlLCB1cGRhdGVXcmFwRGV0YWlscyhnZXRXcmFwRGV0YWlscyhzb3VyY2UpLCBiaXRtYXNrKSkpXG4gIH0pO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgZnVuY2AgdG8gaXRzIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBwcm9jZXNzLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG4gKi9cbmZ1bmN0aW9uIHRvU291cmNlKGZ1bmMpIHtcbiAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZnVuY1RvU3RyaW5nLmNhbGwoZnVuYyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChmdW5jICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgd3JhcHBlciBgZGV0YWlsc2AgYmFzZWQgb24gYGJpdG1hc2tgIGZsYWdzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJucyB7QXJyYXl9IGRldGFpbHMgVGhlIGRldGFpbHMgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgZGV0YWlsc2AuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVdyYXBEZXRhaWxzKGRldGFpbHMsIGJpdG1hc2spIHtcbiAgYXJyYXlFYWNoKHdyYXBGbGFncywgZnVuY3Rpb24ocGFpcikge1xuICAgIHZhciB2YWx1ZSA9ICdfLicgKyBwYWlyWzBdO1xuICAgIGlmICgoYml0bWFzayAmIHBhaXJbMV0pICYmICFhcnJheUluY2x1ZGVzKGRldGFpbHMsIHZhbHVlKSkge1xuICAgICAgZGV0YWlscy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZGV0YWlscy5zb3J0KCk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhcmd1bWVudHMgb2YgYGZ1bmNgIGFuZCBlaXRoZXIgaW52b2tlc1xuICogYGZ1bmNgIHJldHVybmluZyBpdHMgcmVzdWx0LCBpZiBhdCBsZWFzdCBgYXJpdHlgIG51bWJlciBvZiBhcmd1bWVudHMgaGF2ZVxuICogYmVlbiBwcm92aWRlZCwgb3IgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB0aGUgcmVtYWluaW5nIGBmdW5jYFxuICogYXJndW1lbnRzLCBhbmQgc28gb24uIFRoZSBhcml0eSBvZiBgZnVuY2AgbWF5IGJlIHNwZWNpZmllZCBpZiBgZnVuYy5sZW5ndGhgXG4gKiBpcyBub3Qgc3VmZmljaWVudC5cbiAqXG4gKiBUaGUgYF8uY3VycnkucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpYyBidWlsZHMsXG4gKiBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwcm92aWRlZCBhcmd1bWVudHMuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIGN1cnJpZWQgZnVuY3Rpb25zLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi4wLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5PWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhYmMgPSBmdW5jdGlvbihhLCBiLCBjKSB7XG4gKiAgIHJldHVybiBbYSwgYiwgY107XG4gKiB9O1xuICpcbiAqIHZhciBjdXJyaWVkID0gXy5jdXJyeShhYmMpO1xuICpcbiAqIGN1cnJpZWQoMSkoMikoMyk7XG4gKiAvLyA9PiBbMSwgMiwgM11cbiAqXG4gKiBjdXJyaWVkKDEsIDIpKDMpO1xuICogLy8gPT4gWzEsIDIsIDNdXG4gKlxuICogY3VycmllZCgxLCAyLCAzKTtcbiAqIC8vID0+IFsxLCAyLCAzXVxuICpcbiAqIC8vIEN1cnJpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gKiBjdXJyaWVkKDEpKF8sIDMpKDIpO1xuICogLy8gPT4gWzEsIDIsIDNdXG4gKi9cbmZ1bmN0aW9uIGN1cnJ5KGZ1bmMsIGFyaXR5LCBndWFyZCkge1xuICBhcml0eSA9IGd1YXJkID8gdW5kZWZpbmVkIDogYXJpdHk7XG4gIHZhciByZXN1bHQgPSBjcmVhdGVXcmFwKGZ1bmMsIENVUlJZX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSk7XG4gIHJlc3VsdC5wbGFjZWhvbGRlciA9IGN1cnJ5LnBsYWNlaG9sZGVyO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNGdW5jdGlvbihfKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgLy8gaW4gU2FmYXJpIDgtOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheSBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICB2YXIgdGFnID0gaXNPYmplY3QodmFsdWUpID8gb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcbiAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTIuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvRmluaXRlKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9GaW5pdGUoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6IDA7XG4gIH1cbiAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gIGlmICh2YWx1ZSA9PT0gSU5GSU5JVFkgfHwgdmFsdWUgPT09IC1JTkZJTklUWSkge1xuICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvSW50ZWdlcigzLjIpO1xuICogLy8gPT4gM1xuICpcbiAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gMFxuICpcbiAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0ludGVnZXIoJzMuMicpO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBgdmFsdWVgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gZnJvbSB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29uc3RhbnQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gXy50aW1lcygyLCBfLmNvbnN0YW50KHsgJ2EnOiAxIH0pKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhvYmplY3RzKTtcbiAqIC8vID0+IFt7ICdhJzogMSB9LCB7ICdhJzogMSB9XVxuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHNbMF0gPT09IG9iamVjdHNbMV0pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBjb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGl0IHJlY2VpdmVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICpcbiAqIGNvbnNvbGUubG9nKF8uaWRlbnRpdHkob2JqZWN0KSA9PT0gb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vLyBBc3NpZ24gZGVmYXVsdCBwbGFjZWhvbGRlcnMuXG5jdXJyeS5wbGFjZWhvbGRlciA9IHt9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGN1cnJ5O1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBEYXRhVmlldyA9IGdldE5hdGl2ZShyb290LCAnRGF0YVZpZXcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBEYXRhVmlldztcbiIsInZhciBoYXNoQ2xlYXIgPSByZXF1aXJlKCcuL19oYXNoQ2xlYXInKSxcbiAgICBoYXNoRGVsZXRlID0gcmVxdWlyZSgnLi9faGFzaERlbGV0ZScpLFxuICAgIGhhc2hHZXQgPSByZXF1aXJlKCcuL19oYXNoR2V0JyksXG4gICAgaGFzaEhhcyA9IHJlcXVpcmUoJy4vX2hhc2hIYXMnKSxcbiAgICBoYXNoU2V0ID0gcmVxdWlyZSgnLi9faGFzaFNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBoYXNoIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gSGFzaChlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBIYXNoYC5cbkhhc2gucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyO1xuSGFzaC5wcm90b3R5cGVbJ2RlbGV0ZSddID0gaGFzaERlbGV0ZTtcbkhhc2gucHJvdG90eXBlLmdldCA9IGhhc2hHZXQ7XG5IYXNoLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzO1xuSGFzaC5wcm90b3R5cGUuc2V0ID0gaGFzaFNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBIYXNoO1xuIiwidmFyIGxpc3RDYWNoZUNsZWFyID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlQ2xlYXInKSxcbiAgICBsaXN0Q2FjaGVEZWxldGUgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVEZWxldGUnKSxcbiAgICBsaXN0Q2FjaGVHZXQgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVHZXQnKSxcbiAgICBsaXN0Q2FjaGVIYXMgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVIYXMnKSxcbiAgICBsaXN0Q2FjaGVTZXQgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGxpc3QgY2FjaGUgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgTGlzdENhY2hlYC5cbkxpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBsaXN0Q2FjaGVDbGVhcjtcbkxpc3RDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbGlzdENhY2hlRGVsZXRlO1xuTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBsaXN0Q2FjaGVHZXQ7XG5MaXN0Q2FjaGUucHJvdG90eXBlLmhhcyA9IGxpc3RDYWNoZUhhcztcbkxpc3RDYWNoZS5wcm90b3R5cGUuc2V0ID0gbGlzdENhY2hlU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpc3RDYWNoZTtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgTWFwID0gZ2V0TmF0aXZlKHJvb3QsICdNYXAnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNYXA7XG4iLCJ2YXIgbWFwQ2FjaGVDbGVhciA9IHJlcXVpcmUoJy4vX21hcENhY2hlQ2xlYXInKSxcbiAgICBtYXBDYWNoZURlbGV0ZSA9IHJlcXVpcmUoJy4vX21hcENhY2hlRGVsZXRlJyksXG4gICAgbWFwQ2FjaGVHZXQgPSByZXF1aXJlKCcuL19tYXBDYWNoZUdldCcpLFxuICAgIG1hcENhY2hlSGFzID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVIYXMnKSxcbiAgICBtYXBDYWNoZVNldCA9IHJlcXVpcmUoJy4vX21hcENhY2hlU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hcCBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBNYXBDYWNoZWAuXG5NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBtYXBDYWNoZUNsZWFyO1xuTWFwQ2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IG1hcENhY2hlRGVsZXRlO1xuTWFwQ2FjaGUucHJvdG90eXBlLmdldCA9IG1hcENhY2hlR2V0O1xuTWFwQ2FjaGUucHJvdG90eXBlLmhhcyA9IG1hcENhY2hlSGFzO1xuTWFwQ2FjaGUucHJvdG90eXBlLnNldCA9IG1hcENhY2hlU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcENhY2hlO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBQcm9taXNlID0gZ2V0TmF0aXZlKHJvb3QsICdQcm9taXNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gUHJvbWlzZTtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgU2V0ID0gZ2V0TmF0aXZlKHJvb3QsICdTZXQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTZXQ7XG4iLCJ2YXIgTWFwQ2FjaGUgPSByZXF1aXJlKCcuL19NYXBDYWNoZScpLFxuICAgIHNldENhY2hlQWRkID0gcmVxdWlyZSgnLi9fc2V0Q2FjaGVBZGQnKSxcbiAgICBzZXRDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX3NldENhY2hlSGFzJyk7XG5cbi8qKlxuICpcbiAqIENyZWF0ZXMgYW4gYXJyYXkgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gU2V0Q2FjaGUodmFsdWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gdmFsdWVzID09IG51bGwgPyAwIDogdmFsdWVzLmxlbmd0aDtcblxuICB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHRoaXMuYWRkKHZhbHVlc1tpbmRleF0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBTZXRDYWNoZWAuXG5TZXRDYWNoZS5wcm90b3R5cGUuYWRkID0gU2V0Q2FjaGUucHJvdG90eXBlLnB1c2ggPSBzZXRDYWNoZUFkZDtcblNldENhY2hlLnByb3RvdHlwZS5oYXMgPSBzZXRDYWNoZUhhcztcblxubW9kdWxlLmV4cG9ydHMgPSBTZXRDYWNoZTtcbiIsInZhciBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKSxcbiAgICBzdGFja0NsZWFyID0gcmVxdWlyZSgnLi9fc3RhY2tDbGVhcicpLFxuICAgIHN0YWNrRGVsZXRlID0gcmVxdWlyZSgnLi9fc3RhY2tEZWxldGUnKSxcbiAgICBzdGFja0dldCA9IHJlcXVpcmUoJy4vX3N0YWNrR2V0JyksXG4gICAgc3RhY2tIYXMgPSByZXF1aXJlKCcuL19zdGFja0hhcycpLFxuICAgIHN0YWNrU2V0ID0gcmVxdWlyZSgnLi9fc3RhY2tTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RhY2sgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gU3RhY2soZW50cmllcykge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlKGVudHJpZXMpO1xuICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBTdGFja2AuXG5TdGFjay5wcm90b3R5cGUuY2xlYXIgPSBzdGFja0NsZWFyO1xuU3RhY2sucHJvdG90eXBlWydkZWxldGUnXSA9IHN0YWNrRGVsZXRlO1xuU3RhY2sucHJvdG90eXBlLmdldCA9IHN0YWNrR2V0O1xuU3RhY2sucHJvdG90eXBlLmhhcyA9IHN0YWNrSGFzO1xuU3RhY2sucHJvdG90eXBlLnNldCA9IHN0YWNrU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0YWNrO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bWJvbDtcbiIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBVaW50OEFycmF5ID0gcm9vdC5VaW50OEFycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVpbnQ4QXJyYXk7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFdlYWtNYXAgPSBnZXROYXRpdmUocm9vdCwgJ1dlYWtNYXAnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBXZWFrTWFwO1xuIiwiLyoqXG4gKiBBIGZhc3RlciBhbHRlcm5hdGl2ZSB0byBgRnVuY3Rpb24jYXBwbHlgLCB0aGlzIGZ1bmN0aW9uIGludm9rZXMgYGZ1bmNgXG4gKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2AgYW5kIHRoZSBhcmd1bWVudHMgb2YgYGFyZ3NgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAqL1xuZnVuY3Rpb24gYXBwbHkoZnVuYywgdGhpc0FyZywgYXJncykge1xuICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcpO1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICB9XG4gIHJldHVybiBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFwcGx5O1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZm9yRWFjaGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5RWFjaChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5RWFjaDtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZpbHRlcmAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheUZpbHRlcihhcnJheSwgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICByZXNJbmRleCA9IDAsXG4gICAgICByZXN1bHQgPSBbXTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUZpbHRlcjtcbiIsInZhciBiYXNlSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Jhc2VJbmRleE9mJyk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluY2x1ZGVzYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIHNwZWNpZnlpbmcgYW4gaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheUluY2x1ZGVzKGFycmF5LCB2YWx1ZSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIHJldHVybiAhIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIDApID4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlJbmNsdWRlcztcbiIsIi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhcnJheUluY2x1ZGVzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgY29tcGFyYXRvci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5jbHVkZXNXaXRoKGFycmF5LCB2YWx1ZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGNvbXBhcmF0b3IodmFsdWUsIGFycmF5W2luZGV4XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4iLCJ2YXIgYmFzZVRpbWVzID0gcmVxdWlyZSgnLi9fYmFzZVRpbWVzJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSBpbmhlcml0ZWQgU3BlY2lmeSByZXR1cm5pbmcgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7XG4gIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpLFxuICAgICAgaXNBcmcgPSAhaXNBcnIgJiYgaXNBcmd1bWVudHModmFsdWUpLFxuICAgICAgaXNCdWZmID0gIWlzQXJyICYmICFpc0FyZyAmJiBpc0J1ZmZlcih2YWx1ZSksXG4gICAgICBpc1R5cGUgPSAhaXNBcnIgJiYgIWlzQXJnICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHZhbHVlKSxcbiAgICAgIHNraXBJbmRleGVzID0gaXNBcnIgfHwgaXNBcmcgfHwgaXNCdWZmIHx8IGlzVHlwZSxcbiAgICAgIHJlc3VsdCA9IHNraXBJbmRleGVzID8gYmFzZVRpbWVzKHZhbHVlLmxlbmd0aCwgU3RyaW5nKSA6IFtdLFxuICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSAmJlxuICAgICAgICAhKHNraXBJbmRleGVzICYmIChcbiAgICAgICAgICAgLy8gU2FmYXJpIDkgaGFzIGVudW1lcmFibGUgYGFyZ3VtZW50cy5sZW5ndGhgIGluIHN0cmljdCBtb2RlLlxuICAgICAgICAgICBrZXkgPT0gJ2xlbmd0aCcgfHxcbiAgICAgICAgICAgLy8gTm9kZS5qcyAwLjEwIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIGJ1ZmZlcnMuXG4gICAgICAgICAgIChpc0J1ZmYgJiYgKGtleSA9PSAnb2Zmc2V0JyB8fCBrZXkgPT0gJ3BhcmVudCcpKSB8fFxuICAgICAgICAgICAvLyBQaGFudG9tSlMgMiBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiB0eXBlZCBhcnJheXMuXG4gICAgICAgICAgIChpc1R5cGUgJiYgKGtleSA9PSAnYnVmZmVyJyB8fCBrZXkgPT0gJ2J5dGVMZW5ndGgnIHx8IGtleSA9PSAnYnl0ZU9mZnNldCcpKSB8fFxuICAgICAgICAgICAvLyBTa2lwIGluZGV4IHByb3BlcnRpZXMuXG4gICAgICAgICAgIGlzSW5kZXgoa2V5LCBsZW5ndGgpXG4gICAgICAgICkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5TGlrZUtleXM7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tYXBgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICogc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5TWFwO1xuIiwiLyoqXG4gKiBBcHBlbmRzIHRoZSBlbGVtZW50cyBvZiBgdmFsdWVzYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYXBwZW5kLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5UHVzaChhcnJheSwgdmFsdWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgIG9mZnNldCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFycmF5W29mZnNldCArIGluZGV4XSA9IHZhbHVlc1tpbmRleF07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5UHVzaDtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnJlZHVjZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAgYXNcbiAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICBhY2N1bXVsYXRvciA9IGFycmF5WysraW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYWNjdW11bGF0b3IgPSBpdGVyYXRlZShhY2N1bXVsYXRvciwgYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheVJlZHVjZTtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNvbWVgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICogc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheVNvbWUoYXJyYXksIHByZWRpY2F0ZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlTb21lO1xuIiwidmFyIGJhc2VQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2Jhc2VQcm9wZXJ0eScpO1xuXG4vKipcbiAqIEdldHMgdGhlIHNpemUgb2YgYW4gQVNDSUkgYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gKi9cbnZhciBhc2NpaVNpemUgPSBiYXNlUHJvcGVydHkoJ2xlbmd0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFzY2lpU2l6ZTtcbiIsInZhciBiYXNlQXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19iYXNlQXNzaWduVmFsdWUnKSxcbiAgICBlcSA9IHJlcXVpcmUoJy4vZXEnKTtcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFzc2lnblZhbHVlYCBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IGFzc2lnblxuICogYHVuZGVmaW5lZGAgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIGlmICgodmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZXEob2JqZWN0W2tleV0sIHZhbHVlKSkgfHxcbiAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NpZ25NZXJnZVZhbHVlO1xuIiwidmFyIGJhc2VBc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ25WYWx1ZScpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEFzc2lnbnMgYHZhbHVlYCB0byBga2V5YCBvZiBgb2JqZWN0YCBpZiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgbm90IGVxdWl2YWxlbnRcbiAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldO1xuICBpZiAoIShoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBlcShvYmpWYWx1ZSwgdmFsdWUpKSB8fFxuICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzc2lnblZhbHVlO1xuIiwidmFyIGVxID0gcmVxdWlyZSgnLi9lcScpO1xuXG4vKipcbiAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBga2V5YCBpcyBmb3VuZCBpbiBgYXJyYXlgIG9mIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IGtleSBUaGUga2V5IHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksIGtleSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkge1xuICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzc29jSW5kZXhPZjtcbiIsInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VBc3NpZ247XG4iLCJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbkluYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXNcbiAqIG9yIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlQXNzaWduSW4ob2JqZWN0LCBzb3VyY2UpIHtcbiAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUFzc2lnbkluO1xuIiwidmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fZGVmaW5lUHJvcGVydHknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYXNzaWduVmFsdWVgIGFuZCBgYXNzaWduTWVyZ2VWYWx1ZWAgd2l0aG91dFxuICogdmFsdWUgY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSA9PSAnX19wcm90b19fJyAmJiBkZWZpbmVQcm9wZXJ0eSkge1xuICAgIGRlZmluZVByb3BlcnR5KG9iamVjdCwga2V5LCB7XG4gICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICdlbnVtZXJhYmxlJzogdHJ1ZSxcbiAgICAgICd2YWx1ZSc6IHZhbHVlLFxuICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQXNzaWduVmFsdWU7XG4iLCJ2YXIgU3RhY2sgPSByZXF1aXJlKCcuL19TdGFjaycpLFxuICAgIGFycmF5RWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5RWFjaCcpLFxuICAgIGFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduVmFsdWUnKSxcbiAgICBiYXNlQXNzaWduID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnbicpLFxuICAgIGJhc2VBc3NpZ25JbiA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ25JbicpLFxuICAgIGNsb25lQnVmZmVyID0gcmVxdWlyZSgnLi9fY2xvbmVCdWZmZXInKSxcbiAgICBjb3B5QXJyYXkgPSByZXF1aXJlKCcuL19jb3B5QXJyYXknKSxcbiAgICBjb3B5U3ltYm9scyA9IHJlcXVpcmUoJy4vX2NvcHlTeW1ib2xzJyksXG4gICAgY29weVN5bWJvbHNJbiA9IHJlcXVpcmUoJy4vX2NvcHlTeW1ib2xzSW4nKSxcbiAgICBnZXRBbGxLZXlzID0gcmVxdWlyZSgnLi9fZ2V0QWxsS2V5cycpLFxuICAgIGdldEFsbEtleXNJbiA9IHJlcXVpcmUoJy4vX2dldEFsbEtleXNJbicpLFxuICAgIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGluaXRDbG9uZUFycmF5ID0gcmVxdWlyZSgnLi9faW5pdENsb25lQXJyYXknKSxcbiAgICBpbml0Q2xvbmVCeVRhZyA9IHJlcXVpcmUoJy4vX2luaXRDbG9uZUJ5VGFnJyksXG4gICAgaW5pdENsb25lT2JqZWN0ID0gcmVxdWlyZSgnLi9faW5pdENsb25lT2JqZWN0JyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzTWFwID0gcmVxdWlyZSgnLi9pc01hcCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzU2V0ID0gcmVxdWlyZSgnLi9pc1NldCcpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xudmFyIENMT05FX0RFRVBfRkxBRyA9IDEsXG4gICAgQ0xPTkVfRkxBVF9GTEFHID0gMixcbiAgICBDTE9ORV9TWU1CT0xTX0ZMQUcgPSA0O1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbi8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIHN1cHBvcnRlZCBieSBgXy5jbG9uZWAuICovXG52YXIgY2xvbmVhYmxlVGFncyA9IHt9O1xuY2xvbmVhYmxlVGFnc1thcmdzVGFnXSA9IGNsb25lYWJsZVRhZ3NbYXJyYXlUYWddID1cbmNsb25lYWJsZVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRhVmlld1RhZ10gPVxuY2xvbmVhYmxlVGFnc1tib29sVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0ZVRhZ10gPVxuY2xvbmVhYmxlVGFnc1tmbG9hdDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZmxvYXQ2NFRhZ10gPVxuY2xvbmVhYmxlVGFnc1tpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50MTZUYWddID1cbmNsb25lYWJsZVRhZ3NbaW50MzJUYWddID0gY2xvbmVhYmxlVGFnc1ttYXBUYWddID1cbmNsb25lYWJsZVRhZ3NbbnVtYmVyVGFnXSA9IGNsb25lYWJsZVRhZ3Nbb2JqZWN0VGFnXSA9XG5jbG9uZWFibGVUYWdzW3JlZ2V4cFRhZ10gPSBjbG9uZWFibGVUYWdzW3NldFRhZ10gPVxuY2xvbmVhYmxlVGFnc1tzdHJpbmdUYWddID0gY2xvbmVhYmxlVGFnc1tzeW1ib2xUYWddID1cbmNsb25lYWJsZVRhZ3NbdWludDhUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50OENsYW1wZWRUYWddID1cbmNsb25lYWJsZVRhZ3NbdWludDE2VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG5jbG9uZWFibGVUYWdzW2Vycm9yVGFnXSA9IGNsb25lYWJsZVRhZ3NbZnVuY1RhZ10gPVxuY2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsb25lYCBhbmQgYF8uY2xvbmVEZWVwYCB3aGljaCB0cmFja3NcbiAqIHRyYXZlcnNlZCBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAqICAxIC0gRGVlcCBjbG9uZVxuICogIDIgLSBGbGF0dGVuIGluaGVyaXRlZCBwcm9wZXJ0aWVzXG4gKiAgNCAtIENsb25lIHN5bWJvbHNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gVGhlIGtleSBvZiBgdmFsdWVgLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBwYXJlbnQgb2JqZWN0IG9mIGB2YWx1ZWAuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIG9iamVjdHMgYW5kIHRoZWlyIGNsb25lIGNvdW50ZXJwYXJ0cy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCBvYmplY3QsIHN0YWNrKSB7XG4gIHZhciByZXN1bHQsXG4gICAgICBpc0RlZXAgPSBiaXRtYXNrICYgQ0xPTkVfREVFUF9GTEFHLFxuICAgICAgaXNGbGF0ID0gYml0bWFzayAmIENMT05FX0ZMQVRfRkxBRyxcbiAgICAgIGlzRnVsbCA9IGJpdG1hc2sgJiBDTE9ORV9TWU1CT0xTX0ZMQUc7XG5cbiAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICByZXN1bHQgPSBvYmplY3QgPyBjdXN0b21pemVyKHZhbHVlLCBrZXksIG9iamVjdCwgc3RhY2spIDogY3VzdG9taXplcih2YWx1ZSk7XG4gIH1cbiAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKTtcbiAgaWYgKGlzQXJyKSB7XG4gICAgcmVzdWx0ID0gaW5pdENsb25lQXJyYXkodmFsdWUpO1xuICAgIGlmICghaXNEZWVwKSB7XG4gICAgICByZXR1cm4gY29weUFycmF5KHZhbHVlLCByZXN1bHQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKSxcbiAgICAgICAgaXNGdW5jID0gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcblxuICAgIGlmIChpc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjbG9uZUJ1ZmZlcih2YWx1ZSwgaXNEZWVwKTtcbiAgICB9XG4gICAgaWYgKHRhZyA9PSBvYmplY3RUYWcgfHwgdGFnID09IGFyZ3NUYWcgfHwgKGlzRnVuYyAmJiAhb2JqZWN0KSkge1xuICAgICAgcmVzdWx0ID0gKGlzRmxhdCB8fCBpc0Z1bmMpID8ge30gOiBpbml0Q2xvbmVPYmplY3QodmFsdWUpO1xuICAgICAgaWYgKCFpc0RlZXApIHtcbiAgICAgICAgcmV0dXJuIGlzRmxhdFxuICAgICAgICAgID8gY29weVN5bWJvbHNJbih2YWx1ZSwgYmFzZUFzc2lnbkluKHJlc3VsdCwgdmFsdWUpKVxuICAgICAgICAgIDogY29weVN5bWJvbHModmFsdWUsIGJhc2VBc3NpZ24ocmVzdWx0LCB2YWx1ZSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWNsb25lYWJsZVRhZ3NbdGFnXSkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID8gdmFsdWUgOiB7fTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IGluaXRDbG9uZUJ5VGFnKHZhbHVlLCB0YWcsIGlzRGVlcCk7XG4gICAgfVxuICB9XG4gIC8vIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm4gaXRzIGNvcnJlc3BvbmRpbmcgY2xvbmUuXG4gIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KHZhbHVlKTtcbiAgaWYgKHN0YWNrZWQpIHtcbiAgICByZXR1cm4gc3RhY2tlZDtcbiAgfVxuICBzdGFjay5zZXQodmFsdWUsIHJlc3VsdCk7XG5cbiAgaWYgKGlzU2V0KHZhbHVlKSkge1xuICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24oc3ViVmFsdWUpIHtcbiAgICAgIHJlc3VsdC5hZGQoYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdWJWYWx1ZSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoaXNNYXAodmFsdWUpKSB7XG4gICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHQuc2V0KGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGtleXNGdW5jID0gaXNGdWxsXG4gICAgPyAoaXNGbGF0ID8gZ2V0QWxsS2V5c0luIDogZ2V0QWxsS2V5cylcbiAgICA6IChpc0ZsYXQgPyBrZXlzSW4gOiBrZXlzKTtcblxuICB2YXIgcHJvcHMgPSBpc0FyciA/IHVuZGVmaW5lZCA6IGtleXNGdW5jKHZhbHVlKTtcbiAgYXJyYXlFYWNoKHByb3BzIHx8IHZhbHVlLCBmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgaWYgKHByb3BzKSB7XG4gICAgICBrZXkgPSBzdWJWYWx1ZTtcbiAgICAgIHN1YlZhbHVlID0gdmFsdWVba2V5XTtcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgcG9wdWxhdGUgY2xvbmUgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBhc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQ2xvbmU7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGU7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY3JlYXRlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGFzc2lnbmluZ1xuICogcHJvcGVydGllcyB0byB0aGUgY3JlYXRlZCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm90byBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKi9cbnZhciBiYXNlQ3JlYXRlID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBvYmplY3QoKSB7fVxuICByZXR1cm4gZnVuY3Rpb24ocHJvdG8pIHtcbiAgICBpZiAoIWlzT2JqZWN0KHByb3RvKSkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBpZiAob2JqZWN0Q3JlYXRlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0Q3JlYXRlKHByb3RvKTtcbiAgICB9XG4gICAgb2JqZWN0LnByb3RvdHlwZSA9IHByb3RvO1xuICAgIHZhciByZXN1bHQgPSBuZXcgb2JqZWN0O1xuICAgIG9iamVjdC5wcm90b3R5cGUgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUNyZWF0ZTtcbiIsInZhciBiYXNlRm9yT3duID0gcmVxdWlyZSgnLi9fYmFzZUZvck93bicpLFxuICAgIGNyZWF0ZUJhc2VFYWNoID0gcmVxdWlyZSgnLi9fY3JlYXRlQmFzZUVhY2gnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JFYWNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAqL1xudmFyIGJhc2VFYWNoID0gY3JlYXRlQmFzZUVhY2goYmFzZUZvck93bik7XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUVhY2g7XG4iLCJ2YXIgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLm1heGAgYW5kIGBfLm1pbmAgd2hpY2ggYWNjZXB0cyBhXG4gKiBgY29tcGFyYXRvcmAgdG8gZGV0ZXJtaW5lIHRoZSBleHRyZW11bSB2YWx1ZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIHVzZWQgdG8gY29tcGFyZSB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZXh0cmVtdW0gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VFeHRyZW11bShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgIGN1cnJlbnQgPSBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICBpZiAoY3VycmVudCAhPSBudWxsICYmIChjb21wdXRlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyAoY3VycmVudCA9PT0gY3VycmVudCAmJiAhaXNTeW1ib2woY3VycmVudCkpXG4gICAgICAgICAgOiBjb21wYXJhdG9yKGN1cnJlbnQsIGNvbXB1dGVkKVxuICAgICAgICApKSB7XG4gICAgICB2YXIgY29tcHV0ZWQgPSBjdXJyZW50LFxuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VFeHRyZW11bTtcbiIsInZhciBiYXNlRWFjaCA9IHJlcXVpcmUoJy4vX2Jhc2VFYWNoJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmlsdGVyYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGaWx0ZXIoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKSB7XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRmlsdGVyO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maW5kSW5kZXhgIGFuZCBgXy5maW5kTGFzdEluZGV4YCB3aXRob3V0XG4gKiBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4LCBmcm9tUmlnaHQpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIGluZGV4ID0gZnJvbUluZGV4ICsgKGZyb21SaWdodCA/IDEgOiAtMSk7XG5cbiAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZpbmRJbmRleDtcbiIsInZhciBhcnJheVB1c2ggPSByZXF1aXJlKCcuL19hcnJheVB1c2gnKSxcbiAgICBpc0ZsYXR0ZW5hYmxlID0gcmVxdWlyZSgnLi9faXNGbGF0dGVuYWJsZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGggc3VwcG9ydCBmb3IgcmVzdHJpY3RpbmcgZmxhdHRlbmluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiBAcGFyYW0ge251bWJlcn0gZGVwdGggVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICogQHBhcmFtIHtib29sZWFufSBbcHJlZGljYXRlPWlzRmxhdHRlbmFibGVdIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N0cmljdF0gUmVzdHJpY3QgdG8gdmFsdWVzIHRoYXQgcGFzcyBgcHJlZGljYXRlYCBjaGVja3MuXG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0PVtdXSBUaGUgaW5pdGlhbCByZXN1bHQgdmFsdWUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHByZWRpY2F0ZSB8fCAocHJlZGljYXRlID0gaXNGbGF0dGVuYWJsZSk7XG4gIHJlc3VsdCB8fCAocmVzdWx0ID0gW10pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgIGlmIChkZXB0aCA+IDAgJiYgcHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgaWYgKGRlcHRoID4gMSkge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBmbGF0dGVuIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBiYXNlRmxhdHRlbih2YWx1ZSwgZGVwdGggLSAxLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXlQdXNoKHJlc3VsdCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzU3RyaWN0KSB7XG4gICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRmxhdHRlbjtcbiIsInZhciBjcmVhdGVCYXNlRm9yID0gcmVxdWlyZSgnLi9fY3JlYXRlQmFzZUZvcicpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBiYXNlRm9yT3duYCB3aGljaCBpdGVyYXRlcyBvdmVyIGBvYmplY3RgXG4gKiBwcm9wZXJ0aWVzIHJldHVybmVkIGJ5IGBrZXlzRnVuY2AgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xudmFyIGJhc2VGb3IgPSBjcmVhdGVCYXNlRm9yKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZvcjtcbiIsInZhciBiYXNlRm9yID0gcmVxdWlyZSgnLi9fYmFzZUZvcicpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JPd25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlRm9yT3duKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yKG9iamVjdCwgaXRlcmF0ZWUsIGtleXMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VGb3JPd247XG4iLCJ2YXIgY2FzdFBhdGggPSByZXF1aXJlKCcuL19jYXN0UGF0aCcpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5nZXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVmYXVsdCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXQob2JqZWN0LCBwYXRoKSB7XG4gIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IDAsXG4gICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICB3aGlsZSAob2JqZWN0ICE9IG51bGwgJiYgaW5kZXggPCBsZW5ndGgpIHtcbiAgICBvYmplY3QgPSBvYmplY3RbdG9LZXkocGF0aFtpbmRleCsrXSldO1xuICB9XG4gIHJldHVybiAoaW5kZXggJiYgaW5kZXggPT0gbGVuZ3RoKSA/IG9iamVjdCA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR2V0O1xuIiwidmFyIGFycmF5UHVzaCA9IHJlcXVpcmUoJy4vX2FycmF5UHVzaCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0QWxsS2V5c2AgYW5kIGBnZXRBbGxLZXlzSW5gIHdoaWNoIHVzZXNcbiAqIGBrZXlzRnVuY2AgYW5kIGBzeW1ib2xzRnVuY2AgdG8gZ2V0IHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN5bWJvbHNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNGdW5jLCBzeW1ib2xzRnVuYykge1xuICB2YXIgcmVzdWx0ID0ga2V5c0Z1bmMob2JqZWN0KTtcbiAgcmV0dXJuIGlzQXJyYXkob2JqZWN0KSA/IHJlc3VsdCA6IGFycmF5UHVzaChyZXN1bHQsIHN5bWJvbHNGdW5jKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXRBbGxLZXlzO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGdldFJhd1RhZyA9IHJlcXVpcmUoJy4vX2dldFJhd1RhZycpLFxuICAgIG9iamVjdFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fb2JqZWN0VG9TdHJpbmcnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsXG4gICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXSc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgfVxuICByZXR1cm4gKHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkpXG4gICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgOiBvYmplY3RUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldFRhZztcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ3RgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHdCh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIHZhbHVlID4gb3RoZXI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUd0O1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5oYXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VIYXMob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VIYXM7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc0luYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSGFzSW4ob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGtleSBpbiBPYmplY3Qob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSGFzSW47XG4iLCJ2YXIgYmFzZUZpbmRJbmRleCA9IHJlcXVpcmUoJy4vX2Jhc2VGaW5kSW5kZXgnKSxcbiAgICBiYXNlSXNOYU4gPSByZXF1aXJlKCcuL19iYXNlSXNOYU4nKSxcbiAgICBzdHJpY3RJbmRleE9mID0gcmVxdWlyZSgnLi9fc3RyaWN0SW5kZXhPZicpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmluZGV4T2ZgIHdpdGhvdXQgYGZyb21JbmRleGAgYm91bmRzIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlXG4gICAgPyBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KVxuICAgIDogYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBmcm9tSW5kZXgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJbmRleE9mO1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FyZ3VtZW50c2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICovXG5mdW5jdGlvbiBiYXNlSXNBcmd1bWVudHModmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYXJnc1RhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNBcmd1bWVudHM7XG4iLCJ2YXIgYmFzZUlzRXF1YWxEZWVwID0gcmVxdWlyZSgnLi9fYmFzZUlzRXF1YWxEZWVwJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0VxdWFsYCB3aGljaCBzdXBwb3J0cyBwYXJ0aWFsIGNvbXBhcmlzb25zXG4gKiBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAqICAxIC0gVW5vcmRlcmVkIGNvbXBhcmlzb25cbiAqICAyIC0gUGFydGlhbCBjb21wYXJpc29uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgYHZhbHVlYCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykge1xuICBpZiAodmFsdWUgPT09IG90aGVyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHZhbHVlID09IG51bGwgfHwgb3RoZXIgPT0gbnVsbCB8fCAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgIWlzT2JqZWN0TGlrZShvdGhlcikpKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXI7XG4gIH1cbiAgcmV0dXJuIGJhc2VJc0VxdWFsRGVlcCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGJhc2VJc0VxdWFsLCBzdGFjayk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzRXF1YWw7XG4iLCJ2YXIgU3RhY2sgPSByZXF1aXJlKCcuL19TdGFjaycpLFxuICAgIGVxdWFsQXJyYXlzID0gcmVxdWlyZSgnLi9fZXF1YWxBcnJheXMnKSxcbiAgICBlcXVhbEJ5VGFnID0gcmVxdWlyZSgnLi9fZXF1YWxCeVRhZycpLFxuICAgIGVxdWFsT2JqZWN0cyA9IHJlcXVpcmUoJy4vX2VxdWFsT2JqZWN0cycpLFxuICAgIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDE7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAqIGRlZXAgY29tcGFyaXNvbnMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAqIHJlZmVyZW5jZXMgdG8gYmUgY29tcGFyZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gIHZhciBvYmpJc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgIG90aElzQXJyID0gaXNBcnJheShvdGhlciksXG4gICAgICBvYmpUYWcgPSBvYmpJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG9iamVjdCksXG4gICAgICBvdGhUYWcgPSBvdGhJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG90aGVyKTtcblxuICBvYmpUYWcgPSBvYmpUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG9ialRhZztcbiAgb3RoVGFnID0gb3RoVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvdGhUYWc7XG5cbiAgdmFyIG9iaklzT2JqID0gb2JqVGFnID09IG9iamVjdFRhZyxcbiAgICAgIG90aElzT2JqID0gb3RoVGFnID09IG9iamVjdFRhZyxcbiAgICAgIGlzU2FtZVRhZyA9IG9ialRhZyA9PSBvdGhUYWc7XG5cbiAgaWYgKGlzU2FtZVRhZyAmJiBpc0J1ZmZlcihvYmplY3QpKSB7XG4gICAgaWYgKCFpc0J1ZmZlcihvdGhlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgb2JqSXNBcnIgPSB0cnVlO1xuICAgIG9iaklzT2JqID0gZmFsc2U7XG4gIH1cbiAgaWYgKGlzU2FtZVRhZyAmJiAhb2JqSXNPYmopIHtcbiAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgIHJldHVybiAob2JqSXNBcnIgfHwgaXNUeXBlZEFycmF5KG9iamVjdCkpXG4gICAgICA/IGVxdWFsQXJyYXlzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spXG4gICAgICA6IGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgb2JqVGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgfVxuICBpZiAoIShiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcpKSB7XG4gICAgdmFyIG9iaklzV3JhcHBlZCA9IG9iaklzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCAnX193cmFwcGVkX18nKSxcbiAgICAgICAgb3RoSXNXcmFwcGVkID0gb3RoSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwgJ19fd3JhcHBlZF9fJyk7XG5cbiAgICBpZiAob2JqSXNXcmFwcGVkIHx8IG90aElzV3JhcHBlZCkge1xuICAgICAgdmFyIG9ialVud3JhcHBlZCA9IG9iaklzV3JhcHBlZCA/IG9iamVjdC52YWx1ZSgpIDogb2JqZWN0LFxuICAgICAgICAgIG90aFVud3JhcHBlZCA9IG90aElzV3JhcHBlZCA/IG90aGVyLnZhbHVlKCkgOiBvdGhlcjtcblxuICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgIHJldHVybiBlcXVhbEZ1bmMob2JqVW53cmFwcGVkLCBvdGhVbndyYXBwZWQsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFpc1NhbWVUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgcmV0dXJuIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNFcXVhbERlZXA7XG4iLCJ2YXIgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWFwYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNNYXAodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBtYXBUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzTWFwO1xuIiwidmFyIFN0YWNrID0gcmVxdWlyZSgnLi9fU3RhY2snKSxcbiAgICBiYXNlSXNFcXVhbCA9IHJlcXVpcmUoJy4vX2Jhc2VJc0VxdWFsJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hdGNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7QXJyYXl9IG1hdGNoRGF0YSBUaGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3MgdG8gbWF0Y2guXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEsIGN1c3RvbWl6ZXIpIHtcbiAgdmFyIGluZGV4ID0gbWF0Y2hEYXRhLmxlbmd0aCxcbiAgICAgIGxlbmd0aCA9IGluZGV4LFxuICAgICAgbm9DdXN0b21pemVyID0gIWN1c3RvbWl6ZXI7XG5cbiAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgcmV0dXJuICFsZW5ndGg7XG4gIH1cbiAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gIHdoaWxlIChpbmRleC0tKSB7XG4gICAgdmFyIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgIGlmICgobm9DdXN0b21pemVyICYmIGRhdGFbMl0pXG4gICAgICAgICAgPyBkYXRhWzFdICE9PSBvYmplY3RbZGF0YVswXV1cbiAgICAgICAgICA6ICEoZGF0YVswXSBpbiBvYmplY3QpXG4gICAgICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgIHZhciBrZXkgPSBkYXRhWzBdLFxuICAgICAgICBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICBzcmNWYWx1ZSA9IGRhdGFbMV07XG5cbiAgICBpZiAobm9DdXN0b21pemVyICYmIGRhdGFbMl0pIHtcbiAgICAgIGlmIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc3RhY2sgPSBuZXcgU3RhY2s7XG4gICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICghKHJlc3VsdCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgICAgIDogcmVzdWx0XG4gICAgICAgICAgKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc01hdGNoO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNOYU47XG4iLCJ2YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzTWFza2VkID0gcmVxdWlyZSgnLi9faXNNYXNrZWQnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICB0b1NvdXJjZSA9IHJlcXVpcmUoJy4vX3RvU291cmNlJyk7XG5cbi8qKlxuICogVXNlZCB0byBtYXRjaCBgUmVnRXhwYFxuICogW3N5bnRheCBjaGFyYWN0ZXJzXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wYXR0ZXJucykuXG4gKi9cbnZhciByZVJlZ0V4cENoYXIgPSAvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBob3N0IGNvbnN0cnVjdG9ycyAoU2FmYXJpKS4gKi9cbnZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGlmIGEgbWV0aG9kIGlzIG5hdGl2ZS4gKi9cbnZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gIGZ1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gIC5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLCAnJDEuKj8nKSArICckJ1xuKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkgfHwgaXNNYXNrZWQodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwYXR0ZXJuID0gaXNGdW5jdGlvbih2YWx1ZSkgPyByZUlzTmF0aXZlIDogcmVJc0hvc3RDdG9yO1xuICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzTmF0aXZlO1xuIiwidmFyIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzZXRUYWcgPSAnW29iamVjdCBTZXRdJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1NldGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzZXQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzU2V0KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gc2V0VGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc1NldDtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbi8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIG9mIHR5cGVkIGFycmF5cy4gKi9cbnZhciB0eXBlZEFycmF5VGFncyA9IHt9O1xudHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXSA9XG50eXBlZEFycmF5VGFnc1tpbnQ4VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXSA9XG50eXBlZEFycmF5VGFnc1tpbnQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50OFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ10gPVxudHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG50eXBlZEFycmF5VGFnc1thcmdzVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXSA9XG50eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tib29sVGFnXSA9XG50eXBlZEFycmF5VGFnc1tkYXRhVmlld1RhZ10gPSB0eXBlZEFycmF5VGFnc1tkYXRlVGFnXSA9XG50eXBlZEFycmF5VGFnc1tlcnJvclRhZ10gPSB0eXBlZEFycmF5VGFnc1tmdW5jVGFnXSA9XG50eXBlZEFycmF5VGFnc1ttYXBUYWddID0gdHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXSA9XG50eXBlZEFycmF5VGFnc1tvYmplY3RUYWddID0gdHlwZWRBcnJheVRhZ3NbcmVnZXhwVGFnXSA9XG50eXBlZEFycmF5VGFnc1tzZXRUYWddID0gdHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXSA9XG50eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzVHlwZWRBcnJheWAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNUeXBlZEFycmF5KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmXG4gICAgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhIXR5cGVkQXJyYXlUYWdzW2Jhc2VHZXRUYWcodmFsdWUpXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNUeXBlZEFycmF5O1xuIiwidmFyIGJhc2VNYXRjaGVzID0gcmVxdWlyZSgnLi9fYmFzZU1hdGNoZXMnKSxcbiAgICBiYXNlTWF0Y2hlc1Byb3BlcnR5ID0gcmVxdWlyZSgnLi9fYmFzZU1hdGNoZXNQcm9wZXJ0eScpLFxuICAgIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBwcm9wZXJ0eSA9IHJlcXVpcmUoJy4vcHJvcGVydHknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pdGVyYXRlZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gW3ZhbHVlPV8uaWRlbnRpdHldIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGFuIGl0ZXJhdGVlLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBpdGVyYXRlZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUl0ZXJhdGVlKHZhbHVlKSB7XG4gIC8vIERvbid0IHN0b3JlIHRoZSBgdHlwZW9mYCByZXN1bHQgaW4gYSB2YXJpYWJsZSB0byBhdm9pZCBhIEpJVCBidWcgaW4gU2FmYXJpIDkuXG4gIC8vIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU2MDM0IGZvciBtb3JlIGRldGFpbHMuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiBpZGVudGl0eTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpXG4gICAgICA/IGJhc2VNYXRjaGVzUHJvcGVydHkodmFsdWVbMF0sIHZhbHVlWzFdKVxuICAgICAgOiBiYXNlTWF0Y2hlcyh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHByb3BlcnR5KHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXRlcmF0ZWU7XG4iLCJ2YXIgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpLFxuICAgIG5hdGl2ZUtleXMgPSByZXF1aXJlKCcuL19uYXRpdmVLZXlzJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c2Agd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBiYXNlS2V5cyhvYmplY3QpIHtcbiAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXMob2JqZWN0KTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gW107XG4gIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBrZXkgIT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlS2V5cztcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyksXG4gICAgbmF0aXZlS2V5c0luID0gcmVxdWlyZSgnLi9fbmF0aXZlS2V5c0luJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c0luYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBuYXRpdmVLZXlzSW4ob2JqZWN0KTtcbiAgfVxuICB2YXIgaXNQcm90byA9IGlzUHJvdG90eXBlKG9iamVjdCksXG4gICAgICByZXN1bHQgPSBbXTtcblxuICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKCEoa2V5ID09ICdjb25zdHJ1Y3RvcicgJiYgKGlzUHJvdG8gfHwgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUtleXNJbjtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubHRgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VMdCh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIHZhbHVlIDwgb3RoZXI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUx0O1xuIiwidmFyIGJhc2VFYWNoID0gcmVxdWlyZSgnLi9fYmFzZUVhY2gnKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXBgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZU1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IGl0ZXJhdGVlKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWFwO1xuIiwidmFyIGJhc2VJc01hdGNoID0gcmVxdWlyZSgnLi9fYmFzZUlzTWF0Y2gnKSxcbiAgICBnZXRNYXRjaERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXRjaERhdGEnKSxcbiAgICBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSA9IHJlcXVpcmUoJy4vX21hdGNoZXNTdHJpY3RDb21wYXJhYmxlJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VNYXRjaGVzKHNvdXJjZSkge1xuICB2YXIgbWF0Y2hEYXRhID0gZ2V0TWF0Y2hEYXRhKHNvdXJjZSk7XG4gIGlmIChtYXRjaERhdGEubGVuZ3RoID09IDEgJiYgbWF0Y2hEYXRhWzBdWzJdKSB7XG4gICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKG1hdGNoRGF0YVswXVswXSwgbWF0Y2hEYXRhWzBdWzFdKTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdCA9PT0gc291cmNlIHx8IGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VNYXRjaGVzO1xuIiwidmFyIGJhc2VJc0VxdWFsID0gcmVxdWlyZSgnLi9fYmFzZUlzRXF1YWwnKSxcbiAgICBnZXQgPSByZXF1aXJlKCcuL2dldCcpLFxuICAgIGhhc0luID0gcmVxdWlyZSgnLi9oYXNJbicpLFxuICAgIGlzS2V5ID0gcmVxdWlyZSgnLi9faXNLZXknKSxcbiAgICBpc1N0cmljdENvbXBhcmFibGUgPSByZXF1aXJlKCcuL19pc1N0cmljdENvbXBhcmFibGUnKSxcbiAgICBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSA9IHJlcXVpcmUoJy4vX21hdGNoZXNTdHJpY3RDb21wYXJhYmxlJyksXG4gICAgdG9LZXkgPSByZXF1aXJlKCcuL190b0tleScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc1Byb3BlcnR5YCB3aGljaCBkb2Vzbid0IGNsb25lIGBzcmNWYWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCwgc3JjVmFsdWUpIHtcbiAgaWYgKGlzS2V5KHBhdGgpICYmIGlzU3RyaWN0Q29tcGFyYWJsZShzcmNWYWx1ZSkpIHtcbiAgICByZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUodG9LZXkocGF0aCksIHNyY1ZhbHVlKTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIG9ialZhbHVlID0gZ2V0KG9iamVjdCwgcGF0aCk7XG4gICAgcmV0dXJuIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIG9ialZhbHVlID09PSBzcmNWYWx1ZSlcbiAgICAgID8gaGFzSW4ob2JqZWN0LCBwYXRoKVxuICAgICAgOiBiYXNlSXNFcXVhbChzcmNWYWx1ZSwgb2JqVmFsdWUsIENPTVBBUkVfUEFSVElBTF9GTEFHIHwgQ09NUEFSRV9VTk9SREVSRURfRkxBRyk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZU1hdGNoZXNQcm9wZXJ0eTtcbiIsInZhciBTdGFjayA9IHJlcXVpcmUoJy4vX1N0YWNrJyksXG4gICAgYXNzaWduTWVyZ2VWYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnbk1lcmdlVmFsdWUnKSxcbiAgICBiYXNlRm9yID0gcmVxdWlyZSgnLi9fYmFzZUZvcicpLFxuICAgIGJhc2VNZXJnZURlZXAgPSByZXF1aXJlKCcuL19iYXNlTWVyZ2VEZWVwJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAga2V5c0luID0gcmVxdWlyZSgnLi9rZXlzSW4nKSxcbiAgICBzYWZlR2V0ID0gcmVxdWlyZSgnLi9fc2FmZUdldCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1lcmdlYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgbWVyZ2VkIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gKiAgY291bnRlcnBhcnRzLlxuICovXG5mdW5jdGlvbiBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjaykge1xuICBpZiAob2JqZWN0ID09PSBzb3VyY2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYmFzZUZvcihzb3VyY2UsIGZ1bmN0aW9uKHNyY1ZhbHVlLCBrZXkpIHtcbiAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgIGlmIChpc09iamVjdChzcmNWYWx1ZSkpIHtcbiAgICAgIGJhc2VNZXJnZURlZXAob2JqZWN0LCBzb3VyY2UsIGtleSwgc3JjSW5kZXgsIGJhc2VNZXJnZSwgY3VzdG9taXplciwgc3RhY2spO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgPyBjdXN0b21pemVyKHNhZmVHZXQob2JqZWN0LCBrZXkpLCBzcmNWYWx1ZSwgKGtleSArICcnKSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBzcmNWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICB9XG4gIH0sIGtleXNJbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZU1lcmdlO1xuIiwidmFyIGFzc2lnbk1lcmdlVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25NZXJnZVZhbHVlJyksXG4gICAgY2xvbmVCdWZmZXIgPSByZXF1aXJlKCcuL19jbG9uZUJ1ZmZlcicpLFxuICAgIGNsb25lVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vX2Nsb25lVHlwZWRBcnJheScpLFxuICAgIGNvcHlBcnJheSA9IHJlcXVpcmUoJy4vX2NvcHlBcnJheScpLFxuICAgIGluaXRDbG9uZU9iamVjdCA9IHJlcXVpcmUoJy4vX2luaXRDbG9uZU9iamVjdCcpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0FycmF5TGlrZU9iamVjdCA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2VPYmplY3QnKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4vaXNQbGFpbk9iamVjdCcpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5JyksXG4gICAgc2FmZUdldCA9IHJlcXVpcmUoJy4vX3NhZmVHZXQnKSxcbiAgICB0b1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi90b1BsYWluT2JqZWN0Jyk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlTWVyZ2VgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAqIGRlZXAgbWVyZ2VzIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMgZW5hYmxpbmcgb2JqZWN0cyB3aXRoIGNpcmN1bGFyXG4gKiByZWZlcmVuY2VzIHRvIGJlIG1lcmdlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gbWVyZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gbWVyZ2VGdW5jIFRoZSBmdW5jdGlvbiB0byBtZXJnZSB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICogIGNvdW50ZXJwYXJ0cy5cbiAqL1xuZnVuY3Rpb24gYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgbWVyZ2VGdW5jLCBjdXN0b21pemVyLCBzdGFjaykge1xuICB2YXIgb2JqVmFsdWUgPSBzYWZlR2V0KG9iamVjdCwga2V5KSxcbiAgICAgIHNyY1ZhbHVlID0gc2FmZUdldChzb3VyY2UsIGtleSksXG4gICAgICBzdGFja2VkID0gc3RhY2suZ2V0KHNyY1ZhbHVlKTtcblxuICBpZiAoc3RhY2tlZCkge1xuICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIHN0YWNrZWQpO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgPyBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwgKGtleSArICcnKSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIHZhciBpc0NvbW1vbiA9IG5ld1ZhbHVlID09PSB1bmRlZmluZWQ7XG5cbiAgaWYgKGlzQ29tbW9uKSB7XG4gICAgdmFyIGlzQXJyID0gaXNBcnJheShzcmNWYWx1ZSksXG4gICAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiBpc0J1ZmZlcihzcmNWYWx1ZSksXG4gICAgICAgIGlzVHlwZWQgPSAhaXNBcnIgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkoc3JjVmFsdWUpO1xuXG4gICAgbmV3VmFsdWUgPSBzcmNWYWx1ZTtcbiAgICBpZiAoaXNBcnIgfHwgaXNCdWZmIHx8IGlzVHlwZWQpIHtcbiAgICAgIGlmIChpc0FycmF5KG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNBcnJheUxpa2VPYmplY3Qob2JqVmFsdWUpKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gY29weUFycmF5KG9ialZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGlzQnVmZikge1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICBuZXdWYWx1ZSA9IGNsb25lQnVmZmVyKHNyY1ZhbHVlLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGlzVHlwZWQpIHtcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgbmV3VmFsdWUgPSBjbG9uZVR5cGVkQXJyYXkoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIG5ld1ZhbHVlID0gW107XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzUGxhaW5PYmplY3Qoc3JjVmFsdWUpIHx8IGlzQXJndW1lbnRzKHNyY1ZhbHVlKSkge1xuICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTtcbiAgICAgIGlmIChpc0FyZ3VtZW50cyhvYmpWYWx1ZSkpIHtcbiAgICAgICAgbmV3VmFsdWUgPSB0b1BsYWluT2JqZWN0KG9ialZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKCFpc09iamVjdChvYmpWYWx1ZSkgfHwgaXNGdW5jdGlvbihvYmpWYWx1ZSkpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBpbml0Q2xvbmVPYmplY3Qoc3JjVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmIChpc0NvbW1vbikge1xuICAgIC8vIFJlY3Vyc2l2ZWx5IG1lcmdlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIHN0YWNrLnNldChzcmNWYWx1ZSwgbmV3VmFsdWUpO1xuICAgIG1lcmdlRnVuYyhuZXdWYWx1ZSwgc3JjVmFsdWUsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgc3RhY2tbJ2RlbGV0ZSddKHNyY1ZhbHVlKTtcbiAgfVxuICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZU1lcmdlRGVlcDtcbiIsInZhciBhcnJheU1hcCA9IHJlcXVpcmUoJy4vX2FycmF5TWFwJyksXG4gICAgYmFzZUdldCA9IHJlcXVpcmUoJy4vX2Jhc2VHZXQnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBiYXNlTWFwID0gcmVxdWlyZSgnLi9fYmFzZU1hcCcpLFxuICAgIGJhc2VTb3J0QnkgPSByZXF1aXJlKCcuL19iYXNlU29ydEJ5JyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgY29tcGFyZU11bHRpcGxlID0gcmVxdWlyZSgnLi9fY29tcGFyZU11bHRpcGxlJyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5JyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm9yZGVyQnlgIHdpdGhvdXQgcGFyYW0gZ3VhcmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9uW118T2JqZWN0W118c3RyaW5nW119IGl0ZXJhdGVlcyBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBvcmRlcnMgVGhlIHNvcnQgb3JkZXJzIG9mIGBpdGVyYXRlZXNgLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycykge1xuICBpZiAoaXRlcmF0ZWVzLmxlbmd0aCkge1xuICAgIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICAgIGlmIChpc0FycmF5KGl0ZXJhdGVlKSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gYmFzZUdldCh2YWx1ZSwgaXRlcmF0ZWUubGVuZ3RoID09PSAxID8gaXRlcmF0ZWVbMF0gOiBpdGVyYXRlZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVyYXRlZTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpdGVyYXRlZXMgPSBbaWRlbnRpdHldO1xuICB9XG5cbiAgdmFyIGluZGV4ID0gLTE7XG4gIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgYmFzZVVuYXJ5KGJhc2VJdGVyYXRlZSkpO1xuXG4gIHZhciByZXN1bHQgPSBiYXNlTWFwKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICB2YXIgY3JpdGVyaWEgPSBhcnJheU1hcChpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gaXRlcmF0ZWUodmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB7ICdjcml0ZXJpYSc6IGNyaXRlcmlhLCAnaW5kZXgnOiArK2luZGV4LCAndmFsdWUnOiB2YWx1ZSB9O1xuICB9KTtcblxuICByZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsIGZ1bmN0aW9uKG9iamVjdCwgb3RoZXIpIHtcbiAgICByZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycyk7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VPcmRlckJ5O1xuIiwidmFyIGJhc2VQaWNrQnkgPSByZXF1aXJlKCcuL19iYXNlUGlja0J5JyksXG4gICAgaGFzSW4gPSByZXF1aXJlKCcuL2hhc0luJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucGlja2Agd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gKiBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LCBwYXRocykge1xuICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgIHJldHVybiBoYXNJbihvYmplY3QsIHBhdGgpO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUGljaztcbiIsInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpLFxuICAgIGJhc2VTZXQgPSByZXF1aXJlKCcuL19iYXNlU2V0JyksXG4gICAgY2FzdFBhdGggPSByZXF1aXJlKCcuL19jYXN0UGF0aCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mICBgXy5waWNrQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0ge307XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgcGF0aCA9IHBhdGhzW2luZGV4XSxcbiAgICAgICAgdmFsdWUgPSBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG5cbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBwYXRoKSkge1xuICAgICAgYmFzZVNldChyZXN1bHQsIGNhc3RQYXRoKHBhdGgsIG9iamVjdCksIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUGlja0J5O1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eWAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUHJvcGVydHkoa2V5KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUHJvcGVydHk7XG4iLCJ2YXIgYmFzZUdldCA9IHJlcXVpcmUoJy4vX2Jhc2VHZXQnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VQcm9wZXJ0eWAgd2hpY2ggc3VwcG9ydHMgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHJldHVybiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVByb3BlcnR5RGVlcDtcbiIsIi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVDZWlsID0gTWF0aC5jZWlsLFxuICAgIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmdlYCBhbmQgYF8ucmFuZ2VSaWdodGAgd2hpY2ggZG9lc24ndFxuICogY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAqL1xuZnVuY3Rpb24gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQgLSBzdGFydCkgLyAoc3RlcCB8fCAxKSksIDApLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICByZXN1bHRbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF0gPSBzdGFydDtcbiAgICBzdGFydCArPSBzdGVwO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVJhbmdlO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZWR1Y2VgIGFuZCBgXy5yZWR1Y2VSaWdodGAsIHdpdGhvdXQgc3VwcG9ydFxuICogZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYGNvbGxlY3Rpb25gIHVzaW5nIGBlYWNoRnVuY2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHtib29sZWFufSBpbml0QWNjdW0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3Qgb3IgbGFzdCBlbGVtZW50IG9mXG4gKiAgYGNvbGxlY3Rpb25gIGFzIHRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBgY29sbGVjdGlvbmAuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VSZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGVhY2hGdW5jKSB7XG4gIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgIGFjY3VtdWxhdG9yID0gaW5pdEFjY3VtXG4gICAgICA/IChpbml0QWNjdW0gPSBmYWxzZSwgdmFsdWUpXG4gICAgICA6IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICB9KTtcbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VSZWR1Y2U7XG4iLCJ2YXIgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5JyksXG4gICAgb3ZlclJlc3QgPSByZXF1aXJlKCcuL19vdmVyUmVzdCcpLFxuICAgIHNldFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fc2V0VG9TdHJpbmcnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXN0YCB3aGljaCBkb2Vzbid0IHZhbGlkYXRlIG9yIGNvZXJjZSBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCBpZGVudGl0eSksIGZ1bmMgKyAnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVJlc3Q7XG4iLCJ2YXIgYXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25WYWx1ZScpLFxuICAgIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9faXNJbmRleCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zZXRgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIHBhdGggY3JlYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoLFxuICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMSxcbiAgICAgIG5lc3RlZCA9IG9iamVjdDtcblxuICB3aGlsZSAobmVzdGVkICE9IG51bGwgJiYgKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSksXG4gICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJyB8fCBrZXkgPT09ICdjb25zdHJ1Y3RvcicgfHwga2V5ID09PSAncHJvdG90eXBlJykge1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggIT0gbGFzdEluZGV4KSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBuZXN0ZWRba2V5XTtcbiAgICAgIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIGtleSwgbmVzdGVkKSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gaXNPYmplY3Qob2JqVmFsdWUpXG4gICAgICAgICAgPyBvYmpWYWx1ZVxuICAgICAgICAgIDogKGlzSW5kZXgocGF0aFtpbmRleCArIDFdKSA/IFtdIDoge30pO1xuICAgICAgfVxuICAgIH1cbiAgICBhc3NpZ25WYWx1ZShuZXN0ZWQsIGtleSwgbmV3VmFsdWUpO1xuICAgIG5lc3RlZCA9IG5lc3RlZFtrZXldO1xuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNldDtcbiIsInZhciBjb25zdGFudCA9IHJlcXVpcmUoJy4vY29uc3RhbnQnKSxcbiAgICBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2RlZmluZVByb3BlcnR5JyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHNldFRvU3RyaW5nYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAqL1xudmFyIGJhc2VTZXRUb1N0cmluZyA9ICFkZWZpbmVQcm9wZXJ0eSA/IGlkZW50aXR5IDogZnVuY3Rpb24oZnVuYywgc3RyaW5nKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jLCAndG9TdHJpbmcnLCB7XG4gICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAndmFsdWUnOiBjb25zdGFudChzdHJpbmcpLFxuICAgICd3cml0YWJsZSc6IHRydWVcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VTZXRUb1N0cmluZztcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydEJ5YCB3aGljaCB1c2VzIGBjb21wYXJlcmAgdG8gZGVmaW5lIHRoZVxuICogc29ydCBvcmRlciBvZiBgYXJyYXlgIGFuZCByZXBsYWNlcyBjcml0ZXJpYSBvYmplY3RzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZ1xuICogdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc29ydC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmVyIFRoZSBmdW5jdGlvbiB0byBkZWZpbmUgc29ydCBvcmRlci5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBiYXNlU29ydEJ5KGFycmF5LCBjb21wYXJlcikge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIGFycmF5LnNvcnQoY29tcGFyZXIpO1xuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBhcnJheVtsZW5ndGhdID0gYXJyYXlbbGVuZ3RoXS52YWx1ZTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNvcnRCeTtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBiYXNlVGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRpbWVzO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xudmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICBzeW1ib2xUb1N0cmluZyA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udG9TdHJpbmcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gKiB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5ncy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XG4gIC8vIEV4aXQgZWFybHkgZm9yIHN0cmluZ3MgdG8gYXZvaWQgYSBwZXJmb3JtYW5jZSBoaXQgaW4gc29tZSBlbnZpcm9ubWVudHMuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gUmVjdXJzaXZlbHkgY29udmVydCB2YWx1ZXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICByZXR1cm4gYXJyYXlNYXAodmFsdWUsIGJhc2VUb1N0cmluZykgKyAnJztcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHN5bWJvbFRvU3RyaW5nID8gc3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcbiAgfVxuICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRvU3RyaW5nO1xuIiwidmFyIHRyaW1tZWRFbmRJbmRleCA9IHJlcXVpcmUoJy4vX3RyaW1tZWRFbmRJbmRleCcpO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltU3RhcnQgPSAvXlxccysvO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRyaW1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlVHJpbShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZ1xuICAgID8gc3RyaW5nLnNsaWNlKDAsIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpICsgMSkucmVwbGFjZShyZVRyaW1TdGFydCwgJycpXG4gICAgOiBzdHJpbmc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRyaW07XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVVuYXJ5O1xuIiwidmFyIFNldENhY2hlID0gcmVxdWlyZSgnLi9fU2V0Q2FjaGUnKSxcbiAgICBhcnJheUluY2x1ZGVzID0gcmVxdWlyZSgnLi9fYXJyYXlJbmNsdWRlcycpLFxuICAgIGFycmF5SW5jbHVkZXNXaXRoID0gcmVxdWlyZSgnLi9fYXJyYXlJbmNsdWRlc1dpdGgnKSxcbiAgICBjYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2NhY2hlSGFzJyksXG4gICAgY3JlYXRlU2V0ID0gcmVxdWlyZSgnLi9fY3JlYXRlU2V0JyksXG4gICAgc2V0VG9BcnJheSA9IHJlcXVpcmUoJy4vX3NldFRvQXJyYXknKTtcblxuLyoqIFVzZWQgYXMgdGhlIHNpemUgdG8gZW5hYmxlIGxhcmdlIGFycmF5IG9wdGltaXphdGlvbnMuICovXG52YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZVVuaXEoYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgcmVzdWx0ID0gW10sXG4gICAgICBzZWVuID0gcmVzdWx0O1xuXG4gIGlmIChjb21wYXJhdG9yKSB7XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuICB9XG4gIGVsc2UgaWYgKGxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgdmFyIHNldCA9IGl0ZXJhdGVlID8gbnVsbCA6IGNyZWF0ZVNldChhcnJheSk7XG4gICAgaWYgKHNldCkge1xuICAgICAgcmV0dXJuIHNldFRvQXJyYXkoc2V0KTtcbiAgICB9XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgIHNlZW4gPSBuZXcgU2V0Q2FjaGU7XG4gIH1cbiAgZWxzZSB7XG4gICAgc2VlbiA9IGl0ZXJhdGVlID8gW10gOiByZXN1bHQ7XG4gIH1cbiAgb3V0ZXI6XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICB2YXIgc2VlbkluZGV4ID0gc2Vlbi5sZW5ndGg7XG4gICAgICB3aGlsZSAoc2VlbkluZGV4LS0pIHtcbiAgICAgICAgaWYgKHNlZW5bc2VlbkluZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFpbmNsdWRlcyhzZWVuLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgIGlmIChzZWVuICE9PSByZXN1bHQpIHtcbiAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVW5pcTtcbiIsInZhciBhcnJheU1hcCA9IHJlcXVpcmUoJy4vX2FycmF5TWFwJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAqIGFycmF5IG9mIGBvYmplY3RgIHByb3BlcnR5IHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lc1xuICogb2YgYHByb3BzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VWYWx1ZXM7XG4iLCIvKipcbiAqIFRoaXMgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy56aXBPYmplY3RgIHdoaWNoIGFzc2lnbnMgdmFsdWVzIHVzaW5nIGBhc3NpZ25GdW5jYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25GdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NpZ24gdmFsdWVzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZVppcE9iamVjdChwcm9wcywgdmFsdWVzLCBhc3NpZ25GdW5jKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgdmFsc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICByZXN1bHQgPSB7fTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGluZGV4IDwgdmFsc0xlbmd0aCA/IHZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgYXNzaWduRnVuYyhyZXN1bHQsIHByb3BzW2luZGV4XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVppcE9iamVjdDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGEgYGNhY2hlYCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgVGhlIGNhY2hlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLCBrZXkpIHtcbiAgcmV0dXJuIGNhY2hlLmhhcyhrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhY2hlSGFzO1xuIiwidmFyIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYGlkZW50aXR5YCBpZiBpdCdzIG5vdCBhIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGNhc3QgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNhc3RGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicgPyB2YWx1ZSA6IGlkZW50aXR5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RGdW5jdGlvbjtcbiIsInZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIHN0cmluZ1RvUGF0aCA9IHJlcXVpcmUoJy4vX3N0cmluZ1RvUGF0aCcpLFxuICAgIHRvU3RyaW5nID0gcmVxdWlyZSgnLi90b1N0cmluZycpO1xuXG4vKipcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYSBwYXRoIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGlzS2V5KHZhbHVlLCBvYmplY3QpID8gW3ZhbHVlXSA6IHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RQYXRoO1xuIiwidmFyIFVpbnQ4QXJyYXkgPSByZXF1aXJlKCcuL19VaW50OEFycmF5Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGBhcnJheUJ1ZmZlcmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7QXJyYXlCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBhcnJheSBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBhcnJheUJ1ZmZlci5jb25zdHJ1Y3RvcihhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgbmV3IFVpbnQ4QXJyYXkocmVzdWx0KS5zZXQobmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZUFycmF5QnVmZmVyO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IHJvb3QuQnVmZmVyIDogdW5kZWZpbmVkLFxuICAgIGFsbG9jVW5zYWZlID0gQnVmZmVyID8gQnVmZmVyLmFsbG9jVW5zYWZlIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiAgYGJ1ZmZlcmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gKiBAcmV0dXJucyB7QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBjbG9uZUJ1ZmZlcihidWZmZXIsIGlzRGVlcCkge1xuICBpZiAoaXNEZWVwKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgpO1xuICB9XG4gIHZhciBsZW5ndGggPSBidWZmZXIubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gYWxsb2NVbnNhZmUgPyBhbGxvY1Vuc2FmZShsZW5ndGgpIDogbmV3IGJ1ZmZlci5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gIGJ1ZmZlci5jb3B5KHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVCdWZmZXI7XG4iLCJ2YXIgY2xvbmVBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQXJyYXlCdWZmZXInKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGRhdGFWaWV3YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFWaWV3IFRoZSBkYXRhIHZpZXcgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIGRhdGEgdmlldy5cbiAqL1xuZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldywgaXNEZWVwKSB7XG4gIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKGRhdGFWaWV3LmJ1ZmZlcikgOiBkYXRhVmlldy5idWZmZXI7XG4gIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZURhdGFWaWV3O1xuIiwiLyoqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGAgZmxhZ3MgZnJvbSB0aGVpciBjb2VyY2VkIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVGbGFncyA9IC9cXHcqJC87XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGByZWdleHBgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gcmVnZXhwIFRoZSByZWdleHAgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgcmVnZXhwLlxuICovXG5mdW5jdGlvbiBjbG9uZVJlZ0V4cChyZWdleHApIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSwgcmVGbGFncy5leGVjKHJlZ2V4cCkpO1xuICByZXN1bHQubGFzdEluZGV4ID0gcmVnZXhwLmxhc3RJbmRleDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZVJlZ0V4cDtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBgc3ltYm9sYCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzeW1ib2wgVGhlIHN5bWJvbCBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgc3ltYm9sIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKSB7XG4gIHJldHVybiBzeW1ib2xWYWx1ZU9mID8gT2JqZWN0KHN5bWJvbFZhbHVlT2YuY2FsbChzeW1ib2wpKSA6IHt9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lU3ltYm9sO1xuIiwidmFyIGNsb25lQXJyYXlCdWZmZXIgPSByZXF1aXJlKCcuL19jbG9uZUFycmF5QnVmZmVyJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGB0eXBlZEFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHR5cGVkQXJyYXkgVGhlIHR5cGVkIGFycmF5IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCB0eXBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2xvbmVUeXBlZEFycmF5KHR5cGVkQXJyYXksIGlzRGVlcCkge1xuICB2YXIgYnVmZmVyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcih0eXBlZEFycmF5LmJ1ZmZlcikgOiB0eXBlZEFycmF5LmJ1ZmZlcjtcbiAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVUeXBlZEFycmF5O1xuIiwidmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKipcbiAqIENvbXBhcmVzIHZhbHVlcyB0byBzb3J0IHRoZW0gaW4gYXNjZW5kaW5nIG9yZGVyLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgdmFsdWVgLlxuICovXG5mdW5jdGlvbiBjb21wYXJlQXNjZW5kaW5nKHZhbHVlLCBvdGhlcikge1xuICBpZiAodmFsdWUgIT09IG90aGVyKSB7XG4gICAgdmFyIHZhbElzRGVmaW5lZCA9IHZhbHVlICE9PSB1bmRlZmluZWQsXG4gICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICB2YWxJc1JlZmxleGl2ZSA9IHZhbHVlID09PSB2YWx1ZSxcbiAgICAgICAgdmFsSXNTeW1ib2wgPSBpc1N5bWJvbCh2YWx1ZSk7XG5cbiAgICB2YXIgb3RoSXNEZWZpbmVkID0gb3RoZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgb3RoSXNOdWxsID0gb3RoZXIgPT09IG51bGwsXG4gICAgICAgIG90aElzUmVmbGV4aXZlID0gb3RoZXIgPT09IG90aGVyLFxuICAgICAgICBvdGhJc1N5bWJvbCA9IGlzU3ltYm9sKG90aGVyKTtcblxuICAgIGlmICgoIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wgJiYgIXZhbElzU3ltYm9sICYmIHZhbHVlID4gb3RoZXIpIHx8XG4gICAgICAgICh2YWxJc1N5bWJvbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUgJiYgIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wpIHx8XG4gICAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAoIXZhbElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgIXZhbElzUmVmbGV4aXZlKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgaWYgKCghdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCAmJiAhb3RoSXNTeW1ib2wgJiYgdmFsdWUgPCBvdGhlcikgfHxcbiAgICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHxcbiAgICAgICAgKG90aElzTnVsbCAmJiB2YWxJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICghb3RoSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAhb3RoSXNSZWZsZXhpdmUpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZUFzY2VuZGluZztcbiIsInZhciBjb21wYXJlQXNjZW5kaW5nID0gcmVxdWlyZSgnLi9fY29tcGFyZUFzY2VuZGluZycpO1xuXG4vKipcbiAqIFVzZWQgYnkgYF8ub3JkZXJCeWAgdG8gY29tcGFyZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9mIGEgdmFsdWUgdG8gYW5vdGhlclxuICogYW5kIHN0YWJsZSBzb3J0IHRoZW0uXG4gKlxuICogSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSxcbiAqIHNwZWNpZnkgYW4gb3JkZXIgb2YgXCJkZXNjXCIgZm9yIGRlc2NlbmRpbmcgb3IgXCJhc2NcIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXJcbiAqIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW5bXXxzdHJpbmdbXX0gb3JkZXJzIFRoZSBvcmRlciB0byBzb3J0IGJ5IGZvciBlYWNoIHByb3BlcnR5LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc29ydCBvcmRlciBpbmRpY2F0b3IgZm9yIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgb2JqQ3JpdGVyaWEgPSBvYmplY3QuY3JpdGVyaWEsXG4gICAgICBvdGhDcml0ZXJpYSA9IG90aGVyLmNyaXRlcmlhLFxuICAgICAgbGVuZ3RoID0gb2JqQ3JpdGVyaWEubGVuZ3RoLFxuICAgICAgb3JkZXJzTGVuZ3RoID0gb3JkZXJzLmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciByZXN1bHQgPSBjb21wYXJlQXNjZW5kaW5nKG9iakNyaXRlcmlhW2luZGV4XSwgb3RoQ3JpdGVyaWFbaW5kZXhdKTtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBpZiAoaW5kZXggPj0gb3JkZXJzTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICB2YXIgb3JkZXIgPSBvcmRlcnNbaW5kZXhdO1xuICAgICAgcmV0dXJuIHJlc3VsdCAqIChvcmRlciA9PSAnZGVzYycgPyAtMSA6IDEpO1xuICAgIH1cbiAgfVxuICAvLyBGaXhlcyBhbiBgQXJyYXkjc29ydGAgYnVnIGluIHRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgYXBwbGljYXRpb25zXG4gIC8vIHRoYXQgY2F1c2VzIGl0LCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHRvIHByb3ZpZGUgdGhlIHNhbWUgdmFsdWUgZm9yXG4gIC8vIGBvYmplY3RgIGFuZCBgb3RoZXJgLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL3B1bGwvMTI0N1xuICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAvL1xuICAvLyBUaGlzIGFsc28gZW5zdXJlcyBhIHN0YWJsZSBzb3J0IGluIFY4IGFuZCBvdGhlciBlbmdpbmVzLlxuICAvLyBTZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9OTAgZm9yIG1vcmUgZGV0YWlscy5cbiAgcmV0dXJuIG9iamVjdC5pbmRleCAtIG90aGVyLmluZGV4O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBhcmVNdWx0aXBsZTtcbiIsIi8qKlxuICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgYHNvdXJjZWAgdG8gYGFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyBmcm9tLlxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuXG4gIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFycmF5W2luZGV4XSA9IHNvdXJjZVtpbmRleF07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlBcnJheTtcbiIsInZhciBhc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnblZhbHVlJyksXG4gICAgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyk7XG5cbi8qKlxuICogQ29waWVzIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29waWVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlPYmplY3Qoc291cmNlLCBwcm9wcywgb2JqZWN0LCBjdXN0b21pemVyKSB7XG4gIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gIG9iamVjdCB8fCAob2JqZWN0ID0ge30pO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcblxuICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgID8gY3VzdG9taXplcihvYmplY3Rba2V5XSwgc291cmNlW2tleV0sIGtleSwgb2JqZWN0LCBzb3VyY2UpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXdWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgICBpZiAoaXNOZXcpIHtcbiAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlPYmplY3Q7XG4iLCJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBnZXRTeW1ib2xzID0gcmVxdWlyZSgnLi9fZ2V0U3ltYm9scycpO1xuXG4vKipcbiAqIENvcGllcyBvd24gc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weVN5bWJvbHMoc291cmNlLCBvYmplY3QpIHtcbiAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weVN5bWJvbHM7XG4iLCJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBnZXRTeW1ib2xzSW4gPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzSW4nKTtcblxuLyoqXG4gKiBDb3BpZXMgb3duIGFuZCBpbmhlcml0ZWQgc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weVN5bWJvbHNJbihzb3VyY2UsIG9iamVjdCkge1xuICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHNJbihzb3VyY2UpLCBvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlTeW1ib2xzSW47XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xudmFyIGNvcmVKc0RhdGEgPSByb290WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb3JlSnNEYXRhO1xuIiwidmFyIGJhc2VSZXN0ID0gcmVxdWlyZSgnLi9fYmFzZVJlc3QnKSxcbiAgICBpc0l0ZXJhdGVlQ2FsbCA9IHJlcXVpcmUoJy4vX2lzSXRlcmF0ZWVDYWxsJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhc3NpZ25lciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA+IDEgPyBzb3VyY2VzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkLFxuICAgICAgICBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkO1xuXG4gICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICA/IChsZW5ndGgtLSwgY3VzdG9taXplcilcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiBjdXN0b21pemVyO1xuICAgICAgbGVuZ3RoID0gMTtcbiAgICB9XG4gICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgYXNzaWduZXIob2JqZWN0LCBzb3VyY2UsIGluZGV4LCBjdXN0b21pemVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQXNzaWduZXI7XG4iLCJ2YXIgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGBiYXNlRWFjaGAgb3IgYGJhc2VFYWNoUmlnaHRgIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmFzZUVhY2goZWFjaEZ1bmMsIGZyb21SaWdodCkge1xuICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICB9XG4gICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgcmV0dXJuIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKTtcbiAgICB9XG4gICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IGZyb21SaWdodCA/IGxlbmd0aCA6IC0xLFxuICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChjb2xsZWN0aW9uKTtcblxuICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVbaW5kZXhdLCBpbmRleCwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQmFzZUVhY2g7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSBiYXNlIGZ1bmN0aW9uIGZvciBtZXRob2RzIGxpa2UgYF8uZm9ySW5gIGFuZCBgXy5mb3JPd25gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhc2VGb3IoZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChvYmplY3QpLFxuICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVCYXNlRm9yO1xuIiwidmFyIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYF8uZmluZGAgb3IgYF8uZmluZExhc3RgIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaW5kSW5kZXhGdW5jIFRoZSBmdW5jdGlvbiB0byBmaW5kIHRoZSBjb2xsZWN0aW9uIGluZGV4LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZmluZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRmluZChmaW5kSW5kZXhGdW5jKSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgIHZhciBpdGVyYWJsZSA9IE9iamVjdChjb2xsZWN0aW9uKTtcbiAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKTtcbiAgICAgIGNvbGxlY3Rpb24gPSBrZXlzKGNvbGxlY3Rpb24pO1xuICAgICAgcHJlZGljYXRlID0gZnVuY3Rpb24oa2V5KSB7IHJldHVybiBpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKTsgfTtcbiAgICB9XG4gICAgdmFyIGluZGV4ID0gZmluZEluZGV4RnVuYyhjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCk7XG4gICAgcmV0dXJuIGluZGV4ID4gLTEgPyBpdGVyYWJsZVtpdGVyYXRlZSA/IGNvbGxlY3Rpb25baW5kZXhdIDogaW5kZXhdIDogdW5kZWZpbmVkO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUZpbmQ7XG4iLCJ2YXIgYmFzZVJhbmdlID0gcmVxdWlyZSgnLi9fYmFzZVJhbmdlJyksXG4gICAgaXNJdGVyYXRlZUNhbGwgPSByZXF1aXJlKCcuL19pc0l0ZXJhdGVlQ2FsbCcpLFxuICAgIHRvRmluaXRlID0gcmVxdWlyZSgnLi90b0Zpbml0ZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgXy5yYW5nZWAgb3IgYF8ucmFuZ2VSaWdodGAgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmFuZ2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGZyb21SaWdodCkge1xuICByZXR1cm4gZnVuY3Rpb24oc3RhcnQsIGVuZCwgc3RlcCkge1xuICAgIGlmIChzdGVwICYmIHR5cGVvZiBzdGVwICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0YXJ0LCBlbmQsIHN0ZXApKSB7XG4gICAgICBlbmQgPSBzdGVwID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBFbnN1cmUgdGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgc3RhcnQgPSB0b0Zpbml0ZShzdGFydCk7XG4gICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmQgPSBzdGFydDtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICB9XG4gICAgc3RlcCA9IHN0ZXAgPT09IHVuZGVmaW5lZCA/IChzdGFydCA8IGVuZCA/IDEgOiAtMSkgOiB0b0Zpbml0ZShzdGVwKTtcbiAgICByZXR1cm4gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlUmFuZ2U7XG4iLCJ2YXIgU2V0ID0gcmVxdWlyZSgnLi9fU2V0JyksXG4gICAgbm9vcCA9IHJlcXVpcmUoJy4vbm9vcCcpLFxuICAgIHNldFRvQXJyYXkgPSByZXF1aXJlKCcuL19zZXRUb0FycmF5Jyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNldCBvYmplY3Qgb2YgYHZhbHVlc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFkZCB0byB0aGUgc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IHNldC5cbiAqL1xudmFyIGNyZWF0ZVNldCA9ICEoU2V0ICYmICgxIC8gc2V0VG9BcnJheShuZXcgU2V0KFssLTBdKSlbMV0pID09IElORklOSVRZKSA/IG5vb3AgOiBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgcmV0dXJuIG5ldyBTZXQodmFsdWVzKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlU2V0O1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKTtcbiAgICBmdW5jKHt9LCAnJywge30pO1xuICAgIHJldHVybiBmdW5jO1xuICB9IGNhdGNoIChlKSB7fVxufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBkZWZpbmVQcm9wZXJ0eTtcbiIsInZhciBTZXRDYWNoZSA9IHJlcXVpcmUoJy4vX1NldENhY2hlJyksXG4gICAgYXJyYXlTb21lID0gcmVxdWlyZSgnLi9fYXJyYXlTb21lJyksXG4gICAgY2FjaGVIYXMgPSByZXF1aXJlKCcuL19jYWNoZUhhcycpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBhcnJheXMgd2l0aCBzdXBwb3J0IGZvclxuICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7QXJyYXl9IG90aGVyIFRoZSBvdGhlciBhcnJheSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgYXJyYXlgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFycmF5cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDtcblxuICBpZiAoYXJyTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhKGlzUGFydGlhbCAmJiBvdGhMZW5ndGggPiBhcnJMZW5ndGgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gIHZhciBhcnJTdGFja2VkID0gc3RhY2suZ2V0KGFycmF5KTtcbiAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICBpZiAoYXJyU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgcmV0dXJuIGFyclN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBhcnJheTtcbiAgfVxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IHRydWUsXG4gICAgICBzZWVuID0gKGJpdG1hc2sgJiBDT01QQVJFX1VOT1JERVJFRF9GTEFHKSA/IG5ldyBTZXRDYWNoZSA6IHVuZGVmaW5lZDtcblxuICBzdGFjay5zZXQoYXJyYXksIG90aGVyKTtcbiAgc3RhY2suc2V0KG90aGVyLCBhcnJheSk7XG5cbiAgLy8gSWdub3JlIG5vbi1pbmRleCBwcm9wZXJ0aWVzLlxuICB3aGlsZSAoKytpbmRleCA8IGFyckxlbmd0aCkge1xuICAgIHZhciBhcnJWYWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltpbmRleF07XG5cbiAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKVxuICAgICAgICA6IGN1c3RvbWl6ZXIoYXJyVmFsdWUsIG90aFZhbHVlLCBpbmRleCwgYXJyYXksIG90aGVyLCBzdGFjayk7XG4gICAgfVxuICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29tcGFyZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGlmIChzZWVuKSB7XG4gICAgICBpZiAoIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24ob3RoVmFsdWUsIG90aEluZGV4KSB7XG4gICAgICAgICAgICBpZiAoIWNhY2hlSGFzKHNlZW4sIG90aEluZGV4KSAmJlxuICAgICAgICAgICAgICAgIChhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKSkge1xuICAgICAgICAgICAgICByZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSkge1xuICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghKFxuICAgICAgICAgIGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fFxuICAgICAgICAgICAgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spXG4gICAgICAgICkpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHN0YWNrWydkZWxldGUnXShhcnJheSk7XG4gIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXF1YWxBcnJheXM7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgVWludDhBcnJheSA9IHJlcXVpcmUoJy4vX1VpbnQ4QXJyYXknKSxcbiAgICBlcSA9IHJlcXVpcmUoJy4vZXEnKSxcbiAgICBlcXVhbEFycmF5cyA9IHJlcXVpcmUoJy4vX2VxdWFsQXJyYXlzJyksXG4gICAgbWFwVG9BcnJheSA9IHJlcXVpcmUoJy4vX21hcFRvQXJyYXknKSxcbiAgICBzZXRUb0FycmF5ID0gcmVxdWlyZSgnLi9fc2V0VG9BcnJheScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJztcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBjb21wYXJpbmcgb2JqZWN0cyBvZlxuICogdGhlIHNhbWUgYHRvU3RyaW5nVGFnYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNvbXBhcmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE51bWJlcmAsIGBSZWdFeHBgLCBvciBgU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0cyB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgdGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSBkYXRhVmlld1RhZzpcbiAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAob2JqZWN0LmJ5dGVPZmZzZXQgIT0gb3RoZXIuYnl0ZU9mZnNldCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgb2JqZWN0ID0gb2JqZWN0LmJ1ZmZlcjtcbiAgICAgIG90aGVyID0gb3RoZXIuYnVmZmVyO1xuXG4gICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAhZXF1YWxGdW5jKG5ldyBVaW50OEFycmF5KG9iamVjdCksIG5ldyBVaW50OEFycmF5KG90aGVyKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBjYXNlIGJvb2xUYWc6XG4gICAgY2FzZSBkYXRlVGFnOlxuICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgLy8gQ29lcmNlIGJvb2xlYW5zIHRvIGAxYCBvciBgMGAgYW5kIGRhdGVzIHRvIG1pbGxpc2Vjb25kcy5cbiAgICAgIC8vIEludmFsaWQgZGF0ZXMgYXJlIGNvZXJjZWQgdG8gYE5hTmAuXG4gICAgICByZXR1cm4gZXEoK29iamVjdCwgK290aGVyKTtcblxuICAgIGNhc2UgZXJyb3JUYWc6XG4gICAgICByZXR1cm4gb2JqZWN0Lm5hbWUgPT0gb3RoZXIubmFtZSAmJiBvYmplY3QubWVzc2FnZSA9PSBvdGhlci5tZXNzYWdlO1xuXG4gICAgY2FzZSByZWdleHBUYWc6XG4gICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICAvLyBDb2VyY2UgcmVnZXhlcyB0byBzdHJpbmdzIGFuZCB0cmVhdCBzdHJpbmdzLCBwcmltaXRpdmVzIGFuZCBvYmplY3RzLFxuICAgICAgLy8gYXMgZXF1YWwuIFNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcmVnZXhwLnByb3RvdHlwZS50b3N0cmluZ1xuICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIHJldHVybiBvYmplY3QgPT0gKG90aGVyICsgJycpO1xuXG4gICAgY2FzZSBtYXBUYWc6XG4gICAgICB2YXIgY29udmVydCA9IG1hcFRvQXJyYXk7XG5cbiAgICBjYXNlIHNldFRhZzpcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUc7XG4gICAgICBjb252ZXJ0IHx8IChjb252ZXJ0ID0gc2V0VG9BcnJheSk7XG5cbiAgICAgIGlmIChvYmplY3Quc2l6ZSAhPSBvdGhlci5zaXplICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgIGlmIChzdGFja2VkKSB7XG4gICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xuICAgICAgfVxuICAgICAgYml0bWFzayB8PSBDT01QQVJFX1VOT1JERVJFRF9GTEFHO1xuXG4gICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgIHZhciByZXN1bHQgPSBlcXVhbEFycmF5cyhjb252ZXJ0KG9iamVjdCksIGNvbnZlcnQob3RoZXIpLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvYmplY3QpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIGNhc2Ugc3ltYm9sVGFnOlxuICAgICAgaWYgKHN5bWJvbFZhbHVlT2YpIHtcbiAgICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpID09IHN5bWJvbFZhbHVlT2YuY2FsbChvdGhlcik7XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxdWFsQnlUYWc7XG4iLCJ2YXIgZ2V0QWxsS2V5cyA9IHJlcXVpcmUoJy4vX2dldEFsbEtleXMnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3Igb2JqZWN0cyB3aXRoIHN1cHBvcnQgZm9yXG4gKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLFxuICAgICAgb2JqUHJvcHMgPSBnZXRBbGxLZXlzKG9iamVjdCksXG4gICAgICBvYmpMZW5ndGggPSBvYmpQcm9wcy5sZW5ndGgsXG4gICAgICBvdGhQcm9wcyA9IGdldEFsbEtleXMob3RoZXIpLFxuICAgICAgb3RoTGVuZ3RoID0gb3RoUHJvcHMubGVuZ3RoO1xuXG4gIGlmIChvYmpMZW5ndGggIT0gb3RoTGVuZ3RoICYmICFpc1BhcnRpYWwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGluZGV4ID0gb2JqTGVuZ3RoO1xuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgaWYgKCEoaXNQYXJ0aWFsID8ga2V5IGluIG90aGVyIDogaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwga2V5KSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgLy8gQ2hlY2sgdGhhdCBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgdmFyIG9ialN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICBpZiAob2JqU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgcmV0dXJuIG9ialN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBvYmplY3Q7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IHRydWU7XG4gIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgc3RhY2suc2V0KG90aGVyLCBvYmplY3QpO1xuXG4gIHZhciBza2lwQ3RvciA9IGlzUGFydGlhbDtcbiAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHtcbiAgICBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgIG90aFZhbHVlID0gb3RoZXJba2V5XTtcblxuICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBvYmpWYWx1ZSwga2V5LCBvdGhlciwgb2JqZWN0LCBzdGFjaylcbiAgICAgICAgOiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSwga2V5LCBvYmplY3QsIG90aGVyLCBzdGFjayk7XG4gICAgfVxuICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGlmICghKGNvbXBhcmVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IChvYmpWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKG9ialZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKVxuICAgICAgICAgIDogY29tcGFyZWRcbiAgICAgICAgKSkge1xuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2tpcEN0b3IgfHwgKHNraXBDdG9yID0ga2V5ID09ICdjb25zdHJ1Y3RvcicpO1xuICB9XG4gIGlmIChyZXN1bHQgJiYgIXNraXBDdG9yKSB7XG4gICAgdmFyIG9iakN0b3IgPSBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcblxuICAgIC8vIE5vbiBgT2JqZWN0YCBvYmplY3QgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWFsLlxuICAgIGlmIChvYmpDdG9yICE9IG90aEN0b3IgJiZcbiAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gb2JqZWN0ICYmICdjb25zdHJ1Y3RvcicgaW4gb3RoZXIpICYmXG4gICAgICAgICEodHlwZW9mIG9iakN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciAmJlxuICAgICAgICAgIHR5cGVvZiBvdGhDdG9yID09ICdmdW5jdGlvbicgJiYgb3RoQ3RvciBpbnN0YW5jZW9mIG90aEN0b3IpKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXF1YWxPYmplY3RzO1xuIiwidmFyIGZsYXR0ZW4gPSByZXF1aXJlKCcuL2ZsYXR0ZW4nKSxcbiAgICBvdmVyUmVzdCA9IHJlcXVpcmUoJy4vX292ZXJSZXN0JyksXG4gICAgc2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19zZXRUb1N0cmluZycpO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIGZsYXR0ZW5zIHRoZSByZXN0IGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpIHtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHVuZGVmaW5lZCwgZmxhdHRlbiksIGZ1bmMgKyAnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdFJlc3Q7XG4iLCIvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZyZWVHbG9iYWw7XG4iLCJ2YXIgYmFzZUdldEFsbEtleXMgPSByZXF1aXJlKCcuL19iYXNlR2V0QWxsS2V5cycpLFxuICAgIGdldFN5bWJvbHMgPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KSB7XG4gIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXMsIGdldFN5bWJvbHMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEFsbEtleXM7XG4iLCJ2YXIgYmFzZUdldEFsbEtleXMgPSByZXF1aXJlKCcuL19iYXNlR2V0QWxsS2V5cycpLFxuICAgIGdldFN5bWJvbHNJbiA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHNJbicpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsS2V5c0luKG9iamVjdCkge1xuICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzSW4sIGdldFN5bWJvbHNJbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QWxsS2V5c0luO1xuIiwidmFyIGlzS2V5YWJsZSA9IHJlcXVpcmUoJy4vX2lzS2V5YWJsZScpO1xuXG4vKipcbiAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSByZWZlcmVuY2Uga2V5LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hcCBkYXRhLlxuICovXG5mdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCwga2V5KSB7XG4gIHZhciBkYXRhID0gbWFwLl9fZGF0YV9fO1xuICByZXR1cm4gaXNLZXlhYmxlKGtleSlcbiAgICA/IGRhdGFbdHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/ICdzdHJpbmcnIDogJ2hhc2gnXVxuICAgIDogZGF0YS5tYXA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TWFwRGF0YTtcbiIsInZhciBpc1N0cmljdENvbXBhcmFibGUgPSByZXF1aXJlKCcuL19pc1N0cmljdENvbXBhcmFibGUnKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3Mgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbWF0Y2ggZGF0YSBvZiBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gZ2V0TWF0Y2hEYXRhKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0ga2V5cyhvYmplY3QpLFxuICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICB2YXIga2V5ID0gcmVzdWx0W2xlbmd0aF0sXG4gICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICByZXN1bHRbbGVuZ3RoXSA9IFtrZXksIHZhbHVlLCBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE1hdGNoRGF0YTtcbiIsInZhciBiYXNlSXNOYXRpdmUgPSByZXF1aXJlKCcuL19iYXNlSXNOYXRpdmUnKSxcbiAgICBnZXRWYWx1ZSA9IHJlcXVpcmUoJy4vX2dldFZhbHVlJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShvYmplY3QsIGtleSk7XG4gIHJldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TmF0aXZlO1xuIiwidmFyIG92ZXJBcmcgPSByZXF1aXJlKCcuL19vdmVyQXJnJyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIGdldFByb3RvdHlwZSA9IG92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLCBPYmplY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFByb3RvdHlwZTtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFJhd1RhZztcbiIsInZhciBhcnJheUZpbHRlciA9IHJlcXVpcmUoJy4vX2FycmF5RmlsdGVyJyksXG4gICAgc3R1YkFycmF5ID0gcmVxdWlyZSgnLi9zdHViQXJyYXknKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3ltYm9scy5cbiAqL1xudmFyIGdldFN5bWJvbHMgPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gIHJldHVybiBhcnJheUZpbHRlcihuYXRpdmVHZXRTeW1ib2xzKG9iamVjdCksIGZ1bmN0aW9uKHN5bWJvbCkge1xuICAgIHJldHVybiBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCwgc3ltYm9sKTtcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFN5bWJvbHM7XG4iLCJ2YXIgYXJyYXlQdXNoID0gcmVxdWlyZSgnLi9fYXJyYXlQdXNoJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgZ2V0U3ltYm9scyA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHMnKSxcbiAgICBzdHViQXJyYXkgPSByZXF1aXJlKCcuL3N0dWJBcnJheScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gKi9cbnZhciBnZXRTeW1ib2xzSW4gPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHdoaWxlIChvYmplY3QpIHtcbiAgICBhcnJheVB1c2gocmVzdWx0LCBnZXRTeW1ib2xzKG9iamVjdCkpO1xuICAgIG9iamVjdCA9IGdldFByb3RvdHlwZShvYmplY3QpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFN5bWJvbHNJbjtcbiIsInZhciBEYXRhVmlldyA9IHJlcXVpcmUoJy4vX0RhdGFWaWV3JyksXG4gICAgTWFwID0gcmVxdWlyZSgnLi9fTWFwJyksXG4gICAgUHJvbWlzZSA9IHJlcXVpcmUoJy4vX1Byb21pc2UnKSxcbiAgICBTZXQgPSByZXF1aXJlKCcuL19TZXQnKSxcbiAgICBXZWFrTWFwID0gcmVxdWlyZSgnLi9fV2Vha01hcCcpLFxuICAgIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgdG9Tb3VyY2UgPSByZXF1aXJlKCcuL190b1NvdXJjZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcHJvbWlzZVRhZyA9ICdbb2JqZWN0IFByb21pc2VdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWFwcywgc2V0cywgYW5kIHdlYWttYXBzLiAqL1xudmFyIGRhdGFWaWV3Q3RvclN0cmluZyA9IHRvU291cmNlKERhdGFWaWV3KSxcbiAgICBtYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoTWFwKSxcbiAgICBwcm9taXNlQ3RvclN0cmluZyA9IHRvU291cmNlKFByb21pc2UpLFxuICAgIHNldEN0b3JTdHJpbmcgPSB0b1NvdXJjZShTZXQpLFxuICAgIHdlYWtNYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoV2Vha01hcCk7XG5cbi8qKlxuICogR2V0cyB0aGUgYHRvU3RyaW5nVGFnYCBvZiBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbnZhciBnZXRUYWcgPSBiYXNlR2V0VGFnO1xuXG4vLyBGYWxsYmFjayBmb3IgZGF0YSB2aWV3cywgbWFwcywgc2V0cywgYW5kIHdlYWsgbWFwcyBpbiBJRSAxMSBhbmQgcHJvbWlzZXMgaW4gTm9kZS5qcyA8IDYuXG5pZiAoKERhdGFWaWV3ICYmIGdldFRhZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcpIHx8XG4gICAgKE1hcCAmJiBnZXRUYWcobmV3IE1hcCkgIT0gbWFwVGFnKSB8fFxuICAgIChQcm9taXNlICYmIGdldFRhZyhQcm9taXNlLnJlc29sdmUoKSkgIT0gcHJvbWlzZVRhZykgfHxcbiAgICAoU2V0ICYmIGdldFRhZyhuZXcgU2V0KSAhPSBzZXRUYWcpIHx8XG4gICAgKFdlYWtNYXAgJiYgZ2V0VGFnKG5ldyBXZWFrTWFwKSAhPSB3ZWFrTWFwVGFnKSkge1xuICBnZXRUYWcgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciByZXN1bHQgPSBiYXNlR2V0VGFnKHZhbHVlKSxcbiAgICAgICAgQ3RvciA9IHJlc3VsdCA9PSBvYmplY3RUYWcgPyB2YWx1ZS5jb25zdHJ1Y3RvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgY3RvclN0cmluZyA9IEN0b3IgPyB0b1NvdXJjZShDdG9yKSA6ICcnO1xuXG4gICAgaWYgKGN0b3JTdHJpbmcpIHtcbiAgICAgIHN3aXRjaCAoY3RvclN0cmluZykge1xuICAgICAgICBjYXNlIGRhdGFWaWV3Q3RvclN0cmluZzogcmV0dXJuIGRhdGFWaWV3VGFnO1xuICAgICAgICBjYXNlIG1hcEN0b3JTdHJpbmc6IHJldHVybiBtYXBUYWc7XG4gICAgICAgIGNhc2UgcHJvbWlzZUN0b3JTdHJpbmc6IHJldHVybiBwcm9taXNlVGFnO1xuICAgICAgICBjYXNlIHNldEN0b3JTdHJpbmc6IHJldHVybiBzZXRUYWc7XG4gICAgICAgIGNhc2Ugd2Vha01hcEN0b3JTdHJpbmc6IHJldHVybiB3ZWFrTWFwVGFnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFRhZztcbiIsIi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCwga2V5KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFZhbHVlO1xuIiwidmFyIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBleGlzdHMgb24gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2sgcHJvcGVydGllcy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7XG4gIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBmYWxzZTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSk7XG4gICAgaWYgKCEocmVzdWx0ID0gb2JqZWN0ICE9IG51bGwgJiYgaGFzRnVuYyhvYmplY3QsIGtleSkpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgb2JqZWN0ID0gb2JqZWN0W2tleV07XG4gIH1cbiAgaWYgKHJlc3VsdCB8fCArK2luZGV4ICE9IGxlbmd0aCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgbGVuZ3RoID0gb2JqZWN0ID09IG51bGwgPyAwIDogb2JqZWN0Lmxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmIGlzTGVuZ3RoKGxlbmd0aCkgJiYgaXNJbmRleChrZXksIGxlbmd0aCkgJiZcbiAgICAoaXNBcnJheShvYmplY3QpIHx8IGlzQXJndW1lbnRzKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc1BhdGg7XG4iLCIvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG52YXIgcnNBc3RyYWxSYW5nZSA9ICdcXFxcdWQ4MDAtXFxcXHVkZmZmJyxcbiAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgcnNDb21ib1N5bWJvbHNSYW5nZSA9ICdcXFxcdTIwZDAtXFxcXHUyMGZmJyxcbiAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2FwdHVyZSBncm91cHMuICovXG52YXIgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3Mgd2l0aCBbemVyby13aWR0aCBqb2luZXJzIG9yIGNvZGUgcG9pbnRzIGZyb20gdGhlIGFzdHJhbCBwbGFuZXNdKGh0dHA6Ly9lZXYuZWUvYmxvZy8yMDE1LzA5LzEyL2RhcmstY29ybmVycy1vZi11bmljb2RlLykuICovXG52YXIgcmVIYXNVbmljb2RlID0gUmVnRXhwKCdbJyArIHJzWldKICsgcnNBc3RyYWxSYW5nZSAgKyByc0NvbWJvUmFuZ2UgKyByc1ZhclJhbmdlICsgJ10nKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgVW5pY29kZSBzeW1ib2xzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhIHN5bWJvbCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNVbmljb2RlKHN0cmluZykge1xuICByZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNVbmljb2RlO1xuIiwidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgSGFzaFxuICovXG5mdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoQ2xlYXI7XG4iLCIvKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge09iamVjdH0gaGFzaCBUaGUgaGFzaCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcbiAgdmFyIHJlc3VsdCA9IHRoaXMuaGFzKGtleSkgJiYgZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTtcbiAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hEZWxldGU7XG4iLCJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGhhc2hHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgIHZhciByZXN1bHQgPSBkYXRhW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoR2V0O1xuIiwidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGhhc2ggdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaEhhcztcbiIsInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIFNldHMgdGhlIGhhc2ggYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBoYXNoIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBoYXNoU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICB0aGlzLnNpemUgKz0gdGhpcy5oYXMoa2V5KSA/IDAgOiAxO1xuICBkYXRhW2tleV0gPSAobmF0aXZlQ3JlYXRlICYmIHZhbHVlID09PSB1bmRlZmluZWQpID8gSEFTSF9VTkRFRklORUQgOiB2YWx1ZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaFNldDtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgY2xvbmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBuZXcgYXJyYXkuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICAvLyBBZGQgcHJvcGVydGllcyBhc3NpZ25lZCBieSBgUmVnRXhwI2V4ZWNgLlxuICBpZiAobGVuZ3RoICYmIHR5cGVvZiBhcnJheVswXSA9PSAnc3RyaW5nJyAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCAnaW5kZXgnKSkge1xuICAgIHJlc3VsdC5pbmRleCA9IGFycmF5LmluZGV4O1xuICAgIHJlc3VsdC5pbnB1dCA9IGFycmF5LmlucHV0O1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdENsb25lQXJyYXk7XG4iLCJ2YXIgY2xvbmVBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQXJyYXlCdWZmZXInKSxcbiAgICBjbG9uZURhdGFWaWV3ID0gcmVxdWlyZSgnLi9fY2xvbmVEYXRhVmlldycpLFxuICAgIGNsb25lUmVnRXhwID0gcmVxdWlyZSgnLi9fY2xvbmVSZWdFeHAnKSxcbiAgICBjbG9uZVN5bWJvbCA9IHJlcXVpcmUoJy4vX2Nsb25lU3ltYm9sJyksXG4gICAgY2xvbmVUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fY2xvbmVUeXBlZEFycmF5Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZSBiYXNlZCBvbiBpdHMgYHRvU3RyaW5nVGFnYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNsb25pbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBNYXBgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIGBTZXRgLCBvciBgU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICovXG5mdW5jdGlvbiBpbml0Q2xvbmVCeVRhZyhvYmplY3QsIHRhZywgaXNEZWVwKSB7XG4gIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICByZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpO1xuXG4gICAgY2FzZSBib29sVGFnOlxuICAgIGNhc2UgZGF0ZVRhZzpcbiAgICAgIHJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtcblxuICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICByZXR1cm4gY2xvbmVEYXRhVmlldyhvYmplY3QsIGlzRGVlcCk7XG5cbiAgICBjYXNlIGZsb2F0MzJUYWc6IGNhc2UgZmxvYXQ2NFRhZzpcbiAgICBjYXNlIGludDhUYWc6IGNhc2UgaW50MTZUYWc6IGNhc2UgaW50MzJUYWc6XG4gICAgY2FzZSB1aW50OFRhZzogY2FzZSB1aW50OENsYW1wZWRUYWc6IGNhc2UgdWludDE2VGFnOiBjYXNlIHVpbnQzMlRhZzpcbiAgICAgIHJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgY2FzZSBtYXBUYWc6XG4gICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICBjYXNlIG51bWJlclRhZzpcbiAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgIHJldHVybiBuZXcgQ3RvcihvYmplY3QpO1xuXG4gICAgY2FzZSByZWdleHBUYWc6XG4gICAgICByZXR1cm4gY2xvbmVSZWdFeHAob2JqZWN0KTtcblxuICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICByZXR1cm4gY2xvbmVTeW1ib2wob2JqZWN0KTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluaXRDbG9uZUJ5VGFnO1xuIiwidmFyIGJhc2VDcmVhdGUgPSByZXF1aXJlKCcuL19iYXNlQ3JlYXRlJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpO1xuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2Ygb2JqZWN0LmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgIWlzUHJvdG90eXBlKG9iamVjdCkpXG4gICAgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKVxuICAgIDoge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdENsb25lT2JqZWN0O1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ByZWFkYWJsZVN5bWJvbCA9IFN5bWJvbCA/IFN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGUgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmbGF0dGVuYWJsZSBgYXJndW1lbnRzYCBvYmplY3Qgb3IgYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZmxhdHRlbmFibGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNGbGF0dGVuYWJsZSh2YWx1ZSkge1xuICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpIHx8XG4gICAgISEoc3ByZWFkYWJsZVN5bWJvbCAmJiB2YWx1ZSAmJiB2YWx1ZVtzcHJlYWRhYmxlU3ltYm9sXSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGbGF0dGVuYWJsZTtcbiIsIi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG52YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuXG4gIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICh0eXBlID09ICdudW1iZXInIHx8XG4gICAgICAodHlwZSAhPSAnc3ltYm9sJyAmJiByZUlzVWludC50ZXN0KHZhbHVlKSkpICYmXG4gICAgICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0luZGV4O1xuIiwidmFyIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIHZhbHVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgPyAoaXNBcnJheUxpa2Uob2JqZWN0KSAmJiBpc0luZGV4KGluZGV4LCBvYmplY3QubGVuZ3RoKSlcbiAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICApIHtcbiAgICByZXR1cm4gZXEob2JqZWN0W2luZGV4XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0l0ZXJhdGVlQ2FsbDtcbiIsInZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZUlzRGVlcFByb3AgPSAvXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqP1xcMSlcXF0vLFxuICAgIHJlSXNQbGFpblByb3AgPSAvXlxcdyokLztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleSh2YWx1ZSwgb2JqZWN0KSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuICAgICAgdmFsdWUgPT0gbnVsbCB8fCBpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gcmVJc1BsYWluUHJvcC50ZXN0KHZhbHVlKSB8fCAhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpIHx8XG4gICAgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIE9iamVjdChvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0tleTtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyB1bmlxdWUgb2JqZWN0IGtleS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleWFibGUodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAodHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicpXG4gICAgPyAodmFsdWUgIT09ICdfX3Byb3RvX18nKVxuICAgIDogKHZhbHVlID09PSBudWxsKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0tleWFibGU7XG4iLCJ2YXIgY29yZUpzRGF0YSA9IHJlcXVpcmUoJy4vX2NvcmVKc0RhdGEnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbnZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG59KCkpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHtcbiAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc01hc2tlZDtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1Byb3RvdHlwZTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlmIHN1aXRhYmxlIGZvciBzdHJpY3RcbiAqICBlcXVhbGl0eSBjb21wYXJpc29ucywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSAmJiAhaXNPYmplY3QodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3RyaWN0Q29tcGFyYWJsZTtcbiIsIi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVDbGVhcjtcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxO1xuICBpZiAoaW5kZXggPT0gbGFzdEluZGV4KSB7XG4gICAgZGF0YS5wb3AoKTtcbiAgfSBlbHNlIHtcbiAgICBzcGxpY2UuY2FsbChkYXRhLCBpbmRleCwgMSk7XG4gIH1cbiAgLS10aGlzLnNpemU7XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZURlbGV0ZTtcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVHZXQ7XG4iLCJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBhc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXywga2V5KSA+IC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZUhhcztcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBsaXN0IGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICArK3RoaXMuc2l6ZTtcbiAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhW2luZGV4XVsxXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZVNldDtcbiIsInZhciBIYXNoID0gcmVxdWlyZSgnLi9fSGFzaCcpLFxuICAgIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkge1xuICB0aGlzLnNpemUgPSAwO1xuICB0aGlzLl9fZGF0YV9fID0ge1xuICAgICdoYXNoJzogbmV3IEhhc2gsXG4gICAgJ21hcCc6IG5ldyAoTWFwIHx8IExpc3RDYWNoZSksXG4gICAgJ3N0cmluZyc6IG5ldyBIYXNoXG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVDbGVhcjtcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZURlbGV0ZTtcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIEdldHMgdGhlIG1hcCB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVHZXQ7XG4iLCJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBtYXAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZUhhcztcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICBzaXplID0gZGF0YS5zaXplO1xuXG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVTZXQ7XG4iLCIvKipcbiAqIENvbnZlcnRzIGBtYXBgIHRvIGl0cyBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gKi9cbmZ1bmN0aW9uIG1hcFRvQXJyYXkobWFwKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobWFwLnNpemUpO1xuXG4gIG1hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSBba2V5LCB2YWx1ZV07XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcFRvQXJyYXk7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgbWF0Y2hlc1Byb3BlcnR5YCBmb3Igc291cmNlIHZhbHVlcyBzdWl0YWJsZVxuICogZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKGtleSwgc3JjVmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0W2tleV0gPT09IHNyY1ZhbHVlICYmXG4gICAgICAoc3JjVmFsdWUgIT09IHVuZGVmaW5lZCB8fCAoa2V5IGluIE9iamVjdChvYmplY3QpKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWF0Y2hlc1N0cmljdENvbXBhcmFibGU7XG4iLCJ2YXIgbWVtb2l6ZSA9IHJlcXVpcmUoJy4vbWVtb2l6ZScpO1xuXG4vKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG52YXIgTUFYX01FTU9JWkVfU0laRSA9IDUwMDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG4gKiBjYWNoZSB3aGVuIGl0IGV4Y2VlZHMgYE1BWF9NRU1PSVpFX1NJWkVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZUNhcHBlZChmdW5jKSB7XG4gIHZhciByZXN1bHQgPSBtZW1vaXplKGZ1bmMsIGZ1bmN0aW9uKGtleSkge1xuICAgIGlmIChjYWNoZS5zaXplID09PSBNQVhfTUVNT0laRV9TSVpFKSB7XG4gICAgICBjYWNoZS5jbGVhcigpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5O1xuICB9KTtcblxuICB2YXIgY2FjaGUgPSByZXN1bHQuY2FjaGU7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWVtb2l6ZUNhcHBlZDtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVDcmVhdGU7XG4iLCJ2YXIgb3ZlckFyZyA9IHJlcXVpcmUoJy4vX292ZXJBcmcnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUtleXM7XG4iLCIvKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZVxuICogW2BPYmplY3Qua2V5c2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZXhjZXB0IHRoYXQgaXQgaW5jbHVkZXMgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmIChvYmplY3QgIT0gbnVsbCkge1xuICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVLZXlzSW47XG4iLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHByb2Nlc3NgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5wcm9jZXNzO1xuXG4vKiogVXNlZCB0byBhY2Nlc3MgZmFzdGVyIE5vZGUuanMgaGVscGVycy4gKi9cbnZhciBub2RlVXRpbCA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICAvLyBVc2UgYHV0aWwudHlwZXNgIGZvciBOb2RlLmpzIDEwKy5cbiAgICB2YXIgdHlwZXMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUucmVxdWlyZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUoJ3V0aWwnKS50eXBlcztcblxuICAgIGlmICh0eXBlcykge1xuICAgICAgcmV0dXJuIHR5cGVzO1xuICAgIH1cblxuICAgIC8vIExlZ2FjeSBgcHJvY2Vzcy5iaW5kaW5nKCd1dGlsJylgIGZvciBOb2RlLmpzIDwgMTAuXG4gICAgcmV0dXJuIGZyZWVQcm9jZXNzICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcgJiYgZnJlZVByb2Nlc3MuYmluZGluZygndXRpbCcpO1xuICB9IGNhdGNoIChlKSB7fVxufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBub2RlVXRpbDtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9iamVjdFRvU3RyaW5nO1xuIiwiLyoqXG4gKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlckFyZztcbiIsInZhciBhcHBseSA9IHJlcXVpcmUoJy4vX2FwcGx5Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCB0cmFuc2Zvcm1zIHRoZSByZXN0IGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSByZXN0IGFycmF5IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyUmVzdChmdW5jLCBzdGFydCwgdHJhbnNmb3JtKSB7XG4gIHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0ID09PSB1bmRlZmluZWQgPyAoZnVuYy5sZW5ndGggLSAxKSA6IHN0YXJ0LCAwKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBzdGFydCwgMCksXG4gICAgICAgIGFycmF5ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhcnJheVtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdO1xuICAgIH1cbiAgICBpbmRleCA9IC0xO1xuICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpO1xuICAgIHdoaWxlICgrK2luZGV4IDwgc3RhcnQpIHtcbiAgICAgIG90aGVyQXJnc1tpbmRleF0gPSBhcmdzW2luZGV4XTtcbiAgICB9XG4gICAgb3RoZXJBcmdzW3N0YXJ0XSA9IHRyYW5zZm9ybShhcnJheSk7XG4gICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlclJlc3Q7XG4iLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJvb3Q7XG4iLCIvKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgLCB1bmxlc3MgYGtleWAgaXMgXCJfX3Byb3RvX19cIiBvciBcImNvbnN0cnVjdG9yXCIuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBzYWZlR2V0KG9iamVjdCwga2V5KSB7XG4gIGlmIChrZXkgPT09ICdjb25zdHJ1Y3RvcicgJiYgdHlwZW9mIG9iamVjdFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGtleSA9PSAnX19wcm90b19fJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiBvYmplY3Rba2V5XTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzYWZlR2V0O1xuIiwiLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGFkZFxuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAYWxpYXMgcHVzaFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgdGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsIEhBU0hfVU5ERUZJTkVEKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0Q2FjaGVBZGQ7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIHRoZSBhcnJheSBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0Q2FjaGVIYXM7XG4iLCIvKipcbiAqIENvbnZlcnRzIGBzZXRgIHRvIGFuIGFycmF5IG9mIGl0cyB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIHNldFRvQXJyYXkoc2V0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkoc2V0LnNpemUpO1xuXG4gIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldFRvQXJyYXk7XG4iLCJ2YXIgYmFzZVNldFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fYmFzZVNldFRvU3RyaW5nJyksXG4gICAgc2hvcnRPdXQgPSByZXF1aXJlKCcuL19zaG9ydE91dCcpO1xuXG4vKipcbiAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGBmdW5jYCB0byByZXR1cm4gYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICovXG52YXIgc2V0VG9TdHJpbmcgPSBzaG9ydE91dChiYXNlU2V0VG9TdHJpbmcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNldFRvU3RyaW5nO1xuIiwiLyoqIFVzZWQgdG8gZGV0ZWN0IGhvdCBmdW5jdGlvbnMgYnkgbnVtYmVyIG9mIGNhbGxzIHdpdGhpbiBhIHNwYW4gb2YgbWlsbGlzZWNvbmRzLiAqL1xudmFyIEhPVF9DT1VOVCA9IDgwMCxcbiAgICBIT1RfU1BBTiA9IDE2O1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTm93ID0gRGF0ZS5ub3c7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQnbGwgc2hvcnQgb3V0IGFuZCBpbnZva2UgYGlkZW50aXR5YCBpbnN0ZWFkXG4gKiBvZiBgZnVuY2Agd2hlbiBpdCdzIGNhbGxlZCBgSE9UX0NPVU5UYCBvciBtb3JlIHRpbWVzIGluIGBIT1RfU1BBTmBcbiAqIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzaG9ydGFibGUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHNob3J0T3V0KGZ1bmMpIHtcbiAgdmFyIGNvdW50ID0gMCxcbiAgICAgIGxhc3RDYWxsZWQgPSAwO1xuXG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RhbXAgPSBuYXRpdmVOb3coKSxcbiAgICAgICAgcmVtYWluaW5nID0gSE9UX1NQQU4gLSAoc3RhbXAgLSBsYXN0Q2FsbGVkKTtcblxuICAgIGxhc3RDYWxsZWQgPSBzdGFtcDtcbiAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgaWYgKCsrY291bnQgPj0gSE9UX0NPVU5UKSB7XG4gICAgICAgIHJldHVybiBhcmd1bWVudHNbMF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvdW50ID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3J0T3V0O1xuIiwidmFyIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIHN0YWNrLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIFN0YWNrXG4gKi9cbmZ1bmN0aW9uIHN0YWNrQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlO1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrQ2xlYXI7XG4iLCIvKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBzdGFjay5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzdGFja0RlbGV0ZShrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgcmVzdWx0ID0gZGF0YVsnZGVsZXRlJ10oa2V5KTtcblxuICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tEZWxldGU7XG4iLCIvKipcbiAqIEdldHMgdGhlIHN0YWNrIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBzdGFja0dldChrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tHZXQ7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBhIHN0YWNrIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc3RhY2tIYXMoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyhrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrSGFzO1xuIiwidmFyIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpLFxuICAgIE1hcENhY2hlID0gcmVxdWlyZSgnLi9fTWFwQ2FjaGUnKTtcblxuLyoqIFVzZWQgYXMgdGhlIHNpemUgdG8gZW5hYmxlIGxhcmdlIGFycmF5IG9wdGltaXphdGlvbnMuICovXG52YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuLyoqXG4gKiBTZXRzIHRoZSBzdGFjayBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBzdGFjayBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc3RhY2tTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgTGlzdENhY2hlKSB7XG4gICAgdmFyIHBhaXJzID0gZGF0YS5fX2RhdGFfXztcbiAgICBpZiAoIU1hcCB8fCAocGFpcnMubGVuZ3RoIDwgTEFSR0VfQVJSQVlfU0laRSAtIDEpKSB7XG4gICAgICBwYWlycy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICB0aGlzLnNpemUgPSArK2RhdGEuc2l6ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZShwYWlycyk7XG4gIH1cbiAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tTZXQ7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmRleE9mYCB3aGljaCBwZXJmb3JtcyBzdHJpY3QgZXF1YWxpdHlcbiAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaWN0SW5kZXhPZjtcbiIsInZhciBhc2NpaVNpemUgPSByZXF1aXJlKCcuL19hc2NpaVNpemUnKSxcbiAgICBoYXNVbmljb2RlID0gcmVxdWlyZSgnLi9faGFzVW5pY29kZScpLFxuICAgIHVuaWNvZGVTaXplID0gcmVxdWlyZSgnLi9fdW5pY29kZVNpemUnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nU2l6ZShzdHJpbmcpIHtcbiAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgID8gdW5pY29kZVNpemUoc3RyaW5nKVxuICAgIDogYXNjaWlTaXplKHN0cmluZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaW5nU2l6ZTtcbiIsInZhciBtZW1vaXplQ2FwcGVkID0gcmVxdWlyZSgnLi9fbWVtb2l6ZUNhcHBlZCcpO1xuXG4vKiogVXNlZCB0byBtYXRjaCBwcm9wZXJ0eSBuYW1lcyB3aXRoaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgcmVQcm9wTmFtZSA9IC9bXi5bXFxdXSt8XFxbKD86KC0/XFxkKyg/OlxcLlxcZCspPyl8KFtcIiddKSgoPzooPyFcXDIpW15cXFxcXXxcXFxcLikqPylcXDIpXFxdfCg/PSg/OlxcLnxcXFtcXF0pKD86XFwufFxcW1xcXXwkKSkvZztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7XG5cbi8qKlxuICogQ29udmVydHMgYHN0cmluZ2AgdG8gYSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqL1xudmFyIHN0cmluZ1RvUGF0aCA9IG1lbW9pemVDYXBwZWQoZnVuY3Rpb24oc3RyaW5nKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgaWYgKHN0cmluZy5jaGFyQ29kZUF0KDApID09PSA0NiAvKiAuICovKSB7XG4gICAgcmVzdWx0LnB1c2goJycpO1xuICB9XG4gIHN0cmluZy5yZXBsYWNlKHJlUHJvcE5hbWUsIGZ1bmN0aW9uKG1hdGNoLCBudW1iZXIsIHF1b3RlLCBzdWJTdHJpbmcpIHtcbiAgICByZXN1bHQucHVzaChxdW90ZSA/IHN1YlN0cmluZy5yZXBsYWNlKHJlRXNjYXBlQ2hhciwgJyQxJykgOiAobnVtYmVyIHx8IG1hdGNoKSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaW5nVG9QYXRoO1xuIiwidmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcga2V5IGlmIGl0J3Mgbm90IGEgc3RyaW5nIG9yIHN5bWJvbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd8c3ltYm9sfSBSZXR1cm5zIHRoZSBrZXkuXG4gKi9cbmZ1bmN0aW9uIHRvS2V5KHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0tleTtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYGZ1bmNgIHRvIGl0cyBzb3VyY2UgY29kZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHNvdXJjZSBjb2RlLlxuICovXG5mdW5jdGlvbiB0b1NvdXJjZShmdW5jKSB7XG4gIGlmIChmdW5jICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoZnVuYyArICcnKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9XG4gIHJldHVybiAnJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1NvdXJjZTtcbiIsIi8qKiBVc2VkIHRvIG1hdGNoIGEgc2luZ2xlIHdoaXRlc3BhY2UgY2hhcmFjdGVyLiAqL1xudmFyIHJlV2hpdGVzcGFjZSA9IC9cXHMvO1xuXG4vKipcbiAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1FbmRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2VcbiAqIGNoYXJhY3RlciBvZiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIuXG4gKi9cbmZ1bmN0aW9uIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpIHtcbiAgdmFyIGluZGV4ID0gc3RyaW5nLmxlbmd0aDtcblxuICB3aGlsZSAoaW5kZXgtLSAmJiByZVdoaXRlc3BhY2UudGVzdChzdHJpbmcuY2hhckF0KGluZGV4KSkpIHt9XG4gIHJldHVybiBpbmRleDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0cmltbWVkRW5kSW5kZXg7XG4iLCIvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG52YXIgcnNBc3RyYWxSYW5nZSA9ICdcXFxcdWQ4MDAtXFxcXHVkZmZmJyxcbiAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgcnNDb21ib1N5bWJvbHNSYW5nZSA9ICdcXFxcdTIwZDAtXFxcXHUyMGZmJyxcbiAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2FwdHVyZSBncm91cHMuICovXG52YXIgcnNBc3RyYWwgPSAnWycgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgIHJzQ29tYm8gPSAnWycgKyByc0NvbWJvUmFuZ2UgKyAnXScsXG4gICAgcnNGaXR6ID0gJ1xcXFx1ZDgzY1tcXFxcdWRmZmItXFxcXHVkZmZmXScsXG4gICAgcnNNb2RpZmllciA9ICcoPzonICsgcnNDb21ibyArICd8JyArIHJzRml0eiArICcpJyxcbiAgICByc05vbkFzdHJhbCA9ICdbXicgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgIHJzUmVnaW9uYWwgPSAnKD86XFxcXHVkODNjW1xcXFx1ZGRlNi1cXFxcdWRkZmZdKXsyfScsXG4gICAgcnNTdXJyUGFpciA9ICdbXFxcXHVkODAwLVxcXFx1ZGJmZl1bXFxcXHVkYzAwLVxcXFx1ZGZmZl0nLFxuICAgIHJzWldKID0gJ1xcXFx1MjAwZCc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSByZWdleGVzLiAqL1xudmFyIHJlT3B0TW9kID0gcnNNb2RpZmllciArICc/JyxcbiAgICByc09wdFZhciA9ICdbJyArIHJzVmFyUmFuZ2UgKyAnXT8nLFxuICAgIHJzT3B0Sm9pbiA9ICcoPzonICsgcnNaV0ogKyAnKD86JyArIFtyc05vbkFzdHJhbCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNPcHRWYXIgKyByZU9wdE1vZCArICcpKicsXG4gICAgcnNTZXEgPSByc09wdFZhciArIHJlT3B0TW9kICsgcnNPcHRKb2luLFxuICAgIHJzU3ltYm9sID0gJyg/OicgKyBbcnNOb25Bc3RyYWwgKyByc0NvbWJvICsgJz8nLCByc0NvbWJvLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyLCByc0FzdHJhbF0uam9pbignfCcpICsgJyknO1xuXG4vKiogVXNlZCB0byBtYXRjaCBbc3RyaW5nIHN5bWJvbHNdKGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LXVuaWNvZGUpLiAqL1xudmFyIHJlVW5pY29kZSA9IFJlZ0V4cChyc0ZpdHogKyAnKD89JyArIHJzRml0eiArICcpfCcgKyByc1N5bWJvbCArIHJzU2VxLCAnZycpO1xuXG4vKipcbiAqIEdldHMgdGhlIHNpemUgb2YgYSBVbmljb2RlIGBzdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICovXG5mdW5jdGlvbiB1bmljb2RlU2l6ZShzdHJpbmcpIHtcbiAgdmFyIHJlc3VsdCA9IHJlVW5pY29kZS5sYXN0SW5kZXggPSAwO1xuICB3aGlsZSAocmVVbmljb2RlLnRlc3Qoc3RyaW5nKSkge1xuICAgICsrcmVzdWx0O1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdW5pY29kZVNpemU7XG4iLCJ2YXIgYmFzZUNsb25lID0gcmVxdWlyZSgnLi9fYmFzZUNsb25lJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG52YXIgQ0xPTkVfU1lNQk9MU19GTEFHID0gNDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2hhbGxvdyBjbG9uZSBvZiBgdmFsdWVgLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZVxuICogW3N0cnVjdHVyZWQgY2xvbmUgYWxnb3JpdGhtXShodHRwczovL21kbi5pby9TdHJ1Y3R1cmVkX2Nsb25lX2FsZ29yaXRobSlcbiAqIGFuZCBzdXBwb3J0cyBjbG9uaW5nIGFycmF5cywgYXJyYXkgYnVmZmVycywgYm9vbGVhbnMsIGRhdGUgb2JqZWN0cywgbWFwcyxcbiAqIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsIGFuZCB0eXBlZFxuICogYXJyYXlzLiBUaGUgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBgYXJndW1lbnRzYCBvYmplY3RzIGFyZSBjbG9uZWRcbiAqIGFzIHBsYWluIG9iamVjdHMuIEFuIGVtcHR5IG9iamVjdCBpcyByZXR1cm5lZCBmb3IgdW5jbG9uZWFibGUgdmFsdWVzIHN1Y2hcbiAqIGFzIGVycm9yIG9iamVjdHMsIGZ1bmN0aW9ucywgRE9NIG5vZGVzLCBhbmQgV2Vha01hcHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAqIEBzZWUgXy5jbG9uZURlZXBcbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbeyAnYSc6IDEgfSwgeyAnYic6IDIgfV07XG4gKlxuICogdmFyIHNoYWxsb3cgPSBfLmNsb25lKG9iamVjdHMpO1xuICogY29uc29sZS5sb2coc2hhbGxvd1swXSA9PT0gb2JqZWN0c1swXSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGNsb25lKHZhbHVlKSB7XG4gIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX1NZTUJPTFNfRkxBRyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmU7XG4iLCJ2YXIgYmFzZUNsb25lID0gcmVxdWlyZSgnLi9fYmFzZUNsb25lJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG52YXIgQ0xPTkVfREVFUF9GTEFHID0gMSxcbiAgICBDTE9ORV9TWU1CT0xTX0ZMQUcgPSA0O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY2xvbmVgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGNsb25lcyBgdmFsdWVgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZWN1cnNpdmVseSBjbG9uZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBkZWVwIGNsb25lZCB2YWx1ZS5cbiAqIEBzZWUgXy5jbG9uZVxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAqXG4gKiB2YXIgZGVlcCA9IF8uY2xvbmVEZWVwKG9iamVjdHMpO1xuICogY29uc29sZS5sb2coZGVlcFswXSA9PT0gb2JqZWN0c1swXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBjbG9uZURlZXAodmFsdWUpIHtcbiAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZURlZXA7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHZhbHVlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmV0dXJuIGZyb20gdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbnN0YW50IGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0cyA9IF8udGltZXMoMiwgXy5jb25zdGFudCh7ICdhJzogMSB9KSk7XG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0cyk7XG4gKiAvLyA9PiBbeyAnYSc6IDEgfSwgeyAnYSc6IDEgfV1cbiAqXG4gKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gY29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb25zdGFudDtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBub3cgPSByZXF1aXJlKCcuL25vdycpLFxuICAgIHRvTnVtYmVyID0gcmVxdWlyZSgnLi90b051bWJlcicpO1xuXG4vKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAqIGludm9rZWQuIFRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgIG1ldGhvZCB0byBjYW5jZWxcbiAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gKiBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkXG4gKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICogaW52b2NhdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICpcbiAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICpcbiAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdXG4gKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gKlxuICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gKiAgICdsZWFkaW5nJzogdHJ1ZSxcbiAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAqIH0pKTtcbiAqXG4gKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7XG4gKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gKlxuICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyBkZWJvdW5jZWQgaW52b2NhdGlvbi5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICovXG5mdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBsYXN0QXJncyxcbiAgICAgIGxhc3RUaGlzLFxuICAgICAgbWF4V2FpdCxcbiAgICAgIHJlc3VsdCxcbiAgICAgIHRpbWVySWQsXG4gICAgICBsYXN0Q2FsbFRpbWUsXG4gICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICBtYXhpbmcgPSBmYWxzZSxcbiAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDtcbiAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgIG1heFdhaXQgPSBtYXhpbmcgPyBuYXRpdmVNYXgodG9OdW1iZXIob3B0aW9ucy5tYXhXYWl0KSB8fCAwLCB3YWl0KSA6IG1heFdhaXQ7XG4gICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZUZ1bmModGltZSkge1xuICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgIHRoaXNBcmcgPSBsYXN0VGhpcztcblxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpIHtcbiAgICAvLyBSZXNldCBhbnkgYG1heFdhaXRgIHRpbWVyLlxuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAvLyBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSB0cmFpbGluZyBlZGdlLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgcmV0dXJuIGxlYWRpbmcgPyBpbnZva2VGdW5jKHRpbWUpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZSxcbiAgICAgICAgdGltZVdhaXRpbmcgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICByZXR1cm4gbWF4aW5nXG4gICAgICA/IG5hdGl2ZU1pbih0aW1lV2FpdGluZywgbWF4V2FpdCAtIHRpbWVTaW5jZUxhc3RJbnZva2UpXG4gICAgICA6IHRpbWVXYWl0aW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lO1xuXG4gICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIGFjdGl2aXR5IGhhcyBzdG9wcGVkIGFuZCB3ZSdyZSBhdCB0aGVcbiAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgIC8vIGl0IGFzIHRoZSB0cmFpbGluZyBlZGdlLCBvciB3ZSd2ZSBoaXQgdGhlIGBtYXhXYWl0YCBsaW1pdC5cbiAgICByZXR1cm4gKGxhc3RDYWxsVGltZSA9PT0gdW5kZWZpbmVkIHx8ICh0aW1lU2luY2VMYXN0Q2FsbCA+PSB3YWl0KSB8fFxuICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7XG4gICAgfVxuICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7XG4gICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICB9XG4gICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKSxcbiAgICAgICAgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTtcblxuICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lO1xuXG4gICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgICBpZiAobWF4aW5nKSB7XG4gICAgICAgIC8vIEhhbmRsZSBpbnZvY2F0aW9ucyBpbiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDtcbiAgcmV0dXJuIGRlYm91bmNlZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJvdW5jZTtcbiIsInZhciBiYXNlUmVzdCA9IHJlcXVpcmUoJy4vX2Jhc2VSZXN0JyksXG4gICAgZXEgPSByZXF1aXJlKCcuL2VxJyksXG4gICAgaXNJdGVyYXRlZUNhbGwgPSByZXF1aXJlKCcuL19pc0l0ZXJhdGVlQ2FsbCcpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQXNzaWducyBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZVxuICogb2JqZWN0cyB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0IGZvciBhbGwgZGVzdGluYXRpb24gcHJvcGVydGllcyB0aGF0XG4gKiByZXNvbHZlIHRvIGB1bmRlZmluZWRgLiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuXG4gKiBPbmNlIGEgcHJvcGVydHkgaXMgc2V0LCBhZGRpdGlvbmFsIHZhbHVlcyBvZiB0aGUgc2FtZSBwcm9wZXJ0eSBhcmUgaWdub3JlZC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKiBAc2VlIF8uZGVmYXVsdHNEZWVwXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAqL1xudmFyIGRlZmF1bHRzID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2VzKSB7XG4gIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgbGVuZ3RoID0gc291cmNlcy5sZW5ndGg7XG4gIHZhciBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkO1xuXG4gIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLCBzb3VyY2VzWzFdLCBndWFyZCkpIHtcbiAgICBsZW5ndGggPSAxO1xuICB9XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgc291cmNlID0gc291cmNlc1tpbmRleF07XG4gICAgdmFyIHByb3BzID0ga2V5c0luKHNvdXJjZSk7XG4gICAgdmFyIHByb3BzSW5kZXggPSAtMTtcbiAgICB2YXIgcHJvcHNMZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytwcm9wc0luZGV4IDwgcHJvcHNMZW5ndGgpIHtcbiAgICAgIHZhciBrZXkgPSBwcm9wc1twcm9wc0luZGV4XTtcbiAgICAgIHZhciB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIChlcSh2YWx1ZSwgb2JqZWN0UHJvdG9ba2V5XSkgJiYgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICBvYmplY3Rba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmplY3Q7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBkZWZhdWx0cztcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mb3JFYWNoJyk7XG4iLCIvKipcbiAqIFBlcmZvcm1zIGFcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gKlxuICogXy5lcShvYmplY3QsIG9iamVjdCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcShvYmplY3QsIG90aGVyKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcSgnYScsICdhJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcSgnYScsIE9iamVjdCgnYScpKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcShOYU4sIE5hTik7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPT09IG90aGVyIHx8ICh2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlcTtcbiIsInZhciBhcnJheUZpbHRlciA9IHJlcXVpcmUoJy4vX2FycmF5RmlsdGVyJyksXG4gICAgYmFzZUZpbHRlciA9IHJlcXVpcmUoJy4vX2Jhc2VGaWx0ZXInKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyBhbiBhcnJheSBvZiBhbGwgZWxlbWVudHNcbiAqIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAqIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICpcbiAqICoqTm90ZToqKiBVbmxpa2UgYF8ucmVtb3ZlYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gKiBAc2VlIF8ucmVqZWN0XG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICogXTtcbiAqXG4gKiBfLmZpbHRlcih1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmlsdGVyKHVzZXJzLCB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maWx0ZXIodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbHRlcih1c2VycywgJ2FjdGl2ZScpO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICpcbiAqIC8vIENvbWJpbmluZyBzZXZlcmFsIHByZWRpY2F0ZXMgdXNpbmcgYF8ub3ZlckV2ZXJ5YCBvciBgXy5vdmVyU29tZWAuXG4gKiBfLmZpbHRlcih1c2VycywgXy5vdmVyU29tZShbeyAnYWdlJzogMzYgfSwgWydhZ2UnLCA0MF1dKSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnLCAnYmFybmV5J11cbiAqL1xuZnVuY3Rpb24gZmlsdGVyKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUZpbHRlciA6IGJhc2VGaWx0ZXI7XG4gIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGJhc2VJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmaWx0ZXI7XG4iLCJ2YXIgY3JlYXRlRmluZCA9IHJlcXVpcmUoJy4vX2NyZWF0ZUZpbmQnKSxcbiAgICBmaW5kSW5kZXggPSByZXF1aXJlKCcuL2ZpbmRJbmRleCcpO1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgdGhlIGZpcnN0IGVsZW1lbnRcbiAqIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAqIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hdGNoZWQgZWxlbWVudCwgZWxzZSBgdW5kZWZpbmVkYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfVxuICogXTtcbiAqXG4gKiBfLmZpbmQodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlIDwgNDA7IH0pO1xuICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmQodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pO1xuICogLy8gPT4gb2JqZWN0IGZvciAncGViYmxlcydcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmQodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAqIC8vID0+IG9iamVjdCBmb3IgJ2ZyZWQnXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmQodXNlcnMsICdhY3RpdmUnKTtcbiAqIC8vID0+IG9iamVjdCBmb3IgJ2Jhcm5leSdcbiAqL1xudmFyIGZpbmQgPSBjcmVhdGVGaW5kKGZpbmRJbmRleCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZmluZDtcbiIsInZhciBiYXNlRmluZEluZGV4ID0gcmVxdWlyZSgnLi9fYmFzZUZpbmRJbmRleCcpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vdG9JbnRlZ2VyJyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdFxuICogZWxlbWVudCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBpdHNlbGYuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAxLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGAtMWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9XG4gKiBdO1xuICpcbiAqIF8uZmluZEluZGV4KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXIgPT0gJ2Jhcm5leSc7IH0pO1xuICogLy8gPT4gMFxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmRJbmRleCh1c2VycywgeyAndXNlcic6ICdmcmVkJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICogLy8gPT4gMVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZEluZGV4KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gKiAvLyA9PiAwXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmRJbmRleCh1c2VycywgJ2FjdGl2ZScpO1xuICogLy8gPT4gMlxuICovXG5mdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgdmFyIGluZGV4ID0gZnJvbUluZGV4ID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gIGlmIChpbmRleCA8IDApIHtcbiAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gIH1cbiAgcmV0dXJuIGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBpbmRleCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmluZEluZGV4O1xuIiwidmFyIGJhc2VGbGF0dGVuID0gcmVxdWlyZSgnLi9fYmFzZUZsYXR0ZW4nKTtcblxuLyoqXG4gKiBGbGF0dGVucyBgYXJyYXlgIGEgc2luZ2xlIGxldmVsIGRlZXAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5mbGF0dGVuKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICByZXR1cm4gbGVuZ3RoID8gYmFzZUZsYXR0ZW4oYXJyYXksIDEpIDogW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdHRlbjtcbiIsInZhciBhcnJheUVhY2ggPSByZXF1aXJlKCcuL19hcnJheUVhY2gnKSxcbiAgICBiYXNlRWFjaCA9IHJlcXVpcmUoJy4vX2Jhc2VFYWNoJyksXG4gICAgY2FzdEZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fY2FzdEZ1bmN0aW9uJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gIGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggZWxlbWVudC5cbiAqIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gKlxuICogKipOb3RlOioqIEFzIHdpdGggb3RoZXIgXCJDb2xsZWN0aW9uc1wiIG1ldGhvZHMsIG9iamVjdHMgd2l0aCBhIFwibGVuZ3RoXCJcbiAqIHByb3BlcnR5IGFyZSBpdGVyYXRlZCBsaWtlIGFycmF5cy4gVG8gYXZvaWQgdGhpcyBiZWhhdmlvciB1c2UgYF8uZm9ySW5gXG4gKiBvciBgXy5mb3JPd25gIGZvciBvYmplY3QgaXRlcmF0aW9uLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBhbGlhcyBlYWNoXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAqIEBzZWUgXy5mb3JFYWNoUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogXy5mb3JFYWNoKFsxLCAyXSwgZnVuY3Rpb24odmFsdWUpIHtcbiAqICAgY29uc29sZS5sb2codmFsdWUpO1xuICogfSk7XG4gKiAvLyA9PiBMb2dzIGAxYCB0aGVuIGAyYC5cbiAqXG4gKiBfLmZvckVhY2goeyAnYSc6IDEsICdiJzogMiB9LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gKiB9KTtcbiAqIC8vID0+IExvZ3MgJ2EnIHRoZW4gJ2InIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICovXG5mdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RWFjaCA6IGJhc2VFYWNoO1xuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBjYXN0RnVuY3Rpb24oaXRlcmF0ZWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmb3JFYWNoO1xuIiwidmFyIGJhc2VGb3IgPSByZXF1aXJlKCcuL19iYXNlRm9yJyksXG4gICAgY2FzdEZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fY2FzdEZ1bmN0aW9uJyksXG4gICAga2V5c0luID0gcmVxdWlyZSgnLi9rZXlzSW4nKTtcblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2YgYW5cbiAqIG9iamVjdCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXRcbiAqIGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4zLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKiBAc2VlIF8uZm9ySW5SaWdodFxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmZvckluKG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAqICAgY29uc29sZS5sb2coa2V5KTtcbiAqIH0pO1xuICogLy8gPT4gTG9ncyAnYScsICdiJywgdGhlbiAnYycgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkuXG4gKi9cbmZ1bmN0aW9uIGZvckluKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsXG4gICAgPyBvYmplY3RcbiAgICA6IGJhc2VGb3Iob2JqZWN0LCBjYXN0RnVuY3Rpb24oaXRlcmF0ZWUpLCBrZXlzSW4pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZvckluO1xuIiwidmFyIGJhc2VHZXQgPSByZXF1aXJlKCcuL19iYXNlR2V0Jyk7XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXNcbiAqIGB1bmRlZmluZWRgLCB0aGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaW4gaXRzIHBsYWNlLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy43LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgYHVuZGVmaW5lZGAgcmVzb2x2ZWQgdmFsdWVzLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgJ2FbMF0uYi5jJyk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5nZXQob2JqZWN0LCBbJ2EnLCAnMCcsICdiJywgJ2MnXSk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5nZXQob2JqZWN0LCAnYS5iLmMnLCAnZGVmYXVsdCcpO1xuICogLy8gPT4gJ2RlZmF1bHQnXG4gKi9cbmZ1bmN0aW9uIGdldChvYmplY3QsIHBhdGgsIGRlZmF1bHRWYWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXQ7XG4iLCJ2YXIgYmFzZUhhcyA9IHJlcXVpcmUoJy4vX2Jhc2VIYXMnKSxcbiAgICBoYXNQYXRoID0gcmVxdWlyZSgnLi9faGFzUGF0aCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgcGF0aGAgaXMgYSBkaXJlY3QgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IHsgJ2InOiAyIH0gfTtcbiAqIHZhciBvdGhlciA9IF8uY3JlYXRlKHsgJ2EnOiBfLmNyZWF0ZSh7ICdiJzogMiB9KSB9KTtcbiAqXG4gKiBfLmhhcyhvYmplY3QsICdhJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXMob2JqZWN0LCAnYS5iJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXMob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmhhcyhvdGhlciwgJ2EnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGhhcyhvYmplY3QsIHBhdGgpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBiYXNlSGFzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXM7XG4iLCJ2YXIgYmFzZUhhc0luID0gcmVxdWlyZSgnLi9fYmFzZUhhc0luJyksXG4gICAgaGFzUGF0aCA9IHJlcXVpcmUoJy4vX2hhc1BhdGgnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IG9yIGluaGVyaXRlZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gKlxuICogXy5oYXNJbihvYmplY3QsICdhJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXNJbihvYmplY3QsICdhLmInKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmhhc0luKG9iamVjdCwgWydhJywgJ2InXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXNJbihvYmplY3QsICdiJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBoYXNJbihvYmplY3QsIHBhdGgpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBiYXNlSGFzSW4pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc0luO1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudCBpdCByZWNlaXZlcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBBbnkgdmFsdWUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyBgdmFsdWVgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAqXG4gKiBjb25zb2xlLmxvZyhfLmlkZW50aXR5KG9iamVjdCkgPT09IG9iamVjdCk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpZGVudGl0eTtcbiIsInZhciBiYXNlSXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL19iYXNlSXNBcmd1bWVudHMnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcmd1bWVudHMgPSBiYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPyBiYXNlSXNBcmd1bWVudHMgOiBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgJiZcbiAgICAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0FyZ3VtZW50cztcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXk7XG4iLCJ2YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5TGlrZTtcbiIsInZhciBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNBcnJheUxpa2VgIGV4Y2VwdCB0aGF0IGl0IGFsc28gY2hlY2tzIGlmIGB2YWx1ZWBcbiAqIGlzIGFuIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS1saWtlIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheUxpa2VPYmplY3Q7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKSxcbiAgICBzdHViRmFsc2UgPSByZXF1aXJlKCcuL3N0dWJGYWxzZScpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIEJ1ZmZlciA9IG1vZHVsZUV4cG9ydHMgPyByb290LkJ1ZmZlciA6IHVuZGVmaW5lZDtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUlzQnVmZmVyID0gQnVmZmVyID8gQnVmZmVyLmlzQnVmZmVyIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4zLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNCdWZmZXIobmV3IEJ1ZmZlcigyKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0J1ZmZlcihuZXcgVWludDhBcnJheSgyKSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNCdWZmZXIgPSBuYXRpdmVJc0J1ZmZlciB8fCBzdHViRmFsc2U7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNCdWZmZXI7XG4iLCJ2YXIgYmFzZUtleXMgPSByZXF1aXJlKCcuL19iYXNlS2V5cycpLFxuICAgIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGVtcHR5IG9iamVjdCwgY29sbGVjdGlvbiwgbWFwLCBvciBzZXQuXG4gKlxuICogT2JqZWN0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgbm8gb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkXG4gKiBwcm9wZXJ0aWVzLlxuICpcbiAqIEFycmF5LWxpa2UgdmFsdWVzIHN1Y2ggYXMgYGFyZ3VtZW50c2Agb2JqZWN0cywgYXJyYXlzLCBidWZmZXJzLCBzdHJpbmdzLCBvclxuICogalF1ZXJ5LWxpa2UgY29sbGVjdGlvbnMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYGxlbmd0aGAgb2YgYDBgLlxuICogU2ltaWxhcmx5LCBtYXBzIGFuZCBzZXRzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBhIGBzaXplYCBvZiBgMGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZW1wdHksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0VtcHR5KG51bGwpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNFbXB0eSh0cnVlKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRW1wdHkoMSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0VtcHR5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNFbXB0eSh7ICdhJzogMSB9KTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaXNBcnJheUxpa2UodmFsdWUpICYmXG4gICAgICAoaXNBcnJheSh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZS5zcGxpY2UgPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICBpc0J1ZmZlcih2YWx1ZSkgfHwgaXNUeXBlZEFycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkpKSB7XG4gICAgcmV0dXJuICF2YWx1ZS5sZW5ndGg7XG4gIH1cbiAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSk7XG4gIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICByZXR1cm4gIXZhbHVlLnNpemU7XG4gIH1cbiAgaWYgKGlzUHJvdG90eXBlKHZhbHVlKSkge1xuICAgIHJldHVybiAhYmFzZUtleXModmFsdWUpLmxlbmd0aDtcbiAgfVxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0VtcHR5O1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhc3luY1RhZyA9ICdbb2JqZWN0IEFzeW5jRnVuY3Rpb25dJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHByb3h5VGFnID0gJ1tvYmplY3QgUHJveHldJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oXyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gIC8vIGluIFNhZmFyaSA5IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5cyBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnIHx8IHRhZyA9PSBhc3luY1RhZyB8fCB0YWcgPT0gcHJveHlUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGdW5jdGlvbjtcbiIsIi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBsZW5ndGguXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0xlbmd0aCgzKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aCgnMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJlxuICAgIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0xlbmd0aDtcbiIsInZhciBiYXNlSXNNYXAgPSByZXF1aXJlKCcuL19iYXNlSXNNYXAnKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBub2RlVXRpbCA9IHJlcXVpcmUoJy4vX25vZGVVdGlsJyk7XG5cbi8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG52YXIgbm9kZUlzTWFwID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNNYXA7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBNYXBgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMy4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTWFwKG5ldyBNYXApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNNYXAobmV3IFdlYWtNYXApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzTWFwID0gbm9kZUlzTWFwID8gYmFzZVVuYXJ5KG5vZGVJc01hcCkgOiBiYXNlSXNNYXA7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNNYXA7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0TGlrZTtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGdldFByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2dldFByb3RvdHlwZScpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBVc2VkIHRvIGluZmVyIHRoZSBgT2JqZWN0YCBjb25zdHJ1Y3Rvci4gKi9cbnZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgdGhhdCBpcywgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlXG4gKiBgT2JqZWN0YCBjb25zdHJ1Y3RvciBvciBvbmUgd2l0aCBhIGBbW1Byb3RvdHlwZV1dYCBvZiBgbnVsbGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjguMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogfVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChuZXcgRm9vKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgfHwgYmFzZUdldFRhZyh2YWx1ZSkgIT0gb2JqZWN0VGFnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwcm90byA9IGdldFByb3RvdHlwZSh2YWx1ZSk7XG4gIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gIHJldHVybiB0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmXG4gICAgZnVuY1RvU3RyaW5nLmNhbGwoQ3RvcikgPT0gb2JqZWN0Q3RvclN0cmluZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1BsYWluT2JqZWN0O1xuIiwidmFyIGJhc2VJc1NldCA9IHJlcXVpcmUoJy4vX2Jhc2VJc1NldCcpLFxuICAgIGJhc2VVbmFyeSA9IHJlcXVpcmUoJy4vX2Jhc2VVbmFyeScpLFxuICAgIG5vZGVVdGlsID0gcmVxdWlyZSgnLi9fbm9kZVV0aWwnKTtcblxuLyogTm9kZS5qcyBoZWxwZXIgcmVmZXJlbmNlcy4gKi9cbnZhciBub2RlSXNTZXQgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1NldDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFNldGAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4zLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2V0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTZXQobmV3IFNldCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1NldChuZXcgV2Vha1NldCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNTZXQgPSBub2RlSXNTZXQgPyBiYXNlVW5hcnkobm9kZUlzU2V0KSA6IGJhc2VJc1NldDtcblxubW9kdWxlLmV4cG9ydHMgPSBpc1NldDtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTdHJpbmdgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzdHJpbmcsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N0cmluZygnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N0cmluZygxKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHxcbiAgICAoIWlzQXJyYXkodmFsdWUpICYmIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3RyaW5nVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1N0cmluZztcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1N5bWJvbDtcbiIsInZhciBiYXNlSXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fYmFzZUlzVHlwZWRBcnJheScpLFxuICAgIGJhc2VVbmFyeSA9IHJlcXVpcmUoJy4vX2Jhc2VVbmFyeScpLFxuICAgIG5vZGVVdGlsID0gcmVxdWlyZSgnLi9fbm9kZVV0aWwnKTtcblxuLyogTm9kZS5qcyBoZWxwZXIgcmVmZXJlbmNlcy4gKi9cbnZhciBub2RlSXNUeXBlZEFycmF5ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNUeXBlZEFycmF5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSB0eXBlZCBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNUeXBlZEFycmF5KG5ldyBVaW50OEFycmF5KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShbXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNUeXBlZEFycmF5ID0gbm9kZUlzVHlwZWRBcnJheSA/IGJhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IGJhc2VJc1R5cGVkQXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNUeXBlZEFycmF5O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVW5kZWZpbmVkKHZvaWQgMCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1VuZGVmaW5lZChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzVW5kZWZpbmVkO1xuIiwidmFyIGFycmF5TGlrZUtleXMgPSByZXF1aXJlKCcuL19hcnJheUxpa2VLZXlzJyksXG4gICAgYmFzZUtleXMgPSByZXF1aXJlKCcuL19iYXNlS2V5cycpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLiBTZWUgdGhlXG4gKiBbRVMgc3BlY10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8ua2V5cyhuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiBfLmtleXMoJ2hpJyk7XG4gKiAvLyA9PiBbJzAnLCAnMSddXG4gKi9cbmZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XG4gIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QpIDogYmFzZUtleXMob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBrZXlzO1xuIiwidmFyIGFycmF5TGlrZUtleXMgPSByZXF1aXJlKCcuL19hcnJheUxpa2VLZXlzJyksXG4gICAgYmFzZUtleXNJbiA9IHJlcXVpcmUoJy4vX2Jhc2VLZXlzSW4nKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8ua2V5c0luKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InLCAnYyddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKi9cbmZ1bmN0aW9uIGtleXNJbihvYmplY3QpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCwgdHJ1ZSkgOiBiYXNlS2V5c0luKG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ga2V5c0luO1xuIiwiLyoqXG4gKiBHZXRzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5sYXN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiAzXG4gKi9cbmZ1bmN0aW9uIGxhc3QoYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICByZXR1cm4gbGVuZ3RoID8gYXJyYXlbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGFzdDtcbiIsInZhciBhcnJheU1hcCA9IHJlcXVpcmUoJy4vX2FycmF5TWFwJyksXG4gICAgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyksXG4gICAgYmFzZU1hcCA9IHJlcXVpcmUoJy4vX2Jhc2VNYXAnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB2YWx1ZXMgYnkgcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gIHRocnVcbiAqIGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICpcbiAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICogYF8uZXZlcnlgLCBgXy5maWx0ZXJgLCBgXy5tYXBgLCBgXy5tYXBWYWx1ZXNgLCBgXy5yZWplY3RgLCBhbmQgYF8uc29tZWAuXG4gKlxuICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6XG4gKiBgYXJ5YCwgYGNodW5rYCwgYGN1cnJ5YCwgYGN1cnJ5UmlnaHRgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLCBgZXZlcnlgLFxuICogYGZpbGxgLCBgaW52ZXJ0YCwgYHBhcnNlSW50YCwgYHJhbmRvbWAsIGByYW5nZWAsIGByYW5nZVJpZ2h0YCwgYHJlcGVhdGAsXG4gKiBgc2FtcGxlU2l6ZWAsIGBzbGljZWAsIGBzb21lYCwgYHNvcnRCeWAsIGBzcGxpdGAsIGB0YWtlYCwgYHRha2VSaWdodGAsXG4gKiBgdGVtcGxhdGVgLCBgdHJpbWAsIGB0cmltRW5kYCwgYHRyaW1TdGFydGAsIGFuZCBgd29yZHNgXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICogICByZXR1cm4gbiAqIG47XG4gKiB9XG4gKlxuICogXy5tYXAoWzQsIDhdLCBzcXVhcmUpO1xuICogLy8gPT4gWzE2LCA2NF1cbiAqXG4gKiBfLm1hcCh7ICdhJzogNCwgJ2InOiA4IH0sIHNxdWFyZSk7XG4gKiAvLyA9PiBbMTYsIDY0XSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknIH0sXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcgfVxuICogXTtcbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8ubWFwKHVzZXJzLCAndXNlcicpO1xuICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCddXG4gKi9cbmZ1bmN0aW9uIG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheU1hcCA6IGJhc2VNYXA7XG4gIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcDtcbiIsInZhciBiYXNlQXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19iYXNlQXNzaWduVmFsdWUnKSxcbiAgICBiYXNlRm9yT3duID0gcmVxdWlyZSgnLi9fYmFzZUZvck93bicpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUga2V5cyBhcyBgb2JqZWN0YCBhbmQgdmFsdWVzIGdlbmVyYXRlZFxuICogYnkgcnVubmluZyBlYWNoIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YCB0aHJ1XG4gKiBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAqICh2YWx1ZSwga2V5LCBvYmplY3QpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgb2JqZWN0LlxuICogQHNlZSBfLm1hcEtleXNcbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0ge1xuICogICAnZnJlZCc6ICAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCB9LFxuICogICAncGViYmxlcyc6IHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxIH1cbiAqIH07XG4gKlxuICogXy5tYXBWYWx1ZXModXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlOyB9KTtcbiAqIC8vID0+IHsgJ2ZyZWQnOiA0MCwgJ3BlYmJsZXMnOiAxIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8ubWFwVmFsdWVzKHVzZXJzLCAnYWdlJyk7XG4gKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKi9cbmZ1bmN0aW9uIG1hcFZhbHVlcyhvYmplY3QsIGl0ZXJhdGVlKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaXRlcmF0ZWUgPSBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDMpO1xuXG4gIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIGl0ZXJhdGVlKHZhbHVlLCBrZXksIG9iamVjdCkpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBWYWx1ZXM7XG4iLCJ2YXIgYmFzZUV4dHJlbXVtID0gcmVxdWlyZSgnLi9fYmFzZUV4dHJlbXVtJyksXG4gICAgYmFzZUd0ID0gcmVxdWlyZSgnLi9fYmFzZUd0JyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIG1heGltdW0gdmFsdWUgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBlbXB0eSBvciBmYWxzZXksXG4gKiBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTWF0aFxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLm1heChbNCwgMiwgOCwgNl0pO1xuICogLy8gPT4gOFxuICpcbiAqIF8ubWF4KFtdKTtcbiAqIC8vID0+IHVuZGVmaW5lZFxuICovXG5mdW5jdGlvbiBtYXgoYXJyYXkpIHtcbiAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGlkZW50aXR5LCBiYXNlR3QpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWF4O1xuIiwidmFyIE1hcENhY2hlID0gcmVxdWlyZSgnLi9fTWFwQ2FjaGUnKTtcblxuLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBtZW1vaXplcyB0aGUgcmVzdWx0IG9mIGBmdW5jYC4gSWYgYHJlc29sdmVyYCBpc1xuICogcHJvdmlkZWQsIGl0IGRldGVybWluZXMgdGhlIGNhY2hlIGtleSBmb3Igc3RvcmluZyB0aGUgcmVzdWx0IGJhc2VkIG9uIHRoZVxuICogYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGFyZ3VtZW50XG4gKiBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgbWFwIGNhY2hlIGtleS4gVGhlIGBmdW5jYFxuICogaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gKlxuICogKipOb3RlOioqIFRoZSBjYWNoZSBpcyBleHBvc2VkIGFzIHRoZSBgY2FjaGVgIHByb3BlcnR5IG9uIHRoZSBtZW1vaXplZFxuICogZnVuY3Rpb24uIEl0cyBjcmVhdGlvbiBtYXkgYmUgY3VzdG9taXplZCBieSByZXBsYWNpbmcgdGhlIGBfLm1lbW9pemUuQ2FjaGVgXG4gKiBjb25zdHJ1Y3RvciB3aXRoIG9uZSB3aG9zZSBpbnN0YW5jZXMgaW1wbGVtZW50IHRoZVxuICogW2BNYXBgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wcm9wZXJ0aWVzLW9mLXRoZS1tYXAtcHJvdG90eXBlLW9iamVjdClcbiAqIG1ldGhvZCBpbnRlcmZhY2Ugb2YgYGNsZWFyYCwgYGRlbGV0ZWAsIGBnZXRgLCBgaGFzYCwgYW5kIGBzZXRgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3Jlc29sdmVyXSBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSB0aGUgY2FjaGUga2V5LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdjJzogMywgJ2QnOiA0IH07XG4gKlxuICogdmFyIHZhbHVlcyA9IF8ubWVtb2l6ZShfLnZhbHVlcyk7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsxLCAyXVxuICpcbiAqIHZhbHVlcyhvdGhlcik7XG4gKiAvLyA9PiBbMywgNF1cbiAqXG4gKiBvYmplY3QuYSA9IDI7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsxLCAyXVxuICpcbiAqIC8vIE1vZGlmeSB0aGUgcmVzdWx0IGNhY2hlLlxuICogdmFsdWVzLmNhY2hlLnNldChvYmplY3QsIFsnYScsICdiJ10pO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbJ2EnLCAnYiddXG4gKlxuICogLy8gUmVwbGFjZSBgXy5tZW1vaXplLkNhY2hlYC5cbiAqIF8ubWVtb2l6ZS5DYWNoZSA9IFdlYWtNYXA7XG4gKi9cbmZ1bmN0aW9uIG1lbW9pemUoZnVuYywgcmVzb2x2ZXIpIHtcbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicgfHwgKHJlc29sdmVyICE9IG51bGwgJiYgdHlwZW9mIHJlc29sdmVyICE9ICdmdW5jdGlvbicpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBrZXkgPSByZXNvbHZlciA/IHJlc29sdmVyLmFwcGx5KHRoaXMsIGFyZ3MpIDogYXJnc1swXSxcbiAgICAgICAgY2FjaGUgPSBtZW1vaXplZC5jYWNoZTtcblxuICAgIGlmIChjYWNoZS5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXkpO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICBtZW1vaXplZC5jYWNoZSA9IGNhY2hlLnNldChrZXksIHJlc3VsdCkgfHwgY2FjaGU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgbWVtb2l6ZWQuY2FjaGUgPSBuZXcgKG1lbW9pemUuQ2FjaGUgfHwgTWFwQ2FjaGUpO1xuICByZXR1cm4gbWVtb2l6ZWQ7XG59XG5cbi8vIEV4cG9zZSBgTWFwQ2FjaGVgLlxubWVtb2l6ZS5DYWNoZSA9IE1hcENhY2hlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1lbW9pemU7XG4iLCJ2YXIgYmFzZU1lcmdlID0gcmVxdWlyZSgnLi9fYmFzZU1lcmdlJyksXG4gICAgY3JlYXRlQXNzaWduZXIgPSByZXF1aXJlKCcuL19jcmVhdGVBc3NpZ25lcicpO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBtZXJnZXMgb3duIGFuZFxuICogaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdHMgaW50byB0aGVcbiAqIGRlc3RpbmF0aW9uIG9iamVjdC4gU291cmNlIHByb3BlcnRpZXMgdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgIGFyZVxuICogc2tpcHBlZCBpZiBhIGRlc3RpbmF0aW9uIHZhbHVlIGV4aXN0cy4gQXJyYXkgYW5kIHBsYWluIG9iamVjdCBwcm9wZXJ0aWVzXG4gKiBhcmUgbWVyZ2VkIHJlY3Vyc2l2ZWx5LiBPdGhlciBvYmplY3RzIGFuZCB2YWx1ZSB0eXBlcyBhcmUgb3ZlcnJpZGRlbiBieVxuICogYXNzaWdubWVudC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LiBTdWJzZXF1ZW50XG4gKiBzb3VyY2VzIG92ZXJ3cml0ZSBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyBzb3VyY2VzLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC41LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHtcbiAqICAgJ2EnOiBbeyAnYic6IDIgfSwgeyAnZCc6IDQgfV1cbiAqIH07XG4gKlxuICogdmFyIG90aGVyID0ge1xuICogICAnYSc6IFt7ICdjJzogMyB9LCB7ICdlJzogNSB9XVxuICogfTtcbiAqXG4gKiBfLm1lcmdlKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4geyAnYSc6IFt7ICdiJzogMiwgJ2MnOiAzIH0sIHsgJ2QnOiA0LCAnZSc6IDUgfV0gfVxuICovXG52YXIgbWVyZ2UgPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpIHtcbiAgYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBtZXJnZTtcbiIsInZhciBiYXNlRXh0cmVtdW0gPSByZXF1aXJlKCcuL19iYXNlRXh0cmVtdW0nKSxcbiAgICBiYXNlTHQgPSByZXF1aXJlKCcuL19iYXNlTHQnKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKTtcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbWluaW11bSB2YWx1ZSBvZiBgYXJyYXlgLiBJZiBgYXJyYXlgIGlzIGVtcHR5IG9yIGZhbHNleSxcbiAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ubWluKFs0LCAyLCA4LCA2XSk7XG4gKiAvLyA9PiAyXG4gKlxuICogXy5taW4oW10pO1xuICogLy8gPT4gdW5kZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIG1pbihhcnJheSkge1xuICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VMdClcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtaW47XG4iLCJ2YXIgYmFzZUV4dHJlbXVtID0gcmVxdWlyZSgnLi9fYmFzZUV4dHJlbXVtJyksXG4gICAgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyksXG4gICAgYmFzZUx0ID0gcmVxdWlyZSgnLi9fYmFzZUx0Jyk7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5taW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICogdGhlIHZhbHVlIGlzIHJhbmtlZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDEgfSwgeyAnbic6IDIgfV07XG4gKlxuICogXy5taW5CeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICogLy8gPT4geyAnbic6IDEgfVxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5taW5CeShvYmplY3RzLCAnbicpO1xuICogLy8gPT4geyAnbic6IDEgfVxuICovXG5mdW5jdGlvbiBtaW5CeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgMiksIGJhc2VMdClcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtaW5CeTtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRpbWVzKDIsIF8ubm9vcCk7XG4gKiAvLyA9PiBbdW5kZWZpbmVkLCB1bmRlZmluZWRdXG4gKi9cbmZ1bmN0aW9uIG5vb3AoKSB7XG4gIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuXG59XG5cbm1vZHVsZS5leHBvcnRzID0gbm9vcDtcbiIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKipcbiAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IERhdGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICogfSwgXy5ub3coKSk7XG4gKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICovXG52YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiByb290LkRhdGUubm93KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5vdztcbiIsInZhciBiYXNlUGljayA9IHJlcXVpcmUoJy4vX2Jhc2VQaWNrJyksXG4gICAgZmxhdFJlc3QgPSByZXF1aXJlKCcuL19mbGF0UmVzdCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBwaWNrZWQgYG9iamVjdGAgcHJvcGVydGllcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICpcbiAqIF8ucGljayhvYmplY3QsIFsnYScsICdjJ10pO1xuICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gKi9cbnZhciBwaWNrID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBwYXRocykge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB7fSA6IGJhc2VQaWNrKG9iamVjdCwgcGF0aHMpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGljaztcbiIsInZhciBiYXNlUHJvcGVydHkgPSByZXF1aXJlKCcuL19iYXNlUHJvcGVydHknKSxcbiAgICBiYXNlUHJvcGVydHlEZWVwID0gcmVxdWlyZSgnLi9fYmFzZVByb3BlcnR5RGVlcCcpLFxuICAgIGlzS2V5ID0gcmVxdWlyZSgnLi9faXNLZXknKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW1xuICogICB7ICdhJzogeyAnYic6IDIgfSB9LFxuICogICB7ICdhJzogeyAnYic6IDEgfSB9XG4gKiBdO1xuICpcbiAqIF8ubWFwKG9iamVjdHMsIF8ucHJvcGVydHkoJ2EuYicpKTtcbiAqIC8vID0+IFsyLCAxXVxuICpcbiAqIF8ubWFwKF8uc29ydEJ5KG9iamVjdHMsIF8ucHJvcGVydHkoWydhJywgJ2InXSkpLCAnYS5iJyk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqL1xuZnVuY3Rpb24gcHJvcGVydHkocGF0aCkge1xuICByZXR1cm4gaXNLZXkocGF0aCkgPyBiYXNlUHJvcGVydHkodG9LZXkocGF0aCkpIDogYmFzZVByb3BlcnR5RGVlcChwYXRoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwcm9wZXJ0eTtcbiIsInZhciBjcmVhdGVSYW5nZSA9IHJlcXVpcmUoJy4vX2NyZWF0ZVJhbmdlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBudW1iZXJzIChwb3NpdGl2ZSBhbmQvb3IgbmVnYXRpdmUpIHByb2dyZXNzaW5nIGZyb21cbiAqIGBzdGFydGAgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBgZW5kYC4gQSBzdGVwIG9mIGAtMWAgaXMgdXNlZCBpZiBhIG5lZ2F0aXZlXG4gKiBgc3RhcnRgIGlzIHNwZWNpZmllZCB3aXRob3V0IGFuIGBlbmRgIG9yIGBzdGVwYC4gSWYgYGVuZGAgaXMgbm90IHNwZWNpZmllZCxcbiAqIGl0J3Mgc2V0IHRvIGBzdGFydGAgd2l0aCBgc3RhcnRgIHRoZW4gc2V0IHRvIGAwYC5cbiAqXG4gKiAqKk5vdGU6KiogSmF2YVNjcmlwdCBmb2xsb3dzIHRoZSBJRUVFLTc1NCBzdGFuZGFyZCBmb3IgcmVzb2x2aW5nXG4gKiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgd2hpY2ggY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICogQHNlZSBfLmluUmFuZ2UsIF8ucmFuZ2VSaWdodFxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnJhbmdlKDQpO1xuICogLy8gPT4gWzAsIDEsIDIsIDNdXG4gKlxuICogXy5yYW5nZSgtNCk7XG4gKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAqXG4gKiBfLnJhbmdlKDEsIDUpO1xuICogLy8gPT4gWzEsIDIsIDMsIDRdXG4gKlxuICogXy5yYW5nZSgwLCAyMCwgNSk7XG4gKiAvLyA9PiBbMCwgNSwgMTAsIDE1XVxuICpcbiAqIF8ucmFuZ2UoMCwgLTQsIC0xKTtcbiAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICpcbiAqIF8ucmFuZ2UoMSwgNCwgMCk7XG4gKiAvLyA9PiBbMSwgMSwgMV1cbiAqXG4gKiBfLnJhbmdlKDApO1xuICogLy8gPT4gW11cbiAqL1xudmFyIHJhbmdlID0gY3JlYXRlUmFuZ2UoKTtcblxubW9kdWxlLmV4cG9ydHMgPSByYW5nZTtcbiIsInZhciBhcnJheVJlZHVjZSA9IHJlcXVpcmUoJy4vX2FycmF5UmVkdWNlJyksXG4gICAgYmFzZUVhY2ggPSByZXF1aXJlKCcuL19iYXNlRWFjaCcpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGJhc2VSZWR1Y2UgPSByZXF1aXJlKCcuL19iYXNlUmVkdWNlJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIFJlZHVjZXMgYGNvbGxlY3Rpb25gIHRvIGEgdmFsdWUgd2hpY2ggaXMgdGhlIGFjY3VtdWxhdGVkIHJlc3VsdCBvZiBydW5uaW5nXG4gKiBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYCwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gKiBpbnZvY2F0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLiBJZiBgYWNjdW11bGF0b3JgXG4gKiBpcyBub3QgZ2l2ZW4sIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCBpcyB1c2VkIGFzIHRoZSBpbml0aWFsXG4gKiB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czpcbiAqIChhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKlxuICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gKiBgXy5yZWR1Y2VgLCBgXy5yZWR1Y2VSaWdodGAsIGFuZCBgXy50cmFuc2Zvcm1gLlxuICpcbiAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICogYGFzc2lnbmAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgaW5jbHVkZXNgLCBgbWVyZ2VgLCBgb3JkZXJCeWAsXG4gKiBhbmQgYHNvcnRCeWBcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKiBAc2VlIF8ucmVkdWNlUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogXy5yZWR1Y2UoWzEsIDJdLCBmdW5jdGlvbihzdW0sIG4pIHtcbiAqICAgcmV0dXJuIHN1bSArIG47XG4gKiB9LCAwKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnJlZHVjZSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfSwgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gKiAgIHJldHVybiByZXN1bHQ7XG4gKiB9LCB7fSk7XG4gKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKi9cbmZ1bmN0aW9uIHJlZHVjZShjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlSZWR1Y2UgOiBiYXNlUmVkdWNlLFxuICAgICAgaW5pdEFjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7XG5cbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCA0KSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgYmFzZUVhY2gpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlZHVjZTtcbiIsInZhciBiYXNlU2V0ID0gcmVxdWlyZSgnLi9fYmFzZVNldCcpO1xuXG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgYSBwb3J0aW9uIG9mIGBwYXRoYCBkb2Vzbid0IGV4aXN0LFxuICogaXQncyBjcmVhdGVkLiBBcnJheXMgYXJlIGNyZWF0ZWQgZm9yIG1pc3NpbmcgaW5kZXggcHJvcGVydGllcyB3aGlsZSBvYmplY3RzXG4gKiBhcmUgY3JlYXRlZCBmb3IgYWxsIG90aGVyIG1pc3NpbmcgcHJvcGVydGllcy4gVXNlIGBfLnNldFdpdGhgIHRvIGN1c3RvbWl6ZVxuICogYHBhdGhgIGNyZWF0aW9uLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy43LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAqXG4gKiBfLnNldChvYmplY3QsICdhWzBdLmIuYycsIDQpO1xuICogY29uc29sZS5sb2cob2JqZWN0LmFbMF0uYi5jKTtcbiAqIC8vID0+IDRcbiAqXG4gKiBfLnNldChvYmplY3QsIFsneCcsICcwJywgJ3knLCAneiddLCA1KTtcbiAqIGNvbnNvbGUubG9nKG9iamVjdC54WzBdLnkueik7XG4gKiAvLyA9PiA1XG4gKi9cbmZ1bmN0aW9uIHNldChvYmplY3QsIHBhdGgsIHZhbHVlKSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0O1xuIiwidmFyIGJhc2VLZXlzID0gcmVxdWlyZSgnLi9fYmFzZUtleXMnKSxcbiAgICBnZXRUYWcgPSByZXF1aXJlKCcuL19nZXRUYWcnKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKSxcbiAgICBpc1N0cmluZyA9IHJlcXVpcmUoJy4vaXNTdHJpbmcnKSxcbiAgICBzdHJpbmdTaXplID0gcmVxdWlyZSgnLi9fc3RyaW5nU2l6ZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XSc7XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBvZiBgY29sbGVjdGlvbmAgYnkgcmV0dXJuaW5nIGl0cyBsZW5ndGggZm9yIGFycmF5LWxpa2VcbiAqIHZhbHVlcyBvciB0aGUgbnVtYmVyIG9mIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIGZvciBvYmplY3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbGxlY3Rpb24gc2l6ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5zaXplKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5zaXplKHsgJ2EnOiAxLCAnYic6IDIgfSk7XG4gKiAvLyA9PiAyXG4gKlxuICogXy5zaXplKCdwZWJibGVzJyk7XG4gKiAvLyA9PiA3XG4gKi9cbmZ1bmN0aW9uIHNpemUoY29sbGVjdGlvbikge1xuICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgaWYgKGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pID8gc3RyaW5nU2l6ZShjb2xsZWN0aW9uKSA6IGNvbGxlY3Rpb24ubGVuZ3RoO1xuICB9XG4gIHZhciB0YWcgPSBnZXRUYWcoY29sbGVjdGlvbik7XG4gIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICByZXR1cm4gY29sbGVjdGlvbi5zaXplO1xuICB9XG4gIHJldHVybiBiYXNlS2V5cyhjb2xsZWN0aW9uKS5sZW5ndGg7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2l6ZTtcbiIsInZhciBiYXNlRmxhdHRlbiA9IHJlcXVpcmUoJy4vX2Jhc2VGbGF0dGVuJyksXG4gICAgYmFzZU9yZGVyQnkgPSByZXF1aXJlKCcuL19iYXNlT3JkZXJCeScpLFxuICAgIGJhc2VSZXN0ID0gcmVxdWlyZSgnLi9fYmFzZVJlc3QnKSxcbiAgICBpc0l0ZXJhdGVlQ2FsbCA9IHJlcXVpcmUoJy4vX2lzSXRlcmF0ZWVDYWxsJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBlbGVtZW50cywgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciBieSB0aGUgcmVzdWx0cyBvZlxuICogcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uIHRocnUgZWFjaCBpdGVyYXRlZS4gVGhpcyBtZXRob2RcbiAqIHBlcmZvcm1zIGEgc3RhYmxlIHNvcnQsIHRoYXQgaXMsIGl0IHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgc29ydCBvcmRlciBvZlxuICogZXF1YWwgZWxlbWVudHMuIFRoZSBpdGVyYXRlZXMgYXJlIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAqICBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogMzAgfSxcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzQgfVxuICogXTtcbiAqXG4gKiBfLnNvcnRCeSh1c2VycywgW2Z1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlcjsgfV0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCAzMF1dXG4gKlxuICogXy5zb3J0QnkodXNlcnMsIFsndXNlcicsICdhZ2UnXSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNF0sIFsnYmFybmV5JywgMzZdLCBbJ2ZyZWQnLCAzMF0sIFsnZnJlZCcsIDQ4XV1cbiAqL1xudmFyIHNvcnRCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlcykge1xuICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciBsZW5ndGggPSBpdGVyYXRlZXMubGVuZ3RoO1xuICBpZiAobGVuZ3RoID4gMSAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBpdGVyYXRlZXNbMF0sIGl0ZXJhdGVlc1sxXSkpIHtcbiAgICBpdGVyYXRlZXMgPSBbXTtcbiAgfSBlbHNlIGlmIChsZW5ndGggPiAyICYmIGlzSXRlcmF0ZWVDYWxsKGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdLCBpdGVyYXRlZXNbMl0pKSB7XG4gICAgaXRlcmF0ZWVzID0gW2l0ZXJhdGVlc1swXV07XG4gIH1cbiAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywgMSksIFtdKTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNvcnRCeTtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgYXJyYXlzID0gXy50aW1lcygyLCBfLnN0dWJBcnJheSk7XG4gKlxuICogY29uc29sZS5sb2coYXJyYXlzKTtcbiAqIC8vID0+IFtbXSwgW11dXG4gKlxuICogY29uc29sZS5sb2coYXJyYXlzWzBdID09PSBhcnJheXNbMV0pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gc3R1YkFycmF5KCkge1xuICByZXR1cm4gW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R1YkFycmF5O1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEzLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRpbWVzKDIsIF8uc3R1YkZhbHNlKTtcbiAqIC8vID0+IFtmYWxzZSwgZmFsc2VdXG4gKi9cbmZ1bmN0aW9uIHN0dWJGYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0dWJGYWxzZTtcbiIsInZhciB0b051bWJlciA9IHJlcXVpcmUoJy4vdG9OdW1iZXInKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMCxcbiAgICBNQVhfSU5URUdFUiA9IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4O1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9GaW5pdGUoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgfVxuICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9GaW5pdGU7XG4iLCJ2YXIgdG9GaW5pdGUgPSByZXF1aXJlKCcuL3RvRmluaXRlJyk7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvSW50ZWdlcmBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2ludGVnZXIpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9JbnRlZ2VyKDMuMik7XG4gKiAvLyA9PiAzXG4gKlxuICogXy50b0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiAwXG4gKlxuICogXy50b0ludGVnZXIoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvSW50ZWdlcignMy4yJyk7XG4gKiAvLyA9PiAzXG4gKi9cbmZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgcmVtYWluZGVyID0gcmVzdWx0ICUgMTtcblxuICByZXR1cm4gcmVzdWx0ID09PSByZXN1bHQgPyAocmVtYWluZGVyID8gcmVzdWx0IC0gcmVtYWluZGVyIDogcmVzdWx0KSA6IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9JbnRlZ2VyO1xuIiwidmFyIGJhc2VUcmltID0gcmVxdWlyZSgnLi9fYmFzZVRyaW0nKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTkFOID0gMCAvIDA7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IGJhc2VUcmltKHZhbHVlKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9OdW1iZXI7XG4iLCJ2YXIgYXJyYXlNYXAgPSByZXF1aXJlKCcuL19hcnJheU1hcCcpLFxuICAgIGNvcHlBcnJheSA9IHJlcXVpcmUoJy4vX2NvcHlBcnJheScpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKSxcbiAgICBzdHJpbmdUb1BhdGggPSByZXF1aXJlKCcuL19zdHJpbmdUb1BhdGgnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5JyksXG4gICAgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyk7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvUGF0aCgnYS5iLmMnKTtcbiAqIC8vID0+IFsnYScsICdiJywgJ2MnXVxuICpcbiAqIF8udG9QYXRoKCdhWzBdLmIuYycpO1xuICogLy8gPT4gWydhJywgJzAnLCAnYicsICdjJ11cbiAqL1xuZnVuY3Rpb24gdG9QYXRoKHZhbHVlKSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgdG9LZXkpO1xuICB9XG4gIHJldHVybiBpc1N5bWJvbCh2YWx1ZSkgPyBbdmFsdWVdIDogY29weUFycmF5KHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1BhdGg7XG4iLCJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBwbGFpbiBvYmplY3QgZmxhdHRlbmluZyBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmdcbiAqIGtleWVkIHByb3BlcnRpZXMgb2YgYHZhbHVlYCB0byBvd24gcHJvcGVydGllcyBvZiB0aGUgcGxhaW4gb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29udmVydGVkIHBsYWluIG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5hc3NpZ24oeyAnYSc6IDEgfSwgbmV3IEZvbyk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAqXG4gKiBfLmFzc2lnbih7ICdhJzogMSB9LCBfLnRvUGxhaW5PYmplY3QobmV3IEZvbykpO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH1cbiAqL1xuZnVuY3Rpb24gdG9QbGFpbk9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gY29weU9iamVjdCh2YWx1ZSwga2V5c0luKHZhbHVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9QbGFpbk9iamVjdDtcbiIsInZhciBiYXNlVG9TdHJpbmcgPSByZXF1aXJlKCcuL19iYXNlVG9TdHJpbmcnKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nLiBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgZm9yIGBudWxsYFxuICogYW5kIGB1bmRlZmluZWRgIHZhbHVlcy4gVGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvU3RyaW5nKG51bGwpO1xuICogLy8gPT4gJydcbiAqXG4gKiBfLnRvU3RyaW5nKC0wKTtcbiAqIC8vID0+ICctMCdcbiAqXG4gKiBfLnRvU3RyaW5nKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiAnMSwyLDMnXG4gKi9cbmZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiBiYXNlVG9TdHJpbmcodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvU3RyaW5nO1xuIiwidmFyIGFycmF5RWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5RWFjaCcpLFxuICAgIGJhc2VDcmVhdGUgPSByZXF1aXJlKCcuL19iYXNlQ3JlYXRlJyksXG4gICAgYmFzZUZvck93biA9IHJlcXVpcmUoJy4vX2Jhc2VGb3JPd24nKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKlxuICogQW4gYWx0ZXJuYXRpdmUgdG8gYF8ucmVkdWNlYDsgdGhpcyBtZXRob2QgdHJhbnNmb3JtcyBgb2JqZWN0YCB0byBhIG5ld1xuICogYGFjY3VtdWxhdG9yYCBvYmplY3Qgd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIGVhY2ggb2YgaXRzIG93blxuICogZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyB0aHJ1IGBpdGVyYXRlZWAsIHdpdGggZWFjaCBpbnZvY2F0aW9uXG4gKiBwb3RlbnRpYWxseSBtdXRhdGluZyB0aGUgYGFjY3VtdWxhdG9yYCBvYmplY3QuIElmIGBhY2N1bXVsYXRvcmAgaXMgbm90XG4gKiBwcm92aWRlZCwgYSBuZXcgb2JqZWN0IHdpdGggdGhlIHNhbWUgYFtbUHJvdG90eXBlXV1gIHdpbGwgYmUgdXNlZC4gVGhlXG4gKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6IChhY2N1bXVsYXRvciwgdmFsdWUsIGtleSwgb2JqZWN0KS5cbiAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDEuMy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGN1c3RvbSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50cmFuc2Zvcm0oWzIsIDMsIDRdLCBmdW5jdGlvbihyZXN1bHQsIG4pIHtcbiAqICAgcmVzdWx0LnB1c2gobiAqPSBuKTtcbiAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gKiB9LCBbXSk7XG4gKiAvLyA9PiBbNCwgOV1cbiAqXG4gKiBfLnRyYW5zZm9ybSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfSwgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gKiB9LCB7fSk7XG4gKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9XG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybShvYmplY3QsIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICBpc0Fyckxpa2UgPSBpc0FyciB8fCBpc0J1ZmZlcihvYmplY3QpIHx8IGlzVHlwZWRBcnJheShvYmplY3QpO1xuXG4gIGl0ZXJhdGVlID0gYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCA0KTtcbiAgaWYgKGFjY3VtdWxhdG9yID09IG51bGwpIHtcbiAgICB2YXIgQ3RvciA9IG9iamVjdCAmJiBvYmplY3QuY29uc3RydWN0b3I7XG4gICAgaWYgKGlzQXJyTGlrZSkge1xuICAgICAgYWNjdW11bGF0b3IgPSBpc0FyciA/IG5ldyBDdG9yIDogW107XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaXNGdW5jdGlvbihDdG9yKSA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpIDoge307XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgYWNjdW11bGF0b3IgPSB7fTtcbiAgICB9XG4gIH1cbiAgKGlzQXJyTGlrZSA/IGFycmF5RWFjaCA6IGJhc2VGb3JPd24pKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgICByZXR1cm4gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgb2JqZWN0KTtcbiAgfSk7XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0cmFuc2Zvcm07XG4iLCJ2YXIgYmFzZUZsYXR0ZW4gPSByZXF1aXJlKCcuL19iYXNlRmxhdHRlbicpLFxuICAgIGJhc2VSZXN0ID0gcmVxdWlyZSgnLi9fYmFzZVJlc3QnKSxcbiAgICBiYXNlVW5pcSA9IHJlcXVpcmUoJy4vX2Jhc2VVbmlxJyksXG4gICAgaXNBcnJheUxpa2VPYmplY3QgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlT2JqZWN0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVzLCBpbiBvcmRlciwgZnJvbSBhbGwgZ2l2ZW4gYXJyYXlzIHVzaW5nXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnVuaW9uKFsyXSwgWzEsIDJdKTtcbiAqIC8vID0+IFsyLCAxXVxuICovXG52YXIgdW5pb24gPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpKTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHVuaW9uO1xuIiwidmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi90b1N0cmluZycpO1xuXG4vKiogVXNlZCB0byBnZW5lcmF0ZSB1bmlxdWUgSURzLiAqL1xudmFyIGlkQ291bnRlciA9IDA7XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgdW5pcXVlIElELiBJZiBgcHJlZml4YCBpcyBnaXZlbiwgdGhlIElEIGlzIGFwcGVuZGVkIHRvIGl0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0ge3N0cmluZ30gW3ByZWZpeD0nJ10gVGhlIHZhbHVlIHRvIHByZWZpeCB0aGUgSUQgd2l0aC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuaXF1ZSBJRC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy51bmlxdWVJZCgnY29udGFjdF8nKTtcbiAqIC8vID0+ICdjb250YWN0XzEwNCdcbiAqXG4gKiBfLnVuaXF1ZUlkKCk7XG4gKiAvLyA9PiAnMTA1J1xuICovXG5mdW5jdGlvbiB1bmlxdWVJZChwcmVmaXgpIHtcbiAgdmFyIGlkID0gKytpZENvdW50ZXI7XG4gIHJldHVybiB0b1N0cmluZyhwcmVmaXgpICsgaWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdW5pcXVlSWQ7XG4iLCJ2YXIgYmFzZVZhbHVlcyA9IHJlcXVpcmUoJy4vX2Jhc2VWYWx1ZXMnKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy52YWx1ZXMobmV3IEZvbyk7XG4gKiAvLyA9PiBbMSwgMl0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiBfLnZhbHVlcygnaGknKTtcbiAqIC8vID0+IFsnaCcsICdpJ11cbiAqL1xuZnVuY3Rpb24gdmFsdWVzKG9iamVjdCkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VWYWx1ZXMob2JqZWN0LCBrZXlzKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHZhbHVlcztcbiIsInZhciBhc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnblZhbHVlJyksXG4gICAgYmFzZVppcE9iamVjdCA9IHJlcXVpcmUoJy4vX2Jhc2VaaXBPYmplY3QnKTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZyb21QYWlyc2AgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyB0d28gYXJyYXlzLFxuICogb25lIG9mIHByb3BlcnR5IGlkZW50aWZpZXJzIGFuZCBvbmUgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjQuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBbcHJvcHM9W11dIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXM9W11dIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnppcE9iamVjdChbJ2EnLCAnYiddLCBbMSwgMl0pO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gKi9cbmZ1bmN0aW9uIHppcE9iamVjdChwcm9wcywgdmFsdWVzKSB7XG4gIHJldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzIHx8IFtdLCB2YWx1ZXMgfHwgW10sIGFzc2lnblZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB6aXBPYmplY3Q7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlc1NlY3JldDtcbiIsImV4cG9ydCBmdW5jdGlvbiB5dXYycmdiKHl1dikge1xuICB2YXIgeSA9IHl1dlswXSxcbiAgICAgIHUgPSB5dXZbMV0sXG4gICAgICB2ID0geXV2WzJdO1xuICB2YXIgciwgZywgYjtcbiAgciA9IHkgKiAxICsgdSAqIDAgKyB2ICogMS4xMzk4MztcbiAgZyA9IHkgKiAxICsgdSAqIC0wLjM5NDY1ICsgdiAqIC0wLjU4MDY7XG4gIGIgPSB5ICogMSArIHUgKiAyLjAyMzExICsgdiAqIDA7XG4gIHIgPSBNYXRoLm1pbihNYXRoLm1heCgwLCByKSwgMSk7XG4gIGcgPSBNYXRoLm1pbihNYXRoLm1heCgwLCBnKSwgMSk7XG4gIGIgPSBNYXRoLm1pbihNYXRoLm1heCgwLCBiKSwgMSk7XG4gIHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59XG5leHBvcnQgZnVuY3Rpb24gcmdiMnl1dihyZ2IpIHtcbiAgdmFyIHIgPSByZ2JbMF0gLyAyNTUsXG4gICAgICBnID0gcmdiWzFdIC8gMjU1LFxuICAgICAgYiA9IHJnYlsyXSAvIDI1NTtcbiAgdmFyIHkgPSByICogMC4yOTkgKyBnICogMC41ODcgKyBiICogMC4xMTQ7XG4gIHZhciB1ID0gciAqIC0wLjE0NzEzICsgZyAqIC0wLjI4ODg2ICsgYiAqIDAuNDM2O1xuICB2YXIgdiA9IHIgKiAwLjYxNSArIGcgKiAtMC41MTQ5OSArIGIgKiAtMC4xMDAwMTtcbiAgcmV0dXJuIFt5LCB1LCB2XTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCAqIGFzIGJhc2UxNiBmcm9tICdiYXNlMTYnO1xuaW1wb3J0IENvbG9yIGZyb20gJ2NvbG9yJztcbmltcG9ydCBjdXJyeSBmcm9tICdsb2Rhc2guY3VycnknO1xuaW1wb3J0IHsgeXV2MnJnYiwgcmdiMnl1diB9IGZyb20gJy4vY29sb3JDb252ZXJ0ZXJzJztcbnZhciBERUZBVUxUX0JBU0UxNiA9IGJhc2UxNi5kZWZhdWx0O1xudmFyIEJBU0UxNl9LRVlTID0gT2JqZWN0LmtleXMoREVGQVVMVF9CQVNFMTYpOyAvLyB3ZSBuZWVkIGEgY29ycmVjdGluZyBmYWN0b3IsIHNvIHRoYXQgYSBkYXJrLCBidXQgbm90IGJsYWNrIGJhY2tncm91bmQgY29sb3Jcbi8vIGNvbnZlcnRzIHRvIGJyaWdodCBlbm91Z2ggaW52ZXJzZWQgY29sb3JcblxudmFyIGZsaXAgPSBmdW5jdGlvbiBmbGlwKHgpIHtcbiAgcmV0dXJuIHggPCAwLjI1ID8gMSA6IHggPCAwLjUgPyAwLjkgLSB4IDogMS4xIC0geDtcbn07XG5cbnZhciBpbnZlcnRDb2xvciA9IGZ1bmN0aW9uIGludmVydENvbG9yKGhleFN0cmluZykge1xuICB2YXIgY29sb3IgPSBDb2xvcihoZXhTdHJpbmcpO1xuXG4gIHZhciBfcmdiMnl1diA9IHJnYjJ5dXYoY29sb3IuYXJyYXkoKSksXG4gICAgICBfcmdiMnl1djIgPSBfc2xpY2VkVG9BcnJheShfcmdiMnl1diwgMyksXG4gICAgICB5ID0gX3JnYjJ5dXYyWzBdLFxuICAgICAgdSA9IF9yZ2IyeXV2MlsxXSxcbiAgICAgIHYgPSBfcmdiMnl1djJbMl07XG5cbiAgdmFyIGZsaXBwZWRZdXYgPSBbZmxpcCh5KSwgdSwgdl07XG4gIHZhciByZ2IgPSB5dXYycmdiKGZsaXBwZWRZdXYpO1xuICByZXR1cm4gQ29sb3IucmdiKHJnYikuaGV4KCk7XG59O1xuXG52YXIgbWVyZ2VyID0gZnVuY3Rpb24gbWVyZ2VyKHN0eWxpbmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChwcmV2U3R5bGluZykge1xuICAgIHJldHVybiB7XG4gICAgICBjbGFzc05hbWU6IFtwcmV2U3R5bGluZy5jbGFzc05hbWUsIHN0eWxpbmcuY2xhc3NOYW1lXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpLFxuICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0eWxpbmcuc3R5bGUgfHwge30pLCBzdHlsaW5nLnN0eWxlIHx8IHt9KVxuICAgIH07XG4gIH07XG59O1xuXG52YXIgbWVyZ2VTdHlsaW5nID0gZnVuY3Rpb24gbWVyZ2VTdHlsaW5nKGN1c3RvbVN0eWxpbmcsIGRlZmF1bHRTdHlsaW5nKSB7XG4gIGlmIChjdXN0b21TdHlsaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGVmYXVsdFN0eWxpbmc7XG4gIH1cblxuICBpZiAoZGVmYXVsdFN0eWxpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjdXN0b21TdHlsaW5nO1xuICB9XG5cbiAgdmFyIGN1c3RvbVR5cGUgPSBfdHlwZW9mKGN1c3RvbVN0eWxpbmcpO1xuXG4gIHZhciBkZWZhdWx0VHlwZSA9IF90eXBlb2YoZGVmYXVsdFN0eWxpbmcpO1xuXG4gIHN3aXRjaCAoY3VzdG9tVHlwZSkge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBzd2l0Y2ggKGRlZmF1bHRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgcmV0dXJuIFtkZWZhdWx0U3R5bGluZywgY3VzdG9tU3R5bGluZ10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcblxuICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgIHJldHVybiBtZXJnZXIoe1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBjdXN0b21TdHlsaW5nLFxuICAgICAgICAgICAgc3R5bGU6IGRlZmF1bHRTdHlsaW5nXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoc3R5bGluZykge1xuICAgICAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG1lcmdlcih7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogY3VzdG9tU3R5bGluZ1xuICAgICAgICAgICAgfSkoZGVmYXVsdFN0eWxpbmcuYXBwbHkodm9pZCAwLCBbc3R5bGluZ10uY29uY2F0KGFyZ3MpKSk7XG4gICAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgc3dpdGNoIChkZWZhdWx0VHlwZSkge1xuICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgIHJldHVybiBtZXJnZXIoe1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBkZWZhdWx0U3R5bGluZyxcbiAgICAgICAgICAgIHN0eWxlOiBjdXN0b21TdHlsaW5nXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBkZWZhdWx0U3R5bGluZyksIGN1c3RvbVN0eWxpbmcpO1xuXG4gICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHN0eWxpbmcpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBtZXJnZXIoe1xuICAgICAgICAgICAgICBzdHlsZTogY3VzdG9tU3R5bGluZ1xuICAgICAgICAgICAgfSkoZGVmYXVsdFN0eWxpbmcuYXBwbHkodm9pZCAwLCBbc3R5bGluZ10uY29uY2F0KGFyZ3MpKSk7XG4gICAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICBzd2l0Y2ggKGRlZmF1bHRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzdHlsaW5nKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjMgPiAxID8gX2xlbjMgLSAxIDogMCksIF9rZXkzID0gMTsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgICAgICAgICAgICBhcmdzW19rZXkzIC0gMV0gPSBhcmd1bWVudHNbX2tleTNdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY3VzdG9tU3R5bGluZy5hcHBseSh2b2lkIDAsIFttZXJnZXIoc3R5bGluZykoe1xuICAgICAgICAgICAgICBjbGFzc05hbWU6IGRlZmF1bHRTdHlsaW5nXG4gICAgICAgICAgICB9KV0uY29uY2F0KGFyZ3MpKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzdHlsaW5nKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjQgPiAxID8gX2xlbjQgLSAxIDogMCksIF9rZXk0ID0gMTsgX2tleTQgPCBfbGVuNDsgX2tleTQrKykge1xuICAgICAgICAgICAgICBhcmdzW19rZXk0IC0gMV0gPSBhcmd1bWVudHNbX2tleTRdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY3VzdG9tU3R5bGluZy5hcHBseSh2b2lkIDAsIFttZXJnZXIoc3R5bGluZykoe1xuICAgICAgICAgICAgICBzdHlsZTogZGVmYXVsdFN0eWxpbmdcbiAgICAgICAgICAgIH0pXS5jb25jYXQoYXJncykpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoc3R5bGluZykge1xuICAgICAgICAgICAgZm9yICh2YXIgX2xlbjUgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW41ID4gMSA/IF9sZW41IC0gMSA6IDApLCBfa2V5NSA9IDE7IF9rZXk1IDwgX2xlbjU7IF9rZXk1KyspIHtcbiAgICAgICAgICAgICAgYXJnc1tfa2V5NSAtIDFdID0gYXJndW1lbnRzW19rZXk1XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGN1c3RvbVN0eWxpbmcuYXBwbHkodm9pZCAwLCBbZGVmYXVsdFN0eWxpbmcuYXBwbHkodm9pZCAwLCBbc3R5bGluZ10uY29uY2F0KGFyZ3MpKV0uY29uY2F0KGFyZ3MpKTtcbiAgICAgICAgICB9O1xuICAgICAgfVxuXG4gIH1cbn07XG5cbnZhciBtZXJnZVN0eWxpbmdzID0gZnVuY3Rpb24gbWVyZ2VTdHlsaW5ncyhjdXN0b21TdHlsaW5ncywgZGVmYXVsdFN0eWxpbmdzKSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGVmYXVsdFN0eWxpbmdzKTtcblxuICBmb3IgKHZhciBrZXkgaW4gY3VzdG9tU3R5bGluZ3MpIHtcbiAgICBpZiAoa2V5cy5pbmRleE9mKGtleSkgPT09IC0xKSBrZXlzLnB1c2goa2V5KTtcbiAgfVxuXG4gIHJldHVybiBrZXlzLnJlZHVjZShmdW5jdGlvbiAobWVyZ2VkU3R5bGluZywga2V5KSB7XG4gICAgcmV0dXJuIG1lcmdlZFN0eWxpbmdba2V5XSA9IG1lcmdlU3R5bGluZyhjdXN0b21TdHlsaW5nc1trZXldLCBkZWZhdWx0U3R5bGluZ3Nba2V5XSksIG1lcmdlZFN0eWxpbmc7XG4gIH0sIHt9KTtcbn07XG5cbnZhciBnZXRTdHlsaW5nQnlLZXlzID0gZnVuY3Rpb24gZ2V0U3R5bGluZ0J5S2V5cyhtZXJnZWRTdHlsaW5nLCBrZXlzKSB7XG4gIGZvciAodmFyIF9sZW42ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuNiA+IDIgPyBfbGVuNiAtIDIgOiAwKSwgX2tleTYgPSAyOyBfa2V5NiA8IF9sZW42OyBfa2V5NisrKSB7XG4gICAgYXJnc1tfa2V5NiAtIDJdID0gYXJndW1lbnRzW19rZXk2XTtcbiAgfVxuXG4gIGlmIChrZXlzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG1lcmdlZFN0eWxpbmc7XG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkoa2V5cykpIHtcbiAgICBrZXlzID0gW2tleXNdO1xuICB9XG5cbiAgdmFyIHN0eWxlcyA9IGtleXMubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gbWVyZ2VkU3R5bGluZ1trZXldO1xuICB9KS5maWx0ZXIoQm9vbGVhbik7XG4gIHZhciBwcm9wcyA9IHN0eWxlcy5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwgcykge1xuICAgIGlmICh0eXBlb2YgcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG9iai5jbGFzc05hbWUgPSBbb2JqLmNsYXNzTmFtZSwgc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICB9IGVsc2UgaWYgKF90eXBlb2YocykgPT09ICdvYmplY3QnKSB7XG4gICAgICBvYmouc3R5bGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9iai5zdHlsZSksIHMpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9iaiA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb2JqKSwgcy5hcHBseSh2b2lkIDAsIFtvYmpdLmNvbmNhdChhcmdzKSkpO1xuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG4gIH0sIHtcbiAgICBjbGFzc05hbWU6ICcnLFxuICAgIHN0eWxlOiB7fVxuICB9KTtcblxuICBpZiAoIXByb3BzLmNsYXNzTmFtZSkge1xuICAgIGRlbGV0ZSBwcm9wcy5jbGFzc05hbWU7XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMocHJvcHMuc3R5bGUpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBwcm9wcy5zdHlsZTtcbiAgfVxuXG4gIHJldHVybiBwcm9wcztcbn07XG5cbmV4cG9ydCB2YXIgaW52ZXJ0QmFzZTE2VGhlbWUgPSBmdW5jdGlvbiBpbnZlcnRCYXNlMTZUaGVtZShiYXNlMTZUaGVtZSkge1xuICByZXR1cm4gT2JqZWN0LmtleXMoYmFzZTE2VGhlbWUpLnJlZHVjZShmdW5jdGlvbiAodCwga2V5KSB7XG4gICAgcmV0dXJuIHRba2V5XSA9IC9eYmFzZS8udGVzdChrZXkpID8gaW52ZXJ0Q29sb3IoYmFzZTE2VGhlbWVba2V5XSkgOiBrZXkgPT09ICdzY2hlbWUnID8gYmFzZTE2VGhlbWVba2V5XSArICc6aW52ZXJ0ZWQnIDogYmFzZTE2VGhlbWVba2V5XSwgdDtcbiAgfSwge30pO1xufTtcbmV4cG9ydCB2YXIgY3JlYXRlU3R5bGluZyA9IGN1cnJ5KGZ1bmN0aW9uIChnZXRTdHlsaW5nRnJvbUJhc2UxNikge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIHZhciB0aGVtZU9yU3R5bGluZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gIHZhciBfb3B0aW9ucyRkZWZhdWx0QmFzZSA9IG9wdGlvbnMuZGVmYXVsdEJhc2UxNixcbiAgICAgIGRlZmF1bHRCYXNlMTYgPSBfb3B0aW9ucyRkZWZhdWx0QmFzZSA9PT0gdm9pZCAwID8gREVGQVVMVF9CQVNFMTYgOiBfb3B0aW9ucyRkZWZhdWx0QmFzZSxcbiAgICAgIF9vcHRpb25zJGJhc2UxNlRoZW1lcyA9IG9wdGlvbnMuYmFzZTE2VGhlbWVzLFxuICAgICAgYmFzZTE2VGhlbWVzID0gX29wdGlvbnMkYmFzZTE2VGhlbWVzID09PSB2b2lkIDAgPyBudWxsIDogX29wdGlvbnMkYmFzZTE2VGhlbWVzO1xuICB2YXIgYmFzZTE2VGhlbWUgPSBnZXRCYXNlMTZUaGVtZSh0aGVtZU9yU3R5bGluZywgYmFzZTE2VGhlbWVzKTtcblxuICBpZiAoYmFzZTE2VGhlbWUpIHtcbiAgICB0aGVtZU9yU3R5bGluZyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYmFzZTE2VGhlbWUpLCB0aGVtZU9yU3R5bGluZyk7XG4gIH1cblxuICB2YXIgdGhlbWUgPSBCQVNFMTZfS0VZUy5yZWR1Y2UoZnVuY3Rpb24gKHQsIGtleSkge1xuICAgIHJldHVybiB0W2tleV0gPSB0aGVtZU9yU3R5bGluZ1trZXldIHx8IGRlZmF1bHRCYXNlMTZba2V5XSwgdDtcbiAgfSwge30pO1xuICB2YXIgY3VzdG9tU3R5bGluZyA9IE9iamVjdC5rZXlzKHRoZW1lT3JTdHlsaW5nKS5yZWR1Y2UoZnVuY3Rpb24gKHMsIGtleSkge1xuICAgIHJldHVybiBCQVNFMTZfS0VZUy5pbmRleE9mKGtleSkgPT09IC0xID8gKHNba2V5XSA9IHRoZW1lT3JTdHlsaW5nW2tleV0sIHMpIDogcztcbiAgfSwge30pO1xuICB2YXIgZGVmYXVsdFN0eWxpbmcgPSBnZXRTdHlsaW5nRnJvbUJhc2UxNih0aGVtZSk7XG4gIHZhciBtZXJnZWRTdHlsaW5nID0gbWVyZ2VTdHlsaW5ncyhjdXN0b21TdHlsaW5nLCBkZWZhdWx0U3R5bGluZyk7XG5cbiAgZm9yICh2YXIgX2xlbjcgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW43ID4gMyA/IF9sZW43IC0gMyA6IDApLCBfa2V5NyA9IDM7IF9rZXk3IDwgX2xlbjc7IF9rZXk3KyspIHtcbiAgICBhcmdzW19rZXk3IC0gM10gPSBhcmd1bWVudHNbX2tleTddO1xuICB9XG5cbiAgcmV0dXJuIGN1cnJ5KGdldFN0eWxpbmdCeUtleXMsIDIpLmFwcGx5KHZvaWQgMCwgW21lcmdlZFN0eWxpbmddLmNvbmNhdChhcmdzKSk7XG59LCAzKTtcblxudmFyIGlzU3R5bGluZ0NvbmZpZyA9IGZ1bmN0aW9uIGlzU3R5bGluZ0NvbmZpZyh0aGVtZSkge1xuICByZXR1cm4gISF0aGVtZS5leHRlbmQ7XG59O1xuXG5leHBvcnQgdmFyIGdldEJhc2UxNlRoZW1lID0gZnVuY3Rpb24gZ2V0QmFzZTE2VGhlbWUodGhlbWUsIGJhc2UxNlRoZW1lcykge1xuICBpZiAodGhlbWUgJiYgaXNTdHlsaW5nQ29uZmlnKHRoZW1lKSAmJiB0aGVtZS5leHRlbmQpIHtcbiAgICB0aGVtZSA9IHRoZW1lLmV4dGVuZDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdGhlbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIF90aGVtZSRzcGxpdCA9IHRoZW1lLnNwbGl0KCc6JyksXG4gICAgICAgIF90aGVtZSRzcGxpdDIgPSBfc2xpY2VkVG9BcnJheShfdGhlbWUkc3BsaXQsIDIpLFxuICAgICAgICBfdGhlbWVOYW1lID0gX3RoZW1lJHNwbGl0MlswXSxcbiAgICAgICAgbW9kaWZpZXIgPSBfdGhlbWUkc3BsaXQyWzFdO1xuXG4gICAgaWYgKGJhc2UxNlRoZW1lcykge1xuICAgICAgdGhlbWUgPSBiYXNlMTZUaGVtZXNbX3RoZW1lTmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoZW1lID0gYmFzZTE2W190aGVtZU5hbWVdO1xuICAgIH1cblxuICAgIGlmIChtb2RpZmllciA9PT0gJ2ludmVydGVkJykge1xuICAgICAgdGhlbWUgPSBpbnZlcnRCYXNlMTZUaGVtZSh0aGVtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoZW1lICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGVtZSwgJ2Jhc2UwMCcpID8gdGhlbWUgOiB1bmRlZmluZWQ7XG59O1xuZXhwb3J0IHZhciBpbnZlcnRUaGVtZSA9IGZ1bmN0aW9uIGludmVydFRoZW1lKHRoZW1lKSB7XG4gIGlmICh0eXBlb2YgdGhlbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KHRoZW1lLCBcIjppbnZlcnRlZFwiKTtcbiAgfVxuXG4gIGlmICh0aGVtZSAmJiBpc1N0eWxpbmdDb25maWcodGhlbWUpICYmIHRoZW1lLmV4dGVuZCkge1xuICAgIGlmICh0eXBlb2YgdGhlbWUuZXh0ZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhlbWUpLCB7fSwge1xuICAgICAgICBleHRlbmQ6IFwiXCIuY29uY2F0KHRoZW1lLmV4dGVuZCwgXCI6aW52ZXJ0ZWRcIilcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRoZW1lKSwge30sIHtcbiAgICAgIGV4dGVuZDogaW52ZXJ0QmFzZTE2VGhlbWUodGhlbWUuZXh0ZW5kKVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHRoZW1lKSB7XG4gICAgcmV0dXJuIGludmVydEJhc2UxNlRoZW1lKHRoZW1lKTtcbiAgfVxuXG4gIHJldHVybiB0aGVtZTtcbn07XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJzsiLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE2LjEzLjFcbiAqIHJlYWN0LWlzLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgaGFzU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yO1xudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSA6IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpIDogMHhlYWNhO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpIDogMHhlYWNiO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpIDogMHhlYWNjO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpIDogMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpIDogMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKSA6IDB4ZWFjZTsgLy8gVE9ETzogV2UgZG9uJ3QgdXNlIEFzeW5jTW9kZSBvciBDb25jdXJyZW50TW9kZSBhbnltb3JlLiBUaGV5IHdlcmUgdGVtcG9yYXJ5XG4vLyAodW5zdGFibGUpIEFQSXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZC4gQ2FuIHdlIHJlbW92ZSB0aGUgc3ltYm9scz9cblxudmFyIFJFQUNUX0FTWU5DX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmFzeW5jX21vZGUnKSA6IDB4ZWFjZjtcbnZhciBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbmN1cnJlbnRfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpIDogMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpIDogMHhlYWQxO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKSA6IDB4ZWFkODtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJykgOiAweGVhZDM7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QubGF6eScpIDogMHhlYWQ0O1xudmFyIFJFQUNUX0JMT0NLX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5ibG9jaycpIDogMHhlYWQ5O1xudmFyIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpIDogMHhlYWQ1O1xudmFyIFJFQUNUX1JFU1BPTkRFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucmVzcG9uZGVyJykgOiAweGVhZDY7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnNjb3BlJykgOiAweGVhZDc7XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgfHwgLy8gTm90ZTogaXRzIHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIGlmIGl0J3MgYSBwb2x5ZmlsbC5cbiAgdHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1JFU1BPTkRFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1NDT1BFX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQkxPQ0tfVFlQRSk7XG59XG5cbmZ1bmN0aW9uIHR5cGVPZihvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcblxuICAgIHN3aXRjaCAoJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICB2YXIgdHlwZSA9IG9iamVjdC50eXBlO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyICQkdHlwZW9mVHlwZSA9IHR5cGUgJiYgdHlwZS4kJHR5cGVvZjtcblxuICAgICAgICAgICAgc3dpdGNoICgkJHR5cGVvZlR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mVHlwZTtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufSAvLyBBc3luY01vZGUgaXMgZGVwcmVjYXRlZCBhbG9uZyB3aXRoIGlzQXN5bmNNb2RlXG5cbnZhciBBc3luY01vZGUgPSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG52YXIgQ29uY3VycmVudE1vZGUgPSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbnZhciBDb250ZXh0Q29uc3VtZXIgPSBSRUFDVF9DT05URVhUX1RZUEU7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbnZhciBFbGVtZW50ID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xudmFyIEZvcndhcmRSZWYgPSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xudmFyIEZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbnZhciBMYXp5ID0gUkVBQ1RfTEFaWV9UWVBFO1xudmFyIE1lbW8gPSBSRUFDVF9NRU1PX1RZUEU7XG52YXIgUG9ydGFsID0gUkVBQ1RfUE9SVEFMX1RZUEU7XG52YXIgUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xudmFyIFN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xudmFyIFN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IGZhbHNlOyAvLyBBc3luY01vZGUgc2hvdWxkIGJlIGRlcHJlY2F0ZWRcblxuZnVuY3Rpb24gaXNBc3luY01vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNBc3luY01vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTcrLiBVcGRhdGUgeW91ciBjb2RlIHRvIHVzZSAnICsgJ1JlYWN0SXMuaXNDb25jdXJyZW50TW9kZSgpIGluc3RlYWQuIEl0IGhhcyB0aGUgZXhhY3Qgc2FtZSBBUEkuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB8fCB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQVNZTkNfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dENvbnN1bWVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlRFWFRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST1ZJREVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZvcndhcmRSZWYob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRnJhZ21lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTGF6eShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9MQVpZX1RZUEU7XG59XG5mdW5jdGlvbiBpc01lbW8ob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTUVNT19UWVBFO1xufVxuZnVuY3Rpb24gaXNQb3J0YWwob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUE9SVEFMX1RZUEU7XG59XG5mdW5jdGlvbiBpc1Byb2ZpbGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N0cmljdE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2Uob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbn1cblxuZXhwb3J0cy5Bc3luY01vZGUgPSBBc3luY01vZGU7XG5leHBvcnRzLkNvbmN1cnJlbnRNb2RlID0gQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLkNvbnRleHRDb25zdW1lciA9IENvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuQ29udGV4dFByb3ZpZGVyID0gQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5FbGVtZW50ID0gRWxlbWVudDtcbmV4cG9ydHMuRm9yd2FyZFJlZiA9IEZvcndhcmRSZWY7XG5leHBvcnRzLkZyYWdtZW50ID0gRnJhZ21lbnQ7XG5leHBvcnRzLkxhenkgPSBMYXp5O1xuZXhwb3J0cy5NZW1vID0gTWVtbztcbmV4cG9ydHMuUG9ydGFsID0gUG9ydGFsO1xuZXhwb3J0cy5Qcm9maWxlciA9IFByb2ZpbGVyO1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gU3RyaWN0TW9kZTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBTdXNwZW5zZTtcbmV4cG9ydHMuaXNBc3luY01vZGUgPSBpc0FzeW5jTW9kZTtcbmV4cG9ydHMuaXNDb25jdXJyZW50TW9kZSA9IGlzQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gaXNDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gaXNDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbmV4cG9ydHMuaXNGb3J3YXJkUmVmID0gaXNGb3J3YXJkUmVmO1xuZXhwb3J0cy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDtcbmV4cG9ydHMuaXNMYXp5ID0gaXNMYXp5O1xuZXhwb3J0cy5pc01lbW8gPSBpc01lbW87XG5leHBvcnRzLmlzUG9ydGFsID0gaXNQb3J0YWw7XG5leHBvcnRzLmlzUHJvZmlsZXIgPSBpc1Byb2ZpbGVyO1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBpc1N0cmljdE1vZGU7XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBpc1N1c3BlbnNlO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGU7XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IEpTT05BcnJvdyBmcm9tICcuL0pTT05BcnJvdyc7XG5cbnZhciBJdGVtUmFuZ2UgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEl0ZW1SYW5nZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihJdGVtUmFuZ2UpO1xuXG4gIGZ1bmN0aW9uIEl0ZW1SYW5nZShwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJdGVtUmFuZ2UpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlQ2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBleHBhbmRlZDogIV90aGlzLnN0YXRlLmV4cGFuZGVkXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgZXhwYW5kZWQ6IGZhbHNlXG4gICAgfTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoSXRlbVJhbmdlLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBzdHlsaW5nID0gX3RoaXMkcHJvcHMuc3R5bGluZyxcbiAgICAgICAgICBmcm9tID0gX3RoaXMkcHJvcHMuZnJvbSxcbiAgICAgICAgICB0byA9IF90aGlzJHByb3BzLnRvLFxuICAgICAgICAgIHJlbmRlckNoaWxkTm9kZXMgPSBfdGhpcyRwcm9wcy5yZW5kZXJDaGlsZE5vZGVzLFxuICAgICAgICAgIG5vZGVUeXBlID0gX3RoaXMkcHJvcHMubm9kZVR5cGU7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZS5leHBhbmRlZCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHN0eWxpbmcoJ2l0ZW1SYW5nZScsIHRoaXMuc3RhdGUuZXhwYW5kZWQpLCByZW5kZXJDaGlsZE5vZGVzKHRoaXMucHJvcHMsIGZyb20sIHRvKSkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7fSwgc3R5bGluZygnaXRlbVJhbmdlJywgdGhpcy5zdGF0ZS5leHBhbmRlZCksIHtcbiAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVDbGlja1xuICAgICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05BcnJvdywge1xuICAgICAgICBub2RlVHlwZTogbm9kZVR5cGUsXG4gICAgICAgIHN0eWxpbmc6IHN0eWxpbmcsXG4gICAgICAgIGV4cGFuZGVkOiBmYWxzZSxcbiAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVDbGljayxcbiAgICAgICAgYXJyb3dTdHlsZTogXCJkb3VibGVcIlxuICAgICAgfSksIFwiXCIuY29uY2F0KGZyb20sIFwiIC4uLiBcIikuY29uY2F0KHRvKSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEl0ZW1SYW5nZTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuX2RlZmluZVByb3BlcnR5KEl0ZW1SYW5nZSwgXCJwcm9wVHlwZXNcIiwge1xuICBzdHlsaW5nOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBmcm9tOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHRvOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHJlbmRlckNoaWxkTm9kZXM6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIG5vZGVUeXBlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWRcbn0pO1xuXG5leHBvcnQgeyBJdGVtUmFuZ2UgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiZGF0YVwiXTtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IEpTT05OZXN0ZWROb2RlIGZyb20gJy4vSlNPTk5lc3RlZE5vZGUnO1xuXG4vLyBSZXR1cm5zIHRoZSBcIm4gSXRlbXNcIiBzdHJpbmcgZm9yIHRoaXMgbm9kZSxcbi8vIGdlbmVyYXRpbmcgYW5kIGNhY2hpbmcgaXQgaWYgaXQgaGFzbid0IGJlZW4gY3JlYXRlZCB5ZXQuXG5mdW5jdGlvbiBjcmVhdGVJdGVtU3RyaW5nKGRhdGEpIHtcbiAgcmV0dXJuIFwiXCIuY29uY2F0KGRhdGEubGVuZ3RoLCBcIiBcIikuY29uY2F0KGRhdGEubGVuZ3RoICE9PSAxID8gJ2l0ZW1zJyA6ICdpdGVtJyk7XG59XG5cbi8vIENvbmZpZ3VyZXMgPEpTT05OZXN0ZWROb2RlPiB0byByZW5kZXIgYW4gQXJyYXlcbnZhciBKU09OQXJyYXlOb2RlID0gZnVuY3Rpb24gSlNPTkFycmF5Tm9kZShfcmVmKSB7XG4gIHZhciBkYXRhID0gX3JlZi5kYXRhLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTk5lc3RlZE5vZGUsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIGRhdGE6IGRhdGEsXG4gICAgbm9kZVR5cGU6IFwiQXJyYXlcIixcbiAgICBub2RlVHlwZUluZGljYXRvcjogXCJbXVwiLFxuICAgIGNyZWF0ZUl0ZW1TdHJpbmc6IGNyZWF0ZUl0ZW1TdHJpbmcsXG4gICAgZXhwYW5kYWJsZTogZGF0YS5sZW5ndGggPiAwXG4gIH0pKTtcbn07XG5cbkpTT05BcnJheU5vZGUucHJvcFR5cGVzID0ge1xuICBkYXRhOiBQcm9wVHlwZXMuYXJyYXlcbn07XG5leHBvcnQgZGVmYXVsdCBKU09OQXJyYXlOb2RlOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxudmFyIEpTT05BcnJvdyA9IGZ1bmN0aW9uIEpTT05BcnJvdyhfcmVmKSB7XG4gIHZhciBzdHlsaW5nID0gX3JlZi5zdHlsaW5nLFxuICAgICAgYXJyb3dTdHlsZSA9IF9yZWYuYXJyb3dTdHlsZSxcbiAgICAgIGV4cGFuZGVkID0gX3JlZi5leHBhbmRlZCxcbiAgICAgIG5vZGVUeXBlID0gX3JlZi5ub2RlVHlwZSxcbiAgICAgIG9uQ2xpY2sgPSBfcmVmLm9uQ2xpY2s7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7fSwgc3R5bGluZygnYXJyb3dDb250YWluZXInLCBhcnJvd1N0eWxlKSwge1xuICAgIG9uQ2xpY2s6IG9uQ2xpY2tcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHN0eWxpbmcoWydhcnJvdycsICdhcnJvd1NpZ24nXSwgbm9kZVR5cGUsIGV4cGFuZGVkLCBhcnJvd1N0eWxlKSwgXCJcXHUyNUI2XCIsIGFycm93U3R5bGUgPT09ICdkb3VibGUnICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHN0eWxpbmcoWydhcnJvd1NpZ24nLCAnYXJyb3dTaWduSW5uZXInXSksIFwiXFx1MjVCNlwiKSkpO1xufTtcblxuSlNPTkFycm93LnByb3BUeXBlcyA9IHtcbiAgc3R5bGluZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgYXJyb3dTdHlsZTogUHJvcFR5cGVzLm9uZU9mKFsnc2luZ2xlJywgJ2RvdWJsZSddKSxcbiAgZXhwYW5kZWQ6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gIG5vZGVUeXBlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbn07XG5KU09OQXJyb3cuZGVmYXVsdFByb3BzID0ge1xuICBhcnJvd1N0eWxlOiAnc2luZ2xlJ1xufTtcbmV4cG9ydCBkZWZhdWx0IEpTT05BcnJvdzsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQgPSB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvW1wiQEBpdGVyYXRvclwiXTsgaWYgKCFpdCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBpdC5jYWxsKG8pOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0LnJldHVybiAhPSBudWxsKSBpdC5yZXR1cm4oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgSlNPTk5lc3RlZE5vZGUgZnJvbSAnLi9KU09OTmVzdGVkTm9kZSc7XG5cbi8vIFJldHVybnMgdGhlIFwibiBJdGVtc1wiIHN0cmluZyBmb3IgdGhpcyBub2RlLFxuLy8gZ2VuZXJhdGluZyBhbmQgY2FjaGluZyBpdCBpZiBpdCBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldC5cbmZ1bmN0aW9uIGNyZWF0ZUl0ZW1TdHJpbmcoZGF0YSwgbGltaXQpIHtcbiAgdmFyIGNvdW50ID0gMDtcbiAgdmFyIGhhc01vcmUgPSBmYWxzZTtcblxuICBpZiAoTnVtYmVyLmlzU2FmZUludGVnZXIoZGF0YS5zaXplKSkge1xuICAgIGNvdW50ID0gZGF0YS5zaXplO1xuICB9IGVsc2Uge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihkYXRhKSxcbiAgICAgICAgX3N0ZXA7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgaWYgKGxpbWl0ICYmIGNvdW50ICsgMSA+IGxpbWl0KSB7XG4gICAgICAgICAgaGFzTW9yZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjb3VudCArPSAxO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gXCJcIi5jb25jYXQoaGFzTW9yZSA/ICc+JyA6ICcnKS5jb25jYXQoY291bnQsIFwiIFwiKS5jb25jYXQoY291bnQgIT09IDEgPyAnZW50cmllcycgOiAnZW50cnknKTtcbn1cblxuLy8gQ29uZmlndXJlcyA8SlNPTk5lc3RlZE5vZGU+IHRvIHJlbmRlciBhbiBpdGVyYWJsZVxudmFyIEpTT05JdGVyYWJsZU5vZGUgPSBmdW5jdGlvbiBKU09OSXRlcmFibGVOb2RlKF9yZWYpIHtcbiAgdmFyIHByb3BzID0gX2V4dGVuZHMoe30sIF9yZWYpO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OTmVzdGVkTm9kZSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgbm9kZVR5cGU6IFwiSXRlcmFibGVcIixcbiAgICBub2RlVHlwZUluZGljYXRvcjogXCIoKVwiLFxuICAgIGNyZWF0ZUl0ZW1TdHJpbmc6IGNyZWF0ZUl0ZW1TdHJpbmdcbiAgfSkpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgSlNPTkl0ZXJhYmxlTm9kZTsiLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIjtcbmltcG9ydCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuXCI7XG5pbXBvcnQgX2dldFByb3RvdHlwZU9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgSlNPTkFycm93IGZyb20gJy4vSlNPTkFycm93JztcbmltcG9ydCBnZXRDb2xsZWN0aW9uRW50cmllcyBmcm9tICcuL2dldENvbGxlY3Rpb25FbnRyaWVzJztcbmltcG9ydCBKU09OTm9kZSBmcm9tICcuL0pTT05Ob2RlJztcbmltcG9ydCBJdGVtUmFuZ2UgZnJvbSAnLi9JdGVtUmFuZ2UnO1xuXG5mdW5jdGlvbiBpc1JhbmdlKHJhbmdlT3JFbnRyeSkge1xuICByZXR1cm4gcmFuZ2VPckVudHJ5LnRvICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckNoaWxkTm9kZXMocHJvcHMsIGZyb20sIHRvKSB7XG4gIHZhciBub2RlVHlwZSA9IHByb3BzLm5vZGVUeXBlLFxuICAgICAgZGF0YSA9IHByb3BzLmRhdGEsXG4gICAgICBjb2xsZWN0aW9uTGltaXQgPSBwcm9wcy5jb2xsZWN0aW9uTGltaXQsXG4gICAgICBjaXJjdWxhckNhY2hlID0gcHJvcHMuY2lyY3VsYXJDYWNoZSxcbiAgICAgIGtleVBhdGggPSBwcm9wcy5rZXlQYXRoLFxuICAgICAgcG9zdHByb2Nlc3NWYWx1ZSA9IHByb3BzLnBvc3Rwcm9jZXNzVmFsdWUsXG4gICAgICBzb3J0T2JqZWN0S2V5cyA9IHByb3BzLnNvcnRPYmplY3RLZXlzO1xuICB2YXIgY2hpbGROb2RlcyA9IFtdO1xuICBnZXRDb2xsZWN0aW9uRW50cmllcyhub2RlVHlwZSwgZGF0YSwgc29ydE9iamVjdEtleXMsIGNvbGxlY3Rpb25MaW1pdCwgZnJvbSwgdG8pLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgaWYgKGlzUmFuZ2UoZW50cnkpKSB7XG4gICAgICBjaGlsZE5vZGVzLnB1c2goIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEl0ZW1SYW5nZSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICAgIGtleTogXCJJdGVtUmFuZ2UtLVwiLmNvbmNhdChlbnRyeS5mcm9tLCBcIi1cIikuY29uY2F0KGVudHJ5LnRvKSxcbiAgICAgICAgZnJvbTogZW50cnkuZnJvbSxcbiAgICAgICAgdG86IGVudHJ5LnRvLFxuICAgICAgICByZW5kZXJDaGlsZE5vZGVzOiByZW5kZXJDaGlsZE5vZGVzXG4gICAgICB9KSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIga2V5ID0gZW50cnkua2V5LFxuICAgICAgICAgIHZhbHVlID0gZW50cnkudmFsdWU7XG4gICAgICB2YXIgaXNDaXJjdWxhciA9IGNpcmN1bGFyQ2FjaGUuaW5kZXhPZih2YWx1ZSkgIT09IC0xO1xuICAgICAgY2hpbGROb2Rlcy5wdXNoKCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OTm9kZSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICAgIHBvc3Rwcm9jZXNzVmFsdWU6IHBvc3Rwcm9jZXNzVmFsdWUsXG4gICAgICAgIGNvbGxlY3Rpb25MaW1pdDogY29sbGVjdGlvbkxpbWl0LFxuICAgICAgICBrZXk6IFwiTm9kZS0tXCIuY29uY2F0KGtleSksXG4gICAgICAgIGtleVBhdGg6IFtrZXldLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoa2V5UGF0aCkpLFxuICAgICAgICB2YWx1ZTogcG9zdHByb2Nlc3NWYWx1ZSh2YWx1ZSksXG4gICAgICAgIGNpcmN1bGFyQ2FjaGU6IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoY2lyY3VsYXJDYWNoZSksIFt2YWx1ZV0pLFxuICAgICAgICBpc0NpcmN1bGFyOiBpc0NpcmN1bGFyLFxuICAgICAgICBoaWRlUm9vdDogZmFsc2VcbiAgICAgIH0pKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGNoaWxkTm9kZXM7XG59XG5cbmZ1bmN0aW9uIGdldFN0YXRlRnJvbVByb3BzKHByb3BzKSB7XG4gIC8vIGNhbGN1bGF0ZSBpbmRpdmlkdWFsIG5vZGUgZXhwYW5zaW9uIGlmIG5lY2Vzc2FyeVxuICB2YXIgZXhwYW5kZWQgPSAhcHJvcHMuaXNDaXJjdWxhciA/IHByb3BzLnNob3VsZEV4cGFuZE5vZGUocHJvcHMua2V5UGF0aCwgcHJvcHMuZGF0YSwgcHJvcHMubGV2ZWwpIDogZmFsc2U7XG4gIHJldHVybiB7XG4gICAgZXhwYW5kZWQ6IGV4cGFuZGVkXG4gIH07XG59XG5cbnZhciBKU09OTmVzdGVkTm9kZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoSlNPTk5lc3RlZE5vZGUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoSlNPTk5lc3RlZE5vZGUpO1xuXG4gIGZ1bmN0aW9uIEpTT05OZXN0ZWROb2RlKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEpTT05OZXN0ZWROb2RlKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImhhbmRsZUNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5wcm9wcy5leHBhbmRhYmxlKSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBleHBhbmRlZDogIV90aGlzLnN0YXRlLmV4cGFuZGVkXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgX3RoaXMuc3RhdGUgPSBnZXRTdGF0ZUZyb21Qcm9wcyhwcm9wcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEpTT05OZXN0ZWROb2RlLCBbe1xuICAgIGtleTogXCJVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICAgIHZhciBuZXh0U3RhdGUgPSBnZXRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMpO1xuXG4gICAgICBpZiAoZ2V0U3RhdGVGcm9tUHJvcHModGhpcy5wcm9wcykuZXhwYW5kZWQgIT09IG5leHRTdGF0ZS5leHBhbmRlZCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKG5leHRTdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3VsZENvbXBvbmVudFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzLCBuZXh0U3RhdGUpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gISFPYmplY3Qua2V5cyhuZXh0UHJvcHMpLmZpbmQoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4ga2V5ICE9PSAnY2lyY3VsYXJDYWNoZScgJiYgKGtleSA9PT0gJ2tleVBhdGgnID8gbmV4dFByb3BzW2tleV0uam9pbignLycpICE9PSBfdGhpczIucHJvcHNba2V5XS5qb2luKCcvJykgOiBuZXh0UHJvcHNba2V5XSAhPT0gX3RoaXMyLnByb3BzW2tleV0pO1xuICAgICAgfSkgfHwgbmV4dFN0YXRlLmV4cGFuZGVkICE9PSB0aGlzLnN0YXRlLmV4cGFuZGVkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBnZXRJdGVtU3RyaW5nID0gX3RoaXMkcHJvcHMuZ2V0SXRlbVN0cmluZyxcbiAgICAgICAgICBub2RlVHlwZUluZGljYXRvciA9IF90aGlzJHByb3BzLm5vZGVUeXBlSW5kaWNhdG9yLFxuICAgICAgICAgIG5vZGVUeXBlID0gX3RoaXMkcHJvcHMubm9kZVR5cGUsXG4gICAgICAgICAgZGF0YSA9IF90aGlzJHByb3BzLmRhdGEsXG4gICAgICAgICAgaGlkZVJvb3QgPSBfdGhpcyRwcm9wcy5oaWRlUm9vdCxcbiAgICAgICAgICBjcmVhdGVJdGVtU3RyaW5nID0gX3RoaXMkcHJvcHMuY3JlYXRlSXRlbVN0cmluZyxcbiAgICAgICAgICBzdHlsaW5nID0gX3RoaXMkcHJvcHMuc3R5bGluZyxcbiAgICAgICAgICBjb2xsZWN0aW9uTGltaXQgPSBfdGhpcyRwcm9wcy5jb2xsZWN0aW9uTGltaXQsXG4gICAgICAgICAga2V5UGF0aCA9IF90aGlzJHByb3BzLmtleVBhdGgsXG4gICAgICAgICAgbGFiZWxSZW5kZXJlciA9IF90aGlzJHByb3BzLmxhYmVsUmVuZGVyZXIsXG4gICAgICAgICAgZXhwYW5kYWJsZSA9IF90aGlzJHByb3BzLmV4cGFuZGFibGU7XG4gICAgICB2YXIgZXhwYW5kZWQgPSB0aGlzLnN0YXRlLmV4cGFuZGVkO1xuICAgICAgdmFyIHJlbmRlcmVkQ2hpbGRyZW4gPSBleHBhbmRlZCB8fCBoaWRlUm9vdCAmJiB0aGlzLnByb3BzLmxldmVsID09PSAwID8gcmVuZGVyQ2hpbGROb2Rlcyhfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRoaXMucHJvcHMpLCB7fSwge1xuICAgICAgICBsZXZlbDogdGhpcy5wcm9wcy5sZXZlbCArIDFcbiAgICAgIH0pKSA6IG51bGw7XG4gICAgICB2YXIgaXRlbVR5cGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgc3R5bGluZygnbmVzdGVkTm9kZUl0ZW1UeXBlJywgZXhwYW5kZWQpLCBub2RlVHlwZUluZGljYXRvcik7XG4gICAgICB2YXIgcmVuZGVyZWRJdGVtU3RyaW5nID0gZ2V0SXRlbVN0cmluZyhub2RlVHlwZSwgZGF0YSwgaXRlbVR5cGUsIGNyZWF0ZUl0ZW1TdHJpbmcoZGF0YSwgY29sbGVjdGlvbkxpbWl0KSwga2V5UGF0aCk7XG4gICAgICB2YXIgc3R5bGluZ0FyZ3MgPSBba2V5UGF0aCwgbm9kZVR5cGUsIGV4cGFuZGVkLCBleHBhbmRhYmxlXTtcbiAgICAgIHJldHVybiBoaWRlUm9vdCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwgc3R5bGluZy5hcHBseSh2b2lkIDAsIFsncm9vdE5vZGUnXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBzdHlsaW5nLmFwcGx5KHZvaWQgMCwgWydyb290Tm9kZUNoaWxkcmVuJ10uY29uY2F0KHN0eWxpbmdBcmdzKSksIHJlbmRlcmVkQ2hpbGRyZW4pKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwgc3R5bGluZy5hcHBseSh2b2lkIDAsIFsnbmVzdGVkTm9kZSddLmNvbmNhdChzdHlsaW5nQXJncykpLCBleHBhbmRhYmxlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05BcnJvdywge1xuICAgICAgICBzdHlsaW5nOiBzdHlsaW5nLFxuICAgICAgICBub2RlVHlwZTogbm9kZVR5cGUsXG4gICAgICAgIGV4cGFuZGVkOiBleHBhbmRlZCxcbiAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVDbGlja1xuICAgICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIiwgX2V4dGVuZHMoe30sIHN0eWxpbmcuYXBwbHkodm9pZCAwLCBbWydsYWJlbCcsICduZXN0ZWROb2RlTGFiZWwnXV0uY29uY2F0KHN0eWxpbmdBcmdzKSksIHtcbiAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVDbGlja1xuICAgICAgfSksIGxhYmVsUmVuZGVyZXIuYXBwbHkodm9pZCAwLCBzdHlsaW5nQXJncykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgX2V4dGVuZHMoe30sIHN0eWxpbmcuYXBwbHkodm9pZCAwLCBbJ25lc3RlZE5vZGVJdGVtU3RyaW5nJ10uY29uY2F0KHN0eWxpbmdBcmdzKSksIHtcbiAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVDbGlja1xuICAgICAgfSksIHJlbmRlcmVkSXRlbVN0cmluZyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidWxcIiwgc3R5bGluZy5hcHBseSh2b2lkIDAsIFsnbmVzdGVkTm9kZUNoaWxkcmVuJ10uY29uY2F0KHN0eWxpbmdBcmdzKSksIHJlbmRlcmVkQ2hpbGRyZW4pKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSlNPTk5lc3RlZE5vZGU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbl9kZWZpbmVQcm9wZXJ0eShKU09OTmVzdGVkTm9kZSwgXCJwcm9wVHlwZXNcIiwge1xuICBnZXRJdGVtU3RyaW5nOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBub2RlVHlwZUluZGljYXRvcjogUHJvcFR5cGVzLmFueSxcbiAgbm9kZVR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgZGF0YTogUHJvcFR5cGVzLmFueSxcbiAgaGlkZVJvb3Q6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gIGNyZWF0ZUl0ZW1TdHJpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHN0eWxpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGNvbGxlY3Rpb25MaW1pdDogUHJvcFR5cGVzLm51bWJlcixcbiAga2V5UGF0aDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pKS5pc1JlcXVpcmVkLFxuICBsYWJlbFJlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBzaG91bGRFeHBhbmROb2RlOiBQcm9wVHlwZXMuZnVuYyxcbiAgbGV2ZWw6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgc29ydE9iamVjdEtleXM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5mdW5jLCBQcm9wVHlwZXMuYm9vbF0pLFxuICBpc0NpcmN1bGFyOiBQcm9wVHlwZXMuYm9vbCxcbiAgZXhwYW5kYWJsZTogUHJvcFR5cGVzLmJvb2xcbn0pO1xuXG5fZGVmaW5lUHJvcGVydHkoSlNPTk5lc3RlZE5vZGUsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgZGF0YTogW10sXG4gIGNpcmN1bGFyQ2FjaGU6IFtdLFxuICBsZXZlbDogMCxcbiAgZXhwYW5kYWJsZTogdHJ1ZVxufSk7XG5cbmV4cG9ydCB7IEpTT05OZXN0ZWROb2RlIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImdldEl0ZW1TdHJpbmdcIiwgXCJrZXlQYXRoXCIsIFwibGFiZWxSZW5kZXJlclwiLCBcInN0eWxpbmdcIiwgXCJ2YWx1ZVwiLCBcInZhbHVlUmVuZGVyZXJcIiwgXCJpc0N1c3RvbU5vZGVcIl07XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IG9ialR5cGUgZnJvbSAnLi9vYmpUeXBlJztcbmltcG9ydCBKU09OT2JqZWN0Tm9kZSBmcm9tICcuL0pTT05PYmplY3ROb2RlJztcbmltcG9ydCBKU09OQXJyYXlOb2RlIGZyb20gJy4vSlNPTkFycmF5Tm9kZSc7XG5pbXBvcnQgSlNPTkl0ZXJhYmxlTm9kZSBmcm9tICcuL0pTT05JdGVyYWJsZU5vZGUnO1xuaW1wb3J0IEpTT05WYWx1ZU5vZGUgZnJvbSAnLi9KU09OVmFsdWVOb2RlJztcblxudmFyIEpTT05Ob2RlID0gZnVuY3Rpb24gSlNPTk5vZGUoX3JlZikge1xuICB2YXIgZ2V0SXRlbVN0cmluZyA9IF9yZWYuZ2V0SXRlbVN0cmluZyxcbiAgICAgIGtleVBhdGggPSBfcmVmLmtleVBhdGgsXG4gICAgICBsYWJlbFJlbmRlcmVyID0gX3JlZi5sYWJlbFJlbmRlcmVyLFxuICAgICAgc3R5bGluZyA9IF9yZWYuc3R5bGluZyxcbiAgICAgIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICAgIHZhbHVlUmVuZGVyZXIgPSBfcmVmLnZhbHVlUmVuZGVyZXIsXG4gICAgICBpc0N1c3RvbU5vZGUgPSBfcmVmLmlzQ3VzdG9tTm9kZSxcbiAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcblxuICB2YXIgbm9kZVR5cGUgPSBpc0N1c3RvbU5vZGUodmFsdWUpID8gJ0N1c3RvbScgOiBvYmpUeXBlKHZhbHVlKTtcbiAgdmFyIHNpbXBsZU5vZGVQcm9wcyA9IHtcbiAgICBnZXRJdGVtU3RyaW5nOiBnZXRJdGVtU3RyaW5nLFxuICAgIGtleToga2V5UGF0aFswXSxcbiAgICBrZXlQYXRoOiBrZXlQYXRoLFxuICAgIGxhYmVsUmVuZGVyZXI6IGxhYmVsUmVuZGVyZXIsXG4gICAgbm9kZVR5cGU6IG5vZGVUeXBlLFxuICAgIHN0eWxpbmc6IHN0eWxpbmcsXG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIHZhbHVlUmVuZGVyZXI6IHZhbHVlUmVuZGVyZXJcbiAgfTtcblxuICB2YXIgbmVzdGVkTm9kZVByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHJlc3QpLCBzaW1wbGVOb2RlUHJvcHMpLCB7fSwge1xuICAgIGRhdGE6IHZhbHVlLFxuICAgIGlzQ3VzdG9tTm9kZTogaXNDdXN0b21Ob2RlXG4gIH0pO1xuXG4gIHN3aXRjaCAobm9kZVR5cGUpIHtcbiAgICBjYXNlICdPYmplY3QnOlxuICAgIGNhc2UgJ0Vycm9yJzpcbiAgICBjYXNlICdXZWFrTWFwJzpcbiAgICBjYXNlICdXZWFrU2V0JzpcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OT2JqZWN0Tm9kZSwgbmVzdGVkTm9kZVByb3BzKTtcblxuICAgIGNhc2UgJ0FycmF5JzpcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OQXJyYXlOb2RlLCBuZXN0ZWROb2RlUHJvcHMpO1xuXG4gICAgY2FzZSAnSXRlcmFibGUnOlxuICAgIGNhc2UgJ01hcCc6XG4gICAgY2FzZSAnU2V0JzpcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OSXRlcmFibGVOb2RlLCBuZXN0ZWROb2RlUHJvcHMpO1xuXG4gICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OVmFsdWVOb2RlLCBfZXh0ZW5kcyh7fSwgc2ltcGxlTm9kZVByb3BzLCB7XG4gICAgICAgIHZhbHVlR2V0dGVyOiBmdW5jdGlvbiB2YWx1ZUdldHRlcihyYXcpIHtcbiAgICAgICAgICByZXR1cm4gXCJcXFwiXCIuY29uY2F0KHJhdywgXCJcXFwiXCIpO1xuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICBjYXNlICdOdW1iZXInOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05WYWx1ZU5vZGUsIHNpbXBsZU5vZGVQcm9wcyk7XG5cbiAgICBjYXNlICdCb29sZWFuJzpcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OVmFsdWVOb2RlLCBfZXh0ZW5kcyh7fSwgc2ltcGxlTm9kZVByb3BzLCB7XG4gICAgICAgIHZhbHVlR2V0dGVyOiBmdW5jdGlvbiB2YWx1ZUdldHRlcihyYXcpIHtcbiAgICAgICAgICByZXR1cm4gcmF3ID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICAgICAgfVxuICAgICAgfSkpO1xuXG4gICAgY2FzZSAnRGF0ZSc6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgX2V4dGVuZHMoe30sIHNpbXBsZU5vZGVQcm9wcywge1xuICAgICAgICB2YWx1ZUdldHRlcjogZnVuY3Rpb24gdmFsdWVHZXR0ZXIocmF3KSB7XG4gICAgICAgICAgcmV0dXJuIHJhdy50b0lTT1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICBjYXNlICdOdWxsJzpcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OVmFsdWVOb2RlLCBfZXh0ZW5kcyh7fSwgc2ltcGxlTm9kZVByb3BzLCB7XG4gICAgICAgIHZhbHVlR2V0dGVyOiBmdW5jdGlvbiB2YWx1ZUdldHRlcigpIHtcbiAgICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICBjYXNlICdVbmRlZmluZWQnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05WYWx1ZU5vZGUsIF9leHRlbmRzKHt9LCBzaW1wbGVOb2RlUHJvcHMsIHtcbiAgICAgICAgdmFsdWVHZXR0ZXI6IGZ1bmN0aW9uIHZhbHVlR2V0dGVyKCkge1xuICAgICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICAgICAgfVxuICAgICAgfSkpO1xuXG4gICAgY2FzZSAnRnVuY3Rpb24nOlxuICAgIGNhc2UgJ1N5bWJvbCc6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgX2V4dGVuZHMoe30sIHNpbXBsZU5vZGVQcm9wcywge1xuICAgICAgICB2YWx1ZUdldHRlcjogZnVuY3Rpb24gdmFsdWVHZXR0ZXIocmF3KSB7XG4gICAgICAgICAgcmV0dXJuIHJhdy50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICBjYXNlICdDdXN0b20nOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05WYWx1ZU5vZGUsIHNpbXBsZU5vZGVQcm9wcyk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05WYWx1ZU5vZGUsIF9leHRlbmRzKHt9LCBzaW1wbGVOb2RlUHJvcHMsIHtcbiAgICAgICAgdmFsdWVHZXR0ZXI6IGZ1bmN0aW9uIHZhbHVlR2V0dGVyKCkge1xuICAgICAgICAgIHJldHVybiBcIjxcIi5jb25jYXQobm9kZVR5cGUsIFwiPlwiKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICB9XG59O1xuXG5KU09OTm9kZS5wcm9wVHlwZXMgPSB7XG4gIGdldEl0ZW1TdHJpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGtleVBhdGg6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXJdKS5pc1JlcXVpcmVkKS5pc1JlcXVpcmVkLFxuICBsYWJlbFJlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBzdHlsaW5nOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICB2YWx1ZTogUHJvcFR5cGVzLmFueSxcbiAgdmFsdWVSZW5kZXJlcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgaXNDdXN0b21Ob2RlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkXG59O1xuZXhwb3J0IGRlZmF1bHQgSlNPTk5vZGU7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJkYXRhXCJdO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgSlNPTk5lc3RlZE5vZGUgZnJvbSAnLi9KU09OTmVzdGVkTm9kZSc7XG5cbi8vIFJldHVybnMgdGhlIFwibiBJdGVtc1wiIHN0cmluZyBmb3IgdGhpcyBub2RlLFxuLy8gZ2VuZXJhdGluZyBhbmQgY2FjaGluZyBpdCBpZiBpdCBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldC5cbmZ1bmN0aW9uIGNyZWF0ZUl0ZW1TdHJpbmcoZGF0YSkge1xuICB2YXIgbGVuID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGF0YSkubGVuZ3RoO1xuICByZXR1cm4gXCJcIi5jb25jYXQobGVuLCBcIiBcIikuY29uY2F0KGxlbiAhPT0gMSA/ICdrZXlzJyA6ICdrZXknKTtcbn1cblxuLy8gQ29uZmlndXJlcyA8SlNPTk5lc3RlZE5vZGU+IHRvIHJlbmRlciBhbiBPYmplY3RcbnZhciBKU09OT2JqZWN0Tm9kZSA9IGZ1bmN0aW9uIEpTT05PYmplY3ROb2RlKF9yZWYpIHtcbiAgdmFyIGRhdGEgPSBfcmVmLmRhdGEsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OTmVzdGVkTm9kZSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgZGF0YTogZGF0YSxcbiAgICBub2RlVHlwZTogXCJPYmplY3RcIixcbiAgICBub2RlVHlwZUluZGljYXRvcjogcHJvcHMubm9kZVR5cGUgPT09ICdFcnJvcicgPyAnRXJyb3IoKScgOiAne30nLFxuICAgIGNyZWF0ZUl0ZW1TdHJpbmc6IGNyZWF0ZUl0ZW1TdHJpbmcsXG4gICAgZXhwYW5kYWJsZTogT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGF0YSkubGVuZ3RoID4gMFxuICB9KSk7XG59O1xuXG5KU09OT2JqZWN0Tm9kZS5wcm9wVHlwZXMgPSB7XG4gIGRhdGE6IFByb3BUeXBlcy5vYmplY3QsXG4gIG5vZGVUeXBlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWRcbn07XG5leHBvcnQgZGVmYXVsdCBKU09OT2JqZWN0Tm9kZTsiLCJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxudmFyIEpTT05WYWx1ZU5vZGUgPSBmdW5jdGlvbiBKU09OVmFsdWVOb2RlKF9yZWYpIHtcbiAgdmFyIG5vZGVUeXBlID0gX3JlZi5ub2RlVHlwZSxcbiAgICAgIHN0eWxpbmcgPSBfcmVmLnN0eWxpbmcsXG4gICAgICBsYWJlbFJlbmRlcmVyID0gX3JlZi5sYWJlbFJlbmRlcmVyLFxuICAgICAga2V5UGF0aCA9IF9yZWYua2V5UGF0aCxcbiAgICAgIHZhbHVlUmVuZGVyZXIgPSBfcmVmLnZhbHVlUmVuZGVyZXIsXG4gICAgICB2YWx1ZSA9IF9yZWYudmFsdWUsXG4gICAgICBfcmVmJHZhbHVlR2V0dGVyID0gX3JlZi52YWx1ZUdldHRlcixcbiAgICAgIHZhbHVlR2V0dGVyID0gX3JlZiR2YWx1ZUdldHRlciA9PT0gdm9pZCAwID8gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IDogX3JlZiR2YWx1ZUdldHRlcjtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwgc3R5bGluZygndmFsdWUnLCBub2RlVHlwZSwga2V5UGF0aCksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIiwgc3R5bGluZyhbJ2xhYmVsJywgJ3ZhbHVlTGFiZWwnXSwgbm9kZVR5cGUsIGtleVBhdGgpLCBsYWJlbFJlbmRlcmVyKGtleVBhdGgsIG5vZGVUeXBlLCBmYWxzZSwgZmFsc2UpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHN0eWxpbmcoJ3ZhbHVlVGV4dCcsIG5vZGVUeXBlLCBrZXlQYXRoKSwgdmFsdWVSZW5kZXJlci5hcHBseSh2b2lkIDAsIFt2YWx1ZUdldHRlcih2YWx1ZSksIHZhbHVlXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGtleVBhdGgpKSkpKTtcbn07XG5cbkpTT05WYWx1ZU5vZGUucHJvcFR5cGVzID0ge1xuICBub2RlVHlwZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBzdHlsaW5nOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBsYWJlbFJlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBrZXlQYXRoOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSkuaXNSZXF1aXJlZCkuaXNSZXF1aXJlZCxcbiAgdmFsdWVSZW5kZXJlcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgdmFsdWU6IFByb3BUeXBlcy5hbnksXG4gIHZhbHVlR2V0dGVyOiBQcm9wVHlwZXMuZnVuY1xufTtcbmV4cG9ydCBkZWZhdWx0IEpTT05WYWx1ZU5vZGU7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgeyBjcmVhdGVTdHlsaW5nIH0gZnJvbSAncmVhY3QtYmFzZTE2LXN0eWxpbmcnO1xuaW1wb3J0IHNvbGFyaXplZCBmcm9tICcuL3RoZW1lcy9zb2xhcml6ZWQnO1xuXG52YXIgY29sb3JNYXAgPSBmdW5jdGlvbiBjb2xvck1hcCh0aGVtZSkge1xuICByZXR1cm4ge1xuICAgIEJBQ0tHUk9VTkRfQ09MT1I6IHRoZW1lLmJhc2UwMCxcbiAgICBURVhUX0NPTE9SOiB0aGVtZS5iYXNlMDcsXG4gICAgU1RSSU5HX0NPTE9SOiB0aGVtZS5iYXNlMEIsXG4gICAgREFURV9DT0xPUjogdGhlbWUuYmFzZTBCLFxuICAgIE5VTUJFUl9DT0xPUjogdGhlbWUuYmFzZTA5LFxuICAgIEJPT0xFQU5fQ09MT1I6IHRoZW1lLmJhc2UwOSxcbiAgICBOVUxMX0NPTE9SOiB0aGVtZS5iYXNlMDgsXG4gICAgVU5ERUZJTkVEX0NPTE9SOiB0aGVtZS5iYXNlMDgsXG4gICAgRlVOQ1RJT05fQ09MT1I6IHRoZW1lLmJhc2UwOCxcbiAgICBTWU1CT0xfQ09MT1I6IHRoZW1lLmJhc2UwOCxcbiAgICBMQUJFTF9DT0xPUjogdGhlbWUuYmFzZTBELFxuICAgIEFSUk9XX0NPTE9SOiB0aGVtZS5iYXNlMEQsXG4gICAgSVRFTV9TVFJJTkdfQ09MT1I6IHRoZW1lLmJhc2UwQixcbiAgICBJVEVNX1NUUklOR19FWFBBTkRFRF9DT0xPUjogdGhlbWUuYmFzZTAzXG4gIH07XG59O1xuXG52YXIgdmFsdWVDb2xvck1hcCA9IGZ1bmN0aW9uIHZhbHVlQ29sb3JNYXAoY29sb3JzKSB7XG4gIHJldHVybiB7XG4gICAgU3RyaW5nOiBjb2xvcnMuU1RSSU5HX0NPTE9SLFxuICAgIERhdGU6IGNvbG9ycy5EQVRFX0NPTE9SLFxuICAgIE51bWJlcjogY29sb3JzLk5VTUJFUl9DT0xPUixcbiAgICBCb29sZWFuOiBjb2xvcnMuQk9PTEVBTl9DT0xPUixcbiAgICBOdWxsOiBjb2xvcnMuTlVMTF9DT0xPUixcbiAgICBVbmRlZmluZWQ6IGNvbG9ycy5VTkRFRklORURfQ09MT1IsXG4gICAgRnVuY3Rpb246IGNvbG9ycy5GVU5DVElPTl9DT0xPUixcbiAgICBTeW1ib2w6IGNvbG9ycy5TWU1CT0xfQ09MT1JcbiAgfTtcbn07XG5cbnZhciBnZXREZWZhdWx0VGhlbWVTdHlsaW5nID0gZnVuY3Rpb24gZ2V0RGVmYXVsdFRoZW1lU3R5bGluZyh0aGVtZSkge1xuICB2YXIgY29sb3JzID0gY29sb3JNYXAodGhlbWUpO1xuICByZXR1cm4ge1xuICAgIHRyZWU6IHtcbiAgICAgIGJvcmRlcjogMCxcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBtYXJnaW5Ub3A6ICcwLjVlbScsXG4gICAgICBtYXJnaW5Cb3R0b206ICcwLjVlbScsXG4gICAgICBtYXJnaW5MZWZ0OiAnMC4xMjVlbScsXG4gICAgICBtYXJnaW5SaWdodDogMCxcbiAgICAgIGxpc3RTdHlsZTogJ25vbmUnLFxuICAgICAgTW96VXNlclNlbGVjdDogJ25vbmUnLFxuICAgICAgV2Via2l0VXNlclNlbGVjdDogJ25vbmUnLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBjb2xvcnMuQkFDS0dST1VORF9DT0xPUlxuICAgIH0sXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKF9yZWYsIG5vZGVUeXBlLCBrZXlQYXRoKSB7XG4gICAgICB2YXIgc3R5bGUgPSBfcmVmLnN0eWxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCB7fSwge1xuICAgICAgICAgIHBhZGRpbmdUb3A6ICcwLjI1ZW0nLFxuICAgICAgICAgIHBhZGRpbmdSaWdodDogMCxcbiAgICAgICAgICBtYXJnaW5MZWZ0OiAnMC44NzVlbScsXG4gICAgICAgICAgV2Via2l0VXNlclNlbGVjdDogJ3RleHQnLFxuICAgICAgICAgIE1velVzZXJTZWxlY3Q6ICd0ZXh0JyxcbiAgICAgICAgICB3b3JkV3JhcDogJ2JyZWFrLXdvcmQnLFxuICAgICAgICAgIHBhZGRpbmdMZWZ0OiBrZXlQYXRoLmxlbmd0aCA+IDEgPyAnMi4xMjVlbScgOiAnMS4yNWVtJyxcbiAgICAgICAgICB0ZXh0SW5kZW50OiAnLTAuNWVtJyxcbiAgICAgICAgICB3b3JkQnJlYWs6ICdicmVhay1hbGwnXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0sXG4gICAgbGFiZWw6IHtcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgY29sb3I6IGNvbG9ycy5MQUJFTF9DT0xPUlxuICAgIH0sXG4gICAgdmFsdWVMYWJlbDoge1xuICAgICAgbWFyZ2luOiAnMCAwLjVlbSAwIDAnXG4gICAgfSxcbiAgICB2YWx1ZVRleHQ6IGZ1bmN0aW9uIHZhbHVlVGV4dChfcmVmMiwgbm9kZVR5cGUpIHtcbiAgICAgIHZhciBzdHlsZSA9IF9yZWYyLnN0eWxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCB7fSwge1xuICAgICAgICAgIGNvbG9yOiB2YWx1ZUNvbG9yTWFwKGNvbG9ycylbbm9kZVR5cGVdXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0sXG4gICAgaXRlbVJhbmdlOiBmdW5jdGlvbiBpdGVtUmFuZ2Uoc3R5bGluZywgZXhwYW5kZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgcGFkZGluZ1RvcDogZXhwYW5kZWQgPyAwIDogJzAuMjVlbScsXG4gICAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgICAgY29sb3I6IGNvbG9ycy5MQUJFTF9DT0xPUlxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG4gICAgYXJyb3c6IGZ1bmN0aW9uIGFycm93KF9yZWYzLCBub2RlVHlwZSwgZXhwYW5kZWQpIHtcbiAgICAgIHZhciBzdHlsZSA9IF9yZWYzLnN0eWxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCB7fSwge1xuICAgICAgICAgIG1hcmdpbkxlZnQ6IDAsXG4gICAgICAgICAgdHJhbnNpdGlvbjogJzE1MG1zJyxcbiAgICAgICAgICBXZWJraXRUcmFuc2l0aW9uOiAnMTUwbXMnLFxuICAgICAgICAgIE1velRyYW5zaXRpb246ICcxNTBtcycsXG4gICAgICAgICAgV2Via2l0VHJhbnNmb3JtOiBleHBhbmRlZCA/ICdyb3RhdGVaKDkwZGVnKScgOiAncm90YXRlWigwZGVnKScsXG4gICAgICAgICAgTW96VHJhbnNmb3JtOiBleHBhbmRlZCA/ICdyb3RhdGVaKDkwZGVnKScgOiAncm90YXRlWigwZGVnKScsXG4gICAgICAgICAgdHJhbnNmb3JtOiBleHBhbmRlZCA/ICdyb3RhdGVaKDkwZGVnKScgOiAncm90YXRlWigwZGVnKScsXG4gICAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnNDUlIDUwJScsXG4gICAgICAgICAgV2Via2l0VHJhbnNmb3JtT3JpZ2luOiAnNDUlIDUwJScsXG4gICAgICAgICAgTW96VHJhbnNmb3JtT3JpZ2luOiAnNDUlIDUwJScsXG4gICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgICAgbGluZUhlaWdodDogJzEuMWVtJyxcbiAgICAgICAgICBmb250U2l6ZTogJzAuNzVlbSdcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSxcbiAgICBhcnJvd0NvbnRhaW5lcjogZnVuY3Rpb24gYXJyb3dDb250YWluZXIoX3JlZjQsIGFycm93U3R5bGUpIHtcbiAgICAgIHZhciBzdHlsZSA9IF9yZWY0LnN0eWxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCB7fSwge1xuICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICAgIHBhZGRpbmdSaWdodDogJzAuNWVtJyxcbiAgICAgICAgICBwYWRkaW5nTGVmdDogYXJyb3dTdHlsZSA9PT0gJ2RvdWJsZScgPyAnMWVtJyA6IDAsXG4gICAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSxcbiAgICBhcnJvd1NpZ246IHtcbiAgICAgIGNvbG9yOiBjb2xvcnMuQVJST1dfQ09MT1JcbiAgICB9LFxuICAgIGFycm93U2lnbklubmVyOiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHRvcDogMCxcbiAgICAgIGxlZnQ6ICctMC40ZW0nXG4gICAgfSxcbiAgICBuZXN0ZWROb2RlOiBmdW5jdGlvbiBuZXN0ZWROb2RlKF9yZWY1LCBrZXlQYXRoLCBub2RlVHlwZSwgZXhwYW5kZWQsIGV4cGFuZGFibGUpIHtcbiAgICAgIHZhciBzdHlsZSA9IF9yZWY1LnN0eWxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCB7fSwge1xuICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICAgIHBhZGRpbmdUb3A6ICcwLjI1ZW0nLFxuICAgICAgICAgIG1hcmdpbkxlZnQ6IGtleVBhdGgubGVuZ3RoID4gMSA/ICcwLjg3NWVtJyA6IDAsXG4gICAgICAgICAgcGFkZGluZ0xlZnQ6ICFleHBhbmRhYmxlID8gJzEuMTI1ZW0nIDogMFxuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9LFxuICAgIHJvb3ROb2RlOiB7XG4gICAgICBwYWRkaW5nOiAwLFxuICAgICAgbWFyZ2luOiAwXG4gICAgfSxcbiAgICBuZXN0ZWROb2RlTGFiZWw6IGZ1bmN0aW9uIG5lc3RlZE5vZGVMYWJlbChfcmVmNiwga2V5UGF0aCwgbm9kZVR5cGUsIGV4cGFuZGVkLCBleHBhbmRhYmxlKSB7XG4gICAgICB2YXIgc3R5bGUgPSBfcmVmNi5zdHlsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwge30sIHtcbiAgICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgICBXZWJraXRVc2VyU2VsZWN0OiBleHBhbmRhYmxlID8gJ2luaGVyaXQnIDogJ3RleHQnLFxuICAgICAgICAgIE1velVzZXJTZWxlY3Q6IGV4cGFuZGFibGUgPyAnaW5oZXJpdCcgOiAndGV4dCcsXG4gICAgICAgICAgY3Vyc29yOiBleHBhbmRhYmxlID8gJ3BvaW50ZXInIDogJ2RlZmF1bHQnXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0sXG4gICAgbmVzdGVkTm9kZUl0ZW1TdHJpbmc6IGZ1bmN0aW9uIG5lc3RlZE5vZGVJdGVtU3RyaW5nKF9yZWY3LCBrZXlQYXRoLCBub2RlVHlwZSwgZXhwYW5kZWQpIHtcbiAgICAgIHZhciBzdHlsZSA9IF9yZWY3LnN0eWxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCB7fSwge1xuICAgICAgICAgIHBhZGRpbmdMZWZ0OiAnMC41ZW0nLFxuICAgICAgICAgIGN1cnNvcjogJ2RlZmF1bHQnLFxuICAgICAgICAgIGNvbG9yOiBleHBhbmRlZCA/IGNvbG9ycy5JVEVNX1NUUklOR19FWFBBTkRFRF9DT0xPUiA6IGNvbG9ycy5JVEVNX1NUUklOR19DT0xPUlxuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9LFxuICAgIG5lc3RlZE5vZGVJdGVtVHlwZToge1xuICAgICAgbWFyZ2luTGVmdDogJzAuM2VtJyxcbiAgICAgIG1hcmdpblJpZ2h0OiAnMC4zZW0nXG4gICAgfSxcbiAgICBuZXN0ZWROb2RlQ2hpbGRyZW46IGZ1bmN0aW9uIG5lc3RlZE5vZGVDaGlsZHJlbihfcmVmOCwgbm9kZVR5cGUsIGV4cGFuZGVkKSB7XG4gICAgICB2YXIgc3R5bGUgPSBfcmVmOC5zdHlsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwge30sIHtcbiAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgICBsaXN0U3R5bGU6ICdub25lJyxcbiAgICAgICAgICBkaXNwbGF5OiBleHBhbmRlZCA/ICdibG9jaycgOiAnbm9uZSdcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSxcbiAgICByb290Tm9kZUNoaWxkcmVuOiB7XG4gICAgICBwYWRkaW5nOiAwLFxuICAgICAgbWFyZ2luOiAwLFxuICAgICAgbGlzdFN0eWxlOiAnbm9uZSdcbiAgICB9XG4gIH07XG59O1xuXG52YXIgY3JlYXRlU3R5bGluZ0Zyb21UaGVtZSA9IGNyZWF0ZVN0eWxpbmcoZ2V0RGVmYXVsdFRoZW1lU3R5bGluZywge1xuICBkZWZhdWx0QmFzZTE2OiBzb2xhcml6ZWRcbn0pO1xuZXhwb3J0IGRlZmF1bHQgY3JlYXRlU3R5bGluZ0Zyb21UaGVtZTsiLCJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bXCJAQGl0ZXJhdG9yXCJdOyBpZiAoIWl0KSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IGl0LmNhbGwobyk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXQucmV0dXJuICE9IG51bGwpIGl0LnJldHVybigpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gZ2V0TGVuZ3RoKHR5cGUsIGNvbGxlY3Rpb24pIHtcbiAgaWYgKHR5cGUgPT09ICdPYmplY3QnKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoY29sbGVjdGlvbikubGVuZ3RoO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdBcnJheScpIHtcbiAgICByZXR1cm4gY29sbGVjdGlvbi5sZW5ndGg7XG4gIH1cblxuICByZXR1cm4gSW5maW5pdHk7XG59XG5cbmZ1bmN0aW9uIGlzSXRlcmFibGVNYXAoY29sbGVjdGlvbikge1xuICByZXR1cm4gdHlwZW9mIGNvbGxlY3Rpb24uc2V0ID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBnZXRFbnRyaWVzKHR5cGUsIGNvbGxlY3Rpb24sIHNvcnRPYmplY3RLZXlzKSB7XG4gIHZhciBmcm9tID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiAwO1xuICB2YXIgdG8gPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IEluZmluaXR5O1xuICB2YXIgcmVzO1xuXG4gIGlmICh0eXBlID09PSAnT2JqZWN0Jykge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY29sbGVjdGlvbik7XG5cbiAgICBpZiAoc29ydE9iamVjdEtleXMpIHtcbiAgICAgIGtleXMuc29ydChzb3J0T2JqZWN0S2V5cyA9PT0gdHJ1ZSA/IHVuZGVmaW5lZCA6IHNvcnRPYmplY3RLZXlzKTtcbiAgICB9XG5cbiAgICBrZXlzID0ga2V5cy5zbGljZShmcm9tLCB0byArIDEpO1xuICAgIHJlcyA9IHtcbiAgICAgIGVudHJpZXM6IGtleXMubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICB2YWx1ZTogY29sbGVjdGlvbltrZXldXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0FycmF5Jykge1xuICAgIHJlcyA9IHtcbiAgICAgIGVudHJpZXM6IGNvbGxlY3Rpb24uc2xpY2UoZnJvbSwgdG8gKyAxKS5tYXAoZnVuY3Rpb24gKHZhbCwgaWR4KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAga2V5OiBpZHggKyBmcm9tLFxuICAgICAgICAgIHZhbHVlOiB2YWxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgaWR4ID0gMDtcbiAgICB2YXIgZW50cmllcyA9IFtdO1xuICAgIHZhciBkb25lID0gdHJ1ZTtcbiAgICB2YXIgaXNNYXAgPSBpc0l0ZXJhYmxlTWFwKGNvbGxlY3Rpb24pO1xuXG4gICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGNvbGxlY3Rpb24pLFxuICAgICAgICBfc3RlcDtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICB2YXIgaXRlbSA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICAgIGlmIChpZHggPiB0bykge1xuICAgICAgICAgIGRvbmUgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmcm9tIDw9IGlkeCkge1xuICAgICAgICAgIGlmIChpc01hcCAmJiBBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW1bMF0gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBpdGVtWzBdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogaXRlbVswXSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbVsxXVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5OiBcIltlbnRyeSBcIi5jb25jYXQoaWR4LCBcIl1cIiksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICdba2V5XSc6IGl0ZW1bMF0sXG4gICAgICAgICAgICAgICAgICAnW3ZhbHVlXSc6IGl0ZW1bMV1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goe1xuICAgICAgICAgICAgICBrZXk6IGlkeCxcbiAgICAgICAgICAgICAgdmFsdWU6IGl0ZW1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlkeCsrO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICB9XG5cbiAgICByZXMgPSB7XG4gICAgICBoYXNNb3JlOiAhZG9uZSxcbiAgICAgIGVudHJpZXM6IGVudHJpZXNcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gZ2V0UmFuZ2VzKGZyb20sIHRvLCBsaW1pdCkge1xuICB2YXIgcmFuZ2VzID0gW107XG5cbiAgd2hpbGUgKHRvIC0gZnJvbSA+IGxpbWl0ICogbGltaXQpIHtcbiAgICBsaW1pdCA9IGxpbWl0ICogbGltaXQ7XG4gIH1cblxuICBmb3IgKHZhciBpID0gZnJvbTsgaSA8PSB0bzsgaSArPSBsaW1pdCkge1xuICAgIHJhbmdlcy5wdXNoKHtcbiAgICAgIGZyb206IGksXG4gICAgICB0bzogTWF0aC5taW4odG8sIGkgKyBsaW1pdCAtIDEpXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmFuZ2VzO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb2xsZWN0aW9uRW50cmllcyh0eXBlLCBjb2xsZWN0aW9uLCBzb3J0T2JqZWN0S2V5cywgbGltaXQpIHtcbiAgdmFyIGZyb20gPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IDA7XG4gIHZhciB0byA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDogSW5maW5pdHk7XG4gIHZhciBnZXRFbnRyaWVzQm91bmQgPSBnZXRFbnRyaWVzLmJpbmQobnVsbCwgdHlwZSwgY29sbGVjdGlvbiwgc29ydE9iamVjdEtleXMpO1xuXG4gIGlmICghbGltaXQpIHtcbiAgICByZXR1cm4gZ2V0RW50cmllc0JvdW5kKCkuZW50cmllcztcbiAgfVxuXG4gIHZhciBpc1N1YnNldCA9IHRvIDwgSW5maW5pdHk7XG4gIHZhciBsZW5ndGggPSBNYXRoLm1pbih0byAtIGZyb20sIGdldExlbmd0aCh0eXBlLCBjb2xsZWN0aW9uKSk7XG5cbiAgaWYgKHR5cGUgIT09ICdJdGVyYWJsZScpIHtcbiAgICBpZiAobGVuZ3RoIDw9IGxpbWl0IHx8IGxpbWl0IDwgNykge1xuICAgICAgcmV0dXJuIGdldEVudHJpZXNCb3VuZChmcm9tLCB0bykuZW50cmllcztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGxlbmd0aCA8PSBsaW1pdCAmJiAhaXNTdWJzZXQpIHtcbiAgICAgIHJldHVybiBnZXRFbnRyaWVzQm91bmQoZnJvbSwgdG8pLmVudHJpZXM7XG4gICAgfVxuICB9XG5cbiAgdmFyIGxpbWl0ZWRFbnRyaWVzO1xuXG4gIGlmICh0eXBlID09PSAnSXRlcmFibGUnKSB7XG4gICAgdmFyIF9nZXRFbnRyaWVzQm91bmQgPSBnZXRFbnRyaWVzQm91bmQoZnJvbSwgZnJvbSArIGxpbWl0IC0gMSksXG4gICAgICAgIGhhc01vcmUgPSBfZ2V0RW50cmllc0JvdW5kLmhhc01vcmUsXG4gICAgICAgIGVudHJpZXMgPSBfZ2V0RW50cmllc0JvdW5kLmVudHJpZXM7XG5cbiAgICBsaW1pdGVkRW50cmllcyA9IGhhc01vcmUgPyBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGVudHJpZXMpLCBfdG9Db25zdW1hYmxlQXJyYXkoZ2V0UmFuZ2VzKGZyb20gKyBsaW1pdCwgZnJvbSArIDIgKiBsaW1pdCAtIDEsIGxpbWl0KSkpIDogZW50cmllcztcbiAgfSBlbHNlIHtcbiAgICBsaW1pdGVkRW50cmllcyA9IGlzU3Vic2V0ID8gZ2V0UmFuZ2VzKGZyb20sIHRvLCBsaW1pdCkgOiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGdldEVudHJpZXNCb3VuZCgwLCBsaW1pdCAtIDUpLmVudHJpZXMpLCBfdG9Db25zdW1hYmxlQXJyYXkoZ2V0UmFuZ2VzKGxpbWl0IC0gNCwgbGVuZ3RoIC0gNSwgbGltaXQpKSwgX3RvQ29uc3VtYWJsZUFycmF5KGdldEVudHJpZXNCb3VuZChsZW5ndGggLSA0LCBsZW5ndGggLSAxKS5lbnRyaWVzKSk7XG4gIH1cblxuICByZXR1cm4gbGltaXRlZEVudHJpZXM7XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIjtcbmltcG9ydCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuXCI7XG5pbXBvcnQgX2dldFByb3RvdHlwZU9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiO1xudmFyIF9leGNsdWRlZCA9IFtcImRhdGFcIiwgXCJrZXlQYXRoXCIsIFwicG9zdHByb2Nlc3NWYWx1ZVwiLCBcImhpZGVSb290XCIsIFwidGhlbWVcIiwgXCJpbnZlcnRUaGVtZVwiXTtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbi8vIEVTNiArIGlubGluZSBzdHlsZSBwb3J0IG9mIEpTT05WaWV3ZXIgaHR0cHM6Ly9iaXRidWNrZXQub3JnL2RhdmV2ZWRkZXIvcmVhY3QtanNvbi12aWV3ZXIvXG4vLyBhbGwgY3JlZGl0cyBhbmQgb3JpZ2luYWwgY29kZSB0byB0aGUgYXV0aG9yXG4vLyBEYXZlIFZlZGRlciA8dmVkZGVybWF0aWNAZ21haWwuY29tPiBodHRwOi8vd3d3LmVza2ltb3NweS5jb20vXG4vLyBwb3J0IGJ5IERhbmllbGUgWmFubm90dGkgaHR0cDovL3d3dy5naXRodWIuY29tL2R6YW5ub3R0aSA8ZHphbm5vdHRpQG1lLmNvbT5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IEpTT05Ob2RlIGZyb20gJy4vSlNPTk5vZGUnO1xuaW1wb3J0IGNyZWF0ZVN0eWxpbmdGcm9tVGhlbWUgZnJvbSAnLi9jcmVhdGVTdHlsaW5nRnJvbVRoZW1lJztcbmltcG9ydCB7IGludmVydFRoZW1lIH0gZnJvbSAncmVhY3QtYmFzZTE2LXN0eWxpbmcnO1xuXG52YXIgaWRlbnRpdHkgPSBmdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgZXhwYW5kUm9vdE5vZGUgPSBmdW5jdGlvbiBleHBhbmRSb290Tm9kZShrZXlQYXRoLCBkYXRhLCBsZXZlbCkge1xuICByZXR1cm4gbGV2ZWwgPT09IDA7XG59O1xuXG52YXIgZGVmYXVsdEl0ZW1TdHJpbmcgPSBmdW5jdGlvbiBkZWZhdWx0SXRlbVN0cmluZyh0eXBlLCBkYXRhLCBpdGVtVHlwZSwgaXRlbVN0cmluZykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIGl0ZW1UeXBlLCBcIiBcIiwgaXRlbVN0cmluZyk7XG59O1xuXG52YXIgZGVmYXVsdExhYmVsUmVuZGVyZXIgPSBmdW5jdGlvbiBkZWZhdWx0TGFiZWxSZW5kZXJlcihfcmVmKSB7XG4gIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDEpLFxuICAgICAgbGFiZWwgPSBfcmVmMlswXTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIGxhYmVsLCBcIjpcIik7XG59O1xuXG52YXIgbm9DdXN0b21Ob2RlID0gZnVuY3Rpb24gbm9DdXN0b21Ob2RlKCkge1xuICByZXR1cm4gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiBjaGVja0xlZ2FjeVRoZW1pbmcodGhlbWUsIHByb3BzKSB7XG4gIHZhciBkZXByZWNhdGVkU3R5bGluZ01ldGhvZHNNYXAgPSB7XG4gICAgZ2V0QXJyb3dTdHlsZTogJ2Fycm93JyxcbiAgICBnZXRMaXN0U3R5bGU6ICduZXN0ZWROb2RlQ2hpbGRyZW4nLFxuICAgIGdldEl0ZW1TdHJpbmdTdHlsZTogJ25lc3RlZE5vZGVJdGVtU3RyaW5nJyxcbiAgICBnZXRMYWJlbFN0eWxlOiAnbGFiZWwnLFxuICAgIGdldFZhbHVlU3R5bGU6ICd2YWx1ZVRleHQnXG4gIH07XG4gIHZhciBkZXByZWNhdGVkU3R5bGluZ01ldGhvZHMgPSBPYmplY3Qua2V5cyhkZXByZWNhdGVkU3R5bGluZ01ldGhvZHNNYXApLmZpbHRlcihmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiBwcm9wc1tuYW1lXTtcbiAgfSk7XG5cbiAgaWYgKGRlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kcy5sZW5ndGggPiAwKSB7XG4gICAgaWYgKHR5cGVvZiB0aGVtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoZW1lID0ge1xuICAgICAgICBleHRlbmQ6IHRoZW1lXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGVtZSA9IF9vYmplY3RTcHJlYWQoe30sIHRoZW1lKTtcbiAgICB9XG5cbiAgICBkZXByZWNhdGVkU3R5bGluZ01ldGhvZHMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJTdHlsaW5nIG1ldGhvZCBcXFwiXCIuY29uY2F0KG5hbWUsIFwiXFxcIiBpcyBkZXByZWNhdGVkLCB1c2UgXFxcInRoZW1lXFxcIiBwcm9wZXJ0eSBpbnN0ZWFkXCIpKTtcblxuICAgICAgdGhlbWVbZGVwcmVjYXRlZFN0eWxpbmdNZXRob2RzTWFwW25hbWVdXSA9IGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICB2YXIgc3R5bGUgPSBfcmVmMy5zdHlsZTtcblxuICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwgcHJvcHNbbmFtZV0uYXBwbHkocHJvcHMsIGFyZ3MpKVxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0aGVtZTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdGVGcm9tUHJvcHMocHJvcHMpIHtcbiAgdmFyIHRoZW1lID0gY2hlY2tMZWdhY3lUaGVtaW5nKHByb3BzLnRoZW1lLCBwcm9wcyk7XG5cbiAgaWYgKHByb3BzLmludmVydFRoZW1lKSB7XG4gICAgdGhlbWUgPSBpbnZlcnRUaGVtZSh0aGVtZSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0eWxpbmc6IGNyZWF0ZVN0eWxpbmdGcm9tVGhlbWUodGhlbWUpXG4gIH07XG59XG5cbmV4cG9ydCB2YXIgSlNPTlRyZWUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEpTT05UcmVlLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEpTT05UcmVlKTtcblxuICBmdW5jdGlvbiBKU09OVHJlZShwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBKU09OVHJlZSk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcbiAgICBfdGhpcy5zdGF0ZSA9IGdldFN0YXRlRnJvbVByb3BzKHByb3BzKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoSlNPTlRyZWUsIFt7XG4gICAga2V5OiBcIlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmIChbJ3RoZW1lJywgJ2ludmVydFRoZW1lJ10uZmluZChmdW5jdGlvbiAoaykge1xuICAgICAgICByZXR1cm4gbmV4dFByb3BzW2tdICE9PSBfdGhpczIucHJvcHNba107XG4gICAgICB9KSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKGdldFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcykpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaG91bGRDb21wb25lbnRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcykge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHJldHVybiAhIU9iamVjdC5rZXlzKG5leHRQcm9wcykuZmluZChmdW5jdGlvbiAoaykge1xuICAgICAgICByZXR1cm4gayA9PT0gJ2tleVBhdGgnID8gbmV4dFByb3BzW2tdLmpvaW4oJy8nKSAhPT0gX3RoaXMzLnByb3BzW2tdLmpvaW4oJy8nKSA6IG5leHRQcm9wc1trXSAhPT0gX3RoaXMzLnByb3BzW2tdO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHZhbHVlID0gX3RoaXMkcHJvcHMuZGF0YSxcbiAgICAgICAgICBrZXlQYXRoID0gX3RoaXMkcHJvcHMua2V5UGF0aCxcbiAgICAgICAgICBwb3N0cHJvY2Vzc1ZhbHVlID0gX3RoaXMkcHJvcHMucG9zdHByb2Nlc3NWYWx1ZSxcbiAgICAgICAgICBoaWRlUm9vdCA9IF90aGlzJHByb3BzLmhpZGVSb290LFxuICAgICAgICAgIHRoZW1lID0gX3RoaXMkcHJvcHMudGhlbWUsXG4gICAgICAgICAgXyA9IF90aGlzJHByb3BzLmludmVydFRoZW1lLFxuICAgICAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3RoaXMkcHJvcHMsIF9leGNsdWRlZCk7XG5cbiAgICAgIHZhciBzdHlsaW5nID0gdGhpcy5zdGF0ZS5zdHlsaW5nO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidWxcIiwgc3R5bGluZygndHJlZScpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OTm9kZSwgX2V4dGVuZHMoe30sIF9vYmplY3RTcHJlYWQoe1xuICAgICAgICBwb3N0cHJvY2Vzc1ZhbHVlOiBwb3N0cHJvY2Vzc1ZhbHVlLFxuICAgICAgICBoaWRlUm9vdDogaGlkZVJvb3QsXG4gICAgICAgIHN0eWxpbmc6IHN0eWxpbmdcbiAgICAgIH0sIHJlc3QpLCB7XG4gICAgICAgIGtleVBhdGg6IGhpZGVSb290ID8gW10gOiBrZXlQYXRoLFxuICAgICAgICB2YWx1ZTogcG9zdHByb2Nlc3NWYWx1ZSh2YWx1ZSlcbiAgICAgIH0pKSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEpTT05UcmVlO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5fZGVmaW5lUHJvcGVydHkoSlNPTlRyZWUsIFwicHJvcFR5cGVzXCIsIHtcbiAgZGF0YTogUHJvcFR5cGVzLmFueSxcbiAgaGlkZVJvb3Q6IFByb3BUeXBlcy5ib29sLFxuICB0aGVtZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9iamVjdCwgUHJvcFR5cGVzLnN0cmluZ10pLFxuICBpbnZlcnRUaGVtZTogUHJvcFR5cGVzLmJvb2wsXG4gIGtleVBhdGg6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXJdKSksXG4gIHBvc3Rwcm9jZXNzVmFsdWU6IFByb3BUeXBlcy5mdW5jLFxuICBzb3J0T2JqZWN0S2V5czogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmZ1bmMsIFByb3BUeXBlcy5ib29sXSlcbn0pO1xuXG5fZGVmaW5lUHJvcGVydHkoSlNPTlRyZWUsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgc2hvdWxkRXhwYW5kTm9kZTogZXhwYW5kUm9vdE5vZGUsXG4gIGhpZGVSb290OiBmYWxzZSxcbiAga2V5UGF0aDogWydyb290J10sXG4gIGdldEl0ZW1TdHJpbmc6IGRlZmF1bHRJdGVtU3RyaW5nLFxuICBsYWJlbFJlbmRlcmVyOiBkZWZhdWx0TGFiZWxSZW5kZXJlcixcbiAgdmFsdWVSZW5kZXJlcjogaWRlbnRpdHksXG4gIHBvc3Rwcm9jZXNzVmFsdWU6IGlkZW50aXR5LFxuICBpc0N1c3RvbU5vZGU6IG5vQ3VzdG9tTm9kZSxcbiAgY29sbGVjdGlvbkxpbWl0OiA1MCxcbiAgaW52ZXJ0VGhlbWU6IHRydWVcbn0pOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9ialR5cGUob2JqKSB7XG4gIHZhciB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikuc2xpY2UoOCwgLTEpO1xuXG4gIGlmICh0eXBlID09PSAnT2JqZWN0JyAmJiB0eXBlb2Ygb2JqW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gJ0l0ZXJhYmxlJztcbiAgfVxuXG4gIGlmICh0eXBlID09PSAnQ3VzdG9tJyAmJiBvYmouY29uc3RydWN0b3IgIT09IE9iamVjdCAmJiBvYmogaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAvLyBGb3IgcHJvamVjdHMgaW1wbGVtZW50aW5nIG9iamVjdHMgb3ZlcnJpZGluZyBgLnByb3RvdHlwZVtTeW1ib2wudG9TdHJpbmdUYWddYFxuICAgIHJldHVybiAnT2JqZWN0JztcbiAgfVxuXG4gIHJldHVybiB0eXBlO1xufSIsImV4cG9ydCBkZWZhdWx0IHtcbiAgc2NoZW1lOiAnc29sYXJpemVkJyxcbiAgYXV0aG9yOiAnZXRoYW4gc2Nob29ub3ZlciAoaHR0cDovL2V0aGFuc2Nob29ub3Zlci5jb20vc29sYXJpemVkKScsXG4gIGJhc2UwMDogJyMwMDJiMzYnLFxuICBiYXNlMDE6ICcjMDczNjQyJyxcbiAgYmFzZTAyOiAnIzU4NmU3NScsXG4gIGJhc2UwMzogJyM2NTdiODMnLFxuICBiYXNlMDQ6ICcjODM5NDk2JyxcbiAgYmFzZTA1OiAnIzkzYTFhMScsXG4gIGJhc2UwNjogJyNlZWU4ZDUnLFxuICBiYXNlMDc6ICcjZmRmNmUzJyxcbiAgYmFzZTA4OiAnI2RjMzIyZicsXG4gIGJhc2UwOTogJyNjYjRiMTYnLFxuICBiYXNlMEE6ICcjYjU4OTAwJyxcbiAgYmFzZTBCOiAnIzg1OTkwMCcsXG4gIGJhc2UwQzogJyMyYWExOTgnLFxuICBiYXNlMEQ6ICcjMjY4YmQyJyxcbiAgYmFzZTBFOiAnIzZjNzFjNCcsXG4gIGJhc2UwRjogJyNkMzM2ODInXG59OyIsImltcG9ydCBpbnZhcmlhbnQgZnJvbSAnaW52YXJpYW50JztcbmltcG9ydCBpc0Z1bmN0aW9uIGZyb20gJy4vdXRpbHMvaXNGdW5jdGlvbic7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSAnLi91dGlscy9pZGVudGl0eSc7XG5pbXBvcnQgaXNOdWxsIGZyb20gJy4vdXRpbHMvaXNOdWxsJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZUFjdGlvbih0eXBlLCBwYXlsb2FkQ3JlYXRvciwgbWV0YUNyZWF0b3IpIHtcbiAgaWYgKHBheWxvYWRDcmVhdG9yID09PSB2b2lkIDApIHtcbiAgICBwYXlsb2FkQ3JlYXRvciA9IGlkZW50aXR5O1xuICB9XG5cbiAgaW52YXJpYW50KGlzRnVuY3Rpb24ocGF5bG9hZENyZWF0b3IpIHx8IGlzTnVsbChwYXlsb2FkQ3JlYXRvciksICdFeHBlY3RlZCBwYXlsb2FkQ3JlYXRvciB0byBiZSBhIGZ1bmN0aW9uLCB1bmRlZmluZWQgb3IgbnVsbCcpO1xuICB2YXIgZmluYWxQYXlsb2FkQ3JlYXRvciA9IGlzTnVsbChwYXlsb2FkQ3JlYXRvcikgfHwgcGF5bG9hZENyZWF0b3IgPT09IGlkZW50aXR5ID8gaWRlbnRpdHkgOiBmdW5jdGlvbiAoaGVhZCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBoZWFkIGluc3RhbmNlb2YgRXJyb3IgPyBoZWFkIDogcGF5bG9hZENyZWF0b3IuYXBwbHkodm9pZCAwLCBbaGVhZF0uY29uY2F0KGFyZ3MpKTtcbiAgfTtcbiAgdmFyIGhhc01ldGEgPSBpc0Z1bmN0aW9uKG1ldGFDcmVhdG9yKTtcbiAgdmFyIHR5cGVTdHJpbmcgPSB0eXBlLnRvU3RyaW5nKCk7XG5cbiAgdmFyIGFjdGlvbkNyZWF0b3IgPSBmdW5jdGlvbiBhY3Rpb25DcmVhdG9yKCkge1xuICAgIHZhciBwYXlsb2FkID0gZmluYWxQYXlsb2FkQ3JlYXRvci5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgdmFyIGFjdGlvbiA9IHtcbiAgICAgIHR5cGU6IHR5cGVcbiAgICB9O1xuXG4gICAgaWYgKHBheWxvYWQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgYWN0aW9uLmVycm9yID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocGF5bG9hZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY3Rpb24ucGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgfVxuXG4gICAgaWYgKGhhc01ldGEpIHtcbiAgICAgIGFjdGlvbi5tZXRhID0gbWV0YUNyZWF0b3IuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb247XG4gIH07XG5cbiAgYWN0aW9uQ3JlYXRvci50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdHlwZVN0cmluZztcbiAgfTtcblxuICByZXR1cm4gYWN0aW9uQ3JlYXRvcjtcbn0iLCJleHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn0pOyIsImV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn0pOyIsImV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsO1xufSk7IiwiLyoqIEEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGEgcG90ZW50aWFsIFwiZXh0cmEgYXJndW1lbnRcIiB2YWx1ZSB0byBiZSBpbmplY3RlZCBsYXRlcixcclxuICogYW5kIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIHRodW5rIG1pZGRsZXdhcmUgdGhhdCB1c2VzIHRoYXQgdmFsdWVcclxuICovXG5mdW5jdGlvbiBjcmVhdGVUaHVua01pZGRsZXdhcmUoZXh0cmFBcmd1bWVudCkge1xuICAvLyBTdGFuZGFyZCBSZWR1eCBtaWRkbGV3YXJlIGRlZmluaXRpb24gcGF0dGVybjpcbiAgLy8gU2VlOiBodHRwczovL3JlZHV4LmpzLm9yZy90dXRvcmlhbHMvZnVuZGFtZW50YWxzL3BhcnQtNC1zdG9yZSN3cml0aW5nLWN1c3RvbS1taWRkbGV3YXJlXG4gIHZhciBtaWRkbGV3YXJlID0gZnVuY3Rpb24gbWlkZGxld2FyZShfcmVmKSB7XG4gICAgdmFyIGRpc3BhdGNoID0gX3JlZi5kaXNwYXRjaCxcbiAgICAgICAgZ2V0U3RhdGUgPSBfcmVmLmdldFN0YXRlO1xuICAgIHJldHVybiBmdW5jdGlvbiAobmV4dCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgLy8gVGhlIHRodW5rIG1pZGRsZXdhcmUgbG9va3MgZm9yIGFueSBmdW5jdGlvbnMgdGhhdCB3ZXJlIHBhc3NlZCB0byBgc3RvcmUuZGlzcGF0Y2hgLlxuICAgICAgICAvLyBJZiB0aGlzIFwiYWN0aW9uXCIgaXMgcmVhbGx5IGEgZnVuY3Rpb24sIGNhbGwgaXQgYW5kIHJldHVybiB0aGUgcmVzdWx0LlxuICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIC8vIEluamVjdCB0aGUgc3RvcmUncyBgZGlzcGF0Y2hgIGFuZCBgZ2V0U3RhdGVgIG1ldGhvZHMsIGFzIHdlbGwgYXMgYW55IFwiZXh0cmEgYXJnXCJcbiAgICAgICAgICByZXR1cm4gYWN0aW9uKGRpc3BhdGNoLCBnZXRTdGF0ZSwgZXh0cmFBcmd1bWVudCk7XG4gICAgICAgIH0gLy8gT3RoZXJ3aXNlLCBwYXNzIHRoZSBhY3Rpb24gZG93biB0aGUgbWlkZGxld2FyZSBjaGFpbiBhcyB1c3VhbFxuXG5cbiAgICAgICAgcmV0dXJuIG5leHQoYWN0aW9uKTtcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcblxuICByZXR1cm4gbWlkZGxld2FyZTtcbn1cblxudmFyIHRodW5rID0gY3JlYXRlVGh1bmtNaWRkbGV3YXJlKCk7IC8vIEF0dGFjaCB0aGUgZmFjdG9yeSBmdW5jdGlvbiBzbyB1c2VycyBjYW4gY3JlYXRlIGEgY3VzdG9taXplZCB2ZXJzaW9uXG4vLyB3aXRoIHdoYXRldmVyIFwiZXh0cmEgYXJnXCIgdGhleSB3YW50IHRvIGluamVjdCBpbnRvIHRoZWlyIHRodW5rc1xuXG50aHVuay53aXRoRXh0cmFBcmd1bWVudCA9IGNyZWF0ZVRodW5rTWlkZGxld2FyZTtcbmV4cG9ydCBkZWZhdWx0IHRodW5rOyIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDInO1xuXG4vKipcbiAqIEFkYXB0ZWQgZnJvbSBSZWFjdDogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3NoYXJlZC9mb3JtYXRQcm9kRXJyb3JNZXNzYWdlLmpzXG4gKlxuICogRG8gbm90IHJlcXVpcmUgdGhpcyBtb2R1bGUgZGlyZWN0bHkhIFVzZSBub3JtYWwgdGhyb3cgZXJyb3IgY2FsbHMuIFRoZXNlIG1lc3NhZ2VzIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBlcnJvciBjb2Rlc1xuICogZHVyaW5nIGJ1aWxkLlxuICogQHBhcmFtIHtudW1iZXJ9IGNvZGVcbiAqL1xuZnVuY3Rpb24gZm9ybWF0UHJvZEVycm9yTWVzc2FnZShjb2RlKSB7XG4gIHJldHVybiBcIk1pbmlmaWVkIFJlZHV4IGVycm9yICNcIiArIGNvZGUgKyBcIjsgdmlzaXQgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvRXJyb3JzP2NvZGU9XCIgKyBjb2RlICsgXCIgZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgXCIgKyAndXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycy4gJztcbn1cblxuLy8gSW5saW5lZCB2ZXJzaW9uIG9mIHRoZSBgc3ltYm9sLW9ic2VydmFibGVgIHBvbHlmaWxsXG52YXIgJCRvYnNlcnZhYmxlID0gKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLm9ic2VydmFibGUgfHwgJ0BAb2JzZXJ2YWJsZSc7XG59KSgpO1xuXG4vKipcbiAqIFRoZXNlIGFyZSBwcml2YXRlIGFjdGlvbiB0eXBlcyByZXNlcnZlZCBieSBSZWR1eC5cbiAqIEZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB5b3UgbXVzdCByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUuXG4gKiBJZiB0aGUgY3VycmVudCBzdGF0ZSBpcyB1bmRlZmluZWQsIHlvdSBtdXN0IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS5cbiAqIERvIG5vdCByZWZlcmVuY2UgdGhlc2UgYWN0aW9uIHR5cGVzIGRpcmVjdGx5IGluIHlvdXIgY29kZS5cbiAqL1xudmFyIHJhbmRvbVN0cmluZyA9IGZ1bmN0aW9uIHJhbmRvbVN0cmluZygpIHtcbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZyg3KS5zcGxpdCgnJykuam9pbignLicpO1xufTtcblxudmFyIEFjdGlvblR5cGVzID0ge1xuICBJTklUOiBcIkBAcmVkdXgvSU5JVFwiICsgcmFuZG9tU3RyaW5nKCksXG4gIFJFUExBQ0U6IFwiQEByZWR1eC9SRVBMQUNFXCIgKyByYW5kb21TdHJpbmcoKSxcbiAgUFJPQkVfVU5LTk9XTl9BQ1RJT046IGZ1bmN0aW9uIFBST0JFX1VOS05PV05fQUNUSU9OKCkge1xuICAgIHJldHVybiBcIkBAcmVkdXgvUFJPQkVfVU5LTk9XTl9BQ1RJT05cIiArIHJhbmRvbVN0cmluZygpO1xuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGFyZ3VtZW50IGFwcGVhcnMgdG8gYmUgYSBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgdmFyIHByb3RvID0gb2JqO1xuXG4gIHdoaWxlIChPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pICE9PSBudWxsKSB7XG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09PSBwcm90bztcbn1cblxuLy8gSW5saW5lZCAvIHNob3J0ZW5lZCB2ZXJzaW9uIG9mIGBraW5kT2ZgIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQva2luZC1vZlxuZnVuY3Rpb24gbWluaUtpbmRPZih2YWwpIHtcbiAgaWYgKHZhbCA9PT0gdm9pZCAwKSByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gIGlmICh2YWwgPT09IG51bGwpIHJldHVybiAnbnVsbCc7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgY2FzZSAnc3ltYm9sJzpcbiAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfVxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuICdhcnJheSc7XG4gIGlmIChpc0RhdGUodmFsKSkgcmV0dXJuICdkYXRlJztcbiAgaWYgKGlzRXJyb3IodmFsKSkgcmV0dXJuICdlcnJvcic7XG4gIHZhciBjb25zdHJ1Y3Rvck5hbWUgPSBjdG9yTmFtZSh2YWwpO1xuXG4gIHN3aXRjaCAoY29uc3RydWN0b3JOYW1lKSB7XG4gICAgY2FzZSAnU3ltYm9sJzpcbiAgICBjYXNlICdQcm9taXNlJzpcbiAgICBjYXNlICdXZWFrTWFwJzpcbiAgICBjYXNlICdXZWFrU2V0JzpcbiAgICBjYXNlICdNYXAnOlxuICAgIGNhc2UgJ1NldCc6XG4gICAgICByZXR1cm4gY29uc3RydWN0b3JOYW1lO1xuICB9IC8vIG90aGVyXG5cblxuICByZXR1cm4gdHlwZS5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMvZywgJycpO1xufVxuXG5mdW5jdGlvbiBjdG9yTmFtZSh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwuY29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgPyB2YWwuY29uc3RydWN0b3IubmFtZSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzRXJyb3IodmFsKSB7XG4gIHJldHVybiB2YWwgaW5zdGFuY2VvZiBFcnJvciB8fCB0eXBlb2YgdmFsLm1lc3NhZ2UgPT09ICdzdHJpbmcnICYmIHZhbC5jb25zdHJ1Y3RvciAmJiB0eXBlb2YgdmFsLmNvbnN0cnVjdG9yLnN0YWNrVHJhY2VMaW1pdCA9PT0gJ251bWJlcic7XG59XG5cbmZ1bmN0aW9uIGlzRGF0ZSh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHJldHVybiB0cnVlO1xuICByZXR1cm4gdHlwZW9mIHZhbC50b0RhdGVTdHJpbmcgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbC5nZXREYXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWwuc2V0RGF0ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24ga2luZE9mKHZhbCkge1xuICB2YXIgdHlwZU9mVmFsID0gdHlwZW9mIHZhbDtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHR5cGVPZlZhbCA9IG1pbmlLaW5kT2YodmFsKTtcbiAgfVxuXG4gIHJldHVybiB0eXBlT2ZWYWw7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqXG4gKiAqKldlIHJlY29tbWVuZCB1c2luZyB0aGUgYGNvbmZpZ3VyZVN0b3JlYCBtZXRob2RcbiAqIG9mIHRoZSBgQHJlZHV4anMvdG9vbGtpdGAgcGFja2FnZSoqLCB3aGljaCByZXBsYWNlcyBgY3JlYXRlU3RvcmVgLlxuICpcbiAqIFJlZHV4IFRvb2xraXQgaXMgb3VyIHJlY29tbWVuZGVkIGFwcHJvYWNoIGZvciB3cml0aW5nIFJlZHV4IGxvZ2ljIHRvZGF5LFxuICogaW5jbHVkaW5nIHN0b3JlIHNldHVwLCByZWR1Y2VycywgZGF0YSBmZXRjaGluZywgYW5kIG1vcmUuXG4gKlxuICogKipGb3IgbW9yZSBkZXRhaWxzLCBwbGVhc2UgcmVhZCB0aGlzIFJlZHV4IGRvY3MgcGFnZToqKlxuICogKipodHRwczovL3JlZHV4LmpzLm9yZy9pbnRyb2R1Y3Rpb24vd2h5LXJ0ay1pcy1yZWR1eC10b2RheSoqXG4gKlxuICogYGNvbmZpZ3VyZVN0b3JlYCBmcm9tIFJlZHV4IFRvb2xraXQgaXMgYW4gaW1wcm92ZWQgdmVyc2lvbiBvZiBgY3JlYXRlU3RvcmVgIHRoYXRcbiAqIHNpbXBsaWZpZXMgc2V0dXAgYW5kIGhlbHBzIGF2b2lkIGNvbW1vbiBidWdzLlxuICpcbiAqIFlvdSBzaG91bGQgbm90IGJlIHVzaW5nIHRoZSBgcmVkdXhgIGNvcmUgcGFja2FnZSBieSBpdHNlbGYgdG9kYXksIGV4Y2VwdCBmb3IgbGVhcm5pbmcgcHVycG9zZXMuXG4gKiBUaGUgYGNyZWF0ZVN0b3JlYCBtZXRob2QgZnJvbSB0aGUgY29yZSBgcmVkdXhgIHBhY2thZ2Ugd2lsbCBub3QgYmUgcmVtb3ZlZCwgYnV0IHdlIGVuY291cmFnZVxuICogYWxsIHVzZXJzIHRvIG1pZ3JhdGUgdG8gdXNpbmcgUmVkdXggVG9vbGtpdCBmb3IgYWxsIFJlZHV4IGNvZGUuXG4gKlxuICogSWYgeW91IHdhbnQgdG8gdXNlIGBjcmVhdGVTdG9yZWAgd2l0aG91dCB0aGlzIHZpc3VhbCBkZXByZWNhdGlvbiB3YXJuaW5nLCB1c2VcbiAqIHRoZSBgbGVnYWN5X2NyZWF0ZVN0b3JlYCBpbXBvcnQgaW5zdGVhZDpcbiAqXG4gKiBgaW1wb3J0IHsgbGVnYWN5X2NyZWF0ZVN0b3JlIGFzIGNyZWF0ZVN0b3JlfSBmcm9tICdyZWR1eCdgXG4gKlxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZVN0b3JlKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBlbmhhbmNlcikge1xuICB2YXIgX3JlZjI7XG5cbiAgaWYgKHR5cGVvZiBwcmVsb2FkZWRTdGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZW5oYW5jZXIgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGVuaGFuY2VyID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBhcmd1bWVudHNbM10gPT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgwKSA6ICdJdCBsb29rcyBsaWtlIHlvdSBhcmUgcGFzc2luZyBzZXZlcmFsIHN0b3JlIGVuaGFuY2VycyB0byAnICsgJ2NyZWF0ZVN0b3JlKCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gSW5zdGVhZCwgY29tcG9zZSB0aGVtICcgKyAndG9nZXRoZXIgdG8gYSBzaW5nbGUgZnVuY3Rpb24uIFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy90dXRvcmlhbHMvZnVuZGFtZW50YWxzL3BhcnQtNC1zdG9yZSNjcmVhdGluZy1hLXN0b3JlLXdpdGgtZW5oYW5jZXJzIGZvciBhbiBleGFtcGxlLicpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwcmVsb2FkZWRTdGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZW5oYW5jZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgZW5oYW5jZXIgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgICBwcmVsb2FkZWRTdGF0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZW5oYW5jZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMSkgOiBcIkV4cGVjdGVkIHRoZSBlbmhhbmNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJ1wiICsga2luZE9mKGVuaGFuY2VyKSArIFwiJ1wiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW5oYW5jZXIoY3JlYXRlU3RvcmUpKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcmVkdWNlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDIpIDogXCJFeHBlY3RlZCB0aGUgcm9vdCByZWR1Y2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YocmVkdWNlcikgKyBcIidcIik7XG4gIH1cblxuICB2YXIgY3VycmVudFJlZHVjZXIgPSByZWR1Y2VyO1xuICB2YXIgY3VycmVudFN0YXRlID0gcHJlbG9hZGVkU3RhdGU7XG4gIHZhciBjdXJyZW50TGlzdGVuZXJzID0gW107XG4gIHZhciBuZXh0TGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycztcbiAgdmFyIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFRoaXMgbWFrZXMgYSBzaGFsbG93IGNvcHkgb2YgY3VycmVudExpc3RlbmVycyBzbyB3ZSBjYW4gdXNlXG4gICAqIG5leHRMaXN0ZW5lcnMgYXMgYSB0ZW1wb3JhcnkgbGlzdCB3aGlsZSBkaXNwYXRjaGluZy5cbiAgICpcbiAgICogVGhpcyBwcmV2ZW50cyBhbnkgYnVncyBhcm91bmQgY29uc3VtZXJzIGNhbGxpbmdcbiAgICogc3Vic2NyaWJlL3Vuc3Vic2NyaWJlIGluIHRoZSBtaWRkbGUgb2YgYSBkaXNwYXRjaC5cbiAgICovXG5cbiAgZnVuY3Rpb24gZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpIHtcbiAgICBpZiAobmV4dExpc3RlbmVycyA9PT0gY3VycmVudExpc3RlbmVycykge1xuICAgICAgbmV4dExpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnMuc2xpY2UoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBzdGF0ZSB0cmVlIG1hbmFnZWQgYnkgdGhlIHN0b3JlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7YW55fSBUaGUgY3VycmVudCBzdGF0ZSB0cmVlIG9mIHlvdXIgYXBwbGljYXRpb24uXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZ2V0U3RhdGUoKSB7XG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMpIDogJ1lvdSBtYXkgbm90IGNhbGwgc3RvcmUuZ2V0U3RhdGUoKSB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnVGhlIHJlZHVjZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgdGhlIHN0YXRlIGFzIGFuIGFyZ3VtZW50LiAnICsgJ1Bhc3MgaXQgZG93biBmcm9tIHRoZSB0b3AgcmVkdWNlciBpbnN0ZWFkIG9mIHJlYWRpbmcgaXQgZnJvbSB0aGUgc3RvcmUuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRTdGF0ZTtcbiAgfVxuICAvKipcbiAgICogQWRkcyBhIGNoYW5nZSBsaXN0ZW5lci4gSXQgd2lsbCBiZSBjYWxsZWQgYW55IHRpbWUgYW4gYWN0aW9uIGlzIGRpc3BhdGNoZWQsXG4gICAqIGFuZCBzb21lIHBhcnQgb2YgdGhlIHN0YXRlIHRyZWUgbWF5IHBvdGVudGlhbGx5IGhhdmUgY2hhbmdlZC4gWW91IG1heSB0aGVuXG4gICAqIGNhbGwgYGdldFN0YXRlKClgIHRvIHJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgdHJlZSBpbnNpZGUgdGhlIGNhbGxiYWNrLlxuICAgKlxuICAgKiBZb3UgbWF5IGNhbGwgYGRpc3BhdGNoKClgIGZyb20gYSBjaGFuZ2UgbGlzdGVuZXIsIHdpdGggdGhlIGZvbGxvd2luZ1xuICAgKiBjYXZlYXRzOlxuICAgKlxuICAgKiAxLiBUaGUgc3Vic2NyaXB0aW9ucyBhcmUgc25hcHNob3R0ZWQganVzdCBiZWZvcmUgZXZlcnkgYGRpc3BhdGNoKClgIGNhbGwuXG4gICAqIElmIHlvdSBzdWJzY3JpYmUgb3IgdW5zdWJzY3JpYmUgd2hpbGUgdGhlIGxpc3RlbmVycyBhcmUgYmVpbmcgaW52b2tlZCwgdGhpc1xuICAgKiB3aWxsIG5vdCBoYXZlIGFueSBlZmZlY3Qgb24gdGhlIGBkaXNwYXRjaCgpYCB0aGF0IGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcy5cbiAgICogSG93ZXZlciwgdGhlIG5leHQgYGRpc3BhdGNoKClgIGNhbGwsIHdoZXRoZXIgbmVzdGVkIG9yIG5vdCwgd2lsbCB1c2UgYSBtb3JlXG4gICAqIHJlY2VudCBzbmFwc2hvdCBvZiB0aGUgc3Vic2NyaXB0aW9uIGxpc3QuXG4gICAqXG4gICAqIDIuIFRoZSBsaXN0ZW5lciBzaG91bGQgbm90IGV4cGVjdCB0byBzZWUgYWxsIHN0YXRlIGNoYW5nZXMsIGFzIHRoZSBzdGF0ZVxuICAgKiBtaWdodCBoYXZlIGJlZW4gdXBkYXRlZCBtdWx0aXBsZSB0aW1lcyBkdXJpbmcgYSBuZXN0ZWQgYGRpc3BhdGNoKClgIGJlZm9yZVxuICAgKiB0aGUgbGlzdGVuZXIgaXMgY2FsbGVkLiBJdCBpcywgaG93ZXZlciwgZ3VhcmFudGVlZCB0aGF0IGFsbCBzdWJzY3JpYmVyc1xuICAgKiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgYGRpc3BhdGNoKClgIHN0YXJ0ZWQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgbGF0ZXN0XG4gICAqIHN0YXRlIGJ5IHRoZSB0aW1lIGl0IGV4aXRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBBIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgb24gZXZlcnkgZGlzcGF0Y2guXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBmdW5jdGlvbiB0byByZW1vdmUgdGhpcyBjaGFuZ2UgbGlzdGVuZXIuXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNCkgOiBcIkV4cGVjdGVkIHRoZSBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJ1wiICsga2luZE9mKGxpc3RlbmVyKSArIFwiJ1wiKTtcbiAgICB9XG5cbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNSkgOiAnWW91IG1heSBub3QgY2FsbCBzdG9yZS5zdWJzY3JpYmUoKSB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnSWYgeW91IHdvdWxkIGxpa2UgdG8gYmUgbm90aWZpZWQgYWZ0ZXIgdGhlIHN0b3JlIGhhcyBiZWVuIHVwZGF0ZWQsIHN1YnNjcmliZSBmcm9tIGEgJyArICdjb21wb25lbnQgYW5kIGludm9rZSBzdG9yZS5nZXRTdGF0ZSgpIGluIHRoZSBjYWxsYmFjayB0byBhY2Nlc3MgdGhlIGxhdGVzdCBzdGF0ZS4gJyArICdTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvYXBpL3N0b3JlI3N1YnNjcmliZWxpc3RlbmVyIGZvciBtb3JlIGRldGFpbHMuJyk7XG4gICAgfVxuXG4gICAgdmFyIGlzU3Vic2NyaWJlZCA9IHRydWU7XG4gICAgZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpO1xuICAgIG5leHRMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkge1xuICAgICAgaWYgKCFpc1N1YnNjcmliZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg2KSA6ICdZb3UgbWF5IG5vdCB1bnN1YnNjcmliZSBmcm9tIGEgc3RvcmUgbGlzdGVuZXIgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiAnICsgJ1NlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGkvc3RvcmUjc3Vic2NyaWJlbGlzdGVuZXIgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgICAgIH1cblxuICAgICAgaXNTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgICB2YXIgaW5kZXggPSBuZXh0TGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgbmV4dExpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgY3VycmVudExpc3RlbmVycyA9IG51bGw7XG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhbiBhY3Rpb24uIEl0IGlzIHRoZSBvbmx5IHdheSB0byB0cmlnZ2VyIGEgc3RhdGUgY2hhbmdlLlxuICAgKlxuICAgKiBUaGUgYHJlZHVjZXJgIGZ1bmN0aW9uLCB1c2VkIHRvIGNyZWF0ZSB0aGUgc3RvcmUsIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlXG4gICAqIGN1cnJlbnQgc3RhdGUgdHJlZSBhbmQgdGhlIGdpdmVuIGBhY3Rpb25gLiBJdHMgcmV0dXJuIHZhbHVlIHdpbGxcbiAgICogYmUgY29uc2lkZXJlZCB0aGUgKipuZXh0Kiogc3RhdGUgb2YgdGhlIHRyZWUsIGFuZCB0aGUgY2hhbmdlIGxpc3RlbmVyc1xuICAgKiB3aWxsIGJlIG5vdGlmaWVkLlxuICAgKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvbmx5IHN1cHBvcnRzIHBsYWluIG9iamVjdCBhY3Rpb25zLiBJZiB5b3Ugd2FudCB0b1xuICAgKiBkaXNwYXRjaCBhIFByb21pc2UsIGFuIE9ic2VydmFibGUsIGEgdGh1bmssIG9yIHNvbWV0aGluZyBlbHNlLCB5b3UgbmVlZCB0b1xuICAgKiB3cmFwIHlvdXIgc3RvcmUgY3JlYXRpbmcgZnVuY3Rpb24gaW50byB0aGUgY29ycmVzcG9uZGluZyBtaWRkbGV3YXJlLiBGb3JcbiAgICogZXhhbXBsZSwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgYHJlZHV4LXRodW5rYCBwYWNrYWdlLiBFdmVuIHRoZVxuICAgKiBtaWRkbGV3YXJlIHdpbGwgZXZlbnR1YWxseSBkaXNwYXRjaCBwbGFpbiBvYmplY3QgYWN0aW9ucyB1c2luZyB0aGlzIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGFjdGlvbiBBIHBsYWluIG9iamVjdCByZXByZXNlbnRpbmcg4oCcd2hhdCBjaGFuZ2Vk4oCdLiBJdCBpc1xuICAgKiBhIGdvb2QgaWRlYSB0byBrZWVwIGFjdGlvbnMgc2VyaWFsaXphYmxlIHNvIHlvdSBjYW4gcmVjb3JkIGFuZCByZXBsYXkgdXNlclxuICAgKiBzZXNzaW9ucywgb3IgdXNlIHRoZSB0aW1lIHRyYXZlbGxpbmcgYHJlZHV4LWRldnRvb2xzYC4gQW4gYWN0aW9uIG11c3QgaGF2ZVxuICAgKiBhIGB0eXBlYCBwcm9wZXJ0eSB3aGljaCBtYXkgbm90IGJlIGB1bmRlZmluZWRgLiBJdCBpcyBhIGdvb2QgaWRlYSB0byB1c2VcbiAgICogc3RyaW5nIGNvbnN0YW50cyBmb3IgYWN0aW9uIHR5cGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBGb3IgY29udmVuaWVuY2UsIHRoZSBzYW1lIGFjdGlvbiBvYmplY3QgeW91IGRpc3BhdGNoZWQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCwgaWYgeW91IHVzZSBhIGN1c3RvbSBtaWRkbGV3YXJlLCBpdCBtYXkgd3JhcCBgZGlzcGF0Y2goKWAgdG9cbiAgICogcmV0dXJuIHNvbWV0aGluZyBlbHNlIChmb3IgZXhhbXBsZSwgYSBQcm9taXNlIHlvdSBjYW4gYXdhaXQpLlxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGRpc3BhdGNoKGFjdGlvbikge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChhY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg3KSA6IFwiQWN0aW9ucyBtdXN0IGJlIHBsYWluIG9iamVjdHMuIEluc3RlYWQsIHRoZSBhY3R1YWwgdHlwZSB3YXM6ICdcIiArIGtpbmRPZihhY3Rpb24pICsgXCInLiBZb3UgbWF5IG5lZWQgdG8gYWRkIG1pZGRsZXdhcmUgdG8geW91ciBzdG9yZSBzZXR1cCB0byBoYW5kbGUgZGlzcGF0Y2hpbmcgb3RoZXIgdmFsdWVzLCBzdWNoIGFzICdyZWR1eC10aHVuaycgdG8gaGFuZGxlIGRpc3BhdGNoaW5nIGZ1bmN0aW9ucy4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI21pZGRsZXdhcmUgYW5kIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC02LWFzeW5jLWxvZ2ljI3VzaW5nLXRoZS1yZWR1eC10aHVuay1taWRkbGV3YXJlIGZvciBleGFtcGxlcy5cIik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb24udHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDgpIDogJ0FjdGlvbnMgbWF5IG5vdCBoYXZlIGFuIHVuZGVmaW5lZCBcInR5cGVcIiBwcm9wZXJ0eS4gWW91IG1heSBoYXZlIG1pc3NwZWxsZWQgYW4gYWN0aW9uIHR5cGUgc3RyaW5nIGNvbnN0YW50LicpO1xuICAgIH1cblxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg5KSA6ICdSZWR1Y2VycyBtYXkgbm90IGRpc3BhdGNoIGFjdGlvbnMuJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSB0cnVlO1xuICAgICAgY3VycmVudFN0YXRlID0gY3VycmVudFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGxpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnMgPSBuZXh0TGlzdGVuZXJzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTtcbiAgICAgIGxpc3RlbmVyKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvbjtcbiAgfVxuICAvKipcbiAgICogUmVwbGFjZXMgdGhlIHJlZHVjZXIgY3VycmVudGx5IHVzZWQgYnkgdGhlIHN0b3JlIHRvIGNhbGN1bGF0ZSB0aGUgc3RhdGUuXG4gICAqXG4gICAqIFlvdSBtaWdodCBuZWVkIHRoaXMgaWYgeW91ciBhcHAgaW1wbGVtZW50cyBjb2RlIHNwbGl0dGluZyBhbmQgeW91IHdhbnQgdG9cbiAgICogbG9hZCBzb21lIG9mIHRoZSByZWR1Y2VycyBkeW5hbWljYWxseS4gWW91IG1pZ2h0IGFsc28gbmVlZCB0aGlzIGlmIHlvdVxuICAgKiBpbXBsZW1lbnQgYSBob3QgcmVsb2FkaW5nIG1lY2hhbmlzbSBmb3IgUmVkdXguXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG5leHRSZWR1Y2VyIFRoZSByZWR1Y2VyIGZvciB0aGUgc3RvcmUgdG8gdXNlIGluc3RlYWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIHJlcGxhY2VSZWR1Y2VyKG5leHRSZWR1Y2VyKSB7XG4gICAgaWYgKHR5cGVvZiBuZXh0UmVkdWNlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTApIDogXCJFeHBlY3RlZCB0aGUgbmV4dFJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihuZXh0UmVkdWNlcikpO1xuICAgIH1cblxuICAgIGN1cnJlbnRSZWR1Y2VyID0gbmV4dFJlZHVjZXI7IC8vIFRoaXMgYWN0aW9uIGhhcyBhIHNpbWlsaWFyIGVmZmVjdCB0byBBY3Rpb25UeXBlcy5JTklULlxuICAgIC8vIEFueSByZWR1Y2VycyB0aGF0IGV4aXN0ZWQgaW4gYm90aCB0aGUgbmV3IGFuZCBvbGQgcm9vdFJlZHVjZXJcbiAgICAvLyB3aWxsIHJlY2VpdmUgdGhlIHByZXZpb3VzIHN0YXRlLiBUaGlzIGVmZmVjdGl2ZWx5IHBvcHVsYXRlc1xuICAgIC8vIHRoZSBuZXcgc3RhdGUgdHJlZSB3aXRoIGFueSByZWxldmFudCBkYXRhIGZyb20gdGhlIG9sZCBvbmUuXG5cbiAgICBkaXNwYXRjaCh7XG4gICAgICB0eXBlOiBBY3Rpb25UeXBlcy5SRVBMQUNFXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEludGVyb3BlcmFiaWxpdHkgcG9pbnQgZm9yIG9ic2VydmFibGUvcmVhY3RpdmUgbGlicmFyaWVzLlxuICAgKiBAcmV0dXJucyB7b2JzZXJ2YWJsZX0gQSBtaW5pbWFsIG9ic2VydmFibGUgb2Ygc3RhdGUgY2hhbmdlcy5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgb2JzZXJ2YWJsZSBwcm9wb3NhbDpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JzZXJ2YWJsZVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIG9ic2VydmFibGUoKSB7XG4gICAgdmFyIF9yZWY7XG5cbiAgICB2YXIgb3V0ZXJTdWJzY3JpYmUgPSBzdWJzY3JpYmU7XG4gICAgcmV0dXJuIF9yZWYgPSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBtaW5pbWFsIG9ic2VydmFibGUgc3Vic2NyaXB0aW9uIG1ldGhvZC5cbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYnNlcnZlciBBbnkgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gb2JzZXJ2ZXIuXG4gICAgICAgKiBUaGUgb2JzZXJ2ZXIgb2JqZWN0IHNob3VsZCBoYXZlIGEgYG5leHRgIG1ldGhvZC5cbiAgICAgICAqIEByZXR1cm5zIHtzdWJzY3JpcHRpb259IEFuIG9iamVjdCB3aXRoIGFuIGB1bnN1YnNjcmliZWAgbWV0aG9kIHRoYXQgY2FuXG4gICAgICAgKiBiZSB1c2VkIHRvIHVuc3Vic2NyaWJlIHRoZSBvYnNlcnZhYmxlIGZyb20gdGhlIHN0b3JlLCBhbmQgcHJldmVudCBmdXJ0aGVyXG4gICAgICAgKiBlbWlzc2lvbiBvZiB2YWx1ZXMgZnJvbSB0aGUgb2JzZXJ2YWJsZS5cbiAgICAgICAqL1xuICAgICAgc3Vic2NyaWJlOiBmdW5jdGlvbiBzdWJzY3JpYmUob2JzZXJ2ZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYnNlcnZlciAhPT0gJ29iamVjdCcgfHwgb2JzZXJ2ZXIgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMSkgOiBcIkV4cGVjdGVkIHRoZSBvYnNlcnZlciB0byBiZSBhbiBvYmplY3QuIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2Yob2JzZXJ2ZXIpICsgXCInXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gb2JzZXJ2ZVN0YXRlKCkge1xuICAgICAgICAgIGlmIChvYnNlcnZlci5uZXh0KSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KGdldFN0YXRlKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG9ic2VydmVTdGF0ZSgpO1xuICAgICAgICB2YXIgdW5zdWJzY3JpYmUgPSBvdXRlclN1YnNjcmliZShvYnNlcnZlU3RhdGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVuc3Vic2NyaWJlOiB1bnN1YnNjcmliZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sIF9yZWZbJCRvYnNlcnZhYmxlXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sIF9yZWY7XG4gIH0gLy8gV2hlbiBhIHN0b3JlIGlzIGNyZWF0ZWQsIGFuIFwiSU5JVFwiIGFjdGlvbiBpcyBkaXNwYXRjaGVkIHNvIHRoYXQgZXZlcnlcbiAgLy8gcmVkdWNlciByZXR1cm5zIHRoZWlyIGluaXRpYWwgc3RhdGUuIFRoaXMgZWZmZWN0aXZlbHkgcG9wdWxhdGVzXG4gIC8vIHRoZSBpbml0aWFsIHN0YXRlIHRyZWUuXG5cblxuICBkaXNwYXRjaCh7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuSU5JVFxuICB9KTtcbiAgcmV0dXJuIF9yZWYyID0ge1xuICAgIGRpc3BhdGNoOiBkaXNwYXRjaCxcbiAgICBzdWJzY3JpYmU6IHN1YnNjcmliZSxcbiAgICBnZXRTdGF0ZTogZ2V0U3RhdGUsXG4gICAgcmVwbGFjZVJlZHVjZXI6IHJlcGxhY2VSZWR1Y2VyXG4gIH0sIF9yZWYyWyQkb2JzZXJ2YWJsZV0gPSBvYnNlcnZhYmxlLCBfcmVmMjtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIFJlZHV4IHN0b3JlIHRoYXQgaG9sZHMgdGhlIHN0YXRlIHRyZWUuXG4gKlxuICogKipXZSByZWNvbW1lbmQgdXNpbmcgYGNvbmZpZ3VyZVN0b3JlYCBmcm9tIHRoZVxuICogYEByZWR1eGpzL3Rvb2xraXRgIHBhY2thZ2UqKiwgd2hpY2ggcmVwbGFjZXMgYGNyZWF0ZVN0b3JlYDpcbiAqICoqaHR0cHM6Ly9yZWR1eC5qcy5vcmcvaW50cm9kdWN0aW9uL3doeS1ydGstaXMtcmVkdXgtdG9kYXkqKlxuICpcbiAqIFRoZSBvbmx5IHdheSB0byBjaGFuZ2UgdGhlIGRhdGEgaW4gdGhlIHN0b3JlIGlzIHRvIGNhbGwgYGRpc3BhdGNoKClgIG9uIGl0LlxuICpcbiAqIFRoZXJlIHNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIHN0b3JlIGluIHlvdXIgYXBwLiBUbyBzcGVjaWZ5IGhvdyBkaWZmZXJlbnRcbiAqIHBhcnRzIG9mIHRoZSBzdGF0ZSB0cmVlIHJlc3BvbmQgdG8gYWN0aW9ucywgeW91IG1heSBjb21iaW5lIHNldmVyYWwgcmVkdWNlcnNcbiAqIGludG8gYSBzaW5nbGUgcmVkdWNlciBmdW5jdGlvbiBieSB1c2luZyBgY29tYmluZVJlZHVjZXJzYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWR1Y2VyIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBuZXh0IHN0YXRlIHRyZWUsIGdpdmVuXG4gKiB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgYWN0aW9uIHRvIGhhbmRsZS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gW3ByZWxvYWRlZFN0YXRlXSBUaGUgaW5pdGlhbCBzdGF0ZS4gWW91IG1heSBvcHRpb25hbGx5IHNwZWNpZnkgaXRcbiAqIHRvIGh5ZHJhdGUgdGhlIHN0YXRlIGZyb20gdGhlIHNlcnZlciBpbiB1bml2ZXJzYWwgYXBwcywgb3IgdG8gcmVzdG9yZSBhXG4gKiBwcmV2aW91c2x5IHNlcmlhbGl6ZWQgdXNlciBzZXNzaW9uLlxuICogSWYgeW91IHVzZSBgY29tYmluZVJlZHVjZXJzYCB0byBwcm9kdWNlIHRoZSByb290IHJlZHVjZXIgZnVuY3Rpb24sIHRoaXMgbXVzdCBiZVxuICogYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgc2hhcGUgYXMgYGNvbWJpbmVSZWR1Y2Vyc2Aga2V5cy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZW5oYW5jZXJdIFRoZSBzdG9yZSBlbmhhbmNlci4gWW91IG1heSBvcHRpb25hbGx5IHNwZWNpZnkgaXRcbiAqIHRvIGVuaGFuY2UgdGhlIHN0b3JlIHdpdGggdGhpcmQtcGFydHkgY2FwYWJpbGl0aWVzIHN1Y2ggYXMgbWlkZGxld2FyZSxcbiAqIHRpbWUgdHJhdmVsLCBwZXJzaXN0ZW5jZSwgZXRjLiBUaGUgb25seSBzdG9yZSBlbmhhbmNlciB0aGF0IHNoaXBzIHdpdGggUmVkdXhcbiAqIGlzIGBhcHBseU1pZGRsZXdhcmUoKWAuXG4gKlxuICogQHJldHVybnMge1N0b3JlfSBBIFJlZHV4IHN0b3JlIHRoYXQgbGV0cyB5b3UgcmVhZCB0aGUgc3RhdGUsIGRpc3BhdGNoIGFjdGlvbnNcbiAqIGFuZCBzdWJzY3JpYmUgdG8gY2hhbmdlcy5cbiAqL1xuXG52YXIgbGVnYWN5X2NyZWF0ZVN0b3JlID0gY3JlYXRlU3RvcmU7XG5cbi8qKlxuICogUHJpbnRzIGEgd2FybmluZyBpbiB0aGUgY29uc29sZSBpZiBpdCBleGlzdHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIHdhcm5pbmcgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB3YXJuaW5nKG1lc3NhZ2UpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cblxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCBpZiB5b3UgZW5hYmxlXG4gICAgLy8gXCJicmVhayBvbiBhbGwgZXhjZXB0aW9uc1wiIGluIHlvdXIgY29uc29sZSxcbiAgICAvLyBpdCB3b3VsZCBwYXVzZSB0aGUgZXhlY3V0aW9uIGF0IHRoaXMgbGluZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIH0gY2F0Y2ggKGUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcblxufVxuXG5mdW5jdGlvbiBnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlKGlucHV0U3RhdGUsIHJlZHVjZXJzLCBhY3Rpb24sIHVuZXhwZWN0ZWRLZXlDYWNoZSkge1xuICB2YXIgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIHZhciBhcmd1bWVudE5hbWUgPSBhY3Rpb24gJiYgYWN0aW9uLnR5cGUgPT09IEFjdGlvblR5cGVzLklOSVQgPyAncHJlbG9hZGVkU3RhdGUgYXJndW1lbnQgcGFzc2VkIHRvIGNyZWF0ZVN0b3JlJyA6ICdwcmV2aW91cyBzdGF0ZSByZWNlaXZlZCBieSB0aGUgcmVkdWNlcic7XG5cbiAgaWYgKHJlZHVjZXJLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnU3RvcmUgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHJlZHVjZXIuIE1ha2Ugc3VyZSB0aGUgYXJndW1lbnQgcGFzc2VkICcgKyAndG8gY29tYmluZVJlZHVjZXJzIGlzIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIHJlZHVjZXJzLic7XG4gIH1cblxuICBpZiAoIWlzUGxhaW5PYmplY3QoaW5wdXRTdGF0ZSkpIHtcbiAgICByZXR1cm4gXCJUaGUgXCIgKyBhcmd1bWVudE5hbWUgKyBcIiBoYXMgdW5leHBlY3RlZCB0eXBlIG9mIFxcXCJcIiArIGtpbmRPZihpbnB1dFN0YXRlKSArIFwiXFxcIi4gRXhwZWN0ZWQgYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBcIiArIChcImtleXM6IFxcXCJcIiArIHJlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiXCIpO1xuICB9XG5cbiAgdmFyIHVuZXhwZWN0ZWRLZXlzID0gT2JqZWN0LmtleXMoaW5wdXRTdGF0ZSkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gIXJlZHVjZXJzLmhhc093blByb3BlcnR5KGtleSkgJiYgIXVuZXhwZWN0ZWRLZXlDYWNoZVtrZXldO1xuICB9KTtcbiAgdW5leHBlY3RlZEtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlW2tleV0gPSB0cnVlO1xuICB9KTtcbiAgaWYgKGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZXMuUkVQTEFDRSkgcmV0dXJuO1xuXG4gIGlmICh1bmV4cGVjdGVkS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIFwiVW5leHBlY3RlZCBcIiArICh1bmV4cGVjdGVkS2V5cy5sZW5ndGggPiAxID8gJ2tleXMnIDogJ2tleScpICsgXCIgXCIgKyAoXCJcXFwiXCIgKyB1bmV4cGVjdGVkS2V5cy5qb2luKCdcIiwgXCInKSArIFwiXFxcIiBmb3VuZCBpbiBcIiArIGFyZ3VtZW50TmFtZSArIFwiLiBcIikgKyBcIkV4cGVjdGVkIHRvIGZpbmQgb25lIG9mIHRoZSBrbm93biByZWR1Y2VyIGtleXMgaW5zdGVhZDogXCIgKyAoXCJcXFwiXCIgKyByZWR1Y2VyS2V5cy5qb2luKCdcIiwgXCInKSArIFwiXFxcIi4gVW5leHBlY3RlZCBrZXlzIHdpbGwgYmUgaWdub3JlZC5cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0UmVkdWNlclNoYXBlKHJlZHVjZXJzKSB7XG4gIE9iamVjdC5rZXlzKHJlZHVjZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgcmVkdWNlciA9IHJlZHVjZXJzW2tleV07XG4gICAgdmFyIGluaXRpYWxTdGF0ZSA9IHJlZHVjZXIodW5kZWZpbmVkLCB7XG4gICAgICB0eXBlOiBBY3Rpb25UeXBlcy5JTklUXG4gICAgfSk7XG5cbiAgICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEyKSA6IFwiVGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgcmV0dXJuZWQgdW5kZWZpbmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4gXCIgKyBcIklmIHRoZSBzdGF0ZSBwYXNzZWQgdG8gdGhlIHJlZHVjZXIgaXMgdW5kZWZpbmVkLCB5b3UgbXVzdCBcIiArIFwiZXhwbGljaXRseSByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBcIiArIFwibm90IGJlIHVuZGVmaW5lZC4gSWYgeW91IGRvbid0IHdhbnQgdG8gc2V0IGEgdmFsdWUgZm9yIHRoaXMgcmVkdWNlciwgXCIgKyBcInlvdSBjYW4gdXNlIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVkdWNlcih1bmRlZmluZWQsIHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLlBST0JFX1VOS05PV05fQUNUSU9OKClcbiAgICB9KSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEzKSA6IFwiVGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgcmV0dXJuZWQgdW5kZWZpbmVkIHdoZW4gcHJvYmVkIHdpdGggYSByYW5kb20gdHlwZS4gXCIgKyAoXCJEb24ndCB0cnkgdG8gaGFuZGxlICdcIiArIEFjdGlvblR5cGVzLklOSVQgKyBcIicgb3Igb3RoZXIgYWN0aW9ucyBpbiBcXFwicmVkdXgvKlxcXCIgXCIpICsgXCJuYW1lc3BhY2UuIFRoZXkgYXJlIGNvbnNpZGVyZWQgcHJpdmF0ZS4gSW5zdGVhZCwgeW91IG11c3QgcmV0dXJuIHRoZSBcIiArIFwiY3VycmVudCBzdGF0ZSBmb3IgYW55IHVua25vd24gYWN0aW9ucywgdW5sZXNzIGl0IGlzIHVuZGVmaW5lZCwgXCIgKyBcImluIHdoaWNoIGNhc2UgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLCByZWdhcmRsZXNzIG9mIHRoZSBcIiArIFwiYWN0aW9uIHR5cGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBub3QgYmUgdW5kZWZpbmVkLCBidXQgY2FuIGJlIG51bGwuXCIpO1xuICAgIH1cbiAgfSk7XG59XG4vKipcbiAqIFR1cm5zIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIGRpZmZlcmVudCByZWR1Y2VyIGZ1bmN0aW9ucywgaW50byBhIHNpbmdsZVxuICogcmVkdWNlciBmdW5jdGlvbi4gSXQgd2lsbCBjYWxsIGV2ZXJ5IGNoaWxkIHJlZHVjZXIsIGFuZCBnYXRoZXIgdGhlaXIgcmVzdWx0c1xuICogaW50byBhIHNpbmdsZSBzdGF0ZSBvYmplY3QsIHdob3NlIGtleXMgY29ycmVzcG9uZCB0byB0aGUga2V5cyBvZiB0aGUgcGFzc2VkXG4gKiByZWR1Y2VyIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcmVkdWNlcnMgQW4gb2JqZWN0IHdob3NlIHZhbHVlcyBjb3JyZXNwb25kIHRvIGRpZmZlcmVudFxuICogcmVkdWNlciBmdW5jdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGNvbWJpbmVkIGludG8gb25lLiBPbmUgaGFuZHkgd2F5IHRvIG9idGFpblxuICogaXQgaXMgdG8gdXNlIEVTNiBgaW1wb3J0ICogYXMgcmVkdWNlcnNgIHN5bnRheC4gVGhlIHJlZHVjZXJzIG1heSBuZXZlciByZXR1cm5cbiAqIHVuZGVmaW5lZCBmb3IgYW55IGFjdGlvbi4gSW5zdGVhZCwgdGhleSBzaG91bGQgcmV0dXJuIHRoZWlyIGluaXRpYWwgc3RhdGVcbiAqIGlmIHRoZSBzdGF0ZSBwYXNzZWQgdG8gdGhlbSB3YXMgdW5kZWZpbmVkLCBhbmQgdGhlIGN1cnJlbnQgc3RhdGUgZm9yIGFueVxuICogdW5yZWNvZ25pemVkIGFjdGlvbi5cbiAqXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgcmVkdWNlciBmdW5jdGlvbiB0aGF0IGludm9rZXMgZXZlcnkgcmVkdWNlciBpbnNpZGUgdGhlXG4gKiBwYXNzZWQgb2JqZWN0LCBhbmQgYnVpbGRzIGEgc3RhdGUgb2JqZWN0IHdpdGggdGhlIHNhbWUgc2hhcGUuXG4gKi9cblxuXG5mdW5jdGlvbiBjb21iaW5lUmVkdWNlcnMocmVkdWNlcnMpIHtcbiAgdmFyIHJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMocmVkdWNlcnMpO1xuICB2YXIgZmluYWxSZWR1Y2VycyA9IHt9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmVkdWNlcktleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gcmVkdWNlcktleXNbaV07XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKHR5cGVvZiByZWR1Y2Vyc1trZXldID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB3YXJuaW5nKFwiTm8gcmVkdWNlciBwcm92aWRlZCBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIlwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZpbmFsUmVkdWNlcnNba2V5XSA9IHJlZHVjZXJzW2tleV07XG4gICAgfVxuICB9XG5cbiAgdmFyIGZpbmFsUmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhmaW5hbFJlZHVjZXJzKTsgLy8gVGhpcyBpcyB1c2VkIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCB3YXJuIGFib3V0IHRoZSBzYW1lXG4gIC8vIGtleXMgbXVsdGlwbGUgdGltZXMuXG5cbiAgdmFyIHVuZXhwZWN0ZWRLZXlDYWNoZTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHVuZXhwZWN0ZWRLZXlDYWNoZSA9IHt9O1xuICB9XG5cbiAgdmFyIHNoYXBlQXNzZXJ0aW9uRXJyb3I7XG5cbiAgdHJ5IHtcbiAgICBhc3NlcnRSZWR1Y2VyU2hhcGUoZmluYWxSZWR1Y2Vycyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaGFwZUFzc2VydGlvbkVycm9yID0gZTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBjb21iaW5hdGlvbihzdGF0ZSwgYWN0aW9uKSB7XG4gICAgaWYgKHN0YXRlID09PSB2b2lkIDApIHtcbiAgICAgIHN0YXRlID0ge307XG4gICAgfVxuXG4gICAgaWYgKHNoYXBlQXNzZXJ0aW9uRXJyb3IpIHtcbiAgICAgIHRocm93IHNoYXBlQXNzZXJ0aW9uRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciB3YXJuaW5nTWVzc2FnZSA9IGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2Uoc3RhdGUsIGZpbmFsUmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKTtcblxuICAgICAgaWYgKHdhcm5pbmdNZXNzYWdlKSB7XG4gICAgICAgIHdhcm5pbmcod2FybmluZ01lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBoYXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgdmFyIG5leHRTdGF0ZSA9IHt9O1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGZpbmFsUmVkdWNlcktleXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2tleSA9IGZpbmFsUmVkdWNlcktleXNbX2ldO1xuICAgICAgdmFyIHJlZHVjZXIgPSBmaW5hbFJlZHVjZXJzW19rZXldO1xuICAgICAgdmFyIHByZXZpb3VzU3RhdGVGb3JLZXkgPSBzdGF0ZVtfa2V5XTtcbiAgICAgIHZhciBuZXh0U3RhdGVGb3JLZXkgPSByZWR1Y2VyKHByZXZpb3VzU3RhdGVGb3JLZXksIGFjdGlvbik7XG5cbiAgICAgIGlmICh0eXBlb2YgbmV4dFN0YXRlRm9yS2V5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YXIgYWN0aW9uVHlwZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTQpIDogXCJXaGVuIGNhbGxlZCB3aXRoIGFuIGFjdGlvbiBvZiB0eXBlIFwiICsgKGFjdGlvblR5cGUgPyBcIlxcXCJcIiArIFN0cmluZyhhY3Rpb25UeXBlKSArIFwiXFxcIlwiIDogJyh1bmtub3duIHR5cGUpJykgKyBcIiwgdGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcXFwiXCIgKyBfa2V5ICsgXCJcXFwiIHJldHVybmVkIHVuZGVmaW5lZC4gXCIgKyBcIlRvIGlnbm9yZSBhbiBhY3Rpb24sIHlvdSBtdXN0IGV4cGxpY2l0bHkgcmV0dXJuIHRoZSBwcmV2aW91cyBzdGF0ZS4gXCIgKyBcIklmIHlvdSB3YW50IHRoaXMgcmVkdWNlciB0byBob2xkIG5vIHZhbHVlLCB5b3UgY2FuIHJldHVybiBudWxsIGluc3RlYWQgb2YgdW5kZWZpbmVkLlwiKTtcbiAgICAgIH1cblxuICAgICAgbmV4dFN0YXRlW19rZXldID0gbmV4dFN0YXRlRm9yS2V5O1xuICAgICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgbmV4dFN0YXRlRm9yS2V5ICE9PSBwcmV2aW91c1N0YXRlRm9yS2V5O1xuICAgIH1cblxuICAgIGhhc0NoYW5nZWQgPSBoYXNDaGFuZ2VkIHx8IGZpbmFsUmVkdWNlcktleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhzdGF0ZSkubGVuZ3RoO1xuICAgIHJldHVybiBoYXNDaGFuZ2VkID8gbmV4dFN0YXRlIDogc3RhdGU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3IsIGRpc3BhdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoKGFjdGlvbkNyZWF0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG4vKipcbiAqIFR1cm5zIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIGFjdGlvbiBjcmVhdG9ycywgaW50byBhbiBvYmplY3Qgd2l0aCB0aGVcbiAqIHNhbWUga2V5cywgYnV0IHdpdGggZXZlcnkgZnVuY3Rpb24gd3JhcHBlZCBpbnRvIGEgYGRpc3BhdGNoYCBjYWxsIHNvIHRoZXlcbiAqIG1heSBiZSBpbnZva2VkIGRpcmVjdGx5LiBUaGlzIGlzIGp1c3QgYSBjb252ZW5pZW5jZSBtZXRob2QsIGFzIHlvdSBjYW4gY2FsbFxuICogYHN0b3JlLmRpc3BhdGNoKE15QWN0aW9uQ3JlYXRvcnMuZG9Tb21ldGhpbmcoKSlgIHlvdXJzZWxmIGp1c3QgZmluZS5cbiAqXG4gKiBGb3IgY29udmVuaWVuY2UsIHlvdSBjYW4gYWxzbyBwYXNzIGFuIGFjdGlvbiBjcmVhdG9yIGFzIHRoZSBmaXJzdCBhcmd1bWVudCxcbiAqIGFuZCBnZXQgYSBkaXNwYXRjaCB3cmFwcGVkIGZ1bmN0aW9uIGluIHJldHVybi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gYWN0aW9uQ3JlYXRvcnMgQW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgYWN0aW9uXG4gKiBjcmVhdG9yIGZ1bmN0aW9ucy4gT25lIGhhbmR5IHdheSB0byBvYnRhaW4gaXQgaXMgdG8gdXNlIEVTNiBgaW1wb3J0ICogYXNgXG4gKiBzeW50YXguIFlvdSBtYXkgYWxzbyBwYXNzIGEgc2luZ2xlIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGRpc3BhdGNoIFRoZSBgZGlzcGF0Y2hgIGZ1bmN0aW9uIGF2YWlsYWJsZSBvbiB5b3VyIFJlZHV4XG4gKiBzdG9yZS5cbiAqXG4gKiBAcmV0dXJucyB7RnVuY3Rpb258T2JqZWN0fSBUaGUgb2JqZWN0IG1pbWlja2luZyB0aGUgb3JpZ2luYWwgb2JqZWN0LCBidXQgd2l0aFxuICogZXZlcnkgYWN0aW9uIGNyZWF0b3Igd3JhcHBlZCBpbnRvIHRoZSBgZGlzcGF0Y2hgIGNhbGwuIElmIHlvdSBwYXNzZWQgYVxuICogZnVuY3Rpb24gYXMgYGFjdGlvbkNyZWF0b3JzYCwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGFsc28gYmUgYSBzaW5nbGVcbiAqIGZ1bmN0aW9uLlxuICovXG5cblxuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3JzKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCkge1xuICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3JzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3JzICE9PSAnb2JqZWN0JyB8fCBhY3Rpb25DcmVhdG9ycyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE2KSA6IFwiYmluZEFjdGlvbkNyZWF0b3JzIGV4cGVjdGVkIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uLCBidXQgaW5zdGVhZCByZWNlaXZlZDogJ1wiICsga2luZE9mKGFjdGlvbkNyZWF0b3JzKSArIFwiJy4gXCIgKyBcIkRpZCB5b3Ugd3JpdGUgXFxcImltcG9ydCBBY3Rpb25DcmVhdG9ycyBmcm9tXFxcIiBpbnN0ZWFkIG9mIFxcXCJpbXBvcnQgKiBhcyBBY3Rpb25DcmVhdG9ycyBmcm9tXFxcIj9cIik7XG4gIH1cblxuICB2YXIgYm91bmRBY3Rpb25DcmVhdG9ycyA9IHt9O1xuXG4gIGZvciAodmFyIGtleSBpbiBhY3Rpb25DcmVhdG9ycykge1xuICAgIHZhciBhY3Rpb25DcmVhdG9yID0gYWN0aW9uQ3JlYXRvcnNba2V5XTtcblxuICAgIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYm91bmRBY3Rpb25DcmVhdG9yc1trZXldID0gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBib3VuZEFjdGlvbkNyZWF0b3JzO1xufVxuXG4vKipcbiAqIENvbXBvc2VzIHNpbmdsZS1hcmd1bWVudCBmdW5jdGlvbnMgZnJvbSByaWdodCB0byBsZWZ0LiBUaGUgcmlnaHRtb3N0XG4gKiBmdW5jdGlvbiBjYW4gdGFrZSBtdWx0aXBsZSBhcmd1bWVudHMgYXMgaXQgcHJvdmlkZXMgdGhlIHNpZ25hdHVyZSBmb3JcbiAqIHRoZSByZXN1bHRpbmcgY29tcG9zaXRlIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IGZ1bmNzIFRoZSBmdW5jdGlvbnMgdG8gY29tcG9zZS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBmdW5jdGlvbiBvYnRhaW5lZCBieSBjb21wb3NpbmcgdGhlIGFyZ3VtZW50IGZ1bmN0aW9uc1xuICogZnJvbSByaWdodCB0byBsZWZ0LiBGb3IgZXhhbXBsZSwgY29tcG9zZShmLCBnLCBoKSBpcyBpZGVudGljYWwgdG8gZG9pbmdcbiAqICguLi5hcmdzKSA9PiBmKGcoaCguLi5hcmdzKSkpLlxuICovXG5mdW5jdGlvbiBjb21wb3NlKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgZnVuY3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgZnVuY3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBpZiAoZnVuY3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgIHJldHVybiBhcmc7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZnVuY3NbMF07XG4gIH1cblxuICByZXR1cm4gZnVuY3MucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBhKGIuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpKTtcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RvcmUgZW5oYW5jZXIgdGhhdCBhcHBsaWVzIG1pZGRsZXdhcmUgdG8gdGhlIGRpc3BhdGNoIG1ldGhvZFxuICogb2YgdGhlIFJlZHV4IHN0b3JlLiBUaGlzIGlzIGhhbmR5IGZvciBhIHZhcmlldHkgb2YgdGFza3MsIHN1Y2ggYXMgZXhwcmVzc2luZ1xuICogYXN5bmNocm9ub3VzIGFjdGlvbnMgaW4gYSBjb25jaXNlIG1hbm5lciwgb3IgbG9nZ2luZyBldmVyeSBhY3Rpb24gcGF5bG9hZC5cbiAqXG4gKiBTZWUgYHJlZHV4LXRodW5rYCBwYWNrYWdlIGFzIGFuIGV4YW1wbGUgb2YgdGhlIFJlZHV4IG1pZGRsZXdhcmUuXG4gKlxuICogQmVjYXVzZSBtaWRkbGV3YXJlIGlzIHBvdGVudGlhbGx5IGFzeW5jaHJvbm91cywgdGhpcyBzaG91bGQgYmUgdGhlIGZpcnN0XG4gKiBzdG9yZSBlbmhhbmNlciBpbiB0aGUgY29tcG9zaXRpb24gY2hhaW4uXG4gKlxuICogTm90ZSB0aGF0IGVhY2ggbWlkZGxld2FyZSB3aWxsIGJlIGdpdmVuIHRoZSBgZGlzcGF0Y2hgIGFuZCBgZ2V0U3RhdGVgIGZ1bmN0aW9uc1xuICogYXMgbmFtZWQgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IG1pZGRsZXdhcmVzIFRoZSBtaWRkbGV3YXJlIGNoYWluIHRvIGJlIGFwcGxpZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgc3RvcmUgZW5oYW5jZXIgYXBwbHlpbmcgdGhlIG1pZGRsZXdhcmUuXG4gKi9cblxuZnVuY3Rpb24gYXBwbHlNaWRkbGV3YXJlKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbWlkZGxld2FyZXMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgbWlkZGxld2FyZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGNyZWF0ZVN0b3JlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdG9yZSA9IGNyZWF0ZVN0b3JlLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcblxuICAgICAgdmFyIF9kaXNwYXRjaCA9IGZ1bmN0aW9uIGRpc3BhdGNoKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNSkgOiAnRGlzcGF0Y2hpbmcgd2hpbGUgY29uc3RydWN0aW5nIHlvdXIgbWlkZGxld2FyZSBpcyBub3QgYWxsb3dlZC4gJyArICdPdGhlciBtaWRkbGV3YXJlIHdvdWxkIG5vdCBiZSBhcHBsaWVkIHRvIHRoaXMgZGlzcGF0Y2guJyk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgbWlkZGxld2FyZUFQSSA9IHtcbiAgICAgICAgZ2V0U3RhdGU6IHN0b3JlLmdldFN0YXRlLFxuICAgICAgICBkaXNwYXRjaDogZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gICAgICAgICAgcmV0dXJuIF9kaXNwYXRjaC5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgY2hhaW4gPSBtaWRkbGV3YXJlcy5tYXAoZnVuY3Rpb24gKG1pZGRsZXdhcmUpIHtcbiAgICAgICAgcmV0dXJuIG1pZGRsZXdhcmUobWlkZGxld2FyZUFQSSk7XG4gICAgICB9KTtcbiAgICAgIF9kaXNwYXRjaCA9IGNvbXBvc2UuYXBwbHkodm9pZCAwLCBjaGFpbikoc3RvcmUuZGlzcGF0Y2gpO1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3RvcmUpLCB7fSwge1xuICAgICAgICBkaXNwYXRjaDogX2Rpc3BhdGNoXG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgeyBBY3Rpb25UeXBlcyBhcyBfX0RPX05PVF9VU0VfX0FjdGlvblR5cGVzLCBhcHBseU1pZGRsZXdhcmUsIGJpbmRBY3Rpb25DcmVhdG9ycywgY29tYmluZVJlZHVjZXJzLCBjb21wb3NlLCBjcmVhdGVTdG9yZSwgbGVnYWN5X2NyZWF0ZVN0b3JlIH07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpc0FycmF5aXNoID0gcmVxdWlyZSgnaXMtYXJyYXlpc2gnKTtcblxudmFyIGNvbmNhdCA9IEFycmF5LnByb3RvdHlwZS5jb25jYXQ7XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbnZhciBzd2l6emxlID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzd2l6emxlKGFyZ3MpIHtcblx0dmFyIHJlc3VsdHMgPSBbXTtcblxuXHRmb3IgKHZhciBpID0gMCwgbGVuID0gYXJncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdHZhciBhcmcgPSBhcmdzW2ldO1xuXG5cdFx0aWYgKGlzQXJyYXlpc2goYXJnKSkge1xuXHRcdFx0Ly8gaHR0cDovL2pzcGVyZi5jb20vamF2YXNjcmlwdC1hcnJheS1jb25jYXQtdnMtcHVzaC85OFxuXHRcdFx0cmVzdWx0cyA9IGNvbmNhdC5jYWxsKHJlc3VsdHMsIHNsaWNlLmNhbGwoYXJnKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdHMucHVzaChhcmcpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuc3dpenpsZS53cmFwID0gZnVuY3Rpb24gKGZuKSB7XG5cdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIGZuKHN3aXp6bGUoYXJndW1lbnRzKSk7XG5cdH07XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0FycmF5aXNoKG9iaikge1xuXHRpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiBvYmogaW5zdGFuY2VvZiBBcnJheSB8fCBBcnJheS5pc0FycmF5KG9iaikgfHxcblx0XHQob2JqLmxlbmd0aCA+PSAwICYmIChvYmouc3BsaWNlIGluc3RhbmNlb2YgRnVuY3Rpb24gfHxcblx0XHRcdChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgKG9iai5sZW5ndGggLSAxKSkgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgIT09ICdTdHJpbmcnKSkpO1xufTtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9Ub29sYmFyLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vVG9vbGJhci5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL0NhbGxiYWNrR3JhcGhDb250YWluZXIuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL0Zyb250RW5kRXJyb3IuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9Gcm9udEVuZEVycm9yLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9HbG9iYWxFcnJvck92ZXJsYXkuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9HbG9iYWxFcnJvck92ZXJsYXkuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL1BlcmN5LmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vUGVyY3kuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL0RlYnVnTWVudS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL0RlYnVnTWVudS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5mdW5jdGlvbiBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gIHZhciByZXN1bHQgPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucykge1xuICB2YXIgaWRDb3VudE1hcCA9IHt9O1xuICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcbiAgdmFyIHVwZGF0ZXIgPSBmdW5jdGlvbiB1cGRhdGVyKG5ld09iaikge1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGlmIChuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXAgJiYgbmV3T2JqLnN1cHBvcnRzID09PSBvYmouc3VwcG9ydHMgJiYgbmV3T2JqLmxheWVyID09PSBvYmoubGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdXBkYXRlcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGxpc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGxpc3QgPSBsaXN0IHx8IFtdO1xuICB2YXIgbGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcbiAgICBuZXdMaXN0ID0gbmV3TGlzdCB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tfaV07XG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcbiAgICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKF9pbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMoc3R5bGVFbGVtZW50KSB7XG4gIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHVzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0uZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgICB2YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcblxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG4vKipcbiAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuICovXG5mdW5jdGlvbiBpcyh4LCB5KSB7XG4gIHJldHVybiB4ID09PSB5ICYmICh4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geSkgfHwgeCAhPT0geCAmJiB5ICE9PSB5IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIDtcbn1cblxudmFyIG9iamVjdElzID0gdHlwZW9mIE9iamVjdC5pcyA9PT0gJ2Z1bmN0aW9uJyA/IE9iamVjdC5pcyA6IGlzO1xuXG4vLyBkaXNwYXRjaCBmb3IgQ29tbW9uSlMgaW50ZXJvcCBuYW1lZCBpbXBvcnRzLlxuXG52YXIgdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSxcbiAgICB1c2VFZmZlY3QgPSBSZWFjdC51c2VFZmZlY3QsXG4gICAgdXNlTGF5b3V0RWZmZWN0ID0gUmVhY3QudXNlTGF5b3V0RWZmZWN0LFxuICAgIHVzZURlYnVnVmFsdWUgPSBSZWFjdC51c2VEZWJ1Z1ZhbHVlO1xudmFyIGRpZFdhcm5PbGQxOEFscGhhID0gZmFsc2U7XG52YXIgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSBmYWxzZTsgLy8gRGlzY2xhaW1lcjogVGhpcyBzaGltIGJyZWFrcyBtYW55IG9mIHRoZSBydWxlcyBvZiBSZWFjdCwgYW5kIG9ubHkgd29ya3Ncbi8vIGJlY2F1c2Ugb2YgYSB2ZXJ5IHBhcnRpY3VsYXIgc2V0IG9mIGltcGxlbWVudGF0aW9uIGRldGFpbHMgYW5kIGFzc3VtcHRpb25zXG4vLyAtLSBjaGFuZ2UgYW55IG9uZSBvZiB0aGVtIGFuZCBpdCB3aWxsIGJyZWFrLiBUaGUgbW9zdCBpbXBvcnRhbnQgYXNzdW1wdGlvblxuLy8gaXMgdGhhdCB1cGRhdGVzIGFyZSBhbHdheXMgc3luY2hyb25vdXMsIGJlY2F1c2UgY29uY3VycmVudCByZW5kZXJpbmcgaXNcbi8vIG9ubHkgYXZhaWxhYmxlIGluIHZlcnNpb25zIG9mIFJlYWN0IHRoYXQgYWxzbyBoYXZlIGEgYnVpbHQtaW5cbi8vIHVzZVN5bmNFeHRlcm5hbFN0b3JlIEFQSS4gQW5kIHdlIG9ubHkgdXNlIHRoaXMgc2hpbSB3aGVuIHRoZSBidWlsdC1pbiBBUElcbi8vIGRvZXMgbm90IGV4aXN0LlxuLy9cbi8vIERvIG5vdCBhc3N1bWUgdGhhdCB0aGUgY2xldmVyIGhhY2tzIHVzZWQgYnkgdGhpcyBob29rIGFsc28gd29yayBpbiBnZW5lcmFsLlxuLy8gVGhlIHBvaW50IG9mIHRoaXMgc2hpbSBpcyB0byByZXBsYWNlIHRoZSBuZWVkIGZvciBoYWNrcyBieSBvdGhlciBsaWJyYXJpZXMuXG5cbmZ1bmN0aW9uIHVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIC8vIE5vdGU6IFRoZSBzaGltIGRvZXMgbm90IHVzZSBnZXRTZXJ2ZXJTbmFwc2hvdCwgYmVjYXVzZSBwcmUtMTggdmVyc2lvbnMgb2Zcbi8vIFJlYWN0IGRvIG5vdCBleHBvc2UgYSB3YXkgdG8gY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nLiBTbyB1c2VycyBvZiB0aGUgc2hpbVxuLy8gd2lsbCBuZWVkIHRvIHRyYWNrIHRoYXQgdGhlbXNlbHZlcyBhbmQgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlXG4vLyBmcm9tIGBnZXRTbmFwc2hvdGAuXG5nZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICB7XG4gICAgaWYgKCFkaWRXYXJuT2xkMThBbHBoYSkge1xuICAgICAgaWYgKFJlYWN0LnN0YXJ0VHJhbnNpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRpZFdhcm5PbGQxOEFscGhhID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignWW91IGFyZSB1c2luZyBhbiBvdXRkYXRlZCwgcHJlLXJlbGVhc2UgYWxwaGEgb2YgUmVhY3QgMTggdGhhdCAnICsgJ2RvZXMgbm90IHN1cHBvcnQgdXNlU3luY0V4dGVybmFsU3RvcmUuIFRoZSAnICsgJ3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlIHNoaW0gd2lsbCBub3Qgd29yayBjb3JyZWN0bHkuIFVwZ3JhZGUgJyArICd0byBhIG5ld2VyIHByZS1yZWxlYXNlLicpO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBSZWFkIHRoZSBjdXJyZW50IHNuYXBzaG90IGZyb20gdGhlIHN0b3JlIG9uIGV2ZXJ5IHJlbmRlci4gQWdhaW4sIHRoaXNcbiAgLy8gYnJlYWtzIHRoZSBydWxlcyBvZiBSZWFjdCwgYW5kIG9ubHkgd29ya3MgaGVyZSBiZWNhdXNlIG9mIHNwZWNpZmljXG4gIC8vIGltcGxlbWVudGF0aW9uIGRldGFpbHMsIG1vc3QgaW1wb3J0YW50bHkgdGhhdCB1cGRhdGVzIGFyZVxuICAvLyBhbHdheXMgc3luY2hyb25vdXMuXG5cblxuICB2YXIgdmFsdWUgPSBnZXRTbmFwc2hvdCgpO1xuXG4gIHtcbiAgICBpZiAoIWRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90KSB7XG4gICAgICB2YXIgY2FjaGVkVmFsdWUgPSBnZXRTbmFwc2hvdCgpO1xuXG4gICAgICBpZiAoIW9iamVjdElzKHZhbHVlLCBjYWNoZWRWYWx1ZSkpIHtcbiAgICAgICAgZXJyb3IoJ1RoZSByZXN1bHQgb2YgZ2V0U25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wJyk7XG5cbiAgICAgICAgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBCZWNhdXNlIHVwZGF0ZXMgYXJlIHN5bmNocm9ub3VzLCB3ZSBkb24ndCBxdWV1ZSB0aGVtLiBJbnN0ZWFkIHdlIGZvcmNlIGFcbiAgLy8gcmUtcmVuZGVyIHdoZW5ldmVyIHRoZSBzdWJzY3JpYmVkIHN0YXRlIGNoYW5nZXMgYnkgdXBkYXRpbmcgYW4gc29tZVxuICAvLyBhcmJpdHJhcnkgdXNlU3RhdGUgaG9vay4gVGhlbiwgZHVyaW5nIHJlbmRlciwgd2UgY2FsbCBnZXRTbmFwc2hvdCB0byByZWFkXG4gIC8vIHRoZSBjdXJyZW50IHZhbHVlLlxuICAvL1xuICAvLyBCZWNhdXNlIHdlIGRvbid0IGFjdHVhbGx5IHVzZSB0aGUgc3RhdGUgcmV0dXJuZWQgYnkgdGhlIHVzZVN0YXRlIGhvb2ssIHdlXG4gIC8vIGNhbiBzYXZlIGEgYml0IG9mIG1lbW9yeSBieSBzdG9yaW5nIG90aGVyIHN0dWZmIGluIHRoYXQgc2xvdC5cbiAgLy9cbiAgLy8gVG8gaW1wbGVtZW50IHRoZSBlYXJseSBiYWlsb3V0LCB3ZSBuZWVkIHRvIHRyYWNrIHNvbWUgdGhpbmdzIG9uIGEgbXV0YWJsZVxuICAvLyBvYmplY3QuIFVzdWFsbHksIHdlIHdvdWxkIHB1dCB0aGF0IGluIGEgdXNlUmVmIGhvb2ssIGJ1dCB3ZSBjYW4gc3Rhc2ggaXQgaW5cbiAgLy8gb3VyIHVzZVN0YXRlIGhvb2sgaW5zdGVhZC5cbiAgLy9cbiAgLy8gVG8gZm9yY2UgYSByZS1yZW5kZXIsIHdlIGNhbGwgZm9yY2VVcGRhdGUoe2luc3R9KS4gVGhhdCB3b3JrcyBiZWNhdXNlIHRoZVxuICAvLyBuZXcgb2JqZWN0IGFsd2F5cyBmYWlscyBhbiBlcXVhbGl0eSBjaGVjay5cblxuXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZSh7XG4gICAgaW5zdDoge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZ2V0U25hcHNob3Q6IGdldFNuYXBzaG90XG4gICAgfVxuICB9KSxcbiAgICAgIGluc3QgPSBfdXNlU3RhdGVbMF0uaW5zdCxcbiAgICAgIGZvcmNlVXBkYXRlID0gX3VzZVN0YXRlWzFdOyAvLyBUcmFjayB0aGUgbGF0ZXN0IGdldFNuYXBzaG90IGZ1bmN0aW9uIHdpdGggYSByZWYuIFRoaXMgbmVlZHMgdG8gYmUgdXBkYXRlZFxuICAvLyBpbiB0aGUgbGF5b3V0IHBoYXNlIHNvIHdlIGNhbiBhY2Nlc3MgaXQgZHVyaW5nIHRoZSB0ZWFyaW5nIGNoZWNrIHRoYXRcbiAgLy8gaGFwcGVucyBvbiBzdWJzY3JpYmUuXG5cblxuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGluc3QudmFsdWUgPSB2YWx1ZTtcbiAgICBpbnN0LmdldFNuYXBzaG90ID0gZ2V0U25hcHNob3Q7IC8vIFdoZW5ldmVyIGdldFNuYXBzaG90IG9yIHN1YnNjcmliZSBjaGFuZ2VzLCB3ZSBuZWVkIHRvIGNoZWNrIGluIHRoZVxuICAgIC8vIGNvbW1pdCBwaGFzZSBpZiB0aGVyZSB3YXMgYW4gaW50ZXJsZWF2ZWQgbXV0YXRpb24uIEluIGNvbmN1cnJlbnQgbW9kZVxuICAgIC8vIHRoaXMgY2FuIGhhcHBlbiBhbGwgdGhlIHRpbWUsIGJ1dCBldmVuIGluIHN5bmNocm9ub3VzIG1vZGUsIGFuIGVhcmxpZXJcbiAgICAvLyBlZmZlY3QgbWF5IGhhdmUgbXV0YXRlZCB0aGUgc3RvcmUuXG5cbiAgICBpZiAoY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSkge1xuICAgICAgLy8gRm9yY2UgYSByZS1yZW5kZXIuXG4gICAgICBmb3JjZVVwZGF0ZSh7XG4gICAgICAgIGluc3Q6IGluc3RcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW3N1YnNjcmliZSwgdmFsdWUsIGdldFNuYXBzaG90XSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgLy8gQ2hlY2sgZm9yIGNoYW5nZXMgcmlnaHQgYmVmb3JlIHN1YnNjcmliaW5nLiBTdWJzZXF1ZW50IGNoYW5nZXMgd2lsbCBiZVxuICAgIC8vIGRldGVjdGVkIGluIHRoZSBzdWJzY3JpcHRpb24gaGFuZGxlci5cbiAgICBpZiAoY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSkge1xuICAgICAgLy8gRm9yY2UgYSByZS1yZW5kZXIuXG4gICAgICBmb3JjZVVwZGF0ZSh7XG4gICAgICAgIGluc3Q6IGluc3RcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBoYW5kbGVTdG9yZUNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFRPRE86IEJlY2F1c2UgdGhlcmUgaXMgbm8gY3Jvc3MtcmVuZGVyZXIgQVBJIGZvciBiYXRjaGluZyB1cGRhdGVzLCBpdCdzXG4gICAgICAvLyB1cCB0byB0aGUgY29uc3VtZXIgb2YgdGhpcyBsaWJyYXJ5IHRvIHdyYXAgdGhlaXIgc3Vic2NyaXB0aW9uIGV2ZW50XG4gICAgICAvLyB3aXRoIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzLiBTaG91bGQgd2UgdHJ5IHRvIGRldGVjdCB3aGVuIHRoaXMgaXNuJ3RcbiAgICAgIC8vIHRoZSBjYXNlIGFuZCBwcmludCBhIHdhcm5pbmcgaW4gZGV2ZWxvcG1lbnQ/XG4gICAgICAvLyBUaGUgc3RvcmUgY2hhbmdlZC4gQ2hlY2sgaWYgdGhlIHNuYXBzaG90IGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZVxuICAgICAgLy8gcmVhZCBmcm9tIHRoZSBzdG9yZS5cbiAgICAgIGlmIChjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpKSB7XG4gICAgICAgIC8vIEZvcmNlIGEgcmUtcmVuZGVyLlxuICAgICAgICBmb3JjZVVwZGF0ZSh7XG4gICAgICAgICAgaW5zdDogaW5zdFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9OyAvLyBTdWJzY3JpYmUgdG8gdGhlIHN0b3JlIGFuZCByZXR1cm4gYSBjbGVhbi11cCBmdW5jdGlvbi5cblxuXG4gICAgcmV0dXJuIHN1YnNjcmliZShoYW5kbGVTdG9yZUNoYW5nZSk7XG4gIH0sIFtzdWJzY3JpYmVdKTtcbiAgdXNlRGVidWdWYWx1ZSh2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSB7XG4gIHZhciBsYXRlc3RHZXRTbmFwc2hvdCA9IGluc3QuZ2V0U25hcHNob3Q7XG4gIHZhciBwcmV2VmFsdWUgPSBpbnN0LnZhbHVlO1xuXG4gIHRyeSB7XG4gICAgdmFyIG5leHRWYWx1ZSA9IGxhdGVzdEdldFNuYXBzaG90KCk7XG4gICAgcmV0dXJuICFvYmplY3RJcyhwcmV2VmFsdWUsIG5leHRWYWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXNlU3luY0V4dGVybmFsU3RvcmUkMShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAvLyBOb3RlOiBUaGUgc2hpbSBkb2VzIG5vdCB1c2UgZ2V0U2VydmVyU25hcHNob3QsIGJlY2F1c2UgcHJlLTE4IHZlcnNpb25zIG9mXG4gIC8vIFJlYWN0IGRvIG5vdCBleHBvc2UgYSB3YXkgdG8gY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nLiBTbyB1c2VycyBvZiB0aGUgc2hpbVxuICAvLyB3aWxsIG5lZWQgdG8gdHJhY2sgdGhhdCB0aGVtc2VsdmVzIGFuZCByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWVcbiAgLy8gZnJvbSBgZ2V0U25hcHNob3RgLlxuICByZXR1cm4gZ2V0U25hcHNob3QoKTtcbn1cblxudmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpO1xuXG52YXIgaXNTZXJ2ZXJFbnZpcm9ubWVudCA9ICFjYW5Vc2VET007XG5cbnZhciBzaGltID0gaXNTZXJ2ZXJFbnZpcm9ubWVudCA/IHVzZVN5bmNFeHRlcm5hbFN0b3JlJDEgOiB1c2VTeW5jRXh0ZXJuYWxTdG9yZTtcbnZhciB1c2VTeW5jRXh0ZXJuYWxTdG9yZSQyID0gUmVhY3QudXNlU3luY0V4dGVybmFsU3RvcmUgIT09IHVuZGVmaW5lZCA/IFJlYWN0LnVzZVN5bmNFeHRlcm5hbFN0b3JlIDogc2hpbTtcblxuZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlJDI7XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHVzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0vd2l0aC1zZWxlY3Rvci5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG52YXIgc2hpbSA9IHJlcXVpcmUoJ3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL3NoaW0nKTtcblxuLyoqXG4gKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAqL1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICByZXR1cm4geCA9PT0geSAmJiAoeCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkpIHx8IHggIT09IHggJiYgeSAhPT0geSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuICA7XG59XG5cbnZhciBvYmplY3RJcyA9IHR5cGVvZiBPYmplY3QuaXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuaXMgOiBpcztcblxudmFyIHVzZVN5bmNFeHRlcm5hbFN0b3JlID0gc2hpbS51c2VTeW5jRXh0ZXJuYWxTdG9yZTtcblxuLy8gZm9yIENvbW1vbkpTIGludGVyb3AuXG5cbnZhciB1c2VSZWYgPSBSZWFjdC51c2VSZWYsXG4gICAgdXNlRWZmZWN0ID0gUmVhY3QudXNlRWZmZWN0LFxuICAgIHVzZU1lbW8gPSBSZWFjdC51c2VNZW1vLFxuICAgIHVzZURlYnVnVmFsdWUgPSBSZWFjdC51c2VEZWJ1Z1ZhbHVlOyAvLyBTYW1lIGFzIHVzZVN5bmNFeHRlcm5hbFN0b3JlLCBidXQgc3VwcG9ydHMgc2VsZWN0b3IgYW5kIGlzRXF1YWwgYXJndW1lbnRzLlxuXG5mdW5jdGlvbiB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvcihzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCwgc2VsZWN0b3IsIGlzRXF1YWwpIHtcbiAgLy8gVXNlIHRoaXMgdG8gdHJhY2sgdGhlIHJlbmRlcmVkIHNuYXBzaG90LlxuICB2YXIgaW5zdFJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGluc3Q7XG5cbiAgaWYgKGluc3RSZWYuY3VycmVudCA9PT0gbnVsbCkge1xuICAgIGluc3QgPSB7XG4gICAgICBoYXNWYWx1ZTogZmFsc2UsXG4gICAgICB2YWx1ZTogbnVsbFxuICAgIH07XG4gICAgaW5zdFJlZi5jdXJyZW50ID0gaW5zdDtcbiAgfSBlbHNlIHtcbiAgICBpbnN0ID0gaW5zdFJlZi5jdXJyZW50O1xuICB9XG5cbiAgdmFyIF91c2VNZW1vID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gVHJhY2sgdGhlIG1lbW9pemVkIHN0YXRlIHVzaW5nIGNsb3N1cmUgdmFyaWFibGVzIHRoYXQgYXJlIGxvY2FsIHRvIHRoaXNcbiAgICAvLyBtZW1vaXplZCBpbnN0YW5jZSBvZiBhIGdldFNuYXBzaG90IGZ1bmN0aW9uLiBJbnRlbnRpb25hbGx5IG5vdCB1c2luZyBhXG4gICAgLy8gdXNlUmVmIGhvb2ssIGJlY2F1c2UgdGhhdCBzdGF0ZSB3b3VsZCBiZSBzaGFyZWQgYWNyb3NzIGFsbCBjb25jdXJyZW50XG4gICAgLy8gY29waWVzIG9mIHRoZSBob29rL2NvbXBvbmVudC5cbiAgICB2YXIgaGFzTWVtbyA9IGZhbHNlO1xuICAgIHZhciBtZW1vaXplZFNuYXBzaG90O1xuICAgIHZhciBtZW1vaXplZFNlbGVjdGlvbjtcblxuICAgIHZhciBtZW1vaXplZFNlbGVjdG9yID0gZnVuY3Rpb24gKG5leHRTbmFwc2hvdCkge1xuICAgICAgaWYgKCFoYXNNZW1vKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCB0aW1lIHRoZSBob29rIGlzIGNhbGxlZCwgdGhlcmUgaXMgbm8gbWVtb2l6ZWQgcmVzdWx0LlxuICAgICAgICBoYXNNZW1vID0gdHJ1ZTtcbiAgICAgICAgbWVtb2l6ZWRTbmFwc2hvdCA9IG5leHRTbmFwc2hvdDtcblxuICAgICAgICB2YXIgX25leHRTZWxlY3Rpb24gPSBzZWxlY3RvcihuZXh0U25hcHNob3QpO1xuXG4gICAgICAgIGlmIChpc0VxdWFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBFdmVuIGlmIHRoZSBzZWxlY3RvciBoYXMgY2hhbmdlZCwgdGhlIGN1cnJlbnRseSByZW5kZXJlZCBzZWxlY3Rpb25cbiAgICAgICAgICAvLyBtYXkgYmUgZXF1YWwgdG8gdGhlIG5ldyBzZWxlY3Rpb24uIFdlIHNob3VsZCBhdHRlbXB0IHRvIHJldXNlIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgdmFsdWUgaWYgcG9zc2libGUsIHRvIHByZXNlcnZlIGRvd25zdHJlYW0gbWVtb2l6YXRpb25zLlxuICAgICAgICAgIGlmIChpbnN0Lmhhc1ZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFNlbGVjdGlvbiA9IGluc3QudmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChpc0VxdWFsKGN1cnJlbnRTZWxlY3Rpb24sIF9uZXh0U2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgICBtZW1vaXplZFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb247XG4gICAgICAgICAgICAgIHJldHVybiBjdXJyZW50U2VsZWN0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG1lbW9pemVkU2VsZWN0aW9uID0gX25leHRTZWxlY3Rpb247XG4gICAgICAgIHJldHVybiBfbmV4dFNlbGVjdGlvbjtcbiAgICAgIH0gLy8gV2UgbWF5IGJlIGFibGUgdG8gcmV1c2UgdGhlIHByZXZpb3VzIGludm9jYXRpb24ncyByZXN1bHQuXG5cblxuICAgICAgLy8gV2UgbWF5IGJlIGFibGUgdG8gcmV1c2UgdGhlIHByZXZpb3VzIGludm9jYXRpb24ncyByZXN1bHQuXG4gICAgICB2YXIgcHJldlNuYXBzaG90ID0gbWVtb2l6ZWRTbmFwc2hvdDtcbiAgICAgIHZhciBwcmV2U2VsZWN0aW9uID0gbWVtb2l6ZWRTZWxlY3Rpb247XG5cbiAgICAgIGlmIChvYmplY3RJcyhwcmV2U25hcHNob3QsIG5leHRTbmFwc2hvdCkpIHtcbiAgICAgICAgLy8gVGhlIHNuYXBzaG90IGlzIHRoZSBzYW1lIGFzIGxhc3QgdGltZS4gUmV1c2UgdGhlIHByZXZpb3VzIHNlbGVjdGlvbi5cbiAgICAgICAgcmV0dXJuIHByZXZTZWxlY3Rpb247XG4gICAgICB9IC8vIFRoZSBzbmFwc2hvdCBoYXMgY2hhbmdlZCwgc28gd2UgbmVlZCB0byBjb21wdXRlIGEgbmV3IHNlbGVjdGlvbi5cblxuXG4gICAgICAvLyBUaGUgc25hcHNob3QgaGFzIGNoYW5nZWQsIHNvIHdlIG5lZWQgdG8gY29tcHV0ZSBhIG5ldyBzZWxlY3Rpb24uXG4gICAgICB2YXIgbmV4dFNlbGVjdGlvbiA9IHNlbGVjdG9yKG5leHRTbmFwc2hvdCk7IC8vIElmIGEgY3VzdG9tIGlzRXF1YWwgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIHVzZSB0aGF0IHRvIGNoZWNrIGlmIHRoZSBkYXRhXG4gICAgICAvLyBoYXMgY2hhbmdlZC4gSWYgaXQgaGFzbid0LCByZXR1cm4gdGhlIHByZXZpb3VzIHNlbGVjdGlvbi4gVGhhdCBzaWduYWxzXG4gICAgICAvLyB0byBSZWFjdCB0aGF0IHRoZSBzZWxlY3Rpb25zIGFyZSBjb25jZXB0dWFsbHkgZXF1YWwsIGFuZCB3ZSBjYW4gYmFpbFxuICAgICAgLy8gb3V0IG9mIHJlbmRlcmluZy5cblxuICAgICAgLy8gSWYgYSBjdXN0b20gaXNFcXVhbCBmdW5jdGlvbiBpcyBwcm92aWRlZCwgdXNlIHRoYXQgdG8gY2hlY2sgaWYgdGhlIGRhdGFcbiAgICAgIC8vIGhhcyBjaGFuZ2VkLiBJZiBpdCBoYXNuJ3QsIHJldHVybiB0aGUgcHJldmlvdXMgc2VsZWN0aW9uLiBUaGF0IHNpZ25hbHNcbiAgICAgIC8vIHRvIFJlYWN0IHRoYXQgdGhlIHNlbGVjdGlvbnMgYXJlIGNvbmNlcHR1YWxseSBlcXVhbCwgYW5kIHdlIGNhbiBiYWlsXG4gICAgICAvLyBvdXQgb2YgcmVuZGVyaW5nLlxuICAgICAgaWYgKGlzRXF1YWwgIT09IHVuZGVmaW5lZCAmJiBpc0VxdWFsKHByZXZTZWxlY3Rpb24sIG5leHRTZWxlY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBwcmV2U2VsZWN0aW9uO1xuICAgICAgfVxuXG4gICAgICBtZW1vaXplZFNuYXBzaG90ID0gbmV4dFNuYXBzaG90O1xuICAgICAgbWVtb2l6ZWRTZWxlY3Rpb24gPSBuZXh0U2VsZWN0aW9uO1xuICAgICAgcmV0dXJuIG5leHRTZWxlY3Rpb247XG4gICAgfTsgLy8gQXNzaWduaW5nIHRoaXMgdG8gYSBjb25zdGFudCBzbyB0aGF0IEZsb3cga25vd3MgaXQgY2FuJ3QgY2hhbmdlLlxuXG5cbiAgICAvLyBBc3NpZ25pbmcgdGhpcyB0byBhIGNvbnN0YW50IHNvIHRoYXQgRmxvdyBrbm93cyBpdCBjYW4ndCBjaGFuZ2UuXG4gICAgdmFyIG1heWJlR2V0U2VydmVyU25hcHNob3QgPSBnZXRTZXJ2ZXJTbmFwc2hvdCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGdldFNlcnZlclNuYXBzaG90O1xuXG4gICAgdmFyIGdldFNuYXBzaG90V2l0aFNlbGVjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG1lbW9pemVkU2VsZWN0b3IoZ2V0U25hcHNob3QoKSk7XG4gICAgfTtcblxuICAgIHZhciBnZXRTZXJ2ZXJTbmFwc2hvdFdpdGhTZWxlY3RvciA9IG1heWJlR2V0U2VydmVyU25hcHNob3QgPT09IG51bGwgPyB1bmRlZmluZWQgOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbWVtb2l6ZWRTZWxlY3RvcihtYXliZUdldFNlcnZlclNuYXBzaG90KCkpO1xuICAgIH07XG4gICAgcmV0dXJuIFtnZXRTbmFwc2hvdFdpdGhTZWxlY3RvciwgZ2V0U2VydmVyU25hcHNob3RXaXRoU2VsZWN0b3JdO1xuICB9LCBbZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90LCBzZWxlY3RvciwgaXNFcXVhbF0pLFxuICAgICAgZ2V0U2VsZWN0aW9uID0gX3VzZU1lbW9bMF0sXG4gICAgICBnZXRTZXJ2ZXJTZWxlY3Rpb24gPSBfdXNlTWVtb1sxXTtcblxuICB2YXIgdmFsdWUgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNlbGVjdGlvbiwgZ2V0U2VydmVyU2VsZWN0aW9uKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpbnN0Lmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICBpbnN0LnZhbHVlID0gdmFsdWU7XG4gIH0sIFt2YWx1ZV0pO1xuICB1c2VEZWJ1Z1ZhbHVlKHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnRzLnVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yID0gdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3I7XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltL3dpdGgtc2VsZWN0b3IucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0vd2l0aC1zZWxlY3Rvci5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSB3aW5kb3dbXCJQcm9wVHlwZXNcIl07IiwibW9kdWxlLmV4cG9ydHMgPSB3aW5kb3dbXCJSZWFjdFwiXTsiLCJtb2R1bGUuZXhwb3J0cyA9IHdpbmRvd1tcIlJlYWN0RE9NXCJdOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG4gIHJldHVybiBhcnIyO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbn0iLCJpbXBvcnQgYXJyYXlMaWtlVG9BcnJheSBmcm9tIFwiLi9hcnJheUxpa2VUb0FycmF5LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KGFycik7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7XG4gIGlmIChzZWxmID09PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cbiAgcmV0dXJuIHNlbGY7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn0iLCJpbXBvcnQgdG9Qcm9wZXJ0eUtleSBmcm9tIFwiLi90b1Byb3BlcnR5S2V5LmpzXCI7XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCB0b1Byb3BlcnR5S2V5KGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59IiwiaW1wb3J0IHRvUHJvcGVydHlLZXkgZnJvbSBcIi4vdG9Qcm9wZXJ0eUtleS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBrZXkgPSB0b1Byb3BlcnR5S2V5KGtleSk7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBvYmo7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbiAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn0iLCJpbXBvcnQgc2V0UHJvdG90eXBlT2YgZnJvbSBcIi4vc2V0UHJvdG90eXBlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICB9XG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH1cbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIHNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgaXRlcltTeW1ib2wuaXRlcmF0b3JdICE9IG51bGwgfHwgaXRlcltcIkBAaXRlcmF0b3JcIl0gIT0gbnVsbCkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICB2YXIgX2kgPSBudWxsID09IGFyciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXTtcbiAgaWYgKG51bGwgIT0gX2kpIHtcbiAgICB2YXIgX3MsXG4gICAgICBfZSxcbiAgICAgIF94LFxuICAgICAgX3IsXG4gICAgICBfYXJyID0gW10sXG4gICAgICBfbiA9ICEwLFxuICAgICAgX2QgPSAhMTtcbiAgICB0cnkge1xuICAgICAgaWYgKF94ID0gKF9pID0gX2kuY2FsbChhcnIpKS5uZXh0LCAwID09PSBpKSB7XG4gICAgICAgIGlmIChPYmplY3QoX2kpICE9PSBfaSkgcmV0dXJuO1xuICAgICAgICBfbiA9ICExO1xuICAgICAgfSBlbHNlIGZvciAoOyAhKF9uID0gKF9zID0gX3guY2FsbChfaSkpLmRvbmUpICYmIChfYXJyLnB1c2goX3MudmFsdWUpLCBfYXJyLmxlbmd0aCAhPT0gaSk7IF9uID0gITApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2QgPSAhMCwgX2UgPSBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghX24gJiYgbnVsbCAhPSBfaVtcInJldHVyblwiXSAmJiAoX3IgPSBfaVtcInJldHVyblwiXSgpLCBPYmplY3QoX3IpICE9PSBfcikpIHJldHVybjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBfYXJyO1xuICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufSIsImltcG9ydCBkZWZpbmVQcm9wZXJ0eSBmcm9tIFwiLi9kZWZpbmVQcm9wZXJ0eS5qc1wiO1xuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG4gIHJldHVybiBrZXlzO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX29iamVjdFNwcmVhZDIodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufSIsImltcG9ydCBvYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGZyb20gXCIuL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0gb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTtcbiAgdmFyIGtleSwgaTtcbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTtcbiAgICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgdmFyIGtleSwgaTtcbiAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gXCIuL3R5cGVvZi5qc1wiO1xuaW1wb3J0IGFzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiLi9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHtcbiAgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICByZXR1cm4gY2FsbDtcbiAgfSBlbHNlIGlmIChjYWxsICE9PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWRcIik7XG4gIH1cbiAgcmV0dXJuIGFzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59IiwiaW1wb3J0IGFycmF5V2l0aEhvbGVzIGZyb20gXCIuL2FycmF5V2l0aEhvbGVzLmpzXCI7XG5pbXBvcnQgaXRlcmFibGVUb0FycmF5TGltaXQgZnJvbSBcIi4vaXRlcmFibGVUb0FycmF5TGltaXQuanNcIjtcbmltcG9ydCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSBmcm9tIFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiO1xuaW1wb3J0IG5vbkl0ZXJhYmxlUmVzdCBmcm9tIFwiLi9ub25JdGVyYWJsZVJlc3QuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkge1xuICByZXR1cm4gYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59IiwiaW1wb3J0IGFycmF5V2l0aG91dEhvbGVzIGZyb20gXCIuL2FycmF5V2l0aG91dEhvbGVzLmpzXCI7XG5pbXBvcnQgaXRlcmFibGVUb0FycmF5IGZyb20gXCIuL2l0ZXJhYmxlVG9BcnJheS5qc1wiO1xuaW1wb3J0IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IGZyb20gXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgbm9uSXRlcmFibGVTcHJlYWQgZnJvbSBcIi4vbm9uSXRlcmFibGVTcHJlYWQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIGFycmF5V2l0aG91dEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5KGFycikgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBub25JdGVyYWJsZVNwcmVhZCgpO1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gXCIuL3R5cGVvZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7XG4gIGlmIChfdHlwZW9mKGlucHV0KSAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0O1xuICB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07XG4gIGlmIChwcmltICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcmVzID0gcHJpbS5jYWxsKGlucHV0LCBoaW50IHx8IFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoX3R5cGVvZihyZXMpICE9PSBcIm9iamVjdFwiKSByZXR1cm4gcmVzO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTtcbiAgfVxuICByZXR1cm4gKGhpbnQgPT09IFwic3RyaW5nXCIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmltcG9ydCB0b1ByaW1pdGl2ZSBmcm9tIFwiLi90b1ByaW1pdGl2ZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7XG4gIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShhcmcsIFwic3RyaW5nXCIpO1xuICByZXR1cm4gX3R5cGVvZihrZXkpID09PSBcInN5bWJvbFwiID8ga2V5IDogU3RyaW5nKGtleSk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICB9IDogZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gIH0sIF90eXBlb2Yob2JqKTtcbn0iLCJpbXBvcnQgYXJyYXlMaWtlVG9BcnJheSBmcm9tIFwiLi9hcnJheUxpa2VUb0FycmF5LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7XG4gIGlmICghbykgcmV0dXJuO1xuICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufSIsIi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGFsd2F5cyByZXR1cm5zIGBmYWxzZWAuIEFueSBwYXNzZWQgaW4gcGFyYW1ldGVycyBhcmUgaWdub3JlZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC45LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAqIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn1cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAc2VlIFIuVFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuRigpOyAvLz0+IGZhbHNlXG4gKi9cbnZhciBGID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBGOyIsIi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGFsd2F5cyByZXR1cm5zIGB0cnVlYC4gQW55IHBhc3NlZCBpbiBwYXJhbWV0ZXJzIGFyZSBpZ25vcmVkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjkuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICogLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBzZWUgUi5GXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5UKCk7IC8vPT4gdHJ1ZVxuICovXG52YXIgVCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBUOyIsIi8qKlxuICogQSBzcGVjaWFsIHBsYWNlaG9sZGVyIHZhbHVlIHVzZWQgdG8gc3BlY2lmeSBcImdhcHNcIiB3aXRoaW4gY3VycmllZCBmdW5jdGlvbnMsXG4gKiBhbGxvd2luZyBwYXJ0aWFsIGFwcGxpY2F0aW9uIG9mIGFueSBjb21iaW5hdGlvbiBvZiBhcmd1bWVudHMsIHJlZ2FyZGxlc3Mgb2ZcbiAqIHRoZWlyIHBvc2l0aW9ucy5cbiAqXG4gKiBJZiBgZ2AgaXMgYSBjdXJyaWVkIHRlcm5hcnkgZnVuY3Rpb24gYW5kIGBfYCBpcyBgUi5fX2AsIHRoZSBmb2xsb3dpbmcgYXJlXG4gKiBlcXVpdmFsZW50OlxuICpcbiAqICAgLSBgZygxLCAyLCAzKWBcbiAqICAgLSBgZyhfLCAyLCAzKSgxKWBcbiAqICAgLSBgZyhfLCBfLCAzKSgxKSgyKWBcbiAqICAgLSBgZyhfLCBfLCAzKSgxLCAyKWBcbiAqICAgLSBgZyhfLCAyLCBfKSgxLCAzKWBcbiAqICAgLSBgZyhfLCAyKSgxKSgzKWBcbiAqICAgLSBgZyhfLCAyKSgxLCAzKWBcbiAqICAgLSBgZyhfLCAyKShfLCAzKSgxKWBcbiAqXG4gKiBAbmFtZSBfX1xuICogQGNvbnN0YW50XG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjYuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZ3JlZXQgPSBSLnJlcGxhY2UoJ3tuYW1lfScsIFIuX18sICdIZWxsbywge25hbWV9IScpO1xuICogICAgICBncmVldCgnQWxpY2UnKTsgLy89PiAnSGVsbG8sIEFsaWNlISdcbiAqL1xuZXhwb3J0IGRlZmF1bHQge1xuICAnQEBmdW5jdGlvbmFsL3BsYWNlaG9sZGVyJzogdHJ1ZVxufTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIEFkZHMgdHdvIHZhbHVlcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gTnVtYmVyXG4gKiBAcGFyYW0ge051bWJlcn0gYVxuICogQHBhcmFtIHtOdW1iZXJ9IGJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBzZWUgUi5zdWJ0cmFjdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuYWRkKDIsIDMpOyAgICAgICAvLz0+ICA1XG4gKiAgICAgIFIuYWRkKDcpKDEwKTsgICAgICAvLz0+IDE3XG4gKi9cblxudmFyIGFkZCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIGFkZChhLCBiKSB7XG4gIHJldHVybiBOdW1iZXIoYSkgKyBOdW1iZXIoYik7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgYWRkOyIsImltcG9ydCBfY29uY2F0IGZyb20gXCIuL2ludGVybmFsL19jb25jYXQuanNcIjtcbmltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBjdXJyeU4gZnJvbSBcIi4vY3VycnlOLmpzXCI7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbGlzdCBpdGVyYXRpb24gZnVuY3Rpb24gZnJvbSBhbiBleGlzdGluZyBvbmUgYnkgYWRkaW5nIHR3byBuZXdcbiAqIHBhcmFtZXRlcnMgdG8gaXRzIGNhbGxiYWNrIGZ1bmN0aW9uOiB0aGUgY3VycmVudCBpbmRleCwgYW5kIHRoZSBlbnRpcmUgbGlzdC5cbiAqXG4gKiBUaGlzIHdvdWxkIHR1cm4sIGZvciBpbnN0YW5jZSwgW2BSLm1hcGBdKCNtYXApIGZ1bmN0aW9uIGludG8gb25lIHRoYXRcbiAqIG1vcmUgY2xvc2VseSByZXNlbWJsZXMgYEFycmF5LnByb3RvdHlwZS5tYXBgLiBOb3RlIHRoYXQgdGhpcyB3aWxsIG9ubHkgd29ya1xuICogZm9yIGZ1bmN0aW9ucyBpbiB3aGljaCB0aGUgaXRlcmF0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHRoZSBmaXJzdFxuICogcGFyYW1ldGVyLCBhbmQgd2hlcmUgdGhlIGxpc3QgaXMgdGhlIGxhc3QgcGFyYW1ldGVyLiAoVGhpcyBsYXR0ZXIgbWlnaHQgYmVcbiAqIHVuaW1wb3J0YW50IGlmIHRoZSBsaXN0IHBhcmFtZXRlciBpcyBub3QgdXNlZC4pXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTUuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoKChhIC4uLikgLT4gYikgLi4uIC0+IFthXSAtPiAqKSAtPiAoKChhIC4uLiwgSW50LCBbYV0pIC0+IGIpIC4uLiAtPiBbYV0gLT4gKilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEEgbGlzdCBpdGVyYXRpb24gZnVuY3Rpb24gdGhhdCBkb2VzIG5vdCBwYXNzIGluZGV4IG9yIGxpc3QgdG8gaXRzIGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQW4gYWx0ZXJlZCBsaXN0IGl0ZXJhdGlvbiBmdW5jdGlvbiB0aGF0IHBhc3NlcyAoaXRlbSwgaW5kZXgsIGxpc3QpIHRvIGl0cyBjYWxsYmFja1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IG1hcEluZGV4ZWQgPSBSLmFkZEluZGV4KFIubWFwKTtcbiAqICAgICAgbWFwSW5kZXhlZCgodmFsLCBpZHgpID0+IGlkeCArICctJyArIHZhbCwgWydmJywgJ28nLCAnbycsICdiJywgJ2EnLCAnciddKTtcbiAqICAgICAgLy89PiBbJzAtZicsICcxLW8nLCAnMi1vJywgJzMtYicsICc0LWEnLCAnNS1yJ11cbiAqL1xuXG52YXIgYWRkSW5kZXggPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiBhZGRJbmRleChmbikge1xuICByZXR1cm4gY3VycnlOKGZuLmxlbmd0aCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBpZHggPSAwO1xuICAgIHZhciBvcmlnRm4gPSBhcmd1bWVudHNbMF07XG4gICAgdmFyIGxpc3QgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcblxuICAgIGFyZ3NbMF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gb3JpZ0ZuLmFwcGx5KHRoaXMsIF9jb25jYXQoYXJndW1lbnRzLCBbaWR4LCBsaXN0XSkpO1xuICAgICAgaWR4ICs9IDE7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncyk7XG4gIH0pO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGFkZEluZGV4OyIsImltcG9ydCBfY29uY2F0IGZyb20gXCIuL2ludGVybmFsL19jb25jYXQuanNcIjtcbmltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBjdXJyeU4gZnJvbSBcIi4vY3VycnlOLmpzXCI7XG4vKipcbiAqIEFzIHdpdGggYGFkZEluZGV4YCwgYGFkZEluZGV4UmlnaHRgIGNyZWF0ZXMgYSBuZXcgbGlzdCBpdGVyYXRpb24gZnVuY3Rpb25cbiAqIGZyb20gYW4gZXhpc3Rpbmcgb25lIGJ5IGFkZGluZyB0d28gbmV3IHBhcmFtZXRlcnMgdG8gaXRzIGNhbGxiYWNrIGZ1bmN0aW9uOlxuICogdGhlIGN1cnJlbnQgaW5kZXgsIGFuZCB0aGUgZW50aXJlIGxpc3QuXG4gKlxuICogVW5saWtlIGBhZGRJbmRleGAsIGBhZGRJbmRleFJpZ2h0YCBpdGVyYXRlcyBmcm9tIHRoZSByaWdodCB0byB0aGUgbGVmdC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yOS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICgoYSAuLi4gLT4gYikgLi4uIC0+IFthXSAtPiAqKSAtPiAoYSAuLi4sIEludCwgW2FdIC0+IGIpIC4uLiAtPiBbYV0gLT4gKilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEEgbGlzdCBpdGVyYXRpb24gZnVuY3Rpb24gdGhhdCBkb2VzIG5vdCBwYXNzIGluZGV4IG9yIGxpc3QgdG8gaXRzIGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQW4gYWx0ZXJlZCBsaXN0IGl0ZXJhdGlvbiBmdW5jdGlvbiB0aGF0IHBhc3NlcyAoaXRlbSwgaW5kZXgsIGxpc3QpIHRvIGl0cyBjYWxsYmFja1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHJldm1hcCA9IChmbiwgYXJ5KSA9PiBSLm1hcChmbiwgUi5yZXZlcnNlKGFyeSkpO1xuICogICAgICBjb25zdCByZXZtYXBJbmRleGVkID0gUi5hZGRJbmRleFJpZ2h0KHJldm1hcCk7XG4gKiAgICAgIHJldm1hcEluZGV4ZWQoKHZhbCwgaWR4KSA9PiBpZHggKyAnLScgKyB2YWwsIFsnZicsICdvJywgJ28nLCAnYicsICdhJywgJ3InXSk7XG4gKiAgICAgIC8vPT4gWyAnNS1yJywgJzQtYScsICczLWInLCAnMi1vJywgJzEtbycsICcwLWYnIF1cbiAqL1xuXG52YXIgYWRkSW5kZXhSaWdodCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIGFkZEluZGV4KGZuKSB7XG4gIHJldHVybiBjdXJyeU4oZm4ubGVuZ3RoLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG9yaWdGbiA9IGFyZ3VtZW50c1swXTtcbiAgICB2YXIgbGlzdCA9IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV07XG4gICAgdmFyIGlkeCA9IGxpc3QubGVuZ3RoIC0gMTtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG5cbiAgICBhcmdzWzBdID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG9yaWdGbi5hcHBseSh0aGlzLCBfY29uY2F0KGFyZ3VtZW50cywgW2lkeCwgbGlzdF0pKTtcbiAgICAgIGlkeCAtPSAxO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9KTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBhZGRJbmRleFJpZ2h0OyIsImltcG9ydCBfY29uY2F0IGZyb20gXCIuL2ludGVybmFsL19jb25jYXQuanNcIjtcbmltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbi8qKlxuICogQXBwbGllcyBhIGZ1bmN0aW9uIHRvIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXggb2YgYW4gYXJyYXksIHJldHVybmluZyBhXG4gKiBuZXcgY29weSBvZiB0aGUgYXJyYXkgd2l0aCB0aGUgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXggcmVwbGFjZWQgd2l0aCB0aGVcbiAqIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gYXBwbGljYXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTQuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgTnVtYmVyIC0+IChhIC0+IGEpIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7TnVtYmVyfSBpZHggVGhlIGluZGV4LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGFwcGx5LlxuICogQHBhcmFtIHtBcnJheXxBcmd1bWVudHN9IGxpc3QgQW4gYXJyYXktbGlrZSBvYmplY3Qgd2hvc2UgdmFsdWVcbiAqICAgICAgICBhdCB0aGUgc3VwcGxpZWQgaW5kZXggd2lsbCBiZSByZXBsYWNlZC5cbiAqIEByZXR1cm4ge0FycmF5fSBBIGNvcHkgb2YgdGhlIHN1cHBsaWVkIGFycmF5LWxpa2Ugb2JqZWN0IHdpdGhcbiAqICAgICAgICAgdGhlIGVsZW1lbnQgYXQgaW5kZXggYGlkeGAgcmVwbGFjZWQgd2l0aCB0aGUgdmFsdWVcbiAqICAgICAgICAgcmV0dXJuZWQgYnkgYXBwbHlpbmcgYGZuYCB0byB0aGUgZXhpc3RpbmcgZWxlbWVudC5cbiAqIEBzZWUgUi51cGRhdGVcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmFkanVzdCgxLCBSLnRvVXBwZXIsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAvLz0+IFsnYScsICdCJywgJ2MnLCAnZCddXG4gKiAgICAgIFIuYWRqdXN0KC0xLCBSLnRvVXBwZXIsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgIC8vPT4gWydhJywgJ2InLCAnYycsICdEJ11cbiAqIEBzeW1iIFIuYWRqdXN0KC0xLCBmLCBbYSwgYl0pID0gW2EsIGYoYildXG4gKiBAc3ltYiBSLmFkanVzdCgwLCBmLCBbYSwgYl0pID0gW2YoYSksIGJdXG4gKi9cblxudmFyIGFkanVzdCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIGFkanVzdChpZHgsIGZuLCBsaXN0KSB7XG4gIHZhciBsZW4gPSBsaXN0Lmxlbmd0aDtcblxuICBpZiAoaWR4ID49IGxlbiB8fCBpZHggPCAtbGVuKSB7XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICB2YXIgX2lkeCA9IChsZW4gKyBpZHgpICUgbGVuO1xuXG4gIHZhciBfbGlzdCA9IF9jb25jYXQobGlzdCk7XG5cbiAgX2xpc3RbX2lkeF0gPSBmbihsaXN0W19pZHhdKTtcbiAgcmV0dXJuIF9saXN0O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGFkanVzdDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2Rpc3BhdGNoYWJsZSBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzXCI7XG5pbXBvcnQgX3hhbGwgZnJvbSBcIi4vaW50ZXJuYWwvX3hhbGwuanNcIjtcbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIG9mIHRoZSBsaXN0IG1hdGNoIHRoZSBwcmVkaWNhdGUsIGBmYWxzZWAgaWZcbiAqIHRoZXJlIGFyZSBhbnkgdGhhdCBkb24ndC5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgYWxsYCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiBbYV0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBwcmVkaWNhdGUgaXMgc2F0aXNmaWVkIGJ5IGV2ZXJ5IGVsZW1lbnQsIGBmYWxzZWBcbiAqICAgICAgICAgb3RoZXJ3aXNlLlxuICogQHNlZSBSLmFueSwgUi5ub25lLCBSLnRyYW5zZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGVxdWFsczMgPSBSLmVxdWFscygzKTtcbiAqICAgICAgUi5hbGwoZXF1YWxzMykoWzMsIDMsIDMsIDNdKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuYWxsKGVxdWFsczMpKFszLCAzLCAxLCAzXSk7IC8vPT4gZmFsc2VcbiAqL1xuXG52YXIgYWxsID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoXG4vKiNfX1BVUkVfXyovXG5fZGlzcGF0Y2hhYmxlKFsnYWxsJ10sIF94YWxsLCBmdW5jdGlvbiBhbGwoZm4sIGxpc3QpIHtcbiAgdmFyIGlkeCA9IDA7XG5cbiAgd2hpbGUgKGlkeCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgaWYgKCFmbihsaXN0W2lkeF0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWR4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn0pKTtcblxuZXhwb3J0IGRlZmF1bHQgYWxsOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBjdXJyeU4gZnJvbSBcIi4vY3VycnlOLmpzXCI7XG5pbXBvcnQgbWF4IGZyb20gXCIuL21heC5qc1wiO1xuaW1wb3J0IHBsdWNrIGZyb20gXCIuL3BsdWNrLmpzXCI7XG5pbXBvcnQgcmVkdWNlIGZyb20gXCIuL3JlZHVjZS5qc1wiO1xuLyoqXG4gKiBUYWtlcyBhIGxpc3Qgb2YgcHJlZGljYXRlcyBhbmQgcmV0dXJucyBhIHByZWRpY2F0ZSB0aGF0IHJldHVybnMgdHJ1ZSBmb3IgYVxuICogZ2l2ZW4gbGlzdCBvZiBhcmd1bWVudHMgaWYgZXZlcnkgb25lIG9mIHRoZSBwcm92aWRlZCBwcmVkaWNhdGVzIGlzIHNhdGlzZmllZFxuICogYnkgdGhvc2UgYXJndW1lbnRzLlxuICpcbiAqIFRoZSBmdW5jdGlvbiByZXR1cm5lZCBpcyBhIGN1cnJpZWQgZnVuY3Rpb24gd2hvc2UgYXJpdHkgbWF0Y2hlcyB0aGF0IG9mIHRoZVxuICogaGlnaGVzdC1hcml0eSBwcmVkaWNhdGUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOS4wXG4gKiBAY2F0ZWdvcnkgTG9naWNcbiAqIEBzaWcgWygqLi4uIC0+IEJvb2xlYW4pXSAtPiAoKi4uLiAtPiBCb29sZWFuKVxuICogQHBhcmFtIHtBcnJheX0gcHJlZGljYXRlcyBBbiBhcnJheSBvZiBwcmVkaWNhdGVzIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGNvbWJpbmVkIHByZWRpY2F0ZVxuICogQHNlZSBSLmFueVBhc3MsIFIuYm90aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGlzUXVlZW4gPSBSLnByb3BFcSgncmFuaycsICdRJyk7XG4gKiAgICAgIGNvbnN0IGlzU3BhZGUgPSBSLnByb3BFcSgnc3VpdCcsICfimaDvuI4nKTtcbiAqICAgICAgY29uc3QgaXNRdWVlbk9mU3BhZGVzID0gUi5hbGxQYXNzKFtpc1F1ZWVuLCBpc1NwYWRlXSk7XG4gKlxuICogICAgICBpc1F1ZWVuT2ZTcGFkZXMoe3Jhbms6ICdRJywgc3VpdDogJ+KZo++4jid9KTsgLy89PiBmYWxzZVxuICogICAgICBpc1F1ZWVuT2ZTcGFkZXMoe3Jhbms6ICdRJywgc3VpdDogJ+KZoO+4jid9KTsgLy89PiB0cnVlXG4gKi9cblxudmFyIGFsbFBhc3MgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiBhbGxQYXNzKHByZWRzKSB7XG4gIHJldHVybiBjdXJyeU4ocmVkdWNlKG1heCwgMCwgcGx1Y2soJ2xlbmd0aCcsIHByZWRzKSksIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaWR4ID0gMDtcbiAgICB2YXIgbGVuID0gcHJlZHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgICAgaWYgKCFwcmVkc1tpZHhdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZHggKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgYWxsUGFzczsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFsd2F5cyByZXR1cm5zIHRoZSBnaXZlbiB2YWx1ZS4gTm90ZSB0aGF0IGZvclxuICogbm9uLXByaW1pdGl2ZXMgdGhlIHZhbHVlIHJldHVybmVkIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGtub3duIGFzIGBjb25zdGAsIGBjb25zdGFudGAsIG9yIGBLYCAoZm9yIEsgY29tYmluYXRvcikgaW5cbiAqIG90aGVyIGxhbmd1YWdlcyBhbmQgbGlicmFyaWVzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIGEgLT4gKCogLT4gYSlcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB3cmFwIGluIGEgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIEZ1bmN0aW9uIDo6ICogLT4gdmFsLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHQgPSBSLmFsd2F5cygnVGVlJyk7XG4gKiAgICAgIHQoKTsgLy89PiAnVGVlJ1xuICovXG5cbnZhciBhbHdheXMgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiBhbHdheXModmFsKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBhbHdheXM7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudCBpZiBpdCBpcyBmYWxzeSwgb3RoZXJ3aXNlIHRoZSBzZWNvbmQgYXJndW1lbnQuXG4gKiBBY3RzIGFzIHRoZSBib29sZWFuIGBhbmRgIHN0YXRlbWVudCBpZiBib3RoIGlucHV0cyBhcmUgYEJvb2xlYW5gcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMb2dpY1xuICogQHNpZyBhIC0+IGIgLT4gYSB8IGJcbiAqIEBwYXJhbSB7QW55fSBhXG4gKiBAcGFyYW0ge0FueX0gYlxuICogQHJldHVybiB7QW55fVxuICogQHNlZSBSLmJvdGgsIFIub3JcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmFuZCh0cnVlLCB0cnVlKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuYW5kKHRydWUsIGZhbHNlKTsgLy89PiBmYWxzZVxuICogICAgICBSLmFuZChmYWxzZSwgdHJ1ZSk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5hbmQoZmFsc2UsIGZhbHNlKTsgLy89PiBmYWxzZVxuICovXG5cbnZhciBhbmQgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBhbmQoYSwgYikge1xuICByZXR1cm4gYSAmJiBiO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGFuZDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2Fzc2VydFByb21pc2UgZnJvbSBcIi4vaW50ZXJuYWwvX2Fzc2VydFByb21pc2UuanNcIjtcbi8qKlxuICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBvblN1Y2Nlc3MgZnVuY3Rpb24gdG8gdGhlIHZhbHVlIGluc2lkZVxuICogYSBzdWNjZXNzZnVsbHkgcmVzb2x2ZWQgcHJvbWlzZS4gVGhpcyBpcyB1c2VmdWwgZm9yIHdvcmtpbmcgd2l0aCBwcm9taXNlc1xuICogaW5zaWRlIGZ1bmN0aW9uIGNvbXBvc2l0aW9ucy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yNy4xXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKGEgLT4gYikgLT4gKFByb21pc2UgZSBhKSAtPiAoUHJvbWlzZSBlIGIpXG4gKiBAc2lnIChhIC0+IChQcm9taXNlIGUgYikpIC0+IChQcm9taXNlIGUgYSkgLT4gKFByb21pc2UgZSBiKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIFRoZSBmdW5jdGlvbiB0byBhcHBseS4gQ2FuIHJldHVybiBhIHZhbHVlIG9yIGEgcHJvbWlzZSBvZiBhIHZhbHVlLlxuICogQHBhcmFtIHtQcm9taXNlfSBwXG4gKiBAcmV0dXJuIHtQcm9taXNlfSBUaGUgcmVzdWx0IG9mIGNhbGxpbmcgYHAudGhlbihvblN1Y2Nlc3MpYFxuICogQHNlZSBSLm90aGVyd2lzZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IG1ha2VRdWVyeSA9IGVtYWlsID0+ICh7IHF1ZXJ5OiB7IGVtYWlsIH19KTtcbiAqICAgICAgY29uc3QgZmV0Y2hNZW1iZXIgPSByZXF1ZXN0ID0+XG4gKiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHsgZmlyc3ROYW1lOiAnQm9iJywgbGFzdE5hbWU6ICdMb2JsYXcnLCBpZDogNDIgfSk7XG4gKlxuICogICAgICAvL2dldE1lbWJlck5hbWUgOjogU3RyaW5nIC0+IFByb21pc2UgKHsgZmlyc3ROYW1lLCBsYXN0TmFtZSB9KVxuICogICAgICBjb25zdCBnZXRNZW1iZXJOYW1lID0gUi5waXBlKFxuICogICAgICAgIG1ha2VRdWVyeSxcbiAqICAgICAgICBmZXRjaE1lbWJlcixcbiAqICAgICAgICBSLmFuZFRoZW4oUi5waWNrKFsnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJ10pKVxuICogICAgICApO1xuICpcbiAqICAgICAgZ2V0TWVtYmVyTmFtZSgnYm9iQGdtYWlsLmNvbScpLnRoZW4oY29uc29sZS5sb2cpO1xuICovXG5cbnZhciBhbmRUaGVuID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gYW5kVGhlbihmLCBwKSB7XG4gIF9hc3NlcnRQcm9taXNlKCdhbmRUaGVuJywgcCk7XG5cbiAgcmV0dXJuIHAudGhlbihmKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBhbmRUaGVuOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfeGFueSBmcm9tIFwiLi9pbnRlcm5hbC9feGFueS5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBsaXN0IG1hdGNoIHRoZSBwcmVkaWNhdGUsXG4gKiBgZmFsc2VgIG90aGVyd2lzZS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgYW55YCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiBbYV0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBwcmVkaWNhdGUgaXMgc2F0aXNmaWVkIGJ5IGF0IGxlYXN0IG9uZSBlbGVtZW50LCBgZmFsc2VgXG4gKiAgICAgICAgIG90aGVyd2lzZS5cbiAqIEBzZWUgUi5hbGwsIFIubm9uZSwgUi50cmFuc2R1Y2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBsZXNzVGhhbjAgPSBSLmZsaXAoUi5sdCkoMCk7XG4gKiAgICAgIGNvbnN0IGxlc3NUaGFuMiA9IFIuZmxpcChSLmx0KSgyKTtcbiAqICAgICAgUi5hbnkobGVzc1RoYW4wKShbMSwgMl0pOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuYW55KGxlc3NUaGFuMikoWzEsIDJdKTsgLy89PiB0cnVlXG4gKi9cblxudmFyIGFueSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKFxuLyojX19QVVJFX18qL1xuX2Rpc3BhdGNoYWJsZShbJ2FueSddLCBfeGFueSwgZnVuY3Rpb24gYW55KGZuLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuXG4gIHdoaWxlIChpZHggPCBsaXN0Lmxlbmd0aCkge1xuICAgIGlmIChmbihsaXN0W2lkeF0pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn0pKTtcblxuZXhwb3J0IGRlZmF1bHQgYW55OyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBjdXJyeU4gZnJvbSBcIi4vY3VycnlOLmpzXCI7XG5pbXBvcnQgbWF4IGZyb20gXCIuL21heC5qc1wiO1xuaW1wb3J0IHBsdWNrIGZyb20gXCIuL3BsdWNrLmpzXCI7XG5pbXBvcnQgcmVkdWNlIGZyb20gXCIuL3JlZHVjZS5qc1wiO1xuLyoqXG4gKiBUYWtlcyBhIGxpc3Qgb2YgcHJlZGljYXRlcyBhbmQgcmV0dXJucyBhIHByZWRpY2F0ZSB0aGF0IHJldHVybnMgdHJ1ZSBmb3IgYVxuICogZ2l2ZW4gbGlzdCBvZiBhcmd1bWVudHMgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBwcm92aWRlZCBwcmVkaWNhdGVzIGlzXG4gKiBzYXRpc2ZpZWQgYnkgdGhvc2UgYXJndW1lbnRzLlxuICpcbiAqIFRoZSBmdW5jdGlvbiByZXR1cm5lZCBpcyBhIGN1cnJpZWQgZnVuY3Rpb24gd2hvc2UgYXJpdHkgbWF0Y2hlcyB0aGF0IG9mIHRoZVxuICogaGlnaGVzdC1hcml0eSBwcmVkaWNhdGUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOS4wXG4gKiBAY2F0ZWdvcnkgTG9naWNcbiAqIEBzaWcgWygqLi4uIC0+IEJvb2xlYW4pXSAtPiAoKi4uLiAtPiBCb29sZWFuKVxuICogQHBhcmFtIHtBcnJheX0gcHJlZGljYXRlcyBBbiBhcnJheSBvZiBwcmVkaWNhdGVzIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGNvbWJpbmVkIHByZWRpY2F0ZVxuICogQHNlZSBSLmFsbFBhc3MsIFIuZWl0aGVyXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgaXNDbHViID0gUi5wcm9wRXEoJ3N1aXQnLCAn4pmjJyk7XG4gKiAgICAgIGNvbnN0IGlzU3BhZGUgPSBSLnByb3BFcSgnc3VpdCcsICfimaAnKTtcbiAqICAgICAgY29uc3QgaXNCbGFja0NhcmQgPSBSLmFueVBhc3MoW2lzQ2x1YiwgaXNTcGFkZV0pO1xuICpcbiAqICAgICAgaXNCbGFja0NhcmQoe3Jhbms6ICcxMCcsIHN1aXQ6ICfimaMnfSk7IC8vPT4gdHJ1ZVxuICogICAgICBpc0JsYWNrQ2FyZCh7cmFuazogJ1EnLCBzdWl0OiAn4pmgJ30pOyAvLz0+IHRydWVcbiAqICAgICAgaXNCbGFja0NhcmQoe3Jhbms6ICdRJywgc3VpdDogJ+KZpid9KTsgLy89PiBmYWxzZVxuICovXG5cbnZhciBhbnlQYXNzID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoZnVuY3Rpb24gYW55UGFzcyhwcmVkcykge1xuICByZXR1cm4gY3VycnlOKHJlZHVjZShtYXgsIDAsIHBsdWNrKCdsZW5ndGgnLCBwcmVkcykpLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGlkeCA9IDA7XG4gICAgdmFyIGxlbiA9IHByZWRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICAgIGlmIChwcmVkc1tpZHhdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlkeCArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgYW55UGFzczsiLCJpbXBvcnQgX2NvbmNhdCBmcm9tIFwiLi9pbnRlcm5hbC9fY29uY2F0LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX3JlZHVjZSBmcm9tIFwiLi9pbnRlcm5hbC9fcmVkdWNlLmpzXCI7XG5pbXBvcnQgbWFwIGZyb20gXCIuL21hcC5qc1wiO1xuLyoqXG4gKiBhcCBhcHBsaWVzIGEgbGlzdCBvZiBmdW5jdGlvbnMgdG8gYSBsaXN0IG9mIHZhbHVlcy5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgYXBgIG1ldGhvZCBvZiB0aGUgZmlyc3QgYXJndW1lbnQsIGlmIHByZXNlbnQuIEFsc29cbiAqIHRyZWF0cyBjdXJyaWVkIGZ1bmN0aW9ucyBhcyBhcHBsaWNhdGl2ZXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMy4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgW2EgLT4gYl0gLT4gW2FdIC0+IFtiXVxuICogQHNpZyBBcHBseSBmID0+IGYgKGEgLT4gYikgLT4gZiBhIC0+IGYgYlxuICogQHNpZyAociAtPiBhIC0+IGIpIC0+IChyIC0+IGEpIC0+IChyIC0+IGIpXG4gKiBAcGFyYW0geyp9IGFwcGx5RlxuICogQHBhcmFtIHsqfSBhcHBseVhcbiAqIEByZXR1cm4geyp9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5hcChbUi5tdWx0aXBseSgyKSwgUi5hZGQoMyldLCBbMSwyLDNdKTsgLy89PiBbMiwgNCwgNiwgNCwgNSwgNl1cbiAqICAgICAgUi5hcChbUi5jb25jYXQoJ3Rhc3R5ICcpLCBSLnRvVXBwZXJdLCBbJ3BpenphJywgJ3NhbGFkJ10pOyAvLz0+IFtcInRhc3R5IHBpenphXCIsIFwidGFzdHkgc2FsYWRcIiwgXCJQSVpaQVwiLCBcIlNBTEFEXCJdXG4gKlxuICogICAgICAvLyBSLmFwIGNhbiBhbHNvIGJlIHVzZWQgYXMgUyBjb21iaW5hdG9yXG4gKiAgICAgIC8vIHdoZW4gb25seSB0d28gZnVuY3Rpb25zIGFyZSBwYXNzZWRcbiAqICAgICAgUi5hcChSLmNvbmNhdCwgUi50b1VwcGVyKSgnUmFtZGEnKSAvLz0+ICdSYW1kYVJBTURBJ1xuICogQHN5bWIgUi5hcChbZiwgZ10sIFthLCBiXSkgPSBbZihhKSwgZihiKSwgZyhhKSwgZyhiKV1cbiAqL1xuXG52YXIgYXAgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBhcChhcHBseUYsIGFwcGx5WCkge1xuICByZXR1cm4gdHlwZW9mIGFwcGx5WFsnZmFudGFzeS1sYW5kL2FwJ10gPT09ICdmdW5jdGlvbicgPyBhcHBseVhbJ2ZhbnRhc3ktbGFuZC9hcCddKGFwcGx5RikgOiB0eXBlb2YgYXBwbHlGLmFwID09PSAnZnVuY3Rpb24nID8gYXBwbHlGLmFwKGFwcGx5WCkgOiB0eXBlb2YgYXBwbHlGID09PSAnZnVuY3Rpb24nID8gZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4gYXBwbHlGKHgpKGFwcGx5WCh4KSk7XG4gIH0gOiBfcmVkdWNlKGZ1bmN0aW9uIChhY2MsIGYpIHtcbiAgICByZXR1cm4gX2NvbmNhdChhY2MsIG1hcChmLCBhcHBseVgpKTtcbiAgfSwgW10sIGFwcGx5Rik7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgYXA7IiwiaW1wb3J0IF9hcGVydHVyZSBmcm9tIFwiLi9pbnRlcm5hbC9fYXBlcnR1cmUuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfeGFwZXJ0dXJlIGZyb20gXCIuL2ludGVybmFsL194YXBlcnR1cmUuanNcIjtcbi8qKlxuICogUmV0dXJucyBhIG5ldyBsaXN0LCBjb21wb3NlZCBvZiBuLXR1cGxlcyBvZiBjb25zZWN1dGl2ZSBlbGVtZW50cy4gSWYgYG5gIGlzXG4gKiBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCwgYW4gZW1wdHkgbGlzdCBpcyByZXR1cm5lZC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTIuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgTnVtYmVyIC0+IFthXSAtPiBbW2FdXVxuICogQHBhcmFtIHtOdW1iZXJ9IG4gVGhlIHNpemUgb2YgdGhlIHR1cGxlcyB0byBjcmVhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gc3BsaXQgaW50byBgbmAtbGVuZ3RoIHR1cGxlc1xuICogQHJldHVybiB7QXJyYXl9IFRoZSByZXN1bHRpbmcgbGlzdCBvZiBgbmAtbGVuZ3RoIHR1cGxlc1xuICogQHNlZSBSLnRyYW5zZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuYXBlcnR1cmUoMiwgWzEsIDIsIDMsIDQsIDVdKTsgLy89PiBbWzEsIDJdLCBbMiwgM10sIFszLCA0XSwgWzQsIDVdXVxuICogICAgICBSLmFwZXJ0dXJlKDMsIFsxLCAyLCAzLCA0LCA1XSk7IC8vPT4gW1sxLCAyLCAzXSwgWzIsIDMsIDRdLCBbMywgNCwgNV1dXG4gKiAgICAgIFIuYXBlcnR1cmUoNywgWzEsIDIsIDMsIDQsIDVdKTsgLy89PiBbXVxuICovXG5cbnZhciBhcGVydHVyZSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKFxuLyojX19QVVJFX18qL1xuX2Rpc3BhdGNoYWJsZShbXSwgX3hhcGVydHVyZSwgX2FwZXJ0dXJlKSk7XG5cbmV4cG9ydCBkZWZhdWx0IGFwZXJ0dXJlOyIsImltcG9ydCBfY29uY2F0IGZyb20gXCIuL2ludGVybmFsL19jb25jYXQuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbi8qKlxuICogUmV0dXJucyBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBsaXN0LCBmb2xsb3dlZCBieVxuICogdGhlIGdpdmVuIGVsZW1lbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7Kn0gZWwgVGhlIGVsZW1lbnQgdG8gYWRkIHRvIHRoZSBlbmQgb2YgdGhlIG5ldyBsaXN0LlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCBvZiBlbGVtZW50cyB0byBhZGQgYSBuZXcgaXRlbSB0by5cbiAqICAgICAgICBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhlIG9sZCBsaXN0IGZvbGxvd2VkIGJ5IGBlbGAuXG4gKiBAc2VlIFIucHJlcGVuZFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuYXBwZW5kKCd0ZXN0cycsIFsnd3JpdGUnLCAnbW9yZSddKTsgLy89PiBbJ3dyaXRlJywgJ21vcmUnLCAndGVzdHMnXVxuICogICAgICBSLmFwcGVuZCgndGVzdHMnLCBbXSk7IC8vPT4gWyd0ZXN0cyddXG4gKiAgICAgIFIuYXBwZW5kKFsndGVzdHMnXSwgWyd3cml0ZScsICdtb3JlJ10pOyAvLz0+IFsnd3JpdGUnLCAnbW9yZScsIFsndGVzdHMnXV1cbiAqL1xuXG52YXIgYXBwZW5kID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gYXBwZW5kKGVsLCBsaXN0KSB7XG4gIHJldHVybiBfY29uY2F0KGxpc3QsIFtlbF0pO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGFwcGVuZDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIEFwcGxpZXMgZnVuY3Rpb24gYGZuYCB0byB0aGUgYXJndW1lbnQgbGlzdCBgYXJnc2AuIFRoaXMgaXMgdXNlZnVsIGZvclxuICogY3JlYXRpbmcgYSBmaXhlZC1hcml0eSBmdW5jdGlvbiBmcm9tIGEgdmFyaWFkaWMgZnVuY3Rpb24uIGBmbmAgc2hvdWxkIGJlIGFcbiAqIGJvdW5kIGZ1bmN0aW9uIGlmIGNvbnRleHQgaXMgc2lnbmlmaWNhbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNy4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKCouLi4gLT4gYSkgLT4gWypdIC0+IGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aXRoIGBhcmdzYFxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGNhbGwgYGZuYCB3aXRoXG4gKiBAcmV0dXJuIHsqfSByZXN1bHQgVGhlIHJlc3VsdCwgZXF1aXZhbGVudCB0byBgZm4oLi4uYXJncylgXG4gKiBAc2VlIFIuY2FsbCwgUi51bmFwcGx5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgbnVtcyA9IFsxLCAyLCAzLCAtOTksIDQyLCA2LCA3XTtcbiAqICAgICAgUi5hcHBseShNYXRoLm1heCwgbnVtcyk7IC8vPT4gNDJcbiAqIEBzeW1iIFIuYXBwbHkoZiwgW2EsIGIsIGNdKSA9IGYoYSwgYiwgYylcbiAqL1xuXG52YXIgYXBwbHkgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBhcHBseShmbiwgYXJncykge1xuICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncyk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgYXBwbHk7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL2ludGVybmFsL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgYXBwbHkgZnJvbSBcIi4vYXBwbHkuanNcIjtcbmltcG9ydCBjdXJyeU4gZnJvbSBcIi4vY3VycnlOLmpzXCI7XG5pbXBvcnQgbWF4IGZyb20gXCIuL21heC5qc1wiO1xuaW1wb3J0IHBsdWNrIGZyb20gXCIuL3BsdWNrLmpzXCI7XG5pbXBvcnQgcmVkdWNlIGZyb20gXCIuL3JlZHVjZS5qc1wiO1xuaW1wb3J0IGtleXMgZnJvbSBcIi4va2V5cy5qc1wiO1xuaW1wb3J0IHZhbHVlcyBmcm9tIFwiLi92YWx1ZXMuanNcIjsgLy8gVXNlIGN1c3RvbSBtYXBWYWx1ZXMgZnVuY3Rpb24gdG8gYXZvaWQgaXNzdWVzIHdpdGggc3BlY3MgdGhhdCBpbmNsdWRlIGEgXCJtYXBcIiBrZXkgYW5kIFIubWFwXG4vLyBkZWxlZ2F0aW5nIGNhbGxzIHRvIC5tYXBcblxuZnVuY3Rpb24gbWFwVmFsdWVzKGZuLCBvYmopIHtcbiAgcmV0dXJuIF9pc0FycmF5KG9iaikgPyBvYmoubWFwKGZuKSA6IGtleXMob2JqKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgYWNjW2tleV0gPSBmbihvYmpba2V5XSk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xufVxuLyoqXG4gKiBHaXZlbiBhIHNwZWMgb2JqZWN0IHJlY3Vyc2l2ZWx5IG1hcHBpbmcgcHJvcGVydGllcyB0byBmdW5jdGlvbnMsIGNyZWF0ZXMgYVxuICogZnVuY3Rpb24gcHJvZHVjaW5nIGFuIG9iamVjdCBvZiB0aGUgc2FtZSBzdHJ1Y3R1cmUsIGJ5IG1hcHBpbmcgZWFjaCBwcm9wZXJ0eVxuICogdG8gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGl0cyBhc3NvY2lhdGVkIGZ1bmN0aW9uIHdpdGggdGhlIHN1cHBsaWVkIGFyZ3VtZW50cy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yMC4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcge2s6ICgoYSwgYiwgLi4uLCBtKSAtPiB2KX0gLT4gKChhLCBiLCAuLi4sIG0pIC0+IHtrOiB2fSlcbiAqIEBwYXJhbSB7T2JqZWN0fSBzcGVjIGFuIG9iamVjdCByZWN1cnNpdmVseSBtYXBwaW5nIHByb3BlcnRpZXMgdG8gZnVuY3Rpb25zIGZvclxuICogICAgICAgIHByb2R1Y2luZyB0aGUgdmFsdWVzIGZvciB0aGVzZSBwcm9wZXJ0aWVzLlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIG9iamVjdCBvZiB0aGUgc2FtZSBzdHJ1Y3R1cmVcbiAqIGFzIGBzcGVjJywgd2l0aCBlYWNoIHByb3BlcnR5IHNldCB0byB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgY2FsbGluZyBpdHNcbiAqIGFzc29jaWF0ZWQgZnVuY3Rpb24gd2l0aCB0aGUgc3VwcGxpZWQgYXJndW1lbnRzLlxuICogQHNlZSBSLmNvbnZlcmdlLCBSLmp1eHRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBnZXRNZXRyaWNzID0gUi5hcHBseVNwZWMoe1xuICogICAgICAgIHN1bTogUi5hZGQsXG4gKiAgICAgICAgbmVzdGVkOiB7IG11bDogUi5tdWx0aXBseSB9XG4gKiAgICAgIH0pO1xuICogICAgICBnZXRNZXRyaWNzKDIsIDQpOyAvLyA9PiB7IHN1bTogNiwgbmVzdGVkOiB7IG11bDogOCB9IH1cbiAqIEBzeW1iIFIuYXBwbHlTcGVjKHsgeDogZiwgeTogeyB6OiBnIH0gfSkoYSwgYikgPSB7IHg6IGYoYSwgYiksIHk6IHsgejogZyhhLCBiKSB9IH1cbiAqL1xuXG5cbnZhciBhcHBseVNwZWMgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiBhcHBseVNwZWMoc3BlYykge1xuICBzcGVjID0gbWFwVmFsdWVzKGZ1bmN0aW9uICh2KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09ICdmdW5jdGlvbicgPyB2IDogYXBwbHlTcGVjKHYpO1xuICB9LCBzcGVjKTtcbiAgcmV0dXJuIGN1cnJ5TihyZWR1Y2UobWF4LCAwLCBwbHVjaygnbGVuZ3RoJywgdmFsdWVzKHNwZWMpKSksIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gbWFwVmFsdWVzKGZ1bmN0aW9uIChmKSB7XG4gICAgICByZXR1cm4gYXBwbHkoZiwgYXJncyk7XG4gICAgfSwgc3BlYyk7XG4gIH0pO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGFwcGx5U3BlYzsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIFRha2VzIGEgdmFsdWUgYW5kIGFwcGxpZXMgYSBmdW5jdGlvbiB0byBpdC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGFsc28ga25vd24gYXMgdGhlIGB0aHJ1c2hgIGNvbWJpbmF0b3IuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjUuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIGEgLT4gKGEgLT4gYikgLT4gYlxuICogQHBhcmFtIHsqfSB4IFRoZSB2YWx1ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZiBUaGUgZnVuY3Rpb24gdG8gYXBwbHlcbiAqIEByZXR1cm4geyp9IFRoZSByZXN1bHQgb2YgYXBwbHlpbmcgYGZgIHRvIGB4YFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHQ0MiA9IFIuYXBwbHlUbyg0Mik7XG4gKiAgICAgIHQ0MihSLmlkZW50aXR5KTsgLy89PiA0MlxuICogICAgICB0NDIoUi5hZGQoMSkpOyAvLz0+IDQzXG4gKi9cblxudmFyIGFwcGx5VG8gPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBhcHBseVRvKHgsIGYpIHtcbiAgcmV0dXJuIGYoeCk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgYXBwbHlUbzsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG4vKipcbiAqIE1ha2VzIGFuIGFzY2VuZGluZyBjb21wYXJhdG9yIGZ1bmN0aW9uIG91dCBvZiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHZhbHVlXG4gKiB0aGF0IGNhbiBiZSBjb21wYXJlZCB3aXRoIGA8YCBhbmQgYD5gLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIzLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBPcmQgYiA9PiAoYSAtPiBiKSAtPiBhIC0+IGEgLT4gTnVtYmVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBBIGZ1bmN0aW9uIG9mIGFyaXR5IG9uZSB0aGF0IHJldHVybnMgYSB2YWx1ZSB0aGF0IGNhbiBiZSBjb21wYXJlZFxuICogQHBhcmFtIHsqfSBhIFRoZSBmaXJzdCBpdGVtIHRvIGJlIGNvbXBhcmVkLlxuICogQHBhcmFtIHsqfSBiIFRoZSBzZWNvbmQgaXRlbSB0byBiZSBjb21wYXJlZC5cbiAqIEByZXR1cm4ge051bWJlcn0gYC0xYCBpZiBmbihhKSA8IGZuKGIpLCBgMWAgaWYgZm4oYikgPCBmbihhKSwgb3RoZXJ3aXNlIGAwYFxuICogQHNlZSBSLmRlc2NlbmRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBieUFnZSA9IFIuYXNjZW5kKFIucHJvcCgnYWdlJykpO1xuICogICAgICBjb25zdCBwZW9wbGUgPSBbXG4gKiAgICAgICAgeyBuYW1lOiAnRW1tYScsIGFnZTogNzAgfSxcbiAqICAgICAgICB7IG5hbWU6ICdQZXRlcicsIGFnZTogNzggfSxcbiAqICAgICAgICB7IG5hbWU6ICdNaWtoYWlsJywgYWdlOiA2MiB9LFxuICogICAgICBdO1xuICogICAgICBjb25zdCBwZW9wbGVCeVlvdW5nZXN0Rmlyc3QgPSBSLnNvcnQoYnlBZ2UsIHBlb3BsZSk7XG4gKiAgICAgICAgLy89PiBbeyBuYW1lOiAnTWlraGFpbCcsIGFnZTogNjIgfSx7IG5hbWU6ICdFbW1hJywgYWdlOiA3MCB9LCB7IG5hbWU6ICdQZXRlcicsIGFnZTogNzggfV1cbiAqL1xuXG52YXIgYXNjZW5kID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTMoZnVuY3Rpb24gYXNjZW5kKGZuLCBhLCBiKSB7XG4gIHZhciBhYSA9IGZuKGEpO1xuICB2YXIgYmIgPSBmbihiKTtcbiAgcmV0dXJuIGFhIDwgYmIgPyAtMSA6IGFhID4gYmIgPyAxIDogMDtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBhc2NlbmQ7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IGFzc29jUGF0aCBmcm9tIFwiLi9hc3NvY1BhdGguanNcIjtcbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIGFuIG9iamVjdCwgc2V0dGluZyBvciBvdmVycmlkaW5nIHRoZSBzcGVjaWZpZWRcbiAqIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIHZhbHVlLiBOb3RlIHRoYXQgdGhpcyBjb3BpZXMgYW5kIGZsYXR0ZW5zIHByb3RvdHlwZVxuICogcHJvcGVydGllcyBvbnRvIHRoZSBuZXcgb2JqZWN0IGFzIHdlbGwuIEFsbCBub24tcHJpbWl0aXZlIHByb3BlcnRpZXMgYXJlXG4gKiBjb3BpZWQgYnkgcmVmZXJlbmNlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjguMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludFxuICogQHNpZyBJZHggLT4gYSAtPiB7azogdn0gLT4ge2s6IHZ9XG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHByb3AgVGhlIHByb3BlcnR5IG5hbWUgdG8gc2V0XG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgbmV3IHZhbHVlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2xvbmVcbiAqIEByZXR1cm4ge09iamVjdH0gQSBuZXcgb2JqZWN0IGVxdWl2YWxlbnQgdG8gdGhlIG9yaWdpbmFsIGV4Y2VwdCBmb3IgdGhlIGNoYW5nZWQgcHJvcGVydHkuXG4gKiBAc2VlIFIuZGlzc29jLCBSLnBpY2tcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmFzc29jKCdjJywgMywge2E6IDEsIGI6IDJ9KTsgLy89PiB7YTogMSwgYjogMiwgYzogM31cbiAqL1xuXG52YXIgYXNzb2MgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MyhmdW5jdGlvbiBhc3NvYyhwcm9wLCB2YWwsIG9iaikge1xuICByZXR1cm4gYXNzb2NQYXRoKFtwcm9wXSwgdmFsLCBvYmopO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGFzc29jOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL2ludGVybmFsL19oYXMuanNcIjtcbmltcG9ydCBfaXNJbnRlZ2VyIGZyb20gXCIuL2ludGVybmFsL19pc0ludGVnZXIuanNcIjtcbmltcG9ydCBfYXNzb2MgZnJvbSBcIi4vaW50ZXJuYWwvX2Fzc29jLmpzXCI7XG5pbXBvcnQgaXNOaWwgZnJvbSBcIi4vaXNOaWwuanNcIjtcbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIGFuIG9iamVjdCwgc2V0dGluZyBvciBvdmVycmlkaW5nIHRoZSBub2RlcyByZXF1aXJlZFxuICogdG8gY3JlYXRlIHRoZSBnaXZlbiBwYXRoLCBhbmQgcGxhY2luZyB0aGUgc3BlY2lmaWMgdmFsdWUgYXQgdGhlIHRhaWwgZW5kIG9mXG4gKiB0aGF0IHBhdGguIE5vdGUgdGhhdCB0aGlzIGNvcGllcyBhbmQgZmxhdHRlbnMgcHJvdG90eXBlIHByb3BlcnRpZXMgb250byB0aGVcbiAqIG5ldyBvYmplY3QgYXMgd2VsbC4gQWxsIG5vbi1wcmltaXRpdmUgcHJvcGVydGllcyBhcmUgY29waWVkIGJ5IHJlZmVyZW5jZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC44LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgW0lkeF0gLT4gYSAtPiB7YX0gLT4ge2F9XG4gKiBAcGFyYW0ge0FycmF5fSBwYXRoIHRoZSBwYXRoIHRvIHNldFxuICogQHBhcmFtIHsqfSB2YWwgVGhlIG5ldyB2YWx1ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbCBleGNlcHQgYWxvbmcgdGhlIHNwZWNpZmllZCBwYXRoLlxuICogQHNlZSBSLmRpc3NvY1BhdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmFzc29jUGF0aChbJ2EnLCAnYicsICdjJ10sIDQyLCB7YToge2I6IHtjOiAwfX19KTsgLy89PiB7YToge2I6IHtjOiA0Mn19fVxuICpcbiAqICAgICAgLy8gQW55IG1pc3Npbmcgb3Igbm9uLW9iamVjdCBrZXlzIGluIHBhdGggd2lsbCBiZSBvdmVycmlkZGVuXG4gKiAgICAgIFIuYXNzb2NQYXRoKFsnYScsICdiJywgJ2MnXSwgNDIsIHthOiA1fSk7IC8vPT4ge2E6IHtiOiB7YzogNDJ9fX1cbiAqL1xuXG52YXIgYXNzb2NQYXRoID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTMoZnVuY3Rpb24gYXNzb2NQYXRoKHBhdGgsIHZhbCwgb2JqKSB7XG4gIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICB2YXIgaWR4ID0gcGF0aFswXTtcblxuICBpZiAocGF0aC5sZW5ndGggPiAxKSB7XG4gICAgdmFyIG5leHRPYmogPSAhaXNOaWwob2JqKSAmJiBfaGFzKGlkeCwgb2JqKSAmJiB0eXBlb2Ygb2JqW2lkeF0gPT09ICdvYmplY3QnID8gb2JqW2lkeF0gOiBfaXNJbnRlZ2VyKHBhdGhbMV0pID8gW10gOiB7fTtcbiAgICB2YWwgPSBhc3NvY1BhdGgoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocGF0aCwgMSksIHZhbCwgbmV4dE9iaik7XG4gIH1cblxuICByZXR1cm4gX2Fzc29jKGlkeCwgdmFsLCBvYmopO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGFzc29jUGF0aDsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgbkFyeSBmcm9tIFwiLi9uQXJ5LmpzXCI7XG4vKipcbiAqIFdyYXBzIGEgZnVuY3Rpb24gb2YgYW55IGFyaXR5IChpbmNsdWRpbmcgbnVsbGFyeSkgaW4gYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHNcbiAqIGV4YWN0bHkgMiBwYXJhbWV0ZXJzLiBBbnkgZXh0cmFuZW91cyBwYXJhbWV0ZXJzIHdpbGwgbm90IGJlIHBhc3NlZCB0byB0aGVcbiAqIHN1cHBsaWVkIGZ1bmN0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIChhIC0+IGIgLT4gYyAtPiAuLi4gLT4geikgLT4gKChhLCBiKSAtPiB6KVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcgZnVuY3Rpb24gd3JhcHBpbmcgYGZuYC4gVGhlIG5ldyBmdW5jdGlvbiBpcyBndWFyYW50ZWVkIHRvIGJlIG9mXG4gKiAgICAgICAgIGFyaXR5IDIuXG4gKiBAc2VlIFIubkFyeSwgUi51bmFyeVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHRha2VzVGhyZWVBcmdzID0gZnVuY3Rpb24oYSwgYiwgYykge1xuICogICAgICAgIHJldHVybiBbYSwgYiwgY107XG4gKiAgICAgIH07XG4gKiAgICAgIHRha2VzVGhyZWVBcmdzLmxlbmd0aDsgLy89PiAzXG4gKiAgICAgIHRha2VzVGhyZWVBcmdzKDEsIDIsIDMpOyAvLz0+IFsxLCAyLCAzXVxuICpcbiAqICAgICAgY29uc3QgdGFrZXNUd29BcmdzID0gUi5iaW5hcnkodGFrZXNUaHJlZUFyZ3MpO1xuICogICAgICB0YWtlc1R3b0FyZ3MubGVuZ3RoOyAvLz0+IDJcbiAqICAgICAgLy8gT25seSAyIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIHRoZSB3cmFwcGVkIGZ1bmN0aW9uXG4gKiAgICAgIHRha2VzVHdvQXJncygxLCAyLCAzKTsgLy89PiBbMSwgMiwgdW5kZWZpbmVkXVxuICogQHN5bWIgUi5iaW5hcnkoZikoYSwgYiwgYykgPSBmKGEsIGIpXG4gKi9cblxudmFyIGJpbmFyeSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIGJpbmFyeShmbikge1xuICByZXR1cm4gbkFyeSgyLCBmbik7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgYmluYXJ5OyIsImltcG9ydCBfYXJpdHkgZnJvbSBcIi4vaW50ZXJuYWwvX2FyaXR5LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGlzIGJvdW5kIHRvIGEgY29udGV4dC5cbiAqIE5vdGU6IGBSLmJpbmRgIGRvZXMgbm90IHByb3ZpZGUgdGhlIGFkZGl0aW9uYWwgYXJndW1lbnQtYmluZGluZyBjYXBhYmlsaXRpZXMgb2ZcbiAqIFtGdW5jdGlvbi5wcm90b3R5cGUuYmluZF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRnVuY3Rpb24vYmluZCkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNi4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKCogLT4gKikgLT4geyp9IC0+ICgqIC0+ICopXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gYmluZCB0byBjb250ZXh0XG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc09iaiBUaGUgY29udGV4dCB0byBiaW5kIGBmbmAgdG9cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBleGVjdXRlIGluIHRoZSBjb250ZXh0IG9mIGB0aGlzT2JqYC5cbiAqIEBzZWUgUi5wYXJ0aWFsXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgbG9nID0gUi5iaW5kKGNvbnNvbGUubG9nLCBjb25zb2xlKTtcbiAqICAgICAgUi5waXBlKFIuYXNzb2MoJ2EnLCAyKSwgUi50YXAobG9nKSwgUi5hc3NvYygnYScsIDMpKSh7YTogMX0pOyAvLz0+IHthOiAzfVxuICogICAgICAvLyBsb2dzIHthOiAyfVxuICogQHN5bWIgUi5iaW5kKGYsIG8pKGEsIGIpID0gZi5jYWxsKG8sIGEsIGIpXG4gKi9cblxudmFyIGJpbmQgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBiaW5kKGZuLCB0aGlzT2JqKSB7XG4gIHJldHVybiBfYXJpdHkoZm4ubGVuZ3RoLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNPYmosIGFyZ3VtZW50cyk7XG4gIH0pO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGJpbmQ7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCIuL2ludGVybmFsL19pc0Z1bmN0aW9uLmpzXCI7XG5pbXBvcnQgYW5kIGZyb20gXCIuL2FuZC5qc1wiO1xuaW1wb3J0IGxpZnQgZnJvbSBcIi4vbGlmdC5qc1wiO1xuLyoqXG4gKiBBIGZ1bmN0aW9uIHdoaWNoIGNhbGxzIHRoZSB0d28gcHJvdmlkZWQgZnVuY3Rpb25zIGFuZCByZXR1cm5zIHRoZSBgJiZgXG4gKiBvZiB0aGUgcmVzdWx0cy5cbiAqIEl0IHJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgZmlyc3QgZnVuY3Rpb24gaWYgaXQgaXMgZmFsc2UteSBhbmQgdGhlIHJlc3VsdFxuICogb2YgdGhlIHNlY29uZCBmdW5jdGlvbiBvdGhlcndpc2UuIE5vdGUgdGhhdCB0aGlzIGlzIHNob3J0LWNpcmN1aXRlZCxcbiAqIG1lYW5pbmcgdGhhdCB0aGUgc2Vjb25kIGZ1bmN0aW9uIHdpbGwgbm90IGJlIGludm9rZWQgaWYgdGhlIGZpcnN0IHJldHVybnMgYVxuICogZmFsc2UteSB2YWx1ZS5cbiAqXG4gKiBJbiBhZGRpdGlvbiB0byBmdW5jdGlvbnMsIGBSLmJvdGhgIGFsc28gYWNjZXB0cyBhbnkgZmFudGFzeS1sYW5kIGNvbXBhdGlibGVcbiAqIGFwcGxpY2F0aXZlIGZ1bmN0b3IuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTIuMFxuICogQGNhdGVnb3J5IExvZ2ljXG4gKiBAc2lnICgqLi4uIC0+IEJvb2xlYW4pIC0+ICgqLi4uIC0+IEJvb2xlYW4pIC0+ICgqLi4uIC0+IEJvb2xlYW4pXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmIEEgcHJlZGljYXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBnIEFub3RoZXIgcHJlZGljYXRlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gYSBmdW5jdGlvbiB0aGF0IGFwcGxpZXMgaXRzIGFyZ3VtZW50cyB0byBgZmAgYW5kIGBnYCBhbmQgYCYmYHMgdGhlaXIgb3V0cHV0cyB0b2dldGhlci5cbiAqIEBzZWUgUi5laXRoZXIsIFIuYWxsUGFzcywgUi5hbmRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBndDEwID0gUi5ndChSLl9fLCAxMClcbiAqICAgICAgY29uc3QgbHQyMCA9IFIubHQoUi5fXywgMjApXG4gKiAgICAgIGNvbnN0IGYgPSBSLmJvdGgoZ3QxMCwgbHQyMCk7XG4gKiAgICAgIGYoMTUpOyAvLz0+IHRydWVcbiAqICAgICAgZigzMCk7IC8vPT4gZmFsc2VcbiAqXG4gKiAgICAgIFIuYm90aChNYXliZS5KdXN0KGZhbHNlKSwgTWF5YmUuSnVzdCg1NSkpOyAvLyA9PiBNYXliZS5KdXN0KGZhbHNlKVxuICogICAgICBSLmJvdGgoW2ZhbHNlLCBmYWxzZSwgJ2EnXSwgWzExXSk7IC8vPT4gW2ZhbHNlLCBmYWxzZSwgMTFdXG4gKi9cblxudmFyIGJvdGggPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBib3RoKGYsIGcpIHtcbiAgcmV0dXJuIF9pc0Z1bmN0aW9uKGYpID8gZnVuY3Rpb24gX2JvdGgoKSB7XG4gICAgcmV0dXJuIGYuYXBwbHkodGhpcywgYXJndW1lbnRzKSAmJiBnLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH0gOiBsaWZ0KGFuZCkoZiwgZyk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgYm90aDsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG4vKipcbiAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGl0cyBmaXJzdCBhcmd1bWVudCB3aXRoIHRoZSByZW1haW5pbmdcbiAqIGFyZ3VtZW50cy4gVGhpcyBpcyBvY2Nhc2lvbmFsbHkgdXNlZnVsIGFzIGEgY29udmVyZ2luZyBmdW5jdGlvbiBmb3JcbiAqIFtgUi5jb252ZXJnZWBdKCNjb252ZXJnZSk6IHRoZSBmaXJzdCBicmFuY2ggY2FuIHByb2R1Y2UgYSBmdW5jdGlvbiB3aGlsZSB0aGVcbiAqIHJlbWFpbmluZyBicmFuY2hlcyBwcm9kdWNlIHZhbHVlcyB0byBiZSBwYXNzZWQgdG8gdGhhdCBmdW5jdGlvbiBhcyBpdHNcbiAqIGFyZ3VtZW50cy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC45LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKCouLi4gLT4gYSksICouLi4pIC0+IGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBhcHBseSB0byB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7Li4uKn0gYXJncyBBbnkgbnVtYmVyIG9mIHBvc2l0aW9uYWwgYXJndW1lbnRzLlxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5hcHBseVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuY2FsbChSLmFkZCwgMSwgMik7IC8vPT4gM1xuICpcbiAqICAgICAgY29uc3QgaW5kZW50TiA9IFIucGlwZShcbiAqICAgICAgICBSLnJlcGVhdCgnICcpLFxuICogICAgICAgIFIuam9pbignJyksXG4gKiAgICAgICAgUi5yZXBsYWNlKC9eKD8hJCkvZ20pXG4gKiAgICAgICk7XG4gKlxuICogICAgICBjb25zdCBmb3JtYXQgPSBSLmNvbnZlcmdlKFxuICogICAgICAgIFIuY2FsbCxcbiAqICAgICAgICBbXG4gKiAgICAgICAgICBSLnBpcGUoUi5wcm9wKCdpbmRlbnQnKSwgaW5kZW50TiksXG4gKiAgICAgICAgICBSLnByb3AoJ3ZhbHVlJylcbiAqICAgICAgICBdXG4gKiAgICAgICk7XG4gKlxuICogICAgICBmb3JtYXQoe2luZGVudDogMiwgdmFsdWU6ICdmb29cXG5iYXJcXG5iYXpcXG4nfSk7IC8vPT4gJyAgZm9vXFxuICBiYXJcXG4gIGJhelxcbidcbiAqIEBzeW1iIFIuY2FsbChmLCBhLCBiKSA9IGYoYSwgYilcbiAqL1xuXG52YXIgY2FsbCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIGNhbGwoZm4pIHtcbiAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGNhbGw7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF9tYWtlRmxhdCBmcm9tIFwiLi9pbnRlcm5hbC9fbWFrZUZsYXQuanNcIjtcbmltcG9ydCBfeGNoYWluIGZyb20gXCIuL2ludGVybmFsL194Y2hhaW4uanNcIjtcbmltcG9ydCBtYXAgZnJvbSBcIi4vbWFwLmpzXCI7XG4vKipcbiAqIGBjaGFpbmAgbWFwcyBhIGZ1bmN0aW9uIG92ZXIgYSBsaXN0IGFuZCBjb25jYXRlbmF0ZXMgdGhlIHJlc3VsdHMuIGBjaGFpbmBcbiAqIGlzIGFsc28ga25vd24gYXMgYGZsYXRNYXBgIGluIHNvbWUgbGlicmFyaWVzLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBjaGFpbmAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQsXG4gKiBhY2NvcmRpbmcgdG8gdGhlIFtGYW50YXN5TGFuZCBDaGFpbiBzcGVjXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI2NoYWluKS5cbiAqXG4gKiBJZiBzZWNvbmQgYXJndW1lbnQgaXMgYSBmdW5jdGlvbiwgYGNoYWluKGYsIGcpKHgpYCBpcyBlcXVpdmFsZW50IHRvIGBmKGcoeCksIHgpYC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMy4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBDaGFpbiBtID0+IChhIC0+IG0gYikgLT4gbSBhIC0+IG0gYlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIG1hcCB3aXRoXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIG1hcCBvdmVyXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIHJlc3VsdCBvZiBmbGF0LW1hcHBpbmcgYGxpc3RgIHdpdGggYGZuYFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9IG4gPT4gW24sIG5dO1xuICogICAgICBSLmNoYWluKGR1cGxpY2F0ZSwgWzEsIDIsIDNdKTsgLy89PiBbMSwgMSwgMiwgMiwgMywgM11cbiAqXG4gKiAgICAgIFIuY2hhaW4oUi5hcHBlbmQsIFIuaGVhZCkoWzEsIDIsIDNdKTsgLy89PiBbMSwgMiwgMywgMV1cbiAqL1xuXG52YXIgY2hhaW4gPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5Mihcbi8qI19fUFVSRV9fKi9cbl9kaXNwYXRjaGFibGUoWydmYW50YXN5LWxhbmQvY2hhaW4nLCAnY2hhaW4nXSwgX3hjaGFpbiwgZnVuY3Rpb24gY2hhaW4oZm4sIG1vbmFkKSB7XG4gIGlmICh0eXBlb2YgbW9uYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBmbihtb25hZCh4KSkoeCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfbWFrZUZsYXQoZmFsc2UpKG1hcChmbiwgbW9uYWQpKTtcbn0pKTtcblxuZXhwb3J0IGRlZmF1bHQgY2hhaW47IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuLyoqXG4gKiBSZXN0cmljdHMgYSBudW1iZXIgdG8gYmUgd2l0aGluIGEgcmFuZ2UuXG4gKlxuICogQWxzbyB3b3JrcyBmb3Igb3RoZXIgb3JkZXJlZCB0eXBlcyBzdWNoIGFzIFN0cmluZ3MgYW5kIERhdGVzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIwLjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBPcmQgYSA9PiBhIC0+IGEgLT4gYSAtPiBhXG4gKiBAcGFyYW0ge051bWJlcn0gbWluaW11bSBUaGUgbG93ZXIgbGltaXQgb2YgdGhlIGNsYW1wIChpbmNsdXNpdmUpXG4gKiBAcGFyYW0ge051bWJlcn0gbWF4aW11bSBUaGUgdXBwZXIgbGltaXQgb2YgdGhlIGNsYW1wIChpbmNsdXNpdmUpXG4gKiBAcGFyYW0ge051bWJlcn0gdmFsdWUgVmFsdWUgdG8gYmUgY2xhbXBlZFxuICogQHJldHVybiB7TnVtYmVyfSBSZXR1cm5zIGBtaW5pbXVtYCB3aGVuIGB2YWwgPCBtaW5pbXVtYCwgYG1heGltdW1gIHdoZW4gYHZhbCA+IG1heGltdW1gLCByZXR1cm5zIGB2YWxgIG90aGVyd2lzZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuY2xhbXAoMSwgMTAsIC01KSAvLyA9PiAxXG4gKiAgICAgIFIuY2xhbXAoMSwgMTAsIDE1KSAvLyA9PiAxMFxuICogICAgICBSLmNsYW1wKDEsIDEwLCA0KSAgLy8gPT4gNFxuICovXG5cbnZhciBjbGFtcCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIGNsYW1wKG1pbiwgbWF4LCB2YWx1ZSkge1xuICBpZiAobWluID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaW4gbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIG1heCBpbiBjbGFtcChtaW4sIG1heCwgdmFsdWUpJyk7XG4gIH1cblxuICByZXR1cm4gdmFsdWUgPCBtaW4gPyBtaW4gOiB2YWx1ZSA+IG1heCA/IG1heCA6IHZhbHVlO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYW1wOyIsImltcG9ydCBfY2xvbmUgZnJvbSBcIi4vaW50ZXJuYWwvX2Nsb25lLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG4vKipcbiAqIENyZWF0ZXMgYSBkZWVwIGNvcHkgb2YgdGhlIHNvdXJjZSB0aGF0IGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZSBzb3VyY2VcbiAqIG9iamVjdCB3aXRob3V0IHJldGFpbmluZyBhbnkgcmVmZXJlbmNlcyB0byBpdC5cbiAqIFRoZSBzb3VyY2Ugb2JqZWN0IG1heSBjb250YWluIChuZXN0ZWQpIGBBcnJheWBzIGFuZCBgT2JqZWN0YHMsXG4gKiBgTnVtYmVyYHMsIGBTdHJpbmdgcywgYEJvb2xlYW5gcyBhbmQgYERhdGVgcy5cbiAqIGBGdW5jdGlvbmBzIGFyZSBhc3NpZ25lZCBieSByZWZlcmVuY2UgcmF0aGVyIHRoYW4gY29waWVkLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gYSBgY2xvbmVgIG1ldGhvZCBpZiBwcmVzZW50LlxuICpcbiAqIE5vdGUgdGhhdCBpZiB0aGUgc291cmNlIG9iamVjdCBoYXMgbXVsdGlwbGUgbm9kZXMgdGhhdCBzaGFyZSBhIHJlZmVyZW5jZSxcbiAqIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBoYXZlIHRoZSBzYW1lIHN0cnVjdHVyZSwgYnV0IHRoZSByZWZlcmVuY2VzIHdpbGxcbiAqIGJlIHBvaW50ZWQgdG8gdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgY2xvbmVkIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7Kn0gLT4geyp9XG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBvYmplY3Qgb3IgYXJyYXkgdG8gY2xvbmVcbiAqIEByZXR1cm4geyp9IEEgZGVlcGx5IGNsb25lZCBjb3B5IG9mIGB2YWxgXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3Qgb2JqZWN0cyA9IFt7fSwge30sIHt9XTtcbiAqICAgICAgY29uc3Qgb2JqZWN0c0Nsb25lID0gUi5jbG9uZShvYmplY3RzKTtcbiAqICAgICAgb2JqZWN0cyA9PT0gb2JqZWN0c0Nsb25lOyAvLz0+IGZhbHNlXG4gKiAgICAgIG9iamVjdHNbMF0gPT09IG9iamVjdHNDbG9uZVswXTsgLy89PiBmYWxzZVxuICovXG5cbnZhciBjbG9uZSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIGNsb25lKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZS5jbG9uZSA9PT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLmNsb25lKCkgOiBfY2xvbmUodmFsdWUsIHRydWUpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsb25lOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfcmVkdWNlIGZyb20gXCIuL2ludGVybmFsL19yZWR1Y2UuanNcIjtcbi8qKlxuICogU3BsaXRzIGEgbGlzdCBpbnRvIHN1Yi1saXN0cywgYmFzZWQgb24gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGEga2V5LXJldHVybmluZyBmdW5jdGlvbiBvbiBlYWNoIGVsZW1lbnQsXG4gKiBhbmQgZ3JvdXBpbmcgdGhlIHJlc3VsdHMgYWNjb3JkaW5nIHRvIHZhbHVlcyByZXR1cm5lZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yOC4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludCB8IFN5bWJvbFxuICogQHNpZyBJZHggYSA9PiAoYiAtPiBhKSAtPiBbYl0gLT4gW1tiXV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIDo6IGEgLT4gSWR4XG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBncm91cFxuICogQHJldHVybiB7QXJyYXl9XG4gKiAgICBBbiBhcnJheSBvZiBhcnJheXMgd2hlcmUgZWFjaCBzdWItYXJyYXkgY29udGFpbnMgaXRlbXMgZm9yIHdoaWNoXG4gKiAgICB0aGUgU3RyaW5nLXJldHVybmluZyBmdW5jdGlvbiBoYXMgcmV0dXJuZWQgdGhlIHNhbWUgdmFsdWUuXG4gKiBAc2VlIFIuZ3JvdXBCeSwgUi5wYXJ0aXRpb25cbiAqIEBleGFtcGxlXG4gKiAgICAgIFIuY29sbGVjdEJ5KFIucHJvcCgndHlwZScpLCBbXG4gKiAgICAgICAge3R5cGU6ICdicmVha2Zhc3QnLCBpdGVtOiAn4piV77iPJ30sXG4gKiAgICAgICAge3R5cGU6ICdsdW5jaCcsIGl0ZW06ICfwn4yvJ30sXG4gKiAgICAgICAge3R5cGU6ICdkaW5uZXInLCBpdGVtOiAn8J+NnSd9LFxuICogICAgICAgIHt0eXBlOiAnYnJlYWtmYXN0JywgaXRlbTogJ/CfpZAnfSxcbiAqICAgICAgICB7dHlwZTogJ2x1bmNoJywgaXRlbTogJ/CfjZUnfVxuICogICAgICBdKTtcbiAqXG4gKiAgICAgIC8vIFsgWyB7dHlwZTogJ2JyZWFrZmFzdCcsIGl0ZW06ICfimJXvuI8nfSxcbiAqICAgICAgLy8gICAgIHt0eXBlOiAnYnJlYWtmYXN0JywgaXRlbTogJ/CfpZAnfSBdLFxuICogICAgICAvLyAgIFsge3R5cGU6ICdsdW5jaCcsIGl0ZW06ICfwn4yvJ30sXG4gKiAgICAgIC8vICAgICB7dHlwZTogJ2x1bmNoJywgaXRlbTogJ/CfjZUnfSBdLFxuICogICAgICAvLyAgIFsge3R5cGU6ICdkaW5uZXInLCBpdGVtOiAn8J+NnSd9IF0gXVxuICovXG5cbnZhciBjb2xsZWN0QnkgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBjb2xsZWN0QnkoZm4sIGxpc3QpIHtcbiAgdmFyIGdyb3VwID0gX3JlZHVjZShmdW5jdGlvbiAobywgeCkge1xuICAgIHZhciB0YWcgPSBmbih4KTtcblxuICAgIGlmIChvW3RhZ10gPT09IHVuZGVmaW5lZCkge1xuICAgICAgb1t0YWddID0gW107XG4gICAgfVxuXG4gICAgb1t0YWddLnB1c2goeCk7XG4gICAgcmV0dXJuIG87XG4gIH0sIHt9LCBsaXN0KTtcblxuICB2YXIgbmV3TGlzdCA9IFtdO1xuXG4gIGZvciAodmFyIHRhZyBpbiBncm91cCkge1xuICAgIG5ld0xpc3QucHVzaChncm91cFt0YWddKTtcbiAgfVxuXG4gIHJldHVybiBuZXdMaXN0O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbGxlY3RCeTsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG4vKipcbiAqIE1ha2VzIGEgY29tcGFyYXRvciBmdW5jdGlvbiBvdXQgb2YgYSBmdW5jdGlvbiB0aGF0IHJlcG9ydHMgd2hldGhlciB0aGUgZmlyc3RcbiAqIGVsZW1lbnQgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKChhLCBiKSAtPiBCb29sZWFuKSAtPiAoKGEsIGIpIC0+IE51bWJlcilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgQSBwcmVkaWNhdGUgZnVuY3Rpb24gb2YgYXJpdHkgdHdvIHdoaWNoIHdpbGwgcmV0dXJuIGB0cnVlYCBpZiB0aGUgZmlyc3QgYXJndW1lbnRcbiAqIGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kLCBgZmFsc2VgIG90aGVyd2lzZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgRnVuY3Rpb24gOjogYSAtPiBiIC0+IEludCB0aGF0IHJldHVybnMgYC0xYCBpZiBhIDwgYiwgYDFgIGlmIGIgPCBhLCBvdGhlcndpc2UgYDBgXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgYnlBZ2UgPSBSLmNvbXBhcmF0b3IoKGEsIGIpID0+IGEuYWdlIDwgYi5hZ2UpO1xuICogICAgICBjb25zdCBwZW9wbGUgPSBbXG4gKiAgICAgICAgeyBuYW1lOiAnRW1tYScsIGFnZTogNzAgfSxcbiAqICAgICAgICB7IG5hbWU6ICdQZXRlcicsIGFnZTogNzggfSxcbiAqICAgICAgICB7IG5hbWU6ICdNaWtoYWlsJywgYWdlOiA2MiB9LFxuICogICAgICBdO1xuICogICAgICBjb25zdCBwZW9wbGVCeUluY3JlYXNpbmdBZ2UgPSBSLnNvcnQoYnlBZ2UsIHBlb3BsZSk7XG4gKiAgICAgICAgLy89PiBbeyBuYW1lOiAnTWlraGFpbCcsIGFnZTogNjIgfSx7IG5hbWU6ICdFbW1hJywgYWdlOiA3MCB9LCB7IG5hbWU6ICdQZXRlcicsIGFnZTogNzggfV1cbiAqL1xuXG52YXIgY29tcGFyYXRvciA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIGNvbXBhcmF0b3IocHJlZCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gcHJlZChhLCBiKSA/IC0xIDogcHJlZChiLCBhKSA/IDEgOiAwO1xuICB9O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBhcmF0b3I7IiwiaW1wb3J0IGxpZnQgZnJvbSBcIi4vbGlmdC5qc1wiO1xuaW1wb3J0IG5vdCBmcm9tIFwiLi9ub3QuanNcIjtcbi8qKlxuICogVGFrZXMgYSBmdW5jdGlvbiBgZmAgYW5kIHJldHVybnMgYSBmdW5jdGlvbiBgZ2Agc3VjaCB0aGF0IGlmIGNhbGxlZCB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50c1xuICogd2hlbiBgZmAgcmV0dXJucyBhIFwidHJ1dGh5XCIgdmFsdWUsIGBnYCByZXR1cm5zIGBmYWxzZWAgYW5kIHdoZW4gYGZgIHJldHVybnMgYSBcImZhbHN5XCIgdmFsdWUgYGdgIHJldHVybnMgYHRydWVgLlxuICpcbiAqIGBSLmNvbXBsZW1lbnRgIG1heSBiZSBhcHBsaWVkIHRvIGFueSBmdW5jdG9yXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTIuMFxuICogQGNhdGVnb3J5IExvZ2ljXG4gKiBAc2lnICgqLi4uIC0+ICopIC0+ICgqLi4uIC0+IEJvb2xlYW4pXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBzZWUgUi5ub3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBpc05vdE5pbCA9IFIuY29tcGxlbWVudChSLmlzTmlsKTtcbiAqICAgICAgUi5pc05pbChudWxsKTsgLy89PiB0cnVlXG4gKiAgICAgIGlzTm90TmlsKG51bGwpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXNOaWwoNyk7IC8vPT4gZmFsc2VcbiAqICAgICAgaXNOb3ROaWwoNyk7IC8vPT4gdHJ1ZVxuICovXG5cbnZhciBjb21wbGVtZW50ID1cbi8qI19fUFVSRV9fKi9cbmxpZnQobm90KTtcbmV4cG9ydCBkZWZhdWx0IGNvbXBsZW1lbnQ7IiwiaW1wb3J0IHBpcGUgZnJvbSBcIi4vcGlwZS5qc1wiO1xuaW1wb3J0IHJldmVyc2UgZnJvbSBcIi4vcmV2ZXJzZS5qc1wiO1xuLyoqXG4gKiBQZXJmb3JtcyByaWdodC10by1sZWZ0IGZ1bmN0aW9uIGNvbXBvc2l0aW9uLiBUaGUgbGFzdCBhcmd1bWVudCBtYXkgaGF2ZVxuICogYW55IGFyaXR5OyB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyBtdXN0IGJlIHVuYXJ5LlxuICpcbiAqICoqTm90ZToqKiBUaGUgcmVzdWx0IG9mIGNvbXBvc2UgaXMgbm90IGF1dG9tYXRpY2FsbHkgY3VycmllZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKHkgLT4geiksICh4IC0+IHkpLCAuLi4sIChvIC0+IHApLCAoKGEsIGIsIC4uLiwgbikgLT4gbykpIC0+ICgoYSwgYiwgLi4uLCBuKSAtPiB6KVxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gLi4uZnVuY3Rpb25zIFRoZSBmdW5jdGlvbnMgdG8gY29tcG9zZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAc2VlIFIucGlwZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGNsYXNzeUdyZWV0aW5nID0gKGZpcnN0TmFtZSwgbGFzdE5hbWUpID0+IFwiVGhlIG5hbWUncyBcIiArIGxhc3ROYW1lICsgXCIsIFwiICsgZmlyc3ROYW1lICsgXCIgXCIgKyBsYXN0TmFtZVxuICogICAgICBjb25zdCB5ZWxsR3JlZXRpbmcgPSBSLmNvbXBvc2UoUi50b1VwcGVyLCBjbGFzc3lHcmVldGluZyk7XG4gKiAgICAgIHllbGxHcmVldGluZygnSmFtZXMnLCAnQm9uZCcpOyAvLz0+IFwiVEhFIE5BTUUnUyBCT05ELCBKQU1FUyBCT05EXCJcbiAqXG4gKiAgICAgIFIuY29tcG9zZShNYXRoLmFicywgUi5hZGQoMSksIFIubXVsdGlwbHkoMikpKC00KSAvLz0+IDdcbiAqXG4gKiBAc3ltYiBSLmNvbXBvc2UoZiwgZywgaCkoYSwgYikgPSBmKGcoaChhLCBiKSkpXG4gKiBAc3ltYiBSLmNvbXBvc2UoZiwgZywgaCkoYSkoYikgPSBmKGcoaChhKSkpKGIpXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcG9zZSgpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbXBvc2UgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50Jyk7XG4gIH1cblxuICByZXR1cm4gcGlwZS5hcHBseSh0aGlzLCByZXZlcnNlKGFyZ3VtZW50cykpO1xufSIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBwaXBlV2l0aCBmcm9tIFwiLi9waXBlV2l0aC5qc1wiO1xuaW1wb3J0IHJldmVyc2UgZnJvbSBcIi4vcmV2ZXJzZS5qc1wiO1xuLyoqXG4gKiBQZXJmb3JtcyByaWdodC10by1sZWZ0IGZ1bmN0aW9uIGNvbXBvc2l0aW9uIHVzaW5nIHRyYW5zZm9ybWluZyBmdW5jdGlvbi4gVGhlIGxhc3QgZnVuY3Rpb24gbWF5IGhhdmVcbiAqIGFueSBhcml0eTsgdGhlIHJlbWFpbmluZyBmdW5jdGlvbnMgbXVzdCBiZSB1bmFyeS4gVW5saWtlIGBjb21wb3NlYCwgZnVuY3Rpb25zIGFyZSBwYXNzZWQgaW4gYW4gYXJyYXkuXG4gKlxuICogKipOb3RlOioqIFRoZSByZXN1bHQgb2YgY29tcG9zZVdpdGggaXMgbm90IGF1dG9tYXRpY2FsbHkgY3VycmllZC4gVHJhbnNmb3JtaW5nIGZ1bmN0aW9uIGlzIG5vdCB1c2VkXG4gKiBvbiB0aGUgbGFzdCBhcmd1bWVudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yNi4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKCgqIC0+ICopLCBbKHkgLT4geiksICh4IC0+IHkpLCAuLi4sIChvIC0+IHApLCAoKGEsIGIsIC4uLiwgbikgLT4gbyldKSAtPiAoKGEsIGIsIC4uLiwgbikgLT4geilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybWVyIFRoZSB0cmFuc2Zvcm1pbmcgZnVuY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl9IGZ1bmN0aW9ucyBUaGUgZnVuY3Rpb25zIHRvIGNvbXBvc2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQHNlZSBSLmNvbXBvc2UsIFIucGlwZVdpdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBjb21wb3NlV2hpbGVOb3ROaWwgPSBSLmNvbXBvc2VXaXRoKChmLCByZXMpID0+IFIuaXNOaWwocmVzKSA/IHJlcyA6IGYocmVzKSk7XG4gKlxuICogICAgICBjb21wb3NlV2hpbGVOb3ROaWwoW1IuaW5jLCBSLnByb3AoJ2FnZScpXSkoe2FnZTogMX0pIC8vPT4gMlxuICogICAgICBjb21wb3NlV2hpbGVOb3ROaWwoW1IuaW5jLCBSLnByb3AoJ2FnZScpXSkoe30pIC8vPT4gdW5kZWZpbmVkXG4gKlxuICogQHN5bWIgUi5jb21wb3NlV2l0aChmKShbZywgaCwgaV0pKC4uLmFyZ3MpID0gZihnLCBmKGgsIGkoLi4uYXJncykpKVxuICovXG5cbnZhciBjb21wb3NlV2l0aCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIGNvbXBvc2VXaXRoKHhmLCBsaXN0KSB7XG4gIHJldHVybiBwaXBlV2l0aC5hcHBseSh0aGlzLCBbeGYsIHJldmVyc2UobGlzdCldKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBjb21wb3NlV2l0aDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJyYXkuanNcIjtcbmltcG9ydCBfaXNGdW5jdGlvbiBmcm9tIFwiLi9pbnRlcm5hbC9faXNGdW5jdGlvbi5qc1wiO1xuaW1wb3J0IF9pc1N0cmluZyBmcm9tIFwiLi9pbnRlcm5hbC9faXNTdHJpbmcuanNcIjtcbmltcG9ydCB0b1N0cmluZyBmcm9tIFwiLi90b1N0cmluZy5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29uY2F0ZW5hdGluZyB0aGUgZ2l2ZW4gbGlzdHMgb3Igc3RyaW5ncy5cbiAqXG4gKiBOb3RlOiBgUi5jb25jYXRgIGV4cGVjdHMgYm90aCBhcmd1bWVudHMgdG8gYmUgb2YgdGhlIHNhbWUgdHlwZSxcbiAqIHVubGlrZSB0aGUgbmF0aXZlIGBBcnJheS5wcm90b3R5cGUuY29uY2F0YCBtZXRob2QuIEl0IHdpbGwgdGhyb3dcbiAqIGFuIGVycm9yIGlmIHlvdSBgY29uY2F0YCBhbiBBcnJheSB3aXRoIGEgbm9uLUFycmF5IHZhbHVlLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBjb25jYXRgIG1ldGhvZCBvZiB0aGUgZmlyc3QgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKiBDYW4gYWxzbyBjb25jYXRlbmF0ZSB0d28gbWVtYmVycyBvZiBhIFtmYW50YXN5LWxhbmRcbiAqIGNvbXBhdGlibGUgc2VtaWdyb3VwXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI3NlbWlncm91cCkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2FdIC0+IFthXVxuICogQHNpZyBTdHJpbmcgLT4gU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IGZpcnN0TGlzdCBUaGUgZmlyc3QgbGlzdFxuICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IHNlY29uZExpc3QgVGhlIHNlY29uZCBsaXN0XG4gKiBAcmV0dXJuIHtBcnJheXxTdHJpbmd9IEEgbGlzdCBjb25zaXN0aW5nIG9mIHRoZSBlbGVtZW50cyBvZiBgZmlyc3RMaXN0YCBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMgb2ZcbiAqIGBzZWNvbmRMaXN0YC5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5jb25jYXQoJ0FCQycsICdERUYnKTsgLy8gJ0FCQ0RFRidcbiAqICAgICAgUi5jb25jYXQoWzQsIDUsIDZdLCBbMSwgMiwgM10pOyAvLz0+IFs0LCA1LCA2LCAxLCAyLCAzXVxuICogICAgICBSLmNvbmNhdChbXSwgW10pOyAvLz0+IFtdXG4gKi9cblxudmFyIGNvbmNhdCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIGNvbmNhdChhLCBiKSB7XG4gIGlmIChfaXNBcnJheShhKSkge1xuICAgIGlmIChfaXNBcnJheShiKSkge1xuICAgICAgcmV0dXJuIGEuY29uY2F0KGIpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IodG9TdHJpbmcoYikgKyAnIGlzIG5vdCBhbiBhcnJheScpO1xuICB9XG5cbiAgaWYgKF9pc1N0cmluZyhhKSkge1xuICAgIGlmIChfaXNTdHJpbmcoYikpIHtcbiAgICAgIHJldHVybiBhICsgYjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHRvU3RyaW5nKGIpICsgJyBpcyBub3QgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIGlmIChhICE9IG51bGwgJiYgX2lzRnVuY3Rpb24oYVsnZmFudGFzeS1sYW5kL2NvbmNhdCddKSkge1xuICAgIHJldHVybiBhWydmYW50YXN5LWxhbmQvY29uY2F0J10oYik7XG4gIH1cblxuICBpZiAoYSAhPSBudWxsICYmIF9pc0Z1bmN0aW9uKGEuY29uY2F0KSkge1xuICAgIHJldHVybiBhLmNvbmNhdChiKTtcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IodG9TdHJpbmcoYSkgKyAnIGRvZXMgbm90IGhhdmUgYSBtZXRob2QgbmFtZWQgXCJjb25jYXRcIiBvciBcImZhbnRhc3ktbGFuZC9jb25jYXRcIicpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbmNhdDsiLCJpbXBvcnQgX2FyaXR5IGZyb20gXCIuL2ludGVybmFsL19hcml0eS5qc1wiO1xuaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IG1hcCBmcm9tIFwiLi9tYXAuanNcIjtcbmltcG9ydCBtYXggZnJvbSBcIi4vbWF4LmpzXCI7XG5pbXBvcnQgcmVkdWNlIGZyb20gXCIuL3JlZHVjZS5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24sIGBmbmAsIHdoaWNoIGVuY2Fwc3VsYXRlcyBgaWYvZWxzZSwgaWYvZWxzZSwgLi4uYCBsb2dpYy5cbiAqIGBSLmNvbmRgIHRha2VzIGEgbGlzdCBvZiBbcHJlZGljYXRlLCB0cmFuc2Zvcm1lcl0gcGFpcnMuIEFsbCBvZiB0aGUgYXJndW1lbnRzXG4gKiB0byBgZm5gIGFyZSBhcHBsaWVkIHRvIGVhY2ggb2YgdGhlIHByZWRpY2F0ZXMgaW4gdHVybiB1bnRpbCBvbmUgcmV0dXJucyBhXG4gKiBcInRydXRoeVwiIHZhbHVlLCBhdCB3aGljaCBwb2ludCBgZm5gIHJldHVybnMgdGhlIHJlc3VsdCBvZiBhcHBseWluZyBpdHNcbiAqIGFyZ3VtZW50cyB0byB0aGUgY29ycmVzcG9uZGluZyB0cmFuc2Zvcm1lci4gSWYgbm9uZSBvZiB0aGUgcHJlZGljYXRlc1xuICogbWF0Y2hlcywgYGZuYCByZXR1cm5zIHVuZGVmaW5lZC5cbiAqXG4gKiAqKlBsZWFzZSBub3RlKio6IFRoaXMgaXMgbm90IGEgZGlyZWN0IHN1YnN0aXR1dGUgZm9yIGEgYHN3aXRjaGAgc3RhdGVtZW50LlxuICogUmVtZW1iZXIgdGhhdCBib3RoIGVsZW1lbnRzIG9mIGV2ZXJ5IHBhaXIgcGFzc2VkIHRvIGBjb25kYCBhcmUgKmZ1bmN0aW9ucyosXG4gKiBhbmQgYGNvbmRgIHJldHVybnMgYSBmdW5jdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC42LjBcbiAqIEBjYXRlZ29yeSBMb2dpY1xuICogQHNpZyBbWygqLi4uIC0+IEJvb2xlYW4pLCgqLi4uIC0+ICopXV0gLT4gKCouLi4gLT4gKilcbiAqIEBwYXJhbSB7QXJyYXl9IHBhaXJzIEEgbGlzdCBvZiBbcHJlZGljYXRlLCB0cmFuc2Zvcm1lcl1cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQHNlZSBSLmlmRWxzZSwgUi51bmxlc3MsIFIud2hlblxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGZuID0gUi5jb25kKFtcbiAqICAgICAgICBbUi5lcXVhbHMoMCksICAgUi5hbHdheXMoJ3dhdGVyIGZyZWV6ZXMgYXQgMMKwQycpXSxcbiAqICAgICAgICBbUi5lcXVhbHMoMTAwKSwgUi5hbHdheXMoJ3dhdGVyIGJvaWxzIGF0IDEwMMKwQycpXSxcbiAqICAgICAgICBbUi5ULCAgICAgICAgICAgdGVtcCA9PiAnbm90aGluZyBzcGVjaWFsIGhhcHBlbnMgYXQgJyArIHRlbXAgKyAnwrBDJ11cbiAqICAgICAgXSk7XG4gKiAgICAgIGZuKDApOyAvLz0+ICd3YXRlciBmcmVlemVzIGF0IDDCsEMnXG4gKiAgICAgIGZuKDUwKTsgLy89PiAnbm90aGluZyBzcGVjaWFsIGhhcHBlbnMgYXQgNTDCsEMnXG4gKiAgICAgIGZuKDEwMCk7IC8vPT4gJ3dhdGVyIGJvaWxzIGF0IDEwMMKwQydcbiAqL1xuXG52YXIgY29uZCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIGNvbmQocGFpcnMpIHtcbiAgdmFyIGFyaXR5ID0gcmVkdWNlKG1heCwgMCwgbWFwKGZ1bmN0aW9uIChwYWlyKSB7XG4gICAgcmV0dXJuIHBhaXJbMF0ubGVuZ3RoO1xuICB9LCBwYWlycykpO1xuICByZXR1cm4gX2FyaXR5KGFyaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGlkeCA9IDA7XG5cbiAgICB3aGlsZSAoaWR4IDwgcGFpcnMubGVuZ3RoKSB7XG4gICAgICBpZiAocGFpcnNbaWR4XVswXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSB7XG4gICAgICAgIHJldHVybiBwYWlyc1tpZHhdWzFdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIGlkeCArPSAxO1xuICAgIH1cbiAgfSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgY29uZDsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgY29uc3RydWN0TiBmcm9tIFwiLi9jb25zdHJ1Y3ROLmpzXCI7XG4vKipcbiAqIFdyYXBzIGEgY29uc3RydWN0b3IgZnVuY3Rpb24gaW5zaWRlIGEgY3VycmllZCBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWRcbiAqIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzIGFuZCByZXR1cm5zIHRoZSBzYW1lIHR5cGUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKCogLT4geyp9KSAtPiAoKiAtPiB7Kn0pXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgY29uc3RydWN0b3IgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHdyYXBwZWQsIGN1cnJpZWQgY29uc3RydWN0b3IgZnVuY3Rpb24uXG4gKiBAc2VlIFIuaW52b2tlclxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uXG4gKiAgICAgIGZ1bmN0aW9uIEFuaW1hbChraW5kKSB7XG4gKiAgICAgICAgdGhpcy5raW5kID0ga2luZDtcbiAqICAgICAgfTtcbiAqICAgICAgQW5pbWFsLnByb3RvdHlwZS5zaWdodGluZyA9IGZ1bmN0aW9uKCkge1xuICogICAgICAgIHJldHVybiBcIkl0J3MgYSBcIiArIHRoaXMua2luZCArIFwiIVwiO1xuICogICAgICB9XG4gKlxuICogICAgICBjb25zdCBBbmltYWxDb25zdHJ1Y3RvciA9IFIuY29uc3RydWN0KEFuaW1hbClcbiAqXG4gKiAgICAgIC8vIE5vdGljZSB3ZSBubyBsb25nZXIgbmVlZCB0aGUgJ25ldycga2V5d29yZDpcbiAqICAgICAgQW5pbWFsQ29uc3RydWN0b3IoJ1BpZycpOyAvLz0+IHtcImtpbmRcIjogXCJQaWdcIiwgXCJzaWdodGluZ1wiOiBmdW5jdGlvbiAoKXsuLi59fTtcbiAqXG4gKiAgICAgIGNvbnN0IGFuaW1hbFR5cGVzID0gW1wiTGlvblwiLCBcIlRpZ2VyXCIsIFwiQmVhclwiXTtcbiAqICAgICAgY29uc3QgYW5pbWFsU2lnaHRpbmcgPSBSLmludm9rZXIoMCwgJ3NpZ2h0aW5nJyk7XG4gKiAgICAgIGNvbnN0IHNpZ2h0TmV3QW5pbWFsID0gUi5jb21wb3NlKGFuaW1hbFNpZ2h0aW5nLCBBbmltYWxDb25zdHJ1Y3Rvcik7XG4gKiAgICAgIFIubWFwKHNpZ2h0TmV3QW5pbWFsLCBhbmltYWxUeXBlcyk7IC8vPT4gW1wiSXQncyBhIExpb24hXCIsIFwiSXQncyBhIFRpZ2VyIVwiLCBcIkl0J3MgYSBCZWFyIVwiXVxuICovXG5cbnZhciBjb25zdHJ1Y3QgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiBjb25zdHJ1Y3QoRm4pIHtcbiAgcmV0dXJuIGNvbnN0cnVjdE4oRm4ubGVuZ3RoLCBGbik7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgY29uc3RydWN0OyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBjdXJyeSBmcm9tIFwiLi9jdXJyeS5qc1wiO1xuaW1wb3J0IG5BcnkgZnJvbSBcIi4vbkFyeS5qc1wiO1xuLyoqXG4gKiBXcmFwcyBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGluc2lkZSBhIGN1cnJpZWQgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY2FsbGVkXG4gKiB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgc2FtZSB0eXBlLiBUaGUgYXJpdHkgb2YgdGhlIGZ1bmN0aW9uXG4gKiByZXR1cm5lZCBpcyBzcGVjaWZpZWQgdG8gYWxsb3cgdXNpbmcgdmFyaWFkaWMgY29uc3RydWN0b3IgZnVuY3Rpb25zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjQuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIE51bWJlciAtPiAoKiAtPiB7Kn0pIC0+ICgqIC0+IHsqfSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBuIFRoZSBhcml0eSBvZiB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBGbiBUaGUgY29uc3RydWN0b3IgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHdyYXBwZWQsIGN1cnJpZWQgY29uc3RydWN0b3IgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgLy8gVmFyaWFkaWMgQ29uc3RydWN0b3IgZnVuY3Rpb25cbiAqICAgICAgZnVuY3Rpb24gU2FsYWQoKSB7XG4gKiAgICAgICAgdGhpcy5pbmdyZWRpZW50cyA9IGFyZ3VtZW50cztcbiAqICAgICAgfVxuICpcbiAqICAgICAgU2FsYWQucHJvdG90eXBlLnJlY2lwZSA9IGZ1bmN0aW9uKCkge1xuICogICAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IFIubWFwKGluZ3JlZGllbnQgPT4gJ0FkZCBhIGRvbGxvcCBvZiAnICsgaW5ncmVkaWVudCwgdGhpcy5pbmdyZWRpZW50cyk7XG4gKiAgICAgICAgcmV0dXJuIFIuam9pbignXFxuJywgaW5zdHJ1Y3Rpb25zKTtcbiAqICAgICAgfTtcbiAqXG4gKiAgICAgIGNvbnN0IFRocmVlTGF5ZXJTYWxhZCA9IFIuY29uc3RydWN0TigzLCBTYWxhZCk7XG4gKlxuICogICAgICAvLyBOb3RpY2Ugd2Ugbm8gbG9uZ2VyIG5lZWQgdGhlICduZXcnIGtleXdvcmQsIGFuZCB0aGUgY29uc3RydWN0b3IgaXMgY3VycmllZCBmb3IgMyBhcmd1bWVudHMuXG4gKiAgICAgIGNvbnN0IHNhbGFkID0gVGhyZWVMYXllclNhbGFkKCdNYXlvbm5haXNlJykoJ1BvdGF0byBDaGlwcycpKCdLZXRjaHVwJyk7XG4gKlxuICogICAgICBjb25zb2xlLmxvZyhzYWxhZC5yZWNpcGUoKSk7XG4gKiAgICAgIC8vIEFkZCBhIGRvbGxvcCBvZiBNYXlvbm5haXNlXG4gKiAgICAgIC8vIEFkZCBhIGRvbGxvcCBvZiBQb3RhdG8gQ2hpcHNcbiAqICAgICAgLy8gQWRkIGEgZG9sbG9wIG9mIEtldGNodXBcbiAqL1xuXG52YXIgY29uc3RydWN0TiA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIGNvbnN0cnVjdE4obiwgRm4pIHtcbiAgaWYgKG4gPiAxMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ29uc3RydWN0b3Igd2l0aCBncmVhdGVyIHRoYW4gdGVuIGFyZ3VtZW50cycpO1xuICB9XG5cbiAgaWYgKG4gPT09IDApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG5ldyBGbigpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gY3VycnkobkFyeShuLCBmdW5jdGlvbiAoJDAsICQxLCAkMiwgJDMsICQ0LCAkNSwgJDYsICQ3LCAkOCwgJDkpIHtcbiAgICBzd2l0Y2ggKG4pIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIG5ldyBGbigkMCk7XG5cbiAgICAgIGNhc2UgMjpcbiAgICAgICAgcmV0dXJuIG5ldyBGbigkMCwgJDEpO1xuXG4gICAgICBjYXNlIDM6XG4gICAgICAgIHJldHVybiBuZXcgRm4oJDAsICQxLCAkMik7XG5cbiAgICAgIGNhc2UgNDpcbiAgICAgICAgcmV0dXJuIG5ldyBGbigkMCwgJDEsICQyLCAkMyk7XG5cbiAgICAgIGNhc2UgNTpcbiAgICAgICAgcmV0dXJuIG5ldyBGbigkMCwgJDEsICQyLCAkMywgJDQpO1xuXG4gICAgICBjYXNlIDY6XG4gICAgICAgIHJldHVybiBuZXcgRm4oJDAsICQxLCAkMiwgJDMsICQ0LCAkNSk7XG5cbiAgICAgIGNhc2UgNzpcbiAgICAgICAgcmV0dXJuIG5ldyBGbigkMCwgJDEsICQyLCAkMywgJDQsICQ1LCAkNik7XG5cbiAgICAgIGNhc2UgODpcbiAgICAgICAgcmV0dXJuIG5ldyBGbigkMCwgJDEsICQyLCAkMywgJDQsICQ1LCAkNiwgJDcpO1xuXG4gICAgICBjYXNlIDk6XG4gICAgICAgIHJldHVybiBuZXcgRm4oJDAsICQxLCAkMiwgJDMsICQ0LCAkNSwgJDYsICQ3LCAkOCk7XG5cbiAgICAgIGNhc2UgMTA6XG4gICAgICAgIHJldHVybiBuZXcgRm4oJDAsICQxLCAkMiwgJDMsICQ0LCAkNSwgJDYsICQ3LCAkOCwgJDkpO1xuICAgIH1cbiAgfSkpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbnN0cnVjdE47IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9tYXAgZnJvbSBcIi4vaW50ZXJuYWwvX21hcC5qc1wiO1xuaW1wb3J0IGN1cnJ5TiBmcm9tIFwiLi9jdXJyeU4uanNcIjtcbmltcG9ydCBtYXggZnJvbSBcIi4vbWF4LmpzXCI7XG5pbXBvcnQgcGx1Y2sgZnJvbSBcIi4vcGx1Y2suanNcIjtcbmltcG9ydCByZWR1Y2UgZnJvbSBcIi4vcmVkdWNlLmpzXCI7XG4vKipcbiAqIEFjY2VwdHMgYSBjb252ZXJnaW5nIGZ1bmN0aW9uIGFuZCBhIGxpc3Qgb2YgYnJhbmNoaW5nIGZ1bmN0aW9ucyBhbmQgcmV0dXJuc1xuICogYSBuZXcgZnVuY3Rpb24uIFRoZSBhcml0eSBvZiB0aGUgbmV3IGZ1bmN0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBhcml0eSBvZlxuICogdGhlIGxvbmdlc3QgYnJhbmNoaW5nIGZ1bmN0aW9uLiBXaGVuIGludm9rZWQsIHRoaXMgbmV3IGZ1bmN0aW9uIGlzIGFwcGxpZWRcbiAqIHRvIHNvbWUgYXJndW1lbnRzLCBhbmQgZWFjaCBicmFuY2hpbmcgZnVuY3Rpb24gaXMgYXBwbGllZCB0byB0aG9zZSBzYW1lXG4gKiBhcmd1bWVudHMuIFRoZSByZXN1bHRzIG9mIGVhY2ggYnJhbmNoaW5nIGZ1bmN0aW9uIGFyZSBwYXNzZWQgYXMgYXJndW1lbnRzXG4gKiB0byB0aGUgY29udmVyZ2luZyBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSByZXR1cm4gdmFsdWUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNC4yXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKCh4MSwgeDIsIC4uLikgLT4geikgLT4gWygoYSwgYiwgLi4uKSAtPiB4MSksICgoYSwgYiwgLi4uKSAtPiB4MiksIC4uLl0gLT4gKGEgLT4gYiAtPiAuLi4gLT4geilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGFmdGVyIEEgZnVuY3Rpb24uIGBhZnRlcmAgd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlIHJldHVybiB2YWx1ZXMgb2ZcbiAqICAgICAgICBgZm4xYCBhbmQgYGZuMmAgYXMgaXRzIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7QXJyYXl9IGZ1bmN0aW9ucyBBIGxpc3Qgb2YgZnVuY3Rpb25zLlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgbmV3IGZ1bmN0aW9uLlxuICogQHNlZSBSLnVzZVdpdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBhdmVyYWdlID0gUi5jb252ZXJnZShSLmRpdmlkZSwgW1Iuc3VtLCBSLmxlbmd0aF0pXG4gKiAgICAgIGF2ZXJhZ2UoWzEsIDIsIDMsIDQsIDUsIDYsIDddKSAvLz0+IDRcbiAqXG4gKiAgICAgIGNvbnN0IHN0cmFuZ2VDb25jYXQgPSBSLmNvbnZlcmdlKFIuY29uY2F0LCBbUi50b1VwcGVyLCBSLnRvTG93ZXJdKVxuICogICAgICBzdHJhbmdlQ29uY2F0KFwiWW9kZWxcIikgLy89PiBcIllPREVMeW9kZWxcIlxuICpcbiAqIEBzeW1iIFIuY29udmVyZ2UoZiwgW2csIGhdKShhLCBiKSA9IGYoZyhhLCBiKSwgaChhLCBiKSlcbiAqL1xuXG52YXIgY29udmVyZ2UgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBjb252ZXJnZShhZnRlciwgZm5zKSB7XG4gIHJldHVybiBjdXJyeU4ocmVkdWNlKG1heCwgMCwgcGx1Y2soJ2xlbmd0aCcsIGZucykpLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgIHJldHVybiBhZnRlci5hcHBseShjb250ZXh0LCBfbWFwKGZ1bmN0aW9uIChmbikge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIH0sIGZucykpO1xuICB9KTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBjb252ZXJnZTsiLCJpbXBvcnQgX3JlZHVjZSBmcm9tIFwiLi9pbnRlcm5hbC9fcmVkdWNlLmpzXCI7XG5pbXBvcnQgY3VycnkgZnJvbSBcIi4vY3VycnkuanNcIjtcbi8qKlxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIGEgZ2l2ZW4gYGxpc3RgIG1hdGNoaW5nIHRoZSBwcmVkaWNhdGUgYGZgXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjguMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IE51bWJlclxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIHRvIG1hdGNoIGl0ZW1zIGFnYWluc3RcbiAqIEByZXR1cm4ge0FycmF5fSBsaXN0IG9mIGl0ZW1zIHRvIGNvdW50IGluXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZXZlbiA9IHggPT4geCAlIDIgPT0gMDtcbiAqXG4gKiAgICAgIFIuY291bnQoZXZlbiwgWzEsIDIsIDMsIDQsIDVdKTsgLy8gPT4gMlxuICogICAgICBSLm1hcChSLmNvdW50KGV2ZW4pLCBbWzEsIDEsIDFdLCBbMiwgMywgNCwgNV0sIFs2XV0pOyAvLyA9PiBbMCwgMiwgMV1cbiAqL1xuXG52YXIgY291bnQgPVxuLyojX19QVVJFX18qL1xuY3VycnkoZnVuY3Rpb24gKHByZWQsIGxpc3QpIHtcbiAgcmV0dXJuIF9yZWR1Y2UoZnVuY3Rpb24gKGEsIGUpIHtcbiAgICByZXR1cm4gcHJlZChlKSA/IGEgKyAxIDogYTtcbiAgfSwgMCwgbGlzdCk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGNvdW50OyIsImltcG9ydCByZWR1Y2VCeSBmcm9tIFwiLi9yZWR1Y2VCeS5qc1wiO1xuLyoqXG4gKiBDb3VudHMgdGhlIGVsZW1lbnRzIG9mIGEgbGlzdCBhY2NvcmRpbmcgdG8gaG93IG1hbnkgbWF0Y2ggZWFjaCB2YWx1ZSBvZiBhXG4gKiBrZXkgZ2VuZXJhdGVkIGJ5IHRoZSBzdXBwbGllZCBmdW5jdGlvbi4gUmV0dXJucyBhbiBvYmplY3QgbWFwcGluZyB0aGUga2V5c1xuICogcHJvZHVjZWQgYnkgYGZuYCB0byB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIGluIHRoZSBsaXN0LiBOb3RlIHRoYXQgYWxsXG4gKiBrZXlzIGFyZSBjb2VyY2VkIHRvIHN0cmluZ3MgYmVjYXVzZSBvZiBob3cgSmF2YVNjcmlwdCBvYmplY3RzIHdvcmsuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIChhIC0+IFN0cmluZykgLT4gW2FdIC0+IHsqfVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHVzZWQgdG8gbWFwIHZhbHVlcyB0byBrZXlzLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBjb3VudCBlbGVtZW50cyBmcm9tLlxuICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3QgbWFwcGluZyBrZXlzIHRvIG51bWJlciBvZiBvY2N1cnJlbmNlcyBpbiB0aGUgbGlzdC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBudW1iZXJzID0gWzEuMCwgMS4xLCAxLjIsIDIuMCwgMy4wLCAyLjJdO1xuICogICAgICBSLmNvdW50QnkoTWF0aC5mbG9vcikobnVtYmVycyk7ICAgIC8vPT4geycxJzogMywgJzInOiAyLCAnMyc6IDF9XG4gKlxuICogICAgICBjb25zdCBsZXR0ZXJzID0gWydhJywgJ2InLCAnQScsICdhJywgJ0InLCAnYyddO1xuICogICAgICBSLmNvdW50QnkoUi50b0xvd2VyKShsZXR0ZXJzKTsgICAvLz0+IHsnYSc6IDMsICdiJzogMiwgJ2MnOiAxfVxuICovXG5cbnZhciBjb3VudEJ5ID1cbi8qI19fUFVSRV9fKi9cbnJlZHVjZUJ5KGZ1bmN0aW9uIChhY2MsIGVsZW0pIHtcbiAgcmV0dXJuIGFjYyArIDE7XG59LCAwKTtcbmV4cG9ydCBkZWZhdWx0IGNvdW50Qnk7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IGN1cnJ5TiBmcm9tIFwiLi9jdXJyeU4uanNcIjtcbi8qKlxuICogUmV0dXJucyBhIGN1cnJpZWQgZXF1aXZhbGVudCBvZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uIFRoZSBjdXJyaWVkIGZ1bmN0aW9uXG4gKiBoYXMgdHdvIHVudXN1YWwgY2FwYWJpbGl0aWVzLiBGaXJzdCwgaXRzIGFyZ3VtZW50cyBuZWVkbid0IGJlIHByb3ZpZGVkIG9uZVxuICogYXQgYSB0aW1lLiBJZiBgZmAgaXMgYSB0ZXJuYXJ5IGZ1bmN0aW9uIGFuZCBgZ2AgaXMgYFIuY3VycnkoZilgLCB0aGVcbiAqIGZvbGxvd2luZyBhcmUgZXF1aXZhbGVudDpcbiAqXG4gKiAgIC0gYGcoMSkoMikoMylgXG4gKiAgIC0gYGcoMSkoMiwgMylgXG4gKiAgIC0gYGcoMSwgMikoMylgXG4gKiAgIC0gYGcoMSwgMiwgMylgXG4gKlxuICogU2Vjb25kbHksIHRoZSBzcGVjaWFsIHBsYWNlaG9sZGVyIHZhbHVlIFtgUi5fX2BdKCNfXykgbWF5IGJlIHVzZWQgdG8gc3BlY2lmeVxuICogXCJnYXBzXCIsIGFsbG93aW5nIHBhcnRpYWwgYXBwbGljYXRpb24gb2YgYW55IGNvbWJpbmF0aW9uIG9mIGFyZ3VtZW50cyxcbiAqIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgcG9zaXRpb25zLiBJZiBgZ2AgaXMgYXMgYWJvdmUgYW5kIGBfYCBpcyBbYFIuX19gXSgjX18pLFxuICogdGhlIGZvbGxvd2luZyBhcmUgZXF1aXZhbGVudDpcbiAqXG4gKiAgIC0gYGcoMSwgMiwgMylgXG4gKiAgIC0gYGcoXywgMiwgMykoMSlgXG4gKiAgIC0gYGcoXywgXywgMykoMSkoMilgXG4gKiAgIC0gYGcoXywgXywgMykoMSwgMilgXG4gKiAgIC0gYGcoXywgMikoMSkoMylgXG4gKiAgIC0gYGcoXywgMikoMSwgMylgXG4gKiAgIC0gYGcoXywgMikoXywgMykoMSlgXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCBkZWZhdWx0IHBhcmFtZXRlcnMgZG9uJ3QgY291bnQgdG93YXJkcyBhIFtmdW5jdGlvbiBhcml0eV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRnVuY3Rpb24vbGVuZ3RoKVxuICogYW5kIHRoZXJlZm9yZSBgY3VycnlgIHdvbid0IHdvcmsgd2VsbCB3aXRoIHRob3NlOlxuICpcbiAqIGBgYFxuICogY29uc3QgaCA9IFIuY3VycnkoKGEsIGIsIGMgPSAyKSA9PiBhICsgYiArIGMpO1xuICpcbiAqIGgoNDApO1xuICogLy89PiBmdW5jdGlvbiAod2FpdHMgZm9yIGBiYClcbiAqXG4gKiBoKDM5KSgxKTtcbiAqIC8vPT4gNDJcbiAqXG4gKiBoKDEpKDIsIDMpO1xuICogLy89PiA2XG4gKlxuICogaCgxKSgyKSg3KTtcbiAqIC8vPT4gRXJyb3IhIChgM2AgaXMgbm90IGEgZnVuY3Rpb24hKVxuICogYGBgXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKCogLT4gYSkgLT4gKCogLT4gYSlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG5ldywgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBzZWUgUi5jdXJyeU4sIFIucGFydGlhbFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGFkZEZvdXJOdW1iZXJzID0gKGEsIGIsIGMsIGQpID0+IGEgKyBiICsgYyArIGQ7XG4gKlxuICogICAgICBjb25zdCBjdXJyaWVkQWRkRm91ck51bWJlcnMgPSBSLmN1cnJ5KGFkZEZvdXJOdW1iZXJzKTtcbiAqICAgICAgY29uc3QgZiA9IGN1cnJpZWRBZGRGb3VyTnVtYmVycygxLCAyKTtcbiAqICAgICAgY29uc3QgZyA9IGYoMyk7XG4gKiAgICAgIGcoNCk7IC8vPT4gMTBcbiAqL1xuXG52YXIgY3VycnkgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiBjdXJyeShmbikge1xuICByZXR1cm4gY3VycnlOKGZuLmxlbmd0aCwgZm4pO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5OyIsImltcG9ydCBfYXJpdHkgZnJvbSBcIi4vaW50ZXJuYWwvX2FyaXR5LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2N1cnJ5TiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnlOLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSBjdXJyaWVkIGVxdWl2YWxlbnQgb2YgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLCB3aXRoIHRoZSBzcGVjaWZpZWRcbiAqIGFyaXR5LiBUaGUgY3VycmllZCBmdW5jdGlvbiBoYXMgdHdvIHVudXN1YWwgY2FwYWJpbGl0aWVzLiBGaXJzdCwgaXRzXG4gKiBhcmd1bWVudHMgbmVlZG4ndCBiZSBwcm92aWRlZCBvbmUgYXQgYSB0aW1lLiBJZiBgZ2AgaXMgYFIuY3VycnlOKDMsIGYpYCwgdGhlXG4gKiBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEpKDIpKDMpYFxuICogICAtIGBnKDEpKDIsIDMpYFxuICogICAtIGBnKDEsIDIpKDMpYFxuICogICAtIGBnKDEsIDIsIDMpYFxuICpcbiAqIFNlY29uZGx5LCB0aGUgc3BlY2lhbCBwbGFjZWhvbGRlciB2YWx1ZSBbYFIuX19gXSgjX18pIG1heSBiZSB1c2VkIHRvIHNwZWNpZnlcbiAqIFwiZ2Fwc1wiLCBhbGxvd2luZyBwYXJ0aWFsIGFwcGxpY2F0aW9uIG9mIGFueSBjb21iaW5hdGlvbiBvZiBhcmd1bWVudHMsXG4gKiByZWdhcmRsZXNzIG9mIHRoZWlyIHBvc2l0aW9ucy4gSWYgYGdgIGlzIGFzIGFib3ZlIGFuZCBgX2AgaXMgW2BSLl9fYF0oI19fKSxcbiAqIHRoZSBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEsIDIsIDMpYFxuICogICAtIGBnKF8sIDIsIDMpKDEpYFxuICogICAtIGBnKF8sIF8sIDMpKDEpKDIpYFxuICogICAtIGBnKF8sIF8sIDMpKDEsIDIpYFxuICogICAtIGBnKF8sIDIpKDEpKDMpYFxuICogICAtIGBnKF8sIDIpKDEsIDMpYFxuICogICAtIGBnKF8sIDIpKF8sIDMpKDEpYFxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjUuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIE51bWJlciAtPiAoKiAtPiBhKSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgYXJpdHkgZm9yIHRoZSByZXR1cm5lZCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG5ldywgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBzZWUgUi5jdXJyeVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHN1bUFyZ3MgPSAoLi4uYXJncykgPT4gUi5zdW0oYXJncyk7XG4gKlxuICogICAgICBjb25zdCBjdXJyaWVkQWRkRm91ck51bWJlcnMgPSBSLmN1cnJ5Tig0LCBzdW1BcmdzKTtcbiAqICAgICAgY29uc3QgZiA9IGN1cnJpZWRBZGRGb3VyTnVtYmVycygxLCAyKTtcbiAqICAgICAgY29uc3QgZyA9IGYoMyk7XG4gKiAgICAgIGcoNCk7IC8vPT4gMTBcbiAqL1xuXG52YXIgY3VycnlOID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gY3VycnlOKGxlbmd0aCwgZm4pIHtcbiAgaWYgKGxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBfY3VycnkxKGZuKTtcbiAgfVxuXG4gIHJldHVybiBfYXJpdHkobGVuZ3RoLCBfY3VycnlOKGxlbmd0aCwgW10sIGZuKSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgY3VycnlOOyIsImltcG9ydCBhZGQgZnJvbSBcIi4vYWRkLmpzXCI7XG4vKipcbiAqIERlY3JlbWVudHMgaXRzIGFyZ3VtZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjkuMFxuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBzaWcgTnVtYmVyIC0+IE51bWJlclxuICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAqIEByZXR1cm4ge051bWJlcn0gbiAtIDFcbiAqIEBzZWUgUi5pbmNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmRlYyg0Mik7IC8vPT4gNDFcbiAqL1xuXG52YXIgZGVjID1cbi8qI19fUFVSRV9fKi9cbmFkZCgtMSk7XG5leHBvcnQgZGVmYXVsdCBkZWM7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBzZWNvbmQgYXJndW1lbnQgaWYgaXQgaXMgbm90IGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYE5hTmA7XG4gKiBvdGhlcndpc2UgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEwLjBcbiAqIEBjYXRlZ29yeSBMb2dpY1xuICogQHNpZyBhIC0+IGIgLT4gYSB8IGJcbiAqIEBwYXJhbSB7YX0gZGVmYXVsdCBUaGUgZGVmYXVsdCB2YWx1ZS5cbiAqIEBwYXJhbSB7Yn0gdmFsIGB2YWxgIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZCBvZiBgZGVmYXVsdGAgdW5sZXNzIGB2YWxgIGlzIGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYE5hTmAuXG4gKiBAcmV0dXJuIHsqfSBUaGUgc2Vjb25kIHZhbHVlIGlmIGl0IGlzIG5vdCBgbnVsbGAsIGB1bmRlZmluZWRgIG9yIGBOYU5gLCBvdGhlcndpc2UgdGhlIGRlZmF1bHQgdmFsdWVcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBkZWZhdWx0VG80MiA9IFIuZGVmYXVsdFRvKDQyKTtcbiAqXG4gKiAgICAgIGRlZmF1bHRUbzQyKG51bGwpOyAgLy89PiA0MlxuICogICAgICBkZWZhdWx0VG80Mih1bmRlZmluZWQpOyAgLy89PiA0MlxuICogICAgICBkZWZhdWx0VG80MihmYWxzZSk7ICAvLz0+IGZhbHNlXG4gKiAgICAgIGRlZmF1bHRUbzQyKCdSYW1kYScpOyAgLy89PiAnUmFtZGEnXG4gKiAgICAgIC8vIHBhcnNlSW50KCdzdHJpbmcnKSByZXN1bHRzIGluIE5hTlxuICogICAgICBkZWZhdWx0VG80MihwYXJzZUludCgnc3RyaW5nJykpOyAvLz0+IDQyXG4gKi9cblxudmFyIGRlZmF1bHRUbyA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIGRlZmF1bHRUbyhkLCB2KSB7XG4gIHJldHVybiB2ID09IG51bGwgfHwgdiAhPT0gdiA/IGQgOiB2O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmF1bHRUbzsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG4vKipcbiAqIE1ha2VzIGEgZGVzY2VuZGluZyBjb21wYXJhdG9yIGZ1bmN0aW9uIG91dCBvZiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHZhbHVlXG4gKiB0aGF0IGNhbiBiZSBjb21wYXJlZCB3aXRoIGA8YCBhbmQgYD5gLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIzLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBPcmQgYiA9PiAoYSAtPiBiKSAtPiBhIC0+IGEgLT4gTnVtYmVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBBIGZ1bmN0aW9uIG9mIGFyaXR5IG9uZSB0aGF0IHJldHVybnMgYSB2YWx1ZSB0aGF0IGNhbiBiZSBjb21wYXJlZFxuICogQHBhcmFtIHsqfSBhIFRoZSBmaXJzdCBpdGVtIHRvIGJlIGNvbXBhcmVkLlxuICogQHBhcmFtIHsqfSBiIFRoZSBzZWNvbmQgaXRlbSB0byBiZSBjb21wYXJlZC5cbiAqIEByZXR1cm4ge051bWJlcn0gYC0xYCBpZiBmbihhKSA+IGZuKGIpLCBgMWAgaWYgZm4oYikgPiBmbihhKSwgb3RoZXJ3aXNlIGAwYFxuICogQHNlZSBSLmFzY2VuZFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGJ5QWdlID0gUi5kZXNjZW5kKFIucHJvcCgnYWdlJykpO1xuICogICAgICBjb25zdCBwZW9wbGUgPSBbXG4gKiAgICAgICAgeyBuYW1lOiAnRW1tYScsIGFnZTogNzAgfSxcbiAqICAgICAgICB7IG5hbWU6ICdQZXRlcicsIGFnZTogNzggfSxcbiAqICAgICAgICB7IG5hbWU6ICdNaWtoYWlsJywgYWdlOiA2MiB9LFxuICogICAgICBdO1xuICogICAgICBjb25zdCBwZW9wbGVCeU9sZGVzdEZpcnN0ID0gUi5zb3J0KGJ5QWdlLCBwZW9wbGUpO1xuICogICAgICAgIC8vPT4gW3sgbmFtZTogJ1BldGVyJywgYWdlOiA3OCB9LCB7IG5hbWU6ICdFbW1hJywgYWdlOiA3MCB9LCB7IG5hbWU6ICdNaWtoYWlsJywgYWdlOiA2MiB9XVxuICovXG5cbnZhciBkZXNjZW5kID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTMoZnVuY3Rpb24gZGVzY2VuZChmbiwgYSwgYikge1xuICB2YXIgYWEgPSBmbihhKTtcbiAgdmFyIGJiID0gZm4oYik7XG4gIHJldHVybiBhYSA+IGJiID8gLTEgOiBhYSA8IGJiID8gMSA6IDA7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZGVzY2VuZDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX1NldCBmcm9tIFwiLi9pbnRlcm5hbC9fU2V0LmpzXCI7XG4vKipcbiAqIEZpbmRzIHRoZSBzZXQgKGkuZS4gbm8gZHVwbGljYXRlcykgb2YgYWxsIGVsZW1lbnRzIGluIHRoZSBmaXJzdCBsaXN0IG5vdFxuICogY29udGFpbmVkIGluIHRoZSBzZWNvbmQgbGlzdC4gT2JqZWN0cyBhbmQgQXJyYXlzIGFyZSBjb21wYXJlZCBpbiB0ZXJtcyBvZlxuICogdmFsdWUgZXF1YWxpdHksIG5vdCByZWZlcmVuY2UgZXF1YWxpdHkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgWypdIC0+IFsqXSAtPiBbKl1cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QxIFRoZSBmaXJzdCBsaXN0LlxuICogQHBhcmFtIHtBcnJheX0gbGlzdDIgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBlbGVtZW50cyBpbiBgbGlzdDFgIHRoYXQgYXJlIG5vdCBpbiBgbGlzdDJgLlxuICogQHNlZSBSLmRpZmZlcmVuY2VXaXRoLCBSLnN5bW1ldHJpY0RpZmZlcmVuY2UsIFIuc3ltbWV0cmljRGlmZmVyZW5jZVdpdGgsIFIud2l0aG91dFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuZGlmZmVyZW5jZShbMSwyLDMsNF0sIFs3LDYsNSw0LDNdKTsgLy89PiBbMSwyXVxuICogICAgICBSLmRpZmZlcmVuY2UoWzcsNiw1LDQsM10sIFsxLDIsMyw0XSk7IC8vPT4gWzcsNiw1XVxuICogICAgICBSLmRpZmZlcmVuY2UoW3thOiAxfSwge2I6IDJ9XSwgW3thOiAxfSwge2M6IDN9XSkgLy89PiBbe2I6IDJ9XVxuICovXG5cbnZhciBkaWZmZXJlbmNlID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gZGlmZmVyZW5jZShmaXJzdCwgc2Vjb25kKSB7XG4gIHZhciBvdXQgPSBbXTtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBmaXJzdExlbiA9IGZpcnN0Lmxlbmd0aDtcbiAgdmFyIHNlY29uZExlbiA9IHNlY29uZC5sZW5ndGg7XG4gIHZhciB0b0ZpbHRlck91dCA9IG5ldyBfU2V0KCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWNvbmRMZW47IGkgKz0gMSkge1xuICAgIHRvRmlsdGVyT3V0LmFkZChzZWNvbmRbaV0pO1xuICB9XG5cbiAgd2hpbGUgKGlkeCA8IGZpcnN0TGVuKSB7XG4gICAgaWYgKHRvRmlsdGVyT3V0LmFkZChmaXJzdFtpZHhdKSkge1xuICAgICAgb3V0W291dC5sZW5ndGhdID0gZmlyc3RbaWR4XTtcbiAgICB9XG5cbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZGlmZmVyZW5jZTsiLCJpbXBvcnQgX2luY2x1ZGVzV2l0aCBmcm9tIFwiLi9pbnRlcm5hbC9faW5jbHVkZXNXaXRoLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG4vKipcbiAqIEZpbmRzIHRoZSBzZXQgKGkuZS4gbm8gZHVwbGljYXRlcykgb2YgYWxsIGVsZW1lbnRzIGluIHRoZSBmaXJzdCBsaXN0IG5vdFxuICogY29udGFpbmVkIGluIHRoZSBzZWNvbmQgbGlzdC4gRHVwbGljYXRpb24gaXMgZGV0ZXJtaW5lZCBhY2NvcmRpbmcgdG8gdGhlXG4gKiB2YWx1ZSByZXR1cm5lZCBieSBhcHBseWluZyB0aGUgc3VwcGxpZWQgcHJlZGljYXRlIHRvIHR3byBsaXN0IGVsZW1lbnRzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnICgoYSwgYSkgLT4gQm9vbGVhbikgLT4gW2FdIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgQSBwcmVkaWNhdGUgdXNlZCB0byB0ZXN0IHdoZXRoZXIgdHdvIGl0ZW1zIGFyZSBlcXVhbC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QxIFRoZSBmaXJzdCBsaXN0LlxuICogQHBhcmFtIHtBcnJheX0gbGlzdDIgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBlbGVtZW50cyBpbiBgbGlzdDFgIHRoYXQgYXJlIG5vdCBpbiBgbGlzdDJgLlxuICogQHNlZSBSLmRpZmZlcmVuY2UsIFIuc3ltbWV0cmljRGlmZmVyZW5jZSwgUi5zeW1tZXRyaWNEaWZmZXJlbmNlV2l0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGNtcCA9ICh4LCB5KSA9PiB4LmEgPT09IHkuYTtcbiAqICAgICAgY29uc3QgbDEgPSBbe2E6IDF9LCB7YTogMn0sIHthOiAzfV07XG4gKiAgICAgIGNvbnN0IGwyID0gW3thOiAzfSwge2E6IDR9XTtcbiAqICAgICAgUi5kaWZmZXJlbmNlV2l0aChjbXAsIGwxLCBsMik7IC8vPT4gW3thOiAxfSwge2E6IDJ9XVxuICpcbiAqICAgICAgUi5kaWZmZXJlbmNlV2l0aChSLmVxdWFscywgWzEsIDIsIDMsIDMsIDNdLCBbXSk7IC8vPT4gWzEsIDIsIDNdXG4gKiAgICAgIFIuZGlmZmVyZW5jZVdpdGgoUi5lcXVhbHMsIFsxLCAyLCAzLCAzLCAzXSwgWzFdKTsgLy89PiBbMiwgM11cbiAqL1xuXG52YXIgZGlmZmVyZW5jZVdpdGggPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MyhmdW5jdGlvbiBkaWZmZXJlbmNlV2l0aChwcmVkLCBmaXJzdCwgc2Vjb25kKSB7XG4gIHZhciBvdXQgPSBbXTtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBmaXJzdExlbiA9IGZpcnN0Lmxlbmd0aDtcblxuICB3aGlsZSAoaWR4IDwgZmlyc3RMZW4pIHtcbiAgICBpZiAoIV9pbmNsdWRlc1dpdGgocHJlZCwgZmlyc3RbaWR4XSwgc2Vjb25kKSAmJiAhX2luY2x1ZGVzV2l0aChwcmVkLCBmaXJzdFtpZHhdLCBvdXQpKSB7XG4gICAgICBvdXQucHVzaChmaXJzdFtpZHhdKTtcbiAgICB9XG5cbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZGlmZmVyZW5jZVdpdGg7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGRpc3NvY1BhdGggZnJvbSBcIi4vZGlzc29jUGF0aC5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IG9iamVjdCB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYSBgcHJvcGAgcHJvcGVydHkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyBTdHJpbmcgLT4ge2s6IHZ9IC0+IHtrOiB2fVxuICogQHBhcmFtIHtTdHJpbmd9IHByb3AgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGRpc3NvY2lhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBjbG9uZVxuICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3QgZXF1aXZhbGVudCB0byB0aGUgb3JpZ2luYWwgYnV0IHdpdGhvdXQgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eVxuICogQHNlZSBSLmFzc29jLCBSLm9taXRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmRpc3NvYygnYicsIHthOiAxLCBiOiAyLCBjOiAzfSk7IC8vPT4ge2E6IDEsIGM6IDN9XG4gKi9cblxudmFyIGRpc3NvYyA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIGRpc3NvYyhwcm9wLCBvYmopIHtcbiAgcmV0dXJuIGRpc3NvY1BhdGgoW3Byb3BdLCBvYmopO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGRpc3NvYzsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2Rpc3NvYyBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzc29jLmpzXCI7XG5pbXBvcnQgX2lzSW50ZWdlciBmcm9tIFwiLi9pbnRlcm5hbC9faXNJbnRlZ2VyLmpzXCI7XG5pbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJyYXkuanNcIjtcbmltcG9ydCBhc3NvYyBmcm9tIFwiLi9hc3NvYy5qc1wiO1xuLyoqXG4gKiBNYWtlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYW4gb2JqZWN0LiBOb3RlIHRoYXQgdGhpcyBjb3BpZXMgYW5kIGZsYXR0ZW5zXG4gKiBwcm90b3R5cGUgcHJvcGVydGllcyBvbnRvIHRoZSBuZXcgb2JqZWN0IGFzIHdlbGwuIEFsbCBub24tcHJpbWl0aXZlXG4gKiBwcm9wZXJ0aWVzIGFyZSBjb3BpZWQgYnkgcmVmZXJlbmNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ3xJbnRlZ2VyfSBwcm9wIFRoZSBwcm9wIG9wZXJhdGluZ1xuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R8QXJyYXl9IEEgbmV3IG9iamVjdCBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbC5cbiAqL1xuXG5mdW5jdGlvbiBfc2hhbGxvd0Nsb25lT2JqZWN0KHByb3AsIG9iaikge1xuICBpZiAoX2lzSW50ZWdlcihwcm9wKSAmJiBfaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdChvYmopO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gb2JqKSB7XG4gICAgcmVzdWx0W3BdID0gb2JqW3BdO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIGFuIG9iamVjdCwgb21pdHRpbmcgdGhlIHByb3BlcnR5IGF0IHRoZSBnaXZlbiBwYXRoLlxuICogTm90ZSB0aGF0IHRoaXMgY29waWVzIGFuZCBmbGF0dGVucyBwcm90b3R5cGUgcHJvcGVydGllcyBvbnRvIHRoZSBuZXcgb2JqZWN0XG4gKiBhcyB3ZWxsLiBBbGwgbm9uLXByaW1pdGl2ZSBwcm9wZXJ0aWVzIGFyZSBjb3BpZWQgYnkgcmVmZXJlbmNlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjExLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgW0lkeF0gLT4ge2s6IHZ9IC0+IHtrOiB2fVxuICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byB0aGUgdmFsdWUgdG8gb21pdFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCB3aXRob3V0IHRoZSBwcm9wZXJ0eSBhdCBwYXRoXG4gKiBAc2VlIFIuYXNzb2NQYXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5kaXNzb2NQYXRoKFsnYScsICdiJywgJ2MnXSwge2E6IHtiOiB7YzogNDJ9fX0pOyAvLz0+IHthOiB7Yjoge319fVxuICovXG5cblxudmFyIGRpc3NvY1BhdGggPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBkaXNzb2NQYXRoKHBhdGgsIG9iaikge1xuICBpZiAob2JqID09IG51bGwpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgc3dpdGNoIChwYXRoLmxlbmd0aCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBvYmo7XG5cbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gX2Rpc3NvYyhwYXRoWzBdLCBvYmopO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHZhciBoZWFkID0gcGF0aFswXTtcbiAgICAgIHZhciB0YWlsID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocGF0aCwgMSk7XG5cbiAgICAgIGlmIChvYmpbaGVhZF0gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gX3NoYWxsb3dDbG9uZU9iamVjdChoZWFkLCBvYmopO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFzc29jKGhlYWQsIGRpc3NvY1BhdGgodGFpbCwgb2JqW2hlYWRdKSwgb2JqKTtcbiAgICAgIH1cblxuICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZGlzc29jUGF0aDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIERpdmlkZXMgdHdvIG51bWJlcnMuIEVxdWl2YWxlbnQgdG8gYGEgLyBiYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gTnVtYmVyXG4gKiBAcGFyYW0ge051bWJlcn0gYSBUaGUgZmlyc3QgdmFsdWUuXG4gKiBAcGFyYW0ge051bWJlcn0gYiBUaGUgc2Vjb25kIHZhbHVlLlxuICogQHJldHVybiB7TnVtYmVyfSBUaGUgcmVzdWx0IG9mIGBhIC8gYmAuXG4gKiBAc2VlIFIubXVsdGlwbHlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmRpdmlkZSg3MSwgMTAwKTsgLy89PiAwLjcxXG4gKlxuICogICAgICBjb25zdCBoYWxmID0gUi5kaXZpZGUoUi5fXywgMik7XG4gKiAgICAgIGhhbGYoNDIpOyAvLz0+IDIxXG4gKlxuICogICAgICBjb25zdCByZWNpcHJvY2FsID0gUi5kaXZpZGUoMSk7XG4gKiAgICAgIHJlY2lwcm9jYWwoNCk7ICAgLy89PiAwLjI1XG4gKi9cblxudmFyIGRpdmlkZSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIGRpdmlkZShhLCBiKSB7XG4gIHJldHVybiBhIC8gYjtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBkaXZpZGU7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF94ZHJvcCBmcm9tIFwiLi9pbnRlcm5hbC9feGRyb3AuanNcIjtcbmltcG9ydCBzbGljZSBmcm9tIFwiLi9zbGljZS5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGFsbCBidXQgdGhlIGZpcnN0IGBuYCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gbGlzdCwgc3RyaW5nLCBvclxuICogdHJhbnNkdWNlci90cmFuc2Zvcm1lciAob3Igb2JqZWN0IHdpdGggYSBgZHJvcGAgbWV0aG9kKS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgZHJvcGAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gW2FdIC0+IFthXVxuICogQHNpZyBOdW1iZXIgLT4gU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Kn0gQSBjb3B5IG9mIGxpc3Qgd2l0aG91dCB0aGUgZmlyc3QgYG5gIGVsZW1lbnRzXG4gKiBAc2VlIFIudGFrZSwgUi50cmFuc2R1Y2UsIFIuZHJvcExhc3QsIFIuZHJvcFdoaWxlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5kcm9wKDEsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydiYXInLCAnYmF6J11cbiAqICAgICAgUi5kcm9wKDIsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydiYXonXVxuICogICAgICBSLmRyb3AoMywgWydmb28nLCAnYmFyJywgJ2JheiddKTsgLy89PiBbXVxuICogICAgICBSLmRyb3AoNCwgWydmb28nLCAnYmFyJywgJ2JheiddKTsgLy89PiBbXVxuICogICAgICBSLmRyb3AoMywgJ3JhbWRhJyk7ICAgICAgICAgICAgICAgLy89PiAnZGEnXG4gKi9cblxudmFyIGRyb3AgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5Mihcbi8qI19fUFVSRV9fKi9cbl9kaXNwYXRjaGFibGUoWydkcm9wJ10sIF94ZHJvcCwgZnVuY3Rpb24gZHJvcChuLCB4cykge1xuICByZXR1cm4gc2xpY2UoTWF0aC5tYXgoMCwgbiksIEluZmluaXR5LCB4cyk7XG59KSk7XG5cbmV4cG9ydCBkZWZhdWx0IGRyb3A7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF9kcm9wTGFzdCBmcm9tIFwiLi9pbnRlcm5hbC9fZHJvcExhc3QuanNcIjtcbmltcG9ydCBfeGRyb3BMYXN0IGZyb20gXCIuL2ludGVybmFsL194ZHJvcExhc3QuanNcIjtcbi8qKlxuICogUmV0dXJucyBhIGxpc3QgY29udGFpbmluZyBhbGwgYnV0IHRoZSBsYXN0IGBuYCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gYGxpc3RgLlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNi4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gW2FdIC0+IFthXVxuICogQHNpZyBOdW1iZXIgLT4gU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtOdW1iZXJ9IG4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiBgbGlzdGAgdG8gc2tpcC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3Qgb2YgZWxlbWVudHMgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBjb3B5IG9mIHRoZSBsaXN0IHdpdGggb25seSB0aGUgZmlyc3QgYGxpc3QubGVuZ3RoIC0gbmAgZWxlbWVudHNcbiAqIEBzZWUgUi50YWtlTGFzdCwgUi5kcm9wLCBSLmRyb3BXaGlsZSwgUi5kcm9wTGFzdFdoaWxlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5kcm9wTGFzdCgxLCBbJ2ZvbycsICdiYXInLCAnYmF6J10pOyAvLz0+IFsnZm9vJywgJ2JhciddXG4gKiAgICAgIFIuZHJvcExhc3QoMiwgWydmb28nLCAnYmFyJywgJ2JheiddKTsgLy89PiBbJ2ZvbyddXG4gKiAgICAgIFIuZHJvcExhc3QoMywgWydmb28nLCAnYmFyJywgJ2JheiddKTsgLy89PiBbXVxuICogICAgICBSLmRyb3BMYXN0KDQsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gW11cbiAqICAgICAgUi5kcm9wTGFzdCgzLCAncmFtZGEnKTsgICAgICAgICAgICAgICAvLz0+ICdyYSdcbiAqL1xuXG52YXIgZHJvcExhc3QgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5Mihcbi8qI19fUFVSRV9fKi9cbl9kaXNwYXRjaGFibGUoW10sIF94ZHJvcExhc3QsIF9kcm9wTGFzdCkpO1xuXG5leHBvcnQgZGVmYXVsdCBkcm9wTGFzdDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2Rpc3BhdGNoYWJsZSBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzXCI7XG5pbXBvcnQgX2Ryb3BMYXN0V2hpbGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Ryb3BMYXN0V2hpbGUuanNcIjtcbmltcG9ydCBfeGRyb3BMYXN0V2hpbGUgZnJvbSBcIi4vaW50ZXJuYWwvX3hkcm9wTGFzdFdoaWxlLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBleGNsdWRpbmcgYWxsIHRoZSB0YWlsaW5nIGVsZW1lbnRzIG9mIGEgZ2l2ZW4gbGlzdCB3aGljaFxuICogc2F0aXNmeSB0aGUgc3VwcGxpZWQgcHJlZGljYXRlIGZ1bmN0aW9uLiBJdCBwYXNzZXMgZWFjaCB2YWx1ZSBmcm9tIHRoZSByaWdodFxuICogdG8gdGhlIHN1cHBsaWVkIHByZWRpY2F0ZSBmdW5jdGlvbiwgc2tpcHBpbmcgZWxlbWVudHMgdW50aWwgdGhlIHByZWRpY2F0ZVxuICogZnVuY3Rpb24gcmV0dXJucyBhIGBmYWxzeWAgdmFsdWUuIFRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gaXMgYXBwbGllZCB0byBvbmUgYXJndW1lbnQ6XG4gKiAqKHZhbHVlKSouXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBbYV1cbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gZWFjaCBlbGVtZW50XG4gKiBAcGFyYW0ge0FycmF5fSB4cyBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgYXJyYXkgd2l0aG91dCBhbnkgdHJhaWxpbmcgZWxlbWVudHMgdGhhdCByZXR1cm4gYGZhbHN5YCB2YWx1ZXMgZnJvbSB0aGUgYHByZWRpY2F0ZWAuXG4gKiBAc2VlIFIudGFrZUxhc3RXaGlsZSwgUi5hZGRJbmRleCwgUi5kcm9wLCBSLmRyb3BXaGlsZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGx0ZVRocmVlID0geCA9PiB4IDw9IDM7XG4gKlxuICogICAgICBSLmRyb3BMYXN0V2hpbGUobHRlVGhyZWUsIFsxLCAyLCAzLCA0LCAzLCAyLCAxXSk7IC8vPT4gWzEsIDIsIDMsIDRdXG4gKlxuICogICAgICBSLmRyb3BMYXN0V2hpbGUoeCA9PiB4ICE9PSAnZCcgLCAnUmFtZGEnKTsgLy89PiAnUmFtZCdcbiAqL1xuXG52YXIgZHJvcExhc3RXaGlsZSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKFxuLyojX19QVVJFX18qL1xuX2Rpc3BhdGNoYWJsZShbXSwgX3hkcm9wTGFzdFdoaWxlLCBfZHJvcExhc3RXaGlsZSkpO1xuXG5leHBvcnQgZGVmYXVsdCBkcm9wTGFzdFdoaWxlOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfeGRyb3BSZXBlYXRzV2l0aCBmcm9tIFwiLi9pbnRlcm5hbC9feGRyb3BSZXBlYXRzV2l0aC5qc1wiO1xuaW1wb3J0IGRyb3BSZXBlYXRzV2l0aCBmcm9tIFwiLi9kcm9wUmVwZWF0c1dpdGguanNcIjtcbmltcG9ydCBlcXVhbHMgZnJvbSBcIi4vZXF1YWxzLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCB3aXRob3V0IGFueSBjb25zZWN1dGl2ZWx5IHJlcGVhdGluZyBlbGVtZW50cy5cbiAqIFtgUi5lcXVhbHNgXSgjZXF1YWxzKSBpcyB1c2VkIHRvIGRldGVybWluZSBlcXVhbGl0eS5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTQuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IFthXVxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gYGxpc3RgIHdpdGhvdXQgcmVwZWF0aW5nIGVsZW1lbnRzLlxuICogQHNlZSBSLnRyYW5zZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgUi5kcm9wUmVwZWF0cyhbMSwgMSwgMSwgMiwgMywgNCwgNCwgMiwgMl0pOyAvLz0+IFsxLCAyLCAzLCA0LCAyXVxuICovXG5cbnZhciBkcm9wUmVwZWF0cyA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKFxuLyojX19QVVJFX18qL1xuX2Rpc3BhdGNoYWJsZShbXSwgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX3hkcm9wUmVwZWF0c1dpdGgoZXF1YWxzKTtcbn0sXG4vKiNfX1BVUkVfXyovXG5kcm9wUmVwZWF0c1dpdGgoZXF1YWxzKSkpO1xuXG5leHBvcnQgZGVmYXVsdCBkcm9wUmVwZWF0czsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2Rpc3BhdGNoYWJsZSBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzXCI7XG5pbXBvcnQgX3hkcm9wUmVwZWF0c1dpdGggZnJvbSBcIi4vaW50ZXJuYWwvX3hkcm9wUmVwZWF0c1dpdGguanNcIjtcbmltcG9ydCBkcm9wUmVwZWF0c1dpdGggZnJvbSBcIi4vZHJvcFJlcGVhdHNXaXRoLmpzXCI7XG5pbXBvcnQgZXFCeSBmcm9tIFwiLi9lcUJ5LmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCB3aXRob3V0IGFueSBjb25zZWN1dGl2ZWx5IHJlcGVhdGluZyBlbGVtZW50cyxcbiAqIGJhc2VkIHVwb24gdGhlIHZhbHVlIHJldHVybmVkIGJ5IGFwcGx5aW5nIHRoZSBzdXBwbGllZCBmdW5jdGlvbiB0b1xuICogZWFjaCBsaXN0IGVsZW1lbnQuIFtgUi5lcXVhbHNgXSgjZXF1YWxzKSBpcyB1c2VkIHRvIGRldGVybWluZSBlcXVhbGl0eS5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjkuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEgLT4gYikgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gQSBmdW5jdGlvbiB1c2VkIHRvIHByb2R1Y2UgYSB2YWx1ZSB0byB1c2UgZHVyaW5nIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gYGxpc3RgIHdpdGhvdXQgcmVwZWF0aW5nIGVsZW1lbnRzLlxuICogQHNlZSBSLnRyYW5zZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgUi5kcm9wUmVwZWF0c0J5KE1hdGguYWJzLCBbMSwgLTEsIC0xLCAyLCAzLCAtNCwgNCwgMiwgMl0pOyAvLz0+IFsxLCAyLCAzLCAtNCwgMl1cbiAqL1xuXG52YXIgZHJvcFJlcGVhdHNCeSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIChmbiwgbGlzdCkge1xuICByZXR1cm4gX2Rpc3BhdGNoYWJsZShbXSwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfeGRyb3BSZXBlYXRzV2l0aChlcUJ5KGZuKSk7XG4gIH0sIGRyb3BSZXBlYXRzV2l0aChlcUJ5KGZuKSkpKGxpc3QpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGRyb3BSZXBlYXRzQnk7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF94ZHJvcFJlcGVhdHNXaXRoIGZyb20gXCIuL2ludGVybmFsL194ZHJvcFJlcGVhdHNXaXRoLmpzXCI7XG5pbXBvcnQgbGFzdCBmcm9tIFwiLi9sYXN0LmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCB3aXRob3V0IGFueSBjb25zZWN1dGl2ZWx5IHJlcGVhdGluZyBlbGVtZW50cy4gRXF1YWxpdHkgaXNcbiAqIGRldGVybWluZWQgYnkgYXBwbHlpbmcgdGhlIHN1cHBsaWVkIHByZWRpY2F0ZSB0byBlYWNoIHBhaXIgb2YgY29uc2VjdXRpdmUgZWxlbWVudHMuIFRoZVxuICogZmlyc3QgZWxlbWVudCBpbiBhIHNlcmllcyBvZiBlcXVhbCBlbGVtZW50cyB3aWxsIGJlIHByZXNlcnZlZC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTQuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKChhLCBhKSAtPiBCb29sZWFuKSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkIEEgcHJlZGljYXRlIHVzZWQgdG8gdGVzdCB3aGV0aGVyIHR3byBpdGVtcyBhcmUgZXF1YWwuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBgbGlzdGAgd2l0aG91dCByZXBlYXRpbmcgZWxlbWVudHMuXG4gKiBAc2VlIFIudHJhbnNkdWNlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgbCA9IFsxLCAtMSwgMSwgMywgNCwgLTQsIC00LCAtNSwgNSwgMywgM107XG4gKiAgICAgIFIuZHJvcFJlcGVhdHNXaXRoKFIuZXFCeShNYXRoLmFicyksIGwpOyAvLz0+IFsxLCAzLCA0LCAtNSwgM11cbiAqL1xuXG52YXIgZHJvcFJlcGVhdHNXaXRoID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoXG4vKiNfX1BVUkVfXyovXG5fZGlzcGF0Y2hhYmxlKFtdLCBfeGRyb3BSZXBlYXRzV2l0aCwgZnVuY3Rpb24gZHJvcFJlcGVhdHNXaXRoKHByZWQsIGxpc3QpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgaWR4ID0gMTtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuXG4gIGlmIChsZW4gIT09IDApIHtcbiAgICByZXN1bHRbMF0gPSBsaXN0WzBdO1xuXG4gICAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgICAgaWYgKCFwcmVkKGxhc3QocmVzdWx0KSwgbGlzdFtpZHhdKSkge1xuICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBsaXN0W2lkeF07XG4gICAgICB9XG5cbiAgICAgIGlkeCArPSAxO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59KSk7XG5cbmV4cG9ydCBkZWZhdWx0IGRyb3BSZXBlYXRzV2l0aDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2Rpc3BhdGNoYWJsZSBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzXCI7XG5pbXBvcnQgX3hkcm9wV2hpbGUgZnJvbSBcIi4vaW50ZXJuYWwvX3hkcm9wV2hpbGUuanNcIjtcbmltcG9ydCBzbGljZSBmcm9tIFwiLi9zbGljZS5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgZXhjbHVkaW5nIHRoZSBsZWFkaW5nIGVsZW1lbnRzIG9mIGEgZ2l2ZW4gbGlzdCB3aGljaFxuICogc2F0aXNmeSB0aGUgc3VwcGxpZWQgcHJlZGljYXRlIGZ1bmN0aW9uLiBJdCBwYXNzZXMgZWFjaCB2YWx1ZSB0byB0aGUgc3VwcGxpZWRcbiAqIHByZWRpY2F0ZSBmdW5jdGlvbiwgc2tpcHBpbmcgZWxlbWVudHMgd2hpbGUgdGhlIHByZWRpY2F0ZSBmdW5jdGlvbiByZXR1cm5zXG4gKiBgdHJ1ZWAuIFRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gaXMgYXBwbGllZCB0byBvbmUgYXJndW1lbnQ6ICoodmFsdWUpKi5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgZHJvcFdoaWxlYCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiBbYV0gLT4gW2FdXG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IHhzIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEByZXR1cm4ge0FycmF5fSBBIG5ldyBhcnJheS5cbiAqIEBzZWUgUi50YWtlV2hpbGUsIFIudHJhbnNkdWNlLCBSLmFkZEluZGV4XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgbHRlVHdvID0geCA9PiB4IDw9IDI7XG4gKlxuICogICAgICBSLmRyb3BXaGlsZShsdGVUd28sIFsxLCAyLCAzLCA0LCAzLCAyLCAxXSk7IC8vPT4gWzMsIDQsIDMsIDIsIDFdXG4gKlxuICogICAgICBSLmRyb3BXaGlsZSh4ID0+IHggIT09ICdkJyAsICdSYW1kYScpOyAvLz0+ICdkYSdcbiAqL1xuXG52YXIgZHJvcFdoaWxlID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoXG4vKiNfX1BVUkVfXyovXG5fZGlzcGF0Y2hhYmxlKFsnZHJvcFdoaWxlJ10sIF94ZHJvcFdoaWxlLCBmdW5jdGlvbiBkcm9wV2hpbGUocHJlZCwgeHMpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSB4cy5sZW5ndGg7XG5cbiAgd2hpbGUgKGlkeCA8IGxlbiAmJiBwcmVkKHhzW2lkeF0pKSB7XG4gICAgaWR4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gc2xpY2UoaWR4LCBJbmZpbml0eSwgeHMpO1xufSkpO1xuXG5leHBvcnQgZGVmYXVsdCBkcm9wV2hpbGU7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCIuL2ludGVybmFsL19pc0Z1bmN0aW9uLmpzXCI7XG5pbXBvcnQgbGlmdCBmcm9tIFwiLi9saWZ0LmpzXCI7XG5pbXBvcnQgb3IgZnJvbSBcIi4vb3IuanNcIjtcbi8qKlxuICogQSBmdW5jdGlvbiB3cmFwcGluZyBjYWxscyB0byB0aGUgdHdvIGZ1bmN0aW9ucyBpbiBhbiBgfHxgIG9wZXJhdGlvbixcbiAqIHJldHVybmluZyB0aGUgcmVzdWx0IG9mIHRoZSBmaXJzdCBmdW5jdGlvbiBpZiBpdCBpcyB0cnV0aC15IGFuZCB0aGUgcmVzdWx0XG4gKiBvZiB0aGUgc2Vjb25kIGZ1bmN0aW9uIG90aGVyd2lzZS4gTm90ZSB0aGF0IHRoaXMgaXMgc2hvcnQtY2lyY3VpdGVkLFxuICogbWVhbmluZyB0aGF0IHRoZSBzZWNvbmQgZnVuY3Rpb24gd2lsbCBub3QgYmUgaW52b2tlZCBpZiB0aGUgZmlyc3QgcmV0dXJucyBhXG4gKiB0cnV0aC15IHZhbHVlLlxuICpcbiAqIEluIGFkZGl0aW9uIHRvIGZ1bmN0aW9ucywgYFIuZWl0aGVyYCBhbHNvIGFjY2VwdHMgYW55IGZhbnRhc3ktbGFuZCBjb21wYXRpYmxlXG4gKiBhcHBsaWNhdGl2ZSBmdW5jdG9yLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEyLjBcbiAqIEBjYXRlZ29yeSBMb2dpY1xuICogQHNpZyAoKi4uLiAtPiBCb29sZWFuKSAtPiAoKi4uLiAtPiBCb29sZWFuKSAtPiAoKi4uLiAtPiBCb29sZWFuKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZiBhIHByZWRpY2F0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZyBhbm90aGVyIHByZWRpY2F0ZVxuICogQHJldHVybiB7RnVuY3Rpb259IGEgZnVuY3Rpb24gdGhhdCBhcHBsaWVzIGl0cyBhcmd1bWVudHMgdG8gYGZgIGFuZCBgZ2AgYW5kIGB8fGBzIHRoZWlyIG91dHB1dHMgdG9nZXRoZXIuXG4gKiBAc2VlIFIuYm90aCwgUi5hbnlQYXNzLCBSLm9yXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZ3QxMCA9IHggPT4geCA+IDEwO1xuICogICAgICBjb25zdCBldmVuID0geCA9PiB4ICUgMiA9PT0gMDtcbiAqICAgICAgY29uc3QgZiA9IFIuZWl0aGVyKGd0MTAsIGV2ZW4pO1xuICogICAgICBmKDEwMSk7IC8vPT4gdHJ1ZVxuICogICAgICBmKDgpOyAvLz0+IHRydWVcbiAqXG4gKiAgICAgIFIuZWl0aGVyKE1heWJlLkp1c3QoZmFsc2UpLCBNYXliZS5KdXN0KDU1KSk7IC8vID0+IE1heWJlLkp1c3QoNTUpXG4gKiAgICAgIFIuZWl0aGVyKFtmYWxzZSwgZmFsc2UsICdhJ10sIFsxMV0pIC8vID0+IFsxMSwgMTEsIFwiYVwiXVxuICovXG5cbnZhciBlaXRoZXIgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBlaXRoZXIoZiwgZykge1xuICByZXR1cm4gX2lzRnVuY3Rpb24oZikgPyBmdW5jdGlvbiBfZWl0aGVyKCkge1xuICAgIHJldHVybiBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9IDogbGlmdChvcikoZiwgZyk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZWl0aGVyOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaXNBcmd1bWVudHMgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJndW1lbnRzLmpzXCI7XG5pbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJyYXkuanNcIjtcbmltcG9ydCBfaXNPYmplY3QgZnJvbSBcIi4vaW50ZXJuYWwvX2lzT2JqZWN0LmpzXCI7XG5pbXBvcnQgX2lzU3RyaW5nIGZyb20gXCIuL2ludGVybmFsL19pc1N0cmluZy5qc1wiO1xuaW1wb3J0IF9pc1R5cGVkQXJyYXkgZnJvbSBcIi4vaW50ZXJuYWwvX2lzVHlwZWRBcnJheS5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBlbXB0eSB2YWx1ZSBvZiBpdHMgYXJndW1lbnQncyB0eXBlLiBSYW1kYSBkZWZpbmVzIHRoZSBlbXB0eVxuICogdmFsdWUgb2YgQXJyYXkgKGBbXWApLCBPYmplY3QgKGB7fWApLCBTdHJpbmcgKGAnJ2ApLFxuICogVHlwZWRBcnJheSAoYFVpbnQ4QXJyYXkgW11gLCBgRmxvYXQzMkFycmF5IFtdYCwgZXRjKSwgYW5kIEFyZ3VtZW50cy4gT3RoZXJcbiAqIHR5cGVzIGFyZSBzdXBwb3J0ZWQgaWYgdGhleSBkZWZpbmUgYDxUeXBlPi5lbXB0eWAsXG4gKiBgPFR5cGU+LnByb3RvdHlwZS5lbXB0eWAgb3IgaW1wbGVtZW50IHRoZVxuICogW0ZhbnRhc3lMYW5kIE1vbm9pZCBzcGVjXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI21vbm9pZCkuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGVtcHR5YCBtZXRob2Qgb2YgdGhlIGZpcnN0IGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjMuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIGEgLT4gYVxuICogQHBhcmFtIHsqfSB4XG4gKiBAcmV0dXJuIHsqfVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuZW1wdHkoSnVzdCg0MikpOyAgICAgICAgICAgICAgIC8vPT4gTm90aGluZygpXG4gKiAgICAgIFIuZW1wdHkoWzEsIDIsIDNdKTsgICAgICAgICAgICAgIC8vPT4gW11cbiAqICAgICAgUi5lbXB0eSgndW5pY29ybnMnKTsgICAgICAgICAgICAgLy89PiAnJ1xuICogICAgICBSLmVtcHR5KHt4OiAxLCB5OiAyfSk7ICAgICAgICAgICAvLz0+IHt9XG4gKiAgICAgIFIuZW1wdHkoVWludDhBcnJheS5mcm9tKCcxMjMnKSk7IC8vPT4gVWludDhBcnJheSBbXVxuICovXG5cbnZhciBlbXB0eSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIGVtcHR5KHgpIHtcbiAgcmV0dXJuIHggIT0gbnVsbCAmJiB0eXBlb2YgeFsnZmFudGFzeS1sYW5kL2VtcHR5J10gPT09ICdmdW5jdGlvbicgPyB4WydmYW50YXN5LWxhbmQvZW1wdHknXSgpIDogeCAhPSBudWxsICYmIHguY29uc3RydWN0b3IgIT0gbnVsbCAmJiB0eXBlb2YgeC5jb25zdHJ1Y3RvclsnZmFudGFzeS1sYW5kL2VtcHR5J10gPT09ICdmdW5jdGlvbicgPyB4LmNvbnN0cnVjdG9yWydmYW50YXN5LWxhbmQvZW1wdHknXSgpIDogeCAhPSBudWxsICYmIHR5cGVvZiB4LmVtcHR5ID09PSAnZnVuY3Rpb24nID8geC5lbXB0eSgpIDogeCAhPSBudWxsICYmIHguY29uc3RydWN0b3IgIT0gbnVsbCAmJiB0eXBlb2YgeC5jb25zdHJ1Y3Rvci5lbXB0eSA9PT0gJ2Z1bmN0aW9uJyA/IHguY29uc3RydWN0b3IuZW1wdHkoKSA6IF9pc0FycmF5KHgpID8gW10gOiBfaXNTdHJpbmcoeCkgPyAnJyA6IF9pc09iamVjdCh4KSA/IHt9IDogX2lzQXJndW1lbnRzKHgpID8gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBhcmd1bWVudHM7XG4gIH0oKSA6IF9pc1R5cGVkQXJyYXkoeCkgPyB4LmNvbnN0cnVjdG9yLmZyb20oJycpIDogdm9pZCAwIC8vIGVsc2VcbiAgO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGVtcHR5OyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBlcXVhbHMgZnJvbSBcIi4vZXF1YWxzLmpzXCI7XG5pbXBvcnQgdGFrZUxhc3QgZnJvbSBcIi4vdGFrZUxhc3QuanNcIjtcbi8qKlxuICogQ2hlY2tzIGlmIGEgbGlzdCBlbmRzIHdpdGggdGhlIHByb3ZpZGVkIHN1Ymxpc3QuXG4gKlxuICogU2ltaWxhcmx5LCBjaGVja3MgaWYgYSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBwcm92aWRlZCBzdWJzdHJpbmcuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjQuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IFthXSAtPiBCb29sZWFuXG4gKiBAc2lnIFN0cmluZyAtPiBTdHJpbmcgLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSBzdWZmaXhcbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBzZWUgUi5zdGFydHNXaXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5lbmRzV2l0aCgnYycsICdhYmMnKSAgICAgICAgICAgICAgICAvLz0+IHRydWVcbiAqICAgICAgUi5lbmRzV2l0aCgnYicsICdhYmMnKSAgICAgICAgICAgICAgICAvLz0+IGZhbHNlXG4gKiAgICAgIFIuZW5kc1dpdGgoWydjJ10sIFsnYScsICdiJywgJ2MnXSkgICAgLy89PiB0cnVlXG4gKiAgICAgIFIuZW5kc1dpdGgoWydiJ10sIFsnYScsICdiJywgJ2MnXSkgICAgLy89PiBmYWxzZVxuICovXG5cbnZhciBlbmRzV2l0aCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIChzdWZmaXgsIGxpc3QpIHtcbiAgcmV0dXJuIGVxdWFscyh0YWtlTGFzdChzdWZmaXgubGVuZ3RoLCBsaXN0KSwgc3VmZml4KTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBlbmRzV2l0aDsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgZXF1YWxzIGZyb20gXCIuL2VxdWFscy5qc1wiO1xuLyoqXG4gKiBUYWtlcyBhIGZ1bmN0aW9uIGFuZCB0d28gdmFsdWVzIGluIGl0cyBkb21haW4gYW5kIHJldHVybnMgYHRydWVgIGlmIHRoZVxuICogdmFsdWVzIG1hcCB0byB0aGUgc2FtZSB2YWx1ZSBpbiB0aGUgY29kb21haW47IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE4LjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyAoYSAtPiBiKSAtPiBhIC0+IGEgLT4gQm9vbGVhblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZlxuICogQHBhcmFtIHsqfSB4XG4gKiBAcGFyYW0geyp9IHlcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5lcUJ5KE1hdGguYWJzLCA1LCAtNSk7IC8vPT4gdHJ1ZVxuICovXG5cbnZhciBlcUJ5ID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTMoZnVuY3Rpb24gZXFCeShmLCB4LCB5KSB7XG4gIHJldHVybiBlcXVhbHMoZih4KSwgZih5KSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZXFCeTsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgZXF1YWxzIGZyb20gXCIuL2VxdWFscy5qc1wiO1xuLyoqXG4gKiBSZXBvcnRzIHdoZXRoZXIgdHdvIG9iamVjdHMgaGF2ZSB0aGUgc2FtZSB2YWx1ZSwgaW4gW2BSLmVxdWFsc2BdKCNlcXVhbHMpXG4gKiB0ZXJtcywgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuIFVzZWZ1bCBhcyBhIGN1cnJpZWQgcHJlZGljYXRlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyBrIC0+IHtrOiB2fSAtPiB7azogdn0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtTdHJpbmd9IHByb3AgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNvbXBhcmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgbzEgPSB7IGE6IDEsIGI6IDIsIGM6IDMsIGQ6IDQgfTtcbiAqICAgICAgY29uc3QgbzIgPSB7IGE6IDEwLCBiOiAyMCwgYzogMywgZDogNDAgfTtcbiAqICAgICAgUi5lcVByb3BzKCdhJywgbzEsIG8yKTsgLy89PiBmYWxzZVxuICogICAgICBSLmVxUHJvcHMoJ2MnLCBvMSwgbzIpOyAvLz0+IHRydWVcbiAqL1xuXG52YXIgZXFQcm9wcyA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIGVxUHJvcHMocHJvcCwgb2JqMSwgb2JqMikge1xuICByZXR1cm4gZXF1YWxzKG9iajFbcHJvcF0sIG9iajJbcHJvcF0pO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGVxUHJvcHM7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9lcXVhbHMgZnJvbSBcIi4vaW50ZXJuYWwvX2VxdWFscy5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBpdHMgYXJndW1lbnRzIGFyZSBlcXVpdmFsZW50LCBgZmFsc2VgIG90aGVyd2lzZS4gSGFuZGxlc1xuICogY3ljbGljYWwgZGF0YSBzdHJ1Y3R1cmVzLlxuICpcbiAqIERpc3BhdGNoZXMgc3ltbWV0cmljYWxseSB0byB0aGUgYGVxdWFsc2AgbWV0aG9kcyBvZiBib3RoIGFyZ3VtZW50cywgaWZcbiAqIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTUuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIGEgLT4gYiAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmVxdWFscygxLCAxKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuZXF1YWxzKDEsICcxJyk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5lcXVhbHMoWzEsIDIsIDNdLCBbMSwgMiwgM10pOyAvLz0+IHRydWVcbiAqXG4gKiAgICAgIGNvbnN0IGEgPSB7fTsgYS52ID0gYTtcbiAqICAgICAgY29uc3QgYiA9IHt9OyBiLnYgPSBiO1xuICogICAgICBSLmVxdWFscyhhLCBiKTsgLy89PiB0cnVlXG4gKi9cblxudmFyIGVxdWFscyA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBfZXF1YWxzKGEsIGIsIFtdLCBbXSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZXF1YWxzOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaXNBcnJheSBmcm9tIFwiLi9pbnRlcm5hbC9faXNBcnJheS5qc1wiO1xuaW1wb3J0IF9pc09iamVjdCBmcm9tIFwiLi9pbnRlcm5hbC9faXNPYmplY3QuanNcIjtcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3QgYnkgcmVjdXJzaXZlbHkgZXZvbHZpbmcgYSBzaGFsbG93IGNvcHkgb2YgYG9iamVjdGAsXG4gKiBhY2NvcmRpbmcgdG8gdGhlIGB0cmFuc2Zvcm1hdGlvbmAgZnVuY3Rpb25zLiBBbGwgbm9uLXByaW1pdGl2ZSBwcm9wZXJ0aWVzXG4gKiBhcmUgY29waWVkIGJ5IHJlZmVyZW5jZS5cbiAqXG4gKiBBIGB0cmFuc2Zvcm1hdGlvbmAgZnVuY3Rpb24gd2lsbCBub3QgYmUgaW52b2tlZCBpZiBpdHMgY29ycmVzcG9uZGluZyBrZXlcbiAqIGRvZXMgbm90IGV4aXN0IGluIHRoZSBldm9sdmVkIG9iamVjdC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC45LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcge2s6ICh2IC0+IHYpfSAtPiB7azogdn0gLT4ge2s6IHZ9XG4gKiBAcGFyYW0ge09iamVjdH0gdHJhbnNmb3JtYXRpb25zIFRoZSBvYmplY3Qgc3BlY2lmeWluZyB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMgdG8gYXBwbHlcbiAqICAgICAgICB0byB0aGUgb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIHRyYW5zZm9ybWVkLlxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgdHJhbnNmb3JtZWQgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHRvbWF0byA9IHtmaXJzdE5hbWU6ICcgIFRvbWF0byAnLCBkYXRhOiB7ZWxhcHNlZDogMTAwLCByZW1haW5pbmc6IDE0MDB9LCBpZDoxMjN9O1xuICogICAgICBjb25zdCB0cmFuc2Zvcm1hdGlvbnMgPSB7XG4gKiAgICAgICAgZmlyc3ROYW1lOiBSLnRyaW0sXG4gKiAgICAgICAgbGFzdE5hbWU6IFIudHJpbSwgLy8gV2lsbCBub3QgZ2V0IGludm9rZWQuXG4gKiAgICAgICAgZGF0YToge2VsYXBzZWQ6IFIuYWRkKDEpLCByZW1haW5pbmc6IFIuYWRkKC0xKX1cbiAqICAgICAgfTtcbiAqICAgICAgUi5ldm9sdmUodHJhbnNmb3JtYXRpb25zLCB0b21hdG8pOyAvLz0+IHtmaXJzdE5hbWU6ICdUb21hdG8nLCBkYXRhOiB7ZWxhcHNlZDogMTAxLCByZW1haW5pbmc6IDEzOTl9LCBpZDoxMjN9XG4gKi9cblxudmFyIGV2b2x2ZSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIGV2b2x2ZSh0cmFuc2Zvcm1hdGlvbnMsIG9iamVjdCkge1xuICBpZiAoIV9pc09iamVjdChvYmplY3QpICYmICFfaXNBcnJheShvYmplY3QpKSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSBvYmplY3QgaW5zdGFuY2VvZiBBcnJheSA/IFtdIDoge307XG4gIHZhciB0cmFuc2Zvcm1hdGlvbiwga2V5LCB0eXBlO1xuXG4gIGZvciAoa2V5IGluIG9iamVjdCkge1xuICAgIHRyYW5zZm9ybWF0aW9uID0gdHJhbnNmb3JtYXRpb25zW2tleV07XG4gICAgdHlwZSA9IHR5cGVvZiB0cmFuc2Zvcm1hdGlvbjtcbiAgICByZXN1bHRba2V5XSA9IHR5cGUgPT09ICdmdW5jdGlvbicgPyB0cmFuc2Zvcm1hdGlvbihvYmplY3Rba2V5XSkgOiB0cmFuc2Zvcm1hdGlvbiAmJiB0eXBlID09PSAnb2JqZWN0JyA/IGV2b2x2ZSh0cmFuc2Zvcm1hdGlvbiwgb2JqZWN0W2tleV0pIDogb2JqZWN0W2tleV07XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGV2b2x2ZTsiLCJpbXBvcnQgX2FycmF5UmVkdWNlIGZyb20gXCIuL2ludGVybmFsL19hcnJheVJlZHVjZS5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF9maWx0ZXIgZnJvbSBcIi4vaW50ZXJuYWwvX2ZpbHRlci5qc1wiO1xuaW1wb3J0IF9pc09iamVjdCBmcm9tIFwiLi9pbnRlcm5hbC9faXNPYmplY3QuanNcIjtcbmltcG9ydCBfeGZpbHRlciBmcm9tIFwiLi9pbnRlcm5hbC9feGZpbHRlci5qc1wiO1xuaW1wb3J0IGtleXMgZnJvbSBcIi4va2V5cy5qc1wiO1xuLyoqXG4gKiBUYWtlcyBhIHByZWRpY2F0ZSBhbmQgYSBgRmlsdGVyYWJsZWAsIGFuZCByZXR1cm5zIGEgbmV3IGZpbHRlcmFibGUgb2YgdGhlXG4gKiBzYW1lIHR5cGUgY29udGFpbmluZyB0aGUgbWVtYmVycyBvZiB0aGUgZ2l2ZW4gZmlsdGVyYWJsZSB3aGljaCBzYXRpc2Z5IHRoZVxuICogZ2l2ZW4gcHJlZGljYXRlLiBGaWx0ZXJhYmxlIG9iamVjdHMgaW5jbHVkZSBwbGFpbiBvYmplY3RzIG9yIGFueSBvYmplY3RcbiAqIHRoYXQgaGFzIGEgZmlsdGVyIG1ldGhvZCBzdWNoIGFzIGBBcnJheWAuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGZpbHRlcmAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgRmlsdGVyYWJsZSBmID0+IChhIC0+IEJvb2xlYW4pIC0+IGYgYSAtPiBmIGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRcbiAqIEBwYXJhbSB7QXJyYXl9IGZpbHRlcmFibGVcbiAqIEByZXR1cm4ge0FycmF5fSBGaWx0ZXJhYmxlXG4gKiBAc2VlIFIucmVqZWN0LCBSLnRyYW5zZHVjZSwgUi5hZGRJbmRleFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGlzRXZlbiA9IG4gPT4gbiAlIDIgPT09IDA7XG4gKlxuICogICAgICBSLmZpbHRlcihpc0V2ZW4sIFsxLCAyLCAzLCA0XSk7IC8vPT4gWzIsIDRdXG4gKlxuICogICAgICBSLmZpbHRlcihpc0V2ZW4sIHthOiAxLCBiOiAyLCBjOiAzLCBkOiA0fSk7IC8vPT4ge2I6IDIsIGQ6IDR9XG4gKi9cblxudmFyIGZpbHRlciA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKFxuLyojX19QVVJFX18qL1xuX2Rpc3BhdGNoYWJsZShbJ2ZhbnRhc3ktbGFuZC9maWx0ZXInLCAnZmlsdGVyJ10sIF94ZmlsdGVyLCBmdW5jdGlvbiAocHJlZCwgZmlsdGVyYWJsZSkge1xuICByZXR1cm4gX2lzT2JqZWN0KGZpbHRlcmFibGUpID8gX2FycmF5UmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgIGlmIChwcmVkKGZpbHRlcmFibGVba2V5XSkpIHtcbiAgICAgIGFjY1trZXldID0gZmlsdGVyYWJsZVtrZXldO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9LCBrZXlzKGZpbHRlcmFibGUpKSA6IC8vIGVsc2VcbiAgX2ZpbHRlcihwcmVkLCBmaWx0ZXJhYmxlKTtcbn0pKTtcblxuZXhwb3J0IGRlZmF1bHQgZmlsdGVyOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfeGZpbmQgZnJvbSBcIi4vaW50ZXJuYWwvX3hmaW5kLmpzXCI7XG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3Qgd2hpY2ggbWF0Y2hlcyB0aGUgcHJlZGljYXRlLCBvclxuICogYHVuZGVmaW5lZGAgaWYgbm8gZWxlbWVudCBtYXRjaGVzLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBmaW5kYCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiBbYV0gLT4gYSB8IHVuZGVmaW5lZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgZWxlbWVudCBpcyB0aGVcbiAqICAgICAgICBkZXNpcmVkIG9uZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgZWxlbWVudCBmb3VuZCwgb3IgYHVuZGVmaW5lZGAuXG4gKiBAc2VlIFIudHJhbnNkdWNlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgeHMgPSBbe2E6IDF9LCB7YTogMn0sIHthOiAzfV07XG4gKiAgICAgIFIuZmluZChSLnByb3BFcSgnYScsIDIpKSh4cyk7IC8vPT4ge2E6IDJ9XG4gKiAgICAgIFIuZmluZChSLnByb3BFcSgnYScsIDQpKSh4cyk7IC8vPT4gdW5kZWZpbmVkXG4gKi9cblxudmFyIGZpbmQgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5Mihcbi8qI19fUFVSRV9fKi9cbl9kaXNwYXRjaGFibGUoWydmaW5kJ10sIF94ZmluZCwgZnVuY3Rpb24gZmluZChmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuXG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBpZiAoZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmV0dXJuIGxpc3RbaWR4XTtcbiAgICB9XG5cbiAgICBpZHggKz0gMTtcbiAgfVxufSkpO1xuXG5leHBvcnQgZGVmYXVsdCBmaW5kOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfeGZpbmRJbmRleCBmcm9tIFwiLi9pbnRlcm5hbC9feGZpbmRJbmRleC5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCB3aGljaCBtYXRjaGVzIHRoZVxuICogcHJlZGljYXRlLCBvciBgLTFgIGlmIG5vIGVsZW1lbnQgbWF0Y2hlcy5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4xXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiBbYV0gLT4gTnVtYmVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBlbGVtZW50IGlzIHRoZVxuICogZGVzaXJlZCBvbmUuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge051bWJlcn0gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IGZvdW5kLCBvciBgLTFgLlxuICogQHNlZSBSLnRyYW5zZHVjZSwgUi5pbmRleE9mXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgeHMgPSBbe2E6IDF9LCB7YTogMn0sIHthOiAzfV07XG4gKiAgICAgIFIuZmluZEluZGV4KFIucHJvcEVxKCdhJywgMikpKHhzKTsgLy89PiAxXG4gKiAgICAgIFIuZmluZEluZGV4KFIucHJvcEVxKCdhJywgNCkpKHhzKTsgLy89PiAtMVxuICovXG5cbnZhciBmaW5kSW5kZXggPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5Mihcbi8qI19fUFVSRV9fKi9cbl9kaXNwYXRjaGFibGUoW10sIF94ZmluZEluZGV4LCBmdW5jdGlvbiBmaW5kSW5kZXgoZm4sIGxpc3QpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBsaXN0Lmxlbmd0aDtcblxuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgaWYgKGZuKGxpc3RbaWR4XSkpIHtcbiAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuXG4gICAgaWR4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gLTE7XG59KSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZpbmRJbmRleDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2Rpc3BhdGNoYWJsZSBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzXCI7XG5pbXBvcnQgX3hmaW5kTGFzdCBmcm9tIFwiLi9pbnRlcm5hbC9feGZpbmRMYXN0LmpzXCI7XG4vKipcbiAqIFJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgbGlzdCB3aGljaCBtYXRjaGVzIHRoZSBwcmVkaWNhdGUsIG9yXG4gKiBgdW5kZWZpbmVkYCBpZiBubyBlbGVtZW50IG1hdGNoZXMuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMVxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IGEgfCB1bmRlZmluZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGVsZW1lbnQgaXMgdGhlXG4gKiBkZXNpcmVkIG9uZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgZWxlbWVudCBmb3VuZCwgb3IgYHVuZGVmaW5lZGAuXG4gKiBAc2VlIFIudHJhbnNkdWNlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgeHMgPSBbe2E6IDEsIGI6IDB9LCB7YToxLCBiOiAxfV07XG4gKiAgICAgIFIuZmluZExhc3QoUi5wcm9wRXEoJ2EnLCAxKSkoeHMpOyAvLz0+IHthOiAxLCBiOiAxfVxuICogICAgICBSLmZpbmRMYXN0KFIucHJvcEVxKCdhJywgNCkpKHhzKTsgLy89PiB1bmRlZmluZWRcbiAqL1xuXG52YXIgZmluZExhc3QgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5Mihcbi8qI19fUFVSRV9fKi9cbl9kaXNwYXRjaGFibGUoW10sIF94ZmluZExhc3QsIGZ1bmN0aW9uIGZpbmRMYXN0KGZuLCBsaXN0KSB7XG4gIHZhciBpZHggPSBsaXN0Lmxlbmd0aCAtIDE7XG5cbiAgd2hpbGUgKGlkeCA+PSAwKSB7XG4gICAgaWYgKGZuKGxpc3RbaWR4XSkpIHtcbiAgICAgIHJldHVybiBsaXN0W2lkeF07XG4gICAgfVxuXG4gICAgaWR4IC09IDE7XG4gIH1cbn0pKTtcblxuZXhwb3J0IGRlZmF1bHQgZmluZExhc3Q7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF94ZmluZExhc3RJbmRleCBmcm9tIFwiLi9pbnRlcm5hbC9feGZpbmRMYXN0SW5kZXguanNcIjtcbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgbGlzdCB3aGljaCBtYXRjaGVzIHRoZVxuICogcHJlZGljYXRlLCBvciBgLTFgIGlmIG5vIGVsZW1lbnQgbWF0Y2hlcy5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4xXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiBbYV0gLT4gTnVtYmVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBlbGVtZW50IGlzIHRoZVxuICogZGVzaXJlZCBvbmUuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge051bWJlcn0gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IGZvdW5kLCBvciBgLTFgLlxuICogQHNlZSBSLnRyYW5zZHVjZSwgUi5sYXN0SW5kZXhPZlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHhzID0gW3thOiAxLCBiOiAwfSwge2E6MSwgYjogMX1dO1xuICogICAgICBSLmZpbmRMYXN0SW5kZXgoUi5wcm9wRXEoJ2EnLCAxKSkoeHMpOyAvLz0+IDFcbiAqICAgICAgUi5maW5kTGFzdEluZGV4KFIucHJvcEVxKCdhJywgNCkpKHhzKTsgLy89PiAtMVxuICovXG5cbnZhciBmaW5kTGFzdEluZGV4ID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoXG4vKiNfX1BVUkVfXyovXG5fZGlzcGF0Y2hhYmxlKFtdLCBfeGZpbmRMYXN0SW5kZXgsIGZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgoZm4sIGxpc3QpIHtcbiAgdmFyIGlkeCA9IGxpc3QubGVuZ3RoIC0gMTtcblxuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICBpZiAoZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmV0dXJuIGlkeDtcbiAgICB9XG5cbiAgICBpZHggLT0gMTtcbiAgfVxuXG4gIHJldHVybiAtMTtcbn0pKTtcblxuZXhwb3J0IGRlZmF1bHQgZmluZExhc3RJbmRleDsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX21ha2VGbGF0IGZyb20gXCIuL2ludGVybmFsL19tYWtlRmxhdC5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgYnkgcHVsbGluZyBldmVyeSBpdGVtIG91dCBvZiBpdCAoYW5kIGFsbCBpdHMgc3ViLWFycmF5cylcbiAqIGFuZCBwdXR0aW5nIHRoZW0gaW4gYSBuZXcgYXJyYXksIGRlcHRoLWZpcnN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IFtiXVxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGZsYXR0ZW5lZCBsaXN0LlxuICogQHNlZSBSLnVubmVzdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuZmxhdHRlbihbMSwgMiwgWzMsIDRdLCA1LCBbNiwgWzcsIDgsIFs5LCBbMTAsIDExXSwgMTJdXV1dKTtcbiAqICAgICAgLy89PiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMl1cbiAqL1xuXG52YXIgZmxhdHRlbiA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKFxuLyojX19QVVJFX18qL1xuX21ha2VGbGF0KHRydWUpKTtcblxuZXhwb3J0IGRlZmF1bHQgZmxhdHRlbjsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgY3VycnlOIGZyb20gXCIuL2N1cnJ5Ti5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGZ1bmN0aW9uIG11Y2ggbGlrZSB0aGUgc3VwcGxpZWQgb25lLCBleGNlcHQgdGhhdCB0aGUgZmlyc3QgdHdvXG4gKiBhcmd1bWVudHMnIG9yZGVyIGlzIHJldmVyc2VkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICgoYSwgYiwgYywgLi4uKSAtPiB6KSAtPiAoYiAtPiBhIC0+IGMgLT4gLi4uIC0+IHopXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gaW52b2tlIHdpdGggaXRzIGZpcnN0IHR3byBwYXJhbWV0ZXJzIHJldmVyc2VkLlxuICogQHJldHVybiB7Kn0gVGhlIHJlc3VsdCBvZiBpbnZva2luZyBgZm5gIHdpdGggaXRzIGZpcnN0IHR3byBwYXJhbWV0ZXJzJyBvcmRlciByZXZlcnNlZC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBtZXJnZVRocmVlID0gKGEsIGIsIGMpID0+IFtdLmNvbmNhdChhLCBiLCBjKTtcbiAqXG4gKiAgICAgIG1lcmdlVGhyZWUoMSwgMiwgMyk7IC8vPT4gWzEsIDIsIDNdXG4gKlxuICogICAgICBSLmZsaXAobWVyZ2VUaHJlZSkoMSwgMiwgMyk7IC8vPT4gWzIsIDEsIDNdXG4gKiBAc3ltYiBSLmZsaXAoZikoYSwgYiwgYykgPSBmKGIsIGEsIGMpXG4gKi9cblxudmFyIGZsaXAgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiBmbGlwKGZuKSB7XG4gIHJldHVybiBjdXJyeU4oZm4ubGVuZ3RoLCBmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgICBhcmdzWzBdID0gYjtcbiAgICBhcmdzWzFdID0gYTtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncyk7XG4gIH0pO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZsaXA7IiwiaW1wb3J0IF9jaGVja0Zvck1ldGhvZCBmcm9tIFwiLi9pbnRlcm5hbC9fY2hlY2tGb3JNZXRob2QuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbi8qKlxuICogSXRlcmF0ZSBvdmVyIGFuIGlucHV0IGBsaXN0YCwgY2FsbGluZyBhIHByb3ZpZGVkIGZ1bmN0aW9uIGBmbmAgZm9yIGVhY2hcbiAqIGVsZW1lbnQgaW4gdGhlIGxpc3QuXG4gKlxuICogYGZuYCByZWNlaXZlcyBvbmUgYXJndW1lbnQ6ICoodmFsdWUpKi5cbiAqXG4gKiBOb3RlOiBgUi5mb3JFYWNoYCBkb2VzIG5vdCBza2lwIGRlbGV0ZWQgb3IgdW5hc3NpZ25lZCBpbmRpY2VzIChzcGFyc2VcbiAqIGFycmF5cyksIHVubGlrZSB0aGUgbmF0aXZlIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kLiBGb3IgbW9yZVxuICogZGV0YWlscyBvbiB0aGlzIGJlaGF2aW9yLCBzZWU6XG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9mb3JFYWNoI0Rlc2NyaXB0aW9uXG4gKlxuICogQWxzbyBub3RlIHRoYXQsIHVubGlrZSBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgLCBSYW1kYSdzIGBmb3JFYWNoYCByZXR1cm5zXG4gKiB0aGUgb3JpZ2luYWwgYXJyYXkuIEluIHNvbWUgbGlicmFyaWVzIHRoaXMgZnVuY3Rpb24gaXMgbmFtZWQgYGVhY2hgLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBmb3JFYWNoYCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjFcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+ICopIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuIFJlY2VpdmVzIG9uZSBhcmd1bWVudCwgYHZhbHVlYC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBvcmlnaW5hbCBsaXN0LlxuICogQHNlZSBSLmFkZEluZGV4XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgcHJpbnRYUGx1c0ZpdmUgPSB4ID0+IGNvbnNvbGUubG9nKHggKyA1KTtcbiAqICAgICAgUi5mb3JFYWNoKHByaW50WFBsdXNGaXZlLCBbMSwgMiwgM10pOyAvLz0+IFsxLCAyLCAzXVxuICogICAgICAvLyBsb2dzIDZcbiAqICAgICAgLy8gbG9ncyA3XG4gKiAgICAgIC8vIGxvZ3MgOFxuICogQHN5bWIgUi5mb3JFYWNoKGYsIFthLCBiLCBjXSkgPSBbYSwgYiwgY11cbiAqL1xuXG52YXIgZm9yRWFjaCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKFxuLyojX19QVVJFX18qL1xuX2NoZWNrRm9yTWV0aG9kKCdmb3JFYWNoJywgZnVuY3Rpb24gZm9yRWFjaChmbiwgbGlzdCkge1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gIHZhciBpZHggPSAwO1xuXG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBmbihsaXN0W2lkeF0pO1xuICAgIGlkeCArPSAxO1xuICB9XG5cbiAgcmV0dXJuIGxpc3Q7XG59KSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZvckVhY2g7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGtleXMgZnJvbSBcIi4va2V5cy5qc1wiO1xuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gaW5wdXQgYG9iamVjdGAsIGNhbGxpbmcgYSBwcm92aWRlZCBmdW5jdGlvbiBgZm5gIGZvciBlYWNoXG4gKiBrZXkgYW5kIHZhbHVlIGluIHRoZSBvYmplY3QuXG4gKlxuICogYGZuYCByZWNlaXZlcyB0aHJlZSBhcmd1bWVudDogKih2YWx1ZSwga2V5LCBvYmopKi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yMy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnICgoYSwgU3RyaW5nLCBTdHJNYXAgYSkgLT4gQW55KSAtPiBTdHJNYXAgYSAtPiBTdHJNYXAgYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGludm9rZS4gUmVjZWl2ZXMgdGhyZWUgYXJndW1lbnQsIGB2YWx1ZWAsIGBrZXlgLCBgb2JqYC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBvcmlnaW5hbCBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgcHJpbnRLZXlDb25jYXRWYWx1ZSA9ICh2YWx1ZSwga2V5KSA9PiBjb25zb2xlLmxvZyhrZXkgKyAnOicgKyB2YWx1ZSk7XG4gKiAgICAgIFIuZm9yRWFjaE9iakluZGV4ZWQocHJpbnRLZXlDb25jYXRWYWx1ZSwge3g6IDEsIHk6IDJ9KTsgLy89PiB7eDogMSwgeTogMn1cbiAqICAgICAgLy8gbG9ncyB4OjFcbiAqICAgICAgLy8gbG9ncyB5OjJcbiAqIEBzeW1iIFIuZm9yRWFjaE9iakluZGV4ZWQoZiwge3g6IGEsIHk6IGJ9KSA9IHt4OiBhLCB5OiBifVxuICovXG5cbnZhciBmb3JFYWNoT2JqSW5kZXhlZCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIGZvckVhY2hPYmpJbmRleGVkKGZuLCBvYmopIHtcbiAgdmFyIGtleUxpc3QgPSBrZXlzKG9iaik7XG4gIHZhciBpZHggPSAwO1xuXG4gIHdoaWxlIChpZHggPCBrZXlMaXN0Lmxlbmd0aCkge1xuICAgIHZhciBrZXkgPSBrZXlMaXN0W2lkeF07XG4gICAgZm4ob2JqW2tleV0sIGtleSwgb2JqKTtcbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZm9yRWFjaE9iakluZGV4ZWQ7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG9iamVjdCBmcm9tIGEgbGlzdCBrZXktdmFsdWUgcGFpcnMuIElmIGEga2V5IGFwcGVhcnMgaW5cbiAqIG11bHRpcGxlIHBhaXJzLCB0aGUgcmlnaHRtb3N0IHBhaXIgaXMgaW5jbHVkZWQgaW4gdGhlIG9iamVjdC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4zLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFtbayx2XV0gLT4ge2s6IHZ9XG4gKiBAcGFyYW0ge0FycmF5fSBwYWlycyBBbiBhcnJheSBvZiB0d28tZWxlbWVudCBhcnJheXMgdGhhdCB3aWxsIGJlIHRoZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdGhlIG91dHB1dCBvYmplY3QuXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBvYmplY3QgbWFkZSBieSBwYWlyaW5nIHVwIGBrZXlzYCBhbmQgYHZhbHVlc2AuXG4gKiBAc2VlIFIudG9QYWlycywgUi5wYWlyXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5mcm9tUGFpcnMoW1snYScsIDFdLCBbJ2InLCAyXSwgWydjJywgM11dKTsgLy89PiB7YTogMSwgYjogMiwgYzogM31cbiAqL1xuXG52YXIgZnJvbVBhaXJzID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoZnVuY3Rpb24gZnJvbVBhaXJzKHBhaXJzKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgdmFyIGlkeCA9IDA7XG5cbiAgd2hpbGUgKGlkeCA8IHBhaXJzLmxlbmd0aCkge1xuICAgIHJlc3VsdFtwYWlyc1tpZHhdWzBdXSA9IHBhaXJzW2lkeF1bMV07XG4gICAgaWR4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZyb21QYWlyczsiLCJpbXBvcnQgX2NoZWNrRm9yTWV0aG9kIGZyb20gXCIuL2ludGVybmFsL19jaGVja0Zvck1ldGhvZC5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IHJlZHVjZUJ5IGZyb20gXCIuL3JlZHVjZUJ5LmpzXCI7XG4vKipcbiAqIFNwbGl0cyBhIGxpc3QgaW50byBzdWItbGlzdHMgc3RvcmVkIGluIGFuIG9iamVjdCwgYmFzZWQgb24gdGhlIHJlc3VsdCBvZlxuICogY2FsbGluZyBhIGtleS1yZXR1cm5pbmcgZnVuY3Rpb24gb24gZWFjaCBlbGVtZW50LCBhbmQgZ3JvdXBpbmcgdGhlXG4gKiByZXN1bHRzIGFjY29yZGluZyB0byB2YWx1ZXMgcmV0dXJuZWQuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGdyb3VwQnlgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50IHwgU3ltYm9sXG4gKiBAc2lnIElkeCBhID0+IChiIC0+IGEpIC0+IFtiXSAtPiB7YTogW2JdfVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gOjogYSAtPiBJZHhcbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGdyb3VwXG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCB3aXRoIHRoZSBvdXRwdXQgb2YgYGZuYCBmb3Iga2V5cywgbWFwcGVkIHRvIGFycmF5cyBvZiBlbGVtZW50c1xuICogICAgICAgICB0aGF0IHByb2R1Y2VkIHRoYXQga2V5IHdoZW4gcGFzc2VkIHRvIGBmbmAuXG4gKiBAc2VlIFIucmVkdWNlQnksIFIudHJhbnNkdWNlLCBSLmluZGV4QnksIFIuY29sbGVjdEJ5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgYnlHcmFkZSA9IFIuZ3JvdXBCeShmdW5jdGlvbihzdHVkZW50KSB7XG4gKiAgICAgICAgY29uc3Qgc2NvcmUgPSBzdHVkZW50LnNjb3JlO1xuICogICAgICAgIHJldHVybiBzY29yZSA8IDY1ID8gJ0YnIDpcbiAqICAgICAgICAgICAgICAgc2NvcmUgPCA3MCA/ICdEJyA6XG4gKiAgICAgICAgICAgICAgIHNjb3JlIDwgODAgPyAnQycgOlxuICogICAgICAgICAgICAgICBzY29yZSA8IDkwID8gJ0InIDogJ0EnO1xuICogICAgICB9KTtcbiAqICAgICAgY29uc3Qgc3R1ZGVudHMgPSBbe25hbWU6ICdBYmJ5Jywgc2NvcmU6IDg0fSxcbiAqICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOiAnRWRkeScsIHNjb3JlOiA1OH0sXG4gKiAgICAgICAgICAgICAgICAgICAgICAvLyAuLi5cbiAqICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOiAnSmFjaycsIHNjb3JlOiA2OX1dO1xuICogICAgICBieUdyYWRlKHN0dWRlbnRzKTtcbiAqICAgICAgLy8ge1xuICogICAgICAvLyAgICdBJzogW3tuYW1lOiAnRGlhbm5lJywgc2NvcmU6IDk5fV0sXG4gKiAgICAgIC8vICAgJ0InOiBbe25hbWU6ICdBYmJ5Jywgc2NvcmU6IDg0fV1cbiAqICAgICAgLy8gICAvLyAuLi4sXG4gKiAgICAgIC8vICAgJ0YnOiBbe25hbWU6ICdFZGR5Jywgc2NvcmU6IDU4fV1cbiAqICAgICAgLy8gfVxuICovXG5cbnZhciBncm91cEJ5ID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoXG4vKiNfX1BVUkVfXyovXG5fY2hlY2tGb3JNZXRob2QoJ2dyb3VwQnknLFxuLyojX19QVVJFX18qL1xucmVkdWNlQnkoZnVuY3Rpb24gKGFjYywgaXRlbSkge1xuICBhY2MucHVzaChpdGVtKTtcbiAgcmV0dXJuIGFjYztcbn0sIFtdKSkpO1xuXG5leHBvcnQgZGVmYXVsdCBncm91cEJ5OyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbi8qKlxuICogVGFrZXMgYSBsaXN0IGFuZCByZXR1cm5zIGEgbGlzdCBvZiBsaXN0cyB3aGVyZSBlYWNoIHN1Ymxpc3QncyBlbGVtZW50cyBhcmVcbiAqIGFsbCBzYXRpc2ZpZWQgcGFpcndpc2UgY29tcGFyaXNvbiBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLlxuICogT25seSBhZGphY2VudCBlbGVtZW50cyBhcmUgcGFzc2VkIHRvIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIxLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICgoYSwgYSkg4oaSIEJvb2xlYW4pIOKGkiBbYV0g4oaSIFtbYV1dXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciB0d28gZ2l2ZW4gKGFkamFjZW50KVxuICogICAgICAgIGVsZW1lbnRzIHNob3VsZCBiZSBpbiB0aGUgc2FtZSBncm91cFxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gZ3JvdXAuIEFsc28gYWNjZXB0cyBhIHN0cmluZywgd2hpY2ggd2lsbCBiZVxuICogICAgICAgIHRyZWF0ZWQgYXMgYSBsaXN0IG9mIGNoYXJhY3RlcnMuXG4gKiBAcmV0dXJuIHtMaXN0fSBBIGxpc3QgdGhhdCBjb250YWlucyBzdWJsaXN0cyBvZiBlbGVtZW50cyxcbiAqICAgICAgICAgd2hvc2UgY29uY2F0ZW5hdGlvbnMgYXJlIGVxdWFsIHRvIHRoZSBvcmlnaW5hbCBsaXN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiBSLmdyb3VwV2l0aChSLmVxdWFscywgWzAsIDEsIDEsIDIsIDMsIDUsIDgsIDEzLCAyMV0pXG4gKiAvLz0+IFtbMF0sIFsxLCAxXSwgWzJdLCBbM10sIFs1XSwgWzhdLCBbMTNdLCBbMjFdXVxuICpcbiAqIFIuZ3JvdXBXaXRoKChhLCBiKSA9PiBhICsgMSA9PT0gYiwgWzAsIDEsIDEsIDIsIDMsIDUsIDgsIDEzLCAyMV0pXG4gKiAvLz0+IFtbMCwgMV0sIFsxLCAyLCAzXSwgWzVdLCBbOF0sIFsxM10sIFsyMV1dXG4gKlxuICogUi5ncm91cFdpdGgoKGEsIGIpID0+IGEgJSAyID09PSBiICUgMiwgWzAsIDEsIDEsIDIsIDMsIDUsIDgsIDEzLCAyMV0pXG4gKiAvLz0+IFtbMF0sIFsxLCAxXSwgWzJdLCBbMywgNV0sIFs4XSwgWzEzLCAyMV1dXG4gKlxuICogY29uc3QgaXNWb3dlbCA9IFIudGVzdCgvXlthZWlvdV0kL2kpO1xuICogUi5ncm91cFdpdGgoUi5lcUJ5KGlzVm93ZWwpLCAnYWVzdGlvdScpXG4gKiAvLz0+IFsnYWUnLCAnc3QnLCAnaW91J11cbiAqL1xuXG52YXIgZ3JvdXBXaXRoID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gKGZuLCBsaXN0KSB7XG4gIHZhciByZXMgPSBbXTtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBsaXN0Lmxlbmd0aDtcblxuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgdmFyIG5leHRpZHggPSBpZHggKyAxO1xuXG4gICAgd2hpbGUgKG5leHRpZHggPCBsZW4gJiYgZm4obGlzdFtuZXh0aWR4IC0gMV0sIGxpc3RbbmV4dGlkeF0pKSB7XG4gICAgICBuZXh0aWR4ICs9IDE7XG4gICAgfVxuXG4gICAgcmVzLnB1c2gobGlzdC5zbGljZShpZHgsIG5leHRpZHgpKTtcbiAgICBpZHggPSBuZXh0aWR4O1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBncm91cFdpdGg7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQ7IGBmYWxzZWBcbiAqIG90aGVyd2lzZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBPcmQgYSA9PiBhIC0+IGEgLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSBhXG4gKiBAcGFyYW0geyp9IGJcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAc2VlIFIubHRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmd0KDIsIDEpOyAvLz0+IHRydWVcbiAqICAgICAgUi5ndCgyLCAyKTsgLy89PiBmYWxzZVxuICogICAgICBSLmd0KDIsIDMpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuZ3QoJ2EnLCAneicpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuZ3QoJ3onLCAnYScpOyAvLz0+IHRydWVcbiAqL1xuXG52YXIgZ3QgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBndChhLCBiKSB7XG4gIHJldHVybiBhID4gYjtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBndDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlY29uZDtcbiAqIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIE9yZCBhID0+IGEgLT4gYSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge051bWJlcn0gYVxuICogQHBhcmFtIHtOdW1iZXJ9IGJcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAc2VlIFIubHRlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5ndGUoMiwgMSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmd0ZSgyLCAyKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuZ3RlKDIsIDMpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuZ3RlKCdhJywgJ3onKTsgLy89PiBmYWxzZVxuICogICAgICBSLmd0ZSgneicsICdhJyk7IC8vPT4gdHJ1ZVxuICovXG5cbnZhciBndGUgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBndGUoYSwgYikge1xuICByZXR1cm4gYSA+PSBiO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGd0ZTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgaGFzUGF0aCBmcm9tIFwiLi9oYXNQYXRoLmpzXCI7XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgYW4gb2JqZWN0IGhhcyBhbiBvd24gcHJvcGVydHkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWVcbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC43LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgcyAtPiB7czogeH0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtTdHJpbmd9IHByb3AgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNoZWNrIGZvci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IFdoZXRoZXIgdGhlIHByb3BlcnR5IGV4aXN0cy5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBoYXNOYW1lID0gUi5oYXMoJ25hbWUnKTtcbiAqICAgICAgaGFzTmFtZSh7bmFtZTogJ2FsaWNlJ30pOyAgIC8vPT4gdHJ1ZVxuICogICAgICBoYXNOYW1lKHtuYW1lOiAnYm9iJ30pOyAgICAgLy89PiB0cnVlXG4gKiAgICAgIGhhc05hbWUoe30pOyAgICAgICAgICAgICAgICAvLz0+IGZhbHNlXG4gKlxuICogICAgICBjb25zdCBwb2ludCA9IHt4OiAwLCB5OiAwfTtcbiAqICAgICAgY29uc3QgcG9pbnRIYXMgPSBSLmhhcyhSLl9fLCBwb2ludCk7XG4gKiAgICAgIHBvaW50SGFzKCd4Jyk7ICAvLz0+IHRydWVcbiAqICAgICAgcG9pbnRIYXMoJ3knKTsgIC8vPT4gdHJ1ZVxuICogICAgICBwb2ludEhhcygneicpOyAgLy89PiBmYWxzZVxuICovXG5cbnZhciBoYXMgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBoYXMocHJvcCwgb2JqKSB7XG4gIHJldHVybiBoYXNQYXRoKFtwcm9wXSwgb2JqKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBoYXM7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGlzTmlsIGZyb20gXCIuL2lzTmlsLmpzXCI7XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgYW4gb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4gaGFzIGEgcHJvcGVydHkgd2l0aFxuICogdGhlIHNwZWNpZmllZCBuYW1lXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHMgLT4ge3M6IHh9IC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjaGVjayBmb3IuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBleGlzdHMuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgZnVuY3Rpb24gUmVjdGFuZ2xlKHdpZHRoLCBoZWlnaHQpIHtcbiAqICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gKiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gKiAgICAgIH1cbiAqICAgICAgUmVjdGFuZ2xlLnByb3RvdHlwZS5hcmVhID0gZnVuY3Rpb24oKSB7XG4gKiAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggKiB0aGlzLmhlaWdodDtcbiAqICAgICAgfTtcbiAqXG4gKiAgICAgIGNvbnN0IHNxdWFyZSA9IG5ldyBSZWN0YW5nbGUoMiwgMik7XG4gKiAgICAgIFIuaGFzSW4oJ3dpZHRoJywgc3F1YXJlKTsgIC8vPT4gdHJ1ZVxuICogICAgICBSLmhhc0luKCdhcmVhJywgc3F1YXJlKTsgIC8vPT4gdHJ1ZVxuICovXG5cbnZhciBoYXNJbiA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIGhhc0luKHByb3AsIG9iaikge1xuICBpZiAoaXNOaWwob2JqKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBwcm9wIGluIG9iajtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBoYXNJbjsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2hhcyBmcm9tIFwiLi9pbnRlcm5hbC9faGFzLmpzXCI7XG5pbXBvcnQgaXNOaWwgZnJvbSBcIi4vaXNOaWwuanNcIjtcbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhIHBhdGggZXhpc3RzIGluIGFuIG9iamVjdC4gT25seSB0aGUgb2JqZWN0J3NcbiAqIG93biBwcm9wZXJ0aWVzIGFyZSBjaGVja2VkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgW0lkeF0gLT4ge2F9IC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gdXNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNoZWNrIHRoZSBwYXRoIGluLlxuICogQHJldHVybiB7Qm9vbGVhbn0gV2hldGhlciB0aGUgcGF0aCBleGlzdHMuXG4gKiBAc2VlIFIuaGFzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5oYXNQYXRoKFsnYScsICdiJ10sIHthOiB7YjogMn19KTsgICAgICAgICAvLyA9PiB0cnVlXG4gKiAgICAgIFIuaGFzUGF0aChbJ2EnLCAnYiddLCB7YToge2I6IHVuZGVmaW5lZH19KTsgLy8gPT4gdHJ1ZVxuICogICAgICBSLmhhc1BhdGgoWydhJywgJ2InXSwge2E6IHtjOiAyfX0pOyAgICAgICAgIC8vID0+IGZhbHNlXG4gKiAgICAgIFIuaGFzUGF0aChbJ2EnLCAnYiddLCB7fSk7ICAgICAgICAgICAgICAgICAgLy8gPT4gZmFsc2VcbiAqL1xuXG52YXIgaGFzUGF0aCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIGhhc1BhdGgoX3BhdGgsIG9iaikge1xuICBpZiAoX3BhdGgubGVuZ3RoID09PSAwIHx8IGlzTmlsKG9iaikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdmFsID0gb2JqO1xuICB2YXIgaWR4ID0gMDtcblxuICB3aGlsZSAoaWR4IDwgX3BhdGgubGVuZ3RoKSB7XG4gICAgaWYgKCFpc05pbCh2YWwpICYmIF9oYXMoX3BhdGhbaWR4XSwgdmFsKSkge1xuICAgICAgdmFsID0gdmFsW19wYXRoW2lkeF1dO1xuICAgICAgaWR4ICs9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBoYXNQYXRoOyIsImltcG9ydCBudGggZnJvbSBcIi4vbnRoLmpzXCI7XG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGdpdmVuIGxpc3Qgb3Igc3RyaW5nLiBJbiBzb21lIGxpYnJhcmllc1xuICogdGhpcyBmdW5jdGlvbiBpcyBuYW1lZCBgZmlyc3RgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IGEgfCBVbmRlZmluZWRcbiAqIEBzaWcgU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IGxpc3RcbiAqIEByZXR1cm4geyp9XG4gKiBAc2VlIFIudGFpbCwgUi5pbml0LCBSLmxhc3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmhlYWQoWydmaScsICdmbycsICdmdW0nXSk7IC8vPT4gJ2ZpJ1xuICogICAgICBSLmhlYWQoW10pOyAvLz0+IHVuZGVmaW5lZFxuICpcbiAqICAgICAgUi5oZWFkKCdhYmMnKTsgLy89PiAnYSdcbiAqICAgICAgUi5oZWFkKCcnKTsgLy89PiAnJ1xuICovXG5cbnZhciBoZWFkID1cbi8qI19fUFVSRV9fKi9cbm50aCgwKTtcbmV4cG9ydCBkZWZhdWx0IGhlYWQ7IiwiaW1wb3J0IF9vYmplY3RJcyBmcm9tIFwiLi9pbnRlcm5hbC9fb2JqZWN0SXMuanNcIjtcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGl0cyBhcmd1bWVudHMgYXJlIGlkZW50aWNhbCwgZmFsc2Ugb3RoZXJ3aXNlLiBWYWx1ZXMgYXJlXG4gKiBpZGVudGljYWwgaWYgdGhleSByZWZlcmVuY2UgdGhlIHNhbWUgbWVtb3J5LiBgTmFOYCBpcyBpZGVudGljYWwgdG8gYE5hTmA7XG4gKiBgMGAgYW5kIGAtMGAgYXJlIG5vdCBpZGVudGljYWwuXG4gKlxuICogTm90ZSB0aGlzIGlzIG1lcmVseSBhIGN1cnJpZWQgdmVyc2lvbiBvZiBFUzYgYE9iamVjdC5pc2AuXG4gKlxuICogYGlkZW50aWNhbGAgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYF9fYCBwbGFjZWhvbGRlci5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgYSAtPiBhIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IG8gPSB7fTtcbiAqICAgICAgUi5pZGVudGljYWwobywgbyk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlkZW50aWNhbCgxLCAxKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaWRlbnRpY2FsKDEsICcxJyk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5pZGVudGljYWwoW10sIFtdKTsgLy89PiBmYWxzZVxuICogICAgICBSLmlkZW50aWNhbCgwLCAtMCk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5pZGVudGljYWwoTmFOLCBOYU4pOyAvLz0+IHRydWVcbiAqL1xuXG52YXIgaWRlbnRpY2FsID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIGlkZW50aWNhbDtcblxuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiB1bmFyeUlkZW50aWNhbChfYikge1xuICAgICAgICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICByZXR1cm4gdW5hcnlJZGVudGljYWw7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBfb2JqZWN0SXMoYSwgX2IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0oKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gX29iamVjdElzKGEsIGIpO1xuICB9XG59OyAvLyBJbiBvcmRlciB0byBzdXBwb3J0IENyb3NzLW9yaWdpbiBXaW5kb3cgb2JqZWN0cyBhcyBhcmd1bWVudHMgdG8gaWRlbnRpY2FsLFxuLy8gaXQgY2Fubm90IGJlIGltcGxlbWVudGVkIGFzIF9jdXJyeTIoX29iamVjdElzKS5cbi8vIFRoZSByZWFzb24gaXMgdGhhdCBfY3VycnkyIGNoZWNrcyBpZiBhIGZ1bmN0aW9uIGFyZ3VtZW50IGlzIHRoZSBwbGFjZWhvbGRlciBfX1xuLy8gYnkgYWNjZXNzaW5nIGEgcGFyaXRjdWxhciBwcm9wZXJ0eS4gSG93ZXZlciwgYWNyb3NzIFVSTCBvcmlnaW5zIGFjY2Vzc1xuLy8gdG8gbW9zdCBwcm9wZXJ0aWVzIG9mIFdpbmRvdyBpcyBmb3JiaWRkZW4uXG5cblxuZXhwb3J0IGRlZmF1bHQgaWRlbnRpY2FsOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaWRlbnRpdHkgZnJvbSBcIi4vaW50ZXJuYWwvX2lkZW50aXR5LmpzXCI7XG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdGhpbmcgYnV0IHJldHVybiB0aGUgcGFyYW1ldGVyIHN1cHBsaWVkIHRvIGl0LiBHb29kXG4gKiBhcyBhIGRlZmF1bHQgb3IgcGxhY2Vob2xkZXIgZnVuY3Rpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgYSAtPiBhXG4gKiBAcGFyYW0geyp9IHggVGhlIHZhbHVlIHRvIHJldHVybi5cbiAqIEByZXR1cm4geyp9IFRoZSBpbnB1dCB2YWx1ZSwgYHhgLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaWRlbnRpdHkoMSk7IC8vPT4gMVxuICpcbiAqICAgICAgY29uc3Qgb2JqID0ge307XG4gKiAgICAgIFIuaWRlbnRpdHkob2JqKSA9PT0gb2JqOyAvLz0+IHRydWVcbiAqIEBzeW1iIFIuaWRlbnRpdHkoYSkgPSBhXG4gKi9cblxudmFyIGlkZW50aXR5ID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoX2lkZW50aXR5KTtcblxuZXhwb3J0IGRlZmF1bHQgaWRlbnRpdHk7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IGN1cnJ5TiBmcm9tIFwiLi9jdXJyeU4uanNcIjtcbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBwcm9jZXNzIGVpdGhlciB0aGUgYG9uVHJ1ZWAgb3IgdGhlIGBvbkZhbHNlYFxuICogZnVuY3Rpb24gZGVwZW5kaW5nIHVwb24gdGhlIHJlc3VsdCBvZiB0aGUgYGNvbmRpdGlvbmAgcHJlZGljYXRlLlxuICpcbiAqIE5vdGUgdGhhdCBgaWZFbHNlYCB0YWtlcyBpdHMgYXJpdHkgZnJvbSB0aGUgbG9uZ2VzdCBvZiB0aGUgdGhyZWUgZnVuY3Rpb25zIHBhc3NlZCB0byBpdC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC44LjBcbiAqIEBjYXRlZ29yeSBMb2dpY1xuICogQHNpZyAoKi4uLiAtPiBCb29sZWFuKSAtPiAoKi4uLiAtPiAqKSAtPiAoKi4uLiAtPiAqKSAtPiAoKi4uLiAtPiAqKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29uZGl0aW9uIEEgcHJlZGljYXRlIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblRydWUgQSBmdW5jdGlvbiB0byBpbnZva2Ugd2hlbiB0aGUgYGNvbmRpdGlvbmAgZXZhbHVhdGVzIHRvIGEgdHJ1dGh5IHZhbHVlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gb25GYWxzZSBBIGZ1bmN0aW9uIHRvIGludm9rZSB3aGVuIHRoZSBgY29uZGl0aW9uYCBldmFsdWF0ZXMgdG8gYSBmYWxzeSB2YWx1ZS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG5ldyBmdW5jdGlvbiB0aGF0IHdpbGwgcHJvY2VzcyBlaXRoZXIgdGhlIGBvblRydWVgIG9yIHRoZSBgb25GYWxzZWBcbiAqICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkZXBlbmRpbmcgdXBvbiB0aGUgcmVzdWx0IG9mIHRoZSBgY29uZGl0aW9uYCBwcmVkaWNhdGUuXG4gKiBAc2VlIFIudW5sZXNzLCBSLndoZW4sIFIuY29uZFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGluY0NvdW50ID0gUi5pZkVsc2UoXG4gKiAgICAgICAgUi5oYXMoJ2NvdW50JyksXG4gKiAgICAgICAgUi5vdmVyKFIubGVuc1Byb3AoJ2NvdW50JyksIFIuaW5jKSxcbiAqICAgICAgICBSLmFzc29jKCdjb3VudCcsIDEpXG4gKiAgICAgICk7XG4gKiAgICAgIGluY0NvdW50KHsgY291bnQ6IDEgfSk7IC8vPT4geyBjb3VudDogMiB9XG4gKiAgICAgIGluY0NvdW50KHt9KTsgICAgICAgICAgIC8vPT4geyBjb3VudDogMSB9XG4gKi9cblxudmFyIGlmRWxzZSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIGlmRWxzZShjb25kaXRpb24sIG9uVHJ1ZSwgb25GYWxzZSkge1xuICByZXR1cm4gY3VycnlOKE1hdGgubWF4KGNvbmRpdGlvbi5sZW5ndGgsIG9uVHJ1ZS5sZW5ndGgsIG9uRmFsc2UubGVuZ3RoKSwgZnVuY3Rpb24gX2lmRWxzZSgpIHtcbiAgICByZXR1cm4gY29uZGl0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgPyBvblRydWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IG9uRmFsc2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgaWZFbHNlOyIsImltcG9ydCBhZGQgZnJvbSBcIi4vYWRkLmpzXCI7XG4vKipcbiAqIEluY3JlbWVudHMgaXRzIGFyZ3VtZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjkuMFxuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBzaWcgTnVtYmVyIC0+IE51bWJlclxuICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAqIEByZXR1cm4ge051bWJlcn0gbiArIDFcbiAqIEBzZWUgUi5kZWNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmluYyg0Mik7IC8vPT4gNDNcbiAqL1xuXG52YXIgaW5jID1cbi8qI19fUFVSRV9fKi9cbmFkZCgxKTtcbmV4cG9ydCBkZWZhdWx0IGluYzsiLCJpbXBvcnQgX2luY2x1ZGVzIGZyb20gXCIuL2ludGVybmFsL19pbmNsdWRlcy5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGVxdWFsLCBpbiBbYFIuZXF1YWxzYF0oI2VxdWFscylcbiAqIHRlcm1zLCB0byBhdCBsZWFzdCBvbmUgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gbGlzdDsgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBBbHNvIHdvcmtzIHdpdGggc3RyaW5ncy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yNi4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IFthXSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge09iamVjdH0gYSBUaGUgaXRlbSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiBhbiBlcXVpdmFsZW50IGl0ZW0gaXMgaW4gdGhlIGxpc3QsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQHNlZSBSLmFueVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaW5jbHVkZXMoMywgWzEsIDIsIDNdKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaW5jbHVkZXMoNCwgWzEsIDIsIDNdKTsgLy89PiBmYWxzZVxuICogICAgICBSLmluY2x1ZGVzKHsgbmFtZTogJ0ZyZWQnIH0sIFt7IG5hbWU6ICdGcmVkJyB9XSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmluY2x1ZGVzKFs0Ml0sIFtbNDJdXSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmluY2x1ZGVzKCdiYScsICdiYW5hbmEnKTsgLy89PnRydWVcbiAqL1xuXG52YXIgaW5jbHVkZXMgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihfaW5jbHVkZXMpO1xuXG5leHBvcnQgZGVmYXVsdCBpbmNsdWRlczsiLCJleHBvcnQgeyBkZWZhdWx0IGFzIEYgfSBmcm9tIFwiLi9GLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFQgfSBmcm9tIFwiLi9ULmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIF9fIH0gZnJvbSBcIi4vX18uanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWRkIH0gZnJvbSBcIi4vYWRkLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGFkZEluZGV4IH0gZnJvbSBcIi4vYWRkSW5kZXguanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWRkSW5kZXhSaWdodCB9IGZyb20gXCIuL2FkZEluZGV4UmlnaHQuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWRqdXN0IH0gZnJvbSBcIi4vYWRqdXN0LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGFsbCB9IGZyb20gXCIuL2FsbC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhbGxQYXNzIH0gZnJvbSBcIi4vYWxsUGFzcy5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhbHdheXMgfSBmcm9tIFwiLi9hbHdheXMuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYW5kIH0gZnJvbSBcIi4vYW5kLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGFueSB9IGZyb20gXCIuL2FueS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhbnlQYXNzIH0gZnJvbSBcIi4vYW55UGFzcy5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhcCB9IGZyb20gXCIuL2FwLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGFwZXJ0dXJlIH0gZnJvbSBcIi4vYXBlcnR1cmUuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXBwZW5kIH0gZnJvbSBcIi4vYXBwZW5kLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGFwcGx5IH0gZnJvbSBcIi4vYXBwbHkuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXBwbHlTcGVjIH0gZnJvbSBcIi4vYXBwbHlTcGVjLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGFwcGx5VG8gfSBmcm9tIFwiLi9hcHBseVRvLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGFzY2VuZCB9IGZyb20gXCIuL2FzY2VuZC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhc3NvYyB9IGZyb20gXCIuL2Fzc29jLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGFzc29jUGF0aCB9IGZyb20gXCIuL2Fzc29jUGF0aC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBiaW5hcnkgfSBmcm9tIFwiLi9iaW5hcnkuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYmluZCB9IGZyb20gXCIuL2JpbmQuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYm90aCB9IGZyb20gXCIuL2JvdGguanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY2FsbCB9IGZyb20gXCIuL2NhbGwuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY2hhaW4gfSBmcm9tIFwiLi9jaGFpbi5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjbGFtcCB9IGZyb20gXCIuL2NsYW1wLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGNsb25lIH0gZnJvbSBcIi4vY2xvbmUuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY29sbGVjdEJ5IH0gZnJvbSBcIi4vY29sbGVjdEJ5LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGNvbXBhcmF0b3IgfSBmcm9tIFwiLi9jb21wYXJhdG9yLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGNvbXBsZW1lbnQgfSBmcm9tIFwiLi9jb21wbGVtZW50LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGNvbXBvc2UgfSBmcm9tIFwiLi9jb21wb3NlLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGNvbXBvc2VXaXRoIH0gZnJvbSBcIi4vY29tcG9zZVdpdGguanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY29uY2F0IH0gZnJvbSBcIi4vY29uY2F0LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGNvbmQgfSBmcm9tIFwiLi9jb25kLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGNvbnN0cnVjdCB9IGZyb20gXCIuL2NvbnN0cnVjdC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjb25zdHJ1Y3ROIH0gZnJvbSBcIi4vY29uc3RydWN0Ti5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjb252ZXJnZSB9IGZyb20gXCIuL2NvbnZlcmdlLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGNvdW50IH0gZnJvbSBcIi4vY291bnQuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY291bnRCeSB9IGZyb20gXCIuL2NvdW50QnkuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY3VycnkgfSBmcm9tIFwiLi9jdXJyeS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjdXJyeU4gfSBmcm9tIFwiLi9jdXJyeU4uanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZGVjIH0gZnJvbSBcIi4vZGVjLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGRlZmF1bHRUbyB9IGZyb20gXCIuL2RlZmF1bHRUby5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkZXNjZW5kIH0gZnJvbSBcIi4vZGVzY2VuZC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkaWZmZXJlbmNlIH0gZnJvbSBcIi4vZGlmZmVyZW5jZS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkaWZmZXJlbmNlV2l0aCB9IGZyb20gXCIuL2RpZmZlcmVuY2VXaXRoLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGRpc3NvYyB9IGZyb20gXCIuL2Rpc3NvYy5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkaXNzb2NQYXRoIH0gZnJvbSBcIi4vZGlzc29jUGF0aC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkaXZpZGUgfSBmcm9tIFwiLi9kaXZpZGUuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcCB9IGZyb20gXCIuL2Ryb3AuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcExhc3QgfSBmcm9tIFwiLi9kcm9wTGFzdC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkcm9wTGFzdFdoaWxlIH0gZnJvbSBcIi4vZHJvcExhc3RXaGlsZS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkcm9wUmVwZWF0cyB9IGZyb20gXCIuL2Ryb3BSZXBlYXRzLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGRyb3BSZXBlYXRzQnkgfSBmcm9tIFwiLi9kcm9wUmVwZWF0c0J5LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGRyb3BSZXBlYXRzV2l0aCB9IGZyb20gXCIuL2Ryb3BSZXBlYXRzV2l0aC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkcm9wV2hpbGUgfSBmcm9tIFwiLi9kcm9wV2hpbGUuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZWl0aGVyIH0gZnJvbSBcIi4vZWl0aGVyLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGVtcHR5IH0gZnJvbSBcIi4vZW1wdHkuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZW5kc1dpdGggfSBmcm9tIFwiLi9lbmRzV2l0aC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBlcUJ5IH0gZnJvbSBcIi4vZXFCeS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBlcVByb3BzIH0gZnJvbSBcIi4vZXFQcm9wcy5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBlcXVhbHMgfSBmcm9tIFwiLi9lcXVhbHMuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZXZvbHZlIH0gZnJvbSBcIi4vZXZvbHZlLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGZpbHRlciB9IGZyb20gXCIuL2ZpbHRlci5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kIH0gZnJvbSBcIi4vZmluZC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kSW5kZXggfSBmcm9tIFwiLi9maW5kSW5kZXguanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZmluZExhc3QgfSBmcm9tIFwiLi9maW5kTGFzdC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kTGFzdEluZGV4IH0gZnJvbSBcIi4vZmluZExhc3RJbmRleC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmbGF0dGVuIH0gZnJvbSBcIi4vZmxhdHRlbi5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmbGlwIH0gZnJvbSBcIi4vZmxpcC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmb3JFYWNoIH0gZnJvbSBcIi4vZm9yRWFjaC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmb3JFYWNoT2JqSW5kZXhlZCB9IGZyb20gXCIuL2ZvckVhY2hPYmpJbmRleGVkLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGZyb21QYWlycyB9IGZyb20gXCIuL2Zyb21QYWlycy5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBncm91cEJ5IH0gZnJvbSBcIi4vZ3JvdXBCeS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBncm91cFdpdGggfSBmcm9tIFwiLi9ncm91cFdpdGguanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZ3QgfSBmcm9tIFwiLi9ndC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBndGUgfSBmcm9tIFwiLi9ndGUuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaGFzIH0gZnJvbSBcIi4vaGFzLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGhhc0luIH0gZnJvbSBcIi4vaGFzSW4uanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaGFzUGF0aCB9IGZyb20gXCIuL2hhc1BhdGguanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaGVhZCB9IGZyb20gXCIuL2hlYWQuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaWRlbnRpY2FsIH0gZnJvbSBcIi4vaWRlbnRpY2FsLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlkZW50aXR5IH0gZnJvbSBcIi4vaWRlbnRpdHkuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaWZFbHNlIH0gZnJvbSBcIi4vaWZFbHNlLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGluYyB9IGZyb20gXCIuL2luYy5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpbmNsdWRlcyB9IGZyb20gXCIuL2luY2x1ZGVzLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGluZGV4QnkgfSBmcm9tIFwiLi9pbmRleEJ5LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGluZGV4T2YgfSBmcm9tIFwiLi9pbmRleE9mLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGluaXQgfSBmcm9tIFwiLi9pbml0LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlubmVySm9pbiB9IGZyb20gXCIuL2lubmVySm9pbi5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnNlcnQgfSBmcm9tIFwiLi9pbnNlcnQuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaW5zZXJ0QWxsIH0gZnJvbSBcIi4vaW5zZXJ0QWxsLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGludGVyc2VjdGlvbiB9IGZyb20gXCIuL2ludGVyc2VjdGlvbi5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnRlcnNwZXJzZSB9IGZyb20gXCIuL2ludGVyc3BlcnNlLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGludG8gfSBmcm9tIFwiLi9pbnRvLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGludmVydCB9IGZyb20gXCIuL2ludmVydC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnZlcnRPYmogfSBmcm9tIFwiLi9pbnZlcnRPYmouanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaW52b2tlciB9IGZyb20gXCIuL2ludm9rZXIuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXMgfSBmcm9tIFwiLi9pcy5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0VtcHR5IH0gZnJvbSBcIi4vaXNFbXB0eS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc05pbCB9IGZyb20gXCIuL2lzTmlsLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzTm90TmlsIH0gZnJvbSBcIi4vaXNOb3ROaWwuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgam9pbiB9IGZyb20gXCIuL2pvaW4uanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMganV4dCB9IGZyb20gXCIuL2p1eHQuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMga2V5cyB9IGZyb20gXCIuL2tleXMuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMga2V5c0luIH0gZnJvbSBcIi4va2V5c0luLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGxhc3QgfSBmcm9tIFwiLi9sYXN0LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGxhc3RJbmRleE9mIH0gZnJvbSBcIi4vbGFzdEluZGV4T2YuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbGVuZ3RoIH0gZnJvbSBcIi4vbGVuZ3RoLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGxlbnMgfSBmcm9tIFwiLi9sZW5zLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGxlbnNJbmRleCB9IGZyb20gXCIuL2xlbnNJbmRleC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBsZW5zUGF0aCB9IGZyb20gXCIuL2xlbnNQYXRoLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGxlbnNQcm9wIH0gZnJvbSBcIi4vbGVuc1Byb3AuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbGlmdCB9IGZyb20gXCIuL2xpZnQuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbGlmdE4gfSBmcm9tIFwiLi9saWZ0Ti5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBsdCB9IGZyb20gXCIuL2x0LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGx0ZSB9IGZyb20gXCIuL2x0ZS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXAgfSBmcm9tIFwiLi9tYXAuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbWFwQWNjdW0gfSBmcm9tIFwiLi9tYXBBY2N1bS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXBBY2N1bVJpZ2h0IH0gZnJvbSBcIi4vbWFwQWNjdW1SaWdodC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXBPYmpJbmRleGVkIH0gZnJvbSBcIi4vbWFwT2JqSW5kZXhlZC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXRjaCB9IGZyb20gXCIuL21hdGNoLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG1hdGhNb2QgfSBmcm9tIFwiLi9tYXRoTW9kLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG1heCB9IGZyb20gXCIuL21heC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXhCeSB9IGZyb20gXCIuL21heEJ5LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG1lYW4gfSBmcm9tIFwiLi9tZWFuLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG1lZGlhbiB9IGZyb20gXCIuL21lZGlhbi5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtZW1vaXplV2l0aCB9IGZyb20gXCIuL21lbW9pemVXaXRoLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlQWxsIH0gZnJvbSBcIi4vbWVyZ2VBbGwuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VEZWVwTGVmdCB9IGZyb20gXCIuL21lcmdlRGVlcExlZnQuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VEZWVwUmlnaHQgfSBmcm9tIFwiLi9tZXJnZURlZXBSaWdodC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZURlZXBXaXRoIH0gZnJvbSBcIi4vbWVyZ2VEZWVwV2l0aC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZURlZXBXaXRoS2V5IH0gZnJvbSBcIi4vbWVyZ2VEZWVwV2l0aEtleS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZUxlZnQgfSBmcm9tIFwiLi9tZXJnZUxlZnQuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VSaWdodCB9IGZyb20gXCIuL21lcmdlUmlnaHQuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VXaXRoIH0gZnJvbSBcIi4vbWVyZ2VXaXRoLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlV2l0aEtleSB9IGZyb20gXCIuL21lcmdlV2l0aEtleS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtaW4gfSBmcm9tIFwiLi9taW4uanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbWluQnkgfSBmcm9tIFwiLi9taW5CeS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtb2RpZnkgfSBmcm9tIFwiLi9tb2RpZnkuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbW9kaWZ5UGF0aCB9IGZyb20gXCIuL21vZGlmeVBhdGguanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbW9kdWxvIH0gZnJvbSBcIi4vbW9kdWxvLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG1vdmUgfSBmcm9tIFwiLi9tb3ZlLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG11bHRpcGx5IH0gZnJvbSBcIi4vbXVsdGlwbHkuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbkFyeSB9IGZyb20gXCIuL25BcnkuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcGFydGlhbE9iamVjdCB9IGZyb20gXCIuL3BhcnRpYWxPYmplY3QuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbmVnYXRlIH0gZnJvbSBcIi4vbmVnYXRlLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG5vbmUgfSBmcm9tIFwiLi9ub25lLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG5vdCB9IGZyb20gXCIuL25vdC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBudGggfSBmcm9tIFwiLi9udGguanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbnRoQXJnIH0gZnJvbSBcIi4vbnRoQXJnLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG8gfSBmcm9tIFwiLi9vLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG9iak9mIH0gZnJvbSBcIi4vb2JqT2YuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgb2YgfSBmcm9tIFwiLi9vZi5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBvbWl0IH0gZnJvbSBcIi4vb21pdC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBvbiB9IGZyb20gXCIuL29uLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG9uY2UgfSBmcm9tIFwiLi9vbmNlLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG9yIH0gZnJvbSBcIi4vb3IuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgb3RoZXJ3aXNlIH0gZnJvbSBcIi4vb3RoZXJ3aXNlLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG92ZXIgfSBmcm9tIFwiLi9vdmVyLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHBhaXIgfSBmcm9tIFwiLi9wYWlyLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHBhcnRpYWwgfSBmcm9tIFwiLi9wYXJ0aWFsLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHBhcnRpYWxSaWdodCB9IGZyb20gXCIuL3BhcnRpYWxSaWdodC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJ0aXRpb24gfSBmcm9tIFwiLi9wYXJ0aXRpb24uanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcGF0aCB9IGZyb20gXCIuL3BhdGguanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcGF0aHMgfSBmcm9tIFwiLi9wYXRocy5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXRoRXEgfSBmcm9tIFwiLi9wYXRoRXEuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcGF0aE9yIH0gZnJvbSBcIi4vcGF0aE9yLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHBhdGhTYXRpc2ZpZXMgfSBmcm9tIFwiLi9wYXRoU2F0aXNmaWVzLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHBpY2sgfSBmcm9tIFwiLi9waWNrLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHBpY2tBbGwgfSBmcm9tIFwiLi9waWNrQWxsLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHBpY2tCeSB9IGZyb20gXCIuL3BpY2tCeS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwaXBlIH0gZnJvbSBcIi4vcGlwZS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwaXBlV2l0aCB9IGZyb20gXCIuL3BpcGVXaXRoLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHBsdWNrIH0gZnJvbSBcIi4vcGx1Y2suanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcHJlcGVuZCB9IGZyb20gXCIuL3ByZXBlbmQuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvZHVjdCB9IGZyb20gXCIuL3Byb2R1Y3QuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvamVjdCB9IGZyb20gXCIuL3Byb2plY3QuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvbWFwIH0gZnJvbSBcIi4vcHJvbWFwLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHByb3AgfSBmcm9tIFwiLi9wcm9wLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHByb3BFcSB9IGZyb20gXCIuL3Byb3BFcS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wSXMgfSBmcm9tIFwiLi9wcm9wSXMuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvcE9yIH0gZnJvbSBcIi4vcHJvcE9yLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHByb3BTYXRpc2ZpZXMgfSBmcm9tIFwiLi9wcm9wU2F0aXNmaWVzLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHByb3BzIH0gZnJvbSBcIi4vcHJvcHMuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcmFuZ2UgfSBmcm9tIFwiLi9yYW5nZS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByZWR1Y2UgfSBmcm9tIFwiLi9yZWR1Y2UuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlQnkgfSBmcm9tIFwiLi9yZWR1Y2VCeS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByZWR1Y2VSaWdodCB9IGZyb20gXCIuL3JlZHVjZVJpZ2h0LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHJlZHVjZVdoaWxlIH0gZnJvbSBcIi4vcmVkdWNlV2hpbGUuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlZCB9IGZyb20gXCIuL3JlZHVjZWQuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcmVqZWN0IH0gZnJvbSBcIi4vcmVqZWN0LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHJlbW92ZSB9IGZyb20gXCIuL3JlbW92ZS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByZXBlYXQgfSBmcm9tIFwiLi9yZXBlYXQuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcmVwbGFjZSB9IGZyb20gXCIuL3JlcGxhY2UuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcmV2ZXJzZSB9IGZyb20gXCIuL3JldmVyc2UuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc2NhbiB9IGZyb20gXCIuL3NjYW4uanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc2VxdWVuY2UgfSBmcm9tIFwiLi9zZXF1ZW5jZS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzZXQgfSBmcm9tIFwiLi9zZXQuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc2xpY2UgfSBmcm9tIFwiLi9zbGljZS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzb3J0IH0gZnJvbSBcIi4vc29ydC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzb3J0QnkgfSBmcm9tIFwiLi9zb3J0QnkuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc29ydFdpdGggfSBmcm9tIFwiLi9zb3J0V2l0aC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzcGxpdCB9IGZyb20gXCIuL3NwbGl0LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHNwbGl0QXQgfSBmcm9tIFwiLi9zcGxpdEF0LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHNwbGl0RXZlcnkgfSBmcm9tIFwiLi9zcGxpdEV2ZXJ5LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHNwbGl0V2hlbiB9IGZyb20gXCIuL3NwbGl0V2hlbi5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzcGxpdFdoZW5ldmVyIH0gZnJvbSBcIi4vc3BsaXRXaGVuZXZlci5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzdGFydHNXaXRoIH0gZnJvbSBcIi4vc3RhcnRzV2l0aC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzdWJ0cmFjdCB9IGZyb20gXCIuL3N1YnRyYWN0LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHN1bSB9IGZyb20gXCIuL3N1bS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzd2FwIH0gZnJvbSBcIi4vc3dhcC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzeW1tZXRyaWNEaWZmZXJlbmNlIH0gZnJvbSBcIi4vc3ltbWV0cmljRGlmZmVyZW5jZS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzeW1tZXRyaWNEaWZmZXJlbmNlV2l0aCB9IGZyb20gXCIuL3N5bW1ldHJpY0RpZmZlcmVuY2VXaXRoLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHRhaWwgfSBmcm9tIFwiLi90YWlsLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHRha2UgfSBmcm9tIFwiLi90YWtlLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHRha2VMYXN0IH0gZnJvbSBcIi4vdGFrZUxhc3QuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdGFrZUxhc3RXaGlsZSB9IGZyb20gXCIuL3Rha2VMYXN0V2hpbGUuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdGFrZVdoaWxlIH0gZnJvbSBcIi4vdGFrZVdoaWxlLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHRhcCB9IGZyb20gXCIuL3RhcC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0ZXN0IH0gZnJvbSBcIi4vdGVzdC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhbmRUaGVuIH0gZnJvbSBcIi4vYW5kVGhlbi5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0aW1lcyB9IGZyb20gXCIuL3RpbWVzLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHRvTG93ZXIgfSBmcm9tIFwiLi90b0xvd2VyLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHRvUGFpcnMgfSBmcm9tIFwiLi90b1BhaXJzLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHRvUGFpcnNJbiB9IGZyb20gXCIuL3RvUGFpcnNJbi5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b1N0cmluZyB9IGZyb20gXCIuL3RvU3RyaW5nLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHRvVXBwZXIgfSBmcm9tIFwiLi90b1VwcGVyLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHRyYW5zZHVjZSB9IGZyb20gXCIuL3RyYW5zZHVjZS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0cmFuc3Bvc2UgfSBmcm9tIFwiLi90cmFuc3Bvc2UuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdHJhdmVyc2UgfSBmcm9tIFwiLi90cmF2ZXJzZS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0cmltIH0gZnJvbSBcIi4vdHJpbS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0cnlDYXRjaCB9IGZyb20gXCIuL3RyeUNhdGNoLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHR5cGUgfSBmcm9tIFwiLi90eXBlLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHVuYXBwbHkgfSBmcm9tIFwiLi91bmFwcGx5LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHVuYXJ5IH0gZnJvbSBcIi4vdW5hcnkuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdW5jdXJyeU4gfSBmcm9tIFwiLi91bmN1cnJ5Ti5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmZvbGQgfSBmcm9tIFwiLi91bmZvbGQuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pb24gfSBmcm9tIFwiLi91bmlvbi5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmlvbldpdGggfSBmcm9tIFwiLi91bmlvbldpdGguanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pcSB9IGZyb20gXCIuL3VuaXEuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pcUJ5IH0gZnJvbSBcIi4vdW5pcUJ5LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHVuaXFXaXRoIH0gZnJvbSBcIi4vdW5pcVdpdGguanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdW5sZXNzIH0gZnJvbSBcIi4vdW5sZXNzLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHVubmVzdCB9IGZyb20gXCIuL3VubmVzdC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB1bnRpbCB9IGZyb20gXCIuL3VudGlsLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHVud2luZCB9IGZyb20gXCIuL3Vud2luZC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB1cGRhdGUgfSBmcm9tIFwiLi91cGRhdGUuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdXNlV2l0aCB9IGZyb20gXCIuL3VzZVdpdGguanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdmFsdWVzIH0gZnJvbSBcIi4vdmFsdWVzLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHZhbHVlc0luIH0gZnJvbSBcIi4vdmFsdWVzSW4uanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdmlldyB9IGZyb20gXCIuL3ZpZXcuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgd2hlbiB9IGZyb20gXCIuL3doZW4uanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgd2hlcmUgfSBmcm9tIFwiLi93aGVyZS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB3aGVyZUFueSB9IGZyb20gXCIuL3doZXJlQW55LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHdoZXJlRXEgfSBmcm9tIFwiLi93aGVyZUVxLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHdpdGhvdXQgfSBmcm9tIFwiLi93aXRob3V0LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHhvciB9IGZyb20gXCIuL3hvci5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB4cHJvZCB9IGZyb20gXCIuL3hwcm9kLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHppcCB9IGZyb20gXCIuL3ppcC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB6aXBPYmogfSBmcm9tIFwiLi96aXBPYmouanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgemlwV2l0aCB9IGZyb20gXCIuL3ppcFdpdGguanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdGh1bmtpZnkgfSBmcm9tIFwiLi90aHVua2lmeS5qc1wiOyIsImltcG9ydCByZWR1Y2VCeSBmcm9tIFwiLi9yZWR1Y2VCeS5qc1wiO1xuLyoqXG4gKiBHaXZlbiBhIGZ1bmN0aW9uIHRoYXQgZ2VuZXJhdGVzIGEga2V5LCB0dXJucyBhIGxpc3Qgb2Ygb2JqZWN0cyBpbnRvIGFuXG4gKiBvYmplY3QgaW5kZXhpbmcgdGhlIG9iamVjdHMgYnkgdGhlIGdpdmVuIGtleS4gTm90ZSB0aGF0IGlmIG11bHRpcGxlXG4gKiBvYmplY3RzIGdlbmVyYXRlIHRoZSBzYW1lIHZhbHVlIGZvciB0aGUgaW5kZXhpbmcga2V5IG9ubHkgdGhlIGxhc3QgdmFsdWVcbiAqIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCBvYmplY3QuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE5LjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50IHwgU3ltYm9sXG4gKiBAc2lnIElkeCBhID0+IChiIC0+IGEpIC0+IFtiXSAtPiB7YTogYn1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIDo6IGEgLT4gSWR4XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgb2Ygb2JqZWN0cyB0byBpbmRleFxuICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3QgaW5kZXhpbmcgZWFjaCBhcnJheSBlbGVtZW50IGJ5IHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqIEBzZWUgUi5ncm91cEJ5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgbGlzdCA9IFt7aWQ6ICd4eXonLCB0aXRsZTogJ0EnfSwge2lkOiAnYWJjJywgdGl0bGU6ICdCJ31dO1xuICogICAgICBSLmluZGV4QnkoUi5wcm9wKCdpZCcpLCBsaXN0KTtcbiAqICAgICAgLy89PiB7YWJjOiB7aWQ6ICdhYmMnLCB0aXRsZTogJ0InfSwgeHl6OiB7aWQ6ICd4eXonLCB0aXRsZTogJ0EnfX1cbiAqL1xuXG52YXIgaW5kZXhCeSA9XG4vKiNfX1BVUkVfXyovXG5yZWR1Y2VCeShmdW5jdGlvbiAoYWNjLCBlbGVtKSB7XG4gIHJldHVybiBlbGVtO1xufSwgbnVsbCk7XG5leHBvcnQgZGVmYXVsdCBpbmRleEJ5OyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaW5kZXhPZiBmcm9tIFwiLi9pbnRlcm5hbC9faW5kZXhPZi5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL2ludGVybmFsL19pc0FycmF5LmpzXCI7XG4vKipcbiAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGFuIGl0ZW0gaW4gYW4gYXJyYXksIG9yIC0xXG4gKiBpZiB0aGUgaXRlbSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGFycmF5LiBbYFIuZXF1YWxzYF0oI2VxdWFscykgaXMgdXNlZCB0b1xuICogZGV0ZXJtaW5lIGVxdWFsaXR5LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgYSAtPiBbYV0gLT4gTnVtYmVyXG4gKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgaXRlbSB0byBmaW5kLlxuICogQHBhcmFtIHtBcnJheX0geHMgVGhlIGFycmF5IHRvIHNlYXJjaCBpbi5cbiAqIEByZXR1cm4ge051bWJlcn0gdGhlIGluZGV4IG9mIHRoZSB0YXJnZXQsIG9yIC0xIGlmIHRoZSB0YXJnZXQgaXMgbm90IGZvdW5kLlxuICogQHNlZSBSLmxhc3RJbmRleE9mLCBSLmZpbmRJbmRleFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaW5kZXhPZigzLCBbMSwyLDMsNF0pOyAvLz0+IDJcbiAqICAgICAgUi5pbmRleE9mKDEwLCBbMSwyLDMsNF0pOyAvLz0+IC0xXG4gKi9cblxudmFyIGluZGV4T2YgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBpbmRleE9mKHRhcmdldCwgeHMpIHtcbiAgcmV0dXJuIHR5cGVvZiB4cy5pbmRleE9mID09PSAnZnVuY3Rpb24nICYmICFfaXNBcnJheSh4cykgPyB4cy5pbmRleE9mKHRhcmdldCkgOiBfaW5kZXhPZih4cywgdGFyZ2V0LCAwKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBpbmRleE9mOyIsImltcG9ydCBzbGljZSBmcm9tIFwiLi9zbGljZS5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGFsbCBidXQgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gbGlzdCBvciBzdHJpbmcuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2FdXG4gKiBAc2lnIFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5sYXN0LCBSLmhlYWQsIFIudGFpbFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaW5pdChbMSwgMiwgM10pOyAgLy89PiBbMSwgMl1cbiAqICAgICAgUi5pbml0KFsxLCAyXSk7ICAgICAvLz0+IFsxXVxuICogICAgICBSLmluaXQoWzFdKTsgICAgICAgIC8vPT4gW11cbiAqICAgICAgUi5pbml0KFtdKTsgICAgICAgICAvLz0+IFtdXG4gKlxuICogICAgICBSLmluaXQoJ2FiYycpOyAgLy89PiAnYWInXG4gKiAgICAgIFIuaW5pdCgnYWInKTsgICAvLz0+ICdhJ1xuICogICAgICBSLmluaXQoJ2EnKTsgICAgLy89PiAnJ1xuICogICAgICBSLmluaXQoJycpOyAgICAgLy89PiAnJ1xuICovXG5cbnZhciBpbml0ID1cbi8qI19fUFVSRV9fKi9cbnNsaWNlKDAsIC0xKTtcbmV4cG9ydCBkZWZhdWx0IGluaXQ7IiwiaW1wb3J0IF9pbmNsdWRlc1dpdGggZnJvbSBcIi4vaW50ZXJuYWwvX2luY2x1ZGVzV2l0aC5qc1wiO1xuaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IF9maWx0ZXIgZnJvbSBcIi4vaW50ZXJuYWwvX2ZpbHRlci5qc1wiO1xuLyoqXG4gKiBUYWtlcyBhIHByZWRpY2F0ZSBgcHJlZGAsIGEgbGlzdCBgeHNgLCBhbmQgYSBsaXN0IGB5c2AsIGFuZCByZXR1cm5zIGEgbGlzdFxuICogYHhzJ2AgY29tcHJpc2luZyBlYWNoIG9mIHRoZSBlbGVtZW50cyBvZiBgeHNgIHdoaWNoIGlzIGVxdWFsIHRvIG9uZSBvciBtb3JlXG4gKiBlbGVtZW50cyBvZiBgeXNgIGFjY29yZGluZyB0byBgcHJlZGAuXG4gKlxuICogYHByZWRgIG11c3QgYmUgYSBiaW5hcnkgZnVuY3Rpb24gZXhwZWN0aW5nIGFuIGVsZW1lbnQgZnJvbSBlYWNoIGxpc3QuXG4gKlxuICogYHhzYCwgYHlzYCwgYW5kIGB4cydgIGFyZSB0cmVhdGVkIGFzIHNldHMsIHNlbWFudGljYWxseSwgc28gb3JkZXJpbmcgc2hvdWxkXG4gKiBub3QgYmUgc2lnbmlmaWNhbnQsIGJ1dCBzaW5jZSBgeHMnYCBpcyBvcmRlcmVkIHRoZSBpbXBsZW1lbnRhdGlvbiBndWFyYW50ZWVzXG4gKiB0aGF0IGl0cyB2YWx1ZXMgYXJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgYXBwZWFyIGluIGB4c2AuIER1cGxpY2F0ZXMgYXJlXG4gKiBub3QgcmVtb3ZlZCwgc28gYHhzJ2AgbWF5IGNvbnRhaW4gZHVwbGljYXRlcyBpZiBgeHNgIGNvbnRhaW5zIGR1cGxpY2F0ZXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjQuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnICgoYSwgYikgLT4gQm9vbGVhbikgLT4gW2FdIC0+IFtiXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRcbiAqIEBwYXJhbSB7QXJyYXl9IHhzXG4gKiBAcGFyYW0ge0FycmF5fSB5c1xuICogQHJldHVybiB7QXJyYXl9XG4gKiBAc2VlIFIuaW50ZXJzZWN0aW9uXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pbm5lckpvaW4oXG4gKiAgICAgICAgKHJlY29yZCwgaWQpID0+IHJlY29yZC5pZCA9PT0gaWQsXG4gKiAgICAgICAgW3tpZDogODI0LCBuYW1lOiAnUmljaGllIEZ1cmF5J30sXG4gKiAgICAgICAgIHtpZDogOTU2LCBuYW1lOiAnRGV3ZXkgTWFydGluJ30sXG4gKiAgICAgICAgIHtpZDogMzEzLCBuYW1lOiAnQnJ1Y2UgUGFsbWVyJ30sXG4gKiAgICAgICAgIHtpZDogNDU2LCBuYW1lOiAnU3RlcGhlbiBTdGlsbHMnfSxcbiAqICAgICAgICAge2lkOiAxNzcsIG5hbWU6ICdOZWlsIFlvdW5nJ31dLFxuICogICAgICAgIFsxNzcsIDQ1NiwgOTk5XVxuICogICAgICApO1xuICogICAgICAvLz0+IFt7aWQ6IDQ1NiwgbmFtZTogJ1N0ZXBoZW4gU3RpbGxzJ30sIHtpZDogMTc3LCBuYW1lOiAnTmVpbCBZb3VuZyd9XVxuICovXG5cbnZhciBpbm5lckpvaW4gPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MyhmdW5jdGlvbiBpbm5lckpvaW4ocHJlZCwgeHMsIHlzKSB7XG4gIHJldHVybiBfZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgcmV0dXJuIF9pbmNsdWRlc1dpdGgocHJlZCwgeCwgeXMpO1xuICB9LCB4cyk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgaW5uZXJKb2luOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbi8qKlxuICogSW5zZXJ0cyB0aGUgc3VwcGxpZWQgZWxlbWVudCBpbnRvIHRoZSBsaXN0LCBhdCB0aGUgc3BlY2lmaWVkIGBpbmRleGAuIF9Ob3RlIHRoYXRcblxuICogdGhpcyBpcyBub3QgZGVzdHJ1Y3RpdmVfOiBpdCByZXR1cm5zIGEgY29weSBvZiB0aGUgbGlzdCB3aXRoIHRoZSBjaGFuZ2VzLlxuICogPHNtYWxsPk5vIGxpc3RzIGhhdmUgYmVlbiBoYXJtZWQgaW4gdGhlIGFwcGxpY2F0aW9uIG9mIHRoaXMgZnVuY3Rpb24uPC9zbWFsbD5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yLjJcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIE51bWJlciAtPiBhIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleCBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSBlbGVtZW50XG4gKiBAcGFyYW0geyp9IGVsdCBUaGUgZWxlbWVudCB0byBpbnNlcnQgaW50byB0aGUgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gaW5zZXJ0IGludG9cbiAqIEByZXR1cm4ge0FycmF5fSBBIG5ldyBBcnJheSB3aXRoIGBlbHRgIGluc2VydGVkIGF0IGBpbmRleGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pbnNlcnQoMiwgJ3gnLCBbMSwyLDMsNF0pOyAvLz0+IFsxLDIsJ3gnLDMsNF1cbiAqL1xuXG52YXIgaW5zZXJ0ID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTMoZnVuY3Rpb24gaW5zZXJ0KGlkeCwgZWx0LCBsaXN0KSB7XG4gIGlkeCA9IGlkeCA8IGxpc3QubGVuZ3RoICYmIGlkeCA+PSAwID8gaWR4IDogbGlzdC5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCAwKTtcbiAgcmVzdWx0LnNwbGljZShpZHgsIDAsIGVsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgaW5zZXJ0OyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbi8qKlxuICogSW5zZXJ0cyB0aGUgc3ViLWxpc3QgaW50byB0aGUgbGlzdCwgYXQgdGhlIHNwZWNpZmllZCBgaW5kZXhgLiBfTm90ZSB0aGF0IHRoaXMgaXMgbm90XG4gKiBkZXN0cnVjdGl2ZV86IGl0IHJldHVybnMgYSBjb3B5IG9mIHRoZSBsaXN0IHdpdGggdGhlIGNoYW5nZXMuXG4gKiA8c21hbGw+Tm8gbGlzdHMgaGF2ZSBiZWVuIGhhcm1lZCBpbiB0aGUgYXBwbGljYXRpb24gb2YgdGhpcyBmdW5jdGlvbi48L3NtYWxsPlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjkuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgTnVtYmVyIC0+IFthXSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge051bWJlcn0gaW5kZXggVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgc3ViLWxpc3RcbiAqIEBwYXJhbSB7QXJyYXl9IGVsdHMgVGhlIHN1Yi1saXN0IHRvIGluc2VydCBpbnRvIHRoZSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBpbnNlcnQgdGhlIHN1Yi1saXN0IGludG9cbiAqIEByZXR1cm4ge0FycmF5fSBBIG5ldyBBcnJheSB3aXRoIGBlbHRzYCBpbnNlcnRlZCBzdGFydGluZyBhdCBgaW5kZXhgLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaW5zZXJ0QWxsKDIsIFsneCcsJ3knLCd6J10sIFsxLDIsMyw0XSk7IC8vPT4gWzEsMiwneCcsJ3knLCd6JywzLDRdXG4gKi9cblxudmFyIGluc2VydEFsbCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIGluc2VydEFsbChpZHgsIGVsdHMsIGxpc3QpIHtcbiAgaWR4ID0gaWR4IDwgbGlzdC5sZW5ndGggJiYgaWR4ID49IDAgPyBpZHggOiBsaXN0Lmxlbmd0aDtcbiAgcmV0dXJuIFtdLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCAwLCBpZHgpLCBlbHRzLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCBpZHgpKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBpbnNlcnRBbGw7IiwiaW1wb3J0IF9pbmNsdWRlcyBmcm9tIFwiLi9faW5jbHVkZXMuanNcIjtcblxudmFyIF9TZXQgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBfU2V0KCkge1xuICAgIC8qIGdsb2JhbHMgU2V0ICovXG4gICAgdGhpcy5fbmF0aXZlU2V0ID0gdHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBTZXQoKSA6IG51bGw7XG4gICAgdGhpcy5faXRlbXMgPSB7fTtcbiAgfVxuXG4gIC8vIHVudGlsIHdlIGZpZ3VyZSBvdXQgd2h5IGpzZG9jIGNob2tlcyBvbiB0aGlzXG4gIC8vIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRvIGFkZCB0byB0aGUgU2V0XG4gIC8vIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBpdGVtIGRpZCBub3QgZXhpc3QgcHJpb3IsIG90aGVyd2lzZSBmYWxzZVxuICAvL1xuICBfU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgIHJldHVybiAhaGFzT3JBZGQoaXRlbSwgdHJ1ZSwgdGhpcyk7XG4gIH07IC8vXG4gIC8vIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRvIGNoZWNrIGZvciBleGlzdGVuY2UgaW4gdGhlIFNldFxuICAvLyBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaXRlbSBleGlzdHMgaW4gdGhlIFNldCwgb3RoZXJ3aXNlIGZhbHNlXG4gIC8vXG5cblxuICBfU2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgIHJldHVybiBoYXNPckFkZChpdGVtLCBmYWxzZSwgdGhpcyk7XG4gIH07IC8vXG4gIC8vIENvbWJpbmVzIHRoZSBsb2dpYyBmb3IgY2hlY2tpbmcgd2hldGhlciBhbiBpdGVtIGlzIGEgbWVtYmVyIG9mIHRoZSBzZXQgYW5kXG4gIC8vIGZvciBhZGRpbmcgYSBuZXcgaXRlbSB0byB0aGUgc2V0LlxuICAvL1xuICAvLyBAcGFyYW0gaXRlbSAgICAgICBUaGUgaXRlbSB0byBjaGVjayBvciBhZGQgdG8gdGhlIFNldCBpbnN0YW5jZS5cbiAgLy8gQHBhcmFtIHNob3VsZEFkZCAgSWYgdHJ1ZSwgdGhlIGl0ZW0gd2lsbCBiZSBhZGRlZCB0byB0aGUgc2V0IGlmIGl0IGRvZXNuJ3RcbiAgLy8gICAgICAgICAgICAgICAgICAgYWxyZWFkeSBleGlzdC5cbiAgLy8gQHBhcmFtIHNldCAgICAgICAgVGhlIHNldCBpbnN0YW5jZSB0byBjaGVjayBvciBhZGQgdG8uXG4gIC8vIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGl0ZW0gYWxyZWFkeSBleGlzdGVkLCBvdGhlcndpc2UgZmFsc2UuXG4gIC8vXG5cblxuICByZXR1cm4gX1NldDtcbn0oKTtcblxuZnVuY3Rpb24gaGFzT3JBZGQoaXRlbSwgc2hvdWxkQWRkLCBzZXQpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgaXRlbTtcbiAgdmFyIHByZXZTaXplLCBuZXdTaXplO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIC8vIGRpc3Rpbmd1aXNoIGJldHdlZW4gKzAgYW5kIC0wXG4gICAgICBpZiAoaXRlbSA9PT0gMCAmJiAxIC8gaXRlbSA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgIGlmIChzZXQuX2l0ZW1zWyctMCddKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgc2V0Ll9pdGVtc1snLTAnXSA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IC8vIHRoZXNlIHR5cGVzIGNhbiBhbGwgdXRpbGlzZSB0aGUgbmF0aXZlIFNldFxuXG5cbiAgICAgIGlmIChzZXQuX25hdGl2ZVNldCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgcHJldlNpemUgPSBzZXQuX25hdGl2ZVNldC5zaXplO1xuXG4gICAgICAgICAgc2V0Ll9uYXRpdmVTZXQuYWRkKGl0ZW0pO1xuXG4gICAgICAgICAgbmV3U2l6ZSA9IHNldC5fbmF0aXZlU2V0LnNpemU7XG4gICAgICAgICAgcmV0dXJuIG5ld1NpemUgPT09IHByZXZTaXplO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzZXQuX25hdGl2ZVNldC5oYXMoaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghKHR5cGUgaW4gc2V0Ll9pdGVtcykpIHtcbiAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdID0ge307XG4gICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdW2l0ZW1dID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbiBzZXQuX2l0ZW1zW3R5cGVdKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXVtpdGVtXSA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIC8vIHNldC5faXRlbXNbJ2Jvb2xlYW4nXSBob2xkcyBhIHR3byBlbGVtZW50IGFycmF5XG4gICAgICAvLyByZXByZXNlbnRpbmcgWyBmYWxzZUV4aXN0cywgdHJ1ZUV4aXN0cyBdXG4gICAgICBpZiAodHlwZSBpbiBzZXQuX2l0ZW1zKSB7XG4gICAgICAgIHZhciBiSWR4ID0gaXRlbSA/IDEgOiAwO1xuXG4gICAgICAgIGlmIChzZXQuX2l0ZW1zW3R5cGVdW2JJZHhdKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXVtiSWR4XSA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXSA9IGl0ZW0gPyBbZmFsc2UsIHRydWVdIDogW3RydWUsIGZhbHNlXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIC8vIGNvbXBhcmUgZnVuY3Rpb25zIGZvciByZWZlcmVuY2UgZXF1YWxpdHlcbiAgICAgIGlmIChzZXQuX25hdGl2ZVNldCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgcHJldlNpemUgPSBzZXQuX25hdGl2ZVNldC5zaXplO1xuXG4gICAgICAgICAgc2V0Ll9uYXRpdmVTZXQuYWRkKGl0ZW0pO1xuXG4gICAgICAgICAgbmV3U2l6ZSA9IHNldC5fbmF0aXZlU2V0LnNpemU7XG4gICAgICAgICAgcmV0dXJuIG5ld1NpemUgPT09IHByZXZTaXplO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzZXQuX25hdGl2ZVNldC5oYXMoaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghKHR5cGUgaW4gc2V0Ll9pdGVtcykpIHtcbiAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdID0gW2l0ZW1dO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghX2luY2x1ZGVzKGl0ZW0sIHNldC5faXRlbXNbdHlwZV0pKSB7XG4gICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXS5wdXNoKGl0ZW0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgIGlmIChzZXQuX2l0ZW1zW3R5cGVdKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgIHNldC5faXRlbXNbdHlwZV0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIGlmIChpdGVtID09PSBudWxsKSB7XG4gICAgICAgIGlmICghc2V0Ll9pdGVtc1snbnVsbCddKSB7XG4gICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgc2V0Ll9pdGVtc1snbnVsbCddID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyByZWR1Y2UgdGhlIHNlYXJjaCBzaXplIG9mIGhldGVyb2dlbmVvdXMgc2V0cyBieSBjcmVhdGluZyBidWNrZXRzXG4gICAgICAvLyBmb3IgZWFjaCB0eXBlLlxuICAgICAgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVtKTtcblxuICAgICAgaWYgKCEodHlwZSBpbiBzZXQuX2l0ZW1zKSkge1xuICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXSA9IFtpdGVtXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gLy8gc2NhbiB0aHJvdWdoIGFsbCBwcmV2aW91c2x5IGFwcGxpZWQgaXRlbXNcblxuXG4gICAgICBpZiAoIV9pbmNsdWRlcyhpdGVtLCBzZXQuX2l0ZW1zW3R5cGVdKSkge1xuICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXS5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufSAvLyBBIHNpbXBsZSBTZXQgdHlwZSB0aGF0IGhvbm91cnMgUi5lcXVhbHMgc2VtYW50aWNzXG5cblxuZXhwb3J0IGRlZmF1bHQgX1NldDsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfYXBlcnR1cmUobiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxpbWl0ID0gbGlzdC5sZW5ndGggLSAobiAtIDEpO1xuICB2YXIgYWNjID0gbmV3IEFycmF5KGxpbWl0ID49IDAgPyBsaW1pdCA6IDApO1xuXG4gIHdoaWxlIChpZHggPCBsaW1pdCkge1xuICAgIGFjY1tpZHhdID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobGlzdCwgaWR4LCBpZHggKyBuKTtcbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiBhY2M7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FyaXR5KG4sIGZuKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4gIHN3aXRjaCAobikge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcblxuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTApIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuXG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuXG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyKSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcblxuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTAsIGExLCBhMiwgYTMpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuXG4gICAgY2FzZSA1OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuXG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcblxuICAgIGNhc2UgNzpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuXG4gICAgY2FzZSA4OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuXG4gICAgY2FzZSA5OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcblxuICAgIGNhc2UgMTA6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IHRvIF9hcml0eSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgbm8gZ3JlYXRlciB0aGFuIHRlbicpO1xuICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5RnJvbUl0ZXJhdG9yKGl0ZXIpIHtcbiAgdmFyIGxpc3QgPSBbXTtcbiAgdmFyIG5leHQ7XG5cbiAgd2hpbGUgKCEobmV4dCA9IGl0ZXIubmV4dCgpKS5kb25lKSB7XG4gICAgbGlzdC5wdXNoKG5leHQudmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIGxpc3Q7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5UmVkdWNlKHJlZHVjZXIsIGFjYywgbGlzdCkge1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoID0gbGlzdC5sZW5ndGg7XG5cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgYWNjID0gcmVkdWNlcihhY2MsIGxpc3RbaW5kZXhdKTtcbiAgICBpbmRleCArPSAxO1xuICB9XG5cbiAgcmV0dXJuIGFjYztcbn0iLCJpbXBvcnQgX2lzRnVuY3Rpb24gZnJvbSBcIi4vX2lzRnVuY3Rpb24uanNcIjtcbmltcG9ydCBfdG9TdHJpbmcgZnJvbSBcIi4vX3RvU3RyaW5nLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfYXNzZXJ0UHJvbWlzZShuYW1lLCBwKSB7XG4gIGlmIChwID09IG51bGwgfHwgIV9pc0Z1bmN0aW9uKHAudGhlbikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgJyArIG5hbWUgKyAnYCBleHBlY3RlZCBhIFByb21pc2UsIHJlY2VpdmVkICcgKyBfdG9TdHJpbmcocCwgW10pKTtcbiAgfVxufSIsImltcG9ydCBfaXNBcnJheSBmcm9tIFwiLi9faXNBcnJheS5qc1wiO1xuaW1wb3J0IF9pc0ludGVnZXIgZnJvbSBcIi4vX2lzSW50ZWdlci5qc1wiO1xuLyoqXG4gKiBNYWtlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYW4gb2JqZWN0LCBzZXR0aW5nIG9yIG92ZXJyaWRpbmcgdGhlIHNwZWNpZmllZFxuICogcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuIE5vdGUgdGhhdCB0aGlzIGNvcGllcyBhbmQgZmxhdHRlbnMgcHJvdG90eXBlXG4gKiBwcm9wZXJ0aWVzIG9udG8gdGhlIG5ldyBvYmplY3QgYXMgd2VsbC4gQWxsIG5vbi1wcmltaXRpdmUgcHJvcGVydGllcyBhcmVcbiAqIGNvcGllZCBieSByZWZlcmVuY2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gcHJvcCBUaGUgcHJvcGVydHkgbmFtZSB0byBzZXRcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSBuZXcgdmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvYmogVGhlIG9iamVjdCB0byBjbG9uZVxuICogQHJldHVybiB7T2JqZWN0fEFycmF5fSBBIG5ldyBvYmplY3QgZXF1aXZhbGVudCB0byB0aGUgb3JpZ2luYWwgZXhjZXB0IGZvciB0aGUgY2hhbmdlZCBwcm9wZXJ0eS5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfYXNzb2MocHJvcCwgdmFsLCBvYmopIHtcbiAgaWYgKF9pc0ludGVnZXIocHJvcCkgJiYgX2lzQXJyYXkob2JqKSkge1xuICAgIHZhciBhcnIgPSBbXS5jb25jYXQob2JqKTtcbiAgICBhcnJbcHJvcF0gPSB2YWw7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIG9iaikge1xuICAgIHJlc3VsdFtwXSA9IG9ialtwXTtcbiAgfVxuXG4gIHJlc3VsdFtwcm9wXSA9IHZhbDtcbiAgcmV0dXJuIHJlc3VsdDtcbn0iLCJpbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vX2lzQXJyYXkuanNcIjtcbi8qKlxuICogVGhpcyBjaGVja3Mgd2hldGhlciBhIGZ1bmN0aW9uIGhhcyBhIFttZXRob2RuYW1lXSBmdW5jdGlvbi4gSWYgaXQgaXNuJ3QgYW5cbiAqIGFycmF5IGl0IHdpbGwgZXhlY3V0ZSB0aGF0IGZ1bmN0aW9uIG90aGVyd2lzZSBpdCB3aWxsIGRlZmF1bHQgdG8gdGhlIHJhbWRhXG4gKiBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gcmFtZGEgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXRob2RuYW1lIHByb3BlcnR5IHRvIGNoZWNrIGZvciBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvblxuICogQHJldHVybiB7T2JqZWN0fSBXaGF0ZXZlciB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBtZXRob2QgaXMuXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NoZWNrRm9yTWV0aG9kKG1ldGhvZG5hbWUsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZm4oKTtcbiAgICB9XG5cbiAgICB2YXIgb2JqID0gYXJndW1lbnRzW2xlbmd0aCAtIDFdO1xuICAgIHJldHVybiBfaXNBcnJheShvYmopIHx8IHR5cGVvZiBvYmpbbWV0aG9kbmFtZV0gIT09ICdmdW5jdGlvbicgPyBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogb2JqW21ldGhvZG5hbWVdLmFwcGx5KG9iaiwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCBsZW5ndGggLSAxKSk7XG4gIH07XG59IiwiaW1wb3J0IF9jbG9uZVJlZ0V4cCBmcm9tIFwiLi9fY2xvbmVSZWdFeHAuanNcIjtcbmltcG9ydCB0eXBlIGZyb20gXCIuLi90eXBlLmpzXCI7XG4vKipcbiAqIENvcGllcyBhbiBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIGNvcGllZFxuICogQHBhcmFtIHtCb29sZWFufSBkZWVwIFdoZXRoZXIgb3Igbm90IHRvIHBlcmZvcm0gZGVlcCBjbG9uaW5nLlxuICogQHJldHVybiB7Kn0gVGhlIGNvcGllZCB2YWx1ZS5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2xvbmUodmFsdWUsIGRlZXAsIG1hcCkge1xuICBtYXAgfHwgKG1hcCA9IG5ldyBfT2JqZWN0TWFwKCkpOyAvLyB0aGlzIGF2b2lkcyB0aGUgc2xvd2VyIHN3aXRjaCB3aXRoIGEgcXVpY2sgaWYgZGVjaXNpb24gcmVtb3Zpbmcgc29tZSBtaWxsaXNlY29uZHMgaW4gZWFjaCBydW4uXG5cbiAgaWYgKF9pc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICB2YXIgY29weSA9IGZ1bmN0aW9uIGNvcHkoY29waWVkVmFsdWUpIHtcbiAgICAvLyBDaGVjayBmb3IgY2lyY3VsYXIgYW5kIHNhbWUgcmVmZXJlbmNlcyBvbiB0aGUgb2JqZWN0IGdyYXBoIGFuZCByZXR1cm4gaXRzIGNvcnJlc3BvbmRpbmcgY2xvbmUuXG4gICAgdmFyIGNhY2hlZENvcHkgPSBtYXAuZ2V0KHZhbHVlKTtcblxuICAgIGlmIChjYWNoZWRDb3B5KSB7XG4gICAgICByZXR1cm4gY2FjaGVkQ29weTtcbiAgICB9XG5cbiAgICBtYXAuc2V0KHZhbHVlLCBjb3BpZWRWYWx1ZSk7XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpIHtcbiAgICAgICAgY29waWVkVmFsdWVba2V5XSA9IGRlZXAgPyBfY2xvbmUodmFsdWVba2V5XSwgdHJ1ZSwgbWFwKSA6IHZhbHVlW2tleV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvcGllZFZhbHVlO1xuICB9O1xuXG4gIHN3aXRjaCAodHlwZSh2YWx1ZSkpIHtcbiAgICBjYXNlICdPYmplY3QnOlxuICAgICAgcmV0dXJuIGNvcHkoT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpKSk7XG5cbiAgICBjYXNlICdBcnJheSc6XG4gICAgICByZXR1cm4gY29weShbXSk7XG5cbiAgICBjYXNlICdEYXRlJzpcbiAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZS52YWx1ZU9mKCkpO1xuXG4gICAgY2FzZSAnUmVnRXhwJzpcbiAgICAgIHJldHVybiBfY2xvbmVSZWdFeHAodmFsdWUpO1xuXG4gICAgY2FzZSAnSW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OENsYW1wZWRBcnJheSc6XG4gICAgY2FzZSAnSW50MTZBcnJheSc6XG4gICAgY2FzZSAnVWludDE2QXJyYXknOlxuICAgIGNhc2UgJ0ludDMyQXJyYXknOlxuICAgIGNhc2UgJ1VpbnQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDMyQXJyYXknOlxuICAgIGNhc2UgJ0Zsb2F0NjRBcnJheSc6XG4gICAgY2FzZSAnQmlnSW50NjRBcnJheSc6XG4gICAgY2FzZSAnQmlnVWludDY0QXJyYXknOlxuICAgICAgcmV0dXJuIHZhbHVlLnNsaWNlKCk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9pc1ByaW1pdGl2ZShwYXJhbSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiBwYXJhbTtcbiAgcmV0dXJuIHBhcmFtID09IG51bGwgfHwgdHlwZSAhPSAnb2JqZWN0JyAmJiB0eXBlICE9ICdmdW5jdGlvbic7XG59XG5cbnZhciBfT2JqZWN0TWFwID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gX09iamVjdE1hcCgpIHtcbiAgICB0aGlzLm1hcCA9IHt9O1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgfVxuXG4gIF9PYmplY3RNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgaGFzaGVkS2V5ID0gdGhpcy5oYXNoKGtleSk7XG4gICAgbGV0IGJ1Y2tldCA9IHRoaXMubWFwW2hhc2hlZEtleV07XG5cbiAgICBpZiAoIWJ1Y2tldCkge1xuICAgICAgdGhpcy5tYXBbaGFzaGVkS2V5XSA9IGJ1Y2tldCA9IFtdO1xuICAgIH1cblxuICAgIGJ1Y2tldC5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgdGhpcy5sZW5ndGggKz0gMTtcbiAgfTtcblxuICBfT2JqZWN0TWFwLnByb3RvdHlwZS5oYXNoID0gZnVuY3Rpb24gKGtleSkge1xuICAgIGxldCBoYXNoZWRLZXkgPSBbXTtcblxuICAgIGZvciAodmFyIHZhbHVlIGluIGtleSkge1xuICAgICAgaGFzaGVkS2V5LnB1c2goT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGtleVt2YWx1ZV0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFzaGVkS2V5LmpvaW4oKTtcbiAgfTtcblxuICBfT2JqZWN0TWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgLyoqXG4gICAgICogZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyB0byBiZSBjbG9uZWQgaXMgZmFzdGVyIHRvIGp1c3QgaXRlcmF0ZSBvdmVyIHRoZSBpdGVtcyBpbiB0aGUgbWFwIGp1c3QgYmVjYXVzZSB0aGUgaGFzaCBmdW5jdGlvbiBpcyBzbyBjb3N0bHksXG4gICAgICogb24gbXkgdGVzdHMgdGhpcyBudW1iZXIgaXMgMTgwLCBhbnl0aGluZyBhYm92ZSB0aGF0IHVzaW5nIHRoZSBoYXNoIGZ1bmN0aW9uIGlzIGZhc3Rlci5cbiAgICAgKi9cbiAgICBpZiAodGhpcy5sZW5ndGggPD0gMTgwKSB7XG4gICAgICBmb3IgKGNvbnN0IHAgaW4gdGhpcy5tYXApIHtcbiAgICAgICAgY29uc3QgYnVja2V0ID0gdGhpcy5tYXBbcF07XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWNrZXQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gYnVja2V0W2ldO1xuXG4gICAgICAgICAgaWYgKGVsZW1lbnRbMF0gPT09IGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRbMV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNoZWRLZXkgPSB0aGlzLmhhc2goa2V5KTtcbiAgICBjb25zdCBidWNrZXQgPSB0aGlzLm1hcFtoYXNoZWRLZXldO1xuXG4gICAgaWYgKCFidWNrZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1Y2tldC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGJ1Y2tldFtpXTtcblxuICAgICAgaWYgKGVsZW1lbnRbMF0gPT09IGtleSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudFsxXTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIF9PYmplY3RNYXA7XG59KCk7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2Nsb25lUmVnRXhwKHBhdHRlcm4pIHtcbiAgcmV0dXJuIG5ldyBSZWdFeHAocGF0dGVybi5zb3VyY2UsIHBhdHRlcm4uZmxhZ3MgPyBwYXR0ZXJuLmZsYWdzIDogKHBhdHRlcm4uZ2xvYmFsID8gJ2cnIDogJycpICsgKHBhdHRlcm4uaWdub3JlQ2FzZSA/ICdpJyA6ICcnKSArIChwYXR0ZXJuLm11bHRpbGluZSA/ICdtJyA6ICcnKSArIChwYXR0ZXJuLnN0aWNreSA/ICd5JyA6ICcnKSArIChwYXR0ZXJuLnVuaWNvZGUgPyAndScgOiAnJykgKyAocGF0dGVybi5kb3RBbGwgPyAncycgOiAnJykpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jb21wbGVtZW50KGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gIWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0iLCIvKipcbiAqIFByaXZhdGUgYGNvbmNhdGAgZnVuY3Rpb24gdG8gbWVyZ2UgdHdvIGFycmF5LWxpa2Ugb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxBcmd1bWVudHN9IFtzZXQxPVtdXSBBbiBhcnJheS1saWtlIG9iamVjdC5cbiAqIEBwYXJhbSB7QXJyYXl8QXJndW1lbnRzfSBbc2V0Mj1bXV0gQW4gYXJyYXktbGlrZSBvYmplY3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcsIG1lcmdlZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBfY29uY2F0KFs0LCA1LCA2XSwgWzEsIDIsIDNdKTsgLy89PiBbNCwgNSwgNiwgMSwgMiwgM11cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NvbmNhdChzZXQxLCBzZXQyKSB7XG4gIHNldDEgPSBzZXQxIHx8IFtdO1xuICBzZXQyID0gc2V0MiB8fCBbXTtcbiAgdmFyIGlkeDtcbiAgdmFyIGxlbjEgPSBzZXQxLmxlbmd0aDtcbiAgdmFyIGxlbjIgPSBzZXQyLmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBpZHggPSAwO1xuXG4gIHdoaWxlIChpZHggPCBsZW4xKSB7XG4gICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gc2V0MVtpZHhdO1xuICAgIGlkeCArPSAxO1xuICB9XG5cbiAgaWR4ID0gMDtcblxuICB3aGlsZSAoaWR4IDwgbGVuMikge1xuICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHNldDJbaWR4XTtcbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59IiwiaW1wb3J0IF9hcml0eSBmcm9tIFwiLi9fYXJpdHkuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL19jdXJyeTIuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jcmVhdGVQYXJ0aWFsQXBwbGljYXRvcihjb25jYXQpIHtcbiAgcmV0dXJuIF9jdXJyeTIoZnVuY3Rpb24gKGZuLCBhcmdzKSB7XG4gICAgcmV0dXJuIF9hcml0eShNYXRoLm1heCgwLCBmbi5sZW5ndGggLSBhcmdzLmxlbmd0aCksIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBjb25jYXQoYXJncywgYXJndW1lbnRzKSk7XG4gICAgfSk7XG4gIH0pO1xufSIsImltcG9ydCBfaXNBcnJheUxpa2UgZnJvbSBcIi4vX2lzQXJyYXlMaWtlLmpzXCI7XG52YXIgc3ltSXRlcmF0b3IgPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyA/IFN5bWJvbC5pdGVyYXRvciA6ICdAQGl0ZXJhdG9yJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jcmVhdGVSZWR1Y2UoYXJyYXlSZWR1Y2UsIG1ldGhvZFJlZHVjZSwgaXRlcmFibGVSZWR1Y2UpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIF9yZWR1Y2UoeGYsIGFjYywgbGlzdCkge1xuICAgIGlmIChfaXNBcnJheUxpa2UobGlzdCkpIHtcbiAgICAgIHJldHVybiBhcnJheVJlZHVjZSh4ZiwgYWNjLCBsaXN0KTtcbiAgICB9XG5cbiAgICBpZiAobGlzdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbGlzdFsnZmFudGFzeS1sYW5kL3JlZHVjZSddID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gbWV0aG9kUmVkdWNlKHhmLCBhY2MsIGxpc3QsICdmYW50YXN5LWxhbmQvcmVkdWNlJyk7XG4gICAgfVxuXG4gICAgaWYgKGxpc3Rbc3ltSXRlcmF0b3JdICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBpdGVyYWJsZVJlZHVjZSh4ZiwgYWNjLCBsaXN0W3N5bUl0ZXJhdG9yXSgpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGxpc3QubmV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZXJhYmxlUmVkdWNlKHhmLCBhY2MsIGxpc3QpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbGlzdC5yZWR1Y2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBtZXRob2RSZWR1Y2UoeGYsIGFjYywgbGlzdCwgJ3JlZHVjZScpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlZHVjZTogbGlzdCBtdXN0IGJlIGFycmF5IG9yIGl0ZXJhYmxlJyk7XG4gIH07XG59IiwiaW1wb3J0IF9pc1BsYWNlaG9sZGVyIGZyb20gXCIuL19pc1BsYWNlaG9sZGVyLmpzXCI7XG4vKipcbiAqIE9wdGltaXplZCBpbnRlcm5hbCBvbmUtYXJpdHkgY3VycnkgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBjdXJyaWVkIGZ1bmN0aW9uLlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jdXJyeTEoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGYxKGEpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCB8fCBfaXNQbGFjZWhvbGRlcihhKSkge1xuICAgICAgcmV0dXJuIGYxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH07XG59IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9pc1BsYWNlaG9sZGVyIGZyb20gXCIuL19pc1BsYWNlaG9sZGVyLmpzXCI7XG4vKipcbiAqIE9wdGltaXplZCBpbnRlcm5hbCB0d28tYXJpdHkgY3VycnkgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBjdXJyaWVkIGZ1bmN0aW9uLlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jdXJyeTIoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGYyKGEsIGIpIHtcbiAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIGYyO1xuXG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSA/IGYyIDogX2N1cnJ5MShmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICByZXR1cm4gZm4oYSwgX2IpO1xuICAgICAgICB9KTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGIpID8gZjIgOiBfaXNQbGFjZWhvbGRlcihhKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKF9hLCBiKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIF9iKTtcbiAgICAgICAgfSkgOiBmbihhLCBiKTtcbiAgICB9XG4gIH07XG59IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9pc1BsYWNlaG9sZGVyIGZyb20gXCIuL19pc1BsYWNlaG9sZGVyLmpzXCI7XG4vKipcbiAqIE9wdGltaXplZCBpbnRlcm5hbCB0aHJlZS1hcml0eSBjdXJyeSBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2N1cnJ5Myhmbikge1xuICByZXR1cm4gZnVuY3Rpb24gZjMoYSwgYiwgYykge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gZjM7XG5cbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpID8gZjMgOiBfY3VycnkyKGZ1bmN0aW9uIChfYiwgX2MpIHtcbiAgICAgICAgICByZXR1cm4gZm4oYSwgX2IsIF9jKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgMjpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGIpID8gZjMgOiBfaXNQbGFjZWhvbGRlcihhKSA/IF9jdXJyeTIoZnVuY3Rpb24gKF9hLCBfYykge1xuICAgICAgICAgIHJldHVybiBmbihfYSwgYiwgX2MpO1xuICAgICAgICB9KSA6IF9pc1BsYWNlaG9sZGVyKGIpID8gX2N1cnJ5MihmdW5jdGlvbiAoX2IsIF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIF9iLCBfYyk7XG4gICAgICAgIH0pIDogX2N1cnJ5MShmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgICByZXR1cm4gZm4oYSwgYiwgX2MpO1xuICAgICAgICB9KTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGIpICYmIF9pc1BsYWNlaG9sZGVyKGMpID8gZjMgOiBfaXNQbGFjZWhvbGRlcihhKSAmJiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTIoZnVuY3Rpb24gKF9hLCBfYikge1xuICAgICAgICAgIHJldHVybiBmbihfYSwgX2IsIGMpO1xuICAgICAgICB9KSA6IF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGMpID8gX2N1cnJ5MihmdW5jdGlvbiAoX2EsIF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKF9hLCBiLCBfYyk7XG4gICAgICAgIH0pIDogX2lzUGxhY2Vob2xkZXIoYikgJiYgX2lzUGxhY2Vob2xkZXIoYykgPyBfY3VycnkyKGZ1bmN0aW9uIChfYiwgX2MpIHtcbiAgICAgICAgICByZXR1cm4gZm4oYSwgX2IsIF9jKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihhKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKF9hLCBiLCBjKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIF9iLCBjKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihjKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIGIsIF9jKTtcbiAgICAgICAgfSkgOiBmbihhLCBiLCBjKTtcbiAgICB9XG4gIH07XG59IiwiaW1wb3J0IF9hcml0eSBmcm9tIFwiLi9fYXJpdHkuanNcIjtcbmltcG9ydCBfaXNQbGFjZWhvbGRlciBmcm9tIFwiLi9faXNQbGFjZWhvbGRlci5qc1wiO1xuLyoqXG4gKiBJbnRlcm5hbCBjdXJyeU4gZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgYXJpdHkgb2YgdGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0FycmF5fSByZWNlaXZlZCBBbiBhcnJheSBvZiBhcmd1bWVudHMgcmVjZWl2ZWQgdGh1cyBmYXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2N1cnJ5TihsZW5ndGgsIHJlY2VpdmVkLCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb21iaW5lZCA9IFtdO1xuICAgIHZhciBhcmdzSWR4ID0gMDtcbiAgICB2YXIgbGVmdCA9IGxlbmd0aDtcbiAgICB2YXIgY29tYmluZWRJZHggPSAwO1xuXG4gICAgd2hpbGUgKGNvbWJpbmVkSWR4IDwgcmVjZWl2ZWQubGVuZ3RoIHx8IGFyZ3NJZHggPCBhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuXG4gICAgICBpZiAoY29tYmluZWRJZHggPCByZWNlaXZlZC5sZW5ndGggJiYgKCFfaXNQbGFjZWhvbGRlcihyZWNlaXZlZFtjb21iaW5lZElkeF0pIHx8IGFyZ3NJZHggPj0gYXJndW1lbnRzLmxlbmd0aCkpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVjZWl2ZWRbY29tYmluZWRJZHhdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzW2FyZ3NJZHhdO1xuICAgICAgICBhcmdzSWR4ICs9IDE7XG4gICAgICB9XG5cbiAgICAgIGNvbWJpbmVkW2NvbWJpbmVkSWR4XSA9IHJlc3VsdDtcblxuICAgICAgaWYgKCFfaXNQbGFjZWhvbGRlcihyZXN1bHQpKSB7XG4gICAgICAgIGxlZnQgLT0gMTtcbiAgICAgIH1cblxuICAgICAgY29tYmluZWRJZHggKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGVmdCA8PSAwID8gZm4uYXBwbHkodGhpcywgY29tYmluZWQpIDogX2FyaXR5KGxlZnQsIF9jdXJyeU4obGVuZ3RoLCBjb21iaW5lZCwgZm4pKTtcbiAgfTtcbn0iLCJpbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vX2lzQXJyYXkuanNcIjtcbmltcG9ydCBfaXNUcmFuc2Zvcm1lciBmcm9tIFwiLi9faXNUcmFuc2Zvcm1lci5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBkaXNwYXRjaGVzIHdpdGggZGlmZmVyZW50IHN0cmF0ZWdpZXMgYmFzZWQgb24gdGhlXG4gKiBvYmplY3QgaW4gbGlzdCBwb3NpdGlvbiAobGFzdCBhcmd1bWVudCkuIElmIGl0IGlzIGFuIGFycmF5LCBleGVjdXRlcyBbZm5dLlxuICogT3RoZXJ3aXNlLCBpZiBpdCBoYXMgYSBmdW5jdGlvbiB3aXRoIG9uZSBvZiB0aGUgZ2l2ZW4gbWV0aG9kIG5hbWVzLCBpdCB3aWxsXG4gKiBleGVjdXRlIHRoYXQgZnVuY3Rpb24gKGZ1bmN0b3IgY2FzZSkuIE90aGVyd2lzZSwgaWYgaXQgaXMgYSB0cmFuc2Zvcm1lcixcbiAqIHVzZXMgdHJhbnNkdWNlciBjcmVhdGVkIGJ5IFt0cmFuc2R1Y2VyQ3JlYXRvcl0gdG8gcmV0dXJuIGEgbmV3IHRyYW5zZm9ybWVyXG4gKiAodHJhbnNkdWNlciBjYXNlKS5cbiAqIE90aGVyd2lzZSwgaXQgd2lsbCBkZWZhdWx0IHRvIGV4ZWN1dGluZyBbZm5dLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBtZXRob2ROYW1lcyBwcm9wZXJ0aWVzIHRvIGNoZWNrIGZvciBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNkdWNlckNyZWF0b3IgdHJhbnNkdWNlciBmYWN0b3J5IGlmIG9iamVjdCBpcyB0cmFuc2Zvcm1lclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gZGVmYXVsdCByYW1kYSBpbXBsZW1lbnRhdGlvblxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCBkaXNwYXRjaGVzIG9uIG9iamVjdCBpbiBsaXN0IHBvc2l0aW9uXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2Rpc3BhdGNoYWJsZShtZXRob2ROYW1lcywgdHJhbnNkdWNlckNyZWF0b3IsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH1cblxuICAgIHZhciBvYmogPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdO1xuXG4gICAgaWYgKCFfaXNBcnJheShvYmopKSB7XG4gICAgICB2YXIgaWR4ID0gMDtcblxuICAgICAgd2hpbGUgKGlkeCA8IG1ldGhvZE5hbWVzLmxlbmd0aCkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialttZXRob2ROYW1lc1tpZHhdXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBvYmpbbWV0aG9kTmFtZXNbaWR4XV0uYXBwbHkob2JqLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDAsIC0xKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZHggKz0gMTtcbiAgICAgIH1cblxuICAgICAgaWYgKF9pc1RyYW5zZm9ybWVyKG9iaikpIHtcbiAgICAgICAgdmFyIHRyYW5zZHVjZXIgPSB0cmFuc2R1Y2VyQ3JlYXRvci5hcHBseShudWxsLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDAsIC0xKSk7XG4gICAgICAgIHJldHVybiB0cmFuc2R1Y2VyKG9iaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59IiwiaW1wb3J0IF9pc0ludGVnZXIgZnJvbSBcIi4vX2lzSW50ZWdlci5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgcmVtb3ZlIGZyb20gXCIuLi9yZW1vdmUuanNcIjtcbi8qKlxuICogUmV0dXJucyBhIG5ldyBvYmplY3QgdGhhdCBkb2VzIG5vdCBjb250YWluIGEgYHByb3BgIHByb3BlcnR5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHByb3AgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGRpc3NvY2lhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvYmogVGhlIG9iamVjdCB0byBjbG9uZVxuICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3QgZXF1aXZhbGVudCB0byB0aGUgb3JpZ2luYWwgYnV0IHdpdGhvdXQgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9kaXNzb2MocHJvcCwgb2JqKSB7XG4gIGlmIChvYmogPT0gbnVsbCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBpZiAoX2lzSW50ZWdlcihwcm9wKSAmJiBfaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIHJlbW92ZShwcm9wLCAxLCBvYmopO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gb2JqKSB7XG4gICAgcmVzdWx0W3BdID0gb2JqW3BdO1xuICB9XG5cbiAgZGVsZXRlIHJlc3VsdFtwcm9wXTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0iLCJpbXBvcnQgdGFrZSBmcm9tIFwiLi4vdGFrZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZHJvcExhc3QobiwgeHMpIHtcbiAgcmV0dXJuIHRha2UobiA8IHhzLmxlbmd0aCA/IHhzLmxlbmd0aCAtIG4gOiAwLCB4cyk7XG59IiwiaW1wb3J0IHNsaWNlIGZyb20gXCIuLi9zbGljZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZHJvcExhc3RXaGlsZShwcmVkLCB4cykge1xuICB2YXIgaWR4ID0geHMubGVuZ3RoIC0gMTtcblxuICB3aGlsZSAoaWR4ID49IDAgJiYgcHJlZCh4c1tpZHhdKSkge1xuICAgIGlkeCAtPSAxO1xuICB9XG5cbiAgcmV0dXJuIHNsaWNlKDAsIGlkeCArIDEsIHhzKTtcbn0iLCJpbXBvcnQgX2FycmF5RnJvbUl0ZXJhdG9yIGZyb20gXCIuL19hcnJheUZyb21JdGVyYXRvci5qc1wiO1xuaW1wb3J0IF9pbmNsdWRlc1dpdGggZnJvbSBcIi4vX2luY2x1ZGVzV2l0aC5qc1wiO1xuaW1wb3J0IF9mdW5jdGlvbk5hbWUgZnJvbSBcIi4vX2Z1bmN0aW9uTmFtZS5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vX2hhcy5qc1wiO1xuaW1wb3J0IF9vYmplY3RJcyBmcm9tIFwiLi9fb2JqZWN0SXMuanNcIjtcbmltcG9ydCBrZXlzIGZyb20gXCIuLi9rZXlzLmpzXCI7XG5pbXBvcnQgdHlwZSBmcm9tIFwiLi4vdHlwZS5qc1wiO1xuLyoqXG4gKiBwcml2YXRlIF91bmlxQ29udGVudEVxdWFscyBmdW5jdGlvbi5cbiAqIFRoYXQgZnVuY3Rpb24gaXMgY2hlY2tpbmcgZXF1YWxpdHkgb2YgMiBpdGVyYXRvciBjb250ZW50cyB3aXRoIDIgYXNzdW1wdGlvbnNcbiAqIC0gaXRlcmF0b3JzIGxlbmd0aHMgYXJlIHRoZSBzYW1lXG4gKiAtIGl0ZXJhdG9ycyB2YWx1ZXMgYXJlIHVuaXF1ZVxuICpcbiAqIGZhbHNlLXBvc2l0aXZlIHJlc3VsdCB3aWxsIGJlIHJldHVybmVkIGZvciBjb21wYXJpc29uIG9mLCBlLmcuXG4gKiAtIFsxLDIsM10gYW5kIFsxLDIsMyw0XVxuICogLSBbMSwxLDFdIGFuZCBbMSwyLDNdXG4gKiAqL1xuXG5mdW5jdGlvbiBfdW5pcUNvbnRlbnRFcXVhbHMoYUl0ZXJhdG9yLCBiSXRlcmF0b3IsIHN0YWNrQSwgc3RhY2tCKSB7XG4gIHZhciBhID0gX2FycmF5RnJvbUl0ZXJhdG9yKGFJdGVyYXRvcik7XG5cbiAgdmFyIGIgPSBfYXJyYXlGcm9tSXRlcmF0b3IoYkl0ZXJhdG9yKTtcblxuICBmdW5jdGlvbiBlcShfYSwgX2IpIHtcbiAgICByZXR1cm4gX2VxdWFscyhfYSwgX2IsIHN0YWNrQS5zbGljZSgpLCBzdGFja0Iuc2xpY2UoKSk7XG4gIH0gLy8gaWYgKmEqIGFycmF5IGNvbnRhaW5zIGFueSBlbGVtZW50IHRoYXQgaXMgbm90IGluY2x1ZGVkIGluICpiKlxuXG5cbiAgcmV0dXJuICFfaW5jbHVkZXNXaXRoKGZ1bmN0aW9uIChiLCBhSXRlbSkge1xuICAgIHJldHVybiAhX2luY2x1ZGVzV2l0aChlcSwgYUl0ZW0sIGIpO1xuICB9LCBiLCBhKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2VxdWFscyhhLCBiLCBzdGFja0EsIHN0YWNrQikge1xuICBpZiAoX29iamVjdElzKGEsIGIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgdHlwZUEgPSB0eXBlKGEpO1xuXG4gIGlmICh0eXBlQSAhPT0gdHlwZShiKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYVsnZmFudGFzeS1sYW5kL2VxdWFscyddID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBiWydmYW50YXN5LWxhbmQvZXF1YWxzJ10gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZW9mIGFbJ2ZhbnRhc3ktbGFuZC9lcXVhbHMnXSA9PT0gJ2Z1bmN0aW9uJyAmJiBhWydmYW50YXN5LWxhbmQvZXF1YWxzJ10oYikgJiYgdHlwZW9mIGJbJ2ZhbnRhc3ktbGFuZC9lcXVhbHMnXSA9PT0gJ2Z1bmN0aW9uJyAmJiBiWydmYW50YXN5LWxhbmQvZXF1YWxzJ10oYSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGEuZXF1YWxzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBiLmVxdWFscyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlb2YgYS5lcXVhbHMgPT09ICdmdW5jdGlvbicgJiYgYS5lcXVhbHMoYikgJiYgdHlwZW9mIGIuZXF1YWxzID09PSAnZnVuY3Rpb24nICYmIGIuZXF1YWxzKGEpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlQSkge1xuICAgIGNhc2UgJ0FyZ3VtZW50cyc6XG4gICAgY2FzZSAnQXJyYXknOlxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICBpZiAodHlwZW9mIGEuY29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgJiYgX2Z1bmN0aW9uTmFtZShhLmNvbnN0cnVjdG9yKSA9PT0gJ1Byb21pc2UnKSB7XG4gICAgICAgIHJldHVybiBhID09PSBiO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgIGNhc2UgJ051bWJlcic6XG4gICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgIGlmICghKHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBfb2JqZWN0SXMoYS52YWx1ZU9mKCksIGIudmFsdWVPZigpKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgaWYgKCFfb2JqZWN0SXMoYS52YWx1ZU9mKCksIGIudmFsdWVPZigpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnRXJyb3InOlxuICAgICAgcmV0dXJuIGEubmFtZSA9PT0gYi5uYW1lICYmIGEubWVzc2FnZSA9PT0gYi5tZXNzYWdlO1xuXG4gICAgY2FzZSAnUmVnRXhwJzpcbiAgICAgIGlmICghKGEuc291cmNlID09PSBiLnNvdXJjZSAmJiBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiYgYS5pZ25vcmVDYXNlID09PSBiLmlnbm9yZUNhc2UgJiYgYS5tdWx0aWxpbmUgPT09IGIubXVsdGlsaW5lICYmIGEuc3RpY2t5ID09PSBiLnN0aWNreSAmJiBhLnVuaWNvZGUgPT09IGIudW5pY29kZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBpZHggPSBzdGFja0EubGVuZ3RoIC0gMTtcblxuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICBpZiAoc3RhY2tBW2lkeF0gPT09IGEpIHtcbiAgICAgIHJldHVybiBzdGFja0JbaWR4XSA9PT0gYjtcbiAgICB9XG5cbiAgICBpZHggLT0gMTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZUEpIHtcbiAgICBjYXNlICdNYXAnOlxuICAgICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF91bmlxQ29udGVudEVxdWFscyhhLmVudHJpZXMoKSwgYi5lbnRyaWVzKCksIHN0YWNrQS5jb25jYXQoW2FdKSwgc3RhY2tCLmNvbmNhdChbYl0pKTtcblxuICAgIGNhc2UgJ1NldCc6XG4gICAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3VuaXFDb250ZW50RXF1YWxzKGEudmFsdWVzKCksIGIudmFsdWVzKCksIHN0YWNrQS5jb25jYXQoW2FdKSwgc3RhY2tCLmNvbmNhdChbYl0pKTtcblxuICAgIGNhc2UgJ0FyZ3VtZW50cyc6XG4gICAgY2FzZSAnQXJyYXknOlxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgY2FzZSAnQm9vbGVhbic6XG4gICAgY2FzZSAnTnVtYmVyJzpcbiAgICBjYXNlICdTdHJpbmcnOlxuICAgIGNhc2UgJ0RhdGUnOlxuICAgIGNhc2UgJ0Vycm9yJzpcbiAgICBjYXNlICdSZWdFeHAnOlxuICAgIGNhc2UgJ0ludDhBcnJheSc6XG4gICAgY2FzZSAnVWludDhBcnJheSc6XG4gICAgY2FzZSAnVWludDhDbGFtcGVkQXJyYXknOlxuICAgIGNhc2UgJ0ludDE2QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQxNkFycmF5JzpcbiAgICBjYXNlICdJbnQzMkFycmF5JzpcbiAgICBjYXNlICdVaW50MzJBcnJheSc6XG4gICAgY2FzZSAnRmxvYXQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDY0QXJyYXknOlxuICAgIGNhc2UgJ0FycmF5QnVmZmVyJzpcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIFZhbHVlcyBvZiBvdGhlciB0eXBlcyBhcmUgb25seSBlcXVhbCBpZiBpZGVudGljYWwuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIga2V5c0EgPSBrZXlzKGEpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXMoYikubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGV4dGVuZGVkU3RhY2tBID0gc3RhY2tBLmNvbmNhdChbYV0pO1xuICB2YXIgZXh0ZW5kZWRTdGFja0IgPSBzdGFja0IuY29uY2F0KFtiXSk7XG4gIGlkeCA9IGtleXNBLmxlbmd0aCAtIDE7XG5cbiAgd2hpbGUgKGlkeCA+PSAwKSB7XG4gICAgdmFyIGtleSA9IGtleXNBW2lkeF07XG5cbiAgICBpZiAoIShfaGFzKGtleSwgYikgJiYgX2VxdWFscyhiW2tleV0sIGFba2V5XSwgZXh0ZW5kZWRTdGFja0EsIGV4dGVuZGVkU3RhY2tCKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZHggLT0gMTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9maWx0ZXIoZm4sIGxpc3QpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBsaXN0Lmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBpZiAoZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gbGlzdFtpZHhdO1xuICAgIH1cblxuICAgIGlkeCArPSAxO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn0iLCJpbXBvcnQgX2ZvcmNlUmVkdWNlZCBmcm9tIFwiLi9fZm9yY2VSZWR1Y2VkLmpzXCI7XG5pbXBvcnQgX2lzQXJyYXlMaWtlIGZyb20gXCIuL19pc0FycmF5TGlrZS5qc1wiO1xuaW1wb3J0IF94QXJyYXlSZWR1Y2UgZnJvbSBcIi4vX3hBcnJheVJlZHVjZS5qc1wiO1xuaW1wb3J0IF94UmVkdWNlIGZyb20gXCIuL194UmVkdWNlLmpzXCI7XG5pbXBvcnQgX3hmQmFzZSBmcm9tIFwiLi9feGZCYXNlLmpzXCI7XG52YXIgdEluaXQgPSAnQEB0cmFuc2R1Y2VyL2luaXQnO1xudmFyIHRTdGVwID0gJ0BAdHJhbnNkdWNlci9zdGVwJztcbnZhciB0UmVzdWx0ID0gJ0BAdHJhbnNkdWNlci9yZXN1bHQnO1xuXG52YXIgWFByZXNlcnZpbmdSZWR1Y2VkID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWFByZXNlcnZpbmdSZWR1Y2VkKHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICB9XG5cbiAgWFByZXNlcnZpbmdSZWR1Y2VkLnByb3RvdHlwZVt0SW5pdF0gPSBfeGZCYXNlLmluaXQ7XG4gIFhQcmVzZXJ2aW5nUmVkdWNlZC5wcm90b3R5cGVbdFJlc3VsdF0gPSBfeGZCYXNlLnJlc3VsdDtcblxuICBYUHJlc2VydmluZ1JlZHVjZWQucHJvdG90eXBlW3RTdGVwXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgdmFyIHJldCA9IHRoaXMueGZbdFN0ZXBdKHJlc3VsdCwgaW5wdXQpO1xuICAgIHJldHVybiByZXRbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ10gPyBfZm9yY2VSZWR1Y2VkKHJldCkgOiByZXQ7XG4gIH07XG5cbiAgcmV0dXJuIFhQcmVzZXJ2aW5nUmVkdWNlZDtcbn0oKTtcblxudmFyIFhGbGF0Q2F0ID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWEZsYXRDYXQoeGYpIHtcbiAgICB0aGlzLnhmID0gbmV3IFhQcmVzZXJ2aW5nUmVkdWNlZCh4Zik7XG4gIH1cblxuICBYRmxhdENhdC5wcm90b3R5cGVbdEluaXRdID0gX3hmQmFzZS5pbml0O1xuICBYRmxhdENhdC5wcm90b3R5cGVbdFJlc3VsdF0gPSBfeGZCYXNlLnJlc3VsdDtcblxuICBYRmxhdENhdC5wcm90b3R5cGVbdFN0ZXBdID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICByZXR1cm4gIV9pc0FycmF5TGlrZShpbnB1dCkgPyBfeEFycmF5UmVkdWNlKHRoaXMueGYsIHJlc3VsdCwgW2lucHV0XSkgOiBfeFJlZHVjZSh0aGlzLnhmLCByZXN1bHQsIGlucHV0KTtcbiAgfTtcblxuICByZXR1cm4gWEZsYXRDYXQ7XG59KCk7XG5cbnZhciBfZmxhdENhdCA9IGZ1bmN0aW9uIF94Y2F0KHhmKSB7XG4gIHJldHVybiBuZXcgWEZsYXRDYXQoeGYpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgX2ZsYXRDYXQ7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2ZvcmNlUmVkdWNlZCh4KSB7XG4gIHJldHVybiB7XG4gICAgJ0BAdHJhbnNkdWNlci92YWx1ZSc6IHgsXG4gICAgJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJzogdHJ1ZVxuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9mdW5jdGlvbk5hbWUoZikge1xuICAvLyBTdHJpbmcoeCA9PiB4KSBldmFsdWF0ZXMgdG8gXCJ4ID0+IHhcIiwgc28gdGhlIHBhdHRlcm4gbWF5IG5vdCBtYXRjaC5cbiAgdmFyIG1hdGNoID0gU3RyaW5nKGYpLm1hdGNoKC9eZnVuY3Rpb24gKFxcdyopLyk7XG4gIHJldHVybiBtYXRjaCA9PSBudWxsID8gJycgOiBtYXRjaFsxXTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaGFzKHByb3AsIG9iaikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lkZW50aXR5KHgpIHtcbiAgcmV0dXJuIHg7XG59IiwiaW1wb3J0IF9pbmRleE9mIGZyb20gXCIuL19pbmRleE9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaW5jbHVkZXMoYSwgbGlzdCkge1xuICByZXR1cm4gX2luZGV4T2YobGlzdCwgYSwgMCkgPj0gMDtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaW5jbHVkZXNXaXRoKHByZWQsIHgsIGxpc3QpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBsaXN0Lmxlbmd0aDtcblxuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgaWYgKHByZWQoeCwgbGlzdFtpZHhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWR4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59IiwiaW1wb3J0IGVxdWFscyBmcm9tIFwiLi4vZXF1YWxzLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaW5kZXhPZihsaXN0LCBhLCBpZHgpIHtcbiAgdmFyIGluZiwgaXRlbTsgLy8gQXJyYXkucHJvdG90eXBlLmluZGV4T2YgZG9lc24ndCBleGlzdCBiZWxvdyBJRTlcblxuICBpZiAodHlwZW9mIGxpc3QuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHN3aXRjaCAodHlwZW9mIGEpIHtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIGlmIChhID09PSAwKSB7XG4gICAgICAgICAgLy8gbWFudWFsbHkgY3Jhd2wgdGhlIGxpc3QgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiArMCBhbmQgLTBcbiAgICAgICAgICBpbmYgPSAxIC8gYTtcblxuICAgICAgICAgIHdoaWxlIChpZHggPCBsaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgaXRlbSA9IGxpc3RbaWR4XTtcblxuICAgICAgICAgICAgaWYgKGl0ZW0gPT09IDAgJiYgMSAvIGl0ZW0gPT09IGluZikge1xuICAgICAgICAgICAgICByZXR1cm4gaWR4O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZHggKz0gMTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH0gZWxzZSBpZiAoYSAhPT0gYSkge1xuICAgICAgICAgIC8vIE5hTlxuICAgICAgICAgIHdoaWxlIChpZHggPCBsaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgaXRlbSA9IGxpc3RbaWR4XTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJyAmJiBpdGVtICE9PSBpdGVtKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpZHg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlkeCArPSAxO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfSAvLyBub24temVybyBudW1iZXJzIGNhbiB1dGlsaXNlIFNldFxuXG5cbiAgICAgICAgcmV0dXJuIGxpc3QuaW5kZXhPZihhLCBpZHgpO1xuICAgICAgLy8gYWxsIHRoZXNlIHR5cGVzIGNhbiB1dGlsaXNlIFNldFxuXG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICByZXR1cm4gbGlzdC5pbmRleE9mKGEsIGlkeCk7XG5cbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmIChhID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gbnVsbCBjYW4gdXRpbGlzZSBTZXRcbiAgICAgICAgICByZXR1cm4gbGlzdC5pbmRleE9mKGEsIGlkeCk7XG4gICAgICAgIH1cblxuICAgIH1cbiAgfSAvLyBhbnl0aGluZyBlbHNlIG5vdCBjb3ZlcmVkIGFib3ZlLCBkZWZlciB0byBSLmVxdWFsc1xuXG5cbiAgd2hpbGUgKGlkeCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgaWYgKGVxdWFscyhsaXN0W2lkeF0sIGEpKSB7XG4gICAgICByZXR1cm4gaWR4O1xuICAgIH1cblxuICAgIGlkeCArPSAxO1xuICB9XG5cbiAgcmV0dXJuIC0xO1xufSIsImltcG9ydCBfaGFzIGZyb20gXCIuL19oYXMuanNcIjtcbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbnZhciBfaXNBcmd1bWVudHMgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcmd1bWVudHMpID09PSAnW29iamVjdCBBcmd1bWVudHNdJyA/IGZ1bmN0aW9uIF9pc0FyZ3VtZW50cyh4KSB7XG4gICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuICB9IDogZnVuY3Rpb24gX2lzQXJndW1lbnRzKHgpIHtcbiAgICByZXR1cm4gX2hhcygnY2FsbGVlJywgeCk7XG4gIH07XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IF9pc0FyZ3VtZW50czsiLCIvKipcbiAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IGFuIG9iamVjdCBpcyBhbiBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWwgVGhlIG9iamVjdCB0byB0ZXN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB2YWxgIGlzIGFuIGFycmF5LCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBfaXNBcnJheShbXSk7IC8vPT4gdHJ1ZVxuICogICAgICBfaXNBcnJheShudWxsKTsgLy89PiBmYWxzZVxuICogICAgICBfaXNBcnJheSh7fSk7IC8vPT4gZmFsc2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBfaXNBcnJheSh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPSBudWxsICYmIHZhbC5sZW5ndGggPj0gMCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn07IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgX2lzU3RyaW5nIGZyb20gXCIuL19pc1N0cmluZy5qc1wiO1xuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCBhbiBvYmplY3QgaXMgc2ltaWxhciB0byBhbiBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhdGVnb3J5IFR5cGVcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICogLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSB4IFRoZSBvYmplY3QgdG8gdGVzdC5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiBgeGAgaGFzIGEgbnVtZXJpYyBsZW5ndGggcHJvcGVydHkgYW5kIGV4dHJlbWUgaW5kaWNlcyBkZWZpbmVkOyBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBfaXNBcnJheUxpa2UoW10pOyAvLz0+IHRydWVcbiAqICAgICAgX2lzQXJyYXlMaWtlKHRydWUpOyAvLz0+IGZhbHNlXG4gKiAgICAgIF9pc0FycmF5TGlrZSh7fSk7IC8vPT4gZmFsc2VcbiAqICAgICAgX2lzQXJyYXlMaWtlKHtsZW5ndGg6IDEwfSk7IC8vPT4gZmFsc2VcbiAqICAgICAgX2lzQXJyYXlMaWtlKHswOiAnemVybycsIDk6ICduaW5lJywgbGVuZ3RoOiAxMH0pOyAvLz0+IHRydWVcbiAqICAgICAgX2lzQXJyYXlMaWtlKHtub2RlVHlwZTogMSwgbGVuZ3RoOiAxfSkgLy8gPT4gZmFsc2VcbiAqL1xuXG52YXIgX2lzQXJyYXlMaWtlID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoZnVuY3Rpb24gaXNBcnJheUxpa2UoeCkge1xuICBpZiAoX2lzQXJyYXkoeCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICgheCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoX2lzU3RyaW5nKHgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHgubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoeC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHguaGFzT3duUHJvcGVydHkoMCkgJiYgeC5oYXNPd25Qcm9wZXJ0eSh4Lmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IF9pc0FycmF5TGlrZTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXNGdW5jdGlvbih4KSB7XG4gIHZhciB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpO1xuICByZXR1cm4gdHlwZSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJyB8fCB0eXBlID09PSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyB8fCB0eXBlID09PSAnW29iamVjdCBBc3luY0dlbmVyYXRvckZ1bmN0aW9uXSc7XG59IiwiLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIHBhc3NlZCBhcmd1bWVudCBpcyBhbiBpbnRlZ2VyLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IG5cbiAqIEBjYXRlZ29yeSBUeXBlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5leHBvcnQgZGVmYXVsdCBOdW1iZXIuaXNJbnRlZ2VyIHx8IGZ1bmN0aW9uIF9pc0ludGVnZXIobikge1xuICByZXR1cm4gbiA8PCAwID09PSBuO1xufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXNOdW1iZXIoeCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBOdW1iZXJdJztcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXNPYmplY3QoeCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBPYmplY3RdJztcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXNQbGFjZWhvbGRlcihhKSB7XG4gIHJldHVybiBhICE9IG51bGwgJiYgdHlwZW9mIGEgPT09ICdvYmplY3QnICYmIGFbJ0BAZnVuY3Rpb25hbC9wbGFjZWhvbGRlciddID09PSB0cnVlO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pc1JlZ0V4cCh4KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pc1N0cmluZyh4KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IFN0cmluZ10nO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pc1RyYW5zZm9ybWVyKG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgdHlwZW9mIG9ialsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9PT0gJ2Z1bmN0aW9uJztcbn0iLCIvKipcbiAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IGFuIG9iamVjdCBpcyBhIHR5cGVkIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgb2JqZWN0IHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgYHZhbGAgaXMgYSB0eXBlZCBhcnJheSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgX2lzVHlwZWRBcnJheShuZXcgVWludDhBcnJheShbXSkpOyAvLz0+IHRydWVcbiAqICAgICAgX2lzVHlwZWRBcnJheShuZXcgRmxvYXQzMkFycmF5KFtdKSk7IC8vPT4gdHJ1ZVxuICogICAgICBfaXNUeXBlZEFycmF5KFtdKTsgLy89PiBmYWxzZVxuICogICAgICBfaXNUeXBlZEFycmF5KG51bGwpOyAvLz0+IGZhbHNlXG4gKiAgICAgIF9pc1R5cGVkQXJyYXkoe30pOyAvLz0+IGZhbHNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pc1R5cGVkQXJyYXkodmFsKSB7XG4gIHZhciB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCk7XG4gIHJldHVybiB0eXBlID09PSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEludDhBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyB8fCB0eXBlID09PSAnW29iamVjdCBJbnQxNkFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgVWludDE2QXJyYXldJyB8fCB0eXBlID09PSAnW29iamVjdCBJbnQzMkFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgVWludDMyQXJyYXldJyB8fCB0eXBlID09PSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyB8fCB0eXBlID09PSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyB8fCB0eXBlID09PSAnW29iamVjdCBCaWdJbnQ2NEFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgQmlnVWludDY0QXJyYXldJztcbn0iLCJpbXBvcnQgX2lzQXJyYXlMaWtlIGZyb20gXCIuL19pc0FycmF5TGlrZS5qc1wiO1xuLyoqXG4gKiBgX21ha2VGbGF0YCBpcyBhIGhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBvbmUtbGV2ZWwgb3IgZnVsbHkgcmVjdXJzaXZlXG4gKiBmdW5jdGlvbiBiYXNlZCBvbiB0aGUgZmxhZyBwYXNzZWQgaW4uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfbWFrZUZsYXQocmVjdXJzaXZlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmbGF0dChsaXN0KSB7XG4gICAgdmFyIHZhbHVlLCBqbGVuLCBqO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgaWR4ID0gMDtcbiAgICB2YXIgaWxlbiA9IGxpc3QubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGlkeCA8IGlsZW4pIHtcbiAgICAgIGlmIChfaXNBcnJheUxpa2UobGlzdFtpZHhdKSkge1xuICAgICAgICB2YWx1ZSA9IHJlY3Vyc2l2ZSA/IGZsYXR0KGxpc3RbaWR4XSkgOiBsaXN0W2lkeF07XG4gICAgICAgIGogPSAwO1xuICAgICAgICBqbGVuID0gdmFsdWUubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlIChqIDwgamxlbikge1xuICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHZhbHVlW2pdO1xuICAgICAgICAgIGogKz0gMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gbGlzdFtpZHhdO1xuICAgICAgfVxuXG4gICAgICBpZHggKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9tYXAoZm4sIGZ1bmN0b3IpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBmdW5jdG9yLmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbik7XG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIHJlc3VsdFtpZHhdID0gZm4oZnVuY3RvcltpZHhdKTtcbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59IiwiaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgX2lzSW50ZWdlciBmcm9tIFwiLi9faXNJbnRlZ2VyLmpzXCI7XG4vKipcbiAqIE1ha2VzIGEgc2hhbGxvdyBjbG9uZSBvZiBhbiBvYmplY3QsIGFwcGx5aW5nIHRoZSBnaXZlbiBmbiB0byB0aGUgc3BlY2lmaWVkXG4gKiBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4gTm90ZSB0aGF0IHRoaXMgY29waWVzIGFuZCBmbGF0dGVucyBwcm90b3R5cGVcbiAqIHByb3BlcnRpZXMgb250byB0aGUgbmV3IG9iamVjdCBhcyB3ZWxsLiBBbGwgbm9uLXByaW1pdGl2ZSBwcm9wZXJ0aWVzIGFyZVxuICogY29waWVkIGJ5IHJlZmVyZW5jZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBwcm9wIFRoZSBwcm9wZXJ0eSBuYW1lIHRvIHNldFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIHRoZSBwcm9wZXJ0eVxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R8QXJyYXl9IEEgbmV3IG9iamVjdCBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbCBleGNlcHQgZm9yIHRoZSBjaGFuZ2VkIHByb3BlcnR5LlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9tb2RpZnkocHJvcCwgZm4sIG9iaikge1xuICBpZiAoX2lzSW50ZWdlcihwcm9wKSAmJiBfaXNBcnJheShvYmopKSB7XG4gICAgdmFyIGFyciA9IFtdLmNvbmNhdChvYmopO1xuICAgIGFycltwcm9wXSA9IGZuKGFycltwcm9wXSk7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIG9iaikge1xuICAgIHJlc3VsdFtwXSA9IG9ialtwXTtcbiAgfVxuXG4gIHJlc3VsdFtwcm9wXSA9IGZuKHJlc3VsdFtwcm9wXSk7XG4gIHJldHVybiByZXN1bHQ7XG59IiwiaW1wb3J0IF9oYXMgZnJvbSBcIi4vX2hhcy5qc1wiOyAvLyBCYXNlZCBvbiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduXG5cbmZ1bmN0aW9uIF9vYmplY3RBc3NpZ24odGFyZ2V0KSB7XG4gIGlmICh0YXJnZXQgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICB9XG5cbiAgdmFyIG91dHB1dCA9IE9iamVjdCh0YXJnZXQpO1xuICB2YXIgaWR4ID0gMTtcbiAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgd2hpbGUgKGlkeCA8IGxlbmd0aCkge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaWR4XTtcblxuICAgIGlmIChzb3VyY2UgIT0gbnVsbCkge1xuICAgICAgZm9yICh2YXIgbmV4dEtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKF9oYXMobmV4dEtleSwgc291cmNlKSkge1xuICAgICAgICAgIG91dHB1dFtuZXh0S2V5XSA9IHNvdXJjZVtuZXh0S2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlkeCArPSAxO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdHlwZW9mIE9iamVjdC5hc3NpZ24gPT09ICdmdW5jdGlvbicgPyBPYmplY3QuYXNzaWduIDogX29iamVjdEFzc2lnbjsiLCIvLyBCYXNlZCBvbiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbmZ1bmN0aW9uIF9vYmplY3RJcyhhLCBiKSB7XG4gIC8vIFNhbWVWYWx1ZSBhbGdvcml0aG1cbiAgaWYgKGEgPT09IGIpIHtcbiAgICAvLyBTdGVwcyAxLTUsIDctMTBcbiAgICAvLyBTdGVwcyA2LmItNi5lOiArMCAhPSAtMFxuICAgIHJldHVybiBhICE9PSAwIHx8IDEgLyBhID09PSAxIC8gYjtcbiAgfSBlbHNlIHtcbiAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTlxuICAgIHJldHVybiBhICE9PSBhICYmIGIgIT09IGI7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgdHlwZW9mIE9iamVjdC5pcyA9PT0gJ2Z1bmN0aW9uJyA/IE9iamVjdC5pcyA6IF9vYmplY3RJczsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfcGlwZShmLCBnKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGcuY2FsbCh0aGlzLCBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9wcm9tYXAoZiwgZywgcHJvZnVuY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4gZyhwcm9mdW5jdG9yKGYoeCkpKTtcbiAgfTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfcXVvdGUocykge1xuICB2YXIgZXNjYXBlZCA9IHMucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKS5yZXBsYWNlKC9bXFxiXS9nLCAnXFxcXGInKSAvLyBcXGIgbWF0Y2hlcyB3b3JkIGJvdW5kYXJ5OyBbXFxiXSBtYXRjaGVzIGJhY2tzcGFjZVxuICAucmVwbGFjZSgvXFxmL2csICdcXFxcZicpLnJlcGxhY2UoL1xcbi9nLCAnXFxcXG4nKS5yZXBsYWNlKC9cXHIvZywgJ1xcXFxyJykucmVwbGFjZSgvXFx0L2csICdcXFxcdCcpLnJlcGxhY2UoL1xcdi9nLCAnXFxcXHYnKS5yZXBsYWNlKC9cXDAvZywgJ1xcXFwwJyk7XG4gIHJldHVybiAnXCInICsgZXNjYXBlZC5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJykgKyAnXCInO1xufSIsImltcG9ydCBfYXJyYXlSZWR1Y2UgZnJvbSBcIi4vX2FycmF5UmVkdWNlLmpzXCI7XG5pbXBvcnQgX2NyZWF0ZVJlZHVjZSBmcm9tIFwiLi9fY3JlYXRlUmVkdWNlLmpzXCI7XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVJlZHVjZShyZWR1Y2VyLCBhY2MsIGl0ZXIpIHtcbiAgdmFyIHN0ZXAgPSBpdGVyLm5leHQoKTtcblxuICB3aGlsZSAoIXN0ZXAuZG9uZSkge1xuICAgIGFjYyA9IHJlZHVjZXIoYWNjLCBzdGVwLnZhbHVlKTtcbiAgICBzdGVwID0gaXRlci5uZXh0KCk7XG4gIH1cblxuICByZXR1cm4gYWNjO1xufVxuXG5mdW5jdGlvbiBfbWV0aG9kUmVkdWNlKHJlZHVjZXIsIGFjYywgb2JqLCBtZXRob2ROYW1lKSB7XG4gIHJldHVybiBvYmpbbWV0aG9kTmFtZV0ocmVkdWNlciwgYWNjKTtcbn1cblxudmFyIF9yZWR1Y2UgPVxuLyojX19QVVJFX18qL1xuX2NyZWF0ZVJlZHVjZShfYXJyYXlSZWR1Y2UsIF9tZXRob2RSZWR1Y2UsIF9pdGVyYWJsZVJlZHVjZSk7XG5cbmV4cG9ydCBkZWZhdWx0IF9yZWR1Y2U7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3JlZHVjZWQoeCkge1xuICByZXR1cm4geCAmJiB4WydAQHRyYW5zZHVjZXIvcmVkdWNlZCddID8geCA6IHtcbiAgICAnQEB0cmFuc2R1Y2VyL3ZhbHVlJzogeCxcbiAgICAnQEB0cmFuc2R1Y2VyL3JlZHVjZWQnOiB0cnVlXG4gIH07XG59IiwiaW1wb3J0IF9vYmplY3RBc3NpZ24gZnJvbSBcIi4vX29iamVjdEFzc2lnbi5qc1wiO1xuaW1wb3J0IF9pZGVudGl0eSBmcm9tIFwiLi9faWRlbnRpdHkuanNcIjtcbmltcG9ydCBfaXNBcnJheUxpa2UgZnJvbSBcIi4vX2lzQXJyYXlMaWtlLmpzXCI7XG5pbXBvcnQgX2lzVHJhbnNmb3JtZXIgZnJvbSBcIi4vX2lzVHJhbnNmb3JtZXIuanNcIjtcbmltcG9ydCBvYmpPZiBmcm9tIFwiLi4vb2JqT2YuanNcIjtcbnZhciBfc3RlcENhdEFycmF5ID0ge1xuICAnQEB0cmFuc2R1Y2VyL2luaXQnOiBBcnJheSxcbiAgJ0BAdHJhbnNkdWNlci9zdGVwJzogZnVuY3Rpb24gKHhzLCB4KSB7XG4gICAgeHMucHVzaCh4KTtcbiAgICByZXR1cm4geHM7XG4gIH0sXG4gICdAQHRyYW5zZHVjZXIvcmVzdWx0JzogX2lkZW50aXR5XG59O1xudmFyIF9zdGVwQ2F0U3RyaW5nID0ge1xuICAnQEB0cmFuc2R1Y2VyL2luaXQnOiBTdHJpbmcsXG4gICdAQHRyYW5zZHVjZXIvc3RlcCc6IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGEgKyBiO1xuICB9LFxuICAnQEB0cmFuc2R1Y2VyL3Jlc3VsdCc6IF9pZGVudGl0eVxufTtcbnZhciBfc3RlcENhdE9iamVjdCA9IHtcbiAgJ0BAdHJhbnNkdWNlci9pbml0JzogT2JqZWN0LFxuICAnQEB0cmFuc2R1Y2VyL3N0ZXAnOiBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiBfb2JqZWN0QXNzaWduKHJlc3VsdCwgX2lzQXJyYXlMaWtlKGlucHV0KSA/IG9iak9mKGlucHV0WzBdLCBpbnB1dFsxXSkgOiBpbnB1dCk7XG4gIH0sXG4gICdAQHRyYW5zZHVjZXIvcmVzdWx0JzogX2lkZW50aXR5XG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3N0ZXBDYXQob2JqKSB7XG4gIGlmIChfaXNUcmFuc2Zvcm1lcihvYmopKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGlmIChfaXNBcnJheUxpa2Uob2JqKSkge1xuICAgIHJldHVybiBfc3RlcENhdEFycmF5O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIF9zdGVwQ2F0U3RyaW5nO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIF9zdGVwQ2F0T2JqZWN0O1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIHRyYW5zZm9ybWVyIGZvciAnICsgb2JqKTtcbn0iLCIvKipcbiAqIFBvbHlmaWxsIGZyb20gPGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGUvdG9JU09TdHJpbmc+LlxuICovXG52YXIgcGFkID0gZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIChuIDwgMTAgPyAnMCcgOiAnJykgKyBuO1xufTtcblxudmFyIF90b0lTT1N0cmluZyA9IHR5cGVvZiBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyA9PT0gJ2Z1bmN0aW9uJyA/IGZ1bmN0aW9uIF90b0lTT1N0cmluZyhkKSB7XG4gIHJldHVybiBkLnRvSVNPU3RyaW5nKCk7XG59IDogZnVuY3Rpb24gX3RvSVNPU3RyaW5nKGQpIHtcbiAgcmV0dXJuIGQuZ2V0VVRDRnVsbFllYXIoKSArICctJyArIHBhZChkLmdldFVUQ01vbnRoKCkgKyAxKSArICctJyArIHBhZChkLmdldFVUQ0RhdGUoKSkgKyAnVCcgKyBwYWQoZC5nZXRVVENIb3VycygpKSArICc6JyArIHBhZChkLmdldFVUQ01pbnV0ZXMoKSkgKyAnOicgKyBwYWQoZC5nZXRVVENTZWNvbmRzKCkpICsgJy4nICsgKGQuZ2V0VVRDTWlsbGlzZWNvbmRzKCkgLyAxMDAwKS50b0ZpeGVkKDMpLnNsaWNlKDIsIDUpICsgJ1onO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgX3RvSVNPU3RyaW5nOyIsImltcG9ydCBfaW5jbHVkZXMgZnJvbSBcIi4vX2luY2x1ZGVzLmpzXCI7XG5pbXBvcnQgX21hcCBmcm9tIFwiLi9fbWFwLmpzXCI7XG5pbXBvcnQgX3F1b3RlIGZyb20gXCIuL19xdW90ZS5qc1wiO1xuaW1wb3J0IF90b0lTT1N0cmluZyBmcm9tIFwiLi9fdG9JU09TdHJpbmcuanNcIjtcbmltcG9ydCBrZXlzIGZyb20gXCIuLi9rZXlzLmpzXCI7XG5pbXBvcnQgcmVqZWN0IGZyb20gXCIuLi9yZWplY3QuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF90b1N0cmluZyh4LCBzZWVuKSB7XG4gIHZhciByZWN1ciA9IGZ1bmN0aW9uIHJlY3VyKHkpIHtcbiAgICB2YXIgeHMgPSBzZWVuLmNvbmNhdChbeF0pO1xuICAgIHJldHVybiBfaW5jbHVkZXMoeSwgeHMpID8gJzxDaXJjdWxhcj4nIDogX3RvU3RyaW5nKHksIHhzKTtcbiAgfTsgLy8gIG1hcFBhaXJzIDo6IChPYmplY3QsIFtTdHJpbmddKSAtPiBbU3RyaW5nXVxuXG5cbiAgdmFyIG1hcFBhaXJzID0gZnVuY3Rpb24gKG9iaiwga2V5cykge1xuICAgIHJldHVybiBfbWFwKGZ1bmN0aW9uIChrKSB7XG4gICAgICByZXR1cm4gX3F1b3RlKGspICsgJzogJyArIHJlY3VyKG9ialtrXSk7XG4gICAgfSwga2V5cy5zbGljZSgpLnNvcnQoKSk7XG4gIH07XG5cbiAgc3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCkpIHtcbiAgICBjYXNlICdbb2JqZWN0IEFyZ3VtZW50c10nOlxuICAgICAgcmV0dXJuICcoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oJyArIF9tYXAocmVjdXIsIHgpLmpvaW4oJywgJykgKyAnKSknO1xuXG4gICAgY2FzZSAnW29iamVjdCBBcnJheV0nOlxuICAgICAgcmV0dXJuICdbJyArIF9tYXAocmVjdXIsIHgpLmNvbmNhdChtYXBQYWlycyh4LCByZWplY3QoZnVuY3Rpb24gKGspIHtcbiAgICAgICAgcmV0dXJuIC9eXFxkKyQvLnRlc3Qoayk7XG4gICAgICB9LCBrZXlzKHgpKSkpLmpvaW4oJywgJykgKyAnXSc7XG5cbiAgICBjYXNlICdbb2JqZWN0IEJvb2xlYW5dJzpcbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgPyAnbmV3IEJvb2xlYW4oJyArIHJlY3VyKHgudmFsdWVPZigpKSArICcpJyA6IHgudG9TdHJpbmcoKTtcblxuICAgIGNhc2UgJ1tvYmplY3QgRGF0ZV0nOlxuICAgICAgcmV0dXJuICduZXcgRGF0ZSgnICsgKGlzTmFOKHgudmFsdWVPZigpKSA/IHJlY3VyKE5hTikgOiBfcXVvdGUoX3RvSVNPU3RyaW5nKHgpKSkgKyAnKSc7XG5cbiAgICBjYXNlICdbb2JqZWN0IE1hcF0nOlxuICAgICAgcmV0dXJuICduZXcgTWFwKCcgKyByZWN1cihBcnJheS5mcm9tKHgpKSArICcpJztcblxuICAgIGNhc2UgJ1tvYmplY3QgTnVsbF0nOlxuICAgICAgcmV0dXJuICdudWxsJztcblxuICAgIGNhc2UgJ1tvYmplY3QgTnVtYmVyXSc6XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdvYmplY3QnID8gJ25ldyBOdW1iZXIoJyArIHJlY3VyKHgudmFsdWVPZigpKSArICcpJyA6IDEgLyB4ID09PSAtSW5maW5pdHkgPyAnLTAnIDogeC50b1N0cmluZygxMCk7XG5cbiAgICBjYXNlICdbb2JqZWN0IFNldF0nOlxuICAgICAgcmV0dXJuICduZXcgU2V0KCcgKyByZWN1cihBcnJheS5mcm9tKHgpLnNvcnQoKSkgKyAnKSc7XG5cbiAgICBjYXNlICdbb2JqZWN0IFN0cmluZ10nOlxuICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnb2JqZWN0JyA/ICduZXcgU3RyaW5nKCcgKyByZWN1cih4LnZhbHVlT2YoKSkgKyAnKScgOiBfcXVvdGUoeCk7XG5cbiAgICBjYXNlICdbb2JqZWN0IFVuZGVmaW5lZF0nOlxuICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2YgeC50b1N0cmluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgcmVwciA9IHgudG9TdHJpbmcoKTtcblxuICAgICAgICBpZiAocmVwciAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgICAgICByZXR1cm4gcmVwcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gJ3snICsgbWFwUGFpcnMoeCwga2V5cyh4KSkuam9pbignLCAnKSArICd9JztcbiAgfVxufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94QXJyYXlSZWR1Y2UoeGYsIGFjYywgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuXG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBhY2MgPSB4ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShhY2MsIGxpc3RbaWR4XSk7XG5cbiAgICBpZiAoYWNjICYmIGFjY1snQEB0cmFuc2R1Y2VyL3JlZHVjZWQnXSkge1xuICAgICAgYWNjID0gYWNjWydAQHRyYW5zZHVjZXIvdmFsdWUnXTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlkeCArPSAxO1xuICB9XG5cbiAgcmV0dXJuIHhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10oYWNjKTtcbn0iLCJpbXBvcnQgX2NyZWF0ZVJlZHVjZSBmcm9tIFwiLi9fY3JlYXRlUmVkdWNlLmpzXCI7XG5pbXBvcnQgX3hBcnJheVJlZHVjZSBmcm9tIFwiLi9feEFycmF5UmVkdWNlLmpzXCI7XG5pbXBvcnQgYmluZCBmcm9tIFwiLi4vYmluZC5qc1wiO1xuXG5mdW5jdGlvbiBfeEl0ZXJhYmxlUmVkdWNlKHhmLCBhY2MsIGl0ZXIpIHtcbiAgdmFyIHN0ZXAgPSBpdGVyLm5leHQoKTtcblxuICB3aGlsZSAoIXN0ZXAuZG9uZSkge1xuICAgIGFjYyA9IHhmWydAQHRyYW5zZHVjZXIvc3RlcCddKGFjYywgc3RlcC52YWx1ZSk7XG5cbiAgICBpZiAoYWNjICYmIGFjY1snQEB0cmFuc2R1Y2VyL3JlZHVjZWQnXSkge1xuICAgICAgYWNjID0gYWNjWydAQHRyYW5zZHVjZXIvdmFsdWUnXTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHN0ZXAgPSBpdGVyLm5leHQoKTtcbiAgfVxuXG4gIHJldHVybiB4ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKGFjYyk7XG59XG5cbmZ1bmN0aW9uIF94TWV0aG9kUmVkdWNlKHhmLCBhY2MsIG9iaiwgbWV0aG9kTmFtZSkge1xuICByZXR1cm4geGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShvYmpbbWV0aG9kTmFtZV0oYmluZCh4ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSwgeGYpLCBhY2MpKTtcbn1cblxudmFyIF94UmVkdWNlID1cbi8qI19fUFVSRV9fKi9cbl9jcmVhdGVSZWR1Y2UoX3hBcnJheVJlZHVjZSwgX3hNZXRob2RSZWR1Y2UsIF94SXRlcmFibGVSZWR1Y2UpO1xuXG5leHBvcnQgZGVmYXVsdCBfeFJlZHVjZTsiLCJpbXBvcnQgX3JlZHVjZWQgZnJvbSBcIi4vX3JlZHVjZWQuanNcIjtcbmltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcblxudmFyIFhBbGwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYQWxsKGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gICAgdGhpcy5hbGwgPSB0cnVlO1xuICB9XG5cbiAgWEFsbC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG5cbiAgWEFsbC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICBpZiAodGhpcy5hbGwpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCB0cnVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH07XG5cbiAgWEFsbC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIGlmICghdGhpcy5mKGlucHV0KSkge1xuICAgICAgdGhpcy5hbGwgPSBmYWxzZTtcbiAgICAgIHJlc3VsdCA9IF9yZWR1Y2VkKHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCBmYWxzZSkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgcmV0dXJuIFhBbGw7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94YWxsKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWEFsbChmLCB4Zik7XG4gIH07XG59IiwiaW1wb3J0IF9yZWR1Y2VkIGZyb20gXCIuL19yZWR1Y2VkLmpzXCI7XG5pbXBvcnQgX3hmQmFzZSBmcm9tIFwiLi9feGZCYXNlLmpzXCI7XG5cbnZhciBYQW55ID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWEFueShmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICAgIHRoaXMuYW55ID0gZmFsc2U7XG4gIH1cblxuICBYQW55LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcblxuICBYQW55LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGlmICghdGhpcy5hbnkpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShyZXN1bHQpO1xuICB9O1xuXG4gIFhBbnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAodGhpcy5mKGlucHV0KSkge1xuICAgICAgdGhpcy5hbnkgPSB0cnVlO1xuICAgICAgcmVzdWx0ID0gX3JlZHVjZWQodGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIHRydWUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHJldHVybiBYQW55O1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeGFueShmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhBbnkoZiwgeGYpO1xuICB9O1xufSIsImltcG9ydCBfY29uY2F0IGZyb20gXCIuL19jb25jYXQuanNcIjtcbmltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcblxudmFyIFhBcGVydHVyZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhBcGVydHVyZShuLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLnBvcyA9IDA7XG4gICAgdGhpcy5mdWxsID0gZmFsc2U7XG4gICAgdGhpcy5hY2MgPSBuZXcgQXJyYXkobik7XG4gIH1cblxuICBYQXBlcnR1cmUucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuXG4gIFhBcGVydHVyZS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICB0aGlzLmFjYyA9IG51bGw7XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShyZXN1bHQpO1xuICB9O1xuXG4gIFhBcGVydHVyZS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHRoaXMuc3RvcmUoaW5wdXQpO1xuICAgIHJldHVybiB0aGlzLmZ1bGwgPyB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdGhpcy5nZXRDb3B5KCkpIDogcmVzdWx0O1xuICB9O1xuXG4gIFhBcGVydHVyZS5wcm90b3R5cGUuc3RvcmUgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICB0aGlzLmFjY1t0aGlzLnBvc10gPSBpbnB1dDtcbiAgICB0aGlzLnBvcyArPSAxO1xuXG4gICAgaWYgKHRoaXMucG9zID09PSB0aGlzLmFjYy5sZW5ndGgpIHtcbiAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgIHRoaXMuZnVsbCA9IHRydWU7XG4gICAgfVxuICB9O1xuXG4gIFhBcGVydHVyZS5wcm90b3R5cGUuZ2V0Q29weSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX2NvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLmFjYywgdGhpcy5wb3MpLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLmFjYywgMCwgdGhpcy5wb3MpKTtcbiAgfTtcblxuICByZXR1cm4gWEFwZXJ0dXJlO1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeGFwZXJ0dXJlKG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWEFwZXJ0dXJlKG4sIHhmKTtcbiAgfTtcbn0iLCJpbXBvcnQgX2ZsYXRDYXQgZnJvbSBcIi4vX2ZsYXRDYXQuanNcIjtcbmltcG9ydCBfeG1hcCBmcm9tIFwiLi9feG1hcC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hjaGFpbihmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gX3htYXAoZikoX2ZsYXRDYXQoeGYpKTtcbiAgfTtcbn0iLCJpbXBvcnQgX3hmQmFzZSBmcm9tIFwiLi9feGZCYXNlLmpzXCI7XG5cbnZhciBYRHJvcCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhEcm9wKG4sIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMubiA9IG47XG4gIH1cblxuICBYRHJvcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhEcm9wLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gX3hmQmFzZS5yZXN1bHQ7XG5cbiAgWERyb3AucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAodGhpcy5uID4gMCkge1xuICAgICAgdGhpcy5uIC09IDE7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgaW5wdXQpO1xuICB9O1xuXG4gIHJldHVybiBYRHJvcDtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hkcm9wKG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWERyb3AobiwgeGYpO1xuICB9O1xufSIsImltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcblxudmFyIFhEcm9wTGFzdCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhEcm9wTGFzdChuLCB4Zikge1xuICAgIGlmIChuIDw9IDApIHtcbiAgICAgIHJldHVybiB4ZjtcbiAgICB9XG5cbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5wb3MgPSAwO1xuICAgIHRoaXMuZnVsbCA9IGZhbHNlO1xuICAgIHRoaXMuYWNjID0gbmV3IEFycmF5KG4pO1xuICB9XG5cbiAgWERyb3BMYXN0LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcblxuICBYRHJvcExhc3QucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgdGhpcy5hY2MgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10ocmVzdWx0KTtcbiAgfTtcblxuICBYRHJvcExhc3QucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAodGhpcy5mdWxsKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdGhpcy5hY2NbdGhpcy5wb3NdKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0b3JlKGlucHV0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIFhEcm9wTGFzdC5wcm90b3R5cGUuc3RvcmUgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICB0aGlzLmFjY1t0aGlzLnBvc10gPSBpbnB1dDtcbiAgICB0aGlzLnBvcyArPSAxO1xuXG4gICAgaWYgKHRoaXMucG9zID09PSB0aGlzLmFjYy5sZW5ndGgpIHtcbiAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgIHRoaXMuZnVsbCA9IHRydWU7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBYRHJvcExhc3Q7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94ZHJvcExhc3Qobikge1xuICByZXR1cm4gZnVuY3Rpb24gKHhmKSB7XG4gICAgcmV0dXJuIG5ldyBYRHJvcExhc3QobiwgeGYpO1xuICB9O1xufSIsImltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcbmltcG9ydCBfeFJlZHVjZSBmcm9tIFwiLi9feFJlZHVjZS5qc1wiO1xuXG52YXIgWERyb3BMYXN0V2hpbGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYRHJvcExhc3RXaGlsZShmbiwgeGYpIHtcbiAgICB0aGlzLmYgPSBmbjtcbiAgICB0aGlzLnJldGFpbmVkID0gW107XG4gICAgdGhpcy54ZiA9IHhmO1xuICB9XG5cbiAgWERyb3BMYXN0V2hpbGUucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuXG4gIFhEcm9wTGFzdFdoaWxlLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIHRoaXMucmV0YWluZWQgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10ocmVzdWx0KTtcbiAgfTtcblxuICBYRHJvcExhc3RXaGlsZS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLmYoaW5wdXQpID8gdGhpcy5yZXRhaW4ocmVzdWx0LCBpbnB1dCkgOiB0aGlzLmZsdXNoKHJlc3VsdCwgaW5wdXQpO1xuICB9O1xuXG4gIFhEcm9wTGFzdFdoaWxlLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgcmVzdWx0ID0gX3hSZWR1Y2UodGhpcy54ZiwgcmVzdWx0LCB0aGlzLnJldGFpbmVkKTtcbiAgICB0aGlzLnJldGFpbmVkID0gW107XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCBpbnB1dCk7XG4gIH07XG5cbiAgWERyb3BMYXN0V2hpbGUucHJvdG90eXBlLnJldGFpbiA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgdGhpcy5yZXRhaW5lZC5wdXNoKGlucHV0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHJldHVybiBYRHJvcExhc3RXaGlsZTtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hkcm9wTGFzdFdoaWxlKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhEcm9wTGFzdFdoaWxlKGZuLCB4Zik7XG4gIH07XG59IiwiaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xuXG52YXIgWERyb3BSZXBlYXRzV2l0aCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhEcm9wUmVwZWF0c1dpdGgocHJlZCwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5wcmVkID0gcHJlZDtcbiAgICB0aGlzLmxhc3RWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNlZW5GaXJzdFZhbHVlID0gZmFsc2U7XG4gIH1cblxuICBYRHJvcFJlcGVhdHNXaXRoLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcbiAgWERyb3BSZXBlYXRzV2l0aC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IF94ZkJhc2UucmVzdWx0O1xuXG4gIFhEcm9wUmVwZWF0c1dpdGgucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICB2YXIgc2FtZUFzTGFzdCA9IGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLnNlZW5GaXJzdFZhbHVlKSB7XG4gICAgICB0aGlzLnNlZW5GaXJzdFZhbHVlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJlZCh0aGlzLmxhc3RWYWx1ZSwgaW5wdXQpKSB7XG4gICAgICBzYW1lQXNMYXN0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmxhc3RWYWx1ZSA9IGlucHV0O1xuICAgIHJldHVybiBzYW1lQXNMYXN0ID8gcmVzdWx0IDogdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KTtcbiAgfTtcblxuICByZXR1cm4gWERyb3BSZXBlYXRzV2l0aDtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hkcm9wUmVwZWF0c1dpdGgocHJlZCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHhmKSB7XG4gICAgcmV0dXJuIG5ldyBYRHJvcFJlcGVhdHNXaXRoKHByZWQsIHhmKTtcbiAgfTtcbn0iLCJpbXBvcnQgX3hmQmFzZSBmcm9tIFwiLi9feGZCYXNlLmpzXCI7XG5cbnZhciBYRHJvcFdoaWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWERyb3BXaGlsZShmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICB9XG5cbiAgWERyb3BXaGlsZS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhEcm9wV2hpbGUucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcblxuICBYRHJvcFdoaWxlLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgaWYgKHRoaXMuZikge1xuICAgICAgaWYgKHRoaXMuZihpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5mID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KTtcbiAgfTtcblxuICByZXR1cm4gWERyb3BXaGlsZTtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hkcm9wV2hpbGUoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKHhmKSB7XG4gICAgcmV0dXJuIG5ldyBYRHJvcFdoaWxlKGYsIHhmKTtcbiAgfTtcbn0iLCJleHBvcnQgZGVmYXVsdCB7XG4gIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL2luaXQnXSgpO1xuICB9LFxuICByZXN1bHQ6IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH1cbn07IiwiaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xuXG52YXIgWEZpbHRlciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhGaWx0ZXIoZiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5mID0gZjtcbiAgfVxuXG4gIFhGaWx0ZXIucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYRmlsdGVyLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gX3hmQmFzZS5yZXN1bHQ7XG5cbiAgWEZpbHRlci5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLmYoaW5wdXQpID8gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KSA6IHJlc3VsdDtcbiAgfTtcblxuICByZXR1cm4gWEZpbHRlcjtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hmaWx0ZXIoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKHhmKSB7XG4gICAgcmV0dXJuIG5ldyBYRmlsdGVyKGYsIHhmKTtcbiAgfTtcbn0iLCJpbXBvcnQgX3JlZHVjZWQgZnJvbSBcIi4vX3JlZHVjZWQuanNcIjtcbmltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcblxudmFyIFhGaW5kID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWEZpbmQoZiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5mID0gZjtcbiAgICB0aGlzLmZvdW5kID0gZmFsc2U7XG4gIH1cblxuICBYRmluZC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG5cbiAgWEZpbmQucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgaWYgKCF0aGlzLmZvdW5kKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdm9pZCAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH07XG5cbiAgWEZpbmQucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAodGhpcy5mKGlucHV0KSkge1xuICAgICAgdGhpcy5mb3VuZCA9IHRydWU7XG4gICAgICByZXN1bHQgPSBfcmVkdWNlZCh0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgaW5wdXQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHJldHVybiBYRmluZDtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hmaW5kKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWEZpbmQoZiwgeGYpO1xuICB9O1xufSIsImltcG9ydCBfcmVkdWNlZCBmcm9tIFwiLi9fcmVkdWNlZC5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xuXG52YXIgWEZpbmRJbmRleCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhGaW5kSW5kZXgoZiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5mID0gZjtcbiAgICB0aGlzLmlkeCA9IC0xO1xuICAgIHRoaXMuZm91bmQgPSBmYWxzZTtcbiAgfVxuXG4gIFhGaW5kSW5kZXgucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuXG4gIFhGaW5kSW5kZXgucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgaWYgKCF0aGlzLmZvdW5kKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgLTEpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10ocmVzdWx0KTtcbiAgfTtcblxuICBYRmluZEluZGV4LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgdGhpcy5pZHggKz0gMTtcblxuICAgIGlmICh0aGlzLmYoaW5wdXQpKSB7XG4gICAgICB0aGlzLmZvdW5kID0gdHJ1ZTtcbiAgICAgIHJlc3VsdCA9IF9yZWR1Y2VkKHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCB0aGlzLmlkeCkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgcmV0dXJuIFhGaW5kSW5kZXg7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94ZmluZEluZGV4KGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWEZpbmRJbmRleChmLCB4Zik7XG4gIH07XG59IiwiaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xuXG52YXIgWEZpbmRMYXN0ID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWEZpbmRMYXN0KGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gIH1cblxuICBYRmluZExhc3QucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuXG4gIFhGaW5kTGFzdC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCB0aGlzLmxhc3QpKTtcbiAgfTtcblxuICBYRmluZExhc3QucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAodGhpcy5mKGlucHV0KSkge1xuICAgICAgdGhpcy5sYXN0ID0gaW5wdXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICByZXR1cm4gWEZpbmRMYXN0O1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeGZpbmRMYXN0KGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWEZpbmRMYXN0KGYsIHhmKTtcbiAgfTtcbn0iLCJpbXBvcnQgX3hmQmFzZSBmcm9tIFwiLi9feGZCYXNlLmpzXCI7XG5cbnZhciBYRmluZExhc3RJbmRleCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhGaW5kTGFzdEluZGV4KGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gICAgdGhpcy5pZHggPSAtMTtcbiAgICB0aGlzLmxhc3RJZHggPSAtMTtcbiAgfVxuXG4gIFhGaW5kTGFzdEluZGV4LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcblxuICBYRmluZExhc3RJbmRleC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCB0aGlzLmxhc3RJZHgpKTtcbiAgfTtcblxuICBYRmluZExhc3RJbmRleC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHRoaXMuaWR4ICs9IDE7XG5cbiAgICBpZiAodGhpcy5mKGlucHV0KSkge1xuICAgICAgdGhpcy5sYXN0SWR4ID0gdGhpcy5pZHg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICByZXR1cm4gWEZpbmRMYXN0SW5kZXg7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94ZmluZExhc3RJbmRleChmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhGaW5kTGFzdEluZGV4KGYsIHhmKTtcbiAgfTtcbn0iLCJpbXBvcnQgX3hmQmFzZSBmcm9tIFwiLi9feGZCYXNlLmpzXCI7XG5cbnZhciBYTWFwID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWE1hcChmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICB9XG5cbiAgWE1hcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhNYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcblxuICBYTWFwLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCB0aGlzLmYoaW5wdXQpKTtcbiAgfTtcblxuICByZXR1cm4gWE1hcDtcbn0oKTtcblxudmFyIF94bWFwID0gZnVuY3Rpb24gX3htYXAoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKHhmKSB7XG4gICAgcmV0dXJuIG5ldyBYTWFwKGYsIHhmKTtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IF94bWFwOyIsImltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcbmltcG9ydCBfcHJvbWFwIGZyb20gXCIuL19wcm9tYXAuanNcIjtcblxudmFyIFhQcm9tYXAgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYUHJvbWFwKGYsIGcsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gICAgdGhpcy5nID0gZztcbiAgfVxuXG4gIFhQcm9tYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYUHJvbWFwLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gX3hmQmFzZS5yZXN1bHQ7XG5cbiAgWFByb21hcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgX3Byb21hcCh0aGlzLmYsIHRoaXMuZywgaW5wdXQpKTtcbiAgfTtcblxuICByZXR1cm4gWFByb21hcDtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hwcm9tYXAoZiwgZykge1xuICByZXR1cm4gZnVuY3Rpb24gKHhmKSB7XG4gICAgcmV0dXJuIG5ldyBYUHJvbWFwKGYsIGcsIHhmKTtcbiAgfTtcbn0iLCJpbXBvcnQgX2Nsb25lIGZyb20gXCIuL19jbG9uZS5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vX2hhcy5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xuXG52YXIgWFJlZHVjZUJ5ID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWFJlZHVjZUJ5KHZhbHVlRm4sIHZhbHVlQWNjLCBrZXlGbiwgeGYpIHtcbiAgICB0aGlzLnZhbHVlRm4gPSB2YWx1ZUZuO1xuICAgIHRoaXMudmFsdWVBY2MgPSB2YWx1ZUFjYztcbiAgICB0aGlzLmtleUZuID0ga2V5Rm47XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuaW5wdXRzID0ge307XG4gIH1cblxuICBYUmVkdWNlQnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuXG4gIFhSZWR1Y2VCeS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICB2YXIga2V5O1xuXG4gICAgZm9yIChrZXkgaW4gdGhpcy5pbnB1dHMpIHtcbiAgICAgIGlmIChfaGFzKGtleSwgdGhpcy5pbnB1dHMpKSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCB0aGlzLmlucHV0c1trZXldKTtcblxuICAgICAgICBpZiAocmVzdWx0WydAQHRyYW5zZHVjZXIvcmVkdWNlZCddKSB7XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0WydAQHRyYW5zZHVjZXIvdmFsdWUnXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaW5wdXRzID0gbnVsbDtcbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH07XG5cbiAgWFJlZHVjZUJ5LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgdmFyIGtleSA9IHRoaXMua2V5Rm4oaW5wdXQpO1xuICAgIHRoaXMuaW5wdXRzW2tleV0gPSB0aGlzLmlucHV0c1trZXldIHx8IFtrZXksIF9jbG9uZSh0aGlzLnZhbHVlQWNjLCBmYWxzZSldO1xuICAgIHRoaXMuaW5wdXRzW2tleV1bMV0gPSB0aGlzLnZhbHVlRm4odGhpcy5pbnB1dHNba2V5XVsxXSwgaW5wdXQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgcmV0dXJuIFhSZWR1Y2VCeTtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hyZWR1Y2VCeSh2YWx1ZUZuLCB2YWx1ZUFjYywga2V5Rm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWFJlZHVjZUJ5KHZhbHVlRm4sIHZhbHVlQWNjLCBrZXlGbiwgeGYpO1xuICB9O1xufSIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL19jdXJyeTMuanNcIjtcbmltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcbnZhciB0SW5pdCA9ICdAQHRyYW5zZHVjZXIvaW5pdCc7XG52YXIgdFN0ZXAgPSAnQEB0cmFuc2R1Y2VyL3N0ZXAnO1xuXG52YXIgWFNjYW4gPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYU2NhbihyZWR1Y2VyLCBhY2MsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IHJlZHVjZXI7XG4gICAgdGhpcy5hY2MgPSBhY2M7XG4gIH1cblxuICBYU2Nhbi5wcm90b3R5cGVbdEluaXRdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnhmW3RTdGVwXSh0aGlzLnhmW3RJbml0XSgpLCB0aGlzLmFjYyk7XG4gIH07XG5cbiAgWFNjYW4ucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcblxuICBYU2Nhbi5wcm90b3R5cGVbdFN0ZXBdID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAocmVzdWx0WydAQHRyYW5zZHVjZXIvcmVkdWNlZCddKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHRoaXMuYWNjID0gdGhpcy5mKHRoaXMuYWNjLCBpbnB1dCk7XG4gICAgcmV0dXJuIHRoaXMueGZbdFN0ZXBdKHJlc3VsdCwgdGhpcy5hY2MpO1xuICB9O1xuXG4gIHJldHVybiBYU2Nhbjtcbn0oKTtcblxudmFyIF94c2NhbiA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIF94c2NhbihyZWR1Y2VyLCBhY2MsIHhmKSB7XG4gIHJldHVybiBuZXcgWFNjYW4ocmVkdWNlciwgYWNjLCB4Zik7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgX3hzY2FuOyIsImltcG9ydCBfcmVkdWNlZCBmcm9tIFwiLi9fcmVkdWNlZC5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xuXG52YXIgWFRha2UgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYVGFrZShuLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLm4gPSBuO1xuICAgIHRoaXMuaSA9IDA7XG4gIH1cblxuICBYVGFrZS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhUYWtlLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gX3hmQmFzZS5yZXN1bHQ7XG5cbiAgWFRha2UucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICB0aGlzLmkgKz0gMTtcbiAgICB2YXIgcmV0ID0gdGhpcy5uID09PSAwID8gcmVzdWx0IDogdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KTtcbiAgICByZXR1cm4gdGhpcy5uID49IDAgJiYgdGhpcy5pID49IHRoaXMubiA/IF9yZWR1Y2VkKHJldCkgOiByZXQ7XG4gIH07XG5cbiAgcmV0dXJuIFhUYWtlO1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeHRha2Uobikge1xuICByZXR1cm4gZnVuY3Rpb24gKHhmKSB7XG4gICAgcmV0dXJuIG5ldyBYVGFrZShuLCB4Zik7XG4gIH07XG59IiwiaW1wb3J0IF9yZWR1Y2VkIGZyb20gXCIuL19yZWR1Y2VkLmpzXCI7XG5pbXBvcnQgX3hmQmFzZSBmcm9tIFwiLi9feGZCYXNlLmpzXCI7XG5cbnZhciBYVGFrZVdoaWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWFRha2VXaGlsZShmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICB9XG5cbiAgWFRha2VXaGlsZS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhUYWtlV2hpbGUucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcblxuICBYVGFrZVdoaWxlLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgcmV0dXJuIHRoaXMuZihpbnB1dCkgPyB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgaW5wdXQpIDogX3JlZHVjZWQocmVzdWx0KTtcbiAgfTtcblxuICByZXR1cm4gWFRha2VXaGlsZTtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3h0YWtlV2hpbGUoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKHhmKSB7XG4gICAgcmV0dXJuIG5ldyBYVGFrZVdoaWxlKGYsIHhmKTtcbiAgfTtcbn0iLCJpbXBvcnQgX3hmQmFzZSBmcm9tIFwiLi9feGZCYXNlLmpzXCI7XG5cbnZhciBYVGFwID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWFRhcChmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICB9XG5cbiAgWFRhcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhUYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcblxuICBYVGFwLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgdGhpcy5mKGlucHV0KTtcbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KTtcbiAgfTtcblxuICByZXR1cm4gWFRhcDtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3h0YXAoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKHhmKSB7XG4gICAgcmV0dXJuIG5ldyBYVGFwKGYsIHhmKTtcbiAgfTtcbn0iLCJpbXBvcnQgX1NldCBmcm9tIFwiLi9fU2V0LmpzXCI7XG5pbXBvcnQgX3hmQmFzZSBmcm9tIFwiLi9feGZCYXNlLmpzXCI7XG5cbnZhciBYVW5pcUJ5ID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWFVuaXFCeShmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICAgIHRoaXMuc2V0ID0gbmV3IF9TZXQoKTtcbiAgfVxuXG4gIFhVbmlxQnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYVW5pcUJ5LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gX3hmQmFzZS5yZXN1bHQ7XG5cbiAgWFVuaXFCeS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLnNldC5hZGQodGhpcy5mKGlucHV0KSkgPyB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgaW5wdXQpIDogcmVzdWx0O1xuICB9O1xuXG4gIHJldHVybiBYVW5pcUJ5O1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeHVuaXFCeShmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhVbmlxQnkoZiwgeGYpO1xuICB9O1xufSIsImltcG9ydCBfaW5jbHVkZXNXaXRoIGZyb20gXCIuL19pbmNsdWRlc1dpdGguanNcIjtcbmltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcblxudmFyIFhVbmlxV2l0aCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhVbmlxV2l0aChwcmVkLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLnByZWQgPSBwcmVkO1xuICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgfVxuXG4gIFhVbmlxV2l0aC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhVbmlxV2l0aC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IF94ZkJhc2UucmVzdWx0O1xuXG4gIFhVbmlxV2l0aC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIGlmIChfaW5jbHVkZXNXaXRoKHRoaXMucHJlZCwgaW5wdXQsIHRoaXMuaXRlbXMpKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLml0ZW1zLnB1c2goaW5wdXQpO1xuICAgICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCBpbnB1dCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBYVW5pcVdpdGg7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94dW5pcVdpdGgocHJlZCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHhmKSB7XG4gICAgcmV0dXJuIG5ldyBYVW5pcVdpdGgocHJlZCwgeGYpO1xuICB9O1xufSIsInZhciBYV3JhcCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhXcmFwKGZuKSB7XG4gICAgdGhpcy5mID0gZm47XG4gIH1cblxuICBYV3JhcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbml0IG5vdCBpbXBsZW1lbnRlZCBvbiBYV3JhcCcpO1xuICB9O1xuXG4gIFhXcmFwLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24gKGFjYykge1xuICAgIHJldHVybiBhY2M7XG4gIH07XG5cbiAgWFdyYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKGFjYywgeCkge1xuICAgIHJldHVybiB0aGlzLmYoYWNjLCB4KTtcbiAgfTtcblxuICByZXR1cm4gWFdyYXA7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94d3JhcChmbikge1xuICByZXR1cm4gbmV3IFhXcmFwKGZuKTtcbn0iLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2ZpbHRlciBmcm9tIFwiLi9pbnRlcm5hbC9fZmlsdGVyLmpzXCI7XG5pbXBvcnQgX1NldCBmcm9tIFwiLi9pbnRlcm5hbC9fU2V0LmpzXCI7XG5pbXBvcnQgdW5pcSBmcm9tIFwiLi91bmlxLmpzXCI7XG4vKipcbiAqIENvbWJpbmVzIHR3byBsaXN0cyBpbnRvIGEgc2V0IChpLmUuIG5vIGR1cGxpY2F0ZXMpIGNvbXBvc2VkIG9mIHRob3NlXG4gKiBlbGVtZW50cyBjb21tb24gdG8gYm90aCBsaXN0cy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBbKl0gLT4gWypdIC0+IFsqXVxuICogQHBhcmFtIHtBcnJheX0gbGlzdDEgVGhlIGZpcnN0IGxpc3QuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MiBUaGUgc2Vjb25kIGxpc3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGxpc3Qgb2YgZWxlbWVudHMgZm91bmQgaW4gYm90aCBgbGlzdDFgIGFuZCBgbGlzdDJgLlxuICogQHNlZSBSLmlubmVySm9pblxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaW50ZXJzZWN0aW9uKFsxLDIsMyw0XSwgWzcsNiw1LDQsM10pOyAvLz0+IFs0LCAzXVxuICovXG5cbnZhciBpbnRlcnNlY3Rpb24gPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBpbnRlcnNlY3Rpb24obGlzdDEsIGxpc3QyKSB7XG4gIHZhciB0b0tlZXAgPSBuZXcgX1NldCgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdDEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0b0tlZXAuYWRkKGxpc3QxW2ldKTtcbiAgfVxuXG4gIHJldHVybiB1bmlxKF9maWx0ZXIodG9LZWVwLmhhcy5iaW5kKHRvS2VlcCksIGxpc3QyKSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgaW50ZXJzZWN0aW9uOyIsImltcG9ydCBfY2hlY2tGb3JNZXRob2QgZnJvbSBcIi4vaW50ZXJuYWwvX2NoZWNrRm9yTWV0aG9kLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbGlzdCB3aXRoIHRoZSBzZXBhcmF0b3IgaW50ZXJwb3NlZCBiZXR3ZWVuIGVsZW1lbnRzLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBpbnRlcnNwZXJzZWAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTQuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgYSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0geyp9IHNlcGFyYXRvciBUaGUgZWxlbWVudCB0byBhZGQgdG8gdGhlIGxpc3QuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIGJlIGludGVycG9zZWQuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIG5ldyBsaXN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaW50ZXJzcGVyc2UoJ2EnLCBbJ2InLCAnbicsICduJywgJ3MnXSk7IC8vPT4gWydiJywgJ2EnLCAnbicsICdhJywgJ24nLCAnYScsICdzJ11cbiAqL1xuXG52YXIgaW50ZXJzcGVyc2UgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5Mihcbi8qI19fUFVSRV9fKi9cbl9jaGVja0Zvck1ldGhvZCgnaW50ZXJzcGVyc2UnLCBmdW5jdGlvbiBpbnRlcnNwZXJzZShzZXBhcmF0b3IsIGxpc3QpIHtcbiAgdmFyIG91dCA9IFtdO1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuXG4gIHdoaWxlIChpZHggPCBsZW5ndGgpIHtcbiAgICBpZiAoaWR4ID09PSBsZW5ndGggLSAxKSB7XG4gICAgICBvdXQucHVzaChsaXN0W2lkeF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQucHVzaChsaXN0W2lkeF0sIHNlcGFyYXRvcik7XG4gICAgfVxuXG4gICAgaWR4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufSkpO1xuXG5leHBvcnQgZGVmYXVsdCBpbnRlcnNwZXJzZTsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgX2lzVHJhbnNmb3JtZXIgZnJvbSBcIi4vaW50ZXJuYWwvX2lzVHJhbnNmb3JtZXIuanNcIjtcbmltcG9ydCBfeFJlZHVjZSBmcm9tIFwiLi9pbnRlcm5hbC9feFJlZHVjZS5qc1wiO1xuaW1wb3J0IF9zdGVwQ2F0IGZyb20gXCIuL2ludGVybmFsL19zdGVwQ2F0LmpzXCI7XG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIGl0ZW1zIG9mIHRoZSBsaXN0IHdpdGggdGhlIHRyYW5zZHVjZXIgYW5kIGFwcGVuZHMgdGhlXG4gKiB0cmFuc2Zvcm1lZCBpdGVtcyB0byB0aGUgYWNjdW11bGF0b3IgdXNpbmcgYW4gYXBwcm9wcmlhdGUgaXRlcmF0b3IgZnVuY3Rpb25cbiAqIGJhc2VkIG9uIHRoZSBhY2N1bXVsYXRvciB0eXBlLlxuICpcbiAqIFRoZSBhY2N1bXVsYXRvciBjYW4gYmUgYW4gYXJyYXksIHN0cmluZywgb2JqZWN0IG9yIGEgdHJhbnNmb3JtZXIuIEl0ZXJhdGVkXG4gKiBpdGVtcyB3aWxsIGJlIGFwcGVuZGVkIHRvIGFycmF5cyBhbmQgY29uY2F0ZW5hdGVkIHRvIHN0cmluZ3MuIE9iamVjdHMgd2lsbFxuICogYmUgbWVyZ2VkIGRpcmVjdGx5IG9yIDItaXRlbSBhcnJheXMgd2lsbCBiZSBtZXJnZWQgYXMga2V5LCB2YWx1ZSBwYWlycy5cbiAqXG4gKiBUaGUgYWNjdW11bGF0b3IgY2FuIGFsc28gYmUgYSB0cmFuc2Zvcm1lciBvYmplY3QgdGhhdCBwcm92aWRlcyBhIDItYXJpdHlcbiAqIHJlZHVjaW5nIGl0ZXJhdG9yIGZ1bmN0aW9uLCBzdGVwLCAwLWFyaXR5IGluaXRpYWwgdmFsdWUgZnVuY3Rpb24sIGluaXQsIGFuZFxuICogMS1hcml0eSByZXN1bHQgZXh0cmFjdGlvbiBmdW5jdGlvbiByZXN1bHQuIFRoZSBzdGVwIGZ1bmN0aW9uIGlzIHVzZWQgYXMgdGhlXG4gKiBpdGVyYXRvciBmdW5jdGlvbiBpbiByZWR1Y2UuIFRoZSByZXN1bHQgZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0IHRoZVxuICogZmluYWwgYWNjdW11bGF0b3IgaW50byB0aGUgcmV0dXJuIHR5cGUgYW5kIGluIG1vc3QgY2FzZXMgaXMgUi5pZGVudGl0eS4gVGhlXG4gKiBpbml0IGZ1bmN0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW5pdGlhbCBhY2N1bXVsYXRvci5cbiAqXG4gKiBUaGUgaXRlcmF0aW9uIGlzIHBlcmZvcm1lZCB3aXRoIFtgUi5yZWR1Y2VgXSgjcmVkdWNlKSBhZnRlciBpbml0aWFsaXppbmcgdGhlXG4gKiB0cmFuc2R1Y2VyLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEyLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIGEgLT4gKGIgLT4gYikgLT4gW2NdIC0+IGFcbiAqIEBwYXJhbSB7Kn0gYWNjIFRoZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0geGYgVGhlIHRyYW5zZHVjZXIgZnVuY3Rpb24uIFJlY2VpdmVzIGEgdHJhbnNmb3JtZXIgYW5kIHJldHVybnMgYSB0cmFuc2Zvcm1lci5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybiB7Kn0gVGhlIGZpbmFsLCBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqIEBzZWUgUi50cmFuc2R1Y2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBudW1iZXJzID0gWzEsIDIsIDMsIDRdO1xuICogICAgICBjb25zdCB0cmFuc2R1Y2VyID0gUi5jb21wb3NlKFIubWFwKFIuYWRkKDEpKSwgUi50YWtlKDIpKTtcbiAqXG4gKiAgICAgIFIuaW50byhbXSwgdHJhbnNkdWNlciwgbnVtYmVycyk7IC8vPT4gWzIsIDNdXG4gKlxuICogICAgICBjb25zdCBpbnRvQXJyYXkgPSBSLmludG8oW10pO1xuICogICAgICBpbnRvQXJyYXkodHJhbnNkdWNlciwgbnVtYmVycyk7IC8vPT4gWzIsIDNdXG4gKi9cblxudmFyIGludG8gPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MyhmdW5jdGlvbiBpbnRvKGFjYywgdHJhbnNkdWNlciwgbGlzdCkge1xuICB2YXIgeGYgPSB0cmFuc2R1Y2VyKF9pc1RyYW5zZm9ybWVyKGFjYykgPyBhY2MgOiBfc3RlcENhdChhY2MpKTtcbiAgcmV0dXJuIF94UmVkdWNlKHhmLCB4ZlsnQEB0cmFuc2R1Y2VyL2luaXQnXSgpLCBsaXN0KTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBpbnRvOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL2ludGVybmFsL19oYXMuanNcIjtcbmltcG9ydCBrZXlzIGZyb20gXCIuL2tleXMuanNcIjtcbi8qKlxuICogU2FtZSBhcyBbYFIuaW52ZXJ0T2JqYF0oI2ludmVydE9iaiksIGhvd2V2ZXIgdGhpcyBhY2NvdW50cyBmb3Igb2JqZWN0cyB3aXRoXG4gKiBkdXBsaWNhdGUgdmFsdWVzIGJ5IHB1dHRpbmcgdGhlIHZhbHVlcyBpbnRvIGFuIGFycmF5LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjkuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7czogeH0gLT4ge3g6IFsgcywgLi4uIF19XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3Qgb3IgYXJyYXkgdG8gaW52ZXJ0XG4gKiBAcmV0dXJuIHtPYmplY3R9IG91dCBBIG5ldyBvYmplY3Qgd2l0aCBrZXlzIGluIGFuIGFycmF5LlxuICogQHNlZSBSLmludmVydE9ialxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHJhY2VSZXN1bHRzQnlGaXJzdE5hbWUgPSB7XG4gKiAgICAgICAgZmlyc3Q6ICdhbGljZScsXG4gKiAgICAgICAgc2Vjb25kOiAnamFrZScsXG4gKiAgICAgICAgdGhpcmQ6ICdhbGljZScsXG4gKiAgICAgIH07XG4gKiAgICAgIFIuaW52ZXJ0KHJhY2VSZXN1bHRzQnlGaXJzdE5hbWUpO1xuICogICAgICAvLz0+IHsgJ2FsaWNlJzogWydmaXJzdCcsICd0aGlyZCddLCAnamFrZSc6WydzZWNvbmQnXSB9XG4gKi9cblxudmFyIGludmVydCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIGludmVydChvYmopIHtcbiAgdmFyIHByb3BzID0ga2V5cyhvYmopO1xuICB2YXIgbGVuID0gcHJvcHMubGVuZ3RoO1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIG91dCA9IHt9O1xuXG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICB2YXIga2V5ID0gcHJvcHNbaWR4XTtcbiAgICB2YXIgdmFsID0gb2JqW2tleV07XG4gICAgdmFyIGxpc3QgPSBfaGFzKHZhbCwgb3V0KSA/IG91dFt2YWxdIDogb3V0W3ZhbF0gPSBbXTtcbiAgICBsaXN0W2xpc3QubGVuZ3RoXSA9IGtleTtcbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgaW52ZXJ0OyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBrZXlzIGZyb20gXCIuL2tleXMuanNcIjtcbi8qKlxuICogUmV0dXJucyBhIG5ldyBvYmplY3Qgd2l0aCB0aGUga2V5cyBvZiB0aGUgZ2l2ZW4gb2JqZWN0IGFzIHZhbHVlcywgYW5kIHRoZVxuICogdmFsdWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsIHdoaWNoIGFyZSBjb2VyY2VkIHRvIHN0cmluZ3MsIGFzIGtleXMuIE5vdGVcbiAqIHRoYXQgdGhlIGxhc3Qga2V5IGZvdW5kIGlzIHByZWZlcnJlZCB3aGVuIGhhbmRsaW5nIHRoZSBzYW1lIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjkuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7czogeH0gLT4ge3g6IHN9XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3Qgb3IgYXJyYXkgdG8gaW52ZXJ0XG4gKiBAcmV0dXJuIHtPYmplY3R9IG91dCBBIG5ldyBvYmplY3RcbiAqIEBzZWUgUi5pbnZlcnRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCByYWNlUmVzdWx0cyA9IHtcbiAqICAgICAgICBmaXJzdDogJ2FsaWNlJyxcbiAqICAgICAgICBzZWNvbmQ6ICdqYWtlJ1xuICogICAgICB9O1xuICogICAgICBSLmludmVydE9iaihyYWNlUmVzdWx0cyk7XG4gKiAgICAgIC8vPT4geyAnYWxpY2UnOiAnZmlyc3QnLCAnamFrZSc6J3NlY29uZCcgfVxuICpcbiAqICAgICAgLy8gQWx0ZXJuYXRpdmVseTpcbiAqICAgICAgY29uc3QgcmFjZVJlc3VsdHMgPSBbJ2FsaWNlJywgJ2pha2UnXTtcbiAqICAgICAgUi5pbnZlcnRPYmoocmFjZVJlc3VsdHMpO1xuICogICAgICAvLz0+IHsgJ2FsaWNlJzogJzAnLCAnamFrZSc6JzEnIH1cbiAqL1xuXG52YXIgaW52ZXJ0T2JqID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoZnVuY3Rpb24gaW52ZXJ0T2JqKG9iaikge1xuICB2YXIgcHJvcHMgPSBrZXlzKG9iaik7XG4gIHZhciBsZW4gPSBwcm9wcy5sZW5ndGg7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgb3V0ID0ge307XG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIHZhciBrZXkgPSBwcm9wc1tpZHhdO1xuICAgIG91dFtvYmpba2V5XV0gPSBrZXk7XG4gICAgaWR4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGludmVydE9iajsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2lzRnVuY3Rpb24gZnJvbSBcIi4vaW50ZXJuYWwvX2lzRnVuY3Rpb24uanNcIjtcbmltcG9ydCBjdXJyeU4gZnJvbSBcIi4vY3VycnlOLmpzXCI7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSBcIi4vdG9TdHJpbmcuanNcIjtcbi8qKlxuICogR2l2ZW4gYW4gYGFyaXR5YCAoTnVtYmVyKSBhbmQgYSBgbmFtZWAgKFN0cmluZykgdGhlIGBpbnZva2VyYCBmdW5jdGlvblxuICogcmV0dXJucyBhIGN1cnJpZWQgZnVuY3Rpb24gdGhhdCB0YWtlcyBgYXJpdHlgIGFyZ3VtZW50cyBhbmQgYSBgY29udGV4dGBcbiAqIG9iamVjdC4gSXQgd2lsbCBcImludm9rZVwiIHRoZSBgbmFtZWAnZCBmdW5jdGlvbiAoYSBtZXRob2QpIG9uIHRoZSBgY29udGV4dGBcbiAqIG9iamVjdC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBOdW1iZXIgLT4gU3RyaW5nIC0+IChhIC0+IGIgLT4gLi4uIC0+IG4gLT4gT2JqZWN0IC0+ICopXG4gKiBAcGFyYW0ge051bWJlcn0gYXJpdHkgTnVtYmVyIG9mIGFyZ3VtZW50cyB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gc2hvdWxkIHRha2VcbiAqICAgICAgICBiZWZvcmUgdGhlIHRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kIE5hbWUgb2YgYW55IG9mIHRoZSB0YXJnZXQgb2JqZWN0J3MgbWV0aG9kcyB0byBjYWxsLlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgbmV3IGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAc2VlIFIuY29uc3RydWN0XG4gKiBAZXhhbXBsZVxuICogICAgICAvLyBBIGZ1bmN0aW9uIHdpdGggbm8gYXJndW1lbnRzXG4gKiAgICAgIGNvbnN0IGFzSnNvbiA9IGludm9rZXIoMCwgXCJqc29uXCIpXG4gKiAgICAgIC8vIEp1c3QgbGlrZSBjYWxsaW5nIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuanNvbigpKVxuICogICAgICBmZXRjaChcImh0dHA6Ly9leGFtcGxlLmNvbS9pbmRleC5qc29uXCIpLnRoZW4oYXNKc29uKVxuICpcbiAqICAgICAgLy8gQSBmdW5jdGlvbiB3aXRoIG9uZSBhcmd1bWVudFxuICogICAgICBjb25zdCBzbGljZUZyb20gPSBpbnZva2VyKDEsICdzbGljZScpO1xuICogICAgICBzbGljZUZyb20oNiwgJ2FiY2RlZmdoaWprbG0nKTsgLy89PiAnZ2hpamtsbSdcbiAqXG4gKiAgICAgIC8vIEEgZnVuY3Rpb24gd2l0aCB0d28gYXJndW1lbnRzXG4gKiAgICAgIGNvbnN0IHNsaWNlRnJvbTYgPSBpbnZva2VyKDIsICdzbGljZScpKDYpO1xuICogICAgICBzbGljZUZyb202KDgsICdhYmNkZWZnaGlqa2xtJyk7IC8vPT4gJ2doJ1xuICpcbiAqICAgICAgLy8gTk9URTogWW91IGNhbid0IHNpbXBseSBwYXNzIHNvbWUgb2YgdGhlIGFyZ3VtZW50cyB0byB0aGUgaW5pdGlhbCBpbnZva2VyIGZ1bmN0aW9uLlxuICogICAgICBjb25zdCBmaXJzdENyZWRpdENhcmRTZWN0aW9uID0gaW52b2tlcigyLCBcInNsaWNlXCIsIDAsIDQpXG4gKiAgICAgIGZpcnN0Q3JlZGl0Q2FyZFNlY3Rpb24oXCI0MjQyIDQyNDIgNDI0MiA0MjQyXCIpIC8vID0+IEZ1bmN0aW9uPC4uLj5cbiAqXG4gKiAgICAgIC8vIFNpbmNlIGludm9rZXIgcmV0dXJucyBhIGN1cnJpZWQgZnVuY3Rpb24sIHlvdSBtYXkgcGFydGlhbGx5IGFwcGx5IGl0IHRvIGNyZWF0ZSB0aGUgZnVuY3Rpb24geW91IG5lZWQuXG4gKiAgICAgIGNvbnN0IGZpcnN0Q3JlZGl0Q2FyZFNlY3Rpb24gPSBpbnZva2VyKDIsIFwic2xpY2VcIikoMCwgNClcbiAqICAgICAgZmlyc3RDcmVkaXRDYXJkU2VjdGlvbihcIjQyNDIgNDI0MiA0MjQyIDQyNDJcIikgLy8gPT4gXCI0MjQyXCJcbiAqXG4gKiBAc3ltYiBSLmludm9rZXIoMCwgJ21ldGhvZCcpKG8pID0gb1snbWV0aG9kJ10oKVxuICogQHN5bWIgUi5pbnZva2VyKDEsICdtZXRob2QnKShhLCBvKSA9IG9bJ21ldGhvZCddKGEpXG4gKiBAc3ltYiBSLmludm9rZXIoMiwgJ21ldGhvZCcpKGEsIGIsIG8pID0gb1snbWV0aG9kJ10oYSwgYilcbiAqL1xuXG52YXIgaW52b2tlciA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIGludm9rZXIoYXJpdHksIG1ldGhvZCkge1xuICByZXR1cm4gY3VycnlOKGFyaXR5ICsgMSwgZnVuY3Rpb24gKCkge1xuICAgIHZhciB0YXJnZXQgPSBhcmd1bWVudHNbYXJpdHldO1xuXG4gICAgaWYgKHRhcmdldCAhPSBudWxsICYmIF9pc0Z1bmN0aW9uKHRhcmdldFttZXRob2RdKSkge1xuICAgICAgcmV0dXJuIHRhcmdldFttZXRob2RdLmFwcGx5KHRhcmdldCwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCBhcml0eSkpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IodG9TdHJpbmcodGFyZ2V0KSArICcgZG9lcyBub3QgaGF2ZSBhIG1ldGhvZCBuYW1lZCBcIicgKyBtZXRob2QgKyAnXCInKTtcbiAgfSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgaW52b2tlcjsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIFNlZSBpZiBhbiBvYmplY3QgKGkuZS4gYHZhbGApIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBzdXBwbGllZCBjb25zdHJ1Y3Rvci4gVGhpc1xuICogZnVuY3Rpb24gd2lsbCBjaGVjayB1cCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4sIGlmIGFueS5cbiAqIElmIGB2YWxgIHdhcyBjcmVhdGVkIHVzaW5nIGBPYmplY3QuY3JlYXRlYCwgYFIuaXMoT2JqZWN0LCB2YWwpID09PSB0cnVlYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4zLjBcbiAqIEBjYXRlZ29yeSBUeXBlXG4gKiBAc2lnICgqIC0+IHsqfSkgLT4gYSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge09iamVjdH0gY3RvciBBIGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmlzKE9iamVjdCwge30pOyAvLz0+IHRydWVcbiAqICAgICAgUi5pcyhOdW1iZXIsIDEpOyAvLz0+IHRydWVcbiAqICAgICAgUi5pcyhPYmplY3QsIDEpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXMoU3RyaW5nLCAncycpOyAvLz0+IHRydWVcbiAqICAgICAgUi5pcyhTdHJpbmcsIG5ldyBTdHJpbmcoJycpKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaXMoT2JqZWN0LCBuZXcgU3RyaW5nKCcnKSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzKE9iamVjdCwgJ3MnKTsgLy89PiBmYWxzZVxuICogICAgICBSLmlzKE51bWJlciwge30pOyAvLz0+IGZhbHNlXG4gKi9cblxudmFyIGlzID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gaXMoQ3RvciwgdmFsKSB7XG4gIHJldHVybiB2YWwgaW5zdGFuY2VvZiBDdG9yIHx8IHZhbCAhPSBudWxsICYmICh2YWwuY29uc3RydWN0b3IgPT09IEN0b3IgfHwgQ3Rvci5uYW1lID09PSAnT2JqZWN0JyAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jyk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgaXM7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IGVtcHR5IGZyb20gXCIuL2VtcHR5LmpzXCI7XG5pbXBvcnQgZXF1YWxzIGZyb20gXCIuL2VxdWFscy5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgaXRzIHR5cGUncyBlbXB0eSB2YWx1ZTsgYGZhbHNlYFxuICogb3RoZXJ3aXNlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExvZ2ljXG4gKiBAc2lnIGEgLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSB4XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHNlZSBSLmVtcHR5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pc0VtcHR5KFsxLCAyLCAzXSk7ICAgICAgICAgICAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXNFbXB0eShbXSk7ICAgICAgICAgICAgICAgICAgLy89PiB0cnVlXG4gKiAgICAgIFIuaXNFbXB0eSgnJyk7ICAgICAgICAgICAgICAgICAgLy89PiB0cnVlXG4gKiAgICAgIFIuaXNFbXB0eShudWxsKTsgICAgICAgICAgICAgICAgLy89PiBmYWxzZVxuICogICAgICBSLmlzRW1wdHkoe30pOyAgICAgICAgICAgICAgICAgIC8vPT4gdHJ1ZVxuICogICAgICBSLmlzRW1wdHkoe2xlbmd0aDogMH0pOyAgICAgICAgIC8vPT4gZmFsc2VcbiAqICAgICAgUi5pc0VtcHR5KFVpbnQ4QXJyYXkuZnJvbSgnJykpOyAvLz0+IHRydWVcbiAqL1xuXG52YXIgaXNFbXB0eSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIGlzRW1wdHkoeCkge1xuICByZXR1cm4geCAhPSBudWxsICYmIGVxdWFscyh4LCBlbXB0eSh4KSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgaXNFbXB0eTsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG4vKipcbiAqIENoZWNrcyBpZiB0aGUgaW5wdXQgdmFsdWUgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjkuMFxuICogQGNhdGVnb3J5IFR5cGVcbiAqIEBzaWcgKiAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IHggVGhlIHZhbHVlIHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgYHhgIGlzIGB1bmRlZmluZWRgIG9yIGBudWxsYCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pc05pbChudWxsKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaXNOaWwodW5kZWZpbmVkKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaXNOaWwoMCk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5pc05pbChbXSk7IC8vPT4gZmFsc2VcbiAqL1xuXG52YXIgaXNOaWwgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiBpc05pbCh4KSB7XG4gIHJldHVybiB4ID09IG51bGw7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgaXNOaWw7IiwiaW1wb3J0IGlzTmlsIGZyb20gXCIuL2lzTmlsLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG4vKipcbiAqIENoZWNrcyBpZiB0aGUgaW5wdXQgdmFsdWUgaXMgbm90IGBudWxsYCBhbmQgbm90IGB1bmRlZmluZWRgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI5LjBcbiAqIEBjYXRlZ29yeSBUeXBlXG4gKiBAc2lnICogLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSB4IFRoZSB2YWx1ZSB0byB0ZXN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB4YCBpcyBub3QgYHVuZGVmaW5lZGAgb3Igbm90IGBudWxsYCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pc05vdE5pbChudWxsKTsgLy89PiBmYWxzZVxuICogICAgICBSLmlzTm90TmlsKHVuZGVmaW5lZCk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5pc05vdE5pbCgwKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaXNOb3ROaWwoW10pOyAvLz0+IHRydWVcbiAqL1xuXG52YXIgaXNOb3ROaWwgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiBpc05vdE5pbCh4KSB7XG4gIHJldHVybiAhaXNOaWwoeCk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgaXNOb3ROaWw7IiwiaW1wb3J0IGludm9rZXIgZnJvbSBcIi4vaW52b2tlci5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIG1hZGUgYnkgaW5zZXJ0aW5nIHRoZSBgc2VwYXJhdG9yYCBiZXR3ZWVuIGVhY2ggZWxlbWVudCBhbmRcbiAqIGNvbmNhdGVuYXRpbmcgYWxsIHRoZSBlbGVtZW50cyBpbnRvIGEgc2luZ2xlIHN0cmluZy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFN0cmluZyAtPiBbYV0gLT4gU3RyaW5nXG4gKiBAcGFyYW0ge051bWJlcnxTdHJpbmd9IHNlcGFyYXRvciBUaGUgc3RyaW5nIHVzZWQgdG8gc2VwYXJhdGUgdGhlIGVsZW1lbnRzLlxuICogQHBhcmFtIHtBcnJheX0geHMgVGhlIGVsZW1lbnRzIHRvIGpvaW4gaW50byBhIHN0cmluZy5cbiAqIEByZXR1cm4ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgbWFkZSBieSBjb25jYXRlbmF0aW5nIGB4c2Agd2l0aCBgc2VwYXJhdG9yYC5cbiAqIEBzZWUgUi5zcGxpdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHNwYWNlciA9IFIuam9pbignICcpO1xuICogICAgICBzcGFjZXIoWydhJywgMiwgMy40XSk7ICAgLy89PiAnYSAyIDMuNCdcbiAqICAgICAgUi5qb2luKCd8JywgWzEsIDIsIDNdKTsgICAgLy89PiAnMXwyfDMnXG4gKi9cblxudmFyIGpvaW4gPVxuLyojX19QVVJFX18qL1xuaW52b2tlcigxLCAnam9pbicpO1xuZXhwb3J0IGRlZmF1bHQgam9pbjsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgY29udmVyZ2UgZnJvbSBcIi4vY29udmVyZ2UuanNcIjtcbi8qKlxuICoganV4dCBhcHBsaWVzIGEgbGlzdCBvZiBmdW5jdGlvbnMgdG8gYSBsaXN0IG9mIHZhbHVlcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgWyhhLCBiLCAuLi4sIG0pIC0+IG5dIC0+ICgoYSwgYiwgLi4uLCBtKSAtPiBbbl0pXG4gKiBAcGFyYW0ge0FycmF5fSBmbnMgQW4gYXJyYXkgb2YgZnVuY3Rpb25zXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBsaXN0IG9mIHZhbHVlcyBhZnRlciBhcHBseWluZyBlYWNoIG9mIHRoZSBvcmlnaW5hbCBgZm5zYCB0byBpdHMgcGFyYW1ldGVycy5cbiAqIEBzZWUgUi5hcHBseVNwZWNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBnZXRSYW5nZSA9IFIuanV4dChbTWF0aC5taW4sIE1hdGgubWF4XSk7XG4gKiAgICAgIGdldFJhbmdlKDMsIDQsIDksIC0zKTsgLy89PiBbLTMsIDldXG4gKiBAc3ltYiBSLmp1eHQoW2YsIGcsIGhdKShhLCBiKSA9IFtmKGEsIGIpLCBnKGEsIGIpLCBoKGEsIGIpXVxuICovXG5cbnZhciBqdXh0ID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoZnVuY3Rpb24ganV4dChmbnMpIHtcbiAgcmV0dXJuIGNvbnZlcmdlKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgfSwgZm5zKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBqdXh0OyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL2ludGVybmFsL19oYXMuanNcIjtcbmltcG9ydCBfaXNBcmd1bWVudHMgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJndW1lbnRzLmpzXCI7IC8vIGNvdmVyIElFIDwgOSBrZXlzIGlzc3Vlc1xuXG52YXIgaGFzRW51bUJ1ZyA9ICFcbi8qI19fUFVSRV9fKi9cbntcbiAgdG9TdHJpbmc6IG51bGxcbn0ucHJvcGVydHlJc0VudW1lcmFibGUoJ3RvU3RyaW5nJyk7XG52YXIgbm9uRW51bWVyYWJsZVByb3BzID0gWydjb25zdHJ1Y3RvcicsICd2YWx1ZU9mJywgJ2lzUHJvdG90eXBlT2YnLCAndG9TdHJpbmcnLCAncHJvcGVydHlJc0VudW1lcmFibGUnLCAnaGFzT3duUHJvcGVydHknLCAndG9Mb2NhbGVTdHJpbmcnXTsgLy8gU2FmYXJpIGJ1Z1xuXG52YXIgaGFzQXJnc0VudW1CdWcgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5wcm9wZXJ0eUlzRW51bWVyYWJsZSgnbGVuZ3RoJyk7XG59KCk7XG5cbnZhciBjb250YWlucyA9IGZ1bmN0aW9uIGNvbnRhaW5zKGxpc3QsIGl0ZW0pIHtcbiAgdmFyIGlkeCA9IDA7XG5cbiAgd2hpbGUgKGlkeCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgaWYgKGxpc3RbaWR4XSA9PT0gaXRlbSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWR4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuLyoqXG4gKiBSZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgb2ZcbiAqIHRoZSBzdXBwbGllZCBvYmplY3QuXG4gKiBOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBvdXRwdXQgYXJyYXkgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgY29uc2lzdGVudFxuICogYWNyb3NzIGRpZmZlcmVudCBKUyBwbGF0Zm9ybXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHtrOiB2fSAtPiBba11cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBleHRyYWN0IHByb3BlcnRpZXMgZnJvbVxuICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHRoZSBvYmplY3QncyBvd24gcHJvcGVydGllcy5cbiAqIEBzZWUgUi5rZXlzSW4sIFIudmFsdWVzLCBSLnRvUGFpcnNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmtleXMoe2E6IDEsIGI6IDIsIGM6IDN9KTsgLy89PiBbJ2EnLCAnYicsICdjJ11cbiAqL1xuXG5cbnZhciBrZXlzID0gdHlwZW9mIE9iamVjdC5rZXlzID09PSAnZnVuY3Rpb24nICYmICFoYXNBcmdzRW51bUJ1ZyA/XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIGtleXMob2JqKSB7XG4gIHJldHVybiBPYmplY3Qob2JqKSAhPT0gb2JqID8gW10gOiBPYmplY3Qua2V5cyhvYmopO1xufSkgOlxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiBrZXlzKG9iaikge1xuICBpZiAoT2JqZWN0KG9iaikgIT09IG9iaikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHZhciBwcm9wLCBuSWR4O1xuICB2YXIga3MgPSBbXTtcblxuICB2YXIgY2hlY2tBcmdzTGVuZ3RoID0gaGFzQXJnc0VudW1CdWcgJiYgX2lzQXJndW1lbnRzKG9iaik7XG5cbiAgZm9yIChwcm9wIGluIG9iaikge1xuICAgIGlmIChfaGFzKHByb3AsIG9iaikgJiYgKCFjaGVja0FyZ3NMZW5ndGggfHwgcHJvcCAhPT0gJ2xlbmd0aCcpKSB7XG4gICAgICBrc1trcy5sZW5ndGhdID0gcHJvcDtcbiAgICB9XG4gIH1cblxuICBpZiAoaGFzRW51bUJ1Zykge1xuICAgIG5JZHggPSBub25FbnVtZXJhYmxlUHJvcHMubGVuZ3RoIC0gMTtcblxuICAgIHdoaWxlIChuSWR4ID49IDApIHtcbiAgICAgIHByb3AgPSBub25FbnVtZXJhYmxlUHJvcHNbbklkeF07XG5cbiAgICAgIGlmIChfaGFzKHByb3AsIG9iaikgJiYgIWNvbnRhaW5zKGtzLCBwcm9wKSkge1xuICAgICAgICBrc1trcy5sZW5ndGhdID0gcHJvcDtcbiAgICAgIH1cblxuICAgICAgbklkeCAtPSAxO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBrcztcbn0pO1xuZXhwb3J0IGRlZmF1bHQga2V5czsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSBsaXN0IGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGFsbCB0aGUgcHJvcGVydGllcyBvZiB0aGUgc3VwcGxpZWRcbiAqIG9iamVjdCwgaW5jbHVkaW5nIHByb3RvdHlwZSBwcm9wZXJ0aWVzLlxuICogTm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgb3V0cHV0IGFycmF5IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbnNpc3RlbnRcbiAqIGFjcm9zcyBkaWZmZXJlbnQgSlMgcGxhdGZvcm1zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7azogdn0gLT4gW2tdXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gZXh0cmFjdCBwcm9wZXJ0aWVzIGZyb21cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiB0aGUgb2JqZWN0J3Mgb3duIGFuZCBwcm90b3R5cGUgcHJvcGVydGllcy5cbiAqIEBzZWUgUi5rZXlzLCBSLnZhbHVlc0luXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgRiA9IGZ1bmN0aW9uKCkgeyB0aGlzLnggPSAnWCc7IH07XG4gKiAgICAgIEYucHJvdG90eXBlLnkgPSAnWSc7XG4gKiAgICAgIGNvbnN0IGYgPSBuZXcgRigpO1xuICogICAgICBSLmtleXNJbihmKTsgLy89PiBbJ3gnLCAneSddXG4gKi9cblxudmFyIGtleXNJbiA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIGtleXNJbihvYmopIHtcbiAgdmFyIHByb3A7XG4gIHZhciBrcyA9IFtdO1xuXG4gIGZvciAocHJvcCBpbiBvYmopIHtcbiAgICBrc1trcy5sZW5ndGhdID0gcHJvcDtcbiAgfVxuXG4gIHJldHVybiBrcztcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBrZXlzSW47IiwiaW1wb3J0IG50aCBmcm9tIFwiLi9udGguanNcIjtcbi8qKlxuICogUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBnaXZlbiBsaXN0IG9yIHN0cmluZy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjRcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBhIHwgVW5kZWZpbmVkXG4gKiBAc2lnIFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5pbml0LCBSLmhlYWQsIFIudGFpbFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIubGFzdChbJ2ZpJywgJ2ZvJywgJ2Z1bSddKTsgLy89PiAnZnVtJ1xuICogICAgICBSLmxhc3QoW10pOyAvLz0+IHVuZGVmaW5lZFxuICpcbiAqICAgICAgUi5sYXN0KCdhYmMnKTsgLy89PiAnYydcbiAqICAgICAgUi5sYXN0KCcnKTsgLy89PiAnJ1xuICovXG5cbnZhciBsYXN0ID1cbi8qI19fUFVSRV9fKi9cbm50aCgtMSk7XG5leHBvcnQgZGVmYXVsdCBsYXN0OyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaXNBcnJheSBmcm9tIFwiLi9pbnRlcm5hbC9faXNBcnJheS5qc1wiO1xuaW1wb3J0IGVxdWFscyBmcm9tIFwiLi9lcXVhbHMuanNcIjtcbi8qKlxuICogUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBhbiBpdGVtIGluIGFuIGFycmF5LCBvciAtMSBpZlxuICogdGhlIGl0ZW0gaXMgbm90IGluY2x1ZGVkIGluIHRoZSBhcnJheS4gW2BSLmVxdWFsc2BdKCNlcXVhbHMpIGlzIHVzZWQgdG9cbiAqIGRldGVybWluZSBlcXVhbGl0eS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIGEgLT4gW2FdIC0+IE51bWJlclxuICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIGl0ZW0gdG8gZmluZC5cbiAqIEBwYXJhbSB7QXJyYXl9IHhzIFRoZSBhcnJheSB0byBzZWFyY2ggaW4uXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBpbmRleCBvZiB0aGUgdGFyZ2V0LCBvciAtMSBpZiB0aGUgdGFyZ2V0IGlzIG5vdCBmb3VuZC5cbiAqIEBzZWUgUi5pbmRleE9mLCBSLmZpbmRMYXN0SW5kZXhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmxhc3RJbmRleE9mKDMsIFstMSwzLDMsMCwxLDIsMyw0XSk7IC8vPT4gNlxuICogICAgICBSLmxhc3RJbmRleE9mKDEwLCBbMSwyLDMsNF0pOyAvLz0+IC0xXG4gKi9cblxudmFyIGxhc3RJbmRleE9mID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gbGFzdEluZGV4T2YodGFyZ2V0LCB4cykge1xuICBpZiAodHlwZW9mIHhzLmxhc3RJbmRleE9mID09PSAnZnVuY3Rpb24nICYmICFfaXNBcnJheSh4cykpIHtcbiAgICByZXR1cm4geHMubGFzdEluZGV4T2YodGFyZ2V0KTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgaWR4ID0geHMubGVuZ3RoIC0gMTtcblxuICAgIHdoaWxlIChpZHggPj0gMCkge1xuICAgICAgaWYgKGVxdWFscyh4c1tpZHhdLCB0YXJnZXQpKSB7XG4gICAgICAgIHJldHVybiBpZHg7XG4gICAgICB9XG5cbiAgICAgIGlkeCAtPSAxO1xuICAgIH1cblxuICAgIHJldHVybiAtMTtcbiAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGxhc3RJbmRleE9mOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaXNOdW1iZXIgZnJvbSBcIi4vaW50ZXJuYWwvX2lzTnVtYmVyLmpzXCI7XG4vKipcbiAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkgYnkgcmV0dXJuaW5nIGBsaXN0Lmxlbmd0aGAuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMy4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gTnVtYmVyXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHJldHVybiB7TnVtYmVyfSBUaGUgbGVuZ3RoIG9mIHRoZSBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmxlbmd0aChbXSk7IC8vPT4gMFxuICogICAgICBSLmxlbmd0aChbMSwgMiwgM10pOyAvLz0+IDNcbiAqL1xuXG52YXIgbGVuZ3RoID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoZnVuY3Rpb24gbGVuZ3RoKGxpc3QpIHtcbiAgcmV0dXJuIGxpc3QgIT0gbnVsbCAmJiBfaXNOdW1iZXIobGlzdC5sZW5ndGgpID8gbGlzdC5sZW5ndGggOiBOYU47XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgbGVuZ3RoOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBtYXAgZnJvbSBcIi4vbWFwLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSBsZW5zIGZvciB0aGUgZ2l2ZW4gZ2V0dGVyIGFuZCBzZXR0ZXIgZnVuY3Rpb25zLiBUaGUgZ2V0dGVyIFwiZ2V0c1wiXG4gKiB0aGUgdmFsdWUgb2YgdGhlIGZvY3VzOyB0aGUgc2V0dGVyIFwic2V0c1wiIHRoZSB2YWx1ZSBvZiB0aGUgZm9jdXMuIFRoZSBzZXR0ZXJcbiAqIHNob3VsZCBub3QgbXV0YXRlIHRoZSBkYXRhIHN0cnVjdHVyZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC44LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIChzIC0+IGEpIC0+ICgoYSwgcykgLT4gcykgLT4gTGVucyBzIGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGdldHRlclxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyXG4gKiBAcmV0dXJuIHtMZW5zfVxuICogQHNlZSBSLnZpZXcsIFIuc2V0LCBSLm92ZXIsIFIubGVuc0luZGV4LCBSLmxlbnNQcm9wXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgeExlbnMgPSBSLmxlbnMoUi5wcm9wKCd4JyksIFIuYXNzb2MoJ3gnKSk7XG4gKlxuICogICAgICBSLnZpZXcoeExlbnMsIHt4OiAxLCB5OiAyfSk7ICAgICAgICAgICAgLy89PiAxXG4gKiAgICAgIFIuc2V0KHhMZW5zLCA0LCB7eDogMSwgeTogMn0pOyAgICAgICAgICAvLz0+IHt4OiA0LCB5OiAyfVxuICogICAgICBSLm92ZXIoeExlbnMsIFIubmVnYXRlLCB7eDogMSwgeTogMn0pOyAgLy89PiB7eDogLTEsIHk6IDJ9XG4gKi9cblxudmFyIGxlbnMgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBsZW5zKGdldHRlciwgc2V0dGVyKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodG9GdW5jdG9yRm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgcmV0dXJuIG1hcChmdW5jdGlvbiAoZm9jdXMpIHtcbiAgICAgICAgcmV0dXJuIHNldHRlcihmb2N1cywgdGFyZ2V0KTtcbiAgICAgIH0sIHRvRnVuY3RvckZuKGdldHRlcih0YXJnZXQpKSk7XG4gICAgfTtcbiAgfTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBsZW5zOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBsZW5zIGZyb20gXCIuL2xlbnMuanNcIjtcbmltcG9ydCBudGggZnJvbSBcIi4vbnRoLmpzXCI7XG5pbXBvcnQgdXBkYXRlIGZyb20gXCIuL3VwZGF0ZS5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgbGVucyB3aG9zZSBmb2N1cyBpcyB0aGUgc3BlY2lmaWVkIGluZGV4LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE0LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIE51bWJlciAtPiBMZW5zIHMgYVxuICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAqIEByZXR1cm4ge0xlbnN9XG4gKiBAc2VlIFIudmlldywgUi5zZXQsIFIub3ZlciwgUi5udGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBoZWFkTGVucyA9IFIubGVuc0luZGV4KDApO1xuICpcbiAqICAgICAgUi52aWV3KGhlYWRMZW5zLCBbJ2EnLCAnYicsICdjJ10pOyAgICAgICAgICAgIC8vPT4gJ2EnXG4gKiAgICAgIFIuc2V0KGhlYWRMZW5zLCAneCcsIFsnYScsICdiJywgJ2MnXSk7ICAgICAgICAvLz0+IFsneCcsICdiJywgJ2MnXVxuICogICAgICBSLm92ZXIoaGVhZExlbnMsIFIudG9VcHBlciwgWydhJywgJ2InLCAnYyddKTsgLy89PiBbJ0EnLCAnYicsICdjJ11cbiAqL1xuXG52YXIgbGVuc0luZGV4ID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoZnVuY3Rpb24gbGVuc0luZGV4KG4pIHtcbiAgcmV0dXJuIGxlbnMobnRoKG4pLCB1cGRhdGUobikpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGxlbnNJbmRleDsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgYXNzb2NQYXRoIGZyb20gXCIuL2Fzc29jUGF0aC5qc1wiO1xuaW1wb3J0IGxlbnMgZnJvbSBcIi4vbGVucy5qc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIi4vcGF0aC5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgbGVucyB3aG9zZSBmb2N1cyBpcyB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludCB8IFN5bWJvbFxuICogQHR5cGVkZWZuIExlbnMgcyBhID0gRnVuY3RvciBmID0+IChhIC0+IGYgYSkgLT4gcyAtPiBmIHNcbiAqIEBzaWcgW0lkeF0gLT4gTGVucyBzIGFcbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gdXNlLlxuICogQHJldHVybiB7TGVuc31cbiAqIEBzZWUgUi52aWV3LCBSLnNldCwgUi5vdmVyXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgeEhlYWRZTGVucyA9IFIubGVuc1BhdGgoWyd4JywgMCwgJ3knXSk7XG4gKlxuICogICAgICBSLnZpZXcoeEhlYWRZTGVucywge3g6IFt7eTogMiwgejogM30sIHt5OiA0LCB6OiA1fV19KTtcbiAqICAgICAgLy89PiAyXG4gKiAgICAgIFIuc2V0KHhIZWFkWUxlbnMsIDEsIHt4OiBbe3k6IDIsIHo6IDN9LCB7eTogNCwgejogNX1dfSk7XG4gKiAgICAgIC8vPT4ge3g6IFt7eTogMSwgejogM30sIHt5OiA0LCB6OiA1fV19XG4gKiAgICAgIFIub3Zlcih4SGVhZFlMZW5zLCBSLm5lZ2F0ZSwge3g6IFt7eTogMiwgejogM30sIHt5OiA0LCB6OiA1fV19KTtcbiAqICAgICAgLy89PiB7eDogW3t5OiAtMiwgejogM30sIHt5OiA0LCB6OiA1fV19XG4gKi9cblxudmFyIGxlbnNQYXRoID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoZnVuY3Rpb24gbGVuc1BhdGgocCkge1xuICByZXR1cm4gbGVucyhwYXRoKHApLCBhc3NvY1BhdGgocCkpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGxlbnNQYXRoOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBhc3NvYyBmcm9tIFwiLi9hc3NvYy5qc1wiO1xuaW1wb3J0IGxlbnMgZnJvbSBcIi4vbGVucy5qc1wiO1xuaW1wb3J0IHByb3AgZnJvbSBcIi4vcHJvcC5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgbGVucyB3aG9zZSBmb2N1cyBpcyB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE0LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIFN0cmluZyAtPiBMZW5zIHMgYVxuICogQHBhcmFtIHtTdHJpbmd9IGtcbiAqIEByZXR1cm4ge0xlbnN9XG4gKiBAc2VlIFIudmlldywgUi5zZXQsIFIub3ZlclxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHhMZW5zID0gUi5sZW5zUHJvcCgneCcpO1xuICpcbiAqICAgICAgUi52aWV3KHhMZW5zLCB7eDogMSwgeTogMn0pOyAgICAgICAgICAgIC8vPT4gMVxuICogICAgICBSLnNldCh4TGVucywgNCwge3g6IDEsIHk6IDJ9KTsgICAgICAgICAgLy89PiB7eDogNCwgeTogMn1cbiAqICAgICAgUi5vdmVyKHhMZW5zLCBSLm5lZ2F0ZSwge3g6IDEsIHk6IDJ9KTsgIC8vPT4ge3g6IC0xLCB5OiAyfVxuICovXG5cbnZhciBsZW5zUHJvcCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIGxlbnNQcm9wKGspIHtcbiAgcmV0dXJuIGxlbnMocHJvcChrKSwgYXNzb2MoaykpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGxlbnNQcm9wOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBsaWZ0TiBmcm9tIFwiLi9saWZ0Ti5qc1wiO1xuLyoqXG4gKiBcImxpZnRzXCIgYSBmdW5jdGlvbiBvZiBhcml0eSA+PSAxIHNvIHRoYXQgaXQgbWF5IFwibWFwIG92ZXJcIiBhIGxpc3QsIEZ1bmN0aW9uIG9yIG90aGVyXG4gKiBvYmplY3QgdGhhdCBzYXRpc2ZpZXMgdGhlIFtGYW50YXN5TGFuZCBBcHBseSBzcGVjXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI2FwcGx5KS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC43LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKi4uLiAtPiAqKSAtPiAoWypdLi4uIC0+IFsqXSlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBsaWZ0IGludG8gaGlnaGVyIGNvbnRleHRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgbGlmdGVkIGZ1bmN0aW9uLlxuICogQHNlZSBSLmxpZnROXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgbWFkZDMgPSBSLmxpZnQoKGEsIGIsIGMpID0+IGEgKyBiICsgYyk7XG4gKlxuICogICAgICBtYWRkMyhbMTAwLCAyMDBdLCBbMzAsIDQwXSwgWzUsIDYsIDddKTsgLy89PiBbMTM1LCAxMzYsIDEzNywgMTQ1LCAxNDYsIDE0NywgMjM1LCAyMzYsIDIzNywgMjQ1LCAyNDYsIDI0N11cbiAqXG4gKiAgICAgIGNvbnN0IG1hZGQ1ID0gUi5saWZ0KChhLCBiLCBjLCBkLCBlKSA9PiBhICsgYiArIGMgKyBkICsgZSk7XG4gKlxuICogICAgICBtYWRkNShbMTAsIDIwXSwgWzFdLCBbMiwgM10sIFs0XSwgWzEwMCwgMjAwXSk7IC8vPT4gWzExNywgMjE3LCAxMTgsIDIxOCwgMTI3LCAyMjcsIDEyOCwgMjI4XVxuICovXG5cbnZhciBsaWZ0ID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoZnVuY3Rpb24gbGlmdChmbikge1xuICByZXR1cm4gbGlmdE4oZm4ubGVuZ3RoLCBmbik7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgbGlmdDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2FycmF5UmVkdWNlIGZyb20gXCIuL2ludGVybmFsL19hcnJheVJlZHVjZS5qc1wiO1xuaW1wb3J0IGFwIGZyb20gXCIuL2FwLmpzXCI7XG5pbXBvcnQgY3VycnlOIGZyb20gXCIuL2N1cnJ5Ti5qc1wiO1xuaW1wb3J0IG1hcCBmcm9tIFwiLi9tYXAuanNcIjtcbi8qKlxuICogXCJsaWZ0c1wiIGEgZnVuY3Rpb24gdG8gYmUgdGhlIHNwZWNpZmllZCBhcml0eSwgc28gdGhhdCBpdCBtYXkgXCJtYXAgb3ZlclwiIHRoYXRcbiAqIG1hbnkgbGlzdHMsIEZ1bmN0aW9ucyBvciBvdGhlciBvYmplY3RzIHRoYXQgc2F0aXNmeSB0aGUgW0ZhbnRhc3lMYW5kIEFwcGx5IHNwZWNdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjYXBwbHkpLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjcuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIE51bWJlciAtPiAoKi4uLiAtPiAqKSAtPiAoWypdLi4uIC0+IFsqXSlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBsaWZ0IGludG8gaGlnaGVyIGNvbnRleHRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgbGlmdGVkIGZ1bmN0aW9uLlxuICogQHNlZSBSLmxpZnQsIFIuYXBcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBtYWRkMyA9IFIubGlmdE4oMywgKC4uLmFyZ3MpID0+IFIuc3VtKGFyZ3MpKTtcbiAqICAgICAgbWFkZDMoWzEsMiwzXSwgWzEsMiwzXSwgWzFdKTsgLy89PiBbMywgNCwgNSwgNCwgNSwgNiwgNSwgNiwgN11cbiAqL1xuXG52YXIgbGlmdE4gPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBsaWZ0Tihhcml0eSwgZm4pIHtcbiAgdmFyIGxpZnRlZCA9IGN1cnJ5Tihhcml0eSwgZm4pO1xuICByZXR1cm4gY3VycnlOKGFyaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9hcnJheVJlZHVjZShhcCwgbWFwKGxpZnRlZCwgYXJndW1lbnRzWzBdKSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7XG4gIH0pO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGxpZnROOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kOyBgZmFsc2VgXG4gKiBvdGhlcndpc2UuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgT3JkIGEgPT4gYSAtPiBhIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHNlZSBSLmd0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5sdCgyLCAxKTsgLy89PiBmYWxzZVxuICogICAgICBSLmx0KDIsIDIpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIubHQoMiwgMyk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmx0KCdhJywgJ3onKTsgLy89PiB0cnVlXG4gKiAgICAgIFIubHQoJ3onLCAnYScpOyAvLz0+IGZhbHNlXG4gKi9cblxudmFyIGx0ID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gbHQoYSwgYikge1xuICByZXR1cm4gYSA8IGI7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgbHQ7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzZWNvbmQ7XG4gKiBgZmFsc2VgIG90aGVyd2lzZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBPcmQgYSA9PiBhIC0+IGEgLT4gQm9vbGVhblxuICogQHBhcmFtIHtOdW1iZXJ9IGFcbiAqIEBwYXJhbSB7TnVtYmVyfSBiXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHNlZSBSLmd0ZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIubHRlKDIsIDEpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIubHRlKDIsIDIpOyAvLz0+IHRydWVcbiAqICAgICAgUi5sdGUoMiwgMyk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmx0ZSgnYScsICd6Jyk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmx0ZSgneicsICdhJyk7IC8vPT4gZmFsc2VcbiAqL1xuXG52YXIgbHRlID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gbHRlKGEsIGIpIHtcbiAgcmV0dXJuIGEgPD0gYjtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBsdGU7IiwiaW1wb3J0IF9hcnJheVJlZHVjZSBmcm9tIFwiLi9pbnRlcm5hbC9fYXJyYXlSZWR1Y2UuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfbWFwIGZyb20gXCIuL2ludGVybmFsL19tYXAuanNcIjtcbmltcG9ydCBfeG1hcCBmcm9tIFwiLi9pbnRlcm5hbC9feG1hcC5qc1wiO1xuaW1wb3J0IGN1cnJ5TiBmcm9tIFwiLi9jdXJyeU4uanNcIjtcbmltcG9ydCBrZXlzIGZyb20gXCIuL2tleXMuanNcIjtcbi8qKlxuICogVGFrZXMgYSBmdW5jdGlvbiBhbmRcbiAqIGEgW2Z1bmN0b3JdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjZnVuY3RvciksXG4gKiBhcHBsaWVzIHRoZSBmdW5jdGlvbiB0byBlYWNoIG9mIHRoZSBmdW5jdG9yJ3MgdmFsdWVzLCBhbmQgcmV0dXJuc1xuICogYSBmdW5jdG9yIG9mIHRoZSBzYW1lIHNoYXBlLlxuICpcbiAqIFJhbWRhIHByb3ZpZGVzIHN1aXRhYmxlIGBtYXBgIGltcGxlbWVudGF0aW9ucyBmb3IgYEFycmF5YCBhbmQgYE9iamVjdGAsXG4gKiBzbyB0aGlzIGZ1bmN0aW9uIG1heSBiZSBhcHBsaWVkIHRvIGBbMSwgMiwgM11gIG9yIGB7eDogMSwgeTogMiwgejogM31gLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBtYXBgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBBbHNvIHRyZWF0cyBmdW5jdGlvbnMgYXMgZnVuY3RvcnMgYW5kIHdpbGwgY29tcG9zZSB0aGVtIHRvZ2V0aGVyLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgRnVuY3RvciBmID0+IChhIC0+IGIpIC0+IGYgYSAtPiBmIGJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gZXZlcnkgZWxlbWVudCBvZiB0aGUgaW5wdXQgYGxpc3RgLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBiZSBpdGVyYXRlZCBvdmVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBuZXcgbGlzdC5cbiAqIEBzZWUgUi50cmFuc2R1Y2UsIFIuYWRkSW5kZXgsIFIucGx1Y2ssIFIucHJvamVjdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGRvdWJsZSA9IHggPT4geCAqIDI7XG4gKlxuICogICAgICBSLm1hcChkb3VibGUsIFsxLCAyLCAzXSk7IC8vPT4gWzIsIDQsIDZdXG4gKlxuICogICAgICBSLm1hcChkb3VibGUsIHt4OiAxLCB5OiAyLCB6OiAzfSk7IC8vPT4ge3g6IDIsIHk6IDQsIHo6IDZ9XG4gKiBAc3ltYiBSLm1hcChmLCBbYSwgYl0pID0gW2YoYSksIGYoYildXG4gKiBAc3ltYiBSLm1hcChmLCB7IHg6IGEsIHk6IGIgfSkgPSB7IHg6IGYoYSksIHk6IGYoYikgfVxuICogQHN5bWIgUi5tYXAoZiwgZnVuY3Rvcl9vKSA9IGZ1bmN0b3Jfby5tYXAoZilcbiAqL1xuXG52YXIgbWFwID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoXG4vKiNfX1BVUkVfXyovXG5fZGlzcGF0Y2hhYmxlKFsnZmFudGFzeS1sYW5kL21hcCcsICdtYXAnXSwgX3htYXAsIGZ1bmN0aW9uIG1hcChmbiwgZnVuY3Rvcikge1xuICBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChmdW5jdG9yKSkge1xuICAgIGNhc2UgJ1tvYmplY3QgRnVuY3Rpb25dJzpcbiAgICAgIHJldHVybiBjdXJyeU4oZnVuY3Rvci5sZW5ndGgsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgZnVuY3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgICAgIH0pO1xuXG4gICAgY2FzZSAnW29iamVjdCBPYmplY3RdJzpcbiAgICAgIHJldHVybiBfYXJyYXlSZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgICAgIGFjY1trZXldID0gZm4oZnVuY3RvcltrZXldKTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9LCBrZXlzKGZ1bmN0b3IpKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gX21hcChmbiwgZnVuY3Rvcik7XG4gIH1cbn0pKTtcblxuZXhwb3J0IGRlZmF1bHQgbWFwOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbi8qKlxuICogVGhlIGBtYXBBY2N1bWAgZnVuY3Rpb24gYmVoYXZlcyBsaWtlIGEgY29tYmluYXRpb24gb2YgbWFwIGFuZCByZWR1Y2U7IGl0XG4gKiBhcHBsaWVzIGEgZnVuY3Rpb24gdG8gZWFjaCBlbGVtZW50IG9mIGEgbGlzdCwgcGFzc2luZyBhbiBhY2N1bXVsYXRpbmdcbiAqIHBhcmFtZXRlciBmcm9tIGxlZnQgdG8gcmlnaHQsIGFuZCByZXR1cm5pbmcgYSBmaW5hbCB2YWx1ZSBvZiB0aGlzXG4gKiBhY2N1bXVsYXRvciB0b2dldGhlciB3aXRoIHRoZSBuZXcgbGlzdC5cbiAqXG4gKiBUaGUgaXRlcmF0b3IgZnVuY3Rpb24gcmVjZWl2ZXMgdHdvIGFyZ3VtZW50cywgKmFjYyogYW5kICp2YWx1ZSosIGFuZCBzaG91bGRcbiAqIHJldHVybiBhIHR1cGxlICpbYWNjLCB2YWx1ZV0qLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEwLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICgoYWNjLCB4KSAtPiAoYWNjLCB5KSkgLT4gYWNjIC0+IFt4XSAtPiAoYWNjLCBbeV0pXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGV2ZXJ5IGVsZW1lbnQgb2YgdGhlIGlucHV0IGBsaXN0YC5cbiAqIEBwYXJhbSB7Kn0gYWNjIFRoZSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybiB7Kn0gVGhlIGZpbmFsLCBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqIEBzZWUgUi5zY2FuLCBSLmFkZEluZGV4LCBSLm1hcEFjY3VtUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBkaWdpdHMgPSBbJzEnLCAnMicsICczJywgJzQnXTtcbiAqICAgICAgY29uc3QgYXBwZW5kZXIgPSAoYSwgYikgPT4gW2EgKyBiLCBhICsgYl07XG4gKlxuICogICAgICBSLm1hcEFjY3VtKGFwcGVuZGVyLCAwLCBkaWdpdHMpOyAvLz0+IFsnMDEyMzQnLCBbJzAxJywgJzAxMicsICcwMTIzJywgJzAxMjM0J11dXG4gKiBAc3ltYiBSLm1hcEFjY3VtKGYsIGEsIFtiLCBjLCBkXSkgPSBbXG4gKiAgIGYoZihmKGEsIGIpWzBdLCBjKVswXSwgZClbMF0sXG4gKiAgIFtcbiAqICAgICBmKGEsIGIpWzFdLFxuICogICAgIGYoZihhLCBiKVswXSwgYylbMV0sXG4gKiAgICAgZihmKGYoYSwgYilbMF0sIGMpWzBdLCBkKVsxXVxuICogICBdXG4gKiBdXG4gKi9cblxudmFyIG1hcEFjY3VtID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTMoZnVuY3Rpb24gbWFwQWNjdW0oZm4sIGFjYywgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciB0dXBsZSA9IFthY2NdO1xuXG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICB0dXBsZSA9IGZuKHR1cGxlWzBdLCBsaXN0W2lkeF0pO1xuICAgIHJlc3VsdFtpZHhdID0gdHVwbGVbMV07XG4gICAgaWR4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gW3R1cGxlWzBdLCByZXN1bHRdO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG1hcEFjY3VtOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbi8qKlxuICogVGhlIGBtYXBBY2N1bVJpZ2h0YCBmdW5jdGlvbiBiZWhhdmVzIGxpa2UgYSBjb21iaW5hdGlvbiBvZiBtYXAgYW5kIHJlZHVjZTsgaXRcbiAqIGFwcGxpZXMgYSBmdW5jdGlvbiB0byBlYWNoIGVsZW1lbnQgb2YgYSBsaXN0LCBwYXNzaW5nIGFuIGFjY3VtdWxhdGluZ1xuICogcGFyYW1ldGVyIGZyb20gcmlnaHQgdG8gbGVmdCwgYW5kIHJldHVybmluZyBhIGZpbmFsIHZhbHVlIG9mIHRoaXNcbiAqIGFjY3VtdWxhdG9yIHRvZ2V0aGVyIHdpdGggdGhlIG5ldyBsaXN0LlxuICpcbiAqIFNpbWlsYXIgdG8gW2BtYXBBY2N1bWBdKCNtYXBBY2N1bSksIGV4Y2VwdCBtb3ZlcyB0aHJvdWdoIHRoZSBpbnB1dCBsaXN0IGZyb21cbiAqIHRoZSByaWdodCB0byB0aGUgbGVmdC5cbiAqXG4gKiBUaGUgaXRlcmF0b3IgZnVuY3Rpb24gcmVjZWl2ZXMgdHdvIGFyZ3VtZW50cywgKmFjYyogYW5kICp2YWx1ZSosIGFuZCBzaG91bGRcbiAqIHJldHVybiBhIHR1cGxlICpbYWNjLCB2YWx1ZV0qLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEwLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICgoYWNjLCB4KSAtPiAoYWNjLCB5KSkgLT4gYWNjIC0+IFt4XSAtPiAoYWNjLCBbeV0pXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGV2ZXJ5IGVsZW1lbnQgb2YgdGhlIGlucHV0IGBsaXN0YC5cbiAqIEBwYXJhbSB7Kn0gYWNjIFRoZSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybiB7Kn0gVGhlIGZpbmFsLCBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqIEBzZWUgUi5hZGRJbmRleCwgUi5tYXBBY2N1bVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGRpZ2l0cyA9IFsnMScsICcyJywgJzMnLCAnNCddO1xuICogICAgICBjb25zdCBhcHBlbmRlciA9IChhLCBiKSA9PiBbYiArIGEsIGIgKyBhXTtcbiAqXG4gKiAgICAgIFIubWFwQWNjdW1SaWdodChhcHBlbmRlciwgNSwgZGlnaXRzKTsgLy89PiBbJzEyMzQ1JywgWycxMjM0NScsICcyMzQ1JywgJzM0NScsICc0NSddXVxuICogQHN5bWIgUi5tYXBBY2N1bVJpZ2h0KGYsIGEsIFtiLCBjLCBkXSkgPSBbXG4gKiAgIGYoZihmKGEsIGQpWzBdLCBjKVswXSwgYilbMF0sXG4gKiAgIFtcbiAqICAgICBmKGEsIGQpWzFdLFxuICogICAgIGYoZihhLCBkKVswXSwgYylbMV0sXG4gKiAgICAgZihmKGYoYSwgZClbMF0sIGMpWzBdLCBiKVsxXVxuICogICBdXG4gKiBdXG4gKi9cblxudmFyIG1hcEFjY3VtUmlnaHQgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MyhmdW5jdGlvbiBtYXBBY2N1bVJpZ2h0KGZuLCBhY2MsIGxpc3QpIHtcbiAgdmFyIGlkeCA9IGxpc3QubGVuZ3RoIC0gMTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgdHVwbGUgPSBbYWNjXTtcblxuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICB0dXBsZSA9IGZuKHR1cGxlWzBdLCBsaXN0W2lkeF0pO1xuICAgIHJlc3VsdFtpZHhdID0gdHVwbGVbMV07XG4gICAgaWR4IC09IDE7XG4gIH1cblxuICByZXR1cm4gW3R1cGxlWzBdLCByZXN1bHRdO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG1hcEFjY3VtUmlnaHQ7IiwiaW1wb3J0IF9hcnJheVJlZHVjZSBmcm9tIFwiLi9pbnRlcm5hbC9fYXJyYXlSZWR1Y2UuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBrZXlzIGZyb20gXCIuL2tleXMuanNcIjtcbi8qKlxuICogQW4gT2JqZWN0LXNwZWNpZmljIHZlcnNpb24gb2YgW2BtYXBgXSgjbWFwKS4gVGhlIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gdGhyZWVcbiAqIGFyZ3VtZW50czogKih2YWx1ZSwga2V5LCBvYmopKi4gSWYgb25seSB0aGUgdmFsdWUgaXMgc2lnbmlmaWNhbnQsIHVzZVxuICogW2BtYXBgXSgjbWFwKSBpbnN0ZWFkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjkuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoKCosIFN0cmluZywgT2JqZWN0KSAtPiAqKSAtPiBPYmplY3QgLT4gT2JqZWN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7T2JqZWN0fVxuICogQHNlZSBSLm1hcFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHh5eiA9IHsgeDogMSwgeTogMiwgejogMyB9O1xuICogICAgICBjb25zdCBwcmVwZW5kS2V5QW5kRG91YmxlID0gKG51bSwga2V5LCBvYmopID0+IGtleSArIChudW0gKiAyKTtcbiAqXG4gKiAgICAgIFIubWFwT2JqSW5kZXhlZChwcmVwZW5kS2V5QW5kRG91YmxlLCB4eXopOyAvLz0+IHsgeDogJ3gyJywgeTogJ3k0JywgejogJ3o2JyB9XG4gKi9cblxudmFyIG1hcE9iakluZGV4ZWQgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBtYXBPYmpJbmRleGVkKGZuLCBvYmopIHtcbiAgcmV0dXJuIF9hcnJheVJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICBhY2Nba2V5XSA9IGZuKG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30sIGtleXMob2JqKSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgbWFwT2JqSW5kZXhlZDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIFRlc3RzIGEgcmVndWxhciBleHByZXNzaW9uIGFnYWluc3QgYSBTdHJpbmcuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGxcbiAqIHJldHVybiBhbiBlbXB0eSBhcnJheSB3aGVuIHRoZXJlIGFyZSBubyBtYXRjaGVzLiBUaGlzIGRpZmZlcnMgZnJvbVxuICogW2BTdHJpbmcucHJvdG90eXBlLm1hdGNoYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL21hdGNoKVxuICogd2hpY2ggcmV0dXJucyBgbnVsbGAgd2hlbiB0aGVyZSBhcmUgbm8gbWF0Y2hlcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBzaWcgUmVnRXhwIC0+IFN0cmluZyAtPiBbU3RyaW5nIHwgVW5kZWZpbmVkXVxuICogQHBhcmFtIHtSZWdFeHB9IHJ4IEEgcmVndWxhciBleHByZXNzaW9uLlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIG1hdGNoIGFnYWluc3RcbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgbGlzdCBvZiBtYXRjaGVzIG9yIGVtcHR5IGFycmF5LlxuICogQHNlZSBSLnRlc3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm1hdGNoKC8oW2Etel1hKS9nLCAnYmFuYW5hcycpOyAvLz0+IFsnYmEnLCAnbmEnLCAnbmEnXVxuICogICAgICBSLm1hdGNoKC9hLywgJ2InKTsgLy89PiBbXVxuICogICAgICBSLm1hdGNoKC9hLywgbnVsbCk7IC8vPT4gVHlwZUVycm9yOiBudWxsIGRvZXMgbm90IGhhdmUgYSBtZXRob2QgbmFtZWQgXCJtYXRjaFwiXG4gKi9cblxudmFyIG1hdGNoID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gbWF0Y2gocngsIHN0cikge1xuICByZXR1cm4gc3RyLm1hdGNoKHJ4KSB8fCBbXTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBtYXRjaDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2lzSW50ZWdlciBmcm9tIFwiLi9pbnRlcm5hbC9faXNJbnRlZ2VyLmpzXCI7XG4vKipcbiAqIGBtYXRoTW9kYCBiZWhhdmVzIGxpa2UgdGhlIG1vZHVsbyBvcGVyYXRvciBzaG91bGQgbWF0aGVtYXRpY2FsbHksIHVubGlrZSB0aGVcbiAqIGAlYCBvcGVyYXRvciAoYW5kIGJ5IGV4dGVuc2lvbiwgW2BSLm1vZHVsb2BdKCNtb2R1bG8pKS4gU28gd2hpbGVcbiAqIGAtMTcgJSA1YCBpcyBgLTJgLCBgbWF0aE1vZCgtMTcsIDUpYCBpcyBgM2AuIGBtYXRoTW9kYCByZXF1aXJlcyBJbnRlZ2VyXG4gKiBhcmd1bWVudHMsIGFuZCByZXR1cm5zIE5hTiB3aGVuIHRoZSBtb2R1bHVzIGlzIHplcm8gb3IgbmVnYXRpdmUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMy4wXG4gKiBAY2F0ZWdvcnkgTWF0aFxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IE51bWJlclxuICogQHBhcmFtIHtOdW1iZXJ9IG0gVGhlIGRpdmlkZW5kLlxuICogQHBhcmFtIHtOdW1iZXJ9IHAgdGhlIG1vZHVsdXMuXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSByZXN1bHQgb2YgYGIgbW9kIGFgLlxuICogQHNlZSBSLm1vZHVsb1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIubWF0aE1vZCgtMTcsIDUpOyAgLy89PiAzXG4gKiAgICAgIFIubWF0aE1vZCgxNywgNSk7ICAgLy89PiAyXG4gKiAgICAgIFIubWF0aE1vZCgxNywgLTUpOyAgLy89PiBOYU5cbiAqICAgICAgUi5tYXRoTW9kKDE3LCAwKTsgICAvLz0+IE5hTlxuICogICAgICBSLm1hdGhNb2QoMTcuMiwgNSk7IC8vPT4gTmFOXG4gKiAgICAgIFIubWF0aE1vZCgxNywgNS4zKTsgLy89PiBOYU5cbiAqXG4gKiAgICAgIGNvbnN0IGNsb2NrID0gUi5tYXRoTW9kKFIuX18sIDEyKTtcbiAqICAgICAgY2xvY2soMTUpOyAvLz0+IDNcbiAqICAgICAgY2xvY2soMjQpOyAvLz0+IDBcbiAqXG4gKiAgICAgIGNvbnN0IHNldmVudGVlbk1vZCA9IFIubWF0aE1vZCgxNyk7XG4gKiAgICAgIHNldmVudGVlbk1vZCgzKTsgIC8vPT4gMlxuICogICAgICBzZXZlbnRlZW5Nb2QoNCk7ICAvLz0+IDFcbiAqICAgICAgc2V2ZW50ZWVuTW9kKDEwKTsgLy89PiA3XG4gKi9cblxudmFyIG1hdGhNb2QgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBtYXRoTW9kKG0sIHApIHtcbiAgaWYgKCFfaXNJbnRlZ2VyKG0pKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfVxuXG4gIGlmICghX2lzSW50ZWdlcihwKSB8fCBwIDwgMSkge1xuICAgIHJldHVybiBOYU47XG4gIH1cblxuICByZXR1cm4gKG0gJSBwICsgcCkgJSBwO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG1hdGhNb2Q7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IHRvU3RyaW5nIGZyb20gXCIuL3RvU3RyaW5nLmpzXCI7XG4vKipcbiAqIFJldHVybnMgdGhlIGxhcmdlciBvZiBpdHMgdHdvIGFyZ3VtZW50cy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBPcmQgYSA9PiBhIC0+IGEgLT4gYVxuICogQHBhcmFtIHsqfSBhXG4gKiBAcGFyYW0geyp9IGJcbiAqIEByZXR1cm4geyp9XG4gKiBAc2VlIFIubWF4QnksIFIubWluXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5tYXgoNzg5LCAxMjMpOyAvLz0+IDc4OVxuICogICAgICBSLm1heCgnYScsICdiJyk7IC8vPT4gJ2InXG4gKi9cblxudmFyIG1heCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIG1heChhLCBiKSB7XG4gIGlmIChhID09PSBiKSB7XG4gICAgcmV0dXJuIGI7XG4gIH1cblxuICBmdW5jdGlvbiBzYWZlTWF4KHgsIHkpIHtcbiAgICBpZiAoeCA+IHkgIT09IHkgPiB4KSB7XG4gICAgICByZXR1cm4geSA+IHggPyB5IDogeDtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgdmFyIG1heEJ5VmFsdWUgPSBzYWZlTWF4KGEsIGIpO1xuXG4gIGlmIChtYXhCeVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbWF4QnlWYWx1ZTtcbiAgfVxuXG4gIHZhciBtYXhCeVR5cGUgPSBzYWZlTWF4KHR5cGVvZiBhLCB0eXBlb2YgYik7XG5cbiAgaWYgKG1heEJ5VHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG1heEJ5VHlwZSA9PT0gdHlwZW9mIGEgPyBhIDogYjtcbiAgfVxuXG4gIHZhciBzdHJpbmdBID0gdG9TdHJpbmcoYSk7XG4gIHZhciBtYXhCeVN0cmluZ1ZhbHVlID0gc2FmZU1heChzdHJpbmdBLCB0b1N0cmluZyhiKSk7XG5cbiAgaWYgKG1heEJ5U3RyaW5nVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBtYXhCeVN0cmluZ1ZhbHVlID09PSBzdHJpbmdBID8gYSA6IGI7XG4gIH1cblxuICByZXR1cm4gYjtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBtYXg7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IG1heCBmcm9tIFwiLi9tYXguanNcIjtcbi8qKlxuICogVGFrZXMgYSBmdW5jdGlvbiBhbmQgdHdvIHZhbHVlcywgYW5kIHJldHVybnMgd2hpY2hldmVyIHZhbHVlIHByb2R1Y2VzIHRoZVxuICogbGFyZ2VyIHJlc3VsdCB3aGVuIHBhc3NlZCB0byB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOC4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgT3JkIGIgPT4gKGEgLT4gYikgLT4gYSAtPiBhIC0+IGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLm1heCwgUi5taW5CeVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIC8vICBzcXVhcmUgOjogTnVtYmVyIC0+IE51bWJlclxuICogICAgICBjb25zdCBzcXVhcmUgPSBuID0+IG4gKiBuO1xuICpcbiAqICAgICAgUi5tYXhCeShzcXVhcmUsIC0zLCAyKTsgLy89PiAtM1xuICpcbiAqICAgICAgUi5yZWR1Y2UoUi5tYXhCeShzcXVhcmUpLCAwLCBbMywgLTUsIDQsIDEsIC0yXSk7IC8vPT4gLTVcbiAqICAgICAgUi5yZWR1Y2UoUi5tYXhCeShzcXVhcmUpLCAwLCBbXSk7IC8vPT4gMFxuICovXG5cbnZhciBtYXhCeSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIG1heEJ5KGYsIGEsIGIpIHtcbiAgdmFyIHJlc3VsdEIgPSBmKGIpO1xuICByZXR1cm4gbWF4KGYoYSksIHJlc3VsdEIpID09PSByZXN1bHRCID8gYiA6IGE7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgbWF4Qnk7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IHN1bSBmcm9tIFwiLi9zdW0uanNcIjtcbi8qKlxuICogUmV0dXJucyB0aGUgbWVhbiBvZiB0aGUgZ2l2ZW4gbGlzdCBvZiBudW1iZXJzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE0LjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAc2lnIFtOdW1iZXJdIC0+IE51bWJlclxuICogQHBhcmFtIHtBcnJheX0gbGlzdFxuICogQHJldHVybiB7TnVtYmVyfVxuICogQHNlZSBSLm1lZGlhblxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIubWVhbihbMiwgNywgOV0pOyAvLz0+IDZcbiAqICAgICAgUi5tZWFuKFtdKTsgLy89PiBOYU5cbiAqL1xuXG52YXIgbWVhbiA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIG1lYW4obGlzdCkge1xuICByZXR1cm4gc3VtKGxpc3QpIC8gbGlzdC5sZW5ndGg7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgbWVhbjsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgbWVhbiBmcm9tIFwiLi9tZWFuLmpzXCI7XG4vKipcbiAqIFJldHVybnMgdGhlIG1lZGlhbiBvZiB0aGUgZ2l2ZW4gbGlzdCBvZiBudW1iZXJzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE0LjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAc2lnIFtOdW1iZXJdIC0+IE51bWJlclxuICogQHBhcmFtIHtBcnJheX0gbGlzdFxuICogQHJldHVybiB7TnVtYmVyfVxuICogQHNlZSBSLm1lYW5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm1lZGlhbihbMiwgOSwgN10pOyAvLz0+IDdcbiAqICAgICAgUi5tZWRpYW4oWzcsIDIsIDEwLCA5XSk7IC8vPT4gOFxuICogICAgICBSLm1lZGlhbihbXSk7IC8vPT4gTmFOXG4gKi9cblxudmFyIG1lZGlhbiA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIG1lZGlhbihsaXN0KSB7XG4gIHZhciBsZW4gPSBsaXN0Lmxlbmd0aDtcblxuICBpZiAobGVuID09PSAwKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfVxuXG4gIHZhciB3aWR0aCA9IDIgLSBsZW4gJSAyO1xuICB2YXIgaWR4ID0gKGxlbiAtIHdpZHRoKSAvIDI7XG4gIHJldHVybiBtZWFuKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIDApLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDA7XG4gIH0pLnNsaWNlKGlkeCwgaWR4ICsgd2lkdGgpKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBtZWRpYW47IiwiaW1wb3J0IF9hcml0eSBmcm9tIFwiLi9pbnRlcm5hbC9fYXJpdHkuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL2ludGVybmFsL19oYXMuanNcIjtcbi8qKlxuICogVGFrZXMgYSBzdHJpbmctcmV0dXJuaW5nIGZ1bmN0aW9uIGBrZXlHZW5gIGFuZCBhIGZ1bmN0aW9uIGBmbmAgYW5kIHJldHVybnNcbiAqIGEgbmV3IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBjYWNoZWQgcmVzdWx0cyBmb3Igc3Vic2VxdWVudFxuICogY2FsbHMgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMuXG4gKlxuICogV2hlbiB0aGUgZnVuY3Rpb24gaXMgaW52b2tlZCwgYGtleUdlbmAgaXMgYXBwbGllZCB0byB0aGUgc2FtZSBhcmd1bWVudHNcbiAqIGFuZCBpdHMgcmVzdWx0IGJlY29tZXMgdGhlIGNhY2hlIGtleS4gSWYgdGhlIGNhY2hlIGNvbnRhaW5zIHNvbWV0aGluZ1xuICogdW5kZXIgdGhhdCBrZXksIHRoZSBmdW5jdGlvbiBzaW1wbHkgcmV0dXJucyBpdCBhbmQgZG9lcyBub3QgaW52b2tlIGBmbmAgYXQgYWxsLlxuICpcbiAqIE90aGVyd2lzZSBgZm5gIGlzIGFwcGxpZWQgdG8gdGhlIHNhbWUgYXJndW1lbnRzIGFuZCBpdHMgcmV0dXJuIHZhbHVlXG4gKiBpcyBjYWNoZWQgdW5kZXIgdGhhdCBrZXkgYW5kIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbi5cbiAqXG4gKiBDYXJlIG11c3QgYmUgdGFrZW4gd2hlbiBpbXBsZW1lbnRpbmcgYGtleUdlbmAgdG8gYXZvaWQga2V5IGNvbGxpc2lvbixcbiAqIG9yIGlmIHRyYWNraW5nIHJlZmVyZW5jZXMsIG1lbW9yeSBsZWFrcyBhbmQgbXV0YXRpbmcgYXJndW1lbnRzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI0LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKi4uLiAtPiBTdHJpbmcpIC0+ICgqLi4uIC0+IGEpIC0+ICgqLi4uIC0+IGEpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlHZW4gVGhlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIHRoZSBjYWNoZSBrZXkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWVtb2l6ZS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBNZW1vaXplZCB2ZXJzaW9uIG9mIGBmbmAuXG4gKiBAZXhhbXBsZVxuICogICAgICBjb25zdCB3aXRoQWdlID0gbWVtb2l6ZVdpdGgobyA9PiBgJHtvLmJpcnRofS8ke28uZGVhdGh9YCwgKHtiaXJ0aCwgZGVhdGh9KSA9PiB7XG4gKiAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiAqICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGtleUdlbiAgICAgICAgICAgICAgICAgICAgICAgIGZuXG4gKiAgICAgICAgY29uc29sZS5sb2coYGNvbXB1dGluZyBhZ2UgZm9yICR7YmlydGh9LyR7ZGVhdGh9YCk7XG4gKiAgICAgICAgcmV0dXJuICh7YmlydGgsIGRlYXRoLCBhZ2U6IGRlYXRoIC0gYmlydGh9KTtcbiAqICAgICAgfSk7XG4gKlxuICogICAgICB3aXRoQWdlKHtiaXJ0aDogMTkyMSwgZGVhdGg6IDE5OTl9KTtcbiAqICAgICAgLy89PiBMT0c6IGNvbXB1dGluZyBhZ2UgZm9yIDE5MjEvMTk5OVxuICogICAgICAvLz0+IHtiaXJ0aDogMTkyMSwgZGVhdGg6IDE5OTksIGFnZTogNzh9IChyZXR1cm5lZCBmcm9tIGZuKVxuICpcbiAqICAgICAgd2l0aEFnZSh7YmlydGg6IDE5MjEsIGRlYXRoOiAxOTk5fSk7XG4gKiAgICAgIC8vPT4ge2JpcnRoOiAxOTIxLCBkZWF0aDogMTk5OSwgYWdlOiA3OH0gKHJldHVybmVkIGZyb20gY2FjaGUpXG4gKi9cblxudmFyIG1lbW9pemVXaXRoID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gbWVtb2l6ZVdpdGgoa2V5R2VuLCBmbikge1xuICB2YXIgY2FjaGUgPSB7fTtcbiAgcmV0dXJuIF9hcml0eShmbi5sZW5ndGgsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIga2V5ID0ga2V5R2VuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICBpZiAoIV9oYXMoa2V5LCBjYWNoZSkpIHtcbiAgICAgIGNhY2hlW2tleV0gPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIHJldHVybiBjYWNoZVtrZXldO1xuICB9KTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBtZW1vaXplV2l0aDsiLCJpbXBvcnQgX29iamVjdEFzc2lnbiBmcm9tIFwiLi9pbnRlcm5hbC9fb2JqZWN0QXNzaWduLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG4vKipcbiAqIENyZWF0ZXMgb25lIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3duIHByb3BlcnRpZXMgZnJvbSBhIGxpc3Qgb2Ygb2JqZWN0cy5cbiAqIElmIGEga2V5IGV4aXN0cyBpbiBtb3JlIHRoYW4gb25lIG9iamVjdCwgdGhlIHZhbHVlIGZyb20gdGhlIGxhc3RcbiAqIG9iamVjdCBpdCBleGlzdHMgaW4gd2lsbCBiZSB1c2VkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEwLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFt7azogdn1dIC0+IHtrOiB2fVxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBBbiBhcnJheSBvZiBvYmplY3RzXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbWVyZ2VkIG9iamVjdC5cbiAqIEBzZWUgUi5yZWR1Y2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm1lcmdlQWxsKFt7Zm9vOjF9LHtiYXI6Mn0se2JhejozfV0pOyAvLz0+IHtmb286MSxiYXI6MixiYXo6M31cbiAqICAgICAgUi5tZXJnZUFsbChbe2ZvbzoxfSx7Zm9vOjJ9LHtiYXI6Mn1dKTsgLy89PiB7Zm9vOjIsYmFyOjJ9XG4gKiBAc3ltYiBSLm1lcmdlQWxsKFt7IHg6IDEgfSwgeyB5OiAyIH0sIHsgejogMyB9XSkgPSB7IHg6IDEsIHk6IDIsIHo6IDMgfVxuICovXG5cbnZhciBtZXJnZUFsbCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIG1lcmdlQWxsKGxpc3QpIHtcbiAgcmV0dXJuIF9vYmplY3RBc3NpZ24uYXBwbHkobnVsbCwgW3t9XS5jb25jYXQobGlzdCkpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG1lcmdlQWxsOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBtZXJnZURlZXBXaXRoS2V5IGZyb20gXCIuL21lcmdlRGVlcFdpdGhLZXkuanNcIjtcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIGZpcnN0IG9iamVjdCBtZXJnZWQgd2l0aFxuICogdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBzZWNvbmQgb2JqZWN0LiBJZiBhIGtleSBleGlzdHMgaW4gYm90aCBvYmplY3RzOlxuICogLSBhbmQgYm90aCB2YWx1ZXMgYXJlIG9iamVjdHMsIHRoZSB0d28gdmFsdWVzIHdpbGwgYmUgcmVjdXJzaXZlbHkgbWVyZ2VkXG4gKiAtIG90aGVyd2lzZSB0aGUgdmFsdWUgZnJvbSB0aGUgZmlyc3Qgb2JqZWN0IHdpbGwgYmUgdXNlZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yNC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHthfSAtPiB7YX0gLT4ge2F9XG4gKiBAcGFyYW0ge09iamVjdH0gbE9ialxuICogQHBhcmFtIHtPYmplY3R9IHJPYmpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBzZWUgUi5tZXJnZSwgUi5tZXJnZURlZXBSaWdodCwgUi5tZXJnZURlZXBXaXRoLCBSLm1lcmdlRGVlcFdpdGhLZXlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm1lcmdlRGVlcExlZnQoeyBuYW1lOiAnZnJlZCcsIGFnZTogMTAsIGNvbnRhY3Q6IHsgZW1haWw6ICdtb29AZXhhbXBsZS5jb20nIH19LFxuICogICAgICAgICAgICAgICAgICAgICAgeyBhZ2U6IDQwLCBjb250YWN0OiB7IGVtYWlsOiAnYmFhQGV4YW1wbGUuY29tJyB9fSk7XG4gKiAgICAgIC8vPT4geyBuYW1lOiAnZnJlZCcsIGFnZTogMTAsIGNvbnRhY3Q6IHsgZW1haWw6ICdtb29AZXhhbXBsZS5jb20nIH19XG4gKi9cblxudmFyIG1lcmdlRGVlcExlZnQgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBtZXJnZURlZXBMZWZ0KGxPYmosIHJPYmopIHtcbiAgcmV0dXJuIG1lcmdlRGVlcFdpdGhLZXkoZnVuY3Rpb24gKGssIGxWYWwsIHJWYWwpIHtcbiAgICByZXR1cm4gbFZhbDtcbiAgfSwgbE9iaiwgck9iaik7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgbWVyZ2VEZWVwTGVmdDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgbWVyZ2VEZWVwV2l0aEtleSBmcm9tIFwiLi9tZXJnZURlZXBXaXRoS2V5LmpzXCI7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBmaXJzdCBvYmplY3QgbWVyZ2VkIHdpdGhcbiAqIHRoZSBvd24gcHJvcGVydGllcyBvZiB0aGUgc2Vjb25kIG9iamVjdC4gSWYgYSBrZXkgZXhpc3RzIGluIGJvdGggb2JqZWN0czpcbiAqIC0gYW5kIGJvdGggdmFsdWVzIGFyZSBvYmplY3RzLCB0aGUgdHdvIHZhbHVlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5IG1lcmdlZFxuICogLSBvdGhlcndpc2UgdGhlIHZhbHVlIGZyb20gdGhlIHNlY29uZCBvYmplY3Qgd2lsbCBiZSB1c2VkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI0LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcge2F9IC0+IHthfSAtPiB7YX1cbiAqIEBwYXJhbSB7T2JqZWN0fSBsT2JqXG4gKiBAcGFyYW0ge09iamVjdH0gck9ialxuICogQHJldHVybiB7T2JqZWN0fVxuICogQHNlZSBSLm1lcmdlLCBSLm1lcmdlRGVlcExlZnQsIFIubWVyZ2VEZWVwV2l0aCwgUi5tZXJnZURlZXBXaXRoS2V5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5tZXJnZURlZXBSaWdodCh7IG5hbWU6ICdmcmVkJywgYWdlOiAxMCwgY29udGFjdDogeyBlbWFpbDogJ21vb0BleGFtcGxlLmNvbScgfX0sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgeyBhZ2U6IDQwLCBjb250YWN0OiB7IGVtYWlsOiAnYmFhQGV4YW1wbGUuY29tJyB9fSk7XG4gKiAgICAgIC8vPT4geyBuYW1lOiAnZnJlZCcsIGFnZTogNDAsIGNvbnRhY3Q6IHsgZW1haWw6ICdiYWFAZXhhbXBsZS5jb20nIH19XG4gKi9cblxudmFyIG1lcmdlRGVlcFJpZ2h0ID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gbWVyZ2VEZWVwUmlnaHQobE9iaiwgck9iaikge1xuICByZXR1cm4gbWVyZ2VEZWVwV2l0aEtleShmdW5jdGlvbiAoaywgbFZhbCwgclZhbCkge1xuICAgIHJldHVybiByVmFsO1xuICB9LCBsT2JqLCByT2JqKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBtZXJnZURlZXBSaWdodDsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgbWVyZ2VEZWVwV2l0aEtleSBmcm9tIFwiLi9tZXJnZURlZXBXaXRoS2V5LmpzXCI7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSB0d28gcHJvdmlkZWQgb2JqZWN0cy5cbiAqIElmIGEga2V5IGV4aXN0cyBpbiBib3RoIG9iamVjdHM6XG4gKiAtIGFuZCBib3RoIGFzc29jaWF0ZWQgdmFsdWVzIGFyZSBhbHNvIG9iamVjdHMgdGhlbiB0aGUgdmFsdWVzIHdpbGwgYmVcbiAqICAgcmVjdXJzaXZlbHkgbWVyZ2VkLlxuICogLSBvdGhlcndpc2UgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gYXNzb2NpYXRlZCB2YWx1ZXMgdXNpbmcgdGhlXG4gKiAgIHJlc3VsdGluZyB2YWx1ZSBhcyB0aGUgbmV3IHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LlxuICogSWYgYSBrZXkgb25seSBleGlzdHMgaW4gb25lIG9iamVjdCwgdGhlIHZhbHVlIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXlcbiAqIG9mIHRoZSByZXN1bHRpbmcgb2JqZWN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI0LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKChhLCBhKSAtPiBhKSAtPiB7YX0gLT4ge2F9IC0+IHthfVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBsT2JqXG4gKiBAcGFyYW0ge09iamVjdH0gck9ialxuICogQHJldHVybiB7T2JqZWN0fVxuICogQHNlZSBSLm1lcmdlV2l0aCwgUi5tZXJnZURlZXBXaXRoS2V5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5tZXJnZURlZXBXaXRoKFIuY29uY2F0LFxuICogICAgICAgICAgICAgICAgICAgICAgeyBhOiB0cnVlLCBjOiB7IHZhbHVlczogWzEwLCAyMF0gfX0sXG4gKiAgICAgICAgICAgICAgICAgICAgICB7IGI6IHRydWUsIGM6IHsgdmFsdWVzOiBbMTUsIDM1XSB9fSk7XG4gKiAgICAgIC8vPT4geyBhOiB0cnVlLCBiOiB0cnVlLCBjOiB7IHZhbHVlczogWzEwLCAyMCwgMTUsIDM1XSB9fVxuICovXG5cbnZhciBtZXJnZURlZXBXaXRoID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTMoZnVuY3Rpb24gbWVyZ2VEZWVwV2l0aChmbiwgbE9iaiwgck9iaikge1xuICByZXR1cm4gbWVyZ2VEZWVwV2l0aEtleShmdW5jdGlvbiAoaywgbFZhbCwgclZhbCkge1xuICAgIHJldHVybiBmbihsVmFsLCByVmFsKTtcbiAgfSwgbE9iaiwgck9iaik7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgbWVyZ2VEZWVwV2l0aDsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgX2lzT2JqZWN0IGZyb20gXCIuL2ludGVybmFsL19pc09iamVjdC5qc1wiO1xuaW1wb3J0IG1lcmdlV2l0aEtleSBmcm9tIFwiLi9tZXJnZVdpdGhLZXkuanNcIjtcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIHR3byBwcm92aWRlZCBvYmplY3RzLlxuICogSWYgYSBrZXkgZXhpc3RzIGluIGJvdGggb2JqZWN0czpcbiAqIC0gYW5kIGJvdGggYXNzb2NpYXRlZCB2YWx1ZXMgYXJlIGFsc28gb2JqZWN0cyB0aGVuIHRoZSB2YWx1ZXMgd2lsbCBiZVxuICogICByZWN1cnNpdmVseSBtZXJnZWQuXG4gKiAtIG90aGVyd2lzZSB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gaXMgYXBwbGllZCB0byB0aGUga2V5IGFuZCBhc3NvY2lhdGVkIHZhbHVlc1xuICogICB1c2luZyB0aGUgcmVzdWx0aW5nIHZhbHVlIGFzIHRoZSBuZXcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuXG4gKiBJZiBhIGtleSBvbmx5IGV4aXN0cyBpbiBvbmUgb2JqZWN0LCB0aGUgdmFsdWUgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleVxuICogb2YgdGhlIHJlc3VsdGluZyBvYmplY3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjQuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoKFN0cmluZywgYSwgYSkgLT4gYSkgLT4ge2F9IC0+IHthfSAtPiB7YX1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gbE9ialxuICogQHBhcmFtIHtPYmplY3R9IHJPYmpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBzZWUgUi5tZXJnZVdpdGhLZXksIFIubWVyZ2VEZWVwV2l0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGxldCBjb25jYXRWYWx1ZXMgPSAoaywgbCwgcikgPT4gayA9PSAndmFsdWVzJyA/IFIuY29uY2F0KGwsIHIpIDogclxuICogICAgICBSLm1lcmdlRGVlcFdpdGhLZXkoY29uY2F0VmFsdWVzLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgeyBhOiB0cnVlLCBjOiB7IHRoaW5nOiAnZm9vJywgdmFsdWVzOiBbMTAsIDIwXSB9fSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIHsgYjogdHJ1ZSwgYzogeyB0aGluZzogJ2JhcicsIHZhbHVlczogWzE1LCAzNV0gfX0pO1xuICogICAgICAvLz0+IHsgYTogdHJ1ZSwgYjogdHJ1ZSwgYzogeyB0aGluZzogJ2JhcicsIHZhbHVlczogWzEwLCAyMCwgMTUsIDM1XSB9fVxuICovXG5cbnZhciBtZXJnZURlZXBXaXRoS2V5ID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTMoZnVuY3Rpb24gbWVyZ2VEZWVwV2l0aEtleShmbiwgbE9iaiwgck9iaikge1xuICByZXR1cm4gbWVyZ2VXaXRoS2V5KGZ1bmN0aW9uIChrLCBsVmFsLCByVmFsKSB7XG4gICAgaWYgKF9pc09iamVjdChsVmFsKSAmJiBfaXNPYmplY3QoclZhbCkpIHtcbiAgICAgIHJldHVybiBtZXJnZURlZXBXaXRoS2V5KGZuLCBsVmFsLCByVmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZuKGssIGxWYWwsIHJWYWwpO1xuICAgIH1cbiAgfSwgbE9iaiwgck9iaik7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgbWVyZ2VEZWVwV2l0aEtleTsiLCJpbXBvcnQgX29iamVjdEFzc2lnbiBmcm9tIFwiLi9pbnRlcm5hbC9fb2JqZWN0QXNzaWduLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIENyZWF0ZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIGZpcnN0IG9iamVjdCBtZXJnZWQgd2l0aFxuICogdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBzZWNvbmQgb2JqZWN0LiBJZiBhIGtleSBleGlzdHMgaW4gYm90aCBvYmplY3RzLFxuICogdGhlIHZhbHVlIGZyb20gdGhlIGZpcnN0IG9iamVjdCB3aWxsIGJlIHVzZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjYuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7azogdn0gLT4ge2s6IHZ9IC0+IHtrOiB2fVxuICogQHBhcmFtIHtPYmplY3R9IGxcbiAqIEBwYXJhbSB7T2JqZWN0fSByXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAc2VlIFIubWVyZ2VSaWdodCwgUi5tZXJnZURlZXBMZWZ0LCBSLm1lcmdlV2l0aCwgUi5tZXJnZVdpdGhLZXlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm1lcmdlTGVmdCh7ICdhZ2UnOiA0MCB9LCB7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogMTAgfSk7XG4gKiAgICAgIC8vPT4geyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDQwIH1cbiAqXG4gKiAgICAgIGNvbnN0IHJlc2V0VG9EZWZhdWx0ID0gUi5tZXJnZUxlZnQoe3g6IDB9KTtcbiAqICAgICAgcmVzZXRUb0RlZmF1bHQoe3g6IDUsIHk6IDJ9KTsgLy89PiB7eDogMCwgeTogMn1cbiAqIEBzeW1iIFIubWVyZ2VMZWZ0KGEsIGIpID0gey4uLmIsIC4uLmF9XG4gKi9cblxudmFyIG1lcmdlTGVmdCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIG1lcmdlTGVmdChsLCByKSB7XG4gIHJldHVybiBfb2JqZWN0QXNzaWduKHt9LCByLCBsKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBtZXJnZUxlZnQ7IiwiaW1wb3J0IF9vYmplY3RBc3NpZ24gZnJvbSBcIi4vaW50ZXJuYWwvX29iamVjdEFzc2lnbi5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBDcmVhdGUgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBmaXJzdCBvYmplY3QgbWVyZ2VkIHdpdGhcbiAqIHRoZSBvd24gcHJvcGVydGllcyBvZiB0aGUgc2Vjb25kIG9iamVjdC4gSWYgYSBrZXkgZXhpc3RzIGluIGJvdGggb2JqZWN0cyxcbiAqIHRoZSB2YWx1ZSBmcm9tIHRoZSBzZWNvbmQgb2JqZWN0IHdpbGwgYmUgdXNlZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yNi4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHtrOiB2fSAtPiB7azogdn0gLT4ge2s6IHZ9XG4gKiBAcGFyYW0ge09iamVjdH0gbFxuICogQHBhcmFtIHtPYmplY3R9IHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBzZWUgUi5tZXJnZUxlZnQsIFIubWVyZ2VEZWVwUmlnaHQsIFIubWVyZ2VXaXRoLCBSLm1lcmdlV2l0aEtleVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIubWVyZ2VSaWdodCh7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogMTAgfSwgeyAnYWdlJzogNDAgfSk7XG4gKiAgICAgIC8vPT4geyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDQwIH1cbiAqXG4gKiAgICAgIGNvbnN0IHdpdGhEZWZhdWx0cyA9IFIubWVyZ2VSaWdodCh7eDogMCwgeTogMH0pO1xuICogICAgICB3aXRoRGVmYXVsdHMoe3k6IDJ9KTsgLy89PiB7eDogMCwgeTogMn1cbiAqIEBzeW1iIFIubWVyZ2VSaWdodChhLCBiKSA9IHsuLi5hLCAuLi5ifVxuICovXG5cbnZhciBtZXJnZVJpZ2h0ID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gbWVyZ2VSaWdodChsLCByKSB7XG4gIHJldHVybiBfb2JqZWN0QXNzaWduKHt9LCBsLCByKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBtZXJnZVJpZ2h0OyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBtZXJnZVdpdGhLZXkgZnJvbSBcIi4vbWVyZ2VXaXRoS2V5LmpzXCI7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSB0d28gcHJvdmlkZWQgb2JqZWN0cy4gSWZcbiAqIGEga2V5IGV4aXN0cyBpbiBib3RoIG9iamVjdHMsIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIHRoZSB2YWx1ZXNcbiAqIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGluIGVhY2ggb2JqZWN0LCB3aXRoIHRoZSByZXN1bHQgYmVpbmcgdXNlZCBhcyB0aGVcbiAqIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBvYmplY3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoKGEsIGEpIC0+IGEpIC0+IHthfSAtPiB7YX0gLT4ge2F9XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtPYmplY3R9IGxcbiAqIEBwYXJhbSB7T2JqZWN0fSByXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAc2VlIFIubWVyZ2VEZWVwV2l0aCwgUi5tZXJnZSwgUi5tZXJnZVdpdGhLZXlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm1lcmdlV2l0aChSLmNvbmNhdCxcbiAqICAgICAgICAgICAgICAgICAgeyBhOiB0cnVlLCB2YWx1ZXM6IFsxMCwgMjBdIH0sXG4gKiAgICAgICAgICAgICAgICAgIHsgYjogdHJ1ZSwgdmFsdWVzOiBbMTUsIDM1XSB9KTtcbiAqICAgICAgLy89PiB7IGE6IHRydWUsIGI6IHRydWUsIHZhbHVlczogWzEwLCAyMCwgMTUsIDM1XSB9XG4gKi9cblxudmFyIG1lcmdlV2l0aCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIG1lcmdlV2l0aChmbiwgbCwgcikge1xuICByZXR1cm4gbWVyZ2VXaXRoS2V5KGZ1bmN0aW9uIChfLCBfbCwgX3IpIHtcbiAgICByZXR1cm4gZm4oX2wsIF9yKTtcbiAgfSwgbCwgcik7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgbWVyZ2VXaXRoOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL2ludGVybmFsL19oYXMuanNcIjtcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIHR3byBwcm92aWRlZCBvYmplY3RzLiBJZlxuICogYSBrZXkgZXhpc3RzIGluIGJvdGggb2JqZWN0cywgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGtleVxuICogYW5kIHRoZSB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgaW4gZWFjaCBvYmplY3QsIHdpdGggdGhlIHJlc3VsdCBiZWluZ1xuICogdXNlZCBhcyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgaW4gdGhlIHJldHVybmVkIG9iamVjdC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnICgoU3RyaW5nLCBhLCBhKSAtPiBhKSAtPiB7YX0gLT4ge2F9IC0+IHthfVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBsXG4gKiBAcGFyYW0ge09iamVjdH0gclxuICogQHJldHVybiB7T2JqZWN0fVxuICogQHNlZSBSLm1lcmdlRGVlcFdpdGhLZXksIFIubWVyZ2UsIFIubWVyZ2VXaXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgbGV0IGNvbmNhdFZhbHVlcyA9IChrLCBsLCByKSA9PiBrID09ICd2YWx1ZXMnID8gUi5jb25jYXQobCwgcikgOiByXG4gKiAgICAgIFIubWVyZ2VXaXRoS2V5KGNvbmNhdFZhbHVlcyxcbiAqICAgICAgICAgICAgICAgICAgICAgeyBhOiB0cnVlLCB0aGluZzogJ2ZvbycsIHZhbHVlczogWzEwLCAyMF0gfSxcbiAqICAgICAgICAgICAgICAgICAgICAgeyBiOiB0cnVlLCB0aGluZzogJ2JhcicsIHZhbHVlczogWzE1LCAzNV0gfSk7XG4gKiAgICAgIC8vPT4geyBhOiB0cnVlLCBiOiB0cnVlLCB0aGluZzogJ2JhcicsIHZhbHVlczogWzEwLCAyMCwgMTUsIDM1XSB9XG4gKiBAc3ltYiBSLm1lcmdlV2l0aEtleShmLCB7IHg6IDEsIHk6IDIgfSwgeyB5OiA1LCB6OiAzIH0pID0geyB4OiAxLCB5OiBmKCd5JywgMiwgNSksIHo6IDMgfVxuICovXG5cbnZhciBtZXJnZVdpdGhLZXkgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MyhmdW5jdGlvbiBtZXJnZVdpdGhLZXkoZm4sIGwsIHIpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICB2YXIgaztcbiAgbCA9IGwgfHwge307XG4gIHIgPSByIHx8IHt9O1xuXG4gIGZvciAoayBpbiBsKSB7XG4gICAgaWYgKF9oYXMoaywgbCkpIHtcbiAgICAgIHJlc3VsdFtrXSA9IF9oYXMoaywgcikgPyBmbihrLCBsW2tdLCByW2tdKSA6IGxba107XG4gICAgfVxuICB9XG5cbiAgZm9yIChrIGluIHIpIHtcbiAgICBpZiAoX2hhcyhrLCByKSAmJiAhX2hhcyhrLCByZXN1bHQpKSB7XG4gICAgICByZXN1bHRba10gPSByW2tdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgbWVyZ2VXaXRoS2V5OyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCB0b1N0cmluZyBmcm9tIFwiLi90b1N0cmluZy5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBzbWFsbGVyIG9mIGl0cyB0d28gYXJndW1lbnRzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIE9yZCBhID0+IGEgLT4gYSAtPiBhXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5taW5CeSwgUi5tYXhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm1pbig3ODksIDEyMyk7IC8vPT4gMTIzXG4gKiAgICAgIFIubWluKCdhJywgJ2InKTsgLy89PiAnYSdcbiAqL1xuXG52YXIgbWluID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gbWluKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gYTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNhZmVNaW4oeCwgeSkge1xuICAgIGlmICh4IDwgeSAhPT0geSA8IHgpIHtcbiAgICAgIHJldHVybiB5IDwgeCA/IHkgOiB4O1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB2YXIgbWluQnlWYWx1ZSA9IHNhZmVNaW4oYSwgYik7XG5cbiAgaWYgKG1pbkJ5VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBtaW5CeVZhbHVlO1xuICB9XG5cbiAgdmFyIG1pbkJ5VHlwZSA9IHNhZmVNaW4odHlwZW9mIGEsIHR5cGVvZiBiKTtcblxuICBpZiAobWluQnlUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbWluQnlUeXBlID09PSB0eXBlb2YgYSA/IGEgOiBiO1xuICB9XG5cbiAgdmFyIHN0cmluZ0EgPSB0b1N0cmluZyhhKTtcbiAgdmFyIG1pbkJ5U3RyaW5nVmFsdWUgPSBzYWZlTWluKHN0cmluZ0EsIHRvU3RyaW5nKGIpKTtcblxuICBpZiAobWluQnlTdHJpbmdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG1pbkJ5U3RyaW5nVmFsdWUgPT09IHN0cmluZ0EgPyBhIDogYjtcbiAgfVxuXG4gIHJldHVybiBhO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG1pbjsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgbWluIGZyb20gXCIuL21pbi5qc1wiO1xuLyoqXG4gKiBUYWtlcyBhIGZ1bmN0aW9uIGFuZCB0d28gdmFsdWVzLCBhbmQgcmV0dXJucyB3aGljaGV2ZXIgdmFsdWUgcHJvZHVjZXMgdGhlXG4gKiBzbWFsbGVyIHJlc3VsdCB3aGVuIHBhc3NlZCB0byB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOC4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgT3JkIGIgPT4gKGEgLT4gYikgLT4gYSAtPiBhIC0+IGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLm1pbiwgUi5tYXhCeVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIC8vICBzcXVhcmUgOjogTnVtYmVyIC0+IE51bWJlclxuICogICAgICBjb25zdCBzcXVhcmUgPSBuID0+IG4gKiBuO1xuICpcbiAqICAgICAgUi5taW5CeShzcXVhcmUsIC0zLCAyKTsgLy89PiAyXG4gKlxuICogICAgICBSLnJlZHVjZShSLm1pbkJ5KHNxdWFyZSksIEluZmluaXR5LCBbMywgLTUsIDQsIDEsIC0yXSk7IC8vPT4gMVxuICogICAgICBSLnJlZHVjZShSLm1pbkJ5KHNxdWFyZSksIEluZmluaXR5LCBbXSk7IC8vPT4gSW5maW5pdHlcbiAqL1xuXG52YXIgbWluQnkgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MyhmdW5jdGlvbiBtaW5CeShmLCBhLCBiKSB7XG4gIHZhciByZXN1bHRCID0gZihiKTtcbiAgcmV0dXJuIG1pbihmKGEpLCByZXN1bHRCKSA9PT0gcmVzdWx0QiA/IGIgOiBhO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG1pbkJ5OyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBtb2RpZnlQYXRoIGZyb20gXCIuL21vZGlmeVBhdGguanNcIjtcbi8qKlxuICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhlIHBhc3NlZCBvYmplY3QgYnkgYXBwbHlpbmcgYW4gYGZuYCBmdW5jdGlvbiB0byB0aGUgZ2l2ZW4gYHByb3BgIHByb3BlcnR5LlxuICpcbiAqIFRoZSBmdW5jdGlvbiB3aWxsIG5vdCBiZSBpbnZva2VkLCBhbmQgdGhlIG9iamVjdCB3aWxsIG5vdCBjaGFuZ2VcbiAqIGlmIGl0cyBjb3JyZXNwb25kaW5nIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0IGluIHRoZSBvYmplY3QuXG4gKiBBbGwgbm9uLXByaW1pdGl2ZSBwcm9wZXJ0aWVzIGFyZSBjb3BpZWQgdG8gdGhlIG5ldyBvYmplY3QgYnkgcmVmZXJlbmNlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI4LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgSWR4IC0+ICh2IC0+IHYpIC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gcHJvcCBUaGUgcHJvcGVydHkgdG8gYmUgbW9kaWZpZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgdG8gdGhlIHByb3BlcnR5LlxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIHRyYW5zZm9ybWVkLlxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgdHJhbnNmb3JtZWQgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHBlcnNvbiA9IHtuYW1lOiAnSmFtZXMnLCBhZ2U6IDIwLCBwZXRzOiBbJ2RvZycsICdjYXQnXX07XG4gKiAgICAgIFIubW9kaWZ5KCdhZ2UnLCBSLmFkZCgxKSwgcGVyc29uKTsgLy89PiB7bmFtZTogJ0phbWVzJywgYWdlOiAyMSwgcGV0czogWydkb2cnLCAnY2F0J119XG4gKiAgICAgIFIubW9kaWZ5KCdwZXRzJywgUi5hcHBlbmQoJ3R1cnRsZScpLCBwZXJzb24pOyAvLz0+IHtuYW1lOiAnSmFtZXMnLCBhZ2U6IDIwLCBwZXRzOiBbJ2RvZycsICdjYXQnLCAndHVydGxlJ119XG4gKi9cblxudmFyIG1vZGlmeSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIG1vZGlmeShwcm9wLCBmbiwgb2JqZWN0KSB7XG4gIHJldHVybiBtb2RpZnlQYXRoKFtwcm9wXSwgZm4sIG9iamVjdCk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgbW9kaWZ5OyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBfaXNBcnJheSBmcm9tIFwiLi9pbnRlcm5hbC9faXNBcnJheS5qc1wiO1xuaW1wb3J0IF9pc09iamVjdCBmcm9tIFwiLi9pbnRlcm5hbC9faXNPYmplY3QuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL2ludGVybmFsL19oYXMuanNcIjtcbmltcG9ydCBfYXNzb2MgZnJvbSBcIi4vaW50ZXJuYWwvX2Fzc29jLmpzXCI7XG5pbXBvcnQgX21vZGlmeSBmcm9tIFwiLi9pbnRlcm5hbC9fbW9kaWZ5LmpzXCI7XG4vKipcbiAqIENyZWF0ZXMgYSBzaGFsbG93IGNsb25lIG9mIHRoZSBwYXNzZWQgb2JqZWN0IGJ5IGFwcGx5aW5nIGFuIGBmbmAgZnVuY3Rpb25cbiAqIHRvIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gcGF0aC5cbiAqXG4gKiBUaGUgZnVuY3Rpb24gd2lsbCBub3QgYmUgaW52b2tlZCwgYW5kIHRoZSBvYmplY3Qgd2lsbCBub3QgY2hhbmdlXG4gKiBpZiBpdHMgY29ycmVzcG9uZGluZyBwYXRoIGRvZXMgbm90IGV4aXN0IGluIHRoZSBvYmplY3QuXG4gKiBBbGwgbm9uLXByaW1pdGl2ZSBwcm9wZXJ0aWVzIGFyZSBjb3BpZWQgdG8gdGhlIG5ldyBvYmplY3QgYnkgcmVmZXJlbmNlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI4LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgW0lkeF0gLT4gKHYgLT4gdikgLT4ge2s6IHZ9IC0+IHtrOiB2fVxuICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byBiZSBtb2RpZmllZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBhcHBseSB0byB0aGUgcGF0aC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSB0cmFuc2Zvcm1lZC5cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHRyYW5zZm9ybWVkIG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBwZXJzb24gPSB7bmFtZTogJ0phbWVzJywgYWRkcmVzczogeyB6aXBDb2RlOiAnOTAyMTYnIH19O1xuICogICAgICBSLm1vZGlmeVBhdGgoWydhZGRyZXNzJywgJ3ppcENvZGUnXSwgUi5yZXZlcnNlLCBwZXJzb24pOyAvLz0+IHtuYW1lOiAnSmFtZXMnLCBhZGRyZXNzOiB7IHppcENvZGU6ICc2MTIwOScgfX1cbiAqXG4gKiAgICAgIC8vIENhbiBoYW5kbGUgYXJyYXlzIHRvb1xuICogICAgICBjb25zdCBwZXJzb24gPSB7bmFtZTogJ0phbWVzJywgYWRkcmVzc2VzOiBbeyB6aXBDb2RlOiAnOTAyMTYnIH1dfTtcbiAqICAgICAgUi5tb2RpZnlQYXRoKFsnYWRkcmVzc2VzJywgMCwgJ3ppcENvZGUnXSwgUi5yZXZlcnNlLCBwZXJzb24pOyAvLz0+IHtuYW1lOiAnSmFtZXMnLCBhZGRyZXNzZXM6IFt7IHppcENvZGU6ICc2MTIwOScgfV19XG4gKi9cblxudmFyIG1vZGlmeVBhdGggPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MyhmdW5jdGlvbiBtb2RpZnlQYXRoKHBhdGgsIGZuLCBvYmplY3QpIHtcbiAgaWYgKCFfaXNPYmplY3Qob2JqZWN0KSAmJiAhX2lzQXJyYXkob2JqZWN0KSB8fCBwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICB2YXIgaWR4ID0gcGF0aFswXTtcblxuICBpZiAoIV9oYXMoaWR4LCBvYmplY3QpKSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuXG4gIGlmIChwYXRoLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBfbW9kaWZ5KGlkeCwgZm4sIG9iamVjdCk7XG4gIH1cblxuICB2YXIgdmFsID0gbW9kaWZ5UGF0aChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChwYXRoLCAxKSwgZm4sIG9iamVjdFtpZHhdKTtcblxuICBpZiAodmFsID09PSBvYmplY3RbaWR4XSkge1xuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICByZXR1cm4gX2Fzc29jKGlkeCwgdmFsLCBvYmplY3QpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG1vZGlmeVBhdGg7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBEaXZpZGVzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgYnkgdGhlIHNlY29uZCBhbmQgcmV0dXJucyB0aGUgcmVtYWluZGVyLiBOb3RlXG4gKiB0aGF0IHRoaXMgZnVuY3Rpb24gcHJlc2VydmVzIHRoZSBKYXZhU2NyaXB0LXN0eWxlIGJlaGF2aW9yIGZvciBtb2R1bG8uIEZvclxuICogbWF0aGVtYXRpY2FsIG1vZHVsbyBzZWUgW2BtYXRoTW9kYF0oI21hdGhNb2QpLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMVxuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBzaWcgTnVtYmVyIC0+IE51bWJlciAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhIFRoZSB2YWx1ZSB0byB0aGUgZGl2aWRlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGIgVGhlIHBzZXVkby1tb2R1bHVzXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSByZXN1bHQgb2YgYGIgJSBhYC5cbiAqIEBzZWUgUi5tYXRoTW9kXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5tb2R1bG8oMTcsIDMpOyAvLz0+IDJcbiAqICAgICAgLy8gSlMgYmVoYXZpb3I6XG4gKiAgICAgIFIubW9kdWxvKC0xNywgMyk7IC8vPT4gLTJcbiAqICAgICAgUi5tb2R1bG8oMTcsIC0zKTsgLy89PiAyXG4gKlxuICogICAgICBjb25zdCBpc09kZCA9IFIubW9kdWxvKFIuX18sIDIpO1xuICogICAgICBpc09kZCg0Mik7IC8vPT4gMFxuICogICAgICBpc09kZCgyMSk7IC8vPT4gMVxuICovXG5cbnZhciBtb2R1bG8gPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBtb2R1bG8oYSwgYikge1xuICByZXR1cm4gYSAlIGI7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgbW9kdWxvOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbi8qKlxuICogTW92ZSBhbiBpdGVtLCBhdCBpbmRleCBgZnJvbWAsIHRvIGluZGV4IGB0b2AsIGluIGEgbGlzdCBvZiBlbGVtZW50cy5cbiAqIEEgbmV3IGxpc3Qgd2lsbCBiZSBjcmVhdGVkIGNvbnRhaW5pbmcgdGhlIG5ldyBlbGVtZW50cyBvcmRlci5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yNy4xXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7TnVtYmVyfSBmcm9tIFRoZSBzb3VyY2UgaW5kZXhcbiAqIEBwYXJhbSB7TnVtYmVyfSB0byBUaGUgZGVzdGluYXRpb24gaW5kZXhcbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3Qgd2hpY2ggd2lsbCBzZXJ2ZSB0byByZWFsaXNlIHRoZSBtb3ZlXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIG5ldyBsaXN0IHJlb3JkZXJlZFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIubW92ZSgwLCAyLCBbJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJ10pOyAvLz0+IFsnYicsICdjJywgJ2EnLCAnZCcsICdlJywgJ2YnXVxuICogICAgICBSLm1vdmUoLTEsIDAsIFsnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnXSk7IC8vPT4gWydmJywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZSddIGxpc3Qgcm90YXRpb25cbiAqL1xuXG52YXIgbW92ZSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIChmcm9tLCB0bywgbGlzdCkge1xuICB2YXIgbGVuZ3RoID0gbGlzdC5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSBsaXN0LnNsaWNlKCk7XG4gIHZhciBwb3NpdGl2ZUZyb20gPSBmcm9tIDwgMCA/IGxlbmd0aCArIGZyb20gOiBmcm9tO1xuICB2YXIgcG9zaXRpdmVUbyA9IHRvIDwgMCA/IGxlbmd0aCArIHRvIDogdG87XG4gIHZhciBpdGVtID0gcmVzdWx0LnNwbGljZShwb3NpdGl2ZUZyb20sIDEpO1xuICByZXR1cm4gcG9zaXRpdmVGcm9tIDwgMCB8fCBwb3NpdGl2ZUZyb20gPj0gbGlzdC5sZW5ndGggfHwgcG9zaXRpdmVUbyA8IDAgfHwgcG9zaXRpdmVUbyA+PSBsaXN0Lmxlbmd0aCA/IGxpc3QgOiBbXS5jb25jYXQocmVzdWx0LnNsaWNlKDAsIHBvc2l0aXZlVG8pKS5jb25jYXQoaXRlbSkuY29uY2F0KHJlc3VsdC5zbGljZShwb3NpdGl2ZVRvLCBsaXN0Lmxlbmd0aCkpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG1vdmU7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBudW1iZXJzLiBFcXVpdmFsZW50IHRvIGBhICogYmAgYnV0IGN1cnJpZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTWF0aFxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IE51bWJlclxuICogQHBhcmFtIHtOdW1iZXJ9IGEgVGhlIGZpcnN0IHZhbHVlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGIgVGhlIHNlY29uZCB2YWx1ZS5cbiAqIEByZXR1cm4ge051bWJlcn0gVGhlIHJlc3VsdCBvZiBgYSAqIGJgLlxuICogQHNlZSBSLmRpdmlkZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGRvdWJsZSA9IFIubXVsdGlwbHkoMik7XG4gKiAgICAgIGNvbnN0IHRyaXBsZSA9IFIubXVsdGlwbHkoMyk7XG4gKiAgICAgIGRvdWJsZSgzKTsgICAgICAgLy89PiAgNlxuICogICAgICB0cmlwbGUoNCk7ICAgICAgIC8vPT4gMTJcbiAqICAgICAgUi5tdWx0aXBseSgyLCA1KTsgIC8vPT4gMTBcbiAqL1xuXG52YXIgbXVsdGlwbHkgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBtdWx0aXBseShhLCBiKSB7XG4gIHJldHVybiBhICogYjtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBtdWx0aXBseTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIFdyYXBzIGEgZnVuY3Rpb24gb2YgYW55IGFyaXR5IChpbmNsdWRpbmcgbnVsbGFyeSkgaW4gYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHNcbiAqIGV4YWN0bHkgYG5gIHBhcmFtZXRlcnMuIEFueSBleHRyYW5lb3VzIHBhcmFtZXRlcnMgd2lsbCBub3QgYmUgcGFzc2VkIHRvIHRoZVxuICogc3VwcGxpZWQgZnVuY3Rpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgTnVtYmVyIC0+ICgqIC0+IGEpIC0+ICgqIC0+IGEpXG4gKiBAcGFyYW0ge051bWJlcn0gbiBUaGUgZGVzaXJlZCBhcml0eSBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcgZnVuY3Rpb24gd3JhcHBpbmcgYGZuYC4gVGhlIG5ldyBmdW5jdGlvbiBpcyBndWFyYW50ZWVkIHRvIGJlIG9mXG4gKiAgICAgICAgIGFyaXR5IGBuYC5cbiAqIEBzZWUgUi5iaW5hcnksIFIudW5hcnlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCB0YWtlc1R3b0FyZ3MgPSAoYSwgYikgPT4gW2EsIGJdO1xuICpcbiAqICAgICAgdGFrZXNUd29BcmdzLmxlbmd0aDsgLy89PiAyXG4gKiAgICAgIHRha2VzVHdvQXJncygxLCAyKTsgLy89PiBbMSwgMl1cbiAqXG4gKiAgICAgIGNvbnN0IHRha2VzT25lQXJnID0gUi5uQXJ5KDEsIHRha2VzVHdvQXJncyk7XG4gKiAgICAgIHRha2VzT25lQXJnLmxlbmd0aDsgLy89PiAxXG4gKiAgICAgIC8vIE9ubHkgYG5gIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIHRoZSB3cmFwcGVkIGZ1bmN0aW9uXG4gKiAgICAgIHRha2VzT25lQXJnKDEsIDIpOyAvLz0+IFsxLCB1bmRlZmluZWRdXG4gKiBAc3ltYiBSLm5BcnkoMCwgZikoYSwgYikgPSBmKClcbiAqIEBzeW1iIFIubkFyeSgxLCBmKShhLCBiKSA9IGYoYSlcbiAqIEBzeW1iIFIubkFyeSgyLCBmKShhLCBiKSA9IGYoYSwgYilcbiAqL1xuXG52YXIgbkFyeSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIG5BcnkobiwgZm4pIHtcbiAgc3dpdGNoIChuKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcyk7XG4gICAgICB9O1xuXG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCkge1xuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBhMCk7XG4gICAgICB9O1xuXG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEpIHtcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgYTAsIGExKTtcbiAgICAgIH07XG5cbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwLCBhMSwgYTIpIHtcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgYTAsIGExLCBhMik7XG4gICAgICB9O1xuXG4gICAgY2FzZSA0OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMykge1xuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBhMCwgYTEsIGEyLCBhMyk7XG4gICAgICB9O1xuXG4gICAgY2FzZSA1OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQpIHtcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgYTAsIGExLCBhMiwgYTMsIGE0KTtcbiAgICAgIH07XG5cbiAgICBjYXNlIDY6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpIHtcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgYTAsIGExLCBhMiwgYTMsIGE0LCBhNSk7XG4gICAgICB9O1xuXG4gICAgY2FzZSA3OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikge1xuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7XG4gICAgICB9O1xuXG4gICAgY2FzZSA4OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpIHtcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTtcbiAgICAgIH07XG5cbiAgICBjYXNlIDk6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpIHtcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7XG4gICAgICB9O1xuXG4gICAgY2FzZSAxMDpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpIHtcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpO1xuICAgICAgfTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IHRvIG5BcnkgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIG5vIGdyZWF0ZXIgdGhhbiB0ZW4nKTtcbiAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG5Bcnk7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuLyoqXG4gKiBOZWdhdGVzIGl0cyBhcmd1bWVudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC45LjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5uZWdhdGUoNDIpOyAvLz0+IC00MlxuICovXG5cbnZhciBuZWdhdGUgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiBuZWdhdGUobikge1xuICByZXR1cm4gLW47XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgbmVnYXRlOyIsImltcG9ydCBfY29tcGxlbWVudCBmcm9tIFwiLi9pbnRlcm5hbC9fY29tcGxlbWVudC5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGFsbCBmcm9tIFwiLi9hbGwuanNcIjtcbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgbm8gZWxlbWVudHMgb2YgdGhlIGxpc3QgbWF0Y2ggdGhlIHByZWRpY2F0ZSwgYGZhbHNlYFxuICogb3RoZXJ3aXNlLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBhbGxgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiBbYV0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBwcmVkaWNhdGUgaXMgbm90IHNhdGlzZmllZCBieSBldmVyeSBlbGVtZW50LCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEBzZWUgUi5hbGwsIFIuYW55XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgaXNFdmVuID0gbiA9PiBuICUgMiA9PT0gMDtcbiAqICAgICAgY29uc3QgaXNPZGQgPSBuID0+IG4gJSAyICE9PSAwO1xuICpcbiAqICAgICAgUi5ub25lKGlzRXZlbiwgWzEsIDMsIDUsIDcsIDksIDExXSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLm5vbmUoaXNPZGQsIFsxLCAzLCA1LCA3LCA4LCAxMV0pOyAvLz0+IGZhbHNlXG4gKi9cblxudmFyIG5vbmUgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBub25lKGZuLCBpbnB1dCkge1xuICByZXR1cm4gYWxsKF9jb21wbGVtZW50KGZuKSwgaW5wdXQpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG5vbmU7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgYCFgIG9mIGl0cyBhcmd1bWVudC4gSXQgd2lsbCByZXR1cm4gYHRydWVgIHdoZW5cbiAqIHBhc3NlZCBmYWxzZS15IHZhbHVlLCBhbmQgYGZhbHNlYCB3aGVuIHBhc3NlZCBhIHRydXRoLXkgb25lLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExvZ2ljXG4gKiBAc2lnICogLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSBhIGFueSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn0gdGhlIGxvZ2ljYWwgaW52ZXJzZSBvZiBwYXNzZWQgYXJndW1lbnQuXG4gKiBAc2VlIFIuY29tcGxlbWVudFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIubm90KHRydWUpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIubm90KGZhbHNlKTsgLy89PiB0cnVlXG4gKiAgICAgIFIubm90KDApOyAvLz0+IHRydWVcbiAqICAgICAgUi5ub3QoMSk7IC8vPT4gZmFsc2VcbiAqL1xuXG52YXIgbm90ID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoZnVuY3Rpb24gbm90KGEpIHtcbiAgcmV0dXJuICFhO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG5vdDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2lzU3RyaW5nIGZyb20gXCIuL2ludGVybmFsL19pc1N0cmluZy5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBudGggZWxlbWVudCBvZiB0aGUgZ2l2ZW4gbGlzdCBvciBzdHJpbmcuIElmIG4gaXMgbmVnYXRpdmUgdGhlXG4gKiBlbGVtZW50IGF0IGluZGV4IGxlbmd0aCArIG4gaXMgcmV0dXJuZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gW2FdIC0+IGEgfCBVbmRlZmluZWRcbiAqIEBzaWcgTnVtYmVyIC0+IFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXRcbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Kn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBsaXN0ID0gWydmb28nLCAnYmFyJywgJ2JheicsICdxdXV4J107XG4gKiAgICAgIFIubnRoKDEsIGxpc3QpOyAvLz0+ICdiYXInXG4gKiAgICAgIFIubnRoKC0xLCBsaXN0KTsgLy89PiAncXV1eCdcbiAqICAgICAgUi5udGgoLTk5LCBsaXN0KTsgLy89PiB1bmRlZmluZWRcbiAqXG4gKiAgICAgIFIubnRoKDIsICdhYmMnKTsgLy89PiAnYydcbiAqICAgICAgUi5udGgoMywgJ2FiYycpOyAvLz0+ICcnXG4gKiBAc3ltYiBSLm50aCgtMSwgW2EsIGIsIGNdKSA9IGNcbiAqIEBzeW1iIFIubnRoKDAsIFthLCBiLCBjXSkgPSBhXG4gKiBAc3ltYiBSLm50aCgxLCBbYSwgYiwgY10pID0gYlxuICovXG5cbnZhciBudGggPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBudGgob2Zmc2V0LCBsaXN0KSB7XG4gIHZhciBpZHggPSBvZmZzZXQgPCAwID8gbGlzdC5sZW5ndGggKyBvZmZzZXQgOiBvZmZzZXQ7XG4gIHJldHVybiBfaXNTdHJpbmcobGlzdCkgPyBsaXN0LmNoYXJBdChpZHgpIDogbGlzdFtpZHhdO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG50aDsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgY3VycnlOIGZyb20gXCIuL2N1cnJ5Ti5qc1wiO1xuaW1wb3J0IG50aCBmcm9tIFwiLi9udGguanNcIjtcbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgaXRzIG50aCBhcmd1bWVudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC45LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBOdW1iZXIgLT4gKi4uLiAtPiAqXG4gKiBAcGFyYW0ge051bWJlcn0gblxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5udGhBcmcoMSkoJ2EnLCAnYicsICdjJyk7IC8vPT4gJ2InXG4gKiAgICAgIFIubnRoQXJnKC0xKSgnYScsICdiJywgJ2MnKTsgLy89PiAnYydcbiAqIEBzeW1iIFIubnRoQXJnKC0xKShhLCBiLCBjKSA9IGNcbiAqIEBzeW1iIFIubnRoQXJnKDApKGEsIGIsIGMpID0gYVxuICogQHN5bWIgUi5udGhBcmcoMSkoYSwgYiwgYykgPSBiXG4gKi9cblxudmFyIG50aEFyZyA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIG50aEFyZyhuKSB7XG4gIHZhciBhcml0eSA9IG4gPCAwID8gMSA6IG4gKyAxO1xuICByZXR1cm4gY3VycnlOKGFyaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG50aChuLCBhcmd1bWVudHMpO1xuICB9KTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBudGhBcmc7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuLyoqXG4gKiBgb2AgaXMgYSBjdXJyaWVkIGNvbXBvc2l0aW9uIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHVuYXJ5IGZ1bmN0aW9uLlxuICogTGlrZSBbYGNvbXBvc2VgXSgjY29tcG9zZSksIGBvYCBwZXJmb3JtcyByaWdodC10by1sZWZ0IGZ1bmN0aW9uIGNvbXBvc2l0aW9uLlxuICogVW5saWtlIFtgY29tcG9zZWBdKCNjb21wb3NlKSwgdGhlIHJpZ2h0bW9zdCBmdW5jdGlvbiBwYXNzZWQgdG8gYG9gIHdpbGwgYmVcbiAqIGludm9rZWQgd2l0aCBvbmx5IG9uZSBhcmd1bWVudC4gQWxzbywgdW5saWtlIFtgY29tcG9zZWBdKCNjb21wb3NlKSwgYG9gIGlzXG4gKiBsaW1pdGVkIHRvIGFjY2VwdGluZyBvbmx5IDIgdW5hcnkgZnVuY3Rpb25zLiBUaGUgbmFtZSBvIHdhcyBjaG9zZW4gYmVjYXVzZVxuICogb2YgaXRzIHNpbWlsYXJpdHkgdG8gdGhlIG1hdGhlbWF0aWNhbCBjb21wb3NpdGlvbiBvcGVyYXRvciDiiJguXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjQuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIChiIC0+IGMpIC0+IChhIC0+IGIpIC0+IGEgLT4gY1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZ1xuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAc2VlIFIuY29tcG9zZSwgUi5waXBlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgY2xhc3N5R3JlZXRpbmcgPSBuYW1lID0+IFwiVGhlIG5hbWUncyBcIiArIG5hbWUubGFzdCArIFwiLCBcIiArIG5hbWUuZmlyc3QgKyBcIiBcIiArIG5hbWUubGFzdFxuICogICAgICBjb25zdCB5ZWxsR3JlZXRpbmcgPSBSLm8oUi50b1VwcGVyLCBjbGFzc3lHcmVldGluZyk7XG4gKiAgICAgIHllbGxHcmVldGluZyh7Zmlyc3Q6ICdKYW1lcycsIGxhc3Q6ICdCb25kJ30pOyAvLz0+IFwiVEhFIE5BTUUnUyBCT05ELCBKQU1FUyBCT05EXCJcbiAqXG4gKiAgICAgIFIubyhSLm11bHRpcGx5KDEwKSwgUi5hZGQoMTApKSgtNCkgLy89PiA2MFxuICpcbiAqIEBzeW1iIFIubyhmLCBnLCB4KSA9IGYoZyh4KSlcbiAqL1xuXG52YXIgbyA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIG8oZiwgZywgeCkge1xuICByZXR1cm4gZihnKHgpKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBvOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3QgY29udGFpbmluZyBhIHNpbmdsZSBrZXk6dmFsdWUgcGFpci5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIFN0cmluZyAtPiBhIC0+IHtTdHJpbmc6YX1cbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7Kn0gdmFsXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAc2VlIFIucGFpclxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IG1hdGNoUGhyYXNlcyA9IFIuY29tcG9zZShcbiAqICAgICAgICBSLm9iak9mKCdtdXN0JyksXG4gKiAgICAgICAgUi5tYXAoUi5vYmpPZignbWF0Y2hfcGhyYXNlJykpXG4gKiAgICAgICk7XG4gKiAgICAgIG1hdGNoUGhyYXNlcyhbJ2ZvbycsICdiYXInLCAnYmF6J10pOyAvLz0+IHttdXN0OiBbe21hdGNoX3BocmFzZTogJ2Zvbyd9LCB7bWF0Y2hfcGhyYXNlOiAnYmFyJ30sIHttYXRjaF9waHJhc2U6ICdiYXonfV19XG4gKi9cblxudmFyIG9iak9mID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gb2JqT2Yoa2V5LCB2YWwpIHtcbiAgdmFyIG9iaiA9IHt9O1xuICBvYmpba2V5XSA9IHZhbDtcbiAgcmV0dXJuIG9iajtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBvYmpPZjsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIEdpdmVuIGEgY29uc3RydWN0b3IgYW5kIGEgdmFsdWUsIHJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhhdCBjb25zdHJ1Y3RvclxuICogY29udGFpbmluZyB0aGUgdmFsdWUuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGZhbnRhc3ktbGFuZC9vZmAgbWV0aG9kIG9mIHRoZSBjb25zdHJ1Y3RvciBmaXJzdCAoaWYgcHJlc2VudClcbiAqIG9yIHRvIHRoZSBgb2ZgIG1ldGhvZCBsYXN0IChpZiBwcmVzZW50KS4gV2hlbiBuZWl0aGVyIGFyZSBwcmVzZW50LCB3cmFwcyB0aGVcbiAqIHZhbHVlIGluIGFuIGFycmF5LlxuICpcbiAqIE5vdGUgdGhpcyBgb2ZgIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBFUzYgYG9mYDsgU2VlXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9vZlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjMuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICgqIC0+IHsqfSkgLT4gYSAtPiB7YX1cbiAqIEBwYXJhbSB7T2JqZWN0fSBDdG9yIEEgY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7Kn0gdmFsIGFueSB2YWx1ZVxuICogQHJldHVybiB7Kn0gQW4gaW5zdGFuY2Ugb2YgdGhlIGBDdG9yYCB3cmFwcGluZyBgdmFsYC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm9mKEFycmF5LCA0Mik7ICAgLy89PiBbNDJdXG4gKiAgICAgIFIub2YoQXJyYXksIFs0Ml0pOyAvLz0+IFtbNDJdXVxuICogICAgICBSLm9mKE1heWJlLCA0Mik7ICAgLy89PiBNYXliZS5KdXN0KDQyKVxuICovXG5cbnZhciBvZiA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIG9mKEN0b3IsIHZhbCkge1xuICByZXR1cm4gdHlwZW9mIEN0b3JbJ2ZhbnRhc3ktbGFuZC9vZiddID09PSAnZnVuY3Rpb24nID8gQ3RvclsnZmFudGFzeS1sYW5kL29mJ10odmFsKSA6IHR5cGVvZiBDdG9yLm9mID09PSAnZnVuY3Rpb24nID8gQ3Rvci5vZih2YWwpIDogW3ZhbF07XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgb2Y7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgcGFydGlhbCBjb3B5IG9mIGFuIG9iamVjdCBvbWl0dGluZyB0aGUga2V5cyBzcGVjaWZpZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIFtTdHJpbmddIC0+IHtTdHJpbmc6ICp9IC0+IHtTdHJpbmc6ICp9XG4gKiBAcGFyYW0ge0FycmF5fSBuYW1lcyBhbiBhcnJheSBvZiBTdHJpbmcgcHJvcGVydHkgbmFtZXMgdG8gb21pdCBmcm9tIHRoZSBuZXcgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY29weSBmcm9tXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCB3aXRoIHByb3BlcnRpZXMgZnJvbSBgbmFtZXNgIG5vdCBvbiBpdC5cbiAqIEBzZWUgUi5waWNrXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5vbWl0KFsnYScsICdkJ10sIHthOiAxLCBiOiAyLCBjOiAzLCBkOiA0fSk7IC8vPT4ge2I6IDIsIGM6IDN9XG4gKi9cblxudmFyIG9taXQgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBvbWl0KG5hbWVzLCBvYmopIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICB2YXIgaW5kZXggPSB7fTtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBuYW1lcy5sZW5ndGg7XG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGluZGV4W25hbWVzW2lkeF1dID0gMTtcbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgaWYgKCFpbmRleC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgcmVzdWx0W3Byb3BdID0gb2JqW3Byb3BdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgb21pdDsiLCJpbXBvcnQgY3VycnlOIGZyb20gXCIuL2ludGVybmFsL19jdXJyeU4uanNcIjtcbi8qKlxuICogVGFrZXMgYSBiaW5hcnkgZnVuY3Rpb24gYGZgLCBhIHVuYXJ5IGZ1bmN0aW9uIGBnYCwgYW5kIHR3byB2YWx1ZXMuXG4gKiBBcHBsaWVzIGBnYCB0byBlYWNoIHZhbHVlLCB0aGVuIGFwcGxpZXMgdGhlIHJlc3VsdCBvZiBlYWNoIHRvIGBmYC5cbiAqXG4gKiBBbHNvIGtub3duIGFzIHRoZSBQIGNvbWJpbmF0b3IuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjguMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICgoYSwgYSkgLT4gYikgLT4gKGMgLT4gYSkgLT4gYyAtPiBjIC0+IGJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGYgYSBiaW5hcnkgZnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGcgYSB1bmFyeSBmdW5jdGlvblxuICogQHBhcmFtIHthbnl9IGEgYW55IHZhbHVlXG4gKiBAcGFyYW0ge2FueX0gYiBhbnkgdmFsdWVcbiAqIEByZXR1cm4ge2FueX0gVGhlIHJlc3VsdCBvZiBgZmBcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBlcUJ5ID0gUi5vbigoYSwgYikgPT4gYSA9PT0gYik7XG4gKiAgICAgIGVxQnkoUi5wcm9wKCdhJyksIHtiOjAsIGE6MX0sIHthOjF9KSAvLz0+IHRydWU7XG4gKlxuICogICAgICBjb25zdCBjb250YWluc0luc2Vuc2l0aXZlID0gUi5vbihSLmluY2x1ZGVzLCBSLnRvTG93ZXIpO1xuICogICAgICBjb250YWluc0luc2Vuc2l0aXZlKCdvJywgJ0ZPTycpOyAvLz0+IHRydWVcbiAqIEBzeW1iIFIub24oZiwgZywgYSwgYikgPSBmKGcoYSksIGcoYikpXG4gKi9cblxudmFyIG9uID1cbi8qI19fUFVSRV9fKi9cbmN1cnJ5Tig0LCBbXSwgZnVuY3Rpb24gb24oZiwgZywgYSwgYikge1xuICByZXR1cm4gZihnKGEpLCBnKGIpKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgb247IiwiaW1wb3J0IF9hcml0eSBmcm9tIFwiLi9pbnRlcm5hbC9fYXJpdHkuanNcIjtcbmltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbi8qKlxuICogQWNjZXB0cyBhIGZ1bmN0aW9uIGBmbmAgYW5kIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGd1YXJkcyBpbnZvY2F0aW9uIG9mXG4gKiBgZm5gIHN1Y2ggdGhhdCBgZm5gIGNhbiBvbmx5IGV2ZXIgYmUgY2FsbGVkIG9uY2UsIG5vIG1hdHRlciBob3cgbWFueSB0aW1lc1xuICogdGhlIHJldHVybmVkIGZ1bmN0aW9uIGlzIGludm9rZWQuIFRoZSBmaXJzdCB2YWx1ZSBjYWxjdWxhdGVkIGlzIHJldHVybmVkIGluXG4gKiBzdWJzZXF1ZW50IGludm9jYXRpb25zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIChhLi4uIC0+IGIpIC0+IChhLi4uIC0+IGIpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gd3JhcCBpbiBhIGNhbGwtb25seS1vbmNlIHdyYXBwZXIuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIHdyYXBwZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgYWRkT25lT25jZSA9IFIub25jZSh4ID0+IHggKyAxKTtcbiAqICAgICAgYWRkT25lT25jZSgxMCk7IC8vPT4gMTFcbiAqICAgICAgYWRkT25lT25jZShhZGRPbmVPbmNlKDUwKSk7IC8vPT4gMTFcbiAqL1xuXG52YXIgb25jZSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIG9uY2UoZm4pIHtcbiAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuICB2YXIgcmVzdWx0O1xuICByZXR1cm4gX2FyaXR5KGZuLmxlbmd0aCwgZnVuY3Rpb24gKCkge1xuICAgIGlmIChjYWxsZWQpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY2FsbGVkID0gdHJ1ZTtcbiAgICByZXN1bHQgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG9uY2U7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudCBpZiBpdCBpcyB0cnV0aHksIG90aGVyd2lzZSB0aGUgc2Vjb25kIGFyZ3VtZW50LlxuICogQWN0cyBhcyB0aGUgYm9vbGVhbiBgb3JgIHN0YXRlbWVudCBpZiBib3RoIGlucHV0cyBhcmUgYEJvb2xlYW5gcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMb2dpY1xuICogQHNpZyBhIC0+IGIgLT4gYSB8IGJcbiAqIEBwYXJhbSB7QW55fSBhXG4gKiBAcGFyYW0ge0FueX0gYlxuICogQHJldHVybiB7QW55fVxuICogQHNlZSBSLmVpdGhlciwgUi5hbmRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm9yKHRydWUsIHRydWUpOyAvLz0+IHRydWVcbiAqICAgICAgUi5vcih0cnVlLCBmYWxzZSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLm9yKGZhbHNlLCB0cnVlKTsgLy89PiB0cnVlXG4gKiAgICAgIFIub3IoZmFsc2UsIGZhbHNlKTsgLy89PiBmYWxzZVxuICovXG5cbnZhciBvciA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIG9yKGEsIGIpIHtcbiAgcmV0dXJuIGEgfHwgYjtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBvcjsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2Fzc2VydFByb21pc2UgZnJvbSBcIi4vaW50ZXJuYWwvX2Fzc2VydFByb21pc2UuanNcIjtcbi8qKlxuICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBvbkZhaWx1cmUgZnVuY3Rpb24gdG8gdGhlIHZhbHVlIGluc2lkZVxuICogYSBmYWlsZWQgcHJvbWlzZS4gVGhpcyBpcyB1c2VmdWwgZm9yIGhhbmRsaW5nIHJlamVjdGVkIHByb21pc2VzXG4gKiBpbnNpZGUgZnVuY3Rpb24gY29tcG9zaXRpb25zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI2LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoZSAtPiBiKSAtPiAoUHJvbWlzZSBlIGEpIC0+IChQcm9taXNlIGUgYilcbiAqIEBzaWcgKGUgLT4gKFByb21pc2UgZiBiKSkgLT4gKFByb21pc2UgZSBhKSAtPiAoUHJvbWlzZSBmIGIpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkZhaWx1cmUgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5LiBDYW4gcmV0dXJuIGEgdmFsdWUgb3IgYSBwcm9taXNlIG9mIGEgdmFsdWUuXG4gKiBAcGFyYW0ge1Byb21pc2V9IHBcbiAqIEByZXR1cm4ge1Byb21pc2V9IFRoZSByZXN1bHQgb2YgY2FsbGluZyBgcC50aGVuKG51bGwsIG9uRmFpbHVyZSlgXG4gKiBAc2VlIFIuYW5kVGhlblxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGZhaWxlZEZldGNoID0gaWQgPT4gUHJvbWlzZS5yZWplY3QoJ2JhZCBJRCcpO1xuICogICAgICBjb25zdCB1c2VEZWZhdWx0ID0gKCkgPT4gKHsgZmlyc3ROYW1lOiAnQm9iJywgbGFzdE5hbWU6ICdMb2JsYXcnIH0pO1xuICpcbiAqICAgICAgLy9yZWNvdmVyRnJvbUZhaWx1cmUgOjogU3RyaW5nIC0+IFByb21pc2UgKHsgZmlyc3ROYW1lLCBsYXN0TmFtZSB9KVxuICogICAgICBjb25zdCByZWNvdmVyRnJvbUZhaWx1cmUgPSBSLnBpcGUoXG4gKiAgICAgICAgZmFpbGVkRmV0Y2gsXG4gKiAgICAgICAgUi5vdGhlcndpc2UodXNlRGVmYXVsdCksXG4gKiAgICAgICAgUi5hbmRUaGVuKFIucGljayhbJ2ZpcnN0TmFtZScsICdsYXN0TmFtZSddKSksXG4gKiAgICAgICk7XG4gKiAgICAgIHJlY292ZXJGcm9tRmFpbHVyZSgxMjM0NSkudGhlbihjb25zb2xlLmxvZyk7XG4gKi9cblxudmFyIG90aGVyd2lzZSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIG90aGVyd2lzZShmLCBwKSB7XG4gIF9hc3NlcnRQcm9taXNlKCdvdGhlcndpc2UnLCBwKTtcblxuICByZXR1cm4gcC50aGVuKG51bGwsIGYpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG90aGVyd2lzZTsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7IC8vIGBJZGVudGl0eWAgaXMgYSBmdW5jdG9yIHRoYXQgaG9sZHMgYSBzaW5nbGUgdmFsdWUsIHdoZXJlIGBtYXBgIHNpbXBseVxuLy8gdHJhbnNmb3JtcyB0aGUgaGVsZCB2YWx1ZSB3aXRoIHRoZSBwcm92aWRlZCBmdW5jdGlvbi5cblxudmFyIElkZW50aXR5ID0gZnVuY3Rpb24gKHgpIHtcbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogeCxcbiAgICBtYXA6IGZ1bmN0aW9uIChmKSB7XG4gICAgICByZXR1cm4gSWRlbnRpdHkoZih4KSk7XG4gICAgfVxuICB9O1xufTtcbi8qKlxuICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIFwic2V0dGluZ1wiIHRoZSBwb3J0aW9uIG9mIHRoZSBnaXZlbiBkYXRhIHN0cnVjdHVyZVxuICogZm9jdXNlZCBieSB0aGUgZ2l2ZW4gbGVucyB0byB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBmdW5jdGlvbiB0b1xuICogdGhlIGZvY3VzZWQgdmFsdWUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTYuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIExlbnMgcyBhID0gRnVuY3RvciBmID0+IChhIC0+IGYgYSkgLT4gcyAtPiBmIHNcbiAqIEBzaWcgTGVucyBzIGEgLT4gKGEgLT4gYSkgLT4gcyAtPiBzXG4gKiBAcGFyYW0ge0xlbnN9IGxlbnNcbiAqIEBwYXJhbSB7Kn0gdlxuICogQHBhcmFtIHsqfSB4XG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLnZpZXcsIFIuc2V0LCBSLmxlbnMsIFIubGVuc0luZGV4LCBSLmxlbnNQcm9wLCBSLmxlbnNQYXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgaGVhZExlbnMgPSBSLmxlbnNJbmRleCgwKTtcbiAqXG4gKiAgICAgIFIub3ZlcihoZWFkTGVucywgUi50b1VwcGVyLCBbJ2ZvbycsICdiYXInLCAnYmF6J10pOyAvLz0+IFsnRk9PJywgJ2JhcicsICdiYXonXVxuICovXG5cblxudmFyIG92ZXIgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MyhmdW5jdGlvbiBvdmVyKGxlbnMsIGYsIHgpIHtcbiAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBnZXR0ZXIgZnVuY3Rpb24gaXMgZmlyc3QgdHJhbnNmb3JtZWQgd2l0aCBgZmAsXG4gIC8vIHRoZW4gc2V0IGFzIHRoZSB2YWx1ZSBvZiBhbiBgSWRlbnRpdHlgLiBUaGlzIGlzIHRoZW4gbWFwcGVkIG92ZXIgd2l0aCB0aGVcbiAgLy8gc2V0dGVyIGZ1bmN0aW9uIG9mIHRoZSBsZW5zLlxuICByZXR1cm4gbGVucyhmdW5jdGlvbiAoeSkge1xuICAgIHJldHVybiBJZGVudGl0eShmKHkpKTtcbiAgfSkoeCkudmFsdWU7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgb3ZlcjsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIFRha2VzIHR3byBhcmd1bWVudHMsIGBmc3RgIGFuZCBgc25kYCwgYW5kIHJldHVybnMgYFtmc3QsIHNuZF1gLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE4LjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIGEgLT4gYiAtPiAoYSxiKVxuICogQHBhcmFtIHsqfSBmc3RcbiAqIEBwYXJhbSB7Kn0gc25kXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBzZWUgUi5vYmpPZiwgUi5vZlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucGFpcignZm9vJywgJ2JhcicpOyAvLz0+IFsnZm9vJywgJ2JhciddXG4gKi9cblxudmFyIHBhaXIgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBwYWlyKGZzdCwgc25kKSB7XG4gIHJldHVybiBbZnN0LCBzbmRdO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHBhaXI7IiwiaW1wb3J0IF9jb25jYXQgZnJvbSBcIi4vaW50ZXJuYWwvX2NvbmNhdC5qc1wiO1xuaW1wb3J0IF9jcmVhdGVQYXJ0aWFsQXBwbGljYXRvciBmcm9tIFwiLi9pbnRlcm5hbC9fY3JlYXRlUGFydGlhbEFwcGxpY2F0b3IuanNcIjtcbi8qKlxuICogVGFrZXMgYSBmdW5jdGlvbiBgZmAgYW5kIGEgbGlzdCBvZiBhcmd1bWVudHMsIGFuZCByZXR1cm5zIGEgZnVuY3Rpb24gYGdgLlxuICogV2hlbiBhcHBsaWVkLCBgZ2AgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIGBmYCB0byB0aGUgYXJndW1lbnRzXG4gKiBwcm92aWRlZCBpbml0aWFsbHkgZm9sbG93ZWQgYnkgdGhlIGFyZ3VtZW50cyBwcm92aWRlZCB0byBgZ2AuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTAuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICgoYSwgYiwgYywgLi4uLCBuKSAtPiB4KSAtPiBbYSwgYiwgYywgLi4uXSAtPiAoKGQsIGUsIGYsIC4uLiwgbikgLT4geClcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3NcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQHNlZSBSLnBhcnRpYWxSaWdodCwgUi5jdXJyeVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IG11bHRpcGx5MiA9IChhLCBiKSA9PiBhICogYjtcbiAqICAgICAgY29uc3QgZG91YmxlID0gUi5wYXJ0aWFsKG11bHRpcGx5MiwgWzJdKTtcbiAqICAgICAgZG91YmxlKDMpOyAvLz0+IDZcbiAqXG4gKiAgICAgIGNvbnN0IGdyZWV0ID0gKHNhbHV0YXRpb24sIHRpdGxlLCBmaXJzdE5hbWUsIGxhc3ROYW1lKSA9PlxuICogICAgICAgIHNhbHV0YXRpb24gKyAnLCAnICsgdGl0bGUgKyAnICcgKyBmaXJzdE5hbWUgKyAnICcgKyBsYXN0TmFtZSArICchJztcbiAqXG4gKiAgICAgIGNvbnN0IHNheUhlbGxvID0gUi5wYXJ0aWFsKGdyZWV0LCBbJ0hlbGxvJ10pO1xuICogICAgICBjb25zdCBzYXlIZWxsb1RvTXMgPSBSLnBhcnRpYWwoc2F5SGVsbG8sIFsnTXMuJ10pO1xuICogICAgICBzYXlIZWxsb1RvTXMoJ0phbmUnLCAnSm9uZXMnKTsgLy89PiAnSGVsbG8sIE1zLiBKYW5lIEpvbmVzISdcbiAqIEBzeW1iIFIucGFydGlhbChmLCBbYSwgYl0pKGMsIGQpID0gZihhLCBiLCBjLCBkKVxuICovXG5cbnZhciBwYXJ0aWFsID1cbi8qI19fUFVSRV9fKi9cbl9jcmVhdGVQYXJ0aWFsQXBwbGljYXRvcihfY29uY2F0KTtcblxuZXhwb3J0IGRlZmF1bHQgcGFydGlhbDsiLCJpbXBvcnQgbWVyZ2VEZWVwUmlnaHQgZnJvbSBcIi4vbWVyZ2VEZWVwUmlnaHQuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbi8qKlxuICogVGFrZXMgYSBmdW5jdGlvbiBgZmAgYW5kIGFuIG9iamVjdCwgYW5kIHJldHVybnMgYSBmdW5jdGlvbiBgZ2AuXG4gKiBXaGVuIGFwcGxpZWQsIGBnYCByZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgYGZgIHRvIHRoZSBvYmplY3RcbiAqIHByb3ZpZGVkIGluaXRpYWxseSBtZXJnZWQgZGVlcGx5IChyaWdodCkgd2l0aCB0aGUgb2JqZWN0IHByb3ZpZGVkIGFzIGFuIGFyZ3VtZW50IHRvIGBnYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yOC4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKCh7IGEsIGIsIGMsIC4uLiwgbiB9KSAtPiB4KSAtPiB7IGEsIGIsIGMsIC4uLn0gLT4gKHsgZCwgZSwgZiwgLi4uLCBuIH0gLT4geClcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc1xuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAc2VlIFIucGFydGlhbCwgUi5wYXJ0aWFsUmlnaHQsIFIuY3VycnksIFIubWVyZ2VEZWVwUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBtdWx0aXBseTIgPSAoeyBhLCBiIH0pID0+IGEgKiBiO1xuICogICAgICBjb25zdCBkb3VibGUgPSBSLnBhcnRpYWxPYmplY3QobXVsdGlwbHkyLCB7IGE6IDIgfSk7XG4gKiAgICAgIGRvdWJsZSh7IGI6IDIgfSk7IC8vPT4gNFxuICpcbiAqICAgICAgY29uc3QgZ3JlZXQgPSAoeyBzYWx1dGF0aW9uLCB0aXRsZSwgZmlyc3ROYW1lLCBsYXN0TmFtZSB9KSA9PlxuICogICAgICAgIHNhbHV0YXRpb24gKyAnLCAnICsgdGl0bGUgKyAnICcgKyBmaXJzdE5hbWUgKyAnICcgKyBsYXN0TmFtZSArICchJztcbiAqXG4gKiAgICAgIGNvbnN0IHNheUhlbGxvID0gUi5wYXJ0aWFsT2JqZWN0KGdyZWV0LCB7IHNhbHV0YXRpb246ICdIZWxsbycgfSk7XG4gKiAgICAgIGNvbnN0IHNheUhlbGxvVG9NcyA9IFIucGFydGlhbE9iamVjdChzYXlIZWxsbywgeyB0aXRsZTogJ01zLicgfSk7XG4gKiAgICAgIHNheUhlbGxvVG9Ncyh7IGZpcnN0TmFtZTogJ0phbmUnLCBsYXN0TmFtZTogJ0pvbmVzJyB9KTsgLy89PiAnSGVsbG8sIE1zLiBKYW5lIEpvbmVzISdcbiAqIEBzeW1iIFIucGFydGlhbE9iamVjdChmLCB7IGEsIGIgfSkoeyBjLCBkIH0pID0gZih7IGEsIGIsIGMsIGQgfSlcbiAqL1xuXG52YXIgcGFydGlhbE9iamVjdCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKChmLCBvKSA9PiBwcm9wcyA9PiBmLmNhbGwodGhpcywgbWVyZ2VEZWVwUmlnaHQobywgcHJvcHMpKSk7XG5cbmV4cG9ydCBkZWZhdWx0IHBhcnRpYWxPYmplY3Q7IiwiaW1wb3J0IF9jb25jYXQgZnJvbSBcIi4vaW50ZXJuYWwvX2NvbmNhdC5qc1wiO1xuaW1wb3J0IF9jcmVhdGVQYXJ0aWFsQXBwbGljYXRvciBmcm9tIFwiLi9pbnRlcm5hbC9fY3JlYXRlUGFydGlhbEFwcGxpY2F0b3IuanNcIjtcbmltcG9ydCBmbGlwIGZyb20gXCIuL2ZsaXAuanNcIjtcbi8qKlxuICogVGFrZXMgYSBmdW5jdGlvbiBgZmAgYW5kIGEgbGlzdCBvZiBhcmd1bWVudHMsIGFuZCByZXR1cm5zIGEgZnVuY3Rpb24gYGdgLlxuICogV2hlbiBhcHBsaWVkLCBgZ2AgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIGBmYCB0byB0aGUgYXJndW1lbnRzXG4gKiBwcm92aWRlZCB0byBgZ2AgZm9sbG93ZWQgYnkgdGhlIGFyZ3VtZW50cyBwcm92aWRlZCBpbml0aWFsbHkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTAuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICgoYSwgYiwgYywgLi4uLCBuKSAtPiB4KSAtPiBbZCwgZSwgZiwgLi4uLCBuXSAtPiAoKGEsIGIsIGMsIC4uLikgLT4geClcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3NcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQHNlZSBSLnBhcnRpYWxcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBncmVldCA9IChzYWx1dGF0aW9uLCB0aXRsZSwgZmlyc3ROYW1lLCBsYXN0TmFtZSkgPT5cbiAqICAgICAgICBzYWx1dGF0aW9uICsgJywgJyArIHRpdGxlICsgJyAnICsgZmlyc3ROYW1lICsgJyAnICsgbGFzdE5hbWUgKyAnISc7XG4gKlxuICogICAgICBjb25zdCBncmVldE1zSmFuZUpvbmVzID0gUi5wYXJ0aWFsUmlnaHQoZ3JlZXQsIFsnTXMuJywgJ0phbmUnLCAnSm9uZXMnXSk7XG4gKlxuICogICAgICBncmVldE1zSmFuZUpvbmVzKCdIZWxsbycpOyAvLz0+ICdIZWxsbywgTXMuIEphbmUgSm9uZXMhJ1xuICogQHN5bWIgUi5wYXJ0aWFsUmlnaHQoZiwgW2EsIGJdKShjLCBkKSA9IGYoYywgZCwgYSwgYilcbiAqL1xuXG52YXIgcGFydGlhbFJpZ2h0ID1cbi8qI19fUFVSRV9fKi9cbl9jcmVhdGVQYXJ0aWFsQXBwbGljYXRvcihcbi8qI19fUFVSRV9fKi9cbmZsaXAoX2NvbmNhdCkpO1xuXG5leHBvcnQgZGVmYXVsdCBwYXJ0aWFsUmlnaHQ7IiwiaW1wb3J0IGZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCBqdXh0IGZyb20gXCIuL2p1eHQuanNcIjtcbmltcG9ydCByZWplY3QgZnJvbSBcIi4vcmVqZWN0LmpzXCI7XG4vKipcbiAqIFRha2VzIGEgcHJlZGljYXRlIGFuZCBhIGxpc3Qgb3Igb3RoZXIgYEZpbHRlcmFibGVgIG9iamVjdCBhbmQgcmV0dXJucyB0aGVcbiAqIHBhaXIgb2YgZmlsdGVyYWJsZSBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgb2YgZWxlbWVudHMgd2hpY2ggZG8gYW5kIGRvIG5vdFxuICogc2F0aXNmeSwgdGhlIHByZWRpY2F0ZSwgcmVzcGVjdGl2ZWx5LiBGaWx0ZXJhYmxlIG9iamVjdHMgaW5jbHVkZSBwbGFpbiBvYmplY3RzIG9yIGFueSBvYmplY3RcbiAqIHRoYXQgaGFzIGEgZmlsdGVyIG1ldGhvZCBzdWNoIGFzIGBBcnJheWAuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS40XG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBGaWx0ZXJhYmxlIGYgPT4gKGEgLT4gQm9vbGVhbikgLT4gZiBhIC0+IFtmIGEsIGYgYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgQSBwcmVkaWNhdGUgdG8gZGV0ZXJtaW5lIHdoaWNoIHNpZGUgdGhlIGVsZW1lbnQgYmVsb25ncyB0by5cbiAqIEBwYXJhbSB7QXJyYXl9IGZpbHRlcmFibGUgdGhlIGxpc3QgKG9yIG90aGVyIGZpbHRlcmFibGUpIHRvIHBhcnRpdGlvbi5cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSwgY29udGFpbmluZyBmaXJzdCB0aGUgc3Vic2V0IG9mIGVsZW1lbnRzIHRoYXQgc2F0aXNmeSB0aGVcbiAqICAgICAgICAgcHJlZGljYXRlLCBhbmQgc2Vjb25kIHRoZSBzdWJzZXQgb2YgZWxlbWVudHMgdGhhdCBkbyBub3Qgc2F0aXNmeS5cbiAqIEBzZWUgUi5maWx0ZXIsIFIucmVqZWN0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wYXJ0aXRpb24oUi5pbmNsdWRlcygncycpLCBbJ3NzcycsICd0dHQnLCAnZm9vJywgJ2JhcnMnXSk7XG4gKiAgICAgIC8vID0+IFsgWyAnc3NzJywgJ2JhcnMnIF0sICBbICd0dHQnLCAnZm9vJyBdIF1cbiAqXG4gKiAgICAgIFIucGFydGl0aW9uKFIuaW5jbHVkZXMoJ3MnKSwgeyBhOiAnc3NzJywgYjogJ3R0dCcsIGZvbzogJ2JhcnMnIH0pO1xuICogICAgICAvLyA9PiBbIHsgYTogJ3NzcycsIGZvbzogJ2JhcnMnIH0sIHsgYjogJ3R0dCcgfSAgXVxuICovXG5cbnZhciBwYXJ0aXRpb24gPVxuLyojX19QVVJFX18qL1xuanV4dChbZmlsdGVyLCByZWplY3RdKTtcbmV4cG9ydCBkZWZhdWx0IHBhcnRpdGlvbjsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgcGF0aHMgZnJvbSBcIi4vcGF0aHMuanNcIjtcbi8qKlxuICogUmV0cmlldmVzIHRoZSB2YWx1ZSBhdCBhIGdpdmVuIHBhdGguIFRoZSBub2RlcyBvZiB0aGUgcGF0aCBjYW4gYmUgYXJiaXRyYXJ5IHN0cmluZ3Mgb3Igbm9uLW5lZ2F0aXZlIGludGVnZXJzLlxuICogRm9yIGFueXRoaW5nIGVsc2UsIHRoZSB2YWx1ZSBpcyB1bnNwZWNpZmllZC4gSW50ZWdlciBwYXRocyBhcmUgbWVhbnQgdG8gaW5kZXggYXJyYXlzLCBzdHJpbmdzIGFyZSBtZWFudCBmb3Igb2JqZWN0cy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgW0lkeF0gLT4ge2F9IC0+IGEgfCBVbmRlZmluZWRcbiAqIEBzaWcgSWR4ID0gU3RyaW5nIHwgTm9uTmVnYXRpdmVJbnRcbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gdXNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IG9yIGFycmF5IHRvIHJldHJpZXZlIHRoZSBuZXN0ZWQgcHJvcGVydHkgZnJvbS5cbiAqIEByZXR1cm4geyp9IFRoZSBkYXRhIGF0IGBwYXRoYC5cbiAqIEBzZWUgUi5wcm9wLCBSLm50aCwgUi5hc3NvY1BhdGgsIFIuZGlzc29jUGF0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucGF0aChbJ2EnLCAnYiddLCB7YToge2I6IDJ9fSk7IC8vPT4gMlxuICogICAgICBSLnBhdGgoWydhJywgJ2InXSwge2M6IHtiOiAyfX0pOyAvLz0+IHVuZGVmaW5lZFxuICogICAgICBSLnBhdGgoWydhJywgJ2InLCAwXSwge2E6IHtiOiBbMSwgMiwgM119fSk7IC8vPT4gMVxuICogICAgICBSLnBhdGgoWydhJywgJ2InLCAtMl0sIHthOiB7YjogWzEsIDIsIDNdfX0pOyAvLz0+IDJcbiAqICAgICAgUi5wYXRoKFsyXSwgeycyJzogMn0pOyAvLz0+IDJcbiAqICAgICAgUi5wYXRoKFstMl0sIHsnLTInOiAnYSd9KTsgLy89PiB1bmRlZmluZWRcbiAqL1xuXG52YXIgcGF0aCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIHBhdGgocGF0aEFyLCBvYmopIHtcbiAgcmV0dXJuIHBhdGhzKFtwYXRoQXJdLCBvYmopWzBdO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHBhdGg7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IGVxdWFscyBmcm9tIFwiLi9lcXVhbHMuanNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCIuL3BhdGguanNcIjtcbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbmVzdGVkIHBhdGggb24gYW4gb2JqZWN0IGhhcyBhIHNwZWNpZmljIHZhbHVlLCBpblxuICogW2BSLmVxdWFsc2BdKCNlcXVhbHMpIHRlcm1zLiBNb3N0IGxpa2VseSB1c2VkIHRvIGZpbHRlciBhIGxpc3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNy4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgYSAtPiBbSWR4XSAtPiB7YX0gLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIGNvbXBhcmUgdGhlIG5lc3RlZCBwcm9wZXJ0eSB3aXRoXG4gKiBAcGFyYW0ge0FycmF5fSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBuZXN0ZWQgcHJvcGVydHkgdG8gdXNlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2hlY2sgdGhlIG5lc3RlZCBwcm9wZXJ0eSBpblxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSB2YWx1ZSBlcXVhbHMgdGhlIG5lc3RlZCBvYmplY3QgcHJvcGVydHksXG4gKiAgICAgICAgIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQHNlZSBSLndoZXJlRXEsIFIucHJvcEVxLCBSLnBhdGhTYXRpc2ZpZXMsIFIuZXF1YWxzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgdXNlcjEgPSB7IGFkZHJlc3M6IHsgemlwQ29kZTogOTAyMTAgfSB9O1xuICogICAgICBjb25zdCB1c2VyMiA9IHsgYWRkcmVzczogeyB6aXBDb2RlOiA1NTU1NSB9IH07XG4gKiAgICAgIGNvbnN0IHVzZXIzID0geyBuYW1lOiAnQm9iJyB9O1xuICogICAgICBjb25zdCB1c2VycyA9IFsgdXNlcjEsIHVzZXIyLCB1c2VyMyBdO1xuICogICAgICBjb25zdCBpc0ZhbW91cyA9IFIucGF0aEVxKDkwMjEwLCBbJ2FkZHJlc3MnLCAnemlwQ29kZSddKTtcbiAqICAgICAgUi5maWx0ZXIoaXNGYW1vdXMsIHVzZXJzKTsgLy89PiBbIHVzZXIxIF1cbiAqL1xuXG52YXIgcGF0aEVxID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTMoZnVuY3Rpb24gcGF0aEVxKHZhbCwgX3BhdGgsIG9iaikge1xuICByZXR1cm4gZXF1YWxzKHBhdGgoX3BhdGgsIG9iaiksIHZhbCk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcGF0aEVxOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBkZWZhdWx0VG8gZnJvbSBcIi4vZGVmYXVsdFRvLmpzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwiLi9wYXRoLmpzXCI7XG4vKipcbiAqIElmIHRoZSBnaXZlbiwgbm9uLW51bGwgb2JqZWN0IGhhcyBhIHZhbHVlIGF0IHRoZSBnaXZlbiBwYXRoLCByZXR1cm5zIHRoZVxuICogdmFsdWUgYXQgdGhhdCBwYXRoLiBPdGhlcndpc2UgcmV0dXJucyB0aGUgcHJvdmlkZWQgZGVmYXVsdCB2YWx1ZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50IHwgU3ltYm9sXG4gKiBAc2lnIGEgLT4gW0lkeF0gLT4ge2F9IC0+IGFcbiAqIEBwYXJhbSB7Kn0gZCBUaGUgZGVmYXVsdCB2YWx1ZS5cbiAqIEBwYXJhbSB7QXJyYXl9IHAgVGhlIHBhdGggdG8gdXNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHJldHJpZXZlIHRoZSBuZXN0ZWQgcHJvcGVydHkgZnJvbS5cbiAqIEByZXR1cm4geyp9IFRoZSBkYXRhIGF0IGBwYXRoYCBvZiB0aGUgc3VwcGxpZWQgb2JqZWN0IG9yIHRoZSBkZWZhdWx0IHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucGF0aE9yKCdOL0EnLCBbJ2EnLCAnYiddLCB7YToge2I6IDJ9fSk7IC8vPT4gMlxuICogICAgICBSLnBhdGhPcignTi9BJywgWydhJywgJ2InXSwge2M6IHtiOiAyfX0pOyAvLz0+IFwiTi9BXCJcbiAqL1xuXG52YXIgcGF0aE9yID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTMoZnVuY3Rpb24gcGF0aE9yKGQsIHAsIG9iaikge1xuICByZXR1cm4gZGVmYXVsdFRvKGQsIHBhdGgocCwgb2JqKSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcGF0aE9yOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCIuL3BhdGguanNcIjtcbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgcHJvcGVydHkgYXQgZ2l2ZW4gcGF0aCBzYXRpc2ZpZXMgdGhlXG4gKiBnaXZlbiBwcmVkaWNhdGU7IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE5LjBcbiAqIEBjYXRlZ29yeSBMb2dpY1xuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludCB8IFN5bWJvbFxuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiBbSWR4XSAtPiB7YX0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZFxuICogQHBhcmFtIHtBcnJheX0gcHJvcFBhdGhcbiAqIEBwYXJhbSB7Kn0gb2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHNlZSBSLnByb3BTYXRpc2ZpZXMsIFIucGF0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucGF0aFNhdGlzZmllcyh5ID0+IHkgPiAwLCBbJ3gnLCAneSddLCB7eDoge3k6IDJ9fSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLnBhdGhTYXRpc2ZpZXMoUi5pcyhPYmplY3QpLCBbXSwge3g6IHt5OiAyfX0pOyAvLz0+IHRydWVcbiAqL1xuXG52YXIgcGF0aFNhdGlzZmllcyA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIHBhdGhTYXRpc2ZpZXMocHJlZCwgcHJvcFBhdGgsIG9iaikge1xuICByZXR1cm4gcHJlZChwYXRoKHByb3BQYXRoLCBvYmopKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBwYXRoU2F0aXNmaWVzOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaXNJbnRlZ2VyIGZyb20gXCIuL2ludGVybmFsL19pc0ludGVnZXIuanNcIjtcbmltcG9ydCBudGggZnJvbSBcIi4vbnRoLmpzXCI7XG4vKipcbiAqIFJldHJpZXZlcyB0aGUgdmFsdWVzIGF0IGdpdmVuIHBhdGhzIG9mIGFuIG9iamVjdC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yNy4xXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gW1N0cmluZyB8IEludCB8IFN5bWJvbF1cbiAqIEBzaWcgW0lkeF0gLT4ge2F9IC0+IFthIHwgVW5kZWZpbmVkXVxuICogQHBhcmFtIHtBcnJheX0gcGF0aHNBcnJheSBUaGUgYXJyYXkgb2YgcGF0aHMgdG8gYmUgZmV0Y2hlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byByZXRyaWV2ZSB0aGUgbmVzdGVkIHByb3BlcnRpZXMgZnJvbS5cbiAqIEByZXR1cm4ge0FycmF5fSBBIGxpc3QgY29uc2lzdGluZyBvZiB2YWx1ZXMgYXQgcGF0aHMgc3BlY2lmaWVkIGJ5IFwicGF0aHNBcnJheVwiLlxuICogQHNlZSBSLnBhdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnBhdGhzKFtbJ2EnLCAnYiddLCBbJ3AnLCAwLCAncSddXSwge2E6IHtiOiAyfSwgcDogW3txOiAzfV19KTsgLy89PiBbMiwgM11cbiAqICAgICAgUi5wYXRocyhbWydhJywgJ2InXSwgWydwJywgJ3InXV0sIHthOiB7YjogMn0sIHA6IFt7cTogM31dfSk7IC8vPT4gWzIsIHVuZGVmaW5lZF1cbiAqL1xuXG52YXIgcGF0aHMgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBwYXRocyhwYXRoc0FycmF5LCBvYmopIHtcbiAgcmV0dXJuIHBhdGhzQXJyYXkubWFwKGZ1bmN0aW9uIChwYXRocykge1xuICAgIHZhciB2YWwgPSBvYmo7XG4gICAgdmFyIGlkeCA9IDA7XG4gICAgdmFyIHA7XG5cbiAgICB3aGlsZSAoaWR4IDwgcGF0aHMubGVuZ3RoKSB7XG4gICAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwID0gcGF0aHNbaWR4XTtcbiAgICAgIHZhbCA9IF9pc0ludGVnZXIocCkgPyBudGgocCwgdmFsKSA6IHZhbFtwXTtcbiAgICAgIGlkeCArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiB2YWw7XG4gIH0pO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHBhdGhzOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbi8qKlxuICogUmV0dXJucyBhIHBhcnRpYWwgY29weSBvZiBhbiBvYmplY3QgY29udGFpbmluZyBvbmx5IHRoZSBrZXlzIHNwZWNpZmllZC4gSWZcbiAqIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QsIHRoZSBwcm9wZXJ0eSBpcyBpZ25vcmVkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyBba10gLT4ge2s6IHZ9IC0+IHtrOiB2fVxuICogQHBhcmFtIHtBcnJheX0gbmFtZXMgYW4gYXJyYXkgb2YgU3RyaW5nIHByb3BlcnR5IG5hbWVzIHRvIGNvcHkgb250byBhIG5ldyBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBjb3B5IGZyb21cbiAqIEByZXR1cm4ge09iamVjdH0gQSBuZXcgb2JqZWN0IHdpdGggb25seSBwcm9wZXJ0aWVzIGZyb20gYG5hbWVzYCBvbiBpdC5cbiAqIEBzZWUgUi5vbWl0LCBSLnByb3BzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5waWNrKFsnYScsICdkJ10sIHthOiAxLCBiOiAyLCBjOiAzLCBkOiA0fSk7IC8vPT4ge2E6IDEsIGQ6IDR9XG4gKiAgICAgIFIucGljayhbJ2EnLCAnZScsICdmJ10sIHthOiAxLCBiOiAyLCBjOiAzLCBkOiA0fSk7IC8vPT4ge2E6IDF9XG4gKi9cblxudmFyIHBpY2sgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBwaWNrKG5hbWVzLCBvYmopIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICB2YXIgaWR4ID0gMDtcblxuICB3aGlsZSAoaWR4IDwgbmFtZXMubGVuZ3RoKSB7XG4gICAgaWYgKG5hbWVzW2lkeF0gaW4gb2JqKSB7XG4gICAgICByZXN1bHRbbmFtZXNbaWR4XV0gPSBvYmpbbmFtZXNbaWR4XV07XG4gICAgfVxuXG4gICAgaWR4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHBpY2s7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBTaW1pbGFyIHRvIGBwaWNrYCBleGNlcHQgdGhhdCB0aGlzIG9uZSBpbmNsdWRlcyBhIGBrZXk6IHVuZGVmaW5lZGAgcGFpciBmb3JcbiAqIHByb3BlcnRpZXMgdGhhdCBkb24ndCBleGlzdC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgW2tdIC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7QXJyYXl9IG5hbWVzIGFuIGFycmF5IG9mIFN0cmluZyBwcm9wZXJ0eSBuYW1lcyB0byBjb3B5IG9udG8gYSBuZXcgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY29weSBmcm9tXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCB3aXRoIG9ubHkgcHJvcGVydGllcyBmcm9tIGBuYW1lc2Agb24gaXQuXG4gKiBAc2VlIFIucGlja1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucGlja0FsbChbJ2EnLCAnZCddLCB7YTogMSwgYjogMiwgYzogMywgZDogNH0pOyAvLz0+IHthOiAxLCBkOiA0fVxuICogICAgICBSLnBpY2tBbGwoWydhJywgJ2UnLCAnZiddLCB7YTogMSwgYjogMiwgYzogMywgZDogNH0pOyAvLz0+IHthOiAxLCBlOiB1bmRlZmluZWQsIGY6IHVuZGVmaW5lZH1cbiAqL1xuXG52YXIgcGlja0FsbCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIHBpY2tBbGwobmFtZXMsIG9iaikge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbmFtZXMubGVuZ3RoO1xuXG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICB2YXIgbmFtZSA9IG5hbWVzW2lkeF07XG4gICAgcmVzdWx0W25hbWVdID0gb2JqW25hbWVdO1xuICAgIGlkeCArPSAxO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBwaWNrQWxsOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbi8qKlxuICogUmV0dXJucyBhIHBhcnRpYWwgY29weSBvZiBhbiBvYmplY3QgY29udGFpbmluZyBvbmx5IHRoZSBrZXlzIHRoYXQgc2F0aXNmeVxuICogdGhlIHN1cHBsaWVkIHByZWRpY2F0ZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC44LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKCh2LCBrKSAtPiBCb29sZWFuKSAtPiB7azogdn0gLT4ge2s6IHZ9XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkIEEgcHJlZGljYXRlIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCBhIGtleVxuICogICAgICAgIHNob3VsZCBiZSBpbmNsdWRlZCBvbiB0aGUgb3V0cHV0IG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBjb3B5IGZyb21cbiAqIEByZXR1cm4ge09iamVjdH0gQSBuZXcgb2JqZWN0IHdpdGggb25seSBwcm9wZXJ0aWVzIHRoYXQgc2F0aXNmeSBgcHJlZGBcbiAqICAgICAgICAgb24gaXQuXG4gKiBAc2VlIFIucGljaywgUi5maWx0ZXJcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBpc1VwcGVyQ2FzZSA9ICh2YWwsIGtleSkgPT4ga2V5LnRvVXBwZXJDYXNlKCkgPT09IGtleTtcbiAqICAgICAgUi5waWNrQnkoaXNVcHBlckNhc2UsIHthOiAxLCBiOiAyLCBBOiAzLCBCOiA0fSk7IC8vPT4ge0E6IDMsIEI6IDR9XG4gKi9cblxudmFyIHBpY2tCeSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIHBpY2tCeSh0ZXN0LCBvYmopIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgaWYgKHRlc3Qob2JqW3Byb3BdLCBwcm9wLCBvYmopKSB7XG4gICAgICByZXN1bHRbcHJvcF0gPSBvYmpbcHJvcF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBwaWNrQnk7IiwiaW1wb3J0IF9hcml0eSBmcm9tIFwiLi9pbnRlcm5hbC9fYXJpdHkuanNcIjtcbmltcG9ydCBfcGlwZSBmcm9tIFwiLi9pbnRlcm5hbC9fcGlwZS5qc1wiO1xuaW1wb3J0IHJlZHVjZSBmcm9tIFwiLi9yZWR1Y2UuanNcIjtcbmltcG9ydCB0YWlsIGZyb20gXCIuL3RhaWwuanNcIjtcbi8qKlxuICogUGVyZm9ybXMgbGVmdC10by1yaWdodCBmdW5jdGlvbiBjb21wb3NpdGlvbi4gVGhlIGZpcnN0IGFyZ3VtZW50IG1heSBoYXZlXG4gKiBhbnkgYXJpdHk7IHRoZSByZW1haW5pbmcgYXJndW1lbnRzIG11c3QgYmUgdW5hcnkuXG4gKlxuICogSW4gc29tZSBsaWJyYXJpZXMgdGhpcyBmdW5jdGlvbiBpcyBuYW1lZCBgc2VxdWVuY2VgLlxuICpcbiAqICoqTm90ZToqKiBUaGUgcmVzdWx0IG9mIHBpcGUgaXMgbm90IGF1dG9tYXRpY2FsbHkgY3VycmllZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKChhLCBiLCAuLi4sIG4pIC0+IG8pLCAobyAtPiBwKSwgLi4uLCAoeCAtPiB5KSwgKHkgLT4geikpIC0+ICgoYSwgYiwgLi4uLCBuKSAtPiB6KVxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gZnVuY3Rpb25zXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBzZWUgUi5jb21wb3NlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZiA9IFIucGlwZShNYXRoLnBvdywgUi5uZWdhdGUsIFIuaW5jKTtcbiAqXG4gKiAgICAgIGYoMywgNCk7IC8vIC0oM140KSArIDFcbiAqIEBzeW1iIFIucGlwZShmLCBnLCBoKShhLCBiKSA9IGgoZyhmKGEsIGIpKSlcbiAqIEBzeW1iIFIucGlwZShmLCBnLCBoKShhKShiKSA9IGgoZyhmKGEpKSkoYilcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwaXBlKCkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcigncGlwZSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgYXJndW1lbnQnKTtcbiAgfVxuXG4gIHJldHVybiBfYXJpdHkoYXJndW1lbnRzWzBdLmxlbmd0aCwgcmVkdWNlKF9waXBlLCBhcmd1bWVudHNbMF0sIHRhaWwoYXJndW1lbnRzKSkpO1xufSIsImltcG9ydCBfYXJpdHkgZnJvbSBcIi4vaW50ZXJuYWwvX2FyaXR5LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgaGVhZCBmcm9tIFwiLi9oZWFkLmpzXCI7XG5pbXBvcnQgX3JlZHVjZSBmcm9tIFwiLi9pbnRlcm5hbC9fcmVkdWNlLmpzXCI7XG5pbXBvcnQgdGFpbCBmcm9tIFwiLi90YWlsLmpzXCI7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSBcIi4vaWRlbnRpdHkuanNcIjtcbi8qKlxuICogUGVyZm9ybXMgbGVmdC10by1yaWdodCBmdW5jdGlvbiBjb21wb3NpdGlvbiB1c2luZyB0cmFuc2Zvcm1pbmcgZnVuY3Rpb24uIFRoZSBmaXJzdCBmdW5jdGlvbiBtYXkgaGF2ZVxuICogYW55IGFyaXR5OyB0aGUgcmVtYWluaW5nIGZ1bmN0aW9ucyBtdXN0IGJlIHVuYXJ5LlxuICpcbiAqICoqTm90ZToqKiBUaGUgcmVzdWx0IG9mIHBpcGVXaXRoIGlzIG5vdCBhdXRvbWF0aWNhbGx5IGN1cnJpZWQuIFRyYW5zZm9ybWluZyBmdW5jdGlvbiBpcyBub3QgdXNlZCBvbiB0aGVcbiAqIGZpcnN0IGFyZ3VtZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI2LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKCogLT4gKiksIFsoKGEsIGIsIC4uLiwgbikgLT4gbyksIChvIC0+IHApLCAuLi4sICh4IC0+IHkpLCAoeSAtPiB6KV0pIC0+ICgoYSwgYiwgLi4uLCBuKSAtPiB6KVxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtZXIgVGhlIHRyYW5zZm9ybWluZyBmdW5jdGlvblxuICogQHBhcmFtIHtBcnJheX0gZnVuY3Rpb25zIFRoZSBmdW5jdGlvbnMgdG8gcGlwZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAc2VlIFIuY29tcG9zZVdpdGgsIFIucGlwZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHBpcGVXaGlsZU5vdE5pbCA9IFIucGlwZVdpdGgoKGYsIHJlcykgPT4gUi5pc05pbChyZXMpID8gcmVzIDogZihyZXMpKTtcbiAqICAgICAgY29uc3QgZiA9IHBpcGVXaGlsZU5vdE5pbChbTWF0aC5wb3csIFIubmVnYXRlLCBSLmluY10pXG4gKlxuICogICAgICBmKDMsIDQpOyAvLyAtKDNeNCkgKyAxXG4gKiBAc3ltYiBSLnBpcGVXaXRoKGYpKFtnLCBoLCBpXSkoLi4uYXJncykgPSBmKGksIGYoaCwgZyguLi5hcmdzKSkpXG4gKi9cblxudmFyIHBpcGVXaXRoID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gcGlwZVdpdGgoeGYsIGxpc3QpIHtcbiAgaWYgKGxpc3QubGVuZ3RoIDw9IDApIHtcbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cblxuICB2YXIgaGVhZExpc3QgPSBoZWFkKGxpc3QpO1xuICB2YXIgdGFpbExpc3QgPSB0YWlsKGxpc3QpO1xuICByZXR1cm4gX2FyaXR5KGhlYWRMaXN0Lmxlbmd0aCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfcmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIGYpIHtcbiAgICAgIHJldHVybiB4Zi5jYWxsKHRoaXMsIGYsIHJlc3VsdCk7XG4gICAgfSwgaGVhZExpc3QuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdGFpbExpc3QpO1xuICB9KTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBwaXBlV2l0aDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgbWFwIGZyb20gXCIuL21hcC5qc1wiO1xuaW1wb3J0IHByb3AgZnJvbSBcIi4vcHJvcC5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgYnkgcGx1Y2tpbmcgdGhlIHNhbWUgbmFtZWQgcHJvcGVydHkgb2ZmIGFsbCBvYmplY3RzIGluXG4gKiB0aGUgbGlzdCBzdXBwbGllZC5cbiAqXG4gKiBgcGx1Y2tgIHdpbGwgd29yayBvblxuICogYW55IFtmdW5jdG9yXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI2Z1bmN0b3IpIGluXG4gKiBhZGRpdGlvbiB0byBhcnJheXMsIGFzIGl0IGlzIGVxdWl2YWxlbnQgdG8gYFIubWFwKFIucHJvcChrKSwgZilgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgRnVuY3RvciBmID0+IGsgLT4gZiB7azogdn0gLT4gZiB2XG4gKiBAcGFyYW0ge051bWJlcnxTdHJpbmd9IGtleSBUaGUga2V5IG5hbWUgdG8gcGx1Y2sgb2ZmIG9mIGVhY2ggb2JqZWN0LlxuICogQHBhcmFtIHtBcnJheX0gZiBUaGUgYXJyYXkgb3IgZnVuY3RvciB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgbGlzdCBvZiB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBrZXkuXG4gKiBAc2VlIFIucHJvamVjdCwgUi5wcm9wLCBSLnByb3BzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGdldEFnZXMgPSBSLnBsdWNrKCdhZ2UnKTtcbiAqICAgICAgZ2V0QWdlcyhbe25hbWU6ICdmcmVkJywgYWdlOiAyOX0sIHtuYW1lOiAnd2lsbWEnLCBhZ2U6IDI3fV0pOyAvLz0+IFsyOSwgMjddXG4gKlxuICogICAgICBSLnBsdWNrKDAsIFtbMSwgMl0sIFszLCA0XV0pOyAgICAgICAgICAgICAgIC8vPT4gWzEsIDNdXG4gKiAgICAgIFIucGx1Y2soJ3ZhbCcsIHthOiB7dmFsOiAzfSwgYjoge3ZhbDogNX19KTsgLy89PiB7YTogMywgYjogNX1cbiAqIEBzeW1iIFIucGx1Y2soJ3gnLCBbe3g6IDEsIHk6IDJ9LCB7eDogMywgeTogNH0sIHt4OiA1LCB5OiA2fV0pID0gWzEsIDMsIDVdXG4gKiBAc3ltYiBSLnBsdWNrKDAsIFtbMSwgMl0sIFszLCA0XSwgWzUsIDZdXSkgPSBbMSwgMywgNV1cbiAqL1xuXG52YXIgcGx1Y2sgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBwbHVjayhwLCBsaXN0KSB7XG4gIHJldHVybiBtYXAocHJvcChwKSwgbGlzdCk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcGx1Y2s7IiwiaW1wb3J0IF9jb25jYXQgZnJvbSBcIi4vaW50ZXJuYWwvX2NvbmNhdC5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3Qgd2l0aCB0aGUgZ2l2ZW4gZWxlbWVudCBhdCB0aGUgZnJvbnQsIGZvbGxvd2VkIGJ5IHRoZVxuICogY29udGVudHMgb2YgdGhlIGxpc3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7Kn0gZWwgVGhlIGl0ZW0gdG8gYWRkIHRvIHRoZSBoZWFkIG9mIHRoZSBvdXRwdXQgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGFkZCB0byB0aGUgdGFpbCBvZiB0aGUgb3V0cHV0IGxpc3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgYXJyYXkuXG4gKiBAc2VlIFIuYXBwZW5kXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wcmVwZW5kKCdmZWUnLCBbJ2ZpJywgJ2ZvJywgJ2Z1bSddKTsgLy89PiBbJ2ZlZScsICdmaScsICdmbycsICdmdW0nXVxuICovXG5cbnZhciBwcmVwZW5kID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gcHJlcGVuZChlbCwgbGlzdCkge1xuICByZXR1cm4gX2NvbmNhdChbZWxdLCBsaXN0KTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBwcmVwZW5kOyIsImltcG9ydCBtdWx0aXBseSBmcm9tIFwiLi9tdWx0aXBseS5qc1wiO1xuaW1wb3J0IHJlZHVjZSBmcm9tIFwiLi9yZWR1Y2UuanNcIjtcbi8qKlxuICogTXVsdGlwbGllcyB0b2dldGhlciBhbGwgdGhlIGVsZW1lbnRzIG9mIGEgbGlzdC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAc2lnIFtOdW1iZXJdIC0+IE51bWJlclxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBBbiBhcnJheSBvZiBudW1iZXJzXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBwcm9kdWN0IG9mIGFsbCB0aGUgbnVtYmVycyBpbiB0aGUgbGlzdC5cbiAqIEBzZWUgUi5yZWR1Y2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnByb2R1Y3QoWzIsNCw2LDgsMTAwLDFdKTsgLy89PiAzODQwMFxuICovXG5cbnZhciBwcm9kdWN0ID1cbi8qI19fUFVSRV9fKi9cbnJlZHVjZShtdWx0aXBseSwgMSk7XG5leHBvcnQgZGVmYXVsdCBwcm9kdWN0OyIsImltcG9ydCBfbWFwIGZyb20gXCIuL2ludGVybmFsL19tYXAuanNcIjtcbmltcG9ydCBpZGVudGl0eSBmcm9tIFwiLi9pZGVudGl0eS5qc1wiO1xuaW1wb3J0IHBpY2tBbGwgZnJvbSBcIi4vcGlja0FsbC5qc1wiO1xuaW1wb3J0IHVzZVdpdGggZnJvbSBcIi4vdXNlV2l0aC5qc1wiO1xuLyoqXG4gKiBSZWFzb25hYmxlIGFuYWxvZyB0byBTUUwgYHNlbGVjdGAgc3RhdGVtZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIFtrXSAtPiBbe2s6IHZ9XSAtPiBbe2s6IHZ9XVxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIHByb2plY3RcbiAqIEBwYXJhbSB7QXJyYXl9IG9ianMgVGhlIG9iamVjdHMgdG8gcXVlcnlcbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBvYmplY3RzIHdpdGgganVzdCB0aGUgYHByb3BzYCBwcm9wZXJ0aWVzLlxuICogQHNlZSBSLnBsdWNrLCBSLnByb3BzLCBSLnByb3BcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBhYmJ5ID0ge25hbWU6ICdBYmJ5JywgYWdlOiA3LCBoYWlyOiAnYmxvbmQnLCBncmFkZTogMn07XG4gKiAgICAgIGNvbnN0IGZyZWQgPSB7bmFtZTogJ0ZyZWQnLCBhZ2U6IDEyLCBoYWlyOiAnYnJvd24nLCBncmFkZTogN307XG4gKiAgICAgIGNvbnN0IGtpZHMgPSBbYWJieSwgZnJlZF07XG4gKiAgICAgIFIucHJvamVjdChbJ25hbWUnLCAnZ3JhZGUnXSwga2lkcyk7IC8vPT4gW3tuYW1lOiAnQWJieScsIGdyYWRlOiAyfSwge25hbWU6ICdGcmVkJywgZ3JhZGU6IDd9XVxuICovXG5cbnZhciBwcm9qZWN0ID1cbi8qI19fUFVSRV9fKi9cbnVzZVdpdGgoX21hcCwgW3BpY2tBbGwsIGlkZW50aXR5XSk7IC8vIHBhc3NpbmcgYGlkZW50aXR5YCBnaXZlcyBjb3JyZWN0IGFyaXR5XG5cbmV4cG9ydCBkZWZhdWx0IHByb2plY3Q7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF9wcm9tYXAgZnJvbSBcIi4vaW50ZXJuYWwvX3Byb21hcC5qc1wiO1xuaW1wb3J0IF94cHJvbWFwIGZyb20gXCIuL2ludGVybmFsL194cHJvbWFwLmpzXCI7XG4vKipcbiAqIFRha2VzIHR3byBmdW5jdGlvbnMgYXMgcHJlLSBhbmQgcG9zdC0gcHJvY2Vzc29ycyByZXNwZWN0aXZlbHkgZm9yIGEgdGhpcmQgZnVuY3Rpb24sXG4gKiBpLmUuIGBwcm9tYXAoZiwgZywgaCkoeCkgPT09IGcoaChmKHgpKSlgLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBwcm9tYXBgIG1ldGhvZCBvZiB0aGUgdGhpcmQgYXJndW1lbnQsIGlmIHByZXNlbnQsXG4gKiBhY2NvcmRpbmcgdG8gdGhlIFtGYW50YXN5TGFuZCBQcm9mdW5jdG9yIHNwZWNdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjcHJvZnVuY3RvcikuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBwcm9mdW5jdG9yIHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI4LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoYSAtPiBiKSAtPiAoYyAtPiBkKSAtPiAoYiAtPiBjKSAtPiAoYSAtPiBkKVxuICogQHNpZyBQcm9mdW5jdG9yIHAgPT4gKGEgLT4gYikgLT4gKGMgLT4gZCkgLT4gcCBiIGMgLT4gcCBhIGRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGYgVGhlIHByZXByb2Nlc3NvciBmdW5jdGlvbiwgYSAtPiBiXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBnIFRoZSBwb3N0cHJvY2Vzc29yIGZ1bmN0aW9uLCBjIC0+IGRcbiAqIEBwYXJhbSB7UHJvZnVuY3Rvcn0gcHJvZnVuY3RvciBUaGUgcHJvZnVuY3RvciBpbnN0YW5jZSB0byBiZSBwcm9tYXBwZWQsIGUuZy4gYiAtPiBjXG4gKiBAcmV0dXJuIHtQcm9mdW5jdG9yfSBUaGUgbmV3IHByb2Z1bmN0b3IgaW5zdGFuY2UsIGUuZy4gYSAtPiBkXG4gKiBAc2VlIFIudHJhbnNkdWNlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZGVjb2RlQ2hhciA9IFIucHJvbWFwKHMgPT4gcy5jaGFyQ29kZUF0KCksIFN0cmluZy5mcm9tQ2hhckNvZGUsIFIuYWRkKC04KSlcbiAqICAgICAgY29uc3QgZGVjb2RlU3RyaW5nID0gUi5wcm9tYXAoUi5zcGxpdCgnJyksIFIuam9pbignJyksIFIubWFwKGRlY29kZUNoYXIpKVxuICogICAgICBkZWNvZGVTdHJpbmcoXCJ6aXVsaVwiKSAvLz0+IFwicmFtZGFcIlxuICpcbiAqIEBzeW1iIFIucHJvbWFwKGYsIGcsIGgpID0geCA9PiBnKGgoZih4KSkpXG4gKiBAc3ltYiBSLnByb21hcChmLCBnLCBwcm9mdW5jdG9yKSA9IHByb2Z1bmN0b3IucHJvbWFwKGYsIGcpXG4gKi9cblxudmFyIHByb21hcCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKFxuLyojX19QVVJFX18qL1xuX2Rpc3BhdGNoYWJsZShbJ2ZhbnRhc3ktbGFuZC9wcm9tYXAnLCAncHJvbWFwJ10sIF94cHJvbWFwLCBfcHJvbWFwKSk7XG5cbmV4cG9ydCBkZWZhdWx0IHByb21hcDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2lzSW50ZWdlciBmcm9tIFwiLi9pbnRlcm5hbC9faXNJbnRlZ2VyLmpzXCI7XG5pbXBvcnQgbnRoIGZyb20gXCIuL250aC5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aGVuIHN1cHBsaWVkIGFuIG9iamVjdCByZXR1cm5zIHRoZSBpbmRpY2F0ZWRcbiAqIHByb3BlcnR5IG9mIHRoYXQgb2JqZWN0LCBpZiBpdCBleGlzdHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50IHwgU3ltYm9sXG4gKiBAc2lnIElkeCAtPiB7czogYX0gLT4gYSB8IFVuZGVmaW5lZFxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBwIFRoZSBwcm9wZXJ0eSBuYW1lIG9yIGFycmF5IGluZGV4XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcXVlcnlcbiAqIEByZXR1cm4geyp9IFRoZSB2YWx1ZSBhdCBgb2JqLnBgLlxuICogQHNlZSBSLnBhdGgsIFIucHJvcHMsIFIucGx1Y2ssIFIucHJvamVjdCwgUi5udGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnByb3AoJ3gnLCB7eDogMTAwfSk7IC8vPT4gMTAwXG4gKiAgICAgIFIucHJvcCgneCcsIHt9KTsgLy89PiB1bmRlZmluZWRcbiAqICAgICAgUi5wcm9wKDAsIFsxMDBdKTsgLy89PiAxMDBcbiAqICAgICAgUi5jb21wb3NlKFIuaW5jLCBSLnByb3AoJ3gnKSkoeyB4OiAzIH0pIC8vPT4gNFxuICovXG5cbnZhciBwcm9wID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gcHJvcChwLCBvYmopIHtcbiAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIF9pc0ludGVnZXIocCkgPyBudGgocCwgb2JqKSA6IG9ialtwXTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBwcm9wOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBwcm9wIGZyb20gXCIuL3Byb3AuanNcIjtcbmltcG9ydCBlcXVhbHMgZnJvbSBcIi4vZXF1YWxzLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByb3BlcnR5IGlzIGVxdWFsLCBpblxuICogW2BSLmVxdWFsc2BdKCNlcXVhbHMpIHRlcm1zLCB0byB0aGUgZ2l2ZW4gdmFsdWU7IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogWW91IGNhbiB0ZXN0IG11bHRpcGxlIHByb3BlcnRpZXMgd2l0aCBbYFIud2hlcmVFcWBdKCN3aGVyZUVxKSxcbiAqIGFuZCB0ZXN0IG5lc3RlZCBwYXRoIHByb3BlcnR5IHdpdGggW2BSLnBhdGhFcWBdKCNwYXRoRXEpLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIGEgLT4gU3RyaW5nIC0+IE9iamVjdCAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gY29tcGFyZSB0aGUgcHJvcGVydHkgd2l0aFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIHNwZWNpZmllZCBvYmplY3QgcHJvcGVydHkncyBrZXlcbiAqIEBwYXJhbSB7Kn0gb2JqIFRoZSBvYmplY3QgdG8gY2hlY2sgdGhlIHByb3BlcnR5IGluXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZhbHVlIGVxdWFscyB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcm9wZXJ0eSxcbiAqICAgICAgICAgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBAc2VlIFIud2hlcmVFcSwgUi5wYXRoRXEsIFIucHJvcFNhdGlzZmllcywgUi5lcXVhbHNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBhYmJ5ID0ge25hbWU6ICdBYmJ5JywgYWdlOiA3LCBoYWlyOiAnYmxvbmQnfTtcbiAqICAgICAgY29uc3QgZnJlZCA9IHtuYW1lOiAnRnJlZCcsIGFnZTogMTIsIGhhaXI6ICdicm93bid9O1xuICogICAgICBjb25zdCBydXN0eSA9IHtuYW1lOiAnUnVzdHknLCBhZ2U6IDEwLCBoYWlyOiAnYnJvd24nfTtcbiAqICAgICAgY29uc3QgYWxvaXMgPSB7bmFtZTogJ0Fsb2lzJywgYWdlOiAxNSwgZGlzcG9zaXRpb246ICdzdXJseSd9O1xuICogICAgICBjb25zdCBraWRzID0gW2FiYnksIGZyZWQsIHJ1c3R5LCBhbG9pc107XG4gKiAgICAgIGNvbnN0IGhhc0Jyb3duSGFpciA9IFIucHJvcEVxKCdicm93bicsICdoYWlyJyk7XG4gKiAgICAgIFIuZmlsdGVyKGhhc0Jyb3duSGFpciwga2lkcyk7IC8vPT4gW2ZyZWQsIHJ1c3R5XVxuICovXG5cbnZhciBwcm9wRXEgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MyhmdW5jdGlvbiBwcm9wRXEodmFsLCBuYW1lLCBvYmopIHtcbiAgcmV0dXJuIGVxdWFscyh2YWwsIHByb3AobmFtZSwgb2JqKSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcHJvcEVxOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBwcm9wIGZyb20gXCIuL3Byb3AuanNcIjtcbmltcG9ydCBpcyBmcm9tIFwiLi9pcy5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcm9wZXJ0eSBpcyBvZiB0aGUgZ2l2ZW4gdHlwZTtcbiAqIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBUeXBlXG4gKiBAc2lnIFR5cGUgLT4gU3RyaW5nIC0+IE9iamVjdCAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0eXBlXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHBhcmFtIHsqfSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAc2VlIFIuaXMsIFIucHJvcFNhdGlzZmllc1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucHJvcElzKE51bWJlciwgJ3gnLCB7eDogMSwgeTogMn0pOyAgLy89PiB0cnVlXG4gKiAgICAgIFIucHJvcElzKE51bWJlciwgJ3gnLCB7eDogJ2Zvbyd9KTsgICAgLy89PiBmYWxzZVxuICogICAgICBSLnByb3BJcyhOdW1iZXIsICd4Jywge30pOyAgICAgICAgICAgIC8vPT4gZmFsc2VcbiAqL1xuXG52YXIgcHJvcElzID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTMoZnVuY3Rpb24gcHJvcElzKHR5cGUsIG5hbWUsIG9iaikge1xuICByZXR1cm4gaXModHlwZSwgcHJvcChuYW1lLCBvYmopKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBwcm9wSXM7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IGRlZmF1bHRUbyBmcm9tIFwiLi9kZWZhdWx0VG8uanNcIjtcbmltcG9ydCBwcm9wIGZyb20gXCIuL3Byb3AuanNcIjtcbi8qKlxuICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgb2YgdGhlIGdpdmVuIG5vbi1udWxsIG9iamVjdCBpZiB0aGUgcHJvcGVydHlcbiAqIGlzIHByZXNlbnQgYW5kIGl0J3MgdmFsdWUgaXMgbm90IGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYE5hTmAuXG4gKlxuICogT3RoZXJ3aXNlIHRoZSBmaXJzdCBhcmd1bWVudCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC42LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgYSAtPiBTdHJpbmcgLT4gT2JqZWN0IC0+IGFcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSBkZWZhdWx0IHZhbHVlLlxuICogQHBhcmFtIHtTdHJpbmd9IHAgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHJldHVybi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm4geyp9IFRoZSB2YWx1ZSBvZiBnaXZlbiBwcm9wZXJ0eSBvZiB0aGUgc3VwcGxpZWQgb2JqZWN0IG9yIHRoZSBkZWZhdWx0IHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGFsaWNlID0ge1xuICogICAgICAgIG5hbWU6ICdBTElDRScsXG4gKiAgICAgICAgYWdlOiAxMDFcbiAqICAgICAgfTtcbiAqICAgICAgY29uc3QgZmF2b3JpdGUgPSBSLnByb3AoJ2Zhdm9yaXRlTGlicmFyeScpO1xuICogICAgICBjb25zdCBmYXZvcml0ZVdpdGhEZWZhdWx0ID0gUi5wcm9wT3IoJ1JhbWRhJywgJ2Zhdm9yaXRlTGlicmFyeScpO1xuICpcbiAqICAgICAgZmF2b3JpdGUoYWxpY2UpOyAgLy89PiB1bmRlZmluZWRcbiAqICAgICAgZmF2b3JpdGVXaXRoRGVmYXVsdChhbGljZSk7ICAvLz0+ICdSYW1kYSdcbiAqL1xuXG52YXIgcHJvcE9yID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTMoZnVuY3Rpb24gcHJvcE9yKHZhbCwgcCwgb2JqKSB7XG4gIHJldHVybiBkZWZhdWx0VG8odmFsLCBwcm9wKHAsIG9iaikpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHByb3BPcjsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgcHJvcCBmcm9tIFwiLi9wcm9wLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByb3BlcnR5IHNhdGlzZmllcyB0aGUgZ2l2ZW5cbiAqIHByZWRpY2F0ZTsgYGZhbHNlYCBvdGhlcndpc2UuIFlvdSBjYW4gdGVzdCBtdWx0aXBsZSBwcm9wZXJ0aWVzIHdpdGhcbiAqIFtgUi53aGVyZWBdKCN3aGVyZSkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTYuMFxuICogQGNhdGVnb3J5IExvZ2ljXG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFN0cmluZyAtPiB7U3RyaW5nOiBhfSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHBhcmFtIHsqfSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAc2VlIFIud2hlcmUsIFIucHJvcEVxLCBSLnByb3BJc1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucHJvcFNhdGlzZmllcyh4ID0+IHggPiAwLCAneCcsIHt4OiAxLCB5OiAyfSk7IC8vPT4gdHJ1ZVxuICovXG5cbnZhciBwcm9wU2F0aXNmaWVzID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTMoZnVuY3Rpb24gcHJvcFNhdGlzZmllcyhwcmVkLCBuYW1lLCBvYmopIHtcbiAgcmV0dXJuIHByZWQocHJvcChuYW1lLCBvYmopKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBwcm9wU2F0aXNmaWVzOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCIuL3BhdGguanNcIjtcbi8qKlxuICogQWN0cyBhcyBtdWx0aXBsZSBgcHJvcGA6IGFycmF5IG9mIGtleXMgaW4sIGFycmF5IG9mIHZhbHVlcyBvdXQuIFByZXNlcnZlc1xuICogb3JkZXIuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIFtrXSAtPiB7azogdn0gLT4gW3ZdXG4gKiBAcGFyYW0ge0FycmF5fSBwcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZmV0Y2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBxdWVyeVxuICogQHJldHVybiB7QXJyYXl9IFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBvciBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi5cbiAqIEBzZWUgUi5wcm9wLCBSLnBsdWNrLCBSLnByb2plY3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnByb3BzKFsneCcsICd5J10sIHt4OiAxLCB5OiAyfSk7IC8vPT4gWzEsIDJdXG4gKiAgICAgIFIucHJvcHMoWydjJywgJ2EnLCAnYiddLCB7YjogMiwgYTogMX0pOyAvLz0+IFt1bmRlZmluZWQsIDEsIDJdXG4gKlxuICogICAgICBjb25zdCBmdWxsTmFtZSA9IFIuY29tcG9zZShSLmpvaW4oJyAnKSwgUi5wcm9wcyhbJ2ZpcnN0JywgJ2xhc3QnXSkpO1xuICogICAgICBmdWxsTmFtZSh7bGFzdDogJ0J1bGxldC1Ub290aCcsIGFnZTogMzMsIGZpcnN0OiAnVG9ueSd9KTsgLy89PiAnVG9ueSBCdWxsZXQtVG9vdGgnXG4gKi9cblxudmFyIHByb3BzID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gcHJvcHMocHMsIG9iaikge1xuICByZXR1cm4gcHMubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIHBhdGgoW3BdLCBvYmopO1xuICB9KTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBwcm9wczsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2lzTnVtYmVyIGZyb20gXCIuL2ludGVybmFsL19pc051bWJlci5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgbGlzdCBvZiBudW1iZXJzIGZyb20gYGZyb21gIChpbmNsdXNpdmUpIHRvIGB0b2AgKGV4Y2x1c2l2ZSkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IFtOdW1iZXJdXG4gKiBAcGFyYW0ge051bWJlcn0gZnJvbSBUaGUgZmlyc3QgbnVtYmVyIGluIHRoZSBsaXN0LlxuICogQHBhcmFtIHtOdW1iZXJ9IHRvIE9uZSBtb3JlIHRoYW4gdGhlIGxhc3QgbnVtYmVyIGluIHRoZSBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIG51bWJlcnMgaW4gdGhlIHNldCBgW2EsIGIpYC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnJhbmdlKDEsIDUpOyAgICAvLz0+IFsxLCAyLCAzLCA0XVxuICogICAgICBSLnJhbmdlKDUwLCA1Myk7ICAvLz0+IFs1MCwgNTEsIDUyXVxuICovXG5cbnZhciByYW5nZSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIHJhbmdlKGZyb20sIHRvKSB7XG4gIGlmICghKF9pc051bWJlcihmcm9tKSAmJiBfaXNOdW1iZXIodG8pKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JvdGggYXJndW1lbnRzIHRvIHJhbmdlIG11c3QgYmUgbnVtYmVycycpO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgbiA9IGZyb207XG5cbiAgd2hpbGUgKG4gPCB0bykge1xuICAgIHJlc3VsdC5wdXNoKG4pO1xuICAgIG4gKz0gMTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcmFuZ2U7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IF94UmVkdWNlIGZyb20gXCIuL2ludGVybmFsL194UmVkdWNlLmpzXCI7XG5pbXBvcnQgX3h3cmFwIGZyb20gXCIuL2ludGVybmFsL194d3JhcC5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGxpc3QsIHN1Y2Nlc3NpdmVseSBjYWxsaW5nXG4gKiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gYW5kIHBhc3NpbmcgaXQgYW4gYWNjdW11bGF0b3IgdmFsdWUgYW5kIHRoZSBjdXJyZW50XG4gKiB2YWx1ZSBmcm9tIHRoZSBhcnJheSwgYW5kIHRoZW4gcGFzc2luZyB0aGUgcmVzdWx0IHRvIHRoZSBuZXh0IGNhbGwuXG4gKlxuICogVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIHJlY2VpdmVzIHR3byB2YWx1ZXM6ICooYWNjLCB2YWx1ZSkqLiBJdCBtYXkgdXNlXG4gKiBbYFIucmVkdWNlZGBdKCNyZWR1Y2VkKSB0byBzaG9ydGN1dCB0aGUgaXRlcmF0aW9uLlxuICpcbiAqIFRoZSBhcmd1bWVudHMnIG9yZGVyIG9mIFtgcmVkdWNlUmlnaHRgXSgjcmVkdWNlUmlnaHQpJ3MgaXRlcmF0b3IgZnVuY3Rpb25cbiAqIGlzICoodmFsdWUsIGFjYykqLlxuICpcbiAqIE5vdGU6IGBSLnJlZHVjZWAgZG9lcyBub3Qgc2tpcCBkZWxldGVkIG9yIHVuYXNzaWduZWQgaW5kaWNlcyAoc3BhcnNlXG4gKiBhcnJheXMpLCB1bmxpa2UgdGhlIG5hdGl2ZSBgQXJyYXkucHJvdG90eXBlLnJlZHVjZWAgbWV0aG9kLiBGb3IgbW9yZSBkZXRhaWxzXG4gKiBvbiB0aGlzIGJlaGF2aW9yLCBzZWU6XG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9yZWR1Y2UjRGVzY3JpcHRpb25cbiAqXG4gKiBCZSBjYXV0aW91cyBvZiBtdXRhdGluZyBhbmQgcmV0dXJuaW5nIHRoZSBhY2N1bXVsYXRvci4gSWYgeW91IHJldXNlIGl0IGFjcm9zc1xuICogaW52b2NhdGlvbnMsIGl0IHdpbGwgY29udGludWUgdG8gYWNjdW11bGF0ZSBvbnRvIHRoZSBzYW1lIHZhbHVlLiBUaGUgZ2VuZXJhbFxuICogcmVjb21tZW5kYXRpb24gaXMgdG8gYWx3YXlzIHJldHVybiBhIG5ldyB2YWx1ZS4gSWYgeW91IGNhbid0IGRvIHNvIGZvclxuICogcGVyZm9ybWFuY2UgcmVhc29ucywgdGhlbiBiZSBzdXJlIHRvIHJlaW5pdGlhbGl6ZSB0aGUgYWNjdW11bGF0b3Igb24gZWFjaFxuICogaW52b2NhdGlvbi5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgcmVkdWNlYCBtZXRob2Qgb2YgdGhlIHRoaXJkIGFyZ3VtZW50LCBpZiBwcmVzZW50LiBXaGVuXG4gKiBkb2luZyBzbywgaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gaGFuZGxlIHRoZSBbYFIucmVkdWNlZGBdKCNyZWR1Y2VkKVxuICogc2hvcnRjdXRpbmcsIGFzIHRoaXMgaXMgbm90IGltcGxlbWVudGVkIGJ5IGByZWR1Y2VgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKChhLCBiKSAtPiBhKSAtPiBhIC0+IFtiXSAtPiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgaXRlcmF0b3IgZnVuY3Rpb24uIFJlY2VpdmVzIHR3byB2YWx1ZXMsIHRoZSBhY2N1bXVsYXRvciBhbmQgdGhlXG4gKiAgICAgICAgY3VycmVudCBlbGVtZW50IGZyb20gdGhlIGFycmF5LlxuICogQHBhcmFtIHsqfSBhY2MgVGhlIGFjY3VtdWxhdG9yIHZhbHVlLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJuIHsqfSBUaGUgZmluYWwsIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQHNlZSBSLnJlZHVjZWQsIFIuYWRkSW5kZXgsIFIucmVkdWNlUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnJlZHVjZShSLnN1YnRyYWN0LCAwLCBbMSwgMiwgMywgNF0pIC8vID0+ICgoKCgwIC0gMSkgLSAyKSAtIDMpIC0gNCkgPSAtMTBcbiAqICAgICAgLy8gICAgICAgICAgLSAgICAgICAgICAgICAgIC0xMFxuICogICAgICAvLyAgICAgICAgIC8gXFwgICAgICAgICAgICAgIC8gXFxcbiAqICAgICAgLy8gICAgICAgIC0gICA0ICAgICAgICAgICAtNiAgIDRcbiAqICAgICAgLy8gICAgICAgLyBcXCAgICAgICAgICAgICAgLyBcXFxuICogICAgICAvLyAgICAgIC0gICAzICAgPT0+ICAgICAtMyAgIDNcbiAqICAgICAgLy8gICAgIC8gXFwgICAgICAgICAgICAgIC8gXFxcbiAqICAgICAgLy8gICAgLSAgIDIgICAgICAgICAgIC0xICAgMlxuICogICAgICAvLyAgIC8gXFwgICAgICAgICAgICAgIC8gXFxcbiAqICAgICAgLy8gIDAgICAxICAgICAgICAgICAgMCAgIDFcbiAqXG4gKiBAc3ltYiBSLnJlZHVjZShmLCBhLCBbYiwgYywgZF0pID0gZihmKGYoYSwgYiksIGMpLCBkKVxuICovXG5cbnZhciByZWR1Y2UgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MyhmdW5jdGlvbiAoeGYsIGFjYywgbGlzdCkge1xuICByZXR1cm4gX3hSZWR1Y2UodHlwZW9mIHhmID09PSAnZnVuY3Rpb24nID8gX3h3cmFwKHhmKSA6IHhmLCBhY2MsIGxpc3QpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHJlZHVjZTsiLCJpbXBvcnQgX2Nsb25lIGZyb20gXCIuL2ludGVybmFsL19jbG9uZS5qc1wiO1xuaW1wb3J0IF9jdXJyeU4gZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Ti5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vaW50ZXJuYWwvX2hhcy5qc1wiO1xuaW1wb3J0IF9yZWR1Y2VkIGZyb20gXCIuL2ludGVybmFsL19yZWR1Y2VkLmpzXCI7XG5pbXBvcnQgX3hSZWR1Y2UgZnJvbSBcIi4vaW50ZXJuYWwvX3hSZWR1Y2UuanNcIjtcbmltcG9ydCBfeHJlZHVjZUJ5IGZyb20gXCIuL2ludGVybmFsL194cmVkdWNlQnkuanNcIjtcbmltcG9ydCBfeHdyYXAgZnJvbSBcIi4vaW50ZXJuYWwvX3h3cmFwLmpzXCI7XG4vKipcbiAqIEdyb3VwcyB0aGUgZWxlbWVudHMgb2YgdGhlIGxpc3QgYWNjb3JkaW5nIHRvIHRoZSByZXN1bHQgb2YgY2FsbGluZ1xuICogdGhlIFN0cmluZy1yZXR1cm5pbmcgZnVuY3Rpb24gYGtleUZuYCBvbiBlYWNoIGVsZW1lbnQgYW5kIHJlZHVjZXMgdGhlIGVsZW1lbnRzXG4gKiBvZiBlYWNoIGdyb3VwIHRvIGEgc2luZ2xlIHZhbHVlIHZpYSB0aGUgcmVkdWNlciBmdW5jdGlvbiBgdmFsdWVGbmAuXG4gKlxuICogVGhlIHZhbHVlIGZ1bmN0aW9uIHJlY2VpdmVzIHR3byB2YWx1ZXM6ICooYWNjLCB2YWx1ZSkqLiBJdCBtYXkgdXNlXG4gKiBbYFIucmVkdWNlZGBdKCNyZWR1Y2VkKSB0byBzaG9ydCBjaXJjdWl0IHRoZSBpdGVyYXRpb24uXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkgYSBtb3JlIGdlbmVyYWwgW2Bncm91cEJ5YF0oI2dyb3VwQnkpIGZ1bmN0aW9uLlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yMC4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoKGEsIGIpIC0+IGEpIC0+IGEgLT4gKGIgLT4gU3RyaW5nKSAtPiBbYl0gLT4ge1N0cmluZzogYX1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHZhbHVlRm4gVGhlIGZ1bmN0aW9uIHRoYXQgcmVkdWNlcyB0aGUgZWxlbWVudHMgb2YgZWFjaCBncm91cCB0byBhIHNpbmdsZVxuICogICAgICAgIHZhbHVlLiBSZWNlaXZlcyB0d28gdmFsdWVzLCBhY2N1bXVsYXRvciBmb3IgYSBwYXJ0aWN1bGFyIGdyb3VwIGFuZCB0aGUgY3VycmVudCBlbGVtZW50LlxuICogQHBhcmFtIHsqfSBhY2MgVGhlIChpbml0aWFsKSBhY2N1bXVsYXRvciB2YWx1ZSBmb3IgZWFjaCBncm91cC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleUZuIFRoZSBmdW5jdGlvbiB0aGF0IG1hcHMgdGhlIGxpc3QncyBlbGVtZW50IGludG8gYSBrZXkuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBncm91cC5cbiAqIEByZXR1cm4ge09iamVjdH0gQW4gb2JqZWN0IHdpdGggdGhlIG91dHB1dCBvZiBga2V5Rm5gIGZvciBrZXlzLCBtYXBwZWQgdG8gdGhlIG91dHB1dCBvZlxuICogICAgICAgICBgdmFsdWVGbmAgZm9yIGVsZW1lbnRzIHdoaWNoIHByb2R1Y2VkIHRoYXQga2V5IHdoZW4gcGFzc2VkIHRvIGBrZXlGbmAuXG4gKiBAc2VlIFIuZ3JvdXBCeSwgUi5yZWR1Y2UsIFIucmVkdWNlZFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGdyb3VwTmFtZXMgPSAoYWNjLCB7bmFtZX0pID0+IGFjYy5jb25jYXQobmFtZSlcbiAqICAgICAgY29uc3QgdG9HcmFkZSA9ICh7c2NvcmV9KSA9PlxuICogICAgICAgIHNjb3JlIDwgNjUgPyAnRicgOlxuICogICAgICAgIHNjb3JlIDwgNzAgPyAnRCcgOlxuICogICAgICAgIHNjb3JlIDwgODAgPyAnQycgOlxuICogICAgICAgIHNjb3JlIDwgOTAgPyAnQicgOiAnQSdcbiAqXG4gKiAgICAgIHZhciBzdHVkZW50cyA9IFtcbiAqICAgICAgICB7bmFtZTogJ0FiYnknLCBzY29yZTogODN9LFxuICogICAgICAgIHtuYW1lOiAnQmFydCcsIHNjb3JlOiA2Mn0sXG4gKiAgICAgICAge25hbWU6ICdDdXJ0Jywgc2NvcmU6IDg4fSxcbiAqICAgICAgICB7bmFtZTogJ0RvcmEnLCBzY29yZTogOTJ9LFxuICogICAgICBdXG4gKlxuICogICAgICByZWR1Y2VCeShncm91cE5hbWVzLCBbXSwgdG9HcmFkZSwgc3R1ZGVudHMpXG4gKiAgICAgIC8vPT4ge1wiQVwiOiBbXCJEb3JhXCJdLCBcIkJcIjogW1wiQWJieVwiLCBcIkN1cnRcIl0sIFwiRlwiOiBbXCJCYXJ0XCJdfVxuICovXG5cbnZhciByZWR1Y2VCeSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnlOKDQsIFtdLFxuLyojX19QVVJFX18qL1xuX2Rpc3BhdGNoYWJsZShbXSwgX3hyZWR1Y2VCeSwgZnVuY3Rpb24gcmVkdWNlQnkodmFsdWVGbiwgdmFsdWVBY2MsIGtleUZuLCBsaXN0KSB7XG4gIHZhciB4ZiA9IF94d3JhcChmdW5jdGlvbiAoYWNjLCBlbHQpIHtcbiAgICB2YXIga2V5ID0ga2V5Rm4oZWx0KTtcbiAgICB2YXIgdmFsdWUgPSB2YWx1ZUZuKF9oYXMoa2V5LCBhY2MpID8gYWNjW2tleV0gOiBfY2xvbmUodmFsdWVBY2MsIGZhbHNlKSwgZWx0KTtcblxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZVsnQEB0cmFuc2R1Y2VyL3JlZHVjZWQnXSkge1xuICAgICAgcmV0dXJuIF9yZWR1Y2VkKGFjYyk7XG4gICAgfVxuXG4gICAgYWNjW2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gYWNjO1xuICB9KTtcblxuICByZXR1cm4gX3hSZWR1Y2UoeGYsIHt9LCBsaXN0KTtcbn0pKTtcblxuZXhwb3J0IGRlZmF1bHQgcmVkdWNlQnk7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGxpc3QsIHN1Y2Nlc3NpdmVseSBjYWxsaW5nXG4gKiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gYW5kIHBhc3NpbmcgaXQgYW4gYWNjdW11bGF0b3IgdmFsdWUgYW5kIHRoZSBjdXJyZW50XG4gKiB2YWx1ZSBmcm9tIHRoZSBhcnJheSwgYW5kIHRoZW4gcGFzc2luZyB0aGUgcmVzdWx0IHRvIHRoZSBuZXh0IGNhbGwuXG4gKlxuICogU2ltaWxhciB0byBbYHJlZHVjZWBdKCNyZWR1Y2UpLCBleGNlcHQgbW92ZXMgdGhyb3VnaCB0aGUgaW5wdXQgbGlzdCBmcm9tIHRoZVxuICogcmlnaHQgdG8gdGhlIGxlZnQuXG4gKlxuICogVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIHJlY2VpdmVzIHR3byB2YWx1ZXM6ICoodmFsdWUsIGFjYykqLCB3aGlsZSB0aGUgYXJndW1lbnRzJ1xuICogb3JkZXIgb2YgYHJlZHVjZWAncyBpdGVyYXRvciBmdW5jdGlvbiBpcyAqKGFjYywgdmFsdWUpKi4gYHJlZHVjZVJpZ2h0YCBtYXkgdXNlIFtgcmVkdWNlZGBdKCNyZWR1Y2VkKVxuICogdG8gc2hvcnQgY2lyY3VpdCB0aGUgaXRlcmF0aW9uLlxuICpcbiAqIE5vdGU6IGBSLnJlZHVjZVJpZ2h0YCBkb2VzIG5vdCBza2lwIGRlbGV0ZWQgb3IgdW5hc3NpZ25lZCBpbmRpY2VzIChzcGFyc2VcbiAqIGFycmF5cyksIHVubGlrZSB0aGUgbmF0aXZlIGBBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHRgIG1ldGhvZC4gRm9yIG1vcmUgZGV0YWlsc1xuICogb24gdGhpcyBiZWhhdmlvciwgc2VlOlxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvcmVkdWNlUmlnaHQjRGVzY3JpcHRpb25cbiAqXG4gKiBCZSBjYXV0aW91cyBvZiBtdXRhdGluZyBhbmQgcmV0dXJuaW5nIHRoZSBhY2N1bXVsYXRvci4gSWYgeW91IHJldXNlIGl0IGFjcm9zc1xuICogaW52b2NhdGlvbnMsIGl0IHdpbGwgY29udGludWUgdG8gYWNjdW11bGF0ZSBvbnRvIHRoZSBzYW1lIHZhbHVlLiBUaGUgZ2VuZXJhbFxuICogcmVjb21tZW5kYXRpb24gaXMgdG8gYWx3YXlzIHJldHVybiBhIG5ldyB2YWx1ZS4gSWYgeW91IGNhbid0IGRvIHNvIGZvclxuICogcGVyZm9ybWFuY2UgcmVhc29ucywgdGhlbiBiZSBzdXJlIHRvIHJlaW5pdGlhbGl6ZSB0aGUgYWNjdW11bGF0b3Igb24gZWFjaFxuICogaW52b2NhdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICgoYSwgYikgLT4gYikgLT4gYiAtPiBbYV0gLT4gYlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uLiBSZWNlaXZlcyB0d28gdmFsdWVzLCB0aGUgY3VycmVudCBlbGVtZW50IGZyb20gdGhlIGFycmF5XG4gKiAgICAgICAgYW5kIHRoZSBhY2N1bXVsYXRvci5cbiAqIEBwYXJhbSB7Kn0gYWNjIFRoZSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybiB7Kn0gVGhlIGZpbmFsLCBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqIEBzZWUgUi5yZWR1Y2UsIFIuYWRkSW5kZXgsIFIucmVkdWNlZFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucmVkdWNlUmlnaHQoUi5zdWJ0cmFjdCwgMCwgWzEsIDIsIDMsIDRdKSAvLyA9PiAoMSAtICgyIC0gKDMgLSAoNCAtIDApKSkpID0gLTJcbiAqICAgICAgLy8gICAgLSAgICAgICAgICAgICAgIC0yXG4gKiAgICAgIC8vICAgLyBcXCAgICAgICAgICAgICAgLyBcXFxuICogICAgICAvLyAgMSAgIC0gICAgICAgICAgICAxICAgM1xuICogICAgICAvLyAgICAgLyBcXCAgICAgICAgICAgICAgLyBcXFxuICogICAgICAvLyAgICAyICAgLSAgICAgPT0+ICAgIDIgIC0xXG4gKiAgICAgIC8vICAgICAgIC8gXFwgICAgICAgICAgICAgIC8gXFxcbiAqICAgICAgLy8gICAgICAzICAgLSAgICAgICAgICAgIDMgICA0XG4gKiAgICAgIC8vICAgICAgICAgLyBcXCAgICAgICAgICAgICAgLyBcXFxuICogICAgICAvLyAgICAgICAgNCAgIDAgICAgICAgICAgICA0ICAgMFxuICpcbiAqIEBzeW1iIFIucmVkdWNlUmlnaHQoZiwgYSwgW2IsIGMsIGRdKSA9IGYoYiwgZihjLCBmKGQsIGEpKSlcbiAqL1xuXG52YXIgcmVkdWNlUmlnaHQgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MyhmdW5jdGlvbiByZWR1Y2VSaWdodChmbiwgYWNjLCBsaXN0KSB7XG4gIHZhciBpZHggPSBsaXN0Lmxlbmd0aCAtIDE7XG5cbiAgd2hpbGUgKGlkeCA+PSAwKSB7XG4gICAgYWNjID0gZm4obGlzdFtpZHhdLCBhY2MpO1xuXG4gICAgaWYgKGFjYyAmJiBhY2NbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ10pIHtcbiAgICAgIGFjYyA9IGFjY1snQEB0cmFuc2R1Y2VyL3ZhbHVlJ107XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZHggLT0gMTtcbiAgfVxuXG4gIHJldHVybiBhY2M7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcmVkdWNlUmlnaHQ7IiwiaW1wb3J0IF9jdXJyeU4gZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Ti5qc1wiO1xuaW1wb3J0IF94UmVkdWNlIGZyb20gXCIuL2ludGVybmFsL194UmVkdWNlLmpzXCI7XG5pbXBvcnQgX3h3cmFwIGZyb20gXCIuL2ludGVybmFsL194d3JhcC5qc1wiO1xuaW1wb3J0IF9yZWR1Y2VkIGZyb20gXCIuL2ludGVybmFsL19yZWR1Y2VkLmpzXCI7XG4vKipcbiAqIExpa2UgW2ByZWR1Y2VgXSgjcmVkdWNlKSwgYHJlZHVjZVdoaWxlYCByZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nXG4gKiB0aHJvdWdoIHRoZSBsaXN0LCBzdWNjZXNzaXZlbHkgY2FsbGluZyB0aGUgaXRlcmF0b3IgZnVuY3Rpb24uIGByZWR1Y2VXaGlsZWBcbiAqIGFsc28gdGFrZXMgYSBwcmVkaWNhdGUgdGhhdCBpcyBldmFsdWF0ZWQgYmVmb3JlIGVhY2ggc3RlcC4gSWYgdGhlIHByZWRpY2F0ZVxuICogcmV0dXJucyBgZmFsc2VgLCBpdCBcInNob3J0LWNpcmN1aXRzXCIgdGhlIGl0ZXJhdGlvbiBhbmQgcmV0dXJucyB0aGUgY3VycmVudFxuICogdmFsdWUgb2YgdGhlIGFjY3VtdWxhdG9yLiBgcmVkdWNlV2hpbGVgIG1heSBhbHRlcm5hdGl2ZWx5IGJlIHNob3J0LWNpcmN1aXRlZFxuICogdmlhIFtgcmVkdWNlZGBdKCNyZWR1Y2VkKS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yMi4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoKGEsIGIpIC0+IEJvb2xlYW4pIC0+ICgoYSwgYikgLT4gYSkgLT4gYSAtPiBbYl0gLT4gYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCBUaGUgcHJlZGljYXRlLiBJdCBpcyBwYXNzZWQgdGhlIGFjY3VtdWxhdG9yIGFuZCB0aGVcbiAqICAgICAgICBjdXJyZW50IGVsZW1lbnQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgaXRlcmF0b3IgZnVuY3Rpb24uIFJlY2VpdmVzIHR3byB2YWx1ZXMsIHRoZVxuICogICAgICAgIGFjY3VtdWxhdG9yIGFuZCB0aGUgY3VycmVudCBlbGVtZW50LlxuICogQHBhcmFtIHsqfSBhIFRoZSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybiB7Kn0gVGhlIGZpbmFsLCBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqIEBzZWUgUi5yZWR1Y2UsIFIucmVkdWNlZFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGlzT2RkID0gKGFjYywgeCkgPT4geCAlIDIgIT09IDA7XG4gKiAgICAgIGNvbnN0IHhzID0gWzEsIDMsIDUsIDYwLCA3NzcsIDgwMF07XG4gKiAgICAgIFIucmVkdWNlV2hpbGUoaXNPZGQsIFIuYWRkLCAwLCB4cyk7IC8vPT4gOVxuICpcbiAqICAgICAgY29uc3QgeXMgPSBbMiwgNCwgNl1cbiAqICAgICAgUi5yZWR1Y2VXaGlsZShpc09kZCwgUi5hZGQsIDExMSwgeXMpOyAvLz0+IDExMVxuICovXG5cbnZhciByZWR1Y2VXaGlsZSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnlOKDQsIFtdLCBmdW5jdGlvbiBfcmVkdWNlV2hpbGUocHJlZCwgZm4sIGEsIGxpc3QpIHtcbiAgdmFyIHhmID0gX3h3cmFwKGZ1bmN0aW9uIChhY2MsIHgpIHtcbiAgICByZXR1cm4gcHJlZChhY2MsIHgpID8gZm4oYWNjLCB4KSA6IF9yZWR1Y2VkKGFjYyk7XG4gIH0pO1xuXG4gIHJldHVybiBfeFJlZHVjZSh4ZiwgYSwgbGlzdCk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcmVkdWNlV2hpbGU7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9yZWR1Y2VkIGZyb20gXCIuL2ludGVybmFsL19yZWR1Y2VkLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSB2YWx1ZSB3cmFwcGVkIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgdGhlIGZpbmFsIHZhbHVlIG9mIHRoZSByZWR1Y2VcbiAqIGFuZCB0cmFuc2R1Y2UgZnVuY3Rpb25zLiBUaGUgcmV0dXJuZWQgdmFsdWUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBibGFja1xuICogYm94OiB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHN0YWJsZS5cbiAqXG4gKiBUaGlzIG9wdGltaXphdGlvbiBpcyBhdmFpbGFibGUgdG8gdGhlIGJlbG93IGZ1bmN0aW9uczpcbiAqIC0gW2ByZWR1Y2VgXSgjcmVkdWNlKVxuICogLSBbYHJlZHVjZVdoaWxlYF0oI3JlZHVjZVdoaWxlKVxuICogLSBbYHJlZHVjZUJ5YF0oI3JlZHVjZUJ5KVxuICogLSBbYHJlZHVjZVJpZ2h0YF0oI3JlZHVjZVJpZ2h0KVxuICogLSBbYHRyYW5zZHVjZWBdKCN0cmFuc2R1Y2UpXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTUuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgYSAtPiAqXG4gKiBAcGFyYW0geyp9IHggVGhlIGZpbmFsIHZhbHVlIG9mIHRoZSByZWR1Y2UuXG4gKiBAcmV0dXJuIHsqfSBUaGUgd3JhcHBlZCB2YWx1ZS5cbiAqIEBzZWUgUi5yZWR1Y2UsIFIucmVkdWNlV2hpbGUsIFIucmVkdWNlQnksIFIucmVkdWNlUmlnaHQsIFIudHJhbnNkdWNlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICBSLnJlZHVjZShcbiAqICAgICAgIChhY2MsIGl0ZW0pID0+IGl0ZW0gPiAzID8gUi5yZWR1Y2VkKGFjYykgOiBhY2MuY29uY2F0KGl0ZW0pLFxuICogICAgICAgW10sXG4gKiAgICAgICBbMSwgMiwgMywgNCwgNV0pIC8vIFsxLCAyLCAzXVxuICovXG5cbnZhciByZWR1Y2VkID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoX3JlZHVjZWQpO1xuXG5leHBvcnQgZGVmYXVsdCByZWR1Y2VkOyIsImltcG9ydCBfY29tcGxlbWVudCBmcm9tIFwiLi9pbnRlcm5hbC9fY29tcGxlbWVudC5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbi8qKlxuICogVGhlIGNvbXBsZW1lbnQgb2YgW2BmaWx0ZXJgXSgjZmlsdGVyKS5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uIEZpbHRlcmFibGVcbiAqIG9iamVjdHMgaW5jbHVkZSBwbGFpbiBvYmplY3RzIG9yIGFueSBvYmplY3QgdGhhdCBoYXMgYSBmaWx0ZXIgbWV0aG9kIHN1Y2hcbiAqIGFzIGBBcnJheWAuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBGaWx0ZXJhYmxlIGYgPT4gKGEgLT4gQm9vbGVhbikgLT4gZiBhIC0+IGYgYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZFxuICogQHBhcmFtIHtBcnJheX0gZmlsdGVyYWJsZVxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAc2VlIFIuZmlsdGVyLCBSLnRyYW5zZHVjZSwgUi5hZGRJbmRleFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGlzT2RkID0gKG4pID0+IG4gJSAyICE9PSAwO1xuICpcbiAqICAgICAgUi5yZWplY3QoaXNPZGQsIFsxLCAyLCAzLCA0XSk7IC8vPT4gWzIsIDRdXG4gKlxuICogICAgICBSLnJlamVjdChpc09kZCwge2E6IDEsIGI6IDIsIGM6IDMsIGQ6IDR9KTsgLy89PiB7YjogMiwgZDogNH1cbiAqL1xuXG52YXIgcmVqZWN0ID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gcmVqZWN0KHByZWQsIGZpbHRlcmFibGUpIHtcbiAgcmV0dXJuIGZpbHRlcihfY29tcGxlbWVudChwcmVkKSwgZmlsdGVyYWJsZSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcmVqZWN0OyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbi8qKlxuICogUmVtb3ZlcyB0aGUgc3ViLWxpc3Qgb2YgYGxpc3RgIHN0YXJ0aW5nIGF0IGluZGV4IGBzdGFydGAgYW5kIGNvbnRhaW5pbmdcbiAqIGBjb3VudGAgZWxlbWVudHMuIF9Ob3RlIHRoYXQgdGhpcyBpcyBub3QgZGVzdHJ1Y3RpdmVfOiBpdCByZXR1cm5zIGEgY29weSBvZlxuICogdGhlIGxpc3Qgd2l0aCB0aGUgY2hhbmdlcy5cbiAqIDxzbWFsbD5ObyBsaXN0cyBoYXZlIGJlZW4gaGFybWVkIGluIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLjwvc21hbGw+XG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMi4yXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7TnVtYmVyfSBzdGFydCBUaGUgcG9zaXRpb24gdG8gc3RhcnQgcmVtb3ZpbmcgZWxlbWVudHNcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJlbW92ZVxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byByZW1vdmUgZnJvbVxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3IEFycmF5IHdpdGggYGNvdW50YCBlbGVtZW50cyBmcm9tIGBzdGFydGAgcmVtb3ZlZC5cbiAqIEBzZWUgUi53aXRob3V0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5yZW1vdmUoMiwgMywgWzEsMiwzLDQsNSw2LDcsOF0pOyAvLz0+IFsxLDIsNiw3LDhdXG4gKi9cblxudmFyIHJlbW92ZSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIHJlbW92ZShzdGFydCwgY291bnQsIGxpc3QpIHtcbiAgdmFyIHJlc3VsdCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIDApO1xuICByZXN1bHQuc3BsaWNlKHN0YXJ0LCBjb3VudCk7XG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcmVtb3ZlOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBhbHdheXMgZnJvbSBcIi4vYWx3YXlzLmpzXCI7XG5pbXBvcnQgdGltZXMgZnJvbSBcIi4vdGltZXMuanNcIjtcbi8qKlxuICogUmV0dXJucyBhIGZpeGVkIGxpc3Qgb2Ygc2l6ZSBgbmAgY29udGFpbmluZyBhIHNwZWNpZmllZCBpZGVudGljYWwgdmFsdWUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4xXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IG4gLT4gW2FdXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZXBlYXQuXG4gKiBAcGFyYW0ge051bWJlcn0gbiBUaGUgZGVzaXJlZCBzaXplIG9mIHRoZSBvdXRwdXQgbGlzdC5cbiAqIEByZXR1cm4ge0FycmF5fSBBIG5ldyBhcnJheSBjb250YWluaW5nIGBuYCBgdmFsdWVgcy5cbiAqIEBzZWUgUi50aW1lc1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucmVwZWF0KCdoaScsIDUpOyAvLz0+IFsnaGknLCAnaGknLCAnaGknLCAnaGknLCAnaGknXVxuICpcbiAqICAgICAgY29uc3Qgb2JqID0ge307XG4gKiAgICAgIGNvbnN0IHJlcGVhdGVkT2JqcyA9IFIucmVwZWF0KG9iaiwgNSk7IC8vPT4gW3t9LCB7fSwge30sIHt9LCB7fV1cbiAqICAgICAgcmVwZWF0ZWRPYmpzWzBdID09PSByZXBlYXRlZE9ianNbMV07IC8vPT4gdHJ1ZVxuICogQHN5bWIgUi5yZXBlYXQoYSwgMCkgPSBbXVxuICogQHN5bWIgUi5yZXBlYXQoYSwgMSkgPSBbYV1cbiAqIEBzeW1iIFIucmVwZWF0KGEsIDIpID0gW2EsIGFdXG4gKi9cblxudmFyIHJlcGVhdCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIHJlcGVhdCh2YWx1ZSwgbikge1xuICByZXR1cm4gdGltZXMoYWx3YXlzKHZhbHVlKSwgbik7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcmVwZWF0OyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbi8qKlxuICogUmVwbGFjZSBhIHN1YnN0cmluZyBvciByZWdleCBtYXRjaCBpbiBhIHN0cmluZyB3aXRoIGEgcmVwbGFjZW1lbnQuXG4gKlxuICogVGhlIGZpcnN0IHR3byBwYXJhbWV0ZXJzIGNvcnJlc3BvbmQgdG8gdGhlIHBhcmFtZXRlcnMgb2YgdGhlXG4gKiBgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKClgIGZ1bmN0aW9uLCBzbyB0aGUgc2Vjb25kIHBhcmFtZXRlciBjYW4gYWxzbyBiZSBhXG4gKiBmdW5jdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC43LjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBzaWcgUmVnRXhwfFN0cmluZyAtPiBTdHJpbmcgLT4gU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtSZWdFeHB8U3RyaW5nfSBwYXR0ZXJuIEEgcmVndWxhciBleHByZXNzaW9uIG9yIGEgc3Vic3RyaW5nIHRvIG1hdGNoLlxuICogQHBhcmFtIHtTdHJpbmd9IHJlcGxhY2VtZW50IFRoZSBzdHJpbmcgdG8gcmVwbGFjZSB0aGUgbWF0Y2hlcyB3aXRoLlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgU3RyaW5nIHRvIGRvIHRoZSBzZWFyY2ggYW5kIHJlcGxhY2VtZW50IGluLlxuICogQHJldHVybiB7U3RyaW5nfSBUaGUgcmVzdWx0LlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucmVwbGFjZSgnZm9vJywgJ2JhcicsICdmb28gZm9vIGZvbycpOyAvLz0+ICdiYXIgZm9vIGZvbydcbiAqICAgICAgUi5yZXBsYWNlKC9mb28vLCAnYmFyJywgJ2ZvbyBmb28gZm9vJyk7IC8vPT4gJ2JhciBmb28gZm9vJ1xuICpcbiAqICAgICAgLy8gVXNlIHRoZSBcImdcIiAoZ2xvYmFsKSBmbGFnIHRvIHJlcGxhY2UgYWxsIG9jY3VycmVuY2VzOlxuICogICAgICBSLnJlcGxhY2UoL2Zvby9nLCAnYmFyJywgJ2ZvbyBmb28gZm9vJyk7IC8vPT4gJ2JhciBiYXIgYmFyJ1xuICovXG5cbnZhciByZXBsYWNlID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTMoZnVuY3Rpb24gcmVwbGFjZShyZWdleCwgcmVwbGFjZW1lbnQsIHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UocmVnZXgsIHJlcGxhY2VtZW50KTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCByZXBsYWNlOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaXNTdHJpbmcgZnJvbSBcIi4vaW50ZXJuYWwvX2lzU3RyaW5nLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBvciBzdHJpbmcgd2l0aCB0aGUgZWxlbWVudHMgb3IgY2hhcmFjdGVycyBpbiByZXZlcnNlXG4gKiBvcmRlci5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBbYV1cbiAqIEBzaWcgU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IGxpc3RcbiAqIEByZXR1cm4ge0FycmF5fFN0cmluZ31cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnJldmVyc2UoWzEsIDIsIDNdKTsgIC8vPT4gWzMsIDIsIDFdXG4gKiAgICAgIFIucmV2ZXJzZShbMSwgMl0pOyAgICAgLy89PiBbMiwgMV1cbiAqICAgICAgUi5yZXZlcnNlKFsxXSk7ICAgICAgICAvLz0+IFsxXVxuICogICAgICBSLnJldmVyc2UoW10pOyAgICAgICAgIC8vPT4gW11cbiAqXG4gKiAgICAgIFIucmV2ZXJzZSgnYWJjJyk7ICAgICAgLy89PiAnY2JhJ1xuICogICAgICBSLnJldmVyc2UoJ2FiJyk7ICAgICAgIC8vPT4gJ2JhJ1xuICogICAgICBSLnJldmVyc2UoJ2EnKTsgICAgICAgIC8vPT4gJ2EnXG4gKiAgICAgIFIucmV2ZXJzZSgnJyk7ICAgICAgICAgLy89PiAnJ1xuICovXG5cbnZhciByZXZlcnNlID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoZnVuY3Rpb24gcmV2ZXJzZShsaXN0KSB7XG4gIHJldHVybiBfaXNTdHJpbmcobGlzdCkgPyBsaXN0LnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJykgOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCAwKS5yZXZlcnNlKCk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcmV2ZXJzZTsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgX2Rpc3BhdGNoYWJsZSBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzXCI7XG5pbXBvcnQgX3hzY2FuIGZyb20gXCIuL2ludGVybmFsL194c2Nhbi5qc1wiO1xuLyoqXG4gKiBTY2FuIGlzIHNpbWlsYXIgdG8gW2ByZWR1Y2VgXSgjcmVkdWNlKSwgYnV0IHJldHVybnMgYSBsaXN0IG9mIHN1Y2Nlc3NpdmVseVxuICogcmVkdWNlZCB2YWx1ZXMgZnJvbSB0aGUgbGVmdC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTAuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKChhLCBiKSAtPiBhKSAtPiBhIC0+IFtiXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBpdGVyYXRvciBmdW5jdGlvbi4gUmVjZWl2ZXMgdHdvIHZhbHVlcywgdGhlIGFjY3VtdWxhdG9yIGFuZCB0aGVcbiAqICAgICAgICBjdXJyZW50IGVsZW1lbnQgZnJvbSB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7Kn0gYWNjIFRoZSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybiB7QXJyYXl9IEEgbGlzdCBvZiBhbGwgaW50ZXJtZWRpYXRlbHkgcmVkdWNlZCB2YWx1ZXMuXG4gKiBAc2VlIFIucmVkdWNlLCBSLm1hcEFjY3VtXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgbnVtYmVycyA9IFsxLCAyLCAzLCA0XTtcbiAqICAgICAgY29uc3QgZmFjdG9yaWFscyA9IFIuc2NhbihSLm11bHRpcGx5LCAxLCBudW1iZXJzKTsgLy89PiBbMSwgMSwgMiwgNiwgMjRdXG4gKiBAc3ltYiBSLnNjYW4oZiwgYSwgW2IsIGNdKSA9IFthLCBmKGEsIGIpLCBmKGYoYSwgYiksIGMpXVxuICovXG5cbnZhciBzY2FuID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTMoXG4vKiNfX1BVUkVfXyovXG5fZGlzcGF0Y2hhYmxlKFtdLCBfeHNjYW4sIGZ1bmN0aW9uIHNjYW4oZm4sIGFjYywgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gW2FjY107XG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGFjYyA9IGZuKGFjYywgbGlzdFtpZHhdKTtcbiAgICByZXN1bHRbaWR4ICsgMV0gPSBhY2M7XG4gICAgaWR4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufSkpO1xuXG5leHBvcnQgZGVmYXVsdCBzY2FuOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBhcCBmcm9tIFwiLi9hcC5qc1wiO1xuaW1wb3J0IG1hcCBmcm9tIFwiLi9tYXAuanNcIjtcbmltcG9ydCBwcmVwZW5kIGZyb20gXCIuL3ByZXBlbmQuanNcIjtcbmltcG9ydCByZWR1Y2VSaWdodCBmcm9tIFwiLi9yZWR1Y2VSaWdodC5qc1wiO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gXCIuL2ludGVybmFsL19pZGVudGl0eS5qc1wiO1xuLyoqXG4gKiBUcmFuc2Zvcm1zIGEgW1RyYXZlcnNhYmxlXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI3RyYXZlcnNhYmxlKVxuICogb2YgW0FwcGxpY2F0aXZlXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI2FwcGxpY2F0aXZlKSBpbnRvIGFuXG4gKiBBcHBsaWNhdGl2ZSBvZiBUcmF2ZXJzYWJsZS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgXCJmYW50YXN5LWxhbmQvdHJhdmVyc2VcImAgb3IgdGhlIGB0cmF2ZXJzZWAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgZmFudGFzeS1sYW5kL29mIDo6IFR5cGVSZXAgZiA9PiBmIH4+IGEgLT4gZiBhXG4gKiBAc2lnIChBcHBsaWNhdGl2ZSBmLCBUcmF2ZXJzYWJsZSB0KSA9PiBUeXBlUmVwIGYgLT4gdCAoZiBhKSAtPiBmICh0IGEpXG4gKiBAc2lnIChBcHBsaWNhdGl2ZSBmLCBUcmF2ZXJzYWJsZSB0KSA9PiAoYSAtPiBmIGEpIC0+IHQgKGYgYSkgLT4gZiAodCBhKVxuICogQHBhcmFtIHtPYmplY3R8RnVuY3Rpb259IFR5cGVSZXByZXNlbnRhdGl2ZSB3aXRoIGFuIGBvZmAgb3IgYGZhbnRhc3ktbGFuZC9vZmAgbWV0aG9kXG4gKiBAcGFyYW0geyp9IHRyYXZlcnNhYmxlXG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLnRyYXZlcnNlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5zZXF1ZW5jZShNYXliZS5vZiwgW0p1c3QoMSksIEp1c3QoMiksIEp1c3QoMyldKTsgICAvLz0+IEp1c3QoWzEsIDIsIDNdKVxuICogICAgICBSLnNlcXVlbmNlKE1heWJlLm9mLCBbSnVzdCgxKSwgSnVzdCgyKSwgTm90aGluZygpXSk7IC8vPT4gTm90aGluZygpXG4gKlxuICogICAgICBSLnNlcXVlbmNlKFIub2YoQXJyYXkpLCBKdXN0KFsxLCAyLCAzXSkpOyAvLz0+IFtKdXN0KDEpLCBKdXN0KDIpLCBKdXN0KDMpXVxuICogICAgICBSLnNlcXVlbmNlKFIub2YoQXJyYXkpLCBOb3RoaW5nKCkpOyAgICAgICAvLz0+IFtOb3RoaW5nKCldXG4gKi9cblxudmFyIHNlcXVlbmNlID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gc2VxdWVuY2UoRiwgdHJhdmVyc2FibGUpIHtcbiAgdmFyIG9mID0gdHlwZW9mIEZbJ2ZhbnRhc3ktbGFuZC9vZiddID09PSAnZnVuY3Rpb24nID8gRlsnZmFudGFzeS1sYW5kL29mJ10gOiB0eXBlb2YgRi5vZiA9PT0gJ2Z1bmN0aW9uJyA/IEYub2YgOiBGO1xuICB2YXIgVHlwZVJlcCA9IHtcbiAgICAnZmFudGFzeS1sYW5kL29mJzogb2ZcbiAgfTtcbiAgcmV0dXJuIHR5cGVvZiB0cmF2ZXJzYWJsZVsnZmFudGFzeS1sYW5kL3RyYXZlcnNlJ10gPT09ICdmdW5jdGlvbicgPyB0cmF2ZXJzYWJsZVsnZmFudGFzeS1sYW5kL3RyYXZlcnNlJ10oVHlwZVJlcCwgaWRlbnRpdHkpIDogdHlwZW9mIHRyYXZlcnNhYmxlLnRyYXZlcnNlID09PSAnZnVuY3Rpb24nID8gdHJhdmVyc2FibGUudHJhdmVyc2UoVHlwZVJlcCwgaWRlbnRpdHkpIDogcmVkdWNlUmlnaHQoZnVuY3Rpb24gKHgsIGFjYykge1xuICAgIHJldHVybiBhcChtYXAocHJlcGVuZCwgeCksIGFjYyk7XG4gIH0sIG9mKFtdKSwgdHJhdmVyc2FibGUpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHNlcXVlbmNlOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBhbHdheXMgZnJvbSBcIi4vYWx3YXlzLmpzXCI7XG5pbXBvcnQgb3ZlciBmcm9tIFwiLi9vdmVyLmpzXCI7XG4vKipcbiAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBcInNldHRpbmdcIiB0aGUgcG9ydGlvbiBvZiB0aGUgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmVcbiAqIGZvY3VzZWQgYnkgdGhlIGdpdmVuIGxlbnMgdG8gdGhlIGdpdmVuIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIExlbnMgcyBhIC0+IGEgLT4gcyAtPiBzXG4gKiBAcGFyYW0ge0xlbnN9IGxlbnNcbiAqIEBwYXJhbSB7Kn0gdlxuICogQHBhcmFtIHsqfSB4XG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLnZpZXcsIFIub3ZlciwgUi5sZW5zLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcCwgUi5sZW5zUGF0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHhMZW5zID0gUi5sZW5zUHJvcCgneCcpO1xuICpcbiAqICAgICAgUi5zZXQoeExlbnMsIDQsIHt4OiAxLCB5OiAyfSk7ICAvLz0+IHt4OiA0LCB5OiAyfVxuICogICAgICBSLnNldCh4TGVucywgOCwge3g6IDEsIHk6IDJ9KTsgIC8vPT4ge3g6IDgsIHk6IDJ9XG4gKi9cblxudmFyIHNldCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIHNldChsZW5zLCB2LCB4KSB7XG4gIHJldHVybiBvdmVyKGxlbnMsIGFsd2F5cyh2KSwgeCk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgc2V0OyIsImltcG9ydCBfY2hlY2tGb3JNZXRob2QgZnJvbSBcIi4vaW50ZXJuYWwvX2NoZWNrRm9yTWV0aG9kLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG4vKipcbiAqIFJldHVybnMgdGhlIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBsaXN0IG9yIHN0cmluZyAob3Igb2JqZWN0IHdpdGggYSBgc2xpY2VgXG4gKiBtZXRob2QpIGZyb20gYGZyb21JbmRleGAgKGluY2x1c2l2ZSkgdG8gYHRvSW5kZXhgIChleGNsdXNpdmUpLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBzbGljZWAgbWV0aG9kIG9mIHRoZSB0aGlyZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjRcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gW2FdIC0+IFthXVxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBmcm9tSW5kZXggVGhlIHN0YXJ0IGluZGV4IChpbmNsdXNpdmUpLlxuICogQHBhcmFtIHtOdW1iZXJ9IHRvSW5kZXggVGhlIGVuZCBpbmRleCAoZXhjbHVzaXZlKS5cbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Kn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnNsaWNlKDEsIDMsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAgIC8vPT4gWydiJywgJ2MnXVxuICogICAgICBSLnNsaWNlKDEsIEluZmluaXR5LCBbJ2EnLCAnYicsICdjJywgJ2QnXSk7IC8vPT4gWydiJywgJ2MnLCAnZCddXG4gKiAgICAgIFIuc2xpY2UoMCwgLTEsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAgLy89PiBbJ2EnLCAnYicsICdjJ11cbiAqICAgICAgUi5zbGljZSgtMywgLTEsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAvLz0+IFsnYicsICdjJ11cbiAqICAgICAgUi5zbGljZSgwLCAzLCAncmFtZGEnKTsgICAgICAgICAgICAgICAgICAgICAvLz0+ICdyYW0nXG4gKi9cblxudmFyIHNsaWNlID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTMoXG4vKiNfX1BVUkVfXyovXG5fY2hlY2tGb3JNZXRob2QoJ3NsaWNlJywgZnVuY3Rpb24gc2xpY2UoZnJvbUluZGV4LCB0b0luZGV4LCBsaXN0KSB7XG4gIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCBmcm9tSW5kZXgsIHRvSW5kZXgpO1xufSkpO1xuXG5leHBvcnQgZGVmYXVsdCBzbGljZTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBsaXN0LCBzb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uLFxuICogd2hpY2ggc2hvdWxkIGFjY2VwdCB0d28gdmFsdWVzIGF0IGEgdGltZSBhbmQgcmV0dXJuIGEgbmVnYXRpdmUgbnVtYmVyIGlmIHRoZVxuICogZmlyc3QgdmFsdWUgaXMgc21hbGxlciwgYSBwb3NpdGl2ZSBudW1iZXIgaWYgaXQncyBsYXJnZXIsIGFuZCB6ZXJvIGlmIHRoZXlcbiAqIGFyZSBlcXVhbC4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGlzIGEgKipjb3B5Kiogb2YgdGhlIGxpc3QuIEl0IGRvZXMgbm90XG4gKiBtb2RpZnkgdGhlIG9yaWdpbmFsLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKChhLCBhKSAtPiBOdW1iZXIpIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgQSBzb3J0aW5nIGZ1bmN0aW9uIDo6IGEgLT4gYiAtPiBJbnRcbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gc29ydFxuICogQHJldHVybiB7QXJyYXl9IGEgbmV3IGFycmF5IHdpdGggaXRzIGVsZW1lbnRzIHNvcnRlZCBieSB0aGUgY29tcGFyYXRvciBmdW5jdGlvbi5cbiAqIEBzZWUgUi5hc2NlbmQsIFIuZGVzY2VuZFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGRpZmYgPSBmdW5jdGlvbihhLCBiKSB7IHJldHVybiBhIC0gYjsgfTtcbiAqICAgICAgUi5zb3J0KGRpZmYsIFs0LDIsNyw1XSk7IC8vPT4gWzIsIDQsIDUsIDddXG4gKi9cblxudmFyIHNvcnQgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBzb3J0KGNvbXBhcmF0b3IsIGxpc3QpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIDApLnNvcnQoY29tcGFyYXRvcik7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgc29ydDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIFNvcnRzIHRoZSBsaXN0IGFjY29yZGluZyB0byB0aGUgc3VwcGxpZWQgZnVuY3Rpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgT3JkIGIgPT4gKGEgLT4gYikgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gc29ydC5cbiAqIEByZXR1cm4ge0FycmF5fSBBIG5ldyBsaXN0IHNvcnRlZCBieSB0aGUga2V5cyBnZW5lcmF0ZWQgYnkgYGZuYC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBzb3J0QnlGaXJzdEl0ZW0gPSBSLnNvcnRCeShSLnByb3AoMCkpO1xuICogICAgICBjb25zdCBwYWlycyA9IFtbLTEsIDFdLCBbLTIsIDJdLCBbLTMsIDNdXTtcbiAqICAgICAgc29ydEJ5Rmlyc3RJdGVtKHBhaXJzKTsgLy89PiBbWy0zLCAzXSwgWy0yLCAyXSwgWy0xLCAxXV1cbiAqXG4gKiAgICAgIGNvbnN0IHNvcnRCeU5hbWVDYXNlSW5zZW5zaXRpdmUgPSBSLnNvcnRCeShSLmNvbXBvc2UoUi50b0xvd2VyLCBSLnByb3AoJ25hbWUnKSkpO1xuICogICAgICBjb25zdCBhbGljZSA9IHtcbiAqICAgICAgICBuYW1lOiAnQUxJQ0UnLFxuICogICAgICAgIGFnZTogMTAxXG4gKiAgICAgIH07XG4gKiAgICAgIGNvbnN0IGJvYiA9IHtcbiAqICAgICAgICBuYW1lOiAnQm9iJyxcbiAqICAgICAgICBhZ2U6IC0xMFxuICogICAgICB9O1xuICogICAgICBjb25zdCBjbGFyYSA9IHtcbiAqICAgICAgICBuYW1lOiAnY2xhcmEnLFxuICogICAgICAgIGFnZTogMzE0LjE1OVxuICogICAgICB9O1xuICogICAgICBjb25zdCBwZW9wbGUgPSBbY2xhcmEsIGJvYiwgYWxpY2VdO1xuICogICAgICBzb3J0QnlOYW1lQ2FzZUluc2Vuc2l0aXZlKHBlb3BsZSk7IC8vPT4gW2FsaWNlLCBib2IsIGNsYXJhXVxuICovXG5cbnZhciBzb3J0QnkgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBzb3J0QnkoZm4sIGxpc3QpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIDApLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICB2YXIgYWEgPSBmbihhKTtcbiAgICB2YXIgYmIgPSBmbihiKTtcbiAgICByZXR1cm4gYWEgPCBiYiA/IC0xIDogYWEgPiBiYiA/IDEgOiAwO1xuICB9KTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBzb3J0Qnk7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBTb3J0cyBhIGxpc3QgYWNjb3JkaW5nIHRvIGEgbGlzdCBvZiBjb21wYXJhdG9ycy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yMy4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgWyhhLCBhKSAtPiBOdW1iZXJdIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7QXJyYXl9IGZ1bmN0aW9ucyBBIGxpc3Qgb2YgY29tcGFyYXRvciBmdW5jdGlvbnMuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIHNvcnQuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgbGlzdCBzb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZSBjb21hcmF0b3IgZnVuY3Rpb25zLlxuICogQHNlZSBSLmFzY2VuZCwgUi5kZXNjZW5kXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgYWxpY2UgPSB7XG4gKiAgICAgICAgbmFtZTogJ2FsaWNlJyxcbiAqICAgICAgICBhZ2U6IDQwXG4gKiAgICAgIH07XG4gKiAgICAgIGNvbnN0IGJvYiA9IHtcbiAqICAgICAgICBuYW1lOiAnYm9iJyxcbiAqICAgICAgICBhZ2U6IDMwXG4gKiAgICAgIH07XG4gKiAgICAgIGNvbnN0IGNsYXJhID0ge1xuICogICAgICAgIG5hbWU6ICdjbGFyYScsXG4gKiAgICAgICAgYWdlOiA0MFxuICogICAgICB9O1xuICogICAgICBjb25zdCBwZW9wbGUgPSBbY2xhcmEsIGJvYiwgYWxpY2VdO1xuICogICAgICBjb25zdCBhZ2VOYW1lU29ydCA9IFIuc29ydFdpdGgoW1xuICogICAgICAgIFIuZGVzY2VuZChSLnByb3AoJ2FnZScpKSxcbiAqICAgICAgICBSLmFzY2VuZChSLnByb3AoJ25hbWUnKSlcbiAqICAgICAgXSk7XG4gKiAgICAgIGFnZU5hbWVTb3J0KHBlb3BsZSk7IC8vPT4gW2FsaWNlLCBjbGFyYSwgYm9iXVxuICovXG5cbnZhciBzb3J0V2l0aCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIHNvcnRXaXRoKGZucywgbGlzdCkge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobGlzdCwgMCkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciByZXN1bHQgPSAwO1xuICAgIHZhciBpID0gMDtcblxuICAgIHdoaWxlIChyZXN1bHQgPT09IDAgJiYgaSA8IGZucy5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdCA9IGZuc1tpXShhLCBiKTtcbiAgICAgIGkgKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBzb3J0V2l0aDsiLCJpbXBvcnQgaW52b2tlciBmcm9tIFwiLi9pbnZva2VyLmpzXCI7XG4vKipcbiAqIFNwbGl0cyBhIHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIHN0cmluZ3MgYmFzZWQgb24gdGhlIGdpdmVuXG4gKiBzZXBhcmF0b3IuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAc2lnIChTdHJpbmcgfCBSZWdFeHApIC0+IFN0cmluZyAtPiBbU3RyaW5nXVxuICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBzZXAgVGhlIHBhdHRlcm4uXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gc2VwYXJhdGUgaW50byBhbiBhcnJheS5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgYXJyYXkgb2Ygc3RyaW5ncyBmcm9tIGBzdHJgIHNlcGFyYXRlZCBieSBgc2VwYC5cbiAqIEBzZWUgUi5qb2luXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgcGF0aENvbXBvbmVudHMgPSBSLnNwbGl0KCcvJyk7XG4gKiAgICAgIFIudGFpbChwYXRoQ29tcG9uZW50cygnL3Vzci9sb2NhbC9iaW4vbm9kZScpKTsgLy89PiBbJ3VzcicsICdsb2NhbCcsICdiaW4nLCAnbm9kZSddXG4gKlxuICogICAgICBSLnNwbGl0KCcuJywgJ2EuYi5jLnh5ei5kJyk7IC8vPT4gWydhJywgJ2InLCAnYycsICd4eXonLCAnZCddXG4gKi9cblxudmFyIHNwbGl0ID1cbi8qI19fUFVSRV9fKi9cbmludm9rZXIoMSwgJ3NwbGl0Jyk7XG5leHBvcnQgZGVmYXVsdCBzcGxpdDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgbGVuZ3RoIGZyb20gXCIuL2xlbmd0aC5qc1wiO1xuaW1wb3J0IHNsaWNlIGZyb20gXCIuL3NsaWNlLmpzXCI7XG4vKipcbiAqIFNwbGl0cyBhIGdpdmVuIGxpc3Qgb3Igc3RyaW5nIGF0IGEgZ2l2ZW4gaW5kZXguXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgTnVtYmVyIC0+IFthXSAtPiBbW2FdLCBbYV1dXG4gKiBAc2lnIE51bWJlciAtPiBTdHJpbmcgLT4gW1N0cmluZywgU3RyaW5nXVxuICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4IFRoZSBpbmRleCB3aGVyZSB0aGUgYXJyYXkvc3RyaW5nIGlzIHNwbGl0LlxuICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IGFycmF5IFRoZSBhcnJheS9zdHJpbmcgdG8gYmUgc3BsaXQuXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnNwbGl0QXQoMSwgWzEsIDIsIDNdKTsgICAgICAgICAgLy89PiBbWzFdLCBbMiwgM11dXG4gKiAgICAgIFIuc3BsaXRBdCg1LCAnaGVsbG8gd29ybGQnKTsgICAgICAvLz0+IFsnaGVsbG8nLCAnIHdvcmxkJ11cbiAqICAgICAgUi5zcGxpdEF0KC0xLCAnZm9vYmFyJyk7ICAgICAgICAgIC8vPT4gWydmb29iYScsICdyJ11cbiAqL1xuXG52YXIgc3BsaXRBdCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIHNwbGl0QXQoaW5kZXgsIGFycmF5KSB7XG4gIHJldHVybiBbc2xpY2UoMCwgaW5kZXgsIGFycmF5KSwgc2xpY2UoaW5kZXgsIGxlbmd0aChhcnJheSksIGFycmF5KV07XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgc3BsaXRBdDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgc2xpY2UgZnJvbSBcIi4vc2xpY2UuanNcIjtcbi8qKlxuICogU3BsaXRzIGEgY29sbGVjdGlvbiBpbnRvIHNsaWNlcyBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNi4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gW2FdIC0+IFtbYV1dXG4gKiBAc2lnIE51bWJlciAtPiBTdHJpbmcgLT4gW1N0cmluZ11cbiAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnNwbGl0RXZlcnkoMywgWzEsIDIsIDMsIDQsIDUsIDYsIDddKTsgLy89PiBbWzEsIDIsIDNdLCBbNCwgNSwgNl0sIFs3XV1cbiAqICAgICAgUi5zcGxpdEV2ZXJ5KDMsICdmb29iYXJiYXonKTsgLy89PiBbJ2ZvbycsICdiYXInLCAnYmF6J11cbiAqL1xuXG52YXIgc3BsaXRFdmVyeSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIHNwbGl0RXZlcnkobiwgbGlzdCkge1xuICBpZiAobiA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCB0byBzcGxpdEV2ZXJ5IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpZHggPSAwO1xuXG4gIHdoaWxlIChpZHggPCBsaXN0Lmxlbmd0aCkge1xuICAgIHJlc3VsdC5wdXNoKHNsaWNlKGlkeCwgaWR4ICs9IG4sIGxpc3QpKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgc3BsaXRFdmVyeTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIFRha2VzIGEgbGlzdCBhbmQgYSBwcmVkaWNhdGUgYW5kIHJldHVybnMgYSBwYWlyIG9mIGxpc3RzIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAtIHRoZSByZXN1bHQgb2YgY29uY2F0ZW5hdGluZyB0aGUgdHdvIG91dHB1dCBsaXN0cyBpcyBlcXVpdmFsZW50IHRvIHRoZSBpbnB1dCBsaXN0O1xuICogIC0gbm9uZSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGZpcnN0IG91dHB1dCBsaXN0IHNhdGlzZmllcyB0aGUgcHJlZGljYXRlOyBhbmRcbiAqICAtIGlmIHRoZSBzZWNvbmQgb3V0cHV0IGxpc3QgaXMgbm9uLWVtcHR5LCBpdHMgZmlyc3QgZWxlbWVudCBzYXRpc2ZpZXMgdGhlIHByZWRpY2F0ZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiBbYV0gLT4gW1thXSwgW2FdXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCBUaGUgcHJlZGljYXRlIHRoYXQgZGV0ZXJtaW5lcyB3aGVyZSB0aGUgYXJyYXkgaXMgc3BsaXQuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBiZSBzcGxpdC5cbiAqIEByZXR1cm4ge0FycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuc3BsaXRXaGVuKFIuZXF1YWxzKDIpLCBbMSwgMiwgMywgMSwgMiwgM10pOyAgIC8vPT4gW1sxXSwgWzIsIDMsIDEsIDIsIDNdXVxuICovXG5cbnZhciBzcGxpdFdoZW4gPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBzcGxpdFdoZW4ocHJlZCwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB2YXIgcHJlZml4ID0gW107XG5cbiAgd2hpbGUgKGlkeCA8IGxlbiAmJiAhcHJlZChsaXN0W2lkeF0pKSB7XG4gICAgcHJlZml4LnB1c2gobGlzdFtpZHhdKTtcbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiBbcHJlZml4LCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCBpZHgpXTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBzcGxpdFdoZW47IiwiaW1wb3J0IF9jdXJyeU4gZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Ti5qc1wiO1xuLyoqXG4gKiBTcGxpdHMgYW4gYXJyYXkgaW50byBzbGljZXMgb24gZXZlcnkgb2NjdXJyZW5jZSBvZiBhIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI2LjFcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBbW2FdXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCBUaGUgcHJlZGljYXRlIHRoYXQgZGV0ZXJtaW5lcyB3aGVyZSB0aGUgYXJyYXkgaXMgc3BsaXQuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBiZSBzcGxpdC5cbiAqIEByZXR1cm4ge0FycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuc3BsaXRXaGVuZXZlcihSLmVxdWFscygyKSwgWzEsIDIsIDMsIDIsIDQsIDUsIDIsIDYsIDddKTsgLy89PiBbWzFdLCBbM10sIFs0LCA1XSwgWzYsIDddXVxuICovXG5cbnZhciBzcGxpdFdoZW5ldmVyID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeU4oMiwgW10sIGZ1bmN0aW9uIHNwbGl0V2hlbmV2ZXIocHJlZCwgbGlzdCkge1xuICB2YXIgYWNjID0gW107XG4gIHZhciBjdXJyID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSA9IGkgKyAxKSB7XG4gICAgaWYgKCFwcmVkKGxpc3RbaV0pKSB7XG4gICAgICBjdXJyLnB1c2gobGlzdFtpXSk7XG4gICAgfVxuXG4gICAgaWYgKChpIDwgbGlzdC5sZW5ndGggLSAxICYmIHByZWQobGlzdFtpICsgMV0pIHx8IGkgPT09IGxpc3QubGVuZ3RoIC0gMSkgJiYgY3Vyci5sZW5ndGggPiAwKSB7XG4gICAgICBhY2MucHVzaChjdXJyKTtcbiAgICAgIGN1cnIgPSBbXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYWNjO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHNwbGl0V2hlbmV2ZXI7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGVxdWFscyBmcm9tIFwiLi9lcXVhbHMuanNcIjtcbmltcG9ydCB0YWtlIGZyb20gXCIuL3Rha2UuanNcIjtcbi8qKlxuICogQ2hlY2tzIGlmIGEgbGlzdCBzdGFydHMgd2l0aCB0aGUgcHJvdmlkZWQgc3VibGlzdC5cbiAqXG4gKiBTaW1pbGFybHksIGNoZWNrcyBpZiBhIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgcHJvdmlkZWQgc3Vic3RyaW5nLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI0LjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBbYV0gLT4gQm9vbGVhblxuICogQHNpZyBTdHJpbmcgLT4gU3RyaW5nIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0gcHJlZml4XG4gKiBAcGFyYW0geyp9IGxpc3RcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAc2VlIFIuZW5kc1dpdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnN0YXJ0c1dpdGgoJ2EnLCAnYWJjJykgICAgICAgICAgICAgICAgLy89PiB0cnVlXG4gKiAgICAgIFIuc3RhcnRzV2l0aCgnYicsICdhYmMnKSAgICAgICAgICAgICAgICAvLz0+IGZhbHNlXG4gKiAgICAgIFIuc3RhcnRzV2l0aChbJ2EnXSwgWydhJywgJ2InLCAnYyddKSAgICAvLz0+IHRydWVcbiAqICAgICAgUi5zdGFydHNXaXRoKFsnYiddLCBbJ2EnLCAnYicsICdjJ10pICAgIC8vPT4gZmFsc2VcbiAqL1xuXG52YXIgc3RhcnRzV2l0aCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIChwcmVmaXgsIGxpc3QpIHtcbiAgcmV0dXJuIGVxdWFscyh0YWtlKHByZWZpeC5sZW5ndGgsIGxpc3QpLCBwcmVmaXgpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHN0YXJ0c1dpdGg7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBTdWJ0cmFjdHMgaXRzIHNlY29uZCBhcmd1bWVudCBmcm9tIGl0cyBmaXJzdCBhcmd1bWVudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gTnVtYmVyXG4gKiBAcGFyYW0ge051bWJlcn0gYSBUaGUgZmlyc3QgdmFsdWUuXG4gKiBAcGFyYW0ge051bWJlcn0gYiBUaGUgc2Vjb25kIHZhbHVlLlxuICogQHJldHVybiB7TnVtYmVyfSBUaGUgcmVzdWx0IG9mIGBhIC0gYmAuXG4gKiBAc2VlIFIuYWRkXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5zdWJ0cmFjdCgxMCwgOCk7IC8vPT4gMlxuICpcbiAqICAgICAgY29uc3QgbWludXM1ID0gUi5zdWJ0cmFjdChSLl9fLCA1KTtcbiAqICAgICAgbWludXM1KDE3KTsgLy89PiAxMlxuICpcbiAqICAgICAgY29uc3QgY29tcGxlbWVudGFyeUFuZ2xlID0gUi5zdWJ0cmFjdCg5MCk7XG4gKiAgICAgIGNvbXBsZW1lbnRhcnlBbmdsZSgzMCk7IC8vPT4gNjBcbiAqICAgICAgY29tcGxlbWVudGFyeUFuZ2xlKDcyKTsgLy89PiAxOFxuICovXG5cbnZhciBzdWJ0cmFjdCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIHN1YnRyYWN0KGEsIGIpIHtcbiAgcmV0dXJuIE51bWJlcihhKSAtIE51bWJlcihiKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBzdWJ0cmFjdDsiLCJpbXBvcnQgYWRkIGZyb20gXCIuL2FkZC5qc1wiO1xuaW1wb3J0IHJlZHVjZSBmcm9tIFwiLi9yZWR1Y2UuanNcIjtcbi8qKlxuICogQWRkcyB0b2dldGhlciBhbGwgdGhlIGVsZW1lbnRzIG9mIGEgbGlzdC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAc2lnIFtOdW1iZXJdIC0+IE51bWJlclxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBBbiBhcnJheSBvZiBudW1iZXJzXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBzdW0gb2YgYWxsIHRoZSBudW1iZXJzIGluIHRoZSBsaXN0LlxuICogQHNlZSBSLnJlZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuc3VtKFsyLDQsNiw4LDEwMCwxXSk7IC8vPT4gMTIxXG4gKi9cblxudmFyIHN1bSA9XG4vKiNfX1BVUkVfXyovXG5yZWR1Y2UoYWRkLCAwKTtcbmV4cG9ydCBkZWZhdWx0IHN1bTsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJyYXkuanNcIjtcbmltcG9ydCBfaXNTdHJpbmcgZnJvbSBcIi4vaW50ZXJuYWwvX2lzU3RyaW5nLmpzXCI7XG5pbXBvcnQgY2xvbmUgZnJvbSBcIi4vY2xvbmUuanNcIjtcblxudmFyIHN3YXBPYmplY3QgPSBmdW5jdGlvbiAoaW5kZXhBLCBpbmRleEIsIG8pIHtcbiAgdmFyIGNvcHkgPSBjbG9uZShvKTtcbiAgdmFyIHByb3BlcnRpZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjb3B5KTtcblxuICBpZiAocHJvcGVydGllcy5pbmNsdWRlcyhpbmRleEEpICYmIHByb3BlcnRpZXMuaW5jbHVkZXMoaW5kZXhCKSkge1xuICAgIHZhciB0bXAgPSBjb3B5W2luZGV4QV07XG4gICAgY29weVtpbmRleEFdID0gY29weVtpbmRleEJdO1xuICAgIGNvcHlbaW5kZXhCXSA9IHRtcDtcbiAgfVxuXG4gIHJldHVybiBjb3B5O1xufTtcblxudmFyIHN3YXBMaXN0ID0gZnVuY3Rpb24gKGluZGV4QSwgaW5kZXhCLCBsaXN0KSB7XG4gIHZhciBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IGxpc3Quc2xpY2UoKTtcbiAgdmFyIHBvc2l0aXZlSW5kZXhBID0gaW5kZXhBIDwgMCA/IGxlbmd0aCArIGluZGV4QSA6IGluZGV4QTtcbiAgdmFyIHBvc2l0aXZlSW5kZXhCID0gaW5kZXhCIDwgMCA/IGxlbmd0aCArIGluZGV4QiA6IGluZGV4QjtcbiAgdmFyIHBvc2l0aXZlTWluID0gTWF0aC5taW4ocG9zaXRpdmVJbmRleEEsIHBvc2l0aXZlSW5kZXhCKTtcbiAgdmFyIHBvc2l0aXZlTWF4ID0gTWF0aC5tYXgocG9zaXRpdmVJbmRleEEsIHBvc2l0aXZlSW5kZXhCKTtcblxuICBpZiAocG9zaXRpdmVJbmRleEEgPCAwIHx8IHBvc2l0aXZlSW5kZXhBID4gbGVuZ3RoKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmIChwb3NpdGl2ZUluZGV4QiA8IDAgfHwgcG9zaXRpdmVJbmRleEIgPiBsZW5ndGgpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKHBvc2l0aXZlSW5kZXhBID09PSBwb3NpdGl2ZUluZGV4Qikge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZXN1bHQgPSBbXS5jb25jYXQocmVzdWx0LnNsaWNlKDAsIHBvc2l0aXZlTWluKSkuY29uY2F0KHJlc3VsdFtwb3NpdGl2ZU1heF0pLmNvbmNhdChyZXN1bHQuc2xpY2UocG9zaXRpdmVNaW4gKyAxLCBwb3NpdGl2ZU1heCkpLmNvbmNhdChyZXN1bHRbcG9zaXRpdmVNaW5dKS5jb25jYXQocmVzdWx0LnNsaWNlKHBvc2l0aXZlTWF4ICsgMSwgbGVuZ3RoKSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG52YXIgc3dhcFN0cmluZyA9IGZ1bmN0aW9uIChpbmRleEEsIGluZGV4Qiwgcykge1xuICB2YXIgcmVzdWx0ID0gc3dhcExpc3QoaW5kZXhBLCBpbmRleEIsIHMpO1xuICByZXR1cm4gX2lzQXJyYXkocmVzdWx0KSA/IHJlc3VsdC5qb2luKCcnKSA6IHJlc3VsdDtcbn07XG4vKipcbiAqIFN3YXAgYW4gaXRlbSwgYXQgaW5kZXggYGluZGV4QWAgd2l0aCBhbm90aGVyIGl0ZW0sIGF0IGluZGV4IGBpbmRleEJgLCBpbiBhbiBvYmplY3Qgb3IgYSBsaXN0IG9mIGVsZW1lbnRzLlxuICogQSBuZXcgcmVzdWx0IHdpbGwgYmUgY3JlYXRlZCBjb250YWluaW5nIHRoZSBuZXcgZWxlbWVudHMgb3JkZXIuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjkuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgTnVtYmVyIC0+IE51bWJlciAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge051bWJlcnxzdHJpbmd8T2JqZWN0fSBpbmRleEEgVGhlIGZpcnN0IGluZGV4XG4gKiBAcGFyYW0ge051bWJlcnxzdHJpbmd8T2JqZWN0fSBpbmRleEIgVGhlIHNlY29uZCBpbmRleFxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IG8gRWl0aGVyIHRoZSBvYmplY3Qgb3IgbGlzdCB3aGljaCB3aWxsIHNlcnZlIHRvIHJlYWxpc2UgdGhlIHN3YXBcbiAqIEByZXR1cm4ge0FycmF5fE9iamVjdH0gVGhlIG5ldyBvYmplY3Qgb3IgbGlzdCByZW9yZGVyZWRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnN3YXAoMCwgMiwgWydhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZiddKTsgLy89PiBbJ2MnLCAnYicsICdhJywgJ2QnLCAnZScsICdmJ11cbiAqICAgICAgUi5zd2FwKC0xLCAwLCBbJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJ10pOyAvLz0+IFsnZicsICdiJywgJ2MnLCAnZCcsICdlJywgJ2EnXSBsaXN0IHJvdGF0aW9uXG4gKiAgICAgIFIuc3dhcCgnYScsICdiJywge2E6IDEsIGI6IDJ9KTsgLy89PiB7YTogMiwgYjogMn1cbiAqICAgICAgUi5zd2FwKDAsIDIsICdmb28nKTsgLy89PiAnb29mJ1xuICovXG5cblxudmFyIHN3YXAgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MyhmdW5jdGlvbiAoaW5kZXhBLCBpbmRleEIsIG8pIHtcbiAgaWYgKF9pc0FycmF5KG8pKSB7XG4gICAgcmV0dXJuIHN3YXBMaXN0KGluZGV4QSwgaW5kZXhCLCBvKTtcbiAgfSBlbHNlIGlmIChfaXNTdHJpbmcobykpIHtcbiAgICByZXR1cm4gc3dhcFN0cmluZyhpbmRleEEsIGluZGV4Qiwgbyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN3YXBPYmplY3QoaW5kZXhBLCBpbmRleEIsIG8pO1xuICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgc3dhcDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgY29uY2F0IGZyb20gXCIuL2NvbmNhdC5qc1wiO1xuaW1wb3J0IGRpZmZlcmVuY2UgZnJvbSBcIi4vZGlmZmVyZW5jZS5qc1wiO1xuLyoqXG4gKiBGaW5kcyB0aGUgc2V0IChpLmUuIG5vIGR1cGxpY2F0ZXMpIG9mIGFsbCBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIGZpcnN0IG9yXG4gKiBzZWNvbmQgbGlzdCwgYnV0IG5vdCBib3RoLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE5LjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBbKl0gLT4gWypdIC0+IFsqXVxuICogQHBhcmFtIHtBcnJheX0gbGlzdDEgVGhlIGZpcnN0IGxpc3QuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MiBUaGUgc2Vjb25kIGxpc3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGVsZW1lbnRzIGluIGBsaXN0MWAgb3IgYGxpc3QyYCwgYnV0IG5vdCBib3RoLlxuICogQHNlZSBSLnN5bW1ldHJpY0RpZmZlcmVuY2VXaXRoLCBSLmRpZmZlcmVuY2UsIFIuZGlmZmVyZW5jZVdpdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnN5bW1ldHJpY0RpZmZlcmVuY2UoWzEsMiwzLDRdLCBbNyw2LDUsNCwzXSk7IC8vPT4gWzEsMiw3LDYsNV1cbiAqICAgICAgUi5zeW1tZXRyaWNEaWZmZXJlbmNlKFs3LDYsNSw0LDNdLCBbMSwyLDMsNF0pOyAvLz0+IFs3LDYsNSwxLDJdXG4gKi9cblxudmFyIHN5bW1ldHJpY0RpZmZlcmVuY2UgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBzeW1tZXRyaWNEaWZmZXJlbmNlKGxpc3QxLCBsaXN0Mikge1xuICByZXR1cm4gY29uY2F0KGRpZmZlcmVuY2UobGlzdDEsIGxpc3QyKSwgZGlmZmVyZW5jZShsaXN0MiwgbGlzdDEpKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBzeW1tZXRyaWNEaWZmZXJlbmNlOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBjb25jYXQgZnJvbSBcIi4vY29uY2F0LmpzXCI7XG5pbXBvcnQgZGlmZmVyZW5jZVdpdGggZnJvbSBcIi4vZGlmZmVyZW5jZVdpdGguanNcIjtcbi8qKlxuICogRmluZHMgdGhlIHNldCAoaS5lLiBubyBkdXBsaWNhdGVzKSBvZiBhbGwgZWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBmaXJzdCBvclxuICogc2Vjb25kIGxpc3QsIGJ1dCBub3QgYm90aC4gRHVwbGljYXRpb24gaXMgZGV0ZXJtaW5lZCBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlXG4gKiByZXR1cm5lZCBieSBhcHBseWluZyB0aGUgc3VwcGxpZWQgcHJlZGljYXRlIHRvIHR3byBsaXN0IGVsZW1lbnRzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE5LjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyAoKGEsIGEpIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkIEEgcHJlZGljYXRlIHVzZWQgdG8gdGVzdCB3aGV0aGVyIHR3byBpdGVtcyBhcmUgZXF1YWwuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MSBUaGUgZmlyc3QgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QyIFRoZSBzZWNvbmQgbGlzdC5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgZWxlbWVudHMgaW4gYGxpc3QxYCBvciBgbGlzdDJgLCBidXQgbm90IGJvdGguXG4gKiBAc2VlIFIuc3ltbWV0cmljRGlmZmVyZW5jZSwgUi5kaWZmZXJlbmNlLCBSLmRpZmZlcmVuY2VXaXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZXFBID0gUi5lcUJ5KFIucHJvcCgnYScpKTtcbiAqICAgICAgY29uc3QgbDEgPSBbe2E6IDF9LCB7YTogMn0sIHthOiAzfSwge2E6IDR9XTtcbiAqICAgICAgY29uc3QgbDIgPSBbe2E6IDN9LCB7YTogNH0sIHthOiA1fSwge2E6IDZ9XTtcbiAqICAgICAgUi5zeW1tZXRyaWNEaWZmZXJlbmNlV2l0aChlcUEsIGwxLCBsMik7IC8vPT4gW3thOiAxfSwge2E6IDJ9LCB7YTogNX0sIHthOiA2fV1cbiAqL1xuXG52YXIgc3ltbWV0cmljRGlmZmVyZW5jZVdpdGggPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MyhmdW5jdGlvbiBzeW1tZXRyaWNEaWZmZXJlbmNlV2l0aChwcmVkLCBsaXN0MSwgbGlzdDIpIHtcbiAgcmV0dXJuIGNvbmNhdChkaWZmZXJlbmNlV2l0aChwcmVkLCBsaXN0MSwgbGlzdDIpLCBkaWZmZXJlbmNlV2l0aChwcmVkLCBsaXN0MiwgbGlzdDEpKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBzeW1tZXRyaWNEaWZmZXJlbmNlV2l0aDsiLCJpbXBvcnQgX2NoZWNrRm9yTWV0aG9kIGZyb20gXCIuL2ludGVybmFsL19jaGVja0Zvck1ldGhvZC5qc1wiO1xuaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IHNsaWNlIGZyb20gXCIuL3NsaWNlLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYWxsIGJ1dCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gbGlzdCBvciBzdHJpbmcgKG9yIG9iamVjdFxuICogd2l0aCBhIGB0YWlsYCBtZXRob2QpLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBzbGljZWAgbWV0aG9kIG9mIHRoZSBmaXJzdCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBbYV1cbiAqIEBzaWcgU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHsqfSBsaXN0XG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLmhlYWQsIFIuaW5pdCwgUi5sYXN0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi50YWlsKFsxLCAyLCAzXSk7ICAvLz0+IFsyLCAzXVxuICogICAgICBSLnRhaWwoWzEsIDJdKTsgICAgIC8vPT4gWzJdXG4gKiAgICAgIFIudGFpbChbMV0pOyAgICAgICAgLy89PiBbXVxuICogICAgICBSLnRhaWwoW10pOyAgICAgICAgIC8vPT4gW11cbiAqXG4gKiAgICAgIFIudGFpbCgnYWJjJyk7ICAvLz0+ICdiYydcbiAqICAgICAgUi50YWlsKCdhYicpOyAgIC8vPT4gJ2InXG4gKiAgICAgIFIudGFpbCgnYScpOyAgICAvLz0+ICcnXG4gKiAgICAgIFIudGFpbCgnJyk7ICAgICAvLz0+ICcnXG4gKi9cblxudmFyIHRhaWwgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShcbi8qI19fUFVSRV9fKi9cbl9jaGVja0Zvck1ldGhvZCgndGFpbCcsXG4vKiNfX1BVUkVfXyovXG5zbGljZSgxLCBJbmZpbml0eSkpKTtcblxuZXhwb3J0IGRlZmF1bHQgdGFpbDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2Rpc3BhdGNoYWJsZSBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzXCI7XG5pbXBvcnQgX3h0YWtlIGZyb20gXCIuL2ludGVybmFsL194dGFrZS5qc1wiO1xuaW1wb3J0IHNsaWNlIGZyb20gXCIuL3NsaWNlLmpzXCI7XG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGBuYCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gbGlzdCwgc3RyaW5nLCBvclxuICogdHJhbnNkdWNlci90cmFuc2Zvcm1lciAob3Igb2JqZWN0IHdpdGggYSBgdGFrZWAgbWV0aG9kKS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgdGFrZWAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gW2FdIC0+IFthXVxuICogQHNpZyBOdW1iZXIgLT4gU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5kcm9wXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi50YWtlKDEsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydmb28nXVxuICogICAgICBSLnRha2UoMiwgWydmb28nLCAnYmFyJywgJ2JheiddKTsgLy89PiBbJ2ZvbycsICdiYXInXVxuICogICAgICBSLnRha2UoMywgWydmb28nLCAnYmFyJywgJ2JheiddKTsgLy89PiBbJ2ZvbycsICdiYXInLCAnYmF6J11cbiAqICAgICAgUi50YWtlKDQsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydmb28nLCAnYmFyJywgJ2JheiddXG4gKiAgICAgIFIudGFrZSgzLCAncmFtZGEnKTsgICAgICAgICAgICAgICAvLz0+ICdyYW0nXG4gKlxuICogICAgICBjb25zdCBwZXJzb25uZWwgPSBbXG4gKiAgICAgICAgJ0RhdmUgQnJ1YmVjaycsXG4gKiAgICAgICAgJ1BhdWwgRGVzbW9uZCcsXG4gKiAgICAgICAgJ0V1Z2VuZSBXcmlnaHQnLFxuICogICAgICAgICdKb2UgTW9yZWxsbycsXG4gKiAgICAgICAgJ0dlcnJ5IE11bGxpZ2FuJyxcbiAqICAgICAgICAnQm9iIEJhdGVzJyxcbiAqICAgICAgICAnSm9lIERvZGdlJyxcbiAqICAgICAgICAnUm9uIENyb3R0eSdcbiAqICAgICAgXTtcbiAqXG4gKiAgICAgIGNvbnN0IHRha2VGaXZlID0gUi50YWtlKDUpO1xuICogICAgICB0YWtlRml2ZShwZXJzb25uZWwpO1xuICogICAgICAvLz0+IFsnRGF2ZSBCcnViZWNrJywgJ1BhdWwgRGVzbW9uZCcsICdFdWdlbmUgV3JpZ2h0JywgJ0pvZSBNb3JlbGxvJywgJ0dlcnJ5IE11bGxpZ2FuJ11cbiAqIEBzeW1iIFIudGFrZSgtMSwgW2EsIGJdKSA9IFthLCBiXVxuICogQHN5bWIgUi50YWtlKDAsIFthLCBiXSkgPSBbXVxuICogQHN5bWIgUi50YWtlKDEsIFthLCBiXSkgPSBbYV1cbiAqIEBzeW1iIFIudGFrZSgyLCBbYSwgYl0pID0gW2EsIGJdXG4gKi9cblxudmFyIHRha2UgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5Mihcbi8qI19fUFVSRV9fKi9cbl9kaXNwYXRjaGFibGUoWyd0YWtlJ10sIF94dGFrZSwgZnVuY3Rpb24gdGFrZShuLCB4cykge1xuICByZXR1cm4gc2xpY2UoMCwgbiA8IDAgPyBJbmZpbml0eSA6IG4sIHhzKTtcbn0pKTtcblxuZXhwb3J0IGRlZmF1bHQgdGFrZTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgZHJvcCBmcm9tIFwiLi9kcm9wLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBsYXN0IGBuYCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gbGlzdC5cbiAqIElmIGBuID4gbGlzdC5sZW5ndGhgLCByZXR1cm5zIGEgbGlzdCBvZiBgbGlzdC5sZW5ndGhgIGVsZW1lbnRzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIE51bWJlciAtPiBbYV0gLT4gW2FdXG4gKiBAc2lnIE51bWJlciAtPiBTdHJpbmcgLT4gU3RyaW5nXG4gKiBAcGFyYW0ge051bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJldHVybi5cbiAqIEBwYXJhbSB7QXJyYXl9IHhzIFRoZSBjb2xsZWN0aW9uIHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAc2VlIFIuZHJvcExhc3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnRha2VMYXN0KDEsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydiYXonXVxuICogICAgICBSLnRha2VMYXN0KDIsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydiYXInLCAnYmF6J11cbiAqICAgICAgUi50YWtlTGFzdCgzLCBbJ2ZvbycsICdiYXInLCAnYmF6J10pOyAvLz0+IFsnZm9vJywgJ2JhcicsICdiYXonXVxuICogICAgICBSLnRha2VMYXN0KDQsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydmb28nLCAnYmFyJywgJ2JheiddXG4gKiAgICAgIFIudGFrZUxhc3QoMywgJ3JhbWRhJyk7ICAgICAgICAgICAgICAgLy89PiAnbWRhJ1xuICovXG5cbnZhciB0YWtlTGFzdCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIHRha2VMYXN0KG4sIHhzKSB7XG4gIHJldHVybiBkcm9wKG4gPj0gMCA/IHhzLmxlbmd0aCAtIG4gOiAwLCB4cyk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgdGFrZUxhc3Q7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IHNsaWNlIGZyb20gXCIuL3NsaWNlLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBsYXN0IGBuYCBlbGVtZW50cyBvZiBhIGdpdmVuIGxpc3QsIHBhc3NpbmdcbiAqIGVhY2ggdmFsdWUgdG8gdGhlIHN1cHBsaWVkIHByZWRpY2F0ZSBmdW5jdGlvbiwgYW5kIHRlcm1pbmF0aW5nIHdoZW4gdGhlXG4gKiBwcmVkaWNhdGUgZnVuY3Rpb24gcmV0dXJucyBgZmFsc2VgLiBFeGNsdWRlcyB0aGUgZWxlbWVudCB0aGF0IGNhdXNlZCB0aGVcbiAqIHByZWRpY2F0ZSBmdW5jdGlvbiB0byBmYWlsLiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIGlzIHBhc3NlZCBvbmUgYXJndW1lbnQ6XG4gKiAqKHZhbHVlKSouXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTYuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IFthXVxuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiBTdHJpbmcgLT4gU3RyaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge0FycmF5fSB4cyBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgYXJyYXkuXG4gKiBAc2VlIFIuZHJvcExhc3RXaGlsZSwgUi5hZGRJbmRleFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGlzTm90T25lID0geCA9PiB4ICE9PSAxO1xuICpcbiAqICAgICAgUi50YWtlTGFzdFdoaWxlKGlzTm90T25lLCBbMSwgMiwgMywgNF0pOyAvLz0+IFsyLCAzLCA0XVxuICpcbiAqICAgICAgUi50YWtlTGFzdFdoaWxlKHggPT4geCAhPT0gJ1InICwgJ1JhbWRhJyk7IC8vPT4gJ2FtZGEnXG4gKi9cblxudmFyIHRha2VMYXN0V2hpbGUgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiB0YWtlTGFzdFdoaWxlKGZuLCB4cykge1xuICB2YXIgaWR4ID0geHMubGVuZ3RoIC0gMTtcblxuICB3aGlsZSAoaWR4ID49IDAgJiYgZm4oeHNbaWR4XSkpIHtcbiAgICBpZHggLT0gMTtcbiAgfVxuXG4gIHJldHVybiBzbGljZShpZHggKyAxLCBJbmZpbml0eSwgeHMpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHRha2VMYXN0V2hpbGU7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF94dGFrZVdoaWxlIGZyb20gXCIuL2ludGVybmFsL194dGFrZVdoaWxlLmpzXCI7XG5pbXBvcnQgc2xpY2UgZnJvbSBcIi4vc2xpY2UuanNcIjtcbi8qKlxuICogUmV0dXJucyBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIGZpcnN0IGBuYCBlbGVtZW50cyBvZiBhIGdpdmVuIGxpc3QsXG4gKiBwYXNzaW5nIGVhY2ggdmFsdWUgdG8gdGhlIHN1cHBsaWVkIHByZWRpY2F0ZSBmdW5jdGlvbiwgYW5kIHRlcm1pbmF0aW5nIHdoZW5cbiAqIHRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gcmV0dXJucyBgZmFsc2VgLiBFeGNsdWRlcyB0aGUgZWxlbWVudCB0aGF0IGNhdXNlZCB0aGVcbiAqIHByZWRpY2F0ZSBmdW5jdGlvbiB0byBmYWlsLiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIGlzIHBhc3NlZCBvbmUgYXJndW1lbnQ6XG4gKiAqKHZhbHVlKSouXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYHRha2VXaGlsZWAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IFthXVxuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiBTdHJpbmcgLT4gU3RyaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge0FycmF5fSB4cyBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgYXJyYXkuXG4gKiBAc2VlIFIuZHJvcFdoaWxlLCBSLnRyYW5zZHVjZSwgUi5hZGRJbmRleFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGlzTm90Rm91ciA9IHggPT4geCAhPT0gNDtcbiAqXG4gKiAgICAgIFIudGFrZVdoaWxlKGlzTm90Rm91ciwgWzEsIDIsIDMsIDQsIDMsIDIsIDFdKTsgLy89PiBbMSwgMiwgM11cbiAqXG4gKiAgICAgIFIudGFrZVdoaWxlKHggPT4geCAhPT0gJ2QnICwgJ1JhbWRhJyk7IC8vPT4gJ1JhbSdcbiAqL1xuXG52YXIgdGFrZVdoaWxlID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoXG4vKiNfX1BVUkVfXyovXG5fZGlzcGF0Y2hhYmxlKFsndGFrZVdoaWxlJ10sIF94dGFrZVdoaWxlLCBmdW5jdGlvbiB0YWtlV2hpbGUoZm4sIHhzKSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0geHMubGVuZ3RoO1xuXG4gIHdoaWxlIChpZHggPCBsZW4gJiYgZm4oeHNbaWR4XSkpIHtcbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiBzbGljZSgwLCBpZHgsIHhzKTtcbn0pKTtcblxuZXhwb3J0IGRlZmF1bHQgdGFrZVdoaWxlOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfeHRhcCBmcm9tIFwiLi9pbnRlcm5hbC9feHRhcC5qc1wiO1xuLyoqXG4gKiBSdW5zIHRoZSBnaXZlbiBmdW5jdGlvbiB3aXRoIHRoZSBzdXBwbGllZCBvYmplY3QsIHRoZW4gcmV0dXJucyB0aGUgb2JqZWN0LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gYXMgc2Vjb25kIHBhcmFtZXRlci5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoYSAtPiAqKSAtPiBhIC0+IGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdpdGggYHhgLiBUaGUgcmV0dXJuIHZhbHVlIG9mIGBmbmAgd2lsbCBiZSB0aHJvd24gYXdheS5cbiAqIEBwYXJhbSB7Kn0geFxuICogQHJldHVybiB7Kn0gYHhgLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHNheVggPSB4ID0+IGNvbnNvbGUubG9nKCd4IGlzICcgKyB4KTtcbiAqICAgICAgUi50YXAoc2F5WCwgMTAwKTsgLy89PiAxMDBcbiAqICAgICAgLy8gbG9ncyAneCBpcyAxMDAnXG4gKiBAc3ltYiBSLnRhcChmLCBhKSA9IChmKGEpLCBhKVxuICovXG5cbnZhciB0YXAgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5Mihcbi8qI19fUFVSRV9fKi9cbl9kaXNwYXRjaGFibGUoW10sIF94dGFwLCBmdW5jdGlvbiB0YXAoZm4sIHgpIHtcbiAgZm4oeCk7XG4gIHJldHVybiB4O1xufSkpO1xuXG5leHBvcnQgZGVmYXVsdCB0YXA7IiwiaW1wb3J0IF9jbG9uZVJlZ0V4cCBmcm9tIFwiLi9pbnRlcm5hbC9fY2xvbmVSZWdFeHAuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaXNSZWdFeHAgZnJvbSBcIi4vaW50ZXJuYWwvX2lzUmVnRXhwLmpzXCI7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSBcIi4vdG9TdHJpbmcuanNcIjtcbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgZ2l2ZW4gc3RyaW5nIG1hdGNoZXMgYSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTIuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHNpZyBSZWdFeHAgLT4gU3RyaW5nIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7UmVnRXhwfSBwYXR0ZXJuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHNlZSBSLm1hdGNoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi50ZXN0KC9eeC8sICd4eXonKTsgLy89PiB0cnVlXG4gKiAgICAgIFIudGVzdCgvXnkvLCAneHl6Jyk7IC8vPT4gZmFsc2VcbiAqL1xuXG52YXIgdGVzdCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIHRlc3QocGF0dGVybiwgc3RyKSB7XG4gIGlmICghX2lzUmVnRXhwKHBhdHRlcm4pKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcign4oCYdGVzdOKAmSByZXF1aXJlcyBhIHZhbHVlIG9mIHR5cGUgUmVnRXhwIGFzIGl0cyBmaXJzdCBhcmd1bWVudDsgcmVjZWl2ZWQgJyArIHRvU3RyaW5nKHBhdHRlcm4pKTtcbiAgfVxuXG4gIHJldHVybiBfY2xvbmVSZWdFeHAocGF0dGVybikudGVzdChzdHIpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHRlc3Q7IiwiaW1wb3J0IGN1cnJ5TiBmcm9tIFwiLi9jdXJyeU4uanNcIjtcbmltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbi8qKlxuICogQ3JlYXRlcyBhIHRodW5rIG91dCBvZiBhIGZ1bmN0aW9uLiBBIHRodW5rIGRlbGF5cyBhIGNhbGN1bGF0aW9uIHVudGlsXG4gKiBpdHMgcmVzdWx0IGlzIG5lZWRlZCwgcHJvdmlkaW5nIGxhenkgZXZhbHVhdGlvbiBvZiBhcmd1bWVudHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjYuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICgoYSwgYiwgLi4uLCBqKSAtPiBrKSAtPiAoYSwgYiwgLi4uLCBqKSAtPiAoKCkgLT4gaylcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEEgZnVuY3Rpb24gdG8gd3JhcCBpbiBhIHRodW5rXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gRXhwZWN0cyBhcmd1bWVudHMgZm9yIGBmbmAgYW5kIHJldHVybnMgYSBuZXcgZnVuY3Rpb25cbiAqICB0aGF0LCB3aGVuIGNhbGxlZCwgYXBwbGllcyB0aG9zZSBhcmd1bWVudHMgdG8gYGZuYC5cbiAqIEBzZWUgUi5wYXJ0aWFsLCBSLnBhcnRpYWxSaWdodFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudGh1bmtpZnkoUi5pZGVudGl0eSkoNDIpKCk7IC8vPT4gNDJcbiAqICAgICAgUi50aHVua2lmeSgoYSwgYikgPT4gYSArIGIpKDI1LCAxNykoKTsgLy89PiA0MlxuICovXG5cbnZhciB0aHVua2lmeSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIHRodW5raWZ5KGZuKSB7XG4gIHJldHVybiBjdXJyeU4oZm4ubGVuZ3RoLCBmdW5jdGlvbiBjcmVhdGVUaHVuaygpIHtcbiAgICB2YXIgZm5BcmdzID0gYXJndW1lbnRzO1xuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2VUaHVuaygpIHtcbiAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBmbkFyZ3MpO1xuICAgIH07XG4gIH0pO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHRodW5raWZ5OyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbi8qKlxuICogQ2FsbHMgYW4gaW5wdXQgZnVuY3Rpb24gYG5gIHRpbWVzLCByZXR1cm5pbmcgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgcmVzdWx0c1xuICogb2YgdGhvc2UgZnVuY3Rpb24gY2FsbHMuXG4gKlxuICogYGZuYCBpcyBwYXNzZWQgb25lIGFyZ3VtZW50OiBUaGUgY3VycmVudCB2YWx1ZSBvZiBgbmAsIHdoaWNoIGJlZ2lucyBhdCBgMGBcbiAqIGFuZCBpcyBncmFkdWFsbHkgaW5jcmVtZW50ZWQgdG8gYG4gLSAxYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yLjNcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChOdW1iZXIgLT4gYSkgLT4gTnVtYmVyIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGludm9rZS4gUGFzc2VkIG9uZSBhcmd1bWVudCwgdGhlIGN1cnJlbnQgdmFsdWUgb2YgYG5gLlxuICogQHBhcmFtIHtOdW1iZXJ9IG4gQSB2YWx1ZSBiZXR3ZWVuIGAwYCBhbmQgYG4gLSAxYC4gSW5jcmVtZW50cyBhZnRlciBlYWNoIGZ1bmN0aW9uIGNhbGwuXG4gKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgY29udGFpbmluZyB0aGUgcmV0dXJuIHZhbHVlcyBvZiBhbGwgY2FsbHMgdG8gYGZuYC5cbiAqIEBzZWUgUi5yZXBlYXRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnRpbWVzKFIuaWRlbnRpdHksIDUpOyAvLz0+IFswLCAxLCAyLCAzLCA0XVxuICogQHN5bWIgUi50aW1lcyhmLCAwKSA9IFtdXG4gKiBAc3ltYiBSLnRpbWVzKGYsIDEpID0gW2YoMCldXG4gKiBAc3ltYiBSLnRpbWVzKGYsIDIpID0gW2YoMCksIGYoMSldXG4gKi9cblxudmFyIHRpbWVzID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gdGltZXMoZm4sIG4pIHtcbiAgdmFyIGxlbiA9IE51bWJlcihuKTtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsaXN0O1xuXG4gIGlmIChsZW4gPCAwIHx8IGlzTmFOKGxlbikpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignbiBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcicpO1xuICB9XG5cbiAgbGlzdCA9IFtdO1xuXG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBsaXN0LnB1c2goZm4oaWR4KSk7XG4gICAgaWR4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gbGlzdDtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB0aW1lczsiLCJpbXBvcnQgaW52b2tlciBmcm9tIFwiLi9pbnZva2VyLmpzXCI7XG4vKipcbiAqIFRoZSBsb3dlciBjYXNlIHZlcnNpb24gb2YgYSBzdHJpbmcuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOS4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAc2lnIFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byBsb3dlciBjYXNlLlxuICogQHJldHVybiB7U3RyaW5nfSBUaGUgbG93ZXIgY2FzZSB2ZXJzaW9uIG9mIGBzdHJgLlxuICogQHNlZSBSLnRvVXBwZXJcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnRvTG93ZXIoJ1hZWicpOyAvLz0+ICd4eXonXG4gKi9cblxudmFyIHRvTG93ZXIgPVxuLyojX19QVVJFX18qL1xuaW52b2tlcigwLCAndG9Mb3dlckNhc2UnKTtcbmV4cG9ydCBkZWZhdWx0IHRvTG93ZXI7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vaW50ZXJuYWwvX2hhcy5qc1wiO1xuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3QgaW50byBhbiBhcnJheSBvZiBrZXksIHZhbHVlIGFycmF5cy4gT25seSB0aGUgb2JqZWN0J3NcbiAqIG93biBwcm9wZXJ0aWVzIGFyZSB1c2VkLlxuICogTm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgb3V0cHV0IGFycmF5IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbnNpc3RlbnRcbiAqIGFjcm9zcyBkaWZmZXJlbnQgSlMgcGxhdGZvcm1zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjQuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7U3RyaW5nOiAqfSAtPiBbW1N0cmluZywqXV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBleHRyYWN0IGZyb21cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBrZXksIHZhbHVlIGFycmF5cyBmcm9tIHRoZSBvYmplY3QncyBvd24gcHJvcGVydGllcy5cbiAqIEBzZWUgUi5mcm9tUGFpcnMsIFIua2V5cywgUi52YWx1ZXNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnRvUGFpcnMoe2E6IDEsIGI6IDIsIGM6IDN9KTsgLy89PiBbWydhJywgMV0sIFsnYicsIDJdLCBbJ2MnLCAzXV1cbiAqL1xuXG52YXIgdG9QYWlycyA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIHRvUGFpcnMob2JqKSB7XG4gIHZhciBwYWlycyA9IFtdO1xuXG4gIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgaWYgKF9oYXMocHJvcCwgb2JqKSkge1xuICAgICAgcGFpcnNbcGFpcnMubGVuZ3RoXSA9IFtwcm9wLCBvYmpbcHJvcF1dO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYWlycztcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB0b1BhaXJzOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IGludG8gYW4gYXJyYXkgb2Yga2V5LCB2YWx1ZSBhcnJheXMuIFRoZSBvYmplY3QncyBvd25cbiAqIHByb3BlcnRpZXMgYW5kIHByb3RvdHlwZSBwcm9wZXJ0aWVzIGFyZSB1c2VkLiBOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIHRoZVxuICogb3V0cHV0IGFycmF5IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbnNpc3RlbnQgYWNyb3NzIGRpZmZlcmVudCBKU1xuICogcGxhdGZvcm1zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjQuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7U3RyaW5nOiAqfSAtPiBbW1N0cmluZywqXV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBleHRyYWN0IGZyb21cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBrZXksIHZhbHVlIGFycmF5cyBmcm9tIHRoZSBvYmplY3QncyBvd25cbiAqICAgICAgICAgYW5kIHByb3RvdHlwZSBwcm9wZXJ0aWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IEYgPSBmdW5jdGlvbigpIHsgdGhpcy54ID0gJ1gnOyB9O1xuICogICAgICBGLnByb3RvdHlwZS55ID0gJ1knO1xuICogICAgICBjb25zdCBmID0gbmV3IEYoKTtcbiAqICAgICAgUi50b1BhaXJzSW4oZik7IC8vPT4gW1sneCcsJ1gnXSwgWyd5JywnWSddXVxuICovXG5cbnZhciB0b1BhaXJzSW4gPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiB0b1BhaXJzSW4ob2JqKSB7XG4gIHZhciBwYWlycyA9IFtdO1xuXG4gIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgcGFpcnNbcGFpcnMubGVuZ3RoXSA9IFtwcm9wLCBvYmpbcHJvcF1dO1xuICB9XG5cbiAgcmV0dXJuIHBhaXJzO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHRvUGFpcnNJbjsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX3RvU3RyaW5nIGZyb20gXCIuL2ludGVybmFsL190b1N0cmluZy5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHZhbHVlLiBgZXZhbGAnaW5nIHRoZSBvdXRwdXRcbiAqIHNob3VsZCByZXN1bHQgaW4gYSB2YWx1ZSBlcXVpdmFsZW50IHRvIHRoZSBpbnB1dCB2YWx1ZS4gTWFueSBvZiB0aGUgYnVpbHQtaW5cbiAqIGB0b1N0cmluZ2AgbWV0aG9kcyBkbyBub3Qgc2F0aXNmeSB0aGlzIHJlcXVpcmVtZW50LlxuICpcbiAqIElmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhbiBgW29iamVjdCBPYmplY3RdYCB3aXRoIGEgYHRvU3RyaW5nYCBtZXRob2Qgb3RoZXJcbiAqIHRoYW4gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLCB0aGlzIG1ldGhvZCBpcyBpbnZva2VkIHdpdGggbm8gYXJndW1lbnRzXG4gKiB0byBwcm9kdWNlIHRoZSByZXR1cm4gdmFsdWUuIFRoaXMgbWVhbnMgdXNlci1kZWZpbmVkIGNvbnN0cnVjdG9yIGZ1bmN0aW9uc1xuICogY2FuIHByb3ZpZGUgYSBzdWl0YWJsZSBgdG9TdHJpbmdgIG1ldGhvZC4gRm9yIGV4YW1wbGU6XG4gKlxuICogICAgIGZ1bmN0aW9uIFBvaW50KHgsIHkpIHtcbiAqICAgICAgIHRoaXMueCA9IHg7XG4gKiAgICAgICB0aGlzLnkgPSB5O1xuICogICAgIH1cbiAqXG4gKiAgICAgUG9pbnQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gKiAgICAgICByZXR1cm4gJ25ldyBQb2ludCgnICsgdGhpcy54ICsgJywgJyArIHRoaXMueSArICcpJztcbiAqICAgICB9O1xuICpcbiAqICAgICBSLnRvU3RyaW5nKG5ldyBQb2ludCgxLCAyKSk7IC8vPT4gJ25ldyBQb2ludCgxLCAyKSdcbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAc2lnICogLT4gU3RyaW5nXG4gKiBAcGFyYW0geyp9IHZhbFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudG9TdHJpbmcoNDIpOyAvLz0+ICc0MidcbiAqICAgICAgUi50b1N0cmluZygnYWJjJyk7IC8vPT4gJ1wiYWJjXCInXG4gKiAgICAgIFIudG9TdHJpbmcoWzEsIDIsIDNdKTsgLy89PiAnWzEsIDIsIDNdJ1xuICogICAgICBSLnRvU3RyaW5nKHtmb286IDEsIGJhcjogMiwgYmF6OiAzfSk7IC8vPT4gJ3tcImJhclwiOiAyLCBcImJhelwiOiAzLCBcImZvb1wiOiAxfSdcbiAqICAgICAgUi50b1N0cmluZyhuZXcgRGF0ZSgnMjAwMS0wMi0wM1QwNDowNTowNlonKSk7IC8vPT4gJ25ldyBEYXRlKFwiMjAwMS0wMi0wM1QwNDowNTowNi4wMDBaXCIpJ1xuICovXG5cbnZhciB0b1N0cmluZyA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIHRvU3RyaW5nKHZhbCkge1xuICByZXR1cm4gX3RvU3RyaW5nKHZhbCwgW10pO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHRvU3RyaW5nOyIsImltcG9ydCBpbnZva2VyIGZyb20gXCIuL2ludm9rZXIuanNcIjtcbi8qKlxuICogVGhlIHVwcGVyIGNhc2UgdmVyc2lvbiBvZiBhIHN0cmluZy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC45LjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBzaWcgU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIHVwcGVyIGNhc2UuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSB1cHBlciBjYXNlIHZlcnNpb24gb2YgYHN0cmAuXG4gKiBAc2VlIFIudG9Mb3dlclxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudG9VcHBlcignYWJjJyk7IC8vPT4gJ0FCQydcbiAqL1xuXG52YXIgdG9VcHBlciA9XG4vKiNfX1BVUkVfXyovXG5pbnZva2VyKDAsICd0b1VwcGVyQ2FzZScpO1xuZXhwb3J0IGRlZmF1bHQgdG9VcHBlcjsiLCJpbXBvcnQgX3hSZWR1Y2UgZnJvbSBcIi4vaW50ZXJuYWwvX3hSZWR1Y2UuanNcIjtcbmltcG9ydCBfeHdyYXAgZnJvbSBcIi4vaW50ZXJuYWwvX3h3cmFwLmpzXCI7XG5pbXBvcnQgY3VycnlOIGZyb20gXCIuL2N1cnJ5Ti5qc1wiO1xuLyoqXG4gKiBJbml0aWFsaXplcyBhIHRyYW5zZHVjZXIgdXNpbmcgc3VwcGxpZWQgaXRlcmF0b3IgZnVuY3Rpb24uIFJldHVybnMgYSBzaW5nbGVcbiAqIGl0ZW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGxpc3QsIHN1Y2Nlc3NpdmVseSBjYWxsaW5nIHRoZSB0cmFuc2Zvcm1lZFxuICogaXRlcmF0b3IgZnVuY3Rpb24gYW5kIHBhc3NpbmcgaXQgYW4gYWNjdW11bGF0b3IgdmFsdWUgYW5kIHRoZSBjdXJyZW50IHZhbHVlXG4gKiBmcm9tIHRoZSBhcnJheSwgYW5kIHRoZW4gcGFzc2luZyB0aGUgcmVzdWx0IHRvIHRoZSBuZXh0IGNhbGwuXG4gKlxuICogVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIHJlY2VpdmVzIHR3byB2YWx1ZXM6ICooYWNjLCB2YWx1ZSkqLiBJdCB3aWxsIGJlXG4gKiB3cmFwcGVkIGFzIGEgdHJhbnNmb3JtZXIgdG8gaW5pdGlhbGl6ZSB0aGUgdHJhbnNkdWNlci4gQSB0cmFuc2Zvcm1lciBjYW4gYmVcbiAqIHBhc3NlZCBkaXJlY3RseSBpbiBwbGFjZSBvZiBhbiBpdGVyYXRvciBmdW5jdGlvbi4gSW4gYm90aCBjYXNlcywgaXRlcmF0aW9uXG4gKiBtYXkgYmUgc3RvcHBlZCBlYXJseSB3aXRoIHRoZSBbYFIucmVkdWNlZGBdKCNyZWR1Y2VkKSBmdW5jdGlvbi5cbiAqXG4gKiBBIHRyYW5zZHVjZXIgaXMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSB0cmFuc2Zvcm1lciBhbmQgcmV0dXJucyBhXG4gKiB0cmFuc2Zvcm1lciBhbmQgY2FuIGJlIGNvbXBvc2VkIGRpcmVjdGx5LlxuICpcbiAqIEEgdHJhbnNmb3JtZXIgaXMgYW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgYSAyLWFyaXR5IHJlZHVjaW5nIGl0ZXJhdG9yXG4gKiBmdW5jdGlvbiwgc3RlcCwgMC1hcml0eSBpbml0aWFsIHZhbHVlIGZ1bmN0aW9uLCBpbml0LCBhbmQgMS1hcml0eSByZXN1bHRcbiAqIGV4dHJhY3Rpb24gZnVuY3Rpb24sIHJlc3VsdC4gVGhlIHN0ZXAgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgaXRlcmF0b3JcbiAqIGZ1bmN0aW9uIGluIHJlZHVjZS4gVGhlIHJlc3VsdCBmdW5jdGlvbiBpcyB1c2VkIHRvIGNvbnZlcnQgdGhlIGZpbmFsXG4gKiBhY2N1bXVsYXRvciBpbnRvIHRoZSByZXR1cm4gdHlwZSBhbmQgaW4gbW9zdCBjYXNlcyBpc1xuICogW2BSLmlkZW50aXR5YF0oI2lkZW50aXR5KS4gVGhlIGluaXQgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhblxuICogaW5pdGlhbCBhY2N1bXVsYXRvciwgYnV0IGlzIGlnbm9yZWQgYnkgdHJhbnNkdWNlLlxuICpcbiAqIFRoZSBpdGVyYXRpb24gaXMgcGVyZm9ybWVkIHdpdGggW2BSLnJlZHVjZWBdKCNyZWR1Y2UpIGFmdGVyIGluaXRpYWxpemluZyB0aGUgdHJhbnNkdWNlci5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYyAtPiBjKSAtPiAoKGEsIGIpIC0+IGEpIC0+IGEgLT4gW2JdIC0+IGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHhmIFRoZSB0cmFuc2R1Y2VyIGZ1bmN0aW9uLiBSZWNlaXZlcyBhIHRyYW5zZm9ybWVyIGFuZCByZXR1cm5zIGEgdHJhbnNmb3JtZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgaXRlcmF0b3IgZnVuY3Rpb24uIFJlY2VpdmVzIHR3byB2YWx1ZXMsIHRoZSBhY2N1bXVsYXRvciBhbmQgdGhlXG4gKiAgICAgICAgY3VycmVudCBlbGVtZW50IGZyb20gdGhlIGFycmF5LiBXcmFwcGVkIGFzIHRyYW5zZm9ybWVyLCBpZiBuZWNlc3NhcnksIGFuZCB1c2VkIHRvXG4gKiAgICAgICAgaW5pdGlhbGl6ZSB0aGUgdHJhbnNkdWNlclxuICogQHBhcmFtIHsqfSBhY2MgVGhlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEByZXR1cm4geyp9IFRoZSBmaW5hbCwgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKiBAc2VlIFIucmVkdWNlLCBSLnJlZHVjZWQsIFIuaW50b1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IG51bWJlcnMgPSBbMSwgMiwgMywgNF07XG4gKiAgICAgIGNvbnN0IHRyYW5zZHVjZXIgPSBSLmNvbXBvc2UoUi5tYXAoUi5hZGQoMSkpLCBSLnRha2UoMikpO1xuICogICAgICBSLnRyYW5zZHVjZSh0cmFuc2R1Y2VyLCBSLmZsaXAoUi5hcHBlbmQpLCBbXSwgbnVtYmVycyk7IC8vPT4gWzIsIDNdXG4gKlxuICogICAgICBjb25zdCBpc09kZCA9ICh4KSA9PiB4ICUgMiAhPT0gMDtcbiAqICAgICAgY29uc3QgZmlyc3RPZGRUcmFuc2R1Y2VyID0gUi5jb21wb3NlKFIuZmlsdGVyKGlzT2RkKSwgUi50YWtlKDEpKTtcbiAqICAgICAgUi50cmFuc2R1Y2UoZmlyc3RPZGRUcmFuc2R1Y2VyLCBSLmZsaXAoUi5hcHBlbmQpLCBbXSwgUi5yYW5nZSgwLCAxMDApKTsgLy89PiBbMV1cbiAqL1xuXG52YXIgdHJhbnNkdWNlID1cbi8qI19fUFVSRV9fKi9cbmN1cnJ5Tig0LCBmdW5jdGlvbiB0cmFuc2R1Y2UoeGYsIGZuLCBhY2MsIGxpc3QpIHtcbiAgcmV0dXJuIF94UmVkdWNlKHhmKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyA/IF94d3JhcChmbikgOiBmbiksIGFjYywgbGlzdCk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHRyYW5zZHVjZTsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG4vKipcbiAqIFRyYW5zcG9zZXMgdGhlIHJvd3MgYW5kIGNvbHVtbnMgb2YgYSAyRCBsaXN0LlxuICogV2hlbiBwYXNzZWQgYSBsaXN0IG9mIGBuYCBsaXN0cyBvZiBsZW5ndGggYHhgLFxuICogcmV0dXJucyBhIGxpc3Qgb2YgYHhgIGxpc3RzIG9mIGxlbmd0aCBgbmAuXG4gKlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE5LjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFtbYV1dIC0+IFtbYV1dXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IEEgMkQgbGlzdFxuICogQHJldHVybiB7QXJyYXl9IEEgMkQgbGlzdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudHJhbnNwb3NlKFtbMSwgJ2EnXSwgWzIsICdiJ10sIFszLCAnYyddXSkgLy89PiBbWzEsIDIsIDNdLCBbJ2EnLCAnYicsICdjJ11dXG4gKiAgICAgIFIudHJhbnNwb3NlKFtbMSwgMiwgM10sIFsnYScsICdiJywgJ2MnXV0pIC8vPT4gW1sxLCAnYSddLCBbMiwgJ2InXSwgWzMsICdjJ11dXG4gKlxuICogICAgICAvLyBJZiBzb21lIG9mIHRoZSByb3dzIGFyZSBzaG9ydGVyIHRoYW4gdGhlIGZvbGxvd2luZyByb3dzLCB0aGVpciBlbGVtZW50cyBhcmUgc2tpcHBlZDpcbiAqICAgICAgUi50cmFuc3Bvc2UoW1sxMCwgMTFdLCBbMjBdLCBbXSwgWzMwLCAzMSwgMzJdXSkgLy89PiBbWzEwLCAyMCwgMzBdLCBbMTEsIDMxXSwgWzMyXV1cbiAqIEBzeW1iIFIudHJhbnNwb3NlKFtbYV0sIFtiXSwgW2NdXSkgPSBbYSwgYiwgY11cbiAqIEBzeW1iIFIudHJhbnNwb3NlKFtbYSwgYl0sIFtjLCBkXV0pID0gW1thLCBjXSwgW2IsIGRdXVxuICogQHN5bWIgUi50cmFuc3Bvc2UoW1thLCBiXSwgW2NdXSkgPSBbW2EsIGNdLCBbYl1dXG4gKi9cblxudmFyIHRyYW5zcG9zZSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIHRyYW5zcG9zZShvdXRlcmxpc3QpIHtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKGkgPCBvdXRlcmxpc3QubGVuZ3RoKSB7XG4gICAgdmFyIGlubmVybGlzdCA9IG91dGVybGlzdFtpXTtcbiAgICB2YXIgaiA9IDA7XG5cbiAgICB3aGlsZSAoaiA8IGlubmVybGlzdC5sZW5ndGgpIHtcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0W2pdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXN1bHRbal0gPSBbXTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0W2pdLnB1c2goaW5uZXJsaXN0W2pdKTtcbiAgICAgIGogKz0gMTtcbiAgICB9XG5cbiAgICBpICs9IDE7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHRyYW5zcG9zZTsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgbWFwIGZyb20gXCIuL21hcC5qc1wiO1xuaW1wb3J0IHNlcXVlbmNlIGZyb20gXCIuL3NlcXVlbmNlLmpzXCI7XG4vKipcbiAqIE1hcHMgYW4gW0FwcGxpY2F0aXZlXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI2FwcGxpY2F0aXZlKS1yZXR1cm5pbmdcbiAqIGZ1bmN0aW9uIG92ZXIgYSBbVHJhdmVyc2FibGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjdHJhdmVyc2FibGUpLFxuICogdGhlbiB1c2VzIFtgc2VxdWVuY2VgXSgjc2VxdWVuY2UpIHRvIHRyYW5zZm9ybSB0aGUgcmVzdWx0aW5nIFRyYXZlcnNhYmxlIG9mIEFwcGxpY2F0aXZlXG4gKiBpbnRvIGFuIEFwcGxpY2F0aXZlIG9mIFRyYXZlcnNhYmxlLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGB0cmF2ZXJzZWAgbWV0aG9kIG9mIHRoZSB0aGlyZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBmYW50YXN5LWxhbmQvb2YgOjogVHlwZVJlcCBmID0+IGYgfj4gYSAtPiBmIGFcbiAqIEBzaWcgKEFwcGxpY2F0aXZlIGYsIFRyYXZlcnNhYmxlIHQpID0+IFR5cGVSZXAgZiAtPiAoYSAtPiBmIGIpIC0+IHQgYSAtPiBmICh0IGIpXG4gKiBAc2lnIChBcHBsaWNhdGl2ZSBmLCBUcmF2ZXJzYWJsZSB0KSA9PiAoYiAtPiBmIGIpIC0+IChhIC0+IGYgYikgLT4gdCBhIC0+IGYgKHQgYilcbiAqIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSBUeXBlUmVwcmVzZW50YXRpdmUgd2l0aCBhbiBgb2ZgIG9yIGBmYW50YXN5LWxhbmQvb2ZgIG1ldGhvZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZlxuICogQHBhcmFtIHsqfSB0cmF2ZXJzYWJsZVxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5zZXF1ZW5jZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIC8vIFJldHVybnMgYE1heWJlLk5vdGhpbmdgIGlmIHRoZSBnaXZlbiBkaXZpc29yIGlzIGAwYFxuICogICAgICBjb25zdCBzYWZlRGl2ID0gbiA9PiBkID0+IGQgPT09IDAgPyBNYXliZS5Ob3RoaW5nKCkgOiBNYXliZS5KdXN0KG4gLyBkKVxuICpcbiAqICAgICAgUi50cmF2ZXJzZShNYXliZS5vZiwgc2FmZURpdigxMCksIFsyLCA0LCA1XSk7IC8vPT4gTWF5YmUuSnVzdChbNSwgMi41LCAyXSlcbiAqICAgICAgUi50cmF2ZXJzZShNYXliZS5vZiwgc2FmZURpdigxMCksIFsyLCAwLCA1XSk7IC8vPT4gTWF5YmUuTm90aGluZ1xuICpcbiAqICAgICAgLy8gVXNpbmcgYSBUeXBlIFJlcHJlc2VudGF0aXZlXG4gKiAgICAgIFIudHJhdmVyc2UoTWF5YmUsIHNhZmVEaXYoMTApLCBSaWdodCg0KSk7IC8vPT4gSnVzdChSaWdodCgyLjUpKVxuICogICAgICBSLnRyYXZlcnNlKE1heWJlLCBzYWZlRGl2KDEwKSwgUmlnaHQoMCkpOyAvLz0+IE5vdGhpbmdcbiAqICAgICAgUi50cmF2ZXJzZShNYXliZSwgc2FmZURpdigxMCksIExlZnQoXCJYXCIpKTsgLy89PiBKdXN0KExlZnQoXCJYXCIpKVxuICovXG5cbnZhciB0cmF2ZXJzZSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIHRyYXZlcnNlKEYsIGYsIHRyYXZlcnNhYmxlKSB7XG4gIHZhciBvZiA9IHR5cGVvZiBGWydmYW50YXN5LWxhbmQvb2YnXSA9PT0gJ2Z1bmN0aW9uJyA/IEZbJ2ZhbnRhc3ktbGFuZC9vZiddIDogdHlwZW9mIEYub2YgPT09ICdmdW5jdGlvbicgPyBGLm9mIDogRjtcbiAgdmFyIFR5cGVSZXAgPSB7XG4gICAgJ2ZhbnRhc3ktbGFuZC9vZic6IG9mXG4gIH07XG4gIHJldHVybiB0eXBlb2YgdHJhdmVyc2FibGVbJ2ZhbnRhc3ktbGFuZC90cmF2ZXJzZSddID09PSAnZnVuY3Rpb24nID8gdHJhdmVyc2FibGVbJ2ZhbnRhc3ktbGFuZC90cmF2ZXJzZSddKFR5cGVSZXAsIGYpIDogdHlwZW9mIHRyYXZlcnNhYmxlLnRyYXZlcnNlID09PSAnZnVuY3Rpb24nID8gdHJhdmVyc2FibGUudHJhdmVyc2UoVHlwZVJlcCwgZikgOiBzZXF1ZW5jZShUeXBlUmVwLCBtYXAoZiwgdHJhdmVyc2FibGUpKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB0cmF2ZXJzZTsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG52YXIgd3MgPSAnXFx4MDlcXHgwQVxceDBCXFx4MENcXHgwRFxceDIwXFx4QTBcXHUxNjgwXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwMycgKyAnXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjgnICsgJ1xcdTIwMjlcXHVGRUZGJztcbnZhciB6ZXJvV2lkdGggPSAnXFx1MjAwYic7XG52YXIgaGFzUHJvdG9UcmltID0gdHlwZW9mIFN0cmluZy5wcm90b3R5cGUudHJpbSA9PT0gJ2Z1bmN0aW9uJztcbi8qKlxuICogUmVtb3ZlcyAoc3RyaXBzKSB3aGl0ZXNwYWNlIGZyb20gYm90aCBlbmRzIG9mIHRoZSBzdHJpbmcuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNi4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAc2lnIFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byB0cmltLlxuICogQHJldHVybiB7U3RyaW5nfSBUcmltbWVkIHZlcnNpb24gb2YgYHN0cmAuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi50cmltKCcgICB4eXogICcpOyAvLz0+ICd4eXonXG4gKiAgICAgIFIubWFwKFIudHJpbSwgUi5zcGxpdCgnLCcsICd4LCB5LCB6JykpOyAvLz0+IFsneCcsICd5JywgJ3onXVxuICovXG5cbnZhciB0cmltID0gIWhhc1Byb3RvVHJpbSB8fFxuLyojX19QVVJFX18qL1xud3MudHJpbSgpIHx8ICFcbi8qI19fUFVSRV9fKi9cbnplcm9XaWR0aC50cmltKCkgP1xuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiB0cmltKHN0cikge1xuICB2YXIgYmVnaW5SeCA9IG5ldyBSZWdFeHAoJ15bJyArIHdzICsgJ11bJyArIHdzICsgJ10qJyk7XG4gIHZhciBlbmRSeCA9IG5ldyBSZWdFeHAoJ1snICsgd3MgKyAnXVsnICsgd3MgKyAnXSokJyk7XG4gIHJldHVybiBzdHIucmVwbGFjZShiZWdpblJ4LCAnJykucmVwbGFjZShlbmRSeCwgJycpO1xufSkgOlxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiB0cmltKHN0cikge1xuICByZXR1cm4gc3RyLnRyaW0oKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgdHJpbTsiLCJpbXBvcnQgX2FyaXR5IGZyb20gXCIuL2ludGVybmFsL19hcml0eS5qc1wiO1xuaW1wb3J0IF9jb25jYXQgZnJvbSBcIi4vaW50ZXJuYWwvX2NvbmNhdC5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBgdHJ5Q2F0Y2hgIHRha2VzIHR3byBmdW5jdGlvbnMsIGEgYHRyeWVyYCBhbmQgYSBgY2F0Y2hlcmAuIFRoZSByZXR1cm5lZFxuICogZnVuY3Rpb24gZXZhbHVhdGVzIHRoZSBgdHJ5ZXJgOyBpZiBpdCBkb2VzIG5vdCB0aHJvdywgaXQgc2ltcGx5IHJldHVybnMgdGhlXG4gKiByZXN1bHQuIElmIHRoZSBgdHJ5ZXJgICpkb2VzKiB0aHJvdywgdGhlIHJldHVybmVkIGZ1bmN0aW9uIGV2YWx1YXRlcyB0aGVcbiAqIGBjYXRjaGVyYCBmdW5jdGlvbiBhbmQgcmV0dXJucyBpdHMgcmVzdWx0LiBOb3RlIHRoYXQgZm9yIGVmZmVjdGl2ZVxuICogY29tcG9zaXRpb24gd2l0aCB0aGlzIGZ1bmN0aW9uLCBib3RoIHRoZSBgdHJ5ZXJgIGFuZCBgY2F0Y2hlcmAgZnVuY3Rpb25zXG4gKiBtdXN0IHJldHVybiB0aGUgc2FtZSB0eXBlIG9mIHJlc3VsdHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjAuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICguLi54IC0+IGEpIC0+ICgoZSwgLi4ueCkgLT4gYSkgLT4gKC4uLnggLT4gYSlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyeWVyIFRoZSBmdW5jdGlvbiB0aGF0IG1heSB0aHJvdy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhdGNoZXIgVGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBldmFsdWF0ZWQgaWYgYHRyeWVyYCB0aHJvd3MuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcgZnVuY3Rpb24gdGhhdCB3aWxsIGNhdGNoIGV4Y2VwdGlvbnMgYW5kIHNlbmQgdGhlbSB0byB0aGUgY2F0Y2hlci5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnRyeUNhdGNoKFIucHJvcCgneCcpLCBSLkYpKHt4OiB0cnVlfSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLnRyeUNhdGNoKCgpID0+IHsgdGhyb3cgJ2Zvbyd9LCBSLmFsd2F5cygnY2F1Z2h0JykpKCdiYXInKSAvLyA9PlxuICogICAgICAnY2F1Z2h0J1xuICogICAgICBSLnRyeUNhdGNoKFIudGltZXMoUi5pZGVudGl0eSksIFIuYWx3YXlzKFtdKSkoJ3MnKSAvLyA9PiBbXVxuICogICAgICBSLnRyeUNhdGNoKCgpID0+IHsgdGhyb3cgJ3RoaXMgaXMgbm90IGEgdmFsaWQgdmFsdWUnfSwgKGVyciwgdmFsdWUpPT4oe2Vycm9yIDogZXJyLCAgdmFsdWUgfSkpKCdiYXInKSAvLyA9PiB7J2Vycm9yJzogJ3RoaXMgaXMgbm90IGEgdmFsaWQgdmFsdWUnLCAndmFsdWUnOiAnYmFyJ31cbiAqL1xuXG52YXIgdHJ5Q2F0Y2ggPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBfdHJ5Q2F0Y2godHJ5ZXIsIGNhdGNoZXIpIHtcbiAgcmV0dXJuIF9hcml0eSh0cnllci5sZW5ndGgsIGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRyeWVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGNhdGNoZXIuYXBwbHkodGhpcywgX2NvbmNhdChbZV0sIGFyZ3VtZW50cykpO1xuICAgIH1cbiAgfSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgdHJ5Q2F0Y2g7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuLyoqXG4gKiBHaXZlcyBhIHNpbmdsZS13b3JkIHN0cmluZyBkZXNjcmlwdGlvbiBvZiB0aGUgKG5hdGl2ZSkgdHlwZSBvZiBhIHZhbHVlLFxuICogcmV0dXJuaW5nIHN1Y2ggYW5zd2VycyBhcyAnT2JqZWN0JywgJ051bWJlcicsICdBcnJheScsIG9yICdOdWxsJy4gRG9lcyBub3RcbiAqIGF0dGVtcHQgdG8gZGlzdGluZ3Vpc2ggdXNlciBPYmplY3QgdHlwZXMgYW55IGZ1cnRoZXIsIHJlcG9ydGluZyB0aGVtIGFsbCBhc1xuICogJ09iamVjdCcuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOC4wXG4gKiBAY2F0ZWdvcnkgVHlwZVxuICogQHNpZyAqIC0+IFN0cmluZ1xuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnR5cGUoe30pOyAvLz0+IFwiT2JqZWN0XCJcbiAqICAgICAgUi50eXBlKDEpOyAvLz0+IFwiTnVtYmVyXCJcbiAqICAgICAgUi50eXBlKGZhbHNlKTsgLy89PiBcIkJvb2xlYW5cIlxuICogICAgICBSLnR5cGUoJ3MnKTsgLy89PiBcIlN0cmluZ1wiXG4gKiAgICAgIFIudHlwZShudWxsKTsgLy89PiBcIk51bGxcIlxuICogICAgICBSLnR5cGUoW10pOyAvLz0+IFwiQXJyYXlcIlxuICogICAgICBSLnR5cGUoL1tBLXpdLyk7IC8vPT4gXCJSZWdFeHBcIlxuICogICAgICBSLnR5cGUoKCkgPT4ge30pOyAvLz0+IFwiRnVuY3Rpb25cIlxuICogICAgICBSLnR5cGUodW5kZWZpbmVkKTsgLy89PiBcIlVuZGVmaW5lZFwiXG4gKi9cblxudmFyIHR5cGUgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiB0eXBlKHZhbCkge1xuICByZXR1cm4gdmFsID09PSBudWxsID8gJ051bGwnIDogdmFsID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpLnNsaWNlKDgsIC0xKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB0eXBlOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbi8qKlxuICogVGFrZXMgYSBmdW5jdGlvbiBgZm5gLCB3aGljaCB0YWtlcyBhIHNpbmdsZSBhcnJheSBhcmd1bWVudCwgYW5kIHJldHVybnMgYVxuICogZnVuY3Rpb24gd2hpY2g6XG4gKlxuICogICAtIHRha2VzIGFueSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHM7XG4gKiAgIC0gcGFzc2VzIHRoZXNlIGFyZ3VtZW50cyB0byBgZm5gIGFzIGFuIGFycmF5OyBhbmRcbiAqICAgLSByZXR1cm5zIHRoZSByZXN1bHQuXG4gKlxuICogSW4gb3RoZXIgd29yZHMsIGBSLnVuYXBwbHlgIGRlcml2ZXMgYSB2YXJpYWRpYyBmdW5jdGlvbiBmcm9tIGEgZnVuY3Rpb24gd2hpY2hcbiAqIHRha2VzIGFuIGFycmF5LiBgUi51bmFwcGx5YCBpcyB0aGUgaW52ZXJzZSBvZiBbYFIuYXBwbHlgXSgjYXBwbHkpLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjguMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIChbKi4uLl0gLT4gYSkgLT4gKCouLi4gLT4gYSlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBzZWUgUi5hcHBseVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudW5hcHBseShKU09OLnN0cmluZ2lmeSkoMSwgMiwgMyk7IC8vPT4gJ1sxLDIsM10nXG4gKiBAc3ltYiBSLnVuYXBwbHkoZikoYSwgYikgPSBmKFthLCBiXSlcbiAqL1xuXG52YXIgdW5hcHBseSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIHVuYXBwbHkoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZm4oQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKSk7XG4gIH07XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgdW5hcHBseTsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgbkFyeSBmcm9tIFwiLi9uQXJ5LmpzXCI7XG4vKipcbiAqIFdyYXBzIGEgZnVuY3Rpb24gb2YgYW55IGFyaXR5IChpbmNsdWRpbmcgbnVsbGFyeSkgaW4gYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHNcbiAqIGV4YWN0bHkgMSBwYXJhbWV0ZXIuIEFueSBleHRyYW5lb3VzIHBhcmFtZXRlcnMgd2lsbCBub3QgYmUgcGFzc2VkIHRvIHRoZVxuICogc3VwcGxpZWQgZnVuY3Rpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMi4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKGEgLT4gYiAtPiBjIC0+IC4uLiAtPiB6KSAtPiAoYSAtPiB6KVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcgZnVuY3Rpb24gd3JhcHBpbmcgYGZuYC4gVGhlIG5ldyBmdW5jdGlvbiBpcyBndWFyYW50ZWVkIHRvIGJlIG9mXG4gKiAgICAgICAgIGFyaXR5IDEuXG4gKiBAc2VlIFIuYmluYXJ5LCBSLm5BcnlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCB0YWtlc1R3b0FyZ3MgPSBmdW5jdGlvbihhLCBiKSB7XG4gKiAgICAgICAgcmV0dXJuIFthLCBiXTtcbiAqICAgICAgfTtcbiAqICAgICAgdGFrZXNUd29BcmdzLmxlbmd0aDsgLy89PiAyXG4gKiAgICAgIHRha2VzVHdvQXJncygxLCAyKTsgLy89PiBbMSwgMl1cbiAqXG4gKiAgICAgIGNvbnN0IHRha2VzT25lQXJnID0gUi51bmFyeSh0YWtlc1R3b0FyZ3MpO1xuICogICAgICB0YWtlc09uZUFyZy5sZW5ndGg7IC8vPT4gMVxuICogICAgICAvLyBPbmx5IDEgYXJndW1lbnQgaXMgcGFzc2VkIHRvIHRoZSB3cmFwcGVkIGZ1bmN0aW9uXG4gKiAgICAgIHRha2VzT25lQXJnKDEsIDIpOyAvLz0+IFsxLCB1bmRlZmluZWRdXG4gKiBAc3ltYiBSLnVuYXJ5KGYpKGEsIGIsIGMpID0gZihhKVxuICovXG5cbnZhciB1bmFyeSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIHVuYXJ5KGZuKSB7XG4gIHJldHVybiBuQXJ5KDEsIGZuKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB1bmFyeTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgY3VycnlOIGZyb20gXCIuL2N1cnJ5Ti5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gb2YgYXJpdHkgYG5gIGZyb20gYSAobWFudWFsbHkpIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBOb3RlIHRoYXQsIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBpcyBhY3R1YWxseSBhIHJhbWRhIHN0eWxlXG4gKiBjdXJyeWllZCBmdW5jdGlvbiwgd2hpY2ggY2FuIGFjY2VwdCBvbmUgb3IgbW9yZSBhcmd1bWVudHMgaW4gZWFjaFxuICogZnVuY3Rpb24gY2FsbGluZy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNC4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgTnVtYmVyIC0+IChhIC0+IGIgLT4gYyAuLi4gLT4geikgLT4gKChhIC0+IGIgLT4gYyAuLi4pIC0+IHopXG4gKiBAcGFyYW0ge051bWJlcn0gbGVuZ3RoIFRoZSBhcml0eSBmb3IgdGhlIHJldHVybmVkIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIHVuY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcgZnVuY3Rpb24uXG4gKiBAc2VlIFIuY3VycnksIFIuY3VycnlOXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgYWRkRm91ciA9IGEgPT4gYiA9PiBjID0+IGQgPT4gYSArIGIgKyBjICsgZDtcbiAqXG4gKiAgICAgIGNvbnN0IHVuY3VycmllZEFkZEZvdXIgPSBSLnVuY3VycnlOKDQsIGFkZEZvdXIpO1xuICogICAgICB1bmN1cnJpZWRBZGRGb3VyKDEsIDIsIDMsIDQpOyAvLz0+IDEwXG4gKi9cblxudmFyIHVuY3VycnlOID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gdW5jdXJyeU4oZGVwdGgsIGZuKSB7XG4gIHJldHVybiBjdXJyeU4oZGVwdGgsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY3VycmVudERlcHRoID0gMTtcbiAgICB2YXIgdmFsdWUgPSBmbjtcbiAgICB2YXIgaWR4ID0gMDtcbiAgICB2YXIgZW5kSWR4O1xuXG4gICAgd2hpbGUgKGN1cnJlbnREZXB0aCA8PSBkZXB0aCAmJiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVuZElkeCA9IGN1cnJlbnREZXB0aCA9PT0gZGVwdGggPyBhcmd1bWVudHMubGVuZ3RoIDogaWR4ICsgdmFsdWUubGVuZ3RoO1xuICAgICAgdmFsdWUgPSB2YWx1ZS5hcHBseSh0aGlzLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIGlkeCwgZW5kSWR4KSk7XG4gICAgICBjdXJyZW50RGVwdGggKz0gMTtcbiAgICAgIGlkeCA9IGVuZElkeDtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH0pO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHVuY3VycnlOOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbi8qKlxuICogQnVpbGRzIGEgbGlzdCBmcm9tIGEgc2VlZCB2YWx1ZS4gQWNjZXB0cyBhbiBpdGVyYXRvciBmdW5jdGlvbiwgd2hpY2ggcmV0dXJuc1xuICogZWl0aGVyIGZhbHNlIHRvIHN0b3AgaXRlcmF0aW9uIG9yIGFuIGFycmF5IG9mIGxlbmd0aCAyIGNvbnRhaW5pbmcgdGhlIHZhbHVlXG4gKiB0byBhZGQgdG8gdGhlIHJlc3VsdGluZyBsaXN0IGFuZCB0aGUgc2VlZCB0byBiZSB1c2VkIGluIHRoZSBuZXh0IGNhbGwgdG8gdGhlXG4gKiBpdGVyYXRvciBmdW5jdGlvbi5cbiAqXG4gKiBUaGUgaXRlcmF0b3IgZnVuY3Rpb24gcmVjZWl2ZXMgb25lIGFyZ3VtZW50OiAqKHNlZWQpKi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xMC4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBbYl0pIC0+ICogLT4gW2JdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgaXRlcmF0b3IgZnVuY3Rpb24uIHJlY2VpdmVzIG9uZSBhcmd1bWVudCwgYHNlZWRgLCBhbmQgcmV0dXJuc1xuICogICAgICAgIGVpdGhlciBmYWxzZSB0byBxdWl0IGl0ZXJhdGlvbiBvciBhbiBhcnJheSBvZiBsZW5ndGggdHdvIHRvIHByb2NlZWQuIFRoZSBlbGVtZW50XG4gKiAgICAgICAgYXQgaW5kZXggMCBvZiB0aGlzIGFycmF5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHJlc3VsdGluZyBhcnJheSwgYW5kIHRoZSBlbGVtZW50XG4gKiAgICAgICAgYXQgaW5kZXggMSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgbmV4dCBjYWxsIHRvIGBmbmAuXG4gKiBAcGFyYW0geyp9IHNlZWQgVGhlIHNlZWQgdmFsdWUuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGZpbmFsIGxpc3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZiA9IG4gPT4gbiA+IDUwID8gZmFsc2UgOiBbLW4sIG4gKyAxMF07XG4gKiAgICAgIFIudW5mb2xkKGYsIDEwKTsgLy89PiBbLTEwLCAtMjAsIC0zMCwgLTQwLCAtNTBdXG4gKiBAc3ltYiBSLnVuZm9sZChmLCB4KSA9IFtmKHgpWzBdLCBmKGYoeClbMV0pWzBdLCBmKGYoZih4KVsxXSlbMV0pWzBdLCAuLi5dXG4gKi9cblxudmFyIHVuZm9sZCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIHVuZm9sZChmbiwgc2VlZCkge1xuICB2YXIgcGFpciA9IGZuKHNlZWQpO1xuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKHBhaXIgJiYgcGFpci5sZW5ndGgpIHtcbiAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBwYWlyWzBdO1xuICAgIHBhaXIgPSBmbihwYWlyWzFdKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgdW5mb2xkOyIsImltcG9ydCBfY29uY2F0IGZyb20gXCIuL2ludGVybmFsL19jb25jYXQuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBjb21wb3NlIGZyb20gXCIuL2NvbXBvc2UuanNcIjtcbmltcG9ydCB1bmlxIGZyb20gXCIuL3VuaXEuanNcIjtcbi8qKlxuICogQ29tYmluZXMgdHdvIGxpc3RzIGludG8gYSBzZXQgKGkuZS4gbm8gZHVwbGljYXRlcykgY29tcG9zZWQgb2YgdGhlIGVsZW1lbnRzXG4gKiBvZiBlYWNoIGxpc3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgWypdIC0+IFsqXSAtPiBbKl1cbiAqIEBwYXJhbSB7QXJyYXl9IGFzIFRoZSBmaXJzdCBsaXN0LlxuICogQHBhcmFtIHtBcnJheX0gYnMgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBmaXJzdCBhbmQgc2Vjb25kIGxpc3RzIGNvbmNhdGVuYXRlZCwgd2l0aFxuICogICAgICAgICBkdXBsaWNhdGVzIHJlbW92ZWQuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi51bmlvbihbMSwgMiwgM10sIFsyLCAzLCA0XSk7IC8vPT4gWzEsIDIsIDMsIDRdXG4gKi9cblxudmFyIHVuaW9uID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoXG4vKiNfX1BVUkVfXyovXG5jb21wb3NlKHVuaXEsIF9jb25jYXQpKTtcblxuZXhwb3J0IGRlZmF1bHQgdW5pb247IiwiaW1wb3J0IF9jb25jYXQgZnJvbSBcIi4vaW50ZXJuYWwvX2NvbmNhdC5qc1wiO1xuaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IHVuaXFXaXRoIGZyb20gXCIuL3VuaXFXaXRoLmpzXCI7XG4vKipcbiAqIENvbWJpbmVzIHR3byBsaXN0cyBpbnRvIGEgc2V0IChpLmUuIG5vIGR1cGxpY2F0ZXMpIGNvbXBvc2VkIG9mIHRoZSBlbGVtZW50c1xuICogb2YgZWFjaCBsaXN0LiBEdXBsaWNhdGlvbiBpcyBkZXRlcm1pbmVkIGFjY29yZGluZyB0byB0aGUgdmFsdWUgcmV0dXJuZWQgYnlcbiAqIGFwcGx5aW5nIHRoZSBzdXBwbGllZCBwcmVkaWNhdGUgdG8gdHdvIGxpc3QgZWxlbWVudHMuIElmIGFuIGVsZW1lbnQgZXhpc3RzXG4gKiBpbiBib3RoIGxpc3RzLCB0aGUgZmlyc3QgZWxlbWVudCBmcm9tIHRoZSBmaXJzdCBsaXN0IHdpbGwgYmUgdXNlZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyAoKGEsIGEpIC0+IEJvb2xlYW4pIC0+IFsqXSAtPiBbKl0gLT4gWypdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkIEEgcHJlZGljYXRlIHVzZWQgdG8gdGVzdCB3aGV0aGVyIHR3byBpdGVtcyBhcmUgZXF1YWwuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MSBUaGUgZmlyc3QgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QyIFRoZSBzZWNvbmQgbGlzdC5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgZmlyc3QgYW5kIHNlY29uZCBsaXN0cyBjb25jYXRlbmF0ZWQsIHdpdGhcbiAqICAgICAgICAgZHVwbGljYXRlcyByZW1vdmVkLlxuICogQHNlZSBSLnVuaW9uXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgbDEgPSBbe2E6IDF9LCB7YTogMn1dO1xuICogICAgICBjb25zdCBsMiA9IFt7YTogMX0sIHthOiA0fV07XG4gKiAgICAgIFIudW5pb25XaXRoKFIuZXFCeShSLnByb3AoJ2EnKSksIGwxLCBsMik7IC8vPT4gW3thOiAxfSwge2E6IDJ9LCB7YTogNH1dXG4gKi9cblxudmFyIHVuaW9uV2l0aCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIHVuaW9uV2l0aChwcmVkLCBsaXN0MSwgbGlzdDIpIHtcbiAgcmV0dXJuIHVuaXFXaXRoKHByZWQsIF9jb25jYXQobGlzdDEsIGxpc3QyKSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgdW5pb25XaXRoOyIsImltcG9ydCBpZGVudGl0eSBmcm9tIFwiLi9pZGVudGl0eS5qc1wiO1xuaW1wb3J0IHVuaXFCeSBmcm9tIFwiLi91bmlxQnkuanNcIjtcbi8qKlxuICogUmV0dXJucyBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgb25seSBvbmUgY29weSBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsXG4gKiBsaXN0LiBbYFIuZXF1YWxzYF0oI2VxdWFscykgaXMgdXNlZCB0byBkZXRlcm1pbmUgZXF1YWxpdHkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgbGlzdCBvZiB1bmlxdWUgaXRlbXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi51bmlxKFsxLCAxLCAyLCAxXSk7IC8vPT4gWzEsIDJdXG4gKiAgICAgIFIudW5pcShbMSwgJzEnXSk7ICAgICAvLz0+IFsxLCAnMSddXG4gKiAgICAgIFIudW5pcShbWzQyXSwgWzQyXV0pOyAvLz0+IFtbNDJdXVxuICovXG5cbnZhciB1bmlxID1cbi8qI19fUFVSRV9fKi9cbnVuaXFCeShpZGVudGl0eSk7XG5leHBvcnQgZGVmYXVsdCB1bmlxOyIsImltcG9ydCBfU2V0IGZyb20gXCIuL2ludGVybmFsL19TZXQuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfeHVuaXFCeSBmcm9tIFwiLi9pbnRlcm5hbC9feHVuaXFCeS5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyBvbmx5IG9uZSBjb3B5IG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAqIGxpc3QsIGJhc2VkIHVwb24gdGhlIHZhbHVlIHJldHVybmVkIGJ5IGFwcGx5aW5nIHRoZSBzdXBwbGllZCBmdW5jdGlvbiB0b1xuICogZWFjaCBsaXN0IGVsZW1lbnQuIFByZWZlcnMgdGhlIGZpcnN0IGl0ZW0gaWYgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIHByb2R1Y2VzXG4gKiB0aGUgc2FtZSB2YWx1ZSBvbiB0d28gaXRlbXMuIFtgUi5lcXVhbHNgXSgjZXF1YWxzKSBpcyB1c2VkIGZvciBjb21wYXJpc29uLlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNi4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBiKSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBBIGZ1bmN0aW9uIHVzZWQgdG8gcHJvZHVjZSBhIHZhbHVlIHRvIHVzZSBkdXJpbmcgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgbGlzdCBvZiB1bmlxdWUgaXRlbXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi51bmlxQnkoTWF0aC5hYnMsIFstMSwgLTUsIDIsIDEwLCAxLCAyXSk7IC8vPT4gWy0xLCAtNSwgMiwgMTBdXG4gKi9cblxudmFyIHVuaXFCeSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKFxuLyojX19QVVJFX18qL1xuX2Rpc3BhdGNoYWJsZShbXSwgX3h1bmlxQnksIGZ1bmN0aW9uIChmbiwgbGlzdCkge1xuICB2YXIgc2V0ID0gbmV3IF9TZXQoKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGFwcGxpZWRJdGVtLCBpdGVtO1xuXG4gIHdoaWxlIChpZHggPCBsaXN0Lmxlbmd0aCkge1xuICAgIGl0ZW0gPSBsaXN0W2lkeF07XG4gICAgYXBwbGllZEl0ZW0gPSBmbihpdGVtKTtcblxuICAgIGlmIChzZXQuYWRkKGFwcGxpZWRJdGVtKSkge1xuICAgICAgcmVzdWx0LnB1c2goaXRlbSk7XG4gICAgfVxuXG4gICAgaWR4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufSkpO1xuXG5leHBvcnQgZGVmYXVsdCB1bmlxQnk7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF9pbmNsdWRlc1dpdGggZnJvbSBcIi4vaW50ZXJuYWwvX2luY2x1ZGVzV2l0aC5qc1wiO1xuaW1wb3J0IF94dW5pcVdpdGggZnJvbSBcIi4vaW50ZXJuYWwvX3h1bmlxV2l0aC5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyBvbmx5IG9uZSBjb3B5IG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAqIGxpc3QsIGJhc2VkIHVwb24gdGhlIHZhbHVlIHJldHVybmVkIGJ5IGFwcGx5aW5nIHRoZSBzdXBwbGllZCBwcmVkaWNhdGUgdG9cbiAqIHR3byBsaXN0IGVsZW1lbnRzLiBQcmVmZXJzIHRoZSBmaXJzdCBpdGVtIGlmIHR3byBpdGVtcyBjb21wYXJlIGVxdWFsIGJhc2VkXG4gKiBvbiB0aGUgcHJlZGljYXRlLlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICgoYSwgYSkgLT4gQm9vbGVhbikgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCBBIHByZWRpY2F0ZSB1c2VkIHRvIHRlc3Qgd2hldGhlciB0d28gaXRlbXMgYXJlIGVxdWFsLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGxpc3Qgb2YgdW5pcXVlIGl0ZW1zLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHN0ckVxID0gUi5lcUJ5KFN0cmluZyk7XG4gKiAgICAgIFIudW5pcVdpdGgoc3RyRXEpKFsxLCAnMScsIDIsIDFdKTsgLy89PiBbMSwgMl1cbiAqICAgICAgUi51bmlxV2l0aChzdHJFcSkoW3t9LCB7fV0pOyAgICAgICAvLz0+IFt7fV1cbiAqICAgICAgUi51bmlxV2l0aChzdHJFcSkoWzEsICcxJywgMV0pOyAgICAvLz0+IFsxXVxuICogICAgICBSLnVuaXFXaXRoKHN0ckVxKShbJzEnLCAxLCAxXSk7ICAgIC8vPT4gWycxJ11cbiAqL1xuXG52YXIgdW5pcVdpdGggPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5Mihcbi8qI19fUFVSRV9fKi9cbl9kaXNwYXRjaGFibGUoW10sIF94dW5pcVdpdGgsIGZ1bmN0aW9uIChwcmVkLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGl0ZW07XG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGl0ZW0gPSBsaXN0W2lkeF07XG5cbiAgICBpZiAoIV9pbmNsdWRlc1dpdGgocHJlZCwgaXRlbSwgcmVzdWx0KSkge1xuICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gaXRlbTtcbiAgICB9XG5cbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59KSk7XG5cbmV4cG9ydCBkZWZhdWx0IHVuaXFXaXRoOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbi8qKlxuICogVGVzdHMgdGhlIGZpbmFsIGFyZ3VtZW50IGJ5IHBhc3NpbmcgaXQgdG8gdGhlIGdpdmVuIHByZWRpY2F0ZSBmdW5jdGlvbi4gSWZcbiAqIHRoZSBwcmVkaWNhdGUgaXMgbm90IHNhdGlzZmllZCwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSByZXN1bHQgb2ZcbiAqIGNhbGxpbmcgdGhlIGB3aGVuRmFsc2VGbmAgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBhcmd1bWVudC4gSWYgdGhlIHByZWRpY2F0ZVxuICogaXMgc2F0aXNmaWVkLCB0aGUgYXJndW1lbnQgaXMgcmV0dXJuZWQgYXMgaXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTguMFxuICogQGNhdGVnb3J5IExvZ2ljXG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IChhIC0+IGIpIC0+IGEgLT4gYSB8IGJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgICAgICAgIEEgcHJlZGljYXRlIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB3aGVuRmFsc2VGbiBBIGZ1bmN0aW9uIHRvIGludm9rZSB3aGVuIHRoZSBgcHJlZGAgZXZhbHVhdGVzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhIGZhbHN5IHZhbHVlLlxuICogQHBhcmFtIHsqfSAgICAgICAgeCAgICAgICAgICAgQW4gb2JqZWN0IHRvIHRlc3Qgd2l0aCB0aGUgYHByZWRgIGZ1bmN0aW9uIGFuZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyB0byBgd2hlbkZhbHNlRm5gIGlmIG5lY2Vzc2FyeS5cbiAqIEByZXR1cm4geyp9IEVpdGhlciBgeGAgb3IgdGhlIHJlc3VsdCBvZiBhcHBseWluZyBgeGAgdG8gYHdoZW5GYWxzZUZuYC5cbiAqIEBzZWUgUi5pZkVsc2UsIFIud2hlbiwgUi5jb25kXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgbGV0IHNhZmVJbmMgPSBSLnVubGVzcyhSLmlzTmlsLCBSLmluYyk7XG4gKiAgICAgIHNhZmVJbmMobnVsbCk7IC8vPT4gbnVsbFxuICogICAgICBzYWZlSW5jKDEpOyAvLz0+IDJcbiAqL1xuXG52YXIgdW5sZXNzID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTMoZnVuY3Rpb24gdW5sZXNzKHByZWQsIHdoZW5GYWxzZUZuLCB4KSB7XG4gIHJldHVybiBwcmVkKHgpID8geCA6IHdoZW5GYWxzZUZuKHgpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHVubGVzczsiLCJpbXBvcnQgX2lkZW50aXR5IGZyb20gXCIuL2ludGVybmFsL19pZGVudGl0eS5qc1wiO1xuaW1wb3J0IGNoYWluIGZyb20gXCIuL2NoYWluLmpzXCI7XG4vKipcbiAqIFNob3J0aGFuZCBmb3IgYFIuY2hhaW4oUi5pZGVudGl0eSlgLCB3aGljaCByZW1vdmVzIG9uZSBsZXZlbCBvZiBuZXN0aW5nIGZyb21cbiAqIGFueSBbQ2hhaW5dKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjY2hhaW4pLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjMuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgQ2hhaW4gYyA9PiBjIChjIGEpIC0+IGMgYVxuICogQHBhcmFtIHsqfSBsaXN0XG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLmZsYXR0ZW4sIFIuY2hhaW5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnVubmVzdChbMSwgWzJdLCBbWzNdXV0pOyAvLz0+IFsxLCAyLCBbM11dXG4gKiAgICAgIFIudW5uZXN0KFtbMSwgMl0sIFszLCA0XSwgWzUsIDZdXSk7IC8vPT4gWzEsIDIsIDMsIDQsIDUsIDZdXG4gKi9cblxudmFyIHVubmVzdCA9XG4vKiNfX1BVUkVfXyovXG5jaGFpbihfaWRlbnRpdHkpO1xuZXhwb3J0IGRlZmF1bHQgdW5uZXN0OyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbi8qKlxuICogVGFrZXMgYSBwcmVkaWNhdGUsIGEgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24sIGFuZCBhbiBpbml0aWFsIHZhbHVlLFxuICogYW5kIHJldHVybnMgYSB2YWx1ZSBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBpbml0aWFsIHZhbHVlLlxuICogSXQgZG9lcyBzbyBieSBhcHBseWluZyB0aGUgdHJhbnNmb3JtYXRpb24gdW50aWwgdGhlIHByZWRpY2F0ZSBpcyBzYXRpc2ZpZWQsXG4gKiBhdCB3aGljaCBwb2ludCBpdCByZXR1cm5zIHRoZSBzYXRpc2ZhY3RvcnkgdmFsdWUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjAuMFxuICogQGNhdGVnb3J5IExvZ2ljXG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IChhIC0+IGEpIC0+IGEgLT4gYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCBBIHByZWRpY2F0ZSBmdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IGluaXQgSW5pdGlhbCB2YWx1ZVxuICogQHJldHVybiB7Kn0gRmluYWwgdmFsdWUgdGhhdCBzYXRpc2ZpZXMgcHJlZGljYXRlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi51bnRpbChSLmd0KFIuX18sIDEwMCksIFIubXVsdGlwbHkoMikpKDEpIC8vID0+IDEyOFxuICovXG5cbnZhciB1bnRpbCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIHVudGlsKHByZWQsIGZuLCBpbml0KSB7XG4gIHZhciB2YWwgPSBpbml0O1xuXG4gIHdoaWxlICghcHJlZCh2YWwpKSB7XG4gICAgdmFsID0gZm4odmFsKTtcbiAgfVxuXG4gIHJldHVybiB2YWw7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgdW50aWw7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL2ludGVybmFsL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgX21hcCBmcm9tIFwiLi9pbnRlcm5hbC9fbWFwLmpzXCI7XG5pbXBvcnQgX2Fzc29jIGZyb20gXCIuL2ludGVybmFsL19hc3NvYy5qc1wiO1xuLyoqXG4gKlxuICogRGVjb25zdHJ1Y3RzIGFuIGFycmF5IGZpZWxkIGZyb20gdGhlIGlucHV0IGRvY3VtZW50cyB0byBvdXRwdXQgYSBkb2N1bWVudCBmb3IgZWFjaCBlbGVtZW50LlxuICogRWFjaCBvdXRwdXQgZG9jdW1lbnQgaXMgdGhlIGlucHV0IGRvY3VtZW50IHdpdGggdGhlIHZhbHVlIG9mIHRoZSBhcnJheSBmaWVsZCByZXBsYWNlZCBieSB0aGUgZWxlbWVudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIFN0cmluZyAtPiB7azogW3ZdfSAtPiBbe2s6IHZ9XVxuICogQHBhcmFtIHtTdHJpbmd9IGtleSBUaGUga2V5IHRvIGRldGVybWluZSB3aGljaCBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0IHNob3VsZCBiZSB1bndpbmRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCBjb250YWluaW5nIGxpc3QgdW5kZXIgcHJvcGVydHkgbmFtZWQgYXMga2V5IHdoaWNoIGlzIHRvIHVud2luZFxuICogQHJldHVybiB7TGlzdH0gQSBuZXcgbGlzdCBvZiBvYmplY3QgY29udGFpbmluZyB0aGUgdmFsdWUgb2YgaW5wdXQga2V5IGhhdmluZyBsaXN0IHJlcGxhY2VkIGJ5IGVhY2ggZWxlbWVudCBpbiB0aGUgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiBSLnVud2luZCgnaG9iYmllcycsIHtcbiAqICAgbmFtZTogJ2FsaWNlJyxcbiAqICAgaG9iYmllczogWydHb2xmJywgJ0hhY2tpbmcnXSxcbiAqICAgY29sb3JzOiBbJ3JlZCcsICdncmVlbiddLFxuICogfSk7XG4gKiAvLyBbXG4gKiAvLyAgIHsgbmFtZTogJ2FsaWNlJywgaG9iYmllczogJ0dvbGYnLCBjb2xvcnM6IFsncmVkJywgJ2dyZWVuJ10gfSxcbiAqIC8vICAgeyBuYW1lOiAnYWxpY2UnLCBob2JiaWVzOiAnSGFja2luZycsIGNvbG9yczogWydyZWQnLCAnZ3JlZW4nXSB9XG4gKiAvLyBdXG4gKi9cblxudmFyIHVud2luZCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIChrZXksIG9iamVjdCkge1xuICAvLyBJZiBrZXkgaXMgbm90IGluIG9iamVjdCBvciBrZXkgaXMgbm90IGFzIGEgbGlzdCBpbiBvYmplY3RcbiAgaWYgKCEoa2V5IGluIG9iamVjdCAmJiBfaXNBcnJheShvYmplY3Rba2V5XSkpKSB7XG4gICAgcmV0dXJuIFtvYmplY3RdO1xuICB9IC8vIE1hcCBvdmVyIG9iamVjdFtrZXldIHdoaWNoIGlzIGEgbGlzdCBhbmQgYXNzb2MgZWFjaCBlbGVtZW50IHdpdGgga2V5XG5cblxuICByZXR1cm4gX21hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgIHJldHVybiBfYXNzb2Moa2V5LCBpdGVtLCBvYmplY3QpO1xuICB9LCBvYmplY3Rba2V5XSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgdW53aW5kOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBhZGp1c3QgZnJvbSBcIi4vYWRqdXN0LmpzXCI7XG5pbXBvcnQgYWx3YXlzIGZyb20gXCIuL2Fsd2F5cy5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGNvcHkgb2YgdGhlIGFycmF5IHdpdGggdGhlIGVsZW1lbnQgYXQgdGhlIHByb3ZpZGVkIGluZGV4XG4gKiByZXBsYWNlZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNC4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gYSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge051bWJlcn0gaWR4IFRoZSBpbmRleCB0byB1cGRhdGUuXG4gKiBAcGFyYW0geyp9IHggVGhlIHZhbHVlIHRvIGV4aXN0IGF0IHRoZSBnaXZlbiBpbmRleCBvZiB0aGUgcmV0dXJuZWQgYXJyYXkuXG4gKiBAcGFyYW0ge0FycmF5fEFyZ3VtZW50c30gbGlzdCBUaGUgc291cmNlIGFycmF5LWxpa2Ugb2JqZWN0IHRvIGJlIHVwZGF0ZWQuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBjb3B5IG9mIGBsaXN0YCB3aXRoIHRoZSB2YWx1ZSBhdCBpbmRleCBgaWR4YCByZXBsYWNlZCB3aXRoIGB4YC5cbiAqIEBzZWUgUi5hZGp1c3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnVwZGF0ZSgxLCAnXycsIFsnYScsICdiJywgJ2MnXSk7ICAgICAgLy89PiBbJ2EnLCAnXycsICdjJ11cbiAqICAgICAgUi51cGRhdGUoLTEsICdfJywgWydhJywgJ2InLCAnYyddKTsgICAgIC8vPT4gWydhJywgJ2InLCAnXyddXG4gKiBAc3ltYiBSLnVwZGF0ZSgtMSwgYSwgW2IsIGNdKSA9IFtiLCBhXVxuICogQHN5bWIgUi51cGRhdGUoMCwgYSwgW2IsIGNdKSA9IFthLCBjXVxuICogQHN5bWIgUi51cGRhdGUoMSwgYSwgW2IsIGNdKSA9IFtiLCBhXVxuICovXG5cbnZhciB1cGRhdGUgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MyhmdW5jdGlvbiB1cGRhdGUoaWR4LCB4LCBsaXN0KSB7XG4gIHJldHVybiBhZGp1c3QoaWR4LCBhbHdheXMoeCksIGxpc3QpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHVwZGF0ZTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgY3VycnlOIGZyb20gXCIuL2N1cnJ5Ti5qc1wiO1xuLyoqXG4gKiBBY2NlcHRzIGEgZnVuY3Rpb24gYGZuYCBhbmQgYSBsaXN0IG9mIHRyYW5zZm9ybWVyIGZ1bmN0aW9ucyBhbmQgcmV0dXJucyBhXG4gKiBuZXcgY3VycmllZCBmdW5jdGlvbi4gV2hlbiB0aGUgbmV3IGZ1bmN0aW9uIGlzIGludm9rZWQsIGl0IGNhbGxzIHRoZVxuICogZnVuY3Rpb24gYGZuYCB3aXRoIHBhcmFtZXRlcnMgY29uc2lzdGluZyBvZiB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgZWFjaFxuICogc3VwcGxpZWQgaGFuZGxlciBvbiBzdWNjZXNzaXZlIGFyZ3VtZW50cyB0byB0aGUgbmV3IGZ1bmN0aW9uLlxuICpcbiAqIElmIG1vcmUgYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gdGhlIHJldHVybmVkIGZ1bmN0aW9uIHRoYW4gdHJhbnNmb3JtZXJcbiAqIGZ1bmN0aW9ucywgdGhvc2UgYXJndW1lbnRzIGFyZSBwYXNzZWQgZGlyZWN0bHkgdG8gYGZuYCBhcyBhZGRpdGlvbmFsXG4gKiBwYXJhbWV0ZXJzLiBJZiB5b3UgZXhwZWN0IGFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgZG9uJ3QgbmVlZCB0byBiZVxuICogdHJhbnNmb3JtZWQsIGFsdGhvdWdoIHlvdSBjYW4gaWdub3JlIHRoZW0sIGl0J3MgYmVzdCB0byBwYXNzIGFuIGlkZW50aXR5XG4gKiBmdW5jdGlvbiBzbyB0aGF0IHRoZSBuZXcgZnVuY3Rpb24gcmVwb3J0cyB0aGUgY29ycmVjdCBhcml0eS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKHgxLCB4MiwgLi4uKSAtPiB6KSAtPiBbKGEgLT4geDEpLCAoYiAtPiB4MiksIC4uLl0gLT4gKGEgLT4gYiAtPiAuLi4gLT4geilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtBcnJheX0gdHJhbnNmb3JtZXJzIEEgbGlzdCBvZiB0cmFuc2Zvcm1lciBmdW5jdGlvbnNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgd3JhcHBlZCBmdW5jdGlvbi5cbiAqIEBzZWUgUi5jb252ZXJnZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudXNlV2l0aChNYXRoLnBvdywgW1IuaWRlbnRpdHksIFIuaWRlbnRpdHldKSgzLCA0KTsgLy89PiA4MVxuICogICAgICBSLnVzZVdpdGgoTWF0aC5wb3csIFtSLmlkZW50aXR5LCBSLmlkZW50aXR5XSkoMykoNCk7IC8vPT4gODFcbiAqICAgICAgUi51c2VXaXRoKE1hdGgucG93LCBbUi5kZWMsIFIuaW5jXSkoMywgNCk7IC8vPT4gMzJcbiAqICAgICAgUi51c2VXaXRoKE1hdGgucG93LCBbUi5kZWMsIFIuaW5jXSkoMykoNCk7IC8vPT4gMzJcbiAqIEBzeW1iIFIudXNlV2l0aChmLCBbZywgaF0pKGEsIGIpID0gZihnKGEpLCBoKGIpKVxuICovXG5cbnZhciB1c2VXaXRoID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gdXNlV2l0aChmbiwgdHJhbnNmb3JtZXJzKSB7XG4gIHJldHVybiBjdXJyeU4odHJhbnNmb3JtZXJzLmxlbmd0aCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgdmFyIGlkeCA9IDA7XG5cbiAgICB3aGlsZSAoaWR4IDwgdHJhbnNmb3JtZXJzLmxlbmd0aCkge1xuICAgICAgYXJncy5wdXNoKHRyYW5zZm9ybWVyc1tpZHhdLmNhbGwodGhpcywgYXJndW1lbnRzW2lkeF0pKTtcbiAgICAgIGlkeCArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmdzLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIHRyYW5zZm9ybWVycy5sZW5ndGgpKSk7XG4gIH0pO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHVzZVdpdGg7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IGtleXMgZnJvbSBcIi4va2V5cy5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIHN1cHBsaWVkIG9iamVjdC5cbiAqIE5vdGUgdGhhdCB0aGUgb3JkZXIgb2YgdGhlIG91dHB1dCBhcnJheSBpcyBub3QgZ3VhcmFudGVlZCBhY3Jvc3MgZGlmZmVyZW50XG4gKiBKUyBwbGF0Zm9ybXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHtrOiB2fSAtPiBbdl1cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBleHRyYWN0IHZhbHVlcyBmcm9tXG4gKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgdGhlIHZhbHVlcyBvZiB0aGUgb2JqZWN0J3Mgb3duIHByb3BlcnRpZXMuXG4gKiBAc2VlIFIudmFsdWVzSW4sIFIua2V5cywgUi50b1BhaXJzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi52YWx1ZXMoe2E6IDEsIGI6IDIsIGM6IDN9KTsgLy89PiBbMSwgMiwgM11cbiAqL1xuXG52YXIgdmFsdWVzID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoZnVuY3Rpb24gdmFsdWVzKG9iaikge1xuICB2YXIgcHJvcHMgPSBrZXlzKG9iaik7XG4gIHZhciBsZW4gPSBwcm9wcy5sZW5ndGg7XG4gIHZhciB2YWxzID0gW107XG4gIHZhciBpZHggPSAwO1xuXG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICB2YWxzW2lkeF0gPSBvYmpbcHJvcHNbaWR4XV07XG4gICAgaWR4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gdmFscztcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB2YWx1ZXM7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIHByb3BlcnRpZXMsIGluY2x1ZGluZyBwcm90b3R5cGUgcHJvcGVydGllcywgb2YgdGhlXG4gKiBzdXBwbGllZCBvYmplY3QuXG4gKiBOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBvdXRwdXQgYXJyYXkgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgY29uc2lzdGVudFxuICogYWNyb3NzIGRpZmZlcmVudCBKUyBwbGF0Zm9ybXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMi4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHtrOiB2fSAtPiBbdl1cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBleHRyYWN0IHZhbHVlcyBmcm9tXG4gKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgdGhlIHZhbHVlcyBvZiB0aGUgb2JqZWN0J3Mgb3duIGFuZCBwcm90b3R5cGUgcHJvcGVydGllcy5cbiAqIEBzZWUgUi52YWx1ZXMsIFIua2V5c0luXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgRiA9IGZ1bmN0aW9uKCkgeyB0aGlzLnggPSAnWCc7IH07XG4gKiAgICAgIEYucHJvdG90eXBlLnkgPSAnWSc7XG4gKiAgICAgIGNvbnN0IGYgPSBuZXcgRigpO1xuICogICAgICBSLnZhbHVlc0luKGYpOyAvLz0+IFsnWCcsICdZJ11cbiAqL1xuXG52YXIgdmFsdWVzSW4gPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiB2YWx1ZXNJbihvYmopIHtcbiAgdmFyIHByb3A7XG4gIHZhciB2cyA9IFtdO1xuXG4gIGZvciAocHJvcCBpbiBvYmopIHtcbiAgICB2c1t2cy5sZW5ndGhdID0gb2JqW3Byb3BdO1xuICB9XG5cbiAgcmV0dXJuIHZzO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHZhbHVlc0luOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjsgLy8gYENvbnN0YCBpcyBhIGZ1bmN0b3IgdGhhdCBlZmZlY3RpdmVseSBpZ25vcmVzIHRoZSBmdW5jdGlvbiBnaXZlbiB0byBgbWFwYC5cblxudmFyIENvbnN0ID0gZnVuY3Rpb24gKHgpIHtcbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogeCxcbiAgICAnZmFudGFzeS1sYW5kL21hcCc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfTtcbn07XG4vKipcbiAqIFJldHVybnMgYSBcInZpZXdcIiBvZiB0aGUgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmUsIGRldGVybWluZWQgYnkgdGhlIGdpdmVuIGxlbnMuXG4gKiBUaGUgbGVucydzIGZvY3VzIGRldGVybWluZXMgd2hpY2ggcG9ydGlvbiBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgaXMgdmlzaWJsZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNi4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gTGVucyBzIGEgPSBGdW5jdG9yIGYgPT4gKGEgLT4gZiBhKSAtPiBzIC0+IGYgc1xuICogQHNpZyBMZW5zIHMgYSAtPiBzIC0+IGFcbiAqIEBwYXJhbSB7TGVuc30gbGVuc1xuICogQHBhcmFtIHsqfSB4XG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLnNldCwgUi5vdmVyLCBSLmxlbnMsIFIubGVuc0luZGV4LCBSLmxlbnNQcm9wLCBSLmxlbnNQYXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgeExlbnMgPSBSLmxlbnNQcm9wKCd4Jyk7XG4gKlxuICogICAgICBSLnZpZXcoeExlbnMsIHt4OiAxLCB5OiAyfSk7ICAvLz0+IDFcbiAqICAgICAgUi52aWV3KHhMZW5zLCB7eDogNCwgeTogMn0pOyAgLy89PiA0XG4gKi9cblxuXG52YXIgdmlldyA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIHZpZXcobGVucywgeCkge1xuICAvLyBVc2luZyBgQ29uc3RgIGVmZmVjdGl2ZWx5IGlnbm9yZXMgdGhlIHNldHRlciBmdW5jdGlvbiBvZiB0aGUgYGxlbnNgLFxuICAvLyBsZWF2aW5nIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgZ2V0dGVyIGZ1bmN0aW9uIHVubW9kaWZpZWQuXG4gIHJldHVybiBsZW5zKENvbnN0KSh4KS52YWx1ZTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB2aWV3OyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbi8qKlxuICogVGVzdHMgdGhlIGZpbmFsIGFyZ3VtZW50IGJ5IHBhc3NpbmcgaXQgdG8gdGhlIGdpdmVuIHByZWRpY2F0ZSBmdW5jdGlvbi4gSWZcbiAqIHRoZSBwcmVkaWNhdGUgaXMgc2F0aXNmaWVkLCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nXG4gKiB0aGUgYHdoZW5UcnVlRm5gIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgYXJndW1lbnQuIElmIHRoZSBwcmVkaWNhdGUgaXMgbm90XG4gKiBzYXRpc2ZpZWQsIHRoZSBhcmd1bWVudCBpcyByZXR1cm5lZCBhcyBpcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOC4wXG4gKiBAY2F0ZWdvcnkgTG9naWNcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gKGEgLT4gYikgLT4gYSAtPiBhIHwgYlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCAgICAgICBBIHByZWRpY2F0ZSBmdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gd2hlblRydWVGbiBBIGZ1bmN0aW9uIHRvIGludm9rZSB3aGVuIHRoZSBgY29uZGl0aW9uYFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0ZXMgdG8gYSB0cnV0aHkgdmFsdWUuXG4gKiBAcGFyYW0geyp9ICAgICAgICB4ICAgICAgICAgIEFuIG9iamVjdCB0byB0ZXN0IHdpdGggdGhlIGBwcmVkYCBmdW5jdGlvbiBhbmRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyB0byBgd2hlblRydWVGbmAgaWYgbmVjZXNzYXJ5LlxuICogQHJldHVybiB7Kn0gRWl0aGVyIGB4YCBvciB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIGB4YCB0byBgd2hlblRydWVGbmAuXG4gKiBAc2VlIFIuaWZFbHNlLCBSLnVubGVzcywgUi5jb25kXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgLy8gdHJ1bmNhdGUgOjogU3RyaW5nIC0+IFN0cmluZ1xuICogICAgICBjb25zdCB0cnVuY2F0ZSA9IFIud2hlbihcbiAqICAgICAgICBSLnByb3BTYXRpc2ZpZXMoUi5ndChSLl9fLCAxMCksICdsZW5ndGgnKSxcbiAqICAgICAgICBSLnBpcGUoUi50YWtlKDEwKSwgUi5hcHBlbmQoJ+KApicpLCBSLmpvaW4oJycpKVxuICogICAgICApO1xuICogICAgICB0cnVuY2F0ZSgnMTIzNDUnKTsgICAgICAgICAvLz0+ICcxMjM0NSdcbiAqICAgICAgdHJ1bmNhdGUoJzAxMjM0NTY3ODlBQkMnKTsgLy89PiAnMDEyMzQ1Njc4OeKApidcbiAqL1xuXG52YXIgd2hlbiA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIHdoZW4ocHJlZCwgd2hlblRydWVGbiwgeCkge1xuICByZXR1cm4gcHJlZCh4KSA/IHdoZW5UcnVlRm4oeCkgOiB4O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHdoZW47IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vaW50ZXJuYWwvX2hhcy5qc1wiO1xuLyoqXG4gKiBUYWtlcyBhIHNwZWMgb2JqZWN0IGFuZCBhIHRlc3Qgb2JqZWN0OyByZXR1cm5zIHRydWUgaWYgdGhlIHRlc3Qgc2F0aXNmaWVzXG4gKiB0aGUgc3BlYy4gRWFjaCBvZiB0aGUgc3BlYydzIG93biBwcm9wZXJ0aWVzIG11c3QgYmUgYSBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gKiBFYWNoIHByZWRpY2F0ZSBpcyBhcHBsaWVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBvZiB0aGVcbiAqIHRlc3Qgb2JqZWN0LiBgd2hlcmVgIHJldHVybnMgdHJ1ZSBpZiBhbGwgdGhlIHByZWRpY2F0ZXMgcmV0dXJuIHRydWUsIGZhbHNlXG4gKiBvdGhlcndpc2UuXG4gKlxuICogYHdoZXJlYCBpcyB3ZWxsIHN1aXRlZCB0byBkZWNsYXJhdGl2ZWx5IGV4cHJlc3NpbmcgY29uc3RyYWludHMgZm9yIG90aGVyXG4gKiBmdW5jdGlvbnMgc3VjaCBhcyBbYGZpbHRlcmBdKCNmaWx0ZXIpIGFuZCBbYGZpbmRgXSgjZmluZCkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4xXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHtTdHJpbmc6ICgqIC0+IEJvb2xlYW4pfSAtPiB7U3RyaW5nOiAqfSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge09iamVjdH0gc3BlY1xuICogQHBhcmFtIHtPYmplY3R9IHRlc3RPYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAc2VlIFIucHJvcFNhdGlzZmllcywgUi53aGVyZUVxXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgLy8gcHJlZCA6OiBPYmplY3QgLT4gQm9vbGVhblxuICogICAgICBjb25zdCBwcmVkID0gUi53aGVyZSh7XG4gKiAgICAgICAgYTogUi5lcXVhbHMoJ2ZvbycpLFxuICogICAgICAgIGI6IFIuY29tcGxlbWVudChSLmVxdWFscygnYmFyJykpLFxuICogICAgICAgIHg6IFIuZ3QoUi5fXywgMTApLFxuICogICAgICAgIHk6IFIubHQoUi5fXywgMjApXG4gKiAgICAgIH0pO1xuICpcbiAqICAgICAgcHJlZCh7YTogJ2ZvbycsIGI6ICd4eHgnLCB4OiAxMSwgeTogMTl9KTsgLy89PiB0cnVlXG4gKiAgICAgIHByZWQoe2E6ICd4eHgnLCBiOiAneHh4JywgeDogMTEsIHk6IDE5fSk7IC8vPT4gZmFsc2VcbiAqICAgICAgcHJlZCh7YTogJ2ZvbycsIGI6ICdiYXInLCB4OiAxMSwgeTogMTl9KTsgLy89PiBmYWxzZVxuICogICAgICBwcmVkKHthOiAnZm9vJywgYjogJ3h4eCcsIHg6IDEwLCB5OiAxOX0pOyAvLz0+IGZhbHNlXG4gKiAgICAgIHByZWQoe2E6ICdmb28nLCBiOiAneHh4JywgeDogMTEsIHk6IDIwfSk7IC8vPT4gZmFsc2VcbiAqL1xuXG52YXIgd2hlcmUgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiB3aGVyZShzcGVjLCB0ZXN0T2JqKSB7XG4gIGZvciAodmFyIHByb3AgaW4gc3BlYykge1xuICAgIGlmIChfaGFzKHByb3AsIHNwZWMpICYmICFzcGVjW3Byb3BdKHRlc3RPYmpbcHJvcF0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgd2hlcmU7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vaW50ZXJuYWwvX2hhcy5qc1wiO1xuLyoqXG4gKiBUYWtlcyBhIHNwZWMgb2JqZWN0IGFuZCBhIHRlc3Qgb2JqZWN0OyBlYWNoIG9mIHRoZSBzcGVjJ3Mgb3duIHByb3BlcnRpZXMgbXVzdCBiZSBhIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqIEVhY2ggcHJlZGljYXRlIGlzIGFwcGxpZWQgdG8gdGhlIHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IG9mIHRoZVxuICogdGVzdCBvYmplY3QuIGB3aGVyZUFueWAgcmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgcHJlZGljYXRlcyByZXR1cm4gdHJ1ZSxcbiAqIGZhbHNlIG90aGVyd2lzZS5cbiAqXG4gKiBgd2hlcmVBbnlgIGlzIHdlbGwgc3VpdGVkIHRvIGRlY2xhcmF0aXZlbHkgZXhwcmVzc2luZyBjb25zdHJhaW50cyBmb3Igb3RoZXJcbiAqIGZ1bmN0aW9ucyBzdWNoIGFzIFtgZmlsdGVyYF0oI2ZpbHRlcikgYW5kIFtgZmluZGBdKCNmaW5kKS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHtTdHJpbmc6ICgqIC0+IEJvb2xlYW4pfSAtPiB7U3RyaW5nOiAqfSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge09iamVjdH0gc3BlY1xuICogQHBhcmFtIHtPYmplY3R9IHRlc3RPYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAc2VlIFIucHJvcFNhdGlzZmllcywgUi53aGVyZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIC8vIHByZWQgOjogT2JqZWN0IC0+IEJvb2xlYW5cbiAqICAgICAgY29uc3QgcHJlZCA9IFIud2hlcmVBbnkoe1xuICogICAgICAgIGE6IFIuZXF1YWxzKCdmb28nKSxcbiAqICAgICAgICBiOiBSLmNvbXBsZW1lbnQoUi5lcXVhbHMoJ3h4eCcpKSxcbiAqICAgICAgICB4OiBSLmd0KFIuX18sIDEwKSxcbiAqICAgICAgICB5OiBSLmx0KFIuX18sIDIwKVxuICogICAgICB9KTtcbiAqXG4gKiAgICAgIHByZWQoe2E6ICdmb28nLCBiOiAneHh4JywgeDogOCwgeTogMzR9KTsgLy89PiB0cnVlXG4gKiAgICAgIHByZWQoe2E6ICd4eHgnLCBiOiAneHh4JywgeDogOSwgeTogMjF9KTsgLy89PiBmYWxzZVxuICogICAgICBwcmVkKHthOiAnYmFyJywgYjogJ3h4eCcsIHg6IDEwLCB5OiAyMH0pOyAvLz0+IGZhbHNlXG4gKiAgICAgIHByZWQoe2E6ICdmb28nLCBiOiAnYmFyJywgeDogMTAsIHk6IDIwfSk7IC8vPT4gdHJ1ZVxuICogICAgICBwcmVkKHthOiAnZm9vJywgYjogJ3h4eCcsIHg6IDExLCB5OiAyMH0pOyAvLz0+IHRydWVcbiAqL1xuXG52YXIgd2hlcmVBbnkgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiB3aGVyZUFueShzcGVjLCB0ZXN0T2JqKSB7XG4gIGZvciAodmFyIHByb3AgaW4gc3BlYykge1xuICAgIGlmIChfaGFzKHByb3AsIHNwZWMpICYmIHNwZWNbcHJvcF0odGVzdE9ialtwcm9wXSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB3aGVyZUFueTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgZXF1YWxzIGZyb20gXCIuL2VxdWFscy5qc1wiO1xuaW1wb3J0IG1hcCBmcm9tIFwiLi9tYXAuanNcIjtcbmltcG9ydCB3aGVyZSBmcm9tIFwiLi93aGVyZS5qc1wiO1xuLyoqXG4gKiBUYWtlcyBhIHNwZWMgb2JqZWN0IGFuZCBhIHRlc3Qgb2JqZWN0OyByZXR1cm5zIHRydWUgaWYgdGhlIHRlc3Qgc2F0aXNmaWVzXG4gKiB0aGUgc3BlYywgZmFsc2Ugb3RoZXJ3aXNlLiBBbiBvYmplY3Qgc2F0aXNmaWVzIHRoZSBzcGVjIGlmLCBmb3IgZWFjaCBvZiB0aGVcbiAqIHNwZWMncyBvd24gcHJvcGVydGllcywgYWNjZXNzaW5nIHRoYXQgcHJvcGVydHkgb2YgdGhlIG9iamVjdCBnaXZlcyB0aGUgc2FtZVxuICogdmFsdWUgKGluIFtgUi5lcXVhbHNgXSgjZXF1YWxzKSB0ZXJtcykgYXMgYWNjZXNzaW5nIHRoYXQgcHJvcGVydHkgb2YgdGhlXG4gKiBzcGVjLlxuICpcbiAqIGB3aGVyZUVxYCBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIFtgd2hlcmVgXSgjd2hlcmUpLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE0LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcge1N0cmluZzogKn0gLT4ge1N0cmluZzogKn0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtPYmplY3R9IHNwZWNcbiAqIEBwYXJhbSB7T2JqZWN0fSB0ZXN0T2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHNlZSBSLnByb3BFcSwgUi53aGVyZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIC8vIHByZWQgOjogT2JqZWN0IC0+IEJvb2xlYW5cbiAqICAgICAgY29uc3QgcHJlZCA9IFIud2hlcmVFcSh7YTogMSwgYjogMn0pO1xuICpcbiAqICAgICAgcHJlZCh7YTogMX0pOyAgICAgICAgICAgICAgLy89PiBmYWxzZVxuICogICAgICBwcmVkKHthOiAxLCBiOiAyfSk7ICAgICAgICAvLz0+IHRydWVcbiAqICAgICAgcHJlZCh7YTogMSwgYjogMiwgYzogM30pOyAgLy89PiB0cnVlXG4gKiAgICAgIHByZWQoe2E6IDEsIGI6IDF9KTsgICAgICAgIC8vPT4gZmFsc2VcbiAqL1xuXG52YXIgd2hlcmVFcSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIHdoZXJlRXEoc3BlYywgdGVzdE9iaikge1xuICByZXR1cm4gd2hlcmUobWFwKGVxdWFscywgc3BlYyksIHRlc3RPYmopO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHdoZXJlRXE7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9TZXQgZnJvbSBcIi4vaW50ZXJuYWwvX1NldC5qc1wiO1xuaW1wb3J0IHJlamVjdCBmcm9tIFwiLi9yZWplY3QuanNcIjtcbi8qKlxuICogUmV0dXJucyBhIG5ldyBsaXN0IHdpdGhvdXQgdmFsdWVzIGluIHRoZSBmaXJzdCBhcmd1bWVudC5cbiAqIFtgUi5lcXVhbHNgXSgjZXF1YWxzKSBpcyB1c2VkIHRvIGRldGVybWluZSBlcXVhbGl0eS5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QxIFRoZSB2YWx1ZXMgdG8gYmUgcmVtb3ZlZCBmcm9tIGBsaXN0MmAuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MiBUaGUgYXJyYXkgdG8gcmVtb3ZlIHZhbHVlcyBmcm9tLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBuZXcgYXJyYXkgd2l0aG91dCB2YWx1ZXMgaW4gYGxpc3QxYC5cbiAqIEBzZWUgUi50cmFuc2R1Y2UsIFIuZGlmZmVyZW5jZSwgUi5yZW1vdmVcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLndpdGhvdXQoWzEsIDJdLCBbMSwgMiwgMSwgMywgNF0pOyAvLz0+IFszLCA0XVxuICovXG5cbnZhciB3aXRob3V0ID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gd2l0aG91dCh4cywgbGlzdCkge1xuICB2YXIgdG9SZW1vdmUgPSBuZXcgX1NldCgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0b1JlbW92ZS5hZGQoeHNbaV0pO1xuICB9XG5cbiAgcmV0dXJuIHJlamVjdCh0b1JlbW92ZS5oYXMuYmluZCh0b1JlbW92ZSksIGxpc3QpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhvdXQ7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBFeGNsdXNpdmUgZGlzanVuY3Rpb24gbG9naWNhbCBvcGVyYXRpb24uXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBvbmUgb2YgdGhlIGFyZ3VtZW50cyBpcyB0cnV0aHkgYW5kIHRoZSBvdGhlciBpcyBmYWxzeS5cbiAqIE90aGVyd2lzZSwgaXQgcmV0dXJucyBgZmFsc2VgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI3LjFcbiAqIEBjYXRlZ29yeSBMb2dpY1xuICogQHNpZyBhIC0+IGIgLT4gQm9vbGVhblxuICogQHBhcmFtIHtBbnl9IGFcbiAqIEBwYXJhbSB7QW55fSBiXG4gKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIG9uZSBvZiB0aGUgYXJndW1lbnRzIGlzIHRydXRoeSBhbmQgdGhlIG90aGVyIGlzIGZhbHN5XG4gKiBAc2VlIFIub3IsIFIuYW5kXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi54b3IodHJ1ZSwgdHJ1ZSk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi54b3IodHJ1ZSwgZmFsc2UpOyAvLz0+IHRydWVcbiAqICAgICAgUi54b3IoZmFsc2UsIHRydWUpOyAvLz0+IHRydWVcbiAqICAgICAgUi54b3IoZmFsc2UsIGZhbHNlKTsgLy89PiBmYWxzZVxuICovXG5cbnZhciB4b3IgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiB4b3IoYSwgYikge1xuICByZXR1cm4gQm9vbGVhbighYSBeICFiKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB4b3I7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGxpc3Qgb3V0IG9mIHRoZSB0d28gc3VwcGxpZWQgYnkgY3JlYXRpbmcgZWFjaCBwb3NzaWJsZSBwYWlyXG4gKiBmcm9tIHRoZSBsaXN0cy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBbYl0gLT4gW1thLGJdXVxuICogQHBhcmFtIHtBcnJheX0gYXMgVGhlIGZpcnN0IGxpc3QuXG4gKiBAcGFyYW0ge0FycmF5fSBicyBUaGUgc2Vjb25kIGxpc3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGxpc3QgbWFkZSBieSBjb21iaW5pbmcgZWFjaCBwb3NzaWJsZSBwYWlyIGZyb21cbiAqICAgICAgICAgYGFzYCBhbmQgYGJzYCBpbnRvIHBhaXJzIChgW2EsIGJdYCkuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi54cHJvZChbMSwgMl0sIFsnYScsICdiJ10pOyAvLz0+IFtbMSwgJ2EnXSwgWzEsICdiJ10sIFsyLCAnYSddLCBbMiwgJ2InXV1cbiAqIEBzeW1iIFIueHByb2QoW2EsIGJdLCBbYywgZF0pID0gW1thLCBjXSwgW2EsIGRdLCBbYiwgY10sIFtiLCBkXV1cbiAqL1xuXG52YXIgeHByb2QgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiB4cHJvZChhLCBiKSB7XG4gIC8vID0geHByb2RXaXRoKHByZXBlbmQpOyAodGFrZXMgYWJvdXQgMyB0aW1lcyBhcyBsb25nLi4uKVxuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGlsZW4gPSBhLmxlbmd0aDtcbiAgdmFyIGo7XG4gIHZhciBqbGVuID0gYi5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSBbXTtcblxuICB3aGlsZSAoaWR4IDwgaWxlbikge1xuICAgIGogPSAwO1xuXG4gICAgd2hpbGUgKGogPCBqbGVuKSB7XG4gICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBbYVtpZHhdLCBiW2pdXTtcbiAgICAgIGogKz0gMTtcbiAgICB9XG5cbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgeHByb2Q7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGxpc3Qgb3V0IG9mIHRoZSB0d28gc3VwcGxpZWQgYnkgcGFpcmluZyB1cCBlcXVhbGx5LXBvc2l0aW9uZWRcbiAqIGl0ZW1zIGZyb20gYm90aCBsaXN0cy4gVGhlIHJldHVybmVkIGxpc3QgaXMgdHJ1bmNhdGVkIHRvIHRoZSBsZW5ndGggb2YgdGhlXG4gKiBzaG9ydGVyIG9mIHRoZSB0d28gaW5wdXQgbGlzdHMuXG4gKiBOb3RlOiBgemlwYCBpcyBlcXVpdmFsZW50IHRvIGB6aXBXaXRoKGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIFthLCBiXSB9KWAuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2JdIC0+IFtbYSxiXV1cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QxIFRoZSBmaXJzdCBhcnJheSB0byBjb25zaWRlci5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QyIFRoZSBzZWNvbmQgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGxpc3QgbWFkZSBieSBwYWlyaW5nIHVwIHNhbWUtaW5kZXhlZCBlbGVtZW50cyBvZiBgbGlzdDFgIGFuZCBgbGlzdDJgLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuemlwKFsxLCAyLCAzXSwgWydhJywgJ2InLCAnYyddKTsgLy89PiBbWzEsICdhJ10sIFsyLCAnYiddLCBbMywgJ2MnXV1cbiAqIEBzeW1iIFIuemlwKFthLCBiLCBjXSwgW2QsIGUsIGZdKSA9IFtbYSwgZF0sIFtiLCBlXSwgW2MsIGZdXVxuICovXG5cbnZhciB6aXAgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiB6aXAoYSwgYikge1xuICB2YXIgcnYgPSBbXTtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpO1xuXG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBydltpZHhdID0gW2FbaWR4XSwgYltpZHhdXTtcbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiBydjtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB6aXA7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG9iamVjdCBvdXQgb2YgYSBsaXN0IG9mIGtleXMgYW5kIGEgbGlzdCBvZiB2YWx1ZXMuXG4gKiBLZXkvdmFsdWUgcGFpcmluZyBpcyB0cnVuY2F0ZWQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc2hvcnRlciBvZiB0aGUgdHdvIGxpc3RzLlxuICogTm90ZTogYHppcE9iamAgaXMgZXF1aXZhbGVudCB0byBgcGlwZSh6aXAsIGZyb21QYWlycylgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjMuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW1N0cmluZ10gLT4gWypdIC0+IHtTdHJpbmc6ICp9XG4gKiBAcGFyYW0ge0FycmF5fSBrZXlzIFRoZSBhcnJheSB0aGF0IHdpbGwgYmUgcHJvcGVydGllcyBvbiB0aGUgb3V0cHV0IG9iamVjdC5cbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgbGlzdCBvZiB2YWx1ZXMgb24gdGhlIG91dHB1dCBvYmplY3QuXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBvYmplY3QgbWFkZSBieSBwYWlyaW5nIHVwIHNhbWUtaW5kZXhlZCBlbGVtZW50cyBvZiBga2V5c2AgYW5kIGB2YWx1ZXNgLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuemlwT2JqKFsnYScsICdiJywgJ2MnXSwgWzEsIDIsIDNdKTsgLy89PiB7YTogMSwgYjogMiwgYzogM31cbiAqL1xuXG52YXIgemlwT2JqID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gemlwT2JqKGtleXMsIHZhbHVlcykge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IE1hdGgubWluKGtleXMubGVuZ3RoLCB2YWx1ZXMubGVuZ3RoKTtcbiAgdmFyIG91dCA9IHt9O1xuXG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBvdXRba2V5c1tpZHhdXSA9IHZhbHVlc1tpZHhdO1xuICAgIGlkeCArPSAxO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB6aXBPYmo7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGxpc3Qgb3V0IG9mIHRoZSB0d28gc3VwcGxpZWQgYnkgYXBwbHlpbmcgdGhlIGZ1bmN0aW9uIHRvIGVhY2hcbiAqIGVxdWFsbHktcG9zaXRpb25lZCBwYWlyIGluIHRoZSBsaXN0cy4gVGhlIHJldHVybmVkIGxpc3QgaXMgdHJ1bmNhdGVkIHRvIHRoZVxuICogbGVuZ3RoIG9mIHRoZSBzaG9ydGVyIG9mIHRoZSB0d28gaW5wdXQgbGlzdHMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKChhLCBiKSAtPiBjKSAtPiBbYV0gLT4gW2JdIC0+IFtjXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHVzZWQgdG8gY29tYmluZSB0aGUgdHdvIGVsZW1lbnRzIGludG8gb25lIHZhbHVlLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdDEgVGhlIGZpcnN0IGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdDIgVGhlIHNlY29uZCBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgbGlzdCBtYWRlIGJ5IGNvbWJpbmluZyBzYW1lLWluZGV4ZWQgZWxlbWVudHMgb2YgYGxpc3QxYCBhbmQgYGxpc3QyYFxuICogICAgICAgICB1c2luZyBgZm5gLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGYgPSAoeCwgeSkgPT4ge1xuICogICAgICAgIC8vIC4uLlxuICogICAgICB9O1xuICogICAgICBSLnppcFdpdGgoZiwgWzEsIDIsIDNdLCBbJ2EnLCAnYicsICdjJ10pO1xuICogICAgICAvLz0+IFtmKDEsICdhJyksIGYoMiwgJ2InKSwgZigzLCAnYycpXVxuICogQHN5bWIgUi56aXBXaXRoKGZuLCBbYSwgYiwgY10sIFtkLCBlLCBmXSkgPSBbZm4oYSwgZCksIGZuKGIsIGUpLCBmbihjLCBmKV1cbiAqL1xuXG52YXIgemlwV2l0aCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIHppcFdpdGgoZm4sIGEsIGIpIHtcbiAgdmFyIHJ2ID0gW107XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKTtcblxuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgcnZbaWR4XSA9IGZuKGFbaWR4XSwgYltpZHhdKTtcbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiBydjtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB6aXBXaXRoOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdGxvYWRlZDogZmFsc2UsXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0ZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG5cdFx0ZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGU7IH07XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBkZWZpbml0aW9uKSB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqLCBwcm9wKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTsgfSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSBmdW5jdGlvbihtb2R1bGUpIHtcblx0bW9kdWxlLnBhdGhzID0gW107XG5cdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0cmV0dXJuIG1vZHVsZTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5uYyA9IHVuZGVmaW5lZDsiLCJ2YXIgZ2xvYmFsID1cbiAgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWxUaGlzKSB8fFxuICAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYpIHx8XG4gICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWwpXG5cbnZhciBzdXBwb3J0ID0ge1xuICBzZWFyY2hQYXJhbXM6ICdVUkxTZWFyY2hQYXJhbXMnIGluIGdsb2JhbCxcbiAgaXRlcmFibGU6ICdTeW1ib2wnIGluIGdsb2JhbCAmJiAnaXRlcmF0b3InIGluIFN5bWJvbCxcbiAgYmxvYjpcbiAgICAnRmlsZVJlYWRlcicgaW4gZ2xvYmFsICYmXG4gICAgJ0Jsb2InIGluIGdsb2JhbCAmJlxuICAgIChmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBCbG9iKClcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSkoKSxcbiAgZm9ybURhdGE6ICdGb3JtRGF0YScgaW4gZ2xvYmFsLFxuICBhcnJheUJ1ZmZlcjogJ0FycmF5QnVmZmVyJyBpbiBnbG9iYWxcbn1cblxuZnVuY3Rpb24gaXNEYXRhVmlldyhvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBEYXRhVmlldy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvYmopXG59XG5cbmlmIChzdXBwb3J0LmFycmF5QnVmZmVyKSB7XG4gIHZhciB2aWV3Q2xhc3NlcyA9IFtcbiAgICAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBGbG9hdDY0QXJyYXldJ1xuICBdXG5cbiAgdmFyIGlzQXJyYXlCdWZmZXJWaWV3ID1cbiAgICBBcnJheUJ1ZmZlci5pc1ZpZXcgfHxcbiAgICBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdmlld0NsYXNzZXMuaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSkgPiAtMVxuICAgIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmFtZShuYW1lKSB7XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICBuYW1lID0gU3RyaW5nKG5hbWUpXG4gIH1cbiAgaWYgKC9bXmEtejAtOVxcLSMkJSYnKisuXl9gfH4hXS9pLnRlc3QobmFtZSkgfHwgbmFtZSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGNoYXJhY3RlciBpbiBoZWFkZXIgZmllbGQgbmFtZTogXCInICsgbmFtZSArICdcIicpXG4gIH1cbiAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgIHZhbHVlID0gU3RyaW5nKHZhbHVlKVxuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG4vLyBCdWlsZCBhIGRlc3RydWN0aXZlIGl0ZXJhdG9yIGZvciB0aGUgdmFsdWUgbGlzdFxuZnVuY3Rpb24gaXRlcmF0b3JGb3IoaXRlbXMpIHtcbiAgdmFyIGl0ZXJhdG9yID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHZhbHVlID0gaXRlbXMuc2hpZnQoKVxuICAgICAgcmV0dXJuIHtkb25lOiB2YWx1ZSA9PT0gdW5kZWZpbmVkLCB2YWx1ZTogdmFsdWV9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuaXRlcmFibGUpIHtcbiAgICBpdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gaXRlcmF0b3JcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXRlcmF0b3Jcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEhlYWRlcnMoaGVhZGVycykge1xuICB0aGlzLm1hcCA9IHt9XG5cbiAgaWYgKGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICB0aGlzLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICB9LCB0aGlzKVxuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVycykpIHtcbiAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24oaGVhZGVyKSB7XG4gICAgICB0aGlzLmFwcGVuZChoZWFkZXJbMF0sIGhlYWRlclsxXSlcbiAgICB9LCB0aGlzKVxuICB9IGVsc2UgaWYgKGhlYWRlcnMpIHtcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhoZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIHRoaXMuYXBwZW5kKG5hbWUsIGhlYWRlcnNbbmFtZV0pXG4gICAgfSwgdGhpcylcbiAgfVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICBuYW1lID0gbm9ybWFsaXplTmFtZShuYW1lKVxuICB2YWx1ZSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKVxuICB2YXIgb2xkVmFsdWUgPSB0aGlzLm1hcFtuYW1lXVxuICB0aGlzLm1hcFtuYW1lXSA9IG9sZFZhbHVlID8gb2xkVmFsdWUgKyAnLCAnICsgdmFsdWUgOiB2YWx1ZVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBmdW5jdGlvbihuYW1lKSB7XG4gIGRlbGV0ZSB0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihuYW1lKSB7XG4gIG5hbWUgPSBub3JtYWxpemVOYW1lKG5hbWUpXG4gIHJldHVybiB0aGlzLmhhcyhuYW1lKSA/IHRoaXMubWFwW25hbWVdIDogbnVsbFxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbihuYW1lKSB7XG4gIHJldHVybiB0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShub3JtYWxpemVOYW1lKG5hbWUpKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24oY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgZm9yICh2YXIgbmFtZSBpbiB0aGlzLm1hcCkge1xuICAgIGlmICh0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCB0aGlzLm1hcFtuYW1lXSwgbmFtZSwgdGhpcylcbiAgICB9XG4gIH1cbn1cblxuSGVhZGVycy5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaXRlbXMgPSBbXVxuICB0aGlzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICBpdGVtcy5wdXNoKG5hbWUpXG4gIH0pXG4gIHJldHVybiBpdGVyYXRvckZvcihpdGVtcylcbn1cblxuSGVhZGVycy5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IFtdXG4gIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgIGl0ZW1zLnB1c2godmFsdWUpXG4gIH0pXG4gIHJldHVybiBpdGVyYXRvckZvcihpdGVtcylcbn1cblxuSGVhZGVycy5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaXRlbXMgPSBbXVxuICB0aGlzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICBpdGVtcy5wdXNoKFtuYW1lLCB2YWx1ZV0pXG4gIH0pXG4gIHJldHVybiBpdGVyYXRvckZvcihpdGVtcylcbn1cblxuaWYgKHN1cHBvcnQuaXRlcmFibGUpIHtcbiAgSGVhZGVycy5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IEhlYWRlcnMucHJvdG90eXBlLmVudHJpZXNcbn1cblxuZnVuY3Rpb24gY29uc3VtZWQoYm9keSkge1xuICBpZiAoYm9keS5ib2R5VXNlZCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKCdBbHJlYWR5IHJlYWQnKSlcbiAgfVxuICBib2R5LmJvZHlVc2VkID0gdHJ1ZVxufVxuXG5mdW5jdGlvbiBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXNvbHZlKHJlYWRlci5yZXN1bHQpXG4gICAgfVxuICAgIHJlYWRlci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZWplY3QocmVhZGVyLmVycm9yKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2JBc0FycmF5QnVmZmVyKGJsb2IpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKClcbiAgdmFyIHByb21pc2UgPSBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKVxuICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYilcbiAgcmV0dXJuIHByb21pc2Vcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2JBc1RleHQoYmxvYikge1xuICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICB2YXIgcHJvbWlzZSA9IGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpXG4gIHJlYWRlci5yZWFkQXNUZXh0KGJsb2IpXG4gIHJldHVybiBwcm9taXNlXG59XG5cbmZ1bmN0aW9uIHJlYWRBcnJheUJ1ZmZlckFzVGV4dChidWYpIHtcbiAgdmFyIHZpZXcgPSBuZXcgVWludDhBcnJheShidWYpXG4gIHZhciBjaGFycyA9IG5ldyBBcnJheSh2aWV3Lmxlbmd0aClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXcubGVuZ3RoOyBpKyspIHtcbiAgICBjaGFyc1tpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUodmlld1tpXSlcbiAgfVxuICByZXR1cm4gY2hhcnMuam9pbignJylcbn1cblxuZnVuY3Rpb24gYnVmZmVyQ2xvbmUoYnVmKSB7XG4gIGlmIChidWYuc2xpY2UpIHtcbiAgICByZXR1cm4gYnVmLnNsaWNlKDApXG4gIH0gZWxzZSB7XG4gICAgdmFyIHZpZXcgPSBuZXcgVWludDhBcnJheShidWYuYnl0ZUxlbmd0aClcbiAgICB2aWV3LnNldChuZXcgVWludDhBcnJheShidWYpKVxuICAgIHJldHVybiB2aWV3LmJ1ZmZlclxuICB9XG59XG5cbmZ1bmN0aW9uIEJvZHkoKSB7XG4gIHRoaXMuYm9keVVzZWQgPSBmYWxzZVxuXG4gIHRoaXMuX2luaXRCb2R5ID0gZnVuY3Rpb24oYm9keSkge1xuICAgIC8qXG4gICAgICBmZXRjaC1tb2NrIHdyYXBzIHRoZSBSZXNwb25zZSBvYmplY3QgaW4gYW4gRVM2IFByb3h5IHRvXG4gICAgICBwcm92aWRlIHVzZWZ1bCB0ZXN0IGhhcm5lc3MgZmVhdHVyZXMgc3VjaCBhcyBmbHVzaC4gSG93ZXZlciwgb25cbiAgICAgIEVTNSBicm93c2VycyB3aXRob3V0IGZldGNoIG9yIFByb3h5IHN1cHBvcnQgcG9sbHlmaWxscyBtdXN0IGJlIHVzZWQ7XG4gICAgICB0aGUgcHJveHktcG9sbHlmaWxsIGlzIHVuYWJsZSB0byBwcm94eSBhbiBhdHRyaWJ1dGUgdW5sZXNzIGl0IGV4aXN0c1xuICAgICAgb24gdGhlIG9iamVjdCBiZWZvcmUgdGhlIFByb3h5IGlzIGNyZWF0ZWQuIFRoaXMgY2hhbmdlIGVuc3VyZXNcbiAgICAgIFJlc3BvbnNlLmJvZHlVc2VkIGV4aXN0cyBvbiB0aGUgaW5zdGFuY2UsIHdoaWxlIG1haW50YWluaW5nIHRoZVxuICAgICAgc2VtYW50aWMgb2Ygc2V0dGluZyBSZXF1ZXN0LmJvZHlVc2VkIGluIHRoZSBjb25zdHJ1Y3RvciBiZWZvcmVcbiAgICAgIF9pbml0Qm9keSBpcyBjYWxsZWQuXG4gICAgKi9cbiAgICB0aGlzLmJvZHlVc2VkID0gdGhpcy5ib2R5VXNlZFxuICAgIHRoaXMuX2JvZHlJbml0ID0gYm9keVxuICAgIGlmICghYm9keSkge1xuICAgICAgdGhpcy5fYm9keVRleHQgPSAnJ1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYmxvYiAmJiBCbG9iLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICB0aGlzLl9ib2R5QmxvYiA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuZm9ybURhdGEgJiYgRm9ybURhdGEucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlGb3JtRGF0YSA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuc2VhcmNoUGFyYW1zICYmIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5LnRvU3RyaW5nKClcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIgJiYgc3VwcG9ydC5ibG9iICYmIGlzRGF0YVZpZXcoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkuYnVmZmVyKVxuICAgICAgLy8gSUUgMTAtMTEgY2FuJ3QgaGFuZGxlIGEgRGF0YVZpZXcgYm9keS5cbiAgICAgIHRoaXMuX2JvZHlJbml0ID0gbmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pXG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyICYmIChBcnJheUJ1ZmZlci5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSB8fCBpc0FycmF5QnVmZmVyVmlldyhib2R5KSkpIHtcbiAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChib2R5KVxuICAgIH1cblxuICAgIGlmICghdGhpcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpIHtcbiAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ3RleHQvcGxhaW47Y2hhcnNldD1VVEYtOCcpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlCbG9iICYmIHRoaXMuX2JvZHlCbG9iLnR5cGUpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgdGhpcy5fYm9keUJsb2IudHlwZSlcbiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5zZWFyY2hQYXJhbXMgJiYgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCcpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuYmxvYikge1xuICAgIHRoaXMuYmxvYiA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0ZWRcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2JvZHlCbG9iKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUJsb2IpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKSlcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyBibG9iJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlUZXh0XSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5hcnJheUJ1ZmZlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgICB2YXIgaXNDb25zdW1lZCA9IGNvbnN1bWVkKHRoaXMpXG4gICAgICAgIGlmIChpc0NvbnN1bWVkKSB7XG4gICAgICAgICAgcmV0dXJuIGlzQ29uc3VtZWRcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ1ZmZlci5zbGljZShcbiAgICAgICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ5dGVPZmZzZXQsXG4gICAgICAgICAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlci5ieXRlT2Zmc2V0ICsgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ5dGVMZW5ndGhcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJsb2IoKS50aGVuKHJlYWRCbG9iQXNBcnJheUJ1ZmZlcilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0aGlzLnRleHQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVqZWN0ZWQgPSBjb25zdW1lZCh0aGlzKVxuICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHJlamVjdGVkXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2JvZHlCbG9iKSB7XG4gICAgICByZXR1cm4gcmVhZEJsb2JBc1RleHQodGhpcy5fYm9keUJsb2IpXG4gICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVhZEFycmF5QnVmZmVyQXNUZXh0KHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikpXG4gICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5Rm9ybURhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyB0ZXh0JylcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5VGV4dClcbiAgICB9XG4gIH1cblxuICBpZiAoc3VwcG9ydC5mb3JtRGF0YSkge1xuICAgIHRoaXMuZm9ybURhdGEgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHQoKS50aGVuKGRlY29kZSlcbiAgICB9XG4gIH1cblxuICB0aGlzLmpzb24gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihKU09OLnBhcnNlKVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSFRUUCBtZXRob2RzIHdob3NlIGNhcGl0YWxpemF0aW9uIHNob3VsZCBiZSBub3JtYWxpemVkXG52YXIgbWV0aG9kcyA9IFsnREVMRVRFJywgJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnLCAnUE9TVCcsICdQVVQnXVxuXG5mdW5jdGlvbiBub3JtYWxpemVNZXRob2QobWV0aG9kKSB7XG4gIHZhciB1cGNhc2VkID0gbWV0aG9kLnRvVXBwZXJDYXNlKClcbiAgcmV0dXJuIG1ldGhvZHMuaW5kZXhPZih1cGNhc2VkKSA+IC0xID8gdXBjYXNlZCA6IG1ldGhvZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gUmVxdWVzdChpbnB1dCwgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVxdWVzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQbGVhc2UgdXNlIHRoZSBcIm5ld1wiIG9wZXJhdG9yLCB0aGlzIERPTSBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLicpXG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keVxuXG4gIGlmIChpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICBpZiAoaW5wdXQuYm9keVVzZWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpXG4gICAgfVxuICAgIHRoaXMudXJsID0gaW5wdXQudXJsXG4gICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzXG4gICAgaWYgKCFvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKGlucHV0LmhlYWRlcnMpXG4gICAgfVxuICAgIHRoaXMubWV0aG9kID0gaW5wdXQubWV0aG9kXG4gICAgdGhpcy5tb2RlID0gaW5wdXQubW9kZVxuICAgIHRoaXMuc2lnbmFsID0gaW5wdXQuc2lnbmFsXG4gICAgaWYgKCFib2R5ICYmIGlucHV0Ll9ib2R5SW5pdCAhPSBudWxsKSB7XG4gICAgICBib2R5ID0gaW5wdXQuX2JvZHlJbml0XG4gICAgICBpbnB1dC5ib2R5VXNlZCA9IHRydWVcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy51cmwgPSBTdHJpbmcoaW5wdXQpXG4gIH1cblxuICB0aGlzLmNyZWRlbnRpYWxzID0gb3B0aW9ucy5jcmVkZW50aWFscyB8fCB0aGlzLmNyZWRlbnRpYWxzIHx8ICdzYW1lLW9yaWdpbidcbiAgaWYgKG9wdGlvbnMuaGVhZGVycyB8fCAhdGhpcy5oZWFkZXJzKSB7XG4gICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKVxuICB9XG4gIHRoaXMubWV0aG9kID0gbm9ybWFsaXplTWV0aG9kKG9wdGlvbnMubWV0aG9kIHx8IHRoaXMubWV0aG9kIHx8ICdHRVQnKVxuICB0aGlzLm1vZGUgPSBvcHRpb25zLm1vZGUgfHwgdGhpcy5tb2RlIHx8IG51bGxcbiAgdGhpcy5zaWduYWwgPSBvcHRpb25zLnNpZ25hbCB8fCB0aGlzLnNpZ25hbFxuICB0aGlzLnJlZmVycmVyID0gbnVsbFxuXG4gIGlmICgodGhpcy5tZXRob2QgPT09ICdHRVQnIHx8IHRoaXMubWV0aG9kID09PSAnSEVBRCcpICYmIGJvZHkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb2R5IG5vdCBhbGxvd2VkIGZvciBHRVQgb3IgSEVBRCByZXF1ZXN0cycpXG4gIH1cbiAgdGhpcy5faW5pdEJvZHkoYm9keSlcblxuICBpZiAodGhpcy5tZXRob2QgPT09ICdHRVQnIHx8IHRoaXMubWV0aG9kID09PSAnSEVBRCcpIHtcbiAgICBpZiAob3B0aW9ucy5jYWNoZSA9PT0gJ25vLXN0b3JlJyB8fCBvcHRpb25zLmNhY2hlID09PSAnbm8tY2FjaGUnKSB7XG4gICAgICAvLyBTZWFyY2ggZm9yIGEgJ18nIHBhcmFtZXRlciBpbiB0aGUgcXVlcnkgc3RyaW5nXG4gICAgICB2YXIgcmVQYXJhbVNlYXJjaCA9IC8oWz8mXSlfPVteJl0qL1xuICAgICAgaWYgKHJlUGFyYW1TZWFyY2gudGVzdCh0aGlzLnVybCkpIHtcbiAgICAgICAgLy8gSWYgaXQgYWxyZWFkeSBleGlzdHMgdGhlbiBzZXQgdGhlIHZhbHVlIHdpdGggdGhlIGN1cnJlbnQgdGltZVxuICAgICAgICB0aGlzLnVybCA9IHRoaXMudXJsLnJlcGxhY2UocmVQYXJhbVNlYXJjaCwgJyQxXz0nICsgbmV3IERhdGUoKS5nZXRUaW1lKCkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBPdGhlcndpc2UgYWRkIGEgbmV3ICdfJyBwYXJhbWV0ZXIgdG8gdGhlIGVuZCB3aXRoIHRoZSBjdXJyZW50IHRpbWVcbiAgICAgICAgdmFyIHJlUXVlcnlTdHJpbmcgPSAvXFw/L1xuICAgICAgICB0aGlzLnVybCArPSAocmVRdWVyeVN0cmluZy50ZXN0KHRoaXMudXJsKSA/ICcmJyA6ICc/JykgKyAnXz0nICsgbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuUmVxdWVzdC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBSZXF1ZXN0KHRoaXMsIHtib2R5OiB0aGlzLl9ib2R5SW5pdH0pXG59XG5cbmZ1bmN0aW9uIGRlY29kZShib2R5KSB7XG4gIHZhciBmb3JtID0gbmV3IEZvcm1EYXRhKClcbiAgYm9keVxuICAgIC50cmltKClcbiAgICAuc3BsaXQoJyYnKVxuICAgIC5mb3JFYWNoKGZ1bmN0aW9uKGJ5dGVzKSB7XG4gICAgICBpZiAoYnl0ZXMpIHtcbiAgICAgICAgdmFyIHNwbGl0ID0gYnl0ZXMuc3BsaXQoJz0nKVxuICAgICAgICB2YXIgbmFtZSA9IHNwbGl0LnNoaWZ0KCkucmVwbGFjZSgvXFwrL2csICcgJylcbiAgICAgICAgdmFyIHZhbHVlID0gc3BsaXQuam9pbignPScpLnJlcGxhY2UoL1xcKy9nLCAnICcpXG4gICAgICAgIGZvcm0uYXBwZW5kKGRlY29kZVVSSUNvbXBvbmVudChuYW1lKSwgZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSlcbiAgICAgIH1cbiAgICB9KVxuICByZXR1cm4gZm9ybVxufVxuXG5mdW5jdGlvbiBwYXJzZUhlYWRlcnMocmF3SGVhZGVycykge1xuICB2YXIgaGVhZGVycyA9IG5ldyBIZWFkZXJzKClcbiAgLy8gUmVwbGFjZSBpbnN0YW5jZXMgb2YgXFxyXFxuIGFuZCBcXG4gZm9sbG93ZWQgYnkgYXQgbGVhc3Qgb25lIHNwYWNlIG9yIGhvcml6b250YWwgdGFiIHdpdGggYSBzcGFjZVxuICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMlxuICB2YXIgcHJlUHJvY2Vzc2VkSGVhZGVycyA9IHJhd0hlYWRlcnMucmVwbGFjZSgvXFxyP1xcbltcXHQgXSsvZywgJyAnKVxuICAvLyBBdm9pZGluZyBzcGxpdCB2aWEgcmVnZXggdG8gd29yayBhcm91bmQgYSBjb21tb24gSUUxMSBidWcgd2l0aCB0aGUgY29yZS1qcyAzLjYuMCByZWdleCBwb2x5ZmlsbFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ2l0aHViL2ZldGNoL2lzc3Vlcy83NDhcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzc1MVxuICBwcmVQcm9jZXNzZWRIZWFkZXJzXG4gICAgLnNwbGl0KCdcXHInKVxuICAgIC5tYXAoZnVuY3Rpb24oaGVhZGVyKSB7XG4gICAgICByZXR1cm4gaGVhZGVyLmluZGV4T2YoJ1xcbicpID09PSAwID8gaGVhZGVyLnN1YnN0cigxLCBoZWFkZXIubGVuZ3RoKSA6IGhlYWRlclxuICAgIH0pXG4gICAgLmZvckVhY2goZnVuY3Rpb24obGluZSkge1xuICAgICAgdmFyIHBhcnRzID0gbGluZS5zcGxpdCgnOicpXG4gICAgICB2YXIga2V5ID0gcGFydHMuc2hpZnQoKS50cmltKClcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gcGFydHMuam9pbignOicpLnRyaW0oKVxuICAgICAgICBoZWFkZXJzLmFwcGVuZChrZXksIHZhbHVlKVxuICAgICAgfVxuICAgIH0pXG4gIHJldHVybiBoZWFkZXJzXG59XG5cbkJvZHkuY2FsbChSZXF1ZXN0LnByb3RvdHlwZSlcblxuZXhwb3J0IGZ1bmN0aW9uIFJlc3BvbnNlKGJvZHlJbml0LCBvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZXNwb25zZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQbGVhc2UgdXNlIHRoZSBcIm5ld1wiIG9wZXJhdG9yLCB0aGlzIERPTSBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLicpXG4gIH1cbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9XG4gIH1cblxuICB0aGlzLnR5cGUgPSAnZGVmYXVsdCdcbiAgdGhpcy5zdGF0dXMgPSBvcHRpb25zLnN0YXR1cyA9PT0gdW5kZWZpbmVkID8gMjAwIDogb3B0aW9ucy5zdGF0dXNcbiAgdGhpcy5vayA9IHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDMwMFxuICB0aGlzLnN0YXR1c1RleHQgPSBvcHRpb25zLnN0YXR1c1RleHQgPT09IHVuZGVmaW5lZCA/ICcnIDogJycgKyBvcHRpb25zLnN0YXR1c1RleHRcbiAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKVxuICB0aGlzLnVybCA9IG9wdGlvbnMudXJsIHx8ICcnXG4gIHRoaXMuX2luaXRCb2R5KGJvZHlJbml0KVxufVxuXG5Cb2R5LmNhbGwoUmVzcG9uc2UucHJvdG90eXBlKVxuXG5SZXNwb25zZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBSZXNwb25zZSh0aGlzLl9ib2R5SW5pdCwge1xuICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgc3RhdHVzVGV4dDogdGhpcy5zdGF0dXNUZXh0LFxuICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHRoaXMuaGVhZGVycyksXG4gICAgdXJsOiB0aGlzLnVybFxuICB9KVxufVxuXG5SZXNwb25zZS5lcnJvciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UobnVsbCwge3N0YXR1czogMCwgc3RhdHVzVGV4dDogJyd9KVxuICByZXNwb25zZS50eXBlID0gJ2Vycm9yJ1xuICByZXR1cm4gcmVzcG9uc2Vcbn1cblxudmFyIHJlZGlyZWN0U3RhdHVzZXMgPSBbMzAxLCAzMDIsIDMwMywgMzA3LCAzMDhdXG5cblJlc3BvbnNlLnJlZGlyZWN0ID0gZnVuY3Rpb24odXJsLCBzdGF0dXMpIHtcbiAgaWYgKHJlZGlyZWN0U3RhdHVzZXMuaW5kZXhPZihzdGF0dXMpID09PSAtMSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHN0YXR1cyBjb2RlJylcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzcG9uc2UobnVsbCwge3N0YXR1czogc3RhdHVzLCBoZWFkZXJzOiB7bG9jYXRpb246IHVybH19KVxufVxuXG5leHBvcnQgdmFyIERPTUV4Y2VwdGlvbiA9IGdsb2JhbC5ET01FeGNlcHRpb25cbnRyeSB7XG4gIG5ldyBET01FeGNlcHRpb24oKVxufSBjYXRjaCAoZXJyKSB7XG4gIERPTUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UsIG5hbWUpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlXG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHZhciBlcnJvciA9IEVycm9yKG1lc3NhZ2UpXG4gICAgdGhpcy5zdGFjayA9IGVycm9yLnN0YWNrXG4gIH1cbiAgRE9NRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKVxuICBET01FeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRE9NRXhjZXB0aW9uXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaChpbnB1dCwgaW5pdCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgaW5pdClcblxuICAgIGlmIChyZXF1ZXN0LnNpZ25hbCAmJiByZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICByZXR1cm4gcmVqZWN0KG5ldyBET01FeGNlcHRpb24oJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpKVxuICAgIH1cblxuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuXG4gICAgZnVuY3Rpb24gYWJvcnRYaHIoKSB7XG4gICAgICB4aHIuYWJvcnQoKVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBzdGF0dXM6IHhoci5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHhoci5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiBwYXJzZUhlYWRlcnMoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpIHx8ICcnKVxuICAgICAgfVxuICAgICAgb3B0aW9ucy51cmwgPSAncmVzcG9uc2VVUkwnIGluIHhociA/IHhoci5yZXNwb25zZVVSTCA6IG9wdGlvbnMuaGVhZGVycy5nZXQoJ1gtUmVxdWVzdC1VUkwnKVxuICAgICAgdmFyIGJvZHkgPSAncmVzcG9uc2UnIGluIHhociA/IHhoci5yZXNwb25zZSA6IHhoci5yZXNwb25zZVRleHRcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKGJvZHksIG9wdGlvbnMpKVxuICAgICAgfSwgMClcbiAgICB9XG5cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQnKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQnKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChuZXcgRE9NRXhjZXB0aW9uKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZml4VXJsKHVybCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVybCA9PT0gJycgJiYgZ2xvYmFsLmxvY2F0aW9uLmhyZWYgPyBnbG9iYWwubG9jYXRpb24uaHJlZiA6IHVybFxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gdXJsXG4gICAgICB9XG4gICAgfVxuXG4gICAgeGhyLm9wZW4ocmVxdWVzdC5tZXRob2QsIGZpeFVybChyZXF1ZXN0LnVybCksIHRydWUpXG5cbiAgICBpZiAocmVxdWVzdC5jcmVkZW50aWFscyA9PT0gJ2luY2x1ZGUnKSB7XG4gICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAocmVxdWVzdC5jcmVkZW50aWFscyA9PT0gJ29taXQnKSB7XG4gICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoJ3Jlc3BvbnNlVHlwZScgaW4geGhyKSB7XG4gICAgICBpZiAoc3VwcG9ydC5ibG9iKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYmxvYidcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHN1cHBvcnQuYXJyYXlCdWZmZXIgJiZcbiAgICAgICAgcmVxdWVzdC5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykgJiZcbiAgICAgICAgcmVxdWVzdC5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykuaW5kZXhPZignYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJykgIT09IC0xXG4gICAgICApIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcidcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW5pdCAmJiB0eXBlb2YgaW5pdC5oZWFkZXJzID09PSAnb2JqZWN0JyAmJiAhKGluaXQuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpKSB7XG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpbml0LmhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCBub3JtYWxpemVWYWx1ZShpbml0LmhlYWRlcnNbbmFtZV0pKVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWVzdC5oZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0LnNpZ25hbCkge1xuICAgICAgcmVxdWVzdC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydFhocilcblxuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBET05FIChzdWNjZXNzIG9yIGZhaWx1cmUpXG4gICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgIHJlcXVlc3Quc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRYaHIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIuc2VuZCh0eXBlb2YgcmVxdWVzdC5fYm9keUluaXQgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IHJlcXVlc3QuX2JvZHlJbml0KVxuICB9KVxufVxuXG5mZXRjaC5wb2x5ZmlsbCA9IHRydWVcblxuaWYgKCFnbG9iYWwuZmV0Y2gpIHtcbiAgZ2xvYmFsLmZldGNoID0gZmV0Y2hcbiAgZ2xvYmFsLkhlYWRlcnMgPSBIZWFkZXJzXG4gIGdsb2JhbC5SZXF1ZXN0ID0gUmVxdWVzdFxuICBnbG9iYWwuUmVzcG9uc2UgPSBSZXNwb25zZVxufVxuIiwiaW1wb3J0IHtEYXNoUmVuZGVyZXJ9IGZyb20gJy4vRGFzaFJlbmRlcmVyJztcblxuLy8gbWFrZSBEYXNoUmVuZGVyZXIgZ2xvYmFsbHkgYXZhaWxhYmxlXG53aW5kb3cuRGFzaFJlbmRlcmVyID0gRGFzaFJlbmRlcmVyO1xuIl0sIm5hbWVzIjpbIlByb3BUeXBlcyIsIlJlYWN0IiwidXNlU3RhdGUiLCJQcm92aWRlciIsIlN0b3JlIiwiQXBwQ29udGFpbmVyIiwiQXBwUHJvdmlkZXIiLCJfcmVmIiwiaG9va3MiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJzdG9yZSIsImNyZWF0ZUVsZW1lbnQiLCJwcm9wVHlwZXMiLCJzaGFwZSIsImxheW91dF9wcmUiLCJmdW5jIiwibGF5b3V0X3Bvc3QiLCJyZXF1ZXN0X3ByZSIsInJlcXVlc3RfcG9zdCIsImNhbGxiYWNrX3Jlc29sdmVkIiwicmVxdWVzdF9yZWZyZXNoX2p3dCIsImRlZmF1bHRQcm9wcyIsImFueSIsImZpbHRlciIsIm1hcCIsInBhdGgiLCJTdG9yZU9ic2VydmVyIiwiX2NyZWF0ZUNsYXNzIiwiX3RoaXMiLCJfY2xhc3NDYWxsQ2hlY2siLCJfZGVmaW5lUHJvcGVydHkiLCJvYnNlcnZlciIsImlucHV0cyIsIkFycmF5IiwiaXNBcnJheSIsIkVycm9yIiwiYWRkIiwicmVtb3ZlIiwiX19maW5hbGl6ZV9fIiwiX19pbml0X18iLCJfdGhpcyRfdW5zdWJzY3JpYmUiLCJfdW5zdWJzY3JpYmUiLCJjYWxsIiwiX3N0b3JlIiwic3Vic2NyaWJlIiwibm90aWZ5IiwiX29ic2VydmVycyIsImZvckVhY2giLCJvIiwibGFzdFN0YXRlIiwicHVzaCIsImlucHV0UGF0aHMiLCJwIiwic3BsaXQiLCJ0cmlnZ2VyZWQiLCJzdGF0ZSIsImdldFN0YXRlIiwiaSIsInNwbGljZSIsImZpbmRJbmRleCIsImRlZmF1bHQiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwiZSIsInQiLCJyIiwiT2JqZWN0IiwicHJvdG90eXBlIiwibiIsImhhc093blByb3BlcnR5IiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsIlN5bWJvbCIsImEiLCJpdGVyYXRvciIsImMiLCJhc3luY0l0ZXJhdG9yIiwidSIsInRvU3RyaW5nVGFnIiwiZGVmaW5lIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwid3JhcCIsIkdlbmVyYXRvciIsImNyZWF0ZSIsIkNvbnRleHQiLCJtYWtlSW52b2tlTWV0aG9kIiwidHJ5Q2F0Y2giLCJ0eXBlIiwiYXJnIiwiaCIsImwiLCJmIiwicyIsInkiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiZCIsImdldFByb3RvdHlwZU9mIiwidiIsInZhbHVlcyIsImciLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJfaW52b2tlIiwiQXN5bmNJdGVyYXRvciIsImludm9rZSIsInJlc29sdmUiLCJfX2F3YWl0IiwidGhlbiIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwiZG9uZSIsIm1ldGhvZCIsImRlbGVnYXRlIiwibWF5YmVJbnZva2VEZWxlZ2F0ZSIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwicmV0dXJuIiwiVHlwZUVycm9yIiwicmVzdWx0TmFtZSIsIm5leHQiLCJuZXh0TG9jIiwicHVzaFRyeUVudHJ5IiwidHJ5TG9jIiwiY2F0Y2hMb2MiLCJmaW5hbGx5TG9jIiwiYWZ0ZXJMb2MiLCJ0cnlFbnRyaWVzIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJyZXNldCIsImlzTmFOIiwibGVuZ3RoIiwiZGlzcGxheU5hbWUiLCJpc0dlbmVyYXRvckZ1bmN0aW9uIiwiY29uc3RydWN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJhc3luYyIsIlByb21pc2UiLCJrZXlzIiwicmV2ZXJzZSIsInBvcCIsInByZXYiLCJjaGFyQXQiLCJzbGljZSIsInN0b3AiLCJydmFsIiwiaGFuZGxlIiwiY29tcGxldGUiLCJmaW5pc2giLCJjYXRjaCIsIl9jYXRjaCIsImRlbGVnYXRlWWllbGQiLCJvd25LZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJvYmoiLCJrZXkiLCJfdG9Qcm9wZXJ0eUtleSIsIl90b1ByaW1pdGl2ZSIsIlN0cmluZyIsImlucHV0IiwiaGludCIsInByaW0iLCJ0b1ByaW1pdGl2ZSIsInVuZGVmaW5lZCIsInJlcyIsIk51bWJlciIsImFzeW5jR2VuZXJhdG9yU3RlcCIsImdlbiIsInJlamVjdCIsIl9uZXh0IiwiX3Rocm93IiwiaW5mbyIsImVycm9yIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJmbiIsInNlbGYiLCJhcmdzIiwiZXJyIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiYXJyIiwiX2FycmF5V2l0aG91dEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVNwcmVhZCIsIml0ZXIiLCJmcm9tIiwiX2FycmF5TGlrZVRvQXJyYXkiLCJfYXJyYXlXaXRoSG9sZXMiLCJfaXRlcmFibGVUb0FycmF5TGltaXQiLCJfbm9uSXRlcmFibGVSZXN0IiwibWluTGVuIiwidG9TdHJpbmciLCJ0ZXN0IiwibGVuIiwiYXJyMiIsImNvbmNhdCIsImZsYXR0ZW4iLCJpbnRlcnNlY3Rpb24iLCJtZXJnZURlZXBSaWdodCIsInBpY2siLCJwbHVjayIsInRvUGFpcnMiLCJ6aXAiLCJhc3NvY1BhdGgiLCJTVEFUVVMiLCJKV1RfRVhQSVJFRF9NRVNTQUdFIiwiTUFYX0FVVEhfUkVUUklFUyIsIkNhbGxiYWNrQWN0aW9uVHlwZSIsIkNhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZSIsImlzTXVsdGlWYWx1ZWQiLCJzdHJpbmdpZnlJZCIsImlzTXVsdGlPdXRwdXRQcm9wIiwidXJsQmFzZSIsImdldENTUkZIZWFkZXIiLCJjcmVhdGVBY3Rpb24iLCJhZGRIdHRwSGVhZGVycyIsIm5vdGlmeU9ic2VydmVycyIsInVwZGF0ZVByb3BzIiwiaGFuZGxlUGF0Y2giLCJpc1BhdGNoIiwiZ2V0UGF0aCIsInJlcXVlc3REZXBlbmRlbmNpZXMiLCJhZGRCbG9ja2VkQ2FsbGJhY2tzIiwiQWRkQmxvY2tlZCIsImFkZENvbXBsZXRlZENhbGxiYWNrcyIsIkFkZENvbXBsZXRlZCIsImFkZEV4ZWN1dGVkQ2FsbGJhY2tzIiwiQWRkRXhlY3V0ZWQiLCJhZGRFeGVjdXRpbmdDYWxsYmFja3MiLCJBZGRFeGVjdXRpbmciLCJhZGRQcmlvcml0aXplZENhbGxiYWNrcyIsIkFkZFByaW9yaXRpemVkIiwiYWRkUmVxdWVzdGVkQ2FsbGJhY2tzIiwiQWRkUmVxdWVzdGVkIiwiYWRkU3RvcmVkQ2FsbGJhY2tzIiwiQWRkU3RvcmVkIiwiYWRkV2F0Y2hlZENhbGxiYWNrcyIsIkFkZFdhdGNoZWQiLCJyZW1vdmVFeGVjdXRlZENhbGxiYWNrcyIsIlJlbW92ZUV4ZWN1dGVkIiwicmVtb3ZlQmxvY2tlZENhbGxiYWNrcyIsIlJlbW92ZUJsb2NrZWQiLCJyZW1vdmVFeGVjdXRpbmdDYWxsYmFja3MiLCJSZW1vdmVFeGVjdXRpbmciLCJyZW1vdmVQcmlvcml0aXplZENhbGxiYWNrcyIsIlJlbW92ZVByaW9yaXRpemVkIiwicmVtb3ZlUmVxdWVzdGVkQ2FsbGJhY2tzIiwiUmVtb3ZlUmVxdWVzdGVkIiwicmVtb3ZlU3RvcmVkQ2FsbGJhY2tzIiwiUmVtb3ZlU3RvcmVkIiwicmVtb3ZlV2F0Y2hlZENhbGxiYWNrcyIsIlJlbW92ZVdhdGNoZWQiLCJhZ2dyZWdhdGVDYWxsYmFja3MiLCJBZ2dyZWdhdGUiLCJ1cGRhdGVSZXNvdXJjZVVzYWdlIiwiYWRkQ2FsbGJhY2tKb2IiLCJyZW1vdmVDYWxsYmFja0pvYiIsInNldENhbGxiYWNrSm9iT3V0ZGF0ZWQiLCJ1bndyYXBJZk5vdE11bHRpIiwicGF0aHMiLCJpZFByb3BzIiwic3BlYyIsImFueVZhbHMiLCJkZXBUeXBlIiwibXNnIiwiaXNTdHIiLCJpZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJwcm9wZXJ0eSIsInN0cnMiLCJqb2luIiwiZmlsbFZhbHMiLCJsYXlvdXQiLCJjYiIsInNwZWNzIiwiYWxsb3dBbGxNaXNzaW5nIiwiZ2V0dGVyIiwiZ2V0SW5wdXRzIiwiZXJyb3JzIiwiZW1wdHlNdWx0aVZhbHVlcyIsImlucHV0VmFscyIsImlucHV0TGlzdCIsIl91bndyYXBJZk5vdE11bHRpIiwicGF0aF8iLCJfdW53cmFwSWZOb3RNdWx0aTIiLCJpbnB1dEVycm9yIiwicmVmRXJyIiwiaW5kZXhPZiIsImNvbnNvbGUiLCJvYmpzIiwiUmVmZXJlbmNlRXJyb3IiLCJnZXRWYWxzIiwiemlwSWZBcnJheSIsImIiLCJjbGVhbk91dHB1dFByb3AiLCJoYW5kbGVDbGllbnRzaWRlIiwiX3giLCJfeDIiLCJfeDMiLCJfeDQiLCJfaGFuZGxlQ2xpZW50c2lkZSIsIl9jYWxsZWUyIiwiZGlzcGF0Y2giLCJjbGllbnRzaWRlX2Z1bmN0aW9uIiwiY29uZmlnIiwicGF5bG9hZCIsImRjIiwib3V0cHV0cyIsInJlcXVlc3RUaW1lIiwiaW5wdXREaWN0Iiwic3RhdGVEaWN0IiwicmVzdWx0Iiwic3RhdHVzIiwiX2RjJG5hbWVzcGFjZSIsIl9yZXR1cm5WYWx1ZSIsIm5hbWVzcGFjZSIsImZ1bmN0aW9uX25hbWUiLCJyZXR1cm5WYWx1ZSIsInRvdGFsVGltZSIsInJlc291cmNlcyIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MyIsIndpbmRvdyIsImRhc2hfY2xpZW50c2lkZSIsIm5vX3VwZGF0ZSIsImRlc2NyaXB0aW9uIiwiRGF0ZSIsIm5vdyIsImlucHV0c1RvRGljdCIsIk9LIiwiY2FsbGJhY2tfY29udGV4dCIsImNoYW5nZWRQcm9wSWRzIiwicHJvcF9pZCIsImlucHV0c19saXN0Iiwic3RhdGVzX2xpc3QiLCJzdGF0ZXMiLCJfcmVmMTAiLCJfcmVmMTEiLCJvdXRpIiwicmV0aSIsIl9yZWYxMiIsIl9yZWYxMyIsIm91dGlqIiwicmV0aWoiLCJpZFN0ciIsImRhdGFGb3JJZCIsInQwIiwiUHJldmVudFVwZGF0ZSIsIlBSRVZFTlRfVVBEQVRFIiwiQ0xJRU5UU0lERV9FUlJPUiIsIl9fZGFzaF9zZXJ2ZXIiLCJfX2Rhc2hfY2xpZW50IiwiX19kYXNoX3VwbG9hZCIsIl9fZGFzaF9kb3dubG9hZCIsInVpIiwib3V0cHV0IiwidXNhZ2UiLCJzaWRlVXBkYXRlIiwiX3JlZjIiLCJfcmVmMyIsIl9pZCRzcGxpdCIsIl9pZCRzcGxpdDIiLCJjb21wb25lbnRJZCIsInByb3BOYW1lIiwiY29tcG9uZW50UGF0aCIsInByb3BzIiwiaXRlbXBhdGgiLCJoYW5kbGVTZXJ2ZXJzaWRlIiwibG9uZyIsImFkZGl0aW9uYWxBcmdzIiwiYm9keSIsImNhY2hlS2V5Iiwiam9iIiwicnVubmluZ09mZiIsInByb2dyZXNzRGVmYXVsdCIsIm1vcmVBcmdzIiwiZmV0Y2hDYWxsYmFjayIsImhlYWRlcnMiLCJ1cmwiLCJhZGRBcmciLCJkZWxpbSIsImluY2x1ZGVzIiwiX3JlZjQiLCJfcmVmNSIsIl9yZWY2IiwiX3JlZjciLCJfIiwiX18iLCJzaW5nbGUiLCJmZXRjaCIsImhhbmRsZU91dHB1dCIsImNhbGxiYWNrSm9iIiwiY2FsbGJhY2tKb2JzIiwib3V0ZGF0ZWQiLCJqb2JJZCIsInJlY29yZFByb2ZpbGUiLCJnZXQiLCJ0aW1pbmdIZWFkZXJzIiwiaGVhZGVyIiwiZHVyIiwibWF0Y2giLCJmaW5pc2hMaW5lIiwiZGF0YSIsIm11bHRpIiwicmVzcG9uc2UiLCJzdWJzdHIiLCJsYXN0SW5kZXhPZiIsImNvbXBsZXRlSm9iIiwianNvbiIsImpvYkluZm8iLCJjYW5jZWxJbnB1dHMiLCJjYW5jZWwiLCJwcm9ncmVzcyIsInJ1bm5pbmciLCJzZXRUaW1lb3V0IiwiaW50ZXJ2YWwiLCJoYW5kbGVFcnJvciIsIk5PX1JFU1BPTlNFIiwiaW5wdXRzaSIsImlpIiwiX2lucHV0c2kkaWkkdmFsdWUiLCJpZF9zdHIiLCJfaW5wdXRzX2xpc3QkaSR2YWx1ZSIsImV4ZWN1dGVDYWxsYmFjayIsIl9yZWY4IiwiYWxsT3V0cHV0cyIsIl9jYiRjYWxsYmFjayIsImNhbGxiYWNrIiwiZHluYW1pY19jcmVhdG9yIiwiaW5WYWxzIiwiZXhlY3V0aW9uUHJvbWlzZSIsIm91dHB1dEVycm9ycyIsIm91dCIsIl91bndyYXBJZk5vdE11bHRpMyIsIl91bndyYXBJZk5vdE11bHRpNCIsImVycmkiLCJfX2V4ZWN1dGUiLCJfcmVmOSIsIl9jYWxsZWUiLCJuZXdDb25maWciLCJuZXdIZWFkZXJzIiwibGFzdEVycm9yIiwiX2xvb3AiLCJfcmV0IiwicmV0cnkiLCJfY2FsbGVlJCIsIl9jb250ZXh0MiIsImludGVyIiwiX2RhdGEiLCJjdXJyZW50TGF5b3V0Iiwib2xkSnd0IiwibmV3Snd0IiwiX2xvb3AkIiwiX2NvbnRleHQiLCJvdXRwdXRQYXRoIiwicHJldmlvdXNWYWx1ZSIsImRhdGFQYXRoIiwib3V0cHV0VmFsdWUiLCJVTkFVVEhPUklaRUQiLCJCQURfUkVRVUVTVCIsInRleHQiLCJBdXRob3JpemF0aW9uIiwidDEiLCJ0MiIsIm5ld0NiIiwiYWxsIiwiYXNzb2MiLCJkaWZmZXJlbmNlIiwiaXNFbXB0eSIsIm1lcmdlV2l0aCIsInBhcnRpdGlvbiIsInBpY2tCeSIsInJlZHVjZSIsInppcE9iaiIsImFkZEFsbFJlc29sdmVkRnJvbU91dHB1dHMiLCJnZXRVbmZpbHRlcmVkTGF5b3V0Q2FsbGJhY2tzIiwiaWRNYXRjaCIsInNwbGl0SWRBbmRQcm9wIiwiRElSRUNUIiwiSU5ESVJFQ1QiLCJtZXJnZU1heCIsIk1hdGgiLCJtYXgiLCJjb21iaW5lSWRBbmRQcm9wIiwiZ2V0Q2FsbGJhY2tzQnlJbnB1dCIsImdyYXBocyIsInByb3AiLCJjaGFuZ2VUeXBlIiwid2l0aFByaW9yaXR5IiwibWF0Y2hlcyIsImlkQW5kUHJvcCIsImNhbGxiYWNrcyIsImlucHV0TWFwIiwicmVzb2x2ZURlcHMiLCJfa2V5cyIsInNvcnQiLCJ2YWxzIiwia2V5U3RyIiwicGF0dGVybnMiLCJpbnB1dFBhdHRlcm5zIiwicGF0dGVybiIsInByaW9yaXR5IiwiZ2V0UHJpb3JpdHkiLCJ0b3VjaGVkT3V0cHV0cyIsInRvdWNoZWRDYklkcyIsInRvdWNoZWQiLCJyZXNvbHZlZElkIiwiZ2V0T3V0cHV0cyIsInVuc2hpZnQiLCJtaW4iLCJnZXRBbGxTdWJzZXF1ZW50T3V0cHV0c0ZvckNhbGxiYWNrIiwiZ2V0UmVhZHlDYWxsYmFja3MiLCJjYW5kaWRhdGVzIiwib3V0cHV0c01hcCIsImFsbFRvdWNoZWRPdXRwdXRzIiwiYXNzaWduIiwiY2JwIiwiZ2V0TGF5b3V0Q2FsbGJhY2tzIiwib3B0aW9ucyIsImV4Y2x1c2lvbnMiLCJfcGFydGl0aW9uIiwiX3BhcnRpdGlvbjIiLCJpbmNsdWRlZCIsImV4Y2x1ZGVkIiwiZmlsdGVyUm9vdCIsInJvb3RJZCIsInByZXZpb3VzIiwiZXhlY3V0aW9uR3JvdXAiLCJyYW5kb20iLCJnZXRVbmlxdWVJZGVudGlmaWVyIiwiX3JlZjYkY2FsbGJhY2siLCJpbmNsdWRlT2JzZXJ2ZXJzIiwicHJvcGVydGllcyIsIm1ha2VSZXNvbHZlZENhbGxiYWNrIiwiaW5pdGlhbENhbGwiLCJwcnVuZUNhbGxiYWNrcyIsIl9wYXJ0aXRpb24zIiwiX3BhcnRpdGlvbjQiLCJyZW1vdmVkIiwiX3BhcnRpdGlvbjUiLCJfcGFydGl0aW9uNiIsIm1vZGlmaWVkIiwiYWRkZWQiLCJwcm9wSWQiLCJyZWZLZXlzIiwicmVmVmFscyIsInJlZlBhdHRlcm5WYWxzIiwiaWRQYXR0ZXJuIiwicGF0dGVyblZhbHMiLCJrZXlQYXRocyIsIklzTG9hZGluZ0FjdGlvblR5cGUiLCJzZXRJc0xvYWRpbmciLCJTZXQiLCJMb2FkaW5nTWFwQWN0aW9uVHlwZSIsInNldExvYWRpbmdNYXAiLCJhcHBlbmQiLCJkaXNzb2NQYXRoIiwiZW1wdHkiLCJlcXVhbHMiLCJoYXMiLCJpbnNlcnQiLCJpcyIsInByZXBlbmQiLCJnZXRMb2NhdGlvbkluZGV4IiwiZ2V0TG9jYXRpb25QYXRoIiwibG9jYXRpb24iLCJjdXJyZW50IiwicGF0Y2hIYW5kbGVycyIsIkFzc2lnbiIsInBhdGNoT3BlcmF0aW9uIiwicGFyYW1zIiwiTWVyZ2UiLCJFeHRlbmQiLCJEZWxldGUiLCJJbnNlcnQiLCJpbmRleCIsIkFwcGVuZCIsIlByZXBlbmQiLCJBZGQiLCJTdWIiLCJNdWwiLCJEaXYiLCJDbGVhciIsIlJldmVyc2UiLCJSZW1vdmUiLCJpdGVtIiwicGF0Y2hWYWx1ZSIsInJlZHVjZWRWYWx1ZSIsIm9wZXJhdGlvbnMiLCJwYXRjaCIsImhhbmRsZXIiLCJvcGVyYXRpb24iLCJiYXRjaCIsInNldEdyYXBocyIsImFwaVRodW5rIiwiZ2V0Q29uZmlnRnJvbURPTSIsImNvbmZpZ0VsZW1lbnQiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwicGFyc2UiLCJ0ZXh0Q29udGVudCIsInVwZGF0ZVRpdGxlIiwiX2dldFN0YXRlIiwiaXNMb2FkaW5nIiwidXBkYXRlX3RpdGxlIiwidGl0bGUiLCJtdXRhdGlvbk9ic2VydmVyIiwiX2dldFN0YXRlMiIsIl9vYnNlcnZlciRtdXRhdGlvbk9icyIsImRpc2Nvbm5lY3QiLCJNdXRhdGlvbk9ic2VydmVyIiwicXVlcnlTZWxlY3RvciIsIm9ic2VydmUiLCJzdWJ0cmVlIiwiY2hpbGRMaXN0IiwiYXR0cmlidXRlcyIsImNoYXJhY3RlckRhdGEiLCJpc05pbCIsInBhdGhPciIsInBhcnNlSWZXaWxkY2FyZCIsInNldFBhdGhzIiwiaGFuZGxlQXN5bmNFcnJvciIsImNvbXB1dGVQYXRocyIsImFwcGx5UGVyc2lzdGVuY2UiLCJwcnVuZVBlcnNpc3RlbmNlIiwiZXhlY3V0ZWQiLCJhcHBseVByb3BzIiwidXBkYXRlZFByb3BzIiwiX2FwcGx5UGVyc2lzdGVuY2UiLCJzb3VyY2UiLCJyZXF1ZXN0ZWRDYWxsYmFja3MiLCJzdG9yZWRDYWxsYmFja3MiLCJfY2IkcHJlZGVjZXNzb3JzIiwicHJlZGVjZXNzb3JzIiwiZXhlY3V0aW9uUmVzdWx0IiwiZW50cmllcyIsInBhcnNlZElkIiwiX2dldFN0YXRlMyIsIm9sZExheW91dCIsIm9sZFBhdGhzIiwiYXBwbGllZFByb3BzIiwicmNiIiwiYmFzZVBhdGgiLCJvbGRPYmoiLCJjaGlsZHJlblByb3BzIiwiX19kYXNocHJpdmF0ZV9jaGlsZHJlblByb3BzIiwiaGFuZGxlUGF0aHMiLCJjaGlsZHJlbiIsIm9sZENoaWxkcmVuIiwib2xkQ2hpbGRyZW5QYXRoIiwib1BhdGhzIiwiY2h1bmtQYXRoIiwicmVtb3ZlZEFycmF5SW5wdXRzT25seSIsIm5ld1BhdGhzIiwicmVjb21wdXRlZCIsImNoaWxkcmVuUHJvcCIsIl9jaGlsZHJlblByb3Akc3BsaXQkbSIsIl9jaGlsZHJlblByb3Akc3BsaXQkbTIiLCJmcm9udFBhdGgiLCJmcm9udE9iaiIsImNoaWxkcmVuUHJvcFBhdGgiLCJhZGRlZFByb3BzIiwiayIsIl9nZXRTdGF0ZTQiLCJjdXJyZW50R3JhcGhzIiwiZXhlY3V0aW9uTWV0YSIsImFsbFByb3BzIiwibWVzc2FnZSIsIm5zIiwiZmluZCIsImdldEFwcFN0YXRlIiwiZXhlY3V0aW5nIiwiZGVmZXJyZWQiLCJza2lwcGVkT3JSZWFkeSIsIndhdGNoZWQiLCJhcHBMaWZlY3ljbGUiLCJjdXJyZW50Q2IiLCJfY2IiLCJnZXRQZW5kaW5nQ2FsbGJhY2tzIiwicGVuZGluZ0NhbGxiYWNrcyIsIkJvb2xlYW4iLCJfZ2V0U3RhdGUkY2FsbGJhY2tzIiwibG9hZGluZ01hcCIsImxvYWRpbmdQYXRocyIsIm5leHRNYXAiLCJ0YXJnZXQiLCJpZHByb3AiLCJfX2Rhc2hwcml2YXRlX19pZHByb3BzX18iLCJfdGFyZ2V0JHAiLCJfX2Rhc2hwcml2YXRlX19pZHByb3BfXyIsInVuaXEiLCJpc0FwcFJlYWR5Iiwic29ydFByaW9yaXR5IiwiYzEiLCJjMiIsIl9jMSRwcmlvcml0eSIsIl9jMiRwcmlvcml0eSIsImdldFN0YXNoIiwiZmxhdE91dHB1dHMiLCJhbGxQcm9wSWRzIiwicmVxT3V0IiwiaWRPdXQiLCJnZXRJZHMiLCJfb2JzZXJ2ZXIiLCJwcmlvcml0aXplZCIsImF2YWlsYWJsZSIsInN5bmNDYWxsYmFja3MiLCJhc3luY0NhbGxiYWNrcyIsInBpY2tlZFN5bmNDYWxsYmFja3MiLCJwaWNrZWRBc3luY0NhbGxiYWNrcyIsImlzUmVhZHkiLCJibG9ja2VkIiwiZXhlY3V0aW5nQ2FsbGJhY2siLCJncm91cEJ5IiwibWVyZ2VMZWZ0Iiwid2FpdCIsInN0b3JlZCIsInJlcXVlc3RlZCIsImluaXRpYWxSZXF1ZXN0ZWQiLCJyQ2lyY3VsYXJzIiwickR1cGxpY2F0ZXMiLCJyTWVyZ2VkRHVwbGljYXRlcyIsInBEdXBsaWNhdGVzIiwiYkR1cGxpY2F0ZXMiLCJlRHVwbGljYXRlcyIsIndEdXBsaWNhdGVzIiwiX3BydW5lQ2FsbGJhY2tzIiwickFkZGVkIiwiclJlbW92ZWQiLCJfcHJ1bmVDYWxsYmFja3MyIiwicEFkZGVkIiwicFJlbW92ZWQiLCJfcHJ1bmVDYWxsYmFja3MzIiwiYkFkZGVkIiwiYlJlbW92ZWQiLCJfcHJ1bmVDYWxsYmFja3M0IiwiZUFkZGVkIiwiZVJlbW92ZWQiLCJfcHJ1bmVDYWxsYmFja3M1Iiwid0FkZGVkIiwid1JlbW92ZWQiLCJyZWFkeUNhbGxiYWNrcyIsIm9sZEJsb2NrZWQiLCJuZXdCbG9ja2VkIiwicGVuZGluZ0dyb3VwcyIsImRyb3BwZWQiLCJncm91cCIsImluaXRpYWwiLCJncm91cFdpdGhvdXRJbml0aWFsIiwiZXhnIiwicmVhZHlDYWxsYmFjayIsImJsb2NrZWRCeUFzc3VtcHRpb25zIiwiX2NiJHByZWRlY2Vzc29yczIiLCJnY2IiLCJ1cGRhdGVkIiwibnVsbEdyb3VwQ2FsbGJhY2tzIiwiZ3JvdXBDYWxsYmFja3MiLCJleGVjdXRpb25Hcm91cHMiLCJleGVjdXRpb25Hcm91cENhbGxiYWNrcyIsImRpc3NvYyIsInNldEpvYiIsInJlbW92ZUpvYiIsInNldE91dGRhdGVkIiwiYWN0aW9uIiwiREVGQVVMVF9TVEFURSIsImNvbXBsZXRlZCIsInRyYW5zZm9ybXMiLCJmaWVsZHMiLCJtdXRhdGVDb21wbGV0ZWQiLCJtdXRhdGVDYWxsYmFja3MiLCJ0cmFuc2Zvcm0iLCJmaWVsZCIsIm9uY2UiLCJjcmVhdGVTdG9yZSIsImFwcGx5TWlkZGxld2FyZSIsInRodW5rIiwiY3JlYXRlUmVkdWNlciIsImRvY3VtZW50VGl0bGUiLCJleGVjdXRlZENhbGxiYWNrcyIsImV4ZWN1dGluZ0NhbGxiYWNrcyIsInByaW9yaXRpemVkQ2FsbGJhY2tzIiwiUmVuZGVyZXJTdG9yZSIsInN0b3JlT2JzZXJ2ZXIiLCJyZWR1Y2VyIiwibWlkZGxld2FyZSIsIl9fc3RvcmUiLCJzZXRTdG9yZSIsInNldE9ic2VydmVycyIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsImNyZWF0ZUFwcFN0b3JlIiwicmVkdXhEVEVDIiwiX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fQ09NUE9TRV9fIiwiYWN0aW9uc0RlbnlsaXN0IiwibW9kdWxlIiwiaG90IiwiYWNjZXB0IiwibmV4dFJvb3RSZWR1Y2VyIiwicmVxdWlyZSIsInJlcGxhY2VSZWR1Y2VyIiwiaW5pdGlhbGl6ZVN0b3JlIiwiUmVnaXN0cnkiLCJpc0xvYWRpbmdDb21wb25lbnQiLCJ2YWxpZGF0ZUNvbXBvbmVudCIsIl9kYXNocHJpdmF0ZV9pc0xvYWRpbmdDb21wb25lbnQiLCJOVUxMX0xPQURJTkdfU1RBVEUiLCJnZXRMb2FkaW5nU3RhdGUiLCJjb21wb25lbnRMYXlvdXQiLCJfbG9hZGluZ0ZyYWdtZW50JF9fZGEiLCJsb2FkaW5nRnJhZ21lbnQiLCJpc19sb2FkaW5nIiwicHJvcF9uYW1lIiwiY29tcG9uZW50X25hbWUiLCJpZHByb3BzIiwiZ2V0TG9hZGluZ0hhc2giLCJfcGF0aCIsImNvbXBvbmVudERlZmluaXRpb24iLCJvbWl0IiwiX0FycmF5IiwiZHVyYXRpb24iLCJfcmVzb2x2ZSIsImNvbm5lY3QiLCJ1c2VFZmZlY3QiLCJ1c2VSZWYiLCJjcmVhdGVDb250ZXh0IiwiVHJlZUNvbnRhaW5lciIsIkdsb2JhbEVycm9yQ29udGFpbmVyIiwiZGlzcGF0Y2hFcnJvciIsImh5ZHJhdGVJbml0aWFsT3V0cHV0cyIsIm9uRXJyb3IiLCJzZXRMYXlvdXQiLCJjb21wdXRlR3JhcGhzIiwiRXZlbnRFbWl0dGVyIiwiRGFzaENvbnRleHQiLCJVbmNvbm5lY3RlZENvbnRhaW5lciIsImRlcGVuZGVuY2llc1JlcXVlc3QiLCJsYXlvdXRSZXF1ZXN0IiwiZXJyb3JMb2FkaW5nIiwic2V0RXJyb3JMb2FkaW5nIiwiZXZlbnRzIiwicmVuZGVyZWRUcmVlIiwicHJvcHNSZWYiLCJwcm92aWRlciIsIl9kYXNocHJpdmF0ZV9jb25maWciLCJfZGFzaHByaXZhdGVfZGlzcGF0Y2giLCJfZGFzaHByaXZhdGVfZ3JhcGhzIiwiX2Rhc2hwcml2YXRlX2xvYWRpbmdNYXAiLCJzdG9yZUVmZmVjdCIsImJpbmQiLCJlbWl0Iiwic2VydmVfbG9jYWxseSIsIl9kYXNoUGxvdGx5SlNVUkwiLCJyZXF1ZXN0c19wYXRobmFtZV9wcmVmaXgiLCJwbG90bHlqc191cmwiLCJjb250ZW50IiwiY2xhc3NOYW1lIiwiX2Rhc2hwcml2YXRlX2Vycm9yIiwiX2Rhc2hwcml2YXRlX2xheW91dCIsIl9kYXNocHJpdmF0ZV9sb2FkaW5nU3RhdGUiLCJfZGFzaHByaXZhdGVfbG9hZGluZ1N0YXRlSGFzaCIsIl9kYXNocHJpdmF0ZV9wYXRoIiwiZmluYWxMYXlvdXQiLCJoYXNFcnJvciIsImZyb250RW5kIiwiYmFja0VuZCIsIm9uZU9mIiwib2JqZWN0IiwiaGlzdG9yeSIsIkNvbnRhaW5lciIsIkFQSUNvbnRyb2xsZXIiLCJMb2FkaW5nIiwiVG9vbGJhciIsIlJlbG9hZGVyIiwic2V0SG9va3MiLCJzZXRDb25maWciLCJtZW1vaXplV2l0aCIsImlkZW50aXR5IiwiVW5jb25uZWN0ZWRBcHBDb250YWluZXIiLCJfUmVhY3QkQ29tcG9uZW50IiwiX2luaGVyaXRzIiwiX3N1cGVyIiwiX2NyZWF0ZVN1cGVyIiwiVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCIsImNyZWRlbnRpYWxzIiwiQWNjZXB0IiwicmVuZGVyIiwic2hvd191bmRvX3JlZG8iLCJGcmFnbWVudCIsIkNvbXBvbmVudCIsIlJlYWN0RE9NIiwiRGFzaFJlbmRlcmVyIiwiY29udGFpbmVyIiwiY3JlYXRlUm9vdCIsInJvb3QiLCJtZW1vIiwidXNlQ29udGV4dCIsInByb3BUeXBlRXJyb3JIYW5kbGVyIiwiYWRkSW5kZXgiLCJtYXBPYmpJbmRleGVkIiwibWVyZ2VSaWdodCIsInByb3BPciIsInJwYXRoIiwiaXNTaW1wbGVDb21wb25lbnQiLCJyZWNvcmRVaUVkaXQiLCJDb21wb25lbnRFcnJvckJvdW5kYXJ5IiwiY2hlY2tQcm9wVHlwZXMiLCJnZXRXYXRjaGVkS2V5cyIsIk5PVF9MT0FESU5HIiwiQ2hlY2tlZENvbXBvbmVudCIsImVsZW1lbnQiLCJleHRyYVByb3BzIiwiZXJyb3JNZXNzYWdlIiwic3RyaW5nIiwiaXNEcnlDb21wb25lbnQiLCJEYXNoV3JhcHBlciIsImNvbnRleHQiLCJCYXNlVHJlZUNvbnRhaW5lciIsIl9leHRlbmRzIiwiX0NvbXBvbmVudCIsInNldFByb3BzIiwiX2Fzc2VydFRoaXNJbml0aWFsaXplZCIsImNyZWF0ZUNvbnRhaW5lciIsImNvbXBvbmVudCIsIm5ld1Byb3BzIiwiX3RoaXMkcHJvcHMiLCJvbGRQcm9wcyIsImdldExheW91dFByb3BzIiwiY2hhbmdlZFByb3BzIiwidmFsIiwid2F0Y2hlZEtleXMiLCJnZXRDaGlsZHJlbiIsImNvbXBvbmVudHMiLCJfdGhpczIiLCJ3cmFwQ2hpbGRyZW5Qcm9wIiwibm9kZSIsIl90aGlzMyIsImdldENvbXBvbmVudCIsImxvYWRpbmdfc3RhdGUiLCJfdGhpczQiLCJfdGhpcyRwcm9wczIiLCJoYW5kbGVPYmplY3QiLCJvcGF0aCIsIm5vZGVWYWx1ZSIsImJhY2tQYXRoIiwiZm91bmQiLCJoYXNPYmplY3QiLCJyZXBsYWNlIiwiZmlyc3ROb2RlIiwiZWxlbWVudFBhdGgiLCJsaXN0VmFsdWUiLCJmcm9udCIsImR5bmFtaWMiLCJoYXNCYWNrIiwiaiIsImN1ciIsImR5blZhbHVlIiwiYVBhdGgiLCJjb21wb25lbnRUeXBlIiwicHJvcHNfY2hlY2siLCJfdGhpcyRwcm9wczMiLCJsYXlvdXRQcm9wcyIsIm9uZU9mVHlwZSIsImJvb2wiLCJhcnJheSIsImxvZ1dhcm5pbmdPbmNlIiwid2FybiIsIkdFVCIsImZldGNoQ29uZmlnIiwiUE9TVCIsInJlcXVlc3QiLCJlbmRwb2ludCIsInNldENvbm5lY3Rpb25TdGF0dXMiLCJfYm9keSIsImNvbnRlbnRUeXBlIiwiX3NldENvbm5lY3Rpb25TdGF0dXMiLCJjb25uZWN0ZWQiLCJiYWNrRW5kQ29ubmVjdGVkIiwibG9nIiwiYWN0aW9uTGlzdCIsIk9OX1BST1BfQ0hBTkdFIiwiU0VUX1JFUVVFU1RfUVVFVUUiLCJTRVRfR1JBUEhTIiwiU0VUX1BBVEhTIiwiU0VUX0xBWU9VVCIsIlNFVF9BUFBfTElGRUNZQ0xFIiwiU0VUX0NPTkZJRyIsIkFERF9IVFRQX0hFQURFUlMiLCJPTl9FUlJPUiIsIlNFVF9IT09LUyIsImdldEFjdGlvbiIsIkRlcEdyYXBoIiwiaXNOdW1lcmljIiwiYXAiLCJldm9sdmUiLCJmb3JFYWNoT2JqSW5kZXhlZCIsInN0YXJ0c1dpdGgiLCJjcmF3bExheW91dCIsIkFMTCIsIndpbGQiLCJNQVRDSCIsIkFMTFNNQUxMRVIiLCJleHBhbmQiLCJ3aWxkY2FyZHMiLCJhbGxvd2VkV2lsZGNhcmRzIiwiT3V0cHV0IiwiSW5wdXQiLCJTdGF0ZSIsIndpbGRjYXJkVmFsVHlwZXMiLCJpZEludmFsaWRDaGFycyIsImlzV2lsZGNhcmRJZCIsInBhcnNlV2lsZGNhcmRJZCIsInBhcnNlTXVsdGlwbGVPdXRwdXRzIiwib3V0cHV0SWRBbmRQcm9wIiwiZG90UG9zIiwic3RyaW5naWZ5VmFsIiwicGFydHMiLCJpZFZhbFNvcnQiLCJiSXNOdW1lcmljIiwiYU4iLCJiTiIsImFJc0Jvb2wiLCJ2YWxCZWZvcmUiLCJ2YWxBZnRlciIsImFkZE1hcCIsImRlcE1hcCIsImRlcGVuZGVuY3kiLCJpZE1hcCIsImFkZFBhdHRlcm4iLCJpZFNwZWMiLCJrZXlDYWxsYmFja3MiLCJwcm9wQ2FsbGJhY2tzIiwidmFsTWF0Y2giLCJ2YWxpZGF0ZURlcGVuZGVuY2llcyIsInBhcnNlZERlcGVuZGVuY2llcyIsIm91dFN0cnMiLCJvdXRPYmpzIiwiZGVwIiwiaGFzT3V0cHV0cyIsImhlYWQiLCJjbHMiLCJpZFByb3AiLCJ2YWxpZGF0ZUFyZyIsImZpbmREdXBsaWNhdGVPdXRwdXRzIiwiZmluZE1pc21hdGNoZWRXaWxkY2FyZHMiLCJpbnZhbGlkQ2hhcnMiLCJuZXdPdXRwdXRTdHJzIiwibmV3T3V0cHV0T2JqcyIsImlkT2JqIiwic2VsZk92ZXJsYXAiLCJ3aWxkY2FyZE92ZXJsYXAiLCJvdGhlck92ZXJsYXAiLCJpZFByb3AyIiwiY2hlY2tJbk91dE92ZXJsYXAiLCJvdXRJZCIsIm91dFByb3AiLCJzb21lIiwiaW5fIiwiaW5JZCIsImluUHJvcCIsIl9maW5kV2lsZGNhcmRLZXlzIiwiZmluZFdpbGRjYXJkS2V5cyIsIm91dDBNYXRjaEtleXMiLCJtYXRjaEtleXMiLCJfZmluZFdpbGRjYXJkS2V5czIiLCJhbGxzbWFsbGVyS2V5cyIsImFsbFdpbGRjYXJkS2V5cyIsImRpZmYiLCJtYXRjaFdpbGRLZXlzIiwiYVdpbGQiLCJiV2lsZCIsImlkS2V5cyIsImlkVmFscyIsIl9pdGVyYXRvciIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiX3N0ZXAiLCJpZDIiLCJwcm9wZXJ0eTIiLCJ2YWxpZGF0ZUNhbGxiYWNrc1RvTGF5b3V0Iiwic3RhdGVfIiwibGF5b3V0XyIsInBhdGhzXyIsInZhbGlkYXRlSWRzIiwic3VwcHJlc3NfY2FsbGJhY2tfZXhjZXB0aW9ucyIsInZhbGlkYXRpb25fbGF5b3V0Iiwib3V0cHV0TWFwIiwib3V0cHV0UGF0dGVybnMiLCJ0YWlsIiwibWlzc2luZ0lkIiwidmFsaWRhdGVQcm9wIiwiaWRQYXRoIiwicmF3UHJvcCIsImxhc3QiLCJ2YWxpZGF0ZUlkUGF0dGVyblByb3AiLCJpZFJlc29sdmVkIiwiY2FsbGJhY2tJZHNDaGVja2VkRm9yU3RhdGUiLCJ2YWxpZGF0ZVN0YXRlIiwidmFsaWRhdGVNYXAiLCJkb1N0YXRlIiwidmFsaWRhdGVQYXR0ZXJucyIsImtleVBhdHRlcm5zIiwiZGVwZW5kZW5jaWVzIiwibXVsdGlHcmFwaCIsIndpbGRjYXJkUGxhY2Vob2xkZXJzIiwiZml4SWRzIiwid3JhcHBlZERFIiwibGluZXMiLCJmaW5hbEdyYXBocyIsIk11bHRpR3JhcGgiLCJleGFjdCIsImtleVBsYWNlaG9sZGVycyIsIm1ha2VBbGxJZHMiLCJvdXRJZEZpbmFsIiwiaWRMaXN0IiwidGVzdFZhbHMiLCJvdXRWYWxJbmRleCIsIm5ld1ZhbHMiLCJvdXRwdXRUYWciLCJkdXBsaWNhdGVPdXRwdXRzIiwiY2JJbiIsImNiT3V0IiwiYWRkSW5wdXRUb011bHRpIiwiaW5JZFByb3AiLCJvdXRJZFByb3AiLCJmaXJzdFBhc3MiLCJhZGROb2RlIiwiYWRkRGVwZW5kZW5jeSIsImFkZE91dHB1dFRvTXVsdGkiLCJpbk9iaiIsImluSWRMaXN0IiwiX2ZpbmRXaWxkY2FyZEtleXMzIiwiZmlyc3RTaW5nbGVPdXRwdXQiLCJmaW5hbERlcGVuZGVuY3kiLCJhbHNvSW5wdXQiLCJvdXRJZExpc3QiLCJ0ZW1wT3V0SWRQcm9wIiwib3V0SWROYW1lIiwiaW5wdXRPYmplY3QiLCJkdXBlT3V0SWRQcm9wIiwib3JpZ2luYWxOYW1lIiwibmV3TmFtZSIsImNudCIsImluTmFtZSIsIm91dE5hbWUiLCJwYXR0ZXJuVmFsIiwicmVmSW5kZXgiLCJyZWZQYXR0ZXJuVmFsIiwiZ2V0QW55VmFscyIsImdldENhbGxiYWNrQnlPdXRwdXQiLCJhZGRSZXNvbHZlZEZyb21PdXRwdXRzIiwib3V0UGF0dGVybiIsIm91dHMiLCJvdXQwS2V5cyIsIm91dDBQYXR0ZXJuVmFscyIsImZvdW5kQ2JJZHMiLCJfcmVmMTQiLCJvdXRWYWxzIiwicmVzb2x2ZWQiLCJzaW5nbGVPdXRQYXR0ZXJuIiwiYW55U2VlbiIsIm91dFNldCIsIm1hdGNoU3RyIiwibmV3UHJvcCIsImxheW91dENodW5rIiwib3B0cyIsIm91dHB1dHNPbmx5IiwiYWRkQ2FsbGJhY2siLCJmb3VuZEluZGV4IiwiZm91bmRDYiIsImFkZENhbGxiYWNrSWZBcnJheSIsImluaSIsImluaWoiLCJoYW5kbGVPbmVJZCIsIm91dElkQ2FsbGJhY2tzIiwiaW5JZENhbGxiYWNrcyIsInByZXZlbnRfaW5pdGlhbF9jYWxsIiwibWF5YmVBZGRDYWxsYmFjayIsImhhbmRsZVRoaXNDYWxsYmFjayIsImNoaWxkIiwiY29va2llIiwic2V0QXBwTGlmZWN5Y2xlIiwic2V0UmVxdWVzdFF1ZXVlIiwiaHRtbCIsInRyaWdnZXJEZWZhdWx0U3RhdGUiLCJfY3NyZl90b2tlbiIsIm92ZXJhbGxPcmRlciIsInJlZG8iLCJtb3ZlSGlzdG9yeSIsInVuZG8iLCJyZXZlcnQiLCJmdXR1cmUiLCJwYXN0IiwidGFyZ2V0cyIsInByb21pc2VzIiwicmVuZGVyZWQiLCJyZXNvbHZlUmVuZGVyZWQiLCJwYXRoT2ZJZCIsInJlYWR5IiwicmFjZSIsInByb3BFcSIsInN1YlRyZWUiLCJzdGFydGluZ1BhdGgiLCJvbGRTdHJzIiwib2xkT2JqcyIsImRpZmZIZWFkIiwic3BMZW4iLCJvbGRWYWxQYXRocyIsIm9sZEtleXMiLCJvbGRpZSIsInBhdGhPYmoiLCJoYXNVcmxCYXNlIiwiaGFzUmVxUHJlZml4IiwiYmFzZSIsInVybF9iYXNlX3BhdGhuYW1lIiwicHJvcHNDaGlsZHJlbiIsImN1cnJlbnRQYXRoIiwiZXh0cmFQYXRoIiwib2JqT2YiLCJiYWNrIiwiY2hpbGRPYmoiLCJjaGlsZFBhdGgiLCJuZXdQYXRoIiwiY3VyUGF0aCIsIm9WYWx1ZSIsIl9ldiIsIm9uIiwiZXZlbnQiLCJsaXN0ZW5lciIsInJlbW92ZUxpc3RlbmVyIiwiaWR4IiwiX2xlbiIsIl9rZXkiLCJfbGVuMiIsIl9rZXkyIiwiUmVhY3RQcm9wVHlwZXNTZWNyZXQiLCJ0eXBlU3BlY3MiLCJjb21wb25lbnROYW1lIiwiZ2V0U3RhY2siLCJ0eXBlU3BlY05hbWUiLCJleCIsInN0YWNrIiwiaXNSZXF1aXJlZCIsImNvbXBhcmF0b3IiLCJsdCIsImhvdF9yZWxvYWQiLCJfcHJvcHMkY29uZmlnJGhvdF9yZWwiLCJtYXhfcmV0cnkiLCJkaXNhYmxlZCIsImludGVydmFsSWQiLCJwYWNrYWdlcyIsIl9yZXRyeSIsIl9oZWFkIiwiY2xlYXJJbnRlcnZhbCIsInNldFN0YXRlIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwicHJldlN0YXRlIiwicmVsb2FkUmVxdWVzdCIsImhhcmQiLCJ3YXNfY3NzIiwiZmlsZXMiLCJpc19jc3MiLCJub2Rlc1RvRGlzYWJsZSIsIml0IiwiZXZhbHVhdGUiLCJpdGVyYXRlTmV4dCIsInNldEF0dHJpYnV0ZSIsImxpbmsiLCJocmVmIiwicmVsIiwiYXBwZW5kQ2hpbGQiLCJyZWxvYWQiLCJhbGVydCIsImNvbXBvbmVudERpZE1vdW50IiwiX3RoaXMkc3RhdGUiLCJzZXRJbnRlcnZhbCIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzIiwibnVtYmVyIiwiVW5jb25uZWN0ZWRUb29sYmFyIiwidW5kb0xpbmsiLCJvbkNsaWNrIiwicmVkb0xpbmsiLCJ1c2VNZW1vIiwidXNlU2VsZWN0b3IiLCJDeXRvc2NhcGUiLCJDeXRvc2NhcGVDb21wb25lbnQiLCJkYWdyZSIsImZjb3NlIiwiSlNPTlRyZWUiLCJzdHlsZXNoZWV0IiwidXBkYXRlU2VsZWN0ZWROb2RlIiwidXBkYXRlQ2hhbmdlZFByb3BzIiwidXBkYXRlQ2FsbGJhY2siLCJ1c2UiLCJnZW5lcmF0ZUVsZW1lbnRzIiwicHJvZmlsZSIsImV4dHJhTGlua3MiLCJjb25zdW1lZCIsImVsZW1lbnRzIiwic3RydWN0dXJlIiwicmVjb3JkTm9kZSIsInJhd1Byb3BlcnR5IiwiaWRUeXBlIiwicGFyZW50SWQiLCJjaGlsZElkIiwibGFiZWwiLCJwYXJlbnQiLCJyZWNvcmRFZGdlIiwiY2JQcm9maWxlIiwiY291bnQiLCJ0aW1lIiwidG90YWwiLCJtb2RlIiwicm91bmQiLCJsb2FkaW5nU2V0IiwiZXJyb3JTZXQiLCJub2RlSWQiLCJjaGlsZElkcyIsImNoaWxkRnJvbSIsImNoaWxkVG8iLCJyZWR1Y2VTdGF0dXMiLCJsYXRlc3QiLCJmbGF0dGVuT3V0cHV0cyIsImZsYXR0ZW5JbnB1dHMiLCJpbkFycmF5IiwiZmluYWwiLCJpbkl0ZW0iLCJjbGVhbk91dHB1dElkIiwib3V0cHV0SWQiLCJhZ2ciLCJjYlByZWZpeExlbiIsImRhZ3JlTGF5b3V0IiwicGFkZGluZyIsInJhbmtlciIsImZvcmNlTGF5b3V0IiwiYW5pbWF0ZSIsImxheW91dHMiLCJzcGFjaW5nRmFjdG9yIiwibm9kZVNlcCIsInJhbmtTZXAiLCJyYW5rRGlyIiwiZm9yY2UiLCJDYWxsYmFja0dyYXBoIiwiY2hhbmdlZCIsImxpZmVjeWNsZVN0YXRlIiwic2VsZWN0ZWQiLCJzZXRTZWxlY3RlZCIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwiY3l0b3NjYXBlIiwic2V0Q3l0b3NjYXBlIiwiZ3JhcGhMYXlvdXQiLCJjaG9zZW5UeXBlIiwiX2Nob3NlblR5cGUiLCJsYXlvdXRTZWxlY3RvciIsIl91c2VTdGF0ZTUiLCJfdXNlU3RhdGU2IiwibGF5b3V0VHlwZSIsInNldExheW91dFR5cGUiLCJ1c2VDeXRvc2NhcGVFZmZlY3QiLCJlZmZlY3QiLCJjb25kaXRpb24iLCJoYXNQYXR0ZXJucyIsImdldFByb3BWYWx1ZSIsInNldFByZXNldExheW91dCIsIl9sYXlvdXRTZWxlY3RvciRjdXJyZSIsImN5IiwicG9zaXRpb25zIiwibm9kZXMiLCJlYWNoIiwicG9zaXRpb24iLCJmaXQiLCJ6b29tIiwicGFuIiwiZWxlbWVudE5hbWUiLCJlbGVtZW50SW5mbyIsIl9nZXRDb21wb25lbnQiLCJyZXN0IiwiY2FsbGJhY2tPdXRwdXRJZCIsIm5ldHdvcmsiLCJjb21wdXRlIiwiYXZnIiwidGltaW5nIiwiZG93bmxvYWQiLCJ1cGxvYWQiLCJjeUxheW91dCIsInN0eWxlIiwid2lkdGgiLCJoZWlnaHQiLCJ0aGVtZSIsImxhYmVsUmVuZGVyZXIiLCJnZXRJdGVtU3RyaW5nIiwiaXRlbVR5cGUiLCJzaG91bGRFeHBhbmROb2RlIiwia2V5TmFtZSIsImxldmVsIiwib25DaGFuZ2UiLCJyZWYiLCJVbmNvbm5lY3RlZENhbGxiYWNrR3JhcGhDb250YWluZXIiLCJjb21wb25lbnREaWRDYXRjaCIsIm15SUQiLCJnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IiLCJDYWxsYmFja0dyYXBoQ29udGFpbmVyIiwic2VsZWN0b3IiLCJkaXNwbGF5IiwiY29sb3IiLCJnaG9zdCIsIm9wYWNpdHkiLCJTVEFUVVNNQVAiLCJnZXRFZGdlVHlwZXMiLCJjb25uZWN0ZWRFZGdlcyIsImFzY2VuZCIsImNvbGxlY3Rpb24iLCJlZGdlcyIsInBhcmVudHMiLCJzb3VyY2VzIiwibWVyZ2UiLCJhbmNlc3RvcnMiLCJkZXNjZW5kIiwiYWRkQ2xhc3MiLCJvdGhlciIsImFic29sdXRlQ29tcGxlbWVudCIsInJlbW92ZUNsYXNzIiwiZmxhc2hUaW1lIiwiZmxhc2hDbGFzcyIsImVkZ2VzVG8iLCJhdmdUaW1lIiwiaGFzQ2xhc3MiLCJ0aW1lTGVmdCIsInByZXZDaGlsZHJlbiIsIkNvbGxhcHNlSWNvbiIsIndlcmt6ZXVnQ3NzIiwiRnJvbnRFbmRFcnJvciIsImNvbGxhcHNlZCIsImlzTGlzdEl0ZW0iLCJpbkFsZXJ0c1RyYXkiLCJjYXJkQ2xhc3NlcyIsImVycm9ySGVhZGVyIiwidGltZXN0YW1wIiwidG9Mb2NhbGVUaW1lU3RyaW5nIiwiRXJyb3JDb250ZW50IiwiTUFYX01FU1NBR0VfTEVOR1RIIiwiVW5jb25uZWN0ZWRFcnJvckNvbnRlbnQiLCJsaW5lIiwic3Vic3RyaW5nIiwidG9Mb3dlckNhc2UiLCJzcmNEb2MiLCJib3JkZXIiLCJlcnJvclByb3BUeXBlcyIsIkZyb250RW5kRXJyb3JDb250YWluZXIiLCJlcnJvcnNPcGVuZWQiLCJjbGlja0hhbmRsZXIiLCJlcnJvcnNMZW5ndGgiLCJlcnJvckVsZW1lbnRzIiwiRGVidWdNZW51IiwiVW5jb25uZWN0ZWRHbG9iYWxFcnJvckNvbnRhaW5lciIsImhvdFJlbG9hZCIsIkdsb2JhbEVycm9yT3ZlcmxheSIsInZpc2libGUiLCJmcm9udEVuZEVycm9ycyIsIkJlbGxJY29uIiwiQ2hlY2tJY29uIiwiQ2xvY2tJY29uIiwiRGVidWdJY29uIiwiR3JhcGhJY29uIiwiT2ZmSWNvbiIsImNsYXNzZXMiLCJ2YXJpYW50IiwidmFyaWFudDIiLCJidXR0b25GYWN0b3J5IiwiZW5hYmxlZCIsImJ1dHRvblZhcmlhbnQiLCJ0b2dnbGUiLCJfSWNvbiIsImljb25WYXJpYW50Iiwib3BlbmVkIiwiY2FsbGJhY2tHcmFwaE9wZW5lZCIsImVyckNvdW50IiwidG9nZ2xlRXJyb3JzIiwiX1N0YXR1c0ljb24iLCJtZW51Q29udGVudCIsImFsZXJ0c0xhYmVsIiwib3BlblZhcmlhbnQiLCJSRURJUkVDVF9VUklfUEFUSE5BTUUiLCJPQVVUSF9DT09LSUVfTkFNRSIsIm1lc3NhZ2VQYXJ0cyIsImludmFsaWRQcm9wUGF0aCIsImV4cGVjdGVkUHJvcFR5cGUiLCJpbnZhbGlkUHJvcFR5cGVQcm92aWRlZCIsImpzb25TdXBwbGllZFZhbHVlIiwiU0lNUExFX0NPTVBPTkVOVF9UWVBFUyIsImxlbnNQYXRoIiwic2V0Iiwic3RvcmVQcmVmaXgiLCJrZXlQcmVmaXhNYXRjaCIsInByZWZpeCIsInNlcGFyYXRvciIsImZ1bGxTdHIiLCJmdWxsTGVuIiwiVU5ERUZJTkVEIiwiX3BhcnNlIiwiX3N0cmluZ2lmeSIsIldlYlN0b3JlIiwiX25hbWUiLCJfc3RvcmFnZSIsImhhc0l0ZW0iLCJnZXRJdGVtIiwiX3NldEl0ZW0iLCJzZXRJdGVtIiwicmVtb3ZlSXRlbSIsImNsZWFyIiwia2V5UHJlZml4IiwiZnVsbFByZWZpeCIsImtleU1hdGNoIiwia2V5c1RvUmVtb3ZlIiwiZnVsbEtleSIsIk1lbVN0b3JlIiwicG93IiwibG9uZ1N0cmluZyIsInN0b3JlcyIsIm1lbW9yeSIsImJhY2tFbmRzIiwibG9jYWwiLCJzZXNzaW9uIiwidHJ5R2V0V2ViU3RvcmUiLCJmYWxsYmFja1N0b3JlIiwic3RvcmVUZXN0IiwidGVzdEtleSIsImdldFN0b3JlIiwibm9vcFRyYW5zZm9ybSIsImV4dHJhY3QiLCJwcm9wVmFsdWUiLCJzdG9yZWRWYWx1ZSIsIl9wcm9wVmFsdWUiLCJnZXRUcmFuc2Zvcm0iLCJwcm9wUGFydCIsInBlcnNpc3RlbmNlVHJhbnNmb3JtcyIsImdldFZhbHNLZXkiLCJwZXJzaXN0ZWRQcm9wIiwicGVyc2lzdGVuY2UiLCJnZXRQcm9wcyIsImdldFZhbCIsInBlcnNpc3RlZF9wcm9wcyIsInBlcnNpc3RlbmNlX3R5cGUiLCJjYW5QZXJzaXN0IiwiX2dldFByb3BzIiwiX3BlcnNpc3RlZFByb3Akc3BsaXQiLCJfcGVyc2lzdGVkUHJvcCRzcGxpdDIiLCJzdG9yYWdlIiwiX2dldFRyYW5zZm9ybSIsInZhbHNLZXkiLCJvcmlnaW5hbFZhbCIsIm5ld1ZhbCIsInBlcnNpc3RlbmNlTW9kcyIsIlVORE8iLCJtb2RQcm9wIiwidXBkYXRlIiwiX3N0b3JhZ2UkZ2V0SXRlbSIsIl9zdG9yYWdlJGdldEl0ZW0yIiwiZnJvbVZhbCIsInRvVmFsIiwiX3BlcnNpc3RlZFByb3Akc3BsaXQzIiwiX3BlcnNpc3RlZFByb3Akc3BsaXQ0IiwiX2dldFByb3BzMiIsImxheW91dE91dCIsIl9nZXRQcm9wczMiLCJnZXRGaW5hbCIsInByZXZWYWwiLCJmaW5hbFBlcnNpc3RlbmNlIiwiZmluYWxQZXJzaXN0ZW5jZVR5cGUiLCJmaW5hbFBlcnNpc3RlZFByb3BzIiwicGVyc2lzdGVuY2VDaGFuZ2VkIiwibm90SW5OZXdQcm9wcyIsImRlcGVyc2lzdGVkUHJvcHMiLCJmaW5hbFN0b3JhZ2UiLCJwcm9wVHJhbnNmb3JtcyIsImNyZWF0ZUFwaVJlZHVjZXIiLCJBcGlSZWR1Y2VyIiwibmV3U3RhdGUiLCJfYWN0aW9uJHBheWxvYWQiLCJuZXdSZXF1ZXN0IiwiaW5pdGlhbENoYW5nZSIsImNoaWxkcmVuX3Byb3BzIiwic3RhdGVMaXN0IiwiU1RBUlRFRCIsIkhZRFJBVEVEIiwiREVTVFJPWUVEIiwiaW5pdGlhbEdyYXBoIiwiaW5pdGlhbEVycm9yIiwiaW5pdGlhbEhpc3RvcnkiLCJwcmVzZW50IiwibmV3UGFzdCIsIm5ld0Z1dHVyZSIsImN1c3RvbUhvb2tzIiwiYmVhciIsInZpZXciLCJwcm9wUGF0aCIsImV4aXN0aW5nUHJvcHMiLCJtZXJnZWRQcm9wcyIsImluaXRpYWxQYXRocyIsImNsb25lIiwiZGVmYXVsdFByb2ZpbGUiLCJkZWZhdWx0U3RhdGUiLCJzdGF0dXNNYXBwZWQiLCJjYlJlc291cmNlcyIsInRvdGFsUmVzb3VyY2VzIiwidXNlciIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllcyIsIl9leGNsdWRlZCIsImNvbWJpbmVSZWR1Y2VycyIsImFwaVJlcXVlc3RzIiwibWFpblJlZHVjZXIiLCJnZXRJbnB1dEhpc3RvcnlTdGF0ZSIsInJlY29yZENoYW5nZXMiLCJyZWZQcm9wcyIsImhpc3RvcnlFbnRyeSIsInByb3BLZXkiLCJyZWNvcmRIaXN0b3J5IiwibmV4dFN0YXRlIiwicmVsb2FkZXJSZWR1Y2VyIiwid2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJmYWN0b3J5IiwiZXhwb3J0cyIsImFtZCIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzE0MF9fIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsInRndCIsInNyY3MiLCJzcmMiLCJfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwic2xpY2VJdGVyYXRvciIsIl9hcnIiLCJfbiIsIl9kIiwiX2UiLCJfaSIsIl9zIiwiTGlua2VkTGlzdCIsImxheW91dEJhc2UiLCJhdXhpbGlhcnkiLCJnZXRUb3BNb3N0Tm9kZXMiLCJub2Rlc01hcCIsInJvb3RzIiwiZWxlIiwiY29ubmVjdENvbXBvbmVudHMiLCJlbGVzIiwidG9wTW9zdE5vZGVzIiwiZHVtbXlOb2RlcyIsInF1ZXVlIiwidmlzaXRlZCIsInZpc2l0ZWRUb3BNb3N0Tm9kZXMiLCJjdXJyZW50TmVpZ2hib3IiLCJtaW5EZWdyZWVOb2RlIiwibWluRGVncmVlIiwiaXNDb25uZWN0ZWQiLCJub2Rlc0Nvbm5lY3RlZFRvRHVtbXkiLCJjbXB0IiwiY3VycmVudE5vZGUiLCJjaGlsZHJlbk9mQ3VycmVudE5vZGUiLCJkZXNjZW5kYW50cyIsIl9sb29wMiIsInNoaWZ0IiwibmVpZ2hib3JOb2RlcyIsIm5laWdoYm9yaG9vZCIsImVkZ2VzV2l0aCIsIm5laWdoYm9yTm9kZSIsInVuaW9uIiwiY2hpbGRyZW5PZk5laWdoYm9yIiwidGVtcCIsInNpemUiLCJyZWxvY2F0ZUNvbXBvbmVudCIsIm9yaWdpbmFsQ2VudGVyIiwiY29tcG9uZW50UmVzdWx0IiwiZml4ZWROb2RlQ29uc3RyYWludCIsIm1pblhDb29yZCIsIlBPU0lUSVZFX0lORklOSVRZIiwibWF4WENvb3JkIiwiTkVHQVRJVkVfSU5GSU5JVFkiLCJtaW5ZQ29vcmQiLCJtYXhZQ29vcmQiLCJxdWFsaXR5IiwiX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiIsIl9kaWRJdGVyYXRvckVycm9yIiwiX2l0ZXJhdG9yRXJyb3IiLCJub2RlSW5kZXhlcyIsImN5Tm9kZSIsIm5vZGVCQiIsImJvdW5kaW5nQm94IiwibGVmdFgiLCJ4Q29vcmRzIiwidyIsInJpZ2h0WCIsInRvcFkiLCJ5Q29vcmRzIiwiYm90dG9tWSIsImRpZmZPblgiLCJ4IiwiZGlmZk9uWSIsImdldFJlY3QiLCJfZGlmZk9uWCIsIl9kaWZmT25ZIiwic2V0Q2VudGVyIiwiZ2V0Q2VudGVyWCIsImdldENlbnRlclkiLCJjYWxjQm91bmRpbmdCb3giLCJwYXJlbnROb2RlIiwibGVmdCIsIk1BWF9TQUZFX0lOVEVHRVIiLCJyaWdodCIsIk1JTl9TQUZFX0lOVEVHRVIiLCJ0b3AiLCJib3R0b20iLCJub2RlTGVmdCIsIm5vZGVSaWdodCIsIm5vZGVUb3AiLCJub2RlQm90dG9tIiwibm90IiwidG9wTGVmdFgiLCJ0b3BMZWZ0WSIsImNhbGNQYXJlbnRzV2l0aG91dENoaWxkcmVuIiwicGFyZW50c1dpdGhvdXRDaGlsZHJlbiIsImNoZWNrIiwiY3NzIiwiYXV4IiwiQ29TRUxheW91dCIsIkNvU0VOb2RlIiwiUG9pbnREIiwiRGltZW5zaW9uRCIsIkxheW91dENvbnN0YW50cyIsIkZETGF5b3V0Q29uc3RhbnRzIiwiQ29TRUNvbnN0YW50cyIsImNvc2VMYXlvdXQiLCJzcGVjdHJhbFJlc3VsdCIsImlkVG9MTm9kZSIsInJhbmRvbWl6ZSIsImlzRm4iLCJvcHRGbiIsIm9wdCIsInByb2Nlc3NDaGlsZHJlbkxpc3QiLCJ0aGVDaGlsZCIsImNoaWxkcmVuX29mX2NoaWxkcmVuIiwidGhlTm9kZSIsImRpbWVuc2lvbnMiLCJsYXlvdXREaW1lbnNpb25zIiwibm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzIiwib3V0ZXJXaWR0aCIsIm91dGVySGVpZ2h0IiwiaXNQYXJlbnQiLCJncmFwaE1hbmFnZXIiLCJwYXJzZUZsb2F0IiwicGFyZW50SW5mbyIsIm5vZGVSZXB1bHNpb24iLCJwYWRkaW5nTGVmdCIsInBhcnNlSW50IiwicGFkZGluZ1RvcCIsInBhZGRpbmdSaWdodCIsInBhZGRpbmdCb3R0b20iLCJsYWJlbFdpZHRoIiwiaW5jbHVkZUxhYmVscyIsImluY2x1ZGVOb2RlcyIsImluY2x1ZGVPdmVybGF5cyIsImxhYmVsSGVpZ2h0IiwibGFiZWxQb3NWZXJ0aWNhbCIsImxhYmVsUG9zSG9yaXpvbnRhbCIsInJlY3QiLCJ0aGVOZXdHcmFwaCIsImdldEdyYXBoTWFuYWdlciIsIm5ld0dyYXBoIiwicHJvY2Vzc0VkZ2VzIiwiZ20iLCJpZGVhbExlbmd0aFRvdGFsIiwiZWRnZUNvdW50IiwiZWRnZSIsInNvdXJjZU5vZGUiLCJ0YXJnZXROb2RlIiwiZ2V0RWRnZXNCZXR3ZWVuIiwiZTEiLCJuZXdFZGdlIiwiaWRlYWxMZW5ndGgiLCJpZGVhbEVkZ2VMZW5ndGgiLCJlZGdlRWxhc3RpY2l0eSIsIkRFRkFVTFRfRURHRV9MRU5HVEgiLCJNSU5fUkVQVUxTSU9OX0RJU1QiLCJERUZBVUxUX1JBRElBTF9TRVBBUkFUSU9OIiwicHJvY2Vzc0NvbnN0cmFpbnRzIiwiY29uc3RyYWludHMiLCJhbGlnbm1lbnRDb25zdHJhaW50IiwicmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50IiwibmVzdGluZ0ZhY3RvciIsIlBFUl9MRVZFTF9JREVBTF9FREdFX0xFTkdUSF9GQUNUT1IiLCJncmF2aXR5IiwiREVGQVVMVF9HUkFWSVRZX1NUUkVOR1RIIiwibnVtSXRlciIsIk1BWF9JVEVSQVRJT05TIiwiZ3Jhdml0eVJhbmdlIiwiREVGQVVMVF9HUkFWSVRZX1JBTkdFX0ZBQ1RPUiIsImdyYXZpdHlDb21wb3VuZCIsIkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9TVFJFTkdUSCIsImdyYXZpdHlSYW5nZUNvbXBvdW5kIiwiREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1JBTkdFX0ZBQ1RPUiIsImluaXRpYWxFbmVyZ3lPbkluY3JlbWVudGFsIiwiREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCIsInRpbGluZ0NvbXBhcmVCeSIsIlRJTElOR19DT01QQVJFX0JZIiwiUVVBTElUWSIsIk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUyIsIkRFRkFVTFRfSU5DUkVNRU5UQUwiLCJBTklNQVRFIiwiVElMRSIsInRpbGUiLCJUSUxJTkdfUEFERElOR19WRVJUSUNBTCIsInRpbGluZ1BhZGRpbmdWZXJ0aWNhbCIsIlRJTElOR19QQURESU5HX0hPUklaT05UQUwiLCJ0aWxpbmdQYWRkaW5nSG9yaXpvbnRhbCIsIlBVUkVfSU5DUkVNRU5UQUwiLCJERUZBVUxUX1VOSUZPUk1fTEVBRl9OT0RFX1NJWkVTIiwidW5pZm9ybU5vZGVEaW1lbnNpb25zIiwic3RlcCIsIlRSQU5TRk9STV9PTl9DT05TVFJBSU5UX0hBTkRMSU5HIiwiRU5GT1JDRV9DT05TVFJBSU5UUyIsIkFQUExZX0xBWU9VVCIsIlRSRUVfUkVEVUNUSU9OX09OX0lOQ1JFTUVOVEFMIiwibmV3R3JhcGhNYW5hZ2VyIiwiYWRkUm9vdCIsInJ1bkxheW91dCIsImRlc2NyaXB0b3IiLCJDb25zdHJ1Y3RvciIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsImluc3RhbmNlIiwiX3JlcXVpcmUiLCJzcGVjdHJhbExheW91dCIsIl9yZXF1aXJlMiIsImRlZmF1bHRzIiwiZnJlZXplIiwiYW5pbWF0aW9uRHVyYXRpb24iLCJhbmltYXRpb25FYXNpbmciLCJwYWNrQ29tcG9uZW50cyIsInNhbXBsaW5nVHlwZSIsInNhbXBsZVNpemUiLCJub2RlU2VwYXJhdGlvbiIsInBpVG9sIiwiTGF5b3V0IiwicnVuIiwiY29zZVJlc3VsdCIsImNvbXBvbmVudENlbnRlcnMiLCJ2ZXJ0aWNhbCIsImhvcml6b250YWwiLCJjb25zdHJhaW50RXhpc3QiLCJsYXlVdGlsIiwicGFja2luZ0VuYWJsZWQiLCJsYXlvdXRVdGlsaXRpZXMiLCJ4MSIsInkxIiwidG9CZVRpbGVkTm9kZXMiLCJNYXAiLCJfeENvb3JkcyIsIl95Q29vcmRzIiwidGVtcFNwZWN0cmFsUmVzdWx0IiwiaW5kZXhlc1RvQmVEZWxldGVkIiwiX2JvdW5kaW5nQm94IiwiY29tcG9uZW50c0V2YWx1YXRlZCIsInN1YmdyYXBocyIsImhpZGRlbkVsZXMiLCJzdWJncmFwaCIsIm5vZGVJbmRleCIsImJvdW5kaW5nYm94IiwiZ2V0TGVmdCIsImdldFRvcCIsImdldFdpZHRoIiwiZ2V0SGVpZ2h0Iiwic291cmNlTm9kZUluZGV4IiwidGFyZ2V0Tm9kZUluZGV4Iiwic291cmNlQ2VudGVyIiwidGFyZ2V0Q2VudGVyIiwiX3BhcmVudEluZm8iLCJzdGFydFgiLCJzdGFydFkiLCJlbmRYIiwiZW5kWSIsInNoaWZ0UmVzdWx0Iiwic2hpZnRzIiwibmV3WENvb3JkcyIsImR4IiwibmV3WUNvb3JkcyIsImR5IiwiX2NvdW50Iiwibm9kZVJlY3RhbmdsZSIsImdldFBvc2l0aW9ucyIsInBvcyIsInRoZUlkIiwiX3BvcyIsIl9oaWRkZW5FbGVzIiwibGF5b3V0UG9zaXRpb25zIiwiTWF0cml4IiwiU1ZEIiwicGFyZW50Tm9kZXMiLCJwYXJlbnRDaGlsZE1hcCIsImFsbE5vZGVzTmVpZ2hib3Job29kIiwic2FtcGxlc0NvbHVtbiIsIm1pbkRpc3RhbmNlc0NvbHVtbiIsIkMiLCJQSEkiLCJJTlYiLCJmaXJzdFNhbXBsZSIsIm5vZGVTaXplIiwiaW5maW5pdHkiLCJzbWFsbCIsInJhbmRvbVNhbXBsZUNSIiwic2FtcGxlIiwiZmxhZyIsImZsb29yIiwiQkZTIiwicGl2b3QiLCJzYW1wbGluZ01ldGhvZCIsImRpc3RhbmNlIiwibWF4X2Rpc3QiLCJtYXhfaW5kIiwibmVpZ2hib3JzIiwiX2kyIiwiX2kzIiwiYWxsQkZTIiwiX2k0IiwiX2k1IiwiX2k2IiwiX2k3IiwiX2k4IiwiX2oiLCJTVkRSZXN1bHQiLCJzdmQiLCJhX3EiLCJTIiwiYV91IiwiVSIsImFfdiIsIlYiLCJtYXhfcyIsImFfU2lnIiwibXVsdE1hdCIsInRyYW5zcG9zZSIsInBvd2VySXRlcmF0aW9uIiwidGhldGExIiwidGhldGEyIiwiWTEiLCJZMiIsIlYxIiwiVjIiLCJub3JtYWxpemUiLCJfaTkiLCJtdWx0R2FtbWEiLCJtdWx0TCIsImRvdFByb2R1Y3QiLCJhYnMiLCJfaTEwIiwiX2kxMSIsIm1pbnVzT3AiLCJtdWx0Q29ucyIsIl9pMTIiLCJzcXJ0IiwiX2kxMyIsImVsZTIiLCJlbGVJbmRleCIsImRpc2Nvbm5lY3RlZElkIiwiX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIiLCJfZGlkSXRlcmF0b3JFcnJvcjIiLCJfaXRlcmF0b3JFcnJvcjIiLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwiX2kxNCIsIl9pMTUiLCJmaXJzdE5vZGVQb3MiLCJmaXJzdE5vZGVXaWR0aCIsInNlY29uZE5vZGUiLCJzZWNvbmROb2RlV2lkdGgiLCJpbXBsIiwicmVnaXN0ZXIiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsIl9fd2VicGFja19leHBvcnRzX18iLCJwYW5uaW5nRW5hYmxlZCIsInVzZXJQYW5uaW5nRW5hYmxlZCIsIm1pblpvb20iLCJtYXhab29tIiwiem9vbWluZ0VuYWJsZWQiLCJ1c2VyWm9vbWluZ0VuYWJsZWQiLCJib3hTZWxlY3Rpb25FbmFibGVkIiwiYXV0b3VuZ3JhYmlmeSIsImF1dG9sb2NrIiwiYXV0b3Vuc2VsZWN0aWZ5IiwidG9Kc29uIiwiaGVhZGxlc3MiLCJzdHlsZUVuYWJsZWQiLCJoaWRlRWRnZXNPblZpZXdwb3J0IiwidGV4dHVyZU9uVmlld3BvcnQiLCJtb3Rpb25CbHVyIiwibW90aW9uQmx1ck9wYWNpdHkiLCJ3aGVlbFNlbnNpdGl2aXR5IiwicGl4ZWxSYXRpbyIsIm0iLCJFIiwiZnJvbUpzb24iLCJlbGUxIiwiTyIsInNjcmF0Y2giLCJfZSRDb21wb25lbnQiLCJjb250YWluZXJSZWYiLCJjcmVhdGVSZWYiLCJnbG9iYWwiLCJfY3kiLCJ1cGRhdGVDeXRvc2NhcGUiLCJkZXN0cm95Iiwibm9ybWFsaXplRWxlbWVudHMiLCJSZWFjdFJlZHV4Q29udGV4dCIsImNyZWF0ZVN1YnNjcmlwdGlvbiIsInVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QiLCJzZXJ2ZXJTdGF0ZSIsImNvbnRleHRWYWx1ZSIsInN1YnNjcmlwdGlvbiIsImdldFNlcnZlclN0YXRlIiwicHJldmlvdXNTdGF0ZSIsIm9uU3RhdGVDaGFuZ2UiLCJub3RpZnlOZXN0ZWRTdWJzIiwidHJ5U3Vic2NyaWJlIiwidHJ5VW5zdWJzY3JpYmUiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSIsImhvaXN0U3RhdGljcyIsImlzVmFsaWRFbGVtZW50VHlwZSIsImlzQ29udGV4dENvbnN1bWVyIiwiZGVmYXVsdFNlbGVjdG9yRmFjdG9yeSIsIm1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcnkiLCJtYXBTdGF0ZVRvUHJvcHNGYWN0b3J5IiwibWVyZ2VQcm9wc0ZhY3RvcnkiLCJzaGFsbG93RXF1YWwiLCJ3YXJuaW5nIiwibm90SW5pdGlhbGl6ZWQiLCJ1c2VTeW5jRXh0ZXJuYWxTdG9yZSIsImluaXRpYWxpemVDb25uZWN0IiwiRU1QVFlfQVJSQVkiLCJOT19TVUJTQ1JJUFRJT05fQVJSQVkiLCJzdHJpbmdpZnlDb21wb25lbnQiLCJDb21wIiwidXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdFdpdGhBcmdzIiwiZWZmZWN0RnVuYyIsImVmZmVjdEFyZ3MiLCJjYXB0dXJlV3JhcHBlclByb3BzIiwibGFzdFdyYXBwZXJQcm9wcyIsImxhc3RDaGlsZFByb3BzIiwicmVuZGVySXNTY2hlZHVsZWQiLCJ3cmFwcGVyUHJvcHMiLCJjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlIiwic3Vic2NyaWJlVXBkYXRlcyIsInNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyIsImNoaWxkUHJvcHNTZWxlY3RvciIsImlzTW91bnRlZCIsImFkZGl0aW9uYWxTdWJzY3JpYmVMaXN0ZW5lciIsImRpZFVuc3Vic2NyaWJlIiwibGFzdFRocm93bkVycm9yIiwiY2hlY2tGb3JVcGRhdGVzIiwibGF0ZXN0U3RvcmVTdGF0ZSIsIm5ld0NoaWxkUHJvcHMiLCJ1bnN1YnNjcmliZVdyYXBwZXIiLCJpbml0U3RhdGVVcGRhdGVzIiwic3RyaWN0RXF1YWwiLCJoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRQdXJlT3B0aW9uIiwibWFwU3RhdGVUb1Byb3BzIiwibWFwRGlzcGF0Y2hUb1Byb3BzIiwibWVyZ2VQcm9wcyIsInB1cmUiLCJfcmVmJGFyZVN0YXRlc0VxdWFsIiwiYXJlU3RhdGVzRXF1YWwiLCJfcmVmJGFyZU93blByb3BzRXF1YWwiLCJhcmVPd25Qcm9wc0VxdWFsIiwiX3JlZiRhcmVTdGF0ZVByb3BzRXF1IiwiYXJlU3RhdGVQcm9wc0VxdWFsIiwiX3JlZiRhcmVNZXJnZWRQcm9wc0VxIiwiYXJlTWVyZ2VkUHJvcHNFcXVhbCIsIl9yZWYkZm9yd2FyZFJlZiIsImZvcndhcmRSZWYiLCJfcmVmJGNvbnRleHQiLCJpbml0TWFwU3RhdGVUb1Byb3BzIiwiaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyIsImluaXRNZXJnZVByb3BzIiwid3JhcFdpdGhDb25uZWN0IiwiV3JhcHBlZENvbXBvbmVudCIsIndyYXBwZWRDb21wb25lbnROYW1lIiwic2VsZWN0b3JGYWN0b3J5T3B0aW9ucyIsIkNvbm5lY3RGdW5jdGlvbiIsIl91c2VNZW1vIiwicmVhY3RSZWR1eEZvcndhcmRlZFJlZiIsIl91c2VNZW1vMiIsInByb3BzQ29udGV4dCIsIkNvbnRleHRUb1VzZSIsIkNvbnN1bWVyIiwiZGlkU3RvcmVDb21lRnJvbVByb3BzIiwiZGlkU3RvcmVDb21lRnJvbUNvbnRleHQiLCJfdXNlTWVtbzMiLCJfdXNlTWVtbzQiLCJvdmVycmlkZGVuQ29udGV4dFZhbHVlIiwiaXNQcm9jZXNzaW5nRGlzcGF0Y2giLCJsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yIiwiYWN0dWFsQ2hpbGRQcm9wc1NlbGVjdG9yIiwic3Vic2NyaWJlRm9yUmVhY3QiLCJyZWFjdExpc3RlbmVyIiwiYWN0dWFsQ2hpbGRQcm9wcyIsInJlbmRlcmVkV3JhcHBlZENvbXBvbmVudCIsInJlbmRlcmVkQ2hpbGQiLCJfQ29ubmVjdCIsIkNvbm5lY3QiLCJfZm9yd2FyZGVkIiwiZm9yd2FyZENvbm5lY3RSZWYiLCJmb3J3YXJkZWQiLCJjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeSIsImJpbmRBY3Rpb25DcmVhdG9ycyIsIndyYXBNYXBUb1Byb3BzQ29uc3RhbnQiLCJ3cmFwTWFwVG9Qcm9wc0Z1bmMiLCJ2ZXJpZnlQbGFpbk9iamVjdCIsImRlZmF1bHRNZXJnZVByb3BzIiwic3RhdGVQcm9wcyIsImRpc3BhdGNoUHJvcHMiLCJvd25Qcm9wcyIsIndyYXBNZXJnZVByb3BzRnVuYyIsImluaXRNZXJnZVByb3BzUHJveHkiLCJoYXNSdW5PbmNlIiwibWVyZ2VQcm9wc1Byb3h5IiwibmV4dE1lcmdlZFByb3BzIiwidmVyaWZ5U3Vic2VsZWN0b3JzIiwicHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkiLCJoYXNSdW5BdExlYXN0T25jZSIsImhhbmRsZUZpcnN0Q2FsbCIsImZpcnN0U3RhdGUiLCJmaXJzdE93blByb3BzIiwiaGFuZGxlTmV3UHJvcHNBbmROZXdTdGF0ZSIsImRlcGVuZHNPbk93blByb3BzIiwiaGFuZGxlTmV3UHJvcHMiLCJoYW5kbGVOZXdTdGF0ZSIsIm5leHRTdGF0ZVByb3BzIiwic3RhdGVQcm9wc0NoYW5nZWQiLCJoYW5kbGVTdWJzZXF1ZW50Q2FsbHMiLCJuZXh0T3duUHJvcHMiLCJwcm9wc0NoYW5nZWQiLCJzdGF0ZUNoYW5nZWQiLCJwdXJlRmluYWxQcm9wc1NlbGVjdG9yIiwiZmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeSIsInZlcmlmeSIsIm1ldGhvZE5hbWUiLCJnZXRDb25zdGFudCIsImluaXRDb25zdGFudFNlbGVjdG9yIiwiY29uc3RhbnQiLCJjb25zdGFudFNlbGVjdG9yIiwiZ2V0RGVwZW5kc09uT3duUHJvcHMiLCJtYXBUb1Byb3BzIiwiaW5pdFByb3h5U2VsZWN0b3IiLCJwcm94eSIsIm1hcFRvUHJvcHNQcm94eSIsInN0YXRlT3JEaXNwYXRjaCIsImRldGVjdEZhY3RvcnlBbmRWZXJpZnkiLCJ1c2VEaXNwYXRjaCIsImNyZWF0ZURpc3BhdGNoSG9vayIsImNyZWF0ZVNlbGVjdG9ySG9vayIsInVzZVN0b3JlIiwiY3JlYXRlU3RvcmVIb29rIiwidXNlRGVmYXVsdFN0b3JlIiwidXNlUmVkdXhDb250ZXh0IiwidXNlRGVidWdWYWx1ZSIsInVzZURlZmF1bHRSZWR1eENvbnRleHQiLCJ1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvciIsImluaXRpYWxpemVVc2VTZWxlY3RvciIsInJlZkVxdWFsaXR5IiwiZXF1YWxpdHlGbiIsIl91c2VSZWR1eENvbnRleHQiLCJzZWxlY3RlZFN0YXRlIiwiYWRkTmVzdGVkU3ViIiwidW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMiLCJzZXRCYXRjaCIsImdldEJhdGNoIiwiY3JlYXRlTGlzdGVuZXJDb2xsZWN0aW9uIiwiZmlyc3QiLCJsaXN0ZW5lcnMiLCJpc1N1YnNjcmliZWQiLCJ1bnN1YnNjcmliZSIsIm51bGxMaXN0ZW5lcnMiLCJwYXJlbnRTdWIiLCJoYW5kbGVDaGFuZ2VXcmFwcGVyIiwiZ2V0TGlzdGVuZXJzIiwiZGVmYXVsdE5vb3BCYXRjaCIsIm5ld0JhdGNoIiwiYWN0aW9uQ3JlYXRvcnMiLCJib3VuZEFjdGlvbkNyZWF0b3JzIiwiYWN0aW9uQ3JlYXRvciIsImlzUGxhaW5PYmplY3QiLCJwcm90byIsImJhc2VQcm90byIsIm9iakEiLCJvYmpCIiwia2V5c0EiLCJrZXlzQiIsInVzZUxheW91dEVmZmVjdCIsImNhblVzZURPTSIsIlJFQUNUX0VMRU1FTlRfVFlQRSIsImZvciIsIlJFQUNUX1BPUlRBTF9UWVBFIiwiUkVBQ1RfRlJBR01FTlRfVFlQRSIsIlJFQUNUX1NUUklDVF9NT0RFX1RZUEUiLCJSRUFDVF9QUk9GSUxFUl9UWVBFIiwiUkVBQ1RfUFJPVklERVJfVFlQRSIsIlJFQUNUX0NPTlRFWFRfVFlQRSIsIlJFQUNUX1NFUlZFUl9DT05URVhUX1RZUEUiLCJSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIiwiUkVBQ1RfU1VTUEVOU0VfVFlQRSIsIlJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSIsIlJFQUNUX01FTU9fVFlQRSIsIlJFQUNUX0xBWllfVFlQRSIsIlJFQUNUX09GRlNDUkVFTl9UWVBFIiwiZW5hYmxlU2NvcGVBUEkiLCJlbmFibGVDYWNoZUVsZW1lbnQiLCJlbmFibGVUcmFuc2l0aW9uVHJhY2luZyIsImVuYWJsZUxlZ2FjeUhpZGRlbiIsImVuYWJsZURlYnVnVHJhY2luZyIsIlJFQUNUX01PRFVMRV9SRUZFUkVOQ0UiLCIkJHR5cGVvZiIsImdldE1vZHVsZUlkIiwidHlwZU9mIiwiJCR0eXBlb2ZUeXBlIiwiQ29udGV4dENvbnN1bWVyIiwiQ29udGV4dFByb3ZpZGVyIiwiRWxlbWVudCIsIkZvcndhcmRSZWYiLCJMYXp5IiwiTWVtbyIsIlBvcnRhbCIsIlByb2ZpbGVyIiwiU3RyaWN0TW9kZSIsIlN1c3BlbnNlIiwiU3VzcGVuc2VMaXN0IiwiaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUiLCJoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlIiwiaXNBc3luY01vZGUiLCJpc0NvbmN1cnJlbnRNb2RlIiwiaXNDb250ZXh0UHJvdmlkZXIiLCJpc0VsZW1lbnQiLCJpc0ZvcndhcmRSZWYiLCJpc0ZyYWdtZW50IiwiaXNMYXp5IiwiaXNNZW1vIiwiaXNQb3J0YWwiLCJpc1Byb2ZpbGVyIiwiaXNTdHJpY3RNb2RlIiwiaXNTdXNwZW5zZSIsImlzU3VzcGVuc2VMaXN0IiwiRiIsIlQiLCJfY3VycnkyIiwiX2NvbmNhdCIsIl9jdXJyeTEiLCJjdXJyeU4iLCJvcmlnRm4iLCJsaXN0IiwiYWRkSW5kZXhSaWdodCIsIl9jdXJyeTMiLCJhZGp1c3QiLCJfaWR4IiwiX2xpc3QiLCJfZGlzcGF0Y2hhYmxlIiwiX3hhbGwiLCJhbGxQYXNzIiwicHJlZHMiLCJhbHdheXMiLCJhbmQiLCJfYXNzZXJ0UHJvbWlzZSIsImFuZFRoZW4iLCJfeGFueSIsImFueVBhc3MiLCJfcmVkdWNlIiwiYXBwbHlGIiwiYXBwbHlYIiwiYWNjIiwiX2FwZXJ0dXJlIiwiX3hhcGVydHVyZSIsImFwZXJ0dXJlIiwiZWwiLCJfaXNBcnJheSIsIm1hcFZhbHVlcyIsImFwcGx5U3BlYyIsImFwcGx5VG8iLCJhYSIsImJiIiwiX2hhcyIsIl9pc0ludGVnZXIiLCJfYXNzb2MiLCJuZXh0T2JqIiwibkFyeSIsImJpbmFyeSIsIl9hcml0eSIsInRoaXNPYmoiLCJfaXNGdW5jdGlvbiIsImxpZnQiLCJib3RoIiwiX2JvdGgiLCJfbWFrZUZsYXQiLCJfeGNoYWluIiwiY2hhaW4iLCJtb25hZCIsImNsYW1wIiwiX2Nsb25lIiwiY29sbGVjdEJ5IiwidGFnIiwibmV3TGlzdCIsInByZWQiLCJjb21wbGVtZW50IiwicGlwZSIsImNvbXBvc2UiLCJwaXBlV2l0aCIsImNvbXBvc2VXaXRoIiwieGYiLCJfaXNTdHJpbmciLCJjb25kIiwicGFpcnMiLCJhcml0eSIsInBhaXIiLCJjb25zdHJ1Y3ROIiwiY29uc3RydWN0IiwiRm4iLCJjdXJyeSIsIiQwIiwiJDEiLCIkMiIsIiQzIiwiJDQiLCIkNSIsIiQ2IiwiJDciLCIkOCIsIiQ5IiwiX21hcCIsImNvbnZlcmdlIiwiYWZ0ZXIiLCJmbnMiLCJyZWR1Y2VCeSIsImNvdW50QnkiLCJlbGVtIiwiX2N1cnJ5TiIsImRlYyIsImRlZmF1bHRUbyIsIl9TZXQiLCJzZWNvbmQiLCJmaXJzdExlbiIsInNlY29uZExlbiIsInRvRmlsdGVyT3V0IiwiX2luY2x1ZGVzV2l0aCIsImRpZmZlcmVuY2VXaXRoIiwiX2Rpc3NvYyIsIl9zaGFsbG93Q2xvbmVPYmplY3QiLCJkaXZpZGUiLCJfeGRyb3AiLCJkcm9wIiwieHMiLCJJbmZpbml0eSIsIl9kcm9wTGFzdCIsIl94ZHJvcExhc3QiLCJkcm9wTGFzdCIsIl9kcm9wTGFzdFdoaWxlIiwiX3hkcm9wTGFzdFdoaWxlIiwiZHJvcExhc3RXaGlsZSIsIl94ZHJvcFJlcGVhdHNXaXRoIiwiZHJvcFJlcGVhdHNXaXRoIiwiZHJvcFJlcGVhdHMiLCJlcUJ5IiwiZHJvcFJlcGVhdHNCeSIsIl94ZHJvcFdoaWxlIiwiZHJvcFdoaWxlIiwib3IiLCJlaXRoZXIiLCJfZWl0aGVyIiwiX2lzQXJndW1lbnRzIiwiX2lzT2JqZWN0IiwiX2lzVHlwZWRBcnJheSIsInRha2VMYXN0IiwiZW5kc1dpdGgiLCJzdWZmaXgiLCJlcVByb3BzIiwib2JqMSIsIm9iajIiLCJfZXF1YWxzIiwidHJhbnNmb3JtYXRpb25zIiwidHJhbnNmb3JtYXRpb24iLCJfYXJyYXlSZWR1Y2UiLCJfZmlsdGVyIiwiX3hmaWx0ZXIiLCJmaWx0ZXJhYmxlIiwiX3hmaW5kIiwiX3hmaW5kSW5kZXgiLCJfeGZpbmRMYXN0IiwiZmluZExhc3QiLCJfeGZpbmRMYXN0SW5kZXgiLCJmaW5kTGFzdEluZGV4IiwiZmxpcCIsIl9jaGVja0Zvck1ldGhvZCIsImtleUxpc3QiLCJmcm9tUGFpcnMiLCJncm91cFdpdGgiLCJuZXh0aWR4IiwiZ3QiLCJndGUiLCJoYXNQYXRoIiwiaGFzSW4iLCJudGgiLCJfb2JqZWN0SXMiLCJpZGVudGljYWwiLCJ1bmFyeUlkZW50aWNhbCIsIl9iIiwiX2lkZW50aXR5IiwiaWZFbHNlIiwib25UcnVlIiwib25GYWxzZSIsIl9pZkVsc2UiLCJpbmMiLCJfaW5jbHVkZXMiLCJpbmRleEJ5IiwiaW5pdCIsImlubmVySm9pbiIsImluc2VydEFsbCIsImludGVyc3BlcnNlIiwiaW50byIsImludmVydCIsImludmVydE9iaiIsImludm9rZXIiLCJpc05vdE5pbCIsImp1eHQiLCJrZXlzSW4iLCJsZW5zIiwibGVuc0luZGV4IiwibGVuc1Byb3AiLCJsaWZ0TiIsImx0ZSIsIm1hcEFjY3VtIiwibWFwQWNjdW1SaWdodCIsIm1hdGhNb2QiLCJtYXhCeSIsIm1lYW4iLCJtZWRpYW4iLCJtZXJnZUFsbCIsIm1lcmdlRGVlcExlZnQiLCJtZXJnZURlZXBXaXRoIiwibWVyZ2VEZWVwV2l0aEtleSIsIm1lcmdlV2l0aEtleSIsIm1pbkJ5IiwibW9kaWZ5IiwibW9kaWZ5UGF0aCIsIm1vZHVsbyIsIm1vdmUiLCJtdWx0aXBseSIsInBhcnRpYWxPYmplY3QiLCJuZWdhdGUiLCJub25lIiwibnRoQXJnIiwib2YiLCJvdGhlcndpc2UiLCJvdmVyIiwicGFydGlhbCIsInBhcnRpYWxSaWdodCIsInBhdGhFcSIsInBhdGhTYXRpc2ZpZXMiLCJwaWNrQWxsIiwicHJvZHVjdCIsInByb2plY3QiLCJwcm9tYXAiLCJwcm9wSXMiLCJwcm9wU2F0aXNmaWVzIiwicmFuZ2UiLCJyZWR1Y2VSaWdodCIsInJlZHVjZVdoaWxlIiwicmVkdWNlZCIsInJlcGVhdCIsInNjYW4iLCJzZXF1ZW5jZSIsInNvcnRCeSIsInNvcnRXaXRoIiwic3BsaXRBdCIsInNwbGl0RXZlcnkiLCJzcGxpdFdoZW4iLCJzcGxpdFdoZW5ldmVyIiwic3VidHJhY3QiLCJzdW0iLCJzd2FwIiwic3ltbWV0cmljRGlmZmVyZW5jZSIsInN5bW1ldHJpY0RpZmZlcmVuY2VXaXRoIiwidGFrZSIsInRha2VMYXN0V2hpbGUiLCJ0YWtlV2hpbGUiLCJ0YXAiLCJ0aW1lcyIsInRvTG93ZXIiLCJ0b1BhaXJzSW4iLCJ0b1VwcGVyIiwidHJhbnNkdWNlIiwidHJhdmVyc2UiLCJ0cmltIiwidW5hcHBseSIsInVuYXJ5IiwidW5jdXJyeU4iLCJ1bmZvbGQiLCJ1bmlvbldpdGgiLCJ1bmlxQnkiLCJ1bmlxV2l0aCIsInVubGVzcyIsInVubmVzdCIsInVudGlsIiwidW53aW5kIiwidXNlV2l0aCIsInZhbHVlc0luIiwid2hlbiIsIndoZXJlIiwid2hlcmVBbnkiLCJ3aGVyZUVxIiwid2l0aG91dCIsInhvciIsInhwcm9kIiwiemlwV2l0aCIsInRodW5raWZ5IiwiX2luZGV4T2YiLCJ5cyIsImVsdCIsImVsdHMiLCJfbmF0aXZlU2V0IiwiX2l0ZW1zIiwiaGFzT3JBZGQiLCJzaG91bGRBZGQiLCJwcmV2U2l6ZSIsIm5ld1NpemUiLCJiSWR4IiwibGltaXQiLCJhMCIsImExIiwiYTIiLCJhMyIsImE0IiwiYTUiLCJhNiIsImE3IiwiYTgiLCJhOSIsIl9hcnJheUZyb21JdGVyYXRvciIsIl90b1N0cmluZyIsIm1ldGhvZG5hbWUiLCJfY2xvbmVSZWdFeHAiLCJkZWVwIiwiX09iamVjdE1hcCIsIl9pc1ByaW1pdGl2ZSIsImNvcHkiLCJjb3BpZWRWYWx1ZSIsImNhY2hlZENvcHkiLCJ2YWx1ZU9mIiwicGFyYW0iLCJoYXNoZWRLZXkiLCJoYXNoIiwiYnVja2V0IiwiUmVnRXhwIiwiZmxhZ3MiLCJpZ25vcmVDYXNlIiwibXVsdGlsaW5lIiwic3RpY2t5IiwidW5pY29kZSIsImRvdEFsbCIsIl9jb21wbGVtZW50Iiwic2V0MSIsInNldDIiLCJsZW4xIiwibGVuMiIsIl9jcmVhdGVQYXJ0aWFsQXBwbGljYXRvciIsIl9pc0FycmF5TGlrZSIsInN5bUl0ZXJhdG9yIiwiX2NyZWF0ZVJlZHVjZSIsImFycmF5UmVkdWNlIiwibWV0aG9kUmVkdWNlIiwiaXRlcmFibGVSZWR1Y2UiLCJfaXNQbGFjZWhvbGRlciIsImYxIiwiZjIiLCJfYSIsImYzIiwiX2MiLCJyZWNlaXZlZCIsImNvbWJpbmVkIiwiYXJnc0lkeCIsImNvbWJpbmVkSWR4IiwiX2lzVHJhbnNmb3JtZXIiLCJtZXRob2ROYW1lcyIsInRyYW5zZHVjZXJDcmVhdG9yIiwidHJhbnNkdWNlciIsIl9mdW5jdGlvbk5hbWUiLCJfdW5pcUNvbnRlbnRFcXVhbHMiLCJhSXRlcmF0b3IiLCJiSXRlcmF0b3IiLCJzdGFja0EiLCJzdGFja0IiLCJlcSIsImFJdGVtIiwidHlwZUEiLCJleHRlbmRlZFN0YWNrQSIsImV4dGVuZGVkU3RhY2tCIiwiX2ZvcmNlUmVkdWNlZCIsIl94QXJyYXlSZWR1Y2UiLCJfeFJlZHVjZSIsIl94ZkJhc2UiLCJ0SW5pdCIsInRTdGVwIiwidFJlc3VsdCIsIlhQcmVzZXJ2aW5nUmVkdWNlZCIsInJldCIsIlhGbGF0Q2F0IiwiX2ZsYXRDYXQiLCJfeGNhdCIsImluZiIsImlzQXJyYXlMaWtlIiwiaXNJbnRlZ2VyIiwiX2lzTnVtYmVyIiwiX2lzUmVnRXhwIiwicmVjdXJzaXZlIiwiZmxhdHQiLCJqbGVuIiwiaWxlbiIsImZ1bmN0b3IiLCJfbW9kaWZ5IiwiX29iamVjdEFzc2lnbiIsIm5leHRLZXkiLCJfcGlwZSIsIl9wcm9tYXAiLCJwcm9mdW5jdG9yIiwiX3F1b3RlIiwiZXNjYXBlZCIsIl9pdGVyYWJsZVJlZHVjZSIsIl9tZXRob2RSZWR1Y2UiLCJfcmVkdWNlZCIsIl9zdGVwQ2F0QXJyYXkiLCJ0cmFuc2R1Y2VyU3RlcCIsIl9zdGVwQ2F0U3RyaW5nIiwiX3N0ZXBDYXRPYmplY3QiLCJfc3RlcENhdCIsInBhZCIsIl90b0lTT1N0cmluZyIsInRvSVNPU3RyaW5nIiwiZ2V0VVRDRnVsbFllYXIiLCJnZXRVVENNb250aCIsImdldFVUQ0RhdGUiLCJnZXRVVENIb3VycyIsImdldFVUQ01pbnV0ZXMiLCJnZXRVVENTZWNvbmRzIiwiZ2V0VVRDTWlsbGlzZWNvbmRzIiwidG9GaXhlZCIsInNlZW4iLCJyZWN1ciIsIm1hcFBhaXJzIiwiTmFOIiwicmVwciIsIl94SXRlcmFibGVSZWR1Y2UiLCJfeE1ldGhvZFJlZHVjZSIsIlhBbGwiLCJYQW55IiwiWEFwZXJ0dXJlIiwiZnVsbCIsImdldENvcHkiLCJfeG1hcCIsIlhEcm9wIiwiWERyb3BMYXN0IiwiWERyb3BMYXN0V2hpbGUiLCJyZXRhaW5lZCIsInJldGFpbiIsImZsdXNoIiwiWERyb3BSZXBlYXRzV2l0aCIsImxhc3RWYWx1ZSIsInNlZW5GaXJzdFZhbHVlIiwic2FtZUFzTGFzdCIsIlhEcm9wV2hpbGUiLCJYRmlsdGVyIiwiWEZpbmQiLCJYRmluZEluZGV4IiwiWEZpbmRMYXN0IiwiWEZpbmRMYXN0SW5kZXgiLCJsYXN0SWR4IiwiWE1hcCIsIlhQcm9tYXAiLCJfeHByb21hcCIsIlhSZWR1Y2VCeSIsInZhbHVlRm4iLCJ2YWx1ZUFjYyIsImtleUZuIiwiX3hyZWR1Y2VCeSIsIlhTY2FuIiwiX3hzY2FuIiwiWFRha2UiLCJfeHRha2UiLCJYVGFrZVdoaWxlIiwiX3h0YWtlV2hpbGUiLCJYVGFwIiwiX3h0YXAiLCJYVW5pcUJ5IiwiX3h1bmlxQnkiLCJYVW5pcVdpdGgiLCJpdGVtcyIsIl94dW5pcVdpdGgiLCJYV3JhcCIsIl94d3JhcCIsImxpc3QxIiwibGlzdDIiLCJ0b0tlZXAiLCJDdG9yIiwiaGFzRW51bUJ1ZyIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwibm9uRW51bWVyYWJsZVByb3BzIiwiaGFzQXJnc0VudW1CdWciLCJjb250YWlucyIsIm5JZHgiLCJrcyIsImNoZWNrQXJnc0xlbmd0aCIsInNldHRlciIsInRvRnVuY3RvckZuIiwiZm9jdXMiLCJsaWZ0ZWQiLCJ0dXBsZSIsInJ4Iiwic3RyIiwic2FmZU1heCIsIm1heEJ5VmFsdWUiLCJtYXhCeVR5cGUiLCJzdHJpbmdBIiwibWF4QnlTdHJpbmdWYWx1ZSIsInJlc3VsdEIiLCJrZXlHZW4iLCJjYWNoZSIsImxPYmoiLCJyT2JqIiwibFZhbCIsInJWYWwiLCJfbCIsIl9yIiwic2FmZU1pbiIsIm1pbkJ5VmFsdWUiLCJtaW5CeVR5cGUiLCJtaW5CeVN0cmluZ1ZhbHVlIiwidG8iLCJwb3NpdGl2ZUZyb20iLCJwb3NpdGl2ZVRvIiwib2Zmc2V0IiwibmFtZXMiLCJjYWxsZWQiLCJJZGVudGl0eSIsImZzdCIsInNuZCIsInBhdGhBciIsInBhdGhzQXJyYXkiLCJoZWFkTGlzdCIsInRhaWxMaXN0IiwicHMiLCJfcmVkdWNlV2hpbGUiLCJzdGFydCIsInJlZ2V4IiwicmVwbGFjZW1lbnQiLCJ0cmF2ZXJzYWJsZSIsIlR5cGVSZXAiLCJmcm9tSW5kZXgiLCJ0b0luZGV4IiwiY3VyciIsInN3YXBPYmplY3QiLCJpbmRleEEiLCJpbmRleEIiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwidG1wIiwic3dhcExpc3QiLCJwb3NpdGl2ZUluZGV4QSIsInBvc2l0aXZlSW5kZXhCIiwicG9zaXRpdmVNaW4iLCJwb3NpdGl2ZU1heCIsInN3YXBTdHJpbmciLCJjcmVhdGVUaHVuayIsImZuQXJncyIsImludm9rZVRodW5rIiwiUmFuZ2VFcnJvciIsIm91dGVybGlzdCIsImlubmVybGlzdCIsIndzIiwiemVyb1dpZHRoIiwiaGFzUHJvdG9UcmltIiwiYmVnaW5SeCIsImVuZFJ4IiwiX3RyeUNhdGNoIiwidHJ5ZXIiLCJjYXRjaGVyIiwiZGVwdGgiLCJjdXJyZW50RGVwdGgiLCJlbmRJZHgiLCJzZWVkIiwiYXBwbGllZEl0ZW0iLCJ3aGVuRmFsc2VGbiIsInRyYW5zZm9ybWVycyIsInZzIiwiQ29uc3QiLCJmYW50YXN5TGFuZE1hcCIsIndoZW5UcnVlRm4iLCJ0ZXN0T2JqIiwidG9SZW1vdmUiLCJydiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaF9yZW5kZXJlci5kZXYuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsZUFBZSxLQUFpRCxrQkFBa0IsbUJBQU8sQ0FBQyxvQkFBTyxHQUFHLENBQStLLENBQUMscUJBQXFCLG1CQUFtQixTQUFTLGNBQWMsNEJBQTRCLFlBQVkscUJBQXFCLDJEQUEyRCx1Q0FBdUMscUNBQXFDLG9CQUFvQixFQUFFLGlCQUFpQiw0RkFBNEYsZUFBZSx3Q0FBd0MsU0FBUyxFQUFFLG1CQUFtQiw4QkFBOEIscURBQXFELDBCQUEwQiw2Q0FBNkMsc0JBQXNCLDZEQUE2RCxZQUFZLGVBQWUsU0FBUyxpQkFBaUIsaUNBQWlDLGlCQUFpQixZQUFZLFVBQVUsc0JBQXNCLG1CQUFtQixpREFBaUQsaUJBQWlCLGdCQUFnQixZQUFZLGlCQUFpQixhQUFhLDBDQUEwQyxTQUFTLDZDQUE2QyxTQUFTLCtCQUErQixTQUFTLCtCQUErQixTQUFTLEdBQUcsV0FBVywwQkFBMEIsSUFBSSx3QkFBd0IsU0FBUyxpQkFBaUIseUNBQXlDLGNBQWMsa0JBQWtCLHVCQUF1QixrQ0FBa0MsbUJBQW1CLGNBQWMsc0JBQXNCLGNBQWMsdUJBQXVCLFVBQVUsSUFBSSxvQkFBb0IsU0FBUyxpQ0FBaUMsSUFBSSxrQ0FBa0MsOENBQThDLDBEQUEwRCw0Q0FBNEMsTUFBTSx1QkFBdUIsNkJBQTZCLG9CQUFvQixrQ0FBa0MsS0FBSyxTQUFTLEdBQUcsSUFBSSxvRUFBb0UsZUFBZSxrQkFBa0IsUUFBUSxpQkFBaUIsNkRBQTZELGVBQWUsYUFBYSxFQUFFLGVBQWUsK0NBQStDLGdCQUFnQixZQUFZLFdBQVcsS0FBSyxXQUFXLCtHQUErRyxnREFBZ0QsYUFBYSxlQUFlLDhFQUE4RSxTQUFTLFVBQVUsZUFBZSwyQ0FBMkMsMENBQTBDLEVBQUUsaUNBQWlDLCtDQUErQyx5Q0FBeUMsNEVBQTRFLFlBQVksSUFBSSxHQUFHLEdBQUc7Ozs7Ozs7Ozs7Ozs7O0FDQXppRztBQUNBLHNCQUFzQixzRUFBc0UsZ0JBQWdCLHNCQUFzQixPQUFPLDJCQUEyQiwwQkFBMEIseURBQXlELGlDQUFpQyxrQkFBa0I7QUFDM1E7QUFDL0I7QUFDQSxzQkFBc0IsZ0RBQW1CO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBLEdBQUcseUNBQXlDLGdEQUFtQjtBQUMvRDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsK0RBQWUsV0FBVzs7Ozs7Ozs7Ozs7Ozs7QUNiMUI7QUFDQSxzQkFBc0Isc0VBQXNFLGdCQUFnQixzQkFBc0IsT0FBTywyQkFBMkIsMEJBQTBCLHlEQUF5RCxpQ0FBaUMsa0JBQWtCO0FBQzNRO0FBQy9CO0FBQ0Esc0JBQXNCLGdEQUFtQjtBQUN6QztBQUNBO0FBQ0EsR0FBRyx5Q0FBeUMsZ0RBQW1CO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsK0RBQWUsWUFBWTs7Ozs7Ozs7Ozs7Ozs7QUNkM0I7QUFDQSxzQkFBc0Isc0VBQXNFLGdCQUFnQixzQkFBc0IsT0FBTywyQkFBMkIsMEJBQTBCLHlEQUF5RCxpQ0FBaUMsa0JBQWtCO0FBQzNRO0FBQy9CO0FBQ0Esc0JBQXNCLGdEQUFtQjtBQUN6QztBQUNBO0FBQ0EsR0FBRyx5Q0FBeUMsZ0RBQW1CO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsK0RBQWUsWUFBWTs7Ozs7Ozs7Ozs7Ozs7QUNkM0I7QUFDQSxzQkFBc0Isc0VBQXNFLGdCQUFnQixzQkFBc0IsT0FBTywyQkFBMkIsMEJBQTBCLHlEQUF5RCxpQ0FBaUMsa0JBQWtCO0FBQzNRO0FBQy9CO0FBQ0Esc0JBQXNCLGdEQUFtQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcseUNBQXlDLGdEQUFtQjtBQUMvRDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsK0RBQWUsZUFBZTs7Ozs7Ozs7Ozs7Ozs7QUNkOUI7QUFDQSxzQkFBc0Isc0VBQXNFLGdCQUFnQixzQkFBc0IsT0FBTywyQkFBMkIsMEJBQTBCLHlEQUF5RCxpQ0FBaUMsa0JBQWtCO0FBQzNRO0FBQy9CO0FBQ0Esc0JBQXNCLGdEQUFtQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcseUNBQXlDLGdEQUFtQjtBQUMvRDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsK0RBQWUsWUFBWTs7Ozs7Ozs7Ozs7Ozs7QUNkM0I7QUFDQSxzQkFBc0Isc0VBQXNFLGdCQUFnQixzQkFBc0IsT0FBTywyQkFBMkIsMEJBQTBCLHlEQUF5RCxpQ0FBaUMsa0JBQWtCO0FBQzNRO0FBQy9CO0FBQ0Esc0JBQXNCLGdEQUFtQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcseUNBQXlDLGdEQUFtQjtBQUMvRDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsK0RBQWUsWUFBWTs7Ozs7Ozs7Ozs7Ozs7QUNkM0I7QUFDQSxzQkFBc0Isc0VBQXNFLGdCQUFnQixzQkFBc0IsT0FBTywyQkFBMkIsMEJBQTBCLHlEQUF5RCxpQ0FBaUMsa0JBQWtCO0FBQzNRO0FBQy9CO0FBQ0Esc0JBQXNCLGdEQUFtQjtBQUN6QztBQUNBO0FBQ0EsR0FBRyx5Q0FBeUMsZ0RBQW1CO0FBQy9EO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLCtEQUFlLFVBQVU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0NDWnpCLHFKQUFBQSxtQkFBQSxZQUFBQSxvQkFBQSxXQUFBQyxDQUFBLFNBQUFDLENBQUEsRUFBQUQsQ0FBQSxPQUFBRSxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsU0FBQSxFQUFBQyxDQUFBLEdBQUFILENBQUEsQ0FBQUksY0FBQSxFQUFBQyxDQUFBLEdBQUFKLE1BQUEsQ0FBQUssY0FBQSxjQUFBUCxDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxJQUFBRCxDQUFBLENBQUFELENBQUEsSUFBQUUsQ0FBQSxDQUFBTyxLQUFBLEtBQUFDLENBQUEsd0JBQUFDLE1BQUEsR0FBQUEsTUFBQSxPQUFBQyxDQUFBLEdBQUFGLENBQUEsQ0FBQUcsUUFBQSxrQkFBQUMsQ0FBQSxHQUFBSixDQUFBLENBQUFLLGFBQUEsdUJBQUFDLENBQUEsR0FBQU4sQ0FBQSxDQUFBTyxXQUFBLDhCQUFBQyxPQUFBakIsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsV0FBQUMsTUFBQSxDQUFBSyxjQUFBLENBQUFQLENBQUEsRUFBQUQsQ0FBQSxJQUFBUyxLQUFBLEVBQUFQLENBQUEsRUFBQWlCLFVBQUEsTUFBQUMsWUFBQSxNQUFBQyxRQUFBLFNBQUFwQixDQUFBLENBQUFELENBQUEsV0FBQWtCLE1BQUEsbUJBQUFqQixDQUFBLElBQUFpQixNQUFBLFlBQUFBLE9BQUFqQixDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxXQUFBRCxDQUFBLENBQUFELENBQUEsSUFBQUUsQ0FBQSxnQkFBQW9CLEtBQUFyQixDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxFQUFBRyxDQUFBLFFBQUFLLENBQUEsR0FBQVYsQ0FBQSxJQUFBQSxDQUFBLENBQUFJLFNBQUEsWUFBQW1CLFNBQUEsR0FBQXZCLENBQUEsR0FBQXVCLFNBQUEsRUFBQVgsQ0FBQSxHQUFBVCxNQUFBLENBQUFxQixNQUFBLENBQUFkLENBQUEsQ0FBQU4sU0FBQSxHQUFBVSxDQUFBLE9BQUFXLE9BQUEsQ0FBQXBCLENBQUEsZ0JBQUFFLENBQUEsQ0FBQUssQ0FBQSxlQUFBSCxLQUFBLEVBQUFpQixnQkFBQSxDQUFBekIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFZLENBQUEsTUFBQUYsQ0FBQSxhQUFBZSxTQUFBMUIsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsbUJBQUEwQixJQUFBLFlBQUFDLEdBQUEsRUFBQTVCLENBQUEsQ0FBQTZCLElBQUEsQ0FBQTlCLENBQUEsRUFBQUUsQ0FBQSxjQUFBRCxDQUFBLGFBQUEyQixJQUFBLFdBQUFDLEdBQUEsRUFBQTVCLENBQUEsUUFBQUQsQ0FBQSxDQUFBc0IsSUFBQSxHQUFBQSxJQUFBLE1BQUFTLENBQUEscUJBQUFDLENBQUEscUJBQUFDLENBQUEsZ0JBQUFDLENBQUEsZ0JBQUFDLENBQUEsZ0JBQUFaLFVBQUEsY0FBQWEsa0JBQUEsY0FBQUMsMkJBQUEsU0FBQUMsQ0FBQSxPQUFBcEIsTUFBQSxDQUFBb0IsQ0FBQSxFQUFBMUIsQ0FBQSxxQ0FBQTJCLENBQUEsR0FBQXBDLE1BQUEsQ0FBQXFDLGNBQUEsRUFBQUMsQ0FBQSxHQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUEsQ0FBQSxDQUFBRyxNQUFBLFFBQUFELENBQUEsSUFBQUEsQ0FBQSxLQUFBdkMsQ0FBQSxJQUFBRyxDQUFBLENBQUF5QixJQUFBLENBQUFXLENBQUEsRUFBQTdCLENBQUEsTUFBQTBCLENBQUEsR0FBQUcsQ0FBQSxPQUFBRSxDQUFBLEdBQUFOLDBCQUFBLENBQUFqQyxTQUFBLEdBQUFtQixTQUFBLENBQUFuQixTQUFBLEdBQUFELE1BQUEsQ0FBQXFCLE1BQUEsQ0FBQWMsQ0FBQSxZQUFBTSxzQkFBQTNDLENBQUEsZ0NBQUE0QyxPQUFBLFdBQUE3QyxDQUFBLElBQUFrQixNQUFBLENBQUFqQixDQUFBLEVBQUFELENBQUEsWUFBQUMsQ0FBQSxnQkFBQTZDLE9BQUEsQ0FBQTlDLENBQUEsRUFBQUMsQ0FBQSxzQkFBQThDLGNBQUE5QyxDQUFBLEVBQUFELENBQUEsYUFBQWdELE9BQUE5QyxDQUFBLEVBQUFLLENBQUEsRUFBQUcsQ0FBQSxFQUFBRSxDQUFBLFFBQUFFLENBQUEsR0FBQWEsUUFBQSxDQUFBMUIsQ0FBQSxDQUFBQyxDQUFBLEdBQUFELENBQUEsRUFBQU0sQ0FBQSxtQkFBQU8sQ0FBQSxDQUFBYyxJQUFBLFFBQUFaLENBQUEsR0FBQUYsQ0FBQSxDQUFBZSxHQUFBLEVBQUFFLENBQUEsR0FBQWYsQ0FBQSxDQUFBUCxLQUFBLFNBQUFzQixDQUFBLHVCQUFBQSxDQUFBLElBQUExQixDQUFBLENBQUF5QixJQUFBLENBQUFDLENBQUEsZUFBQS9CLENBQUEsQ0FBQWlELE9BQUEsQ0FBQWxCLENBQUEsQ0FBQW1CLE9BQUEsRUFBQUMsSUFBQSxXQUFBbEQsQ0FBQSxJQUFBK0MsTUFBQSxTQUFBL0MsQ0FBQSxFQUFBUyxDQUFBLEVBQUFFLENBQUEsZ0JBQUFYLENBQUEsSUFBQStDLE1BQUEsVUFBQS9DLENBQUEsRUFBQVMsQ0FBQSxFQUFBRSxDQUFBLFFBQUFaLENBQUEsQ0FBQWlELE9BQUEsQ0FBQWxCLENBQUEsRUFBQW9CLElBQUEsV0FBQWxELENBQUEsSUFBQWUsQ0FBQSxDQUFBUCxLQUFBLEdBQUFSLENBQUEsRUFBQVMsQ0FBQSxDQUFBTSxDQUFBLGdCQUFBZixDQUFBLFdBQUErQyxNQUFBLFVBQUEvQyxDQUFBLEVBQUFTLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLENBQUFFLENBQUEsQ0FBQWUsR0FBQSxTQUFBM0IsQ0FBQSxFQUFBSyxDQUFBLG9CQUFBRSxLQUFBLFdBQUFBLE1BQUFSLENBQUEsRUFBQUksQ0FBQSxhQUFBK0MsMkJBQUEsZUFBQXBELENBQUEsV0FBQUEsQ0FBQSxFQUFBRSxDQUFBLElBQUE4QyxNQUFBLENBQUEvQyxDQUFBLEVBQUFJLENBQUEsRUFBQUwsQ0FBQSxFQUFBRSxDQUFBLGdCQUFBQSxDQUFBLEdBQUFBLENBQUEsR0FBQUEsQ0FBQSxDQUFBaUQsSUFBQSxDQUFBQywwQkFBQSxFQUFBQSwwQkFBQSxJQUFBQSwwQkFBQSxxQkFBQTFCLGlCQUFBMUIsQ0FBQSxFQUFBRSxDQUFBLEVBQUFHLENBQUEsUUFBQUUsQ0FBQSxHQUFBd0IsQ0FBQSxtQkFBQXJCLENBQUEsRUFBQUUsQ0FBQSxRQUFBTCxDQUFBLEtBQUEwQixDQUFBLFlBQUFvQixLQUFBLHNDQUFBOUMsQ0FBQSxLQUFBMkIsQ0FBQSxvQkFBQXhCLENBQUEsUUFBQUUsQ0FBQSxXQUFBSCxLQUFBLEVBQUFSLENBQUEsRUFBQXFELElBQUEsZUFBQWpELENBQUEsQ0FBQWtELE1BQUEsR0FBQTdDLENBQUEsRUFBQUwsQ0FBQSxDQUFBd0IsR0FBQSxHQUFBakIsQ0FBQSxVQUFBRSxDQUFBLEdBQUFULENBQUEsQ0FBQW1ELFFBQUEsTUFBQTFDLENBQUEsUUFBQUUsQ0FBQSxHQUFBeUMsbUJBQUEsQ0FBQTNDLENBQUEsRUFBQVQsQ0FBQSxPQUFBVyxDQUFBLFFBQUFBLENBQUEsS0FBQW1CLENBQUEsbUJBQUFuQixDQUFBLHFCQUFBWCxDQUFBLENBQUFrRCxNQUFBLEVBQUFsRCxDQUFBLENBQUFxRCxJQUFBLEdBQUFyRCxDQUFBLENBQUFzRCxLQUFBLEdBQUF0RCxDQUFBLENBQUF3QixHQUFBLHNCQUFBeEIsQ0FBQSxDQUFBa0QsTUFBQSxRQUFBaEQsQ0FBQSxLQUFBd0IsQ0FBQSxRQUFBeEIsQ0FBQSxHQUFBMkIsQ0FBQSxFQUFBN0IsQ0FBQSxDQUFBd0IsR0FBQSxFQUFBeEIsQ0FBQSxDQUFBdUQsaUJBQUEsQ0FBQXZELENBQUEsQ0FBQXdCLEdBQUEsdUJBQUF4QixDQUFBLENBQUFrRCxNQUFBLElBQUFsRCxDQUFBLENBQUF3RCxNQUFBLFdBQUF4RCxDQUFBLENBQUF3QixHQUFBLEdBQUF0QixDQUFBLEdBQUEwQixDQUFBLE1BQUFLLENBQUEsR0FBQVgsUUFBQSxDQUFBM0IsQ0FBQSxFQUFBRSxDQUFBLEVBQUFHLENBQUEsb0JBQUFpQyxDQUFBLENBQUFWLElBQUEsUUFBQXJCLENBQUEsR0FBQUYsQ0FBQSxDQUFBaUQsSUFBQSxHQUFBcEIsQ0FBQSxHQUFBRixDQUFBLEVBQUFNLENBQUEsQ0FBQVQsR0FBQSxLQUFBTSxDQUFBLHFCQUFBMUIsS0FBQSxFQUFBNkIsQ0FBQSxDQUFBVCxHQUFBLEVBQUF5QixJQUFBLEVBQUFqRCxDQUFBLENBQUFpRCxJQUFBLGtCQUFBaEIsQ0FBQSxDQUFBVixJQUFBLEtBQUFyQixDQUFBLEdBQUEyQixDQUFBLEVBQUE3QixDQUFBLENBQUFrRCxNQUFBLFlBQUFsRCxDQUFBLENBQUF3QixHQUFBLEdBQUFTLENBQUEsQ0FBQVQsR0FBQSxtQkFBQTRCLG9CQUFBekQsQ0FBQSxFQUFBRSxDQUFBLFFBQUFHLENBQUEsR0FBQUgsQ0FBQSxDQUFBcUQsTUFBQSxFQUFBaEQsQ0FBQSxHQUFBUCxDQUFBLENBQUFhLFFBQUEsQ0FBQVIsQ0FBQSxPQUFBRSxDQUFBLEtBQUFOLENBQUEsU0FBQUMsQ0FBQSxDQUFBc0QsUUFBQSxxQkFBQW5ELENBQUEsSUFBQUwsQ0FBQSxDQUFBYSxRQUFBLENBQUFpRCxNQUFBLEtBQUE1RCxDQUFBLENBQUFxRCxNQUFBLGFBQUFyRCxDQUFBLENBQUEyQixHQUFBLEdBQUE1QixDQUFBLEVBQUF3RCxtQkFBQSxDQUFBekQsQ0FBQSxFQUFBRSxDQUFBLGVBQUFBLENBQUEsQ0FBQXFELE1BQUEsa0JBQUFsRCxDQUFBLEtBQUFILENBQUEsQ0FBQXFELE1BQUEsWUFBQXJELENBQUEsQ0FBQTJCLEdBQUEsT0FBQWtDLFNBQUEsdUNBQUExRCxDQUFBLGlCQUFBOEIsQ0FBQSxNQUFBekIsQ0FBQSxHQUFBaUIsUUFBQSxDQUFBcEIsQ0FBQSxFQUFBUCxDQUFBLENBQUFhLFFBQUEsRUFBQVgsQ0FBQSxDQUFBMkIsR0FBQSxtQkFBQW5CLENBQUEsQ0FBQWtCLElBQUEsU0FBQTFCLENBQUEsQ0FBQXFELE1BQUEsWUFBQXJELENBQUEsQ0FBQTJCLEdBQUEsR0FBQW5CLENBQUEsQ0FBQW1CLEdBQUEsRUFBQTNCLENBQUEsQ0FBQXNELFFBQUEsU0FBQXJCLENBQUEsTUFBQXZCLENBQUEsR0FBQUYsQ0FBQSxDQUFBbUIsR0FBQSxTQUFBakIsQ0FBQSxHQUFBQSxDQUFBLENBQUEwQyxJQUFBLElBQUFwRCxDQUFBLENBQUFGLENBQUEsQ0FBQWdFLFVBQUEsSUFBQXBELENBQUEsQ0FBQUgsS0FBQSxFQUFBUCxDQUFBLENBQUErRCxJQUFBLEdBQUFqRSxDQUFBLENBQUFrRSxPQUFBLGVBQUFoRSxDQUFBLENBQUFxRCxNQUFBLEtBQUFyRCxDQUFBLENBQUFxRCxNQUFBLFdBQUFyRCxDQUFBLENBQUEyQixHQUFBLEdBQUE1QixDQUFBLEdBQUFDLENBQUEsQ0FBQXNELFFBQUEsU0FBQXJCLENBQUEsSUFBQXZCLENBQUEsSUFBQVYsQ0FBQSxDQUFBcUQsTUFBQSxZQUFBckQsQ0FBQSxDQUFBMkIsR0FBQSxPQUFBa0MsU0FBQSxzQ0FBQTdELENBQUEsQ0FBQXNELFFBQUEsU0FBQXJCLENBQUEsY0FBQWdDLGFBQUFsRSxDQUFBLFFBQUFELENBQUEsS0FBQW9FLE1BQUEsRUFBQW5FLENBQUEsWUFBQUEsQ0FBQSxLQUFBRCxDQUFBLENBQUFxRSxRQUFBLEdBQUFwRSxDQUFBLFdBQUFBLENBQUEsS0FBQUQsQ0FBQSxDQUFBc0UsVUFBQSxHQUFBckUsQ0FBQSxLQUFBRCxDQUFBLENBQUF1RSxRQUFBLEdBQUF0RSxDQUFBLFdBQUF1RSxVQUFBLENBQUFDLElBQUEsQ0FBQXpFLENBQUEsY0FBQTBFLGNBQUF6RSxDQUFBLFFBQUFELENBQUEsR0FBQUMsQ0FBQSxDQUFBMEUsVUFBQSxRQUFBM0UsQ0FBQSxDQUFBNEIsSUFBQSxvQkFBQTVCLENBQUEsQ0FBQTZCLEdBQUEsRUFBQTVCLENBQUEsQ0FBQTBFLFVBQUEsR0FBQTNFLENBQUEsYUFBQXlCLFFBQUF4QixDQUFBLFNBQUF1RSxVQUFBLE1BQUFKLE1BQUEsYUFBQW5FLENBQUEsQ0FBQTRDLE9BQUEsQ0FBQXNCLFlBQUEsY0FBQVMsS0FBQSxpQkFBQWxDLE9BQUExQyxDQUFBLFFBQUFBLENBQUEsV0FBQUEsQ0FBQSxRQUFBRSxDQUFBLEdBQUFGLENBQUEsQ0FBQVksQ0FBQSxPQUFBVixDQUFBLFNBQUFBLENBQUEsQ0FBQTRCLElBQUEsQ0FBQTlCLENBQUEsNEJBQUFBLENBQUEsQ0FBQWlFLElBQUEsU0FBQWpFLENBQUEsT0FBQTZFLEtBQUEsQ0FBQTdFLENBQUEsQ0FBQThFLE1BQUEsU0FBQXZFLENBQUEsT0FBQUcsQ0FBQSxZQUFBdUQsS0FBQSxhQUFBMUQsQ0FBQSxHQUFBUCxDQUFBLENBQUE4RSxNQUFBLE9BQUF6RSxDQUFBLENBQUF5QixJQUFBLENBQUE5QixDQUFBLEVBQUFPLENBQUEsVUFBQTBELElBQUEsQ0FBQXhELEtBQUEsR0FBQVQsQ0FBQSxDQUFBTyxDQUFBLEdBQUEwRCxJQUFBLENBQUFYLElBQUEsT0FBQVcsSUFBQSxTQUFBQSxJQUFBLENBQUF4RCxLQUFBLEdBQUFSLENBQUEsRUFBQWdFLElBQUEsQ0FBQVgsSUFBQSxPQUFBVyxJQUFBLFlBQUF2RCxDQUFBLENBQUF1RCxJQUFBLEdBQUF2RCxDQUFBLGdCQUFBcUQsU0FBQSxRQUFBL0QsQ0FBQSxpQ0FBQW9DLGlCQUFBLENBQUFoQyxTQUFBLEdBQUFpQywwQkFBQSxFQUFBOUIsQ0FBQSxDQUFBb0MsQ0FBQSxtQkFBQWxDLEtBQUEsRUFBQTRCLDBCQUFBLEVBQUFqQixZQUFBLFNBQUFiLENBQUEsQ0FBQThCLDBCQUFBLG1CQUFBNUIsS0FBQSxFQUFBMkIsaUJBQUEsRUFBQWhCLFlBQUEsU0FBQWdCLGlCQUFBLENBQUEyQyxXQUFBLEdBQUE3RCxNQUFBLENBQUFtQiwwQkFBQSxFQUFBckIsQ0FBQSx3QkFBQWhCLENBQUEsQ0FBQWdGLG1CQUFBLGFBQUEvRSxDQUFBLFFBQUFELENBQUEsd0JBQUFDLENBQUEsSUFBQUEsQ0FBQSxDQUFBZ0YsV0FBQSxXQUFBakYsQ0FBQSxLQUFBQSxDQUFBLEtBQUFvQyxpQkFBQSw2QkFBQXBDLENBQUEsQ0FBQStFLFdBQUEsSUFBQS9FLENBQUEsQ0FBQWtGLElBQUEsT0FBQWxGLENBQUEsQ0FBQW1GLElBQUEsYUFBQWxGLENBQUEsV0FBQUUsTUFBQSxDQUFBaUYsY0FBQSxHQUFBakYsTUFBQSxDQUFBaUYsY0FBQSxDQUFBbkYsQ0FBQSxFQUFBb0MsMEJBQUEsS0FBQXBDLENBQUEsQ0FBQW9GLFNBQUEsR0FBQWhELDBCQUFBLEVBQUFuQixNQUFBLENBQUFqQixDQUFBLEVBQUFlLENBQUEseUJBQUFmLENBQUEsQ0FBQUcsU0FBQSxHQUFBRCxNQUFBLENBQUFxQixNQUFBLENBQUFtQixDQUFBLEdBQUExQyxDQUFBLEtBQUFELENBQUEsQ0FBQXNGLEtBQUEsYUFBQXJGLENBQUEsYUFBQWlELE9BQUEsRUFBQWpELENBQUEsT0FBQTJDLHFCQUFBLENBQUFHLGFBQUEsQ0FBQTNDLFNBQUEsR0FBQWMsTUFBQSxDQUFBNkIsYUFBQSxDQUFBM0MsU0FBQSxFQUFBVSxDQUFBLGlDQUFBZCxDQUFBLENBQUErQyxhQUFBLEdBQUFBLGFBQUEsRUFBQS9DLENBQUEsQ0FBQXVGLEtBQUEsYUFBQXRGLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFFLENBQUEsRUFBQUcsQ0FBQSxlQUFBQSxDQUFBLEtBQUFBLENBQUEsR0FBQThFLE9BQUEsT0FBQTVFLENBQUEsT0FBQW1DLGFBQUEsQ0FBQXpCLElBQUEsQ0FBQXJCLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFFLENBQUEsR0FBQUcsQ0FBQSxVQUFBVixDQUFBLENBQUFnRixtQkFBQSxDQUFBOUUsQ0FBQSxJQUFBVSxDQUFBLEdBQUFBLENBQUEsQ0FBQXFELElBQUEsR0FBQWQsSUFBQSxXQUFBbEQsQ0FBQSxXQUFBQSxDQUFBLENBQUFxRCxJQUFBLEdBQUFyRCxDQUFBLENBQUFRLEtBQUEsR0FBQUcsQ0FBQSxDQUFBcUQsSUFBQSxXQUFBckIscUJBQUEsQ0FBQUQsQ0FBQSxHQUFBekIsTUFBQSxDQUFBeUIsQ0FBQSxFQUFBM0IsQ0FBQSxnQkFBQUUsTUFBQSxDQUFBeUIsQ0FBQSxFQUFBL0IsQ0FBQSxpQ0FBQU0sTUFBQSxDQUFBeUIsQ0FBQSw2REFBQTNDLENBQUEsQ0FBQXlGLElBQUEsYUFBQXhGLENBQUEsUUFBQUQsQ0FBQSxHQUFBRyxNQUFBLENBQUFGLENBQUEsR0FBQUMsQ0FBQSxnQkFBQUcsQ0FBQSxJQUFBTCxDQUFBLEVBQUFFLENBQUEsQ0FBQXVFLElBQUEsQ0FBQXBFLENBQUEsVUFBQUgsQ0FBQSxDQUFBd0YsT0FBQSxhQUFBekIsS0FBQSxXQUFBL0QsQ0FBQSxDQUFBNEUsTUFBQSxTQUFBN0UsQ0FBQSxHQUFBQyxDQUFBLENBQUF5RixHQUFBLFFBQUExRixDQUFBLElBQUFELENBQUEsU0FBQWlFLElBQUEsQ0FBQXhELEtBQUEsR0FBQVIsQ0FBQSxFQUFBZ0UsSUFBQSxDQUFBWCxJQUFBLE9BQUFXLElBQUEsV0FBQUEsSUFBQSxDQUFBWCxJQUFBLE9BQUFXLElBQUEsUUFBQWpFLENBQUEsQ0FBQTBDLE1BQUEsR0FBQUEsTUFBQSxFQUFBakIsT0FBQSxDQUFBckIsU0FBQSxLQUFBNkUsV0FBQSxFQUFBeEQsT0FBQSxFQUFBbUQsS0FBQSxXQUFBQSxNQUFBNUUsQ0FBQSxhQUFBNEYsSUFBQSxXQUFBM0IsSUFBQSxXQUFBUCxJQUFBLFFBQUFDLEtBQUEsR0FBQTFELENBQUEsT0FBQXFELElBQUEsWUFBQUUsUUFBQSxjQUFBRCxNQUFBLGdCQUFBMUIsR0FBQSxHQUFBNUIsQ0FBQSxPQUFBdUUsVUFBQSxDQUFBM0IsT0FBQSxDQUFBNkIsYUFBQSxJQUFBMUUsQ0FBQSxXQUFBRSxDQUFBLGtCQUFBQSxDQUFBLENBQUEyRixNQUFBLE9BQUF4RixDQUFBLENBQUF5QixJQUFBLE9BQUE1QixDQUFBLE1BQUEyRSxLQUFBLEVBQUEzRSxDQUFBLENBQUE0RixLQUFBLGNBQUE1RixDQUFBLElBQUFELENBQUEsTUFBQThGLElBQUEsV0FBQUEsS0FBQSxTQUFBekMsSUFBQSxXQUFBckQsQ0FBQSxRQUFBdUUsVUFBQSxJQUFBRyxVQUFBLGtCQUFBMUUsQ0FBQSxDQUFBMkIsSUFBQSxRQUFBM0IsQ0FBQSxDQUFBNEIsR0FBQSxjQUFBbUUsSUFBQSxLQUFBcEMsaUJBQUEsV0FBQUEsa0JBQUE1RCxDQUFBLGFBQUFzRCxJQUFBLFFBQUF0RCxDQUFBLE1BQUFFLENBQUEsa0JBQUErRixPQUFBNUYsQ0FBQSxFQUFBRSxDQUFBLFdBQUFLLENBQUEsQ0FBQWdCLElBQUEsWUFBQWhCLENBQUEsQ0FBQWlCLEdBQUEsR0FBQTdCLENBQUEsRUFBQUUsQ0FBQSxDQUFBK0QsSUFBQSxHQUFBNUQsQ0FBQSxFQUFBRSxDQUFBLEtBQUFMLENBQUEsQ0FBQXFELE1BQUEsV0FBQXJELENBQUEsQ0FBQTJCLEdBQUEsR0FBQTVCLENBQUEsS0FBQU0sQ0FBQSxhQUFBQSxDQUFBLFFBQUFpRSxVQUFBLENBQUFNLE1BQUEsTUFBQXZFLENBQUEsU0FBQUEsQ0FBQSxRQUFBRyxDQUFBLFFBQUE4RCxVQUFBLENBQUFqRSxDQUFBLEdBQUFLLENBQUEsR0FBQUYsQ0FBQSxDQUFBaUUsVUFBQSxpQkFBQWpFLENBQUEsQ0FBQTBELE1BQUEsU0FBQTZCLE1BQUEsYUFBQXZGLENBQUEsQ0FBQTBELE1BQUEsU0FBQXdCLElBQUEsUUFBQTlFLENBQUEsR0FBQVQsQ0FBQSxDQUFBeUIsSUFBQSxDQUFBcEIsQ0FBQSxlQUFBTSxDQUFBLEdBQUFYLENBQUEsQ0FBQXlCLElBQUEsQ0FBQXBCLENBQUEscUJBQUFJLENBQUEsSUFBQUUsQ0FBQSxhQUFBNEUsSUFBQSxHQUFBbEYsQ0FBQSxDQUFBMkQsUUFBQSxTQUFBNEIsTUFBQSxDQUFBdkYsQ0FBQSxDQUFBMkQsUUFBQSxnQkFBQXVCLElBQUEsR0FBQWxGLENBQUEsQ0FBQTRELFVBQUEsU0FBQTJCLE1BQUEsQ0FBQXZGLENBQUEsQ0FBQTRELFVBQUEsY0FBQXhELENBQUEsYUFBQThFLElBQUEsR0FBQWxGLENBQUEsQ0FBQTJELFFBQUEsU0FBQTRCLE1BQUEsQ0FBQXZGLENBQUEsQ0FBQTJELFFBQUEscUJBQUFyRCxDQUFBLFlBQUFxQyxLQUFBLHFEQUFBdUMsSUFBQSxHQUFBbEYsQ0FBQSxDQUFBNEQsVUFBQSxTQUFBMkIsTUFBQSxDQUFBdkYsQ0FBQSxDQUFBNEQsVUFBQSxZQUFBVCxNQUFBLFdBQUFBLE9BQUE1RCxDQUFBLEVBQUFELENBQUEsYUFBQUUsQ0FBQSxRQUFBc0UsVUFBQSxDQUFBTSxNQUFBLE1BQUE1RSxDQUFBLFNBQUFBLENBQUEsUUFBQUssQ0FBQSxRQUFBaUUsVUFBQSxDQUFBdEUsQ0FBQSxPQUFBSyxDQUFBLENBQUE2RCxNQUFBLFNBQUF3QixJQUFBLElBQUF2RixDQUFBLENBQUF5QixJQUFBLENBQUF2QixDQUFBLHdCQUFBcUYsSUFBQSxHQUFBckYsQ0FBQSxDQUFBK0QsVUFBQSxRQUFBNUQsQ0FBQSxHQUFBSCxDQUFBLGFBQUFHLENBQUEsaUJBQUFULENBQUEsbUJBQUFBLENBQUEsS0FBQVMsQ0FBQSxDQUFBMEQsTUFBQSxJQUFBcEUsQ0FBQSxJQUFBQSxDQUFBLElBQUFVLENBQUEsQ0FBQTRELFVBQUEsS0FBQTVELENBQUEsY0FBQUUsQ0FBQSxHQUFBRixDQUFBLEdBQUFBLENBQUEsQ0FBQWlFLFVBQUEsY0FBQS9ELENBQUEsQ0FBQWdCLElBQUEsR0FBQTNCLENBQUEsRUFBQVcsQ0FBQSxDQUFBaUIsR0FBQSxHQUFBN0IsQ0FBQSxFQUFBVSxDQUFBLFNBQUE2QyxNQUFBLGdCQUFBVSxJQUFBLEdBQUF2RCxDQUFBLENBQUE0RCxVQUFBLEVBQUFuQyxDQUFBLFNBQUErRCxRQUFBLENBQUF0RixDQUFBLE1BQUFzRixRQUFBLFdBQUFBLFNBQUFqRyxDQUFBLEVBQUFELENBQUEsb0JBQUFDLENBQUEsQ0FBQTJCLElBQUEsUUFBQTNCLENBQUEsQ0FBQTRCLEdBQUEscUJBQUE1QixDQUFBLENBQUEyQixJQUFBLG1CQUFBM0IsQ0FBQSxDQUFBMkIsSUFBQSxRQUFBcUMsSUFBQSxHQUFBaEUsQ0FBQSxDQUFBNEIsR0FBQSxnQkFBQTVCLENBQUEsQ0FBQTJCLElBQUEsU0FBQW9FLElBQUEsUUFBQW5FLEdBQUEsR0FBQTVCLENBQUEsQ0FBQTRCLEdBQUEsT0FBQTBCLE1BQUEsa0JBQUFVLElBQUEseUJBQUFoRSxDQUFBLENBQUEyQixJQUFBLElBQUE1QixDQUFBLFVBQUFpRSxJQUFBLEdBQUFqRSxDQUFBLEdBQUFtQyxDQUFBLEtBQUFnRSxNQUFBLFdBQUFBLE9BQUFsRyxDQUFBLGFBQUFELENBQUEsUUFBQXdFLFVBQUEsQ0FBQU0sTUFBQSxNQUFBOUUsQ0FBQSxTQUFBQSxDQUFBLFFBQUFFLENBQUEsUUFBQXNFLFVBQUEsQ0FBQXhFLENBQUEsT0FBQUUsQ0FBQSxDQUFBb0UsVUFBQSxLQUFBckUsQ0FBQSxjQUFBaUcsUUFBQSxDQUFBaEcsQ0FBQSxDQUFBeUUsVUFBQSxFQUFBekUsQ0FBQSxDQUFBcUUsUUFBQSxHQUFBRyxhQUFBLENBQUF4RSxDQUFBLEdBQUFpQyxDQUFBLE9BQUFpRSxLQUFBLFdBQUFDLE9BQUFwRyxDQUFBLGFBQUFELENBQUEsUUFBQXdFLFVBQUEsQ0FBQU0sTUFBQSxNQUFBOUUsQ0FBQSxTQUFBQSxDQUFBLFFBQUFFLENBQUEsUUFBQXNFLFVBQUEsQ0FBQXhFLENBQUEsT0FBQUUsQ0FBQSxDQUFBa0UsTUFBQSxLQUFBbkUsQ0FBQSxRQUFBSSxDQUFBLEdBQUFILENBQUEsQ0FBQXlFLFVBQUEsa0JBQUF0RSxDQUFBLENBQUF1QixJQUFBLFFBQUFyQixDQUFBLEdBQUFGLENBQUEsQ0FBQXdCLEdBQUEsRUFBQTZDLGFBQUEsQ0FBQXhFLENBQUEsWUFBQUssQ0FBQSxnQkFBQThDLEtBQUEsOEJBQUFpRCxhQUFBLFdBQUFBLGNBQUF0RyxDQUFBLEVBQUFFLENBQUEsRUFBQUcsQ0FBQSxnQkFBQW1ELFFBQUEsS0FBQTNDLFFBQUEsRUFBQTZCLE1BQUEsQ0FBQTFDLENBQUEsR0FBQWdFLFVBQUEsRUFBQTlELENBQUEsRUFBQWdFLE9BQUEsRUFBQTdELENBQUEsb0JBQUFrRCxNQUFBLFVBQUExQixHQUFBLEdBQUE1QixDQUFBLEdBQUFrQyxDQUFBLE9BQUFuQyxDQUFBO0FBQUEsU0FBQXVHLG1CQUFBQyxHQUFBLEVBQUF2RCxPQUFBLEVBQUF3RCxNQUFBLEVBQUFDLEtBQUEsRUFBQUMsTUFBQSxFQUFBQyxHQUFBLEVBQUEvRSxHQUFBLGNBQUFnRixJQUFBLEdBQUFMLEdBQUEsQ0FBQUksR0FBQSxFQUFBL0UsR0FBQSxPQUFBcEIsS0FBQSxHQUFBb0csSUFBQSxDQUFBcEcsS0FBQSxXQUFBcUcsS0FBQSxJQUFBTCxNQUFBLENBQUFLLEtBQUEsaUJBQUFELElBQUEsQ0FBQXZELElBQUEsSUFBQUwsT0FBQSxDQUFBeEMsS0FBQSxZQUFBK0UsT0FBQSxDQUFBdkMsT0FBQSxDQUFBeEMsS0FBQSxFQUFBMEMsSUFBQSxDQUFBdUQsS0FBQSxFQUFBQyxNQUFBO0FBQUEsU0FBQUksa0JBQUFDLEVBQUEsNkJBQUFDLElBQUEsU0FBQUMsSUFBQSxHQUFBQyxTQUFBLGFBQUEzQixPQUFBLFdBQUF2QyxPQUFBLEVBQUF3RCxNQUFBLFFBQUFELEdBQUEsR0FBQVEsRUFBQSxDQUFBSSxLQUFBLENBQUFILElBQUEsRUFBQUMsSUFBQSxZQUFBUixNQUFBakcsS0FBQSxJQUFBOEYsa0JBQUEsQ0FBQUMsR0FBQSxFQUFBdkQsT0FBQSxFQUFBd0QsTUFBQSxFQUFBQyxLQUFBLEVBQUFDLE1BQUEsVUFBQWxHLEtBQUEsY0FBQWtHLE9BQUFVLEdBQUEsSUFBQWQsa0JBQUEsQ0FBQUMsR0FBQSxFQUFBdkQsT0FBQSxFQUFBd0QsTUFBQSxFQUFBQyxLQUFBLEVBQUFDLE1BQUEsV0FBQVUsR0FBQSxLQUFBWCxLQUFBLENBQUFZLFNBQUE7QUFBQSxTQUFBQyxlQUFBQyxHQUFBLEVBQUE5RyxDQUFBLFdBQUErRyxlQUFBLENBQUFELEdBQUEsS0FBQUUscUJBQUEsQ0FBQUYsR0FBQSxFQUFBOUcsQ0FBQSxLQUFBaUgsMkJBQUEsQ0FBQUgsR0FBQSxFQUFBOUcsQ0FBQSxLQUFBa0gsZ0JBQUE7QUFBQSxTQUFBQSxpQkFBQSxjQUFBN0QsU0FBQTtBQUFBLFNBQUE0RCw0QkFBQXBILENBQUEsRUFBQXNILE1BQUEsU0FBQXRILENBQUEscUJBQUFBLENBQUEsc0JBQUF1SCxpQkFBQSxDQUFBdkgsQ0FBQSxFQUFBc0gsTUFBQSxPQUFBeEgsQ0FBQSxHQUFBRixNQUFBLENBQUFDLFNBQUEsQ0FBQTJILFFBQUEsQ0FBQWpHLElBQUEsQ0FBQXZCLENBQUEsRUFBQXVGLEtBQUEsYUFBQXpGLENBQUEsaUJBQUFFLENBQUEsQ0FBQTBFLFdBQUEsRUFBQTVFLENBQUEsR0FBQUUsQ0FBQSxDQUFBMEUsV0FBQSxDQUFBQyxJQUFBLE1BQUE3RSxDQUFBLGNBQUFBLENBQUEsbUJBQUEySCxLQUFBLENBQUFDLElBQUEsQ0FBQTFILENBQUEsT0FBQUYsQ0FBQSwrREFBQTZILElBQUEsQ0FBQTdILENBQUEsVUFBQXlILGlCQUFBLENBQUF2SCxDQUFBLEVBQUFzSCxNQUFBO0FBQUEsU0FBQUMsa0JBQUFOLEdBQUEsRUFBQVcsR0FBQSxRQUFBQSxHQUFBLFlBQUFBLEdBQUEsR0FBQVgsR0FBQSxDQUFBMUMsTUFBQSxFQUFBcUQsR0FBQSxHQUFBWCxHQUFBLENBQUExQyxNQUFBLFdBQUFwRSxDQUFBLE1BQUEwSCxJQUFBLE9BQUFKLEtBQUEsQ0FBQUcsR0FBQSxHQUFBekgsQ0FBQSxHQUFBeUgsR0FBQSxFQUFBekgsQ0FBQSxJQUFBMEgsSUFBQSxDQUFBMUgsQ0FBQSxJQUFBOEcsR0FBQSxDQUFBOUcsQ0FBQSxVQUFBMEgsSUFBQTtBQUFBLFNBQUFWLHNCQUFBeEgsQ0FBQSxFQUFBOEIsQ0FBQSxRQUFBL0IsQ0FBQSxXQUFBQyxDQUFBLGdDQUFBUyxNQUFBLElBQUFULENBQUEsQ0FBQVMsTUFBQSxDQUFBRSxRQUFBLEtBQUFYLENBQUEsNEJBQUFELENBQUEsUUFBQUQsQ0FBQSxFQUFBSyxDQUFBLEVBQUFLLENBQUEsRUFBQU0sQ0FBQSxFQUFBSixDQUFBLE9BQUFxQixDQUFBLE9BQUExQixDQUFBLGlCQUFBRyxDQUFBLElBQUFULENBQUEsR0FBQUEsQ0FBQSxDQUFBNkIsSUFBQSxDQUFBNUIsQ0FBQSxHQUFBK0QsSUFBQSxRQUFBakMsQ0FBQSxRQUFBN0IsTUFBQSxDQUFBRixDQUFBLE1BQUFBLENBQUEsVUFBQWdDLENBQUEsdUJBQUFBLENBQUEsSUFBQWpDLENBQUEsR0FBQVUsQ0FBQSxDQUFBb0IsSUFBQSxDQUFBN0IsQ0FBQSxHQUFBcUQsSUFBQSxNQUFBMUMsQ0FBQSxDQUFBNkQsSUFBQSxDQUFBekUsQ0FBQSxDQUFBUyxLQUFBLEdBQUFHLENBQUEsQ0FBQWtFLE1BQUEsS0FBQTlDLENBQUEsR0FBQUMsQ0FBQSxpQkFBQS9CLENBQUEsSUFBQUssQ0FBQSxPQUFBRixDQUFBLEdBQUFILENBQUEseUJBQUErQixDQUFBLFlBQUFoQyxDQUFBLENBQUE2RCxNQUFBLEtBQUE5QyxDQUFBLEdBQUFmLENBQUEsQ0FBQTZELE1BQUEsSUFBQTNELE1BQUEsQ0FBQWEsQ0FBQSxNQUFBQSxDQUFBLDJCQUFBVCxDQUFBLFFBQUFGLENBQUEsYUFBQU8sQ0FBQTtBQUFBLFNBQUE2RyxnQkFBQUQsR0FBQSxRQUFBUSxLQUFBLENBQUFLLE9BQUEsQ0FBQWIsR0FBQSxVQUFBQSxHQUFBO0FBRDJDO0FBQ0g7QUFDZ0M7QUFDckM7QUFDUztBQUNxQztBQVE5RDtBQUMwQjtBQUNRO0FBQ2hCO0FBQ1E7QUFDRTtBQUNFO0FBQ0o7QUFDeUI7QUFDdEM7QUFFekIsSUFBTTBDLFdBQVcsZ0JBQUdwQixvREFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBTXFCLG9CQUFvQixHQUFHLFNBQXZCQSxvQkFBb0JBLENBQUdDLEtBQUssRUFBSTtFQUNsQyxJQUNJQyxZQUFZLEdBT1pELEtBQUssQ0FQTEMsWUFBWTtJQUNaQyxNQUFNLEdBTU5GLEtBQUssQ0FOTEUsTUFBTTtJQUNOQyxtQkFBbUIsR0FLbkJILEtBQUssQ0FMTEcsbUJBQW1CO0lBQ25CekQsS0FBSyxHQUlMc0QsS0FBSyxDQUpMdEQsS0FBSztJQUNMMEQsYUFBYSxHQUdiSixLQUFLLENBSExJLGFBQWE7SUFDYkMsTUFBTSxHQUVOTCxLQUFLLENBRkxLLE1BQU07SUFDTkMsVUFBVSxHQUNWTixLQUFLLENBRExNLFVBQVU7RUFHZCxJQUFBQyxTQUFBLEdBQXdDOUIsK0NBQVEsQ0FBQyxLQUFLLENBQUM7SUFBQStCLFVBQUEsR0FBQXJELGNBQUEsQ0FBQW9ELFNBQUE7SUFBaERFLFlBQVksR0FBQUQsVUFBQTtJQUFFRSxlQUFlLEdBQUFGLFVBQUE7RUFFcEMsSUFBTUcsTUFBTSxHQUFHbkMsNkNBQU0sQ0FBQyxJQUFJLENBQUM7RUFDM0IsSUFBSSxDQUFDbUMsTUFBTSxDQUFDQyxPQUFPLEVBQUU7SUFDakJELE1BQU0sQ0FBQ0MsT0FBTyxHQUFHLElBQUlyQix3REFBWSxDQUFDLENBQUM7RUFDdkM7RUFDQSxJQUFNc0IsWUFBWSxHQUFHckMsNkNBQU0sQ0FBQyxLQUFLLENBQUM7RUFFbEMsSUFBTXNDLFFBQVEsR0FBR3RDLDZDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDM0JzQyxRQUFRLENBQUNGLE9BQU8sR0FBR1osS0FBSztFQUV4QixJQUFNZSxRQUFRLEdBQUd2Qyw2Q0FBTSxDQUFDO0lBQ3BCNUIsRUFBRSxFQUFFLFNBQUFBLEdBQUE7TUFBQSxPQUFPO1FBQ1BvRSxtQkFBbUIsRUFBRUYsUUFBUSxDQUFDRixPQUFPLENBQUNWLE1BQU07UUFDNUNlLHFCQUFxQixFQUFFSCxRQUFRLENBQUNGLE9BQU8sQ0FBQ00sUUFBUTtRQUNoREMsbUJBQW1CLEVBQUVMLFFBQVEsQ0FBQ0YsT0FBTyxDQUFDUSxNQUFNO1FBQzVDQyx1QkFBdUIsRUFBRVAsUUFBUSxDQUFDRixPQUFPLENBQUNOO01BQzlDLENBQUM7SUFBQTtFQUNMLENBQUMsQ0FBQztFQUVGL0IsZ0RBQVMsQ0FBQytDLFdBQVcsQ0FBQ0MsSUFBSSxDQUFDLElBQUksRUFBRXZCLEtBQUssRUFBRVcsTUFBTSxFQUFFRCxlQUFlLENBQUMsQ0FBQztFQUVqRW5DLGdEQUFTLENBQUMsWUFBTTtJQUNaLElBQUlzQyxZQUFZLENBQUNELE9BQU8sRUFBRTtNQUN0QmpFLGlCQUFBLGVBQUFoSCxtQkFBQSxHQUFBb0YsSUFBQSxDQUFDLFNBQUF5RyxRQUFBO1FBQUEsT0FBQTdMLG1CQUFBLEdBQUF1QixJQUFBLFVBQUF1SyxTQUFBQyxRQUFBO1VBQUEsa0JBQUFBLFFBQUEsQ0FBQWxHLElBQUEsR0FBQWtHLFFBQUEsQ0FBQTdILElBQUE7WUFBQTtjQUNHZ0gsWUFBWSxDQUFDRCxPQUFPLEdBQUcsS0FBSztjQUFDYyxRQUFBLENBQUE3SCxJQUFBO2NBQUEsT0FDdkJnRyx3REFBSSxDQUFDLENBQUMsQ0FBQztZQUFBO2NBQ2JjLE1BQU0sQ0FBQ0MsT0FBTyxDQUFDZSxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQUM7WUFBQTtjQUFBLE9BQUFELFFBQUEsQ0FBQS9GLElBQUE7VUFBQTtRQUFBLEdBQUE2RixPQUFBO01BQUEsQ0FDbkMsR0FBRSxDQUFDO0lBQ1I7RUFDSixDQUFDLENBQUM7RUFFRmpELGdEQUFTLENBQUMsWUFBTTtJQUNaLElBQUkyQixNQUFNLENBQUMwQixhQUFhLEVBQUU7TUFDdEJDLE1BQU0sQ0FBQ0MsZ0JBQWdCLE1BQUFDLE1BQUEsQ0FBTTdCLE1BQU0sQ0FBQzhCLHdCQUF3Qiw2REFBMEQ7SUFDMUgsQ0FBQyxNQUFNO01BQ0hILE1BQU0sQ0FBQ0MsZ0JBQWdCLEdBQUc1QixNQUFNLENBQUMrQixZQUFZO0lBQ2pEO0VBQ0osQ0FBQyxFQUFFLEVBQUUsQ0FBQztFQUVOLElBQUlDLE9BQU87RUFDWCxJQUNJOUIsYUFBYSxDQUFDK0IsTUFBTSxJQUNwQixDQUFDL0Qsa0RBQVEsQ0FBQ2dDLGFBQWEsQ0FBQytCLE1BQU0sRUFBRSxDQUFDekMseURBQU0sQ0FBQzBDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUN6RDtJQUNFRixPQUFPLGdCQUFHNUQsMERBQUE7TUFBS2dFLFNBQVMsRUFBQztJQUFhLEdBQUMsc0JBQXlCLENBQUM7RUFDckUsQ0FBQyxNQUFNLElBQ0g3QixZQUFZLElBQ1hOLG1CQUFtQixDQUFDZ0MsTUFBTSxJQUN2QixDQUFDL0Qsa0RBQVEsQ0FBQytCLG1CQUFtQixDQUFDZ0MsTUFBTSxFQUFFLENBQUN6Qyx5REFBTSxDQUFDMEMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFFLEVBQ3BFO0lBQ0VGLE9BQU8sZ0JBQUc1RCwwREFBQTtNQUFLZ0UsU0FBUyxFQUFDO0lBQWEsR0FBQyw0QkFBK0IsQ0FBQztFQUMzRSxDQUFDLE1BQU0sSUFBSXJDLFlBQVksS0FBS1IsaUVBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRTtJQUNqRG9CLFlBQVksQ0FBQ0QsT0FBTyxHQUFHLElBQUk7SUFFM0JzQixPQUFPLGdCQUNINUQsMERBQUEsQ0FBQ3dCLFdBQVcsQ0FBQ3lDLFFBQVE7TUFBQ2xNLEtBQUssRUFBRTBLLFFBQVEsQ0FBQ0g7SUFBUSxnQkFDMUN0QywwREFBQSxDQUFDTSxzREFBYTtNQUNWNEQsa0JBQWtCLEVBQUU5RixLQUFNO01BQzFCK0YsbUJBQW1CLEVBQUVwQyxNQUFPO01BQzVCcUMseUJBQXlCLEVBQUUvQyxzRUFBZSxDQUN0Q1UsTUFBTSxFQUNOLEVBQUUsRUFDRkMsVUFDSixDQUFFO01BQ0ZxQyw2QkFBNkIsRUFBRS9DLHFFQUFjLENBQ3pDLEVBQUUsRUFDRlUsVUFDSixDQUFFO01BQ0ZzQyxpQkFBaUIsRUFBRUMsSUFBSSxDQUFDQyxTQUFTLENBQUMsRUFBRTtJQUFFLENBQ3pDLENBQ2lCLENBQ3pCO0VBQ0wsQ0FBQyxNQUFNO0lBQ0haLE9BQU8sZ0JBQUc1RCwwREFBQTtNQUFLZ0UsU0FBUyxFQUFDO0lBQWUsR0FBQyxZQUFlLENBQUM7RUFDN0Q7RUFFQSxPQUFPcEMsTUFBTSxJQUFJQSxNQUFNLENBQUM2QyxFQUFFLEtBQUssSUFBSSxnQkFDL0J6RSwwREFBQSxDQUFDTyxvRkFBb0IsUUFBRXFELE9BQThCLENBQUMsR0FFdERBLE9BQ0g7QUFDTCxDQUFDO0FBRUQsU0FBU1osV0FBV0EsQ0FBQ3RCLEtBQUssRUFBRVcsTUFBTSxFQUFFRCxlQUFlLEVBQUU7RUFDakQsSUFDSVQsWUFBWSxHQVFaRCxLQUFLLENBUkxDLFlBQVk7SUFDWkUsbUJBQW1CLEdBT25CSCxLQUFLLENBUExHLG1CQUFtQjtJQUNuQmUsUUFBUSxHQU1SbEIsS0FBSyxDQU5Ma0IsUUFBUTtJQUNSeEUsS0FBSyxHQUtMc0QsS0FBSyxDQUxMdEQsS0FBSztJQUNMMEUsTUFBTSxHQUlOcEIsS0FBSyxDQUpMb0IsTUFBTTtJQUNONEIsS0FBSyxHQUdMaEQsS0FBSyxDQUhMZ0QsS0FBSztJQUNMM0MsTUFBTSxHQUVOTCxLQUFLLENBRkxLLE1BQU07SUFDTkQsYUFBYSxHQUNiSixLQUFLLENBRExJLGFBQWE7RUFHakJsQyxrREFBSyxDQUFDLFlBQU07SUFDUixJQUFJRyxrREFBTyxDQUFDK0IsYUFBYSxDQUFDLEVBQUU7TUFDeEIsSUFBSSxPQUFPNEMsS0FBSyxDQUFDQyxVQUFVLEtBQUssVUFBVSxFQUFFO1FBQ3hDRCxLQUFLLENBQUNDLFVBQVUsQ0FBQyxDQUFDO01BQ3RCO01BQ0EvQixRQUFRLENBQUM1Qix3REFBUSxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDOUQsQ0FBQyxNQUFNLElBQUljLGFBQWEsQ0FBQytCLE1BQU0sS0FBS3pDLHlEQUFNLENBQUMwQyxFQUFFLEVBQUU7TUFDM0MsSUFBSS9ELGtEQUFPLENBQUNnQyxNQUFNLENBQUMsRUFBRTtRQUNqQixJQUFJLE9BQU8yQyxLQUFLLENBQUNFLFdBQVcsS0FBSyxVQUFVLEVBQUU7VUFDekNGLEtBQUssQ0FBQ0UsV0FBVyxDQUFDOUMsYUFBYSxDQUFDOEIsT0FBTyxDQUFDO1FBQzVDO1FBQ0EsSUFBTWlCLFdBQVcsR0FBRzNELCtEQUFnQixDQUNoQ1ksYUFBYSxDQUFDOEIsT0FBTyxFQUNyQmhCLFFBQ0osQ0FBQztRQUNEQSxRQUFRLENBQ0poQyxrREFBUSxDQUNKRSw0REFBWSxDQUFDK0QsV0FBVyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUV4QyxNQUFNLENBQUNDLE9BQU8sQ0FDdEQsQ0FDSixDQUFDO1FBQ0RNLFFBQVEsQ0FBQy9CLG1EQUFTLENBQUNnRSxXQUFXLENBQUMsQ0FBQztNQUNwQztJQUNKO0lBRUEsSUFBSTlFLGtEQUFPLENBQUM4QixtQkFBbUIsQ0FBQyxFQUFFO01BQzlCZSxRQUFRLENBQ0o1Qix3REFBUSxDQUFDLG9CQUFvQixFQUFFLEtBQUssRUFBRSxxQkFBcUIsQ0FDL0QsQ0FBQztJQUNMLENBQUMsTUFBTSxJQUNIYSxtQkFBbUIsQ0FBQ2dDLE1BQU0sS0FBS3pDLHlEQUFNLENBQUMwQyxFQUFFLElBQ3hDL0Qsa0RBQU8sQ0FBQytDLE1BQU0sQ0FBQyxFQUNqQjtNQUNFRixRQUFRLENBQ0pqQyxtREFBUyxDQUNMSSxvRUFBYSxDQUNUYyxtQkFBbUIsQ0FBQytCLE9BQU8sRUFDM0JwRCx1REFBYSxDQUFDb0MsUUFBUSxDQUMxQixDQUNKLENBQ0osQ0FBQztJQUNMO0lBRUE7SUFDSTtJQUNBZixtQkFBbUIsQ0FBQ2dDLE1BQU0sS0FBS3pDLHlEQUFNLENBQUMwQyxFQUFFLElBQ3hDLENBQUMvRCxrREFBTyxDQUFDK0MsTUFBTSxDQUFDO0lBQ2hCO0lBQ0FoQixhQUFhLENBQUMrQixNQUFNLEtBQUt6Qyx5REFBTSxDQUFDMEMsRUFBRSxJQUNsQyxDQUFDL0Qsa0RBQU8sQ0FBQ2dDLE1BQU0sQ0FBQztJQUNoQjtJQUNBSixZQUFZLEtBQUtSLGlFQUFXLENBQUMsU0FBUyxDQUFDLEVBQ3pDO01BQ0UsSUFBSTJELFFBQVEsR0FBRyxLQUFLO01BQ3BCLElBQUk7UUFDQWxDLFFBQVEsQ0FBQ25DLCtEQUFxQixDQUFDRCx1REFBYSxDQUFDb0MsUUFBUSxDQUFDLENBQUMsQ0FBQztNQUM1RCxDQUFDLENBQUMsT0FBT2pFLEdBQUcsRUFBRTtRQUNWO1FBQ0E7UUFDQSxJQUFJLENBQUNQLEtBQUssQ0FBQzJHLFFBQVEsQ0FBQzNJLE1BQU0sSUFBSSxDQUFDZ0MsS0FBSyxDQUFDNEcsT0FBTyxDQUFDNUksTUFBTSxFQUFFO1VBQ2pEd0csUUFBUSxDQUFDbEMsaURBQU8sQ0FBQztZQUFDeEgsSUFBSSxFQUFFLFNBQVM7WUFBRWtGLEtBQUssRUFBRU87VUFBRyxDQUFDLENBQUMsQ0FBQztRQUNwRDtRQUNBbUcsUUFBUSxHQUFHLElBQUk7TUFDbkIsQ0FBQyxTQUFTO1FBQ04xQyxlQUFlLENBQUMwQyxRQUFRLENBQUM7TUFDN0I7SUFDSjtFQUNKLENBQUMsQ0FBQztBQUNOO0FBRUFyRCxvQkFBb0IsQ0FBQ3dELFNBQVMsR0FBRztFQUM3QnRELFlBQVksRUFBRXRCLHVEQUFlLENBQUMsQ0FDMUJjLGlFQUFXLENBQUMsU0FBUyxDQUFDLEVBQ3RCQSxpRUFBVyxDQUFDLFVBQVUsQ0FBQyxFQUN2QkEsaUVBQVcsQ0FBQyxXQUFXLENBQUMsQ0FDM0IsQ0FBQztFQUNGeUIsUUFBUSxFQUFFdkMsd0RBQWM7RUFDeEJ3QixtQkFBbUIsRUFBRXhCLDBEQUFnQjtFQUNyQ3lDLE1BQU0sRUFBRXpDLDBEQUFnQjtFQUN4QnFFLEtBQUssRUFBRXJFLDBEQUFnQjtFQUN2QnlCLGFBQWEsRUFBRXpCLDBEQUFnQjtFQUMvQjBCLE1BQU0sRUFBRTFCLDBEQUFnQjtFQUN4QjJCLFVBQVUsRUFBRTNCLHVEQUFhO0VBQ3pCaUYsT0FBTyxFQUFFakYsdURBQWE7RUFDdEJqQyxLQUFLLEVBQUVpQywwREFBZ0I7RUFDdkJ1QixNQUFNLEVBQUV2QiwwREFBZ0IrRTtBQUM1QixDQUFDO0FBRUQsSUFBTUcsU0FBUyxHQUFHMUYsb0RBQU87QUFDckI7QUFDQSxVQUFBMkYsS0FBSztFQUFBLE9BQUs7SUFDTjdELFlBQVksRUFBRTZELEtBQUssQ0FBQzdELFlBQVk7SUFDaENFLG1CQUFtQixFQUFFMkQsS0FBSyxDQUFDM0QsbUJBQW1CO0lBQzlDNkMsS0FBSyxFQUFFYyxLQUFLLENBQUNkLEtBQUs7SUFDbEI1QyxhQUFhLEVBQUUwRCxLQUFLLENBQUMxRCxhQUFhO0lBQ2xDQyxNQUFNLEVBQUV5RCxLQUFLLENBQUN6RCxNQUFNO0lBQ3BCQyxVQUFVLEVBQUV3RCxLQUFLLENBQUN4RCxVQUFVO0lBQzVCYyxNQUFNLEVBQUUwQyxLQUFLLENBQUMxQyxNQUFNO0lBQ3BCd0MsT0FBTyxFQUFFRSxLQUFLLENBQUNGLE9BQU87SUFDdEJsSCxLQUFLLEVBQUVvSCxLQUFLLENBQUNwSCxLQUFLO0lBQ2xCd0QsTUFBTSxFQUFFNEQsS0FBSyxDQUFDNUQ7RUFDbEIsQ0FBQztBQUFBLENBQUMsRUFDRixVQUFBZ0IsUUFBUTtFQUFBLE9BQUs7SUFBQ0E7RUFBUSxDQUFDO0FBQUEsQ0FDM0IsQ0FBQyxDQUFDbkIsb0JBQW9CLENBQUM7QUFFdkIsK0RBQWU4RCxTQUFTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2xQWTtBQUNWO0FBQ1M7QUFDZTtBQUNJO0FBQ0E7QUFDRTtBQUNoQjtBQUNZO0FBQ0Y7QUFBQSxJQUU1Q1csdUJBQXVCLDBCQUFBQyxnQkFBQTtFQUFBQyxTQUFBLENBQUFGLHVCQUFBLEVBQUFDLGdCQUFBO0VBQUEsSUFBQUUsTUFBQSxHQUFBQyxZQUFBLENBQUFKLHVCQUFBO0VBQ3pCLFNBQUFBLHdCQUFZeEUsS0FBSyxFQUFFO0lBQUEsSUFBQTZFLEtBQUE7SUFBQUMsZUFBQSxPQUFBTix1QkFBQTtJQUNmSyxLQUFBLEdBQUFGLE1BQUEsQ0FBQWpOLElBQUEsT0FBTXNJLEtBQUs7SUFDWCxJQUNJQSxLQUFLLENBQUNnRCxLQUFLLENBQUNDLFVBQVUsS0FBSyxJQUFJLElBQy9CakQsS0FBSyxDQUFDZ0QsS0FBSyxDQUFDRSxXQUFXLEtBQUssSUFBSSxJQUNoQ2xELEtBQUssQ0FBQ2dELEtBQUssQ0FBQytCLFdBQVcsS0FBSyxJQUFJLElBQ2hDL0UsS0FBSyxDQUFDZ0QsS0FBSyxDQUFDZ0MsWUFBWSxLQUFLLElBQUksSUFDakNoRixLQUFLLENBQUNnRCxLQUFLLENBQUNpQyxpQkFBaUIsS0FBSyxJQUFJLElBQ3RDakYsS0FBSyxDQUFDZ0QsS0FBSyxDQUFDa0MsbUJBQW1CLEtBQUssSUFBSSxFQUMxQztNQUNFLElBQUlsQyxLQUFLLEdBQUdoRCxLQUFLLENBQUNnRCxLQUFLO01BRXZCLElBQUlBLEtBQUssQ0FBQ2tDLG1CQUFtQixFQUFFO1FBQzNCbEMsS0FBSyxHQUFBbUMsYUFBQSxDQUFBQSxhQUFBLEtBQ0VuQyxLQUFLO1VBQ1JrQyxtQkFBbUIsRUFBRVosaURBQVcsQ0FDNUJDLDhDQUFRLEVBQ1J2QixLQUFLLENBQUNrQyxtQkFDVjtRQUFDLEVBQ0o7TUFDTDtNQUVBbEYsS0FBSyxDQUFDa0IsUUFBUSxDQUFDa0Qsd0RBQVEsQ0FBQ3BCLEtBQUssQ0FBQyxDQUFDO0lBQ25DO0lBQUMsT0FBQTZCLEtBQUE7RUFDTDtFQUFDTyxZQUFBLENBQUFaLHVCQUFBO0lBQUFoSSxHQUFBO0lBQUFuRyxLQUFBLEVBRUQsU0FBQWdQLDBCQUFBLEVBQTRCO01BQ3hCLElBQU9uRSxRQUFRLEdBQUksSUFBSSxDQUFDbEIsS0FBSyxDQUF0QmtCLFFBQVE7TUFDZixJQUFNaEIsTUFBTSxHQUFHaUUsbURBQWdCLENBQUMsQ0FBQzs7TUFFakM7TUFDQWpFLE1BQU0sQ0FBQ29GLEtBQUssR0FBRztRQUNYQyxXQUFXLEVBQUUsYUFBYTtRQUMxQkMsT0FBTyxFQUFFO1VBQ0xDLE1BQU0sRUFBRSxrQkFBa0I7VUFDMUIsY0FBYyxFQUFFO1FBQ3BCO01BQ0osQ0FBQztNQUVEdkUsUUFBUSxDQUFDbUQseURBQVMsQ0FBQ25FLE1BQU0sQ0FBQyxDQUFDO0lBQy9CO0VBQUM7SUFBQTFELEdBQUE7SUFBQW5HLEtBQUEsRUFFRCxTQUFBcVAsT0FBQSxFQUFTO01BQ0wsSUFBT3hGLE1BQU0sR0FBSSxJQUFJLENBQUNGLEtBQUssQ0FBcEJFLE1BQU07TUFDYixJQUFJMUksa0RBQUksQ0FBQzBJLE1BQU0sQ0FBQyxLQUFLLE1BQU0sRUFBRTtRQUN6QixvQkFBTzVCLDBEQUFBO1VBQUtnRSxTQUFTLEVBQUM7UUFBZSxHQUFDLFlBQWUsQ0FBQztNQUMxRDtNQUNBLElBQU9xRCxjQUFjLEdBQUl6RixNQUFNLENBQXhCeUYsY0FBYztNQUNyQixvQkFDSXJILDBEQUFBLENBQUNBLHVEQUFjLFFBQ1ZxSCxjQUFjLGdCQUFHckgsMERBQUEsQ0FBQzJGLHNFQUFPLE1BQUUsQ0FBQyxHQUFHLElBQUksZUFDcEMzRiwwREFBQSxDQUFDeUYsNERBQWEsTUFBRSxDQUFDLGVBQ2pCekYsMERBQUEsQ0FBQzBGLHNFQUFPLE1BQUUsQ0FBQyxlQUNYMUYsMERBQUEsQ0FBQzRGLHVFQUFRLE1BQUUsQ0FDQyxDQUFDO0lBRXpCO0VBQUM7RUFBQSxPQUFBTSx1QkFBQTtBQUFBLEVBekRpQ2xHLHdEQUFlO0FBNERyRGtHLHVCQUF1QixDQUFDakIsU0FBUyxHQUFHO0VBQ2hDUCxLQUFLLEVBQUVyRSwwREFBZ0I7RUFDdkJ1QyxRQUFRLEVBQUV2Qyx3REFBYztFQUN4QnVCLE1BQU0sRUFBRXZCLDBEQUFnQitFO0FBQzVCLENBQUM7QUFFRCxJQUFNb0MsWUFBWSxHQUFHM0gsb0RBQU8sQ0FDeEIsVUFBQTJGLEtBQUs7RUFBQSxPQUFLO0lBQ05GLE9BQU8sRUFBRUUsS0FBSyxDQUFDRixPQUFPO0lBQ3RCMUQsTUFBTSxFQUFFNEQsS0FBSyxDQUFDNUQ7RUFDbEIsQ0FBQztBQUFBLENBQUMsRUFDRixVQUFBZ0IsUUFBUTtFQUFBLE9BQUs7SUFBQ0E7RUFBUSxDQUFDO0FBQUEsQ0FDM0IsQ0FBQyxDQUFDc0QsdUJBQXVCLENBQUM7QUFFMUIsK0RBQWVzQixZQUFZOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckZRO0FBQ0c7QUFDRDtBQUVUO0FBQ29CO0FBRWhELElBQU1FLFdBQVcsR0FBRyxTQUFkQSxXQUFXQSxDQUFBQyxJQUFBLEVBQXFCO0VBQUEsSUFBaEJqRCxLQUFLLEdBQUFpRCxJQUFBLENBQUxqRCxLQUFLO0VBQ3ZCLElBQUF6QyxTQUFBLEdBQWtCOUIsK0NBQVEsQ0FBQztNQUFBLE9BQU0sSUFBSXNILDhDQUFLLENBQUMsQ0FBQztJQUFBLEVBQUM7SUFBQXZGLFVBQUEsR0FBQXJELGNBQUEsQ0FBQW9ELFNBQUE7SUFBckMyRixLQUFLLEdBQUExRixVQUFBLElBQUwwRixLQUFLO0VBQ2Isb0JBQ0k1SCwwREFBQSxDQUFDaUUsaURBQVE7SUFBQzJELEtBQUssRUFBRUE7RUFBTSxnQkFDbkI1SCwwREFBQSxDQUFDd0gsMkRBQVk7SUFBQzlDLEtBQUssRUFBRUE7RUFBTSxDQUFFLENBQ3ZCLENBQUM7QUFFbkIsQ0FBQztBQUVEZ0QsV0FBVyxDQUFDekMsU0FBUyxHQUFHO0VBQ3BCUCxLQUFLLEVBQUVyRSx1REFBZSxDQUFDO0lBQ25Cc0UsVUFBVSxFQUFFdEUsd0RBQWM7SUFDMUJ1RSxXQUFXLEVBQUV2RSx3REFBYztJQUMzQm9HLFdBQVcsRUFBRXBHLHdEQUFjO0lBQzNCcUcsWUFBWSxFQUFFckcsd0RBQWM7SUFDNUJzRyxpQkFBaUIsRUFBRXRHLHdEQUFjO0lBQ2pDdUcsbUJBQW1CLEVBQUV2Ryx3REFBYzhFO0VBQ3ZDLENBQUM7QUFDTCxDQUFDO0FBRUR1QyxXQUFXLENBQUNJLFlBQVksR0FBRztFQUN2QnBELEtBQUssRUFBRTtJQUNIQyxVQUFVLEVBQUUsSUFBSTtJQUNoQkMsV0FBVyxFQUFFLElBQUk7SUFDakI2QixXQUFXLEVBQUUsSUFBSTtJQUNqQkMsWUFBWSxFQUFFLElBQUk7SUFDbEJDLGlCQUFpQixFQUFFLElBQUk7SUFDdkJDLG1CQUFtQixFQUFFO0VBQ3pCO0FBQ0osQ0FBQztBQUVELCtEQUFlYyxXQUFXOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdENBO0FBQ087QUFFYTtBQUFBLElBRXhDTSxZQUFZLGdCQUFBbEIsWUFBQSxDQUNkLFNBQUFrQixhQUFZdEQsS0FBSyxFQUFFO0VBQUE4QixlQUFBLE9BQUF3QixZQUFBO0VBQ2Y7RUFDQSxJQUFNQyxTQUFTLEdBQUdDLFFBQVEsQ0FBQ0MsY0FBYyxDQUFDLG1CQUFtQixDQUFDO0VBRTlELElBQUlKLDZEQUFtQixFQUFFO0lBQ3JCLElBQU1NLElBQUksR0FBR04sMkRBQW1CLENBQUNFLFNBQVMsQ0FBQztJQUMzQ0ksSUFBSSxDQUFDakIsTUFBTSxlQUFDcEgsMERBQUEsQ0FBQzBILDBEQUFXO01BQUNoRCxLQUFLLEVBQUVBO0lBQU0sQ0FBRSxDQUFDLENBQUM7RUFDOUMsQ0FBQyxNQUFNO0lBQ0hxRCx1REFBZSxlQUFDL0gsMERBQUEsQ0FBQzBILDBEQUFXO01BQUNoRCxLQUFLLEVBQUVBO0lBQU0sQ0FBRSxDQUFDLEVBQUV1RCxTQUFTLENBQUM7RUFDN0Q7QUFDSixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hCd0M7QUFBQSxJQW9CeEJRLGFBQWEsZ0JBQUEzQixZQUFBLENBTTlCLFNBQUEyQixjQUFZYixNQUFxQixFQUFFO0VBQUEsSUFBQXJCLEtBQUE7RUFBQUMsZUFBQSxPQUFBaUMsYUFBQTtFQUFBQyxlQUFBO0VBQUFBLGVBQUE7RUFBQUEsZUFBQSxxQkFGaUMsRUFBRTtFQUFBQSxlQUFBLGtCQU01RCxVQUNOQyxRQUFvRSxFQUNwRUMsTUFBaUIsRUFDSTtJQUNyQixJQUFJLE9BQU9ELFFBQVEsS0FBSyxVQUFVLEVBQUU7TUFDaEMsSUFBSSxDQUFDckosS0FBSyxDQUFDSyxPQUFPLENBQUNpSixNQUFNLENBQUMsRUFBRTtRQUN4QixNQUFNLElBQUlqTyxLQUFLLENBQUMseUJBQXlCLENBQUM7TUFDOUM7TUFFQTRMLEtBQUksQ0FBQ3NDLEdBQUcsQ0FBQ0YsUUFBUSxFQUFFQyxNQUFNLENBQUM7TUFDMUIsT0FBTztRQUFBLE9BQU1yQyxLQUFJLENBQUN1QyxNQUFNLENBQUNILFFBQVEsQ0FBQztNQUFBO0lBQ3RDO0lBRUFwQyxLQUFJLENBQUNzQyxHQUFHLENBQUNGLFFBQVEsQ0FBQ0EsUUFBUSxFQUFFQSxRQUFRLENBQUNDLE1BQU0sQ0FBQztJQUM1QyxPQUFPO01BQUEsT0FBTXJDLEtBQUksQ0FBQ3VDLE1BQU0sQ0FBQ0gsUUFBUSxDQUFDQSxRQUFRLENBQUM7SUFBQTtFQUMvQyxDQUFDO0VBQUFELGVBQUEsbUJBRVUsVUFBQ2QsS0FBb0IsRUFBSztJQUNqQ3JCLEtBQUksQ0FBQ3dDLFlBQVksQ0FBQyxDQUFDO0lBQ25CeEMsS0FBSSxDQUFDeUMsUUFBUSxDQUFDcEIsS0FBSyxDQUFDO0VBQ3hCLENBQUM7RUFBQWMsZUFBQSx1QkFFc0I7SUFBQSxJQUFBTyxrQkFBQTtJQUFBLFFBQUFBLGtCQUFBLEdBQU0xQyxLQUFJLENBQUMyQyxZQUFZLGNBQUFELGtCQUFBLHVCQUFqQkEsa0JBQUEsQ0FBQTdQLElBQUEsQ0FBQW1OLEtBQW9CLENBQUM7RUFBQTtFQUFBbUMsZUFBQSxtQkFFL0IsVUFBQ2QsS0FBcUIsRUFBSztJQUMxQ3JCLEtBQUksQ0FBQzRDLE1BQU0sR0FBR3ZCLEtBQUs7SUFDbkIsSUFBSUEsS0FBSyxFQUFFO01BQ1ByQixLQUFJLENBQUMyQyxZQUFZLEdBQUd0QixLQUFLLENBQUN3QixTQUFTLENBQUM3QyxLQUFJLENBQUM4QyxNQUFNLENBQUM7SUFDcEQ7SUFFQTlDLEtBQUksQ0FBQytDLFVBQVUsQ0FBQ25QLE9BQU8sQ0FBQyxVQUFBdEMsQ0FBQyxFQUFJO01BQ3pCQSxDQUFDLENBQUMwUixTQUFTLEdBQUcsSUFBSTtJQUN0QixDQUFDLENBQUM7RUFDTixDQUFDO0VBQUFiLGVBQUEsY0FFYSxVQUFDQyxRQUFpQyxFQUFFQyxNQUFnQjtJQUFBLE9BQzlEckMsS0FBSSxDQUFDK0MsVUFBVSxDQUFDdk4sSUFBSSxDQUFDO01BQ2pCeU4sVUFBVSxFQUFFakIsaURBQUcsQ0FBQyxVQUFBM08sQ0FBQztRQUFBLE9BQUlBLENBQUMsQ0FBQzZQLEtBQUssQ0FBQyxHQUFHLENBQUM7TUFBQSxHQUFFYixNQUFNLENBQUM7TUFDMUNXLFNBQVMsRUFBRSxJQUFJO01BQ2ZaLFFBQVE7TUFDUmUsU0FBUyxFQUFFO0lBQ2YsQ0FBQyxDQUFDO0VBQUE7RUFBQWhCLGVBQUEsaUJBRVcsWUFBTTtJQUNuQixJQUFNZCxLQUFLLEdBQUdyQixLQUFJLENBQUM0QyxNQUFNO0lBQ3pCLElBQUksQ0FBQ3ZCLEtBQUssRUFBRTtNQUNSO0lBQ0o7SUFFQSxJQUFNcEMsS0FBSyxHQUFHb0MsS0FBSyxDQUFDK0IsUUFBUSxDQUFDLENBQUM7SUFFOUIsSUFBTUQsU0FBUyxHQUFHcEIsaURBQU0sQ0FDcEIsVUFBQXpRLENBQUM7TUFBQSxPQUNHLENBQUNBLENBQUMsQ0FBQzZSLFNBQVMsSUFDWnJFLGlEQUFHLENBQUMsVUFBQXJOLENBQUM7UUFBQSxPQUFJd1EsaURBQUksQ0FBQ3hRLENBQUMsRUFBRXdOLEtBQUssQ0FBQyxLQUFLZ0QsaURBQUksQ0FBQ3hRLENBQUMsRUFBRUgsQ0FBQyxDQUFDMFIsU0FBUyxDQUFDO01BQUEsR0FBRTFSLENBQUMsQ0FBQzJSLFVBQVUsQ0FBQztJQUFBLEdBQ25FakQsS0FBSSxDQUFDK0MsVUFDVCxDQUFDO0lBRURJLFNBQVMsQ0FBQ3ZQLE9BQU8sQ0FBQyxVQUFBdEMsQ0FBQyxFQUFJO01BQ25CQSxDQUFDLENBQUM2UixTQUFTLEdBQUcsSUFBSTtJQUN0QixDQUFDLENBQUM7SUFFRkEsU0FBUyxDQUFDdlAsT0FBTyxDQUFDLFVBQUF0QyxDQUFDLEVBQUk7TUFDbkJBLENBQUMsQ0FBQzBSLFNBQVMsR0FBRzNCLEtBQUssQ0FBQytCLFFBQVEsQ0FBQyxDQUFDO01BQzlCOVIsQ0FBQyxDQUFDOFEsUUFBUSxDQUFDZixLQUFLLENBQUM7TUFDakIvUCxDQUFDLENBQUM2UixTQUFTLEdBQUcsS0FBSztJQUN2QixDQUFDLENBQUM7RUFDTixDQUFDO0VBQUFoQixlQUFBLGlCQUVnQixVQUFDQyxRQUFpQztJQUFBLE9BQy9DcEMsS0FBSSxDQUFDK0MsVUFBVSxDQUFDTSxNQUFNLENBQ2xCckQsS0FBSSxDQUFDK0MsVUFBVSxDQUFDTyxTQUFTLENBQ3JCLFVBQUFoUyxDQUFDO01BQUEsT0FBSThRLFFBQVEsS0FBSzlRLENBQUMsQ0FBQzhRLFFBQVE7SUFBQSxHQUM1QnBDLEtBQUksQ0FBQytDLFVBQ1QsQ0FBQyxFQUNELENBQ0osQ0FBQztFQUFBO0VBL0VELElBQUksQ0FBQ04sUUFBUSxDQUFDcEIsTUFBSyxDQUFDO0FBQ3hCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVCb0Q7QUFDdEI7QUFDRDtBQUNnQjtBQXFCbkM7QUFDd0M7QUFDSDtBQUNUO0FBQzBDO0FBQ3ZDO0FBQ3FCO0FBS3BDO0FBQ21CO0FBQ2hCO0FBRWxDLElBQU04RCxXQUFXLEdBQUc7RUFDaEJDLFVBQVUsRUFBRTtBQUNoQixDQUFDO0FBRUQsU0FBU0MsZ0JBQWdCQSxDQUFDaFMsQ0FBQyxFQUFFO0VBQ3pCLElBQU9pUyxPQUFPLEdBQXVDalMsQ0FBQyxDQUEvQ2lTLE9BQU87SUFBRUMsVUFBVSxHQUEyQmxTLENBQUMsQ0FBdENrUyxVQUFVO0lBQUVwSyxLQUFLLEdBQW9COUgsQ0FBQyxDQUExQjhILEtBQUs7SUFBRXFLLFFBQVEsR0FBVW5TLENBQUMsQ0FBbkJtUyxRQUFRO0lBQUU3UyxJQUFJLEdBQUlVLENBQUMsQ0FBVFYsSUFBSTtFQUVqRCxJQUFNOFMsWUFBWSxHQUFHViwyREFBYyxDQUMvQk8sT0FBTyxDQUFDNUcsU0FBUyxFQUNqQnZELEtBQUssRUFDTCxnQkFBZ0IsRUFDaEJtSyxPQUNKLENBQUM7RUFDRCxJQUFJRyxZQUFZLEVBQUU7SUFDZDlCLGlFQUFvQixDQUFDOEIsWUFBWSxFQUFFdEssS0FBSyxFQUFFeEksSUFBSSxDQUFDO0VBQ25EO0VBRUEsT0FBTzZLLGFBQWEsQ0FBQzhILE9BQU8sRUFBRW5LLEtBQUssRUFBRW9LLFVBQVUsRUFBRUMsUUFBUSxDQUFDO0FBQzlEO0FBRUFILGdCQUFnQixDQUFDM0csU0FBUyxHQUFHO0VBQ3pCOEcsUUFBUSxFQUFFMUwsdURBQWE7RUFDdkJ3TCxPQUFPLEVBQUV4TCx1REFBYTtFQUN0QjBCLE1BQU0sRUFBRTFCLHVEQUFhO0VBQ3JCcUIsS0FBSyxFQUFFckIsdURBQWE7RUFDcEJ5TCxVQUFVLEVBQUV6TCx1REFBYTtFQUN6QjRMLEVBQUUsRUFBRTVMLDBEQUFnQjZMO0FBQ3hCLENBQUM7QUFFRCxTQUFTbkksYUFBYUEsQ0FBQzhILE9BQU8sRUFBRW5LLEtBQUssRUFBRW9LLFVBQVUsRUFBRUMsUUFBUSxFQUFFO0VBQ3pELElBQU1JLFFBQVEsR0FBR3hCLGtEQUFVLENBQUNqSixLQUFLLEVBQUVvSyxVQUFVLENBQUM7RUFDOUMsSUFBSXhNLEtBQUssQ0FBQ0ssT0FBTyxDQUFDb00sUUFBUSxDQUFDLEVBQUU7SUFDekIsb0JBQU8vTCwwREFBbUIsQ0FBQXRCLEtBQUEsQ0FBbkJzQiw4Q0FBSyxHQUFlNkwsT0FBTyxFQUFFTSxRQUFRLEVBQUExSSxNQUFBLENBQUEySSxrQkFBQSxDQUFLTCxRQUFRLEdBQUM7RUFDOUQ7RUFDQSxvQkFBTy9MLDBEQUFtQixDQUFDNkwsT0FBTyxFQUFFTSxRQUFRLEVBQUVKLFFBQVEsQ0FBQztBQUMzRDtBQUVBLFNBQVNNLGNBQWNBLENBQUNDLEdBQUcsRUFBRTtFQUN6QixPQUNJcFQsa0RBQUksQ0FBQ29ULEdBQUcsQ0FBQyxLQUFLLFFBQVEsSUFDdEI3QixrREFBRyxDQUFDLE1BQU0sRUFBRTZCLEdBQUcsQ0FBQyxJQUNoQjdCLGtEQUFHLENBQUMsV0FBVyxFQUFFNkIsR0FBRyxDQUFDLElBQ3JCN0Isa0RBQUcsQ0FBQyxPQUFPLEVBQUU2QixHQUFHLENBQUM7QUFFekI7QUFFQSxJQUFNQyxXQUFXLEdBQUcsU0FBZEEsV0FBV0EsQ0FBRzdLLEtBQUssRUFBSTtFQUN6QixJQUFNOEssT0FBTyxHQUFHeEMsaURBQVUsQ0FBQ3hJLDhEQUFXLENBQUM7RUFDdkMsb0JBQ0l4QiwwREFBQSxDQUFDeU0saUJBQWlCLEVBQUFDLFFBQUEsS0FDVkYsT0FBTyxDQUFDbE8sRUFBRSxDQUFDLENBQUMsRUFDWm9ELEtBQUs7SUFDVDRDLGlCQUFpQixFQUFFQyxJQUFJLENBQUNvSSxLQUFLLENBQUNqTCxLQUFLLENBQUM0QyxpQkFBaUI7RUFBRSxFQUMxRCxDQUFDO0FBRVYsQ0FBQztBQUVELElBQU1oRSxhQUFhLGdCQUFHeUosMkNBQUksQ0FBQ3dDLFdBQVcsQ0FBQztBQUFDLElBRWxDRSxpQkFBaUIsMEJBQUFHLFVBQUE7RUFBQXhHLFNBQUEsQ0FBQXFHLGlCQUFBLEVBQUFHLFVBQUE7RUFBQSxJQUFBdkcsTUFBQSxHQUFBQyxZQUFBLENBQUFtRyxpQkFBQTtFQUNuQixTQUFBQSxrQkFBWS9LLEtBQUssRUFBRTtJQUFBLElBQUE2RSxLQUFBO0lBQUFDLGVBQUEsT0FBQWlHLGlCQUFBO0lBQ2ZsRyxLQUFBLEdBQUFGLE1BQUEsQ0FBQWpOLElBQUEsT0FBTXNJLEtBQUs7SUFFWDZFLEtBQUEsQ0FBS3NHLFFBQVEsR0FBR3RHLEtBQUEsQ0FBS3NHLFFBQVEsQ0FBQzVKLElBQUksQ0FBQTZKLHNCQUFBLENBQUF2RyxLQUFBLENBQUssQ0FBQztJQUFDLE9BQUFBLEtBQUE7RUFDN0M7RUFBQ08sWUFBQSxDQUFBMkYsaUJBQUE7SUFBQXZPLEdBQUE7SUFBQW5HLEtBQUEsRUFFRCxTQUFBZ1YsZ0JBQWdCckwsS0FBSyxFQUFFc0wsU0FBUyxFQUFFeEUsSUFBSSxFQUFtQjtNQUFBLElBQWpCdEssR0FBRyxHQUFBTyxTQUFBLENBQUFyQyxNQUFBLFFBQUFxQyxTQUFBLFFBQUFHLFNBQUEsR0FBQUgsU0FBQSxNQUFHRyxTQUFTO01BQ25ELE9BQU91TSw4REFBaUIsQ0FBQzZCLFNBQVMsQ0FBQyxHQUMvQkEsU0FBUyxnQkFFVGhOLDBEQUFBLENBQUNNLGFBQWE7UUFDVnBDLEdBQUcsRUFDRThPLFNBQVMsSUFDTkEsU0FBUyxDQUFDdEwsS0FBSyxJQUNmOEosa0VBQVcsQ0FBQ3dCLFNBQVMsQ0FBQ3RMLEtBQUssQ0FBQ3VLLEVBQUUsQ0FBQyxJQUNuQy9OLEdBQ0g7UUFDRGdHLGtCQUFrQixFQUFFeEMsS0FBSyxDQUFDd0Msa0JBQW1CO1FBQzdDQyxtQkFBbUIsRUFBRTZJLFNBQVU7UUFDL0I1SSx5QkFBeUIsRUFBRS9DLHNFQUFlLENBQ3RDMkwsU0FBUyxFQUNUeEUsSUFBSSxFQUNKOUcsS0FBSyxDQUFDcUIsdUJBQ1YsQ0FBRTtRQUNGc0IsNkJBQTZCLEVBQUUvQyxxRUFBYyxDQUN6Q2tILElBQUksRUFDSjlHLEtBQUssQ0FBQ3FCLHVCQUNWLENBQUU7UUFDRnVCLGlCQUFpQixFQUFFQyxJQUFJLENBQUNDLFNBQVMsQ0FBQ2dFLElBQUk7TUFBRSxDQUMzQyxDQUNKO0lBQ0w7RUFBQztJQUFBdEssR0FBQTtJQUFBbkcsS0FBQSxFQUVELFNBQUE4VSxTQUFTSSxRQUFRLEVBQUU7TUFDZixJQUFBQyxXQUFBLEdBQ0ksSUFBSSxDQUFDeEwsS0FBSztRQURQaUIscUJBQXFCLEdBQUF1SyxXQUFBLENBQXJCdksscUJBQXFCO1FBQUUyQixpQkFBaUIsR0FBQTRJLFdBQUEsQ0FBakI1SSxpQkFBaUI7UUFBRUgsbUJBQW1CLEdBQUErSSxXQUFBLENBQW5CL0ksbUJBQW1CO01BR3BFLElBQU1nSixRQUFRLEdBQUcsSUFBSSxDQUFDQyxjQUFjLENBQUMsQ0FBQztNQUN0QyxJQUFPbkIsRUFBRSxHQUFJa0IsUUFBUSxDQUFkbEIsRUFBRTtNQUNULElBQU1vQixZQUFZLEdBQUd4QyxrREFBTSxDQUN2QixVQUFDeUMsR0FBRyxFQUFFcFAsR0FBRztRQUFBLE9BQUssQ0FBQ3FNLGtEQUFNLENBQUMrQyxHQUFHLEVBQUVILFFBQVEsQ0FBQ2pQLEdBQUcsQ0FBQyxDQUFDO01BQUEsR0FDekMrTyxRQUNKLENBQUM7TUFFRCxJQUFJLENBQUNsTixrREFBTyxDQUFDc04sWUFBWSxDQUFDLEVBQUU7UUFDeEIxSyxxQkFBcUIsQ0FBQyxVQUFDQyxRQUFRLEVBQUUrRyxRQUFRLEVBQUs7VUFDMUMsSUFBQTRELFNBQUEsR0FBaUI1RCxRQUFRLENBQUMsQ0FBQztZQUFwQjdHLE1BQU0sR0FBQXlLLFNBQUEsQ0FBTnpLLE1BQU07VUFDYjtVQUNBLElBQU0wSyxXQUFXLEdBQUdqQyxxRUFBYyxDQUM5QlUsRUFBRSxFQUNGbFAsa0RBQUksQ0FBQ3NRLFlBQVksQ0FBQyxFQUNsQnZLLE1BQ0osQ0FBQztVQUVEbEQsbURBQUssQ0FBQyxZQUFNO1lBQ1I7WUFDQTtZQUNBd0wsMERBQVksQ0FBQ2pILG1CQUFtQixFQUFFOEksUUFBUSxFQUFFckssUUFBUSxDQUFDOztZQUVyRDtZQUNBLElBQUk0SyxXQUFXLENBQUNwUixNQUFNLEVBQUU7Y0FDcEJ3RyxRQUFRLENBQ0pxSSx5REFBZSxDQUFDO2dCQUNaZ0IsRUFBRTtnQkFDRnZLLEtBQUssRUFBRWtKLGtEQUFJLENBQUM0QyxXQUFXLEVBQUVILFlBQVk7Y0FDekMsQ0FBQyxDQUNMLENBQUM7WUFDTDs7WUFFQTtZQUNBekssUUFBUSxDQUNKc0kscURBQVcsQ0FBQztjQUNSeEosS0FBSyxFQUFFMkwsWUFBWTtjQUNuQkksUUFBUSxFQUFFbko7WUFDZCxDQUFDLENBQ0wsQ0FBQztVQUNMLENBQUMsQ0FBQztRQUNOLENBQUMsQ0FBQztNQUNOO0lBQ0o7RUFBQztJQUFBcEcsR0FBQTtJQUFBbkcsS0FBQSxFQUVELFNBQUEyVixZQUFZQyxVQUFVLEVBQUVuRixJQUFJLEVBQUU7TUFBQSxJQUFBb0YsTUFBQTtNQUMxQixJQUFJcEQsa0RBQUssQ0FBQ21ELFVBQVUsQ0FBQyxFQUFFO1FBQ25CLE9BQU8sSUFBSTtNQUNmO01BRUEsT0FBT3JPLEtBQUssQ0FBQ0ssT0FBTyxDQUFDZ08sVUFBVSxDQUFDLEdBQzFCeEQsa0RBQVEsQ0FBQzVCLDhDQUFHLENBQUMsQ0FDVCxVQUFDeUUsU0FBUyxFQUFFaFYsQ0FBQztRQUFBLE9BQ1Q0VixNQUFJLENBQUNiLGVBQWUsQ0FDaEJhLE1BQUksQ0FBQ2xNLEtBQUssRUFDVnNMLFNBQVMsRUFDVHZKLGtEQUFNLENBQUMrRSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFeFEsQ0FBQyxDQUFDLENBQ3pDLENBQUM7TUFBQSxHQUNMMlYsVUFDSixDQUFDLEdBQ0QsSUFBSSxDQUFDWixlQUFlLENBQ2hCLElBQUksQ0FBQ3JMLEtBQUssRUFDVmlNLFVBQVUsRUFDVmxLLGtEQUFNLENBQUMrRSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQ3RDLENBQUM7SUFDWDtFQUFDO0lBQUF0SyxHQUFBO0lBQUFuRyxLQUFBLEVBRUQsU0FBQThWLGlCQUFpQkMsSUFBSSxFQUFFQyxZQUFZLEVBQUU7TUFBQSxJQUFBQyxNQUFBO01BQ2pDLElBQUkxTyxLQUFLLENBQUNLLE9BQU8sQ0FBQ21PLElBQUksQ0FBQyxFQUFFO1FBQ3JCLE9BQU9BLElBQUksQ0FBQ3ZGLEdBQUcsQ0FBQyxVQUFDNVEsQ0FBQyxFQUFFSyxDQUFDO1VBQUEsT0FDakJxVSxjQUFjLENBQUMxVSxDQUFDLENBQUMsR0FDWHFXLE1BQUksQ0FBQ2pCLGVBQWUsQ0FDaEJpQixNQUFJLENBQUN0TSxLQUFLLEVBQ1YvSixDQUFDLEVBQ0Q4TCxrREFBTSxDQUFDdUssTUFBSSxDQUFDdE0sS0FBSyxDQUFDNEMsaUJBQWlCLEdBQy9CLE9BQU8sRUFBQWIsTUFBQSxDQUFBMkksa0JBQUEsQ0FDSjJCLFlBQVksSUFDZi9WLENBQUMsRUFDSixDQUFDLEVBQ0ZBLENBQ0osQ0FBQyxHQUNETCxDQUFDO1FBQUEsQ0FDWCxDQUFDO01BQ0w7TUFDQSxJQUFJLENBQUMwVSxjQUFjLENBQUN5QixJQUFJLENBQUMsRUFBRTtRQUN2QixPQUFPQSxJQUFJO01BQ2Y7TUFDQSxPQUFPLElBQUksQ0FBQ2YsZUFBZSxDQUN2QixJQUFJLENBQUNyTCxLQUFLLEVBQ1ZvTSxJQUFJLEVBQ0pySyxrREFBTSxDQUFDLElBQUksQ0FBQy9CLEtBQUssQ0FBQzRDLGlCQUFpQixHQUFHLE9BQU8sRUFBQWIsTUFBQSxDQUFBMkksa0JBQUEsQ0FBSzJCLFlBQVksRUFBQyxDQUNuRSxDQUFDO0lBQ0w7RUFBQztJQUFBN1AsR0FBQTtJQUFBbkcsS0FBQSxFQUVELFNBQUFrVyxhQUFhOUosbUJBQW1CLEVBQUU0SCxRQUFRLEVBQUVtQyxhQUFhLEVBQUVyQixRQUFRLEVBQUU7TUFBQSxJQUFBc0IsTUFBQTtNQUNqRSxJQUFBQyxZQUFBLEdBQ0ksSUFBSSxDQUFDMU0sS0FBSztRQURQZ0IsbUJBQW1CLEdBQUEwTCxZQUFBLENBQW5CMUwsbUJBQW1CO1FBQUVDLHFCQUFxQixHQUFBeUwsWUFBQSxDQUFyQnpMLHFCQUFxQjtRQUFFdUIsa0JBQWtCLEdBQUFrSyxZQUFBLENBQWxCbEssa0JBQWtCO01BR3JFLElBQUluRSxrREFBTyxDQUFDb0UsbUJBQW1CLENBQUMsRUFBRTtRQUM5QixPQUFPLElBQUk7TUFDZjtNQUVBLElBQUlnSCw4REFBaUIsQ0FBQ2hILG1CQUFtQixDQUFDLEVBQUU7UUFDeEMsT0FBT0EsbUJBQW1CO01BQzlCO01BQ0FzSCx3RUFBaUIsQ0FBQ3RILG1CQUFtQixDQUFDO01BRXRDLElBQU0wSCxPQUFPLEdBQUc1QixpREFBUSxDQUFDMVAsT0FBTyxDQUFDNEosbUJBQW1CLENBQUM7O01BRXJEO01BQ0EsSUFBTWtLLGFBQWEsR0FBR3JELGtEQUFNLENBQ3hCLEVBQUUsRUFDRixDQUNJLGdCQUFnQixFQUNoQjdHLG1CQUFtQixDQUFDbUssU0FBUyxFQUM3Qm5LLG1CQUFtQixDQUFDakwsSUFBSSxDQUMzQixFQUNEd0osbUJBQ0osQ0FBQztNQUNELElBQUloQixLQUFLLEdBQUc0SSxrREFBTSxDQUFDLFVBQVUsRUFBRW5HLG1CQUFtQixDQUFDekMsS0FBSyxDQUFDO01BQUMsSUFBQTZNLEtBQUEsWUFBQUEsTUFBQSxFQUVYO1VBQzNDLElBQU1SLFlBQVksR0FBR00sYUFBYSxDQUFDclcsQ0FBQyxDQUFDO1VBRXJDLElBQU13VyxZQUFZLEdBQUcsU0FBZkEsWUFBWUEsQ0FBSWxDLEdBQUcsRUFBRW1DLEtBQUssRUFBSztZQUNqQyxPQUFPL0Qsa0RBQWEsQ0FDaEIsVUFBQ29ELElBQUksRUFBRVksQ0FBQztjQUFBLE9BQUtQLE1BQUksQ0FBQ04sZ0JBQWdCLENBQUNDLElBQUksS0FBQXJLLE1BQUEsQ0FBQTJJLGtCQUFBLENBQU1xQyxLQUFLLElBQUVDLENBQUMsRUFBQyxDQUFDO1lBQUEsR0FDdkRwQyxHQUNKLENBQUM7VUFDTCxDQUFDO1VBRUQsSUFBSXlCLFlBQVksQ0FBQ2pPLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM1QixJQUFJMEksSUFBSSxHQUFHdUYsWUFBWSxDQUFDdEUsS0FBSyxDQUFDLEdBQUcsQ0FBQztZQUNsQyxJQUFJcUUsSUFBSTtZQUNSLElBQUlhLFNBQVM7WUFDYixJQUFJWixZQUFZLENBQUNqTyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7Y0FDN0IsSUFBSThPLFNBQVMsR0FBRyxFQUFFO2dCQUNkQyxRQUFRLEdBQUcsRUFBRTtnQkFDYkMsS0FBSyxHQUFHLEtBQUs7Z0JBQ2JDLFNBQVMsR0FBRyxLQUFLO2NBQ3JCdkcsSUFBSSxDQUFDck8sT0FBTyxDQUFDLFVBQUFQLENBQUMsRUFBSTtnQkFDZCxJQUFJLENBQUNrVixLQUFLLEVBQUU7a0JBQ1IsSUFBSWxWLENBQUMsQ0FBQ2tHLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDbEJnUCxLQUFLLEdBQUcsSUFBSTtvQkFDWixJQUFJbFYsQ0FBQyxDQUFDa0csUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO3NCQUNsQmlQLFNBQVMsR0FBRyxJQUFJO3NCQUNoQkgsU0FBUyxDQUFDN1MsSUFBSSxDQUNWbkMsQ0FBQyxDQUFDb1YsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQ0EsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ3hDLENBQUM7b0JBQ0wsQ0FBQyxNQUFNO3NCQUNISixTQUFTLENBQUM3UyxJQUFJLENBQUNuQyxDQUFDLENBQUNvVixPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUN2QztrQkFDSixDQUFDLE1BQU0sSUFBSXBWLENBQUMsQ0FBQ2tHLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDekJpUCxTQUFTLEdBQUcsSUFBSTtvQkFDaEJILFNBQVMsQ0FBQzdTLElBQUksQ0FBQ25DLENBQUMsQ0FBQ29WLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7a0JBQ3ZDLENBQUMsTUFBTTtvQkFDSEosU0FBUyxDQUFDN1MsSUFBSSxDQUFDbkMsQ0FBQyxDQUFDO2tCQUNyQjtnQkFDSixDQUFDLE1BQU07a0JBQ0gsSUFBSUEsQ0FBQyxDQUFDa0csUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNsQmlQLFNBQVMsR0FBRyxJQUFJO29CQUNoQkYsUUFBUSxDQUFDOVMsSUFBSSxDQUFDbkMsQ0FBQyxDQUFDb1YsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztrQkFDdEMsQ0FBQyxNQUFNO29CQUNISCxRQUFRLENBQUM5UyxJQUFJLENBQUNuQyxDQUFDLENBQUM7a0JBQ3BCO2dCQUNKO2NBQ0osQ0FBQyxDQUFDO2NBRUZrVSxJQUFJLEdBQUcvQyxrREFBSyxDQUFDNkQsU0FBUyxFQUFFbE4sS0FBSyxDQUFDO2NBQzlCLElBQUlvTSxJQUFJLEtBQUtsUCxTQUFTLElBQUksQ0FBQ2tQLElBQUksQ0FBQzFSLE1BQU0sRUFBRTtnQkFBQTtjQUV4QztjQUNBLElBQU02UyxTQUFTLEdBQUdsRSxrREFBSyxDQUFDOEQsUUFBUSxFQUFFZixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Y0FDMUMsSUFBSSxDQUFDbUIsU0FBUyxFQUFFO2dCQUFBO2NBRWhCO2NBRUFOLFNBQVMsR0FBR2IsSUFBSSxDQUFDdkYsR0FBRyxDQUFDLFVBQUNzRCxPQUFPLEVBQUU3VCxDQUFDLEVBQUs7Z0JBQ2pDLElBQU1rWCxXQUFXLEdBQUd6TCxrREFBTSxDQUN0Qm1MLFNBQVMsRUFDVG5MLGtEQUFNLENBQUMsQ0FBQ3pMLENBQUMsQ0FBQyxFQUFFNlcsUUFBUSxDQUN4QixDQUFDO2dCQUNELElBQUlNLFNBQVM7Z0JBQ2IsSUFBSUosU0FBUyxFQUFFO2tCQUNYLElBQUlGLFFBQVEsQ0FBQ3pTLE1BQU0sRUFBRTtvQkFDakIrUyxTQUFTLEdBQUdYLFlBQVksQ0FDcEJ6RCxrREFBSyxDQUFDOEQsUUFBUSxFQUFFaEQsT0FBTyxDQUFDLEVBQ3hCcUQsV0FDSixDQUFDO2tCQUNMLENBQUMsTUFBTTtvQkFDSEMsU0FBUyxHQUFHWCxZQUFZLENBQUMzQyxPQUFPLEVBQUVxRCxXQUFXLENBQUM7a0JBQ2xEO2dCQUNKLENBQUMsTUFBTTtrQkFDSEMsU0FBUyxHQUFHaEIsTUFBSSxDQUFDTixnQkFBZ0IsQ0FDN0I5QyxrREFBSyxDQUFDOEQsUUFBUSxFQUFFaEQsT0FBTyxDQUFDLEVBQ3hCcUQsV0FDSixDQUFDO2dCQUNMO2dCQUNBLE9BQU83RSxrREFBUyxDQUFDd0UsUUFBUSxFQUFFTSxTQUFTLEVBQUV0RCxPQUFPLENBQUM7Y0FDbEQsQ0FBQyxDQUFDO2NBQ0ZyRCxJQUFJLEdBQUdvRyxTQUFTO1lBQ3BCLENBQUMsTUFBTTtjQUNILElBQUliLFlBQVksQ0FBQ2pPLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDN0I7Z0JBQ0EsSUFBTXNQLEtBQUssR0FBRyxFQUFFO2dCQUNoQixJQUFJQyxPQUFPLEdBQUcsRUFBRTtnQkFDaEIsSUFBSUMsT0FBTyxHQUFHLEtBQUs7Z0JBQ25CLElBQU1ULFNBQVEsR0FBRyxFQUFFO2dCQUVuQixLQUFLLElBQUlVLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRy9HLElBQUksQ0FBQ3BNLE1BQU0sRUFBRW1ULENBQUMsRUFBRSxFQUFFO2tCQUNsQyxJQUFNQyxHQUFHLEdBQUdoSCxJQUFJLENBQUMrRyxDQUFDLENBQUM7a0JBQ25CLElBQUlDLEdBQUcsQ0FBQzFQLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDcEJ1UCxPQUFPLEdBQUc1TCxrREFBTSxDQUFDMkwsS0FBSyxFQUFFLENBQ3BCSSxHQUFHLENBQUNSLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQ3hCLENBQUM7b0JBQ0YsSUFBSU8sQ0FBQyxHQUFHL0csSUFBSSxDQUFDcE0sTUFBTSxHQUFHLENBQUMsRUFBRTtzQkFDckJrVCxPQUFPLEdBQUcsSUFBSTtvQkFDbEI7a0JBQ0osQ0FBQyxNQUFNO29CQUNILElBQUlBLE9BQU8sRUFBRTtzQkFDVFQsU0FBUSxDQUFDOVMsSUFBSSxDQUFDeVQsR0FBRyxDQUFDO29CQUN0QixDQUFDLE1BQU07c0JBQ0hKLEtBQUssQ0FBQ3JULElBQUksQ0FBQ3lULEdBQUcsQ0FBQztvQkFDbkI7a0JBQ0o7Z0JBQ0o7Z0JBRUEsSUFBTUMsUUFBUSxHQUFHMUUsa0RBQUssQ0FBQ3NFLE9BQU8sRUFBRTNOLEtBQUssQ0FBQztnQkFDdEMsSUFBSStOLFFBQVEsS0FBSzdRLFNBQVMsRUFBRTtrQkFDeEIrUCxTQUFTLEdBQUdqRSxrREFBYSxDQUNyQixVQUFDN1EsQ0FBQyxFQUFFNlUsQ0FBQztvQkFBQSxPQUNEUCxNQUFJLENBQUNOLGdCQUFnQixDQUNqQnlCLE9BQU8sR0FBR3ZFLGtEQUFLLENBQUM4RCxTQUFRLEVBQUVoVixDQUFDLENBQUMsR0FBR0EsQ0FBQyxFQUNoQ3lWLE9BQU8sR0FDRDdMLGtEQUFNLENBQ0Y0TCxPQUFPLEVBQ1A1TCxrREFBTSxDQUFDLENBQUNpTCxDQUFDLENBQUMsRUFBRUcsU0FBUSxDQUN4QixDQUFDLEdBQ0RwTCxrREFBTSxDQUFDNEwsT0FBTyxFQUFFLENBQUNYLENBQUMsQ0FBQyxDQUM3QixDQUFDO2tCQUFBLEdBQ0xlLFFBQ0osQ0FBQztrQkFDRGpILElBQUksR0FBRzZHLE9BQU87Z0JBQ2xCO2NBQ0osQ0FBQyxNQUFNO2dCQUNIdkIsSUFBSSxHQUFHL0Msa0RBQUssQ0FBQ3ZDLElBQUksRUFBRTlHLEtBQUssQ0FBQztnQkFDekIsSUFBSW9NLElBQUksS0FBS2xQLFNBQVMsRUFBRTtrQkFBQTtnQkFFeEI7Z0JBQ0ErUCxTQUFTLEdBQUdSLE1BQUksQ0FBQ04sZ0JBQWdCLENBQUNDLElBQUksRUFBRXRGLElBQUksQ0FBQztjQUNqRDtZQUNKO1lBQ0E5RyxLQUFLLEdBQUcySSxrREFBUyxDQUFDN0IsSUFBSSxFQUFFbUcsU0FBUyxFQUFFak4sS0FBSyxDQUFDO1VBQzdDLENBQUMsTUFBTTtZQUNILElBQUlxTSxZQUFZLENBQUNqTyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7Y0FDN0IsSUFBSTJPLEtBQUssR0FBR1YsWUFBWSxDQUFDaUIsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7Y0FDMUMsSUFBTXJQLE9BQU8sR0FBR29PLFlBQVksQ0FBQ2pPLFFBQVEsQ0FBQyxJQUFJLENBQUM7Y0FDM0MsSUFBSUgsT0FBTyxFQUFFO2dCQUNUOE8sS0FBSyxHQUFHQSxLQUFLLENBQUNPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO2NBQ25DO2NBQ0EsSUFBTWxCLEtBQUksR0FBR3BNLEtBQUssQ0FBQytNLEtBQUssQ0FBQztjQUV6QixJQUFJWCxLQUFJLEtBQUtsUCxTQUFTLEVBQUU7Z0JBQ3BCLElBQUllLE9BQU8sRUFBRTtrQkFDVCxLQUFLLElBQUk0UCxFQUFDLEdBQUcsQ0FBQyxFQUFFQSxFQUFDLEdBQUd6QixLQUFJLENBQUMxUixNQUFNLEVBQUVtVCxFQUFDLEVBQUUsRUFBRTtvQkFDbEMsSUFBTUcsS0FBSyxHQUFHak0sa0RBQU0sQ0FBQyxDQUFDZ0wsS0FBSyxDQUFDLEVBQUUsQ0FBQ2MsRUFBQyxDQUFDLENBQUM7b0JBQ2xDN04sS0FBSyxHQUFHMkksa0RBQVMsQ0FDYnFGLEtBQUssRUFDTGxCLFlBQVksQ0FBQ1YsS0FBSSxDQUFDeUIsRUFBQyxDQUFDLEVBQUVHLEtBQUssQ0FBQyxFQUM1QmhPLEtBQ0osQ0FBQztrQkFDTDtnQkFDSixDQUFDLE1BQU07a0JBQ0hBLEtBQUssR0FBRzBJLGtEQUFLLENBQ1RxRSxLQUFLLEVBQ0xELFlBQVksQ0FBQ1YsS0FBSSxFQUFFLENBQUNXLEtBQUssQ0FBQyxDQUFDLEVBQzNCL00sS0FDSixDQUFDO2dCQUNMO2NBQ0o7WUFDSixDQUFDLE1BQU07Y0FDSCxJQUFNb00sTUFBSSxHQUFHcE0sS0FBSyxDQUFDcU0sWUFBWSxDQUFDO2NBQ2hDLElBQUlELE1BQUksS0FBS2xQLFNBQVMsRUFBRTtnQkFDcEI4QyxLQUFLLEdBQUcwSSxrREFBSyxDQUNUMkQsWUFBWSxFQUNaSSxNQUFJLENBQUNOLGdCQUFnQixDQUFDQyxNQUFJLEVBQUUsQ0FBQ0MsWUFBWSxDQUFDLENBQUMsRUFDM0NyTSxLQUNKLENBQUM7Y0FDTDtZQUNKO1VBQ0o7UUFDSixDQUFDO1FBQUFpTyxJQUFBO01BMUtELEtBQUssSUFBSTNYLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3FXLGFBQWEsQ0FBQ2pTLE1BQU0sRUFBRXBFLENBQUMsRUFBRTtRQUFBMlgsSUFBQSxHQUFBcEIsS0FBQTtRQUFBLElBQUFvQixJQUFBLFFBaUQ3QjtNQUFTO01BMkh6QixJQUFJelcsa0RBQUksQ0FBQ3dJLEtBQUssQ0FBQ3VLLEVBQUUsQ0FBQyxLQUFLLFFBQVEsRUFBRTtRQUM3QjtRQUNBO1FBQ0E7UUFDQXZLLEtBQUssQ0FBQ3VLLEVBQUUsR0FBR1Qsa0VBQVcsQ0FBQzlKLEtBQUssQ0FBQ3VLLEVBQUUsQ0FBQztNQUNwQztNQUNBLElBQU1ILFVBQVUsR0FBRztRQUNmb0MsYUFBYSxFQUFFQSxhQUFhLElBQUl4QyxXQUFXO1FBQzNDbUI7TUFDSixDQUFDO01BRUQsb0JBQ0k3TSwwREFBQSxDQUFDcUwsc0ZBQXNCO1FBQ25CdUUsYUFBYSxFQUFFekwsbUJBQW1CLENBQUNqTCxJQUFLO1FBQ3hDMlcsV0FBVyxFQUFFbk8sS0FBSyxDQUFDdUssRUFBRztRQUN0Qi9OLEdBQUcsRUFBRXdELEtBQUssQ0FBQ3VLLEVBQUc7UUFDZHJKLFFBQVEsRUFBRUQscUJBQXNCO1FBQ2hDdkUsS0FBSyxFQUFFOEY7TUFBbUIsR0FFekJ4QixtQkFBbUIsQ0FBQ29OLFdBQVcsZ0JBQzVCOVAsMERBQUEsQ0FBQzRMLGdCQUFnQjtRQUNiRyxRQUFRLEVBQUVBLFFBQVM7UUFDbkJGLE9BQU8sRUFBRUEsT0FBUTtRQUNqQm5LLEtBQUssRUFBRUEsS0FBTTtRQUNib0ssVUFBVSxFQUFFQSxVQUFXO1FBQ3ZCNVMsSUFBSSxFQUFFaUwsbUJBQW1CLENBQUNqTDtNQUFLLENBQ2xDLENBQUMsR0FFRjZLLGFBQWEsQ0FBQzhILE9BQU8sRUFBRW5LLEtBQUssRUFBRW9LLFVBQVUsRUFBRUMsUUFBUSxDQUVsQyxDQUFDO0lBRWpDO0VBQUM7SUFBQTdOLEdBQUE7SUFBQW5HLEtBQUEsRUFFRCxTQUFBcVYsZUFBQSxFQUFpQjtNQUNiLE9BQU90QyxrREFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUNwSixLQUFLLENBQUN5QyxtQkFBbUIsQ0FBQztJQUM5RDtFQUFDO0lBQUFqRyxHQUFBO0lBQUFuRyxLQUFBLEVBRUQsU0FBQXFQLE9BQUEsRUFBUztNQUNMLElBQUEySSxZQUFBLEdBSUksSUFBSSxDQUFDck8sS0FBSztRQUhWeUMsbUJBQW1CLEdBQUE0TCxZQUFBLENBQW5CNUwsbUJBQW1CO1FBQ25CQyx5QkFBeUIsR0FBQTJMLFlBQUEsQ0FBekIzTCx5QkFBeUI7UUFDekJFLGlCQUFpQixHQUFBeUwsWUFBQSxDQUFqQnpMLGlCQUFpQjtNQUdyQixJQUFNMEwsV0FBVyxHQUFHLElBQUksQ0FBQzVDLGNBQWMsQ0FBQyxDQUFDO01BRXpDLElBQU1yQixRQUFRLEdBQUcsSUFBSSxDQUFDMkIsV0FBVyxDQUM3QnNDLFdBQVcsQ0FBQ2pFLFFBQVEsRUFDcEJ6SCxpQkFDSixDQUFDO01BRUQsT0FBTyxJQUFJLENBQUMySixZQUFZLENBQ3BCOUosbUJBQW1CLEVBQ25CNEgsUUFBUSxFQUNSM0gseUJBQXlCLEVBQ3pCLElBQUksQ0FBQ3lJLFFBQ1QsQ0FBQztJQUNMO0VBQUM7RUFBQSxPQUFBSixpQkFBQTtBQUFBLEVBcFkyQmxGLDRDQUFTO0FBdVl6Q2pILGFBQWEsQ0FBQzJFLFNBQVMsR0FBRztFQUN0QmYsa0JBQWtCLEVBQUU3RCx1REFBYTtFQUNqQzhELG1CQUFtQixFQUFFOUQsMERBQWdCO0VBQ3JDK0QseUJBQXlCLEVBQUUvRCwyREFBbUIsQ0FBQyxDQUMzQ0EsMERBQWdCLEVBQ2hCQSx3REFBYyxDQUNqQixDQUFDO0VBQ0ZnRSw2QkFBNkIsRUFBRWhFLDBEQUFnQjtFQUMvQ2lFLGlCQUFpQixFQUFFakUsMERBQWdCNkw7QUFDdkMsQ0FBQztBQUVETyxpQkFBaUIsQ0FBQ3hILFNBQVMsR0FBQTRCLGFBQUEsQ0FBQUEsYUFBQSxLQUNwQnZHLGFBQWEsQ0FBQzJFLFNBQVM7RUFDMUJ2QyxtQkFBbUIsRUFBRXJDLDBEQUFnQjtFQUNyQ3NDLHFCQUFxQixFQUFFdEMsd0RBQWM7RUFDckN3QyxtQkFBbUIsRUFBRXhDLHVEQUFhO0VBQ2xDMEMsdUJBQXVCLEVBQUUxQyx1REFBYTtFQUN0Q2lFLGlCQUFpQixFQUFFakUseURBQWU4UDtBQUFBLEVBQ3JDO0FBRUQsK0RBQWU3UCxhQUFhOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0NDNWY1QixxSkFBQWpKLG1CQUFBLFlBQUFBLG9CQUFBLFdBQUFDLENBQUEsU0FBQUMsQ0FBQSxFQUFBRCxDQUFBLE9BQUFFLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxTQUFBLEVBQUFDLENBQUEsR0FBQUgsQ0FBQSxDQUFBSSxjQUFBLEVBQUFDLENBQUEsR0FBQUosTUFBQSxDQUFBSyxjQUFBLGNBQUFQLENBQUEsRUFBQUQsQ0FBQSxFQUFBRSxDQUFBLElBQUFELENBQUEsQ0FBQUQsQ0FBQSxJQUFBRSxDQUFBLENBQUFPLEtBQUEsS0FBQUMsQ0FBQSx3QkFBQUMsTUFBQSxHQUFBQSxNQUFBLE9BQUFDLENBQUEsR0FBQUYsQ0FBQSxDQUFBRyxRQUFBLGtCQUFBQyxDQUFBLEdBQUFKLENBQUEsQ0FBQUssYUFBQSx1QkFBQUMsQ0FBQSxHQUFBTixDQUFBLENBQUFPLFdBQUEsOEJBQUFDLE9BQUFqQixDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxXQUFBQyxNQUFBLENBQUFLLGNBQUEsQ0FBQVAsQ0FBQSxFQUFBRCxDQUFBLElBQUFTLEtBQUEsRUFBQVAsQ0FBQSxFQUFBaUIsVUFBQSxNQUFBQyxZQUFBLE1BQUFDLFFBQUEsU0FBQXBCLENBQUEsQ0FBQUQsQ0FBQSxXQUFBa0IsTUFBQSxtQkFBQWpCLENBQUEsSUFBQWlCLE1BQUEsWUFBQUEsT0FBQWpCLENBQUEsRUFBQUQsQ0FBQSxFQUFBRSxDQUFBLFdBQUFELENBQUEsQ0FBQUQsQ0FBQSxJQUFBRSxDQUFBLGdCQUFBb0IsS0FBQXJCLENBQUEsRUFBQUQsQ0FBQSxFQUFBRSxDQUFBLEVBQUFHLENBQUEsUUFBQUssQ0FBQSxHQUFBVixDQUFBLElBQUFBLENBQUEsQ0FBQUksU0FBQSxZQUFBbUIsU0FBQSxHQUFBdkIsQ0FBQSxHQUFBdUIsU0FBQSxFQUFBWCxDQUFBLEdBQUFULE1BQUEsQ0FBQXFCLE1BQUEsQ0FBQWQsQ0FBQSxDQUFBTixTQUFBLEdBQUFVLENBQUEsT0FBQVcsT0FBQSxDQUFBcEIsQ0FBQSxnQkFBQUUsQ0FBQSxDQUFBSyxDQUFBLGVBQUFILEtBQUEsRUFBQWlCLGdCQUFBLENBQUF6QixDQUFBLEVBQUFDLENBQUEsRUFBQVksQ0FBQSxNQUFBRixDQUFBLGFBQUFlLFNBQUExQixDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxtQkFBQTBCLElBQUEsWUFBQUMsR0FBQSxFQUFBNUIsQ0FBQSxDQUFBNkIsSUFBQSxDQUFBOUIsQ0FBQSxFQUFBRSxDQUFBLGNBQUFELENBQUEsYUFBQTJCLElBQUEsV0FBQUMsR0FBQSxFQUFBNUIsQ0FBQSxRQUFBRCxDQUFBLENBQUFzQixJQUFBLEdBQUFBLElBQUEsTUFBQVMsQ0FBQSxxQkFBQUMsQ0FBQSxxQkFBQUMsQ0FBQSxnQkFBQUMsQ0FBQSxnQkFBQUMsQ0FBQSxnQkFBQVosVUFBQSxjQUFBYSxrQkFBQSxjQUFBQywyQkFBQSxTQUFBQyxDQUFBLE9BQUFwQixNQUFBLENBQUFvQixDQUFBLEVBQUExQixDQUFBLHFDQUFBMkIsQ0FBQSxHQUFBcEMsTUFBQSxDQUFBcUMsY0FBQSxFQUFBQyxDQUFBLEdBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBQSxDQUFBLENBQUFHLE1BQUEsUUFBQUQsQ0FBQSxJQUFBQSxDQUFBLEtBQUF2QyxDQUFBLElBQUFHLENBQUEsQ0FBQXlCLElBQUEsQ0FBQVcsQ0FBQSxFQUFBN0IsQ0FBQSxNQUFBMEIsQ0FBQSxHQUFBRyxDQUFBLE9BQUFFLENBQUEsR0FBQU4sMEJBQUEsQ0FBQWpDLFNBQUEsR0FBQW1CLFNBQUEsQ0FBQW5CLFNBQUEsR0FBQUQsTUFBQSxDQUFBcUIsTUFBQSxDQUFBYyxDQUFBLFlBQUFNLHNCQUFBM0MsQ0FBQSxnQ0FBQTRDLE9BQUEsV0FBQTdDLENBQUEsSUFBQWtCLE1BQUEsQ0FBQWpCLENBQUEsRUFBQUQsQ0FBQSxZQUFBQyxDQUFBLGdCQUFBNkMsT0FBQSxDQUFBOUMsQ0FBQSxFQUFBQyxDQUFBLHNCQUFBOEMsY0FBQTlDLENBQUEsRUFBQUQsQ0FBQSxhQUFBZ0QsT0FBQTlDLENBQUEsRUFBQUssQ0FBQSxFQUFBRyxDQUFBLEVBQUFFLENBQUEsUUFBQUUsQ0FBQSxHQUFBYSxRQUFBLENBQUExQixDQUFBLENBQUFDLENBQUEsR0FBQUQsQ0FBQSxFQUFBTSxDQUFBLG1CQUFBTyxDQUFBLENBQUFjLElBQUEsUUFBQVosQ0FBQSxHQUFBRixDQUFBLENBQUFlLEdBQUEsRUFBQUUsQ0FBQSxHQUFBZixDQUFBLENBQUFQLEtBQUEsU0FBQXNCLENBQUEsdUJBQUFBLENBQUEsSUFBQTFCLENBQUEsQ0FBQXlCLElBQUEsQ0FBQUMsQ0FBQSxlQUFBL0IsQ0FBQSxDQUFBaUQsT0FBQSxDQUFBbEIsQ0FBQSxDQUFBbUIsT0FBQSxFQUFBQyxJQUFBLFdBQUFsRCxDQUFBLElBQUErQyxNQUFBLFNBQUEvQyxDQUFBLEVBQUFTLENBQUEsRUFBQUUsQ0FBQSxnQkFBQVgsQ0FBQSxJQUFBK0MsTUFBQSxVQUFBL0MsQ0FBQSxFQUFBUyxDQUFBLEVBQUFFLENBQUEsUUFBQVosQ0FBQSxDQUFBaUQsT0FBQSxDQUFBbEIsQ0FBQSxFQUFBb0IsSUFBQSxXQUFBbEQsQ0FBQSxJQUFBZSxDQUFBLENBQUFQLEtBQUEsR0FBQVIsQ0FBQSxFQUFBUyxDQUFBLENBQUFNLENBQUEsZ0JBQUFmLENBQUEsV0FBQStDLE1BQUEsVUFBQS9DLENBQUEsRUFBQVMsQ0FBQSxFQUFBRSxDQUFBLFNBQUFBLENBQUEsQ0FBQUUsQ0FBQSxDQUFBZSxHQUFBLFNBQUEzQixDQUFBLEVBQUFLLENBQUEsb0JBQUFFLEtBQUEsV0FBQUEsTUFBQVIsQ0FBQSxFQUFBSSxDQUFBLGFBQUErQywyQkFBQSxlQUFBcEQsQ0FBQSxXQUFBQSxDQUFBLEVBQUFFLENBQUEsSUFBQThDLE1BQUEsQ0FBQS9DLENBQUEsRUFBQUksQ0FBQSxFQUFBTCxDQUFBLEVBQUFFLENBQUEsZ0JBQUFBLENBQUEsR0FBQUEsQ0FBQSxHQUFBQSxDQUFBLENBQUFpRCxJQUFBLENBQUFDLDBCQUFBLEVBQUFBLDBCQUFBLElBQUFBLDBCQUFBLHFCQUFBMUIsaUJBQUExQixDQUFBLEVBQUFFLENBQUEsRUFBQUcsQ0FBQSxRQUFBRSxDQUFBLEdBQUF3QixDQUFBLG1CQUFBckIsQ0FBQSxFQUFBRSxDQUFBLFFBQUFMLENBQUEsS0FBQTBCLENBQUEsWUFBQW9CLEtBQUEsc0NBQUE5QyxDQUFBLEtBQUEyQixDQUFBLG9CQUFBeEIsQ0FBQSxRQUFBRSxDQUFBLFdBQUFILEtBQUEsRUFBQVIsQ0FBQSxFQUFBcUQsSUFBQSxlQUFBakQsQ0FBQSxDQUFBa0QsTUFBQSxHQUFBN0MsQ0FBQSxFQUFBTCxDQUFBLENBQUF3QixHQUFBLEdBQUFqQixDQUFBLFVBQUFFLENBQUEsR0FBQVQsQ0FBQSxDQUFBbUQsUUFBQSxNQUFBMUMsQ0FBQSxRQUFBRSxDQUFBLEdBQUF5QyxtQkFBQSxDQUFBM0MsQ0FBQSxFQUFBVCxDQUFBLE9BQUFXLENBQUEsUUFBQUEsQ0FBQSxLQUFBbUIsQ0FBQSxtQkFBQW5CLENBQUEscUJBQUFYLENBQUEsQ0FBQWtELE1BQUEsRUFBQWxELENBQUEsQ0FBQXFELElBQUEsR0FBQXJELENBQUEsQ0FBQXNELEtBQUEsR0FBQXRELENBQUEsQ0FBQXdCLEdBQUEsc0JBQUF4QixDQUFBLENBQUFrRCxNQUFBLFFBQUFoRCxDQUFBLEtBQUF3QixDQUFBLFFBQUF4QixDQUFBLEdBQUEyQixDQUFBLEVBQUE3QixDQUFBLENBQUF3QixHQUFBLEVBQUF4QixDQUFBLENBQUF1RCxpQkFBQSxDQUFBdkQsQ0FBQSxDQUFBd0IsR0FBQSx1QkFBQXhCLENBQUEsQ0FBQWtELE1BQUEsSUFBQWxELENBQUEsQ0FBQXdELE1BQUEsV0FBQXhELENBQUEsQ0FBQXdCLEdBQUEsR0FBQXRCLENBQUEsR0FBQTBCLENBQUEsTUFBQUssQ0FBQSxHQUFBWCxRQUFBLENBQUEzQixDQUFBLEVBQUFFLENBQUEsRUFBQUcsQ0FBQSxvQkFBQWlDLENBQUEsQ0FBQVYsSUFBQSxRQUFBckIsQ0FBQSxHQUFBRixDQUFBLENBQUFpRCxJQUFBLEdBQUFwQixDQUFBLEdBQUFGLENBQUEsRUFBQU0sQ0FBQSxDQUFBVCxHQUFBLEtBQUFNLENBQUEscUJBQUExQixLQUFBLEVBQUE2QixDQUFBLENBQUFULEdBQUEsRUFBQXlCLElBQUEsRUFBQWpELENBQUEsQ0FBQWlELElBQUEsa0JBQUFoQixDQUFBLENBQUFWLElBQUEsS0FBQXJCLENBQUEsR0FBQTJCLENBQUEsRUFBQTdCLENBQUEsQ0FBQWtELE1BQUEsWUFBQWxELENBQUEsQ0FBQXdCLEdBQUEsR0FBQVMsQ0FBQSxDQUFBVCxHQUFBLG1CQUFBNEIsb0JBQUF6RCxDQUFBLEVBQUFFLENBQUEsUUFBQUcsQ0FBQSxHQUFBSCxDQUFBLENBQUFxRCxNQUFBLEVBQUFoRCxDQUFBLEdBQUFQLENBQUEsQ0FBQWEsUUFBQSxDQUFBUixDQUFBLE9BQUFFLENBQUEsS0FBQU4sQ0FBQSxTQUFBQyxDQUFBLENBQUFzRCxRQUFBLHFCQUFBbkQsQ0FBQSxJQUFBTCxDQUFBLENBQUFhLFFBQUEsQ0FBQWlELE1BQUEsS0FBQTVELENBQUEsQ0FBQXFELE1BQUEsYUFBQXJELENBQUEsQ0FBQTJCLEdBQUEsR0FBQTVCLENBQUEsRUFBQXdELG1CQUFBLENBQUF6RCxDQUFBLEVBQUFFLENBQUEsZUFBQUEsQ0FBQSxDQUFBcUQsTUFBQSxrQkFBQWxELENBQUEsS0FBQUgsQ0FBQSxDQUFBcUQsTUFBQSxZQUFBckQsQ0FBQSxDQUFBMkIsR0FBQSxPQUFBa0MsU0FBQSx1Q0FBQTFELENBQUEsaUJBQUE4QixDQUFBLE1BQUF6QixDQUFBLEdBQUFpQixRQUFBLENBQUFwQixDQUFBLEVBQUFQLENBQUEsQ0FBQWEsUUFBQSxFQUFBWCxDQUFBLENBQUEyQixHQUFBLG1CQUFBbkIsQ0FBQSxDQUFBa0IsSUFBQSxTQUFBMUIsQ0FBQSxDQUFBcUQsTUFBQSxZQUFBckQsQ0FBQSxDQUFBMkIsR0FBQSxHQUFBbkIsQ0FBQSxDQUFBbUIsR0FBQSxFQUFBM0IsQ0FBQSxDQUFBc0QsUUFBQSxTQUFBckIsQ0FBQSxNQUFBdkIsQ0FBQSxHQUFBRixDQUFBLENBQUFtQixHQUFBLFNBQUFqQixDQUFBLEdBQUFBLENBQUEsQ0FBQTBDLElBQUEsSUFBQXBELENBQUEsQ0FBQUYsQ0FBQSxDQUFBZ0UsVUFBQSxJQUFBcEQsQ0FBQSxDQUFBSCxLQUFBLEVBQUFQLENBQUEsQ0FBQStELElBQUEsR0FBQWpFLENBQUEsQ0FBQWtFLE9BQUEsZUFBQWhFLENBQUEsQ0FBQXFELE1BQUEsS0FBQXJELENBQUEsQ0FBQXFELE1BQUEsV0FBQXJELENBQUEsQ0FBQTJCLEdBQUEsR0FBQTVCLENBQUEsR0FBQUMsQ0FBQSxDQUFBc0QsUUFBQSxTQUFBckIsQ0FBQSxJQUFBdkIsQ0FBQSxJQUFBVixDQUFBLENBQUFxRCxNQUFBLFlBQUFyRCxDQUFBLENBQUEyQixHQUFBLE9BQUFrQyxTQUFBLHNDQUFBN0QsQ0FBQSxDQUFBc0QsUUFBQSxTQUFBckIsQ0FBQSxjQUFBZ0MsYUFBQWxFLENBQUEsUUFBQUQsQ0FBQSxLQUFBb0UsTUFBQSxFQUFBbkUsQ0FBQSxZQUFBQSxDQUFBLEtBQUFELENBQUEsQ0FBQXFFLFFBQUEsR0FBQXBFLENBQUEsV0FBQUEsQ0FBQSxLQUFBRCxDQUFBLENBQUFzRSxVQUFBLEdBQUFyRSxDQUFBLEtBQUFELENBQUEsQ0FBQXVFLFFBQUEsR0FBQXRFLENBQUEsV0FBQXVFLFVBQUEsQ0FBQUMsSUFBQSxDQUFBekUsQ0FBQSxjQUFBMEUsY0FBQXpFLENBQUEsUUFBQUQsQ0FBQSxHQUFBQyxDQUFBLENBQUEwRSxVQUFBLFFBQUEzRSxDQUFBLENBQUE0QixJQUFBLG9CQUFBNUIsQ0FBQSxDQUFBNkIsR0FBQSxFQUFBNUIsQ0FBQSxDQUFBMEUsVUFBQSxHQUFBM0UsQ0FBQSxhQUFBeUIsUUFBQXhCLENBQUEsU0FBQXVFLFVBQUEsTUFBQUosTUFBQSxhQUFBbkUsQ0FBQSxDQUFBNEMsT0FBQSxDQUFBc0IsWUFBQSxjQUFBUyxLQUFBLGlCQUFBbEMsT0FBQTFDLENBQUEsUUFBQUEsQ0FBQSxXQUFBQSxDQUFBLFFBQUFFLENBQUEsR0FBQUYsQ0FBQSxDQUFBWSxDQUFBLE9BQUFWLENBQUEsU0FBQUEsQ0FBQSxDQUFBNEIsSUFBQSxDQUFBOUIsQ0FBQSw0QkFBQUEsQ0FBQSxDQUFBaUUsSUFBQSxTQUFBakUsQ0FBQSxPQUFBNkUsS0FBQSxDQUFBN0UsQ0FBQSxDQUFBOEUsTUFBQSxTQUFBdkUsQ0FBQSxPQUFBRyxDQUFBLFlBQUF1RCxLQUFBLGFBQUExRCxDQUFBLEdBQUFQLENBQUEsQ0FBQThFLE1BQUEsT0FBQXpFLENBQUEsQ0FBQXlCLElBQUEsQ0FBQTlCLENBQUEsRUFBQU8sQ0FBQSxVQUFBMEQsSUFBQSxDQUFBeEQsS0FBQSxHQUFBVCxDQUFBLENBQUFPLENBQUEsR0FBQTBELElBQUEsQ0FBQVgsSUFBQSxPQUFBVyxJQUFBLFNBQUFBLElBQUEsQ0FBQXhELEtBQUEsR0FBQVIsQ0FBQSxFQUFBZ0UsSUFBQSxDQUFBWCxJQUFBLE9BQUFXLElBQUEsWUFBQXZELENBQUEsQ0FBQXVELElBQUEsR0FBQXZELENBQUEsZ0JBQUFxRCxTQUFBLFFBQUEvRCxDQUFBLGlDQUFBb0MsaUJBQUEsQ0FBQWhDLFNBQUEsR0FBQWlDLDBCQUFBLEVBQUE5QixDQUFBLENBQUFvQyxDQUFBLG1CQUFBbEMsS0FBQSxFQUFBNEIsMEJBQUEsRUFBQWpCLFlBQUEsU0FBQWIsQ0FBQSxDQUFBOEIsMEJBQUEsbUJBQUE1QixLQUFBLEVBQUEyQixpQkFBQSxFQUFBaEIsWUFBQSxTQUFBZ0IsaUJBQUEsQ0FBQTJDLFdBQUEsR0FBQTdELE1BQUEsQ0FBQW1CLDBCQUFBLEVBQUFyQixDQUFBLHdCQUFBaEIsQ0FBQSxDQUFBZ0YsbUJBQUEsYUFBQS9FLENBQUEsUUFBQUQsQ0FBQSx3QkFBQUMsQ0FBQSxJQUFBQSxDQUFBLENBQUFnRixXQUFBLFdBQUFqRixDQUFBLEtBQUFBLENBQUEsS0FBQW9DLGlCQUFBLDZCQUFBcEMsQ0FBQSxDQUFBK0UsV0FBQSxJQUFBL0UsQ0FBQSxDQUFBa0YsSUFBQSxPQUFBbEYsQ0FBQSxDQUFBbUYsSUFBQSxhQUFBbEYsQ0FBQSxXQUFBRSxNQUFBLENBQUFpRixjQUFBLEdBQUFqRixNQUFBLENBQUFpRixjQUFBLENBQUFuRixDQUFBLEVBQUFvQywwQkFBQSxLQUFBcEMsQ0FBQSxDQUFBb0YsU0FBQSxHQUFBaEQsMEJBQUEsRUFBQW5CLE1BQUEsQ0FBQWpCLENBQUEsRUFBQWUsQ0FBQSx5QkFBQWYsQ0FBQSxDQUFBRyxTQUFBLEdBQUFELE1BQUEsQ0FBQXFCLE1BQUEsQ0FBQW1CLENBQUEsR0FBQTFDLENBQUEsS0FBQUQsQ0FBQSxDQUFBc0YsS0FBQSxhQUFBckYsQ0FBQSxhQUFBaUQsT0FBQSxFQUFBakQsQ0FBQSxPQUFBMkMscUJBQUEsQ0FBQUcsYUFBQSxDQUFBM0MsU0FBQSxHQUFBYyxNQUFBLENBQUE2QixhQUFBLENBQUEzQyxTQUFBLEVBQUFVLENBQUEsaUNBQUFkLENBQUEsQ0FBQStDLGFBQUEsR0FBQUEsYUFBQSxFQUFBL0MsQ0FBQSxDQUFBdUYsS0FBQSxhQUFBdEYsQ0FBQSxFQUFBQyxDQUFBLEVBQUFHLENBQUEsRUFBQUUsQ0FBQSxFQUFBRyxDQUFBLGVBQUFBLENBQUEsS0FBQUEsQ0FBQSxHQUFBOEUsT0FBQSxPQUFBNUUsQ0FBQSxPQUFBbUMsYUFBQSxDQUFBekIsSUFBQSxDQUFBckIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFHLENBQUEsRUFBQUUsQ0FBQSxHQUFBRyxDQUFBLFVBQUFWLENBQUEsQ0FBQWdGLG1CQUFBLENBQUE5RSxDQUFBLElBQUFVLENBQUEsR0FBQUEsQ0FBQSxDQUFBcUQsSUFBQSxHQUFBZCxJQUFBLFdBQUFsRCxDQUFBLFdBQUFBLENBQUEsQ0FBQXFELElBQUEsR0FBQXJELENBQUEsQ0FBQVEsS0FBQSxHQUFBRyxDQUFBLENBQUFxRCxJQUFBLFdBQUFyQixxQkFBQSxDQUFBRCxDQUFBLEdBQUF6QixNQUFBLENBQUF5QixDQUFBLEVBQUEzQixDQUFBLGdCQUFBRSxNQUFBLENBQUF5QixDQUFBLEVBQUEvQixDQUFBLGlDQUFBTSxNQUFBLENBQUF5QixDQUFBLDZEQUFBM0MsQ0FBQSxDQUFBeUYsSUFBQSxhQUFBeEYsQ0FBQSxRQUFBRCxDQUFBLEdBQUFHLE1BQUEsQ0FBQUYsQ0FBQSxHQUFBQyxDQUFBLGdCQUFBRyxDQUFBLElBQUFMLENBQUEsRUFBQUUsQ0FBQSxDQUFBdUUsSUFBQSxDQUFBcEUsQ0FBQSxVQUFBSCxDQUFBLENBQUF3RixPQUFBLGFBQUF6QixLQUFBLFdBQUEvRCxDQUFBLENBQUE0RSxNQUFBLFNBQUE3RSxDQUFBLEdBQUFDLENBQUEsQ0FBQXlGLEdBQUEsUUFBQTFGLENBQUEsSUFBQUQsQ0FBQSxTQUFBaUUsSUFBQSxDQUFBeEQsS0FBQSxHQUFBUixDQUFBLEVBQUFnRSxJQUFBLENBQUFYLElBQUEsT0FBQVcsSUFBQSxXQUFBQSxJQUFBLENBQUFYLElBQUEsT0FBQVcsSUFBQSxRQUFBakUsQ0FBQSxDQUFBMEMsTUFBQSxHQUFBQSxNQUFBLEVBQUFqQixPQUFBLENBQUFyQixTQUFBLEtBQUE2RSxXQUFBLEVBQUF4RCxPQUFBLEVBQUFtRCxLQUFBLFdBQUFBLE1BQUE1RSxDQUFBLGFBQUE0RixJQUFBLFdBQUEzQixJQUFBLFdBQUFQLElBQUEsUUFBQUMsS0FBQSxHQUFBMUQsQ0FBQSxPQUFBcUQsSUFBQSxZQUFBRSxRQUFBLGNBQUFELE1BQUEsZ0JBQUExQixHQUFBLEdBQUE1QixDQUFBLE9BQUF1RSxVQUFBLENBQUEzQixPQUFBLENBQUE2QixhQUFBLElBQUExRSxDQUFBLFdBQUFFLENBQUEsa0JBQUFBLENBQUEsQ0FBQTJGLE1BQUEsT0FBQXhGLENBQUEsQ0FBQXlCLElBQUEsT0FBQTVCLENBQUEsTUFBQTJFLEtBQUEsRUFBQTNFLENBQUEsQ0FBQTRGLEtBQUEsY0FBQTVGLENBQUEsSUFBQUQsQ0FBQSxNQUFBOEYsSUFBQSxXQUFBQSxLQUFBLFNBQUF6QyxJQUFBLFdBQUFyRCxDQUFBLFFBQUF1RSxVQUFBLElBQUFHLFVBQUEsa0JBQUExRSxDQUFBLENBQUEyQixJQUFBLFFBQUEzQixDQUFBLENBQUE0QixHQUFBLGNBQUFtRSxJQUFBLEtBQUFwQyxpQkFBQSxXQUFBQSxrQkFBQTVELENBQUEsYUFBQXNELElBQUEsUUFBQXRELENBQUEsTUFBQUUsQ0FBQSxrQkFBQStGLE9BQUE1RixDQUFBLEVBQUFFLENBQUEsV0FBQUssQ0FBQSxDQUFBZ0IsSUFBQSxZQUFBaEIsQ0FBQSxDQUFBaUIsR0FBQSxHQUFBN0IsQ0FBQSxFQUFBRSxDQUFBLENBQUErRCxJQUFBLEdBQUE1RCxDQUFBLEVBQUFFLENBQUEsS0FBQUwsQ0FBQSxDQUFBcUQsTUFBQSxXQUFBckQsQ0FBQSxDQUFBMkIsR0FBQSxHQUFBNUIsQ0FBQSxLQUFBTSxDQUFBLGFBQUFBLENBQUEsUUFBQWlFLFVBQUEsQ0FBQU0sTUFBQSxNQUFBdkUsQ0FBQSxTQUFBQSxDQUFBLFFBQUFHLENBQUEsUUFBQThELFVBQUEsQ0FBQWpFLENBQUEsR0FBQUssQ0FBQSxHQUFBRixDQUFBLENBQUFpRSxVQUFBLGlCQUFBakUsQ0FBQSxDQUFBMEQsTUFBQSxTQUFBNkIsTUFBQSxhQUFBdkYsQ0FBQSxDQUFBMEQsTUFBQSxTQUFBd0IsSUFBQSxRQUFBOUUsQ0FBQSxHQUFBVCxDQUFBLENBQUF5QixJQUFBLENBQUFwQixDQUFBLGVBQUFNLENBQUEsR0FBQVgsQ0FBQSxDQUFBeUIsSUFBQSxDQUFBcEIsQ0FBQSxxQkFBQUksQ0FBQSxJQUFBRSxDQUFBLGFBQUE0RSxJQUFBLEdBQUFsRixDQUFBLENBQUEyRCxRQUFBLFNBQUE0QixNQUFBLENBQUF2RixDQUFBLENBQUEyRCxRQUFBLGdCQUFBdUIsSUFBQSxHQUFBbEYsQ0FBQSxDQUFBNEQsVUFBQSxTQUFBMkIsTUFBQSxDQUFBdkYsQ0FBQSxDQUFBNEQsVUFBQSxjQUFBeEQsQ0FBQSxhQUFBOEUsSUFBQSxHQUFBbEYsQ0FBQSxDQUFBMkQsUUFBQSxTQUFBNEIsTUFBQSxDQUFBdkYsQ0FBQSxDQUFBMkQsUUFBQSxxQkFBQXJELENBQUEsWUFBQXFDLEtBQUEscURBQUF1QyxJQUFBLEdBQUFsRixDQUFBLENBQUE0RCxVQUFBLFNBQUEyQixNQUFBLENBQUF2RixDQUFBLENBQUE0RCxVQUFBLFlBQUFULE1BQUEsV0FBQUEsT0FBQTVELENBQUEsRUFBQUQsQ0FBQSxhQUFBRSxDQUFBLFFBQUFzRSxVQUFBLENBQUFNLE1BQUEsTUFBQTVFLENBQUEsU0FBQUEsQ0FBQSxRQUFBSyxDQUFBLFFBQUFpRSxVQUFBLENBQUF0RSxDQUFBLE9BQUFLLENBQUEsQ0FBQTZELE1BQUEsU0FBQXdCLElBQUEsSUFBQXZGLENBQUEsQ0FBQXlCLElBQUEsQ0FBQXZCLENBQUEsd0JBQUFxRixJQUFBLEdBQUFyRixDQUFBLENBQUErRCxVQUFBLFFBQUE1RCxDQUFBLEdBQUFILENBQUEsYUFBQUcsQ0FBQSxpQkFBQVQsQ0FBQSxtQkFBQUEsQ0FBQSxLQUFBUyxDQUFBLENBQUEwRCxNQUFBLElBQUFwRSxDQUFBLElBQUFBLENBQUEsSUFBQVUsQ0FBQSxDQUFBNEQsVUFBQSxLQUFBNUQsQ0FBQSxjQUFBRSxDQUFBLEdBQUFGLENBQUEsR0FBQUEsQ0FBQSxDQUFBaUUsVUFBQSxjQUFBL0QsQ0FBQSxDQUFBZ0IsSUFBQSxHQUFBM0IsQ0FBQSxFQUFBVyxDQUFBLENBQUFpQixHQUFBLEdBQUE3QixDQUFBLEVBQUFVLENBQUEsU0FBQTZDLE1BQUEsZ0JBQUFVLElBQUEsR0FBQXZELENBQUEsQ0FBQTRELFVBQUEsRUFBQW5DLENBQUEsU0FBQStELFFBQUEsQ0FBQXRGLENBQUEsTUFBQXNGLFFBQUEsV0FBQUEsU0FBQWpHLENBQUEsRUFBQUQsQ0FBQSxvQkFBQUMsQ0FBQSxDQUFBMkIsSUFBQSxRQUFBM0IsQ0FBQSxDQUFBNEIsR0FBQSxxQkFBQTVCLENBQUEsQ0FBQTJCLElBQUEsbUJBQUEzQixDQUFBLENBQUEyQixJQUFBLFFBQUFxQyxJQUFBLEdBQUFoRSxDQUFBLENBQUE0QixHQUFBLGdCQUFBNUIsQ0FBQSxDQUFBMkIsSUFBQSxTQUFBb0UsSUFBQSxRQUFBbkUsR0FBQSxHQUFBNUIsQ0FBQSxDQUFBNEIsR0FBQSxPQUFBMEIsTUFBQSxrQkFBQVUsSUFBQSx5QkFBQWhFLENBQUEsQ0FBQTJCLElBQUEsSUFBQTVCLENBQUEsVUFBQWlFLElBQUEsR0FBQWpFLENBQUEsR0FBQW1DLENBQUEsS0FBQWdFLE1BQUEsV0FBQUEsT0FBQWxHLENBQUEsYUFBQUQsQ0FBQSxRQUFBd0UsVUFBQSxDQUFBTSxNQUFBLE1BQUE5RSxDQUFBLFNBQUFBLENBQUEsUUFBQUUsQ0FBQSxRQUFBc0UsVUFBQSxDQUFBeEUsQ0FBQSxPQUFBRSxDQUFBLENBQUFvRSxVQUFBLEtBQUFyRSxDQUFBLGNBQUFpRyxRQUFBLENBQUFoRyxDQUFBLENBQUF5RSxVQUFBLEVBQUF6RSxDQUFBLENBQUFxRSxRQUFBLEdBQUFHLGFBQUEsQ0FBQXhFLENBQUEsR0FBQWlDLENBQUEsT0FBQWlFLEtBQUEsV0FBQUMsT0FBQXBHLENBQUEsYUFBQUQsQ0FBQSxRQUFBd0UsVUFBQSxDQUFBTSxNQUFBLE1BQUE5RSxDQUFBLFNBQUFBLENBQUEsUUFBQUUsQ0FBQSxRQUFBc0UsVUFBQSxDQUFBeEUsQ0FBQSxPQUFBRSxDQUFBLENBQUFrRSxNQUFBLEtBQUFuRSxDQUFBLFFBQUFJLENBQUEsR0FBQUgsQ0FBQSxDQUFBeUUsVUFBQSxrQkFBQXRFLENBQUEsQ0FBQXVCLElBQUEsUUFBQXJCLENBQUEsR0FBQUYsQ0FBQSxDQUFBd0IsR0FBQSxFQUFBNkMsYUFBQSxDQUFBeEUsQ0FBQSxZQUFBSyxDQUFBLGdCQUFBOEMsS0FBQSw4QkFBQWlELGFBQUEsV0FBQUEsY0FBQXRHLENBQUEsRUFBQUUsQ0FBQSxFQUFBRyxDQUFBLGdCQUFBbUQsUUFBQSxLQUFBM0MsUUFBQSxFQUFBNkIsTUFBQSxDQUFBMUMsQ0FBQSxHQUFBZ0UsVUFBQSxFQUFBOUQsQ0FBQSxFQUFBZ0UsT0FBQSxFQUFBN0QsQ0FBQSxvQkFBQWtELE1BQUEsVUFBQTFCLEdBQUEsR0FBQTVCLENBQUEsR0FBQWtDLENBQUEsT0FBQW5DLENBQUE7QUFBQSxTQUFBdUcsbUJBQUFDLEdBQUEsRUFBQXZELE9BQUEsRUFBQXdELE1BQUEsRUFBQUMsS0FBQSxFQUFBQyxNQUFBLEVBQUFDLEdBQUEsRUFBQS9FLEdBQUEsY0FBQWdGLElBQUEsR0FBQUwsR0FBQSxDQUFBSSxHQUFBLEVBQUEvRSxHQUFBLE9BQUFwQixLQUFBLEdBQUFvRyxJQUFBLENBQUFwRyxLQUFBLFdBQUFxRyxLQUFBLElBQUFMLE1BQUEsQ0FBQUssS0FBQSxpQkFBQUQsSUFBQSxDQUFBdkQsSUFBQSxJQUFBTCxPQUFBLENBQUF4QyxLQUFBLFlBQUErRSxPQUFBLENBQUF2QyxPQUFBLENBQUF4QyxLQUFBLEVBQUEwQyxJQUFBLENBQUF1RCxLQUFBLEVBQUFDLE1BQUE7QUFBQSxTQUFBSSxrQkFBQUMsRUFBQSw2QkFBQUMsSUFBQSxTQUFBQyxJQUFBLEdBQUFDLFNBQUEsYUFBQTNCLE9BQUEsV0FBQXZDLE9BQUEsRUFBQXdELE1BQUEsUUFBQUQsR0FBQSxHQUFBUSxFQUFBLENBQUFJLEtBQUEsQ0FBQUgsSUFBQSxFQUFBQyxJQUFBLFlBQUFSLE1BQUFqRyxLQUFBLElBQUE4RixrQkFBQSxDQUFBQyxHQUFBLEVBQUF2RCxPQUFBLEVBQUF3RCxNQUFBLEVBQUFDLEtBQUEsRUFBQUMsTUFBQSxVQUFBbEcsS0FBQSxjQUFBa0csT0FBQVUsR0FBQSxJQUFBZCxrQkFBQSxDQUFBQyxHQUFBLEVBQUF2RCxPQUFBLEVBQUF3RCxNQUFBLEVBQUFDLEtBQUEsRUFBQUMsTUFBQSxXQUFBVSxHQUFBLEtBQUFYLEtBQUEsQ0FBQVksU0FBQTtBQUQyQztBQUNnQztBQUMzQztBQUNhO0FBQ3NCOztBQUVuRTtBQUNBLElBQU1nUyxjQUFjLEdBQUdQLGlEQUFJLENBQUNRLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDO0FBRXpDLFNBQVNDLEdBQUdBLENBQUN2SSxJQUFJLEVBQUV3SSxXQUFXLEVBQUU7RUFDNUIsT0FBT2hLLEtBQUssQ0FDUndCLElBQUksRUFDSjRILGlEQUFjLENBQUNZLFdBQVcsRUFBRTtJQUN4Qm5XLE1BQU0sRUFBRSxLQUFLO0lBQ2JxTSxPQUFPLEVBQUVvSix1REFBYSxDQUFDO0VBQzNCLENBQUMsQ0FDTCxDQUFDO0FBQ0w7QUFFQSxTQUFTVyxJQUFJQSxDQUFDekksSUFBSSxFQUFFd0ksV0FBVyxFQUFhO0VBQUEsSUFBWEUsSUFBSSxHQUFBelMsU0FBQSxDQUFBckMsTUFBQSxRQUFBcUMsU0FBQSxRQUFBRyxTQUFBLEdBQUFILFNBQUEsTUFBRyxDQUFDLENBQUM7RUFDdEMsT0FBT3VJLEtBQUssQ0FDUndCLElBQUksRUFDSjRILGlEQUFjLENBQUNZLFdBQVcsRUFBRTtJQUN4Qm5XLE1BQU0sRUFBRSxNQUFNO0lBQ2RxTSxPQUFPLEVBQUVvSix1REFBYSxDQUFDLENBQUM7SUFDeEJZLElBQUksRUFBRUEsSUFBSSxHQUFHM00sSUFBSSxDQUFDQyxTQUFTLENBQUMwTSxJQUFJLENBQUMsR0FBRztFQUN4QyxDQUFDLENBQ0wsQ0FBQztBQUNMO0FBRUEsSUFBTUMsT0FBTyxHQUFHO0VBQUNKLEdBQUc7RUFBRUU7QUFBSSxDQUFDO0FBRVosU0FBU2pRLFFBQVFBLENBQUNvUSxRQUFRLEVBQUV2VyxNQUFNLEVBQUUrTSxLQUFLLEVBQUVxRSxFQUFFLEVBQUVpRixJQUFJLEVBQUU7RUFDaEU7SUFBQSxJQUFBdkosSUFBQSxHQUFBdEosaUJBQUEsZUFBQWhILG1CQUFBLEdBQUFvRixJQUFBLENBQU8sU0FBQXlHLFFBQU9OLFFBQVEsRUFBRStHLFFBQVE7TUFBQSxJQUFBNEQsU0FBQSxFQUFBM0wsTUFBQSxFQUFBOEMsS0FBQSxFQUFBMk0sVUFBQSxFQUFBQyxHQUFBLEVBTW5CQyxtQkFBbUIsRUFBQUMsR0FBQSxFQUFBQyxLQUFBLEVBQUFDLEtBQUEsRUFBQUMsTUFBQSxFQUFBQyxXQUFBLEVBQUFDLE9BQUE7TUFBQSxPQUFBeGEsbUJBQUEsR0FBQXVCLElBQUEsVUFBQXVLLFNBQUFDLFFBQUE7UUFBQSxrQkFBQUEsUUFBQSxDQUFBbEcsSUFBQSxHQUFBa0csUUFBQSxDQUFBN0gsSUFBQTtVQUFBO1lBQW5CZ1csbUJBQW1CLFlBQUFPLHFCQUFDQyxTQUFTLEVBQUU7Y0FDcEMsSUFBSXBJLFFBQVEsQ0FBQyxDQUFDLENBQUN2TCxLQUFLLENBQUM0VCxnQkFBZ0IsS0FBS0QsU0FBUyxFQUFFO2dCQUNqRG5QLFFBQVEsQ0FBQztrQkFDTDFKLElBQUksRUFBRSx1QkFBdUI7a0JBQzdCK1ksT0FBTyxFQUFFRjtnQkFDYixDQUFDLENBQUM7Y0FDTjtZQUNKLENBQUM7WUFBQXhFLFNBQUEsR0FacUI1RCxRQUFRLENBQUMsQ0FBQyxFQUEzQi9ILE1BQU0sR0FBQTJMLFNBQUEsQ0FBTjNMLE1BQU0sRUFBRThDLEtBQUssR0FBQTZJLFNBQUEsQ0FBTDdJLEtBQUs7WUFDZDJNLFVBQVUsR0FBRyxJQUFJO1lBRWZDLEdBQUcsTUFBQTdOLE1BQUEsQ0FBTWdOLCtDQUFPLENBQUM3TyxNQUFNLENBQUMsRUFBQTZCLE1BQUEsQ0FBRzJOLFFBQVE7WUFXekN4TyxRQUFRLENBQUM7Y0FDTDFKLElBQUksRUFBRTBPLEtBQUs7Y0FDWHFLLE9BQU8sRUFBRTtnQkFBQ2hHLEVBQUU7Z0JBQUVwSSxNQUFNLEVBQUU7Y0FBUztZQUNuQyxDQUFDLENBQUM7WUFBQ1QsUUFBQSxDQUFBbEcsSUFBQTtZQUlVdVUsS0FBSyxHQUFHLENBQUM7VUFBQTtZQUFBLE1BQUVBLEtBQUssSUFBSWYsd0RBQWdCO2NBQUF0TixRQUFBLENBQUE3SCxJQUFBO2NBQUE7WUFBQTtZQUFBNkgsUUFBQSxDQUFBbEcsSUFBQTtZQUFBa0csUUFBQSxDQUFBN0gsSUFBQTtZQUFBLE9BRXpCNFYsT0FBTyxDQUFDdFcsTUFBTSxDQUFDLENBQUN5VyxHQUFHLEVBQUUxUCxNQUFNLENBQUNvRixLQUFLLEVBQUVrSyxJQUFJLENBQUM7VUFBQTtZQUFwRE0sR0FBRyxHQUFBcE8sUUFBQSxDQUFBcEksSUFBQTtZQUFBb0ksUUFBQSxDQUFBN0gsSUFBQTtZQUFBO1VBQUE7WUFBQTZILFFBQUEsQ0FBQWxHLElBQUE7WUFBQWtHLFFBQUEsQ0FBQThPLEVBQUEsR0FBQTlPLFFBQUE7WUFFSDtZQUNBO1lBQ0E7WUFDQTtZQUNBeU4sT0FBTyxDQUFDc0IsR0FBRyxDQUFDLGFBQWEsRUFBRVgsR0FBRyxDQUFDO1lBQy9CRCxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7WUFBQyxPQUFBbk8sUUFBQSxDQUFBakksTUFBQTtVQUFBO1lBQUEsTUFLM0JxVyxHQUFHLENBQUMzTixNQUFNLEtBQUt6Qyx3REFBTSxDQUFDZ1IsWUFBWSxJQUNsQ1osR0FBRyxDQUFDM04sTUFBTSxLQUFLekMsd0RBQU0sQ0FBQ2lSLFdBQVc7Y0FBQWpQLFFBQUEsQ0FBQTdILElBQUE7Y0FBQTtZQUFBO1lBQUEsS0FFN0JtSixLQUFLLENBQUNrQyxtQkFBbUI7Y0FBQXhELFFBQUEsQ0FBQTdILElBQUE7Y0FBQTtZQUFBO1lBQUE2SCxRQUFBLENBQUE3SCxJQUFBO1lBQUEsT0FDTmlXLEdBQUcsQ0FBQ2MsSUFBSSxDQUFDLENBQUM7VUFBQTtZQUF2QnBCLEtBQUksR0FBQTlOLFFBQUEsQ0FBQXBJLElBQUE7WUFBQSxLQUNOa1csS0FBSSxDQUFDcFIsUUFBUSxDQUFDNlEscUVBQW1CLENBQUM7Y0FBQXZOLFFBQUEsQ0FBQTdILElBQUE7Y0FBQTtZQUFBO1lBQUE2SCxRQUFBLENBQUE3SCxJQUFBO1lBQUEsT0FDYm1KLEtBQUssQ0FBQ2tDLG1CQUFtQixDQUMxQ2hGLE1BQU0sQ0FBQ29GLEtBQUssQ0FBQ0UsT0FBTyxDQUFDcUwsYUFBYSxDQUFDQyxNQUFNLENBQ3JDLFNBQVMsQ0FBQ3BXLE1BQ2QsQ0FDSixDQUFDO1VBQUE7WUFKS3VWLE1BQU0sR0FBQXZPLFFBQUEsQ0FBQXBJLElBQUE7WUFBQSxLQUtSMlcsTUFBTTtjQUFBdk8sUUFBQSxDQUFBN0gsSUFBQTtjQUFBO1lBQUE7WUFDTjhWLFVBQVUsR0FBRztjQUNUa0IsYUFBYSxZQUFBOU8sTUFBQSxDQUFZa08sTUFBTTtZQUNuQyxDQUFDO1lBRUQvUCxNQUFNLEdBQUd3TyxpREFBYyxDQUFDeE8sTUFBTSxFQUFFO2NBQzVCb0YsS0FBSyxFQUFFO2dCQUNIRSxPQUFPLEVBQUVtSztjQUNiO1lBQ0osQ0FBQyxDQUFDO1lBQUMsT0FBQWpPLFFBQUEsQ0FBQWpJLE1BQUE7VUFBQTtZQUFBLE9BQUFpSSxRQUFBLENBQUFqSSxNQUFBO1VBQUE7WUFsQ3dCc1csS0FBSyxFQUFFO1lBQUFyTyxRQUFBLENBQUE3SCxJQUFBO1lBQUE7VUFBQTtZQTRDaERxVyxXQUFXLEdBQUdKLEdBQUcsQ0FBQ3RLLE9BQU8sQ0FBQ3VMLEdBQUcsQ0FBQyxjQUFjLENBQUM7WUFFbkQsSUFBSXBCLFVBQVUsRUFBRTtjQUNaek8sUUFBUSxDQUFDNE4sd0RBQWMsQ0FBQ2EsVUFBVSxDQUFDLENBQUM7WUFDeEM7WUFDQUUsbUJBQW1CLENBQUMsSUFBSSxDQUFDO1lBQUMsTUFDdEJLLFdBQVcsSUFBSUEsV0FBVyxDQUFDYyxPQUFPLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7Y0FBQXRQLFFBQUEsQ0FBQTdILElBQUE7Y0FBQTtZQUFBO1lBQUEsT0FBQTZILFFBQUEsQ0FBQWpJLE1BQUEsV0FDdERxVyxHQUFHLENBQUNtQixJQUFJLENBQUMsQ0FBQyxDQUFDbFksSUFBSSxDQUFDLFVBQUFrWSxJQUFJLEVBQUk7Y0FDM0IvUCxRQUFRLENBQUM7Z0JBQ0wxSixJQUFJLEVBQUUwTyxLQUFLO2dCQUNYcUssT0FBTyxFQUFFO2tCQUNMcE8sTUFBTSxFQUFFMk4sR0FBRyxDQUFDM04sTUFBTTtrQkFDbEJELE9BQU8sRUFBRStPLElBQUk7a0JBQ2IxRztnQkFDSjtjQUNKLENBQUMsQ0FBQztjQUNGLE9BQU8wRyxJQUFJO1lBQ2YsQ0FBQyxDQUFDO1VBQUE7WUFFTi9CLGNBQWMsQ0FDViw0REFDSixDQUFDO1lBQUMsT0FBQXhOLFFBQUEsQ0FBQWpJLE1BQUEsV0FDS3lILFFBQVEsQ0FBQztjQUNaMUosSUFBSSxFQUFFME8sS0FBSztjQUNYcUssT0FBTyxFQUFFO2dCQUNMaEcsRUFBRTtnQkFDRnBJLE1BQU0sRUFBRTJOLEdBQUcsQ0FBQzNOO2NBQ2hCO1lBQ0osQ0FBQyxDQUFDO1VBQUE7WUFBQVQsUUFBQSxDQUFBbEcsSUFBQTtZQUFBa0csUUFBQSxDQUFBd1AsRUFBQSxHQUFBeFAsUUFBQTtZQUVJeU8sT0FBTyxHQUFHLHVCQUF1QixHQUFHVCxRQUFRO1lBQ2xEYiwwREFBZ0IsQ0FBQW5OLFFBQUEsQ0FBQXdQLEVBQUEsRUFBTWYsT0FBTyxFQUFFalAsUUFBUSxDQUFDO1VBQUM7VUFBQTtZQUFBLE9BQUFRLFFBQUEsQ0FBQS9GLElBQUE7UUFBQTtNQUFBLEdBQUE2RixPQUFBO0lBQUEsQ0FFaEQ7SUFBQSxpQkFBQTJQLEVBQUEsRUFBQUMsR0FBQTtNQUFBLE9BQUFuTCxJQUFBLENBQUFqSixLQUFBLE9BQUFELFNBQUE7SUFBQTtFQUFBO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrQ0NwSUEscUpBQUFwSCxtQkFBQSxZQUFBQSxvQkFBQSxXQUFBQyxDQUFBLFNBQUFDLENBQUEsRUFBQUQsQ0FBQSxPQUFBRSxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsU0FBQSxFQUFBQyxDQUFBLEdBQUFILENBQUEsQ0FBQUksY0FBQSxFQUFBQyxDQUFBLEdBQUFKLE1BQUEsQ0FBQUssY0FBQSxjQUFBUCxDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxJQUFBRCxDQUFBLENBQUFELENBQUEsSUFBQUUsQ0FBQSxDQUFBTyxLQUFBLEtBQUFDLENBQUEsd0JBQUFDLE1BQUEsR0FBQUEsTUFBQSxPQUFBQyxDQUFBLEdBQUFGLENBQUEsQ0FBQUcsUUFBQSxrQkFBQUMsQ0FBQSxHQUFBSixDQUFBLENBQUFLLGFBQUEsdUJBQUFDLENBQUEsR0FBQU4sQ0FBQSxDQUFBTyxXQUFBLDhCQUFBQyxPQUFBakIsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsV0FBQUMsTUFBQSxDQUFBSyxjQUFBLENBQUFQLENBQUEsRUFBQUQsQ0FBQSxJQUFBUyxLQUFBLEVBQUFQLENBQUEsRUFBQWlCLFVBQUEsTUFBQUMsWUFBQSxNQUFBQyxRQUFBLFNBQUFwQixDQUFBLENBQUFELENBQUEsV0FBQWtCLE1BQUEsbUJBQUFqQixDQUFBLElBQUFpQixNQUFBLFlBQUFBLE9BQUFqQixDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxXQUFBRCxDQUFBLENBQUFELENBQUEsSUFBQUUsQ0FBQSxnQkFBQW9CLEtBQUFyQixDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxFQUFBRyxDQUFBLFFBQUFLLENBQUEsR0FBQVYsQ0FBQSxJQUFBQSxDQUFBLENBQUFJLFNBQUEsWUFBQW1CLFNBQUEsR0FBQXZCLENBQUEsR0FBQXVCLFNBQUEsRUFBQVgsQ0FBQSxHQUFBVCxNQUFBLENBQUFxQixNQUFBLENBQUFkLENBQUEsQ0FBQU4sU0FBQSxHQUFBVSxDQUFBLE9BQUFXLE9BQUEsQ0FBQXBCLENBQUEsZ0JBQUFFLENBQUEsQ0FBQUssQ0FBQSxlQUFBSCxLQUFBLEVBQUFpQixnQkFBQSxDQUFBekIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFZLENBQUEsTUFBQUYsQ0FBQSxhQUFBZSxTQUFBMUIsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsbUJBQUEwQixJQUFBLFlBQUFDLEdBQUEsRUFBQTVCLENBQUEsQ0FBQTZCLElBQUEsQ0FBQTlCLENBQUEsRUFBQUUsQ0FBQSxjQUFBRCxDQUFBLGFBQUEyQixJQUFBLFdBQUFDLEdBQUEsRUFBQTVCLENBQUEsUUFBQUQsQ0FBQSxDQUFBc0IsSUFBQSxHQUFBQSxJQUFBLE1BQUFTLENBQUEscUJBQUFDLENBQUEscUJBQUFDLENBQUEsZ0JBQUFDLENBQUEsZ0JBQUFDLENBQUEsZ0JBQUFaLFVBQUEsY0FBQWEsa0JBQUEsY0FBQUMsMkJBQUEsU0FBQUMsQ0FBQSxPQUFBcEIsTUFBQSxDQUFBb0IsQ0FBQSxFQUFBMUIsQ0FBQSxxQ0FBQTJCLENBQUEsR0FBQXBDLE1BQUEsQ0FBQXFDLGNBQUEsRUFBQUMsQ0FBQSxHQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUEsQ0FBQSxDQUFBRyxNQUFBLFFBQUFELENBQUEsSUFBQUEsQ0FBQSxLQUFBdkMsQ0FBQSxJQUFBRyxDQUFBLENBQUF5QixJQUFBLENBQUFXLENBQUEsRUFBQTdCLENBQUEsTUFBQTBCLENBQUEsR0FBQUcsQ0FBQSxPQUFBRSxDQUFBLEdBQUFOLDBCQUFBLENBQUFqQyxTQUFBLEdBQUFtQixTQUFBLENBQUFuQixTQUFBLEdBQUFELE1BQUEsQ0FBQXFCLE1BQUEsQ0FBQWMsQ0FBQSxZQUFBTSxzQkFBQTNDLENBQUEsZ0NBQUE0QyxPQUFBLFdBQUE3QyxDQUFBLElBQUFrQixNQUFBLENBQUFqQixDQUFBLEVBQUFELENBQUEsWUFBQUMsQ0FBQSxnQkFBQTZDLE9BQUEsQ0FBQTlDLENBQUEsRUFBQUMsQ0FBQSxzQkFBQThDLGNBQUE5QyxDQUFBLEVBQUFELENBQUEsYUFBQWdELE9BQUE5QyxDQUFBLEVBQUFLLENBQUEsRUFBQUcsQ0FBQSxFQUFBRSxDQUFBLFFBQUFFLENBQUEsR0FBQWEsUUFBQSxDQUFBMUIsQ0FBQSxDQUFBQyxDQUFBLEdBQUFELENBQUEsRUFBQU0sQ0FBQSxtQkFBQU8sQ0FBQSxDQUFBYyxJQUFBLFFBQUFaLENBQUEsR0FBQUYsQ0FBQSxDQUFBZSxHQUFBLEVBQUFFLENBQUEsR0FBQWYsQ0FBQSxDQUFBUCxLQUFBLFNBQUFzQixDQUFBLHVCQUFBQSxDQUFBLElBQUExQixDQUFBLENBQUF5QixJQUFBLENBQUFDLENBQUEsZUFBQS9CLENBQUEsQ0FBQWlELE9BQUEsQ0FBQWxCLENBQUEsQ0FBQW1CLE9BQUEsRUFBQUMsSUFBQSxXQUFBbEQsQ0FBQSxJQUFBK0MsTUFBQSxTQUFBL0MsQ0FBQSxFQUFBUyxDQUFBLEVBQUFFLENBQUEsZ0JBQUFYLENBQUEsSUFBQStDLE1BQUEsVUFBQS9DLENBQUEsRUFBQVMsQ0FBQSxFQUFBRSxDQUFBLFFBQUFaLENBQUEsQ0FBQWlELE9BQUEsQ0FBQWxCLENBQUEsRUFBQW9CLElBQUEsV0FBQWxELENBQUEsSUFBQWUsQ0FBQSxDQUFBUCxLQUFBLEdBQUFSLENBQUEsRUFBQVMsQ0FBQSxDQUFBTSxDQUFBLGdCQUFBZixDQUFBLFdBQUErQyxNQUFBLFVBQUEvQyxDQUFBLEVBQUFTLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLENBQUFFLENBQUEsQ0FBQWUsR0FBQSxTQUFBM0IsQ0FBQSxFQUFBSyxDQUFBLG9CQUFBRSxLQUFBLFdBQUFBLE1BQUFSLENBQUEsRUFBQUksQ0FBQSxhQUFBK0MsMkJBQUEsZUFBQXBELENBQUEsV0FBQUEsQ0FBQSxFQUFBRSxDQUFBLElBQUE4QyxNQUFBLENBQUEvQyxDQUFBLEVBQUFJLENBQUEsRUFBQUwsQ0FBQSxFQUFBRSxDQUFBLGdCQUFBQSxDQUFBLEdBQUFBLENBQUEsR0FBQUEsQ0FBQSxDQUFBaUQsSUFBQSxDQUFBQywwQkFBQSxFQUFBQSwwQkFBQSxJQUFBQSwwQkFBQSxxQkFBQTFCLGlCQUFBMUIsQ0FBQSxFQUFBRSxDQUFBLEVBQUFHLENBQUEsUUFBQUUsQ0FBQSxHQUFBd0IsQ0FBQSxtQkFBQXJCLENBQUEsRUFBQUUsQ0FBQSxRQUFBTCxDQUFBLEtBQUEwQixDQUFBLFlBQUFvQixLQUFBLHNDQUFBOUMsQ0FBQSxLQUFBMkIsQ0FBQSxvQkFBQXhCLENBQUEsUUFBQUUsQ0FBQSxXQUFBSCxLQUFBLEVBQUFSLENBQUEsRUFBQXFELElBQUEsZUFBQWpELENBQUEsQ0FBQWtELE1BQUEsR0FBQTdDLENBQUEsRUFBQUwsQ0FBQSxDQUFBd0IsR0FBQSxHQUFBakIsQ0FBQSxVQUFBRSxDQUFBLEdBQUFULENBQUEsQ0FBQW1ELFFBQUEsTUFBQTFDLENBQUEsUUFBQUUsQ0FBQSxHQUFBeUMsbUJBQUEsQ0FBQTNDLENBQUEsRUFBQVQsQ0FBQSxPQUFBVyxDQUFBLFFBQUFBLENBQUEsS0FBQW1CLENBQUEsbUJBQUFuQixDQUFBLHFCQUFBWCxDQUFBLENBQUFrRCxNQUFBLEVBQUFsRCxDQUFBLENBQUFxRCxJQUFBLEdBQUFyRCxDQUFBLENBQUFzRCxLQUFBLEdBQUF0RCxDQUFBLENBQUF3QixHQUFBLHNCQUFBeEIsQ0FBQSxDQUFBa0QsTUFBQSxRQUFBaEQsQ0FBQSxLQUFBd0IsQ0FBQSxRQUFBeEIsQ0FBQSxHQUFBMkIsQ0FBQSxFQUFBN0IsQ0FBQSxDQUFBd0IsR0FBQSxFQUFBeEIsQ0FBQSxDQUFBdUQsaUJBQUEsQ0FBQXZELENBQUEsQ0FBQXdCLEdBQUEsdUJBQUF4QixDQUFBLENBQUFrRCxNQUFBLElBQUFsRCxDQUFBLENBQUF3RCxNQUFBLFdBQUF4RCxDQUFBLENBQUF3QixHQUFBLEdBQUF0QixDQUFBLEdBQUEwQixDQUFBLE1BQUFLLENBQUEsR0FBQVgsUUFBQSxDQUFBM0IsQ0FBQSxFQUFBRSxDQUFBLEVBQUFHLENBQUEsb0JBQUFpQyxDQUFBLENBQUFWLElBQUEsUUFBQXJCLENBQUEsR0FBQUYsQ0FBQSxDQUFBaUQsSUFBQSxHQUFBcEIsQ0FBQSxHQUFBRixDQUFBLEVBQUFNLENBQUEsQ0FBQVQsR0FBQSxLQUFBTSxDQUFBLHFCQUFBMUIsS0FBQSxFQUFBNkIsQ0FBQSxDQUFBVCxHQUFBLEVBQUF5QixJQUFBLEVBQUFqRCxDQUFBLENBQUFpRCxJQUFBLGtCQUFBaEIsQ0FBQSxDQUFBVixJQUFBLEtBQUFyQixDQUFBLEdBQUEyQixDQUFBLEVBQUE3QixDQUFBLENBQUFrRCxNQUFBLFlBQUFsRCxDQUFBLENBQUF3QixHQUFBLEdBQUFTLENBQUEsQ0FBQVQsR0FBQSxtQkFBQTRCLG9CQUFBekQsQ0FBQSxFQUFBRSxDQUFBLFFBQUFHLENBQUEsR0FBQUgsQ0FBQSxDQUFBcUQsTUFBQSxFQUFBaEQsQ0FBQSxHQUFBUCxDQUFBLENBQUFhLFFBQUEsQ0FBQVIsQ0FBQSxPQUFBRSxDQUFBLEtBQUFOLENBQUEsU0FBQUMsQ0FBQSxDQUFBc0QsUUFBQSxxQkFBQW5ELENBQUEsSUFBQUwsQ0FBQSxDQUFBYSxRQUFBLENBQUFpRCxNQUFBLEtBQUE1RCxDQUFBLENBQUFxRCxNQUFBLGFBQUFyRCxDQUFBLENBQUEyQixHQUFBLEdBQUE1QixDQUFBLEVBQUF3RCxtQkFBQSxDQUFBekQsQ0FBQSxFQUFBRSxDQUFBLGVBQUFBLENBQUEsQ0FBQXFELE1BQUEsa0JBQUFsRCxDQUFBLEtBQUFILENBQUEsQ0FBQXFELE1BQUEsWUFBQXJELENBQUEsQ0FBQTJCLEdBQUEsT0FBQWtDLFNBQUEsdUNBQUExRCxDQUFBLGlCQUFBOEIsQ0FBQSxNQUFBekIsQ0FBQSxHQUFBaUIsUUFBQSxDQUFBcEIsQ0FBQSxFQUFBUCxDQUFBLENBQUFhLFFBQUEsRUFBQVgsQ0FBQSxDQUFBMkIsR0FBQSxtQkFBQW5CLENBQUEsQ0FBQWtCLElBQUEsU0FBQTFCLENBQUEsQ0FBQXFELE1BQUEsWUFBQXJELENBQUEsQ0FBQTJCLEdBQUEsR0FBQW5CLENBQUEsQ0FBQW1CLEdBQUEsRUFBQTNCLENBQUEsQ0FBQXNELFFBQUEsU0FBQXJCLENBQUEsTUFBQXZCLENBQUEsR0FBQUYsQ0FBQSxDQUFBbUIsR0FBQSxTQUFBakIsQ0FBQSxHQUFBQSxDQUFBLENBQUEwQyxJQUFBLElBQUFwRCxDQUFBLENBQUFGLENBQUEsQ0FBQWdFLFVBQUEsSUFBQXBELENBQUEsQ0FBQUgsS0FBQSxFQUFBUCxDQUFBLENBQUErRCxJQUFBLEdBQUFqRSxDQUFBLENBQUFrRSxPQUFBLGVBQUFoRSxDQUFBLENBQUFxRCxNQUFBLEtBQUFyRCxDQUFBLENBQUFxRCxNQUFBLFdBQUFyRCxDQUFBLENBQUEyQixHQUFBLEdBQUE1QixDQUFBLEdBQUFDLENBQUEsQ0FBQXNELFFBQUEsU0FBQXJCLENBQUEsSUFBQXZCLENBQUEsSUFBQVYsQ0FBQSxDQUFBcUQsTUFBQSxZQUFBckQsQ0FBQSxDQUFBMkIsR0FBQSxPQUFBa0MsU0FBQSxzQ0FBQTdELENBQUEsQ0FBQXNELFFBQUEsU0FBQXJCLENBQUEsY0FBQWdDLGFBQUFsRSxDQUFBLFFBQUFELENBQUEsS0FBQW9FLE1BQUEsRUFBQW5FLENBQUEsWUFBQUEsQ0FBQSxLQUFBRCxDQUFBLENBQUFxRSxRQUFBLEdBQUFwRSxDQUFBLFdBQUFBLENBQUEsS0FBQUQsQ0FBQSxDQUFBc0UsVUFBQSxHQUFBckUsQ0FBQSxLQUFBRCxDQUFBLENBQUF1RSxRQUFBLEdBQUF0RSxDQUFBLFdBQUF1RSxVQUFBLENBQUFDLElBQUEsQ0FBQXpFLENBQUEsY0FBQTBFLGNBQUF6RSxDQUFBLFFBQUFELENBQUEsR0FBQUMsQ0FBQSxDQUFBMEUsVUFBQSxRQUFBM0UsQ0FBQSxDQUFBNEIsSUFBQSxvQkFBQTVCLENBQUEsQ0FBQTZCLEdBQUEsRUFBQTVCLENBQUEsQ0FBQTBFLFVBQUEsR0FBQTNFLENBQUEsYUFBQXlCLFFBQUF4QixDQUFBLFNBQUF1RSxVQUFBLE1BQUFKLE1BQUEsYUFBQW5FLENBQUEsQ0FBQTRDLE9BQUEsQ0FBQXNCLFlBQUEsY0FBQVMsS0FBQSxpQkFBQWxDLE9BQUExQyxDQUFBLFFBQUFBLENBQUEsV0FBQUEsQ0FBQSxRQUFBRSxDQUFBLEdBQUFGLENBQUEsQ0FBQVksQ0FBQSxPQUFBVixDQUFBLFNBQUFBLENBQUEsQ0FBQTRCLElBQUEsQ0FBQTlCLENBQUEsNEJBQUFBLENBQUEsQ0FBQWlFLElBQUEsU0FBQWpFLENBQUEsT0FBQTZFLEtBQUEsQ0FBQTdFLENBQUEsQ0FBQThFLE1BQUEsU0FBQXZFLENBQUEsT0FBQUcsQ0FBQSxZQUFBdUQsS0FBQSxhQUFBMUQsQ0FBQSxHQUFBUCxDQUFBLENBQUE4RSxNQUFBLE9BQUF6RSxDQUFBLENBQUF5QixJQUFBLENBQUE5QixDQUFBLEVBQUFPLENBQUEsVUFBQTBELElBQUEsQ0FBQXhELEtBQUEsR0FBQVQsQ0FBQSxDQUFBTyxDQUFBLEdBQUEwRCxJQUFBLENBQUFYLElBQUEsT0FBQVcsSUFBQSxTQUFBQSxJQUFBLENBQUF4RCxLQUFBLEdBQUFSLENBQUEsRUFBQWdFLElBQUEsQ0FBQVgsSUFBQSxPQUFBVyxJQUFBLFlBQUF2RCxDQUFBLENBQUF1RCxJQUFBLEdBQUF2RCxDQUFBLGdCQUFBcUQsU0FBQSxRQUFBL0QsQ0FBQSxpQ0FBQW9DLGlCQUFBLENBQUFoQyxTQUFBLEdBQUFpQywwQkFBQSxFQUFBOUIsQ0FBQSxDQUFBb0MsQ0FBQSxtQkFBQWxDLEtBQUEsRUFBQTRCLDBCQUFBLEVBQUFqQixZQUFBLFNBQUFiLENBQUEsQ0FBQThCLDBCQUFBLG1CQUFBNUIsS0FBQSxFQUFBMkIsaUJBQUEsRUFBQWhCLFlBQUEsU0FBQWdCLGlCQUFBLENBQUEyQyxXQUFBLEdBQUE3RCxNQUFBLENBQUFtQiwwQkFBQSxFQUFBckIsQ0FBQSx3QkFBQWhCLENBQUEsQ0FBQWdGLG1CQUFBLGFBQUEvRSxDQUFBLFFBQUFELENBQUEsd0JBQUFDLENBQUEsSUFBQUEsQ0FBQSxDQUFBZ0YsV0FBQSxXQUFBakYsQ0FBQSxLQUFBQSxDQUFBLEtBQUFvQyxpQkFBQSw2QkFBQXBDLENBQUEsQ0FBQStFLFdBQUEsSUFBQS9FLENBQUEsQ0FBQWtGLElBQUEsT0FBQWxGLENBQUEsQ0FBQW1GLElBQUEsYUFBQWxGLENBQUEsV0FBQUUsTUFBQSxDQUFBaUYsY0FBQSxHQUFBakYsTUFBQSxDQUFBaUYsY0FBQSxDQUFBbkYsQ0FBQSxFQUFBb0MsMEJBQUEsS0FBQXBDLENBQUEsQ0FBQW9GLFNBQUEsR0FBQWhELDBCQUFBLEVBQUFuQixNQUFBLENBQUFqQixDQUFBLEVBQUFlLENBQUEseUJBQUFmLENBQUEsQ0FBQUcsU0FBQSxHQUFBRCxNQUFBLENBQUFxQixNQUFBLENBQUFtQixDQUFBLEdBQUExQyxDQUFBLEtBQUFELENBQUEsQ0FBQXNGLEtBQUEsYUFBQXJGLENBQUEsYUFBQWlELE9BQUEsRUFBQWpELENBQUEsT0FBQTJDLHFCQUFBLENBQUFHLGFBQUEsQ0FBQTNDLFNBQUEsR0FBQWMsTUFBQSxDQUFBNkIsYUFBQSxDQUFBM0MsU0FBQSxFQUFBVSxDQUFBLGlDQUFBZCxDQUFBLENBQUErQyxhQUFBLEdBQUFBLGFBQUEsRUFBQS9DLENBQUEsQ0FBQXVGLEtBQUEsYUFBQXRGLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFFLENBQUEsRUFBQUcsQ0FBQSxlQUFBQSxDQUFBLEtBQUFBLENBQUEsR0FBQThFLE9BQUEsT0FBQTVFLENBQUEsT0FBQW1DLGFBQUEsQ0FBQXpCLElBQUEsQ0FBQXJCLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFFLENBQUEsR0FBQUcsQ0FBQSxVQUFBVixDQUFBLENBQUFnRixtQkFBQSxDQUFBOUUsQ0FBQSxJQUFBVSxDQUFBLEdBQUFBLENBQUEsQ0FBQXFELElBQUEsR0FBQWQsSUFBQSxXQUFBbEQsQ0FBQSxXQUFBQSxDQUFBLENBQUFxRCxJQUFBLEdBQUFyRCxDQUFBLENBQUFRLEtBQUEsR0FBQUcsQ0FBQSxDQUFBcUQsSUFBQSxXQUFBckIscUJBQUEsQ0FBQUQsQ0FBQSxHQUFBekIsTUFBQSxDQUFBeUIsQ0FBQSxFQUFBM0IsQ0FBQSxnQkFBQUUsTUFBQSxDQUFBeUIsQ0FBQSxFQUFBL0IsQ0FBQSxpQ0FBQU0sTUFBQSxDQUFBeUIsQ0FBQSw2REFBQTNDLENBQUEsQ0FBQXlGLElBQUEsYUFBQXhGLENBQUEsUUFBQUQsQ0FBQSxHQUFBRyxNQUFBLENBQUFGLENBQUEsR0FBQUMsQ0FBQSxnQkFBQUcsQ0FBQSxJQUFBTCxDQUFBLEVBQUFFLENBQUEsQ0FBQXVFLElBQUEsQ0FBQXBFLENBQUEsVUFBQUgsQ0FBQSxDQUFBd0YsT0FBQSxhQUFBekIsS0FBQSxXQUFBL0QsQ0FBQSxDQUFBNEUsTUFBQSxTQUFBN0UsQ0FBQSxHQUFBQyxDQUFBLENBQUF5RixHQUFBLFFBQUExRixDQUFBLElBQUFELENBQUEsU0FBQWlFLElBQUEsQ0FBQXhELEtBQUEsR0FBQVIsQ0FBQSxFQUFBZ0UsSUFBQSxDQUFBWCxJQUFBLE9BQUFXLElBQUEsV0FBQUEsSUFBQSxDQUFBWCxJQUFBLE9BQUFXLElBQUEsUUFBQWpFLENBQUEsQ0FBQTBDLE1BQUEsR0FBQUEsTUFBQSxFQUFBakIsT0FBQSxDQUFBckIsU0FBQSxLQUFBNkUsV0FBQSxFQUFBeEQsT0FBQSxFQUFBbUQsS0FBQSxXQUFBQSxNQUFBNUUsQ0FBQSxhQUFBNEYsSUFBQSxXQUFBM0IsSUFBQSxXQUFBUCxJQUFBLFFBQUFDLEtBQUEsR0FBQTFELENBQUEsT0FBQXFELElBQUEsWUFBQUUsUUFBQSxjQUFBRCxNQUFBLGdCQUFBMUIsR0FBQSxHQUFBNUIsQ0FBQSxPQUFBdUUsVUFBQSxDQUFBM0IsT0FBQSxDQUFBNkIsYUFBQSxJQUFBMUUsQ0FBQSxXQUFBRSxDQUFBLGtCQUFBQSxDQUFBLENBQUEyRixNQUFBLE9BQUF4RixDQUFBLENBQUF5QixJQUFBLE9BQUE1QixDQUFBLE1BQUEyRSxLQUFBLEVBQUEzRSxDQUFBLENBQUE0RixLQUFBLGNBQUE1RixDQUFBLElBQUFELENBQUEsTUFBQThGLElBQUEsV0FBQUEsS0FBQSxTQUFBekMsSUFBQSxXQUFBckQsQ0FBQSxRQUFBdUUsVUFBQSxJQUFBRyxVQUFBLGtCQUFBMUUsQ0FBQSxDQUFBMkIsSUFBQSxRQUFBM0IsQ0FBQSxDQUFBNEIsR0FBQSxjQUFBbUUsSUFBQSxLQUFBcEMsaUJBQUEsV0FBQUEsa0JBQUE1RCxDQUFBLGFBQUFzRCxJQUFBLFFBQUF0RCxDQUFBLE1BQUFFLENBQUEsa0JBQUErRixPQUFBNUYsQ0FBQSxFQUFBRSxDQUFBLFdBQUFLLENBQUEsQ0FBQWdCLElBQUEsWUFBQWhCLENBQUEsQ0FBQWlCLEdBQUEsR0FBQTdCLENBQUEsRUFBQUUsQ0FBQSxDQUFBK0QsSUFBQSxHQUFBNUQsQ0FBQSxFQUFBRSxDQUFBLEtBQUFMLENBQUEsQ0FBQXFELE1BQUEsV0FBQXJELENBQUEsQ0FBQTJCLEdBQUEsR0FBQTVCLENBQUEsS0FBQU0sQ0FBQSxhQUFBQSxDQUFBLFFBQUFpRSxVQUFBLENBQUFNLE1BQUEsTUFBQXZFLENBQUEsU0FBQUEsQ0FBQSxRQUFBRyxDQUFBLFFBQUE4RCxVQUFBLENBQUFqRSxDQUFBLEdBQUFLLENBQUEsR0FBQUYsQ0FBQSxDQUFBaUUsVUFBQSxpQkFBQWpFLENBQUEsQ0FBQTBELE1BQUEsU0FBQTZCLE1BQUEsYUFBQXZGLENBQUEsQ0FBQTBELE1BQUEsU0FBQXdCLElBQUEsUUFBQTlFLENBQUEsR0FBQVQsQ0FBQSxDQUFBeUIsSUFBQSxDQUFBcEIsQ0FBQSxlQUFBTSxDQUFBLEdBQUFYLENBQUEsQ0FBQXlCLElBQUEsQ0FBQXBCLENBQUEscUJBQUFJLENBQUEsSUFBQUUsQ0FBQSxhQUFBNEUsSUFBQSxHQUFBbEYsQ0FBQSxDQUFBMkQsUUFBQSxTQUFBNEIsTUFBQSxDQUFBdkYsQ0FBQSxDQUFBMkQsUUFBQSxnQkFBQXVCLElBQUEsR0FBQWxGLENBQUEsQ0FBQTRELFVBQUEsU0FBQTJCLE1BQUEsQ0FBQXZGLENBQUEsQ0FBQTRELFVBQUEsY0FBQXhELENBQUEsYUFBQThFLElBQUEsR0FBQWxGLENBQUEsQ0FBQTJELFFBQUEsU0FBQTRCLE1BQUEsQ0FBQXZGLENBQUEsQ0FBQTJELFFBQUEscUJBQUFyRCxDQUFBLFlBQUFxQyxLQUFBLHFEQUFBdUMsSUFBQSxHQUFBbEYsQ0FBQSxDQUFBNEQsVUFBQSxTQUFBMkIsTUFBQSxDQUFBdkYsQ0FBQSxDQUFBNEQsVUFBQSxZQUFBVCxNQUFBLFdBQUFBLE9BQUE1RCxDQUFBLEVBQUFELENBQUEsYUFBQUUsQ0FBQSxRQUFBc0UsVUFBQSxDQUFBTSxNQUFBLE1BQUE1RSxDQUFBLFNBQUFBLENBQUEsUUFBQUssQ0FBQSxRQUFBaUUsVUFBQSxDQUFBdEUsQ0FBQSxPQUFBSyxDQUFBLENBQUE2RCxNQUFBLFNBQUF3QixJQUFBLElBQUF2RixDQUFBLENBQUF5QixJQUFBLENBQUF2QixDQUFBLHdCQUFBcUYsSUFBQSxHQUFBckYsQ0FBQSxDQUFBK0QsVUFBQSxRQUFBNUQsQ0FBQSxHQUFBSCxDQUFBLGFBQUFHLENBQUEsaUJBQUFULENBQUEsbUJBQUFBLENBQUEsS0FBQVMsQ0FBQSxDQUFBMEQsTUFBQSxJQUFBcEUsQ0FBQSxJQUFBQSxDQUFBLElBQUFVLENBQUEsQ0FBQTRELFVBQUEsS0FBQTVELENBQUEsY0FBQUUsQ0FBQSxHQUFBRixDQUFBLEdBQUFBLENBQUEsQ0FBQWlFLFVBQUEsY0FBQS9ELENBQUEsQ0FBQWdCLElBQUEsR0FBQTNCLENBQUEsRUFBQVcsQ0FBQSxDQUFBaUIsR0FBQSxHQUFBN0IsQ0FBQSxFQUFBVSxDQUFBLFNBQUE2QyxNQUFBLGdCQUFBVSxJQUFBLEdBQUF2RCxDQUFBLENBQUE0RCxVQUFBLEVBQUFuQyxDQUFBLFNBQUErRCxRQUFBLENBQUF0RixDQUFBLE1BQUFzRixRQUFBLFdBQUFBLFNBQUFqRyxDQUFBLEVBQUFELENBQUEsb0JBQUFDLENBQUEsQ0FBQTJCLElBQUEsUUFBQTNCLENBQUEsQ0FBQTRCLEdBQUEscUJBQUE1QixDQUFBLENBQUEyQixJQUFBLG1CQUFBM0IsQ0FBQSxDQUFBMkIsSUFBQSxRQUFBcUMsSUFBQSxHQUFBaEUsQ0FBQSxDQUFBNEIsR0FBQSxnQkFBQTVCLENBQUEsQ0FBQTJCLElBQUEsU0FBQW9FLElBQUEsUUFBQW5FLEdBQUEsR0FBQTVCLENBQUEsQ0FBQTRCLEdBQUEsT0FBQTBCLE1BQUEsa0JBQUFVLElBQUEseUJBQUFoRSxDQUFBLENBQUEyQixJQUFBLElBQUE1QixDQUFBLFVBQUFpRSxJQUFBLEdBQUFqRSxDQUFBLEdBQUFtQyxDQUFBLEtBQUFnRSxNQUFBLFdBQUFBLE9BQUFsRyxDQUFBLGFBQUFELENBQUEsUUFBQXdFLFVBQUEsQ0FBQU0sTUFBQSxNQUFBOUUsQ0FBQSxTQUFBQSxDQUFBLFFBQUFFLENBQUEsUUFBQXNFLFVBQUEsQ0FBQXhFLENBQUEsT0FBQUUsQ0FBQSxDQUFBb0UsVUFBQSxLQUFBckUsQ0FBQSxjQUFBaUcsUUFBQSxDQUFBaEcsQ0FBQSxDQUFBeUUsVUFBQSxFQUFBekUsQ0FBQSxDQUFBcUUsUUFBQSxHQUFBRyxhQUFBLENBQUF4RSxDQUFBLEdBQUFpQyxDQUFBLE9BQUFpRSxLQUFBLFdBQUFDLE9BQUFwRyxDQUFBLGFBQUFELENBQUEsUUFBQXdFLFVBQUEsQ0FBQU0sTUFBQSxNQUFBOUUsQ0FBQSxTQUFBQSxDQUFBLFFBQUFFLENBQUEsUUFBQXNFLFVBQUEsQ0FBQXhFLENBQUEsT0FBQUUsQ0FBQSxDQUFBa0UsTUFBQSxLQUFBbkUsQ0FBQSxRQUFBSSxDQUFBLEdBQUFILENBQUEsQ0FBQXlFLFVBQUEsa0JBQUF0RSxDQUFBLENBQUF1QixJQUFBLFFBQUFyQixDQUFBLEdBQUFGLENBQUEsQ0FBQXdCLEdBQUEsRUFBQTZDLGFBQUEsQ0FBQXhFLENBQUEsWUFBQUssQ0FBQSxnQkFBQThDLEtBQUEsOEJBQUFpRCxhQUFBLFdBQUFBLGNBQUF0RyxDQUFBLEVBQUFFLENBQUEsRUFBQUcsQ0FBQSxnQkFBQW1ELFFBQUEsS0FBQTNDLFFBQUEsRUFBQTZCLE1BQUEsQ0FBQTFDLENBQUEsR0FBQWdFLFVBQUEsRUFBQTlELENBQUEsRUFBQWdFLE9BQUEsRUFBQTdELENBQUEsb0JBQUFrRCxNQUFBLFVBQUExQixHQUFBLEdBQUE1QixDQUFBLEdBQUFrQyxDQUFBLE9BQUFuQyxDQUFBO0FBQUEsU0FBQXliLFFBQUF6YixDQUFBLEVBQUFFLENBQUEsUUFBQUQsQ0FBQSxHQUFBRSxNQUFBLENBQUFzRixJQUFBLENBQUF6RixDQUFBLE9BQUFHLE1BQUEsQ0FBQXViLHFCQUFBLFFBQUFuYixDQUFBLEdBQUFKLE1BQUEsQ0FBQXViLHFCQUFBLENBQUExYixDQUFBLEdBQUFFLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUF5USxNQUFBLFdBQUE5USxDQUFBLFdBQUFDLE1BQUEsQ0FBQXdiLHdCQUFBLENBQUEzYixDQUFBLEVBQUFFLENBQUEsRUFBQWlCLFVBQUEsT0FBQWxCLENBQUEsQ0FBQXdFLElBQUEsQ0FBQTJDLEtBQUEsQ0FBQW5ILENBQUEsRUFBQU0sQ0FBQSxZQUFBTixDQUFBO0FBQUEsU0FBQXNQLGNBQUF2UCxDQUFBLGFBQUFFLENBQUEsTUFBQUEsQ0FBQSxHQUFBaUgsU0FBQSxDQUFBckMsTUFBQSxFQUFBNUUsQ0FBQSxVQUFBRCxDQUFBLFdBQUFrSCxTQUFBLENBQUFqSCxDQUFBLElBQUFpSCxTQUFBLENBQUFqSCxDQUFBLFFBQUFBLENBQUEsT0FBQXViLE9BQUEsQ0FBQXRiLE1BQUEsQ0FBQUYsQ0FBQSxPQUFBNEMsT0FBQSxXQUFBM0MsQ0FBQSxJQUFBa1IsZUFBQSxDQUFBcFIsQ0FBQSxFQUFBRSxDQUFBLEVBQUFELENBQUEsQ0FBQUMsQ0FBQSxTQUFBQyxNQUFBLENBQUF5Yix5QkFBQSxHQUFBemIsTUFBQSxDQUFBMGIsZ0JBQUEsQ0FBQTdiLENBQUEsRUFBQUcsTUFBQSxDQUFBeWIseUJBQUEsQ0FBQTNiLENBQUEsS0FBQXdiLE9BQUEsQ0FBQXRiLE1BQUEsQ0FBQUYsQ0FBQSxHQUFBNEMsT0FBQSxXQUFBM0MsQ0FBQSxJQUFBQyxNQUFBLENBQUFLLGNBQUEsQ0FBQVIsQ0FBQSxFQUFBRSxDQUFBLEVBQUFDLE1BQUEsQ0FBQXdiLHdCQUFBLENBQUExYixDQUFBLEVBQUFDLENBQUEsaUJBQUFGLENBQUE7QUFBQSxTQUFBb1IsZ0JBQUE0RCxHQUFBLEVBQUFwTyxHQUFBLEVBQUFuRyxLQUFBLElBQUFtRyxHQUFBLEdBQUFrVixjQUFBLENBQUFsVixHQUFBLE9BQUFBLEdBQUEsSUFBQW9PLEdBQUEsSUFBQTdVLE1BQUEsQ0FBQUssY0FBQSxDQUFBd1UsR0FBQSxFQUFBcE8sR0FBQSxJQUFBbkcsS0FBQSxFQUFBQSxLQUFBLEVBQUFVLFVBQUEsUUFBQUMsWUFBQSxRQUFBQyxRQUFBLG9CQUFBMlQsR0FBQSxDQUFBcE8sR0FBQSxJQUFBbkcsS0FBQSxXQUFBdVUsR0FBQTtBQUFBLFNBQUE4RyxlQUFBamEsR0FBQSxRQUFBK0UsR0FBQSxHQUFBbVYsWUFBQSxDQUFBbGEsR0FBQSwyQkFBQStFLEdBQUEsZ0JBQUFBLEdBQUEsR0FBQW9WLE1BQUEsQ0FBQXBWLEdBQUE7QUFBQSxTQUFBbVYsYUFBQUUsS0FBQSxFQUFBQyxJQUFBLGVBQUFELEtBQUEsaUJBQUFBLEtBQUEsa0JBQUFBLEtBQUEsTUFBQUUsSUFBQSxHQUFBRixLQUFBLENBQUF0YixNQUFBLENBQUF5YixXQUFBLE9BQUFELElBQUEsS0FBQTdVLFNBQUEsUUFBQTRTLEdBQUEsR0FBQWlDLElBQUEsQ0FBQXJhLElBQUEsQ0FBQW1hLEtBQUEsRUFBQUMsSUFBQSwyQkFBQWhDLEdBQUEsc0JBQUFBLEdBQUEsWUFBQW5XLFNBQUEsNERBQUFtWSxJQUFBLGdCQUFBRixNQUFBLEdBQUFLLE1BQUEsRUFBQUosS0FBQTtBQUFBLFNBQUExVixtQkFBQUMsR0FBQSxFQUFBdkQsT0FBQSxFQUFBd0QsTUFBQSxFQUFBQyxLQUFBLEVBQUFDLE1BQUEsRUFBQUMsR0FBQSxFQUFBL0UsR0FBQSxjQUFBZ0YsSUFBQSxHQUFBTCxHQUFBLENBQUFJLEdBQUEsRUFBQS9FLEdBQUEsT0FBQXBCLEtBQUEsR0FBQW9HLElBQUEsQ0FBQXBHLEtBQUEsV0FBQXFHLEtBQUEsSUFBQUwsTUFBQSxDQUFBSyxLQUFBLGlCQUFBRCxJQUFBLENBQUF2RCxJQUFBLElBQUFMLE9BQUEsQ0FBQXhDLEtBQUEsWUFBQStFLE9BQUEsQ0FBQXZDLE9BQUEsQ0FBQXhDLEtBQUEsRUFBQTBDLElBQUEsQ0FBQXVELEtBQUEsRUFBQUMsTUFBQTtBQUFBLFNBQUFJLGtCQUFBQyxFQUFBLDZCQUFBQyxJQUFBLFNBQUFDLElBQUEsR0FBQUMsU0FBQSxhQUFBM0IsT0FBQSxXQUFBdkMsT0FBQSxFQUFBd0QsTUFBQSxRQUFBRCxHQUFBLEdBQUFRLEVBQUEsQ0FBQUksS0FBQSxDQUFBSCxJQUFBLEVBQUFDLElBQUEsWUFBQVIsTUFBQWpHLEtBQUEsSUFBQThGLGtCQUFBLENBQUFDLEdBQUEsRUFBQXZELE9BQUEsRUFBQXdELE1BQUEsRUFBQUMsS0FBQSxFQUFBQyxNQUFBLFVBQUFsRyxLQUFBLGNBQUFrRyxPQUFBVSxHQUFBLElBQUFkLGtCQUFBLENBQUFDLEdBQUEsRUFBQXZELE9BQUEsRUFBQXdELE1BQUEsRUFBQUMsS0FBQSxFQUFBQyxNQUFBLFdBQUFVLEdBQUEsS0FBQVgsS0FBQSxDQUFBWSxTQUFBO0FBQUEsU0FBQXdOLG1CQUFBdE4sR0FBQSxXQUFBOFUsa0JBQUEsQ0FBQTlVLEdBQUEsS0FBQStVLGdCQUFBLENBQUEvVSxHQUFBLEtBQUFHLDJCQUFBLENBQUFILEdBQUEsS0FBQWdWLGtCQUFBO0FBQUEsU0FBQUEsbUJBQUEsY0FBQXpZLFNBQUE7QUFBQSxTQUFBd1ksaUJBQUFFLElBQUEsZUFBQTliLE1BQUEsb0JBQUE4YixJQUFBLENBQUE5YixNQUFBLENBQUFFLFFBQUEsYUFBQTRiLElBQUEsK0JBQUF6VSxLQUFBLENBQUFDLElBQUEsQ0FBQXdVLElBQUE7QUFBQSxTQUFBSCxtQkFBQTlVLEdBQUEsUUFBQVEsS0FBQSxDQUFBSyxPQUFBLENBQUFiLEdBQUEsVUFBQU0saUJBQUEsQ0FBQU4sR0FBQTtBQUFBLFNBQUFELGVBQUFDLEdBQUEsRUFBQTlHLENBQUEsV0FBQStHLGVBQUEsQ0FBQUQsR0FBQSxLQUFBRSxxQkFBQSxDQUFBRixHQUFBLEVBQUE5RyxDQUFBLEtBQUFpSCwyQkFBQSxDQUFBSCxHQUFBLEVBQUE5RyxDQUFBLEtBQUFrSCxnQkFBQTtBQUFBLFNBQUFBLGlCQUFBLGNBQUE3RCxTQUFBO0FBQUEsU0FBQTRELDRCQUFBcEgsQ0FBQSxFQUFBc0gsTUFBQSxTQUFBdEgsQ0FBQSxxQkFBQUEsQ0FBQSxzQkFBQXVILGlCQUFBLENBQUF2SCxDQUFBLEVBQUFzSCxNQUFBLE9BQUF4SCxDQUFBLEdBQUFGLE1BQUEsQ0FBQUMsU0FBQSxDQUFBMkgsUUFBQSxDQUFBakcsSUFBQSxDQUFBdkIsQ0FBQSxFQUFBdUYsS0FBQSxhQUFBekYsQ0FBQSxpQkFBQUUsQ0FBQSxDQUFBMEUsV0FBQSxFQUFBNUUsQ0FBQSxHQUFBRSxDQUFBLENBQUEwRSxXQUFBLENBQUFDLElBQUEsTUFBQTdFLENBQUEsY0FBQUEsQ0FBQSxtQkFBQTJILEtBQUEsQ0FBQUMsSUFBQSxDQUFBMUgsQ0FBQSxPQUFBRixDQUFBLCtEQUFBNkgsSUFBQSxDQUFBN0gsQ0FBQSxVQUFBeUgsaUJBQUEsQ0FBQXZILENBQUEsRUFBQXNILE1BQUE7QUFBQSxTQUFBQyxrQkFBQU4sR0FBQSxFQUFBVyxHQUFBLFFBQUFBLEdBQUEsWUFBQUEsR0FBQSxHQUFBWCxHQUFBLENBQUExQyxNQUFBLEVBQUFxRCxHQUFBLEdBQUFYLEdBQUEsQ0FBQTFDLE1BQUEsV0FBQXBFLENBQUEsTUFBQTBILElBQUEsT0FBQUosS0FBQSxDQUFBRyxHQUFBLEdBQUF6SCxDQUFBLEdBQUF5SCxHQUFBLEVBQUF6SCxDQUFBLElBQUEwSCxJQUFBLENBQUExSCxDQUFBLElBQUE4RyxHQUFBLENBQUE5RyxDQUFBLFVBQUEwSCxJQUFBO0FBQUEsU0FBQVYsc0JBQUF4SCxDQUFBLEVBQUE4QixDQUFBLFFBQUEvQixDQUFBLFdBQUFDLENBQUEsZ0NBQUFTLE1BQUEsSUFBQVQsQ0FBQSxDQUFBUyxNQUFBLENBQUFFLFFBQUEsS0FBQVgsQ0FBQSw0QkFBQUQsQ0FBQSxRQUFBRCxDQUFBLEVBQUFLLENBQUEsRUFBQUssQ0FBQSxFQUFBTSxDQUFBLEVBQUFKLENBQUEsT0FBQXFCLENBQUEsT0FBQTFCLENBQUEsaUJBQUFHLENBQUEsSUFBQVQsQ0FBQSxHQUFBQSxDQUFBLENBQUE2QixJQUFBLENBQUE1QixDQUFBLEdBQUErRCxJQUFBLFFBQUFqQyxDQUFBLFFBQUE3QixNQUFBLENBQUFGLENBQUEsTUFBQUEsQ0FBQSxVQUFBZ0MsQ0FBQSx1QkFBQUEsQ0FBQSxJQUFBakMsQ0FBQSxHQUFBVSxDQUFBLENBQUFvQixJQUFBLENBQUE3QixDQUFBLEdBQUFxRCxJQUFBLE1BQUExQyxDQUFBLENBQUE2RCxJQUFBLENBQUF6RSxDQUFBLENBQUFTLEtBQUEsR0FBQUcsQ0FBQSxDQUFBa0UsTUFBQSxLQUFBOUMsQ0FBQSxHQUFBQyxDQUFBLGlCQUFBL0IsQ0FBQSxJQUFBSyxDQUFBLE9BQUFGLENBQUEsR0FBQUgsQ0FBQSx5QkFBQStCLENBQUEsWUFBQWhDLENBQUEsQ0FBQTZELE1BQUEsS0FBQTlDLENBQUEsR0FBQWYsQ0FBQSxDQUFBNkQsTUFBQSxJQUFBM0QsTUFBQSxDQUFBYSxDQUFBLE1BQUFBLENBQUEsMkJBQUFULENBQUEsUUFBQUYsQ0FBQSxhQUFBTyxDQUFBO0FBQUEsU0FBQTZHLGdCQUFBRCxHQUFBLFFBQUFRLEtBQUEsQ0FBQUssT0FBQSxDQUFBYixHQUFBLFVBQUFBLEdBQUE7QUFhZTtBQUVvRDtBQUN0QjtBQUlkO0FBYzhDO0FBQzdDO0FBQ0E7QUFDbUI7QUFDVDtBQUNXO0FBRVI7QUFDYjtBQUUwQjtBQUVuRCxJQUFNZ1csbUJBQW1CLEdBQUdMLHlEQUFZLENBQzNDSixtRUFBa0IsQ0FBQ1UsVUFDdkIsQ0FBQztBQUNNLElBQU1DLHFCQUFxQixHQUFHUCx5REFBWSxDQUM3Q0gsNEVBQTJCLENBQUNXLFlBQ2hDLENBQUM7QUFDTSxJQUFNQyxvQkFBb0IsR0FBR1QseURBQVksQ0FDNUNKLG1FQUFrQixDQUFDYyxXQUN2QixDQUFDO0FBQ00sSUFBTUMscUJBQXFCLEdBQUdYLHlEQUFZLENBQzdDSixtRUFBa0IsQ0FBQ2dCLFlBQ3ZCLENBQUM7QUFDTSxJQUFNQyx1QkFBdUIsR0FBR2IseURBQVksQ0FDL0NKLG1FQUFrQixDQUFDa0IsY0FDdkIsQ0FBQztBQUNNLElBQU1DLHFCQUFxQixHQUFHZix5REFBWSxDQUM3Q0osbUVBQWtCLENBQUNvQixZQUN2QixDQUFDO0FBQ00sSUFBTUMsa0JBQWtCLEdBQUdqQix5REFBWSxDQUMxQ0osbUVBQWtCLENBQUNzQixTQUN2QixDQUFDO0FBQ00sSUFBTUMsbUJBQW1CLEdBQUduQix5REFBWSxDQUMzQ0osbUVBQWtCLENBQUN3QixVQUN2QixDQUFDO0FBQ00sSUFBTUMsdUJBQXVCLEdBQUdyQix5REFBWSxDQUMvQ0osbUVBQWtCLENBQUMwQixjQUN2QixDQUFDO0FBQ00sSUFBTUMsc0JBQXNCLEdBQUd2Qix5REFBWSxDQUM5Q0osbUVBQWtCLENBQUM0QixhQUN2QixDQUFDO0FBQ00sSUFBTUMsd0JBQXdCLEdBQUd6Qix5REFBWSxDQUNoREosbUVBQWtCLENBQUM4QixlQUN2QixDQUFDO0FBQ00sSUFBTUMsMEJBQTBCLEdBQUczQix5REFBWSxDQUNsREosbUVBQWtCLENBQUNnQyxpQkFDdkIsQ0FBQztBQUNNLElBQU1DLHdCQUF3QixHQUFHN0IseURBQVksQ0FDaERKLG1FQUFrQixDQUFDa0MsZUFDdkIsQ0FBQztBQUNNLElBQU1DLHFCQUFxQixHQUFHL0IseURBQVksQ0FDN0NKLG1FQUFrQixDQUFDb0MsWUFDdkIsQ0FBQztBQUNNLElBQU1DLHNCQUFzQixHQUFHakMseURBQVksQ0FDOUNKLG1FQUFrQixDQUFDc0MsYUFDdkIsQ0FBQztBQUNNLElBQU1DLGtCQUFrQixHQUFHbkMseURBQVksQ0FFNUNILDRFQUEyQixDQUFDdUMsU0FBUyxDQUFDO0FBRXhDLElBQU1DLG1CQUFtQixHQUFHckMseURBQVksQ0FBQyx1QkFBdUIsQ0FBQztBQUVqRSxJQUFNc0MsY0FBYyxHQUFHdEMseURBQVksQ0FBQyxrQkFBa0IsQ0FBQztBQUN2RCxJQUFNdUMsaUJBQWlCLEdBQUd2Qyx5REFBWSxDQUFDLHFCQUFxQixDQUFDO0FBQzdELElBQU13QyxzQkFBc0IsR0FBR3hDLHlEQUFZLENBQUMsdUJBQXVCLENBQUM7QUFFcEUsU0FBU3lDLGdCQUFnQkEsQ0FDckJDLEtBQVUsRUFDVkMsT0FBWSxFQUNaQyxJQUFTLEVBQ1RDLE9BQVksRUFDWkMsT0FBWSxFQUNkO0VBQ0UsSUFBSUMsR0FBRyxHQUFHLEVBQUU7RUFFWixJQUFJakQsNERBQWEsQ0FBQzhDLElBQUksQ0FBQyxFQUFFO0lBQ3JCLE9BQU8sQ0FBQ0QsT0FBTyxFQUFFSSxHQUFHLENBQUM7RUFDekI7RUFFQSxJQUFJSixPQUFPLENBQUNoYixNQUFNLEtBQUssQ0FBQyxFQUFFO0lBQ3RCLElBQUksQ0FBQ2diLE9BQU8sQ0FBQ2hiLE1BQU0sRUFBRTtNQUNqQixJQUFNcWIsS0FBSyxHQUFHLE9BQU9KLElBQUksQ0FBQ3BMLEVBQUUsS0FBSyxRQUFRO01BQ3pDdUwsR0FBRyxHQUNDLHVDQUF1QyxHQUN2Q0QsT0FBTyxHQUNQLGlEQUFpRCxJQUNoREUsS0FBSyxHQUNBLEdBQUcsR0FBR0osSUFBSSxDQUFDcEwsRUFBRSxHQUFHLEdBQUcsR0FDbkIxSCxJQUFJLENBQUNDLFNBQVMsQ0FBQzZTLElBQUksQ0FBQ3BMLEVBQUUsQ0FBQyxJQUN0QnFMLE9BQU8sR0FBRyxxQkFBcUIsR0FBR0EsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQ3ZELHdCQUF3QixHQUN4QkQsSUFBSSxDQUFDSyxRQUFRLElBQ1pELEtBQUssR0FDQSxnREFBZ0QsR0FDaEQxYSxrREFBSSxDQUFDb2EsS0FBSyxDQUFDUSxJQUFJLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUMzQixHQUFHLEdBQ0gsMkRBQTJELENBQUM7SUFDMUUsQ0FBQyxNQUFNO01BQ0hKLEdBQUcsR0FDQyxzQ0FBc0MsR0FDdENELE9BQU8sR0FDUCw0REFBNEQsR0FDNURoVCxJQUFJLENBQUNDLFNBQVMsQ0FBQzZTLElBQUksQ0FBQ3BMLEVBQUUsQ0FBQyxJQUN0QnFMLE9BQU8sR0FBRyxxQkFBcUIsR0FBR0EsT0FBTyxHQUFHLEVBQUUsQ0FBQyxHQUNoRCx3QkFBd0IsR0FDeEJELElBQUksQ0FBQ0ssUUFBUSxHQUNiLCtCQUErQixHQUMvQm5ULElBQUksQ0FBQ0MsU0FBUyxDQUFDK0Qsa0RBQUcsQ0FBQ3FDLGtEQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFBRXdNLE9BQU8sQ0FBQyxDQUFDO0lBQzlEO0VBQ0o7RUFDQSxPQUFPLENBQUNBLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRUksR0FBRyxDQUFDO0FBQzVCO0FBRUEsU0FBU0ssUUFBUUEsQ0FDYlYsS0FBVSxFQUNWcFYsTUFBVyxFQUNYK1YsRUFBYSxFQUNiQyxLQUFVLEVBQ1ZSLE9BQVksRUFFZDtFQUFBLElBREVTLGVBQWUsR0FBQXZaLFNBQUEsQ0FBQXJDLE1BQUEsUUFBQXFDLFNBQUEsUUFBQUcsU0FBQSxHQUFBSCxTQUFBLE1BQUcsS0FBSztFQUV2QixJQUFNd1osTUFBTSxHQUFHVixPQUFPLEtBQUssT0FBTyxHQUFHTyxFQUFFLENBQUNJLFNBQVMsR0FBR0osRUFBRSxDQUFDbk8sUUFBUTtFQUMvRCxJQUFNd08sTUFBYSxHQUFHLEVBQUU7RUFDeEIsSUFBSUMsZ0JBQWdCLEdBQUcsQ0FBQztFQUV4QixJQUFNQyxTQUFTLEdBQUdKLE1BQU0sQ0FBQ2QsS0FBSyxDQUFDLENBQUM1TyxHQUFHLENBQUMsVUFBQytQLFNBQWMsRUFBRXRnQixDQUFTLEVBQUs7SUFDL0QsSUFBQXVnQixpQkFBQSxHQUE2QnJCLGdCQUFnQixDQUN6Q0MsS0FBSyxFQUNMbUIsU0FBUyxDQUFDL1AsR0FBRyxDQUFDLFVBQUFaLElBQUE7UUFBQSxJQUFFc0UsRUFBRSxHQUFBdEUsSUFBQSxDQUFGc0UsRUFBRTtVQUFFeUwsUUFBUSxHQUFBL1AsSUFBQSxDQUFSK1AsUUFBUTtVQUFRYyxLQUFLLEdBQUE3USxJQUFBLENBQVhhLElBQUk7UUFBQSxPQUFtQjtVQUNqRHlELEVBQUU7VUFDRnlMLFFBQVE7VUFDUjNmLEtBQUssRUFBRXlRLGtEQUFJLElBQUEvRSxNQUFBLENBQUEySSxrQkFBQSxDQUFLb00sS0FBSyxJQUFFLE9BQU8sRUFBRWQsUUFBUSxJQUFHM1YsTUFBTTtRQUNyRCxDQUFDO01BQUEsQ0FBQyxDQUFDLEVBQ0hnVyxLQUFLLENBQUMvZixDQUFDLENBQUMsRUFDUjhmLEVBQUUsQ0FBQ1IsT0FBTyxFQUNWQyxPQUNKLENBQUM7TUFBQWtCLGtCQUFBLEdBQUE1WixjQUFBLENBQUEwWixpQkFBQTtNQVZNM1AsTUFBTSxHQUFBNlAsa0JBQUE7TUFBRUMsVUFBVSxHQUFBRCxrQkFBQTtJQVd6QixJQUFJbEUsNERBQWEsQ0FBQ3dELEtBQUssQ0FBQy9mLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzRRLE1BQU0sQ0FBQ3hNLE1BQU0sRUFBRTtNQUMzQ2djLGdCQUFnQixFQUFFO0lBQ3RCO0lBQ0EsSUFBSU0sVUFBVSxFQUFFO01BQ1pQLE1BQU0sQ0FBQ3BjLElBQUksQ0FBQzJjLFVBQVUsQ0FBQztJQUMzQjtJQUNBLE9BQU85UCxNQUFNO0VBQ2pCLENBQUMsQ0FBQztFQUVGLElBQUl1UCxNQUFNLENBQUMvYixNQUFNLEVBQUU7SUFDZixJQUNJNGIsZUFBZSxJQUNmRyxNQUFNLENBQUMvYixNQUFNLEdBQUdnYyxnQkFBZ0IsS0FBS0MsU0FBUyxDQUFDamMsTUFBTSxFQUN2RDtNQUNFO01BQ0E7TUFDQTtNQUNBO01BQ0EsT0FBTyxJQUFJO0lBQ2Y7SUFDQTtJQUNBO0lBQ0E7SUFDQXVjLE1BQU0sQ0FBQ1IsTUFBTSxFQUFFaEIsS0FBSyxDQUFDO0VBQ3pCO0VBRUEsT0FBT2tCLFNBQVM7QUFDcEI7QUFFQSxTQUFTTSxNQUFNQSxDQUFDUixNQUFXLEVBQUVoQixLQUFVLEVBQUU7RUFDckMsSUFBTXhZLEdBQUcsR0FBR3daLE1BQU0sQ0FBQyxDQUFDLENBQUM7RUFDckIsSUFBSXhaLEdBQUcsQ0FBQytULE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtJQUNwQztJQUNBO0lBQ0E7SUFDQTdCLE9BQU8sQ0FBQ3pTLEtBQUssQ0FBQytZLEtBQUssQ0FBQ3lCLElBQUksQ0FBQztFQUM3QjtFQUNBLE1BQU0sSUFBSUMsY0FBYyxDQUFDbGEsR0FBRyxDQUFDO0FBQ2pDO0FBRUEsSUFBTW1hLE9BQU8sR0FBRyxTQUFWQSxPQUFPQSxDQUFJdkYsS0FBVTtFQUFBLE9BQ3ZCalUsS0FBSyxDQUFDSyxPQUFPLENBQUM0VCxLQUFLLENBQUMsR0FBR1csa0RBQUssQ0FBQyxPQUFPLEVBQUVYLEtBQUssQ0FBQyxHQUFHQSxLQUFLLENBQUN4YixLQUFLO0FBQUE7QUFFOUQsSUFBTWdoQixVQUFVLEdBQUcsU0FBYkEsVUFBVUEsQ0FBSTdnQixDQUFNLEVBQUU4Z0IsQ0FBTTtFQUFBLE9BQzlCMVosS0FBSyxDQUFDSyxPQUFPLENBQUN6SCxDQUFDLENBQUMsR0FBR2tjLGtEQUFHLENBQUNsYyxDQUFDLEVBQUU4Z0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOWdCLENBQUMsRUFBRThnQixDQUFDLENBQUMsQ0FBQztBQUFBO0FBRTNDLFNBQVNDLGVBQWVBLENBQUN2QixRQUFnQixFQUFFO0VBQ3ZDLE9BQU9BLFFBQVEsQ0FBQ2pPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakM7QUFBQyxTQUVjeVAsZ0JBQWdCQSxDQUFBckcsRUFBQSxFQUFBQyxHQUFBLEVBQUFxRyxHQUFBLEVBQUFDLEdBQUE7RUFBQSxPQUFBQyxpQkFBQSxDQUFBM2EsS0FBQSxPQUFBRCxTQUFBO0FBQUE7QUFBQSxTQUFBNGEsa0JBQUE7RUFBQUEsaUJBQUEsR0FBQWhiLGlCQUFBLGVBQUFoSCxtQkFBQSxHQUFBb0YsSUFBQSxDQUEvQixTQUFBNmMsU0FDSTFXLFFBQWEsRUFDYjJXLG1CQUF3QixFQUN4QjNYLE1BQVcsRUFDWHFRLE9BQXlCO0lBQUEsSUFBQXVILEVBQUEsRUFBQTVRLE1BQUEsRUFBQTZRLE9BQUEsRUFBQWpVLEtBQUEsRUFBQWtVLFdBQUEsRUFBQUMsU0FBQSxFQUFBQyxTQUFBLEVBQUFDLE1BQUEsRUFBQWhXLE1BQUEsRUFBQWlXLGFBQUEsRUFBQUMsWUFBQSxFQUFBekwsU0FBQSxFQUFBMEwsYUFBQSxFQUFBeGIsSUFBQSxFQUFBeWIsV0FBQSxFQUFBQyxTQUFBLEVBQUFDLFNBQUE7SUFBQSxPQUFBOWlCLG1CQUFBLEdBQUF1QixJQUFBLFVBQUF3aEIsVUFBQUMsU0FBQTtNQUFBLGtCQUFBQSxTQUFBLENBQUFuZCxJQUFBLEdBQUFtZCxTQUFBLENBQUE5ZSxJQUFBO1FBQUE7VUFFbkJpZSxFQUFFLEdBQUtqVyxNQUFNLENBQVMrVyxlQUFlLEdBQ3RDL1csTUFBTSxDQUFTK1csZUFBZSxJQUFJLENBQUMsQ0FBQztVQUN6QyxJQUFJLENBQUNkLEVBQUUsQ0FBQ2UsU0FBUyxFQUFFO1lBQ2Y5aUIsTUFBTSxDQUFDSyxjQUFjLENBQUMwaEIsRUFBRSxFQUFFLFdBQVcsRUFBRTtjQUNuQ3poQixLQUFLLEVBQUU7Z0JBQUN5aUIsV0FBVyxFQUFFO2NBQXVDLENBQUM7Y0FDN0Q3aEIsUUFBUSxFQUFFO1lBQ2QsQ0FBQyxDQUFDO1lBRUZsQixNQUFNLENBQUNLLGNBQWMsQ0FBQzBoQixFQUFFLEVBQUUsZUFBZSxFQUFFO2NBQ3ZDemhCLEtBQUssRUFBRTtnQkFBQ3lpQixXQUFXLEVBQUU7Y0FBd0MsQ0FBQztjQUM5RDdoQixRQUFRLEVBQUU7WUFDZCxDQUFDLENBQUM7VUFDTjtVQUVPaVEsTUFBTSxHQUFvQnFKLE9BQU8sQ0FBakNySixNQUFNLEVBQUU2USxPQUFPLEdBQVd4SCxPQUFPLENBQXpCd0gsT0FBTyxFQUFFalUsS0FBSyxHQUFJeU0sT0FBTyxDQUFoQnpNLEtBQUs7VUFDdkJrVSxXQUFXLEdBQUdlLElBQUksQ0FBQ0MsR0FBRyxDQUFDLENBQUM7VUFFeEJmLFNBQVMsR0FBR2dCLFlBQVksQ0FBQy9SLE1BQU0sQ0FBQztVQUNoQ2dSLFNBQVMsR0FBR2UsWUFBWSxDQUFDblYsS0FBSyxDQUFDO1VBQy9CcVUsTUFBVyxHQUFHLENBQUMsQ0FBQztVQUNsQmhXLE1BQVcsR0FBR3pDLHdEQUFNLENBQUMwQyxFQUFFO1VBQUF1VyxTQUFBLENBQUFuZCxJQUFBO1VBR2hCb1IsU0FBUyxHQUFtQmlMLG1CQUFtQixDQUEvQ2pMLFNBQVMsRUFBRTBMLGFBQWEsR0FBSVQsbUJBQW1CLENBQXBDUyxhQUFhO1VBQzNCeGIsSUFBSSxHQUFHb0ssTUFBTSxDQUFDTCxHQUFHLENBQUN1USxPQUFPLENBQUM7VUFDOUIsSUFBSXRULEtBQUssRUFBRTtZQUNQaEgsSUFBSSxHQUFHaUYsa0RBQU0sQ0FBQ2pGLElBQUksRUFBRWdILEtBQUssQ0FBQytDLEdBQUcsQ0FBQ3VRLE9BQU8sQ0FBQyxDQUFDO1VBQzNDOztVQUVBO1VBQ0FVLEVBQUUsQ0FBQ29CLGdCQUFnQixHQUFHLENBQUMsQ0FBQztVQUN4QnBCLEVBQUUsQ0FBQ29CLGdCQUFnQixDQUFDbFIsU0FBUyxHQUFHdUksT0FBTyxDQUFDNEksY0FBYyxDQUFDdFMsR0FBRyxDQUFDLFVBQUF1UyxPQUFPO1lBQUEsT0FBSztjQUNuRUEsT0FBTyxFQUFFQSxPQUFPO2NBQ2hCL2lCLEtBQUssRUFBRTRoQixTQUFTLENBQUNtQixPQUFPO1lBQzVCLENBQUM7VUFBQSxDQUFDLENBQUM7VUFDSHRCLEVBQUUsQ0FBQ29CLGdCQUFnQixDQUFDRyxXQUFXLEdBQUduUyxNQUFNO1VBQ3hDNFEsRUFBRSxDQUFDb0IsZ0JBQWdCLENBQUNoUyxNQUFNLEdBQUcrUSxTQUFTO1VBQ3RDSCxFQUFFLENBQUNvQixnQkFBZ0IsQ0FBQ0ksV0FBVyxHQUFHeFYsS0FBSztVQUN2Q2dVLEVBQUUsQ0FBQ29CLGdCQUFnQixDQUFDSyxNQUFNLEdBQUdyQixTQUFTO1VBRWxDSyxXQUFXLEdBQUcsQ0FBQUgsYUFBQSxHQUFBTixFQUFFLENBQUNsTCxTQUFTLENBQUMsRUFBQzBMLGFBQWEsQ0FBQyxDQUFBdGIsS0FBQSxDQUFBb2IsYUFBQSxFQUFBMU4sa0JBQUEsQ0FBSTVOLElBQUksRUFBQztVQUV2RCxPQUFPZ2IsRUFBRSxDQUFDb0IsZ0JBQWdCO1VBQUMsTUFFdkIsU0FBQWIsWUFBQSxHQUFPRSxXQUFXLGNBQUFGLFlBQUEsdUJBQVhBLFlBQUEsQ0FBYXRmLElBQUksTUFBSyxVQUFVO1lBQUE0ZixTQUFBLENBQUE5ZSxJQUFBO1lBQUE7VUFBQTtVQUFBOGUsU0FBQSxDQUFBOWUsSUFBQTtVQUFBLE9BQ25CMGUsV0FBVztRQUFBO1VBQS9CQSxXQUFXLEdBQUFJLFNBQUEsQ0FBQXJmLElBQUE7UUFBQTtVQUdmK2QsVUFBVSxDQUFDVSxPQUFPLEVBQUVRLFdBQVcsQ0FBQyxDQUFDOWYsT0FBTyxDQUFDLFVBQUErZ0IsTUFBQSxFQUFrQjtZQUFBLElBQUFDLE1BQUEsR0FBQXRjLGNBQUEsQ0FBQXFjLE1BQUE7Y0FBaEJFLElBQUksR0FBQUQsTUFBQTtjQUFFRSxJQUFJLEdBQUFGLE1BQUE7WUFDakRwQyxVQUFVLENBQUNxQyxJQUFJLEVBQUVDLElBQUksQ0FBQyxDQUFDbGhCLE9BQU8sQ0FBQyxVQUFBbWhCLE1BQUEsRUFBb0I7Y0FBQSxJQUFBQyxNQUFBLEdBQUExYyxjQUFBLENBQUF5YyxNQUFBO2dCQUFsQkUsS0FBSyxHQUFBRCxNQUFBO2dCQUFFRSxLQUFLLEdBQUFGLE1BQUE7Y0FDekMsSUFBT3RQLEVBQUUsR0FBY3VQLEtBQUssQ0FBckJ2UCxFQUFFO2dCQUFFeUwsUUFBUSxHQUFJOEQsS0FBSyxDQUFqQjlELFFBQVE7Y0FDbkIsSUFBTWdFLEtBQUssR0FBR2xRLDBEQUFXLENBQUNTLEVBQUUsQ0FBQztjQUM3QixJQUFNMFAsU0FBUyxHQUFJOUIsTUFBTSxDQUFDNkIsS0FBSyxDQUFDLEdBQUc3QixNQUFNLENBQUM2QixLQUFLLENBQUMsSUFBSSxDQUFDLENBQUU7Y0FDdkQsSUFBSUQsS0FBSyxLQUFLakMsRUFBRSxDQUFDZSxTQUFTLEVBQUU7Z0JBQ3hCb0IsU0FBUyxDQUFDMUMsZUFBZSxDQUFDdkIsUUFBUSxDQUFDLENBQUMsR0FBRytELEtBQUs7Y0FDaEQ7WUFDSixDQUFDLENBQUM7VUFDTixDQUFDLENBQUM7VUFBQ3BCLFNBQUEsQ0FBQTllLElBQUE7VUFBQTtRQUFBO1VBQUE4ZSxTQUFBLENBQUFuZCxJQUFBO1VBQUFtZCxTQUFBLENBQUFuSSxFQUFBLEdBQUFtSSxTQUFBO1VBQUEsTUFFQ0EsU0FBQSxDQUFBbkksRUFBQSxLQUFNc0gsRUFBRSxDQUFDb0MsYUFBYTtZQUFBdkIsU0FBQSxDQUFBOWUsSUFBQTtZQUFBO1VBQUE7VUFDdEJzSSxNQUFNLEdBQUd6Qyx3REFBTSxDQUFDeWEsY0FBYztVQUFDeEIsU0FBQSxDQUFBOWUsSUFBQTtVQUFBO1FBQUE7VUFFL0JzSSxNQUFNLEdBQUd6Qyx3REFBTSxDQUFDMGEsZ0JBQWdCO1VBQUMsTUFBQXpCLFNBQUEsQ0FBQW5JLEVBQUE7UUFBQTtVQUFBbUksU0FBQSxDQUFBbmQsSUFBQTtVQUlyQyxPQUFPc2MsRUFBRSxDQUFDb0IsZ0JBQWdCOztVQUUxQjtVQUNNVixTQUFTLEdBQUdPLElBQUksQ0FBQ0MsR0FBRyxDQUFDLENBQUMsR0FBR2hCLFdBQVc7VUFDcENTLFNBQVMsR0FBRztZQUNkNEIsYUFBYSxFQUFFN0IsU0FBUztZQUN4QjhCLGFBQWEsRUFBRTlCLFNBQVM7WUFDeEIrQixhQUFhLEVBQUUsQ0FBQztZQUNoQkMsZUFBZSxFQUFFO1VBQ3JCLENBQUM7VUFFRCxJQUFJdGEsTUFBTSxDQUFDNkMsRUFBRSxFQUFFO1lBQ1g3QixRQUFRLENBQ0prVSxtQkFBbUIsQ0FBQztjQUNoQjdLLEVBQUUsRUFBRWdHLE9BQU8sQ0FBQ2tLLE1BQU07Y0FDbEJDLEtBQUssRUFBRWpDLFNBQVM7Y0FDaEJ0VyxNQUFNO2NBQ05nVyxNQUFNO2NBQ05qUixNQUFNO2NBQ05wRDtZQUNKLENBQUMsQ0FDTCxDQUFDO1VBQ0w7VUFBQyxPQUFBNlUsU0FBQSxDQUFBNWMsTUFBQTtRQUFBO1VBQUEsT0FBQTRjLFNBQUEsQ0FBQWxmLE1BQUEsV0FHRTBlLE1BQU07UUFBQTtRQUFBO1VBQUEsT0FBQVEsU0FBQSxDQUFBaGQsSUFBQTtNQUFBO0lBQUEsR0FBQWljLFFBQUE7RUFBQSxDQUNoQjtFQUFBLE9BQUFELGlCQUFBLENBQUEzYSxLQUFBLE9BQUFELFNBQUE7QUFBQTtBQUVELFNBQVM0ZCxVQUFVQSxDQUFDNUMsT0FBWSxFQUFFN1csUUFBYSxFQUFFdVUsS0FBVSxFQUFFO0VBQ3pEaEQsa0RBQU8sQ0FBQ3NGLE9BQU8sQ0FBQyxDQUFDdGYsT0FBTyxDQUFDLFVBQUFtaUIsS0FBQSxFQUFpQjtJQUFBLElBQUFDLEtBQUEsR0FBQTFkLGNBQUEsQ0FBQXlkLEtBQUE7TUFBZnJRLEVBQUUsR0FBQXNRLEtBQUE7TUFBRXhrQixLQUFLLEdBQUF3a0IsS0FBQTtJQUNoQyxJQUFBQyxTQUFBLEdBQWdDdlEsRUFBRSxDQUFDeEMsS0FBSyxDQUFDLEdBQUcsQ0FBQztNQUFBZ1QsVUFBQSxHQUFBNWQsY0FBQSxDQUFBMmQsU0FBQTtNQUF0QzNNLFdBQVcsR0FBQTRNLFVBQUE7TUFBRUMsUUFBUSxHQUFBRCxVQUFBO0lBQzVCLElBQU1FLGFBQWEsR0FBR3hGLEtBQUssQ0FBQ1EsSUFBSSxDQUFDOUgsV0FBVyxDQUFDO0lBQzdDak4sUUFBUSxDQUNKc0ksOENBQVcsQ0FBQztNQUNSeEosS0FBSyxFQUFFO1FBQUMsQ0FBQ2diLFFBQVEsR0FBRzNrQjtNQUFLLENBQUM7TUFDMUIwVixRQUFRLEVBQUVrUDtJQUNkLENBQUMsQ0FDTCxDQUFDO0lBQ0QvWixRQUFRLENBQ0pxSSxrREFBZSxDQUFDO01BQUNnQixFQUFFLEVBQUU0RCxXQUFXO01BQUVuTyxLQUFLLEVBQUU7UUFBQyxDQUFDZ2IsUUFBUSxHQUFHM2tCO01BQUs7SUFBQyxDQUFDLENBQ2pFLENBQUM7RUFDTCxDQUFDLENBQUM7QUFDTjtBQUVBLFNBQVM2a0IsZ0JBQWdCQSxDQUNyQmhhLFFBQWEsRUFDYjhCLEtBQVUsRUFDVjlDLE1BQVcsRUFDWHFRLE9BQVksRUFDWmtGLEtBQVUsRUFDVjBGLElBQWtDLEVBQ2xDQyxjQUF3RCxFQUN4RG5ULFFBQWEsRUFDYndTLE1BQWMsRUFDVztFQUN6QixJQUFJelgsS0FBSyxDQUFDK0IsV0FBVyxFQUFFO0lBQ25CL0IsS0FBSyxDQUFDK0IsV0FBVyxDQUFDd0wsT0FBTyxDQUFDO0VBQzlCO0VBRUEsSUFBTXlILFdBQVcsR0FBR2UsSUFBSSxDQUFDQyxHQUFHLENBQUMsQ0FBQztFQUM5QixJQUFNeEosSUFBSSxHQUFHM00sSUFBSSxDQUFDQyxTQUFTLENBQUN5TixPQUFPLENBQUM7RUFDcEMsSUFBSThLLFFBQWdCO0VBQ3BCLElBQUlDLEdBQVc7RUFDZixJQUFJQyxVQUFlO0VBQ25CLElBQUlDLGVBQW9CO0VBQ3hCLElBQUlDLFFBQVEsR0FBR0wsY0FBYztFQUU3QixJQUFNTSxhQUFhLEdBQUcsU0FBaEJBLGFBQWFBLENBQUEsRUFBUztJQUN4QixJQUFNbFcsT0FBTyxHQUFHb0osZ0RBQWEsQ0FBQyxDQUFRO0lBQ3RDLElBQUlnQixHQUFHLE1BQUE3TixNQUFBLENBQU1nTiwrQ0FBTyxDQUFDN08sTUFBTSxDQUFDLDJCQUF3QjtJQUVwRCxJQUFNeWIsTUFBTSxHQUFHLFNBQVRBLE1BQU1BLENBQUk3Z0IsSUFBWSxFQUFFekUsS0FBYSxFQUFLO01BQzVDLElBQUl1bEIsS0FBSyxHQUFHLEdBQUc7TUFDZixJQUFJaE0sR0FBRyxDQUFDeFIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ25Cd2QsS0FBSyxHQUFHLEdBQUc7TUFDZjtNQUNBaE0sR0FBRyxNQUFBN04sTUFBQSxDQUFNNk4sR0FBRyxFQUFBN04sTUFBQSxDQUFHNlosS0FBSyxFQUFBN1osTUFBQSxDQUFHakgsSUFBSSxPQUFBaUgsTUFBQSxDQUFJMUwsS0FBSyxDQUFFO0lBQzFDLENBQUM7SUFDRCxJQUFJZ2xCLFFBQVEsRUFBRTtNQUNWTSxNQUFNLENBQUMsVUFBVSxFQUFFTixRQUFRLENBQUM7SUFDaEM7SUFDQSxJQUFJQyxHQUFHLEVBQUU7TUFDTEssTUFBTSxDQUFDLEtBQUssRUFBRUwsR0FBRyxDQUFDO0lBQ3RCO0lBRUEsSUFBSUcsUUFBUSxFQUFFO01BQ1ZBLFFBQVEsQ0FBQ2hqQixPQUFPLENBQUMsVUFBQW9qQixLQUFBO1FBQUEsSUFBQUMsS0FBQSxHQUFBM2UsY0FBQSxDQUFBMGUsS0FBQTtVQUFFcmYsR0FBRyxHQUFBc2YsS0FBQTtVQUFFemxCLEtBQUssR0FBQXlsQixLQUFBO1FBQUEsT0FBTUgsTUFBTSxDQUFDbmYsR0FBRyxFQUFFbkcsS0FBSyxDQUFDO01BQUEsRUFBQztNQUN0RG9sQixRQUFRLEdBQUdBLFFBQVEsQ0FBQzdVLE1BQU0sQ0FBQyxVQUFBbVYsS0FBQTtRQUFBLElBQUFDLEtBQUEsR0FBQTdlLGNBQUEsQ0FBQTRlLEtBQUE7VUFBRUUsQ0FBQyxHQUFBRCxLQUFBO1VBQUVFLEVBQUUsR0FBQUYsS0FBQTtVQUFFRyxNQUFNLEdBQUFILEtBQUE7UUFBQSxPQUFNLENBQUNHLE1BQU07TUFBQSxFQUFDO0lBQzVEO0lBRUEsT0FBTzdXLEtBQUssQ0FDUnNLLEdBQUcsRUFDSGxCLGtEQUFjLENBQUN4TyxNQUFNLENBQUNvRixLQUFLLEVBQUU7TUFDekJuTSxNQUFNLEVBQUUsTUFBTTtNQUNkcU0sT0FBTztNQUNQZ0s7SUFDSixDQUFDLENBQ0wsQ0FBQztFQUNMLENBQUM7RUFFRCxPQUFPLElBQUlwVSxPQUFPLENBQUMsVUFBQ3ZDLE9BQU8sRUFBRXdELE1BQU0sRUFBSztJQUNwQyxJQUFNK2YsWUFBWSxHQUFHLFNBQWZBLFlBQVlBLENBQUl0TSxHQUFRLEVBQUs7TUFDL0IsSUFBTzNOLE1BQU0sR0FBSTJOLEdBQUcsQ0FBYjNOLE1BQU07TUFFYixJQUFJbVosR0FBRyxFQUFFO1FBQ0wsSUFBTWUsV0FBVyxHQUFHcFUsUUFBUSxDQUFDLENBQUMsQ0FBQ3FVLFlBQVksQ0FBQ2hCLEdBQUcsQ0FBQztRQUNoRCxJQUFJZSxXQUFXLGFBQVhBLFdBQVcsZUFBWEEsV0FBVyxDQUFFRSxRQUFRLEVBQUU7VUFDdkJyYixRQUFRLENBQUNvVSxpQkFBaUIsQ0FBQztZQUFDa0gsS0FBSyxFQUFFbEI7VUFBRyxDQUFDLENBQUMsQ0FBQztVQUN6QyxPQUFPemlCLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QjtNQUNKO01BRUEsU0FBUzRqQixhQUFhQSxDQUFDdEUsTUFBVyxFQUFFO1FBQ2hDLElBQUlqWSxNQUFNLENBQUM2QyxFQUFFLEVBQUU7VUFDWDtVQUNBLElBQU0wVixTQUFTLEdBQUc7WUFDZDRCLGFBQWEsRUFBRSxDQUFDO1lBQ2hCQyxhQUFhLEVBQUV2QixJQUFJLENBQUNDLEdBQUcsQ0FBQyxDQUFDLEdBQUdoQixXQUFXO1lBQ3ZDdUMsYUFBYSxFQUFFL0ssSUFBSSxDQUFDOVUsTUFBTTtZQUMxQjhmLGVBQWUsRUFBRXZJLE1BQU0sQ0FDbkJuQyxHQUFHLENBQUN0SyxPQUFPLENBQUN1TCxHQUFHLENBQUMsZ0JBQWdCLENBQ3BDO1VBQ0osQ0FBUTtVQUVSLElBQU0yTCxhQUFhLEdBQ2Y1TSxHQUFHLENBQUN0SyxPQUFPLENBQUN1TCxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRTtVQUUxQzJMLGFBQWEsQ0FBQzNVLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQ3RQLE9BQU8sQ0FBQyxVQUFDa2tCLE1BQVcsRUFBSztZQUM5QyxJQUFNN2hCLElBQUksR0FBRzZoQixNQUFNLENBQUM1VSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQU02VSxHQUFHLEdBQUdELE1BQU0sQ0FBQ0UsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUV4QyxJQUFJRCxHQUFHLEVBQUU7Y0FDTG5FLFNBQVMsQ0FBQzNkLElBQUksQ0FBQyxHQUFHbVgsTUFBTSxDQUFDMkssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDbGhCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QztVQUNKLENBQUMsQ0FBQztVQUVGd0YsUUFBUSxDQUNKa1UsbUJBQW1CLENBQUM7WUFDaEI3SyxFQUFFLEVBQUVnRyxPQUFPLENBQUNrSyxNQUFNO1lBQ2xCQyxLQUFLLEVBQUVqQyxTQUFTO1lBQ2hCdFcsTUFBTTtZQUNOZ1csTUFBTTtZQUNOalIsTUFBTSxFQUFFcUosT0FBTyxDQUFDckosTUFBTTtZQUN0QnBELEtBQUssRUFBRXlNLE9BQU8sQ0FBQ3pNO1VBQ25CLENBQUMsQ0FDTCxDQUFDO1FBQ0w7TUFDSjtNQUVBLElBQU1nWixVQUFVLEdBQUcsU0FBYkEsVUFBVUEsQ0FBSUMsSUFBMEIsRUFBSztRQUMvQyxJQUFPQyxLQUFLLEdBQWNELElBQUksQ0FBdkJDLEtBQUs7VUFBRUMsUUFBUSxHQUFJRixJQUFJLENBQWhCRSxRQUFRO1FBQ3RCLElBQUlqYSxLQUFLLENBQUNnQyxZQUFZLEVBQUU7VUFDcEJoQyxLQUFLLENBQUNnQyxZQUFZLENBQUN1TCxPQUFPLEVBQUUwTSxRQUFRLENBQUM7UUFDekM7UUFFQSxJQUFJOUUsTUFBTTtRQUNWLElBQUk2RSxLQUFLLEVBQUU7VUFDUDdFLE1BQU0sR0FBRzhFLFFBQTRCO1FBQ3pDLENBQUMsTUFBTTtVQUNILElBQU94QyxPQUFNLEdBQUlsSyxPQUFPLENBQWpCa0ssTUFBTTtVQUNiLElBQU1sUSxFQUFFLEdBQUdrUSxPQUFNLENBQUMzSixNQUFNLENBQUMsQ0FBQyxFQUFFMkosT0FBTSxDQUFDeUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1VBQ3BEL0UsTUFBTSxHQUFHO1lBQUMsQ0FBQzVOLEVBQUUsR0FBSTBTLFFBQVEsQ0FBc0JqZDtVQUFLLENBQUM7UUFDekQ7UUFFQXljLGFBQWEsQ0FBQ3RFLE1BQU0sQ0FBQztRQUNyQnRmLE9BQU8sQ0FBQ3NmLE1BQU0sQ0FBQztNQUNuQixDQUFDO01BRUQsSUFBTWdGLFdBQVcsR0FBRyxTQUFkQSxXQUFXQSxDQUFBLEVBQVM7UUFDdEIsSUFBSTdCLEdBQUcsRUFBRTtVQUNMcGEsUUFBUSxDQUFDb1UsaUJBQWlCLENBQUM7WUFBQ2tILEtBQUssRUFBRWxCO1VBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0M7UUFDQSxJQUFJQyxVQUFVLEVBQUU7VUFDWlosVUFBVSxDQUFDWSxVQUFVLEVBQUVyYSxRQUFRLEVBQUV1VSxLQUFLLENBQUM7UUFDM0M7UUFDQSxJQUFJK0YsZUFBZSxFQUFFO1VBQ2pCYixVQUFVLENBQUNhLGVBQWUsRUFBRXRhLFFBQVEsRUFBRXVVLEtBQUssQ0FBQztRQUNoRDtNQUNKLENBQUM7TUFFRCxJQUFJdFQsTUFBTSxLQUFLekMsd0RBQU0sQ0FBQzBDLEVBQUUsRUFBRTtRQUN0QjBOLEdBQUcsQ0FBQ21CLElBQUksQ0FBQyxDQUFDLENBQUNsWSxJQUFJLENBQUMsVUFBQ2drQixJQUEwQixFQUFLO1VBQzVDLElBQUksQ0FBQzFCLFFBQVEsSUFBSTBCLElBQUksQ0FBQzFCLFFBQVEsRUFBRTtZQUM1QkEsUUFBUSxHQUFHMEIsSUFBSSxDQUFDMUIsUUFBUTtVQUM1QjtVQUVBLElBQUksQ0FBQ0MsR0FBRyxJQUFJeUIsSUFBSSxDQUFDekIsR0FBRyxFQUFFO1lBQ2xCLElBQU04QixPQUEyQixHQUFHO2NBQ2hDWixLQUFLLEVBQUVPLElBQUksQ0FBQ3pCLEdBQUc7Y0FDZkQsUUFBUSxFQUFFMEIsSUFBSSxDQUFDMUIsUUFBa0I7Y0FDakNnQyxZQUFZLEVBQUVOLElBQUksQ0FBQ08sTUFBTTtjQUN6QjlCLGVBQWUsRUFBRXVCLElBQUksQ0FBQ3ZCLGVBQWU7Y0FDckNmO1lBQ0osQ0FBQztZQUNEdlosUUFBUSxDQUFDbVUsY0FBYyxDQUFDK0gsT0FBTyxDQUFDLENBQUM7WUFDakM5QixHQUFHLEdBQUd5QixJQUFJLENBQUN6QixHQUFHO1VBQ2xCO1VBRUEsSUFBSXlCLElBQUksQ0FBQ1EsUUFBUSxFQUFFO1lBQ2Y1QyxVQUFVLENBQUNvQyxJQUFJLENBQUNRLFFBQVEsRUFBRXJjLFFBQVEsRUFBRXVVLEtBQUssQ0FBQztVQUM5QztVQUNBLElBQUlzSCxJQUFJLENBQUNTLE9BQU8sRUFBRTtZQUNkN0MsVUFBVSxDQUFDb0MsSUFBSSxDQUFDUyxPQUFPLEVBQUV0YyxRQUFRLEVBQUV1VSxLQUFLLENBQUM7VUFDN0M7VUFDQSxJQUFJLENBQUM4RixVQUFVLElBQUl3QixJQUFJLENBQUN4QixVQUFVLEVBQUU7WUFDaENBLFVBQVUsR0FBR3dCLElBQUksQ0FBQ3hCLFVBQVU7VUFDaEM7VUFDQSxJQUFJLENBQUNDLGVBQWUsSUFBSXVCLElBQUksQ0FBQ3ZCLGVBQWUsRUFBRTtZQUMxQ0EsZUFBZSxHQUFHdUIsSUFBSSxDQUFDdkIsZUFBZTtVQUMxQztVQUVBLElBQUksQ0FBQ0wsSUFBSSxJQUFJNEIsSUFBSSxDQUFDRSxRQUFRLEtBQUsvZixTQUFTLEVBQUU7WUFDdENpZ0IsV0FBVyxDQUFDLENBQUM7WUFDYkwsVUFBVSxDQUFDQyxJQUFJLENBQUM7VUFDcEIsQ0FBQyxNQUFNO1lBQ0g7WUFDQVUsVUFBVSxDQUNONWhCLE1BQU0sRUFDTnNmLElBQUksQ0FBQ3VDLFFBQVEsS0FBS3hnQixTQUFTLEdBQUdpZSxJQUFJLENBQUN1QyxRQUFRLEdBQUcsR0FDbEQsQ0FBQztVQUNMO1FBQ0osQ0FBQyxDQUFDO01BQ04sQ0FBQyxNQUFNLElBQUl2YixNQUFNLEtBQUt6Qyx3REFBTSxDQUFDeWEsY0FBYyxFQUFFO1FBQ3pDZ0QsV0FBVyxDQUFDLENBQUM7UUFDYlYsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCNWpCLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNmLENBQUMsTUFBTTtRQUNIc2tCLFdBQVcsQ0FBQyxDQUFDO1FBQ2I5Z0IsTUFBTSxDQUFDeVQsR0FBRyxDQUFDO01BQ2Y7SUFDSixDQUFDO0lBRUQsSUFBTTZOLFdBQVcsR0FBRyxTQUFkQSxXQUFXQSxDQUFBLEVBQVM7TUFDdEIsSUFBSXpkLE1BQU0sQ0FBQzZDLEVBQUUsRUFBRTtRQUNYN0IsUUFBUSxDQUNKa1UsbUJBQW1CLENBQUM7VUFDaEI3SyxFQUFFLEVBQUVnRyxPQUFPLENBQUNrSyxNQUFNO1VBQ2xCdFksTUFBTSxFQUFFekMsd0RBQU0sQ0FBQ2tlLFdBQVc7VUFDMUJ6RixNQUFNLEVBQUUsQ0FBQyxDQUFDO1VBQ1ZqUixNQUFNLEVBQUVxSixPQUFPLENBQUNySixNQUFNO1VBQ3RCcEQsS0FBSyxFQUFFeU0sT0FBTyxDQUFDek07UUFDbkIsQ0FBQyxDQUNMLENBQUM7TUFDTDtNQUNBekgsTUFBTSxDQUFDLElBQUlwRCxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsSUFBTTRDLE1BQU0sR0FBRyxTQUFUQSxNQUFNQSxDQUFBLEVBQVM7TUFDakI2ZixhQUFhLENBQUMsQ0FBQyxDQUFDM2lCLElBQUksQ0FBQ3FqQixZQUFZLEVBQUV1QixXQUFXLENBQUM7SUFDbkQsQ0FBQztJQUNEOWhCLE1BQU0sQ0FBQyxDQUFDO0VBQ1osQ0FBQyxDQUFDO0FBQ047QUFFQSxTQUFTb2QsWUFBWUEsQ0FBQ0ksV0FBZ0IsRUFBRTtFQUNwQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsSUFBSSxDQUFDQSxXQUFXLEVBQUU7SUFDZCxPQUFPLENBQUMsQ0FBQztFQUNiO0VBQ0EsSUFBTW5TLE1BQVcsR0FBRyxDQUFDLENBQUM7RUFDdEIsS0FBSyxJQUFJNVEsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHK2lCLFdBQVcsQ0FBQzNlLE1BQU0sRUFBRXBFLENBQUMsRUFBRSxFQUFFO0lBQ3pDLElBQUlzSCxLQUFLLENBQUNLLE9BQU8sQ0FBQ29iLFdBQVcsQ0FBQy9pQixDQUFDLENBQUMsQ0FBQyxFQUFFO01BQy9CLElBQU11bkIsT0FBTyxHQUFHeEUsV0FBVyxDQUFDL2lCLENBQUMsQ0FBQztNQUM5QixLQUFLLElBQUl3bkIsRUFBRSxHQUFHLENBQUMsRUFBRUEsRUFBRSxHQUFHRCxPQUFPLENBQUNuakIsTUFBTSxFQUFFb2pCLEVBQUUsRUFBRSxFQUFFO1FBQUEsSUFBQUMsaUJBQUE7UUFDeEMsSUFBTUMsTUFBTSxNQUFBamMsTUFBQSxDQUFNK0gsMERBQVcsQ0FBQytULE9BQU8sQ0FBQ0MsRUFBRSxDQUFDLENBQUN2VCxFQUFFLENBQUMsT0FBQXhJLE1BQUEsQ0FDekM4YixPQUFPLENBQUNDLEVBQUUsQ0FBQyxDQUFDOUgsUUFBUSxDQUN0QjtRQUNGOU8sTUFBTSxDQUFDOFcsTUFBTSxDQUFDLElBQUFELGlCQUFBLEdBQUdGLE9BQU8sQ0FBQ0MsRUFBRSxDQUFDLENBQUN6bkIsS0FBSyxjQUFBMG5CLGlCQUFBLGNBQUFBLGlCQUFBLEdBQUksSUFBSTtNQUM5QztJQUNKLENBQUMsTUFBTTtNQUFBLElBQUFFLG9CQUFBO01BQ0gsSUFBTUQsT0FBTSxNQUFBamMsTUFBQSxDQUFNK0gsMERBQVcsQ0FBQ3VQLFdBQVcsQ0FBQy9pQixDQUFDLENBQUMsQ0FBQ2lVLEVBQUUsQ0FBQyxPQUFBeEksTUFBQSxDQUM1Q3NYLFdBQVcsQ0FBQy9pQixDQUFDLENBQUMsQ0FBQzBmLFFBQVEsQ0FDekI7TUFDRjlPLE1BQU0sQ0FBQzhXLE9BQU0sQ0FBQyxJQUFBQyxvQkFBQSxHQUFHNUUsV0FBVyxDQUFDL2lCLENBQUMsQ0FBQyxDQUFDRCxLQUFLLGNBQUE0bkIsb0JBQUEsY0FBQUEsb0JBQUEsR0FBSSxJQUFJO0lBQ2pEO0VBQ0o7RUFDQSxPQUFPL1csTUFBTTtBQUNqQjtBQUVPLFNBQVNnWCxlQUFlQSxDQUMzQjlILEVBQXdCLEVBQ3hCbFcsTUFBVyxFQUNYOEMsS0FBVSxFQUNWeVMsS0FBVSxFQUNWcFYsTUFBVyxFQUFBOGQsS0FBQSxFQUVYamQsUUFBYSxFQUNiK0csUUFBYSxFQUNLO0VBQUEsSUFIakJtVyxVQUFVLEdBQUFELEtBQUEsQ0FBVkMsVUFBVTtFQUlYLElBQUFDLFlBQUEsR0FDSWpJLEVBQUUsQ0FBQ2tJLFFBQVE7SUFEUjdELE1BQU0sR0FBQTRELFlBQUEsQ0FBTjVELE1BQU07SUFBRXZULE1BQU0sR0FBQW1YLFlBQUEsQ0FBTm5YLE1BQU07SUFBRXBELEtBQUssR0FBQXVhLFlBQUEsQ0FBTHZhLEtBQUs7SUFBRStULG1CQUFtQixHQUFBd0csWUFBQSxDQUFuQnhHLG1CQUFtQjtJQUFFc0QsSUFBSSxHQUFBa0QsWUFBQSxDQUFKbEQsSUFBSTtJQUFFb0QsZUFBZSxHQUFBRixZQUFBLENBQWZFLGVBQWU7SUFBRUMsZUFBZSxHQUFBSCxZQUFBLENBQWZHLGVBQWU7RUFFekYsSUFBSTtJQUNBLElBQU1DLE1BQU0sR0FBR3RJLFFBQVEsQ0FBQ1YsS0FBSyxFQUFFcFYsTUFBTSxFQUFFK1YsRUFBRSxFQUFFbFAsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUM7O0lBRWpFO0lBQ0EsSUFBSXVYLE1BQU0sS0FBSyxJQUFJLEVBQUU7TUFDakIsT0FBQXRaLGFBQUEsQ0FBQUEsYUFBQSxLQUNPaVIsRUFBRTtRQUNMc0ksZ0JBQWdCLEVBQUU7TUFBSTtJQUU5QjtJQUVBLElBQU0zRyxPQUFjLEdBQUcsRUFBRTtJQUN6QixJQUFNNEcsWUFBbUIsR0FBRyxFQUFFO0lBQzlCUCxVQUFVLENBQUMzbEIsT0FBTyxDQUFDLFVBQUNtbUIsR0FBUSxFQUFFdG9CLENBQVMsRUFBSztNQUN4QyxJQUFBdW9CLGtCQUFBLEdBQXFCckosZ0JBQWdCLENBQ2pDQyxLQUFLLEVBQ0w1TyxrREFBRyxDQUFDcUMsa0RBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFMFYsR0FBRyxDQUFDLEVBQ2xDeEksRUFBRSxDQUFDa0ksUUFBUSxDQUFDdkcsT0FBTyxDQUFDemhCLENBQUMsQ0FBQyxFQUN0QjhmLEVBQUUsQ0FBQ1IsT0FBTyxFQUNWLFFBQ0osQ0FBQztRQUFBa0osa0JBQUEsR0FBQTNoQixjQUFBLENBQUEwaEIsa0JBQUE7UUFOTW5GLElBQUksR0FBQW9GLGtCQUFBO1FBQUVDLElBQUksR0FBQUQsa0JBQUE7TUFPakIvRyxPQUFPLENBQUMxZCxJQUFJLENBQUNxZixJQUFJLENBQUM7TUFDbEIsSUFBSXFGLElBQUksRUFBRTtRQUNOSixZQUFZLENBQUN0a0IsSUFBSSxDQUFDMGtCLElBQUksQ0FBQztNQUMzQjtJQUNKLENBQUMsQ0FBQztJQUVGLElBQUlKLFlBQVksQ0FBQ2prQixNQUFNLEVBQUU7TUFDckIsSUFBSTRYLGtEQUFPLENBQUNtTSxNQUFNLENBQUMsQ0FBQy9qQixNQUFNLEVBQUU7UUFDeEJ1YyxNQUFNLENBQUMwSCxZQUFZLEVBQUVsSixLQUFLLENBQUM7TUFDL0I7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBLE9BQUF0USxhQUFBLENBQUFBLGFBQUEsS0FDT2lSLEVBQUU7UUFDTHNJLGdCQUFnQixFQUFFO01BQUk7SUFFOUI7SUFFQSxJQUFNTSxTQUFTO01BQUEsSUFBQUMsS0FBQSxHQUFBdGlCLGlCQUFBLGVBQUFoSCxtQkFBQSxHQUFBb0YsSUFBQSxDQUFHLFNBQUF5RyxRQUFBO1FBQUEsSUFBQStPLE9BQUEsRUFBQXdNLElBQUEsRUFBQW1DLFNBQUEsRUFBQXZQLFVBQUEsRUFBQXdQLFNBQUEsRUFBQS9ELGNBQUEsRUFBQXZPLEtBQUEsRUFBQW9CLElBQUEsRUFBQThCLEtBQUE7UUFBQSxPQUFBcGEsbUJBQUEsR0FBQXVCLElBQUEsVUFBQXVLLFNBQUEyZCxTQUFBO1VBQUEsa0JBQUFBLFNBQUEsQ0FBQTVqQixJQUFBLEdBQUE0akIsU0FBQSxDQUFBdmxCLElBQUE7WUFBQTtjQUFBdWxCLFNBQUEsQ0FBQTVqQixJQUFBO2NBRUorVSxPQUF5QixHQUFHO2dCQUM5QmtLLE1BQU07Z0JBQ04xQyxPQUFPLEVBQUVqRixnRUFBaUIsQ0FBQzJILE1BQU0sQ0FBQyxHQUFHMUMsT0FBTyxHQUFHQSxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN6RDdRLE1BQU0sRUFBRXVYLE1BQU07Z0JBQ2R0RixjQUFjLEVBQUU5ZCxrREFBSSxDQUFDK2EsRUFBRSxDQUFDK0MsY0FBYyxDQUFDO2dCQUN2Q3FGLGVBQWUsRUFBRUEsZUFBZTtnQkFDaEMxYSxLQUFLLEVBQUVzUyxFQUFFLENBQUNrSSxRQUFRLENBQUN4YSxLQUFLLENBQUNwSixNQUFNLEdBQ3pCeWIsUUFBUSxDQUFDVixLQUFLLEVBQUVwVixNQUFNLEVBQUUrVixFQUFFLEVBQUV0UyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQzNDNUc7Y0FDVixDQUFDO2NBQUEsS0FFRzJhLG1CQUFtQjtnQkFBQXVILFNBQUEsQ0FBQXZsQixJQUFBO2dCQUFBO2NBQUE7Y0FBQXVsQixTQUFBLENBQUE1akIsSUFBQTtjQUFBNGpCLFNBQUEsQ0FBQXZsQixJQUFBO2NBQUEsT0FFSTJkLGdCQUFnQixDQUMvQnRXLFFBQVEsRUFDUjJXLG1CQUFtQixFQUNuQjNYLE1BQU0sRUFDTnFRLE9BQ0osQ0FBQztZQUFBO2NBTEt3TSxJQUFJLEdBQUFxQyxTQUFBLENBQUE5bEIsSUFBQTtjQUFBLE9BQUE4bEIsU0FBQSxDQUFBM2xCLE1BQUEsV0FNSDtnQkFBQ3NqQixJQUFJO2dCQUFFeE07Y0FBTyxDQUFDO1lBQUE7Y0FBQTZPLFNBQUEsQ0FBQTVqQixJQUFBO2NBQUE0akIsU0FBQSxDQUFBNU8sRUFBQSxHQUFBNE8sU0FBQTtjQUFBLE9BQUFBLFNBQUEsQ0FBQTNsQixNQUFBLFdBRWY7Z0JBQUNpRCxLQUFLLEVBQUEwaUIsU0FBQSxDQUFBNU8sRUFBQTtnQkFBRUQ7Y0FBTyxDQUFDO1lBQUE7Y0FJM0IyTyxTQUFTLEdBQUdoZixNQUFNO2NBQ2xCeVAsVUFBeUMsR0FBRyxJQUFJO2NBRzlDeUwsY0FBNEMsR0FBRyxFQUFFO2NBQ3ZEOWlCLGtEQUFNLENBQUMyUCxRQUFRLENBQUMsQ0FBQyxDQUFDcVUsWUFBWSxDQUFDLENBQUM3akIsT0FBTyxDQUNuQyxVQUFDNmlCLEdBQXVCLEVBQUs7Z0JBQ3pCLElBQUlsRixFQUFFLENBQUNrSSxRQUFRLENBQUM3RCxNQUFNLEtBQUthLEdBQUcsQ0FBQ2IsTUFBTSxFQUFFO2tCQUNuQztrQkFDQTtrQkFDQTtrQkFDQVcsY0FBYyxDQUFDL2dCLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRWloQixHQUFHLENBQUNrQixLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7a0JBQ2hEdGIsUUFBUSxDQUNKcVUsc0JBQXNCLENBQUM7b0JBQUNpSCxLQUFLLEVBQUVsQixHQUFHLENBQUNrQjtrQkFBSyxDQUFDLENBQzdDLENBQUM7Z0JBQ0w7Z0JBQ0EsSUFBSSxDQUFDbEIsR0FBRyxDQUFDK0IsWUFBWSxFQUFFO2tCQUNuQjtnQkFDSjtnQkFDQSxJQUFNZ0MsS0FBSyxHQUFHOU0sa0RBQVksQ0FDdEIrSSxHQUFHLENBQUMrQixZQUFZLEVBQ2hCakgsRUFBRSxDQUFDa0ksUUFBUSxDQUFDcFgsTUFDaEIsQ0FBQztnQkFDRCxJQUFJbVksS0FBSyxDQUFDM2tCLE1BQU0sRUFBRTtrQkFDZDBnQixjQUFjLENBQUMvZ0IsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFaWhCLEdBQUcsQ0FBQ2tCLEtBQUssQ0FBQyxDQUFDO2tCQUM3QyxJQUFJbEIsR0FBRyxDQUFDRSxlQUFlLEVBQUU7b0JBQ3JCYixVQUFVLENBQ05XLEdBQUcsQ0FBQ0UsZUFBZSxFQUNuQnRhLFFBQVEsRUFDUnVVLEtBQ0osQ0FBQztrQkFDTDtnQkFDSjtjQUNKLENBQ0osQ0FBQztjQUFDNUksS0FBQSxnQkFBQWxYLG1CQUFBLEdBQUFvRixJQUFBLFVBQUE4UixNQUFBO2dCQUFBLElBQUF5UyxLQUFBLEVBQUFDLGFBQUEsRUFBQS9QLElBQUEsRUFBQWdRLE1BQUEsRUFBQXZQLE1BQUE7Z0JBQUEsT0FBQXRhLG1CQUFBLEdBQUF1QixJQUFBLFVBQUF1b0IsT0FBQS9kLFFBQUE7a0JBQUEsa0JBQUFBLFFBQUEsQ0FBQWxHLElBQUEsR0FBQWtHLFFBQUEsQ0FBQTdILElBQUE7b0JBQUE7c0JBQUE2SCxRQUFBLENBQUFsRyxJQUFBO3NCQUFBa0csUUFBQSxDQUFBN0gsSUFBQTtzQkFBQSxPQUl1QnFoQixnQkFBZ0IsQ0FDN0JoYSxRQUFRLEVBQ1I4QixLQUFLLEVBQ0xrYyxTQUFTLEVBQ1QzTyxPQUFPLEVBQ1BrRixLQUFLLEVBQ0wwRixJQUFJLEVBQ0pDLGNBQWMsQ0FBQzFnQixNQUFNLEdBQUcwZ0IsY0FBYyxHQUFHbGUsU0FBUyxFQUNsRCtLLFFBQVEsRUFDUm1PLEVBQUUsQ0FBQ2tJLFFBQVEsQ0FBQzdELE1BQ2hCLENBQUM7b0JBQUE7c0JBVkdzQyxLQUFJLEdBQUFyYixRQUFBLENBQUFwSSxJQUFBO3NCQVlSLElBQUlxVyxVQUFVLEVBQUU7d0JBQ1p6TyxRQUFRLENBQUM0TixpREFBYyxDQUFDYSxVQUFVLENBQUMsQ0FBQztzQkFDeEM7c0JBQ0E7c0JBQ000UCxhQUFhLEdBQUd0WCxRQUFRLENBQUMsQ0FBQyxDQUFDNUgsTUFBTTtzQkFDdkNpUyxrREFBTyxDQUFDeUYsT0FBTyxDQUFDLENBQUN0ZixPQUFPLENBQUMsVUFBQ21tQixHQUFRLEVBQUs7d0JBQ25DLElBQU01RCxRQUFRLEdBQUd6RCxlQUFlLENBQUNxSCxHQUFHLENBQUM1SSxRQUFRLENBQUM7d0JBQzlDLElBQU0wSixVQUFVLEdBQUd4TSwrQ0FBTyxDQUFDdUMsS0FBSyxFQUFFbUosR0FBRyxDQUFDclUsRUFBRSxDQUFDO3dCQUN6QyxJQUFNb1YsYUFBYSxHQUFHN1ksa0RBQUksQ0FDdEI0WSxVQUFVLENBQUMzZCxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUVpWixRQUFRLENBQUMsQ0FBQyxFQUN0Q3VFLGFBQ0osQ0FBQzt3QkFDRCxJQUFNSyxRQUFRLEdBQUcsQ0FBQzlWLDBEQUFXLENBQUM4VSxHQUFHLENBQUNyVSxFQUFFLENBQUMsRUFBRXlRLFFBQVEsQ0FBQzt3QkFDaEQsSUFBTTZFLFdBQVcsR0FBRy9ZLGtEQUFJLENBQUM4WSxRQUFRLEVBQUU3QyxLQUFJLENBQUM7d0JBQ3hDLElBQUk5SiwrQ0FBTyxDQUFDNE0sV0FBVyxDQUFDLEVBQUU7MEJBQ3RCLElBQUlGLGFBQWEsS0FBS3ppQixTQUFTLEVBQUU7NEJBQzdCLE1BQU0sSUFBSWpFLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQzswQkFDN0M7MEJBQ0E4akIsS0FBSSxHQUFHcFUsa0RBQVMsQ0FDWmlYLFFBQVEsRUFDUjVNLG1EQUFXLENBQUMyTSxhQUFhLEVBQUVFLFdBQVcsQ0FBQyxFQUN2QzlDLEtBQ0osQ0FBQzt3QkFDTDtzQkFDSixDQUFDLENBQUM7c0JBRUYsSUFBSXdCLGVBQWUsRUFBRTt3QkFDakJkLFVBQVUsQ0FDTjswQkFBQSxPQUFNdmMsUUFBUSxDQUFDaVMseUVBQW1CLENBQUMsQ0FBQyxDQUFDO3dCQUFBLEdBQ3JDLENBQ0osQ0FBQztzQkFDTDtzQkFBQyxPQUFBelIsUUFBQSxDQUFBakksTUFBQTt3QkFBQXBCLENBQUEsRUFFTTswQkFBQzBrQixJQUFJLEVBQUpBLEtBQUk7MEJBQUV4TTt3QkFBTztzQkFBQztvQkFBQTtzQkFBQTdPLFFBQUEsQ0FBQWxHLElBQUE7c0JBQUFrRyxRQUFBLENBQUE4TyxFQUFBLEdBQUE5TyxRQUFBO3NCQUV0QnlkLFNBQVMsR0FBQXpkLFFBQUEsQ0FBQThPLEVBQU07c0JBQUMsTUFFWlQsS0FBSyxJQUFJZix3REFBZ0IsS0FDeEJ0TixRQUFBLENBQUE4TyxFQUFBLENBQUlyTyxNQUFNLEtBQUt6Qyx3REFBTSxDQUFDZ1IsWUFBWSxJQUMvQmhQLFFBQUEsQ0FBQThPLEVBQUEsQ0FBSXJPLE1BQU0sS0FBS3pDLHdEQUFNLENBQUNpUixXQUFXLENBQUM7d0JBQUFqUCxRQUFBLENBQUE3SCxJQUFBO3dCQUFBO3NCQUFBO3NCQUFBNkgsUUFBQSxDQUFBN0gsSUFBQTtzQkFBQSxPQUVuQjZILFFBQUEsQ0FBQThPLEVBQUEsQ0FBSUksSUFBSSxDQUFDLENBQUM7b0JBQUE7c0JBQXZCcEIsSUFBSSxHQUFBOU4sUUFBQSxDQUFBcEksSUFBQTtzQkFBQSxLQUVOa1csSUFBSSxDQUFDcFIsUUFBUSxDQUFDNlEscUVBQW1CLENBQUM7d0JBQUF2TixRQUFBLENBQUE3SCxJQUFBO3dCQUFBO3NCQUFBO3NCQUFBLE1BQzlCbUosS0FBSyxDQUFDa0MsbUJBQW1CLEtBQUssSUFBSTt3QkFBQXhELFFBQUEsQ0FBQTdILElBQUE7d0JBQUE7c0JBQUE7c0JBQzlCMmxCLE1BQU0sR0FBRyxJQUFJO3NCQUNqQixJQUFJdGYsTUFBTSxDQUFDb0YsS0FBSyxDQUFDRSxPQUFPLENBQUNxTCxhQUFhLEVBQUU7d0JBQ3BDMk8sTUFBTSxHQUNGdGYsTUFBTSxDQUFDb0YsS0FBSyxDQUFDRSxPQUFPLENBQUNxTCxhQUFhLENBQUNDLE1BQU0sQ0FDckMsU0FBUyxDQUFDcFcsTUFDZCxDQUFDO3NCQUNUO3NCQUFDZ0gsUUFBQSxDQUFBN0gsSUFBQTtzQkFBQSxPQUdTbUosS0FBSyxDQUFDa0MsbUJBQW1CLENBQUNzYSxNQUFNLENBQUM7b0JBQUE7c0JBRHJDdlAsTUFBTSxHQUFBdk8sUUFBQSxDQUFBcEksSUFBQTtzQkFBQSxLQUVSMlcsTUFBTTt3QkFBQXZPLFFBQUEsQ0FBQTdILElBQUE7d0JBQUE7c0JBQUE7c0JBQ044VixVQUFVLEdBQUc7d0JBQ1RrQixhQUFhLFlBQUE5TyxNQUFBLENBQVlrTyxNQUFNO3NCQUNuQyxDQUFDO3NCQUVEaVAsU0FBUyxHQUFHeFEsa0RBQWMsQ0FBQ3hPLE1BQU0sRUFBRTt3QkFDL0JvRixLQUFLLEVBQUU7MEJBQ0hFLE9BQU8sRUFBRW1LO3dCQUNiO3NCQUNKLENBQUMsQ0FBQztzQkFBQyxPQUFBak8sUUFBQSxDQUFBakksTUFBQTtvQkFBQTtzQkFBQSxPQUFBaUksUUFBQSxDQUFBakksTUFBQTtvQkFBQTtvQkFBQTtzQkFBQSxPQUFBaUksUUFBQSxDQUFBL0YsSUFBQTtrQkFBQTtnQkFBQSxHQUFBa1IsS0FBQTtjQUFBO2NBOUVsQmtELEtBQUssR0FBRyxDQUFDO1lBQUE7Y0FBQSxNQUFFQSxLQUFLLElBQUlmLHdEQUFnQjtnQkFBQW9RLFNBQUEsQ0FBQXZsQixJQUFBO2dCQUFBO2NBQUE7Y0FBQSxPQUFBdWxCLFNBQUEsQ0FBQWxqQixhQUFBLENBQUEyUSxLQUFBO1lBQUE7Y0FBQW9CLElBQUEsR0FBQW1SLFNBQUEsQ0FBQWxPLEVBQUE7Y0FBQSxNQUFBakQsSUFBQTtnQkFBQW1SLFNBQUEsQ0FBQXZsQixJQUFBO2dCQUFBO2NBQUE7Y0FBQSxPQUFBdWxCLFNBQUEsQ0FBQTNsQixNQUFBO1lBQUE7Y0FBQSxNQUFBd1UsSUFBQTtnQkFBQW1SLFNBQUEsQ0FBQXZsQixJQUFBO2dCQUFBO2NBQUE7Y0FBQSxPQUFBdWxCLFNBQUEsQ0FBQTNsQixNQUFBO1lBQUE7Y0FBQSxLQUFBd1UsSUFBQTtnQkFBQW1SLFNBQUEsQ0FBQXZsQixJQUFBO2dCQUFBO2NBQUE7Y0FBQSxPQUFBdWxCLFNBQUEsQ0FBQTNsQixNQUFBLFdBQUF3VSxJQUFBLENBQUE1VixDQUFBO1lBQUE7Y0FBRTBYLEtBQUssRUFBRTtjQUFBcVAsU0FBQSxDQUFBdmxCLElBQUE7Y0FBQTtZQUFBO2NBQUEsT0FBQXVsQixTQUFBLENBQUEzbEIsTUFBQSxXQTJGL0M7Z0JBQUNpRCxLQUFLLEVBQUV5aUIsU0FBUztnQkFBRTVPLE9BQU8sRUFBRTtjQUFJLENBQUM7WUFBQTtjQUFBNk8sU0FBQSxDQUFBNWpCLElBQUE7Y0FBQTRqQixTQUFBLENBQUFVLEVBQUEsR0FBQVYsU0FBQTtjQUFBLE9BQUFBLFNBQUEsQ0FBQTNsQixNQUFBLFdBRWpDO2dCQUFDaUQsS0FBSyxFQUFBMGlCLFNBQUEsQ0FBQVUsRUFBQTtnQkFBRXZQLE9BQU8sRUFBRTtjQUFJLENBQUM7WUFBQTtZQUFBO2NBQUEsT0FBQTZPLFNBQUEsQ0FBQXpqQixJQUFBO1VBQUE7UUFBQSxHQUFBNkYsT0FBQTtNQUFBLENBRXBDO01BQUEsZ0JBOUpLd2QsU0FBU0EsQ0FBQTtRQUFBLE9BQUFDLEtBQUEsQ0FBQWppQixLQUFBLE9BQUFELFNBQUE7TUFBQTtJQUFBLEdBOEpkO0lBRUQsSUFBTWdqQixLQUFLLEdBQUE1YSxhQUFBLENBQUFBLGFBQUEsS0FDSmlSLEVBQUU7TUFDTHNJLGdCQUFnQixFQUFFTSxTQUFTLENBQUM7SUFBQyxFQUNoQztJQUVELE9BQU9lLEtBQUs7RUFDaEIsQ0FBQyxDQUFDLE9BQU9yakIsS0FBVSxFQUFFO0lBQ2pCLE9BQUF5SSxhQUFBLENBQUFBLGFBQUEsS0FDT2lSLEVBQUU7TUFDTHNJLGdCQUFnQixFQUFFO1FBQUNoaUIsS0FBSztRQUFFNlQsT0FBTyxFQUFFO01BQUk7SUFBQztFQUVoRDtBQUNKOzs7Ozs7Ozs7Ozs7Ozs7O0FDbnlCQSxJQUFNeVAsVUFBVSxHQUFHO0VBQ2ZDLGNBQWMsRUFBRSxDQUFDO0VBQ2pCQyxpQkFBaUIsRUFBRSxDQUFDO0VBQ3BCQyxVQUFVLEVBQUUsQ0FBQztFQUNiQyxTQUFTLEVBQUUsQ0FBQztFQUNaQyxVQUFVLEVBQUUsQ0FBQztFQUNiQyxpQkFBaUIsRUFBRSxDQUFDO0VBQ3BCQyxVQUFVLEVBQUUsQ0FBQztFQUNiQyxnQkFBZ0IsRUFBRSxDQUFDO0VBQ25CQyxRQUFRLEVBQUUsQ0FBQztFQUNYQyxTQUFTLEVBQUU7QUFDZixDQUFDO0FBRU0sSUFBTUMsU0FBUyxHQUFHLFNBQVpBLFNBQVNBLENBQUdDLE1BQU0sRUFBSTtFQUMvQixJQUFJWixVQUFVLENBQUNZLE1BQU0sQ0FBQyxFQUFFO0lBQ3BCLE9BQU9BLE1BQU07RUFDakI7RUFDQSxNQUFNLElBQUkzbkIsS0FBSyxJQUFBOEksTUFBQSxDQUFJNmUsTUFBTSxxQkFBa0IsQ0FBQztBQUNoRCxDQUFDO0FBRU0sSUFBTTVSLGdCQUFnQixHQUFHLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwQlM7QUFDSDtBQXlCeEI7QUFVWTtBQUNtQjtBQUVWO0FBRUQ7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLElBQU04RCxpQkFBaUIsR0FBRyxTQUFwQkEsaUJBQWlCQSxDQUFHZ1AsU0FBUztFQUFBLE9BQUlBLFNBQVMsQ0FBQ1YsVUFBVSxDQUFDLElBQUksQ0FBQztBQUFBO0FBRXhFLElBQU1XLEdBQUcsR0FBRztFQUFDQyxJQUFJLEVBQUUsS0FBSztFQUFFaEYsS0FBSyxFQUFFO0FBQUMsQ0FBQztBQUNuQyxJQUFNaUYsS0FBSyxHQUFHO0VBQUNELElBQUksRUFBRTtBQUFPLENBQUM7QUFDN0IsSUFBTUUsVUFBVSxHQUFHO0VBQUNGLElBQUksRUFBRSxZQUFZO0VBQUVoRixLQUFLLEVBQUUsQ0FBQztFQUFFbUYsTUFBTSxFQUFFO0FBQUMsQ0FBQztBQUM1RCxJQUFNQyxTQUFTLEdBQUc7RUFBQ0wsR0FBRztFQUFFRSxLQUFLO0VBQUVDO0FBQVUsQ0FBQztBQUMxQyxJQUFNRyxnQkFBZ0IsR0FBRztFQUNyQkMsTUFBTSxFQUFFO0lBQUNQLEdBQUc7SUFBRUU7RUFBSyxDQUFDO0VBQ3BCTSxLQUFLLEVBQUVILFNBQVM7RUFDaEJJLEtBQUssRUFBRUo7QUFDWCxDQUFDO0FBQ0QsSUFBTUssZ0JBQWdCLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQztBQUV4RCxJQUFNQyxjQUFjLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDOztBQUVqQztBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQU1DLFlBQVksR0FBRyxTQUFmQSxZQUFZQSxDQUFHM0ksS0FBSztFQUFBLE9BQUlBLEtBQUssQ0FBQ29ILFVBQVUsQ0FBQyxHQUFHLENBQUM7QUFBQTs7QUFFbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVN3QixlQUFlQSxDQUFDNUksS0FBSyxFQUFFO0VBQzVCLE9BQU9uVCxpREFBRyxDQUNOLFVBQUErRSxHQUFHO0lBQUEsT0FBS2hPLEtBQUssQ0FBQ0ssT0FBTyxDQUFDMk4sR0FBRyxDQUFDLElBQUl3VyxTQUFTLENBQUN4VyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBS0EsR0FBRztFQUFBLEdBQ3ZEL0ksSUFBSSxDQUFDb0ksS0FBSyxDQUFDK08sS0FBSyxDQUNwQixDQUFDO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzZJLG9CQUFvQkEsQ0FBQ0MsZUFBZSxFQUFFO0VBQzNDLE9BQU9BLGVBQWUsQ0FBQ2hTLE1BQU0sQ0FBQyxDQUFDLEVBQUVnUyxlQUFlLENBQUNwb0IsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDcU4sS0FBSyxDQUFDLEtBQUssQ0FBQztBQUM3RTtBQUVPLFNBQVNnYixjQUFjQSxDQUFDakIsU0FBUyxFQUFFO0VBQ3RDO0VBQ0E7RUFDQSxJQUFNa0IsTUFBTSxHQUFHbEIsU0FBUyxDQUFDNUUsV0FBVyxDQUFDLEdBQUcsQ0FBQztFQUN6QyxJQUFNbEQsS0FBSyxHQUFHOEgsU0FBUyxDQUFDaFIsTUFBTSxDQUFDLENBQUMsRUFBRWtTLE1BQU0sQ0FBQztFQUN6QyxPQUFPO0lBQ0h6WSxFQUFFLEVBQUUwWSxlQUFlLENBQUNqSixLQUFLLENBQUM7SUFDMUJoRSxRQUFRLEVBQUU4TCxTQUFTLENBQUNoUixNQUFNLENBQUNrUyxNQUFNLEdBQUcsQ0FBQztFQUN6QyxDQUFDO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ08sU0FBU0MsZUFBZUEsQ0FBQ2pKLEtBQUssRUFBRTtFQUNuQyxPQUFPMkksWUFBWSxDQUFDM0ksS0FBSyxDQUFDLEdBQUc0SSxlQUFlLENBQUM1SSxLQUFLLENBQUMsR0FBR0EsS0FBSztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDTyxTQUFTbFEsV0FBV0EsQ0FBQ1MsRUFBRSxFQUFFO0VBQzVCLElBQUksT0FBT0EsRUFBRSxLQUFLLFFBQVEsRUFBRTtJQUN4QixPQUFPQSxFQUFFO0VBQ2I7RUFDQSxJQUFNMlksWUFBWSxHQUFHLFNBQWZBLFlBQVlBLENBQUc3cUIsQ0FBQztJQUFBLE9BQUtBLENBQUMsSUFBSUEsQ0FBQyxDQUFDMnBCLElBQUksSUFBS25mLElBQUksQ0FBQ0MsU0FBUyxDQUFDekssQ0FBQyxDQUFDO0VBQUE7RUFDNUQsSUFBTThxQixLQUFLLEdBQUdwdEIsTUFBTSxDQUFDc0YsSUFBSSxDQUFDa1AsRUFBRSxDQUFDLENBQ3hCNlksSUFBSSxDQUFDLENBQUMsQ0FDTnZjLEdBQUcsQ0FBQyxVQUFBbUcsQ0FBQztJQUFBLE9BQUluSyxJQUFJLENBQUNDLFNBQVMsQ0FBQ2tLLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBR2tXLFlBQVksQ0FBQzNZLEVBQUUsQ0FBQ3lDLENBQUMsQ0FBQyxDQUFDO0VBQUEsRUFBQztFQUM1RCxPQUFPLEdBQUcsR0FBR21XLEtBQUssQ0FBQ2pOLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTbU4sU0FBU0EsQ0FBQzdzQixDQUFDLEVBQUU4Z0IsQ0FBQyxFQUFFO0VBQ3JCLElBQU1nTSxVQUFVLEdBQUd4QyxxREFBUyxDQUFDeEosQ0FBQyxDQUFDO0VBQy9CLElBQUl3SixxREFBUyxDQUFDdHFCLENBQUMsQ0FBQyxFQUFFO0lBQ2QsSUFBSThzQixVQUFVLEVBQUU7TUFDWixJQUFNQyxFQUFFLEdBQUd0UixNQUFNLENBQUN6YixDQUFDLENBQUM7TUFDcEIsSUFBTWd0QixFQUFFLEdBQUd2UixNQUFNLENBQUNxRixDQUFDLENBQUM7TUFDcEIsT0FBT2lNLEVBQUUsR0FBR0MsRUFBRSxHQUFHLENBQUMsR0FBR0QsRUFBRSxHQUFHQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUN6QztJQUNBLE9BQU8sQ0FBQyxDQUFDO0VBQ2I7RUFDQSxJQUFJRixVQUFVLEVBQUU7SUFDWixPQUFPLENBQUM7RUFDWjtFQUNBLElBQU1HLE9BQU8sR0FBRyxPQUFPanRCLENBQUMsS0FBSyxTQUFTO0VBQ3RDLElBQUlpdEIsT0FBTyxNQUFNLE9BQU9uTSxDQUFDLEtBQUssU0FBUyxDQUFDLEVBQUU7SUFDdEMsT0FBT21NLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO0VBQzNCO0VBQ0EsT0FBT2p0QixDQUFDLEdBQUc4Z0IsQ0FBQyxHQUFHLENBQUMsR0FBRzlnQixDQUFDLEdBQUc4Z0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDckM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBTW9NLFNBQVMsR0FBRyxTQUFaQSxTQUFTQSxDQUFHcnJCLENBQUM7RUFBQSxPQUFLeW9CLHFEQUFTLENBQUN6b0IsQ0FBQyxDQUFDLEdBQUdBLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUFBLENBQUM7QUFDakQsSUFBTXNyQixRQUFRLEdBQUcsU0FBWEEsUUFBUUEsQ0FBR3RyQixDQUFDO0VBQUEsT0FBSyxPQUFPQSxDQUFDLEtBQUssUUFBUSxHQUFHQSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUc7QUFBQSxDQUFDO0FBRTdELFNBQVN1ckIsTUFBTUEsQ0FBQ0MsTUFBTSxFQUFFdFosRUFBRSxFQUFFdVosSUFBSSxFQUFFQyxVQUFVLEVBQUU7RUFDMUMsSUFBTUMsS0FBSyxHQUFJSCxNQUFNLENBQUN0WixFQUFFLENBQUMsR0FBR3NaLE1BQU0sQ0FBQ3RaLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBRTtFQUM3QyxJQUFNMFosU0FBUyxHQUFJRCxLQUFLLENBQUNGLElBQUksQ0FBQyxHQUFHRSxLQUFLLENBQUNGLElBQUksQ0FBQyxJQUFJLEVBQUc7RUFDbkRHLFNBQVMsQ0FBQzVwQixJQUFJLENBQUMwcEIsVUFBVSxDQUFDO0FBQzlCO0FBRUEsU0FBU0csVUFBVUEsQ0FBQ0wsTUFBTSxFQUFFTSxNQUFNLEVBQUVMLElBQUksRUFBRUMsVUFBVSxFQUFFO0VBQ2xELElBQU0xb0IsSUFBSSxHQUFHdEYsTUFBTSxDQUFDc0YsSUFBSSxDQUFDOG9CLE1BQU0sQ0FBQyxDQUFDZixJQUFJLENBQUMsQ0FBQztFQUN2QyxJQUFNZ0IsTUFBTSxHQUFHL29CLElBQUksQ0FBQzZhLElBQUksQ0FBQyxHQUFHLENBQUM7RUFDN0IsSUFBTTVkLE1BQU0sR0FBRzBILGlEQUFLLENBQUMzRSxJQUFJLEVBQUU4b0IsTUFBTSxDQUFDO0VBQ2xDLElBQU1FLFlBQVksR0FBSVIsTUFBTSxDQUFDTyxNQUFNLENBQUMsR0FBR1AsTUFBTSxDQUFDTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUU7RUFDNUQsSUFBTUUsYUFBYSxHQUFJRCxZQUFZLENBQUNQLElBQUksQ0FBQyxHQUFHTyxZQUFZLENBQUNQLElBQUksQ0FBQyxJQUFJLEVBQUc7RUFDckUsSUFBSVMsUUFBUSxHQUFHLEtBQUs7RUFDcEIsS0FBSyxJQUFJanVCLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR2d1QixhQUFhLENBQUM1cEIsTUFBTSxFQUFFcEUsQ0FBQyxFQUFFLEVBQUU7SUFDM0MsSUFBSXVTLGlEQUFNLENBQUN2USxNQUFNLEVBQUVnc0IsYUFBYSxDQUFDaHVCLENBQUMsQ0FBQyxDQUFDZ0MsTUFBTSxDQUFDLEVBQUU7TUFDekNpc0IsUUFBUSxHQUFHRCxhQUFhLENBQUNodUIsQ0FBQyxDQUFDO01BQzNCO0lBQ0o7RUFDSjtFQUNBLElBQUksQ0FBQ2l1QixRQUFRLEVBQUU7SUFDWEEsUUFBUSxHQUFHO01BQUNscEIsSUFBSTtNQUFFL0MsTUFBTTtNQUFFMnJCLFNBQVMsRUFBRTtJQUFFLENBQUM7SUFDeENLLGFBQWEsQ0FBQ2pxQixJQUFJLENBQUNrcUIsUUFBUSxDQUFDO0VBQ2hDO0VBQ0FBLFFBQVEsQ0FBQ04sU0FBUyxDQUFDNXBCLElBQUksQ0FBQzBwQixVQUFVLENBQUM7QUFDdkM7QUFFQSxTQUFTUyxvQkFBb0JBLENBQUNDLGtCQUFrQixFQUFFM2xCLGFBQWEsRUFBRTtFQUM3RCxJQUFNNGxCLE9BQU8sR0FBRyxDQUFDLENBQUM7RUFDbEIsSUFBTUMsT0FBTyxHQUFHLEVBQUU7RUFFbEJGLGtCQUFrQixDQUFDaHNCLE9BQU8sQ0FBQyxVQUFBbXNCLEdBQUcsRUFBSTtJQUM5QixJQUFPMWQsTUFBTSxHQUFxQzBkLEdBQUcsQ0FBOUMxZCxNQUFNO01BQUU2USxPQUFPLEdBQTRCNk0sR0FBRyxDQUF0QzdNLE9BQU87TUFBRWpVLEtBQUssR0FBcUI4Z0IsR0FBRyxDQUE3QjlnQixLQUFLO01BQUUwYSxlQUFlLEdBQUlvRyxHQUFHLENBQXRCcEcsZUFBZTtJQUM5QyxJQUFJcUcsVUFBVSxHQUFHLElBQUk7SUFDckIsSUFBSTlNLE9BQU8sQ0FBQ3JkLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQ3FkLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQ3hOLEVBQUUsSUFBSSxDQUFDd04sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDL0IsUUFBUSxFQUFFO01BQ2hFNk8sVUFBVSxHQUFHLEtBQUs7TUFDbEIsSUFBSSxDQUFDckcsZUFBZSxFQUFFO1FBQ2xCMWYsYUFBYSxDQUFDLCtCQUErQixFQUFFLENBQzNDLDZDQUE2QyxFQUM3QytELElBQUksQ0FBQ0MsU0FBUyxDQUFDOGhCLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQy9CLENBQUM7TUFDTjtJQUNKO0lBRUEsSUFBTUUsSUFBSSxHQUNOLG9DQUFvQyxHQUNwQy9NLE9BQU8sQ0FBQ2xSLEdBQUcsQ0FBQ3lhLDhEQUFnQixDQUFDLENBQUNwTCxJQUFJLENBQUMsTUFBTSxDQUFDO0lBRTlDLElBQUksQ0FBQ2hQLE1BQU0sQ0FBQ3hNLE1BQU0sRUFBRTtNQUNoQm9FLGFBQWEsQ0FBQyw4QkFBOEIsRUFBRSxDQUMxQ2dtQixJQUFJLEVBQ0osZ0NBQWdDLEVBQ2hDLHFEQUFxRCxFQUNyRCxFQUFFLEVBQ0Ysa0RBQWtELEVBQ2xELHFEQUFxRCxDQUN4RCxDQUFDO0lBQ047SUFFQSxJQUFNblAsSUFBSSxHQUFHLENBQ1QsQ0FBQ29DLE9BQU8sRUFBRSxRQUFRLENBQUMsRUFDbkIsQ0FBQzdRLE1BQU0sRUFBRSxPQUFPLENBQUMsRUFDakIsQ0FBQ3BELEtBQUssRUFBRSxPQUFPLENBQUMsQ0FDbkI7SUFDRDZSLElBQUksQ0FBQ2xkLE9BQU8sQ0FBQyxVQUFBd04sSUFBQSxFQUFpQjtNQUFBLElBQUEyVSxLQUFBLEdBQUF6ZCxjQUFBLENBQUE4SSxJQUFBO1FBQWZuSixJQUFJLEdBQUE4ZCxLQUFBO1FBQUVtSyxHQUFHLEdBQUFuSyxLQUFBO01BQ3BCLElBQUltSyxHQUFHLEtBQUssUUFBUSxJQUFJLENBQUNGLFVBQVUsRUFBRTtRQUNqQztRQUNBO1FBQ0E7UUFDQTtNQUNKO01BRUEsSUFBSSxDQUFDam5CLEtBQUssQ0FBQ0ssT0FBTyxDQUFDbkIsSUFBSSxDQUFDLEVBQUU7UUFDdEJnQyxhQUFhLGFBQUFpRCxNQUFBLENBQWFnakIsR0FBRywyQkFBd0IsQ0FDakRELElBQUksU0FBQS9pQixNQUFBLENBQ0dnakIsR0FBRyxvQkFDVmxpQixJQUFJLENBQUNDLFNBQVMsQ0FBQ2hHLElBQUksQ0FBQyxFQUNwQiwyQkFBMkIsQ0FDOUIsQ0FBQztNQUNOO01BQ0FBLElBQUksQ0FBQ3JFLE9BQU8sQ0FBQyxVQUFDdXNCLE1BQU0sRUFBRTF1QixDQUFDLEVBQUs7UUFDeEIydUIsV0FBVyxDQUFDRCxNQUFNLEVBQUVGLElBQUksRUFBRUMsR0FBRyxFQUFFenVCLENBQUMsRUFBRXdJLGFBQWEsRUFBRTBmLGVBQWUsQ0FBQztNQUNyRSxDQUFDLENBQUM7SUFDTixDQUFDLENBQUM7SUFFRjBHLG9CQUFvQixDQUFDbk4sT0FBTyxFQUFFK00sSUFBSSxFQUFFaG1CLGFBQWEsRUFBRTRsQixPQUFPLEVBQUVDLE9BQU8sQ0FBQztJQUNwRSxJQUFJLENBQUNuRyxlQUFlLEVBQUU7TUFDbEIyRyx1QkFBdUIsQ0FBQ3BOLE9BQU8sRUFBRTdRLE1BQU0sRUFBRXBELEtBQUssRUFBRWdoQixJQUFJLEVBQUVobUIsYUFBYSxDQUFDO0lBQ3hFO0VBQ0osQ0FBQyxDQUFDO0FBQ047QUFFQSxTQUFTbW1CLFdBQVdBLENBQUFwSyxLQUFBLEVBQWlCaUssSUFBSSxFQUFFQyxHQUFHLEVBQUV6dUIsQ0FBQyxFQUFFd0ksYUFBYSxFQUFFMGYsZUFBZSxFQUFFO0VBQUEsSUFBN0RqVSxFQUFFLEdBQUFzUSxLQUFBLENBQUZ0USxFQUFFO0lBQUV5TCxRQUFRLEdBQUE2RSxLQUFBLENBQVI3RSxRQUFRO0VBQzlCLElBQUksT0FBT0EsUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDQSxRQUFRLEVBQUU7SUFDM0NsWCxhQUFhLENBQUMseUJBQXlCLEVBQUUsQ0FDckNnbUIsSUFBSSxLQUFBL2lCLE1BQUEsQ0FDRGdqQixHQUFHLE9BQUFoakIsTUFBQSxDQUFJekwsQ0FBQyxtQkFBQXlMLE1BQUEsQ0FBZ0JjLElBQUksQ0FBQ0MsU0FBUyxDQUFDa1QsUUFBUSxDQUFDLEdBQ25ELHNEQUFzRCxDQUN6RCxDQUFDO0VBQ047RUFFQSxJQUFJLE9BQU96TCxFQUFFLEtBQUssUUFBUSxFQUFFO0lBQ3hCLElBQUlsTSxpREFBTyxDQUFDa00sRUFBRSxDQUFDLElBQUksQ0FBQ2lVLGVBQWUsRUFBRTtNQUNqQzFmLGFBQWEsQ0FBQywwQkFBMEIsRUFBRSxDQUN0Q2dtQixJQUFJLEtBQUEvaUIsTUFBQSxDQUNEZ2pCLEdBQUcsT0FBQWhqQixNQUFBLENBQUl6TCxDQUFDLGdCQUNYLDZDQUE2QyxDQUNoRCxDQUFDO0lBQ047SUFFQTZxQixrREFBaUIsQ0FBQyxVQUFDOW9CLENBQUMsRUFBRTJVLENBQUMsRUFBSztNQUN4QixJQUFJLENBQUNBLENBQUMsRUFBRTtRQUNKbE8sYUFBYSxDQUFDLDRCQUE0QixFQUFFLENBQ3hDZ21CLElBQUksS0FBQS9pQixNQUFBLENBQ0RnakIsR0FBRyxPQUFBaGpCLE1BQUEsQ0FBSXpMLENBQUMscUJBQUF5TCxNQUFBLENBQWlCaUwsQ0FBQyxTQUM3QixpQ0FBaUMsQ0FDcEMsQ0FBQztNQUNOO01BRUEsSUFBSSxPQUFPM1UsQ0FBQyxLQUFLLFFBQVEsSUFBSUEsQ0FBQyxDQUFDMnBCLElBQUksRUFBRTtRQUNqQyxJQUFJSyxnQkFBZ0IsQ0FBQzBDLEdBQUcsQ0FBQyxDQUFDMXNCLENBQUMsQ0FBQzJwQixJQUFJLENBQUMsS0FBSzNwQixDQUFDLEVBQUU7VUFDckN5RyxhQUFhLENBQUMsNEJBQTRCLEVBQUUsQ0FDeENnbUIsSUFBSSxLQUFBL2lCLE1BQUEsQ0FDRGdqQixHQUFHLE9BQUFoakIsTUFBQSxDQUFJekwsQ0FBQyxhQUFBeUwsTUFBQSxDQUFTaUwsQ0FBQyxZQUFBakwsTUFBQSxDQUFRMUosQ0FBQyxDQUFDMnBCLElBQUksNEJBQUFqZ0IsTUFBQSxDQUNWZ2pCLEdBQUcsYUFDNUIxcEIsa0RBQUksQ0FBQ2duQixnQkFBZ0IsQ0FBQzBDLEdBQUcsQ0FBQyxDQUFDLENBQUM3TyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ3pDLENBQUM7UUFDTjtNQUNKLENBQUMsTUFBTSxJQUFJLENBQUM5WCxrREFBUSxDQUFDLE9BQU8vRixDQUFDLEVBQUVvcUIsZ0JBQWdCLENBQUMsRUFBRTtRQUM5QzNqQixhQUFhLENBQUMsNEJBQTRCLEVBQUUsQ0FDeENnbUIsSUFBSSxLQUFBL2lCLE1BQUEsQ0FDRGdqQixHQUFHLE9BQUFoakIsTUFBQSxDQUFJekwsQ0FBQyxhQUFBeUwsTUFBQSxDQUFTaUwsQ0FBQyxZQUFBakwsTUFBQSxDQUFRYyxJQUFJLENBQUNDLFNBQVMsQ0FBQ3pLLENBQUMsQ0FBQyxHQUM5QyxzREFBc0QsRUFDdEQscUNBQXFDLEVBQ3JDb3FCLGdCQUFnQixDQUFDdk0sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUM5QixDQUFDO01BQ047SUFDSixDQUFDLEVBQUUzTCxFQUFFLENBQUM7RUFDVixDQUFDLE1BQU0sSUFBSSxPQUFPQSxFQUFFLEtBQUssUUFBUSxFQUFFO0lBQy9CLElBQUksQ0FBQ0EsRUFBRSxJQUFJLENBQUNpVSxlQUFlLEVBQUU7TUFDekIxZixhQUFhLENBQUMsMEJBQTBCLEVBQUUsQ0FDdENnbUIsSUFBSSxLQUFBL2lCLE1BQUEsQ0FDRGdqQixHQUFHLE9BQUFoakIsTUFBQSxDQUFJekwsQ0FBQyxlQUFBeUwsTUFBQSxDQUFXd0ksRUFBRSxTQUN4Qiw2Q0FBNkMsQ0FDaEQsQ0FBQztJQUNOO0lBQ0EsSUFBTTZhLFlBQVksR0FBRzFDLGNBQWMsQ0FBQzliLE1BQU0sQ0FBQyxVQUFBbFEsQ0FBQztNQUFBLE9BQUkwSCxrREFBUSxDQUFDMUgsQ0FBQyxFQUFFNlQsRUFBRSxDQUFDO0lBQUEsRUFBQztJQUNoRSxJQUFJNmEsWUFBWSxDQUFDMXFCLE1BQU0sRUFBRTtNQUNyQm9FLGFBQWEsQ0FBQyw0QkFBNEIsRUFBRSxDQUN4Q2dtQixJQUFJLEtBQUEvaUIsTUFBQSxDQUNEZ2pCLEdBQUcsT0FBQWhqQixNQUFBLENBQUl6TCxDQUFDLGNBQUF5TCxNQUFBLENBQVd3SSxFQUFFLHVCQUFBeEksTUFBQSxDQUNUcWpCLFlBQVksQ0FBQ2xQLElBQUksQ0FBQyxNQUFNLENBQUMsd0JBQzNDLENBQUM7SUFDTjtFQUNKLENBQUMsTUFBTTtJQUNIcFgsYUFBYSxDQUFDLHdCQUF3QixFQUFFLENBQ3BDZ21CLElBQUksS0FBQS9pQixNQUFBLENBQ0RnakIsR0FBRyxPQUFBaGpCLE1BQUEsQ0FBSXpMLENBQUMsYUFBQXlMLE1BQUEsQ0FBVWMsSUFBSSxDQUFDQyxTQUFTLENBQUN5SCxFQUFFLENBQUMsR0FDdkMscURBQXFELENBQ3hELENBQUM7RUFDTjtBQUNKO0FBRUEsU0FBUzJhLG9CQUFvQkEsQ0FBQ25OLE9BQU8sRUFBRStNLElBQUksRUFBRWhtQixhQUFhLEVBQUU0bEIsT0FBTyxFQUFFQyxPQUFPLEVBQUU7RUFDMUUsSUFBTVUsYUFBYSxHQUFHLENBQUMsQ0FBQztFQUN4QixJQUFNQyxhQUFhLEdBQUcsRUFBRTtFQUN4QnZOLE9BQU8sQ0FBQ3RmLE9BQU8sQ0FBQyxVQUFBb2pCLEtBQUEsRUFBaUJ2bEIsQ0FBQyxFQUFLO0lBQUEsSUFBckJpVSxFQUFFLEdBQUFzUixLQUFBLENBQUZ0UixFQUFFO01BQUV5TCxRQUFRLEdBQUE2RixLQUFBLENBQVI3RixRQUFRO0lBQzFCLElBQUksT0FBT3pMLEVBQUUsS0FBSyxRQUFRLEVBQUU7TUFDeEIsSUFBTXlhLE1BQU0sR0FBRzFELGtFQUFnQixDQUFDO1FBQUMvVyxFQUFFO1FBQUV5TDtNQUFRLENBQUMsQ0FBQztNQUMvQyxJQUFJcVAsYUFBYSxDQUFDTCxNQUFNLENBQUMsRUFBRTtRQUN2QmxtQixhQUFhLENBQUMsNEJBQTRCLEVBQUUsQ0FDeENnbUIsSUFBSSxZQUFBL2lCLE1BQUEsQ0FDTXpMLENBQUMsUUFBQXlMLE1BQUEsQ0FBS2lqQixNQUFNLHlDQUN6QixDQUFDO01BQ04sQ0FBQyxNQUFNLElBQUlOLE9BQU8sQ0FBQ00sTUFBTSxDQUFDLEVBQUU7UUFDeEJsbUIsYUFBYSxDQUFDLDRCQUE0QixFQUFFLENBQ3hDZ21CLElBQUksWUFBQS9pQixNQUFBLENBQ016TCxDQUFDLFFBQUF5TCxNQUFBLENBQUtpakIsTUFBTSwyQkFDdEIsZ0RBQWdELEVBQ2hELGdEQUFnRCxFQUNoRCxtREFBbUQsRUFDbkQsZ0RBQWdELENBQ25ELENBQUM7TUFDTixDQUFDLE1BQU07UUFDSEssYUFBYSxDQUFDTCxNQUFNLENBQUMsR0FBRyxDQUFDO01BQzdCO0lBQ0osQ0FBQyxNQUFNO01BQ0gsSUFBTU8sS0FBSyxHQUFHO1FBQUNoYixFQUFFO1FBQUV5TDtNQUFRLENBQUM7TUFDNUIsSUFBTXdQLFdBQVcsR0FBR0MsZUFBZSxDQUFDRixLQUFLLEVBQUVELGFBQWEsQ0FBQztNQUN6RCxJQUFNSSxZQUFZLEdBQUdGLFdBQVcsSUFBSUMsZUFBZSxDQUFDRixLQUFLLEVBQUVaLE9BQU8sQ0FBQztNQUNuRSxJQUFJYSxXQUFXLElBQUlFLFlBQVksRUFBRTtRQUM3QixJQUFNVixPQUFNLEdBQUcxRCxrRUFBZ0IsQ0FBQ2lFLEtBQUssQ0FBQztRQUN0QyxJQUFNSSxPQUFPLEdBQUdyRSxrRUFBZ0IsQ0FBQ2tFLFdBQVcsSUFBSUUsWUFBWSxDQUFDO1FBQzdENW1CLGFBQWEsQ0FBQyx1Q0FBdUMsRUFBRSxDQUNuRGdtQixJQUFJLFlBQUEvaUIsTUFBQSxDQUNNekwsQ0FBQyxRQUFBeUwsTUFBQSxDQUFLaWpCLE9BQU0sb0NBQUFqakIsTUFBQSxDQUNNNGpCLE9BQU8sbUJBQUE1akIsTUFBQSxDQUN4QnlqQixXQUFXLEdBQUcsTUFBTSxHQUFHLGFBQWEsZ0JBQ2xELENBQUM7TUFDTixDQUFDLE1BQU07UUFDSEYsYUFBYSxDQUFDanJCLElBQUksQ0FBQ2tyQixLQUFLLENBQUM7TUFDN0I7SUFDSjtFQUNKLENBQUMsQ0FBQztFQUNGbHFCLGtEQUFJLENBQUNncUIsYUFBYSxDQUFDLENBQUM1c0IsT0FBTyxDQUFDLFVBQUF1VSxDQUFDLEVBQUk7SUFDN0IwWCxPQUFPLENBQUMxWCxDQUFDLENBQUMsR0FBRyxDQUFDO0VBQ2xCLENBQUMsQ0FBQztFQUNGc1ksYUFBYSxDQUFDN3NCLE9BQU8sQ0FBQyxVQUFBOHNCLEtBQUssRUFBSTtJQUMzQlosT0FBTyxDQUFDdHFCLElBQUksQ0FBQ2tyQixLQUFLLENBQUM7RUFDdkIsQ0FBQyxDQUFDO0FBQ047QUFFQSxTQUFTSyxpQkFBaUJBLENBQUNoSCxHQUFHLEVBQUUxWCxNQUFNLEVBQUU7RUFDcEMsSUFBVzJlLEtBQUssR0FBdUJqSCxHQUFHLENBQW5DclUsRUFBRTtJQUFtQnViLE9BQU8sR0FBSWxILEdBQUcsQ0FBeEI1SSxRQUFRO0VBQzFCLE9BQU85TyxNQUFNLENBQUM2ZSxJQUFJLENBQUMsVUFBQUMsR0FBRyxFQUFJO0lBQ3RCLElBQVdDLElBQUksR0FBc0JELEdBQUcsQ0FBakN6YixFQUFFO01BQWtCMmIsTUFBTSxHQUFJRixHQUFHLENBQXZCaFEsUUFBUTtJQUN6QixJQUFJOFAsT0FBTyxLQUFLSSxNQUFNLElBQUksT0FBT0wsS0FBSyxLQUFLLE9BQU9JLElBQUksRUFBRTtNQUNwRCxPQUFPLEtBQUs7SUFDaEI7SUFDQSxJQUFJLE9BQU9KLEtBQUssS0FBSyxRQUFRLEVBQUU7TUFDM0IsSUFBSUEsS0FBSyxLQUFLSSxJQUFJLEVBQUU7UUFDaEIsT0FBTyxJQUFJO01BQ2Y7SUFDSixDQUFDLE1BQU0sSUFBSVIsZUFBZSxDQUFDTyxHQUFHLEVBQUUsQ0FBQ3BILEdBQUcsQ0FBQyxDQUFDLEVBQUU7TUFDcEMsT0FBTyxJQUFJO0lBQ2Y7SUFDQSxPQUFPLEtBQUs7RUFDaEIsQ0FBQyxDQUFDO0FBQ047QUFFQSxTQUFTdUcsdUJBQXVCQSxDQUFDcE4sT0FBTyxFQUFFN1EsTUFBTSxFQUFFcEQsS0FBSyxFQUFFZ2hCLElBQUksRUFBRWhtQixhQUFhLEVBQUU7RUFDMUUsSUFBQXFuQixpQkFBQSxHQUFtQ0MsZ0JBQWdCLENBQUNyTyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUN4TixFQUFFLENBQUM7SUFBaEQ4YixhQUFhLEdBQUFGLGlCQUFBLENBQXhCRyxTQUFTO0VBQ2hCdk8sT0FBTyxDQUFDdGYsT0FBTyxDQUFDLFVBQUNtbUIsR0FBRyxFQUFFdG9CLENBQUMsRUFBSztJQUN4QixJQUFJQSxDQUFDLElBQUksQ0FBQ3VTLGlEQUFNLENBQUN1ZCxnQkFBZ0IsQ0FBQ3hILEdBQUcsQ0FBQ3JVLEVBQUUsQ0FBQyxDQUFDK2IsU0FBUyxFQUFFRCxhQUFhLENBQUMsRUFBRTtNQUNqRXZuQixhQUFhLENBQUMsK0NBQStDLEVBQUUsQ0FDM0RnbUIsSUFBSSxZQUFBL2lCLE1BQUEsQ0FDTXpMLENBQUMsUUFBQXlMLE1BQUEsQ0FBS3VmLGtFQUFnQixDQUFDMUMsR0FBRyxDQUFDLFFBQ3JDLG1EQUFtRCxlQUFBN2MsTUFBQSxDQUN0Q3VmLGtFQUFnQixDQUFDdkosT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQ3pDLDJEQUEyRCxFQUMzRCwyQ0FBMkMsQ0FDOUMsQ0FBQztJQUNOO0VBQ0osQ0FBQyxDQUFDO0VBQ0YsQ0FDSSxDQUFDN1EsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUNqQixDQUFDcEQsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUNuQixDQUFDckwsT0FBTyxDQUFDLFVBQUFxakIsS0FBQSxFQUFpQjtJQUFBLElBQUFDLEtBQUEsR0FBQTVlLGNBQUEsQ0FBQTJlLEtBQUE7TUFBZmhmLElBQUksR0FBQWlmLEtBQUE7TUFBRWdKLEdBQUcsR0FBQWhKLEtBQUE7SUFDakJqZixJQUFJLENBQUNyRSxPQUFPLENBQUMsVUFBQ2hCLEdBQUcsRUFBRW5CLENBQUMsRUFBSztNQUNyQixJQUFBaXdCLGtCQUFBLEdBQW9DSCxnQkFBZ0IsQ0FBQzN1QixHQUFHLENBQUM4UyxFQUFFLENBQUM7UUFBckQrYixTQUFTLEdBQUFDLGtCQUFBLENBQVRELFNBQVM7UUFBRUUsY0FBYyxHQUFBRCxrQkFBQSxDQUFkQyxjQUFjO01BQ2hDLElBQU1DLGVBQWUsR0FBR0gsU0FBUyxDQUFDdmtCLE1BQU0sQ0FBQ3lrQixjQUFjLENBQUM7TUFDeEQsSUFBTUUsSUFBSSxHQUFHekYsa0RBQVUsQ0FBQ3dGLGVBQWUsRUFBRUosYUFBYSxDQUFDO01BQ3ZELElBQUlLLElBQUksQ0FBQ2hzQixNQUFNLEVBQUU7UUFDYmdzQixJQUFJLENBQUN0RCxJQUFJLENBQUMsQ0FBQztRQUNYdGtCLGFBQWEsQ0FBQyw4Q0FBOEMsRUFBRSxDQUMxRGdtQixJQUFJLEtBQUEvaUIsTUFBQSxDQUNEZ2pCLEdBQUcsT0FBQWhqQixNQUFBLENBQUl6TCxDQUFDLFFBQUF5TCxNQUFBLENBQUt1ZixrRUFBZ0IsQ0FBQzdwQixHQUFHLENBQUMsNkNBQUFzSyxNQUFBLENBQ0Eya0IsSUFBSSxDQUFDeFEsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBQW5VLE1BQUEsQ0FDakN1ZixrRUFBZ0IsQ0FBQ3ZKLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUMvQyx5REFBeUQsRUFDekQsMkRBQTJELEVBQzNELDhCQUE4QixDQUNqQyxDQUFDO01BQ047SUFDSixDQUFDLENBQUM7RUFDTixDQUFDLENBQUM7QUFDTjtBQUVBLElBQU00TyxhQUFhLEdBQUcsU0FBaEJBLGFBQWFBLENBQUEzSyxLQUFBLEVBQWU7RUFBQSxJQUFBbUMsS0FBQSxHQUFBaGhCLGNBQUEsQ0FBQTZlLEtBQUE7SUFBVnhsQixDQUFDLEdBQUEybkIsS0FBQTtJQUFFN0csQ0FBQyxHQUFBNkcsS0FBQTtFQUN4QixJQUFNeUksS0FBSyxHQUFHcHdCLENBQUMsSUFBSUEsQ0FBQyxDQUFDd3JCLElBQUk7RUFDekIsSUFBTTZFLEtBQUssR0FBR3ZQLENBQUMsSUFBSUEsQ0FBQyxDQUFDMEssSUFBSTtFQUN6QixJQUFJNEUsS0FBSyxJQUFJQyxLQUFLLEVBQUU7SUFDaEI7SUFDQSxPQUFPLEVBQ0Zyd0IsQ0FBQyxLQUFLeXJCLEtBQUssSUFBSTNLLENBQUMsS0FBSzRLLFVBQVUsSUFDL0IxckIsQ0FBQyxLQUFLMHJCLFVBQVUsSUFBSTVLLENBQUMsS0FBSzJLLEtBQU0sQ0FDcEM7RUFDTDtFQUNBLE9BQU96ckIsQ0FBQyxLQUFLOGdCLENBQUMsSUFBSXNQLEtBQUssSUFBSUMsS0FBSztBQUNwQyxDQUFDO0FBRUQsU0FBU3BCLGVBQWVBLENBQUF4RyxLQUFBLEVBQWlCL0gsSUFBSSxFQUFFO0VBQUEsSUFBckIzTSxFQUFFLEdBQUEwVSxLQUFBLENBQUYxVSxFQUFFO0lBQUV5TCxRQUFRLEdBQUFpSixLQUFBLENBQVJqSixRQUFRO0VBQ2xDLElBQU04USxNQUFNLEdBQUd6ckIsa0RBQUksQ0FBQ2tQLEVBQUUsQ0FBQyxDQUFDNlksSUFBSSxDQUFDLENBQUM7RUFDOUIsSUFBTTJELE1BQU0sR0FBRy9tQixpREFBSyxDQUFDOG1CLE1BQU0sRUFBRXZjLEVBQUUsQ0FBQztFQUFDLElBQUF5YyxTQUFBLEdBQUFDLDBCQUFBLENBQ2YvUCxJQUFJO0lBQUFnUSxLQUFBO0VBQUE7SUFBdEIsS0FBQUYsU0FBQSxDQUFBbHZCLENBQUEsTUFBQW92QixLQUFBLEdBQUFGLFNBQUEsQ0FBQS93QixDQUFBLElBQUFpRCxJQUFBLEdBQXdCO01BQUEsSUFBYjBSLEdBQUcsR0FBQXNjLEtBQUEsQ0FBQTd3QixLQUFBO01BQ1YsSUFBVzh3QixHQUFHLEdBQXlCdmMsR0FBRyxDQUFuQ0wsRUFBRTtRQUFpQjZjLFNBQVMsR0FBSXhjLEdBQUcsQ0FBMUJvTCxRQUFRO01BQ3hCLElBQ0lvUixTQUFTLEtBQUtwUixRQUFRLElBQ3RCLE9BQU9tUixHQUFHLEtBQUssUUFBUSxJQUN2QnRlLGlEQUFNLENBQUN4TixrREFBSSxDQUFDOHJCLEdBQUcsQ0FBQyxDQUFDL0QsSUFBSSxDQUFDLENBQUMsRUFBRTBELE1BQU0sQ0FBQyxJQUNoQy9GLGtEQUFHLENBQUM0RixhQUFhLEVBQUVqVSxrREFBRyxDQUFDcVUsTUFBTSxFQUFFL21CLGlEQUFLLENBQUM4bUIsTUFBTSxFQUFFSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQ3JEO1FBQ0UsT0FBT3ZjLEdBQUc7TUFDZDtJQUNKO0VBQUMsU0FBQTNOLEdBQUE7SUFBQStwQixTQUFBLENBQUFweEIsQ0FBQSxDQUFBcUgsR0FBQTtFQUFBO0lBQUErcEIsU0FBQSxDQUFBbnZCLENBQUE7RUFBQTtFQUNELE9BQU8sS0FBSztBQUNoQjtBQUVPLFNBQVN3dkIseUJBQXlCQSxDQUFDQyxNQUFNLEVBQUV4b0IsYUFBYSxFQUFFO0VBQzdELElBQU9vQixNQUFNLEdBQTRDb25CLE1BQU0sQ0FBeERwbkIsTUFBTTtJQUFFa0IsTUFBTSxHQUFvQ2ttQixNQUFNLENBQWhEbG1CLE1BQU07SUFBVW1tQixPQUFPLEdBQW1CRCxNQUFNLENBQXhDam5CLE1BQU07SUFBa0JtbkIsTUFBTSxHQUFJRixNQUFNLENBQXZCN1IsS0FBSztFQUM3QyxJQUFNZ1MsV0FBVyxHQUFHLENBQUN2bkIsTUFBTSxDQUFDd25CLDRCQUE0QjtFQUN4RCxJQUFJcm5CLE1BQU0sRUFBRW9WLEtBQUs7RUFDakIsSUFBSWdTLFdBQVcsSUFBSXZuQixNQUFNLENBQUN5bkIsaUJBQWlCLEVBQUU7SUFDekN0bkIsTUFBTSxHQUFHSCxNQUFNLENBQUN5bkIsaUJBQWlCO0lBQ2pDbFMsS0FBSyxHQUFHclcsb0RBQVksQ0FBQ2lCLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFbW5CLE1BQU0sQ0FBQzdtQixNQUFNLENBQUM7RUFDekQsQ0FBQyxNQUFNO0lBQ0hOLE1BQU0sR0FBR2tuQixPQUFPO0lBQ2hCOVIsS0FBSyxHQUFHK1IsTUFBTTtFQUNsQjtFQUNBLElBQU9JLFNBQVMsR0FBNkN4bUIsTUFBTSxDQUE1RHdtQixTQUFTO0lBQUVDLFFBQVEsR0FBbUN6bUIsTUFBTSxDQUFqRHltQixRQUFRO0lBQUVDLGNBQWMsR0FBbUIxbUIsTUFBTSxDQUF2QzBtQixjQUFjO0lBQUVDLGFBQWEsR0FBSTNtQixNQUFNLENBQXZCMm1CLGFBQWE7RUFFekQsU0FBU0MsSUFBSUEsQ0FBQy9ELFNBQVMsRUFBRTtJQUNyQixPQUNJLHdEQUF3RCxHQUN4REEsU0FBUyxDQUNKcGQsR0FBRyxDQUFDLFVBQUEyUyxNQUFBO01BQUEsSUFBRXpCLE9BQU8sR0FBQXlCLE1BQUEsQ0FBUHpCLE9BQU87TUFBQSxPQUFNQSxPQUFPLENBQUNsUixHQUFHLENBQUN5YSw4REFBZ0IsQ0FBQyxDQUFDcEwsSUFBSSxDQUFDLElBQUksQ0FBQztJQUFBLEVBQUMsQ0FDNURBLElBQUksQ0FBQyxNQUFNLENBQUM7RUFFekI7RUFFQSxTQUFTK1IsU0FBU0EsQ0FBQzFkLEVBQUUsRUFBRXdhLEdBQUcsRUFBRWQsU0FBUyxFQUFFO0lBQ25DbmxCLGFBQWEsQ0FBQyx3QkFBd0IsRUFBRSxxQ0FBQWlELE1BQUEsQ0FDQWdqQixHQUFHLGlDQUFBaGpCLE1BQUEsQ0FDakMrSCxXQUFXLENBQUNTLEVBQUUsQ0FBQyxTQUNyQixxREFBcUQsRUFDckQsRUFBRSxFQUNGLHVEQUF1RCxFQUN2RCx3REFBd0QsRUFDeEQsNkRBQTZELEVBQzdELHNDQUFzQyxFQUN0Q3lkLElBQUksQ0FBQy9ELFNBQVMsQ0FBQyxDQUNsQixDQUFDO0VBQ047RUFFQSxTQUFTaUUsWUFBWUEsQ0FBQzNkLEVBQUUsRUFBRTRkLE1BQU0sRUFBRUMsT0FBTyxFQUFFckQsR0FBRyxFQUFFZCxTQUFTLEVBQUU7SUFDdkQsSUFBTUgsSUFBSSxHQUFHc0UsT0FBTyxDQUFDcmdCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsSUFBTXVELFNBQVMsR0FBR3hFLGtEQUFJLENBQUNxaEIsTUFBTSxFQUFFOW5CLE1BQU0sQ0FBQztJQUN0QyxJQUFNOEosT0FBTyxHQUFHNUIsaURBQVEsQ0FBQzFQLE9BQU8sQ0FBQ3lTLFNBQVMsQ0FBQzs7SUFFM0M7SUFDQSxJQUFJbkIsT0FBTyxJQUFJQSxPQUFPLENBQUM1RyxTQUFTLElBQUksQ0FBQzRHLE9BQU8sQ0FBQzVHLFNBQVMsQ0FBQ3VnQixJQUFJLENBQUMsRUFBRTtNQUMxRDtNQUNBLEtBQUssSUFBTTlJLFFBQVEsSUFBSTdRLE9BQU8sQ0FBQzVHLFNBQVMsRUFBRTtRQUN0QyxJQUFNOGtCLElBQUksR0FBR3JOLFFBQVEsQ0FBQ3RnQixNQUFNLEdBQUcsQ0FBQztRQUNoQyxJQUNJc2dCLFFBQVEsQ0FBQ3ZmLE1BQU0sQ0FBQzRzQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQzdCdkUsSUFBSSxDQUFDaFQsTUFBTSxDQUFDLENBQUMsRUFBRXVYLElBQUksQ0FBQyxLQUFLck4sUUFBUSxDQUFDbEssTUFBTSxDQUFDLENBQUMsRUFBRXVYLElBQUksQ0FBQyxFQUNuRDtVQUNFO1FBQ0o7TUFDSjtNQUNBLElBQU83d0IsSUFBSSxHQUFlOFQsU0FBUyxDQUE1QjlULElBQUk7UUFBRW9WLFNBQVMsR0FBSXRCLFNBQVMsQ0FBdEJzQixTQUFTO01BQ3RCOU4sYUFBYSxDQUFDLGlDQUFpQyxFQUFFLGVBQUFpRCxNQUFBLENBQ2hDK2hCLElBQUksMENBQUEvaEIsTUFBQSxDQUNaYyxJQUFJLENBQUNDLFNBQVMsQ0FBQ3lILEVBQUUsQ0FBQyxvQkFBQXhJLE1BQUEsQ0FDTmdqQixHQUFHLHdEQUFBaGpCLE1BQUEsQ0FDUTZLLFNBQVMsT0FBQTdLLE1BQUEsQ0FBSXZLLElBQUksaUJBQzdDLHNEQUFzRCxFQUN0RHd3QixJQUFJLENBQUMvRCxTQUFTLENBQUMsQ0FDbEIsQ0FBQztJQUNOO0VBQ0o7RUFFQSxTQUFTcUUscUJBQXFCQSxDQUFDL2QsRUFBRSxFQUFFeUwsUUFBUSxFQUFFK08sR0FBRyxFQUFFZCxTQUFTLEVBQUU7SUFDekRyQyw2REFBVyxDQUFDLENBQUMsQ0FBQ25NLEtBQUssQ0FBQyxDQUFDO01BQUNsTCxFQUFFO01BQUV5TDtJQUFRLENBQUMsQ0FBQyxDQUFDdmQsT0FBTyxDQUFDLFVBQUFtc0IsR0FBRyxFQUFJO01BQ2hELElBQVcyRCxVQUFVLEdBQWtCM0QsR0FBRyxDQUFuQ3JhLEVBQUU7UUFBb0I0ZCxNQUFNLEdBQUl2RCxHQUFHLENBQW5COWQsSUFBSTtNQUMzQm9oQixZQUFZLENBQUNLLFVBQVUsRUFBRUosTUFBTSxFQUFFblMsUUFBUSxFQUFFK08sR0FBRyxFQUFFZCxTQUFTLENBQUM7SUFDOUQsQ0FBQyxDQUFDO0VBQ047RUFFQSxJQUFNdUUsMEJBQTBCLEdBQUcsQ0FBQyxDQUFDO0VBRXJDLFNBQVNDLGFBQWFBLENBQUNuSyxRQUFRLEVBQUU7SUFDN0IsSUFBT3hhLEtBQUssR0FBWXdhLFFBQVEsQ0FBekJ4YSxLQUFLO01BQUUyVyxNQUFNLEdBQUk2RCxRQUFRLENBQWxCN0QsTUFBTTs7SUFFcEI7SUFDQSxJQUFJK04sMEJBQTBCLENBQUMvTixNQUFNLENBQUMsRUFBRTtNQUNwQztJQUNKO0lBQ0ErTiwwQkFBMEIsQ0FBQy9OLE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFFdEMsSUFBTXNLLEdBQUcsR0FBRyxPQUFPO0lBRW5CamhCLEtBQUssQ0FBQ3JMLE9BQU8sQ0FBQyxVQUFBZ2hCLE1BQUEsRUFBb0I7TUFBQSxJQUFsQmxQLEVBQUUsR0FBQWtQLE1BQUEsQ0FBRmxQLEVBQUU7UUFBRXlMLFFBQVEsR0FBQXlELE1BQUEsQ0FBUnpELFFBQVE7TUFDeEIsSUFBSSxPQUFPekwsRUFBRSxLQUFLLFFBQVEsRUFBRTtRQUN4QixJQUFNNGQsTUFBTSxHQUFHalYsK0NBQU8sQ0FBQ3VDLEtBQUssRUFBRWxMLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUM0ZCxNQUFNLEVBQUU7VUFDVCxJQUFJVixXQUFXLEVBQUU7WUFDYlEsU0FBUyxDQUFDMWQsRUFBRSxFQUFFd2EsR0FBRyxFQUFFLENBQUN6RyxRQUFRLENBQUMsQ0FBQztVQUNsQztRQUNKLENBQUMsTUFBTTtVQUNINEosWUFBWSxDQUFDM2QsRUFBRSxFQUFFNGQsTUFBTSxFQUFFblMsUUFBUSxFQUFFK08sR0FBRyxFQUFFLENBQUN6RyxRQUFRLENBQUMsQ0FBQztRQUN2RDtNQUNKO01BQ0E7TUFDQTtNQUFBLEtBQ0ssSUFBSSxDQUFDL0wsa0RBQVksQ0FBQyxDQUFDMFAsS0FBSyxFQUFFQyxVQUFVLENBQUMsRUFBRTVwQixrREFBTSxDQUFDaVMsRUFBRSxDQUFDLENBQUMsQ0FBQzdQLE1BQU0sRUFBRTtRQUM1RDR0QixxQkFBcUIsQ0FBQy9kLEVBQUUsRUFBRXlMLFFBQVEsRUFBRStPLEdBQUcsRUFBRSxDQUFDekcsUUFBUSxDQUFDLENBQUM7TUFDeEQ7SUFDSixDQUFDLENBQUM7RUFDTjtFQUVBLFNBQVNvSyxXQUFXQSxDQUFDN2hCLEdBQUcsRUFBRWtlLEdBQUcsRUFBRTRELE9BQU8sRUFBRTtJQUNwQyxLQUFLLElBQU1wZSxFQUFFLElBQUkxRCxHQUFHLEVBQUU7TUFDbEIsSUFBTTZPLE9BQU8sR0FBRzdPLEdBQUcsQ0FBQzBELEVBQUUsQ0FBQztNQUN2QixJQUFNNGQsTUFBTSxHQUFHalYsK0NBQU8sQ0FBQ3VDLEtBQUssRUFBRWxMLEVBQUUsQ0FBQztNQUNqQyxJQUFJLENBQUM0ZCxNQUFNLEVBQUU7UUFDVCxJQUFJVixXQUFXLEVBQUU7VUFDYlEsU0FBUyxDQUFDMWQsRUFBRSxFQUFFd2EsR0FBRyxFQUFFelMsa0RBQU8sQ0FBQ2hhLGtEQUFNLENBQUNvZCxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2hEO01BQ0osQ0FBQyxNQUFNO1FBQ0gsS0FBSyxJQUFNTSxRQUFRLElBQUlOLE9BQU8sRUFBRTtVQUM1QixJQUFNdU8sU0FBUyxHQUFHdk8sT0FBTyxDQUFDTSxRQUFRLENBQUM7VUFDbkNrUyxZQUFZLENBQUMzZCxFQUFFLEVBQUU0ZCxNQUFNLEVBQUVuUyxRQUFRLEVBQUUrTyxHQUFHLEVBQUVkLFNBQVMsQ0FBQztVQUNsRCxJQUFJMEUsT0FBTyxFQUFFO1lBQ1Q7WUFDQTtZQUNBMUUsU0FBUyxDQUFDeHJCLE9BQU8sQ0FBQ2d3QixhQUFhLENBQUM7VUFDcEM7UUFDSjtNQUNKO0lBQ0o7RUFDSjtFQUVBQyxXQUFXLENBQUNkLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDO0VBQ3RDYyxXQUFXLENBQUNiLFFBQVEsRUFBRSxPQUFPLENBQUM7RUFFOUIsU0FBU2UsZ0JBQWdCQSxDQUFDQyxRQUFRLEVBQUU5RCxHQUFHLEVBQUU0RCxPQUFPLEVBQUU7SUFDOUMsS0FBSyxJQUFNdkUsTUFBTSxJQUFJeUUsUUFBUSxFQUFFO01BQzNCLElBQU1DLFdBQVcsR0FBR0QsUUFBUSxDQUFDekUsTUFBTSxDQUFDO01BQUMsSUFBQXZYLEtBQUEsWUFBQUEsTUFBQW1KLFFBQUEsRUFDRDtRQUNoQzhTLFdBQVcsQ0FBQzlTLFFBQVEsQ0FBQyxDQUFDdmQsT0FBTyxDQUFDLFVBQUFtaEIsTUFBQSxFQUErQjtVQUFBLElBQTdCdmUsSUFBSSxHQUFBdWUsTUFBQSxDQUFKdmUsSUFBSTtZQUFFL0MsTUFBTSxHQUFBc2hCLE1BQUEsQ0FBTnRoQixNQUFNO1lBQUUyckIsU0FBUyxHQUFBckssTUFBQSxDQUFUcUssU0FBUztVQUNuRCxJQUFNMVosRUFBRSxHQUFHOFcsa0RBQU0sQ0FBQ2htQixJQUFJLEVBQUUvQyxNQUFNLENBQUM7VUFDL0Jnd0IscUJBQXFCLENBQUMvZCxFQUFFLEVBQUV5TCxRQUFRLEVBQUUrTyxHQUFHLEVBQUVkLFNBQVMsQ0FBQztVQUNuRCxJQUFJMEUsT0FBTyxFQUFFO1lBQ1QxRSxTQUFTLENBQUN4ckIsT0FBTyxDQUFDZ3dCLGFBQWEsQ0FBQztVQUNwQztRQUNKLENBQUMsQ0FBQztNQUNOLENBQUM7TUFSRCxLQUFLLElBQU16UyxRQUFRLElBQUk4UyxXQUFXO1FBQUFqYyxLQUFBLENBQUFtSixRQUFBO01BQUE7SUFTdEM7RUFDSjtFQUVBNFMsZ0JBQWdCLENBQUNkLGNBQWMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDO0VBQ2hEYyxnQkFBZ0IsQ0FBQ2IsYUFBYSxFQUFFLE9BQU8sQ0FBQztBQUM1QztBQUVPLFNBQVMxb0IsYUFBYUEsQ0FBQzBwQixZQUFZLEVBQUVqcUIsYUFBYSxFQUFFO0VBQ3ZEO0VBQ0EsSUFBTWtxQixVQUFVLEdBQUcsSUFBSW5JLHNEQUFRLENBQUMsQ0FBQztFQUVqQyxJQUFNb0ksb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0VBRS9CLElBQU1DLE1BQU0sR0FBR3JpQixpREFBRyxDQUFDcWEsa0RBQU0sQ0FBQztJQUFDM1csRUFBRSxFQUFFMFk7RUFBZSxDQUFDLENBQUMsQ0FBQztFQUNqRCxJQUFNd0Isa0JBQWtCLEdBQUc1ZCxpREFBRyxDQUFDLFVBQUErZCxHQUFHLEVBQUk7SUFDbEMsSUFBT25LLE1BQU0sR0FBcUJtSyxHQUFHLENBQTlCbkssTUFBTTtNQUFFK0QsZUFBZSxHQUFJb0csR0FBRyxDQUF0QnBHLGVBQWU7SUFDOUIsSUFBTUksR0FBRyxHQUFHc0Msa0RBQU0sQ0FBQztNQUFDaGEsTUFBTSxFQUFFZ2lCLE1BQU07TUFBRXBsQixLQUFLLEVBQUVvbEI7SUFBTSxDQUFDLEVBQUV0RSxHQUFHLENBQUM7SUFDeEQsSUFBRyxDQUFDcEcsZUFBZSxFQUFDO01BQ2hCSSxHQUFHLENBQUM3RyxPQUFPLEdBQUdsUixpREFBRyxDQUNiLFVBQUE2UyxJQUFJO1FBQUEsT0FBSWhSLGtEQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRXFhLGNBQWMsQ0FBQ3JKLElBQUksQ0FBQyxDQUFDO01BQUEsR0FDaEQ1RyxpQkFBaUIsQ0FBQzJILE1BQU0sQ0FBQyxHQUFHb0ksb0JBQW9CLENBQUNwSSxNQUFNLENBQUMsR0FBRyxDQUFDQSxNQUFNLENBQ3RFLENBQUM7SUFDTCxDQUFDLE1BQU07TUFDSG1FLEdBQUcsQ0FBQzdHLE9BQU8sR0FBRyxFQUFFO0lBQ3BCO0lBQ0EsT0FBTzZHLEdBQUc7RUFDZCxDQUFDLEVBQUVtSyxZQUFZLENBQUM7RUFFaEIsSUFBSTNsQixRQUFRLEdBQUcsS0FBSztFQUNwQixJQUFNK2xCLFNBQVMsR0FBRyxTQUFaQSxTQUFTQSxDQUFJaFosT0FBTyxFQUFFaVosS0FBSyxFQUFLO0lBQ2xDaG1CLFFBQVEsR0FBRyxJQUFJO0lBQ2Z0RSxhQUFhLENBQUNxUixPQUFPLEVBQUVpWixLQUFLLENBQUM7RUFDakMsQ0FBQztFQUNENUUsb0JBQW9CLENBQUNDLGtCQUFrQixFQUFFMEUsU0FBUyxDQUFDOztFQUVuRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJLElBQU12QixTQUFTLEdBQUcsQ0FBQyxDQUFDO0VBQ3BCLElBQU1DLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFDbkIsSUFBTUMsY0FBYyxHQUFHLENBQUMsQ0FBQztFQUN6QixJQUFNQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO0VBRXhCLElBQU1zQixXQUFXLEdBQUc7SUFDaEJDLFVBQVUsRUFBRU4sVUFBVTtJQUN0QnBCLFNBQVM7SUFDVEMsUUFBUTtJQUNSQyxjQUFjO0lBQ2RDLGFBQWE7SUFDYjlELFNBQVMsRUFBRVE7RUFDZixDQUFDO0VBRUQsSUFBSXJoQixRQUFRLEVBQUU7SUFDVjtJQUNBO0lBQ0EsT0FBT2ltQixXQUFXO0VBQ3RCO0VBRUE1RSxrQkFBa0IsQ0FBQ2hzQixPQUFPLENBQUMsVUFBQXNyQixVQUFVLEVBQUk7SUFDckMsSUFBT2hNLE9BQU8sR0FBWWdNLFVBQVUsQ0FBN0JoTSxPQUFPO01BQUU3USxNQUFNLEdBQUk2YyxVQUFVLENBQXBCN2MsTUFBTTtJQUV0QjZRLE9BQU8sQ0FBQ2hXLE1BQU0sQ0FBQ21GLE1BQU0sQ0FBQyxDQUFDek8sT0FBTyxDQUFDLFVBQUE4d0IsSUFBSSxFQUFJO01BQ25DLElBQU9oZixFQUFFLEdBQUlnZixJQUFJLENBQVZoZixFQUFFO01BQ1QsSUFBSSxPQUFPQSxFQUFFLEtBQUssUUFBUSxFQUFFO1FBQ3hCNFcsa0RBQWlCLENBQUMsVUFBQ3ZWLEdBQUcsRUFBRXBQLEdBQUcsRUFBSztVQUM1QixJQUFJLENBQUN5c0Isb0JBQW9CLENBQUN6c0IsR0FBRyxDQUFDLEVBQUU7WUFDNUJ5c0Isb0JBQW9CLENBQUN6c0IsR0FBRyxDQUFDLEdBQUc7Y0FDeEJndEIsS0FBSyxFQUFFLEVBQUU7Y0FDVHJILE1BQU0sRUFBRTtZQUNaLENBQUM7VUFDTDtVQUNBLElBQU1zSCxlQUFlLEdBQUdSLG9CQUFvQixDQUFDenNCLEdBQUcsQ0FBQztVQUNqRCxJQUFJb1AsR0FBRyxJQUFJQSxHQUFHLENBQUNvVyxJQUFJLEVBQUU7WUFDakIsSUFBSXBXLEdBQUcsQ0FBQ3VXLE1BQU0sRUFBRTtjQUNac0gsZUFBZSxDQUFDdEgsTUFBTSxJQUFJLENBQUM7WUFDL0I7VUFDSixDQUFDLE1BQU0sSUFBSXNILGVBQWUsQ0FBQ0QsS0FBSyxDQUFDeFksT0FBTyxDQUFDcEYsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDbEQ2ZCxlQUFlLENBQUNELEtBQUssQ0FBQ252QixJQUFJLENBQUN1UixHQUFHLENBQUM7VUFDbkM7UUFDSixDQUFDLEVBQUVyQixFQUFFLENBQUM7TUFDVjtJQUNKLENBQUMsQ0FBQztFQUNOLENBQUMsQ0FBQztFQUVGNFcsa0RBQWlCLENBQUMsVUFBQXNJLGVBQWUsRUFBSTtJQUNqQyxJQUFPRCxLQUFLLEdBQVlDLGVBQWUsQ0FBaENELEtBQUs7TUFBRXJILE1BQU0sR0FBSXNILGVBQWUsQ0FBekJ0SCxNQUFNO0lBQ3BCLElBQU11SCxJQUFJLEdBQUdGLEtBQUssQ0FBQzl0QixLQUFLLENBQUMsQ0FBQyxDQUFDMG5CLElBQUksQ0FBQ0MsU0FBUyxDQUFDO0lBQzFDLElBQUlsQixNQUFNLEVBQUU7TUFDUixLQUFLLElBQUk3ckIsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHNnJCLE1BQU0sRUFBRTdyQixDQUFDLEVBQUUsRUFBRTtRQUM3QixJQUFJa3pCLEtBQUssQ0FBQzl1QixNQUFNLEVBQUU7VUFDZGd2QixJQUFJLENBQUN4aEIsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQ3diLFNBQVMsQ0FBQ2dHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFDdkNBLElBQUksQ0FBQ3J2QixJQUFJLENBQUNzcEIsUUFBUSxDQUFDK0YsSUFBSSxDQUFDQSxJQUFJLENBQUNodkIsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsQ0FBQyxNQUFNO1VBQ0hndkIsSUFBSSxDQUFDcnZCLElBQUksQ0FBQy9ELENBQUMsQ0FBQztRQUNoQjtNQUNKO0lBQ0osQ0FBQyxNQUFNLElBQUksQ0FBQ2t6QixLQUFLLENBQUM5dUIsTUFBTSxFQUFFO01BQ3RCO01BQ0FndkIsSUFBSSxDQUFDcnZCLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDaEI7SUFDQW92QixlQUFlLENBQUNDLElBQUksR0FBR0EsSUFBSTtFQUMvQixDQUFDLEVBQUVULG9CQUFvQixDQUFDO0VBRXhCLFNBQVNVLFVBQVVBLENBQUN4RixNQUFNLEVBQUV5RixVQUFVLEVBQUU7SUFDcEMsSUFBSUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakIxSSxrREFBaUIsQ0FBQyxVQUFDdlYsR0FBRyxFQUFFcFAsR0FBRyxFQUFLO01BQzVCLElBQU1zdEIsUUFBUSxHQUFHYixvQkFBb0IsQ0FBQ3pzQixHQUFHLENBQUMsQ0FBQ2t0QixJQUFJO01BQy9DLElBQU1LLFdBQVcsR0FBR0QsUUFBUSxDQUFDOVksT0FBTyxDQUFDNFksVUFBVSxDQUFDcHRCLEdBQUcsQ0FBQyxDQUFDO01BQ3JELElBQUl3dEIsT0FBTyxHQUFHLENBQUNwZSxHQUFHLENBQUM7TUFDbkIsSUFBSUEsR0FBRyxJQUFJQSxHQUFHLENBQUNvVyxJQUFJLEVBQUU7UUFDakIsSUFBSXBXLEdBQUcsS0FBS3NXLFVBQVUsRUFBRTtVQUNwQixJQUFJNkgsV0FBVyxHQUFHLENBQUMsRUFBRTtZQUNqQkMsT0FBTyxHQUFHRixRQUFRLENBQUNwdUIsS0FBSyxDQUFDLENBQUMsRUFBRXF1QixXQUFXLENBQUM7VUFDNUMsQ0FBQyxNQUFNO1lBQ0g7WUFDQUMsT0FBTyxHQUFHLEVBQUU7VUFDaEI7UUFDSixDQUFDLE1BQU07VUFDSDtVQUNBO1VBQ0E7VUFDQUEsT0FBTyxHQUNIRCxXQUFXLEtBQUssQ0FBQyxDQUFDLElBQUluZSxHQUFHLEtBQUttVyxHQUFHLEdBQzNCK0gsUUFBUSxHQUNSLENBQUNGLFVBQVUsQ0FBQ3B0QixHQUFHLENBQUMsQ0FBQztRQUMvQjtNQUNKO01BQ0E7TUFDQTtNQUNBcXRCLE1BQU0sR0FBRzdJLGtEQUFFLENBQUNBLGtEQUFFLENBQUMsQ0FBQ3RZLGtEQUFLLENBQUNsTSxHQUFHLENBQUMsQ0FBQyxFQUFFd3RCLE9BQU8sQ0FBQyxFQUFFSCxNQUFNLENBQUM7SUFDbEQsQ0FBQyxFQUFFMUYsTUFBTSxDQUFDO0lBQ1YsT0FBTzBGLE1BQU07RUFDakI7O0VBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztFQUVJLElBQU1JLFNBQVMsR0FBRyxVQUFVO0VBQzVCLElBQU1DLGdCQUFnQixHQUFHLEVBQUU7RUFDM0IsSUFBTUMsSUFBSSxHQUFHLEVBQUU7RUFDZixJQUFNQyxLQUFLLEdBQUcsRUFBRTtFQUVoQixTQUFTQyxlQUFlQSxDQUFDQyxRQUFRLEVBQUVDLFNBQVMsRUFBb0I7SUFBQSxJQUFsQkMsU0FBUyxHQUFBenRCLFNBQUEsQ0FBQXJDLE1BQUEsUUFBQXFDLFNBQUEsUUFBQUcsU0FBQSxHQUFBSCxTQUFBLE1BQUcsSUFBSTtJQUMxRGlzQixVQUFVLENBQUN5QixPQUFPLENBQUNILFFBQVEsQ0FBQztJQUM1QnRCLFVBQVUsQ0FBQzBCLGFBQWEsQ0FBQ0osUUFBUSxFQUFFQyxTQUFTLENBQUM7SUFDN0M7SUFDQSxJQUFJQyxTQUFTLEVBQUU7TUFDWEwsSUFBSSxDQUFDQSxJQUFJLENBQUN6dkIsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDTCxJQUFJLENBQUNpd0IsUUFBUSxDQUFDO01BQ3BDRixLQUFLLENBQUNBLEtBQUssQ0FBQzF2QixNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUNMLElBQUksQ0FBQ2t3QixTQUFTLENBQUM7SUFDM0M7RUFDSjtFQUVBOUYsa0JBQWtCLENBQUNoc0IsT0FBTyxDQUFDLFVBQUFzckIsVUFBVSxFQUFJO0lBQ3JDLElBQU9oTSxPQUFPLEdBQVlnTSxVQUFVLENBQTdCaE0sT0FBTztNQUFFN1EsTUFBTSxHQUFJNmMsVUFBVSxDQUFwQjdjLE1BQU07O0lBRXRCO0lBQ0FpakIsSUFBSSxDQUFDOXZCLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDYit2QixLQUFLLENBQUMvdkIsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUVkLFNBQVNzd0IsZ0JBQWdCQSxDQUFDZixVQUFVLEVBQUVXLFNBQVMsRUFBRTtNQUM3Q3ZCLFVBQVUsQ0FBQ3lCLE9BQU8sQ0FBQ0YsU0FBUyxDQUFDO01BQzdCcmpCLE1BQU0sQ0FBQ3pPLE9BQU8sQ0FBQyxVQUFBbXlCLEtBQUssRUFBSTtRQUNwQixJQUFXM0UsSUFBSSxHQUFjMkUsS0FBSyxDQUEzQnJnQixFQUFFO1VBQVF5TCxRQUFRLEdBQUk0VSxLQUFLLENBQWpCNVUsUUFBUTtRQUN6QixJQUFJLE9BQU9pUSxJQUFJLEtBQUssUUFBUSxFQUFFO1VBQzFCLElBQU00RSxRQUFRLEdBQUdsQixVQUFVLENBQUMxRCxJQUFJLEVBQUUyRCxVQUFVLENBQUM7VUFDN0NpQixRQUFRLENBQUNweUIsT0FBTyxDQUFDLFVBQUE4UixFQUFFLEVBQUk7WUFDbkI4ZixlQUFlLENBQ1gvSSxrRUFBZ0IsQ0FBQztjQUFDL1csRUFBRTtjQUFFeUw7WUFBUSxDQUFDLENBQUMsRUFDaEN1VSxTQUNKLENBQUM7VUFDTCxDQUFDLENBQUM7UUFDTixDQUFDLE1BQU07VUFDSEYsZUFBZSxDQUFDL0ksa0VBQWdCLENBQUNzSixLQUFLLENBQUMsRUFBRUwsU0FBUyxDQUFDO1FBQ3ZEO01BQ0osQ0FBQyxDQUFDO0lBQ047O0lBRUE7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBLElBQUFPLGtCQUFBLEdBQW9CMUUsZ0JBQWdCLENBQUNyTyxPQUFPLENBQUNyZCxNQUFNLEdBQUdxZCxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUN4TixFQUFFLEdBQUdyTixTQUFTLENBQUM7TUFBekVvcEIsU0FBUyxHQUFBd0Usa0JBQUEsQ0FBVHhFLFNBQVM7SUFDaEIsSUFBTXlFLGlCQUFpQixHQUFHNWlCLGtEQUFTLENBQUMsVUFBQWhTLENBQUM7TUFBQSxPQUFJLENBQUMwYyxhQUFhLENBQUMxYyxDQUFDLENBQUNvVSxFQUFFLENBQUM7SUFBQSxHQUFFd04sT0FBTyxDQUFDO0lBQ3ZFLElBQU1pVCxlQUFlLEdBQUcvaEIsa0RBQVUsQ0FDOUI7TUFBQ3FkLFNBQVM7TUFBRXlFLGlCQUFpQjtNQUFFaFQ7SUFBTyxDQUFDLEVBQ3ZDZ00sVUFDSixDQUFDO0lBRURoTSxPQUFPLENBQUN0ZixPQUFPLENBQUMsVUFBQTh4QixTQUFTLEVBQUk7TUFDekIsSUFBVzFFLEtBQUssR0FBYzBFLFNBQVMsQ0FBaENoZ0IsRUFBRTtRQUFTeUwsUUFBUSxHQUFJdVUsU0FBUyxDQUFyQnZVLFFBQVE7TUFDMUI7TUFDQSxJQUFNaVYsU0FBUyxHQUFHckYsaUJBQWlCLENBQUMyRSxTQUFTLEVBQUVyakIsTUFBTSxDQUFDO01BQ3RELElBQUksT0FBTzJlLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDM0IsSUFBTXFGLFNBQVMsR0FBR3ZCLFVBQVUsQ0FBQzlELEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2Q3FGLFNBQVMsQ0FBQ3p5QixPQUFPLENBQUMsVUFBQThSLEVBQUUsRUFBSTtVQUNwQixJQUFNNGdCLGFBQWEsR0FBRztZQUFDNWdCLEVBQUU7WUFBRXlMO1VBQVEsQ0FBQztVQUNwQyxJQUFJb1YsU0FBUyxHQUFHOUosa0VBQWdCLENBQUM2SixhQUFhLENBQUM7VUFDL0M7VUFDQSxJQUFJRixTQUFTLEVBQUU7WUFDWGYsZ0JBQWdCLENBQUM3dkIsSUFBSSxDQUFDOHdCLGFBQWEsQ0FBQztZQUNwQ0MsU0FBUyxJQUFJbkIsU0FBUztVQUMxQjtVQUNBVSxnQkFBZ0IsQ0FBQ3BnQixFQUFFLEVBQUU2Z0IsU0FBUyxDQUFDO1FBQ25DLENBQUMsQ0FBQztRQUNGbEgsVUFBVSxDQUFDNEQsY0FBYyxFQUFFakMsS0FBSyxFQUFFN1AsUUFBUSxFQUFFZ1YsZUFBZSxDQUFDO01BQ2hFLENBQUMsTUFBTTtRQUNILElBQUlJLFNBQVMsR0FBRzlKLGtFQUFnQixDQUFDaUosU0FBUyxDQUFDO1FBQzNDO1FBQ0EsSUFBSVUsU0FBUyxFQUFFO1VBQ1hmLGdCQUFnQixDQUFDN3ZCLElBQUksQ0FBQ2t3QixTQUFTLENBQUM7VUFDaENhLFNBQVMsSUFBSW5CLFNBQVM7UUFDMUI7UUFDQVUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUVTLFNBQVMsQ0FBQztRQUMvQnhILE1BQU0sQ0FBQ2dFLFNBQVMsRUFBRS9CLEtBQUssRUFBRTdQLFFBQVEsRUFBRWdWLGVBQWUsQ0FBQztNQUN2RDtJQUNKLENBQUMsQ0FBQztJQUVGOWpCLE1BQU0sQ0FBQ3pPLE9BQU8sQ0FBQyxVQUFBNHlCLFdBQVcsRUFBSTtNQUMxQixJQUFXcEYsSUFBSSxHQUFzQm9GLFdBQVcsQ0FBekM5Z0IsRUFBRTtRQUFrQjJiLE1BQU0sR0FBSW1GLFdBQVcsQ0FBL0JyVixRQUFRO01BQ3pCLElBQUksT0FBT2lRLElBQUksS0FBSyxRQUFRLEVBQUU7UUFDMUIvQixVQUFVLENBQUM2RCxhQUFhLEVBQUU5QixJQUFJLEVBQUVDLE1BQU0sRUFBRThFLGVBQWUsQ0FBQztNQUM1RCxDQUFDLE1BQU07UUFDSHBILE1BQU0sQ0FBQ2lFLFFBQVEsRUFBRTVCLElBQUksRUFBRUMsTUFBTSxFQUFFOEUsZUFBZSxDQUFDO01BQ25EO0lBQ0osQ0FBQyxDQUFDO0VBQ04sQ0FBQyxDQUFDOztFQUVGO0VBQ0FkLGdCQUFnQixDQUFDenhCLE9BQU8sQ0FBQyxVQUFBNnlCLGFBQWEsRUFBSTtJQUN0QyxJQUFNQyxZQUFZLEdBQUdqSyxrRUFBZ0IsQ0FBQ2dLLGFBQWEsQ0FBQztJQUNwRCxJQUFNRSxPQUFPLEdBQUdELFlBQVksQ0FBQ3hwQixNQUFNLENBQUNrb0IsU0FBUyxDQUFDO0lBQzlDLEtBQUssSUFBSXdCLEdBQUcsR0FBRyxDQUFDLEVBQUVBLEdBQUcsR0FBR3RCLElBQUksQ0FBQ3p2QixNQUFNLEVBQUUrd0IsR0FBRyxFQUFFLEVBQUU7TUFDeEM7TUFDQSxJQUFJdEIsSUFBSSxDQUFDc0IsR0FBRyxDQUFDLENBQUMxRixJQUFJLENBQUMsVUFBQTJGLE1BQU07UUFBQSxPQUFJQSxNQUFNLEtBQUtILFlBQVk7TUFBQSxFQUFDLEVBQUU7UUFDbkQ7QUFDaEI7QUFDQTtRQUNnQixJQUFJLENBQUNuQixLQUFLLENBQUNxQixHQUFHLENBQUMsQ0FBQzFGLElBQUksQ0FBQyxVQUFBNEYsT0FBTztVQUFBLE9BQUlBLE9BQU8sS0FBS0gsT0FBTztRQUFBLEVBQUMsRUFBRTtVQUNsRHBCLEtBQUssQ0FBQ3FCLEdBQUcsQ0FBQyxDQUFDaHpCLE9BQU8sQ0FBQyxVQUFBa3pCLE9BQU8sRUFBSTtZQUMxQnRCLGVBQWUsQ0FBQ21CLE9BQU8sRUFBRUcsT0FBTyxFQUFFLEtBQUssQ0FBQztVQUM1QyxDQUFDLENBQUM7UUFDTjtNQUNKO0lBQ0o7RUFDSixDQUFDLENBQUM7RUFFRixPQUFPdEMsV0FBVztBQUN0QjtBQUVBLFNBQVNqRCxnQkFBZ0JBLENBQUM3YixFQUFFLEVBQUU7RUFDMUIsSUFBTStiLFNBQVMsR0FBRyxFQUFFO0VBQ3BCLElBQU1FLGNBQWMsR0FBRyxFQUFFO0VBQ3pCLElBQUksT0FBT2pjLEVBQUUsS0FBSyxRQUFRLEVBQUU7SUFDeEI0VyxrREFBaUIsQ0FBQyxVQUFDdlYsR0FBRyxFQUFFcFAsR0FBRyxFQUFLO01BQzVCLElBQUlvUCxHQUFHLEtBQUtxVyxLQUFLLEVBQUU7UUFDZnFFLFNBQVMsQ0FBQ2pzQixJQUFJLENBQUNtQyxHQUFHLENBQUM7TUFDdkIsQ0FBQyxNQUFNLElBQUlvUCxHQUFHLEtBQUtzVyxVQUFVLEVBQUU7UUFDM0JzRSxjQUFjLENBQUNuc0IsSUFBSSxDQUFDbUMsR0FBRyxDQUFDO01BQzVCO0lBQ0osQ0FBQyxFQUFFK04sRUFBRSxDQUFDO0lBQ04rYixTQUFTLENBQUNsRCxJQUFJLENBQUMsQ0FBQztJQUNoQm9ELGNBQWMsQ0FBQ3BELElBQUksQ0FBQyxDQUFDO0VBQ3pCO0VBQ0EsT0FBTztJQUFDa0QsU0FBUztJQUFFRTtFQUFjLENBQUM7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNvRixPQUFPQSxDQUNuQnZ3QixJQUFJLEVBQ0pxdUIsSUFBSSxFQUNKbUMsV0FBVyxFQUNYQyxPQUFPLEVBQ1BDLE9BQU8sRUFDUEMsY0FBYyxFQUNoQjtFQUNFLEtBQUssSUFBSTExQixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUcrRSxJQUFJLENBQUNYLE1BQU0sRUFBRXBFLENBQUMsRUFBRSxFQUFFO0lBQ2xDLElBQU1zVixHQUFHLEdBQUc4ZCxJQUFJLENBQUNwekIsQ0FBQyxDQUFDO0lBQ25CLElBQU0yMUIsVUFBVSxHQUFHSixXQUFXLENBQUN2MUIsQ0FBQyxDQUFDO0lBQ2pDLElBQUkyMUIsVUFBVSxDQUFDakssSUFBSSxFQUFFO01BQ2pCO01BQ0E7TUFDQSxJQUFJOEosT0FBTyxJQUFJRyxVQUFVLEtBQUtsSyxHQUFHLEVBQUU7UUFDL0IsSUFBTW1LLFFBQVEsR0FBR0osT0FBTyxDQUFDOWEsT0FBTyxDQUFDM1YsSUFBSSxDQUFDL0UsQ0FBQyxDQUFDLENBQUM7UUFDekMsSUFBTTYxQixhQUFhLEdBQUdILGNBQWMsQ0FBQ0UsUUFBUSxDQUFDO1FBQzlDO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsSUFBSUQsVUFBVSxLQUFLL0osVUFBVSxJQUFJaUssYUFBYSxLQUFLakssVUFBVSxFQUFFO1VBQzNELE1BQU0sSUFBSWpwQixLQUFLLENBQ1gsNEJBQTRCLEdBQ3hCNEosSUFBSSxDQUFDQyxTQUFTLENBQUM7WUFDWHpILElBQUk7WUFDSnd3QixXQUFXO1lBQ1huQyxJQUFJO1lBQ0pvQyxPQUFPO1lBQ1BFLGNBQWM7WUFDZEQ7VUFDSixDQUFDLENBQ1QsQ0FBQztRQUNMO1FBQ0EsSUFDSTFJLFNBQVMsQ0FBQ3pYLEdBQUcsRUFBRW1nQixPQUFPLENBQUNHLFFBQVEsQ0FBQyxDQUFDLE1BQ2hDRCxVQUFVLEtBQUsvSixVQUFVLEdBQ3BCLENBQUMsQ0FBQyxHQUNGaUssYUFBYSxLQUFLakssVUFBVSxHQUM1QixDQUFDLEdBQ0QsQ0FBQyxDQUFDLEVBQ1Y7VUFDRSxPQUFPLEtBQUs7UUFDaEI7TUFDSjtJQUNKLENBQUMsTUFBTSxJQUFJdFcsR0FBRyxLQUFLcWdCLFVBQVUsRUFBRTtNQUMzQixPQUFPLEtBQUs7SUFDaEI7RUFDSjtFQUNBLE9BQU8sSUFBSTtBQUNmO0FBRUEsU0FBU0csVUFBVUEsQ0FBQ1AsV0FBVyxFQUFFbkMsSUFBSSxFQUFFO0VBQ25DLElBQU0yQyxPQUFPLEdBQUcsRUFBRTtFQUNsQixLQUFLLElBQUkvMUIsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHdTFCLFdBQVcsQ0FBQ254QixNQUFNLEVBQUVwRSxDQUFDLEVBQUUsRUFBRTtJQUN6QyxJQUFJdTFCLFdBQVcsQ0FBQ3YxQixDQUFDLENBQUMsS0FBSzJyQixLQUFLLEVBQUU7TUFDMUJvSyxPQUFPLENBQUNoeUIsSUFBSSxDQUFDcXZCLElBQUksQ0FBQ3B6QixDQUFDLENBQUMsQ0FBQztJQUN6QjtFQUNKO0VBQ0EsT0FBTysxQixPQUFPLENBQUMzeEIsTUFBTSxHQUFHbUksSUFBSSxDQUFDQyxTQUFTLENBQUN1cEIsT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUN4RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVN4WixhQUFhQSxDQUFBZ0gsTUFBQSxFQUFPO0VBQUEsSUFBTHRQLEVBQUUsR0FBQXNQLE1BQUEsQ0FBRnRQLEVBQUU7RUFDN0IsT0FBTyxPQUFPQSxFQUFFLEtBQUssUUFBUSxJQUFJNUcsa0RBQUcsQ0FBQyxVQUFBdEwsQ0FBQztJQUFBLE9BQUlBLENBQUMsQ0FBQzJrQixLQUFLO0VBQUEsR0FBRTFrQixrREFBTSxDQUFDaVMsRUFBRSxDQUFDLENBQUM7QUFDbEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMraEIsbUJBQW1CQSxDQUFDbHJCLE1BQU0sRUFBRXFVLEtBQUssRUFBRWxMLEVBQUUsRUFBRXVaLElBQUksRUFBRTtFQUNsRCxJQUFJanJCLE9BQU87RUFDWCxJQUFJeWxCLFFBQVE7RUFDWixJQUFJMUksT0FBTyxHQUFHLEVBQUU7RUFDaEIsSUFBSSxPQUFPckwsRUFBRSxLQUFLLFFBQVEsRUFBRTtJQUN4QjtJQUNBLElBQU0wWixTQUFTLEdBQUcsQ0FBQzdpQixNQUFNLENBQUN3bUIsU0FBUyxDQUFDcmQsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUV1WixJQUFJLENBQUM7SUFDcEQsSUFBSUcsU0FBUyxFQUFFO01BQ1gzRixRQUFRLEdBQUcyRixTQUFTLENBQUMsQ0FBQyxDQUFDO01BQ3ZCcHJCLE9BQU8sR0FBRytvQiw2REFBVyxDQUFDLENBQUM7SUFDM0I7RUFDSixDQUFDLE1BQU07SUFDSDtJQUNBLElBQU12bUIsS0FBSSxHQUFHdEYsTUFBTSxDQUFDc0YsSUFBSSxDQUFDa1AsRUFBRSxDQUFDLENBQUM2WSxJQUFJLENBQUMsQ0FBQztJQUNuQyxJQUFNc0csSUFBSSxHQUFHMXBCLGlEQUFLLENBQUMzRSxLQUFJLEVBQUVrUCxFQUFFLENBQUM7SUFDNUIsSUFBTTZaLE1BQU0sR0FBRy9vQixLQUFJLENBQUM2YSxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQzdCLElBQU0yUyxRQUFRLEdBQUcsQ0FBQ3puQixNQUFNLENBQUMwbUIsY0FBYyxDQUFDMUQsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUVOLElBQUksQ0FBQztJQUM1RCxJQUFJK0UsUUFBUSxFQUFFO01BQ1YsS0FBSyxJQUFJdnlCLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3V5QixRQUFRLENBQUNudUIsTUFBTSxFQUFFcEUsQ0FBQyxFQUFFLEVBQUU7UUFDdEMsSUFBTXUxQixXQUFXLEdBQUdoRCxRQUFRLENBQUN2eUIsQ0FBQyxDQUFDLENBQUNnQyxNQUFNO1FBQ3RDLElBQUlzekIsT0FBTyxDQUFDdndCLEtBQUksRUFBRXF1QixJQUFJLEVBQUVtQyxXQUFXLENBQUMsRUFBRTtVQUNsQ3ZOLFFBQVEsR0FBR3VLLFFBQVEsQ0FBQ3Z5QixDQUFDLENBQUMsQ0FBQzJ0QixTQUFTLENBQUMsQ0FBQyxDQUFDO1VBQ25DcHJCLE9BQU8sR0FBRytvQiw2REFBVyxDQUFDdm1CLEtBQUksRUFBRXF1QixJQUFJLEVBQUVtQyxXQUFXLENBQUM7VUFDOUNqVyxPQUFPLEdBQUd3VyxVQUFVLENBQUNQLFdBQVcsRUFBRW5DLElBQUksQ0FBQztVQUN2QztRQUNKO01BQ0o7SUFDSjtFQUNKO0VBQ0EsSUFBSSxDQUFDN3dCLE9BQU8sRUFBRTtJQUNWLE9BQU8sS0FBSztFQUNoQjtFQUVBLE9BQU84b0Isc0VBQW9CLENBQUNyRCxRQUFRLEVBQUV6bEIsT0FBTyxFQUFFK2MsT0FBTyxDQUFDO0FBQzNEO0FBRUEsU0FBUzJXLHNCQUFzQkEsQ0FBQ2pPLFFBQVEsRUFBRWtPLFVBQVUsRUFBRUMsSUFBSSxFQUFFSixPQUFPLEVBQUU7RUFDakUsSUFBTUssUUFBUSxHQUFHMzJCLE1BQU0sQ0FBQ3NGLElBQUksQ0FBQ214QixVQUFVLENBQUNqaUIsRUFBRSxDQUFDLENBQUM2WSxJQUFJLENBQUMsQ0FBQztFQUNsRCxJQUFNdUosZUFBZSxHQUFHM3NCLGlEQUFLLENBQUMwc0IsUUFBUSxFQUFFRixVQUFVLENBQUNqaUIsRUFBRSxDQUFDO0VBQ3RELElBQU1xaUIsVUFBVSxHQUFHLENBQUMsQ0FBQztFQUNyQkgsSUFBSSxDQUFDaDBCLE9BQU8sQ0FBQyxVQUFBbzBCLE1BQUEsRUFBaUI7SUFBQSxJQUFYaEgsS0FBSyxHQUFBZ0gsTUFBQSxDQUFUdGlCLEVBQUU7SUFDYixJQUFNdWlCLE9BQU8sR0FBRzlzQixpREFBSyxDQUFDMHNCLFFBQVEsRUFBRTdHLEtBQUssQ0FBQztJQUN0QyxJQUFNa0gsUUFBUSxHQUFHcEwsc0VBQW9CLENBQ2pDckQsUUFBUSxFQUNSc0QsNkRBQVcsQ0FBQzhLLFFBQVEsRUFBRUksT0FBTyxFQUFFSCxlQUFlLENBQUMsRUFDL0NQLFVBQVUsQ0FBQ08sZUFBZSxFQUFFRyxPQUFPLENBQ3ZDLENBQUM7SUFDRCxJQUFPRSxVQUFVLEdBQUlELFFBQVEsQ0FBdEJDLFVBQVU7SUFDakIsSUFBSSxDQUFDSixVQUFVLENBQUNJLFVBQVUsQ0FBQyxFQUFFO01BQ3pCWCxPQUFPLENBQUNoeUIsSUFBSSxDQUFDMHlCLFFBQVEsQ0FBQztNQUN0QkgsVUFBVSxDQUFDSSxVQUFVLENBQUMsR0FBRyxJQUFJO0lBQ2pDO0VBQ0osQ0FBQyxDQUFDO0FBQ047QUFFTyxTQUFTQyx5QkFBeUJBLENBQUNwMEIsT0FBTyxFQUFFNGMsS0FBSyxFQUFFNFcsT0FBTyxFQUFFO0VBQy9ELE9BQU8sVUFBQS9OLFFBQVEsRUFBSTtJQUNmLElBQU9nSSxTQUFTLEdBQWdDaEksUUFBUSxDQUFqRGdJLFNBQVM7TUFBRXlFLGlCQUFpQixHQUFhek0sUUFBUSxDQUF0Q3lNLGlCQUFpQjtNQUFFaFQsT0FBTyxHQUFJdUcsUUFBUSxDQUFuQnZHLE9BQU87SUFDNUMsSUFBSXVPLFNBQVMsQ0FBQzVyQixNQUFNLEVBQUU7TUFDbEIsSUFBTXd5QixnQkFBZ0IsR0FBR25WLE9BQU8sQ0FBQ2dULGlCQUFpQixDQUFDO01BQ25ELElBQUltQyxnQkFBZ0IsRUFBRTtRQUNsQlgsc0JBQXNCLENBQ2xCak8sUUFBUSxFQUNSNE8sZ0JBQWdCLEVBQ2hCcjBCLE9BQU8sQ0FBQzRjLEtBQUssQ0FBQyxDQUFDeVgsZ0JBQWdCLENBQUMsRUFDaENiLE9BQ0osQ0FBQztNQUNMLENBQUMsTUFBTTtRQUNIO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO1FBQ2dCLElBQU1jLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDbEJwVixPQUFPLENBQUN0ZixPQUFPLENBQUMsVUFBQSt6QixVQUFVLEVBQUk7VUFDMUIsSUFBTVksTUFBTSxHQUFHdjBCLE9BQU8sQ0FBQzRjLEtBQUssQ0FBQyxDQUFDK1csVUFBVSxDQUFDLENBQUM1bEIsTUFBTSxDQUFDLFVBQUF0USxDQUFDLEVBQUk7WUFDbEQsSUFBTSsyQixRQUFRLEdBQUd4cUIsSUFBSSxDQUFDQyxTQUFTLENBQUM5QyxpREFBSyxDQUFDc21CLFNBQVMsRUFBRWh3QixDQUFDLENBQUNpVSxFQUFFLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUM0aUIsT0FBTyxDQUFDRSxRQUFRLENBQUMsRUFBRTtjQUNwQkYsT0FBTyxDQUFDRSxRQUFRLENBQUMsR0FBRyxDQUFDO2NBQ3JCLE9BQU8sSUFBSTtZQUNmO1lBQ0EsT0FBTyxLQUFLO1VBQ2hCLENBQUMsQ0FBQztVQUNGZCxzQkFBc0IsQ0FDbEJqTyxRQUFRLEVBQ1JrTyxVQUFVLEVBQ1ZZLE1BQU0sRUFDTmYsT0FDSixDQUFDO1FBQ0wsQ0FBQyxDQUFDO01BQ047SUFDSixDQUFDLE1BQU07TUFDSCxJQUFNalcsRUFBRSxHQUFHdUwsc0VBQW9CLENBQUNyRCxRQUFRLEVBQUV6bEIsT0FBTyxFQUFFLEVBQUUsQ0FBQztNQUN0RCxJQUFJeVosa0RBQU8sQ0FBQzhELEVBQUUsQ0FBQ2tYLFVBQVUsQ0FBQzdYLEtBQUssQ0FBQyxDQUFDLENBQUMvYSxNQUFNLElBQUk0akIsUUFBUSxDQUFDRSxlQUFlLEVBQUU7UUFDbEU2TixPQUFPLENBQUNoeUIsSUFBSSxDQUFDK2IsRUFBRSxDQUFDO01BQ3BCO0lBQ0o7RUFDSixDQUFDO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3ZNLGNBQWNBLENBQUNVLEVBQUUsRUFBRWdCLFFBQVEsRUFBRW5LLE1BQU0sRUFBRTtFQUNqRCxJQUFJLEVBQUVtSixFQUFFLElBQUluSixNQUFNLElBQUltSyxRQUFRLENBQUM3USxNQUFNLENBQUMsRUFBRTtJQUNwQyxPQUFPLEVBQUU7RUFDYjtFQUVBLElBQUksT0FBTzZQLEVBQUUsS0FBSyxRQUFRLEVBQUU7SUFDeEIsSUFBTXJELE1BQU0sR0FBRzlGLE1BQU0sQ0FBQ3ltQixRQUFRLENBQUN0ZCxFQUFFLENBQUM7SUFDbEMsT0FBT3JELE1BQU0sR0FBR3FFLFFBQVEsQ0FBQzNFLE1BQU0sQ0FBQyxVQUFBMm1CLE9BQU87TUFBQSxPQUFJcm1CLE1BQU0sQ0FBQ3FtQixPQUFPLENBQUM7SUFBQSxFQUFDLEdBQUcsRUFBRTtFQUNwRTtFQUVBLElBQU1seUIsSUFBSSxHQUFHdEYsTUFBTSxDQUFDc0YsSUFBSSxDQUFDa1AsRUFBRSxDQUFDLENBQUM2WSxJQUFJLENBQUMsQ0FBQztFQUNuQyxJQUFNc0csSUFBSSxHQUFHMXBCLGlEQUFLLENBQUMzRSxJQUFJLEVBQUVrUCxFQUFFLENBQUM7RUFDNUIsSUFBTTZaLE1BQU0sR0FBRy9vQixJQUFJLENBQUM2YSxJQUFJLENBQUMsR0FBRyxDQUFDO0VBQzdCLElBQU00UyxXQUFXLEdBQUcxbkIsTUFBTSxDQUFDMm1CLGFBQWEsQ0FBQzNELE1BQU0sQ0FBQztFQUNoRCxJQUFJLENBQUMwRSxXQUFXLEVBQUU7SUFDZCxPQUFPLEVBQUU7RUFDYjtFQUNBLE9BQU92ZCxRQUFRLENBQUMzRSxNQUFNLENBQUMsVUFBQWtkLElBQUksRUFBSTtJQUMzQixJQUFNK0UsUUFBUSxHQUFHQyxXQUFXLENBQUNoRixJQUFJLENBQUM7SUFDbEMsT0FDSStFLFFBQVEsSUFDUkEsUUFBUSxDQUFDOUMsSUFBSSxDQUFDLFVBQUF5SCxPQUFPO01BQUEsT0FBSTVCLE9BQU8sQ0FBQ3Z3QixJQUFJLEVBQUVxdUIsSUFBSSxFQUFFOEQsT0FBTyxDQUFDbDFCLE1BQU0sQ0FBQztJQUFBLEVBQUM7RUFFckUsQ0FBQyxDQUFDO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTbTFCLDRCQUE0QkEsQ0FBQ3JzQixNQUFNLEVBQUVxVSxLQUFLLEVBQUVpWSxXQUFXLEVBQUVDLElBQUksRUFBRTtFQUMzRSxJQUFPQyxXQUFXLEdBQWlERCxJQUFJLENBQWhFQyxXQUFXO0lBQUVDLHNCQUFzQixHQUF5QkYsSUFBSSxDQUFuREUsc0JBQXNCO0lBQUVDLFFBQVEsR0FBZUgsSUFBSSxDQUEzQkcsUUFBUTtJQUFFQyxTQUFTLEdBQUlKLElBQUksQ0FBakJJLFNBQVM7RUFDL0QsSUFBTW5CLFVBQVUsR0FBRyxDQUFDLENBQUM7RUFDckIsSUFBTTNJLFNBQVMsR0FBRyxFQUFFO0VBRXBCLFNBQVMrSixXQUFXQSxDQUFDMVAsUUFBUSxFQUFFO0lBQzNCLElBQUlBLFFBQVEsRUFBRTtNQUNWLElBQU0yUCxVQUFVLEdBQUdyQixVQUFVLENBQUN0TyxRQUFRLENBQUMwTyxVQUFVLENBQUM7TUFDbEQsSUFBSWlCLFVBQVUsS0FBSy93QixTQUFTLEVBQUU7UUFDMUIsSUFBTWd4QixPQUFPLEdBQUdqSyxTQUFTLENBQUNnSyxVQUFVLENBQUM7UUFDckNDLE9BQU8sQ0FBQy9VLGNBQWMsR0FBR3VJLDBEQUFRLENBQzdCd00sT0FBTyxDQUFDL1UsY0FBYyxFQUN0Qm1GLFFBQVEsQ0FBQ25GLGNBQ2IsQ0FBQztRQUNELElBQUltRixRQUFRLENBQUM2UCxXQUFXLEVBQUU7VUFDdEJELE9BQU8sQ0FBQ0MsV0FBVyxHQUFHLElBQUk7UUFDOUI7TUFDSixDQUFDLE1BQU07UUFDSHZCLFVBQVUsQ0FBQ3RPLFFBQVEsQ0FBQzBPLFVBQVUsQ0FBQyxHQUFHL0ksU0FBUyxDQUFDdnBCLE1BQU07UUFDbER1cEIsU0FBUyxDQUFDNXBCLElBQUksQ0FBQ2lrQixRQUFRLENBQUM7TUFDNUI7SUFDSjtFQUNKO0VBRUEsU0FBUzhQLGtCQUFrQkEsQ0FBQ3BVLEtBQUssRUFBRTtJQUMvQixPQUFPLFVBQUE1RCxFQUFFO01BQUEsT0FDTEEsRUFBRSxDQUFDSSxTQUFTLENBQUNmLEtBQUssQ0FBQyxDQUFDc1EsSUFBSSxDQUFDLFVBQUFzSSxHQUFHLEVBQUk7UUFDNUIsSUFDSXp3QixLQUFLLENBQUNLLE9BQU8sQ0FBQ293QixHQUFHLENBQUMsSUFDbEJBLEdBQUcsQ0FBQ3RJLElBQUksQ0FBQyxVQUFBdUksSUFBSTtVQUFBLE9BQUl4a0IsV0FBVyxDQUFDd2tCLElBQUksQ0FBQy9qQixFQUFFLENBQUMsS0FBS3lQLEtBQUs7UUFBQSxFQUFDLEVBQ2xEO1VBQ0U7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBLElBQUkxSCxrREFBTyxDQUFDOEQsRUFBRSxDQUFDa1gsVUFBVSxDQUFDUSxRQUFRLENBQUMsQ0FBQyxDQUFDcHpCLE1BQU0sRUFBRTtZQUN6QzBiLEVBQUUsQ0FBQytYLFdBQVcsR0FBRyxJQUFJO1lBQ3JCL1gsRUFBRSxDQUFDK0MsY0FBYyxHQUFHLENBQUMsQ0FBQztZQUN0QjZVLFdBQVcsQ0FBQzVYLEVBQUUsQ0FBQztVQUNuQjtVQUNBLE9BQU8sSUFBSTtRQUNmO1FBQ0EsT0FBTyxLQUFLO01BQ2hCLENBQUMsQ0FBQztJQUFBO0VBQ1Y7RUFFQSxTQUFTbVksV0FBV0EsQ0FBQ2hrQixFQUFFLEVBQUVpa0IsY0FBYyxFQUFFQyxhQUFhLEVBQUU7SUFDcEQsSUFBSUQsY0FBYyxFQUFFO01BQ2hCLEtBQUssSUFBTXhZLFFBQVEsSUFBSXdZLGNBQWMsRUFBRTtRQUNuQyxJQUFNcFksRUFBRSxHQUFHa1csbUJBQW1CLENBQUNsckIsTUFBTSxFQUFFcVUsS0FBSyxFQUFFbEwsRUFBRSxFQUFFeUwsUUFBUSxDQUFDO1FBQzNELElBQUlJLEVBQUUsRUFBRTtVQUNKO1VBQ0E7VUFDQTtVQUNBO1VBQ0EsSUFBSSxDQUFDQSxFQUFFLENBQUNrSSxRQUFRLENBQUNvUSxvQkFBb0IsRUFBRTtZQUNuQ3RZLEVBQUUsQ0FBQytYLFdBQVcsR0FBRyxJQUFJO1lBQ3JCSCxXQUFXLENBQUM1WCxFQUFFLENBQUM7VUFDbkI7UUFDSjtNQUNKO0lBQ0o7SUFDQSxJQUFJLENBQUN3WCxXQUFXLElBQUlhLGFBQWEsRUFBRTtNQUMvQixJQUFNRSxnQkFBZ0IsR0FBR2Qsc0JBQXNCLEdBQ3pDTyxrQkFBa0IsQ0FBQ3RrQixXQUFXLENBQUNTLEVBQUUsQ0FBQyxDQUFDLEdBQ25DeWpCLFdBQVc7TUFDakIsSUFBSVksa0JBQWtCLEdBQUdELGdCQUFnQjtNQUN6QyxJQUFJWixTQUFTLEVBQUU7UUFDWGEsa0JBQWtCLEdBQUcsU0FBQUEsbUJBQUF4WSxFQUFFLEVBQUk7VUFDdkIsSUFDSSxDQUFDMkssa0RBQUcsQ0FDQUssa0RBQVUsQ0FBQzJNLFNBQVMsQ0FBQyxFQUNyQnZiLGtEQUFLLENBQUMsTUFBTSxFQUFFRixrREFBTyxDQUFDOEQsRUFBRSxDQUFDa1gsVUFBVSxDQUFDN1gsS0FBSyxDQUFDLENBQUMsQ0FDL0MsQ0FBQyxFQUNIO1lBQ0VrWixnQkFBZ0IsQ0FBQ3ZZLEVBQUUsQ0FBQztVQUN4QjtRQUNKLENBQUM7TUFDTDtNQUNBLEtBQUssSUFBTUosU0FBUSxJQUFJeVksYUFBYSxFQUFFO1FBQ2xDbE4scUVBQW1CLENBQ2ZuZ0IsTUFBTSxFQUNOcVUsS0FBSyxFQUNMbEwsRUFBRSxFQUNGeUwsU0FBUSxFQUNSeUwsc0RBQ0osQ0FBQyxDQUFDaHBCLE9BQU8sQ0FBQ20yQixrQkFBa0IsQ0FBQztNQUNqQztJQUNKO0VBQ0o7RUFFQS9NLG1EQUFXLENBQUM2TCxXQUFXLEVBQUUsVUFBQW1CLEtBQUssRUFBSTtJQUM5QixJQUFNdGtCLEVBQUUsR0FBR3pELGtEQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUrbkIsS0FBSyxDQUFDO0lBQ3ZDLElBQUl0a0IsRUFBRSxFQUFFO01BQ0osSUFBSSxPQUFPQSxFQUFFLEtBQUssUUFBUSxJQUFJLENBQUNzakIsc0JBQXNCLEVBQUU7UUFDbkRVLFdBQVcsQ0FBQ2hrQixFQUFFLEVBQUVuSixNQUFNLENBQUN3bUIsU0FBUyxDQUFDcmQsRUFBRSxDQUFDLEVBQUVuSixNQUFNLENBQUN5bUIsUUFBUSxDQUFDdGQsRUFBRSxDQUFDLENBQUM7TUFDOUQsQ0FBQyxNQUFNO1FBQ0gsSUFBTTZaLE1BQU0sR0FBR3J1QixNQUFNLENBQUNzRixJQUFJLENBQUNrUCxFQUFFLENBQUMsQ0FBQzZZLElBQUksQ0FBQyxDQUFDLENBQUNsTixJQUFJLENBQUMsR0FBRyxDQUFDO1FBQy9DcVksV0FBVyxDQUNQaGtCLEVBQUUsRUFDRixDQUFDc2pCLHNCQUFzQixJQUFJenNCLE1BQU0sQ0FBQzBtQixjQUFjLENBQUMxRCxNQUFNLENBQUMsRUFDeERoakIsTUFBTSxDQUFDMm1CLGFBQWEsQ0FBQzNELE1BQU0sQ0FDL0IsQ0FBQztNQUNMO0lBQ0o7RUFDSixDQUFDLENBQUM7RUFFRixPQUFPdmQsaURBQUcsQ0FDTixVQUFBdVAsRUFBRTtJQUFBLE9BQUFqUixhQUFBLENBQUFBLGFBQUEsS0FDS2lSLEVBQUU7TUFDTDBZLFFBQVEsRUFBRXROLDZEQUFXLENBQUNwZ0IsTUFBTSxFQUFFcVUsS0FBSyxFQUFFVyxFQUFFO0lBQUM7RUFBQSxDQUMxQyxFQUNGNk4sU0FDSixDQUFDO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvdUNlO0FBZVM7QUFDUTtBQUV6QixJQUFNaUwsTUFBTSxHQUFHLENBQUM7QUFDaEIsSUFBTXpOLFFBQVEsR0FBRyxDQUFDO0FBQ2xCLElBQU1DLFFBQVEsR0FBR3FOLGlEQUFTLENBQUNJLElBQUksQ0FBQ0MsR0FBRyxDQUFDO0FBRXBDLElBQU05TixnQkFBZ0IsR0FBRyxTQUFuQkEsZ0JBQWdCQSxDQUFBcmIsSUFBQTtFQUFBLElBQUtzRSxFQUFFLEdBQUF0RSxJQUFBLENBQUZzRSxFQUFFO0lBQUV5TCxRQUFRLEdBQUEvUCxJQUFBLENBQVIrUCxRQUFRO0VBQUEsVUFBQWpVLE1BQUEsQ0FDdkMrSCwwREFBVyxDQUFDUyxFQUFFLENBQUMsT0FBQXhJLE1BQUEsQ0FBSWlVLFFBQVE7QUFBQSxDQUFFO0FBRTdCLFNBQVN1TCxtQkFBbUJBLENBQy9CbmdCLE1BQVcsRUFDWHFVLEtBQVUsRUFDVmxMLEVBQU8sRUFDUHVaLElBQVMsRUFDVHVMLFVBQWdCLEVBRUw7RUFBQSxJQURYQyxZQUFZLEdBQUF2eUIsU0FBQSxDQUFBckMsTUFBQSxRQUFBcUMsU0FBQSxRQUFBRyxTQUFBLEdBQUFILFNBQUEsTUFBRyxJQUFJO0VBRW5CLElBQU1zdkIsT0FBb0IsR0FBRyxFQUFFO0VBQy9CLElBQU12SyxTQUFTLEdBQUdSLGdCQUFnQixDQUFDO0lBQUMvVyxFQUFFO0lBQUV5TCxRQUFRLEVBQUU4TjtFQUFJLENBQUMsQ0FBQztFQUV4RCxJQUFJLE9BQU92WixFQUFFLEtBQUssUUFBUSxFQUFFO0lBQ3hCO0lBQ0EsSUFBTTBaLFNBQVMsR0FBRyxDQUFDN2lCLE1BQU0sQ0FBQ3ltQixRQUFRLENBQUN0ZCxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRXVaLElBQUksQ0FBQztJQUNuRCxJQUFJLENBQUNHLFNBQVMsRUFBRTtNQUNaLE9BQU8sRUFBRTtJQUNiO0lBRUFBLFNBQVMsQ0FBQ3hyQixPQUFPLENBQ2J3MEIsd0VBQXlCLENBQUNyTCxXQUFXLENBQUMsQ0FBQyxFQUFFbk0sS0FBSyxFQUFFNFcsT0FBTyxDQUMzRCxDQUFDO0VBQ0wsQ0FBQyxNQUFNO0lBQ0g7SUFDQSxJQUFNa0QsS0FBSyxHQUFHeDVCLE1BQU0sQ0FBQ3NGLElBQUksQ0FBQ2tQLEVBQUUsQ0FBQyxDQUFDNlksSUFBSSxDQUFDLENBQUM7SUFDcEMsSUFBTXNHLElBQUksR0FBRzFwQixpREFBSyxDQUFDdXZCLEtBQUssRUFBRWhsQixFQUFFLENBQUM7SUFDN0IsSUFBTTZaLE1BQU0sR0FBR21MLEtBQUssQ0FBQ3JaLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDOUIsSUFBTTJTLFFBQWUsR0FBRyxDQUFDem5CLE1BQU0sQ0FBQzJtQixhQUFhLENBQUMzRCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRU4sSUFBSSxDQUFDO0lBQ2xFLElBQUksQ0FBQytFLFFBQVEsRUFBRTtNQUNYLE9BQU8sRUFBRTtJQUNiO0lBQ0FBLFFBQVEsQ0FBQ3B3QixPQUFPLENBQUMsVUFBQSswQixPQUFPLEVBQUk7TUFDeEIsSUFBSTVCLHNEQUFPLENBQUMyRCxLQUFLLEVBQUU3RixJQUFJLEVBQUU4RCxPQUFPLENBQUNsMUIsTUFBTSxDQUFDLEVBQUU7UUFDdENrMUIsT0FBTyxDQUFDdkosU0FBUyxDQUFDeHJCLE9BQU8sQ0FDckJ3MEIsd0VBQXlCLENBQ3JCckwsV0FBVyxDQUFDMk4sS0FBSyxFQUFFN0YsSUFBSSxFQUFFOEQsT0FBTyxDQUFDbDFCLE1BQU0sQ0FBQyxFQUN4Q21kLEtBQUssRUFDTDRXLE9BQ0osQ0FDSixDQUFDO01BQ0w7SUFDSixDQUFDLENBQUM7RUFDTjtFQUNBQSxPQUFPLENBQUM1ekIsT0FBTyxDQUFDLFVBQUFva0IsS0FBSyxFQUFJO0lBQ3JCQSxLQUFLLENBQUMxRCxjQUFjLENBQUMySSxTQUFTLENBQUMsR0FBR3VOLFVBQVUsSUFBSUgsTUFBTTtJQUN0RCxJQUFJSSxZQUFZLEVBQUU7TUFDZHpTLEtBQUssQ0FBQ2lTLFFBQVEsR0FBR3ROLFdBQVcsQ0FBQ3BnQixNQUFNLEVBQUVxVSxLQUFLLEVBQUVvSCxLQUFLLENBQUM7SUFDdEQ7RUFDSixDQUFDLENBQUM7RUFDRixPQUFPd1AsT0FBTztBQUNsQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzdLLFdBQVdBLENBQ3ZCcGdCLE1BQVcsRUFDWHFVLEtBQVUsRUFDVjZJLFFBQW1CLEVBQ2I7RUFDTixJQUFJMkYsU0FBc0IsR0FBRyxDQUFDM0YsUUFBUSxDQUFDO0VBQ3ZDLElBQU1rUixjQUF3QyxHQUFHLENBQUMsQ0FBQztFQUNuRCxJQUFNQyxZQUFzQyxHQUFHLENBQUMsQ0FBQztFQUNqRCxJQUFNWCxRQUFrQixHQUFHLEVBQUU7RUFFN0IsT0FBTzdLLFNBQVMsQ0FBQ3ZwQixNQUFNLEVBQUU7SUFDckJ1cEIsU0FBUyxHQUFHcmQsaURBQU0sQ0FBQyxVQUFBbFEsQ0FBQyxFQUFJO01BQ3BCLElBQU1nNUIsT0FBTyxHQUFHRCxZQUFZLENBQUMvNEIsQ0FBQyxDQUFDczJCLFVBQVUsQ0FBQztNQUMxQ3lDLFlBQVksQ0FBQy80QixDQUFDLENBQUNzMkIsVUFBVSxDQUFDLEdBQUcsSUFBSTtNQUNqQyxPQUFPMEMsT0FBTztJQUNsQixDQUFDLEVBQUV6TCxTQUFTLENBQUM7SUFFYixJQUFNbE0sT0FBTyxHQUFHblIsaURBQU0sQ0FDbEIsVUFBQXpRLENBQUM7TUFBQSxPQUFJLENBQUNxNUIsY0FBYyxDQUFDbE8sZ0JBQWdCLENBQUNuckIsQ0FBQyxDQUFDLENBQUM7SUFBQSxHQUN6Q21jLGlEQUFPLENBQUN6TCxpREFBRyxDQUFDLFVBQUF1UCxFQUFFO01BQUEsT0FBSTlELGlEQUFPLENBQUM4RCxFQUFFLENBQUNrWCxVQUFVLENBQUM3WCxLQUFLLENBQUMsQ0FBQztJQUFBLEdBQUV3TyxTQUFTLENBQUMsQ0FDL0QsQ0FBQztJQUVEbE0sT0FBTyxDQUFDdGYsT0FBTyxDQUFDLFVBQUF0QyxDQUFDO01BQUEsT0FBS3E1QixjQUFjLENBQUNsTyxnQkFBZ0IsQ0FBQ25yQixDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUk7SUFBQSxDQUFDLENBQUM7SUFFbEU4dEIsU0FBUyxHQUFHM1IsaURBQU8sQ0FDZnpMLGlEQUFHLENBQ0MsVUFBQStULEtBQUE7TUFBQSxJQUFFclEsRUFBRSxHQUFBcVEsS0FBQSxDQUFGclEsRUFBRTtRQUFFeUwsUUFBUSxHQUFBNEUsS0FBQSxDQUFSNUUsUUFBUTtNQUFBLE9BQ1Z1TCxtQkFBbUIsQ0FDZm5nQixNQUFNLEVBQ05xVSxLQUFLLEVBQ0xsTCxFQUFFLEVBQ0Z5TCxRQUFRLEVBQ1J5TCxRQUFRLEVBQ1IsS0FDSixDQUFDO0lBQUEsR0FDTDFKLE9BQ0osQ0FDSixDQUFDO0lBRUQsSUFBSWtNLFNBQVMsQ0FBQ3ZwQixNQUFNLEVBQUU7TUFDbEJvMEIsUUFBUSxDQUFDejBCLElBQUksQ0FBQzRwQixTQUFTLENBQUN2cEIsTUFBTSxDQUFDO0lBQ25DO0VBQ0o7RUFFQW8wQixRQUFRLENBQUNhLE9BQU8sQ0FBQ2IsUUFBUSxDQUFDcDBCLE1BQU0sQ0FBQztFQUVqQyxPQUFPbU0saURBQUcsQ0FBQyxVQUFBdlEsQ0FBQztJQUFBLE9BQUk2NEIsSUFBSSxDQUFDUyxHQUFHLENBQUN0NUIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDcUgsUUFBUSxDQUFDLEVBQUUsQ0FBQztFQUFBLEdBQUVteEIsUUFBUSxDQUFDLENBQUM1WSxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3BFO0FBRU8sU0FBUzJaLGtDQUFrQ0EsQ0FDOUN6dUIsTUFBVyxFQUNYcVUsS0FBVSxFQUNWNkksUUFBbUIsRUFDckI7RUFDRSxJQUFJMkYsU0FBc0IsR0FBRyxDQUFDM0YsUUFBUSxDQUFDO0VBQ3ZDLElBQUlrUixjQUF3QyxHQUFHLENBQUMsQ0FBQzs7RUFFakQ7RUFDQSxPQUFPdkwsU0FBUyxDQUFDdnBCLE1BQU0sRUFBRTtJQUNyQjtJQUNBLElBQU1xZCxPQUFPLEdBQUduUixpREFBTSxDQUNsQixVQUFBelEsQ0FBQztNQUFBLE9BQUksQ0FBQ3E1QixjQUFjLENBQUNsTyxnQkFBZ0IsQ0FBQ25yQixDQUFDLENBQUMsQ0FBQztJQUFBLEdBQ3pDbWMsaURBQU8sQ0FBQ3pMLGlEQUFHLENBQUMsVUFBQXVQLEVBQUU7TUFBQSxPQUFJOUQsaURBQU8sQ0FBQzhELEVBQUUsQ0FBQ2tYLFVBQVUsQ0FBQzdYLEtBQUssQ0FBQyxDQUFDO0lBQUEsR0FBRXdPLFNBQVMsQ0FBQyxDQUMvRCxDQUFDO0lBRUR1TCxjQUFjLEdBQUdQLGlEQUFNLENBQ25CLFVBQUNTLE9BQU8sRUFBRXY1QixDQUFDO01BQUEsT0FBS3VTLGlEQUFLLENBQUM0WSxnQkFBZ0IsQ0FBQ25yQixDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUV1NUIsT0FBTyxDQUFDO0lBQUEsR0FDekRGLGNBQWMsRUFDZHpYLE9BQ0osQ0FBQztJQUVEa00sU0FBUyxHQUFHM1IsaURBQU8sQ0FDZnpMLGlEQUFHLENBQ0MsVUFBQWdVLEtBQUE7TUFBQSxJQUFFdFEsRUFBRSxHQUFBc1EsS0FBQSxDQUFGdFEsRUFBRTtRQUFFeUwsUUFBUSxHQUFBNkUsS0FBQSxDQUFSN0UsUUFBUTtNQUFBLE9BQ1Z1TCxtQkFBbUIsQ0FDZm5nQixNQUFNLEVBQ05xVSxLQUFLLEVBQ0xsTCxFQUFFLEVBQ0Z5TCxRQUFRLEVBQ1J5TCxRQUFRLEVBQ1IsS0FDSixDQUFDO0lBQUEsR0FDTDFKLE9BQ0osQ0FDSixDQUFDO0VBQ0w7RUFFQSxPQUFPeVgsY0FBYztBQUN6QjtBQUVPLElBQU1NLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBaUJBLENBQzFCcmEsS0FBVSxFQUNWc2EsVUFBdUIsRUFHVDtFQUFBLElBRmQ5TCxTQUFzQixHQUFBbG5CLFNBQUEsQ0FBQXJDLE1BQUEsUUFBQXFDLFNBQUEsUUFBQUcsU0FBQSxHQUFBSCxTQUFBLE1BQUdnekIsVUFBVTtFQUFBLElBQ25DM3VCLE1BQVcsR0FBQXJFLFNBQUEsQ0FBQXJDLE1BQUEsUUFBQXFDLFNBQUEsUUFBQUcsU0FBQSxHQUFBSCxTQUFBLE1BQUcsQ0FBQyxDQUFDO0VBRWhCO0VBQ0EsSUFBSSxDQUFDZ3pCLFVBQVUsQ0FBQ3IxQixNQUFNLEVBQUU7SUFDcEIsT0FBTyxFQUFFO0VBQ2I7O0VBRUE7RUFDQSxJQUFNcWQsT0FBTyxHQUFHbFIsaURBQUcsQ0FDZnlhLGdCQUFnQixFQUNoQjJOLGlEQUFNLENBQ0YsVUFBQzk0QixDQUFDLEVBQUVpZ0IsRUFBRTtJQUFBLE9BQUtyVSxpREFBTSxDQUFDNUwsQ0FBQyxFQUFFbWMsaURBQU8sQ0FBQzhELEVBQUUsQ0FBQ2tYLFVBQVUsQ0FBQzdYLEtBQUssQ0FBQyxDQUFDLENBQUM7RUFBQSxHQUNuRCxFQUFFLEVBQ0Z3TyxTQUNKLENBQ0osQ0FBQzs7RUFFRDtFQUNBLElBQUkrTCxVQUFvQyxHQUFHLENBQUMsQ0FBQztFQUM3Q2pZLE9BQU8sQ0FBQ3RmLE9BQU8sQ0FBQyxVQUFBZ2lCLE1BQU07SUFBQSxPQUFLdVYsVUFBVSxDQUFDdlYsTUFBTSxDQUFDLEdBQUcsSUFBSTtFQUFBLENBQUMsQ0FBQzs7RUFFdEQ7RUFDQTs7RUFFQSxJQUFJMWtCLE1BQU0sQ0FBQ3NGLElBQUksQ0FBQytGLE1BQU0sQ0FBQyxDQUFDMUcsTUFBTSxFQUFFO0lBQzVCO0lBQ0EsSUFBTXUxQixpQkFBNkMsR0FBRzNkLGlEQUFPLENBQ3pEekwsaURBQUcsQ0FDQyxVQUFBdVAsRUFBRTtNQUFBLE9BQUl5WixrQ0FBa0MsQ0FBQ3p1QixNQUFNLEVBQUVxVSxLQUFLLEVBQUVXLEVBQUUsQ0FBQztJQUFBLEdBQzNENk4sU0FDSixDQUNKLENBQUM7O0lBRUQ7SUFDQTtJQUNBLElBQUlnTSxpQkFBaUIsQ0FBQ3YxQixNQUFNLEdBQUcsQ0FBQyxFQUFFO01BQzlCczFCLFVBQVUsR0FBR2o2QixNQUFNLENBQUNtNkIsTUFBTSxDQUFBbHpCLEtBQUEsQ0FBYmpILE1BQU0sR0FDZms2QixpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBQWx1QixNQUFBLENBQUEySSxrQkFBQSxDQUNqQnVsQixpQkFBaUIsRUFDeEIsQ0FBQztJQUNMO0VBQ0o7O0VBRUE7RUFDQTtFQUNBLE9BQU9ycEIsaURBQU0sQ0FDVCxVQUFBd1AsRUFBRTtJQUFBLE9BQ0UySyxrREFBRyxDQUNDLFVBQUFvUCxHQUFHO01BQUEsT0FBSSxDQUFDSCxVQUFVLENBQUMxTyxnQkFBZ0IsQ0FBQzZPLEdBQUcsQ0FBQyxDQUFDO0lBQUEsR0FDekNsUCxrREFBVSxDQUNOM08saURBQU8sQ0FBQzhELEVBQUUsQ0FBQ0ksU0FBUyxDQUFDZixLQUFLLENBQUMsQ0FBQyxFQUM1Qm5ELGlEQUFPLENBQUM4RCxFQUFFLENBQUNrWCxVQUFVLENBQUM3WCxLQUFLLENBQUMsQ0FDaEMsQ0FDSixDQUFDO0VBQUEsR0FDTHNhLFVBQ0osQ0FBQztBQUNMLENBQUM7QUFFTSxJQUFNSyxrQkFBa0IsR0FBRyxTQUFyQkEsa0JBQWtCQSxDQUMzQmh2QixNQUFXLEVBQ1hxVSxLQUFVLEVBQ1ZwVixNQUFXLEVBQ1hnd0IsT0FBWSxFQUNFO0VBQ2QsSUFBSUMsVUFBb0IsR0FBRyxFQUFFO0VBQzdCLElBQUlyTSxTQUFTLEdBQUd3SiwyRUFBNEIsQ0FDeENyc0IsTUFBTSxFQUNOcVUsS0FBSyxFQUNMcFYsTUFBTSxFQUNOZ3dCLE9BQ0osQ0FBQzs7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFHSSxPQUFPLElBQUksRUFBRTtJQUNUO0lBQ0EsSUFBQUUsVUFBQSxHQUE2QnZCLGtEQUFTLENBQ2xDLFVBQUFuVCxLQUFBO1FBQUEsSUFBYTNVLE1BQU0sR0FBQTJVLEtBQUEsQ0FBakJ5QyxRQUFRLENBQUdwWCxNQUFNO1VBQUdzUCxTQUFTLEdBQUFxRixLQUFBLENBQVRyRixTQUFTO1FBQUEsT0FDM0J1SyxrREFBRyxDQUFDbE8sd0RBQWEsRUFBRTNMLE1BQU0sQ0FBQyxJQUMxQixDQUFDN0ksa0RBQU8sQ0FDSjRpQixrREFBVSxDQUNOcGEsaURBQUcsQ0FBQ3lhLGdCQUFnQixFQUFFaFAsaURBQU8sQ0FBQ2tFLFNBQVMsQ0FBQ2YsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNoRDZhLFVBQ0osQ0FDSixDQUFDO01BQUEsR0FDTHJNLFNBQ0osQ0FBQztNQUFBdU0sV0FBQSxHQUFBcnpCLGNBQUEsQ0FBQW96QixVQUFBO01BVk1FLFFBQVEsR0FBQUQsV0FBQTtNQUFFRSxRQUFRLEdBQUFGLFdBQUE7O0lBWXpCO0lBQ0EsSUFBSSxDQUFDRSxRQUFRLENBQUNoMkIsTUFBTSxFQUFFO01BQ2xCO0lBQ0o7SUFFQXVwQixTQUFTLEdBQUd3TSxRQUFROztJQUVwQjtJQUNBSCxVQUFVLEdBQUd2dUIsaURBQU0sQ0FDZnV1QixVQUFVLEVBQ1Z6cEIsaURBQUcsQ0FDQ3lhLGdCQUFnQixFQUNoQmhQLGlEQUFPLENBQUN6TCxpREFBRyxDQUFDLFVBQUFpVixLQUFBO01BQUEsSUFBRXdSLFVBQVUsR0FBQXhSLEtBQUEsQ0FBVndSLFVBQVU7TUFBQSxPQUFNQSxVQUFVLENBQUM3WCxLQUFLLENBQUM7SUFBQSxHQUFFaWIsUUFBUSxDQUFDLENBQzlELENBQ0osQ0FBQztFQUNMO0VBRUEsSUFBSUwsT0FBTyxDQUFDTSxVQUFVLEVBQUU7SUFDcEIsSUFBSUMsTUFBTSxHQUFHOXBCLGtEQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUV6RyxNQUFNLENBQUM7SUFDMUMsSUFBSXV3QixNQUFNLEVBQUU7TUFDUkEsTUFBTSxHQUFHOW1CLDBEQUFXLENBQUM4bUIsTUFBTSxDQUFDO01BQzVCO01BQ0EzTSxTQUFTLEdBQUdBLFNBQVMsQ0FBQ3JkLE1BQU0sQ0FBQyxVQUFBd1AsRUFBRTtRQUFBLE9BQzNCQSxFQUFFLENBQUNrSSxRQUFRLENBQUNwWCxNQUFNLENBQUMrbkIsTUFBTSxDQUNyQixVQUFDNEIsUUFBYSxFQUFFaGYsS0FBVTtVQUFBLE9BQ3RCZ2YsUUFBUSxJQUNQL21CLDBEQUFXLENBQUMrSCxLQUFLLENBQUN0SCxFQUFFLENBQUMsSUFBSXFtQixNQUFNLElBQzVCUCxPQUFPLENBQUNNLFVBQVUsQ0FBQ3Z5QixRQUFRLENBQUN5VCxLQUFLLENBQUNtRSxRQUFRLENBQUU7UUFBQSxHQUNwRCxLQUNKLENBQUM7TUFBQSxDQUNMLENBQUM7SUFDTDtFQUNKOztFQUVBO0FBQ0o7QUFDQTtFQUNJLElBQU04YSxjQUFjLEdBQUczQixJQUFJLENBQUM0QixNQUFNLENBQUMsQ0FBQyxDQUFDcHpCLFFBQVEsQ0FBQyxFQUFFLENBQUM7RUFDakQsT0FBT2tKLGlEQUFHLENBQUMsVUFBQXVQLEVBQUU7SUFBQSxPQUFBalIsYUFBQSxDQUFBQSxhQUFBLEtBQVNpUixFQUFFO01BQUUwYTtJQUFjO0VBQUEsQ0FBRSxFQUFFN00sU0FBUyxDQUFDO0FBQzFELENBQUM7QUFFTSxJQUFNK00sbUJBQW1CLEdBQUcsU0FBdEJBLG1CQUFtQkEsQ0FBQWpWLEtBQUE7RUFBQSxJQUM1Qm5HLE9BQU8sR0FBQW1HLEtBQUEsQ0FBUG5HLE9BQU87SUFBQXFiLGNBQUEsR0FBQWxWLEtBQUEsQ0FDUHVDLFFBQVE7SUFBR3BYLE1BQU0sR0FBQStwQixjQUFBLENBQU4vcEIsTUFBTTtJQUFFNlEsT0FBTyxHQUFBa1osY0FBQSxDQUFQbFosT0FBTztJQUFFalUsS0FBSyxHQUFBbXRCLGNBQUEsQ0FBTG50QixLQUFLO0VBQUEsT0FFakMvQixpREFBTSxDQUNGOEUsaURBQUcsQ0FBQ3lhLGdCQUFnQixLQUFBdmYsTUFBQSxDQUFBMkksa0JBQUEsQ0FBTXhELE1BQU0sR0FBQXdELGtCQUFBLENBQUtxTixPQUFPLEdBQUFyTixrQkFBQSxDQUFLNUcsS0FBSyxFQUFDLENBQUMsRUFDeERsRyxLQUFLLENBQUNLLE9BQU8sQ0FBQzJYLE9BQU8sQ0FBQyxHQUFHQSxPQUFPLEdBQUdBLE9BQU8sS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUNBLE9BQU8sQ0FDckUsQ0FBQyxDQUFDTSxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQUE7QUFFUixTQUFTZ2IsZ0JBQWdCQSxDQUM1QjNtQixFQUFPLEVBQ1A0bUIsVUFBZSxFQUNmL3ZCLE1BQVcsRUFDWHFVLEtBQVUsRUFDQztFQUNYLE9BQU9uRCxpREFBTyxDQUNWekwsaURBQUcsQ0FDQyxVQUFBbVUsUUFBUTtJQUFBLE9BQUl1RyxtQkFBbUIsQ0FBQ25nQixNQUFNLEVBQUVxVSxLQUFLLEVBQUVsTCxFQUFFLEVBQUV5USxRQUFRLENBQUM7RUFBQSxHQUM1RDNmLGtEQUFJLENBQUM4MUIsVUFBVSxDQUNuQixDQUNKLENBQUM7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFNeFAsb0JBQW9CLEdBQUcsU0FBdkJBLG9CQUFvQkEsQ0FDN0JyRCxRQUE2QixFQUM3QnpsQixPQUF3RSxFQUN4RStjLE9BQXVCO0VBQUEsT0FDRjtJQUNyQjBJLFFBQVE7SUFDUjFJLE9BQU87SUFDUG9YLFVBQVUsRUFBRTFPLFFBQVEsQ0FBQzdELE1BQU0sR0FBRzdFLE9BQU87SUFDckMwWCxVQUFVLEVBQUUsU0FBQUEsV0FBQTdYLEtBQUs7TUFBQSxPQUFJNkksUUFBUSxDQUFDdkcsT0FBTyxDQUFDbFIsR0FBRyxDQUFDaE8sT0FBTyxDQUFDNGMsS0FBSyxDQUFDLENBQUM7SUFBQTtJQUN6RGUsU0FBUyxFQUFFLFNBQUFBLFVBQUFmLEtBQUs7TUFBQSxPQUFJNkksUUFBUSxDQUFDcFgsTUFBTSxDQUFDTCxHQUFHLENBQUNoTyxPQUFPLENBQUM0YyxLQUFLLENBQUMsQ0FBQztJQUFBO0lBQ3ZEeE4sUUFBUSxFQUFFLFNBQUFBLFNBQUF3TixLQUFLO01BQUEsT0FBSTZJLFFBQVEsQ0FBQ3hhLEtBQUssQ0FBQytDLEdBQUcsQ0FBQ2hPLE9BQU8sQ0FBQzRjLEtBQUssQ0FBQyxDQUFDO0lBQUE7SUFDckQwRCxjQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQ2xCZ1YsV0FBVyxFQUFFO0VBQ2pCLENBQUM7QUFBQSxDQUFDO0FBRUssU0FBU2lELGNBQWNBLENBQzFCbk4sU0FBYyxFQUNkeE8sS0FBVSxFQUlaO0VBQ0UsSUFBQTRiLFdBQUEsR0FBb0JyQyxrREFBUyxDQUN6QixVQUFBaFQsS0FBQTtNQUFBLElBQUVzUixVQUFVLEdBQUF0UixLQUFBLENBQVZzUixVQUFVO1FBQWF2VixPQUFPLEdBQUFpRSxLQUFBLENBQWxCc0MsUUFBUSxDQUFHdkcsT0FBTztNQUFBLE9BQzVCekYsaURBQU8sQ0FBQ2diLFVBQVUsQ0FBQzdYLEtBQUssQ0FBQyxDQUFDLENBQUMvYSxNQUFNLEtBQUtxZCxPQUFPLENBQUNyZCxNQUFNO0lBQUEsR0FDeER1cEIsU0FDSixDQUFDO0lBQUFxTixXQUFBLEdBQUFuMEIsY0FBQSxDQUFBazBCLFdBQUE7SUFKUUUsT0FBTyxHQUFBRCxXQUFBO0VBTWhCLElBQUFFLFdBQUEsR0FBcUJ4QyxrREFBUyxDQUMxQixVQUFBN1EsS0FBQTtNQUFBLElBQUVtUCxVQUFVLEdBQUFuUCxLQUFBLENBQVZtUCxVQUFVO01BQUEsT0FBTSxDQUFDaGIsaURBQU8sQ0FBQ2diLFVBQVUsQ0FBQzdYLEtBQUssQ0FBQyxDQUFDLENBQUMvYSxNQUFNO0lBQUEsR0FDcEQ2MkIsT0FDSixDQUFDO0lBQUFFLFdBQUEsR0FBQXQwQixjQUFBLENBQUFxMEIsV0FBQTtJQUhRRSxRQUFRLEdBQUFELFdBQUE7RUFLakIsSUFBTUUsS0FBVSxHQUFHOXFCLGlEQUFHLENBQ2xCLFVBQUF1UCxFQUFFO0lBQUEsT0FDRTFOLGlEQUFLLENBQ0QsZ0JBQWdCLEVBQ2hCUyxrREFBTSxDQUNGLFVBQUM4UyxDQUFDLEVBQUUyVixNQUFNO01BQUEsT0FBSzFlLCtDQUFPLENBQUN1QyxLQUFLLEVBQUVzTiw2REFBYyxDQUFDNk8sTUFBTSxDQUFDLENBQUNybkIsRUFBRSxDQUFDO0lBQUEsR0FDeEQ2TCxFQUFFLENBQUMrQyxjQUNQLENBQUMsRUFDRC9DLEVBQ0osQ0FBQztFQUFBLEdBQ0xzYixRQUNKLENBQUM7RUFFRCxPQUFPO0lBQ0hDLEtBQUs7SUFDTEo7RUFDSixDQUFDO0FBQ0w7QUFFTyxTQUFTM1AsV0FBV0EsQ0FDdkJrSyxPQUFhLEVBQ2JDLE9BQWEsRUFDYkMsY0FBdUIsRUFDekI7RUFDRSxPQUFPLFVBQUN2VyxLQUFVO0lBQUEsT0FDZCxVQUFBd0osS0FBQSxFQUFrRDtNQUFBLElBQTVDNFMsU0FBUyxHQUFBNVMsS0FBQSxDQUFiMVUsRUFBRTtRQUFheUwsUUFBUSxHQUFBaUosS0FBQSxDQUFSakosUUFBUTtNQUNyQixJQUFJLE9BQU82YixTQUFTLEtBQUssUUFBUSxFQUFFO1FBQy9CLElBQU0vcUIsS0FBSSxHQUFHb00sK0NBQU8sQ0FBQ3VDLEtBQUssRUFBRW9jLFNBQVMsQ0FBQztRQUN0QyxPQUFPL3FCLEtBQUksR0FBRyxDQUFDO1VBQUN5RCxFQUFFLEVBQUVzbkIsU0FBUztVQUFFN2IsUUFBUTtVQUFFbFAsSUFBSSxFQUFKQTtRQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUU7TUFDeEQ7TUFDQSxJQUFNeW9CLEtBQUssR0FBR3g1QixNQUFNLENBQUNzRixJQUFJLENBQUN3MkIsU0FBUyxDQUFDLENBQUN6TyxJQUFJLENBQUMsQ0FBQztNQUMzQyxJQUFNeUksV0FBVyxHQUFHN3JCLGlEQUFLLENBQUN1dkIsS0FBSyxFQUFFc0MsU0FBUyxDQUFDO01BQzNDLElBQU16TixNQUFNLEdBQUdtTCxLQUFLLENBQUNyWixJQUFJLENBQUMsR0FBRyxDQUFDO01BQzlCLElBQU00YixRQUFRLEdBQUdyYyxLQUFLLENBQUN5QixJQUFJLENBQUNrTixNQUFNLENBQUM7TUFDbkMsSUFBSSxDQUFDME4sUUFBUSxFQUFFO1FBQ1gsT0FBTyxFQUFFO01BQ2I7TUFDQSxJQUFNM1osTUFBaUMsR0FBRyxFQUFFO01BQzVDMlosUUFBUSxDQUFDcjVCLE9BQU8sQ0FBQyxVQUFBK2dCLE1BQUEsRUFBK0I7UUFBQSxJQUFyQmtRLElBQUksR0FBQWxRLE1BQUEsQ0FBWmxoQixNQUFNO1VBQVF3TyxJQUFJLEdBQUEwUyxNQUFBLENBQUoxUyxJQUFJO1FBQ2pDLElBQ0k4a0Isc0RBQU8sQ0FDSDJELEtBQUssRUFDTDdGLElBQUksRUFDSm1DLFdBQVcsRUFDWEMsT0FBTyxFQUNQQyxPQUFPLEVBQ1BDLGNBQ0osQ0FBQyxFQUNIO1VBQ0U3VCxNQUFNLENBQUM5ZCxJQUFJLENBQUM7WUFBQ2tRLEVBQUUsRUFBRThXLGtEQUFNLENBQUNrTyxLQUFLLEVBQUU3RixJQUFJLENBQUM7WUFBRTFULFFBQVE7WUFBRWxQO1VBQUksQ0FBQyxDQUFDO1FBQzFEO01BQ0osQ0FBQyxDQUFDO01BQ0YsT0FBT3FSLE1BQU07SUFDakIsQ0FBQztFQUFBO0FBQ1Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytDQzdiQSxxSkFBQXhpQixtQkFBQSxZQUFBQSxvQkFBQSxXQUFBQyxDQUFBLFNBQUFDLENBQUEsRUFBQUQsQ0FBQSxPQUFBRSxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsU0FBQSxFQUFBQyxDQUFBLEdBQUFILENBQUEsQ0FBQUksY0FBQSxFQUFBQyxDQUFBLEdBQUFKLE1BQUEsQ0FBQUssY0FBQSxjQUFBUCxDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxJQUFBRCxDQUFBLENBQUFELENBQUEsSUFBQUUsQ0FBQSxDQUFBTyxLQUFBLEtBQUFDLENBQUEsd0JBQUFDLE1BQUEsR0FBQUEsTUFBQSxPQUFBQyxDQUFBLEdBQUFGLENBQUEsQ0FBQUcsUUFBQSxrQkFBQUMsQ0FBQSxHQUFBSixDQUFBLENBQUFLLGFBQUEsdUJBQUFDLENBQUEsR0FBQU4sQ0FBQSxDQUFBTyxXQUFBLDhCQUFBQyxPQUFBakIsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsV0FBQUMsTUFBQSxDQUFBSyxjQUFBLENBQUFQLENBQUEsRUFBQUQsQ0FBQSxJQUFBUyxLQUFBLEVBQUFQLENBQUEsRUFBQWlCLFVBQUEsTUFBQUMsWUFBQSxNQUFBQyxRQUFBLFNBQUFwQixDQUFBLENBQUFELENBQUEsV0FBQWtCLE1BQUEsbUJBQUFqQixDQUFBLElBQUFpQixNQUFBLFlBQUFBLE9BQUFqQixDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxXQUFBRCxDQUFBLENBQUFELENBQUEsSUFBQUUsQ0FBQSxnQkFBQW9CLEtBQUFyQixDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxFQUFBRyxDQUFBLFFBQUFLLENBQUEsR0FBQVYsQ0FBQSxJQUFBQSxDQUFBLENBQUFJLFNBQUEsWUFBQW1CLFNBQUEsR0FBQXZCLENBQUEsR0FBQXVCLFNBQUEsRUFBQVgsQ0FBQSxHQUFBVCxNQUFBLENBQUFxQixNQUFBLENBQUFkLENBQUEsQ0FBQU4sU0FBQSxHQUFBVSxDQUFBLE9BQUFXLE9BQUEsQ0FBQXBCLENBQUEsZ0JBQUFFLENBQUEsQ0FBQUssQ0FBQSxlQUFBSCxLQUFBLEVBQUFpQixnQkFBQSxDQUFBekIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFZLENBQUEsTUFBQUYsQ0FBQSxhQUFBZSxTQUFBMUIsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsbUJBQUEwQixJQUFBLFlBQUFDLEdBQUEsRUFBQTVCLENBQUEsQ0FBQTZCLElBQUEsQ0FBQTlCLENBQUEsRUFBQUUsQ0FBQSxjQUFBRCxDQUFBLGFBQUEyQixJQUFBLFdBQUFDLEdBQUEsRUFBQTVCLENBQUEsUUFBQUQsQ0FBQSxDQUFBc0IsSUFBQSxHQUFBQSxJQUFBLE1BQUFTLENBQUEscUJBQUFDLENBQUEscUJBQUFDLENBQUEsZ0JBQUFDLENBQUEsZ0JBQUFDLENBQUEsZ0JBQUFaLFVBQUEsY0FBQWEsa0JBQUEsY0FBQUMsMkJBQUEsU0FBQUMsQ0FBQSxPQUFBcEIsTUFBQSxDQUFBb0IsQ0FBQSxFQUFBMUIsQ0FBQSxxQ0FBQTJCLENBQUEsR0FBQXBDLE1BQUEsQ0FBQXFDLGNBQUEsRUFBQUMsQ0FBQSxHQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUEsQ0FBQSxDQUFBRyxNQUFBLFFBQUFELENBQUEsSUFBQUEsQ0FBQSxLQUFBdkMsQ0FBQSxJQUFBRyxDQUFBLENBQUF5QixJQUFBLENBQUFXLENBQUEsRUFBQTdCLENBQUEsTUFBQTBCLENBQUEsR0FBQUcsQ0FBQSxPQUFBRSxDQUFBLEdBQUFOLDBCQUFBLENBQUFqQyxTQUFBLEdBQUFtQixTQUFBLENBQUFuQixTQUFBLEdBQUFELE1BQUEsQ0FBQXFCLE1BQUEsQ0FBQWMsQ0FBQSxZQUFBTSxzQkFBQTNDLENBQUEsZ0NBQUE0QyxPQUFBLFdBQUE3QyxDQUFBLElBQUFrQixNQUFBLENBQUFqQixDQUFBLEVBQUFELENBQUEsWUFBQUMsQ0FBQSxnQkFBQTZDLE9BQUEsQ0FBQTlDLENBQUEsRUFBQUMsQ0FBQSxzQkFBQThDLGNBQUE5QyxDQUFBLEVBQUFELENBQUEsYUFBQWdELE9BQUE5QyxDQUFBLEVBQUFLLENBQUEsRUFBQUcsQ0FBQSxFQUFBRSxDQUFBLFFBQUFFLENBQUEsR0FBQWEsUUFBQSxDQUFBMUIsQ0FBQSxDQUFBQyxDQUFBLEdBQUFELENBQUEsRUFBQU0sQ0FBQSxtQkFBQU8sQ0FBQSxDQUFBYyxJQUFBLFFBQUFaLENBQUEsR0FBQUYsQ0FBQSxDQUFBZSxHQUFBLEVBQUFFLENBQUEsR0FBQWYsQ0FBQSxDQUFBUCxLQUFBLFNBQUFzQixDQUFBLHVCQUFBQSxDQUFBLElBQUExQixDQUFBLENBQUF5QixJQUFBLENBQUFDLENBQUEsZUFBQS9CLENBQUEsQ0FBQWlELE9BQUEsQ0FBQWxCLENBQUEsQ0FBQW1CLE9BQUEsRUFBQUMsSUFBQSxXQUFBbEQsQ0FBQSxJQUFBK0MsTUFBQSxTQUFBL0MsQ0FBQSxFQUFBUyxDQUFBLEVBQUFFLENBQUEsZ0JBQUFYLENBQUEsSUFBQStDLE1BQUEsVUFBQS9DLENBQUEsRUFBQVMsQ0FBQSxFQUFBRSxDQUFBLFFBQUFaLENBQUEsQ0FBQWlELE9BQUEsQ0FBQWxCLENBQUEsRUFBQW9CLElBQUEsV0FBQWxELENBQUEsSUFBQWUsQ0FBQSxDQUFBUCxLQUFBLEdBQUFSLENBQUEsRUFBQVMsQ0FBQSxDQUFBTSxDQUFBLGdCQUFBZixDQUFBLFdBQUErQyxNQUFBLFVBQUEvQyxDQUFBLEVBQUFTLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLENBQUFFLENBQUEsQ0FBQWUsR0FBQSxTQUFBM0IsQ0FBQSxFQUFBSyxDQUFBLG9CQUFBRSxLQUFBLFdBQUFBLE1BQUFSLENBQUEsRUFBQUksQ0FBQSxhQUFBK0MsMkJBQUEsZUFBQXBELENBQUEsV0FBQUEsQ0FBQSxFQUFBRSxDQUFBLElBQUE4QyxNQUFBLENBQUEvQyxDQUFBLEVBQUFJLENBQUEsRUFBQUwsQ0FBQSxFQUFBRSxDQUFBLGdCQUFBQSxDQUFBLEdBQUFBLENBQUEsR0FBQUEsQ0FBQSxDQUFBaUQsSUFBQSxDQUFBQywwQkFBQSxFQUFBQSwwQkFBQSxJQUFBQSwwQkFBQSxxQkFBQTFCLGlCQUFBMUIsQ0FBQSxFQUFBRSxDQUFBLEVBQUFHLENBQUEsUUFBQUUsQ0FBQSxHQUFBd0IsQ0FBQSxtQkFBQXJCLENBQUEsRUFBQUUsQ0FBQSxRQUFBTCxDQUFBLEtBQUEwQixDQUFBLFlBQUFvQixLQUFBLHNDQUFBOUMsQ0FBQSxLQUFBMkIsQ0FBQSxvQkFBQXhCLENBQUEsUUFBQUUsQ0FBQSxXQUFBSCxLQUFBLEVBQUFSLENBQUEsRUFBQXFELElBQUEsZUFBQWpELENBQUEsQ0FBQWtELE1BQUEsR0FBQTdDLENBQUEsRUFBQUwsQ0FBQSxDQUFBd0IsR0FBQSxHQUFBakIsQ0FBQSxVQUFBRSxDQUFBLEdBQUFULENBQUEsQ0FBQW1ELFFBQUEsTUFBQTFDLENBQUEsUUFBQUUsQ0FBQSxHQUFBeUMsbUJBQUEsQ0FBQTNDLENBQUEsRUFBQVQsQ0FBQSxPQUFBVyxDQUFBLFFBQUFBLENBQUEsS0FBQW1CLENBQUEsbUJBQUFuQixDQUFBLHFCQUFBWCxDQUFBLENBQUFrRCxNQUFBLEVBQUFsRCxDQUFBLENBQUFxRCxJQUFBLEdBQUFyRCxDQUFBLENBQUFzRCxLQUFBLEdBQUF0RCxDQUFBLENBQUF3QixHQUFBLHNCQUFBeEIsQ0FBQSxDQUFBa0QsTUFBQSxRQUFBaEQsQ0FBQSxLQUFBd0IsQ0FBQSxRQUFBeEIsQ0FBQSxHQUFBMkIsQ0FBQSxFQUFBN0IsQ0FBQSxDQUFBd0IsR0FBQSxFQUFBeEIsQ0FBQSxDQUFBdUQsaUJBQUEsQ0FBQXZELENBQUEsQ0FBQXdCLEdBQUEsdUJBQUF4QixDQUFBLENBQUFrRCxNQUFBLElBQUFsRCxDQUFBLENBQUF3RCxNQUFBLFdBQUF4RCxDQUFBLENBQUF3QixHQUFBLEdBQUF0QixDQUFBLEdBQUEwQixDQUFBLE1BQUFLLENBQUEsR0FBQVgsUUFBQSxDQUFBM0IsQ0FBQSxFQUFBRSxDQUFBLEVBQUFHLENBQUEsb0JBQUFpQyxDQUFBLENBQUFWLElBQUEsUUFBQXJCLENBQUEsR0FBQUYsQ0FBQSxDQUFBaUQsSUFBQSxHQUFBcEIsQ0FBQSxHQUFBRixDQUFBLEVBQUFNLENBQUEsQ0FBQVQsR0FBQSxLQUFBTSxDQUFBLHFCQUFBMUIsS0FBQSxFQUFBNkIsQ0FBQSxDQUFBVCxHQUFBLEVBQUF5QixJQUFBLEVBQUFqRCxDQUFBLENBQUFpRCxJQUFBLGtCQUFBaEIsQ0FBQSxDQUFBVixJQUFBLEtBQUFyQixDQUFBLEdBQUEyQixDQUFBLEVBQUE3QixDQUFBLENBQUFrRCxNQUFBLFlBQUFsRCxDQUFBLENBQUF3QixHQUFBLEdBQUFTLENBQUEsQ0FBQVQsR0FBQSxtQkFBQTRCLG9CQUFBekQsQ0FBQSxFQUFBRSxDQUFBLFFBQUFHLENBQUEsR0FBQUgsQ0FBQSxDQUFBcUQsTUFBQSxFQUFBaEQsQ0FBQSxHQUFBUCxDQUFBLENBQUFhLFFBQUEsQ0FBQVIsQ0FBQSxPQUFBRSxDQUFBLEtBQUFOLENBQUEsU0FBQUMsQ0FBQSxDQUFBc0QsUUFBQSxxQkFBQW5ELENBQUEsSUFBQUwsQ0FBQSxDQUFBYSxRQUFBLENBQUFpRCxNQUFBLEtBQUE1RCxDQUFBLENBQUFxRCxNQUFBLGFBQUFyRCxDQUFBLENBQUEyQixHQUFBLEdBQUE1QixDQUFBLEVBQUF3RCxtQkFBQSxDQUFBekQsQ0FBQSxFQUFBRSxDQUFBLGVBQUFBLENBQUEsQ0FBQXFELE1BQUEsa0JBQUFsRCxDQUFBLEtBQUFILENBQUEsQ0FBQXFELE1BQUEsWUFBQXJELENBQUEsQ0FBQTJCLEdBQUEsT0FBQWtDLFNBQUEsdUNBQUExRCxDQUFBLGlCQUFBOEIsQ0FBQSxNQUFBekIsQ0FBQSxHQUFBaUIsUUFBQSxDQUFBcEIsQ0FBQSxFQUFBUCxDQUFBLENBQUFhLFFBQUEsRUFBQVgsQ0FBQSxDQUFBMkIsR0FBQSxtQkFBQW5CLENBQUEsQ0FBQWtCLElBQUEsU0FBQTFCLENBQUEsQ0FBQXFELE1BQUEsWUFBQXJELENBQUEsQ0FBQTJCLEdBQUEsR0FBQW5CLENBQUEsQ0FBQW1CLEdBQUEsRUFBQTNCLENBQUEsQ0FBQXNELFFBQUEsU0FBQXJCLENBQUEsTUFBQXZCLENBQUEsR0FBQUYsQ0FBQSxDQUFBbUIsR0FBQSxTQUFBakIsQ0FBQSxHQUFBQSxDQUFBLENBQUEwQyxJQUFBLElBQUFwRCxDQUFBLENBQUFGLENBQUEsQ0FBQWdFLFVBQUEsSUFBQXBELENBQUEsQ0FBQUgsS0FBQSxFQUFBUCxDQUFBLENBQUErRCxJQUFBLEdBQUFqRSxDQUFBLENBQUFrRSxPQUFBLGVBQUFoRSxDQUFBLENBQUFxRCxNQUFBLEtBQUFyRCxDQUFBLENBQUFxRCxNQUFBLFdBQUFyRCxDQUFBLENBQUEyQixHQUFBLEdBQUE1QixDQUFBLEdBQUFDLENBQUEsQ0FBQXNELFFBQUEsU0FBQXJCLENBQUEsSUFBQXZCLENBQUEsSUFBQVYsQ0FBQSxDQUFBcUQsTUFBQSxZQUFBckQsQ0FBQSxDQUFBMkIsR0FBQSxPQUFBa0MsU0FBQSxzQ0FBQTdELENBQUEsQ0FBQXNELFFBQUEsU0FBQXJCLENBQUEsY0FBQWdDLGFBQUFsRSxDQUFBLFFBQUFELENBQUEsS0FBQW9FLE1BQUEsRUFBQW5FLENBQUEsWUFBQUEsQ0FBQSxLQUFBRCxDQUFBLENBQUFxRSxRQUFBLEdBQUFwRSxDQUFBLFdBQUFBLENBQUEsS0FBQUQsQ0FBQSxDQUFBc0UsVUFBQSxHQUFBckUsQ0FBQSxLQUFBRCxDQUFBLENBQUF1RSxRQUFBLEdBQUF0RSxDQUFBLFdBQUF1RSxVQUFBLENBQUFDLElBQUEsQ0FBQXpFLENBQUEsY0FBQTBFLGNBQUF6RSxDQUFBLFFBQUFELENBQUEsR0FBQUMsQ0FBQSxDQUFBMEUsVUFBQSxRQUFBM0UsQ0FBQSxDQUFBNEIsSUFBQSxvQkFBQTVCLENBQUEsQ0FBQTZCLEdBQUEsRUFBQTVCLENBQUEsQ0FBQTBFLFVBQUEsR0FBQTNFLENBQUEsYUFBQXlCLFFBQUF4QixDQUFBLFNBQUF1RSxVQUFBLE1BQUFKLE1BQUEsYUFBQW5FLENBQUEsQ0FBQTRDLE9BQUEsQ0FBQXNCLFlBQUEsY0FBQVMsS0FBQSxpQkFBQWxDLE9BQUExQyxDQUFBLFFBQUFBLENBQUEsV0FBQUEsQ0FBQSxRQUFBRSxDQUFBLEdBQUFGLENBQUEsQ0FBQVksQ0FBQSxPQUFBVixDQUFBLFNBQUFBLENBQUEsQ0FBQTRCLElBQUEsQ0FBQTlCLENBQUEsNEJBQUFBLENBQUEsQ0FBQWlFLElBQUEsU0FBQWpFLENBQUEsT0FBQTZFLEtBQUEsQ0FBQTdFLENBQUEsQ0FBQThFLE1BQUEsU0FBQXZFLENBQUEsT0FBQUcsQ0FBQSxZQUFBdUQsS0FBQSxhQUFBMUQsQ0FBQSxHQUFBUCxDQUFBLENBQUE4RSxNQUFBLE9BQUF6RSxDQUFBLENBQUF5QixJQUFBLENBQUE5QixDQUFBLEVBQUFPLENBQUEsVUFBQTBELElBQUEsQ0FBQXhELEtBQUEsR0FBQVQsQ0FBQSxDQUFBTyxDQUFBLEdBQUEwRCxJQUFBLENBQUFYLElBQUEsT0FBQVcsSUFBQSxTQUFBQSxJQUFBLENBQUF4RCxLQUFBLEdBQUFSLENBQUEsRUFBQWdFLElBQUEsQ0FBQVgsSUFBQSxPQUFBVyxJQUFBLFlBQUF2RCxDQUFBLENBQUF1RCxJQUFBLEdBQUF2RCxDQUFBLGdCQUFBcUQsU0FBQSxRQUFBL0QsQ0FBQSxpQ0FBQW9DLGlCQUFBLENBQUFoQyxTQUFBLEdBQUFpQywwQkFBQSxFQUFBOUIsQ0FBQSxDQUFBb0MsQ0FBQSxtQkFBQWxDLEtBQUEsRUFBQTRCLDBCQUFBLEVBQUFqQixZQUFBLFNBQUFiLENBQUEsQ0FBQThCLDBCQUFBLG1CQUFBNUIsS0FBQSxFQUFBMkIsaUJBQUEsRUFBQWhCLFlBQUEsU0FBQWdCLGlCQUFBLENBQUEyQyxXQUFBLEdBQUE3RCxNQUFBLENBQUFtQiwwQkFBQSxFQUFBckIsQ0FBQSx3QkFBQWhCLENBQUEsQ0FBQWdGLG1CQUFBLGFBQUEvRSxDQUFBLFFBQUFELENBQUEsd0JBQUFDLENBQUEsSUFBQUEsQ0FBQSxDQUFBZ0YsV0FBQSxXQUFBakYsQ0FBQSxLQUFBQSxDQUFBLEtBQUFvQyxpQkFBQSw2QkFBQXBDLENBQUEsQ0FBQStFLFdBQUEsSUFBQS9FLENBQUEsQ0FBQWtGLElBQUEsT0FBQWxGLENBQUEsQ0FBQW1GLElBQUEsYUFBQWxGLENBQUEsV0FBQUUsTUFBQSxDQUFBaUYsY0FBQSxHQUFBakYsTUFBQSxDQUFBaUYsY0FBQSxDQUFBbkYsQ0FBQSxFQUFBb0MsMEJBQUEsS0FBQXBDLENBQUEsQ0FBQW9GLFNBQUEsR0FBQWhELDBCQUFBLEVBQUFuQixNQUFBLENBQUFqQixDQUFBLEVBQUFlLENBQUEseUJBQUFmLENBQUEsQ0FBQUcsU0FBQSxHQUFBRCxNQUFBLENBQUFxQixNQUFBLENBQUFtQixDQUFBLEdBQUExQyxDQUFBLEtBQUFELENBQUEsQ0FBQXNGLEtBQUEsYUFBQXJGLENBQUEsYUFBQWlELE9BQUEsRUFBQWpELENBQUEsT0FBQTJDLHFCQUFBLENBQUFHLGFBQUEsQ0FBQTNDLFNBQUEsR0FBQWMsTUFBQSxDQUFBNkIsYUFBQSxDQUFBM0MsU0FBQSxFQUFBVSxDQUFBLGlDQUFBZCxDQUFBLENBQUErQyxhQUFBLEdBQUFBLGFBQUEsRUFBQS9DLENBQUEsQ0FBQXVGLEtBQUEsYUFBQXRGLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFFLENBQUEsRUFBQUcsQ0FBQSxlQUFBQSxDQUFBLEtBQUFBLENBQUEsR0FBQThFLE9BQUEsT0FBQTVFLENBQUEsT0FBQW1DLGFBQUEsQ0FBQXpCLElBQUEsQ0FBQXJCLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFFLENBQUEsR0FBQUcsQ0FBQSxVQUFBVixDQUFBLENBQUFnRixtQkFBQSxDQUFBOUUsQ0FBQSxJQUFBVSxDQUFBLEdBQUFBLENBQUEsQ0FBQXFELElBQUEsR0FBQWQsSUFBQSxXQUFBbEQsQ0FBQSxXQUFBQSxDQUFBLENBQUFxRCxJQUFBLEdBQUFyRCxDQUFBLENBQUFRLEtBQUEsR0FBQUcsQ0FBQSxDQUFBcUQsSUFBQSxXQUFBckIscUJBQUEsQ0FBQUQsQ0FBQSxHQUFBekIsTUFBQSxDQUFBeUIsQ0FBQSxFQUFBM0IsQ0FBQSxnQkFBQUUsTUFBQSxDQUFBeUIsQ0FBQSxFQUFBL0IsQ0FBQSxpQ0FBQU0sTUFBQSxDQUFBeUIsQ0FBQSw2REFBQTNDLENBQUEsQ0FBQXlGLElBQUEsYUFBQXhGLENBQUEsUUFBQUQsQ0FBQSxHQUFBRyxNQUFBLENBQUFGLENBQUEsR0FBQUMsQ0FBQSxnQkFBQUcsQ0FBQSxJQUFBTCxDQUFBLEVBQUFFLENBQUEsQ0FBQXVFLElBQUEsQ0FBQXBFLENBQUEsVUFBQUgsQ0FBQSxDQUFBd0YsT0FBQSxhQUFBekIsS0FBQSxXQUFBL0QsQ0FBQSxDQUFBNEUsTUFBQSxTQUFBN0UsQ0FBQSxHQUFBQyxDQUFBLENBQUF5RixHQUFBLFFBQUExRixDQUFBLElBQUFELENBQUEsU0FBQWlFLElBQUEsQ0FBQXhELEtBQUEsR0FBQVIsQ0FBQSxFQUFBZ0UsSUFBQSxDQUFBWCxJQUFBLE9BQUFXLElBQUEsV0FBQUEsSUFBQSxDQUFBWCxJQUFBLE9BQUFXLElBQUEsUUFBQWpFLENBQUEsQ0FBQTBDLE1BQUEsR0FBQUEsTUFBQSxFQUFBakIsT0FBQSxDQUFBckIsU0FBQSxLQUFBNkUsV0FBQSxFQUFBeEQsT0FBQSxFQUFBbUQsS0FBQSxXQUFBQSxNQUFBNUUsQ0FBQSxhQUFBNEYsSUFBQSxXQUFBM0IsSUFBQSxXQUFBUCxJQUFBLFFBQUFDLEtBQUEsR0FBQTFELENBQUEsT0FBQXFELElBQUEsWUFBQUUsUUFBQSxjQUFBRCxNQUFBLGdCQUFBMUIsR0FBQSxHQUFBNUIsQ0FBQSxPQUFBdUUsVUFBQSxDQUFBM0IsT0FBQSxDQUFBNkIsYUFBQSxJQUFBMUUsQ0FBQSxXQUFBRSxDQUFBLGtCQUFBQSxDQUFBLENBQUEyRixNQUFBLE9BQUF4RixDQUFBLENBQUF5QixJQUFBLE9BQUE1QixDQUFBLE1BQUEyRSxLQUFBLEVBQUEzRSxDQUFBLENBQUE0RixLQUFBLGNBQUE1RixDQUFBLElBQUFELENBQUEsTUFBQThGLElBQUEsV0FBQUEsS0FBQSxTQUFBekMsSUFBQSxXQUFBckQsQ0FBQSxRQUFBdUUsVUFBQSxJQUFBRyxVQUFBLGtCQUFBMUUsQ0FBQSxDQUFBMkIsSUFBQSxRQUFBM0IsQ0FBQSxDQUFBNEIsR0FBQSxjQUFBbUUsSUFBQSxLQUFBcEMsaUJBQUEsV0FBQUEsa0JBQUE1RCxDQUFBLGFBQUFzRCxJQUFBLFFBQUF0RCxDQUFBLE1BQUFFLENBQUEsa0JBQUErRixPQUFBNUYsQ0FBQSxFQUFBRSxDQUFBLFdBQUFLLENBQUEsQ0FBQWdCLElBQUEsWUFBQWhCLENBQUEsQ0FBQWlCLEdBQUEsR0FBQTdCLENBQUEsRUFBQUUsQ0FBQSxDQUFBK0QsSUFBQSxHQUFBNUQsQ0FBQSxFQUFBRSxDQUFBLEtBQUFMLENBQUEsQ0FBQXFELE1BQUEsV0FBQXJELENBQUEsQ0FBQTJCLEdBQUEsR0FBQTVCLENBQUEsS0FBQU0sQ0FBQSxhQUFBQSxDQUFBLFFBQUFpRSxVQUFBLENBQUFNLE1BQUEsTUFBQXZFLENBQUEsU0FBQUEsQ0FBQSxRQUFBRyxDQUFBLFFBQUE4RCxVQUFBLENBQUFqRSxDQUFBLEdBQUFLLENBQUEsR0FBQUYsQ0FBQSxDQUFBaUUsVUFBQSxpQkFBQWpFLENBQUEsQ0FBQTBELE1BQUEsU0FBQTZCLE1BQUEsYUFBQXZGLENBQUEsQ0FBQTBELE1BQUEsU0FBQXdCLElBQUEsUUFBQTlFLENBQUEsR0FBQVQsQ0FBQSxDQUFBeUIsSUFBQSxDQUFBcEIsQ0FBQSxlQUFBTSxDQUFBLEdBQUFYLENBQUEsQ0FBQXlCLElBQUEsQ0FBQXBCLENBQUEscUJBQUFJLENBQUEsSUFBQUUsQ0FBQSxhQUFBNEUsSUFBQSxHQUFBbEYsQ0FBQSxDQUFBMkQsUUFBQSxTQUFBNEIsTUFBQSxDQUFBdkYsQ0FBQSxDQUFBMkQsUUFBQSxnQkFBQXVCLElBQUEsR0FBQWxGLENBQUEsQ0FBQTRELFVBQUEsU0FBQTJCLE1BQUEsQ0FBQXZGLENBQUEsQ0FBQTRELFVBQUEsY0FBQXhELENBQUEsYUFBQThFLElBQUEsR0FBQWxGLENBQUEsQ0FBQTJELFFBQUEsU0FBQTRCLE1BQUEsQ0FBQXZGLENBQUEsQ0FBQTJELFFBQUEscUJBQUFyRCxDQUFBLFlBQUFxQyxLQUFBLHFEQUFBdUMsSUFBQSxHQUFBbEYsQ0FBQSxDQUFBNEQsVUFBQSxTQUFBMkIsTUFBQSxDQUFBdkYsQ0FBQSxDQUFBNEQsVUFBQSxZQUFBVCxNQUFBLFdBQUFBLE9BQUE1RCxDQUFBLEVBQUFELENBQUEsYUFBQUUsQ0FBQSxRQUFBc0UsVUFBQSxDQUFBTSxNQUFBLE1BQUE1RSxDQUFBLFNBQUFBLENBQUEsUUFBQUssQ0FBQSxRQUFBaUUsVUFBQSxDQUFBdEUsQ0FBQSxPQUFBSyxDQUFBLENBQUE2RCxNQUFBLFNBQUF3QixJQUFBLElBQUF2RixDQUFBLENBQUF5QixJQUFBLENBQUF2QixDQUFBLHdCQUFBcUYsSUFBQSxHQUFBckYsQ0FBQSxDQUFBK0QsVUFBQSxRQUFBNUQsQ0FBQSxHQUFBSCxDQUFBLGFBQUFHLENBQUEsaUJBQUFULENBQUEsbUJBQUFBLENBQUEsS0FBQVMsQ0FBQSxDQUFBMEQsTUFBQSxJQUFBcEUsQ0FBQSxJQUFBQSxDQUFBLElBQUFVLENBQUEsQ0FBQTRELFVBQUEsS0FBQTVELENBQUEsY0FBQUUsQ0FBQSxHQUFBRixDQUFBLEdBQUFBLENBQUEsQ0FBQWlFLFVBQUEsY0FBQS9ELENBQUEsQ0FBQWdCLElBQUEsR0FBQTNCLENBQUEsRUFBQVcsQ0FBQSxDQUFBaUIsR0FBQSxHQUFBN0IsQ0FBQSxFQUFBVSxDQUFBLFNBQUE2QyxNQUFBLGdCQUFBVSxJQUFBLEdBQUF2RCxDQUFBLENBQUE0RCxVQUFBLEVBQUFuQyxDQUFBLFNBQUErRCxRQUFBLENBQUF0RixDQUFBLE1BQUFzRixRQUFBLFdBQUFBLFNBQUFqRyxDQUFBLEVBQUFELENBQUEsb0JBQUFDLENBQUEsQ0FBQTJCLElBQUEsUUFBQTNCLENBQUEsQ0FBQTRCLEdBQUEscUJBQUE1QixDQUFBLENBQUEyQixJQUFBLG1CQUFBM0IsQ0FBQSxDQUFBMkIsSUFBQSxRQUFBcUMsSUFBQSxHQUFBaEUsQ0FBQSxDQUFBNEIsR0FBQSxnQkFBQTVCLENBQUEsQ0FBQTJCLElBQUEsU0FBQW9FLElBQUEsUUFBQW5FLEdBQUEsR0FBQTVCLENBQUEsQ0FBQTRCLEdBQUEsT0FBQTBCLE1BQUEsa0JBQUFVLElBQUEseUJBQUFoRSxDQUFBLENBQUEyQixJQUFBLElBQUE1QixDQUFBLFVBQUFpRSxJQUFBLEdBQUFqRSxDQUFBLEdBQUFtQyxDQUFBLEtBQUFnRSxNQUFBLFdBQUFBLE9BQUFsRyxDQUFBLGFBQUFELENBQUEsUUFBQXdFLFVBQUEsQ0FBQU0sTUFBQSxNQUFBOUUsQ0FBQSxTQUFBQSxDQUFBLFFBQUFFLENBQUEsUUFBQXNFLFVBQUEsQ0FBQXhFLENBQUEsT0FBQUUsQ0FBQSxDQUFBb0UsVUFBQSxLQUFBckUsQ0FBQSxjQUFBaUcsUUFBQSxDQUFBaEcsQ0FBQSxDQUFBeUUsVUFBQSxFQUFBekUsQ0FBQSxDQUFBcUUsUUFBQSxHQUFBRyxhQUFBLENBQUF4RSxDQUFBLEdBQUFpQyxDQUFBLE9BQUFpRSxLQUFBLFdBQUFDLE9BQUFwRyxDQUFBLGFBQUFELENBQUEsUUFBQXdFLFVBQUEsQ0FBQU0sTUFBQSxNQUFBOUUsQ0FBQSxTQUFBQSxDQUFBLFFBQUFFLENBQUEsUUFBQXNFLFVBQUEsQ0FBQXhFLENBQUEsT0FBQUUsQ0FBQSxDQUFBa0UsTUFBQSxLQUFBbkUsQ0FBQSxRQUFBSSxDQUFBLEdBQUFILENBQUEsQ0FBQXlFLFVBQUEsa0JBQUF0RSxDQUFBLENBQUF1QixJQUFBLFFBQUFyQixDQUFBLEdBQUFGLENBQUEsQ0FBQXdCLEdBQUEsRUFBQTZDLGFBQUEsQ0FBQXhFLENBQUEsWUFBQUssQ0FBQSxnQkFBQThDLEtBQUEsOEJBQUFpRCxhQUFBLFdBQUFBLGNBQUF0RyxDQUFBLEVBQUFFLENBQUEsRUFBQUcsQ0FBQSxnQkFBQW1ELFFBQUEsS0FBQTNDLFFBQUEsRUFBQTZCLE1BQUEsQ0FBQTFDLENBQUEsR0FBQWdFLFVBQUEsRUFBQTlELENBQUEsRUFBQWdFLE9BQUEsRUFBQTdELENBQUEsb0JBQUFrRCxNQUFBLFVBQUExQixHQUFBLEdBQUE1QixDQUFBLEdBQUFrQyxDQUFBLE9BQUFuQyxDQUFBO0FBQUEsU0FBQXVHLG1CQUFBQyxHQUFBLEVBQUF2RCxPQUFBLEVBQUF3RCxNQUFBLEVBQUFDLEtBQUEsRUFBQUMsTUFBQSxFQUFBQyxHQUFBLEVBQUEvRSxHQUFBLGNBQUFnRixJQUFBLEdBQUFMLEdBQUEsQ0FBQUksR0FBQSxFQUFBL0UsR0FBQSxPQUFBcEIsS0FBQSxHQUFBb0csSUFBQSxDQUFBcEcsS0FBQSxXQUFBcUcsS0FBQSxJQUFBTCxNQUFBLENBQUFLLEtBQUEsaUJBQUFELElBQUEsQ0FBQXZELElBQUEsSUFBQUwsT0FBQSxDQUFBeEMsS0FBQSxZQUFBK0UsT0FBQSxDQUFBdkMsT0FBQSxDQUFBeEMsS0FBQSxFQUFBMEMsSUFBQSxDQUFBdUQsS0FBQSxFQUFBQyxNQUFBO0FBQUEsU0FBQUksa0JBQUFDLEVBQUEsNkJBQUFDLElBQUEsU0FBQUMsSUFBQSxHQUFBQyxTQUFBLGFBQUEzQixPQUFBLFdBQUF2QyxPQUFBLEVBQUF3RCxNQUFBLFFBQUFELEdBQUEsR0FBQVEsRUFBQSxDQUFBSSxLQUFBLENBQUFILElBQUEsRUFBQUMsSUFBQSxZQUFBUixNQUFBakcsS0FBQSxJQUFBOEYsa0JBQUEsQ0FBQUMsR0FBQSxFQUFBdkQsT0FBQSxFQUFBd0QsTUFBQSxFQUFBQyxLQUFBLEVBQUFDLE1BQUEsVUFBQWxHLEtBQUEsY0FBQWtHLE9BQUFVLEdBQUEsSUFBQWQsa0JBQUEsQ0FBQUMsR0FBQSxFQUFBdkQsT0FBQSxFQUFBd0QsTUFBQSxFQUFBQyxLQUFBLEVBQUFDLE1BQUEsV0FBQVUsR0FBQSxLQUFBWCxLQUFBLENBQUFZLFNBQUE7QUFEMkI7QUFDZ0I7QUFDTztBQUNBO0FBQ1o7QUFDVjtBQUM2QjtBQUNjO0FBQ3ZDO0FBRXpCLElBQU04QixPQUFPLEdBQUcrVCx5REFBWSxDQUFDNE4scURBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNuRCxJQUFNcVIsZUFBZSxHQUFHamYseURBQVksQ0FBQzROLHFEQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUNwRSxJQUFNdGMsU0FBUyxHQUFHME8seURBQVksQ0FBQzROLHFEQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDdkQsSUFBTTdSLGNBQWMsR0FBR2lFLHlEQUFZLENBQUM0TixxREFBUyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDbEUsSUFBTTFoQixTQUFTLEdBQUc4VCx5REFBWSxDQUFDNE4scURBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN2RCxJQUFNdmMsUUFBUSxHQUFHMk8seURBQVksQ0FBQzROLHFEQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDckQsSUFBTXhoQixTQUFTLEdBQUc0VCx5REFBWSxDQUFDNE4scURBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN2RCxJQUFNemhCLFFBQVEsR0FBRzZULHlEQUFZLENBQUM0TixxREFBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3JELElBQU1zUixlQUFlLEdBQUdsZix5REFBWSxDQUFDNE4scURBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQ3BFLElBQU1uWCxXQUFXLEdBQUd1Six5REFBWSxDQUFDNE4scURBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTdELElBQU03aEIsYUFBYSxHQUFHLFNBQWhCQSxhQUFhQSxDQUFHb0MsUUFBUTtFQUFBLE9BQUksVUFBQ2lQLE9BQU8sRUFBRWlaLEtBQUs7SUFBQSxPQUNwRGxvQixRQUFRLENBQ0psQyxPQUFPLENBQUM7TUFDSnhILElBQUksRUFBRSxTQUFTO01BQ2ZrRixLQUFLLEVBQUU7UUFBQ3lULE9BQU87UUFBRStoQixJQUFJLEVBQUU5SSxLQUFLLENBQUNsVCxJQUFJLENBQUMsSUFBSTtNQUFDO0lBQzNDLENBQUMsQ0FDTCxDQUFDO0VBQUE7QUFBQTtBQUVFLFNBQVNuWCxxQkFBcUJBLENBQUEsRUFBRztFQUNwQyxPQUFPLFVBQVVtQyxRQUFRLEVBQUUrRyxRQUFRLEVBQUU7SUFDakNvZix3RUFBeUIsQ0FBQ3BmLFFBQVEsQ0FBQyxDQUFDLEVBQUVuSixhQUFhLENBQUNvQyxRQUFRLENBQUMsQ0FBQztJQUM5RGl4QixtQkFBbUIsQ0FBQ2p4QixRQUFRLEVBQUUrRyxRQUFRLENBQUM7SUFDdkMvRyxRQUFRLENBQUM4d0IsZUFBZSxDQUFDdnlCLGdFQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztFQUN0RCxDQUFDO0FBQ0w7O0FBRUE7QUFDQSxJQUFNeVAsY0FBYyxHQUFHUCxpREFBSSxDQUFDUSxPQUFPLENBQUNDLElBQUksQ0FBQztBQUVsQyxTQUFTUixhQUFhQSxDQUFBLEVBQUc7RUFDNUIsSUFBSTtJQUNBLE9BQU87TUFDSCxhQUFhLEVBQUVtakIseUNBQVksQ0FBQ3ZyQixRQUFRLENBQUN1ckIsTUFBTSxDQUFDLENBQUNLO0lBQ2pELENBQUM7RUFDTCxDQUFDLENBQUMsT0FBT3g4QixDQUFDLEVBQUU7SUFDUnNaLGNBQWMsQ0FBQ3RaLENBQUMsQ0FBQztJQUNqQixPQUFPLENBQUMsQ0FBQztFQUNiO0FBQ0o7QUFFQSxTQUFTdThCLG1CQUFtQkEsQ0FBQ2p4QixRQUFRLEVBQUUrRyxRQUFRLEVBQUU7RUFDN0MsSUFBQTRELFNBQUEsR0FBZ0M1RCxRQUFRLENBQUMsQ0FBQztJQUFuQzdHLE1BQU0sR0FBQXlLLFNBQUEsQ0FBTnpLLE1BQU07SUFBRXFVLEtBQUssR0FBQTVKLFNBQUEsQ0FBTDRKLEtBQUs7SUFBRXBWLE1BQU0sR0FBQXdMLFNBQUEsQ0FBTnhMLE1BQU07O0VBRTVCO0VBQ0EsSUFBSTtJQUNBZSxNQUFNLENBQUNrb0IsVUFBVSxDQUFDK0ksWUFBWSxDQUFDLENBQUM7RUFDcEMsQ0FBQyxDQUFDLE9BQU9wMUIsR0FBRyxFQUFFO0lBQ1ZpRSxRQUFRLENBQ0psQyxPQUFPLENBQUM7TUFDSnhILElBQUksRUFBRSxTQUFTO01BQ2ZrRixLQUFLLEVBQUU7UUFDSHlULE9BQU8sRUFBRSx1QkFBdUI7UUFDaEMraEIsSUFBSSxFQUFFajFCLEdBQUcsQ0FBQ1UsUUFBUSxDQUFDO01BQ3ZCO0lBQ0osQ0FBQyxDQUNMLENBQUM7RUFDTDtFQUVBdUQsUUFBUSxDQUNKNFMsaUVBQXFCLENBQ2pCc2Msb0VBQWtCLENBQUNodkIsTUFBTSxFQUFFcVUsS0FBSyxFQUFFcFYsTUFBTSxFQUFFO0lBQ3RDdXRCLFdBQVcsRUFBRTtFQUNqQixDQUFDLENBQ0wsQ0FDSixDQUFDO0FBQ0w7QUFFTyxJQUFNMEUsSUFBSSxHQUFHQyxXQUFXLENBQUMsTUFBTSxDQUFDO0FBQ2hDLElBQU1DLElBQUksR0FBR0QsV0FBVyxDQUFDLE1BQU0sQ0FBQztBQUNoQyxJQUFNRSxNQUFNLEdBQUdGLFdBQVcsQ0FBQyxRQUFRLENBQUM7QUFFM0MsU0FBU0EsV0FBV0EsQ0FBQ2xELFVBQVUsRUFBRTtFQUM3QixPQUFPLFVBQVVudUIsUUFBUSxFQUFFK0csUUFBUSxFQUFFO0lBQ2pDLElBQUF5cUIsVUFBQSxHQUF5QnpxQixRQUFRLENBQUMsQ0FBQztNQUE1QnJFLE9BQU8sR0FBQTh1QixVQUFBLENBQVA5dUIsT0FBTztNQUFFNlIsS0FBSyxHQUFBaWQsVUFBQSxDQUFMamQsS0FBSztJQUNyQnZVLFFBQVEsQ0FBQzZSLHlEQUFZLENBQUNzYyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsSUFBQXBwQixJQUFBLEdBQ0ksQ0FBQ29wQixVQUFVLEtBQUssTUFBTSxHQUNoQnpyQixPQUFPLENBQUMrdUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUNqQi91QixPQUFPLENBQUNndkIsSUFBSSxDQUFDaHZCLE9BQU8sQ0FBQ2d2QixJQUFJLENBQUNsNEIsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztNQUgvQzZQLEVBQUUsR0FBQXRFLElBQUEsQ0FBRnNFLEVBQUU7TUFBRXZLLEtBQUssR0FBQWlHLElBQUEsQ0FBTGpHLEtBQUs7SUFJaEIsSUFBSXVLLEVBQUUsRUFBRTtNQUNKO01BQ0FySixRQUFRLENBQ0o2Uix5REFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDN0JoSCxRQUFRLEVBQUVtSCwrQ0FBTyxDQUFDdUMsS0FBSyxFQUFFbEwsRUFBRSxDQUFDO1FBQzVCdks7TUFDSixDQUFDLENBQ0wsQ0FBQztNQUVEa0IsUUFBUSxDQUFDcUksZUFBZSxDQUFDO1FBQUNnQixFQUFFO1FBQUV2SztNQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzFDO0VBQ0osQ0FBQztBQUNMO0FBRU8sU0FBU3VKLGVBQWVBLENBQUFxUixLQUFBLEVBQWM7RUFBQSxJQUFaclEsRUFBRSxHQUFBcVEsS0FBQSxDQUFGclEsRUFBRTtJQUFFdkssS0FBSyxHQUFBNGEsS0FBQSxDQUFMNWEsS0FBSztFQUN0QztJQUFBLElBQUE2YSxLQUFBLEdBQUFsZSxpQkFBQSxlQUFBaEgsbUJBQUEsR0FBQW9GLElBQUEsQ0FBTyxTQUFBeUcsUUFBZ0JOLFFBQVEsRUFBRStHLFFBQVE7TUFBQSxJQUFBNHFCLFVBQUEsRUFBQXp4QixNQUFBLEVBQUFxVSxLQUFBO01BQUEsT0FBQTlmLG1CQUFBLEdBQUF1QixJQUFBLFVBQUF1SyxTQUFBQyxRQUFBO1FBQUEsa0JBQUFBLFFBQUEsQ0FBQWxHLElBQUEsR0FBQWtHLFFBQUEsQ0FBQTdILElBQUE7VUFBQTtZQUFBZzVCLFVBQUEsR0FDYjVxQixRQUFRLENBQUMsQ0FBQyxFQUEzQjdHLE1BQU0sR0FBQXl4QixVQUFBLENBQU56eEIsTUFBTSxFQUFFcVUsS0FBSyxHQUFBb2QsVUFBQSxDQUFMcGQsS0FBSztZQUNwQnZVLFFBQVEsQ0FDSjRTLGlFQUFxQixDQUFDb2Qsa0VBQWdCLENBQUMzbUIsRUFBRSxFQUFFdkssS0FBSyxFQUFFb0IsTUFBTSxFQUFFcVUsS0FBSyxDQUFDLENBQ3BFLENBQUM7VUFBQztVQUFBO1lBQUEsT0FBQS9ULFFBQUEsQ0FBQS9GLElBQUE7UUFBQTtNQUFBLEdBQUE2RixPQUFBO0lBQUEsQ0FDTDtJQUFBLGlCQUFBMlAsRUFBQSxFQUFBQyxHQUFBO01BQUEsT0FBQXlKLEtBQUEsQ0FBQTdkLEtBQUEsT0FBQUQsU0FBQTtJQUFBO0VBQUE7QUFDTDtBQUVPLFNBQVM4UixnQkFBZ0JBLENBQUM1UixHQUFHLEVBQUVrVCxPQUFPLEVBQUVqUCxRQUFRLEVBQUU7RUFDckQ7RUFDQSxJQUFJakUsR0FBRyxJQUFJLE9BQU9BLEdBQUcsQ0FBQzJULElBQUksS0FBSyxVQUFVLEVBQUU7SUFDdkMzVCxHQUFHLENBQUMyVCxJQUFJLENBQUMsQ0FBQyxDQUFDN1gsSUFBSSxDQUFDLFVBQUE2WCxJQUFJLEVBQUk7TUFDcEIsSUFBTWxVLEtBQUssR0FBRztRQUFDeVQsT0FBTztRQUFFK2hCLElBQUksRUFBRXRoQjtNQUFJLENBQUM7TUFDbkMxUCxRQUFRLENBQUNsQyxPQUFPLENBQUM7UUFBQ3hILElBQUksRUFBRSxTQUFTO1FBQUVrRjtNQUFLLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQztFQUNOLENBQUMsTUFBTTtJQUNILElBQU1BLEtBQUssR0FBR08sR0FBRyxZQUFZaEUsS0FBSyxHQUFHZ0UsR0FBRyxHQUFHO01BQUNrVCxPQUFPO01BQUUraEIsSUFBSSxFQUFFajFCO0lBQUcsQ0FBQztJQUMvRGlFLFFBQVEsQ0FBQ2xDLE9BQU8sQ0FBQztNQUFDeEgsSUFBSSxFQUFFLFNBQVM7TUFBRWtGO0lBQUssQ0FBQyxDQUFDLENBQUM7RUFDL0M7QUFDSjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNUgyQjtBQUM0QjtBQUVwQjtBQUNIO0FBQ1c7QUFFM0MsK0RBQWUsVUFBQzJELE1BQU0sRUFBRW9WLEtBQUssRUFBRXNkLE9BQU8sRUFBSztFQUN2QyxJQUFJLENBQUNBLE9BQU8sQ0FBQ3I0QixNQUFNLEVBQUU7SUFDakIsT0FBTyxJQUFJO0VBQ2Y7RUFDQSxJQUFNczRCLFFBQVEsR0FBRyxFQUFFO0VBRW5CLElBQU9yeUIsTUFBTSxHQUFJOFUsS0FBSyxDQUFmOVUsTUFBTTtFQUNiLElBQU1zeUIsUUFBUSxHQUFHLElBQUk3M0IsT0FBTyxDQUFDLFVBQUE4M0IsZUFBZSxFQUFJO0lBQzVDdnlCLE1BQU0sQ0FBQ2dPLElBQUksQ0FBQyxVQUFVLEVBQUV1a0IsZUFBZSxDQUFDO0VBQzVDLENBQUMsQ0FBQztFQUVGSCxPQUFPLENBQUN0NkIsT0FBTyxDQUFDLFVBQUE4UixFQUFFLEVBQUk7SUFDbEIsSUFBTTRvQixRQUFRLEdBQUdqZ0IsK0NBQU8sQ0FBQ3VDLEtBQUssRUFBRWxMLEVBQUUsQ0FBQztJQUNuQyxJQUFJLENBQUM0b0IsUUFBUSxFQUFFO01BQ1g7SUFDSjtJQUVBLElBQU1DLE1BQU0sR0FBR3RzQixpREFBSSxDQUFDcXNCLFFBQVEsRUFBRTl5QixNQUFNLENBQUM7SUFDckMsSUFBSSxDQUFDK3lCLE1BQU0sRUFBRTtNQUNUO0lBQ0o7SUFFQSxJQUFNOW5CLFNBQVMsR0FBRy9DLGlEQUFRLENBQUMxUCxPQUFPLENBQUN1NkIsTUFBTSxDQUFDO0lBQzFDLElBQU1DLEtBQUssR0FBR1AsdUVBQU8sQ0FBQ3huQixTQUFTLENBQUM7SUFFaEMsSUFBSStuQixLQUFLLElBQUksT0FBT0EsS0FBSyxDQUFDdDZCLElBQUksS0FBSyxVQUFVLEVBQUU7TUFDM0NpNkIsUUFBUSxDQUFDMzRCLElBQUksQ0FDVGUsT0FBTyxDQUFDazRCLElBQUksQ0FBQyxDQUNURCxLQUFLLEVBQ0xKLFFBQVEsQ0FBQ2w2QixJQUFJLENBQ1Q7UUFBQSxPQUFNeU4sUUFBUSxDQUFDQyxjQUFjLENBQUNxRCwwREFBVyxDQUFDUyxFQUFFLENBQUMsQ0FBQyxJQUFJOG9CLEtBQUs7TUFBQSxDQUMzRCxDQUFDLENBQ0osQ0FDTCxDQUFDO0lBQ0w7RUFDSixDQUFDLENBQUM7RUFFRixPQUFPTCxRQUFRLENBQUN0NEIsTUFBTSxHQUFHVSxPQUFPLENBQUMybEIsR0FBRyxDQUFDaVMsUUFBUSxDQUFDLEdBQUcsSUFBSTtBQUN6RCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQzdDMEM7QUFFK0I7QUFFbkUsSUFBTVEsWUFBWSxHQUFHemdCLHlEQUFZLENBQ3BDd2dCLG9FQUFtQixDQUFDRSxHQUN4QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ04wQztBQUVrQztBQUV0RSxJQUFNRSxhQUFhLEdBQUc1Z0IseURBQVksQ0FDckMyZ0Isc0VBQW9CLENBQUNELEdBQ3pCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ09jO0FBV1IsU0FBU3hnQixPQUFPQSxDQUFDckksR0FBUSxFQUFXO0VBQ3ZDLE9BQU83QixpREFBRyxDQUFDLHFCQUFxQixFQUFFNkIsR0FBRyxDQUFDO0FBQzFDO0FBRUEsU0FBU3NwQixnQkFBZ0JBLENBQUM3OUIsS0FBb0IsRUFBRXc2QixRQUFhLEVBQUU7RUFDM0QsSUFBSW1ELGlEQUFFLENBQUMvaEIsTUFBTSxFQUFFNWIsS0FBSyxDQUFDLElBQUlBLEtBQUssR0FBRyxDQUFDLEVBQUU7SUFDaEMsT0FBT3c2QixRQUFRLENBQUNuMkIsTUFBTSxHQUFHckUsS0FBSztFQUNsQztFQUNBLE9BQU9BLEtBQUs7QUFDaEI7QUFFQSxTQUFTODlCLGVBQWVBLENBQUNDLFFBQXlCLEVBQUV4cEIsR0FBUSxFQUFFO0VBQzFELElBQU1oSyxPQUFPLEdBQUcsRUFBRTtFQUVsQixLQUFLLElBQUl0SyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUc4OUIsUUFBUSxDQUFDMTVCLE1BQU0sRUFBRXBFLENBQUMsRUFBRSxFQUFFO0lBQ3RDLElBQU1ELEtBQUssR0FBRzY5QixnQkFBZ0IsQ0FBQ0UsUUFBUSxDQUFDOTlCLENBQUMsQ0FBQyxFQUFFd1EsaURBQUksQ0FBQ2xHLE9BQU8sRUFBRWdLLEdBQUcsQ0FBQyxDQUFDO0lBQy9EaEssT0FBTyxDQUFDdkcsSUFBSSxDQUFDaEUsS0FBSyxDQUFDO0VBQ3ZCO0VBRUEsT0FBT3VLLE9BQU87QUFDbEI7QUFFQSxJQUFNeXpCLGFBQTBDLEdBQUc7RUFDL0NDLE1BQU0sRUFBRSxTQUFBQSxPQUFDekQsUUFBUSxFQUFFMEQsY0FBYyxFQUFLO0lBQ2xDLElBQU9DLE1BQU0sR0FBY0QsY0FBYyxDQUFsQ0MsTUFBTTtNQUFFSixRQUFRLEdBQUlHLGNBQWMsQ0FBMUJILFFBQVE7SUFDdkIsT0FBT3pyQixpREFBUyxDQUFDeXJCLFFBQVEsRUFBRUksTUFBTSxDQUFDbitCLEtBQUssRUFBRXc2QixRQUFRLENBQUM7RUFDdEQsQ0FBQztFQUNENEQsS0FBSyxFQUFFLFNBQUFBLE1BQUM1RCxRQUFRLEVBQUUwRCxjQUFjLEVBQUs7SUFDakMsSUFBTS80QixJQUFTLEdBQUdzTCxpREFBSSxDQUFDeXRCLGNBQWMsQ0FBQ0gsUUFBUSxFQUFFdkQsUUFBUSxDQUFDO0lBQ3pELE9BQU9sb0IsaURBQVMsQ0FDWjRyQixjQUFjLENBQUNILFFBQVEsRUFBQWp2QixhQUFBLENBQUFBLGFBQUEsS0FFaEIzSixJQUFJLEdBQ0orNEIsY0FBYyxDQUFDQyxNQUFNLENBQUNuK0IsS0FBSyxHQUVsQ3c2QixRQUNKLENBQUM7RUFDTCxDQUFDO0VBQ0Q2RCxNQUFNLEVBQUUsU0FBQUEsT0FBQzdELFFBQVEsRUFBRTBELGNBQWMsRUFBSztJQUNsQyxJQUFNLzRCLElBQVMsR0FBR3NMLGlEQUFJLENBQUN5dEIsY0FBYyxDQUFDSCxRQUFRLEVBQUV2RCxRQUFRLENBQUM7SUFDekQsT0FBT2xvQixpREFBUyxDQUNaNHJCLGNBQWMsQ0FBQ0gsUUFBUSxFQUN2QnJ5QixpREFBTSxDQUFDdkcsSUFBSSxFQUFFKzRCLGNBQWMsQ0FBQ0MsTUFBTSxDQUFDbitCLEtBQUssQ0FBQyxFQUN6Q3c2QixRQUNKLENBQUM7RUFDTCxDQUFDO0VBQ0Q4RCxNQUFNLEVBQUUsU0FBQUEsT0FBQzlELFFBQVEsRUFBRTBELGNBQWMsRUFBSztJQUNsQyxPQUFPVixpREFBVSxDQUFDVSxjQUFjLENBQUNILFFBQVEsRUFBRXZELFFBQVEsQ0FBQztFQUN4RCxDQUFDO0VBQ0QrRCxNQUFNLEVBQUUsU0FBQUEsT0FBQy9ELFFBQVEsRUFBRTBELGNBQWMsRUFBSztJQUNsQyxJQUFNLzRCLElBQVMsR0FBR3NMLGlEQUFJLENBQUN5dEIsY0FBYyxDQUFDSCxRQUFRLEVBQUV2RCxRQUFRLENBQUM7SUFDekQsT0FBT2xvQixpREFBUyxDQUNaNHJCLGNBQWMsQ0FBQ0gsUUFBUSxFQUN2QkwsaURBQU0sQ0FDRkcsZ0JBQWdCLENBQUNLLGNBQWMsQ0FBQ0MsTUFBTSxDQUFDSyxLQUFLLEVBQUVyNUIsSUFBSSxDQUFDLEVBQ25EKzRCLGNBQWMsQ0FBQ0MsTUFBTSxDQUFDbitCLEtBQUssRUFDM0JtRixJQUNKLENBQUMsRUFDRHExQixRQUNKLENBQUM7RUFDTCxDQUFDO0VBQ0RpRSxNQUFNLEVBQUUsU0FBQUEsT0FBQ2pFLFFBQVEsRUFBRTBELGNBQWMsRUFBSztJQUNsQyxJQUFNLzRCLElBQVMsR0FBR3NMLGlEQUFJLENBQUN5dEIsY0FBYyxDQUFDSCxRQUFRLEVBQUV2RCxRQUFRLENBQUM7SUFDekQsT0FBT2xvQixpREFBUyxDQUNaNHJCLGNBQWMsQ0FBQ0gsUUFBUSxFQUN2QlIsaURBQU0sQ0FBQ1csY0FBYyxDQUFDQyxNQUFNLENBQUNuK0IsS0FBSyxFQUFFbUYsSUFBSSxDQUFDLEVBQ3pDcTFCLFFBQ0osQ0FBQztFQUNMLENBQUM7RUFDRGtFLE9BQU8sRUFBRSxTQUFBQSxRQUFDbEUsUUFBUSxFQUFFMEQsY0FBYyxFQUFLO0lBQ25DLElBQU0vNEIsSUFBUyxHQUFHc0wsaURBQUksQ0FBQ3l0QixjQUFjLENBQUNILFFBQVEsRUFBRXZELFFBQVEsQ0FBQztJQUN6RCxPQUFPbG9CLGlEQUFTLENBQ1o0ckIsY0FBYyxDQUFDSCxRQUFRLEVBQ3ZCSCxpREFBTyxDQUFDTSxjQUFjLENBQUNDLE1BQU0sQ0FBQ24rQixLQUFLLEVBQUVtRixJQUFJLENBQUMsRUFDMUNxMUIsUUFDSixDQUFDO0VBQ0wsQ0FBQztFQUNEbUUsR0FBRyxFQUFFLFNBQUFBLElBQUNuRSxRQUFRLEVBQUUwRCxjQUFjLEVBQUs7SUFDL0IsSUFBTS80QixJQUFTLEdBQUdzTCxpREFBSSxDQUFDeXRCLGNBQWMsQ0FBQ0gsUUFBUSxFQUFFdkQsUUFBUSxDQUFDO0lBQ3pELE9BQU9sb0IsaURBQVMsQ0FDWjRyQixjQUFjLENBQUNILFFBQVEsRUFDdkI1NEIsSUFBSSxHQUFHKzRCLGNBQWMsQ0FBQ0MsTUFBTSxDQUFDbitCLEtBQUssRUFDbEN3NkIsUUFDSixDQUFDO0VBQ0wsQ0FBQztFQUNEb0UsR0FBRyxFQUFFLFNBQUFBLElBQUNwRSxRQUFRLEVBQUUwRCxjQUFjLEVBQUs7SUFDL0IsSUFBTS80QixJQUFTLEdBQUdzTCxpREFBSSxDQUFDeXRCLGNBQWMsQ0FBQ0gsUUFBUSxFQUFFdkQsUUFBUSxDQUFDO0lBQ3pELE9BQU9sb0IsaURBQVMsQ0FDWjRyQixjQUFjLENBQUNILFFBQVEsRUFDdkI1NEIsSUFBSSxHQUFHKzRCLGNBQWMsQ0FBQ0MsTUFBTSxDQUFDbitCLEtBQUssRUFDbEN3NkIsUUFDSixDQUFDO0VBQ0wsQ0FBQztFQUNEcUUsR0FBRyxFQUFFLFNBQUFBLElBQUNyRSxRQUFRLEVBQUUwRCxjQUFjLEVBQUs7SUFDL0IsSUFBTS80QixJQUFTLEdBQUdzTCxpREFBSSxDQUFDeXRCLGNBQWMsQ0FBQ0gsUUFBUSxFQUFFdkQsUUFBUSxDQUFDO0lBQ3pELE9BQU9sb0IsaURBQVMsQ0FDWjRyQixjQUFjLENBQUNILFFBQVEsRUFDdkI1NEIsSUFBSSxHQUFHKzRCLGNBQWMsQ0FBQ0MsTUFBTSxDQUFDbitCLEtBQUssRUFDbEN3NkIsUUFDSixDQUFDO0VBQ0wsQ0FBQztFQUNEc0UsR0FBRyxFQUFFLFNBQUFBLElBQUN0RSxRQUFRLEVBQUUwRCxjQUFjLEVBQUs7SUFDL0IsSUFBTS80QixJQUFTLEdBQUdzTCxpREFBSSxDQUFDeXRCLGNBQWMsQ0FBQ0gsUUFBUSxFQUFFdkQsUUFBUSxDQUFDO0lBQ3pELE9BQU9sb0IsaURBQVMsQ0FDWjRyQixjQUFjLENBQUNILFFBQVEsRUFDdkI1NEIsSUFBSSxHQUFHKzRCLGNBQWMsQ0FBQ0MsTUFBTSxDQUFDbitCLEtBQUssRUFDbEN3NkIsUUFDSixDQUFDO0VBQ0wsQ0FBQztFQUNEdUUsS0FBSyxFQUFFLFNBQUFBLE1BQUN2RSxRQUFRLEVBQUUwRCxjQUFjLEVBQUs7SUFDakMsSUFBTS80QixJQUFTLEdBQUdzTCxpREFBSSxDQUFDeXRCLGNBQWMsQ0FBQ0gsUUFBUSxFQUFFdkQsUUFBUSxDQUFDO0lBQ3pELE9BQU9sb0IsaURBQVMsQ0FBQzRyQixjQUFjLENBQUNILFFBQVEsRUFBRU4saURBQUssQ0FBQ3Q0QixJQUFJLENBQUMsRUFBRXExQixRQUFRLENBQUM7RUFDcEUsQ0FBQztFQUNEd0UsT0FBTyxFQUFFLFNBQUFBLFFBQUN4RSxRQUFRLEVBQUUwRCxjQUFjLEVBQUs7SUFDbkMsSUFBTS80QixJQUFTLEdBQUdzTCxpREFBSSxDQUFDeXRCLGNBQWMsQ0FBQ0gsUUFBUSxFQUFFdkQsUUFBUSxDQUFDO0lBQ3pELE9BQU9sb0IsaURBQVMsQ0FBQzRyQixjQUFjLENBQUNILFFBQVEsRUFBRTk0QixrREFBTyxDQUFDRSxJQUFJLENBQUMsRUFBRXExQixRQUFRLENBQUM7RUFDdEUsQ0FBQztFQUNEeUUsTUFBTSxFQUFFLFNBQUFBLE9BQUN6RSxRQUFRLEVBQUUwRCxjQUFjLEVBQUs7SUFDbEMsSUFBTS80QixJQUFTLEdBQUdzTCxpREFBSSxDQUFDeXRCLGNBQWMsQ0FBQ0gsUUFBUSxFQUFFdkQsUUFBUSxDQUFDO0lBQ3pELE9BQU9sb0IsaURBQVMsQ0FDWjRyQixjQUFjLENBQUNILFFBQVEsRUFDdkI1NEIsSUFBSSxDQUFDb0wsTUFBTSxDQUNQLFVBQUMyaUIsSUFBUztNQUFBLE9BQUssQ0FBQzFnQixrREFBTSxDQUFDMGdCLElBQUksRUFBRWdMLGNBQWMsQ0FBQ0MsTUFBTSxDQUFDbitCLEtBQUssQ0FBQztJQUFBLENBQzdELENBQUMsRUFDRHc2QixRQUNKLENBQUM7RUFDTDtBQUNKLENBQUM7QUFFTSxTQUFTN2QsV0FBV0EsQ0FBSTJNLGFBQWdCLEVBQUU0VixVQUFlLEVBQUs7RUFDakUsSUFBSUMsWUFBWSxHQUFHN1YsYUFBYTtFQUVoQyxLQUFLLElBQUlycEIsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHaS9CLFVBQVUsQ0FBQ0UsVUFBVSxDQUFDLzZCLE1BQU0sRUFBRXBFLENBQUMsRUFBRSxFQUFFO0lBQ25ELElBQU1vL0IsS0FBSyxHQUFHSCxVQUFVLENBQUNFLFVBQVUsQ0FBQ24vQixDQUFDLENBQUM7SUFDdENvL0IsS0FBSyxDQUFDdEIsUUFBUSxHQUFHRCxlQUFlLENBQUN1QixLQUFLLENBQUN0QixRQUFRLEVBQUVvQixZQUFZLENBQUM7SUFDOUQsSUFBTUcsT0FBTyxHQUFHdEIsYUFBYSxDQUFDcUIsS0FBSyxDQUFDRSxTQUFTLENBQUM7SUFDOUMsSUFBSSxDQUFDRCxPQUFPLEVBQUU7TUFDVixNQUFNLElBQUkxOEIsS0FBSyxzQkFBQThJLE1BQUEsQ0FBc0IyekIsS0FBSyxDQUFDRSxTQUFTLENBQUUsQ0FBQztJQUMzRDtJQUNBSixZQUFZLEdBQUdHLE9BQU8sQ0FBQ0gsWUFBWSxFQUFFRSxLQUFLLENBQUM7RUFDL0M7RUFFQSxPQUFPRixZQUFZO0FBQ3ZCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdKZTtBQUVxQjs7QUFFcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPLFNBQVNwMkIsWUFBWUEsQ0FBQzIyQixPQUFPLEVBQUVDLFlBQVksRUFBRUMsUUFBUSxFQUFFdDFCLE1BQU0sRUFBRTtFQUNsRSxJQUFBc0YsSUFBQSxHQUF1Q2d3QixRQUFRLElBQUk7TUFBQ2hnQixJQUFJLEVBQUUsQ0FBQyxDQUFDO01BQUVpQixJQUFJLEVBQUUsQ0FBQztJQUFDLENBQUM7SUFBMURnZixPQUFPLEdBQUFqd0IsSUFBQSxDQUFiZ1EsSUFBSTtJQUFpQmtnQixPQUFPLEdBQUFsd0IsSUFBQSxDQUFiaVIsSUFBSTtFQUUxQixJQUFNa2YsUUFBUSxHQUFHLFNBQVhBLFFBQVFBLENBQUd0dkIsSUFBSTtJQUFBLE9BQUlrdkIsWUFBWSxDQUFDalEsSUFBSSxDQUFDLFVBQUMxdEIsQ0FBQyxFQUFFL0IsQ0FBQztNQUFBLE9BQUt3USxJQUFJLENBQUN4USxDQUFDLENBQUMsS0FBSytCLENBQUM7SUFBQSxFQUFDO0VBQUE7RUFFbkUsSUFBTWcrQixLQUFLLEdBQUdMLFlBQVksQ0FBQ3Q3QixNQUFNO0VBQ2pDO0VBQ0EsSUFBTXViLElBQUksR0FBR29nQixLQUFLLEdBQUd6dkIsaURBQU0sQ0FBQ3d2QixRQUFRLEVBQUVGLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNuRCxJQUFNaGYsSUFBSSxHQUFHLENBQUMsQ0FBQztFQUNmLElBQUltZixLQUFLLEVBQUU7SUFDUGxWLGlEQUFpQixDQUFDLFVBQUNtVixXQUFXLEVBQUVDLE9BQU8sRUFBSztNQUN4QyxJQUFNdk0sT0FBTyxHQUFHcGpCLGlEQUFNLENBQUMsVUFBQWdVLEtBQUE7UUFBQSxJQUFFOVQsSUFBSSxHQUFBOFQsS0FBQSxDQUFKOVQsSUFBSTtRQUFBLE9BQU1zdkIsUUFBUSxDQUFDdHZCLElBQUksQ0FBQztNQUFBLEdBQUV3dkIsV0FBVyxDQUFDO01BQy9ELElBQUl0TSxPQUFPLENBQUN0dkIsTUFBTSxFQUFFO1FBQ2hCd2MsSUFBSSxDQUFDcWYsT0FBTyxDQUFDLEdBQUd2TSxPQUFPO01BQzNCO0lBQ0osQ0FBQyxFQUFFbU0sT0FBTyxDQUFDO0VBQ2Y7RUFFQXRVLG1EQUFXLENBQUNrVSxPQUFPLEVBQUUsVUFBQ2xILEtBQUssRUFBRTlpQixRQUFRLEVBQUs7SUFDdEMsSUFBTXhCLEVBQUUsR0FBR3pELGlEQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUrbkIsS0FBSyxDQUFDO0lBQ3ZDLElBQUl0a0IsRUFBRSxFQUFFO01BQ0osSUFBSSxPQUFPQSxFQUFFLEtBQUssUUFBUSxFQUFFO1FBQ3hCLElBQU1sUCxJQUFJLEdBQUd0RixNQUFNLENBQUNzRixJQUFJLENBQUNrUCxFQUFFLENBQUMsQ0FBQzZZLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQU05cUIsTUFBTSxHQUFHMEgsaURBQUssQ0FBQzNFLElBQUksRUFBRWtQLEVBQUUsQ0FBQztRQUM5QixJQUFNNlosTUFBTSxHQUFHL29CLElBQUksQ0FBQzZhLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDN0IsSUFBTVQsS0FBSyxHQUFJeUIsSUFBSSxDQUFDa04sTUFBTSxDQUFDLEdBQUdsTixJQUFJLENBQUNrTixNQUFNLENBQUMsSUFBSSxFQUFHO1FBQ2pELElBQU1vUyxLQUFLLEdBQUdMLE9BQU8sQ0FBQy9SLE1BQU0sQ0FBQyxJQUFJLEVBQUU7UUFDbkMsSUFBTW1GLElBQUksR0FBRztVQUFDanhCLE1BQU07VUFBRXdPLElBQUksRUFBRS9FLGlEQUFNLENBQUNpMEIsWUFBWSxFQUFFanFCLFFBQVE7UUFBQyxDQUFDO1FBQzNELElBQU04b0IsS0FBSyxHQUFHN2pCLGlEQUFPLENBQUN1WSxJQUFJLEVBQUVpTixLQUFLLENBQUM7UUFDbEMsSUFBSTNCLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtVQUNkcGYsS0FBSyxDQUFDcGIsSUFBSSxDQUFDa3ZCLElBQUksQ0FBQztRQUNwQixDQUFDLE1BQU07VUFDSHJTLElBQUksQ0FBQ2tOLE1BQU0sQ0FBQyxHQUFHMlAsaURBQU0sQ0FBQ2MsS0FBSyxFQUFFdEwsSUFBSSxFQUFFOVQsS0FBSyxDQUFDO1FBQzdDO01BQ0osQ0FBQyxNQUFNO1FBQ0hRLElBQUksQ0FBQzFMLEVBQUUsQ0FBQyxHQUFHeEksaURBQU0sQ0FBQ2kwQixZQUFZLEVBQUVqcUIsUUFBUSxDQUFDO01BQzdDO0lBQ0o7RUFDSixDQUFDLENBQUM7O0VBRUY7RUFDQTtFQUNBLE9BQU87SUFBQ2tLLElBQUk7SUFBRWlCLElBQUk7SUFBRXZXLE1BQU0sRUFBRUEsTUFBTSxJQUFJczFCLFFBQVEsQ0FBQ3QxQjtFQUFNLENBQUM7QUFDMUQ7QUFFTyxTQUFTdVMsT0FBT0EsQ0FBQ3VDLEtBQUssRUFBRWxMLEVBQUUsRUFBRTtFQUMvQixJQUFJLE9BQU9BLEVBQUUsS0FBSyxRQUFRLEVBQUU7SUFDeEIsSUFBTWxQLElBQUksR0FBR3RGLE1BQU0sQ0FBQ3NGLElBQUksQ0FBQ2tQLEVBQUUsQ0FBQyxDQUFDNlksSUFBSSxDQUFDLENBQUM7SUFDbkMsSUFBTWdCLE1BQU0sR0FBRy9vQixJQUFJLENBQUM2YSxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQzdCLElBQU00YixRQUFRLEdBQUdyYyxLQUFLLENBQUN5QixJQUFJLENBQUNrTixNQUFNLENBQUM7SUFDbkMsSUFBSSxDQUFDME4sUUFBUSxFQUFFO01BQ1gsT0FBTyxLQUFLO0lBQ2hCO0lBQ0EsSUFBTXg1QixNQUFNLEdBQUcwSCxpREFBSyxDQUFDM0UsSUFBSSxFQUFFa1AsRUFBRSxDQUFDO0lBQzlCLElBQU1rc0IsT0FBTyxHQUFHWixpREFBSSxDQUFDQyxpREFBTSxDQUFDeDlCLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRXc1QixRQUFRLENBQUM7SUFDeEQsT0FBTzJFLE9BQU8sSUFBSUEsT0FBTyxDQUFDM3ZCLElBQUk7RUFDbEM7RUFDQSxPQUFPMk8sS0FBSyxDQUFDUSxJQUFJLENBQUMxTCxFQUFFLENBQUM7QUFDekI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2xGa0M7QUFDQTtBQUNMO0FBRXRCLFNBQVM0SSxtQkFBbUJBLENBQUEsRUFBRztFQUNsQyxPQUFPLFVBQUNqUyxRQUFhLEVBQUs7SUFDdEJoRCxrREFBSyxDQUFDLFlBQU07TUFDUmdELFFBQVEsQ0FBQ2pDLGlEQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUN2QmlDLFFBQVEsQ0FDSjVCLGdEQUFRLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixDQUMvRCxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0VBQ04sQ0FBQztBQUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0hlOztBQUVmO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3lQLE9BQU9BLENBQUM3TyxNQUFNLEVBQUU7RUFDNUIsSUFBTXcyQixVQUFVLEdBQUczdEIsaURBQUcsQ0FBQyxtQkFBbUIsRUFBRTdJLE1BQU0sQ0FBQztFQUNuRCxJQUFNeTJCLFlBQVksR0FBRzV0QixpREFBRyxDQUFDLDBCQUEwQixFQUFFN0ksTUFBTSxDQUFDO0VBQzVELElBQUkxSSxpREFBSSxDQUFDMEksTUFBTSxDQUFDLEtBQUssUUFBUSxJQUFLLENBQUN3MkIsVUFBVSxJQUFJLENBQUNDLFlBQWEsRUFBRTtJQUM3RCxNQUFNLElBQUkxOUIsS0FBSywyS0FLWGlILE1BQ0osQ0FBQztFQUNMO0VBRUEsSUFBTTAyQixJQUFJLEdBQUdELFlBQVksR0FDbkJ6MkIsTUFBTSxDQUFDOEIsd0JBQXdCLEdBQy9COUIsTUFBTSxDQUFDMjJCLGlCQUFpQjtFQUU5QixPQUFPRCxJQUFJLENBQUNuN0IsTUFBTSxDQUFDbTdCLElBQUksQ0FBQ2w4QixNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHazhCLElBQUksR0FBR0EsSUFBSSxHQUFHLEdBQUc7QUFDbkU7QUFFQSxJQUFNRSxhQUFhLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDOztBQUUzQztBQUNPLElBQU1qVixXQUFXLEdBQUcsU0FBZEEsV0FBV0EsQ0FDcEJuZSxNQUFNLEVBQ05ELElBQUksRUFHSDtFQUFBLElBRkRzekIsV0FBVyxHQUFBaDZCLFNBQUEsQ0FBQXJDLE1BQUEsUUFBQXFDLFNBQUEsUUFBQUcsU0FBQSxHQUFBSCxTQUFBLE1BQUcsRUFBRTtFQUFBLElBQ2hCaTZCLFNBQVMsR0FBQWo2QixTQUFBLENBQUFyQyxNQUFBLFFBQUFxQyxTQUFBLFFBQUFHLFNBQUEsR0FBQUgsU0FBQSxNQUFHRyxTQUFTO0VBRXJCLElBQUlVLEtBQUssQ0FBQ0ssT0FBTyxDQUFDeUYsTUFBTSxDQUFDLEVBQUU7SUFDdkI7SUFDQUEsTUFBTSxDQUFDakwsT0FBTyxDQUFDLFVBQUNvMkIsS0FBSyxFQUFFdjRCLENBQUMsRUFBSztNQUN6QixJQUFJMGdDLFNBQVMsRUFBRTtRQUNYLElBQU1DLEtBQUssR0FBRzl1QixpREFBUyxDQUFDLFVBQUFqUSxDQUFDO1VBQUEsT0FBSWtHLGlEQUFRLENBQUMsSUFBSSxFQUFFbEcsQ0FBQyxDQUFDO1FBQUEsR0FBRTgrQixTQUFTLENBQUM7UUFDMUQsSUFBSUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO1VBQ2QsSUFBTXZwQixLQUFLLEdBQUdoUyxpREFBSyxDQUFDLENBQUMsRUFBRXU3QixLQUFLLEVBQUVELFNBQVMsQ0FBQztVQUN4QyxJQUFNRSxJQUFJLEdBQUd4N0IsaURBQUssQ0FBQ3U3QixLQUFLLEVBQUVELFNBQVMsQ0FBQ3Q4QixNQUFNLEVBQUVzOEIsU0FBUyxDQUFDO1VBQ3RELElBQUl0cEIsS0FBSyxDQUFDaFQsTUFBTSxFQUFFO1lBQ2RtbkIsV0FBVyxDQUNQL2EsaURBQUksQ0FBQzRHLEtBQUssRUFBRW1oQixLQUFLLENBQUMsRUFDbEJwckIsSUFBSSxFQUNKMUIsaURBQU0sQ0FBQ2cxQixXQUFXLEVBQUVoMUIsaURBQU0sQ0FBQyxDQUFDekwsQ0FBQyxDQUFDLEVBQUVvWCxLQUFLLENBQUMsQ0FBQyxFQUN2Q3dwQixJQUNKLENBQUM7VUFDTCxDQUFDLE1BQU07WUFDSCxJQUFNL3BCLFFBQVEsR0FBRytwQixJQUFJLENBQ2hCcndCLEdBQUcsQ0FBQyxVQUFBM08sQ0FBQztjQUFBLE9BQUlBLENBQUMsQ0FBQ29WLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQUEsRUFBQyxDQUM3QjFHLE1BQU0sQ0FBQyxVQUFBaFIsQ0FBQztjQUFBLE9BQUlBLENBQUM7WUFBQSxFQUFDO1lBQ25CLElBQUl1aEMsUUFBUTtjQUNSQyxTQUFTLEdBQUdyMUIsaURBQU0sQ0FBQyxDQUFDekwsQ0FBQyxDQUFDLEVBQUU2VyxRQUFRLENBQUM7WUFDckMsSUFBSUEsUUFBUSxDQUFDelMsTUFBTSxFQUFFO2NBQ2pCeThCLFFBQVEsR0FBR3J3QixpREFBSSxDQUFDcUcsUUFBUSxFQUFFMGhCLEtBQUssQ0FBQztZQUNwQyxDQUFDLE1BQU07Y0FDSHNJLFFBQVEsR0FBR3RJLEtBQUs7WUFDcEI7WUFDQSxLQUFLLElBQU1yeUIsR0FBRyxJQUFJMjZCLFFBQVEsRUFBRTtjQUN4QixJQUFNOWdDLEtBQUssR0FBRzhnQyxRQUFRLENBQUMzNkIsR0FBRyxDQUFDO2NBQzNCcWxCLFdBQVcsQ0FDUHhyQixLQUFLLEVBQ0xvTixJQUFJLEVBQ0oxQixpREFBTSxDQUFDZzFCLFdBQVcsRUFBRUssU0FBUyxDQUFDcjFCLE1BQU0sQ0FBQyxDQUFDdkYsR0FBRyxDQUFDLENBQUMsQ0FDL0MsQ0FBQztZQUNMO1VBQ0o7UUFDSixDQUFDLE1BQU07VUFDSHFsQixXQUFXLENBQ1AvYSxpREFBSSxDQUFDa3dCLFNBQVMsRUFBRW5JLEtBQUssQ0FBQyxFQUN0QnByQixJQUFJLEVBQ0oxQixpREFBTSxDQUFDZzFCLFdBQVcsRUFBRWgxQixpREFBTSxDQUFDLENBQUN6TCxDQUFDLENBQUMsRUFBRTBnQyxTQUFTLENBQUMsQ0FDOUMsQ0FBQztRQUNMO01BQ0osQ0FBQyxNQUFNO1FBQ0huVixXQUFXLENBQUNnTixLQUFLLEVBQUVwckIsSUFBSSxFQUFFbXdCLGlEQUFNLENBQUN0OUIsQ0FBQyxFQUFFeWdDLFdBQVcsQ0FBQyxDQUFDO01BQ3BEO0lBQ0osQ0FBQyxDQUFDO0VBQ04sQ0FBQyxNQUFNLElBQUl2L0IsaURBQUksQ0FBQ2tNLE1BQU0sQ0FBQyxLQUFLLFFBQVEsRUFBRTtJQUNsQ0QsSUFBSSxDQUFDQyxNQUFNLEVBQUVxekIsV0FBVyxDQUFDO0lBRXpCLElBQU0xc0IsUUFBUSxHQUFHdkQsaURBQUksQ0FBQ2d3QixhQUFhLEVBQUVwekIsTUFBTSxDQUFDO0lBQzVDLElBQUkyRyxRQUFRLEVBQUU7TUFDVixJQUFNZ3RCLE9BQU8sR0FBR3QxQixpREFBTSxDQUFDZzFCLFdBQVcsRUFBRUQsYUFBYSxDQUFDO01BQ2xEalYsV0FBVyxDQUFDeFgsUUFBUSxFQUFFNUcsSUFBSSxFQUFFNHpCLE9BQU8sQ0FBQztJQUN4QztJQUVBLElBQU0xcUIsYUFBYSxHQUFHckQsaURBQU0sQ0FDeEIsRUFBRSxFQUNGLENBQUM1RixNQUFNLENBQUNrSixTQUFTLEVBQUVsSixNQUFNLENBQUNsTSxJQUFJLENBQUMsRUFDL0JxSyxNQUFNLENBQUN5MUIsMkJBQ1gsQ0FBQztJQUNEM3FCLGFBQWEsQ0FBQ2xVLE9BQU8sQ0FBQyxVQUFBNFQsWUFBWSxFQUFJO01BQ2xDLElBQUlBLFlBQVksQ0FBQ2pPLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUM3QixJQUFBbTVCLHFCQUFBLEdBQTRCbHJCLFlBQVksQ0FDbkN0RSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQ1hsQixHQUFHLENBQUMsVUFBQTNPLENBQUM7WUFBQSxPQUFJQSxDQUFDLENBQUM2UCxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUNuQixNQUFNLENBQUMsVUFBQWhSLENBQUM7Y0FBQSxPQUFJQSxDQUFDO1lBQUEsRUFBQztVQUFBLEVBQUM7VUFBQTRoQyxzQkFBQSxHQUFBcjZCLGNBQUEsQ0FBQW82QixxQkFBQTtVQUZyQ3JxQixTQUFTLEdBQUFzcUIsc0JBQUE7VUFBRXJxQixRQUFRLEdBQUFxcUIsc0JBQUE7UUFJeEIsSUFBTTlwQixLQUFLLEdBQUczTCxpREFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUVtTCxTQUFTLENBQUM7UUFDMUMsSUFBTXVxQixRQUFRLEdBQUcxMUIsaURBQU0sQ0FBQ2cxQixXQUFXLEVBQUVycEIsS0FBSyxDQUFDO1FBQzNDbVUsV0FBVyxDQUFDL2EsaURBQUksQ0FBQzRHLEtBQUssRUFBRWhLLE1BQU0sQ0FBQyxFQUFFRCxJQUFJLEVBQUVnMEIsUUFBUSxFQUFFdHFCLFFBQVEsQ0FBQztNQUM5RCxDQUFDLE1BQU07UUFDSCxJQUFJZCxZQUFZLENBQUNqTyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7VUFDN0IsSUFBTTJPLEtBQUssR0FBR1YsWUFBWSxDQUFDdEUsS0FBSyxDQUFDLEdBQUcsQ0FBQztVQUNyQyxJQUFNbUYsVUFBUyxHQUFHLEVBQUU7VUFDcEIsSUFBTUMsU0FBUSxHQUFHLEVBQUU7VUFDbkIsSUFBSUMsS0FBSyxHQUFHLEtBQUs7VUFFakIsS0FBSyxJQUFJOVcsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHeVcsS0FBSyxDQUFDclMsTUFBTSxFQUFFcEUsQ0FBQyxFQUFFLEVBQUU7WUFDbkMsSUFBTW9oQyxPQUFPLEdBQUczcUIsS0FBSyxDQUFDelcsQ0FBQyxDQUFDO1lBQ3hCLElBQUksQ0FBQzhXLEtBQUssSUFBSXNxQixPQUFPLENBQUN0NUIsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO2NBQ2xDZ1AsS0FBSyxHQUFHLElBQUk7Y0FDWkYsVUFBUyxDQUFDN1MsSUFBSSxDQUFDcTlCLE9BQU8sQ0FBQ3BxQixPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLENBQUMsTUFBTTtjQUNILElBQUlGLEtBQUssRUFBRTtnQkFDUEQsU0FBUSxDQUFDOVMsSUFBSSxDQUFDcTlCLE9BQU8sQ0FBQztjQUMxQixDQUFDLE1BQU07Z0JBQ0h4cUIsVUFBUyxDQUFDN1MsSUFBSSxDQUFDcTlCLE9BQU8sQ0FBQztjQUMzQjtZQUNKO1VBQ0o7VUFDQSxJQUFNTCxRQUFPLEdBQUd0MUIsaURBQU0sQ0FBQ2cxQixXQUFXLEdBQzlCLE9BQU8sRUFBQWgxQixNQUFBLENBQ0ptTCxVQUFTLENBQ2YsQ0FBQztVQUVGLElBQU15cUIsTUFBTSxHQUFHN3dCLGlEQUFJLEVBQUUsT0FBTyxFQUFBL0UsTUFBQSxDQUFLbUwsVUFBUyxHQUFHeEosTUFBTSxDQUFDO1VBQ3BELElBQUlpMEIsTUFBTSxLQUFLejZCLFNBQVMsRUFBRTtZQUN0QixLQUFLLElBQU1WLEdBQUcsSUFBSW03QixNQUFNLEVBQUU7Y0FDdEIsSUFBTXRoQyxLQUFLLEdBQUdzaEMsTUFBTSxDQUFDbjdCLEdBQUcsQ0FBQztjQUN6QixJQUFJMlEsU0FBUSxDQUFDelMsTUFBTSxFQUFFO2dCQUNqQm1uQixXQUFXLENBQ1AvYSxpREFBSSxDQUFDcUcsU0FBUSxFQUFFOVcsS0FBSyxDQUFDLEVBQ3JCb04sSUFBSSxFQUNKMUIsaURBQU0sQ0FBQ3MxQixRQUFPLEdBQUc3NkIsR0FBRyxFQUFBdUYsTUFBQSxDQUFLb0wsU0FBUSxDQUFDLENBQ3RDLENBQUM7Y0FDTCxDQUFDLE1BQU07Z0JBQ0gwVSxXQUFXLENBQUN4ckIsS0FBSyxFQUFFb04sSUFBSSxLQUFBMUIsTUFBQSxDQUFBMkksa0JBQUEsQ0FBTTJzQixRQUFPLElBQUU3NkIsR0FBRyxFQUFDLENBQUM7Y0FDL0M7WUFDSjtVQUNKO1FBQ0osQ0FBQyxNQUFNO1VBQ0gsSUFBTTY2QixTQUFPLEdBQUd0MUIsaURBQU0sQ0FBQ2cxQixXQUFXLEdBQzlCLE9BQU8sRUFBQWgxQixNQUFBLENBQUEySSxrQkFBQSxDQUNKMkIsWUFBWSxDQUFDdEUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUM3QixDQUFDO1VBQ0Y4WixXQUFXLENBQ1AvYSxpREFBSSxFQUFFLE9BQU8sRUFBQS9FLE1BQUEsQ0FBQTJJLGtCQUFBLENBQUsyQixZQUFZLENBQUN0RSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUdyRSxNQUFNLENBQUMsRUFDbkRELElBQUksRUFDSjR6QixTQUNKLENBQUM7UUFDTDtNQUNKO0lBQ0osQ0FBQyxDQUFDO0VBQ047QUFDSixDQUFDOztBQUVEO0FBQ0E7QUFDTyxJQUFNOTNCLFlBQVk7RUFDckIsU0FBQUEsYUFBQSxFQUFjO0lBQUF1RixlQUFBLE9BQUF2RixZQUFBO0lBQ1YsSUFBSSxDQUFDcTRCLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDakI7RUFBQ3h5QixZQUFBLENBQUE3RixZQUFBO0lBQUEvQyxHQUFBO0lBQUFuRyxLQUFBLEVBQ0QsU0FBQXdoQyxHQUFHQyxLQUFLLEVBQUVDLFFBQVEsRUFBRTtNQUFBLElBQUFsekIsS0FBQTtNQUNoQixJQUFNbEUsTUFBTSxHQUFJLElBQUksQ0FBQ2kzQixHQUFHLENBQUNFLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQ0YsR0FBRyxDQUFDRSxLQUFLLENBQUMsSUFBSSxFQUFHO01BQ3hEbjNCLE1BQU0sQ0FBQ3RHLElBQUksQ0FBQzA5QixRQUFRLENBQUM7TUFDckIsT0FBTztRQUFBLE9BQU1sekIsS0FBSSxDQUFDbXpCLGNBQWMsQ0FBQ0YsS0FBSyxFQUFFQyxRQUFRLENBQUM7TUFBQTtJQUNyRDtFQUFDO0lBQUF2N0IsR0FBQTtJQUFBbkcsS0FBQSxFQUNELFNBQUEyaEMsZUFBZUYsS0FBSyxFQUFFQyxRQUFRLEVBQUU7TUFDNUIsSUFBTXAzQixNQUFNLEdBQUcsSUFBSSxDQUFDaTNCLEdBQUcsQ0FBQ0UsS0FBSyxDQUFDO01BQzlCLElBQUluM0IsTUFBTSxFQUFFO1FBQ1IsSUFBTXMzQixHQUFHLEdBQUd0M0IsTUFBTSxDQUFDcVEsT0FBTyxDQUFDK21CLFFBQVEsQ0FBQztRQUNwQyxJQUFJRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUU7VUFDVnQzQixNQUFNLENBQUN1SCxNQUFNLENBQUMrdkIsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN6QjtNQUNKO0lBQ0o7RUFBQztJQUFBejdCLEdBQUE7SUFBQW5HLEtBQUEsRUFDRCxTQUFBc0wsS0FBS20yQixLQUFLLEVBQVc7TUFBQSxJQUFBNXJCLE1BQUE7TUFBQSxTQUFBZ3NCLElBQUEsR0FBQW43QixTQUFBLENBQUFyQyxNQUFBLEVBQU5vQyxJQUFJLE9BQUFjLEtBQUEsQ0FBQXM2QixJQUFBLE9BQUFBLElBQUEsV0FBQUMsSUFBQSxNQUFBQSxJQUFBLEdBQUFELElBQUEsRUFBQUMsSUFBQTtRQUFKcjdCLElBQUksQ0FBQXE3QixJQUFBLFFBQUFwN0IsU0FBQSxDQUFBbzdCLElBQUE7TUFBQTtNQUNmLElBQU14M0IsTUFBTSxHQUFHLElBQUksQ0FBQ2kzQixHQUFHLENBQUNFLEtBQUssQ0FBQztNQUM5QixJQUFJbjNCLE1BQU0sRUFBRTtRQUNSQSxNQUFNLENBQUNsSSxPQUFPLENBQUMsVUFBQXMvQixRQUFRO1VBQUEsT0FBSUEsUUFBUSxDQUFDLzZCLEtBQUssQ0FBQ2tQLE1BQUksRUFBRXBQLElBQUksQ0FBQztRQUFBLEVBQUM7TUFDMUQ7SUFDSjtFQUFDO0lBQUFOLEdBQUE7SUFBQW5HLEtBQUEsRUFDRCxTQUFBc1ksS0FBS21wQixLQUFLLEVBQUVDLFFBQVEsRUFBRTtNQUFBLElBQUF6ckIsTUFBQTtNQUNsQixJQUFNbEYsTUFBTSxHQUFHLElBQUksQ0FBQ3l3QixFQUFFLENBQUNDLEtBQUssRUFBRSxZQUFhO1FBQ3ZDMXdCLE1BQU0sQ0FBQyxDQUFDO1FBQUMsU0FBQWd4QixLQUFBLEdBQUFyN0IsU0FBQSxDQUFBckMsTUFBQSxFQURxQm9DLElBQUksT0FBQWMsS0FBQSxDQUFBdzZCLEtBQUEsR0FBQUMsS0FBQSxNQUFBQSxLQUFBLEdBQUFELEtBQUEsRUFBQUMsS0FBQTtVQUFKdjdCLElBQUksQ0FBQXU3QixLQUFBLElBQUF0N0IsU0FBQSxDQUFBczdCLEtBQUE7UUFBQTtRQUVsQ04sUUFBUSxDQUFDLzZCLEtBQUssQ0FBQ3NQLE1BQUksRUFBRXhQLElBQUksQ0FBQztNQUM5QixDQUFDLENBQUM7SUFDTjtFQUFDO0VBQUEsT0FBQXlDLFlBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6TUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ3VFOztBQUV2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNlLFNBQVNxSyxjQUFjQSxDQUNsQzJ1QixTQUFTLEVBQ1RqZ0MsTUFBTSxFQUNOODdCLFFBQVEsRUFDUm9FLGFBQWEsRUFFZjtFQUFBLElBREVDLFFBQVEsR0FBQTE3QixTQUFBLENBQUFyQyxNQUFBLFFBQUFxQyxTQUFBLFFBQUFHLFNBQUEsR0FBQUgsU0FBQSxNQUFHLElBQUk7RUFFZixJQUFNMFosTUFBTSxHQUFHLEVBQUU7RUFDakIsS0FBSyxJQUFNaWlCLFlBQVksSUFBSUgsU0FBUyxFQUFFO0lBQ2xDLElBQUlBLFNBQVMsQ0FBQ3JpQyxjQUFjLENBQUN3aUMsWUFBWSxDQUFDLEVBQUU7TUFDeEMsSUFBSWg4QixLQUFLO01BQ1Q7TUFDQTtNQUNBO01BQ0EsSUFBSTtRQUNBO1FBQ0E7UUFDQSxJQUFJLE9BQU82N0IsU0FBUyxDQUFDRyxZQUFZLENBQUMsS0FBSyxVQUFVLEVBQUU7VUFDL0NoOEIsS0FBSyxHQUFHekQsS0FBSyxDQUNULENBQUN1L0IsYUFBYSxJQUFJLGFBQWEsSUFDM0IsSUFBSSxHQUNKcEUsUUFBUSxHQUNSLFNBQVMsR0FDVHNFLFlBQVksR0FDWixnQkFBZ0IsR0FDaEIsOEVBQThFLEdBQzlFLE9BQU9ILFNBQVMsQ0FBQ0csWUFBWSxDQUFDLEdBQzlCLElBQ1IsQ0FBQztVQUNEaDhCLEtBQUssQ0FBQzVCLElBQUksR0FBRyxxQkFBcUI7UUFDdEMsQ0FBQyxNQUFNO1VBQ0g0QixLQUFLLEdBQUc2N0IsU0FBUyxDQUFDRyxZQUFZLENBQUMsQ0FDM0JwZ0MsTUFBTSxFQUNOb2dDLFlBQVksRUFDWkYsYUFBYSxFQUNicEUsUUFBUSxFQUNSLElBQUksRUFDSmtFLDRFQUNKLENBQUM7UUFDTDtNQUNKLENBQUMsQ0FBQyxPQUFPSyxFQUFFLEVBQUU7UUFDVGo4QixLQUFLLEdBQUdpOEIsRUFBRTtNQUNkO01BQ0EsSUFBSWo4QixLQUFLLElBQUksRUFBRUEsS0FBSyxZQUFZekQsS0FBSyxDQUFDLEVBQUU7UUFDcEN3ZCxNQUFNLENBQUNwYyxJQUFJLENBQ1AsQ0FBQ20rQixhQUFhLElBQUksYUFBYSxJQUMzQiwwQkFBMEIsR0FDMUJwRSxRQUFRLEdBQ1IsSUFBSSxHQUNKc0UsWUFBWSxHQUNaLGlDQUFpQyxHQUNqQywyREFBMkQsR0FDM0QsT0FBT2g4QixLQUFLLEdBQ1osSUFBSSxHQUNKLGlFQUFpRSxHQUNqRSxnRUFBZ0UsR0FDaEUsaUNBQ1IsQ0FBQztNQUNMO01BQ0EsSUFBSUEsS0FBSyxZQUFZekQsS0FBSyxFQUFFO1FBQ3hCLElBQUkyL0IsS0FBSyxHQUFJSCxRQUFRLElBQUlBLFFBQVEsQ0FBQyxDQUFDLElBQUssRUFBRTtRQUUxQ2hpQixNQUFNLENBQUNwYyxJQUFJLENBQ1AsU0FBUyxHQUFHKzVCLFFBQVEsR0FBRyxTQUFTLEdBQUcxM0IsS0FBSyxDQUFDeVQsT0FBTyxHQUFHeW9CLEtBQ3ZELENBQUM7TUFDTDtJQUNKO0VBQ0o7RUFDQSxPQUFPbmlCLE1BQU0sQ0FBQ1AsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUM5Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2Rm9DO0FBQ1Y7QUFDUztBQUVuQyxTQUFTbFMsT0FBT0EsQ0FBQ2hFLEtBQUssRUFBRTtFQUNwQixJQUFJQSxLQUFLLENBQUM2NEIsU0FBUyxFQUFFO0lBQ2pCLG9CQUFPdjZCLDBEQUFBO01BQUtnRSxTQUFTLEVBQUM7SUFBd0IsQ0FBRSxDQUFDO0VBQ3JEO0VBQ0EsT0FBTyxJQUFJO0FBQ2Y7QUFFQTBCLE9BQU8sQ0FBQ1QsU0FBUyxHQUFHO0VBQ2hCczFCLFNBQVMsRUFBRWw2Qix3REFBYyxDQUFDbTZCO0FBQzlCLENBQUM7QUFFRCwrREFBZTM2QixvREFBTyxDQUFDLFVBQUEyRixLQUFLO0VBQUEsT0FBSztJQUM3QiswQixTQUFTLEVBQUUvMEIsS0FBSyxDQUFDKzBCO0VBQ3JCLENBQUM7QUFBQSxDQUFDLENBQUMsQ0FBQzcwQixPQUFPLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1BHO0FBQ1c7QUFDUztBQUNDO0FBQ0s7QUFBQSxJQUVuQ0UsUUFBUSwwQkFBQU8sZ0JBQUE7RUFBQUMsU0FBQSxDQUFBUixRQUFBLEVBQUFPLGdCQUFBO0VBQUEsSUFBQUUsTUFBQSxHQUFBQyxZQUFBLENBQUFWLFFBQUE7RUFDVixTQUFBQSxTQUFZbEUsS0FBSyxFQUFFO0lBQUEsSUFBQTZFLEtBQUE7SUFBQUMsZUFBQSxPQUFBWixRQUFBO0lBQ2ZXLEtBQUEsR0FBQUYsTUFBQSxDQUFBak4sSUFBQSxPQUFNc0ksS0FBSztJQUNYLElBQUlBLEtBQUssQ0FBQ0UsTUFBTSxDQUFDKzRCLFVBQVUsRUFBRTtNQUN6QixJQUFBQyxxQkFBQSxHQUE4Qmw1QixLQUFLLENBQUNFLE1BQU0sQ0FBQys0QixVQUFVO1FBQTlDdmIsUUFBUSxHQUFBd2IscUJBQUEsQ0FBUnhiLFFBQVE7UUFBRXliLFNBQVMsR0FBQUQscUJBQUEsQ0FBVEMsU0FBUztNQUMxQnQwQixLQUFBLENBQUtmLEtBQUssR0FBRztRQUNUNFosUUFBUTtRQUNSMGIsUUFBUSxFQUFFLEtBQUs7UUFDZkMsVUFBVSxFQUFFLElBQUk7UUFDaEJDLFFBQVEsRUFBRSxJQUFJO1FBQ2RIO01BQ0osQ0FBQztJQUNMLENBQUMsTUFBTTtNQUNIdDBCLEtBQUEsQ0FBS2YsS0FBSyxHQUFHO1FBQ1RzMUIsUUFBUSxFQUFFO01BQ2QsQ0FBQztJQUNMO0lBQ0F2MEIsS0FBQSxDQUFLMDBCLE1BQU0sR0FBRyxDQUFDO0lBQ2YxMEIsS0FBQSxDQUFLMjBCLEtBQUssR0FBR2h6QixRQUFRLENBQUNpekIsYUFBYSxDQUFDLE1BQU0sQ0FBQztJQUMzQzUwQixLQUFBLENBQUs2MEIsYUFBYSxHQUFHNzBCLEtBQUEsQ0FBSzYwQixhQUFhLENBQUNuNEIsSUFBSSxDQUFBNkosc0JBQUEsQ0FBQXZHLEtBQUEsQ0FBSyxDQUFDO0lBQUMsT0FBQUEsS0FBQTtFQUN2RDtFQUFDTyxZQUFBLENBQUFsQixRQUFBO0lBQUExSCxHQUFBO0lBQUFuRyxLQUFBLEVBRUQsU0FBQXFqQyxjQUFBLEVBQWdCO01BQ1o3M0IsTUFBTSxDQUFDNjNCLGFBQWEsQ0FBQyxJQUFJLENBQUM1MUIsS0FBSyxDQUFDdTFCLFVBQVUsQ0FBQztNQUMzQyxJQUFJLENBQUNNLFFBQVEsQ0FBQztRQUFDTixVQUFVLEVBQUU7TUFBSSxDQUFDLENBQUM7SUFDckM7RUFBQztJQUFBNzhCLEdBQUE7SUFBQW5HLEtBQUEsRUFtQkQsU0FBQXVqQyxtQkFBbUJDLFNBQVMsRUFBRUMsU0FBUyxFQUFFO01BQ3JDLElBQU9DLGFBQWEsR0FBSSxJQUFJLENBQUNqMkIsS0FBSyxDQUEzQmkyQixhQUFhO01BQ3BCLElBQU83NEIsUUFBUSxHQUFJLElBQUksQ0FBQ2xCLEtBQUssQ0FBdEJrQixRQUFROztNQUVmO01BQ0EsSUFBSSxDQUFDNjRCLGFBQWEsRUFBRTtRQUNoQjtNQUNKOztNQUVBO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtNQUNRLElBQUksQ0FBQ2h4QixpREFBRyxDQUFDLGVBQWUsRUFBRSt3QixTQUFTLENBQUMsRUFBRTtRQUNsQztNQUNKO01BRUEsSUFDSUMsYUFBYSxDQUFDNTNCLE1BQU0sS0FBSyxHQUFHLElBQzVCMkUsaURBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsRUFBRWl6QixhQUFhLENBQUMsS0FDMUNqekIsaURBQUksQ0FBQyxDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLEVBQUVnekIsU0FBUyxDQUFDLEVBQ2pFO1FBQ0U7UUFDQSxJQUNJQyxhQUFhLENBQUM3M0IsT0FBTyxDQUFDODNCLElBQUksSUFDMUIsQ0FBQ254QixpREFBTSxDQUNIa3hCLGFBQWEsQ0FBQzczQixPQUFPLENBQUNvM0IsUUFBUSxDQUFDNStCLE1BQU0sRUFDckM0TyxpREFBTSxDQUNGLEVBQUUsRUFDRixDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLEVBQ3hDd3dCLFNBQ0osQ0FBQyxDQUFDcC9CLE1BQ04sQ0FBQyxJQUNELENBQUNtTyxpREFBTSxDQUNIdWEsaURBQUksQ0FBQzJWLGlEQUFVLENBQUNDLDhDQUFFLENBQUMsRUFBRWUsYUFBYSxDQUFDNzNCLE9BQU8sQ0FBQ28zQixRQUFRLENBQUMsRUFDcERsVyxpREFBSSxDQUNBMlYsaURBQVUsQ0FBQ0MsOENBQUUsQ0FBQyxFQUNkMXZCLGlEQUFNLENBQ0YsRUFBRSxFQUNGLENBQUMsZUFBZSxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsRUFDeEN3d0IsU0FDSixDQUNKLENBQ0osQ0FBQyxFQUNIO1VBQ0U7VUFDQSxJQUFJRyxPQUFPLEdBQUcsS0FBSztVQUNuQjtVQUFBLElBQUFqVCxTQUFBLEdBQUFDLDBCQUFBLENBQ2M4UyxhQUFhLENBQUM3M0IsT0FBTyxDQUFDZzRCLEtBQUs7WUFBQWhULEtBQUE7VUFBQTtZQUF6QyxLQUFBRixTQUFBLENBQUFsdkIsQ0FBQSxNQUFBb3ZCLEtBQUEsR0FBQUYsU0FBQSxDQUFBL3dCLENBQUEsSUFBQWlELElBQUEsR0FBMkM7Y0FBQSxJQUFsQzFDLENBQUMsR0FBQTB3QixLQUFBLENBQUE3d0IsS0FBQTtjQUNOLElBQUlHLENBQUMsQ0FBQzJqQyxNQUFNLEVBQUU7Z0JBQ1ZGLE9BQU8sR0FBRyxJQUFJO2dCQUNkLElBQU1HLGNBQWMsR0FBRyxFQUFFOztnQkFFekI7Z0JBQ0EsSUFBTUMsRUFBRSxHQUFHN3pCLFFBQVEsQ0FBQzh6QixRQUFRLDZCQUFBdjRCLE1BQUEsQ0FDR3ZMLENBQUMsQ0FBQ29aLEdBQUcsV0FDaEMsSUFBSSxDQUFDNHBCLEtBQ1QsQ0FBQztnQkFDRCxJQUFJcHRCLElBQUksR0FBR2l1QixFQUFFLENBQUNFLFdBQVcsQ0FBQyxDQUFDO2dCQUUzQixPQUFPbnVCLElBQUksRUFBRTtrQkFDVGd1QixjQUFjLENBQUMvL0IsSUFBSSxDQUFDK1IsSUFBSSxDQUFDO2tCQUN6QkEsSUFBSSxHQUFHaXVCLEVBQUUsQ0FBQ0UsV0FBVyxDQUFDLENBQUM7Z0JBQzNCO2dCQUVBOWhDLGtEQUFPLENBQ0gsVUFBQXhDLENBQUM7a0JBQUEsT0FBSUEsQ0FBQyxDQUFDdWtDLFlBQVksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDO2dCQUFBLEdBQzNDSixjQUNKLENBQUM7Z0JBRUQsSUFBSTVqQyxDQUFDLENBQUNrN0IsUUFBUSxHQUFHLENBQUMsRUFBRTtrQkFDaEIsSUFBTStJLElBQUksR0FBR2owQixRQUFRLENBQUNuRSxhQUFhLENBQUMsTUFBTSxDQUFDO2tCQUMzQ280QixJQUFJLENBQUNDLElBQUksTUFBQTM0QixNQUFBLENBQU12TCxDQUFDLENBQUNvWixHQUFHLFNBQUE3TixNQUFBLENBQU12TCxDQUFDLENBQUNrN0IsUUFBUSxDQUFFO2tCQUN0QytJLElBQUksQ0FBQ2pqQyxJQUFJLEdBQUcsVUFBVTtrQkFDdEJpakMsSUFBSSxDQUFDRSxHQUFHLEdBQUcsWUFBWTtrQkFDdkIsSUFBSSxDQUFDbkIsS0FBSyxDQUFDb0IsV0FBVyxDQUFDSCxJQUFJLENBQUM7a0JBQzVCO2dCQUNKO2NBQ0osQ0FBQyxNQUFNO2dCQUNIO2dCQUNBUixPQUFPLEdBQUcsS0FBSztnQkFDZjtjQUNKO1lBQ0o7VUFBQyxTQUFBaDlCLEdBQUE7WUFBQStwQixTQUFBLENBQUFweEIsQ0FBQSxDQUFBcUgsR0FBQTtVQUFBO1lBQUErcEIsU0FBQSxDQUFBbnZCLENBQUE7VUFBQTtVQUNELElBQUksQ0FBQ29pQyxPQUFPLEVBQUU7WUFDVjtZQUNBO1lBQ0E7WUFDQXA0QixNQUFNLENBQUN1eUIsUUFBUSxDQUFDeUcsTUFBTSxDQUFDLENBQUM7VUFDNUI7UUFDSixDQUFDLE1BQU07VUFDSDtVQUNBMzVCLFFBQVEsQ0FBQztZQUFDMUosSUFBSSxFQUFFO1VBQVEsQ0FBQyxDQUFDO1FBQzlCO01BQ0osQ0FBQyxNQUFNLElBQ0gsSUFBSSxDQUFDc00sS0FBSyxDQUFDdTFCLFVBQVUsS0FBSyxJQUFJLElBQzlCVSxhQUFhLENBQUM1M0IsTUFBTSxLQUFLLEdBQUcsRUFDOUI7UUFDRSxJQUFJLElBQUksQ0FBQ28zQixNQUFNLEdBQUcsSUFBSSxDQUFDejFCLEtBQUssQ0FBQ3ExQixTQUFTLEVBQUU7VUFDcEMsSUFBSSxDQUFDTyxhQUFhLENBQUMsQ0FBQztVQUNwQjtVQUNBNzNCLE1BQU0sQ0FBQ2k1QixLQUFLLENBQ1IsMkNBQUEvNEIsTUFBQSxDQUEyQyxJQUFJLENBQUN3M0IsTUFBTSxnQkFDbEQsa0VBQ1IsQ0FBQztRQUNMO1FBQ0EsSUFBSSxDQUFDQSxNQUFNLEVBQUU7TUFDakI7SUFDSjtFQUFDO0lBQUEvOEIsR0FBQTtJQUFBbkcsS0FBQSxFQUVELFNBQUEwa0Msa0JBQUEsRUFBb0I7TUFDaEIsSUFBQXZ2QixXQUFBLEdBQWtDLElBQUksQ0FBQ3hMLEtBQUs7UUFBckNrQixRQUFRLEdBQUFzSyxXQUFBLENBQVJ0SyxRQUFRO1FBQUU2NEIsYUFBYSxHQUFBdnVCLFdBQUEsQ0FBYnV1QixhQUFhO01BQzlCLElBQUFpQixXQUFBLEdBQTZCLElBQUksQ0FBQ2wzQixLQUFLO1FBQWhDczFCLFFBQVEsR0FBQTRCLFdBQUEsQ0FBUjVCLFFBQVE7UUFBRTFiLFFBQVEsR0FBQXNkLFdBQUEsQ0FBUnRkLFFBQVE7TUFDekIsSUFBSSxDQUFDMGIsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDdDFCLEtBQUssQ0FBQ3UxQixVQUFVLEVBQUU7UUFDckMsSUFBTUEsVUFBVSxHQUFHeDNCLE1BQU0sQ0FBQ281QixXQUFXLENBQUMsWUFBTTtVQUN4QztVQUNBO1VBQ0EsSUFBSWxCLGFBQWEsQ0FBQzUzQixNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ3BDakIsUUFBUSxDQUFDNUIsd0RBQVEsQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1VBQzlEO1FBQ0osQ0FBQyxFQUFFb2UsUUFBUSxDQUFDO1FBQ1osSUFBSSxDQUFDaWMsUUFBUSxDQUFDO1VBQUNOO1FBQVUsQ0FBQyxDQUFDO01BQy9CO0lBQ0o7RUFBQztJQUFBNzhCLEdBQUE7SUFBQW5HLEtBQUEsRUFFRCxTQUFBNmtDLHFCQUFBLEVBQXVCO01BQ25CLElBQUksQ0FBQyxJQUFJLENBQUNwM0IsS0FBSyxDQUFDczFCLFFBQVEsSUFBSSxJQUFJLENBQUN0MUIsS0FBSyxDQUFDdTFCLFVBQVUsRUFBRTtRQUMvQyxJQUFJLENBQUNLLGFBQWEsQ0FBQyxDQUFDO01BQ3hCO0lBQ0o7RUFBQztJQUFBbDlCLEdBQUE7SUFBQW5HLEtBQUEsRUFFRCxTQUFBcVAsT0FBQSxFQUFTO01BQ0wsT0FBTyxJQUFJO0lBQ2Y7RUFBQztJQUFBbEosR0FBQTtJQUFBbkcsS0FBQSxFQXhKRCxTQUFBOGtDLHlCQUFnQ243QixLQUFLLEVBQUU7TUFDbkM7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7TUFDUSxJQUNJLENBQUMzQixrREFBTyxDQUFDMkIsS0FBSyxDQUFDKzVCLGFBQWEsQ0FBQyxJQUM3Qi81QixLQUFLLENBQUMrNUIsYUFBYSxDQUFDNTNCLE1BQU0sS0FBSyxTQUFTLEVBQzFDO1FBQ0UsT0FBTztVQUFDNDNCLGFBQWEsRUFBRS81QixLQUFLLENBQUMrNUI7UUFBYSxDQUFDO01BQy9DO01BQ0EsT0FBTyxJQUFJO0lBQ2Y7RUFBQztFQUFBLE9BQUE3MUIsUUFBQTtBQUFBLEVBMUNrQjVGLHdEQUFlO0FBc0x0QzRGLFFBQVEsQ0FBQ2tDLFlBQVksR0FBRyxDQUFDLENBQUM7QUFFMUJsQyxRQUFRLENBQUNYLFNBQVMsR0FBRztFQUNqQmdILEVBQUUsRUFBRTVMLDBEQUFnQjtFQUNwQnVCLE1BQU0sRUFBRXZCLDBEQUFnQjtFQUN4Qm83QixhQUFhLEVBQUVwN0IsMERBQWdCO0VBQy9CdUMsUUFBUSxFQUFFdkMsd0RBQWM7RUFDeEIrZSxRQUFRLEVBQUUvZSwwREFBZ0J5OEI7QUFDOUIsQ0FBQztBQUVELCtEQUFlajlCLG9EQUFPLENBQ2xCLFVBQUEyRixLQUFLO0VBQUEsT0FBSztJQUNONUQsTUFBTSxFQUFFNEQsS0FBSyxDQUFDNUQsTUFBTTtJQUNwQjY1QixhQUFhLEVBQUVqMkIsS0FBSyxDQUFDaTJCO0VBQ3pCLENBQUM7QUFBQSxDQUFDLEVBQ0YsVUFBQTc0QixRQUFRO0VBQUEsT0FBSztJQUFDQTtFQUFRLENBQUM7QUFBQSxDQUMzQixDQUFDLENBQUNnRCxRQUFRLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0TnlCO0FBQ1Y7QUFDUztBQUNlO0FBQzNCO0FBRXZCLFNBQVNtM0Isa0JBQWtCQSxDQUFDcjdCLEtBQUssRUFBRTtFQUMvQixJQUFPa0IsUUFBUSxHQUFhbEIsS0FBSyxDQUExQmtCLFFBQVE7SUFBRTBDLE9BQU8sR0FBSTVELEtBQUssQ0FBaEI0RCxPQUFPO0VBRXhCLElBQU0wM0IsUUFBUSxnQkFDVmg5QiwwREFBQTtJQUNJOUIsR0FBRyxFQUFDLFVBQVU7SUFDZDhGLFNBQVMsRUFBQyxzQkFBc0I7SUFDaENpNUIsT0FBTyxFQUFFLFNBQUFBLFFBQUE7TUFBQSxPQUFNcjZCLFFBQVEsQ0FBQ3N4QixtREFBSSxDQUFDO0lBQUE7RUFBQyxnQkFFOUJsMEIsMERBQUE7SUFBS2dFLFNBQVMsRUFBQztFQUFpQixHQUFDLFFBQU0sQ0FBQyxlQUN4Q2hFLDBEQUFBO0lBQUtnRSxTQUFTLEVBQUM7RUFBdUIsR0FBQyxNQUFTLENBQzlDLENBQ1Q7RUFFRCxJQUFNazVCLFFBQVEsZ0JBQ1ZsOUIsMERBQUE7SUFDSTlCLEdBQUcsRUFBQyxVQUFVO0lBQ2Q4RixTQUFTLEVBQUMsc0JBQXNCO0lBQ2hDaTVCLE9BQU8sRUFBRSxTQUFBQSxRQUFBO01BQUEsT0FBTXI2QixRQUFRLENBQUNveEIsbURBQUksQ0FBQztJQUFBO0VBQUMsZ0JBRTlCaDBCLDBEQUFBO0lBQUtnRSxTQUFTLEVBQUM7RUFBaUIsR0FBQyxRQUFNLENBQUMsZUFDeENoRSwwREFBQTtJQUFLZ0UsU0FBUyxFQUFDO0VBQXVCLEdBQUMsTUFBUyxDQUM5QyxDQUNUO0VBRUQsb0JBQ0loRSwwREFBQTtJQUFLZ0UsU0FBUyxFQUFDO0VBQWlCLGdCQUM1QmhFLDBEQUFBLGNBQ0tzRixPQUFPLENBQUNndkIsSUFBSSxDQUFDbDRCLE1BQU0sR0FBRyxDQUFDLEdBQUc0Z0MsUUFBUSxHQUFHLElBQUksRUFDekMxM0IsT0FBTyxDQUFDK3VCLE1BQU0sQ0FBQ2o0QixNQUFNLEdBQUcsQ0FBQyxHQUFHOGdDLFFBQVEsR0FBRyxJQUN2QyxDQUNKLENBQUM7QUFFZDtBQUVBSCxrQkFBa0IsQ0FBQzkzQixTQUFTLEdBQUc7RUFDM0JLLE9BQU8sRUFBRWpGLDBEQUFnQjtFQUN6QnVDLFFBQVEsRUFBRXZDLHdEQUFjOEU7QUFDNUIsQ0FBQztBQUVELElBQU1RLE9BQU8sR0FBRzlGLG9EQUFPLENBQ25CLFVBQUEyRixLQUFLO0VBQUEsT0FBSztJQUNORixPQUFPLEVBQUVFLEtBQUssQ0FBQ0Y7RUFDbkIsQ0FBQztBQUFBLENBQUMsRUFDRixVQUFBMUMsUUFBUTtFQUFBLE9BQUs7SUFBQ0E7RUFBUSxDQUFDO0FBQUEsQ0FDM0IsQ0FBQyxDQUFDbTZCLGtCQUFrQixDQUFDO0FBRXJCLCtEQUFlcDNCLE9BQU87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JEdUQ7QUFDMUM7QUFDYztBQUNmO0FBQ2lCO0FBQ2Y7QUFDQTtBQUNLO0FBQ2tCO0FBRVo7QUFDVztBQUNqQjtBQUVIO0FBQ3NCO0FBSzVCO0FBRWhDMDNCLG9EQUFhLENBQUNFLHdEQUFLLENBQUM7QUFDcEJGLG9EQUFhLENBQUNHLHdEQUFLLENBQUM7O0FBRXBCO0FBQ0E7QUFDQTtBQUNBLFNBQVNRLGdCQUFnQkEsQ0FBQ2w3QixNQUFNLEVBQUVtN0IsT0FBTyxFQUFFQyxVQUFVLEVBQUU7RUFDbkQsSUFBTUMsUUFBUSxHQUFHLEVBQUU7RUFDbkIsSUFBTUMsUUFBUSxHQUFHLEVBQUU7RUFDbkIsSUFBTUMsU0FBUyxHQUFHLENBQUMsQ0FBQztFQUVwQixTQUFTQyxVQUFVQSxDQUFDcnlCLEVBQUUsRUFBRXN5QixXQUFXLEVBQUU7SUFDakMsSUFBTTdtQixRQUFRLEdBQUc2bUIsV0FBVyxDQUFDOTBCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsSUFBTWlTLEtBQUssR0FBR2xRLGtFQUFXLENBQUNTLEVBQUUsQ0FBQztJQUM3QixJQUFNdXlCLE1BQU0sR0FBRyxPQUFPdnlCLEVBQUUsS0FBSyxRQUFRLEdBQUcsVUFBVSxHQUFHLFdBQVc7O0lBRWhFO0lBQ0EsSUFBTXd5QixRQUFRLEdBQUcvaUIsS0FBSztJQUN0QixJQUFNZ2pCLE9BQU8sTUFBQWo3QixNQUFBLENBQU1nN0IsUUFBUSxRQUFBaDdCLE1BQUEsQ0FBS2lVLFFBQVEsQ0FBRTtJQUUxQyxJQUFJLENBQUN5bUIsUUFBUSxDQUFDcitCLFFBQVEsQ0FBQzIrQixRQUFRLENBQUMsRUFBRTtNQUM5Qk4sUUFBUSxDQUFDcGlDLElBQUksQ0FBQzBpQyxRQUFRLENBQUM7TUFDdkJMLFFBQVEsQ0FBQ3JpQyxJQUFJLENBQUM7UUFDVjBpQixJQUFJLEVBQUU7VUFDRnhTLEVBQUUsRUFBRXd5QixRQUFRO1VBQ1pFLEtBQUssRUFBRWpqQixLQUFLO1VBQ1p4aUIsSUFBSSxFQUFFc2xDO1FBQ1Y7TUFDSixDQUFDLENBQUM7TUFDRkgsU0FBUyxDQUFDSSxRQUFRLENBQUMsR0FBRyxFQUFFO0lBQzVCO0lBRUEsSUFBSSxDQUFDTixRQUFRLENBQUNyK0IsUUFBUSxDQUFDNCtCLE9BQU8sQ0FBQyxFQUFFO01BQzdCUCxRQUFRLENBQUNwaUMsSUFBSSxDQUFDMmlDLE9BQU8sQ0FBQztNQUN0Qk4sUUFBUSxDQUFDcmlDLElBQUksQ0FBQztRQUNWMGlCLElBQUksRUFBRTtVQUNGeFMsRUFBRSxFQUFFeXlCLE9BQU87VUFDWEMsS0FBSyxFQUFFam5CLFFBQVE7VUFDZmtuQixNQUFNLEVBQUVILFFBQVE7VUFDaEJ2bEMsSUFBSSxFQUFFO1FBQ1Y7TUFDSixDQUFDLENBQUM7TUFDRm1sQyxTQUFTLENBQUNJLFFBQVEsQ0FBQyxDQUFDMWlDLElBQUksQ0FBQzJpQyxPQUFPLENBQUM7SUFDckM7SUFFQSxPQUFPQSxPQUFPO0VBQ2xCO0VBRUEsU0FBU0csVUFBVUEsQ0FBQ0MsTUFBTSxFQUFFaEssTUFBTSxFQUFFNTdCLElBQUksRUFBRTtJQUN0Q2tsQyxRQUFRLENBQUNyaUMsSUFBSSxDQUFDO01BQ1YwaUIsSUFBSSxFQUFFO1FBQ0ZxZ0IsTUFBTSxFQUFFQSxNQUFNO1FBQ2RoSyxNQUFNLEVBQUVBLE1BQU07UUFDZDU3QixJQUFJLEVBQUVBO01BQ1Y7SUFDSixDQUFDLENBQUM7RUFDTjtFQUVBLENBQUM0SixNQUFNLENBQUM2aUIsU0FBUyxJQUFJLEVBQUUsRUFBRXhyQixPQUFPLENBQUMsVUFBQzZsQixRQUFRLEVBQUVob0IsQ0FBQyxFQUFLO0lBQzlDLElBQU04ZixFQUFFLHdCQUFBclUsTUFBQSxDQUF3QnVjLFFBQVEsQ0FBQzdELE1BQU0sQ0FBRTtJQUNqRCxJQUFNNGlCLFNBQVMsR0FBR2QsT0FBTyxDQUFDdFksU0FBUyxDQUFDM0YsUUFBUSxDQUFDN0QsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFELElBQU02aUIsS0FBSyxHQUFHRCxTQUFTLENBQUNDLEtBQUssSUFBSSxDQUFDO0lBQ2xDLElBQU1DLElBQUksR0FBR0YsU0FBUyxDQUFDRyxLQUFLLElBQUksQ0FBQztJQUVqQ2QsUUFBUSxDQUFDcmlDLElBQUksQ0FBQztNQUNWMGlCLElBQUksRUFBRTtRQUNGeFMsRUFBRSxFQUFFNkwsRUFBRTtRQUNONm1CLEtBQUssY0FBQWw3QixNQUFBLENBQWN6TCxDQUFDLENBQUU7UUFDdEJrQixJQUFJLEVBQUUsVUFBVTtRQUNoQmltQyxJQUFJLEVBQUVuZixRQUFRLENBQUN6RyxtQkFBbUIsR0FBRyxRQUFRLEdBQUcsUUFBUTtRQUN4RHlsQixLQUFLLEVBQUVBLEtBQUs7UUFDWkMsSUFBSSxFQUFFRCxLQUFLLEdBQUcsQ0FBQyxHQUFHbk8sSUFBSSxDQUFDdU8sS0FBSyxDQUFDSCxJQUFJLEdBQUdELEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDOUNLLFVBQVUsRUFBRTVrQixJQUFJLENBQUNDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCNGtCLFFBQVEsRUFBRTdrQixJQUFJLENBQUNDLEdBQUcsQ0FBQztNQUN2QjtJQUNKLENBQUMsQ0FBQztJQUVGc0YsUUFBUSxDQUFDdkcsT0FBTyxDQUFDbFIsR0FBRyxDQUFDLFVBQUFaLElBQUEsRUFBb0I7TUFBQSxJQUFsQnNFLEVBQUUsR0FBQXRFLElBQUEsQ0FBRnNFLEVBQUU7UUFBRXlMLFFBQVEsR0FBQS9QLElBQUEsQ0FBUitQLFFBQVE7TUFDL0IsSUFBTTZuQixNQUFNLEdBQUdqQixVQUFVLENBQUNyeUIsRUFBRSxFQUFFeUwsUUFBUSxDQUFDO01BQ3ZDbW5CLFVBQVUsQ0FBQy9tQixFQUFFLEVBQUV5bkIsTUFBTSxFQUFFLFFBQVEsQ0FBQztJQUNwQyxDQUFDLENBQUM7SUFFRnZmLFFBQVEsQ0FBQ3BYLE1BQU0sQ0FBQ0wsR0FBRyxDQUFDLFVBQUErVCxLQUFBLEVBQW9CO01BQUEsSUFBbEJyUSxFQUFFLEdBQUFxUSxLQUFBLENBQUZyUSxFQUFFO1FBQUV5TCxRQUFRLEdBQUE0RSxLQUFBLENBQVI1RSxRQUFRO01BQzlCLElBQU02bkIsTUFBTSxHQUFHakIsVUFBVSxDQUFDcnlCLEVBQUUsRUFBRXlMLFFBQVEsQ0FBQztNQUN2Q21uQixVQUFVLENBQUNVLE1BQU0sRUFBRXpuQixFQUFFLEVBQUUsT0FBTyxDQUFDO0lBQ25DLENBQUMsQ0FBQztJQUVGa0ksUUFBUSxDQUFDeGEsS0FBSyxDQUFDK0MsR0FBRyxDQUFDLFVBQUFnVSxLQUFBLEVBQW9CO01BQUEsSUFBbEJ0USxFQUFFLEdBQUFzUSxLQUFBLENBQUZ0USxFQUFFO1FBQUV5TCxRQUFRLEdBQUE2RSxLQUFBLENBQVI3RSxRQUFRO01BQzdCLElBQU02bkIsTUFBTSxHQUFHakIsVUFBVSxDQUFDcnlCLEVBQUUsRUFBRXlMLFFBQVEsQ0FBQztNQUN2Q21uQixVQUFVLENBQUNVLE1BQU0sRUFBRXpuQixFQUFFLEVBQUUsT0FBTyxDQUFDO0lBQ25DLENBQUMsQ0FBQztFQUNOLENBQUMsQ0FBQzs7RUFFRjtFQUNBLElBQUlvbUIsVUFBVSxFQUFFO0lBQ1psa0Msa0RBQU0sQ0FBQ3FrQyxTQUFTLENBQUMsQ0FBQ2xrQyxPQUFPLENBQUMsVUFBQXFsQyxRQUFRLEVBQUk7TUFDbENBLFFBQVEsQ0FBQ3JsQyxPQUFPLENBQUMsVUFBQXNsQyxTQUFTLEVBQUk7UUFDMUJELFFBQVEsQ0FBQ3JsQyxPQUFPLENBQUMsVUFBQXVsQyxPQUFPLEVBQUk7VUFDeEIsSUFBSUQsU0FBUyxLQUFLQyxPQUFPLEVBQUU7WUFDdkJiLFVBQVUsQ0FBQ1ksU0FBUyxFQUFFQyxPQUFPLEVBQUUsUUFBUSxDQUFDO1VBQzVDO1FBQ0osQ0FBQyxDQUFDO01BQ04sQ0FBQyxDQUFDO0lBQ04sQ0FBQyxDQUFDO0VBQ047RUFFQSxPQUFPdEIsUUFBUTtBQUNuQjtBQUVBLFNBQVN1QixZQUFZQSxDQUFDOTdCLE1BQU0sRUFBRTtFQUMxQixJQUFJOUcsa0RBQUksQ0FBQzhHLE1BQU0sQ0FBQyxDQUFDekgsTUFBTSxLQUFLLENBQUMsRUFBRTtJQUMzQixPQUFPeUgsTUFBTSxDQUFDKzdCLE1BQU07RUFDeEI7RUFDQSxPQUFPLzdCLE1BQU07QUFDakI7QUFFQSxTQUFTZzhCLGNBQWNBLENBQUNydUIsR0FBRyxFQUFFO0VBQ3pCLElBQU1pSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEtBQUssSUFBTWlDLEtBQUssSUFBSWxLLEdBQUcsRUFBRTtJQUNyQixLQUFLLElBQU1nVSxJQUFJLElBQUloVSxHQUFHLENBQUNrSyxLQUFLLENBQUMsRUFBRTtNQUMzQmpDLE9BQU8sQ0FBQ2lDLEtBQUssR0FBRyxHQUFHLEdBQUc4SixJQUFJLENBQUMsR0FBR2hVLEdBQUcsQ0FBQ2tLLEtBQUssQ0FBQyxDQUFDOEosSUFBSSxDQUFDO0lBQ2xEO0VBQ0o7RUFDQSxPQUFPL0wsT0FBTztBQUNsQjtBQUVBLFNBQVNxbUIsYUFBYUEsQ0FBQ0MsT0FBTyxFQUFFQyxLQUFLLEVBQUU7RUFDbkMsQ0FBQ0QsT0FBTyxJQUFJLEVBQUUsRUFBRTVsQyxPQUFPLENBQUMsVUFBQThsQyxNQUFNLEVBQUk7SUFDOUIsSUFBSTNnQyxLQUFLLENBQUNLLE9BQU8sQ0FBQ3NnQyxNQUFNLENBQUMsRUFBRTtNQUN2QkgsYUFBYSxDQUFDRyxNQUFNLEVBQUVELEtBQUssQ0FBQztJQUNoQyxDQUFDLE1BQU07TUFDSCxJQUFPL3pCLEVBQUUsR0FBcUJnMEIsTUFBTSxDQUE3QmgwQixFQUFFO1FBQUV5TCxRQUFRLEdBQVd1b0IsTUFBTSxDQUF6QnZvQixRQUFRO1FBQUUzZixLQUFLLEdBQUlrb0MsTUFBTSxDQUFmbG9DLEtBQUs7TUFDMUJpb0MsS0FBSyxDQUFDeDBCLGtFQUFXLENBQUNTLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBR3lMLFFBQVEsQ0FBQyxHQUFHM2YsS0FBSztJQUNuRDtFQUNKLENBQUMsQ0FBQztFQUNGLE9BQU9pb0MsS0FBSztBQUNoQjtBQUVBLFNBQVNFLGFBQWFBLENBQUNDLFFBQVEsRUFBRTtFQUM3QixPQUFPQSxRQUFRLENBQ1ZueEIsT0FBTyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUM3QnZGLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FDWmtuQixNQUFNLENBQ0gsVUFBQ3lQLEdBQUcsRUFBRTdrQyxJQUFJO0lBQUEsT0FDTjZrQyxHQUFHLENBQUMzOEIsTUFBTSxDQUNObEksSUFBSSxDQUFDeVQsT0FBTyxDQUFDLGdCQUFnQixFQUFFLFVBQUM5VyxDQUFDLEVBQUU4Z0IsQ0FBQztNQUFBLE9BQUtBLENBQUMsR0FBRyxjQUFjO0lBQUEsRUFDL0QsQ0FBQztFQUFBLEdBQ0wsRUFDSixDQUFDLENBQ0FwQixJQUFJLENBQUMsS0FBSyxDQUFDO0FBQ3BCOztBQUVBO0FBQ0EsSUFBTXlvQixXQUFXLEdBQUcsRUFBRTtBQUV0QixJQUFNQyxXQUFXLEdBQUc7RUFDaEI5akMsSUFBSSxFQUFFLE9BQU87RUFDYitqQyxPQUFPLEVBQUUsRUFBRTtFQUNYQyxNQUFNLEVBQUU7QUFDWixDQUFDO0FBRUQsSUFBTUMsV0FBVyxHQUFHO0VBQUNqa0MsSUFBSSxFQUFFLE9BQU87RUFBRStqQyxPQUFPLEVBQUUsRUFBRTtFQUFFRyxPQUFPLEVBQUU7QUFBSyxDQUFDO0FBRWhFLElBQU1DLE9BQU8sR0FBRztFQUNaLFVBQVUsRUFBQTk1QixhQUFBLENBQUFBLGFBQUEsS0FBTXk1QixXQUFXO0lBQUVNLGFBQWEsRUFBRTtFQUFHLEVBQUM7RUFDaEQsWUFBWSxFQUFBLzVCLGFBQUEsQ0FBQUEsYUFBQSxLQUFNeTVCLFdBQVc7SUFBRU8sT0FBTyxFQUFFLENBQUM7SUFBRUMsT0FBTyxFQUFFLEVBQUU7SUFBRUMsT0FBTyxFQUFFO0VBQUksRUFBQztFQUN0RUMsS0FBSyxFQUFFUCxXQUFXO0VBQ2xCLGFBQWEsRUFBRUE7QUFDbkIsQ0FBQztBQUVELFNBQVNRLGFBQWFBLENBQUEsRUFBRztFQUNyQjtFQUNBLElBQU05cEIsS0FBSyxHQUFHaW1CLHdEQUFXLENBQUMsVUFBQTUzQixLQUFLO0lBQUEsT0FBSUEsS0FBSyxDQUFDMlIsS0FBSztFQUFBLEVBQUM7RUFDL0MsSUFBTXBWLE1BQU0sR0FBR3E3Qix3REFBVyxDQUFDLFVBQUE1M0IsS0FBSztJQUFBLE9BQUlBLEtBQUssQ0FBQ3pELE1BQU07RUFBQSxFQUFDO0VBQ2pELElBQU1lLE1BQU0sR0FBR3M2Qix3REFBVyxDQUFDLFVBQUE1M0IsS0FBSztJQUFBLE9BQUlBLEtBQUssQ0FBQzFDLE1BQU07RUFBQSxFQUFDO0VBQ2pELElBQU1tN0IsT0FBTyxHQUFHYix3REFBVyxDQUFDLFVBQUE1M0IsS0FBSztJQUFBLE9BQUlBLEtBQUssQ0FBQ3k0QixPQUFPO0VBQUEsRUFBQztFQUNuRCxJQUFNaUQsT0FBTyxHQUFHOUQsd0RBQVcsQ0FBQyxVQUFBNTNCLEtBQUs7SUFBQSxPQUFJQSxLQUFLLENBQUMwN0IsT0FBTztFQUFBLEVBQUM7RUFDbkQsSUFBTUMsY0FBYyxHQUFHL0Qsd0RBQVcsQ0FBQyxVQUFBNTNCLEtBQUs7SUFBQSxPQUFJQSxLQUFLLENBQUM3RCxZQUFZO0VBQUEsRUFBQzs7RUFFL0Q7RUFDQSxJQUFBTSxTQUFBLEdBQWdDOUIsK0NBQVEsQ0FBQyxJQUFJLENBQUM7SUFBQStCLFVBQUEsR0FBQXJELGNBQUEsQ0FBQW9ELFNBQUE7SUFBdkNtL0IsUUFBUSxHQUFBbC9CLFVBQUE7SUFBRW0vQixXQUFXLEdBQUFuL0IsVUFBQTtFQUM1QixJQUFBby9CLFVBQUEsR0FBa0NuaEMsK0NBQVEsQ0FBQyxJQUFJLENBQUM7SUFBQW9oQyxVQUFBLEdBQUExaUMsY0FBQSxDQUFBeWlDLFVBQUE7SUFBekNFLFNBQVMsR0FBQUQsVUFBQTtJQUFFRSxZQUFZLEdBQUFGLFVBQUE7RUFFOUIsSUFBT0csV0FBVyxHQUFJekQsT0FBTyxDQUF0QnlELFdBQVc7RUFDbEIsSUFBTUMsVUFBVSxHQUFHRCxXQUFXLGFBQVhBLFdBQVcsdUJBQVhBLFdBQVcsQ0FBRUUsV0FBVztFQUMzQyxJQUFNQyxjQUFjLEdBQUczaEMsNkNBQU0sQ0FBQyxJQUFJLENBQUM7RUFDbkMsSUFBQTRoQyxVQUFBLEdBQW9DM2hDLCtDQUFRLENBQUN3aEMsVUFBVSxJQUFJLFVBQVUsQ0FBQztJQUFBSSxVQUFBLEdBQUFsakMsY0FBQSxDQUFBaWpDLFVBQUE7SUFBL0RFLFVBQVUsR0FBQUQsVUFBQTtJQUFFRSxhQUFhLEdBQUFGLFVBQUE7O0VBRWhDO0VBQ0EsSUFBTTNELFFBQVEsR0FBR2pCLDhDQUFPLENBQ3BCO0lBQUEsT0FBTWEsZ0JBQWdCLENBQUNsN0IsTUFBTSxFQUFFbTdCLE9BQU8sRUFBRStELFVBQVUsS0FBSyxPQUFPLENBQUM7RUFBQSxHQUMvRCxDQUFDbC9CLE1BQU0sRUFBRWsvQixVQUFVLENBQ3ZCLENBQUM7O0VBRUQ7RUFDQSxJQUFNRSxrQkFBa0IsR0FBRyxTQUFyQkEsa0JBQWtCQSxDQUFJQyxNQUFNLEVBQUVDLFNBQVMsRUFBSztJQUM5Q25pQyxnREFBUyxDQUNMO01BQUEsT0FBT3VoQyxTQUFTLElBQUlXLE1BQU0sQ0FBQ1gsU0FBUyxDQUFDLElBQUs1aUMsU0FBUztJQUFBLEdBQ25Ed2pDLFNBQ0osQ0FBQztFQUNMLENBQUM7RUFFRCxTQUFTbjBCLFlBQVlBLENBQUNoQyxFQUFFLEVBQUU7SUFDdEI7SUFDQTtJQUNBO0lBQ0EsSUFBSUEsRUFBRSxDQUFDOU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtNQUN0QmtsQyxXQUFXLEdBQUcsSUFBSTtNQUNsQixPQUFPempDLFNBQVM7SUFDcEI7SUFDQSxJQUFNaXJCLE1BQU0sR0FBR2pWLHVEQUFPLENBQUN1QyxLQUFLLEVBQUVsTCxFQUFFLENBQUM7SUFDakMsT0FBTzRkLE1BQU0sR0FBR3JoQixrREFBSSxDQUFDcWhCLE1BQU0sRUFBRTluQixNQUFNLENBQUMsR0FBR25ELFNBQVM7RUFDcEQ7RUFFQSxTQUFTMGpDLFlBQVlBLENBQUM3akIsSUFBSSxFQUFFO0lBQ3hCLElBQU1tZ0IsTUFBTSxHQUFHM3dCLFlBQVksQ0FBQ3dRLElBQUksQ0FBQ21nQixNQUFNLENBQUM7SUFDeEMsT0FBT0EsTUFBTSxHQUFHQSxNQUFNLENBQUNsOUIsS0FBSyxDQUFDK2MsSUFBSSxDQUFDa2dCLEtBQUssQ0FBQyxHQUFHLy9CLFNBQVM7RUFDeEQ7RUFFQSxTQUFTMmpDLGVBQWVBLENBQUFobEIsS0FBQSxFQUFPO0lBQUEsSUFBQWlsQixxQkFBQTtJQUFBLElBQUxDLEVBQUUsR0FBQWxsQixLQUFBLENBQUZrbEIsRUFBRTtJQUN4QixJQUFNQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCRCxFQUFFLENBQUNFLEtBQUssQ0FBQyxDQUFDLENBQUNDLElBQUksQ0FBQyxVQUFBanJDLENBQUMsRUFBSTtNQUNqQitxQyxTQUFTLENBQUMvcUMsQ0FBQyxDQUFDc1UsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHdFUsQ0FBQyxDQUFDa3JDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLENBQUMsQ0FBQzs7SUFFRjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTVFLE9BQU8sQ0FBQ3lELFdBQVcsR0FBRztNQUNsQmxsQyxJQUFJLEVBQUUsUUFBUTtNQUNkc21DLEdBQUcsRUFBRSxLQUFLO01BQ1ZKLFNBQVM7TUFDVEssSUFBSSxFQUFFTixFQUFFLENBQUNNLElBQUksQ0FBQyxDQUFDO01BQ2ZDLEdBQUcsRUFBRVAsRUFBRSxDQUFDTyxHQUFHLENBQUMsQ0FBQztNQUNicEIsV0FBVyxHQUFBWSxxQkFBQSxHQUFFWCxjQUFjLENBQUN2L0IsT0FBTyxjQUFBa2dDLHFCQUFBLHVCQUF0QkEscUJBQUEsQ0FBd0J6cUM7SUFDekMsQ0FBQztFQUNMOztFQUVBO0VBQ0FtcUMsa0JBQWtCLENBQ2QsVUFBQU8sRUFBRSxFQUFJO0lBQ0ZqQixTQUFTLENBQUNqSSxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFBamlDLENBQUM7TUFBQSxPQUFJK3BDLFdBQVcsQ0FBQy9wQyxDQUFDLENBQUN3OUIsTUFBTSxDQUFDO0lBQUEsRUFBQztJQUN2RDBNLFNBQVMsQ0FBQ2pJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsVUFBQWppQyxDQUFDLEVBQUk7TUFDckIsSUFBSUEsQ0FBQyxDQUFDdzlCLE1BQU0sS0FBSzJOLEVBQUUsRUFBRTtRQUNqQnBCLFdBQVcsQ0FBQyxJQUFJLENBQUM7TUFDckI7SUFDSixDQUFDLENBQUM7SUFDRkcsU0FBUyxDQUFDakksRUFBRSxDQUFDLE1BQU0sRUFBRWdKLGVBQWUsQ0FBQztJQUNyQ2YsU0FBUyxDQUFDakksRUFBRSxDQUFDLEtBQUssRUFBRWdKLGVBQWUsQ0FBQztJQUNwQ2YsU0FBUyxDQUFDbUIsS0FBSyxDQUFDLENBQUMsQ0FBQ3BKLEVBQUUsQ0FBQyxVQUFVLEVBQUVnSixlQUFlLENBQUM7RUFDckQsQ0FBQyxFQUNELENBQUNmLFNBQVMsQ0FDZCxDQUFDOztFQUVEO0VBQ0FVLGtCQUFrQixDQUNkLFVBQUFPLEVBQUU7SUFBQSxPQUFJckIsUUFBUSxJQUFJeEQsMEVBQWtCLENBQUM2RSxFQUFFLEVBQUVyQixRQUFRLENBQUMzaUIsSUFBSSxDQUFDLENBQUMsQ0FBQ3hTLEVBQUUsQ0FBQztFQUFBLEdBQzVELENBQUNtMUIsUUFBUSxDQUNiLENBQUM7O0VBRUQ7RUFDQTtFQUNBO0VBQ0FjLGtCQUFrQixDQUNkLFVBQUFPLEVBQUU7SUFBQSxPQUFJdkIsT0FBTyxJQUFJckQsMEVBQWtCLENBQUM0RSxFQUFFLEVBQUV2QixPQUFPLENBQUNqMUIsRUFBRSxFQUFFaTFCLE9BQU8sQ0FBQ3gvQixLQUFLLENBQUM7RUFBQSxHQUNsRSxDQUFDdy9CLE9BQU8sQ0FDWixDQUFDOztFQUVEO0VBQ0FnQixrQkFBa0IsQ0FDZCxVQUFBTyxFQUFFO0lBQUEsT0FDRXhFLE9BQU8sQ0FBQ2dGLE9BQU8sQ0FBQzlvQyxPQUFPLENBQUMsVUFBQTJkLEVBQUU7TUFBQSxPQUN0QmdtQixzRUFBYyxDQUFDMkUsRUFBRSxFQUFFM3FCLEVBQUUsRUFBRW1tQixPQUFPLENBQUN0WSxTQUFTLENBQUM3TixFQUFFLENBQUMsQ0FBQztJQUFBLENBQ2pELENBQUM7RUFBQSxHQUNMLENBQUNtbUIsT0FBTyxDQUFDZ0YsT0FBTyxDQUNwQixDQUFDO0VBRUQsSUFBSTlCLGNBQWMsS0FBSyxVQUFVLEVBQUU7SUFDL0I7SUFDQTtJQUNBLG9CQUNJbmhDLDBEQUFBO01BQUtnRSxTQUFTLEVBQUM7SUFBOEIsZ0JBQ3pDaEUsMERBQUE7TUFBS2dFLFNBQVMsRUFBQztJQUE0QixnQkFDdkNoRSwwREFBQSxjQUFLLGdDQUFtQyxDQUN2QyxDQUNKLENBQUM7RUFFZDs7RUFFQTtFQUNBO0VBQ0EsSUFBSWtqQyxXQUFXLEdBQUcsRUFBRTtFQUNwQixJQUFJQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0VBQ3BCLElBQUlkLFdBQVcsR0FBRyxLQUFLO0VBRXZCLElBQUlqQixRQUFRLEVBQUU7SUFDVixJQUFNM2lCLElBQUksR0FBRzJpQixRQUFRLENBQUMzaUIsSUFBSSxDQUFDLENBQUM7SUFFNUIsUUFBUUEsSUFBSSxDQUFDdmxCLElBQUk7TUFDYixLQUFLLFdBQVc7UUFBRTtVQUFBLElBQUFrcUMsYUFBQTtVQUNkLElBQU1DLElBQUksR0FBRzNGLGtEQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBQTBGLGFBQUEsR0FBRW4xQixZQUFZLENBQUN3USxJQUFJLENBQUN4UyxFQUFFLENBQUMsY0FBQW0zQixhQUFBLHVCQUFyQkEsYUFBQSxDQUF1QjFoQyxLQUFLLENBQUM7VUFDdkR5aEMsV0FBVyxHQUFHRSxJQUFJO1VBQ2xCSCxXQUFXLEdBQUd6a0IsSUFBSSxDQUFDeFMsRUFBRTtVQUNyQjtRQUNKO01BRUEsS0FBSyxVQUFVO1FBQUU7VUFDYmkzQixXQUFXLEdBQUd6a0IsSUFBSSxDQUFDbWdCLE1BQU07VUFDekJ1RSxXQUFXLENBQUMxa0IsSUFBSSxDQUFDa2dCLEtBQUssQ0FBQyxHQUFHMkQsWUFBWSxDQUFDN2pCLElBQUksQ0FBQztVQUM1QztRQUNKOztNQUVBO01BQ0E7UUFBUztVQUNMMGtCLFdBQVcsQ0FBQ2pxQyxJQUFJLEdBQUd1bEIsSUFBSSxDQUFDMGdCLElBQUk7O1VBRTVCO1VBQ0EsSUFBTW1FLGdCQUFnQixHQUFHN2tCLElBQUksQ0FBQ3hTLEVBQUUsQ0FBQzdPLEtBQUssQ0FBQ2lqQyxXQUFXLENBQUM7VUFDbkQ2QyxXQUFXLEdBQUdoRCxhQUFhLENBQUNvRCxnQkFBZ0IsQ0FBQztVQUM3QyxJQUFNdkUsU0FBUyxHQUFHZCxPQUFPLENBQUN0WSxTQUFTLENBQUMyZCxnQkFBZ0IsQ0FBQztVQUNyRCxJQUFJdkUsU0FBUyxFQUFFO1lBQ1gsSUFDSUMsS0FBSyxHQVNMRCxTQUFTLENBVFRDLEtBQUs7Y0FDTG43QixNQUFNLEdBUU5rN0IsU0FBUyxDQVJUbDdCLE1BQU07Y0FDTjAvQixPQUFPLEdBT1B4RSxTQUFTLENBUFR3RSxPQUFPO2NBQ1BwcEIsU0FBUyxHQU1UNGtCLFNBQVMsQ0FOVDVrQixTQUFTO2NBQ1Qra0IsS0FBSyxHQUtMSCxTQUFTLENBTFRHLEtBQUs7Y0FDTHNFLE9BQU8sR0FJUHpFLFNBQVMsQ0FKVHlFLE9BQU87Y0FDUDNwQixNQUFNLEdBR05rbEIsU0FBUyxDQUhUbGxCLE1BQU07Y0FDTmpSLE1BQU0sR0FFTm0yQixTQUFTLENBRlRuMkIsTUFBTTtjQUNOcEQsS0FBSyxHQUNMdTVCLFNBQVMsQ0FEVHY1QixLQUFLO1lBR1QsSUFBTWkrQixHQUFHLEdBQUcsU0FBTkEsR0FBR0EsQ0FBRzFwQyxDQUFDO2NBQUEsT0FBSTgyQixJQUFJLENBQUN1TyxLQUFLLENBQUNybEMsQ0FBQyxJQUFJaWxDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztZQUFBO1lBRTdDbUUsV0FBVyxDQUFDLFlBQVksQ0FBQyxHQUFHbkUsS0FBSztZQUNqQ21FLFdBQVcsQ0FBQ3QvQixNQUFNLEdBQUc4N0IsWUFBWSxDQUFDOTdCLE1BQU0sQ0FBQztZQUV6QyxJQUFNNi9CLE1BQU0sR0FBSVAsV0FBVyxDQUFDLHlCQUF5QixDQUFDLEdBQUc7Y0FDckRqRSxLQUFLLEVBQUV1RSxHQUFHLENBQUN2RSxLQUFLLENBQUM7Y0FDakJzRSxPQUFPLEVBQUVDLEdBQUcsQ0FBQ0QsT0FBTztZQUN4QixDQUFFO1lBQ0YsSUFBSS9rQixJQUFJLENBQUMwZ0IsSUFBSSxLQUFLLFFBQVEsRUFBRTtjQUN4QnVFLE1BQU0sQ0FBQ0gsT0FBTyxHQUFHRSxHQUFHLENBQUNGLE9BQU8sQ0FBQ3RFLElBQUksQ0FBQztjQUVsQ2tFLFdBQVcsQ0FBQywyQkFBMkIsQ0FBQyxHQUFHO2dCQUN2Q1EsUUFBUSxFQUFFRixHQUFHLENBQUNGLE9BQU8sQ0FBQ0ksUUFBUSxDQUFDO2dCQUMvQkMsTUFBTSxFQUFFSCxHQUFHLENBQUNGLE9BQU8sQ0FBQ0ssTUFBTTtjQUM5QixDQUFDO1lBQ0w7WUFDQSxLQUFLLElBQU0xbEMsR0FBRyxJQUFJaWMsU0FBUyxFQUFFO2NBQ3pCdXBCLE1BQU0sQ0FBQyxRQUFRLEdBQUd4bEMsR0FBRyxDQUFDLEdBQUd1bEMsR0FBRyxDQUFDdHBCLFNBQVMsQ0FBQ2pjLEdBQUcsQ0FBQyxDQUFDO1lBQ2hEO1lBRUFpbEMsV0FBVyxDQUFDMXBCLE9BQU8sR0FBR29tQixjQUFjLENBQUNobUIsTUFBTSxDQUFDO1lBQzVDc3BCLFdBQVcsQ0FBQ3Y2QixNQUFNLEdBQUdrM0IsYUFBYSxDQUFDbDNCLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5Q3U2QixXQUFXLENBQUMzOUIsS0FBSyxHQUFHczZCLGFBQWEsQ0FBQ3Q2QixLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7VUFDaEQsQ0FBQyxNQUFNO1lBQ0gyOUIsV0FBVyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7VUFDakM7UUFDSjtJQUNKO0VBQ0o7RUFFQSxJQUFNVSxRQUFRLEdBQ1ZsQyxVQUFVLEtBQUtLLFVBQVUsR0FDbkJOLFdBQVcsR0FDWC8yQixrREFBVSxDQUFDZzJCLE9BQU8sQ0FBQ3FCLFVBQVUsQ0FBQyxFQUFFO0lBQUNqTixLQUFLLEVBQUV3TjtFQUFlLENBQUMsQ0FBQztFQUVuRSxvQkFDSXZpQywwREFBQTtJQUFLZ0UsU0FBUyxFQUFDO0VBQThCLGdCQUN6Q2hFLDBEQUFBLENBQUNzOUIseURBQWtCO0lBQ2Z3RyxLQUFLLEVBQUU7TUFBQ0MsS0FBSyxFQUFFLE1BQU07TUFBRUMsTUFBTSxFQUFFO0lBQU0sQ0FBRTtJQUN2Q3ZCLEVBQUUsRUFBRWhCLFlBQWE7SUFDakJyRCxRQUFRLEVBQUVBLFFBQVM7SUFDbkJyOEIsTUFBTSxFQUFFOGhDLFFBQVM7SUFDakJsRyxVQUFVLEVBQUVBLDBFQUFVQTtFQUFDLENBQzFCLENBQUMsRUFDRHlELFFBQVEsZ0JBQ0xwaEMsMERBQUE7SUFBS2dFLFNBQVMsRUFBQztFQUF5QixHQUNuQ3ErQixXQUFXLGdCQUNScmlDLDBEQUFBLGNBQUssNERBR0EsQ0FBQyxHQUNOLElBQUksZUFDUkEsMERBQUEsQ0FBQ3k5QixzREFBUTtJQUNMaGYsSUFBSSxFQUFFMGtCLFdBQVk7SUFDbEJjLEtBQUssRUFBQyxhQUFhO0lBQ25CQyxhQUFhLEVBQUUsU0FBQUEsY0FBQWpULEtBQUs7TUFBQSxPQUNoQkEsS0FBSyxDQUFDNzBCLE1BQU0sS0FBSyxDQUFDLEdBQUc4bUMsV0FBVyxHQUFHalMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUFBLENBQzlDO0lBQ0RrVCxhQUFhLEVBQUUsU0FBQUEsY0FBQ2pyQyxJQUFJLEVBQUV1bEIsSUFBSSxFQUFFMmxCLFFBQVE7TUFBQSxvQkFDaENwa0MsMERBQUEsZUFBT29rQyxRQUFlLENBQUM7SUFBQSxDQUN6QjtJQUNGQyxnQkFBZ0IsRUFBRSxTQUFBQSxpQkFBQ0MsT0FBTyxFQUFFN2xCLElBQUksRUFBRThsQixLQUFLO01BQUEsT0FBS0EsS0FBSyxHQUFHLENBQUM7SUFBQTtFQUFDLENBQ3pELENBQ0EsQ0FBQyxHQUNOLElBQUksZUFDUnZrQywwREFBQTtJQUNJZ0UsU0FBUyxFQUFDLG1DQUFtQztJQUM3Q3dnQyxRQUFRLEVBQUUsU0FBQUEsU0FBQWx0QyxDQUFDO01BQUEsT0FBSTJxQyxhQUFhLENBQUMzcUMsQ0FBQyxDQUFDdzlCLE1BQU0sQ0FBQy84QixLQUFLLENBQUM7SUFBQSxDQUFDO0lBQzdDQSxLQUFLLEVBQUVpcUMsVUFBVztJQUNsQnlDLEdBQUcsRUFBRTVDO0VBQWUsR0FFbkI5a0Msa0RBQUksQ0FBQzRqQyxPQUFPLENBQUMsQ0FBQ3A0QixHQUFHLENBQUMsVUFBQW1HLENBQUM7SUFBQSxvQkFDaEIxTywwREFBQTtNQUFRakksS0FBSyxFQUFFMlcsQ0FBRTtNQUFDeFEsR0FBRyxFQUFFd1E7SUFBRSxHQUNwQkEsQ0FDRyxDQUFDO0VBQUEsQ0FDWixDQUNHLENBQ1AsQ0FBQztBQUVkO0FBRUF1eUIsYUFBYSxDQUFDaDhCLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFBQyxJQUV2QnkvQixpQ0FBaUMsMEJBQUE5M0IsVUFBQTtFQUFBeEcsU0FBQSxDQUFBcytCLGlDQUFBLEVBQUE5M0IsVUFBQTtFQUFBLElBQUF2RyxNQUFBLEdBQUFDLFlBQUEsQ0FBQW8rQixpQ0FBQTtFQUNuQyxTQUFBQSxrQ0FBWWhqQyxLQUFLLEVBQUU7SUFBQSxJQUFBNkUsS0FBQTtJQUFBQyxlQUFBLE9BQUFrK0IsaUNBQUE7SUFDZm4rQixLQUFBLEdBQUFGLE1BQUEsQ0FBQWpOLElBQUEsT0FBTXNJLEtBQUs7SUFDWDZFLEtBQUEsQ0FBS2YsS0FBSyxHQUFHO01BQUNWLFFBQVEsRUFBRTtJQUFLLENBQUM7SUFBQyxPQUFBeUIsS0FBQTtFQUNuQztFQUFDTyxZQUFBLENBQUE0OUIsaUNBQUE7SUFBQXhtQyxHQUFBO0lBQUFuRyxLQUFBLEVBTUQsU0FBQTRzQyxrQkFBa0J2bUMsS0FBSyxFQUFFRCxJQUFJLEVBQUU7TUFDM0IsSUFBT3lFLFFBQVEsR0FBSSxJQUFJLENBQUNsQixLQUFLLENBQXRCa0IsUUFBUTtNQUNmQSxRQUFRLENBQ0psQyxpREFBTyxDQUFDO1FBQ0pra0MsSUFBSSxFQUFFLElBQUksQ0FBQ3AvQixLQUFLLENBQUNvL0IsSUFBSTtRQUNyQjFyQyxJQUFJLEVBQUUsVUFBVTtRQUNoQmtGLEtBQUs7UUFDTEQ7TUFDSixDQUFDLENBQ0wsQ0FBQztJQUNMO0VBQUM7SUFBQUQsR0FBQTtJQUFBbkcsS0FBQSxFQUVELFNBQUFxUCxPQUFBLEVBQVM7TUFDTCxPQUFPLElBQUksQ0FBQzVCLEtBQUssQ0FBQ1YsUUFBUSxnQkFDdEI5RSwwREFBQTtRQUFLZ0UsU0FBUyxFQUFDO01BQThCLGdCQUN6Q2hFLDBEQUFBO1FBQUtnRSxTQUFTLEVBQUM7TUFBNEIsZ0JBQ3ZDaEUsMERBQUEsY0FBSywwQ0FBNkMsQ0FBQyxlQUNuREEsMERBQUEsY0FBSyxtQ0FBc0MsQ0FDMUMsQ0FDSixDQUFDLGdCQUVOQSwwREFBQSxDQUFDaWhDLGFBQWEsTUFBRSxDQUNuQjtJQUNMO0VBQUM7SUFBQS9pQyxHQUFBO0lBQUFuRyxLQUFBLEVBM0JELFNBQUE4c0MseUJBQWdDbG5CLENBQUMsRUFBRTtNQUMvQixPQUFPO1FBQUM3WSxRQUFRLEVBQUU7TUFBSSxDQUFDO0lBQzNCO0VBQUM7RUFBQSxPQUFBNC9CLGlDQUFBO0FBQUEsRUFSMkNuOUIsNENBQVM7QUFvQ3pEbTlCLGlDQUFpQyxDQUFDei9CLFNBQVMsR0FBRztFQUMxQ3JDLFFBQVEsRUFBRXZDLHdEQUFjOEU7QUFDNUIsQ0FBQztBQUVELElBQU0yL0Isc0JBQXNCLEdBQUdqbEMsb0RBQU8sQ0FBQyxJQUFJLEVBQUUsVUFBQStDLFFBQVE7RUFBQSxPQUFLO0lBQUNBO0VBQVEsQ0FBQztBQUFBLENBQUMsQ0FBQyxDQUNsRThoQyxpQ0FDSixDQUFDOzs7Ozs7Ozs7Ozs7O0FDcGVELElBQU0vRyxVQUFVLEdBQUcsQ0FDZjtFQUNJb0gsUUFBUSxFQUFFLEdBQUc7RUFDYmpCLEtBQUssRUFBRTtJQUNILFdBQVcsRUFBRSxFQUFFO0lBQ2YsYUFBYSxFQUFFO0VBQ25CO0FBQ0osQ0FBQyxFQUVEO0VBQ0lpQixRQUFRLEVBQUUsTUFBTTtFQUNoQmpCLEtBQUssRUFBRTtJQUNIQyxLQUFLLEVBQUUsQ0FBQztJQUNSLFlBQVksRUFBRSxTQUFTO0lBQ3ZCLG9CQUFvQixFQUFFLFNBQVM7SUFDL0Isb0JBQW9CLEVBQUUsVUFBVTtJQUNoQyxtQkFBbUIsRUFBRSxRQUFRO0lBQzdCLGFBQWEsRUFBRSxDQUFDO0lBQ2hCLGFBQWEsRUFBRSxRQUFRO0lBQ3ZCLHlCQUF5QixFQUFFLEVBQUU7SUFDN0IscUJBQXFCLEVBQUUsZ0NBQWdDO0lBQ3ZELHFCQUFxQixFQUFFLE9BQU87SUFDOUIsNEJBQTRCLEVBQUU7RUFDbEM7QUFDSixDQUFDLEVBRUQ7RUFDSWdCLFFBQVEsRUFBRSxxQkFBcUI7RUFDL0JqQixLQUFLLEVBQUU7SUFDSGtCLE9BQU8sRUFBRTtFQUNiO0FBQ0osQ0FBQyxFQUVEO0VBQ0lELFFBQVEsRUFBRSxxQkFBcUI7RUFDL0JqQixLQUFLLEVBQUU7SUFDSCxZQUFZLEVBQUUsU0FBUztJQUN2QixvQkFBb0IsRUFBRTtFQUMxQjtBQUNKLENBQUMsRUFFRDtFQUNJaUIsUUFBUSxFQUFFLG9CQUFvQjtFQUM5QmpCLEtBQUssRUFBRTtJQUNILFlBQVksRUFBRTtFQUNsQjtBQUNKLENBQUMsRUFFRDtFQUNJaUIsUUFBUSxFQUFFLE1BQU07RUFDaEJqQixLQUFLLEVBQUU7SUFDSG1CLEtBQUssRUFBRSxTQUFTO0lBQ2hCMUUsT0FBTyxFQUFFLENBQUM7SUFDVixhQUFhLEVBQUUsUUFBUTtJQUN2QixhQUFhLEVBQUUsUUFBUTtJQUN2QixjQUFjLEVBQUUsQ0FBQztJQUNqQixnQkFBZ0IsRUFBRSxDQUFDO0lBQ25CLGNBQWMsRUFBRSxPQUFPO0lBQ3ZCLGNBQWMsRUFBRSxTQUFTO0lBQ3pCLHFCQUFxQixFQUFFLGdCQUFnQjtJQUN2QyxxQkFBcUIsRUFBRSxPQUFPO0lBQzlCLDRCQUE0QixFQUFFO0VBQ2xDO0FBQ0osQ0FBQyxFQUVEO0VBQ0l3RSxRQUFRLEVBQUUsdUJBQXVCO0VBQ2pDakIsS0FBSyxFQUFFO0lBQ0hDLEtBQUssRUFBRSxFQUFFO0lBQ1RDLE1BQU0sRUFBRSxFQUFFO0lBQ1ZuOEIsS0FBSyxFQUFFLGlCQUFpQjtJQUN4QjgyQixLQUFLLEVBQUUsU0FBQUEsTUFBQXJuQyxDQUFDO01BQUEsVUFBQW1NLE1BQUEsQ0FBT25NLENBQUMsQ0FBQ21uQixJQUFJLENBQUMsQ0FBQyxDQUFDdWdCLEtBQUssUUFBQXY3QixNQUFBLENBQUtuTSxDQUFDLENBQUNtbkIsSUFBSSxDQUFDLENBQUMsQ0FBQ3dnQixJQUFJO0lBQUEsQ0FBSztJQUNwRCxXQUFXLEVBQUUsTUFBTTtJQUNuQixvQkFBb0IsRUFBRTtFQUMxQjtBQUNKLENBQUMsRUFFRDtFQUNJOEYsUUFBUSxFQUFFLHNDQUFzQztFQUNoRGpCLEtBQUssRUFBRTtJQUNIbUIsS0FBSyxFQUFFLFNBQVM7SUFDaEIsa0JBQWtCLEVBQUU7RUFDeEI7QUFDSixDQUFDLEVBRUQ7RUFDSUYsUUFBUSxFQUFFLHNDQUFzQztFQUNoRGpCLEtBQUssRUFBRTtJQUNIbUIsS0FBSyxFQUFFLFNBQVM7SUFDaEIsa0JBQWtCLEVBQUU7RUFDeEI7QUFDSixDQUFDLEVBRUQ7RUFDSUYsUUFBUSxFQUFFLCtDQUErQztFQUN6RGpCLEtBQUssRUFBRTtJQUNIQyxLQUFLLEVBQUUsT0FBTztJQUNkO0lBQ0FsOEIsS0FBSyxFQUFFLFdBQVc7SUFDbEJqRSxPQUFPLEVBQUUsU0FBQUEsUUFBQXRNLENBQUM7TUFBQSxPQUFJQSxDQUFDLENBQUNtbkIsSUFBSSxDQUFDLENBQUMsQ0FBQ2tnQixLQUFLLENBQUMzdkIsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7SUFBQTtJQUM5QyxhQUFhLEVBQUUsS0FBSztJQUNwQixrQkFBa0IsRUFBRTtFQUN4QjtBQUNKLENBQUMsRUFFRDtFQUNJKzFCLFFBQVEsRUFBRSx1QkFBdUI7RUFDakNqQixLQUFLLEVBQUU7SUFDSEMsS0FBSyxFQUFFLE9BQU87SUFDZEMsTUFBTSxFQUFFLEVBQUU7SUFDVm44QixLQUFLLEVBQUUsV0FBVztJQUNsQmpFLE9BQU8sRUFBRSxhQUFhO0lBQ3RCcWhDLEtBQUssRUFBRSxPQUFPO0lBQ2Qsa0JBQWtCLEVBQUU7RUFDeEI7QUFDSixDQUFDLEVBRUQ7RUFDSUYsUUFBUSxFQUFFLGdCQUFnQjtFQUMxQmpCLEtBQUssRUFBRTtJQUNIb0IsS0FBSyxFQUFFLEtBQUs7SUFDWixnQkFBZ0IsRUFBRSxDQUFDO0lBQ25CLGdCQUFnQixFQUFFLENBQUM7SUFDbkIsZUFBZSxFQUFFLElBQUk7SUFDckIsZ0JBQWdCLEVBQUU7RUFDdEI7QUFDSixDQUFDLEVBRUQ7RUFDSUgsUUFBUSxFQUFFLGtDQUFrQztFQUM1Q2pCLEtBQUssRUFBRTtJQUNILGNBQWMsRUFBRSxTQUFTO0lBQ3pCLGNBQWMsRUFBRSxDQUFDO0lBQ2pCLGdCQUFnQixFQUFFO0VBQ3RCO0FBQ0osQ0FBQyxFQUVEO0VBQ0lpQixRQUFRLEVBQUUsaUJBQWlCO0VBQzNCakIsS0FBSyxFQUFFO0lBQ0gsa0JBQWtCLEVBQUU7RUFDeEI7QUFDSixDQUFDLEVBRUQ7RUFDSWlCLFFBQVEsRUFBRSxZQUFZO0VBQ3RCakIsS0FBSyxFQUFFO0lBQ0gsWUFBWSxFQUFFLFNBQVM7SUFDdkIsb0JBQW9CLEVBQUU7RUFDMUI7QUFDSixDQUFDLEVBRUQ7RUFDSWlCLFFBQVEsRUFBRSxXQUFXO0VBQ3JCakIsS0FBSyxFQUFFO0lBQ0hxQixPQUFPLEVBQUU7RUFDYjtBQUNKLENBQUMsQ0FDSjtBQUVELCtEQUFleEgsVUFBVTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaEtzQzs7QUFFL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMwSCxZQUFZQSxDQUFDdjNCLElBQUksRUFBRTtFQUN4QixJQUFNc3dCLFFBQVEsR0FBR3R3QixJQUFJLENBQUN3M0IsY0FBYyxDQUFDLENBQUM7RUFDdEMsT0FBTztJQUNIL3hCLEtBQUssRUFBRTZxQixRQUFRLENBQUM5MUIsTUFBTSxDQUFDLGtCQUFrQixDQUFDO0lBQzFDOUMsS0FBSyxFQUFFNDRCLFFBQVEsQ0FBQzkxQixNQUFNLENBQUMsa0JBQWtCLENBQUM7SUFDMUM2VCxNQUFNLEVBQUVpaUIsUUFBUSxDQUFDOTFCLE1BQU0sQ0FBQyxtQkFBbUI7RUFDL0MsQ0FBQztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNzMUIsa0JBQWtCQSxDQUFDNkUsRUFBRSxFQUFFeDJCLEVBQUUsRUFBRTtFQUN2QyxTQUFTczVCLE1BQU1BLENBQUN6M0IsSUFBSSxFQUFFMDNCLFVBQVUsRUFBRTtJQUM5QjtJQUNBLElBQU10c0MsSUFBSSxHQUFHNFUsSUFBSSxDQUFDMlEsSUFBSSxDQUFDLENBQUMsQ0FBQ3ZsQixJQUFJLEtBQUssVUFBVSxHQUFHLE9BQU8sR0FBRyxRQUFRO0lBQ2pFLElBQU11c0MsS0FBSyxHQUFHSixZQUFZLENBQUN2M0IsSUFBSSxDQUFDLENBQUM1VSxJQUFJLENBQUM7SUFDdEMsSUFBTXdzQyxPQUFPLEdBQUdELEtBQUssQ0FBQ0UsT0FBTyxDQUFDLENBQUM7SUFDL0JILFVBQVUsQ0FBQ0ksS0FBSyxDQUFDSCxLQUFLLENBQUM7SUFDdkJELFVBQVUsQ0FBQ0ksS0FBSyxDQUFDRixPQUFPLENBQUM7SUFDekIsSUFBSTUzQixJQUFJLENBQUMyUSxJQUFJLENBQUMsQ0FBQyxDQUFDdmxCLElBQUksS0FBSyxVQUFVLEVBQUU7TUFDakNzc0MsVUFBVSxDQUFDSSxLQUFLLENBQUM5M0IsSUFBSSxDQUFDKzNCLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDdEM7SUFDQUgsT0FBTyxDQUFDdnJDLE9BQU8sQ0FBQyxVQUFBMlQsSUFBSTtNQUFBLE9BQUl5M0IsTUFBTSxDQUFDejNCLElBQUksRUFBRTAzQixVQUFVLENBQUM7SUFBQSxFQUFDO0VBQ3JEO0VBRUEsU0FBU00sT0FBT0EsQ0FBQ2g0QixJQUFJLEVBQUUwM0IsVUFBVSxFQUFFO0lBQy9CLElBQU10c0MsSUFBSSxHQUFHNFUsSUFBSSxDQUFDMlEsSUFBSSxDQUFDLENBQUMsQ0FBQ3ZsQixJQUFJLEtBQUssVUFBVSxHQUFHLFFBQVEsR0FBRyxPQUFPO0lBQ2pFLElBQU11c0MsS0FBSyxHQUFHSixZQUFZLENBQUN2M0IsSUFBSSxDQUFDLENBQUM1VSxJQUFJLENBQUM7SUFDdEMsSUFBTTZTLFFBQVEsR0FBRzA1QixLQUFLLENBQUNoUixPQUFPLENBQUMsQ0FBQztJQUNoQytRLFVBQVUsQ0FBQ0ksS0FBSyxDQUFDSCxLQUFLLENBQUM7SUFDdkJELFVBQVUsQ0FBQ0ksS0FBSyxDQUFDNzVCLFFBQVEsQ0FBQztJQUMxQixJQUFJK0IsSUFBSSxDQUFDMlEsSUFBSSxDQUFDLENBQUMsQ0FBQ3ZsQixJQUFJLEtBQUssVUFBVSxFQUFFO01BQ2pDc3NDLFVBQVUsQ0FBQ0ksS0FBSyxDQUFDOTNCLElBQUksQ0FBQyszQixTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3RDO0lBQ0E5NUIsUUFBUSxDQUFDNVIsT0FBTyxDQUFDLFVBQUEyVCxJQUFJO01BQUEsT0FBSWc0QixPQUFPLENBQUNoNEIsSUFBSSxFQUFFMDNCLFVBQVUsQ0FBQztJQUFBLEVBQUM7RUFDdkQ7RUFFQSxJQUFJdjVCLEVBQUUsRUFBRTtJQUNKLElBQU02QixJQUFJLEdBQUcyMEIsRUFBRSxDQUFDdDZCLGNBQWMsQ0FBQzhELEVBQUUsQ0FBQzs7SUFFbEM7O0lBRUE2QixJQUFJLENBQUNpNEIsUUFBUSxDQUFDLGVBQWUsQ0FBQzs7SUFFOUI7SUFDQTtJQUNBOztJQUVBOztJQUVBLElBQU1DLE9BQU8sR0FBR3ZELEVBQUUsQ0FBQytDLFVBQVUsQ0FBQyxDQUFDO0lBQy9CUSxPQUFPLENBQUNKLEtBQUssQ0FBQzkzQixJQUFJLENBQUM7SUFDbkJ5M0IsTUFBTSxDQUFDejNCLElBQUksRUFBRWs0QixPQUFPLENBQUM7SUFDckJGLE9BQU8sQ0FBQ2g0QixJQUFJLEVBQUVrNEIsT0FBTyxDQUFDO0lBRXRCLElBQU1DLEtBQUssR0FBR0QsT0FBTyxDQUFDRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQzFDRCxLQUFLLENBQUNGLFFBQVEsQ0FBQyxVQUFVLENBQUM7SUFFMUIsT0FBTyxZQUFNO01BQ1RqNEIsSUFBSSxDQUFDcTRCLFdBQVcsQ0FBQyxlQUFlLENBQUM7TUFDakNGLEtBQUssQ0FBQ0UsV0FBVyxDQUFDLFVBQVUsQ0FBQztJQUNqQyxDQUFDO0VBQ0w7RUFDQSxPQUFPdm5DLFNBQVM7QUFDcEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNpL0Isa0JBQWtCQSxDQUFDNEUsRUFBRSxFQUFFeDJCLEVBQUUsRUFBRXZLLEtBQUssRUFBbUI7RUFBQSxJQUFqQjBrQyxTQUFTLEdBQUEzbkMsU0FBQSxDQUFBckMsTUFBQSxRQUFBcUMsU0FBQSxRQUFBRyxTQUFBLEdBQUFILFNBQUEsTUFBRyxHQUFHO0VBQzdEaEgsTUFBTSxDQUFDc0YsSUFBSSxDQUFDMkUsS0FBSyxDQUFDLENBQUN2SCxPQUFPLENBQUMsVUFBQXFyQixJQUFJLEVBQUk7SUFDL0IsSUFBTTFYLElBQUksR0FBRzIwQixFQUFFLENBQUN0NkIsY0FBYyxJQUFBMUUsTUFBQSxDQUFJd0ksRUFBRSxPQUFBeEksTUFBQSxDQUFJK2hCLElBQUksQ0FBRSxDQUFDO0lBQy9DMVgsSUFBSSxDQUFDdTRCLFVBQVUsQ0FBQyxjQUFjLEVBQUVELFNBQVMsQ0FBQztJQUMxQ3Q0QixJQUFJLENBQUN3NEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUNaaCtCLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUMxQis5QixVQUFVLENBQUMsV0FBVyxFQUFFRCxTQUFTLENBQUM7RUFDM0MsQ0FBQyxDQUFDO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVN0SSxjQUFjQSxDQUFDMkUsRUFBRSxFQUFFeDJCLEVBQUUsRUFBRWd5QixPQUFPLEVBQW1CO0VBQUEsSUFBakJtSSxTQUFTLEdBQUEzbkMsU0FBQSxDQUFBckMsTUFBQSxRQUFBcUMsU0FBQSxRQUFBRyxTQUFBLEdBQUFILFNBQUEsTUFBRyxHQUFHO0VBQzNELElBQU1xUCxJQUFJLEdBQUcyMEIsRUFBRSxDQUFDdDZCLGNBQWMsc0JBQUExRSxNQUFBLENBQXNCd0ksRUFBRSxDQUFFLENBQUM7RUFDekQsSUFBTyt5QixLQUFLLEdBQW1CZixPQUFPLENBQS9CZSxLQUFLO0lBQUVFLEtBQUssR0FBWWpCLE9BQU8sQ0FBeEJpQixLQUFLO0lBQUVyN0IsTUFBTSxHQUFJbzZCLE9BQU8sQ0FBakJwNkIsTUFBTTtFQUMzQixJQUFPKzdCLE1BQU0sR0FBSS83QixNQUFNLENBQWhCKzdCLE1BQU07O0VBRWI7RUFDQSxJQUFNMkcsT0FBTyxHQUFHdkgsS0FBSyxHQUFHLENBQUMsR0FBR0UsS0FBSyxHQUFHRixLQUFLLEdBQUcsQ0FBQztFQUM3Q2x4QixJQUFJLENBQUMyUSxJQUFJLENBQUMsT0FBTyxFQUFFdWdCLEtBQUssQ0FBQztFQUN6Qmx4QixJQUFJLENBQUMyUSxJQUFJLENBQUMsTUFBTSxFQUFFb1MsSUFBSSxDQUFDdU8sS0FBSyxDQUFDbUgsT0FBTyxDQUFDLENBQUM7O0VBRXRDO0VBQ0EsSUFBSTNHLE1BQU0sS0FBSyxTQUFTLEVBQUU7SUFDdEI5eEIsSUFBSSxDQUFDMlEsSUFBSSxDQUFDLFlBQVksRUFBRWhFLElBQUksQ0FBQ0MsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNuQzVNLElBQUksQ0FBQ2k0QixRQUFRLENBQUMsa0JBQWtCLENBQUM7RUFDckMsQ0FBQyxNQUFNLElBQUlqNEIsSUFBSSxDQUFDMDRCLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFO0lBQzFDLElBQU1DLFFBQVEsR0FBRzM0QixJQUFJLENBQUMyUSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcybkIsU0FBUyxHQUFHM3JCLElBQUksQ0FBQ0MsR0FBRyxDQUFDLENBQUM7SUFDakV5RSxVQUFVLENBQ047TUFBQSxPQUFNclIsSUFBSSxDQUFDcTRCLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQztJQUFBLEdBQzFDdFYsSUFBSSxDQUFDQyxHQUFHLENBQUMyVixRQUFRLEVBQUUsQ0FBQyxDQUN4QixDQUFDO0VBQ0w7RUFFQSxJQUNJN0csTUFBTSxLQUFLLFNBQVMsSUFDcEJBLE1BQU0sS0FBS3dGLDJEQUFTLENBQUNoa0Msd0RBQU0sQ0FBQzBDLEVBQUUsQ0FBQyxJQUMvQjg3QixNQUFNLEtBQUt3RiwyREFBUyxDQUFDaGtDLHdEQUFNLENBQUN5YSxjQUFjLENBQUMsRUFDN0M7SUFDRS9OLElBQUksQ0FBQzJRLElBQUksQ0FBQyxVQUFVLEVBQUVoRSxJQUFJLENBQUNDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakM1TSxJQUFJLENBQUNpNEIsUUFBUSxDQUFDLGdCQUFnQixDQUFDO0VBQ25DLENBQUMsTUFBTSxJQUFJajRCLElBQUksQ0FBQzA0QixRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtJQUN4QyxJQUFNQyxTQUFRLEdBQUczNEIsSUFBSSxDQUFDMlEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHMm5CLFNBQVMsR0FBRzNyQixJQUFJLENBQUNDLEdBQUcsQ0FBQyxDQUFDO0lBQy9EeUUsVUFBVSxDQUNOO01BQUEsT0FBTXJSLElBQUksQ0FBQ3E0QixXQUFXLENBQUMsZ0JBQWdCLENBQUM7SUFBQSxHQUN4Q3RWLElBQUksQ0FBQ0MsR0FBRyxDQUFDMlYsU0FBUSxFQUFFLENBQUMsQ0FDeEIsQ0FBQztFQUNMOztFQUVBO0VBQ0E7RUFDQSxJQUFJN0csTUFBTSxLQUFLd0YsMkRBQVMsQ0FBQ2hrQyx3REFBTSxDQUFDMEMsRUFBRSxDQUFDLEVBQUU7SUFDakNnSyxJQUFJLENBQUN3NEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDRCxVQUFVLENBQUMsV0FBVyxFQUFFRCxTQUFTLENBQUM7RUFDeEQ7QUFDSjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoS2dDO0FBQ0c7QUFDVztBQUFBLElBRXhDLzZCLHNCQUFzQiwwQkFBQXVCLFVBQUE7RUFBQXhHLFNBQUEsQ0FBQWlGLHNCQUFBLEVBQUF1QixVQUFBO0VBQUEsSUFBQXZHLE1BQUEsR0FBQUMsWUFBQSxDQUFBK0Usc0JBQUE7RUFDeEIsU0FBQUEsdUJBQVkzSixLQUFLLEVBQUU7SUFBQSxJQUFBNkUsS0FBQTtJQUFBQyxlQUFBLE9BQUE2RSxzQkFBQTtJQUNmOUUsS0FBQSxHQUFBRixNQUFBLENBQUFqTixJQUFBLE9BQU1zSSxLQUFLO0lBQ1g2RSxLQUFBLENBQUtmLEtBQUssR0FBRztNQUNUby9CLElBQUksRUFBRWxqQyxLQUFLLENBQUNtTyxXQUFXO01BQ3ZCNjJCLFdBQVcsRUFBRSxJQUFJO01BQ2pCNWhDLFFBQVEsRUFBRTtJQUNkLENBQUM7SUFBQyxPQUFBeUIsS0FBQTtFQUNOO0VBQUNPLFlBQUEsQ0FBQXVFLHNCQUFBO0lBQUFuTixHQUFBO0lBQUFuRyxLQUFBLEVBTUQsU0FBQTRzQyxrQkFBa0J2bUMsS0FBSyxFQUFFRCxJQUFJLEVBQUU7TUFDM0IsSUFBT3lFLFFBQVEsR0FBSSxJQUFJLENBQUNsQixLQUFLLENBQXRCa0IsUUFBUTtNQUNmQSxRQUFRLENBQ0psQyxpREFBTyxDQUFDO1FBQ0pra0MsSUFBSSxFQUFFLElBQUksQ0FBQ3AvQixLQUFLLENBQUNvL0IsSUFBSTtRQUNyQjFyQyxJQUFJLEVBQUUsVUFBVTtRQUNoQmtGLEtBQUs7UUFDTEQ7TUFDSixDQUFDLENBQ0wsQ0FBQztNQUNEeUUsUUFBUSxDQUFDdXhCLDRDQUFNLENBQUM7SUFDcEI7RUFBQztJQUFBajJCLEdBQUE7SUFBQW5HLEtBQUEsRUFFRCxTQUFBdWpDLG1CQUFtQkMsU0FBUyxFQUFFQyxTQUFTLEVBQUU7TUFDckMsSUFBTW1MLFlBQVksR0FBR3BMLFNBQVMsQ0FBQ3h2QixRQUFRO01BQ3ZDLElBQ0ksQ0FBQyxJQUFJLENBQUN2RyxLQUFLLENBQUNWLFFBQVEsSUFDcEI2aEMsWUFBWSxLQUFLbkwsU0FBUyxDQUFDa0wsV0FBVyxJQUN0Q0MsWUFBWSxLQUFLLElBQUksQ0FBQ2psQyxLQUFLLENBQUNxSyxRQUFRLEVBQ3RDO1FBQ0U7UUFDQSxJQUFJLENBQUNzdkIsUUFBUSxDQUFDO1VBQ1ZxTCxXQUFXLEVBQUVDO1FBQ2pCLENBQUMsQ0FBQztNQUNOO0lBQ0o7RUFBQztJQUFBem9DLEdBQUE7SUFBQW5HLEtBQUEsRUFFRCxTQUFBcVAsT0FBQSxFQUFTO01BQ0wsSUFBQXMxQixXQUFBLEdBQWdDLElBQUksQ0FBQ2wzQixLQUFLO1FBQW5DVixRQUFRLEdBQUE0M0IsV0FBQSxDQUFSNTNCLFFBQVE7UUFBRTRoQyxXQUFXLEdBQUFoSyxXQUFBLENBQVhnSyxXQUFXO01BQzVCLE9BQU81aEMsUUFBUSxHQUFHNGhDLFdBQVcsR0FBRyxJQUFJLENBQUNobEMsS0FBSyxDQUFDcUssUUFBUTtJQUN2RDtFQUFDO0lBQUE3TixHQUFBO0lBQUFuRyxLQUFBLEVBbENELFNBQUE4c0MseUJBQWdDbG5CLENBQUMsRUFBRTtNQUMvQixPQUFPO1FBQUM3WSxRQUFRLEVBQUU7TUFBSSxDQUFDO0lBQzNCO0VBQUM7RUFBQSxPQUFBdUcsc0JBQUE7QUFBQSxFQVpnQzlELDRDQUFTO0FBK0M5QzhELHNCQUFzQixDQUFDcEcsU0FBUyxHQUFHO0VBQy9COEcsUUFBUSxFQUFFMUwsMERBQWdCO0VBQzFCd1AsV0FBVyxFQUFFeFAsMERBQWdCO0VBQzdCakMsS0FBSyxFQUFFaUMsMERBQWdCO0VBQ3ZCdUMsUUFBUSxFQUFFdkMsd0RBQWM4RTtBQUM1QixDQUFDO0FBRUQsK0RBQWVrRyxzQkFBc0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxREQ7QUFDUDtBQUNHO0FBQ3FCO0FBQ2xCO0FBQ2I7QUFDeUI7QUFFTjtBQUFBLElBRW5DeTdCLGFBQWEsMEJBQUFsNkIsVUFBQTtFQUFBeEcsU0FBQSxDQUFBMGdDLGFBQUEsRUFBQWw2QixVQUFBO0VBQUEsSUFBQXZHLE1BQUEsR0FBQUMsWUFBQSxDQUFBd2dDLGFBQUE7RUFDZixTQUFBQSxjQUFZcGxDLEtBQUssRUFBRTtJQUFBLElBQUE2RSxLQUFBO0lBQUFDLGVBQUEsT0FBQXNnQyxhQUFBO0lBQ2Z2Z0MsS0FBQSxHQUFBRixNQUFBLENBQUFqTixJQUFBLE9BQU1zSSxLQUFLO0lBQ1g2RSxLQUFBLENBQUtmLEtBQUssR0FBRztNQUNUdWhDLFNBQVMsRUFBRXhnQyxLQUFBLENBQUs3RSxLQUFLLENBQUNzbEM7SUFDMUIsQ0FBQztJQUFDLE9BQUF6Z0MsS0FBQTtFQUNOO0VBQUNPLFlBQUEsQ0FBQWdnQyxhQUFBO0lBQUE1b0MsR0FBQTtJQUFBbkcsS0FBQSxFQUVELFNBQUFxUCxPQUFBLEVBQVM7TUFBQSxJQUFBd0csTUFBQTtNQUNMLElBQUFWLFdBQUEsR0FBMEIsSUFBSSxDQUFDeEwsS0FBSztRQUE3QnBLLENBQUMsR0FBQTRWLFdBQUEsQ0FBRDVWLENBQUM7UUFBRTJ2QyxZQUFZLEdBQUEvNUIsV0FBQSxDQUFaKzVCLFlBQVk7TUFDdEIsSUFBT0YsU0FBUyxHQUFJLElBQUksQ0FBQ3ZoQyxLQUFLLENBQXZCdWhDLFNBQVM7TUFFaEIsSUFBTUcsV0FBVyxHQUNiLDBCQUEwQixJQUN6QkQsWUFBWSxHQUFHLCtCQUErQixHQUFHLEVBQUUsQ0FBQzs7TUFFekQ7TUFDQSxJQUFNRSxXQUFXLGdCQUNibm5DLEtBQUEsQ0FBQStELGFBQUE7UUFDSUMsU0FBUyxFQUFDLDhDQUE4QztRQUN4RGk1QixPQUFPLEVBQUUsU0FBQUEsUUFBQTtVQUFBLE9BQU1ydkIsTUFBSSxDQUFDeXRCLFFBQVEsQ0FBQztZQUFDMEwsU0FBUyxFQUFFLENBQUNBO1VBQVMsQ0FBQyxDQUFDO1FBQUE7TUFBQyxnQkFFdEQvbUMsS0FBQSxDQUFBK0QsYUFBQTtRQUFNQyxTQUFTLEVBQUM7TUFBMEIsR0FBQyxjQUV2QyxlQUFBaEUsS0FBQSxDQUFBK0QsYUFBQTtRQUFNQyxTQUFTLEVBQUM7TUFBc0IsR0FDakMxTSxDQUFDLENBQUM4RyxLQUFLLENBQUN5VCxPQUFPLElBQUksT0FDbEIsQ0FDSixDQUFDLGVBQ1A3UixLQUFBLENBQUErRCxhQUFBO1FBQU1DLFNBQVMsRUFBQztNQUEwQixnQkFDdENoRSxLQUFBLENBQUErRCxhQUFBO1FBQU1DLFNBQVMsRUFBQztNQUFxQyxNQUFBUCxNQUFBLENBQzdDbk0sQ0FBQyxDQUFDOHZDLFNBQVMsQ0FBQ0Msa0JBQWtCLENBQUMsQ0FBQyxDQUNsQyxDQUFDLGVBQ1BybkMsS0FBQSxDQUFBK0QsYUFBQTtRQUFNQyxTQUFTLEVBQUM7TUFBcUMsR0FHN0MsYUFFRixDQUFDLGVBRVBoRSxLQUFBLENBQUErRCxhQUFBLENBQUM2aUMsK0RBQVk7UUFDVDVpQyxTQUFTLDZCQUFBUCxNQUFBLENBQ0xzakMsU0FBUyxHQUFHLGtDQUFrQyxHQUFHLEVBQUUsQ0FDcEQ7UUFDSDlKLE9BQU8sRUFBRSxTQUFBQSxRQUFBO1VBQUEsT0FBTXJ2QixNQUFJLENBQUN5dEIsUUFBUSxDQUFDO1lBQUMwTCxTQUFTLEVBQUUsQ0FBQ0E7VUFBUyxDQUFDLENBQUM7UUFBQTtNQUFDLENBQ3pELENBQ0MsQ0FDTCxDQUNSO01BQ0Q7O01BRUEsT0FBT0EsU0FBUyxnQkFDWi9tQyxLQUFBLENBQUErRCxhQUFBO1FBQUtDLFNBQVMsRUFBQztNQUE0QixHQUFFbWpDLFdBQWlCLENBQUMsZ0JBRS9Ebm5DLEtBQUEsQ0FBQStELGFBQUE7UUFBS0MsU0FBUyxFQUFFa2pDO01BQVksR0FDdkJDLFdBQVcsZUFDWm5uQyxLQUFBLENBQUErRCxhQUFBLENBQUN1akMsWUFBWTtRQUFDbHBDLEtBQUssRUFBRTlHLENBQUMsQ0FBQzhHO01BQU0sQ0FBRSxDQUM5QixDQUNSO0lBQ0w7RUFBQztFQUFBLE9BQUEwb0MsYUFBQTtBQUFBLEVBMUR1QnYvQiw0Q0FBUztBQTZEckMsSUFBTWdnQyxrQkFBa0IsR0FBRyxFQUFFO0FBQzdCO0FBQ0EsU0FBU0MsdUJBQXVCQSxDQUFBNy9CLElBQUEsRUFBZ0I7RUFBQSxJQUFkdkosS0FBSyxHQUFBdUosSUFBQSxDQUFMdkosS0FBSztJQUFFazZCLElBQUksR0FBQTN3QixJQUFBLENBQUoyd0IsSUFBSTtFQUN6QyxvQkFDSXQ0QixLQUFBLENBQUErRCxhQUFBO0lBQUtDLFNBQVMsRUFBQztFQUFpQixHQU0zQixPQUFPNUYsS0FBSyxDQUFDeVQsT0FBTyxLQUFLLFFBQVEsSUFDbEN6VCxLQUFLLENBQUN5VCxPQUFPLENBQUN6VixNQUFNLEdBQUdtckMsa0JBQWtCLEdBQUcsSUFBSSxnQkFDNUN2bkMsS0FBQSxDQUFBK0QsYUFBQTtJQUFLQyxTQUFTLEVBQUM7RUFBbUIsZ0JBQzlCaEUsS0FBQSxDQUFBK0QsYUFBQTtJQUFLQyxTQUFTLEVBQUM7RUFBMkMsR0FDckQ1RixLQUFLLENBQUN5VCxPQUNOLENBQ0osQ0FDUixFQUVBLE9BQU96VCxLQUFLLENBQUNrOEIsS0FBSyxLQUFLLFFBQVEsR0FBRyxJQUFJLGdCQUNuQ3Q2QixLQUFBLENBQUErRCxhQUFBO0lBQUtDLFNBQVMsRUFBQztFQUFtQixnQkFDOUJoRSxLQUFBLENBQUErRCxhQUFBO0lBQUtDLFNBQVMsRUFBQztFQUFxQixnQkFDaENoRSxLQUFBLENBQUErRCxhQUFBLCtCQUNJL0QsS0FBQSxDQUFBK0QsYUFBQSwrQkFDSS9ELEtBQUEsQ0FBQStELGFBQUEsWUFBRyxrSkFLQSxDQUNFLENBQUMsRUFFVDNGLEtBQUssQ0FBQ2s4QixLQUFLLENBQUM3d0IsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDbEIsR0FBRyxDQUFDLFVBQUNrL0IsSUFBSSxFQUFFenZDLENBQUM7SUFBQSxvQkFDakNnSSxLQUFBLENBQUErRCxhQUFBO01BQUc3RixHQUFHLEVBQUVsRztJQUFFLEdBQUV5dkMsSUFBUSxDQUFDO0VBQUEsQ0FDeEIsQ0FDSSxDQUNSLENBQ0osQ0FDUixFQUVBLE9BQU9ycEMsS0FBSyxDQUFDdzFCLElBQUksS0FBSyxRQUFRLEdBQUcsSUFBSSxHQUFHeDFCLEtBQUssQ0FBQ3cxQixJQUFJLENBQzVDOFQsU0FBUyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUN0ckMsTUFBTSxDQUFDLENBQ2hDdXJDLFdBQVcsQ0FBQyxDQUFDLEtBQUssV0FBVyxnQkFDaEMzbkMsS0FBQSxDQUFBK0QsYUFBQTtJQUFLQyxTQUFTLEVBQUM7RUFBbUIsZ0JBQzlCaEUsS0FBQSxDQUFBK0QsYUFBQTtJQUFLQyxTQUFTLEVBQUM7RUFBb0IsZ0JBTS9CaEUsS0FBQSxDQUFBK0QsYUFBQTtJQUNJNmpDLE1BQU0sRUFBRXhwQyxLQUFLLENBQUN3MUIsSUFBSSxDQUNiNWtCLE9BQU8sQ0FDSixTQUFTLDhCQUFBdkwsTUFBQSxDQUNpQm9qQyxvREFBVyxvQkFDekMsQ0FBQyxDQUNBNzNCLE9BQU8sQ0FDSixpQkFBaUIsUUFBQXZMLE1BQUEsQ0FDWjYwQixJQUFJLGtCQUNiLENBQUU7SUFDTndMLEtBQUssRUFBRTtNQUNIO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7TUFDZ0NDLEtBQUssRUFBRSxvQkFBb0I7TUFDM0JDLE1BQU0sRUFBRSxNQUFNO01BQ2Q2RCxNQUFNLEVBQUU7SUFDWjtFQUFFLENBQ0wsQ0FDQSxDQUNKLENBQUMsZ0JBRU43bkMsS0FBQSxDQUFBK0QsYUFBQTtJQUFLQyxTQUFTLEVBQUM7RUFBb0IsZ0JBQy9CaEUsS0FBQSxDQUFBK0QsYUFBQTtJQUFLQyxTQUFTLEVBQUM7RUFBb0IsR0FBRTVGLEtBQUssQ0FBQ3cxQixJQUFVLENBQ3BELENBRVIsQ0FBQztBQUVkO0FBQ0E7O0FBRUEsSUFBTWtVLGNBQWMsR0FBR3puQyx1REFBZSxDQUFDO0VBQ25Dd1IsT0FBTyxFQUFFeFIsMERBQWdCO0VBRXpCO0VBQ0FpNkIsS0FBSyxFQUFFajZCLDBEQUFnQjtFQUV2QjtFQUNBdXpCLElBQUksRUFBRXZ6QiwwREFBZ0I2TDtBQUMxQixDQUFDLENBQUM7QUFFRnM3Qix1QkFBdUIsQ0FBQ3ZpQyxTQUFTLEdBQUc7RUFDaEM3RyxLQUFLLEVBQUUwcEMsY0FBYztFQUNyQnhQLElBQUksRUFBRWo0QiwwREFBZ0I2TDtBQUMxQixDQUFDO0FBRUQsSUFBTW83QixZQUFZLEdBQUd6bkMsb0RBQU8sQ0FBQyxVQUFBMkYsS0FBSztFQUFBLE9BQUs7SUFBQzh5QixJQUFJLEVBQUU3bkIsdURBQU8sQ0FBQ2pMLEtBQUssQ0FBQzVELE1BQU07RUFBQyxDQUFDO0FBQUEsQ0FBQyxDQUFDLENBQ2xFNGxDLHVCQUNKLENBQUM7QUFFRFYsYUFBYSxDQUFDN2hDLFNBQVMsR0FBRztFQUN0QjNOLENBQUMsRUFBRStJLHVEQUFlLENBQUM7SUFDZittQyxTQUFTLEVBQUUvbUMsMERBQWdCO0lBQzNCakMsS0FBSyxFQUFFMHBDO0VBQ1gsQ0FBQyxDQUFDO0VBQ0ZiLFlBQVksRUFBRTVtQyx3REFBYztFQUM1QjJtQyxVQUFVLEVBQUUzbUMsd0RBQWM2UDtBQUM5QixDQUFDO0FBRUQ0MkIsYUFBYSxDQUFDaC9CLFlBQVksR0FBRztFQUN6Qm0vQixZQUFZLEVBQUUsS0FBSztFQUNuQkQsVUFBVSxFQUFFO0FBQ2hCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxTHNDO0FBQ1Y7QUFDTTtBQUNpQjtBQUFBLElBRTlDZSxzQkFBc0IsMEJBQUFuN0IsVUFBQTtFQUFBeEcsU0FBQSxDQUFBMmhDLHNCQUFBLEVBQUFuN0IsVUFBQTtFQUFBLElBQUF2RyxNQUFBLEdBQUFDLFlBQUEsQ0FBQXloQyxzQkFBQTtFQUN4QixTQUFBQSx1QkFBWXJtQyxLQUFLLEVBQUU7SUFBQThFLGVBQUEsT0FBQXVoQyxzQkFBQTtJQUFBLE9BQUExaEMsTUFBQSxDQUFBak4sSUFBQSxPQUNUc0ksS0FBSztFQUNmO0VBQUNvRixZQUFBLENBQUFpaEMsc0JBQUE7SUFBQTdwQyxHQUFBO0lBQUFuRyxLQUFBLEVBRUQsU0FBQXFQLE9BQUEsRUFBUztNQUNMLElBQUE4RixXQUFBLEdBQXdELElBQUksQ0FBQ3hMLEtBQUs7UUFBM0R5VyxNQUFNLEdBQUFqTCxXQUFBLENBQU5pTCxNQUFNO1FBQUVwRyxTQUFTLEdBQUE3RSxXQUFBLENBQVQ2RSxTQUFTO1FBQUVpMkIsWUFBWSxHQUFBOTZCLFdBQUEsQ0FBWjg2QixZQUFZO1FBQUVDLFlBQVksR0FBQS82QixXQUFBLENBQVorNkIsWUFBWTtNQUNwRCxJQUFNQyxZQUFZLEdBQUcvdkIsTUFBTSxDQUFDL2IsTUFBTTtNQUNsQyxJQUFJOHJDLFlBQVksS0FBSyxDQUFDLElBQUksQ0FBQ0YsWUFBWSxFQUFFO1FBQ3JDLE9BQU8sSUFBSTtNQUNmO01BRUEsSUFBTWYsWUFBWSxHQUFHLElBQUksQ0FBQ3ZsQyxLQUFLLENBQUN1bEMsWUFBWTtNQUM1QyxJQUFJQyxXQUFXLEdBQUcsNENBQTRDO01BRTlELElBQU1pQixhQUFhLEdBQUdod0IsTUFBTSxDQUFDNVAsR0FBRyxDQUFDLFVBQUNuSyxLQUFLLEVBQUVwRyxDQUFDLEVBQUs7UUFDM0Msb0JBQU9nSSwwREFBQSxDQUFDOG1DLCtEQUFhO1VBQUN4dkMsQ0FBQyxFQUFFOEcsS0FBTTtVQUFDNG9DLFVBQVUsRUFBRSxJQUFLO1VBQUM5b0MsR0FBRyxFQUFFbEc7UUFBRSxDQUFFLENBQUM7TUFDaEUsQ0FBQyxDQUFDO01BQ0YsSUFBSWl2QyxZQUFZLEVBQUU7UUFDZEMsV0FBVyxJQUFJLCtCQUErQjtNQUNsRDtNQUNBLG9CQUNJbG5DLDBEQUFBO1FBQUtnRSxTQUFTLEVBQUVrakM7TUFBWSxnQkFDeEJsbkMsMERBQUE7UUFBS2dFLFNBQVMsRUFBQztNQUF5QixnQkFDcENoRSwwREFBQTtRQUFLZ0UsU0FBUyxFQUFDO01BQTBCLEdBQUMsdUJBRXRDLGVBQUFoRSwwREFBQTtRQUFRZ0UsU0FBUyxFQUFDO01BQTJCLEdBQ3hDa2tDLFlBQ0csQ0FBQyxLQUNSLEVBQUNuMkIsU0FBUyxHQUFHLElBQUksR0FBRyxzQ0FDcEIsQ0FBQyxlQUNOL1IsMERBQUE7UUFDSWdFLFNBQVMsRUFBQyx1QkFBdUI7UUFDakNpNUIsT0FBTyxFQUFFLFNBQUFBLFFBQUE7VUFBQSxPQUFNZ0wsWUFBWSxDQUFDLENBQUM7UUFBQTtNQUFDLEdBQ2pDLE1BRUksQ0FDSixDQUFDLGVBQ05qb0MsMERBQUE7UUFBS2dFLFNBQVMsRUFBQztNQUF1QixHQUFFbWtDLGFBQW1CLENBQzFELENBQUM7SUFFZDtFQUFDO0VBQUEsT0FBQUosc0JBQUE7QUFBQSxFQXpDZ0N4Z0MsNENBQVM7QUE0QzlDd2dDLHNCQUFzQixDQUFDOWlDLFNBQVMsR0FBRztFQUMvQmdILEVBQUUsRUFBRTVMLDBEQUFnQjtFQUNwQjhYLE1BQU0sRUFBRTlYLHlEQUFlO0VBQ3ZCMFIsU0FBUyxFQUFFMVIsd0RBQWM7RUFDekI0bUMsWUFBWSxFQUFFNW1DLHVEQUFhO0VBQzNCMm5DLFlBQVksRUFBRTNuQyx1REFBYTtFQUMzQjRuQyxZQUFZLEVBQUU1bkMsd0RBQWM4RTtBQUNoQyxDQUFDO0FBRUQ0aUMsc0JBQXNCLENBQUM5aUMsU0FBUyxHQUFHO0VBQy9CZ2lDLFlBQVksRUFBRTVtQyx1REFBYWdGO0FBQy9CLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1RG1DO0FBQ0c7QUFDSjtBQUNjO0FBQUEsSUFFM0NnakMsK0JBQStCLDBCQUFBejdCLFVBQUE7RUFBQXhHLFNBQUEsQ0FBQWlpQywrQkFBQSxFQUFBejdCLFVBQUE7RUFBQSxJQUFBdkcsTUFBQSxHQUFBQyxZQUFBLENBQUEraEMsK0JBQUE7RUFDakMsU0FBQUEsZ0NBQVkzbUMsS0FBSyxFQUFFO0lBQUE4RSxlQUFBLE9BQUE2aEMsK0JBQUE7SUFBQSxPQUFBaGlDLE1BQUEsQ0FBQWpOLElBQUEsT0FDVHNJLEtBQUs7RUFDZjtFQUFDb0YsWUFBQSxDQUFBdWhDLCtCQUFBO0lBQUFucUMsR0FBQTtJQUFBbkcsS0FBQSxFQUVELFNBQUFxUCxPQUFBLEVBQVM7TUFDTCxJQUFBOEYsV0FBQSxHQUFrQyxJQUFJLENBQUN4TCxLQUFLO1FBQXJDRSxNQUFNLEdBQUFzTCxXQUFBLENBQU50TCxNQUFNO1FBQUV4RCxLQUFLLEdBQUE4TyxXQUFBLENBQUw5TyxLQUFLO1FBQUUyTixRQUFRLEdBQUFtQixXQUFBLENBQVJuQixRQUFRO01BQzlCLG9CQUNJL0wsMERBQUE7UUFBS2lNLEVBQUUsRUFBQztNQUE4QixnQkFDbENqTSwwREFBQSxDQUFDb29DLDREQUFTO1FBQUNocUMsS0FBSyxFQUFFQSxLQUFNO1FBQUNrcUMsU0FBUyxFQUFFQyxPQUFPLENBQUMzbUMsTUFBTSxDQUFDKzRCLFVBQVU7TUFBRSxnQkFDM0QzNkIsMERBQUE7UUFBS2lNLEVBQUUsRUFBQztNQUFtQixHQUFFRixRQUFjLENBQ3BDLENBQ1YsQ0FBQztJQUVkO0VBQUM7RUFBQSxPQUFBczhCLCtCQUFBO0FBQUEsRUFkeUM5Z0MsNENBQVM7QUFpQnZEOGdDLCtCQUErQixDQUFDcGpDLFNBQVMsR0FBRztFQUN4QzhHLFFBQVEsRUFBRTFMLDBEQUFnQjtFQUMxQnVCLE1BQU0sRUFBRXZCLDBEQUFnQjtFQUN4QmpDLEtBQUssRUFBRWlDLDBEQUFnQitFO0FBQzNCLENBQUM7QUFFRCxJQUFNN0Usb0JBQW9CLEdBQUdWLG9EQUFPLENBQUMsVUFBQTJGLEtBQUs7RUFBQSxPQUFLO0lBQzNDNUQsTUFBTSxFQUFFNEQsS0FBSyxDQUFDNUQsTUFBTTtJQUNwQnhELEtBQUssRUFBRW9ILEtBQUssQ0FBQ3BIO0VBQ2pCLENBQUM7QUFBQSxDQUFDLENBQUMsQ0FBQ2lxQywrQkFBK0IsQ0FBQztBQUVwQywrREFBZTluQyxvQkFBb0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqQ0k7QUFDSjtBQUNOO0FBRUs7QUFDNkM7QUFBQSxJQUUxRGlvQyxrQkFBa0IsMEJBQUE1N0IsVUFBQTtFQUFBeEcsU0FBQSxDQUFBb2lDLGtCQUFBLEVBQUE1N0IsVUFBQTtFQUFBLElBQUF2RyxNQUFBLEdBQUFDLFlBQUEsQ0FBQWtpQyxrQkFBQTtFQUNuQyxTQUFBQSxtQkFBWTltQyxLQUFLLEVBQUU7SUFBQThFLGVBQUEsT0FBQWdpQyxrQkFBQTtJQUFBLE9BQUFuaUMsTUFBQSxDQUFBak4sSUFBQSxPQUNUc0ksS0FBSztFQUNmO0VBQUNvRixZQUFBLENBQUEwaEMsa0JBQUE7SUFBQXRxQyxHQUFBO0lBQUFuRyxLQUFBLEVBRUQsU0FBQXFQLE9BQUEsRUFBUztNQUNMLElBQUE4RixXQUFBLEdBQXFELElBQUksQ0FBQ3hMLEtBQUs7UUFBeEQrbUMsT0FBTyxHQUFBdjdCLFdBQUEsQ0FBUHU3QixPQUFPO1FBQUVycUMsS0FBSyxHQUFBOE8sV0FBQSxDQUFMOU8sS0FBSztRQUFFNHBDLFlBQVksR0FBQTk2QixXQUFBLENBQVo4NkIsWUFBWTtRQUFFQyxZQUFZLEdBQUEvNkIsV0FBQSxDQUFaKzZCLFlBQVk7TUFFakQsSUFBSVMsY0FBYztNQUNsQixJQUFJVixZQUFZLEVBQUU7UUFDZCxJQUFNN3ZCLE1BQU0sR0FBRzFVLGlEQUFNLENBQUNyRixLQUFLLENBQUMyRyxRQUFRLEVBQUUzRyxLQUFLLENBQUM0RyxPQUFPLENBQUM7UUFFcEQwakMsY0FBYyxnQkFDVjFvQywwREFBQSxDQUFDK25DLDBGQUFzQjtVQUNuQjV2QixNQUFNLEVBQUVBLE1BQU87VUFDZnBHLFNBQVMsRUFBRTNULEtBQUssQ0FBQzRULGdCQUFpQjtVQUNsQ2cyQixZQUFZLEVBQUVBLFlBQWE7VUFDM0JDLFlBQVksRUFBRUE7UUFBYSxDQUM5QixDQUNKO01BQ0w7TUFDQSxvQkFDSWpvQywwREFBQSwyQkFDSUEsMERBQUEsY0FBTSxJQUFJLENBQUMwQixLQUFLLENBQUNxSyxRQUFjLENBQUMsZUFDaEMvTCwwREFBQTtRQUFLZ0UsU0FBUyxFQUFDO01BQWlCLGdCQUM1QmhFLDBEQUFBO1FBQUtnRSxTQUFTLEVBQUV5a0MsT0FBTyxHQUFHLGdCQUFnQixHQUFHO01BQUcsR0FDM0NDLGNBQ0EsQ0FDSixDQUNKLENBQUM7SUFFZDtFQUFDO0VBQUEsT0FBQUYsa0JBQUE7QUFBQSxFQS9CMkNqaEMsNENBQVM7QUFBbEI7QUFrQ3ZDaWhDLGtCQUFrQixDQUFDdmpDLFNBQVMsR0FBRztFQUMzQjhHLFFBQVEsRUFBRTFMLDBEQUFnQjtFQUMxQm9vQyxPQUFPLEVBQUVwb0Msd0RBQWM7RUFDdkJqQyxLQUFLLEVBQUVpQywwREFBZ0I7RUFDdkIybkMsWUFBWSxFQUFFM25DLHVEQUFhO0VBQzNCNG5DLFlBQVksRUFBRTVuQyx3REFBYzhFO0FBQ2hDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvQ3NDO0FBQ0o7QUFFVjtBQUVvQjtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0o7QUFFa0I7QUFDd0I7QUFFckYsSUFBTThqQyxPQUFPLEdBQUcsU0FBVkEsT0FBT0EsQ0FBSTNRLElBQUksRUFBRTRRLE9BQU8sRUFBRUMsUUFBUTtFQUFBLE9BQ3BDLEdBQUExbEMsTUFBQSxDQUFHNjBCLElBQUksT0FBQTcwQixNQUFBLENBQUk2MEIsSUFBSSxRQUFBNzBCLE1BQUEsQ0FBS3lsQyxPQUFPLEtBQU1DLFFBQVEsT0FBQTFsQyxNQUFBLENBQU82MEIsSUFBSSxRQUFBNzBCLE1BQUEsQ0FBSzBsQyxRQUFRLElBQUssRUFBRSxDQUFDO0FBQUE7QUFFN0UsSUFBTUMsYUFBYSxHQUFHLFNBQWhCQSxhQUFhQSxDQUNmQyxPQUFPLEVBQ1BDLGFBQWEsRUFDYkMsTUFBTSxFQUNOQyxLQUFLLEVBQ0xDLFdBQVcsRUFDWDlLLEtBQUs7RUFBQSxvQkFFTDMrQiwwREFBQTtJQUFLZ0UsU0FBUyxFQUFDO0VBQW1DLGdCQUM5Q2hFLDBEQUFBO0lBQ0lnRSxTQUFTLEVBQUVpbEMsT0FBTyxDQUNkLHlCQUF5QixFQUN6QkssYUFBYSxFQUNiRCxPQUFPLElBQUksU0FDZixDQUFFO0lBQ0ZwTSxPQUFPLEVBQUVzTTtFQUFPLGdCQUVoQnZwQywwREFBQSxDQUFDd3BDLEtBQUs7SUFBQ3hsQyxTQUFTLEVBQUVpbEMsT0FBTyxDQUFDLHVCQUF1QixFQUFFUSxXQUFXO0VBQUUsQ0FBRSxDQUFDLEVBQ2xFOUssS0FBSyxnQkFDRjMrQiwwREFBQTtJQUFPZ0UsU0FBUyxFQUFDO0VBQStCLEdBQUUyNkIsS0FBYSxDQUFDLEdBQ2hFLElBQ0gsQ0FDSixDQUFDO0FBQUEsQ0FDVDtBQUFDLElBRUl5SixTQUFTLDBCQUFBeDdCLFVBQUE7RUFBQXhHLFNBQUEsQ0FBQWdpQyxTQUFBLEVBQUF4N0IsVUFBQTtFQUFBLElBQUF2RyxNQUFBLEdBQUFDLFlBQUEsQ0FBQThoQyxTQUFBO0VBQ1gsU0FBQUEsVUFBWTFtQyxLQUFLLEVBQUU7SUFBQSxJQUFBNkUsS0FBQTtJQUFBQyxlQUFBLE9BQUE0aEMsU0FBQTtJQUNmN2hDLEtBQUEsR0FBQUYsTUFBQSxDQUFBak4sSUFBQSxPQUFNc0ksS0FBSztJQUVYNkUsS0FBQSxDQUFLZixLQUFLLEdBQUc7TUFDVGtrQyxNQUFNLEVBQUUsS0FBSztNQUNiQyxtQkFBbUIsRUFBRSxLQUFLO01BQzFCM0IsWUFBWSxFQUFFO0lBQ2xCLENBQUM7SUFBQyxPQUFBemhDLEtBQUE7RUFDTjtFQUFDTyxZQUFBLENBQUFzaEMsU0FBQTtJQUFBbHFDLEdBQUE7SUFBQW5HLEtBQUEsRUFDRCxTQUFBcVAsT0FBQSxFQUFTO01BQUEsSUFBQXdHLE1BQUE7TUFDTCxJQUFBOHVCLFdBQUEsR0FBb0QsSUFBSSxDQUFDbDNCLEtBQUs7UUFBdkRra0MsTUFBTSxHQUFBaE4sV0FBQSxDQUFOZ04sTUFBTTtRQUFFMUIsWUFBWSxHQUFBdEwsV0FBQSxDQUFac0wsWUFBWTtRQUFFMkIsbUJBQW1CLEdBQUFqTixXQUFBLENBQW5CaU4sbUJBQW1CO01BQ2hELElBQUF6OEIsV0FBQSxHQUEyQixJQUFJLENBQUN4TCxLQUFLO1FBQTlCdEQsS0FBSyxHQUFBOE8sV0FBQSxDQUFMOU8sS0FBSztRQUFFa3FDLFNBQVMsR0FBQXA3QixXQUFBLENBQVRvN0IsU0FBUztNQUV2QixJQUFNc0IsUUFBUSxHQUFHeHJDLEtBQUssQ0FBQzJHLFFBQVEsQ0FBQzNJLE1BQU0sR0FBR2dDLEtBQUssQ0FBQzRHLE9BQU8sQ0FBQzVJLE1BQU07TUFDN0QsSUFBTTJWLFNBQVMsR0FBRzNULEtBQUssQ0FBQzRULGdCQUFnQjtNQUV4QyxJQUFNNjNCLFlBQVksR0FBRyxTQUFmQSxZQUFZQSxDQUFBLEVBQVM7UUFDdkJqOEIsTUFBSSxDQUFDeXRCLFFBQVEsQ0FBQztVQUFDMk0sWUFBWSxFQUFFLENBQUNBO1FBQVksQ0FBQyxDQUFDO01BQ2hELENBQUM7TUFFRCxJQUFNbmtDLE1BQU0sR0FBR3lrQyxTQUFTLEdBQ2xCdjJCLFNBQVMsR0FDTCxXQUFXLEdBQ1gsYUFBYSxHQUNqQixNQUFNO01BQ1osSUFBTSszQixXQUFXLEdBQUd4QixTQUFTLEdBQ3ZCdjJCLFNBQVMsR0FDTDYyQiw0REFBUyxHQUNUSSwwREFBTyxHQUNYSCw0REFBUztNQUVmLElBQU1rQixXQUFXLEdBQUdMLE1BQU0sZ0JBQ3RCMXBDLDBEQUFBO1FBQUtnRSxTQUFTLEVBQUM7TUFBMEIsR0FDcEMybEMsbUJBQW1CLGdCQUFHM3BDLDBEQUFBLENBQUM4a0MsZ0dBQXNCLE1BQUUsQ0FBQyxHQUFHLElBQUksRUFDdkRzRSxhQUFhLENBQ1ZPLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsWUFBTTtRQUNGLzdCLE1BQUksQ0FBQ3l0QixRQUFRLENBQUM7VUFDVnNPLG1CQUFtQixFQUFFLENBQUNBO1FBQzFCLENBQUMsQ0FBQztNQUNOLENBQUMsRUFDRFosNERBQVMsRUFDVCxPQUFPLEVBQ1AsV0FDSixDQUFDLEVBQ0FLLGFBQWEsQ0FDVnBCLFlBQVksRUFDWixRQUFRLEVBQ1I2QixZQUFZLEVBQ1psQiwyREFBUSxFQUNSLE1BQU0sRUFDTmlCLFFBQVEsR0FBRyxRQUFRLElBQUlBLFFBQVEsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FDcEQsQ0FBQyxFQUNBUixhQUFhLENBQ1YsS0FBSyxFQUNMdmxDLE1BQU0sRUFDTixJQUFJLEVBQ0ppbUMsV0FBVyxFQUNYLFdBQVcsRUFDWCxRQUNKLENBQ0MsQ0FBQyxnQkFFTjlwQywwREFBQTtRQUFLZ0UsU0FBUyxFQUFDO01BQTBCLENBQUUsQ0FDOUM7TUFFRCxJQUFNZ21DLFdBQVcsR0FDYixDQUFDSixRQUFRLElBQUksQ0FBQzczQixTQUFTLEtBQUssQ0FBQzIzQixNQUFNLGdCQUMvQjFwQywwREFBQTtRQUFLZ0UsU0FBUyxFQUFDO01BQXdCLGdCQUNuQ2hFLDBEQUFBO1FBQUtnRSxTQUFTLEVBQUMsa0JBQWtCO1FBQUNpNUIsT0FBTyxFQUFFNE07TUFBYSxHQUNuREQsUUFBUSxnQkFDTDVwQywwREFBQTtRQUFLZ0UsU0FBUyxFQUFDO01BQXdCLEdBQ2xDLEtBQUssR0FBRzRsQyxRQUNSLENBQUMsR0FDTixJQUFJLEVBQ1A3M0IsU0FBUyxHQUFHLElBQUksZ0JBQ2IvUiwwREFBQTtRQUFLZ0UsU0FBUyxFQUFDO01BQXlCLEdBQUMsY0FBTyxDQUVuRCxDQUNKLENBQUMsR0FDTixJQUFJO01BRVosSUFBTWltQyxXQUFXLEdBQUdQLE1BQU0sR0FBRyxNQUFNLEdBQUcsUUFBUTtNQUU5QyxvQkFDSTFwQywwREFBQSxjQUNLZ3FDLFdBQVcsZUFDWmhxQywwREFBQTtRQUFLZ0UsU0FBUyxFQUFFaWxDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRWdCLFdBQVc7TUFBRSxHQUMxREYsV0FDQSxDQUFDLGVBQ04vcEMsMERBQUE7UUFDSWdFLFNBQVMsRUFBRWlsQyxPQUFPLENBQUMsaUJBQWlCLEVBQUVnQixXQUFXLENBQUU7UUFDbkRoTixPQUFPLEVBQUUsU0FBQUEsUUFBQSxFQUFNO1VBQ1hydkIsTUFBSSxDQUFDeXRCLFFBQVEsQ0FBQztZQUFDcU8sTUFBTSxFQUFFLENBQUNBO1VBQU0sQ0FBQyxDQUFDO1FBQ3BDO01BQUUsZ0JBRUYxcEMsMERBQUEsQ0FBQzhvQyw0REFBUztRQUNOOWtDLFNBQVMsRUFBRWlsQyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsT0FBTztNQUFFLENBQ3hELENBQ0EsQ0FBQyxlQUNOanBDLDBEQUFBLENBQUN3b0MsaUVBQWtCO1FBQ2ZwcUMsS0FBSyxFQUFFQSxLQUFNO1FBQ2JxcUMsT0FBTyxFQUFFbUIsUUFBUSxHQUFHLENBQUU7UUFDdEI1QixZQUFZLEVBQUVBLFlBQWE7UUFDM0JDLFlBQVksRUFBRTRCO01BQWEsR0FFMUIsSUFBSSxDQUFDbm9DLEtBQUssQ0FBQ3FLLFFBQ0ksQ0FDbkIsQ0FBQztJQUVkO0VBQUM7RUFBQSxPQUFBcThCLFNBQUE7QUFBQSxFQWhIbUI3Z0MsNENBQVM7QUFtSGpDNmdDLFNBQVMsQ0FBQ25qQyxTQUFTLEdBQUc7RUFDbEI4RyxRQUFRLEVBQUUxTCwwREFBZ0I7RUFDMUJqQyxLQUFLLEVBQUVpQywwREFBZ0I7RUFDdkJpb0MsU0FBUyxFQUFFam9DLHdEQUFjNlA7QUFDN0IsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ2xLRDtBQUNBOztBQUVBLCtEQUFlOzs7Ozs7Ozs7Ozs7Ozs7QUNzQkEsU0FBU3JLLGdCQUFnQkEsQ0FBQSxFQUFXO0VBQy9DLElBQU1xa0MsYUFBYSxHQUFHaGlDLFFBQVEsQ0FBQ0MsY0FBYyxDQUFDLGNBQWMsQ0FBQztFQUM3RCxPQUFPNUQsSUFBSSxDQUFDb0ksS0FBSyxDQUNidTlCLGFBQWEsYUFBYkEsYUFBYSxlQUFiQSxhQUFhLENBQUVDLFdBQVcsR0FBR0QsYUFBYSxhQUFiQSxhQUFhLHVCQUFiQSxhQUFhLENBQUVDLFdBQVcsR0FBRyxJQUM5RCxDQUFDO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5Qk8sSUFBTUMscUJBQXFCLEdBQUcsbUJBQW1CO0FBQ2pELElBQU1DLGlCQUFpQixHQUFHLG9CQUFvQjtBQUM5QyxJQUFNMTVCLG1CQUFtQixHQUFHLGFBQWE7QUFFekMsSUFBTXZQLE1BQU0sR0FBRztFQUNsQjBDLEVBQUUsRUFBRSxHQUFHO0VBQ1ArWCxjQUFjLEVBQUUsR0FBRztFQUNuQjtFQUNBO0VBQ0E7RUFDQXhKLFdBQVcsRUFBRSxHQUFHO0VBQ2hCRCxZQUFZLEVBQUUsR0FBRztFQUNqQjBKLGdCQUFnQixFQUFFLGtCQUFrQjtFQUNwQ3dELFdBQVcsRUFBRTtBQUNqQixDQUFDO0FBRU0sSUFBTThsQixTQUFTLEdBQUc7RUFDckIsQ0FBQ2hrQyxNQUFNLENBQUMwQyxFQUFFLEdBQUcsU0FBUztFQUN0QixDQUFDMUMsTUFBTSxDQUFDeWEsY0FBYyxHQUFHO0FBQzdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbkJtQztBQUU3QixTQUFTM1Isb0JBQW9CQSxDQUFDMkgsT0FBTyxFQUFFblEsS0FBSyxFQUFFeEksSUFBSSxFQUFFO0VBQ3ZEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7RUFFSSxJQUFNb3hDLFlBQVksR0FBR3o0QixPQUFPLENBQUNwSSxLQUFLLENBQUMsR0FBRyxDQUFDO0VBQ3ZDLElBQUl1QyxZQUFZO0VBQ2hCLElBQUlsTSxpREFBUSxDQUFDLHVCQUF1QixFQUFFK1IsT0FBTyxDQUFDLEVBQUU7SUFDNUMsSUFBTTA0QixlQUFlLEdBQUdELFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDdkN0K0IsWUFBWSxNQUFBdkksTUFBQSxDQUFNOG1DLGVBQWUsVUFBQTltQyxNQUFBLENBQU92SyxJQUFJLENBQUU7SUFDOUMsSUFBSXdJLEtBQUssQ0FBQ3VLLEVBQUUsRUFBRTtNQUNWRCxZQUFZLGtCQUFBdkksTUFBQSxDQUFpQi9CLEtBQUssQ0FBQ3VLLEVBQUUsT0FBRztJQUM1QztJQUNBRCxZQUFZLElBQUksdUNBQXVDO0VBQzNELENBQUMsTUFBTSxJQUFJbE0saURBQVEsQ0FBQyxZQUFZLEVBQUUrUixPQUFPLENBQUMsRUFBRTtJQUN4QztBQUNSO0FBQ0E7QUFDQTtJQUNRN0YsWUFBWSxHQUNSNkYsT0FBTyxDQUFDcEksS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBQWhHLE1BQUEsQ0FDakJ2SyxJQUFJLENBQUUsR0FDckIsUUFBUSxHQUNSMlksT0FBTyxDQUFDcEksS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNsQyxDQUFDLE1BQU0sSUFDSDNKLGlEQUFRLENBQUMsVUFBVSxFQUFFK1IsT0FBTyxDQUFDLElBQzdCL1IsaURBQVEsQ0FBQyxlQUFlLEVBQUUrUixPQUFPLENBQUMsRUFDcEM7SUFDRSxJQUFNMDRCLGdCQUFlLEdBQUdELFlBQVksQ0FBQyxDQUFDLENBQUM7SUFFdkN0K0IsWUFBWSx3QkFBQXZJLE1BQUEsQ0FBeUI4bUMsZ0JBQWUsb0JBQUE5bUMsTUFBQSxDQUFrQnZLLElBQUksQ0FBRTtJQUM1RSxJQUFJd0ksS0FBSyxDQUFDdUssRUFBRSxFQUFFO01BQ1ZELFlBQVksa0JBQUF2SSxNQUFBLENBQWlCL0IsS0FBSyxDQUFDdUssRUFBRSxPQUFHO0lBQzVDO0lBQ0FELFlBQVksSUFBSSxHQUFHOztJQUVuQjtBQUNSO0FBQ0E7QUFDQTtBQUNBO0lBQ1EsSUFBSWxNLGlEQUFRLENBQUMsYUFBYSxFQUFFK1IsT0FBTyxDQUFDLEVBQUU7TUFDbEMsSUFBTTI0QixnQkFBZ0IsR0FBRzM0QixPQUFPLENBQUNwSSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ3hEdUMsWUFBWSxrQkFBQXZJLE1BQUEsQ0FBa0IrbUMsZ0JBQWdCLENBQUU7SUFDcEQ7O0lBRUE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtJQUNRLElBQUkxcUMsaURBQVEsQ0FBQyxZQUFZLEVBQUUrUixPQUFPLENBQUMsRUFBRTtNQUNqQyxJQUFNNDRCLHVCQUF1QixHQUFHNTRCLE9BQU8sQ0FDbENwSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3RCQSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ2xCdUMsWUFBWSw0QkFBQXZJLE1BQUEsQ0FBNkJnbkMsdUJBQXVCLE9BQUs7SUFDekU7SUFFQSxJQUFJaGdDLGlEQUFHLENBQUM4L0IsZ0JBQWUsRUFBRTdvQyxLQUFLLENBQUMsRUFBRTtNQUM3QjtBQUNaO0FBQ0E7QUFDQTtBQUNBO01BQ1ksSUFBTWdwQyxpQkFBaUIsR0FBR25tQyxJQUFJLENBQUNDLFNBQVMsQ0FDcEM5QyxLQUFLLENBQUM2b0MsZ0JBQWUsQ0FBQyxFQUN0QixJQUFJLEVBQ0osQ0FDSixDQUFDO01BQ0QsSUFBSUcsaUJBQWlCLEVBQUU7UUFDbkIsSUFBSTVxQyxpREFBUSxDQUFDLElBQUksRUFBRTRxQyxpQkFBaUIsQ0FBQyxFQUFFO1VBQ25DMStCLFlBQVksMkJBQUF2SSxNQUFBLENBQTJCaW5DLGlCQUFpQixDQUFFO1FBQzlELENBQUMsTUFBTTtVQUNIMStCLFlBQVkseUJBQUF2SSxNQUFBLENBQXlCaW5DLGlCQUFpQixDQUFFO1FBQzVEO01BQ0o7SUFDSjtFQUNKLENBQUMsTUFBTTtJQUNIO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7SUFDUSxNQUFNLElBQUkvdkMsS0FBSyxDQUFDa1gsT0FBTyxDQUFDO0VBQzVCO0VBRUEsTUFBTSxJQUFJbFgsS0FBSyxDQUFDcVIsWUFBWSxDQUFDO0FBQ2pDOzs7Ozs7Ozs7Ozs7OztBQ3ZIcUM7QUFFckMsSUFBTTIrQixzQkFBc0IsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQztBQUV0RSwrREFBZSxVQUFBMzlCLFNBQVM7RUFBQSxPQUFJbE4saURBQVEsQ0FBQzVHLGlEQUFJLENBQUM4VCxTQUFTLENBQUMsRUFBRTI5QixzQkFBc0IsQ0FBQztBQUFBOzs7Ozs7Ozs7Ozs7QUNEN0UsSUFBTUMsV0FBVyxHQUFHLFNBQWRBLFdBQVdBLENBQUlqaEMsUUFBMkIsRUFBSztFQUNqRCxJQUFBNEQsU0FBQSxHQUE0QjVELFFBQVEsQ0FBQyxDQUFDO0lBQS9CL0gsTUFBTSxHQUFBMkwsU0FBQSxDQUFOM0wsTUFBTTtJQUFFMjRCLFNBQVMsR0FBQWh0QixTQUFBLENBQVRndEIsU0FBUztFQUV4QixJQUFNc1EsWUFBWSxHQUFHanBDLE1BQU0sYUFBTkEsTUFBTSx1QkFBTkEsTUFBTSxDQUFFaXBDLFlBQVk7RUFFekMsSUFBSSxDQUFDQSxZQUFZLEVBQUU7SUFDZjtFQUNKO0VBRUEsSUFBSXRRLFNBQVMsRUFBRTtJQUNYLElBQUlyeUIsUUFBUSxDQUFDNGlDLEtBQUssS0FBS0QsWUFBWSxFQUFFO01BQ2pDbGlDLFNBQVEsQ0FBQ21pQyxLQUFLLEdBQUc1aUMsUUFBUSxDQUFDNGlDLEtBQUs7TUFDL0I1aUMsUUFBUSxDQUFDNGlDLEtBQUssR0FBR0QsWUFBWTtJQUNqQztFQUNKLENBQUMsTUFBTTtJQUNILElBQUkzaUMsUUFBUSxDQUFDNGlDLEtBQUssS0FBS0QsWUFBWSxFQUFFO01BQ2pDM2lDLFFBQVEsQ0FBQzRpQyxLQUFLLEdBQUduaUMsU0FBUSxDQUFDbWlDLEtBQUs7SUFDbkMsQ0FBQyxNQUFNO01BQ0huaUMsU0FBUSxDQUFDbWlDLEtBQUssR0FBRzVpQyxRQUFRLENBQUM0aUMsS0FBSztJQUNuQztFQUNKO0FBQ0osQ0FBQztBQUVELElBQU1uaUMsU0FBK0MsR0FBRztFQUNwREMsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDO0VBQ3JCbWlDLGdCQUFnQixFQUFFbnNDLFNBQVM7RUFDM0IrSixRQUFRLEVBQUUsU0FBQUEsU0FBQWhCLElBQUEsRUFBZ0I7SUFBQSxJQUFkZ0MsUUFBUSxHQUFBaEMsSUFBQSxDQUFSZ0MsUUFBUTtJQUNoQixJQUFBeXFCLFVBQUEsR0FBaUJ6cUIsUUFBUSxDQUFDLENBQUM7TUFBcEIvSCxNQUFNLEdBQUF3eUIsVUFBQSxDQUFOeHlCLE1BQU07SUFFYixJQUFJK0csU0FBUSxDQUFDL0csTUFBTSxLQUFLQSxNQUFNLEVBQUU7TUFBQSxJQUFBb3BDLHFCQUFBO01BQzVCcmlDLFNBQVEsQ0FBQy9HLE1BQU0sR0FBR0EsTUFBTTtNQUN4QixDQUFBb3BDLHFCQUFBLEdBQUFyaUMsU0FBUSxDQUFDb2lDLGdCQUFnQixjQUFBQyxxQkFBQSxlQUF6QkEscUJBQUEsQ0FBMkJDLFVBQVUsQ0FBQyxDQUFDO01BQ3ZDdGlDLFNBQVEsQ0FBQ29pQyxnQkFBZ0IsR0FBRyxJQUFJRyxnQkFBZ0IsQ0FBQztRQUFBLE9BQzdDTixXQUFXLENBQUNqaEMsUUFBUSxDQUFDO01BQUEsQ0FDekIsQ0FBQztNQUVELElBQU1taEMsS0FBSyxHQUFHNWlDLFFBQVEsQ0FBQ2l6QixhQUFhLENBQUMsT0FBTyxDQUFDO01BQzdDLElBQUkyUCxLQUFLLEVBQUU7UUFDUG5pQyxTQUFRLENBQUNvaUMsZ0JBQWdCLENBQUNJLE9BQU8sQ0FBQ0wsS0FBSyxFQUFFO1VBQ3JDOUUsT0FBTyxFQUFFLElBQUk7VUFDYm9GLFNBQVMsRUFBRSxJQUFJO1VBQ2ZDLFVBQVUsRUFBRSxJQUFJO1VBQ2hCQyxhQUFhLEVBQUU7UUFDbkIsQ0FBQyxDQUFDO01BQ047SUFDSjtJQUVBVixXQUFXLENBQUNqaEMsUUFBUSxDQUFDO0VBQ3pCO0FBQ0osQ0FBQztBQUVELCtEQUFlaEIsU0FBUTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM0NSO0FBVWU7QUFFMEI7QUFPcEI7QUFJK0I7QUFDWjtBQUVXO0FBR2xFLElBQU1BLFFBQStDLEdBQUc7RUFDcERBLFFBQVEsRUFBRSxTQUFBQSxTQUFBaEIsSUFBQSxFQUEwQjtJQUFBLElBQXhCL0UsUUFBUSxHQUFBK0UsSUFBQSxDQUFSL0UsUUFBUTtNQUFFK0csUUFBUSxHQUFBaEMsSUFBQSxDQUFSZ0MsUUFBUTtJQUMxQixJQUFBNEQsU0FBQSxHQUVJNUQsUUFBUSxDQUFDLENBQUM7TUFERTZoQyxRQUFRLEdBQUFqK0IsU0FBQSxDQUFwQm9ZLFNBQVMsQ0FBRzZsQixRQUFRO0lBR3hCLFNBQVNDLFVBQVVBLENBQUN4L0IsRUFBTyxFQUFFeS9CLFlBQWlCLEVBQUU7TUFDNUMsSUFBQXRYLFVBQUEsR0FBd0J6cUIsUUFBUSxDQUFDLENBQUM7UUFBM0I1SCxNQUFNLEdBQUFxeUIsVUFBQSxDQUFOcnlCLE1BQU07UUFBRW9WLEtBQUssR0FBQWlkLFVBQUEsQ0FBTGpkLEtBQUs7TUFDcEIsSUFBTTFKLFFBQVEsR0FBR21ILHVEQUFPLENBQUN1QyxLQUFLLEVBQUVsTCxFQUFFLENBQUM7TUFDbkMsSUFBSSxDQUFDd0IsUUFBUSxFQUFFO1FBQ1gsT0FBTyxLQUFLO01BQ2hCOztNQUVBO01BQ0E7TUFDQTtNQUNBaStCLFlBQVksR0FBR0gsOERBQWdCLENBQzNCL2lDLGlEQUFJLENBQUNpRixRQUFRLEVBQUUxTCxNQUFNLENBQUMsRUFDdEIycEMsWUFBWSxFQUNaOW9DLFFBQ0osQ0FBQzs7TUFFRDtNQUNBO01BQ0EsSUFBQStvQyxpQkFBQSxHQUFnQnpxQyw4REFBZ0IsQ0FBQztVQUFDUSxLQUFLLEVBQUVncUM7UUFBWSxDQUFDLEVBQUU5b0MsUUFBUSxDQUFDO1FBQTFEbEIsS0FBSyxHQUFBaXFDLGlCQUFBLENBQUxqcUMsS0FBSztNQUVaa0IsUUFBUSxDQUNKc0kscURBQVcsQ0FBQztRQUNSdUMsUUFBUTtRQUNSL0wsS0FBSztRQUNMbzlCLE1BQU0sRUFBRTtNQUNaLENBQUMsQ0FDTCxDQUFDO01BRUQsT0FBT3A5QixLQUFLO0lBQ2hCO0lBRUEsSUFBSWtxQyxrQkFBK0IsR0FBRyxFQUFFO0lBQ3hDLElBQU1DLGVBQWtDLEdBQUcsRUFBRTtJQUU3Q0wsUUFBUSxDQUFDcnhDLE9BQU8sQ0FBQyxVQUFBMmQsRUFBRSxFQUFJO01BQUEsSUFBQWcwQixnQkFBQTtNQUNuQixJQUFNQyxZQUFZLEdBQUd0b0MsaURBQU0sRUFBQXFvQyxnQkFBQSxHQUFDaDBCLEVBQUUsQ0FBQ2kwQixZQUFZLGNBQUFELGdCQUFBLGNBQUFBLGdCQUFBLEdBQUksRUFBRSxFQUFFLENBQUNoMEIsRUFBRSxDQUFDa0ksUUFBUSxDQUFDLENBQUM7TUFFakUsSUFBQUQsWUFBQSxHQUdJakksRUFBRSxDQUZGa0ksUUFBUTtRQUFHekcsbUJBQW1CLEdBQUF3RyxZQUFBLENBQW5CeEcsbUJBQW1CO1FBQUU0QyxNQUFNLEdBQUE0RCxZQUFBLENBQU41RCxNQUFNO1FBQ3RDNnZCLGVBQWUsR0FDZmwwQixFQUFFLENBREZrMEIsZUFBZTtNQUduQixJQUFJeGhDLGlEQUFLLENBQUN3aEMsZUFBZSxDQUFDLEVBQUU7UUFDeEI7TUFDSjtNQUVBLElBQU92dEIsSUFBSSxHQUFvQnV0QixlQUFlLENBQXZDdnRCLElBQUk7UUFBRXJnQixLQUFLLEdBQWE0dEMsZUFBZSxDQUFqQzV0QyxLQUFLO1FBQUU2VCxPQUFPLEdBQUkrNUIsZUFBZSxDQUExQi81QixPQUFPO01BRTNCLElBQUl3TSxJQUFJLEtBQUs3ZixTQUFTLEVBQUU7UUFDcEJuSCxNQUFNLENBQUN3MEMsT0FBTyxDQUFDeHRCLElBQUksQ0FBQyxDQUFDdGtCLE9BQU8sQ0FDeEIsVUFBQW1pQixLQUFBLEVBQThDO1VBQUEsSUFBQUMsS0FBQSxHQUFBMWQsY0FBQSxDQUFBeWQsS0FBQTtZQUE1Q3JRLEVBQUUsR0FBQXNRLEtBQUE7WUFBRTdhLEtBQUssR0FBQTZhLEtBQUE7VUFDUCxJQUFNMnZCLFFBQVEsR0FBR3ZuQixzRUFBZSxDQUFDMVksRUFBRSxDQUFDO1VBQ3BDLElBQUFzb0IsVUFBQSxHQUlJNXFCLFFBQVEsQ0FBQyxDQUFDO1lBSFY3RyxNQUFNLEdBQUF5eEIsVUFBQSxDQUFOenhCLE1BQU07WUFDRXFwQyxTQUFTLEdBQUE1WCxVQUFBLENBQWpCeHlCLE1BQU07WUFDQzQxQixRQUFRLEdBQUFwRCxVQUFBLENBQWZwZCxLQUFLOztVQUdUO1VBQ0EsSUFBTWkxQixZQUFZLEdBQUdYLFVBQVUsQ0FBQ1MsUUFBUSxFQUFFeHFDLEtBQUssQ0FBQzs7VUFFaEQ7VUFDQWtxQyxrQkFBa0IsR0FBR25vQyxpREFBTSxDQUN2Qm1vQyxrQkFBa0IsRUFDbEI1M0IsaURBQU8sQ0FDSHpMLGtEQUFHLENBQ0MsVUFBQWlkLElBQUk7WUFBQSxPQUNBdkMsNkVBQW1CLENBQ2ZuZ0IsTUFBTSxFQUNONjBCLFFBQVEsRUFDUnVVLFFBQVEsRUFDUjFtQixJQUFJLEVBQ0osSUFDSixDQUFDO1VBQUEsR0FDTHpvQixrREFBSSxDQUFDMkUsS0FBSyxDQUNkLENBQ0osQ0FBQyxDQUFDNkcsR0FBRyxDQUFDLFVBQUE4akMsR0FBRztZQUFBLE9BQUF4bEMsYUFBQSxDQUFBQSxhQUFBLEtBQ0Z3bEMsR0FBRztjQUNOTjtZQUFZO1VBQUEsQ0FDZCxDQUNOLENBQUM7VUFFRCxJQUFNNVMsUUFBUSxHQUFHdmtCLHVEQUFPLENBQUMraUIsUUFBUSxFQUFFdVUsUUFBUSxDQUFDO1VBQzVDLElBQUksQ0FBQy9TLFFBQVEsRUFBRTtZQUNYO1VBQ0o7VUFDQSxJQUFNbVQsTUFBTSxHQUFHOWpDLGlEQUFJLENBQUMyd0IsUUFBUSxFQUFFZ1QsU0FBUyxDQUFDO1VBRXhDLElBQU05OUIsYUFBYSxHQUFHckQsa0RBQU0sQ0FDeEIsY0FBYyxFQUNkLENBQUNzaEMsTUFBTSxDQUFDaCtCLFNBQVMsRUFBRWcrQixNQUFNLENBQUNwekMsSUFBSSxDQUFDLEVBQzlCcUssTUFBTSxDQUFTeTFCLDJCQUNwQixDQUFDO1VBRUQsSUFBTXVULFdBQVcsR0FBRyxTQUFkQSxXQUFXQSxDQUNieGdDLFFBQWEsRUFDYjI2QixXQUFnQixFQUNoQjhGLGVBQXNCLEVBRXJCO1lBQUEsSUFERG5hLFVBQWUsR0FBQTV6QixTQUFBLENBQUFyQyxNQUFBLFFBQUFxQyxTQUFBLFFBQUFHLFNBQUEsR0FBQUgsU0FBQSxNQUFHLEtBQUs7WUFFdkIsSUFBTWd1QyxNQUFNLEdBQUc5aUMsUUFBUSxDQUFDLENBQUMsQ0FBQ3dOLEtBQUs7WUFDL0IsSUFBTUEsS0FBSyxHQUFHclcsNERBQVksQ0FDdEJpTCxRQUFRLEVBQ1J5Z0MsZUFBZSxFQUNmQyxNQUNKLENBQUM7WUFDRDdwQyxRQUFRLENBQUNoQyxrREFBUSxDQUFDdVcsS0FBSyxDQUFDLENBQUM7O1lBRXpCO1lBQ0F5MEIsa0JBQWtCLEdBQUdub0MsaURBQU0sQ0FDdkJtb0Msa0JBQWtCLEVBQ2xCOVosNEVBQWtCLENBQUNodkIsTUFBTSxFQUFFcVUsS0FBSyxFQUFFcEwsUUFBUSxFQUFFO2NBQ3hDMGpCLFNBQVMsRUFBRStjLGVBQWU7Y0FDMUJuYTtZQUNKLENBQUMsQ0FBQyxDQUFDOXBCLEdBQUcsQ0FBQyxVQUFBOGpDLEdBQUc7Y0FBQSxPQUFBeGxDLGFBQUEsQ0FBQUEsYUFBQSxLQUNId2xDLEdBQUc7Z0JBQ05OO2NBQVk7WUFBQSxDQUNkLENBQ04sQ0FBQzs7WUFFRDtZQUNBO1lBQ0FILGtCQUFrQixHQUFHbm9DLGlEQUFNLENBQ3ZCbW9DLGtCQUFrQixFQUNsQjlaLDRFQUFrQixDQUNkaHZCLE1BQU0sRUFDTjYwQixRQUFRLEVBQ1IrTyxXQUFXLEVBQ1g7Y0FDSW5YLHNCQUFzQixFQUFFLElBQUk7Y0FDNUJDLFFBQVEsRUFBRXJZLEtBQUs7Y0FDZnNZLFNBQVMsRUFBRStjLGVBQWU7Y0FDMUJuYTtZQUNKLENBQ0osQ0FBQyxDQUFDOXBCLEdBQUcsQ0FBQyxVQUFBOGpDLEdBQUc7Y0FBQSxPQUFBeGxDLGFBQUEsQ0FBQUEsYUFBQSxLQUNGd2xDLEdBQUc7Z0JBQ05OO2NBQVk7WUFBQSxDQUNkLENBQ04sQ0FBQztVQUNMLENBQUM7VUFFRCxJQUFJVyxVQUFVLEdBQUcsS0FBSztVQUV0QixDQUFDLFVBQVUsQ0FBQyxDQUNQanBDLE1BQU0sQ0FBQzRLLGFBQWEsQ0FBQyxDQUNyQmxVLE9BQU8sQ0FBQyxVQUFBNFQsWUFBWSxFQUFJO1lBQ3JCLElBQUkyK0IsVUFBVSxFQUFFO2NBQ1o7WUFDSjtZQUNBLElBQUkzK0IsWUFBWSxDQUFDak8sUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO2NBQzdCLElBQUFtNUIscUJBQUEsR0FBb0JsckIsWUFBWSxDQUMzQnRFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FDWGxCLEdBQUcsQ0FBQyxVQUFBM08sQ0FBQztrQkFBQSxPQUFJQSxDQUFDLENBQUM2UCxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUNuQixNQUFNLENBQUMsVUFBQWhSLENBQUM7b0JBQUEsT0FBSUEsQ0FBQztrQkFBQSxFQUFDO2dCQUFBLEVBQUM7Z0JBQUE0aEMsc0JBQUEsR0FBQXI2QixjQUFBLENBQUFvNkIscUJBQUE7Z0JBRm5DcnFCLFNBQVMsR0FBQXNxQixzQkFBQTtjQUloQixJQUFNeVQsUUFBMkIsR0FBR25rQyxpREFBSSxDQUNwQ29HLFNBQVMsRUFDVHc5QixZQUNKLENBQUM7Y0FFRCxJQUFJLENBQUNPLFFBQVEsRUFBRTtnQkFDWDtjQUNKOztjQUVBO2NBQ0FKLFdBQVcsQ0FBQTFsQyxhQUFBLENBQUFBLGFBQUEsS0FFQXlsQyxNQUFNO2dCQUNUNXFDLEtBQUssRUFBQW1GLGFBQUEsQ0FBQUEsYUFBQSxLQUNFeWxDLE1BQU0sQ0FBQzVxQyxLQUFLLEdBQ1owcUMsWUFBWTtjQUNsQixJQUVMRSxNQUFNLEVBQ05uVCxRQUFRLEVBQ1JwOEIsa0RBQUksQ0FBQ3F2QyxZQUFZLENBQ3JCLENBQUM7Y0FDRDtjQUNBTSxVQUFVLEdBQUcsSUFBSTtZQUNyQixDQUFDLE1BQU07Y0FDSCxJQUFNRSxnQkFBZ0IsR0FDbEI3K0IsWUFBWSxDQUFDdEUsS0FBSyxDQUFDLEdBQUcsQ0FBQztjQUMzQixJQUFNc0MsUUFBUSxHQUFHdkQsaURBQUksQ0FDakJva0MsZ0JBQWdCLEVBQ2hCUixZQUNKLENBQUM7Y0FDRCxJQUFJLENBQUNyZ0MsUUFBUSxFQUFFO2dCQUNYO2NBQ0o7Y0FFQSxJQUFNeWdDLGVBQWUsR0FBRy9vQyxpREFBTSxDQUMxQm1SLHVEQUFPLENBQUMraUIsUUFBUSxFQUFFdVUsUUFBUSxDQUFDLEVBQzNCLENBQUMsT0FBTyxDQUFDLENBQUN6b0MsTUFBTSxDQUFDbXBDLGdCQUFnQixDQUNyQyxDQUFDO2NBQ0QsSUFBTWxHLFdBQVcsR0FBR2wrQixpREFBSSxDQUNwQmdrQyxlQUFlLEVBQ2ZMLFNBQ0osQ0FBQztjQUVESSxXQUFXLENBQ1B4Z0MsUUFBUSxFQUNSMjZCLFdBQVcsRUFDWDhGLGVBQ0osQ0FBQztZQUNMO1VBQ0osQ0FBQyxDQUFDOztVQUVOO1VBQ0E7VUFDQTtVQUNBLElBQU1LLFVBQVUsR0FBR2hpQyxrREFBTSxDQUNyQixVQUFDOFMsQ0FBQyxFQUFFalAsQ0FBQztZQUFBLE9BQUssRUFBRUEsQ0FBQyxJQUFJaE4sS0FBSyxDQUFDO1VBQUEsR0FDdkIwcUMsWUFDSixDQUFDO1VBQ0QsSUFBSSxDQUFDcnNDLGtEQUFPLENBQUM4c0MsVUFBVSxDQUFDLEVBQUU7WUFDdEIsSUFBQUMsVUFBQSxHQUF1Q25qQyxRQUFRLENBQUMsQ0FBQztjQUFsQ29qQyxhQUFhLEdBQUFELFVBQUEsQ0FBckJocUMsTUFBTTtjQUFpQnFVLEtBQUssR0FBQTIxQixVQUFBLENBQUwzMUIsS0FBSztZQUVuQ3kwQixrQkFBa0IsR0FBR25vQyxpREFBTSxDQUN2Qm1vQyxrQkFBa0IsRUFDbEJoWiwwRUFBZ0IsQ0FDWjNtQixFQUFFLEVBQ0Y0Z0MsVUFBVSxFQUNWRSxhQUFhLEVBQ2I1MUIsS0FDSixDQUFDLENBQUM1TyxHQUFHLENBQUMsVUFBQThqQyxHQUFHO2NBQUEsT0FBQXhsQyxhQUFBLENBQUFBLGFBQUEsS0FDRndsQyxHQUFHO2dCQUNOTjtjQUFZO1lBQUEsQ0FDZCxDQUNOLENBQUM7VUFDTDtRQUNKLENBQ0osQ0FBQzs7UUFFRDtRQUNBO1FBQ0E7UUFDQUYsZUFBZSxDQUFDOXZDLElBQUksQ0FBQThLLGFBQUEsQ0FBQUEsYUFBQSxLQUNiaVIsRUFBRTtVQUNMazFCLGFBQWEsRUFBRTtZQUNYN2dDLFFBQVEsRUFBRTVELGtEQUFHLENBQ1R5YSxzRUFBZ0IsRUFDaEJoUCxpREFBTyxDQUFDOEQsRUFBRSxDQUFDa1gsVUFBVSxDQUFDcmxCLFFBQVEsQ0FBQyxDQUFDLENBQUN3TixLQUFLLENBQUMsQ0FDM0MsQ0FBQztZQUNEdTBCLFlBQVksRUFBRTEzQixpREFBTyxDQUNqQnpMLGtEQUFHLENBQ0MsVUFBQWdWLEtBQUE7Y0FBQSxJQUFBQyxLQUFBLEdBQUEzZSxjQUFBLENBQUEwZSxLQUFBO2dCQUFFdFIsRUFBRSxHQUFBdVIsS0FBQTtnQkFBRXpsQixLQUFLLEdBQUF5bEIsS0FBQTtjQUFBLE9BQ1BqVixrREFBRyxDQUNDLFVBQUFtUCxRQUFRO2dCQUFBLE9BQ0pzTCwwRUFBZ0IsQ0FBQztrQkFBQy9XLEVBQUU7a0JBQUV5TDtnQkFBUSxDQUFDLENBQUM7Y0FBQSxHQUNwQzNhLGtEQUFJLENBQUNoRixLQUFLLENBQ2QsQ0FBQztZQUFBLEdBQ0xvYyxrREFBTyxDQUFDc0ssSUFBSSxDQUNoQixDQUNKO1VBQ0o7UUFBQyxFQUNKLENBQUM7TUFDTjtNQUVBLElBQUlyZ0IsS0FBSyxLQUFLUSxTQUFTLEVBQUU7UUFDckIsSUFBTTZhLE9BQU8sR0FBR3hILE9BQU8sR0FDakIxSixrREFBRyxDQUFDeWEsc0VBQWdCLEVBQUVoUCxpREFBTyxDQUFDLENBQUMvQixPQUFPLENBQUN3SCxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM3QixJQUFJLENBQ2xELElBQ0osQ0FBQyxHQUNEdUUsTUFBTTtRQUNaLElBQUl0SyxPQUFPLDhCQUFBcE8sTUFBQSxDQUE4QmdXLE9BQU8sQ0FBRTtRQUNsRCxJQUFJRixtQkFBbUIsRUFBRTtVQUNyQixJQUFrQjB6QixFQUFFLEdBQ2hCMXpCLG1CQUFtQixDQURoQmpMLFNBQVM7WUFBcUJoUSxFQUFFLEdBQ25DaWIsbUJBQW1CLENBRERTLGFBQWE7VUFFbkNuSSxPQUFPLGdDQUFBcE8sTUFBQSxDQUFnQ3dwQyxFQUFFLE9BQUF4cEMsTUFBQSxDQUFJbkYsRUFBRSxDQUFFO1FBQ3JEO1FBRUFpUywwREFBZ0IsQ0FBQ25TLEtBQUssRUFBRXlULE9BQU8sRUFBRWpQLFFBQVEsQ0FBQztRQUUxQ2lwQyxlQUFlLENBQUM5dkMsSUFBSSxDQUFBOEssYUFBQSxDQUFBQSxhQUFBLEtBQ2JpUixFQUFFO1VBQ0xrMUIsYUFBYSxFQUFFO1lBQ1g3Z0MsUUFBUSxFQUFFNUQsa0RBQUcsQ0FDVHlhLHNFQUFnQixFQUNoQmhQLGlEQUFPLENBQUM4RCxFQUFFLENBQUNrWCxVQUFVLENBQUNybEIsUUFBUSxDQUFDLENBQUMsQ0FBQ3dOLEtBQUssQ0FBQyxDQUMzQyxDQUFDO1lBQ0R1MEIsWUFBWSxFQUFFO1VBQ2xCO1FBQUMsRUFDSixDQUFDO01BQ047SUFDSixDQUFDLENBQUM7SUFFRjlvQyxRQUFRLENBQ0pnVSxzRUFBa0IsQ0FBQyxDQUNmNDBCLFFBQVEsQ0FBQ3B2QyxNQUFNLEdBQUcwWiwyRUFBdUIsQ0FBQzAxQixRQUFRLENBQUMsR0FBRyxJQUFJLEVBQzFEQSxRQUFRLENBQUNwdkMsTUFBTSxHQUFHNFkseUVBQXFCLENBQUN3MkIsUUFBUSxDQUFDcHZDLE1BQU0sQ0FBQyxHQUFHLElBQUksRUFDL0R5dkMsZUFBZSxDQUFDenZDLE1BQU0sR0FDaEJzWixzRUFBa0IsQ0FBQ20yQixlQUFlLENBQUMsR0FDbkMsSUFBSSxFQUNWRCxrQkFBa0IsQ0FBQ3h2QyxNQUFNLEdBQ25Cb1oseUVBQXFCLENBQUNvMkIsa0JBQWtCLENBQUMsR0FDekMsSUFBSSxDQUNiLENBQ0wsQ0FBQztFQUNMLENBQUM7RUFDRGhqQyxNQUFNLEVBQUUsQ0FBQyxvQkFBb0I7QUFDakMsQ0FBQztBQUVELCtEQUFlRCxRQUFROzs7Ozs7Ozs7Ozs7Ozs7OzsrQ0MxVnZCLHFKQUFBdFIsbUJBQUEsWUFBQUEsb0JBQUEsV0FBQUMsQ0FBQSxTQUFBQyxDQUFBLEVBQUFELENBQUEsT0FBQUUsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLFNBQUEsRUFBQUMsQ0FBQSxHQUFBSCxDQUFBLENBQUFJLGNBQUEsRUFBQUMsQ0FBQSxHQUFBSixNQUFBLENBQUFLLGNBQUEsY0FBQVAsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsSUFBQUQsQ0FBQSxDQUFBRCxDQUFBLElBQUFFLENBQUEsQ0FBQU8sS0FBQSxLQUFBQyxDQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsQ0FBQSxHQUFBRixDQUFBLENBQUFHLFFBQUEsa0JBQUFDLENBQUEsR0FBQUosQ0FBQSxDQUFBSyxhQUFBLHVCQUFBQyxDQUFBLEdBQUFOLENBQUEsQ0FBQU8sV0FBQSw4QkFBQUMsT0FBQWpCLENBQUEsRUFBQUQsQ0FBQSxFQUFBRSxDQUFBLFdBQUFDLE1BQUEsQ0FBQUssY0FBQSxDQUFBUCxDQUFBLEVBQUFELENBQUEsSUFBQVMsS0FBQSxFQUFBUCxDQUFBLEVBQUFpQixVQUFBLE1BQUFDLFlBQUEsTUFBQUMsUUFBQSxTQUFBcEIsQ0FBQSxDQUFBRCxDQUFBLFdBQUFrQixNQUFBLG1CQUFBakIsQ0FBQSxJQUFBaUIsTUFBQSxZQUFBQSxPQUFBakIsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsV0FBQUQsQ0FBQSxDQUFBRCxDQUFBLElBQUFFLENBQUEsZ0JBQUFvQixLQUFBckIsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsRUFBQUcsQ0FBQSxRQUFBSyxDQUFBLEdBQUFWLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxTQUFBLFlBQUFtQixTQUFBLEdBQUF2QixDQUFBLEdBQUF1QixTQUFBLEVBQUFYLENBQUEsR0FBQVQsTUFBQSxDQUFBcUIsTUFBQSxDQUFBZCxDQUFBLENBQUFOLFNBQUEsR0FBQVUsQ0FBQSxPQUFBVyxPQUFBLENBQUFwQixDQUFBLGdCQUFBRSxDQUFBLENBQUFLLENBQUEsZUFBQUgsS0FBQSxFQUFBaUIsZ0JBQUEsQ0FBQXpCLENBQUEsRUFBQUMsQ0FBQSxFQUFBWSxDQUFBLE1BQUFGLENBQUEsYUFBQWUsU0FBQTFCLENBQUEsRUFBQUQsQ0FBQSxFQUFBRSxDQUFBLG1CQUFBMEIsSUFBQSxZQUFBQyxHQUFBLEVBQUE1QixDQUFBLENBQUE2QixJQUFBLENBQUE5QixDQUFBLEVBQUFFLENBQUEsY0FBQUQsQ0FBQSxhQUFBMkIsSUFBQSxXQUFBQyxHQUFBLEVBQUE1QixDQUFBLFFBQUFELENBQUEsQ0FBQXNCLElBQUEsR0FBQUEsSUFBQSxNQUFBUyxDQUFBLHFCQUFBQyxDQUFBLHFCQUFBQyxDQUFBLGdCQUFBQyxDQUFBLGdCQUFBQyxDQUFBLGdCQUFBWixVQUFBLGNBQUFhLGtCQUFBLGNBQUFDLDJCQUFBLFNBQUFDLENBQUEsT0FBQXBCLE1BQUEsQ0FBQW9CLENBQUEsRUFBQTFCLENBQUEscUNBQUEyQixDQUFBLEdBQUFwQyxNQUFBLENBQUFxQyxjQUFBLEVBQUFDLENBQUEsR0FBQUYsQ0FBQSxJQUFBQSxDQUFBLENBQUFBLENBQUEsQ0FBQUcsTUFBQSxRQUFBRCxDQUFBLElBQUFBLENBQUEsS0FBQXZDLENBQUEsSUFBQUcsQ0FBQSxDQUFBeUIsSUFBQSxDQUFBVyxDQUFBLEVBQUE3QixDQUFBLE1BQUEwQixDQUFBLEdBQUFHLENBQUEsT0FBQUUsQ0FBQSxHQUFBTiwwQkFBQSxDQUFBakMsU0FBQSxHQUFBbUIsU0FBQSxDQUFBbkIsU0FBQSxHQUFBRCxNQUFBLENBQUFxQixNQUFBLENBQUFjLENBQUEsWUFBQU0sc0JBQUEzQyxDQUFBLGdDQUFBNEMsT0FBQSxXQUFBN0MsQ0FBQSxJQUFBa0IsTUFBQSxDQUFBakIsQ0FBQSxFQUFBRCxDQUFBLFlBQUFDLENBQUEsZ0JBQUE2QyxPQUFBLENBQUE5QyxDQUFBLEVBQUFDLENBQUEsc0JBQUE4QyxjQUFBOUMsQ0FBQSxFQUFBRCxDQUFBLGFBQUFnRCxPQUFBOUMsQ0FBQSxFQUFBSyxDQUFBLEVBQUFHLENBQUEsRUFBQUUsQ0FBQSxRQUFBRSxDQUFBLEdBQUFhLFFBQUEsQ0FBQTFCLENBQUEsQ0FBQUMsQ0FBQSxHQUFBRCxDQUFBLEVBQUFNLENBQUEsbUJBQUFPLENBQUEsQ0FBQWMsSUFBQSxRQUFBWixDQUFBLEdBQUFGLENBQUEsQ0FBQWUsR0FBQSxFQUFBRSxDQUFBLEdBQUFmLENBQUEsQ0FBQVAsS0FBQSxTQUFBc0IsQ0FBQSx1QkFBQUEsQ0FBQSxJQUFBMUIsQ0FBQSxDQUFBeUIsSUFBQSxDQUFBQyxDQUFBLGVBQUEvQixDQUFBLENBQUFpRCxPQUFBLENBQUFsQixDQUFBLENBQUFtQixPQUFBLEVBQUFDLElBQUEsV0FBQWxELENBQUEsSUFBQStDLE1BQUEsU0FBQS9DLENBQUEsRUFBQVMsQ0FBQSxFQUFBRSxDQUFBLGdCQUFBWCxDQUFBLElBQUErQyxNQUFBLFVBQUEvQyxDQUFBLEVBQUFTLENBQUEsRUFBQUUsQ0FBQSxRQUFBWixDQUFBLENBQUFpRCxPQUFBLENBQUFsQixDQUFBLEVBQUFvQixJQUFBLFdBQUFsRCxDQUFBLElBQUFlLENBQUEsQ0FBQVAsS0FBQSxHQUFBUixDQUFBLEVBQUFTLENBQUEsQ0FBQU0sQ0FBQSxnQkFBQWYsQ0FBQSxXQUFBK0MsTUFBQSxVQUFBL0MsQ0FBQSxFQUFBUyxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxDQUFBRSxDQUFBLENBQUFlLEdBQUEsU0FBQTNCLENBQUEsRUFBQUssQ0FBQSxvQkFBQUUsS0FBQSxXQUFBQSxNQUFBUixDQUFBLEVBQUFJLENBQUEsYUFBQStDLDJCQUFBLGVBQUFwRCxDQUFBLFdBQUFBLENBQUEsRUFBQUUsQ0FBQSxJQUFBOEMsTUFBQSxDQUFBL0MsQ0FBQSxFQUFBSSxDQUFBLEVBQUFMLENBQUEsRUFBQUUsQ0FBQSxnQkFBQUEsQ0FBQSxHQUFBQSxDQUFBLEdBQUFBLENBQUEsQ0FBQWlELElBQUEsQ0FBQUMsMEJBQUEsRUFBQUEsMEJBQUEsSUFBQUEsMEJBQUEscUJBQUExQixpQkFBQTFCLENBQUEsRUFBQUUsQ0FBQSxFQUFBRyxDQUFBLFFBQUFFLENBQUEsR0FBQXdCLENBQUEsbUJBQUFyQixDQUFBLEVBQUFFLENBQUEsUUFBQUwsQ0FBQSxLQUFBMEIsQ0FBQSxZQUFBb0IsS0FBQSxzQ0FBQTlDLENBQUEsS0FBQTJCLENBQUEsb0JBQUF4QixDQUFBLFFBQUFFLENBQUEsV0FBQUgsS0FBQSxFQUFBUixDQUFBLEVBQUFxRCxJQUFBLGVBQUFqRCxDQUFBLENBQUFrRCxNQUFBLEdBQUE3QyxDQUFBLEVBQUFMLENBQUEsQ0FBQXdCLEdBQUEsR0FBQWpCLENBQUEsVUFBQUUsQ0FBQSxHQUFBVCxDQUFBLENBQUFtRCxRQUFBLE1BQUExQyxDQUFBLFFBQUFFLENBQUEsR0FBQXlDLG1CQUFBLENBQUEzQyxDQUFBLEVBQUFULENBQUEsT0FBQVcsQ0FBQSxRQUFBQSxDQUFBLEtBQUFtQixDQUFBLG1CQUFBbkIsQ0FBQSxxQkFBQVgsQ0FBQSxDQUFBa0QsTUFBQSxFQUFBbEQsQ0FBQSxDQUFBcUQsSUFBQSxHQUFBckQsQ0FBQSxDQUFBc0QsS0FBQSxHQUFBdEQsQ0FBQSxDQUFBd0IsR0FBQSxzQkFBQXhCLENBQUEsQ0FBQWtELE1BQUEsUUFBQWhELENBQUEsS0FBQXdCLENBQUEsUUFBQXhCLENBQUEsR0FBQTJCLENBQUEsRUFBQTdCLENBQUEsQ0FBQXdCLEdBQUEsRUFBQXhCLENBQUEsQ0FBQXVELGlCQUFBLENBQUF2RCxDQUFBLENBQUF3QixHQUFBLHVCQUFBeEIsQ0FBQSxDQUFBa0QsTUFBQSxJQUFBbEQsQ0FBQSxDQUFBd0QsTUFBQSxXQUFBeEQsQ0FBQSxDQUFBd0IsR0FBQSxHQUFBdEIsQ0FBQSxHQUFBMEIsQ0FBQSxNQUFBSyxDQUFBLEdBQUFYLFFBQUEsQ0FBQTNCLENBQUEsRUFBQUUsQ0FBQSxFQUFBRyxDQUFBLG9CQUFBaUMsQ0FBQSxDQUFBVixJQUFBLFFBQUFyQixDQUFBLEdBQUFGLENBQUEsQ0FBQWlELElBQUEsR0FBQXBCLENBQUEsR0FBQUYsQ0FBQSxFQUFBTSxDQUFBLENBQUFULEdBQUEsS0FBQU0sQ0FBQSxxQkFBQTFCLEtBQUEsRUFBQTZCLENBQUEsQ0FBQVQsR0FBQSxFQUFBeUIsSUFBQSxFQUFBakQsQ0FBQSxDQUFBaUQsSUFBQSxrQkFBQWhCLENBQUEsQ0FBQVYsSUFBQSxLQUFBckIsQ0FBQSxHQUFBMkIsQ0FBQSxFQUFBN0IsQ0FBQSxDQUFBa0QsTUFBQSxZQUFBbEQsQ0FBQSxDQUFBd0IsR0FBQSxHQUFBUyxDQUFBLENBQUFULEdBQUEsbUJBQUE0QixvQkFBQXpELENBQUEsRUFBQUUsQ0FBQSxRQUFBRyxDQUFBLEdBQUFILENBQUEsQ0FBQXFELE1BQUEsRUFBQWhELENBQUEsR0FBQVAsQ0FBQSxDQUFBYSxRQUFBLENBQUFSLENBQUEsT0FBQUUsQ0FBQSxLQUFBTixDQUFBLFNBQUFDLENBQUEsQ0FBQXNELFFBQUEscUJBQUFuRCxDQUFBLElBQUFMLENBQUEsQ0FBQWEsUUFBQSxDQUFBaUQsTUFBQSxLQUFBNUQsQ0FBQSxDQUFBcUQsTUFBQSxhQUFBckQsQ0FBQSxDQUFBMkIsR0FBQSxHQUFBNUIsQ0FBQSxFQUFBd0QsbUJBQUEsQ0FBQXpELENBQUEsRUFBQUUsQ0FBQSxlQUFBQSxDQUFBLENBQUFxRCxNQUFBLGtCQUFBbEQsQ0FBQSxLQUFBSCxDQUFBLENBQUFxRCxNQUFBLFlBQUFyRCxDQUFBLENBQUEyQixHQUFBLE9BQUFrQyxTQUFBLHVDQUFBMUQsQ0FBQSxpQkFBQThCLENBQUEsTUFBQXpCLENBQUEsR0FBQWlCLFFBQUEsQ0FBQXBCLENBQUEsRUFBQVAsQ0FBQSxDQUFBYSxRQUFBLEVBQUFYLENBQUEsQ0FBQTJCLEdBQUEsbUJBQUFuQixDQUFBLENBQUFrQixJQUFBLFNBQUExQixDQUFBLENBQUFxRCxNQUFBLFlBQUFyRCxDQUFBLENBQUEyQixHQUFBLEdBQUFuQixDQUFBLENBQUFtQixHQUFBLEVBQUEzQixDQUFBLENBQUFzRCxRQUFBLFNBQUFyQixDQUFBLE1BQUF2QixDQUFBLEdBQUFGLENBQUEsQ0FBQW1CLEdBQUEsU0FBQWpCLENBQUEsR0FBQUEsQ0FBQSxDQUFBMEMsSUFBQSxJQUFBcEQsQ0FBQSxDQUFBRixDQUFBLENBQUFnRSxVQUFBLElBQUFwRCxDQUFBLENBQUFILEtBQUEsRUFBQVAsQ0FBQSxDQUFBK0QsSUFBQSxHQUFBakUsQ0FBQSxDQUFBa0UsT0FBQSxlQUFBaEUsQ0FBQSxDQUFBcUQsTUFBQSxLQUFBckQsQ0FBQSxDQUFBcUQsTUFBQSxXQUFBckQsQ0FBQSxDQUFBMkIsR0FBQSxHQUFBNUIsQ0FBQSxHQUFBQyxDQUFBLENBQUFzRCxRQUFBLFNBQUFyQixDQUFBLElBQUF2QixDQUFBLElBQUFWLENBQUEsQ0FBQXFELE1BQUEsWUFBQXJELENBQUEsQ0FBQTJCLEdBQUEsT0FBQWtDLFNBQUEsc0NBQUE3RCxDQUFBLENBQUFzRCxRQUFBLFNBQUFyQixDQUFBLGNBQUFnQyxhQUFBbEUsQ0FBQSxRQUFBRCxDQUFBLEtBQUFvRSxNQUFBLEVBQUFuRSxDQUFBLFlBQUFBLENBQUEsS0FBQUQsQ0FBQSxDQUFBcUUsUUFBQSxHQUFBcEUsQ0FBQSxXQUFBQSxDQUFBLEtBQUFELENBQUEsQ0FBQXNFLFVBQUEsR0FBQXJFLENBQUEsS0FBQUQsQ0FBQSxDQUFBdUUsUUFBQSxHQUFBdEUsQ0FBQSxXQUFBdUUsVUFBQSxDQUFBQyxJQUFBLENBQUF6RSxDQUFBLGNBQUEwRSxjQUFBekUsQ0FBQSxRQUFBRCxDQUFBLEdBQUFDLENBQUEsQ0FBQTBFLFVBQUEsUUFBQTNFLENBQUEsQ0FBQTRCLElBQUEsb0JBQUE1QixDQUFBLENBQUE2QixHQUFBLEVBQUE1QixDQUFBLENBQUEwRSxVQUFBLEdBQUEzRSxDQUFBLGFBQUF5QixRQUFBeEIsQ0FBQSxTQUFBdUUsVUFBQSxNQUFBSixNQUFBLGFBQUFuRSxDQUFBLENBQUE0QyxPQUFBLENBQUFzQixZQUFBLGNBQUFTLEtBQUEsaUJBQUFsQyxPQUFBMUMsQ0FBQSxRQUFBQSxDQUFBLFdBQUFBLENBQUEsUUFBQUUsQ0FBQSxHQUFBRixDQUFBLENBQUFZLENBQUEsT0FBQVYsQ0FBQSxTQUFBQSxDQUFBLENBQUE0QixJQUFBLENBQUE5QixDQUFBLDRCQUFBQSxDQUFBLENBQUFpRSxJQUFBLFNBQUFqRSxDQUFBLE9BQUE2RSxLQUFBLENBQUE3RSxDQUFBLENBQUE4RSxNQUFBLFNBQUF2RSxDQUFBLE9BQUFHLENBQUEsWUFBQXVELEtBQUEsYUFBQTFELENBQUEsR0FBQVAsQ0FBQSxDQUFBOEUsTUFBQSxPQUFBekUsQ0FBQSxDQUFBeUIsSUFBQSxDQUFBOUIsQ0FBQSxFQUFBTyxDQUFBLFVBQUEwRCxJQUFBLENBQUF4RCxLQUFBLEdBQUFULENBQUEsQ0FBQU8sQ0FBQSxHQUFBMEQsSUFBQSxDQUFBWCxJQUFBLE9BQUFXLElBQUEsU0FBQUEsSUFBQSxDQUFBeEQsS0FBQSxHQUFBUixDQUFBLEVBQUFnRSxJQUFBLENBQUFYLElBQUEsT0FBQVcsSUFBQSxZQUFBdkQsQ0FBQSxDQUFBdUQsSUFBQSxHQUFBdkQsQ0FBQSxnQkFBQXFELFNBQUEsUUFBQS9ELENBQUEsaUNBQUFvQyxpQkFBQSxDQUFBaEMsU0FBQSxHQUFBaUMsMEJBQUEsRUFBQTlCLENBQUEsQ0FBQW9DLENBQUEsbUJBQUFsQyxLQUFBLEVBQUE0QiwwQkFBQSxFQUFBakIsWUFBQSxTQUFBYixDQUFBLENBQUE4QiwwQkFBQSxtQkFBQTVCLEtBQUEsRUFBQTJCLGlCQUFBLEVBQUFoQixZQUFBLFNBQUFnQixpQkFBQSxDQUFBMkMsV0FBQSxHQUFBN0QsTUFBQSxDQUFBbUIsMEJBQUEsRUFBQXJCLENBQUEsd0JBQUFoQixDQUFBLENBQUFnRixtQkFBQSxhQUFBL0UsQ0FBQSxRQUFBRCxDQUFBLHdCQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQWdGLFdBQUEsV0FBQWpGLENBQUEsS0FBQUEsQ0FBQSxLQUFBb0MsaUJBQUEsNkJBQUFwQyxDQUFBLENBQUErRSxXQUFBLElBQUEvRSxDQUFBLENBQUFrRixJQUFBLE9BQUFsRixDQUFBLENBQUFtRixJQUFBLGFBQUFsRixDQUFBLFdBQUFFLE1BQUEsQ0FBQWlGLGNBQUEsR0FBQWpGLE1BQUEsQ0FBQWlGLGNBQUEsQ0FBQW5GLENBQUEsRUFBQW9DLDBCQUFBLEtBQUFwQyxDQUFBLENBQUFvRixTQUFBLEdBQUFoRCwwQkFBQSxFQUFBbkIsTUFBQSxDQUFBakIsQ0FBQSxFQUFBZSxDQUFBLHlCQUFBZixDQUFBLENBQUFHLFNBQUEsR0FBQUQsTUFBQSxDQUFBcUIsTUFBQSxDQUFBbUIsQ0FBQSxHQUFBMUMsQ0FBQSxLQUFBRCxDQUFBLENBQUFzRixLQUFBLGFBQUFyRixDQUFBLGFBQUFpRCxPQUFBLEVBQUFqRCxDQUFBLE9BQUEyQyxxQkFBQSxDQUFBRyxhQUFBLENBQUEzQyxTQUFBLEdBQUFjLE1BQUEsQ0FBQTZCLGFBQUEsQ0FBQTNDLFNBQUEsRUFBQVUsQ0FBQSxpQ0FBQWQsQ0FBQSxDQUFBK0MsYUFBQSxHQUFBQSxhQUFBLEVBQUEvQyxDQUFBLENBQUF1RixLQUFBLGFBQUF0RixDQUFBLEVBQUFDLENBQUEsRUFBQUcsQ0FBQSxFQUFBRSxDQUFBLEVBQUFHLENBQUEsZUFBQUEsQ0FBQSxLQUFBQSxDQUFBLEdBQUE4RSxPQUFBLE9BQUE1RSxDQUFBLE9BQUFtQyxhQUFBLENBQUF6QixJQUFBLENBQUFyQixDQUFBLEVBQUFDLENBQUEsRUFBQUcsQ0FBQSxFQUFBRSxDQUFBLEdBQUFHLENBQUEsVUFBQVYsQ0FBQSxDQUFBZ0YsbUJBQUEsQ0FBQTlFLENBQUEsSUFBQVUsQ0FBQSxHQUFBQSxDQUFBLENBQUFxRCxJQUFBLEdBQUFkLElBQUEsV0FBQWxELENBQUEsV0FBQUEsQ0FBQSxDQUFBcUQsSUFBQSxHQUFBckQsQ0FBQSxDQUFBUSxLQUFBLEdBQUFHLENBQUEsQ0FBQXFELElBQUEsV0FBQXJCLHFCQUFBLENBQUFELENBQUEsR0FBQXpCLE1BQUEsQ0FBQXlCLENBQUEsRUFBQTNCLENBQUEsZ0JBQUFFLE1BQUEsQ0FBQXlCLENBQUEsRUFBQS9CLENBQUEsaUNBQUFNLE1BQUEsQ0FBQXlCLENBQUEsNkRBQUEzQyxDQUFBLENBQUF5RixJQUFBLGFBQUF4RixDQUFBLFFBQUFELENBQUEsR0FBQUcsTUFBQSxDQUFBRixDQUFBLEdBQUFDLENBQUEsZ0JBQUFHLENBQUEsSUFBQUwsQ0FBQSxFQUFBRSxDQUFBLENBQUF1RSxJQUFBLENBQUFwRSxDQUFBLFVBQUFILENBQUEsQ0FBQXdGLE9BQUEsYUFBQXpCLEtBQUEsV0FBQS9ELENBQUEsQ0FBQTRFLE1BQUEsU0FBQTdFLENBQUEsR0FBQUMsQ0FBQSxDQUFBeUYsR0FBQSxRQUFBMUYsQ0FBQSxJQUFBRCxDQUFBLFNBQUFpRSxJQUFBLENBQUF4RCxLQUFBLEdBQUFSLENBQUEsRUFBQWdFLElBQUEsQ0FBQVgsSUFBQSxPQUFBVyxJQUFBLFdBQUFBLElBQUEsQ0FBQVgsSUFBQSxPQUFBVyxJQUFBLFFBQUFqRSxDQUFBLENBQUEwQyxNQUFBLEdBQUFBLE1BQUEsRUFBQWpCLE9BQUEsQ0FBQXJCLFNBQUEsS0FBQTZFLFdBQUEsRUFBQXhELE9BQUEsRUFBQW1ELEtBQUEsV0FBQUEsTUFBQTVFLENBQUEsYUFBQTRGLElBQUEsV0FBQTNCLElBQUEsV0FBQVAsSUFBQSxRQUFBQyxLQUFBLEdBQUExRCxDQUFBLE9BQUFxRCxJQUFBLFlBQUFFLFFBQUEsY0FBQUQsTUFBQSxnQkFBQTFCLEdBQUEsR0FBQTVCLENBQUEsT0FBQXVFLFVBQUEsQ0FBQTNCLE9BQUEsQ0FBQTZCLGFBQUEsSUFBQTFFLENBQUEsV0FBQUUsQ0FBQSxrQkFBQUEsQ0FBQSxDQUFBMkYsTUFBQSxPQUFBeEYsQ0FBQSxDQUFBeUIsSUFBQSxPQUFBNUIsQ0FBQSxNQUFBMkUsS0FBQSxFQUFBM0UsQ0FBQSxDQUFBNEYsS0FBQSxjQUFBNUYsQ0FBQSxJQUFBRCxDQUFBLE1BQUE4RixJQUFBLFdBQUFBLEtBQUEsU0FBQXpDLElBQUEsV0FBQXJELENBQUEsUUFBQXVFLFVBQUEsSUFBQUcsVUFBQSxrQkFBQTFFLENBQUEsQ0FBQTJCLElBQUEsUUFBQTNCLENBQUEsQ0FBQTRCLEdBQUEsY0FBQW1FLElBQUEsS0FBQXBDLGlCQUFBLFdBQUFBLGtCQUFBNUQsQ0FBQSxhQUFBc0QsSUFBQSxRQUFBdEQsQ0FBQSxNQUFBRSxDQUFBLGtCQUFBK0YsT0FBQTVGLENBQUEsRUFBQUUsQ0FBQSxXQUFBSyxDQUFBLENBQUFnQixJQUFBLFlBQUFoQixDQUFBLENBQUFpQixHQUFBLEdBQUE3QixDQUFBLEVBQUFFLENBQUEsQ0FBQStELElBQUEsR0FBQTVELENBQUEsRUFBQUUsQ0FBQSxLQUFBTCxDQUFBLENBQUFxRCxNQUFBLFdBQUFyRCxDQUFBLENBQUEyQixHQUFBLEdBQUE1QixDQUFBLEtBQUFNLENBQUEsYUFBQUEsQ0FBQSxRQUFBaUUsVUFBQSxDQUFBTSxNQUFBLE1BQUF2RSxDQUFBLFNBQUFBLENBQUEsUUFBQUcsQ0FBQSxRQUFBOEQsVUFBQSxDQUFBakUsQ0FBQSxHQUFBSyxDQUFBLEdBQUFGLENBQUEsQ0FBQWlFLFVBQUEsaUJBQUFqRSxDQUFBLENBQUEwRCxNQUFBLFNBQUE2QixNQUFBLGFBQUF2RixDQUFBLENBQUEwRCxNQUFBLFNBQUF3QixJQUFBLFFBQUE5RSxDQUFBLEdBQUFULENBQUEsQ0FBQXlCLElBQUEsQ0FBQXBCLENBQUEsZUFBQU0sQ0FBQSxHQUFBWCxDQUFBLENBQUF5QixJQUFBLENBQUFwQixDQUFBLHFCQUFBSSxDQUFBLElBQUFFLENBQUEsYUFBQTRFLElBQUEsR0FBQWxGLENBQUEsQ0FBQTJELFFBQUEsU0FBQTRCLE1BQUEsQ0FBQXZGLENBQUEsQ0FBQTJELFFBQUEsZ0JBQUF1QixJQUFBLEdBQUFsRixDQUFBLENBQUE0RCxVQUFBLFNBQUEyQixNQUFBLENBQUF2RixDQUFBLENBQUE0RCxVQUFBLGNBQUF4RCxDQUFBLGFBQUE4RSxJQUFBLEdBQUFsRixDQUFBLENBQUEyRCxRQUFBLFNBQUE0QixNQUFBLENBQUF2RixDQUFBLENBQUEyRCxRQUFBLHFCQUFBckQsQ0FBQSxZQUFBcUMsS0FBQSxxREFBQXVDLElBQUEsR0FBQWxGLENBQUEsQ0FBQTRELFVBQUEsU0FBQTJCLE1BQUEsQ0FBQXZGLENBQUEsQ0FBQTRELFVBQUEsWUFBQVQsTUFBQSxXQUFBQSxPQUFBNUQsQ0FBQSxFQUFBRCxDQUFBLGFBQUFFLENBQUEsUUFBQXNFLFVBQUEsQ0FBQU0sTUFBQSxNQUFBNUUsQ0FBQSxTQUFBQSxDQUFBLFFBQUFLLENBQUEsUUFBQWlFLFVBQUEsQ0FBQXRFLENBQUEsT0FBQUssQ0FBQSxDQUFBNkQsTUFBQSxTQUFBd0IsSUFBQSxJQUFBdkYsQ0FBQSxDQUFBeUIsSUFBQSxDQUFBdkIsQ0FBQSx3QkFBQXFGLElBQUEsR0FBQXJGLENBQUEsQ0FBQStELFVBQUEsUUFBQTVELENBQUEsR0FBQUgsQ0FBQSxhQUFBRyxDQUFBLGlCQUFBVCxDQUFBLG1CQUFBQSxDQUFBLEtBQUFTLENBQUEsQ0FBQTBELE1BQUEsSUFBQXBFLENBQUEsSUFBQUEsQ0FBQSxJQUFBVSxDQUFBLENBQUE0RCxVQUFBLEtBQUE1RCxDQUFBLGNBQUFFLENBQUEsR0FBQUYsQ0FBQSxHQUFBQSxDQUFBLENBQUFpRSxVQUFBLGNBQUEvRCxDQUFBLENBQUFnQixJQUFBLEdBQUEzQixDQUFBLEVBQUFXLENBQUEsQ0FBQWlCLEdBQUEsR0FBQTdCLENBQUEsRUFBQVUsQ0FBQSxTQUFBNkMsTUFBQSxnQkFBQVUsSUFBQSxHQUFBdkQsQ0FBQSxDQUFBNEQsVUFBQSxFQUFBbkMsQ0FBQSxTQUFBK0QsUUFBQSxDQUFBdEYsQ0FBQSxNQUFBc0YsUUFBQSxXQUFBQSxTQUFBakcsQ0FBQSxFQUFBRCxDQUFBLG9CQUFBQyxDQUFBLENBQUEyQixJQUFBLFFBQUEzQixDQUFBLENBQUE0QixHQUFBLHFCQUFBNUIsQ0FBQSxDQUFBMkIsSUFBQSxtQkFBQTNCLENBQUEsQ0FBQTJCLElBQUEsUUFBQXFDLElBQUEsR0FBQWhFLENBQUEsQ0FBQTRCLEdBQUEsZ0JBQUE1QixDQUFBLENBQUEyQixJQUFBLFNBQUFvRSxJQUFBLFFBQUFuRSxHQUFBLEdBQUE1QixDQUFBLENBQUE0QixHQUFBLE9BQUEwQixNQUFBLGtCQUFBVSxJQUFBLHlCQUFBaEUsQ0FBQSxDQUFBMkIsSUFBQSxJQUFBNUIsQ0FBQSxVQUFBaUUsSUFBQSxHQUFBakUsQ0FBQSxHQUFBbUMsQ0FBQSxLQUFBZ0UsTUFBQSxXQUFBQSxPQUFBbEcsQ0FBQSxhQUFBRCxDQUFBLFFBQUF3RSxVQUFBLENBQUFNLE1BQUEsTUFBQTlFLENBQUEsU0FBQUEsQ0FBQSxRQUFBRSxDQUFBLFFBQUFzRSxVQUFBLENBQUF4RSxDQUFBLE9BQUFFLENBQUEsQ0FBQW9FLFVBQUEsS0FBQXJFLENBQUEsY0FBQWlHLFFBQUEsQ0FBQWhHLENBQUEsQ0FBQXlFLFVBQUEsRUFBQXpFLENBQUEsQ0FBQXFFLFFBQUEsR0FBQUcsYUFBQSxDQUFBeEUsQ0FBQSxHQUFBaUMsQ0FBQSxPQUFBaUUsS0FBQSxXQUFBQyxPQUFBcEcsQ0FBQSxhQUFBRCxDQUFBLFFBQUF3RSxVQUFBLENBQUFNLE1BQUEsTUFBQTlFLENBQUEsU0FBQUEsQ0FBQSxRQUFBRSxDQUFBLFFBQUFzRSxVQUFBLENBQUF4RSxDQUFBLE9BQUFFLENBQUEsQ0FBQWtFLE1BQUEsS0FBQW5FLENBQUEsUUFBQUksQ0FBQSxHQUFBSCxDQUFBLENBQUF5RSxVQUFBLGtCQUFBdEUsQ0FBQSxDQUFBdUIsSUFBQSxRQUFBckIsQ0FBQSxHQUFBRixDQUFBLENBQUF3QixHQUFBLEVBQUE2QyxhQUFBLENBQUF4RSxDQUFBLFlBQUFLLENBQUEsZ0JBQUE4QyxLQUFBLDhCQUFBaUQsYUFBQSxXQUFBQSxjQUFBdEcsQ0FBQSxFQUFBRSxDQUFBLEVBQUFHLENBQUEsZ0JBQUFtRCxRQUFBLEtBQUEzQyxRQUFBLEVBQUE2QixNQUFBLENBQUExQyxDQUFBLEdBQUFnRSxVQUFBLEVBQUE5RCxDQUFBLEVBQUFnRSxPQUFBLEVBQUE3RCxDQUFBLG9CQUFBa0QsTUFBQSxVQUFBMUIsR0FBQSxHQUFBNUIsQ0FBQSxHQUFBa0MsQ0FBQSxPQUFBbkMsQ0FBQTtBQUFBLFNBQUF5YixRQUFBemIsQ0FBQSxFQUFBRSxDQUFBLFFBQUFELENBQUEsR0FBQUUsTUFBQSxDQUFBc0YsSUFBQSxDQUFBekYsQ0FBQSxPQUFBRyxNQUFBLENBQUF1YixxQkFBQSxRQUFBbmIsQ0FBQSxHQUFBSixNQUFBLENBQUF1YixxQkFBQSxDQUFBMWIsQ0FBQSxHQUFBRSxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBeVEsTUFBQSxXQUFBOVEsQ0FBQSxXQUFBQyxNQUFBLENBQUF3Yix3QkFBQSxDQUFBM2IsQ0FBQSxFQUFBRSxDQUFBLEVBQUFpQixVQUFBLE9BQUFsQixDQUFBLENBQUF3RSxJQUFBLENBQUEyQyxLQUFBLENBQUFuSCxDQUFBLEVBQUFNLENBQUEsWUFBQU4sQ0FBQTtBQUFBLFNBQUFzUCxjQUFBdlAsQ0FBQSxhQUFBRSxDQUFBLE1BQUFBLENBQUEsR0FBQWlILFNBQUEsQ0FBQXJDLE1BQUEsRUFBQTVFLENBQUEsVUFBQUQsQ0FBQSxXQUFBa0gsU0FBQSxDQUFBakgsQ0FBQSxJQUFBaUgsU0FBQSxDQUFBakgsQ0FBQSxRQUFBQSxDQUFBLE9BQUF1YixPQUFBLENBQUF0YixNQUFBLENBQUFGLENBQUEsT0FBQTRDLE9BQUEsV0FBQTNDLENBQUEsSUFBQWtSLGVBQUEsQ0FBQXBSLENBQUEsRUFBQUUsQ0FBQSxFQUFBRCxDQUFBLENBQUFDLENBQUEsU0FBQUMsTUFBQSxDQUFBeWIseUJBQUEsR0FBQXpiLE1BQUEsQ0FBQTBiLGdCQUFBLENBQUE3YixDQUFBLEVBQUFHLE1BQUEsQ0FBQXliLHlCQUFBLENBQUEzYixDQUFBLEtBQUF3YixPQUFBLENBQUF0YixNQUFBLENBQUFGLENBQUEsR0FBQTRDLE9BQUEsV0FBQTNDLENBQUEsSUFBQUMsTUFBQSxDQUFBSyxjQUFBLENBQUFSLENBQUEsRUFBQUUsQ0FBQSxFQUFBQyxNQUFBLENBQUF3Yix3QkFBQSxDQUFBMWIsQ0FBQSxFQUFBQyxDQUFBLGlCQUFBRixDQUFBO0FBQUEsU0FBQW9SLGdCQUFBNEQsR0FBQSxFQUFBcE8sR0FBQSxFQUFBbkcsS0FBQSxJQUFBbUcsR0FBQSxHQUFBa1YsY0FBQSxDQUFBbFYsR0FBQSxPQUFBQSxHQUFBLElBQUFvTyxHQUFBLElBQUE3VSxNQUFBLENBQUFLLGNBQUEsQ0FBQXdVLEdBQUEsRUFBQXBPLEdBQUEsSUFBQW5HLEtBQUEsRUFBQUEsS0FBQSxFQUFBVSxVQUFBLFFBQUFDLFlBQUEsUUFBQUMsUUFBQSxvQkFBQTJULEdBQUEsQ0FBQXBPLEdBQUEsSUFBQW5HLEtBQUEsV0FBQXVVLEdBQUE7QUFBQSxTQUFBOEcsZUFBQWphLEdBQUEsUUFBQStFLEdBQUEsR0FBQW1WLFlBQUEsQ0FBQWxhLEdBQUEsMkJBQUErRSxHQUFBLGdCQUFBQSxHQUFBLEdBQUFvVixNQUFBLENBQUFwVixHQUFBO0FBQUEsU0FBQW1WLGFBQUFFLEtBQUEsRUFBQUMsSUFBQSxlQUFBRCxLQUFBLGlCQUFBQSxLQUFBLGtCQUFBQSxLQUFBLE1BQUFFLElBQUEsR0FBQUYsS0FBQSxDQUFBdGIsTUFBQSxDQUFBeWIsV0FBQSxPQUFBRCxJQUFBLEtBQUE3VSxTQUFBLFFBQUE0UyxHQUFBLEdBQUFpQyxJQUFBLENBQUFyYSxJQUFBLENBQUFtYSxLQUFBLEVBQUFDLElBQUEsMkJBQUFoQyxHQUFBLHNCQUFBQSxHQUFBLFlBQUFuVyxTQUFBLDREQUFBbVksSUFBQSxnQkFBQUYsTUFBQSxHQUFBSyxNQUFBLEVBQUFKLEtBQUE7QUFBQSxTQUFBMVYsbUJBQUFDLEdBQUEsRUFBQXZELE9BQUEsRUFBQXdELE1BQUEsRUFBQUMsS0FBQSxFQUFBQyxNQUFBLEVBQUFDLEdBQUEsRUFBQS9FLEdBQUEsY0FBQWdGLElBQUEsR0FBQUwsR0FBQSxDQUFBSSxHQUFBLEVBQUEvRSxHQUFBLE9BQUFwQixLQUFBLEdBQUFvRyxJQUFBLENBQUFwRyxLQUFBLFdBQUFxRyxLQUFBLElBQUFMLE1BQUEsQ0FBQUssS0FBQSxpQkFBQUQsSUFBQSxDQUFBdkQsSUFBQSxJQUFBTCxPQUFBLENBQUF4QyxLQUFBLFlBQUErRSxPQUFBLENBQUF2QyxPQUFBLENBQUF4QyxLQUFBLEVBQUEwQyxJQUFBLENBQUF1RCxLQUFBLEVBQUFDLE1BQUE7QUFBQSxTQUFBSSxrQkFBQUMsRUFBQSw2QkFBQUMsSUFBQSxTQUFBQyxJQUFBLEdBQUFDLFNBQUEsYUFBQTNCLE9BQUEsV0FBQXZDLE9BQUEsRUFBQXdELE1BQUEsUUFBQUQsR0FBQSxHQUFBUSxFQUFBLENBQUFJLEtBQUEsQ0FBQUgsSUFBQSxFQUFBQyxJQUFBLFlBQUFSLE1BQUFqRyxLQUFBLElBQUE4RixrQkFBQSxDQUFBQyxHQUFBLEVBQUF2RCxPQUFBLEVBQUF3RCxNQUFBLEVBQUFDLEtBQUEsRUFBQUMsTUFBQSxVQUFBbEcsS0FBQSxjQUFBa0csT0FBQVUsR0FBQSxJQUFBZCxrQkFBQSxDQUFBQyxHQUFBLEVBQUF2RCxPQUFBLEVBQUF3RCxNQUFBLEVBQUFDLEtBQUEsRUFBQUMsTUFBQSxXQUFBVSxHQUFBLEtBQUFYLEtBQUEsQ0FBQVksU0FBQTtBQUFBLFNBQUFDLGVBQUFDLEdBQUEsRUFBQTlHLENBQUEsV0FBQStHLGVBQUEsQ0FBQUQsR0FBQSxLQUFBRSxxQkFBQSxDQUFBRixHQUFBLEVBQUE5RyxDQUFBLEtBQUFpSCwyQkFBQSxDQUFBSCxHQUFBLEVBQUE5RyxDQUFBLEtBQUFrSCxnQkFBQTtBQUFBLFNBQUFBLGlCQUFBLGNBQUE3RCxTQUFBO0FBQUEsU0FBQTRELDRCQUFBcEgsQ0FBQSxFQUFBc0gsTUFBQSxTQUFBdEgsQ0FBQSxxQkFBQUEsQ0FBQSxzQkFBQXVILGlCQUFBLENBQUF2SCxDQUFBLEVBQUFzSCxNQUFBLE9BQUF4SCxDQUFBLEdBQUFGLE1BQUEsQ0FBQUMsU0FBQSxDQUFBMkgsUUFBQSxDQUFBakcsSUFBQSxDQUFBdkIsQ0FBQSxFQUFBdUYsS0FBQSxhQUFBekYsQ0FBQSxpQkFBQUUsQ0FBQSxDQUFBMEUsV0FBQSxFQUFBNUUsQ0FBQSxHQUFBRSxDQUFBLENBQUEwRSxXQUFBLENBQUFDLElBQUEsTUFBQTdFLENBQUEsY0FBQUEsQ0FBQSxtQkFBQTJILEtBQUEsQ0FBQUMsSUFBQSxDQUFBMUgsQ0FBQSxPQUFBRixDQUFBLCtEQUFBNkgsSUFBQSxDQUFBN0gsQ0FBQSxVQUFBeUgsaUJBQUEsQ0FBQXZILENBQUEsRUFBQXNILE1BQUE7QUFBQSxTQUFBQyxrQkFBQU4sR0FBQSxFQUFBVyxHQUFBLFFBQUFBLEdBQUEsWUFBQUEsR0FBQSxHQUFBWCxHQUFBLENBQUExQyxNQUFBLEVBQUFxRCxHQUFBLEdBQUFYLEdBQUEsQ0FBQTFDLE1BQUEsV0FBQXBFLENBQUEsTUFBQTBILElBQUEsT0FBQUosS0FBQSxDQUFBRyxHQUFBLEdBQUF6SCxDQUFBLEdBQUF5SCxHQUFBLEVBQUF6SCxDQUFBLElBQUEwSCxJQUFBLENBQUExSCxDQUFBLElBQUE4RyxHQUFBLENBQUE5RyxDQUFBLFVBQUEwSCxJQUFBO0FBQUEsU0FBQVYsc0JBQUF4SCxDQUFBLEVBQUE4QixDQUFBLFFBQUEvQixDQUFBLFdBQUFDLENBQUEsZ0NBQUFTLE1BQUEsSUFBQVQsQ0FBQSxDQUFBUyxNQUFBLENBQUFFLFFBQUEsS0FBQVgsQ0FBQSw0QkFBQUQsQ0FBQSxRQUFBRCxDQUFBLEVBQUFLLENBQUEsRUFBQUssQ0FBQSxFQUFBTSxDQUFBLEVBQUFKLENBQUEsT0FBQXFCLENBQUEsT0FBQTFCLENBQUEsaUJBQUFHLENBQUEsSUFBQVQsQ0FBQSxHQUFBQSxDQUFBLENBQUE2QixJQUFBLENBQUE1QixDQUFBLEdBQUErRCxJQUFBLFFBQUFqQyxDQUFBLFFBQUE3QixNQUFBLENBQUFGLENBQUEsTUFBQUEsQ0FBQSxVQUFBZ0MsQ0FBQSx1QkFBQUEsQ0FBQSxJQUFBakMsQ0FBQSxHQUFBVSxDQUFBLENBQUFvQixJQUFBLENBQUE3QixDQUFBLEdBQUFxRCxJQUFBLE1BQUExQyxDQUFBLENBQUE2RCxJQUFBLENBQUF6RSxDQUFBLENBQUFTLEtBQUEsR0FBQUcsQ0FBQSxDQUFBa0UsTUFBQSxLQUFBOUMsQ0FBQSxHQUFBQyxDQUFBLGlCQUFBL0IsQ0FBQSxJQUFBSyxDQUFBLE9BQUFGLENBQUEsR0FBQUgsQ0FBQSx5QkFBQStCLENBQUEsWUFBQWhDLENBQUEsQ0FBQTZELE1BQUEsS0FBQTlDLENBQUEsR0FBQWYsQ0FBQSxDQUFBNkQsTUFBQSxJQUFBM0QsTUFBQSxDQUFBYSxDQUFBLE1BQUFBLENBQUEsMkJBQUFULENBQUEsUUFBQUYsQ0FBQSxhQUFBTyxDQUFBO0FBQUEsU0FBQTZHLGdCQUFBRCxHQUFBLFFBQUFRLEtBQUEsQ0FBQUssT0FBQSxDQUFBYixHQUFBLFVBQUFBLEdBQUE7QUFENkM7QUFRZjtBQUlvQjtBQUVsRCxJQUFNNkosUUFBK0MsR0FBRztFQUNwREEsUUFBUSxFQUFFLFNBQUFBLFNBQUFoQixJQUFBLEVBQTBCO0lBQUEsSUFBeEIvRSxRQUFRLEdBQUErRSxJQUFBLENBQVIvRSxRQUFRO01BQUUrRyxRQUFRLEdBQUFoQyxJQUFBLENBQVJnQyxRQUFRO0lBQzFCLElBQUE0RCxTQUFBLEdBRUk1RCxRQUFRLENBQUMsQ0FBQztNQURFdWpDLFNBQVMsR0FBQTMvQixTQUFBLENBQXJCb1ksU0FBUyxDQUFHdW5CLFNBQVM7SUFHekIsSUFBQWpiLFVBQUEsR0FBbUN2QixpREFBUyxDQUN4QyxVQUFBNVksRUFBRTtRQUFBLE9BQUlBLEVBQUUsQ0FBQ3NJLGdCQUFnQixZQUFZdGpCLE9BQU87TUFBQSxHQUM1Q293QyxTQUNKLENBQUM7TUFBQWhiLFdBQUEsR0FBQXJ6QixjQUFBLENBQUFvekIsVUFBQTtNQUhNa2IsUUFBUSxHQUFBamIsV0FBQTtNQUFFa2IsY0FBYyxHQUFBbGIsV0FBQTtJQUsvQnR2QixRQUFRLENBQ0pnVSxzRUFBa0IsQ0FBQyxDQUNmczJCLFNBQVMsQ0FBQzl3QyxNQUFNLEdBQUc4Wiw0RUFBd0IsQ0FBQ2czQixTQUFTLENBQUMsR0FBRyxJQUFJLEVBQzdEQyxRQUFRLENBQUMvd0MsTUFBTSxHQUFHd1osdUVBQW1CLENBQUN1M0IsUUFBUSxDQUFDLEdBQUcsSUFBSSxFQUN0REMsY0FBYyxDQUFDaHhDLE1BQU0sR0FDZjhZLHdFQUFvQixDQUNoQms0QixjQUFjLENBQUM3a0MsR0FBRyxDQUFDLFVBQUF1UCxFQUFFO01BQUEsT0FDakIxTixpREFBSyxDQUNELGlCQUFpQixFQUNqQjBOLEVBQUUsQ0FBQ3NJLGdCQUFnQixFQUNuQnRJLEVBQ0osQ0FBQztJQUFBLENBQ0wsQ0FDSixDQUFDLEdBQ0QsSUFBSSxDQUNiLENBQ0wsQ0FBQztJQUVEcTFCLFFBQVEsQ0FBQ2h6QyxPQUFPO01BQUEsSUFBQW1pQixLQUFBLEdBQUFqZSxpQkFBQSxlQUFBaEgsbUJBQUEsR0FBQW9GLElBQUEsQ0FBQyxTQUFBeUcsUUFBTTRVLEVBQUU7UUFBQSxJQUFBK0IsTUFBQSxFQUFBdWEsVUFBQSxFQUFBaVosT0FBQSxFQUFBMXJDLFlBQUEsRUFBQWdGLGlCQUFBLEVBQUEybUMsU0FBQTtRQUFBLE9BQUFqMkMsbUJBQUEsR0FBQXVCLElBQUEsVUFBQXVLLFNBQUFDLFFBQUE7VUFBQSxrQkFBQUEsUUFBQSxDQUFBbEcsSUFBQSxHQUFBa0csUUFBQSxDQUFBN0gsSUFBQTtZQUFBO2NBQUE2SCxRQUFBLENBQUE3SCxJQUFBO2NBQUEsT0FDQXVjLEVBQUUsQ0FBQ3NJLGdCQUFnQjtZQUFBO2NBQWxDdkcsTUFBTSxHQUFBelcsUUFBQSxDQUFBcEksSUFBQTtjQUFBbzVCLFVBQUEsR0FNUnpxQixRQUFRLENBQUMsQ0FBQyxFQUhFMGpDLE9BQU8sR0FBQWpaLFVBQUEsQ0FBbkJ6TyxTQUFTLENBQUcwbkIsT0FBTyxFQUNuQjFyQyxZQUFZLEdBQUF5eUIsVUFBQSxDQUFaenlCLFlBQVksRUFDSmdGLGlCQUFpQixHQUFBeXRCLFVBQUEsQ0FBekIxdkIsS0FBSyxDQUFHaUMsaUJBQWlCO2NBQUEsTUFHekJoRixZQUFZLEtBQUtSLGdFQUFXLENBQUMsVUFBVSxDQUFDO2dCQUFBaUMsUUFBQSxDQUFBN0gsSUFBQTtnQkFBQTtjQUFBO2NBQUEsT0FBQTZILFFBQUEsQ0FBQWpJLE1BQUE7WUFBQTtjQUk1QyxJQUFJd0wsaUJBQWlCLEVBQUU7Z0JBQ25CQSxpQkFBaUIsQ0FBQ21SLEVBQUUsQ0FBQ2tJLFFBQVEsRUFBRW5HLE1BQU0sQ0FBQztjQUMxQzs7Y0FFQTtjQUNBO2NBQ015ekIsU0FBUyxHQUFHL1YsaURBQUksQ0FDbEIsVUFBQWdXLEdBQUc7Z0JBQUEsT0FDQ0EsR0FBRyxLQUFLejFCLEVBQUUsSUFBSXkxQixHQUFHLENBQUNudEIsZ0JBQWdCLEtBQUt0SSxFQUFFLENBQUNzSSxnQkFBZ0I7Y0FBQSxHQUM5RGl0QixPQUNKLENBQUM7Y0FBQSxJQUNJQyxTQUFTO2dCQUFBbHFDLFFBQUEsQ0FBQTdILElBQUE7Z0JBQUE7Y0FBQTtjQUFBLE9BQUE2SCxRQUFBLENBQUFqSSxNQUFBO1lBQUE7Y0FJZDtjQUNBeUgsUUFBUSxDQUNKZ1Usc0VBQWtCLENBQUMsQ0FDZkYsMEVBQXNCLENBQUMsQ0FBQzQyQixTQUFTLENBQUMsQ0FBQyxFQUNuQ3A0Qix3RUFBb0IsQ0FBQyxDQUFBck8sYUFBQSxDQUFBQSxhQUFBLEtBRVZ5bUMsU0FBUztnQkFDWnRCLGVBQWUsRUFBRW55QjtjQUFNLEdBRTlCLENBQUMsQ0FDTCxDQUNMLENBQUM7WUFBQztZQUFBO2NBQUEsT0FBQXpXLFFBQUEsQ0FBQS9GLElBQUE7VUFBQTtRQUFBLEdBQUE2RixPQUFBO01BQUEsQ0FDTDtNQUFBLGlCQUFBMlAsRUFBQTtRQUFBLE9BQUF5SixLQUFBLENBQUE1ZCxLQUFBLE9BQUFELFNBQUE7TUFBQTtJQUFBLElBQUM7RUFDTixDQUFDO0VBQ0RtSyxNQUFNLEVBQUUsQ0FBQyxxQkFBcUI7QUFDbEMsQ0FBQztBQUVELCtEQUFlRCxRQUFROzs7Ozs7Ozs7Ozs7OztBQ3RGZ0M7QUFDTDtBQUVsRCxJQUFNQSxRQUErQyxHQUFHO0VBQ3BEQSxRQUFRLEVBQUUsU0FBQUEsU0FBQWhCLElBQUEsRUFBMEI7SUFBQSxJQUF4Qi9FLFFBQVEsR0FBQStFLElBQUEsQ0FBUi9FLFFBQVE7TUFBRStHLFFBQVEsR0FBQWhDLElBQUEsQ0FBUmdDLFFBQVE7SUFDMUIsSUFBQTRELFNBQUEsR0FBK0I1RCxRQUFRLENBQUMsQ0FBQztNQUFsQ2djLFNBQVMsR0FBQXBZLFNBQUEsQ0FBVG9ZLFNBQVM7TUFBRTRVLFNBQVMsR0FBQWh0QixTQUFBLENBQVRndEIsU0FBUztJQUUzQixJQUFNa1QsZ0JBQWdCLEdBQUdELHFFQUFtQixDQUFDN25CLFNBQVMsQ0FBQztJQUV2RCxJQUFNcHFCLElBQUksR0FBR2d0QyxPQUFPLENBQUNrRixnQkFBZ0IsQ0FBQ3J4QyxNQUFNLENBQUM7SUFFN0MsSUFBSW0rQixTQUFTLEtBQUtoL0IsSUFBSSxFQUFFO01BQ3BCcUgsUUFBUSxDQUFDc3lCLGdFQUFZLENBQUMzNUIsSUFBSSxDQUFDLENBQUM7SUFDaEM7RUFDSixDQUFDO0VBQ0RxTixNQUFNLEVBQUUsQ0FBQyxXQUFXO0FBQ3hCLENBQUM7QUFFRCwrREFBZUQsUUFBUTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcEJxQztBQUVSO0FBS3BELElBQU1BLFFBQStDLEdBQUc7RUFDcERBLFFBQVEsRUFBRSxTQUFBQSxTQUFBaEIsSUFBQSxFQUEwQjtJQUFBLElBQXhCL0UsUUFBUSxHQUFBK0UsSUFBQSxDQUFSL0UsUUFBUTtNQUFFK0csUUFBUSxHQUFBaEMsSUFBQSxDQUFSZ0MsUUFBUTtJQUMxQixJQUFBNEQsU0FBQSxHQUlJNUQsUUFBUSxDQUFDLENBQUM7TUFBQStqQyxtQkFBQSxHQUFBbmdDLFNBQUEsQ0FIVm9ZLFNBQVM7TUFBR3VuQixTQUFTLEdBQUFRLG1CQUFBLENBQVRSLFNBQVM7TUFBRUcsT0FBTyxHQUFBSyxtQkFBQSxDQUFQTCxPQUFPO01BQUU3QixRQUFRLEdBQUFrQyxtQkFBQSxDQUFSbEMsUUFBUTtNQUN4Q3hwQyxVQUFVLEdBQUF1TCxTQUFBLENBQVZ2TCxVQUFVO01BQ1ZtVixLQUFLLEdBQUE1SixTQUFBLENBQUw0SixLQUFLOztJQUdUO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7SUFHUSxJQUFNdzJCLFlBQXVDLEdBQUczNUIsaURBQU8sQ0FDbkR6TCxpREFBRyxDQUNDLFVBQUF1UCxFQUFFO01BQUEsT0FBSUEsRUFBRSxDQUFDa1gsVUFBVSxDQUFDN1gsS0FBSyxDQUFDO0lBQUEsTUFBQTFULE1BQUEsQ0FBQTJJLGtCQUFBLENBQ3RCOGdDLFNBQVMsR0FBQTlnQyxrQkFBQSxDQUFLaWhDLE9BQU8sR0FBQWpoQyxrQkFBQSxDQUFLby9CLFFBQVEsRUFDMUMsQ0FDSixDQUFDO0lBRUQsSUFBTW9DLE9BQVksR0FBRzd0QyxpREFBTyxDQUFDNHRDLFlBQVksQ0FBQyxHQUNwQyxJQUFJLEdBQ0poZCxpREFBTSxDQUNGLFVBQUNuZixHQUFHLEVBQUE4SyxLQUFBLEVBQTJCO01BQUEsSUFBeEJyUSxFQUFFLEdBQUFxUSxLQUFBLENBQUZyUSxFQUFFO1FBQUV5TCxRQUFRLEdBQUE0RSxLQUFBLENBQVI1RSxRQUFRO1FBQUVsUCxJQUFJLEdBQUE4VCxLQUFBLENBQUo5VCxJQUFJO01BQ3JCLElBQUlzc0IsTUFBTSxHQUFHdGpCLEdBQUc7TUFDaEIsSUFBTXE4QixNQUFNLEdBQUc7UUFBQzVoQyxFQUFFO1FBQUV5TDtNQUFRLENBQUM7O01BRTdCO01BQ0FvZCxNQUFNLENBQUNnWix3QkFBd0IsR0FDM0JoWixNQUFNLENBQUNnWix3QkFBd0IsSUFBSSxFQUFFO01BQ3pDaFosTUFBTSxDQUFDZ1osd0JBQXdCLENBQUMveEMsSUFBSSxDQUFDOHhDLE1BQU0sQ0FBQztNQUU1Q3JsQyxJQUFJLENBQUNyTyxPQUFPLENBQUMsVUFBQ1AsQ0FBQyxFQUFFNUIsQ0FBQyxFQUFLO1FBQUEsSUFBQSsxQyxTQUFBO1FBQ25CalosTUFBTSxHQUFHQSxNQUFNLENBQUNsN0IsQ0FBQyxDQUFDLElBQUFtMEMsU0FBQSxHQUNkalosTUFBTSxDQUFDbDdCLENBQUMsQ0FBQyxjQUFBbTBDLFNBQUEsY0FBQUEsU0FBQSxHQUNSbjBDLENBQUMsS0FBSyxVQUFVLElBQ2pCLE9BQU80TyxJQUFJLENBQUN4USxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssUUFBUSxHQUN6QixFQUFFLEdBQ0YsQ0FBQyxDQUFFO1FBRWI4OEIsTUFBTSxDQUFDZ1osd0JBQXdCLEdBQzNCaFosTUFBTSxDQUFDZ1osd0JBQXdCLElBQUksRUFBRTtRQUN6Q2haLE1BQU0sQ0FBQ2daLHdCQUF3QixDQUFDL3hDLElBQUksQ0FBQzh4QyxNQUFNLENBQUM7TUFDaEQsQ0FBQyxDQUFDOztNQUVGO01BQ0EvWSxNQUFNLENBQUNrWix1QkFBdUIsR0FDMUJsWixNQUFNLENBQUNrWix1QkFBdUIsSUFBSUgsTUFBTTtNQUU1QyxPQUFPcjhCLEdBQUc7SUFDZCxDQUFDLEVBQ0QsQ0FBQyxDQUFDLEVBQ0ZtOEIsWUFDSixDQUFDO0lBRVAsSUFBSSxDQUFDcGpDLGlEQUFNLENBQUNxakMsT0FBTyxFQUFFNXJDLFVBQVUsQ0FBQyxFQUFFO01BQzlCWSxRQUFRLENBQUN5eUIsa0VBQWEsQ0FBQ3VZLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDO0VBQ0osQ0FBQztFQUNEaGxDLE1BQU0sRUFBRSxDQUFDLHFCQUFxQixFQUFFLG1CQUFtQixFQUFFLG9CQUFvQjtBQUM3RSxDQUFDO0FBRUQsK0RBQWVELFFBQVE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrQ0N2RXZCLHFKQUFBdFIsbUJBQUEsWUFBQUEsb0JBQUEsV0FBQUMsQ0FBQSxTQUFBQyxDQUFBLEVBQUFELENBQUEsT0FBQUUsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLFNBQUEsRUFBQUMsQ0FBQSxHQUFBSCxDQUFBLENBQUFJLGNBQUEsRUFBQUMsQ0FBQSxHQUFBSixNQUFBLENBQUFLLGNBQUEsY0FBQVAsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsSUFBQUQsQ0FBQSxDQUFBRCxDQUFBLElBQUFFLENBQUEsQ0FBQU8sS0FBQSxLQUFBQyxDQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsQ0FBQSxHQUFBRixDQUFBLENBQUFHLFFBQUEsa0JBQUFDLENBQUEsR0FBQUosQ0FBQSxDQUFBSyxhQUFBLHVCQUFBQyxDQUFBLEdBQUFOLENBQUEsQ0FBQU8sV0FBQSw4QkFBQUMsT0FBQWpCLENBQUEsRUFBQUQsQ0FBQSxFQUFBRSxDQUFBLFdBQUFDLE1BQUEsQ0FBQUssY0FBQSxDQUFBUCxDQUFBLEVBQUFELENBQUEsSUFBQVMsS0FBQSxFQUFBUCxDQUFBLEVBQUFpQixVQUFBLE1BQUFDLFlBQUEsTUFBQUMsUUFBQSxTQUFBcEIsQ0FBQSxDQUFBRCxDQUFBLFdBQUFrQixNQUFBLG1CQUFBakIsQ0FBQSxJQUFBaUIsTUFBQSxZQUFBQSxPQUFBakIsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsV0FBQUQsQ0FBQSxDQUFBRCxDQUFBLElBQUFFLENBQUEsZ0JBQUFvQixLQUFBckIsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsRUFBQUcsQ0FBQSxRQUFBSyxDQUFBLEdBQUFWLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxTQUFBLFlBQUFtQixTQUFBLEdBQUF2QixDQUFBLEdBQUF1QixTQUFBLEVBQUFYLENBQUEsR0FBQVQsTUFBQSxDQUFBcUIsTUFBQSxDQUFBZCxDQUFBLENBQUFOLFNBQUEsR0FBQVUsQ0FBQSxPQUFBVyxPQUFBLENBQUFwQixDQUFBLGdCQUFBRSxDQUFBLENBQUFLLENBQUEsZUFBQUgsS0FBQSxFQUFBaUIsZ0JBQUEsQ0FBQXpCLENBQUEsRUFBQUMsQ0FBQSxFQUFBWSxDQUFBLE1BQUFGLENBQUEsYUFBQWUsU0FBQTFCLENBQUEsRUFBQUQsQ0FBQSxFQUFBRSxDQUFBLG1CQUFBMEIsSUFBQSxZQUFBQyxHQUFBLEVBQUE1QixDQUFBLENBQUE2QixJQUFBLENBQUE5QixDQUFBLEVBQUFFLENBQUEsY0FBQUQsQ0FBQSxhQUFBMkIsSUFBQSxXQUFBQyxHQUFBLEVBQUE1QixDQUFBLFFBQUFELENBQUEsQ0FBQXNCLElBQUEsR0FBQUEsSUFBQSxNQUFBUyxDQUFBLHFCQUFBQyxDQUFBLHFCQUFBQyxDQUFBLGdCQUFBQyxDQUFBLGdCQUFBQyxDQUFBLGdCQUFBWixVQUFBLGNBQUFhLGtCQUFBLGNBQUFDLDJCQUFBLFNBQUFDLENBQUEsT0FBQXBCLE1BQUEsQ0FBQW9CLENBQUEsRUFBQTFCLENBQUEscUNBQUEyQixDQUFBLEdBQUFwQyxNQUFBLENBQUFxQyxjQUFBLEVBQUFDLENBQUEsR0FBQUYsQ0FBQSxJQUFBQSxDQUFBLENBQUFBLENBQUEsQ0FBQUcsTUFBQSxRQUFBRCxDQUFBLElBQUFBLENBQUEsS0FBQXZDLENBQUEsSUFBQUcsQ0FBQSxDQUFBeUIsSUFBQSxDQUFBVyxDQUFBLEVBQUE3QixDQUFBLE1BQUEwQixDQUFBLEdBQUFHLENBQUEsT0FBQUUsQ0FBQSxHQUFBTiwwQkFBQSxDQUFBakMsU0FBQSxHQUFBbUIsU0FBQSxDQUFBbkIsU0FBQSxHQUFBRCxNQUFBLENBQUFxQixNQUFBLENBQUFjLENBQUEsWUFBQU0sc0JBQUEzQyxDQUFBLGdDQUFBNEMsT0FBQSxXQUFBN0MsQ0FBQSxJQUFBa0IsTUFBQSxDQUFBakIsQ0FBQSxFQUFBRCxDQUFBLFlBQUFDLENBQUEsZ0JBQUE2QyxPQUFBLENBQUE5QyxDQUFBLEVBQUFDLENBQUEsc0JBQUE4QyxjQUFBOUMsQ0FBQSxFQUFBRCxDQUFBLGFBQUFnRCxPQUFBOUMsQ0FBQSxFQUFBSyxDQUFBLEVBQUFHLENBQUEsRUFBQUUsQ0FBQSxRQUFBRSxDQUFBLEdBQUFhLFFBQUEsQ0FBQTFCLENBQUEsQ0FBQUMsQ0FBQSxHQUFBRCxDQUFBLEVBQUFNLENBQUEsbUJBQUFPLENBQUEsQ0FBQWMsSUFBQSxRQUFBWixDQUFBLEdBQUFGLENBQUEsQ0FBQWUsR0FBQSxFQUFBRSxDQUFBLEdBQUFmLENBQUEsQ0FBQVAsS0FBQSxTQUFBc0IsQ0FBQSx1QkFBQUEsQ0FBQSxJQUFBMUIsQ0FBQSxDQUFBeUIsSUFBQSxDQUFBQyxDQUFBLGVBQUEvQixDQUFBLENBQUFpRCxPQUFBLENBQUFsQixDQUFBLENBQUFtQixPQUFBLEVBQUFDLElBQUEsV0FBQWxELENBQUEsSUFBQStDLE1BQUEsU0FBQS9DLENBQUEsRUFBQVMsQ0FBQSxFQUFBRSxDQUFBLGdCQUFBWCxDQUFBLElBQUErQyxNQUFBLFVBQUEvQyxDQUFBLEVBQUFTLENBQUEsRUFBQUUsQ0FBQSxRQUFBWixDQUFBLENBQUFpRCxPQUFBLENBQUFsQixDQUFBLEVBQUFvQixJQUFBLFdBQUFsRCxDQUFBLElBQUFlLENBQUEsQ0FBQVAsS0FBQSxHQUFBUixDQUFBLEVBQUFTLENBQUEsQ0FBQU0sQ0FBQSxnQkFBQWYsQ0FBQSxXQUFBK0MsTUFBQSxVQUFBL0MsQ0FBQSxFQUFBUyxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxDQUFBRSxDQUFBLENBQUFlLEdBQUEsU0FBQTNCLENBQUEsRUFBQUssQ0FBQSxvQkFBQUUsS0FBQSxXQUFBQSxNQUFBUixDQUFBLEVBQUFJLENBQUEsYUFBQStDLDJCQUFBLGVBQUFwRCxDQUFBLFdBQUFBLENBQUEsRUFBQUUsQ0FBQSxJQUFBOEMsTUFBQSxDQUFBL0MsQ0FBQSxFQUFBSSxDQUFBLEVBQUFMLENBQUEsRUFBQUUsQ0FBQSxnQkFBQUEsQ0FBQSxHQUFBQSxDQUFBLEdBQUFBLENBQUEsQ0FBQWlELElBQUEsQ0FBQUMsMEJBQUEsRUFBQUEsMEJBQUEsSUFBQUEsMEJBQUEscUJBQUExQixpQkFBQTFCLENBQUEsRUFBQUUsQ0FBQSxFQUFBRyxDQUFBLFFBQUFFLENBQUEsR0FBQXdCLENBQUEsbUJBQUFyQixDQUFBLEVBQUFFLENBQUEsUUFBQUwsQ0FBQSxLQUFBMEIsQ0FBQSxZQUFBb0IsS0FBQSxzQ0FBQTlDLENBQUEsS0FBQTJCLENBQUEsb0JBQUF4QixDQUFBLFFBQUFFLENBQUEsV0FBQUgsS0FBQSxFQUFBUixDQUFBLEVBQUFxRCxJQUFBLGVBQUFqRCxDQUFBLENBQUFrRCxNQUFBLEdBQUE3QyxDQUFBLEVBQUFMLENBQUEsQ0FBQXdCLEdBQUEsR0FBQWpCLENBQUEsVUFBQUUsQ0FBQSxHQUFBVCxDQUFBLENBQUFtRCxRQUFBLE1BQUExQyxDQUFBLFFBQUFFLENBQUEsR0FBQXlDLG1CQUFBLENBQUEzQyxDQUFBLEVBQUFULENBQUEsT0FBQVcsQ0FBQSxRQUFBQSxDQUFBLEtBQUFtQixDQUFBLG1CQUFBbkIsQ0FBQSxxQkFBQVgsQ0FBQSxDQUFBa0QsTUFBQSxFQUFBbEQsQ0FBQSxDQUFBcUQsSUFBQSxHQUFBckQsQ0FBQSxDQUFBc0QsS0FBQSxHQUFBdEQsQ0FBQSxDQUFBd0IsR0FBQSxzQkFBQXhCLENBQUEsQ0FBQWtELE1BQUEsUUFBQWhELENBQUEsS0FBQXdCLENBQUEsUUFBQXhCLENBQUEsR0FBQTJCLENBQUEsRUFBQTdCLENBQUEsQ0FBQXdCLEdBQUEsRUFBQXhCLENBQUEsQ0FBQXVELGlCQUFBLENBQUF2RCxDQUFBLENBQUF3QixHQUFBLHVCQUFBeEIsQ0FBQSxDQUFBa0QsTUFBQSxJQUFBbEQsQ0FBQSxDQUFBd0QsTUFBQSxXQUFBeEQsQ0FBQSxDQUFBd0IsR0FBQSxHQUFBdEIsQ0FBQSxHQUFBMEIsQ0FBQSxNQUFBSyxDQUFBLEdBQUFYLFFBQUEsQ0FBQTNCLENBQUEsRUFBQUUsQ0FBQSxFQUFBRyxDQUFBLG9CQUFBaUMsQ0FBQSxDQUFBVixJQUFBLFFBQUFyQixDQUFBLEdBQUFGLENBQUEsQ0FBQWlELElBQUEsR0FBQXBCLENBQUEsR0FBQUYsQ0FBQSxFQUFBTSxDQUFBLENBQUFULEdBQUEsS0FBQU0sQ0FBQSxxQkFBQTFCLEtBQUEsRUFBQTZCLENBQUEsQ0FBQVQsR0FBQSxFQUFBeUIsSUFBQSxFQUFBakQsQ0FBQSxDQUFBaUQsSUFBQSxrQkFBQWhCLENBQUEsQ0FBQVYsSUFBQSxLQUFBckIsQ0FBQSxHQUFBMkIsQ0FBQSxFQUFBN0IsQ0FBQSxDQUFBa0QsTUFBQSxZQUFBbEQsQ0FBQSxDQUFBd0IsR0FBQSxHQUFBUyxDQUFBLENBQUFULEdBQUEsbUJBQUE0QixvQkFBQXpELENBQUEsRUFBQUUsQ0FBQSxRQUFBRyxDQUFBLEdBQUFILENBQUEsQ0FBQXFELE1BQUEsRUFBQWhELENBQUEsR0FBQVAsQ0FBQSxDQUFBYSxRQUFBLENBQUFSLENBQUEsT0FBQUUsQ0FBQSxLQUFBTixDQUFBLFNBQUFDLENBQUEsQ0FBQXNELFFBQUEscUJBQUFuRCxDQUFBLElBQUFMLENBQUEsQ0FBQWEsUUFBQSxDQUFBaUQsTUFBQSxLQUFBNUQsQ0FBQSxDQUFBcUQsTUFBQSxhQUFBckQsQ0FBQSxDQUFBMkIsR0FBQSxHQUFBNUIsQ0FBQSxFQUFBd0QsbUJBQUEsQ0FBQXpELENBQUEsRUFBQUUsQ0FBQSxlQUFBQSxDQUFBLENBQUFxRCxNQUFBLGtCQUFBbEQsQ0FBQSxLQUFBSCxDQUFBLENBQUFxRCxNQUFBLFlBQUFyRCxDQUFBLENBQUEyQixHQUFBLE9BQUFrQyxTQUFBLHVDQUFBMUQsQ0FBQSxpQkFBQThCLENBQUEsTUFBQXpCLENBQUEsR0FBQWlCLFFBQUEsQ0FBQXBCLENBQUEsRUFBQVAsQ0FBQSxDQUFBYSxRQUFBLEVBQUFYLENBQUEsQ0FBQTJCLEdBQUEsbUJBQUFuQixDQUFBLENBQUFrQixJQUFBLFNBQUExQixDQUFBLENBQUFxRCxNQUFBLFlBQUFyRCxDQUFBLENBQUEyQixHQUFBLEdBQUFuQixDQUFBLENBQUFtQixHQUFBLEVBQUEzQixDQUFBLENBQUFzRCxRQUFBLFNBQUFyQixDQUFBLE1BQUF2QixDQUFBLEdBQUFGLENBQUEsQ0FBQW1CLEdBQUEsU0FBQWpCLENBQUEsR0FBQUEsQ0FBQSxDQUFBMEMsSUFBQSxJQUFBcEQsQ0FBQSxDQUFBRixDQUFBLENBQUFnRSxVQUFBLElBQUFwRCxDQUFBLENBQUFILEtBQUEsRUFBQVAsQ0FBQSxDQUFBK0QsSUFBQSxHQUFBakUsQ0FBQSxDQUFBa0UsT0FBQSxlQUFBaEUsQ0FBQSxDQUFBcUQsTUFBQSxLQUFBckQsQ0FBQSxDQUFBcUQsTUFBQSxXQUFBckQsQ0FBQSxDQUFBMkIsR0FBQSxHQUFBNUIsQ0FBQSxHQUFBQyxDQUFBLENBQUFzRCxRQUFBLFNBQUFyQixDQUFBLElBQUF2QixDQUFBLElBQUFWLENBQUEsQ0FBQXFELE1BQUEsWUFBQXJELENBQUEsQ0FBQTJCLEdBQUEsT0FBQWtDLFNBQUEsc0NBQUE3RCxDQUFBLENBQUFzRCxRQUFBLFNBQUFyQixDQUFBLGNBQUFnQyxhQUFBbEUsQ0FBQSxRQUFBRCxDQUFBLEtBQUFvRSxNQUFBLEVBQUFuRSxDQUFBLFlBQUFBLENBQUEsS0FBQUQsQ0FBQSxDQUFBcUUsUUFBQSxHQUFBcEUsQ0FBQSxXQUFBQSxDQUFBLEtBQUFELENBQUEsQ0FBQXNFLFVBQUEsR0FBQXJFLENBQUEsS0FBQUQsQ0FBQSxDQUFBdUUsUUFBQSxHQUFBdEUsQ0FBQSxXQUFBdUUsVUFBQSxDQUFBQyxJQUFBLENBQUF6RSxDQUFBLGNBQUEwRSxjQUFBekUsQ0FBQSxRQUFBRCxDQUFBLEdBQUFDLENBQUEsQ0FBQTBFLFVBQUEsUUFBQTNFLENBQUEsQ0FBQTRCLElBQUEsb0JBQUE1QixDQUFBLENBQUE2QixHQUFBLEVBQUE1QixDQUFBLENBQUEwRSxVQUFBLEdBQUEzRSxDQUFBLGFBQUF5QixRQUFBeEIsQ0FBQSxTQUFBdUUsVUFBQSxNQUFBSixNQUFBLGFBQUFuRSxDQUFBLENBQUE0QyxPQUFBLENBQUFzQixZQUFBLGNBQUFTLEtBQUEsaUJBQUFsQyxPQUFBMUMsQ0FBQSxRQUFBQSxDQUFBLFdBQUFBLENBQUEsUUFBQUUsQ0FBQSxHQUFBRixDQUFBLENBQUFZLENBQUEsT0FBQVYsQ0FBQSxTQUFBQSxDQUFBLENBQUE0QixJQUFBLENBQUE5QixDQUFBLDRCQUFBQSxDQUFBLENBQUFpRSxJQUFBLFNBQUFqRSxDQUFBLE9BQUE2RSxLQUFBLENBQUE3RSxDQUFBLENBQUE4RSxNQUFBLFNBQUF2RSxDQUFBLE9BQUFHLENBQUEsWUFBQXVELEtBQUEsYUFBQTFELENBQUEsR0FBQVAsQ0FBQSxDQUFBOEUsTUFBQSxPQUFBekUsQ0FBQSxDQUFBeUIsSUFBQSxDQUFBOUIsQ0FBQSxFQUFBTyxDQUFBLFVBQUEwRCxJQUFBLENBQUF4RCxLQUFBLEdBQUFULENBQUEsQ0FBQU8sQ0FBQSxHQUFBMEQsSUFBQSxDQUFBWCxJQUFBLE9BQUFXLElBQUEsU0FBQUEsSUFBQSxDQUFBeEQsS0FBQSxHQUFBUixDQUFBLEVBQUFnRSxJQUFBLENBQUFYLElBQUEsT0FBQVcsSUFBQSxZQUFBdkQsQ0FBQSxDQUFBdUQsSUFBQSxHQUFBdkQsQ0FBQSxnQkFBQXFELFNBQUEsUUFBQS9ELENBQUEsaUNBQUFvQyxpQkFBQSxDQUFBaEMsU0FBQSxHQUFBaUMsMEJBQUEsRUFBQTlCLENBQUEsQ0FBQW9DLENBQUEsbUJBQUFsQyxLQUFBLEVBQUE0QiwwQkFBQSxFQUFBakIsWUFBQSxTQUFBYixDQUFBLENBQUE4QiwwQkFBQSxtQkFBQTVCLEtBQUEsRUFBQTJCLGlCQUFBLEVBQUFoQixZQUFBLFNBQUFnQixpQkFBQSxDQUFBMkMsV0FBQSxHQUFBN0QsTUFBQSxDQUFBbUIsMEJBQUEsRUFBQXJCLENBQUEsd0JBQUFoQixDQUFBLENBQUFnRixtQkFBQSxhQUFBL0UsQ0FBQSxRQUFBRCxDQUFBLHdCQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQWdGLFdBQUEsV0FBQWpGLENBQUEsS0FBQUEsQ0FBQSxLQUFBb0MsaUJBQUEsNkJBQUFwQyxDQUFBLENBQUErRSxXQUFBLElBQUEvRSxDQUFBLENBQUFrRixJQUFBLE9BQUFsRixDQUFBLENBQUFtRixJQUFBLGFBQUFsRixDQUFBLFdBQUFFLE1BQUEsQ0FBQWlGLGNBQUEsR0FBQWpGLE1BQUEsQ0FBQWlGLGNBQUEsQ0FBQW5GLENBQUEsRUFBQW9DLDBCQUFBLEtBQUFwQyxDQUFBLENBQUFvRixTQUFBLEdBQUFoRCwwQkFBQSxFQUFBbkIsTUFBQSxDQUFBakIsQ0FBQSxFQUFBZSxDQUFBLHlCQUFBZixDQUFBLENBQUFHLFNBQUEsR0FBQUQsTUFBQSxDQUFBcUIsTUFBQSxDQUFBbUIsQ0FBQSxHQUFBMUMsQ0FBQSxLQUFBRCxDQUFBLENBQUFzRixLQUFBLGFBQUFyRixDQUFBLGFBQUFpRCxPQUFBLEVBQUFqRCxDQUFBLE9BQUEyQyxxQkFBQSxDQUFBRyxhQUFBLENBQUEzQyxTQUFBLEdBQUFjLE1BQUEsQ0FBQTZCLGFBQUEsQ0FBQTNDLFNBQUEsRUFBQVUsQ0FBQSxpQ0FBQWQsQ0FBQSxDQUFBK0MsYUFBQSxHQUFBQSxhQUFBLEVBQUEvQyxDQUFBLENBQUF1RixLQUFBLGFBQUF0RixDQUFBLEVBQUFDLENBQUEsRUFBQUcsQ0FBQSxFQUFBRSxDQUFBLEVBQUFHLENBQUEsZUFBQUEsQ0FBQSxLQUFBQSxDQUFBLEdBQUE4RSxPQUFBLE9BQUE1RSxDQUFBLE9BQUFtQyxhQUFBLENBQUF6QixJQUFBLENBQUFyQixDQUFBLEVBQUFDLENBQUEsRUFBQUcsQ0FBQSxFQUFBRSxDQUFBLEdBQUFHLENBQUEsVUFBQVYsQ0FBQSxDQUFBZ0YsbUJBQUEsQ0FBQTlFLENBQUEsSUFBQVUsQ0FBQSxHQUFBQSxDQUFBLENBQUFxRCxJQUFBLEdBQUFkLElBQUEsV0FBQWxELENBQUEsV0FBQUEsQ0FBQSxDQUFBcUQsSUFBQSxHQUFBckQsQ0FBQSxDQUFBUSxLQUFBLEdBQUFHLENBQUEsQ0FBQXFELElBQUEsV0FBQXJCLHFCQUFBLENBQUFELENBQUEsR0FBQXpCLE1BQUEsQ0FBQXlCLENBQUEsRUFBQTNCLENBQUEsZ0JBQUFFLE1BQUEsQ0FBQXlCLENBQUEsRUFBQS9CLENBQUEsaUNBQUFNLE1BQUEsQ0FBQXlCLENBQUEsNkRBQUEzQyxDQUFBLENBQUF5RixJQUFBLGFBQUF4RixDQUFBLFFBQUFELENBQUEsR0FBQUcsTUFBQSxDQUFBRixDQUFBLEdBQUFDLENBQUEsZ0JBQUFHLENBQUEsSUFBQUwsQ0FBQSxFQUFBRSxDQUFBLENBQUF1RSxJQUFBLENBQUFwRSxDQUFBLFVBQUFILENBQUEsQ0FBQXdGLE9BQUEsYUFBQXpCLEtBQUEsV0FBQS9ELENBQUEsQ0FBQTRFLE1BQUEsU0FBQTdFLENBQUEsR0FBQUMsQ0FBQSxDQUFBeUYsR0FBQSxRQUFBMUYsQ0FBQSxJQUFBRCxDQUFBLFNBQUFpRSxJQUFBLENBQUF4RCxLQUFBLEdBQUFSLENBQUEsRUFBQWdFLElBQUEsQ0FBQVgsSUFBQSxPQUFBVyxJQUFBLFdBQUFBLElBQUEsQ0FBQVgsSUFBQSxPQUFBVyxJQUFBLFFBQUFqRSxDQUFBLENBQUEwQyxNQUFBLEdBQUFBLE1BQUEsRUFBQWpCLE9BQUEsQ0FBQXJCLFNBQUEsS0FBQTZFLFdBQUEsRUFBQXhELE9BQUEsRUFBQW1ELEtBQUEsV0FBQUEsTUFBQTVFLENBQUEsYUFBQTRGLElBQUEsV0FBQTNCLElBQUEsV0FBQVAsSUFBQSxRQUFBQyxLQUFBLEdBQUExRCxDQUFBLE9BQUFxRCxJQUFBLFlBQUFFLFFBQUEsY0FBQUQsTUFBQSxnQkFBQTFCLEdBQUEsR0FBQTVCLENBQUEsT0FBQXVFLFVBQUEsQ0FBQTNCLE9BQUEsQ0FBQTZCLGFBQUEsSUFBQTFFLENBQUEsV0FBQUUsQ0FBQSxrQkFBQUEsQ0FBQSxDQUFBMkYsTUFBQSxPQUFBeEYsQ0FBQSxDQUFBeUIsSUFBQSxPQUFBNUIsQ0FBQSxNQUFBMkUsS0FBQSxFQUFBM0UsQ0FBQSxDQUFBNEYsS0FBQSxjQUFBNUYsQ0FBQSxJQUFBRCxDQUFBLE1BQUE4RixJQUFBLFdBQUFBLEtBQUEsU0FBQXpDLElBQUEsV0FBQXJELENBQUEsUUFBQXVFLFVBQUEsSUFBQUcsVUFBQSxrQkFBQTFFLENBQUEsQ0FBQTJCLElBQUEsUUFBQTNCLENBQUEsQ0FBQTRCLEdBQUEsY0FBQW1FLElBQUEsS0FBQXBDLGlCQUFBLFdBQUFBLGtCQUFBNUQsQ0FBQSxhQUFBc0QsSUFBQSxRQUFBdEQsQ0FBQSxNQUFBRSxDQUFBLGtCQUFBK0YsT0FBQTVGLENBQUEsRUFBQUUsQ0FBQSxXQUFBSyxDQUFBLENBQUFnQixJQUFBLFlBQUFoQixDQUFBLENBQUFpQixHQUFBLEdBQUE3QixDQUFBLEVBQUFFLENBQUEsQ0FBQStELElBQUEsR0FBQTVELENBQUEsRUFBQUUsQ0FBQSxLQUFBTCxDQUFBLENBQUFxRCxNQUFBLFdBQUFyRCxDQUFBLENBQUEyQixHQUFBLEdBQUE1QixDQUFBLEtBQUFNLENBQUEsYUFBQUEsQ0FBQSxRQUFBaUUsVUFBQSxDQUFBTSxNQUFBLE1BQUF2RSxDQUFBLFNBQUFBLENBQUEsUUFBQUcsQ0FBQSxRQUFBOEQsVUFBQSxDQUFBakUsQ0FBQSxHQUFBSyxDQUFBLEdBQUFGLENBQUEsQ0FBQWlFLFVBQUEsaUJBQUFqRSxDQUFBLENBQUEwRCxNQUFBLFNBQUE2QixNQUFBLGFBQUF2RixDQUFBLENBQUEwRCxNQUFBLFNBQUF3QixJQUFBLFFBQUE5RSxDQUFBLEdBQUFULENBQUEsQ0FBQXlCLElBQUEsQ0FBQXBCLENBQUEsZUFBQU0sQ0FBQSxHQUFBWCxDQUFBLENBQUF5QixJQUFBLENBQUFwQixDQUFBLHFCQUFBSSxDQUFBLElBQUFFLENBQUEsYUFBQTRFLElBQUEsR0FBQWxGLENBQUEsQ0FBQTJELFFBQUEsU0FBQTRCLE1BQUEsQ0FBQXZGLENBQUEsQ0FBQTJELFFBQUEsZ0JBQUF1QixJQUFBLEdBQUFsRixDQUFBLENBQUE0RCxVQUFBLFNBQUEyQixNQUFBLENBQUF2RixDQUFBLENBQUE0RCxVQUFBLGNBQUF4RCxDQUFBLGFBQUE4RSxJQUFBLEdBQUFsRixDQUFBLENBQUEyRCxRQUFBLFNBQUE0QixNQUFBLENBQUF2RixDQUFBLENBQUEyRCxRQUFBLHFCQUFBckQsQ0FBQSxZQUFBcUMsS0FBQSxxREFBQXVDLElBQUEsR0FBQWxGLENBQUEsQ0FBQTRELFVBQUEsU0FBQTJCLE1BQUEsQ0FBQXZGLENBQUEsQ0FBQTRELFVBQUEsWUFBQVQsTUFBQSxXQUFBQSxPQUFBNUQsQ0FBQSxFQUFBRCxDQUFBLGFBQUFFLENBQUEsUUFBQXNFLFVBQUEsQ0FBQU0sTUFBQSxNQUFBNUUsQ0FBQSxTQUFBQSxDQUFBLFFBQUFLLENBQUEsUUFBQWlFLFVBQUEsQ0FBQXRFLENBQUEsT0FBQUssQ0FBQSxDQUFBNkQsTUFBQSxTQUFBd0IsSUFBQSxJQUFBdkYsQ0FBQSxDQUFBeUIsSUFBQSxDQUFBdkIsQ0FBQSx3QkFBQXFGLElBQUEsR0FBQXJGLENBQUEsQ0FBQStELFVBQUEsUUFBQTVELENBQUEsR0FBQUgsQ0FBQSxhQUFBRyxDQUFBLGlCQUFBVCxDQUFBLG1CQUFBQSxDQUFBLEtBQUFTLENBQUEsQ0FBQTBELE1BQUEsSUFBQXBFLENBQUEsSUFBQUEsQ0FBQSxJQUFBVSxDQUFBLENBQUE0RCxVQUFBLEtBQUE1RCxDQUFBLGNBQUFFLENBQUEsR0FBQUYsQ0FBQSxHQUFBQSxDQUFBLENBQUFpRSxVQUFBLGNBQUEvRCxDQUFBLENBQUFnQixJQUFBLEdBQUEzQixDQUFBLEVBQUFXLENBQUEsQ0FBQWlCLEdBQUEsR0FBQTdCLENBQUEsRUFBQVUsQ0FBQSxTQUFBNkMsTUFBQSxnQkFBQVUsSUFBQSxHQUFBdkQsQ0FBQSxDQUFBNEQsVUFBQSxFQUFBbkMsQ0FBQSxTQUFBK0QsUUFBQSxDQUFBdEYsQ0FBQSxNQUFBc0YsUUFBQSxXQUFBQSxTQUFBakcsQ0FBQSxFQUFBRCxDQUFBLG9CQUFBQyxDQUFBLENBQUEyQixJQUFBLFFBQUEzQixDQUFBLENBQUE0QixHQUFBLHFCQUFBNUIsQ0FBQSxDQUFBMkIsSUFBQSxtQkFBQTNCLENBQUEsQ0FBQTJCLElBQUEsUUFBQXFDLElBQUEsR0FBQWhFLENBQUEsQ0FBQTRCLEdBQUEsZ0JBQUE1QixDQUFBLENBQUEyQixJQUFBLFNBQUFvRSxJQUFBLFFBQUFuRSxHQUFBLEdBQUE1QixDQUFBLENBQUE0QixHQUFBLE9BQUEwQixNQUFBLGtCQUFBVSxJQUFBLHlCQUFBaEUsQ0FBQSxDQUFBMkIsSUFBQSxJQUFBNUIsQ0FBQSxVQUFBaUUsSUFBQSxHQUFBakUsQ0FBQSxHQUFBbUMsQ0FBQSxLQUFBZ0UsTUFBQSxXQUFBQSxPQUFBbEcsQ0FBQSxhQUFBRCxDQUFBLFFBQUF3RSxVQUFBLENBQUFNLE1BQUEsTUFBQTlFLENBQUEsU0FBQUEsQ0FBQSxRQUFBRSxDQUFBLFFBQUFzRSxVQUFBLENBQUF4RSxDQUFBLE9BQUFFLENBQUEsQ0FBQW9FLFVBQUEsS0FBQXJFLENBQUEsY0FBQWlHLFFBQUEsQ0FBQWhHLENBQUEsQ0FBQXlFLFVBQUEsRUFBQXpFLENBQUEsQ0FBQXFFLFFBQUEsR0FBQUcsYUFBQSxDQUFBeEUsQ0FBQSxHQUFBaUMsQ0FBQSxPQUFBaUUsS0FBQSxXQUFBQyxPQUFBcEcsQ0FBQSxhQUFBRCxDQUFBLFFBQUF3RSxVQUFBLENBQUFNLE1BQUEsTUFBQTlFLENBQUEsU0FBQUEsQ0FBQSxRQUFBRSxDQUFBLFFBQUFzRSxVQUFBLENBQUF4RSxDQUFBLE9BQUFFLENBQUEsQ0FBQWtFLE1BQUEsS0FBQW5FLENBQUEsUUFBQUksQ0FBQSxHQUFBSCxDQUFBLENBQUF5RSxVQUFBLGtCQUFBdEUsQ0FBQSxDQUFBdUIsSUFBQSxRQUFBckIsQ0FBQSxHQUFBRixDQUFBLENBQUF3QixHQUFBLEVBQUE2QyxhQUFBLENBQUF4RSxDQUFBLFlBQUFLLENBQUEsZ0JBQUE4QyxLQUFBLDhCQUFBaUQsYUFBQSxXQUFBQSxjQUFBdEcsQ0FBQSxFQUFBRSxDQUFBLEVBQUFHLENBQUEsZ0JBQUFtRCxRQUFBLEtBQUEzQyxRQUFBLEVBQUE2QixNQUFBLENBQUExQyxDQUFBLEdBQUFnRSxVQUFBLEVBQUE5RCxDQUFBLEVBQUFnRSxPQUFBLEVBQUE3RCxDQUFBLG9CQUFBa0QsTUFBQSxVQUFBMUIsR0FBQSxHQUFBNUIsQ0FBQSxHQUFBa0MsQ0FBQSxPQUFBbkMsQ0FBQTtBQUFBLFNBQUF5YixRQUFBemIsQ0FBQSxFQUFBRSxDQUFBLFFBQUFELENBQUEsR0FBQUUsTUFBQSxDQUFBc0YsSUFBQSxDQUFBekYsQ0FBQSxPQUFBRyxNQUFBLENBQUF1YixxQkFBQSxRQUFBbmIsQ0FBQSxHQUFBSixNQUFBLENBQUF1YixxQkFBQSxDQUFBMWIsQ0FBQSxHQUFBRSxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBeVEsTUFBQSxXQUFBOVEsQ0FBQSxXQUFBQyxNQUFBLENBQUF3Yix3QkFBQSxDQUFBM2IsQ0FBQSxFQUFBRSxDQUFBLEVBQUFpQixVQUFBLE9BQUFsQixDQUFBLENBQUF3RSxJQUFBLENBQUEyQyxLQUFBLENBQUFuSCxDQUFBLEVBQUFNLENBQUEsWUFBQU4sQ0FBQTtBQUFBLFNBQUFzUCxjQUFBdlAsQ0FBQSxhQUFBRSxDQUFBLE1BQUFBLENBQUEsR0FBQWlILFNBQUEsQ0FBQXJDLE1BQUEsRUFBQTVFLENBQUEsVUFBQUQsQ0FBQSxXQUFBa0gsU0FBQSxDQUFBakgsQ0FBQSxJQUFBaUgsU0FBQSxDQUFBakgsQ0FBQSxRQUFBQSxDQUFBLE9BQUF1YixPQUFBLENBQUF0YixNQUFBLENBQUFGLENBQUEsT0FBQTRDLE9BQUEsV0FBQTNDLENBQUEsSUFBQWtSLGVBQUEsQ0FBQXBSLENBQUEsRUFBQUUsQ0FBQSxFQUFBRCxDQUFBLENBQUFDLENBQUEsU0FBQUMsTUFBQSxDQUFBeWIseUJBQUEsR0FBQXpiLE1BQUEsQ0FBQTBiLGdCQUFBLENBQUE3YixDQUFBLEVBQUFHLE1BQUEsQ0FBQXliLHlCQUFBLENBQUEzYixDQUFBLEtBQUF3YixPQUFBLENBQUF0YixNQUFBLENBQUFGLENBQUEsR0FBQTRDLE9BQUEsV0FBQTNDLENBQUEsSUFBQUMsTUFBQSxDQUFBSyxjQUFBLENBQUFSLENBQUEsRUFBQUUsQ0FBQSxFQUFBQyxNQUFBLENBQUF3Yix3QkFBQSxDQUFBMWIsQ0FBQSxFQUFBQyxDQUFBLGlCQUFBRixDQUFBO0FBQUEsU0FBQW9SLGdCQUFBNEQsR0FBQSxFQUFBcE8sR0FBQSxFQUFBbkcsS0FBQSxJQUFBbUcsR0FBQSxHQUFBa1YsY0FBQSxDQUFBbFYsR0FBQSxPQUFBQSxHQUFBLElBQUFvTyxHQUFBLElBQUE3VSxNQUFBLENBQUFLLGNBQUEsQ0FBQXdVLEdBQUEsRUFBQXBPLEdBQUEsSUFBQW5HLEtBQUEsRUFBQUEsS0FBQSxFQUFBVSxVQUFBLFFBQUFDLFlBQUEsUUFBQUMsUUFBQSxvQkFBQTJULEdBQUEsQ0FBQXBPLEdBQUEsSUFBQW5HLEtBQUEsV0FBQXVVLEdBQUE7QUFBQSxTQUFBOEcsZUFBQWphLEdBQUEsUUFBQStFLEdBQUEsR0FBQW1WLFlBQUEsQ0FBQWxhLEdBQUEsMkJBQUErRSxHQUFBLGdCQUFBQSxHQUFBLEdBQUFvVixNQUFBLENBQUFwVixHQUFBO0FBQUEsU0FBQW1WLGFBQUFFLEtBQUEsRUFBQUMsSUFBQSxlQUFBRCxLQUFBLGlCQUFBQSxLQUFBLGtCQUFBQSxLQUFBLE1BQUFFLElBQUEsR0FBQUYsS0FBQSxDQUFBdGIsTUFBQSxDQUFBeWIsV0FBQSxPQUFBRCxJQUFBLEtBQUE3VSxTQUFBLFFBQUE0UyxHQUFBLEdBQUFpQyxJQUFBLENBQUFyYSxJQUFBLENBQUFtYSxLQUFBLEVBQUFDLElBQUEsMkJBQUFoQyxHQUFBLHNCQUFBQSxHQUFBLFlBQUFuVyxTQUFBLDREQUFBbVksSUFBQSxnQkFBQUYsTUFBQSxHQUFBSyxNQUFBLEVBQUFKLEtBQUE7QUFBQSxTQUFBMVUsZUFBQUMsR0FBQSxFQUFBOUcsQ0FBQSxXQUFBK0csZUFBQSxDQUFBRCxHQUFBLEtBQUFFLHFCQUFBLENBQUFGLEdBQUEsRUFBQTlHLENBQUEsS0FBQWlILDJCQUFBLENBQUFILEdBQUEsRUFBQTlHLENBQUEsS0FBQWtILGdCQUFBO0FBQUEsU0FBQUEsaUJBQUEsY0FBQTdELFNBQUE7QUFBQSxTQUFBMkQsc0JBQUF4SCxDQUFBLEVBQUE4QixDQUFBLFFBQUEvQixDQUFBLFdBQUFDLENBQUEsZ0NBQUFTLE1BQUEsSUFBQVQsQ0FBQSxDQUFBUyxNQUFBLENBQUFFLFFBQUEsS0FBQVgsQ0FBQSw0QkFBQUQsQ0FBQSxRQUFBRCxDQUFBLEVBQUFLLENBQUEsRUFBQUssQ0FBQSxFQUFBTSxDQUFBLEVBQUFKLENBQUEsT0FBQXFCLENBQUEsT0FBQTFCLENBQUEsaUJBQUFHLENBQUEsSUFBQVQsQ0FBQSxHQUFBQSxDQUFBLENBQUE2QixJQUFBLENBQUE1QixDQUFBLEdBQUErRCxJQUFBLFFBQUFqQyxDQUFBLFFBQUE3QixNQUFBLENBQUFGLENBQUEsTUFBQUEsQ0FBQSxVQUFBZ0MsQ0FBQSx1QkFBQUEsQ0FBQSxJQUFBakMsQ0FBQSxHQUFBVSxDQUFBLENBQUFvQixJQUFBLENBQUE3QixDQUFBLEdBQUFxRCxJQUFBLE1BQUExQyxDQUFBLENBQUE2RCxJQUFBLENBQUF6RSxDQUFBLENBQUFTLEtBQUEsR0FBQUcsQ0FBQSxDQUFBa0UsTUFBQSxLQUFBOUMsQ0FBQSxHQUFBQyxDQUFBLGlCQUFBL0IsQ0FBQSxJQUFBSyxDQUFBLE9BQUFGLENBQUEsR0FBQUgsQ0FBQSx5QkFBQStCLENBQUEsWUFBQWhDLENBQUEsQ0FBQTZELE1BQUEsS0FBQTlDLENBQUEsR0FBQWYsQ0FBQSxDQUFBNkQsTUFBQSxJQUFBM0QsTUFBQSxDQUFBYSxDQUFBLE1BQUFBLENBQUEsMkJBQUFULENBQUEsUUFBQUYsQ0FBQSxhQUFBTyxDQUFBO0FBQUEsU0FBQTZHLGdCQUFBRCxHQUFBLFFBQUFRLEtBQUEsQ0FBQUssT0FBQSxDQUFBYixHQUFBLFVBQUFBLEdBQUE7QUFBQSxTQUFBakIsbUJBQUFDLEdBQUEsRUFBQXZELE9BQUEsRUFBQXdELE1BQUEsRUFBQUMsS0FBQSxFQUFBQyxNQUFBLEVBQUFDLEdBQUEsRUFBQS9FLEdBQUEsY0FBQWdGLElBQUEsR0FBQUwsR0FBQSxDQUFBSSxHQUFBLEVBQUEvRSxHQUFBLE9BQUFwQixLQUFBLEdBQUFvRyxJQUFBLENBQUFwRyxLQUFBLFdBQUFxRyxLQUFBLElBQUFMLE1BQUEsQ0FBQUssS0FBQSxpQkFBQUQsSUFBQSxDQUFBdkQsSUFBQSxJQUFBTCxPQUFBLENBQUF4QyxLQUFBLFlBQUErRSxPQUFBLENBQUF2QyxPQUFBLENBQUF4QyxLQUFBLEVBQUEwQyxJQUFBLENBQUF1RCxLQUFBLEVBQUFDLE1BQUE7QUFBQSxTQUFBSSxrQkFBQUMsRUFBQSw2QkFBQUMsSUFBQSxTQUFBQyxJQUFBLEdBQUFDLFNBQUEsYUFBQTNCLE9BQUEsV0FBQXZDLE9BQUEsRUFBQXdELE1BQUEsUUFBQUQsR0FBQSxHQUFBUSxFQUFBLENBQUFJLEtBQUEsQ0FBQUgsSUFBQSxFQUFBQyxJQUFBLFlBQUFSLE1BQUFqRyxLQUFBLElBQUE4RixrQkFBQSxDQUFBQyxHQUFBLEVBQUF2RCxPQUFBLEVBQUF3RCxNQUFBLEVBQUFDLEtBQUEsRUFBQUMsTUFBQSxVQUFBbEcsS0FBQSxjQUFBa0csT0FBQVUsR0FBQSxJQUFBZCxrQkFBQSxDQUFBQyxHQUFBLEVBQUF2RCxPQUFBLEVBQUF3RCxNQUFBLEVBQUFDLEtBQUEsRUFBQUMsTUFBQSxXQUFBVSxHQUFBLEtBQUFYLEtBQUEsQ0FBQVksU0FBQTtBQUFBLFNBQUF3TixtQkFBQXROLEdBQUEsV0FBQThVLGtCQUFBLENBQUE5VSxHQUFBLEtBQUErVSxnQkFBQSxDQUFBL1UsR0FBQSxLQUFBRywyQkFBQSxDQUFBSCxHQUFBLEtBQUFnVixrQkFBQTtBQUFBLFNBQUFBLG1CQUFBLGNBQUF6WSxTQUFBO0FBQUEsU0FBQTRELDRCQUFBcEgsQ0FBQSxFQUFBc0gsTUFBQSxTQUFBdEgsQ0FBQSxxQkFBQUEsQ0FBQSxzQkFBQXVILGlCQUFBLENBQUF2SCxDQUFBLEVBQUFzSCxNQUFBLE9BQUF4SCxDQUFBLEdBQUFGLE1BQUEsQ0FBQUMsU0FBQSxDQUFBMkgsUUFBQSxDQUFBakcsSUFBQSxDQUFBdkIsQ0FBQSxFQUFBdUYsS0FBQSxhQUFBekYsQ0FBQSxpQkFBQUUsQ0FBQSxDQUFBMEUsV0FBQSxFQUFBNUUsQ0FBQSxHQUFBRSxDQUFBLENBQUEwRSxXQUFBLENBQUFDLElBQUEsTUFBQTdFLENBQUEsY0FBQUEsQ0FBQSxtQkFBQTJILEtBQUEsQ0FBQUMsSUFBQSxDQUFBMUgsQ0FBQSxPQUFBRixDQUFBLCtEQUFBNkgsSUFBQSxDQUFBN0gsQ0FBQSxVQUFBeUgsaUJBQUEsQ0FBQXZILENBQUEsRUFBQXNILE1BQUE7QUFBQSxTQUFBMFUsaUJBQUFFLElBQUEsZUFBQTliLE1BQUEsb0JBQUE4YixJQUFBLENBQUE5YixNQUFBLENBQUFFLFFBQUEsYUFBQTRiLElBQUEsK0JBQUF6VSxLQUFBLENBQUFDLElBQUEsQ0FBQXdVLElBQUE7QUFBQSxTQUFBSCxtQkFBQTlVLEdBQUEsUUFBQVEsS0FBQSxDQUFBSyxPQUFBLENBQUFiLEdBQUEsVUFBQU0saUJBQUEsQ0FBQU4sR0FBQTtBQUFBLFNBQUFNLGtCQUFBTixHQUFBLEVBQUFXLEdBQUEsUUFBQUEsR0FBQSxZQUFBQSxHQUFBLEdBQUFYLEdBQUEsQ0FBQTFDLE1BQUEsRUFBQXFELEdBQUEsR0FBQVgsR0FBQSxDQUFBMUMsTUFBQSxXQUFBcEUsQ0FBQSxNQUFBMEgsSUFBQSxPQUFBSixLQUFBLENBQUFHLEdBQUEsR0FBQXpILENBQUEsR0FBQXlILEdBQUEsRUFBQXpILENBQUEsSUFBQTBILElBQUEsQ0FBQTFILENBQUEsSUFBQThHLEdBQUEsQ0FBQTlHLENBQUEsVUFBQTBILElBQUE7QUFEdUU7QUFXekM7QUFFc0I7QUFFUTtBQUViO0FBU0c7QUFFbEQsSUFBTXl1QyxZQUFZLEdBQUcsU0FBZkEsWUFBWUEsQ0FBSUMsRUFBYSxFQUFFQyxFQUFhLEVBQWE7RUFBQSxJQUFBQyxZQUFBLEVBQUFDLFlBQUE7RUFDM0QsT0FBTyxFQUFBRCxZQUFBLEdBQUNGLEVBQUUsQ0FBQzVkLFFBQVEsY0FBQThkLFlBQUEsY0FBQUEsWUFBQSxHQUFJLEVBQUUsTUFBQUMsWUFBQSxHQUFLRixFQUFFLENBQUM3ZCxRQUFRLGNBQUErZCxZQUFBLGNBQUFBLFlBQUEsR0FBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzdELENBQUM7QUFFRCxJQUFNQyxRQUFRLEdBQUcsU0FBWEEsUUFBUUEsQ0FDVjEyQixFQUF3QixFQUN4QlgsS0FBVSxFQUlUO0VBQ0QsSUFBTzZYLFVBQVUsR0FBSWxYLEVBQUUsQ0FBaEJrWCxVQUFVO0VBQ2pCLElBQU1sUCxVQUFVLEdBQUdrUCxVQUFVLENBQUM3WCxLQUFLLENBQUM7RUFDcEMsSUFBTXMzQixXQUFrQixHQUFHejZCLGlEQUFPLENBQUM4TCxVQUFVLENBQUM7RUFDOUMsSUFBTTR1QixVQUFpQixHQUFHLEVBQUU7RUFFNUIsSUFBTUMsTUFBVyxHQUFHLENBQUMsQ0FBQztFQUN0QkYsV0FBVyxDQUFDdDBDLE9BQU8sQ0FBQyxVQUFBd04sSUFBQSxFQUFvQjtJQUFBLElBQWxCc0UsRUFBRSxHQUFBdEUsSUFBQSxDQUFGc0UsRUFBRTtNQUFFeUwsUUFBUSxHQUFBL1AsSUFBQSxDQUFSK1AsUUFBUTtJQUM5QixJQUFNZ0UsS0FBSyxHQUFHbFEsa0VBQVcsQ0FBQ1MsRUFBRSxDQUFDO0lBQzdCLElBQU0yaUMsS0FBSyxHQUFJRCxNQUFNLENBQUNqekIsS0FBSyxDQUFDLEdBQUdpekIsTUFBTSxDQUFDanpCLEtBQUssQ0FBQyxJQUFJLEVBQUc7SUFDbkRrekIsS0FBSyxDQUFDN3lDLElBQUksQ0FBQzJiLFFBQVEsQ0FBQztJQUNwQmczQixVQUFVLENBQUMzeUMsSUFBSSxDQUFDaW5CLDBFQUFnQixDQUFDO01BQUMvVyxFQUFFLEVBQUV5UCxLQUFLO01BQUVoRTtJQUFRLENBQUMsQ0FBQyxDQUFDO0VBQzVELENBQUMsQ0FBQztFQUVGLE9BQU87SUFBQ29JLFVBQVU7SUFBRTR1QjtFQUFVLENBQUM7QUFDbkMsQ0FBQztBQUVELElBQU1HLE1BQU0sR0FBRyxTQUFUQSxNQUFNQSxDQUFJLzJCLEVBQWEsRUFBRVgsS0FBVTtFQUFBLE9BQ3JDODJCLGlEQUFJLENBQ0EvNUIsaURBQUssQ0FBQyxJQUFJLEtBQUF6USxNQUFBLENBQUEySSxrQkFBQSxDQUNINEgsaURBQU8sQ0FBQzhELEVBQUUsQ0FBQ0ksU0FBUyxDQUFDZixLQUFLLENBQUMsQ0FBQyxHQUFBL0ssa0JBQUEsQ0FDNUI0SCxpREFBTyxDQUFDOEQsRUFBRSxDQUFDbk8sUUFBUSxDQUFDd04sS0FBSyxDQUFDLENBQUMsRUFDakMsQ0FDTCxDQUFDO0FBQUE7QUFFTCxJQUFNeE8sUUFBK0MsR0FBRztFQUNwREEsUUFBUTtJQUFBLElBQUFtbUMsU0FBQSxHQUFBendDLGlCQUFBLGVBQUFoSCxtQkFBQSxHQUFBb0YsSUFBQSxDQUFFLFNBQUE2YyxTQUFBZ0QsS0FBQTtNQUFBLElBQUExWixRQUFBLEVBQUErRyxRQUFBLEVBQUE0RCxTQUFBLEVBQUFtZ0MsbUJBQUEsRUFBQVIsU0FBQSxFQUFBRyxPQUFBLEVBQUF6ckMsTUFBQSxFQUFBOEMsS0FBQSxFQUFBM0MsTUFBQSxFQUFBb1YsS0FBQSxFQUFBeFYsWUFBQSxFQUFBeXlCLFVBQUEsRUFBQTJhLFdBQUEsRUFBQUMsU0FBQSxFQUFBL2MsVUFBQSxFQUFBQyxXQUFBLEVBQUErYyxhQUFBLEVBQUFDLGNBQUEsRUFBQUMsbUJBQUEsRUFBQUMsb0JBQUEsRUFBQWpDLFFBQUE7TUFBQSxPQUFBOTFDLG1CQUFBLEdBQUF1QixJQUFBLFVBQUF3aEIsVUFBQTBHLFNBQUE7UUFBQSxrQkFBQUEsU0FBQSxDQUFBNWpCLElBQUEsR0FBQTRqQixTQUFBLENBQUF2bEIsSUFBQTtVQUFBO1lBQVFxSCxRQUFRLEdBQUEwWixLQUFBLENBQVIxWixRQUFRLEVBQUUrRyxRQUFRLEdBQUEyUyxLQUFBLENBQVIzUyxRQUFRO1lBQUE0RCxTQUFBLEdBUTVCNUQsUUFBUSxDQUFDLENBQUMsRUFBQStqQyxtQkFBQSxHQUFBbmdDLFNBQUEsQ0FOVm9ZLFNBQVMsRUFBR3VuQixTQUFTLEdBQUFRLG1CQUFBLENBQVRSLFNBQVMsRUFBRUcsT0FBTyxHQUFBSyxtQkFBQSxDQUFQTCxPQUFPLEVBQzlCenJDLE1BQU0sR0FBQTJMLFNBQUEsQ0FBTjNMLE1BQU0sRUFDTjhDLEtBQUssR0FBQTZJLFNBQUEsQ0FBTDdJLEtBQUssRUFDTDNDLE1BQU0sR0FBQXdMLFNBQUEsQ0FBTnhMLE1BQU0sRUFDTm9WLEtBQUssR0FBQTVKLFNBQUEsQ0FBTDRKLEtBQUssRUFDTHhWLFlBQVksR0FBQTRMLFNBQUEsQ0FBWjVMLFlBQVk7WUFBQXl5QixVQUFBLEdBSVp6cUIsUUFBUSxDQUFDLENBQUMsRUFERW9sQyxXQUFXLEdBQUEzYSxVQUFBLENBQXZCek8sU0FBUyxDQUFHb3BCLFdBQVc7WUFBQSxNQUd2QnB0QyxZQUFZLEtBQUtSLGdFQUFXLENBQUMsVUFBVSxDQUFDO2NBQUEyZixTQUFBLENBQUF2bEIsSUFBQTtjQUFBO1lBQUE7WUFBQSxPQUFBdWxCLFNBQUEsQ0FBQTNsQixNQUFBO1VBQUE7WUFJdEM2ekMsU0FBUyxHQUFHbmUsSUFBSSxDQUFDQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBR29jLFNBQVMsQ0FBQzl3QyxNQUFNLEdBQUdpeEMsT0FBTyxDQUFDanhDLE1BQU0sQ0FBQyxFQUVyRTtZQUNBMnlDLFdBQVcsR0FBR2pxQixpREFBSSxDQUFDcXBCLFlBQVksRUFBRVksV0FBVyxDQUFDOztZQUU3QztZQUFBOWMsVUFBQSxHQUN3Q3ZCLGlEQUFTLENBQzdDLFVBQUE1WSxFQUFFO2NBQUEsT0FBSW8yQiwrREFBVSxDQUFDbnNDLE1BQU0sRUFBRW9WLEtBQUssRUFBRTAzQixNQUFNLENBQUMvMkIsRUFBRSxFQUFFWCxLQUFLLENBQUMsQ0FBQyxLQUFLLElBQUk7WUFBQSxHQUMzRDQzQixXQUNKLENBQUMsRUFBQTdjLFdBQUEsR0FBQXJ6QixjQUFBLENBQUFvekIsVUFBQSxNQUhNZ2QsYUFBYSxHQUFBL2MsV0FBQSxLQUFFZ2QsY0FBYyxHQUFBaGQsV0FBQTtZQUs5QmlkLG1CQUFtQixHQUFHRixhQUFhLENBQUM3eEMsS0FBSyxDQUFDLENBQUMsRUFBRTR4QyxTQUFTLENBQUM7WUFDdkRJLG9CQUFvQixHQUFHRixjQUFjLENBQUM5eEMsS0FBSyxDQUM3QyxDQUFDLEVBQ0Q0eEMsU0FBUyxHQUFHRyxtQkFBbUIsQ0FBQy95QyxNQUNwQyxDQUFDO1lBRUQsSUFBSSt5QyxtQkFBbUIsQ0FBQy95QyxNQUFNLEVBQUU7Y0FDNUJ3RyxRQUFRLENBQ0pnVSxzRUFBa0IsQ0FBQyxDQUNmUiw4RUFBMEIsQ0FBQys0QixtQkFBbUIsQ0FBQyxFQUMvQy81Qix5RUFBcUIsQ0FDakI3TSxrREFBRyxDQUNDLFVBQUF1UCxFQUFFO2dCQUFBLE9BQ0U4SCxtRUFBZSxDQUNYOUgsRUFBRSxFQUNGbFcsTUFBTSxFQUNOOEMsS0FBSyxFQUNMeVMsS0FBSyxFQUNMcFYsTUFBTSxFQUNOeXNDLFFBQVEsQ0FBQzEyQixFQUFFLEVBQUVYLEtBQUssQ0FBQyxFQUNuQnZVLFFBQVEsRUFDUitHLFFBQ0osQ0FBQztjQUFBLEdBQ0x3bEMsbUJBQ0osQ0FDSixDQUFDLENBQ0osQ0FDTCxDQUFDO1lBQ0w7WUFFQSxJQUFJQyxvQkFBb0IsQ0FBQ2h6QyxNQUFNLEVBQUU7Y0FDdkIrd0MsUUFBUSxHQUFHNWtDLGtEQUFHLENBQ2hCLFVBQUF1UCxFQUFFO2dCQUFBLE9BQUFqUixhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxLQUNLaVIsRUFBRSxHQUNGMDJCLFFBQVEsQ0FBQzEyQixFQUFFLEVBQUVYLEtBQUssQ0FBQztrQkFDdEJxZCxPQUFPLEVBQUUwWiwrREFBVSxDQUFDbnNDLE1BQU0sRUFBRW9WLEtBQUssRUFBRTAzQixNQUFNLENBQUMvMkIsRUFBRSxFQUFFWCxLQUFLLENBQUM7Z0JBQUM7Y0FBQSxDQUN2RCxFQUNGaTRCLG9CQUNKLENBQUM7Y0FFRHhzQyxRQUFRLENBQ0pnVSxzRUFBa0IsQ0FBQyxDQUNmUiw4RUFBMEIsQ0FBQ2c1QixvQkFBb0IsQ0FBQyxFQUNoRHQ2Qix1RUFBbUIsQ0FBQ3E0QixRQUFRLENBQUMsQ0FDaEMsQ0FDTCxDQUFDO2NBRURBLFFBQVEsQ0FBQ2h6QyxPQUFPO2dCQUFBLElBQUFvaUIsS0FBQSxHQUFBbGUsaUJBQUEsZUFBQWhILG1CQUFBLEdBQUFvRixJQUFBLENBQUMsU0FBQXlHLFFBQU00VSxFQUFFO2tCQUFBLElBQUF5YyxVQUFBLEVBQUE4YSxPQUFBLEVBQUEvQixTQUFBLEVBQUFnQyxpQkFBQTtrQkFBQSxPQUFBajRDLG1CQUFBLEdBQUF1QixJQUFBLFVBQUF1SyxTQUFBQyxRQUFBO29CQUFBLGtCQUFBQSxRQUFBLENBQUFsRyxJQUFBLEdBQUFrRyxRQUFBLENBQUE3SCxJQUFBO3NCQUFBO3dCQUFBNkgsUUFBQSxDQUFBN0gsSUFBQTt3QkFBQSxPQUNmdWMsRUFBRSxDQUFDMGMsT0FBTztzQkFBQTt3QkFBQUQsVUFBQSxHQUlaNXFCLFFBQVEsQ0FBQyxDQUFDLEVBREUwbEMsT0FBTyxHQUFBOWEsVUFBQSxDQUFuQjVPLFNBQVMsQ0FBRzBwQixPQUFPLEVBR3ZCO3dCQUNBO3dCQUNBO3dCQUNBO3dCQUNNL0IsU0FBUyxHQUFHL1Ysa0RBQUksQ0FDbEIsVUFBQWdXLEdBQUc7MEJBQUEsT0FBSUEsR0FBRyxLQUFLejFCLEVBQUUsSUFBSXkxQixHQUFHLENBQUMvWSxPQUFPLEtBQUsxYyxFQUFFLENBQUMwYyxPQUFPO3dCQUFBLEdBQy9DNmEsT0FDSixDQUFDO3dCQUFBLElBQ0kvQixTQUFTOzBCQUFBbHFDLFFBQUEsQ0FBQTdILElBQUE7MEJBQUE7d0JBQUE7d0JBQUEsT0FBQTZILFFBQUEsQ0FBQWpJLE1BQUE7c0JBQUE7d0JBSVJtMEMsaUJBQWlCLEdBQUcxdkIsbUVBQWUsQ0FDckM5SCxFQUFFLEVBQ0ZsVyxNQUFNLEVBQ044QyxLQUFLLEVBQ0x5UyxLQUFLLEVBQ0xwVixNQUFNLEVBQ04rVixFQUFFLEVBQ0ZsVixRQUFRLEVBQ1IrRyxRQUNKLENBQUM7d0JBRUQvRyxRQUFRLENBQ0pnVSxzRUFBa0IsQ0FBQyxDQUNmWiwwRUFBc0IsQ0FBQyxDQUFDOEIsRUFBRSxDQUFDLENBQUMsRUFDNUIxQyx5RUFBcUIsQ0FBQyxDQUFDazZCLGlCQUFpQixDQUFDLENBQUMsQ0FDN0MsQ0FDTCxDQUFDO3NCQUFDO3NCQUFBO3dCQUFBLE9BQUFsc0MsUUFBQSxDQUFBL0YsSUFBQTtvQkFBQTtrQkFBQSxHQUFBNkYsT0FBQTtnQkFBQSxDQUNMO2dCQUFBLGlCQUFBNFAsR0FBQTtrQkFBQSxPQUFBeUosS0FBQSxDQUFBN2QsS0FBQSxPQUFBRCxTQUFBO2dCQUFBO2NBQUEsSUFBQztZQUNOO1VBQUM7VUFBQTtZQUFBLE9BQUFxaUIsU0FBQSxDQUFBempCLElBQUE7UUFBQTtNQUFBLEdBQUFpYyxRQUFBO0lBQUEsQ0FDSjtJQUFBLFNBQUEzUSxTQUFBa0ssRUFBQTtNQUFBLE9BQUFpOEIsU0FBQSxDQUFBcHdDLEtBQUEsT0FBQUQsU0FBQTtJQUFBO0lBQUEsT0FBQWtLLFFBQUE7RUFBQTtFQUNEQyxNQUFNLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxxQkFBcUI7QUFDM0QsQ0FBQztBQUVELCtEQUFlRCxRQUFROzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0NDcEx2QixxSkFBQXRSLG1CQUFBLFlBQUFBLG9CQUFBLFdBQUFDLENBQUEsU0FBQUMsQ0FBQSxFQUFBRCxDQUFBLE9BQUFFLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxTQUFBLEVBQUFDLENBQUEsR0FBQUgsQ0FBQSxDQUFBSSxjQUFBLEVBQUFDLENBQUEsR0FBQUosTUFBQSxDQUFBSyxjQUFBLGNBQUFQLENBQUEsRUFBQUQsQ0FBQSxFQUFBRSxDQUFBLElBQUFELENBQUEsQ0FBQUQsQ0FBQSxJQUFBRSxDQUFBLENBQUFPLEtBQUEsS0FBQUMsQ0FBQSx3QkFBQUMsTUFBQSxHQUFBQSxNQUFBLE9BQUFDLENBQUEsR0FBQUYsQ0FBQSxDQUFBRyxRQUFBLGtCQUFBQyxDQUFBLEdBQUFKLENBQUEsQ0FBQUssYUFBQSx1QkFBQUMsQ0FBQSxHQUFBTixDQUFBLENBQUFPLFdBQUEsOEJBQUFDLE9BQUFqQixDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxXQUFBQyxNQUFBLENBQUFLLGNBQUEsQ0FBQVAsQ0FBQSxFQUFBRCxDQUFBLElBQUFTLEtBQUEsRUFBQVAsQ0FBQSxFQUFBaUIsVUFBQSxNQUFBQyxZQUFBLE1BQUFDLFFBQUEsU0FBQXBCLENBQUEsQ0FBQUQsQ0FBQSxXQUFBa0IsTUFBQSxtQkFBQWpCLENBQUEsSUFBQWlCLE1BQUEsWUFBQUEsT0FBQWpCLENBQUEsRUFBQUQsQ0FBQSxFQUFBRSxDQUFBLFdBQUFELENBQUEsQ0FBQUQsQ0FBQSxJQUFBRSxDQUFBLGdCQUFBb0IsS0FBQXJCLENBQUEsRUFBQUQsQ0FBQSxFQUFBRSxDQUFBLEVBQUFHLENBQUEsUUFBQUssQ0FBQSxHQUFBVixDQUFBLElBQUFBLENBQUEsQ0FBQUksU0FBQSxZQUFBbUIsU0FBQSxHQUFBdkIsQ0FBQSxHQUFBdUIsU0FBQSxFQUFBWCxDQUFBLEdBQUFULE1BQUEsQ0FBQXFCLE1BQUEsQ0FBQWQsQ0FBQSxDQUFBTixTQUFBLEdBQUFVLENBQUEsT0FBQVcsT0FBQSxDQUFBcEIsQ0FBQSxnQkFBQUUsQ0FBQSxDQUFBSyxDQUFBLGVBQUFILEtBQUEsRUFBQWlCLGdCQUFBLENBQUF6QixDQUFBLEVBQUFDLENBQUEsRUFBQVksQ0FBQSxNQUFBRixDQUFBLGFBQUFlLFNBQUExQixDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxtQkFBQTBCLElBQUEsWUFBQUMsR0FBQSxFQUFBNUIsQ0FBQSxDQUFBNkIsSUFBQSxDQUFBOUIsQ0FBQSxFQUFBRSxDQUFBLGNBQUFELENBQUEsYUFBQTJCLElBQUEsV0FBQUMsR0FBQSxFQUFBNUIsQ0FBQSxRQUFBRCxDQUFBLENBQUFzQixJQUFBLEdBQUFBLElBQUEsTUFBQVMsQ0FBQSxxQkFBQUMsQ0FBQSxxQkFBQUMsQ0FBQSxnQkFBQUMsQ0FBQSxnQkFBQUMsQ0FBQSxnQkFBQVosVUFBQSxjQUFBYSxrQkFBQSxjQUFBQywyQkFBQSxTQUFBQyxDQUFBLE9BQUFwQixNQUFBLENBQUFvQixDQUFBLEVBQUExQixDQUFBLHFDQUFBMkIsQ0FBQSxHQUFBcEMsTUFBQSxDQUFBcUMsY0FBQSxFQUFBQyxDQUFBLEdBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBQSxDQUFBLENBQUFHLE1BQUEsUUFBQUQsQ0FBQSxJQUFBQSxDQUFBLEtBQUF2QyxDQUFBLElBQUFHLENBQUEsQ0FBQXlCLElBQUEsQ0FBQVcsQ0FBQSxFQUFBN0IsQ0FBQSxNQUFBMEIsQ0FBQSxHQUFBRyxDQUFBLE9BQUFFLENBQUEsR0FBQU4sMEJBQUEsQ0FBQWpDLFNBQUEsR0FBQW1CLFNBQUEsQ0FBQW5CLFNBQUEsR0FBQUQsTUFBQSxDQUFBcUIsTUFBQSxDQUFBYyxDQUFBLFlBQUFNLHNCQUFBM0MsQ0FBQSxnQ0FBQTRDLE9BQUEsV0FBQTdDLENBQUEsSUFBQWtCLE1BQUEsQ0FBQWpCLENBQUEsRUFBQUQsQ0FBQSxZQUFBQyxDQUFBLGdCQUFBNkMsT0FBQSxDQUFBOUMsQ0FBQSxFQUFBQyxDQUFBLHNCQUFBOEMsY0FBQTlDLENBQUEsRUFBQUQsQ0FBQSxhQUFBZ0QsT0FBQTlDLENBQUEsRUFBQUssQ0FBQSxFQUFBRyxDQUFBLEVBQUFFLENBQUEsUUFBQUUsQ0FBQSxHQUFBYSxRQUFBLENBQUExQixDQUFBLENBQUFDLENBQUEsR0FBQUQsQ0FBQSxFQUFBTSxDQUFBLG1CQUFBTyxDQUFBLENBQUFjLElBQUEsUUFBQVosQ0FBQSxHQUFBRixDQUFBLENBQUFlLEdBQUEsRUFBQUUsQ0FBQSxHQUFBZixDQUFBLENBQUFQLEtBQUEsU0FBQXNCLENBQUEsdUJBQUFBLENBQUEsSUFBQTFCLENBQUEsQ0FBQXlCLElBQUEsQ0FBQUMsQ0FBQSxlQUFBL0IsQ0FBQSxDQUFBaUQsT0FBQSxDQUFBbEIsQ0FBQSxDQUFBbUIsT0FBQSxFQUFBQyxJQUFBLFdBQUFsRCxDQUFBLElBQUErQyxNQUFBLFNBQUEvQyxDQUFBLEVBQUFTLENBQUEsRUFBQUUsQ0FBQSxnQkFBQVgsQ0FBQSxJQUFBK0MsTUFBQSxVQUFBL0MsQ0FBQSxFQUFBUyxDQUFBLEVBQUFFLENBQUEsUUFBQVosQ0FBQSxDQUFBaUQsT0FBQSxDQUFBbEIsQ0FBQSxFQUFBb0IsSUFBQSxXQUFBbEQsQ0FBQSxJQUFBZSxDQUFBLENBQUFQLEtBQUEsR0FBQVIsQ0FBQSxFQUFBUyxDQUFBLENBQUFNLENBQUEsZ0JBQUFmLENBQUEsV0FBQStDLE1BQUEsVUFBQS9DLENBQUEsRUFBQVMsQ0FBQSxFQUFBRSxDQUFBLFNBQUFBLENBQUEsQ0FBQUUsQ0FBQSxDQUFBZSxHQUFBLFNBQUEzQixDQUFBLEVBQUFLLENBQUEsb0JBQUFFLEtBQUEsV0FBQUEsTUFBQVIsQ0FBQSxFQUFBSSxDQUFBLGFBQUErQywyQkFBQSxlQUFBcEQsQ0FBQSxXQUFBQSxDQUFBLEVBQUFFLENBQUEsSUFBQThDLE1BQUEsQ0FBQS9DLENBQUEsRUFBQUksQ0FBQSxFQUFBTCxDQUFBLEVBQUFFLENBQUEsZ0JBQUFBLENBQUEsR0FBQUEsQ0FBQSxHQUFBQSxDQUFBLENBQUFpRCxJQUFBLENBQUFDLDBCQUFBLEVBQUFBLDBCQUFBLElBQUFBLDBCQUFBLHFCQUFBMUIsaUJBQUExQixDQUFBLEVBQUFFLENBQUEsRUFBQUcsQ0FBQSxRQUFBRSxDQUFBLEdBQUF3QixDQUFBLG1CQUFBckIsQ0FBQSxFQUFBRSxDQUFBLFFBQUFMLENBQUEsS0FBQTBCLENBQUEsWUFBQW9CLEtBQUEsc0NBQUE5QyxDQUFBLEtBQUEyQixDQUFBLG9CQUFBeEIsQ0FBQSxRQUFBRSxDQUFBLFdBQUFILEtBQUEsRUFBQVIsQ0FBQSxFQUFBcUQsSUFBQSxlQUFBakQsQ0FBQSxDQUFBa0QsTUFBQSxHQUFBN0MsQ0FBQSxFQUFBTCxDQUFBLENBQUF3QixHQUFBLEdBQUFqQixDQUFBLFVBQUFFLENBQUEsR0FBQVQsQ0FBQSxDQUFBbUQsUUFBQSxNQUFBMUMsQ0FBQSxRQUFBRSxDQUFBLEdBQUF5QyxtQkFBQSxDQUFBM0MsQ0FBQSxFQUFBVCxDQUFBLE9BQUFXLENBQUEsUUFBQUEsQ0FBQSxLQUFBbUIsQ0FBQSxtQkFBQW5CLENBQUEscUJBQUFYLENBQUEsQ0FBQWtELE1BQUEsRUFBQWxELENBQUEsQ0FBQXFELElBQUEsR0FBQXJELENBQUEsQ0FBQXNELEtBQUEsR0FBQXRELENBQUEsQ0FBQXdCLEdBQUEsc0JBQUF4QixDQUFBLENBQUFrRCxNQUFBLFFBQUFoRCxDQUFBLEtBQUF3QixDQUFBLFFBQUF4QixDQUFBLEdBQUEyQixDQUFBLEVBQUE3QixDQUFBLENBQUF3QixHQUFBLEVBQUF4QixDQUFBLENBQUF1RCxpQkFBQSxDQUFBdkQsQ0FBQSxDQUFBd0IsR0FBQSx1QkFBQXhCLENBQUEsQ0FBQWtELE1BQUEsSUFBQWxELENBQUEsQ0FBQXdELE1BQUEsV0FBQXhELENBQUEsQ0FBQXdCLEdBQUEsR0FBQXRCLENBQUEsR0FBQTBCLENBQUEsTUFBQUssQ0FBQSxHQUFBWCxRQUFBLENBQUEzQixDQUFBLEVBQUFFLENBQUEsRUFBQUcsQ0FBQSxvQkFBQWlDLENBQUEsQ0FBQVYsSUFBQSxRQUFBckIsQ0FBQSxHQUFBRixDQUFBLENBQUFpRCxJQUFBLEdBQUFwQixDQUFBLEdBQUFGLENBQUEsRUFBQU0sQ0FBQSxDQUFBVCxHQUFBLEtBQUFNLENBQUEscUJBQUExQixLQUFBLEVBQUE2QixDQUFBLENBQUFULEdBQUEsRUFBQXlCLElBQUEsRUFBQWpELENBQUEsQ0FBQWlELElBQUEsa0JBQUFoQixDQUFBLENBQUFWLElBQUEsS0FBQXJCLENBQUEsR0FBQTJCLENBQUEsRUFBQTdCLENBQUEsQ0FBQWtELE1BQUEsWUFBQWxELENBQUEsQ0FBQXdCLEdBQUEsR0FBQVMsQ0FBQSxDQUFBVCxHQUFBLG1CQUFBNEIsb0JBQUF6RCxDQUFBLEVBQUFFLENBQUEsUUFBQUcsQ0FBQSxHQUFBSCxDQUFBLENBQUFxRCxNQUFBLEVBQUFoRCxDQUFBLEdBQUFQLENBQUEsQ0FBQWEsUUFBQSxDQUFBUixDQUFBLE9BQUFFLENBQUEsS0FBQU4sQ0FBQSxTQUFBQyxDQUFBLENBQUFzRCxRQUFBLHFCQUFBbkQsQ0FBQSxJQUFBTCxDQUFBLENBQUFhLFFBQUEsQ0FBQWlELE1BQUEsS0FBQTVELENBQUEsQ0FBQXFELE1BQUEsYUFBQXJELENBQUEsQ0FBQTJCLEdBQUEsR0FBQTVCLENBQUEsRUFBQXdELG1CQUFBLENBQUF6RCxDQUFBLEVBQUFFLENBQUEsZUFBQUEsQ0FBQSxDQUFBcUQsTUFBQSxrQkFBQWxELENBQUEsS0FBQUgsQ0FBQSxDQUFBcUQsTUFBQSxZQUFBckQsQ0FBQSxDQUFBMkIsR0FBQSxPQUFBa0MsU0FBQSx1Q0FBQTFELENBQUEsaUJBQUE4QixDQUFBLE1BQUF6QixDQUFBLEdBQUFpQixRQUFBLENBQUFwQixDQUFBLEVBQUFQLENBQUEsQ0FBQWEsUUFBQSxFQUFBWCxDQUFBLENBQUEyQixHQUFBLG1CQUFBbkIsQ0FBQSxDQUFBa0IsSUFBQSxTQUFBMUIsQ0FBQSxDQUFBcUQsTUFBQSxZQUFBckQsQ0FBQSxDQUFBMkIsR0FBQSxHQUFBbkIsQ0FBQSxDQUFBbUIsR0FBQSxFQUFBM0IsQ0FBQSxDQUFBc0QsUUFBQSxTQUFBckIsQ0FBQSxNQUFBdkIsQ0FBQSxHQUFBRixDQUFBLENBQUFtQixHQUFBLFNBQUFqQixDQUFBLEdBQUFBLENBQUEsQ0FBQTBDLElBQUEsSUFBQXBELENBQUEsQ0FBQUYsQ0FBQSxDQUFBZ0UsVUFBQSxJQUFBcEQsQ0FBQSxDQUFBSCxLQUFBLEVBQUFQLENBQUEsQ0FBQStELElBQUEsR0FBQWpFLENBQUEsQ0FBQWtFLE9BQUEsZUFBQWhFLENBQUEsQ0FBQXFELE1BQUEsS0FBQXJELENBQUEsQ0FBQXFELE1BQUEsV0FBQXJELENBQUEsQ0FBQTJCLEdBQUEsR0FBQTVCLENBQUEsR0FBQUMsQ0FBQSxDQUFBc0QsUUFBQSxTQUFBckIsQ0FBQSxJQUFBdkIsQ0FBQSxJQUFBVixDQUFBLENBQUFxRCxNQUFBLFlBQUFyRCxDQUFBLENBQUEyQixHQUFBLE9BQUFrQyxTQUFBLHNDQUFBN0QsQ0FBQSxDQUFBc0QsUUFBQSxTQUFBckIsQ0FBQSxjQUFBZ0MsYUFBQWxFLENBQUEsUUFBQUQsQ0FBQSxLQUFBb0UsTUFBQSxFQUFBbkUsQ0FBQSxZQUFBQSxDQUFBLEtBQUFELENBQUEsQ0FBQXFFLFFBQUEsR0FBQXBFLENBQUEsV0FBQUEsQ0FBQSxLQUFBRCxDQUFBLENBQUFzRSxVQUFBLEdBQUFyRSxDQUFBLEtBQUFELENBQUEsQ0FBQXVFLFFBQUEsR0FBQXRFLENBQUEsV0FBQXVFLFVBQUEsQ0FBQUMsSUFBQSxDQUFBekUsQ0FBQSxjQUFBMEUsY0FBQXpFLENBQUEsUUFBQUQsQ0FBQSxHQUFBQyxDQUFBLENBQUEwRSxVQUFBLFFBQUEzRSxDQUFBLENBQUE0QixJQUFBLG9CQUFBNUIsQ0FBQSxDQUFBNkIsR0FBQSxFQUFBNUIsQ0FBQSxDQUFBMEUsVUFBQSxHQUFBM0UsQ0FBQSxhQUFBeUIsUUFBQXhCLENBQUEsU0FBQXVFLFVBQUEsTUFBQUosTUFBQSxhQUFBbkUsQ0FBQSxDQUFBNEMsT0FBQSxDQUFBc0IsWUFBQSxjQUFBUyxLQUFBLGlCQUFBbEMsT0FBQTFDLENBQUEsUUFBQUEsQ0FBQSxXQUFBQSxDQUFBLFFBQUFFLENBQUEsR0FBQUYsQ0FBQSxDQUFBWSxDQUFBLE9BQUFWLENBQUEsU0FBQUEsQ0FBQSxDQUFBNEIsSUFBQSxDQUFBOUIsQ0FBQSw0QkFBQUEsQ0FBQSxDQUFBaUUsSUFBQSxTQUFBakUsQ0FBQSxPQUFBNkUsS0FBQSxDQUFBN0UsQ0FBQSxDQUFBOEUsTUFBQSxTQUFBdkUsQ0FBQSxPQUFBRyxDQUFBLFlBQUF1RCxLQUFBLGFBQUExRCxDQUFBLEdBQUFQLENBQUEsQ0FBQThFLE1BQUEsT0FBQXpFLENBQUEsQ0FBQXlCLElBQUEsQ0FBQTlCLENBQUEsRUFBQU8sQ0FBQSxVQUFBMEQsSUFBQSxDQUFBeEQsS0FBQSxHQUFBVCxDQUFBLENBQUFPLENBQUEsR0FBQTBELElBQUEsQ0FBQVgsSUFBQSxPQUFBVyxJQUFBLFNBQUFBLElBQUEsQ0FBQXhELEtBQUEsR0FBQVIsQ0FBQSxFQUFBZ0UsSUFBQSxDQUFBWCxJQUFBLE9BQUFXLElBQUEsWUFBQXZELENBQUEsQ0FBQXVELElBQUEsR0FBQXZELENBQUEsZ0JBQUFxRCxTQUFBLFFBQUEvRCxDQUFBLGlDQUFBb0MsaUJBQUEsQ0FBQWhDLFNBQUEsR0FBQWlDLDBCQUFBLEVBQUE5QixDQUFBLENBQUFvQyxDQUFBLG1CQUFBbEMsS0FBQSxFQUFBNEIsMEJBQUEsRUFBQWpCLFlBQUEsU0FBQWIsQ0FBQSxDQUFBOEIsMEJBQUEsbUJBQUE1QixLQUFBLEVBQUEyQixpQkFBQSxFQUFBaEIsWUFBQSxTQUFBZ0IsaUJBQUEsQ0FBQTJDLFdBQUEsR0FBQTdELE1BQUEsQ0FBQW1CLDBCQUFBLEVBQUFyQixDQUFBLHdCQUFBaEIsQ0FBQSxDQUFBZ0YsbUJBQUEsYUFBQS9FLENBQUEsUUFBQUQsQ0FBQSx3QkFBQUMsQ0FBQSxJQUFBQSxDQUFBLENBQUFnRixXQUFBLFdBQUFqRixDQUFBLEtBQUFBLENBQUEsS0FBQW9DLGlCQUFBLDZCQUFBcEMsQ0FBQSxDQUFBK0UsV0FBQSxJQUFBL0UsQ0FBQSxDQUFBa0YsSUFBQSxPQUFBbEYsQ0FBQSxDQUFBbUYsSUFBQSxhQUFBbEYsQ0FBQSxXQUFBRSxNQUFBLENBQUFpRixjQUFBLEdBQUFqRixNQUFBLENBQUFpRixjQUFBLENBQUFuRixDQUFBLEVBQUFvQywwQkFBQSxLQUFBcEMsQ0FBQSxDQUFBb0YsU0FBQSxHQUFBaEQsMEJBQUEsRUFBQW5CLE1BQUEsQ0FBQWpCLENBQUEsRUFBQWUsQ0FBQSx5QkFBQWYsQ0FBQSxDQUFBRyxTQUFBLEdBQUFELE1BQUEsQ0FBQXFCLE1BQUEsQ0FBQW1CLENBQUEsR0FBQTFDLENBQUEsS0FBQUQsQ0FBQSxDQUFBc0YsS0FBQSxhQUFBckYsQ0FBQSxhQUFBaUQsT0FBQSxFQUFBakQsQ0FBQSxPQUFBMkMscUJBQUEsQ0FBQUcsYUFBQSxDQUFBM0MsU0FBQSxHQUFBYyxNQUFBLENBQUE2QixhQUFBLENBQUEzQyxTQUFBLEVBQUFVLENBQUEsaUNBQUFkLENBQUEsQ0FBQStDLGFBQUEsR0FBQUEsYUFBQSxFQUFBL0MsQ0FBQSxDQUFBdUYsS0FBQSxhQUFBdEYsQ0FBQSxFQUFBQyxDQUFBLEVBQUFHLENBQUEsRUFBQUUsQ0FBQSxFQUFBRyxDQUFBLGVBQUFBLENBQUEsS0FBQUEsQ0FBQSxHQUFBOEUsT0FBQSxPQUFBNUUsQ0FBQSxPQUFBbUMsYUFBQSxDQUFBekIsSUFBQSxDQUFBckIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFHLENBQUEsRUFBQUUsQ0FBQSxHQUFBRyxDQUFBLFVBQUFWLENBQUEsQ0FBQWdGLG1CQUFBLENBQUE5RSxDQUFBLElBQUFVLENBQUEsR0FBQUEsQ0FBQSxDQUFBcUQsSUFBQSxHQUFBZCxJQUFBLFdBQUFsRCxDQUFBLFdBQUFBLENBQUEsQ0FBQXFELElBQUEsR0FBQXJELENBQUEsQ0FBQVEsS0FBQSxHQUFBRyxDQUFBLENBQUFxRCxJQUFBLFdBQUFyQixxQkFBQSxDQUFBRCxDQUFBLEdBQUF6QixNQUFBLENBQUF5QixDQUFBLEVBQUEzQixDQUFBLGdCQUFBRSxNQUFBLENBQUF5QixDQUFBLEVBQUEvQixDQUFBLGlDQUFBTSxNQUFBLENBQUF5QixDQUFBLDZEQUFBM0MsQ0FBQSxDQUFBeUYsSUFBQSxhQUFBeEYsQ0FBQSxRQUFBRCxDQUFBLEdBQUFHLE1BQUEsQ0FBQUYsQ0FBQSxHQUFBQyxDQUFBLGdCQUFBRyxDQUFBLElBQUFMLENBQUEsRUFBQUUsQ0FBQSxDQUFBdUUsSUFBQSxDQUFBcEUsQ0FBQSxVQUFBSCxDQUFBLENBQUF3RixPQUFBLGFBQUF6QixLQUFBLFdBQUEvRCxDQUFBLENBQUE0RSxNQUFBLFNBQUE3RSxDQUFBLEdBQUFDLENBQUEsQ0FBQXlGLEdBQUEsUUFBQTFGLENBQUEsSUFBQUQsQ0FBQSxTQUFBaUUsSUFBQSxDQUFBeEQsS0FBQSxHQUFBUixDQUFBLEVBQUFnRSxJQUFBLENBQUFYLElBQUEsT0FBQVcsSUFBQSxXQUFBQSxJQUFBLENBQUFYLElBQUEsT0FBQVcsSUFBQSxRQUFBakUsQ0FBQSxDQUFBMEMsTUFBQSxHQUFBQSxNQUFBLEVBQUFqQixPQUFBLENBQUFyQixTQUFBLEtBQUE2RSxXQUFBLEVBQUF4RCxPQUFBLEVBQUFtRCxLQUFBLFdBQUFBLE1BQUE1RSxDQUFBLGFBQUE0RixJQUFBLFdBQUEzQixJQUFBLFdBQUFQLElBQUEsUUFBQUMsS0FBQSxHQUFBMUQsQ0FBQSxPQUFBcUQsSUFBQSxZQUFBRSxRQUFBLGNBQUFELE1BQUEsZ0JBQUExQixHQUFBLEdBQUE1QixDQUFBLE9BQUF1RSxVQUFBLENBQUEzQixPQUFBLENBQUE2QixhQUFBLElBQUExRSxDQUFBLFdBQUFFLENBQUEsa0JBQUFBLENBQUEsQ0FBQTJGLE1BQUEsT0FBQXhGLENBQUEsQ0FBQXlCLElBQUEsT0FBQTVCLENBQUEsTUFBQTJFLEtBQUEsRUFBQTNFLENBQUEsQ0FBQTRGLEtBQUEsY0FBQTVGLENBQUEsSUFBQUQsQ0FBQSxNQUFBOEYsSUFBQSxXQUFBQSxLQUFBLFNBQUF6QyxJQUFBLFdBQUFyRCxDQUFBLFFBQUF1RSxVQUFBLElBQUFHLFVBQUEsa0JBQUExRSxDQUFBLENBQUEyQixJQUFBLFFBQUEzQixDQUFBLENBQUE0QixHQUFBLGNBQUFtRSxJQUFBLEtBQUFwQyxpQkFBQSxXQUFBQSxrQkFBQTVELENBQUEsYUFBQXNELElBQUEsUUFBQXRELENBQUEsTUFBQUUsQ0FBQSxrQkFBQStGLE9BQUE1RixDQUFBLEVBQUFFLENBQUEsV0FBQUssQ0FBQSxDQUFBZ0IsSUFBQSxZQUFBaEIsQ0FBQSxDQUFBaUIsR0FBQSxHQUFBN0IsQ0FBQSxFQUFBRSxDQUFBLENBQUErRCxJQUFBLEdBQUE1RCxDQUFBLEVBQUFFLENBQUEsS0FBQUwsQ0FBQSxDQUFBcUQsTUFBQSxXQUFBckQsQ0FBQSxDQUFBMkIsR0FBQSxHQUFBNUIsQ0FBQSxLQUFBTSxDQUFBLGFBQUFBLENBQUEsUUFBQWlFLFVBQUEsQ0FBQU0sTUFBQSxNQUFBdkUsQ0FBQSxTQUFBQSxDQUFBLFFBQUFHLENBQUEsUUFBQThELFVBQUEsQ0FBQWpFLENBQUEsR0FBQUssQ0FBQSxHQUFBRixDQUFBLENBQUFpRSxVQUFBLGlCQUFBakUsQ0FBQSxDQUFBMEQsTUFBQSxTQUFBNkIsTUFBQSxhQUFBdkYsQ0FBQSxDQUFBMEQsTUFBQSxTQUFBd0IsSUFBQSxRQUFBOUUsQ0FBQSxHQUFBVCxDQUFBLENBQUF5QixJQUFBLENBQUFwQixDQUFBLGVBQUFNLENBQUEsR0FBQVgsQ0FBQSxDQUFBeUIsSUFBQSxDQUFBcEIsQ0FBQSxxQkFBQUksQ0FBQSxJQUFBRSxDQUFBLGFBQUE0RSxJQUFBLEdBQUFsRixDQUFBLENBQUEyRCxRQUFBLFNBQUE0QixNQUFBLENBQUF2RixDQUFBLENBQUEyRCxRQUFBLGdCQUFBdUIsSUFBQSxHQUFBbEYsQ0FBQSxDQUFBNEQsVUFBQSxTQUFBMkIsTUFBQSxDQUFBdkYsQ0FBQSxDQUFBNEQsVUFBQSxjQUFBeEQsQ0FBQSxhQUFBOEUsSUFBQSxHQUFBbEYsQ0FBQSxDQUFBMkQsUUFBQSxTQUFBNEIsTUFBQSxDQUFBdkYsQ0FBQSxDQUFBMkQsUUFBQSxxQkFBQXJELENBQUEsWUFBQXFDLEtBQUEscURBQUF1QyxJQUFBLEdBQUFsRixDQUFBLENBQUE0RCxVQUFBLFNBQUEyQixNQUFBLENBQUF2RixDQUFBLENBQUE0RCxVQUFBLFlBQUFULE1BQUEsV0FBQUEsT0FBQTVELENBQUEsRUFBQUQsQ0FBQSxhQUFBRSxDQUFBLFFBQUFzRSxVQUFBLENBQUFNLE1BQUEsTUFBQTVFLENBQUEsU0FBQUEsQ0FBQSxRQUFBSyxDQUFBLFFBQUFpRSxVQUFBLENBQUF0RSxDQUFBLE9BQUFLLENBQUEsQ0FBQTZELE1BQUEsU0FBQXdCLElBQUEsSUFBQXZGLENBQUEsQ0FBQXlCLElBQUEsQ0FBQXZCLENBQUEsd0JBQUFxRixJQUFBLEdBQUFyRixDQUFBLENBQUErRCxVQUFBLFFBQUE1RCxDQUFBLEdBQUFILENBQUEsYUFBQUcsQ0FBQSxpQkFBQVQsQ0FBQSxtQkFBQUEsQ0FBQSxLQUFBUyxDQUFBLENBQUEwRCxNQUFBLElBQUFwRSxDQUFBLElBQUFBLENBQUEsSUFBQVUsQ0FBQSxDQUFBNEQsVUFBQSxLQUFBNUQsQ0FBQSxjQUFBRSxDQUFBLEdBQUFGLENBQUEsR0FBQUEsQ0FBQSxDQUFBaUUsVUFBQSxjQUFBL0QsQ0FBQSxDQUFBZ0IsSUFBQSxHQUFBM0IsQ0FBQSxFQUFBVyxDQUFBLENBQUFpQixHQUFBLEdBQUE3QixDQUFBLEVBQUFVLENBQUEsU0FBQTZDLE1BQUEsZ0JBQUFVLElBQUEsR0FBQXZELENBQUEsQ0FBQTRELFVBQUEsRUFBQW5DLENBQUEsU0FBQStELFFBQUEsQ0FBQXRGLENBQUEsTUFBQXNGLFFBQUEsV0FBQUEsU0FBQWpHLENBQUEsRUFBQUQsQ0FBQSxvQkFBQUMsQ0FBQSxDQUFBMkIsSUFBQSxRQUFBM0IsQ0FBQSxDQUFBNEIsR0FBQSxxQkFBQTVCLENBQUEsQ0FBQTJCLElBQUEsbUJBQUEzQixDQUFBLENBQUEyQixJQUFBLFFBQUFxQyxJQUFBLEdBQUFoRSxDQUFBLENBQUE0QixHQUFBLGdCQUFBNUIsQ0FBQSxDQUFBMkIsSUFBQSxTQUFBb0UsSUFBQSxRQUFBbkUsR0FBQSxHQUFBNUIsQ0FBQSxDQUFBNEIsR0FBQSxPQUFBMEIsTUFBQSxrQkFBQVUsSUFBQSx5QkFBQWhFLENBQUEsQ0FBQTJCLElBQUEsSUFBQTVCLENBQUEsVUFBQWlFLElBQUEsR0FBQWpFLENBQUEsR0FBQW1DLENBQUEsS0FBQWdFLE1BQUEsV0FBQUEsT0FBQWxHLENBQUEsYUFBQUQsQ0FBQSxRQUFBd0UsVUFBQSxDQUFBTSxNQUFBLE1BQUE5RSxDQUFBLFNBQUFBLENBQUEsUUFBQUUsQ0FBQSxRQUFBc0UsVUFBQSxDQUFBeEUsQ0FBQSxPQUFBRSxDQUFBLENBQUFvRSxVQUFBLEtBQUFyRSxDQUFBLGNBQUFpRyxRQUFBLENBQUFoRyxDQUFBLENBQUF5RSxVQUFBLEVBQUF6RSxDQUFBLENBQUFxRSxRQUFBLEdBQUFHLGFBQUEsQ0FBQXhFLENBQUEsR0FBQWlDLENBQUEsT0FBQWlFLEtBQUEsV0FBQUMsT0FBQXBHLENBQUEsYUFBQUQsQ0FBQSxRQUFBd0UsVUFBQSxDQUFBTSxNQUFBLE1BQUE5RSxDQUFBLFNBQUFBLENBQUEsUUFBQUUsQ0FBQSxRQUFBc0UsVUFBQSxDQUFBeEUsQ0FBQSxPQUFBRSxDQUFBLENBQUFrRSxNQUFBLEtBQUFuRSxDQUFBLFFBQUFJLENBQUEsR0FBQUgsQ0FBQSxDQUFBeUUsVUFBQSxrQkFBQXRFLENBQUEsQ0FBQXVCLElBQUEsUUFBQXJCLENBQUEsR0FBQUYsQ0FBQSxDQUFBd0IsR0FBQSxFQUFBNkMsYUFBQSxDQUFBeEUsQ0FBQSxZQUFBSyxDQUFBLGdCQUFBOEMsS0FBQSw4QkFBQWlELGFBQUEsV0FBQUEsY0FBQXRHLENBQUEsRUFBQUUsQ0FBQSxFQUFBRyxDQUFBLGdCQUFBbUQsUUFBQSxLQUFBM0MsUUFBQSxFQUFBNkIsTUFBQSxDQUFBMUMsQ0FBQSxHQUFBZ0UsVUFBQSxFQUFBOUQsQ0FBQSxFQUFBZ0UsT0FBQSxFQUFBN0QsQ0FBQSxvQkFBQWtELE1BQUEsVUFBQTFCLEdBQUEsR0FBQTVCLENBQUEsR0FBQWtDLENBQUEsT0FBQW5DLENBQUE7QUFBQSxTQUFBeWIsUUFBQXpiLENBQUEsRUFBQUUsQ0FBQSxRQUFBRCxDQUFBLEdBQUFFLE1BQUEsQ0FBQXNGLElBQUEsQ0FBQXpGLENBQUEsT0FBQUcsTUFBQSxDQUFBdWIscUJBQUEsUUFBQW5iLENBQUEsR0FBQUosTUFBQSxDQUFBdWIscUJBQUEsQ0FBQTFiLENBQUEsR0FBQUUsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQXlRLE1BQUEsV0FBQTlRLENBQUEsV0FBQUMsTUFBQSxDQUFBd2Isd0JBQUEsQ0FBQTNiLENBQUEsRUFBQUUsQ0FBQSxFQUFBaUIsVUFBQSxPQUFBbEIsQ0FBQSxDQUFBd0UsSUFBQSxDQUFBMkMsS0FBQSxDQUFBbkgsQ0FBQSxFQUFBTSxDQUFBLFlBQUFOLENBQUE7QUFBQSxTQUFBc1AsY0FBQXZQLENBQUEsYUFBQUUsQ0FBQSxNQUFBQSxDQUFBLEdBQUFpSCxTQUFBLENBQUFyQyxNQUFBLEVBQUE1RSxDQUFBLFVBQUFELENBQUEsV0FBQWtILFNBQUEsQ0FBQWpILENBQUEsSUFBQWlILFNBQUEsQ0FBQWpILENBQUEsUUFBQUEsQ0FBQSxPQUFBdWIsT0FBQSxDQUFBdGIsTUFBQSxDQUFBRixDQUFBLE9BQUE0QyxPQUFBLFdBQUEzQyxDQUFBLElBQUFrUixlQUFBLENBQUFwUixDQUFBLEVBQUFFLENBQUEsRUFBQUQsQ0FBQSxDQUFBQyxDQUFBLFNBQUFDLE1BQUEsQ0FBQXliLHlCQUFBLEdBQUF6YixNQUFBLENBQUEwYixnQkFBQSxDQUFBN2IsQ0FBQSxFQUFBRyxNQUFBLENBQUF5Yix5QkFBQSxDQUFBM2IsQ0FBQSxLQUFBd2IsT0FBQSxDQUFBdGIsTUFBQSxDQUFBRixDQUFBLEdBQUE0QyxPQUFBLFdBQUEzQyxDQUFBLElBQUFDLE1BQUEsQ0FBQUssY0FBQSxDQUFBUixDQUFBLEVBQUFFLENBQUEsRUFBQUMsTUFBQSxDQUFBd2Isd0JBQUEsQ0FBQTFiLENBQUEsRUFBQUMsQ0FBQSxpQkFBQUYsQ0FBQTtBQUFBLFNBQUFvUixnQkFBQTRELEdBQUEsRUFBQXBPLEdBQUEsRUFBQW5HLEtBQUEsSUFBQW1HLEdBQUEsR0FBQWtWLGNBQUEsQ0FBQWxWLEdBQUEsT0FBQUEsR0FBQSxJQUFBb08sR0FBQSxJQUFBN1UsTUFBQSxDQUFBSyxjQUFBLENBQUF3VSxHQUFBLEVBQUFwTyxHQUFBLElBQUFuRyxLQUFBLEVBQUFBLEtBQUEsRUFBQVUsVUFBQSxRQUFBQyxZQUFBLFFBQUFDLFFBQUEsb0JBQUEyVCxHQUFBLENBQUFwTyxHQUFBLElBQUFuRyxLQUFBLFdBQUF1VSxHQUFBO0FBQUEsU0FBQThHLGVBQUFqYSxHQUFBLFFBQUErRSxHQUFBLEdBQUFtVixZQUFBLENBQUFsYSxHQUFBLDJCQUFBK0UsR0FBQSxnQkFBQUEsR0FBQSxHQUFBb1YsTUFBQSxDQUFBcFYsR0FBQTtBQUFBLFNBQUFtVixhQUFBRSxLQUFBLEVBQUFDLElBQUEsZUFBQUQsS0FBQSxpQkFBQUEsS0FBQSxrQkFBQUEsS0FBQSxNQUFBRSxJQUFBLEdBQUFGLEtBQUEsQ0FBQXRiLE1BQUEsQ0FBQXliLFdBQUEsT0FBQUQsSUFBQSxLQUFBN1UsU0FBQSxRQUFBNFMsR0FBQSxHQUFBaUMsSUFBQSxDQUFBcmEsSUFBQSxDQUFBbWEsS0FBQSxFQUFBQyxJQUFBLDJCQUFBaEMsR0FBQSxzQkFBQUEsR0FBQSxZQUFBblcsU0FBQSw0REFBQW1ZLElBQUEsZ0JBQUFGLE1BQUEsR0FBQUssTUFBQSxFQUFBSixLQUFBO0FBQUEsU0FBQTFWLG1CQUFBQyxHQUFBLEVBQUF2RCxPQUFBLEVBQUF3RCxNQUFBLEVBQUFDLEtBQUEsRUFBQUMsTUFBQSxFQUFBQyxHQUFBLEVBQUEvRSxHQUFBLGNBQUFnRixJQUFBLEdBQUFMLEdBQUEsQ0FBQUksR0FBQSxFQUFBL0UsR0FBQSxPQUFBcEIsS0FBQSxHQUFBb0csSUFBQSxDQUFBcEcsS0FBQSxXQUFBcUcsS0FBQSxJQUFBTCxNQUFBLENBQUFLLEtBQUEsaUJBQUFELElBQUEsQ0FBQXZELElBQUEsSUFBQUwsT0FBQSxDQUFBeEMsS0FBQSxZQUFBK0UsT0FBQSxDQUFBdkMsT0FBQSxDQUFBeEMsS0FBQSxFQUFBMEMsSUFBQSxDQUFBdUQsS0FBQSxFQUFBQyxNQUFBO0FBQUEsU0FBQUksa0JBQUFDLEVBQUEsNkJBQUFDLElBQUEsU0FBQUMsSUFBQSxHQUFBQyxTQUFBLGFBQUEzQixPQUFBLFdBQUF2QyxPQUFBLEVBQUF3RCxNQUFBLFFBQUFELEdBQUEsR0FBQVEsRUFBQSxDQUFBSSxLQUFBLENBQUFILElBQUEsRUFBQUMsSUFBQSxZQUFBUixNQUFBakcsS0FBQSxJQUFBOEYsa0JBQUEsQ0FBQUMsR0FBQSxFQUFBdkQsT0FBQSxFQUFBd0QsTUFBQSxFQUFBQyxLQUFBLEVBQUFDLE1BQUEsVUFBQWxHLEtBQUEsY0FBQWtHLE9BQUFVLEdBQUEsSUFBQWQsa0JBQUEsQ0FBQUMsR0FBQSxFQUFBdkQsT0FBQSxFQUFBd0QsTUFBQSxFQUFBQyxLQUFBLEVBQUFDLE1BQUEsV0FBQVUsR0FBQSxLQUFBWCxLQUFBLENBQUFZLFNBQUE7QUFnQmU7QUFnQmU7QUFFd0I7QUFPbEI7QUFTRDtBQUVvQjtBQUd2RCxJQUFNK0osUUFBK0MsR0FBRztFQUNwREEsUUFBUTtJQUFBLElBQUFtbUMsU0FBQSxHQUFBendDLGlCQUFBLGVBQUFoSCxtQkFBQSxHQUFBb0YsSUFBQSxDQUFFLFNBQUF5RyxRQUFBeUUsSUFBQTtNQUFBLElBQUEvRSxRQUFBLEVBQUErRyxRQUFBLEVBQUE0RCxTQUFBLEVBQUFvWSxTQUFBLEVBQUErbkIsbUJBQUEsRUFBQXFCLFdBQUEsRUFBQU0sT0FBQSxFQUFBbkMsU0FBQSxFQUFBRyxPQUFBLEVBQUFvQyxNQUFBLEVBQUF0NEIsS0FBQSxFQUFBclUsTUFBQSxFQUFBc3hCLFVBQUEsRUFBQXNiLFNBQUEsRUFBQUMsZ0JBQUEsRUFBQWxDLGdCQUFBLEVBQUFtQyxVQUFBLEVBQUFDLFdBQUEsRUFBQUMsaUJBQUEsRUFBQUMsV0FBQSxFQUFBQyxXQUFBLEVBQUFDLFdBQUEsRUFBQUMsV0FBQSxFQUFBQyxlQUFBLEVBQUFDLE1BQUEsRUFBQUMsUUFBQSxFQUFBQyxnQkFBQSxFQUFBQyxNQUFBLEVBQUFDLFFBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsTUFBQSxFQUFBQyxRQUFBLEVBQUFDLGdCQUFBLEVBQUFDLE1BQUEsRUFBQUMsUUFBQSxFQUFBQyxnQkFBQSxFQUFBQyxNQUFBLEVBQUFDLFFBQUEsRUFBQUMsY0FBQSxFQUFBQyxVQUFBLEVBQUFDLFVBQUEsRUFBQTNmLFVBQUEsRUFBQWxqQixLQUFBLEVBQUE4aUMsYUFBQSxFQUFBQyxPQUFBLEVBQUFqZSxLQUFBLEVBQUFKLE9BQUE7TUFBQSxPQUFBNTdCLG1CQUFBLEdBQUF1QixJQUFBLFVBQUF1SyxTQUFBMmQsU0FBQTtRQUFBLGtCQUFBQSxTQUFBLENBQUE1akIsSUFBQSxHQUFBNGpCLFNBQUEsQ0FBQXZsQixJQUFBO1VBQUE7WUFBUXFILFFBQVEsR0FBQStFLElBQUEsQ0FBUi9FLFFBQVEsRUFBRStHLFFBQVEsR0FBQWhDLElBQUEsQ0FBUmdDLFFBQVE7WUFBQW1YLFNBQUEsQ0FBQXZsQixJQUFBO1lBQUEsT0FDMUJnRyx1REFBSSxDQUFDLENBQUMsQ0FBQztVQUFBO1lBQUFnTSxTQUFBLEdBT1Q1RCxRQUFRLENBQUMsQ0FBQyxFQUpWZ2MsU0FBUyxHQUFBcFksU0FBQSxDQUFUb1ksU0FBUyxFQUFBK25CLG1CQUFBLEdBQUFuZ0MsU0FBQSxDQUNUb1ksU0FBUyxFQUFHb3BCLFdBQVcsR0FBQXJCLG1CQUFBLENBQVhxQixXQUFXLEVBQUVNLE9BQU8sR0FBQTNCLG1CQUFBLENBQVAyQixPQUFPLEVBQUVuQyxTQUFTLEdBQUFRLG1CQUFBLENBQVRSLFNBQVMsRUFBRUcsT0FBTyxHQUFBSyxtQkFBQSxDQUFQTCxPQUFPLEVBQUVvQyxNQUFNLEdBQUEvQixtQkFBQSxDQUFOK0IsTUFBTSxFQUM1RHQ0QixLQUFLLEdBQUE1SixTQUFBLENBQUw0SixLQUFLLEVBQ0xyVSxNQUFNLEdBQUF5SyxTQUFBLENBQU56SyxNQUFNO1lBQUFzeEIsVUFBQSxHQUlOenFCLFFBQVEsQ0FBQyxDQUFDLEVBREUrbEMsU0FBUyxHQUFBdGIsVUFBQSxDQUFyQnpPLFNBQVMsQ0FBRytwQixTQUFTO1lBR25CQyxnQkFBZ0IsR0FBR0QsU0FBUyxDQUFDdHlDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFFckNxd0MsZ0JBQWdCLEdBQUdELHFFQUFtQixDQUFDN25CLFNBQVMsQ0FBQztZQUV2RDtBQUNSO0FBQ0E7QUFDQTtZQUNjaXFCLFVBQVUsR0FBR3RuQyxpREFBTSxDQUNyQixVQUFBd1AsRUFBRTtjQUFBLElBQUFnMEIsZ0JBQUE7Y0FBQSxPQUFJaHNDLGlEQUFRLENBQUNnWSxFQUFFLENBQUNrSSxRQUFRLEdBQUE4ckIsZ0JBQUEsR0FBRWgwQixFQUFFLENBQUNpMEIsWUFBWSxjQUFBRCxnQkFBQSxjQUFBQSxnQkFBQSxHQUFJLEVBQUUsQ0FBQztZQUFBLEdBQ2xENEQsU0FDSixDQUFDO1lBRUQ7QUFDUjtBQUNBO0FBQ0E7QUFDQTtZQUNRQSxTQUFTLEdBQUcvc0IsaURBQVUsQ0FBQytzQixTQUFTLEVBQUVFLFVBQVUsQ0FBQzs7WUFFN0M7QUFDUjtBQUNBO1lBRVlDLFdBQXdCLEdBQUcsRUFBRTtZQUMzQkMsaUJBQThCLEdBQUcsRUFBRTtZQUV6QzkxQyxpREFBTSxDQUFDdTFDLGlEQUFPLENBQVk3Yyx5RUFBbUIsRUFBRWdkLFNBQVMsQ0FBQyxDQUFDLENBQUN2MUMsT0FBTyxDQUM5RCxVQUFBbzNDLEtBQUssRUFBSTtjQUNMLElBQUlBLEtBQUssQ0FBQ24xQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUNwQjtnQkFDQTB6QyxpQkFBaUIsQ0FBQy96QyxJQUFJLENBQUN3MUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2NBQ3BDLENBQUMsTUFBTTtnQkFDSCxJQUFNQyxPQUFPLEdBQUdELEtBQUssQ0FBQ2hhLElBQUksQ0FBQyxVQUFBemYsRUFBRTtrQkFBQSxPQUFJQSxFQUFFLENBQUMrWCxXQUFXO2dCQUFBLEVBQUM7Z0JBQ2hELElBQUkyaEIsT0FBTyxFQUFFO2tCQUNUO2tCQUNBM0IsV0FBVyxDQUFDOXpDLElBQUksQ0FBQ3kxQyxPQUFPLENBQUM7Z0JBQzdCO2dCQUVBLElBQU1DLG1CQUFtQixHQUFHRixLQUFLLENBQUNqcEMsTUFBTSxDQUNwQyxVQUFBd1AsRUFBRTtrQkFBQSxPQUFJQSxFQUFFLEtBQUswNUIsT0FBTztnQkFBQSxDQUN4QixDQUFDO2dCQUNELElBQUlDLG1CQUFtQixDQUFDcjFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7a0JBQ2xDO2tCQUNBMHpDLGlCQUFpQixDQUFDL3pDLElBQUksQ0FBQzAxQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEQsQ0FBQyxNQUFNO2tCQUNIO2tCQUNBNUIsV0FBVyxHQUFHcHNDLGtEQUFNLENBQUNvc0MsV0FBVyxFQUFFNEIsbUJBQW1CLENBQUM7a0JBQ3REM0IsaUJBQWlCLENBQUMvekMsSUFBSSxDQUNsQnl6QyxrREFBUyxDQUNMO29CQUNJMzBCLGNBQWMsRUFBRThWLGtEQUFNLENBQ2xCRixrREFBUyxDQUFDSSxJQUFJLENBQUNDLEdBQUcsQ0FBQyxFQUNuQixDQUFDLENBQUMsRUFDRjVjLGtEQUFLLENBQ0QsZ0JBQWdCLEVBQ2hCdTlCLG1CQUNKLENBQ0osQ0FBQztvQkFDRGpmLGNBQWMsRUFBRWxxQixpREFBTSxDQUNsQixVQUFBb3BDLEdBQUc7c0JBQUEsT0FBSW5KLE9BQU8sQ0FBQ21KLEdBQUcsQ0FBQztvQkFBQSxHQUNuQng5QixrREFBSyxDQUNELGdCQUFnQixFQUNoQnU5QixtQkFDSixDQUNKLENBQUMsQ0FBQ3IwQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2tCQUNqQixDQUFDLEVBQ0RxMEMsbUJBQW1CLENBQUNyMEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNuQyxDQUNKLENBQUM7Z0JBQ0w7Y0FDSjtZQUNKLENBQ0osQ0FBQzs7WUFFRDtBQUNSO0FBQ0E7QUFDQTtBQUNBO1lBQ1FzeUMsU0FBUyxHQUFHSSxpQkFBaUI7O1lBRTdCO0FBQ1I7QUFDQTs7WUFFUTtBQUNSO0FBQ0E7QUFDQTtZQUNjQyxXQUFXLEdBQUcvN0Isa0RBQU8sQ0FDdkJ6TCxrREFBRyxDQUNDLFVBQUFncEMsS0FBSztjQUFBLE9BQUlBLEtBQUssQ0FBQ24wQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQUEsR0FDM0JwRCxpREFBTSxDQUNGdTFDLGlEQUFPLENBQ0g3Yyx5RUFBbUIsRUFDbkJqdkIsa0RBQU0sQ0FBQ3NyQyxXQUFXLEVBQUVXLFNBQVMsQ0FDakMsQ0FDSixDQUNKLENBQ0osQ0FBQztZQUVLTSxXQUFXLEdBQUdoOEIsa0RBQU8sQ0FDdkJ6TCxrREFBRyxDQUNDLFVBQUFncEMsS0FBSztjQUFBLE9BQUlBLEtBQUssQ0FBQ24wQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQUEsR0FDM0JwRCxpREFBTSxDQUNGdTFDLGlEQUFPLENBQ0g3Yyx5RUFBbUIsRUFDbkJqdkIsa0RBQU0sQ0FBQzRyQyxPQUFPLEVBQUVLLFNBQVMsQ0FDN0IsQ0FDSixDQUNKLENBQ0osQ0FBQztZQUVLTyxXQUFXLEdBQUdqOEIsa0RBQU8sQ0FDdkJ6TCxrREFBRyxDQUNDLFVBQUFncEMsS0FBSztjQUFBLE9BQUlBLEtBQUssQ0FBQ24wQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQUEsR0FDM0JwRCxpREFBTSxDQUNGdTFDLGlEQUFPLENBQ0g3Yyx5RUFBbUIsRUFDbkJqdkIsa0RBQU0sQ0FBQ3lwQyxTQUFTLEVBQUV3QyxTQUFTLENBQy9CLENBQ0osQ0FDSixDQUNKLENBQUM7WUFFS1EsV0FBVyxHQUFHbDhCLGtEQUFPLENBQ3ZCekwsa0RBQUcsQ0FDQyxVQUFBZ3BDLEtBQUs7Y0FBQSxPQUFJQSxLQUFLLENBQUNuMEMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUFBLEdBQzNCcEQsaURBQU0sQ0FDRnUxQyxpREFBTyxDQUNIN2MseUVBQW1CLEVBQ25CanZCLGtEQUFNLENBQUM0cEMsT0FBTyxFQUFFcUMsU0FBUyxDQUM3QixDQUNKLENBQ0osQ0FDSixDQUFDO1lBRUQ7QUFDUjtBQUNBO1lBRlFTLGVBQUEsR0FJMkNyZCx3RUFBYyxDQUNyRDRjLFNBQVMsRUFDVHY0QixLQUNKLENBQUMsRUFIYWk1QixNQUFNLEdBQUFELGVBQUEsQ0FBYjljLEtBQUssRUFBbUJnZCxRQUFRLEdBQUFGLGVBQUEsQ0FBakJsZCxPQUFPO1lBQUFxZCxnQkFBQSxHQUljeGQsd0VBQWMsQ0FDckRpYyxXQUFXLEVBQ1g1M0IsS0FDSixDQUFDLEVBSGFvNUIsTUFBTSxHQUFBRCxnQkFBQSxDQUFiamQsS0FBSyxFQUFtQm1kLFFBQVEsR0FBQUYsZ0JBQUEsQ0FBakJyZCxPQUFPO1lBQUF3ZCxnQkFBQSxHQUljM2Qsd0VBQWMsQ0FDckR1YyxPQUFPLEVBQ1BsNEIsS0FDSixDQUFDLEVBSGF1NUIsTUFBTSxHQUFBRCxnQkFBQSxDQUFicGQsS0FBSyxFQUFtQnNkLFFBQVEsR0FBQUYsZ0JBQUEsQ0FBakJ4ZCxPQUFPO1lBQUEyZCxnQkFBQSxHQUljOWQsd0VBQWMsQ0FDckRvYSxTQUFTLEVBQ1QvMUIsS0FDSixDQUFDLEVBSGEwNUIsTUFBTSxHQUFBRCxnQkFBQSxDQUFidmQsS0FBSyxFQUFtQnlkLFFBQVEsR0FBQUYsZ0JBQUEsQ0FBakIzZCxPQUFPO1lBQUE4ZCxnQkFBQSxHQUljamUsd0VBQWMsQ0FDckR1YSxPQUFPLEVBQ1BsMkIsS0FDSixDQUFDLEVBSGE2NUIsTUFBTSxHQUFBRCxnQkFBQSxDQUFiMWQsS0FBSyxFQUFtQjRkLFFBQVEsR0FBQUYsZ0JBQUEsQ0FBakI5ZCxPQUFPO1lBSzdCO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7WUFDUXljLFNBQVMsR0FBR2pzQyxrREFBTSxDQUFDa2YsaURBQVUsQ0FBQytzQixTQUFTLEVBQUVXLFFBQVEsQ0FBQyxFQUFFRCxNQUFNLENBQUM7O1lBRTNEO0FBQ1I7QUFDQTtZQUNZYyxjQUFjLEdBQUcxZiwyRUFBaUIsQ0FDbENyYSxLQUFLLEVBQ0x1NEIsU0FBUyxFQUNUakMsZ0JBQWdCLEVBQ2hCM3FDLE1BQ0osQ0FBQztZQUVHcXVDLFVBQXVCLEdBQUcsRUFBRTtZQUM1QkMsVUFBdUIsR0FBRyxFQUFFO1lBRWhDO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO1lBZlEsTUFpQkksQ0FBQ0YsY0FBYyxDQUFDOTBDLE1BQU0sSUFDdEJzekMsU0FBUyxDQUFDdHpDLE1BQU0sSUFDaEJzekMsU0FBUyxDQUFDdHpDLE1BQU0sS0FBS3F4QyxnQkFBZ0IsQ0FBQ3J4QyxNQUFNO2NBQUEwa0IsU0FBQSxDQUFBdmxCLElBQUE7Y0FBQTtZQUFBO1lBRXhDazJCLFVBQVUsR0FBR2llLFNBQVMsQ0FBQ3R5QyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQUFtUixLQUFBLGdCQUFBbFgsbUJBQUEsR0FBQW9GLElBQUEsVUFBQThSLE1BQUE7Y0FBQSxJQUFBb2pDLGFBQUEsRUFBQUMsb0JBQUEsRUFBQXhlLFFBQUE7Y0FBQSxPQUFBLzdCLG1CQUFBLEdBQUF1QixJQUFBLFVBQUF1b0IsT0FBQS9kLFFBQUE7Z0JBQUEsa0JBQUFBLFFBQUEsQ0FBQWxHLElBQUEsR0FBQWtHLFFBQUEsQ0FBQTdILElBQUE7a0JBQUE7b0JBRy9CO29CQUNBO29CQUNNbzJDLGFBQWEsR0FBR2xnQixVQUFVLENBQUMsQ0FBQyxDQUFDO29CQUVuQ3lmLGNBQWMsQ0FBQ24xQyxJQUFJLENBQUM0MUMsYUFBYSxDQUFDO29CQUNsQ2xnQixVQUFVLEdBQUdBLFVBQVUsQ0FBQ3IwQixLQUFLLENBQUMsQ0FBQyxDQUFDOztvQkFFaEM7b0JBQ0FxMEIsVUFBVSxHQUFHRCwyRUFBaUIsQ0FDMUJyYSxLQUFLLEVBQ0xzYSxVQUFVLEVBQ1Z5ZixjQUNKLENBQUM7O29CQUVEO29CQUNNVSxvQkFBb0IsR0FBR2p2QixpREFBVSxDQUFDOE8sVUFBVSxFQUFFQSxVQUFVLENBQUM7b0JBRXpEMkIsUUFBUSxHQUFHOXFCLGlEQUFNLENBQ25CLFVBQUF3UCxFQUFFO3NCQUFBLE9BQ0UsQ0FBQ0EsRUFBRSxDQUFDaTBCLFlBQVksSUFDaEIsQ0FBQ2pzQyxpREFBUSxDQUFDNnhDLGFBQWEsQ0FBQzN4QixRQUFRLEVBQUVsSSxFQUFFLENBQUNpMEIsWUFBWSxDQUFDO29CQUFBLEdBQ3RENkYsb0JBQ0osQ0FBQztvQkFFRFQsVUFBVSxHQUFHMXRDLGtEQUFNLENBQUMwdEMsVUFBVSxFQUFFL2QsUUFBUSxDQUFDO29CQUN6Q2dlLFVBQVUsR0FBRzN0QyxrREFBTSxDQUNmMnRDLFVBQVUsRUFDVmhlLFFBQVEsQ0FBQzdxQixHQUFHLENBQUMsVUFBQXVQLEVBQUU7c0JBQUEsSUFBQSs1QixpQkFBQTtzQkFBQSxPQUFBaHJDLGFBQUEsQ0FBQUEsYUFBQSxLQUNSaVIsRUFBRTt3QkFDTGkwQixZQUFZLEVBQUV0b0Msa0RBQU0sRUFBQW91QyxpQkFBQSxHQUFDLzVCLEVBQUUsQ0FBQ2kwQixZQUFZLGNBQUE4RixpQkFBQSxjQUFBQSxpQkFBQSxHQUFJLEVBQUUsRUFBRSxDQUN4Q0YsYUFBYSxDQUFDM3hCLFFBQVEsQ0FDekI7c0JBQUM7b0JBQUEsQ0FDSixDQUNOLENBQUM7a0JBQUM7a0JBQUE7b0JBQUEsT0FBQTVjLFFBQUEsQ0FBQS9GLElBQUE7Z0JBQUE7Y0FBQSxHQUFBa1IsS0FBQTtZQUFBO1VBQUE7WUFBQSxLQWxDQ2tqQixVQUFVLENBQUNyMUIsTUFBTTtjQUFBMGtCLFNBQUEsQ0FBQXZsQixJQUFBO2NBQUE7WUFBQTtZQUFBLE9BQUF1bEIsU0FBQSxDQUFBbGpCLGFBQUEsQ0FBQTJRLEtBQUE7VUFBQTtZQUFBdVMsU0FBQSxDQUFBdmxCLElBQUE7WUFBQTtVQUFBO1lBc0M1QjtBQUNSO0FBQ0E7QUFDQTtBQUNBO1lBQ1FtMEMsU0FBUyxHQUFHanNDLGtEQUFNLENBQUNrZixpREFBVSxDQUFDK3NCLFNBQVMsRUFBRXlCLFVBQVUsQ0FBQyxFQUFFQyxVQUFVLENBQUM7O1lBRWpFO0FBQ1I7QUFDQTs7WUFFUTtZQUNBO1lBQ0E7WUFDTUMsYUFBYSxHQUFHOUIsaURBQU8sQ0FDekIsVUFBQXozQixFQUFFO2NBQUEsT0FBSUEsRUFBRSxDQUFDMGEsY0FBYztZQUFBLENBQU8sRUFDOUJscUIsaURBQU0sQ0FBQyxVQUFBd1AsRUFBRTtjQUFBLE9BQUksQ0FBQ3ROLGtEQUFLLENBQUNzTixFQUFFLENBQUMwYSxjQUFjLENBQUM7WUFBQSxHQUFFaWQsTUFBTSxDQUNsRCxDQUFDO1lBRUs2QixPQUFvQixHQUFHaHBDLGlEQUFNLENBQUMsVUFBQXdQLEVBQUUsRUFBSTtjQUN0QztjQUNBLElBQ0ksQ0FBQ0EsRUFBRSxDQUFDMGEsY0FBYyxJQUNsQixDQUFDNmUsYUFBYSxDQUFDdjVCLEVBQUUsQ0FBQzBhLGNBQWMsQ0FBQyxJQUNqQyxDQUFDNmUsYUFBYSxDQUFDdjVCLEVBQUUsQ0FBQzBhLGNBQWMsQ0FBQyxDQUFDcDJCLE1BQU0sRUFDMUM7Z0JBQ0UsT0FBTyxLQUFLO2NBQ2hCOztjQUVBO2NBQ0EsSUFBTXdNLE1BQU0sR0FBR0wsa0RBQUcsQ0FBQ3lhLHNFQUFnQixFQUFFaFAsa0RBQU8sQ0FBQzhELEVBQUUsQ0FBQ0ksU0FBUyxDQUFDZixLQUFLLENBQUMsQ0FBQyxDQUFDOztjQUVsRTtjQUNBLElBQU1oTCxRQUFRLEdBQUc2SCxrREFBTyxDQUNwQnpMLGtEQUFHLENBQ0MsVUFBQXVwQyxHQUFHO2dCQUFBLE9BQUlBLEdBQUcsQ0FBQzlFLGFBQWEsQ0FBQzdnQyxRQUFRO2NBQUEsR0FDakNrbEMsYUFBYSxDQUFDdjVCLEVBQUUsQ0FBQzBhLGNBQWMsQ0FDbkMsQ0FDSixDQUFDOztjQUVEO2NBQ0EsSUFBTXlRLE9BQU8sR0FBR2p2QixrREFBTyxDQUNuQnpMLGtEQUFHLENBQ0MsVUFBQXVwQyxHQUFHO2dCQUFBLE9BQUlBLEdBQUcsQ0FBQzlFLGFBQWEsQ0FBQ3RCLFlBQVk7Y0FBQSxHQUNyQzJGLGFBQWEsQ0FBQ3Y1QixFQUFFLENBQUMwYSxjQUFjLENBQ25DLENBQ0osQ0FBQzs7Y0FFRDtjQUNBO2NBQ0E7Y0FDQTtjQUNBLElBQU1oaEIsR0FBRyxHQUNMelIsa0RBQU8sQ0FBQ2tVLGtEQUFZLENBQUNyTCxNQUFNLEVBQUVxNkIsT0FBTyxDQUFDLENBQUMsSUFDdENsakMsa0RBQU8sQ0FBQzRpQixpREFBVSxDQUFDL1osTUFBTSxFQUFFdUQsUUFBUSxDQUFDLENBQUMsSUFDckMsQ0FBQ3NXLGtEQUFHLENBQUNsTyxnRUFBYSxFQUFFdUQsRUFBRSxDQUFDa0ksUUFBUSxDQUFDcFgsTUFBTSxDQUFDO2NBRTNDLE9BQU80SSxHQUFHO1lBQ2QsQ0FBQyxFQUFFMC9CLGNBQWMsQ0FBQztZQUVsQjtBQUNSO0FBQ0E7QUFDQTtBQUNBO1lBQ1F4QixTQUFTLEdBQUcvc0IsaURBQVUsQ0FBQytzQixTQUFTLEVBQUU0QixPQUFPLENBQUM7WUFFMUNKLGNBQWMsR0FBR3Z1QixpREFBVSxDQUFDdXVCLGNBQWMsRUFBRUksT0FBTyxDQUFDO1lBRXBENUIsU0FBUyxHQUFHL3NCLGlEQUFVLENBQUMrc0IsU0FBUyxFQUFFd0IsY0FBYyxDQUFDO1lBRTNDN2QsS0FBSyxHQUFHMVEsaURBQVUsQ0FBQytzQixTQUFTLEVBQUVDLGdCQUFnQixDQUFDO1lBQy9DMWMsT0FBTyxHQUFHdFEsaURBQVUsQ0FBQ2d0QixnQkFBZ0IsRUFBRUQsU0FBUyxDQUFDO1lBRXZEOXNDLFFBQVEsQ0FDSmdVLHNFQUFrQixDQUFDO1lBQ2Y7WUFDQXljLEtBQUssQ0FBQ2ozQixNQUFNLEdBQUdvWix5RUFBcUIsQ0FBQzZkLEtBQUssQ0FBQyxHQUFHLElBQUksRUFDbERKLE9BQU8sQ0FBQzcyQixNQUFNLEdBQUdrYSw0RUFBd0IsQ0FBQzJjLE9BQU8sQ0FBQyxHQUFHLElBQUk7WUFDekQ7WUFDQThjLFdBQVcsQ0FBQzN6QyxNQUFNLEdBQ1pnYSw4RUFBMEIsQ0FBQzI1QixXQUFXLENBQUMsR0FDdkMsSUFBSSxFQUNWQyxXQUFXLENBQUM1ekMsTUFBTSxHQUFHNFosMEVBQXNCLENBQUNnNkIsV0FBVyxDQUFDLEdBQUcsSUFBSSxFQUMvREMsV0FBVyxDQUFDN3pDLE1BQU0sR0FDWjhaLDRFQUF3QixDQUFDKzVCLFdBQVcsQ0FBQyxHQUNyQyxJQUFJLEVBQ1ZDLFdBQVcsQ0FBQzl6QyxNQUFNLEdBQUdzYSwwRUFBc0IsQ0FBQ3c1QixXQUFXLENBQUMsR0FBRyxJQUFJO1lBQy9EO1lBQ0FNLFFBQVEsQ0FBQ3AwQyxNQUFNLEdBQUdnYSw4RUFBMEIsQ0FBQ282QixRQUFRLENBQUMsR0FBRyxJQUFJLEVBQzdERCxNQUFNLENBQUNuMEMsTUFBTSxHQUFHa1osMkVBQXVCLENBQUNpN0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxFQUN0REksUUFBUSxDQUFDdjBDLE1BQU0sR0FBRzRaLDBFQUFzQixDQUFDMjZCLFFBQVEsQ0FBQyxHQUFHLElBQUksRUFDekRELE1BQU0sQ0FBQ3QwQyxNQUFNLEdBQUcwWSx1RUFBbUIsQ0FBQzQ3QixNQUFNLENBQUMsR0FBRyxJQUFJLEVBQ2xESSxRQUFRLENBQUMxMEMsTUFBTSxHQUFHOFosNEVBQXdCLENBQUM0NkIsUUFBUSxDQUFDLEdBQUcsSUFBSSxFQUMzREQsTUFBTSxDQUFDejBDLE1BQU0sR0FBR2daLHlFQUFxQixDQUFDeTdCLE1BQU0sQ0FBQyxHQUFHLElBQUksRUFDcERJLFFBQVEsQ0FBQzcwQyxNQUFNLEdBQUdzYSwwRUFBc0IsQ0FBQ3U2QixRQUFRLENBQUMsR0FBRyxJQUFJLEVBQ3pERCxNQUFNLENBQUM1MEMsTUFBTSxHQUFHd1osdUVBQW1CLENBQUNvN0IsTUFBTSxDQUFDLEdBQUcsSUFBSTtZQUNsRDtZQUNBRSxjQUFjLENBQUM5MEMsTUFBTSxHQUNma1osMkVBQXVCLENBQUM0N0IsY0FBYyxDQUFDLEdBQ3ZDLElBQUksQ0FDYixDQUNMLENBQUM7VUFBQztVQUFBO1lBQUEsT0FBQXB3QixTQUFBLENBQUF6akIsSUFBQTtRQUFBO01BQUEsR0FBQTZGLE9BQUE7SUFBQSxDQUNMO0lBQUEsU0FBQXlGLFNBQUFrSyxFQUFBO01BQUEsT0FBQWk4QixTQUFBLENBQUFwd0MsS0FBQSxPQUFBRCxTQUFBO0lBQUE7SUFBQSxPQUFBa0ssUUFBQTtFQUFBO0VBQ0RDLE1BQU0sRUFBRSxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQjtBQUN6RCxDQUFDO0FBRUQsK0RBQWVELFFBQVE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdaUjtBQUlnRTtBQUl4QjtBQUd2RCxJQUFNQSxRQUErQyxHQUFHO0VBQ3BEQSxRQUFRLEVBQUUsU0FBQUEsU0FBQWhCLElBQUEsRUFBMEI7SUFBQSxJQUF4Qi9FLFFBQVEsR0FBQStFLElBQUEsQ0FBUi9FLFFBQVE7TUFBRStHLFFBQVEsR0FBQWhDLElBQUEsQ0FBUmdDLFFBQVE7SUFDMUIsSUFBQTRELFNBQUEsR0FBb0I1RCxRQUFRLENBQUMsQ0FBQztNQUF2QmdjLFNBQVMsR0FBQXBZLFNBQUEsQ0FBVG9ZLFNBQVM7SUFDaEIsSUFBTThuQixnQkFBZ0IsR0FBR0QscUVBQW1CLENBQUM3bkIsU0FBUyxDQUFDO0lBRXZELElBQUF5TyxVQUFBLEdBRUl6cUIsUUFBUSxDQUFDLENBQUM7TUFERThsQyxNQUFNLEdBQUFyYixVQUFBLENBQWxCek8sU0FBUyxDQUFHOHBCLE1BQU07SUFHdEIsSUFBQXhkLFVBQUEsR0FBNkN2QixpREFBUyxDQUNsRCxVQUFBNVksRUFBRTtRQUFBLE9BQUl0TixpREFBSyxDQUFDc04sRUFBRSxDQUFDMGEsY0FBYyxDQUFDO01BQUEsR0FDOUJpZCxNQUNKLENBQUM7TUFBQXZkLFdBQUEsR0FBQXJ6QixjQUFBLENBQUFvekIsVUFBQTtNQUhNOGYsa0JBQWtCLEdBQUE3ZixXQUFBO01BQUU4ZixjQUFjLEdBQUE5ZixXQUFBO0lBS3pDLElBQU0rZixlQUFlLEdBQUcxQyxpREFBTyxDQUMzQixVQUFBejNCLEVBQUU7TUFBQSxPQUFJQSxFQUFFLENBQUMwYSxjQUFjO0lBQUEsQ0FBTyxFQUM5QndmLGNBQ0osQ0FBQztJQUVELElBQU1YLGFBQWEsR0FBRzlCLGlEQUFPLENBQ3pCLFVBQUF6M0IsRUFBRTtNQUFBLE9BQUlBLEVBQUUsQ0FBQzBhLGNBQWM7SUFBQSxDQUFPLEVBQzlCbHFCLGlEQUFNLENBQUMsVUFBQXdQLEVBQUU7TUFBQSxPQUFJLENBQUN0TixpREFBSyxDQUFDc04sRUFBRSxDQUFDMGEsY0FBYyxDQUFDO0lBQUEsR0FBRWliLGdCQUFnQixDQUM1RCxDQUFDO0lBRUQsSUFBTTZELE9BQU8sR0FBRzNnQixpREFBTSxDQUNsQixVQUFDbmYsR0FBRyxFQUFBOEssS0FBQTtNQUFBLElBQUFDLEtBQUEsR0FBQTFkLGNBQUEsQ0FBQXlkLEtBQUE7UUFBR2tXLGNBQWMsR0FBQWpXLEtBQUE7UUFBRTIxQix1QkFBdUIsR0FBQTMxQixLQUFBO01BQUEsT0FDMUMsQ0FBQzgwQixhQUFhLENBQUM3ZSxjQUFjLENBQUMsR0FDeEIvdUIsaURBQU0sQ0FBQytOLEdBQUcsRUFBRTBnQyx1QkFBdUIsQ0FBQyxHQUNwQzFnQyxHQUFHO0lBQUEsR0FDYixFQUFFLEVBQ0YyQyxpREFBTyxDQUFDODlCLGVBQWUsQ0FDM0IsQ0FBQztJQUVEcnZDLFFBQVEsQ0FDSmdVLHNFQUFrQixDQUFDLENBQ2ZtN0Isa0JBQWtCLENBQUMzMUMsTUFBTSxHQUNuQm9hLHlFQUFxQixDQUFDdTdCLGtCQUFrQixDQUFDLEdBQ3pDLElBQUksRUFDVlQsT0FBTyxDQUFDbDFDLE1BQU0sR0FBR29hLHlFQUFxQixDQUFDODZCLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FDekQsQ0FDTCxDQUFDO0VBQ0wsQ0FBQztFQUNEMW9DLE1BQU0sRUFBRSxDQUFDLGtCQUFrQixFQUFFLHFCQUFxQjtBQUN0RCxDQUFDO0FBRUQsK0RBQWVELFFBQVE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaEV2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBV2U7QUFDNEI7QUFFVDtBQUNpQjtBQUU1QyxJQUFNMHBDLFdBQVcsR0FBRyxvQkFBb0I7QUFFL0MsU0FBUzF6QyxHQUFHQSxDQUFDckgsQ0FBQyxFQUFFO0VBQ1osSUFBTThHLEtBQUssR0FBRyxPQUFPOUcsQ0FBQyxLQUFLLFFBQVEsR0FBRyxJQUFJcUQsS0FBSyxDQUFDckQsQ0FBQyxDQUFDLEdBQUdBLENBQUM7RUFFdEQsT0FBT21kLHlEQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUJ2YixJQUFJLEVBQUUsVUFBVTtJQUNoQmtGO0VBQ0osQ0FBQyxDQUFDO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNrMEMsY0FBY0EsQ0FBQ0MsTUFBTSxFQUFFQyxTQUFTLEVBQUU7RUFDdkMsSUFBTUMsT0FBTyxHQUFHRixNQUFNLEdBQUdDLFNBQVM7RUFDbEMsSUFBTUUsT0FBTyxHQUFHRCxPQUFPLENBQUNyMkMsTUFBTTtFQUM5QixPQUFPLFVBQUE4QixHQUFHO0lBQUEsT0FBSUEsR0FBRyxLQUFLcTBDLE1BQU0sSUFBSXIwQyxHQUFHLENBQUNzVSxNQUFNLENBQUMsQ0FBQyxFQUFFa2dDLE9BQU8sQ0FBQyxLQUFLRCxPQUFPO0VBQUE7QUFDdEU7QUFFQSxJQUFNRSxTQUFTLEdBQUcsR0FBRztBQUNyQixJQUFNQyxNQUFNLEdBQUcsU0FBVEEsTUFBTUEsQ0FBR3RsQyxHQUFHO0VBQUEsT0FBS0EsR0FBRyxLQUFLcWxDLFNBQVMsR0FBRy96QyxTQUFTLEdBQUcyRixJQUFJLENBQUNvSSxLQUFLLENBQUNXLEdBQUcsSUFBSSxJQUFJLENBQUM7QUFBQSxDQUFDO0FBQy9FLElBQU11bEMsVUFBVSxHQUFHLFNBQWJBLFVBQVVBLENBQUd2bEMsR0FBRztFQUFBLE9BQUtBLEdBQUcsS0FBSzFPLFNBQVMsR0FBRyt6QyxTQUFTLEdBQUdwdUMsSUFBSSxDQUFDQyxTQUFTLENBQUM4SSxHQUFHLENBQUM7QUFBQSxDQUFDO0FBQUMsSUFFMUV3bEMsUUFBUTtFQUNWLFNBQUFBLFNBQVk5dEMsT0FBTyxFQUFFO0lBQUF3QixlQUFBLE9BQUFzc0MsUUFBQTtJQUNqQixJQUFJLENBQUNDLEtBQUssR0FBRy90QyxPQUFPO0lBQ3BCLElBQUksQ0FBQ2d1QyxRQUFRLEdBQUd6dkMsTUFBTSxDQUFDeUIsT0FBTyxDQUFDO0VBQ25DO0VBQUM4QixZQUFBLENBQUFnc0MsUUFBQTtJQUFBNTBDLEdBQUE7SUFBQW5HLEtBQUEsRUFFRCxTQUFBazdDLFFBQVEvMEMsR0FBRyxFQUFFO01BQ1QsT0FBTyxJQUFJLENBQUM4MEMsUUFBUSxDQUFDRSxPQUFPLENBQUNiLFdBQVcsR0FBR24wQyxHQUFHLENBQUMsS0FBSyxJQUFJO0lBQzVEO0VBQUM7SUFBQUEsR0FBQTtJQUFBbkcsS0FBQSxFQUVELFNBQUFtN0MsUUFBUWgxQyxHQUFHLEVBQUU7TUFDVDtNQUNBO01BQ0EsT0FBTzAwQyxNQUFNLENBQUMsSUFBSSxDQUFDSSxRQUFRLENBQUNFLE9BQU8sQ0FBQ2IsV0FBVyxHQUFHbjBDLEdBQUcsQ0FBQyxDQUFDO0lBQzNEO0VBQUM7SUFBQUEsR0FBQTtJQUFBbkcsS0FBQSxFQUVELFNBQUFvN0MsU0FBU2oxQyxHQUFHLEVBQUVuRyxLQUFLLEVBQUU7TUFDakI7TUFDQSxJQUFJLENBQUNpN0MsUUFBUSxDQUFDSSxPQUFPLENBQUNmLFdBQVcsR0FBR24wQyxHQUFHLEVBQUUyMEMsVUFBVSxDQUFDOTZDLEtBQUssQ0FBQyxDQUFDO0lBQy9EO0lBQ0E7QUFDSjtBQUNBO0FBQ0E7RUFISTtJQUFBbUcsR0FBQTtJQUFBbkcsS0FBQSxFQUlBLFNBQUFxN0MsUUFBUWwxQyxHQUFHLEVBQUVuRyxLQUFLLEVBQUU2SyxRQUFRLEVBQUU7TUFDMUIsSUFBSTtRQUNBLElBQUksQ0FBQ3V3QyxRQUFRLENBQUNqMUMsR0FBRyxFQUFFbkcsS0FBSyxDQUFDO01BQzdCLENBQUMsQ0FBQyxPQUFPVCxDQUFDLEVBQUU7UUFDUnNMLFFBQVEsQ0FDSmpFLEdBQUcsSUFBQThFLE1BQUEsQ0FDSXZGLEdBQUcseUJBQUF1RixNQUFBLENBQXNCLElBQUksQ0FBQ3N2QyxLQUFLLG1DQUMxQyxDQUNKLENBQUM7UUFDRDtRQUNBO1FBQ0E7TUFDSjtJQUNKO0VBQUM7SUFBQTcwQyxHQUFBO0lBQUFuRyxLQUFBLEVBRUQsU0FBQXM3QyxXQUFXbjFDLEdBQUcsRUFBRTtNQUNaLElBQUksQ0FBQzgwQyxRQUFRLENBQUNLLFVBQVUsQ0FBQ2hCLFdBQVcsR0FBR24wQyxHQUFHLENBQUM7SUFDL0M7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7RUFISTtJQUFBQSxHQUFBO0lBQUFuRyxLQUFBLEVBSUEsU0FBQXU3QyxNQUFNQyxTQUFTLEVBQUU7TUFBQSxJQUFBaHRDLEtBQUE7TUFDYixJQUFNaXRDLFVBQVUsR0FBR25CLFdBQVcsSUFBSWtCLFNBQVMsSUFBSSxFQUFFLENBQUM7TUFDbEQsSUFBTUUsUUFBUSxHQUFHbkIsY0FBYyxDQUFDa0IsVUFBVSxFQUFFRCxTQUFTLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztNQUNqRSxJQUFNRyxZQUFZLEdBQUcsRUFBRTtNQUN2QjtNQUNBO01BQ0EsS0FBSyxJQUFJMTdDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRyxJQUFJLENBQUNnN0MsUUFBUSxDQUFDNTJDLE1BQU0sRUFBRXBFLENBQUMsRUFBRSxFQUFFO1FBQzNDLElBQU0yN0MsT0FBTyxHQUFHLElBQUksQ0FBQ1gsUUFBUSxDQUFDOTBDLEdBQUcsQ0FBQ2xHLENBQUMsQ0FBQztRQUNwQyxJQUFJeTdDLFFBQVEsQ0FBQ0UsT0FBTyxDQUFDLEVBQUU7VUFDbkJELFlBQVksQ0FBQzMzQyxJQUFJLENBQUM0M0MsT0FBTyxDQUFDO1FBQzlCO01BQ0o7TUFDQXg1QyxpREFBTyxDQUFDLFVBQUF1VSxDQUFDO1FBQUEsT0FBSW5JLEtBQUksQ0FBQ3lzQyxRQUFRLENBQUNLLFVBQVUsQ0FBQzNrQyxDQUFDLENBQUM7TUFBQSxHQUFFZ2xDLFlBQVksQ0FBQztJQUMzRDtFQUFDO0VBQUEsT0FBQVosUUFBQTtBQUFBO0FBQUEsSUFHQ2MsUUFBUTtFQUNWLFNBQUFBLFNBQUEsRUFBYztJQUFBcHRDLGVBQUEsT0FBQW90QyxRQUFBO0lBQ1YsSUFBSSxDQUFDNXlCLEtBQUssR0FBRyxDQUFDLENBQUM7RUFDbkI7RUFBQ2xhLFlBQUEsQ0FBQThzQyxRQUFBO0lBQUExMUMsR0FBQTtJQUFBbkcsS0FBQSxFQUVELFNBQUFrN0MsUUFBUS8wQyxHQUFHLEVBQUU7TUFDVCxPQUFPQSxHQUFHLElBQUksSUFBSSxDQUFDOGlCLEtBQUs7SUFDNUI7RUFBQztJQUFBOWlCLEdBQUE7SUFBQW5HLEtBQUEsRUFFRCxTQUFBbTdDLFFBQVFoMUMsR0FBRyxFQUFFO01BQ1Q7TUFDQTtNQUNBLE9BQU8wMEMsTUFBTSxDQUFDLElBQUksQ0FBQzV4QixLQUFLLENBQUM5aUIsR0FBRyxDQUFDLENBQUM7SUFDbEM7RUFBQztJQUFBQSxHQUFBO0lBQUFuRyxLQUFBLEVBRUQsU0FBQXE3QyxRQUFRbDFDLEdBQUcsRUFBRW5HLEtBQUssRUFBRTtNQUNoQixJQUFJLENBQUNpcEIsS0FBSyxDQUFDOWlCLEdBQUcsQ0FBQyxHQUFHMjBDLFVBQVUsQ0FBQzk2QyxLQUFLLENBQUM7SUFDdkM7RUFBQztJQUFBbUcsR0FBQTtJQUFBbkcsS0FBQSxFQUVELFNBQUFzN0MsV0FBV24xQyxHQUFHLEVBQUU7TUFDWixPQUFPLElBQUksQ0FBQzhpQixLQUFLLENBQUM5aUIsR0FBRyxDQUFDO0lBQzFCO0VBQUM7SUFBQUEsR0FBQTtJQUFBbkcsS0FBQSxFQUVELFNBQUF1N0MsTUFBTUMsU0FBUyxFQUFFO01BQUEsSUFBQTNsQyxNQUFBO01BQ2IsSUFBSTJsQyxTQUFTLEVBQUU7UUFDWHA1QyxpREFBTyxDQUNILFVBQUErRCxHQUFHO1VBQUEsT0FBSSxPQUFPMFAsTUFBSSxDQUFDb1QsS0FBSyxDQUFDOWlCLEdBQUcsQ0FBQztRQUFBLEdBQzdCb0ssaURBQU0sQ0FBQ2dxQyxjQUFjLENBQUNpQixTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUV4MkMsaURBQUksQ0FBQyxJQUFJLENBQUNpa0IsS0FBSyxDQUFDLENBQzNELENBQUM7TUFDTCxDQUFDLE1BQU07UUFDSCxJQUFJLENBQUNBLEtBQUssR0FBRyxDQUFDLENBQUM7TUFDbkI7SUFDSjtFQUFDO0VBQUEsT0FBQTR5QixRQUFBO0FBQUEsS0FHTDtBQUNBO0FBQ0E7QUFDQSxJQUFNQyxHQUFHLEdBQUcsRUFBRTtBQUNkLFNBQVNDLFVBQVVBLENBQUEsRUFBRztFQUNsQixJQUFJdDZDLENBQUMsR0FBRyxNQUFNO0VBQ2QsS0FBSyxJQUFJeEIsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHNjdDLEdBQUcsRUFBRTc3QyxDQUFDLEVBQUUsRUFBRTtJQUMxQndCLENBQUMsSUFBSUEsQ0FBQztFQUNWO0VBQ0EsT0FBT0EsQ0FBQztBQUNaO0FBRU8sSUFBTXU2QyxNQUFNLEdBQUc7RUFDbEJDLE1BQU0sRUFBRSxJQUFJSixRQUFRLENBQUM7RUFDckI7RUFDQTtBQUNKLENBQUM7O0FBRUQsSUFBTUssUUFBUSxHQUFHO0VBQ2JDLEtBQUssRUFBRSxjQUFjO0VBQ3JCQyxPQUFPLEVBQUU7QUFDYixDQUFDO0FBRUQsU0FBU0MsY0FBY0EsQ0FBQ3B2QyxPQUFPLEVBQUVwQyxRQUFRLEVBQUU7RUFDdkMsSUFBTWdGLEtBQUssR0FBRyxJQUFJa3JDLFFBQVEsQ0FBQzl0QyxPQUFPLENBQUM7RUFDbkMsSUFBTXF2QyxhQUFhLEdBQUdOLE1BQU0sQ0FBQ0MsTUFBTTtFQUNuQyxJQUFNTSxTQUFTLEdBQUdSLFVBQVUsQ0FBQyxDQUFDO0VBQzlCLElBQU1TLE9BQU8sR0FBR2xDLFdBQVcsR0FBRyxLQUFLO0VBQ25DLElBQUk7SUFDQXpxQyxLQUFLLENBQUN1ckMsUUFBUSxDQUFDb0IsT0FBTyxFQUFFRCxTQUFTLENBQUM7SUFDbEMsSUFBSTFzQyxLQUFLLENBQUNzckMsT0FBTyxDQUFDcUIsT0FBTyxDQUFDLEtBQUtELFNBQVMsRUFBRTtNQUN0QzF4QyxRQUFRLENBQ0pqRSxHQUFHLElBQUE4RSxNQUFBLENBQUl1QixPQUFPLGlEQUE4QyxDQUNoRSxDQUFDO01BQ0QsT0FBT3F2QyxhQUFhO0lBQ3hCO0lBQ0F6c0MsS0FBSyxDQUFDeXJDLFVBQVUsQ0FBQ2tCLE9BQU8sQ0FBQztJQUN6QixPQUFPM3NDLEtBQUs7RUFDaEIsQ0FBQyxDQUFDLE9BQU90USxDQUFDLEVBQUU7SUFDUnNMLFFBQVEsQ0FDSmpFLEdBQUcsSUFBQThFLE1BQUEsQ0FBSXVCLE9BQU8sa0RBQStDLENBQ2pFLENBQUM7RUFDTDtFQUNBLElBQUk7SUFDQTRDLEtBQUssQ0FBQzByQyxLQUFLLENBQUMsQ0FBQztJQUNiMXJDLEtBQUssQ0FBQ3VyQyxRQUFRLENBQUNvQixPQUFPLEVBQUVELFNBQVMsQ0FBQztJQUNsQyxJQUFJMXNDLEtBQUssQ0FBQ3NyQyxPQUFPLENBQUNxQixPQUFPLENBQUMsS0FBS0QsU0FBUyxFQUFFO01BQ3RDLE1BQU0sSUFBSTM1QyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzNCO0lBQ0FpTixLQUFLLENBQUN5ckMsVUFBVSxDQUFDa0IsT0FBTyxDQUFDO0lBQ3pCM3hDLFFBQVEsQ0FBQ2pFLEdBQUcsSUFBQThFLE1BQUEsQ0FBSXVCLE9BQU8sNENBQXlDLENBQUMsQ0FBQztJQUNsRSxPQUFPNEMsS0FBSztFQUNoQixDQUFDLENBQUMsT0FBT3RRLENBQUMsRUFBRTtJQUNSc0wsUUFBUSxDQUFDakUsR0FBRyxJQUFBOEUsTUFBQSxDQUFJdUIsT0FBTywrQ0FBNEMsQ0FBQyxDQUFDO0lBQ3JFLE9BQU9xdkMsYUFBYTtFQUN4QjtBQUNKO0FBRUEsU0FBU0csUUFBUUEsQ0FBQ3Q3QyxJQUFJLEVBQUUwSixRQUFRLEVBQUU7RUFDOUIsSUFBSSxDQUFDbXhDLE1BQU0sQ0FBQzc2QyxJQUFJLENBQUMsRUFBRTtJQUNmNjZDLE1BQU0sQ0FBQzc2QyxJQUFJLENBQUMsR0FBR2s3QyxjQUFjLENBQUNILFFBQVEsQ0FBQy82QyxJQUFJLENBQUMsRUFBRTBKLFFBQVEsQ0FBQztFQUMzRDtFQUNBLE9BQU9teEMsTUFBTSxDQUFDNzZDLElBQUksQ0FBQztBQUN2QjtBQUVBLElBQU11N0MsYUFBYSxHQUFHO0VBQ2xCQyxPQUFPLEVBQUUsU0FBQUEsUUFBQUMsU0FBUztJQUFBLE9BQUlBLFNBQVM7RUFBQTtFQUMvQmoyQyxLQUFLLEVBQUUsU0FBQUEsTUFBQ2syQyxXQUFXLEVBQUVDLFVBQVU7SUFBQSxPQUFLRCxXQUFXO0VBQUE7QUFDbkQsQ0FBQztBQUVELElBQU1FLFlBQVksR0FBRyxTQUFmQSxZQUFZQSxDQUFJanBDLE9BQU8sRUFBRTZRLFFBQVEsRUFBRXE0QixRQUFRLEVBQUs7RUFDbEQsSUFDSWxwQyxPQUFPLENBQUNtcEMscUJBQXFCLElBQzdCbnBDLE9BQU8sQ0FBQ21wQyxxQkFBcUIsQ0FBQ3Q0QixRQUFRLENBQUMsRUFDekM7SUFDRSxJQUFJcTRCLFFBQVEsRUFBRTtNQUNWLE9BQU9scEMsT0FBTyxDQUFDbXBDLHFCQUFxQixDQUFDdDRCLFFBQVEsQ0FBQyxDQUFDcTRCLFFBQVEsQ0FBQztJQUM1RDtJQUNBLE9BQU9scEMsT0FBTyxDQUFDbXBDLHFCQUFxQixDQUFDdDRCLFFBQVEsQ0FBQztFQUNsRDtFQUNBLE9BQU8rM0IsYUFBYTtBQUN4QixDQUFDO0FBRUQsSUFBTVEsVUFBVSxHQUFHLFNBQWJBLFVBQVVBLENBQUlocEMsRUFBRSxFQUFFaXBDLGFBQWEsRUFBRUMsV0FBVztFQUFBLFVBQUExeEMsTUFBQSxDQUMzQytILGtFQUFXLENBQUNTLEVBQUUsQ0FBQyxPQUFBeEksTUFBQSxDQUFJeXhDLGFBQWEsT0FBQXp4QyxNQUFBLENBQUljLElBQUksQ0FBQ0MsU0FBUyxDQUFDMndDLFdBQVcsQ0FBQztBQUFBLENBQUU7QUFFeEUsSUFBTUMsUUFBUSxHQUFHLFNBQVhBLFFBQVFBLENBQUdyekMsTUFBTSxFQUFJO0VBQ3ZCLElBQU9MLEtBQUssR0FBcUJLLE1BQU0sQ0FBaENMLEtBQUs7SUFBRXhJLElBQUksR0FBZTZJLE1BQU0sQ0FBekI3SSxJQUFJO0lBQUVvVixTQUFTLEdBQUl2TSxNQUFNLENBQW5CdU0sU0FBUztFQUM3QixJQUFJLENBQUNwVixJQUFJLElBQUksQ0FBQ29WLFNBQVMsRUFBRTtJQUNyQjtJQUNBLE9BQU87TUFBQzVNO0lBQUssQ0FBQztFQUNsQjtFQUNBLElBQU91SyxFQUFFLEdBQWlCdkssS0FBSyxDQUF4QnVLLEVBQUU7SUFBRWtwQyxXQUFXLEdBQUl6ekMsS0FBSyxDQUFwQnl6QyxXQUFXO0VBRXRCLElBQU10cEMsT0FBTyxHQUFHNUIsaURBQVEsQ0FBQzFQLE9BQU8sQ0FBQ3dILE1BQU0sQ0FBQztFQUN4QyxJQUFNc3pDLE1BQU0sR0FBRyxTQUFUQSxNQUFNQSxDQUFHN3ZCLElBQUk7SUFBQSxPQUFJOWpCLEtBQUssQ0FBQzhqQixJQUFJLENBQUMsSUFBSSxDQUFDM1osT0FBTyxDQUFDL0QsWUFBWSxJQUFJLENBQUMsQ0FBQyxFQUFFMGQsSUFBSSxDQUFDO0VBQUE7RUFDeEUsSUFBTTh2QixlQUFlLEdBQUdELE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztFQUNqRCxJQUFNRSxnQkFBZ0IsR0FBR0YsTUFBTSxDQUFDLGtCQUFrQixDQUFDO0VBQ25ELElBQU1HLFVBQVUsR0FBR3ZwQyxFQUFFLElBQUlxcEMsZUFBZSxJQUFJQyxnQkFBZ0I7RUFFNUQsT0FBTztJQUNIQyxVQUFVO0lBQ1Z2cEMsRUFBRTtJQUNGdkssS0FBSztJQUNMbUssT0FBTztJQUNQc3BDLFdBQVc7SUFDWEcsZUFBZTtJQUNmQztFQUNKLENBQUM7QUFDTCxDQUFDO0FBRU0sU0FBU25xQyxZQUFZQSxDQUFDckosTUFBTSxFQUFFa0wsUUFBUSxFQUFFckssUUFBUSxFQUFFO0VBQ3JELElBQUE2eUMsU0FBQSxHQVFJTCxRQUFRLENBQUNyekMsTUFBTSxDQUFDO0lBUGhCeXpDLFVBQVUsR0FBQUMsU0FBQSxDQUFWRCxVQUFVO0lBQ1Z2cEMsRUFBRSxHQUFBd3BDLFNBQUEsQ0FBRnhwQyxFQUFFO0lBQ0Z2SyxLQUFLLEdBQUErekMsU0FBQSxDQUFML3pDLEtBQUs7SUFDTG1LLE9BQU8sR0FBQTRwQyxTQUFBLENBQVA1cEMsT0FBTztJQUNQc3BDLFdBQVcsR0FBQU0sU0FBQSxDQUFYTixXQUFXO0lBQ1hHLGVBQWUsR0FBQUcsU0FBQSxDQUFmSCxlQUFlO0lBQ2ZDLGdCQUFnQixHQUFBRSxTQUFBLENBQWhCRixnQkFBZ0I7RUFFcEIsSUFBSSxDQUFDQyxVQUFVLElBQUksQ0FBQ0wsV0FBVyxFQUFFO0lBQzdCO0VBQ0o7RUFFQWg3QyxpREFBTyxDQUFDLFVBQUErNkMsYUFBYSxFQUFJO0lBQ3JCLElBQUFRLG9CQUFBLEdBQTZCUixhQUFhLENBQUN6ckMsS0FBSyxDQUFDLEdBQUcsQ0FBQztNQUFBa3NDLHFCQUFBLEdBQUE5MkMsY0FBQSxDQUFBNjJDLG9CQUFBO01BQTlDaDVCLFFBQVEsR0FBQWk1QixxQkFBQTtNQUFFWixRQUFRLEdBQUFZLHFCQUFBO0lBQ3pCLElBQUkxb0MsUUFBUSxDQUFDeVAsUUFBUSxDQUFDLEtBQUs5ZCxTQUFTLEVBQUU7TUFDbEMsSUFBTWczQyxPQUFPLEdBQUdwQixRQUFRLENBQUNlLGdCQUFnQixFQUFFM3lDLFFBQVEsQ0FBQztNQUNwRCxJQUFBaXpDLGFBQUEsR0FBa0JmLFlBQVksQ0FBQ2pwQyxPQUFPLEVBQUU2USxRQUFRLEVBQUVxNEIsUUFBUSxDQUFDO1FBQXBETCxPQUFPLEdBQUFtQixhQUFBLENBQVBuQixPQUFPO01BRWQsSUFBTW9CLE9BQU8sR0FBR2IsVUFBVSxDQUFDaHBDLEVBQUUsRUFBRWlwQyxhQUFhLEVBQUVDLFdBQVcsQ0FBQztNQUMxRCxJQUFJWSxXQUFXLEdBQUdyQixPQUFPLENBQUNoekMsS0FBSyxDQUFDZ2IsUUFBUSxDQUFDLENBQUM7TUFDMUMsSUFBTXM1QixNQUFNLEdBQUd0QixPQUFPLENBQUN6bkMsUUFBUSxDQUFDeVAsUUFBUSxDQUFDLENBQUM7O01BRTFDO01BQ0E7TUFDQTtNQUNBLElBQUlxNUIsV0FBVyxLQUFLQyxNQUFNLEVBQUU7UUFDeEIsSUFBSUosT0FBTyxDQUFDM0MsT0FBTyxDQUFDNkMsT0FBTyxDQUFDLEVBQUU7VUFDMUJDLFdBQVcsR0FBR0gsT0FBTyxDQUFDMUMsT0FBTyxDQUFDNEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdDO1FBQ0EsSUFBTTFxQixJQUFJLEdBQ04ycUIsV0FBVyxLQUFLbjNDLFNBQVMsR0FDbkIsQ0FBQ28zQyxNQUFNLENBQUMsR0FDUixDQUFDQSxNQUFNLEVBQUVELFdBQVcsQ0FBQztRQUMvQkgsT0FBTyxDQUFDeEMsT0FBTyxDQUFDMEMsT0FBTyxFQUFFMXFCLElBQUksRUFBRXhvQixRQUFRLENBQUM7TUFDNUM7SUFDSjtFQUNKLENBQUMsRUFBRTB5QyxlQUFlLENBQUM7QUFDdkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTcDBDLGdCQUFnQkEsQ0FBQ2EsTUFBTSxFQUFFYSxRQUFRLEVBQUU7RUFDL0MsSUFBSTFKLGlEQUFJLENBQUM2SSxNQUFNLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQ0EsTUFBTSxDQUFDTCxLQUFLLEVBQUU7SUFDNUMsT0FBT0ssTUFBTTtFQUNqQjtFQUVBLE9BQU9rMEMsZUFBZSxDQUFDbDBDLE1BQU0sRUFBRUEsTUFBTSxFQUFFLEVBQUUsRUFBRWEsUUFBUSxDQUFDO0FBQ3hEO0FBRUEsSUFBTXN6QyxJQUFJLEdBQUcsSUFBSTtBQUNqQixTQUFTQyxPQUFPQSxDQUFDajRDLEdBQUcsRUFBRTAzQyxPQUFPLEVBQUUvcEMsT0FBTyxFQUFFbkssS0FBSyxFQUFFd3pDLGFBQWEsRUFBRWtCLE1BQU0sRUFBRWxpQixJQUFJLEVBQUU7RUFDeEUsSUFBSTBoQixPQUFPLENBQUMzQyxPQUFPLENBQUMvMEMsR0FBRyxDQUFDLEVBQUU7SUFDdEIsSUFBQW00QyxnQkFBQSxHQUE4QlQsT0FBTyxDQUFDMUMsT0FBTyxDQUFDaDFDLEdBQUcsQ0FBQztNQUFBbzRDLGlCQUFBLEdBQUF6M0MsY0FBQSxDQUFBdzNDLGdCQUFBO01BQTNDTCxNQUFNLEdBQUFNLGlCQUFBO01BQUVQLFdBQVcsR0FBQU8saUJBQUE7SUFDMUIsSUFBTUMsT0FBTyxHQUFHcmlCLElBQUksR0FBRzhoQixNQUFNLEdBQUdELFdBQVc7SUFDM0MsSUFBTVMsS0FBSyxHQUFHdGlCLElBQUksR0FBRzZoQixXQUFXLEdBQUdDLE1BQU07SUFDekMsSUFBQVMscUJBQUEsR0FBNkJ2QixhQUFhLENBQUN6ckMsS0FBSyxDQUFDLEdBQUcsQ0FBQztNQUFBaXRDLHFCQUFBLEdBQUE3M0MsY0FBQSxDQUFBNDNDLHFCQUFBO01BQTlDLzVCLFFBQVEsR0FBQWc2QixxQkFBQTtNQUFFM0IsUUFBUSxHQUFBMkIscUJBQUE7SUFDekIsSUFBTUMsU0FBUyxHQUFHN0IsWUFBWSxDQUFDanBDLE9BQU8sRUFBRTZRLFFBQVEsRUFBRXE0QixRQUFRLENBQUM7SUFFM0QsSUFBSXhxQyxpREFBTSxDQUFDZ3NDLE9BQU8sRUFBRUksU0FBUyxDQUFDakMsT0FBTyxDQUFDaHpDLEtBQUssQ0FBQ2diLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTtNQUNyRDA1QixNQUFNLENBQUMxNUIsUUFBUSxDQUFDLEdBQUdpNkIsU0FBUyxDQUFDajRDLEtBQUssQ0FDOUI4M0MsS0FBSyxFQUNMOTVCLFFBQVEsSUFBSTA1QixNQUFNLEdBQUdBLE1BQU0sQ0FBQzE1QixRQUFRLENBQUMsR0FBR2hiLEtBQUssQ0FBQ2diLFFBQVEsQ0FDMUQsQ0FBQztJQUNMLENBQUMsTUFBTTtNQUNIO01BQ0E7TUFDQWs1QixPQUFPLENBQUN2QyxVQUFVLENBQUNuMUMsR0FBRyxDQUFDO0lBQzNCO0VBQ0o7QUFDSjtBQUVBLFNBQVMrM0MsZUFBZUEsQ0FBQ2wwQyxNQUFNLEVBQUVpTCxTQUFTLEVBQUV4RSxJQUFJLEVBQUU1RixRQUFRLEVBQUU7RUFDeEQsSUFBQWcwQyxVQUFBLEdBUUl4QixRQUFRLENBQUNwb0MsU0FBUyxDQUFDO0lBUG5Cd29DLFVBQVUsR0FBQW9CLFVBQUEsQ0FBVnBCLFVBQVU7SUFDVnZwQyxFQUFFLEdBQUEycUMsVUFBQSxDQUFGM3FDLEVBQUU7SUFDRnZLLEtBQUssR0FBQWsxQyxVQUFBLENBQUxsMUMsS0FBSztJQUNMbUssT0FBTyxHQUFBK3FDLFVBQUEsQ0FBUC9xQyxPQUFPO0lBQ1BzcEMsV0FBVyxHQUFBeUIsVUFBQSxDQUFYekIsV0FBVztJQUNYRyxlQUFlLEdBQUFzQixVQUFBLENBQWZ0QixlQUFlO0lBQ2ZDLGdCQUFnQixHQUFBcUIsVUFBQSxDQUFoQnJCLGdCQUFnQjtFQUdwQixJQUFJc0IsU0FBUyxHQUFHOTBDLE1BQU07RUFDdEIsSUFBSXl6QyxVQUFVLElBQUlMLFdBQVcsRUFBRTtJQUMzQixJQUFNUyxPQUFPLEdBQUdwQixRQUFRLENBQUNlLGdCQUFnQixFQUFFM3lDLFFBQVEsQ0FBQztJQUNwRCxJQUFNd3pDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDakJqOEMsaURBQU8sQ0FDSCxVQUFBKzZDLGFBQWE7TUFBQSxPQUNUaUIsT0FBTyxDQUNIbEIsVUFBVSxDQUFDaHBDLEVBQUUsRUFBRWlwQyxhQUFhLEVBQUVDLFdBQVcsQ0FBQyxFQUMxQ1MsT0FBTyxFQUNQL3BDLE9BQU8sRUFDUG5LLEtBQUssRUFDTHd6QyxhQUFhLEVBQ2JrQixNQUNKLENBQUM7SUFBQSxHQUNMZCxlQUNKLENBQUM7SUFFRCxLQUFLLElBQU01NEIsUUFBUSxJQUFJMDVCLE1BQU0sRUFBRTtNQUMzQlMsU0FBUyxHQUFHekUsaURBQUcsQ0FDWEQsaURBQVEsQ0FBQzNwQyxJQUFJLENBQUMvRSxNQUFNLENBQUMsT0FBTyxFQUFFaVosUUFBUSxDQUFDLENBQUMsRUFDeEMwNUIsTUFBTSxDQUFDMTVCLFFBQVEsQ0FBQyxFQUNoQm02QixTQUNKLENBQUM7SUFDTDtFQUNKOztFQUVBO0VBQ0EsSUFBTzlxQyxRQUFRLEdBQUlySyxLQUFLLENBQWpCcUssUUFBUTtFQUNmLElBQUl6TSxLQUFLLENBQUNLLE9BQU8sQ0FBQ29NLFFBQVEsQ0FBQyxFQUFFO0lBQ3pCQSxRQUFRLENBQUM1UixPQUFPLENBQUMsVUFBQ28yQixLQUFLLEVBQUV2NEIsQ0FBQyxFQUFLO01BQzNCLElBQUlrQixpREFBSSxDQUFDcTNCLEtBQUssQ0FBQyxLQUFLLFFBQVEsSUFBSUEsS0FBSyxDQUFDN3VCLEtBQUssRUFBRTtRQUN6Q20xQyxTQUFTLEdBQUdaLGVBQWUsQ0FDdkJZLFNBQVMsRUFDVHRtQixLQUFLLEVBQ0wvbkIsSUFBSSxDQUFDL0UsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUV6TCxDQUFDLENBQUMsRUFDbkM0SyxRQUNKLENBQUM7TUFDTDtJQUNKLENBQUMsQ0FBQztFQUNOLENBQUMsTUFBTSxJQUFJMUosaURBQUksQ0FBQzZTLFFBQVEsQ0FBQyxLQUFLLFFBQVEsSUFBSUEsUUFBUSxDQUFDckssS0FBSyxFQUFFO0lBQ3REbTFDLFNBQVMsR0FBR1osZUFBZSxDQUN2QlksU0FBUyxFQUNUOXFDLFFBQVEsRUFDUnZELElBQUksQ0FBQy9FLE1BQU0sQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLEVBQ2hDYixRQUNKLENBQUM7RUFDTDtFQUNBLE9BQU9pMEMsU0FBUztBQUNwQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3RMLGdCQUFnQkEsQ0FBQ3hwQyxNQUFNLEVBQUVrTCxRQUFRLEVBQUVySyxRQUFRLEVBQUU7RUFDekQsSUFBQWswQyxVQUFBLEdBUUkxQixRQUFRLENBQUNyekMsTUFBTSxDQUFDO0lBUGhCeXpDLFVBQVUsR0FBQXNCLFVBQUEsQ0FBVnRCLFVBQVU7SUFDVnZwQyxFQUFFLEdBQUE2cUMsVUFBQSxDQUFGN3FDLEVBQUU7SUFDRnZLLEtBQUssR0FBQW8xQyxVQUFBLENBQUxwMUMsS0FBSztJQUNMeXpDLFdBQVcsR0FBQTJCLFVBQUEsQ0FBWDNCLFdBQVc7SUFDWEcsZUFBZSxHQUFBd0IsVUFBQSxDQUFmeEIsZUFBZTtJQUNmQyxnQkFBZ0IsR0FBQXVCLFVBQUEsQ0FBaEJ2QixnQkFBZ0I7SUFDaEIxcEMsT0FBTyxHQUFBaXJDLFVBQUEsQ0FBUGpyQyxPQUFPO0VBR1gsSUFBTWtyQyxRQUFRLEdBQUcsU0FBWEEsUUFBUUEsQ0FBSXI2QixRQUFRLEVBQUVzNkIsT0FBTztJQUFBLE9BQy9CdDZCLFFBQVEsSUFBSXpQLFFBQVEsR0FBR0EsUUFBUSxDQUFDeVAsUUFBUSxDQUFDLEdBQUdzNkIsT0FBTztFQUFBO0VBQ3ZELElBQU1DLGdCQUFnQixHQUFHRixRQUFRLENBQUMsYUFBYSxFQUFFNUIsV0FBVyxDQUFDO0VBRTdELElBQUksQ0FBQ0ssVUFBVSxJQUFJLEVBQUVMLFdBQVcsSUFBSThCLGdCQUFnQixDQUFDLEVBQUU7SUFDbkQsT0FBT2hxQyxRQUFRO0VBQ25CO0VBRUEsSUFBTWlxQyxvQkFBb0IsR0FBR0gsUUFBUSxDQUFDLGtCQUFrQixFQUFFeEIsZ0JBQWdCLENBQUM7RUFDM0UsSUFBTTRCLG1CQUFtQixHQUFHSixRQUFRLENBQUMsaUJBQWlCLEVBQUV6QixlQUFlLENBQUM7RUFDeEUsSUFBTThCLGtCQUFrQixHQUNwQkgsZ0JBQWdCLEtBQUs5QixXQUFXLElBQ2hDK0Isb0JBQW9CLEtBQUszQixnQkFBZ0IsSUFDekM0QixtQkFBbUIsS0FBSzdCLGVBQWU7RUFFM0MsSUFBTStCLGFBQWEsR0FBRyxTQUFoQkEsYUFBYUEsQ0FBR25DLGFBQWE7SUFBQSxPQUMvQixFQUFFQSxhQUFhLENBQUN6ckMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJd0QsUUFBUSxDQUFDO0VBQUE7RUFFOUMsSUFBTW1wQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0VBRWpCLElBQUlrQixnQkFBZ0IsR0FBRzUxQyxLQUFLO0VBRTVCLElBQUkwMUMsa0JBQWtCLElBQUlqQyxXQUFXLEVBQUU7SUFDbkM7SUFDQSxJQUFNUyxPQUFPLEdBQUdwQixRQUFRLENBQUNlLGdCQUFnQixFQUFFM3lDLFFBQVEsQ0FBQztJQUNwRHpJLGlEQUFPLENBQ0gsVUFBQSs2QyxhQUFhO01BQUEsT0FDVGlCLE9BQU8sQ0FDSGxCLFVBQVUsQ0FBQ2hwQyxFQUFFLEVBQUVpcEMsYUFBYSxFQUFFQyxXQUFXLENBQUMsRUFDMUNTLE9BQU8sRUFDUC9wQyxPQUFPLEVBQ1BuSyxLQUFLLEVBQ0x3ekMsYUFBYSxFQUNia0IsTUFBTSxFQUNORixJQUNKLENBQUM7SUFBQSxHQUNMNXRDLGlEQUFNLENBQUMrdUMsYUFBYSxFQUFFL0IsZUFBZSxDQUN6QyxDQUFDO0lBQ0RnQyxnQkFBZ0IsR0FBRzNzQyxrREFBVSxDQUFDakosS0FBSyxFQUFFMDBDLE1BQU0sQ0FBQztFQUNoRDtFQUVBLElBQUlhLGdCQUFnQixFQUFFO0lBQ2xCLElBQU1NLFlBQVksR0FBRy9DLFFBQVEsQ0FBQzBDLG9CQUFvQixFQUFFdDBDLFFBQVEsQ0FBQztJQUU3RCxJQUFJdzBDLGtCQUFrQixFQUFFO01BQ3BCO01BQ0FqOUMsaURBQU8sQ0FDSCxVQUFBKzZDLGFBQWE7UUFBQSxPQUNUaUIsT0FBTyxDQUNIbEIsVUFBVSxDQUFDaHBDLEVBQUUsRUFBRWlwQyxhQUFhLEVBQUUrQixnQkFBZ0IsQ0FBQyxFQUMvQ00sWUFBWSxFQUNaMXJDLE9BQU8sRUFDUHlyQyxnQkFBZ0IsRUFDaEJwQyxhQUFhLEVBQ2JrQixNQUNKLENBQUM7TUFBQSxHQUNMOXRDLGlEQUFNLENBQUMrdUMsYUFBYSxFQUFFRixtQkFBbUIsQ0FDN0MsQ0FBQztJQUNMOztJQUVBO0lBQ0E7SUFDQSxJQUFNSyxVQUFVLEdBQUczckMsT0FBTyxDQUFDbXBDLHFCQUFxQixJQUFJLENBQUMsQ0FBQztJQUN0RCxLQUFLLElBQU10NEIsUUFBUSxJQUFJelAsUUFBUSxFQUFFO01BQzdCLElBQU13cUMsY0FBYyxHQUFHRCxVQUFVLENBQUM5NkIsUUFBUSxDQUFDO01BQzNDLElBQUkrNkIsY0FBYyxFQUFFO1FBQ2hCLEtBQUssSUFBTTFDLFFBQVEsSUFBSTBDLGNBQWMsRUFBRTtVQUNuQ0YsWUFBWSxDQUFDbEUsVUFBVSxDQUNuQjRCLFVBQVUsQ0FDTmhwQyxFQUFFLEtBQUF4SSxNQUFBLENBQ0NpWixRQUFRLE9BQUFqWixNQUFBLENBQUlzeEMsUUFBUSxHQUN2QmtDLGdCQUNKLENBQ0osQ0FBQztRQUNMO01BQ0osQ0FBQyxNQUFNO1FBQ0hNLFlBQVksQ0FBQ2xFLFVBQVUsQ0FDbkI0QixVQUFVLENBQUNocEMsRUFBRSxFQUFFeVEsUUFBUSxFQUFFdTZCLGdCQUFnQixDQUM3QyxDQUFDO01BQ0w7SUFDSjtFQUNKO0VBQ0EsT0FBT0csa0JBQWtCLEdBQUd6c0Msa0RBQVUsQ0FBQ3NDLFFBQVEsRUFBRW1wQyxNQUFNLENBQUMsR0FBR25wQyxRQUFRO0FBQ3ZFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvaEJtRDtBQUVwQyxTQUFTeXFDLGdCQUFnQkEsQ0FBQzl2QyxLQUFLLEVBQUU7RUFDNUMsT0FBTyxTQUFTK3ZDLFVBQVVBLENBQUEsRUFBcUI7SUFBQSxJQUFwQm55QyxLQUFLLEdBQUEvRyxTQUFBLENBQUFyQyxNQUFBLFFBQUFxQyxTQUFBLFFBQUFHLFNBQUEsR0FBQUgsU0FBQSxNQUFHLENBQUMsQ0FBQztJQUFBLElBQUU2akIsTUFBTSxHQUFBN2pCLFNBQUEsQ0FBQXJDLE1BQUEsT0FBQXFDLFNBQUEsTUFBQUcsU0FBQTtJQUN6QyxJQUFJZzVDLFFBQVEsR0FBR3B5QyxLQUFLO0lBQ3BCLElBQUk4YyxNQUFNLENBQUNwcEIsSUFBSSxLQUFLME8sS0FBSyxFQUFFO01BQ3ZCLElBQUFpd0MsZUFBQSxHQUE4QnYxQixNQUFNLENBQUNyUSxPQUFPO1FBQXJDaEcsRUFBRSxHQUFBNHJDLGVBQUEsQ0FBRjVyQyxFQUFFO1FBQUVwSSxNQUFNLEdBQUFnMEMsZUFBQSxDQUFOaDBDLE1BQU07UUFBRUQsT0FBTyxHQUFBaTBDLGVBQUEsQ0FBUGowQyxPQUFPO01BQzFCLElBQU1rMEMsVUFBVSxHQUFHO1FBQUNqMEMsTUFBTTtRQUFFRDtNQUFPLENBQUM7TUFDcEMsSUFBSXRFLEtBQUssQ0FBQ0ssT0FBTyxDQUFDc00sRUFBRSxDQUFDLEVBQUU7UUFDbkIyckMsUUFBUSxHQUFHdnRDLGlEQUFTLENBQUM0QixFQUFFLEVBQUU2ckMsVUFBVSxFQUFFdHlDLEtBQUssQ0FBQztNQUMvQyxDQUFDLE1BQU0sSUFBSXlHLEVBQUUsRUFBRTtRQUNYMnJDLFFBQVEsR0FBR3h0QyxpREFBSyxDQUFDNkIsRUFBRSxFQUFFNnJDLFVBQVUsRUFBRXR5QyxLQUFLLENBQUM7TUFDM0MsQ0FBQyxNQUFNO1FBQ0hveUMsUUFBUSxHQUFHanRDLGlEQUFVLENBQUNuRixLQUFLLEVBQUVzeUMsVUFBVSxDQUFDO01BQzVDO0lBQ0o7SUFDQSxPQUFPRixRQUFRO0VBQ25CLENBQUM7QUFDTDs7Ozs7Ozs7Ozs7Ozs7QUNsQitDO0FBQ1A7QUFFeEMsU0FBU2oyQyxZQUFZQSxDQUFBLEVBQXlDO0VBQUEsSUFBeEM2RCxLQUFLLEdBQUEvRyxTQUFBLENBQUFyQyxNQUFBLFFBQUFxQyxTQUFBLFFBQUFHLFNBQUEsR0FBQUgsU0FBQSxNQUFHMEMsdURBQVcsQ0FBQyxTQUFTLENBQUM7RUFBQSxJQUFFbWhCLE1BQU0sR0FBQTdqQixTQUFBLENBQUFyQyxNQUFBLE9BQUFxQyxTQUFBLE1BQUFHLFNBQUE7RUFDeEQsUUFBUTBqQixNQUFNLENBQUNwcEIsSUFBSTtJQUNmLEtBQUttcEIsNkRBQVMsQ0FBQyxtQkFBbUIsQ0FBQztNQUMvQixPQUFPbGhCLHVEQUFXLENBQUNtaEIsTUFBTSxDQUFDclEsT0FBTyxDQUFDO0lBQ3RDO01BQ0ksT0FBT3pNLEtBQUs7RUFDcEI7QUFDSjtBQUVBLCtEQUFlN0QsWUFBWTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWm9CO0FBbUIvQyxJQUFNbzJDLE1BQU0sR0FBRyxTQUFUQSxNQUFNQSxDQUFJLzZCLEdBQXVCLEVBQUV4WCxLQUF1QjtFQUFBLE9BQzVENEUsaURBQUssQ0FBQzRTLEdBQUcsQ0FBQ2tCLEtBQUssRUFBRWxCLEdBQUcsRUFBRXhYLEtBQUssQ0FBQztBQUFBO0FBQ2hDLElBQU13eUMsU0FBUyxHQUFHLFNBQVpBLFNBQVNBLENBQUk5NUIsS0FBYSxFQUFFMVksS0FBdUI7RUFBQSxPQUNyRDhFLGlEQUFNLENBQUM0VCxLQUFLLEVBQUUxWSxLQUFLLENBQUM7QUFBQTtBQUN4QixJQUFNeXlDLFdBQVcsR0FBRyxTQUFkQSxXQUFXQSxDQUFJLzVCLEtBQWEsRUFBRTFZLEtBQXVCO0VBQUEsT0FDdkQ2RSxpREFBUyxDQUFDLENBQUM2VCxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUUsSUFBSSxFQUFFMVksS0FBSyxDQUFDO0FBQUE7QUFFL0MsNkJBQWUsc0NBR2I7RUFBQSxJQUZFQSxLQUF1QixHQUFBL0csU0FBQSxDQUFBckMsTUFBQSxRQUFBcUMsU0FBQSxRQUFBRyxTQUFBLEdBQUFILFNBQUEsTUFBRyxDQUFDLENBQUM7RUFBQSxJQUM1QjZqQixNQUF5QixHQUFBN2pCLFNBQUEsQ0FBQXJDLE1BQUEsT0FBQXFDLFNBQUEsTUFBQUcsU0FBQTtFQUV6QixRQUFRMGpCLE1BQU0sQ0FBQ3BwQixJQUFJO0lBQ2YsS0FBSyxrQkFBa0I7TUFDbkIsT0FBTzYrQyxNQUFNLENBQUN6MUIsTUFBTSxDQUFDclEsT0FBTyxFQUFFek0sS0FBSyxDQUFDO0lBQ3hDLEtBQUsscUJBQXFCO01BQ3RCLE9BQU93eUMsU0FBUyxDQUFDMTFCLE1BQU0sQ0FBQ3JRLE9BQU8sQ0FBQ2lNLEtBQUssRUFBRTFZLEtBQUssQ0FBQztJQUNqRCxLQUFLLHVCQUF1QjtNQUN4QixPQUFPeXlDLFdBQVcsQ0FBQzMxQixNQUFNLENBQUNyUSxPQUFPLENBQUNpTSxLQUFLLEVBQUUxWSxLQUFLLENBQUM7SUFDbkQ7TUFDSSxPQUFPQSxLQUFLO0VBQ3BCO0FBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hDaUQ7QUFZMUMsSUFBSzZPLGtCQUFrQiwwQkFBbEJBLGtCQUFrQjtFQUFsQkEsa0JBQWtCO0VBQWxCQSxrQkFBa0I7RUFBbEJBLGtCQUFrQjtFQUFsQkEsa0JBQWtCO0VBQWxCQSxrQkFBa0I7RUFBbEJBLGtCQUFrQjtFQUFsQkEsa0JBQWtCO0VBQWxCQSxrQkFBa0I7RUFBbEJBLGtCQUFrQjtFQUFsQkEsa0JBQWtCO0VBQWxCQSxrQkFBa0I7RUFBbEJBLGtCQUFrQjtFQUFsQkEsa0JBQWtCO0VBQWxCQSxrQkFBa0I7RUFBQSxPQUFsQkEsa0JBQWtCO0FBQUE7QUFpQnZCLElBQUtDLDJCQUEyQiwwQkFBM0JBLDJCQUEyQjtFQUEzQkEsMkJBQTJCO0VBQTNCQSwyQkFBMkI7RUFBQSxPQUEzQkEsMkJBQTJCO0FBQUE7QUFpQ3ZDLElBQU00akMsYUFBOEIsR0FBRztFQUNuQzdJLE9BQU8sRUFBRSxFQUFFO0VBQ1g3RCxRQUFRLEVBQUUsRUFBRTtFQUNaMEIsU0FBUyxFQUFFLEVBQUU7RUFDYjZCLFdBQVcsRUFBRSxFQUFFO0VBQ2ZXLFNBQVMsRUFBRSxFQUFFO0VBQ2JELE1BQU0sRUFBRSxFQUFFO0VBQ1ZwQyxPQUFPLEVBQUUsRUFBRTtFQUNYOEssU0FBUyxFQUFFO0FBQ2YsQ0FBQztBQUVELElBQU1YLFVBRUwsR0FBRztFQUNBLENBQUNuakMsa0JBQWtCLENBQUNVLFVBQVUsR0FBR3RSLDZDQUFNO0VBQ3ZDLENBQUM0USxrQkFBa0IsQ0FBQ2MsV0FBVyxHQUFHMVIsNkNBQU07RUFDeEMsQ0FBQzRRLGtCQUFrQixDQUFDZ0IsWUFBWSxHQUFHNVIsNkNBQU07RUFDekMsQ0FBQzRRLGtCQUFrQixDQUFDa0IsY0FBYyxHQUFHOVIsNkNBQU07RUFDM0MsQ0FBQzRRLGtCQUFrQixDQUFDb0IsWUFBWSxHQUFHaFMsNkNBQU07RUFDekMsQ0FBQzRRLGtCQUFrQixDQUFDc0IsU0FBUyxHQUFHbFMsNkNBQU07RUFDdEMsQ0FBQzRRLGtCQUFrQixDQUFDd0IsVUFBVSxHQUFHcFMsNkNBQU07RUFDdkMsQ0FBQzRRLGtCQUFrQixDQUFDNEIsYUFBYSxHQUFHME0sNkNBQVU7RUFDOUMsQ0FBQ3RPLGtCQUFrQixDQUFDMEIsY0FBYyxHQUFHNE0sNkNBQVU7RUFDL0MsQ0FBQ3RPLGtCQUFrQixDQUFDOEIsZUFBZSxHQUFHd00sNkNBQVU7RUFDaEQsQ0FBQ3RPLGtCQUFrQixDQUFDZ0MsaUJBQWlCLEdBQUdzTSw2Q0FBVTtFQUNsRCxDQUFDdE8sa0JBQWtCLENBQUNrQyxlQUFlLEdBQUdvTSw2Q0FBVTtFQUNoRCxDQUFDdE8sa0JBQWtCLENBQUNvQyxZQUFZLEdBQUdrTSw2Q0FBVTtFQUM3QyxDQUFDdE8sa0JBQWtCLENBQUNzQyxhQUFhLEdBQUdnTSw2Q0FBVUE7QUFDbEQsQ0FBQztBQUVELElBQU15MUIsTUFFTCxHQUFHO0VBQ0EsQ0FBQy9qQyxrQkFBa0IsQ0FBQ1UsVUFBVSxHQUFHLFNBQVM7RUFDMUMsQ0FBQ1Ysa0JBQWtCLENBQUNjLFdBQVcsR0FBRyxVQUFVO0VBQzVDLENBQUNkLGtCQUFrQixDQUFDZ0IsWUFBWSxHQUFHLFdBQVc7RUFDOUMsQ0FBQ2hCLGtCQUFrQixDQUFDa0IsY0FBYyxHQUFHLGFBQWE7RUFDbEQsQ0FBQ2xCLGtCQUFrQixDQUFDb0IsWUFBWSxHQUFHLFdBQVc7RUFDOUMsQ0FBQ3BCLGtCQUFrQixDQUFDc0IsU0FBUyxHQUFHLFFBQVE7RUFDeEMsQ0FBQ3RCLGtCQUFrQixDQUFDd0IsVUFBVSxHQUFHLFNBQVM7RUFDMUMsQ0FBQ3hCLGtCQUFrQixDQUFDNEIsYUFBYSxHQUFHLFNBQVM7RUFDN0MsQ0FBQzVCLGtCQUFrQixDQUFDMEIsY0FBYyxHQUFHLFVBQVU7RUFDL0MsQ0FBQzFCLGtCQUFrQixDQUFDOEIsZUFBZSxHQUFHLFdBQVc7RUFDakQsQ0FBQzlCLGtCQUFrQixDQUFDZ0MsaUJBQWlCLEdBQUcsYUFBYTtFQUNyRCxDQUFDaEMsa0JBQWtCLENBQUNrQyxlQUFlLEdBQUcsV0FBVztFQUNqRCxDQUFDbEMsa0JBQWtCLENBQUNvQyxZQUFZLEdBQUcsUUFBUTtFQUMzQyxDQUFDcEMsa0JBQWtCLENBQUNzQyxhQUFhLEdBQUc7QUFDeEMsQ0FBQztBQUVELElBQU0waEMsZUFBZSxHQUFHLFNBQWxCQSxlQUFlQSxDQUFJN3lDLEtBQXNCLEVBQUU4YyxNQUF3QjtFQUFBLE9BQUF6YixhQUFBLENBQUFBLGFBQUEsS0FDbEVyQixLQUFLO0lBQ1IyeUMsU0FBUyxFQUFFM3lDLEtBQUssQ0FBQzJ5QyxTQUFTLEdBQUc3MUIsTUFBTSxDQUFDclE7RUFBTztBQUFBLENBQzdDO0FBRUYsSUFBTXFtQyxlQUFlLEdBQUcsU0FBbEJBLGVBQWVBLENBQUk5eUMsS0FBc0IsRUFBRThjLE1BQXVCLEVBQUs7RUFDekUsSUFBTXEwQixTQUFTLEdBQUdhLFVBQVUsQ0FBQ2wxQixNQUFNLENBQUNwcEIsSUFBSSxDQUFDO0VBQ3pDLElBQU1xL0MsS0FBSyxHQUFHSCxNQUFNLENBQUM5MUIsTUFBTSxDQUFDcHBCLElBQUksQ0FBQztFQUVqQyxPQUFPLENBQUN5OUMsU0FBUyxJQUFJLENBQUM0QixLQUFLLElBQUlqMkIsTUFBTSxDQUFDclEsT0FBTyxDQUFDN1YsTUFBTSxLQUFLLENBQUMsR0FDcERvSixLQUFLLEdBQUFxQixhQUFBLENBQUFBLGFBQUEsS0FFRXJCLEtBQUs7SUFDUixDQUFDK3lDLEtBQUssR0FBRzVCLFNBQVMsQ0FBQ254QyxLQUFLLENBQUMreUMsS0FBSyxDQUFDLEVBQUVqMkIsTUFBTSxDQUFDclEsT0FBTztFQUFDLEVBQ25EO0FBQ1gsQ0FBQztBQUVELCtEQUFlO0VBQUEsSUFDWHpNLEtBQXNCLEdBQUEvRyxTQUFBLENBQUFyQyxNQUFBLFFBQUFxQyxTQUFBLFFBQUFHLFNBQUEsR0FBQUgsU0FBQSxNQUFHeTVDLGFBQWE7RUFBQSxJQUN0QzUxQixNQUFzQixHQUFBN2pCLFNBQUEsQ0FBQXJDLE1BQUEsT0FBQXFDLFNBQUEsTUFBQUcsU0FBQTtFQUFBLE9BRXRCK3hCLGlEQUFNLENBQ0YsVUFBQ24zQixDQUFDLEVBQUV0QixDQUFDLEVBQUs7SUFDTixJQUFJQSxDQUFDLEtBQUssSUFBSSxFQUFFO01BQ1osT0FBT3NCLENBQUM7SUFDWixDQUFDLE1BQU0sSUFBSXRCLENBQUMsQ0FBQ2dCLElBQUksS0FBS29iLDJCQUEyQixDQUFDVyxZQUFZLEVBQUU7TUFDNUQsT0FBT29qQyxlQUFlLENBQUM3K0MsQ0FBQyxFQUFFdEIsQ0FBQyxDQUFDO0lBQ2hDO0lBRUEsT0FBT29nRCxlQUFlLENBQUM5K0MsQ0FBQyxFQUFFdEIsQ0FBQyxDQUFDO0VBQ2hDLENBQUMsRUFDRHNOLEtBQUssRUFDTDhjLE1BQU0sQ0FBQ3BwQixJQUFJLEtBQUtvYiwyQkFBMkIsQ0FBQ3VDLFNBQVMsR0FDL0N5TCxNQUFNLENBQUNyUSxPQUFPLEdBQ2QsQ0FBQ3FRLE1BQU0sQ0FDakIsQ0FBQztBQUFBOzs7Ozs7Ozs7Ozs7QUNsSkwsSUFBTWsyQixhQUFhLEdBQUc7RUFDbEJ2c0MsRUFBRSxFQUFFLElBQUk7RUFDUnZLLEtBQUssRUFBRSxDQUFDO0FBQ1osQ0FBQztBQUVELFNBQVN3L0IsT0FBT0EsQ0FBQSxFQUF3QjtFQUFBLElBQXZCMTdCLEtBQUssR0FBQS9HLFNBQUEsQ0FBQXJDLE1BQUEsUUFBQXFDLFNBQUEsUUFBQUcsU0FBQSxHQUFBSCxTQUFBLE1BQUcrNUMsYUFBYTtFQUNsQztFQUNBO0VBQ0E7RUFDQSxPQUFPaHpDLEtBQUs7QUFDaEI7QUFFQSwrREFBZTA3QixPQUFPOzs7Ozs7Ozs7Ozs7Ozs7OztBQ1p5QjtBQUNWO0FBRXRCLFNBQVN0L0IsTUFBTUEsQ0FBQSxFQUF1QjtFQUFBLElBQXRCNEQsS0FBSyxHQUFBL0csU0FBQSxDQUFBckMsTUFBQSxRQUFBcUMsU0FBQSxRQUFBRyxTQUFBLEdBQUFILFNBQUEsTUFBRyxJQUFJO0VBQUEsSUFBRTZqQixNQUFNLEdBQUE3akIsU0FBQSxDQUFBckMsTUFBQSxPQUFBcUMsU0FBQSxNQUFBRyxTQUFBO0VBQy9DLElBQUkwakIsTUFBTSxDQUFDcHBCLElBQUksS0FBS21wQiw2REFBUyxDQUFDLFlBQVksQ0FBQyxFQUFFO0lBQ3pDO0lBQ0E5ZSxNQUFNLENBQUN5MUIsMkJBQTJCLEdBQUc1b0IsaURBQWMsQ0FDL0M3TSxNQUFNLENBQUN5MUIsMkJBQTJCLElBQUksQ0FBQyxDQUFDLEVBQ3hDMVcsTUFBTSxDQUFDclEsT0FBTyxDQUFDd21DLGNBQ25CLENBQUM7SUFDRCxPQUFPbjJCLE1BQU0sQ0FBQ3JRLE9BQU87RUFDekIsQ0FBQyxNQUFNLElBQUlxUSxNQUFNLENBQUNwcEIsSUFBSSxLQUFLbXBCLDZEQUFTLENBQUMsa0JBQWtCLENBQUMsRUFBRTtJQUN0RCxPQUFPalMsaURBQWMsQ0FBQzVLLEtBQUssRUFBRTtNQUN6QndCLEtBQUssRUFBRTtRQUNIRSxPQUFPLEVBQUVvYixNQUFNLENBQUNyUTtNQUNwQjtJQUNKLENBQUMsQ0FBQztFQUNOO0VBQ0EsT0FBT3pNLEtBQUs7QUFDaEI7Ozs7Ozs7Ozs7Ozs7OztBQ25CTyxTQUFTckUsV0FBV0EsQ0FBQ3FFLEtBQUssRUFBRTtFQUMvQixJQUFNa3pDLFNBQVMsR0FBRztJQUNkQyxPQUFPLEVBQUUsU0FBUztJQUNsQkMsUUFBUSxFQUFFLFVBQVU7SUFDcEJDLFNBQVMsRUFBRTtFQUNmLENBQUM7RUFDRCxJQUFJSCxTQUFTLENBQUNsekMsS0FBSyxDQUFDLEVBQUU7SUFDbEIsT0FBT2t6QyxTQUFTLENBQUNsekMsS0FBSyxDQUFDO0VBQzNCO0VBQ0EsTUFBTSxJQUFJN0ssS0FBSyxJQUFBOEksTUFBQSxDQUFJK0IsS0FBSywrQkFBNEIsQ0FBQztBQUN6RDs7Ozs7Ozs7Ozs7O0FDVkEsSUFBTXN6QyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBRXZCLElBQU1oMkMsTUFBTSxHQUFHLFNBQVRBLE1BQU1BLENBQUEsRUFBcUM7RUFBQSxJQUFqQzBDLEtBQUssR0FBQS9HLFNBQUEsQ0FBQXJDLE1BQUEsUUFBQXFDLFNBQUEsUUFBQUcsU0FBQSxHQUFBSCxTQUFBLE1BQUdxNkMsWUFBWTtFQUFBLElBQUV4MkIsTUFBTSxHQUFBN2pCLFNBQUEsQ0FBQXJDLE1BQUEsT0FBQXFDLFNBQUEsTUFBQUcsU0FBQTtFQUN4QyxJQUFJMGpCLE1BQU0sQ0FBQ3BwQixJQUFJLEtBQUssWUFBWSxFQUFFO0lBQzlCLE9BQU9vcEIsTUFBTSxDQUFDclEsT0FBTztFQUN6QjtFQUNBLE9BQU96TSxLQUFLO0FBQ2hCLENBQUM7QUFFRCwrREFBZTFDLE1BQU07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNUWTtBQUVqQyxJQUFNaTJDLFlBQVksR0FBRztFQUNqQmgwQyxRQUFRLEVBQUUsRUFBRTtFQUNaQyxPQUFPLEVBQUUsRUFBRTtFQUNYZ04sZ0JBQWdCLEVBQUU7QUFDdEIsQ0FBQztBQUVjLFNBQVM1VCxLQUFLQSxDQUFBLEVBQStCO0VBQUEsSUFBOUJvSCxLQUFLLEdBQUEvRyxTQUFBLENBQUFyQyxNQUFBLFFBQUFxQyxTQUFBLFFBQUFHLFNBQUEsR0FBQUgsU0FBQSxNQUFHczZDLFlBQVk7RUFBQSxJQUFFejJCLE1BQU0sR0FBQTdqQixTQUFBLENBQUFyQyxNQUFBLE9BQUFxQyxTQUFBLE1BQUFHLFNBQUE7RUFDdEQsUUFBUTBqQixNQUFNLENBQUNwcEIsSUFBSTtJQUNmLEtBQUssVUFBVTtNQUFFO1FBQ2IsSUFBTzZMLFFBQVEsR0FBK0JTLEtBQUssQ0FBNUNULFFBQVE7VUFBRUMsT0FBTyxHQUFzQlEsS0FBSyxDQUFsQ1IsT0FBTztVQUFFZ04sZ0JBQWdCLEdBQUl4TSxLQUFLLENBQXpCd00sZ0JBQWdCO1FBQzFDO1FBQ0E7UUFDQTtRQUNBbkIsT0FBTyxDQUFDelMsS0FBSyxDQUFDa2tCLE1BQU0sQ0FBQ3JRLE9BQU8sQ0FBQzdULEtBQUssQ0FBQztRQUVuQyxJQUFJa2tCLE1BQU0sQ0FBQ3JRLE9BQU8sQ0FBQy9ZLElBQUksS0FBSyxVQUFVLEVBQUU7VUFDcEMsT0FBTztZQUNINkwsUUFBUSxHQUNKNEYsaURBQVUsQ0FBQzJYLE1BQU0sQ0FBQ3JRLE9BQU8sRUFBRTtjQUFDbTFCLFNBQVMsRUFBRSxJQUFJM3NCLElBQUksQ0FBQztZQUFDLENBQUMsQ0FBQyxFQUFBaFgsTUFBQSxDQUFBMkksa0JBQUEsQ0FDaERySCxRQUFRLEVBQ2Q7WUFDREMsT0FBTztZQUNQZ047VUFDSixDQUFDO1FBQ0wsQ0FBQyxNQUFNLElBQUlzUSxNQUFNLENBQUNyUSxPQUFPLENBQUMvWSxJQUFJLEtBQUssU0FBUyxFQUFFO1VBQzFDLE9BQU87WUFDSDZMLFFBQVE7WUFDUkMsT0FBTyxHQUNIMkYsaURBQVUsQ0FBQzJYLE1BQU0sQ0FBQ3JRLE9BQU8sRUFBRTtjQUFDbTFCLFNBQVMsRUFBRSxJQUFJM3NCLElBQUksQ0FBQztZQUFDLENBQUMsQ0FBQyxFQUFBaFgsTUFBQSxDQUFBMkksa0JBQUEsQ0FDaERwSCxPQUFPLEVBQ2I7WUFDRGdOO1VBQ0osQ0FBQztRQUNMO1FBQ0EsT0FBT3hNLEtBQUs7TUFDaEI7SUFDQSxLQUFLLHVCQUF1QjtNQUFFO1FBQzFCLE9BQU9tRixpREFBVSxDQUFDbkYsS0FBSyxFQUFFO1VBQUN3TSxnQkFBZ0IsRUFBRXNRLE1BQU0sQ0FBQ3JRO1FBQU8sQ0FBQyxDQUFDO01BQ2hFO0lBRUE7TUFBUztRQUNMLE9BQU96TSxLQUFLO01BQ2hCO0VBQ0o7QUFDSjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOUNBLElBQU13ekMsY0FBYyxHQUFHO0VBQ25CMWtCLElBQUksRUFBRSxFQUFFO0VBQ1Iya0IsT0FBTyxFQUFFLENBQUMsQ0FBQztFQUNYNWtCLE1BQU0sRUFBRTtBQUNaLENBQUM7QUFFRCxTQUFTL3VCLE9BQU9BLENBQUEsRUFBaUM7RUFBQSxJQUFoQ0UsS0FBSyxHQUFBL0csU0FBQSxDQUFBckMsTUFBQSxRQUFBcUMsU0FBQSxRQUFBRyxTQUFBLEdBQUFILFNBQUEsTUFBR3U2QyxjQUFjO0VBQUEsSUFBRTEyQixNQUFNLEdBQUE3akIsU0FBQSxDQUFBckMsTUFBQSxPQUFBcUMsU0FBQSxNQUFBRyxTQUFBO0VBQzNDLFFBQVEwakIsTUFBTSxDQUFDcHBCLElBQUk7SUFDZixLQUFLLE1BQU07TUFBRTtRQUNULElBQU9vN0IsSUFBSSxHQUFxQjl1QixLQUFLLENBQTlCOHVCLElBQUk7VUFBRTJrQixPQUFPLEdBQVl6ekMsS0FBSyxDQUF4Qnl6QyxPQUFPO1VBQUU1a0IsTUFBTSxHQUFJN3VCLEtBQUssQ0FBZjZ1QixNQUFNO1FBQzVCLElBQU05QixRQUFRLEdBQUcrQixJQUFJLENBQUNBLElBQUksQ0FBQ2w0QixNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLElBQU04OEMsT0FBTyxHQUFHNWtCLElBQUksQ0FBQ2wzQixLQUFLLENBQUMsQ0FBQyxFQUFFazNCLElBQUksQ0FBQ2w0QixNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLE9BQU87VUFDSGs0QixJQUFJLEVBQUU0a0IsT0FBTztVQUNiRCxPQUFPLEVBQUUxbUIsUUFBUTtVQUNqQjhCLE1BQU0sR0FBRzRrQixPQUFPLEVBQUF4MUMsTUFBQSxDQUFBMkksa0JBQUEsQ0FBS2lvQixNQUFNO1FBQy9CLENBQUM7TUFDTDtJQUVBLEtBQUssTUFBTTtNQUFFO1FBQ1QsSUFBT0MsS0FBSSxHQUFxQjl1QixLQUFLLENBQTlCOHVCLElBQUk7VUFBRTJrQixRQUFPLEdBQVl6ekMsS0FBSyxDQUF4Qnl6QyxPQUFPO1VBQUU1a0IsT0FBTSxHQUFJN3VCLEtBQUssQ0FBZjZ1QixNQUFNO1FBQzVCLElBQU05NEIsSUFBSSxHQUFHODRCLE9BQU0sQ0FBQyxDQUFDLENBQUM7UUFDdEIsSUFBTThrQixTQUFTLEdBQUc5a0IsT0FBTSxDQUFDajNCLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDakMsT0FBTztVQUNIazNCLElBQUksS0FBQTd3QixNQUFBLENBQUEySSxrQkFBQSxDQUFNa29CLEtBQUksSUFBRTJrQixRQUFPLEVBQUM7VUFDeEJBLE9BQU8sRUFBRTE5QyxJQUFJO1VBQ2I4NEIsTUFBTSxFQUFFOGtCO1FBQ1osQ0FBQztNQUNMO0lBRUEsS0FBSyxRQUFRO01BQUU7UUFDWCxJQUFPN2tCLE1BQUksR0FBWTl1QixLQUFLLENBQXJCOHVCLElBQUk7VUFBRUQsUUFBTSxHQUFJN3VCLEtBQUssQ0FBZjZ1QixNQUFNO1FBQ25CLElBQU05QixTQUFRLEdBQUcrQixNQUFJLENBQUNBLE1BQUksQ0FBQ2w0QixNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLElBQU04OEMsUUFBTyxHQUFHNWtCLE1BQUksQ0FBQ2wzQixLQUFLLENBQUMsQ0FBQyxFQUFFazNCLE1BQUksQ0FBQ2w0QixNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLE9BQU87VUFDSGs0QixJQUFJLEVBQUU0a0IsUUFBTztVQUNiRCxPQUFPLEVBQUUxbUIsU0FBUTtVQUNqQjhCLE1BQU0sRUFBQWpvQixrQkFBQSxDQUFNaW9CLFFBQU07UUFDdEIsQ0FBQztNQUNMO0lBRUE7TUFBUztRQUNMLE9BQU83dUIsS0FBSztNQUNoQjtFQUNKO0FBQ0o7QUFFQSwrREFBZUYsT0FBTzs7Ozs7Ozs7Ozs7O0FDL0N0QixJQUFNOHpDLFdBQVcsR0FBRyxTQUFkQSxXQUFXQSxDQUFBLEVBV1o7RUFBQSxJQVZENXpDLEtBQUssR0FBQS9HLFNBQUEsQ0FBQXJDLE1BQUEsUUFBQXFDLFNBQUEsUUFBQUcsU0FBQSxHQUFBSCxTQUFBLE1BQUc7SUFDSmtHLFVBQVUsRUFBRSxJQUFJO0lBQ2hCQyxXQUFXLEVBQUUsSUFBSTtJQUNqQjZCLFdBQVcsRUFBRSxJQUFJO0lBQ2pCQyxZQUFZLEVBQUUsSUFBSTtJQUNsQkMsaUJBQWlCLEVBQUUsSUFBSTtJQUN2QkMsbUJBQW1CLEVBQUUsSUFBSTtJQUN6Qnl5QyxJQUFJLEVBQUU7RUFDVixDQUFDO0VBQUEsSUFDRC8yQixNQUFNLEdBQUE3akIsU0FBQSxDQUFBckMsTUFBQSxPQUFBcUMsU0FBQSxNQUFBRyxTQUFBO0VBRU4sUUFBUTBqQixNQUFNLENBQUNwcEIsSUFBSTtJQUNmLEtBQUssV0FBVztNQUNaLE9BQU9vcEIsTUFBTSxDQUFDclEsT0FBTztJQUN6QjtNQUNJLE9BQU96TSxLQUFLO0VBQ3BCO0FBQ0osQ0FBQztBQUVELCtEQUFlNHpDLFdBQVc7Ozs7Ozs7Ozs7Ozs7OztBQ3BCbkIsSUFBS25rQixtQkFBbUIsMEJBQW5CQSxtQkFBbUI7RUFBbkJBLG1CQUFtQjtFQUFBLE9BQW5CQSxtQkFBbUI7QUFBQTtBQVkvQixJQUFNaWpCLGFBQTZCLEdBQUcsSUFBSTtBQUUxQywrREFBZTtFQUFBLElBQ1gxeUMsS0FBcUIsR0FBQS9HLFNBQUEsQ0FBQXJDLE1BQUEsUUFBQXFDLFNBQUEsUUFBQUcsU0FBQSxHQUFBSCxTQUFBLE1BQUd5NUMsYUFBYTtFQUFBLElBQ3JDNTFCLE1BQXlCLEdBQUE3akIsU0FBQSxDQUFBckMsTUFBQSxPQUFBcUMsU0FBQSxNQUFBRyxTQUFBO0VBQUEsT0FDdkIwakIsTUFBTSxDQUFDcHBCLElBQUksS0FBSys3QixtQkFBbUIsQ0FBQ0UsR0FBRyxHQUFHN1MsTUFBTSxDQUFDclEsT0FBTyxHQUFHek0sS0FBSztBQUFBLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqQk87QUFFL0I7QUFFL0MsSUFBTXpELE1BQU0sR0FBRyxTQUFUQSxNQUFNQSxDQUFBLEVBQTJCO0VBQUEsSUFBdkJ5RCxLQUFLLEdBQUEvRyxTQUFBLENBQUFyQyxNQUFBLFFBQUFxQyxTQUFBLFFBQUFHLFNBQUEsR0FBQUgsU0FBQSxNQUFHLENBQUMsQ0FBQztFQUFBLElBQUU2akIsTUFBTSxHQUFBN2pCLFNBQUEsQ0FBQXJDLE1BQUEsT0FBQXFDLFNBQUEsTUFBQUcsU0FBQTtFQUM5QixJQUFJMGpCLE1BQU0sQ0FBQ3BwQixJQUFJLEtBQUttcEIsNkRBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRTtJQUN6QyxPQUFPQyxNQUFNLENBQUNyUSxPQUFPO0VBQ3pCLENBQUMsTUFBTSxJQUNIblMsaURBQVEsQ0FBQ3dpQixNQUFNLENBQUNwcEIsSUFBSSxFQUFFLENBQ2xCLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEJtcEIsNkRBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUM5QixDQUFDLEVBQ0o7SUFDRSxJQUFNazNCLFFBQVEsR0FBR2prQixpREFBTSxDQUFDLE9BQU8sRUFBRWhULE1BQU0sQ0FBQ3JRLE9BQU8sQ0FBQ3hFLFFBQVEsQ0FBQztJQUN6RCxJQUFNK3JDLGFBQWEsR0FBR0YsaURBQUksQ0FBQ25ILGlEQUFRLENBQUNvSCxRQUFRLENBQUMsRUFBRS96QyxLQUFLLENBQUM7SUFDckQsSUFBTWkwQyxXQUFXLEdBQUc5dUMsaURBQVUsQ0FBQzZ1QyxhQUFhLEVBQUVsM0IsTUFBTSxDQUFDclEsT0FBTyxDQUFDdlEsS0FBSyxDQUFDO0lBQ25FLE9BQU8ySSxpREFBUyxDQUFDa3ZDLFFBQVEsRUFBRUUsV0FBVyxFQUFFajBDLEtBQUssQ0FBQztFQUNsRDtFQUVBLE9BQU9BLEtBQUs7QUFDaEIsQ0FBQztBQUVELCtEQUFlekQsTUFBTTs7Ozs7Ozs7Ozs7Ozs7O0FDdkJkLElBQUtxekIsb0JBQW9CLDBCQUFwQkEsb0JBQW9CO0VBQXBCQSxvQkFBb0I7RUFBQSxPQUFwQkEsb0JBQW9CO0FBQUE7QUFZaEMsSUFBTThpQixhQUE4QixHQUFHLENBQUMsQ0FBQztBQUV6QywrREFBZTtFQUFBLElBQ1gxeUMsS0FBc0IsR0FBQS9HLFNBQUEsQ0FBQXJDLE1BQUEsUUFBQXFDLFNBQUEsUUFBQUcsU0FBQSxHQUFBSCxTQUFBLE1BQUd5NUMsYUFBYTtFQUFBLElBQ3RDNTFCLE1BQXlCLEdBQUE3akIsU0FBQSxDQUFBckMsTUFBQSxPQUFBcUMsU0FBQSxNQUFBRyxTQUFBO0VBQUEsT0FDdkIwakIsTUFBTSxDQUFDcHBCLElBQUksS0FBS2s4QixvQkFBb0IsQ0FBQ0QsR0FBRyxHQUFHN1MsTUFBTSxDQUFDclEsT0FBTyxHQUFHek0sS0FBSztBQUFBLENBQUM7Ozs7Ozs7Ozs7Ozs7QUNqQnpCO0FBRS9DLElBQU1rMEMsWUFBWSxHQUFHO0VBQUMvaEMsSUFBSSxFQUFFLENBQUMsQ0FBQztFQUFFaUIsSUFBSSxFQUFFLENBQUM7QUFBQyxDQUFDO0FBRXpDLElBQU16QixLQUFLLEdBQUcsU0FBUkEsS0FBS0EsQ0FBQSxFQUFxQztFQUFBLElBQWpDM1IsS0FBSyxHQUFBL0csU0FBQSxDQUFBckMsTUFBQSxRQUFBcUMsU0FBQSxRQUFBRyxTQUFBLEdBQUFILFNBQUEsTUFBR2k3QyxZQUFZO0VBQUEsSUFBRXAzQixNQUFNLEdBQUE3akIsU0FBQSxDQUFBckMsTUFBQSxPQUFBcUMsU0FBQSxNQUFBRyxTQUFBO0VBQ3ZDLElBQUkwakIsTUFBTSxDQUFDcHBCLElBQUksS0FBS21wQiw2REFBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFO0lBQ3hDLE9BQU9DLE1BQU0sQ0FBQ3JRLE9BQU87RUFDekI7RUFDQSxPQUFPek0sS0FBSztBQUNoQixDQUFDO0FBRUQsK0RBQWUyUixLQUFLOzs7Ozs7Ozs7Ozs7Ozs7OztBQ1hRO0FBRXFCO0FBRWpELElBQU15aUMsY0FBYyxHQUFHO0VBQ25CNWEsS0FBSyxFQUFFLENBQUM7RUFDUkUsS0FBSyxFQUFFLENBQUM7RUFDUnNFLE9BQU8sRUFBRSxDQUFDO0VBQ1ZELE9BQU8sRUFBRTtJQUNMdEUsSUFBSSxFQUFFLENBQUM7SUFDUDJFLE1BQU0sRUFBRSxDQUFDO0lBQ1RELFFBQVEsRUFBRTtFQUNkLENBQUM7RUFDRHhwQixTQUFTLEVBQUUsQ0FBQyxDQUFDO0VBQ2J0VyxNQUFNLEVBQUU7SUFDSis3QixNQUFNLEVBQUU7RUFDWixDQUFDO0VBQ0QvbEIsTUFBTSxFQUFFLENBQUM7QUFDYixDQUFDO0FBRUQsSUFBTWdnQyxZQUFZLEdBQUc7RUFDakI1VyxPQUFPLEVBQUUsRUFBRTtFQUNYOW9CLFNBQVMsRUFBRSxDQUFDLENBQUM7RUFDYndMLFNBQVMsRUFBRSxDQUFDLENBQUM7RUFDYitiLFdBQVcsRUFBRTtBQUNqQixDQUFDO0FBRUQsSUFBTXpELE9BQU8sR0FBRyxTQUFWQSxPQUFPQSxDQUFBLEVBQXFDO0VBQUEsSUFBakN6NEIsS0FBSyxHQUFBL0csU0FBQSxDQUFBckMsTUFBQSxRQUFBcUMsU0FBQSxRQUFBRyxTQUFBLEdBQUFILFNBQUEsTUFBR283QyxZQUFZO0VBQUEsSUFBRXYzQixNQUFNLEdBQUE3akIsU0FBQSxDQUFBckMsTUFBQSxPQUFBcUMsU0FBQSxNQUFBRyxTQUFBO0VBQ3pDLElBQUkwakIsTUFBTSxDQUFDcHBCLElBQUksS0FBSyx1QkFBdUIsRUFBRTtJQUN6QztJQUNBO0lBQ0E7SUFDQSxJQUFBMitDLGVBQUEsR0FBNEJ2MUIsTUFBTSxDQUFDclEsT0FBTztNQUFuQ2hHLEVBQUUsR0FBQTRyQyxlQUFBLENBQUY1ckMsRUFBRTtNQUFFbVEsS0FBSyxHQUFBeTdCLGVBQUEsQ0FBTHo3QixLQUFLO01BQUV2WSxNQUFNLEdBQUFnMEMsZUFBQSxDQUFOaDBDLE1BQU07SUFDeEIsSUFBTWkyQyxZQUFZLEdBQUcxVSwyREFBUyxDQUFDdmhDLE1BQU0sQ0FBQyxJQUFJQSxNQUFNOztJQUVoRDtJQUNBLElBQU0rekMsUUFBUSxHQUFHO01BQ2IzVSxPQUFPLEVBQUUsQ0FBQ2gzQixFQUFFLENBQUM7TUFDYmtPLFNBQVMsRUFBRTNVLEtBQUssQ0FBQzJVLFNBQVM7TUFDMUJ3TCxTQUFTLEVBQUVuZ0IsS0FBSyxDQUFDbWdCLFNBQVM7TUFDMUI7TUFDQTtNQUNBO01BQ0ErYixXQUFXLEVBQUVsOEIsS0FBSyxDQUFDazhCO0lBQ3ZCLENBQUM7SUFFRGtXLFFBQVEsQ0FBQ2p5QixTQUFTLENBQUMxWixFQUFFLENBQUMsR0FDbEIyckMsUUFBUSxDQUFDanlCLFNBQVMsQ0FBQzFaLEVBQUUsQ0FBQyxJQUFJMHRDLGlEQUFLLENBQUNDLGNBQWMsQ0FBQztJQUVuRCxJQUFNOWhDLEVBQUUsR0FBRzgvQixRQUFRLENBQUNqeUIsU0FBUyxDQUFDMVosRUFBRSxDQUFDO0lBQ2pDLElBQU04dEMsV0FBVyxHQUFHamlDLEVBQUUsQ0FBQ3FDLFNBQVM7SUFDaEMsSUFBTTYvQixjQUFjLEdBQUdwQyxRQUFRLENBQUN6OUIsU0FBUzs7SUFFekM7SUFDQXJDLEVBQUUsQ0FBQ2tuQixLQUFLLElBQUksQ0FBQztJQUNibG5CLEVBQUUsQ0FBQ2pVLE1BQU0sQ0FBQys3QixNQUFNLEdBQUdrYSxZQUFZO0lBQy9CaGlDLEVBQUUsQ0FBQ2pVLE1BQU0sQ0FBQ2kyQyxZQUFZLENBQUMsR0FBRyxDQUFDaGlDLEVBQUUsQ0FBQ2pVLE1BQU0sQ0FBQ2kyQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUM1RGhpQyxFQUFFLENBQUMrQixNQUFNLEdBQUd5SSxNQUFNLENBQUNyUSxPQUFPLENBQUM0SCxNQUFNO0lBQ2pDL0IsRUFBRSxDQUFDbFAsTUFBTSxHQUFHMFosTUFBTSxDQUFDclEsT0FBTyxDQUFDckosTUFBTTtJQUNqQ2tQLEVBQUUsQ0FBQ3RTLEtBQUssR0FBRzhjLE1BQU0sQ0FBQ3JRLE9BQU8sQ0FBQ3pNLEtBQUs7SUFFL0IsSUFBSTRXLEtBQUssRUFBRTtNQUNQLElBQ0lKLGFBQWEsR0FLYkksS0FBSyxDQUxMSixhQUFhO1FBQ2JELGFBQWEsR0FJYkssS0FBSyxDQUpMTCxhQUFhO1FBQ2JFLGFBQWEsR0FHYkcsS0FBSyxDQUhMSCxhQUFhO1FBQ2JDLGVBQWUsR0FFZkUsS0FBSyxDQUZMRixlQUFlO1FBQ1orOUIsSUFBSSxHQUFBQyx3QkFBQSxDQUNQOTlCLEtBQUssRUFBQSs5QixTQUFBO01BRVRyaUMsRUFBRSxDQUFDb25CLEtBQUssSUFBSWxqQixhQUFhO01BQ3pCbEUsRUFBRSxDQUFDMHJCLE9BQU8sSUFBSXpuQixhQUFhO01BQzNCakUsRUFBRSxDQUFDeXJCLE9BQU8sQ0FBQ3RFLElBQUksSUFBSWpqQixhQUFhLEdBQUdELGFBQWE7TUFDaERqRSxFQUFFLENBQUN5ckIsT0FBTyxDQUFDSyxNQUFNLElBQUkzbkIsYUFBYTtNQUNsQ25FLEVBQUUsQ0FBQ3lyQixPQUFPLENBQUNJLFFBQVEsSUFBSXpuQixlQUFlO01BRXRDLEtBQUssSUFBTTFrQixDQUFDLElBQUl5aUQsSUFBSSxFQUFFO1FBQ2xCLElBQUlBLElBQUksQ0FBQ3JpRCxjQUFjLENBQUNKLENBQUMsQ0FBQyxFQUFFO1VBQ3hCdWlELFdBQVcsQ0FBQ3ZpRCxDQUFDLENBQUMsR0FBRyxDQUFDdWlELFdBQVcsQ0FBQ3ZpRCxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUl5aUQsSUFBSSxDQUFDemlELENBQUMsQ0FBQztVQUNoRHdpRCxjQUFjLENBQUN4aUQsQ0FBQyxDQUFDLEdBQUcsQ0FBQ3dpRCxjQUFjLENBQUN4aUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJeWlELElBQUksQ0FBQ3ppRCxDQUFDLENBQUM7UUFDMUQ7TUFDSjtJQUNKO0lBRUEsT0FBT29nRCxRQUFRO0VBQ25CO0VBRUEsT0FBT3B5QyxLQUFLO0FBQ2hCLENBQUM7QUFFRCwrREFBZXk0QixPQUFPOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMUY2QjtBQUNiO0FBRXlCO0FBRTFCO0FBQ0s7QUFDTjtBQUNOO0FBQ1M7QUFDWDtBQUNJO0FBQ0o7QUFDSTtBQUNBO0FBQ0k7QUFDTjtBQUNRO0FBQ1Y7QUFDYztBQUVuQyxJQUFNb2MsV0FBVyxHQUFHLENBQ3ZCLHFCQUFxQixFQUNyQixlQUFlLEVBQ2YsZUFBZSxFQUNmLGNBQWMsQ0FDakI7QUFFRCxTQUFTQyxXQUFXQSxDQUFBLEVBQUc7RUFDbkIsSUFBTXoxQixLQUFLLEdBQUc7SUFDVmxqQixZQUFZO0lBQ1pna0IsU0FBUztJQUNUL2pCLE1BQU07SUFDTnhELEtBQUs7SUFDTDBFLE1BQU07SUFDTndDLE9BQU87SUFDUFosS0FBSztJQUNMdTVCLE9BQU87SUFDUGlELE9BQU87SUFDUDNHLFNBQVM7SUFDVHg0QixNQUFNO0lBQ05DLFVBQVU7SUFDVm1WLEtBQUtBLGlEQUFBQTtFQUNULENBQUM7RUFDRGhkLGtEQUFPLENBQUMsVUFBQTNDLENBQUMsRUFBSTtJQUNUcXRCLEtBQUssQ0FBQ3J0QixDQUFDLENBQUMsR0FBR2tnRCxnREFBZ0IsQ0FBQ2xnRCxDQUFDLENBQUM7RUFDbEMsQ0FBQyxFQUFFNmlELFdBQVcsQ0FBQztFQUVmeDFCLEtBQUssQ0FBQzdHLFlBQVksR0FBR0Esc0RBQVk7RUFFakMsT0FBT284Qix1REFBZSxDQUFDdjFCLEtBQUssQ0FBQztBQUNqQztBQUVBLFNBQVMwMUIsb0JBQW9CQSxDQUFDdG9DLE9BQU8sRUFBRXpNLEtBQUssRUFBRWcxQyxhQUFhLEVBQUU7RUFDekQsSUFBTzEzQyxNQUFNLEdBQW1CMEMsS0FBSyxDQUE5QjFDLE1BQU07SUFBRXFVLEtBQUssR0FBWTNSLEtBQUssQ0FBdEIyUixLQUFLO0lBQUVwVixNQUFNLEdBQUl5RCxLQUFLLENBQWZ6RCxNQUFNO0VBQzVCLElBQU8wTCxRQUFRLEdBQVd3RSxPQUFPLENBQTFCeEUsUUFBUTtJQUFFL0wsS0FBSyxHQUFJdVEsT0FBTyxDQUFoQnZRLEtBQUs7RUFDdEIsSUFBTSs0QyxRQUFRLEdBQUdqeUMsa0RBQUksQ0FBQ2lGLFFBQVEsQ0FBQ2hLLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUxQixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDL0QsSUFBT2tLLEVBQUUsR0FBSXd1QyxRQUFRLENBQWR4dUMsRUFBRTtFQUVULElBQUl5dUMsWUFBWTtFQUNoQixJQUFJenVDLEVBQUUsRUFBRTtJQUNKLElBQUl1dUMsYUFBYSxFQUFFO01BQ2ZoMUMsS0FBSyxDQUFDMDdCLE9BQU8sR0FBRztRQUFDajFCLEVBQUU7UUFBRXZLO01BQUssQ0FBQztJQUMvQjtJQUVBZzVDLFlBQVksR0FBRztNQUFDenVDLEVBQUU7TUFBRXZLLEtBQUssRUFBRSxDQUFDO0lBQUMsQ0FBQztJQUM5QjNFLGtEQUFJLENBQUMyRSxLQUFLLENBQUMsQ0FBQ3ZILE9BQU8sQ0FBQyxVQUFBd2dELE9BQU8sRUFBSTtNQUMzQixJQUFJMTNCLDZFQUFtQixDQUFDbmdCLE1BQU0sRUFBRXFVLEtBQUssRUFBRWxMLEVBQUUsRUFBRTB1QyxPQUFPLENBQUMsQ0FBQ3YrQyxNQUFNLEVBQUU7UUFDeERzK0MsWUFBWSxDQUFDaDVDLEtBQUssQ0FBQ2k1QyxPQUFPLENBQUMsR0FBR0YsUUFBUSxDQUFDRSxPQUFPLENBQUM7TUFDbkQ7SUFDSixDQUFDLENBQUM7RUFDTjtFQUNBLE9BQU9ELFlBQVk7QUFDdkI7QUFFQSxTQUFTRSxhQUFhQSxDQUFDQyxPQUFPLEVBQUU7RUFDNUIsT0FBTyxVQUFVcjFDLEtBQUssRUFBRThjLE1BQU0sRUFBRTtJQUM1QjtJQUNBLElBQU9wcEIsSUFBSSxHQUFhb3BCLE1BQU0sQ0FBdkJwcEIsSUFBSTtNQUFFK1ksT0FBTyxHQUFJcVEsTUFBTSxDQUFqQnJRLE9BQU87SUFDcEIsSUFBSS9ZLElBQUksS0FBSyxnQkFBZ0IsRUFBRTtNQUMzQjtNQUNBLElBQU13aEQsWUFBWSxHQUFHSCxvQkFBb0IsQ0FBQ3RvQyxPQUFPLEVBQUV6TSxLQUFLLEVBQUUsSUFBSSxDQUFDO01BQy9ELElBQUlrMUMsWUFBWSxJQUFJLENBQUMzNkMsa0RBQU8sQ0FBQzI2QyxZQUFZLENBQUNoNUMsS0FBSyxDQUFDLEVBQUU7UUFDOUM4RCxLQUFLLENBQUNGLE9BQU8sQ0FBQzJ6QyxPQUFPLEdBQUd5QixZQUFZO01BQ3hDO0lBQ0o7SUFFQSxJQUFNSSxTQUFTLEdBQUdELE9BQU8sQ0FBQ3IxQyxLQUFLLEVBQUU4YyxNQUFNLENBQUM7SUFFeEMsSUFBSXBwQixJQUFJLEtBQUssZ0JBQWdCLElBQUkrWSxPQUFPLENBQUM2c0IsTUFBTSxLQUFLLFVBQVUsRUFBRTtNQUM1RDtBQUNaO0FBQ0E7QUFDQTtNQUNZLElBQU00YixhQUFZLEdBQUdILG9CQUFvQixDQUFDdG9DLE9BQU8sRUFBRTZvQyxTQUFTLENBQUM7TUFDN0QsSUFBSUosYUFBWSxJQUFJLENBQUMzNkMsa0RBQU8sQ0FBQzI2QyxhQUFZLENBQUNoNUMsS0FBSyxDQUFDLEVBQUU7UUFDOUNvNUMsU0FBUyxDQUFDeDFDLE9BQU8sR0FBRztVQUNoQmd2QixJQUFJLEtBQUE3d0IsTUFBQSxDQUFBMkksa0JBQUEsQ0FBTTB1QyxTQUFTLENBQUN4MUMsT0FBTyxDQUFDZ3ZCLElBQUksSUFBRTl1QixLQUFLLENBQUNGLE9BQU8sQ0FBQzJ6QyxPQUFPLEVBQUM7VUFDeERBLE9BQU8sRUFBRXlCLGFBQVk7VUFDckJybUIsTUFBTSxFQUFFO1FBQ1osQ0FBQztNQUNMO0lBQ0o7SUFFQSxPQUFPeW1CLFNBQVM7RUFDcEIsQ0FBQztBQUNMO0FBRUEsU0FBU0MsZUFBZUEsQ0FBQ0YsT0FBTyxFQUFFO0VBQzlCLE9BQU8sVUFBVXIxQyxLQUFLLEVBQUU4YyxNQUFNLEVBQUU7SUFDNUIsSUFBQTNhLElBQUEsR0FBaUNuQyxLQUFLLElBQUksQ0FBQyxDQUFDO01BQXJDRixPQUFPLEdBQUFxQyxJQUFBLENBQVByQyxPQUFPO01BQUUxRCxNQUFNLEdBQUErRixJQUFBLENBQU4vRixNQUFNO01BQUU4QyxLQUFLLEdBQUFpRCxJQUFBLENBQUxqRCxLQUFLO0lBQzdCLElBQUlrekMsUUFBUSxHQUFHcHlDLEtBQUs7SUFDcEIsSUFBSThjLE1BQU0sQ0FBQ3BwQixJQUFJLEtBQUssUUFBUSxFQUFFO01BQzFCMCtDLFFBQVEsR0FBRztRQUFDdHlDLE9BQU87UUFBRTFELE1BQU07UUFBRThDO01BQUssQ0FBQztJQUN2QyxDQUFDLE1BQU0sSUFBSTRkLE1BQU0sQ0FBQ3BwQixJQUFJLEtBQUssWUFBWSxFQUFFO01BQ3JDO01BQ0E7TUFDQTtNQUNBMCtDLFFBQVEsR0FBRztRQUFDbHpDO01BQUssQ0FBQztJQUN0QjtJQUNBLE9BQU9tMkMsT0FBTyxDQUFDakQsUUFBUSxFQUFFdDFCLE1BQU0sQ0FBQztFQUNwQyxDQUFDO0FBQ0w7QUFFTyxTQUFTMDRCLGFBQWFBLENBQUEsRUFBRztFQUM1QixPQUFPRCxlQUFlLENBQUNILGFBQWEsQ0FBQ04sV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hEOzs7Ozs7Ozs7Ozs7QUM5SEEsK0RBQWU7RUFDWC8vQyxPQUFPLEVBQUUsU0FBQUEsUUFBQXlTLFNBQVMsRUFBSTtJQUNsQixJQUFPOVQsSUFBSSxHQUFlOFQsU0FBUyxDQUE1QjlULElBQUk7TUFBRW9WLFNBQVMsR0FBSXRCLFNBQVMsQ0FBdEJzQixTQUFTO0lBRXRCLElBQU0yK0IsRUFBRSxHQUFHMXBDLE1BQU0sQ0FBQytLLFNBQVMsQ0FBQztJQUU1QixJQUFJMitCLEVBQUUsRUFBRTtNQUNKLElBQUlBLEVBQUUsQ0FBQy96QyxJQUFJLENBQUMsRUFBRTtRQUNWLE9BQU8rekMsRUFBRSxDQUFDL3pDLElBQUksQ0FBQztNQUNuQjtNQUVBLE1BQU0sSUFBSXlCLEtBQUssY0FBQThJLE1BQUEsQ0FBY3ZLLElBQUksb0JBQUF1SyxNQUFBLENBQWlCNkssU0FBUyxDQUFFLENBQUM7SUFDbEU7SUFFQSxNQUFNLElBQUkzVCxLQUFLLElBQUE4SSxNQUFBLENBQUk2SyxTQUFTLG9CQUFpQixDQUFDO0VBQ2xEO0FBQ0osQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hCMEI7QUFDeUM7QUFDcEM7QUFDaUI7QUFDTDtBQUtVO0FBQ1E7QUFDRTtBQUNsQjtBQUNFO0FBQ29CO0FBQ0o7QUFDTjtBQUFBLElBY3JDa3RDLGFBQWE7RUFDOUIsU0FBQUEsY0FBQSxFQUFjO0lBQUEsSUFBQWoxQyxLQUFBO0lBQUFDLGVBQUEsT0FBQWcxQyxhQUFBO0lBQUE5eUMsZUFBQTtJQUFBQSxlQUFBLHdCQVNtQixJQUFJRCxzREFBYSxDQUFjLENBQUM7SUFBQUMsZUFBQSx1QkFFMUMySCxrREFBSSxDQUFDLFlBQU07TUFDOUIsSUFBTTg2QixPQUFPLEdBQUc1a0MsS0FBSSxDQUFDazFDLGFBQWEsQ0FBQ3RRLE9BQU87TUFFMUNBLE9BQU8sQ0FBQ2lRLGdFQUFhLENBQUM7TUFDdEJqUSxPQUFPLENBQUM1USw0REFBUyxDQUFDO01BQ2xCNFEsT0FBTyxDQUFDbnBDLDZEQUFVLENBQUM7TUFDbkJtcEMsT0FBTyxDQUFDUyxxRUFBa0IsQ0FBQztNQUMzQlQsT0FBTyxDQUFDb1EsdUVBQW9CLENBQUM7TUFDN0JwUSxPQUFPLENBQUNtUSxxRUFBa0IsQ0FBQztNQUMzQm5RLE9BQU8sQ0FBQ2tRLG9FQUFpQixDQUFDO01BQzFCbFEsT0FBTyxDQUFDVSxrRUFBZSxDQUFDO0lBQzVCLENBQUMsQ0FBQztJQUFBbmpDLGVBQUEseUJBRXVCLFVBQUNteUMsT0FBWSxFQUFFYSxVQUFlLEVBQUs7TUFDeERuMUMsS0FBSSxDQUFDbzFDLE9BQU8sR0FBR1YsbURBQVcsQ0FBQ0osT0FBTyxFQUFFYSxVQUFVLENBQUM7TUFDL0NuMUMsS0FBSSxDQUFDazFDLGFBQWEsQ0FBQ0csUUFBUSxDQUFDcjFDLEtBQUksQ0FBQ28xQyxPQUFPLENBQUM7TUFDekNwMUMsS0FBSSxDQUFDczFDLFlBQVksQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBUEluekMsZUFBQSwwQkFRa0IsVUFBQ3hNLEtBQWUsRUFBeUI7TUFDdkQsSUFBSXFLLEtBQUksQ0FBQ28xQyxPQUFPLElBQUksQ0FBQ3ovQyxLQUFLLEVBQUU7UUFDeEIsT0FBT3FLLEtBQUksQ0FBQ28xQyxPQUFPO01BQ3ZCO01BRUEsSUFBTWQsT0FBTyxHQUFHRyxnRUFBYSxDQUFDLENBQUM7O01BRS9CO01BQ0EsSUFBSWMsS0FBcUMsRUFBRSxFQUUxQyxNQUFNO1FBQ0g7UUFDQSxJQUFNSSxTQUFTLEdBQUkzNEMsTUFBTSxDQUNwQjQ0QyxvQ0FBb0M7UUFDekMsSUFBSUQsU0FBUyxFQUFFO1VBQ1gzMUMsS0FBSSxDQUFDMDFDLGNBQWMsQ0FDZnBCLE9BQU8sRUFDUHFCLFNBQVMsQ0FBQztZQUFDRSxlQUFlLEVBQUUsQ0FBQyxlQUFlO1VBQUMsQ0FBQyxDQUFDLENBQzNDbEIsdURBQWUsQ0FBQ0Msb0RBQUssQ0FDekIsQ0FDSixDQUFDO1FBQ0wsQ0FBQyxNQUFNO1VBQ0g1MEMsS0FBSSxDQUFDMDFDLGNBQWMsQ0FBQ3BCLE9BQU8sRUFBRUssdURBQWUsQ0FBQ0Msb0RBQUssQ0FBQyxDQUFDO1FBQ3hEO01BQ0o7TUFFQSxJQUFJLENBQUNqL0MsS0FBSyxFQUFFO1FBQ1I7UUFDQ3FILE1BQU0sQ0FBU3FFLEtBQUssR0FBR3JCLEtBQUksQ0FBQ28xQyxPQUFPO01BQ3hDO01BRUEsSUFBS1UsS0FBa0IsRUFBRSxFQVF4QjtNQUVELE9BQU85MUMsS0FBSSxDQUFDbzFDLE9BQU87SUFDdkIsQ0FBQztJQS9FRyxJQUFJLENBQUNBLE9BQU8sR0FBRyxJQUFJLENBQUNnQixlQUFlLENBQUMsQ0FBQztFQUN6QztFQUFDNzFDLFlBQUEsQ0FBQTAwQyxhQUFBO0lBQUF0OUMsR0FBQTtJQUFBdVUsR0FBQSxFQUdELFNBQUFBLElBQUEsRUFBdUM7TUFDbkMsT0FBTyxJQUFJLENBQUNrcEMsT0FBTztJQUN2QjtFQUFDO0VBQUEsT0FBQUgsYUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3RDaUM7QUFFSDtBQUNpQjtBQUVwRCxTQUFTb0Isa0JBQWtCQSxDQUFDNzZDLE1BQVcsRUFBRTtFQUNyQzBKLGlCQUFpQixDQUFDMUosTUFBTSxDQUFDO0VBQ3pCLE9BQVFrSSxpREFBUSxDQUFDMVAsT0FBTyxDQUFDd0gsTUFBTSxDQUFDLENBQVM4NkMsK0JBQStCO0FBQzVFO0FBRUEsSUFBTUMsa0JBQWtCLEdBQUcsS0FBSztBQUV6QixTQUFTejdDLGVBQWVBLENBQzNCMDdDLGVBQW9CLEVBQ3BCcGdDLGFBQWtCLEVBQ2xCM2EsVUFBZSxFQUNqQjtFQUFBLElBQUFnN0MscUJBQUE7RUFDRSxJQUFJLENBQUNoN0MsVUFBVSxFQUFFO0lBQ2IsT0FBTzg2QyxrQkFBa0I7RUFDN0I7RUFFQSxJQUFNRyxlQUFvQixHQUFHejBDLGlEQUFJLENBQUNtVSxhQUFhLEVBQUUzYSxVQUFVLENBQUM7RUFDNUQ7RUFDQTtFQUNBLElBQUksQ0FBQ2k3QyxlQUFlLEVBQUU7SUFDbEIsT0FBT0gsa0JBQWtCO0VBQzdCO0VBRUEsSUFBTWpQLE1BQVcsR0FBR29QLGVBQWUsQ0FBQ2pQLHVCQUF1QjtFQUMzRCxJQUFJSCxNQUFNLEVBQUU7SUFDUixPQUFPO01BQ0hsaUMsVUFBVSxFQUFFLElBQUk7TUFDaEJ1eEMsU0FBUyxFQUFFclAsTUFBTSxDQUFDbjJCLFFBQVE7TUFDMUJ5bEMsY0FBYyxFQUFFM3hDLGtFQUFXLENBQUNxaUMsTUFBTSxDQUFDNWhDLEVBQUU7SUFDekMsQ0FBQztFQUNMO0VBRUEsSUFBTW14QyxPQUFZLElBQUFKLHFCQUFBLEdBQUdDLGVBQWUsQ0FBQ25QLHdCQUF3QixjQUFBa1AscUJBQUEsdUJBQXhDQSxxQkFBQSxDQUEyQyxDQUFDLENBQUM7RUFDbEUsSUFBSUksT0FBTyxJQUFJUixrQkFBa0IsQ0FBQ0csZUFBZSxDQUFDLEVBQUU7SUFDaEQsT0FBTztNQUNIcHhDLFVBQVUsRUFBRSxJQUFJO01BQ2hCdXhDLFNBQVMsRUFBRUUsT0FBTyxDQUFDMWxDLFFBQVE7TUFDM0J5bEMsY0FBYyxFQUFFM3hDLGtFQUFXLENBQUM0eEMsT0FBTyxDQUFDbnhDLEVBQUU7SUFDMUMsQ0FBQztFQUNMO0VBRUEsT0FBTzZ3QyxrQkFBa0I7QUFDN0I7QUFFTyxJQUFNeDdDLGNBQWMsR0FBRyxTQUFqQkEsY0FBY0EsQ0FBSXFiLGFBQWtCLEVBQUUzYSxVQUFlO0VBQUEsSUFBQTJGLElBQUEsRUFBQTAxQyxLQUFBO0VBQUEsT0FDOUQsRUFBQTExQyxJQUFBLEdBQ00zRixVQUFVLE1BQUFxN0MsS0FBQSxHQUNQNzBDLGlEQUFJLENBQUNtVSxhQUFhLEVBQUUzYSxVQUFVLENBQUMsY0FBQXE3QyxLQUFBLHVCQUFoQ0EsS0FBQSxDQUNNdlAsd0JBQXdCLGVBQUFubUMsSUFBQSxjQUFBQSxJQUFBLEdBQzlCLEVBQUUsRUFFTFksR0FBRyxDQUFDLFVBQUErVCxLQUFBO0lBQUEsSUFBRXJRLEVBQUUsR0FBQXFRLEtBQUEsQ0FBRnJRLEVBQUU7TUFBRXlMLFFBQVEsR0FBQTRFLEtBQUEsQ0FBUjVFLFFBQVE7SUFBQSxVQUFBalUsTUFBQSxDQUFTd0ksRUFBRSxPQUFBeEksTUFBQSxDQUFJaVUsUUFBUTtFQUFBLENBQUUsQ0FBQyxDQUM1Q0UsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUFBO0FBRVgsU0FBU25NLGlCQUFpQkEsQ0FBQzZ4QyxtQkFBd0IsRUFBRTtFQUN4RCxJQUFJcGtELGlEQUFJLENBQUNva0QsbUJBQW1CLENBQUMsS0FBSyxPQUFPLEVBQUU7SUFDdkMsTUFBTSxJQUFJM2lELEtBQUssQ0FDWCxtRUFBbUUsR0FDL0Qsa0JBQWtCLEdBQ2xCLHVEQUF1RCxHQUN2RCw2Q0FBNkMsR0FDN0M0SixJQUFJLENBQUNDLFNBQVMsQ0FBQzg0QyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUNuRCxDQUFDO0VBQ0w7RUFDQSxJQUNJcGtELGlEQUFJLENBQUNva0QsbUJBQW1CLENBQUMsS0FBSyxRQUFRLElBQ3RDLEVBQ0k3eUMsaURBQUcsQ0FBQyxXQUFXLEVBQUU2eUMsbUJBQW1CLENBQUMsSUFDckM3eUMsaURBQUcsQ0FBQyxNQUFNLEVBQUU2eUMsbUJBQW1CLENBQUMsSUFDaEM3eUMsaURBQUcsQ0FBQyxPQUFPLEVBQUU2eUMsbUJBQW1CLENBQUMsQ0FDcEMsRUFDSDtJQUNFLE1BQU0sSUFBSTNpRCxLQUFLLENBQ1gsK0RBQStELEdBQzNELHdDQUF3QyxHQUN4QywwREFBMEQsR0FDMUQ0SixJQUFJLENBQUNDLFNBQVMsQ0FBQzg0QyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUNuRCxDQUFDO0VBQ0w7QUFDSjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwRm1DO0FBSzVCLElBQU05UCxtQkFBbUIsR0FBRyxTQUF0QkEsbUJBQW1CQSxDQUFJaG9DLEtBQXNCO0VBQUEsSUFBQSszQyxNQUFBO0VBQUEsT0FDdEQsQ0FBQUEsTUFBQSxHQUFBaitDLEtBQUssQ0FBWSxDQUFDLEVBQUNtRSxNQUFNLENBQUEvRSxLQUFBLENBQUE2K0MsTUFBQSxFQUFBbnhDLGtCQUFBLENBQUlwUyxpREFBTSxDQUFDMGpDLGlEQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEVBQUVsNEIsS0FBSyxDQUFDLENBQUMsRUFBQztBQUFBOzs7Ozs7Ozs7Ozs7K0NDTDlFLHFKQUFBbk8sbUJBQUEsWUFBQUEsb0JBQUEsV0FBQUMsQ0FBQSxTQUFBQyxDQUFBLEVBQUFELENBQUEsT0FBQUUsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLFNBQUEsRUFBQUMsQ0FBQSxHQUFBSCxDQUFBLENBQUFJLGNBQUEsRUFBQUMsQ0FBQSxHQUFBSixNQUFBLENBQUFLLGNBQUEsY0FBQVAsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsSUFBQUQsQ0FBQSxDQUFBRCxDQUFBLElBQUFFLENBQUEsQ0FBQU8sS0FBQSxLQUFBQyxDQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsQ0FBQSxHQUFBRixDQUFBLENBQUFHLFFBQUEsa0JBQUFDLENBQUEsR0FBQUosQ0FBQSxDQUFBSyxhQUFBLHVCQUFBQyxDQUFBLEdBQUFOLENBQUEsQ0FBQU8sV0FBQSw4QkFBQUMsT0FBQWpCLENBQUEsRUFBQUQsQ0FBQSxFQUFBRSxDQUFBLFdBQUFDLE1BQUEsQ0FBQUssY0FBQSxDQUFBUCxDQUFBLEVBQUFELENBQUEsSUFBQVMsS0FBQSxFQUFBUCxDQUFBLEVBQUFpQixVQUFBLE1BQUFDLFlBQUEsTUFBQUMsUUFBQSxTQUFBcEIsQ0FBQSxDQUFBRCxDQUFBLFdBQUFrQixNQUFBLG1CQUFBakIsQ0FBQSxJQUFBaUIsTUFBQSxZQUFBQSxPQUFBakIsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsV0FBQUQsQ0FBQSxDQUFBRCxDQUFBLElBQUFFLENBQUEsZ0JBQUFvQixLQUFBckIsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsRUFBQUcsQ0FBQSxRQUFBSyxDQUFBLEdBQUFWLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxTQUFBLFlBQUFtQixTQUFBLEdBQUF2QixDQUFBLEdBQUF1QixTQUFBLEVBQUFYLENBQUEsR0FBQVQsTUFBQSxDQUFBcUIsTUFBQSxDQUFBZCxDQUFBLENBQUFOLFNBQUEsR0FBQVUsQ0FBQSxPQUFBVyxPQUFBLENBQUFwQixDQUFBLGdCQUFBRSxDQUFBLENBQUFLLENBQUEsZUFBQUgsS0FBQSxFQUFBaUIsZ0JBQUEsQ0FBQXpCLENBQUEsRUFBQUMsQ0FBQSxFQUFBWSxDQUFBLE1BQUFGLENBQUEsYUFBQWUsU0FBQTFCLENBQUEsRUFBQUQsQ0FBQSxFQUFBRSxDQUFBLG1CQUFBMEIsSUFBQSxZQUFBQyxHQUFBLEVBQUE1QixDQUFBLENBQUE2QixJQUFBLENBQUE5QixDQUFBLEVBQUFFLENBQUEsY0FBQUQsQ0FBQSxhQUFBMkIsSUFBQSxXQUFBQyxHQUFBLEVBQUE1QixDQUFBLFFBQUFELENBQUEsQ0FBQXNCLElBQUEsR0FBQUEsSUFBQSxNQUFBUyxDQUFBLHFCQUFBQyxDQUFBLHFCQUFBQyxDQUFBLGdCQUFBQyxDQUFBLGdCQUFBQyxDQUFBLGdCQUFBWixVQUFBLGNBQUFhLGtCQUFBLGNBQUFDLDJCQUFBLFNBQUFDLENBQUEsT0FBQXBCLE1BQUEsQ0FBQW9CLENBQUEsRUFBQTFCLENBQUEscUNBQUEyQixDQUFBLEdBQUFwQyxNQUFBLENBQUFxQyxjQUFBLEVBQUFDLENBQUEsR0FBQUYsQ0FBQSxJQUFBQSxDQUFBLENBQUFBLENBQUEsQ0FBQUcsTUFBQSxRQUFBRCxDQUFBLElBQUFBLENBQUEsS0FBQXZDLENBQUEsSUFBQUcsQ0FBQSxDQUFBeUIsSUFBQSxDQUFBVyxDQUFBLEVBQUE3QixDQUFBLE1BQUEwQixDQUFBLEdBQUFHLENBQUEsT0FBQUUsQ0FBQSxHQUFBTiwwQkFBQSxDQUFBakMsU0FBQSxHQUFBbUIsU0FBQSxDQUFBbkIsU0FBQSxHQUFBRCxNQUFBLENBQUFxQixNQUFBLENBQUFjLENBQUEsWUFBQU0sc0JBQUEzQyxDQUFBLGdDQUFBNEMsT0FBQSxXQUFBN0MsQ0FBQSxJQUFBa0IsTUFBQSxDQUFBakIsQ0FBQSxFQUFBRCxDQUFBLFlBQUFDLENBQUEsZ0JBQUE2QyxPQUFBLENBQUE5QyxDQUFBLEVBQUFDLENBQUEsc0JBQUE4QyxjQUFBOUMsQ0FBQSxFQUFBRCxDQUFBLGFBQUFnRCxPQUFBOUMsQ0FBQSxFQUFBSyxDQUFBLEVBQUFHLENBQUEsRUFBQUUsQ0FBQSxRQUFBRSxDQUFBLEdBQUFhLFFBQUEsQ0FBQTFCLENBQUEsQ0FBQUMsQ0FBQSxHQUFBRCxDQUFBLEVBQUFNLENBQUEsbUJBQUFPLENBQUEsQ0FBQWMsSUFBQSxRQUFBWixDQUFBLEdBQUFGLENBQUEsQ0FBQWUsR0FBQSxFQUFBRSxDQUFBLEdBQUFmLENBQUEsQ0FBQVAsS0FBQSxTQUFBc0IsQ0FBQSx1QkFBQUEsQ0FBQSxJQUFBMUIsQ0FBQSxDQUFBeUIsSUFBQSxDQUFBQyxDQUFBLGVBQUEvQixDQUFBLENBQUFpRCxPQUFBLENBQUFsQixDQUFBLENBQUFtQixPQUFBLEVBQUFDLElBQUEsV0FBQWxELENBQUEsSUFBQStDLE1BQUEsU0FBQS9DLENBQUEsRUFBQVMsQ0FBQSxFQUFBRSxDQUFBLGdCQUFBWCxDQUFBLElBQUErQyxNQUFBLFVBQUEvQyxDQUFBLEVBQUFTLENBQUEsRUFBQUUsQ0FBQSxRQUFBWixDQUFBLENBQUFpRCxPQUFBLENBQUFsQixDQUFBLEVBQUFvQixJQUFBLFdBQUFsRCxDQUFBLElBQUFlLENBQUEsQ0FBQVAsS0FBQSxHQUFBUixDQUFBLEVBQUFTLENBQUEsQ0FBQU0sQ0FBQSxnQkFBQWYsQ0FBQSxXQUFBK0MsTUFBQSxVQUFBL0MsQ0FBQSxFQUFBUyxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxDQUFBRSxDQUFBLENBQUFlLEdBQUEsU0FBQTNCLENBQUEsRUFBQUssQ0FBQSxvQkFBQUUsS0FBQSxXQUFBQSxNQUFBUixDQUFBLEVBQUFJLENBQUEsYUFBQStDLDJCQUFBLGVBQUFwRCxDQUFBLFdBQUFBLENBQUEsRUFBQUUsQ0FBQSxJQUFBOEMsTUFBQSxDQUFBL0MsQ0FBQSxFQUFBSSxDQUFBLEVBQUFMLENBQUEsRUFBQUUsQ0FBQSxnQkFBQUEsQ0FBQSxHQUFBQSxDQUFBLEdBQUFBLENBQUEsQ0FBQWlELElBQUEsQ0FBQUMsMEJBQUEsRUFBQUEsMEJBQUEsSUFBQUEsMEJBQUEscUJBQUExQixpQkFBQTFCLENBQUEsRUFBQUUsQ0FBQSxFQUFBRyxDQUFBLFFBQUFFLENBQUEsR0FBQXdCLENBQUEsbUJBQUFyQixDQUFBLEVBQUFFLENBQUEsUUFBQUwsQ0FBQSxLQUFBMEIsQ0FBQSxZQUFBb0IsS0FBQSxzQ0FBQTlDLENBQUEsS0FBQTJCLENBQUEsb0JBQUF4QixDQUFBLFFBQUFFLENBQUEsV0FBQUgsS0FBQSxFQUFBUixDQUFBLEVBQUFxRCxJQUFBLGVBQUFqRCxDQUFBLENBQUFrRCxNQUFBLEdBQUE3QyxDQUFBLEVBQUFMLENBQUEsQ0FBQXdCLEdBQUEsR0FBQWpCLENBQUEsVUFBQUUsQ0FBQSxHQUFBVCxDQUFBLENBQUFtRCxRQUFBLE1BQUExQyxDQUFBLFFBQUFFLENBQUEsR0FBQXlDLG1CQUFBLENBQUEzQyxDQUFBLEVBQUFULENBQUEsT0FBQVcsQ0FBQSxRQUFBQSxDQUFBLEtBQUFtQixDQUFBLG1CQUFBbkIsQ0FBQSxxQkFBQVgsQ0FBQSxDQUFBa0QsTUFBQSxFQUFBbEQsQ0FBQSxDQUFBcUQsSUFBQSxHQUFBckQsQ0FBQSxDQUFBc0QsS0FBQSxHQUFBdEQsQ0FBQSxDQUFBd0IsR0FBQSxzQkFBQXhCLENBQUEsQ0FBQWtELE1BQUEsUUFBQWhELENBQUEsS0FBQXdCLENBQUEsUUFBQXhCLENBQUEsR0FBQTJCLENBQUEsRUFBQTdCLENBQUEsQ0FBQXdCLEdBQUEsRUFBQXhCLENBQUEsQ0FBQXVELGlCQUFBLENBQUF2RCxDQUFBLENBQUF3QixHQUFBLHVCQUFBeEIsQ0FBQSxDQUFBa0QsTUFBQSxJQUFBbEQsQ0FBQSxDQUFBd0QsTUFBQSxXQUFBeEQsQ0FBQSxDQUFBd0IsR0FBQSxHQUFBdEIsQ0FBQSxHQUFBMEIsQ0FBQSxNQUFBSyxDQUFBLEdBQUFYLFFBQUEsQ0FBQTNCLENBQUEsRUFBQUUsQ0FBQSxFQUFBRyxDQUFBLG9CQUFBaUMsQ0FBQSxDQUFBVixJQUFBLFFBQUFyQixDQUFBLEdBQUFGLENBQUEsQ0FBQWlELElBQUEsR0FBQXBCLENBQUEsR0FBQUYsQ0FBQSxFQUFBTSxDQUFBLENBQUFULEdBQUEsS0FBQU0sQ0FBQSxxQkFBQTFCLEtBQUEsRUFBQTZCLENBQUEsQ0FBQVQsR0FBQSxFQUFBeUIsSUFBQSxFQUFBakQsQ0FBQSxDQUFBaUQsSUFBQSxrQkFBQWhCLENBQUEsQ0FBQVYsSUFBQSxLQUFBckIsQ0FBQSxHQUFBMkIsQ0FBQSxFQUFBN0IsQ0FBQSxDQUFBa0QsTUFBQSxZQUFBbEQsQ0FBQSxDQUFBd0IsR0FBQSxHQUFBUyxDQUFBLENBQUFULEdBQUEsbUJBQUE0QixvQkFBQXpELENBQUEsRUFBQUUsQ0FBQSxRQUFBRyxDQUFBLEdBQUFILENBQUEsQ0FBQXFELE1BQUEsRUFBQWhELENBQUEsR0FBQVAsQ0FBQSxDQUFBYSxRQUFBLENBQUFSLENBQUEsT0FBQUUsQ0FBQSxLQUFBTixDQUFBLFNBQUFDLENBQUEsQ0FBQXNELFFBQUEscUJBQUFuRCxDQUFBLElBQUFMLENBQUEsQ0FBQWEsUUFBQSxDQUFBaUQsTUFBQSxLQUFBNUQsQ0FBQSxDQUFBcUQsTUFBQSxhQUFBckQsQ0FBQSxDQUFBMkIsR0FBQSxHQUFBNUIsQ0FBQSxFQUFBd0QsbUJBQUEsQ0FBQXpELENBQUEsRUFBQUUsQ0FBQSxlQUFBQSxDQUFBLENBQUFxRCxNQUFBLGtCQUFBbEQsQ0FBQSxLQUFBSCxDQUFBLENBQUFxRCxNQUFBLFlBQUFyRCxDQUFBLENBQUEyQixHQUFBLE9BQUFrQyxTQUFBLHVDQUFBMUQsQ0FBQSxpQkFBQThCLENBQUEsTUFBQXpCLENBQUEsR0FBQWlCLFFBQUEsQ0FBQXBCLENBQUEsRUFBQVAsQ0FBQSxDQUFBYSxRQUFBLEVBQUFYLENBQUEsQ0FBQTJCLEdBQUEsbUJBQUFuQixDQUFBLENBQUFrQixJQUFBLFNBQUExQixDQUFBLENBQUFxRCxNQUFBLFlBQUFyRCxDQUFBLENBQUEyQixHQUFBLEdBQUFuQixDQUFBLENBQUFtQixHQUFBLEVBQUEzQixDQUFBLENBQUFzRCxRQUFBLFNBQUFyQixDQUFBLE1BQUF2QixDQUFBLEdBQUFGLENBQUEsQ0FBQW1CLEdBQUEsU0FBQWpCLENBQUEsR0FBQUEsQ0FBQSxDQUFBMEMsSUFBQSxJQUFBcEQsQ0FBQSxDQUFBRixDQUFBLENBQUFnRSxVQUFBLElBQUFwRCxDQUFBLENBQUFILEtBQUEsRUFBQVAsQ0FBQSxDQUFBK0QsSUFBQSxHQUFBakUsQ0FBQSxDQUFBa0UsT0FBQSxlQUFBaEUsQ0FBQSxDQUFBcUQsTUFBQSxLQUFBckQsQ0FBQSxDQUFBcUQsTUFBQSxXQUFBckQsQ0FBQSxDQUFBMkIsR0FBQSxHQUFBNUIsQ0FBQSxHQUFBQyxDQUFBLENBQUFzRCxRQUFBLFNBQUFyQixDQUFBLElBQUF2QixDQUFBLElBQUFWLENBQUEsQ0FBQXFELE1BQUEsWUFBQXJELENBQUEsQ0FBQTJCLEdBQUEsT0FBQWtDLFNBQUEsc0NBQUE3RCxDQUFBLENBQUFzRCxRQUFBLFNBQUFyQixDQUFBLGNBQUFnQyxhQUFBbEUsQ0FBQSxRQUFBRCxDQUFBLEtBQUFvRSxNQUFBLEVBQUFuRSxDQUFBLFlBQUFBLENBQUEsS0FBQUQsQ0FBQSxDQUFBcUUsUUFBQSxHQUFBcEUsQ0FBQSxXQUFBQSxDQUFBLEtBQUFELENBQUEsQ0FBQXNFLFVBQUEsR0FBQXJFLENBQUEsS0FBQUQsQ0FBQSxDQUFBdUUsUUFBQSxHQUFBdEUsQ0FBQSxXQUFBdUUsVUFBQSxDQUFBQyxJQUFBLENBQUF6RSxDQUFBLGNBQUEwRSxjQUFBekUsQ0FBQSxRQUFBRCxDQUFBLEdBQUFDLENBQUEsQ0FBQTBFLFVBQUEsUUFBQTNFLENBQUEsQ0FBQTRCLElBQUEsb0JBQUE1QixDQUFBLENBQUE2QixHQUFBLEVBQUE1QixDQUFBLENBQUEwRSxVQUFBLEdBQUEzRSxDQUFBLGFBQUF5QixRQUFBeEIsQ0FBQSxTQUFBdUUsVUFBQSxNQUFBSixNQUFBLGFBQUFuRSxDQUFBLENBQUE0QyxPQUFBLENBQUFzQixZQUFBLGNBQUFTLEtBQUEsaUJBQUFsQyxPQUFBMUMsQ0FBQSxRQUFBQSxDQUFBLFdBQUFBLENBQUEsUUFBQUUsQ0FBQSxHQUFBRixDQUFBLENBQUFZLENBQUEsT0FBQVYsQ0FBQSxTQUFBQSxDQUFBLENBQUE0QixJQUFBLENBQUE5QixDQUFBLDRCQUFBQSxDQUFBLENBQUFpRSxJQUFBLFNBQUFqRSxDQUFBLE9BQUE2RSxLQUFBLENBQUE3RSxDQUFBLENBQUE4RSxNQUFBLFNBQUF2RSxDQUFBLE9BQUFHLENBQUEsWUFBQXVELEtBQUEsYUFBQTFELENBQUEsR0FBQVAsQ0FBQSxDQUFBOEUsTUFBQSxPQUFBekUsQ0FBQSxDQUFBeUIsSUFBQSxDQUFBOUIsQ0FBQSxFQUFBTyxDQUFBLFVBQUEwRCxJQUFBLENBQUF4RCxLQUFBLEdBQUFULENBQUEsQ0FBQU8sQ0FBQSxHQUFBMEQsSUFBQSxDQUFBWCxJQUFBLE9BQUFXLElBQUEsU0FBQUEsSUFBQSxDQUFBeEQsS0FBQSxHQUFBUixDQUFBLEVBQUFnRSxJQUFBLENBQUFYLElBQUEsT0FBQVcsSUFBQSxZQUFBdkQsQ0FBQSxDQUFBdUQsSUFBQSxHQUFBdkQsQ0FBQSxnQkFBQXFELFNBQUEsUUFBQS9ELENBQUEsaUNBQUFvQyxpQkFBQSxDQUFBaEMsU0FBQSxHQUFBaUMsMEJBQUEsRUFBQTlCLENBQUEsQ0FBQW9DLENBQUEsbUJBQUFsQyxLQUFBLEVBQUE0QiwwQkFBQSxFQUFBakIsWUFBQSxTQUFBYixDQUFBLENBQUE4QiwwQkFBQSxtQkFBQTVCLEtBQUEsRUFBQTJCLGlCQUFBLEVBQUFoQixZQUFBLFNBQUFnQixpQkFBQSxDQUFBMkMsV0FBQSxHQUFBN0QsTUFBQSxDQUFBbUIsMEJBQUEsRUFBQXJCLENBQUEsd0JBQUFoQixDQUFBLENBQUFnRixtQkFBQSxhQUFBL0UsQ0FBQSxRQUFBRCxDQUFBLHdCQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQWdGLFdBQUEsV0FBQWpGLENBQUEsS0FBQUEsQ0FBQSxLQUFBb0MsaUJBQUEsNkJBQUFwQyxDQUFBLENBQUErRSxXQUFBLElBQUEvRSxDQUFBLENBQUFrRixJQUFBLE9BQUFsRixDQUFBLENBQUFtRixJQUFBLGFBQUFsRixDQUFBLFdBQUFFLE1BQUEsQ0FBQWlGLGNBQUEsR0FBQWpGLE1BQUEsQ0FBQWlGLGNBQUEsQ0FBQW5GLENBQUEsRUFBQW9DLDBCQUFBLEtBQUFwQyxDQUFBLENBQUFvRixTQUFBLEdBQUFoRCwwQkFBQSxFQUFBbkIsTUFBQSxDQUFBakIsQ0FBQSxFQUFBZSxDQUFBLHlCQUFBZixDQUFBLENBQUFHLFNBQUEsR0FBQUQsTUFBQSxDQUFBcUIsTUFBQSxDQUFBbUIsQ0FBQSxHQUFBMUMsQ0FBQSxLQUFBRCxDQUFBLENBQUFzRixLQUFBLGFBQUFyRixDQUFBLGFBQUFpRCxPQUFBLEVBQUFqRCxDQUFBLE9BQUEyQyxxQkFBQSxDQUFBRyxhQUFBLENBQUEzQyxTQUFBLEdBQUFjLE1BQUEsQ0FBQTZCLGFBQUEsQ0FBQTNDLFNBQUEsRUFBQVUsQ0FBQSxpQ0FBQWQsQ0FBQSxDQUFBK0MsYUFBQSxHQUFBQSxhQUFBLEVBQUEvQyxDQUFBLENBQUF1RixLQUFBLGFBQUF0RixDQUFBLEVBQUFDLENBQUEsRUFBQUcsQ0FBQSxFQUFBRSxDQUFBLEVBQUFHLENBQUEsZUFBQUEsQ0FBQSxLQUFBQSxDQUFBLEdBQUE4RSxPQUFBLE9BQUE1RSxDQUFBLE9BQUFtQyxhQUFBLENBQUF6QixJQUFBLENBQUFyQixDQUFBLEVBQUFDLENBQUEsRUFBQUcsQ0FBQSxFQUFBRSxDQUFBLEdBQUFHLENBQUEsVUFBQVYsQ0FBQSxDQUFBZ0YsbUJBQUEsQ0FBQTlFLENBQUEsSUFBQVUsQ0FBQSxHQUFBQSxDQUFBLENBQUFxRCxJQUFBLEdBQUFkLElBQUEsV0FBQWxELENBQUEsV0FBQUEsQ0FBQSxDQUFBcUQsSUFBQSxHQUFBckQsQ0FBQSxDQUFBUSxLQUFBLEdBQUFHLENBQUEsQ0FBQXFELElBQUEsV0FBQXJCLHFCQUFBLENBQUFELENBQUEsR0FBQXpCLE1BQUEsQ0FBQXlCLENBQUEsRUFBQTNCLENBQUEsZ0JBQUFFLE1BQUEsQ0FBQXlCLENBQUEsRUFBQS9CLENBQUEsaUNBQUFNLE1BQUEsQ0FBQXlCLENBQUEsNkRBQUEzQyxDQUFBLENBQUF5RixJQUFBLGFBQUF4RixDQUFBLFFBQUFELENBQUEsR0FBQUcsTUFBQSxDQUFBRixDQUFBLEdBQUFDLENBQUEsZ0JBQUFHLENBQUEsSUFBQUwsQ0FBQSxFQUFBRSxDQUFBLENBQUF1RSxJQUFBLENBQUFwRSxDQUFBLFVBQUFILENBQUEsQ0FBQXdGLE9BQUEsYUFBQXpCLEtBQUEsV0FBQS9ELENBQUEsQ0FBQTRFLE1BQUEsU0FBQTdFLENBQUEsR0FBQUMsQ0FBQSxDQUFBeUYsR0FBQSxRQUFBMUYsQ0FBQSxJQUFBRCxDQUFBLFNBQUFpRSxJQUFBLENBQUF4RCxLQUFBLEdBQUFSLENBQUEsRUFBQWdFLElBQUEsQ0FBQVgsSUFBQSxPQUFBVyxJQUFBLFdBQUFBLElBQUEsQ0FBQVgsSUFBQSxPQUFBVyxJQUFBLFFBQUFqRSxDQUFBLENBQUEwQyxNQUFBLEdBQUFBLE1BQUEsRUFBQWpCLE9BQUEsQ0FBQXJCLFNBQUEsS0FBQTZFLFdBQUEsRUFBQXhELE9BQUEsRUFBQW1ELEtBQUEsV0FBQUEsTUFBQTVFLENBQUEsYUFBQTRGLElBQUEsV0FBQTNCLElBQUEsV0FBQVAsSUFBQSxRQUFBQyxLQUFBLEdBQUExRCxDQUFBLE9BQUFxRCxJQUFBLFlBQUFFLFFBQUEsY0FBQUQsTUFBQSxnQkFBQTFCLEdBQUEsR0FBQTVCLENBQUEsT0FBQXVFLFVBQUEsQ0FBQTNCLE9BQUEsQ0FBQTZCLGFBQUEsSUFBQTFFLENBQUEsV0FBQUUsQ0FBQSxrQkFBQUEsQ0FBQSxDQUFBMkYsTUFBQSxPQUFBeEYsQ0FBQSxDQUFBeUIsSUFBQSxPQUFBNUIsQ0FBQSxNQUFBMkUsS0FBQSxFQUFBM0UsQ0FBQSxDQUFBNEYsS0FBQSxjQUFBNUYsQ0FBQSxJQUFBRCxDQUFBLE1BQUE4RixJQUFBLFdBQUFBLEtBQUEsU0FBQXpDLElBQUEsV0FBQXJELENBQUEsUUFBQXVFLFVBQUEsSUFBQUcsVUFBQSxrQkFBQTFFLENBQUEsQ0FBQTJCLElBQUEsUUFBQTNCLENBQUEsQ0FBQTRCLEdBQUEsY0FBQW1FLElBQUEsS0FBQXBDLGlCQUFBLFdBQUFBLGtCQUFBNUQsQ0FBQSxhQUFBc0QsSUFBQSxRQUFBdEQsQ0FBQSxNQUFBRSxDQUFBLGtCQUFBK0YsT0FBQTVGLENBQUEsRUFBQUUsQ0FBQSxXQUFBSyxDQUFBLENBQUFnQixJQUFBLFlBQUFoQixDQUFBLENBQUFpQixHQUFBLEdBQUE3QixDQUFBLEVBQUFFLENBQUEsQ0FBQStELElBQUEsR0FBQTVELENBQUEsRUFBQUUsQ0FBQSxLQUFBTCxDQUFBLENBQUFxRCxNQUFBLFdBQUFyRCxDQUFBLENBQUEyQixHQUFBLEdBQUE1QixDQUFBLEtBQUFNLENBQUEsYUFBQUEsQ0FBQSxRQUFBaUUsVUFBQSxDQUFBTSxNQUFBLE1BQUF2RSxDQUFBLFNBQUFBLENBQUEsUUFBQUcsQ0FBQSxRQUFBOEQsVUFBQSxDQUFBakUsQ0FBQSxHQUFBSyxDQUFBLEdBQUFGLENBQUEsQ0FBQWlFLFVBQUEsaUJBQUFqRSxDQUFBLENBQUEwRCxNQUFBLFNBQUE2QixNQUFBLGFBQUF2RixDQUFBLENBQUEwRCxNQUFBLFNBQUF3QixJQUFBLFFBQUE5RSxDQUFBLEdBQUFULENBQUEsQ0FBQXlCLElBQUEsQ0FBQXBCLENBQUEsZUFBQU0sQ0FBQSxHQUFBWCxDQUFBLENBQUF5QixJQUFBLENBQUFwQixDQUFBLHFCQUFBSSxDQUFBLElBQUFFLENBQUEsYUFBQTRFLElBQUEsR0FBQWxGLENBQUEsQ0FBQTJELFFBQUEsU0FBQTRCLE1BQUEsQ0FBQXZGLENBQUEsQ0FBQTJELFFBQUEsZ0JBQUF1QixJQUFBLEdBQUFsRixDQUFBLENBQUE0RCxVQUFBLFNBQUEyQixNQUFBLENBQUF2RixDQUFBLENBQUE0RCxVQUFBLGNBQUF4RCxDQUFBLGFBQUE4RSxJQUFBLEdBQUFsRixDQUFBLENBQUEyRCxRQUFBLFNBQUE0QixNQUFBLENBQUF2RixDQUFBLENBQUEyRCxRQUFBLHFCQUFBckQsQ0FBQSxZQUFBcUMsS0FBQSxxREFBQXVDLElBQUEsR0FBQWxGLENBQUEsQ0FBQTRELFVBQUEsU0FBQTJCLE1BQUEsQ0FBQXZGLENBQUEsQ0FBQTRELFVBQUEsWUFBQVQsTUFBQSxXQUFBQSxPQUFBNUQsQ0FBQSxFQUFBRCxDQUFBLGFBQUFFLENBQUEsUUFBQXNFLFVBQUEsQ0FBQU0sTUFBQSxNQUFBNUUsQ0FBQSxTQUFBQSxDQUFBLFFBQUFLLENBQUEsUUFBQWlFLFVBQUEsQ0FBQXRFLENBQUEsT0FBQUssQ0FBQSxDQUFBNkQsTUFBQSxTQUFBd0IsSUFBQSxJQUFBdkYsQ0FBQSxDQUFBeUIsSUFBQSxDQUFBdkIsQ0FBQSx3QkFBQXFGLElBQUEsR0FBQXJGLENBQUEsQ0FBQStELFVBQUEsUUFBQTVELENBQUEsR0FBQUgsQ0FBQSxhQUFBRyxDQUFBLGlCQUFBVCxDQUFBLG1CQUFBQSxDQUFBLEtBQUFTLENBQUEsQ0FBQTBELE1BQUEsSUFBQXBFLENBQUEsSUFBQUEsQ0FBQSxJQUFBVSxDQUFBLENBQUE0RCxVQUFBLEtBQUE1RCxDQUFBLGNBQUFFLENBQUEsR0FBQUYsQ0FBQSxHQUFBQSxDQUFBLENBQUFpRSxVQUFBLGNBQUEvRCxDQUFBLENBQUFnQixJQUFBLEdBQUEzQixDQUFBLEVBQUFXLENBQUEsQ0FBQWlCLEdBQUEsR0FBQTdCLENBQUEsRUFBQVUsQ0FBQSxTQUFBNkMsTUFBQSxnQkFBQVUsSUFBQSxHQUFBdkQsQ0FBQSxDQUFBNEQsVUFBQSxFQUFBbkMsQ0FBQSxTQUFBK0QsUUFBQSxDQUFBdEYsQ0FBQSxNQUFBc0YsUUFBQSxXQUFBQSxTQUFBakcsQ0FBQSxFQUFBRCxDQUFBLG9CQUFBQyxDQUFBLENBQUEyQixJQUFBLFFBQUEzQixDQUFBLENBQUE0QixHQUFBLHFCQUFBNUIsQ0FBQSxDQUFBMkIsSUFBQSxtQkFBQTNCLENBQUEsQ0FBQTJCLElBQUEsUUFBQXFDLElBQUEsR0FBQWhFLENBQUEsQ0FBQTRCLEdBQUEsZ0JBQUE1QixDQUFBLENBQUEyQixJQUFBLFNBQUFvRSxJQUFBLFFBQUFuRSxHQUFBLEdBQUE1QixDQUFBLENBQUE0QixHQUFBLE9BQUEwQixNQUFBLGtCQUFBVSxJQUFBLHlCQUFBaEUsQ0FBQSxDQUFBMkIsSUFBQSxJQUFBNUIsQ0FBQSxVQUFBaUUsSUFBQSxHQUFBakUsQ0FBQSxHQUFBbUMsQ0FBQSxLQUFBZ0UsTUFBQSxXQUFBQSxPQUFBbEcsQ0FBQSxhQUFBRCxDQUFBLFFBQUF3RSxVQUFBLENBQUFNLE1BQUEsTUFBQTlFLENBQUEsU0FBQUEsQ0FBQSxRQUFBRSxDQUFBLFFBQUFzRSxVQUFBLENBQUF4RSxDQUFBLE9BQUFFLENBQUEsQ0FBQW9FLFVBQUEsS0FBQXJFLENBQUEsY0FBQWlHLFFBQUEsQ0FBQWhHLENBQUEsQ0FBQXlFLFVBQUEsRUFBQXpFLENBQUEsQ0FBQXFFLFFBQUEsR0FBQUcsYUFBQSxDQUFBeEUsQ0FBQSxHQUFBaUMsQ0FBQSxPQUFBaUUsS0FBQSxXQUFBQyxPQUFBcEcsQ0FBQSxhQUFBRCxDQUFBLFFBQUF3RSxVQUFBLENBQUFNLE1BQUEsTUFBQTlFLENBQUEsU0FBQUEsQ0FBQSxRQUFBRSxDQUFBLFFBQUFzRSxVQUFBLENBQUF4RSxDQUFBLE9BQUFFLENBQUEsQ0FBQWtFLE1BQUEsS0FBQW5FLENBQUEsUUFBQUksQ0FBQSxHQUFBSCxDQUFBLENBQUF5RSxVQUFBLGtCQUFBdEUsQ0FBQSxDQUFBdUIsSUFBQSxRQUFBckIsQ0FBQSxHQUFBRixDQUFBLENBQUF3QixHQUFBLEVBQUE2QyxhQUFBLENBQUF4RSxDQUFBLFlBQUFLLENBQUEsZ0JBQUE4QyxLQUFBLDhCQUFBaUQsYUFBQSxXQUFBQSxjQUFBdEcsQ0FBQSxFQUFBRSxDQUFBLEVBQUFHLENBQUEsZ0JBQUFtRCxRQUFBLEtBQUEzQyxRQUFBLEVBQUE2QixNQUFBLENBQUExQyxDQUFBLEdBQUFnRSxVQUFBLEVBQUE5RCxDQUFBLEVBQUFnRSxPQUFBLEVBQUE3RCxDQUFBLG9CQUFBa0QsTUFBQSxVQUFBMUIsR0FBQSxHQUFBNUIsQ0FBQSxHQUFBa0MsQ0FBQSxPQUFBbkMsQ0FBQTtBQUFBLFNBQUF1RyxtQkFBQUMsR0FBQSxFQUFBdkQsT0FBQSxFQUFBd0QsTUFBQSxFQUFBQyxLQUFBLEVBQUFDLE1BQUEsRUFBQUMsR0FBQSxFQUFBL0UsR0FBQSxjQUFBZ0YsSUFBQSxHQUFBTCxHQUFBLENBQUFJLEdBQUEsRUFBQS9FLEdBQUEsT0FBQXBCLEtBQUEsR0FBQW9HLElBQUEsQ0FBQXBHLEtBQUEsV0FBQXFHLEtBQUEsSUFBQUwsTUFBQSxDQUFBSyxLQUFBLGlCQUFBRCxJQUFBLENBQUF2RCxJQUFBLElBQUFMLE9BQUEsQ0FBQXhDLEtBQUEsWUFBQStFLE9BQUEsQ0FBQXZDLE9BQUEsQ0FBQXhDLEtBQUEsRUFBQTBDLElBQUEsQ0FBQXVELEtBQUEsRUFBQUMsTUFBQTtBQUFBLFNBQUFJLGtCQUFBQyxFQUFBLDZCQUFBQyxJQUFBLFNBQUFDLElBQUEsR0FBQUMsU0FBQSxhQUFBM0IsT0FBQSxXQUFBdkMsT0FBQSxFQUFBd0QsTUFBQSxRQUFBRCxHQUFBLEdBQUFRLEVBQUEsQ0FBQUksS0FBQSxDQUFBSCxJQUFBLEVBQUFDLElBQUEsWUFBQVIsTUFBQWpHLEtBQUEsSUFBQThGLGtCQUFBLENBQUFDLEdBQUEsRUFBQXZELE9BQUEsRUFBQXdELE1BQUEsRUFBQUMsS0FBQSxFQUFBQyxNQUFBLFVBQUFsRyxLQUFBLGNBQUFrRyxPQUFBVSxHQUFBLElBQUFkLGtCQUFBLENBQUFDLEdBQUEsRUFBQXZELE9BQUEsRUFBQXdELE1BQUEsRUFBQUMsS0FBQSxFQUFBQyxNQUFBLFdBQUFVLEdBQUEsS0FBQVgsS0FBQSxDQUFBWSxTQUFBO0FBREE7RUFBQSxJQUFBK0ksSUFBQSxHQUFBdEosaUJBQUEsZUFBQWhILG1CQUFBLEdBQUFvRixJQUFBLENBQWUsU0FBQXlHLFFBQU9zNkMsUUFBZ0I7SUFBQSxJQUFBQyxRQUFBLEVBQUE3akQsQ0FBQTtJQUFBLE9BQUF2QyxtQkFBQSxHQUFBdUIsSUFBQSxVQUFBdUssU0FBQUMsUUFBQTtNQUFBLGtCQUFBQSxRQUFBLENBQUFsRyxJQUFBLEdBQUFrRyxRQUFBLENBQUE3SCxJQUFBO1FBQUE7VUFFNUIzQixDQUFDLEdBQUcsSUFBSWtELE9BQU8sQ0FBQyxVQUFBdkMsT0FBTztZQUFBLE9BQUtrakQsUUFBUSxHQUFHbGpELE9BQU87VUFBQSxDQUFDLENBQUM7VUFFdEQ0a0IsVUFBVSxDQUFDcytCLFFBQVEsRUFBRUQsUUFBUSxDQUFDO1VBQUMsT0FBQXA2QyxRQUFBLENBQUFqSSxNQUFBLFdBRXhCdkIsQ0FBQztRQUFBO1FBQUE7VUFBQSxPQUFBd0osUUFBQSxDQUFBL0YsSUFBQTtNQUFBO0lBQUEsR0FBQTZGLE9BQUE7RUFBQSxDQUNYO0VBQUEsaUJBQUEyUCxFQUFBO0lBQUEsT0FBQWxMLElBQUEsQ0FBQWpKLEtBQUEsT0FBQUQsU0FBQTtFQUFBO0FBQUE7Ozs7Ozs7Ozs7QUNQRCxDQUFDLFNBQVNpL0MsZ0NBQWdDQSxDQUFDcjFDLElBQUksRUFBRXMxQyxPQUFPLEVBQUU7RUFDekQsSUFBRyxJQUF5RCxFQUMzRHRCLE1BQU0sQ0FBQ3VCLE9BQU8sR0FBR0QsT0FBTyxDQUFDbEIsbUJBQU8sQ0FBQyx3REFBVyxDQUFDLENBQUMsQ0FBQyxLQUMzQyxFQUsrQztBQUNyRCxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVNxQixnQ0FBZ0MsRUFBRTtFQUNwRCxPQUFPLFNBQVUsWUFBTTtNQUFFO01BQ3pCO01BQVUsWUFBWTs7TUFDdEI7TUFBVSxJQUFJQyxtQkFBbUIsR0FBSTtRQUVyQyxLQUFNLEdBQUcsRUFDVCxLQUFPLFNBQUFwZ0MsRUFBQzArQixNQUFNLEVBQUs7VUFJbkI7O1VBRUFBLE1BQU0sQ0FBQ3VCLE9BQU8sR0FBR25tRCxNQUFNLENBQUNtNkIsTUFBTSxJQUFJLElBQUksR0FBR242QixNQUFNLENBQUNtNkIsTUFBTSxDQUFDM3VCLElBQUksQ0FBQ3hMLE1BQU0sQ0FBQyxHQUFHLFVBQVV1bUQsR0FBRyxFQUFFO1lBQ25GLEtBQUssSUFBSXBrQixJQUFJLEdBQUduN0IsU0FBUyxDQUFDckMsTUFBTSxFQUFFNmhELElBQUksR0FBRzMrQyxLQUFLLENBQUNzNkIsSUFBSSxHQUFHLENBQUMsR0FBR0EsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRUMsSUFBSSxHQUFHLENBQUMsRUFBRUEsSUFBSSxHQUFHRCxJQUFJLEVBQUVDLElBQUksRUFBRSxFQUFFO2NBQ3RHb2tCLElBQUksQ0FBQ3BrQixJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUdwN0IsU0FBUyxDQUFDbzdCLElBQUksQ0FBQztZQUNsQztZQUVBb2tCLElBQUksQ0FBQzlqRCxPQUFPLENBQUMsVUFBVStqRCxHQUFHLEVBQUU7Y0FDMUJ6bUQsTUFBTSxDQUFDc0YsSUFBSSxDQUFDbWhELEdBQUcsQ0FBQyxDQUFDL2pELE9BQU8sQ0FBQyxVQUFVdVUsQ0FBQyxFQUFFO2dCQUNwQyxPQUFPc3ZDLEdBQUcsQ0FBQ3R2QyxDQUFDLENBQUMsR0FBR3d2QyxHQUFHLENBQUN4dkMsQ0FBQyxDQUFDO2NBQ3hCLENBQUMsQ0FBQztZQUNKLENBQUMsQ0FBQztZQUVGLE9BQU9zdkMsR0FBRztVQUNaLENBQUM7O1VBRUQ7UUFBTSxDQUFFOztRQUVSLEtBQU0sR0FBRyxFQUNULEtBQU8sU0FBQXJnQyxFQUFDMCtCLE1BQU0sRUFBRThCLHdCQUF3QixFQUFFQywrQkFBbUIsRUFBSztVQUlsRSxJQUFJdi9DLGNBQWMsR0FBRyxZQUFZO1lBQUUsU0FBU3cvQyxhQUFhQSxDQUFDdi9DLEdBQUcsRUFBRTlHLENBQUMsRUFBRTtjQUFFLElBQUlzbUQsSUFBSSxHQUFHLEVBQUU7Y0FBRSxJQUFJQyxFQUFFLEdBQUcsSUFBSTtjQUFFLElBQUlDLEVBQUUsR0FBRyxLQUFLO2NBQUUsSUFBSUMsRUFBRSxHQUFHNy9DLFNBQVM7Y0FBRSxJQUFJO2dCQUFFLEtBQUssSUFBSTgvQyxFQUFFLEdBQUc1L0MsR0FBRyxDQUFDN0csTUFBTSxDQUFDRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUV3bUQsRUFBRSxFQUFFLEVBQUVKLEVBQUUsR0FBRyxDQUFDSSxFQUFFLEdBQUdELEVBQUUsQ0FBQ25qRCxJQUFJLENBQUMsQ0FBQyxFQUFFWCxJQUFJLENBQUMsRUFBRTJqRCxFQUFFLEdBQUcsSUFBSSxFQUFFO2tCQUFFRCxJQUFJLENBQUN2aUQsSUFBSSxDQUFDNGlELEVBQUUsQ0FBQzVtRCxLQUFLLENBQUM7a0JBQUUsSUFBSUMsQ0FBQyxJQUFJc21ELElBQUksQ0FBQ2xpRCxNQUFNLEtBQUtwRSxDQUFDLEVBQUU7Z0JBQU87Y0FBRSxDQUFDLENBQUMsT0FBTzJHLEdBQUcsRUFBRTtnQkFBRTYvQyxFQUFFLEdBQUcsSUFBSTtnQkFBRUMsRUFBRSxHQUFHOS9DLEdBQUc7Y0FBRSxDQUFDLFNBQVM7Z0JBQUUsSUFBSTtrQkFBRSxJQUFJLENBQUM0L0MsRUFBRSxJQUFJRyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUVBLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUFFLENBQUMsU0FBUztrQkFBRSxJQUFJRixFQUFFLEVBQUUsTUFBTUMsRUFBRTtnQkFBRTtjQUFFO2NBQUUsT0FBT0gsSUFBSTtZQUFFO1lBQUUsT0FBTyxVQUFVeC9DLEdBQUcsRUFBRTlHLENBQUMsRUFBRTtjQUFFLElBQUlzSCxLQUFLLENBQUNLLE9BQU8sQ0FBQ2IsR0FBRyxDQUFDLEVBQUU7Z0JBQUUsT0FBT0EsR0FBRztjQUFFLENBQUMsTUFBTSxJQUFJN0csTUFBTSxDQUFDRSxRQUFRLElBQUlWLE1BQU0sQ0FBQ3FILEdBQUcsQ0FBQyxFQUFFO2dCQUFFLE9BQU91L0MsYUFBYSxDQUFDdi9DLEdBQUcsRUFBRTlHLENBQUMsQ0FBQztjQUFFLENBQUMsTUFBTTtnQkFBRSxNQUFNLElBQUlxRCxTQUFTLENBQUMsc0RBQXNELENBQUM7Y0FBRTtZQUFFLENBQUM7VUFBRSxDQUFDLENBQUMsQ0FBQzs7VUFFdnBCO0FBQ0E7QUFDQTs7VUFFQSxJQUFJdWpELFVBQVUsR0FBR1IsK0JBQW1CLENBQUMsR0FBRyxDQUFDLENBQUNTLFVBQVUsQ0FBQ0QsVUFBVTtVQUUvRCxJQUFJRSxTQUFTLEdBQUcsQ0FBQyxDQUFDOztVQUVsQjtVQUNBQSxTQUFTLENBQUNDLGVBQWUsR0FBRyxVQUFVcGMsS0FBSyxFQUFFO1lBQzNDLElBQUlxYyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLEtBQUssSUFBSWhuRCxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUcycUMsS0FBSyxDQUFDdm1DLE1BQU0sRUFBRXBFLENBQUMsRUFBRSxFQUFFO2NBQ3JDZ25ELFFBQVEsQ0FBQ3JjLEtBQUssQ0FBQzNxQyxDQUFDLENBQUMsQ0FBQ2lVLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJO1lBQ2hDO1lBQ0EsSUFBSWd6QyxLQUFLLEdBQUd0YyxLQUFLLENBQUNyNkIsTUFBTSxDQUFDLFVBQVU0MkMsR0FBRyxFQUFFbG5ELENBQUMsRUFBRTtjQUN6QyxJQUFJLE9BQU9rbkQsR0FBRyxLQUFLLFFBQVEsRUFBRTtnQkFDM0JBLEdBQUcsR0FBR2xuRCxDQUFDO2NBQ1Q7Y0FDQSxJQUFJNG1DLE1BQU0sR0FBR3NnQixHQUFHLENBQUN0Z0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Y0FDNUIsT0FBT0EsTUFBTSxJQUFJLElBQUksRUFBRTtnQkFDckIsSUFBSW9nQixRQUFRLENBQUNwZ0IsTUFBTSxDQUFDM3lCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRTtrQkFDekIsT0FBTyxLQUFLO2dCQUNkO2dCQUNBMnlCLE1BQU0sR0FBR0EsTUFBTSxDQUFDQSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztjQUM3QjtjQUNBLE9BQU8sSUFBSTtZQUNiLENBQUMsQ0FBQztZQUVGLE9BQU9xZ0IsS0FBSztVQUNkLENBQUM7O1VBRUQ7VUFDQUgsU0FBUyxDQUFDSyxpQkFBaUIsR0FBRyxVQUFVMWMsRUFBRSxFQUFFMmMsSUFBSSxFQUFFQyxZQUFZLEVBQUVDLFVBQVUsRUFBRTtZQUMxRSxJQUFJQyxLQUFLLEdBQUcsSUFBSVgsVUFBVSxDQUFDLENBQUM7WUFDNUIsSUFBSVksT0FBTyxHQUFHLElBQUlycUIsR0FBRyxDQUFDLENBQUM7WUFDdkIsSUFBSXNxQixtQkFBbUIsR0FBRyxFQUFFO1lBQzVCLElBQUlDLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDNUIsSUFBSUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUMxQixJQUFJQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBRXRCLElBQUlDLFdBQVcsR0FBRyxLQUFLO1lBQ3ZCLElBQUk3Z0IsS0FBSyxHQUFHLENBQUM7WUFDYixJQUFJOGdCLHFCQUFxQixHQUFHLEVBQUU7WUFDOUIsSUFBSW55QyxVQUFVLEdBQUcsRUFBRTtZQUVuQixJQUFJWSxLQUFLLEdBQUcsU0FBU0EsS0FBS0EsQ0FBQSxFQUFHO2NBQzNCLElBQUl3eEMsSUFBSSxHQUFHdGQsRUFBRSxDQUFDK0MsVUFBVSxDQUFDLENBQUM7Y0FDMUI3M0IsVUFBVSxDQUFDNVIsSUFBSSxDQUFDZ2tELElBQUksQ0FBQztjQUVyQixJQUFJQyxXQUFXLEdBQUdYLFlBQVksQ0FBQyxDQUFDLENBQUM7Y0FDakMsSUFBSVkscUJBQXFCLEdBQUd4ZCxFQUFFLENBQUMrQyxVQUFVLENBQUMsQ0FBQztjQUMzQ3lhLHFCQUFxQixDQUFDcmEsS0FBSyxDQUFDb2EsV0FBVyxDQUFDLENBQUNwYSxLQUFLLENBQUNvYSxXQUFXLENBQUNFLFdBQVcsQ0FBQyxDQUFDLENBQUNqc0MsWUFBWSxDQUFDbXJDLElBQUksQ0FBQyxDQUFDO2NBQzVGSyxtQkFBbUIsQ0FBQzFqRCxJQUFJLENBQUNpa0QsV0FBVyxDQUFDO2NBRXJDQyxxQkFBcUIsQ0FBQzlsRCxPQUFPLENBQUMsVUFBVTJULElBQUksRUFBRTtnQkFDNUN5eEMsS0FBSyxDQUFDeGpELElBQUksQ0FBQytSLElBQUksQ0FBQztnQkFDaEIweEMsT0FBTyxDQUFDMzJDLEdBQUcsQ0FBQ2lGLElBQUksQ0FBQztnQkFDakJpeUMsSUFBSSxDQUFDbmEsS0FBSyxDQUFDOTNCLElBQUksQ0FBQztjQUNsQixDQUFDLENBQUM7Y0FFRixJQUFJcXlDLE1BQU0sR0FBRyxTQUFTQSxNQUFNQSxDQUFBLEVBQUc7Z0JBQzdCSCxXQUFXLEdBQUdULEtBQUssQ0FBQ2EsS0FBSyxDQUFDLENBQUM7O2dCQUUzQjtnQkFDQSxJQUFJQyxhQUFhLEdBQUc1ZCxFQUFFLENBQUMrQyxVQUFVLENBQUMsQ0FBQztnQkFDbkN3YSxXQUFXLENBQUNNLFlBQVksQ0FBQyxDQUFDLENBQUMzZCxLQUFLLENBQUMsQ0FBQyxDQUFDeG9DLE9BQU8sQ0FBQyxVQUFVMlQsSUFBSSxFQUFFO2tCQUN6RCxJQUFJc3hDLElBQUksQ0FBQ25yQyxZQUFZLENBQUMrckMsV0FBVyxDQUFDTyxTQUFTLENBQUN6eUMsSUFBSSxDQUFDLENBQUMsQ0FBQzFSLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQzdEaWtELGFBQWEsQ0FBQ3phLEtBQUssQ0FBQzkzQixJQUFJLENBQUM7a0JBQzNCO2dCQUNGLENBQUMsQ0FBQztnQkFFRixLQUFLLElBQUk5VixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdxb0QsYUFBYSxDQUFDamtELE1BQU0sRUFBRXBFLENBQUMsRUFBRSxFQUFFO2tCQUM3QyxJQUFJd29ELFlBQVksR0FBR0gsYUFBYSxDQUFDcm9ELENBQUMsQ0FBQztrQkFDbkMwbkQsZUFBZSxHQUFHTCxZQUFZLENBQUNwckMsWUFBWSxDQUFDdXNDLFlBQVksQ0FBQ0MsS0FBSyxDQUFDRCxZQUFZLENBQUMzYSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7a0JBQ3pGLElBQUk2WixlQUFlLElBQUksSUFBSSxJQUFJLENBQUNGLE9BQU8sQ0FBQy8wQyxHQUFHLENBQUNpMUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQy9ELElBQUlnQixrQkFBa0IsR0FBR2hCLGVBQWUsQ0FBQ2UsS0FBSyxDQUFDZixlQUFlLENBQUNRLFdBQVcsQ0FBQyxDQUFDLENBQUM7b0JBRTdFUSxrQkFBa0IsQ0FBQ3ZtRCxPQUFPLENBQUMsVUFBVTJULElBQUksRUFBRTtzQkFDekN5eEMsS0FBSyxDQUFDeGpELElBQUksQ0FBQytSLElBQUksQ0FBQztzQkFDaEIweEMsT0FBTyxDQUFDMzJDLEdBQUcsQ0FBQ2lGLElBQUksQ0FBQztzQkFDakJpeUMsSUFBSSxDQUFDbmEsS0FBSyxDQUFDOTNCLElBQUksQ0FBQztzQkFDaEIsSUFBSXV4QyxZQUFZLENBQUM1MEMsR0FBRyxDQUFDcUQsSUFBSSxDQUFDLEVBQUU7d0JBQzFCMnhDLG1CQUFtQixDQUFDMWpELElBQUksQ0FBQytSLElBQUksQ0FBQztzQkFDaEM7b0JBQ0YsQ0FBQyxDQUFDO2tCQUNKO2dCQUNGO2NBQ0YsQ0FBQztjQUVELE9BQU95eEMsS0FBSyxDQUFDbmpELE1BQU0sSUFBSSxDQUFDLEVBQUU7Z0JBQ3hCK2pELE1BQU0sQ0FBQyxDQUFDO2NBQ1Y7Y0FFQUosSUFBSSxDQUFDNWxELE9BQU8sQ0FBQyxVQUFVMlQsSUFBSSxFQUFFO2dCQUMzQnN4QyxJQUFJLENBQUNuckMsWUFBWSxDQUFDbkcsSUFBSSxDQUFDdzNCLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQ25yQyxPQUFPLENBQUMsVUFBVTdDLENBQUMsRUFBRTtrQkFDNUQ7a0JBQ0EsSUFBSXlvRCxJQUFJLENBQUN0MUMsR0FBRyxDQUFDblQsQ0FBQyxDQUFDd25DLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSWloQixJQUFJLENBQUN0MUMsR0FBRyxDQUFDblQsQ0FBQyxDQUFDdzlCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDaEQ7b0JBQ0FpckIsSUFBSSxDQUFDbmEsS0FBSyxDQUFDdHVDLENBQUMsQ0FBQztrQkFDZjtnQkFDRixDQUFDLENBQUM7Y0FDSixDQUFDLENBQUM7Y0FFRixJQUFJbW9ELG1CQUFtQixDQUFDcmpELE1BQU0sSUFBSWlqRCxZQUFZLENBQUNqakQsTUFBTSxFQUFFO2dCQUNyRHlqRCxXQUFXLEdBQUcsSUFBSTtjQUNwQjtjQUVBLElBQUksQ0FBQ0EsV0FBVyxJQUFJQSxXQUFXLElBQUk3Z0IsS0FBSyxHQUFHLENBQUMsRUFBRTtnQkFDNUMyZ0IsYUFBYSxHQUFHRixtQkFBbUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDRyxTQUFTLEdBQUdELGFBQWEsQ0FBQ3JhLGNBQWMsQ0FBQyxDQUFDLENBQUNscEMsTUFBTTtnQkFDakRxakQsbUJBQW1CLENBQUN0bEQsT0FBTyxDQUFDLFVBQVUyVCxJQUFJLEVBQUU7a0JBQzFDLElBQUlBLElBQUksQ0FBQ3czQixjQUFjLENBQUMsQ0FBQyxDQUFDbHBDLE1BQU0sR0FBR3dqRCxTQUFTLEVBQUU7b0JBQzVDQSxTQUFTLEdBQUc5eEMsSUFBSSxDQUFDdzNCLGNBQWMsQ0FBQyxDQUFDLENBQUNscEMsTUFBTTtvQkFDeEN1akQsYUFBYSxHQUFHN3hDLElBQUk7a0JBQ3RCO2dCQUNGLENBQUMsQ0FBQztnQkFDRmd5QyxxQkFBcUIsQ0FBQy9qRCxJQUFJLENBQUM0akQsYUFBYSxDQUFDMXpDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzlDO2dCQUNBLElBQUkwMEMsSUFBSSxHQUFHbGUsRUFBRSxDQUFDK0MsVUFBVSxDQUFDLENBQUM7Z0JBQzFCbWIsSUFBSSxDQUFDL2EsS0FBSyxDQUFDNlosbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDQSxtQkFBbUIsQ0FBQ3RsRCxPQUFPLENBQUMsVUFBVTJULElBQUksRUFBRTtrQkFDMUM2eUMsSUFBSSxDQUFDL2EsS0FBSyxDQUFDOTNCLElBQUksQ0FBQztnQkFDbEIsQ0FBQyxDQUFDO2dCQUNGMnhDLG1CQUFtQixHQUFHLEVBQUU7Z0JBQ3hCSixZQUFZLEdBQUdBLFlBQVksQ0FBQzE4QixVQUFVLENBQUNnK0IsSUFBSSxDQUFDO2dCQUM1QzNoQixLQUFLLEVBQUU7Y0FDVDtZQUNGLENBQUM7WUFFRCxHQUFHO2NBQ0R6d0IsS0FBSyxDQUFDLENBQUM7WUFDVCxDQUFDLFFBQVEsQ0FBQ3N4QyxXQUFXO1lBRXJCLElBQUlQLFVBQVUsRUFBRTtjQUNkLElBQUlRLHFCQUFxQixDQUFDMWpELE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3BDa2pELFVBQVUsQ0FBQ2xOLEdBQUcsQ0FBQyxPQUFPLElBQUlrTixVQUFVLENBQUNzQixJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUVkLHFCQUFxQixDQUFDO2NBQ3hFO1lBQ0Y7WUFDQSxPQUFPbnlDLFVBQVU7VUFDbkIsQ0FBQzs7VUFFRDtVQUNBbXhDLFNBQVMsQ0FBQytCLGlCQUFpQixHQUFHLFVBQVVDLGNBQWMsRUFBRUMsZUFBZSxFQUFFaHZCLE9BQU8sRUFBRTtZQUNoRixJQUFJLENBQUNBLE9BQU8sQ0FBQ2l2QixtQkFBbUIsRUFBRTtjQUNoQyxJQUFJQyxTQUFTLEdBQUd0dEMsTUFBTSxDQUFDdXRDLGlCQUFpQjtjQUN4QyxJQUFJQyxTQUFTLEdBQUd4dEMsTUFBTSxDQUFDeXRDLGlCQUFpQjtjQUN4QyxJQUFJQyxTQUFTLEdBQUcxdEMsTUFBTSxDQUFDdXRDLGlCQUFpQjtjQUN4QyxJQUFJSSxTQUFTLEdBQUczdEMsTUFBTSxDQUFDeXRDLGlCQUFpQjtjQUN4QyxJQUFJcnZCLE9BQU8sQ0FBQ3d2QixPQUFPLElBQUksT0FBTyxFQUFFO2dCQUM5QjtnQkFDQSxJQUFJQyx5QkFBeUIsR0FBRyxJQUFJO2dCQUNwQyxJQUFJQyxpQkFBaUIsR0FBRyxLQUFLO2dCQUM3QixJQUFJQyxjQUFjLEdBQUc5aUQsU0FBUztnQkFFOUIsSUFBSTtrQkFDRixLQUFLLElBQUk4cEIsU0FBUyxHQUFHcTRCLGVBQWUsQ0FBQ1ksV0FBVyxDQUFDMXBELE1BQU0sQ0FBQ0UsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFeXdCLEtBQUssRUFBRSxFQUFFNDRCLHlCQUF5QixHQUFHLENBQUM1NEIsS0FBSyxHQUFHRixTQUFTLENBQUNudEIsSUFBSSxDQUFDLENBQUMsRUFBRVgsSUFBSSxDQUFDLEVBQUU0bUQseUJBQXlCLEdBQUcsSUFBSSxFQUFFO29CQUM1SyxJQUFJNzVDLElBQUksR0FBR2loQixLQUFLLENBQUM3d0IsS0FBSztvQkFFdEIsSUFBSXVrQixLQUFLLEdBQUd6ZCxjQUFjLENBQUM4SSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUVuQyxJQUFJekosR0FBRyxHQUFHb2UsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDbEIsSUFBSXZrQixLQUFLLEdBQUd1a0IsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFFcEIsSUFBSXNsQyxNQUFNLEdBQUc3dkIsT0FBTyxDQUFDMFEsRUFBRSxDQUFDdDZCLGNBQWMsQ0FBQ2pLLEdBQUcsQ0FBQztvQkFDM0MsSUFBSTBqRCxNQUFNLEVBQUU7c0JBQ1YsSUFBSUMsTUFBTSxHQUFHRCxNQUFNLENBQUNFLFdBQVcsQ0FBQyxDQUFDO3NCQUNqQyxJQUFJQyxLQUFLLEdBQUdoQixlQUFlLENBQUNpQixPQUFPLENBQUNqcUQsS0FBSyxDQUFDLEdBQUc4cEQsTUFBTSxDQUFDSSxDQUFDLEdBQUcsQ0FBQztzQkFDekQsSUFBSUMsTUFBTSxHQUFHbkIsZUFBZSxDQUFDaUIsT0FBTyxDQUFDanFELEtBQUssQ0FBQyxHQUFHOHBELE1BQU0sQ0FBQ0ksQ0FBQyxHQUFHLENBQUM7c0JBQzFELElBQUlFLElBQUksR0FBR3BCLGVBQWUsQ0FBQ3FCLE9BQU8sQ0FBQ3JxRCxLQUFLLENBQUMsR0FBRzhwRCxNQUFNLENBQUN4b0QsQ0FBQyxHQUFHLENBQUM7c0JBQ3hELElBQUlncEQsT0FBTyxHQUFHdEIsZUFBZSxDQUFDcUIsT0FBTyxDQUFDcnFELEtBQUssQ0FBQyxHQUFHOHBELE1BQU0sQ0FBQ3hvRCxDQUFDLEdBQUcsQ0FBQztzQkFFM0QsSUFBSTBvRCxLQUFLLEdBQUdkLFNBQVMsRUFBRUEsU0FBUyxHQUFHYyxLQUFLO3NCQUN4QyxJQUFJRyxNQUFNLEdBQUdmLFNBQVMsRUFBRUEsU0FBUyxHQUFHZSxNQUFNO3NCQUMxQyxJQUFJQyxJQUFJLEdBQUdkLFNBQVMsRUFBRUEsU0FBUyxHQUFHYyxJQUFJO3NCQUN0QyxJQUFJRSxPQUFPLEdBQUdmLFNBQVMsRUFBRUEsU0FBUyxHQUFHZSxPQUFPO29CQUM5QztrQkFDRjtrQkFDQTtnQkFDRixDQUFDLENBQUMsT0FBTzFqRCxHQUFHLEVBQUU7a0JBQ1o4aUQsaUJBQWlCLEdBQUcsSUFBSTtrQkFDeEJDLGNBQWMsR0FBRy9pRCxHQUFHO2dCQUN0QixDQUFDLFNBQVM7a0JBQ1IsSUFBSTtvQkFDRixJQUFJLENBQUM2aUQseUJBQXlCLElBQUk5NEIsU0FBUyxDQUFDdHRCLE1BQU0sRUFBRTtzQkFDbERzdEIsU0FBUyxDQUFDdHRCLE1BQU0sQ0FBQyxDQUFDO29CQUNwQjtrQkFDRixDQUFDLFNBQVM7b0JBQ1IsSUFBSXFtRCxpQkFBaUIsRUFBRTtzQkFDckIsTUFBTUMsY0FBYztvQkFDdEI7a0JBQ0Y7Z0JBQ0Y7Z0JBRUEsSUFBSVksT0FBTyxHQUFHeEIsY0FBYyxDQUFDeUIsQ0FBQyxHQUFHLENBQUNwQixTQUFTLEdBQUdGLFNBQVMsSUFBSSxDQUFDO2dCQUM1RCxJQUFJdUIsT0FBTyxHQUFHMUIsY0FBYyxDQUFDcm5ELENBQUMsR0FBRyxDQUFDNm5ELFNBQVMsR0FBR0QsU0FBUyxJQUFJLENBQUM7Z0JBQzVEO2dCQUNBTixlQUFlLENBQUNpQixPQUFPLEdBQUdqQixlQUFlLENBQUNpQixPQUFPLENBQUN6NUMsR0FBRyxDQUFDLFVBQVVnNkMsQ0FBQyxFQUFFO2tCQUNqRSxPQUFPQSxDQUFDLEdBQUdELE9BQU87Z0JBQ3BCLENBQUMsQ0FBQztnQkFDRnZCLGVBQWUsQ0FBQ3FCLE9BQU8sR0FBR3JCLGVBQWUsQ0FBQ3FCLE9BQU8sQ0FBQzc1QyxHQUFHLENBQUMsVUFBVTlPLENBQUMsRUFBRTtrQkFDakUsT0FBT0EsQ0FBQyxHQUFHK29ELE9BQU87Z0JBQ3BCLENBQUMsQ0FBQztjQUNKLENBQUMsTUFBTTtnQkFDTDtnQkFDQS9xRCxNQUFNLENBQUNzRixJQUFJLENBQUNna0QsZUFBZSxDQUFDLENBQUM1bUQsT0FBTyxDQUFDLFVBQVU4d0IsSUFBSSxFQUFFO2tCQUNuRCxJQUFJbmQsSUFBSSxHQUFHaXpDLGVBQWUsQ0FBQzkxQixJQUFJLENBQUM7a0JBQ2hDLElBQUk4MkIsS0FBSyxHQUFHajBDLElBQUksQ0FBQzIwQyxPQUFPLENBQUMsQ0FBQyxDQUFDRixDQUFDO2tCQUM1QixJQUFJTCxNQUFNLEdBQUdwMEMsSUFBSSxDQUFDMjBDLE9BQU8sQ0FBQyxDQUFDLENBQUNGLENBQUMsR0FBR3owQyxJQUFJLENBQUMyMEMsT0FBTyxDQUFDLENBQUMsQ0FBQzFlLEtBQUs7a0JBQ3BELElBQUlvZSxJQUFJLEdBQUdyMEMsSUFBSSxDQUFDMjBDLE9BQU8sQ0FBQyxDQUFDLENBQUNocEQsQ0FBQztrQkFDM0IsSUFBSTRvRCxPQUFPLEdBQUd2MEMsSUFBSSxDQUFDMjBDLE9BQU8sQ0FBQyxDQUFDLENBQUNocEQsQ0FBQyxHQUFHcVUsSUFBSSxDQUFDMjBDLE9BQU8sQ0FBQyxDQUFDLENBQUN6ZSxNQUFNO2tCQUV0RCxJQUFJK2QsS0FBSyxHQUFHZCxTQUFTLEVBQUVBLFNBQVMsR0FBR2MsS0FBSztrQkFDeEMsSUFBSUcsTUFBTSxHQUFHZixTQUFTLEVBQUVBLFNBQVMsR0FBR2UsTUFBTTtrQkFDMUMsSUFBSUMsSUFBSSxHQUFHZCxTQUFTLEVBQUVBLFNBQVMsR0FBR2MsSUFBSTtrQkFDdEMsSUFBSUUsT0FBTyxHQUFHZixTQUFTLEVBQUVBLFNBQVMsR0FBR2UsT0FBTztnQkFDOUMsQ0FBQyxDQUFDO2dCQUNGO2dCQUNBLElBQUlLLFFBQVEsR0FBRzVCLGNBQWMsQ0FBQ3lCLENBQUMsR0FBRyxDQUFDcEIsU0FBUyxHQUFHRixTQUFTLElBQUksQ0FBQztnQkFDN0QsSUFBSTBCLFFBQVEsR0FBRzdCLGNBQWMsQ0FBQ3JuRCxDQUFDLEdBQUcsQ0FBQzZuRCxTQUFTLEdBQUdELFNBQVMsSUFBSSxDQUFDO2dCQUM3RDtnQkFDQTVwRCxNQUFNLENBQUNzRixJQUFJLENBQUNna0QsZUFBZSxDQUFDLENBQUM1bUQsT0FBTyxDQUFDLFVBQVU4d0IsSUFBSSxFQUFFO2tCQUNuRCxJQUFJbmQsSUFBSSxHQUFHaXpDLGVBQWUsQ0FBQzkxQixJQUFJLENBQUM7a0JBQ2hDbmQsSUFBSSxDQUFDODBDLFNBQVMsQ0FBQzkwQyxJQUFJLENBQUMrMEMsVUFBVSxDQUFDLENBQUMsR0FBR0gsUUFBUSxFQUFFNTBDLElBQUksQ0FBQ2cxQyxVQUFVLENBQUMsQ0FBQyxHQUFHSCxRQUFRLENBQUM7Z0JBQzVFLENBQUMsQ0FBQztjQUNKO1lBQ0Y7VUFDRixDQUFDO1VBRUQ3RCxTQUFTLENBQUNpRSxlQUFlLEdBQUcsVUFBVUMsVUFBVSxFQUFFaEIsT0FBTyxFQUFFSSxPQUFPLEVBQUVULFdBQVcsRUFBRTtZQUMvRTtZQUNBLElBQUlzQixJQUFJLEdBQUd0dkMsTUFBTSxDQUFDdXZDLGdCQUFnQjtZQUNsQyxJQUFJQyxLQUFLLEdBQUd4dkMsTUFBTSxDQUFDeXZDLGdCQUFnQjtZQUNuQyxJQUFJQyxHQUFHLEdBQUcxdkMsTUFBTSxDQUFDdXZDLGdCQUFnQjtZQUNqQyxJQUFJSSxNQUFNLEdBQUczdkMsTUFBTSxDQUFDeXZDLGdCQUFnQjtZQUNwQyxJQUFJRyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUlDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdEIsSUFBSUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNwQixJQUFJQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBRXZCLElBQUkvZ0IsS0FBSyxHQUFHcWdCLFVBQVUsQ0FBQzlDLFdBQVcsQ0FBQyxDQUFDLENBQUN5RCxHQUFHLENBQUMsU0FBUyxDQUFDO1lBQ25ELElBQUlucUQsQ0FBQyxHQUFHbXBDLEtBQUssQ0FBQ3ZtQyxNQUFNO1lBQ3BCLEtBQUssSUFBSXBFLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3dCLENBQUMsRUFBRXhCLENBQUMsRUFBRSxFQUFFO2NBQzFCLElBQUk4VixJQUFJLEdBQUc2MEIsS0FBSyxDQUFDM3FDLENBQUMsQ0FBQztjQUVuQnVyRCxRQUFRLEdBQUd2QixPQUFPLENBQUNMLFdBQVcsQ0FBQ2x2QyxHQUFHLENBQUMzRSxJQUFJLENBQUM3QixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRzZCLElBQUksQ0FBQ2kyQixLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7Y0FDakV5ZixTQUFTLEdBQUd4QixPQUFPLENBQUNMLFdBQVcsQ0FBQ2x2QyxHQUFHLENBQUMzRSxJQUFJLENBQUM3QixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRzZCLElBQUksQ0FBQ2kyQixLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7Y0FDbEUwZixPQUFPLEdBQUdyQixPQUFPLENBQUNULFdBQVcsQ0FBQ2x2QyxHQUFHLENBQUMzRSxJQUFJLENBQUM3QixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRzZCLElBQUksQ0FBQ2syQixNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUM7Y0FDakUwZixVQUFVLEdBQUd0QixPQUFPLENBQUNULFdBQVcsQ0FBQ2x2QyxHQUFHLENBQUMzRSxJQUFJLENBQUM3QixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRzZCLElBQUksQ0FBQ2syQixNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUM7Y0FFcEUsSUFBSWlmLElBQUksR0FBR00sUUFBUSxFQUFFO2dCQUNuQk4sSUFBSSxHQUFHTSxRQUFRO2NBQ2pCO2NBRUEsSUFBSUosS0FBSyxHQUFHSyxTQUFTLEVBQUU7Z0JBQ3JCTCxLQUFLLEdBQUdLLFNBQVM7Y0FDbkI7Y0FFQSxJQUFJSCxHQUFHLEdBQUdJLE9BQU8sRUFBRTtnQkFDakJKLEdBQUcsR0FBR0ksT0FBTztjQUNmO2NBRUEsSUFBSUgsTUFBTSxHQUFHSSxVQUFVLEVBQUU7Z0JBQ3ZCSixNQUFNLEdBQUdJLFVBQVU7Y0FDckI7WUFDRjtZQUVBLElBQUk1QixXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCQSxXQUFXLENBQUM4QixRQUFRLEdBQUdYLElBQUk7WUFDM0JuQixXQUFXLENBQUMrQixRQUFRLEdBQUdSLEdBQUc7WUFDMUJ2QixXQUFXLENBQUMvZCxLQUFLLEdBQUdvZixLQUFLLEdBQUdGLElBQUk7WUFDaENuQixXQUFXLENBQUM5ZCxNQUFNLEdBQUdzZixNQUFNLEdBQUdELEdBQUc7WUFDakMsT0FBT3ZCLFdBQVc7VUFDcEIsQ0FBQzs7VUFFRDtVQUNBaEQsU0FBUyxDQUFDZ0YsMEJBQTBCLEdBQUcsVUFBVXJoQixFQUFFLEVBQUUyYyxJQUFJLEVBQUU7WUFDekQsSUFBSTJFLHNCQUFzQixHQUFHdGhCLEVBQUUsQ0FBQytDLFVBQVUsQ0FBQyxDQUFDO1lBQzVDNFosSUFBSSxDQUFDemMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDeG9DLE9BQU8sQ0FBQyxVQUFVeWtDLE1BQU0sRUFBRTtjQUM5QyxJQUFJb2xCLEtBQUssR0FBRyxLQUFLO2NBQ2pCcGxCLE1BQU0sQ0FBQzd5QixRQUFRLENBQUMsQ0FBQyxDQUFDNVIsT0FBTyxDQUFDLFVBQVVvMkIsS0FBSyxFQUFFO2dCQUN6QyxJQUFJQSxLQUFLLENBQUMwekIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLE1BQU0sRUFBRTtrQkFDbENELEtBQUssR0FBRyxJQUFJO2dCQUNkO2NBQ0YsQ0FBQyxDQUFDO2NBQ0YsSUFBSSxDQUFDQSxLQUFLLEVBQUU7Z0JBQ1ZELHNCQUFzQixDQUFDbmUsS0FBSyxDQUFDaEgsTUFBTSxDQUFDO2NBQ3RDO1lBQ0YsQ0FBQyxDQUFDO1lBRUYsT0FBT21sQixzQkFBc0I7VUFDL0IsQ0FBQztVQUVEMUgsTUFBTSxDQUFDdUIsT0FBTyxHQUFHa0IsU0FBUzs7VUFFMUI7UUFBTSxDQUFFOztRQUVSLEtBQU0sR0FBRyxFQUNULEtBQU8sU0FBQW5oQyxFQUFDMCtCLE1BQU0sRUFBRThCLHdCQUF3QixFQUFFQyxnQ0FBbUIsRUFBSztVQUlsRTtBQUNBO0FBQ0E7O1VBRUEsSUFBSThGLEdBQUcsR0FBRzlGLGdDQUFtQixDQUFDLEdBQUcsQ0FBQztVQUNsQyxJQUFJK0YsVUFBVSxHQUFHL0YsZ0NBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMrRixVQUFVO1VBQ3BELElBQUlDLFFBQVEsR0FBR2hHLGdDQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDZ0csUUFBUTtVQUNoRCxJQUFJQyxNQUFNLEdBQUdqRyxnQ0FBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQ1MsVUFBVSxDQUFDd0YsTUFBTTtVQUN2RCxJQUFJQyxVQUFVLEdBQUdsRyxnQ0FBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQ1MsVUFBVSxDQUFDeUYsVUFBVTtVQUMvRCxJQUFJQyxlQUFlLEdBQUduRyxnQ0FBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQ1MsVUFBVSxDQUFDMEYsZUFBZTtVQUN6RSxJQUFJQyxpQkFBaUIsR0FBR3BHLGdDQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDUyxVQUFVLENBQUMyRixpQkFBaUI7VUFDN0UsSUFBSUMsYUFBYSxHQUFHckcsZ0NBQW1CLENBQUMsR0FBRyxDQUFDLENBQUNxRyxhQUFhOztVQUUxRDtVQUNBLElBQUlDLFVBQVUsR0FBRyxTQUFTQSxVQUFVQSxDQUFDM3lCLE9BQU8sRUFBRTR5QixjQUFjLEVBQUU7WUFFNUQsSUFBSWxpQixFQUFFLEdBQUcxUSxPQUFPLENBQUMwUSxFQUFFO1lBQ25CLElBQUkyYyxJQUFJLEdBQUdydEIsT0FBTyxDQUFDcXRCLElBQUk7WUFDdkIsSUFBSXpjLEtBQUssR0FBR3ljLElBQUksQ0FBQ3pjLEtBQUssQ0FBQyxDQUFDO1lBQ3hCLElBQUk4QyxLQUFLLEdBQUcyWixJQUFJLENBQUMzWixLQUFLLENBQUMsQ0FBQztZQUV4QixJQUFJa2MsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUN4QixJQUFJSyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUlJLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDcEIsSUFBSXdDLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFFbEIsSUFBSTd5QixPQUFPLENBQUM4eUIsU0FBUyxFQUFFO2NBQ3JCbEQsV0FBVyxHQUFHZ0QsY0FBYyxDQUFDLGFBQWEsQ0FBQztjQUMzQzNDLE9BQU8sR0FBRzJDLGNBQWMsQ0FBQyxTQUFTLENBQUM7Y0FDbkN2QyxPQUFPLEdBQUd1QyxjQUFjLENBQUMsU0FBUyxDQUFDO1lBQ3JDO1lBRUEsSUFBSUcsSUFBSSxHQUFHLFNBQVNBLElBQUlBLENBQUN4bUQsRUFBRSxFQUFFO2NBQzNCLE9BQU8sT0FBT0EsRUFBRSxLQUFLLFVBQVU7WUFDakMsQ0FBQztZQUVELElBQUl5bUQsS0FBSyxHQUFHLFNBQVNBLEtBQUtBLENBQUNDLEdBQUcsRUFBRTlGLEdBQUcsRUFBRTtjQUNuQyxJQUFJNEYsSUFBSSxDQUFDRSxHQUFHLENBQUMsRUFBRTtnQkFDYixPQUFPQSxHQUFHLENBQUM5RixHQUFHLENBQUM7Y0FDakIsQ0FBQyxNQUFNO2dCQUNMLE9BQU84RixHQUFHO2NBQ1o7WUFDRixDQUFDOztZQUVEOztZQUVBLElBQUlqQixzQkFBc0IsR0FBR0csR0FBRyxDQUFDSiwwQkFBMEIsQ0FBQ3JoQixFQUFFLEVBQUUyYyxJQUFJLENBQUM7O1lBRXJFO1lBQ0EsSUFBSTZGLG1CQUFtQixHQUFHLFNBQVNBLG1CQUFtQkEsQ0FBQ3JtQixNQUFNLEVBQUU3eUIsUUFBUSxFQUFFaEssTUFBTSxFQUFFZ3dCLE9BQU8sRUFBRTtjQUN4RixJQUFJNnVCLElBQUksR0FBRzcwQyxRQUFRLENBQUMzUCxNQUFNO2NBQzFCLEtBQUssSUFBSXBFLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRzRvRCxJQUFJLEVBQUU1b0QsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdCLElBQUlrdEQsUUFBUSxHQUFHbjVDLFFBQVEsQ0FBQy9ULENBQUMsQ0FBQztnQkFDMUIsSUFBSW10RCxvQkFBb0IsR0FBRyxJQUFJO2dCQUMvQixJQUFJRCxRQUFRLENBQUNqeEMsWUFBWSxDQUFDOHZDLHNCQUFzQixDQUFDLENBQUMzbkQsTUFBTSxJQUFJLENBQUMsRUFBRTtrQkFDN0Qrb0Qsb0JBQW9CLEdBQUdELFFBQVEsQ0FBQ241QyxRQUFRLENBQUMsQ0FBQztnQkFDNUM7Z0JBQ0EsSUFBSXE1QyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUVwQixJQUFJQyxVQUFVLEdBQUdILFFBQVEsQ0FBQ0ksZ0JBQWdCLENBQUM7a0JBQ3pDQywyQkFBMkIsRUFBRXh6QixPQUFPLENBQUN3ekI7Z0JBQ3ZDLENBQUMsQ0FBQztnQkFFRixJQUFJTCxRQUFRLENBQUNNLFVBQVUsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJTixRQUFRLENBQUNPLFdBQVcsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFO2tCQUNuRSxJQUFJMXpCLE9BQU8sQ0FBQzh5QixTQUFTLEVBQUU7b0JBQ3JCLElBQUksQ0FBQ0ssUUFBUSxDQUFDUSxRQUFRLENBQUMsQ0FBQyxFQUFFO3NCQUN4Qk4sT0FBTyxHQUFHeG1CLE1BQU0sQ0FBQy8xQixHQUFHLENBQUMsSUFBSXU3QyxRQUFRLENBQUNyaUQsTUFBTSxDQUFDNGpELFlBQVksRUFBRSxJQUFJdEIsTUFBTSxDQUFDckMsT0FBTyxDQUFDTCxXQUFXLENBQUNsdkMsR0FBRyxDQUFDeXlDLFFBQVEsQ0FBQ2o1QyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR281QyxVQUFVLENBQUNwRCxDQUFDLEdBQUcsQ0FBQyxFQUFFRyxPQUFPLENBQUNULFdBQVcsQ0FBQ2x2QyxHQUFHLENBQUN5eUMsUUFBUSxDQUFDajVDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHbzVDLFVBQVUsQ0FBQ2hzRCxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSWlyRCxVQUFVLENBQUNzQixVQUFVLENBQUNQLFVBQVUsQ0FBQ3BELENBQUMsQ0FBQyxFQUFFMkQsVUFBVSxDQUFDUCxVQUFVLENBQUNoc0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNqUSxDQUFDLE1BQU07c0JBQ0wsSUFBSXdzRCxVQUFVLEdBQUczQixHQUFHLENBQUNuQixlQUFlLENBQUNtQyxRQUFRLEVBQUVsRCxPQUFPLEVBQUVJLE9BQU8sRUFBRVQsV0FBVyxDQUFDO3NCQUM3RSxJQUFJdUQsUUFBUSxDQUFDanhDLFlBQVksQ0FBQzh2QyxzQkFBc0IsQ0FBQyxDQUFDM25ELE1BQU0sSUFBSSxDQUFDLEVBQUU7d0JBQzdEZ3BELE9BQU8sR0FBR3htQixNQUFNLENBQUMvMUIsR0FBRyxDQUFDLElBQUl1N0MsUUFBUSxDQUFDcmlELE1BQU0sQ0FBQzRqRCxZQUFZLEVBQUUsSUFBSXRCLE1BQU0sQ0FBQ3dCLFVBQVUsQ0FBQ2pDLFFBQVEsRUFBRWlDLFVBQVUsQ0FBQ2hDLFFBQVEsQ0FBQyxFQUFFLElBQUlTLFVBQVUsQ0FBQ3VCLFVBQVUsQ0FBQzloQixLQUFLLEVBQUU4aEIsVUFBVSxDQUFDN2hCLE1BQU0sQ0FBQyxDQUFDLENBQUM7c0JBQ3BLLENBQUMsTUFBTTt3QkFDTDt3QkFDQW9oQixPQUFPLEdBQUd4bUIsTUFBTSxDQUFDLzFCLEdBQUcsQ0FBQyxJQUFJdTdDLFFBQVEsQ0FBQ3JpRCxNQUFNLENBQUM0akQsWUFBWSxFQUFFLElBQUl0QixNQUFNLENBQUN3QixVQUFVLENBQUNqQyxRQUFRLEVBQUVpQyxVQUFVLENBQUNoQyxRQUFRLENBQUMsRUFBRSxJQUFJUyxVQUFVLENBQUNzQixVQUFVLENBQUNQLFVBQVUsQ0FBQ3BELENBQUMsQ0FBQyxFQUFFMkQsVUFBVSxDQUFDUCxVQUFVLENBQUNoc0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3NCQUNuTDtvQkFDRjtrQkFDRixDQUFDLE1BQU07b0JBQ0wrckQsT0FBTyxHQUFHeG1CLE1BQU0sQ0FBQy8xQixHQUFHLENBQUMsSUFBSXU3QyxRQUFRLENBQUNyaUQsTUFBTSxDQUFDNGpELFlBQVksRUFBRSxJQUFJdEIsTUFBTSxDQUFDYSxRQUFRLENBQUNyaUIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHd2lCLFVBQVUsQ0FBQ3BELENBQUMsR0FBRyxDQUFDLEVBQUVpRCxRQUFRLENBQUNyaUIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHd2lCLFVBQVUsQ0FBQ2hzRCxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSWlyRCxVQUFVLENBQUNzQixVQUFVLENBQUNQLFVBQVUsQ0FBQ3BELENBQUMsQ0FBQyxFQUFFMkQsVUFBVSxDQUFDUCxVQUFVLENBQUNoc0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2tCQUMvTjtnQkFDRixDQUFDLE1BQU07a0JBQ0wrckQsT0FBTyxHQUFHeG1CLE1BQU0sQ0FBQy8xQixHQUFHLENBQUMsSUFBSXU3QyxRQUFRLENBQUMsSUFBSSxDQUFDdUIsWUFBWSxDQUFDLENBQUM7Z0JBQ3ZEO2dCQUNBO2dCQUNBUCxPQUFPLENBQUNuNUMsRUFBRSxHQUFHaTVDLFFBQVEsQ0FBQ3ptQyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUNoQzJtQyxPQUFPLENBQUNVLGFBQWEsR0FBR2YsS0FBSyxDQUFDaHpCLE9BQU8sQ0FBQyt6QixhQUFhLEVBQUVaLFFBQVEsQ0FBQztnQkFDOUQ7Z0JBQ0FFLE9BQU8sQ0FBQ1csV0FBVyxHQUFHQyxRQUFRLENBQUNkLFFBQVEsQ0FBQ2pCLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDdkRtQixPQUFPLENBQUNhLFVBQVUsR0FBR0QsUUFBUSxDQUFDZCxRQUFRLENBQUNqQixHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3REbUIsT0FBTyxDQUFDYyxZQUFZLEdBQUdGLFFBQVEsQ0FBQ2QsUUFBUSxDQUFDakIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN4RG1CLE9BQU8sQ0FBQ2UsYUFBYSxHQUFHSCxRQUFRLENBQUNkLFFBQVEsQ0FBQ2pCLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQzs7Z0JBRXpEO2dCQUNBO2dCQUNBO2dCQUNBLElBQUlseUIsT0FBTyxDQUFDd3pCLDJCQUEyQixFQUFFO2tCQUN2Q0gsT0FBTyxDQUFDZ0IsVUFBVSxHQUFHbEIsUUFBUSxDQUFDcEQsV0FBVyxDQUFDO29CQUFFdUUsYUFBYSxFQUFFLElBQUk7b0JBQUVDLFlBQVksRUFBRSxLQUFLO29CQUFFQyxlQUFlLEVBQUU7a0JBQU0sQ0FBQyxDQUFDLENBQUN0RSxDQUFDO2tCQUNqSG1ELE9BQU8sQ0FBQ29CLFdBQVcsR0FBR3RCLFFBQVEsQ0FBQ3BELFdBQVcsQ0FBQztvQkFBRXVFLGFBQWEsRUFBRSxJQUFJO29CQUFFQyxZQUFZLEVBQUUsS0FBSztvQkFBRUMsZUFBZSxFQUFFO2tCQUFNLENBQUMsQ0FBQyxDQUFDbHRELENBQUM7a0JBQ2xIK3JELE9BQU8sQ0FBQ3FCLGdCQUFnQixHQUFHdkIsUUFBUSxDQUFDakIsR0FBRyxDQUFDLGFBQWEsQ0FBQztrQkFDdERtQixPQUFPLENBQUNzQixrQkFBa0IsR0FBR3hCLFFBQVEsQ0FBQ2pCLEdBQUcsQ0FBQyxhQUFhLENBQUM7Z0JBQzFEOztnQkFFQTtnQkFDQVcsU0FBUyxDQUFDTSxRQUFRLENBQUN6bUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcybUMsT0FBTztnQkFFeEMsSUFBSWpwRCxLQUFLLENBQUNpcEQsT0FBTyxDQUFDdUIsSUFBSSxDQUFDcEUsQ0FBQyxDQUFDLEVBQUU7a0JBQ3pCNkMsT0FBTyxDQUFDdUIsSUFBSSxDQUFDcEUsQ0FBQyxHQUFHLENBQUM7Z0JBQ3BCO2dCQUVBLElBQUlwbUQsS0FBSyxDQUFDaXBELE9BQU8sQ0FBQ3VCLElBQUksQ0FBQ2x0RCxDQUFDLENBQUMsRUFBRTtrQkFDekIyckQsT0FBTyxDQUFDdUIsSUFBSSxDQUFDbHRELENBQUMsR0FBRyxDQUFDO2dCQUNwQjtnQkFFQSxJQUFJMHJELG9CQUFvQixJQUFJLElBQUksSUFBSUEsb0JBQW9CLENBQUMvb0QsTUFBTSxHQUFHLENBQUMsRUFBRTtrQkFDbkUsSUFBSXdxRCxXQUFXLEdBQUcsS0FBSyxDQUFDO2tCQUN4QkEsV0FBVyxHQUFHN2tELE1BQU0sQ0FBQzhrRCxlQUFlLENBQUMsQ0FBQyxDQUFDaCtDLEdBQUcsQ0FBQzlHLE1BQU0sQ0FBQytrRCxRQUFRLENBQUMsQ0FBQyxFQUFFMUIsT0FBTyxDQUFDO2tCQUN0RUgsbUJBQW1CLENBQUMyQixXQUFXLEVBQUV6QixvQkFBb0IsRUFBRXBqRCxNQUFNLEVBQUVnd0IsT0FBTyxDQUFDO2dCQUN6RTtjQUNGO1lBQ0YsQ0FBQzs7WUFFRDtZQUNBLElBQUlnMUIsWUFBWSxHQUFHLFNBQVNBLFlBQVlBLENBQUNobEQsTUFBTSxFQUFFaWxELEVBQUUsRUFBRXZoQixLQUFLLEVBQUU7Y0FDMUQsSUFBSXdoQixnQkFBZ0IsR0FBRyxDQUFDO2NBQ3hCLElBQUlDLFNBQVMsR0FBRyxDQUFDO2NBQ2pCLEtBQUssSUFBSWx2RCxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUd5dEMsS0FBSyxDQUFDcnBDLE1BQU0sRUFBRXBFLENBQUMsRUFBRSxFQUFFO2dCQUNyQyxJQUFJbXZELElBQUksR0FBRzFoQixLQUFLLENBQUN6dEMsQ0FBQyxDQUFDO2dCQUNuQixJQUFJb3ZELFVBQVUsR0FBR3hDLFNBQVMsQ0FBQ3VDLElBQUksQ0FBQzFvQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQy9DLElBQUk0b0MsVUFBVSxHQUFHekMsU0FBUyxDQUFDdUMsSUFBSSxDQUFDMW9DLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDL0MsSUFBSTJvQyxVQUFVLElBQUlDLFVBQVUsSUFBSUQsVUFBVSxLQUFLQyxVQUFVLElBQUlELFVBQVUsQ0FBQ0UsZUFBZSxDQUFDRCxVQUFVLENBQUMsQ0FBQ2pyRCxNQUFNLElBQUksQ0FBQyxFQUFFO2tCQUMvRyxJQUFJbXJELEVBQUUsR0FBR1AsRUFBRSxDQUFDbitDLEdBQUcsQ0FBQzlHLE1BQU0sQ0FBQ3lsRCxPQUFPLENBQUMsQ0FBQyxFQUFFSixVQUFVLEVBQUVDLFVBQVUsQ0FBQztrQkFDekRFLEVBQUUsQ0FBQ3Q3QyxFQUFFLEdBQUdrN0MsSUFBSSxDQUFDbDdDLEVBQUUsQ0FBQyxDQUFDO2tCQUNqQnM3QyxFQUFFLENBQUNFLFdBQVcsR0FBRzFDLEtBQUssQ0FBQ2h6QixPQUFPLENBQUMyMUIsZUFBZSxFQUFFUCxJQUFJLENBQUM7a0JBQ3JESSxFQUFFLENBQUNJLGNBQWMsR0FBRzVDLEtBQUssQ0FBQ2h6QixPQUFPLENBQUM0MUIsY0FBYyxFQUFFUixJQUFJLENBQUM7a0JBQ3ZERixnQkFBZ0IsSUFBSU0sRUFBRSxDQUFDRSxXQUFXO2tCQUNsQ1AsU0FBUyxFQUFFO2dCQUNiO2NBQ0Y7Y0FDQTtjQUNBO2NBQ0EsSUFBSW4xQixPQUFPLENBQUMyMUIsZUFBZSxJQUFJLElBQUksRUFBRTtnQkFDbkMsSUFBSVIsU0FBUyxHQUFHLENBQUMsRUFBRXpDLGFBQWEsQ0FBQ21ELG1CQUFtQixHQUFHcEQsaUJBQWlCLENBQUNvRCxtQkFBbUIsR0FBR1gsZ0JBQWdCLEdBQUdDLFNBQVMsQ0FBQyxLQUFLLElBQUksQ0FBQ3BDLElBQUksQ0FBQy95QixPQUFPLENBQUMyMUIsZUFBZSxDQUFDO2tCQUFFO2tCQUNuS2pELGFBQWEsQ0FBQ21ELG1CQUFtQixHQUFHcEQsaUJBQWlCLENBQUNvRCxtQkFBbUIsR0FBRzcxQixPQUFPLENBQUMyMUIsZUFBZSxDQUFDO2tCQUFLO2tCQUN6R2pELGFBQWEsQ0FBQ21ELG1CQUFtQixHQUFHcEQsaUJBQWlCLENBQUNvRCxtQkFBbUIsR0FBRyxFQUFFO2dCQUNoRjtnQkFDQW5ELGFBQWEsQ0FBQ29ELGtCQUFrQixHQUFHckQsaUJBQWlCLENBQUNxRCxrQkFBa0IsR0FBR3JELGlCQUFpQixDQUFDb0QsbUJBQW1CLEdBQUcsSUFBSTtnQkFDdEhuRCxhQUFhLENBQUNxRCx5QkFBeUIsR0FBR3RELGlCQUFpQixDQUFDb0QsbUJBQW1CO2NBQ2pGO1lBQ0YsQ0FBQzs7WUFFRDtZQUNBLElBQUlHLGtCQUFrQixHQUFHLFNBQVNBLGtCQUFrQkEsQ0FBQ2htRCxNQUFNLEVBQUVnd0IsT0FBTyxFQUFFO2NBQ3BFO2NBQ0EsSUFBSUEsT0FBTyxDQUFDaXZCLG1CQUFtQixFQUFFO2dCQUMvQmovQyxNQUFNLENBQUNpbUQsV0FBVyxDQUFDLHFCQUFxQixDQUFDLEdBQUdqMkIsT0FBTyxDQUFDaXZCLG1CQUFtQjtjQUN6RTtjQUNBO2NBQ0EsSUFBSWp2QixPQUFPLENBQUNrMkIsbUJBQW1CLEVBQUU7Z0JBQy9CbG1ELE1BQU0sQ0FBQ2ltRCxXQUFXLENBQUMscUJBQXFCLENBQUMsR0FBR2oyQixPQUFPLENBQUNrMkIsbUJBQW1CO2NBQ3pFO2NBQ0E7Y0FDQSxJQUFJbDJCLE9BQU8sQ0FBQ20yQiwyQkFBMkIsRUFBRTtnQkFDdkNubUQsTUFBTSxDQUFDaW1ELFdBQVcsQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHajJCLE9BQU8sQ0FBQ20yQiwyQkFBMkI7Y0FDekY7WUFDRixDQUFDOztZQUVEO1lBQ0EsSUFBSW4yQixPQUFPLENBQUNvMkIsYUFBYSxJQUFJLElBQUksRUFBRTFELGFBQWEsQ0FBQzJELGtDQUFrQyxHQUFHNUQsaUJBQWlCLENBQUM0RCxrQ0FBa0MsR0FBR3IyQixPQUFPLENBQUNvMkIsYUFBYTtZQUNsSyxJQUFJcDJCLE9BQU8sQ0FBQ3MyQixPQUFPLElBQUksSUFBSSxFQUFFNUQsYUFBYSxDQUFDNkQsd0JBQXdCLEdBQUc5RCxpQkFBaUIsQ0FBQzhELHdCQUF3QixHQUFHdjJCLE9BQU8sQ0FBQ3MyQixPQUFPO1lBQ2xJLElBQUl0MkIsT0FBTyxDQUFDdzJCLE9BQU8sSUFBSSxJQUFJLEVBQUU5RCxhQUFhLENBQUMrRCxjQUFjLEdBQUdoRSxpQkFBaUIsQ0FBQ2dFLGNBQWMsR0FBR3oyQixPQUFPLENBQUN3MkIsT0FBTztZQUM5RyxJQUFJeDJCLE9BQU8sQ0FBQzAyQixZQUFZLElBQUksSUFBSSxFQUFFaEUsYUFBYSxDQUFDaUUsNEJBQTRCLEdBQUdsRSxpQkFBaUIsQ0FBQ2tFLDRCQUE0QixHQUFHMzJCLE9BQU8sQ0FBQzAyQixZQUFZO1lBQ3BKLElBQUkxMkIsT0FBTyxDQUFDNDJCLGVBQWUsSUFBSSxJQUFJLEVBQUVsRSxhQUFhLENBQUNtRSxpQ0FBaUMsR0FBR3BFLGlCQUFpQixDQUFDb0UsaUNBQWlDLEdBQUc3MkIsT0FBTyxDQUFDNDJCLGVBQWU7WUFDcEssSUFBSTUyQixPQUFPLENBQUM4MkIsb0JBQW9CLElBQUksSUFBSSxFQUFFcEUsYUFBYSxDQUFDcUUscUNBQXFDLEdBQUd0RSxpQkFBaUIsQ0FBQ3NFLHFDQUFxQyxHQUFHLzJCLE9BQU8sQ0FBQzgyQixvQkFBb0I7WUFDdEwsSUFBSTkyQixPQUFPLENBQUNnM0IsMEJBQTBCLElBQUksSUFBSSxFQUFFdEUsYUFBYSxDQUFDdUUsa0NBQWtDLEdBQUd4RSxpQkFBaUIsQ0FBQ3dFLGtDQUFrQyxHQUFHajNCLE9BQU8sQ0FBQ2czQiwwQkFBMEI7WUFFNUwsSUFBSWgzQixPQUFPLENBQUNrM0IsZUFBZSxJQUFJLElBQUksRUFBRXhFLGFBQWEsQ0FBQ3lFLGlCQUFpQixHQUFHbjNCLE9BQU8sQ0FBQ2szQixlQUFlO1lBRTlGLElBQUlsM0IsT0FBTyxDQUFDd3ZCLE9BQU8sSUFBSSxPQUFPLEVBQUVnRCxlQUFlLENBQUM0RSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEtBQUs1RSxlQUFlLENBQUM0RSxPQUFPLEdBQUcsQ0FBQztZQUU1RjFFLGFBQWEsQ0FBQzJFLDhCQUE4QixHQUFHNUUsaUJBQWlCLENBQUM0RSw4QkFBOEIsR0FBRzdFLGVBQWUsQ0FBQzZFLDhCQUE4QixHQUFHcjNCLE9BQU8sQ0FBQ3d6QiwyQkFBMkI7WUFDdExkLGFBQWEsQ0FBQzRFLG1CQUFtQixHQUFHN0UsaUJBQWlCLENBQUM2RSxtQkFBbUIsR0FBRzlFLGVBQWUsQ0FBQzhFLG1CQUFtQixHQUFHLENBQUN0M0IsT0FBTyxDQUFDOHlCLFNBQVM7WUFDcElKLGFBQWEsQ0FBQzZFLE9BQU8sR0FBRzlFLGlCQUFpQixDQUFDOEUsT0FBTyxHQUFHL0UsZUFBZSxDQUFDK0UsT0FBTyxHQUFHdjNCLE9BQU8sQ0FBQzJPLE9BQU87WUFDN0YrakIsYUFBYSxDQUFDOEUsSUFBSSxHQUFHeDNCLE9BQU8sQ0FBQ3kzQixJQUFJO1lBQ2pDL0UsYUFBYSxDQUFDZ0YsdUJBQXVCLEdBQUcsT0FBTzEzQixPQUFPLENBQUMyM0IscUJBQXFCLEtBQUssVUFBVSxHQUFHMzNCLE9BQU8sQ0FBQzIzQixxQkFBcUIsQ0FBQ3R3RCxJQUFJLENBQUMsQ0FBQyxHQUFHMjRCLE9BQU8sQ0FBQzIzQixxQkFBcUI7WUFDbEtqRixhQUFhLENBQUNrRix5QkFBeUIsR0FBRyxPQUFPNTNCLE9BQU8sQ0FBQzYzQix1QkFBdUIsS0FBSyxVQUFVLEdBQUc3M0IsT0FBTyxDQUFDNjNCLHVCQUF1QixDQUFDeHdELElBQUksQ0FBQyxDQUFDLEdBQUcyNEIsT0FBTyxDQUFDNjNCLHVCQUF1QjtZQUUxS25GLGFBQWEsQ0FBQzRFLG1CQUFtQixHQUFHN0UsaUJBQWlCLENBQUM2RSxtQkFBbUIsR0FBRzlFLGVBQWUsQ0FBQzhFLG1CQUFtQixHQUFHLElBQUk7WUFDdEg1RSxhQUFhLENBQUNvRixnQkFBZ0IsR0FBRyxDQUFDOTNCLE9BQU8sQ0FBQzh5QixTQUFTO1lBQ25ETixlQUFlLENBQUN1RiwrQkFBK0IsR0FBRy8zQixPQUFPLENBQUNnNEIscUJBQXFCOztZQUUvRTtZQUNBLElBQUloNEIsT0FBTyxDQUFDaTRCLElBQUksSUFBSSxhQUFhLEVBQUU7Y0FDakN2RixhQUFhLENBQUN3RixnQ0FBZ0MsR0FBRyxJQUFJO2NBQ3JEeEYsYUFBYSxDQUFDeUYsbUJBQW1CLEdBQUcsS0FBSztjQUN6Q3pGLGFBQWEsQ0FBQzBGLFlBQVksR0FBRyxLQUFLO1lBQ3BDO1lBQ0EsSUFBSXA0QixPQUFPLENBQUNpNEIsSUFBSSxJQUFJLFVBQVUsRUFBRTtjQUM5QnZGLGFBQWEsQ0FBQ3dGLGdDQUFnQyxHQUFHLEtBQUs7Y0FDdER4RixhQUFhLENBQUN5RixtQkFBbUIsR0FBRyxJQUFJO2NBQ3hDekYsYUFBYSxDQUFDMEYsWUFBWSxHQUFHLEtBQUs7WUFDcEM7WUFDQSxJQUFJcDRCLE9BQU8sQ0FBQ2k0QixJQUFJLElBQUksTUFBTSxFQUFFO2NBQzFCdkYsYUFBYSxDQUFDd0YsZ0NBQWdDLEdBQUcsS0FBSztjQUN0RHhGLGFBQWEsQ0FBQ3lGLG1CQUFtQixHQUFHLEtBQUs7Y0FDekN6RixhQUFhLENBQUMwRixZQUFZLEdBQUcsSUFBSTtZQUNuQztZQUNBLElBQUlwNEIsT0FBTyxDQUFDaTRCLElBQUksSUFBSSxLQUFLLEVBQUU7Y0FDekIsSUFBSWo0QixPQUFPLENBQUM4eUIsU0FBUyxFQUFFSixhQUFhLENBQUN3RixnQ0FBZ0MsR0FBRyxJQUFJLENBQUMsS0FBS3hGLGFBQWEsQ0FBQ3dGLGdDQUFnQyxHQUFHLEtBQUs7Y0FDeEl4RixhQUFhLENBQUN5RixtQkFBbUIsR0FBRyxJQUFJO2NBQ3hDekYsYUFBYSxDQUFDMEYsWUFBWSxHQUFHLElBQUk7WUFDbkM7WUFFQSxJQUFJcDRCLE9BQU8sQ0FBQ2l2QixtQkFBbUIsSUFBSWp2QixPQUFPLENBQUNrMkIsbUJBQW1CLElBQUlsMkIsT0FBTyxDQUFDbTJCLDJCQUEyQixFQUFFO2NBQ3JHekQsYUFBYSxDQUFDMkYsNkJBQTZCLEdBQUcsS0FBSztZQUNyRCxDQUFDLE1BQU07Y0FDTDNGLGFBQWEsQ0FBQzJGLDZCQUE2QixHQUFHLElBQUk7WUFDcEQ7WUFFQSxJQUFJMUYsVUFBVSxHQUFHLElBQUlQLFVBQVUsQ0FBQyxDQUFDO1lBQ2pDLElBQUk2QyxFQUFFLEdBQUd0QyxVQUFVLENBQUMyRixlQUFlLENBQUMsQ0FBQztZQUVyQ3BGLG1CQUFtQixDQUFDK0IsRUFBRSxDQUFDc0QsT0FBTyxDQUFDLENBQUMsRUFBRXBHLEdBQUcsQ0FBQ25GLGVBQWUsQ0FBQ3BjLEtBQUssQ0FBQyxFQUFFK2hCLFVBQVUsRUFBRTN5QixPQUFPLENBQUM7WUFDbEZnMUIsWUFBWSxDQUFDckMsVUFBVSxFQUFFc0MsRUFBRSxFQUFFdmhCLEtBQUssQ0FBQztZQUNuQ3NpQixrQkFBa0IsQ0FBQ3JELFVBQVUsRUFBRTN5QixPQUFPLENBQUM7WUFFdkMyeUIsVUFBVSxDQUFDNkYsU0FBUyxDQUFDLENBQUM7WUFFdEIsT0FBTzNGLFNBQVM7VUFDbEIsQ0FBQztVQUVEdkksTUFBTSxDQUFDdUIsT0FBTyxHQUFHO1lBQUU4RyxVQUFVLEVBQUVBO1VBQVcsQ0FBQzs7VUFFM0M7UUFBTSxDQUFFOztRQUVSLEtBQU0sR0FBRyxFQUNULEtBQU8sU0FBQS9tQyxFQUFDMCtCLE1BQU0sRUFBRThCLHdCQUF3QixFQUFFQyxnQ0FBbUIsRUFBSztVQUlsRSxJQUFJdDNDLFlBQVksR0FBRyxZQUFZO1lBQUUsU0FBU3FNLGdCQUFnQkEsQ0FBQzJoQixNQUFNLEVBQUVwekIsS0FBSyxFQUFFO2NBQUUsS0FBSyxJQUFJMUosQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHMEosS0FBSyxDQUFDdEYsTUFBTSxFQUFFcEUsQ0FBQyxFQUFFLEVBQUU7Z0JBQUUsSUFBSXd5RCxVQUFVLEdBQUc5b0QsS0FBSyxDQUFDMUosQ0FBQyxDQUFDO2dCQUFFd3lELFVBQVUsQ0FBQy94RCxVQUFVLEdBQUcreEQsVUFBVSxDQUFDL3hELFVBQVUsSUFBSSxLQUFLO2dCQUFFK3hELFVBQVUsQ0FBQzl4RCxZQUFZLEdBQUcsSUFBSTtnQkFBRSxJQUFJLE9BQU8sSUFBSTh4RCxVQUFVLEVBQUVBLFVBQVUsQ0FBQzd4RCxRQUFRLEdBQUcsSUFBSTtnQkFBRWxCLE1BQU0sQ0FBQ0ssY0FBYyxDQUFDZzlCLE1BQU0sRUFBRTAxQixVQUFVLENBQUN0c0QsR0FBRyxFQUFFc3NELFVBQVUsQ0FBQztjQUFFO1lBQUU7WUFBRSxPQUFPLFVBQVVDLFdBQVcsRUFBRUMsVUFBVSxFQUFFQyxXQUFXLEVBQUU7Y0FBRSxJQUFJRCxVQUFVLEVBQUV2M0MsZ0JBQWdCLENBQUNzM0MsV0FBVyxDQUFDL3lELFNBQVMsRUFBRWd6RCxVQUFVLENBQUM7Y0FBRSxJQUFJQyxXQUFXLEVBQUV4M0MsZ0JBQWdCLENBQUNzM0MsV0FBVyxFQUFFRSxXQUFXLENBQUM7Y0FBRSxPQUFPRixXQUFXO1lBQUUsQ0FBQztVQUFFLENBQUMsQ0FBQyxDQUFDO1VBRW5qQixTQUFTamtELGVBQWVBLENBQUNva0QsUUFBUSxFQUFFSCxXQUFXLEVBQUU7WUFBRSxJQUFJLEVBQUVHLFFBQVEsWUFBWUgsV0FBVyxDQUFDLEVBQUU7Y0FBRSxNQUFNLElBQUlwdkQsU0FBUyxDQUFDLG1DQUFtQyxDQUFDO1lBQUU7VUFBRTs7VUFFeEo7QUFDQTtBQUNBOztVQUVBLElBQUl1MkIsTUFBTSxHQUFHd3NCLGdDQUFtQixDQUFDLEdBQUcsQ0FBQztVQUNyQyxJQUFJOEYsR0FBRyxHQUFHOUYsZ0NBQW1CLENBQUMsR0FBRyxDQUFDO1VBRWxDLElBQUl5TSxRQUFRLEdBQUd6TSxnQ0FBbUIsQ0FBQyxHQUFHLENBQUM7WUFDbkMwTSxjQUFjLEdBQUdELFFBQVEsQ0FBQ0MsY0FBYztVQUU1QyxJQUFJQyxTQUFTLEdBQUczTSxnQ0FBbUIsQ0FBQyxHQUFHLENBQUM7WUFDcENzRyxVQUFVLEdBQUdxRyxTQUFTLENBQUNyRyxVQUFVO1VBRXJDLElBQUlzRyxRQUFRLEdBQUd2ekQsTUFBTSxDQUFDd3pELE1BQU0sQ0FBQztZQUUzQjtZQUNBO1lBQ0E7WUFDQTtZQUNBMUosT0FBTyxFQUFFLFNBQVM7WUFDbEI7WUFDQTtZQUNBc0QsU0FBUyxFQUFFLElBQUk7WUFDZjtZQUNBbmtCLE9BQU8sRUFBRSxJQUFJO1lBQ2I7WUFDQXdxQixpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCO1lBQ0FDLGVBQWUsRUFBRXZzRCxTQUFTO1lBQzFCO1lBQ0Fra0MsR0FBRyxFQUFFLElBQUk7WUFDVDtZQUNBdkMsT0FBTyxFQUFFLEVBQUU7WUFDWDtZQUNBZ2xCLDJCQUEyQixFQUFFLEtBQUs7WUFDbEM7WUFDQXdFLHFCQUFxQixFQUFFLEtBQUs7WUFDNUI7WUFDQXFCLGNBQWMsRUFBRSxJQUFJO1lBQ3BCO1lBQ0FwQixJQUFJLEVBQUUsS0FBSztZQUVYOztZQUVBO1lBQ0FxQixZQUFZLEVBQUUsSUFBSTtZQUNsQjtZQUNBQyxVQUFVLEVBQUUsRUFBRTtZQUNkO1lBQ0FDLGNBQWMsRUFBRSxFQUFFO1lBQ2xCO1lBQ0FDLEtBQUssRUFBRSxTQUFTO1lBRWhCOztZQUVBO1lBQ0ExRixhQUFhLEVBQUUsU0FBU0EsYUFBYUEsQ0FBQ2g0QyxJQUFJLEVBQUU7Y0FDMUMsT0FBTyxJQUFJO1lBQ2IsQ0FBQztZQUNEO1lBQ0E0NUMsZUFBZSxFQUFFLFNBQVNBLGVBQWVBLENBQUNQLElBQUksRUFBRTtjQUM5QyxPQUFPLEVBQUU7WUFDWCxDQUFDO1lBQ0Q7WUFDQVEsY0FBYyxFQUFFLFNBQVNBLGNBQWNBLENBQUNSLElBQUksRUFBRTtjQUM1QyxPQUFPLElBQUk7WUFDYixDQUFDO1lBQ0Q7WUFDQWdCLGFBQWEsRUFBRSxHQUFHO1lBQ2xCO1lBQ0FFLE9BQU8sRUFBRSxJQUFJO1lBQ2I7WUFDQUUsT0FBTyxFQUFFLElBQUk7WUFDYjtZQUNBaUIsSUFBSSxFQUFFLElBQUk7WUFDVjtZQUNBO1lBQ0FQLGVBQWUsRUFBRXJxRCxTQUFTO1lBQzFCO1lBQ0E4cUQscUJBQXFCLEVBQUUsRUFBRTtZQUN6QjtZQUNBRSx1QkFBdUIsRUFBRSxFQUFFO1lBQzNCO1lBQ0FmLG9CQUFvQixFQUFFLEdBQUc7WUFDekI7WUFDQUYsZUFBZSxFQUFFLEdBQUc7WUFDcEI7WUFDQUYsWUFBWSxFQUFFLEdBQUc7WUFDakI7WUFDQU0sMEJBQTBCLEVBQUUsR0FBRztZQUUvQjs7WUFFQTtZQUNBO1lBQ0EvSCxtQkFBbUIsRUFBRXBpRCxTQUFTO1lBQzlCO1lBQ0E7WUFDQXFwRCxtQkFBbUIsRUFBRXJwRCxTQUFTO1lBQzlCO1lBQ0E7WUFDQXNwRCwyQkFBMkIsRUFBRXRwRCxTQUFTO1lBRXRDO1lBQ0FtMkIsS0FBSyxFQUFFLFNBQVNBLEtBQUtBLENBQUEsRUFBRyxDQUFDLENBQUM7WUFBRTtZQUM1QjEzQixJQUFJLEVBQUUsU0FBU0EsSUFBSUEsQ0FBQSxFQUFHLENBQUMsQ0FBQyxDQUFDO1VBQzNCLENBQUMsQ0FBQzs7VUFFRixJQUFJb3VELE1BQU0sR0FBRyxZQUFZO1lBQ3ZCLFNBQVNBLE1BQU1BLENBQUMxNUIsT0FBTyxFQUFFO2NBQ3ZCdnJCLGVBQWUsQ0FBQyxJQUFJLEVBQUVpbEQsTUFBTSxDQUFDO2NBRTdCLElBQUksQ0FBQzE1QixPQUFPLEdBQUdILE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRW81QixRQUFRLEVBQUVqNUIsT0FBTyxDQUFDO1lBQzlDO1lBRUFqckIsWUFBWSxDQUFDMmtELE1BQU0sRUFBRSxDQUFDO2NBQ3BCdnRELEdBQUcsRUFBRSxLQUFLO2NBQ1ZuRyxLQUFLLEVBQUUsU0FBUzJ6RCxHQUFHQSxDQUFBLEVBQUc7Z0JBQ3BCLElBQUkzcEQsTUFBTSxHQUFHLElBQUk7Z0JBQ2pCLElBQUlnd0IsT0FBTyxHQUFHLElBQUksQ0FBQ0EsT0FBTztnQkFDMUIsSUFBSTBRLEVBQUUsR0FBRzFRLE9BQU8sQ0FBQzBRLEVBQUU7Z0JBQ25CLElBQUkyYyxJQUFJLEdBQUdydEIsT0FBTyxDQUFDcXRCLElBQUk7Z0JBRXZCLElBQUl1RixjQUFjLEdBQUcsRUFBRTtnQkFDdkIsSUFBSTNDLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ3BCLElBQUlJLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ3BCLElBQUl1SixVQUFVLEdBQUcsRUFBRTtnQkFDbkIsSUFBSWgrQyxVQUFVLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixJQUFJaStDLGdCQUFnQixHQUFHLEVBQUU7O2dCQUV6QjtnQkFDQSxJQUFJNzVCLE9BQU8sQ0FBQ2l2QixtQkFBbUIsS0FBSyxDQUFDMWhELEtBQUssQ0FBQ0ssT0FBTyxDQUFDb3lCLE9BQU8sQ0FBQ2l2QixtQkFBbUIsQ0FBQyxJQUFJanZCLE9BQU8sQ0FBQ2l2QixtQkFBbUIsQ0FBQzVrRCxNQUFNLElBQUksQ0FBQyxDQUFDLEVBQUU7a0JBQzNIMjFCLE9BQU8sQ0FBQ2l2QixtQkFBbUIsR0FBR3BpRCxTQUFTO2dCQUN6QztnQkFFQSxJQUFJbXpCLE9BQU8sQ0FBQ2syQixtQkFBbUIsRUFBRTtrQkFDL0IsSUFBSWwyQixPQUFPLENBQUNrMkIsbUJBQW1CLENBQUM0RCxRQUFRLEtBQUssQ0FBQ3ZzRCxLQUFLLENBQUNLLE9BQU8sQ0FBQ295QixPQUFPLENBQUNrMkIsbUJBQW1CLENBQUM0RCxRQUFRLENBQUMsSUFBSTk1QixPQUFPLENBQUNrMkIsbUJBQW1CLENBQUM0RCxRQUFRLENBQUN6dkQsTUFBTSxJQUFJLENBQUMsQ0FBQyxFQUFFO29CQUN0SjIxQixPQUFPLENBQUNrMkIsbUJBQW1CLENBQUM0RCxRQUFRLEdBQUdqdEQsU0FBUztrQkFDbEQ7a0JBQ0EsSUFBSW16QixPQUFPLENBQUNrMkIsbUJBQW1CLENBQUM2RCxVQUFVLEtBQUssQ0FBQ3hzRCxLQUFLLENBQUNLLE9BQU8sQ0FBQ295QixPQUFPLENBQUNrMkIsbUJBQW1CLENBQUM2RCxVQUFVLENBQUMsSUFBSS81QixPQUFPLENBQUNrMkIsbUJBQW1CLENBQUM2RCxVQUFVLENBQUMxdkQsTUFBTSxJQUFJLENBQUMsQ0FBQyxFQUFFO29CQUM1SjIxQixPQUFPLENBQUNrMkIsbUJBQW1CLENBQUM2RCxVQUFVLEdBQUdsdEQsU0FBUztrQkFDcEQ7Z0JBQ0Y7Z0JBRUEsSUFBSW16QixPQUFPLENBQUNtMkIsMkJBQTJCLEtBQUssQ0FBQzVvRCxLQUFLLENBQUNLLE9BQU8sQ0FBQ295QixPQUFPLENBQUNtMkIsMkJBQTJCLENBQUMsSUFBSW4yQixPQUFPLENBQUNtMkIsMkJBQTJCLENBQUM5ckQsTUFBTSxJQUFJLENBQUMsQ0FBQyxFQUFFO2tCQUNuSjIxQixPQUFPLENBQUNtMkIsMkJBQTJCLEdBQUd0cEQsU0FBUztnQkFDakQ7O2dCQUVBO2dCQUNBLElBQUltdEQsZUFBZSxHQUFHaDZCLE9BQU8sQ0FBQ2l2QixtQkFBbUIsSUFBSWp2QixPQUFPLENBQUNrMkIsbUJBQW1CLElBQUlsMkIsT0FBTyxDQUFDbTJCLDJCQUEyQjtnQkFDdkgsSUFBSTZELGVBQWUsRUFBRTtrQkFDbkI7a0JBQ0FoNkIsT0FBTyxDQUFDeTNCLElBQUksR0FBRyxLQUFLO2tCQUNwQnozQixPQUFPLENBQUNxNUIsY0FBYyxHQUFHLEtBQUs7Z0JBQ2hDOztnQkFFQTtnQkFDQSxJQUFJWSxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUNwQixJQUFJQyxjQUFjLEdBQUcsS0FBSztnQkFDMUIsSUFBSXhwQixFQUFFLENBQUN5cEIsZUFBZSxJQUFJbjZCLE9BQU8sQ0FBQ3E1QixjQUFjLEVBQUU7a0JBQ2hEWSxPQUFPLEdBQUd2cEIsRUFBRSxDQUFDeXBCLGVBQWUsQ0FBQyxLQUFLLENBQUM7a0JBQ25DLElBQUksQ0FBQ0YsT0FBTyxFQUFFQSxPQUFPLEdBQUd2cEIsRUFBRSxDQUFDeXBCLGVBQWUsQ0FBQyxDQUFDO2tCQUM1Q0QsY0FBYyxHQUFHLElBQUk7Z0JBQ3ZCO2dCQUVBLElBQUk3TSxJQUFJLENBQUN6YyxLQUFLLENBQUMsQ0FBQyxDQUFDdm1DLE1BQU0sR0FBRyxDQUFDLEVBQUU7a0JBQzNCO2tCQUNBLElBQUksQ0FBQzZ2RCxjQUFjLEVBQUU7b0JBQ25CO29CQUNBLElBQUluSyxXQUFXLEdBQUcvdkIsT0FBTyxDQUFDcXRCLElBQUksQ0FBQzBDLFdBQVcsQ0FBQyxDQUFDO29CQUM1QzhKLGdCQUFnQixDQUFDN3ZELElBQUksQ0FBQztzQkFBRXdtRCxDQUFDLEVBQUVULFdBQVcsQ0FBQ3FLLEVBQUUsR0FBR3JLLFdBQVcsQ0FBQ0csQ0FBQyxHQUFHLENBQUM7c0JBQUV4b0QsQ0FBQyxFQUFFcW9ELFdBQVcsQ0FBQ3NLLEVBQUUsR0FBR3RLLFdBQVcsQ0FBQ3pvRCxDQUFDLEdBQUc7b0JBQUUsQ0FBQyxDQUFDO29CQUN2RztvQkFDQSxJQUFJMDRCLE9BQU8sQ0FBQzh5QixTQUFTLEVBQUU7c0JBQ3JCLElBQUlockMsTUFBTSxHQUFHaXhDLGNBQWMsQ0FBQy80QixPQUFPLENBQUM7c0JBQ3BDNHlCLGNBQWMsQ0FBQzVvRCxJQUFJLENBQUM4ZCxNQUFNLENBQUM7b0JBQzdCO29CQUNBO29CQUNBLElBQUlrWSxPQUFPLENBQUN3dkIsT0FBTyxJQUFJLFNBQVMsSUFBSXh2QixPQUFPLENBQUN3dkIsT0FBTyxJQUFJLE9BQU8sRUFBRTtzQkFDOURvSyxVQUFVLENBQUM1dkQsSUFBSSxDQUFDMm9ELFVBQVUsQ0FBQzN5QixPQUFPLEVBQUU0eUIsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7c0JBQ3ZEVCxHQUFHLENBQUNyRCxpQkFBaUIsQ0FBQytLLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFRCxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUU1NUIsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDdEUsQ0FBQyxNQUFNO3NCQUNMbXlCLEdBQUcsQ0FBQ3JELGlCQUFpQixDQUFDK0ssZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUVqSCxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUU1eUIsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDMUU7a0JBQ0YsQ0FBQyxNQUFNO29CQUNMO29CQUNBLElBQUlzdEIsWUFBWSxHQUFHNkUsR0FBRyxDQUFDbkYsZUFBZSxDQUFDaHRCLE9BQU8sQ0FBQ3F0QixJQUFJLENBQUN6YyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUM1RGgxQixVQUFVLEdBQUd1MkMsR0FBRyxDQUFDL0UsaUJBQWlCLENBQUMxYyxFQUFFLEVBQUUxUSxPQUFPLENBQUNxdEIsSUFBSSxFQUFFQyxZQUFZLENBQUM7b0JBQ2xFO29CQUNBMXhDLFVBQVUsQ0FBQ3hULE9BQU8sQ0FBQyxVQUFVNlMsU0FBUyxFQUFFO3NCQUN0QyxJQUFJODBDLFdBQVcsR0FBRzkwQyxTQUFTLENBQUM4MEMsV0FBVyxDQUFDLENBQUM7c0JBQ3pDOEosZ0JBQWdCLENBQUM3dkQsSUFBSSxDQUFDO3dCQUFFd21ELENBQUMsRUFBRVQsV0FBVyxDQUFDcUssRUFBRSxHQUFHckssV0FBVyxDQUFDRyxDQUFDLEdBQUcsQ0FBQzt3QkFBRXhvRCxDQUFDLEVBQUVxb0QsV0FBVyxDQUFDc0ssRUFBRSxHQUFHdEssV0FBVyxDQUFDem9ELENBQUMsR0FBRztzQkFBRSxDQUFDLENBQUM7b0JBQ3pHLENBQUMsQ0FBQzs7b0JBRUY7b0JBQ0EsSUFBSTA0QixPQUFPLENBQUM4eUIsU0FBUyxFQUFFO3NCQUNyQmwzQyxVQUFVLENBQUN4VCxPQUFPLENBQUMsVUFBVTZTLFNBQVMsRUFBRTt3QkFDdEMra0IsT0FBTyxDQUFDcXRCLElBQUksR0FBR3B5QyxTQUFTO3dCQUN4QjIzQyxjQUFjLENBQUM1b0QsSUFBSSxDQUFDK3VELGNBQWMsQ0FBQy80QixPQUFPLENBQUMsQ0FBQztzQkFDOUMsQ0FBQyxDQUFDO29CQUNKO29CQUVBLElBQUlBLE9BQU8sQ0FBQ3d2QixPQUFPLElBQUksU0FBUyxJQUFJeHZCLE9BQU8sQ0FBQ3d2QixPQUFPLElBQUksT0FBTyxFQUFFO3NCQUM5RCxJQUFJOEssY0FBYyxHQUFHNXBCLEVBQUUsQ0FBQytDLFVBQVUsQ0FBQyxDQUFDO3NCQUNwQyxJQUFJelQsT0FBTyxDQUFDeTNCLElBQUksRUFBRTt3QkFDaEI7d0JBQ0EsSUFBSTdILFdBQVcsR0FBRyxJQUFJMkssR0FBRyxDQUFDLENBQUM7d0JBQzNCLElBQUlDLFFBQVEsR0FBRyxFQUFFO3dCQUNqQixJQUFJQyxRQUFRLEdBQUcsRUFBRTt3QkFDakIsSUFBSXh0QixLQUFLLEdBQUcsQ0FBQzt3QkFDYixJQUFJeXRCLGtCQUFrQixHQUFHOzBCQUFFOUssV0FBVyxFQUFFQSxXQUFXOzBCQUFFSyxPQUFPLEVBQUV1SyxRQUFROzBCQUFFbkssT0FBTyxFQUFFb0s7d0JBQVMsQ0FBQzt3QkFDM0YsSUFBSUUsa0JBQWtCLEdBQUcsRUFBRTt3QkFDM0IvK0MsVUFBVSxDQUFDeFQsT0FBTyxDQUFDLFVBQVU2UyxTQUFTLEVBQUV1cEIsS0FBSyxFQUFFOzBCQUM3QyxJQUFJdnBCLFNBQVMsQ0FBQ3k0QixLQUFLLENBQUMsQ0FBQyxDQUFDcnBDLE1BQU0sSUFBSSxDQUFDLEVBQUU7NEJBQ2pDNFEsU0FBUyxDQUFDMjFCLEtBQUssQ0FBQyxDQUFDLENBQUN4b0MsT0FBTyxDQUFDLFVBQVUyVCxJQUFJLEVBQUU5VixDQUFDLEVBQUU7OEJBQzNDcTBELGNBQWMsQ0FBQ3ptQixLQUFLLENBQUM1NEIsU0FBUyxDQUFDMjFCLEtBQUssQ0FBQyxDQUFDLENBQUMzcUMsQ0FBQyxDQUFDLENBQUM7OEJBQzFDLElBQUksQ0FBQzhWLElBQUksQ0FBQzQzQyxRQUFRLENBQUMsQ0FBQyxFQUFFO2dDQUNwQitHLGtCQUFrQixDQUFDOUssV0FBVyxDQUFDdlAsR0FBRyxDQUFDcGxDLFNBQVMsQ0FBQzIxQixLQUFLLENBQUMsQ0FBQyxDQUFDM3FDLENBQUMsQ0FBQyxDQUFDaVUsRUFBRSxDQUFDLENBQUMsRUFBRSt5QixLQUFLLEVBQUUsQ0FBQztnQ0FDdEV5dEIsa0JBQWtCLENBQUN6SyxPQUFPLENBQUNqbUQsSUFBSSxDQUFDaVIsU0FBUyxDQUFDMjFCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNFLFFBQVEsQ0FBQyxDQUFDLENBQUMwZixDQUFDLENBQUM7Z0NBQ2xFa0ssa0JBQWtCLENBQUNySyxPQUFPLENBQUNybUQsSUFBSSxDQUFDaVIsU0FBUyxDQUFDMjFCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNFLFFBQVEsQ0FBQyxDQUFDLENBQUNwcEMsQ0FBQyxDQUFDOzhCQUNwRTs0QkFDRixDQUFDLENBQUM7NEJBQ0ZpekQsa0JBQWtCLENBQUMzd0QsSUFBSSxDQUFDdzZCLEtBQUssQ0FBQzswQkFDaEM7d0JBQ0YsQ0FBQyxDQUFDO3dCQUNGLElBQUk4MUIsY0FBYyxDQUFDandELE1BQU0sR0FBRyxDQUFDLEVBQUU7MEJBQzdCLElBQUl1d0QsWUFBWSxHQUFHTixjQUFjLENBQUN2SyxXQUFXLENBQUMsQ0FBQzswQkFDL0M4SixnQkFBZ0IsQ0FBQzd2RCxJQUFJLENBQUM7NEJBQUV3bUQsQ0FBQyxFQUFFb0ssWUFBWSxDQUFDUixFQUFFLEdBQUdRLFlBQVksQ0FBQzFLLENBQUMsR0FBRyxDQUFDOzRCQUFFeG9ELENBQUMsRUFBRWt6RCxZQUFZLENBQUNQLEVBQUUsR0FBR08sWUFBWSxDQUFDdHpELENBQUMsR0FBRzswQkFBRSxDQUFDLENBQUM7MEJBQzNHc1UsVUFBVSxDQUFDNVIsSUFBSSxDQUFDc3dELGNBQWMsQ0FBQzswQkFDL0IxSCxjQUFjLENBQUM1b0QsSUFBSSxDQUFDMHdELGtCQUFrQixDQUFDOzBCQUN2QyxLQUFLLElBQUl6MEQsQ0FBQyxHQUFHMDBELGtCQUFrQixDQUFDdHdELE1BQU0sR0FBRyxDQUFDLEVBQUVwRSxDQUFDLElBQUksQ0FBQyxFQUFFQSxDQUFDLEVBQUUsRUFBRTs0QkFDdkQyVixVQUFVLENBQUMvRCxNQUFNLENBQUM4aUQsa0JBQWtCLENBQUMxMEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUMzQzJzRCxjQUFjLENBQUMvNkMsTUFBTSxDQUFDOGlELGtCQUFrQixDQUFDMTBELENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzs0QkFDL0M0ekQsZ0JBQWdCLENBQUNoaUQsTUFBTSxDQUFDOGlELGtCQUFrQixDQUFDMTBELENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzswQkFDbkQ7MEJBQUM7d0JBQ0g7c0JBQ0Y7c0JBQ0EyVixVQUFVLENBQUN4VCxPQUFPLENBQUMsVUFBVTZTLFNBQVMsRUFBRXVwQixLQUFLLEVBQUU7d0JBQzdDO3dCQUNBeEUsT0FBTyxDQUFDcXRCLElBQUksR0FBR3B5QyxTQUFTO3dCQUN4QjIrQyxVQUFVLENBQUM1dkQsSUFBSSxDQUFDMm9ELFVBQVUsQ0FBQzN5QixPQUFPLEVBQUU0eUIsY0FBYyxDQUFDcHVCLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQzNEMnRCLEdBQUcsQ0FBQ3JELGlCQUFpQixDQUFDK0ssZ0JBQWdCLENBQUNyMUIsS0FBSyxDQUFDLEVBQUVvMUIsVUFBVSxDQUFDcDFCLEtBQUssQ0FBQyxFQUFFeEUsT0FBTyxDQUFDLENBQUMsQ0FBQztzQkFDOUUsQ0FBQyxDQUFDO29CQUNKLENBQUMsTUFBTTtzQkFDTHBrQixVQUFVLENBQUN4VCxPQUFPLENBQUMsVUFBVTZTLFNBQVMsRUFBRXVwQixLQUFLLEVBQUU7d0JBQzdDMnRCLEdBQUcsQ0FBQ3JELGlCQUFpQixDQUFDK0ssZ0JBQWdCLENBQUNyMUIsS0FBSyxDQUFDLEVBQUVvdUIsY0FBYyxDQUFDcHVCLEtBQUssQ0FBQyxFQUFFeEUsT0FBTyxDQUFDLENBQUMsQ0FBQztzQkFDbEYsQ0FBQyxDQUFDO29CQUNKOztvQkFFQTtvQkFDQSxJQUFJNjZCLG1CQUFtQixHQUFHLElBQUl6M0IsR0FBRyxDQUFDLENBQUM7b0JBQ25DLElBQUl4bkIsVUFBVSxDQUFDdlIsTUFBTSxHQUFHLENBQUMsRUFBRTtzQkFDekIsSUFBSXl3RCxTQUFTLEdBQUcsRUFBRTtzQkFDbEIsSUFBSUMsVUFBVSxHQUFHMU4sSUFBSSxDQUFDOTJDLE1BQU0sQ0FBQyxVQUFVNDJDLEdBQUcsRUFBRTt3QkFDMUMsT0FBT0EsR0FBRyxDQUFDK0UsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLE1BQU07c0JBQ3JDLENBQUMsQ0FBQztzQkFDRnQyQyxVQUFVLENBQUN4VCxPQUFPLENBQUMsVUFBVTZTLFNBQVMsRUFBRXVwQixLQUFLLEVBQUU7d0JBQzdDLElBQUlvckIsV0FBVyxHQUFHLEtBQUssQ0FBQzt3QkFDeEIsSUFBSTV2QixPQUFPLENBQUN3dkIsT0FBTyxJQUFJLE9BQU8sRUFBRTswQkFDOUJJLFdBQVcsR0FBR2dELGNBQWMsQ0FBQ3B1QixLQUFLLENBQUMsQ0FBQ29yQixXQUFXO3dCQUNqRDt3QkFFQSxJQUFJMzBDLFNBQVMsQ0FBQzIxQixLQUFLLENBQUMsQ0FBQyxDQUFDZ2hCLEdBQUcsQ0FBQ21KLFVBQVUsQ0FBQyxDQUFDMXdELE1BQU0sR0FBRyxDQUFDLEVBQUU7MEJBQ2hELElBQUkyd0QsUUFBUSxHQUFHLENBQUMsQ0FBQzswQkFDakJBLFFBQVEsQ0FBQ3RuQixLQUFLLEdBQUcsRUFBRTswQkFDbkJzbkIsUUFBUSxDQUFDcHFCLEtBQUssR0FBRyxFQUFFOzBCQUNuQixJQUFJcXFCLFNBQVMsR0FBRyxLQUFLLENBQUM7MEJBQ3RCaGdELFNBQVMsQ0FBQzIxQixLQUFLLENBQUMsQ0FBQyxDQUFDZ2hCLEdBQUcsQ0FBQ21KLFVBQVUsQ0FBQyxDQUFDM3lELE9BQU8sQ0FBQyxVQUFVMlQsSUFBSSxFQUFFOzRCQUN4RCxJQUFJaWtCLE9BQU8sQ0FBQ3d2QixPQUFPLElBQUksT0FBTyxFQUFFOzhCQUM5QixJQUFJLENBQUN6ekMsSUFBSSxDQUFDNDNDLFFBQVEsQ0FBQyxDQUFDLEVBQUU7Z0NBQ3BCc0gsU0FBUyxHQUFHckwsV0FBVyxDQUFDbHZDLEdBQUcsQ0FBQzNFLElBQUksQ0FBQzdCLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0NBQ3RDOGdELFFBQVEsQ0FBQ3BxQixLQUFLLENBQUM1bUMsSUFBSSxDQUFDO2tDQUFFd21ELENBQUMsRUFBRW9DLGNBQWMsQ0FBQ3B1QixLQUFLLENBQUMsQ0FBQ3lyQixPQUFPLENBQUNnTCxTQUFTLENBQUMsR0FBR2wvQyxJQUFJLENBQUNtL0MsV0FBVyxDQUFDLENBQUMsQ0FBQ2hMLENBQUMsR0FBRyxDQUFDO2tDQUFFeG9ELENBQUMsRUFBRWtyRCxjQUFjLENBQUNwdUIsS0FBSyxDQUFDLENBQUM2ckIsT0FBTyxDQUFDNEssU0FBUyxDQUFDLEdBQUdsL0MsSUFBSSxDQUFDbS9DLFdBQVcsQ0FBQyxDQUFDLENBQUM1ekQsQ0FBQyxHQUFHLENBQUM7a0NBQUUwcUMsS0FBSyxFQUFFajJCLElBQUksQ0FBQ20vQyxXQUFXLENBQUMsQ0FBQyxDQUFDaEwsQ0FBQztrQ0FBRWplLE1BQU0sRUFBRWwyQixJQUFJLENBQUNtL0MsV0FBVyxDQUFDLENBQUMsQ0FBQzV6RDtnQ0FBRSxDQUFDLENBQUM7OEJBQ3BPLENBQUMsTUFBTTtnQ0FDTCxJQUFJd3NELFVBQVUsR0FBRzNCLEdBQUcsQ0FBQ25CLGVBQWUsQ0FBQ2oxQyxJQUFJLEVBQUU2MkMsY0FBYyxDQUFDcHVCLEtBQUssQ0FBQyxDQUFDeXJCLE9BQU8sRUFBRTJDLGNBQWMsQ0FBQ3B1QixLQUFLLENBQUMsQ0FBQzZyQixPQUFPLEVBQUVULFdBQVcsQ0FBQztnQ0FDckhvTCxRQUFRLENBQUNwcUIsS0FBSyxDQUFDNW1DLElBQUksQ0FBQztrQ0FBRXdtRCxDQUFDLEVBQUVzRCxVQUFVLENBQUNqQyxRQUFRO2tDQUFFbnFELENBQUMsRUFBRW9zRCxVQUFVLENBQUNoQyxRQUFRO2tDQUFFOWYsS0FBSyxFQUFFOGhCLFVBQVUsQ0FBQzloQixLQUFLO2tDQUFFQyxNQUFNLEVBQUU2aEIsVUFBVSxDQUFDN2hCO2dDQUFPLENBQUMsQ0FBQzs4QkFDN0g7NEJBQ0YsQ0FBQyxNQUFNOzhCQUNMLElBQUkybkIsVUFBVSxDQUFDcDFCLEtBQUssQ0FBQyxDQUFDem9CLElBQUksQ0FBQzdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQ0FDaEM4Z0QsUUFBUSxDQUFDcHFCLEtBQUssQ0FBQzVtQyxJQUFJLENBQUM7a0NBQUV3bUQsQ0FBQyxFQUFFb0osVUFBVSxDQUFDcDFCLEtBQUssQ0FBQyxDQUFDem9CLElBQUksQ0FBQzdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQ2loRCxPQUFPLENBQUMsQ0FBQztrQ0FBRXp6RCxDQUFDLEVBQUVreUQsVUFBVSxDQUFDcDFCLEtBQUssQ0FBQyxDQUFDem9CLElBQUksQ0FBQzdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQ2toRCxNQUFNLENBQUMsQ0FBQztrQ0FBRXBwQixLQUFLLEVBQUU0bkIsVUFBVSxDQUFDcDFCLEtBQUssQ0FBQyxDQUFDem9CLElBQUksQ0FBQzdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQ21oRCxRQUFRLENBQUMsQ0FBQztrQ0FBRXBwQixNQUFNLEVBQUUybkIsVUFBVSxDQUFDcDFCLEtBQUssQ0FBQyxDQUFDem9CLElBQUksQ0FBQzdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQ29oRCxTQUFTLENBQUM7Z0NBQUUsQ0FBQyxDQUFDOzhCQUNoTjs0QkFDRjswQkFDRixDQUFDLENBQUM7MEJBQ0ZyZ0QsU0FBUyxDQUFDeTRCLEtBQUssQ0FBQyxDQUFDLENBQUN0ckMsT0FBTyxDQUFDLFVBQVVndEQsSUFBSSxFQUFFOzRCQUN4QyxJQUFJcm9CLE1BQU0sR0FBR3FvQixJQUFJLENBQUNyb0IsTUFBTSxDQUFDLENBQUM7NEJBQzFCLElBQUloSyxNQUFNLEdBQUdxeUIsSUFBSSxDQUFDcnlCLE1BQU0sQ0FBQyxDQUFDOzRCQUMxQixJQUFJZ0ssTUFBTSxDQUFDbWxCLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxNQUFNLElBQUludkIsTUFBTSxDQUFDbXZCLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxNQUFNLEVBQUU7OEJBQ3RFLElBQUlseUIsT0FBTyxDQUFDd3ZCLE9BQU8sSUFBSSxPQUFPLEVBQUU7Z0NBQzlCLElBQUkrTCxlQUFlLEdBQUczTCxXQUFXLENBQUNsdkMsR0FBRyxDQUFDcXNCLE1BQU0sQ0FBQzd5QixFQUFFLENBQUMsQ0FBQyxDQUFDO2dDQUNsRCxJQUFJc2hELGVBQWUsR0FBRzVMLFdBQVcsQ0FBQ2x2QyxHQUFHLENBQUNxaUIsTUFBTSxDQUFDN29CLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0NBQ2xELElBQUl1aEQsWUFBWSxHQUFHLEVBQUU7Z0NBQ3JCLElBQUlDLFlBQVksR0FBRyxFQUFFO2dDQUNyQixJQUFJM3VCLE1BQU0sQ0FBQzRtQixRQUFRLENBQUMsQ0FBQyxFQUFFO2tDQUNyQixJQUFJRyxVQUFVLEdBQUczQixHQUFHLENBQUNuQixlQUFlLENBQUNqa0IsTUFBTSxFQUFFNmxCLGNBQWMsQ0FBQ3B1QixLQUFLLENBQUMsQ0FBQ3lyQixPQUFPLEVBQUUyQyxjQUFjLENBQUNwdUIsS0FBSyxDQUFDLENBQUM2ckIsT0FBTyxFQUFFVCxXQUFXLENBQUM7a0NBQ3ZINkwsWUFBWSxDQUFDenhELElBQUksQ0FBQzhwRCxVQUFVLENBQUNqQyxRQUFRLEdBQUdpQyxVQUFVLENBQUM5aEIsS0FBSyxHQUFHLENBQUMsQ0FBQztrQ0FDN0R5cEIsWUFBWSxDQUFDenhELElBQUksQ0FBQzhwRCxVQUFVLENBQUNoQyxRQUFRLEdBQUdnQyxVQUFVLENBQUM3aEIsTUFBTSxHQUFHLENBQUMsQ0FBQztnQ0FDaEUsQ0FBQyxNQUFNO2tDQUNMd3BCLFlBQVksQ0FBQ3p4RCxJQUFJLENBQUM0b0QsY0FBYyxDQUFDcHVCLEtBQUssQ0FBQyxDQUFDeXJCLE9BQU8sQ0FBQ3NMLGVBQWUsQ0FBQyxDQUFDO2tDQUNqRUUsWUFBWSxDQUFDenhELElBQUksQ0FBQzRvRCxjQUFjLENBQUNwdUIsS0FBSyxDQUFDLENBQUM2ckIsT0FBTyxDQUFDa0wsZUFBZSxDQUFDLENBQUM7Z0NBQ25FO2dDQUNBLElBQUl4NEIsTUFBTSxDQUFDNHdCLFFBQVEsQ0FBQyxDQUFDLEVBQUU7a0NBQ3JCLElBQUlnSSxXQUFXLEdBQUd4SixHQUFHLENBQUNuQixlQUFlLENBQUNqdUIsTUFBTSxFQUFFNnZCLGNBQWMsQ0FBQ3B1QixLQUFLLENBQUMsQ0FBQ3lyQixPQUFPLEVBQUUyQyxjQUFjLENBQUNwdUIsS0FBSyxDQUFDLENBQUM2ckIsT0FBTyxFQUFFVCxXQUFXLENBQUM7a0NBQ3hIOEwsWUFBWSxDQUFDMXhELElBQUksQ0FBQzJ4RCxXQUFXLENBQUM5SixRQUFRLEdBQUc4SixXQUFXLENBQUMzcEIsS0FBSyxHQUFHLENBQUMsQ0FBQztrQ0FDL0QwcEIsWUFBWSxDQUFDMXhELElBQUksQ0FBQzJ4RCxXQUFXLENBQUM3SixRQUFRLEdBQUc2SixXQUFXLENBQUMxcEIsTUFBTSxHQUFHLENBQUMsQ0FBQztnQ0FDbEUsQ0FBQyxNQUFNO2tDQUNMeXBCLFlBQVksQ0FBQzF4RCxJQUFJLENBQUM0b0QsY0FBYyxDQUFDcHVCLEtBQUssQ0FBQyxDQUFDeXJCLE9BQU8sQ0FBQ3VMLGVBQWUsQ0FBQyxDQUFDO2tDQUNqRUUsWUFBWSxDQUFDMXhELElBQUksQ0FBQzRvRCxjQUFjLENBQUNwdUIsS0FBSyxDQUFDLENBQUM2ckIsT0FBTyxDQUFDbUwsZUFBZSxDQUFDLENBQUM7Z0NBQ25FO2dDQUNBUixRQUFRLENBQUN0bkIsS0FBSyxDQUFDMXBDLElBQUksQ0FBQztrQ0FBRTR4RCxNQUFNLEVBQUVILFlBQVksQ0FBQyxDQUFDLENBQUM7a0NBQUVJLE1BQU0sRUFBRUosWUFBWSxDQUFDLENBQUMsQ0FBQztrQ0FBRUssSUFBSSxFQUFFSixZQUFZLENBQUMsQ0FBQyxDQUFDO2tDQUFFSyxJQUFJLEVBQUVMLFlBQVksQ0FBQyxDQUFDO2dDQUFFLENBQUMsQ0FBQzs4QkFDekgsQ0FBQyxNQUFNO2dDQUNMLElBQUk5QixVQUFVLENBQUNwMUIsS0FBSyxDQUFDLENBQUN1SSxNQUFNLENBQUM3eUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJMC9DLFVBQVUsQ0FBQ3AxQixLQUFLLENBQUMsQ0FBQ3pCLE1BQU0sQ0FBQzdvQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7a0NBQ3BFOGdELFFBQVEsQ0FBQ3RuQixLQUFLLENBQUMxcEMsSUFBSSxDQUFDO29DQUFFNHhELE1BQU0sRUFBRWhDLFVBQVUsQ0FBQ3AxQixLQUFLLENBQUMsQ0FBQ3VJLE1BQU0sQ0FBQzd5QixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM0MkMsVUFBVSxDQUFDLENBQUM7b0NBQUUrSyxNQUFNLEVBQUVqQyxVQUFVLENBQUNwMUIsS0FBSyxDQUFDLENBQUN1SSxNQUFNLENBQUM3eUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDNjJDLFVBQVUsQ0FBQyxDQUFDO29DQUFFK0ssSUFBSSxFQUFFbEMsVUFBVSxDQUFDcDFCLEtBQUssQ0FBQyxDQUFDekIsTUFBTSxDQUFDN29CLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzQyQyxVQUFVLENBQUMsQ0FBQztvQ0FBRWlMLElBQUksRUFBRW5DLFVBQVUsQ0FBQ3AxQixLQUFLLENBQUMsQ0FBQ3pCLE1BQU0sQ0FBQzdvQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM2MkMsVUFBVSxDQUFDO2tDQUFFLENBQUMsQ0FBQztnQ0FDek87OEJBQ0Y7NEJBQ0Y7MEJBQ0YsQ0FBQyxDQUFDOzBCQUNGLElBQUlpSyxRQUFRLENBQUNwcUIsS0FBSyxDQUFDdm1DLE1BQU0sR0FBRyxDQUFDLEVBQUU7NEJBQzdCeXdELFNBQVMsQ0FBQzl3RCxJQUFJLENBQUNneEQsUUFBUSxDQUFDOzRCQUN4QkgsbUJBQW1CLENBQUMvakQsR0FBRyxDQUFDMHRCLEtBQUssQ0FBQzswQkFDaEM7d0JBQ0Y7c0JBQ0YsQ0FBQyxDQUFDO3NCQUNGLElBQUl3M0IsV0FBVyxHQUFHL0IsT0FBTyxDQUFDWixjQUFjLENBQUN5QixTQUFTLEVBQUU5NkIsT0FBTyxDQUFDOHlCLFNBQVMsQ0FBQyxDQUFDbUosTUFBTTtzQkFDN0UsSUFBSWo4QixPQUFPLENBQUN3dkIsT0FBTyxJQUFJLE9BQU8sRUFBRTt3QkFDOUJvRCxjQUFjLENBQUN4cUQsT0FBTyxDQUFDLFVBQVUwZixNQUFNLEVBQUUwYyxLQUFLLEVBQUU7MEJBQzlDLElBQUkwM0IsVUFBVSxHQUFHcDBDLE1BQU0sQ0FBQ21vQyxPQUFPLENBQUN6NUMsR0FBRyxDQUFDLFVBQVVnNkMsQ0FBQyxFQUFFOzRCQUMvQyxPQUFPQSxDQUFDLEdBQUd3TCxXQUFXLENBQUN4M0IsS0FBSyxDQUFDLENBQUMyM0IsRUFBRTswQkFDbEMsQ0FBQyxDQUFDOzBCQUNGLElBQUlDLFVBQVUsR0FBR3QwQyxNQUFNLENBQUN1b0MsT0FBTyxDQUFDNzVDLEdBQUcsQ0FBQyxVQUFVOU8sQ0FBQyxFQUFFOzRCQUMvQyxPQUFPQSxDQUFDLEdBQUdzMEQsV0FBVyxDQUFDeDNCLEtBQUssQ0FBQyxDQUFDNjNCLEVBQUU7MEJBQ2xDLENBQUMsQ0FBQzswQkFDRnYwQyxNQUFNLENBQUNtb0MsT0FBTyxHQUFHaU0sVUFBVTswQkFDM0JwMEMsTUFBTSxDQUFDdW9DLE9BQU8sR0FBRytMLFVBQVU7d0JBQzdCLENBQUMsQ0FBQztzQkFDSixDQUFDLE1BQU07d0JBQ0wsSUFBSUUsTUFBTSxHQUFHLENBQUM7d0JBQ2R6QixtQkFBbUIsQ0FBQ3p5RCxPQUFPLENBQUMsVUFBVW84QixLQUFLLEVBQUU7MEJBQzNDOStCLE1BQU0sQ0FBQ3NGLElBQUksQ0FBQzR1RCxVQUFVLENBQUNwMUIsS0FBSyxDQUFDLENBQUMsQ0FBQ3A4QixPQUFPLENBQUMsVUFBVTh3QixJQUFJLEVBQUU7NEJBQ3JELElBQUlxakMsYUFBYSxHQUFHM0MsVUFBVSxDQUFDcDFCLEtBQUssQ0FBQyxDQUFDdEwsSUFBSSxDQUFDOzRCQUMzQ3FqQyxhQUFhLENBQUMxTCxTQUFTLENBQUMwTCxhQUFhLENBQUN6TCxVQUFVLENBQUMsQ0FBQyxHQUFHa0wsV0FBVyxDQUFDTSxNQUFNLENBQUMsQ0FBQ0gsRUFBRSxFQUFFSSxhQUFhLENBQUN4TCxVQUFVLENBQUMsQ0FBQyxHQUFHaUwsV0FBVyxDQUFDTSxNQUFNLENBQUMsQ0FBQ0QsRUFBRSxDQUFDOzBCQUNuSSxDQUFDLENBQUM7MEJBQ0ZDLE1BQU0sRUFBRTt3QkFDVixDQUFDLENBQUM7c0JBQ0o7b0JBQ0Y7a0JBQ0Y7Z0JBQ0Y7O2dCQUVBO2dCQUNBLElBQUlFLFlBQVksR0FBRyxTQUFTQSxZQUFZQSxDQUFDclAsR0FBRyxFQUFFbG5ELENBQUMsRUFBRTtrQkFDL0MsSUFBSSs1QixPQUFPLENBQUN3dkIsT0FBTyxJQUFJLFNBQVMsSUFBSXh2QixPQUFPLENBQUN3dkIsT0FBTyxJQUFJLE9BQU8sRUFBRTtvQkFDOUQsSUFBSSxPQUFPckMsR0FBRyxLQUFLLFFBQVEsRUFBRTtzQkFDM0JBLEdBQUcsR0FBR2xuRCxDQUFDO29CQUNUO29CQUNBLElBQUl3MkQsR0FBRyxHQUFHLEtBQUssQ0FBQztvQkFDaEIsSUFBSTFnRCxJQUFJLEdBQUcsS0FBSyxDQUFDO29CQUNqQixJQUFJMmdELEtBQUssR0FBR3ZQLEdBQUcsQ0FBQ3pnQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUMxQmt0QyxVQUFVLENBQUN4eEQsT0FBTyxDQUFDLFVBQVUwZixNQUFNLEVBQUU7c0JBQ25DLElBQUk0MEMsS0FBSyxJQUFJNTBDLE1BQU0sRUFBRTt3QkFDbkIyMEMsR0FBRyxHQUFHOzBCQUFFak0sQ0FBQyxFQUFFMW9DLE1BQU0sQ0FBQzQwQyxLQUFLLENBQUMsQ0FBQ2hNLE9BQU8sQ0FBQyxDQUFDLENBQUNJLFVBQVUsQ0FBQyxDQUFDOzBCQUFFcHBELENBQUMsRUFBRW9nQixNQUFNLENBQUM0MEMsS0FBSyxDQUFDLENBQUNoTSxPQUFPLENBQUMsQ0FBQyxDQUFDSyxVQUFVLENBQUM7d0JBQUUsQ0FBQzt3QkFDMUZoMUMsSUFBSSxHQUFHK0wsTUFBTSxDQUFDNDBDLEtBQUssQ0FBQztzQkFDdEI7b0JBQ0YsQ0FBQyxDQUFDO29CQUNGLElBQUkxOEIsT0FBTyxDQUFDd3pCLDJCQUEyQixFQUFFO3NCQUN2QyxJQUFJejNDLElBQUksQ0FBQ3M0QyxVQUFVLEVBQUU7d0JBQ25CLElBQUl0NEMsSUFBSSxDQUFDNDRDLGtCQUFrQixJQUFJLE1BQU0sRUFBRTswQkFDckM4SCxHQUFHLENBQUNqTSxDQUFDLElBQUl6MEMsSUFBSSxDQUFDczRDLFVBQVUsR0FBRyxDQUFDO3dCQUM5QixDQUFDLE1BQU0sSUFBSXQ0QyxJQUFJLENBQUM0NEMsa0JBQWtCLElBQUksT0FBTyxFQUFFOzBCQUM3QzhILEdBQUcsQ0FBQ2pNLENBQUMsSUFBSXowQyxJQUFJLENBQUNzNEMsVUFBVSxHQUFHLENBQUM7d0JBQzlCO3NCQUNGO3NCQUNBLElBQUl0NEMsSUFBSSxDQUFDMDRDLFdBQVcsRUFBRTt3QkFDcEIsSUFBSTE0QyxJQUFJLENBQUMyNEMsZ0JBQWdCLElBQUksS0FBSyxFQUFFOzBCQUNsQytILEdBQUcsQ0FBQy8wRCxDQUFDLElBQUlxVSxJQUFJLENBQUMwNEMsV0FBVyxHQUFHLENBQUM7d0JBQy9CLENBQUMsTUFBTSxJQUFJMTRDLElBQUksQ0FBQzI0QyxnQkFBZ0IsSUFBSSxRQUFRLEVBQUU7MEJBQzVDK0gsR0FBRyxDQUFDLzBELENBQUMsSUFBSXFVLElBQUksQ0FBQzA0QyxXQUFXLEdBQUcsQ0FBQzt3QkFDL0I7c0JBQ0Y7b0JBQ0Y7b0JBQ0EsSUFBSWdJLEdBQUcsSUFBSTV2RCxTQUFTLEVBQUU0dkQsR0FBRyxHQUFHO3NCQUFFak0sQ0FBQyxFQUFFckQsR0FBRyxDQUFDcmMsUUFBUSxDQUFDLEdBQUcsQ0FBQztzQkFBRXBwQyxDQUFDLEVBQUV5bEQsR0FBRyxDQUFDcmMsUUFBUSxDQUFDLEdBQUc7b0JBQUUsQ0FBQztvQkFDMUUsT0FBTztzQkFDTDBmLENBQUMsRUFBRWlNLEdBQUcsQ0FBQ2pNLENBQUM7c0JBQ1I5b0QsQ0FBQyxFQUFFKzBELEdBQUcsQ0FBQy8wRDtvQkFDVCxDQUFDO2tCQUNILENBQUMsTUFBTTtvQkFDTCxJQUFJaTFELElBQUksR0FBRyxLQUFLLENBQUM7b0JBQ2pCL0osY0FBYyxDQUFDeHFELE9BQU8sQ0FBQyxVQUFVMGYsTUFBTSxFQUFFO3NCQUN2QyxJQUFJMGMsS0FBSyxHQUFHMWMsTUFBTSxDQUFDOG5DLFdBQVcsQ0FBQ2x2QyxHQUFHLENBQUN5c0MsR0FBRyxDQUFDanpDLEVBQUUsQ0FBQyxDQUFDLENBQUM7c0JBQzVDLElBQUlzcUIsS0FBSyxJQUFJMzNCLFNBQVMsRUFBRTt3QkFDdEI4dkQsSUFBSSxHQUFHOzBCQUFFbk0sQ0FBQyxFQUFFMW9DLE1BQU0sQ0FBQ21vQyxPQUFPLENBQUN6ckIsS0FBSyxDQUFDOzBCQUFFOThCLENBQUMsRUFBRW9nQixNQUFNLENBQUN1b0MsT0FBTyxDQUFDN3JCLEtBQUs7d0JBQUUsQ0FBQztzQkFDL0Q7b0JBQ0YsQ0FBQyxDQUFDO29CQUNGLElBQUltNEIsSUFBSSxJQUFJOXZELFNBQVMsRUFBRTh2RCxJQUFJLEdBQUc7c0JBQUVuTSxDQUFDLEVBQUVyRCxHQUFHLENBQUNyYyxRQUFRLENBQUMsR0FBRyxDQUFDO3NCQUFFcHBDLENBQUMsRUFBRXlsRCxHQUFHLENBQUNyYyxRQUFRLENBQUMsR0FBRztvQkFBRSxDQUFDO29CQUM1RSxPQUFPO3NCQUNMMGYsQ0FBQyxFQUFFbU0sSUFBSSxDQUFDbk0sQ0FBQztzQkFDVDlvRCxDQUFDLEVBQUVpMUQsSUFBSSxDQUFDajFEO29CQUNWLENBQUM7a0JBQ0g7Z0JBQ0YsQ0FBQzs7Z0JBRUQ7Z0JBQ0EsSUFBSXM0QixPQUFPLENBQUN3dkIsT0FBTyxJQUFJLFNBQVMsSUFBSXh2QixPQUFPLENBQUN3dkIsT0FBTyxJQUFJLE9BQU8sSUFBSXh2QixPQUFPLENBQUM4eUIsU0FBUyxFQUFFO2tCQUNuRjtrQkFDQSxJQUFJZCxzQkFBc0IsR0FBR0csR0FBRyxDQUFDSiwwQkFBMEIsQ0FBQ3JoQixFQUFFLEVBQUUyYyxJQUFJLENBQUM7a0JBQ3JFLElBQUl1UCxXQUFXLEdBQUd2UCxJQUFJLENBQUM5MkMsTUFBTSxDQUFDLFVBQVU0MkMsR0FBRyxFQUFFO29CQUMzQyxPQUFPQSxHQUFHLENBQUMrRSxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksTUFBTTtrQkFDckMsQ0FBQyxDQUFDO2tCQUNGbHlCLE9BQU8sQ0FBQ3F0QixJQUFJLEdBQUdBLElBQUksQ0FBQ3VFLEdBQUcsQ0FBQ2dMLFdBQVcsQ0FBQztrQkFFcEN2UCxJQUFJLENBQUN6YyxLQUFLLENBQUMsQ0FBQyxDQUFDZ2hCLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQ0EsR0FBRyxDQUFDZ0wsV0FBVyxDQUFDLENBQUNDLGVBQWUsQ0FBQzdzRCxNQUFNLEVBQUVnd0IsT0FBTyxFQUFFdzhCLFlBQVksQ0FBQztrQkFFM0YsSUFBSXhLLHNCQUFzQixDQUFDM25ELE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3JDMm5ELHNCQUFzQixDQUFDNXBELE9BQU8sQ0FBQyxVQUFVK2tELEdBQUcsRUFBRTtzQkFDNUNBLEdBQUcsQ0FBQ3JjLFFBQVEsQ0FBQzByQixZQUFZLENBQUNyUCxHQUFHLENBQUMsQ0FBQztvQkFDakMsQ0FBQyxDQUFDO2tCQUNKO2dCQUNGLENBQUMsTUFBTTtrQkFDTHJ1QyxPQUFPLENBQUNzQixHQUFHLENBQUMsd0ZBQXdGLENBQUM7Z0JBQ3ZHO2NBQ0Y7WUFDRixDQUFDLENBQUMsQ0FBQztZQUVILE9BQU9zNUMsTUFBTTtVQUNmLENBQUMsQ0FBQyxDQUFDO1VBRUhwUCxNQUFNLENBQUN1QixPQUFPLEdBQUc2TixNQUFNOztVQUV2QjtRQUFNLENBQUU7O1FBRVIsS0FBTSxHQUFHLEVBQ1QsS0FBTyxTQUFBOXRDLEVBQUMwK0IsTUFBTSxFQUFFOEIsd0JBQXdCLEVBQUVDLGdDQUFtQixFQUFLO1VBSWxFO0FBQ0E7QUFDQTs7VUFFQSxJQUFJOEYsR0FBRyxHQUFHOUYsZ0NBQW1CLENBQUMsR0FBRyxDQUFDO1VBQ2xDLElBQUl5USxNQUFNLEdBQUd6USxnQ0FBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQ1MsVUFBVSxDQUFDZ1EsTUFBTTtVQUN2RCxJQUFJQyxHQUFHLEdBQUcxUSxnQ0FBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQ1MsVUFBVSxDQUFDaVEsR0FBRzs7VUFFakQ7VUFDQSxJQUFJaEUsY0FBYyxHQUFHLFNBQVNBLGNBQWNBLENBQUMvNEIsT0FBTyxFQUFFO1lBRXBELElBQUkwUSxFQUFFLEdBQUcxUSxPQUFPLENBQUMwUSxFQUFFO1lBQ25CLElBQUkyYyxJQUFJLEdBQUdydEIsT0FBTyxDQUFDcXRCLElBQUk7WUFDdkIsSUFBSXpjLEtBQUssR0FBR3ljLElBQUksQ0FBQ3pjLEtBQUssQ0FBQyxDQUFDO1lBQ3hCLElBQUlvc0IsV0FBVyxHQUFHM1AsSUFBSSxDQUFDemMsS0FBSyxDQUFDLFNBQVMsQ0FBQztZQUV2QyxJQUFJMmMsVUFBVSxHQUFHLElBQUlnTixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsSUFBSTNLLFdBQVcsR0FBRyxJQUFJMkssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLElBQUkwQyxjQUFjLEdBQUcsSUFBSTFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJMkMsb0JBQW9CLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDL0IsSUFBSWpOLE9BQU8sR0FBRyxFQUFFO1lBQ2hCLElBQUlJLE9BQU8sR0FBRyxFQUFFO1lBRWhCLElBQUk4TSxhQUFhLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDeEIsSUFBSUMsa0JBQWtCLEdBQUcsRUFBRTtZQUMzQixJQUFJQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDWixJQUFJQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDZCxJQUFJQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7O1lBRWQsSUFBSUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDMUIsSUFBSUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUVyQixJQUFJQyxRQUFRLEdBQUcsU0FBUztZQUN4QixJQUFJQyxLQUFLLEdBQUcsV0FBVztZQUV2QixJQUFJbEUsS0FBSyxHQUFHejVCLE9BQU8sQ0FBQ3k1QixLQUFLO1lBQ3pCLElBQUlILFlBQVksR0FBR3Q1QixPQUFPLENBQUNzNUIsWUFBWSxDQUFDLENBQUM7WUFDekMsSUFBSUUsY0FBYyxHQUFHeDVCLE9BQU8sQ0FBQ3c1QixjQUFjO1lBQzNDLElBQUlELFVBQVUsR0FBRyxLQUFLLENBQUM7O1lBRXZCOztZQUVBOztZQUVBO1lBQ0EsSUFBSXFFLGNBQWMsR0FBRyxTQUFTQSxjQUFjQSxDQUFBLEVBQUc7Y0FDN0MsSUFBSUMsTUFBTSxHQUFHLENBQUM7Y0FDZCxJQUFJNXdCLEtBQUssR0FBRyxDQUFDO2NBQ2IsSUFBSTZ3QixJQUFJLEdBQUcsS0FBSztjQUVoQixPQUFPN3dCLEtBQUssR0FBR3NzQixVQUFVLEVBQUU7Z0JBQ3pCc0UsTUFBTSxHQUFHLytCLElBQUksQ0FBQ2kvQixLQUFLLENBQUNqL0IsSUFBSSxDQUFDNEIsTUFBTSxDQUFDLENBQUMsR0FBRys4QixRQUFRLENBQUM7Z0JBRTdDSyxJQUFJLEdBQUcsS0FBSztnQkFDWixLQUFLLElBQUk3M0QsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHZ25DLEtBQUssRUFBRWhuQyxDQUFDLEVBQUUsRUFBRTtrQkFDOUIsSUFBSWszRCxhQUFhLENBQUNsM0QsQ0FBQyxDQUFDLElBQUk0M0QsTUFBTSxFQUFFO29CQUM5QkMsSUFBSSxHQUFHLElBQUk7b0JBQ1g7a0JBQ0Y7Z0JBQ0Y7Z0JBRUEsSUFBSSxDQUFDQSxJQUFJLEVBQUU7a0JBQ1RYLGFBQWEsQ0FBQ2x3QixLQUFLLENBQUMsR0FBRzR3QixNQUFNO2tCQUM3QjV3QixLQUFLLEVBQUU7Z0JBQ1QsQ0FBQyxNQUFNO2tCQUNMO2dCQUNGO2NBQ0Y7WUFDRixDQUFDOztZQUVEO1lBQ0EsSUFBSSt3QixHQUFHLEdBQUcsU0FBU0EsR0FBR0EsQ0FBQ0MsS0FBSyxFQUFFejVCLEtBQUssRUFBRTA1QixjQUFjLEVBQUU7Y0FDbkQsSUFBSXpuRCxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7Y0FDZixJQUFJNEcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO2NBQ2YsSUFBSXdwQixJQUFJLEdBQUcsQ0FBQztjQUNaLElBQUl0MkIsT0FBTyxHQUFHLENBQUM7Y0FDZixJQUFJcStDLElBQUksR0FBRyxLQUFLLENBQUM7Y0FDakIsSUFBSXVQLFFBQVEsR0FBRyxFQUFFO2NBRWpCLElBQUlDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztjQUNsQixJQUFJQyxPQUFPLEdBQUcsQ0FBQztjQUVmLEtBQUssSUFBSXA0RCxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUd3M0QsUUFBUSxFQUFFeDNELENBQUMsRUFBRSxFQUFFO2dCQUNqQ2s0RCxRQUFRLENBQUNsNEQsQ0FBQyxDQUFDLEdBQUd5M0QsUUFBUTtjQUN4QjtjQUVBam5ELElBQUksQ0FBQ293QixJQUFJLENBQUMsR0FBR28zQixLQUFLO2NBQ2xCRSxRQUFRLENBQUNGLEtBQUssQ0FBQyxHQUFHLENBQUM7Y0FFbkIsT0FBT3AzQixJQUFJLElBQUl4cEIsS0FBSyxFQUFFO2dCQUNwQjlNLE9BQU8sR0FBR2tHLElBQUksQ0FBQzRHLEtBQUssRUFBRSxDQUFDO2dCQUN2QixJQUFJaWhELFNBQVMsR0FBR3BCLG9CQUFvQixDQUFDM3NELE9BQU8sQ0FBQztnQkFDN0MsS0FBSyxJQUFJbzhDLEVBQUUsR0FBRyxDQUFDLEVBQUVBLEVBQUUsR0FBRzJSLFNBQVMsQ0FBQ2owRCxNQUFNLEVBQUVzaUQsRUFBRSxFQUFFLEVBQUU7a0JBQzVDaUMsSUFBSSxHQUFHZ0IsV0FBVyxDQUFDbHZDLEdBQUcsQ0FBQzQ5QyxTQUFTLENBQUMzUixFQUFFLENBQUMsQ0FBQztrQkFDckMsSUFBSXdSLFFBQVEsQ0FBQ3ZQLElBQUksQ0FBQyxJQUFJOE8sUUFBUSxFQUFFO29CQUM5QlMsUUFBUSxDQUFDdlAsSUFBSSxDQUFDLEdBQUd1UCxRQUFRLENBQUM1dEQsT0FBTyxDQUFDLEdBQUcsQ0FBQztvQkFDdENrRyxJQUFJLENBQUMsRUFBRW93QixJQUFJLENBQUMsR0FBRytuQixJQUFJO2tCQUNyQjtnQkFDRjtnQkFDQXlPLENBQUMsQ0FBQzlzRCxPQUFPLENBQUMsQ0FBQ2kwQixLQUFLLENBQUMsR0FBRzI1QixRQUFRLENBQUM1dEQsT0FBTyxDQUFDLEdBQUdpcEQsY0FBYztjQUN4RDtjQUVBLElBQUkwRSxjQUFjLEVBQUU7Z0JBQ2xCLEtBQUssSUFBSUssR0FBRyxHQUFHLENBQUMsRUFBRUEsR0FBRyxHQUFHZCxRQUFRLEVBQUVjLEdBQUcsRUFBRSxFQUFFO2tCQUN2QyxJQUFJbEIsQ0FBQyxDQUFDa0IsR0FBRyxDQUFDLENBQUMvNUIsS0FBSyxDQUFDLEdBQUc0NEIsa0JBQWtCLENBQUNtQixHQUFHLENBQUMsRUFBRW5CLGtCQUFrQixDQUFDbUIsR0FBRyxDQUFDLEdBQUdsQixDQUFDLENBQUNrQixHQUFHLENBQUMsQ0FBQy81QixLQUFLLENBQUM7Z0JBQ3RGO2dCQUVBLEtBQUssSUFBSWc2QixHQUFHLEdBQUcsQ0FBQyxFQUFFQSxHQUFHLEdBQUdmLFFBQVEsRUFBRWUsR0FBRyxFQUFFLEVBQUU7a0JBQ3ZDLElBQUlwQixrQkFBa0IsQ0FBQ29CLEdBQUcsQ0FBQyxHQUFHSixRQUFRLEVBQUU7b0JBQ3RDQSxRQUFRLEdBQUdoQixrQkFBa0IsQ0FBQ29CLEdBQUcsQ0FBQztvQkFDbENILE9BQU8sR0FBR0csR0FBRztrQkFDZjtnQkFDRjtjQUNGO2NBQ0EsT0FBT0gsT0FBTztZQUNoQixDQUFDOztZQUVEO1lBQ0EsSUFBSUksTUFBTSxHQUFHLFNBQVNBLE1BQU1BLENBQUNQLGNBQWMsRUFBRTtjQUUzQyxJQUFJTCxNQUFNLEdBQUcsS0FBSyxDQUFDO2NBRW5CLElBQUksQ0FBQ0ssY0FBYyxFQUFFO2dCQUNuQk4sY0FBYyxDQUFDLENBQUM7O2dCQUVoQjtnQkFDQSxLQUFLLElBQUkzM0QsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHc3pELFVBQVUsRUFBRXR6RCxDQUFDLEVBQUUsRUFBRTtrQkFDbkMrM0QsR0FBRyxDQUFDYixhQUFhLENBQUNsM0QsQ0FBQyxDQUFDLEVBQUVBLENBQUMsRUFBRWk0RCxjQUFjLEVBQUUsS0FBSyxDQUFDO2dCQUNqRDtjQUNGLENBQUMsTUFBTTtnQkFDTEwsTUFBTSxHQUFHLytCLElBQUksQ0FBQ2kvQixLQUFLLENBQUNqL0IsSUFBSSxDQUFDNEIsTUFBTSxDQUFDLENBQUMsR0FBRys4QixRQUFRLENBQUM7Z0JBQzdDRCxXQUFXLEdBQUdLLE1BQU07Z0JBRXBCLEtBQUssSUFBSWEsR0FBRyxHQUFHLENBQUMsRUFBRUEsR0FBRyxHQUFHakIsUUFBUSxFQUFFaUIsR0FBRyxFQUFFLEVBQUU7a0JBQ3ZDdEIsa0JBQWtCLENBQUNzQixHQUFHLENBQUMsR0FBR2hCLFFBQVE7Z0JBQ3BDO2dCQUVBLEtBQUssSUFBSWlCLEdBQUcsR0FBRyxDQUFDLEVBQUVBLEdBQUcsR0FBR3BGLFVBQVUsRUFBRW9GLEdBQUcsRUFBRSxFQUFFO2tCQUN6Q3hCLGFBQWEsQ0FBQ3dCLEdBQUcsQ0FBQyxHQUFHZCxNQUFNO2tCQUMzQkEsTUFBTSxHQUFHRyxHQUFHLENBQUNILE1BQU0sRUFBRWMsR0FBRyxFQUFFVCxjQUFjLENBQUM7Z0JBQzNDO2NBQ0Y7O2NBRUE7Y0FDQSxLQUFLLElBQUlVLEdBQUcsR0FBRyxDQUFDLEVBQUVBLEdBQUcsR0FBR25CLFFBQVEsRUFBRW1CLEdBQUcsRUFBRSxFQUFFO2dCQUN2QyxLQUFLLElBQUlwaEQsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHKzdDLFVBQVUsRUFBRS83QyxDQUFDLEVBQUUsRUFBRTtrQkFDbkM2L0MsQ0FBQyxDQUFDdUIsR0FBRyxDQUFDLENBQUNwaEQsQ0FBQyxDQUFDLElBQUk2L0MsQ0FBQyxDQUFDdUIsR0FBRyxDQUFDLENBQUNwaEQsQ0FBQyxDQUFDO2dCQUN4QjtjQUNGOztjQUVBO2NBQ0EsS0FBSyxJQUFJcWhELEdBQUcsR0FBRyxDQUFDLEVBQUVBLEdBQUcsR0FBR3RGLFVBQVUsRUFBRXNGLEdBQUcsRUFBRSxFQUFFO2dCQUN6Q3ZCLEdBQUcsQ0FBQ3VCLEdBQUcsQ0FBQyxHQUFHLEVBQUU7Y0FDZjtjQUVBLEtBQUssSUFBSUMsR0FBRyxHQUFHLENBQUMsRUFBRUEsR0FBRyxHQUFHdkYsVUFBVSxFQUFFdUYsR0FBRyxFQUFFLEVBQUU7Z0JBQ3pDLEtBQUssSUFBSUMsRUFBRSxHQUFHLENBQUMsRUFBRUEsRUFBRSxHQUFHeEYsVUFBVSxFQUFFd0YsRUFBRSxFQUFFLEVBQUU7a0JBQ3RDekIsR0FBRyxDQUFDd0IsR0FBRyxDQUFDLENBQUNDLEVBQUUsQ0FBQyxHQUFHMUIsQ0FBQyxDQUFDRixhQUFhLENBQUM0QixFQUFFLENBQUMsQ0FBQyxDQUFDRCxHQUFHLENBQUM7Z0JBQzFDO2NBQ0Y7WUFDRixDQUFDOztZQUVEO1lBQ0EsSUFBSWpCLE1BQU0sR0FBRyxTQUFTQSxNQUFNQSxDQUFBLEVBQUc7Y0FFN0IsSUFBSW1CLFNBQVMsR0FBR2pDLEdBQUcsQ0FBQ2tDLEdBQUcsQ0FBQzNCLEdBQUcsQ0FBQztjQUU1QixJQUFJNEIsR0FBRyxHQUFHRixTQUFTLENBQUNHLENBQUM7Y0FDckIsSUFBSUMsR0FBRyxHQUFHSixTQUFTLENBQUNLLENBQUM7Y0FDckIsSUFBSUMsR0FBRyxHQUFHTixTQUFTLENBQUNPLENBQUM7Y0FFckIsSUFBSUMsS0FBSyxHQUFHTixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUdBLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBR0EsR0FBRyxDQUFDLENBQUMsQ0FBQztjQUVwQyxJQUFJTyxLQUFLLEdBQUcsRUFBRTs7Y0FFZDtjQUNBLEtBQUssSUFBSXg1RCxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdzekQsVUFBVSxFQUFFdHpELENBQUMsRUFBRSxFQUFFO2dCQUNuQ3c1RCxLQUFLLENBQUN4NUQsQ0FBQyxDQUFDLEdBQUcsRUFBRTtnQkFDYixLQUFLLElBQUl1WCxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUcrN0MsVUFBVSxFQUFFLzdDLENBQUMsRUFBRSxFQUFFO2tCQUNuQ2lpRCxLQUFLLENBQUN4NUQsQ0FBQyxDQUFDLENBQUN1WCxDQUFDLENBQUMsR0FBRyxDQUFDO2tCQUNmLElBQUl2WCxDQUFDLElBQUl1WCxDQUFDLEVBQUU7b0JBQ1ZpaUQsS0FBSyxDQUFDeDVELENBQUMsQ0FBQyxDQUFDdVgsQ0FBQyxDQUFDLEdBQUcwaEQsR0FBRyxDQUFDajVELENBQUMsQ0FBQyxJQUFJaTVELEdBQUcsQ0FBQ2o1RCxDQUFDLENBQUMsR0FBR2k1RCxHQUFHLENBQUNqNUQsQ0FBQyxDQUFDLEdBQUd1NUQsS0FBSyxJQUFJTixHQUFHLENBQUNqNUQsQ0FBQyxDQUFDLEdBQUdpNUQsR0FBRyxDQUFDajVELENBQUMsQ0FBQyxDQUFDLENBQUM7a0JBQ3RFO2dCQUNGO2NBQ0Y7Y0FFQXMzRCxHQUFHLEdBQUdULE1BQU0sQ0FBQzRDLE9BQU8sQ0FBQzVDLE1BQU0sQ0FBQzRDLE9BQU8sQ0FBQ0osR0FBRyxFQUFFRyxLQUFLLENBQUMsRUFBRTNDLE1BQU0sQ0FBQzZDLFNBQVMsQ0FBQ1AsR0FBRyxDQUFDLENBQUM7WUFDekUsQ0FBQzs7WUFFRDtZQUNBLElBQUlRLGNBQWMsR0FBRyxTQUFTQSxjQUFjQSxDQUFBLEVBQUc7Y0FDN0M7Y0FDQSxJQUFJQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2NBQ25CLElBQUlDLE1BQU0sR0FBRyxLQUFLLENBQUM7O2NBRW5CO2NBQ0EsSUFBSUMsRUFBRSxHQUFHLEVBQUU7Y0FDWCxJQUFJQyxFQUFFLEdBQUcsRUFBRTtjQUVYLElBQUlDLEVBQUUsR0FBRyxFQUFFO2NBQ1gsSUFBSUMsRUFBRSxHQUFHLEVBQUU7Y0FFWCxLQUFLLElBQUlqNkQsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHdzNELFFBQVEsRUFBRXgzRCxDQUFDLEVBQUUsRUFBRTtnQkFDakM4NUQsRUFBRSxDQUFDOTVELENBQUMsQ0FBQyxHQUFHNjRCLElBQUksQ0FBQzRCLE1BQU0sQ0FBQyxDQUFDO2dCQUNyQnMvQixFQUFFLENBQUMvNUQsQ0FBQyxDQUFDLEdBQUc2NEIsSUFBSSxDQUFDNEIsTUFBTSxDQUFDLENBQUM7Y0FDdkI7Y0FFQXEvQixFQUFFLEdBQUdqRCxNQUFNLENBQUNxRCxTQUFTLENBQUNKLEVBQUUsQ0FBQztjQUN6QkMsRUFBRSxHQUFHbEQsTUFBTSxDQUFDcUQsU0FBUyxDQUFDSCxFQUFFLENBQUM7Y0FFekIsSUFBSS95QixLQUFLLEdBQUcsQ0FBQztjQUNiO2NBQ0EsSUFBSTE4QixPQUFPLEdBQUdvdEQsS0FBSztjQUNuQixJQUFJbjlCLFFBQVEsR0FBR205QixLQUFLO2NBRXBCLElBQUkvTyxJQUFJLEdBQUcsS0FBSyxDQUFDO2NBRWpCLE9BQU8sSUFBSSxFQUFFO2dCQUNYM2hCLEtBQUssRUFBRTtnQkFFUCxLQUFLLElBQUltekIsR0FBRyxHQUFHLENBQUMsRUFBRUEsR0FBRyxHQUFHM0MsUUFBUSxFQUFFMkMsR0FBRyxFQUFFLEVBQUU7a0JBQ3ZDSCxFQUFFLENBQUNHLEdBQUcsQ0FBQyxHQUFHTCxFQUFFLENBQUNLLEdBQUcsQ0FBQztnQkFDbkI7Z0JBRUFMLEVBQUUsR0FBR2pELE1BQU0sQ0FBQ3VELFNBQVMsQ0FBQ3ZELE1BQU0sQ0FBQ3dELEtBQUssQ0FBQ3hELE1BQU0sQ0FBQ3VELFNBQVMsQ0FBQ0osRUFBRSxDQUFDLEVBQUU1QyxDQUFDLEVBQUVFLEdBQUcsQ0FBQyxDQUFDO2dCQUNqRXNDLE1BQU0sR0FBRy9DLE1BQU0sQ0FBQ3lELFVBQVUsQ0FBQ04sRUFBRSxFQUFFRixFQUFFLENBQUM7Z0JBQ2xDQSxFQUFFLEdBQUdqRCxNQUFNLENBQUNxRCxTQUFTLENBQUNKLEVBQUUsQ0FBQztnQkFFekJ4dkQsT0FBTyxHQUFHdXNELE1BQU0sQ0FBQ3lELFVBQVUsQ0FBQ04sRUFBRSxFQUFFRixFQUFFLENBQUM7Z0JBRW5DblIsSUFBSSxHQUFHOXZCLElBQUksQ0FBQzBoQyxHQUFHLENBQUNqd0QsT0FBTyxHQUFHaXdCLFFBQVEsQ0FBQztnQkFFbkMsSUFBSW91QixJQUFJLElBQUksQ0FBQyxHQUFHNkssS0FBSyxJQUFJN0ssSUFBSSxJQUFJLENBQUMsRUFBRTtrQkFDbEM7Z0JBQ0Y7Z0JBRUFwdUIsUUFBUSxHQUFHandCLE9BQU87Y0FDcEI7Y0FFQSxLQUFLLElBQUlrd0QsSUFBSSxHQUFHLENBQUMsRUFBRUEsSUFBSSxHQUFHaEQsUUFBUSxFQUFFZ0QsSUFBSSxFQUFFLEVBQUU7Z0JBQzFDUixFQUFFLENBQUNRLElBQUksQ0FBQyxHQUFHVixFQUFFLENBQUNVLElBQUksQ0FBQztjQUNyQjtjQUVBeHpCLEtBQUssR0FBRyxDQUFDO2NBQ1R6TSxRQUFRLEdBQUdtOUIsS0FBSztjQUNoQixPQUFPLElBQUksRUFBRTtnQkFDWDF3QixLQUFLLEVBQUU7Z0JBRVAsS0FBSyxJQUFJeXpCLElBQUksR0FBRyxDQUFDLEVBQUVBLElBQUksR0FBR2pELFFBQVEsRUFBRWlELElBQUksRUFBRSxFQUFFO2tCQUMxQ1IsRUFBRSxDQUFDUSxJQUFJLENBQUMsR0FBR1YsRUFBRSxDQUFDVSxJQUFJLENBQUM7Z0JBQ3JCO2dCQUVBUixFQUFFLEdBQUdwRCxNQUFNLENBQUM2RCxPQUFPLENBQUNULEVBQUUsRUFBRXBELE1BQU0sQ0FBQzhELFFBQVEsQ0FBQ1gsRUFBRSxFQUFFbkQsTUFBTSxDQUFDeUQsVUFBVSxDQUFDTixFQUFFLEVBQUVDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZFRixFQUFFLEdBQUdsRCxNQUFNLENBQUN1RCxTQUFTLENBQUN2RCxNQUFNLENBQUN3RCxLQUFLLENBQUN4RCxNQUFNLENBQUN1RCxTQUFTLENBQUNILEVBQUUsQ0FBQyxFQUFFN0MsQ0FBQyxFQUFFRSxHQUFHLENBQUMsQ0FBQztnQkFDakV1QyxNQUFNLEdBQUdoRCxNQUFNLENBQUN5RCxVQUFVLENBQUNMLEVBQUUsRUFBRUYsRUFBRSxDQUFDO2dCQUNsQ0EsRUFBRSxHQUFHbEQsTUFBTSxDQUFDcUQsU0FBUyxDQUFDSCxFQUFFLENBQUM7Z0JBRXpCenZELE9BQU8sR0FBR3VzRCxNQUFNLENBQUN5RCxVQUFVLENBQUNMLEVBQUUsRUFBRUYsRUFBRSxDQUFDO2dCQUVuQ3BSLElBQUksR0FBRzl2QixJQUFJLENBQUMwaEMsR0FBRyxDQUFDandELE9BQU8sR0FBR2l3QixRQUFRLENBQUM7Z0JBRW5DLElBQUlvdUIsSUFBSSxJQUFJLENBQUMsR0FBRzZLLEtBQUssSUFBSTdLLElBQUksSUFBSSxDQUFDLEVBQUU7a0JBQ2xDO2dCQUNGO2dCQUVBcHVCLFFBQVEsR0FBR2p3QixPQUFPO2NBQ3BCO2NBRUEsS0FBSyxJQUFJc3dELElBQUksR0FBRyxDQUFDLEVBQUVBLElBQUksR0FBR3BELFFBQVEsRUFBRW9ELElBQUksRUFBRSxFQUFFO2dCQUMxQ1gsRUFBRSxDQUFDVyxJQUFJLENBQUMsR0FBR2IsRUFBRSxDQUFDYSxJQUFJLENBQUM7Y0FDckI7O2NBRUE7Y0FDQTtjQUNBO2NBQ0E7O2NBRUE7Y0FDQTVRLE9BQU8sR0FBRzZNLE1BQU0sQ0FBQzhELFFBQVEsQ0FBQ1gsRUFBRSxFQUFFbmhDLElBQUksQ0FBQ2dpQyxJQUFJLENBQUNoaUMsSUFBSSxDQUFDMGhDLEdBQUcsQ0FBQ1gsTUFBTSxDQUFDLENBQUMsQ0FBQztjQUMxRHhQLE9BQU8sR0FBR3lNLE1BQU0sQ0FBQzhELFFBQVEsQ0FBQ1YsRUFBRSxFQUFFcGhDLElBQUksQ0FBQ2dpQyxJQUFJLENBQUNoaUMsSUFBSSxDQUFDMGhDLEdBQUcsQ0FBQ1YsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUM1RCxDQUFDOztZQUVEOztZQUVBO1lBQ0EzTixHQUFHLENBQUMvRSxpQkFBaUIsQ0FBQzFjLEVBQUUsRUFBRTJjLElBQUksRUFBRThFLEdBQUcsQ0FBQ25GLGVBQWUsQ0FBQ3BjLEtBQUssQ0FBQyxFQUFFMmMsVUFBVSxDQUFDO1lBRXZFeVAsV0FBVyxDQUFDNTBELE9BQU8sQ0FBQyxVQUFVK2tELEdBQUcsRUFBRTtjQUNqQ2dGLEdBQUcsQ0FBQy9FLGlCQUFpQixDQUFDMWMsRUFBRSxFQUFFMmMsSUFBSSxFQUFFOEUsR0FBRyxDQUFDbkYsZUFBZSxDQUFDRyxHQUFHLENBQUNnQixXQUFXLENBQUMsQ0FBQyxDQUFDanNDLFlBQVksQ0FBQ21yQyxJQUFJLENBQUMsQ0FBQyxFQUFFRSxVQUFVLENBQUM7WUFDeEcsQ0FBQyxDQUFDOztZQUVGO1lBQ0EsSUFBSS9vQixLQUFLLEdBQUcsQ0FBQztZQUNiLEtBQUssSUFBSXYrQixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUcycUMsS0FBSyxDQUFDdm1DLE1BQU0sRUFBRXBFLENBQUMsRUFBRSxFQUFFO2NBQ3JDLElBQUksQ0FBQzJxQyxLQUFLLENBQUMzcUMsQ0FBQyxDQUFDLENBQUMwdEQsUUFBUSxDQUFDLENBQUMsRUFBRTtnQkFDeEIvRCxXQUFXLENBQUN2UCxHQUFHLENBQUN6UCxLQUFLLENBQUMzcUMsQ0FBQyxDQUFDLENBQUNpVSxFQUFFLENBQUMsQ0FBQyxFQUFFc3FCLEtBQUssRUFBRSxDQUFDO2NBQ3pDO1lBQ0Y7WUFFQSxJQUFJaXJCLHlCQUF5QixHQUFHLElBQUk7WUFDcEMsSUFBSUMsaUJBQWlCLEdBQUcsS0FBSztZQUM3QixJQUFJQyxjQUFjLEdBQUc5aUQsU0FBUztZQUU5QixJQUFJO2NBQ0YsS0FBSyxJQUFJOHBCLFNBQVMsR0FBRzQyQixVQUFVLENBQUN2aUQsSUFBSSxDQUFDLENBQUMsQ0FBQzlFLE1BQU0sQ0FBQ0UsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFeXdCLEtBQUssRUFBRSxFQUFFNDRCLHlCQUF5QixHQUFHLENBQUM1NEIsS0FBSyxHQUFHRixTQUFTLENBQUNudEIsSUFBSSxDQUFDLENBQUMsRUFBRVgsSUFBSSxDQUFDLEVBQUU0bUQseUJBQXlCLEdBQUcsSUFBSSxFQUFFO2dCQUNsSyxJQUFJdGpELEdBQUcsR0FBRzBxQixLQUFLLENBQUM3d0IsS0FBSztnQkFFckI0cEQsV0FBVyxDQUFDdlAsR0FBRyxDQUFDbDBDLEdBQUcsRUFBRXE0QixLQUFLLEVBQUUsQ0FBQztjQUMvQjs7Y0FFQTtZQUNGLENBQUMsQ0FBQyxPQUFPNTNCLEdBQUcsRUFBRTtjQUNaOGlELGlCQUFpQixHQUFHLElBQUk7Y0FDeEJDLGNBQWMsR0FBRy9pRCxHQUFHO1lBQ3RCLENBQUMsU0FBUztjQUNSLElBQUk7Z0JBQ0YsSUFBSSxDQUFDNmlELHlCQUF5QixJQUFJOTRCLFNBQVMsQ0FBQ3R0QixNQUFNLEVBQUU7a0JBQ2xEc3RCLFNBQVMsQ0FBQ3R0QixNQUFNLENBQUMsQ0FBQztnQkFDcEI7Y0FDRixDQUFDLFNBQVM7Z0JBQ1IsSUFBSXFtRCxpQkFBaUIsRUFBRTtrQkFDckIsTUFBTUMsY0FBYztnQkFDdEI7Y0FDRjtZQUNGO1lBRUEsS0FBSyxJQUFJb1IsSUFBSSxHQUFHLENBQUMsRUFBRUEsSUFBSSxHQUFHblIsV0FBVyxDQUFDZixJQUFJLEVBQUVrUyxJQUFJLEVBQUUsRUFBRTtjQUNsRDdELG9CQUFvQixDQUFDNkQsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNqQzs7WUFFQTtZQUNBL0QsV0FBVyxDQUFDNTBELE9BQU8sQ0FBQyxVQUFVK2tELEdBQUcsRUFBRTtjQUNqQyxJQUFJbnpDLFFBQVEsR0FBR216QyxHQUFHLENBQUNuekMsUUFBUSxDQUFDLENBQUMsQ0FBQ2tJLFlBQVksQ0FBQ21yQyxJQUFJLENBQUM7O2NBRWhEO2NBQ0EsT0FBT3J6QyxRQUFRLENBQUM0MkIsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDdm1DLE1BQU0sSUFBSSxDQUFDLEVBQUU7Z0JBQy9DO2dCQUNBMlAsUUFBUSxHQUFHQSxRQUFRLENBQUM0MkIsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzUyQixRQUFRLENBQUMsQ0FBQyxDQUFDa0ksWUFBWSxDQUFDbXJDLElBQUksQ0FBQztjQUM5RDtjQUNBO2NBQ0E7Y0FDQSxJQUFJN29CLEtBQUssR0FBRyxDQUFDO2NBQ2IsSUFBSWpGLEdBQUcsR0FBR3ZsQixRQUFRLENBQUM0MkIsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDMkMsY0FBYyxDQUFDLENBQUMsQ0FBQ2xwQyxNQUFNO2NBQ2pFMlAsUUFBUSxDQUFDNDJCLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQ3hvQyxPQUFPLENBQUMsVUFBVTQ0RCxJQUFJLEVBQUUvNkQsQ0FBQyxFQUFFO2dCQUN0RCxJQUFJKzZELElBQUksQ0FBQ3p0QixjQUFjLENBQUMsQ0FBQyxDQUFDbHBDLE1BQU0sR0FBR2sxQixHQUFHLEVBQUU7a0JBQ3RDQSxHQUFHLEdBQUd5aEMsSUFBSSxDQUFDenRCLGNBQWMsQ0FBQyxDQUFDLENBQUNscEMsTUFBTTtrQkFDbENtNkIsS0FBSyxHQUFHditCLENBQUM7Z0JBQ1g7Y0FDRixDQUFDLENBQUM7Y0FDRmczRCxjQUFjLENBQUM1YyxHQUFHLENBQUM4TSxHQUFHLENBQUNqekMsRUFBRSxDQUFDLENBQUMsRUFBRUYsUUFBUSxDQUFDNDJCLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQ3BNLEtBQUssQ0FBQyxDQUFDdHFCLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEUsQ0FBQyxDQUFDOztZQUVGO1lBQ0EwMkIsS0FBSyxDQUFDeG9DLE9BQU8sQ0FBQyxVQUFVK2tELEdBQUcsRUFBRTtjQUMzQixJQUFJOFQsUUFBUSxHQUFHLEtBQUssQ0FBQztjQUVyQixJQUFJOVQsR0FBRyxDQUFDd0csUUFBUSxDQUFDLENBQUMsRUFBRXNOLFFBQVEsR0FBR3JSLFdBQVcsQ0FBQ2x2QyxHQUFHLENBQUN1OEMsY0FBYyxDQUFDdjhDLEdBQUcsQ0FBQ3lzQyxHQUFHLENBQUNqekMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyttRCxRQUFRLEdBQUdyUixXQUFXLENBQUNsdkMsR0FBRyxDQUFDeXNDLEdBQUcsQ0FBQ2p6QyxFQUFFLENBQUMsQ0FBQyxDQUFDO2NBRXRIaXpDLEdBQUcsQ0FBQ29CLFlBQVksQ0FBQyxDQUFDLENBQUMzZCxLQUFLLENBQUMsQ0FBQyxDQUFDeG9DLE9BQU8sQ0FBQyxVQUFVMlQsSUFBSSxFQUFFO2dCQUNqRCxJQUFJc3hDLElBQUksQ0FBQ25yQyxZQUFZLENBQUNpckMsR0FBRyxDQUFDcUIsU0FBUyxDQUFDenlDLElBQUksQ0FBQyxDQUFDLENBQUMxUixNQUFNLEdBQUcsQ0FBQyxFQUFFO2tCQUNyRCxJQUFJMFIsSUFBSSxDQUFDNDNDLFFBQVEsQ0FBQyxDQUFDLEVBQUV1SixvQkFBb0IsQ0FBQytELFFBQVEsQ0FBQyxDQUFDajNELElBQUksQ0FBQ2l6RCxjQUFjLENBQUN2OEMsR0FBRyxDQUFDM0UsSUFBSSxDQUFDN0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBS2dqRCxvQkFBb0IsQ0FBQytELFFBQVEsQ0FBQyxDQUFDajNELElBQUksQ0FBQytSLElBQUksQ0FBQzdCLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzdJO2NBQ0YsQ0FBQyxDQUFDO1lBQ0osQ0FBQyxDQUFDO1lBRUYsSUFBSXNDLEtBQUssR0FBRyxTQUFTQSxLQUFLQSxDQUFDc3JCLElBQUksRUFBRTtjQUMvQixJQUFJbTVCLFFBQVEsR0FBR3JSLFdBQVcsQ0FBQ2x2QyxHQUFHLENBQUNvbkIsSUFBSSxDQUFDO2NBQ3BDLElBQUlvNUIsY0FBYyxHQUFHLEtBQUssQ0FBQztjQUMzQjNULFVBQVUsQ0FBQzdzQyxHQUFHLENBQUNvbkIsSUFBSSxDQUFDLENBQUMxL0IsT0FBTyxDQUFDLFVBQVU4UixFQUFFLEVBQUU7Z0JBQ3pDLElBQUl3MkIsRUFBRSxDQUFDdDZCLGNBQWMsQ0FBQzhELEVBQUUsQ0FBQyxDQUFDeTVDLFFBQVEsQ0FBQyxDQUFDLEVBQUV1TixjQUFjLEdBQUdqRSxjQUFjLENBQUN2OEMsR0FBRyxDQUFDeEcsRUFBRSxDQUFDLENBQUMsS0FBS2duRCxjQUFjLEdBQUdobkQsRUFBRTtnQkFFdEdnakQsb0JBQW9CLENBQUMrRCxRQUFRLENBQUMsQ0FBQ2ozRCxJQUFJLENBQUNrM0QsY0FBYyxDQUFDO2dCQUNuRGhFLG9CQUFvQixDQUFDdE4sV0FBVyxDQUFDbHZDLEdBQUcsQ0FBQ3dnRCxjQUFjLENBQUMsQ0FBQyxDQUFDbDNELElBQUksQ0FBQzg5QixJQUFJLENBQUM7Y0FDbEUsQ0FBQyxDQUFDO1lBQ0osQ0FBQztZQUVELElBQUlxNUIsMEJBQTBCLEdBQUcsSUFBSTtZQUNyQyxJQUFJQyxrQkFBa0IsR0FBRyxLQUFLO1lBQzlCLElBQUlDLGVBQWUsR0FBR3gwRCxTQUFTO1lBRS9CLElBQUk7Y0FDRixLQUFLLElBQUl5MEQsVUFBVSxHQUFHL1QsVUFBVSxDQUFDdmlELElBQUksQ0FBQyxDQUFDLENBQUM5RSxNQUFNLENBQUNFLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRW03RCxNQUFNLEVBQUUsRUFBRUosMEJBQTBCLEdBQUcsQ0FBQ0ksTUFBTSxHQUFHRCxVQUFVLENBQUM5M0QsSUFBSSxDQUFDLENBQUMsRUFBRVgsSUFBSSxDQUFDLEVBQUVzNEQsMEJBQTBCLEdBQUcsSUFBSSxFQUFFO2dCQUN4SyxJQUFJcjVCLElBQUksR0FBR3k1QixNQUFNLENBQUN2N0QsS0FBSztnQkFFdkJ3VyxLQUFLLENBQUNzckIsSUFBSSxDQUFDO2NBQ2I7O2NBRUE7WUFDRixDQUFDLENBQUMsT0FBT2w3QixHQUFHLEVBQUU7Y0FDWncwRCxrQkFBa0IsR0FBRyxJQUFJO2NBQ3pCQyxlQUFlLEdBQUd6MEQsR0FBRztZQUN2QixDQUFDLFNBQVM7Y0FDUixJQUFJO2dCQUNGLElBQUksQ0FBQ3UwRCwwQkFBMEIsSUFBSUcsVUFBVSxDQUFDajRELE1BQU0sRUFBRTtrQkFDcERpNEQsVUFBVSxDQUFDajRELE1BQU0sQ0FBQyxDQUFDO2dCQUNyQjtjQUNGLENBQUMsU0FBUztnQkFDUixJQUFJKzNELGtCQUFrQixFQUFFO2tCQUN0QixNQUFNQyxlQUFlO2dCQUN2QjtjQUNGO1lBQ0Y7WUFFQTVELFFBQVEsR0FBRzdOLFdBQVcsQ0FBQ2YsSUFBSTtZQUUzQixJQUFJK0QsY0FBYyxHQUFHLEtBQUssQ0FBQzs7WUFFM0I7WUFDQTtZQUNBLElBQUk2SyxRQUFRLEdBQUcsQ0FBQyxFQUFFO2NBQ2hCO2NBQ0E7Y0FDQWxFLFVBQVUsR0FBR2tFLFFBQVEsR0FBR3o5QixPQUFPLENBQUN1NUIsVUFBVSxHQUFHa0UsUUFBUSxHQUFHejlCLE9BQU8sQ0FBQ3U1QixVQUFVOztjQUUxRTtjQUNBLEtBQUssSUFBSWlJLElBQUksR0FBRyxDQUFDLEVBQUVBLElBQUksR0FBRy9ELFFBQVEsRUFBRStELElBQUksRUFBRSxFQUFFO2dCQUMxQ25FLENBQUMsQ0FBQ21FLElBQUksQ0FBQyxHQUFHLEVBQUU7Y0FDZDtjQUNBLEtBQUssSUFBSUMsSUFBSSxHQUFHLENBQUMsRUFBRUEsSUFBSSxHQUFHbEksVUFBVSxFQUFFa0ksSUFBSSxFQUFFLEVBQUU7Z0JBQzVDbEUsR0FBRyxDQUFDa0UsSUFBSSxDQUFDLEdBQUcsRUFBRTtjQUNoQjs7Y0FFQTs7Y0FFQSxJQUFJemhDLE9BQU8sQ0FBQ3d2QixPQUFPLElBQUksT0FBTyxJQUFJeHZCLE9BQU8sQ0FBQ2k0QixJQUFJLElBQUksS0FBSyxFQUFFO2dCQUN2RHdHLE1BQU0sQ0FBQ25GLFlBQVksQ0FBQztnQkFDcEJ1RSxNQUFNLENBQUMsQ0FBQztnQkFDUitCLGNBQWMsQ0FBQyxDQUFDO2dCQUVoQmhOLGNBQWMsR0FBRztrQkFBRWhELFdBQVcsRUFBRUEsV0FBVztrQkFBRUssT0FBTyxFQUFFQSxPQUFPO2tCQUFFSSxPQUFPLEVBQUVBO2dCQUFRLENBQUM7Y0FDbkYsQ0FBQyxNQUFNO2dCQUNMVCxXQUFXLENBQUN4bkQsT0FBTyxDQUFDLFVBQVVwQyxLQUFLLEVBQUVtRyxHQUFHLEVBQUU7a0JBQ3hDOGpELE9BQU8sQ0FBQ2ptRCxJQUFJLENBQUMwbUMsRUFBRSxDQUFDdDZCLGNBQWMsQ0FBQ2pLLEdBQUcsQ0FBQyxDQUFDMmtDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztrQkFDbER1ZixPQUFPLENBQUNybUQsSUFBSSxDQUFDMG1DLEVBQUUsQ0FBQ3Q2QixjQUFjLENBQUNqSyxHQUFHLENBQUMsQ0FBQzJrQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3BELENBQUMsQ0FBQztnQkFDRjhoQixjQUFjLEdBQUc7a0JBQUVoRCxXQUFXLEVBQUVBLFdBQVc7a0JBQUVLLE9BQU8sRUFBRUEsT0FBTztrQkFBRUksT0FBTyxFQUFFQTtnQkFBUSxDQUFDO2NBQ25GO2NBQ0EsT0FBT3VDLGNBQWM7WUFDdkIsQ0FBQyxNQUFNO2NBQ0wsSUFBSXhzRCxRQUFRLEdBQUd3cEQsV0FBVyxDQUFDNWtELElBQUksQ0FBQyxDQUFDO2NBQ2pDLElBQUlrUyxTQUFTLEdBQUd3ekIsRUFBRSxDQUFDdDZCLGNBQWMsQ0FBQ2hRLFFBQVEsQ0FBQ29ELElBQUksQ0FBQyxDQUFDLENBQUN4RCxLQUFLLENBQUM7Y0FDeEQsSUFBSTA3RCxZQUFZLEdBQUd4a0QsU0FBUyxDQUFDNHpCLFFBQVEsQ0FBQyxDQUFDO2NBQ3ZDLElBQUk2d0IsY0FBYyxHQUFHemtELFNBQVMsQ0FBQ3UyQyxVQUFVLENBQUMsQ0FBQztjQUMzQ3hELE9BQU8sQ0FBQ2ptRCxJQUFJLENBQUMwM0QsWUFBWSxDQUFDbFIsQ0FBQyxDQUFDO2NBQzVCSCxPQUFPLENBQUNybUQsSUFBSSxDQUFDMDNELFlBQVksQ0FBQ2g2RCxDQUFDLENBQUM7Y0FDNUIsSUFBSSsxRCxRQUFRLElBQUksQ0FBQyxFQUFFO2dCQUNqQixJQUFJbUUsVUFBVSxHQUFHbHhCLEVBQUUsQ0FBQ3Q2QixjQUFjLENBQUNoUSxRQUFRLENBQUNvRCxJQUFJLENBQUMsQ0FBQyxDQUFDeEQsS0FBSyxDQUFDO2dCQUN6RCxJQUFJNjdELGVBQWUsR0FBR0QsVUFBVSxDQUFDbk8sVUFBVSxDQUFDLENBQUM7Z0JBQzdDeEQsT0FBTyxDQUFDam1ELElBQUksQ0FBQzAzRCxZQUFZLENBQUNsUixDQUFDLEdBQUdtUixjQUFjLEdBQUcsQ0FBQyxHQUFHRSxlQUFlLEdBQUcsQ0FBQyxHQUFHN2hDLE9BQU8sQ0FBQzIxQixlQUFlLENBQUM7Z0JBQ2pHdEYsT0FBTyxDQUFDcm1ELElBQUksQ0FBQzAzRCxZQUFZLENBQUNoNkQsQ0FBQyxDQUFDO2NBQzlCO2NBRUFrckQsY0FBYyxHQUFHO2dCQUFFaEQsV0FBVyxFQUFFQSxXQUFXO2dCQUFFSyxPQUFPLEVBQUVBLE9BQU87Z0JBQUVJLE9BQU8sRUFBRUE7Y0FBUSxDQUFDO2NBQ2pGLE9BQU91QyxjQUFjO1lBQ3ZCO1VBQ0YsQ0FBQztVQUVEdEksTUFBTSxDQUFDdUIsT0FBTyxHQUFHO1lBQUVrTixjQUFjLEVBQUVBO1VBQWUsQ0FBQzs7VUFFbkQ7UUFBTSxDQUFFOztRQUVSLEtBQU0sR0FBRyxFQUNULEtBQU8sU0FBQW50QyxFQUFDMCtCLE1BQU0sRUFBRThCLHdCQUF3QixFQUFFQyxnQ0FBbUIsRUFBSztVQUlsRSxJQUFJeVYsSUFBSSxHQUFHelYsZ0NBQW1CLENBQUMsR0FBRyxDQUFDOztVQUVuQztVQUNBLElBQUkwVixRQUFRLEdBQUcsU0FBU0EsUUFBUUEsQ0FBQ3R5QixTQUFTLEVBQUU7WUFDMUMsSUFBSSxDQUFDQSxTQUFTLEVBQUU7Y0FDZDtZQUNGLENBQUMsQ0FBQzs7WUFFRkEsU0FBUyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUVxeUIsSUFBSSxDQUFDLENBQUMsQ0FBQztVQUN0QyxDQUFDOztVQUVELElBQUksT0FBT3J5QixTQUFTLEtBQUssV0FBVyxFQUFFO1lBQ3BDO1lBQ0FzeUIsUUFBUSxDQUFDdHlCLFNBQVMsQ0FBQztVQUNyQjtVQUVBNmEsTUFBTSxDQUFDdUIsT0FBTyxHQUFHa1csUUFBUTs7VUFFekI7UUFBTSxDQUFFOztRQUVSLEtBQU0sR0FBRyxFQUNULEtBQU8sU0FBQW4yQyxFQUFDMCtCLE1BQU0sRUFBSztVQUVuQkEsTUFBTSxDQUFDdUIsT0FBTyxHQUFHRSxnQ0FBZ0M7O1VBRWpEO1FBQU07O1FBRU47TUFBVSxDQUFFO01BQ1o7TUFDQSxTQUFVO01BQ1Y7TUFBVSxJQUFJaVcsd0JBQXdCLEdBQUcsQ0FBQyxDQUFDO01BQzNDO01BQ0EsU0FBVTtNQUNWO01BQVUsU0FBUzNWLGdDQUFtQkEsQ0FBQzRWLFFBQVEsRUFBRTtRQUNqRCxTQUFXO1FBQ1gsUUFBVyxJQUFJQyxZQUFZLEdBQUdGLHdCQUF3QixDQUFDQyxRQUFRLENBQUM7UUFDaEU7UUFBVyxJQUFJQyxZQUFZLEtBQUtyMUQsU0FBUyxFQUFFO1VBQzNDLFFBQVksT0FBT3ExRCxZQUFZLENBQUNyVyxPQUFPO1VBQ3ZDO1FBQVc7UUFDWCxTQUFXO1FBQ1g7UUFBVyxJQUFJdkIsTUFBTSxHQUFHMFgsd0JBQXdCLENBQUNDLFFBQVEsQ0FBQyxHQUFHO1VBQzdELFNBQVk7VUFDWixTQUFZO1VBQ1osUUFBWXBXLE9BQU8sRUFBRSxDQUFDO1VBQ3RCO1FBQVcsQ0FBQztRQUNaO1FBQ0EsU0FBVztRQUNYO1FBQVdHLG1CQUFtQixDQUFDaVcsUUFBUSxDQUFDLENBQUMzWCxNQUFNLEVBQUVBLE1BQU0sQ0FBQ3VCLE9BQU8sRUFBRVEsZ0NBQW1CLENBQUM7UUFDckY7UUFDQSxTQUFXO1FBQ1g7UUFBVyxPQUFPL0IsTUFBTSxDQUFDdUIsT0FBTztRQUNoQztNQUFVO01BQ1Y7TUFDQTtNQUNBO01BQ0EsU0FBVTtNQUNWLFNBQVU7TUFDVixTQUFVO01BQ1Y7TUFBVSxJQUFJc1csMEJBQW1CLEdBQUc5VixnQ0FBbUIsQ0FBQyxHQUFHLENBQUM7TUFDNUQ7TUFDQTtNQUFVLE9BQU84ViwwQkFBbUI7TUFDcEM7SUFBUyxDQUFDLENBQUU7RUFBQztBQUViLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMWdERixJQUFRcjhELENBQUEsR0FBOEROLDBEQUFoRTtFQUFVK0IsQ0FBQSxHQUFzRC9CLHlEQUFoRTtFQUFpQmlDLENBQUEsR0FBK0NqQywwREFBaEU7RUFBeUJXLENBQUEsR0FBdUNYLDBEQUFoRTtFQUFpQ1MsQ0FBQSxHQUErQlQsd0RBQWhFO0VBQXVDQyxDQUFBLEdBQXlCRCw2REFBaEU7RUFBa0RhLENBQUEsR0FBY2IsdURBQWhFO0VBQXVEZSxDQUFBLEdBQVNmLHdEQUFoRTtFQUVZc0MsQ0FBQSxHQUFHO0lBSW5Cb1MsRUFBQSxFQUFJcFUsQ0FBQTtJQU1KbU0sU0FBQSxFQUFXbk0sQ0FBQTtJQU1YaXNDLEtBQUEsRUFBT3RzQyxDQUFBLENBQVUsQ0FBQ0ssQ0FBQSxFQUFRMkIsQ0FBQTtJQWdCMUI0a0MsUUFBQSxFQUFVNW1DLENBQUEsQ0FBVSxDQUFDOEIsQ0FBQSxFQUFPbEIsQ0FBQTtJQW9CNUJ1bEMsVUFBQSxFQUFZbm1DLENBQUEsQ0FBVSxDQUFDOEIsQ0FBQSxFQUFPbEIsQ0FBQTtJQXFDOUIySixNQUFBLEVBQVF2SyxDQUFBLENBQVUsQ0FBQ2dDLENBQUEsRUFBUXBCLENBQUE7SUFPM0I0cUMsR0FBQSxFQUFLeHJDLENBQUEsQ0FBVSxDQUFDZ0MsQ0FBQSxFQUFRcEIsQ0FBQTtJQU94QjJxQyxJQUFBLEVBQU03cUMsQ0FBQTtJQU9OaThELGNBQUEsRUFBZ0JuOEQsQ0FBQTtJQU9oQm84RCxrQkFBQSxFQUFvQnA4RCxDQUFBO0lBT3BCcThELE9BQUEsRUFBU244RCxDQUFBO0lBT1RvOEQsT0FBQSxFQUFTcDhELENBQUE7SUFPVHE4RCxjQUFBLEVBQWdCdjhELENBQUE7SUFPaEJ3OEQsa0JBQUEsRUFBb0J4OEQsQ0FBQTtJQU9wQnk4RCxtQkFBQSxFQUFxQno4RCxDQUFBO0lBUXJCMDhELGFBQUEsRUFBZTE4RCxDQUFBO0lBT2YyOEQsUUFBQSxFQUFVMzhELENBQUE7SUFPVjQ4RCxlQUFBLEVBQWlCNThELENBQUE7SUFPakJ5YSxHQUFBLEVBQUtuYSxDQUFBO0lBTUx1OEQsTUFBQSxFQUFRdjhELENBQUE7SUFPUjh2QixJQUFBLEVBQU05dkIsQ0FBQTtJQU1ONkIsT0FBQSxFQUFTN0IsQ0FBQTtJQVFUbXFDLEVBQUEsRUFBSW5xQyxDQUFBO0lBT0p3OEQsUUFBQSxFQUFVOThELENBQUE7SUFPVis4RCxZQUFBLEVBQWMvOEQsQ0FBQTtJQU9kZzlELG1CQUFBLEVBQXFCaDlELENBQUE7SUFPckJpOUQsaUJBQUEsRUFBbUJqOUQsQ0FBQTtJQU9uQms5RCxVQUFBLEVBQVlsOUQsQ0FBQTtJQVFabTlELGlCQUFBLEVBQW1CajlELENBQUE7SUFXbkJrOUQsZ0JBQUEsRUFBa0JsOUQsQ0FBQTtJQU9sQm05RCxVQUFBLEVBQVk3OUQsQ0FBQSxDQUFVLENBQUNLLENBQUEsRUFBUTJCLENBQUE7RUFBQTtFQzNRcEJJLENBQUEsR0FBaUIsU0FBakJBLEVBQWtCdEMsQ0FBQSxFQUFHQyxDQUFBO0lBQ2hDLElBUGtCLFVBQUNELENBQUEsRUFBR0MsQ0FBQTtNQUFBLE9BQVcsUUFBTEQsQ0FBQSxJQUFrQixRQUFMQyxDQUFBO0lBQUEsRUFPekJELENBQUEsRUFBR0MsQ0FBQSxNQUFhLFFBQUxELENBQUEsSUFBa0IsUUFBTEMsQ0FBQSxHQUN0QyxRQUNEO0lBRUQsSUFBSUQsQ0FBQSxLQUFNQyxDQUFBLEVBRVIsUUFDRDtJQUdELElBQWlCLG1CQUFBRCxDQUFBLElBQXlCLG1CQUFBQyxDQUFBLEVBQ3hDLE9BQVFELENBQUEsS0FBS0MsQ0FBQTtJQUdmLElBQUFJLENBQUEsR0FBY0YsTUFBQSxDQUFPc0YsSUFBQSxDQUFLekYsQ0FBQTtNQUNwQk8sQ0FBQSxHQUFRSixNQUFBLENBQU9zRixJQUFBLENBQUt4RixDQUFBO01BQ1YrQixDQUFBLEdBQUksU0FBSkEsRUFBSTNCLENBQUE7UUFBQSxPQUFRTCxDQUFBLENBQUVLLENBQUEsTUFBU0osQ0FBQSxDQUFFSSxDQUFBO01BQUE7SUFFekMsT0FBSUEsQ0FBQSxDQUFNeUUsTUFBQSxLQUFXdkUsQ0FBQSxDQUFNdUUsTUFBQSxPQUl2QnpFLENBQUEsQ0FBTTh2QixJQUFBLENBQUtudUIsQ0FBQSxNQUFlekIsQ0FBQSxDQUFNNHZCLElBQUEsQ0FBS251QixDQUFBO0VBQUE7RUM3QjNCZzhELENBQUEsR0FBRyxTQUFIQSxFQUFJaCtELENBQUEsRUFBS0MsQ0FBQTtJQUFBLE9BQWdCLFFBQVBELENBQUEsR0FBY0EsQ0FBQSxDQUFJQyxDQUFBLElBQU87RUFBQTtFQzJCOUNrQyxDQUFBLEdBQVc7SUFDdEIydUIsSUFBQSxFQUFNeHVCLENBQUE7SUFDTjZZLEdBQUEsRUFBQTZpRCxDQUFBO0lBQ0FULE1BQUEsRUQ1QnFCLFNBQUFBLE9BQUF2OUQsQ0FBQTtNQUFBLE9BQVFBLENBQUE7SUFBQTtJQzZCN0I2QyxPQUFBLEVEM0JxQixTQUFBQSxRQUFDN0MsQ0FBQSxFQUFLQyxDQUFBO01BQUEsT0FBYUQsQ0FBQSxDQUFJNkMsT0FBQSxDQUFRNUMsQ0FBQTtJQUFBO0lDNEJwRDZtQyxRQUFBLEVBM0JzQixDQUN0QjtNQUFFM2YsSUFBQSxFQUFNO1FBQUV4UyxFQUFBLEVBQUk7UUFBSzB5QixLQUFBLEVBQU87TUFBQTtJQUFBLEdBQzFCO01BQUVsZ0IsSUFBQSxFQUFNO1FBQUV4UyxFQUFBLEVBQUk7UUFBSzB5QixLQUFBLEVBQU87TUFBQTtJQUFBLEdBQzFCO01BQUVsZ0IsSUFBQSxFQUFNO1FBQUV4UyxFQUFBLEVBQUk7UUFBSzZ5QixNQUFBLEVBQVE7UUFBS2hLLE1BQUEsRUFBUTtNQUFBO0lBQUE7SUF5QnhDNkksVUFBQSxFQXRCd0IsQ0FDeEI7TUFDRW9ILFFBQUEsRUFBVTtNQUNWakIsS0FBQSxFQUFPO1FBQ0xuRixLQUFBLEVBQU87TUFBQTtJQUFBO0lBbUJYb0UsSUFBQSxFQWRrQjtJQWVsQkMsR0FBQSxFQWJpQjtNQUNqQnVmLENBQUEsRUFBRztNQUNIOW9ELENBQUEsRUFBRztJQUFBO0VBQUE7RUNyQkNKLENBQUEsR0FBYyxTQUFkQSxFQUFlL0IsQ0FBQSxFQUFPQyxDQUFBLEVBQU9JLENBQUEsRUFBTUUsQ0FBQTtJQUFBLE9BQ3ZDRixDQUFBLENBQUsyOUQsQ0FBQSxDQUFNaCtELENBQUEsRUFBT08sQ0FBQSxHQUFNeTlELENBQUEsQ0FBTS85RCxDQUFBLEVBQU9NLENBQUE7RUFBQTtFQUVyQm1oQixDQUFBLEdBQUcsU0FBSEEsRUFBSTFoQixDQUFBLEVBQUlDLENBQUEsRUFBT0ksQ0FBQSxFQUFPRSxDQUFBLEVBQU15QixDQUFBLEVBQVFFLENBQUEsRUFBS3RCLENBQUE7SUFDekRaLENBQUEsQ0FBR3NJLEtBQUEsQ0FBTTtNQUFBLENBS0wvSCxDQUFBLEtBQVMrQixDQUFBLElBQ1RQLENBQUEsQ0FBWTlCLENBQUEsRUFBT0ksQ0FBQSxFQUFPRSxDQUFBLEVBQU0sZ0JBRWhDMHFELENBQUEsQ0FDRWpyRCxDQUFBLEVBQ0FnK0QsQ0FBQSxDQUFNLzlELENBQUEsRUFBTyxhQUNiKzlELENBQUEsQ0FBTTM5RCxDQUFBLEVBQU8sYUFDYjJCLENBQUEsRUFDQUUsQ0FBQSxFQUNBdEIsQ0FBQSxFQUNBTCxDQUFBLEdBSUF3QixDQUFBLENBQVk5QixDQUFBLEVBQU9JLENBQUEsRUFBT0UsQ0FBQSxFQUFNLGlCQUNsQzA5RCxDQUFBLENBQ0VqK0QsQ0FBQSxFQUNBZytELENBQUEsQ0FBTS85RCxDQUFBLEVBQU8sZUFDYis5RCxDQUFBLENBQU0zOUQsQ0FBQSxFQUFPLGVBQ2IyQixDQUFBLEdBSUosQ0FFRSxRQUNBLFdBQ0EsV0FDQSxrQkFDQSxzQkFDQSxPQUNBLGtCQUNBLHNCQUNBLHVCQUNBLGlCQUNBLFlBQ0EsbUJBQ0FhLE9BQUEsQ0FBUyxVQUFBWCxDQUFBO1FBQ0xILENBQUEsQ0FBWTlCLENBQUEsRUFBT0ksQ0FBQSxFQUFPRSxDQUFBLEVBQU0yQixDQUFBLEtBQ2xDRCxDQUFBLENBQVVqQyxDQUFBLEVBQUlrQyxDQUFBLEVBQUs4N0QsQ0FBQSxDQUFNLzlELENBQUEsRUFBT2lDLENBQUEsR0FBTTg3RCxDQUFBLENBQU0zOUQsQ0FBQSxFQUFPNkIsQ0FBQSxHQUFNRixDQUFBLENBQzFEO01BQUEsRUFFSjtJQUFBLElBRUdELENBQUEsQ0FBWTlCLENBQUEsRUFBT0ksQ0FBQSxFQUFPRSxDQUFBLEVBQU0sYUFDbENvQyxDQUFBLENBQVkzQyxDQUFBLEVBQUlnK0QsQ0FBQSxDQUFNLzlELENBQUEsRUFBTyxXQUFXKzlELENBQUEsQ0FBTTM5RCxDQUFBLEVBQU8sV0FBVzJCLENBQUEsQ0FDakU7RUFBQTtFQUdZQyxDQUFBLEdBQUcsU0FBSEEsRUFBSWpDLENBQUEsRUFBSUMsQ0FBQSxFQUFLSSxDQUFBLEVBQU1FLENBQUEsRUFBTXlCLENBQUE7SUFDdENoQyxDQUFBLENBQUdDLENBQUEsRUFBSytCLENBQUEsQ0FBT3pCLENBQUE7RUFBQTtFQUFBb0MsQ0FBQSxHQUdHLFNBSEhBLEVBR0kzQyxDQUFBLEVBQUlDLENBQUEsRUFBU0ksQ0FBQSxFQUFTRSxDQUFBO0lBQ3pDLElBQUF5QixDQUFBLEdBQW1CekIsQ0FBQSxDQUFPRixDQUFBO0lBRVIsUUFBZDJCLENBQUEsSUFDRmhDLENBQUEsQ0FBR3lLLE1BQUEsQ0FBT3pJLENBQUEsRUFBWW95RCxHQUFBLEVBQ3ZCO0VBQUE7RUFBQTZKLENBQUEsR0FHZ0IsU0FIaEJBLEVBR2lCaitELENBQUEsRUFBSUMsQ0FBQSxFQUFRSSxDQUFBLEVBQVFFLENBQUE7SUFDdEMsSUFBQXlCLENBQUEsR0FBY2hDLENBQUEsQ0FBR3dzQyxLQUFBO0lBRUosUUFBVHhxQyxDQUFBLElBSUpBLENBQUEsQ0FBTWs4RCxRQUFBLENBQVMzOUQsQ0FBQSxDQUFPRixDQUFBLEdBQVN5K0MsTUFBQSxFQUEvQjtFQUFBO0VBQUFtTSxDQUFBLEdBR29CLFNBSHBCQSxFQUdxQmpyRCxDQUFBLEVBQUlDLENBQUEsRUFBT0ksQ0FBQSxFQUFPRSxDQUFBLEVBQVF5QixDQUFBLEVBQUtFLENBQUEsRUFBU3RCLENBQUE7SUFDN0QsSUFBQUYsQ0FBQSxHQUFjO01BQ1JSLENBQUEsR0FBT0YsQ0FBQSxDQUFHa3VDLFVBQUE7TUFBQXB0QyxDQUFBLEdBQ0E7TUFDVkUsQ0FBQSxHQUFXO01BQ1h1QixDQUFBLEdBQVcsQ0FBakI7TUFJTUQsQ0FBQSxHQUFTLFNBQVRBLEVBQVN0QyxDQUFBO1FBQUEsT0FBUWdDLENBQUEsQ0FBSUEsQ0FBQSxDQUFJaEMsQ0FBQSxFQUFLLFNBQVM7TUFBQTtJQUU3Q2tDLENBQUEsQ0FBUTdCLENBQUEsRUFBUSxVQUFBTCxDQUFBO01BQ2QsSUFBUUMsQ0FBQSxHQUFHcUMsQ0FBQSxDQUFNdEMsQ0FBQTtNQUVqQnVDLENBQUEsQ0FBU3RDLENBQUEsSUFBTUQsQ0FBQTtJQUFBLElBR0osUUFBVEMsQ0FBQSxJQUNGaUMsQ0FBQSxDQUFRakMsQ0FBQSxFQUFRLFVBQUFBLENBQUE7TUFDZCxJQUFNSSxDQUFBLEdBQUtpQyxDQUFBLENBQU1yQyxDQUFBO01BRWpCZSxDQUFBLENBQVNYLENBQUEsSUFBTUosQ0FBQSxFQWRDLFVBQUFELENBQUE7UUFBQSxPQUF1QixRQUFoQnVDLENBQUEsQ0FBU3ZDLENBQUE7TUFBQSxFQWdCaEJLLENBQUEsS0FDZEgsQ0FBQSxDQUFLb3VDLEtBQUEsQ0FBTXR1QyxDQUFBLENBQUc2USxjQUFBLENBQWV4USxDQUFBLEVBQzlCO0lBQUEsSUFJTDZCLENBQUEsQ0FBUTdCLENBQUEsRUFBUSxVQUFBTCxDQUFBO01BQ2QsSUFBQUMsQ0FBQSxHQUFXcUMsQ0FBQSxDQUFNdEMsQ0FBQTtRQUNYSyxDQUFBLEdBdkJTLFVBQUFMLENBQUE7VUFBQSxPQUFPZ0IsQ0FBQSxDQUFTaEIsQ0FBQTtRQUFBLEVBdUJWQyxDQUFBO01BekJILFdBQUFELENBQUE7UUFBQSxPQUF1QixRQUFoQmdCLENBQUEsQ0FBU2hCLENBQUE7TUFBQSxHQTJCbkJDLENBQUEsSUFDYmEsQ0FBQSxDQUFRMkQsSUFBQSxDQUFLO1FBQUUwNUQsSUFBQSxFQUFBOTlELENBQUE7UUFBTW83RCxJQUFBLEVBQUF6N0Q7TUFBQSxLQUVyQlUsQ0FBQSxDQUFNK0QsSUFBQSxDQUFLbEUsQ0FBQSxDQUFPUCxDQUFBLEVBQ25CO0lBQUEsSUFHQ0UsQ0FBQSxDQUFLNEUsTUFBQSxHQUFTLEtBQ2hCOUUsQ0FBQSxDQUFHd1IsTUFBQSxDQUFPdFIsQ0FBQSxHQUdSUSxDQUFBLENBQU1vRSxNQUFBLEdBQVMsS0FDakI5RSxDQUFBLENBQUd1UixHQUFBLENBQUk3USxDQUFBLEdBR1RJLENBQUEsQ0FBUStCLE9BQUEsQ0FBUSxVQUFBd04sSUFBQTtNQUFBLElBQUdwUSxDQUFBLEdBQUFvUSxJQUFBLENBQUE4dEQsSUFBQTtRQUFNOTlELENBQUEsR0FBQWdRLElBQUEsQ0FBQW9yRCxJQUFBO01BQUEsT0FDdkIyQyxDQUFBLENBQWFwK0QsQ0FBQSxFQUFJQyxDQUFBLEVBQU1JLENBQUEsRUFBTUUsQ0FBQSxFQUFReUIsQ0FBQSxFQUFLcEIsQ0FBQTtJQUFBLEVBRTdDO0VBQUE7RUFBQXc5RCxDQUFBLEdBRW9CLFNBRnBCQSxFQUVxQnArRCxDQUFBLEVBQUlDLENBQUEsRUFBTUksQ0FBQSxFQUFNRSxDQUFBLEVBQVF5QixDQUFBLEVBQUtFLENBQUE7SUFDakQsSUFBUXRCLENBQUEsR0FBR29CLENBQUEsQ0FBSUEsQ0FBQSxDQUFJM0IsQ0FBQSxFQUFNLFNBQVM7TUFDNUJLLENBQUEsR0FBUVYsQ0FBQSxDQUFHNlEsY0FBQSxDQUFlalEsQ0FBQTtNQUNyQlYsQ0FBQSxHQUFHO0lBQ0csQ0FDZixRQUNBLFlBQ0EsWUFDQSxjQUNBLFVBQ0EsYUFDQSxXQUdPMkMsT0FBQSxDQUFTLFVBQUE3QyxDQUFBO01BQ2hCLElBQUFZLENBQUEsR0FBY29CLENBQUEsQ0FBSTNCLENBQUEsRUFBTUwsQ0FBQTtNQUVwQmtDLENBQUEsQ0FBS3RCLENBQUEsRUFBT29CLENBQUEsQ0FBSS9CLENBQUEsRUFBTUQsQ0FBQSxPQUN4QkUsQ0FBQSxDQUFNRixDQUFBLElBQU9PLENBQUEsQ0FBT0ssQ0FBQSxFQUNyQjtJQUFBO0lBR0gsSUFBTUUsQ0FBQSxHQUFXa0IsQ0FBQSxDQUFJM0IsQ0FBQSxFQUFNO0lBQ3ZCNkIsQ0FBQSxDQUFLcEIsQ0FBQSxFQUFVa0IsQ0FBQSxDQUFJL0IsQ0FBQSxFQUFNLGVBQzNCUyxDQUFBLENBQU0yOUQsT0FBQSxDQUFROTlELENBQUEsQ0FBT08sQ0FBQSxJQUduQlgsTUFBQSxDQUFPc0YsSUFBQSxDQUFLdkYsQ0FBQSxFQUFPNEUsTUFBQSxHQUFTLEtBQzlCcEUsQ0FBQSxDQUFNMmEsSUFBQSxDQUFLbmIsQ0FBQSxDQUNaO0VBQUE7QUFBQSxJQzNKWXlxRCxDQUFBLDBCQUFBMlQsWUFBQTtFQUFBeHZELFNBQUEsQ0FBQTY3QyxDQUFBLEVBQUEyVCxZQUFBO0VBQUEsSUFBQXZ2RCxNQUFBLEdBQUFDLFlBQUEsQ0FBQTI3QyxDQUFBO0VBNkJiLFNBQUFBLEVBQVkxcUQsQ0FBQTtJQUFBLElBQUFnUCxLQUFBO0lBQUFDLGVBQUEsT0FBQXk3QyxDQUFBO0lBQ1YxN0MsS0FBQSxHQUFBRixNQUFBLENBQUFqTixJQUFBLE9BQU03QixDQUFBLEdBQ05nUCxLQUFBLENBQUtsSyxXQUFBLEdBQWMsc0JBQ25Ca0ssS0FBQSxDQUFLc3ZELFlBQUEsR0FBZXYrRCxzREFBTSxFQUMzQjtJQUFBLE9BQUFpUCxLQUFBO0VBQUE7RUFFRE8sWUFBQSxDQUFBbTdDLENBQUE7SUFBQS9qRCxHQUFBO0lBQUFuRyxLQUFBLFdBQUEwa0Msa0JBQUE7TUFDUSxJQUFBbmxDLENBQUEsR0FBWSxLQUFLdStELFlBQUEsQ0FBYXZ6RCxPQUFBO1FBQUE0SyxXQUFBLEdBWWhDLEtBQUt4TCxLQUFBO1FBVFBuSyxDQUFBLEdBQUEyVixXQUFBLENBREk2b0QsTUFBQTtRQUVKbCtELENBQUEsR0FBQXFWLFdBQUEsQ0FGSTRuRCxRQUFBO1FBR0p4N0QsQ0FBQSxHQUFBNFQsV0FBQSxDQUhJNm5ELFlBQUE7UUFJSnY3RCxDQUFBLEdBQUEwVCxXQUFBLENBSkk4bkQsbUJBQUE7UUFLSjk4RCxDQUFBLEdBQUFnVixXQUFBLENBTEkrbkQsaUJBQUE7UUFNSmo5RCxDQUFBLEdBQUFrVixXQUFBLENBTklnb0QsVUFBQTtRQU9KMTlELENBQUEsR0FBQTBWLFdBQUEsQ0FQSWlvRCxpQkFBQTtRQVFKLzhELENBQUEsR0FBQThVLFdBQUEsQ0FSSWtvRCxnQkFBQTtRQVNKOThELENBQUEsR0FBQTRVLFdBQUEsQ0FUSW1vRCxVQUFBO1FBWUV4N0QsQ0FBQSxHQUFJLEtBQUttOEQsR0FBQSxHQUFNLElBQUlyK0Qsa0RBQUEsQ0FBVTtVQUNuQ3NRLFNBQUEsRUFBQTNRLENBQUE7VUFDQXc5RCxRQUFBLEVBQUFqOUQsQ0FBQTtVQUNBazlELFlBQUEsRUFBQXo3RCxDQUFBO1VBQ0EwN0QsbUJBQUEsRUFBQXg3RCxDQUFBO1VBQ0F5N0QsaUJBQUEsRUFBQS84RCxDQUFBO1VBQ0FnOUQsVUFBQSxFQUFBbDlELENBQUE7VUFDQW05RCxpQkFBQSxFQUFBMzlELENBQUE7VUFDQTQ5RCxnQkFBQSxFQUFBaDlELENBQUE7VUFDQWk5RCxVQUFBLEVBQUEvOEQ7UUFBQTtNQUdFZixDQUFBLEtBQ0ZnTSxNQUFBLENBQU9oTSxDQUFBLElBQVVzQyxDQUFBLEdBR25CLEtBQUtvOEQsZUFBQSxDQUFnQixNQUFNLEtBQUt2MEQsS0FBQSxDQUNqQztJQUFBO0VBRUQ7SUFBQXhELEdBQUE7SUFBQW5HLEtBQUEsV0FBQWsrRCxnQkFBZ0IzK0QsQ0FBQSxFQUFXQyxDQUFBO01BQ2pCLElBQUFJLENBQUEsR0FBRyxLQUFLcStELEdBQUE7UUFDUm4rRCxDQUFBLEdBQStCTixDQUFBLENBQWpDNndCLElBQUE7UUFBUTl1QixDQUFBLEdBQXlCL0IsQ0FBQSxDQUFqQ3M5RCxNQUFBO1FBQWdCcjdELENBQUEsR0FBaUJqQyxDQUFBLENBQWpDa2IsR0FBQTtRQUFxQnZhLENBQUEsR0FBWVgsQ0FBQSxDQUFqQzRDLE9BQUE7TUFFTjZlLENBQUEsQ0FBTXJoQixDQUFBLEVBQUlMLENBQUEsRUFBV0MsQ0FBQSxFQUFVTSxDQUFBLEVBQU15QixDQUFBLEVBQVFFLENBQUEsRUFBS3RCLENBQUEsR0FFL0IsUUFBZlgsQ0FBQSxDQUFTa3JDLEVBQUEsSUFDWGxyQyxDQUFBLENBQVNrckMsRUFBQSxDQUFHOXFDLENBQUEsQ0FFZjtJQUFBO0VBRUQ7SUFBQXVHLEdBQUE7SUFBQW5HLEtBQUEsV0FBQXVqQyxtQkFBbUJoa0MsQ0FBQTtNQUNqQixLQUFLMitELGVBQUEsQ0FBZ0IzK0QsQ0FBQSxFQUFXLEtBQUtvSyxLQUFBLENBQ3RDO0lBQUE7RUFFRDtJQUFBeEQsR0FBQTtJQUFBbkcsS0FBQSxXQUFBNmtDLHFCQUFBO01BQ0UsS0FBS281QixHQUFBLENBQUlFLE9BQUEsRUFDVjtJQUFBO0VBRUQ7SUFBQWg0RCxHQUFBO0lBQUFuRyxLQUFBLFdBQUFxUCxPQUFBO01BQ0UsSUFBQWdILFlBQUEsR0FBaUMsS0FBSzFNLEtBQUE7UUFBOUJuSyxDQUFBLEdBQUE2VyxZQUFBLENBQUZuQyxFQUFBO1FBQU10VSxDQUFBLEdBQUF5VyxZQUFBLENBQU5wSyxTQUFBO1FBQWlCbk0sQ0FBQSxHQUFBdVcsWUFBQSxDQUFqQjAxQixLQUFBO01BRU4sT0FBWXhzQywwREFBQyxDQUFjLE9BQU87UUFDaENtdEMsR0FBQSxFQUFLLEtBQUtveEIsWUFBQTtRQUNWNXBELEVBQUEsRUFBQTFVLENBQUE7UUFDQXlNLFNBQUEsRUFBQXJNLENBQUE7UUFDQW1zQyxLQUFBLEVBQUFqc0M7TUFBQSxFQUVIO0lBQUE7RUFBQTtJQUFBcUcsR0FBQTtJQUFBdVUsR0FBQSxFQWpHbUQsU0FBQUEsSUFBQTtNQUVsRCxPQUNENVksQ0FBQTtJQUFBO0VBRVU7SUFBQXFFLEdBQUE7SUFBQXVVLEdBQUEsV0FBQUEsSUFBQTtNQUNULE9BQ0RoWixDQUFBO0lBQUE7RUFFdUI7SUFBQXlFLEdBQUE7SUFBQW5HLEtBQUEsV0FBQW8rRCxrQkFBQzcrRCxDQUFBO01BR3ZCLElBRm1DLFFBQW5CQSxDQUFBLENBQVM4RSxNQUFBLEVBR3ZCLE9BQUE5RSxDQUFBO01BQ0s7UUFDTCxJQUFNQyxFQUFBLEdBQWlCRCxDQUFBLENBQW5CcXJDLEtBQUE7VUFBU2hyQyxFQUFBLEdBQVVMLENBQUEsQ0FBbkJtdUMsS0FBQTtRQVVKLE9BUmEsUUFBVGx1QyxFQUFBLEtBQ0ZBLEVBQUEsR0FBUSxLQUdHLFFBQVRJLEVBQUEsS0FDRkEsRUFBQSxHQUFRLEtBR0hKLEVBQUEsQ0FBTWtNLE1BQUEsQ0FBTzlMLEVBQUEsQ0FDckI7TUFBQTtJQUNGO0VBRUQ7RUFBQSxPQUFBc3FELENBQUE7QUFBQSxFQTdCbUQzcUQsd0RBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1Z2QjtBQUMvQixJQUFNOCtELFVBQVUsR0FBR24rRCxNQUFNLENBQUNvK0QsR0FBRyxzQkFBc0IsQ0FBQztBQUNwRCxJQUFNQyxFQUFFLEdBQUcsT0FBT0MsVUFBVSxLQUFLLFdBQVcsR0FBR0EsVUFBVSxHQUN6RDtBQUNBLENBQUMsQ0FBQztBQUVGLFNBQVNDLFVBQVVBLENBQUEsRUFBRztFQUNwQixJQUFJQyxjQUFjO0VBRWxCLElBQUksQ0FBQ3oyRCxnREFBbUIsRUFBRSxPQUFPLENBQUMsQ0FBQztFQUNuQyxJQUFNMDJELFVBQVUsR0FBRyxDQUFDRCxjQUFjLEdBQUdILEVBQUUsQ0FBQ0YsVUFBVSxDQUFDLEtBQUssSUFBSSxHQUFHSyxjQUFjLEdBQUdILEVBQUUsQ0FBQ0YsVUFBVSxDQUFDLEdBQUcsSUFBSTlKLEdBQUcsQ0FBQyxDQUFDO0VBQzFHLElBQUlxSyxXQUFXLEdBQUdELFVBQVUsQ0FBQ2prRCxHQUFHLENBQUN6UyxnREFBbUIsQ0FBQztFQUVyRCxJQUFJLENBQUMyMkQsV0FBVyxFQUFFO0lBQ2hCQSxXQUFXLEdBQUczMkQsZ0RBQW1CLENBQUMsSUFBSSxDQUFDO0lBRXZDLElBQUk4N0MsSUFBcUMsRUFBRTtNQUN6QzZhLFdBQVcsQ0FBQ3Q2RCxXQUFXLEdBQUcsWUFBWTtJQUN4QztJQUVBcTZELFVBQVUsQ0FBQ3RrQixHQUFHLENBQUNweUMsZ0RBQW1CLEVBQUUyMkQsV0FBVyxDQUFDO0VBQ2xEO0VBRUEsT0FBT0EsV0FBVztBQUNwQjtBQUVPLElBQU1DLGlCQUFpQixHQUFHLGFBQWFKLFVBQVUsQ0FBQyxDQUFDO0FBQzFELCtEQUFlSSxpQkFBaUI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM0JEO0FBQ2U7QUFDYTtBQUNvQjtBQUUvRSxTQUFTM3lELFFBQVFBLENBQUEwRCxJQUFBLEVBT2Q7RUFBQSxJQU5EQyxLQUFLLEdBQUFELElBQUEsQ0FBTEMsS0FBSztJQUNMNEUsT0FBTyxHQUFBN0UsSUFBQSxDQUFQNkUsT0FBTztJQUNQVCxRQUFRLEdBQUFwRSxJQUFBLENBQVJvRSxRQUFRO0lBQ1JnckQsV0FBVyxHQUFBcHZELElBQUEsQ0FBWG92RCxXQUFXO0lBQUFDLG1CQUFBLEdBQUFydkQsSUFBQSxDQUNYc3ZELGNBQWM7SUFBZEEsY0FBYyxHQUFBRCxtQkFBQSxjQUFHLE1BQU0sR0FBQUEsbUJBQUE7SUFBQUUsY0FBQSxHQUFBdnZELElBQUEsQ0FDdkJ3dkQsU0FBUztJQUFUQSxTQUFTLEdBQUFELGNBQUEsY0FBRyxNQUFNLEdBQUFBLGNBQUE7RUFFbEIsSUFBTUUsWUFBWSxHQUFHcDNELDBDQUFhLENBQUMsWUFBTTtJQUN2QyxJQUFNcTNELFlBQVksR0FBR1IsdUVBQWtCLENBQUNqdkQsS0FBSyxDQUFDO0lBQzlDLE9BQU87TUFDTEEsS0FBSztNQUNMeXZELFlBQVk7TUFDWkMsY0FBYyxFQUFFUCxXQUFXLEdBQUc7UUFBQSxPQUFNQSxXQUFXO01BQUEsSUFBR240RCxTQUFTO01BQzNEcTRELGNBQWM7TUFDZEU7SUFDRixDQUFDO0VBQ0gsQ0FBQyxFQUFFLENBQUN2dkQsS0FBSyxFQUFFbXZELFdBQVcsRUFBRUUsY0FBYyxFQUFFRSxTQUFTLENBQUMsQ0FBQztFQUNuRCxJQUFNSSxhQUFhLEdBQUd2M0QsMENBQWEsQ0FBQztJQUFBLE9BQU00SCxLQUFLLENBQUMrQixRQUFRLENBQUMsQ0FBQztFQUFBLEdBQUUsQ0FBQy9CLEtBQUssQ0FBQyxDQUFDO0VBQ3BFa3ZELDJGQUF5QixDQUFDLFlBQU07SUFDOUIsSUFDRU8sWUFBWSxHQUNWRCxZQUFZLENBRGRDLFlBQVk7SUFFZEEsWUFBWSxDQUFDRyxhQUFhLEdBQUdILFlBQVksQ0FBQ0ksZ0JBQWdCO0lBQzFESixZQUFZLENBQUNLLFlBQVksQ0FBQyxDQUFDO0lBRTNCLElBQUlILGFBQWEsS0FBSzN2RCxLQUFLLENBQUMrQixRQUFRLENBQUMsQ0FBQyxFQUFFO01BQ3RDMHRELFlBQVksQ0FBQ0ksZ0JBQWdCLENBQUMsQ0FBQztJQUNqQztJQUVBLE9BQU8sWUFBTTtNQUNYSixZQUFZLENBQUNNLGNBQWMsQ0FBQyxDQUFDO01BQzdCTixZQUFZLENBQUNHLGFBQWEsR0FBRzU0RCxTQUFTO0lBQ3hDLENBQUM7RUFDSCxDQUFDLEVBQUUsQ0FBQ3c0RCxZQUFZLEVBQUVHLGFBQWEsQ0FBQyxDQUFDO0VBQ2pDLElBQU14K0QsT0FBTyxHQUFHeVQsT0FBTyxJQUFJb3FELHVEQUFpQixDQUFDLENBQUM7O0VBRTlDLE9BQU8sYUFBYTUyRCxnREFBbUIsQ0FBQ2pILE9BQU8sQ0FBQ2tMLFFBQVEsRUFBRTtJQUN4RGxNLEtBQUssRUFBRXEvRDtFQUNULENBQUMsRUFBRXJyRCxRQUFRLENBQUM7QUFDZDtBQUVBLCtEQUFlOUgsUUFBUTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDL0NtQztBQUMwQztBQUNwRyxJQUFNazJDLFNBQVMsR0FBRyxDQUFDLHdCQUF3QixDQUFDOztBQUU1QztBQUNtRDtBQUNwQjtBQUNrQztBQUNEO0FBQ1U7QUFDTjtBQUNWO0FBQ0M7QUFDb0I7QUFDOUI7QUFDVjtBQUNPO0FBQ2lCO0FBQy9ELElBQUlvZSxvQkFBb0IsR0FBR0Qsd0VBQWM7QUFDbEMsSUFBTUUsaUJBQWlCLEdBQUcsU0FBcEJBLGlCQUFpQkEsQ0FBR2w2RCxFQUFFLEVBQUk7RUFDckNpNkQsb0JBQW9CLEdBQUdqNkQsRUFBRTtBQUMzQixDQUFDLENBQUMsQ0FBQzs7QUFFSCxJQUFNbTZELFdBQVcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7QUFDN0IsSUFBTUMscUJBQXFCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUM1Qzs7QUFFQSxJQUFNQyxrQkFBa0IsR0FBRyxTQUFyQkEsa0JBQWtCQSxDQUFHQyxJQUFJLEVBQUk7RUFDakMsSUFBSTtJQUNGLE9BQU9yMEQsSUFBSSxDQUFDQyxTQUFTLENBQUNvMEQsSUFBSSxDQUFDO0VBQzdCLENBQUMsQ0FBQyxPQUFPajZELEdBQUcsRUFBRTtJQUNaLE9BQU8yVSxNQUFNLENBQUNzbEQsSUFBSSxDQUFDO0VBQ3JCO0FBQ0YsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNDLGlDQUFpQ0EsQ0FBQ0MsVUFBVSxFQUFFQyxVQUFVLEVBQUV0dUMsWUFBWSxFQUFFO0VBQy9FcXNDLDRGQUF5QixDQUFDO0lBQUEsT0FBTWdDLFVBQVUsQ0FBQXA2RCxLQUFBLFNBQUEwTixrQkFBQSxDQUFJMnNELFVBQVUsRUFBQztFQUFBLEdBQUV0dUMsWUFBWSxDQUFDO0FBQzFFLENBQUMsQ0FBQzs7QUFHRixTQUFTdXVDLG1CQUFtQkEsQ0FBQ0MsZ0JBQWdCLEVBQUVDLGNBQWMsRUFBRUMsaUJBQWlCLEVBQUVDLFlBQVk7QUFBRTtBQUNoR0MseUJBQXlCLEVBQUU1QixnQkFBZ0IsRUFBRTtFQUMzQztFQUNBd0IsZ0JBQWdCLENBQUMzMkQsT0FBTyxHQUFHODJELFlBQVk7RUFDdkNELGlCQUFpQixDQUFDNzJELE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQzs7RUFFbkMsSUFBSSsyRCx5QkFBeUIsQ0FBQy8yRCxPQUFPLEVBQUU7SUFDckMrMkQseUJBQXlCLENBQUMvMkQsT0FBTyxHQUFHLElBQUk7SUFDeENtMUQsZ0JBQWdCLENBQUMsQ0FBQztFQUNwQjtBQUNGLENBQUMsQ0FBQztBQUNGOztBQUdBLFNBQVM2QixnQkFBZ0JBLENBQUNDLHdCQUF3QixFQUFFM3hELEtBQUssRUFBRXl2RCxZQUFZLEVBQUVtQyxrQkFBa0IsRUFBRVAsZ0JBQWdCLEVBQUVDLGNBQWMsRUFBRUMsaUJBQWlCLEVBQUVNLFNBQVMsRUFBRUoseUJBQXlCLEVBQUU1QixnQkFBZ0I7QUFBRTtBQUMxTWlDLDJCQUEyQixFQUFFO0VBQzNCO0VBQ0EsSUFBSSxDQUFDSCx3QkFBd0IsRUFBRSxPQUFPLFlBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFaEQsSUFBSUksY0FBYyxHQUFHLEtBQUs7RUFDMUIsSUFBSUMsZUFBZSxHQUFHLElBQUksQ0FBQyxDQUFDOztFQUU1QixJQUFNQyxlQUFlLEdBQUcsU0FBbEJBLGVBQWVBLENBQUEsRUFBUztJQUM1QixJQUFJRixjQUFjLElBQUksQ0FBQ0YsU0FBUyxDQUFDbjNELE9BQU8sRUFBRTtNQUN4QztNQUNBO01BQ0E7SUFDRixDQUFDLENBQUM7O0lBR0YsSUFBTXczRCxnQkFBZ0IsR0FBR2x5RCxLQUFLLENBQUMrQixRQUFRLENBQUMsQ0FBQztJQUN6QyxJQUFJb3dELGFBQWEsRUFBRTM3RCxLQUFLO0lBRXhCLElBQUk7TUFDRjtNQUNBO01BQ0EyN0QsYUFBYSxHQUFHUCxrQkFBa0IsQ0FBQ00sZ0JBQWdCLEVBQUViLGdCQUFnQixDQUFDMzJELE9BQU8sQ0FBQztJQUNoRixDQUFDLENBQUMsT0FBT2hMLENBQUMsRUFBRTtNQUNWOEcsS0FBSyxHQUFHOUcsQ0FBQztNQUNUc2lFLGVBQWUsR0FBR3RpRSxDQUFDO0lBQ3JCO0lBRUEsSUFBSSxDQUFDOEcsS0FBSyxFQUFFO01BQ1Z3N0QsZUFBZSxHQUFHLElBQUk7SUFDeEIsQ0FBQyxDQUFDOztJQUdGLElBQUlHLGFBQWEsS0FBS2IsY0FBYyxDQUFDNTJELE9BQU8sRUFBRTtNQUM1QyxJQUFJLENBQUM2MkQsaUJBQWlCLENBQUM3MkQsT0FBTyxFQUFFO1FBQzlCbTFELGdCQUFnQixDQUFDLENBQUM7TUFDcEI7SUFDRixDQUFDLE1BQU07TUFDTDtNQUNBO01BQ0E7TUFDQTtNQUNBeUIsY0FBYyxDQUFDNTJELE9BQU8sR0FBR3kzRCxhQUFhO01BQ3RDVix5QkFBeUIsQ0FBQy8yRCxPQUFPLEdBQUd5M0QsYUFBYTtNQUNqRFosaUJBQWlCLENBQUM3MkQsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDO01BQ2xDOztNQUVBbzNELDJCQUEyQixDQUFDLENBQUM7SUFDL0I7RUFDRixDQUFDLENBQUMsQ0FBQzs7RUFHSHJDLFlBQVksQ0FBQ0csYUFBYSxHQUFHcUMsZUFBZTtFQUM1Q3hDLFlBQVksQ0FBQ0ssWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzdCOztFQUVBbUMsZUFBZSxDQUFDLENBQUM7RUFFakIsSUFBTUcsa0JBQWtCLEdBQUcsU0FBckJBLGtCQUFrQkEsQ0FBQSxFQUFTO0lBQy9CTCxjQUFjLEdBQUcsSUFBSTtJQUNyQnRDLFlBQVksQ0FBQ00sY0FBYyxDQUFDLENBQUM7SUFDN0JOLFlBQVksQ0FBQ0csYUFBYSxHQUFHLElBQUk7SUFFakMsSUFBSW9DLGVBQWUsRUFBRTtNQUNuQjtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0EsTUFBTUEsZUFBZTtJQUN2QjtFQUNGLENBQUM7RUFFRCxPQUFPSSxrQkFBa0I7QUFDM0IsQ0FBQyxDQUFDOztBQUdGLElBQU1DLGdCQUFnQixHQUFHLFNBQW5CQSxnQkFBZ0JBLENBQUE7RUFBQSxPQUFTeEIsV0FBVztBQUFBO0FBRTFDLFNBQVN5QixXQUFXQSxDQUFDaGlFLENBQUMsRUFBRThnQixDQUFDLEVBQUU7RUFDekIsT0FBTzlnQixDQUFDLEtBQUs4Z0IsQ0FBQztBQUNoQjtBQUNBO0FBQ0E7QUFDQTs7QUFHQSxJQUFJbWhELGtDQUFrQyxHQUFHLEtBQUs7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTdDZELE9BQU9BLENBQUN1NkQsZUFBZSxFQUFFQyxrQkFBa0IsRUFBRUMsVUFBVSxFQVl4RDtFQUFBLElBQUEzeUQsSUFBQSxHQUFBbEosU0FBQSxDQUFBckMsTUFBQSxRQUFBcUMsU0FBQSxRQUFBRyxTQUFBLEdBQUFILFNBQUEsTUFBSixDQUFDLENBQUM7SUFUSjg3RCxJQUFJLEdBQUE1eUQsSUFBQSxDQUFKNHlELElBQUk7SUFBQUMsbUJBQUEsR0FBQTd5RCxJQUFBLENBQ0o4eUQsY0FBYztJQUFkQSxjQUFjLEdBQUFELG1CQUFBLGNBQUdOLFdBQVcsR0FBQU0sbUJBQUE7SUFBQUUscUJBQUEsR0FBQS95RCxJQUFBLENBQzVCZ3pELGdCQUFnQjtJQUFoQkEsZ0JBQWdCLEdBQUFELHFCQUFBLGNBQUd0Qyw0REFBWSxHQUFBc0MscUJBQUE7SUFBQUUscUJBQUEsR0FBQWp6RCxJQUFBLENBQy9Ca3pELGtCQUFrQjtJQUFsQkEsa0JBQWtCLEdBQUFELHFCQUFBLGNBQUd4Qyw0REFBWSxHQUFBd0MscUJBQUE7SUFBQUUscUJBQUEsR0FBQW56RCxJQUFBLENBQ2pDb3pELG1CQUFtQjtJQUFuQkEsbUJBQW1CLEdBQUFELHFCQUFBLGNBQUcxQyw0REFBWSxHQUFBMEMscUJBQUE7SUFBQUUsZUFBQSxHQUFBcnpELElBQUEsQ0FFbENzekQsVUFBVTtJQUFWQSxVQUFVLEdBQUFELGVBQUEsY0FBRyxLQUFLLEdBQUFBLGVBQUE7SUFBQUUsWUFBQSxHQUFBdnpELElBQUEsQ0FFbEI2RSxPQUFPO0lBQVBBLE9BQU8sR0FBQTB1RCxZQUFBLGNBQUd0RSx3REFBaUIsR0FBQXNFLFlBQUE7RUFFM0IsSUFBSXBmLElBQXFDLEVBQUU7SUFDekMsSUFBSXllLElBQUksS0FBSzM3RCxTQUFTLElBQUksQ0FBQ3U3RCxrQ0FBa0MsRUFBRTtNQUM3REEsa0NBQWtDLEdBQUcsSUFBSTtNQUN6QzlCLDJEQUFPLENBQUMseUZBQXlGLENBQUM7SUFDcEc7RUFDRjtFQUVBLElBQU10L0QsT0FBTyxHQUFHeVQsT0FBTztFQUN2QixJQUFNMnVELG1CQUFtQixHQUFHakQsZ0ZBQXNCLENBQUNrQyxlQUFlLENBQUM7RUFDbkUsSUFBTWdCLHNCQUFzQixHQUFHbkQsc0ZBQXlCLENBQUNvQyxrQkFBa0IsQ0FBQztFQUM1RSxJQUFNZ0IsY0FBYyxHQUFHbEQsc0VBQWlCLENBQUNtQyxVQUFVLENBQUM7RUFDcEQsSUFBTWYsd0JBQXdCLEdBQUdoeEIsT0FBTyxDQUFDNnhCLGVBQWUsQ0FBQztFQUV6RCxJQUFNa0IsZUFBZSxHQUFHLFNBQWxCQSxlQUFlQSxDQUFHQyxnQkFBZ0IsRUFBSTtJQUMxQyxJQUFJemYsS0FBcUMsSUFBSSxDQUFDZ2MsNERBQWtCLENBQUN5RCxnQkFBZ0IsQ0FBQyxFQUFFO01BQ2xGLE1BQU0sSUFBSTVnRSxLQUFLLG9GQUFBOEksTUFBQSxDQUFvRmsxRCxrQkFBa0IsQ0FBQzRDLGdCQUFnQixDQUFDLENBQUUsQ0FBQztJQUM1STtJQUVBLElBQU1DLG9CQUFvQixHQUFHRCxnQkFBZ0IsQ0FBQ2wvRCxXQUFXLElBQUlrL0QsZ0JBQWdCLENBQUMvK0QsSUFBSSxJQUFJLFdBQVc7SUFDakcsSUFBTUgsV0FBVyxjQUFBb0gsTUFBQSxDQUFjKzNELG9CQUFvQixNQUFHO0lBQ3RELElBQU1DLHNCQUFzQixHQUFHO01BQzdCbEMsd0JBQXdCO01BQ3hCbDlELFdBQVc7TUFDWG0vRCxvQkFBb0I7TUFDcEJELGdCQUFnQjtNQUNoQjtNQUNBSixtQkFBbUI7TUFDbkI7TUFDQUMsc0JBQXNCO01BQ3RCQyxjQUFjO01BQ2RaLGNBQWM7TUFDZEksa0JBQWtCO01BQ2xCRixnQkFBZ0I7TUFDaEJJO0lBQ0YsQ0FBQztJQUVELFNBQVNXLGVBQWVBLENBQUNoNkQsS0FBSyxFQUFFO01BQzlCLElBQUFpNkQsY0FBQSxHQUE2RDM3RCwwQ0FBYSxDQUFDLFlBQU07VUFDL0U7VUFDQTtVQUNBO1VBQ00sSUFDSjQ3RCxzQkFBc0IsR0FDcEJsNkQsS0FBSyxDQURQazZELHNCQUFzQjtZQUVsQnhDLFlBQVksR0FBR3hCLG1HQUE2QixDQUFDbDJELEtBQUssRUFBRXk0QyxTQUFTLENBQUM7VUFFcEUsT0FBTyxDQUFDejRDLEtBQUssQ0FBQzhLLE9BQU8sRUFBRW92RCxzQkFBc0IsRUFBRXhDLFlBQVksQ0FBQztRQUM5RCxDQUFDLEVBQUUsQ0FBQzEzRCxLQUFLLENBQUMsQ0FBQztRQUFBbTZELGVBQUEsR0FBQWg5RCxjQUFBLENBQUE4OEQsY0FBQTtRQVZKRyxZQUFZLEdBQUFELGVBQUE7UUFBRUQsc0JBQXNCLEdBQUFDLGVBQUE7UUFBRXpDLFlBQVksR0FBQXlDLGVBQUE7TUFXekQsSUFBTUUsWUFBWSxHQUFHLzdELDBDQUFhLENBQUMsWUFBTTtRQUN2QztRQUNBO1FBQ0EsT0FBTzg3RCxZQUFZLElBQUlBLFlBQVksQ0FBQ0UsUUFBUTtRQUFJO1FBQ2hEakUsMkRBQWlCLEVBQUUsYUFBYS8zRCxnREFBbUIsQ0FBQzg3RCxZQUFZLENBQUNFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHRixZQUFZLEdBQUcvaUUsT0FBTztNQUM1RyxDQUFDLEVBQUUsQ0FBQytpRSxZQUFZLEVBQUUvaUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDOztNQUU3QixJQUFNcStELFlBQVksR0FBR3AzRCw2Q0FBZ0IsQ0FBQys3RCxZQUFZLENBQUMsQ0FBQyxDQUFDO01BQ3JEO01BQ0E7O01BRUEsSUFBTUUscUJBQXFCLEdBQUcxekIsT0FBTyxDQUFDN21DLEtBQUssQ0FBQ2tHLEtBQUssQ0FBQyxJQUFJMmdDLE9BQU8sQ0FBQzdtQyxLQUFLLENBQUNrRyxLQUFLLENBQUMrQixRQUFRLENBQUMsSUFBSTQrQixPQUFPLENBQUM3bUMsS0FBSyxDQUFDa0csS0FBSyxDQUFDaEYsUUFBUSxDQUFDO01BQ3BILElBQU1zNUQsdUJBQXVCLEdBQUczekIsT0FBTyxDQUFDNnVCLFlBQVksQ0FBQyxJQUFJN3VCLE9BQU8sQ0FBQzZ1QixZQUFZLENBQUN4dkQsS0FBSyxDQUFDO01BRXBGLElBQUlrMEMsS0FBcUMsSUFBSSxDQUFDbWdCLHFCQUFxQixJQUFJLENBQUNDLHVCQUF1QixFQUFFO1FBQy9GLE1BQU0sSUFBSXZoRSxLQUFLLENBQUMscURBQUE4SSxNQUFBLENBQWtEcEgsV0FBVyx5REFBcUQsaUZBQWlGLGdDQUFBb0gsTUFBQSxDQUFnQ3BILFdBQVcseUJBQXNCLENBQUM7TUFDdlIsQ0FBQyxDQUFDOztNQUdGLElBQU11TCxLQUFLLEdBQUdxMEQscUJBQXFCLEdBQUd2NkQsS0FBSyxDQUFDa0csS0FBSyxHQUFHd3ZELFlBQVksQ0FBQ3h2RCxLQUFLO01BQ3RFLElBQU0wdkQsY0FBYyxHQUFHNEUsdUJBQXVCLEdBQUc5RSxZQUFZLENBQUNFLGNBQWMsR0FBRzF2RCxLQUFLLENBQUMrQixRQUFRO01BQzdGLElBQU02dkQsa0JBQWtCLEdBQUd4NUQsMENBQWEsQ0FBQyxZQUFNO1FBQzdDO1FBQ0E7UUFDQSxPQUFPZzRELG9FQUFzQixDQUFDcHdELEtBQUssQ0FBQ2hGLFFBQVEsRUFBRTY0RCxzQkFBc0IsQ0FBQztNQUN2RSxDQUFDLEVBQUUsQ0FBQzd6RCxLQUFLLENBQUMsQ0FBQztNQUNYLElBQUF1MEQsZUFBQSxHQUF5Q244RCwwQ0FBYSxDQUFDLFlBQU07VUFDM0QsSUFBSSxDQUFDdTVELHdCQUF3QixFQUFFLE9BQU9iLHFCQUFxQixDQUFDLENBQUM7VUFDN0Q7O1VBRUEsSUFBTXJCLFlBQVksR0FBR1IsdUVBQWtCLENBQUNqdkQsS0FBSyxFQUFFcTBELHFCQUFxQixHQUFHcjlELFNBQVMsR0FBR3c0RCxZQUFZLENBQUNDLFlBQVksQ0FBQyxDQUFDLENBQUM7VUFDL0c7VUFDQTtVQUNBOztVQUVBLElBQU1JLGdCQUFnQixHQUFHSixZQUFZLENBQUNJLGdCQUFnQixDQUFDeDBELElBQUksQ0FBQ28wRCxZQUFZLENBQUM7VUFDekUsT0FBTyxDQUFDQSxZQUFZLEVBQUVJLGdCQUFnQixDQUFDO1FBQ3pDLENBQUMsRUFBRSxDQUFDN3ZELEtBQUssRUFBRXEwRCxxQkFBcUIsRUFBRTdFLFlBQVksQ0FBQyxDQUFDO1FBQUFnRixlQUFBLEdBQUF2OUQsY0FBQSxDQUFBczlELGVBQUE7UUFYekM5RSxZQUFZLEdBQUErRSxlQUFBO1FBQUUzRSxnQkFBZ0IsR0FBQTJFLGVBQUEsSUFXWSxDQUFDO01BQ2xEOztNQUVBLElBQU1DLHNCQUFzQixHQUFHcjhELDBDQUFhLENBQUMsWUFBTTtRQUNqRCxJQUFJaThELHFCQUFxQixFQUFFO1VBQ3pCO1VBQ0E7VUFDQTtVQUNBLE9BQU83RSxZQUFZO1FBQ3JCLENBQUMsQ0FBQztRQUNGOztRQUdBLE9BQU8xcUQsOEVBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTBxRCxZQUFZLEVBQUU7VUFDaENDO1FBQ0YsQ0FBQyxDQUFDO01BQ0osQ0FBQyxFQUFFLENBQUM0RSxxQkFBcUIsRUFBRTdFLFlBQVksRUFBRUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDOztNQUV6RCxJQUFNNkIsY0FBYyxHQUFHbDVELHlDQUFZLENBQUMsQ0FBQztNQUNyQyxJQUFNaTVELGdCQUFnQixHQUFHajVELHlDQUFZLENBQUNvNUQsWUFBWSxDQUFDO01BQ25ELElBQU1DLHlCQUF5QixHQUFHcjVELHlDQUFZLENBQUMsQ0FBQztNQUNoRCxJQUFNbTVELGlCQUFpQixHQUFHbjVELHlDQUFZLENBQUMsS0FBSyxDQUFDO01BQzdDLElBQU1zOEQsb0JBQW9CLEdBQUd0OEQseUNBQVksQ0FBQyxLQUFLLENBQUM7TUFDaEQsSUFBTXk1RCxTQUFTLEdBQUd6NUQseUNBQVksQ0FBQyxLQUFLLENBQUM7TUFDckMsSUFBTXU4RCwrQkFBK0IsR0FBR3Y4RCx5Q0FBWSxDQUFDLENBQUM7TUFDdEQ4MkQsNEZBQXlCLENBQUMsWUFBTTtRQUM5QjJDLFNBQVMsQ0FBQ24zRCxPQUFPLEdBQUcsSUFBSTtRQUN4QixPQUFPLFlBQU07VUFDWG0zRCxTQUFTLENBQUNuM0QsT0FBTyxHQUFHLEtBQUs7UUFDM0IsQ0FBQztNQUNILENBQUMsRUFBRSxFQUFFLENBQUM7TUFDTixJQUFNazZELHdCQUF3QixHQUFHeDhELDBDQUFhLENBQUMsWUFBTTtRQUNuRCxJQUFNK2tDLFFBQVEsR0FBRyxTQUFYQSxRQUFRQSxDQUFBLEVBQVM7VUFDckI7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0EsSUFBSXMwQix5QkFBeUIsQ0FBQy8yRCxPQUFPLElBQUk4MkQsWUFBWSxLQUFLSCxnQkFBZ0IsQ0FBQzMyRCxPQUFPLEVBQUU7WUFDbEYsT0FBTysyRCx5QkFBeUIsQ0FBQy8yRCxPQUFPO1VBQzFDLENBQUMsQ0FBQztVQUNGO1VBQ0E7VUFDQTs7VUFHQSxPQUFPazNELGtCQUFrQixDQUFDNXhELEtBQUssQ0FBQytCLFFBQVEsQ0FBQyxDQUFDLEVBQUV5dkQsWUFBWSxDQUFDO1FBQzNELENBQUM7UUFFRCxPQUFPcjBCLFFBQVE7TUFDakIsQ0FBQyxFQUFFLENBQUNuOUIsS0FBSyxFQUFFd3hELFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUMzQjtNQUNBOztNQUVBLElBQU1xRCxpQkFBaUIsR0FBR3o4RCwwQ0FBYSxDQUFDLFlBQU07UUFDNUMsSUFBTW9KLFNBQVMsR0FBRyxTQUFaQSxTQUFTQSxDQUFHc3pELGFBQWEsRUFBSTtVQUNqQyxJQUFJLENBQUNyRixZQUFZLEVBQUU7WUFDakIsT0FBTyxZQUFNLENBQUMsQ0FBQztVQUNqQjtVQUVBLE9BQU9pQyxnQkFBZ0IsQ0FBQ0Msd0JBQXdCLEVBQUUzeEQsS0FBSyxFQUFFeXZELFlBQVk7VUFBRTtVQUN2RW1DLGtCQUFrQixFQUFFUCxnQkFBZ0IsRUFBRUMsY0FBYyxFQUFFQyxpQkFBaUIsRUFBRU0sU0FBUyxFQUFFSix5QkFBeUIsRUFBRTVCLGdCQUFnQixFQUFFaUYsYUFBYSxDQUFDO1FBQ2pKLENBQUM7UUFFRCxPQUFPdHpELFNBQVM7TUFDbEIsQ0FBQyxFQUFFLENBQUNpdUQsWUFBWSxDQUFDLENBQUM7TUFDbEJ3QixpQ0FBaUMsQ0FBQ0csbUJBQW1CLEVBQUUsQ0FBQ0MsZ0JBQWdCLEVBQUVDLGNBQWMsRUFBRUMsaUJBQWlCLEVBQUVDLFlBQVksRUFBRUMseUJBQXlCLEVBQUU1QixnQkFBZ0IsQ0FBQyxDQUFDO01BQ3hLLElBQUlrRixnQkFBZ0I7TUFFcEIsSUFBSTtRQUNGQSxnQkFBZ0IsR0FBR3BFLG9CQUFvQjtRQUFFO1FBQ3pDa0UsaUJBQWlCO1FBQUU7UUFDbkI7UUFDQUQsd0JBQXdCLEVBQUVsRixjQUFjLEdBQUc7VUFBQSxPQUFNa0Msa0JBQWtCLENBQUNsQyxjQUFjLENBQUMsQ0FBQyxFQUFFOEIsWUFBWSxDQUFDO1FBQUEsSUFBR29ELHdCQUF3QixDQUFDO01BQ2pJLENBQUMsQ0FBQyxPQUFPNzlELEdBQUcsRUFBRTtRQUNaLElBQUk0OUQsK0JBQStCLENBQUNqNkQsT0FBTyxFQUFFO1VBQzNDO1VBQ0EzRCxHQUFHLENBQUNrVCxPQUFPLGdFQUFBcE8sTUFBQSxDQUFnRTg0RCwrQkFBK0IsQ0FBQ2o2RCxPQUFPLENBQUNnNEIsS0FBSyxTQUFNO1FBQ2hJO1FBRUEsTUFBTTM3QixHQUFHO01BQ1g7TUFFQW00RCw0RkFBeUIsQ0FBQyxZQUFNO1FBQzlCeUYsK0JBQStCLENBQUNqNkQsT0FBTyxHQUFHMUQsU0FBUztRQUNuRHk2RCx5QkFBeUIsQ0FBQy8yRCxPQUFPLEdBQUcxRCxTQUFTO1FBQzdDczZELGNBQWMsQ0FBQzUyRCxPQUFPLEdBQUdxNkQsZ0JBQWdCO01BQzNDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDSjs7TUFFQSxJQUFNQyx3QkFBd0IsR0FBRzU4RCwwQ0FBYSxDQUFDLFlBQU07UUFDbkQsT0FDRTtVQUNBO1VBQ0FBLGdEQUFtQixDQUFDdTdELGdCQUFnQixFQUFFN3VELDhFQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUVpd0QsZ0JBQWdCLEVBQUU7WUFDbkVsNEIsR0FBRyxFQUFFbTNCO1VBQ1AsQ0FBQyxDQUFDO1FBQUM7TUFFUCxDQUFDLEVBQUUsQ0FBQ0Esc0JBQXNCLEVBQUVMLGdCQUFnQixFQUFFb0IsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDbEU7O01BRUEsSUFBTUUsYUFBYSxHQUFHNzhELDBDQUFhLENBQUMsWUFBTTtRQUN4QyxJQUFJdTVELHdCQUF3QixFQUFFO1VBQzVCO1VBQ0E7VUFDQTtVQUNBLE9BQU8sYUFBYXY1RCxnREFBbUIsQ0FBQys3RCxZQUFZLENBQUM5M0QsUUFBUSxFQUFFO1lBQzdEbE0sS0FBSyxFQUFFc2tFO1VBQ1QsQ0FBQyxFQUFFTyx3QkFBd0IsQ0FBQztRQUM5QjtRQUVBLE9BQU9BLHdCQUF3QjtNQUNqQyxDQUFDLEVBQUUsQ0FBQ2IsWUFBWSxFQUFFYSx3QkFBd0IsRUFBRVAsc0JBQXNCLENBQUMsQ0FBQztNQUNwRSxPQUFPUSxhQUFhO0lBQ3RCO0lBRUEsSUFBTUMsUUFBUSxHQUFHOThELHVDQUFVLENBQUMwN0QsZUFBZSxDQUFDOztJQUU1QztJQUNBLElBQU1xQixPQUFPLEdBQUdELFFBQVE7SUFDeEJDLE9BQU8sQ0FBQ3hCLGdCQUFnQixHQUFHQSxnQkFBZ0I7SUFDM0N3QixPQUFPLENBQUMxZ0UsV0FBVyxHQUFHcS9ELGVBQWUsQ0FBQ3IvRCxXQUFXLEdBQUdBLFdBQVc7SUFFL0QsSUFBSTQrRCxVQUFVLEVBQUU7TUFDZCxJQUFNK0IsVUFBVSxHQUFHaDlELDZDQUFnQixDQUFDLFNBQVNpOUQsaUJBQWlCQSxDQUFDdjdELEtBQUssRUFBRStpQyxHQUFHLEVBQUU7UUFDekU7UUFDQSxPQUFPLGFBQWF6a0MsZ0RBQW1CLENBQUMrOEQsT0FBTyxFQUFFcndELDhFQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUVoTCxLQUFLLEVBQUU7VUFDbkVrNkQsc0JBQXNCLEVBQUVuM0I7UUFDMUIsQ0FBQyxDQUFDLENBQUM7TUFDTCxDQUFDLENBQUM7TUFFRixJQUFNeTRCLFNBQVMsR0FBR0YsVUFBVTtNQUM1QkUsU0FBUyxDQUFDN2dFLFdBQVcsR0FBR0EsV0FBVztNQUNuQzZnRSxTQUFTLENBQUMzQixnQkFBZ0IsR0FBR0EsZ0JBQWdCO01BQzdDLE9BQU8xRCw4REFBWSxDQUFDcUYsU0FBUyxFQUFFM0IsZ0JBQWdCLENBQUM7SUFDbEQ7SUFFQSxPQUFPMUQsOERBQVksQ0FBQ2tGLE9BQU8sRUFBRXhCLGdCQUFnQixDQUFDO0VBQ2hELENBQUM7RUFFRCxPQUFPRCxlQUFlO0FBQ3hCO0FBRUEsK0RBQWV6N0QsT0FBTzs7Ozs7Ozs7Ozs7Ozs7O0FDelpmLFNBQVNzOUQsdUJBQXVCQSxDQUFDaGtFLEdBQUcsRUFBRXFELElBQUksRUFBRTtFQUNqRCxPQUFPLFVBQUNvRyxRQUFRLEVBQUVtdkIsT0FBTyxFQUFLO0lBQzVCLE1BQU0sSUFBSXAzQixLQUFLLDBCQUFBOEksTUFBQSxDQUEwQixPQUFPdEssR0FBRyxXQUFBc0ssTUFBQSxDQUFRakgsSUFBSSwwQ0FBQWlILE1BQUEsQ0FBdUNzdUIsT0FBTyxDQUFDeXBDLG9CQUFvQixNQUFHLENBQUM7RUFDeEksQ0FBQztBQUNIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNKNkQ7QUFDaUI7QUFDaEI7QUFDdkQsU0FBU3ZELHlCQUF5QkEsQ0FBQ29DLGtCQUFrQixFQUFFO0VBQzVELE9BQU9BLGtCQUFrQixJQUFJLE9BQU9BLGtCQUFrQixLQUFLLFFBQVEsR0FBR2dELHVFQUFzQixDQUFDLFVBQUF6NkQsUUFBUTtJQUFBO01BQUk7TUFDekd3NkQscUVBQWtCLENBQUMvQyxrQkFBa0IsRUFBRXozRCxRQUFRO0lBQUM7RUFBQSxFQUFDLEdBQUcsQ0FBQ3kzRCxrQkFBa0IsR0FBR2dELHVFQUFzQixDQUFDLFVBQUF6NkQsUUFBUTtJQUFBLE9BQUs7TUFDNUdBO0lBQ0YsQ0FBQztFQUFBLENBQUMsQ0FBQyxHQUFHLE9BQU95M0Qsa0JBQWtCLEtBQUssVUFBVTtFQUFHO0VBQ2pEaUQsbUVBQWtCLENBQUNqRCxrQkFBa0IsRUFBRSxvQkFBb0IsQ0FBQyxHQUFHOEMsMkVBQXVCLENBQUM5QyxrQkFBa0IsRUFBRSxvQkFBb0IsQ0FBQztBQUNsSTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNUOEU7QUFDaEI7QUFDdkQsU0FBU25DLHNCQUFzQkEsQ0FBQ2tDLGVBQWUsRUFBRTtFQUN0RCxPQUFPLENBQUNBLGVBQWUsR0FBR2lELHVFQUFzQixDQUFDO0lBQUEsT0FBTyxDQUFDLENBQUM7RUFBQSxDQUFDLENBQUMsR0FBRyxPQUFPakQsZUFBZSxLQUFLLFVBQVU7RUFBRztFQUN2R2tELG1FQUFrQixDQUFDbEQsZUFBZSxFQUFFLGlCQUFpQixDQUFDLEdBQUcrQywyRUFBdUIsQ0FBQy9DLGVBQWUsRUFBRSxpQkFBaUIsQ0FBQztBQUN0SDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNMMEQ7QUFDQztBQUNHO0FBQ3ZELFNBQVNvRCxpQkFBaUJBLENBQUNDLFVBQVUsRUFBRUMsYUFBYSxFQUFFQyxRQUFRLEVBQUU7RUFDckU7RUFDQSxPQUFPanhELDhFQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUVpeEQsUUFBUSxFQUFFRixVQUFVLEVBQUVDLGFBQWEsQ0FBQztBQUMxRDtBQUNPLFNBQVNFLGtCQUFrQkEsQ0FBQ3RELFVBQVUsRUFBRTtFQUM3QyxPQUFPLFNBQVN1RCxtQkFBbUJBLENBQUNqN0QsUUFBUSxFQUFBK0UsSUFBQSxFQUd6QztJQUFBLElBRkR0TCxXQUFXLEdBQUFzTCxJQUFBLENBQVh0TCxXQUFXO01BQ1gwK0QsbUJBQW1CLEdBQUFwekQsSUFBQSxDQUFuQm96RCxtQkFBbUI7SUFFbkIsSUFBSStDLFVBQVUsR0FBRyxLQUFLO0lBQ3RCLElBQUlya0IsV0FBVztJQUNmLE9BQU8sU0FBU3NrQixlQUFlQSxDQUFDTixVQUFVLEVBQUVDLGFBQWEsRUFBRUMsUUFBUSxFQUFFO01BQ25FLElBQU1LLGVBQWUsR0FBRzFELFVBQVUsQ0FBQ21ELFVBQVUsRUFBRUMsYUFBYSxFQUFFQyxRQUFRLENBQUM7TUFFdkUsSUFBSUcsVUFBVSxFQUFFO1FBQ2QsSUFBSSxDQUFDL0MsbUJBQW1CLENBQUNpRCxlQUFlLEVBQUV2a0IsV0FBVyxDQUFDLEVBQUVBLFdBQVcsR0FBR3VrQixlQUFlO01BQ3ZGLENBQUMsTUFBTTtRQUNMRixVQUFVLEdBQUcsSUFBSTtRQUNqQnJrQixXQUFXLEdBQUd1a0IsZUFBZTtRQUM3QixJQUFJbGlCLElBQXFDLEVBQUV5aEIsb0VBQWlCLENBQUM5akIsV0FBVyxFQUFFcDlDLFdBQVcsRUFBRSxZQUFZLENBQUM7TUFDdEc7TUFFQSxPQUFPbzlDLFdBQVc7SUFDcEIsQ0FBQztFQUNILENBQUM7QUFDSDtBQUNPLFNBQVMwZSxpQkFBaUJBLENBQUNtQyxVQUFVLEVBQUU7RUFDNUMsT0FBTyxDQUFDQSxVQUFVLEdBQUc7SUFBQSxPQUFNa0QsaUJBQWlCO0VBQUEsSUFBRyxPQUFPbEQsVUFBVSxLQUFLLFVBQVUsR0FBR3NELGtCQUFrQixDQUFDdEQsVUFBVSxDQUFDLEdBQUc2QywyRUFBdUIsQ0FBQzdDLFVBQVUsRUFBRSxZQUFZLENBQUM7QUFDdEs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQy9Cb0c7QUFDcEcsSUFBTW5nQixTQUFTLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSx3QkFBd0IsRUFBRSxnQkFBZ0IsQ0FBQztBQUMvQjtBQUMvQyxTQUFTK2pCLDZCQUE2QkEsQ0FBQzlELGVBQWUsRUFBRUMsa0JBQWtCLEVBQUVDLFVBQVUsRUFBRTEzRCxRQUFRLEVBQUEwWixLQUFBLEVBSXBHO0VBQUEsSUFIRG0rQyxjQUFjLEdBQUFuK0MsS0FBQSxDQUFkbStDLGNBQWM7SUFDZEUsZ0JBQWdCLEdBQUFyK0MsS0FBQSxDQUFoQnErQyxnQkFBZ0I7SUFDaEJFLGtCQUFrQixHQUFBditDLEtBQUEsQ0FBbEJ1K0Msa0JBQWtCO0VBRWxCLElBQUlzRCxpQkFBaUIsR0FBRyxLQUFLO0VBQzdCLElBQUkzNEQsS0FBSztFQUNULElBQUltNEQsUUFBUTtFQUNaLElBQUlGLFVBQVU7RUFDZCxJQUFJQyxhQUFhO0VBQ2pCLElBQUlqa0IsV0FBVztFQUVmLFNBQVMya0IsZUFBZUEsQ0FBQ0MsVUFBVSxFQUFFQyxhQUFhLEVBQUU7SUFDbEQ5NEQsS0FBSyxHQUFHNjRELFVBQVU7SUFDbEJWLFFBQVEsR0FBR1csYUFBYTtJQUN4QmIsVUFBVSxHQUFHckQsZUFBZSxDQUFDNTBELEtBQUssRUFBRW00RCxRQUFRLENBQUM7SUFDN0NELGFBQWEsR0FBR3JELGtCQUFrQixDQUFDejNELFFBQVEsRUFBRSs2RCxRQUFRLENBQUM7SUFDdERsa0IsV0FBVyxHQUFHNmdCLFVBQVUsQ0FBQ21ELFVBQVUsRUFBRUMsYUFBYSxFQUFFQyxRQUFRLENBQUM7SUFDN0RRLGlCQUFpQixHQUFHLElBQUk7SUFDeEIsT0FBTzFrQixXQUFXO0VBQ3BCO0VBRUEsU0FBUzhrQix5QkFBeUJBLENBQUEsRUFBRztJQUNuQ2QsVUFBVSxHQUFHckQsZUFBZSxDQUFDNTBELEtBQUssRUFBRW00RCxRQUFRLENBQUM7SUFDN0MsSUFBSXRELGtCQUFrQixDQUFDbUUsaUJBQWlCLEVBQUVkLGFBQWEsR0FBR3JELGtCQUFrQixDQUFDejNELFFBQVEsRUFBRSs2RCxRQUFRLENBQUM7SUFDaEdsa0IsV0FBVyxHQUFHNmdCLFVBQVUsQ0FBQ21ELFVBQVUsRUFBRUMsYUFBYSxFQUFFQyxRQUFRLENBQUM7SUFDN0QsT0FBT2xrQixXQUFXO0VBQ3BCO0VBRUEsU0FBU2dsQixjQUFjQSxDQUFBLEVBQUc7SUFDeEIsSUFBSXJFLGVBQWUsQ0FBQ29FLGlCQUFpQixFQUFFZixVQUFVLEdBQUdyRCxlQUFlLENBQUM1MEQsS0FBSyxFQUFFbTRELFFBQVEsQ0FBQztJQUNwRixJQUFJdEQsa0JBQWtCLENBQUNtRSxpQkFBaUIsRUFBRWQsYUFBYSxHQUFHckQsa0JBQWtCLENBQUN6M0QsUUFBUSxFQUFFKzZELFFBQVEsQ0FBQztJQUNoR2xrQixXQUFXLEdBQUc2Z0IsVUFBVSxDQUFDbUQsVUFBVSxFQUFFQyxhQUFhLEVBQUVDLFFBQVEsQ0FBQztJQUM3RCxPQUFPbGtCLFdBQVc7RUFDcEI7RUFFQSxTQUFTaWxCLGNBQWNBLENBQUEsRUFBRztJQUN4QixJQUFNQyxjQUFjLEdBQUd2RSxlQUFlLENBQUM1MEQsS0FBSyxFQUFFbTRELFFBQVEsQ0FBQztJQUN2RCxJQUFNaUIsaUJBQWlCLEdBQUcsQ0FBQy9ELGtCQUFrQixDQUFDOEQsY0FBYyxFQUFFbEIsVUFBVSxDQUFDO0lBQ3pFQSxVQUFVLEdBQUdrQixjQUFjO0lBQzNCLElBQUlDLGlCQUFpQixFQUFFbmxCLFdBQVcsR0FBRzZnQixVQUFVLENBQUNtRCxVQUFVLEVBQUVDLGFBQWEsRUFBRUMsUUFBUSxDQUFDO0lBQ3BGLE9BQU9sa0IsV0FBVztFQUNwQjtFQUVBLFNBQVNvbEIscUJBQXFCQSxDQUFDL2pCLFNBQVMsRUFBRWdrQixZQUFZLEVBQUU7SUFDdEQsSUFBTUMsWUFBWSxHQUFHLENBQUNwRSxnQkFBZ0IsQ0FBQ21FLFlBQVksRUFBRW5CLFFBQVEsQ0FBQztJQUM5RCxJQUFNcUIsWUFBWSxHQUFHLENBQUN2RSxjQUFjLENBQUMzZixTQUFTLEVBQUV0MUMsS0FBSyxFQUFFczVELFlBQVksRUFBRW5CLFFBQVEsQ0FBQztJQUM5RW40RCxLQUFLLEdBQUdzMUMsU0FBUztJQUNqQjZpQixRQUFRLEdBQUdtQixZQUFZO0lBQ3ZCLElBQUlDLFlBQVksSUFBSUMsWUFBWSxFQUFFLE9BQU9ULHlCQUF5QixDQUFDLENBQUM7SUFDcEUsSUFBSVEsWUFBWSxFQUFFLE9BQU9OLGNBQWMsQ0FBQyxDQUFDO0lBQ3pDLElBQUlPLFlBQVksRUFBRSxPQUFPTixjQUFjLENBQUMsQ0FBQztJQUN6QyxPQUFPamxCLFdBQVc7RUFDcEI7RUFFQSxPQUFPLFNBQVN3bEIsc0JBQXNCQSxDQUFDbmtCLFNBQVMsRUFBRWdrQixZQUFZLEVBQUU7SUFDOUQsT0FBT1gsaUJBQWlCLEdBQUdVLHFCQUFxQixDQUFDL2pCLFNBQVMsRUFBRWdrQixZQUFZLENBQUMsR0FBR1YsZUFBZSxDQUFDdGpCLFNBQVMsRUFBRWdrQixZQUFZLENBQUM7RUFDdEgsQ0FBQztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDZSxTQUFTSSx5QkFBeUJBLENBQUN0OEQsUUFBUSxFQUFFK0UsSUFBSSxFQUFFO0VBQ2hFLElBQ0V3ekQsbUJBQW1CLEdBR2pCeHpELElBQUksQ0FITnd6RCxtQkFBbUI7SUFDbkJDLHNCQUFzQixHQUVwQnp6RCxJQUFJLENBRk55ekQsc0JBQXNCO0lBQ3RCQyxjQUFjLEdBQ1oxekQsSUFBSSxDQUROMHpELGNBQWM7SUFFWnRwQyxPQUFPLEdBQUc2bEMsbUdBQTZCLENBQUNqd0QsSUFBSSxFQUFFd3lDLFNBQVMsQ0FBQztFQUU1RCxJQUFNaWdCLGVBQWUsR0FBR2UsbUJBQW1CLENBQUN2NEQsUUFBUSxFQUFFbXZCLE9BQU8sQ0FBQztFQUM5RCxJQUFNc29DLGtCQUFrQixHQUFHZSxzQkFBc0IsQ0FBQ3g0RCxRQUFRLEVBQUVtdkIsT0FBTyxDQUFDO0VBQ3BFLElBQU11b0MsVUFBVSxHQUFHZSxjQUFjLENBQUN6NEQsUUFBUSxFQUFFbXZCLE9BQU8sQ0FBQztFQUVwRCxJQUFJK3BCLElBQXFDLEVBQUU7SUFDekNtaUIsK0RBQWtCLENBQUM3RCxlQUFlLEVBQUVDLGtCQUFrQixFQUFFQyxVQUFVLENBQUM7RUFDckU7RUFFQSxPQUFPNEQsNkJBQTZCLENBQUM5RCxlQUFlLEVBQUVDLGtCQUFrQixFQUFFQyxVQUFVLEVBQUUxM0QsUUFBUSxFQUFFbXZCLE9BQU8sQ0FBQztBQUMxRzs7Ozs7Ozs7Ozs7Ozs7OztBQ25GdUM7QUFFdkMsU0FBU290QyxNQUFNQSxDQUFDcDZCLFFBQVEsRUFBRXE2QixVQUFVLEVBQUU7RUFDcEMsSUFBSSxDQUFDcjZCLFFBQVEsRUFBRTtJQUNiLE1BQU0sSUFBSXBxQyxLQUFLLHlCQUFBOEksTUFBQSxDQUF5QjI3RCxVQUFVLGlCQUFjLENBQUM7RUFDbkUsQ0FBQyxNQUFNLElBQUlBLFVBQVUsS0FBSyxpQkFBaUIsSUFBSUEsVUFBVSxLQUFLLG9CQUFvQixFQUFFO0lBQ2xGLElBQUksQ0FBQzNuRSxNQUFNLENBQUNDLFNBQVMsQ0FBQ0UsY0FBYyxDQUFDd0IsSUFBSSxDQUFDMnJDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFO01BQ3hFc3pCLDBEQUFPLHFCQUFBNTBELE1BQUEsQ0FBcUIyN0QsVUFBVSwrREFBNEQsQ0FBQztJQUNyRztFQUNGO0FBQ0Y7QUFFZSxTQUFTbkIsa0JBQWtCQSxDQUFDN0QsZUFBZSxFQUFFQyxrQkFBa0IsRUFBRUMsVUFBVSxFQUFFO0VBQzFGNkUsTUFBTSxDQUFDL0UsZUFBZSxFQUFFLGlCQUFpQixDQUFDO0VBQzFDK0UsTUFBTSxDQUFDOUUsa0JBQWtCLEVBQUUsb0JBQW9CLENBQUM7RUFDaEQ4RSxNQUFNLENBQUM3RSxVQUFVLEVBQUUsWUFBWSxDQUFDO0FBQ2xDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoQjJEO0FBQ3BELFNBQVMrQyxzQkFBc0JBO0FBQUU7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQWdDLFdBQVcsRUFBRTtFQUNYLE9BQU8sU0FBU0Msb0JBQW9CQSxDQUFDMThELFFBQVEsRUFBRTtJQUM3QyxJQUFNMjhELFFBQVEsR0FBR0YsV0FBVyxDQUFDejhELFFBQVEsQ0FBQztJQUV0QyxTQUFTNDhELGdCQUFnQkEsQ0FBQSxFQUFHO01BQzFCLE9BQU9ELFFBQVE7SUFDakI7SUFFQUMsZ0JBQWdCLENBQUNoQixpQkFBaUIsR0FBRyxLQUFLO0lBQzFDLE9BQU9nQixnQkFBZ0I7RUFDekIsQ0FBQztBQUNILENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPLFNBQVNDLG9CQUFvQkEsQ0FBQ0MsVUFBVSxFQUFFO0VBQy9DLE9BQU9BLFVBQVUsQ0FBQ2xCLGlCQUFpQixHQUFHajJCLE9BQU8sQ0FBQ20zQixVQUFVLENBQUNsQixpQkFBaUIsQ0FBQyxHQUFHa0IsVUFBVSxDQUFDdGpFLE1BQU0sS0FBSyxDQUFDO0FBQ3ZHLENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU8sU0FBU2toRSxrQkFBa0JBLENBQUNvQyxVQUFVLEVBQUVOLFVBQVUsRUFBRTtFQUN6RCxPQUFPLFNBQVNPLGlCQUFpQkEsQ0FBQy84RCxRQUFRLEVBQUErRSxJQUFBLEVBRXZDO0lBQUEsSUFERHRMLFdBQVcsR0FBQXNMLElBQUEsQ0FBWHRMLFdBQVc7SUFFWCxJQUFNdWpFLEtBQUssR0FBRyxTQUFTQyxlQUFlQSxDQUFDQyxlQUFlLEVBQUVuQyxRQUFRLEVBQUU7TUFDaEUsT0FBT2lDLEtBQUssQ0FBQ3BCLGlCQUFpQixHQUFHb0IsS0FBSyxDQUFDRixVQUFVLENBQUNJLGVBQWUsRUFBRW5DLFFBQVEsQ0FBQyxHQUFHaUMsS0FBSyxDQUFDRixVQUFVLENBQUNJLGVBQWUsRUFBRWxoRSxTQUFTLENBQUM7SUFDN0gsQ0FBQyxDQUFDLENBQUM7O0lBR0hnaEUsS0FBSyxDQUFDcEIsaUJBQWlCLEdBQUcsSUFBSTtJQUU5Qm9CLEtBQUssQ0FBQ0YsVUFBVSxHQUFHLFNBQVNLLHNCQUFzQkEsQ0FBQ0QsZUFBZSxFQUFFbkMsUUFBUSxFQUFFO01BQzVFaUMsS0FBSyxDQUFDRixVQUFVLEdBQUdBLFVBQVU7TUFDN0JFLEtBQUssQ0FBQ3BCLGlCQUFpQixHQUFHaUIsb0JBQW9CLENBQUNDLFVBQVUsQ0FBQztNQUMxRCxJQUFJaCtELEtBQUssR0FBR2srRCxLQUFLLENBQUNFLGVBQWUsRUFBRW5DLFFBQVEsQ0FBQztNQUU1QyxJQUFJLE9BQU9qOEQsS0FBSyxLQUFLLFVBQVUsRUFBRTtRQUMvQmsrRCxLQUFLLENBQUNGLFVBQVUsR0FBR2grRCxLQUFLO1FBQ3hCaytELEtBQUssQ0FBQ3BCLGlCQUFpQixHQUFHaUIsb0JBQW9CLENBQUMvOUQsS0FBSyxDQUFDO1FBQ3JEQSxLQUFLLEdBQUdrK0QsS0FBSyxDQUFDRSxlQUFlLEVBQUVuQyxRQUFRLENBQUM7TUFDMUM7TUFFQSxJQUFJN2hCLElBQXFDLEVBQUV5aEIsb0VBQWlCLENBQUM3N0QsS0FBSyxFQUFFckYsV0FBVyxFQUFFK2lFLFVBQVUsQ0FBQztNQUM1RixPQUFPMTlELEtBQUs7SUFDZCxDQUFDO0lBRUQsT0FBT2srRCxLQUFLO0VBQ2QsQ0FBQztBQUNIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JFNkM7QUFDRjtBQUNjO0FBQ2E7QUFDQTtBQUNUO0FBQ2I7QUFDeEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNQa0M7QUFDZ0I7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPLFNBQVNLLGtCQUFrQkEsQ0FBQSxFQUE4QjtFQUFBLElBQTdCenpELE9BQU8sR0FBQS9OLFNBQUEsQ0FBQXJDLE1BQUEsUUFBQXFDLFNBQUEsUUFBQUcsU0FBQSxHQUFBSCxTQUFBLE1BQUdtNEQsa0VBQWlCO0VBQzVELElBQU11SixRQUFRO0VBQUc7RUFDakIzekQsT0FBTyxLQUFLb3FELGtFQUFpQixHQUFHeUosK0NBQWUsR0FBR0QsMERBQWUsQ0FBQzV6RCxPQUFPLENBQUM7RUFDMUUsT0FBTyxTQUFTd3pELFdBQVdBLENBQUEsRUFBRztJQUM1QixJQUFNcDRELEtBQUssR0FBR3U0RCxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7O0lBRTFCLE9BQU92NEQsS0FBSyxDQUFDaEYsUUFBUTtFQUN2QixDQUFDO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU8sSUFBTW85RCxXQUFXLEdBQUcsYUFBYUMsa0JBQWtCLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hDekI7QUFDdUI7O0FBRTFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0ssc0JBQXNCQSxDQUFBLEVBQThCO0VBQUEsSUFBN0I5ekQsT0FBTyxHQUFBL04sU0FBQSxDQUFBckMsTUFBQSxRQUFBcUMsU0FBQSxRQUFBRyxTQUFBLEdBQUFILFNBQUEsTUFBR200RCxrRUFBaUI7RUFDaEUsT0FBTyxTQUFTMkosZUFBZUEsQ0FBQSxFQUFHO0lBQ2hDLElBQU1uSixZQUFZLEdBQUdwdEQsaURBQVUsQ0FBQ3dDLE9BQU8sQ0FBQztJQUV4QyxJQUFJc3ZDLEtBQXFDLElBQUksQ0FBQ3NiLFlBQVksRUFBRTtNQUMxRCxNQUFNLElBQUl6OEQsS0FBSyxDQUFDLGtHQUFrRyxDQUFDO0lBQ3JIO0lBRUEsT0FBT3k4RCxZQUFZO0VBQ3JCLENBQUM7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPLElBQU1tSixlQUFlLEdBQUcsYUFBYUQsc0JBQXNCLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3RDVDtBQUMyQztBQUM1QztBQUNLO0FBQy9ELElBQUlLLGdDQUFnQyxHQUFHckksdUVBQWM7QUFDOUMsSUFBTXNJLHFCQUFxQixHQUFHLFNBQXhCQSxxQkFBcUJBLENBQUd0aUUsRUFBRSxFQUFJO0VBQ3pDcWlFLGdDQUFnQyxHQUFHcmlFLEVBQUU7QUFDdkMsQ0FBQztBQUVELElBQU11aUUsV0FBVyxHQUFHLFNBQWRBLFdBQVdBLENBQUkzb0UsQ0FBQyxFQUFFOGdCLENBQUM7RUFBQSxPQUFLOWdCLENBQUMsS0FBSzhnQixDQUFDO0FBQUE7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdPLFNBQVNrbkQsa0JBQWtCQSxDQUFBLEVBQThCO0VBQUEsSUFBN0IxekQsT0FBTyxHQUFBL04sU0FBQSxDQUFBckMsTUFBQSxRQUFBcUMsU0FBQSxRQUFBRyxTQUFBLEdBQUFILFNBQUEsTUFBR200RCxrRUFBaUI7RUFDNUQsSUFBTTJKLGVBQWUsR0FBRy96RCxPQUFPLEtBQUtvcUQsa0VBQWlCLEdBQUc4Siw2REFBc0IsR0FBR0osd0VBQXNCLENBQUM5ekQsT0FBTyxDQUFDO0VBQ2hILE9BQU8sU0FBUzR3QixXQUFXQSxDQUFDMkgsUUFBUSxFQUE0QjtJQUFBLElBQTFCKzdCLG1CQUFtQixHQUFBcmlFLFNBQUEsQ0FBQXJDLE1BQUEsUUFBQXFDLFNBQUEsUUFBQUcsU0FBQSxHQUFBSCxTQUFBLE1BQUcsQ0FBQyxDQUFDO0lBQzVELElBQUFrSixJQUFBLEdBSUksT0FBT201RCxtQkFBbUIsS0FBSyxVQUFVLEdBQUc7UUFDOUNDLFVBQVUsRUFBRUQ7TUFDZCxDQUFDLEdBQUdBLG1CQUFtQjtNQUFBRSxlQUFBLEdBQUFyNUQsSUFBQSxDQUxyQm81RCxVQUFVO01BQVZBLFVBQVUsR0FBQUMsZUFBQSxjQUFHSCxXQUFXLEdBQUFHLGVBQUE7TUFBQWhLLG1CQUFBLEdBQUFydkQsSUFBQSxDQUN4QnN2RCxjQUFjO01BQWRBLGNBQWMsR0FBQUQsbUJBQUEsY0FBR3A0RCxTQUFTLEdBQUFvNEQsbUJBQUE7TUFBQUUsY0FBQSxHQUFBdnZELElBQUEsQ0FDMUJ3dkQsU0FBUztNQUFUQSxTQUFTLEdBQUFELGNBQUEsY0FBR3Q0RCxTQUFTLEdBQUFzNEQsY0FBQTtJQUt2QixJQUFJcGIsSUFBcUMsRUFBRTtNQUN6QyxJQUFJLENBQUMvVyxRQUFRLEVBQUU7UUFDYixNQUFNLElBQUlwcUMsS0FBSywwQ0FBMEMsQ0FBQztNQUM1RDtNQUVBLElBQUksT0FBT29xQyxRQUFRLEtBQUssVUFBVSxFQUFFO1FBQ2xDLE1BQU0sSUFBSXBxQyxLQUFLLHdEQUF3RCxDQUFDO01BQzFFO01BRUEsSUFBSSxPQUFPb21FLFVBQVUsS0FBSyxVQUFVLEVBQUU7UUFDcEMsTUFBTSxJQUFJcG1FLEtBQUssa0VBQWtFLENBQUM7TUFDcEY7SUFDRjtJQUVBLElBQUFzbUUsZ0JBQUEsR0FNSVYsZUFBZSxDQUFDLENBQUM7TUFMbkIzNEQsS0FBSyxHQUFBcTVELGdCQUFBLENBQUxyNUQsS0FBSztNQUNMeXZELFlBQVksR0FBQTRKLGdCQUFBLENBQVo1SixZQUFZO01BQ1pDLGNBQWMsR0FBQTJKLGdCQUFBLENBQWQzSixjQUFjO01BQ0U0SixvQkFBb0IsR0FBQUQsZ0JBQUEsQ0FBcENoSyxjQUFjO01BQ0hrSyxlQUFlLEdBQUFGLGdCQUFBLENBQTFCOUosU0FBUztJQUVYLElBQU1pSyxRQUFRLEdBQUdsaEUsNkNBQU0sQ0FBQyxJQUFJLENBQUM7SUFDN0IsSUFBTW1oRSxlQUFlLEdBQUdiLGtEQUFXLENBQUM7TUFDbEMsQ0FBQ3o3QixRQUFRLENBQUN2b0MsSUFBSSxFQUFFZ0osS0FBSyxFQUFFO1FBQ3JCLElBQU00N0IsUUFBUSxHQUFHMkQsUUFBUSxDQUFDdi9CLEtBQUssQ0FBQztRQUVoQyxJQUFJczJDLElBQXFDLEVBQUU7VUFDekMsSUFBTXdsQixtQkFBbUIsR0FBRyxPQUFPckssY0FBYyxLQUFLLFdBQVcsR0FBR2lLLG9CQUFvQixHQUFHakssY0FBYztVQUV6RyxJQUFJcUssbUJBQW1CLEtBQUssUUFBUSxJQUFJQSxtQkFBbUIsS0FBSyxNQUFNLElBQUlGLFFBQVEsQ0FBQzkrRCxPQUFPLEVBQUU7WUFDMUYsSUFBTWkvRCxTQUFTLEdBQUd4OEIsUUFBUSxDQUFDdi9CLEtBQUssQ0FBQztZQUVqQyxJQUFJLENBQUN1N0QsVUFBVSxDQUFDMy9CLFFBQVEsRUFBRW1nQyxTQUFTLENBQUMsRUFBRTtjQUNwQyxJQUFJam5DLEtBQUssR0FBRzE3QixTQUFTO2NBRXJCLElBQUk7Z0JBQ0YsTUFBTSxJQUFJakUsS0FBSyxDQUFDLENBQUM7Y0FDbkIsQ0FBQyxDQUFDLE9BQU9yRCxDQUFDLEVBQUU7Z0JBQ1Y7Z0JBRUVnakMsS0FBSyxHQUNIaGpDLENBQUMsQ0FESGdqQyxLQUFLO2NBRVQ7Y0FFQXpwQixPQUFPLENBQUNDLElBQUksQ0FBQyxXQUFXLElBQUlpMEIsUUFBUSxDQUFDdm9DLElBQUksSUFBSSxTQUFTLENBQUMsR0FBRyw0R0FBNEcsR0FBRyxzTEFBc0wsRUFBRTtnQkFDL1ZnSixLQUFLO2dCQUNMNDdCLFFBQVE7Z0JBQ1JvZ0MsU0FBUyxFQUFFRCxTQUFTO2dCQUNwQmpuQztjQUNGLENBQUMsQ0FBQztZQUNKO1VBQ0Y7VUFFQSxJQUFNbW5DLGNBQWMsR0FBRyxPQUFPdEssU0FBUyxLQUFLLFdBQVcsR0FBR2dLLGVBQWUsR0FBR2hLLFNBQVM7VUFFckYsSUFBSXNLLGNBQWMsS0FBSyxRQUFRLElBQUlBLGNBQWMsS0FBSyxNQUFNLElBQUlMLFFBQVEsQ0FBQzkrRCxPQUFPLEVBQUU7WUFDaEY7WUFDQSxJQUFJOCtCLFFBQVEsS0FBSzU3QixLQUFLLEVBQUU7Y0FDdEIsSUFBSTgwQixNQUFLLEdBQUcxN0IsU0FBUztjQUVyQixJQUFJO2dCQUNGLE1BQU0sSUFBSWpFLEtBQUssQ0FBQyxDQUFDO2NBQ25CLENBQUMsQ0FBQyxPQUFPckQsQ0FBQyxFQUFFO2dCQUNWO2dCQUVFZ2pDLE1BQUssR0FDSGhqQyxDQUFDLENBREhnakMsS0FBSztjQUVUO2NBRUF6cEIsT0FBTyxDQUFDQyxJQUFJLENBQUMsV0FBVyxJQUFJaTBCLFFBQVEsQ0FBQ3ZvQyxJQUFJLElBQUksU0FBUyxDQUFDLEdBQUcsK0VBQStFLEdBQUcsOElBQThJLEVBQUU7Z0JBQzFSODlCLEtBQUssRUFBTEE7Y0FDRixDQUFDLENBQUM7WUFDSjtVQUNGO1VBRUEsSUFBSThtQyxRQUFRLENBQUM5K0QsT0FBTyxFQUFFOCtELFFBQVEsQ0FBQzkrRCxPQUFPLEdBQUcsS0FBSztRQUNoRDtRQUVBLE9BQU84K0IsUUFBUTtNQUNqQjtJQUVGLENBQUMsQ0FBQzJELFFBQVEsQ0FBQ3ZvQyxJQUFJLENBQUMsRUFBRSxDQUFDdW9DLFFBQVEsRUFBRW04QixvQkFBb0IsRUFBRWpLLGNBQWMsQ0FBQyxDQUFDO0lBQ25FLElBQU15SyxhQUFhLEdBQUdmLGdDQUFnQyxDQUFDdEosWUFBWSxDQUFDc0ssWUFBWSxFQUFFLzVELEtBQUssQ0FBQytCLFFBQVEsRUFBRTJ0RCxjQUFjLElBQUkxdkQsS0FBSyxDQUFDK0IsUUFBUSxFQUFFMDNELGVBQWUsRUFBRU4sVUFBVSxDQUFDO0lBQ2hLTixvREFBYSxDQUFDaUIsYUFBYSxDQUFDO0lBQzVCLE9BQU9BLGFBQWE7RUFDdEIsQ0FBQztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTyxJQUFNdGtDLFdBQVcsR0FBRyxhQUFhOGlDLGtCQUFrQixDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVJRjtBQUM0QztBQUN0RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU8sU0FBU0UsZUFBZUEsQ0FBQSxFQUE4QjtFQUFBLElBQTdCNXpELE9BQU8sR0FBQS9OLFNBQUEsQ0FBQXJDLE1BQUEsUUFBQXFDLFNBQUEsUUFBQUcsU0FBQSxHQUFBSCxTQUFBLE1BQUdtNEQsa0VBQWlCO0VBQ3pELElBQU0ySixlQUFlO0VBQUc7RUFDeEIvekQsT0FBTyxLQUFLb3FELGtFQUFpQixHQUFHOEosNkRBQXNCO0VBQUc7RUFDekRKLHdFQUFzQixDQUFDOXpELE9BQU8sQ0FBQztFQUMvQixPQUFPLFNBQVMyekQsUUFBUUEsQ0FBQSxFQUFHO0lBQ3pCLElBQUFjLGdCQUFBLEdBRUlWLGVBQWUsQ0FBQyxDQUFDO01BRG5CMzRELEtBQUssR0FBQXE1RCxnQkFBQSxDQUFMcjVELEtBQUssQ0FDZSxDQUFDOztJQUV2QixPQUFPQSxLQUFLO0VBQ2QsQ0FBQztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPLElBQU11NEQsUUFBUSxHQUFHLGFBQWFDLGVBQWUsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JDdEQ7QUFDQTtBQUNBO0FBQ29FO0FBQzBCO0FBQ2Y7QUFDdEM7QUFDbUI7QUFDSDtBQUN6RFEseUVBQXFCLENBQUNELHdHQUFnQyxDQUFDO0FBQ3ZEbkksc0VBQWlCLENBQUNELDhFQUFvQixDQUFDLENBQUMsQ0FBQztBQUN6Qzs7QUFFQXNKLHNEQUFRLENBQUNqaUUsK0VBQUssQ0FBQztBQUNFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBRWRrQixDQUFDO0FBQ3BDO0FBQ0E7O0FBRUEsU0FBU21pRSx3QkFBd0JBLENBQUEsRUFBRztFQUNsQyxJQUFNbmlFLEtBQUssR0FBR2tpRSxnREFBUSxDQUFDLENBQUM7RUFDeEIsSUFBSUUsS0FBSyxHQUFHLElBQUk7RUFDaEIsSUFBSWo0QyxJQUFJLEdBQUcsSUFBSTtFQUNmLE9BQU87SUFDTHVwQixLQUFLQSxDQUFBLEVBQUc7TUFDTjB1QixLQUFLLEdBQUcsSUFBSTtNQUNaajRDLElBQUksR0FBRyxJQUFJO0lBQ2IsQ0FBQztJQUVEMWdCLE1BQU1BLENBQUEsRUFBRztNQUNQekosS0FBSyxDQUFDLFlBQU07UUFDVixJQUFJNjVCLFFBQVEsR0FBR3VvQyxLQUFLO1FBRXBCLE9BQU92b0MsUUFBUSxFQUFFO1VBQ2ZBLFFBQVEsQ0FBQ3paLFFBQVEsQ0FBQyxDQUFDO1VBQ25CeVosUUFBUSxHQUFHQSxRQUFRLENBQUNsK0IsSUFBSTtRQUMxQjtNQUNGLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRGtYLEdBQUdBLENBQUEsRUFBRztNQUNKLElBQUl3dkQsU0FBUyxHQUFHLEVBQUU7TUFDbEIsSUFBSXhvQyxRQUFRLEdBQUd1b0MsS0FBSztNQUVwQixPQUFPdm9DLFFBQVEsRUFBRTtRQUNmd29DLFNBQVMsQ0FBQ2xtRSxJQUFJLENBQUMwOUIsUUFBUSxDQUFDO1FBQ3hCQSxRQUFRLEdBQUdBLFFBQVEsQ0FBQ2wrQixJQUFJO01BQzFCO01BRUEsT0FBTzBtRSxTQUFTO0lBQ2xCLENBQUM7SUFFRDc0RCxTQUFTQSxDQUFDNFcsUUFBUSxFQUFFO01BQ2xCLElBQUlraUQsWUFBWSxHQUFHLElBQUk7TUFDdkIsSUFBSXpvQyxRQUFRLEdBQUcxUCxJQUFJLEdBQUc7UUFDcEIvSixRQUFRO1FBQ1J6a0IsSUFBSSxFQUFFLElBQUk7UUFDVjJCLElBQUksRUFBRTZzQjtNQUNSLENBQUM7TUFFRCxJQUFJMFAsUUFBUSxDQUFDdjhCLElBQUksRUFBRTtRQUNqQnU4QixRQUFRLENBQUN2OEIsSUFBSSxDQUFDM0IsSUFBSSxHQUFHaytCLFFBQVE7TUFDL0IsQ0FBQyxNQUFNO1FBQ0x1b0MsS0FBSyxHQUFHdm9DLFFBQVE7TUFDbEI7TUFFQSxPQUFPLFNBQVMwb0MsV0FBV0EsQ0FBQSxFQUFHO1FBQzVCLElBQUksQ0FBQ0QsWUFBWSxJQUFJRixLQUFLLEtBQUssSUFBSSxFQUFFO1FBQ3JDRSxZQUFZLEdBQUcsS0FBSztRQUVwQixJQUFJem9DLFFBQVEsQ0FBQ2wrQixJQUFJLEVBQUU7VUFDakJrK0IsUUFBUSxDQUFDbCtCLElBQUksQ0FBQzJCLElBQUksR0FBR3U4QixRQUFRLENBQUN2OEIsSUFBSTtRQUNwQyxDQUFDLE1BQU07VUFDTDZzQixJQUFJLEdBQUcwUCxRQUFRLENBQUN2OEIsSUFBSTtRQUN0QjtRQUVBLElBQUl1OEIsUUFBUSxDQUFDdjhCLElBQUksRUFBRTtVQUNqQnU4QixRQUFRLENBQUN2OEIsSUFBSSxDQUFDM0IsSUFBSSxHQUFHaytCLFFBQVEsQ0FBQ2wrQixJQUFJO1FBQ3BDLENBQUMsTUFBTTtVQUNMeW1FLEtBQUssR0FBR3ZvQyxRQUFRLENBQUNsK0IsSUFBSTtRQUN2QjtNQUNGLENBQUM7SUFDSDtFQUVGLENBQUM7QUFDSDtBQUVBLElBQU02bUUsYUFBYSxHQUFHO0VBQ3BCLzRELE1BQU1BLENBQUEsRUFBRyxDQUFDLENBQUM7RUFFWG9KLEdBQUcsRUFBRSxTQUFBQSxJQUFBO0lBQUEsT0FBTSxFQUFFO0VBQUE7QUFDZixDQUFDO0FBQ00sU0FBU29rRCxrQkFBa0JBLENBQUNqdkQsS0FBSyxFQUFFeTZELFNBQVMsRUFBRTtFQUNuRCxJQUFJRixXQUFXO0VBQ2YsSUFBSUYsU0FBUyxHQUFHRyxhQUFhLENBQUMsQ0FBQzs7RUFFL0IsSUFBSUUsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0VBRTdCLElBQUlDLGNBQWMsR0FBRyxLQUFLO0VBRTFCLFNBQVNaLFlBQVlBLENBQUNsb0MsUUFBUSxFQUFFO0lBQzlCaStCLFlBQVksQ0FBQyxDQUFDO0lBQ2QsSUFBTThLLGVBQWUsR0FBR1AsU0FBUyxDQUFDNzRELFNBQVMsQ0FBQ3F3QixRQUFRLENBQUMsQ0FBQyxDQUFDOztJQUV2RCxJQUFJeEcsT0FBTyxHQUFHLEtBQUs7SUFDbkIsT0FBTyxZQUFNO01BQ1gsSUFBSSxDQUFDQSxPQUFPLEVBQUU7UUFDWkEsT0FBTyxHQUFHLElBQUk7UUFDZHV2QyxlQUFlLENBQUMsQ0FBQztRQUNqQjdLLGNBQWMsQ0FBQyxDQUFDO01BQ2xCO0lBQ0YsQ0FBQztFQUNIO0VBRUEsU0FBU0YsZ0JBQWdCQSxDQUFBLEVBQUc7SUFDMUJ3SyxTQUFTLENBQUM1NEQsTUFBTSxDQUFDLENBQUM7RUFDcEI7RUFFQSxTQUFTbzVELG1CQUFtQkEsQ0FBQSxFQUFHO0lBQzdCLElBQUlwTCxZQUFZLENBQUNHLGFBQWEsRUFBRTtNQUM5QkgsWUFBWSxDQUFDRyxhQUFhLENBQUMsQ0FBQztJQUM5QjtFQUNGO0VBRUEsU0FBUzBLLFlBQVlBLENBQUEsRUFBRztJQUN0QixPQUFPSyxjQUFjO0VBQ3ZCO0VBRUEsU0FBUzdLLFlBQVlBLENBQUEsRUFBRztJQUN0QjRLLG1CQUFtQixFQUFFO0lBRXJCLElBQUksQ0FBQ0gsV0FBVyxFQUFFO01BQ2hCQSxXQUFXLEdBQUdFLFNBQVMsR0FBR0EsU0FBUyxDQUFDVixZQUFZLENBQUNjLG1CQUFtQixDQUFDLEdBQUc3NkQsS0FBSyxDQUFDd0IsU0FBUyxDQUFDcTVELG1CQUFtQixDQUFDO01BQzVHUixTQUFTLEdBQUdGLHdCQUF3QixDQUFDLENBQUM7SUFDeEM7RUFDRjtFQUVBLFNBQVNwSyxjQUFjQSxDQUFBLEVBQUc7SUFDeEIySyxtQkFBbUIsRUFBRTtJQUVyQixJQUFJSCxXQUFXLElBQUlHLG1CQUFtQixLQUFLLENBQUMsRUFBRTtNQUM1Q0gsV0FBVyxDQUFDLENBQUM7TUFDYkEsV0FBVyxHQUFHdmpFLFNBQVM7TUFDdkJxakUsU0FBUyxDQUFDM3VCLEtBQUssQ0FBQyxDQUFDO01BQ2pCMnVCLFNBQVMsR0FBR0csYUFBYTtJQUMzQjtFQUNGO0VBRUEsU0FBU00sZ0JBQWdCQSxDQUFBLEVBQUc7SUFDMUIsSUFBSSxDQUFDSCxjQUFjLEVBQUU7TUFDbkJBLGNBQWMsR0FBRyxJQUFJO01BQ3JCN0ssWUFBWSxDQUFDLENBQUM7SUFDaEI7RUFDRjtFQUVBLFNBQVNpTCxrQkFBa0JBLENBQUEsRUFBRztJQUM1QixJQUFJSixjQUFjLEVBQUU7TUFDbEJBLGNBQWMsR0FBRyxLQUFLO01BQ3RCNUssY0FBYyxDQUFDLENBQUM7SUFDbEI7RUFDRjtFQUVBLElBQU1OLFlBQVksR0FBRztJQUNuQnNLLFlBQVk7SUFDWmxLLGdCQUFnQjtJQUNoQmdMLG1CQUFtQjtJQUNuQlAsWUFBWTtJQUNaeEssWUFBWSxFQUFFZ0wsZ0JBQWdCO0lBQzlCL0ssY0FBYyxFQUFFZ0wsa0JBQWtCO0lBQ2xDQyxZQUFZLEVBQUUsU0FBQUEsYUFBQTtNQUFBLE9BQU1YLFNBQVM7SUFBQTtFQUMvQixDQUFDO0VBQ0QsT0FBTzVLLFlBQVk7QUFDckI7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3SkE7QUFDQSxTQUFTd0wsZ0JBQWdCQSxDQUFDN2lELFFBQVEsRUFBRTtFQUNsQ0EsUUFBUSxDQUFDLENBQUM7QUFDWjtBQUVBLElBQUlwZ0IsS0FBSyxHQUFHaWpFLGdCQUFnQixDQUFDLENBQUM7O0FBRXZCLElBQU1oQixRQUFRLEdBQUcsU0FBWEEsUUFBUUEsQ0FBR2lCLFFBQVE7RUFBQSxPQUFJbGpFLEtBQUssR0FBR2tqRSxRQUFRO0FBQUEsRUFBQyxDQUFDOztBQUUvQyxJQUFNaEIsUUFBUSxHQUFHLFNBQVhBLFFBQVFBLENBQUE7RUFBQSxPQUFTbGlFLEtBQUs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7O0FDVHBCLFNBQVN3OUQsa0JBQWtCQSxDQUFDMkYsY0FBYyxFQUFFbmdFLFFBQVEsRUFBRTtFQUNuRSxJQUFNb2dFLG1CQUFtQixHQUFHLENBQUMsQ0FBQztFQUFDLElBQUF6MEQsS0FBQSxZQUFBQSxNQUFBLEVBRUc7SUFDaEMsSUFBTTAwRCxhQUFhLEdBQUdGLGNBQWMsQ0FBQzdrRSxHQUFHLENBQUM7SUFFekMsSUFBSSxPQUFPK2tFLGFBQWEsS0FBSyxVQUFVLEVBQUU7TUFDdkNELG1CQUFtQixDQUFDOWtFLEdBQUcsQ0FBQyxHQUFHO1FBQUEsT0FBYTBFLFFBQVEsQ0FBQ3FnRSxhQUFhLENBQUF2a0UsS0FBQSxTQUFBRCxTQUFRLENBQUMsQ0FBQztNQUFBO0lBQzFFO0VBQ0YsQ0FBQztFQU5ELEtBQUssSUFBTVAsR0FBRyxJQUFJNmtFLGNBQWM7SUFBQXgwRCxLQUFBO0VBQUE7RUFRaEMsT0FBT3kwRCxtQkFBbUI7QUFDNUI7Ozs7Ozs7Ozs7Ozs7OztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ2UsU0FBU0UsYUFBYUEsQ0FBQzUyRCxHQUFHLEVBQUU7RUFDekMsSUFBSSxPQUFPQSxHQUFHLEtBQUssUUFBUSxJQUFJQSxHQUFHLEtBQUssSUFBSSxFQUFFLE9BQU8sS0FBSztFQUN6RCxJQUFJNjJELEtBQUssR0FBRzFyRSxNQUFNLENBQUNxQyxjQUFjLENBQUN3UyxHQUFHLENBQUM7RUFDdEMsSUFBSTYyRCxLQUFLLEtBQUssSUFBSSxFQUFFLE9BQU8sSUFBSTtFQUMvQixJQUFJQyxTQUFTLEdBQUdELEtBQUs7RUFFckIsT0FBTzFyRSxNQUFNLENBQUNxQyxjQUFjLENBQUNzcEUsU0FBUyxDQUFDLEtBQUssSUFBSSxFQUFFO0lBQ2hEQSxTQUFTLEdBQUczckUsTUFBTSxDQUFDcUMsY0FBYyxDQUFDc3BFLFNBQVMsQ0FBQztFQUM5QztFQUVBLE9BQU9ELEtBQUssS0FBS0MsU0FBUztBQUM1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUVmQSxTQUFTMXRDLEVBQUVBLENBQUM2c0IsQ0FBQyxFQUFFOW9ELENBQUMsRUFBRTtFQUNoQixJQUFJOG9ELENBQUMsS0FBSzlvRCxDQUFDLEVBQUU7SUFDWCxPQUFPOG9ELENBQUMsS0FBSyxDQUFDLElBQUk5b0QsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUc4b0QsQ0FBQyxLQUFLLENBQUMsR0FBRzlvRCxDQUFDO0VBQzlDLENBQUMsTUFBTTtJQUNMLE9BQU84b0QsQ0FBQyxLQUFLQSxDQUFDLElBQUk5b0QsQ0FBQyxLQUFLQSxDQUFDO0VBQzNCO0FBQ0Y7QUFFZSxTQUFTMitELFlBQVlBLENBQUNpTCxJQUFJLEVBQUVDLElBQUksRUFBRTtFQUMvQyxJQUFJNXRDLEVBQUUsQ0FBQzJ0QyxJQUFJLEVBQUVDLElBQUksQ0FBQyxFQUFFLE9BQU8sSUFBSTtFQUUvQixJQUFJLE9BQU9ELElBQUksS0FBSyxRQUFRLElBQUlBLElBQUksS0FBSyxJQUFJLElBQUksT0FBT0MsSUFBSSxLQUFLLFFBQVEsSUFBSUEsSUFBSSxLQUFLLElBQUksRUFBRTtJQUMxRixPQUFPLEtBQUs7RUFDZDtFQUVBLElBQU1DLEtBQUssR0FBRzlyRSxNQUFNLENBQUNzRixJQUFJLENBQUNzbUUsSUFBSSxDQUFDO0VBQy9CLElBQU1HLEtBQUssR0FBRy9yRSxNQUFNLENBQUNzRixJQUFJLENBQUN1bUUsSUFBSSxDQUFDO0VBQy9CLElBQUlDLEtBQUssQ0FBQ25uRSxNQUFNLEtBQUtvbkUsS0FBSyxDQUFDcG5FLE1BQU0sRUFBRSxPQUFPLEtBQUs7RUFFL0MsS0FBSyxJQUFJcEUsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHdXJFLEtBQUssQ0FBQ25uRSxNQUFNLEVBQUVwRSxDQUFDLEVBQUUsRUFBRTtJQUNyQyxJQUFJLENBQUNQLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDRSxjQUFjLENBQUN3QixJQUFJLENBQUNrcUUsSUFBSSxFQUFFQyxLQUFLLENBQUN2ckUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDMDlCLEVBQUUsQ0FBQzJ0QyxJQUFJLENBQUNFLEtBQUssQ0FBQ3ZyRSxDQUFDLENBQUMsQ0FBQyxFQUFFc3JFLElBQUksQ0FBQ0MsS0FBSyxDQUFDdnJFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtNQUNoRyxPQUFPLEtBQUs7SUFDZDtFQUNGO0VBRUEsT0FBTyxJQUFJO0FBQ2I7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzFCK0IsQ0FBQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPLElBQU15ckUsU0FBUyxHQUFHLENBQUMsRUFBRSxPQUFPbGdFLE1BQU0sS0FBSyxXQUFXLElBQUksT0FBT0EsTUFBTSxDQUFDMkUsUUFBUSxLQUFLLFdBQVcsSUFBSSxPQUFPM0UsTUFBTSxDQUFDMkUsUUFBUSxDQUFDbkUsYUFBYSxLQUFLLFdBQVcsQ0FBQztBQUNySixJQUFNK3lELHlCQUF5QixHQUFHMk0sU0FBUyxHQUFHempFLGtEQUFxQixHQUFHQSw0Q0FBZTs7Ozs7Ozs7Ozs7Ozs7O0FDWHJGLElBQU1zNEQsY0FBYyxHQUFHLFNBQWpCQSxjQUFjQSxDQUFBLEVBQVM7RUFDbEMsTUFBTSxJQUFJMzlELEtBQUssQ0FBQyx1QkFBdUIsQ0FBQztBQUMxQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0YyQztBQUNaO0FBQ2pCLFNBQVM0aUUsaUJBQWlCQSxDQUFDeGxFLEtBQUssRUFBRXNFLFdBQVcsRUFBRStpRSxVQUFVLEVBQUU7RUFDeEUsSUFBSSxDQUFDOEQsMERBQWEsQ0FBQ25yRSxLQUFLLENBQUMsRUFBRTtJQUN6QnNnRSxvREFBTyxJQUFBNTBELE1BQUEsQ0FBSTI3RCxVQUFVLFlBQUEzN0QsTUFBQSxDQUFTcEgsV0FBVyxvREFBQW9ILE1BQUEsQ0FBaUQxTCxLQUFLLE1BQUcsQ0FBQztFQUNyRztBQUNGOzs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDZSxTQUFTc2dFLE9BQU9BLENBQUN4bUQsT0FBTyxFQUFFO0VBQ3ZDO0VBQ0EsSUFBSSxPQUFPaEIsT0FBTyxLQUFLLFdBQVcsSUFBSSxPQUFPQSxPQUFPLENBQUN6UyxLQUFLLEtBQUssVUFBVSxFQUFFO0lBQ3pFeVMsT0FBTyxDQUFDelMsS0FBSyxDQUFDeVQsT0FBTyxDQUFDO0VBQ3hCO0VBQ0E7O0VBR0EsSUFBSTtJQUNGO0lBQ0E7SUFDQTtJQUNBLE1BQU0sSUFBSWxYLEtBQUssQ0FBQ2tYLE9BQU8sQ0FBQztJQUN4QjtFQUNGLENBQUMsQ0FBQyxPQUFPdmEsQ0FBQyxFQUFFLENBQUM7RUFDYjtBQUVGOzs7Ozs7Ozs7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWIsSUFBSXdrRCxJQUFxQyxFQUFFO0VBQ3pDLENBQUMsWUFBVztJQUNkLFlBQVk7O0lBRVo7SUFDQTtJQUNBO0lBQ0E7SUFDQSxJQUFJNm5CLGtCQUFrQixHQUFHMXJFLE1BQU0sQ0FBQ28rRCxHQUFHLENBQUMsZUFBZSxDQUFDO0lBQ3BELElBQUl1TixpQkFBaUIsR0FBRzNyRSxNQUFNLENBQUNvK0QsR0FBRyxDQUFDLGNBQWMsQ0FBQztJQUNsRCxJQUFJd04sbUJBQW1CLEdBQUc1ckUsTUFBTSxDQUFDbytELEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztJQUN0RCxJQUFJeU4sc0JBQXNCLEdBQUc3ckUsTUFBTSxDQUFDbytELEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQztJQUM1RCxJQUFJME4sbUJBQW1CLEdBQUc5ckUsTUFBTSxDQUFDbytELEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztJQUN0RCxJQUFJMk4sbUJBQW1CLEdBQUcvckUsTUFBTSxDQUFDbytELEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztJQUN0RCxJQUFJNE4sa0JBQWtCLEdBQUdoc0UsTUFBTSxDQUFDbytELEdBQUcsQ0FBQyxlQUFlLENBQUM7SUFDcEQsSUFBSTZOLHlCQUF5QixHQUFHanNFLE1BQU0sQ0FBQ28rRCxHQUFHLENBQUMsc0JBQXNCLENBQUM7SUFDbEUsSUFBSThOLHNCQUFzQixHQUFHbHNFLE1BQU0sQ0FBQ28rRCxHQUFHLENBQUMsbUJBQW1CLENBQUM7SUFDNUQsSUFBSStOLG1CQUFtQixHQUFHbnNFLE1BQU0sQ0FBQ28rRCxHQUFHLENBQUMsZ0JBQWdCLENBQUM7SUFDdEQsSUFBSWdPLHdCQUF3QixHQUFHcHNFLE1BQU0sQ0FBQ28rRCxHQUFHLENBQUMscUJBQXFCLENBQUM7SUFDaEUsSUFBSWlPLGVBQWUsR0FBR3JzRSxNQUFNLENBQUNvK0QsR0FBRyxDQUFDLFlBQVksQ0FBQztJQUM5QyxJQUFJa08sZUFBZSxHQUFHdHNFLE1BQU0sQ0FBQ28rRCxHQUFHLENBQUMsWUFBWSxDQUFDO0lBQzlDLElBQUltTyxvQkFBb0IsR0FBR3ZzRSxNQUFNLENBQUNvK0QsR0FBRyxDQUFDLGlCQUFpQixDQUFDOztJQUV4RDs7SUFFQSxJQUFJb08sY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQzVCLElBQUlDLGtCQUFrQixHQUFHLEtBQUs7SUFDOUIsSUFBSUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDLENBQUM7O0lBRXJDLElBQUlDLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQ2hDO0lBQ0E7O0lBRUEsSUFBSUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDLENBQUM7O0lBRWhDLElBQUlDLHNCQUFzQjtJQUUxQjtNQUNFQSxzQkFBc0IsR0FBRzdzRSxNQUFNLENBQUNvK0QsR0FBRyxDQUFDLHdCQUF3QixDQUFDO0lBQy9EO0lBRUEsU0FBU3lCLGtCQUFrQkEsQ0FBQzUrRCxJQUFJLEVBQUU7TUFDaEMsSUFBSSxPQUFPQSxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU9BLElBQUksS0FBSyxVQUFVLEVBQUU7UUFDMUQsT0FBTyxJQUFJO01BQ2IsQ0FBQyxDQUFDOztNQUdGLElBQUlBLElBQUksS0FBSzJxRSxtQkFBbUIsSUFBSTNxRSxJQUFJLEtBQUs2cUUsbUJBQW1CLElBQUljLGtCQUFrQixJQUFLM3JFLElBQUksS0FBSzRxRSxzQkFBc0IsSUFBSTVxRSxJQUFJLEtBQUtrckUsbUJBQW1CLElBQUlsckUsSUFBSSxLQUFLbXJFLHdCQUF3QixJQUFJTyxrQkFBa0IsSUFBSzFyRSxJQUFJLEtBQUtzckUsb0JBQW9CLElBQUlDLGNBQWMsSUFBS0Msa0JBQWtCLElBQUtDLHVCQUF1QixFQUFHO1FBQzdULE9BQU8sSUFBSTtNQUNiO01BRUEsSUFBSSxPQUFPenJFLElBQUksS0FBSyxRQUFRLElBQUlBLElBQUksS0FBSyxJQUFJLEVBQUU7UUFDN0MsSUFBSUEsSUFBSSxDQUFDNnJFLFFBQVEsS0FBS1IsZUFBZSxJQUFJcnJFLElBQUksQ0FBQzZyRSxRQUFRLEtBQUtULGVBQWUsSUFBSXByRSxJQUFJLENBQUM2ckUsUUFBUSxLQUFLZixtQkFBbUIsSUFBSTlxRSxJQUFJLENBQUM2ckUsUUFBUSxLQUFLZCxrQkFBa0IsSUFBSS9xRSxJQUFJLENBQUM2ckUsUUFBUSxLQUFLWixzQkFBc0I7UUFBSTtRQUMzTTtRQUNBO1FBQ0E7UUFDQWpyRSxJQUFJLENBQUM2ckUsUUFBUSxLQUFLRCxzQkFBc0IsSUFBSTVyRSxJQUFJLENBQUM4ckUsV0FBVyxLQUFLcG1FLFNBQVMsRUFBRTtVQUMxRSxPQUFPLElBQUk7UUFDYjtNQUNGO01BRUEsT0FBTyxLQUFLO0lBQ2Q7SUFFQSxTQUFTcW1FLE1BQU1BLENBQUM3L0QsTUFBTSxFQUFFO01BQ3RCLElBQUksT0FBT0EsTUFBTSxLQUFLLFFBQVEsSUFBSUEsTUFBTSxLQUFLLElBQUksRUFBRTtRQUNqRCxJQUFJMi9ELFFBQVEsR0FBRzMvRCxNQUFNLENBQUMyL0QsUUFBUTtRQUU5QixRQUFRQSxRQUFRO1VBQ2QsS0FBS3BCLGtCQUFrQjtZQUNyQixJQUFJenFFLElBQUksR0FBR2tNLE1BQU0sQ0FBQ2xNLElBQUk7WUFFdEIsUUFBUUEsSUFBSTtjQUNWLEtBQUsycUUsbUJBQW1CO2NBQ3hCLEtBQUtFLG1CQUFtQjtjQUN4QixLQUFLRCxzQkFBc0I7Y0FDM0IsS0FBS00sbUJBQW1CO2NBQ3hCLEtBQUtDLHdCQUF3QjtnQkFDM0IsT0FBT25yRSxJQUFJO2NBRWI7Z0JBQ0UsSUFBSWdzRSxZQUFZLEdBQUdoc0UsSUFBSSxJQUFJQSxJQUFJLENBQUM2ckUsUUFBUTtnQkFFeEMsUUFBUUcsWUFBWTtrQkFDbEIsS0FBS2hCLHlCQUF5QjtrQkFDOUIsS0FBS0Qsa0JBQWtCO2tCQUN2QixLQUFLRSxzQkFBc0I7a0JBQzNCLEtBQUtJLGVBQWU7a0JBQ3BCLEtBQUtELGVBQWU7a0JBQ3BCLEtBQUtOLG1CQUFtQjtvQkFDdEIsT0FBT2tCLFlBQVk7a0JBRXJCO29CQUNFLE9BQU9ILFFBQVE7Z0JBQ25CO1lBRUo7VUFFRixLQUFLbkIsaUJBQWlCO1lBQ3BCLE9BQU9tQixRQUFRO1FBQ25CO01BQ0Y7TUFFQSxPQUFPbm1FLFNBQVM7SUFDbEI7SUFDQSxJQUFJdW1FLGVBQWUsR0FBR2xCLGtCQUFrQjtJQUN4QyxJQUFJbUIsZUFBZSxHQUFHcEIsbUJBQW1CO0lBQ3pDLElBQUlxQixPQUFPLEdBQUcxQixrQkFBa0I7SUFDaEMsSUFBSTJCLFVBQVUsR0FBR25CLHNCQUFzQjtJQUN2QyxJQUFJNzhELFFBQVEsR0FBR3U4RCxtQkFBbUI7SUFDbEMsSUFBSTBCLElBQUksR0FBR2hCLGVBQWU7SUFDMUIsSUFBSWlCLElBQUksR0FBR2xCLGVBQWU7SUFDMUIsSUFBSW1CLE1BQU0sR0FBRzdCLGlCQUFpQjtJQUM5QixJQUFJOEIsUUFBUSxHQUFHM0IsbUJBQW1CO0lBQ2xDLElBQUk0QixVQUFVLEdBQUc3QixzQkFBc0I7SUFDdkMsSUFBSThCLFFBQVEsR0FBR3hCLG1CQUFtQjtJQUNsQyxJQUFJeUIsWUFBWSxHQUFHeEIsd0JBQXdCO0lBQzNDLElBQUl5QixtQ0FBbUMsR0FBRyxLQUFLO0lBQy9DLElBQUlDLHdDQUF3QyxHQUFHLEtBQUssQ0FBQyxDQUFDOztJQUV0RCxTQUFTQyxXQUFXQSxDQUFDNWdFLE1BQU0sRUFBRTtNQUMzQjtRQUNFLElBQUksQ0FBQzBnRSxtQ0FBbUMsRUFBRTtVQUN4Q0EsbUNBQW1DLEdBQUcsSUFBSSxDQUFDLENBQUM7O1VBRTVDajFELE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyx1REFBdUQsR0FBRyxtQ0FBbUMsQ0FBQztRQUNoSDtNQUNGO01BRUEsT0FBTyxLQUFLO0lBQ2Q7SUFDQSxTQUFTbzFELGdCQUFnQkEsQ0FBQzdnRSxNQUFNLEVBQUU7TUFDaEM7UUFDRSxJQUFJLENBQUMyZ0Usd0NBQXdDLEVBQUU7VUFDN0NBLHdDQUF3QyxHQUFHLElBQUksQ0FBQyxDQUFDOztVQUVqRGwxRCxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsNERBQTRELEdBQUcsbUNBQW1DLENBQUM7UUFDckg7TUFDRjtNQUVBLE9BQU8sS0FBSztJQUNkO0lBQ0EsU0FBU2tuRCxpQkFBaUJBLENBQUMzeUQsTUFBTSxFQUFFO01BQ2pDLE9BQU82L0QsTUFBTSxDQUFDNy9ELE1BQU0sQ0FBQyxLQUFLNitELGtCQUFrQjtJQUM5QztJQUNBLFNBQVNpQyxpQkFBaUJBLENBQUM5Z0UsTUFBTSxFQUFFO01BQ2pDLE9BQU82L0QsTUFBTSxDQUFDNy9ELE1BQU0sQ0FBQyxLQUFLNCtELG1CQUFtQjtJQUMvQztJQUNBLFNBQVNtQyxTQUFTQSxDQUFDL2dFLE1BQU0sRUFBRTtNQUN6QixPQUFPLE9BQU9BLE1BQU0sS0FBSyxRQUFRLElBQUlBLE1BQU0sS0FBSyxJQUFJLElBQUlBLE1BQU0sQ0FBQzIvRCxRQUFRLEtBQUtwQixrQkFBa0I7SUFDaEc7SUFDQSxTQUFTeUMsWUFBWUEsQ0FBQ2hoRSxNQUFNLEVBQUU7TUFDNUIsT0FBTzYvRCxNQUFNLENBQUM3L0QsTUFBTSxDQUFDLEtBQUsrK0Qsc0JBQXNCO0lBQ2xEO0lBQ0EsU0FBU2tDLFVBQVVBLENBQUNqaEUsTUFBTSxFQUFFO01BQzFCLE9BQU82L0QsTUFBTSxDQUFDNy9ELE1BQU0sQ0FBQyxLQUFLeStELG1CQUFtQjtJQUMvQztJQUNBLFNBQVN5QyxNQUFNQSxDQUFDbGhFLE1BQU0sRUFBRTtNQUN0QixPQUFPNi9ELE1BQU0sQ0FBQzcvRCxNQUFNLENBQUMsS0FBS20vRCxlQUFlO0lBQzNDO0lBQ0EsU0FBU2dDLE1BQU1BLENBQUNuaEUsTUFBTSxFQUFFO01BQ3RCLE9BQU82L0QsTUFBTSxDQUFDNy9ELE1BQU0sQ0FBQyxLQUFLay9ELGVBQWU7SUFDM0M7SUFDQSxTQUFTa0MsUUFBUUEsQ0FBQ3BoRSxNQUFNLEVBQUU7TUFDeEIsT0FBTzYvRCxNQUFNLENBQUM3L0QsTUFBTSxDQUFDLEtBQUt3K0QsaUJBQWlCO0lBQzdDO0lBQ0EsU0FBUzZDLFVBQVVBLENBQUNyaEUsTUFBTSxFQUFFO01BQzFCLE9BQU82L0QsTUFBTSxDQUFDNy9ELE1BQU0sQ0FBQyxLQUFLMitELG1CQUFtQjtJQUMvQztJQUNBLFNBQVMyQyxZQUFZQSxDQUFDdGhFLE1BQU0sRUFBRTtNQUM1QixPQUFPNi9ELE1BQU0sQ0FBQzcvRCxNQUFNLENBQUMsS0FBSzArRCxzQkFBc0I7SUFDbEQ7SUFDQSxTQUFTNkMsVUFBVUEsQ0FBQ3ZoRSxNQUFNLEVBQUU7TUFDMUIsT0FBTzYvRCxNQUFNLENBQUM3L0QsTUFBTSxDQUFDLEtBQUtnL0QsbUJBQW1CO0lBQy9DO0lBQ0EsU0FBU3dDLGNBQWNBLENBQUN4aEUsTUFBTSxFQUFFO01BQzlCLE9BQU82L0QsTUFBTSxDQUFDNy9ELE1BQU0sQ0FBQyxLQUFLaS9ELHdCQUF3QjtJQUNwRDtJQUVBem1CLHVCQUF1QixHQUFHdW5CLGVBQWU7SUFDekN2bkIsdUJBQXVCLEdBQUd3bkIsZUFBZTtJQUN6Q3huQixlQUFlLEdBQUd5bkIsT0FBTztJQUN6QnpuQixrQkFBa0IsR0FBRzBuQixVQUFVO0lBQy9CMW5CLGdCQUFnQixHQUFHdDJDLFFBQVE7SUFDM0JzMkMsWUFBWSxHQUFHMm5CLElBQUk7SUFDbkIzbkIsWUFBWSxHQUFHNG5CLElBQUk7SUFDbkI1bkIsY0FBYyxHQUFHNm5CLE1BQU07SUFDdkI3bkIsZ0JBQWdCLEdBQUc4bkIsUUFBUTtJQUMzQjluQixrQkFBa0IsR0FBRytuQixVQUFVO0lBQy9CL25CLGdCQUFnQixHQUFHZ29CLFFBQVE7SUFDM0Job0Isb0JBQW9CLEdBQUdpb0IsWUFBWTtJQUNuQ2pvQixtQkFBbUIsR0FBR29vQixXQUFXO0lBQ2pDcG9CLHdCQUF3QixHQUFHcW9CLGdCQUFnQjtJQUMzQ3JvQix5QkFBeUIsR0FBR21hLGlCQUFpQjtJQUM3Q25hLHlCQUF5QixHQUFHc29CLGlCQUFpQjtJQUM3Q3RvQixpQkFBaUIsR0FBR3VvQixTQUFTO0lBQzdCdm9CLG9CQUFvQixHQUFHd29CLFlBQVk7SUFDbkN4b0Isa0JBQWtCLEdBQUd5b0IsVUFBVTtJQUMvQnpvQixjQUFjLEdBQUcwb0IsTUFBTTtJQUN2QjFvQixjQUFjLEdBQUcyb0IsTUFBTTtJQUN2QjNvQixnQkFBZ0IsR0FBRzRvQixRQUFRO0lBQzNCNW9CLGtCQUFrQixHQUFHNm9CLFVBQVU7SUFDL0I3b0Isb0JBQW9CLEdBQUc4b0IsWUFBWTtJQUNuQzlvQixrQkFBa0IsR0FBRytvQixVQUFVO0lBQy9CL29CLHNCQUFzQixHQUFHZ3BCLGNBQWM7SUFDdkNocEIsMEJBQTBCLEdBQUdrYSxrQkFBa0I7SUFDL0NsYSxjQUFjLEdBQUdxbkIsTUFBTTtFQUNyQixDQUFDLEVBQUUsQ0FBQztBQUNOOzs7Ozs7Ozs7OztBQzVOYTs7QUFFYixJQUFJbnBCLEtBQXFDLEVBQUUsRUFFMUMsTUFBTTtFQUNMTyx5SkFBeUQ7QUFDM0Q7Ozs7Ozs7Ozs7O0FDTmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtC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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7QUN2QkE7QUFDQSxrQkFBa0IsbUJBQU8sQ0FBQyxpRkFBWTs7QUFFdEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLFFBQVEsNEJBQTRCO0FBQ3BDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sNkJBQTZCO0FBQ3BDLFdBQVcsaUNBQWlDO0FBQzVDLFVBQVUsZ0NBQWdDO0FBQzFDLFdBQVcsaUNBQWlDO0FBQzVDLE9BQU8scUNBQXFDO0FBQzVDLFNBQVMsMkNBQTJDO0FBQ3BELFFBQVE7QUFDUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxnQkFBZ0I7QUFDckUsbURBQW1ELGNBQWM7QUFDakU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsT0FBTyxRQUFRO0FBQ2hDLGlCQUFpQixPQUFPLFFBQVE7QUFDaEMsa0JBQWtCLE9BQU8sT0FBTztBQUNoQyxrQkFBa0IsT0FBTyxPQUFPO0FBQ2hDLGlCQUFpQixRQUFRLE9BQU87QUFDaEMsaUJBQWlCLFFBQVEsT0FBTztBQUNoQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUU7O0FBRXZFOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQ0FBK0MsRUFBRSxVQUFVLEVBQUU7QUFDN0Q7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQixhQUFhLGFBQWE7QUFDMUM7QUFDQSxnQkFBZ0IsYUFBYSxhQUFhO0FBQzFDO0FBQ0EsZ0JBQWdCLGFBQWEsYUFBYTtBQUMxQztBQUNBLGdCQUFnQixhQUFhLGFBQWE7QUFDMUM7QUFDQSxnQkFBZ0IsYUFBYSxhQUFhO0FBQzFDO0FBQ0EsZ0JBQWdCLGFBQWE7QUFDN0I7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNuMkJBLGtCQUFrQixtQkFBTyxDQUFDLGtFQUFlO0FBQ3pDLFlBQVksbUJBQU8sQ0FBQyxzREFBUzs7QUFFN0I7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQSx3Q0FBd0MsU0FBUztBQUNqRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsd0RBQXdELHVDQUF1QztBQUMvRixzREFBc0QscUNBQXFDOztBQUUzRjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRixDQUFDOztBQUVEOzs7Ozs7Ozs7Ozs7QUM3RVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2SkEsa0JBQWtCLG1CQUFPLENBQUMsa0VBQWU7O0FBRXpDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0MsU0FBUztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDBDQUEwQyxTQUFTO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQyxTQUFTO0FBQy9DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDL0ZZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7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QSxjQUFjLGNBQWM7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixjQUFjO0FBQ2hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNFQUFzRSxtQ0FBbUM7O0FBRXpHO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsWUFBWTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNB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O0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBLDBIQUEwSDtBQUMxSCxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUtBQW1LO0FBQ25L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QUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLGtCQUFrQjtBQUNwQzs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsOEJBQThCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQiw4QkFBOEI7O0FBRWhEO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sMEdBQTBHLFlBQVksV0FBVyxVQUFVLFVBQVUsVUFBVSxZQUFZLGFBQWEsV0FBVyxZQUFZLGFBQWEsV0FBVyxVQUFVLFVBQVUsTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsVUFBVSxPQUFPLEtBQUssWUFBWSxhQUFhLFdBQVcsVUFBVSxVQUFVLFVBQVUsWUFBWSxhQUFhLFdBQVcsVUFBVSxZQUFZLGFB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Q0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QyxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsUUFBUTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7O0FBRUE7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUMsNENBQTRDOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0Esa0JBQWtCO0FBQ2xCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLFFBQVE7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHFCQUFxQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0M7QUFDL0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0M7QUFDL0M7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7QUFDRDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0Esc0JBQXNCLGdCQUFnQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBEQUEwRDtBQUMxRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJC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Q0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZTtBQUNmLCtCQUErQixRQUFRO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssR0FBRztBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLFlBQVk7QUFDOUI7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixhQUFhO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixXQUFXO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsbUJBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsdUJBQXVCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsOEJB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Q0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0Esa0JBQWtCLHFCQUFxQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLHNCQUFzQjtBQUN6QztBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ04sMEVBQTBFO0FBQzFFO0FBQ0EsNERBQTREO0FBQzVEOztBQUVBO0FBQ0Esb0JBQW9CLHVCQUF1QjtBQUMzQztBQUNBO0FBQ0E7QUFDQSxzQkFBc0IscUJBQXFCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEIsaUJBQWlCO0FBQ2pCLGtCQUFrQjs7QUFFbEI7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLHFCQUFxQjtBQUN2QyxvQkFBb0IsUUFBUTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQSxxQkFBcUIsdUJBQXVCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHdCQUF3QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsdUJBQXVCO0FBQzFDO0FBQ0Esb0JBQW9CLHFCQUFxQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZUFBZTtBQUNuQztBQUNBLHNCQUFzQixlQUFlO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7O0FBRUE7O0FBRUEsU0FBUztBQUNULFVBQVU7QUFDVixTQUFTO0FBQ1QsU0FBUztBQUNULFNBQVM7QUFDVCxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQixTQUFTO0FBQzVCLHVCQUF1QjtBQUN2Qjs7QUFFQSxvQkFBb0IsU0FBUztBQUM3QixvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0IsVUFBVTtBQUM5QjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0IsVUFBVTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFNBQVM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLDJCQUEyQjtBQUM1Qzs7QUFFQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFFBQVE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixTQUFTO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0I7QUFDQSx3QkFBd0IsU0FBUztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixTQUFTO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBdUIsVUFBVTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsVUFBVTtBQUNuQztBQUNBLDBCQUEwQiwwQkFBMEI7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDZCQUE2QjtBQUMvQztBQUNBO0FBQ0EscUJBQXFCLHFCQUFxQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDhCQUE4QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDLFlBQVk7QUFDWixxQ0FBcUM7QUFDckMsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsOEJBQThCO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EseURBQXlEOztBQUV6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QjtBQUN2Qix5QkFBeUI7QUFDekIsd0JBQXdCOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCLGlDQUFpQztBQUNqQyxpQ0FBaUM7QUFDakMseUJBQXlCO0FBQ3pCLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUIsbUVBQW1FO0FBQ25FLGdFQUFnRTtBQUNoRTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4Qix3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtGQUErRjtBQUMvRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQSxvQkFBb0IscUJBQXFCO0FBQ3pDO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0EsNkRBQTZEO0FBQzdEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUix3QkFBd0I7QUFDeEI7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0EsbUVBQW1FO0FBQ25FLE9BQU87QUFDUDtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBLDJCQUEyQjtBQUMzQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixlQUFlO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFdBQVc7QUFDWCxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsZ0VBQWdFOztBQUVoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7O0FBRXZCO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0JBQXNCLHFCQUFxQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlEO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGdCQUFnQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlEO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7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QTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDJCQUEyQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHFCQUFxQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiwyQkFBMkI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1B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Q0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7O0FBRTNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGdCQUFnQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLFFBQVE7QUFDUjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1IsTUFBTTs7QUFFTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7O0FBRWxDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixpQkFBaUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLElBQUk7O0FBRUwsMEJBQTBCOztBQUUxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkNBQTJDO0FBQzNDO0FB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R0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG9CQUFvQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixpQkFBaUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixrQkFBa0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxRQUFRO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQ0FBcUMsUUFBUTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBLE1BQU07O0FBRU47O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixnQkFBZ0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FB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QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQsY0FBYztBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRUFBbUU7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQixrQkFBa0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsa0JBQWtCLDZCQUE2QjtBQUMvQztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRyxJQUFJO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxtQkFBbUIsbUJBQW1CO0FBQ3RDO0FBQ0EsNkJBQTZCO0FBQzdCOztBQUVBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsaUJBQWlCLEdBQUc7QUFDcEI7QUFDQSxHQUFHO0FBQ0gsaUJBQWlCLEdBQUc7QUFDcEI7QUFDQSxHQUFHO0FBQ0gsaUJBQWlCLEdBQUc7QUFDcEI7QUFDQSxHQUFHO0FBQ0gsb0JBQW9CLDZCQUE2QjtBQUNqRCxzQ0FBc0MsR0FBRztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsSUFBSTtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUcsSUFBSTtBQUNQO0FBQ0Esa0JBQWtCLDRCQUE0QjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsd0JBQXdCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhFQUE4RTtBQUM5RTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FB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QSxpQkFBaUI7QUFDakIsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QSwwQkFBMEI7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHVCQUF1QjtBQUN6QztBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IseUJBQXlCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGdCQUFnQjs7QUFFaEI7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQix5QkFBeUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHFCQUFxQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQixnQ0FBZ0M7QUFDbEQ7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLHlCQUF5QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLG1CQUFtQjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix5QkFBeUI7QUFDM0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0NBQWdDO0FBQ2xEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQSwwQkFBMEIsY0FBYztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7O0FBRXZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCLG1CQUFtQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjs7QUFFQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0EsMkJBQTJCO0FBQzNCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjs7QUFFQTtBQUNBO0FBQ0EsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQSx5Q0FBeUMsbUJBQW1CO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLGlCQUFpQixLQUFLO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEIsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixpQkFBaUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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RXZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLHNDQUFzQztBQUN0Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQzs7QUFFakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGVBQWU7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixhQUFhO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRDtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStEO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0Esa0NBQWtDOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsVUFBVTs7QUFFVixZQUFZO0FBQ1osWUFBWTs7QUFFWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKLDRCQUE0QjtBQUM1QixJQUFJO0FBQ0o7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGlCQUFpQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQix5QkFBeUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixpQkFBaUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0Isb0JBQW9CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0Isb0JBQW9CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLHdCQUF3QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSwyQ0FBMkM7O0FBRTNDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDBEQUEwRDtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixrQkFBa0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsMkJBQTJCO0FBQ2pEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsbUJBQW1CO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxzREFBc0Q7O0FBRXREO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSwwREFBMEQ7O0FBRTFEO0FBQ0EscURBQXFEOztBQUVyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUix1QkFBdUI7QUFDdkI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isd0JBQXdCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3QkFBd0IsZ0JBQWdCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSx5QkFBeUIseUJBQXlCO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBLGdDQUFnQzs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixxQkFBcUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsdUJBQXVCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQix5QkFBeUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBRUQsNkJBQTZCOztBQUU3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixxQkFBcUI7QUFDakQ7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG1CQUFtQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsbUJBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixtQkFBbUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osMkNBQTJDO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsbUJBQW1CO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG9CQUFvQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIscUJBQXFCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixvQkFBb0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDOztBQUUvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsNEJBQTRCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0U7O0FBRWxFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1YsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isa0JBQWtCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixtQkFBbUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBLHVCQUF1Qjs7QUFFdkI7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHFCQUFxQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isb0JBQW9CO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHVCQUF1QjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHdCQUF3QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGlCQUFpQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLGlCQUFpQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaURBQWlEO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFEOztBQUVyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGtCQUFrQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsV0FBVztBQUNYLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHVCQUF1QjtBQUN6Qyx3RUFBd0U7QUFDeEU7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHNCQUFzQjtBQUN4QyxpRUFBaUU7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBcUIsa0JBQWtCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNB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LFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUUxQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvRUFBb0UsV0FBVztBQUMvRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLGNBQWM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNB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Ozs7Ozs7QUNBdEM7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsbUNBQW1DLDBCQUEwQjtBQUNwSDtBQUNBLEtBQUs7QUFDTDtBQUNBLHNDQUFzQyxXQUFXO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsV0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxrQkFBa0IsT0FBTztBQUN6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixVQUFVO0FBQzlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQSxpQ0FBaUMsZ0NBQW1COztBQUVwRDs7O0FBR0E7QUFDQSxZQUFZLGdDQUFtQjs7QUFFL0I7QUFDQSxXQUFXLGdDQUFtQixLQUFLO0FBQ25DOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsbUJBQW1CO0FBQ3ZDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQSxJQUFJOztBQUVKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsMEJBQTBCO0FBQzVDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLE9BQU87QUFDUDtBQUNBLGlDQUFpQyxnQ0FBbUI7O0FBRXBEOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsWUFBWSxnQ0FBbUI7O0FBRS9COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0EscUdBQXFHLHFCQUFxQixtQkFBbUI7O0FBRTdJOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0EsaUNBQWlDLGdDQUFtQjs7QUFFcEQ7OztBQUdBLG1DQUFtQywwQkFBMEIsMENBQTBDLGdCQUFnQixPQUFPLG9CQUFvQixlQUFlLE9BQU87O0FBRXhLLHNCQUFzQixnQ0FBbUI7QUFDekMsb0JBQW9CLGdDQUFtQjtBQUN2QyxZQUFZLGdDQUFtQjtBQUMvQixZQUFZLGdDQUFtQjtBQUMvQixhQUFhLGdDQUFtQjtBQUNoQyxhQUFhLGdDQUFtQjtBQUNoQyxnQkFBZ0IsZ0NBQW1CO0FBQ25DLGNBQWMsZ0NBQW1COztBQUVqQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IscUJBQXFCO0FBQ3pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isa0JBQWtCO0FBQ3hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHNCQUFzQixrQkFBa0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0Isa0JBQWtC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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbURBQW1EOztBQUVuRDtBQUNBLDhDQUE4Qzs7QUFFOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQyxzRUFBc0U7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxrRUFBa0U7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGNBQWMsT0FBTzs7QUFFckI7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSx3QkFBd0IsYUFBYTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSx3QkFBd0IsYUFBYTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix3QkFBd0I7QUFDMUM7QUFDQTtBQUNBLHNCQUFzQixZQUFZO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLGFBQWE7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsWUFBWTtBQUNwQztBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsMEJBQTBCLGNBQWM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsY0FBYztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsd0JBQXdCLGNBQWM7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGNBQWM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsY0FBYztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLDhCQUE4QixjQUFjO0FBQzVDO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixhQUFhO0FBQzFDLGdDQUFnQyxjQUFjO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsY0FBYztBQUM1QztBQUNBLGdDQUFnQyxjQUFjO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGVBQWU7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixVQUFVO0FBQ2xDLHlCQUF5QixlQUFlO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsU0FBUztBQUNwQztBQUNBLCtCQUErQixVQUFVO0FBQ3pDO0FBQ0EsOEJBQThCLGVBQWU7QUFDN0M7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLGVBQWU7QUFDN0M7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGVBQWU7QUFDM0M7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGVBQWU7QUFDMUM7QUFDQTtBQUNBLFFBQVE7QUFDUiwyQkFBMkIsZUFBZTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixVQUFVO0FBQ3pDO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsZ0NBQWdDLFVBQVU7QUFDMUM7QUFDQSxtQ0FBbUMsZUFBZTtBQUNsRDtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsZUFBZTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixlQUFlO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixXQUFXO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxZQUFZO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixTQUFTO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsYUFBYTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxZQUFZO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTtBQUNB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RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUSxXQUFXO0FBQzlCLFdBQVcsU0FBUztBQUNwQjtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLFdBQVcsU0FBUztBQUNwQjtBQUNBLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLCtDQUErQyxpQkFBaUI7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRCxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1IsNEVBQTRFO0FBQzVFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRCQUE0QixxQkFBcUI7QUFDakQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0EscUNBQXFDLDRCQUE0QjtBQUNqRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBNkIsMEJBQTBCLGVBQWU7QUFDdEU7O0FBRU87QUFDUDtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDaG9CNEM7O0FBRTVDO0FBQ0F4ZixNQUFNLENBQUN5RSxZQUFZLEdBQUdBLHVEQUFZLEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BwbG90bHkvZGFzaC1jb21wb25lbnQtcGx1Z2lucy9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9pY29ucy9CZWxsSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0NoZWNrSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0Nsb2NrSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0NvbGxhcHNlSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0RlYnVnSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0dyYXBoSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL09mZkljb24uc3ZnIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvQVBJQ29udHJvbGxlci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL0FwcENvbnRhaW5lci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL0FwcFByb3ZpZGVyLnJlYWN0LnRzeCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL0Rhc2hSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL1N0b3JlT2JzZXJ2ZXIudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9UcmVlQ29udGFpbmVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9hcGkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2NhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvY29uc3RhbnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9kZXBlbmRlbmNpZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2RlcGVuZGVuY2llc190cy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2lzQXBwUmVhZHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2lzTG9hZGluZy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvbG9hZGluZ01hcC50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvcGF0Y2gudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL3BhdGhzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9yZXF1ZXN0RGVwZW5kZW5jaWVzLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy91dGlscy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NoZWNrUHJvcFR5cGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9jb3JlL0xvYWRpbmcucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2NvcmUvUmVsb2FkZXIucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2NvcmUvVG9vbGJhci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvQ2FsbGJhY2tHcmFwaC9DYWxsYmFja0dyYXBoQ29udGFpbmVyLnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9DYWxsYmFja0dyYXBoL0NhbGxiYWNrR3JhcGhDb250YWluZXJTdHlsZXNoZWV0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9DYWxsYmFja0dyYXBoL0NhbGxiYWNrR3JhcGhFZmZlY3RzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9Db21wb25lbnRFcnJvckJvdW5kYXJ5LnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9Gcm9udEVuZC9Gcm9udEVuZEVycm9yLnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9Gcm9udEVuZC9Gcm9udEVuZEVycm9yQ29udGFpbmVyLnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9HbG9iYWxFcnJvckNvbnRhaW5lci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvR2xvYmFsRXJyb3JPdmVybGF5LnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9tZW51L0RlYnVnTWVudS5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3Ivd2Vya3pldWdjc3MuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb25maWcudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb25zdGFudHMvY29uc3RhbnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvZXhjZXB0aW9ucy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2lzU2ltcGxlQ29tcG9uZW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvb2JzZXJ2ZXJzL2RvY3VtZW50VGl0bGUudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9vYnNlcnZlcnMvZXhlY3V0ZWRDYWxsYmFja3MudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9vYnNlcnZlcnMvZXhlY3V0aW5nQ2FsbGJhY2tzLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvb2JzZXJ2ZXJzL2lzTG9hZGluZy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL29ic2VydmVycy9sb2FkaW5nTWFwLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvb2JzZXJ2ZXJzL3ByaW9yaXRpemVkQ2FsbGJhY2tzLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvb2JzZXJ2ZXJzL3JlcXVlc3RlZENhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL29ic2VydmVycy9zdG9yZWRDYWxsYmFja3MudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9wZXJzaXN0ZW5jZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2FwaS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2FwcExpZmVjeWNsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2NhbGxiYWNrSm9icy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2NhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2NoYW5nZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9jb25maWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9kZXBlbmRlbmN5R3JhcGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9lcnJvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2hpc3RvcnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9ob29rcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2lzTG9hZGluZy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2xheW91dC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2xvYWRpbmdNYXAudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9wYXRocy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL3Byb2ZpbGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9yZWR1Y2VyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVnaXN0cnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9zdG9yZS50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3V0aWxzL1RyZWVDb250YWluZXIudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy91dGlscy9jYWxsYmFja3MudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy91dGlscy93YWl0LnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY3l0b3NjYXBlLWZjb3NlL2N5dG9zY2FwZS1mY29zZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4uL3NyYy90eXBlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4uL3NyYy9kaWZmLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi4vc3JjL2pzb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uLi9zcmMvZGVmYXVsdHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uLi9zcmMvcGF0Y2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uLi9zcmMvY29tcG9uZW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29tcG9uZW50cy9Db250ZXh0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29tcG9uZW50cy9Qcm92aWRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2NvbXBvbmVudHMvY29ubmVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3QvaW52YWxpZEFyZ0ZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L21hcERpc3BhdGNoVG9Qcm9wcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3QvbWFwU3RhdGVUb1Byb3BzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9tZXJnZVByb3BzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9zZWxlY3RvckZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L3ZlcmlmeVN1YnNlbGVjdG9ycy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3Qvd3JhcE1hcFRvUHJvcHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9leHBvcnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvaG9va3MvdXNlRGlzcGF0Y2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9ob29rcy91c2VSZWR1eENvbnRleHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9ob29rcy91c2VTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2hvb2tzL3VzZVN0b3JlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy90eXBlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL1N1YnNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL2JhdGNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvYmluZEFjdGlvbkNyZWF0b3JzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvaXNQbGFpbk9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL3JlYWN0QmF0Y2hlZFVwZGF0ZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy9zaGFsbG93RXF1YWwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvdXNlU3luY0V4dGVybmFsU3RvcmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy92ZXJpZnlQbGFpbk9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL3dhcm5pbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hcGF0aHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2FzaGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hdGVsaWVyLWR1bmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2F0ZWxpZXItZm9yZXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hdGVsaWVyLWhlYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hdGVsaWVyLWxha2VzaWRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hdGVsaWVyLXNlYXNpZGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2Jlc3Bpbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYnJld2VyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9icmlnaHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2NoYWxrLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9jb2Rlc2Nob29sLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9jb2xvcnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2RlZmF1bHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2VpZ2h0aWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9lbWJlcnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2ZsYXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2dvb2dsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvZ3JheXNjYWxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9ncmVlbnNjcmVlbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvaGFybW9uaWMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2hvcHNjb3RjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2lzb3RvcGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL21hcnJha2VzaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvbW9jaGEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL21vbm9rYWkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL29jZWFuLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9wYXJhaXNvLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9wb3AuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3JhaWxzY2FzdHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3NoYXBlc2hpZnRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvc29sYXJpemVkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9zdW1tZXJmcnVpdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvdGhyZWV6ZXJvdHdvZm91ci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvdG9tb3Jyb3cuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3R1YmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3R3aWxpZ2h0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9jb252ZXJzaW9ucy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2NvbG9yLWNvbnZlcnQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jb2xvci1jb252ZXJ0L25vZGVfbW9kdWxlcy9jb2xvci1uYW1lL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9yb3V0ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2NvbG9yLW5hbWUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jb2xvci1zdHJpbmcvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jb2xvci9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Nvb2tpZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Nvc2UtYmFzZS9jb3NlLWJhc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2NvcmUvVG9vbGJhci5jc3MiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0NhbGxiYWNrR3JhcGgvQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5jc3MiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0Zyb250RW5kL0Zyb250RW5kRXJyb3IuY3NzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9HbG9iYWxFcnJvck92ZXJsYXkuY3NzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9QZXJjeS5jc3MiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvRGVidWdNZW51LmNzcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jeXRvc2NhcGUtZGFncmUvY3l0b3NjYXBlLWRhZ3JlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY3l0b3NjYXBlL2Rpc3QvY3l0b3NjYXBlLmNqcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL2FjeWNsaWMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvYWRkLWJvcmRlci1zZWdtZW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9jb29yZGluYXRlLXN5c3RlbS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9kYXRhL2xpc3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvZGVidWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvZ3JhcGhsaWIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvZ3JlZWR5LWZhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9sYXlvdXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvbG9kYXNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL25lc3RpbmctZ3JhcGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvbm9ybWFsaXplLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2FkZC1zdWJncmFwaC1jb25zdHJhaW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9vcmRlci9iYXJ5Y2VudGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2J1aWxkLWxheWVyLWdyYXBoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2Nyb3NzLWNvdW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2luaXQtb3JkZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvcmVzb2x2ZS1jb25mbGljdHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvc29ydC1zdWJncmFwaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9vcmRlci9zb3J0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL3BhcmVudC1kdW1teS1jaGFpbnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcG9zaXRpb24vYmsuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcG9zaXRpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcmFuay9mZWFzaWJsZS10cmVlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL3JhbmsvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcmFuay9uZXR3b3JrLXNpbXBsZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcmFuay91dGlsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL3V0aWwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RlcGVuZGVuY3ktZ3JhcGgvbGliL2RlcF9ncmFwaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Zhc3QtaXNudW1lcmljL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2NvbXBvbmVudHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2Rmcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvZGlqa3N0cmEtYWxsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9kaWprc3RyYS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvZmluZC1jeWNsZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2Zsb3lkLXdhcnNoYWxsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvaXMtYWN5Y2xpYy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvcG9zdG9yZGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9wcmVvcmRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvcHJpbS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvdGFyamFuLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy90b3Bzb3J0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2RhdGEvcHJpb3JpdHktcXVldWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvZ3JhcGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvanNvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9sb2Rhc2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2hlYXAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9oZWFwL2xpYi9oZWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MvZGlzdC9ob2lzdC1ub24tcmVhY3Qtc3RhdGljcy5janMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9pbnZhcmlhbnQvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2lzLXN0cmluZy1ibGFuay9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xheW91dC1iYXNlL2xheW91dC1iYXNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoLmN1cnJ5L2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19EYXRhVmlldy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fSGFzaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fTGlzdENhY2hlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19NYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX01hcENhY2hlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19Qcm9taXNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1NldENhY2hlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TdGFjay5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fU3ltYm9sLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19VaW50OEFycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19XZWFrTWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcHBseS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlFYWNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUZpbHRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlJbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlJbmNsdWRlc1dpdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5TGlrZUtleXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5TWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheVB1c2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5UmVkdWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheVNvbWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FzY2lpU2l6ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNzaWduTWVyZ2VWYWx1ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNzaWduVmFsdWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Fzc29jSW5kZXhPZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUFzc2lnbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUFzc2lnbkluLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQXNzaWduVmFsdWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VDbG9uZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUNyZWF0ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUVhY2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VFeHRyZW11bS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUZpbHRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUZpbmRJbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUZsYXR0ZW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGb3IuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGb3JPd24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRBbGxLZXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0VGFnLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VIYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VIYXNJbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUluZGV4T2YuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc0FyZ3VtZW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzRXF1YWwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc0VxdWFsRGVlcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNNYXRjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTmFOLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNOYXRpdmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc1NldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUl0ZXJhdGVlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlS2V5cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUtleXNJbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUx0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTWF0Y2hlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1hdGNoZXNQcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1lcmdlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTWVyZ2VEZWVwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlT3JkZXJCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVBpY2suanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQaWNrQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVByb3BlcnR5RGVlcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVJhbmdlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUmVkdWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUmVzdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVNldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVNldFRvU3RyaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlU29ydEJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVGltZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRyaW0uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VVbmFyeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVVuaXEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VWYWx1ZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VaaXBPYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NhY2hlSGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jYXN0RnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nhc3RQYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZUFycmF5QnVmZmVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZUJ1ZmZlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVEYXRhVmlldy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVSZWdFeHAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lU3ltYm9sLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZVR5cGVkQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvbXBhcmVBc2NlbmRpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvbXBhcmVNdWx0aXBsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29weUFycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3B5T2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3B5U3ltYm9scy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29weVN5bWJvbHNJbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29yZUpzRGF0YS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlQXNzaWduZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUJhc2VFYWNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVCYXNlRm9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVGaW5kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVSYW5nZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19kZWZpbmVQcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZXF1YWxBcnJheXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2VxdWFsQnlUYWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2VxdWFsT2JqZWN0cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZmxhdFJlc3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZyZWVHbG9iYWwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldEFsbEtleXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldEFsbEtleXNJbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TWFwRGF0YS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TWF0Y2hEYXRhLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXROYXRpdmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFByb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0UmF3VGFnLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRTeW1ib2xzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRTeW1ib2xzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFRhZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0VmFsdWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc1BhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc1VuaWNvZGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hDbGVhci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaERlbGV0ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaEdldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaEhhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaFNldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faW5pdENsb25lQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2luaXRDbG9uZUJ5VGFnLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pbml0Q2xvbmVPYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzRmxhdHRlbmFibGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzSW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzSXRlcmF0ZWVDYWxsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0tleS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNLZXlhYmxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc01hc2tlZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNQcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzU3RyaWN0Q29tcGFyYWJsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZURlbGV0ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlR2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVIYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZVNldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVDbGVhci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVEZWxldGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlR2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUhhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVTZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcFRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hdGNoZXNTdHJpY3RDb21wYXJhYmxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tZW1vaXplQ2FwcGVkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVDcmVhdGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUtleXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUtleXNJbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbm9kZVV0aWwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX29iamVjdFRvU3RyaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vdmVyQXJnLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vdmVyUmVzdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fcm9vdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2FmZUdldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0Q2FjaGVBZGQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldENhY2hlSGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zZXRUb0FycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zZXRUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2hvcnRPdXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrRGVsZXRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0dldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tIYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdHJpY3RJbmRleE9mLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdHJpbmdTaXplLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdHJpbmdUb1BhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3RvS2V5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL190b1NvdXJjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fdHJpbW1lZEVuZEluZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL191bmljb2RlU2l6ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9jbG9uZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9jbG9uZURlZXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZGVib3VuY2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZGVmYXVsdHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZWFjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9lcS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZmluZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9maW5kSW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZmxhdHRlbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9mb3JFYWNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZvckluLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2dldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9oYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaGFzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcmd1bWVudHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5TGlrZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5TGlrZU9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0J1ZmZlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0VtcHR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzRnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNMZW5ndGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNNYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3RMaWtlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzUGxhaW5PYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNTZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNTdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNTeW1ib2wuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNUeXBlZEFycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzVW5kZWZpbmVkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2tleXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gva2V5c0luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2xhc3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL21hcFZhbHVlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9tYXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbWVtb2l6ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9tZXJnZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9taW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbWluQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbm9vcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9ub3cuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvcGljay5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9yYW5nZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvc2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3NpemUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvc29ydEJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9zdHViRmFsc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9GaW5pdGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9JbnRlZ2VyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvTnVtYmVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvUGF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC90b1BsYWluT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvU3RyaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC91bmlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC91bmlxdWVJZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC92YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvemlwT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1iYXNlMTYtc3R5bGluZy9saWIvZXNtL2NvbG9yQ29udmVydGVycy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJhc2UxNi1zdHlsaW5nL2xpYi9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL0l0ZW1SYW5nZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL0pTT05BcnJheU5vZGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9KU09OQXJyb3cuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9KU09OSXRlcmFibGVOb2RlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vSlNPTk5lc3RlZE5vZGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9KU09OTm9kZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL0pTT05PYmplY3ROb2RlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vSlNPTlZhbHVlTm9kZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL2NyZWF0ZVN0eWxpbmdGcm9tVGhlbWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9nZXRDb2xsZWN0aW9uRW50cmllcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vb2JqVHlwZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL3RoZW1lcy9zb2xhcml6ZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWR1eC1hY3Rpb25zL2VzL2NyZWF0ZUFjdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlZHV4LWFjdGlvbnMvZXMvdXRpbHMvaWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWR1eC1hY3Rpb25zL2VzL3V0aWxzL2lzRnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWR1eC1hY3Rpb25zL2VzL3V0aWxzL2lzTnVsbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlZHV4LXRodW5rL2VzL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVkdXgvZXMvcmVkdXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9zaW1wbGUtc3dpenpsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3NpbXBsZS1zd2l6emxlL25vZGVfbW9kdWxlcy9pcy1hcnJheWlzaC9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvY29yZS9Ub29sYmFyLmNzcz9kODEzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9DYWxsYmFja0dyYXBoL0NhbGxiYWNrR3JhcGhDb250YWluZXIuY3NzPzU4ZTIiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0Zyb250RW5kL0Zyb250RW5kRXJyb3IuY3NzP2E5MDAiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0dsb2JhbEVycm9yT3ZlcmxheS5jc3M/YWQzZCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvUGVyY3kuY3NzP2FmMzgiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvRGVidWdNZW51LmNzcz82ZDU0Iiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltL3dpdGgtc2VsZWN0b3IuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvc2hpbS93aXRoLXNlbGVjdG9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvZXh0ZXJuYWwgd2luZG93IFwiUHJvcFR5cGVzXCIiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci9leHRlcm5hbCB3aW5kb3cgXCJSZWFjdFwiIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvZXh0ZXJuYWwgd2luZG93IFwiUmVhY3RET01cIiIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FycmF5TGlrZVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheVdpdGhIb2xlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FycmF5V2l0aG91dEhvbGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2suanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2dldFByb3RvdHlwZU9mLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pdGVyYWJsZVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL25vbkl0ZXJhYmxlUmVzdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL25vbkl0ZXJhYmxlU3ByZWFkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zZXRQcm90b3R5cGVPZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvUHJpbWl0aXZlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Qcm9wZXJ0eUtleS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYWRkSW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9hbGwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9hbHdheXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9hbnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2FwcGVuZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2Fzc29jLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYXNzb2NQYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYmluZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2Nsb25lLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvY29tcGFyYXRvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2NvbmNhdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2NvbnZlcmdlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvY3VycnlOLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZGVmYXVsdFRvLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZGlmZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2Rpc3NvYy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2Rpc3NvY1BhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9lbXB0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2VxdWFscy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2V2b2x2ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ZpbmQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9maW5kSW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9mbGF0dGVuLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZm9yRWFjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ZvckVhY2hPYmpJbmRleGVkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZ3JvdXBCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2hhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2hhc1BhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2luY2x1ZGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW5kZXhPZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2luc2VydC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19TZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fYXJpdHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fYXJyYXlGcm9tSXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fYXJyYXlSZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fYXNzb2MuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY2hlY2tGb3JNZXRob2QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY2xvbmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY2xvbmVSZWdFeHAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY29tcGxlbWVudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jb25jYXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY3JlYXRlUmVkdWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2N1cnJ5MS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jdXJyeTIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY3VycnkzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2N1cnJ5Ti5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19kaXNwYXRjaGFibGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fZGlzc29jLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2VxdWFscy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fZnVuY3Rpb25OYW1lLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2hhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pbmNsdWRlc1dpdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faW5kZXhPZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc0FyZ3VtZW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc0FycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzQXJyYXlMaWtlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzRnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNJbnRlZ2VyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzUGxhY2Vob2xkZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNTdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNUcmFuc2Zvcm1lci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc1R5cGVkQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fbWFrZUZsYXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fbWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX29iamVjdEFzc2lnbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19vYmplY3RJcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19xdW90ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fcmVkdWNlZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL190b0lTT1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL190b1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194QXJyYXlSZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feFJlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194YWxsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hhbnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feGZCYXNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hmaWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feGZpbmQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feGZpbmRJbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194bWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hyZWR1Y2VCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194dGFrZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194dW5pcUJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3h3cmFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJzZWN0aW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pc0VtcHR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaXNOaWwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9qdXh0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMva2V5cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2xlbnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9sZW5zUGF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2x0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWFwT2JqSW5kZXhlZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21heC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21lbW9pemVXaXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWVyZ2VEZWVwUmlnaHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tZXJnZURlZXBXaXRoS2V5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWVyZ2VMZWZ0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWVyZ2VSaWdodC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21lcmdlV2l0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21lcmdlV2l0aEtleS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL250aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL29taXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9vbmNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvb3Zlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3BhcnRpdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3BhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wYXRoT3IuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wYXRocy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3BpY2suanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9waWNrQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wbHVjay5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3ByZXBlbmQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wcm9wLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcHJvcEVxLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcHJvcE9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcHJvcHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9yZWR1Y2VCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3JlamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3JlbW92ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3JldmVyc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9zZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9zbGljZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3NvcnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9zdGFydHNXaXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdGFrZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3RvUGFpcnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy90b1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3R5cGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy91bmlxLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdW5pcUJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdmFsdWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdmlldy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3ppcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3ppcE9iai5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci93ZWJwYWNrL3J1bnRpbWUvbm9kZSBtb2R1bGUgZGVjb3JhdG9yIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvd2VicGFjay9ydW50aW1lL25vbmNlIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvd2hhdHdnLWZldGNoL2ZldGNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiIWZ1bmN0aW9uKGUsbil7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9bihyZXF1aXJlKFwicmVhY3RcIikpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wicmVhY3RcIl0sbik6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0c1tcImRhc2gtY29tcG9uZW50LXBsdWdpbnNcIl09bihyZXF1aXJlKFwicmVhY3RcIikpOmVbXCJkYXNoLWNvbXBvbmVudC1wbHVnaW5zXCJdPW4oZS5SZWFjdCl9KHdpbmRvdywoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPXt9O2Z1bmN0aW9uIHQocil7aWYobltyXSlyZXR1cm4gbltyXS5leHBvcnRzO3ZhciBvPW5bcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiBlW3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLHQpLG8ubD0hMCxvLmV4cG9ydHN9cmV0dXJuIHQubT1lLHQuYz1uLHQuZD1mdW5jdGlvbihlLG4scil7dC5vKGUsbil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4se2VudW1lcmFibGU6ITAsZ2V0OnJ9KX0sdC5yPWZ1bmN0aW9uKGUpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LHQudD1mdW5jdGlvbihlLG4pe2lmKDEmbiYmKGU9dChlKSksOCZuKXJldHVybiBlO2lmKDQmbiYmXCJvYmplY3RcIj09dHlwZW9mIGUmJmUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKHQucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTplfSksMiZuJiZcInN0cmluZ1wiIT10eXBlb2YgZSlmb3IodmFyIG8gaW4gZSl0LmQocixvLGZ1bmN0aW9uKG4pe3JldHVybiBlW25dfS5iaW5kKG51bGwsbykpO3JldHVybiByfSx0Lm49ZnVuY3Rpb24oZSl7dmFyIG49ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIHQuZChuLFwiYVwiLG4pLG59LHQubz1mdW5jdGlvbihlLG4pe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKX0sdC5wPVwiXCIsdCh0LnM9MSl9KFtmdW5jdGlvbihuLHQpe24uZXhwb3J0cz1lfSxmdW5jdGlvbihlLG4sdCl7XCJ1c2Ugc3RyaWN0XCI7dC5yKG4pLHQuZChuLFwiYXN5bmNEZWNvcmF0b3JcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdX0pKSx0LmQobixcImluaGVyaXRBc3luY0RlY29yYXRvclwiLChmdW5jdGlvbigpe3JldHVybiBhfSkpLHQuZChuLFwiaXNSZWFkeVwiLChmdW5jdGlvbigpe3JldHVybiBjfSkpLHQuZChuLFwiSGlzdG9yeVwiLChmdW5jdGlvbigpe3JldHVybiBkfSkpO3ZhciByPXQoMCk7ZnVuY3Rpb24gbyhlLG4sdCxyLG8saSx1KXt0cnl7dmFyIGE9ZVtpXSh1KSxjPWEudmFsdWV9Y2F0Y2goZSl7cmV0dXJuIHZvaWQgdChlKX1hLmRvbmU/bihjKTpQcm9taXNlLnJlc29sdmUoYykudGhlbihyLG8pfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcyx0PWFyZ3VtZW50cztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsaSl7dmFyIHU9ZS5hcHBseShuLHQpO2Z1bmN0aW9uIGEoZSl7byh1LHIsaSxhLGMsXCJuZXh0XCIsZSl9ZnVuY3Rpb24gYyhlKXtvKHUscixpLGEsYyxcInRocm93XCIsZSl9YSh2b2lkIDApfSkpfX12YXIgdT1mdW5jdGlvbihlLG4pe3ZhciB0LG89e2lzUmVhZHk6bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe3Q9ZX0pKSxnZXQ6T2JqZWN0KHIubGF6eSkoKGZ1bmN0aW9uKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShuKCkpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBzZXRUaW1lb3V0KGkocmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLm5leHQ9Mix0KCEwKTtjYXNlIDI6by5pc1JlYWR5PSEwO2Nhc2UgMzpjYXNlXCJlbmRcIjpyZXR1cm4gZS5zdG9wKCl9fSksZSl9KSkpLDApLGV9KSl9KSl9O3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9kYXNocHJpdmF0ZV9pc0xhenlDb21wb25lbnRSZWFkeVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby5pc1JlYWR5fX0pLG8uZ2V0fSxhPWZ1bmN0aW9uKGUsbil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfZGFzaHByaXZhdGVfaXNMYXp5Q29tcG9uZW50UmVhZHlcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGMobil9fSl9LGM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuX2Rhc2hwcml2YXRlX2lzTGF6eUNvbXBvbmVudFJlYWR5fTtmdW5jdGlvbiBmKGUsbil7Zm9yKHZhciB0PTA7dDxuLmxlbmd0aDt0Kyspe3ZhciByPW5bdF07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX12YXIgcz1cIl9kYXNocHJpdmF0ZV9oaXN0b3J5Y2hhbmdlXCIsZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXshZnVuY3Rpb24oZSxuKXtpZighKGUgaW5zdGFuY2VvZiBuKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfSh0aGlzLGUpfXZhciBuLHQscjtyZXR1cm4gbj1lLHI9W3trZXk6XCJkaXNwYXRjaENoYW5nZUV2ZW50XCIsdmFsdWU6ZnVuY3Rpb24oKXt3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQocykpfX0se2tleTpcIm9uQ2hhbmdlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKHMsZSksZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIocyxlKX19fV0sKHQ9bnVsbCkmJmYobi5wcm90b3R5cGUsdCksciYmZihuLHIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLFwicHJvdG90eXBlXCIse3dyaXRhYmxlOiExfSksZX0oKX1dKX0pKTsiLCJ2YXIgX3BhdGg7XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIFN2Z0JlbGxJY29uID0gZnVuY3Rpb24gU3ZnQmVsbEljb24ocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDI4IDI0XCJcbiAgfSwgcHJvcHMpLCBfcGF0aCB8fCAoX3BhdGggPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGw6IFwiI2ZmZlwiLFxuICAgIGQ6IFwiTTguMTA3IDIuNDQgNi4yLjUzM0MzIDIuOTczLjg5MyA2LjczMy43MDcgMTFoMi42NjZhMTEuMjYgMTEuMjYgMCAwIDEgNC43MzQtOC41NlpNMjQuNjI3IDExaDIuNjY2Yy0uMi00LjI2Ny0yLjMwNi04LjAyNy01LjQ5My0xMC40NjdMMTkuOTA3IDIuNDRhMTEuMzI3IDExLjMyNyAwIDAgMSA0LjcyIDguNTZaTTIyIDExLjY2N2MwLTQuMDk0LTIuMTg3LTcuNTItNi04LjQyN1YuMzMzaC00VjMuMjRjLTMuODI3LjkwNy02IDQuMzItNiA4LjQyN3Y2LjY2NkwzLjMzMyAyMXYxLjMzM2gyMS4zMzNWMjFMMjIgMTguMzMzdi02LjY2NlptLTggMTQuNjY2Yy4xODcgMCAuMzYtLjAxMy41MzMtLjA1M2EyLjcwNSAyLjcwNSAwIDAgMCAxLjkyLTEuNTczYy4xMzQtLjMyLjItLjY2Ny4yLTEuMDRIMTEuMzJBMi42ODYgMi42ODYgMCAwIDAgMTQgMjYuMzMzWlwiXG4gIH0pKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgU3ZnQmVsbEljb247IiwidmFyIF9wYXRoO1xuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbnZhciBTdmdDaGVja0ljb24gPSBmdW5jdGlvbiBTdmdDaGVja0ljb24ocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDU0IDI0XCJcbiAgfSwgcHJvcHMpLCBfcGF0aCB8fCAoX3BhdGggPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHN0cm9rZTogXCIjZmZmXCIsXG4gICAgc3Ryb2tlV2lkdGg6IDQsXG4gICAgZDogXCJtMTUgMTIgOCA4TDM5IDRcIlxuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFN2Z0NoZWNrSWNvbjsiLCJ2YXIgX3BhdGg7XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIFN2Z0Nsb2NrSWNvbiA9IGZ1bmN0aW9uIFN2Z0Nsb2NrSWNvbihwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgdmlld0JveDogXCIwIDAgNTQgMjRcIlxuICB9LCBwcm9wcyksIF9wYXRoIHx8IChfcGF0aCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgc3Ryb2tlOiBcIiNmZmZcIixcbiAgICBzdHJva2VXaWR0aDogNCxcbiAgICBkOiBcIk0yNyAwdjIyaDIyXCJcbiAgfSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTdmdDbG9ja0ljb247IiwidmFyIF9wYXRoO1xuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbnZhciBTdmdDb2xsYXBzZUljb24gPSBmdW5jdGlvbiBTdmdDb2xsYXBzZUljb24ocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiAxMCxcbiAgICBoZWlnaHQ6IDYsXG4gICAgZmlsbDogXCJub25lXCJcbiAgfSwgcHJvcHMpLCBfcGF0aCB8fCAoX3BhdGggPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIHN0cm9rZTogXCIjQTJCMUM2XCIsXG4gICAgZDogXCJtMSAxIDQgNCA0LTRcIlxuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFN2Z0NvbGxhcHNlSWNvbjsiLCJ2YXIgX3BhdGg7XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIFN2Z0RlYnVnSWNvbiA9IGZ1bmN0aW9uIFN2Z0RlYnVnSWNvbihwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IDQyLFxuICAgIGhlaWdodDogMjQsXG4gICAgZmlsbDogXCJub25lXCJcbiAgfSwgcHJvcHMpLCBfcGF0aCB8fCAoX3BhdGggPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGw6IFwiI2ZmZlwiLFxuICAgIGQ6IFwiTTE0Ljg1IDIxLjE5NyA1LjYxNiAxMmw5LjIyNS05LjE5N0wxMi4wMjggMCAwIDEybDEyLjAzNyAxMiAyLjgxMy0yLjgwM1ptMTIuMyAwTDM2LjM3NSAxMiAyNy4xNSAyLjgwMyAyOS45NjMgMCA0MiAxMiAyOS45NjIgMjRsLTIuODEyLTIuODAzWlwiXG4gIH0pKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgU3ZnRGVidWdJY29uOyIsInZhciBfcGF0aDtcbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG52YXIgU3ZnR3JhcGhJY29uID0gZnVuY3Rpb24gU3ZnR3JhcGhJY29uKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB3aWR0aDogMjIsXG4gICAgaGVpZ2h0OiAyNCxcbiAgICBmaWxsOiBcIm5vbmVcIlxuICB9LCBwcm9wcyksIF9wYXRoIHx8IChfcGF0aCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbDogXCIjZmZmXCIsXG4gICAgZDogXCJNMTguMTAzIDE3LjAwNWMtLjkwOCAwLTEuNzU2LjMwMi0yLjM2Mi45MDVsLTguNjU3LTUuMDA1Yy4wNi0uMzAyLjEyLS41NDMuMTItLjg0NSAwLS4zMDEtLjA2LS41NDMtLjEyLS44NDRsOC41MzctNC45NDRhMy42NDQgMy42NDQgMCAwIDAgMi40ODIuOTY0YzEuOTk4IDAgMy42MzMtMS42MjggMy42MzMtMy42MThTMjAuMSAwIDE4LjEwMyAwIDE0LjQ3IDEuNjI4IDE0LjQ3IDMuNjE4YzAgLjMwMi4wNi41NDMuMTIyLjg0NUw2LjA1NSA5LjQwN2EzLjY0NCAzLjY0NCAwIDAgMC0yLjQ4My0uOTY1QzEuNTc0IDguNDQyIDAgMTAuMDcxIDAgMTIuMDZjMCAxLjk5IDEuNjM1IDMuNjE4IDMuNjMzIDMuNjE4Ljk2OCAwIDEuODE2LS4zNjEgMi40ODItLjk2NGw4LjU5OCA1LjAwNWMtLjA2MS4yNC0uMTIxLjQ4Mi0uMTIxLjc4NEEzLjUwNyAzLjUwNyAwIDAgMCAxOC4xMDIgMjRhMy41MDcgMy41MDcgMCAwIDAgMy41MTEtMy40OTcgMy41MDcgMy41MDcgMCAwIDAtMy41MS0zLjQ5OFpcIlxuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFN2Z0dyYXBoSWNvbjsiLCJ2YXIgX3BhdGg7XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIFN2Z09mZkljb24gPSBmdW5jdGlvbiBTdmdPZmZJY29uKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB2aWV3Qm94OiBcIjAgMCA1NCAyNFwiXG4gIH0sIHByb3BzKSwgX3BhdGggfHwgKF9wYXRoID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBzdHJva2U6IFwiI2ZmZlwiLFxuICAgIHN0cm9rZVdpZHRoOiA0LFxuICAgIGQ6IFwibTE4IDIgMTggMThtMC0xOEwxOCAyMFwiXG4gIH0pKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgU3ZnT2ZmSWNvbjsiLCJpbXBvcnQge2JhdGNoLCBjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQge2luY2x1ZGVzLCBpc0VtcHR5fSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgUmVhY3QsIHt1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUsIGNyZWF0ZUNvbnRleHR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgVHJlZUNvbnRhaW5lciBmcm9tICcuL1RyZWVDb250YWluZXInO1xuaW1wb3J0IEdsb2JhbEVycm9yQ29udGFpbmVyIGZyb20gJy4vY29tcG9uZW50cy9lcnJvci9HbG9iYWxFcnJvckNvbnRhaW5lci5yZWFjdCc7XG5pbXBvcnQge1xuICAgIGRpc3BhdGNoRXJyb3IsXG4gICAgaHlkcmF0ZUluaXRpYWxPdXRwdXRzLFxuICAgIG9uRXJyb3IsXG4gICAgc2V0R3JhcGhzLFxuICAgIHNldFBhdGhzLFxuICAgIHNldExheW91dFxufSBmcm9tICcuL2FjdGlvbnMnO1xuaW1wb3J0IHtjb21wdXRlUGF0aHN9IGZyb20gJy4vYWN0aW9ucy9wYXRocyc7XG5pbXBvcnQge2NvbXB1dGVHcmFwaHN9IGZyb20gJy4vYWN0aW9ucy9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IGFwaVRodW5rIGZyb20gJy4vYWN0aW9ucy9hcGknO1xuaW1wb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gJy4vYWN0aW9ucy91dGlscyc7XG5pbXBvcnQge2FwcGx5UGVyc2lzdGVuY2V9IGZyb20gJy4vcGVyc2lzdGVuY2UnO1xuaW1wb3J0IHtnZXRBcHBTdGF0ZX0gZnJvbSAnLi9yZWR1Y2Vycy9jb25zdGFudHMnO1xuaW1wb3J0IHtTVEFUVVN9IGZyb20gJy4vY29uc3RhbnRzL2NvbnN0YW50cyc7XG5pbXBvcnQge2dldExvYWRpbmdTdGF0ZSwgZ2V0TG9hZGluZ0hhc2h9IGZyb20gJy4vdXRpbHMvVHJlZUNvbnRhaW5lcic7XG5pbXBvcnQgd2FpdCBmcm9tICcuL3V0aWxzL3dhaXQnO1xuXG5leHBvcnQgY29uc3QgRGFzaENvbnRleHQgPSBjcmVhdGVDb250ZXh0KHt9KTtcblxuLyoqXG4gKiBGaXJlIG9mZiBBUEkgY2FsbHMgZm9yIGluaXRpYWxpemF0aW9uXG4gKiBAcGFyYW0geyp9IHByb3BzIHByb3BzXG4gKiBAcmV0dXJucyB7Kn0gY29tcG9uZW50XG4gKi9cbmNvbnN0IFVuY29ubmVjdGVkQ29udGFpbmVyID0gcHJvcHMgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgICAgYXBwTGlmZWN5Y2xlLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGRlcGVuZGVuY2llc1JlcXVlc3QsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBsYXlvdXRSZXF1ZXN0LFxuICAgICAgICBsYXlvdXQsXG4gICAgICAgIGxvYWRpbmdNYXBcbiAgICB9ID0gcHJvcHM7XG5cbiAgICBjb25zdCBbZXJyb3JMb2FkaW5nLCBzZXRFcnJvckxvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gICAgY29uc3QgZXZlbnRzID0gdXNlUmVmKG51bGwpO1xuICAgIGlmICghZXZlbnRzLmN1cnJlbnQpIHtcbiAgICAgICAgZXZlbnRzLmN1cnJlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgfVxuICAgIGNvbnN0IHJlbmRlcmVkVHJlZSA9IHVzZVJlZihmYWxzZSk7XG5cbiAgICBjb25zdCBwcm9wc1JlZiA9IHVzZVJlZih7fSk7XG4gICAgcHJvcHNSZWYuY3VycmVudCA9IHByb3BzO1xuXG4gICAgY29uc3QgcHJvdmlkZXIgPSB1c2VSZWYoe1xuICAgICAgICBmbjogKCkgPT4gKHtcbiAgICAgICAgICAgIF9kYXNocHJpdmF0ZV9jb25maWc6IHByb3BzUmVmLmN1cnJlbnQuY29uZmlnLFxuICAgICAgICAgICAgX2Rhc2hwcml2YXRlX2Rpc3BhdGNoOiBwcm9wc1JlZi5jdXJyZW50LmRpc3BhdGNoLFxuICAgICAgICAgICAgX2Rhc2hwcml2YXRlX2dyYXBoczogcHJvcHNSZWYuY3VycmVudC5ncmFwaHMsXG4gICAgICAgICAgICBfZGFzaHByaXZhdGVfbG9hZGluZ01hcDogcHJvcHNSZWYuY3VycmVudC5sb2FkaW5nTWFwXG4gICAgICAgIH0pXG4gICAgfSk7XG5cbiAgICB1c2VFZmZlY3Qoc3RvcmVFZmZlY3QuYmluZChudWxsLCBwcm9wcywgZXZlbnRzLCBzZXRFcnJvckxvYWRpbmcpKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChyZW5kZXJlZFRyZWUuY3VycmVudCkge1xuICAgICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICByZW5kZXJlZFRyZWUuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHdhaXQoMCk7XG4gICAgICAgICAgICAgICAgZXZlbnRzLmN1cnJlbnQuZW1pdCgncmVuZGVyZWQnKTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChjb25maWcuc2VydmVfbG9jYWxseSkge1xuICAgICAgICAgICAgd2luZG93Ll9kYXNoUGxvdGx5SlNVUkwgPSBgJHtjb25maWcucmVxdWVzdHNfcGF0aG5hbWVfcHJlZml4fV9kYXNoLWNvbXBvbmVudC1zdWl0ZXMvcGxvdGx5L3BhY2thZ2VfZGF0YS9wbG90bHkubWluLmpzYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdpbmRvdy5fZGFzaFBsb3RseUpTVVJMID0gY29uZmlnLnBsb3RseWpzX3VybDtcbiAgICAgICAgfVxuICAgIH0sIFtdKTtcblxuICAgIGxldCBjb250ZW50O1xuICAgIGlmIChcbiAgICAgICAgbGF5b3V0UmVxdWVzdC5zdGF0dXMgJiZcbiAgICAgICAgIWluY2x1ZGVzKGxheW91dFJlcXVlc3Quc3RhdHVzLCBbU1RBVFVTLk9LLCAnbG9hZGluZyddKVxuICAgICkge1xuICAgICAgICBjb250ZW50ID0gPGRpdiBjbGFzc05hbWU9J19kYXNoLWVycm9yJz5FcnJvciBsb2FkaW5nIGxheW91dDwvZGl2PjtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICBlcnJvckxvYWRpbmcgfHxcbiAgICAgICAgKGRlcGVuZGVuY2llc1JlcXVlc3Quc3RhdHVzICYmXG4gICAgICAgICAgICAhaW5jbHVkZXMoZGVwZW5kZW5jaWVzUmVxdWVzdC5zdGF0dXMsIFtTVEFUVVMuT0ssICdsb2FkaW5nJ10pKVxuICAgICkge1xuICAgICAgICBjb250ZW50ID0gPGRpdiBjbGFzc05hbWU9J19kYXNoLWVycm9yJz5FcnJvciBsb2FkaW5nIGRlcGVuZGVuY2llczwvZGl2PjtcbiAgICB9IGVsc2UgaWYgKGFwcExpZmVjeWNsZSA9PT0gZ2V0QXBwU3RhdGUoJ0hZRFJBVEVEJykpIHtcbiAgICAgICAgcmVuZGVyZWRUcmVlLmN1cnJlbnQgPSB0cnVlO1xuXG4gICAgICAgIGNvbnRlbnQgPSAoXG4gICAgICAgICAgICA8RGFzaENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3Byb3ZpZGVyLmN1cnJlbnR9PlxuICAgICAgICAgICAgICAgIDxUcmVlQ29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIF9kYXNocHJpdmF0ZV9lcnJvcj17ZXJyb3J9XG4gICAgICAgICAgICAgICAgICAgIF9kYXNocHJpdmF0ZV9sYXlvdXQ9e2xheW91dH1cbiAgICAgICAgICAgICAgICAgICAgX2Rhc2hwcml2YXRlX2xvYWRpbmdTdGF0ZT17Z2V0TG9hZGluZ1N0YXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2FkaW5nTWFwXG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIF9kYXNocHJpdmF0ZV9sb2FkaW5nU3RhdGVIYXNoPXtnZXRMb2FkaW5nSGFzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGluZ01hcFxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICBfZGFzaHByaXZhdGVfcGF0aD17SlNPTi5zdHJpbmdpZnkoW10pfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L0Rhc2hDb250ZXh0LlByb3ZpZGVyPlxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRlbnQgPSA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtbG9hZGluZyc+TG9hZGluZy4uLjwvZGl2PjtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnICYmIGNvbmZpZy51aSA9PT0gdHJ1ZSA/IChcbiAgICAgICAgPEdsb2JhbEVycm9yQ29udGFpbmVyPntjb250ZW50fTwvR2xvYmFsRXJyb3JDb250YWluZXI+XG4gICAgKSA6IChcbiAgICAgICAgY29udGVudFxuICAgICk7XG59O1xuXG5mdW5jdGlvbiBzdG9yZUVmZmVjdChwcm9wcywgZXZlbnRzLCBzZXRFcnJvckxvYWRpbmcpIHtcbiAgICBjb25zdCB7XG4gICAgICAgIGFwcExpZmVjeWNsZSxcbiAgICAgICAgZGVwZW5kZW5jaWVzUmVxdWVzdCxcbiAgICAgICAgZGlzcGF0Y2gsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBncmFwaHMsXG4gICAgICAgIGhvb2tzLFxuICAgICAgICBsYXlvdXQsXG4gICAgICAgIGxheW91dFJlcXVlc3RcbiAgICB9ID0gcHJvcHM7XG5cbiAgICBiYXRjaCgoKSA9PiB7XG4gICAgICAgIGlmIChpc0VtcHR5KGxheW91dFJlcXVlc3QpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGhvb2tzLmxheW91dF9wcmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBob29rcy5sYXlvdXRfcHJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNwYXRjaChhcGlUaHVuaygnX2Rhc2gtbGF5b3V0JywgJ0dFVCcsICdsYXlvdXRSZXF1ZXN0JykpO1xuICAgICAgICB9IGVsc2UgaWYgKGxheW91dFJlcXVlc3Quc3RhdHVzID09PSBTVEFUVVMuT0spIHtcbiAgICAgICAgICAgIGlmIChpc0VtcHR5KGxheW91dCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGhvb2tzLmxheW91dF9wb3N0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvb2tzLmxheW91dF9wb3N0KGxheW91dFJlcXVlc3QuY29udGVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbmFsTGF5b3V0ID0gYXBwbHlQZXJzaXN0ZW5jZShcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0UmVxdWVzdC5jb250ZW50LFxuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgICAgIHNldFBhdGhzKFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZVBhdGhzKGZpbmFsTGF5b3V0LCBbXSwgbnVsbCwgZXZlbnRzLmN1cnJlbnQpXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHNldExheW91dChmaW5hbExheW91dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRW1wdHkoZGVwZW5kZW5jaWVzUmVxdWVzdCkpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIGFwaVRodW5rKCdfZGFzaC1kZXBlbmRlbmNpZXMnLCAnR0VUJywgJ2RlcGVuZGVuY2llc1JlcXVlc3QnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGRlcGVuZGVuY2llc1JlcXVlc3Quc3RhdHVzID09PSBTVEFUVVMuT0sgJiZcbiAgICAgICAgICAgIGlzRW1wdHkoZ3JhcGhzKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIHNldEdyYXBocyhcbiAgICAgICAgICAgICAgICAgICAgY29tcHV0ZUdyYXBocyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llc1JlcXVlc3QuY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoZGlzcGF0Y2gpXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgLy8gZGVwZW5kZW5jaWVzUmVxdWVzdCBhbmQgaXRzIGNvbXB1dGVkIHN0b3Jlc1xuICAgICAgICAgICAgZGVwZW5kZW5jaWVzUmVxdWVzdC5zdGF0dXMgPT09IFNUQVRVUy5PSyAmJlxuICAgICAgICAgICAgIWlzRW1wdHkoZ3JhcGhzKSAmJlxuICAgICAgICAgICAgLy8gTGF5b3V0UmVxdWVzdCBhbmQgaXRzIGNvbXB1dGVkIHN0b3Jlc1xuICAgICAgICAgICAgbGF5b3V0UmVxdWVzdC5zdGF0dXMgPT09IFNUQVRVUy5PSyAmJlxuICAgICAgICAgICAgIWlzRW1wdHkobGF5b3V0KSAmJlxuICAgICAgICAgICAgLy8gSGFzbid0IGFscmVhZHkgaHlkcmF0ZWRcbiAgICAgICAgICAgIGFwcExpZmVjeWNsZSA9PT0gZ2V0QXBwU3RhdGUoJ1NUQVJURUQnKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCBoYXNFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChoeWRyYXRlSW5pdGlhbE91dHB1dHMoZGlzcGF0Y2hFcnJvcihkaXNwYXRjaCkpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIC8vIERpc3BsYXkgdGhpcyBlcnJvciBpbiBkZXZ0b29scywgdW5sZXNzIHdlIGhhdmUgZXJyb3JzXG4gICAgICAgICAgICAgICAgLy8gYWxyZWFkeSwgaW4gd2hpY2ggY2FzZSB3ZSBhc3N1bWUgdGhpcyBuZXcgb25lIGlzIG1vb3RcbiAgICAgICAgICAgICAgICBpZiAoIWVycm9yLmZyb250RW5kLmxlbmd0aCAmJiAhZXJyb3IuYmFja0VuZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gob25FcnJvcih7dHlwZTogJ2JhY2tFbmQnLCBlcnJvcjogZXJyfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHNldEVycm9yTG9hZGluZyhoYXNFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuVW5jb25uZWN0ZWRDb250YWluZXIucHJvcFR5cGVzID0ge1xuICAgIGFwcExpZmVjeWNsZTogUHJvcFR5cGVzLm9uZU9mKFtcbiAgICAgICAgZ2V0QXBwU3RhdGUoJ1NUQVJURUQnKSxcbiAgICAgICAgZ2V0QXBwU3RhdGUoJ0hZRFJBVEVEJyksXG4gICAgICAgIGdldEFwcFN0YXRlKCdERVNUUk9ZRUQnKVxuICAgIF0pLFxuICAgIGRpc3BhdGNoOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBkZXBlbmRlbmNpZXNSZXF1ZXN0OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGdyYXBoczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBob29rczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBsYXlvdXRSZXF1ZXN0OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGxheW91dDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBsb2FkaW5nTWFwOiBQcm9wVHlwZXMuYW55LFxuICAgIGhpc3Rvcnk6IFByb3BUeXBlcy5hbnksXG4gICAgZXJyb3I6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgY29uZmlnOiBQcm9wVHlwZXMub2JqZWN0XG59O1xuXG5jb25zdCBDb250YWluZXIgPSBjb25uZWN0KFxuICAgIC8vIG1hcCBzdGF0ZSB0byBwcm9wc1xuICAgIHN0YXRlID0+ICh7XG4gICAgICAgIGFwcExpZmVjeWNsZTogc3RhdGUuYXBwTGlmZWN5Y2xlLFxuICAgICAgICBkZXBlbmRlbmNpZXNSZXF1ZXN0OiBzdGF0ZS5kZXBlbmRlbmNpZXNSZXF1ZXN0LFxuICAgICAgICBob29rczogc3RhdGUuaG9va3MsXG4gICAgICAgIGxheW91dFJlcXVlc3Q6IHN0YXRlLmxheW91dFJlcXVlc3QsXG4gICAgICAgIGxheW91dDogc3RhdGUubGF5b3V0LFxuICAgICAgICBsb2FkaW5nTWFwOiBzdGF0ZS5sb2FkaW5nTWFwLFxuICAgICAgICBncmFwaHM6IHN0YXRlLmdyYXBocyxcbiAgICAgICAgaGlzdG9yeTogc3RhdGUuaGlzdG9yeSxcbiAgICAgICAgZXJyb3I6IHN0YXRlLmVycm9yLFxuICAgICAgICBjb25maWc6IHN0YXRlLmNvbmZpZ1xuICAgIH0pLFxuICAgIGRpc3BhdGNoID0+ICh7ZGlzcGF0Y2h9KVxuKShVbmNvbm5lY3RlZENvbnRhaW5lcik7XG5cbmV4cG9ydCBkZWZhdWx0IENvbnRhaW5lcjtcbiIsImltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgQVBJQ29udHJvbGxlciBmcm9tICcuL0FQSUNvbnRyb2xsZXIucmVhY3QnO1xuaW1wb3J0IExvYWRpbmcgZnJvbSAnLi9jb21wb25lbnRzL2NvcmUvTG9hZGluZy5yZWFjdCc7XG5pbXBvcnQgVG9vbGJhciBmcm9tICcuL2NvbXBvbmVudHMvY29yZS9Ub29sYmFyLnJlYWN0JztcbmltcG9ydCBSZWxvYWRlciBmcm9tICcuL2NvbXBvbmVudHMvY29yZS9SZWxvYWRlci5yZWFjdCc7XG5pbXBvcnQgZ2V0Q29uZmlnRnJvbURPTSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQge3NldEhvb2tzLCBzZXRDb25maWd9IGZyb20gJy4vYWN0aW9ucy9pbmRleCc7XG5pbXBvcnQge3R5cGUsIG1lbW9pemVXaXRoLCBpZGVudGl0eX0gZnJvbSAncmFtZGEnO1xuXG5jbGFzcyBVbmNvbm5lY3RlZEFwcENvbnRhaW5lciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwcm9wcy5ob29rcy5sYXlvdXRfcHJlICE9PSBudWxsIHx8XG4gICAgICAgICAgICBwcm9wcy5ob29rcy5sYXlvdXRfcG9zdCAhPT0gbnVsbCB8fFxuICAgICAgICAgICAgcHJvcHMuaG9va3MucmVxdWVzdF9wcmUgIT09IG51bGwgfHxcbiAgICAgICAgICAgIHByb3BzLmhvb2tzLnJlcXVlc3RfcG9zdCAhPT0gbnVsbCB8fFxuICAgICAgICAgICAgcHJvcHMuaG9va3MuY2FsbGJhY2tfcmVzb2x2ZWQgIT09IG51bGwgfHxcbiAgICAgICAgICAgIHByb3BzLmhvb2tzLnJlcXVlc3RfcmVmcmVzaF9qd3QgIT09IG51bGxcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgaG9va3MgPSBwcm9wcy5ob29rcztcblxuICAgICAgICAgICAgaWYgKGhvb2tzLnJlcXVlc3RfcmVmcmVzaF9qd3QpIHtcbiAgICAgICAgICAgICAgICBob29rcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uaG9va3MsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfcmVmcmVzaF9qd3Q6IG1lbW9pemVXaXRoKFxuICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICBob29rcy5yZXF1ZXN0X3JlZnJlc2hfand0XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwcm9wcy5kaXNwYXRjaChzZXRIb29rcyhob29rcykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpIHtcbiAgICAgICAgY29uc3Qge2Rpc3BhdGNofSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZ0Zyb21ET00oKTtcblxuICAgICAgICAvLyBwcmVzZXQgY29tbW9uIHJlcXVlc3QgcGFyYW1zIGluIHRoZSBjb25maWdcbiAgICAgICAgY29uZmlnLmZldGNoID0ge1xuICAgICAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGRpc3BhdGNoKHNldENvbmZpZyhjb25maWcpKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHtjb25maWd9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgaWYgKHR5cGUoY29uZmlnKSA9PT0gJ051bGwnKSB7XG4gICAgICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9J19kYXNoLWxvYWRpbmcnPkxvYWRpbmcuLi48L2Rpdj47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qge3Nob3dfdW5kb19yZWRvfSA9IGNvbmZpZztcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICB7c2hvd191bmRvX3JlZG8gPyA8VG9vbGJhciAvPiA6IG51bGx9XG4gICAgICAgICAgICAgICAgPEFQSUNvbnRyb2xsZXIgLz5cbiAgICAgICAgICAgICAgICA8TG9hZGluZyAvPlxuICAgICAgICAgICAgICAgIDxSZWxvYWRlciAvPlxuICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblVuY29ubmVjdGVkQXBwQ29udGFpbmVyLnByb3BUeXBlcyA9IHtcbiAgICBob29rczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBkaXNwYXRjaDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgY29uZmlnOiBQcm9wVHlwZXMub2JqZWN0XG59O1xuXG5jb25zdCBBcHBDb250YWluZXIgPSBjb25uZWN0KFxuICAgIHN0YXRlID0+ICh7XG4gICAgICAgIGhpc3Rvcnk6IHN0YXRlLmhpc3RvcnksXG4gICAgICAgIGNvbmZpZzogc3RhdGUuY29uZmlnXG4gICAgfSksXG4gICAgZGlzcGF0Y2ggPT4gKHtkaXNwYXRjaH0pXG4pKFVuY29ubmVjdGVkQXBwQ29udGFpbmVyKTtcblxuZXhwb3J0IGRlZmF1bHQgQXBwQ29udGFpbmVyO1xuIiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwge3VzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1Byb3ZpZGVyfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5cbmltcG9ydCBTdG9yZSBmcm9tICcuL3N0b3JlJztcbmltcG9ydCBBcHBDb250YWluZXIgZnJvbSAnLi9BcHBDb250YWluZXIucmVhY3QnO1xuXG5jb25zdCBBcHBQcm92aWRlciA9ICh7aG9va3N9OiBhbnkpID0+IHtcbiAgICBjb25zdCBbe3N0b3JlfV0gPSB1c2VTdGF0ZSgoKSA9PiBuZXcgU3RvcmUoKSk7XG4gICAgcmV0dXJuIChcbiAgICAgICAgPFByb3ZpZGVyIHN0b3JlPXtzdG9yZX0+XG4gICAgICAgICAgICA8QXBwQ29udGFpbmVyIGhvb2tzPXtob29rc30gLz5cbiAgICAgICAgPC9Qcm92aWRlcj5cbiAgICApO1xufTtcblxuQXBwUHJvdmlkZXIucHJvcFR5cGVzID0ge1xuICAgIGhvb2tzOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICBsYXlvdXRfcHJlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgbGF5b3V0X3Bvc3Q6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICByZXF1ZXN0X3ByZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIHJlcXVlc3RfcG9zdDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIGNhbGxiYWNrX3Jlc29sdmVkOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgcmVxdWVzdF9yZWZyZXNoX2p3dDogUHJvcFR5cGVzLmZ1bmNcbiAgICB9KVxufTtcblxuQXBwUHJvdmlkZXIuZGVmYXVsdFByb3BzID0ge1xuICAgIGhvb2tzOiB7XG4gICAgICAgIGxheW91dF9wcmU6IG51bGwsXG4gICAgICAgIGxheW91dF9wb3N0OiBudWxsLFxuICAgICAgICByZXF1ZXN0X3ByZTogbnVsbCxcbiAgICAgICAgcmVxdWVzdF9wb3N0OiBudWxsLFxuICAgICAgICBjYWxsYmFja19yZXNvbHZlZDogbnVsbCxcbiAgICAgICAgcmVxdWVzdF9yZWZyZXNoX2p3dDogbnVsbFxuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFwcFByb3ZpZGVyO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuXG5pbXBvcnQgQXBwUHJvdmlkZXIgZnJvbSAnLi9BcHBQcm92aWRlci5yZWFjdCc7XG5cbmNsYXNzIERhc2hSZW5kZXJlciB7XG4gICAgY29uc3RydWN0b3IoaG9va3MpIHtcbiAgICAgICAgLy8gcmVuZGVyIERhc2ggUmVuZGVyZXIgdXBvbiBpbml0aWFsaXNpbmchXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWFjdC1lbnRyeS1wb2ludCcpO1xuXG4gICAgICAgIGlmIChSZWFjdERPTS5jcmVhdGVSb290KSB7XG4gICAgICAgICAgICBjb25zdCByb290ID0gUmVhY3RET00uY3JlYXRlUm9vdChjb250YWluZXIpO1xuICAgICAgICAgICAgcm9vdC5yZW5kZXIoPEFwcFByb3ZpZGVyIGhvb2tzPXtob29rc30gLz4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgUmVhY3RET00ucmVuZGVyKDxBcHBQcm92aWRlciBob29rcz17aG9va3N9IC8+LCBjb250YWluZXIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQge0Rhc2hSZW5kZXJlcn07XG4iLCJpbXBvcnQge2FueSwgZmlsdGVyLCBtYXAsIHBhdGh9IGZyb20gJ3JhbWRhJztcblxuaW1wb3J0IHtTdG9yZSwgVW5zdWJzY3JpYmV9IGZyb20gJ3JlZHV4JztcblxudHlwZSBPYnNlcnZlcjxUU3RvcmU+ID0gKHN0b3JlOiBUU3RvcmUpID0+IHZvaWQ7XG50eXBlIFVucmVnaXN0ZXJPYnNlcnZlciA9ICgpID0+IHZvaWQ7XG5cbmludGVyZmFjZSBJU3RvcmVPYnNlcnZlclN0YXRlPFRTdG9yZT4ge1xuICAgIGlucHV0UGF0aHM6IHN0cmluZ1tdW107XG4gICAgbGFzdFN0YXRlOiBhbnk7XG4gICAgb2JzZXJ2ZXI6IE9ic2VydmVyPFRTdG9yZT47XG4gICAgdHJpZ2dlcmVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTdG9yZU9ic2VydmVyRGVmaW5pdGlvbjxUU3RvcmU+IHtcbiAgICBvYnNlcnZlcjogT2JzZXJ2ZXI8U3RvcmU8VFN0b3JlPj47XG4gICAgaW5wdXRzOiBzdHJpbmdbXTtcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0b3JlT2JzZXJ2ZXI8VFN0b3JlPiB7XG4gICAgcHJpdmF0ZSBfc3RvcmU/OiBTdG9yZTxUU3RvcmU+O1xuICAgIHByaXZhdGUgX3Vuc3Vic2NyaWJlPzogVW5zdWJzY3JpYmU7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vYnNlcnZlcnM6IElTdG9yZU9ic2VydmVyU3RhdGU8U3RvcmU8VFN0b3JlPj5bXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3Ioc3RvcmU/OiBTdG9yZTxUU3RvcmU+KSB7XG4gICAgICAgIHRoaXMuX19pbml0X18oc3RvcmUpO1xuICAgIH1cblxuICAgIG9ic2VydmUgPSAoXG4gICAgICAgIG9ic2VydmVyOiBJU3RvcmVPYnNlcnZlckRlZmluaXRpb248VFN0b3JlPiB8IE9ic2VydmVyPFN0b3JlPFRTdG9yZT4+LFxuICAgICAgICBpbnB1dHM/OiBzdHJpbmdbXVxuICAgICk6IFVucmVnaXN0ZXJPYnNlcnZlciA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JzZXJ2ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShpbnB1dHMpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnB1dHMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmFkZChvYnNlcnZlciwgaW5wdXRzKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB0aGlzLnJlbW92ZShvYnNlcnZlcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFkZChvYnNlcnZlci5vYnNlcnZlciwgb2JzZXJ2ZXIuaW5wdXRzKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHRoaXMucmVtb3ZlKG9ic2VydmVyLm9ic2VydmVyKTtcbiAgICB9O1xuXG4gICAgc2V0U3RvcmUgPSAoc3RvcmU6IFN0b3JlPFRTdG9yZT4pID0+IHtcbiAgICAgICAgdGhpcy5fX2ZpbmFsaXplX18oKTtcbiAgICAgICAgdGhpcy5fX2luaXRfXyhzdG9yZSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgX19maW5hbGl6ZV9fID0gKCkgPT4gdGhpcy5fdW5zdWJzY3JpYmU/LigpO1xuXG4gICAgcHJpdmF0ZSBfX2luaXRfXyA9IChzdG9yZT86IFN0b3JlPFRTdG9yZT4pID0+IHtcbiAgICAgICAgdGhpcy5fc3RvcmUgPSBzdG9yZTtcbiAgICAgICAgaWYgKHN0b3JlKSB7XG4gICAgICAgICAgICB0aGlzLl91bnN1YnNjcmliZSA9IHN0b3JlLnN1YnNjcmliZSh0aGlzLm5vdGlmeSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9vYnNlcnZlcnMuZm9yRWFjaChvID0+IHtcbiAgICAgICAgICAgIG8ubGFzdFN0YXRlID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgYWRkID0gKG9ic2VydmVyOiBPYnNlcnZlcjxTdG9yZTxUU3RvcmU+PiwgaW5wdXRzOiBzdHJpbmdbXSkgPT5cbiAgICAgICAgdGhpcy5fb2JzZXJ2ZXJzLnB1c2goe1xuICAgICAgICAgICAgaW5wdXRQYXRoczogbWFwKHAgPT4gcC5zcGxpdCgnLicpLCBpbnB1dHMpLFxuICAgICAgICAgICAgbGFzdFN0YXRlOiBudWxsLFxuICAgICAgICAgICAgb2JzZXJ2ZXIsXG4gICAgICAgICAgICB0cmlnZ2VyZWQ6IGZhbHNlXG4gICAgICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBub3RpZnkgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0b3JlID0gdGhpcy5fc3RvcmU7XG4gICAgICAgIGlmICghc3RvcmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcblxuICAgICAgICBjb25zdCB0cmlnZ2VyZWQgPSBmaWx0ZXIoXG4gICAgICAgICAgICBvID0+XG4gICAgICAgICAgICAgICAgIW8udHJpZ2dlcmVkICYmXG4gICAgICAgICAgICAgICAgYW55KGkgPT4gcGF0aChpLCBzdGF0ZSkgIT09IHBhdGgoaSwgby5sYXN0U3RhdGUpLCBvLmlucHV0UGF0aHMpLFxuICAgICAgICAgICAgdGhpcy5fb2JzZXJ2ZXJzXG4gICAgICAgICk7XG5cbiAgICAgICAgdHJpZ2dlcmVkLmZvckVhY2gobyA9PiB7XG4gICAgICAgICAgICBvLnRyaWdnZXJlZCA9IHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRyaWdnZXJlZC5mb3JFYWNoKG8gPT4ge1xuICAgICAgICAgICAgby5sYXN0U3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgby5vYnNlcnZlcihzdG9yZSk7XG4gICAgICAgICAgICBvLnRyaWdnZXJlZCA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSByZW1vdmUgPSAob2JzZXJ2ZXI6IE9ic2VydmVyPFN0b3JlPFRTdG9yZT4+KSA9PlxuICAgICAgICB0aGlzLl9vYnNlcnZlcnMuc3BsaWNlKFxuICAgICAgICAgICAgdGhpcy5fb2JzZXJ2ZXJzLmZpbmRJbmRleChcbiAgICAgICAgICAgICAgICBvID0+IG9ic2VydmVyID09PSBvLm9ic2VydmVyLFxuICAgICAgICAgICAgICAgIHRoaXMuX29ic2VydmVyc1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIDFcbiAgICAgICAgKTtcbn1cbiIsImltcG9ydCBSZWFjdCwge0NvbXBvbmVudCwgbWVtbywgdXNlQ29udGV4dH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWdpc3RyeSBmcm9tICcuL3JlZ2lzdHJ5JztcbmltcG9ydCB7cHJvcFR5cGVFcnJvckhhbmRsZXJ9IGZyb20gJy4vZXhjZXB0aW9ucyc7XG5pbXBvcnQge1xuICAgIGFkZEluZGV4LFxuICAgIGFzc29jLFxuICAgIGFzc29jUGF0aCxcbiAgICBjb25jYXQsXG4gICAgZGlzc29jLFxuICAgIGVxdWFscyxcbiAgICBpc0VtcHR5LFxuICAgIGlzTmlsLFxuICAgIGhhcyxcbiAgICBrZXlzLFxuICAgIG1hcCxcbiAgICBtYXBPYmpJbmRleGVkLFxuICAgIG1lcmdlUmlnaHQsXG4gICAgcGljayxcbiAgICBwaWNrQnksXG4gICAgcHJvcE9yLFxuICAgIHBhdGggYXMgcnBhdGgsXG4gICAgcGF0aE9yLFxuICAgIHR5cGVcbn0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHtub3RpZnlPYnNlcnZlcnMsIHVwZGF0ZVByb3BzfSBmcm9tICcuL2FjdGlvbnMnO1xuaW1wb3J0IGlzU2ltcGxlQ29tcG9uZW50IGZyb20gJy4vaXNTaW1wbGVDb21wb25lbnQnO1xuaW1wb3J0IHtyZWNvcmRVaUVkaXR9IGZyb20gJy4vcGVyc2lzdGVuY2UnO1xuaW1wb3J0IENvbXBvbmVudEVycm9yQm91bmRhcnkgZnJvbSAnLi9jb21wb25lbnRzL2Vycm9yL0NvbXBvbmVudEVycm9yQm91bmRhcnkucmVhY3QnO1xuaW1wb3J0IGNoZWNrUHJvcFR5cGVzIGZyb20gJy4vY2hlY2tQcm9wVHlwZXMnO1xuaW1wb3J0IHtnZXRXYXRjaGVkS2V5cywgc3RyaW5naWZ5SWR9IGZyb20gJy4vYWN0aW9ucy9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHtcbiAgICBnZXRMb2FkaW5nSGFzaCxcbiAgICBnZXRMb2FkaW5nU3RhdGUsXG4gICAgdmFsaWRhdGVDb21wb25lbnRcbn0gZnJvbSAnLi91dGlscy9UcmVlQ29udGFpbmVyJztcbmltcG9ydCB7RGFzaENvbnRleHR9IGZyb20gJy4vQVBJQ29udHJvbGxlci5yZWFjdCc7XG5pbXBvcnQge2JhdGNofSBmcm9tICdyZWFjdC1yZWR1eCc7XG5cbmNvbnN0IE5PVF9MT0FESU5HID0ge1xuICAgIGlzX2xvYWRpbmc6IGZhbHNlXG59O1xuXG5mdW5jdGlvbiBDaGVja2VkQ29tcG9uZW50KHApIHtcbiAgICBjb25zdCB7ZWxlbWVudCwgZXh0cmFQcm9wcywgcHJvcHMsIGNoaWxkcmVuLCB0eXBlfSA9IHA7XG5cbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBjaGVja1Byb3BUeXBlcyhcbiAgICAgICAgZWxlbWVudC5wcm9wVHlwZXMsXG4gICAgICAgIHByb3BzLFxuICAgICAgICAnY29tcG9uZW50IHByb3AnLFxuICAgICAgICBlbGVtZW50XG4gICAgKTtcbiAgICBpZiAoZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgIHByb3BUeXBlRXJyb3JIYW5kbGVyKGVycm9yTWVzc2FnZSwgcHJvcHMsIHR5cGUpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KGVsZW1lbnQsIHByb3BzLCBleHRyYVByb3BzLCBjaGlsZHJlbik7XG59XG5cbkNoZWNrZWRDb21wb25lbnQucHJvcFR5cGVzID0ge1xuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMuYW55LFxuICAgIGVsZW1lbnQ6IFByb3BUeXBlcy5hbnksXG4gICAgbGF5b3V0OiBQcm9wVHlwZXMuYW55LFxuICAgIHByb3BzOiBQcm9wVHlwZXMuYW55LFxuICAgIGV4dHJhUHJvcHM6IFByb3BUeXBlcy5hbnksXG4gICAgaWQ6IFByb3BUeXBlcy5zdHJpbmdcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoZWxlbWVudCwgcHJvcHMsIGV4dHJhUHJvcHMsIGNoaWxkcmVuKSB7XG4gICAgY29uc3QgYWxsUHJvcHMgPSBtZXJnZVJpZ2h0KHByb3BzLCBleHRyYVByb3BzKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoZWxlbWVudCwgYWxsUHJvcHMsIC4uLmNoaWxkcmVuKTtcbiAgICB9XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoZWxlbWVudCwgYWxsUHJvcHMsIGNoaWxkcmVuKTtcbn1cblxuZnVuY3Rpb24gaXNEcnlDb21wb25lbnQob2JqKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgdHlwZShvYmopID09PSAnT2JqZWN0JyAmJlxuICAgICAgICBoYXMoJ3R5cGUnLCBvYmopICYmXG4gICAgICAgIGhhcygnbmFtZXNwYWNlJywgb2JqKSAmJlxuICAgICAgICBoYXMoJ3Byb3BzJywgb2JqKVxuICAgICk7XG59XG5cbmNvbnN0IERhc2hXcmFwcGVyID0gcHJvcHMgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KERhc2hDb250ZXh0KTtcbiAgICByZXR1cm4gKFxuICAgICAgICA8QmFzZVRyZWVDb250YWluZXJcbiAgICAgICAgICAgIHsuLi5jb250ZXh0LmZuKCl9XG4gICAgICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAgICAgICBfZGFzaHByaXZhdGVfcGF0aD17SlNPTi5wYXJzZShwcm9wcy5fZGFzaHByaXZhdGVfcGF0aCl9XG4gICAgICAgIC8+XG4gICAgKTtcbn07XG5cbmNvbnN0IFRyZWVDb250YWluZXIgPSBtZW1vKERhc2hXcmFwcGVyKTtcblxuY2xhc3MgQmFzZVRyZWVDb250YWluZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICB0aGlzLnNldFByb3BzID0gdGhpcy5zZXRQcm9wcy5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIGNyZWF0ZUNvbnRhaW5lcihwcm9wcywgY29tcG9uZW50LCBwYXRoLCBrZXkgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGlzU2ltcGxlQ29tcG9uZW50KGNvbXBvbmVudCkgPyAoXG4gICAgICAgICAgICBjb21wb25lbnRcbiAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxUcmVlQ29udGFpbmVyXG4gICAgICAgICAgICAgICAga2V5PXtcbiAgICAgICAgICAgICAgICAgICAgKGNvbXBvbmVudCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnByb3BzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdpZnlJZChjb21wb25lbnQucHJvcHMuaWQpKSB8fFxuICAgICAgICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX2Rhc2hwcml2YXRlX2Vycm9yPXtwcm9wcy5fZGFzaHByaXZhdGVfZXJyb3J9XG4gICAgICAgICAgICAgICAgX2Rhc2hwcml2YXRlX2xheW91dD17Y29tcG9uZW50fVxuICAgICAgICAgICAgICAgIF9kYXNocHJpdmF0ZV9sb2FkaW5nU3RhdGU9e2dldExvYWRpbmdTdGF0ZShcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5fZGFzaHByaXZhdGVfbG9hZGluZ01hcFxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgX2Rhc2hwcml2YXRlX2xvYWRpbmdTdGF0ZUhhc2g9e2dldExvYWRpbmdIYXNoKFxuICAgICAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5fZGFzaHByaXZhdGVfbG9hZGluZ01hcFxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgX2Rhc2hwcml2YXRlX3BhdGg9e0pTT04uc3RyaW5naWZ5KHBhdGgpfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzZXRQcm9wcyhuZXdQcm9wcykge1xuICAgICAgICBjb25zdCB7X2Rhc2hwcml2YXRlX2Rpc3BhdGNoLCBfZGFzaHByaXZhdGVfcGF0aCwgX2Rhc2hwcml2YXRlX2xheW91dH0gPVxuICAgICAgICAgICAgdGhpcy5wcm9wcztcblxuICAgICAgICBjb25zdCBvbGRQcm9wcyA9IHRoaXMuZ2V0TGF5b3V0UHJvcHMoKTtcbiAgICAgICAgY29uc3Qge2lkfSA9IG9sZFByb3BzO1xuICAgICAgICBjb25zdCBjaGFuZ2VkUHJvcHMgPSBwaWNrQnkoXG4gICAgICAgICAgICAodmFsLCBrZXkpID0+ICFlcXVhbHModmFsLCBvbGRQcm9wc1trZXldKSxcbiAgICAgICAgICAgIG5ld1Byb3BzXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFpc0VtcHR5KGNoYW5nZWRQcm9wcykpIHtcbiAgICAgICAgICAgIF9kYXNocHJpdmF0ZV9kaXNwYXRjaCgoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qge2dyYXBoc30gPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgIC8vIElkZW50aWZ5IHRoZSBtb2RpZmllZCBwcm9wcyB0aGF0IGFyZSByZXF1aXJlZCBmb3IgY2FsbGJhY2tzXG4gICAgICAgICAgICAgICAgY29uc3Qgd2F0Y2hlZEtleXMgPSBnZXRXYXRjaGVkS2V5cyhcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIGtleXMoY2hhbmdlZFByb3BzKSxcbiAgICAgICAgICAgICAgICAgICAgZ3JhcGhzXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGJhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2V0UHJvcHMgaGVyZSBpcyB0cmlnZ2VyZWQgYnkgdGhlIFVJIC0gcmVjb3JkIHRoZXNlIGNoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHBlcnNpc3RlbmNlXG4gICAgICAgICAgICAgICAgICAgIHJlY29yZFVpRWRpdChfZGFzaHByaXZhdGVfbGF5b3V0LCBuZXdQcm9wcywgZGlzcGF0Y2gpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgZGlzcGF0Y2ggY2hhbmdlcyB0byBEYXNoIGlmIGEgd2F0Y2hlZCBwcm9wIGNoYW5nZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdhdGNoZWRLZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5T2JzZXJ2ZXJzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBwaWNrKHdhdGNoZWRLZXlzLCBjaGFuZ2VkUHJvcHMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBBbHdheXMgdXBkYXRlIHRoaXMgY29tcG9uZW50J3MgcHJvcHNcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQcm9wcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IGNoYW5nZWRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcGF0aDogX2Rhc2hwcml2YXRlX3BhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldENoaWxkcmVuKGNvbXBvbmVudHMsIHBhdGgpIHtcbiAgICAgICAgaWYgKGlzTmlsKGNvbXBvbmVudHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGNvbXBvbmVudHMpXG4gICAgICAgICAgICA/IGFkZEluZGV4KG1hcCkoXG4gICAgICAgICAgICAgICAgICAoY29tcG9uZW50LCBpKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQ29udGFpbmVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNhdChwYXRoLCBbJ3Byb3BzJywgJ2NoaWxkcmVuJywgaV0pXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHNcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB0aGlzLmNyZWF0ZUNvbnRhaW5lcihcbiAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMsXG4gICAgICAgICAgICAgICAgICBjb21wb25lbnRzLFxuICAgICAgICAgICAgICAgICAgY29uY2F0KHBhdGgsIFsncHJvcHMnLCAnY2hpbGRyZW4nXSlcbiAgICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICB3cmFwQ2hpbGRyZW5Qcm9wKG5vZGUsIGNoaWxkcmVuUHJvcCkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUubWFwKChuLCBpKSA9PlxuICAgICAgICAgICAgICAgIGlzRHJ5Q29tcG9uZW50KG4pXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5jcmVhdGVDb250YWluZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNhdCh0aGlzLnByb3BzLl9kYXNocHJpdmF0ZV9wYXRoLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY2hpbGRyZW5Qcm9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVxuICAgICAgICAgICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgOiBuXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNEcnlDb21wb25lbnQobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUNvbnRhaW5lcihcbiAgICAgICAgICAgIHRoaXMucHJvcHMsXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgY29uY2F0KHRoaXMucHJvcHMuX2Rhc2hwcml2YXRlX3BhdGgsIFsncHJvcHMnLCAuLi5jaGlsZHJlblByb3BdKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldENvbXBvbmVudChfZGFzaHByaXZhdGVfbGF5b3V0LCBjaGlsZHJlbiwgbG9hZGluZ19zdGF0ZSwgc2V0UHJvcHMpIHtcbiAgICAgICAgY29uc3Qge19kYXNocHJpdmF0ZV9jb25maWcsIF9kYXNocHJpdmF0ZV9kaXNwYXRjaCwgX2Rhc2hwcml2YXRlX2Vycm9yfSA9XG4gICAgICAgICAgICB0aGlzLnByb3BzO1xuXG4gICAgICAgIGlmIChpc0VtcHR5KF9kYXNocHJpdmF0ZV9sYXlvdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1NpbXBsZUNvbXBvbmVudChfZGFzaHByaXZhdGVfbGF5b3V0KSkge1xuICAgICAgICAgICAgcmV0dXJuIF9kYXNocHJpdmF0ZV9sYXlvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFsaWRhdGVDb21wb25lbnQoX2Rhc2hwcml2YXRlX2xheW91dCk7XG5cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IFJlZ2lzdHJ5LnJlc29sdmUoX2Rhc2hwcml2YXRlX2xheW91dCk7XG5cbiAgICAgICAgLy8gSHlkcmF0ZSBjb21wb25lbnRzIHByb3BzXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuUHJvcHMgPSBwYXRoT3IoXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAnY2hpbGRyZW5fcHJvcHMnLFxuICAgICAgICAgICAgICAgIF9kYXNocHJpdmF0ZV9sYXlvdXQubmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgIF9kYXNocHJpdmF0ZV9sYXlvdXQudHlwZVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIF9kYXNocHJpdmF0ZV9jb25maWdcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IHByb3BzID0gZGlzc29jKCdjaGlsZHJlbicsIF9kYXNocHJpdmF0ZV9sYXlvdXQucHJvcHMpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW5Qcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW5Qcm9wID0gY2hpbGRyZW5Qcm9wc1tpXTtcblxuICAgICAgICAgICAgY29uc3QgaGFuZGxlT2JqZWN0ID0gKG9iaiwgb3BhdGgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFwT2JqSW5kZXhlZChcbiAgICAgICAgICAgICAgICAgICAgKG5vZGUsIGspID0+IHRoaXMud3JhcENoaWxkcmVuUHJvcChub2RlLCBbLi4ub3BhdGgsIGtdKSxcbiAgICAgICAgICAgICAgICAgICAgb2JqXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChjaGlsZHJlblByb3AuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgICAgIGxldCBwYXRoID0gY2hpbGRyZW5Qcm9wLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGU7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5Qcm9wLmluY2x1ZGVzKCdbXScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmcm9udFBhdGggPSBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tQYXRoID0gW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzT2JqZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHBhdGguZm9yRWFjaChwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocC5pbmNsdWRlcygnW10nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLmluY2x1ZGVzKCd7fScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPYmplY3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRQYXRoLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5yZXBsYWNlKCd7fScsICcnKS5yZXBsYWNlKCdbXScsICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb250UGF0aC5wdXNoKHAucmVwbGFjZSgnW10nLCAnJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwLmluY2x1ZGVzKCd7fScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc09iamVjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb250UGF0aC5wdXNoKHAucmVwbGFjZSgne30nLCAnJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb250UGF0aC5wdXNoKHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuaW5jbHVkZXMoJ3t9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT2JqZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja1BhdGgucHVzaChwLnJlcGxhY2UoJ3t9JywgJycpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrUGF0aC5wdXNoKHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHJwYXRoKGZyb250UGF0aCwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkIHx8ICFub2RlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3ROb2RlID0gcnBhdGgoYmFja1BhdGgsIG5vZGVbMF0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBub2RlVmFsdWUgPSBub2RlLm1hcCgoZWxlbWVudCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudFBhdGggPSBjb25jYXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNhdChbaV0sIGJhY2tQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaXN0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2tQYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0VmFsdWUgPSBoYW5kbGVPYmplY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycGF0aChiYWNrUGF0aCwgZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RWYWx1ZSA9IGhhbmRsZU9iamVjdChlbGVtZW50LCBlbGVtZW50UGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0VmFsdWUgPSB0aGlzLndyYXBDaGlsZHJlblByb3AoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwYXRoKGJhY2tQYXRoLCBlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFzc29jUGF0aChiYWNrUGF0aCwgbGlzdFZhbHVlLCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHBhdGggPSBmcm9udFBhdGg7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcC5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBzdXBwb3J0cyBvbmUgbGV2ZWwgb2YgbmVzdGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyb250ID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZHluYW1pYyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhc0JhY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tQYXRoID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcGF0aC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1ciA9IHBhdGhbal07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ci5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljID0gY29uY2F0KGZyb250LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIucmVwbGFjZSgne30nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqIDwgcGF0aC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNCYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNCYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrUGF0aC5wdXNoKGN1cik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9udC5wdXNoKGN1cik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5blZhbHVlID0gcnBhdGgoZHluYW1pYywgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5blZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlVmFsdWUgPSBtYXBPYmpJbmRleGVkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZCwgaykgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JhcENoaWxkcmVuUHJvcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNCYWNrID8gcnBhdGgoYmFja1BhdGgsIGQpIDogZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNCYWNrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jYXQoW2tdLCBiYWNrUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29uY2F0KGR5bmFtaWMsIFtrXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5blZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gZHluYW1pYztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBycGF0aChwYXRoLCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlVmFsdWUgPSB0aGlzLndyYXBDaGlsZHJlblByb3Aobm9kZSwgcGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvcHMgPSBhc3NvY1BhdGgocGF0aCwgbm9kZVZhbHVlLCBwcm9wcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlblByb3AuaW5jbHVkZXMoJ3t9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9wYXRoID0gY2hpbGRyZW5Qcm9wLnJlcGxhY2UoJ3t9JywgJycpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0FycmF5ID0gY2hpbGRyZW5Qcm9wLmluY2x1ZGVzKCdbXScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BhdGggPSBvcGF0aC5yZXBsYWNlKCdbXScsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gcHJvcHNbb3BhdGhdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBub2RlLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFQYXRoID0gY29uY2F0KFtvcGF0aF0sIFtqXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzID0gYXNzb2NQYXRoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVPYmplY3Qobm9kZVtqXSwgYVBhdGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzID0gYXNzb2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVPYmplY3Qobm9kZSwgW29wYXRoXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBwcm9wc1tjaGlsZHJlblByb3BdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wcyA9IGFzc29jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuUHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyYXBDaGlsZHJlblByb3Aobm9kZSwgW2NoaWxkcmVuUHJvcF0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUocHJvcHMuaWQpID09PSAnT2JqZWN0Jykge1xuICAgICAgICAgICAgLy8gVHVybiBvYmplY3QgaWRzIChmb3Igd2lsZGNhcmRzKSBpbnRvIHVuaXF1ZSBzdHJpbmdzLlxuICAgICAgICAgICAgLy8gQmVjYXVzZSBvZiB0aGUgYGRpc3NvY2AgYWJvdmUgd2UncmUgbm90IG11dGF0aW5nIHRoZSBsYXlvdXQsXG4gICAgICAgICAgICAvLyBqdXN0IHRoZSBpZCB3ZSBwYXNzIG9uIHRvIHRoZSByZW5kZXJlZCBjb21wb25lbnRcbiAgICAgICAgICAgIHByb3BzLmlkID0gc3RyaW5naWZ5SWQocHJvcHMuaWQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV4dHJhUHJvcHMgPSB7XG4gICAgICAgICAgICBsb2FkaW5nX3N0YXRlOiBsb2FkaW5nX3N0YXRlIHx8IE5PVF9MT0FESU5HLFxuICAgICAgICAgICAgc2V0UHJvcHNcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPENvbXBvbmVudEVycm9yQm91bmRhcnlcbiAgICAgICAgICAgICAgICBjb21wb25lbnRUeXBlPXtfZGFzaHByaXZhdGVfbGF5b3V0LnR5cGV9XG4gICAgICAgICAgICAgICAgY29tcG9uZW50SWQ9e3Byb3BzLmlkfVxuICAgICAgICAgICAgICAgIGtleT17cHJvcHMuaWR9XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2g9e19kYXNocHJpdmF0ZV9kaXNwYXRjaH1cbiAgICAgICAgICAgICAgICBlcnJvcj17X2Rhc2hwcml2YXRlX2Vycm9yfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtfZGFzaHByaXZhdGVfY29uZmlnLnByb3BzX2NoZWNrID8gKFxuICAgICAgICAgICAgICAgICAgICA8Q2hlY2tlZENvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW49e2NoaWxkcmVufVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudD17ZWxlbWVudH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzPXtwcm9wc31cbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhUHJvcHM9e2V4dHJhUHJvcHN9XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPXtfZGFzaHByaXZhdGVfbGF5b3V0LnR5cGV9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlRWxlbWVudChlbGVtZW50LCBwcm9wcywgZXh0cmFQcm9wcywgY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvQ29tcG9uZW50RXJyb3JCb3VuZGFyeT5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXRMYXlvdXRQcm9wcygpIHtcbiAgICAgICAgcmV0dXJuIHByb3BPcih7fSwgJ3Byb3BzJywgdGhpcy5wcm9wcy5fZGFzaHByaXZhdGVfbGF5b3V0KTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIF9kYXNocHJpdmF0ZV9sYXlvdXQsXG4gICAgICAgICAgICBfZGFzaHByaXZhdGVfbG9hZGluZ1N0YXRlLFxuICAgICAgICAgICAgX2Rhc2hwcml2YXRlX3BhdGhcbiAgICAgICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgICAgY29uc3QgbGF5b3V0UHJvcHMgPSB0aGlzLmdldExheW91dFByb3BzKCk7XG5cbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKFxuICAgICAgICAgICAgbGF5b3V0UHJvcHMuY2hpbGRyZW4sXG4gICAgICAgICAgICBfZGFzaHByaXZhdGVfcGF0aFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudChcbiAgICAgICAgICAgIF9kYXNocHJpdmF0ZV9sYXlvdXQsXG4gICAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICAgIF9kYXNocHJpdmF0ZV9sb2FkaW5nU3RhdGUsXG4gICAgICAgICAgICB0aGlzLnNldFByb3BzXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5UcmVlQ29udGFpbmVyLnByb3BUeXBlcyA9IHtcbiAgICBfZGFzaHByaXZhdGVfZXJyb3I6IFByb3BUeXBlcy5hbnksXG4gICAgX2Rhc2hwcml2YXRlX2xheW91dDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBfZGFzaHByaXZhdGVfbG9hZGluZ1N0YXRlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgICAgUHJvcFR5cGVzLmJvb2xcbiAgICBdKSxcbiAgICBfZGFzaHByaXZhdGVfbG9hZGluZ1N0YXRlSGFzaDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBfZGFzaHByaXZhdGVfcGF0aDogUHJvcFR5cGVzLnN0cmluZ1xufTtcblxuQmFzZVRyZWVDb250YWluZXIucHJvcFR5cGVzID0ge1xuICAgIC4uLlRyZWVDb250YWluZXIucHJvcFR5cGVzLFxuICAgIF9kYXNocHJpdmF0ZV9jb25maWc6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgX2Rhc2hwcml2YXRlX2Rpc3BhdGNoOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBfZGFzaHByaXZhdGVfZ3JhcGhzOiBQcm9wVHlwZXMuYW55LFxuICAgIF9kYXNocHJpdmF0ZV9sb2FkaW5nTWFwOiBQcm9wVHlwZXMuYW55LFxuICAgIF9kYXNocHJpdmF0ZV9wYXRoOiBQcm9wVHlwZXMuYXJyYXlcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFRyZWVDb250YWluZXI7XG4iLCJpbXBvcnQge21lcmdlRGVlcFJpZ2h0LCBvbmNlfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQge2dldENTUkZIZWFkZXIsIGhhbmRsZUFzeW5jRXJyb3IsIGFkZEh0dHBIZWFkZXJzfSBmcm9tICcuLi9hY3Rpb25zJztcbmltcG9ydCB7dXJsQmFzZX0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge01BWF9BVVRIX1JFVFJJRVN9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7SldUX0VYUElSRURfTUVTU0FHRSwgU1RBVFVTfSBmcm9tICcuLi9jb25zdGFudHMvY29uc3RhbnRzJztcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGUgKi9cbmNvbnN0IGxvZ1dhcm5pbmdPbmNlID0gb25jZShjb25zb2xlLndhcm4pO1xuXG5mdW5jdGlvbiBHRVQocGF0aCwgZmV0Y2hDb25maWcpIHtcbiAgICByZXR1cm4gZmV0Y2goXG4gICAgICAgIHBhdGgsXG4gICAgICAgIG1lcmdlRGVlcFJpZ2h0KGZldGNoQ29uZmlnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgaGVhZGVyczogZ2V0Q1NSRkhlYWRlcigpXG4gICAgICAgIH0pXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gUE9TVChwYXRoLCBmZXRjaENvbmZpZywgYm9keSA9IHt9KSB7XG4gICAgcmV0dXJuIGZldGNoKFxuICAgICAgICBwYXRoLFxuICAgICAgICBtZXJnZURlZXBSaWdodChmZXRjaENvbmZpZywge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiBnZXRDU1JGSGVhZGVyKCksXG4gICAgICAgICAgICBib2R5OiBib2R5ID8gSlNPTi5zdHJpbmdpZnkoYm9keSkgOiBudWxsXG4gICAgICAgIH0pXG4gICAgKTtcbn1cblxuY29uc3QgcmVxdWVzdCA9IHtHRVQsIFBPU1R9O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhcGlUaHVuayhlbmRwb2ludCwgbWV0aG9kLCBzdG9yZSwgaWQsIGJvZHkpIHtcbiAgICByZXR1cm4gYXN5bmMgKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgICAgICBsZXQge2NvbmZpZywgaG9va3N9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IG5ld0hlYWRlcnMgPSBudWxsO1xuXG4gICAgICAgIGNvbnN0IHVybCA9IGAke3VybEJhc2UoY29uZmlnKX0ke2VuZHBvaW50fWA7XG5cbiAgICAgICAgZnVuY3Rpb24gc2V0Q29ubmVjdGlvblN0YXR1cyhjb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChnZXRTdGF0ZSgpLmVycm9yLmJhY2tFbmRDb25uZWN0ZWQgIT09IGNvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1NFVF9DT05ORUNUSU9OX1NUQVRVUycsXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGNvbm5lY3RlZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogc3RvcmUsXG4gICAgICAgICAgICBwYXlsb2FkOiB7aWQsIHN0YXR1czogJ2xvYWRpbmcnfVxuICAgICAgICB9KTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlcztcbiAgICAgICAgICAgIGZvciAobGV0IHJldHJ5ID0gMDsgcmV0cnkgPD0gTUFYX0FVVEhfUkVUUklFUzsgcmV0cnkrKykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcyA9IGF3YWl0IHJlcXVlc3RbbWV0aG9kXSh1cmwsIGNvbmZpZy5mZXRjaCwgYm9keSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBmZXRjaCByZWplY3Rpb24gLSB0aGlzIG1lYW5zIHRoZSByZXF1ZXN0IGRpZG4ndCByZXR1cm4sXG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGdldCBoZXJlIGZyb20gNDAwLzUwMCBlcnJvcnMsIG9ubHkgbmV0d29ya1xuICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcnMgb3IgdW5yZXNwb25zaXZlIHNlcnZlcnMuXG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmZXRjaCBlcnJvcicsIHJlcyk7XG4gICAgICAgICAgICAgICAgICAgIHNldENvbm5lY3Rpb25TdGF0dXMoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICByZXMuc3RhdHVzID09PSBTVEFUVVMuVU5BVVRIT1JJWkVEIHx8XG4gICAgICAgICAgICAgICAgICAgIHJlcy5zdGF0dXMgPT09IFNUQVRVUy5CQURfUkVRVUVTVFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaG9va3MucmVxdWVzdF9yZWZyZXNoX2p3dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm9keS5pbmNsdWRlcyhKV1RfRVhQSVJFRF9NRVNTQUdFKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0p3dCA9IGF3YWl0IGhvb2tzLnJlcXVlc3RfcmVmcmVzaF9qd3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mZXRjaC5oZWFkZXJzLkF1dGhvcml6YXRpb24uc3Vic3RyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JlYXJlciAnLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Snd0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYWRlcnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bmV3Snd0fWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBtZXJnZURlZXBSaWdodChjb25maWcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogbmV3SGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcblxuICAgICAgICAgICAgaWYgKG5ld0hlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChhZGRIdHRwSGVhZGVycyhuZXdIZWFkZXJzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRDb25uZWN0aW9uU3RhdHVzKHRydWUpO1xuICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlICYmIGNvbnRlbnRUeXBlLmluZGV4T2YoJ2FwcGxpY2F0aW9uL2pzb24nKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmpzb24oKS50aGVuKGpzb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzdG9yZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlcy5zdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDoganNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpzb247XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2dXYXJuaW5nT25jZShcbiAgICAgICAgICAgICAgICAnUmVzcG9uc2UgaXMgbWlzc2luZyBoZWFkZXI6IGNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IHN0b3JlLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzLnN0YXR1c1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnRXJyb3IgZnJvbSBBUEkgY2FsbDogJyArIGVuZHBvaW50O1xuICAgICAgICAgICAgaGFuZGxlQXN5bmNFcnJvcihlcnIsIG1lc3NhZ2UsIGRpc3BhdGNoKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCJpbXBvcnQge1xuICAgIGNvbmNhdCxcbiAgICBmbGF0dGVuLFxuICAgIGludGVyc2VjdGlvbixcbiAgICBrZXlzLFxuICAgIG1hcCxcbiAgICBtZXJnZURlZXBSaWdodCxcbiAgICBwYXRoLFxuICAgIHBpY2ssXG4gICAgcGx1Y2ssXG4gICAgdmFsdWVzLFxuICAgIHRvUGFpcnMsXG4gICAgemlwLFxuICAgIGFzc29jUGF0aFxufSBmcm9tICdyYW1kYSc7XG5cbmltcG9ydCB7U1RBVFVTLCBKV1RfRVhQSVJFRF9NRVNTQUdFfSBmcm9tICcuLi9jb25zdGFudHMvY29uc3RhbnRzJztcbmltcG9ydCB7TUFYX0FVVEhfUkVUUklFU30gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgICBDYWxsYmFja0FjdGlvblR5cGUsXG4gICAgQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlXG59IGZyb20gJy4uL3JlZHVjZXJzL2NhbGxiYWNrcyc7XG5pbXBvcnQge1xuICAgIENhbGxiYWNrUmVzdWx0LFxuICAgIElDYWxsYmFjayxcbiAgICBJRXhlY3V0ZWRDYWxsYmFjayxcbiAgICBJRXhlY3V0aW5nQ2FsbGJhY2ssXG4gICAgSUNhbGxiYWNrUGF5bG9hZCxcbiAgICBJU3RvcmVkQ2FsbGJhY2ssXG4gICAgSUJsb2NrZWRDYWxsYmFjayxcbiAgICBJUHJpb3JpdGl6ZWRDYWxsYmFjayxcbiAgICBMb25nQ2FsbGJhY2tJbmZvLFxuICAgIENhbGxiYWNrUmVzcG9uc2UsXG4gICAgQ2FsbGJhY2tSZXNwb25zZURhdGFcbn0gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2tzJztcbmltcG9ydCB7aXNNdWx0aVZhbHVlZCwgc3RyaW5naWZ5SWQsIGlzTXVsdGlPdXRwdXRQcm9wfSBmcm9tICcuL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQge3VybEJhc2V9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtnZXRDU1JGSGVhZGVyfSBmcm9tICcuJztcbmltcG9ydCB7Y3JlYXRlQWN0aW9uLCBBY3Rpb259IGZyb20gJ3JlZHV4LWFjdGlvbnMnO1xuaW1wb3J0IHthZGRIdHRwSGVhZGVyc30gZnJvbSAnLi4vYWN0aW9ucyc7XG5pbXBvcnQge25vdGlmeU9ic2VydmVycywgdXBkYXRlUHJvcHN9IGZyb20gJy4vaW5kZXgnO1xuaW1wb3J0IHtDYWxsYmFja0pvYlBheWxvYWR9IGZyb20gJy4uL3JlZHVjZXJzL2NhbGxiYWNrSm9icyc7XG5pbXBvcnQge2hhbmRsZVBhdGNoLCBpc1BhdGNofSBmcm9tICcuL3BhdGNoJztcbmltcG9ydCB7Z2V0UGF0aH0gZnJvbSAnLi9wYXRocyc7XG5cbmltcG9ydCB7cmVxdWVzdERlcGVuZGVuY2llc30gZnJvbSAnLi9yZXF1ZXN0RGVwZW5kZW5jaWVzJztcblxuZXhwb3J0IGNvbnN0IGFkZEJsb2NrZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb248SUJsb2NrZWRDYWxsYmFja1tdPihcbiAgICBDYWxsYmFja0FjdGlvblR5cGUuQWRkQmxvY2tlZFxuKTtcbmV4cG9ydCBjb25zdCBhZGRDb21wbGV0ZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb248bnVtYmVyPihcbiAgICBDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGUuQWRkQ29tcGxldGVkXG4pO1xuZXhwb3J0IGNvbnN0IGFkZEV4ZWN1dGVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uPElFeGVjdXRlZENhbGxiYWNrW10+KFxuICAgIENhbGxiYWNrQWN0aW9uVHlwZS5BZGRFeGVjdXRlZFxuKTtcbmV4cG9ydCBjb25zdCBhZGRFeGVjdXRpbmdDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb248SUV4ZWN1dGluZ0NhbGxiYWNrW10+KFxuICAgIENhbGxiYWNrQWN0aW9uVHlwZS5BZGRFeGVjdXRpbmdcbik7XG5leHBvcnQgY29uc3QgYWRkUHJpb3JpdGl6ZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb248SUNhbGxiYWNrW10+KFxuICAgIENhbGxiYWNrQWN0aW9uVHlwZS5BZGRQcmlvcml0aXplZFxuKTtcbmV4cG9ydCBjb25zdCBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb248SUNhbGxiYWNrW10+KFxuICAgIENhbGxiYWNrQWN0aW9uVHlwZS5BZGRSZXF1ZXN0ZWRcbik7XG5leHBvcnQgY29uc3QgYWRkU3RvcmVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uPElTdG9yZWRDYWxsYmFja1tdPihcbiAgICBDYWxsYmFja0FjdGlvblR5cGUuQWRkU3RvcmVkXG4pO1xuZXhwb3J0IGNvbnN0IGFkZFdhdGNoZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb248SUV4ZWN1dGluZ0NhbGxiYWNrW10+KFxuICAgIENhbGxiYWNrQWN0aW9uVHlwZS5BZGRXYXRjaGVkXG4pO1xuZXhwb3J0IGNvbnN0IHJlbW92ZUV4ZWN1dGVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKFxuICAgIENhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVFeGVjdXRlZFxuKTtcbmV4cG9ydCBjb25zdCByZW1vdmVCbG9ja2VkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uPElCbG9ja2VkQ2FsbGJhY2tbXT4oXG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZUJsb2NrZWRcbik7XG5leHBvcnQgY29uc3QgcmVtb3ZlRXhlY3V0aW5nQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uPElFeGVjdXRpbmdDYWxsYmFja1tdPihcbiAgICBDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlRXhlY3V0aW5nXG4pO1xuZXhwb3J0IGNvbnN0IHJlbW92ZVByaW9yaXRpemVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uPElDYWxsYmFja1tdPihcbiAgICBDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlUHJpb3JpdGl6ZWRcbik7XG5leHBvcnQgY29uc3QgcmVtb3ZlUmVxdWVzdGVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uPElDYWxsYmFja1tdPihcbiAgICBDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlUmVxdWVzdGVkXG4pO1xuZXhwb3J0IGNvbnN0IHJlbW92ZVN0b3JlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbjxJU3RvcmVkQ2FsbGJhY2tbXT4oXG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVN0b3JlZFxuKTtcbmV4cG9ydCBjb25zdCByZW1vdmVXYXRjaGVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uPElFeGVjdXRpbmdDYWxsYmFja1tdPihcbiAgICBDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlV2F0Y2hlZFxuKTtcbmV4cG9ydCBjb25zdCBhZ2dyZWdhdGVDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb248XG4gICAgKEFjdGlvbjxJQ2FsbGJhY2tbXT4gfCBBY3Rpb248bnVtYmVyPiB8IG51bGwpW11cbj4oQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlLkFnZ3JlZ2F0ZSk7XG5cbmNvbnN0IHVwZGF0ZVJlc291cmNlVXNhZ2UgPSBjcmVhdGVBY3Rpb24oJ1VQREFURV9SRVNPVVJDRV9VU0FHRScpO1xuXG5jb25zdCBhZGRDYWxsYmFja0pvYiA9IGNyZWF0ZUFjdGlvbignQUREX0NBTExCQUNLX0pPQicpO1xuY29uc3QgcmVtb3ZlQ2FsbGJhY2tKb2IgPSBjcmVhdGVBY3Rpb24oJ1JFTU9WRV9DQUxMQkFDS19KT0InKTtcbmNvbnN0IHNldENhbGxiYWNrSm9iT3V0ZGF0ZWQgPSBjcmVhdGVBY3Rpb24oJ0NBTExCQUNLX0pPQl9PVVREQVRFRCcpO1xuXG5mdW5jdGlvbiB1bndyYXBJZk5vdE11bHRpKFxuICAgIHBhdGhzOiBhbnksXG4gICAgaWRQcm9wczogYW55LFxuICAgIHNwZWM6IGFueSxcbiAgICBhbnlWYWxzOiBhbnksXG4gICAgZGVwVHlwZTogYW55XG4pIHtcbiAgICBsZXQgbXNnID0gJyc7XG5cbiAgICBpZiAoaXNNdWx0aVZhbHVlZChzcGVjKSkge1xuICAgICAgICByZXR1cm4gW2lkUHJvcHMsIG1zZ107XG4gICAgfVxuXG4gICAgaWYgKGlkUHJvcHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIGlmICghaWRQcm9wcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzU3RyID0gdHlwZW9mIHNwZWMuaWQgPT09ICdzdHJpbmcnO1xuICAgICAgICAgICAgbXNnID1cbiAgICAgICAgICAgICAgICAnQSBub25leGlzdGVudCBvYmplY3Qgd2FzIHVzZWQgaW4gYW4gYCcgK1xuICAgICAgICAgICAgICAgIGRlcFR5cGUgK1xuICAgICAgICAgICAgICAgICdgIG9mIGEgRGFzaCBjYWxsYmFjay4gVGhlIGlkIG9mIHRoaXMgb2JqZWN0IGlzICcgK1xuICAgICAgICAgICAgICAgIChpc1N0clxuICAgICAgICAgICAgICAgICAgICA/ICdgJyArIHNwZWMuaWQgKyAnYCdcbiAgICAgICAgICAgICAgICAgICAgOiBKU09OLnN0cmluZ2lmeShzcGVjLmlkKSArXG4gICAgICAgICAgICAgICAgICAgICAgKGFueVZhbHMgPyAnIHdpdGggTUFUQ0ggdmFsdWVzICcgKyBhbnlWYWxzIDogJycpKSArXG4gICAgICAgICAgICAgICAgJyBhbmQgdGhlIHByb3BlcnR5IGlzIGAnICtcbiAgICAgICAgICAgICAgICBzcGVjLnByb3BlcnR5ICtcbiAgICAgICAgICAgICAgICAoaXNTdHJcbiAgICAgICAgICAgICAgICAgICAgPyAnYC4gVGhlIHN0cmluZyBpZHMgaW4gdGhlIGN1cnJlbnQgbGF5b3V0IGFyZTogWycgK1xuICAgICAgICAgICAgICAgICAgICAgIGtleXMocGF0aHMuc3Rycykuam9pbignLCAnKSArXG4gICAgICAgICAgICAgICAgICAgICAgJ10nXG4gICAgICAgICAgICAgICAgICAgIDogJ2AuIFRoZSB3aWxkY2FyZCBpZHMgY3VycmVudGx5IGF2YWlsYWJsZSBhcmUgbG9nZ2VkIGFib3ZlLicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbXNnID1cbiAgICAgICAgICAgICAgICAnTXVsdGlwbGUgb2JqZWN0cyB3ZXJlIGZvdW5kIGZvciBhbiBgJyArXG4gICAgICAgICAgICAgICAgZGVwVHlwZSArXG4gICAgICAgICAgICAgICAgJ2Agb2YgYSBjYWxsYmFjayB0aGF0IG9ubHkgdGFrZXMgb25lIHZhbHVlLiBUaGUgaWQgc3BlYyBpcyAnICtcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShzcGVjLmlkKSArXG4gICAgICAgICAgICAgICAgKGFueVZhbHMgPyAnIHdpdGggTUFUQ0ggdmFsdWVzICcgKyBhbnlWYWxzIDogJycpICtcbiAgICAgICAgICAgICAgICAnIGFuZCB0aGUgcHJvcGVydHkgaXMgYCcgK1xuICAgICAgICAgICAgICAgIHNwZWMucHJvcGVydHkgK1xuICAgICAgICAgICAgICAgICdgLiBUaGUgb2JqZWN0cyB3ZSBmb3VuZCBhcmU6ICcgK1xuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG1hcChwaWNrKFsnaWQnLCAncHJvcGVydHknXSksIGlkUHJvcHMpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW2lkUHJvcHNbMF0sIG1zZ107XG59XG5cbmZ1bmN0aW9uIGZpbGxWYWxzKFxuICAgIHBhdGhzOiBhbnksXG4gICAgbGF5b3V0OiBhbnksXG4gICAgY2I6IElDYWxsYmFjayxcbiAgICBzcGVjczogYW55LFxuICAgIGRlcFR5cGU6IGFueSxcbiAgICBhbGxvd0FsbE1pc3NpbmcgPSBmYWxzZVxuKSB7XG4gICAgY29uc3QgZ2V0dGVyID0gZGVwVHlwZSA9PT0gJ0lucHV0JyA/IGNiLmdldElucHV0cyA6IGNiLmdldFN0YXRlO1xuICAgIGNvbnN0IGVycm9yczogYW55W10gPSBbXTtcbiAgICBsZXQgZW1wdHlNdWx0aVZhbHVlcyA9IDA7XG5cbiAgICBjb25zdCBpbnB1dFZhbHMgPSBnZXR0ZXIocGF0aHMpLm1hcCgoaW5wdXRMaXN0OiBhbnksIGk6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBbaW5wdXRzLCBpbnB1dEVycm9yXSA9IHVud3JhcElmTm90TXVsdGkoXG4gICAgICAgICAgICBwYXRocyxcbiAgICAgICAgICAgIGlucHV0TGlzdC5tYXAoKHtpZCwgcHJvcGVydHksIHBhdGg6IHBhdGhffTogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBwYXRoKFsuLi5wYXRoXywgJ3Byb3BzJywgcHJvcGVydHldLCBsYXlvdXQpIGFzIGFueVxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgc3BlY3NbaV0sXG4gICAgICAgICAgICBjYi5hbnlWYWxzLFxuICAgICAgICAgICAgZGVwVHlwZVxuICAgICAgICApO1xuICAgICAgICBpZiAoaXNNdWx0aVZhbHVlZChzcGVjc1tpXSkgJiYgIWlucHV0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVtcHR5TXVsdGlWYWx1ZXMrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wdXRFcnJvcikge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goaW5wdXRFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlucHV0cztcbiAgICB9KTtcblxuICAgIGlmIChlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGFsbG93QWxsTWlzc2luZyAmJlxuICAgICAgICAgICAgZXJyb3JzLmxlbmd0aCArIGVtcHR5TXVsdGlWYWx1ZXMgPT09IGlucHV0VmFscy5sZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBXZSBoYXZlIGF0IGxlYXN0IG9uZSBub24tbXVsdGl2YWx1ZWQgaW5wdXQsIGJ1dCBhbGwgc2ltcGxlIGFuZFxuICAgICAgICAgICAgLy8gbXVsdGktdmFsdWVkIGlucHV0cyBhcmUgbWlzc2luZy5cbiAgICAgICAgICAgIC8vIChpZiBhbGwgaW5wdXRzIGFyZSBtdWx0aXZhbHVlZCBhbmQgYWxsIG1pc3Npbmcgd2Ugc3RpbGwgcmV0dXJuXG4gICAgICAgICAgICAvLyB0aGVtIGFzIG5vcm1hbCwgYW5kIGZpcmUgdGhlIGNhbGxiYWNrLilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHdlIGdldCBoZXJlIHdlIGhhdmUgc29tZSBtaXNzaW5nIGFuZCBzb21lIHByZXNlbnQgaW5wdXRzLlxuICAgICAgICAvLyBPciBhbGwgbWlzc2luZyBpbiBhIGNvbnRleHQgdGhhdCBkb2Vzbid0IGFsbG93IHRoaXMuXG4gICAgICAgIC8vIFRoYXQncyBhIHJlYWwgcHJvYmxlbSwgc28gdGhyb3cgdGhlIGZpcnN0IG1lc3NhZ2UgYXMgYW4gZXJyb3IuXG4gICAgICAgIHJlZkVycihlcnJvcnMsIHBhdGhzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5wdXRWYWxzO1xufVxuXG5mdW5jdGlvbiByZWZFcnIoZXJyb3JzOiBhbnksIHBhdGhzOiBhbnkpIHtcbiAgICBjb25zdCBlcnIgPSBlcnJvcnNbMF07XG4gICAgaWYgKGVyci5pbmRleE9mKCdsb2dnZWQgYWJvdmUnKSAhPT0gLTEpIHtcbiAgICAgICAgLy8gV2lsZGNhcmQgcmVmZXJlbmNlIGVycm9ycyBtZW50aW9uIGEgbGlzdCBvZiB3aWxkY2FyZCBzcGVjcyBsb2dnZWRcbiAgICAgICAgLy8gVE9ETzogdW53cmFwcGVkIGxpc3Qgb2Ygd2lsZGNhcmQgaWRzP1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmVycm9yKHBhdGhzLm9ianMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoZXJyKTtcbn1cblxuY29uc3QgZ2V0VmFscyA9IChpbnB1dDogYW55KSA9PlxuICAgIEFycmF5LmlzQXJyYXkoaW5wdXQpID8gcGx1Y2soJ3ZhbHVlJywgaW5wdXQpIDogaW5wdXQudmFsdWU7XG5cbmNvbnN0IHppcElmQXJyYXkgPSAoYTogYW55LCBiOiBhbnkpID0+XG4gICAgQXJyYXkuaXNBcnJheShhKSA/IHppcChhLCBiKSA6IFtbYSwgYl1dO1xuXG5mdW5jdGlvbiBjbGVhbk91dHB1dFByb3AocHJvcGVydHk6IHN0cmluZykge1xuICAgIHJldHVybiBwcm9wZXJ0eS5zcGxpdCgnQCcpWzBdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVDbGllbnRzaWRlKFxuICAgIGRpc3BhdGNoOiBhbnksXG4gICAgY2xpZW50c2lkZV9mdW5jdGlvbjogYW55LFxuICAgIGNvbmZpZzogYW55LFxuICAgIHBheWxvYWQ6IElDYWxsYmFja1BheWxvYWRcbikge1xuICAgIGNvbnN0IGRjID0gKCh3aW5kb3cgYXMgYW55KS5kYXNoX2NsaWVudHNpZGUgPVxuICAgICAgICAod2luZG93IGFzIGFueSkuZGFzaF9jbGllbnRzaWRlIHx8IHt9KTtcbiAgICBpZiAoIWRjLm5vX3VwZGF0ZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGMsICdub191cGRhdGUnLCB7XG4gICAgICAgICAgICB2YWx1ZToge2Rlc2NyaXB0aW9uOiAnUmV0dXJuIHRvIHByZXZlbnQgdXBkYXRpbmcgYW4gT3V0cHV0Lid9LFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYywgJ1ByZXZlbnRVcGRhdGUnLCB7XG4gICAgICAgICAgICB2YWx1ZToge2Rlc2NyaXB0aW9uOiAnVGhyb3cgdG8gcHJldmVudCB1cGRhdGluZyBhbGwgT3V0cHV0cy4nfSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB7aW5wdXRzLCBvdXRwdXRzLCBzdGF0ZX0gPSBwYXlsb2FkO1xuICAgIGNvbnN0IHJlcXVlc3RUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgIGNvbnN0IGlucHV0RGljdCA9IGlucHV0c1RvRGljdChpbnB1dHMpO1xuICAgIGNvbnN0IHN0YXRlRGljdCA9IGlucHV0c1RvRGljdChzdGF0ZSk7XG4gICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgICBsZXQgc3RhdHVzOiBhbnkgPSBTVEFUVVMuT0s7XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCB7bmFtZXNwYWNlLCBmdW5jdGlvbl9uYW1lfSA9IGNsaWVudHNpZGVfZnVuY3Rpb247XG4gICAgICAgIGxldCBhcmdzID0gaW5wdXRzLm1hcChnZXRWYWxzKTtcbiAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgICBhcmdzID0gY29uY2F0KGFyZ3MsIHN0YXRlLm1hcChnZXRWYWxzKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXR1cCBjYWxsYmFjayBjb250ZXh0XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQgPSB7fTtcbiAgICAgICAgZGMuY2FsbGJhY2tfY29udGV4dC50cmlnZ2VyZWQgPSBwYXlsb2FkLmNoYW5nZWRQcm9wSWRzLm1hcChwcm9wX2lkID0+ICh7XG4gICAgICAgICAgICBwcm9wX2lkOiBwcm9wX2lkLFxuICAgICAgICAgICAgdmFsdWU6IGlucHV0RGljdFtwcm9wX2lkXVxuICAgICAgICB9KSk7XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQuaW5wdXRzX2xpc3QgPSBpbnB1dHM7XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQuaW5wdXRzID0gaW5wdXREaWN0O1xuICAgICAgICBkYy5jYWxsYmFja19jb250ZXh0LnN0YXRlc19saXN0ID0gc3RhdGU7XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQuc3RhdGVzID0gc3RhdGVEaWN0O1xuXG4gICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IGRjW25hbWVzcGFjZV1bZnVuY3Rpb25fbmFtZV0oLi4uYXJncyk7XG5cbiAgICAgICAgZGVsZXRlIGRjLmNhbGxiYWNrX2NvbnRleHQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXR1cm5WYWx1ZT8udGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBhd2FpdCByZXR1cm5WYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHppcElmQXJyYXkob3V0cHV0cywgcmV0dXJuVmFsdWUpLmZvckVhY2goKFtvdXRpLCByZXRpXSkgPT4ge1xuICAgICAgICAgICAgemlwSWZBcnJheShvdXRpLCByZXRpKS5mb3JFYWNoKChbb3V0aWosIHJldGlqXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtpZCwgcHJvcGVydHl9ID0gb3V0aWo7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRTdHIgPSBzdHJpbmdpZnlJZChpZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YUZvcklkID0gKHJlc3VsdFtpZFN0cl0gPSByZXN1bHRbaWRTdHJdIHx8IHt9KTtcbiAgICAgICAgICAgICAgICBpZiAocmV0aWogIT09IGRjLm5vX3VwZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhRm9ySWRbY2xlYW5PdXRwdXRQcm9wKHByb3BlcnR5KV0gPSByZXRpajtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSA9PT0gZGMuUHJldmVudFVwZGF0ZSkge1xuICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTLlBSRVZFTlRfVVBEQVRFO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTLkNMSUVOVFNJREVfRVJST1I7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZGVsZXRlIGRjLmNhbGxiYWNrX2NvbnRleHQ7XG5cbiAgICAgICAgLy8gU2V0dGluZyBzZXJ2ZXIgPSBjbGllbnQgZm9yY2VzIG5ldHdvcmsgPSAwXG4gICAgICAgIGNvbnN0IHRvdGFsVGltZSA9IERhdGUubm93KCkgLSByZXF1ZXN0VGltZTtcbiAgICAgICAgY29uc3QgcmVzb3VyY2VzID0ge1xuICAgICAgICAgICAgX19kYXNoX3NlcnZlcjogdG90YWxUaW1lLFxuICAgICAgICAgICAgX19kYXNoX2NsaWVudDogdG90YWxUaW1lLFxuICAgICAgICAgICAgX19kYXNoX3VwbG9hZDogMCxcbiAgICAgICAgICAgIF9fZGFzaF9kb3dubG9hZDogMFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChjb25maWcudWkpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIHVwZGF0ZVJlc291cmNlVXNhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBpZDogcGF5bG9hZC5vdXRwdXQsXG4gICAgICAgICAgICAgICAgICAgIHVzYWdlOiByZXNvdXJjZXMsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzaWRlVXBkYXRlKG91dHB1dHM6IGFueSwgZGlzcGF0Y2g6IGFueSwgcGF0aHM6IGFueSkge1xuICAgIHRvUGFpcnMob3V0cHV0cykuZm9yRWFjaCgoW2lkLCB2YWx1ZV0pID0+IHtcbiAgICAgICAgY29uc3QgW2NvbXBvbmVudElkLCBwcm9wTmFtZV0gPSBpZC5zcGxpdCgnLicpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRQYXRoID0gcGF0aHMuc3Ryc1tjb21wb25lbnRJZF07XG4gICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgdXBkYXRlUHJvcHMoe1xuICAgICAgICAgICAgICAgIHByb3BzOiB7W3Byb3BOYW1lXTogdmFsdWV9LFxuICAgICAgICAgICAgICAgIGl0ZW1wYXRoOiBjb21wb25lbnRQYXRoXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgIG5vdGlmeU9ic2VydmVycyh7aWQ6IGNvbXBvbmVudElkLCBwcm9wczoge1twcm9wTmFtZV06IHZhbHVlfX0pXG4gICAgICAgICk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVNlcnZlcnNpZGUoXG4gICAgZGlzcGF0Y2g6IGFueSxcbiAgICBob29rczogYW55LFxuICAgIGNvbmZpZzogYW55LFxuICAgIHBheWxvYWQ6IGFueSxcbiAgICBwYXRoczogYW55LFxuICAgIGxvbmc6IExvbmdDYWxsYmFja0luZm8gfCB1bmRlZmluZWQsXG4gICAgYWRkaXRpb25hbEFyZ3M6IFtzdHJpbmcsIHN0cmluZywgYm9vbGVhbj9dW10gfCB1bmRlZmluZWQsXG4gICAgZ2V0U3RhdGU6IGFueSxcbiAgICBvdXRwdXQ6IHN0cmluZ1xuKTogUHJvbWlzZTxDYWxsYmFja1Jlc3BvbnNlPiB7XG4gICAgaWYgKGhvb2tzLnJlcXVlc3RfcHJlKSB7XG4gICAgICAgIGhvb2tzLnJlcXVlc3RfcHJlKHBheWxvYWQpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZCk7XG4gICAgbGV0IGNhY2hlS2V5OiBzdHJpbmc7XG4gICAgbGV0IGpvYjogc3RyaW5nO1xuICAgIGxldCBydW5uaW5nT2ZmOiBhbnk7XG4gICAgbGV0IHByb2dyZXNzRGVmYXVsdDogYW55O1xuICAgIGxldCBtb3JlQXJncyA9IGFkZGl0aW9uYWxBcmdzO1xuXG4gICAgY29uc3QgZmV0Y2hDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGdldENTUkZIZWFkZXIoKSBhcyBhbnk7XG4gICAgICAgIGxldCB1cmwgPSBgJHt1cmxCYXNlKGNvbmZpZyl9X2Rhc2gtdXBkYXRlLWNvbXBvbmVudGA7XG5cbiAgICAgICAgY29uc3QgYWRkQXJnID0gKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgbGV0IGRlbGltID0gJz8nO1xuICAgICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnPycpKSB7XG4gICAgICAgICAgICAgICAgZGVsaW0gPSAnJic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cmwgPSBgJHt1cmx9JHtkZWxpbX0ke25hbWV9PSR7dmFsdWV9YDtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNhY2hlS2V5KSB7XG4gICAgICAgICAgICBhZGRBcmcoJ2NhY2hlS2V5JywgY2FjaGVLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChqb2IpIHtcbiAgICAgICAgICAgIGFkZEFyZygnam9iJywgam9iKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb3JlQXJncykge1xuICAgICAgICAgICAgbW9yZUFyZ3MuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiBhZGRBcmcoa2V5LCB2YWx1ZSkpO1xuICAgICAgICAgICAgbW9yZUFyZ3MgPSBtb3JlQXJncy5maWx0ZXIoKFtfLCBfXywgc2luZ2xlXSkgPT4gIXNpbmdsZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmV0Y2goXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICBtZXJnZURlZXBSaWdodChjb25maWcuZmV0Y2gsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIGJvZHlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZU91dHB1dCA9IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge3N0YXR1c30gPSByZXM7XG5cbiAgICAgICAgICAgIGlmIChqb2IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFja0pvYiA9IGdldFN0YXRlKCkuY2FsbGJhY2tKb2JzW2pvYl07XG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrSm9iPy5vdXRkYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChyZW1vdmVDYWxsYmFja0pvYih7am9iSWQ6IGpvYn0pKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoe30pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gcmVjb3JkUHJvZmlsZShyZXN1bHQ6IGFueSkge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcudWkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FsbGJhY2sgcHJvZmlsaW5nIC0gb25seSByZWxldmFudCBpZiB3ZSdyZSBzaG93aW5nIHRoZSBkZWJ1ZyB1aVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvdXJjZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfc2VydmVyOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX2NsaWVudDogRGF0ZS5ub3coKSAtIHJlcXVlc3RUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX3VwbG9hZDogYm9keS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfZG93bmxvYWQ6IE51bWJlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuaGVhZGVycy5nZXQoJ0NvbnRlbnQtTGVuZ3RoJylcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfSBhcyBhbnk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltaW5nSGVhZGVycyA9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMuaGVhZGVycy5nZXQoJ1NlcnZlci1UaW1pbmcnKSB8fCAnJztcblxuICAgICAgICAgICAgICAgICAgICB0aW1pbmdIZWFkZXJzLnNwbGl0KCcsJykuZm9yRWFjaCgoaGVhZGVyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBoZWFkZXIuc3BsaXQoJzsnKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR1ciA9IGhlYWRlci5tYXRjaCgvO2R1cj1bMC05Ll0rLyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXNbbmFtZV0gPSBOdW1iZXIoZHVyWzBdLnNsaWNlKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVSZXNvdXJjZVVzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcGF5bG9hZC5vdXRwdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2U6IHJlc291cmNlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0czogcGF5bG9hZC5pbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHBheWxvYWQuc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmaW5pc2hMaW5lID0gKGRhdGE6IENhbGxiYWNrUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qge211bHRpLCByZXNwb25zZX0gPSBkYXRhO1xuICAgICAgICAgICAgICAgIGlmIChob29rcy5yZXF1ZXN0X3Bvc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgaG9va3MucmVxdWVzdF9wb3N0KHBheWxvYWQsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChtdWx0aSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXNwb25zZSBhcyBDYWxsYmFja1Jlc3BvbnNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHtvdXRwdXR9ID0gcGF5bG9hZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSBvdXRwdXQuc3Vic3RyKDAsIG91dHB1dC5sYXN0SW5kZXhPZignLicpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0ge1tpZF06IChyZXNwb25zZSBhcyBDYWxsYmFja1Jlc3BvbnNlKS5wcm9wc307XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVjb3JkUHJvZmlsZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlSm9iID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChqb2IpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gocmVtb3ZlQ2FsbGJhY2tKb2Ioe2pvYklkOiBqb2J9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChydW5uaW5nT2ZmKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpZGVVcGRhdGUocnVubmluZ09mZiwgZGlzcGF0Y2gsIHBhdGhzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgICAgICBzaWRlVXBkYXRlKHByb2dyZXNzRGVmYXVsdCwgZGlzcGF0Y2gsIHBhdGhzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSBTVEFUVVMuT0spIHtcbiAgICAgICAgICAgICAgICByZXMuanNvbigpLnRoZW4oKGRhdGE6IENhbGxiYWNrUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2FjaGVLZXkgJiYgZGF0YS5jYWNoZUtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVLZXkgPSBkYXRhLmNhY2hlS2V5O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFqb2IgJiYgZGF0YS5qb2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpvYkluZm86IENhbGxiYWNrSm9iUGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JJZDogZGF0YS5qb2IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVLZXk6IGRhdGEuY2FjaGVLZXkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbElucHV0czogZGF0YS5jYW5jZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NEZWZhdWx0OiBkYXRhLnByb2dyZXNzRGVmYXVsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChhZGRDYWxsYmFja0pvYihqb2JJbmZvKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBqb2IgPSBkYXRhLmpvYjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWRlVXBkYXRlKGRhdGEucHJvZ3Jlc3MsIGRpc3BhdGNoLCBwYXRocyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEucnVubmluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lkZVVwZGF0ZShkYXRhLnJ1bm5pbmcsIGRpc3BhdGNoLCBwYXRocyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFydW5uaW5nT2ZmICYmIGRhdGEucnVubmluZ09mZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZ09mZiA9IGRhdGEucnVubmluZ09mZjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2dyZXNzRGVmYXVsdCAmJiBkYXRhLnByb2dyZXNzRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NEZWZhdWx0ID0gZGF0YS5wcm9ncmVzc0RlZmF1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWxvbmcgfHwgZGF0YS5yZXNwb25zZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUpvYigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoTGluZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvbGwgY2hhaW4uXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nLmludGVydmFsICE9PSB1bmRlZmluZWQgPyBsb25nLmludGVydmFsIDogNTAwXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gU1RBVFVTLlBSRVZFTlRfVVBEQVRFKSB7XG4gICAgICAgICAgICAgICAgY29tcGxldGVKb2IoKTtcbiAgICAgICAgICAgICAgICByZWNvcmRQcm9maWxlKHt9KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHt9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29tcGxldGVKb2IoKTtcbiAgICAgICAgICAgICAgICByZWplY3QocmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBoYW5kbGVFcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChjb25maWcudWkpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlUmVzb3VyY2VVc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogcGF5bG9hZC5vdXRwdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFNUQVRVUy5OT19SRVNQT05TRSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDoge30sXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IHBheWxvYWQuaW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHBheWxvYWQuc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQ2FsbGJhY2sgZmFpbGVkOiB0aGUgc2VydmVyIGRpZCBub3QgcmVzcG9uZC4nKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgaGFuZGxlID0gKCkgPT4ge1xuICAgICAgICAgICAgZmV0Y2hDYWxsYmFjaygpLnRoZW4oaGFuZGxlT3V0cHV0LCBoYW5kbGVFcnJvcik7XG4gICAgICAgIH07XG4gICAgICAgIGhhbmRsZSgpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBpbnB1dHNUb0RpY3QoaW5wdXRzX2xpc3Q6IGFueSkge1xuICAgIC8vIFBvcnRlZCBkaXJlY3RseSBmcm9tIF91dGlscy5weSwgaW5wdXRzX3RvX2RpY3RcbiAgICAvLyB0YWtlcyBhbiBhcnJheSBvZiBpbnB1dHMgKHNvbWUgaW5wdXRzIG1heSBiZSBhbiBhcnJheSlcbiAgICAvLyByZXR1cm5zIGFuIE9iamVjdCAobWFwKTpcbiAgICAvLyAga2V5cyBvZiB0aGUgZm9ybSBgaWQucHJvcGVydHlgIG9yIGB7XCJpZFwiOiAwfS5wcm9wZXJ0eWBcbiAgICAvLyAgdmFsdWVzIGNvbnRhaW4gdGhlIHByb3BlcnR5IHZhbHVlXG4gICAgaWYgKCFpbnB1dHNfbGlzdCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IGlucHV0czogYW55ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dHNfbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dHNfbGlzdFtpXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0c2kgPSBpbnB1dHNfbGlzdFtpXTtcbiAgICAgICAgICAgIGZvciAobGV0IGlpID0gMDsgaWkgPCBpbnB1dHNpLmxlbmd0aDsgaWkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkX3N0ciA9IGAke3N0cmluZ2lmeUlkKGlucHV0c2lbaWldLmlkKX0uJHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzaVtpaV0ucHJvcGVydHlcbiAgICAgICAgICAgICAgICB9YDtcbiAgICAgICAgICAgICAgICBpbnB1dHNbaWRfc3RyXSA9IGlucHV0c2lbaWldLnZhbHVlID8/IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpZF9zdHIgPSBgJHtzdHJpbmdpZnlJZChpbnB1dHNfbGlzdFtpXS5pZCl9LiR7XG4gICAgICAgICAgICAgICAgaW5wdXRzX2xpc3RbaV0ucHJvcGVydHlcbiAgICAgICAgICAgIH1gO1xuICAgICAgICAgICAgaW5wdXRzW2lkX3N0cl0gPSBpbnB1dHNfbGlzdFtpXS52YWx1ZSA/PyBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlQ2FsbGJhY2soXG4gICAgY2I6IElQcmlvcml0aXplZENhbGxiYWNrLFxuICAgIGNvbmZpZzogYW55LFxuICAgIGhvb2tzOiBhbnksXG4gICAgcGF0aHM6IGFueSxcbiAgICBsYXlvdXQ6IGFueSxcbiAgICB7YWxsT3V0cHV0c306IGFueSxcbiAgICBkaXNwYXRjaDogYW55LFxuICAgIGdldFN0YXRlOiBhbnlcbik6IElFeGVjdXRpbmdDYWxsYmFjayB7XG4gICAgY29uc3Qge291dHB1dCwgaW5wdXRzLCBzdGF0ZSwgY2xpZW50c2lkZV9mdW5jdGlvbiwgbG9uZywgZHluYW1pY19jcmVhdG9yLCBmb3JjZV9ub19vdXRwdXR9ID1cbiAgICAgICAgY2IuY2FsbGJhY2s7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaW5WYWxzID0gZmlsbFZhbHMocGF0aHMsIGxheW91dCwgY2IsIGlucHV0cywgJ0lucHV0JywgdHJ1ZSk7XG5cbiAgICAgICAgLyogUHJldmVudCBjYWxsYmFjayBpZiB0aGVyZSdzIG5vIGlucHV0cyAqL1xuICAgICAgICBpZiAoaW5WYWxzID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvblByb21pc2U6IG51bGxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdXRwdXRzOiBhbnlbXSA9IFtdO1xuICAgICAgICBjb25zdCBvdXRwdXRFcnJvcnM6IGFueVtdID0gW107XG4gICAgICAgIGFsbE91dHB1dHMuZm9yRWFjaCgob3V0OiBhbnksIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgW291dGksIGVycmldID0gdW53cmFwSWZOb3RNdWx0aShcbiAgICAgICAgICAgICAgICBwYXRocyxcbiAgICAgICAgICAgICAgICBtYXAocGljayhbJ2lkJywgJ3Byb3BlcnR5J10pLCBvdXQpLFxuICAgICAgICAgICAgICAgIGNiLmNhbGxiYWNrLm91dHB1dHNbaV0sXG4gICAgICAgICAgICAgICAgY2IuYW55VmFscyxcbiAgICAgICAgICAgICAgICAnT3V0cHV0J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG91dHB1dHMucHVzaChvdXRpKTtcbiAgICAgICAgICAgIGlmIChlcnJpKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0RXJyb3JzLnB1c2goZXJyaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChvdXRwdXRFcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoZmxhdHRlbihpblZhbHMpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJlZkVycihvdXRwdXRFcnJvcnMsIHBhdGhzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoaXMgY2FzZSBpcyBhbGwtZW1wdHkgbXVsdGl2YWx1ZWQgd2lsZGNhcmQgaW5wdXRzLFxuICAgICAgICAgICAgLy8gd2hpY2ggd2Ugd291bGQgbm9ybWFsbHkgZmlyZSB0aGUgY2FsbGJhY2sgZm9yLCBleGNlcHRcbiAgICAgICAgICAgIC8vIHNvbWUgb3V0cHV0cyBhcmUgbWlzc2luZy4gU28gaW5zdGVhZCB3ZSB0cmVhdCBpdCBsaWtlXG4gICAgICAgICAgICAvLyByZWd1bGFyIG1pc3NpbmcgaW5wdXRzIGFuZCBqdXN0IHNpbGVudGx5IHByZXZlbnQgaXQuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvblByb21pc2U6IG51bGxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBfX2V4ZWN1dGUgPSBhc3luYyAoKTogUHJvbWlzZTxDYWxsYmFja1Jlc3VsdD4gPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkOiBJQ2FsbGJhY2tQYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQsXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IGlzTXVsdGlPdXRwdXRQcm9wKG91dHB1dCkgPyBvdXRwdXRzIDogb3V0cHV0c1swXSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBpblZhbHMsXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWRQcm9wSWRzOiBrZXlzKGNiLmNoYW5nZWRQcm9wSWRzKSxcbiAgICAgICAgICAgICAgICAgICAgZm9yY2Vfbm9fb3V0cHV0OiBmb3JjZV9ub19vdXRwdXQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiBjYi5jYWxsYmFjay5zdGF0ZS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZmlsbFZhbHMocGF0aHMsIGxheW91dCwgY2IsIHN0YXRlLCAnU3RhdGUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKGNsaWVudHNpZGVfZnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBoYW5kbGVDbGllbnRzaWRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudHNpZGVfZnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge2RhdGEsIHBheWxvYWR9O1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge2Vycm9yLCBwYXlsb2FkfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBuZXdDb25maWcgPSBjb25maWc7XG4gICAgICAgICAgICAgICAgbGV0IG5ld0hlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgbGFzdEVycm9yOiBhbnk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsQXJnczogW3N0cmluZywgc3RyaW5nLCBib29sZWFuP11bXSA9IFtdO1xuICAgICAgICAgICAgICAgIHZhbHVlcyhnZXRTdGF0ZSgpLmNhbGxiYWNrSm9icykuZm9yRWFjaChcbiAgICAgICAgICAgICAgICAgICAgKGpvYjogQ2FsbGJhY2tKb2JQYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2IuY2FsbGJhY2sub3V0cHV0ID09PSBqb2Iub3V0cHV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVybWluYXRlIHRoZSBvbGQgam9icyB0aGF0IGFyZSBub3QgY29tcGxldGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGFzIG91dGRhdGVkIGZvciB0aGUgY2FsbGJhY2sgcHJvbWlzZSB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdmUgYW5kIHJlbW92ZSBhZnRlci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsQXJncy5wdXNoKFsnb2xkSm9iJywgam9iLmpvYklkLCB0cnVlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENhbGxiYWNrSm9iT3V0ZGF0ZWQoe2pvYklkOiBqb2Iuam9iSWR9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWpvYi5jYW5jZWxJbnB1dHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlciA9IGludGVyc2VjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2IuY2FuY2VsSW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLmNhbGxiYWNrLmlucHV0c1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsQXJncy5wdXNoKFsnY2FuY2VsSm9iJywgam9iLmpvYklkXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpvYi5wcm9ncmVzc0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkZVVwZGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYi5wcm9ncmVzc0RlZmF1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHJldHJ5ID0gMDsgcmV0cnkgPD0gTUFYX0FVVEhfUkVUUklFUzsgcmV0cnkrKykge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBoYW5kbGVTZXJ2ZXJzaWRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbEFyZ3MubGVuZ3RoID8gYWRkaXRpb25hbEFyZ3MgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IuY2FsbGJhY2sub3V0cHV0XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3SGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGFkZEh0dHBIZWFkZXJzKG5ld0hlYWRlcnMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExheW91dCBtYXkgaGF2ZSBjaGFuZ2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudExheW91dCA9IGdldFN0YXRlKCkubGF5b3V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZmxhdHRlbihvdXRwdXRzKS5mb3JFYWNoKChvdXQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gY2xlYW5PdXRwdXRQcm9wKG91dC5wcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0UGF0aCA9IGdldFBhdGgocGF0aHMsIG91dC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHBhdGgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhdGguY29uY2F0KFsncHJvcHMnLCBwcm9wTmFtZV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TGF5b3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhUGF0aCA9IFtzdHJpbmdpZnlJZChvdXQuaWQpLCBwcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0VmFsdWUgPSBwYXRoKGRhdGFQYXRoLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNQYXRjaChvdXRwdXRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcGF0Y2ggdW5kZWZpbmVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFzc29jUGF0aChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlUGF0Y2gocHJldmlvdXNWYWx1ZSwgb3V0cHV0VmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHluYW1pY19jcmVhdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gZGlzcGF0Y2gocmVxdWVzdERlcGVuZGVuY2llcygpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7ZGF0YSwgcGF5bG9hZH07XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHJlczogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0RXJyb3IgPSByZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cnkgPD0gTUFYX0FVVEhfUkVUUklFUyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXMuc3RhdHVzID09PSBTVEFUVVMuVU5BVVRIT1JJWkVEIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zdGF0dXMgPT09IFNUQVRVUy5CQURfUkVRVUVTVClcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXMudGV4dCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHkuaW5jbHVkZXMoSldUX0VYUElSRURfTUVTU0FHRSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvb2tzLnJlcXVlc3RfcmVmcmVzaF9qd3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvbGRKd3QgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5mZXRjaC5oZWFkZXJzLkF1dGhvcml6YXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRKd3QgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZmV0Y2guaGVhZGVycy5BdXRob3JpemF0aW9uLnN1YnN0cihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCZWFyZXIgJy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Snd0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBob29rcy5yZXF1ZXN0X3JlZnJlc2hfand0KG9sZEp3dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Snd0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhZGVycyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke25ld0p3dH1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbmZpZyA9IG1lcmdlRGVlcFJpZ2h0KGNvbmZpZywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogbmV3SGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyB3ZSByZWFjaCBoZXJlIHdoZW4gd2UgcnVuIG91dCBvZiByZXRyaWVzLlxuICAgICAgICAgICAgICAgIHJldHVybiB7ZXJyb3I6IGxhc3RFcnJvciwgcGF5bG9hZDogbnVsbH07XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtlcnJvciwgcGF5bG9hZDogbnVsbH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgbmV3Q2IgPSB7XG4gICAgICAgICAgICAuLi5jYixcbiAgICAgICAgICAgIGV4ZWN1dGlvblByb21pc2U6IF9fZXhlY3V0ZSgpXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5ld0NiO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgZXhlY3V0aW9uUHJvbWlzZToge2Vycm9yLCBwYXlsb2FkOiBudWxsfVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsImNvbnN0IGFjdGlvbkxpc3QgPSB7XG4gICAgT05fUFJPUF9DSEFOR0U6IDEsXG4gICAgU0VUX1JFUVVFU1RfUVVFVUU6IDEsXG4gICAgU0VUX0dSQVBIUzogMSxcbiAgICBTRVRfUEFUSFM6IDEsXG4gICAgU0VUX0xBWU9VVDogMSxcbiAgICBTRVRfQVBQX0xJRkVDWUNMRTogMSxcbiAgICBTRVRfQ09ORklHOiAxLFxuICAgIEFERF9IVFRQX0hFQURFUlM6IDEsXG4gICAgT05fRVJST1I6IDEsXG4gICAgU0VUX0hPT0tTOiAxXG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QWN0aW9uID0gYWN0aW9uID0+IHtcbiAgICBpZiAoYWN0aW9uTGlzdFthY3Rpb25dKSB7XG4gICAgICAgIHJldHVybiBhY3Rpb247XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgJHthY3Rpb259IGlzIG5vdCBkZWZpbmVkLmApO1xufTtcblxuZXhwb3J0IGNvbnN0IE1BWF9BVVRIX1JFVFJJRVMgPSAxO1xuIiwiaW1wb3J0IHtEZXBHcmFwaH0gZnJvbSAnZGVwZW5kZW5jeS1ncmFwaCc7XG5pbXBvcnQgaXNOdW1lcmljIGZyb20gJ2Zhc3QtaXNudW1lcmljJztcbmltcG9ydCB7XG4gICAgYWxsLFxuICAgIGFueSxcbiAgICBhcCxcbiAgICBhc3NvYyxcbiAgICBkaWZmZXJlbmNlLFxuICAgIGVxdWFscyxcbiAgICBldm9sdmUsXG4gICAgZmluZEluZGV4LFxuICAgIGZsYXR0ZW4sXG4gICAgZm9yRWFjaE9iakluZGV4ZWQsXG4gICAgaW5jbHVkZXMsXG4gICAgaW50ZXJzZWN0aW9uLFxuICAgIGlzRW1wdHksXG4gICAga2V5cyxcbiAgICBtYXAsXG4gICAgbWVyZ2VSaWdodCxcbiAgICBwYXRoLFxuICAgIHBsdWNrLFxuICAgIHByb3BzLFxuICAgIHN0YXJ0c1dpdGgsXG4gICAgdmFsdWVzLFxuICAgIHppcCxcbiAgICB6aXBPYmpcbn0gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQge1xuICAgIGNvbWJpbmVJZEFuZFByb3AsXG4gICAgZ2V0Q2FsbGJhY2tzQnlJbnB1dCxcbiAgICBnZXRQcmlvcml0eSxcbiAgICBJTkRJUkVDVCxcbiAgICBtZXJnZU1heCxcbiAgICBtYWtlUmVzb2x2ZWRDYWxsYmFjayxcbiAgICByZXNvbHZlRGVwc1xufSBmcm9tICcuL2RlcGVuZGVuY2llc190cyc7XG5pbXBvcnQge2NvbXB1dGVQYXRocywgZ2V0UGF0aH0gZnJvbSAnLi9wYXRocyc7XG5cbmltcG9ydCB7Y3Jhd2xMYXlvdXR9IGZyb20gJy4vdXRpbHMnO1xuXG5pbXBvcnQgUmVnaXN0cnkgZnJvbSAnLi4vcmVnaXN0cnknO1xuXG4vKlxuICogSWYgdGhpcyB1cGRhdGUgaXMgZm9yIG11bHRpcGxlIG91dHB1dHMsIHRoZW4gaXQgaGFzXG4gKiBzdGFydGluZyAmIHRyYWlsaW5nIGAuLmAgYW5kIGVhY2ggcHJvcElkIHBhaXIgaXMgc2VwYXJhdGVkXG4gKiBieSBgLi4uYCwgZS5nLlxuICogXCIuLm91dHB1dC0xLnZhbHVlLi4ub3V0cHV0LTIudmFsdWUuLi5vdXRwdXQtMy52YWx1ZS4uLm91dHB1dC00LnZhbHVlLi5cIlxuICovXG5leHBvcnQgY29uc3QgaXNNdWx0aU91dHB1dFByb3AgPSBpZEFuZFByb3AgPT4gaWRBbmRQcm9wLnN0YXJ0c1dpdGgoJy4uJyk7XG5cbmNvbnN0IEFMTCA9IHt3aWxkOiAnQUxMJywgbXVsdGk6IDF9O1xuY29uc3QgTUFUQ0ggPSB7d2lsZDogJ01BVENIJ307XG5jb25zdCBBTExTTUFMTEVSID0ge3dpbGQ6ICdBTExTTUFMTEVSJywgbXVsdGk6IDEsIGV4cGFuZDogMX07XG5jb25zdCB3aWxkY2FyZHMgPSB7QUxMLCBNQVRDSCwgQUxMU01BTExFUn07XG5jb25zdCBhbGxvd2VkV2lsZGNhcmRzID0ge1xuICAgIE91dHB1dDoge0FMTCwgTUFUQ0h9LFxuICAgIElucHV0OiB3aWxkY2FyZHMsXG4gICAgU3RhdGU6IHdpbGRjYXJkc1xufTtcbmNvbnN0IHdpbGRjYXJkVmFsVHlwZXMgPSBbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddO1xuXG5jb25zdCBpZEludmFsaWRDaGFycyA9IFsnLicsICd7J107XG5cbi8qXG4gKiBJZiB0aGlzIElEIGlzIGEgd2lsZGNhcmQsIGl0IGlzIGEgc3RyaW5naWZpZWQgSlNPTiBvYmplY3RcbiAqIHRoZSBcIntcIiBjaGFyYWN0ZXIgaXMgZGlzYWxsb3dlZCBmcm9tIHJlZ3VsYXIgc3RyaW5nIElEc1xuICovXG5jb25zdCBpc1dpbGRjYXJkSWQgPSBpZFN0ciA9PiBpZFN0ci5zdGFydHNXaXRoKCd7Jyk7XG5cbi8qXG4gKiBUdXJuIHN0cmluZ2lmaWVkIHdpbGRjYXJkIElEcyBpbnRvIG9iamVjdHMuXG4gKiBXaWxkY2FyZHMgYXJlIGVuY29kZWQgYXMgc2luZ2xlLWl0ZW0gYXJyYXlzIGNvbnRhaW5pbmcgdGhlIHdpbGRjYXJkIG5hbWVcbiAqIGFzIGEgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBwYXJzZVdpbGRjYXJkSWQoaWRTdHIpIHtcbiAgICByZXR1cm4gbWFwKFxuICAgICAgICB2YWwgPT4gKEFycmF5LmlzQXJyYXkodmFsKSAmJiB3aWxkY2FyZHNbdmFsWzBdXSkgfHwgdmFsLFxuICAgICAgICBKU09OLnBhcnNlKGlkU3RyKVxuICAgICk7XG59XG5cbi8qXG4gKiBJZiB0aGlzIHVwZGF0ZSBpcyBmb3IgbXVsdGlwbGUgb3V0cHV0cywgdGhlbiBpdCBoYXNcbiAqIHN0YXJ0aW5nICYgdHJhaWxpbmcgYC4uYCBhbmQgZWFjaCBwcm9wSWQgcGFpciBpcyBzZXBhcmF0ZWRcbiAqIGJ5IGAuLi5gLCBlLmcuXG4gKiBcIi4ub3V0cHV0LTEudmFsdWUuLi5vdXRwdXQtMi52YWx1ZS4uLm91dHB1dC0zLnZhbHVlLi4ub3V0cHV0LTQudmFsdWUuLlwiXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTXVsdGlwbGVPdXRwdXRzKG91dHB1dElkQW5kUHJvcCkge1xuICAgIHJldHVybiBvdXRwdXRJZEFuZFByb3Auc3Vic3RyKDIsIG91dHB1dElkQW5kUHJvcC5sZW5ndGggLSA0KS5zcGxpdCgnLi4uJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdElkQW5kUHJvcChpZEFuZFByb3ApIHtcbiAgICAvLyBzaW5jZSB3aWxkY2FyZCBpZHMgY2FuIGhhdmUgLiBpbiB0aGVtIGJ1dCBwcm9wcyBjYW4ndCxcbiAgICAvLyBsb29rIGZvciB0aGUgbGFzdCAuIGluIHRoZSBzdHJpbmcgYW5kIHNwbGl0IHRoZXJlXG4gICAgY29uc3QgZG90UG9zID0gaWRBbmRQcm9wLmxhc3RJbmRleE9mKCcuJyk7XG4gICAgY29uc3QgaWRTdHIgPSBpZEFuZFByb3Auc3Vic3RyKDAsIGRvdFBvcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHBhcnNlSWZXaWxkY2FyZChpZFN0ciksXG4gICAgICAgIHByb3BlcnR5OiBpZEFuZFByb3Auc3Vic3RyKGRvdFBvcyArIDEpXG4gICAgfTtcbn1cblxuLypcbiAqIENoZWNrIGlmIHRoaXMgSUQgaXMgYSBzdHJpbmdpZmllZCBvYmplY3QsIGFuZCBpZiBzbyBwYXJzZSBpdCB0byB0aGF0IG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJZldpbGRjYXJkKGlkU3RyKSB7XG4gICAgcmV0dXJuIGlzV2lsZGNhcmRJZChpZFN0cikgPyBwYXJzZVdpbGRjYXJkSWQoaWRTdHIpIDogaWRTdHI7XG59XG5cbi8qXG4gKiBKU09OLnN0cmluZ2lmeSAtIGZvciB0aGUgb2JqZWN0IGZvcm0gLSBidXQgZW5zdXJpbmcga2V5cyBhcmUgc29ydGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnlJZChpZCkge1xuICAgIGlmICh0eXBlb2YgaWQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gICAgY29uc3Qgc3RyaW5naWZ5VmFsID0gdiA9PiAodiAmJiB2LndpbGQpIHx8IEpTT04uc3RyaW5naWZ5KHYpO1xuICAgIGNvbnN0IHBhcnRzID0gT2JqZWN0LmtleXMoaWQpXG4gICAgICAgIC5zb3J0KClcbiAgICAgICAgLm1hcChrID0+IEpTT04uc3RyaW5naWZ5KGspICsgJzonICsgc3RyaW5naWZ5VmFsKGlkW2tdKSk7XG4gICAgcmV0dXJuICd7JyArIHBhcnRzLmpvaW4oJywnKSArICd9Jztcbn1cblxuLypcbiAqIGlkIGRpY3QgdmFsdWVzIGNhbiBiZSBudW1iZXJzLCBzdHJpbmdzLCBhbmQgYm9vbGVhbnMuXG4gKiBXZSBuZWVkIGEgZGVmaW5pdGUgb3JkZXJpbmcgdGhhdCB3aWxsIHdvcmsgYWNyb3NzIHR5cGVzLFxuICogZXZlbiBpZiBzYW5lIHVzZXJzIHdvdWxkIG5vdCBtaXggdHlwZXMuXG4gKiAtIG51bWVyaWMgc3RyaW5ncyBhcmUgdHJlYXRlZCBhcyBudW1iZXJzXG4gKiAtIGJvb2xlYW5zIGNvbWUgYWZ0ZXIgbnVtYmVycywgYmVmb3JlIHN0cmluZ3MuIGZhbHNlLCB0aGVuIHRydWUuXG4gKiAtIG5vbi1udW1lcmljIHN0cmluZ3MgY29tZSBsYXN0XG4gKi9cbmZ1bmN0aW9uIGlkVmFsU29ydChhLCBiKSB7XG4gICAgY29uc3QgYklzTnVtZXJpYyA9IGlzTnVtZXJpYyhiKTtcbiAgICBpZiAoaXNOdW1lcmljKGEpKSB7XG4gICAgICAgIGlmIChiSXNOdW1lcmljKSB7XG4gICAgICAgICAgICBjb25zdCBhTiA9IE51bWJlcihhKTtcbiAgICAgICAgICAgIGNvbnN0IGJOID0gTnVtYmVyKGIpO1xuICAgICAgICAgICAgcmV0dXJuIGFOID4gYk4gPyAxIDogYU4gPCBiTiA/IC0xIDogMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGlmIChiSXNOdW1lcmljKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBjb25zdCBhSXNCb29sID0gdHlwZW9mIGEgPT09ICdib29sZWFuJztcbiAgICBpZiAoYUlzQm9vbCAhPT0gKHR5cGVvZiBiID09PSAnYm9vbGVhbicpKSB7XG4gICAgICAgIHJldHVybiBhSXNCb29sID8gLTEgOiAxO1xuICAgIH1cbiAgICByZXR1cm4gYSA+IGIgPyAxIDogYSA8IGIgPyAtMSA6IDA7XG59XG5cbi8qXG4gKiBQcm92aWRlIGEgdmFsdWUga25vd24gdG8gYmUgYmVmb3JlIG9yIGFmdGVyIHYsIGFjY29yZGluZyB0byBpZFZhbFNvcnRcbiAqL1xuY29uc3QgdmFsQmVmb3JlID0gdiA9PiAoaXNOdW1lcmljKHYpID8gdiAtIDEgOiAwKTtcbmNvbnN0IHZhbEFmdGVyID0gdiA9PiAodHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdiArICd6JyA6ICd6Jyk7XG5cbmZ1bmN0aW9uIGFkZE1hcChkZXBNYXAsIGlkLCBwcm9wLCBkZXBlbmRlbmN5KSB7XG4gICAgY29uc3QgaWRNYXAgPSAoZGVwTWFwW2lkXSA9IGRlcE1hcFtpZF0gfHwge30pO1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IChpZE1hcFtwcm9wXSA9IGlkTWFwW3Byb3BdIHx8IFtdKTtcbiAgICBjYWxsYmFja3MucHVzaChkZXBlbmRlbmN5KTtcbn1cblxuZnVuY3Rpb24gYWRkUGF0dGVybihkZXBNYXAsIGlkU3BlYywgcHJvcCwgZGVwZW5kZW5jeSkge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpZFNwZWMpLnNvcnQoKTtcbiAgICBjb25zdCBrZXlTdHIgPSBrZXlzLmpvaW4oJywnKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBwcm9wcyhrZXlzLCBpZFNwZWMpO1xuICAgIGNvbnN0IGtleUNhbGxiYWNrcyA9IChkZXBNYXBba2V5U3RyXSA9IGRlcE1hcFtrZXlTdHJdIHx8IHt9KTtcbiAgICBjb25zdCBwcm9wQ2FsbGJhY2tzID0gKGtleUNhbGxiYWNrc1twcm9wXSA9IGtleUNhbGxiYWNrc1twcm9wXSB8fCBbXSk7XG4gICAgbGV0IHZhbE1hdGNoID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wQ2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChlcXVhbHModmFsdWVzLCBwcm9wQ2FsbGJhY2tzW2ldLnZhbHVlcykpIHtcbiAgICAgICAgICAgIHZhbE1hdGNoID0gcHJvcENhbGxiYWNrc1tpXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghdmFsTWF0Y2gpIHtcbiAgICAgICAgdmFsTWF0Y2ggPSB7a2V5cywgdmFsdWVzLCBjYWxsYmFja3M6IFtdfTtcbiAgICAgICAgcHJvcENhbGxiYWNrcy5wdXNoKHZhbE1hdGNoKTtcbiAgICB9XG4gICAgdmFsTWF0Y2guY2FsbGJhY2tzLnB1c2goZGVwZW5kZW5jeSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRGVwZW5kZW5jaWVzKHBhcnNlZERlcGVuZGVuY2llcywgZGlzcGF0Y2hFcnJvcikge1xuICAgIGNvbnN0IG91dFN0cnMgPSB7fTtcbiAgICBjb25zdCBvdXRPYmpzID0gW107XG5cbiAgICBwYXJzZWREZXBlbmRlbmNpZXMuZm9yRWFjaChkZXAgPT4ge1xuICAgICAgICBjb25zdCB7aW5wdXRzLCBvdXRwdXRzLCBzdGF0ZSwgZm9yY2Vfbm9fb3V0cHV0fSA9IGRlcDtcbiAgICAgICAgbGV0IGhhc091dHB1dHMgPSB0cnVlO1xuICAgICAgICBpZiAob3V0cHV0cy5sZW5ndGggPT09IDEgJiYgIW91dHB1dHNbMF0uaWQgJiYgIW91dHB1dHNbMF0ucHJvcGVydHkpIHtcbiAgICAgICAgICAgIGhhc091dHB1dHMgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICghZm9yY2Vfbm9fb3V0cHV0KSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignQSBjYWxsYmFjayBpcyBtaXNzaW5nIE91dHB1dHMnLCBbXG4gICAgICAgICAgICAgICAgICAgICdQbGVhc2UgcHJvdmlkZSBhbiBvdXRwdXQgZm9yIHRoaXMgY2FsbGJhY2s6JyxcbiAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZGVwLCBudWxsLCAyKVxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGVhZCA9XG4gICAgICAgICAgICAnSW4gdGhlIGNhbGxiYWNrIGZvciBvdXRwdXQocyk6XFxuICAnICtcbiAgICAgICAgICAgIG91dHB1dHMubWFwKGNvbWJpbmVJZEFuZFByb3ApLmpvaW4oJ1xcbiAgJyk7XG5cbiAgICAgICAgaWYgKCFpbnB1dHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdBIGNhbGxiYWNrIGlzIG1pc3NpbmcgSW5wdXRzJywgW1xuICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgJ3RoZXJlIGFyZSBubyBgSW5wdXRgIGVsZW1lbnRzLicsXG4gICAgICAgICAgICAgICAgJ1dpdGhvdXQgYElucHV0YCBlbGVtZW50cywgaXQgd2lsbCBuZXZlciBnZXQgY2FsbGVkLicsXG4gICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgJ1N1YnNjcmliaW5nIHRvIGBJbnB1dGAgY29tcG9uZW50cyB3aWxsIGNhdXNlIHRoZScsXG4gICAgICAgICAgICAgICAgJ2NhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuZXZlciB0aGVpciB2YWx1ZXMgY2hhbmdlLidcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3BlYyA9IFtcbiAgICAgICAgICAgIFtvdXRwdXRzLCAnT3V0cHV0J10sXG4gICAgICAgICAgICBbaW5wdXRzLCAnSW5wdXQnXSxcbiAgICAgICAgICAgIFtzdGF0ZSwgJ1N0YXRlJ11cbiAgICAgICAgXTtcbiAgICAgICAgc3BlYy5mb3JFYWNoKChbYXJncywgY2xzXSkgPT4ge1xuICAgICAgICAgICAgaWYgKGNscyA9PT0gJ091dHB1dCcgJiYgIWhhc091dHB1dHMpIHtcbiAgICAgICAgICAgICAgICAvLyBqdXN0IGEgcXVpcmsgb2YgaG93IHdlIHBhc3MgJiBwYXJzZSBvdXRwdXRzIC0gaWYgeW91IGRvbid0XG4gICAgICAgICAgICAgICAgLy8gcHJvdmlkZSBvbmUsIGl0IGxvb2tzIGxpa2UgYSBzaW5nbGUgYmxhbmsgb3V0cHV0LiBUaGlzIGlzXG4gICAgICAgICAgICAgICAgLy8gYWN0dWFsbHkgdXNlZnVsIGZvciBncmFjZWZ1bCBmYWlsdXJlLCBzbyB3ZSB3b3JrIGFyb3VuZCBpdC5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcmdzKSkge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoYENhbGxiYWNrICR7Y2xzfShzKSBtdXN0IGJlIGFuIEFycmF5YCwgW1xuICAgICAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgICAgICBgRm9yICR7Y2xzfShzKSB3ZSBmb3VuZDpgLFxuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShhcmdzKSxcbiAgICAgICAgICAgICAgICAgICAgJ2J1dCB3ZSBleHBlY3RlZCBhbiBBcnJheS4nXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhcmdzLmZvckVhY2goKGlkUHJvcCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIHZhbGlkYXRlQXJnKGlkUHJvcCwgaGVhZCwgY2xzLCBpLCBkaXNwYXRjaEVycm9yLCBmb3JjZV9ub19vdXRwdXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZpbmREdXBsaWNhdGVPdXRwdXRzKG91dHB1dHMsIGhlYWQsIGRpc3BhdGNoRXJyb3IsIG91dFN0cnMsIG91dE9ianMpO1xuICAgICAgICBpZiAoIWZvcmNlX25vX291dHB1dCkge1xuICAgICAgICAgICAgZmluZE1pc21hdGNoZWRXaWxkY2FyZHMob3V0cHV0cywgaW5wdXRzLCBzdGF0ZSwgaGVhZCwgZGlzcGF0Y2hFcnJvcik7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBcmcoe2lkLCBwcm9wZXJ0eX0sIGhlYWQsIGNscywgaSwgZGlzcGF0Y2hFcnJvciwgZm9yY2Vfbm9fb3V0cHV0KSB7XG4gICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSAhPT0gJ3N0cmluZycgfHwgIXByb3BlcnR5KSB7XG4gICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIHByb3BlcnR5IGVycm9yJywgW1xuICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgIGAke2Nsc31bJHtpfV0ucHJvcGVydHkgPSAke0pTT04uc3RyaW5naWZ5KHByb3BlcnR5KX1gLFxuICAgICAgICAgICAgJ2J1dCB3ZSBleHBlY3RlZCBgcHJvcGVydHlgIHRvIGJlIGEgbm9uLWVtcHR5IHN0cmluZy4nXG4gICAgICAgIF0pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChpc0VtcHR5KGlkKSAmJiAhZm9yY2Vfbm9fb3V0cHV0KSB7XG4gICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayBpdGVtIG1pc3NpbmcgSUQnLCBbXG4gICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICBgJHtjbHN9WyR7aX1dLmlkID0ge31gLFxuICAgICAgICAgICAgICAgICdFdmVyeSBpdGVtIGxpbmtlZCB0byBhIGNhbGxiYWNrIG5lZWRzIGFuIElEJ1xuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JFYWNoT2JqSW5kZXhlZCgodiwgaykgPT4ge1xuICAgICAgICAgICAgaWYgKCFrKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignQ2FsbGJhY2sgd2lsZGNhcmQgSUQgZXJyb3InLCBbXG4gICAgICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWQgaGFzIGtleSBcIiR7a31cImAsXG4gICAgICAgICAgICAgICAgICAgICdLZXlzIG11c3QgYmUgbm9uLWVtcHR5IHN0cmluZ3MuJ1xuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYud2lsZCkge1xuICAgICAgICAgICAgICAgIGlmIChhbGxvd2VkV2lsZGNhcmRzW2Nsc11bdi53aWxkXSAhPT0gdikge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayB3aWxkY2FyZCBJRCBlcnJvcicsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtjbHN9WyR7aX1dLmlkW1wiJHtrfVwiXSA9ICR7di53aWxkfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBgQWxsb3dlZCB3aWxkY2FyZHMgZm9yICR7Y2xzfXMgYXJlOmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzKGFsbG93ZWRXaWxkY2FyZHNbY2xzXSkuam9pbignLCAnKVxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpbmNsdWRlcyh0eXBlb2Ygdiwgd2lsZGNhcmRWYWxUeXBlcykpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayB3aWxkY2FyZCBJRCBlcnJvcicsIFtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgYCR7Y2xzfVske2l9XS5pZFtcIiR7a31cIl0gPSAke0pTT04uc3RyaW5naWZ5KHYpfWAsXG4gICAgICAgICAgICAgICAgICAgICdXaWxkY2FyZCBjYWxsYmFjayBJRCB2YWx1ZXMgbXVzdCBiZSBlaXRoZXIgd2lsZGNhcmRzJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yIGNvbnN0YW50cyBvZiBvbmUgb2YgdGhlc2UgdHlwZXM6JyxcbiAgICAgICAgICAgICAgICAgICAgd2lsZGNhcmRWYWxUeXBlcy5qb2luKCcsICcpXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGlkKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKCFpZCAmJiAhZm9yY2Vfbm9fb3V0cHV0KSB7XG4gICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayBpdGVtIG1pc3NpbmcgSUQnLCBbXG4gICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICBgJHtjbHN9WyR7aX1dLmlkID0gXCIke2lkfVwiYCxcbiAgICAgICAgICAgICAgICAnRXZlcnkgaXRlbSBsaW5rZWQgdG8gYSBjYWxsYmFjayBuZWVkcyBhbiBJRCdcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGludmFsaWRDaGFycyA9IGlkSW52YWxpZENoYXJzLmZpbHRlcihjID0+IGluY2x1ZGVzKGMsIGlkKSk7XG4gICAgICAgIGlmIChpbnZhbGlkQ2hhcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayBpbnZhbGlkIElEIHN0cmluZycsIFtcbiAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWQgPSAnJHtpZH0nYCxcbiAgICAgICAgICAgICAgICBgY2hhcmFjdGVycyAnJHtpbnZhbGlkQ2hhcnMuam9pbihcIicsICdcIil9JyBhcmUgbm90IGFsbG93ZWQuYFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayBJRCB0eXBlIGVycm9yJywgW1xuICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWQgPSAke0pTT04uc3RyaW5naWZ5KGlkKX1gLFxuICAgICAgICAgICAgJ0lEcyBtdXN0IGJlIHN0cmluZ3Mgb3Igd2lsZGNhcmQtY29tcGF0aWJsZSBvYmplY3RzLidcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBmaW5kRHVwbGljYXRlT3V0cHV0cyhvdXRwdXRzLCBoZWFkLCBkaXNwYXRjaEVycm9yLCBvdXRTdHJzLCBvdXRPYmpzKSB7XG4gICAgY29uc3QgbmV3T3V0cHV0U3RycyA9IHt9O1xuICAgIGNvbnN0IG5ld091dHB1dE9ianMgPSBbXTtcbiAgICBvdXRwdXRzLmZvckVhY2goKHtpZCwgcHJvcGVydHl9LCBpKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBpZFByb3AgPSBjb21iaW5lSWRBbmRQcm9wKHtpZCwgcHJvcGVydHl9KTtcbiAgICAgICAgICAgIGlmIChuZXdPdXRwdXRTdHJzW2lkUHJvcF0pIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdEdXBsaWNhdGUgY2FsbGJhY2sgT3V0cHV0cycsIFtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgYE91dHB1dCAke2l9ICgke2lkUHJvcH0pIGlzIGFscmVhZHkgdXNlZCBieSB0aGlzIGNhbGxiYWNrLmBcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0U3Ryc1tpZFByb3BdKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignRHVwbGljYXRlIGNhbGxiYWNrIG91dHB1dHMnLCBbXG4gICAgICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgICAgIGBPdXRwdXQgJHtpfSAoJHtpZFByb3B9KSBpcyBhbHJlYWR5IGluIHVzZS5gLFxuICAgICAgICAgICAgICAgICAgICAnVG8gcmVzb2x2ZSB0aGlzLCBzZXQgYGFsbG93X2R1cGxpY2F0ZT1UcnVlYCBvbicsXG4gICAgICAgICAgICAgICAgICAgICdkdXBsaWNhdGUgb3V0cHV0cywgb3IgY29tYmluZSB0aGUgb3V0cHV0cyBpbnRvJyxcbiAgICAgICAgICAgICAgICAgICAgJ29uZSBjYWxsYmFjayBmdW5jdGlvbiwgZGlzdGluZ3Vpc2hpbmcgdGhlIHRyaWdnZXInLFxuICAgICAgICAgICAgICAgICAgICAnYnkgdXNpbmcgYGRhc2guY2FsbGJhY2tfY29udGV4dGAgaWYgbmVjZXNzYXJ5LidcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3T3V0cHV0U3Ryc1tpZFByb3BdID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGlkT2JqID0ge2lkLCBwcm9wZXJ0eX07XG4gICAgICAgICAgICBjb25zdCBzZWxmT3ZlcmxhcCA9IHdpbGRjYXJkT3ZlcmxhcChpZE9iaiwgbmV3T3V0cHV0T2Jqcyk7XG4gICAgICAgICAgICBjb25zdCBvdGhlck92ZXJsYXAgPSBzZWxmT3ZlcmxhcCB8fCB3aWxkY2FyZE92ZXJsYXAoaWRPYmosIG91dE9ianMpO1xuICAgICAgICAgICAgaWYgKHNlbGZPdmVybGFwIHx8IG90aGVyT3ZlcmxhcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkUHJvcCA9IGNvbWJpbmVJZEFuZFByb3AoaWRPYmopO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkUHJvcDIgPSBjb21iaW5lSWRBbmRQcm9wKHNlbGZPdmVybGFwIHx8IG90aGVyT3ZlcmxhcCk7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignT3ZlcmxhcHBpbmcgd2lsZGNhcmQgY2FsbGJhY2sgb3V0cHV0cycsIFtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgYE91dHB1dCAke2l9ICgke2lkUHJvcH0pYCxcbiAgICAgICAgICAgICAgICAgICAgYG92ZXJsYXBzIGFub3RoZXIgb3V0cHV0ICgke2lkUHJvcDJ9KWAsXG4gICAgICAgICAgICAgICAgICAgIGB1c2VkIGluICR7c2VsZk92ZXJsYXAgPyAndGhpcycgOiAnYSBkaWZmZXJlbnQnfSBjYWxsYmFjay5gXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld091dHB1dE9ianMucHVzaChpZE9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBrZXlzKG5ld091dHB1dFN0cnMpLmZvckVhY2goayA9PiB7XG4gICAgICAgIG91dFN0cnNba10gPSAxO1xuICAgIH0pO1xuICAgIG5ld091dHB1dE9ianMuZm9yRWFjaChpZE9iaiA9PiB7XG4gICAgICAgIG91dE9ianMucHVzaChpZE9iaik7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSW5PdXRPdmVybGFwKG91dCwgaW5wdXRzKSB7XG4gICAgY29uc3Qge2lkOiBvdXRJZCwgcHJvcGVydHk6IG91dFByb3B9ID0gb3V0O1xuICAgIHJldHVybiBpbnB1dHMuc29tZShpbl8gPT4ge1xuICAgICAgICBjb25zdCB7aWQ6IGluSWQsIHByb3BlcnR5OiBpblByb3B9ID0gaW5fO1xuICAgICAgICBpZiAob3V0UHJvcCAhPT0gaW5Qcm9wIHx8IHR5cGVvZiBvdXRJZCAhPT0gdHlwZW9mIGluSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG91dElkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKG91dElkID09PSBpbklkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2lsZGNhcmRPdmVybGFwKGluXywgW291dF0pKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRNaXNtYXRjaGVkV2lsZGNhcmRzKG91dHB1dHMsIGlucHV0cywgc3RhdGUsIGhlYWQsIGRpc3BhdGNoRXJyb3IpIHtcbiAgICBjb25zdCB7bWF0Y2hLZXlzOiBvdXQwTWF0Y2hLZXlzfSA9IGZpbmRXaWxkY2FyZEtleXMob3V0cHV0c1swXS5pZCk7XG4gICAgb3V0cHV0cy5mb3JFYWNoKChvdXQsIGkpID0+IHtcbiAgICAgICAgaWYgKGkgJiYgIWVxdWFscyhmaW5kV2lsZGNhcmRLZXlzKG91dC5pZCkubWF0Y2hLZXlzLCBvdXQwTWF0Y2hLZXlzKSkge1xuICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignTWlzbWF0Y2hlZCBgTUFUQ0hgIHdpbGRjYXJkcyBhY3Jvc3MgYE91dHB1dGBzJywgW1xuICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgYE91dHB1dCAke2l9ICgke2NvbWJpbmVJZEFuZFByb3Aob3V0KX0pYCxcbiAgICAgICAgICAgICAgICAnZG9lcyBub3QgaGF2ZSBNQVRDSCB3aWxkY2FyZHMgb24gdGhlIHNhbWUga2V5cyBhcycsXG4gICAgICAgICAgICAgICAgYE91dHB1dCAwICgke2NvbWJpbmVJZEFuZFByb3Aob3V0cHV0c1swXSl9KS5gLFxuICAgICAgICAgICAgICAgICdNQVRDSCB3aWxkY2FyZHMgbXVzdCBiZSBvbiB0aGUgc2FtZSBrZXlzIGZvciBhbGwgT3V0cHV0cy4nLFxuICAgICAgICAgICAgICAgICdBTEwgd2lsZGNhcmRzIG5lZWQgbm90IG1hdGNoLCBvbmx5IE1BVENILidcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgW1xuICAgICAgICBbaW5wdXRzLCAnSW5wdXQnXSxcbiAgICAgICAgW3N0YXRlLCAnU3RhdGUnXVxuICAgIF0uZm9yRWFjaCgoW2FyZ3MsIGNsc10pID0+IHtcbiAgICAgICAgYXJncy5mb3JFYWNoKChhcmcsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHttYXRjaEtleXMsIGFsbHNtYWxsZXJLZXlzfSA9IGZpbmRXaWxkY2FyZEtleXMoYXJnLmlkKTtcbiAgICAgICAgICAgIGNvbnN0IGFsbFdpbGRjYXJkS2V5cyA9IG1hdGNoS2V5cy5jb25jYXQoYWxsc21hbGxlcktleXMpO1xuICAgICAgICAgICAgY29uc3QgZGlmZiA9IGRpZmZlcmVuY2UoYWxsV2lsZGNhcmRLZXlzLCBvdXQwTWF0Y2hLZXlzKTtcbiAgICAgICAgICAgIGlmIChkaWZmLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGRpZmYuc29ydCgpO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ2BJbnB1dGAgLyBgU3RhdGVgIHdpbGRjYXJkcyBub3QgaW4gYE91dHB1dGBzJywgW1xuICAgICAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgICAgICBgJHtjbHN9ICR7aX0gKCR7Y29tYmluZUlkQW5kUHJvcChhcmcpfSlgLFxuICAgICAgICAgICAgICAgICAgICBgaGFzIE1BVENIIG9yIEFMTFNNQUxMRVIgb24ga2V5KHMpICR7ZGlmZi5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICAgICAgICAgIGB3aGVyZSBPdXRwdXQgMCAoJHtjb21iaW5lSWRBbmRQcm9wKG91dHB1dHNbMF0pfSlgLFxuICAgICAgICAgICAgICAgICAgICAnZG9lcyBub3QgaGF2ZSBhIE1BVENIIHdpbGRjYXJkLiBJbnB1dHMgYW5kIFN0YXRlIGRvIG5vdCcsXG4gICAgICAgICAgICAgICAgICAgICduZWVkIGV2ZXJ5IE1BVENIIGZyb20gdGhlIE91dHB1dChzKSwgYnV0IHRoZXkgY2Fubm90IGhhdmUnLFxuICAgICAgICAgICAgICAgICAgICAnZXh0cmFzIGJleW9uZCB0aGUgT3V0cHV0KHMpLidcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbmNvbnN0IG1hdGNoV2lsZEtleXMgPSAoW2EsIGJdKSA9PiB7XG4gICAgY29uc3QgYVdpbGQgPSBhICYmIGEud2lsZDtcbiAgICBjb25zdCBiV2lsZCA9IGIgJiYgYi53aWxkO1xuICAgIGlmIChhV2lsZCAmJiBiV2lsZCkge1xuICAgICAgICAvLyBFdmVyeSB3aWxkY2FyZCBjb21iaW5hdGlvbiBvdmVybGFwcyBleGNlcHQgTUFUQ0g8LT5BTExTTUFMTEVSXG4gICAgICAgIHJldHVybiAhKFxuICAgICAgICAgICAgKGEgPT09IE1BVENIICYmIGIgPT09IEFMTFNNQUxMRVIpIHx8XG4gICAgICAgICAgICAoYSA9PT0gQUxMU01BTExFUiAmJiBiID09PSBNQVRDSClcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGEgPT09IGIgfHwgYVdpbGQgfHwgYldpbGQ7XG59O1xuXG5mdW5jdGlvbiB3aWxkY2FyZE92ZXJsYXAoe2lkLCBwcm9wZXJ0eX0sIG9ianMpIHtcbiAgICBjb25zdCBpZEtleXMgPSBrZXlzKGlkKS5zb3J0KCk7XG4gICAgY29uc3QgaWRWYWxzID0gcHJvcHMoaWRLZXlzLCBpZCk7XG4gICAgZm9yIChjb25zdCBvYmogb2Ygb2Jqcykge1xuICAgICAgICBjb25zdCB7aWQ6IGlkMiwgcHJvcGVydHk6IHByb3BlcnR5Mn0gPSBvYmo7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHByb3BlcnR5MiA9PT0gcHJvcGVydHkgJiZcbiAgICAgICAgICAgIHR5cGVvZiBpZDIgIT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICBlcXVhbHMoa2V5cyhpZDIpLnNvcnQoKSwgaWRLZXlzKSAmJlxuICAgICAgICAgICAgYWxsKG1hdGNoV2lsZEtleXMsIHppcChpZFZhbHMsIHByb3BzKGlkS2V5cywgaWQyKSkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNhbGxiYWNrc1RvTGF5b3V0KHN0YXRlXywgZGlzcGF0Y2hFcnJvcikge1xuICAgIGNvbnN0IHtjb25maWcsIGdyYXBocywgbGF5b3V0OiBsYXlvdXRfLCBwYXRoczogcGF0aHNffSA9IHN0YXRlXztcbiAgICBjb25zdCB2YWxpZGF0ZUlkcyA9ICFjb25maWcuc3VwcHJlc3NfY2FsbGJhY2tfZXhjZXB0aW9ucztcbiAgICBsZXQgbGF5b3V0LCBwYXRocztcbiAgICBpZiAodmFsaWRhdGVJZHMgJiYgY29uZmlnLnZhbGlkYXRpb25fbGF5b3V0KSB7XG4gICAgICAgIGxheW91dCA9IGNvbmZpZy52YWxpZGF0aW9uX2xheW91dDtcbiAgICAgICAgcGF0aHMgPSBjb21wdXRlUGF0aHMobGF5b3V0LCBbXSwgbnVsbCwgcGF0aHNfLmV2ZW50cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGF5b3V0ID0gbGF5b3V0XztcbiAgICAgICAgcGF0aHMgPSBwYXRoc187XG4gICAgfVxuICAgIGNvbnN0IHtvdXRwdXRNYXAsIGlucHV0TWFwLCBvdXRwdXRQYXR0ZXJucywgaW5wdXRQYXR0ZXJuc30gPSBncmFwaHM7XG5cbiAgICBmdW5jdGlvbiB0YWlsKGNhbGxiYWNrcykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgJ1RoaXMgSUQgd2FzIHVzZWQgaW4gdGhlIGNhbGxiYWNrKHMpIGZvciBPdXRwdXQocyk6XFxuICAnICtcbiAgICAgICAgICAgIGNhbGxiYWNrc1xuICAgICAgICAgICAgICAgIC5tYXAoKHtvdXRwdXRzfSkgPT4gb3V0cHV0cy5tYXAoY29tYmluZUlkQW5kUHJvcCkuam9pbignLCAnKSlcbiAgICAgICAgICAgICAgICAuam9pbignXFxuICAnKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1pc3NpbmdJZChpZCwgY2xzLCBjYWxsYmFja3MpIHtcbiAgICAgICAgZGlzcGF0Y2hFcnJvcignSUQgbm90IGZvdW5kIGluIGxheW91dCcsIFtcbiAgICAgICAgICAgIGBBdHRlbXB0aW5nIHRvIGNvbm5lY3QgYSBjYWxsYmFjayAke2Nsc30gaXRlbSB0byBjb21wb25lbnQ6YCxcbiAgICAgICAgICAgIGAgIFwiJHtzdHJpbmdpZnlJZChpZCl9XCJgLFxuICAgICAgICAgICAgJ2J1dCBubyBjb21wb25lbnRzIHdpdGggdGhhdCBpZCBleGlzdCBpbiB0aGUgbGF5b3V0LicsXG4gICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICdJZiB5b3UgYXJlIGFzc2lnbmluZyBjYWxsYmFja3MgdG8gY29tcG9uZW50cyB0aGF0IGFyZScsXG4gICAgICAgICAgICAnZ2VuZXJhdGVkIGJ5IG90aGVyIGNhbGxiYWNrcyAoYW5kIHRoZXJlZm9yZSBub3QgaW4gdGhlJyxcbiAgICAgICAgICAgICdpbml0aWFsIGxheW91dCksIHlvdSBjYW4gc3VwcHJlc3MgdGhpcyBleGNlcHRpb24gYnkgc2V0dGluZycsXG4gICAgICAgICAgICAnYHN1cHByZXNzX2NhbGxiYWNrX2V4Y2VwdGlvbnM9VHJ1ZWAuJyxcbiAgICAgICAgICAgIHRhaWwoY2FsbGJhY2tzKVxuICAgICAgICBdKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZVByb3AoaWQsIGlkUGF0aCwgcmF3UHJvcCwgY2xzLCBjYWxsYmFja3MpIHtcbiAgICAgICAgY29uc3QgcHJvcCA9IHJhd1Byb3Auc3BsaXQoJ0AnKVswXTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gcGF0aChpZFBhdGgsIGxheW91dCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBSZWdpc3RyeS5yZXNvbHZlKGNvbXBvbmVudCk7XG5cbiAgICAgICAgLy8gbm90ZTogRmxvdyBjb21wb25lbnRzIGRvIG5vdCBoYXZlIHByb3BUeXBlcywgc28gd2UgY2FuJ3QgdmFsaWRhdGUuXG4gICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQucHJvcFR5cGVzICYmICFlbGVtZW50LnByb3BUeXBlc1twcm9wXSkge1xuICAgICAgICAgICAgLy8gbG9vayBmb3Igd2lsZGNhcmQgcHJvcHMgKGllIGRhdGEtKiBldGMpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BOYW1lIGluIGVsZW1lbnQucHJvcFR5cGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdCA9IHByb3BOYW1lLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZS5jaGFyQXQobGFzdCkgPT09ICcqJyAmJlxuICAgICAgICAgICAgICAgICAgICBwcm9wLnN1YnN0cigwLCBsYXN0KSA9PT0gcHJvcE5hbWUuc3Vic3RyKDAsIGxhc3QpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7dHlwZSwgbmFtZXNwYWNlfSA9IGNvbXBvbmVudDtcbiAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0ludmFsaWQgcHJvcCBmb3IgdGhpcyBjb21wb25lbnQnLCBbXG4gICAgICAgICAgICAgICAgYFByb3BlcnR5IFwiJHtwcm9wfVwiIHdhcyB1c2VkIHdpdGggY29tcG9uZW50IElEOmAsXG4gICAgICAgICAgICAgICAgYCAgJHtKU09OLnN0cmluZ2lmeShpZCl9YCxcbiAgICAgICAgICAgICAgICBgaW4gb25lIG9mIHRoZSAke2Nsc30gaXRlbXMgb2YgYSBjYWxsYmFjay5gLFxuICAgICAgICAgICAgICAgIGBUaGlzIElEIGlzIGFzc2lnbmVkIHRvIGEgJHtuYW1lc3BhY2V9LiR7dHlwZX0gY29tcG9uZW50YCxcbiAgICAgICAgICAgICAgICAnaW4gdGhlIGxheW91dCwgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHByb3BlcnR5LicsXG4gICAgICAgICAgICAgICAgdGFpbChjYWxsYmFja3MpXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlSWRQYXR0ZXJuUHJvcChpZCwgcHJvcGVydHksIGNscywgY2FsbGJhY2tzKSB7XG4gICAgICAgIHJlc29sdmVEZXBzKCkocGF0aHMpKHtpZCwgcHJvcGVydHl9KS5mb3JFYWNoKGRlcCA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aWQ6IGlkUmVzb2x2ZWQsIHBhdGg6IGlkUGF0aH0gPSBkZXA7XG4gICAgICAgICAgICB2YWxpZGF0ZVByb3AoaWRSZXNvbHZlZCwgaWRQYXRoLCBwcm9wZXJ0eSwgY2xzLCBjYWxsYmFja3MpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBjYWxsYmFja0lkc0NoZWNrZWRGb3JTdGF0ZSA9IHt9O1xuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVTdGF0ZShjYWxsYmFjaykge1xuICAgICAgICBjb25zdCB7c3RhdGUsIG91dHB1dH0gPSBjYWxsYmFjaztcblxuICAgICAgICAvLyBlbnN1cmUgd2UgZG9uJ3QgY2hlY2sgdGhlIHNhbWUgY2FsbGJhY2sgZm9yIHN0YXRlIG11bHRpcGxlIHRpbWVzXG4gICAgICAgIGlmIChjYWxsYmFja0lkc0NoZWNrZWRGb3JTdGF0ZVtvdXRwdXRdKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2tJZHNDaGVja2VkRm9yU3RhdGVbb3V0cHV0XSA9IDE7XG5cbiAgICAgICAgY29uc3QgY2xzID0gJ1N0YXRlJztcblxuICAgICAgICBzdGF0ZS5mb3JFYWNoKCh7aWQsIHByb3BlcnR5fSkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZFBhdGggPSBnZXRQYXRoKHBhdGhzLCBpZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFpZFBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlSWRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nSWQoaWQsIGNscywgW2NhbGxiYWNrXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVByb3AoaWQsIGlkUGF0aCwgcHJvcGVydHksIGNscywgW2NhbGxiYWNrXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gT25seSB2YWxpZGF0ZSBwcm9wcyBmb3IgU3RhdGUgb2JqZWN0IGlkcyB0aGF0IHdlIGRvbid0IG5lZWQgdG9cbiAgICAgICAgICAgIC8vIHJlc29sdmUgdGhlbSB0byBzcGVjaWZpYyBpbnB1dHMgb3Igb3V0cHV0c1xuICAgICAgICAgICAgZWxzZSBpZiAoIWludGVyc2VjdGlvbihbTUFUQ0gsIEFMTFNNQUxMRVJdLCB2YWx1ZXMoaWQpKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZUlkUGF0dGVyblByb3AoaWQsIHByb3BlcnR5LCBjbHMsIFtjYWxsYmFja10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZU1hcChtYXAsIGNscywgZG9TdGF0ZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIG1hcCkge1xuICAgICAgICAgICAgY29uc3QgaWRQcm9wcyA9IG1hcFtpZF07XG4gICAgICAgICAgICBjb25zdCBpZFBhdGggPSBnZXRQYXRoKHBhdGhzLCBpZCk7XG4gICAgICAgICAgICBpZiAoIWlkUGF0aCkge1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZUlkcykge1xuICAgICAgICAgICAgICAgICAgICBtaXNzaW5nSWQoaWQsIGNscywgZmxhdHRlbih2YWx1ZXMoaWRQcm9wcykpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gaWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFja3MgPSBpZFByb3BzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVQcm9wKGlkLCBpZFBhdGgsIHByb3BlcnR5LCBjbHMsIGNhbGxiYWNrcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb1N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCB3b3VsZCBiZSByZWR1bmRhbnQgdG8gY2hlY2sgc3RhdGUgb24gYm90aCBpbnB1dHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBvdXRwdXRzIC0gc28gb25seSBzZXQgZG9TdGF0ZSBmb3Igb3V0cHV0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKHZhbGlkYXRlU3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFsaWRhdGVNYXAob3V0cHV0TWFwLCAnT3V0cHV0JywgdHJ1ZSk7XG4gICAgdmFsaWRhdGVNYXAoaW5wdXRNYXAsICdJbnB1dCcpO1xuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVQYXR0ZXJucyhwYXR0ZXJucywgY2xzLCBkb1N0YXRlKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5U3RyIGluIHBhdHRlcm5zKSB7XG4gICAgICAgICAgICBjb25zdCBrZXlQYXR0ZXJucyA9IHBhdHRlcm5zW2tleVN0cl07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGtleVBhdHRlcm5zKSB7XG4gICAgICAgICAgICAgICAga2V5UGF0dGVybnNbcHJvcGVydHldLmZvckVhY2goKHtrZXlzLCB2YWx1ZXMsIGNhbGxiYWNrc30pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSB6aXBPYmooa2V5cywgdmFsdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVJZFBhdHRlcm5Qcm9wKGlkLCBwcm9wZXJ0eSwgY2xzLCBjYWxsYmFja3MpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9TdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmZvckVhY2godmFsaWRhdGVTdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhbGlkYXRlUGF0dGVybnMob3V0cHV0UGF0dGVybnMsICdPdXRwdXQnLCB0cnVlKTtcbiAgICB2YWxpZGF0ZVBhdHRlcm5zKGlucHV0UGF0dGVybnMsICdJbnB1dCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUdyYXBocyhkZXBlbmRlbmNpZXMsIGRpc3BhdGNoRXJyb3IpIHtcbiAgICAvLyBtdWx0aUdyYXBoIGlzIGp1c3QgZm9yIGZpbmRpbmcgY2lyY3VsYXIgZGVwc1xuICAgIGNvbnN0IG11bHRpR3JhcGggPSBuZXcgRGVwR3JhcGgoKTtcblxuICAgIGNvbnN0IHdpbGRjYXJkUGxhY2Vob2xkZXJzID0ge307XG5cbiAgICBjb25zdCBmaXhJZHMgPSBtYXAoZXZvbHZlKHtpZDogcGFyc2VJZldpbGRjYXJkfSkpO1xuICAgIGNvbnN0IHBhcnNlZERlcGVuZGVuY2llcyA9IG1hcChkZXAgPT4ge1xuICAgICAgICBjb25zdCB7b3V0cHV0LCBmb3JjZV9ub19vdXRwdXR9ID0gZGVwO1xuICAgICAgICBjb25zdCBvdXQgPSBldm9sdmUoe2lucHV0czogZml4SWRzLCBzdGF0ZTogZml4SWRzfSwgZGVwKTtcbiAgICAgICAgaWYoIWZvcmNlX25vX291dHB1dCl7XG4gICAgICAgICAgICBvdXQub3V0cHV0cyA9IG1hcChcbiAgICAgICAgICAgICAgICBvdXRpID0+IGFzc29jKCdvdXQnLCB0cnVlLCBzcGxpdElkQW5kUHJvcChvdXRpKSksXG4gICAgICAgICAgICAgICAgaXNNdWx0aU91dHB1dFByb3Aob3V0cHV0KSA/IHBhcnNlTXVsdGlwbGVPdXRwdXRzKG91dHB1dCkgOiBbb3V0cHV0XVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dC5vdXRwdXRzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9LCBkZXBlbmRlbmNpZXMpO1xuXG4gICAgbGV0IGhhc0Vycm9yID0gZmFsc2U7XG4gICAgY29uc3Qgd3JhcHBlZERFID0gKG1lc3NhZ2UsIGxpbmVzKSA9PiB7XG4gICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgZGlzcGF0Y2hFcnJvcihtZXNzYWdlLCBsaW5lcyk7XG4gICAgfTtcbiAgICB2YWxpZGF0ZURlcGVuZGVuY2llcyhwYXJzZWREZXBlbmRlbmNpZXMsIHdyYXBwZWRERSk7XG5cbiAgICAvKlxuICAgICAqIEZvciByZWd1bGFyIGlkcywgb3V0cHV0TWFwIGFuZCBpbnB1dE1hcCBhcmU6XG4gICAgICogICB7W2lkXToge1twcm9wXTogW2NhbGxiYWNrLCAuLi5dfX1cbiAgICAgKiB3aGVyZSBjYWxsYmFja3MgYXJlIHRoZSBtYXRjaGluZyBzcGVjcyBmcm9tIHRoZSBvcmlnaW5hbFxuICAgICAqIGRlcGVuZGVuY2llc1JlcXVlc3QsIGJ1dCB3aXRoIG91dHB1dHMgcGFyc2VkIHRvIGxvb2sgbGlrZSBpbnB1dHMsXG4gICAgICogYW5kIGEgbGlzdCBtYXRjaEtleXMgYWRkZWQgaWYgdGhlIG91dHB1dHMgaGF2ZSBNQVRDSCB3aWxkY2FyZHMuXG4gICAgICogRm9yIG91dHB1dE1hcCB0aGVyZSBzaG91bGQgb25seSBldmVyIGJlIG9uZSBjYWxsYmFjayBwZXIgaWQvcHJvcFxuICAgICAqIGJ1dCBmb3IgaW5wdXRNYXAgdGhlcmUgbWF5IGJlIG1hbnkuXG4gICAgICpcbiAgICAgKiBGb3Igd2lsZGNhcmQgaWRzLCBvdXRwdXRQYXR0ZXJucyBhbmQgaW5wdXRQYXR0ZXJucyBhcmU6XG4gICAgICogICB7XG4gICAgICogICAgICAgW2tleXN0cl06IHtcbiAgICAgKiAgICAgICAgICAgW3Byb3BdOiBbXG4gICAgICogICAgICAgICAgICAgICB7a2V5czogWy4uLl0sIHZhbHVlczogWy4uLl0sIGNhbGxiYWNrczogW2NhbGxiYWNrLCAuLi5dfSxcbiAgICAgKiAgICAgICAgICAgICAgIHsuLi59XG4gICAgICogICAgICAgICAgIF1cbiAgICAgKiAgICAgICB9XG4gICAgICogICB9XG4gICAgICoga2V5c3RyIGlzIGEgc3RyaW5naWZpZWQgb3JkZXJlZCBsaXN0IG9mIGtleXMgaW4gdGhlIGlkXG4gICAgICoga2V5cyBpcyB0aGUgc2FtZSBvcmRlcmVkIGxpc3QgKGp1c3QgY29waWVkIGZvciBjb252ZW5pZW5jZSlcbiAgICAgKiB2YWx1ZXMgaXMgYW4gYXJyYXkgb2YgZXhwbGljaXQgb3Igd2lsZGNhcmQgdmFsdWVzIGZvciBlYWNoIGtleSBpbiBrZXlzXG4gICAgICovXG4gICAgY29uc3Qgb3V0cHV0TWFwID0ge307XG4gICAgY29uc3QgaW5wdXRNYXAgPSB7fTtcbiAgICBjb25zdCBvdXRwdXRQYXR0ZXJucyA9IHt9O1xuICAgIGNvbnN0IGlucHV0UGF0dGVybnMgPSB7fTtcblxuICAgIGNvbnN0IGZpbmFsR3JhcGhzID0ge1xuICAgICAgICBNdWx0aUdyYXBoOiBtdWx0aUdyYXBoLFxuICAgICAgICBvdXRwdXRNYXAsXG4gICAgICAgIGlucHV0TWFwLFxuICAgICAgICBvdXRwdXRQYXR0ZXJucyxcbiAgICAgICAgaW5wdXRQYXR0ZXJucyxcbiAgICAgICAgY2FsbGJhY2tzOiBwYXJzZWREZXBlbmRlbmNpZXNcbiAgICB9O1xuXG4gICAgaWYgKGhhc0Vycm9yKSB7XG4gICAgICAgIC8vIGxlYXZlIHRoZSBncmFwaHMgZW1wdHkgaWYgd2UgZm91bmQgYW4gZXJyb3IsIHNvIHdlIGRvbid0IHRyeSB0b1xuICAgICAgICAvLyBleGVjdXRlIHRoZSBicm9rZW4gY2FsbGJhY2tzLlxuICAgICAgICByZXR1cm4gZmluYWxHcmFwaHM7XG4gICAgfVxuXG4gICAgcGFyc2VkRGVwZW5kZW5jaWVzLmZvckVhY2goZGVwZW5kZW5jeSA9PiB7XG4gICAgICAgIGNvbnN0IHtvdXRwdXRzLCBpbnB1dHN9ID0gZGVwZW5kZW5jeTtcblxuICAgICAgICBvdXRwdXRzLmNvbmNhdChpbnB1dHMpLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aWR9ID0gaXRlbTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgZm9yRWFjaE9iakluZGV4ZWQoKHZhbCwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghd2lsZGNhcmRQbGFjZWhvbGRlcnNba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lsZGNhcmRQbGFjZWhvbGRlcnNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kOiAwXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleVBsYWNlaG9sZGVycyA9IHdpbGRjYXJkUGxhY2Vob2xkZXJzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgJiYgdmFsLndpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwuZXhwYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5UGxhY2Vob2xkZXJzLmV4cGFuZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleVBsYWNlaG9sZGVycy5leGFjdC5pbmRleE9mKHZhbCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlQbGFjZWhvbGRlcnMuZXhhY3QucHVzaCh2YWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGZvckVhY2hPYmpJbmRleGVkKGtleVBsYWNlaG9sZGVycyA9PiB7XG4gICAgICAgIGNvbnN0IHtleGFjdCwgZXhwYW5kfSA9IGtleVBsYWNlaG9sZGVycztcbiAgICAgICAgY29uc3QgdmFscyA9IGV4YWN0LnNsaWNlKCkuc29ydChpZFZhbFNvcnQpO1xuICAgICAgICBpZiAoZXhwYW5kKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cGFuZDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4YWN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB2YWxzLnNwbGljZSgwLCAwLCBbdmFsQmVmb3JlKHZhbHNbMF0pXSk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHMucHVzaCh2YWxBZnRlcih2YWxzW3ZhbHMubGVuZ3RoIC0gMV0pKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YWxzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFleGFjdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIG9ubHkgTUFUQ0gvQUxMIC0gc3RpbGwgbmVlZCBhIHZhbHVlXG4gICAgICAgICAgICB2YWxzLnB1c2goMCk7XG4gICAgICAgIH1cbiAgICAgICAga2V5UGxhY2Vob2xkZXJzLnZhbHMgPSB2YWxzO1xuICAgIH0sIHdpbGRjYXJkUGxhY2Vob2xkZXJzKTtcblxuICAgIGZ1bmN0aW9uIG1ha2VBbGxJZHMoaWRTcGVjLCBvdXRJZEZpbmFsKSB7XG4gICAgICAgIGxldCBpZExpc3QgPSBbe31dO1xuICAgICAgICBmb3JFYWNoT2JqSW5kZXhlZCgodmFsLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3RWYWxzID0gd2lsZGNhcmRQbGFjZWhvbGRlcnNba2V5XS52YWxzO1xuICAgICAgICAgICAgY29uc3Qgb3V0VmFsSW5kZXggPSB0ZXN0VmFscy5pbmRleE9mKG91dElkRmluYWxba2V5XSk7XG4gICAgICAgICAgICBsZXQgbmV3VmFscyA9IFt2YWxdO1xuICAgICAgICAgICAgaWYgKHZhbCAmJiB2YWwud2lsZCkge1xuICAgICAgICAgICAgICAgIGlmICh2YWwgPT09IEFMTFNNQUxMRVIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG91dFZhbEluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFscyA9IHRlc3RWYWxzLnNsaWNlKDAsIG91dFZhbEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHNtYWxsZXIgaXRlbXMgLSBkZWxldGUgYWxsIG91dHB1dHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdWYWxzID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBNQVRDSCBvciBBTExcbiAgICAgICAgICAgICAgICAgICAgLy8gTUFUQ0ggKmlzKiBBTEwgZm9yIG91dHB1dHMsIGllIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBhXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIHNwZWNpZmllZCBpbiBgb3V0SWRGaW5hbGBcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFscyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRWYWxJbmRleCA9PT0gLTEgfHwgdmFsID09PSBBTExcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRlc3RWYWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBbb3V0SWRGaW5hbFtrZXldXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXBsaWNhdGVzIGV2ZXJ5dGhpbmcgaW4gaWRMaXN0IG9uY2UgZm9yIGVhY2ggaXRlbSBpblxuICAgICAgICAgICAgLy8gbmV3VmFscywgYXR0YWNoaW5nIGVhY2ggdmFsdWUgYXQga2V5LlxuICAgICAgICAgICAgaWRMaXN0ID0gYXAoYXAoW2Fzc29jKGtleSldLCBuZXdWYWxzKSwgaWRMaXN0KTtcbiAgICAgICAgfSwgaWRTcGVjKTtcbiAgICAgICAgcmV0dXJuIGlkTGlzdDtcbiAgICB9XG5cbiAgICAvKiBtdWx0aUdyYXBoIGlzIHVzZWQgb25seSBmb3IgdGVzdGluZyBjaXJjdWxhcml0eVxuICAgICAqXG4gICAgICogRWFjaCBjb21wb25lbnQrcHJvcGVydHkgdGhhdCBpcyB1c2VkIGFzIGFuIGlucHV0IG9yIG91dHB1dCBpcyBhZGRlZCBhcyBhIG5vZGVcbiAgICAgKiB0byBhIGRpcmVjdGVkIGdyYXBoIHdpdGggYSBkZXBlbmRlbmN5IGZyb20gZWFjaCBpbnB1dCB0byBlYWNoIG91dHB1dC4gVGhlXG4gICAgICogZnVuY3Rpb24gdHJpZ2dlckRlZmF1bHRTdGF0ZSBpbiBpbmRleC5qcyB0aGVuIGNoZWNrcyB0aGlzIGdyYXBoIGZvciBjaXJjdWxhcml0eS5cbiAgICAgKlxuICAgICAqIEluIG9yZGVyIHRvIGFsbG93IHRoZSBzYW1lIGNvbXBvbmVudCtwcm9wZXJ0eSB0byBiZSBib3RoIGFuIGlucHV0IGFuZCBvdXRwdXRcbiAgICAgKiBvZiB0aGUgc2FtZSBjYWxsYmFjaywgYSB0d28gcGFzcyBhcHByb2FjaCBpcyB1c2VkLlxuICAgICAqXG4gICAgICogSW4gdGhlIGZpcnN0IHBhc3MsIHRoZSBncmFwaCBpcyBidWlsdCB1cCBub3JtYWxseSB3aXRoIHRoZSBleGNlcHRpb24gdGhhdFxuICAgICAqIGluIGNhc2VzIHdoZXJlIGFuIG91dHB1dCBpcyBhbHNvIGFuIGlucHV0IHRvIHRoZSBzYW1lIGNhbGxiYWNrIGEgc3BlY2lhbFxuICAgICAqIFwib3V0cHV0XCIgbm9kZSBpcyBhZGRlZCBhbmQgdGhlIGRlcGVuZGVuY2llcyB0YXJnZXQgdGhpcyBvdXRwdXQgbm9kZSBpbnN0ZWFkLlxuICAgICAqIEZvciBleGFtcGxlLCBpZiBgc2xpZGVyLnZhbHVlYCBpcyBib3RoIGFuIGlucHV0IGFuZCBhbiBvdXRwdXQsIHRoZW4gdGhlIGEgbmV3XG4gICAgICogbm9kZSBgc2xpZGVyLnZhbHVlX19vdXRwdXRgIHdpbGwgYmUgYWRkZWQgd2l0aCBhIGRlcGVuZGVuY3kgZnJvbSBgc2xpZGVyLnZhbHVlYFxuICAgICAqIHRvIGBzbGlkZXIudmFsdWVfX291dHB1dGAuIFNwbGl0dGluZyB0aGUgaW5wdXQgYW5kIG91dHB1dCBpbnRvIHNlcGFyYXRlIG5vZGVzXG4gICAgICogcmVtb3ZlcyB0aGUgY2lyY3VsYXJpdHkuXG4gICAgICpcbiAgICAgKiBJbiBvcmRlciB0byBzdGlsbCBkZXRlY3Qgb3RoZXIgZm9ybXMgb2YgY2lyY3VsYXJpdHksIGl0IGlzIG5lY2Vzc2FyeSB0byBkbyBhXG4gICAgICogc2Vjb25kIHBhc3MgYW5kIGFkZCB0aGUgbmV3IG91dHB1dCBub2RlcyBhcyBhIGRlcGVuZGVuY3kgaW4gYW55ICpvdGhlciogY2FsbGJhY2tzXG4gICAgICogd2hlcmUgdGhlIG9yaWdpbmFsIG5vZGUgd2FzIGFuIGlucHV0LiBDb250aW51aW5nIHRoZSBleGFtcGxlLCBhbnkgb3RoZXIgY2FsbGJhY2tcbiAgICAgKiB0aGF0IGhhZCBgc2xpZGVyLnZhbHVlYCBhcyBhbiBpbnB1dCBkZXBlbmRlbmN5IGFsc28gbmVlZHMgdG8gaGF2ZVxuICAgICAqIGBzbGlkZXIudmFsdWVfX291dHB1dGAgYXMgYSBkZXBlbmRlbmN5LiBUbyBtYWtlIHRoaXMgZWZmaWNpZW50LCBhbGwgdGhlIGlucHV0c1xuICAgICAqIGFuZCBvdXRwdXRzIGZvciBlYWNoIGNhbGxiYWNrIGFyZSBzdG9yZWQgZHVyaW5nIHRoZSBmaXJzdCBwYXNzLlxuICAgICAqL1xuXG4gICAgY29uc3Qgb3V0cHV0VGFnID0gJ19fb3V0cHV0JztcbiAgICBjb25zdCBkdXBsaWNhdGVPdXRwdXRzID0gW107XG4gICAgY29uc3QgY2JJbiA9IFtdO1xuICAgIGNvbnN0IGNiT3V0ID0gW107XG5cbiAgICBmdW5jdGlvbiBhZGRJbnB1dFRvTXVsdGkoaW5JZFByb3AsIG91dElkUHJvcCwgZmlyc3RQYXNzID0gdHJ1ZSkge1xuICAgICAgICBtdWx0aUdyYXBoLmFkZE5vZGUoaW5JZFByb3ApO1xuICAgICAgICBtdWx0aUdyYXBoLmFkZERlcGVuZGVuY3koaW5JZFByb3AsIG91dElkUHJvcCk7XG4gICAgICAgIC8vIG9ubHkgc3RvcmUgY2FsbGJhY2sgaW5wdXRzIGFuZCBvdXRwdXRzIGR1cmluZyB0aGUgZmlyc3QgcGFzc1xuICAgICAgICBpZiAoZmlyc3RQYXNzKSB7XG4gICAgICAgICAgICBjYkluW2NiSW4ubGVuZ3RoIC0gMV0ucHVzaChpbklkUHJvcCk7XG4gICAgICAgICAgICBjYk91dFtjYk91dC5sZW5ndGggLSAxXS5wdXNoKG91dElkUHJvcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJzZWREZXBlbmRlbmNpZXMuZm9yRWFjaChkZXBlbmRlbmN5ID0+IHtcbiAgICAgICAgY29uc3Qge291dHB1dHMsIGlucHV0c30gPSBkZXBlbmRlbmN5O1xuXG4gICAgICAgIC8vIG5ldyBjYWxsYmFjaywgYWRkIGFuIGVtcHR5IGFycmF5IGZvciBpdHMgaW5wdXRzIGFuZCBvdXRwdXRzXG4gICAgICAgIGNiSW4ucHVzaChbXSk7XG4gICAgICAgIGNiT3V0LnB1c2goW10pO1xuXG4gICAgICAgIGZ1bmN0aW9uIGFkZE91dHB1dFRvTXVsdGkob3V0SWRGaW5hbCwgb3V0SWRQcm9wKSB7XG4gICAgICAgICAgICBtdWx0aUdyYXBoLmFkZE5vZGUob3V0SWRQcm9wKTtcbiAgICAgICAgICAgIGlucHV0cy5mb3JFYWNoKGluT2JqID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7aWQ6IGluSWQsIHByb3BlcnR5fSA9IGluT2JqO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5JZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5JZExpc3QgPSBtYWtlQWxsSWRzKGluSWQsIG91dElkRmluYWwpO1xuICAgICAgICAgICAgICAgICAgICBpbklkTGlzdC5mb3JFYWNoKGlkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZElucHV0VG9NdWx0aShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lSWRBbmRQcm9wKHtpZCwgcHJvcGVydHl9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRJZFByb3BcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZElucHV0VG9NdWx0aShjb21iaW5lSWRBbmRQcm9wKGluT2JqKSwgb3V0SWRQcm9wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlJ2xsIGNvbnRpbnVlIHRvIHVzZSBkZXAub3V0cHV0IGFzIGl0cyBpZCwgYnV0IGFkZCBvdXRwdXRzIGFzIHdlbGxcbiAgICAgICAgLy8gZm9yIGNvbnZlbmllbmNlIGFuZCBzeW1tZXRyeSB3aXRoIHRoZSBzdHJ1Y3R1cmUgb2YgaW5wdXRzIGFuZCBzdGF0ZS5cbiAgICAgICAgLy8gQWxzbyBjb2xsZWN0IE1BVENIIGtleXMgaW4gdGhlIG91dHB1dCAoYWxsIG91dHB1dHMgbXVzdCBzaGFyZSB0aGVzZSlcbiAgICAgICAgLy8gYW5kIEFMTCBrZXlzIGluIHRoZSBmaXJzdCBvdXRwdXQgKG5lZWQgbm90IGJlIHNoYXJlZCBidXQgd2UnbGwgdXNlXG4gICAgICAgIC8vIHRoZSBmaXJzdCBvdXRwdXQgZm9yIGNhbGN1bGF0aW9ucykgZm9yIGxhdGVyIGNvbnZlbmllbmNlLlxuICAgICAgICBjb25zdCB7bWF0Y2hLZXlzfSA9IGZpbmRXaWxkY2FyZEtleXMob3V0cHV0cy5sZW5ndGggPyBvdXRwdXRzWzBdLmlkIDogdW5kZWZpbmVkKTtcbiAgICAgICAgY29uc3QgZmlyc3RTaW5nbGVPdXRwdXQgPSBmaW5kSW5kZXgobyA9PiAhaXNNdWx0aVZhbHVlZChvLmlkKSwgb3V0cHV0cyk7XG4gICAgICAgIGNvbnN0IGZpbmFsRGVwZW5kZW5jeSA9IG1lcmdlUmlnaHQoXG4gICAgICAgICAgICB7bWF0Y2hLZXlzLCBmaXJzdFNpbmdsZU91dHB1dCwgb3V0cHV0c30sXG4gICAgICAgICAgICBkZXBlbmRlbmN5XG4gICAgICAgICk7XG5cbiAgICAgICAgb3V0cHV0cy5mb3JFYWNoKG91dElkUHJvcCA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aWQ6IG91dElkLCBwcm9wZXJ0eX0gPSBvdXRJZFByb3A7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGlzIG91dHB1dCBpcyBhbHNvIGFuIGlucHV0IHRvIHRoZSBzYW1lIGNhbGxiYWNrXG4gICAgICAgICAgICBjb25zdCBhbHNvSW5wdXQgPSBjaGVja0luT3V0T3ZlcmxhcChvdXRJZFByb3AsIGlucHV0cyk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG91dElkID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dElkTGlzdCA9IG1ha2VBbGxJZHMob3V0SWQsIHt9KTtcbiAgICAgICAgICAgICAgICBvdXRJZExpc3QuZm9yRWFjaChpZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBPdXRJZFByb3AgPSB7aWQsIHByb3BlcnR5fTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG91dElkTmFtZSA9IGNvbWJpbmVJZEFuZFByb3AodGVtcE91dElkUHJvcCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgb3V0cHV0IGlzIGFsc28gYW4gaW5wdXQsIGFkZCBgb3V0cHV0VGFnYCB0byB0aGUgbmFtZVxuICAgICAgICAgICAgICAgICAgICBpZiAoYWxzb0lucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVPdXRwdXRzLnB1c2godGVtcE91dElkUHJvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRJZE5hbWUgKz0gb3V0cHV0VGFnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dFRvTXVsdGkoaWQsIG91dElkTmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYWRkUGF0dGVybihvdXRwdXRQYXR0ZXJucywgb3V0SWQsIHByb3BlcnR5LCBmaW5hbERlcGVuZGVuY3kpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgb3V0SWROYW1lID0gY29tYmluZUlkQW5kUHJvcChvdXRJZFByb3ApO1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgb3V0cHV0IGlzIGFsc28gYW4gaW5wdXQsIGFkZCBgb3V0cHV0VGFnYCB0byB0aGUgbmFtZVxuICAgICAgICAgICAgICAgIGlmIChhbHNvSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlT3V0cHV0cy5wdXNoKG91dElkUHJvcCk7XG4gICAgICAgICAgICAgICAgICAgIG91dElkTmFtZSArPSBvdXRwdXRUYWc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFkZE91dHB1dFRvTXVsdGkoe30sIG91dElkTmFtZSk7XG4gICAgICAgICAgICAgICAgYWRkTWFwKG91dHB1dE1hcCwgb3V0SWQsIHByb3BlcnR5LCBmaW5hbERlcGVuZGVuY3kpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpbnB1dHMuZm9yRWFjaChpbnB1dE9iamVjdCA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aWQ6IGluSWQsIHByb3BlcnR5OiBpblByb3B9ID0gaW5wdXRPYmplY3Q7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGluSWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgYWRkUGF0dGVybihpbnB1dFBhdHRlcm5zLCBpbklkLCBpblByb3AsIGZpbmFsRGVwZW5kZW5jeSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFkZE1hcChpbnB1dE1hcCwgaW5JZCwgaW5Qcm9wLCBmaW5hbERlcGVuZGVuY3kpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIHNlY29uZCBwYXNzIGZvciBhZGRpbmcgbmV3IG91dHB1dCBub2RlcyBhcyBkZXBlbmRlbmNpZXMgd2hlcmUgbmVlZGVkXG4gICAgZHVwbGljYXRlT3V0cHV0cy5mb3JFYWNoKGR1cGVPdXRJZFByb3AgPT4ge1xuICAgICAgICBjb25zdCBvcmlnaW5hbE5hbWUgPSBjb21iaW5lSWRBbmRQcm9wKGR1cGVPdXRJZFByb3ApO1xuICAgICAgICBjb25zdCBuZXdOYW1lID0gb3JpZ2luYWxOYW1lLmNvbmNhdChvdXRwdXRUYWcpO1xuICAgICAgICBmb3IgKHZhciBjbnQgPSAwOyBjbnQgPCBjYkluLmxlbmd0aDsgY250KyspIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGlucHV0IHRvIHRoZSBjYWxsYmFja1xuICAgICAgICAgICAgaWYgKGNiSW5bY250XS5zb21lKGluTmFtZSA9PiBpbk5hbWUgPT09IG9yaWdpbmFsTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAvKiBtYWtlIHN1cmUgaXQncyBub3QgYWxzbyBhbiBvdXRwdXQgb2YgdGhlIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgICogKHRoaXMgd2lsbCBiZSB0aGUgb3JpZ2luYWwgY2FsbGJhY2spXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgaWYgKCFjYk91dFtjbnRdLnNvbWUob3V0TmFtZSA9PiBvdXROYW1lID09PSBuZXdOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBjYk91dFtjbnRdLmZvckVhY2gob3V0TmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJbnB1dFRvTXVsdGkobmV3TmFtZSwgb3V0TmFtZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmaW5hbEdyYXBocztcbn1cblxuZnVuY3Rpb24gZmluZFdpbGRjYXJkS2V5cyhpZCkge1xuICAgIGNvbnN0IG1hdGNoS2V5cyA9IFtdO1xuICAgIGNvbnN0IGFsbHNtYWxsZXJLZXlzID0gW107XG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yRWFjaE9iakluZGV4ZWQoKHZhbCwga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsID09PSBNQVRDSCkge1xuICAgICAgICAgICAgICAgIG1hdGNoS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbCA9PT0gQUxMU01BTExFUikge1xuICAgICAgICAgICAgICAgIGFsbHNtYWxsZXJLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgaWQpO1xuICAgICAgICBtYXRjaEtleXMuc29ydCgpO1xuICAgICAgICBhbGxzbWFsbGVyS2V5cy5zb3J0KCk7XG4gICAgfVxuICAgIHJldHVybiB7bWF0Y2hLZXlzLCBhbGxzbWFsbGVyS2V5c307XG59XG5cbi8qXG4gKiBEbyB0aGUgZ2l2ZW4gaWQgdmFsdWVzIGB2YWxzYCBtYXRjaCB0aGUgcGF0dGVybiBgcGF0dGVyblZhbHNgP1xuICogYGtleXNgLCBgcGF0dGVyblZhbHNgLCBhbmQgYHZhbHNgIGFyZSBhbGwgYXJyYXlzLCBhbmQgd2UgYWxyZWFkeSBrbm93IHRoYXRcbiAqIHdlJ3JlIG9ubHkgbG9va2luZyBhdCBpZHMgd2l0aCB0aGUgc2FtZSBrZXlzIGFzIHRoZSBwYXR0ZXJuLlxuICpcbiAqIE9wdGlvbmFsbHksIGluY2x1ZGUgYW5vdGhlciByZWZlcmVuY2Ugc2V0IG9mIHRoZSBzYW1lIC0gdG8gZW5zdXJlIHRoZVxuICogY29ycmVjdCBtYXRjaGluZyBvZiBNQVRDSCBvciBBTExTTUFMTEVSIGJldHdlZW4gaW5wdXQgYW5kIG91dHB1dCBpdGVtcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlkTWF0Y2goXG4gICAga2V5cyxcbiAgICB2YWxzLFxuICAgIHBhdHRlcm5WYWxzLFxuICAgIHJlZktleXMsXG4gICAgcmVmVmFscyxcbiAgICByZWZQYXR0ZXJuVmFsc1xuKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHZhbHNbaV07XG4gICAgICAgIGNvbnN0IHBhdHRlcm5WYWwgPSBwYXR0ZXJuVmFsc1tpXTtcbiAgICAgICAgaWYgKHBhdHRlcm5WYWwud2lsZCkge1xuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHNlY29uZCBpZCwgY29tcGFyZSB0aGUgd2lsZGNhcmQgdmFsdWVzLlxuICAgICAgICAgICAgLy8gV2l0aG91dCBhIHNlY29uZCBpZCwgYWxsIHdpbGRjYXJkcyBwYXNzIGF0IHRoaXMgc3RhZ2UuXG4gICAgICAgICAgICBpZiAocmVmS2V5cyAmJiBwYXR0ZXJuVmFsICE9PSBBTEwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZJbmRleCA9IHJlZktleXMuaW5kZXhPZihrZXlzW2ldKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZQYXR0ZXJuVmFsID0gcmVmUGF0dGVyblZhbHNbcmVmSW5kZXhdO1xuICAgICAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjay4gU2hvdWxkbid0IGV2ZXIgZmFpbCB0aGlzLCBpZiB0aGUgYmFjayBlbmRcbiAgICAgICAgICAgICAgICAvLyBkaWQgaXRzIGpvYiB2YWxpZGF0aW5nIGNhbGxiYWNrcy5cbiAgICAgICAgICAgICAgICAvLyBZb3UgY2FuJ3QgcmVzb2x2ZSBhbiBpbnB1dCBhZ2FpbnN0IGFuIGlucHV0LCBiZWNhdXNlXG4gICAgICAgICAgICAgICAgLy8gdHdvIEFMTFNNQUxMRVIncyB3b3VsZG4ndCBtYWtlIHNlbnNlIVxuICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuVmFsID09PSBBTExTTUFMTEVSICYmIHJlZlBhdHRlcm5WYWwgPT09IEFMTFNNQUxMRVIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2ludmFsaWQgd2lsZGNhcmQgaWQgcGFpcjogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuVmFscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmS2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmUGF0dGVyblZhbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlZhbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGlkVmFsU29ydCh2YWwsIHJlZlZhbHNbcmVmSW5kZXhdKSAhPT1cbiAgICAgICAgICAgICAgICAgICAgKHBhdHRlcm5WYWwgPT09IEFMTFNNQUxMRVJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcmVmUGF0dGVyblZhbCA9PT0gQUxMU01BTExFUlxuICAgICAgICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICAgICAgICA6IDApXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodmFsICE9PSBwYXR0ZXJuVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldEFueVZhbHMocGF0dGVyblZhbHMsIHZhbHMpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuVmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGF0dGVyblZhbHNbaV0gPT09IE1BVENIKSB7XG4gICAgICAgICAgICBtYXRjaGVzLnB1c2godmFsc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoZXMubGVuZ3RoID8gSlNPTi5zdHJpbmdpZnkobWF0Y2hlcykgOiAnJztcbn1cblxuLypcbiAqIERvZXMgdGhpcyBpdGVtIChpbnB1dCAvIG91dHB1dCAvIHN0YXRlKSBzdXBwb3J0IG11bHRpcGxlIHZhbHVlcz9cbiAqIHN0cmluZyBJRHMgZG8gbm90OyB3aWxkY2FyZCBJRHMgb25seSBkbyBpZiB0aGV5IGNvbnRhaW4gQUxMIG9yIEFMTFNNQUxMRVJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTXVsdGlWYWx1ZWQoe2lkfSkge1xuICAgIHJldHVybiB0eXBlb2YgaWQgPT09ICdvYmplY3QnICYmIGFueSh2ID0+IHYubXVsdGksIHZhbHVlcyhpZCkpO1xufVxuXG4vKlxuICogRm9yIGEgZ2l2ZW4gb3V0cHV0IGlkIGFuZCBwcm9wLCBmaW5kIHRoZSBjYWxsYmFjayBnZW5lcmF0aW5nIGl0LlxuICogSWYgbm8gY2FsbGJhY2sgaXMgZm91bmQsIHJldHVybnMgZmFsc2UuXG4gKiBJZiBvbmUgaXMgZm91bmQsIHJldHVybnM6XG4gKiB7XG4gKiAgICAgY2FsbGJhY2s6IHRoZSBjYWxsYmFjayBzcGVjIHtvdXRwdXRzLCBpbnB1dHMsIHN0YXRlIGV0Y31cbiAqICAgICBhbnlWYWxzOiBzdHJpbmdpZmllZCBsaXN0IG9mIHJlc29sdmVkIE1BVENIIGtleXMgd2UgbWF0Y2hlZFxuICogICAgIHJlc29sdmVkSWQ6IHRoZSBcIm91dHB1dHNcIiBpZCBzdHJpbmcgcGx1cyBNQVRDSCB2YWx1ZXMgd2UgbWF0Y2hlZFxuICogICAgIGdldE91dHB1dHM6IGFjY2Vzc29yIGZ1bmN0aW9uIHRvIGdpdmUgYWxsIHJlc29sdmVkIG91dHB1dHMgb2YgdGhpc1xuICogICAgICAgICBjYWxsYmFjay4gVGFrZXMgYHBhdGhzYCBhcyBhcmd1bWVudCB0byBhcHBseSB3aGVuIHRoZSBjYWxsYmFjayBpc1xuICogICAgICAgICBkaXNwYXRjaGVkLCBpbiBjYXNlIGEgcHJldmlvdXMgY2FsbGJhY2sgaGFzIGFsdGVyZWQgdGhlIGxheW91dC5cbiAqICAgICAgICAgVGhlIHJlc3VsdCBpcyBhIGxpc3Qgb2Yge2lkIChzdHJpbmcgb3Igb2JqZWN0KSwgcHJvcGVydHkgKHN0cmluZyl9XG4gKiAgICAgZ2V0SW5wdXRzOiBzYW1lIGZvciBpbnB1dHNcbiAqICAgICBnZXRTdGF0ZTogc2FtZSBmb3Igc3RhdGVcbiAqICAgICBjaGFuZ2VkUHJvcElkczogYW4gb2JqZWN0IG9mIHtbaWRBbmRQcm9wXTogdn0gdHJpZ2dlcmluZyB0aGlzIGNhbGxiYWNrXG4gKiAgICAgICAgIHYgPSBESVJFQ1QgKDIpOiB0aGUgcHJvcCB3YXMgY2hhbmdlZCBpbiB0aGUgZnJvbnQgZW5kLCBzbyBkZXBlbmRlbnRcbiAqICAgICAgICAgICAgIGNhbGxiYWNrcyAqTVVTVCogYmUgZXhlY3V0ZWQuXG4gKiAgICAgICAgIHYgPSBJTkRJUkVDVCAoMSk6IHRoZSBwcm9wIGlzIGV4cGVjdGVkIHRvIGJlIGNoYW5nZWQgYnkgYSBjYWxsYmFjayxcbiAqICAgICAgICAgICAgIGJ1dCBpZiB0aGlzIGlzIHByZXZlbnRlZCwgZGVwZW5kZW50IGNhbGxiYWNrcyBtYXkgYmUgcHJ1bmVkLlxuICogICAgIGluaXRpYWxDYWxsOiBib29sZWFuLCBpZiB0cnVlIHdlIGRvbid0IHJlcXVpcmUgYW55IGNoYW5nZWRQcm9wSWRzXG4gKiAgICAgICAgIHRvIGtlZXAgdGhpcyBjYWxsYmFjayBhcm91bmQsIGFzIGl0J3MgdGhlIGluaXRpYWwgY2FsbCB0byBwb3B1bGF0ZVxuICogICAgICAgICB0aGlzIHZhbHVlIG9uIHBhZ2UgbG9hZCBvciBjaGFuZ2luZyBwYXJ0IG9mIHRoZSBsYXlvdXQuXG4gKiAgICAgICAgIEJ5IGRlZmF1bHQgdGhpcyBpcyB0cnVlIGZvciBjYWxsYmFja3MgZ2VuZXJhdGVkIGJ5XG4gKiAgICAgICAgIGdldENhbGxiYWNrQnlPdXRwdXQsIGZhbHNlIGZyb20gZ2V0Q2FsbGJhY2tzQnlJbnB1dC5cbiAqIH1cbiAqL1xuZnVuY3Rpb24gZ2V0Q2FsbGJhY2tCeU91dHB1dChncmFwaHMsIHBhdGhzLCBpZCwgcHJvcCkge1xuICAgIGxldCByZXNvbHZlO1xuICAgIGxldCBjYWxsYmFjaztcbiAgICBsZXQgYW55VmFscyA9ICcnO1xuICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIHN0YW5kYXJkIGlkIHZlcnNpb25cbiAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gKGdyYXBocy5vdXRwdXRNYXBbaWRdIHx8IHt9KVtwcm9wXTtcbiAgICAgICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFja3NbMF07XG4gICAgICAgICAgICByZXNvbHZlID0gcmVzb2x2ZURlcHMoKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHdpbGRjYXJkIHZlcnNpb25cbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGlkKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IHZhbHMgPSBwcm9wcyhrZXlzLCBpZCk7XG4gICAgICAgIGNvbnN0IGtleVN0ciA9IGtleXMuam9pbignLCcpO1xuICAgICAgICBjb25zdCBwYXR0ZXJucyA9IChncmFwaHMub3V0cHV0UGF0dGVybnNba2V5U3RyXSB8fCB7fSlbcHJvcF07XG4gICAgICAgIGlmIChwYXR0ZXJucykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdHRlcm5WYWxzID0gcGF0dGVybnNbaV0udmFsdWVzO1xuICAgICAgICAgICAgICAgIGlmIChpZE1hdGNoKGtleXMsIHZhbHMsIHBhdHRlcm5WYWxzKSkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHBhdHRlcm5zW2ldLmNhbGxiYWNrc1swXTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSA9IHJlc29sdmVEZXBzKGtleXMsIHZhbHMsIHBhdHRlcm5WYWxzKTtcbiAgICAgICAgICAgICAgICAgICAgYW55VmFscyA9IGdldEFueVZhbHMocGF0dGVyblZhbHMsIHZhbHMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFyZXNvbHZlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZVJlc29sdmVkQ2FsbGJhY2soY2FsbGJhY2ssIHJlc29sdmUsIGFueVZhbHMpO1xufVxuXG5mdW5jdGlvbiBhZGRSZXNvbHZlZEZyb21PdXRwdXRzKGNhbGxiYWNrLCBvdXRQYXR0ZXJuLCBvdXRzLCBtYXRjaGVzKSB7XG4gICAgY29uc3Qgb3V0MEtleXMgPSBPYmplY3Qua2V5cyhvdXRQYXR0ZXJuLmlkKS5zb3J0KCk7XG4gICAgY29uc3Qgb3V0MFBhdHRlcm5WYWxzID0gcHJvcHMob3V0MEtleXMsIG91dFBhdHRlcm4uaWQpO1xuICAgIGNvbnN0IGZvdW5kQ2JJZHMgPSB7fTtcbiAgICBvdXRzLmZvckVhY2goKHtpZDogb3V0SWR9KSA9PiB7XG4gICAgICAgIGNvbnN0IG91dFZhbHMgPSBwcm9wcyhvdXQwS2V5cywgb3V0SWQpO1xuICAgICAgICBjb25zdCByZXNvbHZlZCA9IG1ha2VSZXNvbHZlZENhbGxiYWNrKFxuICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICByZXNvbHZlRGVwcyhvdXQwS2V5cywgb3V0VmFscywgb3V0MFBhdHRlcm5WYWxzKSxcbiAgICAgICAgICAgIGdldEFueVZhbHMob3V0MFBhdHRlcm5WYWxzLCBvdXRWYWxzKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCB7cmVzb2x2ZWRJZH0gPSByZXNvbHZlZDtcbiAgICAgICAgaWYgKCFmb3VuZENiSWRzW3Jlc29sdmVkSWRdKSB7XG4gICAgICAgICAgICBtYXRjaGVzLnB1c2gocmVzb2x2ZWQpO1xuICAgICAgICAgICAgZm91bmRDYklkc1tyZXNvbHZlZElkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEFsbFJlc29sdmVkRnJvbU91dHB1dHMocmVzb2x2ZSwgcGF0aHMsIG1hdGNoZXMpIHtcbiAgICByZXR1cm4gY2FsbGJhY2sgPT4ge1xuICAgICAgICBjb25zdCB7bWF0Y2hLZXlzLCBmaXJzdFNpbmdsZU91dHB1dCwgb3V0cHV0c30gPSBjYWxsYmFjaztcbiAgICAgICAgaWYgKG1hdGNoS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNpbmdsZU91dFBhdHRlcm4gPSBvdXRwdXRzW2ZpcnN0U2luZ2xlT3V0cHV0XTtcbiAgICAgICAgICAgIGlmIChzaW5nbGVPdXRQYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgYWRkUmVzb2x2ZWRGcm9tT3V0cHV0cyhcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgICAgIHNpbmdsZU91dFBhdHRlcm4sXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocGF0aHMpKHNpbmdsZU91dFBhdHRlcm4pLFxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgKiBJZiBldmVyeSBvdXRwdXQgaGFzIEFMTCB3ZSBuZWVkIHRvIHJlZHVjZSByZXNvbHZlZCBzZXRcbiAgICAgICAgICAgICAgICAgKiB0byBvbmUgaXRlbSBwZXIgY29tYmluYXRpb24gb2YgTUFUQ0ggdmFsdWVzLlxuICAgICAgICAgICAgICAgICAqIFRoYXQgd2lsbCBnaXZlIG9uZSByZXN1bHQgcGVyIGNhbGxiYWNrIGludm9jYXRpb24uXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY29uc3QgYW55U2VlbiA9IHt9O1xuICAgICAgICAgICAgICAgIG91dHB1dHMuZm9yRWFjaChvdXRQYXR0ZXJuID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0U2V0ID0gcmVzb2x2ZShwYXRocykob3V0UGF0dGVybikuZmlsdGVyKGkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hTdHIgPSBKU09OLnN0cmluZ2lmeShwcm9wcyhtYXRjaEtleXMsIGkuaWQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYW55U2VlblttYXRjaFN0cl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnlTZWVuW21hdGNoU3RyXSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBhZGRSZXNvbHZlZEZyb21PdXRwdXRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRQYXR0ZXJuLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0U2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlc1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY2IgPSBtYWtlUmVzb2x2ZWRDYWxsYmFjayhjYWxsYmFjaywgcmVzb2x2ZSwgJycpO1xuICAgICAgICAgICAgaWYgKGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhwYXRocykpLmxlbmd0aCB8fCBjYWxsYmFjay5mb3JjZV9ub19vdXRwdXQpIHtcbiAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goY2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cblxuLypcbiAqIEZvciBhIGdpdmVuIGlkIGFuZCBwcm9wIGZpbmQgYWxsIGNhbGxiYWNrcyBpdCdzIGFuIGlucHV0IG9mLlxuICpcbiAqIFJldHVybnMgYW4gYXJyYXkgb2Ygb2JqZWN0czpcbiAqICAge2NhbGxiYWNrLCByZXNvbHZlZElkLCBnZXRPdXRwdXRzLCBnZXRJbnB1dHMsIGdldFN0YXRlfVxuICogICBTZWUgZ2V0Q2FsbGJhY2tCeU91dHB1dCBmb3IgZGV0YWlscy5cbiAqXG4gKiBOb3RlIHRoYXQgaWYgdGhlIG9yaWdpbmFsIGlucHV0IGNvbnRhaW5zIGFuIEFMTFNNQUxMRVIgd2lsZGNhcmQsXG4gKiB0aGVyZSBtYXkgYmUgbWFueSBlbnRyaWVzIGZvciB0aGUgc2FtZSBjYWxsYmFjaywgYnV0IGFueSBnaXZlbiBvdXRwdXRcbiAqICh3aXRoIGFuIE1BVENIIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0J3MgQUxMU01BTExFUikgd2lsbCBvbmx5IGFwcGVhclxuICogaW4gb25lIGVudHJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2F0Y2hlZEtleXMoaWQsIG5ld1Byb3BzLCBncmFwaHMpIHtcbiAgICBpZiAoIShpZCAmJiBncmFwaHMgJiYgbmV3UHJvcHMubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgaW5wdXRzID0gZ3JhcGhzLmlucHV0TWFwW2lkXTtcbiAgICAgICAgcmV0dXJuIGlucHV0cyA/IG5ld1Byb3BzLmZpbHRlcihuZXdQcm9wID0+IGlucHV0c1tuZXdQcm9wXSkgOiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaWQpLnNvcnQoKTtcbiAgICBjb25zdCB2YWxzID0gcHJvcHMoa2V5cywgaWQpO1xuICAgIGNvbnN0IGtleVN0ciA9IGtleXMuam9pbignLCcpO1xuICAgIGNvbnN0IGtleVBhdHRlcm5zID0gZ3JhcGhzLmlucHV0UGF0dGVybnNba2V5U3RyXTtcbiAgICBpZiAoIWtleVBhdHRlcm5zKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1Byb3BzLmZpbHRlcihwcm9wID0+IHtcbiAgICAgICAgY29uc3QgcGF0dGVybnMgPSBrZXlQYXR0ZXJuc1twcm9wXTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHBhdHRlcm5zICYmXG4gICAgICAgICAgICBwYXR0ZXJucy5zb21lKHBhdHRlcm4gPT4gaWRNYXRjaChrZXlzLCB2YWxzLCBwYXR0ZXJuLnZhbHVlcykpXG4gICAgICAgICk7XG4gICAgfSk7XG59XG5cbi8qXG4gKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBjYWxsYmFja3MgcmVmZXJlbmNpbmcgYSBjaHVuayBvZiB0aGUgbGF5b3V0LFxuICogZWl0aGVyIGFzIGlucHV0cyBvciBvdXRwdXRzLlxuICpcbiAqIG9wdHMub3V0cHV0c09ubHk6IGJvb2xlYW4sIHNldCB0cnVlIHdoZW4gY3Jhd2xpbmcgdGhlICp3aG9sZSogbGF5b3V0LFxuICogICBiZWNhdXNlIG91dHB1dHMgYXJlIGVub3VnaCB0byBnZXQgZXZlcnl0aGluZy5cbiAqIG9wdHMucmVtb3ZlZEFycmF5SW5wdXRzT25seTogYm9vbGVhbiwgc2V0IHRydWUgdG8gb25seSBsb29rIGZvciBpbnB1dHMgaW5cbiAqICAgd2lsZGNhcmQgYXJyYXlzIChBTEwgb3IgQUxMU01BTExFUiksIG5vIG91dHB1dHMuIFRoaXMgZ2V0cyB1c2VkIHRvIHRlbGxcbiAqICAgd2hlbiB0aGUgbmV3ICphYnNlbmNlKiBvZiBhIGdpdmVuIGNvbXBvbmVudCBzaG91bGQgdHJpZ2dlciBhIGNhbGxiYWNrLlxuICogb3B0cy5uZXdQYXRoczogcGF0aHMgb2JqZWN0IGFmdGVyIHRoZSBlZGl0IC0gdG8gYmUgdXNlZCB3aXRoXG4gKiAgIHJlbW92ZWRBcnJheUlucHV0c09ubHkgdG8gZGV0ZXJtaW5lIGlmIHRoZSBjYWxsYmFjayBzdGlsbCBoYXMgaXRzIG91dHB1dHNcbiAqIG9wdHMuY2h1bmtQYXRoOiBwYXRoIHRvIHRoZSBuZXcgY2h1bmsgLSB1c2VkIHRvIGRldGVybWluZSBpZiBhbnkgb3V0cHV0cyBhcmVcbiAqICAgb3V0c2lkZSBvZiB0aGlzIGNodW5rLCBiZWNhdXNlIHRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIGlucHV0cyBpbnNpZGUgdGhlXG4gKiAgIGNodW5rIGNvdW50IGFzIGhhdmluZyBjaGFuZ2VkXG4gKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBvYmplY3RzOlxuICogICB7Y2FsbGJhY2ssIHJlc29sdmVkSWQsIGdldE91dHB1dHMsIGdldElucHV0cywgZ2V0U3RhdGUsIC4uLmV0Y31cbiAqICAgU2VlIGdldENhbGxiYWNrQnlPdXRwdXQgZm9yIGRldGFpbHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRVbmZpbHRlcmVkTGF5b3V0Q2FsbGJhY2tzKGdyYXBocywgcGF0aHMsIGxheW91dENodW5rLCBvcHRzKSB7XG4gICAgY29uc3Qge291dHB1dHNPbmx5LCByZW1vdmVkQXJyYXlJbnB1dHNPbmx5LCBuZXdQYXRocywgY2h1bmtQYXRofSA9IG9wdHM7XG4gICAgY29uc3QgZm91bmRDYklkcyA9IHt9O1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IFtdO1xuXG4gICAgZnVuY3Rpb24gYWRkQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjb25zdCBmb3VuZEluZGV4ID0gZm91bmRDYklkc1tjYWxsYmFjay5yZXNvbHZlZElkXTtcbiAgICAgICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZENiID0gY2FsbGJhY2tzW2ZvdW5kSW5kZXhdO1xuICAgICAgICAgICAgICAgIGZvdW5kQ2IuY2hhbmdlZFByb3BJZHMgPSBtZXJnZU1heChcbiAgICAgICAgICAgICAgICAgICAgZm91bmRDYi5jaGFuZ2VkUHJvcElkcyxcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2hhbmdlZFByb3BJZHNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjay5pbml0aWFsQ2FsbCkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENiLmluaXRpYWxDYWxsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvdW5kQ2JJZHNbY2FsbGJhY2sucmVzb2x2ZWRJZF0gPSBjYWxsYmFja3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZENhbGxiYWNrSWZBcnJheShpZFN0cikge1xuICAgICAgICByZXR1cm4gY2IgPT5cbiAgICAgICAgICAgIGNiLmdldElucHV0cyhwYXRocykuc29tZShpbmkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShpbmkpICYmXG4gICAgICAgICAgICAgICAgICAgIGluaS5zb21lKGluaWogPT4gc3RyaW5naWZ5SWQoaW5pai5pZCkgPT09IGlkU3RyKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNhbGxiYWNrIHNob3VsZCB0cmlnZ2VyIGV2ZW4gd2l0aCBubyBjaGFuZ2VkUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBwcm9wcyB0aGF0IGNoYW5nZWQgbm8gbG9uZ2VyIGV4aXN0LlxuICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBraW5kIG9mIGFidXNpbmcgdGhlIGBpbml0aWFsQ2FsbGAgZmxhZyBoZXJlLCBpdCdzXG4gICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgbGlrZSBhIFwiZmluYWwgY2FsbFwiIGZvciB0aGUgcmVtb3ZlZCBpbnB1dHMsIGJ1dFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNhc2UgaXMgbm90IHN1YmplY3QgdG8gYHByZXZlbnRfaW5pdGlhbF9jYWxsYC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhuZXdQYXRocykpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2IuaW5pdGlhbENhbGwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2IuY2hhbmdlZFByb3BJZHMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZENhbGxiYWNrKGNiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlT25lSWQoaWQsIG91dElkQ2FsbGJhY2tzLCBpbklkQ2FsbGJhY2tzKSB7XG4gICAgICAgIGlmIChvdXRJZENhbGxiYWNrcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBvdXRJZENhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNiID0gZ2V0Q2FsbGJhY2tCeU91dHB1dChncmFwaHMsIHBhdGhzLCBpZCwgcHJvcGVydHkpO1xuICAgICAgICAgICAgICAgIGlmIChjYikge1xuICAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFja3MgZm91bmQgaW4gdGhlIGxheW91dCBieSBvdXRwdXQgc2hvdWxkIGFsd2F5cyBydW5cbiAgICAgICAgICAgICAgICAgICAgLy8gdW5sZXNzIHNwZWNpZmljYWxseSByZXF1ZXN0ZWQgbm90IHRvLlxuICAgICAgICAgICAgICAgICAgICAvLyBpZSB0aGlzIGlzIHRoZSBpbml0aWFsIGNhbGwgb2YgdGhpcyBjYWxsYmFjayBldmVuIGlmIGl0J3NcbiAgICAgICAgICAgICAgICAgICAgLy8gbm90IHRoZSBwYWdlIGluaXRpYWxpemF0aW9uIGJ1dCBqdXN0IGEgbmV3IGxheW91dCBjaHVua1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNiLmNhbGxiYWNrLnByZXZlbnRfaW5pdGlhbF9jYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYi5pbml0aWFsQ2FsbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRDYWxsYmFjayhjYik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvdXRwdXRzT25seSAmJiBpbklkQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBjb25zdCBtYXliZUFkZENhbGxiYWNrID0gcmVtb3ZlZEFycmF5SW5wdXRzT25seVxuICAgICAgICAgICAgICAgID8gYWRkQ2FsbGJhY2tJZkFycmF5KHN0cmluZ2lmeUlkKGlkKSlcbiAgICAgICAgICAgICAgICA6IGFkZENhbGxiYWNrO1xuICAgICAgICAgICAgbGV0IGhhbmRsZVRoaXNDYWxsYmFjayA9IG1heWJlQWRkQ2FsbGJhY2s7XG4gICAgICAgICAgICBpZiAoY2h1bmtQYXRoKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlVGhpc0NhbGxiYWNrID0gY2IgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAhYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0c1dpdGgoY2h1bmtQYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVjaygncGF0aCcsIGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhwYXRocykpKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlQWRkQ2FsbGJhY2soY2IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gaW5JZENhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgIGdldENhbGxiYWNrc0J5SW5wdXQoXG4gICAgICAgICAgICAgICAgICAgIGdyYXBocyxcbiAgICAgICAgICAgICAgICAgICAgcGF0aHMsXG4gICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgSU5ESVJFQ1RcbiAgICAgICAgICAgICAgICApLmZvckVhY2goaGFuZGxlVGhpc0NhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyYXdsTGF5b3V0KGxheW91dENodW5rLCBjaGlsZCA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gcGF0aChbJ3Byb3BzJywgJ2lkJ10sIGNoaWxkKTtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiAhcmVtb3ZlZEFycmF5SW5wdXRzT25seSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZU9uZUlkKGlkLCBncmFwaHMub3V0cHV0TWFwW2lkXSwgZ3JhcGhzLmlucHV0TWFwW2lkXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleVN0ciA9IE9iamVjdC5rZXlzKGlkKS5zb3J0KCkuam9pbignLCcpO1xuICAgICAgICAgICAgICAgIGhhbmRsZU9uZUlkKFxuICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgIXJlbW92ZWRBcnJheUlucHV0c09ubHkgJiYgZ3JhcGhzLm91dHB1dFBhdHRlcm5zW2tleVN0cl0sXG4gICAgICAgICAgICAgICAgICAgIGdyYXBocy5pbnB1dFBhdHRlcm5zW2tleVN0cl1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWFwKFxuICAgICAgICBjYiA9PiAoe1xuICAgICAgICAgICAgLi4uY2IsXG4gICAgICAgICAgICBwcmlvcml0eTogZ2V0UHJpb3JpdHkoZ3JhcGhzLCBwYXRocywgY2IpXG4gICAgICAgIH0pLFxuICAgICAgICBjYWxsYmFja3NcbiAgICApO1xufVxuIiwiaW1wb3J0IHtcbiAgICBhbGwsXG4gICAgYXNzb2MsXG4gICAgY29uY2F0LFxuICAgIGRpZmZlcmVuY2UsXG4gICAgZmlsdGVyLFxuICAgIGZsYXR0ZW4sXG4gICAgaXNFbXB0eSxcbiAgICBrZXlzLFxuICAgIG1hcCxcbiAgICBtZXJnZVdpdGgsXG4gICAgcGFydGl0aW9uLFxuICAgIHBhdGgsXG4gICAgcGlja0J5LFxuICAgIHByb3BzLFxuICAgIHJlZHVjZSxcbiAgICB6aXBPYmpcbn0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHtcbiAgICBJQ2FsbGJhY2ssXG4gICAgSUNhbGxiYWNrRGVmaW5pdGlvbixcbiAgICBJQ2FsbGJhY2tQcm9wZXJ0eSxcbiAgICBJQ2FsbGJhY2tUZW1wbGF0ZSxcbiAgICBJTGF5b3V0Q2FsbGJhY2tQcm9wZXJ0eVxufSBmcm9tICcuLi90eXBlcy9jYWxsYmFja3MnO1xuaW1wb3J0IHtcbiAgICBhZGRBbGxSZXNvbHZlZEZyb21PdXRwdXRzLFxuICAgIGdldFVuZmlsdGVyZWRMYXlvdXRDYWxsYmFja3MsXG4gICAgaWRNYXRjaCxcbiAgICBpc011bHRpVmFsdWVkLFxuICAgIHNwbGl0SWRBbmRQcm9wLFxuICAgIHN0cmluZ2lmeUlkXG59IGZyb20gJy4vZGVwZW5kZW5jaWVzJztcbmltcG9ydCB7Z2V0UGF0aH0gZnJvbSAnLi9wYXRocyc7XG5cbmV4cG9ydCBjb25zdCBESVJFQ1QgPSAyO1xuZXhwb3J0IGNvbnN0IElORElSRUNUID0gMTtcbmV4cG9ydCBjb25zdCBtZXJnZU1heCA9IG1lcmdlV2l0aChNYXRoLm1heCk7XG5cbmV4cG9ydCBjb25zdCBjb21iaW5lSWRBbmRQcm9wID0gKHtpZCwgcHJvcGVydHl9OiBJQ2FsbGJhY2tQcm9wZXJ0eSkgPT5cbiAgICBgJHtzdHJpbmdpZnlJZChpZCl9LiR7cHJvcGVydHl9YDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENhbGxiYWNrc0J5SW5wdXQoXG4gICAgZ3JhcGhzOiBhbnksXG4gICAgcGF0aHM6IGFueSxcbiAgICBpZDogYW55LFxuICAgIHByb3A6IGFueSxcbiAgICBjaGFuZ2VUeXBlPzogYW55LFxuICAgIHdpdGhQcmlvcml0eSA9IHRydWVcbik6IElDYWxsYmFja1tdIHtcbiAgICBjb25zdCBtYXRjaGVzOiBJQ2FsbGJhY2tbXSA9IFtdO1xuICAgIGNvbnN0IGlkQW5kUHJvcCA9IGNvbWJpbmVJZEFuZFByb3Aoe2lkLCBwcm9wZXJ0eTogcHJvcH0pO1xuXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gc3RhbmRhcmQgaWQgdmVyc2lvblxuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSAoZ3JhcGhzLmlucHV0TWFwW2lkXSB8fCB7fSlbcHJvcF07XG4gICAgICAgIGlmICghY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFja3MuZm9yRWFjaChcbiAgICAgICAgICAgIGFkZEFsbFJlc29sdmVkRnJvbU91dHB1dHMocmVzb2x2ZURlcHMoKSwgcGF0aHMsIG1hdGNoZXMpXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gd2lsZGNhcmQgdmVyc2lvblxuICAgICAgICBjb25zdCBfa2V5cyA9IE9iamVjdC5rZXlzKGlkKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IHZhbHMgPSBwcm9wcyhfa2V5cywgaWQpO1xuICAgICAgICBjb25zdCBrZXlTdHIgPSBfa2V5cy5qb2luKCcsJyk7XG4gICAgICAgIGNvbnN0IHBhdHRlcm5zOiBhbnlbXSA9IChncmFwaHMuaW5wdXRQYXR0ZXJuc1trZXlTdHJdIHx8IHt9KVtwcm9wXTtcbiAgICAgICAgaWYgKCFwYXR0ZXJucykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHBhdHRlcm5zLmZvckVhY2gocGF0dGVybiA9PiB7XG4gICAgICAgICAgICBpZiAoaWRNYXRjaChfa2V5cywgdmFscywgcGF0dGVybi52YWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgcGF0dGVybi5jYWxsYmFja3MuZm9yRWFjaChcbiAgICAgICAgICAgICAgICAgICAgYWRkQWxsUmVzb2x2ZWRGcm9tT3V0cHV0cyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVEZXBzKF9rZXlzLCB2YWxzLCBwYXR0ZXJuLnZhbHVlcyksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRocyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXNcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXRjaGVzLmZvckVhY2gobWF0Y2ggPT4ge1xuICAgICAgICBtYXRjaC5jaGFuZ2VkUHJvcElkc1tpZEFuZFByb3BdID0gY2hhbmdlVHlwZSB8fCBESVJFQ1Q7XG4gICAgICAgIGlmICh3aXRoUHJpb3JpdHkpIHtcbiAgICAgICAgICAgIG1hdGNoLnByaW9yaXR5ID0gZ2V0UHJpb3JpdHkoZ3JhcGhzLCBwYXRocywgbWF0Y2gpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG1hdGNoZXM7XG59XG5cbi8qXG4gKiBCdWlsZHMgYSB0cmVlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCBjYW4gYmUgdHJpZ2dlcmVkIGJ5IHRoZSBwcm92aWRlZCBjYWxsYmFjay5cbiAqIFVzZXMgdGhlIG51bWJlciBvZiBjYWxsYmFja3MgYXQgZWFjaCB0cmVlIGRlcHRoIGFuZCB0aGUgdG90YWwgZGVwdGggb2YgdGhlIHRyZWVcbiAqIHRvIGNyZWF0ZSBhIHNvcnRhYmxlIHByaW9yaXR5IGhhc2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcmlvcml0eShcbiAgICBncmFwaHM6IGFueSxcbiAgICBwYXRoczogYW55LFxuICAgIGNhbGxiYWNrOiBJQ2FsbGJhY2tcbik6IHN0cmluZyB7XG4gICAgbGV0IGNhbGxiYWNrczogSUNhbGxiYWNrW10gPSBbY2FsbGJhY2tdO1xuICAgIGNvbnN0IHRvdWNoZWRPdXRwdXRzOiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn0gPSB7fTtcbiAgICBjb25zdCB0b3VjaGVkQ2JJZHM6IHtba2V5OiBzdHJpbmddOiBib29sZWFufSA9IHt9O1xuICAgIGNvbnN0IHByaW9yaXR5OiBudW1iZXJbXSA9IFtdO1xuXG4gICAgd2hpbGUgKGNhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgY2FsbGJhY2tzID0gZmlsdGVyKGMgPT4ge1xuICAgICAgICAgICAgY29uc3QgdG91Y2hlZCA9IHRvdWNoZWRDYklkc1tjLnJlc29sdmVkSWRdO1xuICAgICAgICAgICAgdG91Y2hlZENiSWRzW2MucmVzb2x2ZWRJZF0gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHRvdWNoZWQ7XG4gICAgICAgIH0sIGNhbGxiYWNrcyk7XG5cbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IGZpbHRlcihcbiAgICAgICAgICAgIG8gPT4gIXRvdWNoZWRPdXRwdXRzW2NvbWJpbmVJZEFuZFByb3AobyldLFxuICAgICAgICAgICAgZmxhdHRlbihtYXAoY2IgPT4gZmxhdHRlbihjYi5nZXRPdXRwdXRzKHBhdGhzKSksIGNhbGxiYWNrcykpXG4gICAgICAgICk7XG5cbiAgICAgICAgb3V0cHV0cy5mb3JFYWNoKG8gPT4gKHRvdWNoZWRPdXRwdXRzW2NvbWJpbmVJZEFuZFByb3AobyldID0gdHJ1ZSkpO1xuXG4gICAgICAgIGNhbGxiYWNrcyA9IGZsYXR0ZW4oXG4gICAgICAgICAgICBtYXAoXG4gICAgICAgICAgICAgICAgKHtpZCwgcHJvcGVydHl9OiBhbnkpID0+XG4gICAgICAgICAgICAgICAgICAgIGdldENhbGxiYWNrc0J5SW5wdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBncmFwaHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRocyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgICAgICBJTkRJUkVDVCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgb3V0cHV0c1xuICAgICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChjYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBwcmlvcml0eS5wdXNoKGNhbGxiYWNrcy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpb3JpdHkudW5zaGlmdChwcmlvcml0eS5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIG1hcChpID0+IE1hdGgubWluKGksIDM1KS50b1N0cmluZygzNiksIHByaW9yaXR5KS5qb2luKCcnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbFN1YnNlcXVlbnRPdXRwdXRzRm9yQ2FsbGJhY2soXG4gICAgZ3JhcGhzOiBhbnksXG4gICAgcGF0aHM6IGFueSxcbiAgICBjYWxsYmFjazogSUNhbGxiYWNrXG4pIHtcbiAgICBsZXQgY2FsbGJhY2tzOiBJQ2FsbGJhY2tbXSA9IFtjYWxsYmFja107XG4gICAgbGV0IHRvdWNoZWRPdXRwdXRzOiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn0gPSB7fTtcblxuICAgIC8vIHRoaXMgdHJhdmVyc2VzIHRoZSBncmFwaCBhbGwgdGhlIHdheSB0byB0aGUgZW5kXG4gICAgd2hpbGUgKGNhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gZG9uJ3QgYWRkIGl0IGlmIGl0IGFscmVhZHkgZXhpc3RzIGJhc2VkIG9uIGlkIGFuZCBwcm9wc1xuICAgICAgICBjb25zdCBvdXRwdXRzID0gZmlsdGVyKFxuICAgICAgICAgICAgbyA9PiAhdG91Y2hlZE91dHB1dHNbY29tYmluZUlkQW5kUHJvcChvKV0sXG4gICAgICAgICAgICBmbGF0dGVuKG1hcChjYiA9PiBmbGF0dGVuKGNiLmdldE91dHB1dHMocGF0aHMpKSwgY2FsbGJhY2tzKSlcbiAgICAgICAgKTtcblxuICAgICAgICB0b3VjaGVkT3V0cHV0cyA9IHJlZHVjZShcbiAgICAgICAgICAgICh0b3VjaGVkLCBvKSA9PiBhc3NvYyhjb21iaW5lSWRBbmRQcm9wKG8pLCB0cnVlLCB0b3VjaGVkKSxcbiAgICAgICAgICAgIHRvdWNoZWRPdXRwdXRzLFxuICAgICAgICAgICAgb3V0cHV0c1xuICAgICAgICApO1xuXG4gICAgICAgIGNhbGxiYWNrcyA9IGZsYXR0ZW4oXG4gICAgICAgICAgICBtYXAoXG4gICAgICAgICAgICAgICAgKHtpZCwgcHJvcGVydHl9OiBhbnkpID0+XG4gICAgICAgICAgICAgICAgICAgIGdldENhbGxiYWNrc0J5SW5wdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBncmFwaHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRocyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgICAgICBJTkRJUkVDVCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgb3V0cHV0c1xuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0b3VjaGVkT3V0cHV0cztcbn1cblxuZXhwb3J0IGNvbnN0IGdldFJlYWR5Q2FsbGJhY2tzID0gKFxuICAgIHBhdGhzOiBhbnksXG4gICAgY2FuZGlkYXRlczogSUNhbGxiYWNrW10sXG4gICAgY2FsbGJhY2tzOiBJQ2FsbGJhY2tbXSA9IGNhbmRpZGF0ZXMsXG4gICAgZ3JhcGhzOiBhbnkgPSB7fVxuKTogSUNhbGxiYWNrW10gPT4ge1xuICAgIC8vIFNraXAgaWYgdGhlcmUncyBubyBjYW5kaWRhdGVzXG4gICAgaWYgKCFjYW5kaWRhdGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gRmluZCBhbGwgb3V0cHV0cyBvZiBhbGwgYWN0aXZlIGNhbGxiYWNrc1xuICAgIGNvbnN0IG91dHB1dHMgPSBtYXAoXG4gICAgICAgIGNvbWJpbmVJZEFuZFByb3AsXG4gICAgICAgIHJlZHVjZTxJQ2FsbGJhY2ssIGFueVtdPihcbiAgICAgICAgICAgIChvLCBjYikgPT4gY29uY2F0KG8sIGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhwYXRocykpKSxcbiAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgY2FsbGJhY2tzXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgLy8gTWFrZSBgb3V0cHV0c2AgaGFzaCB0YWJsZSBmb3IgZmFzdGVyIGFjY2Vzc1xuICAgIGxldCBvdXRwdXRzTWFwOiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn0gPSB7fTtcbiAgICBvdXRwdXRzLmZvckVhY2gob3V0cHV0ID0+IChvdXRwdXRzTWFwW291dHB1dF0gPSB0cnVlKSk7XG5cbiAgICAvLyBmaW5kIGFsbCB0aGUgb3V0cHV0cyB0b3VjaGVkIGJ5IGFjdGl2ZUNhbGxiYWNrc1xuICAgIC8vIHJlbW92ZSB0aGlzIGNoZWNrIGlmIGdyYXBoIGlzIGFjY2Vzc2libGUgYWxsIHRoZSB0aW1lXG5cbiAgICBpZiAoT2JqZWN0LmtleXMoZ3JhcGhzKS5sZW5ndGgpIHtcbiAgICAgICAgLy9ub3Qgc3VyZSBpZiBncmFwaCB3aWxsIGJlIGFjY2Vzc2libGUgYWxsIHRoZSB0aW1lXG4gICAgICAgIGNvbnN0IGFsbFRvdWNoZWRPdXRwdXRzOiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn1bXSA9IGZsYXR0ZW4oXG4gICAgICAgICAgICBtYXAoXG4gICAgICAgICAgICAgICAgY2IgPT4gZ2V0QWxsU3Vic2VxdWVudE91dHB1dHNGb3JDYWxsYmFjayhncmFwaHMsIHBhdGhzLCBjYiksXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tzXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gb3ZlcnJyaWRlcyB0aGUgb3V0cHV0c01hcCwgd2lsbCBkdXBsaWNhdGUgY2FsbGJhY2tzIGZpbHRlcmVkXG4gICAgICAgIC8vIHRoaXMgaXMgb25seSBkb25lIHRvIHNpbGVuY2UgdHlwZXNjcmlwdCBlcnJvcnNcbiAgICAgICAgaWYgKGFsbFRvdWNoZWRPdXRwdXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG91dHB1dHNNYXAgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgIGFsbFRvdWNoZWRPdXRwdXRzWzBdLFxuICAgICAgICAgICAgICAgIC4uLmFsbFRvdWNoZWRPdXRwdXRzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmluZCBgcmVxdWVzdGVkYCBjYWxsYmFja3MgdGhhdCBkbyBub3QgZGVwZW5kIG9uIGEgb3V0c3RhbmRpbmcgb3V0cHV0IChhcyBlaXRoZXIgaW5wdXQgb3Igc3RhdGUpXG4gICAgLy8gT3V0cHV0cyB3aGljaCBvdmVybGFwIGFuIGlucHV0IGRvIG5vdCBjb3VudCBhcyBhbiBvdXRzdGFuZGluZyBvdXRwdXRcbiAgICByZXR1cm4gZmlsdGVyKFxuICAgICAgICBjYiA9PlxuICAgICAgICAgICAgYWxsPElMYXlvdXRDYWxsYmFja1Byb3BlcnR5PihcbiAgICAgICAgICAgICAgICBjYnAgPT4gIW91dHB1dHNNYXBbY29tYmluZUlkQW5kUHJvcChjYnApXSxcbiAgICAgICAgICAgICAgICBkaWZmZXJlbmNlKFxuICAgICAgICAgICAgICAgICAgICBmbGF0dGVuKGNiLmdldElucHV0cyhwYXRocykpLFxuICAgICAgICAgICAgICAgICAgICBmbGF0dGVuKGNiLmdldE91dHB1dHMocGF0aHMpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICksXG4gICAgICAgIGNhbmRpZGF0ZXNcbiAgICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldExheW91dENhbGxiYWNrcyA9IChcbiAgICBncmFwaHM6IGFueSxcbiAgICBwYXRoczogYW55LFxuICAgIGxheW91dDogYW55LFxuICAgIG9wdGlvbnM6IGFueVxuKTogSUNhbGxiYWNrW10gPT4ge1xuICAgIGxldCBleGNsdXNpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBjYWxsYmFja3MgPSBnZXRVbmZpbHRlcmVkTGF5b3V0Q2FsbGJhY2tzKFxuICAgICAgICBncmFwaHMsXG4gICAgICAgIHBhdGhzLFxuICAgICAgICBsYXlvdXQsXG4gICAgICAgIG9wdGlvbnNcbiAgICApO1xuXG4gICAgLypcbiAgICAgICAgUmVtb3ZlIGZyb20gdGhlIGluaXRpYWwgY2FsbGJhY2tzIHRob3NlIHRoYXQgYXJlIGxlZnQgd2l0aCBvbmx5IGV4Y2x1ZGVkIGlucHV0cy5cblxuICAgICAgICBFeGNsdXNpb24gb2YgaW5wdXRzIGhhcHBlbnMgd2hlbjpcbiAgICAgICAgLSBhbiBpbnB1dCBpcyBtaXNzaW5nXG4gICAgICAgIC0gYW4gaW5wdXQgaW4gdGhlIGluaXRpYWwgY2FsbGJhY2sgY2hhaW4gZGVwZW5kcyBvbmx5IG9uIGV4Y2x1ZGVkIGlucHV0c1xuXG4gICAgICAgIEZ1cnRoZXIgZXhjbHVzaW9uIG1pZ2h0IGhhcHBlbiBhZnRlciBjYWxsYmFja3MgcmV0dXJuIHdpdGg6XG4gICAgICAgIC0gUHJldmVudFVwZGF0ZVxuICAgICAgICAtIG5vX3VwZGF0ZVxuICAgICovXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgLy8gRmluZCBjYWxsYmFja3MgZm9yIHdoaWNoIGFsbCBpbnB1dHMgYXJlIG1pc3Npbmcgb3IgaW4gdGhlIGV4Y2x1c2lvbnNcbiAgICAgICAgY29uc3QgW2luY2x1ZGVkLCBleGNsdWRlZF0gPSBwYXJ0aXRpb24oXG4gICAgICAgICAgICAoe2NhbGxiYWNrOiB7aW5wdXRzfSwgZ2V0SW5wdXRzfSkgPT5cbiAgICAgICAgICAgICAgICBhbGwoaXNNdWx0aVZhbHVlZCwgaW5wdXRzKSB8fFxuICAgICAgICAgICAgICAgICFpc0VtcHR5KFxuICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwKGNvbWJpbmVJZEFuZFByb3AsIGZsYXR0ZW4oZ2V0SW5wdXRzKHBhdGhzKSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaW9uc1xuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGNhbGxiYWNrc1xuICAgICAgICApO1xuXG4gICAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gYWRkaXRpb25hbCBleGNsdXNpb25zLCBicmVhayBsb29wIC0gY2FsbGJhY2tzIGhhdmUgYmVlbiBjbGVhbmVkXG4gICAgICAgIGlmICghZXhjbHVkZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrcyA9IGluY2x1ZGVkO1xuXG4gICAgICAgIC8vIHVwZGF0ZSBleGNsdXNpb25zIHdpdGggYWxsIGFkZGl0aW9uYWwgZXhjbHVkZWQgb3V0cHV0c1xuICAgICAgICBleGNsdXNpb25zID0gY29uY2F0KFxuICAgICAgICAgICAgZXhjbHVzaW9ucyxcbiAgICAgICAgICAgIG1hcChcbiAgICAgICAgICAgICAgICBjb21iaW5lSWRBbmRQcm9wLFxuICAgICAgICAgICAgICAgIGZsYXR0ZW4obWFwKCh7Z2V0T3V0cHV0c30pID0+IGdldE91dHB1dHMocGF0aHMpLCBleGNsdWRlZCkpXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZmlsdGVyUm9vdCkge1xuICAgICAgICBsZXQgcm9vdElkID0gcGF0aChbJ3Byb3BzJywgJ2lkJ10sIGxheW91dCk7XG4gICAgICAgIGlmIChyb290SWQpIHtcbiAgICAgICAgICAgIHJvb3RJZCA9IHN0cmluZ2lmeUlkKHJvb3RJZCk7XG4gICAgICAgICAgICAvLyBGaWx0ZXIgaW5wdXRzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSByZXNwb25zZVxuICAgICAgICAgICAgY2FsbGJhY2tzID0gY2FsbGJhY2tzLmZpbHRlcihjYiA9PlxuICAgICAgICAgICAgICAgIGNiLmNhbGxiYWNrLmlucHV0cy5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgICAgIChwcmV2aW91czogYW55LCBpbnB1dDogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmdpZnlJZChpbnB1dC5pZCkgPT0gcm9vdElkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWx0ZXJSb290LmluY2x1ZGVzKGlucHV0LnByb3BlcnR5KSksXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qXG4gICAgICAgIFJldHVybiBhbGwgY2FsbGJhY2tzIHdpdGggYW4gYGV4ZWN1dGlvbkdyb3VwYCB0byBhbGxvdyBncm91cC1wcm9jZXNzaW5nXG4gICAgKi9cbiAgICBjb25zdCBleGVjdXRpb25Hcm91cCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpO1xuICAgIHJldHVybiBtYXAoY2IgPT4gKHsuLi5jYiwgZXhlY3V0aW9uR3JvdXB9KSwgY2FsbGJhY2tzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVbmlxdWVJZGVudGlmaWVyID0gKHtcbiAgICBhbnlWYWxzLFxuICAgIGNhbGxiYWNrOiB7aW5wdXRzLCBvdXRwdXRzLCBzdGF0ZX1cbn06IElDYWxsYmFjayk6IHN0cmluZyA9PlxuICAgIGNvbmNhdChcbiAgICAgICAgbWFwKGNvbWJpbmVJZEFuZFByb3AsIFsuLi5pbnB1dHMsIC4uLm91dHB1dHMsIC4uLnN0YXRlXSksXG4gICAgICAgIEFycmF5LmlzQXJyYXkoYW55VmFscykgPyBhbnlWYWxzIDogYW55VmFscyA9PT0gJycgPyBbXSA6IFthbnlWYWxzXVxuICAgICkuam9pbignLCcpO1xuXG5leHBvcnQgZnVuY3Rpb24gaW5jbHVkZU9ic2VydmVycyhcbiAgICBpZDogYW55LFxuICAgIHByb3BlcnRpZXM6IGFueSxcbiAgICBncmFwaHM6IGFueSxcbiAgICBwYXRoczogYW55XG4pOiBJQ2FsbGJhY2tbXSB7XG4gICAgcmV0dXJuIGZsYXR0ZW4oXG4gICAgICAgIG1hcChcbiAgICAgICAgICAgIHByb3BOYW1lID0+IGdldENhbGxiYWNrc0J5SW5wdXQoZ3JhcGhzLCBwYXRocywgaWQsIHByb3BOYW1lKSxcbiAgICAgICAgICAgIGtleXMocHJvcGVydGllcylcbiAgICAgICAgKVxuICAgICk7XG59XG5cbi8qXG4gKiBDcmVhdGUgYSBwZW5kaW5nIGNhbGxiYWNrIG9iamVjdC4gSW5jbHVkZXMgdGhlIG9yaWdpbmFsIGNhbGxiYWNrIGRlZmluaXRpb24sXG4gKiBpdHMgcmVzb2x2ZWQgSUQgKGluY2x1ZGluZyB0aGUgdmFsdWUgb2YgYWxsIE1BVENIIHdpbGRjYXJkcyksXG4gKiBhY2Nlc3NvcnMgdG8gZmluZCBhbGwgaW5wdXRzLCBvdXRwdXRzLCBhbmQgc3RhdGUgaW52b2x2ZWQgaW4gdGhpc1xuICogY2FsbGJhY2sgKGxhenkgYXMgbm90IGFsbCB1c2VycyB3aWxsIHdhbnQgYWxsIG9mIHRoZXNlKS5cbiAqL1xuZXhwb3J0IGNvbnN0IG1ha2VSZXNvbHZlZENhbGxiYWNrID0gKFxuICAgIGNhbGxiYWNrOiBJQ2FsbGJhY2tEZWZpbml0aW9uLFxuICAgIHJlc29sdmU6IChfOiBhbnkpID0+IChfOiBJQ2FsbGJhY2tQcm9wZXJ0eSkgPT4gSUxheW91dENhbGxiYWNrUHJvcGVydHlbXSxcbiAgICBhbnlWYWxzOiBhbnlbXSB8IHN0cmluZ1xuKTogSUNhbGxiYWNrVGVtcGxhdGUgPT4gKHtcbiAgICBjYWxsYmFjayxcbiAgICBhbnlWYWxzLFxuICAgIHJlc29sdmVkSWQ6IGNhbGxiYWNrLm91dHB1dCArIGFueVZhbHMsXG4gICAgZ2V0T3V0cHV0czogcGF0aHMgPT4gY2FsbGJhY2sub3V0cHV0cy5tYXAocmVzb2x2ZShwYXRocykpLFxuICAgIGdldElucHV0czogcGF0aHMgPT4gY2FsbGJhY2suaW5wdXRzLm1hcChyZXNvbHZlKHBhdGhzKSksXG4gICAgZ2V0U3RhdGU6IHBhdGhzID0+IGNhbGxiYWNrLnN0YXRlLm1hcChyZXNvbHZlKHBhdGhzKSksXG4gICAgY2hhbmdlZFByb3BJZHM6IHt9LFxuICAgIGluaXRpYWxDYWxsOiBmYWxzZVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcnVuZUNhbGxiYWNrczxUIGV4dGVuZHMgSUNhbGxiYWNrPihcbiAgICBjYWxsYmFja3M6IFRbXSxcbiAgICBwYXRoczogYW55XG4pOiB7XG4gICAgYWRkZWQ6IFRbXTtcbiAgICByZW1vdmVkOiBUW107XG59IHtcbiAgICBjb25zdCBbLCByZW1vdmVkXSA9IHBhcnRpdGlvbihcbiAgICAgICAgKHtnZXRPdXRwdXRzLCBjYWxsYmFjazoge291dHB1dHN9fSkgPT5cbiAgICAgICAgICAgIGZsYXR0ZW4oZ2V0T3V0cHV0cyhwYXRocykpLmxlbmd0aCA9PT0gb3V0cHV0cy5sZW5ndGgsXG4gICAgICAgIGNhbGxiYWNrc1xuICAgICk7XG5cbiAgICBjb25zdCBbLCBtb2RpZmllZF0gPSBwYXJ0aXRpb24oXG4gICAgICAgICh7Z2V0T3V0cHV0c30pID0+ICFmbGF0dGVuKGdldE91dHB1dHMocGF0aHMpKS5sZW5ndGgsXG4gICAgICAgIHJlbW92ZWRcbiAgICApO1xuXG4gICAgY29uc3QgYWRkZWQ6IGFueSA9IG1hcChcbiAgICAgICAgY2IgPT5cbiAgICAgICAgICAgIGFzc29jKFxuICAgICAgICAgICAgICAgICdjaGFuZ2VkUHJvcElkcycsXG4gICAgICAgICAgICAgICAgcGlja0J5KFxuICAgICAgICAgICAgICAgICAgICAoXywgcHJvcElkKSA9PiBnZXRQYXRoKHBhdGhzLCBzcGxpdElkQW5kUHJvcChwcm9wSWQpLmlkKSxcbiAgICAgICAgICAgICAgICAgICAgY2IuY2hhbmdlZFByb3BJZHNcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGNiXG4gICAgICAgICAgICApLFxuICAgICAgICBtb2RpZmllZFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhZGRlZCxcbiAgICAgICAgcmVtb3ZlZFxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRGVwcyhcbiAgICByZWZLZXlzPzogYW55LFxuICAgIHJlZlZhbHM/OiBhbnksXG4gICAgcmVmUGF0dGVyblZhbHM/OiBzdHJpbmdcbikge1xuICAgIHJldHVybiAocGF0aHM6IGFueSkgPT5cbiAgICAgICAgKHtpZDogaWRQYXR0ZXJuLCBwcm9wZXJ0eX06IElDYWxsYmFja1Byb3BlcnR5KSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlkUGF0dGVybiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChwYXRocywgaWRQYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aCA/IFt7aWQ6IGlkUGF0dGVybiwgcHJvcGVydHksIHBhdGh9XSA6IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgX2tleXMgPSBPYmplY3Qua2V5cyhpZFBhdHRlcm4pLnNvcnQoKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdHRlcm5WYWxzID0gcHJvcHMoX2tleXMsIGlkUGF0dGVybik7XG4gICAgICAgICAgICBjb25zdCBrZXlTdHIgPSBfa2V5cy5qb2luKCcsJyk7XG4gICAgICAgICAgICBjb25zdCBrZXlQYXRocyA9IHBhdGhzLm9ianNba2V5U3RyXTtcbiAgICAgICAgICAgIGlmICgha2V5UGF0aHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IElMYXlvdXRDYWxsYmFja1Byb3BlcnR5W10gPSBbXTtcbiAgICAgICAgICAgIGtleVBhdGhzLmZvckVhY2goKHt2YWx1ZXM6IHZhbHMsIHBhdGh9OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGlkTWF0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICBfa2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuVmFscyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZktleXMsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZWYWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmUGF0dGVyblZhbHNcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7aWQ6IHppcE9iaihfa2V5cywgdmFscyksIHByb3BlcnR5LCBwYXRofSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xufVxuIiwiaW1wb3J0IHtvbmNlfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQge2NyZWF0ZUFjdGlvbn0gZnJvbSAncmVkdXgtYWN0aW9ucyc7XG5pbXBvcnQge2FkZFJlcXVlc3RlZENhbGxiYWNrc30gZnJvbSAnLi9jYWxsYmFja3MnO1xuaW1wb3J0IHtnZXRBcHBTdGF0ZX0gZnJvbSAnLi4vcmVkdWNlcnMvY29uc3RhbnRzJztcbmltcG9ydCB7Z2V0QWN0aW9ufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgY29va2llIGZyb20gJ2Nvb2tpZSc7XG5pbXBvcnQge3ZhbGlkYXRlQ2FsbGJhY2tzVG9MYXlvdXR9IGZyb20gJy4vZGVwZW5kZW5jaWVzJztcbmltcG9ydCB7aW5jbHVkZU9ic2VydmVycywgZ2V0TGF5b3V0Q2FsbGJhY2tzfSBmcm9tICcuL2RlcGVuZGVuY2llc190cyc7XG5pbXBvcnQge2dldFBhdGh9IGZyb20gJy4vcGF0aHMnO1xuXG5leHBvcnQgY29uc3Qgb25FcnJvciA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ09OX0VSUk9SJykpO1xuZXhwb3J0IGNvbnN0IHNldEFwcExpZmVjeWNsZSA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ1NFVF9BUFBfTElGRUNZQ0xFJykpO1xuZXhwb3J0IGNvbnN0IHNldENvbmZpZyA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ1NFVF9DT05GSUcnKSk7XG5leHBvcnQgY29uc3QgYWRkSHR0cEhlYWRlcnMgPSBjcmVhdGVBY3Rpb24oZ2V0QWN0aW9uKCdBRERfSFRUUF9IRUFERVJTJykpO1xuZXhwb3J0IGNvbnN0IHNldEdyYXBocyA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ1NFVF9HUkFQSFMnKSk7XG5leHBvcnQgY29uc3Qgc2V0SG9va3MgPSBjcmVhdGVBY3Rpb24oZ2V0QWN0aW9uKCdTRVRfSE9PS1MnKSk7XG5leHBvcnQgY29uc3Qgc2V0TGF5b3V0ID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignU0VUX0xBWU9VVCcpKTtcbmV4cG9ydCBjb25zdCBzZXRQYXRocyA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ1NFVF9QQVRIUycpKTtcbmV4cG9ydCBjb25zdCBzZXRSZXF1ZXN0UXVldWUgPSBjcmVhdGVBY3Rpb24oZ2V0QWN0aW9uKCdTRVRfUkVRVUVTVF9RVUVVRScpKTtcbmV4cG9ydCBjb25zdCB1cGRhdGVQcm9wcyA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ09OX1BST1BfQ0hBTkdFJykpO1xuXG5leHBvcnQgY29uc3QgZGlzcGF0Y2hFcnJvciA9IGRpc3BhdGNoID0+IChtZXNzYWdlLCBsaW5lcykgPT5cbiAgICBkaXNwYXRjaChcbiAgICAgICAgb25FcnJvcih7XG4gICAgICAgICAgICB0eXBlOiAnYmFja0VuZCcsXG4gICAgICAgICAgICBlcnJvcjoge21lc3NhZ2UsIGh0bWw6IGxpbmVzLmpvaW4oJ1xcbicpfVxuICAgICAgICB9KVxuICAgICk7XG5cbmV4cG9ydCBmdW5jdGlvbiBoeWRyYXRlSW5pdGlhbE91dHB1dHMoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkaXNwYXRjaCwgZ2V0U3RhdGUpIHtcbiAgICAgICAgdmFsaWRhdGVDYWxsYmFja3NUb0xheW91dChnZXRTdGF0ZSgpLCBkaXNwYXRjaEVycm9yKGRpc3BhdGNoKSk7XG4gICAgICAgIHRyaWdnZXJEZWZhdWx0U3RhdGUoZGlzcGF0Y2gsIGdldFN0YXRlKTtcbiAgICAgICAgZGlzcGF0Y2goc2V0QXBwTGlmZWN5Y2xlKGdldEFwcFN0YXRlKCdIWURSQVRFRCcpKSk7XG4gICAgfTtcbn1cblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGUgKi9cbmNvbnN0IGxvZ1dhcm5pbmdPbmNlID0gb25jZShjb25zb2xlLndhcm4pO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q1NSRkhlYWRlcigpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ1gtQ1NSRlRva2VuJzogY29va2llLnBhcnNlKGRvY3VtZW50LmNvb2tpZSkuX2NzcmZfdG9rZW5cbiAgICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ1dhcm5pbmdPbmNlKGUpO1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyRGVmYXVsdFN0YXRlKGRpc3BhdGNoLCBnZXRTdGF0ZSkge1xuICAgIGNvbnN0IHtncmFwaHMsIHBhdGhzLCBsYXlvdXR9ID0gZ2V0U3RhdGUoKTtcblxuICAgIC8vIG92ZXJhbGxPcmRlciB3aWxsIGFzc2VydCBjaXJjdWxhciBkZXBlbmRlbmNpZXMgZm9yIG11bHRpIG91dHB1dC5cbiAgICB0cnkge1xuICAgICAgICBncmFwaHMuTXVsdGlHcmFwaC5vdmVyYWxsT3JkZXIoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICBvbkVycm9yKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnYmFja0VuZCcsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0NpcmN1bGFyIERlcGVuZGVuY2llcycsXG4gICAgICAgICAgICAgICAgICAgIGh0bWw6IGVyci50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBkaXNwYXRjaChcbiAgICAgICAgYWRkUmVxdWVzdGVkQ2FsbGJhY2tzKFxuICAgICAgICAgICAgZ2V0TGF5b3V0Q2FsbGJhY2tzKGdyYXBocywgcGF0aHMsIGxheW91dCwge1xuICAgICAgICAgICAgICAgIG91dHB1dHNPbmx5OiB0cnVlXG4gICAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlZG8gPSBtb3ZlSGlzdG9yeSgnUkVETycpO1xuZXhwb3J0IGNvbnN0IHVuZG8gPSBtb3ZlSGlzdG9yeSgnVU5ETycpO1xuZXhwb3J0IGNvbnN0IHJldmVydCA9IG1vdmVIaXN0b3J5KCdSRVZFUlQnKTtcblxuZnVuY3Rpb24gbW92ZUhpc3RvcnkoY2hhbmdlVHlwZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZGlzcGF0Y2gsIGdldFN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHtoaXN0b3J5LCBwYXRoc30gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBkaXNwYXRjaChjcmVhdGVBY3Rpb24oY2hhbmdlVHlwZSkoKSk7XG4gICAgICAgIGNvbnN0IHtpZCwgcHJvcHN9ID1cbiAgICAgICAgICAgIChjaGFuZ2VUeXBlID09PSAnUkVETydcbiAgICAgICAgICAgICAgICA/IGhpc3RvcnkuZnV0dXJlWzBdXG4gICAgICAgICAgICAgICAgOiBoaXN0b3J5LnBhc3RbaGlzdG9yeS5wYXN0Lmxlbmd0aCAtIDFdKSB8fCB7fTtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICAvLyBVcGRhdGUgcHJvcHNcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIGNyZWF0ZUFjdGlvbignVU5ET19QUk9QX0NIQU5HRScpKHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXBhdGg6IGdldFBhdGgocGF0aHMsIGlkKSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHNcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgZGlzcGF0Y2gobm90aWZ5T2JzZXJ2ZXJzKHtpZCwgcHJvcHN9KSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm90aWZ5T2JzZXJ2ZXJzKHtpZCwgcHJvcHN9KSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChkaXNwYXRjaCwgZ2V0U3RhdGUpIHtcbiAgICAgICAgY29uc3Qge2dyYXBocywgcGF0aHN9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MoaW5jbHVkZU9ic2VydmVycyhpZCwgcHJvcHMsIGdyYXBocywgcGF0aHMpKVxuICAgICAgICApO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVBc3luY0Vycm9yKGVyciwgbWVzc2FnZSwgZGlzcGF0Y2gpIHtcbiAgICAvLyBIYW5kbGUgaHRtbCBlcnJvciByZXNwb25zZXNcbiAgICBpZiAoZXJyICYmIHR5cGVvZiBlcnIudGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnIudGV4dCgpLnRoZW4odGV4dCA9PiB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHttZXNzYWdlLCBodG1sOiB0ZXh0fTtcbiAgICAgICAgICAgIGRpc3BhdGNoKG9uRXJyb3Ioe3R5cGU6ICdiYWNrRW5kJywgZXJyb3J9KSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiB7bWVzc2FnZSwgaHRtbDogZXJyfTtcbiAgICAgICAgZGlzcGF0Y2gob25FcnJvcih7dHlwZTogJ2JhY2tFbmQnLCBlcnJvcn0pKTtcbiAgICB9XG59XG4iLCJpbXBvcnQge3BhdGh9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7aXNSZWFkeX0gZnJvbSAnQHBsb3RseS9kYXNoLWNvbXBvbmVudC1wbHVnaW5zJztcblxuaW1wb3J0IFJlZ2lzdHJ5IGZyb20gJy4uL3JlZ2lzdHJ5JztcbmltcG9ydCB7Z2V0UGF0aH0gZnJvbSAnLi9wYXRocyc7XG5pbXBvcnQge3N0cmluZ2lmeUlkfSBmcm9tICcuL2RlcGVuZGVuY2llcyc7XG5cbmV4cG9ydCBkZWZhdWx0IChsYXlvdXQsIHBhdGhzLCB0YXJnZXRzKSA9PiB7XG4gICAgaWYgKCF0YXJnZXRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcblxuICAgIGNvbnN0IHtldmVudHN9ID0gcGF0aHM7XG4gICAgY29uc3QgcmVuZGVyZWQgPSBuZXcgUHJvbWlzZShyZXNvbHZlUmVuZGVyZWQgPT4ge1xuICAgICAgICBldmVudHMub25jZSgncmVuZGVyZWQnLCByZXNvbHZlUmVuZGVyZWQpO1xuICAgIH0pO1xuXG4gICAgdGFyZ2V0cy5mb3JFYWNoKGlkID0+IHtcbiAgICAgICAgY29uc3QgcGF0aE9mSWQgPSBnZXRQYXRoKHBhdGhzLCBpZCk7XG4gICAgICAgIGlmICghcGF0aE9mSWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHBhdGgocGF0aE9mSWQsIGxheW91dCk7XG4gICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBSZWdpc3RyeS5yZXNvbHZlKHRhcmdldCk7XG4gICAgICAgIGNvbnN0IHJlYWR5ID0gaXNSZWFkeShjb21wb25lbnQpO1xuXG4gICAgICAgIGlmIChyZWFkeSAmJiB0eXBlb2YgcmVhZHkudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgICAgICBQcm9taXNlLnJhY2UoW1xuICAgICAgICAgICAgICAgICAgICByZWFkeSxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWQudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN0cmluZ2lmeUlkKGlkKSkgJiYgcmVhZHlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHJvbWlzZXMubGVuZ3RoID8gUHJvbWlzZS5hbGwocHJvbWlzZXMpIDogdHJ1ZTtcbn07XG4iLCJpbXBvcnQge2NyZWF0ZUFjdGlvbn0gZnJvbSAncmVkdXgtYWN0aW9ucyc7XG5cbmltcG9ydCB7SXNMb2FkaW5nQWN0aW9uVHlwZSwgSXNMb2FkaW5nU3RhdGV9IGZyb20gJy4uL3JlZHVjZXJzL2lzTG9hZGluZyc7XG5cbmV4cG9ydCBjb25zdCBzZXRJc0xvYWRpbmcgPSBjcmVhdGVBY3Rpb248SXNMb2FkaW5nU3RhdGU+KFxuICAgIElzTG9hZGluZ0FjdGlvblR5cGUuU2V0XG4pO1xuIiwiaW1wb3J0IHtjcmVhdGVBY3Rpb259IGZyb20gJ3JlZHV4LWFjdGlvbnMnO1xuXG5pbXBvcnQge0xvYWRpbmdNYXBBY3Rpb25UeXBlLCBMb2FkaW5nTWFwU3RhdGV9IGZyb20gJy4uL3JlZHVjZXJzL2xvYWRpbmdNYXAnO1xuXG5leHBvcnQgY29uc3Qgc2V0TG9hZGluZ01hcCA9IGNyZWF0ZUFjdGlvbjxMb2FkaW5nTWFwU3RhdGU+KFxuICAgIExvYWRpbmdNYXBBY3Rpb25UeXBlLlNldFxuKTtcbiIsImltcG9ydCB7XG4gICAgYXBwZW5kLFxuICAgIGFzc29jUGF0aCxcbiAgICBjb25jYXQsXG4gICAgZGlzc29jUGF0aCxcbiAgICBlbXB0eSxcbiAgICBlcXVhbHMsXG4gICAgaGFzLFxuICAgIGluc2VydCxcbiAgICBpcyxcbiAgICBwYXRoLFxuICAgIHByZXBlbmQsXG4gICAgcmV2ZXJzZVxufSBmcm9tICdyYW1kYSc7XG5cbnR5cGUgUGF0Y2hPcGVyYXRpb24gPSB7XG4gICAgb3BlcmF0aW9uOiBzdHJpbmc7XG4gICAgbG9jYXRpb246IExvY2F0aW9uSW5kZXhbXTtcbiAgICBwYXJhbXM6IGFueTtcbn07XG5cbnR5cGUgTG9jYXRpb25JbmRleCA9IHN0cmluZyB8IG51bWJlcjtcbnR5cGUgUGF0Y2hIYW5kbGVyID0gKHByZXZpb3VzOiBhbnksIHBhdGNoVXBkYXRlOiBQYXRjaE9wZXJhdGlvbikgPT4gYW55O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNQYXRjaChvYmo6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBoYXMoJ19fZGFzaF9wYXRjaF91cGRhdGUnLCBvYmopO1xufVxuXG5mdW5jdGlvbiBnZXRMb2NhdGlvbkluZGV4KHZhbHVlOiBMb2NhdGlvbkluZGV4LCBwcmV2aW91czogYW55KSB7XG4gICAgaWYgKGlzKE51bWJlciwgdmFsdWUpICYmIHZhbHVlIDwgMCkge1xuICAgICAgICByZXR1cm4gcHJldmlvdXMubGVuZ3RoICsgdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0TG9jYXRpb25QYXRoKGxvY2F0aW9uOiBMb2NhdGlvbkluZGV4W10sIG9iajogYW55KSB7XG4gICAgY29uc3QgY3VycmVudCA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhdGlvbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGdldExvY2F0aW9uSW5kZXgobG9jYXRpb25baV0sIHBhdGgoY3VycmVudCwgb2JqKSk7XG4gICAgICAgIGN1cnJlbnQucHVzaCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbmNvbnN0IHBhdGNoSGFuZGxlcnM6IHtbazogc3RyaW5nXTogUGF0Y2hIYW5kbGVyfSA9IHtcbiAgICBBc3NpZ246IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3Qge3BhcmFtcywgbG9jYXRpb259ID0gcGF0Y2hPcGVyYXRpb247XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgobG9jYXRpb24sIHBhcmFtcy52YWx1ZSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgTWVyZ2U6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldjogYW55ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKFxuICAgICAgICAgICAgcGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICAgICAgICAuLi5wYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmV2aW91c1xuICAgICAgICApO1xuICAgIH0sXG4gICAgRXh0ZW5kOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXY6IGFueSA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChcbiAgICAgICAgICAgIHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLFxuICAgICAgICAgICAgY29uY2F0KHByZXYsIHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSksXG4gICAgICAgICAgICBwcmV2aW91c1xuICAgICAgICApO1xuICAgIH0sXG4gICAgRGVsZXRlOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIHJldHVybiBkaXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBJbnNlcnQ6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldjogYW55ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKFxuICAgICAgICAgICAgcGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sXG4gICAgICAgICAgICBpbnNlcnQoXG4gICAgICAgICAgICAgICAgZ2V0TG9jYXRpb25JbmRleChwYXRjaE9wZXJhdGlvbi5wYXJhbXMuaW5kZXgsIHByZXYpLFxuICAgICAgICAgICAgICAgIHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSxcbiAgICAgICAgICAgICAgICBwcmV2XG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgcHJldmlvdXNcbiAgICAgICAgKTtcbiAgICB9LFxuICAgIEFwcGVuZDogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2OiBhbnkgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgoXG4gICAgICAgICAgICBwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbixcbiAgICAgICAgICAgIGFwcGVuZChwYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWUsIHByZXYpLFxuICAgICAgICAgICAgcHJldmlvdXNcbiAgICAgICAgKTtcbiAgICB9LFxuICAgIFByZXBlbmQ6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldjogYW55ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKFxuICAgICAgICAgICAgcGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sXG4gICAgICAgICAgICBwcmVwZW5kKHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSwgcHJldiksXG4gICAgICAgICAgICBwcmV2aW91c1xuICAgICAgICApO1xuICAgIH0sXG4gICAgQWRkOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXY6IGFueSA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChcbiAgICAgICAgICAgIHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLFxuICAgICAgICAgICAgcHJldiArIHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSxcbiAgICAgICAgICAgIHByZXZpb3VzXG4gICAgICAgICk7XG4gICAgfSxcbiAgICBTdWI6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldjogYW55ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKFxuICAgICAgICAgICAgcGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sXG4gICAgICAgICAgICBwcmV2IC0gcGF0Y2hPcGVyYXRpb24ucGFyYW1zLnZhbHVlLFxuICAgICAgICAgICAgcHJldmlvdXNcbiAgICAgICAgKTtcbiAgICB9LFxuICAgIE11bDogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2OiBhbnkgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgoXG4gICAgICAgICAgICBwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbixcbiAgICAgICAgICAgIHByZXYgKiBwYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWUsXG4gICAgICAgICAgICBwcmV2aW91c1xuICAgICAgICApO1xuICAgIH0sXG4gICAgRGl2OiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXY6IGFueSA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChcbiAgICAgICAgICAgIHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLFxuICAgICAgICAgICAgcHJldiAvIHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSxcbiAgICAgICAgICAgIHByZXZpb3VzXG4gICAgICAgICk7XG4gICAgfSxcbiAgICBDbGVhcjogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2OiBhbnkgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIGVtcHR5KHByZXYpLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBSZXZlcnNlOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXY6IGFueSA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcmV2ZXJzZShwcmV2KSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgUmVtb3ZlOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXY6IGFueSA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChcbiAgICAgICAgICAgIHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLFxuICAgICAgICAgICAgcHJldi5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKGl0ZW06IGFueSkgPT4gIWVxdWFscyhpdGVtLCBwYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWUpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgcHJldmlvdXNcbiAgICAgICAgKTtcbiAgICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUGF0Y2g8VD4ocHJldmlvdXNWYWx1ZTogVCwgcGF0Y2hWYWx1ZTogYW55KTogVCB7XG4gICAgbGV0IHJlZHVjZWRWYWx1ZSA9IHByZXZpb3VzVmFsdWU7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGNoVmFsdWUub3BlcmF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwYXRjaCA9IHBhdGNoVmFsdWUub3BlcmF0aW9uc1tpXTtcbiAgICAgICAgcGF0Y2gubG9jYXRpb24gPSBnZXRMb2NhdGlvblBhdGgocGF0Y2gubG9jYXRpb24sIHJlZHVjZWRWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBwYXRjaEhhbmRsZXJzW3BhdGNoLm9wZXJhdGlvbl07XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIE9wZXJhdGlvbiAke3BhdGNoLm9wZXJhdGlvbn1gKTtcbiAgICAgICAgfVxuICAgICAgICByZWR1Y2VkVmFsdWUgPSBoYW5kbGVyKHJlZHVjZWRWYWx1ZSwgcGF0Y2gpO1xuICAgIH1cblxuICAgIHJldHVybiByZWR1Y2VkVmFsdWU7XG59XG4iLCJpbXBvcnQge1xuICAgIGNvbmNhdCxcbiAgICBmaWx0ZXIsXG4gICAgZmluZCxcbiAgICBmb3JFYWNoT2JqSW5kZXhlZCxcbiAgICBpbnNlcnQsXG4gICAgcGF0aCxcbiAgICBwcm9wRXEsXG4gICAgcHJvcHMsXG4gICAgaW5kZXhPZlxufSBmcm9tICdyYW1kYSc7XG5cbmltcG9ydCB7Y3Jhd2xMYXlvdXR9IGZyb20gJy4vdXRpbHMnO1xuXG4vKlxuICogc3RhdGUucGF0aHMgaGFzIHN0cnVjdHVyZTpcbiAqIHtcbiAqICAgc3Ryczoge1tpZF06IHBhdGh9IC8vIGZvciByZWd1bGFyIHN0cmluZyBpZHNcbiAqICAgb2Jqczoge1trZXlTdHJdOiBbe3ZhbHVlcywgcGF0aH1dfSAvLyBmb3Igd2lsZGNhcmQgaWRzXG4gKiB9XG4gKiBrZXlTdHI6IHNvcnRlZCBrZXlzIG9mIHRoZSBpZCwgam9pbmVkIHdpdGggJywnIGludG8gb25lIHN0cmluZ1xuICogdmFsdWVzOiBhcnJheSBvZiB2YWx1ZXMgaW4gdGhlIGlkLCBpbiBvcmRlciBvZiBrZXlzXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVQYXRocyhzdWJUcmVlLCBzdGFydGluZ1BhdGgsIG9sZFBhdGhzLCBldmVudHMpIHtcbiAgICBjb25zdCB7c3Ryczogb2xkU3Rycywgb2Jqczogb2xkT2Jqc30gPSBvbGRQYXRocyB8fCB7c3Ryczoge30sIG9ianM6IHt9fTtcblxuICAgIGNvbnN0IGRpZmZIZWFkID0gcGF0aCA9PiBzdGFydGluZ1BhdGguc29tZSgodiwgaSkgPT4gcGF0aFtpXSAhPT0gdik7XG5cbiAgICBjb25zdCBzcExlbiA9IHN0YXJ0aW5nUGF0aC5sZW5ndGg7XG4gICAgLy8gaWYgd2UncmUgdXBkYXRpbmcgYSBzdWJ0cmVlLCBjbGVhciBvdXQgYWxsIG9mIHRoZSBleGlzdGluZyBpdGVtc1xuICAgIGNvbnN0IHN0cnMgPSBzcExlbiA/IGZpbHRlcihkaWZmSGVhZCwgb2xkU3RycykgOiB7fTtcbiAgICBjb25zdCBvYmpzID0ge307XG4gICAgaWYgKHNwTGVuKSB7XG4gICAgICAgIGZvckVhY2hPYmpJbmRleGVkKChvbGRWYWxQYXRocywgb2xkS2V5cykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3VmFscyA9IGZpbHRlcigoe3BhdGh9KSA9PiBkaWZmSGVhZChwYXRoKSwgb2xkVmFsUGF0aHMpO1xuICAgICAgICAgICAgaWYgKG5ld1ZhbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgb2Jqc1tvbGRLZXlzXSA9IG5ld1ZhbHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIG9sZE9ianMpO1xuICAgIH1cblxuICAgIGNyYXdsTGF5b3V0KHN1YlRyZWUsIChjaGlsZCwgaXRlbXBhdGgpID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBwYXRoKFsncHJvcHMnLCAnaWQnXSwgY2hpbGQpO1xuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGlkKS5zb3J0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gcHJvcHMoa2V5cywgaWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleVN0ciA9IGtleXMuam9pbignLCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhzID0gKG9ianNba2V5U3RyXSA9IG9ianNba2V5U3RyXSB8fCBbXSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkaWUgPSBvbGRPYmpzW2tleVN0cl0gfHwgW107XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHt2YWx1ZXMsIHBhdGg6IGNvbmNhdChzdGFydGluZ1BhdGgsIGl0ZW1wYXRoKX07XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBpbmRleE9mKGl0ZW0sIG9sZGllKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb2Jqc1trZXlTdHJdID0gaW5zZXJ0KGluZGV4LCBpdGVtLCBwYXRocyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHJzW2lkXSA9IGNvbmNhdChzdGFydGluZ1BhdGgsIGl0ZW1wYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gV2UgaW5jbHVkZSBhbiBldmVudCBlbWl0dGVyIGhlcmUgYmVjYXVzZSBpdCB3aWxsIGJlIHVzZWQgYWxvbmcgd2l0aFxuICAgIC8vIHBhdGhzIHRvIGRldGVybWluZSB3aGVuIHRoZSBhcHAgaXMgcmVhZHkgZm9yIGNhbGxiYWNrcy5cbiAgICByZXR1cm4ge3N0cnMsIG9ianMsIGV2ZW50czogZXZlbnRzIHx8IG9sZFBhdGhzLmV2ZW50c307XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXRoKHBhdGhzLCBpZCkge1xuICAgIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpZCkuc29ydCgpO1xuICAgICAgICBjb25zdCBrZXlTdHIgPSBrZXlzLmpvaW4oJywnKTtcbiAgICAgICAgY29uc3Qga2V5UGF0aHMgPSBwYXRocy5vYmpzW2tleVN0cl07XG4gICAgICAgIGlmICgha2V5UGF0aHMpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZXMgPSBwcm9wcyhrZXlzLCBpZCk7XG4gICAgICAgIGNvbnN0IHBhdGhPYmogPSBmaW5kKHByb3BFcSh2YWx1ZXMsICd2YWx1ZXMnKSwga2V5UGF0aHMpO1xuICAgICAgICByZXR1cm4gcGF0aE9iaiAmJiBwYXRoT2JqLnBhdGg7XG4gICAgfVxuICAgIHJldHVybiBwYXRocy5zdHJzW2lkXTtcbn1cbiIsImltcG9ydCB7YmF0Y2h9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7c2V0R3JhcGhzfSBmcm9tICcuL2luZGV4JztcbmltcG9ydCBhcGlUaHVuayBmcm9tICcuL2FwaSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0RGVwZW5kZW5jaWVzKCkge1xuICAgIHJldHVybiAoZGlzcGF0Y2g6IGFueSkgPT4ge1xuICAgICAgICBiYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICBkaXNwYXRjaChzZXRHcmFwaHMoe30pKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIGFwaVRodW5rKCdfZGFzaC1kZXBlbmRlbmNpZXMnLCAnR0VUJywgJ2RlcGVuZGVuY2llc1JlcXVlc3QnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbiIsImltcG9ydCB7XG4gICAgYXBwZW5kLFxuICAgIGNvbmNhdCxcbiAgICBoYXMsXG4gICAgcGF0aCxcbiAgICBwYXRoT3IsXG4gICAgdHlwZSxcbiAgICBmaW5kSW5kZXgsXG4gICAgaW5jbHVkZXMsXG4gICAgc2xpY2Vcbn0gZnJvbSAncmFtZGEnO1xuXG4vKlxuICogcmVxdWVzdHNfcGF0aG5hbWVfcHJlZml4IGlzIHRoZSBuZXcgY29uZmlnIHBhcmFtZXRlciBpbnRyb2R1Y2VkIGluXG4gKiBkYXNoPT0wLjE4LjAuIFRoZSBwcmV2aW91cyB2ZXJzaW9ucyBqdXN0IGhhZCB1cmxfYmFzZV9wYXRobmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXJsQmFzZShjb25maWcpIHtcbiAgICBjb25zdCBoYXNVcmxCYXNlID0gaGFzKCd1cmxfYmFzZV9wYXRobmFtZScsIGNvbmZpZyk7XG4gICAgY29uc3QgaGFzUmVxUHJlZml4ID0gaGFzKCdyZXF1ZXN0c19wYXRobmFtZV9wcmVmaXgnLCBjb25maWcpO1xuICAgIGlmICh0eXBlKGNvbmZpZykgIT09ICdPYmplY3QnIHx8ICghaGFzVXJsQmFzZSAmJiAhaGFzUmVxUHJlZml4KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgXG4gICAgICAgICAgICBUcnlpbmcgdG8gbWFrZSBhbiBBUEkgcmVxdWVzdCBidXQgbmVpdGhlclxuICAgICAgICAgICAgXCJ1cmxfYmFzZV9wYXRobmFtZVwiIG5vciBcInJlcXVlc3RzX3BhdGhuYW1lX3ByZWZpeFwiXG4gICAgICAgICAgICBpcyBpbiBcXGBjb25maWdcXGAuIFxcYGNvbmZpZ1xcYCBpczogYCxcbiAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGJhc2UgPSBoYXNSZXFQcmVmaXhcbiAgICAgICAgPyBjb25maWcucmVxdWVzdHNfcGF0aG5hbWVfcHJlZml4XG4gICAgICAgIDogY29uZmlnLnVybF9iYXNlX3BhdGhuYW1lO1xuXG4gICAgcmV0dXJuIGJhc2UuY2hhckF0KGJhc2UubGVuZ3RoIC0gMSkgPT09ICcvJyA/IGJhc2UgOiBiYXNlICsgJy8nO1xufVxuXG5jb25zdCBwcm9wc0NoaWxkcmVuID0gWydwcm9wcycsICdjaGlsZHJlbiddO1xuXG4vLyBjcmF3bCBhIGxheW91dCBvYmplY3Qgb3IgY2hpbGRyZW4gYXJyYXksIGFwcGx5IGEgZnVuY3Rpb24gb24gZXZlcnkgb2JqZWN0XG5leHBvcnQgY29uc3QgY3Jhd2xMYXlvdXQgPSAoXG4gICAgb2JqZWN0LFxuICAgIGZ1bmMsXG4gICAgY3VycmVudFBhdGggPSBbXSxcbiAgICBleHRyYVBhdGggPSB1bmRlZmluZWRcbikgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICAgICAgLy8gY2hpbGRyZW4gYXJyYXlcbiAgICAgICAgb2JqZWN0LmZvckVhY2goKGNoaWxkLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXh0cmFQYXRoKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqT2YgPSBmaW5kSW5kZXgocCA9PiBpbmNsdWRlcygne30nLCBwKSwgZXh0cmFQYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAob2JqT2YgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyb250ID0gc2xpY2UoMCwgb2JqT2YsIGV4dHJhUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2sgPSBzbGljZShvYmpPZiwgZXh0cmFQYXRoLmxlbmd0aCwgZXh0cmFQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZyb250Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3Jhd2xMYXlvdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aChmcm9udCwgY2hpbGQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2F0KGN1cnJlbnRQYXRoLCBjb25jYXQoW2ldLCBmcm9udCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrUGF0aCA9IGJhY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKHAgPT4gcC5yZXBsYWNlKCd7fScsICcnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGUgPT4gZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRPYmosXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRQYXRoID0gY29uY2F0KFtpXSwgYmFja1BhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2tQYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkT2JqID0gcGF0aChiYWNrUGF0aCwgY2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZE9iaiA9IGNoaWxkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY2hpbGRPYmopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNoaWxkT2JqW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhd2xMYXlvdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jYXQoY3VycmVudFBhdGgsIGNoaWxkUGF0aC5jb25jYXQoW2tleV0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjcmF3bExheW91dChcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgoZXh0cmFQYXRoLCBjaGlsZCksXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uY2F0KGN1cnJlbnRQYXRoLCBjb25jYXQoW2ldLCBleHRyYVBhdGgpKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY3Jhd2xMYXlvdXQoY2hpbGQsIGZ1bmMsIGFwcGVuZChpLCBjdXJyZW50UGF0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUob2JqZWN0KSA9PT0gJ09iamVjdCcpIHtcbiAgICAgICAgZnVuYyhvYmplY3QsIGN1cnJlbnRQYXRoKTtcblxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHBhdGgocHJvcHNDaGlsZHJlbiwgb2JqZWN0KTtcbiAgICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdQYXRoID0gY29uY2F0KGN1cnJlbnRQYXRoLCBwcm9wc0NoaWxkcmVuKTtcbiAgICAgICAgICAgIGNyYXdsTGF5b3V0KGNoaWxkcmVuLCBmdW5jLCBuZXdQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuUHJvcHMgPSBwYXRoT3IoXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIFtvYmplY3QubmFtZXNwYWNlLCBvYmplY3QudHlwZV0sXG4gICAgICAgICAgICB3aW5kb3cuX19kYXNocHJpdmF0ZV9jaGlsZHJlblByb3BzXG4gICAgICAgICk7XG4gICAgICAgIGNoaWxkcmVuUHJvcHMuZm9yRWFjaChjaGlsZHJlblByb3AgPT4ge1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcC5pbmNsdWRlcygnW10nKSkge1xuICAgICAgICAgICAgICAgIGxldCBbZnJvbnRQYXRoLCBiYWNrUGF0aF0gPSBjaGlsZHJlblByb3BcbiAgICAgICAgICAgICAgICAgICAgLnNwbGl0KCdbXScpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAocCA9PiBwLnNwbGl0KCcuJykuZmlsdGVyKGUgPT4gZSkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbnQgPSBjb25jYXQoWydwcm9wcyddLCBmcm9udFBhdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2VQYXRoID0gY29uY2F0KGN1cnJlbnRQYXRoLCBmcm9udCk7XG4gICAgICAgICAgICAgICAgY3Jhd2xMYXlvdXQocGF0aChmcm9udCwgb2JqZWN0KSwgZnVuYywgYmFzZVBhdGgsIGJhY2tQYXRoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcC5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGF0aCA9IGNoaWxkcmVuUHJvcC5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmcm9udFBhdGggPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFja1BhdGggPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VyUGF0aCA9IG9wYXRoW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCAmJiBjdXJQYXRoLmluY2x1ZGVzKCd7fScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb250UGF0aC5wdXNoKGN1clBhdGgucmVwbGFjZSgne30nLCAnJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja1BhdGgucHVzaChjdXJQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9udFBhdGgucHVzaChjdXJQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UGF0aCA9IGNvbmNhdChjdXJyZW50UGF0aCwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmZyb250UGF0aFxuICAgICAgICAgICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvVmFsdWUgPSBwYXRoKFsncHJvcHMnLCAuLi5mcm9udFBhdGhdLCBvYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICBpZiAob1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9WYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb1ZhbHVlW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2tQYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmF3bExheW91dChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgoYmFja1BhdGgsIHZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jYXQobmV3UGF0aCwgW2tleSwgLi4uYmFja1BhdGhdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyYXdsTGF5b3V0KHZhbHVlLCBmdW5jLCBbLi4ubmV3UGF0aCwga2V5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UGF0aCA9IGNvbmNhdChjdXJyZW50UGF0aCwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmNoaWxkcmVuUHJvcC5zcGxpdCgnLicpXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICBjcmF3bExheW91dChcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgoWydwcm9wcycsIC4uLmNoaWxkcmVuUHJvcC5zcGxpdCgnLicpXSwgb2JqZWN0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRoXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG4vLyBUaGVyZSBhcmUgcGFja2FnZXMgZm9yIHRoaXMgYnV0IGl0J3Mgc2ltcGxlIGVub3VnaCwgSSBqdXN0XG4vLyBhZGFwdGVkIGl0IGZyb20gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vbXVkZ2UvNTgzMDM4MlxuZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2V2ID0ge307XG4gICAgfVxuICAgIG9uKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICBjb25zdCBldmVudHMgPSAodGhpcy5fZXZbZXZlbnRdID0gdGhpcy5fZXZbZXZlbnRdIHx8IFtdKTtcbiAgICAgICAgZXZlbnRzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gKCkgPT4gdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgIH1cbiAgICByZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgY29uc3QgZXZlbnRzID0gdGhpcy5fZXZbZXZlbnRdO1xuICAgICAgICBpZiAoZXZlbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBpZHggPSBldmVudHMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgICAgICBpZiAoaWR4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBldmVudHMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZW1pdChldmVudCwgLi4uYXJncykge1xuICAgICAgICBjb25zdCBldmVudHMgPSB0aGlzLl9ldltldmVudF07XG4gICAgICAgIGlmIChldmVudHMpIHtcbiAgICAgICAgICAgIGV2ZW50cy5mb3JFYWNoKGxpc3RlbmVyID0+IGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3MpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvbmNlKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICBjb25zdCByZW1vdmUgPSB0aGlzLm9uKGV2ZW50LCAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgcmVtb3ZlKCk7XG4gICAgICAgICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiLypcbiAqIENvcGllZCBvdXQgb2YgcHJvcC10eXBlcyBhbmQgbW9kaWZpZWQgLSBpbnNwaXJlZCBieSBjaGVjay1wcm9wLXR5cGVzLCBidXRcbiAqIHNpbXBsaWZpZWQgYW5kIHR3ZWFrZWQgdG8gb3VyIG5lZWRzOiB3ZSBkb24ndCBuZWVkIHRoZSBOT0RFX0VOViBjaGVjayxcbiAqIHdlIHJlcG9ydCBhbGwgZXJyb3JzLCBub3QganVzdCB0aGUgZmlyc3Qgb25lLCBhbmQgd2UgZG9uJ3QgbmVlZCB0aGUgdGhyb3dpbmdcbiAqIHZhcmlhbnQgYGFzc2VydFByb3BUeXBlc2AuXG4gKi9cbmltcG9ydCBSZWFjdFByb3BUeXBlc1NlY3JldCBmcm9tICdwcm9wLXR5cGVzL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCc7XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIHZhbHVlcyBtYXRjaCB3aXRoIHRoZSB0eXBlIHNwZWNzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0eXBlU3BlY3MgTWFwIG9mIG5hbWUgdG8gYSBSZWFjdFByb3BUeXBlXG4gKiBAcGFyYW0ge29iamVjdH0gdmFsdWVzIFJ1bnRpbWUgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSB0eXBlLWNoZWNrZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBlLmcuIFwicHJvcFwiLCBcImNvbnRleHRcIiwgXCJjaGlsZCBjb250ZXh0XCJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wb25lbnROYW1lIE5hbWUgb2YgdGhlIGNvbXBvbmVudCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gez9GdW5jdGlvbn0gZ2V0U3RhY2sgUmV0dXJucyB0aGUgY29tcG9uZW50IHN0YWNrLlxuICogQHJldHVybiB7c3RyaW5nfSBBbnkgZXJyb3IgbWVzc2FnZSByZXN1bHRpbmcgZnJvbSBjaGVja2luZyB0aGUgdHlwZXNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXMoXG4gICAgdHlwZVNwZWNzLFxuICAgIHZhbHVlcyxcbiAgICBsb2NhdGlvbixcbiAgICBjb21wb25lbnROYW1lLFxuICAgIGdldFN0YWNrID0gbnVsbFxuKSB7XG4gICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgZm9yIChjb25zdCB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICAgIGlmICh0eXBlU3BlY3MuaGFzT3duUHJvcGVydHkodHlwZVNwZWNOYW1lKSkge1xuICAgICAgICAgICAgbGV0IGVycm9yO1xuICAgICAgICAgICAgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJyB0eXBlIGAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3BlY05hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdgIGlzIGludmFsaWQ7ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYC4nXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXShcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTcGVjTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBSZWFjdFByb3BUeXBlc1NlY3JldFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSBleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnJvciAmJiAhKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgYCcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVNwZWNOYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZXJyb3IgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJy4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIHZhciBzdGFjayA9IChnZXRTdGFjayAmJiBnZXRTdGFjaygpKSB8fCAnJztcblxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAnRmFpbGVkICcgKyBsb2NhdGlvbiArICcgdHlwZTogJyArIGVycm9yLm1lc3NhZ2UgKyBzdGFja1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVycm9ycy5qb2luKCdcXG5cXG4nKTtcbn1cbiIsImltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmZ1bmN0aW9uIExvYWRpbmcocHJvcHMpIHtcbiAgICBpZiAocHJvcHMuaXNMb2FkaW5nKSB7XG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtbG9hZGluZy1jYWxsYmFjaycgLz47XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5Mb2FkaW5nLnByb3BUeXBlcyA9IHtcbiAgICBpc0xvYWRpbmc6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWRcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3Qoc3RhdGUgPT4gKHtcbiAgICBpc0xvYWRpbmc6IHN0YXRlLmlzTG9hZGluZ1xufSkpKExvYWRpbmcpO1xuIiwiaW1wb3J0IHtcbiAgICBjb21wYXJhdG9yLFxuICAgIGVxdWFscyxcbiAgICBmb3JFYWNoLFxuICAgIGhhcyxcbiAgICBpc0VtcHR5LFxuICAgIGx0LFxuICAgIHBhdGgsXG4gICAgcGF0aE9yLFxuICAgIHNvcnRcbn0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBhcGlUaHVuayBmcm9tICcuLi8uLi9hY3Rpb25zL2FwaSc7XG5cbmNsYXNzIFJlbG9hZGVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIGlmIChwcm9wcy5jb25maWcuaG90X3JlbG9hZCkge1xuICAgICAgICAgICAgY29uc3Qge2ludGVydmFsLCBtYXhfcmV0cnl9ID0gcHJvcHMuY29uZmlnLmhvdF9yZWxvYWQ7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgICAgIGludGVydmFsLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpbnRlcnZhbElkOiBudWxsLFxuICAgICAgICAgICAgICAgIHBhY2thZ2VzOiBudWxsLFxuICAgICAgICAgICAgICAgIG1heF9yZXRyeVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IHRydWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmV0cnkgPSAwO1xuICAgICAgICB0aGlzLl9oZWFkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZCcpO1xuICAgICAgICB0aGlzLmNsZWFySW50ZXJ2YWwgPSB0aGlzLmNsZWFySW50ZXJ2YWwuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBjbGVhckludGVydmFsKCkge1xuICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnN0YXRlLmludGVydmFsSWQpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtpbnRlcnZhbElkOiBudWxsfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcykge1xuICAgICAgICAvKlxuICAgICAgICAgKiBTYXZlIHRoZSBub24tbG9hZGluZyByZXF1ZXN0cyBpbiB0aGUgc3RhdGUgaW4gb3JkZXIgdG8gY29tcGFyZVxuICAgICAgICAgKiBjdXJyZW50IGhhc2hlcyB3aXRoIHByZXZpb3VzIGhhc2hlcy5cbiAgICAgICAgICogTm90ZSB0aGF0IGlmIHRoZXJlIHdhc24ndCBhIFwibG9hZGluZ1wiIHN0YXRlIGZvciB0aGUgcmVxdWVzdHMsXG4gICAgICAgICAqIHRoZW4gd2UgIGNvdWxkIHNpbXBseSBjb21wYXJlIGBwcm9wc2Agd2l0aCBgcHJldlByb3BzYCBpblxuICAgICAgICAgKiBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICFpc0VtcHR5KHByb3BzLnJlbG9hZFJlcXVlc3QpICYmXG4gICAgICAgICAgICBwcm9wcy5yZWxvYWRSZXF1ZXN0LnN0YXR1cyAhPT0gJ2xvYWRpbmcnXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHtyZWxvYWRSZXF1ZXN0OiBwcm9wcy5yZWxvYWRSZXF1ZXN0fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcbiAgICAgICAgY29uc3Qge3JlbG9hZFJlcXVlc3R9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgY29uc3Qge2Rpc3BhdGNofSA9IHRoaXMucHJvcHM7XG5cbiAgICAgICAgLy8gSW4gdGhlIGJlZ2lubmluZywgcmVsb2FkUmVxdWVzdCB3b24ndCBiZSBkZWZpbmVkXG4gICAgICAgIGlmICghcmVsb2FkUmVxdWVzdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgICogV2hlbiByZWxvYWRSZXF1ZXN0IGlzIGZpcnN0IGRlZmluZWQsIHByZXZTdGF0ZSB3b24ndCBiZSBkZWZpbmVkXG4gICAgICAgICAqIGZvciBvbmUgcmVuZGVyIGxvb3AuXG4gICAgICAgICAqIFRoZSBmaXJzdCByZWxvYWRSZXF1ZXN0IGRlZmluZXMgdGhlIGluaXRpYWwvYmFzZWxpbmUgaGFzaCAtXG4gICAgICAgICAqIGl0IGRvZXNuJ3QgcmVxdWlyZSBhIHJlbG9hZFxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKCFoYXMoJ3JlbG9hZFJlcXVlc3QnLCBwcmV2U3RhdGUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICByZWxvYWRSZXF1ZXN0LnN0YXR1cyA9PT0gMjAwICYmXG4gICAgICAgICAgICBwYXRoKFsnY29udGVudCcsICdyZWxvYWRIYXNoJ10sIHJlbG9hZFJlcXVlc3QpICE9PVxuICAgICAgICAgICAgICAgIHBhdGgoWydyZWxvYWRSZXF1ZXN0JywgJ2NvbnRlbnQnLCAncmVsb2FkSGFzaCddLCBwcmV2U3RhdGUpXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIENTUyAoIWNvbnRlbnQuaGFyZCkgb3IgbmV3IHBhY2thZ2UgYXNzZXRzXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcmVsb2FkUmVxdWVzdC5jb250ZW50LmhhcmQgfHxcbiAgICAgICAgICAgICAgICAhZXF1YWxzKFxuICAgICAgICAgICAgICAgICAgICByZWxvYWRSZXF1ZXN0LmNvbnRlbnQucGFja2FnZXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBwYXRoT3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFsncmVsb2FkUmVxdWVzdCcsICdjb250ZW50JywgJ3BhY2thZ2VzJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2U3RhdGVcbiAgICAgICAgICAgICAgICAgICAgKS5sZW5ndGhcbiAgICAgICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgICAgIWVxdWFscyhcbiAgICAgICAgICAgICAgICAgICAgc29ydChjb21wYXJhdG9yKGx0KSwgcmVsb2FkUmVxdWVzdC5jb250ZW50LnBhY2thZ2VzKSxcbiAgICAgICAgICAgICAgICAgICAgc29ydChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IobHQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aE9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsncmVsb2FkUmVxdWVzdCcsICdjb250ZW50JywgJ3BhY2thZ2VzJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBMb29rIGlmIGl0IHdhcyBhIGNzcyBmaWxlLlxuICAgICAgICAgICAgICAgIGxldCB3YXNfY3NzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGEgb2YgcmVsb2FkUmVxdWVzdC5jb250ZW50LmZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhLmlzX2Nzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2FzX2NzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2Rlc1RvRGlzYWJsZSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBvbGQgZmlsZSBieSB4cGF0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ID0gZG9jdW1lbnQuZXZhbHVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYC8vbGlua1tjb250YWlucyhAaHJlZiwgXCIke2EudXJsfVwiKV1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hlYWRcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IGl0Lml0ZXJhdGVOZXh0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNUb0Rpc2FibGUucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gaXQuaXRlcmF0ZU5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yRWFjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0+IG4uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzVG9EaXNhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5tb2RpZmllZCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsuaHJlZiA9IGAke2EudXJsfT9tPSR7YS5tb2RpZmllZH1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbHNlIHRoZSBmaWxlIHdhcyBkZWxldGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhbm90aGVyIGtpbmQgb2YgZmlsZSBoZXJlIGRvIGEgaGFyZCByZWxvYWQuXG4gICAgICAgICAgICAgICAgICAgICAgICB3YXNfY3NzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXdhc19jc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXNzZXRzIGZpbGUgaGF2ZSBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgICAgIC8vIG9yIGEgY29tcG9uZW50IGxpYiBoYXMgYmVlbiBhZGRlZC9yZW1vdmVkIC1cbiAgICAgICAgICAgICAgICAgICAgLy8gTXVzdCBkbyBhIGhhcmQgcmVsb2FkXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJhY2tlbmQgY29kZSBjaGFuZ2VkIC0gY2FuIGRvIGEgc29mdCByZWxvYWQgaW4gcGxhY2VcbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh7dHlwZTogJ1JFTE9BRCd9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuaW50ZXJ2YWxJZCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgcmVsb2FkUmVxdWVzdC5zdGF0dXMgPT09IDUwMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZXRyeSA+IHRoaXMuc3RhdGUubWF4X3JldHJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckludGVydmFsKCk7XG4gICAgICAgICAgICAgICAgLy8gSW50ZWdyYXRlIHdpdGggZGV2IHRvb2xzIHVpPyFcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWxlcnQoXG4gICAgICAgICAgICAgICAgICAgIGBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkIGFmdGVyIGZhaWxpbmcgJHt0aGlzLl9yZXRyeX0gdGltZXMuIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1BsZWFzZSBjaGVjayB5b3VyIGFwcGxpY2F0aW9uIGZvciBlcnJvcnMsIHRoZW4gcmVmcmVzaCB0aGUgcGFnZS4nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3JldHJ5Kys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgY29uc3Qge2Rpc3BhdGNoLCByZWxvYWRSZXF1ZXN0fSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGNvbnN0IHtkaXNhYmxlZCwgaW50ZXJ2YWx9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgaWYgKCFkaXNhYmxlZCAmJiAhdGhpcy5zdGF0ZS5pbnRlcnZhbElkKSB7XG4gICAgICAgICAgICBjb25zdCBpbnRlcnZhbElkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHJlcXVlc3RzIGZyb20gcGlsaW5nIHVwIC0gcmVsb2FkaW5nIGNhbiB0YWtlXG4gICAgICAgICAgICAgICAgLy8gbWFueSBzZWNvbmRzICgxMC0zMCkgYW5kIHRoZSBpbnRlcnZhbCBpcyAzcyBieSBkZWZhdWx0XG4gICAgICAgICAgICAgICAgaWYgKHJlbG9hZFJlcXVlc3Quc3RhdHVzICE9PSAnbG9hZGluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goYXBpVGh1bmsoJ19yZWxvYWQtaGFzaCcsICdHRVQnLCAncmVsb2FkUmVxdWVzdCcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBpbnRlcnZhbCk7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtpbnRlcnZhbElkfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmRpc2FibGVkICYmIHRoaXMuc3RhdGUuaW50ZXJ2YWxJZCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhckludGVydmFsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuUmVsb2FkZXIuZGVmYXVsdFByb3BzID0ge307XG5cblJlbG9hZGVyLnByb3BUeXBlcyA9IHtcbiAgICBpZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjb25maWc6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgcmVsb2FkUmVxdWVzdDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBkaXNwYXRjaDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgaW50ZXJ2YWw6IFByb3BUeXBlcy5udW1iZXJcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QoXG4gICAgc3RhdGUgPT4gKHtcbiAgICAgICAgY29uZmlnOiBzdGF0ZS5jb25maWcsXG4gICAgICAgIHJlbG9hZFJlcXVlc3Q6IHN0YXRlLnJlbG9hZFJlcXVlc3RcbiAgICB9KSxcbiAgICBkaXNwYXRjaCA9PiAoe2Rpc3BhdGNofSlcbikoUmVsb2FkZXIpO1xuIiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7cmVkbywgdW5kb30gZnJvbSAnLi4vLi4vYWN0aW9ucy9pbmRleC5qcyc7XG5pbXBvcnQgJy4vVG9vbGJhci5jc3MnO1xuXG5mdW5jdGlvbiBVbmNvbm5lY3RlZFRvb2xiYXIocHJvcHMpIHtcbiAgICBjb25zdCB7ZGlzcGF0Y2gsIGhpc3Rvcnl9ID0gcHJvcHM7XG5cbiAgICBjb25zdCB1bmRvTGluayA9IChcbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGtleT0ndW5kb0xpbmsnXG4gICAgICAgICAgICBjbGFzc05hbWU9J19kYXNoLXVuZG8tcmVkby1saW5rJ1xuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gZGlzcGF0Y2godW5kbyl9XG4gICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdfZGFzaC1pY29uLXVuZG8nPuKGujwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J19kYXNoLXVuZG8tcmVkby1sYWJlbCc+dW5kbzwvZGl2PlxuICAgICAgICA8L3NwYW4+XG4gICAgKTtcblxuICAgIGNvbnN0IHJlZG9MaW5rID0gKFxuICAgICAgICA8c3BhblxuICAgICAgICAgICAga2V5PSdyZWRvTGluaydcbiAgICAgICAgICAgIGNsYXNzTmFtZT0nX2Rhc2gtdW5kby1yZWRvLWxpbmsnXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBkaXNwYXRjaChyZWRvKX1cbiAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J19kYXNoLWljb24tcmVkbyc+4oa7PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtdW5kby1yZWRvLWxhYmVsJz5yZWRvPC9kaXY+XG4gICAgICAgIDwvc3Bhbj5cbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J19kYXNoLXVuZG8tcmVkbyc+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIHtoaXN0b3J5LnBhc3QubGVuZ3RoID4gMCA/IHVuZG9MaW5rIDogbnVsbH1cbiAgICAgICAgICAgICAgICB7aGlzdG9yeS5mdXR1cmUubGVuZ3RoID4gMCA/IHJlZG9MaW5rIDogbnVsbH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufVxuXG5VbmNvbm5lY3RlZFRvb2xiYXIucHJvcFR5cGVzID0ge1xuICAgIGhpc3Rvcnk6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZGlzcGF0Y2g6IFByb3BUeXBlcy5mdW5jXG59O1xuXG5jb25zdCBUb29sYmFyID0gY29ubmVjdChcbiAgICBzdGF0ZSA9PiAoe1xuICAgICAgICBoaXN0b3J5OiBzdGF0ZS5oaXN0b3J5XG4gICAgfSksXG4gICAgZGlzcGF0Y2ggPT4gKHtkaXNwYXRjaH0pXG4pKFVuY29ubmVjdGVkVG9vbGJhcik7XG5cbmV4cG9ydCBkZWZhdWx0IFRvb2xiYXI7XG4iLCJpbXBvcnQgUmVhY3QsIHtDb21wb25lbnQsIHVzZVN0YXRlLCB1c2VNZW1vLCB1c2VFZmZlY3QsIHVzZVJlZn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7Y29ubmVjdCwgdXNlU2VsZWN0b3J9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBDeXRvc2NhcGUgZnJvbSAnY3l0b3NjYXBlJztcbmltcG9ydCBDeXRvc2NhcGVDb21wb25lbnQgZnJvbSAncmVhY3QtY3l0b3NjYXBlanMnO1xuaW1wb3J0IGRhZ3JlIGZyb20gJ2N5dG9zY2FwZS1kYWdyZSc7XG5pbXBvcnQgZmNvc2UgZnJvbSAnY3l0b3NjYXBlLWZjb3NlJztcbmltcG9ydCB7SlNPTlRyZWV9IGZyb20gJ3JlYWN0LWpzb24tdHJlZSc7XG5pbXBvcnQge2tleXMsIG1lcmdlUmlnaHQsIG9taXQsIHBhdGgsIHZhbHVlc30gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQge2dldFBhdGh9IGZyb20gJy4uLy4uLy4uL2FjdGlvbnMvcGF0aHMnO1xuaW1wb3J0IHtzdHJpbmdpZnlJZH0gZnJvbSAnLi4vLi4vLi4vYWN0aW9ucy9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHtvbkVycm9yfSBmcm9tICcuLi8uLi8uLi9hY3Rpb25zJztcblxuaW1wb3J0ICcuL0NhbGxiYWNrR3JhcGhDb250YWluZXIuY3NzJztcbmltcG9ydCBzdHlsZXNoZWV0IGZyb20gJy4vQ2FsbGJhY2tHcmFwaENvbnRhaW5lclN0eWxlc2hlZXQnO1xuaW1wb3J0IHtcbiAgICB1cGRhdGVTZWxlY3RlZE5vZGUsXG4gICAgdXBkYXRlQ2hhbmdlZFByb3BzLFxuICAgIHVwZGF0ZUNhbGxiYWNrXG59IGZyb20gJy4vQ2FsbGJhY2tHcmFwaEVmZmVjdHMnO1xuXG5DeXRvc2NhcGUudXNlKGRhZ3JlKTtcbkN5dG9zY2FwZS51c2UoZmNvc2UpO1xuXG4vKlxuICogR2VuZXJhdGVzIGFsbCB0aGUgZWxlbWVudHMgKG5vZGVzLCBlZGdlcykgZm9yIHRoZSBkZXBlbmRlbmN5IGdyYXBoLlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUVsZW1lbnRzKGdyYXBocywgcHJvZmlsZSwgZXh0cmFMaW5rcykge1xuICAgIGNvbnN0IGNvbnN1bWVkID0gW107XG4gICAgY29uc3QgZWxlbWVudHMgPSBbXTtcbiAgICBjb25zdCBzdHJ1Y3R1cmUgPSB7fTtcblxuICAgIGZ1bmN0aW9uIHJlY29yZE5vZGUoaWQsIHJhd1Byb3BlcnR5KSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5ID0gcmF3UHJvcGVydHkuc3BsaXQoJ0AnKVswXTtcbiAgICAgICAgY29uc3QgaWRTdHIgPSBzdHJpbmdpZnlJZChpZCk7XG4gICAgICAgIGNvbnN0IGlkVHlwZSA9IHR5cGVvZiBpZCA9PT0gJ29iamVjdCcgPyAnd2lsZGNhcmQnIDogJ2NvbXBvbmVudCc7XG5cbiAgICAgICAgLy8gZGFncmUgbGF5b3V0IGhhcyBwcm9ibGVtcyB3aXRoIGVnIGB3aWR0aGAgcHJvcGVydHkgLSBzbyBwcmVwZW5kIGFuIFhcbiAgICAgICAgY29uc3QgcGFyZW50SWQgPSBpZFN0cjtcbiAgICAgICAgY29uc3QgY2hpbGRJZCA9IGAke3BhcmVudElkfS5YJHtwcm9wZXJ0eX1gO1xuXG4gICAgICAgIGlmICghY29uc3VtZWQuaW5jbHVkZXMocGFyZW50SWQpKSB7XG4gICAgICAgICAgICBjb25zdW1lZC5wdXNoKHBhcmVudElkKTtcbiAgICAgICAgICAgIGVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHBhcmVudElkLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogaWRTdHIsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IGlkVHlwZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3RydWN0dXJlW3BhcmVudElkXSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb25zdW1lZC5pbmNsdWRlcyhjaGlsZElkKSkge1xuICAgICAgICAgICAgY29uc3VtZWQucHVzaChjaGlsZElkKTtcbiAgICAgICAgICAgIGVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGNoaWxkSWQsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBwcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBwYXJlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3Byb3BlcnR5J1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3RydWN0dXJlW3BhcmVudElkXS5wdXNoKGNoaWxkSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkSWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVjb3JkRWRnZShzb3VyY2UsIHRhcmdldCwgdHlwZSkge1xuICAgICAgICBlbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIChncmFwaHMuY2FsbGJhY2tzIHx8IFtdKS5mb3JFYWNoKChjYWxsYmFjaywgaSkgPT4ge1xuICAgICAgICBjb25zdCBjYiA9IGBfX2Rhc2hfY2FsbGJhY2tfXy4ke2NhbGxiYWNrLm91dHB1dH1gO1xuICAgICAgICBjb25zdCBjYlByb2ZpbGUgPSBwcm9maWxlLmNhbGxiYWNrc1tjYWxsYmFjay5vdXRwdXRdIHx8IHt9O1xuICAgICAgICBjb25zdCBjb3VudCA9IGNiUHJvZmlsZS5jb3VudCB8fCAwO1xuICAgICAgICBjb25zdCB0aW1lID0gY2JQcm9maWxlLnRvdGFsIHx8IDA7XG5cbiAgICAgICAgZWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgaWQ6IGNiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBgY2FsbGJhY2suJHtpfWAsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2NhbGxiYWNrJyxcbiAgICAgICAgICAgICAgICBtb2RlOiBjYWxsYmFjay5jbGllbnRzaWRlX2Z1bmN0aW9uID8gJ2NsaWVudCcgOiAnc2VydmVyJyxcbiAgICAgICAgICAgICAgICBjb3VudDogY291bnQsXG4gICAgICAgICAgICAgICAgdGltZTogY291bnQgPiAwID8gTWF0aC5yb3VuZCh0aW1lIC8gY291bnQpIDogMCxcbiAgICAgICAgICAgICAgICBsb2FkaW5nU2V0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgIGVycm9yU2V0OiBEYXRlLm5vdygpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNhbGxiYWNrLm91dHB1dHMubWFwKCh7aWQsIHByb3BlcnR5fSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9kZUlkID0gcmVjb3JkTm9kZShpZCwgcHJvcGVydHkpO1xuICAgICAgICAgICAgcmVjb3JkRWRnZShjYiwgbm9kZUlkLCAnb3V0cHV0Jyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNhbGxiYWNrLmlucHV0cy5tYXAoKHtpZCwgcHJvcGVydHl9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub2RlSWQgPSByZWNvcmROb2RlKGlkLCBwcm9wZXJ0eSk7XG4gICAgICAgICAgICByZWNvcmRFZGdlKG5vZGVJZCwgY2IsICdpbnB1dCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjYWxsYmFjay5zdGF0ZS5tYXAoKHtpZCwgcHJvcGVydHl9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub2RlSWQgPSByZWNvcmROb2RlKGlkLCBwcm9wZXJ0eSk7XG4gICAgICAgICAgICByZWNvcmRFZGdlKG5vZGVJZCwgY2IsICdzdGF0ZScpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIHB1bGwgdG9nZXRoZXIgcHJvcHMgaW4gdGhlIHNhbWUgY29tcG9uZW50XG4gICAgaWYgKGV4dHJhTGlua3MpIHtcbiAgICAgICAgdmFsdWVzKHN0cnVjdHVyZSkuZm9yRWFjaChjaGlsZElkcyA9PiB7XG4gICAgICAgICAgICBjaGlsZElkcy5mb3JFYWNoKGNoaWxkRnJvbSA9PiB7XG4gICAgICAgICAgICAgICAgY2hpbGRJZHMuZm9yRWFjaChjaGlsZFRvID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRnJvbSAhPT0gY2hpbGRUbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkRWRnZShjaGlsZEZyb20sIGNoaWxkVG8sICdoaWRkZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50cztcbn1cblxuZnVuY3Rpb24gcmVkdWNlU3RhdHVzKHN0YXR1cykge1xuICAgIGlmIChrZXlzKHN0YXR1cykubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHJldHVybiBzdGF0dXMubGF0ZXN0O1xuICAgIH1cbiAgICByZXR1cm4gc3RhdHVzO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuT3V0cHV0cyhyZXMpIHtcbiAgICBjb25zdCBvdXRwdXRzID0ge307XG4gICAgZm9yIChjb25zdCBpZFN0ciBpbiByZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHJlc1tpZFN0cl0pIHtcbiAgICAgICAgICAgIG91dHB1dHNbaWRTdHIgKyAnLicgKyBwcm9wXSA9IHJlc1tpZFN0cl1bcHJvcF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dHM7XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5JbnB1dHMoaW5BcnJheSwgZmluYWwpIHtcbiAgICAoaW5BcnJheSB8fCBbXSkuZm9yRWFjaChpbkl0ZW0gPT4ge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpbkl0ZW0pKSB7XG4gICAgICAgICAgICBmbGF0dGVuSW5wdXRzKGluSXRlbSwgZmluYWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qge2lkLCBwcm9wZXJ0eSwgdmFsdWV9ID0gaW5JdGVtO1xuICAgICAgICAgICAgZmluYWxbc3RyaW5naWZ5SWQoaWQpICsgJy4nICsgcHJvcGVydHldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZmluYWw7XG59XG5cbmZ1bmN0aW9uIGNsZWFuT3V0cHV0SWQob3V0cHV0SWQpIHtcbiAgICByZXR1cm4gb3V0cHV0SWRcbiAgICAgICAgLnJlcGxhY2UoLyheXFwuXFwufFxcLlxcLiQpL2csICcnKVxuICAgICAgICAuc3BsaXQoJy4uLicpXG4gICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAoYWdnLCBuZXh0KSA9PlxuICAgICAgICAgICAgICAgIGFnZy5jb25jYXQoXG4gICAgICAgICAgICAgICAgICAgIG5leHQucmVwbGFjZSgvKC4qXFwuLiopKEAuKykkLywgKGEsIGIpID0+IGIgKyAnIChEdXBsaWNhdGUpJylcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgW11cbiAgICAgICAgKVxuICAgICAgICAuam9pbignLi4uJyk7XG59XG5cbi8vIGxlbignX19kYXNoX2NhbGxiYWNrX18uJylcbmNvbnN0IGNiUHJlZml4TGVuID0gMTg7XG5cbmNvbnN0IGRhZ3JlTGF5b3V0ID0ge1xuICAgIG5hbWU6ICdkYWdyZScsXG4gICAgcGFkZGluZzogMTAsXG4gICAgcmFua2VyOiAndGlnaHQtdHJlZSdcbn07XG5cbmNvbnN0IGZvcmNlTGF5b3V0ID0ge25hbWU6ICdmY29zZScsIHBhZGRpbmc6IDEwLCBhbmltYXRlOiBmYWxzZX07XG5cbmNvbnN0IGxheW91dHMgPSB7XG4gICAgJ3RvcC1kb3duJzogey4uLmRhZ3JlTGF5b3V0LCBzcGFjaW5nRmFjdG9yOiAwLjh9LFxuICAgICdsZWZ0LXJpZ2h0Jzogey4uLmRhZ3JlTGF5b3V0LCBub2RlU2VwOiAwLCByYW5rU2VwOiA4MCwgcmFua0RpcjogJ0xSJ30sXG4gICAgZm9yY2U6IGZvcmNlTGF5b3V0LFxuICAgICdmb3JjZS1sb29zZSc6IGZvcmNlTGF5b3V0XG59O1xuXG5mdW5jdGlvbiBDYWxsYmFja0dyYXBoKCkge1xuICAgIC8vIEdyYWIgaXRlbXMgZnJvbSB0aGUgcmVkdXggc3RvcmUuXG4gICAgY29uc3QgcGF0aHMgPSB1c2VTZWxlY3RvcihzdGF0ZSA9PiBzdGF0ZS5wYXRocyk7XG4gICAgY29uc3QgbGF5b3V0ID0gdXNlU2VsZWN0b3Ioc3RhdGUgPT4gc3RhdGUubGF5b3V0KTtcbiAgICBjb25zdCBncmFwaHMgPSB1c2VTZWxlY3RvcihzdGF0ZSA9PiBzdGF0ZS5ncmFwaHMpO1xuICAgIGNvbnN0IHByb2ZpbGUgPSB1c2VTZWxlY3RvcihzdGF0ZSA9PiBzdGF0ZS5wcm9maWxlKTtcbiAgICBjb25zdCBjaGFuZ2VkID0gdXNlU2VsZWN0b3Ioc3RhdGUgPT4gc3RhdGUuY2hhbmdlZCk7XG4gICAgY29uc3QgbGlmZWN5Y2xlU3RhdGUgPSB1c2VTZWxlY3RvcihzdGF0ZSA9PiBzdGF0ZS5hcHBMaWZlY3ljbGUpO1xuXG4gICAgLy8gS2VlcCB0cmFjayBvZiBjeXRvc2NhcGUgcmVmZXJlbmNlIGFuZCB1c2VyIHNlbGVjdGVkIGl0ZW1zLlxuICAgIGNvbnN0IFtzZWxlY3RlZCwgc2V0U2VsZWN0ZWRdID0gdXNlU3RhdGUobnVsbCk7XG4gICAgY29uc3QgW2N5dG9zY2FwZSwgc2V0Q3l0b3NjYXBlXSA9IHVzZVN0YXRlKG51bGwpO1xuXG4gICAgY29uc3Qge2dyYXBoTGF5b3V0fSA9IHByb2ZpbGU7XG4gICAgY29uc3QgY2hvc2VuVHlwZSA9IGdyYXBoTGF5b3V0Py5fY2hvc2VuVHlwZTtcbiAgICBjb25zdCBsYXlvdXRTZWxlY3RvciA9IHVzZVJlZihudWxsKTtcbiAgICBjb25zdCBbbGF5b3V0VHlwZSwgc2V0TGF5b3V0VHlwZV0gPSB1c2VTdGF0ZShjaG9zZW5UeXBlIHx8ICd0b3AtZG93bicpO1xuXG4gICAgLy8gR2VuZXJhdGUgYW5kIG1lbW9pemUgdGhlIGVsZW1lbnRzLlxuICAgIGNvbnN0IGVsZW1lbnRzID0gdXNlTWVtbyhcbiAgICAgICAgKCkgPT4gZ2VuZXJhdGVFbGVtZW50cyhncmFwaHMsIHByb2ZpbGUsIGxheW91dFR5cGUgPT09ICdmb3JjZScpLFxuICAgICAgICBbZ3JhcGhzLCBsYXlvdXRUeXBlXVxuICAgICk7XG5cbiAgICAvLyBDdXN0b20gaG9vayB0byBtYWtlIHN1cmUgY3l0b3NjYXBlIGlzIGxvYWRlZC5cbiAgICBjb25zdCB1c2VDeXRvc2NhcGVFZmZlY3QgPSAoZWZmZWN0LCBjb25kaXRpb24pID0+IHtcbiAgICAgICAgdXNlRWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4gKGN5dG9zY2FwZSAmJiBlZmZlY3QoY3l0b3NjYXBlKSkgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29uZGl0aW9uXG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudChpZCkge1xuICAgICAgICAvLyBmb3Igbm93IGlnbm9yZSBwYXR0ZXJuLW1hdGNoaW5nIElEc1xuICAgICAgICAvLyB0byBkbyBiZXR0ZXIgd2UgbWF5IG5lZWQgdG8gc3RvcmUgdGhlICphY3R1YWwqIElEcyB1c2VkIGZvciBlYWNoXG4gICAgICAgIC8vIGNhbGxiYWNrIGludm9jYXRpb24sIHNpbmNlIHRoZXkgbmVlZCBub3QgbWF0Y2ggd2hhdCdzIG9uIHRoZSBwYWdlIG5vdy5cbiAgICAgICAgaWYgKGlkLmNoYXJBdCgwKSA9PT0gJ3snKSB7XG4gICAgICAgICAgICBoYXNQYXR0ZXJucyA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlkUGF0aCA9IGdldFBhdGgocGF0aHMsIGlkKTtcbiAgICAgICAgcmV0dXJuIGlkUGF0aCA/IHBhdGgoaWRQYXRoLCBsYXlvdXQpIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFByb3BWYWx1ZShkYXRhKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGdldENvbXBvbmVudChkYXRhLnBhcmVudCk7XG4gICAgICAgIHJldHVybiBwYXJlbnQgPyBwYXJlbnQucHJvcHNbZGF0YS5sYWJlbF0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0UHJlc2V0TGF5b3V0KHtjeX0pIHtcbiAgICAgICAgY29uc3QgcG9zaXRpb25zID0ge307XG4gICAgICAgIGN5Lm5vZGVzKCkuZWFjaChuID0+IHtcbiAgICAgICAgICAgIHBvc2l0aW9uc1tuLmlkKCldID0gbi5wb3NpdGlvbigpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBIYWNrISBXZSdyZSBtdXRhdGluZyB0aGUgcmVkdXggc3RvcmUgZGlyZWN0bHkgaGVyZSwgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gZGlzcGF0Y2hpbmcgYW4gYWN0aW9uLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdGhpcyB0byB0cmlnZ2VyIGFcbiAgICAgICAgLy8gcmVyZW5kZXIsIHdlIGp1c3Qgd2FudCB0aGUgbGF5b3V0IHRvIHBlcnNpc3Qgd2hlbiB0aGUgY2FsbGJhY2sgZ3JhcGhcbiAgICAgICAgLy8gaXMgcmVyZW5kZXJlZCAtIGVpdGhlciBiZWNhdXNlIHRoZXJlJ3MgbmV3IHByb2ZpbGUgaW5mb3JtYXRpb24gdG9cbiAgICAgICAgLy8gZGlzcGxheSBvciBiZWNhdXNlIHRoZSBncmFwaCB3YXMgY2xvc2VkIGFuZCByZW9wZW5lZC4gVGhlIGxhdHRlciBpc1xuICAgICAgICAvLyB0aGUgcmVhc29uIHdlJ3JlIG5vdCB1c2luZyBjb21wb25lbnQgc3RhdGUgdG8gc3RvcmUgdGhlIGxheW91dC5cbiAgICAgICAgcHJvZmlsZS5ncmFwaExheW91dCA9IHtcbiAgICAgICAgICAgIG5hbWU6ICdwcmVzZXQnLFxuICAgICAgICAgICAgZml0OiBmYWxzZSxcbiAgICAgICAgICAgIHBvc2l0aW9ucyxcbiAgICAgICAgICAgIHpvb206IGN5Lnpvb20oKSxcbiAgICAgICAgICAgIHBhbjogY3kucGFuKCksXG4gICAgICAgICAgICBfY2hvc2VuVHlwZTogbGF5b3V0U2VsZWN0b3IuY3VycmVudD8udmFsdWVcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBZGRzIGNhbGxiYWNrcyBvbmNlIGN5Y3Rvc2NhcGUgaXMgaW5pdGlhbGl6ZWQuXG4gICAgdXNlQ3l0b3NjYXBlRWZmZWN0KFxuICAgICAgICBjeSA9PiB7XG4gICAgICAgICAgICBjeXRvc2NhcGUub24oJ3RhcCcsICdub2RlJywgZSA9PiBzZXRTZWxlY3RlZChlLnRhcmdldCkpO1xuICAgICAgICAgICAgY3l0b3NjYXBlLm9uKCd0YXAnLCBlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IGN5KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkKG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY3l0b3NjYXBlLm9uKCd6b29tJywgc2V0UHJlc2V0TGF5b3V0KTtcbiAgICAgICAgICAgIGN5dG9zY2FwZS5vbigncGFuJywgc2V0UHJlc2V0TGF5b3V0KTtcbiAgICAgICAgICAgIGN5dG9zY2FwZS5ub2RlcygpLm9uKCdwb3NpdGlvbicsIHNldFByZXNldExheW91dCk7XG4gICAgICAgIH0sXG4gICAgICAgIFtjeXRvc2NhcGVdXG4gICAgKTtcblxuICAgIC8vIFNldCBub2RlIGNsYXNzZXMgb24gc2VsZWN0ZWQuXG4gICAgdXNlQ3l0b3NjYXBlRWZmZWN0KFxuICAgICAgICBjeSA9PiBzZWxlY3RlZCAmJiB1cGRhdGVTZWxlY3RlZE5vZGUoY3ksIHNlbGVjdGVkLmRhdGEoKS5pZCksXG4gICAgICAgIFtzZWxlY3RlZF1cbiAgICApO1xuXG4gICAgLy8gRmxhc2ggY2xhc3NlcyB3aGVuIHByb3BzIGNoYW5nZS4gVXNlcyBjaGFuZ2VkIGFzIGEgdHJpZ2dlci4gQWxzb1xuICAgIC8vIGZsYXNoIGFsbCBpbnB1dCBlZGdlcyBvcmlnaW5hdGluZyBmcm9tIHRoaXMgbm9kZSBhbmQgaGlnaGxpZ2h0XG4gICAgLy8gdGhlIHN1YnRyZWUgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0ZWQgbm9kZS5cbiAgICB1c2VDeXRvc2NhcGVFZmZlY3QoXG4gICAgICAgIGN5ID0+IGNoYW5nZWQgJiYgdXBkYXRlQ2hhbmdlZFByb3BzKGN5LCBjaGFuZ2VkLmlkLCBjaGFuZ2VkLnByb3BzKSxcbiAgICAgICAgW2NoYW5nZWRdXG4gICAgKTtcblxuICAgIC8vIFVwZGF0ZSBjYWxsYmFja3MgZnJvbSBwcm9maWxpbmcgaW5mb3JtYXRpb24uXG4gICAgdXNlQ3l0b3NjYXBlRWZmZWN0KFxuICAgICAgICBjeSA9PlxuICAgICAgICAgICAgcHJvZmlsZS51cGRhdGVkLmZvckVhY2goY2IgPT5cbiAgICAgICAgICAgICAgICB1cGRhdGVDYWxsYmFjayhjeSwgY2IsIHByb2ZpbGUuY2FsbGJhY2tzW2NiXSlcbiAgICAgICAgICAgICksXG4gICAgICAgIFtwcm9maWxlLnVwZGF0ZWRdXG4gICAgKTtcblxuICAgIGlmIChsaWZlY3ljbGVTdGF0ZSAhPT0gJ0hZRFJBVEVEJykge1xuICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSB0b28gZWFybHkgLSBtb3N0IGxpa2VseSBkdXJpbmcgaG90IHJlbG9hZGluZyAtIHRoZW5cbiAgICAgICAgLy8gd2UgbmVlZCB0byBiYWlsIG91dCBhbmQgd2FpdCBmb3IgdGhlIGZ1bGwgc3RhdGUgdG8gYmUgYXZhaWxhYmxlXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1jYWxsYmFjay1kYWctLWNvbnRhaW5lcic+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtY2FsbGJhY2stZGFnLS1tZXNzYWdlJz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5XYWl0aW5nIGZvciBhcHAgdG8gYmUgcmVhZHkuLi48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIEZJWE1FOiBNb3ZlIHRvIGEgbmV3IGNvbXBvbmVudD9cbiAgICAvLyBHZW5lcmF0ZSB0aGUgZWxlbWVudCBpbnRyb3NwZWN0aW9uIGRhdGEuXG4gICAgbGV0IGVsZW1lbnROYW1lID0gJyc7XG4gICAgbGV0IGVsZW1lbnRJbmZvID0ge307XG4gICAgbGV0IGhhc1BhdHRlcm5zID0gZmFsc2U7XG5cbiAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHNlbGVjdGVkLmRhdGEoKTtcblxuICAgICAgICBzd2l0Y2ggKGRhdGEudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnY29tcG9uZW50Jzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3QgPSBvbWl0KFsnaWQnXSwgZ2V0Q29tcG9uZW50KGRhdGEuaWQpPy5wcm9wcyk7XG4gICAgICAgICAgICAgICAgZWxlbWVudEluZm8gPSByZXN0O1xuICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gZGF0YS5pZDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSAncHJvcGVydHknOiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSBkYXRhLnBhcmVudDtcbiAgICAgICAgICAgICAgICBlbGVtZW50SW5mb1tkYXRhLmxhYmVsXSA9IGdldFByb3BWYWx1ZShkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2FsbGJhY2tcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50SW5mby50eXBlID0gZGF0YS5tb2RlO1xuXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHVpZCBhbmQgc2V0IHByb2ZpbGUuXG4gICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tPdXRwdXRJZCA9IGRhdGEuaWQuc2xpY2UoY2JQcmVmaXhMZW4pO1xuICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gY2xlYW5PdXRwdXRJZChjYWxsYmFja091dHB1dElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYlByb2ZpbGUgPSBwcm9maWxlLmNhbGxiYWNrc1tjYWxsYmFja091dHB1dElkXTtcbiAgICAgICAgICAgICAgICBpZiAoY2JQcm9maWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yayxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgICAgICAgICAgIH0gPSBjYlByb2ZpbGU7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXZnID0gdiA9PiBNYXRoLnJvdW5kKHYgLyAoY291bnQgfHwgMSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvWydjYWxsIGNvdW50J10gPSBjb3VudDtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluZm8uc3RhdHVzID0gcmVkdWNlU3RhdHVzKHN0YXR1cyk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltaW5nID0gKGVsZW1lbnRJbmZvWyd0aW1lIChhdmcgbWlsbGlzZWNvbmRzKSddID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IGF2Zyh0b3RhbCksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlOiBhdmcoY29tcHV0ZSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLm1vZGUgPT09ICdzZXJ2ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1pbmcubmV0d29yayA9IGF2ZyhuZXR3b3JrLnRpbWUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5mb1snZGF0YSB0cmFuc2ZlciAoYXZnIGJ5dGVzKSddID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkOiBhdmcobmV0d29yay5kb3dubG9hZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBsb2FkOiBhdmcobmV0d29yay51cGxvYWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHJlc291cmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGltaW5nWyd1c2VyOiAnICsga2V5XSA9IGF2ZyhyZXNvdXJjZXNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5mby5vdXRwdXRzID0gZmxhdHRlbk91dHB1dHMocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluZm8uaW5wdXRzID0gZmxhdHRlbklucHV0cyhpbnB1dHMsIHt9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluZm8uc3RhdGUgPSBmbGF0dGVuSW5wdXRzKHN0YXRlLCB7fSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluZm9bJ2NhbGwgY291bnQnXSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY3lMYXlvdXQgPVxuICAgICAgICBjaG9zZW5UeXBlID09PSBsYXlvdXRUeXBlXG4gICAgICAgICAgICA/IGdyYXBoTGF5b3V0XG4gICAgICAgICAgICA6IG1lcmdlUmlnaHQobGF5b3V0c1tsYXlvdXRUeXBlXSwge3JlYWR5OiBzZXRQcmVzZXRMYXlvdXR9KTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWNhbGxiYWNrLWRhZy0tY29udGFpbmVyJz5cbiAgICAgICAgICAgIDxDeXRvc2NhcGVDb21wb25lbnRcbiAgICAgICAgICAgICAgICBzdHlsZT17e3dpZHRoOiAnMTAwJScsIGhlaWdodDogJzEwMCUnfX1cbiAgICAgICAgICAgICAgICBjeT17c2V0Q3l0b3NjYXBlfVxuICAgICAgICAgICAgICAgIGVsZW1lbnRzPXtlbGVtZW50c31cbiAgICAgICAgICAgICAgICBsYXlvdXQ9e2N5TGF5b3V0fVxuICAgICAgICAgICAgICAgIHN0eWxlc2hlZXQ9e3N0eWxlc2hlZXR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAge3NlbGVjdGVkID8gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWNhbGxiYWNrLWRhZy0taW5mbyc+XG4gICAgICAgICAgICAgICAgICAgIHtoYXNQYXR0ZXJucyA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyBpc24ndCBzdXBwb3J0ZWQgZm9yIHBhdHRlcm4tbWF0Y2hpbmcgSURzIGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB0aW1lXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICAgIDxKU09OVHJlZVxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT17ZWxlbWVudEluZm99XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGVtZT0nc3VtbWVyZnJ1aXQnXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFJlbmRlcmVyPXtfa2V5cyA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9rZXlzLmxlbmd0aCA9PT0gMSA/IGVsZW1lbnROYW1lIDogX2tleXNbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGdldEl0ZW1TdHJpbmc9eyh0eXBlLCBkYXRhLCBpdGVtVHlwZSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPntpdGVtVHlwZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkRXhwYW5kTm9kZT17KGtleU5hbWUsIGRhdGEsIGxldmVsKSA9PiBsZXZlbCA8IDF9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2Rhc2gtY2FsbGJhY2stZGFnLS1sYXlvdXRTZWxlY3RvcidcbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17ZSA9PiBzZXRMYXlvdXRUeXBlKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICB2YWx1ZT17bGF5b3V0VHlwZX1cbiAgICAgICAgICAgICAgICByZWY9e2xheW91dFNlbGVjdG9yfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtrZXlzKGxheW91dHMpLm1hcChrID0+IChcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT17a30ga2V5PXtrfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtrfVxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufVxuXG5DYWxsYmFja0dyYXBoLnByb3BUeXBlcyA9IHt9O1xuXG5jbGFzcyBVbmNvbm5lY3RlZENhbGxiYWNrR3JhcGhDb250YWluZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtoYXNFcnJvcjogZmFsc2V9O1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoXykge1xuICAgICAgICByZXR1cm4ge2hhc0Vycm9yOiB0cnVlfTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRDYXRjaChlcnJvciwgaW5mbykge1xuICAgICAgICBjb25zdCB7ZGlzcGF0Y2h9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICBvbkVycm9yKHtcbiAgICAgICAgICAgICAgICBteUlEOiB0aGlzLnN0YXRlLm15SUQsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2Zyb250RW5kJyxcbiAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICBpbmZvXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuaGFzRXJyb3IgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1jYWxsYmFjay1kYWctLWNvbnRhaW5lcic+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtY2FsbGJhY2stZGFnLS1tZXNzYWdlJz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5Pb3BzISBUaGUgY2FsbGJhY2sgZ3JhcGggdGhyZXcgYW4gZXJyb3IuPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+Q2hlY2sgdGhlIGVycm9yIGxpc3QgZm9yIGRldGFpbHMuPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxDYWxsYmFja0dyYXBoIC8+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5VbmNvbm5lY3RlZENhbGxiYWNrR3JhcGhDb250YWluZXIucHJvcFR5cGVzID0ge1xuICAgIGRpc3BhdGNoOiBQcm9wVHlwZXMuZnVuY1xufTtcblxuY29uc3QgQ2FsbGJhY2tHcmFwaENvbnRhaW5lciA9IGNvbm5lY3QobnVsbCwgZGlzcGF0Y2ggPT4gKHtkaXNwYXRjaH0pKShcbiAgICBVbmNvbm5lY3RlZENhbGxiYWNrR3JhcGhDb250YWluZXJcbik7XG5cbmV4cG9ydCB7Q2FsbGJhY2tHcmFwaENvbnRhaW5lcn07XG4iLCJjb25zdCBzdHlsZXNoZWV0ID0gW1xuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICcqJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICdmb250LXNpemUnOiAxMixcbiAgICAgICAgICAgICdmb250LWZhbWlseSc6ICdcIkFyaWFsXCIsIHNhbnMtc2VyaWYnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ2VkZ2UnLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgd2lkdGg6IDIsXG4gICAgICAgICAgICAnbGluZS1jb2xvcic6ICcjODg4ODg4JyxcbiAgICAgICAgICAgICd0YXJnZXQtYXJyb3ctY29sb3InOiAnIzg4ODg4OCcsXG4gICAgICAgICAgICAndGFyZ2V0LWFycm93LXNoYXBlJzogJ3RyaWFuZ2xlJyxcbiAgICAgICAgICAgICd0YXJnZXQtYXJyb3ctZmlsbCc6ICdmaWxsZWQnLFxuICAgICAgICAgICAgJ2Fycm93LXNjYWxlJzogMSxcbiAgICAgICAgICAgICdjdXJ2ZS1zdHlsZSc6ICdiZXppZXInLFxuICAgICAgICAgICAgJ2NvbnRyb2wtcG9pbnQtc3RlcC1zaXplJzogNDAsXG4gICAgICAgICAgICAndHJhbnNpdGlvbi1wcm9wZXJ0eSc6ICdsaW5lLWNvbG9yLCB0YXJnZXQtYXJyb3ctY29sb3InLFxuICAgICAgICAgICAgJ3RyYW5zaXRpb24tZHVyYXRpb24nOiAnMC4yNXMnLFxuICAgICAgICAgICAgJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJzogJ2Vhc2UtaW4tb3V0LXNpbmUnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ2VkZ2VbdHlwZT1cImhpZGRlblwiXScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnZWRnZVt0eXBlPVwib3V0cHV0XCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICdsaW5lLWNvbG9yJzogJyMwMDgwRDAnLFxuICAgICAgICAgICAgJ3RhcmdldC1hcnJvdy1jb2xvcic6ICcjMDA4MEQwJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdlZGdlW3R5cGU9XCJzdGF0ZVwiXScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAnbGluZS1zdHlsZSc6ICdkYXNoZWQnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ25vZGUnLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgY29sb3I6ICcjMzMzMzMzJyxcbiAgICAgICAgICAgIHBhZGRpbmc6IDYsXG4gICAgICAgICAgICAndGV4dC12YWxpZ24nOiAnY2VudGVyJyxcbiAgICAgICAgICAgICd0ZXh0LWhhbGlnbic6ICdjZW50ZXInLFxuICAgICAgICAgICAgJ2JvcmRlci13aWR0aCc6IDIsXG4gICAgICAgICAgICAnYm9yZGVyLW9wYWNpdHknOiAwLFxuICAgICAgICAgICAgJ2JvcmRlci1zdHlsZSc6ICdzb2xpZCcsXG4gICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJyM4ODg4ODgnLFxuICAgICAgICAgICAgJ3RyYW5zaXRpb24tcHJvcGVydHknOiAnYm9yZGVyLW9wYWNpdHknLFxuICAgICAgICAgICAgJ3RyYW5zaXRpb24tZHVyYXRpb24nOiAnMC4yNXMnLFxuICAgICAgICAgICAgJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJzogJ2Vhc2UtaW4tb3V0LXNpbmUnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ25vZGVbdHlwZT1cImNhbGxiYWNrXCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzNSxcbiAgICAgICAgICAgIGhlaWdodDogMjUsXG4gICAgICAgICAgICBzaGFwZTogJ3JvdW5kLXJlY3RhbmdsZScsXG4gICAgICAgICAgICBsYWJlbDogZSA9PiBgJHtlLmRhdGEoKS5jb3VudH1cXG4ke2UuZGF0YSgpLnRpbWV9IG1zYCxcbiAgICAgICAgICAgICd0ZXh0LXdyYXAnOiAnd3JhcCcsXG4gICAgICAgICAgICAndGV4dC1qdXN0aWZpY2F0aW9uJzogJ2NlbnRlcidcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnbm9kZVt0eXBlPVwiY2FsbGJhY2tcIl1bbW9kZT1cImNsaWVudFwiXScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBjb2xvcjogJyMzMjMzMzAnLFxuICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAnI0YwREI0RidcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnbm9kZVt0eXBlPVwiY2FsbGJhY2tcIl1bbW9kZT1cInNlcnZlclwiXScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBjb2xvcjogJyMzMjMzMzAnLFxuICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAnIzAwQ0M5NidcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnbm9kZVt0eXBlPVwiY29tcG9uZW50XCJdLCBub2RlW3R5cGU9XCJ3aWxkY2FyZFwiXScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICB3aWR0aDogJ2xhYmVsJyxcbiAgICAgICAgICAgIC8vIGhlaWdodDogJ2xhYmVsJyxcbiAgICAgICAgICAgIHNoYXBlOiAncmVjdGFuZ2xlJyxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGUgPT4gZS5kYXRhKCkubGFiZWwucmVwbGFjZSgvXCIvZywgJycpLFxuICAgICAgICAgICAgJ3RleHQtdmFsaWduJzogJ3RvcCcsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjQjlDMkNFJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdub2RlW3R5cGU9XCJwcm9wZXJ0eVwiXScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICB3aWR0aDogJ2xhYmVsJyxcbiAgICAgICAgICAgIGhlaWdodDogMjAsXG4gICAgICAgICAgICBzaGFwZTogJ3JlY3RhbmdsZScsXG4gICAgICAgICAgICBjb250ZW50OiAnZGF0YShsYWJlbCknLFxuICAgICAgICAgICAgY29sb3I6ICd3aGl0ZScsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjMTA5REZGJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICcuc2VsZWN0ZWQtbm9kZScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBnaG9zdDogJ3llcycsXG4gICAgICAgICAgICAnZ2hvc3Qtb2Zmc2V0LXgnOiAyLFxuICAgICAgICAgICAgJ2dob3N0LW9mZnNldC15JzogMixcbiAgICAgICAgICAgICdnaG9zdC1vcGFjaXR5JzogMC4yNSxcbiAgICAgICAgICAgICdib3JkZXItb3BhY2l0eSc6IDFcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnLnByb3AtY2hhbmdlZCwgLmNhbGxiYWNrLWxvYWRpbmcnLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICcjQ0M0M0I3JyxcbiAgICAgICAgICAgICdib3JkZXItd2lkdGgnOiAyLFxuICAgICAgICAgICAgJ2JvcmRlci1vcGFjaXR5JzogMVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICcuY2FsbGJhY2stZXJyb3InLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAnI0UxMzMyRSdcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnLnRyaWdnZXJlZCcsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAnbGluZS1jb2xvcic6ICcjQ0M0M0I3JyxcbiAgICAgICAgICAgICd0YXJnZXQtYXJyb3ctY29sb3InOiAnI0NDNDNCNydcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnLmluYWN0aXZlJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDAuNVxuICAgICAgICB9XG4gICAgfVxuXTtcblxuZXhwb3J0IGRlZmF1bHQgc3R5bGVzaGVldDtcbiIsImltcG9ydCB7U1RBVFVTLCBTVEFUVVNNQVB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9jb25zdGFudHMnO1xuXG4vKipcbiAqIGdldEVkZ2VUeXBlc1xuICpcbiAqIEZpbmRzIGFsbCBlZGdlcyBjb25uZWN0ZWQgdG8gYSBub2RlIGFuZCBzcGxpdHMgdGhlbSBieSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIC0gQ3l0b3NjYXBlIG5vZGUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSAtIE9iamVjdCBjb250YWluaW5nIHRoZSBlZGdlcywgc29ydGVkIGJ5IHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGdldEVkZ2VUeXBlcyhub2RlKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBub2RlLmNvbm5lY3RlZEVkZ2VzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5wdXQ6IGVsZW1lbnRzLmZpbHRlcignW3R5cGUgPSBcImlucHV0XCJdJyksXG4gICAgICAgIHN0YXRlOiBlbGVtZW50cy5maWx0ZXIoJ1t0eXBlID0gXCJzdGF0ZVwiXScpLFxuICAgICAgICBvdXRwdXQ6IGVsZW1lbnRzLmZpbHRlcignW3R5cGUgPSBcIm91dHB1dFwiXScpXG4gICAgfTtcbn1cblxuLyoqXG4gKiB1cGRhdGVTZWxlY3RlZFxuICpcbiAqIFVwZGF0ZXMgdGhlIGNsYXNzZXMgb2YgdGhlIHNlbGVjdGVkIG5vZGUgYW5kIHJlY2VudGVycyB0aGUgdmlld3BvcnQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGN5IC0gUmVmZXJlbmNlIHRvIHRoZSBjeXRvc2NhcGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBUaGUgaWQgb2YgdGhlIHNlbGVjdGVkIG5vZGUuXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IC0gY2xlYW51cCBmdW5jdGlvbiwgZm9yIHVzZUVmZmVjdCBob29rXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTZWxlY3RlZE5vZGUoY3ksIGlkKSB7XG4gICAgZnVuY3Rpb24gYXNjZW5kKG5vZGUsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgLy8gRklYTUU6IFNob3VsZCB3ZSBpbmNsdWRlIFN0YXRlIHBhcmVudHMgYnV0IG5vbi1yZWN1cnNpdmVseT9cbiAgICAgICAgY29uc3QgdHlwZSA9IG5vZGUuZGF0YSgpLnR5cGUgPT09ICdjYWxsYmFjaycgPyAnaW5wdXQnIDogJ291dHB1dCc7XG4gICAgICAgIGNvbnN0IGVkZ2VzID0gZ2V0RWRnZVR5cGVzKG5vZGUpW3R5cGVdO1xuICAgICAgICBjb25zdCBwYXJlbnRzID0gZWRnZXMuc291cmNlcygpO1xuICAgICAgICBjb2xsZWN0aW9uLm1lcmdlKGVkZ2VzKTtcbiAgICAgICAgY29sbGVjdGlvbi5tZXJnZShwYXJlbnRzKTtcbiAgICAgICAgaWYgKG5vZGUuZGF0YSgpLnR5cGUgPT09ICdwcm9wZXJ0eScpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24ubWVyZ2Uobm9kZS5hbmNlc3RvcnMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcGFyZW50cy5mb3JFYWNoKG5vZGUgPT4gYXNjZW5kKG5vZGUsIGNvbGxlY3Rpb24pKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXNjZW5kKG5vZGUsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IG5vZGUuZGF0YSgpLnR5cGUgPT09ICdjYWxsYmFjaycgPyAnb3V0cHV0JyA6ICdpbnB1dCc7XG4gICAgICAgIGNvbnN0IGVkZ2VzID0gZ2V0RWRnZVR5cGVzKG5vZGUpW3R5cGVdO1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGVkZ2VzLnRhcmdldHMoKTtcbiAgICAgICAgY29sbGVjdGlvbi5tZXJnZShlZGdlcyk7XG4gICAgICAgIGNvbGxlY3Rpb24ubWVyZ2UoY2hpbGRyZW4pO1xuICAgICAgICBpZiAobm9kZS5kYXRhKCkudHlwZSA9PT0gJ3Byb3BlcnR5Jykge1xuICAgICAgICAgICAgY29sbGVjdGlvbi5tZXJnZShub2RlLmFuY2VzdG9ycygpKTtcbiAgICAgICAgfVxuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKG5vZGUgPT4gZGVzY2VuZChub2RlLCBjb2xsZWN0aW9uKSk7XG4gICAgfVxuXG4gICAgaWYgKGlkKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBjeS5nZXRFbGVtZW50QnlJZChpZCk7XG5cbiAgICAgICAgLy8gSGlnaGxpZ2h0IHRoZSBzZWxlY3RlZCBub2RlLlxuXG4gICAgICAgIG5vZGUuYWRkQ2xhc3MoJ3NlbGVjdGVkLW5vZGUnKTtcblxuICAgICAgICAvLyBGaW5kIHRoZSBzdWJ0cmVlIHRoYXQgdGhlIG5vZGUgYmVsb25ncyB0by4gQSBzdWJ0cmVlIGNvbnRhaW5zXG4gICAgICAgIC8vIGFsbCBhbGwgYW5jZXN0b3JzIGFuZCBkZXNjZW5kYW50cyB0aGF0IGFyZSBjb25uZWN0ZWQgdmlhIElucHV0c1xuICAgICAgICAvLyBvciBPdXRwdXRzIChidXQgbm90IFN0YXRlKS5cblxuICAgICAgICAvLyBXQVJOSU5HOiBObyBjeWNsZSBkZXRlY3Rpb24hXG5cbiAgICAgICAgY29uc3Qgc3VidHJlZSA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgICAgc3VidHJlZS5tZXJnZShub2RlKTtcbiAgICAgICAgYXNjZW5kKG5vZGUsIHN1YnRyZWUpO1xuICAgICAgICBkZXNjZW5kKG5vZGUsIHN1YnRyZWUpO1xuXG4gICAgICAgIGNvbnN0IG90aGVyID0gc3VidHJlZS5hYnNvbHV0ZUNvbXBsZW1lbnQoKTtcbiAgICAgICAgb3RoZXIuYWRkQ2xhc3MoJ2luYWN0aXZlJyk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkLW5vZGUnKTtcbiAgICAgICAgICAgIG90aGVyLnJlbW92ZUNsYXNzKCdpbmFjdGl2ZScpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIHVwZGF0ZUNoYW5nZWRQcm9wXG4gKlxuICogRmxhc2hlcyBwcm9wZXJ0eSBub2RlcyB0aGF0IHVwZGF0ZWQgYW5kIGFueSBpbnB1dHMgdGhleSBhcmUgY29ubmVjdGVkIHRvLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjeSAtIFJlZmVyZW5jZSB0byB0aGUgY3l0b3NjYXBlIGluc3RhbmNlLlxuICogQHBhcmFtIHtTdHJpbmd9IGlkIC0gVGhlIGNvbXBvbmVudCBpZCB3aGljaCB1cGRhdGVkLlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzIC0gVGhlIHByb3BzIHRoYXQgdXBkYXRlZC5cbiAqIEBwYXJhbSB7TnVtYmVyfSBmbGFzaFRpbWUgLSBUaGUgdGltZSB0byBmbGFzaCBjbGFzc2VzIGZvciBpbiBtcy5cbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVDaGFuZ2VkUHJvcHMoY3ksIGlkLCBwcm9wcywgZmxhc2hUaW1lID0gNTAwKSB7XG4gICAgT2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBjeS5nZXRFbGVtZW50QnlJZChgJHtpZH0uJHtwcm9wfWApO1xuICAgICAgICBub2RlLmZsYXNoQ2xhc3MoJ3Byb3AtY2hhbmdlZCcsIGZsYXNoVGltZSk7XG4gICAgICAgIG5vZGUuZWRnZXNUbygnKicpXG4gICAgICAgICAgICAuZmlsdGVyKCdbdHlwZSA9IFwiaW5wdXRcIl0nKVxuICAgICAgICAgICAgLmZsYXNoQ2xhc3MoJ3RyaWdnZXJlZCcsIGZsYXNoVGltZSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogdXBkYXRlQ2FsbGJhY2tcbiAqXG4gKiBVcGRhdGVzIGEgY2FsbGJhY2sgbm9kZSB3aXRoIHByb2ZpbGluZyBpbmZvcm1hdGlvbiAoY2FsbCBjb3VudCwgYXZnIHRpbWUpXG4gKiBhbmQgYWRkcyBvciByZW1vdmVzIGNsYXNzZXMgYXMgbmVjZXNzYXJ5LiBDbGFzc2VzIGFyZSBhbHdheXMgYXNzZXJ0IGZvclxuICogYXQgbGVhc3QgZmxhc2hUaW1lIG1zIHNvIHRoYXQgdGhleSBjYW4gYmUgdmlzdWFsbHkgb2JzZXJ2ZWQuIFdoZW4gY2FsbGJhY2tzXG4gKiByZXNvbHZlLCBhbGwgb3V0cHV0IGVkZ2VzIGFyZSBmbGFzaGVkLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjeSAtIFJlZmVyZW5jZSB0byB0aGUgY3l0b3NjYXBlIGluc3RhbmNlLlxuICogQHBhcmFtIHtTdHJpbmd9IGlkIC0gVGhlIGlkIG9mIHRoZSBjYWxsYmFjayAoaS5lLiwgaXQncyBvdXRwdXQgaWRlbnRpZmllcilcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9maWxlIC0gVGhlIGNhbGxiYWNrIHByb2ZpbGluZyBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB7TnVtYmVyfSBmbGFzaFRpbWUgLSBUaGUgdGltZSB0byBmbGFzaCBjbGFzc2VzIGZvciBpbiBtcy5cbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVDYWxsYmFjayhjeSwgaWQsIHByb2ZpbGUsIGZsYXNoVGltZSA9IDUwMCkge1xuICAgIGNvbnN0IG5vZGUgPSBjeS5nZXRFbGVtZW50QnlJZChgX19kYXNoX2NhbGxiYWNrX18uJHtpZH1gKTtcbiAgICBjb25zdCB7Y291bnQsIHRvdGFsLCBzdGF0dXN9ID0gcHJvZmlsZTtcbiAgICBjb25zdCB7bGF0ZXN0fSA9IHN0YXR1cztcblxuICAgIC8vIFVwZGF0ZSBkYXRhLlxuICAgIGNvbnN0IGF2Z1RpbWUgPSBjb3VudCA+IDAgPyB0b3RhbCAvIGNvdW50IDogMDtcbiAgICBub2RlLmRhdGEoJ2NvdW50JywgY291bnQpO1xuICAgIG5vZGUuZGF0YSgndGltZScsIE1hdGgucm91bmQoYXZnVGltZSkpO1xuXG4gICAgLy8gRWl0aGVyIGZsYXNoIHRoZSBjbGFzc2VzIE9SIG1haW50YWluIGl0IGZvciBsb25nIGNhbGxiYWNrcy5cbiAgICBpZiAobGF0ZXN0ID09PSAnbG9hZGluZycpIHtcbiAgICAgICAgbm9kZS5kYXRhKCdsb2FkaW5nU2V0JywgRGF0ZS5ub3coKSk7XG4gICAgICAgIG5vZGUuYWRkQ2xhc3MoJ2NhbGxiYWNrLWxvYWRpbmcnKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuaGFzQ2xhc3MoJ2NhbGxiYWNrLWxvYWRpbmcnKSkge1xuICAgICAgICBjb25zdCB0aW1lTGVmdCA9IG5vZGUuZGF0YSgnbG9hZGluZ1NldCcpICsgZmxhc2hUaW1lIC0gRGF0ZS5ub3coKTtcbiAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgICgpID0+IG5vZGUucmVtb3ZlQ2xhc3MoJ2NhbGxiYWNrLWxvYWRpbmcnKSxcbiAgICAgICAgICAgIE1hdGgubWF4KHRpbWVMZWZ0LCAwKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICAgbGF0ZXN0ICE9PSAnbG9hZGluZycgJiZcbiAgICAgICAgbGF0ZXN0ICE9PSBTVEFUVVNNQVBbU1RBVFVTLk9LXSAmJlxuICAgICAgICBsYXRlc3QgIT09IFNUQVRVU01BUFtTVEFUVVMuUFJFVkVOVF9VUERBVEVdXG4gICAgKSB7XG4gICAgICAgIG5vZGUuZGF0YSgnZXJyb3JTZXQnLCBEYXRlLm5vdygpKTtcbiAgICAgICAgbm9kZS5hZGRDbGFzcygnY2FsbGJhY2stZXJyb3InKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuaGFzQ2xhc3MoJ2NhbGxiYWNrLWVycm9yJykpIHtcbiAgICAgICAgY29uc3QgdGltZUxlZnQgPSBub2RlLmRhdGEoJ2Vycm9yU2V0JykgKyBmbGFzaFRpbWUgLSBEYXRlLm5vdygpO1xuICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgKCkgPT4gbm9kZS5yZW1vdmVDbGFzcygnY2FsbGJhY2stZXJyb3InKSxcbiAgICAgICAgICAgIE1hdGgubWF4KHRpbWVMZWZ0LCAwKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIEZJWE1FOiBUaGlzIHdpbGwgZmxhc2ggYnJhbmNoZXMgdGhhdCByZXR1cm4gbm9fdXBkYXRlISFcbiAgICAvLyBJZiB0aGUgY2FsbGJhY2sgcmVzb2x2ZWQgcHJvcGVybHksIGZsYXNoIHRoZSBvdXRwdXRzLlxuICAgIGlmIChsYXRlc3QgPT09IFNUQVRVU01BUFtTVEFUVVMuT0tdKSB7XG4gICAgICAgIG5vZGUuZWRnZXNUbygnKicpLmZsYXNoQ2xhc3MoJ3RyaWdnZXJlZCcsIGZsYXNoVGltZSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge29uRXJyb3IsIHJldmVydH0gZnJvbSAnLi4vLi4vYWN0aW9ucyc7XG5cbmNsYXNzIENvbXBvbmVudEVycm9yQm91bmRhcnkgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIG15SUQ6IHByb3BzLmNvbXBvbmVudElkLFxuICAgICAgICAgICAgb2xkQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBoYXNFcnJvcjogZmFsc2VcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKF8pIHtcbiAgICAgICAgcmV0dXJuIHtoYXNFcnJvcjogdHJ1ZX07XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IsIGluZm8pIHtcbiAgICAgICAgY29uc3Qge2Rpc3BhdGNofSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgb25FcnJvcih7XG4gICAgICAgICAgICAgICAgbXlJRDogdGhpcy5zdGF0ZS5teUlELFxuICAgICAgICAgICAgICAgIHR5cGU6ICdmcm9udEVuZCcsXG4gICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgaW5mb1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgZGlzcGF0Y2gocmV2ZXJ0KTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcbiAgICAgICAgY29uc3QgcHJldkNoaWxkcmVuID0gcHJldlByb3BzLmNoaWxkcmVuO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5zdGF0ZS5oYXNFcnJvciAmJlxuICAgICAgICAgICAgcHJldkNoaWxkcmVuICE9PSBwcmV2U3RhdGUub2xkQ2hpbGRyZW4gJiZcbiAgICAgICAgICAgIHByZXZDaGlsZHJlbiAhPT0gdGhpcy5wcm9wcy5jaGlsZHJlblxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9uby1kaWQtdXBkYXRlLXNldC1zdGF0ZSAqL1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgb2xkQ2hpbGRyZW46IHByZXZDaGlsZHJlblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHtoYXNFcnJvciwgb2xkQ2hpbGRyZW59ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgcmV0dXJuIGhhc0Vycm9yID8gb2xkQ2hpbGRyZW4gOiB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgIH1cbn1cblxuQ29tcG9uZW50RXJyb3JCb3VuZGFyeS5wcm9wVHlwZXMgPSB7XG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5vYmplY3QsXG4gICAgY29tcG9uZW50SWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgZXJyb3I6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZGlzcGF0Y2g6IFByb3BUeXBlcy5mdW5jXG59O1xuXG5leHBvcnQgZGVmYXVsdCBDb21wb25lbnRFcnJvckJvdW5kYXJ5O1xuIiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgJy4vRnJvbnRFbmRFcnJvci5jc3MnO1xuaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDb2xsYXBzZUljb24gZnJvbSAnLi4vaWNvbnMvQ29sbGFwc2VJY29uLnN2Zyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICcuLi9QZXJjeS5jc3MnO1xuaW1wb3J0IHt1cmxCYXNlfSBmcm9tICcuLi8uLi8uLi9hY3Rpb25zL3V0aWxzJztcblxuaW1wb3J0IHdlcmt6ZXVnQ3NzIGZyb20gJy4uL3dlcmt6ZXVnY3NzJztcblxuY2xhc3MgRnJvbnRFbmRFcnJvciBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgY29sbGFwc2VkOiB0aGlzLnByb3BzLmlzTGlzdEl0ZW1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHtlLCBpbkFsZXJ0c1RyYXl9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY29uc3Qge2NvbGxhcHNlZH0gPSB0aGlzLnN0YXRlO1xuXG4gICAgICAgIGNvbnN0IGNhcmRDbGFzc2VzID1cbiAgICAgICAgICAgICdkYXNoLWVycm9yLWNhcmRfX2NvbnRlbnQnICtcbiAgICAgICAgICAgIChpbkFsZXJ0c1RyYXkgPyAnIGRhc2gtZXJyb3ItY2FyZC0tYWxlcnRzLXRyYXknIDogJycpO1xuXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWlubGluZS1jb21tZW50cyAqL1xuICAgICAgICBjb25zdCBlcnJvckhlYWRlciA9IChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3ItdG9wIHRlc3QtZGV2dG9vbHMtZXJyb3ItdG9nZ2xlJ1xuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHRoaXMuc2V0U3RhdGUoe2NvbGxhcHNlZDogIWNvbGxhcHNlZH0pfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvci10b3BfX2dyb3VwJz5cbiAgICAgICAgICAgICAgICAgICAg4puR77iPXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvcl9fdGl0bGUnPlxuICAgICAgICAgICAgICAgICAgICAgICAge2UuZXJyb3IubWVzc2FnZSB8fCAnRXJyb3InfVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvci10b3BfX2dyb3VwJz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yX190aW1lc3RhbXAgcGVyY3ktaGlkZSc+XG4gICAgICAgICAgICAgICAgICAgICAgICB7YCR7ZS50aW1lc3RhbXAudG9Mb2NhbGVUaW1lU3RyaW5nKCl9YH1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3JfX3RpbWVzdGFtcCBwZXJjeS1zaG93Jz5cbiAgICAgICAgICAgICAgICAgICAgICAgIHsvKiBTcGVjaWFsIHBlcmN5IHRpbWVzdGFtcCBmb3IgdmlzdWFsIHRlc3RpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBIaWRkZW4gZHVyaW5nIHJlZ3VsYXIgdXNhZ2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgKi99XG4gICAgICAgICAgICAgICAgICAgICAgICAwMDowMDowMCBQTVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgPENvbGxhcHNlSWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZGFzaC1mZS1lcnJvcl9fY29sbGFwc2UgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZWQgPyAnZGFzaC1mZS1lcnJvcl9fY29sbGFwc2UtLWZsaXBwZWQnIDogJydcbiAgICAgICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdGhpcy5zZXRTdGF0ZSh7Y29sbGFwc2VkOiAhY29sbGFwc2VkfSl9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8taW5saW5lLWNvbW1lbnRzICovXG5cbiAgICAgICAgcmV0dXJuIGNvbGxhcHNlZCA/IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWVycm9yLWNhcmRfX2xpc3QtaXRlbSc+e2Vycm9ySGVhZGVyfTwvZGl2PlxuICAgICAgICApIDogKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2NhcmRDbGFzc2VzfT5cbiAgICAgICAgICAgICAgICB7ZXJyb3JIZWFkZXJ9XG4gICAgICAgICAgICAgICAgPEVycm9yQ29udGVudCBlcnJvcj17ZS5lcnJvcn0gLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuY29uc3QgTUFYX01FU1NBR0VfTEVOR1RIID0gNDA7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby1pbmxpbmUtY29tbWVudHMgKi9cbmZ1bmN0aW9uIFVuY29ubmVjdGVkRXJyb3JDb250ZW50KHtlcnJvciwgYmFzZX0pIHtcbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZXJyb3ItY29udGFpbmVyJz5cbiAgICAgICAgICAgIHsvKlxuICAgICAgICAgICAgICogNDAgaXMgYSByb3VnaCBoZXVyaXN0aWMgLSBpZiBsb25nZXIgdGhhbiA0MCB0aGVuIHRoZVxuICAgICAgICAgICAgICogbWVzc2FnZSBtaWdodCBvdmVyZmxvdyBpbnRvIGVsbGlwc2VzIGluIHRoZSB0aXRsZSBhYm92ZSAmXG4gICAgICAgICAgICAgKiB3aWxsIG5lZWQgdG8gYmUgZGlzcGxheWVkIGluIGZ1bGwgaW4gdGhpcyBlcnJvciBib2R5XG4gICAgICAgICAgICAgKi99XG4gICAgICAgICAgICB7dHlwZW9mIGVycm9yLm1lc3NhZ2UgIT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBlcnJvci5tZXNzYWdlLmxlbmd0aCA8IE1BWF9NRVNTQUdFX0xFTkdUSCA/IG51bGwgOiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3JfX3N0Jz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3JfX2luZm8gZGFzaC1mZS1lcnJvcl9fY3VydmVkJz5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvci5tZXNzYWdlfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgIHt0eXBlb2YgZXJyb3Iuc3RhY2sgIT09ICdzdHJpbmcnID8gbnVsbCA6IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvcl9fc3QnPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvcl9faW5mbyc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGV0YWlscz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3VtbWFyeT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVGhpcyBlcnJvciBvcmlnaW5hdGVkIGZyb20gdGhlIGJ1aWx0LWluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhU2NyaXB0IGNvZGUgdGhhdCBydW5zIERhc2ggYXBwcy4gQ2xpY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNlZSB0aGUgZnVsbCBzdGFjayB0cmFjZSBvciBvcGVuIHlvdXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXIncyBjb25zb2xlLilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3VtbWFyeT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvci5zdGFjay5zcGxpdCgnXFxuJykubWFwKChsaW5lLCBpKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGtleT17aX0+e2xpbmV9PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXRhaWxzPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7LyogQmFja2VuZCBFcnJvciAqL31cbiAgICAgICAgICAgIHt0eXBlb2YgZXJyb3IuaHRtbCAhPT0gJ3N0cmluZycgPyBudWxsIDogZXJyb3IuaHRtbFxuICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCAnPCFkb2N0eXBlJy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKSA9PT0gJzwhZG9jdHlwZScgPyAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtYmUtZXJyb3JfX3N0Jz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtYmFja2VuZC1lcnJvcic+XG4gICAgICAgICAgICAgICAgICAgICAgICB7LyogRW1iZWQgd2Vya3pldWcgZGVidWdnZXIgaW4gYW4gaWZyYW1lIHRvIHByZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIENTUyBsZWFraW5nIC0gd2Vya3pldWcgSFRNTCBpbmNsdWRlcyBhIGJ1bmNoXG4gICAgICAgICAgICAgICAgICAgICAgICBvZiBDU1Mgb24gYmFzZSBodG1sIGVsZW1lbnRzIGxpa2UgYDxib2R5Lz5gXG4gICAgICAgICAgICAgICAgICAgICAgKi99XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpZnJhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNEb2M9e2Vycm9yLmh0bWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9oZWFkPicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgPHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPiR7d2Vya3pldWdDc3N9PC9zdHlsZT48L2hlYWQ+YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz1cIj9fX2RlYnVnZ2VyX18nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYD1cIiR7YmFzZX0/X19kZWJ1Z2dlcl9fYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDY3cHggb2YgcGFkZGluZyBhbmQgbWFyZ2luIGJldHdlZW4gdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpZnJhbWUgYW5kIHRoZSBwYXJlbnQgY29udGFpbmVyLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiA2NyB3YXMgZGV0ZXJtaW5lZCBtYW51YWxseSBpbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYnJvd3NlcidzIGRldiB0b29scy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnY2FsYyg2MDBweCAtIDY3cHgpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnNzV2aCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogJ25vbmUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1iZS1lcnJvcl9fc3RyJz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtYmFja2VuZC1lcnJvcic+e2Vycm9yLmh0bWx9PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufVxuLyogZXNsaW50LWVuYWJsZSBuby1pbmxpbmUtY29tbWVudHMgKi9cblxuY29uc3QgZXJyb3JQcm9wVHlwZXMgPSBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIG1lc3NhZ2U6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgICAvKiBmcm9udC1lbmQgZXJyb3IgbWVzc2FnZXMgKi9cbiAgICBzdGFjazogUHJvcFR5cGVzLnN0cmluZyxcblxuICAgIC8qIGJhY2tlbmQgZXJyb3IgbWVzc2FnZXMgKi9cbiAgICBodG1sOiBQcm9wVHlwZXMuc3RyaW5nXG59KTtcblxuVW5jb25uZWN0ZWRFcnJvckNvbnRlbnQucHJvcFR5cGVzID0ge1xuICAgIGVycm9yOiBlcnJvclByb3BUeXBlcyxcbiAgICBiYXNlOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuXG5jb25zdCBFcnJvckNvbnRlbnQgPSBjb25uZWN0KHN0YXRlID0+ICh7YmFzZTogdXJsQmFzZShzdGF0ZS5jb25maWcpfSkpKFxuICAgIFVuY29ubmVjdGVkRXJyb3JDb250ZW50XG4pO1xuXG5Gcm9udEVuZEVycm9yLnByb3BUeXBlcyA9IHtcbiAgICBlOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICB0aW1lc3RhbXA6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICAgIGVycm9yOiBlcnJvclByb3BUeXBlc1xuICAgIH0pLFxuICAgIGluQWxlcnRzVHJheTogUHJvcFR5cGVzLmJvb2wsXG4gICAgaXNMaXN0SXRlbTogUHJvcFR5cGVzLmJvb2xcbn07XG5cbkZyb250RW5kRXJyb3IuZGVmYXVsdFByb3BzID0ge1xuICAgIGluQWxlcnRzVHJheTogZmFsc2UsXG4gICAgaXNMaXN0SXRlbTogZmFsc2Vcbn07XG5cbmV4cG9ydCB7RnJvbnRFbmRFcnJvcn07XG4iLCJpbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCAnLi9Gcm9udEVuZEVycm9yLmNzcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHtGcm9udEVuZEVycm9yfSBmcm9tICcuL0Zyb250RW5kRXJyb3IucmVhY3QnO1xuXG5jbGFzcyBGcm9udEVuZEVycm9yQ29udGFpbmVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCB7ZXJyb3JzLCBjb25uZWN0ZWQsIGVycm9yc09wZW5lZCwgY2xpY2tIYW5kbGVyfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGNvbnN0IGVycm9yc0xlbmd0aCA9IGVycm9ycy5sZW5ndGg7XG4gICAgICAgIGlmIChlcnJvcnNMZW5ndGggPT09IDAgfHwgIWVycm9yc09wZW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbkFsZXJ0c1RyYXkgPSB0aGlzLnByb3BzLmluQWxlcnRzVHJheTtcbiAgICAgICAgbGV0IGNhcmRDbGFzc2VzID0gJ2Rhc2gtZXJyb3ItY2FyZCBkYXNoLWVycm9yLWNhcmQtLWNvbnRhaW5lcic7XG5cbiAgICAgICAgY29uc3QgZXJyb3JFbGVtZW50cyA9IGVycm9ycy5tYXAoKGVycm9yLCBpKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gPEZyb250RW5kRXJyb3IgZT17ZXJyb3J9IGlzTGlzdEl0ZW09e3RydWV9IGtleT17aX0gLz47XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaW5BbGVydHNUcmF5KSB7XG4gICAgICAgICAgICBjYXJkQ2xhc3NlcyArPSAnIGRhc2gtZXJyb3ItY2FyZC0tYWxlcnRzLXRyYXknO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y2FyZENsYXNzZXN9PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWVycm9yLWNhcmRfX3RvcGJhcic+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWVycm9yLWNhcmRfX21lc3NhZ2UnPlxuICAgICAgICAgICAgICAgICAgICAgICAg8J+bkSBFcnJvcnMgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZyBjbGFzc05hbWU9J3Rlc3QtZGV2dG9vbHMtZXJyb3ItY291bnQnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvcnNMZW5ndGh9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICl7Y29ubmVjdGVkID8gbnVsbCA6ICdcXHUwMGEwIPCfmqsgU2VydmVyIFVuYXZhaWxhYmxlJ31cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvcl9faWNvbi14J1xuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gY2xpY2tIYW5kbGVyKCl9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIMOXXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWVycm9yLWNhcmRfX2xpc3QnPntlcnJvckVsZW1lbnRzfTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5Gcm9udEVuZEVycm9yQ29udGFpbmVyLnByb3BUeXBlcyA9IHtcbiAgICBpZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBlcnJvcnM6IFByb3BUeXBlcy5hcnJheSxcbiAgICBjb25uZWN0ZWQ6IFByb3BUeXBlcy5ib29sLFxuICAgIGluQWxlcnRzVHJheTogUHJvcFR5cGVzLmFueSxcbiAgICBlcnJvcnNPcGVuZWQ6IFByb3BUeXBlcy5hbnksXG4gICAgY2xpY2tIYW5kbGVyOiBQcm9wVHlwZXMuZnVuY1xufTtcblxuRnJvbnRFbmRFcnJvckNvbnRhaW5lci5wcm9wVHlwZXMgPSB7XG4gICAgaW5BbGVydHNUcmF5OiBQcm9wVHlwZXMuYW55XG59O1xuXG5leHBvcnQge0Zyb250RW5kRXJyb3JDb250YWluZXJ9O1xuIiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge0RlYnVnTWVudX0gZnJvbSAnLi9tZW51L0RlYnVnTWVudS5yZWFjdCc7XG5cbmNsYXNzIFVuY29ubmVjdGVkR2xvYmFsRXJyb3JDb250YWluZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHtjb25maWcsIGVycm9yLCBjaGlsZHJlbn0gPSB0aGlzLnByb3BzO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBpZD0nX2Rhc2gtZ2xvYmFsLWVycm9yLWNvbnRhaW5lcic+XG4gICAgICAgICAgICAgICAgPERlYnVnTWVudSBlcnJvcj17ZXJyb3J9IGhvdFJlbG9hZD17Qm9vbGVhbihjb25maWcuaG90X3JlbG9hZCl9PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSdfZGFzaC1hcHAtY29udGVudCc+e2NoaWxkcmVufTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvRGVidWdNZW51PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5VbmNvbm5lY3RlZEdsb2JhbEVycm9yQ29udGFpbmVyLnByb3BUeXBlcyA9IHtcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBjb25maWc6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZXJyb3I6IFByb3BUeXBlcy5vYmplY3Rcbn07XG5cbmNvbnN0IEdsb2JhbEVycm9yQ29udGFpbmVyID0gY29ubmVjdChzdGF0ZSA9PiAoe1xuICAgIGNvbmZpZzogc3RhdGUuY29uZmlnLFxuICAgIGVycm9yOiBzdGF0ZS5lcnJvclxufSkpKFVuY29ubmVjdGVkR2xvYmFsRXJyb3JDb250YWluZXIpO1xuXG5leHBvcnQgZGVmYXVsdCBHbG9iYWxFcnJvckNvbnRhaW5lcjtcbiIsImltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7Y29uY2F0fSBmcm9tICdyYW1kYSc7XG5cbmltcG9ydCAnLi9HbG9iYWxFcnJvck92ZXJsYXkuY3NzJztcbmltcG9ydCB7RnJvbnRFbmRFcnJvckNvbnRhaW5lcn0gZnJvbSAnLi9Gcm9udEVuZC9Gcm9udEVuZEVycm9yQ29udGFpbmVyLnJlYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2xvYmFsRXJyb3JPdmVybGF5IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCB7dmlzaWJsZSwgZXJyb3IsIGVycm9yc09wZW5lZCwgY2xpY2tIYW5kbGVyfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgICAgbGV0IGZyb250RW5kRXJyb3JzO1xuICAgICAgICBpZiAoZXJyb3JzT3BlbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBjb25jYXQoZXJyb3IuZnJvbnRFbmQsIGVycm9yLmJhY2tFbmQpO1xuXG4gICAgICAgICAgICBmcm9udEVuZEVycm9ycyA9IChcbiAgICAgICAgICAgICAgICA8RnJvbnRFbmRFcnJvckNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICBlcnJvcnM9e2Vycm9yc31cbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkPXtlcnJvci5iYWNrRW5kQ29ubmVjdGVkfVxuICAgICAgICAgICAgICAgICAgICBlcnJvcnNPcGVuZWQ9e2Vycm9yc09wZW5lZH1cbiAgICAgICAgICAgICAgICAgICAgY2xpY2tIYW5kbGVyPXtjbGlja0hhbmRsZXJ9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdj57dGhpcy5wcm9wcy5jaGlsZHJlbn08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1lcnJvci1tZW51Jz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3Zpc2libGUgPyAnZGFzaC1mZS1lcnJvcnMnIDogJyd9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2Zyb250RW5kRXJyb3JzfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuR2xvYmFsRXJyb3JPdmVybGF5LnByb3BUeXBlcyA9IHtcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICB2aXNpYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBlcnJvcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBlcnJvcnNPcGVuZWQ6IFByb3BUeXBlcy5hbnksXG4gICAgY2xpY2tIYW5kbGVyOiBQcm9wVHlwZXMuZnVuY1xufTtcbiIsImltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxuaW1wb3J0ICcuL0RlYnVnTWVudS5jc3MnO1xuXG5pbXBvcnQgQmVsbEljb24gZnJvbSAnLi4vaWNvbnMvQmVsbEljb24uc3ZnJztcbmltcG9ydCBDaGVja0ljb24gZnJvbSAnLi4vaWNvbnMvQ2hlY2tJY29uLnN2Zyc7XG5pbXBvcnQgQ2xvY2tJY29uIGZyb20gJy4uL2ljb25zL0Nsb2NrSWNvbi5zdmcnO1xuaW1wb3J0IERlYnVnSWNvbiBmcm9tICcuLi9pY29ucy9EZWJ1Z0ljb24uc3ZnJztcbmltcG9ydCBHcmFwaEljb24gZnJvbSAnLi4vaWNvbnMvR3JhcGhJY29uLnN2Zyc7XG5pbXBvcnQgT2ZmSWNvbiBmcm9tICcuLi9pY29ucy9PZmZJY29uLnN2Zyc7XG5cbmltcG9ydCBHbG9iYWxFcnJvck92ZXJsYXkgZnJvbSAnLi4vR2xvYmFsRXJyb3JPdmVybGF5LnJlYWN0JztcbmltcG9ydCB7Q2FsbGJhY2tHcmFwaENvbnRhaW5lcn0gZnJvbSAnLi4vQ2FsbGJhY2tHcmFwaC9DYWxsYmFja0dyYXBoQ29udGFpbmVyLnJlYWN0JztcblxuY29uc3QgY2xhc3NlcyA9IChiYXNlLCB2YXJpYW50LCB2YXJpYW50MikgPT5cbiAgICBgJHtiYXNlfSAke2Jhc2V9LS0ke3ZhcmlhbnR9YCArICh2YXJpYW50MiA/IGAgJHtiYXNlfS0tJHt2YXJpYW50Mn1gIDogJycpO1xuXG5jb25zdCBidXR0b25GYWN0b3J5ID0gKFxuICAgIGVuYWJsZWQsXG4gICAgYnV0dG9uVmFyaWFudCxcbiAgICB0b2dnbGUsXG4gICAgX0ljb24sXG4gICAgaWNvblZhcmlhbnQsXG4gICAgbGFiZWxcbikgPT4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi1jb250YWluZXInPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMoXG4gICAgICAgICAgICAgICAgJ2Rhc2gtZGVidWctbWVudV9fYnV0dG9uJyxcbiAgICAgICAgICAgICAgICBidXR0b25WYXJpYW50LFxuICAgICAgICAgICAgICAgIGVuYWJsZWQgJiYgJ2VuYWJsZWQnXG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgb25DbGljaz17dG9nZ2xlfVxuICAgICAgICA+XG4gICAgICAgICAgICA8X0ljb24gY2xhc3NOYW1lPXtjbGFzc2VzKCdkYXNoLWRlYnVnLW1lbnVfX2ljb24nLCBpY29uVmFyaWFudCl9IC8+XG4gICAgICAgICAgICB7bGFiZWwgPyAoXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tbGFiZWwnPntsYWJlbH08L2xhYmVsPlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuKTtcblxuY2xhc3MgRGVidWdNZW51IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIG9wZW5lZDogZmFsc2UsXG4gICAgICAgICAgICBjYWxsYmFja0dyYXBoT3BlbmVkOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yc09wZW5lZDogdHJ1ZVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHtvcGVuZWQsIGVycm9yc09wZW5lZCwgY2FsbGJhY2tHcmFwaE9wZW5lZH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBjb25zdCB7ZXJyb3IsIGhvdFJlbG9hZH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICAgIGNvbnN0IGVyckNvdW50ID0gZXJyb3IuZnJvbnRFbmQubGVuZ3RoICsgZXJyb3IuYmFja0VuZC5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGNvbm5lY3RlZCA9IGVycm9yLmJhY2tFbmRDb25uZWN0ZWQ7XG5cbiAgICAgICAgY29uc3QgdG9nZ2xlRXJyb3JzID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7ZXJyb3JzT3BlbmVkOiAhZXJyb3JzT3BlbmVkfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgc3RhdHVzID0gaG90UmVsb2FkXG4gICAgICAgICAgICA/IGNvbm5lY3RlZFxuICAgICAgICAgICAgICAgID8gJ2F2YWlsYWJsZSdcbiAgICAgICAgICAgICAgICA6ICd1bmF2YWlsYWJsZSdcbiAgICAgICAgICAgIDogJ2NvbGQnO1xuICAgICAgICBjb25zdCBfU3RhdHVzSWNvbiA9IGhvdFJlbG9hZFxuICAgICAgICAgICAgPyBjb25uZWN0ZWRcbiAgICAgICAgICAgICAgICA/IENoZWNrSWNvblxuICAgICAgICAgICAgICAgIDogT2ZmSWNvblxuICAgICAgICAgICAgOiBDbG9ja0ljb247XG5cbiAgICAgICAgY29uc3QgbWVudUNvbnRlbnQgPSBvcGVuZWQgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X19jb250ZW50Jz5cbiAgICAgICAgICAgICAgICB7Y2FsbGJhY2tHcmFwaE9wZW5lZCA/IDxDYWxsYmFja0dyYXBoQ29udGFpbmVyIC8+IDogbnVsbH1cbiAgICAgICAgICAgICAgICB7YnV0dG9uRmFjdG9yeShcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tHcmFwaE9wZW5lZCxcbiAgICAgICAgICAgICAgICAgICAgJ2NhbGxiYWNrcycsXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrR3JhcGhPcGVuZWQ6ICFjYWxsYmFja0dyYXBoT3BlbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgR3JhcGhJY29uLFxuICAgICAgICAgICAgICAgICAgICAnZ3JhcGgnLFxuICAgICAgICAgICAgICAgICAgICAnQ2FsbGJhY2tzJ1xuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAge2J1dHRvbkZhY3RvcnkoXG4gICAgICAgICAgICAgICAgICAgIGVycm9yc09wZW5lZCxcbiAgICAgICAgICAgICAgICAgICAgJ2Vycm9ycycsXG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZUVycm9ycyxcbiAgICAgICAgICAgICAgICAgICAgQmVsbEljb24sXG4gICAgICAgICAgICAgICAgICAgICdiZWxsJyxcbiAgICAgICAgICAgICAgICAgICAgZXJyQ291bnQgKyAnIEVycm9yJyArIChlcnJDb3VudCA9PT0gMSA/ICcnIDogJ3MnKVxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAge2J1dHRvbkZhY3RvcnkoXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIF9TdGF0dXNJY29uLFxuICAgICAgICAgICAgICAgICAgICAnaW5kaWNhdG9yJyxcbiAgICAgICAgICAgICAgICAgICAgJ1NlcnZlcidcbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X19jb250ZW50JyAvPlxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGFsZXJ0c0xhYmVsID1cbiAgICAgICAgICAgIChlcnJDb3VudCB8fCAhY29ubmVjdGVkKSAmJiAhb3BlbmVkID8gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLWFsZXJ0LWxhYmVsJz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZGVidWctYWxlcnQnIG9uQ2xpY2s9e3RvZ2dsZUVycm9yc30+XG4gICAgICAgICAgICAgICAgICAgICAgICB7ZXJyQ291bnQgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZGVidWctZXJyb3ItY291bnQnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J/Cfm5EgJyArIGVyckNvdW50fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICAgICAgICB7Y29ubmVjdGVkID8gbnVsbCA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1kaXNjb25uZWN0ZWQnPvCfmqs8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKSA6IG51bGw7XG5cbiAgICAgICAgY29uc3Qgb3BlblZhcmlhbnQgPSBvcGVuZWQgPyAnb3BlbicgOiAnY2xvc2VkJztcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICB7YWxlcnRzTGFiZWx9XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2NsYXNzZXMoJ2Rhc2gtZGVidWctbWVudV9fb3V0ZXInLCBvcGVuVmFyaWFudCl9PlxuICAgICAgICAgICAgICAgICAgICB7bWVudUNvbnRlbnR9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMoJ2Rhc2gtZGVidWctbWVudScsIG9wZW5WYXJpYW50KX1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7b3BlbmVkOiAhb3BlbmVkfSk7XG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8RGVidWdJY29uXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMoJ2Rhc2gtZGVidWctbWVudV9faWNvbicsICdkZWJ1ZycpfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxHbG9iYWxFcnJvck92ZXJsYXlcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I9e2Vycm9yfVxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlPXtlcnJDb3VudCA+IDB9XG4gICAgICAgICAgICAgICAgICAgIGVycm9yc09wZW5lZD17ZXJyb3JzT3BlbmVkfVxuICAgICAgICAgICAgICAgICAgICBjbGlja0hhbmRsZXI9e3RvZ2dsZUVycm9yc31cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVufVxuICAgICAgICAgICAgICAgIDwvR2xvYmFsRXJyb3JPdmVybGF5PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5EZWJ1Z01lbnUucHJvcFR5cGVzID0ge1xuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGVycm9yOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGhvdFJlbG9hZDogUHJvcFR5cGVzLmJvb2xcbn07XG5cbmV4cG9ydCB7RGVidWdNZW51fTtcbiIsIi8vIFdlcmt6ZXVnIGNzcyBpbmNsdWRlZCBhcyBhIHN0cmluZywgYmVjYXVzZSB3ZSB3YW50IHRvIGluamVjdFxuLy8gaXQgaW50byBhbiBpZnJhbWUgc3JjRG9jXG5cbmV4cG9ydCBkZWZhdWx0IGBcbmJvZHkge1xuICAgIG1hcmdpbjogMHB4O1xuICAgIG1hcmdpbi10b3A6IDEwcHg7XG59XG5cbi5lcnJvci1jb250YWluZXIge1xuICAgIGZvbnQtZmFtaWx5OiBSb2JvdG87XG59XG5cbi50cmFjZWJhY2sge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIGJvcmRlcjogMnB4IHNvbGlkICNkZmU4ZjM7XG4gICAgYm9yZGVyLXJhZGl1czogMHB4IDBweCA0cHggNHB4O1xuICAgIGNvbG9yOiAjNTA2Nzg0O1xufVxuXG5oMi50cmFjZWJhY2sge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2Y2ZmE7XG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcbiAgICBib3JkZXItYm90dG9tOiAwcHg7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXItcmFkaXVzOiA0cHggNHB4IDBweCAwcHg7XG4gICAgY29sb3I6ICM1MDY3ODQ7XG59XG5cbmgyLnRyYWNlYmFjayBlbSB7XG4gICAgY29sb3I6ICM1MDY3ODQ7XG4gICAgZm9udC13ZWlnaHQ6IDEwMDtcbn1cblxuLnRyYWNlYmFjayBwcmUsIC5kZWJ1Z2dlciB0ZXh0YXJlYSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0YzRjZGQTtcbn1cblxuLmRlYnVnZ2VyIGgxIHtcbiAgICBjb2xvcjogIzUwNjc4NDtcbiAgICBmb250LWZhbWlseTogUm9ib3RvO1xufVxuXG4uZXhwbGFuYXRpb24ge1xuICAgIGNvbG9yOiAjQTJCMUM2O1xufVxuXG4vKiBIaWRlIHRoZSBEb24ndCBQYW5pYyEgZm9vdGVyICovXG4uZGVidWdnZXIgLmZvb3RlciB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLyogSGlkZSBhbGwgb2YgdGhlIERhc2ggdHJhY2ViYWNrIHN0dWZmIHRoYXQgbGVhZHMgdXAgdG8gdGhlIGNhbGwgKi9cbi5saW5lLmJlZm9yZSB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuZGl2LmRlYnVnZ2VyIHtcbiAgICBwYWRkaW5nOiAwcHg7XG59XG5cbi5kZWJ1Z2dlciBoMSB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmRlYnVnZ2VyIC5lcnJvcm1zZyB7XG4gICAgbWFyZ2luOiAwO1xuICAgIGNvbG9yOiAjNTA2Nzg0O1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmNmZhO1xuICAgIGJvcmRlcjogMnB4IHNvbGlkICNkZmU4ZjM7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgcGFkZGluZzogMTBweDtcbn1cblxuLmRlYnVnZ2VyIC5wYXN0ZW1lc3NhZ2UgaW5wdXQge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5kZWJ1Z2dlciAuZXhwbGFuYXRpb24ge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5kZWJ1Z2dlciBkaXYucGxhaW4ge1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBib3JkZXItd2lkdGg6IDJweDtcbiAgICBjb2xvcjogIzUwNjc4NDtcbn1cblxuLnBsYWluIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xufVxuLnBsYWluID4gZm9ybSA+IHAge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG4ucGxhaW4gcHJlIHtcbiAgICBwYWRkaW5nOiAxNXB4ICFpbXBvcnRhbnQ7XG4gICAgb3ZlcmZsb3cteDogc2Nyb2xsO1xufVxuXG4uZGVidWdnZXIgZGl2LnRyYWNlYmFjayBwcmUge1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbn1cblxuLmRlYnVnZ2VyIC50cmFjZWJhY2sgLnNvdXJjZSBwcmUubGluZSBpbWcge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5gO1xuIiwidHlwZSBDb25maWcgPSB7XG4gICAgdXJsX2Jhc2VfcGF0aG5hbWU6IHN0cmluZztcbiAgICByZXF1ZXN0c19wYXRobmFtZV9wcmVmaXg6IHN0cmluZztcbiAgICB1aTogYm9vbGVhbjtcbiAgICBwcm9wc19jaGVjazogYm9vbGVhbjtcbiAgICBzaG93X3VuZG9fcmVkbzogYm9vbGVhbjtcbiAgICBzdXBwcmVzc19jYWxsYmFja19leGNlcHRpb25zOiBib29sZWFuO1xuICAgIHVwZGF0ZV90aXRsZTogc3RyaW5nO1xuICAgIGhvdF9yZWxvYWQ/OiB7XG4gICAgICAgIGludGVydmFsOiBudW1iZXI7XG4gICAgICAgIG1heF9yZXRyeTogbnVtYmVyO1xuICAgIH07XG4gICAgdmFsaWRhdGlvbl9sYXlvdXQ6IGFueTtcbiAgICBjaGlsZHJlbl9wcm9wczoge1trOiBzdHJpbmddOiB7W2s6IHN0cmluZ106IHN0cmluZ1tdfX07XG4gICAgZmV0Y2g6IHtcbiAgICAgICAgY3JlZGVudGlhbHM6IHN0cmluZztcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgQWNjZXB0OiBzdHJpbmc7XG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogc3RyaW5nO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgc2VydmVfbG9jYWxseT86IGJvb2xlYW47XG4gICAgcGxvdGx5anNfdXJsPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q29uZmlnRnJvbURPTSgpOiBDb25maWcge1xuICAgIGNvbnN0IGNvbmZpZ0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnX2Rhc2gtY29uZmlnJyk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoXG4gICAgICAgIGNvbmZpZ0VsZW1lbnQ/LnRleHRDb250ZW50ID8gY29uZmlnRWxlbWVudD8udGV4dENvbnRlbnQgOiAne30nXG4gICAgKTtcbn1cbiIsImV4cG9ydCBjb25zdCBSRURJUkVDVF9VUklfUEFUSE5BTUUgPSAnL19vYXV0aDIvY2FsbGJhY2snO1xuZXhwb3J0IGNvbnN0IE9BVVRIX0NPT0tJRV9OQU1FID0gJ3Bsb3RseV9vYXV0aF90b2tlbic7XG5leHBvcnQgY29uc3QgSldUX0VYUElSRURfTUVTU0FHRSA9ICdKV1QgRXhwaXJlZCc7XG5cbmV4cG9ydCBjb25zdCBTVEFUVVMgPSB7XG4gICAgT0s6IDIwMCxcbiAgICBQUkVWRU5UX1VQREFURTogMjA0LFxuICAgIC8vIFdlIGFjY2VwdCBib3RoIDQwMCBhbmQgNDAxIGZvciBKV1QgdG9rZW4gZXhwaXJ5IHJlc3BvbnNlcy5cbiAgICAvLyBTb21lIHNlcnZlcnMgdXNlIGNvZGUgNDAwIGZvciBleHBpcmVkIHRva2VucywgYmVjYXVzZVxuICAgIC8vIHRoZXkgcmVzZXJ2ZSA0MDEgZm9yIGNhc2VzIHRoYXQgcmVxdWlyZSB1c2VyIGFjdGlvblxuICAgIEJBRF9SRVFVRVNUOiA0MDAsXG4gICAgVU5BVVRIT1JJWkVEOiA0MDEsXG4gICAgQ0xJRU5UU0lERV9FUlJPUjogJ0NMSUVOVFNJREVfRVJST1InLFxuICAgIE5PX1JFU1BPTlNFOiAnTk9fUkVTUE9OU0UnXG59O1xuXG5leHBvcnQgY29uc3QgU1RBVFVTTUFQID0ge1xuICAgIFtTVEFUVVMuT0tdOiAnU1VDQ0VTUycsXG4gICAgW1NUQVRVUy5QUkVWRU5UX1VQREFURV06ICdOT19VUERBVEUnXG59O1xuIiwiaW1wb3J0IHtoYXMsIGluY2x1ZGVzfSBmcm9tICdyYW1kYSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9wVHlwZUVycm9ySGFuZGxlcihtZXNzYWdlLCBwcm9wcywgdHlwZSkge1xuICAgIC8qXG4gICAgICogcHJvcFR5cGUgZXJyb3IgbWVzc2FnZXMgYXJlIGNvbnN0cnVjdGVkIGluXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3Byb3AtdHlwZXMvYmxvYi92MTUuNy4yL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzXG4gICAgICogKFZlcnNpb24gMTUuNy4yKVxuICAgICAqXG4gICAgICogUGFyc2UgdGhlc2UgZXhjZXB0aW9uIG9iamVjdHMgdG8gcmVtb3ZlIEpTIHNvdXJjZSBjb2RlIGFuZCBpbXByb3ZlXG4gICAgICogdGhlIGNsYXJpdHkuXG4gICAgICpcbiAgICAgKiBJZiB3cm9uZyBwcm9wIHR5cGUgd2FzIHBhc3NlZCBpbiwgbWVzc2FnZSBsb29rcyBsaWtlOlxuICAgICAqXG4gICAgICogRXJyb3I6IFwiRmFpbGVkIGNvbXBvbmVudCBwcm9wIHR5cGU6IEludmFsaWQgY29tcG9uZW50IHByb3AgYGFuaW1hdGVgIG9mIHR5cGUgYG51bWJlcmAgc3VwcGxpZWQgdG8gYGZ1bmN0aW9uIEdyYXBoV2l0aERlZmF1bHRzKHByb3BzKSB7XG4gICAgICogICB2YXIgaWQgPSBwcm9wcy5pZCA/IHByb3BzLmlkIDogZ2VuZXJhdGVJZCgpO1xuICAgICAqICAgcmV0dXJuIHJlYWN0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoUGxvdGx5R3JhcGgsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAqICAgICBpZDogaWRcbiAgICAgKiAgIH0pKTtcbiAgICAgKiB9YCwgZXhwZWN0ZWQgYGJvb2xlYW5gLlwiXG4gICAgICpcbiAgICAgKlxuICAgICAqIElmIGEgcmVxdWlyZWQgcHJvcCB0eXBlIHdhcyBvbWl0dGVkLCBtZXNzYWdlIGxvb2tzIGxpa2U6XG4gICAgICpcbiAgICAgKiBcIkZhaWxlZCBjb21wb25lbnQgcHJvcCB0eXBlOiBUaGUgY29tcG9uZW50IHByb3AgYG9wdGlvbnNbMF0udmFsdWVgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCBpbiBgZnVuY3Rpb24gQ2hlY2tsaXN0KHByb3BzKSB7XG4gICAgICogICAgdmFyIF90aGlzO1xuICAgICAqXG4gICAgICogICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENoZWNrbGlzdCk7XG4gICAgICpcbiAgICAgKiAgICAgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfZ2V0UHJvdG90eXBlT2YoQ2hlY2tsaXN0KS5jYWxsKHRoaXMsIHByb3BzKSk7XG4gICAgICogICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAqICAgICAgIHZhbHVlczogcHJvcHMudmFsdWVzXG4gICAgICogICAgIH07XG4gICAgICogICAgIHJldHVybiBfdGhpcztcbiAgICAgKiAgIH1gLCBidXQgaXRzIHZhbHVlIGlzIGB1bmRlZmluZWRgLlwiXG4gICAgICpcbiAgICAgKi9cblxuICAgIGNvbnN0IG1lc3NhZ2VQYXJ0cyA9IG1lc3NhZ2Uuc3BsaXQoJ2AnKTtcbiAgICBsZXQgZXJyb3JNZXNzYWdlO1xuICAgIGlmIChpbmNsdWRlcygnaXMgbWFya2VkIGFzIHJlcXVpcmVkJywgbWVzc2FnZSkpIHtcbiAgICAgICAgY29uc3QgaW52YWxpZFByb3BQYXRoID0gbWVzc2FnZVBhcnRzWzFdO1xuICAgICAgICBlcnJvck1lc3NhZ2UgPSBgJHtpbnZhbGlkUHJvcFBhdGh9IGluICR7dHlwZX1gO1xuICAgICAgICBpZiAocHJvcHMuaWQpIHtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSBgIHdpdGggSUQgXCIke3Byb3BzLmlkfVwiYDtcbiAgICAgICAgfVxuICAgICAgICBlcnJvck1lc3NhZ2UgKz0gJyBpcyByZXF1aXJlZCBidXQgaXQgd2FzIG5vdCBwcm92aWRlZC4nO1xuICAgIH0gZWxzZSBpZiAoaW5jbHVkZXMoJ0JhZCBvYmplY3QnLCBtZXNzYWdlKSkge1xuICAgICAgICAvKlxuICAgICAgICAgKiBIYW5kbGUgLmV4YWN0IGVycm9yc1xuICAgICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcHJvcC10eXBlcy9ibG9iL3YxNS43LjIvZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMuanMjTDQzOC1MNDQyXG4gICAgICAgICAqL1xuICAgICAgICBlcnJvck1lc3NhZ2UgPVxuICAgICAgICAgICAgbWVzc2FnZS5zcGxpdCgnc3VwcGxpZWQgdG8gJylbMF0gK1xuICAgICAgICAgICAgYHN1cHBsaWVkIHRvICR7dHlwZX1gICtcbiAgICAgICAgICAgICcuXFxuQmFkJyArXG4gICAgICAgICAgICBtZXNzYWdlLnNwbGl0KCcuXFxuQmFkJylbMV07XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICAgaW5jbHVkZXMoJ0ludmFsaWQgJywgbWVzc2FnZSkgJiZcbiAgICAgICAgaW5jbHVkZXMoJyBzdXBwbGllZCB0byAnLCBtZXNzYWdlKVxuICAgICkge1xuICAgICAgICBjb25zdCBpbnZhbGlkUHJvcFBhdGggPSBtZXNzYWdlUGFydHNbMV07XG5cbiAgICAgICAgZXJyb3JNZXNzYWdlID0gYEludmFsaWQgYXJndW1lbnQgXFxgJHtpbnZhbGlkUHJvcFBhdGh9XFxgIHBhc3NlZCBpbnRvICR7dHlwZX1gO1xuICAgICAgICBpZiAocHJvcHMuaWQpIHtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSBgIHdpdGggSUQgXCIke3Byb3BzLmlkfVwiYDtcbiAgICAgICAgfVxuICAgICAgICBlcnJvck1lc3NhZ2UgKz0gJy4nO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIE5vdCBhbGwgZXJyb3IgbWVzc2FnZXMgaW5jbHVkZSB0aGUgZXhwZWN0ZWQgdmFsdWUuXG4gICAgICAgICAqIEluIHBhcnRpY3VsYXIsIG9uZU9mVHlwZS5cbiAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3Byb3AtdHlwZXMvYmxvYi92MTUuNy4yL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzI0wzODhcbiAgICAgICAgICovXG4gICAgICAgIGlmIChpbmNsdWRlcygnLCBleHBlY3RlZCAnLCBtZXNzYWdlKSkge1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRQcm9wVHlwZSA9IG1lc3NhZ2Uuc3BsaXQoJywgZXhwZWN0ZWQgJylbMV07XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYFxcbkV4cGVjdGVkICR7ZXhwZWN0ZWRQcm9wVHlwZX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgICogTm90IGFsbCBlcnJvciBtZXNzYWdlcyBpbmNsdWRlIHRoZSB0eXBlXG4gICAgICAgICAqIEluIHBhcnRpY3VsYXIsIG9uZU9mVHlwZS5cbiAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3Byb3AtdHlwZXMvYmxvYi92MTUuNy4yL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzI0wzODhcbiAgICAgICAgICovXG4gICAgICAgIGlmIChpbmNsdWRlcygnIG9mIHR5cGUgYCcsIG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBjb25zdCBpbnZhbGlkUHJvcFR5cGVQcm92aWRlZCA9IG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAuc3BsaXQoJyBvZiB0eXBlIGAnKVsxXVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnYCcpWzBdO1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlICs9IGBcXG5XYXMgc3VwcGxpZWQgdHlwZSBcXGAke2ludmFsaWRQcm9wVHlwZVByb3ZpZGVkfVxcYC5gO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhcyhpbnZhbGlkUHJvcFBhdGgsIHByb3BzKSkge1xuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAqIGludmFsaWRQcm9wUGF0aCBtYXkgYmUgbmVzdGVkIGxpa2UgYG9wdGlvbnNbMF0udmFsdWVgLlxuICAgICAgICAgICAgICogRm9yIG5vdywgd2Ugd29uJ3QgdHJ5IHRvIHVucGFjayB0aGVzZSBuZXN0ZWQgb3B0aW9uc1xuICAgICAgICAgICAgICogYnV0IHdlIGNvdWxkIGluIHRoZSBmdXR1cmUuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGpzb25TdXBwbGllZFZhbHVlID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgcHJvcHNbaW52YWxpZFByb3BQYXRoXSxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoanNvblN1cHBsaWVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZXMoJ1xcbicsIGpzb25TdXBwbGllZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYFxcblZhbHVlIHByb3ZpZGVkOiBcXG4ke2pzb25TdXBwbGllZFZhbHVlfWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlICs9IGBcXG5WYWx1ZSBwcm92aWRlZDogJHtqc29uU3VwcGxpZWRWYWx1ZX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIE5vdCBhd2FyZSBvZiBvdGhlciBwcm9wIHR5cGUgd2FybmluZyBtZXNzYWdlcy5cbiAgICAgICAgICogQnV0LCBpZiB0aGV5IGV4aXN0LCB0aGVuIGF0IGxlYXN0IHRocm93IHRoZSBkZWZhdWx0XG4gICAgICAgICAqIHJlYWN0IHByb3AgdHlwZXMgZXJyb3JcbiAgICAgICAgICovXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbn1cbiIsImltcG9ydCB7aW5jbHVkZXMsIHR5cGV9IGZyb20gJ3JhbWRhJztcblxuY29uc3QgU0lNUExFX0NPTVBPTkVOVF9UWVBFUyA9IFsnU3RyaW5nJywgJ051bWJlcicsICdOdWxsJywgJ0Jvb2xlYW4nXTtcblxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50ID0+IGluY2x1ZGVzKHR5cGUoY29tcG9uZW50KSwgU0lNUExFX0NPTVBPTkVOVF9UWVBFUyk7XG4iLCJpbXBvcnQge0lTdG9yZU9ic2VydmVyRGVmaW5pdGlvbn0gZnJvbSAnLi4vU3RvcmVPYnNlcnZlcic7XG5pbXBvcnQge0lTdG9yZVN0YXRlfSBmcm9tICcuLi9zdG9yZSc7XG5cbmNvbnN0IHVwZGF0ZVRpdGxlID0gKGdldFN0YXRlOiAoKSA9PiBJU3RvcmVTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHtjb25maWcsIGlzTG9hZGluZ30gPSBnZXRTdGF0ZSgpO1xuXG4gICAgY29uc3QgdXBkYXRlX3RpdGxlID0gY29uZmlnPy51cGRhdGVfdGl0bGU7XG5cbiAgICBpZiAoIXVwZGF0ZV90aXRsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzTG9hZGluZykge1xuICAgICAgICBpZiAoZG9jdW1lbnQudGl0bGUgIT09IHVwZGF0ZV90aXRsZSkge1xuICAgICAgICAgICAgb2JzZXJ2ZXIudGl0bGUgPSBkb2N1bWVudC50aXRsZTtcbiAgICAgICAgICAgIGRvY3VtZW50LnRpdGxlID0gdXBkYXRlX3RpdGxlO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGRvY3VtZW50LnRpdGxlID09PSB1cGRhdGVfdGl0bGUpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LnRpdGxlID0gb2JzZXJ2ZXIudGl0bGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvYnNlcnZlci50aXRsZSA9IGRvY3VtZW50LnRpdGxlO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuY29uc3Qgb2JzZXJ2ZXI6IElTdG9yZU9ic2VydmVyRGVmaW5pdGlvbjxJU3RvcmVTdGF0ZT4gPSB7XG4gICAgaW5wdXRzOiBbJ2lzTG9hZGluZyddLFxuICAgIG11dGF0aW9uT2JzZXJ2ZXI6IHVuZGVmaW5lZCxcbiAgICBvYnNlcnZlcjogKHtnZXRTdGF0ZX0pID0+IHtcbiAgICAgICAgY29uc3Qge2NvbmZpZ30gPSBnZXRTdGF0ZSgpO1xuXG4gICAgICAgIGlmIChvYnNlcnZlci5jb25maWcgIT09IGNvbmZpZykge1xuICAgICAgICAgICAgb2JzZXJ2ZXIuY29uZmlnID0gY29uZmlnO1xuICAgICAgICAgICAgb2JzZXJ2ZXIubXV0YXRpb25PYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIubXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+XG4gICAgICAgICAgICAgICAgdXBkYXRlVGl0bGUoZ2V0U3RhdGUpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RpdGxlJyk7XG4gICAgICAgICAgICBpZiAodGl0bGUpIHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5tdXRhdGlvbk9ic2VydmVyLm9ic2VydmUodGl0bGUsIHtcbiAgICAgICAgICAgICAgICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVUaXRsZShnZXRTdGF0ZSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQge1xuICAgIGNvbmNhdCxcbiAgICBmbGF0dGVuLFxuICAgIGlzRW1wdHksXG4gICAgaXNOaWwsXG4gICAgbWFwLFxuICAgIHBhdGgsXG4gICAga2V5cyxcbiAgICBwaWNrQnksXG4gICAgdG9QYWlycyxcbiAgICBwYXRoT3Jcbn0gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQge0lTdG9yZVN0YXRlfSBmcm9tICcuLi9zdG9yZSc7XG5cbmltcG9ydCB7XG4gICAgYWdncmVnYXRlQ2FsbGJhY2tzLFxuICAgIGFkZFJlcXVlc3RlZENhbGxiYWNrcyxcbiAgICByZW1vdmVFeGVjdXRlZENhbGxiYWNrcyxcbiAgICBhZGRDb21wbGV0ZWRDYWxsYmFja3MsXG4gICAgYWRkU3RvcmVkQ2FsbGJhY2tzXG59IGZyb20gJy4uL2FjdGlvbnMvY2FsbGJhY2tzJztcblxuaW1wb3J0IHtwYXJzZUlmV2lsZGNhcmR9IGZyb20gJy4uL2FjdGlvbnMvZGVwZW5kZW5jaWVzJztcblxuaW1wb3J0IHtcbiAgICBjb21iaW5lSWRBbmRQcm9wLFxuICAgIGdldENhbGxiYWNrc0J5SW5wdXQsXG4gICAgZ2V0TGF5b3V0Q2FsbGJhY2tzLFxuICAgIGluY2x1ZGVPYnNlcnZlcnNcbn0gZnJvbSAnLi4vYWN0aW9ucy9kZXBlbmRlbmNpZXNfdHMnO1xuXG5pbXBvcnQge0lDYWxsYmFjaywgSVN0b3JlZENhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFja3MnO1xuXG5pbXBvcnQge3VwZGF0ZVByb3BzLCBzZXRQYXRocywgaGFuZGxlQXN5bmNFcnJvcn0gZnJvbSAnLi4vYWN0aW9ucyc7XG5pbXBvcnQge2dldFBhdGgsIGNvbXB1dGVQYXRoc30gZnJvbSAnLi4vYWN0aW9ucy9wYXRocyc7XG5cbmltcG9ydCB7YXBwbHlQZXJzaXN0ZW5jZSwgcHJ1bmVQZXJzaXN0ZW5jZX0gZnJvbSAnLi4vcGVyc2lzdGVuY2UnO1xuaW1wb3J0IHtJU3RvcmVPYnNlcnZlckRlZmluaXRpb259IGZyb20gJy4uL1N0b3JlT2JzZXJ2ZXInO1xuXG5jb25zdCBvYnNlcnZlcjogSVN0b3JlT2JzZXJ2ZXJEZWZpbml0aW9uPElTdG9yZVN0YXRlPiA9IHtcbiAgICBvYnNlcnZlcjogKHtkaXNwYXRjaCwgZ2V0U3RhdGV9KSA9PiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNhbGxiYWNrczoge2V4ZWN1dGVkfVxuICAgICAgICB9ID0gZ2V0U3RhdGUoKTtcblxuICAgICAgICBmdW5jdGlvbiBhcHBseVByb3BzKGlkOiBhbnksIHVwZGF0ZWRQcm9wczogYW55KSB7XG4gICAgICAgICAgICBjb25zdCB7bGF5b3V0LCBwYXRoc30gPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgICAgY29uc3QgaXRlbXBhdGggPSBnZXRQYXRoKHBhdGhzLCBpZCk7XG4gICAgICAgICAgICBpZiAoIWl0ZW1wYXRoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgY2FsbGJhY2stZ2VuZXJhdGVkIHVwZGF0ZS5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaW52YWxpZGF0ZXMgZXhpc3RpbmcgcGVyc2lzdGVkIHByb3AgdmFsdWVzLFxuICAgICAgICAgICAgLy8gb3IgaWYgcGVyc2lzdGVuY2UgY2hhbmdlZCwgd2hldGhlciB0aGlzIHVwZGF0ZXMgb3RoZXIgcHJvcHMuXG4gICAgICAgICAgICB1cGRhdGVkUHJvcHMgPSBwcnVuZVBlcnNpc3RlbmNlKFxuICAgICAgICAgICAgICAgIHBhdGgoaXRlbXBhdGgsIGxheW91dCksXG4gICAgICAgICAgICAgICAgdXBkYXRlZFByb3BzLFxuICAgICAgICAgICAgICAgIGRpc3BhdGNoXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSB1cGRhdGUgY29udGFpbnMgd2hvbGUgY29tcG9uZW50cywgc2VlIGlmIGFueSBvZlxuICAgICAgICAgICAgLy8gdGhvc2UgY29tcG9uZW50cyBoYXZlIHByb3BzIHRvIHVwZGF0ZSB0byBwZXJzaXN0IHVzZXIgZWRpdHMuXG4gICAgICAgICAgICBjb25zdCB7cHJvcHN9ID0gYXBwbHlQZXJzaXN0ZW5jZSh7cHJvcHM6IHVwZGF0ZWRQcm9wc30sIGRpc3BhdGNoKTtcblxuICAgICAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgdXBkYXRlUHJvcHMoe1xuICAgICAgICAgICAgICAgICAgICBpdGVtcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ3Jlc3BvbnNlJ1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVxdWVzdGVkQ2FsbGJhY2tzOiBJQ2FsbGJhY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBzdG9yZWRDYWxsYmFja3M6IElTdG9yZWRDYWxsYmFja1tdID0gW107XG5cbiAgICAgICAgZXhlY3V0ZWQuZm9yRWFjaChjYiA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcmVkZWNlc3NvcnMgPSBjb25jYXQoY2IucHJlZGVjZXNzb3JzID8/IFtdLCBbY2IuY2FsbGJhY2tdKTtcblxuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB7Y2xpZW50c2lkZV9mdW5jdGlvbiwgb3V0cHV0fSxcbiAgICAgICAgICAgICAgICBleGVjdXRpb25SZXN1bHRcbiAgICAgICAgICAgIH0gPSBjYjtcblxuICAgICAgICAgICAgaWYgKGlzTmlsKGV4ZWN1dGlvblJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHtkYXRhLCBlcnJvciwgcGF5bG9hZH0gPSBleGVjdXRpb25SZXN1bHQ7XG5cbiAgICAgICAgICAgIGlmIChkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhkYXRhKS5mb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgICAoW2lkLCBwcm9wc106IFthbnksIHtba2V5OiBzdHJpbmddOiBhbnl9XSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkSWQgPSBwYXJzZUlmV2lsZGNhcmQoaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBocyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQ6IG9sZExheW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoczogb2xkUGF0aHNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gPSBnZXRTdGF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb21wb25lbnRzIHdpbGwgdHJpZ2dlciBjYWxsYmFja3Mgb24gdGhlaXIgb3duIGFzIHJlcXVpcmVkIChlZy4gZGVyaXZlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwcGxpZWRQcm9wcyA9IGFwcGx5UHJvcHMocGFyc2VkSWQsIHByb3BzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGNhbGxiYWNrcyBmb3IgbW9kaWZpZWQgaW5wdXRzXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDYWxsYmFja3MgPSBjb25jYXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ2FsbGJhY2tzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXR0ZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDYWxsYmFja3NCeUlucHV0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFBhdGhzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzKHByb3BzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5tYXAocmNiID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJjYixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGVjZXNzb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlUGF0aCA9IGdldFBhdGgob2xkUGF0aHMsIHBhcnNlZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmFzZVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRPYmogPSBwYXRoKGJhc2VQYXRoLCBvbGRMYXlvdXQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlblByb3BzID0gcGF0aE9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvbGRPYmoubmFtZXNwYWNlLCBvbGRPYmoudHlwZV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdpbmRvdyBhcyBhbnkpLl9fZGFzaHByaXZhdGVfY2hpbGRyZW5Qcm9wc1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlUGF0aHMgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IGFueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRDaGlsZHJlbjogYW55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZENoaWxkcmVuUGF0aDogYW55W10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUm9vdDogYW55ID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9QYXRocyA9IGdldFN0YXRlKCkucGF0aHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aHMgPSBjb21wdXRlUGF0aHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRDaGlsZHJlblBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9QYXRoc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goc2V0UGF0aHMocGF0aHMpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBjYWxsYmFja3MgZm9yIG5ldyBsYXlvdXQgKHcvIGV4ZWN1dGlvbiBncm91cClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDYWxsYmFja3MgPSBjb25jYXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENhbGxiYWNrcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGF5b3V0Q2FsbGJhY2tzKGdyYXBocywgcGF0aHMsIGNoaWxkcmVuLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua1BhdGg6IG9sZENoaWxkcmVuUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclJvb3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkubWFwKHJjYiA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmNiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGVjZXNzb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaWxkY2FyZCBjYWxsYmFja3Mgd2l0aCBhcnJheSBpbnB1dHMgKEFMTCAvIEFMTFNNQUxMRVIpIG5lZWQgdG8gdHJpZ2dlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4gZHVlIHRvIHRoZSBkZWxldGlvbiBvZiBjb21wb25lbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ2FsbGJhY2tzID0gY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDYWxsYmFja3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExheW91dENhbGxiYWNrcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBocyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFBhdGhzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQ2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZEFycmF5SW5wdXRzT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRoczogcGF0aHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtQYXRoOiBvbGRDaGlsZHJlblBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUm9vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLm1hcChyY2IgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJjYixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRlY2Vzc29yc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlY29tcHV0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgWydjaGlsZHJlbiddXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChjaGlsZHJlblByb3BzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGNoaWxkcmVuUHJvcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNvbXB1dGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcC5pbmNsdWRlcygnW10nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW2Zyb250UGF0aF0gPSBjaGlsZHJlblByb3BcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJ1tdJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKHAgPT4gcC5zcGxpdCgnLicpLmZpbHRlcihlID0+IGUpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJvbnRPYmo6IGFueVtdIHwgdW5kZWZpbmVkID0gcGF0aChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9udFBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGllZFByb3BzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZyb250T2JqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDcmF3bCBsYXlvdXQgbmVlZHMgdGhlIG5zL3R5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBhdGhzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ub2xkT2JqLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ub2xkT2JqLnByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uYXBwbGllZFByb3BzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZE9iaixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzKGFwcGxpZWRQcm9wcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGRvIGl0IG9uY2UgZm9yIHRoZSBjb21wb25lbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbXB1dGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuUHJvcFBhdGggPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuUHJvcC5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBwYXRoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuUHJvcFBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGllZFByb3BzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkQ2hpbGRyZW5QYXRoID0gY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhdGgob2xkUGF0aHMsIHBhcnNlZElkKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ3Byb3BzJ10uY29uY2F0KGNoaWxkcmVuUHJvcFBhdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkQ2hpbGRyZW4gPSBwYXRoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZENoaWxkcmVuUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRMYXlvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBhdGhzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZENoaWxkcmVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZENoaWxkcmVuUGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXJzaXN0ZW5jZSBlZGdlIGNhc2U6IGlmIHlvdSBleHBsaWNpdGx5IHVwZGF0ZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcnNpc3RlbmNlIGtleSwgb3RoZXIgcHJvcHMgbWF5IGNoYW5nZSB0aGF0IHJlcXVpcmUgdXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGZpcmUgYWRkaXRpb25hbCBjYWxsYmFja3NcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkZGVkUHJvcHMgPSBwaWNrQnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKF8sIGspID0+ICEoayBpbiBwcm9wcyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGllZFByb3BzXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0VtcHR5KGFkZGVkUHJvcHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qge2dyYXBoczogY3VycmVudEdyYXBocywgcGF0aHN9ID0gZ2V0U3RhdGUoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENhbGxiYWNrcyA9IGNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ2FsbGJhY2tzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlT2JzZXJ2ZXJzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZFByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEdyYXBocyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkubWFwKHJjYiA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmNiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGVjZXNzb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIGluZm9ybWF0aW9uIGFib3V0IHBvdGVudGlhbGx5IHVwZGF0ZWQgb3V0cHV0cyB2cy4gdXBkYXRlZCBvdXRwdXRzLFxuICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBiZSB1c2VkIHRvIGRyb3AgY2FsbGJhY2tzIGZyb20gZXhlY3V0aW9uIGdyb3VwcyB3aGVuIG5vIG91dHB1dFxuICAgICAgICAgICAgICAgIC8vIG1hdGNoaW5nIHRoZSBkb3duc3RyZWFtIGNhbGxiYWNrJ3MgaW5wdXRzIHdlcmUgbW9kaWZpZWRcbiAgICAgICAgICAgICAgICBzdG9yZWRDYWxsYmFja3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25NZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxQcm9wczogbWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVJZEFuZFByb3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdHRlbihjYi5nZXRPdXRwdXRzKGdldFN0YXRlKCkucGF0aHMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRQcm9wczogZmxhdHRlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbaWQsIHZhbHVlXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lSWRBbmRQcm9wKHtpZCwgcHJvcGVydHl9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzKHZhbHVlKSBhcyBzdHJpbmdbXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9QYWlycyhkYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dHMgPSBwYXlsb2FkXG4gICAgICAgICAgICAgICAgICAgID8gbWFwKGNvbWJpbmVJZEFuZFByb3AsIGZsYXR0ZW4oW3BheWxvYWQub3V0cHV0c10pKS5qb2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnLCAnXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICA6IG91dHB1dDtcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBDYWxsYmFjayBlcnJvciB1cGRhdGluZyAke291dHB1dHN9YDtcbiAgICAgICAgICAgICAgICBpZiAoY2xpZW50c2lkZV9mdW5jdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7bmFtZXNwYWNlOiBucywgZnVuY3Rpb25fbmFtZTogZm59ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudHNpZGVfZnVuY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gYCB2aWEgY2xpZW50c2lkZSBmdW5jdGlvbiAke25zfS4ke2ZufWA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaGFuZGxlQXN5bmNFcnJvcihlcnJvciwgbWVzc2FnZSwgZGlzcGF0Y2gpO1xuXG4gICAgICAgICAgICAgICAgc3RvcmVkQ2FsbGJhY2tzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAuLi5jYixcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uTWV0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsUHJvcHM6IG1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lSWRBbmRQcm9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhnZXRTdGF0ZSgpLnBhdGhzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkUHJvcHM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICBhZ2dyZWdhdGVDYWxsYmFja3MoW1xuICAgICAgICAgICAgICAgIGV4ZWN1dGVkLmxlbmd0aCA/IHJlbW92ZUV4ZWN1dGVkQ2FsbGJhY2tzKGV4ZWN1dGVkKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgZXhlY3V0ZWQubGVuZ3RoID8gYWRkQ29tcGxldGVkQ2FsbGJhY2tzKGV4ZWN1dGVkLmxlbmd0aCkgOiBudWxsLFxuICAgICAgICAgICAgICAgIHN0b3JlZENhbGxiYWNrcy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgPyBhZGRTdG9yZWRDYWxsYmFja3Moc3RvcmVkQ2FsbGJhY2tzKVxuICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQ2FsbGJhY2tzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICA/IGFkZFJlcXVlc3RlZENhbGxiYWNrcyhyZXF1ZXN0ZWRDYWxsYmFja3MpXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgXSlcbiAgICAgICAgKTtcbiAgICB9LFxuICAgIGlucHV0czogWydjYWxsYmFja3MuZXhlY3V0ZWQnXVxufTtcblxuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQge2Fzc29jLCBmaW5kLCBwYXJ0aXRpb259IGZyb20gJ3JhbWRhJztcblxuaW1wb3J0IHtcbiAgICBhZGRFeGVjdXRlZENhbGxiYWNrcyxcbiAgICBhZGRXYXRjaGVkQ2FsbGJhY2tzLFxuICAgIGFnZ3JlZ2F0ZUNhbGxiYWNrcyxcbiAgICByZW1vdmVFeGVjdXRpbmdDYWxsYmFja3MsXG4gICAgcmVtb3ZlV2F0Y2hlZENhbGxiYWNrc1xufSBmcm9tICcuLi9hY3Rpb25zL2NhbGxiYWNrcyc7XG5cbmltcG9ydCB7SVN0b3JlT2JzZXJ2ZXJEZWZpbml0aW9ufSBmcm9tICcuLi9TdG9yZU9ic2VydmVyJztcbmltcG9ydCB7SVN0b3JlU3RhdGV9IGZyb20gJy4uL3N0b3JlJztcbmltcG9ydCB7Z2V0QXBwU3RhdGV9IGZyb20gJy4uL3JlZHVjZXJzL2NvbnN0YW50cyc7XG5cbmNvbnN0IG9ic2VydmVyOiBJU3RvcmVPYnNlcnZlckRlZmluaXRpb248SVN0b3JlU3RhdGU+ID0ge1xuICAgIG9ic2VydmVyOiAoe2Rpc3BhdGNoLCBnZXRTdGF0ZX0pID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgY2FsbGJhY2tzOiB7ZXhlY3V0aW5nfVxuICAgICAgICB9ID0gZ2V0U3RhdGUoKTtcblxuICAgICAgICBjb25zdCBbZGVmZXJyZWQsIHNraXBwZWRPclJlYWR5XSA9IHBhcnRpdGlvbihcbiAgICAgICAgICAgIGNiID0+IGNiLmV4ZWN1dGlvblByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlLFxuICAgICAgICAgICAgZXhlY3V0aW5nXG4gICAgICAgICk7XG5cbiAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICBhZ2dyZWdhdGVDYWxsYmFja3MoW1xuICAgICAgICAgICAgICAgIGV4ZWN1dGluZy5sZW5ndGggPyByZW1vdmVFeGVjdXRpbmdDYWxsYmFja3MoZXhlY3V0aW5nKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQubGVuZ3RoID8gYWRkV2F0Y2hlZENhbGxiYWNrcyhkZWZlcnJlZCkgOiBudWxsLFxuICAgICAgICAgICAgICAgIHNraXBwZWRPclJlYWR5Lmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICA/IGFkZEV4ZWN1dGVkQ2FsbGJhY2tzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkT3JSZWFkeS5tYXAoY2IgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleGVjdXRpb25SZXN1bHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLmV4ZWN1dGlvblByb21pc2UgYXMgYW55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgXSlcbiAgICAgICAgKTtcblxuICAgICAgICBkZWZlcnJlZC5mb3JFYWNoKGFzeW5jIGNiID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNiLmV4ZWN1dGlvblByb21pc2U7XG5cbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja3M6IHt3YXRjaGVkfSxcbiAgICAgICAgICAgICAgICBhcHBMaWZlY3ljbGUsXG4gICAgICAgICAgICAgICAgaG9va3M6IHtjYWxsYmFja19yZXNvbHZlZH1cbiAgICAgICAgICAgIH0gPSBnZXRTdGF0ZSgpO1xuXG4gICAgICAgICAgICBpZiAoYXBwTGlmZWN5Y2xlICE9PSBnZXRBcHBTdGF0ZSgnSFlEUkFURUQnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrX3Jlc29sdmVkKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2tfcmVzb2x2ZWQoY2IuY2FsbGJhY2ssIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYmVlbiByZW1vdmVkIGZyb20gdGhlIGB3YXRjaGVkYCBsaXN0IHNpbmNlIC0gb24gY2FsbGJhY2sgY29tcGxldGlvbiwgYW5vdGhlciBjYWxsYmFjayBtYXkgYmUgY2FuY2VsbGVkXG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBjYWxsYmFjayBpbnN0YW5jZSBvciBvbmUgdGhhdCBtYXRjaGVzIGl0cyBwcm9taXNlIChlZy4gY291bGQgaGF2ZSBiZWVuIHBydW5lZClcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDYiA9IGZpbmQoXG4gICAgICAgICAgICAgICAgX2NiID0+XG4gICAgICAgICAgICAgICAgICAgIF9jYiA9PT0gY2IgfHwgX2NiLmV4ZWN1dGlvblByb21pc2UgPT09IGNiLmV4ZWN1dGlvblByb21pc2UsXG4gICAgICAgICAgICAgICAgd2F0Y2hlZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghY3VycmVudENiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPdGhlcndpc2UgbW92ZSB0byBgZXhlY3V0ZWRgIGFuZCByZW1vdmUgZnJvbSBgd2F0Y2hlZGBcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZVdhdGNoZWRDYWxsYmFja3MoW2N1cnJlbnRDYl0pLFxuICAgICAgICAgICAgICAgICAgICBhZGRFeGVjdXRlZENhbGxiYWNrcyhbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudENiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvblJlc3VsdDogcmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgaW5wdXRzOiBbJ2NhbGxiYWNrcy5leGVjdXRpbmcnXVxufTtcblxuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQge0lTdG9yZU9ic2VydmVyRGVmaW5pdGlvbn0gZnJvbSAnLi4vU3RvcmVPYnNlcnZlcic7XG5pbXBvcnQge0lTdG9yZVN0YXRlfSBmcm9tICcuLi9zdG9yZSc7XG5pbXBvcnQge2dldFBlbmRpbmdDYWxsYmFja3N9IGZyb20gJy4uL3V0aWxzL2NhbGxiYWNrcyc7XG5pbXBvcnQge3NldElzTG9hZGluZ30gZnJvbSAnLi4vYWN0aW9ucy9pc0xvYWRpbmcnO1xuXG5jb25zdCBvYnNlcnZlcjogSVN0b3JlT2JzZXJ2ZXJEZWZpbml0aW9uPElTdG9yZVN0YXRlPiA9IHtcbiAgICBvYnNlcnZlcjogKHtkaXNwYXRjaCwgZ2V0U3RhdGV9KSA9PiB7XG4gICAgICAgIGNvbnN0IHtjYWxsYmFja3MsIGlzTG9hZGluZ30gPSBnZXRTdGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IHBlbmRpbmdDYWxsYmFja3MgPSBnZXRQZW5kaW5nQ2FsbGJhY2tzKGNhbGxiYWNrcyk7XG5cbiAgICAgICAgY29uc3QgbmV4dCA9IEJvb2xlYW4ocGVuZGluZ0NhbGxiYWNrcy5sZW5ndGgpO1xuXG4gICAgICAgIGlmIChpc0xvYWRpbmcgIT09IG5leHQpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKHNldElzTG9hZGluZyhuZXh0KSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGlucHV0czogWydjYWxsYmFja3MnXVxufTtcblxuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQge2VxdWFscywgZmxhdHRlbiwgaXNFbXB0eSwgbWFwLCByZWR1Y2V9IGZyb20gJ3JhbWRhJztcblxuaW1wb3J0IHtzZXRMb2FkaW5nTWFwfSBmcm9tICcuLi9hY3Rpb25zL2xvYWRpbmdNYXAnO1xuaW1wb3J0IHtJU3RvcmVPYnNlcnZlckRlZmluaXRpb259IGZyb20gJy4uL1N0b3JlT2JzZXJ2ZXInO1xuaW1wb3J0IHtJU3RvcmVTdGF0ZX0gZnJvbSAnLi4vc3RvcmUnO1xuaW1wb3J0IHtJTGF5b3V0Q2FsbGJhY2tQcm9wZXJ0eX0gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2tzJztcblxuY29uc3Qgb2JzZXJ2ZXI6IElTdG9yZU9ic2VydmVyRGVmaW5pdGlvbjxJU3RvcmVTdGF0ZT4gPSB7XG4gICAgb2JzZXJ2ZXI6ICh7ZGlzcGF0Y2gsIGdldFN0YXRlfSkgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjYWxsYmFja3M6IHtleGVjdXRpbmcsIHdhdGNoZWQsIGV4ZWN1dGVkfSxcbiAgICAgICAgICAgIGxvYWRpbmdNYXAsXG4gICAgICAgICAgICBwYXRoc1xuICAgICAgICB9ID0gZ2V0U3RhdGUoKTtcblxuICAgICAgICAvKlxuICAgICAgICAgICAgR2V0IHRoZSBwYXRoIG9mIGFsbCBjb21wb25lbnRzIGltcGFjdGVkIGJ5IGNhbGxiYWNrc1xuICAgICAgICAgICAgd2l0aCBzdGF0ZXM6IGV4ZWN1dGluZywgd2F0Y2hlZCwgZXhlY3V0ZWQuXG5cbiAgICAgICAgICAgIEZvciBlYWNoIHBhdGgsIGtlZXAgdHJhY2sgb2YgYWxsIChpZCxwcm9wKSB0dXBsZXMgdGhhdFxuICAgICAgICAgICAgYXJlIGltcGFjdGVkIGZvciB0aGlzIG5vZGUgYW5kIG5lc3RlZCBub2Rlcy5cbiAgICAgICAgKi9cblxuICAgICAgICBjb25zdCBsb2FkaW5nUGF0aHM6IElMYXlvdXRDYWxsYmFja1Byb3BlcnR5W10gPSBmbGF0dGVuKFxuICAgICAgICAgICAgbWFwKFxuICAgICAgICAgICAgICAgIGNiID0+IGNiLmdldE91dHB1dHMocGF0aHMpLFxuICAgICAgICAgICAgICAgIFsuLi5leGVjdXRpbmcsIC4uLndhdGNoZWQsIC4uLmV4ZWN1dGVkXVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IG5leHRNYXA6IGFueSA9IGlzRW1wdHkobG9hZGluZ1BhdGhzKVxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IHJlZHVjZShcbiAgICAgICAgICAgICAgICAgIChyZXMsIHtpZCwgcHJvcGVydHksIHBhdGh9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IHJlcztcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZHByb3AgPSB7aWQsIHByb3BlcnR5fTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc2lnbiBhbGwgYWZmZWN0ZWQgcHJvcHMgZm9yIHRoaXMgcGF0aCBhbmQgbmVzdGVkIHBhdGhzXG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Ll9fZGFzaHByaXZhdGVfX2lkcHJvcHNfXyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5fX2Rhc2hwcml2YXRlX19pZHByb3BzX18gfHwgW107XG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Ll9fZGFzaHByaXZhdGVfX2lkcHJvcHNfXy5wdXNoKGlkcHJvcCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBwYXRoLmZvckVhY2goKHAsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0W3BdID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtwXSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHAgPT09ICdjaGlsZHJlbicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwYXRoW2kgKyAxXSA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Ll9fZGFzaHByaXZhdGVfX2lkcHJvcHNfXyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuX19kYXNocHJpdmF0ZV9faWRwcm9wc19fIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuX19kYXNocHJpdmF0ZV9faWRwcm9wc19fLnB1c2goaWRwcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc2lnbiBvbmUgYWZmZWN0ZWQgcHJvcCBmb3IgdGhpcyBwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Ll9fZGFzaHByaXZhdGVfX2lkcHJvcF9fID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Ll9fZGFzaHByaXZhdGVfX2lkcHJvcF9fIHx8IGlkcHJvcDtcblxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAge30gYXMgYW55LFxuICAgICAgICAgICAgICAgICAgbG9hZGluZ1BhdGhzXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFlcXVhbHMobmV4dE1hcCwgbG9hZGluZ01hcCkpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKHNldExvYWRpbmdNYXAobmV4dE1hcCkpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBpbnB1dHM6IFsnY2FsbGJhY2tzLmV4ZWN1dGluZycsICdjYWxsYmFja3Mud2F0Y2hlZCcsICdjYWxsYmFja3MuZXhlY3V0ZWQnXVxufTtcblxuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQge2ZpbmQsIGZsYXR0ZW4sIG1hcCwgcGFydGl0aW9uLCBwbHVjaywgc29ydCwgdW5pcX0gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQge0lTdG9yZVN0YXRlfSBmcm9tICcuLi9zdG9yZSc7XG5cbmltcG9ydCB7XG4gICAgYWRkQmxvY2tlZENhbGxiYWNrcyxcbiAgICBhZGRFeGVjdXRpbmdDYWxsYmFja3MsXG4gICAgYWdncmVnYXRlQ2FsbGJhY2tzLFxuICAgIGV4ZWN1dGVDYWxsYmFjayxcbiAgICByZW1vdmVCbG9ja2VkQ2FsbGJhY2tzLFxuICAgIHJlbW92ZVByaW9yaXRpemVkQ2FsbGJhY2tzXG59IGZyb20gJy4uL2FjdGlvbnMvY2FsbGJhY2tzJztcblxuaW1wb3J0IHtzdHJpbmdpZnlJZH0gZnJvbSAnLi4vYWN0aW9ucy9kZXBlbmRlbmNpZXMnO1xuXG5pbXBvcnQge2NvbWJpbmVJZEFuZFByb3B9IGZyb20gJy4uL2FjdGlvbnMvZGVwZW5kZW5jaWVzX3RzJztcblxuaW1wb3J0IGlzQXBwUmVhZHkgZnJvbSAnLi4vYWN0aW9ucy9pc0FwcFJlYWR5JztcblxuaW1wb3J0IHtcbiAgICBJQmxvY2tlZENhbGxiYWNrLFxuICAgIElDYWxsYmFjayxcbiAgICBJTGF5b3V0Q2FsbGJhY2tQcm9wZXJ0eSxcbiAgICBJUHJpb3JpdGl6ZWRDYWxsYmFja1xufSBmcm9tICcuLi90eXBlcy9jYWxsYmFja3MnO1xuaW1wb3J0IHtJU3RvcmVPYnNlcnZlckRlZmluaXRpb259IGZyb20gJy4uL1N0b3JlT2JzZXJ2ZXInO1xuaW1wb3J0IHtnZXRBcHBTdGF0ZX0gZnJvbSAnLi4vcmVkdWNlcnMvY29uc3RhbnRzJztcblxuY29uc3Qgc29ydFByaW9yaXR5ID0gKGMxOiBJQ2FsbGJhY2ssIGMyOiBJQ2FsbGJhY2spOiBudW1iZXIgPT4ge1xuICAgIHJldHVybiAoYzEucHJpb3JpdHkgPz8gJycpID4gKGMyLnByaW9yaXR5ID8/ICcnKSA/IC0xIDogMTtcbn07XG5cbmNvbnN0IGdldFN0YXNoID0gKFxuICAgIGNiOiBJUHJpb3JpdGl6ZWRDYWxsYmFjayxcbiAgICBwYXRoczogYW55XG4pOiB7XG4gICAgYWxsT3V0cHV0czogSUxheW91dENhbGxiYWNrUHJvcGVydHlbXVtdO1xuICAgIGFsbFByb3BJZHM6IGFueVtdO1xufSA9PiB7XG4gICAgY29uc3Qge2dldE91dHB1dHN9ID0gY2I7XG4gICAgY29uc3QgYWxsT3V0cHV0cyA9IGdldE91dHB1dHMocGF0aHMpO1xuICAgIGNvbnN0IGZsYXRPdXRwdXRzOiBhbnlbXSA9IGZsYXR0ZW4oYWxsT3V0cHV0cyk7XG4gICAgY29uc3QgYWxsUHJvcElkczogYW55W10gPSBbXTtcblxuICAgIGNvbnN0IHJlcU91dDogYW55ID0ge307XG4gICAgZmxhdE91dHB1dHMuZm9yRWFjaCgoe2lkLCBwcm9wZXJ0eX0pID0+IHtcbiAgICAgICAgY29uc3QgaWRTdHIgPSBzdHJpbmdpZnlJZChpZCk7XG4gICAgICAgIGNvbnN0IGlkT3V0ID0gKHJlcU91dFtpZFN0cl0gPSByZXFPdXRbaWRTdHJdIHx8IFtdKTtcbiAgICAgICAgaWRPdXQucHVzaChwcm9wZXJ0eSk7XG4gICAgICAgIGFsbFByb3BJZHMucHVzaChjb21iaW5lSWRBbmRQcm9wKHtpZDogaWRTdHIsIHByb3BlcnR5fSkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHthbGxPdXRwdXRzLCBhbGxQcm9wSWRzfTtcbn07XG5cbmNvbnN0IGdldElkcyA9IChjYjogSUNhbGxiYWNrLCBwYXRoczogYW55KSA9PlxuICAgIHVuaXEoXG4gICAgICAgIHBsdWNrKCdpZCcsIFtcbiAgICAgICAgICAgIC4uLmZsYXR0ZW4oY2IuZ2V0SW5wdXRzKHBhdGhzKSksXG4gICAgICAgICAgICAuLi5mbGF0dGVuKGNiLmdldFN0YXRlKHBhdGhzKSlcbiAgICAgICAgXSlcbiAgICApO1xuXG5jb25zdCBvYnNlcnZlcjogSVN0b3JlT2JzZXJ2ZXJEZWZpbml0aW9uPElTdG9yZVN0YXRlPiA9IHtcbiAgICBvYnNlcnZlcjogYXN5bmMgKHtkaXNwYXRjaCwgZ2V0U3RhdGV9KSA9PiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNhbGxiYWNrczoge2V4ZWN1dGluZywgd2F0Y2hlZH0sXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICBob29rcyxcbiAgICAgICAgICAgIGxheW91dCxcbiAgICAgICAgICAgIHBhdGhzLFxuICAgICAgICAgICAgYXBwTGlmZWN5Y2xlXG4gICAgICAgIH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBsZXQge1xuICAgICAgICAgICAgY2FsbGJhY2tzOiB7cHJpb3JpdGl6ZWR9XG4gICAgICAgIH0gPSBnZXRTdGF0ZSgpO1xuXG4gICAgICAgIGlmIChhcHBMaWZlY3ljbGUgIT09IGdldEFwcFN0YXRlKCdIWURSQVRFRCcpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhdmFpbGFibGUgPSBNYXRoLm1heCgwLCAxMiAtIGV4ZWN1dGluZy5sZW5ndGggLSB3YXRjaGVkLmxlbmd0aCk7XG5cbiAgICAgICAgLy8gT3JkZXIgcHJpb3JpdGl6ZWQgY2FsbGJhY2tzIGJhc2VkIG9uIGRlcHRoIGFuZCBicmVhZHRoIG9mIGNhbGxiYWNrIGNoYWluXG4gICAgICAgIHByaW9yaXRpemVkID0gc29ydChzb3J0UHJpb3JpdHksIHByaW9yaXRpemVkKTtcblxuICAgICAgICAvLyBEaXZpZGUgYmV0d2VlbiBzeW5jIGFuZCBhc3luY1xuICAgICAgICBjb25zdCBbc3luY0NhbGxiYWNrcywgYXN5bmNDYWxsYmFja3NdID0gcGFydGl0aW9uKFxuICAgICAgICAgICAgY2IgPT4gaXNBcHBSZWFkeShsYXlvdXQsIHBhdGhzLCBnZXRJZHMoY2IsIHBhdGhzKSkgPT09IHRydWUsXG4gICAgICAgICAgICBwcmlvcml0aXplZFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHBpY2tlZFN5bmNDYWxsYmFja3MgPSBzeW5jQ2FsbGJhY2tzLnNsaWNlKDAsIGF2YWlsYWJsZSk7XG4gICAgICAgIGNvbnN0IHBpY2tlZEFzeW5jQ2FsbGJhY2tzID0gYXN5bmNDYWxsYmFja3Muc2xpY2UoXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgYXZhaWxhYmxlIC0gcGlja2VkU3luY0NhbGxiYWNrcy5sZW5ndGhcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocGlja2VkU3luY0NhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZVByaW9yaXRpemVkQ2FsbGJhY2tzKHBpY2tlZFN5bmNDYWxsYmFja3MpLFxuICAgICAgICAgICAgICAgICAgICBhZGRFeGVjdXRpbmdDYWxsYmFja3MoXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUNhbGxiYWNrKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob29rcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3Rhc2goY2IsIHBhdGhzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNrZWRTeW5jQ2FsbGJhY2tzXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwaWNrZWRBc3luY0NhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmVycmVkID0gbWFwPElQcmlvcml0aXplZENhbGxiYWNrLCBJQmxvY2tlZENhbGxiYWNrPihcbiAgICAgICAgICAgICAgICBjYiA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAuLi5jYixcbiAgICAgICAgICAgICAgICAgICAgLi4uZ2V0U3Rhc2goY2IsIHBhdGhzKSxcbiAgICAgICAgICAgICAgICAgICAgaXNSZWFkeTogaXNBcHBSZWFkeShsYXlvdXQsIHBhdGhzLCBnZXRJZHMoY2IsIHBhdGhzKSlcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBwaWNrZWRBc3luY0NhbGxiYWNrc1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgYWdncmVnYXRlQ2FsbGJhY2tzKFtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUHJpb3JpdGl6ZWRDYWxsYmFja3MocGlja2VkQXN5bmNDYWxsYmFja3MpLFxuICAgICAgICAgICAgICAgICAgICBhZGRCbG9ja2VkQ2FsbGJhY2tzKGRlZmVycmVkKVxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBkZWZlcnJlZC5mb3JFYWNoKGFzeW5jIGNiID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBjYi5pc1JlYWR5O1xuXG4gICAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3M6IHtibG9ja2VkfVxuICAgICAgICAgICAgICAgIH0gPSBnZXRTdGF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgYGJsb2NrZWRgIGxpc3Qgc2luY2UgLSBvblxuICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIGNvbXBsZXRpb24sIGFub3RoZXIgY2FsbGJhY2sgbWF5IGJlIGNhbmNlbGxlZFxuICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGNhbGxiYWNrIGluc3RhbmNlIG9yIG9uZSB0aGF0IG1hdGNoZXMgaXRzIHByb21pc2VcbiAgICAgICAgICAgICAgICAvLyAoZWcuIGNvdWxkIGhhdmUgYmVlbiBwcnVuZWQpXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudENiID0gZmluZChcbiAgICAgICAgICAgICAgICAgICAgX2NiID0+IF9jYiA9PT0gY2IgfHwgX2NiLmlzUmVhZHkgPT09IGNiLmlzUmVhZHksXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrZWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICghY3VycmVudENiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRpbmdDYWxsYmFjayA9IGV4ZWN1dGVDYWxsYmFjayhcbiAgICAgICAgICAgICAgICAgICAgY2IsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgaG9va3MsXG4gICAgICAgICAgICAgICAgICAgIHBhdGhzLFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXQsXG4gICAgICAgICAgICAgICAgICAgIGNiLFxuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgZ2V0U3RhdGVcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVCbG9ja2VkQ2FsbGJhY2tzKFtjYl0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXhlY3V0aW5nQ2FsbGJhY2tzKFtleGVjdXRpbmdDYWxsYmFja10pXG4gICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBpbnB1dHM6IFsnY2FsbGJhY2tzLnByaW9yaXRpemVkJywgJ2NhbGxiYWNrcy5jb21wbGV0ZWQnXVxufTtcblxuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQge1xuICAgIGFsbCxcbiAgICBjb25jYXQsXG4gICAgZGlmZmVyZW5jZSxcbiAgICBmaWx0ZXIsXG4gICAgZmxhdHRlbixcbiAgICBncm91cEJ5LFxuICAgIGluY2x1ZGVzLFxuICAgIGludGVyc2VjdGlvbixcbiAgICBpc0VtcHR5LFxuICAgIGlzTmlsLFxuICAgIG1hcCxcbiAgICBtZXJnZUxlZnQsXG4gICAgbWVyZ2VXaXRoLFxuICAgIHBsdWNrLFxuICAgIHJlZHVjZSxcbiAgICB2YWx1ZXNcbn0gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQge0lTdG9yZVN0YXRlfSBmcm9tICcuLi9zdG9yZSc7XG5cbmltcG9ydCB7XG4gICAgYWdncmVnYXRlQ2FsbGJhY2tzLFxuICAgIHJlbW92ZVByaW9yaXRpemVkQ2FsbGJhY2tzLFxuICAgIHJlbW92ZUV4ZWN1dGluZ0NhbGxiYWNrcyxcbiAgICByZW1vdmVXYXRjaGVkQ2FsbGJhY2tzLFxuICAgIGFkZFByaW9yaXRpemVkQ2FsbGJhY2tzLFxuICAgIGFkZEV4ZWN1dGluZ0NhbGxiYWNrcyxcbiAgICBhZGRXYXRjaGVkQ2FsbGJhY2tzLFxuICAgIHJlbW92ZUJsb2NrZWRDYWxsYmFja3MsXG4gICAgYWRkQmxvY2tlZENhbGxiYWNrcyxcbiAgICBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MsXG4gICAgcmVtb3ZlUmVxdWVzdGVkQ2FsbGJhY2tzXG59IGZyb20gJy4uL2FjdGlvbnMvY2FsbGJhY2tzJztcblxuaW1wb3J0IHtpc011bHRpVmFsdWVkfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5cbmltcG9ydCB7XG4gICAgY29tYmluZUlkQW5kUHJvcCxcbiAgICBnZXRSZWFkeUNhbGxiYWNrcyxcbiAgICBnZXRVbmlxdWVJZGVudGlmaWVyLFxuICAgIHBydW5lQ2FsbGJhY2tzXG59IGZyb20gJy4uL2FjdGlvbnMvZGVwZW5kZW5jaWVzX3RzJztcblxuaW1wb3J0IHtcbiAgICBJQ2FsbGJhY2ssXG4gICAgSUV4ZWN1dGluZ0NhbGxiYWNrLFxuICAgIElTdG9yZWRDYWxsYmFjayxcbiAgICBJQmxvY2tlZENhbGxiYWNrXG59IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrcyc7XG5cbmltcG9ydCB3YWl0IGZyb20gJy4vLi4vdXRpbHMvd2FpdCc7XG5cbmltcG9ydCB7Z2V0UGVuZGluZ0NhbGxiYWNrc30gZnJvbSAnLi4vdXRpbHMvY2FsbGJhY2tzJztcbmltcG9ydCB7SVN0b3JlT2JzZXJ2ZXJEZWZpbml0aW9ufSBmcm9tICcuLi9TdG9yZU9ic2VydmVyJztcblxuY29uc3Qgb2JzZXJ2ZXI6IElTdG9yZU9ic2VydmVyRGVmaW5pdGlvbjxJU3RvcmVTdGF0ZT4gPSB7XG4gICAgb2JzZXJ2ZXI6IGFzeW5jICh7ZGlzcGF0Y2gsIGdldFN0YXRlfSkgPT4ge1xuICAgICAgICBhd2FpdCB3YWl0KDApO1xuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNhbGxiYWNrcyxcbiAgICAgICAgICAgIGNhbGxiYWNrczoge3ByaW9yaXRpemVkLCBibG9ja2VkLCBleGVjdXRpbmcsIHdhdGNoZWQsIHN0b3JlZH0sXG4gICAgICAgICAgICBwYXRocyxcbiAgICAgICAgICAgIGdyYXBoc1xuICAgICAgICB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGNhbGxiYWNrczoge3JlcXVlc3RlZH1cbiAgICAgICAgfSA9IGdldFN0YXRlKCk7XG5cbiAgICAgICAgY29uc3QgaW5pdGlhbFJlcXVlc3RlZCA9IHJlcXVlc3RlZC5zbGljZSgwKTtcblxuICAgICAgICBjb25zdCBwZW5kaW5nQ2FsbGJhY2tzID0gZ2V0UGVuZGluZ0NhbGxiYWNrcyhjYWxsYmFja3MpO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAgICAwLiBQcnVuZSBjaXJjdWxhciBjYWxsYmFja3MgdGhhdCBoYXZlIGNvbXBsZXRlZCB0aGUgbG9vcFxuICAgICAgICAgICAgLSBjYi5jYWxsYmFjayBpbmNsdWRlZCBpbiBjYi5wcmVkZWNlc3NvcnNcbiAgICAgICAgKi9cbiAgICAgICAgY29uc3QgckNpcmN1bGFycyA9IGZpbHRlcihcbiAgICAgICAgICAgIGNiID0+IGluY2x1ZGVzKGNiLmNhbGxiYWNrLCBjYi5wcmVkZWNlc3NvcnMgPz8gW10pLFxuICAgICAgICAgICAgcmVxdWVzdGVkXG4gICAgICAgICk7XG5cbiAgICAgICAgLypcbiAgICAgICAgICAgIFRPRE8/XG4gICAgICAgICAgICBDbGVhbiB1cCB0aGUgYHJlcXVlc3RlZGAgbGlzdCAtIGR1cmluZyB0aGUgZGlzcGF0Y2ggcGhhc2UsXG4gICAgICAgICAgICBjaXJjdWxhcnMgd2lsbCBiZSByZW1vdmVkIGZvciByZWFsXG4gICAgICAgICovXG4gICAgICAgIHJlcXVlc3RlZCA9IGRpZmZlcmVuY2UocmVxdWVzdGVkLCByQ2lyY3VsYXJzKTtcblxuICAgICAgICAvKlxuICAgICAgICAgICAgMS4gUmVtb3ZlIGR1cGxpY2F0ZWQgYHJlcXVlc3RlZGAgY2FsbGJhY2tzIC0gZ2l2ZSBwcmVjZWRlbmNlIHRvIG5ld2VyIGNhbGxiYWNrcyBvdmVyIG9sZGVyIG9uZXNcbiAgICAgICAgKi9cblxuICAgICAgICBsZXQgckR1cGxpY2F0ZXM6IElDYWxsYmFja1tdID0gW107XG4gICAgICAgIGNvbnN0IHJNZXJnZWREdXBsaWNhdGVzOiBJQ2FsbGJhY2tbXSA9IFtdO1xuXG4gICAgICAgIHZhbHVlcyhncm91cEJ5PElDYWxsYmFjaz4oZ2V0VW5pcXVlSWRlbnRpZmllciwgcmVxdWVzdGVkKSkuZm9yRWFjaChcbiAgICAgICAgICAgIGdyb3VwID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXAubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgY2FsbGJhY2sgaWYgaXRzIHRoZSBvbmx5IG9uZSBvZiBpdHMga2luZFxuICAgICAgICAgICAgICAgICAgICByTWVyZ2VkRHVwbGljYXRlcy5wdXNoKGdyb3VwWzBdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbml0aWFsID0gZ3JvdXAuZmluZChjYiA9PiBjYi5pbml0aWFsQ2FsbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbml0aWFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIHRoZSBpbml0aWFsIGNhbGxiYWNrIGlmIGl0J3Mgbm90IGFsb25lXG4gICAgICAgICAgICAgICAgICAgICAgICByRHVwbGljYXRlcy5wdXNoKGluaXRpYWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBXaXRob3V0SW5pdGlhbCA9IGdyb3VwLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiID0+IGNiICE9PSBpbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChncm91cFdpdGhvdXRJbml0aWFsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUncyBvbmx5IG9uZSBjYWxsYmFjayBiZXNpZGUgdGhlIGluaXRpYWwgb25lLCBrZWVwIHRoYXQgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgICAgIHJNZXJnZWREdXBsaWNhdGVzLnB1c2goZ3JvdXBXaXRob3V0SW5pdGlhbFswXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgbWVyZ2UgYWxsIHJlbWFpbmluZyBjYWxsYmFja3MgdG9nZXRoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJEdXBsaWNhdGVzID0gY29uY2F0KHJEdXBsaWNhdGVzLCBncm91cFdpdGhvdXRJbml0aWFsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJNZXJnZWREdXBsaWNhdGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VMZWZ0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkUHJvcElkczogcmVkdWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlV2l0aChNYXRoLm1heCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Y2soXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjaGFuZ2VkUHJvcElkcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwV2l0aG91dEluaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uR3JvdXA6IGZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGcgPT4gQm9vbGVhbihleGcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWNrKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhlY3V0aW9uR3JvdXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cFdpdGhvdXRJbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zbGljZSgtMSlbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwV2l0aG91dEluaXRpYWwuc2xpY2UoLTEpWzBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBhcyBJQ2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgLypcbiAgICAgICAgICAgIFRPRE8/XG4gICAgICAgICAgICBDbGVhbiB1cCB0aGUgYHJlcXVlc3RlZGAgbGlzdCAtIGR1cmluZyB0aGUgZGlzcGF0Y2ggcGhhc2UsXG4gICAgICAgICAgICBkdXBsaWNhdGVzIHdpbGwgYmUgcmVtb3ZlZCBmb3IgcmVhbFxuICAgICAgICAqL1xuICAgICAgICByZXF1ZXN0ZWQgPSByTWVyZ2VkRHVwbGljYXRlcztcblxuICAgICAgICAvKlxuICAgICAgICAgICAgMi4gUmVtb3ZlIGR1cGxpY2F0ZWQgYHByaW9yaXRpemVkYCwgYGV4ZWN1dGluZ2AgYW5kIGB3YXRjaGluZ2AgY2FsbGJhY2tzXG4gICAgICAgICovXG5cbiAgICAgICAgLypcbiAgICAgICAgICAgIEV4dHJhY3QgYWxsIGJ1dCB0aGUgZmlyc3QgY2FsbGJhY2sgZnJvbSBlYWNoIElPUy1rZXkgZ3JvdXBcbiAgICAgICAgICAgIHRoZXNlIGNhbGxiYWNrcyBhcmUgYHByaW9yaXRpemVkYCBhbmQgZHVwbGljYXRlcy5cbiAgICAgICAgKi9cbiAgICAgICAgY29uc3QgcER1cGxpY2F0ZXMgPSBmbGF0dGVuKFxuICAgICAgICAgICAgbWFwKFxuICAgICAgICAgICAgICAgIGdyb3VwID0+IGdyb3VwLnNsaWNlKDAsIC0xKSxcbiAgICAgICAgICAgICAgICB2YWx1ZXMoXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwQnk8SUNhbGxiYWNrPihcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFVuaXF1ZUlkZW50aWZpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25jYXQocHJpb3JpdGl6ZWQsIHJlcXVlc3RlZClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBiRHVwbGljYXRlcyA9IGZsYXR0ZW4oXG4gICAgICAgICAgICBtYXAoXG4gICAgICAgICAgICAgICAgZ3JvdXAgPT4gZ3JvdXAuc2xpY2UoMCwgLTEpLFxuICAgICAgICAgICAgICAgIHZhbHVlcyhcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBCeTxJQ2FsbGJhY2s+KFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VW5pcXVlSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNhdChibG9ja2VkLCByZXF1ZXN0ZWQpXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICkgYXMgSUJsb2NrZWRDYWxsYmFja1tdO1xuXG4gICAgICAgIGNvbnN0IGVEdXBsaWNhdGVzID0gZmxhdHRlbihcbiAgICAgICAgICAgIG1hcChcbiAgICAgICAgICAgICAgICBncm91cCA9PiBncm91cC5zbGljZSgwLCAtMSksXG4gICAgICAgICAgICAgICAgdmFsdWVzKFxuICAgICAgICAgICAgICAgICAgICBncm91cEJ5PElDYWxsYmFjaz4oXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRVbmlxdWVJZGVudGlmaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uY2F0KGV4ZWN1dGluZywgcmVxdWVzdGVkKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICApIGFzIElFeGVjdXRpbmdDYWxsYmFja1tdO1xuXG4gICAgICAgIGNvbnN0IHdEdXBsaWNhdGVzID0gZmxhdHRlbihcbiAgICAgICAgICAgIG1hcChcbiAgICAgICAgICAgICAgICBncm91cCA9PiBncm91cC5zbGljZSgwLCAtMSksXG4gICAgICAgICAgICAgICAgdmFsdWVzKFxuICAgICAgICAgICAgICAgICAgICBncm91cEJ5PElDYWxsYmFjaz4oXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRVbmlxdWVJZGVudGlmaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uY2F0KHdhdGNoZWQsIHJlcXVlc3RlZClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKSBhcyBJRXhlY3V0aW5nQ2FsbGJhY2tbXTtcblxuICAgICAgICAvKlxuICAgICAgICAgICAgMy4gTW9kaWZ5IG9yIHJlbW92ZSBjYWxsYmFja3MgdGhhdCBhcmUgb3V0cHV0dGluZyB0byBub24tZXhpc3RpbmcgbGF5b3V0IGBpZGAuXG4gICAgICAgICovXG5cbiAgICAgICAgY29uc3Qge2FkZGVkOiByQWRkZWQsIHJlbW92ZWQ6IHJSZW1vdmVkfSA9IHBydW5lQ2FsbGJhY2tzKFxuICAgICAgICAgICAgcmVxdWVzdGVkLFxuICAgICAgICAgICAgcGF0aHNcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qge2FkZGVkOiBwQWRkZWQsIHJlbW92ZWQ6IHBSZW1vdmVkfSA9IHBydW5lQ2FsbGJhY2tzKFxuICAgICAgICAgICAgcHJpb3JpdGl6ZWQsXG4gICAgICAgICAgICBwYXRoc1xuICAgICAgICApO1xuICAgICAgICBjb25zdCB7YWRkZWQ6IGJBZGRlZCwgcmVtb3ZlZDogYlJlbW92ZWR9ID0gcHJ1bmVDYWxsYmFja3MoXG4gICAgICAgICAgICBibG9ja2VkLFxuICAgICAgICAgICAgcGF0aHNcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qge2FkZGVkOiBlQWRkZWQsIHJlbW92ZWQ6IGVSZW1vdmVkfSA9IHBydW5lQ2FsbGJhY2tzKFxuICAgICAgICAgICAgZXhlY3V0aW5nLFxuICAgICAgICAgICAgcGF0aHNcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qge2FkZGVkOiB3QWRkZWQsIHJlbW92ZWQ6IHdSZW1vdmVkfSA9IHBydW5lQ2FsbGJhY2tzKFxuICAgICAgICAgICAgd2F0Y2hlZCxcbiAgICAgICAgICAgIHBhdGhzXG4gICAgICAgICk7XG5cbiAgICAgICAgLypcbiAgICAgICAgICAgIFRPRE8/XG4gICAgICAgICAgICBDbGVhbiB1cCB0aGUgYHJlcXVlc3RlZGAgbGlzdCAtIGR1cmluZyB0aGUgZGlzcGF0Y2ggcGhhc2UsXG4gICAgICAgICAgICBpdCB3aWxsIGJlIHVwZGF0ZWQgZm9yIHJlYWxcbiAgICAgICAgKi9cbiAgICAgICAgcmVxdWVzdGVkID0gY29uY2F0KGRpZmZlcmVuY2UocmVxdWVzdGVkLCByUmVtb3ZlZCksIHJBZGRlZCk7XG5cbiAgICAgICAgLypcbiAgICAgICAgICAgIDQuIEZpbmQgYHJlcXVlc3RlZGAgY2FsbGJhY2tzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBhIG91dHN0YW5kaW5nIG91dHB1dCAoYXMgZWl0aGVyIGlucHV0IG9yIHN0YXRlKVxuICAgICAgICAqL1xuICAgICAgICBsZXQgcmVhZHlDYWxsYmFja3MgPSBnZXRSZWFkeUNhbGxiYWNrcyhcbiAgICAgICAgICAgIHBhdGhzLFxuICAgICAgICAgICAgcmVxdWVzdGVkLFxuICAgICAgICAgICAgcGVuZGluZ0NhbGxiYWNrcyxcbiAgICAgICAgICAgIGdyYXBoc1xuICAgICAgICApO1xuXG4gICAgICAgIGxldCBvbGRCbG9ja2VkOiBJQ2FsbGJhY2tbXSA9IFtdO1xuICAgICAgICBsZXQgbmV3QmxvY2tlZDogSUNhbGxiYWNrW10gPSBbXTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgdGhlcmUgaXMgOlxuICAgICAgICAgKiAtIG5vIHJlYWR5IGNhbGxiYWNrc1xuICAgICAgICAgKiAtIGF0IGxlYXN0IG9uZSByZXF1ZXN0ZWQgY2FsbGJhY2tcbiAgICAgICAgICogLSBubyBhZGRpdGlvbmFsIHBlbmRpbmcgY2FsbGJhY2tzXG4gICAgICAgICAqXG4gICAgICAgICAqIGNhbiBhc3N1bWU6XG4gICAgICAgICAqIC0gdGhlIHJlcXVlc3RlZCBjYWxsYmFja3MgYXJlIHBhcnQgb2YgYSBjaXJjdWxhciBkZXBlbmRlbmN5IGxvb3BcbiAgICAgICAgICpcbiAgICAgICAgICogdGhlbiByZWN1cnNpdmVseTpcbiAgICAgICAgICogLSBhc3N1bWUgdGhlIGZpcnN0IGNhbGxiYWNrIGluIHRoZSBsaXN0IGlzIHJlYWR5ICh0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBsb29wKVxuICAgICAgICAgKiAtIGNoZWNrIHdoYXQgY2FsbGJhY2tzIGFyZSBibG9ja2VkIC8gcmVhZHkgd2l0aCB0aGUgYXNzdW1wdGlvblxuICAgICAgICAgKiAtIHVwZGF0ZSB0aGUgbWlzc2luZyBwcmVkZWNlc3NvcnMgYmFzZWQgb24gYXNzdW1wdGlvbnNcbiAgICAgICAgICogLSBjb250aW51ZSB1bnRpbCB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIGNhbmRpZGF0ZXNcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICFyZWFkeUNhbGxiYWNrcy5sZW5ndGggJiZcbiAgICAgICAgICAgIHJlcXVlc3RlZC5sZW5ndGggJiZcbiAgICAgICAgICAgIHJlcXVlc3RlZC5sZW5ndGggPT09IHBlbmRpbmdDYWxsYmFja3MubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgICAgbGV0IGNhbmRpZGF0ZXMgPSByZXF1ZXN0ZWQuc2xpY2UoMCk7XG5cbiAgICAgICAgICAgIHdoaWxlIChjYW5kaWRhdGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIEFzc3VtZSAxc3QgY2FsbGJhY2sgaXMgcmVhZHkgYW5kXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNhbmRpZGF0ZXMgLyByZWFkeUNhbGxiYWNrcyBhY2NvcmRpbmdseVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWR5Q2FsbGJhY2sgPSBjYW5kaWRhdGVzWzBdO1xuXG4gICAgICAgICAgICAgICAgcmVhZHlDYWxsYmFja3MucHVzaChyZWFkeUNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gY2FuZGlkYXRlcy5zbGljZSgxKTtcblxuICAgICAgICAgICAgICAgIC8vIFJlbWFpbmluZyBjYW5kaWRhdGVzIGFyZSBub3QgYmxvY2tlZCBieSBjdXJyZW50IGFzc3VtcHRpb25zXG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlcyA9IGdldFJlYWR5Q2FsbGJhY2tzKFxuICAgICAgICAgICAgICAgICAgICBwYXRocyxcbiAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlcyxcbiAgICAgICAgICAgICAgICAgICAgcmVhZHlDYWxsYmFja3NcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgLy8gQmxvY2tlZCByZXF1ZXN0cyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGV5IGhhdmUgdGhlIGNhbGxiYWNrIGFzIGEgcHJlZGVjZXNzb3JcbiAgICAgICAgICAgICAgICBjb25zdCBibG9ja2VkQnlBc3N1bXB0aW9ucyA9IGRpZmZlcmVuY2UoY2FuZGlkYXRlcywgY2FuZGlkYXRlcyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtb2RpZmllZCA9IGZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgY2IgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICFjYi5wcmVkZWNlc3NvcnMgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICFpbmNsdWRlcyhyZWFkeUNhbGxiYWNrLmNhbGxiYWNrLCBjYi5wcmVkZWNlc3NvcnMpLFxuICAgICAgICAgICAgICAgICAgICBibG9ja2VkQnlBc3N1bXB0aW9uc1xuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBvbGRCbG9ja2VkID0gY29uY2F0KG9sZEJsb2NrZWQsIG1vZGlmaWVkKTtcbiAgICAgICAgICAgICAgICBuZXdCbG9ja2VkID0gY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICBuZXdCbG9ja2VkLFxuICAgICAgICAgICAgICAgICAgICBtb2RpZmllZC5tYXAoY2IgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGVjZXNzb3JzOiBjb25jYXQoY2IucHJlZGVjZXNzb3JzID8/IFtdLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHlDYWxsYmFjay5jYWxsYmFja1xuICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAgICBUT0RPP1xuICAgICAgICAgICAgQ2xlYW4gdXAgdGhlIGByZXF1ZXN0ZWRgIGxpc3QgLSBkdXJpbmcgdGhlIGRpc3BhdGNoIHBoYXNlLFxuICAgICAgICAgICAgaXQgd2lsbCBiZSB1cGRhdGVkIGZvciByZWFsXG4gICAgICAgICovXG4gICAgICAgIHJlcXVlc3RlZCA9IGNvbmNhdChkaWZmZXJlbmNlKHJlcXVlc3RlZCwgb2xkQmxvY2tlZCksIG5ld0Jsb2NrZWQpO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAgICA1LiBQcnVuZSBjYWxsYmFja3MgdGhhdCBiZWNhbWUgaXJyZWxldmFudCBpbiB0aGVpciBgZXhlY3V0aW9uR3JvdXBgXG4gICAgICAgICovXG5cbiAgICAgICAgLy8gR3JvdXAgYnkgZXhlY3V0aW9uR3JvdXAsIGRyb3Agbm9uLWV4ZWN1dGlvbkdyb3VwIGNhbGxiYWNrc1xuICAgICAgICAvLyB0aG9zZSB3ZXJlIG5vdCB0cmlnZ2VyZWQgYnkgbGF5b3V0IGNoYW5nZXMgYW5kIGRvbid0IGhhdmUgXCJzdHJvbmdcIiBpbnRlcmRlcGVuZGVuY3kgZm9yXG4gICAgICAgIC8vIGNhbGxiYWNrIGNoYWluIGNvbXBsZXRpb25cbiAgICAgICAgY29uc3QgcGVuZGluZ0dyb3VwcyA9IGdyb3VwQnk8SVN0b3JlZENhbGxiYWNrPihcbiAgICAgICAgICAgIGNiID0+IGNiLmV4ZWN1dGlvbkdyb3VwIGFzIGFueSxcbiAgICAgICAgICAgIGZpbHRlcihjYiA9PiAhaXNOaWwoY2IuZXhlY3V0aW9uR3JvdXApLCBzdG9yZWQpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgZHJvcHBlZDogSUNhbGxiYWNrW10gPSBmaWx0ZXIoY2IgPT4ge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gYHN0b3JlZGAgY2FsbGJhY2sgZm9yIHRoZSBncm91cCwgbm8gb3V0cHV0cyB3ZXJlIGRyb3BwZWQgLT4gYGNiYCBpcyBrZXB0XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIWNiLmV4ZWN1dGlvbkdyb3VwIHx8XG4gICAgICAgICAgICAgICAgIXBlbmRpbmdHcm91cHNbY2IuZXhlY3V0aW9uR3JvdXBdIHx8XG4gICAgICAgICAgICAgICAgIXBlbmRpbmdHcm91cHNbY2IuZXhlY3V0aW9uR3JvdXBdLmxlbmd0aFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBHZXQgYWxsIGlucHV0cyBmb3IgYGNiYFxuICAgICAgICAgICAgY29uc3QgaW5wdXRzID0gbWFwKGNvbWJpbmVJZEFuZFByb3AsIGZsYXR0ZW4oY2IuZ2V0SW5wdXRzKHBhdGhzKSkpO1xuXG4gICAgICAgICAgICAvLyBHZXQgYWxsIHRoZSBwb3RlbnRpYWxseSB1cGRhdGVkIHByb3BzIGZvciB0aGUgZ3JvdXAgc28gZmFyXG4gICAgICAgICAgICBjb25zdCBhbGxQcm9wcyA9IGZsYXR0ZW4oXG4gICAgICAgICAgICAgICAgbWFwKFxuICAgICAgICAgICAgICAgICAgICBnY2IgPT4gZ2NiLmV4ZWN1dGlvbk1ldGEuYWxsUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmdHcm91cHNbY2IuZXhlY3V0aW9uR3JvdXBdXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgdXBkYXRlZCBwcm9wcyBmb3IgdGhlIGdyb3VwIHNvIGZhclxuICAgICAgICAgICAgY29uc3QgdXBkYXRlZCA9IGZsYXR0ZW4oXG4gICAgICAgICAgICAgICAgbWFwKFxuICAgICAgICAgICAgICAgICAgICBnY2IgPT4gZ2NiLmV4ZWN1dGlvbk1ldGEudXBkYXRlZFByb3BzLFxuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nR3JvdXBzW2NiLmV4ZWN1dGlvbkdyb3VwXVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gb3ZlcmxhcCBiZXR3ZWVuIHRoZSB1cGRhdGVkIHByb3BzIGFuZCB0aGUgaW5wdXRzLFxuICAgICAgICAgICAgLy8gKyB0aGVyZSdzIG5vIHByb3BzIHRoYXQgYXJlbid0IGNvdmVyZWQgYnkgdGhlIHBvdGVudGlhbGx5IHVwZGF0ZWQgcHJvcHMsXG4gICAgICAgICAgICAvLyBhbmQgbm90IGFsbCBpbnB1dHMgYXJlIG11bHRpIHZhbHVlZFxuICAgICAgICAgICAgLy8gLT4gZHJvcCBgY2JgXG4gICAgICAgICAgICBjb25zdCByZXMgPVxuICAgICAgICAgICAgICAgIGlzRW1wdHkoaW50ZXJzZWN0aW9uKGlucHV0cywgdXBkYXRlZCkpICYmXG4gICAgICAgICAgICAgICAgaXNFbXB0eShkaWZmZXJlbmNlKGlucHV0cywgYWxsUHJvcHMpKSAmJlxuICAgICAgICAgICAgICAgICFhbGwoaXNNdWx0aVZhbHVlZCwgY2IuY2FsbGJhY2suaW5wdXRzKTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSwgcmVhZHlDYWxsYmFja3MpO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAgICBUT0RPP1xuICAgICAgICAgICAgQ2xlYW4gdXAgdGhlIGByZXF1ZXN0ZWRgIGxpc3QgLSBkdXJpbmcgdGhlIGRpc3BhdGNoIHBoYXNlLFxuICAgICAgICAgICAgaXQgd2lsbCBiZSB1cGRhdGVkIGZvciByZWFsXG4gICAgICAgICovXG4gICAgICAgIHJlcXVlc3RlZCA9IGRpZmZlcmVuY2UocmVxdWVzdGVkLCBkcm9wcGVkKTtcblxuICAgICAgICByZWFkeUNhbGxiYWNrcyA9IGRpZmZlcmVuY2UocmVhZHlDYWxsYmFja3MsIGRyb3BwZWQpO1xuXG4gICAgICAgIHJlcXVlc3RlZCA9IGRpZmZlcmVuY2UocmVxdWVzdGVkLCByZWFkeUNhbGxiYWNrcyk7XG5cbiAgICAgICAgY29uc3QgYWRkZWQgPSBkaWZmZXJlbmNlKHJlcXVlc3RlZCwgaW5pdGlhbFJlcXVlc3RlZCk7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSBkaWZmZXJlbmNlKGluaXRpYWxSZXF1ZXN0ZWQsIHJlcXVlc3RlZCk7XG5cbiAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICBhZ2dyZWdhdGVDYWxsYmFja3MoW1xuICAgICAgICAgICAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RlZCBjYWxsYmFja3NcbiAgICAgICAgICAgICAgICBhZGRlZC5sZW5ndGggPyBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MoYWRkZWQpIDogbnVsbCxcbiAgICAgICAgICAgICAgICByZW1vdmVkLmxlbmd0aCA/IHJlbW92ZVJlcXVlc3RlZENhbGxiYWNrcyhyZW1vdmVkKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAgZHVwbGljYXRlZCBjYWxsYmFja3NcbiAgICAgICAgICAgICAgICBwRHVwbGljYXRlcy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgPyByZW1vdmVQcmlvcml0aXplZENhbGxiYWNrcyhwRHVwbGljYXRlcylcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgIGJEdXBsaWNhdGVzLmxlbmd0aCA/IHJlbW92ZUJsb2NrZWRDYWxsYmFja3MoYkR1cGxpY2F0ZXMpIDogbnVsbCxcbiAgICAgICAgICAgICAgICBlRHVwbGljYXRlcy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgPyByZW1vdmVFeGVjdXRpbmdDYWxsYmFja3MoZUR1cGxpY2F0ZXMpXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICB3RHVwbGljYXRlcy5sZW5ndGggPyByZW1vdmVXYXRjaGVkQ2FsbGJhY2tzKHdEdXBsaWNhdGVzKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgLy8gUHJ1bmUgY2FsbGJhY2tzXG4gICAgICAgICAgICAgICAgcFJlbW92ZWQubGVuZ3RoID8gcmVtb3ZlUHJpb3JpdGl6ZWRDYWxsYmFja3MocFJlbW92ZWQpIDogbnVsbCxcbiAgICAgICAgICAgICAgICBwQWRkZWQubGVuZ3RoID8gYWRkUHJpb3JpdGl6ZWRDYWxsYmFja3MocEFkZGVkKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgYlJlbW92ZWQubGVuZ3RoID8gcmVtb3ZlQmxvY2tlZENhbGxiYWNrcyhiUmVtb3ZlZCkgOiBudWxsLFxuICAgICAgICAgICAgICAgIGJBZGRlZC5sZW5ndGggPyBhZGRCbG9ja2VkQ2FsbGJhY2tzKGJBZGRlZCkgOiBudWxsLFxuICAgICAgICAgICAgICAgIGVSZW1vdmVkLmxlbmd0aCA/IHJlbW92ZUV4ZWN1dGluZ0NhbGxiYWNrcyhlUmVtb3ZlZCkgOiBudWxsLFxuICAgICAgICAgICAgICAgIGVBZGRlZC5sZW5ndGggPyBhZGRFeGVjdXRpbmdDYWxsYmFja3MoZUFkZGVkKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgd1JlbW92ZWQubGVuZ3RoID8gcmVtb3ZlV2F0Y2hlZENhbGxiYWNrcyh3UmVtb3ZlZCkgOiBudWxsLFxuICAgICAgICAgICAgICAgIHdBZGRlZC5sZW5ndGggPyBhZGRXYXRjaGVkQ2FsbGJhY2tzKHdBZGRlZCkgOiBudWxsLFxuICAgICAgICAgICAgICAgIC8vIFByb21vdGUgY2FsbGJhY2tzXG4gICAgICAgICAgICAgICAgcmVhZHlDYWxsYmFja3MubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgID8gYWRkUHJpb3JpdGl6ZWRDYWxsYmFja3MocmVhZHlDYWxsYmFja3MpXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgXSlcbiAgICAgICAgKTtcbiAgICB9LFxuICAgIGlucHV0czogWydjYWxsYmFja3MucmVxdWVzdGVkJywgJ2NhbGxiYWNrcy5jb21wbGV0ZWQnXVxufTtcblxuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQge1xuICAgIGNvbmNhdCxcbiAgICBmaWx0ZXIsXG4gICAgZ3JvdXBCeSxcbiAgICBpc05pbCxcbiAgICBwYXJ0aXRpb24sXG4gICAgcmVkdWNlLFxuICAgIHRvUGFpcnNcbn0gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQge0lTdG9yZVN0YXRlfSBmcm9tICcuLi9zdG9yZSc7XG5cbmltcG9ydCB7YWdncmVnYXRlQ2FsbGJhY2tzLCByZW1vdmVTdG9yZWRDYWxsYmFja3N9IGZyb20gJy4uL2FjdGlvbnMvY2FsbGJhY2tzJztcblxuaW1wb3J0IHtJQ2FsbGJhY2ssIElTdG9yZWRDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2tzJztcblxuaW1wb3J0IHtnZXRQZW5kaW5nQ2FsbGJhY2tzfSBmcm9tICcuLi91dGlscy9jYWxsYmFja3MnO1xuaW1wb3J0IHtJU3RvcmVPYnNlcnZlckRlZmluaXRpb259IGZyb20gJy4uL1N0b3JlT2JzZXJ2ZXInO1xuXG5jb25zdCBvYnNlcnZlcjogSVN0b3JlT2JzZXJ2ZXJEZWZpbml0aW9uPElTdG9yZVN0YXRlPiA9IHtcbiAgICBvYnNlcnZlcjogKHtkaXNwYXRjaCwgZ2V0U3RhdGV9KSA9PiB7XG4gICAgICAgIGNvbnN0IHtjYWxsYmFja3N9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgcGVuZGluZ0NhbGxiYWNrcyA9IGdldFBlbmRpbmdDYWxsYmFja3MoY2FsbGJhY2tzKTtcblxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjYWxsYmFja3M6IHtzdG9yZWR9XG4gICAgICAgIH0gPSBnZXRTdGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IFtudWxsR3JvdXBDYWxsYmFja3MsIGdyb3VwQ2FsbGJhY2tzXSA9IHBhcnRpdGlvbihcbiAgICAgICAgICAgIGNiID0+IGlzTmlsKGNiLmV4ZWN1dGlvbkdyb3VwKSxcbiAgICAgICAgICAgIHN0b3JlZFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGV4ZWN1dGlvbkdyb3VwcyA9IGdyb3VwQnk8SVN0b3JlZENhbGxiYWNrPihcbiAgICAgICAgICAgIGNiID0+IGNiLmV4ZWN1dGlvbkdyb3VwIGFzIGFueSxcbiAgICAgICAgICAgIGdyb3VwQ2FsbGJhY2tzXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcGVuZGluZ0dyb3VwcyA9IGdyb3VwQnk8SUNhbGxiYWNrPihcbiAgICAgICAgICAgIGNiID0+IGNiLmV4ZWN1dGlvbkdyb3VwIGFzIGFueSxcbiAgICAgICAgICAgIGZpbHRlcihjYiA9PiAhaXNOaWwoY2IuZXhlY3V0aW9uR3JvdXApLCBwZW5kaW5nQ2FsbGJhY2tzKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGRyb3BwZWQgPSByZWR1Y2UoXG4gICAgICAgICAgICAocmVzLCBbZXhlY3V0aW9uR3JvdXAsIGV4ZWN1dGlvbkdyb3VwQ2FsbGJhY2tzXSkgPT5cbiAgICAgICAgICAgICAgICAhcGVuZGluZ0dyb3Vwc1tleGVjdXRpb25Hcm91cF1cbiAgICAgICAgICAgICAgICAgICAgPyBjb25jYXQocmVzLCBleGVjdXRpb25Hcm91cENhbGxiYWNrcylcbiAgICAgICAgICAgICAgICAgICAgOiByZXMsXG4gICAgICAgICAgICBbXSBhcyBJU3RvcmVkQ2FsbGJhY2tbXSxcbiAgICAgICAgICAgIHRvUGFpcnMoZXhlY3V0aW9uR3JvdXBzKVxuICAgICAgICApO1xuXG4gICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgYWdncmVnYXRlQ2FsbGJhY2tzKFtcbiAgICAgICAgICAgICAgICBudWxsR3JvdXBDYWxsYmFja3MubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgID8gcmVtb3ZlU3RvcmVkQ2FsbGJhY2tzKG51bGxHcm91cENhbGxiYWNrcylcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgIGRyb3BwZWQubGVuZ3RoID8gcmVtb3ZlU3RvcmVkQ2FsbGJhY2tzKGRyb3BwZWQpIDogbnVsbFxuICAgICAgICAgICAgXSlcbiAgICAgICAgKTtcbiAgICB9LFxuICAgIGlucHV0czogWydjYWxsYmFja3Muc3RvcmVkJywgJ2NhbGxiYWNrcy5jb21wbGV0ZWQnXVxufTtcblxuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCIvKipcbiAqIEdlbmVyYWxpemVkIHBlcnNpc3RlbmNlIGZvciBjb21wb25lbnQgcHJvcHNcbiAqXG4gKiBXaGVuIHVzZXJzIGlucHV0IG5ldyBwcm9wIHZhbHVlcywgdGhleSBjYW4gYmUgc3RvcmVkIGFuZCByZWFwcGxpZWQgbGF0ZXIsXG4gKiB3aGVuIHRoZSBjb21wb25lbnQgaXMgcmVjcmVhdGVkIChjaGFuZ2luZyBgVGFiYCBmb3IgZXhhbXBsZSkgb3Igd2hlbiB0aGVcbiAqIHBhZ2UgaXMgcmVsb2FkZWQgKGRlcGVuZGluZyBvbiBgcGVyc2lzdGVuY2VfdHlwZWApLiBTdG9yYWdlIGlzIHRpZWQgdG9cbiAqIGNvbXBvbmVudCBJRCwgYW5kIHRoZSBwcm9wIHZhbHVlcyB3aWxsIG5vdCBiZSBzdG9yZWQgd2l0aCBjb21wb25lbnRzXG4gKiB3aXRob3V0IGFuIElELlxuICpcbiAqIFJlbmRlcmVyIGhhbmRsZXMgdGhlIG1lY2hhbmljcywgYnV0IGNvbXBvbmVudHMgbXVzdCBkZWZpbmUgYSBmZXcgcHJvcHM6XG4gKlxuICogLSBgcGVyc2lzdGVuY2VgOiBib29sZWFuLCBzdHJpbmcsIG9yIG51bWJlci4gRm9yIHNpbXBsZSB1c2FnZSwgc2V0IHRvIGB0cnVlYFxuICogICB0byBlbmFibGUgcGVyc2lzdGVuY2UsIG9taXQgb3Igc2V0IGBmYWxzZWAgdG8gZGlzYWJsZS4gRm9yIG1vcmUgY29tcGxleFxuICogICBzY2VuYXJpb3MsIHVzZSBhbnkgdHJ1dGh5IHZhbHVlLCBhbmQgY2hhbmdlIHRvIGEgKmRpZmZlcmVudCogdHJ1dGh5IHZhbHVlXG4gKiAgIHdoZW4geW91IHdhbnQgdGhlIHBlcnNpc3RlZCB2YWx1ZXMgY2xlYXJlZC4gKG1vZGVsZWQgb2ZmIGB1aXJldmlzaW9uYCBpbilcbiAqICAgcGxvdGx5LmpzXG4gKiAgIFR5cGljYWxseSBzaG91bGQgaGF2ZSBubyBkZWZhdWx0LCBidXQgdGhlIG90aGVyIHBlcnNpc3RlbmNlIHByb3BzIHNob3VsZFxuICogICBoYXZlIGRlZmF1bHRzLCBzbyBhbGwgYSB1c2VyIG5lZWRzIHRvIGRvIHRvIGVuYWJsZSBwZXJzaXN0ZW5jZSBpcyBzZXQgdGhpc1xuICogICBvbmUgcHJvcC5cbiAqXG4gKiAtIGBwZXJzaXN0ZWRfcHJvcHNgOiBhcnJheSBvZiBwcm9wIG5hbWVzIG9yIFwibmVzdGVkIHByb3AgSURzXCIgYWxsb3dlZCB0b1xuICogICBwZXJzaXN0LiBOb3JtYWxseSBzaG91bGQgZGVmYXVsdCB0byB0aGUgZnVsbCBsaXN0IG9mIHN1cHBvcnRlZCBwcm9wcyxcbiAqICAgc28gdGhleSBjYW4gYWxsIGJlIGVuYWJsZWQgYXQgb25jZS4gVGhlIG1haW4gZXhjZXB0aW9uIHRvIHRoaXMgaXMgaWZcbiAqICAgdGhlcmUncyBhIHByb3AgdGhhdCAqY2FuKiBiZSBwZXJzaXN0ZWQgYnV0IG1vc3QgdXNlcnMgd291bGRuJ3Qgd2FudCB0aGlzLlxuICogICBBIG5lc3RlZCBwcm9wIElEIGRlc2NyaWJlcyAqcGFydCogb2YgYSBwcm9wIHRvIHN0b3JlLiBJdCBtdXN0IGJlXG4gKiAgIFwiPHByb3BOYW1lPi48cGllY2U+XCIgd2hlcmUgcHJvcE5hbWUgaXMgdGhlIHByb3AgdGhhdCBoYXMgdGhpcyBpbmZvLCBhbmRcbiAqICAgcGllY2UgbWF5IG9yIG1heSBub3QgbWFwIHRvIHRoZSBleGFjdCBzdWJzdHJ1Y3R1cmUgYmVpbmcgc3RvcmVkIGJ1dCBpc1xuICogICBtZWFuaW5nZnVsIHRvIHRoZSB1c2VyLiBGb3IgZXhhbXBsZSwgaW4gYGRhc2hfdGFibGVgLCBgY29sdW1ucy5uYW1lYFxuICogICBzdG9yZXMgYGNvbHVtbnNbaV0ubmFtZWAgZm9yIGFsbCBjb2x1bW5zIGBpYC4gTmVzdGVkIHByb3BzIGFsc28gbmVlZFxuICogICBlbnRyaWVzIGluIGBwZXJzaXN0ZW5jZVRyYW5zZm9ybXNgIC0gc2VlIGJlbG93LlxuICpcbiAqIC0gYHBlcnNpc3RlbmNlX3R5cGVgOiBvbmUgb2YgXCJsb2NhbFwiLCBcInNlc3Npb25cIiwgb3IgXCJtZW1vcnlcIiwganVzdCBsaWtlXG4gKiAgIGBkY2MuU3RvcmVgLiBCdXQgdGhlIGRlZmF1bHQgaGVyZSBzaG91bGQgYmUgXCJsb2NhbFwiIGJlY2F1c2UgdGhlIG1haW4gdXNlXG4gKiAgIGNhc2UgaXMgdG8gbWFpbnRhaW4gc2V0dGluZ3MgYWNyb3NzIHJlbG9hZHMuXG4gKlxuICogSWYgYW55IGBwZXJzaXN0ZWRfcHJvcHNgIGFyZSBuZXN0ZWQgcHJvcCBJRHMsIHRoZSBjb21wb25lbnQgc2hvdWxkIGRlZmluZSBhXG4gKiBjbGFzcyBwcm9wZXJ0eSAobm90IGEgUmVhY3QgcHJvcCkgYHBlcnNpc3RlbmNlVHJhbnNmb3Jtc2AsIGFzIGFuIG9iamVjdDpcbiAqIHtcbiAqICAgW3Byb3BOYW1lXToge1xuICogICAgIFtwaWVjZV06IHtcbiAqICAgICAgIGV4dHJhY3Q6IHByb3BWYWx1ZSA9PiB2YWx1ZVRvU3RvcmUsXG4gKiAgICAgICBhcHBseTogKHN0b3JlZFZhbHVlLCBwcm9wVmFsdWUpID0+IG5ld1Byb3BWYWx1ZVxuICogICAgIH1cbiAqICAgfVxuICogfVxuICogLSBgZXh0cmFjdGAgdHVybnMgYSBwcm9wIHZhbHVlIGludG8gYSByZWR1Y2VkIHZhbHVlIHRvIHN0b3JlLlxuICogLSBgYXBwbHlgIHB1dHMgYW4gZXh0cmFjdGVkIHZhbHVlIGJhY2sgaW50byB0aGUgcHJvcC4gTWFrZSBzdXJlIHRoaXMgY3JlYXRlc1xuICogICBhIG5ldyBvYmplY3QgcmF0aGVyIHRoYW4gbXV0YXRpbmcgYHByb1ZhbHVlYCwgYW5kIHRoYXQgaWYgdGhlcmUgYXJlXG4gKiAgIG11bHRpcGxlIGBwaWVjZWAgZW50cmllcyBmb3Igb25lIGBwcm9wTmFtZWAsIHRoZWlyIGBhcHBseWAgZnVuY3Rpb25zXG4gKiAgIGNvbW11dGUgLSB3aGljaCBzaG91bGQgbm90IGJlIGFuIGlzc3VlIGlmIHRoZXkgZXh0cmFjdCBhbmQgYXBwbHlcbiAqICAgbm9uLWludGVyc2VjdGluZyBwYXJ0cyBvZiB0aGUgZnVsbCBwcm9wLlxuICogWW91IG9ubHkgbmVlZCB0byBkZWZpbmUgdGhlc2UgZm9yIHRoZSBwcm9wcyB0aGF0IG5lZWQgdGhlbS5cbiAqIEl0J3MgaW1wb3J0YW50IHRoYXQgYGV4dHJhY3RgIHB1bGxzIG91dCAqb25seSogdGhlIHJlbGV2YW50IHBpZWNlcyBvZiB0aGVcbiAqIHByb3AsIGJlY2F1c2UgcGVyc2lzdGVuY2UgaXMgb25seSBtYWludGFpbmVkIGlmIHRoZSBleHRyYWN0ZWQgdmFsdWUgb2YgdGhlXG4gKiBwcm9wIGJlZm9yZSBhcHBseWluZyBwZXJzaXN0ZW5jZSBpcyB0aGUgc2FtZSBhcyBpdCB3YXMgYmVmb3JlIHRoZSB1c2VyJ3NcbiAqIGNoYW5nZXMuXG4gKi9cblxuaW1wb3J0IHtcbiAgICBlcXVhbHMsXG4gICAgZmlsdGVyLFxuICAgIGZvckVhY2gsXG4gICAga2V5cyxcbiAgICBsZW5zUGF0aCxcbiAgICBtZXJnZVJpZ2h0LFxuICAgIHNldCxcbiAgICB0eXBlXG59IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7Y3JlYXRlQWN0aW9ufSBmcm9tICdyZWR1eC1hY3Rpb25zJztcblxuaW1wb3J0IFJlZ2lzdHJ5IGZyb20gJy4vcmVnaXN0cnknO1xuaW1wb3J0IHtzdHJpbmdpZnlJZH0gZnJvbSAnLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5cbmV4cG9ydCBjb25zdCBzdG9yZVByZWZpeCA9ICdfZGFzaF9wZXJzaXN0ZW5jZS4nO1xuXG5mdW5jdGlvbiBlcnIoZSkge1xuICAgIGNvbnN0IGVycm9yID0gdHlwZW9mIGUgPT09ICdzdHJpbmcnID8gbmV3IEVycm9yKGUpIDogZTtcblxuICAgIHJldHVybiBjcmVhdGVBY3Rpb24oJ09OX0VSUk9SJykoe1xuICAgICAgICB0eXBlOiAnZnJvbnRFbmQnLFxuICAgICAgICBlcnJvclxuICAgIH0pO1xufVxuXG4vKlxuICogRG9lcyBhIGtleSBmaXQgdGhpcyBwcmVmaXg/IE11c3QgZWl0aGVyIGJlIGFuIGV4YWN0IG1hdGNoXG4gKiBvciwgaWYgYSBzZXBhcmF0b3IgaXMgcHJvdmlkZWQsIGEgc2NvcGVkIG1hdGNoIC0gZXhhY3QgcHJlZml4XG4gKiBmb2xsb3dlZCBieSB0aGUgc2VwYXJhdG9yICh0aGVuIGFueXRoaW5nIGVsc2UpXG4gKi9cbmZ1bmN0aW9uIGtleVByZWZpeE1hdGNoKHByZWZpeCwgc2VwYXJhdG9yKSB7XG4gICAgY29uc3QgZnVsbFN0ciA9IHByZWZpeCArIHNlcGFyYXRvcjtcbiAgICBjb25zdCBmdWxsTGVuID0gZnVsbFN0ci5sZW5ndGg7XG4gICAgcmV0dXJuIGtleSA9PiBrZXkgPT09IHByZWZpeCB8fCBrZXkuc3Vic3RyKDAsIGZ1bGxMZW4pID09PSBmdWxsU3RyO1xufVxuXG5jb25zdCBVTkRFRklORUQgPSAnVSc7XG5jb25zdCBfcGFyc2UgPSB2YWwgPT4gKHZhbCA9PT0gVU5ERUZJTkVEID8gdW5kZWZpbmVkIDogSlNPTi5wYXJzZSh2YWwgfHwgbnVsbCkpO1xuY29uc3QgX3N0cmluZ2lmeSA9IHZhbCA9PiAodmFsID09PSB1bmRlZmluZWQgPyBVTkRFRklORUQgOiBKU09OLnN0cmluZ2lmeSh2YWwpKTtcblxuY2xhc3MgV2ViU3RvcmUge1xuICAgIGNvbnN0cnVjdG9yKGJhY2tFbmQpIHtcbiAgICAgICAgdGhpcy5fbmFtZSA9IGJhY2tFbmQ7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2UgPSB3aW5kb3dbYmFja0VuZF07XG4gICAgfVxuXG4gICAgaGFzSXRlbShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2UuZ2V0SXRlbShzdG9yZVByZWZpeCArIGtleSkgIT09IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0SXRlbShrZXkpIHtcbiAgICAgICAgLy8gbm90ZTogX3N0b3JhZ2UuZ2V0SXRlbSByZXR1cm5zIG51bGwgb24gbWlzc2luZyBrZXlzXG4gICAgICAgIC8vIGFuZCBKU09OLnBhcnNlKG51bGwpIHJldHVybnMgbnVsbCBhcyB3ZWxsXG4gICAgICAgIHJldHVybiBfcGFyc2UodGhpcy5fc3RvcmFnZS5nZXRJdGVtKHN0b3JlUHJlZml4ICsga2V5KSk7XG4gICAgfVxuXG4gICAgX3NldEl0ZW0oa2V5LCB2YWx1ZSkge1xuICAgICAgICAvLyB1bnByb3RlY3RlZCB2ZXJzaW9uIG9mIHNldEl0ZW0sIGZvciB1c2UgYnkgdHJ5R2V0V2ViU3RvcmVcbiAgICAgICAgdGhpcy5fc3RvcmFnZS5zZXRJdGVtKHN0b3JlUHJlZml4ICsga2V5LCBfc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuICAgIC8qXG4gICAgICogSW4gYWRkaXRpb24gdG8gdGhlIHJlZ3VsYXIga2V5LT52YWx1ZSB0byBzZXQsIHNldEl0ZW0gdGFrZXNcbiAgICAgKiBkaXNwYXRjaCBhcyBhIHBhcmFtZXRlciwgc28gaXQgY2FuIHJlcG9ydCBPT00gdG8gZGV2dG9vbHNcbiAgICAgKi9cbiAgICBzZXRJdGVtKGtleSwgdmFsdWUsIGRpc3BhdGNoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRJdGVtKGtleSwgdmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgICAgICBlcnIoXG4gICAgICAgICAgICAgICAgICAgIGAke2tleX0gZmFpbGVkIHRvIHNhdmUgaW4gJHt0aGlzLl9uYW1lfS4gUGVyc2lzdGVkIHByb3BzIG1heSBiZSBsb3N0LmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gVE9ETzogYXQgc29tZSBwb2ludCB3ZSBtYXkgd2FudCB0byBjb252ZXJ0IHRoaXMgdG8gZmFsbCBiYWNrXG4gICAgICAgICAgICAvLyBvbiBtZW1vcnksIHB1bGxpbmcgb3V0IGFsbCBwZXJzaXN0ZW5jZSBrZXlzIGFuZCBwdXR0aW5nIHRoZW1cbiAgICAgICAgICAgIC8vIGluIGEgTWVtU3RvcmUgdGhhdCBnZXRzIHVzZWQgZnJvbSB0aGVuIG9ud2FyZC5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZUl0ZW0oa2V5KSB7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2UucmVtb3ZlSXRlbShzdG9yZVByZWZpeCArIGtleSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBjbGVhciBtYXRjaGluZyBrZXlzIG1hdGNoaW5nIChvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgZG90IGFuZCBtb3JlXG4gICAgICogY2hhcmFjdGVycykgLSBvciBhbGwga2V5cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdG9yZSBpZiBubyBwcmVmaXguXG4gICAgICovXG4gICAgY2xlYXIoa2V5UHJlZml4KSB7XG4gICAgICAgIGNvbnN0IGZ1bGxQcmVmaXggPSBzdG9yZVByZWZpeCArIChrZXlQcmVmaXggfHwgJycpO1xuICAgICAgICBjb25zdCBrZXlNYXRjaCA9IGtleVByZWZpeE1hdGNoKGZ1bGxQcmVmaXgsIGtleVByZWZpeCA/ICcuJyA6ICcnKTtcbiAgICAgICAgY29uc3Qga2V5c1RvUmVtb3ZlID0gW107XG4gICAgICAgIC8vIDItc3RlcCBwcm9jZXNzLCBzbyB3ZSBkb24ndCBkZXBlbmQgb24gYW55IHBhcnRpY3VsYXIgYmVoYXZpb3Igb2ZcbiAgICAgICAgLy8ga2V5IG9yZGVyIHdoaWxlIHJlbW92aW5nIHNvbWVcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9zdG9yYWdlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBmdWxsS2V5ID0gdGhpcy5fc3RvcmFnZS5rZXkoaSk7XG4gICAgICAgICAgICBpZiAoa2V5TWF0Y2goZnVsbEtleSkpIHtcbiAgICAgICAgICAgICAgICBrZXlzVG9SZW1vdmUucHVzaChmdWxsS2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3JFYWNoKGsgPT4gdGhpcy5fc3RvcmFnZS5yZW1vdmVJdGVtKGspLCBrZXlzVG9SZW1vdmUpO1xuICAgIH1cbn1cblxuY2xhc3MgTWVtU3RvcmUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9kYXRhID0ge307XG4gICAgfVxuXG4gICAgaGFzSXRlbShrZXkpIHtcbiAgICAgICAgcmV0dXJuIGtleSBpbiB0aGlzLl9kYXRhO1xuICAgIH1cblxuICAgIGdldEl0ZW0oa2V5KSB7XG4gICAgICAgIC8vIHJ1biB0aGlzIHN0b3JhZ2UgdGhyb3VnaCBKU09OIHRvbyBzbyB3ZSBrbm93IHdlIGdldCBhIGZyZXNoIG9iamVjdFxuICAgICAgICAvLyBlYWNoIHJldHJpZXZhbFxuICAgICAgICByZXR1cm4gX3BhcnNlKHRoaXMuX2RhdGFba2V5XSk7XG4gICAgfVxuXG4gICAgc2V0SXRlbShrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2RhdGFba2V5XSA9IF9zdHJpbmdpZnkodmFsdWUpO1xuICAgIH1cblxuICAgIHJlbW92ZUl0ZW0oa2V5KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9kYXRhW2tleV07XG4gICAgfVxuXG4gICAgY2xlYXIoa2V5UHJlZml4KSB7XG4gICAgICAgIGlmIChrZXlQcmVmaXgpIHtcbiAgICAgICAgICAgIGZvckVhY2goXG4gICAgICAgICAgICAgICAga2V5ID0+IGRlbGV0ZSB0aGlzLl9kYXRhW2tleV0sXG4gICAgICAgICAgICAgICAgZmlsdGVyKGtleVByZWZpeE1hdGNoKGtleVByZWZpeCwgJy4nKSwga2V5cyh0aGlzLl9kYXRhKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9kYXRhID0ge307XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIE1ha2UgYSBzdHJpbmcgMl4xNiBjaGFyYWN0ZXJzIGxvbmcgKCoyIGJ5dGVzL2NoYXIgPSAxMzBrQiksIHRvIHRlc3Qgc3RvcmFnZS5cbi8vIFRoYXQgc2hvdWxkIGJlIHBsZW50eSBmb3IgY29tbW9uIHBlcnNpc3RlbmNlIHVzZSBjYXNlcyxcbi8vIHdpdGhvdXQgZ2V0dGluZyBhbnl3aGVyZSBuZWFyIHR5cGljYWwgYnJvd3NlciBsaW1pdHNcbmNvbnN0IHBvdyA9IDE2O1xuZnVuY3Rpb24gbG9uZ1N0cmluZygpIHtcbiAgICBsZXQgcyA9ICdTcGFtJztcbiAgICBmb3IgKGxldCBpID0gMjsgaSA8IHBvdzsgaSsrKSB7XG4gICAgICAgIHMgKz0gcztcbiAgICB9XG4gICAgcmV0dXJuIHM7XG59XG5cbmV4cG9ydCBjb25zdCBzdG9yZXMgPSB7XG4gICAgbWVtb3J5OiBuZXcgTWVtU3RvcmUoKVxuICAgIC8vIERlZmVyIHRlc3RpbmcgJiBtYWtpbmcgbG9jYWwvc2Vzc2lvbiBzdG9yZXMgdW50aWwgcmVxdWVzdGVkLlxuICAgIC8vIFRoYXQgd2F5IGlmIHdlIGhhdmUgZXJyb3JzIGhlcmUgdGhleSBjYW4gc2hvdyB1cCBpbiBkZXZ0b29scy5cbn07XG5cbmNvbnN0IGJhY2tFbmRzID0ge1xuICAgIGxvY2FsOiAnbG9jYWxTdG9yYWdlJyxcbiAgICBzZXNzaW9uOiAnc2Vzc2lvblN0b3JhZ2UnXG59O1xuXG5mdW5jdGlvbiB0cnlHZXRXZWJTdG9yZShiYWNrRW5kLCBkaXNwYXRjaCkge1xuICAgIGNvbnN0IHN0b3JlID0gbmV3IFdlYlN0b3JlKGJhY2tFbmQpO1xuICAgIGNvbnN0IGZhbGxiYWNrU3RvcmUgPSBzdG9yZXMubWVtb3J5O1xuICAgIGNvbnN0IHN0b3JlVGVzdCA9IGxvbmdTdHJpbmcoKTtcbiAgICBjb25zdCB0ZXN0S2V5ID0gc3RvcmVQcmVmaXggKyAneC54JztcbiAgICB0cnkge1xuICAgICAgICBzdG9yZS5fc2V0SXRlbSh0ZXN0S2V5LCBzdG9yZVRlc3QpO1xuICAgICAgICBpZiAoc3RvcmUuZ2V0SXRlbSh0ZXN0S2V5KSAhPT0gc3RvcmVUZXN0KSB7XG4gICAgICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgICAgICBlcnIoYCR7YmFja0VuZH0gaW5pdCBmYWlsZWQgc2V0L2dldCwgZmFsbGluZyBiYWNrIHRvIG1lbW9yeWApXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrU3RvcmU7XG4gICAgICAgIH1cbiAgICAgICAgc3RvcmUucmVtb3ZlSXRlbSh0ZXN0S2V5KTtcbiAgICAgICAgcmV0dXJuIHN0b3JlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICBlcnIoYCR7YmFja0VuZH0gaW5pdCBmaXJzdCB0cnkgZmFpbGVkOyBjbGVhcmluZyBhbmQgcmV0cnlpbmdgKVxuICAgICAgICApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBzdG9yZS5jbGVhcigpO1xuICAgICAgICBzdG9yZS5fc2V0SXRlbSh0ZXN0S2V5LCBzdG9yZVRlc3QpO1xuICAgICAgICBpZiAoc3RvcmUuZ2V0SXRlbSh0ZXN0S2V5KSAhPT0gc3RvcmVUZXN0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vcGUnKTtcbiAgICAgICAgfVxuICAgICAgICBzdG9yZS5yZW1vdmVJdGVtKHRlc3RLZXkpO1xuICAgICAgICBkaXNwYXRjaChlcnIoYCR7YmFja0VuZH0gaW5pdCBzZXQvZ2V0IHN1Y2NlZWRlZCBhZnRlciBjbGVhcmluZyFgKSk7XG4gICAgICAgIHJldHVybiBzdG9yZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGRpc3BhdGNoKGVycihgJHtiYWNrRW5kfSBpbml0IHN0aWxsIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIG1lbW9yeWApKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrU3RvcmU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRTdG9yZSh0eXBlLCBkaXNwYXRjaCkge1xuICAgIGlmICghc3RvcmVzW3R5cGVdKSB7XG4gICAgICAgIHN0b3Jlc1t0eXBlXSA9IHRyeUdldFdlYlN0b3JlKGJhY2tFbmRzW3R5cGVdLCBkaXNwYXRjaCk7XG4gICAgfVxuICAgIHJldHVybiBzdG9yZXNbdHlwZV07XG59XG5cbmNvbnN0IG5vb3BUcmFuc2Zvcm0gPSB7XG4gICAgZXh0cmFjdDogcHJvcFZhbHVlID0+IHByb3BWYWx1ZSxcbiAgICBhcHBseTogKHN0b3JlZFZhbHVlLCBfcHJvcFZhbHVlKSA9PiBzdG9yZWRWYWx1ZVxufTtcblxuY29uc3QgZ2V0VHJhbnNmb3JtID0gKGVsZW1lbnQsIHByb3BOYW1lLCBwcm9wUGFydCkgPT4ge1xuICAgIGlmIChcbiAgICAgICAgZWxlbWVudC5wZXJzaXN0ZW5jZVRyYW5zZm9ybXMgJiZcbiAgICAgICAgZWxlbWVudC5wZXJzaXN0ZW5jZVRyYW5zZm9ybXNbcHJvcE5hbWVdXG4gICAgKSB7XG4gICAgICAgIGlmIChwcm9wUGFydCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQucGVyc2lzdGVuY2VUcmFuc2Zvcm1zW3Byb3BOYW1lXVtwcm9wUGFydF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucGVyc2lzdGVuY2VUcmFuc2Zvcm1zW3Byb3BOYW1lXTtcbiAgICB9XG4gICAgcmV0dXJuIG5vb3BUcmFuc2Zvcm07XG59O1xuXG5jb25zdCBnZXRWYWxzS2V5ID0gKGlkLCBwZXJzaXN0ZWRQcm9wLCBwZXJzaXN0ZW5jZSkgPT5cbiAgICBgJHtzdHJpbmdpZnlJZChpZCl9LiR7cGVyc2lzdGVkUHJvcH0uJHtKU09OLnN0cmluZ2lmeShwZXJzaXN0ZW5jZSl9YDtcblxuY29uc3QgZ2V0UHJvcHMgPSBsYXlvdXQgPT4ge1xuICAgIGNvbnN0IHtwcm9wcywgdHlwZSwgbmFtZXNwYWNlfSA9IGxheW91dDtcbiAgICBpZiAoIXR5cGUgfHwgIW5hbWVzcGFjZSkge1xuICAgICAgICAvLyBub3QgYSByZWFsIGNvbXBvbmVudCAtIGp1c3QgbmVlZCB0aGUgcHJvcHMgZm9yIHJlY3Vyc2lvblxuICAgICAgICByZXR1cm4ge3Byb3BzfTtcbiAgICB9XG4gICAgY29uc3Qge2lkLCBwZXJzaXN0ZW5jZX0gPSBwcm9wcztcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBSZWdpc3RyeS5yZXNvbHZlKGxheW91dCk7XG4gICAgY29uc3QgZ2V0VmFsID0gcHJvcCA9PiBwcm9wc1twcm9wXSB8fCAoZWxlbWVudC5kZWZhdWx0UHJvcHMgfHwge30pW3Byb3BdO1xuICAgIGNvbnN0IHBlcnNpc3RlZF9wcm9wcyA9IGdldFZhbCgncGVyc2lzdGVkX3Byb3BzJyk7XG4gICAgY29uc3QgcGVyc2lzdGVuY2VfdHlwZSA9IGdldFZhbCgncGVyc2lzdGVuY2VfdHlwZScpO1xuICAgIGNvbnN0IGNhblBlcnNpc3QgPSBpZCAmJiBwZXJzaXN0ZWRfcHJvcHMgJiYgcGVyc2lzdGVuY2VfdHlwZTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGNhblBlcnNpc3QsXG4gICAgICAgIGlkLFxuICAgICAgICBwcm9wcyxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgcGVyc2lzdGVuY2UsXG4gICAgICAgIHBlcnNpc3RlZF9wcm9wcyxcbiAgICAgICAgcGVyc2lzdGVuY2VfdHlwZVxuICAgIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkVWlFZGl0KGxheW91dCwgbmV3UHJvcHMsIGRpc3BhdGNoKSB7XG4gICAgY29uc3Qge1xuICAgICAgICBjYW5QZXJzaXN0LFxuICAgICAgICBpZCxcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHBlcnNpc3RlbmNlLFxuICAgICAgICBwZXJzaXN0ZWRfcHJvcHMsXG4gICAgICAgIHBlcnNpc3RlbmNlX3R5cGVcbiAgICB9ID0gZ2V0UHJvcHMobGF5b3V0KTtcbiAgICBpZiAoIWNhblBlcnNpc3QgfHwgIXBlcnNpc3RlbmNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3JFYWNoKHBlcnNpc3RlZFByb3AgPT4ge1xuICAgICAgICBjb25zdCBbcHJvcE5hbWUsIHByb3BQYXJ0XSA9IHBlcnNpc3RlZFByb3Auc3BsaXQoJy4nKTtcbiAgICAgICAgaWYgKG5ld1Byb3BzW3Byb3BOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBzdG9yYWdlID0gZ2V0U3RvcmUocGVyc2lzdGVuY2VfdHlwZSwgZGlzcGF0Y2gpO1xuICAgICAgICAgICAgY29uc3Qge2V4dHJhY3R9ID0gZ2V0VHJhbnNmb3JtKGVsZW1lbnQsIHByb3BOYW1lLCBwcm9wUGFydCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHZhbHNLZXkgPSBnZXRWYWxzS2V5KGlkLCBwZXJzaXN0ZWRQcm9wLCBwZXJzaXN0ZW5jZSk7XG4gICAgICAgICAgICBsZXQgb3JpZ2luYWxWYWwgPSBleHRyYWN0KHByb3BzW3Byb3BOYW1lXSk7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWwgPSBleHRyYWN0KG5ld1Byb3BzW3Byb3BOYW1lXSk7XG5cbiAgICAgICAgICAgIC8vIG1haW5seSBmb3IgbmVzdGVkIHByb3BzIHdpdGggbXVsdGlwbGUgcGVyc2lzdGVkIHBhcnRzLCBpdCdzXG4gICAgICAgICAgICAvLyBwb3NzaWJsZSB0byBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGJlZm9yZSAtIHNob3VsZCBub3Qgc3RvcmVcbiAgICAgICAgICAgIC8vIGluIHRoaXMgY2FzZS5cbiAgICAgICAgICAgIGlmIChvcmlnaW5hbFZhbCAhPT0gbmV3VmFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0b3JhZ2UuaGFzSXRlbSh2YWxzS2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFZhbCA9IHN0b3JhZ2UuZ2V0SXRlbSh2YWxzS2V5KVsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdmFscyA9XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVmFsID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gW25ld1ZhbF1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogW25ld1ZhbCwgb3JpZ2luYWxWYWxdO1xuICAgICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0SXRlbSh2YWxzS2V5LCB2YWxzLCBkaXNwYXRjaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCBwZXJzaXN0ZWRfcHJvcHMpO1xufVxuXG4vKlxuICogVXNlZCBmb3IgZW50aXJlIGxheW91dHMgKG9uIGxvYWQpIG9yIHBhcnRpYWwgbGF5b3V0cyAoZnJvbSBjaGlsZHJlblxuICogY2FsbGJhY2tzKSB0byBhcHBseSBwcmV2aW91c2x5LXN0b3JlZCBVSSBlZGl0cyB0byBjb21wb25lbnRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVBlcnNpc3RlbmNlKGxheW91dCwgZGlzcGF0Y2gpIHtcbiAgICBpZiAodHlwZShsYXlvdXQpICE9PSAnT2JqZWN0JyB8fCAhbGF5b3V0LnByb3BzKSB7XG4gICAgICAgIHJldHVybiBsYXlvdXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBlcnNpc3RlbmNlTW9kcyhsYXlvdXQsIGxheW91dCwgW10sIGRpc3BhdGNoKTtcbn1cblxuY29uc3QgVU5ETyA9IHRydWU7XG5mdW5jdGlvbiBtb2RQcm9wKGtleSwgc3RvcmFnZSwgZWxlbWVudCwgcHJvcHMsIHBlcnNpc3RlZFByb3AsIHVwZGF0ZSwgdW5kbykge1xuICAgIGlmIChzdG9yYWdlLmhhc0l0ZW0oa2V5KSkge1xuICAgICAgICBjb25zdCBbbmV3VmFsLCBvcmlnaW5hbFZhbF0gPSBzdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICAgICAgY29uc3QgZnJvbVZhbCA9IHVuZG8gPyBuZXdWYWwgOiBvcmlnaW5hbFZhbDtcbiAgICAgICAgY29uc3QgdG9WYWwgPSB1bmRvID8gb3JpZ2luYWxWYWwgOiBuZXdWYWw7XG4gICAgICAgIGNvbnN0IFtwcm9wTmFtZSwgcHJvcFBhcnRdID0gcGVyc2lzdGVkUHJvcC5zcGxpdCgnLicpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBnZXRUcmFuc2Zvcm0oZWxlbWVudCwgcHJvcE5hbWUsIHByb3BQYXJ0KTtcblxuICAgICAgICBpZiAoZXF1YWxzKGZyb21WYWwsIHRyYW5zZm9ybS5leHRyYWN0KHByb3BzW3Byb3BOYW1lXSkpKSB7XG4gICAgICAgICAgICB1cGRhdGVbcHJvcE5hbWVdID0gdHJhbnNmb3JtLmFwcGx5KFxuICAgICAgICAgICAgICAgIHRvVmFsLFxuICAgICAgICAgICAgICAgIHByb3BOYW1lIGluIHVwZGF0ZSA/IHVwZGF0ZVtwcm9wTmFtZV0gOiBwcm9wc1twcm9wTmFtZV1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBjbGVhciB0aGlzIHNhdmVkIGVkaXQgLSB3ZSd2ZSBzdGFydGVkIHdpdGggdGhlIHdyb25nXG4gICAgICAgICAgICAvLyB2YWx1ZSBmb3IgdGhpcyBwZXJzaXN0ZW5jZSBJRFxuICAgICAgICAgICAgc3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHBlcnNpc3RlbmNlTW9kcyhsYXlvdXQsIGNvbXBvbmVudCwgcGF0aCwgZGlzcGF0Y2gpIHtcbiAgICBjb25zdCB7XG4gICAgICAgIGNhblBlcnNpc3QsXG4gICAgICAgIGlkLFxuICAgICAgICBwcm9wcyxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgcGVyc2lzdGVuY2UsXG4gICAgICAgIHBlcnNpc3RlZF9wcm9wcyxcbiAgICAgICAgcGVyc2lzdGVuY2VfdHlwZVxuICAgIH0gPSBnZXRQcm9wcyhjb21wb25lbnQpO1xuXG4gICAgbGV0IGxheW91dE91dCA9IGxheW91dDtcbiAgICBpZiAoY2FuUGVyc2lzdCAmJiBwZXJzaXN0ZW5jZSkge1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gZ2V0U3RvcmUocGVyc2lzdGVuY2VfdHlwZSwgZGlzcGF0Y2gpO1xuICAgICAgICBjb25zdCB1cGRhdGUgPSB7fTtcbiAgICAgICAgZm9yRWFjaChcbiAgICAgICAgICAgIHBlcnNpc3RlZFByb3AgPT5cbiAgICAgICAgICAgICAgICBtb2RQcm9wKFxuICAgICAgICAgICAgICAgICAgICBnZXRWYWxzS2V5KGlkLCBwZXJzaXN0ZWRQcm9wLCBwZXJzaXN0ZW5jZSksXG4gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZWRQcm9wLFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgcGVyc2lzdGVkX3Byb3BzXG4gICAgICAgICk7XG5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wTmFtZSBpbiB1cGRhdGUpIHtcbiAgICAgICAgICAgIGxheW91dE91dCA9IHNldChcbiAgICAgICAgICAgICAgICBsZW5zUGF0aChwYXRoLmNvbmNhdCgncHJvcHMnLCBwcm9wTmFtZSkpLFxuICAgICAgICAgICAgICAgIHVwZGF0ZVtwcm9wTmFtZV0sXG4gICAgICAgICAgICAgICAgbGF5b3V0T3V0XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmVjdXJzZSBpbndhcmRcbiAgICBjb25zdCB7Y2hpbGRyZW59ID0gcHJvcHM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgIGNoaWxkcmVuLmZvckVhY2goKGNoaWxkLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZShjaGlsZCkgPT09ICdPYmplY3QnICYmIGNoaWxkLnByb3BzKSB7XG4gICAgICAgICAgICAgICAgbGF5b3V0T3V0ID0gcGVyc2lzdGVuY2VNb2RzKFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXRPdXQsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLFxuICAgICAgICAgICAgICAgICAgICBwYXRoLmNvbmNhdCgncHJvcHMnLCAnY2hpbGRyZW4nLCBpKSxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUoY2hpbGRyZW4pID09PSAnT2JqZWN0JyAmJiBjaGlsZHJlbi5wcm9wcykge1xuICAgICAgICBsYXlvdXRPdXQgPSBwZXJzaXN0ZW5jZU1vZHMoXG4gICAgICAgICAgICBsYXlvdXRPdXQsXG4gICAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICAgIHBhdGguY29uY2F0KCdwcm9wcycsICdjaGlsZHJlbicpLFxuICAgICAgICAgICAgZGlzcGF0Y2hcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGxheW91dE91dDtcbn1cblxuLypcbiAqIFdoZW4gd2UgcmVjZWl2ZSBuZXcgZXhwbGljaXQgcHJvcHMgZnJvbSBhIGNhbGxiYWNrLFxuICogdGhlc2Ugb3ZlcnJpZGUgVUktZHJpdmVuIGVkaXRzIG9mIHRob3NlIGV4YWN0IHByb3BzXG4gKiBidXQgbm90IGZvciBwcm9wcyBuZXN0ZWQgaW5zaWRlIGNoaWxkcmVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcnVuZVBlcnNpc3RlbmNlKGxheW91dCwgbmV3UHJvcHMsIGRpc3BhdGNoKSB7XG4gICAgY29uc3Qge1xuICAgICAgICBjYW5QZXJzaXN0LFxuICAgICAgICBpZCxcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIHBlcnNpc3RlbmNlLFxuICAgICAgICBwZXJzaXN0ZWRfcHJvcHMsXG4gICAgICAgIHBlcnNpc3RlbmNlX3R5cGUsXG4gICAgICAgIGVsZW1lbnRcbiAgICB9ID0gZ2V0UHJvcHMobGF5b3V0KTtcblxuICAgIGNvbnN0IGdldEZpbmFsID0gKHByb3BOYW1lLCBwcmV2VmFsKSA9PlxuICAgICAgICBwcm9wTmFtZSBpbiBuZXdQcm9wcyA/IG5ld1Byb3BzW3Byb3BOYW1lXSA6IHByZXZWYWw7XG4gICAgY29uc3QgZmluYWxQZXJzaXN0ZW5jZSA9IGdldEZpbmFsKCdwZXJzaXN0ZW5jZScsIHBlcnNpc3RlbmNlKTtcblxuICAgIGlmICghY2FuUGVyc2lzdCB8fCAhKHBlcnNpc3RlbmNlIHx8IGZpbmFsUGVyc2lzdGVuY2UpKSB7XG4gICAgICAgIHJldHVybiBuZXdQcm9wcztcbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbFBlcnNpc3RlbmNlVHlwZSA9IGdldEZpbmFsKCdwZXJzaXN0ZW5jZV90eXBlJywgcGVyc2lzdGVuY2VfdHlwZSk7XG4gICAgY29uc3QgZmluYWxQZXJzaXN0ZWRQcm9wcyA9IGdldEZpbmFsKCdwZXJzaXN0ZWRfcHJvcHMnLCBwZXJzaXN0ZWRfcHJvcHMpO1xuICAgIGNvbnN0IHBlcnNpc3RlbmNlQ2hhbmdlZCA9XG4gICAgICAgIGZpbmFsUGVyc2lzdGVuY2UgIT09IHBlcnNpc3RlbmNlIHx8XG4gICAgICAgIGZpbmFsUGVyc2lzdGVuY2VUeXBlICE9PSBwZXJzaXN0ZW5jZV90eXBlIHx8XG4gICAgICAgIGZpbmFsUGVyc2lzdGVkUHJvcHMgIT09IHBlcnNpc3RlZF9wcm9wcztcblxuICAgIGNvbnN0IG5vdEluTmV3UHJvcHMgPSBwZXJzaXN0ZWRQcm9wID0+XG4gICAgICAgICEocGVyc2lzdGVkUHJvcC5zcGxpdCgnLicpWzBdIGluIG5ld1Byb3BzKTtcblxuICAgIGNvbnN0IHVwZGF0ZSA9IHt9O1xuXG4gICAgbGV0IGRlcGVyc2lzdGVkUHJvcHMgPSBwcm9wcztcblxuICAgIGlmIChwZXJzaXN0ZW5jZUNoYW5nZWQgJiYgcGVyc2lzdGVuY2UpIHtcbiAgICAgICAgLy8gY2xlYXIgcHJldmlvdXNseS1hcHBsaWVkIHBlcnNpc3RlbmNlXG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBnZXRTdG9yZShwZXJzaXN0ZW5jZV90eXBlLCBkaXNwYXRjaCk7XG4gICAgICAgIGZvckVhY2goXG4gICAgICAgICAgICBwZXJzaXN0ZWRQcm9wID0+XG4gICAgICAgICAgICAgICAgbW9kUHJvcChcbiAgICAgICAgICAgICAgICAgICAgZ2V0VmFsc0tleShpZCwgcGVyc2lzdGVkUHJvcCwgcGVyc2lzdGVuY2UpLFxuICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVkUHJvcCxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlLFxuICAgICAgICAgICAgICAgICAgICBVTkRPXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGZpbHRlcihub3RJbk5ld1Byb3BzLCBwZXJzaXN0ZWRfcHJvcHMpXG4gICAgICAgICk7XG4gICAgICAgIGRlcGVyc2lzdGVkUHJvcHMgPSBtZXJnZVJpZ2h0KHByb3BzLCB1cGRhdGUpO1xuICAgIH1cblxuICAgIGlmIChmaW5hbFBlcnNpc3RlbmNlKSB7XG4gICAgICAgIGNvbnN0IGZpbmFsU3RvcmFnZSA9IGdldFN0b3JlKGZpbmFsUGVyc2lzdGVuY2VUeXBlLCBkaXNwYXRjaCk7XG5cbiAgICAgICAgaWYgKHBlcnNpc3RlbmNlQ2hhbmdlZCkge1xuICAgICAgICAgICAgLy8gYXBwbHkgbmV3IHBlcnNpc3RlbmNlXG4gICAgICAgICAgICBmb3JFYWNoKFxuICAgICAgICAgICAgICAgIHBlcnNpc3RlZFByb3AgPT5cbiAgICAgICAgICAgICAgICAgICAgbW9kUHJvcChcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHNLZXkoaWQsIHBlcnNpc3RlZFByb3AsIGZpbmFsUGVyc2lzdGVuY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxTdG9yYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVyc2lzdGVkUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZWRQcm9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgZmlsdGVyKG5vdEluTmV3UHJvcHMsIGZpbmFsUGVyc2lzdGVkUHJvcHMpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm93IHRoZSBtYWluIHBvaW50IC0gY2xlYXIgYW55IGVkaXQgb2YgYSBwcm9wIHRoYXQgY2hhbmdlZFxuICAgICAgICAvLyBub3RlIHRoYXQgdGhpcyBpcyBpbmRlcGVuZGVudCBvZiB0aGUgbmV3IHByb3AgdmFsdWUuXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybXMgPSBlbGVtZW50LnBlcnNpc3RlbmNlVHJhbnNmb3JtcyB8fCB7fTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wTmFtZSBpbiBuZXdQcm9wcykge1xuICAgICAgICAgICAgY29uc3QgcHJvcFRyYW5zZm9ybXMgPSB0cmFuc2Zvcm1zW3Byb3BOYW1lXTtcbiAgICAgICAgICAgIGlmIChwcm9wVHJhbnNmb3Jtcykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcFBhcnQgaW4gcHJvcFRyYW5zZm9ybXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZmluYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWxzS2V5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3Byb3BOYW1lfS4ke3Byb3BQYXJ0fWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxQZXJzaXN0ZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmluYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXG4gICAgICAgICAgICAgICAgICAgIGdldFZhbHNLZXkoaWQsIHByb3BOYW1lLCBmaW5hbFBlcnNpc3RlbmNlKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBlcnNpc3RlbmNlQ2hhbmdlZCA/IG1lcmdlUmlnaHQobmV3UHJvcHMsIHVwZGF0ZSkgOiBuZXdQcm9wcztcbn1cbiIsImltcG9ydCB7YXNzb2MsIGFzc29jUGF0aCwgbWVyZ2VSaWdodH0gZnJvbSAncmFtZGEnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVBcGlSZWR1Y2VyKHN0b3JlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIEFwaVJlZHVjZXIoc3RhdGUgPSB7fSwgYWN0aW9uKSB7XG4gICAgICAgIGxldCBuZXdTdGF0ZSA9IHN0YXRlO1xuICAgICAgICBpZiAoYWN0aW9uLnR5cGUgPT09IHN0b3JlKSB7XG4gICAgICAgICAgICBjb25zdCB7aWQsIHN0YXR1cywgY29udGVudH0gPSBhY3Rpb24ucGF5bG9hZDtcbiAgICAgICAgICAgIGNvbnN0IG5ld1JlcXVlc3QgPSB7c3RhdHVzLCBjb250ZW50fTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGlkKSkge1xuICAgICAgICAgICAgICAgIG5ld1N0YXRlID0gYXNzb2NQYXRoKGlkLCBuZXdSZXF1ZXN0LCBzdGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlkKSB7XG4gICAgICAgICAgICAgICAgbmV3U3RhdGUgPSBhc3NvYyhpZCwgbmV3UmVxdWVzdCwgc3RhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IG1lcmdlUmlnaHQoc3RhdGUsIG5ld1JlcXVlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICB9O1xufVxuIiwiaW1wb3J0IHtnZXRBY3Rpb259IGZyb20gJy4uL2FjdGlvbnMvY29uc3RhbnRzJztcbmltcG9ydCB7Z2V0QXBwU3RhdGV9IGZyb20gJy4vY29uc3RhbnRzJztcblxuZnVuY3Rpb24gYXBwTGlmZWN5Y2xlKHN0YXRlID0gZ2V0QXBwU3RhdGUoJ1NUQVJURUQnKSwgYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlIGdldEFjdGlvbignU0VUX0FQUF9MSUZFQ1lDTEUnKTpcbiAgICAgICAgICAgIHJldHVybiBnZXRBcHBTdGF0ZShhY3Rpb24ucGF5bG9hZCk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBhcHBMaWZlY3ljbGU7XG4iLCJpbXBvcnQge2Fzc29jLCBhc3NvY1BhdGgsIGRpc3NvY30gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHtJQ2FsbGJhY2tQcm9wZXJ0eX0gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2tzJztcblxudHlwZSBDYWxsYmFja0pvYlN0YXRlID0ge1trOiBzdHJpbmddOiBDYWxsYmFja0pvYlBheWxvYWR9O1xuXG5leHBvcnQgdHlwZSBDYWxsYmFja0pvYlBheWxvYWQgPSB7XG4gICAgY2FuY2VsSW5wdXRzPzogSUNhbGxiYWNrUHJvcGVydHlbXTtcbiAgICBjYWNoZUtleTogc3RyaW5nO1xuICAgIGpvYklkOiBzdHJpbmc7XG4gICAgcHJvZ3Jlc3NEZWZhdWx0PzogYW55O1xuICAgIG91dHB1dD86IHN0cmluZztcbiAgICBvdXRkYXRlZD86IGJvb2xlYW47XG59O1xuXG50eXBlIENhbGxiYWNrSm9iQWN0aW9uID0ge1xuICAgIHR5cGU6ICdBRERfQ0FMTEJBQ0tfSk9CJyB8ICdSRU1PVkVfQ0FMTEJBQ0tfSk9CJyB8ICdDQUxMQkFDS19KT0JfT1VUREFURUQnO1xuICAgIHBheWxvYWQ6IENhbGxiYWNrSm9iUGF5bG9hZDtcbn07XG5cbmNvbnN0IHNldEpvYiA9IChqb2I6IENhbGxiYWNrSm9iUGF5bG9hZCwgc3RhdGU6IENhbGxiYWNrSm9iU3RhdGUpID0+XG4gICAgYXNzb2Moam9iLmpvYklkLCBqb2IsIHN0YXRlKTtcbmNvbnN0IHJlbW92ZUpvYiA9IChqb2JJZDogc3RyaW5nLCBzdGF0ZTogQ2FsbGJhY2tKb2JTdGF0ZSkgPT5cbiAgICBkaXNzb2Moam9iSWQsIHN0YXRlKTtcbmNvbnN0IHNldE91dGRhdGVkID0gKGpvYklkOiBzdHJpbmcsIHN0YXRlOiBDYWxsYmFja0pvYlN0YXRlKSA9PlxuICAgIGFzc29jUGF0aChbam9iSWQsICdvdXRkYXRlZCddLCB0cnVlLCBzdGF0ZSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChcbiAgICBzdGF0ZTogQ2FsbGJhY2tKb2JTdGF0ZSA9IHt9LFxuICAgIGFjdGlvbjogQ2FsbGJhY2tKb2JBY3Rpb25cbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnQUREX0NBTExCQUNLX0pPQic6XG4gICAgICAgICAgICByZXR1cm4gc2V0Sm9iKGFjdGlvbi5wYXlsb2FkLCBzdGF0ZSk7XG4gICAgICAgIGNhc2UgJ1JFTU9WRV9DQUxMQkFDS19KT0InOlxuICAgICAgICAgICAgcmV0dXJuIHJlbW92ZUpvYihhY3Rpb24ucGF5bG9hZC5qb2JJZCwgc3RhdGUpO1xuICAgICAgICBjYXNlICdDQUxMQkFDS19KT0JfT1VUREFURUQnOlxuICAgICAgICAgICAgcmV0dXJuIHNldE91dGRhdGVkKGFjdGlvbi5wYXlsb2FkLmpvYklkLCBzdGF0ZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxufVxuIiwiaW1wb3J0IHtjb25jYXQsIGRpZmZlcmVuY2UsIHJlZHVjZX0gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQge1xuICAgIElDYWxsYmFjayxcbiAgICBJRXhlY3V0ZWRDYWxsYmFjayxcbiAgICBJRXhlY3V0aW5nQ2FsbGJhY2ssXG4gICAgSVN0b3JlZENhbGxiYWNrLFxuICAgIElQcmlvcml0aXplZENhbGxiYWNrLFxuICAgIElCbG9ja2VkQ2FsbGJhY2ssXG4gICAgSVdhdGNoZWRDYWxsYmFja1xufSBmcm9tICcuLi90eXBlcy9jYWxsYmFja3MnO1xuXG5leHBvcnQgZW51bSBDYWxsYmFja0FjdGlvblR5cGUge1xuICAgIEFkZEJsb2NrZWQgPSAnQ2FsbGJhY2tzLkFkZEJsb2NrZWQnLFxuICAgIEFkZEV4ZWN1dGVkID0gJ0NhbGxiYWNrcy5BZGRFeGVjdXRlZCcsXG4gICAgQWRkRXhlY3V0aW5nID0gJ0NhbGxiYWNrcy5BZGRFeGVjdXRpbmcnLFxuICAgIEFkZFByaW9yaXRpemVkID0gJ0NhbGxiYWNrcy5BZGRQcmlvcml0aXplZCcsXG4gICAgQWRkUmVxdWVzdGVkID0gJ0NhbGxiYWNrcy5BZGRSZXF1ZXN0ZWQnLFxuICAgIEFkZFN0b3JlZCA9ICdDYWxsYmFja3MuQWRkU3RvcmVkJyxcbiAgICBBZGRXYXRjaGVkID0gJ0NhbGxiYWNrcy5BZGRXYXRjaGVkJyxcbiAgICBSZW1vdmVCbG9ja2VkID0gJ0NhbGxiYWNrcy5SZW1vdmVCbG9ja2VkJyxcbiAgICBSZW1vdmVFeGVjdXRlZCA9ICdDYWxsYmFja3MuUmVtb3ZlRXhlY3V0ZWQnLFxuICAgIFJlbW92ZUV4ZWN1dGluZyA9ICdDYWxsYmFja3MuUmVtb3ZlRXhlY3V0aW5nJyxcbiAgICBSZW1vdmVQcmlvcml0aXplZCA9ICdDYWxsYmFja3MuUmVtb3ZlUHJpb3JpdGl6ZWQnLFxuICAgIFJlbW92ZVJlcXVlc3RlZCA9ICdDYWxsYmFja3MuUmVtb3ZlUmVxdWVzdGVkJyxcbiAgICBSZW1vdmVTdG9yZWQgPSAnQ2FsbGJhY2tzLlJlbW92ZVN0b3JlZCcsXG4gICAgUmVtb3ZlV2F0Y2hlZCA9ICdDYWxsYmFja3MuUmVtb3ZlV2F0Y2hlZCdcbn1cblxuZXhwb3J0IGVudW0gQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlIHtcbiAgICBBZGRDb21wbGV0ZWQgPSAnQ2FsbGJhY2tzLkNvbXBsZXRlZCcsXG4gICAgQWdncmVnYXRlID0gJ0NhbGxiYWNrcy5BZ2dyZWdhdGUnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFnZ3JlZ2F0ZUFjdGlvbiB7XG4gICAgdHlwZTogQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlLkFnZ3JlZ2F0ZTtcbiAgICBwYXlsb2FkOiAoSUNhbGxiYWNrQWN0aW9uIHwgSUNvbXBsZXRlZEFjdGlvbiB8IG51bGwpW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNhbGxiYWNrQWN0aW9uIHtcbiAgICB0eXBlOiBDYWxsYmFja0FjdGlvblR5cGU7XG4gICAgcGF5bG9hZDogSUNhbGxiYWNrW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBsZXRlZEFjdGlvbiB7XG4gICAgdHlwZTogQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlLkFkZENvbXBsZXRlZDtcbiAgICBwYXlsb2FkOiBudW1iZXI7XG59XG5cbnR5cGUgQ2FsbGJhY2tBY3Rpb24gPSBJQWdncmVnYXRlQWN0aW9uIHwgSUNhbGxiYWNrQWN0aW9uIHwgSUNvbXBsZXRlZEFjdGlvbjtcblxuZXhwb3J0IGludGVyZmFjZSBJQ2FsbGJhY2tzU3RhdGUge1xuICAgIHJlcXVlc3RlZDogSUNhbGxiYWNrW107XG4gICAgcHJpb3JpdGl6ZWQ6IElQcmlvcml0aXplZENhbGxiYWNrW107XG4gICAgYmxvY2tlZDogSUJsb2NrZWRDYWxsYmFja1tdO1xuICAgIGV4ZWN1dGluZzogSUV4ZWN1dGluZ0NhbGxiYWNrW107XG4gICAgd2F0Y2hlZDogSVdhdGNoZWRDYWxsYmFja1tdO1xuICAgIGV4ZWN1dGVkOiBJRXhlY3V0ZWRDYWxsYmFja1tdO1xuICAgIHN0b3JlZDogSVN0b3JlZENhbGxiYWNrW107XG4gICAgY29tcGxldGVkOiBudW1iZXI7XG59XG5cbmNvbnN0IERFRkFVTFRfU1RBVEU6IElDYWxsYmFja3NTdGF0ZSA9IHtcbiAgICBibG9ja2VkOiBbXSxcbiAgICBleGVjdXRlZDogW10sXG4gICAgZXhlY3V0aW5nOiBbXSxcbiAgICBwcmlvcml0aXplZDogW10sXG4gICAgcmVxdWVzdGVkOiBbXSxcbiAgICBzdG9yZWQ6IFtdLFxuICAgIHdhdGNoZWQ6IFtdLFxuICAgIGNvbXBsZXRlZDogMFxufTtcblxuY29uc3QgdHJhbnNmb3Jtczoge1xuICAgIFtrZXk6IHN0cmluZ106IChhMTogSUNhbGxiYWNrW10sIGEyOiBJQ2FsbGJhY2tbXSkgPT4gSUNhbGxiYWNrW107XG59ID0ge1xuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkQmxvY2tlZF06IGNvbmNhdCxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZEV4ZWN1dGVkXTogY29uY2F0LFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkRXhlY3V0aW5nXTogY29uY2F0LFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkUHJpb3JpdGl6ZWRdOiBjb25jYXQsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRSZXF1ZXN0ZWRdOiBjb25jYXQsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRTdG9yZWRdOiBjb25jYXQsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRXYXRjaGVkXTogY29uY2F0LFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlQmxvY2tlZF06IGRpZmZlcmVuY2UsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVFeGVjdXRlZF06IGRpZmZlcmVuY2UsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVFeGVjdXRpbmddOiBkaWZmZXJlbmNlLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlUHJpb3JpdGl6ZWRdOiBkaWZmZXJlbmNlLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlUmVxdWVzdGVkXTogZGlmZmVyZW5jZSxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVN0b3JlZF06IGRpZmZlcmVuY2UsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVXYXRjaGVkXTogZGlmZmVyZW5jZVxufTtcblxuY29uc3QgZmllbGRzOiB7XG4gICAgW2tleTogc3RyaW5nXToga2V5b2YgT21pdDxJQ2FsbGJhY2tzU3RhdGUsICdjb21wbGV0ZWQnPjtcbn0gPSB7XG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRCbG9ja2VkXTogJ2Jsb2NrZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkRXhlY3V0ZWRdOiAnZXhlY3V0ZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkRXhlY3V0aW5nXTogJ2V4ZWN1dGluZycsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRQcmlvcml0aXplZF06ICdwcmlvcml0aXplZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRSZXF1ZXN0ZWRdOiAncmVxdWVzdGVkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFN0b3JlZF06ICdzdG9yZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkV2F0Y2hlZF06ICd3YXRjaGVkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZUJsb2NrZWRdOiAnYmxvY2tlZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVFeGVjdXRlZF06ICdleGVjdXRlZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVFeGVjdXRpbmddOiAnZXhlY3V0aW5nJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVByaW9yaXRpemVkXTogJ3ByaW9yaXRpemVkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVJlcXVlc3RlZF06ICdyZXF1ZXN0ZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlU3RvcmVkXTogJ3N0b3JlZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVXYXRjaGVkXTogJ3dhdGNoZWQnXG59O1xuXG5jb25zdCBtdXRhdGVDb21wbGV0ZWQgPSAoc3RhdGU6IElDYWxsYmFja3NTdGF0ZSwgYWN0aW9uOiBJQ29tcGxldGVkQWN0aW9uKSA9PiAoe1xuICAgIC4uLnN0YXRlLFxuICAgIGNvbXBsZXRlZDogc3RhdGUuY29tcGxldGVkICsgYWN0aW9uLnBheWxvYWRcbn0pO1xuXG5jb25zdCBtdXRhdGVDYWxsYmFja3MgPSAoc3RhdGU6IElDYWxsYmFja3NTdGF0ZSwgYWN0aW9uOiBJQ2FsbGJhY2tBY3Rpb24pID0+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSB0cmFuc2Zvcm1zW2FjdGlvbi50eXBlXTtcbiAgICBjb25zdCBmaWVsZCA9IGZpZWxkc1thY3Rpb24udHlwZV07XG5cbiAgICByZXR1cm4gIXRyYW5zZm9ybSB8fCAhZmllbGQgfHwgYWN0aW9uLnBheWxvYWQubGVuZ3RoID09PSAwXG4gICAgICAgID8gc3RhdGVcbiAgICAgICAgOiB7XG4gICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICBbZmllbGRdOiB0cmFuc2Zvcm0oc3RhdGVbZmllbGRdLCBhY3Rpb24ucGF5bG9hZClcbiAgICAgICAgICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgKFxuICAgIHN0YXRlOiBJQ2FsbGJhY2tzU3RhdGUgPSBERUZBVUxUX1NUQVRFLFxuICAgIGFjdGlvbjogQ2FsbGJhY2tBY3Rpb25cbikgPT5cbiAgICByZWR1Y2UoXG4gICAgICAgIChzLCBhKSA9PiB7XG4gICAgICAgICAgICBpZiAoYSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhLnR5cGUgPT09IENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZS5BZGRDb21wbGV0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbXV0YXRlQ29tcGxldGVkKHMsIGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbXV0YXRlQ2FsbGJhY2tzKHMsIGEpO1xuICAgICAgICB9LFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgYWN0aW9uLnR5cGUgPT09IENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZS5BZ2dyZWdhdGVcbiAgICAgICAgICAgID8gYWN0aW9uLnBheWxvYWRcbiAgICAgICAgICAgIDogW2FjdGlvbl1cbiAgICApO1xuIiwiY29uc3QgaW5pdGlhbENoYW5nZSA9IHtcbiAgICBpZDogbnVsbCxcbiAgICBwcm9wczoge31cbn07XG5cbmZ1bmN0aW9uIGNoYW5nZWQoc3RhdGUgPSBpbml0aWFsQ2hhbmdlKSB7XG4gICAgLy8gVGhpcyBpcyBlbXB0eSBqdXN0IHRvIGluaXRpYWxpemUgdGhlIHN0b3JlLiBDaGFuZ2VzXG4gICAgLy8gYXJlIGFjdHVhbGx5IHJlY29yZGVkIGluIHJlZHVjZXIuanMgc28gdGhhdCB3ZSBjYW5cbiAgICAvLyByZXNvbHZlIHBhdGhzIHRvIGlkLlxuICAgIHJldHVybiBzdGF0ZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2hhbmdlZDtcbiIsImltcG9ydCB7Z2V0QWN0aW9ufSBmcm9tICcuLi9hY3Rpb25zL2NvbnN0YW50cyc7XG5pbXBvcnQge21lcmdlRGVlcFJpZ2h0fSBmcm9tICdyYW1kYSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbmZpZyhzdGF0ZSA9IG51bGwsIGFjdGlvbikge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gZ2V0QWN0aW9uKCdTRVRfQ09ORklHJykpIHtcbiAgICAgICAgLy8gUHV0IHRoZSBjb21wb25lbnRzIGNoaWxkcmVuUHJvcHMgaW4gd2luZG93cyBmb3Igc2lkZSB1c2FnZS5cbiAgICAgICAgd2luZG93Ll9fZGFzaHByaXZhdGVfY2hpbGRyZW5Qcm9wcyA9IG1lcmdlRGVlcFJpZ2h0KFxuICAgICAgICAgICAgd2luZG93Ll9fZGFzaHByaXZhdGVfY2hpbGRyZW5Qcm9wcyB8fCB7fSxcbiAgICAgICAgICAgIGFjdGlvbi5wYXlsb2FkLmNoaWxkcmVuX3Byb3BzXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSBnZXRBY3Rpb24oJ0FERF9IVFRQX0hFQURFUlMnKSkge1xuICAgICAgICByZXR1cm4gbWVyZ2VEZWVwUmlnaHQoc3RhdGUsIHtcbiAgICAgICAgICAgIGZldGNoOiB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogYWN0aW9uLnBheWxvYWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBnZXRBcHBTdGF0ZShzdGF0ZSkge1xuICAgIGNvbnN0IHN0YXRlTGlzdCA9IHtcbiAgICAgICAgU1RBUlRFRDogJ1NUQVJURUQnLFxuICAgICAgICBIWURSQVRFRDogJ0hZRFJBVEVEJyxcbiAgICAgICAgREVTVFJPWUVEOiAnREVTVFJPWUVEJ1xuICAgIH07XG4gICAgaWYgKHN0YXRlTGlzdFtzdGF0ZV0pIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlTGlzdFtzdGF0ZV07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgJHtzdGF0ZX0gaXMgbm90IGEgdmFsaWQgYXBwIHN0YXRlLmApO1xufVxuIiwiY29uc3QgaW5pdGlhbEdyYXBoID0ge307XG5cbmNvbnN0IGdyYXBocyA9IChzdGF0ZSA9IGluaXRpYWxHcmFwaCwgYWN0aW9uKSA9PiB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSAnU0VUX0dSQVBIUycpIHtcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBncmFwaHM7XG4iLCJpbXBvcnQge21lcmdlUmlnaHR9IGZyb20gJ3JhbWRhJztcblxuY29uc3QgaW5pdGlhbEVycm9yID0ge1xuICAgIGZyb250RW5kOiBbXSxcbiAgICBiYWNrRW5kOiBbXSxcbiAgICBiYWNrRW5kQ29ubmVjdGVkOiB0cnVlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBlcnJvcihzdGF0ZSA9IGluaXRpYWxFcnJvciwgYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdPTl9FUlJPUic6IHtcbiAgICAgICAgICAgIGNvbnN0IHtmcm9udEVuZCwgYmFja0VuZCwgYmFja0VuZENvbm5lY3RlZH0gPSBzdGF0ZTtcbiAgICAgICAgICAgIC8vIGxvZyBlcnJvcnMgdG8gdGhlIGNvbnNvbGUgZm9yIHN0YWNrIHRyYWNpbmcgYW5kIHNvIHRoZXkncmVcbiAgICAgICAgICAgIC8vIGF2YWlsYWJsZSBldmVuIHdpdGggZGVidWdnaW5nIG9mZlxuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGUgKi9cbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYWN0aW9uLnBheWxvYWQuZXJyb3IpO1xuXG4gICAgICAgICAgICBpZiAoYWN0aW9uLnBheWxvYWQudHlwZSA9PT0gJ2Zyb250RW5kJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGZyb250RW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXJnZVJpZ2h0KGFjdGlvbi5wYXlsb2FkLCB7dGltZXN0YW1wOiBuZXcgRGF0ZSgpfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5mcm9udEVuZFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBiYWNrRW5kLFxuICAgICAgICAgICAgICAgICAgICBiYWNrRW5kQ29ubmVjdGVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnBheWxvYWQudHlwZSA9PT0gJ2JhY2tFbmQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbnRFbmQsXG4gICAgICAgICAgICAgICAgICAgIGJhY2tFbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlUmlnaHQoYWN0aW9uLnBheWxvYWQsIHt0aW1lc3RhbXA6IG5ldyBEYXRlKCl9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmJhY2tFbmRcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgYmFja0VuZENvbm5lY3RlZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnU0VUX0NPTk5FQ1RJT05fU1RBVFVTJzoge1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlUmlnaHQoc3RhdGUsIHtiYWNrRW5kQ29ubmVjdGVkOiBhY3Rpb24ucGF5bG9hZH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiY29uc3QgaW5pdGlhbEhpc3RvcnkgPSB7XG4gICAgcGFzdDogW10sXG4gICAgcHJlc2VudDoge30sXG4gICAgZnV0dXJlOiBbXVxufTtcblxuZnVuY3Rpb24gaGlzdG9yeShzdGF0ZSA9IGluaXRpYWxIaXN0b3J5LCBhY3Rpb24pIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ1VORE8nOiB7XG4gICAgICAgICAgICBjb25zdCB7cGFzdCwgcHJlc2VudCwgZnV0dXJlfSA9IHN0YXRlO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBwYXN0W3Bhc3QubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBjb25zdCBuZXdQYXN0ID0gcGFzdC5zbGljZSgwLCBwYXN0Lmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBwYXN0OiBuZXdQYXN0LFxuICAgICAgICAgICAgICAgIHByZXNlbnQ6IHByZXZpb3VzLFxuICAgICAgICAgICAgICAgIGZ1dHVyZTogW3ByZXNlbnQsIC4uLmZ1dHVyZV1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdSRURPJzoge1xuICAgICAgICAgICAgY29uc3Qge3Bhc3QsIHByZXNlbnQsIGZ1dHVyZX0gPSBzdGF0ZTtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBmdXR1cmVbMF07XG4gICAgICAgICAgICBjb25zdCBuZXdGdXR1cmUgPSBmdXR1cmUuc2xpY2UoMSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHBhc3Q6IFsuLi5wYXN0LCBwcmVzZW50XSxcbiAgICAgICAgICAgICAgICBwcmVzZW50OiBuZXh0LFxuICAgICAgICAgICAgICAgIGZ1dHVyZTogbmV3RnV0dXJlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnUkVWRVJUJzoge1xuICAgICAgICAgICAgY29uc3Qge3Bhc3QsIGZ1dHVyZX0gPSBzdGF0ZTtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzID0gcGFzdFtwYXN0Lmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgY29uc3QgbmV3UGFzdCA9IHBhc3Quc2xpY2UoMCwgcGFzdC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcGFzdDogbmV3UGFzdCxcbiAgICAgICAgICAgICAgICBwcmVzZW50OiBwcmV2aW91cyxcbiAgICAgICAgICAgICAgICBmdXR1cmU6IFsuLi5mdXR1cmVdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBoaXN0b3J5O1xuIiwiY29uc3QgY3VzdG9tSG9va3MgPSAoXG4gICAgc3RhdGUgPSB7XG4gICAgICAgIGxheW91dF9wcmU6IG51bGwsXG4gICAgICAgIGxheW91dF9wb3N0OiBudWxsLFxuICAgICAgICByZXF1ZXN0X3ByZTogbnVsbCxcbiAgICAgICAgcmVxdWVzdF9wb3N0OiBudWxsLFxuICAgICAgICBjYWxsYmFja19yZXNvbHZlZDogbnVsbCxcbiAgICAgICAgcmVxdWVzdF9yZWZyZXNoX2p3dDogbnVsbCxcbiAgICAgICAgYmVhcjogZmFsc2VcbiAgICB9LFxuICAgIGFjdGlvblxuKSA9PiB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdTRVRfSE9PS1MnOlxuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGN1c3RvbUhvb2tzO1xuIiwiZXhwb3J0IGVudW0gSXNMb2FkaW5nQWN0aW9uVHlwZSB7XG4gICAgU2V0ID0gJ0lzTG9hZGluZy5TZXQnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxvYWRpbmdNYXBBY3Rpb24ge1xuICAgIHR5cGU6IElzTG9hZGluZ0FjdGlvblR5cGUuU2V0O1xuICAgIHBheWxvYWQ6IGFueTtcbn1cblxudHlwZSBJc0xvYWRpbmdTdGF0ZSA9IGJvb2xlYW47XG5leHBvcnQge0lzTG9hZGluZ1N0YXRlfTtcblxuY29uc3QgREVGQVVMVF9TVEFURTogSXNMb2FkaW5nU3RhdGUgPSB0cnVlO1xuXG5leHBvcnQgZGVmYXVsdCAoXG4gICAgc3RhdGU6IElzTG9hZGluZ1N0YXRlID0gREVGQVVMVF9TVEFURSxcbiAgICBhY3Rpb246IElMb2FkaW5nTWFwQWN0aW9uXG4pID0+IChhY3Rpb24udHlwZSA9PT0gSXNMb2FkaW5nQWN0aW9uVHlwZS5TZXQgPyBhY3Rpb24ucGF5bG9hZCA6IHN0YXRlKTtcbiIsImltcG9ydCB7YXBwZW5kLCBhc3NvY1BhdGgsIGluY2x1ZGVzLCBsZW5zUGF0aCwgbWVyZ2VSaWdodCwgdmlld30gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQge2dldEFjdGlvbn0gZnJvbSAnLi4vYWN0aW9ucy9jb25zdGFudHMnO1xuXG5jb25zdCBsYXlvdXQgPSAoc3RhdGUgPSB7fSwgYWN0aW9uKSA9PiB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBnZXRBY3Rpb24oJ1NFVF9MQVlPVVQnKSkge1xuICAgICAgICByZXR1cm4gYWN0aW9uLnBheWxvYWQ7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICAgaW5jbHVkZXMoYWN0aW9uLnR5cGUsIFtcbiAgICAgICAgICAgICdVTkRPX1BST1BfQ0hBTkdFJyxcbiAgICAgICAgICAgICdSRURPX1BST1BfQ0hBTkdFJyxcbiAgICAgICAgICAgIGdldEFjdGlvbignT05fUFJPUF9DSEFOR0UnKVxuICAgICAgICBdKVxuICAgICkge1xuICAgICAgICBjb25zdCBwcm9wUGF0aCA9IGFwcGVuZCgncHJvcHMnLCBhY3Rpb24ucGF5bG9hZC5pdGVtcGF0aCk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUHJvcHMgPSB2aWV3KGxlbnNQYXRoKHByb3BQYXRoKSwgc3RhdGUpO1xuICAgICAgICBjb25zdCBtZXJnZWRQcm9wcyA9IG1lcmdlUmlnaHQoZXhpc3RpbmdQcm9wcywgYWN0aW9uLnBheWxvYWQucHJvcHMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHByb3BQYXRoLCBtZXJnZWRQcm9wcywgc3RhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGxheW91dDtcbiIsImV4cG9ydCBlbnVtIExvYWRpbmdNYXBBY3Rpb25UeXBlIHtcbiAgICBTZXQgPSAnTG9hZGluZ01hcC5TZXQnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxvYWRpbmdNYXBBY3Rpb24ge1xuICAgIHR5cGU6IExvYWRpbmdNYXBBY3Rpb25UeXBlLlNldDtcbiAgICBwYXlsb2FkOiBhbnk7XG59XG5cbnR5cGUgTG9hZGluZ01hcFN0YXRlID0gYW55O1xuZXhwb3J0IHtMb2FkaW5nTWFwU3RhdGV9O1xuXG5jb25zdCBERUZBVUxUX1NUQVRFOiBMb2FkaW5nTWFwU3RhdGUgPSB7fTtcblxuZXhwb3J0IGRlZmF1bHQgKFxuICAgIHN0YXRlOiBMb2FkaW5nTWFwU3RhdGUgPSBERUZBVUxUX1NUQVRFLFxuICAgIGFjdGlvbjogSUxvYWRpbmdNYXBBY3Rpb25cbikgPT4gKGFjdGlvbi50eXBlID09PSBMb2FkaW5nTWFwQWN0aW9uVHlwZS5TZXQgPyBhY3Rpb24ucGF5bG9hZCA6IHN0YXRlKTtcbiIsImltcG9ydCB7Z2V0QWN0aW9ufSBmcm9tICcuLi9hY3Rpb25zL2NvbnN0YW50cyc7XG5cbmNvbnN0IGluaXRpYWxQYXRocyA9IHtzdHJzOiB7fSwgb2Jqczoge319O1xuXG5jb25zdCBwYXRocyA9IChzdGF0ZSA9IGluaXRpYWxQYXRocywgYWN0aW9uKSA9PiB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBnZXRBY3Rpb24oJ1NFVF9QQVRIUycpKSB7XG4gICAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcGF0aHM7XG4iLCJpbXBvcnQge2Nsb25lfSBmcm9tICdyYW1kYSc7XG5cbmltcG9ydCB7U1RBVFVTTUFQfSBmcm9tICcuLi9jb25zdGFudHMvY29uc3RhbnRzJztcblxuY29uc3QgZGVmYXVsdFByb2ZpbGUgPSB7XG4gICAgY291bnQ6IDAsXG4gICAgdG90YWw6IDAsXG4gICAgY29tcHV0ZTogMCxcbiAgICBuZXR3b3JrOiB7XG4gICAgICAgIHRpbWU6IDAsXG4gICAgICAgIHVwbG9hZDogMCxcbiAgICAgICAgZG93bmxvYWQ6IDBcbiAgICB9LFxuICAgIHJlc291cmNlczoge30sXG4gICAgc3RhdHVzOiB7XG4gICAgICAgIGxhdGVzdDogbnVsbFxuICAgIH0sXG4gICAgcmVzdWx0OiB7fVxufTtcblxuY29uc3QgZGVmYXVsdFN0YXRlID0ge1xuICAgIHVwZGF0ZWQ6IFtdLFxuICAgIHJlc291cmNlczoge30sXG4gICAgY2FsbGJhY2tzOiB7fSxcbiAgICBncmFwaExheW91dDogbnVsbFxufTtcblxuY29uc3QgcHJvZmlsZSA9IChzdGF0ZSA9IGRlZmF1bHRTdGF0ZSwgYWN0aW9uKSA9PiB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSAnVVBEQVRFX1JFU09VUkNFX1VTQUdFJykge1xuICAgICAgICAvLyBLZWVwIGEgcmVjb3JkIG9mIHRoZSBtb3N0IHJlY2VudCBjaGFuZ2UuIFRoaXNcbiAgICAgICAgLy8gaXMgc3VidGx5IGRpZmZlcmVudCBmcm9tIGhpc3RvcnkucHJlc2VudCBiZWNhdXNlXG4gICAgICAgIC8vIGl0IHdhdGNoZXMgYWxsIHByb3BzLCBub3QganVzdCBpbnB1dHMuXG4gICAgICAgIGNvbnN0IHtpZCwgdXNhZ2UsIHN0YXR1c30gPSBhY3Rpb24ucGF5bG9hZDtcbiAgICAgICAgY29uc3Qgc3RhdHVzTWFwcGVkID0gU1RBVFVTTUFQW3N0YXR1c10gfHwgc3RhdHVzO1xuXG4gICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIGNhbGxiYWNrIHRoYXQgYWN0dWFsbHkgY2hhbmdlZC5cbiAgICAgICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICB1cGRhdGVkOiBbaWRdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBzdGF0ZS5yZXNvdXJjZXMsXG4gICAgICAgICAgICBjYWxsYmFja3M6IHN0YXRlLmNhbGxiYWNrcyxcbiAgICAgICAgICAgIC8vIGdyYXBoTGF5b3V0IGlzIG5ldmVyIHBhc3NlZCBpbiB2aWEgYWN0aW9ucywgYmVjYXVzZSB3ZSBkb24ndFxuICAgICAgICAgICAgLy8gd2FudCBpdCB0byB0cmlnZ2VyIGEgcmVyZW5kZXIgb2YgdGhlIGNhbGxiYWNrIGdyYXBoLlxuICAgICAgICAgICAgLy8gU2VlIENhbGxiYWNrR3JhcGhDb250YWluZXIucmVhY3RcbiAgICAgICAgICAgIGdyYXBoTGF5b3V0OiBzdGF0ZS5ncmFwaExheW91dFxuICAgICAgICB9O1xuXG4gICAgICAgIG5ld1N0YXRlLmNhbGxiYWNrc1tpZF0gPVxuICAgICAgICAgICAgbmV3U3RhdGUuY2FsbGJhY2tzW2lkXSB8fCBjbG9uZShkZWZhdWx0UHJvZmlsZSk7XG5cbiAgICAgICAgY29uc3QgY2IgPSBuZXdTdGF0ZS5jYWxsYmFja3NbaWRdO1xuICAgICAgICBjb25zdCBjYlJlc291cmNlcyA9IGNiLnJlc291cmNlcztcbiAgICAgICAgY29uc3QgdG90YWxSZXNvdXJjZXMgPSBuZXdTdGF0ZS5yZXNvdXJjZXM7XG5cbiAgICAgICAgLy8gVXBkYXRlIHJlc291cmNlIHVzYWdlICYgcGFyYW1zLlxuICAgICAgICBjYi5jb3VudCArPSAxO1xuICAgICAgICBjYi5zdGF0dXMubGF0ZXN0ID0gc3RhdHVzTWFwcGVkO1xuICAgICAgICBjYi5zdGF0dXNbc3RhdHVzTWFwcGVkXSA9IChjYi5zdGF0dXNbc3RhdHVzTWFwcGVkXSB8fCAwKSArIDE7XG4gICAgICAgIGNiLnJlc3VsdCA9IGFjdGlvbi5wYXlsb2FkLnJlc3VsdDtcbiAgICAgICAgY2IuaW5wdXRzID0gYWN0aW9uLnBheWxvYWQuaW5wdXRzO1xuICAgICAgICBjYi5zdGF0ZSA9IGFjdGlvbi5wYXlsb2FkLnN0YXRlO1xuXG4gICAgICAgIGlmICh1c2FnZSkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIF9fZGFzaF9jbGllbnQsXG4gICAgICAgICAgICAgICAgX19kYXNoX3NlcnZlcixcbiAgICAgICAgICAgICAgICBfX2Rhc2hfdXBsb2FkLFxuICAgICAgICAgICAgICAgIF9fZGFzaF9kb3dubG9hZCxcbiAgICAgICAgICAgICAgICAuLi51c2VyXG4gICAgICAgICAgICB9ID0gdXNhZ2U7XG5cbiAgICAgICAgICAgIGNiLnRvdGFsICs9IF9fZGFzaF9jbGllbnQ7XG4gICAgICAgICAgICBjYi5jb21wdXRlICs9IF9fZGFzaF9zZXJ2ZXI7XG4gICAgICAgICAgICBjYi5uZXR3b3JrLnRpbWUgKz0gX19kYXNoX2NsaWVudCAtIF9fZGFzaF9zZXJ2ZXI7XG4gICAgICAgICAgICBjYi5uZXR3b3JrLnVwbG9hZCArPSBfX2Rhc2hfdXBsb2FkO1xuICAgICAgICAgICAgY2IubmV0d29yay5kb3dubG9hZCArPSBfX2Rhc2hfZG93bmxvYWQ7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgciBpbiB1c2VyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVzZXIuaGFzT3duUHJvcGVydHkocikpIHtcbiAgICAgICAgICAgICAgICAgICAgY2JSZXNvdXJjZXNbcl0gPSAoY2JSZXNvdXJjZXNbcl0gfHwgMCkgKyB1c2VyW3JdO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbFJlc291cmNlc1tyXSA9ICh0b3RhbFJlc291cmNlc1tyXSB8fCAwKSArIHVzZXJbcl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHByb2ZpbGU7XG4iLCJpbXBvcnQge2ZvckVhY2gsIGlzRW1wdHksIGtleXMsIHBhdGh9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7Y29tYmluZVJlZHVjZXJzfSBmcm9tICdyZWR1eCc7XG5cbmltcG9ydCB7Z2V0Q2FsbGJhY2tzQnlJbnB1dH0gZnJvbSAnLi4vYWN0aW9ucy9kZXBlbmRlbmNpZXNfdHMnO1xuXG5pbXBvcnQgY3JlYXRlQXBpUmVkdWNlciBmcm9tICcuL2FwaSc7XG5pbXBvcnQgYXBwTGlmZWN5Y2xlIGZyb20gJy4vYXBwTGlmZWN5Y2xlJztcbmltcG9ydCBjYWxsYmFja3MgZnJvbSAnLi9jYWxsYmFja3MnO1xuaW1wb3J0IGNvbmZpZyBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgZ3JhcGhzIGZyb20gJy4vZGVwZW5kZW5jeUdyYXBoJztcbmltcG9ydCBlcnJvciBmcm9tICcuL2Vycm9yJztcbmltcG9ydCBoaXN0b3J5IGZyb20gJy4vaGlzdG9yeSc7XG5pbXBvcnQgaG9va3MgZnJvbSAnLi9ob29rcyc7XG5pbXBvcnQgcHJvZmlsZSBmcm9tICcuL3Byb2ZpbGUnO1xuaW1wb3J0IGNoYW5nZWQgZnJvbSAnLi9jaGFuZ2VkJztcbmltcG9ydCBpc0xvYWRpbmcgZnJvbSAnLi9pc0xvYWRpbmcnO1xuaW1wb3J0IGxheW91dCBmcm9tICcuL2xheW91dCc7XG5pbXBvcnQgbG9hZGluZ01hcCBmcm9tICcuL2xvYWRpbmdNYXAnO1xuaW1wb3J0IHBhdGhzIGZyb20gJy4vcGF0aHMnO1xuaW1wb3J0IGNhbGxiYWNrSm9icyBmcm9tICcuL2NhbGxiYWNrSm9icyc7XG5cbmV4cG9ydCBjb25zdCBhcGlSZXF1ZXN0cyA9IFtcbiAgICAnZGVwZW5kZW5jaWVzUmVxdWVzdCcsXG4gICAgJ2xheW91dFJlcXVlc3QnLFxuICAgICdyZWxvYWRSZXF1ZXN0JyxcbiAgICAnbG9naW5SZXF1ZXN0J1xuXTtcblxuZnVuY3Rpb24gbWFpblJlZHVjZXIoKSB7XG4gICAgY29uc3QgcGFydHMgPSB7XG4gICAgICAgIGFwcExpZmVjeWNsZSxcbiAgICAgICAgY2FsbGJhY2tzLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBncmFwaHMsXG4gICAgICAgIGhpc3RvcnksXG4gICAgICAgIGhvb2tzLFxuICAgICAgICBwcm9maWxlLFxuICAgICAgICBjaGFuZ2VkLFxuICAgICAgICBpc0xvYWRpbmcsXG4gICAgICAgIGxheW91dCxcbiAgICAgICAgbG9hZGluZ01hcCxcbiAgICAgICAgcGF0aHNcbiAgICB9O1xuICAgIGZvckVhY2gociA9PiB7XG4gICAgICAgIHBhcnRzW3JdID0gY3JlYXRlQXBpUmVkdWNlcihyKTtcbiAgICB9LCBhcGlSZXF1ZXN0cyk7XG5cbiAgICBwYXJ0cy5jYWxsYmFja0pvYnMgPSBjYWxsYmFja0pvYnM7XG5cbiAgICByZXR1cm4gY29tYmluZVJlZHVjZXJzKHBhcnRzKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5wdXRIaXN0b3J5U3RhdGUocGF5bG9hZCwgc3RhdGUsIHJlY29yZENoYW5nZXMpIHtcbiAgICBjb25zdCB7Z3JhcGhzLCBwYXRocywgbGF5b3V0fSA9IHN0YXRlO1xuICAgIGNvbnN0IHtpdGVtcGF0aCwgcHJvcHN9ID0gcGF5bG9hZDtcbiAgICBjb25zdCByZWZQcm9wcyA9IHBhdGgoaXRlbXBhdGguY29uY2F0KFsncHJvcHMnXSksIGxheW91dCkgfHwge307XG4gICAgY29uc3Qge2lkfSA9IHJlZlByb3BzO1xuXG4gICAgbGV0IGhpc3RvcnlFbnRyeTtcbiAgICBpZiAoaWQpIHtcbiAgICAgICAgaWYgKHJlY29yZENoYW5nZXMpIHtcbiAgICAgICAgICAgIHN0YXRlLmNoYW5nZWQgPSB7aWQsIHByb3BzfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGhpc3RvcnlFbnRyeSA9IHtpZCwgcHJvcHM6IHt9fTtcbiAgICAgICAga2V5cyhwcm9wcykuZm9yRWFjaChwcm9wS2V5ID0+IHtcbiAgICAgICAgICAgIGlmIChnZXRDYWxsYmFja3NCeUlucHV0KGdyYXBocywgcGF0aHMsIGlkLCBwcm9wS2V5KS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBoaXN0b3J5RW50cnkucHJvcHNbcHJvcEtleV0gPSByZWZQcm9wc1twcm9wS2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBoaXN0b3J5RW50cnk7XG59XG5cbmZ1bmN0aW9uIHJlY29yZEhpc3RvcnkocmVkdWNlcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuICAgICAgICAvLyBSZWNvcmQgaW5pdGlhbCBzdGF0ZVxuICAgICAgICBjb25zdCB7dHlwZSwgcGF5bG9hZH0gPSBhY3Rpb247XG4gICAgICAgIGlmICh0eXBlID09PSAnT05fUFJPUF9DSEFOR0UnKSB7XG4gICAgICAgICAgICAvLyBoaXN0b3J5IHJlY29yZHMgYWxsIHByb3AgY2hhbmdlcyB0aGF0IGFyZSBpbnB1dHMuXG4gICAgICAgICAgICBjb25zdCBoaXN0b3J5RW50cnkgPSBnZXRJbnB1dEhpc3RvcnlTdGF0ZShwYXlsb2FkLCBzdGF0ZSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoaGlzdG9yeUVudHJ5ICYmICFpc0VtcHR5KGhpc3RvcnlFbnRyeS5wcm9wcykpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5oaXN0b3J5LnByZXNlbnQgPSBoaXN0b3J5RW50cnk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXh0U3RhdGUgPSByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pO1xuXG4gICAgICAgIGlmICh0eXBlID09PSAnT05fUFJPUF9DSEFOR0UnICYmIHBheWxvYWQuc291cmNlICE9PSAncmVzcG9uc2UnKSB7XG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogaWYgdGhlIHByb3AgY2hhbmdlIGlzIGFuIGlucHV0LCB0aGVuXG4gICAgICAgICAgICAgKiByZWNvcmQgaXQgc28gdGhhdCBpdCBjYW4gYmUgcGxheWVkIGJhY2tcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QgaGlzdG9yeUVudHJ5ID0gZ2V0SW5wdXRIaXN0b3J5U3RhdGUocGF5bG9hZCwgbmV4dFN0YXRlKTtcbiAgICAgICAgICAgIGlmIChoaXN0b3J5RW50cnkgJiYgIWlzRW1wdHkoaGlzdG9yeUVudHJ5LnByb3BzKSkge1xuICAgICAgICAgICAgICAgIG5leHRTdGF0ZS5oaXN0b3J5ID0ge1xuICAgICAgICAgICAgICAgICAgICBwYXN0OiBbLi4ubmV4dFN0YXRlLmhpc3RvcnkucGFzdCwgc3RhdGUuaGlzdG9yeS5wcmVzZW50XSxcbiAgICAgICAgICAgICAgICAgICAgcHJlc2VudDogaGlzdG9yeUVudHJ5LFxuICAgICAgICAgICAgICAgICAgICBmdXR1cmU6IFtdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0U3RhdGU7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gcmVsb2FkZXJSZWR1Y2VyKHJlZHVjZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHtcbiAgICAgICAgY29uc3Qge2hpc3RvcnksIGNvbmZpZywgaG9va3N9ID0gc3RhdGUgfHwge307XG4gICAgICAgIGxldCBuZXdTdGF0ZSA9IHN0YXRlO1xuICAgICAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdSRUxPQUQnKSB7XG4gICAgICAgICAgICBuZXdTdGF0ZSA9IHtoaXN0b3J5LCBjb25maWcsIGhvb2tzfTtcbiAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gJ1NFVF9DT05GSUcnKSB7XG4gICAgICAgICAgICAvLyBuZXcgY29uZmlnIGFsc28gcmVsb2FkcywgYW5kIGV2ZW4gY2xlYXJzIGhpc3RvcnksXG4gICAgICAgICAgICAvLyBpbiBjYXNlIHRoZXJlJ3MgYSBuZXcgdXNlciBvciBldmVuIGEgdG90YWxseSBkaWZmZXJlbnQgYXBwIVxuICAgICAgICAgICAgLy8gaG9va3MgYXJlIHNldCBhdCBhbiBldmVuIGhpZ2hlciBsZXZlbCB0aGFuIGNvbmZpZyB0aG91Z2guXG4gICAgICAgICAgICBuZXdTdGF0ZSA9IHtob29rc307XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZHVjZXIobmV3U3RhdGUsIGFjdGlvbik7XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZHVjZXIoKSB7XG4gICAgcmV0dXJuIHJlbG9hZGVyUmVkdWNlcihyZWNvcmRIaXN0b3J5KG1haW5SZWR1Y2VyKCkpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgICByZXNvbHZlOiBjb21wb25lbnQgPT4ge1xuICAgICAgICBjb25zdCB7dHlwZSwgbmFtZXNwYWNlfSA9IGNvbXBvbmVudDtcblxuICAgICAgICBjb25zdCBucyA9IHdpbmRvd1tuYW1lc3BhY2VdO1xuXG4gICAgICAgIGlmIChucykge1xuICAgICAgICAgICAgaWYgKG5zW3R5cGVdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5zW3R5cGVdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbXBvbmVudCAke3R5cGV9IG5vdCBmb3VuZCBpbiAke25hbWVzcGFjZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtuYW1lc3BhY2V9IHdhcyBub3QgZm91bmQuYCk7XG4gICAgfVxufTtcbiIsImltcG9ydCB7b25jZX0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHtjcmVhdGVTdG9yZSwgYXBwbHlNaWRkbGV3YXJlLCBTdG9yZSwgT2JzZXJ2ZXJ9IGZyb20gJ3JlZHV4JztcbmltcG9ydCB0aHVuayBmcm9tICdyZWR1eC10aHVuayc7XG5pbXBvcnQge2NyZWF0ZVJlZHVjZXJ9IGZyb20gJy4vcmVkdWNlcnMvcmVkdWNlcic7XG5pbXBvcnQgU3RvcmVPYnNlcnZlciBmcm9tICcuL1N0b3JlT2JzZXJ2ZXInO1xuaW1wb3J0IHtJQ2FsbGJhY2tzU3RhdGV9IGZyb20gJy4vcmVkdWNlcnMvY2FsbGJhY2tzJztcbmltcG9ydCB7TG9hZGluZ01hcFN0YXRlfSBmcm9tICcuL3JlZHVjZXJzL2xvYWRpbmdNYXAnO1xuaW1wb3J0IHtJc0xvYWRpbmdTdGF0ZX0gZnJvbSAnLi9yZWR1Y2Vycy9pc0xvYWRpbmcnO1xuXG5pbXBvcnQgZG9jdW1lbnRUaXRsZSBmcm9tICcuL29ic2VydmVycy9kb2N1bWVudFRpdGxlJztcbmltcG9ydCBleGVjdXRlZENhbGxiYWNrcyBmcm9tICcuL29ic2VydmVycy9leGVjdXRlZENhbGxiYWNrcyc7XG5pbXBvcnQgZXhlY3V0aW5nQ2FsbGJhY2tzIGZyb20gJy4vb2JzZXJ2ZXJzL2V4ZWN1dGluZ0NhbGxiYWNrcyc7XG5pbXBvcnQgaXNMb2FkaW5nIGZyb20gJy4vb2JzZXJ2ZXJzL2lzTG9hZGluZyc7XG5pbXBvcnQgbG9hZGluZ01hcCBmcm9tICcuL29ic2VydmVycy9sb2FkaW5nTWFwJztcbmltcG9ydCBwcmlvcml0aXplZENhbGxiYWNrcyBmcm9tICcuL29ic2VydmVycy9wcmlvcml0aXplZENhbGxiYWNrcyc7XG5pbXBvcnQgcmVxdWVzdGVkQ2FsbGJhY2tzIGZyb20gJy4vb2JzZXJ2ZXJzL3JlcXVlc3RlZENhbGxiYWNrcyc7XG5pbXBvcnQgc3RvcmVkQ2FsbGJhY2tzIGZyb20gJy4vb2JzZXJ2ZXJzL3N0b3JlZENhbGxiYWNrcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVN0b3JlU3RhdGUge1xuICAgIGNhbGxiYWNrczogSUNhbGxiYWNrc1N0YXRlO1xuICAgIGlzTG9hZGluZzogSXNMb2FkaW5nU3RhdGU7XG4gICAgbG9hZGluZ01hcDogTG9hZGluZ01hcFN0YXRlO1xuICAgIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU3RvcmVPYnNlcnZlciB7XG4gICAgb2JzZXJ2ZXI6IE9ic2VydmVyPFN0b3JlPElTdG9yZVN0YXRlPj47XG4gICAgaW5wdXRzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVuZGVyZXJTdG9yZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX19zdG9yZSA9IHRoaXMuaW5pdGlhbGl6ZVN0b3JlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfX3N0b3JlOiBTdG9yZTxJU3RvcmVTdGF0ZT47XG4gICAgcHVibGljIGdldCBzdG9yZSgpOiBTdG9yZTxJU3RvcmVTdGF0ZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fX3N0b3JlO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmVPYnNlcnZlciA9IG5ldyBTdG9yZU9ic2VydmVyPElTdG9yZVN0YXRlPigpO1xuXG4gICAgcHJpdmF0ZSBzZXRPYnNlcnZlcnMgPSBvbmNlKCgpID0+IHtcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZSA9IHRoaXMuc3RvcmVPYnNlcnZlci5vYnNlcnZlO1xuXG4gICAgICAgIG9ic2VydmUoZG9jdW1lbnRUaXRsZSk7XG4gICAgICAgIG9ic2VydmUoaXNMb2FkaW5nKTtcbiAgICAgICAgb2JzZXJ2ZShsb2FkaW5nTWFwKTtcbiAgICAgICAgb2JzZXJ2ZShyZXF1ZXN0ZWRDYWxsYmFja3MpO1xuICAgICAgICBvYnNlcnZlKHByaW9yaXRpemVkQ2FsbGJhY2tzKTtcbiAgICAgICAgb2JzZXJ2ZShleGVjdXRpbmdDYWxsYmFja3MpO1xuICAgICAgICBvYnNlcnZlKGV4ZWN1dGVkQ2FsbGJhY2tzKTtcbiAgICAgICAgb2JzZXJ2ZShzdG9yZWRDYWxsYmFja3MpO1xuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBjcmVhdGVBcHBTdG9yZSA9IChyZWR1Y2VyOiBhbnksIG1pZGRsZXdhcmU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLl9fc3RvcmUgPSBjcmVhdGVTdG9yZShyZWR1Y2VyLCBtaWRkbGV3YXJlKTtcbiAgICAgICAgdGhpcy5zdG9yZU9ic2VydmVyLnNldFN0b3JlKHRoaXMuX19zdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0T2JzZXJ2ZXJzKCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgYSBSZWR1eCBzdG9yZSB3aXRoIHRodW5rLCBwbHVzIGxvZ2dpbmcgKG9ubHkgaW4gZGV2ZWxvcG1lbnQgbW9kZSkgbWlkZGxld2FyZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sfSByZXNldDogZGlzY2FyZCBhbnkgcHJldmlvdXMgc3RvcmVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdG9yZTxHZW5lcmljU3RvcmVFbmhhbmNlcj59XG4gICAgICogIEFuIGluaXRpYWxpemVkIHJlZHV4IHN0b3JlIHdpdGggbWlkZGxld2FyZSBhbmQgcG9zc2libGUgaG90IHJlbG9hZGluZyBvZiByZWR1Y2Vyc1xuICAgICAqL1xuICAgIGluaXRpYWxpemVTdG9yZSA9IChyZXNldD86IGJvb2xlYW4pOiBTdG9yZTxJU3RvcmVTdGF0ZT4gPT4ge1xuICAgICAgICBpZiAodGhpcy5fX3N0b3JlICYmICFyZXNldCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX19zdG9yZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlZHVjZXIgPSBjcmVhdGVSZWR1Y2VyKCk7XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb2Nlc3MtZW52XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFwcFN0b3JlKHJlZHVjZXIsIGFwcGx5TWlkZGxld2FyZSh0aHVuaykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gb25seSBhdHRhY2ggbG9nZ2VyIHRvIG1pZGRsZXdhcmUgaW4gbm9uLXByb2R1Y3Rpb24gbW9kZVxuICAgICAgICAgICAgY29uc3QgcmVkdXhEVEVDID0gKHdpbmRvdyBhcyBhbnkpXG4gICAgICAgICAgICAgICAgLl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX0NPTVBPU0VfXztcbiAgICAgICAgICAgIGlmIChyZWR1eERURUMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUFwcFN0b3JlKFxuICAgICAgICAgICAgICAgICAgICByZWR1Y2VyLFxuICAgICAgICAgICAgICAgICAgICByZWR1eERURUMoe2FjdGlvbnNEZW55bGlzdDogWydyZWxvYWRSZXF1ZXN0J119KShcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5TWlkZGxld2FyZSh0aHVuaylcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQXBwU3RvcmUocmVkdWNlciwgYXBwbHlNaWRkbGV3YXJlKHRodW5rKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJlc2V0KSB7XG4gICAgICAgICAgICAvLyBUT0RPIC0gUHJvdGVjdCB0aGlzIHVuZGVyIGEgZGVidWcgbW9kZT9cbiAgICAgICAgICAgICh3aW5kb3cgYXMgYW55KS5zdG9yZSA9IHRoaXMuX19zdG9yZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgobW9kdWxlIGFzIGFueSkuaG90KSB7XG4gICAgICAgICAgICAvLyBFbmFibGUgaG90IG1vZHVsZSByZXBsYWNlbWVudCBmb3IgcmVkdWNlcnNcbiAgICAgICAgICAgIChtb2R1bGUgYXMgYW55KS5ob3QuYWNjZXB0KCcuL3JlZHVjZXJzL3JlZHVjZXInLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dFJvb3RSZWR1Y2VyID1cbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnLi9yZWR1Y2Vycy9yZWR1Y2VyJykuY3JlYXRlUmVkdWNlcigpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fX3N0b3JlLnJlcGxhY2VSZWR1Y2VyKG5leHRSb290UmVkdWNlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9fc3RvcmU7XG4gICAgfTtcbn1cbiIsImltcG9ydCB7cGF0aCwgdHlwZSwgaGFzfSBmcm9tICdyYW1kYSc7XG5cbmltcG9ydCBSZWdpc3RyeSBmcm9tICcuLi9yZWdpc3RyeSc7XG5pbXBvcnQge3N0cmluZ2lmeUlkfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5cbmZ1bmN0aW9uIGlzTG9hZGluZ0NvbXBvbmVudChsYXlvdXQ6IGFueSkge1xuICAgIHZhbGlkYXRlQ29tcG9uZW50KGxheW91dCk7XG4gICAgcmV0dXJuIChSZWdpc3RyeS5yZXNvbHZlKGxheW91dCkgYXMgYW55KS5fZGFzaHByaXZhdGVfaXNMb2FkaW5nQ29tcG9uZW50O1xufVxuXG5jb25zdCBOVUxMX0xPQURJTkdfU1RBVEUgPSBmYWxzZTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvYWRpbmdTdGF0ZShcbiAgICBjb21wb25lbnRMYXlvdXQ6IGFueSxcbiAgICBjb21wb25lbnRQYXRoOiBhbnksXG4gICAgbG9hZGluZ01hcDogYW55XG4pIHtcbiAgICBpZiAoIWxvYWRpbmdNYXApIHtcbiAgICAgICAgcmV0dXJuIE5VTExfTE9BRElOR19TVEFURTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2FkaW5nRnJhZ21lbnQ6IGFueSA9IHBhdGgoY29tcG9uZW50UGF0aCwgbG9hZGluZ01hcCk7XG4gICAgLy8gQ29tcG9uZW50IGFuZCBjaGlsZHJlbiBhcmUgbm90IGxvYWRpbmcgaWYgdGhlcmUncyBubyBsb2FkaW5nIGZyYWdtZW50XG4gICAgLy8gZm9yIHRoZSBjb21wb25lbnQncyBwYXRoIGluIHRoZSBsYXlvdXQuXG4gICAgaWYgKCFsb2FkaW5nRnJhZ21lbnQpIHtcbiAgICAgICAgcmV0dXJuIE5VTExfTE9BRElOR19TVEFURTtcbiAgICB9XG5cbiAgICBjb25zdCBpZHByb3A6IGFueSA9IGxvYWRpbmdGcmFnbWVudC5fX2Rhc2hwcml2YXRlX19pZHByb3BfXztcbiAgICBpZiAoaWRwcm9wKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc19sb2FkaW5nOiB0cnVlLFxuICAgICAgICAgICAgcHJvcF9uYW1lOiBpZHByb3AucHJvcGVydHksXG4gICAgICAgICAgICBjb21wb25lbnRfbmFtZTogc3RyaW5naWZ5SWQoaWRwcm9wLmlkKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGlkcHJvcHM6IGFueSA9IGxvYWRpbmdGcmFnbWVudC5fX2Rhc2hwcml2YXRlX19pZHByb3BzX18/LlswXTtcbiAgICBpZiAoaWRwcm9wcyAmJiBpc0xvYWRpbmdDb21wb25lbnQoY29tcG9uZW50TGF5b3V0KSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaXNfbG9hZGluZzogdHJ1ZSxcbiAgICAgICAgICAgIHByb3BfbmFtZTogaWRwcm9wcy5wcm9wZXJ0eSxcbiAgICAgICAgICAgIGNvbXBvbmVudF9uYW1lOiBzdHJpbmdpZnlJZChpZHByb3BzLmlkKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBOVUxMX0xPQURJTkdfU1RBVEU7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2FkaW5nSGFzaCA9IChjb21wb25lbnRQYXRoOiBhbnksIGxvYWRpbmdNYXA6IGFueSkgPT5cbiAgICAoXG4gICAgICAgICgobG9hZGluZ01hcCAmJlxuICAgICAgICAgICAgKHBhdGgoY29tcG9uZW50UGF0aCwgbG9hZGluZ01hcCkgYXMgYW55KVxuICAgICAgICAgICAgICAgID8uX19kYXNocHJpdmF0ZV9faWRwcm9wc19fKSA/P1xuICAgICAgICAgICAgW10pIGFzIGFueVtdXG4gICAgKVxuICAgICAgICAubWFwKCh7aWQsIHByb3BlcnR5fSkgPT4gYCR7aWR9LiR7cHJvcGVydHl9YClcbiAgICAgICAgLmpvaW4oJywnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb246IGFueSkge1xuICAgIGlmICh0eXBlKGNvbXBvbmVudERlZmluaXRpb24pID09PSAnQXJyYXknKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdUaGUgY2hpbGRyZW4gcHJvcGVydHkgb2YgYSBjb21wb25lbnQgaXMgYSBsaXN0IG9mIGxpc3RzLCBpbnN0ZWFkICcgK1xuICAgICAgICAgICAgICAgICdvZiBqdXN0IGEgbGlzdC4gJyArXG4gICAgICAgICAgICAgICAgJ0NoZWNrIHRoZSBjb21wb25lbnQgdGhhdCBoYXMgdGhlIGZvbGxvd2luZyBjb250ZW50cywgJyArXG4gICAgICAgICAgICAgICAgJ2FuZCByZW1vdmUgb25lIG9mIHRoZSBsZXZlbHMgb2YgbmVzdGluZzogXFxuJyArXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY29tcG9uZW50RGVmaW5pdGlvbiwgbnVsbCwgMilcbiAgICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgICB0eXBlKGNvbXBvbmVudERlZmluaXRpb24pID09PSAnT2JqZWN0JyAmJlxuICAgICAgICAhKFxuICAgICAgICAgICAgaGFzKCduYW1lc3BhY2UnLCBjb21wb25lbnREZWZpbml0aW9uKSAmJlxuICAgICAgICAgICAgaGFzKCd0eXBlJywgY29tcG9uZW50RGVmaW5pdGlvbikgJiZcbiAgICAgICAgICAgIGhhcygncHJvcHMnLCBjb21wb25lbnREZWZpbml0aW9uKVxuICAgICAgICApXG4gICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdBbiBvYmplY3Qgd2FzIHByb3ZpZGVkIGFzIGBjaGlsZHJlbmAgaW5zdGVhZCBvZiBhIGNvbXBvbmVudCwgJyArXG4gICAgICAgICAgICAgICAgJ3N0cmluZywgb3IgbnVtYmVyIChvciBsaXN0IG9mIHRob3NlKS4gJyArXG4gICAgICAgICAgICAgICAgJ0NoZWNrIHRoZSBjaGlsZHJlbiBwcm9wZXJ0eSB0aGF0IGxvb2tzIHNvbWV0aGluZyBsaWtlOlxcbicgK1xuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGNvbXBvbmVudERlZmluaXRpb24sIG51bGwsIDIpXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHtvbWl0LCB2YWx1ZXN9IGZyb20gJ3JhbWRhJztcblxuaW1wb3J0IHtJQ2FsbGJhY2tzU3RhdGV9IGZyb20gJy4uL3JlZHVjZXJzL2NhbGxiYWNrcyc7XG5pbXBvcnQge0lDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2tzJztcblxuZXhwb3J0IGNvbnN0IGdldFBlbmRpbmdDYWxsYmFja3MgPSAoc3RhdGU6IElDYWxsYmFja3NTdGF0ZSkgPT5cbiAgICBBcnJheTxJQ2FsbGJhY2s+KCkuY29uY2F0KC4uLnZhbHVlcyhvbWl0KFsnc3RvcmVkJywgJ2NvbXBsZXRlZCddLCBzdGF0ZSkpKTtcbiIsImV4cG9ydCBkZWZhdWx0IGFzeW5jIChkdXJhdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgbGV0IF9yZXNvbHZlOiBhbnk7XG4gICAgY29uc3QgcCA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gKF9yZXNvbHZlID0gcmVzb2x2ZSkpO1xuXG4gICAgc2V0VGltZW91dChfcmVzb2x2ZSwgZHVyYXRpb24pO1xuXG4gICAgcmV0dXJuIHA7XG59O1xuIiwiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiY29zZS1iYXNlXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtcImNvc2UtYmFzZVwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJjeXRvc2NhcGVGY29zZVwiXSA9IGZhY3RvcnkocmVxdWlyZShcImNvc2UtYmFzZVwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiY3l0b3NjYXBlRmNvc2VcIl0gPSBmYWN0b3J5KHJvb3RbXCJjb3NlQmFzZVwiXSk7XG59KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xNDBfXykge1xucmV0dXJuIC8qKioqKiovICgoKSA9PiB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0XCJ1c2Ugc3RyaWN0XCI7XG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlc19fID0gKHtcblxuLyoqKi8gNjU4OlxuLyoqKi8gKChtb2R1bGUpID0+IHtcblxuXG5cbi8vIFNpbXBsZSwgaW50ZXJuYWwgT2JqZWN0LmFzc2lnbigpIHBvbHlmaWxsIGZvciBvcHRpb25zIG9iamVjdHMgZXRjLlxuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5hc3NpZ24gIT0gbnVsbCA/IE9iamVjdC5hc3NpZ24uYmluZChPYmplY3QpIDogZnVuY3Rpb24gKHRndCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgc3JjcyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBzcmNzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHNyY3MuZm9yRWFjaChmdW5jdGlvbiAoc3JjKSB7XG4gICAgT2JqZWN0LmtleXMoc3JjKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICByZXR1cm4gdGd0W2tdID0gc3JjW2tdO1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gdGd0O1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU0ODpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBfc2xpY2VkVG9BcnJheSA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0pIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfSByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IHJldHVybiBhcnI7IH0gZWxzZSBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSB7IHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7IH0gZWxzZSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9IH07IH0oKTtcblxuLypcbiAqIEF1eGlsaWFyeSBmdW5jdGlvbnNcbiAqL1xuXG52YXIgTGlua2VkTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5sYXlvdXRCYXNlLkxpbmtlZExpc3Q7XG5cbnZhciBhdXhpbGlhcnkgPSB7fTtcblxuLy8gZ2V0IHRoZSB0b3AgbW9zdCBub2Rlc1xuYXV4aWxpYXJ5LmdldFRvcE1vc3ROb2RlcyA9IGZ1bmN0aW9uIChub2Rlcykge1xuICB2YXIgbm9kZXNNYXAgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIG5vZGVzTWFwW25vZGVzW2ldLmlkKCldID0gdHJ1ZTtcbiAgfVxuICB2YXIgcm9vdHMgPSBub2Rlcy5maWx0ZXIoZnVuY3Rpb24gKGVsZSwgaSkge1xuICAgIGlmICh0eXBlb2YgZWxlID09PSBcIm51bWJlclwiKSB7XG4gICAgICBlbGUgPSBpO1xuICAgIH1cbiAgICB2YXIgcGFyZW50ID0gZWxlLnBhcmVudCgpWzBdO1xuICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGVzTWFwW3BhcmVudC5pZCgpXSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50KClbMF07XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gcm9vdHM7XG59O1xuXG4vLyBmaW5kIGRpc2Nvbm5lY3RlZCBjb21wb25lbnRzIGFuZCBjcmVhdGUgZHVtbXkgbm9kZXMgdGhhdCBjb25uZWN0IHRoZW1cbmF1eGlsaWFyeS5jb25uZWN0Q29tcG9uZW50cyA9IGZ1bmN0aW9uIChjeSwgZWxlcywgdG9wTW9zdE5vZGVzLCBkdW1teU5vZGVzKSB7XG4gIHZhciBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0KCk7XG4gIHZhciB2aXNpdGVkID0gbmV3IFNldCgpO1xuICB2YXIgdmlzaXRlZFRvcE1vc3ROb2RlcyA9IFtdO1xuICB2YXIgY3VycmVudE5laWdoYm9yID0gdm9pZCAwO1xuICB2YXIgbWluRGVncmVlTm9kZSA9IHZvaWQgMDtcbiAgdmFyIG1pbkRlZ3JlZSA9IHZvaWQgMDtcblxuICB2YXIgaXNDb25uZWN0ZWQgPSBmYWxzZTtcbiAgdmFyIGNvdW50ID0gMTtcbiAgdmFyIG5vZGVzQ29ubmVjdGVkVG9EdW1teSA9IFtdO1xuICB2YXIgY29tcG9uZW50cyA9IFtdO1xuXG4gIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgIHZhciBjbXB0ID0gY3kuY29sbGVjdGlvbigpO1xuICAgIGNvbXBvbmVudHMucHVzaChjbXB0KTtcblxuICAgIHZhciBjdXJyZW50Tm9kZSA9IHRvcE1vc3ROb2Rlc1swXTtcbiAgICB2YXIgY2hpbGRyZW5PZkN1cnJlbnROb2RlID0gY3kuY29sbGVjdGlvbigpO1xuICAgIGNoaWxkcmVuT2ZDdXJyZW50Tm9kZS5tZXJnZShjdXJyZW50Tm9kZSkubWVyZ2UoY3VycmVudE5vZGUuZGVzY2VuZGFudHMoKS5pbnRlcnNlY3Rpb24oZWxlcykpO1xuICAgIHZpc2l0ZWRUb3BNb3N0Tm9kZXMucHVzaChjdXJyZW50Tm9kZSk7XG5cbiAgICBjaGlsZHJlbk9mQ3VycmVudE5vZGUuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgcXVldWUucHVzaChub2RlKTtcbiAgICAgIHZpc2l0ZWQuYWRkKG5vZGUpO1xuICAgICAgY21wdC5tZXJnZShub2RlKTtcbiAgICB9KTtcblxuICAgIHZhciBfbG9vcDIgPSBmdW5jdGlvbiBfbG9vcDIoKSB7XG4gICAgICBjdXJyZW50Tm9kZSA9IHF1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgIC8vIFRyYXZlcnNlIGFsbCBuZWlnaGJvcnMgb2YgdGhpcyBub2RlXG4gICAgICB2YXIgbmVpZ2hib3JOb2RlcyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgIGN1cnJlbnROb2RlLm5laWdoYm9yaG9vZCgpLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAoZWxlcy5pbnRlcnNlY3Rpb24oY3VycmVudE5vZGUuZWRnZXNXaXRoKG5vZGUpKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbmVpZ2hib3JOb2Rlcy5tZXJnZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVpZ2hib3JOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbmVpZ2hib3JOb2RlID0gbmVpZ2hib3JOb2Rlc1tpXTtcbiAgICAgICAgY3VycmVudE5laWdoYm9yID0gdG9wTW9zdE5vZGVzLmludGVyc2VjdGlvbihuZWlnaGJvck5vZGUudW5pb24obmVpZ2hib3JOb2RlLmFuY2VzdG9ycygpKSk7XG4gICAgICAgIGlmIChjdXJyZW50TmVpZ2hib3IgIT0gbnVsbCAmJiAhdmlzaXRlZC5oYXMoY3VycmVudE5laWdoYm9yWzBdKSkge1xuICAgICAgICAgIHZhciBjaGlsZHJlbk9mTmVpZ2hib3IgPSBjdXJyZW50TmVpZ2hib3IudW5pb24oY3VycmVudE5laWdoYm9yLmRlc2NlbmRhbnRzKCkpO1xuXG4gICAgICAgICAgY2hpbGRyZW5PZk5laWdoYm9yLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2gobm9kZSk7XG4gICAgICAgICAgICB2aXNpdGVkLmFkZChub2RlKTtcbiAgICAgICAgICAgIGNtcHQubWVyZ2Uobm9kZSk7XG4gICAgICAgICAgICBpZiAodG9wTW9zdE5vZGVzLmhhcyhub2RlKSkge1xuICAgICAgICAgICAgICB2aXNpdGVkVG9wTW9zdE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPSAwKSB7XG4gICAgICBfbG9vcDIoKTtcbiAgICB9XG5cbiAgICBjbXB0LmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIGVsZXMuaW50ZXJzZWN0aW9uKG5vZGUuY29ubmVjdGVkRWRnZXMoKSkuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAvLyBjb25uZWN0ZWRFZGdlcygpIHVzdWFsbHkgY2FjaGVkXG4gICAgICAgIGlmIChjbXB0LmhhcyhlLnNvdXJjZSgpKSAmJiBjbXB0LmhhcyhlLnRhcmdldCgpKSkge1xuICAgICAgICAgIC8vIGhhcygpIGlzIGNoZWFwXG4gICAgICAgICAgY21wdC5tZXJnZShlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAodmlzaXRlZFRvcE1vc3ROb2Rlcy5sZW5ndGggPT0gdG9wTW9zdE5vZGVzLmxlbmd0aCkge1xuICAgICAgaXNDb25uZWN0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghaXNDb25uZWN0ZWQgfHwgaXNDb25uZWN0ZWQgJiYgY291bnQgPiAxKSB7XG4gICAgICBtaW5EZWdyZWVOb2RlID0gdmlzaXRlZFRvcE1vc3ROb2Rlc1swXTtcbiAgICAgIG1pbkRlZ3JlZSA9IG1pbkRlZ3JlZU5vZGUuY29ubmVjdGVkRWRnZXMoKS5sZW5ndGg7XG4gICAgICB2aXNpdGVkVG9wTW9zdE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuY29ubmVjdGVkRWRnZXMoKS5sZW5ndGggPCBtaW5EZWdyZWUpIHtcbiAgICAgICAgICBtaW5EZWdyZWUgPSBub2RlLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoO1xuICAgICAgICAgIG1pbkRlZ3JlZU5vZGUgPSBub2RlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIG5vZGVzQ29ubmVjdGVkVG9EdW1teS5wdXNoKG1pbkRlZ3JlZU5vZGUuaWQoKSk7XG4gICAgICAvLyBUTyBETzogQ2hlY2sgZWZmaWNpZW5jeSBvZiB0aGlzIHBhcnRcbiAgICAgIHZhciB0ZW1wID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgdGVtcC5tZXJnZSh2aXNpdGVkVG9wTW9zdE5vZGVzWzBdKTtcbiAgICAgIHZpc2l0ZWRUb3BNb3N0Tm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB0ZW1wLm1lcmdlKG5vZGUpO1xuICAgICAgfSk7XG4gICAgICB2aXNpdGVkVG9wTW9zdE5vZGVzID0gW107XG4gICAgICB0b3BNb3N0Tm9kZXMgPSB0b3BNb3N0Tm9kZXMuZGlmZmVyZW5jZSh0ZW1wKTtcbiAgICAgIGNvdW50Kys7XG4gICAgfVxuICB9O1xuXG4gIGRvIHtcbiAgICBfbG9vcCgpO1xuICB9IHdoaWxlICghaXNDb25uZWN0ZWQpO1xuXG4gIGlmIChkdW1teU5vZGVzKSB7XG4gICAgaWYgKG5vZGVzQ29ubmVjdGVkVG9EdW1teS5sZW5ndGggPiAwKSB7XG4gICAgICBkdW1teU5vZGVzLnNldCgnZHVtbXknICsgKGR1bW15Tm9kZXMuc2l6ZSArIDEpLCBub2Rlc0Nvbm5lY3RlZFRvRHVtbXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29tcG9uZW50cztcbn07XG5cbi8vIHJlbG9jYXRlcyBjb21wb25lbnRSZXN1bHQgdG8gb3JpZ2luYWxDZW50ZXIgaWYgdGhlcmUgaXMgbm8gZml4ZWROb2RlQ29uc3RyYWludFxuYXV4aWxpYXJ5LnJlbG9jYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKG9yaWdpbmFsQ2VudGVyLCBjb21wb25lbnRSZXN1bHQsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zLmZpeGVkTm9kZUNvbnN0cmFpbnQpIHtcbiAgICB2YXIgbWluWENvb3JkID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIHZhciBtYXhYQ29vcmQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgdmFyIG1pbllDb29yZCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICB2YXIgbWF4WUNvb3JkID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiKSB7XG4gICAgICAvLyBjYWxjdWxhdGUgY3VycmVudCBib3VuZGluZyBib3hcbiAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlO1xuICAgICAgdmFyIF9pdGVyYXRvckVycm9yID0gdW5kZWZpbmVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBjb21wb25lbnRSZXN1bHQubm9kZUluZGV4ZXNbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gKF9zdGVwID0gX2l0ZXJhdG9yLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlKSB7XG4gICAgICAgICAgdmFyIF9yZWYgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpO1xuXG4gICAgICAgICAgdmFyIGtleSA9IF9yZWYyWzBdO1xuICAgICAgICAgIHZhciB2YWx1ZSA9IF9yZWYyWzFdO1xuXG4gICAgICAgICAgdmFyIGN5Tm9kZSA9IG9wdGlvbnMuY3kuZ2V0RWxlbWVudEJ5SWQoa2V5KTtcbiAgICAgICAgICBpZiAoY3lOb2RlKSB7XG4gICAgICAgICAgICB2YXIgbm9kZUJCID0gY3lOb2RlLmJvdW5kaW5nQm94KCk7XG4gICAgICAgICAgICB2YXIgbGVmdFggPSBjb21wb25lbnRSZXN1bHQueENvb3Jkc1t2YWx1ZV0gLSBub2RlQkIudyAvIDI7XG4gICAgICAgICAgICB2YXIgcmlnaHRYID0gY29tcG9uZW50UmVzdWx0LnhDb29yZHNbdmFsdWVdICsgbm9kZUJCLncgLyAyO1xuICAgICAgICAgICAgdmFyIHRvcFkgPSBjb21wb25lbnRSZXN1bHQueUNvb3Jkc1t2YWx1ZV0gLSBub2RlQkIuaCAvIDI7XG4gICAgICAgICAgICB2YXIgYm90dG9tWSA9IGNvbXBvbmVudFJlc3VsdC55Q29vcmRzW3ZhbHVlXSArIG5vZGVCQi5oIC8gMjtcblxuICAgICAgICAgICAgaWYgKGxlZnRYIDwgbWluWENvb3JkKSBtaW5YQ29vcmQgPSBsZWZ0WDtcbiAgICAgICAgICAgIGlmIChyaWdodFggPiBtYXhYQ29vcmQpIG1heFhDb29yZCA9IHJpZ2h0WDtcbiAgICAgICAgICAgIGlmICh0b3BZIDwgbWluWUNvb3JkKSBtaW5ZQ29vcmQgPSB0b3BZO1xuICAgICAgICAgICAgaWYgKGJvdHRvbVkgPiBtYXhZQ29vcmQpIG1heFlDb29yZCA9IGJvdHRvbVk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGZpbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgYW5kIG9yaWdpbmFsIGNlbnRlclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgX2l0ZXJhdG9yRXJyb3IgPSBlcnI7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3IucmV0dXJuKSB7XG4gICAgICAgICAgICBfaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBkaWZmT25YID0gb3JpZ2luYWxDZW50ZXIueCAtIChtYXhYQ29vcmQgKyBtaW5YQ29vcmQpIC8gMjtcbiAgICAgIHZhciBkaWZmT25ZID0gb3JpZ2luYWxDZW50ZXIueSAtIChtYXhZQ29vcmQgKyBtaW5ZQ29vcmQpIC8gMjtcbiAgICAgIC8vIG1vdmUgY29tcG9uZW50IHRvIG9yaWdpbmFsIGNlbnRlclxuICAgICAgY29tcG9uZW50UmVzdWx0LnhDb29yZHMgPSBjb21wb25lbnRSZXN1bHQueENvb3Jkcy5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHggKyBkaWZmT25YO1xuICAgICAgfSk7XG4gICAgICBjb21wb25lbnRSZXN1bHQueUNvb3JkcyA9IGNvbXBvbmVudFJlc3VsdC55Q29vcmRzLm1hcChmdW5jdGlvbiAoeSkge1xuICAgICAgICByZXR1cm4geSArIGRpZmZPblk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY2FsY3VsYXRlIGN1cnJlbnQgYm91bmRpbmcgYm94XG4gICAgICBPYmplY3Qua2V5cyhjb21wb25lbnRSZXN1bHQpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgdmFyIG5vZGUgPSBjb21wb25lbnRSZXN1bHRbaXRlbV07XG4gICAgICAgIHZhciBsZWZ0WCA9IG5vZGUuZ2V0UmVjdCgpLng7XG4gICAgICAgIHZhciByaWdodFggPSBub2RlLmdldFJlY3QoKS54ICsgbm9kZS5nZXRSZWN0KCkud2lkdGg7XG4gICAgICAgIHZhciB0b3BZID0gbm9kZS5nZXRSZWN0KCkueTtcbiAgICAgICAgdmFyIGJvdHRvbVkgPSBub2RlLmdldFJlY3QoKS55ICsgbm9kZS5nZXRSZWN0KCkuaGVpZ2h0O1xuXG4gICAgICAgIGlmIChsZWZ0WCA8IG1pblhDb29yZCkgbWluWENvb3JkID0gbGVmdFg7XG4gICAgICAgIGlmIChyaWdodFggPiBtYXhYQ29vcmQpIG1heFhDb29yZCA9IHJpZ2h0WDtcbiAgICAgICAgaWYgKHRvcFkgPCBtaW5ZQ29vcmQpIG1pbllDb29yZCA9IHRvcFk7XG4gICAgICAgIGlmIChib3R0b21ZID4gbWF4WUNvb3JkKSBtYXhZQ29vcmQgPSBib3R0b21ZO1xuICAgICAgfSk7XG4gICAgICAvLyBmaW5kIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyZW50IGFuZCBvcmlnaW5hbCBjZW50ZXJcbiAgICAgIHZhciBfZGlmZk9uWCA9IG9yaWdpbmFsQ2VudGVyLnggLSAobWF4WENvb3JkICsgbWluWENvb3JkKSAvIDI7XG4gICAgICB2YXIgX2RpZmZPblkgPSBvcmlnaW5hbENlbnRlci55IC0gKG1heFlDb29yZCArIG1pbllDb29yZCkgLyAyO1xuICAgICAgLy8gbW92ZSBjb21wb25lbnQgdG8gb3JpZ2luYWwgY2VudGVyXG4gICAgICBPYmplY3Qua2V5cyhjb21wb25lbnRSZXN1bHQpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgdmFyIG5vZGUgPSBjb21wb25lbnRSZXN1bHRbaXRlbV07XG4gICAgICAgIG5vZGUuc2V0Q2VudGVyKG5vZGUuZ2V0Q2VudGVyWCgpICsgX2RpZmZPblgsIG5vZGUuZ2V0Q2VudGVyWSgpICsgX2RpZmZPblkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59O1xuXG5hdXhpbGlhcnkuY2FsY0JvdW5kaW5nQm94ID0gZnVuY3Rpb24gKHBhcmVudE5vZGUsIHhDb29yZHMsIHlDb29yZHMsIG5vZGVJbmRleGVzKSB7XG4gIC8vIGNhbGN1bGF0ZSBib3VuZHNcbiAgdmFyIGxlZnQgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgdmFyIHJpZ2h0ID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gIHZhciB0b3AgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgdmFyIGJvdHRvbSA9IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSO1xuICB2YXIgbm9kZUxlZnQgPSB2b2lkIDA7XG4gIHZhciBub2RlUmlnaHQgPSB2b2lkIDA7XG4gIHZhciBub2RlVG9wID0gdm9pZCAwO1xuICB2YXIgbm9kZUJvdHRvbSA9IHZvaWQgMDtcblxuICB2YXIgbm9kZXMgPSBwYXJlbnROb2RlLmRlc2NlbmRhbnRzKCkubm90KFwiOnBhcmVudFwiKTtcbiAgdmFyIHMgPSBub2Rlcy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcblxuICAgIG5vZGVMZWZ0ID0geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZS5pZCgpKV0gLSBub2RlLndpZHRoKCkgLyAyO1xuICAgIG5vZGVSaWdodCA9IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGUuaWQoKSldICsgbm9kZS53aWR0aCgpIC8gMjtcbiAgICBub2RlVG9wID0geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZS5pZCgpKV0gLSBub2RlLmhlaWdodCgpIC8gMjtcbiAgICBub2RlQm90dG9tID0geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZS5pZCgpKV0gKyBub2RlLmhlaWdodCgpIC8gMjtcblxuICAgIGlmIChsZWZ0ID4gbm9kZUxlZnQpIHtcbiAgICAgIGxlZnQgPSBub2RlTGVmdDtcbiAgICB9XG5cbiAgICBpZiAocmlnaHQgPCBub2RlUmlnaHQpIHtcbiAgICAgIHJpZ2h0ID0gbm9kZVJpZ2h0O1xuICAgIH1cblxuICAgIGlmICh0b3AgPiBub2RlVG9wKSB7XG4gICAgICB0b3AgPSBub2RlVG9wO1xuICAgIH1cblxuICAgIGlmIChib3R0b20gPCBub2RlQm90dG9tKSB7XG4gICAgICBib3R0b20gPSBub2RlQm90dG9tO1xuICAgIH1cbiAgfVxuXG4gIHZhciBib3VuZGluZ0JveCA9IHt9O1xuICBib3VuZGluZ0JveC50b3BMZWZ0WCA9IGxlZnQ7XG4gIGJvdW5kaW5nQm94LnRvcExlZnRZID0gdG9wO1xuICBib3VuZGluZ0JveC53aWR0aCA9IHJpZ2h0IC0gbGVmdDtcbiAgYm91bmRpbmdCb3guaGVpZ2h0ID0gYm90dG9tIC0gdG9wO1xuICByZXR1cm4gYm91bmRpbmdCb3g7XG59O1xuXG4vLyBUaGlzIGZ1bmN0aW9uIGZpbmRzIGFuZCByZXR1cm5zIHBhcmVudCBub2RlcyB3aG9zZSBhbGwgY2hpbGRyZW4gYXJlIGhpZGRlblxuYXV4aWxpYXJ5LmNhbGNQYXJlbnRzV2l0aG91dENoaWxkcmVuID0gZnVuY3Rpb24gKGN5LCBlbGVzKSB7XG4gIHZhciBwYXJlbnRzV2l0aG91dENoaWxkcmVuID0gY3kuY29sbGVjdGlvbigpO1xuICBlbGVzLm5vZGVzKCc6cGFyZW50JykuZm9yRWFjaChmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgdmFyIGNoZWNrID0gZmFsc2U7XG4gICAgcGFyZW50LmNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIGlmIChjaGlsZC5jc3MoJ2Rpc3BsYXknKSAhPSAnbm9uZScpIHtcbiAgICAgICAgY2hlY2sgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghY2hlY2spIHtcbiAgICAgIHBhcmVudHNXaXRob3V0Q2hpbGRyZW4ubWVyZ2UocGFyZW50KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJlbnRzV2l0aG91dENoaWxkcmVuO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBhdXhpbGlhcnk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4MTY6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG4vKipcbiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwb3N0cHJvY2Vzc2luZyBwYXJ0IHRoYXQgYXBwbGllcyBDb1NFIGxheW91dCBvdmVyIHRoZSBzcGVjdHJhbCBsYXlvdXRcbiovXG5cbnZhciBhdXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0OCk7XG52YXIgQ29TRUxheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5Db1NFTGF5b3V0O1xudmFyIENvU0VOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLkNvU0VOb2RlO1xudmFyIFBvaW50RCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5sYXlvdXRCYXNlLlBvaW50RDtcbnZhciBEaW1lbnNpb25EID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLmxheW91dEJhc2UuRGltZW5zaW9uRDtcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0MCkubGF5b3V0QmFzZS5MYXlvdXRDb25zdGFudHM7XG52YXIgRkRMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0MCkubGF5b3V0QmFzZS5GRExheW91dENvbnN0YW50cztcbnZhciBDb1NFQ29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLkNvU0VDb25zdGFudHM7XG5cbi8vIG1haW4gZnVuY3Rpb24gdGhhdCBjb3NlIGxheW91dCBpcyBwcm9jZXNzZWRcbnZhciBjb3NlTGF5b3V0ID0gZnVuY3Rpb24gY29zZUxheW91dChvcHRpb25zLCBzcGVjdHJhbFJlc3VsdCkge1xuXG4gIHZhciBjeSA9IG9wdGlvbnMuY3k7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCk7XG4gIHZhciBlZGdlcyA9IGVsZXMuZWRnZXMoKTtcblxuICB2YXIgbm9kZUluZGV4ZXMgPSB2b2lkIDA7XG4gIHZhciB4Q29vcmRzID0gdm9pZCAwO1xuICB2YXIgeUNvb3JkcyA9IHZvaWQgMDtcbiAgdmFyIGlkVG9MTm9kZSA9IHt9O1xuXG4gIGlmIChvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgIG5vZGVJbmRleGVzID0gc3BlY3RyYWxSZXN1bHRbXCJub2RlSW5kZXhlc1wiXTtcbiAgICB4Q29vcmRzID0gc3BlY3RyYWxSZXN1bHRbXCJ4Q29vcmRzXCJdO1xuICAgIHlDb29yZHMgPSBzcGVjdHJhbFJlc3VsdFtcInlDb29yZHNcIl07XG4gIH1cblxuICB2YXIgaXNGbiA9IGZ1bmN0aW9uIGlzRm4oZm4pIHtcbiAgICByZXR1cm4gdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nO1xuICB9O1xuXG4gIHZhciBvcHRGbiA9IGZ1bmN0aW9uIG9wdEZuKG9wdCwgZWxlKSB7XG4gICAgaWYgKGlzRm4ob3B0KSkge1xuICAgICAgcmV0dXJuIG9wdChlbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3B0O1xuICAgIH1cbiAgfTtcblxuICAvKioqKiBQb3N0cHJvY2Vzc2luZyBmdW5jdGlvbnMgKioqKi9cblxuICB2YXIgcGFyZW50c1dpdGhvdXRDaGlsZHJlbiA9IGF1eC5jYWxjUGFyZW50c1dpdGhvdXRDaGlsZHJlbihjeSwgZWxlcyk7XG5cbiAgLy8gdHJhbnNmZXIgY3l0b3NjYXBlIG5vZGVzIHRvIGNvc2Ugbm9kZXNcbiAgdmFyIHByb2Nlc3NDaGlsZHJlbkxpc3QgPSBmdW5jdGlvbiBwcm9jZXNzQ2hpbGRyZW5MaXN0KHBhcmVudCwgY2hpbGRyZW4sIGxheW91dCwgb3B0aW9ucykge1xuICAgIHZhciBzaXplID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICB2YXIgdGhlQ2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIHZhciBjaGlsZHJlbl9vZl9jaGlsZHJlbiA9IG51bGw7XG4gICAgICBpZiAodGhlQ2hpbGQuaW50ZXJzZWN0aW9uKHBhcmVudHNXaXRob3V0Q2hpbGRyZW4pLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIGNoaWxkcmVuX29mX2NoaWxkcmVuID0gdGhlQ2hpbGQuY2hpbGRyZW4oKTtcbiAgICAgIH1cbiAgICAgIHZhciB0aGVOb2RlID0gdm9pZCAwO1xuXG4gICAgICB2YXIgZGltZW5zaW9ucyA9IHRoZUNoaWxkLmxheW91dERpbWVuc2lvbnMoe1xuICAgICAgICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IG9wdGlvbnMubm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzXG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoZUNoaWxkLm91dGVyV2lkdGgoKSAhPSBudWxsICYmIHRoZUNoaWxkLm91dGVySGVpZ2h0KCkgIT0gbnVsbCkge1xuICAgICAgICBpZiAob3B0aW9ucy5yYW5kb21pemUpIHtcbiAgICAgICAgICBpZiAoIXRoZUNoaWxkLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgIHRoZU5vZGUgPSBwYXJlbnQuYWRkKG5ldyBDb1NFTm9kZShsYXlvdXQuZ3JhcGhNYW5hZ2VyLCBuZXcgUG9pbnREKHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KHRoZUNoaWxkLmlkKCkpXSAtIGRpbWVuc2lvbnMudyAvIDIsIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KHRoZUNoaWxkLmlkKCkpXSAtIGRpbWVuc2lvbnMuaCAvIDIpLCBuZXcgRGltZW5zaW9uRChwYXJzZUZsb2F0KGRpbWVuc2lvbnMudyksIHBhcnNlRmxvYXQoZGltZW5zaW9ucy5oKSkpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHBhcmVudEluZm8gPSBhdXguY2FsY0JvdW5kaW5nQm94KHRoZUNoaWxkLCB4Q29vcmRzLCB5Q29vcmRzLCBub2RlSW5kZXhlcyk7XG4gICAgICAgICAgICBpZiAodGhlQ2hpbGQuaW50ZXJzZWN0aW9uKHBhcmVudHNXaXRob3V0Q2hpbGRyZW4pLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgIHRoZU5vZGUgPSBwYXJlbnQuYWRkKG5ldyBDb1NFTm9kZShsYXlvdXQuZ3JhcGhNYW5hZ2VyLCBuZXcgUG9pbnREKHBhcmVudEluZm8udG9wTGVmdFgsIHBhcmVudEluZm8udG9wTGVmdFkpLCBuZXcgRGltZW5zaW9uRChwYXJlbnRJbmZvLndpZHRoLCBwYXJlbnRJbmZvLmhlaWdodCkpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGZvciB0aGUgcGFyZW50c1dpdGhvdXRDaGlsZHJlblxuICAgICAgICAgICAgICB0aGVOb2RlID0gcGFyZW50LmFkZChuZXcgQ29TRU5vZGUobGF5b3V0LmdyYXBoTWFuYWdlciwgbmV3IFBvaW50RChwYXJlbnRJbmZvLnRvcExlZnRYLCBwYXJlbnRJbmZvLnRvcExlZnRZKSwgbmV3IERpbWVuc2lvbkQocGFyc2VGbG9hdChkaW1lbnNpb25zLncpLCBwYXJzZUZsb2F0KGRpbWVuc2lvbnMuaCkpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoZU5vZGUgPSBwYXJlbnQuYWRkKG5ldyBDb1NFTm9kZShsYXlvdXQuZ3JhcGhNYW5hZ2VyLCBuZXcgUG9pbnREKHRoZUNoaWxkLnBvc2l0aW9uKCd4JykgLSBkaW1lbnNpb25zLncgLyAyLCB0aGVDaGlsZC5wb3NpdGlvbigneScpIC0gZGltZW5zaW9ucy5oIC8gMiksIG5ldyBEaW1lbnNpb25EKHBhcnNlRmxvYXQoZGltZW5zaW9ucy53KSwgcGFyc2VGbG9hdChkaW1lbnNpb25zLmgpKSkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGVOb2RlID0gcGFyZW50LmFkZChuZXcgQ29TRU5vZGUodGhpcy5ncmFwaE1hbmFnZXIpKTtcbiAgICAgIH1cbiAgICAgIC8vIEF0dGFjaCBpZCB0byB0aGUgbGF5b3V0IG5vZGUgYW5kIHJlcHVsc2lvbiB2YWx1ZVxuICAgICAgdGhlTm9kZS5pZCA9IHRoZUNoaWxkLmRhdGEoXCJpZFwiKTtcbiAgICAgIHRoZU5vZGUubm9kZVJlcHVsc2lvbiA9IG9wdEZuKG9wdGlvbnMubm9kZVJlcHVsc2lvbiwgdGhlQ2hpbGQpO1xuICAgICAgLy8gQXR0YWNoIHRoZSBwYWRkaW5ncyBvZiBjeSBub2RlIHRvIGxheW91dCBub2RlXG4gICAgICB0aGVOb2RlLnBhZGRpbmdMZWZ0ID0gcGFyc2VJbnQodGhlQ2hpbGQuY3NzKCdwYWRkaW5nJykpO1xuICAgICAgdGhlTm9kZS5wYWRkaW5nVG9wID0gcGFyc2VJbnQodGhlQ2hpbGQuY3NzKCdwYWRkaW5nJykpO1xuICAgICAgdGhlTm9kZS5wYWRkaW5nUmlnaHQgPSBwYXJzZUludCh0aGVDaGlsZC5jc3MoJ3BhZGRpbmcnKSk7XG4gICAgICB0aGVOb2RlLnBhZGRpbmdCb3R0b20gPSBwYXJzZUludCh0aGVDaGlsZC5jc3MoJ3BhZGRpbmcnKSk7XG5cbiAgICAgIC8vQXR0YWNoIHRoZSBsYWJlbCBwcm9wZXJ0aWVzIHRvIGJvdGggY29tcG91bmQgYW5kIHNpbXBsZSBub2RlcyBpZiBsYWJlbHMgd2lsbCBiZSBpbmNsdWRlZCBpbiBub2RlIGRpbWVuc2lvbnNcbiAgICAgIC8vVGhlc2UgcHJvcGVydGllcyB3aWxsIGJlIHVzZWQgd2hpbGUgdXBkYXRpbmcgYm91bmRzIG9mIGNvbXBvdW5kcyBkdXJpbmcgaXRlcmF0aW9ucyBvciB0aWxpbmdcbiAgICAgIC8vYW5kIHdpbGwgYmUgdXNlZCBmb3Igc2ltcGxlIG5vZGVzIHdoaWxlIHRyYW5zZmVycmluZyBmaW5hbCBwb3NpdGlvbnMgdG8gY3l0b3NjYXBlXG4gICAgICBpZiAob3B0aW9ucy5ub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHMpIHtcbiAgICAgICAgdGhlTm9kZS5sYWJlbFdpZHRoID0gdGhlQ2hpbGQuYm91bmRpbmdCb3goeyBpbmNsdWRlTGFiZWxzOiB0cnVlLCBpbmNsdWRlTm9kZXM6IGZhbHNlLCBpbmNsdWRlT3ZlcmxheXM6IGZhbHNlIH0pLnc7XG4gICAgICAgIHRoZU5vZGUubGFiZWxIZWlnaHQgPSB0aGVDaGlsZC5ib3VuZGluZ0JveCh7IGluY2x1ZGVMYWJlbHM6IHRydWUsIGluY2x1ZGVOb2RlczogZmFsc2UsIGluY2x1ZGVPdmVybGF5czogZmFsc2UgfSkuaDtcbiAgICAgICAgdGhlTm9kZS5sYWJlbFBvc1ZlcnRpY2FsID0gdGhlQ2hpbGQuY3NzKFwidGV4dC12YWxpZ25cIik7XG4gICAgICAgIHRoZU5vZGUubGFiZWxQb3NIb3Jpem9udGFsID0gdGhlQ2hpbGQuY3NzKFwidGV4dC1oYWxpZ25cIik7XG4gICAgICB9XG5cbiAgICAgIC8vIE1hcCB0aGUgbGF5b3V0IG5vZGVcbiAgICAgIGlkVG9MTm9kZVt0aGVDaGlsZC5kYXRhKFwiaWRcIildID0gdGhlTm9kZTtcblxuICAgICAgaWYgKGlzTmFOKHRoZU5vZGUucmVjdC54KSkge1xuICAgICAgICB0aGVOb2RlLnJlY3QueCA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc05hTih0aGVOb2RlLnJlY3QueSkpIHtcbiAgICAgICAgdGhlTm9kZS5yZWN0LnkgPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hpbGRyZW5fb2ZfY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbl9vZl9jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciB0aGVOZXdHcmFwaCA9IHZvaWQgMDtcbiAgICAgICAgdGhlTmV3R3JhcGggPSBsYXlvdXQuZ2V0R3JhcGhNYW5hZ2VyKCkuYWRkKGxheW91dC5uZXdHcmFwaCgpLCB0aGVOb2RlKTtcbiAgICAgICAgcHJvY2Vzc0NoaWxkcmVuTGlzdCh0aGVOZXdHcmFwaCwgY2hpbGRyZW5fb2ZfY2hpbGRyZW4sIGxheW91dCwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIHRyYW5zZmVyIGN5dG9zY2FwZSBlZGdlcyB0byBjb3NlIGVkZ2VzXG4gIHZhciBwcm9jZXNzRWRnZXMgPSBmdW5jdGlvbiBwcm9jZXNzRWRnZXMobGF5b3V0LCBnbSwgZWRnZXMpIHtcbiAgICB2YXIgaWRlYWxMZW5ndGhUb3RhbCA9IDA7XG4gICAgdmFyIGVkZ2VDb3VudCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tpXTtcbiAgICAgIHZhciBzb3VyY2VOb2RlID0gaWRUb0xOb2RlW2VkZ2UuZGF0YShcInNvdXJjZVwiKV07XG4gICAgICB2YXIgdGFyZ2V0Tm9kZSA9IGlkVG9MTm9kZVtlZGdlLmRhdGEoXCJ0YXJnZXRcIildO1xuICAgICAgaWYgKHNvdXJjZU5vZGUgJiYgdGFyZ2V0Tm9kZSAmJiBzb3VyY2VOb2RlICE9PSB0YXJnZXROb2RlICYmIHNvdXJjZU5vZGUuZ2V0RWRnZXNCZXR3ZWVuKHRhcmdldE5vZGUpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHZhciBlMSA9IGdtLmFkZChsYXlvdXQubmV3RWRnZSgpLCBzb3VyY2VOb2RlLCB0YXJnZXROb2RlKTtcbiAgICAgICAgZTEuaWQgPSBlZGdlLmlkKCk7XG4gICAgICAgIGUxLmlkZWFsTGVuZ3RoID0gb3B0Rm4ob3B0aW9ucy5pZGVhbEVkZ2VMZW5ndGgsIGVkZ2UpO1xuICAgICAgICBlMS5lZGdlRWxhc3RpY2l0eSA9IG9wdEZuKG9wdGlvbnMuZWRnZUVsYXN0aWNpdHksIGVkZ2UpO1xuICAgICAgICBpZGVhbExlbmd0aFRvdGFsICs9IGUxLmlkZWFsTGVuZ3RoO1xuICAgICAgICBlZGdlQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gd2UgbmVlZCB0byB1cGRhdGUgdGhlIGlkZWFsIGVkZ2UgbGVuZ3RoIGNvbnN0YW50IHdpdGggdGhlIGF2Zy4gaWRlYWwgbGVuZ3RoIHZhbHVlIGFmdGVyIHByb2Nlc3NpbmcgZWRnZXNcbiAgICAvLyBpbiBjYXNlIHRoZXJlIGlzIG5vIGVkZ2UsIHVzZSBvdGhlciBvcHRpb25zXG4gICAgaWYgKG9wdGlvbnMuaWRlYWxFZGdlTGVuZ3RoICE9IG51bGwpIHtcbiAgICAgIGlmIChlZGdlQ291bnQgPiAwKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIID0gaWRlYWxMZW5ndGhUb3RhbCAvIGVkZ2VDb3VudDtlbHNlIGlmICghaXNGbihvcHRpb25zLmlkZWFsRWRnZUxlbmd0aCkpIC8vIGluIGNhc2UgdGhlcmUgaXMgbm8gZWRnZSwgYnV0IG9wdGlvbiBnaXZlcyBhIHZhbHVlIHRvIHVzZVxuICAgICAgICBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIID0gb3B0aW9ucy5pZGVhbEVkZ2VMZW5ndGg7ZWxzZSAvLyBpbiBjYXNlIHRoZXJlIGlzIG5vIGVkZ2UgYW5kIHdlIGNhbm5vdCBnZXQgYSB2YWx1ZSBmcm9tIG9wdGlvbiAoYmVjYXVzZSBpdCdzIGEgZnVuY3Rpb24pXG4gICAgICAgIENvU0VDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSA1MDtcbiAgICAgIC8vIHdlIG5lZWQgdG8gdXBkYXRlIHRoZXNlIGNvbnN0YW50IHZhbHVlcyBiYXNlZCBvbiB0aGUgaWRlYWwgZWRnZSBsZW5ndGggY29uc3RhbnRcbiAgICAgIENvU0VDb25zdGFudHMuTUlOX1JFUFVMU0lPTl9ESVNUID0gRkRMYXlvdXRDb25zdGFudHMuTUlOX1JFUFVMU0lPTl9ESVNUID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCAvIDEwLjA7XG4gICAgICBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfUkFESUFMX1NFUEFSQVRJT04gPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIO1xuICAgIH1cbiAgfTtcblxuICAvLyB0cmFuc2ZlciBjeXRvc2NhcGUgY29uc3RyYWludHMgdG8gY29zZSBsYXlvdXRcbiAgdmFyIHByb2Nlc3NDb25zdHJhaW50cyA9IGZ1bmN0aW9uIHByb2Nlc3NDb25zdHJhaW50cyhsYXlvdXQsIG9wdGlvbnMpIHtcbiAgICAvLyBnZXQgbm9kZXMgdG8gYmUgZml4ZWRcbiAgICBpZiAob3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50KSB7XG4gICAgICBsYXlvdXQuY29uc3RyYWludHNbXCJmaXhlZE5vZGVDb25zdHJhaW50XCJdID0gb3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50O1xuICAgIH1cbiAgICAvLyBnZXQgbm9kZXMgdG8gYmUgYWxpZ25lZFxuICAgIGlmIChvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQpIHtcbiAgICAgIGxheW91dC5jb25zdHJhaW50c1tcImFsaWdubWVudENvbnN0cmFpbnRcIl0gPSBvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQ7XG4gICAgfVxuICAgIC8vIGdldCBub2RlcyB0byBiZSByZWxhdGl2ZWx5IHBsYWNlZFxuICAgIGlmIChvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCkge1xuICAgICAgbGF5b3V0LmNvbnN0cmFpbnRzW1wicmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50XCJdID0gb3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQ7XG4gICAgfVxuICB9O1xuXG4gIC8qKioqIEFwcGx5IHBvc3Rwcm9jZXNzaW5nICoqKiovXG4gIGlmIChvcHRpb25zLm5lc3RpbmdGYWN0b3IgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5QRVJfTEVWRUxfSURFQUxfRURHRV9MRU5HVEhfRkFDVE9SID0gRkRMYXlvdXRDb25zdGFudHMuUEVSX0xFVkVMX0lERUFMX0VER0VfTEVOR1RIX0ZBQ1RPUiA9IG9wdGlvbnMubmVzdGluZ0ZhY3RvcjtcbiAgaWYgKG9wdGlvbnMuZ3Jhdml0eSAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9TVFJFTkdUSCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9TVFJFTkdUSCA9IG9wdGlvbnMuZ3Jhdml0eTtcbiAgaWYgKG9wdGlvbnMubnVtSXRlciAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLk1BWF9JVEVSQVRJT05TID0gRkRMYXlvdXRDb25zdGFudHMuTUFYX0lURVJBVElPTlMgPSBvcHRpb25zLm51bUl0ZXI7XG4gIGlmIChvcHRpb25zLmdyYXZpdHlSYW5nZSAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9SQU5HRV9GQUNUT1IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0dSQVZJVFlfUkFOR0VfRkFDVE9SID0gb3B0aW9ucy5ncmF2aXR5UmFuZ2U7XG4gIGlmIChvcHRpb25zLmdyYXZpdHlDb21wb3VuZCAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9TVFJFTkdUSCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9TVFJFTkdUSCA9IG9wdGlvbnMuZ3Jhdml0eUNvbXBvdW5kO1xuICBpZiAob3B0aW9ucy5ncmF2aXR5UmFuZ2VDb21wb3VuZCAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9SQU5HRV9GQUNUT1IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfUkFOR0VfRkFDVE9SID0gb3B0aW9ucy5ncmF2aXR5UmFuZ2VDb21wb3VuZDtcbiAgaWYgKG9wdGlvbnMuaW5pdGlhbEVuZXJneU9uSW5jcmVtZW50YWwgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCA9IG9wdGlvbnMuaW5pdGlhbEVuZXJneU9uSW5jcmVtZW50YWw7XG5cbiAgaWYgKG9wdGlvbnMudGlsaW5nQ29tcGFyZUJ5ICE9IG51bGwpIENvU0VDb25zdGFudHMuVElMSU5HX0NPTVBBUkVfQlkgPSBvcHRpb25zLnRpbGluZ0NvbXBhcmVCeTtcblxuICBpZiAob3B0aW9ucy5xdWFsaXR5ID09ICdwcm9vZicpIExheW91dENvbnN0YW50cy5RVUFMSVRZID0gMjtlbHNlIExheW91dENvbnN0YW50cy5RVUFMSVRZID0gMDtcblxuICBDb1NFQ29uc3RhbnRzLk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUyA9IEZETGF5b3V0Q29uc3RhbnRzLk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUyA9IExheW91dENvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMgPSBvcHRpb25zLm5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVscztcbiAgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9JTkNSRU1FTlRBTCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMID0gIW9wdGlvbnMucmFuZG9taXplO1xuICBDb1NFQ29uc3RhbnRzLkFOSU1BVEUgPSBGRExheW91dENvbnN0YW50cy5BTklNQVRFID0gTGF5b3V0Q29uc3RhbnRzLkFOSU1BVEUgPSBvcHRpb25zLmFuaW1hdGU7XG4gIENvU0VDb25zdGFudHMuVElMRSA9IG9wdGlvbnMudGlsZTtcbiAgQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19WRVJUSUNBTCA9IHR5cGVvZiBvcHRpb25zLnRpbGluZ1BhZGRpbmdWZXJ0aWNhbCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGlsaW5nUGFkZGluZ1ZlcnRpY2FsLmNhbGwoKSA6IG9wdGlvbnMudGlsaW5nUGFkZGluZ1ZlcnRpY2FsO1xuICBDb1NFQ29uc3RhbnRzLlRJTElOR19QQURESU5HX0hPUklaT05UQUwgPSB0eXBlb2Ygb3B0aW9ucy50aWxpbmdQYWRkaW5nSG9yaXpvbnRhbCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGlsaW5nUGFkZGluZ0hvcml6b250YWwuY2FsbCgpIDogb3B0aW9ucy50aWxpbmdQYWRkaW5nSG9yaXpvbnRhbDtcblxuICBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUwgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUwgPSB0cnVlO1xuICBDb1NFQ29uc3RhbnRzLlBVUkVfSU5DUkVNRU5UQUwgPSAhb3B0aW9ucy5yYW5kb21pemU7XG4gIExheW91dENvbnN0YW50cy5ERUZBVUxUX1VOSUZPUk1fTEVBRl9OT0RFX1NJWkVTID0gb3B0aW9ucy51bmlmb3JtTm9kZURpbWVuc2lvbnM7XG5cbiAgLy8gVGhpcyBwYXJ0IGlzIGZvciBkZWJ1Zy9kZW1vIHB1cnBvc2VcbiAgaWYgKG9wdGlvbnMuc3RlcCA9PSBcInRyYW5zZm9ybWVkXCIpIHtcbiAgICBDb1NFQ29uc3RhbnRzLlRSQU5TRk9STV9PTl9DT05TVFJBSU5UX0hBTkRMSU5HID0gdHJ1ZTtcbiAgICBDb1NFQ29uc3RhbnRzLkVORk9SQ0VfQ09OU1RSQUlOVFMgPSBmYWxzZTtcbiAgICBDb1NFQ29uc3RhbnRzLkFQUExZX0xBWU9VVCA9IGZhbHNlO1xuICB9XG4gIGlmIChvcHRpb25zLnN0ZXAgPT0gXCJlbmZvcmNlZFwiKSB7XG4gICAgQ29TRUNvbnN0YW50cy5UUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyA9IGZhbHNlO1xuICAgIENvU0VDb25zdGFudHMuRU5GT1JDRV9DT05TVFJBSU5UUyA9IHRydWU7XG4gICAgQ29TRUNvbnN0YW50cy5BUFBMWV9MQVlPVVQgPSBmYWxzZTtcbiAgfVxuICBpZiAob3B0aW9ucy5zdGVwID09IFwiY29zZVwiKSB7XG4gICAgQ29TRUNvbnN0YW50cy5UUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyA9IGZhbHNlO1xuICAgIENvU0VDb25zdGFudHMuRU5GT1JDRV9DT05TVFJBSU5UUyA9IGZhbHNlO1xuICAgIENvU0VDb25zdGFudHMuQVBQTFlfTEFZT1VUID0gdHJ1ZTtcbiAgfVxuICBpZiAob3B0aW9ucy5zdGVwID09IFwiYWxsXCIpIHtcbiAgICBpZiAob3B0aW9ucy5yYW5kb21pemUpIENvU0VDb25zdGFudHMuVFJBTlNGT1JNX09OX0NPTlNUUkFJTlRfSEFORExJTkcgPSB0cnVlO2Vsc2UgQ29TRUNvbnN0YW50cy5UUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyA9IGZhbHNlO1xuICAgIENvU0VDb25zdGFudHMuRU5GT1JDRV9DT05TVFJBSU5UUyA9IHRydWU7XG4gICAgQ29TRUNvbnN0YW50cy5BUFBMWV9MQVlPVVQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuZml4ZWROb2RlQ29uc3RyYWludCB8fCBvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQgfHwgb3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcbiAgICBDb1NFQ29uc3RhbnRzLlRSRUVfUkVEVUNUSU9OX09OX0lOQ1JFTUVOVEFMID0gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgQ29TRUNvbnN0YW50cy5UUkVFX1JFRFVDVElPTl9PTl9JTkNSRU1FTlRBTCA9IHRydWU7XG4gIH1cblxuICB2YXIgY29zZUxheW91dCA9IG5ldyBDb1NFTGF5b3V0KCk7XG4gIHZhciBnbSA9IGNvc2VMYXlvdXQubmV3R3JhcGhNYW5hZ2VyKCk7XG5cbiAgcHJvY2Vzc0NoaWxkcmVuTGlzdChnbS5hZGRSb290KCksIGF1eC5nZXRUb3BNb3N0Tm9kZXMobm9kZXMpLCBjb3NlTGF5b3V0LCBvcHRpb25zKTtcbiAgcHJvY2Vzc0VkZ2VzKGNvc2VMYXlvdXQsIGdtLCBlZGdlcyk7XG4gIHByb2Nlc3NDb25zdHJhaW50cyhjb3NlTGF5b3V0LCBvcHRpb25zKTtcblxuICBjb3NlTGF5b3V0LnJ1bkxheW91dCgpO1xuXG4gIHJldHVybiBpZFRvTE5vZGU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHsgY29zZUxheW91dDogY29zZUxheW91dCB9O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMjEyOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuLyoqXG4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZmNvc2UgbGF5b3V0IGFsZ29yaXRobVxuKi9cblxudmFyIGFzc2lnbiA9IF9fd2VicGFja19yZXF1aXJlX18oNjU4KTtcbnZhciBhdXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0OCk7XG5cbnZhciBfcmVxdWlyZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjU3KSxcbiAgICBzcGVjdHJhbExheW91dCA9IF9yZXF1aXJlLnNwZWN0cmFsTGF5b3V0O1xuXG52YXIgX3JlcXVpcmUyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MTYpLFxuICAgIGNvc2VMYXlvdXQgPSBfcmVxdWlyZTIuY29zZUxheW91dDtcblxudmFyIGRlZmF1bHRzID0gT2JqZWN0LmZyZWV6ZSh7XG5cbiAgLy8gJ2RyYWZ0JywgJ2RlZmF1bHQnIG9yICdwcm9vZicgXG4gIC8vIC0gJ2RyYWZ0JyBvbmx5IGFwcGxpZXMgc3BlY3RyYWwgbGF5b3V0IFxuICAvLyAtICdkZWZhdWx0JyBpbXByb3ZlcyB0aGUgcXVhbGl0eSB3aXRoIHN1YnNlcXVlbnQgQ29TRSBsYXlvdXQgKGZhc3QgY29vbGluZyByYXRlKVxuICAvLyAtICdwcm9vZicgaW1wcm92ZXMgdGhlIHF1YWxpdHkgd2l0aCBzdWJzZXF1ZW50IENvU0UgbGF5b3V0IChzbG93IGNvb2xpbmcgcmF0ZSkgXG4gIHF1YWxpdHk6IFwiZGVmYXVsdFwiLFxuICAvLyBVc2UgcmFuZG9tIG5vZGUgcG9zaXRpb25zIGF0IGJlZ2lubmluZyBvZiBsYXlvdXRcbiAgLy8gaWYgdGhpcyBpcyBzZXQgdG8gZmFsc2UsIHRoZW4gcXVhbGl0eSBvcHRpb24gbXVzdCBiZSBcInByb29mXCJcbiAgcmFuZG9taXplOiB0cnVlLFxuICAvLyBXaGV0aGVyIG9yIG5vdCB0byBhbmltYXRlIHRoZSBsYXlvdXRcbiAgYW5pbWF0ZTogdHJ1ZSxcbiAgLy8gRHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zLCBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiAxMDAwLFxuICAvLyBFYXNpbmcgb2YgYW5pbWF0aW9uLCBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBGaXQgdGhlIHZpZXdwb3J0IHRvIHRoZSByZXBvc2l0aW9uZWQgbm9kZXNcbiAgZml0OiB0cnVlLFxuICAvLyBQYWRkaW5nIGFyb3VuZCBsYXlvdXRcbiAgcGFkZGluZzogMzAsXG4gIC8vIFdoZXRoZXIgdG8gaW5jbHVkZSBsYWJlbHMgaW4gbm9kZSBkaW1lbnNpb25zLiBWYWxpZCBpbiBcInByb29mXCIgcXVhbGl0eVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBXaGV0aGVyIG9yIG5vdCBzaW1wbGUgbm9kZXMgKG5vbi1jb21wb3VuZCBub2RlcykgYXJlIG9mIHVuaWZvcm0gZGltZW5zaW9uc1xuICB1bmlmb3JtTm9kZURpbWVuc2lvbnM6IGZhbHNlLFxuICAvLyBXaGV0aGVyIHRvIHBhY2sgZGlzY29ubmVjdGVkIGNvbXBvbmVudHMgLSB2YWxpZCBvbmx5IGlmIHJhbmRvbWl6ZTogdHJ1ZVxuICBwYWNrQ29tcG9uZW50czogdHJ1ZSxcbiAgLy8gTGF5b3V0IHN0ZXAgLSBhbGwsIHRyYW5zZm9ybWVkLCBlbmZvcmNlZCwgY29zZSAtIGZvciBkZWJ1ZyBwdXJwb3NlIG9ubHlcbiAgc3RlcDogXCJhbGxcIixcblxuICAvKiBzcGVjdHJhbCBsYXlvdXQgb3B0aW9ucyAqL1xuXG4gIC8vIEZhbHNlIGZvciByYW5kb20sIHRydWUgZm9yIGdyZWVkeVxuICBzYW1wbGluZ1R5cGU6IHRydWUsXG4gIC8vIFNhbXBsZSBzaXplIHRvIGNvbnN0cnVjdCBkaXN0YW5jZSBtYXRyaXhcbiAgc2FtcGxlU2l6ZTogMjUsXG4gIC8vIFNlcGFyYXRpb24gYW1vdW50IGJldHdlZW4gbm9kZXNcbiAgbm9kZVNlcGFyYXRpb246IDc1LFxuICAvLyBQb3dlciBpdGVyYXRpb24gdG9sZXJhbmNlXG4gIHBpVG9sOiAwLjAwMDAwMDEsXG5cbiAgLyogQ29TRSBsYXlvdXQgb3B0aW9ucyAqL1xuXG4gIC8vIE5vZGUgcmVwdWxzaW9uIChub24gb3ZlcmxhcHBpbmcpIG11bHRpcGxpZXJcbiAgbm9kZVJlcHVsc2lvbjogZnVuY3Rpb24gbm9kZVJlcHVsc2lvbihub2RlKSB7XG4gICAgcmV0dXJuIDQ1MDA7XG4gIH0sXG4gIC8vIElkZWFsIGVkZ2UgKG5vbiBuZXN0ZWQpIGxlbmd0aFxuICBpZGVhbEVkZ2VMZW5ndGg6IGZ1bmN0aW9uIGlkZWFsRWRnZUxlbmd0aChlZGdlKSB7XG4gICAgcmV0dXJuIDUwO1xuICB9LFxuICAvLyBEaXZpc29yIHRvIGNvbXB1dGUgZWRnZSBmb3JjZXNcbiAgZWRnZUVsYXN0aWNpdHk6IGZ1bmN0aW9uIGVkZ2VFbGFzdGljaXR5KGVkZ2UpIHtcbiAgICByZXR1cm4gMC40NTtcbiAgfSxcbiAgLy8gTmVzdGluZyBmYWN0b3IgKG11bHRpcGxpZXIpIHRvIGNvbXB1dGUgaWRlYWwgZWRnZSBsZW5ndGggZm9yIG5lc3RlZCBlZGdlc1xuICBuZXN0aW5nRmFjdG9yOiAwLjEsXG4gIC8vIEdyYXZpdHkgZm9yY2UgKGNvbnN0YW50KVxuICBncmF2aXR5OiAwLjI1LFxuICAvLyBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHBlcmZvcm1cbiAgbnVtSXRlcjogMjUwMCxcbiAgLy8gRm9yIGVuYWJsaW5nIHRpbGluZ1xuICB0aWxlOiB0cnVlLFxuICAvLyBUaGUgZnVuY3Rpb24gdGhhdCBzcGVjaWZpZXMgdGhlIGNyaXRlcmlhIGZvciBjb21wYXJpbmcgbm9kZXMgd2hpbGUgc29ydGluZyB0aGVtIGR1cmluZyB0aWxpbmcgb3BlcmF0aW9uLlxuICAvLyBUYWtlcyB0aGUgbm9kZSBpZCBhcyBhIHBhcmFtZXRlciBhbmQgdGhlIGRlZmF1bHQgdGlsaW5nIG9wZXJhdGlvbiBpcyBwZXJmb21lZCB3aGVuIHRoaXMgb3B0aW9uIGlzIG5vdCBzZXQuXG4gIHRpbGluZ0NvbXBhcmVCeTogdW5kZWZpbmVkLFxuICAvLyBSZXByZXNlbnRzIHRoZSBhbW91bnQgb2YgdGhlIHZlcnRpY2FsIHNwYWNlIHRvIHB1dCBiZXR3ZWVuIHRoZSB6ZXJvIGRlZ3JlZSBtZW1iZXJzIGR1cmluZyB0aGUgdGlsaW5nIG9wZXJhdGlvbihjYW4gYWxzbyBiZSBhIGZ1bmN0aW9uKVxuICB0aWxpbmdQYWRkaW5nVmVydGljYWw6IDEwLFxuICAvLyBSZXByZXNlbnRzIHRoZSBhbW91bnQgb2YgdGhlIGhvcml6b250YWwgc3BhY2UgdG8gcHV0IGJldHdlZW4gdGhlIHplcm8gZGVncmVlIG1lbWJlcnMgZHVyaW5nIHRoZSB0aWxpbmcgb3BlcmF0aW9uKGNhbiBhbHNvIGJlIGEgZnVuY3Rpb24pXG4gIHRpbGluZ1BhZGRpbmdIb3Jpem9udGFsOiAxMCxcbiAgLy8gR3Jhdml0eSByYW5nZSAoY29uc3RhbnQpIGZvciBjb21wb3VuZHNcbiAgZ3Jhdml0eVJhbmdlQ29tcG91bmQ6IDEuNSxcbiAgLy8gR3Jhdml0eSBmb3JjZSAoY29uc3RhbnQpIGZvciBjb21wb3VuZHNcbiAgZ3Jhdml0eUNvbXBvdW5kOiAxLjAsXG4gIC8vIEdyYXZpdHkgcmFuZ2UgKGNvbnN0YW50KVxuICBncmF2aXR5UmFuZ2U6IDMuOCxcbiAgLy8gSW5pdGlhbCBjb29saW5nIGZhY3RvciBmb3IgaW5jcmVtZW50YWwgbGF5b3V0ICBcbiAgaW5pdGlhbEVuZXJneU9uSW5jcmVtZW50YWw6IDAuMyxcblxuICAvKiBjb25zdHJhaW50IG9wdGlvbnMgKi9cblxuICAvLyBGaXggcmVxdWlyZWQgbm9kZXMgdG8gcHJlZGVmaW5lZCBwb3NpdGlvbnNcbiAgLy8gW3tub2RlSWQ6ICduMScsIHBvc2l0aW9uOiB7eDogMTAwLCB5OiAyMDB9LCB7Li4ufV1cbiAgZml4ZWROb2RlQ29uc3RyYWludDogdW5kZWZpbmVkLFxuICAvLyBBbGlnbiByZXF1aXJlZCBub2RlcyBpbiB2ZXJ0aWNhbC9ob3Jpem9udGFsIGRpcmVjdGlvblxuICAvLyB7dmVydGljYWw6IFtbJ24xJywgJ24yJyldLCBbJ24zJywgJ240J11dLCBob3Jpem9udGFsOiBbJ24yJywgJ240J119XG4gIGFsaWdubWVudENvbnN0cmFpbnQ6IHVuZGVmaW5lZCxcbiAgLy8gUGxhY2UgdHdvIG5vZGVzIHJlbGF0aXZlbHkgaW4gdmVydGljYWwvaG9yaXpvbnRhbCBkaXJlY3Rpb24gXG4gIC8vIFt7dG9wOiAnbjEnLCBib3R0b206ICduMicsIGdhcDogMTAwfSwge2xlZnQ6ICduMycsIHJpZ2h0OiAnbjQnLCBnYXA6IDc1fV1cbiAgcmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50OiB1bmRlZmluZWQsXG5cbiAgLyogbGF5b3V0IGV2ZW50IGNhbGxiYWNrcyAqL1xuICByZWFkeTogZnVuY3Rpb24gcmVhZHkoKSB7fSwgLy8gb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHt9IC8vIG9uIGxheW91dHN0b3Bcbn0pO1xuXG52YXIgTGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBMYXlvdXQob3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMYXlvdXQpO1xuXG4gICAgdGhpcy5vcHRpb25zID0gYXNzaWduKHt9LCBkZWZhdWx0cywgb3B0aW9ucyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTGF5b3V0LCBbe1xuICAgIGtleTogJ3J1bicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJ1bigpIHtcbiAgICAgIHZhciBsYXlvdXQgPSB0aGlzO1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICAgICAgdmFyIGVsZXMgPSBvcHRpb25zLmVsZXM7XG5cbiAgICAgIHZhciBzcGVjdHJhbFJlc3VsdCA9IFtdO1xuICAgICAgdmFyIHhDb29yZHMgPSB2b2lkIDA7XG4gICAgICB2YXIgeUNvb3JkcyA9IHZvaWQgMDtcbiAgICAgIHZhciBjb3NlUmVzdWx0ID0gW107XG4gICAgICB2YXIgY29tcG9uZW50cyA9IHZvaWQgMDtcbiAgICAgIHZhciBjb21wb25lbnRDZW50ZXJzID0gW107XG5cbiAgICAgIC8vIGJhc2ljIHZhbGlkaXR5IGNoZWNrIGZvciBjb25zdHJhaW50IGlucHV0cyBcbiAgICAgIGlmIChvcHRpb25zLmZpeGVkTm9kZUNvbnN0cmFpbnQgJiYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMuZml4ZWROb2RlQ29uc3RyYWludCkgfHwgb3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50Lmxlbmd0aCA9PSAwKSkge1xuICAgICAgICBvcHRpb25zLmZpeGVkTm9kZUNvbnN0cmFpbnQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbCAmJiAoIUFycmF5LmlzQXJyYXkob3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsKSB8fCBvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWwubGVuZ3RoID09IDApKSB7XG4gICAgICAgICAgb3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbCAmJiAoIUFycmF5LmlzQXJyYXkob3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWwpIHx8IG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsLmxlbmd0aCA9PSAwKSkge1xuICAgICAgICAgIG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCAmJiAoIUFycmF5LmlzQXJyYXkob3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHx8IG9wdGlvbnMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50Lmxlbmd0aCA9PSAwKSkge1xuICAgICAgICBvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgYW55IGNvbnN0cmFpbnQgZXhpc3RzLCBzZXQgc29tZSBvcHRpb25zXG4gICAgICB2YXIgY29uc3RyYWludEV4aXN0ID0gb3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50IHx8IG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludCB8fCBvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludDtcbiAgICAgIGlmIChjb25zdHJhaW50RXhpc3QpIHtcbiAgICAgICAgLy8gY29uc3RyYWludHMgd29yayB3aXRoIHRoZXNlIG9wdGlvbnNcbiAgICAgICAgb3B0aW9ucy50aWxlID0gZmFsc2U7XG4gICAgICAgIG9wdGlvbnMucGFja0NvbXBvbmVudHMgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gZGVjaWRlIGNvbXBvbmVudCBwYWNraW5nIGlzIGVuYWJsZWQgb3Igbm90XG4gICAgICB2YXIgbGF5VXRpbCA9IHZvaWQgMDtcbiAgICAgIHZhciBwYWNraW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgaWYgKGN5LmxheW91dFV0aWxpdGllcyAmJiBvcHRpb25zLnBhY2tDb21wb25lbnRzKSB7XG4gICAgICAgIGxheVV0aWwgPSBjeS5sYXlvdXRVdGlsaXRpZXMoXCJnZXRcIik7XG4gICAgICAgIGlmICghbGF5VXRpbCkgbGF5VXRpbCA9IGN5LmxheW91dFV0aWxpdGllcygpO1xuICAgICAgICBwYWNraW5nRW5hYmxlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVzLm5vZGVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBpZiBwYWNraW5nIGlzIG5vdCBlbmFibGVkLCBwZXJmb3JtIGxheW91dCBvbiB0aGUgd2hvbGUgZ3JhcGhcbiAgICAgICAgaWYgKCFwYWNraW5nRW5hYmxlZCkge1xuICAgICAgICAgIC8vIHN0b3JlIGNvbXBvbmVudCBjZW50ZXJcbiAgICAgICAgICB2YXIgYm91bmRpbmdCb3ggPSBvcHRpb25zLmVsZXMuYm91bmRpbmdCb3goKTtcbiAgICAgICAgICBjb21wb25lbnRDZW50ZXJzLnB1c2goeyB4OiBib3VuZGluZ0JveC54MSArIGJvdW5kaW5nQm94LncgLyAyLCB5OiBib3VuZGluZ0JveC55MSArIGJvdW5kaW5nQm94LmggLyAyIH0pO1xuICAgICAgICAgIC8vIGFwcGx5IHNwZWN0cmFsIGxheW91dFxuICAgICAgICAgIGlmIChvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHNwZWN0cmFsTGF5b3V0KG9wdGlvbnMpO1xuICAgICAgICAgICAgc3BlY3RyYWxSZXN1bHQucHVzaChyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBhcHBseSBjb3NlIGxheW91dCBhcyBwb3N0cHJvY2Vzc2luZ1xuICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkZWZhdWx0XCIgfHwgb3B0aW9ucy5xdWFsaXR5ID09IFwicHJvb2ZcIikge1xuICAgICAgICAgICAgY29zZVJlc3VsdC5wdXNoKGNvc2VMYXlvdXQob3B0aW9ucywgc3BlY3RyYWxSZXN1bHRbMF0pKTtcbiAgICAgICAgICAgIGF1eC5yZWxvY2F0ZUNvbXBvbmVudChjb21wb25lbnRDZW50ZXJzWzBdLCBjb3NlUmVzdWx0WzBdLCBvcHRpb25zKTsgLy8gcmVsb2NhdGUgY2VudGVyIHRvIG9yaWdpbmFsIHBvc2l0aW9uXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF1eC5yZWxvY2F0ZUNvbXBvbmVudChjb21wb25lbnRDZW50ZXJzWzBdLCBzcGVjdHJhbFJlc3VsdFswXSwgb3B0aW9ucyk7IC8vIHJlbG9jYXRlIGNlbnRlciB0byBvcmlnaW5hbCBwb3NpdGlvblxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBwYWNraW5nIGlzIGVuYWJsZWRcbiAgICAgICAgICB2YXIgdG9wTW9zdE5vZGVzID0gYXV4LmdldFRvcE1vc3ROb2RlcyhvcHRpb25zLmVsZXMubm9kZXMoKSk7XG4gICAgICAgICAgY29tcG9uZW50cyA9IGF1eC5jb25uZWN0Q29tcG9uZW50cyhjeSwgb3B0aW9ucy5lbGVzLCB0b3BNb3N0Tm9kZXMpO1xuICAgICAgICAgIC8vIHN0b3JlIGNvbXBvbmVudCBjZW50ZXJzXG4gICAgICAgICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgIHZhciBib3VuZGluZ0JveCA9IGNvbXBvbmVudC5ib3VuZGluZ0JveCgpO1xuICAgICAgICAgICAgY29tcG9uZW50Q2VudGVycy5wdXNoKHsgeDogYm91bmRpbmdCb3gueDEgKyBib3VuZGluZ0JveC53IC8gMiwgeTogYm91bmRpbmdCb3gueTEgKyBib3VuZGluZ0JveC5oIC8gMiB9KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vc2VuZCBlYWNoIGNvbXBvbmVudCB0byBzcGVjdHJhbCBsYXlvdXQgaWYgcmFuZG9taXplZFxuICAgICAgICAgIGlmIChvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgICAgICAgICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgb3B0aW9ucy5lbGVzID0gY29tcG9uZW50O1xuICAgICAgICAgICAgICBzcGVjdHJhbFJlc3VsdC5wdXNoKHNwZWN0cmFsTGF5b3V0KG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkZWZhdWx0XCIgfHwgb3B0aW9ucy5xdWFsaXR5ID09IFwicHJvb2ZcIikge1xuICAgICAgICAgICAgdmFyIHRvQmVUaWxlZE5vZGVzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMudGlsZSkge1xuICAgICAgICAgICAgICAvLyBiZWhhdmUgbm9kZXMgdG8gYmUgdGlsZWQgYXMgb25lIGNvbXBvbmVudFxuICAgICAgICAgICAgICB2YXIgbm9kZUluZGV4ZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICAgIHZhciBfeENvb3JkcyA9IFtdO1xuICAgICAgICAgICAgICB2YXIgX3lDb29yZHMgPSBbXTtcbiAgICAgICAgICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgICAgICAgICAgdmFyIHRlbXBTcGVjdHJhbFJlc3VsdCA9IHsgbm9kZUluZGV4ZXM6IG5vZGVJbmRleGVzLCB4Q29vcmRzOiBfeENvb3JkcywgeUNvb3JkczogX3lDb29yZHMgfTtcbiAgICAgICAgICAgICAgdmFyIGluZGV4ZXNUb0JlRGVsZXRlZCA9IFtdO1xuICAgICAgICAgICAgICBjb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmVkZ2VzKCkubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUsIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9CZVRpbGVkTm9kZXMubWVyZ2UoY29tcG9uZW50Lm5vZGVzKClbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUuaXNQYXJlbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHRlbXBTcGVjdHJhbFJlc3VsdC5ub2RlSW5kZXhlcy5zZXQoY29tcG9uZW50Lm5vZGVzKClbaV0uaWQoKSwgY291bnQrKyk7XG4gICAgICAgICAgICAgICAgICAgICAgdGVtcFNwZWN0cmFsUmVzdWx0LnhDb29yZHMucHVzaChjb21wb25lbnQubm9kZXMoKVswXS5wb3NpdGlvbigpLngpO1xuICAgICAgICAgICAgICAgICAgICAgIHRlbXBTcGVjdHJhbFJlc3VsdC55Q29vcmRzLnB1c2goY29tcG9uZW50Lm5vZGVzKClbMF0ucG9zaXRpb24oKS55KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpbmRleGVzVG9CZURlbGV0ZWQucHVzaChpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKHRvQmVUaWxlZE5vZGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2JvdW5kaW5nQm94ID0gdG9CZVRpbGVkTm9kZXMuYm91bmRpbmdCb3goKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRDZW50ZXJzLnB1c2goeyB4OiBfYm91bmRpbmdCb3gueDEgKyBfYm91bmRpbmdCb3gudyAvIDIsIHk6IF9ib3VuZGluZ0JveC55MSArIF9ib3VuZGluZ0JveC5oIC8gMiB9KTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2godG9CZVRpbGVkTm9kZXMpO1xuICAgICAgICAgICAgICAgIHNwZWN0cmFsUmVzdWx0LnB1c2godGVtcFNwZWN0cmFsUmVzdWx0KTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gaW5kZXhlc1RvQmVEZWxldGVkLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnRzLnNwbGljZShpbmRleGVzVG9CZURlbGV0ZWRbaV0sIDEpO1xuICAgICAgICAgICAgICAgICAgc3BlY3RyYWxSZXN1bHQuc3BsaWNlKGluZGV4ZXNUb0JlRGVsZXRlZFtpXSwgMSk7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnRDZW50ZXJzLnNwbGljZShpbmRleGVzVG9CZURlbGV0ZWRbaV0sIDEpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50LCBpbmRleCkge1xuICAgICAgICAgICAgICAvLyBzZW5kIGVhY2ggY29tcG9uZW50IHRvIGNvc2UgbGF5b3V0XG4gICAgICAgICAgICAgIG9wdGlvbnMuZWxlcyA9IGNvbXBvbmVudDtcbiAgICAgICAgICAgICAgY29zZVJlc3VsdC5wdXNoKGNvc2VMYXlvdXQob3B0aW9ucywgc3BlY3RyYWxSZXN1bHRbaW5kZXhdKSk7XG4gICAgICAgICAgICAgIGF1eC5yZWxvY2F0ZUNvbXBvbmVudChjb21wb25lbnRDZW50ZXJzW2luZGV4XSwgY29zZVJlc3VsdFtpbmRleF0sIG9wdGlvbnMpOyAvLyByZWxvY2F0ZSBjZW50ZXIgdG8gb3JpZ2luYWwgcG9zaXRpb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgYXV4LnJlbG9jYXRlQ29tcG9uZW50KGNvbXBvbmVudENlbnRlcnNbaW5kZXhdLCBzcGVjdHJhbFJlc3VsdFtpbmRleF0sIG9wdGlvbnMpOyAvLyByZWxvY2F0ZSBjZW50ZXIgdG8gb3JpZ2luYWwgcG9zaXRpb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHBhY2tpbmdcbiAgICAgICAgICB2YXIgY29tcG9uZW50c0V2YWx1YXRlZCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICBpZiAoY29tcG9uZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2YXIgc3ViZ3JhcGhzID0gW107XG4gICAgICAgICAgICB2YXIgaGlkZGVuRWxlcyA9IGVsZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsZS5jc3MoJ2Rpc3BsYXknKSA9PSAnbm9uZSc7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50LCBpbmRleCkge1xuICAgICAgICAgICAgICB2YXIgbm9kZUluZGV4ZXMgPSB2b2lkIDA7XG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiKSB7XG4gICAgICAgICAgICAgICAgbm9kZUluZGV4ZXMgPSBzcGVjdHJhbFJlc3VsdFtpbmRleF0ubm9kZUluZGV4ZXM7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm5vZGVzKCkubm90KGhpZGRlbkVsZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgc3ViZ3JhcGggPSB7fTtcbiAgICAgICAgICAgICAgICBzdWJncmFwaC5lZGdlcyA9IFtdO1xuICAgICAgICAgICAgICAgIHN1YmdyYXBoLm5vZGVzID0gW107XG4gICAgICAgICAgICAgICAgdmFyIG5vZGVJbmRleCA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQubm9kZXMoKS5ub3QoaGlkZGVuRWxlcykuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucXVhbGl0eSA9PSBcImRyYWZ0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBub2RlSW5kZXggPSBub2RlSW5kZXhlcy5nZXQobm9kZS5pZCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICBzdWJncmFwaC5ub2Rlcy5wdXNoKHsgeDogc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnhDb29yZHNbbm9kZUluZGV4XSAtIG5vZGUuYm91bmRpbmdib3goKS53IC8gMiwgeTogc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHNbbm9kZUluZGV4XSAtIG5vZGUuYm91bmRpbmdib3goKS5oIC8gMiwgd2lkdGg6IG5vZGUuYm91bmRpbmdib3goKS53LCBoZWlnaHQ6IG5vZGUuYm91bmRpbmdib3goKS5oIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJbmZvID0gYXV4LmNhbGNCb3VuZGluZ0JveChub2RlLCBzcGVjdHJhbFJlc3VsdFtpbmRleF0ueENvb3Jkcywgc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHMsIG5vZGVJbmRleGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICBzdWJncmFwaC5ub2Rlcy5wdXNoKHsgeDogcGFyZW50SW5mby50b3BMZWZ0WCwgeTogcGFyZW50SW5mby50b3BMZWZ0WSwgd2lkdGg6IHBhcmVudEluZm8ud2lkdGgsIGhlaWdodDogcGFyZW50SW5mby5oZWlnaHQgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3NlUmVzdWx0W2luZGV4XVtub2RlLmlkKCldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3ViZ3JhcGgubm9kZXMucHVzaCh7IHg6IGNvc2VSZXN1bHRbaW5kZXhdW25vZGUuaWQoKV0uZ2V0TGVmdCgpLCB5OiBjb3NlUmVzdWx0W2luZGV4XVtub2RlLmlkKCldLmdldFRvcCgpLCB3aWR0aDogY29zZVJlc3VsdFtpbmRleF1bbm9kZS5pZCgpXS5nZXRXaWR0aCgpLCBoZWlnaHQ6IGNvc2VSZXN1bHRbaW5kZXhdW25vZGUuaWQoKV0uZ2V0SGVpZ2h0KCkgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuZWRnZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgc291cmNlID0gZWRnZS5zb3VyY2UoKTtcbiAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBlZGdlLnRhcmdldCgpO1xuICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5jc3MoXCJkaXNwbGF5XCIpICE9IFwibm9uZVwiICYmIHRhcmdldC5jc3MoXCJkaXNwbGF5XCIpICE9IFwibm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZU5vZGVJbmRleCA9IG5vZGVJbmRleGVzLmdldChzb3VyY2UuaWQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldE5vZGVJbmRleCA9IG5vZGVJbmRleGVzLmdldCh0YXJnZXQuaWQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZUNlbnRlciA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDZW50ZXIgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJbmZvID0gYXV4LmNhbGNCb3VuZGluZ0JveChzb3VyY2UsIHNwZWN0cmFsUmVzdWx0W2luZGV4XS54Q29vcmRzLCBzcGVjdHJhbFJlc3VsdFtpbmRleF0ueUNvb3Jkcywgbm9kZUluZGV4ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ2VudGVyLnB1c2gocGFyZW50SW5mby50b3BMZWZ0WCArIHBhcmVudEluZm8ud2lkdGggLyAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNlbnRlci5wdXNoKHBhcmVudEluZm8udG9wTGVmdFkgKyBwYXJlbnRJbmZvLmhlaWdodCAvIDIpO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VDZW50ZXIucHVzaChzcGVjdHJhbFJlc3VsdFtpbmRleF0ueENvb3Jkc1tzb3VyY2VOb2RlSW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNlbnRlci5wdXNoKHNwZWN0cmFsUmVzdWx0W2luZGV4XS55Q29vcmRzW3NvdXJjZU5vZGVJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGFyZW50SW5mbyA9IGF1eC5jYWxjQm91bmRpbmdCb3godGFyZ2V0LCBzcGVjdHJhbFJlc3VsdFtpbmRleF0ueENvb3Jkcywgc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHMsIG5vZGVJbmRleGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENlbnRlci5wdXNoKF9wYXJlbnRJbmZvLnRvcExlZnRYICsgX3BhcmVudEluZm8ud2lkdGggLyAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENlbnRlci5wdXNoKF9wYXJlbnRJbmZvLnRvcExlZnRZICsgX3BhcmVudEluZm8uaGVpZ2h0IC8gMik7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENlbnRlci5wdXNoKHNwZWN0cmFsUmVzdWx0W2luZGV4XS54Q29vcmRzW3RhcmdldE5vZGVJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Q2VudGVyLnB1c2goc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHNbdGFyZ2V0Tm9kZUluZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHN1YmdyYXBoLmVkZ2VzLnB1c2goeyBzdGFydFg6IHNvdXJjZUNlbnRlclswXSwgc3RhcnRZOiBzb3VyY2VDZW50ZXJbMV0sIGVuZFg6IHRhcmdldENlbnRlclswXSwgZW5kWTogdGFyZ2V0Q2VudGVyWzFdIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3NlUmVzdWx0W2luZGV4XVtzb3VyY2UuaWQoKV0gJiYgY29zZVJlc3VsdFtpbmRleF1bdGFyZ2V0LmlkKCldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJncmFwaC5lZGdlcy5wdXNoKHsgc3RhcnRYOiBjb3NlUmVzdWx0W2luZGV4XVtzb3VyY2UuaWQoKV0uZ2V0Q2VudGVyWCgpLCBzdGFydFk6IGNvc2VSZXN1bHRbaW5kZXhdW3NvdXJjZS5pZCgpXS5nZXRDZW50ZXJZKCksIGVuZFg6IGNvc2VSZXN1bHRbaW5kZXhdW3RhcmdldC5pZCgpXS5nZXRDZW50ZXJYKCksIGVuZFk6IGNvc2VSZXN1bHRbaW5kZXhdW3RhcmdldC5pZCgpXS5nZXRDZW50ZXJZKCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHN1YmdyYXBoLm5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHN1YmdyYXBocy5wdXNoKHN1YmdyYXBoKTtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHNFdmFsdWF0ZWQuYWRkKGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIHNoaWZ0UmVzdWx0ID0gbGF5VXRpbC5wYWNrQ29tcG9uZW50cyhzdWJncmFwaHMsIG9wdGlvbnMucmFuZG9taXplKS5zaGlmdHM7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5xdWFsaXR5ID09IFwiZHJhZnRcIikge1xuICAgICAgICAgICAgICBzcGVjdHJhbFJlc3VsdC5mb3JFYWNoKGZ1bmN0aW9uIChyZXN1bHQsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld1hDb29yZHMgPSByZXN1bHQueENvb3Jkcy5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB4ICsgc2hpZnRSZXN1bHRbaW5kZXhdLmR4O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHZhciBuZXdZQ29vcmRzID0gcmVzdWx0LnlDb29yZHMubWFwKGZ1bmN0aW9uICh5KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4geSArIHNoaWZ0UmVzdWx0W2luZGV4XS5keTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXN1bHQueENvb3JkcyA9IG5ld1hDb29yZHM7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnlDb29yZHMgPSBuZXdZQ29vcmRzO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBfY291bnQgPSAwO1xuICAgICAgICAgICAgICBjb21wb25lbnRzRXZhbHVhdGVkLmZvckVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY29zZVJlc3VsdFtpbmRleF0pLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgIHZhciBub2RlUmVjdGFuZ2xlID0gY29zZVJlc3VsdFtpbmRleF1baXRlbV07XG4gICAgICAgICAgICAgICAgICBub2RlUmVjdGFuZ2xlLnNldENlbnRlcihub2RlUmVjdGFuZ2xlLmdldENlbnRlclgoKSArIHNoaWZ0UmVzdWx0W19jb3VudF0uZHgsIG5vZGVSZWN0YW5nbGUuZ2V0Q2VudGVyWSgpICsgc2hpZnRSZXN1bHRbX2NvdW50XS5keSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgX2NvdW50Kys7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBnZXQgZWFjaCBlbGVtZW50J3MgY2FsY3VsYXRlZCBwb3NpdGlvblxuICAgICAgdmFyIGdldFBvc2l0aW9ucyA9IGZ1bmN0aW9uIGdldFBvc2l0aW9ucyhlbGUsIGkpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMucXVhbGl0eSA9PSBcImRlZmF1bHRcIiB8fCBvcHRpb25zLnF1YWxpdHkgPT0gXCJwcm9vZlwiKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBlbGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGVsZSA9IGk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBwb3MgPSB2b2lkIDA7XG4gICAgICAgICAgdmFyIG5vZGUgPSB2b2lkIDA7XG4gICAgICAgICAgdmFyIHRoZUlkID0gZWxlLmRhdGEoJ2lkJyk7XG4gICAgICAgICAgY29zZVJlc3VsdC5mb3JFYWNoKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICh0aGVJZCBpbiByZXN1bHQpIHtcbiAgICAgICAgICAgICAgcG9zID0geyB4OiByZXN1bHRbdGhlSWRdLmdldFJlY3QoKS5nZXRDZW50ZXJYKCksIHk6IHJlc3VsdFt0aGVJZF0uZ2V0UmVjdCgpLmdldENlbnRlclkoKSB9O1xuICAgICAgICAgICAgICBub2RlID0gcmVzdWx0W3RoZUlkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAob3B0aW9ucy5ub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHMpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmxhYmVsV2lkdGgpIHtcbiAgICAgICAgICAgICAgaWYgKG5vZGUubGFiZWxQb3NIb3Jpem9udGFsID09IFwibGVmdFwiKSB7XG4gICAgICAgICAgICAgICAgcG9zLnggKz0gbm9kZS5sYWJlbFdpZHRoIC8gMjtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICAgICAgICBwb3MueCAtPSBub2RlLmxhYmVsV2lkdGggLyAyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS5sYWJlbEhlaWdodCkge1xuICAgICAgICAgICAgICBpZiAobm9kZS5sYWJlbFBvc1ZlcnRpY2FsID09IFwidG9wXCIpIHtcbiAgICAgICAgICAgICAgICBwb3MueSArPSBub2RlLmxhYmVsSGVpZ2h0IC8gMjtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmxhYmVsUG9zVmVydGljYWwgPT0gXCJib3R0b21cIikge1xuICAgICAgICAgICAgICAgIHBvcy55IC09IG5vZGUubGFiZWxIZWlnaHQgLyAyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwb3MgPT0gdW5kZWZpbmVkKSBwb3MgPSB7IHg6IGVsZS5wb3NpdGlvbihcInhcIiksIHk6IGVsZS5wb3NpdGlvbihcInlcIikgfTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogcG9zLngsXG4gICAgICAgICAgICB5OiBwb3MueVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIF9wb3MgPSB2b2lkIDA7XG4gICAgICAgICAgc3BlY3RyYWxSZXN1bHQuZm9yRWFjaChmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSByZXN1bHQubm9kZUluZGV4ZXMuZ2V0KGVsZS5pZCgpKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgX3BvcyA9IHsgeDogcmVzdWx0LnhDb29yZHNbaW5kZXhdLCB5OiByZXN1bHQueUNvb3Jkc1tpbmRleF0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoX3BvcyA9PSB1bmRlZmluZWQpIF9wb3MgPSB7IHg6IGVsZS5wb3NpdGlvbihcInhcIiksIHk6IGVsZS5wb3NpdGlvbihcInlcIikgfTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogX3Bvcy54LFxuICAgICAgICAgICAgeTogX3Bvcy55XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gcXVhbGl0eSA9IFwiZHJhZnRcIiBhbmQgcmFuZG9taXplID0gZmFsc2UgYXJlIGNvbnRyYWRpY3RpdmUgc28gaW4gdGhhdCBjYXNlIHBvc2l0aW9ucyBkb24ndCBjaGFuZ2VcbiAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkZWZhdWx0XCIgfHwgb3B0aW9ucy5xdWFsaXR5ID09IFwicHJvb2ZcIiB8fCBvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgICAgICAvLyB0cmFuc2ZlciBjYWxjdWxhdGVkIHBvc2l0aW9ucyB0byBub2RlcyAocG9zaXRpb25zIG9mIG9ubHkgc2ltcGxlIG5vZGVzIGFyZSBldmFsdWF0ZWQsIGNvbXBvdW5kcyBhcmUgcG9zaXRpb25lZCBhdXRvbWF0aWNhbGx5KVxuICAgICAgICB2YXIgcGFyZW50c1dpdGhvdXRDaGlsZHJlbiA9IGF1eC5jYWxjUGFyZW50c1dpdGhvdXRDaGlsZHJlbihjeSwgZWxlcyk7XG4gICAgICAgIHZhciBfaGlkZGVuRWxlcyA9IGVsZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlLmNzcygnZGlzcGxheScpID09ICdub25lJztcbiAgICAgICAgfSk7XG4gICAgICAgIG9wdGlvbnMuZWxlcyA9IGVsZXMubm90KF9oaWRkZW5FbGVzKTtcblxuICAgICAgICBlbGVzLm5vZGVzKCkubm90KFwiOnBhcmVudFwiKS5ub3QoX2hpZGRlbkVsZXMpLmxheW91dFBvc2l0aW9ucyhsYXlvdXQsIG9wdGlvbnMsIGdldFBvc2l0aW9ucyk7XG5cbiAgICAgICAgaWYgKHBhcmVudHNXaXRob3V0Q2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHBhcmVudHNXaXRob3V0Q2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgICBlbGUucG9zaXRpb24oZ2V0UG9zaXRpb25zKGVsZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhcIklmIHJhbmRvbWl6ZSBvcHRpb24gaXMgc2V0IHRvIGZhbHNlLCB0aGVuIHF1YWxpdHkgb3B0aW9uIG11c3QgYmUgJ2RlZmF1bHQnIG9yICdwcm9vZicuXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBMYXlvdXQ7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTGF5b3V0O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNjU3OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuLyoqXG4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3BlY3RyYWwgbGF5b3V0IHRoYXQgaXMgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGZjb3NlIGxheW91dCBhbGdvcml0aG1cbiovXG5cbnZhciBhdXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0OCk7XG52YXIgTWF0cml4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLmxheW91dEJhc2UuTWF0cml4O1xudmFyIFNWRCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5sYXlvdXRCYXNlLlNWRDtcblxuLy8gbWFpbiBmdW5jdGlvbiB0aGF0IHNwZWN0cmFsIGxheW91dCBpcyBwcm9jZXNzZWRcbnZhciBzcGVjdHJhbExheW91dCA9IGZ1bmN0aW9uIHNwZWN0cmFsTGF5b3V0KG9wdGlvbnMpIHtcblxuICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpO1xuICB2YXIgcGFyZW50Tm9kZXMgPSBlbGVzLm5vZGVzKFwiOnBhcmVudFwiKTtcblxuICB2YXIgZHVtbXlOb2RlcyA9IG5ldyBNYXAoKTsgLy8gbWFwIHRvIGtlZXAgZHVtbXkgbm9kZXMgYW5kIHRoZWlyIG5laWdoYm9yc1xuICB2YXIgbm9kZUluZGV4ZXMgPSBuZXcgTWFwKCk7IC8vIG1hcCB0byBrZWVwIGluZGV4ZXMgdG8gbm9kZXNcbiAgdmFyIHBhcmVudENoaWxkTWFwID0gbmV3IE1hcCgpOyAvLyBtYXBwaW5nIGJ0dy4gY29tcG91bmQgYW5kIGl0cyByZXByZXNlbnRhdGl2ZSBub2RlIFxuICB2YXIgYWxsTm9kZXNOZWlnaGJvcmhvb2QgPSBbXTsgLy8gYXJyYXkgdG8ga2VlcCBuZWlnaGJvcmhvb2Qgb2YgYWxsIG5vZGVzXG4gIHZhciB4Q29vcmRzID0gW107XG4gIHZhciB5Q29vcmRzID0gW107XG5cbiAgdmFyIHNhbXBsZXNDb2x1bW4gPSBbXTsgLy8gc2FtcGxlZCB2ZXJ0aWNlc1xuICB2YXIgbWluRGlzdGFuY2VzQ29sdW1uID0gW107XG4gIHZhciBDID0gW107IC8vIGNvbHVtbiBzYW1wbGluZyBtYXRyaXhcbiAgdmFyIFBISSA9IFtdOyAvLyBpbnRlcnNlY3Rpb24gb2YgY29sdW1uIGFuZCByb3cgc2FtcGxpbmcgbWF0cmljZXMgXG4gIHZhciBJTlYgPSBbXTsgLy8gaW52ZXJzZSBvZiBQSEkgXG5cbiAgdmFyIGZpcnN0U2FtcGxlID0gdm9pZCAwOyAvLyB0aGUgZmlyc3Qgc2FtcGxlZCBub2RlXG4gIHZhciBub2RlU2l6ZSA9IHZvaWQgMDtcblxuICB2YXIgaW5maW5pdHkgPSAxMDAwMDAwMDA7XG4gIHZhciBzbWFsbCA9IDAuMDAwMDAwMDAxO1xuXG4gIHZhciBwaVRvbCA9IG9wdGlvbnMucGlUb2w7XG4gIHZhciBzYW1wbGluZ1R5cGUgPSBvcHRpb25zLnNhbXBsaW5nVHlwZTsgLy8gZmFsc2UgZm9yIHJhbmRvbSwgdHJ1ZSBmb3IgZ3JlZWR5XG4gIHZhciBub2RlU2VwYXJhdGlvbiA9IG9wdGlvbnMubm9kZVNlcGFyYXRpb247XG4gIHZhciBzYW1wbGVTaXplID0gdm9pZCAwO1xuXG4gIC8qKioqIFNwZWN0cmFsLXByZXByb2Nlc3NpbmcgZnVuY3Rpb25zICoqKiovXG5cbiAgLyoqKiogU3BlY3RyYWwgbGF5b3V0IGZ1bmN0aW9ucyAqKioqL1xuXG4gIC8vIGRldGVybWluZSB3aGljaCBjb2x1bW5zIHRvIGJlIHNhbXBsZWRcbiAgdmFyIHJhbmRvbVNhbXBsZUNSID0gZnVuY3Rpb24gcmFuZG9tU2FtcGxlQ1IoKSB7XG4gICAgdmFyIHNhbXBsZSA9IDA7XG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB2YXIgZmxhZyA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKGNvdW50IDwgc2FtcGxlU2l6ZSkge1xuICAgICAgc2FtcGxlID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbm9kZVNpemUpO1xuXG4gICAgICBmbGFnID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgaWYgKHNhbXBsZXNDb2x1bW5baV0gPT0gc2FtcGxlKSB7XG4gICAgICAgICAgZmxhZyA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFmbGFnKSB7XG4gICAgICAgIHNhbXBsZXNDb2x1bW5bY291bnRdID0gc2FtcGxlO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIHRha2VzIHRoZSBpbmRleCBvZiB0aGUgbm9kZShwaXZvdCkgdG8gaW5pdGlhdGUgQkZTIGFzIGEgcGFyYW1ldGVyXG4gIHZhciBCRlMgPSBmdW5jdGlvbiBCRlMocGl2b3QsIGluZGV4LCBzYW1wbGluZ01ldGhvZCkge1xuICAgIHZhciBwYXRoID0gW107IC8vIHRoZSBmcm9udCBvZiB0aGUgcGF0aFxuICAgIHZhciBmcm9udCA9IDA7IC8vIHRoZSBiYWNrIG9mIHRoZSBwYXRoXG4gICAgdmFyIGJhY2sgPSAwO1xuICAgIHZhciBjdXJyZW50ID0gMDtcbiAgICB2YXIgdGVtcCA9IHZvaWQgMDtcbiAgICB2YXIgZGlzdGFuY2UgPSBbXTtcblxuICAgIHZhciBtYXhfZGlzdCA9IDA7IC8vIHRoZSBmdXJ0aGVzdCBub2RlIHRvIGJlIHJldHVybmVkXG4gICAgdmFyIG1heF9pbmQgPSAxO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlU2l6ZTsgaSsrKSB7XG4gICAgICBkaXN0YW5jZVtpXSA9IGluZmluaXR5O1xuICAgIH1cblxuICAgIHBhdGhbYmFja10gPSBwaXZvdDtcbiAgICBkaXN0YW5jZVtwaXZvdF0gPSAwO1xuXG4gICAgd2hpbGUgKGJhY2sgPj0gZnJvbnQpIHtcbiAgICAgIGN1cnJlbnQgPSBwYXRoW2Zyb250KytdO1xuICAgICAgdmFyIG5laWdoYm9ycyA9IGFsbE5vZGVzTmVpZ2hib3Job29kW2N1cnJlbnRdO1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5laWdoYm9ycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdGVtcCA9IG5vZGVJbmRleGVzLmdldChuZWlnaGJvcnNbX2ldKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlW3RlbXBdID09IGluZmluaXR5KSB7XG4gICAgICAgICAgZGlzdGFuY2VbdGVtcF0gPSBkaXN0YW5jZVtjdXJyZW50XSArIDE7XG4gICAgICAgICAgcGF0aFsrK2JhY2tdID0gdGVtcDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgQ1tjdXJyZW50XVtpbmRleF0gPSBkaXN0YW5jZVtjdXJyZW50XSAqIG5vZGVTZXBhcmF0aW9uO1xuICAgIH1cblxuICAgIGlmIChzYW1wbGluZ01ldGhvZCkge1xuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbm9kZVNpemU7IF9pMisrKSB7XG4gICAgICAgIGlmIChDW19pMl1baW5kZXhdIDwgbWluRGlzdGFuY2VzQ29sdW1uW19pMl0pIG1pbkRpc3RhbmNlc0NvbHVtbltfaTJdID0gQ1tfaTJdW2luZGV4XTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbm9kZVNpemU7IF9pMysrKSB7XG4gICAgICAgIGlmIChtaW5EaXN0YW5jZXNDb2x1bW5bX2kzXSA+IG1heF9kaXN0KSB7XG4gICAgICAgICAgbWF4X2Rpc3QgPSBtaW5EaXN0YW5jZXNDb2x1bW5bX2kzXTtcbiAgICAgICAgICBtYXhfaW5kID0gX2kzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXhfaW5kO1xuICB9O1xuXG4gIC8vIGFwcGx5IEJGUyB0byBhbGwgbm9kZXMgb3Igc2VsZWN0ZWQgc2FtcGxlc1xuICB2YXIgYWxsQkZTID0gZnVuY3Rpb24gYWxsQkZTKHNhbXBsaW5nTWV0aG9kKSB7XG5cbiAgICB2YXIgc2FtcGxlID0gdm9pZCAwO1xuXG4gICAgaWYgKCFzYW1wbGluZ01ldGhvZCkge1xuICAgICAgcmFuZG9tU2FtcGxlQ1IoKTtcblxuICAgICAgLy8gY2FsbCBCRlNcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2FtcGxlU2l6ZTsgaSsrKSB7XG4gICAgICAgIEJGUyhzYW1wbGVzQ29sdW1uW2ldLCBpLCBzYW1wbGluZ01ldGhvZCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzYW1wbGUgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBub2RlU2l6ZSk7XG4gICAgICBmaXJzdFNhbXBsZSA9IHNhbXBsZTtcblxuICAgICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgbm9kZVNpemU7IF9pNCsrKSB7XG4gICAgICAgIG1pbkRpc3RhbmNlc0NvbHVtbltfaTRdID0gaW5maW5pdHk7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IHNhbXBsZVNpemU7IF9pNSsrKSB7XG4gICAgICAgIHNhbXBsZXNDb2x1bW5bX2k1XSA9IHNhbXBsZTtcbiAgICAgICAgc2FtcGxlID0gQkZTKHNhbXBsZSwgX2k1LCBzYW1wbGluZ01ldGhvZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZm9ybSB0aGUgc3F1YXJlZCBkaXN0YW5jZXMgZm9yIENcbiAgICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBub2RlU2l6ZTsgX2k2KyspIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2FtcGxlU2l6ZTsgaisrKSB7XG4gICAgICAgIENbX2k2XVtqXSAqPSBDW19pNl1bal07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZm9ybSBQSElcbiAgICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCBzYW1wbGVTaXplOyBfaTcrKykge1xuICAgICAgUEhJW19pN10gPSBbXTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaTggPSAwOyBfaTggPCBzYW1wbGVTaXplOyBfaTgrKykge1xuICAgICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IHNhbXBsZVNpemU7IF9qKyspIHtcbiAgICAgICAgUEhJW19pOF1bX2pdID0gQ1tzYW1wbGVzQ29sdW1uW19qXV1bX2k4XTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gcGVyZm9ybSB0aGUgU1ZEIGFsZ29yaXRobSBhbmQgYXBwbHkgYSByZWd1bGFyaXphdGlvbiBzdGVwXG4gIHZhciBzYW1wbGUgPSBmdW5jdGlvbiBzYW1wbGUoKSB7XG5cbiAgICB2YXIgU1ZEUmVzdWx0ID0gU1ZELnN2ZChQSEkpO1xuXG4gICAgdmFyIGFfcSA9IFNWRFJlc3VsdC5TO1xuICAgIHZhciBhX3UgPSBTVkRSZXN1bHQuVTtcbiAgICB2YXIgYV92ID0gU1ZEUmVzdWx0LlY7XG5cbiAgICB2YXIgbWF4X3MgPSBhX3FbMF0gKiBhX3FbMF0gKiBhX3FbMF07XG5cbiAgICB2YXIgYV9TaWcgPSBbXTtcblxuICAgIC8vICByZWd1bGFyaXphdGlvblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2FtcGxlU2l6ZTsgaSsrKSB7XG4gICAgICBhX1NpZ1tpXSA9IFtdO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzYW1wbGVTaXplOyBqKyspIHtcbiAgICAgICAgYV9TaWdbaV1bal0gPSAwO1xuICAgICAgICBpZiAoaSA9PSBqKSB7XG4gICAgICAgICAgYV9TaWdbaV1bal0gPSBhX3FbaV0gLyAoYV9xW2ldICogYV9xW2ldICsgbWF4X3MgLyAoYV9xW2ldICogYV9xW2ldKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBJTlYgPSBNYXRyaXgubXVsdE1hdChNYXRyaXgubXVsdE1hdChhX3YsIGFfU2lnKSwgTWF0cml4LnRyYW5zcG9zZShhX3UpKTtcbiAgfTtcblxuICAvLyBjYWxjdWxhdGUgZmluYWwgY29vcmRpbmF0ZXMgXG4gIHZhciBwb3dlckl0ZXJhdGlvbiA9IGZ1bmN0aW9uIHBvd2VySXRlcmF0aW9uKCkge1xuICAgIC8vIHR3byBsYXJnZXN0IGVpZ2VudmFsdWVzXG4gICAgdmFyIHRoZXRhMSA9IHZvaWQgMDtcbiAgICB2YXIgdGhldGEyID0gdm9pZCAwO1xuXG4gICAgLy8gaW5pdGlhbCBndWVzc2VzIGZvciBlaWdlbnZlY3RvcnNcbiAgICB2YXIgWTEgPSBbXTtcbiAgICB2YXIgWTIgPSBbXTtcblxuICAgIHZhciBWMSA9IFtdO1xuICAgIHZhciBWMiA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlU2l6ZTsgaSsrKSB7XG4gICAgICBZMVtpXSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICBZMltpXSA9IE1hdGgucmFuZG9tKCk7XG4gICAgfVxuXG4gICAgWTEgPSBNYXRyaXgubm9ybWFsaXplKFkxKTtcbiAgICBZMiA9IE1hdHJpeC5ub3JtYWxpemUoWTIpO1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICAvLyB0byBrZWVwIHRyYWNrIG9mIHRoZSBpbXByb3ZlbWVudCByYXRpbyBpbiBwb3dlciBpdGVyYXRpb25cbiAgICB2YXIgY3VycmVudCA9IHNtYWxsO1xuICAgIHZhciBwcmV2aW91cyA9IHNtYWxsO1xuXG4gICAgdmFyIHRlbXAgPSB2b2lkIDA7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY291bnQrKztcblxuICAgICAgZm9yICh2YXIgX2k5ID0gMDsgX2k5IDwgbm9kZVNpemU7IF9pOSsrKSB7XG4gICAgICAgIFYxW19pOV0gPSBZMVtfaTldO1xuICAgICAgfVxuXG4gICAgICBZMSA9IE1hdHJpeC5tdWx0R2FtbWEoTWF0cml4Lm11bHRMKE1hdHJpeC5tdWx0R2FtbWEoVjEpLCBDLCBJTlYpKTtcbiAgICAgIHRoZXRhMSA9IE1hdHJpeC5kb3RQcm9kdWN0KFYxLCBZMSk7XG4gICAgICBZMSA9IE1hdHJpeC5ub3JtYWxpemUoWTEpO1xuXG4gICAgICBjdXJyZW50ID0gTWF0cml4LmRvdFByb2R1Y3QoVjEsIFkxKTtcblxuICAgICAgdGVtcCA9IE1hdGguYWJzKGN1cnJlbnQgLyBwcmV2aW91cyk7XG5cbiAgICAgIGlmICh0ZW1wIDw9IDEgKyBwaVRvbCAmJiB0ZW1wID49IDEpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzID0gY3VycmVudDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaTEwID0gMDsgX2kxMCA8IG5vZGVTaXplOyBfaTEwKyspIHtcbiAgICAgIFYxW19pMTBdID0gWTFbX2kxMF07XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZpb3VzID0gc21hbGw7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvdW50Kys7XG5cbiAgICAgIGZvciAodmFyIF9pMTEgPSAwOyBfaTExIDwgbm9kZVNpemU7IF9pMTErKykge1xuICAgICAgICBWMltfaTExXSA9IFkyW19pMTFdO1xuICAgICAgfVxuXG4gICAgICBWMiA9IE1hdHJpeC5taW51c09wKFYyLCBNYXRyaXgubXVsdENvbnMoVjEsIE1hdHJpeC5kb3RQcm9kdWN0KFYxLCBWMikpKTtcbiAgICAgIFkyID0gTWF0cml4Lm11bHRHYW1tYShNYXRyaXgubXVsdEwoTWF0cml4Lm11bHRHYW1tYShWMiksIEMsIElOVikpO1xuICAgICAgdGhldGEyID0gTWF0cml4LmRvdFByb2R1Y3QoVjIsIFkyKTtcbiAgICAgIFkyID0gTWF0cml4Lm5vcm1hbGl6ZShZMik7XG5cbiAgICAgIGN1cnJlbnQgPSBNYXRyaXguZG90UHJvZHVjdChWMiwgWTIpO1xuXG4gICAgICB0ZW1wID0gTWF0aC5hYnMoY3VycmVudCAvIHByZXZpb3VzKTtcblxuICAgICAgaWYgKHRlbXAgPD0gMSArIHBpVG9sICYmIHRlbXAgPj0gMSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXMgPSBjdXJyZW50O1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pMTIgPSAwOyBfaTEyIDwgbm9kZVNpemU7IF9pMTIrKykge1xuICAgICAgVjJbX2kxMl0gPSBZMltfaTEyXTtcbiAgICB9XG5cbiAgICAvLyB0aGV0YTEgbm93IGNvbnRhaW5zIGRvbWluYW50IGVpZ2VudmFsdWVcbiAgICAvLyB0aGV0YTIgbm93IGNvbnRhaW5zIHRoZSBzZWNvbmQtbGFyZ2VzdCBlaWdlbnZhbHVlXG4gICAgLy8gVjEgbm93IGNvbnRhaW5zIHRoZXRhMSdzIGVpZ2VudmVjdG9yXG4gICAgLy8gVjIgbm93IGNvbnRhaW5zIHRoZXRhMidzIGVpZ2VudmVjdG9yXG5cbiAgICAvL3BvcHVsYXRlIHRoZSB0d28gdmVjdG9yc1xuICAgIHhDb29yZHMgPSBNYXRyaXgubXVsdENvbnMoVjEsIE1hdGguc3FydChNYXRoLmFicyh0aGV0YTEpKSk7XG4gICAgeUNvb3JkcyA9IE1hdHJpeC5tdWx0Q29ucyhWMiwgTWF0aC5zcXJ0KE1hdGguYWJzKHRoZXRhMikpKTtcbiAgfTtcblxuICAvKioqKiBQcmVwYXJhdGlvbiBmb3Igc3BlY3RyYWwgbGF5b3V0IChQcmVwcm9jZXNzaW5nKSAqKioqL1xuXG4gIC8vIGNvbm5lY3QgZGlzY29ubmVjdGVkIGNvbXBvbmVudHMgKGZpcnN0IHRvcCBsZXZlbCwgdGhlbiBpbnNpZGUgb2YgZWFjaCBjb21wb3VuZCBub2RlKVxuICBhdXguY29ubmVjdENvbXBvbmVudHMoY3ksIGVsZXMsIGF1eC5nZXRUb3BNb3N0Tm9kZXMobm9kZXMpLCBkdW1teU5vZGVzKTtcblxuICBwYXJlbnROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICBhdXguY29ubmVjdENvbXBvbmVudHMoY3ksIGVsZXMsIGF1eC5nZXRUb3BNb3N0Tm9kZXMoZWxlLmRlc2NlbmRhbnRzKCkuaW50ZXJzZWN0aW9uKGVsZXMpKSwgZHVtbXlOb2Rlcyk7XG4gIH0pO1xuXG4gIC8vIGFzc2lnbiBpbmRleGVzIHRvIG5vZGVzIChmaXJzdCByZWFsLCB0aGVuIGR1bW15IG5vZGVzKVxuICB2YXIgaW5kZXggPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFub2Rlc1tpXS5pc1BhcmVudCgpKSB7XG4gICAgICBub2RlSW5kZXhlcy5zZXQobm9kZXNbaV0uaWQoKSwgaW5kZXgrKyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgdmFyIF9pdGVyYXRvckVycm9yID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gZHVtbXlOb2Rlcy5rZXlzKClbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gKF9zdGVwID0gX2l0ZXJhdG9yLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlKSB7XG4gICAgICB2YXIga2V5ID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgIG5vZGVJbmRleGVzLnNldChrZXksIGluZGV4KyspO1xuICAgIH1cblxuICAgIC8vIGluc3RhbnRpYXRlIHRoZSBuZWlnaGJvcmhvb2QgbWF0cml4XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICBfaXRlcmF0b3JFcnJvciA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uICYmIF9pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgX2l0ZXJhdG9yLnJldHVybigpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgX2kxMyA9IDA7IF9pMTMgPCBub2RlSW5kZXhlcy5zaXplOyBfaTEzKyspIHtcbiAgICBhbGxOb2Rlc05laWdoYm9yaG9vZFtfaTEzXSA9IFtdO1xuICB9XG5cbiAgLy8gZm9ybSBhIHBhcmVudC1jaGlsZCBtYXAgdG8ga2VlcCByZXByZXNlbnRhdGl2ZSBub2RlIG9mIGVhY2ggY29tcG91bmQgbm9kZSAgXG4gIHBhcmVudE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgIHZhciBjaGlsZHJlbiA9IGVsZS5jaGlsZHJlbigpLmludGVyc2VjdGlvbihlbGVzKTtcblxuICAgIC8vICAgICAgbGV0IHJhbmRvbSA9IDA7XG4gICAgd2hpbGUgKGNoaWxkcmVuLm5vZGVzKFwiOmNoaWxkbGVzc1wiKS5sZW5ndGggPT0gMCkge1xuICAgICAgLy8gICAgICAgIHJhbmRvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoaWxkcmVuLm5vZGVzKCkubGVuZ3RoKTsgLy8gaWYgYWxsIGNoaWxkcmVuIGFyZSBjb21wb3VuZCB0aGVuIHByb2NlZWQgcmFuZG9tbHlcbiAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4ubm9kZXMoKVswXS5jaGlsZHJlbigpLmludGVyc2VjdGlvbihlbGVzKTtcbiAgICB9XG4gICAgLy8gIHNlbGVjdCB0aGUgcmVwcmVzZW50YXRpdmUgbm9kZSAtIHdlIGNhbiBhcHBseSBkaWZmZXJlbnQgbWV0aG9kcyBoZXJlXG4gICAgLy8gICAgICByYW5kb20gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGlsZHJlbi5ub2RlcyhcIjpjaGlsZGxlc3NcIikubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBtaW4gPSBjaGlsZHJlbi5ub2RlcyhcIjpjaGlsZGxlc3NcIilbMF0uY29ubmVjdGVkRWRnZXMoKS5sZW5ndGg7XG4gICAgY2hpbGRyZW4ubm9kZXMoXCI6Y2hpbGRsZXNzXCIpLmZvckVhY2goZnVuY3Rpb24gKGVsZTIsIGkpIHtcbiAgICAgIGlmIChlbGUyLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoIDwgbWluKSB7XG4gICAgICAgIG1pbiA9IGVsZTIuY29ubmVjdGVkRWRnZXMoKS5sZW5ndGg7XG4gICAgICAgIGluZGV4ID0gaTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwYXJlbnRDaGlsZE1hcC5zZXQoZWxlLmlkKCksIGNoaWxkcmVuLm5vZGVzKFwiOmNoaWxkbGVzc1wiKVtpbmRleF0uaWQoKSk7XG4gIH0pO1xuXG4gIC8vIGFkZCBuZWlnaGJvcmhvb2QgcmVsYXRpb25zIChmaXJzdCByZWFsLCB0aGVuIGR1bW15IG5vZGVzKVxuICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICB2YXIgZWxlSW5kZXggPSB2b2lkIDA7XG5cbiAgICBpZiAoZWxlLmlzUGFyZW50KCkpIGVsZUluZGV4ID0gbm9kZUluZGV4ZXMuZ2V0KHBhcmVudENoaWxkTWFwLmdldChlbGUuaWQoKSkpO2Vsc2UgZWxlSW5kZXggPSBub2RlSW5kZXhlcy5nZXQoZWxlLmlkKCkpO1xuXG4gICAgZWxlLm5laWdoYm9yaG9vZCgpLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgaWYgKGVsZXMuaW50ZXJzZWN0aW9uKGVsZS5lZGdlc1dpdGgobm9kZSkpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKG5vZGUuaXNQYXJlbnQoKSkgYWxsTm9kZXNOZWlnaGJvcmhvb2RbZWxlSW5kZXhdLnB1c2gocGFyZW50Q2hpbGRNYXAuZ2V0KG5vZGUuaWQoKSkpO2Vsc2UgYWxsTm9kZXNOZWlnaGJvcmhvb2RbZWxlSW5kZXhdLnB1c2gobm9kZS5pZCgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoX2tleSkge1xuICAgIHZhciBlbGVJbmRleCA9IG5vZGVJbmRleGVzLmdldChfa2V5KTtcbiAgICB2YXIgZGlzY29ubmVjdGVkSWQgPSB2b2lkIDA7XG4gICAgZHVtbXlOb2Rlcy5nZXQoX2tleSkuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGlmIChjeS5nZXRFbGVtZW50QnlJZChpZCkuaXNQYXJlbnQoKSkgZGlzY29ubmVjdGVkSWQgPSBwYXJlbnRDaGlsZE1hcC5nZXQoaWQpO2Vsc2UgZGlzY29ubmVjdGVkSWQgPSBpZDtcblxuICAgICAgYWxsTm9kZXNOZWlnaGJvcmhvb2RbZWxlSW5kZXhdLnB1c2goZGlzY29ubmVjdGVkSWQpO1xuICAgICAgYWxsTm9kZXNOZWlnaGJvcmhvb2Rbbm9kZUluZGV4ZXMuZ2V0KGRpc2Nvbm5lY3RlZElkKV0ucHVzaChfa2V5KTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSB0cnVlO1xuICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IyID0gZmFsc2U7XG4gIHZhciBfaXRlcmF0b3JFcnJvcjIgPSB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gZHVtbXlOb2Rlcy5rZXlzKClbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDI7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSAoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiA9IHRydWUpIHtcbiAgICAgIHZhciBfa2V5ID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICBfbG9vcChfa2V5KTtcbiAgICB9XG5cbiAgICAvLyBub2RlU2l6ZSBub3cgb25seSBjb25zaWRlcnMgdGhlIHNpemUgb2YgdHJhbnNmb3JtZWQgZ3JhcGhcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2RpZEl0ZXJhdG9yRXJyb3IyID0gdHJ1ZTtcbiAgICBfaXRlcmF0b3JFcnJvcjIgPSBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgJiYgX2l0ZXJhdG9yMi5yZXR1cm4pIHtcbiAgICAgICAgX2l0ZXJhdG9yMi5yZXR1cm4oKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMikge1xuICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbm9kZVNpemUgPSBub2RlSW5kZXhlcy5zaXplO1xuXG4gIHZhciBzcGVjdHJhbFJlc3VsdCA9IHZvaWQgMDtcblxuICAvLyBJZiBudW1iZXIgb2Ygbm9kZXMgaW4gdHJhbnNmb3JtZWQgZ3JhcGggaXMgMSBvciAyLCBlaXRoZXIgU1ZEIG9yIHBvd2VySXRlcmF0aW9uIGNhdXNlcyBwcm9ibGVtXG4gIC8vIFNvIHNraXAgc3BlY3RyYWwgYW5kIGxheW91dCB0aGUgZ3JhcGggd2l0aCBjb3NlXG4gIGlmIChub2RlU2l6ZSA+IDIpIHtcbiAgICAvLyBpZiAjIG9mIG5vZGVzIGluIHRyYW5zZm9ybWVkIGdyYXBoIGlzIHNtYWxsZXIgdGhhbiBzYW1wbGUgc2l6ZSxcbiAgICAvLyB0aGVuIHVzZSAjIG9mIG5vZGVzIGFzIHNhbXBsZSBzaXplXG4gICAgc2FtcGxlU2l6ZSA9IG5vZGVTaXplIDwgb3B0aW9ucy5zYW1wbGVTaXplID8gbm9kZVNpemUgOiBvcHRpb25zLnNhbXBsZVNpemU7XG5cbiAgICAvLyBpbnN0YW50aWF0ZXMgdGhlIHBhcnRpYWwgbWF0cmljZXMgdGhhdCB3aWxsIGJlIHVzZWQgaW4gc3BlY3RyYWwgbGF5b3V0XG4gICAgZm9yICh2YXIgX2kxNCA9IDA7IF9pMTQgPCBub2RlU2l6ZTsgX2kxNCsrKSB7XG4gICAgICBDW19pMTRdID0gW107XG4gICAgfVxuICAgIGZvciAodmFyIF9pMTUgPSAwOyBfaTE1IDwgc2FtcGxlU2l6ZTsgX2kxNSsrKSB7XG4gICAgICBJTlZbX2kxNV0gPSBbXTtcbiAgICB9XG5cbiAgICAvKioqKiBBcHBseSBzcGVjdHJhbCBsYXlvdXQgKioqKi9cblxuICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiIHx8IG9wdGlvbnMuc3RlcCA9PSBcImFsbFwiKSB7XG4gICAgICBhbGxCRlMoc2FtcGxpbmdUeXBlKTtcbiAgICAgIHNhbXBsZSgpO1xuICAgICAgcG93ZXJJdGVyYXRpb24oKTtcblxuICAgICAgc3BlY3RyYWxSZXN1bHQgPSB7IG5vZGVJbmRleGVzOiBub2RlSW5kZXhlcywgeENvb3JkczogeENvb3JkcywgeUNvb3JkczogeUNvb3JkcyB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlSW5kZXhlcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgIHhDb29yZHMucHVzaChjeS5nZXRFbGVtZW50QnlJZChrZXkpLnBvc2l0aW9uKFwieFwiKSk7XG4gICAgICAgIHlDb29yZHMucHVzaChjeS5nZXRFbGVtZW50QnlJZChrZXkpLnBvc2l0aW9uKFwieVwiKSk7XG4gICAgICB9KTtcbiAgICAgIHNwZWN0cmFsUmVzdWx0ID0geyBub2RlSW5kZXhlczogbm9kZUluZGV4ZXMsIHhDb29yZHM6IHhDb29yZHMsIHlDb29yZHM6IHlDb29yZHMgfTtcbiAgICB9XG4gICAgcmV0dXJuIHNwZWN0cmFsUmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIHZhciBpdGVyYXRvciA9IG5vZGVJbmRleGVzLmtleXMoKTtcbiAgICB2YXIgZmlyc3ROb2RlID0gY3kuZ2V0RWxlbWVudEJ5SWQoaXRlcmF0b3IubmV4dCgpLnZhbHVlKTtcbiAgICB2YXIgZmlyc3ROb2RlUG9zID0gZmlyc3ROb2RlLnBvc2l0aW9uKCk7XG4gICAgdmFyIGZpcnN0Tm9kZVdpZHRoID0gZmlyc3ROb2RlLm91dGVyV2lkdGgoKTtcbiAgICB4Q29vcmRzLnB1c2goZmlyc3ROb2RlUG9zLngpO1xuICAgIHlDb29yZHMucHVzaChmaXJzdE5vZGVQb3MueSk7XG4gICAgaWYgKG5vZGVTaXplID09IDIpIHtcbiAgICAgIHZhciBzZWNvbmROb2RlID0gY3kuZ2V0RWxlbWVudEJ5SWQoaXRlcmF0b3IubmV4dCgpLnZhbHVlKTtcbiAgICAgIHZhciBzZWNvbmROb2RlV2lkdGggPSBzZWNvbmROb2RlLm91dGVyV2lkdGgoKTtcbiAgICAgIHhDb29yZHMucHVzaChmaXJzdE5vZGVQb3MueCArIGZpcnN0Tm9kZVdpZHRoIC8gMiArIHNlY29uZE5vZGVXaWR0aCAvIDIgKyBvcHRpb25zLmlkZWFsRWRnZUxlbmd0aCk7XG4gICAgICB5Q29vcmRzLnB1c2goZmlyc3ROb2RlUG9zLnkpO1xuICAgIH1cblxuICAgIHNwZWN0cmFsUmVzdWx0ID0geyBub2RlSW5kZXhlczogbm9kZUluZGV4ZXMsIHhDb29yZHM6IHhDb29yZHMsIHlDb29yZHM6IHlDb29yZHMgfTtcbiAgICByZXR1cm4gc3BlY3RyYWxSZXN1bHQ7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0geyBzcGVjdHJhbExheW91dDogc3BlY3RyYWxMYXlvdXQgfTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU3OTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBpbXBsID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTIpO1xuXG4vLyByZWdpc3RlcnMgdGhlIGV4dGVuc2lvbiBvbiBhIGN5dG9zY2FwZSBsaWIgcmVmXG52YXIgcmVnaXN0ZXIgPSBmdW5jdGlvbiByZWdpc3RlcihjeXRvc2NhcGUpIHtcbiAgaWYgKCFjeXRvc2NhcGUpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gY2FuJ3QgcmVnaXN0ZXIgaWYgY3l0b3NjYXBlIHVuc3BlY2lmaWVkXG5cbiAgY3l0b3NjYXBlKCdsYXlvdXQnLCAnZmNvc2UnLCBpbXBsKTsgLy8gcmVnaXN0ZXIgd2l0aCBjeXRvc2NhcGUuanNcbn07XG5cbmlmICh0eXBlb2YgY3l0b3NjYXBlICE9PSAndW5kZWZpbmVkJykge1xuICAvLyBleHBvc2UgdG8gZ2xvYmFsIGN5dG9zY2FwZSAoaS5lLiB3aW5kb3cuY3l0b3NjYXBlKVxuICByZWdpc3RlcihjeXRvc2NhcGUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlZ2lzdGVyO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMTQwOlxuLyoqKi8gKChtb2R1bGUpID0+IHtcblxubW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xNDBfXztcblxuLyoqKi8gfSlcblxuLyoqKioqKi8gXHR9KTtcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuLyoqKioqKi8gXHRcdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqLyBcdFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8vIHN0YXJ0dXBcbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdC8vIFRoaXMgZW50cnkgbW9kdWxlIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgbW9kdWxlcyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NzkpO1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19leHBvcnRzX187XG4vKioqKioqLyB9KSgpXG47XG59KTsiLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5jb25zdCB7IHN0cmluZywgYXJyYXksIG9iamVjdCwgbnVtYmVyLCBib29sLCBvbmVPZlR5cGUsIGFueSwgZnVuYyB9ID0gUHJvcFR5cGVzO1xuXG5leHBvcnQgY29uc3QgdHlwZXMgPSB7XG4gIC8qKlxuICAgKiBUaGUgYGlkYCBIVE1MIGF0dHJpYnV0ZSBvZiB0aGUgY29tcG9uZW50LlxuICAgKiAqL1xuICBpZDogc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgYGNsYXNzYCBIVE1MIGF0dHJpYnV0ZSBvZiB0aGUgY29tcG9uZW50LiAgVXNlIHRoaXMgdG8gc2V0IHRoZSBkaW1lbnNpb25zIG9mXG4gICAqIHRoZSBncmFwaCB2aXN1YWxpc2F0aW9uIHZpYSBhIHN0eWxlIGJsb2NrIGluIHlvdXIgQ1NTIGZpbGUuXG4gICAqL1xuICBjbGFzc05hbWU6IHN0cmluZyxcblxuICAvKipcbiAgICogVGhlIGBzdHlsZWAgSFRNTCBhdHRyaWJ1dGUgb2YgdGhlIGNvbXBvbmVudC4gIFVzZSB0aGlzIHRvIHNldCB0aGUgZGltZW5zaW9ucyBvZlxuICAgKiB0aGUgZ3JhcGggdmlzdWFsaXNhdGlvbiBpZiB5b3UgZG8gbm90IHVzZSBzZXBhcmF0ZSBDU1MgZmlsZXMuXG4gICAqL1xuICBzdHlsZTogb25lT2ZUeXBlKFtzdHJpbmcsIG9iamVjdF0pLFxuXG4gIC8qKlxuICAgKiBUaGUgZmxhdCBsaXN0IG9mIEN5dG9zY2FwZSBlbGVtZW50cyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZ3JhcGgsIGVhY2ggcmVwcmVzZW50ZWRcbiAgICogYXMgbm9uLXN0cmluZ2lmaWVkIEpTT04uICBFLmcuOlxuICAgKlxuICAgKiBgYGBcbiAgICogZWxlbWVudHM6IFtcbiAgICogICB7IGRhdGE6IHsgaWQ6ICdvbmUnLCBsYWJlbDogJ05vZGUgMScgfSwgcG9zaXRpb246IHsgeDogMCwgeTogMCB9IH0sXG4gICAqICAgeyBkYXRhOiB7IGlkOiAndHdvJywgbGFiZWw6ICdOb2RlIDInIH0sIHBvc2l0aW9uOiB7IHg6IDEwMCwgeTogMCB9IH0sXG4gICAqICAgeyBkYXRhOiB7IHNvdXJjZTogJ29uZScsIHRhcmdldDogJ3R3bycsIGxhYmVsOiAnRWRnZSBmcm9tIE5vZGUxIHRvIE5vZGUyJyB9IH1cbiAgICogXVxuICAgKiBgYGBcbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNub3RhdGlvbi9lbGVtZW50cy1qc29uXG4gICAqICovXG4gIGVsZW1lbnRzOiBvbmVPZlR5cGUoW2FycmF5LCBhbnldKSxcblxuICAvKipcbiAgICogVGhlIEN5dG9zY2FwZSBzdHlsZXNoZWV0IGFzIG5vbi1zdHJpbmdpZmllZCBKU09OLiAgRS5nLjpcbiAgICpcbiAgICogYGBgXG4gICAqIHN0eWxlc2hlZXQ6IFtcbiAgICogICB7XG4gICAqICAgICAgc2VsZWN0b3I6ICdub2RlJyxcbiAgICogICAgICBzdHlsZToge1xuICAgKiAgICAgICAgJ3dpZHRoJzogMzAsXG4gICAqICAgICAgICAnaGVpZ2h0JzogMzAsXG4gICAqICAgICAgICAnc2hhcGUnOiAncmVjdGFuZ2xlJ1xuICAgKiAgICAgIH1cbiAgICogICB9XG4gICAqIF1cbiAgICogYGBgXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jc3R5bGVcbiAgICovXG4gIHN0eWxlc2hlZXQ6IG9uZU9mVHlwZShbYXJyYXksIGFueV0pLFxuXG4gIC8qKlxuICAgKiBVc2UgYSBsYXlvdXQgdG8gYXV0b21hdGljYWxseSBwb3NpdGlvbiB0aGUgbm9kZXMgaW4gdGhlIGdyYXBoLiAgRS5nLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGF5b3V0OiB7IG5hbWU6ICdyYW5kb20nIH1cbiAgICogYGBgXG4gICAqXG4gICAqIE4uYi4gdG8gdXNlIGFuIGV4dGVybmFsIGxheW91dCBleHRlbnNpb24sIHlvdSBtdXN0IHJlZ2lzdGVyIHRoZSBleHRlbnNpb25cbiAgICogcHJpb3IgdG8gcmVuZGVyaW5nIHRoaXMgY29tcG9uZW50LCBlLmcuOlxuICAgKlxuICAgKiBgYGBcbiAgICogaW1wb3J0IEN5dG9zY2FwZSBmcm9tICdjeXRvc2NhcGUnO1xuICAgKiBpbXBvcnQgQ09TRUJpbGtlbnQgZnJvbSAnY3l0b3NjYXBlLWNvc2UtYmlsa2VudCc7XG4gICAqIGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG4gICAqIGltcG9ydCBDeXRvc2NhcGVDb21wb25lbnQgZnJvbSAnY3l0b3NjYXBlLXJlYWN0anMnO1xuICAgKlxuICAgKiBDeXRvc2NhcGUudXNlKENPU0VCaWxrZW50KTtcbiAgICpcbiAgICogY2xhc3MgTXlBcHAgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgKiAgIHJlbmRlcigpIHtcbiAgICogICAgIGNvbnN0IGVsZW1lbnRzID0gW1xuICAgKiAgICAgICB7IGRhdGE6IHsgaWQ6ICdvbmUnLCBsYWJlbDogJ05vZGUgMScgfSwgcG9zaXRpb246IHsgeDogMCwgeTogMCB9IH0sXG4gICAqICAgICAgIHsgZGF0YTogeyBpZDogJ3R3bycsIGxhYmVsOiAnTm9kZSAyJyB9LCBwb3NpdGlvbjogeyB4OiAxMDAsIHk6IDAgfSB9LFxuICAgKiAgICAgICB7IGRhdGE6IHsgc291cmNlOiAnb25lJywgdGFyZ2V0OiAndHdvJywgbGFiZWw6ICdFZGdlIGZyb20gTm9kZTEgdG8gTm9kZTInIH0gfVxuICAgKiAgICAgXTtcbiAgICpcbiAgICogICAgIGNvbnN0IGxheW91dCA9IHsgbmFtZTogJ2Nvc2UtYmlsa2VudCcgfTtcbiAgICpcbiAgICogICAgIHJldHVybiA8Q3l0b3NjYXBlQ29tcG9uZW50IGVsZW1lbnRzPXtlbGVtZW50c30gbGF5b3V0PXtsYXlvdXR9PjtcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jbGF5b3V0c1xuICAgKi9cbiAgbGF5b3V0OiBvbmVPZlR5cGUoW29iamVjdCwgYW55XSksXG5cbiAgLyoqXG4gICAqIFRoZSBwYW5uaW5nIHBvc2l0aW9uIG9mIHRoZSBncmFwaC5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvcGFuXG4gICAqL1xuICBwYW46IG9uZU9mVHlwZShbb2JqZWN0LCBhbnldKSxcblxuICAvKipcbiAgICogVGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy96b29tXG4gICAqL1xuICB6b29tOiBudW1iZXIsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBhbm5pbmcgcG9zaXRpb24gb2YgdGhlIGdyYXBoIGlzIG11dGFibGUgb3ZlcmFsbC5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvcGFubmluZ0VuYWJsZWRcbiAgICovXG4gIHBhbm5pbmdFbmFibGVkOiBib29sLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYW5uaW5nIHBvc2l0aW9uIG9mIHRoZSBncmFwaCBpcyBtdXRhYmxlIGJ5IHVzZXIgZ2VzdHVyZXMgKGUuZy4gc3dpcGUpLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy91c2VyUGFubmluZ0VuYWJsZWRcbiAgICovXG4gIHVzZXJQYW5uaW5nRW5hYmxlZDogYm9vbCxcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gem9vbSBsZXZlbCBvZiB0aGUgZ3JhcGguXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL21pblpvb21cbiAgICovXG4gIG1pblpvb206IG51bWJlcixcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gem9vbSBsZXZlbCBvZiB0aGUgZ3JhcGguXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL21heFpvb21cbiAgICovXG4gIG1heFpvb206IG51bWJlcixcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgem9vbSBsZXZlbCBvZiB0aGUgZ3JhcGggaXMgbXV0YWJsZSBvdmVyYWxsLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy96b29taW5nRW5hYmxlZFxuICAgKi9cbiAgem9vbWluZ0VuYWJsZWQ6IGJvb2wsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoIGlzIG11dGFibGUgYnkgdXNlciBnZXN0dXJlcyAoZS5nLiBwaW5jaC10by16b29tKS5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvdXNlclpvb21pbmdFbmFibGVkXG4gICAqL1xuICB1c2VyWm9vbWluZ0VuYWJsZWQ6IGJvb2wsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgc2hpZnQrY2xpY2stYW5kLWRyYWcgYm94IHNlbGVjdGlvbiBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy9ib3hTZWxlY3Rpb25FbmFibGVkXG4gICAqL1xuICBib3hTZWxlY3Rpb25FbmFibGVkOiBib29sLFxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBub2RlcyBhdXRvbWF0aWNhbGx5IGNhbiBub3QgYmUgZ3JhYmJlZCByZWdhcmRsZXNzIG9mIHdoZXRoZXJcbiAgICogZWFjaCBub2RlIGlzIG1hcmtlZCBhcyBncmFiYmFibGUuXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL2F1dG91bmdyYWJpZnlcbiAgICovXG4gIGF1dG91bmdyYWJpZnk6IGJvb2wsXG5cbiAgLyoqXG4gICAqIElmIHRydWUsIG5vZGVzIGNhbiBub3QgYmUgbW92ZWQgYXQgYWxsLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy9hdXRvbG9ja1xuICAgKi9cbiAgYXV0b2xvY2s6IGJvb2wsXG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGVsZW1lbnRzIGhhdmUgaW1tdXRhYmxlIHNlbGVjdGlvbiBzdGF0ZS5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvYXV0b3Vuc2VsZWN0aWZ5XG4gICAqL1xuICBhdXRvdW5zZWxlY3RpZnk6IGJvb2wsXG5cbiAgLyoqXG4gICAqIGBnZXQob2JqZWN0LCBrZXkpYFxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYG9iamVjdGAgYXQgdGhlIGBrZXlgLCB3aGljaCBtYXkgYmUgYW4gaW50ZWdlclxuICAgKiBpbiB0aGUgY2FzZSBvZiBsaXN0cy9hcnJheXMgb3Igc3RyaW5ncyBpbiB0aGUgY2FzZSBvZiBtYXBzL29iamVjdHMuXG4gICAqL1xuICBnZXQ6IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGB0b0pzb24ob2JqZWN0KWBcbiAgICogR2V0IHRoZSBkZWVwIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYG9iamVjdGAgYXMgbm9uLXN0cmluZ2lmaWVkIEpTT04uXG4gICAqL1xuICB0b0pzb246IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGRpZmYob2JqZWN0QSwgb2JqZWN0QilcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHR3byBvYmplY3RzIGhhdmUgZXF1YWwgdmFsdWUuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWZcbiAgICogYW5kIHdoZXJlIEN5dG9zY2FwZSBuZWVkcyB0byBiZSBwYXRjaGVkLlxuICAgKi9cbiAgZGlmZjogZnVuYyxcblxuICAvKipcbiAgICogZm9yRWFjaChsaXN0LCBpdGVyYXRvcilcbiAgICogQ2FsbCBgaXRlcmF0b3JgIG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYGxpc3RgLCBpbiBvcmRlci5cbiAgICovXG4gIGZvckVhY2g6IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGN5KGN5UmVmKVxuICAgKiBUaGUgYGN5YCBwcm9wIGFsbG93cyBmb3IgZ2V0dGluZyBhIHJlZmVyZW5jZSB0byB0aGUgYGN5YCBDeXRvc2NhcGUgb2JqZWN0LCBlLmcuOlxuICAgKlxuICAgKiBgPEN5dG9zY2FwZUNvbXBvbmVudCBjeT17Y3kgPT4gKG15Q3lSZWYgPSBjeSl9IC8+YFxuICAgKi9cbiAgY3k6IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGhlYWRsZXNzXG4gICAqIFRoZSBgaGVhZGxlc3NgIHByb3BlciBhbGxvd3MgZm9yIHNldHRpbmcgd2hldGhlciB0aGUgQ3l0b3NjYXBlIGluc3RhbmNlIGlzIGhlYWRsZXNzLCBpLmUuXG4gICAqIG5vdCByZW5kZXJlZC4gIFRoaXMgdmFsdWUgY2FuIG5vdCBiZSBjaGFuZ2VkIGFmdGVyIGluaXRpYWxpc2F0aW9uIG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBoZWFkbGVzczogYm9vbCxcblxuICAvKipcbiAgICogc3R5bGVFbmFibGVkXG4gICAqIFRoZSBgc3R5bGVFbmFibGVkYCBmbGFnIGlzIHVzZWQgdG8gZW5hYmxlIHN0eWxlIGZ1bmN0aW9uYWxpdHkgaW4gYSBoZWFkbGVzcyBpbnN0YW5jZSAoaS5lLlxuICAgKiBgaGVhZGxlc3M6IHRydWUsIHN0eWxlRW5hYmxlZDogdHJ1ZWApLiAgRm9yIGEgcmVuZGVyZWQgaW5zdGFuY2UsIGRvIG5vdCBzZXQgdGhpcyB2YWx1ZS5cbiAgICovXG4gIHN0eWxlRW5hYmxlZDogYm9vbCxcblxuICAvKipcbiAgICogaGlkZUVkZ2VzT25WaWV3cG9ydFxuICAgKiBBIHJlbmRlcmluZyBoaW50IHRoYXQgc3BlY2lmaWVzLCBmb3IgcmVuZGVyZXJzIHdoaWNoIHN1cHBvcnQgdGhlIGhpbnQsIHdoZXRoZXIgZWRnZXMgc2hvdWxkXG4gICAqIGJlIGhpZGRlbiBkdXJpbmcgem9vbSBhbmQgcGFuIG9wZXJhdGlvbnMuXG4gICAqL1xuICBoaWRlRWRnZXNPblZpZXdwb3J0OiBib29sLFxuXG4gIC8qKlxuICAgKiB0ZXh0dXJlT25WaWV3cG9ydFxuICAgKiBBIHJlbmRlcmluZyBoaW50IHRoYXQgc3BlY2lmaWVzLCBmb3IgcmVuZGVyZXJzIHdoaWNoIHN1cHBvcnQgdGhlIGhpbnQsIHdoZXRoZXIgYSBwcmV2aWV3XG4gICAqIGJhc2VkIG9uIHRoZSBleGlzdGluZyBzY2VuZSBzaG91bGQgYmUgdXNlZCBpbiBwbGFjZSBvZiBidWlsZGluZyBhIG5ldyBzY2VuZS5cbiAgICovXG4gIHRleHR1cmVPblZpZXdwb3J0OiBib29sLFxuXG4gIC8qKlxuICAgKiBtb3Rpb25CbHVyXG4gICAqIEEgcmVuZGVyaW5nIGhpbnQgdGhhdCBzcGVjaWZpZXMsIGZvciByZW5kZXJlcnMgd2hpY2ggc3VwcG9ydCB0aGUgaGludCwgd2hldGhlciBhIG1vdGlvbiBibHVyXG4gICAqIGVmZmVjdCBzaG91bGQgYmUgYXBwbGllZC5cbiAgICovXG4gIG1vdGlvbkJsdXI6IGJvb2wsXG5cbiAgLyoqXG4gICAqIG1vdGlvbkJsdXJPcGFjaXR5XG4gICAqIEEgcmVuZGVyaW5nIGhpbnQgdGhhdCBzcGVjaWZpZXMsIGZvciByZW5kZXJlcnMgd2hpY2ggc3VwcG9ydCB0aGUgaGludCwgaG93IHN0cm9uZyB0aGUgbW90aW9uXG4gICAqIGJsdXIgZWZmZWN0IHNob3VsZCBiZS4gIFRoZSB2YWx1ZSByYW5nZXMgZnJvbSAwIHRvIDEsIHdpdGggbGFyZ2VyIHZhbHVlcyBpbmRpY2F0aW5nIGxhcmdlclxuICAgKiBzdHJlbmd0aC5cbiAgICovXG4gIG1vdGlvbkJsdXJPcGFjaXR5OiBudW1iZXIsXG5cbiAgLyoqXG4gICAqIHdoZWVsU2Vuc2l0aXZpdHlcbiAgICogQSByZW5kZXJpbmcgaGludCB0aGF0IHNwZWNpZmllcywgZm9yIHJlbmRlcmVycyB3aGljaCBzdXBwb3J0IHRoZSBoaW50LCBob3cgZmFzdCB3aGVlbCB6b29taW5nXG4gICAqIHNob3VsZCBiZS4gIFRoZSB2YWx1ZSBpcyBhIHBvc2l0aXZlIG11bHRpcGxpZXIuICBEbyBub3Qgc2V0IHRoaXMgdmFsdWUgdW5sZXNzIHlvdSBhcmUgdXNpbmdcbiAgICogdW5jb252ZW50aW9uYWwgaGFyZHdhcmUgYW5kIGNhbiBndWFyYW50ZWUgdGhhdCBhbGwgeW91ciB1c2VycyB3aWxsIHVzZSB0aGUgc2FtZSBoYXJkd2FyZS4gIFRoZVxuICAgKiBkZWZhdWx0IHZhbHVlIHdvcmtzIHdlbGwgZm9yIHN0YW5kYXJkIG1pY2Ugb24gY29tbW9uIG9wZXJhdGluZyBzeXN0ZW1zLiAgSWYgeW91IGNoYW5nZSB0aGlzXG4gICAqIHZhbHVlLCBpdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IHlvdSB3aWxsIGNyZWF0ZSBhIGJhZCB1c2VyIGV4cGVyaWVuY2UgZm9yIG1hbnkgb3IgbW9zdCBvZiB5b3VyXG4gICAqIHVzZXJzLlxuICAgKi9cbiAgd2hlZWxTZW5zaXRpdml0eTogbnVtYmVyLFxuXG4gIC8qKlxuICAgKiBwaXhlbFJhdGlvXG4gICAqIEEgcmVuZGVyaW5nIGhpbnQgdGhhdCBzcGVjaWZpZXMsIGZvciByZW5kZXJlcnMgd2hpY2ggc3VwcG9ydCB0aGUgaGludCwgdGhlIHBpeGVsIHJhdGlvIHRoYXRcbiAgICogc2hvdWxkIGJlIHVzZWQuICBNYXkgYmUgJ2F1dG8nIG9yIGEgcG9zaXRpdmUgbnVtYmVyLlxuICAgKi9cbiAgcGl4ZWxSYXRpbzogb25lT2ZUeXBlKFtzdHJpbmcsIG9iamVjdF0pLFxufTtcbiIsImNvbnN0IGVpdGhlcklzTmlsID0gKGEsIGIpID0+IGEgPT0gbnVsbCB8fCBiID09IG51bGw7XG5cbmV4cG9ydCBjb25zdCBoYXNoRGlmZiA9IChhLCBiKSA9PiB7XG4gIHJldHVybiBlaXRoZXJJc05pbChhLCBiKSB8fCBhLmhhc2goKSAhPT0gYi5oYXNoKCk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2hhbGxvd09iakRpZmYgPSAoYSwgYikgPT4ge1xuICBpZiAoZWl0aGVySXNOaWwoYSwgYikgJiYgIShhID09IG51bGwgJiYgYiA9PSBudWxsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGEgPT09IGIpIHtcbiAgICAvLyBjYW4ndCBkbyBhIGRpZmYgb24gdGhlIHNhbWUgb2JqXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gbm9uLW9iamVjdCB2YWx1ZXMgY2FuIGJlIGNvbXBhcmVkIHdpdGggdGhlIGVxdWFsaXR5IG9wZXJhdG9yXG4gIGlmICh0eXBlb2YgYSAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIGIgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGEgIT09IGI7XG4gIH1cblxuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuICBjb25zdCBtaXNtYXRjaGVzID0gKGtleSkgPT4gYVtrZXldICE9PSBiW2tleV07XG5cbiAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYUtleXMuc29tZShtaXNtYXRjaGVzKSB8fCBiS2V5cy5zb21lKG1pc21hdGNoZXMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuIiwiZXhwb3J0IGNvbnN0IGdldCA9IChvYmosIGtleSkgPT4gKG9iaiAhPSBudWxsID8gb2JqW2tleV0gOiBudWxsKTtcblxuZXhwb3J0IGNvbnN0IHRvSnNvbiA9IChvYmopID0+IG9iajtcblxuZXhwb3J0IGNvbnN0IGZvckVhY2ggPSAoYXJyLCBpdGVyYXRvcikgPT4gYXJyLmZvckVhY2goaXRlcmF0b3IpO1xuIiwiaW1wb3J0IHsgc2hhbGxvd09iakRpZmYgfSBmcm9tICcuL2RpZmYnO1xuaW1wb3J0IHsgZ2V0LCB0b0pzb24sIGZvckVhY2ggfSBmcm9tICcuL2pzb24nO1xuXG5leHBvcnQgY29uc3QgaWRlbnRpdHkgPSAoeCkgPT4geDtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRzID0gW1xuICB7IGRhdGE6IHsgaWQ6ICdhJywgbGFiZWw6ICdFeGFtcGxlIG5vZGUgQScgfSB9LFxuICB7IGRhdGE6IHsgaWQ6ICdiJywgbGFiZWw6ICdFeGFtcGxlIG5vZGUgQicgfSB9LFxuICB7IGRhdGE6IHsgaWQ6ICdlJywgc291cmNlOiAnYScsIHRhcmdldDogJ2InIH0gfSxcbl07XG5cbmV4cG9ydCBjb25zdCBzdHlsZXNoZWV0ID0gW1xuICB7XG4gICAgc2VsZWN0b3I6ICdub2RlJyxcbiAgICBzdHlsZToge1xuICAgICAgbGFiZWw6ICdkYXRhKGxhYmVsKScsXG4gICAgfSxcbiAgfSxcbl07XG5cbmV4cG9ydCBjb25zdCB6b29tID0gMTtcblxuZXhwb3J0IGNvbnN0IHBhbiA9IHtcbiAgeDogMCxcbiAgeTogMCxcbn07XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0cyA9IHtcbiAgZGlmZjogc2hhbGxvd09iakRpZmYsXG4gIGdldCxcbiAgdG9Kc29uLFxuICBmb3JFYWNoLFxuICBlbGVtZW50cyxcbiAgc3R5bGVzaGVldCxcbiAgem9vbSxcbiAgcGFuLFxufTtcbiIsImltcG9ydCB7IGdldCBhcyBhdEtleSB9IGZyb20gJy4vanNvbic7XG5pbXBvcnQgeyBzaGFsbG93T2JqRGlmZiB9IGZyb20gJy4vZGlmZic7XG5cbmNvbnN0IGlzRGlmZkF0S2V5ID0gKGpzb24xLCBqc29uMiwgZGlmZiwga2V5KSA9PlxuICBkaWZmKGF0S2V5KGpzb24xLCBrZXkpLCBhdEtleShqc29uMiwga2V5KSk7XG5cbmV4cG9ydCBjb25zdCBwYXRjaCA9IChjeSwganNvbjEsIGpzb24yLCBkaWZmLCB0b0pzb24sIGdldCwgZm9yRWFjaCkgPT4ge1xuICBjeS5iYXRjaCgoKSA9PiB7XG4gICAgLy8gVGhlIHNoYWxsb3cgb2JqZWN0IGRpZmYoKSBtdXN0IGRlZmVyIHRvIHBhdGNoRWxlbWVudHMoKSBhcyBpdCBtdXN0IGNvbXBhcmUgdGhlXG4gICAgLy8gZWxlbWVudHMgYXMgYW4gdW5vcmRlcmVkIHNldC4gIEEgY3VzdG9tIGRpZmYoKSwgd2l0aCBJbW11dGFibGUgZm9yIGV4YW1wbGUsXG4gICAgLy8gY291bGQganVzdCB1c2UgYW4gZXF1YWxpdHkgY2hlY2sgKD09PSkuXG4gICAgaWYgKFxuICAgICAgZGlmZiA9PT0gc2hhbGxvd09iakRpZmYgfHxcbiAgICAgIGlzRGlmZkF0S2V5KGpzb24xLCBqc29uMiwgZGlmZiwgJ2VsZW1lbnRzJylcbiAgICApIHtcbiAgICAgIHBhdGNoRWxlbWVudHMoXG4gICAgICAgIGN5LFxuICAgICAgICBhdEtleShqc29uMSwgJ2VsZW1lbnRzJyksXG4gICAgICAgIGF0S2V5KGpzb24yLCAnZWxlbWVudHMnKSxcbiAgICAgICAgdG9Kc29uLFxuICAgICAgICBnZXQsXG4gICAgICAgIGZvckVhY2gsXG4gICAgICAgIGRpZmZcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlmZkF0S2V5KGpzb24xLCBqc29uMiwgZGlmZiwgJ3N0eWxlc2hlZXQnKSkge1xuICAgICAgcGF0Y2hTdHlsZShcbiAgICAgICAgY3ksXG4gICAgICAgIGF0S2V5KGpzb24xLCAnc3R5bGVzaGVldCcpLFxuICAgICAgICBhdEtleShqc29uMiwgJ3N0eWxlc2hlZXQnKSxcbiAgICAgICAgdG9Kc29uXG4gICAgICApO1xuICAgIH1cblxuICAgIFtcbiAgICAgIC8vIHNpbXBsZSBrZXlzIHRoYXQgY2FuIGJlIHBhdGNoZWQgZGlyZWN0bHkgKGtleSBzYW1lIGFzIGZuIG5hbWUpXG4gICAgICAnem9vbScsXG4gICAgICAnbWluWm9vbScsXG4gICAgICAnbWF4Wm9vbScsXG4gICAgICAnem9vbWluZ0VuYWJsZWQnLFxuICAgICAgJ3VzZXJab29taW5nRW5hYmxlZCcsXG4gICAgICAncGFuJyxcbiAgICAgICdwYW5uaW5nRW5hYmxlZCcsXG4gICAgICAndXNlclBhbm5pbmdFbmFibGVkJyxcbiAgICAgICdib3hTZWxlY3Rpb25FbmFibGVkJyxcbiAgICAgICdhdXRvdW5ncmFiaWZ5JyxcbiAgICAgICdhdXRvbG9jaycsXG4gICAgICAnYXV0b3Vuc2VsZWN0aWZ5JyxcbiAgICBdLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGlzRGlmZkF0S2V5KGpzb24xLCBqc29uMiwgZGlmZiwga2V5KSkge1xuICAgICAgICBwYXRjaEpzb24oY3ksIGtleSwgYXRLZXkoanNvbjEsIGtleSksIGF0S2V5KGpzb24yLCBrZXkpLCB0b0pzb24pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBpZiAoaXNEaWZmQXRLZXkoanNvbjEsIGpzb24yLCBkaWZmLCAnbGF5b3V0JykpIHtcbiAgICBwYXRjaExheW91dChjeSwgYXRLZXkoanNvbjEsICdsYXlvdXQnKSwgYXRLZXkoanNvbjIsICdsYXlvdXQnKSwgdG9Kc29uKTtcbiAgfVxufTtcblxuY29uc3QgcGF0Y2hKc29uID0gKGN5LCBrZXksIHZhbDEsIHZhbDIsIHRvSnNvbikgPT4ge1xuICBjeVtrZXldKHRvSnNvbih2YWwyKSk7XG59O1xuXG5jb25zdCBwYXRjaExheW91dCA9IChjeSwgbGF5b3V0MSwgbGF5b3V0MiwgdG9Kc29uKSA9PiB7XG4gIGNvbnN0IGxheW91dE9wdHMgPSB0b0pzb24obGF5b3V0Mik7XG5cbiAgaWYgKGxheW91dE9wdHMgIT0gbnVsbCkge1xuICAgIGN5LmxheW91dChsYXlvdXRPcHRzKS5ydW4oKTtcbiAgfVxufTtcblxuY29uc3QgcGF0Y2hTdHlsZSA9IChjeSwgc3R5bGUxLCBzdHlsZTIsIHRvSnNvbikgPT4ge1xuICBjb25zdCBzdHlsZSA9IGN5LnN0eWxlKCk7XG5cbiAgaWYgKHN0eWxlID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdHlsZS5mcm9tSnNvbih0b0pzb24oc3R5bGUyKSkudXBkYXRlKCk7XG59O1xuXG5jb25zdCBwYXRjaEVsZW1lbnRzID0gKGN5LCBlbGVzMSwgZWxlczIsIHRvSnNvbiwgZ2V0LCBmb3JFYWNoLCBkaWZmKSA9PiB7XG4gIGNvbnN0IHRvQWRkID0gW107XG4gIGNvbnN0IHRvUm0gPSBjeS5jb2xsZWN0aW9uKCk7XG4gIGNvbnN0IHRvUGF0Y2ggPSBbXTtcbiAgY29uc3QgZWxlczFNYXAgPSB7fTtcbiAgY29uc3QgZWxlczJNYXAgPSB7fTtcbiAgY29uc3QgZWxlczFIYXNJZCA9IChpZCkgPT4gZWxlczFNYXBbaWRdICE9IG51bGw7XG4gIGNvbnN0IGVsZXMySGFzSWQgPSAoaWQpID0+IGVsZXMyTWFwW2lkXSAhPSBudWxsO1xuICBjb25zdCBnZXRFbGUxID0gKGlkKSA9PiBlbGVzMU1hcFtpZF07XG4gIGNvbnN0IGdldElkID0gKGVsZSkgPT4gZ2V0KGdldChlbGUsICdkYXRhJyksICdpZCcpO1xuXG4gIGZvckVhY2goZWxlczIsIChlbGUyKSA9PiB7XG4gICAgY29uc3QgaWQgPSBnZXRJZChlbGUyKTtcblxuICAgIGVsZXMyTWFwW2lkXSA9IGVsZTI7XG4gIH0pO1xuXG4gIGlmIChlbGVzMSAhPSBudWxsKSB7XG4gICAgZm9yRWFjaChlbGVzMSwgKGVsZTEpID0+IHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0SWQoZWxlMSk7XG5cbiAgICAgIGVsZXMxTWFwW2lkXSA9IGVsZTE7XG5cbiAgICAgIGlmICghZWxlczJIYXNJZChpZCkpIHtcbiAgICAgICAgdG9SbS5tZXJnZShjeS5nZXRFbGVtZW50QnlJZChpZCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZm9yRWFjaChlbGVzMiwgKGVsZTIpID0+IHtcbiAgICBjb25zdCBpZCA9IGdldElkKGVsZTIpO1xuICAgIGNvbnN0IGVsZTEgPSBnZXRFbGUxKGlkKTtcblxuICAgIGlmIChlbGVzMUhhc0lkKGlkKSkge1xuICAgICAgdG9QYXRjaC5wdXNoKHsgZWxlMSwgZWxlMiB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9BZGQucHVzaCh0b0pzb24oZWxlMikpO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHRvUm0ubGVuZ3RoID4gMCkge1xuICAgIGN5LnJlbW92ZSh0b1JtKTtcbiAgfVxuXG4gIGlmICh0b0FkZC5sZW5ndGggPiAwKSB7XG4gICAgY3kuYWRkKHRvQWRkKTtcbiAgfVxuXG4gIHRvUGF0Y2guZm9yRWFjaCgoeyBlbGUxLCBlbGUyIH0pID0+XG4gICAgcGF0Y2hFbGVtZW50KGN5LCBlbGUxLCBlbGUyLCB0b0pzb24sIGdldCwgZGlmZilcbiAgKTtcbn07XG5cbmNvbnN0IHBhdGNoRWxlbWVudCA9IChjeSwgZWxlMSwgZWxlMiwgdG9Kc29uLCBnZXQsIGRpZmYpID0+IHtcbiAgY29uc3QgaWQgPSBnZXQoZ2V0KGVsZTIsICdkYXRhJyksICdpZCcpO1xuICBjb25zdCBjeUVsZSA9IGN5LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgY29uc3QgcGF0Y2ggPSB7fTtcbiAgY29uc3QganNvbktleXMgPSBbXG4gICAgJ2RhdGEnLFxuICAgICdwb3NpdGlvbicsXG4gICAgJ3NlbGVjdGVkJyxcbiAgICAnc2VsZWN0YWJsZScsXG4gICAgJ2xvY2tlZCcsXG4gICAgJ2dyYWJiYWJsZScsXG4gICAgJ2NsYXNzZXMnLFxuICBdO1xuXG4gIGpzb25LZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IGRhdGEyID0gZ2V0KGVsZTIsIGtleSk7XG5cbiAgICBpZiAoZGlmZihkYXRhMiwgZ2V0KGVsZTEsIGtleSkpKSB7XG4gICAgICBwYXRjaFtrZXldID0gdG9Kc29uKGRhdGEyKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHNjcmF0Y2gyID0gZ2V0KGVsZTIsICdzY3JhdGNoJyk7XG4gIGlmIChkaWZmKHNjcmF0Y2gyLCBnZXQoZWxlMSwgJ3NjcmF0Y2gnKSkpIHtcbiAgICBjeUVsZS5zY3JhdGNoKHRvSnNvbihzY3JhdGNoMikpO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKHBhdGNoKS5sZW5ndGggPiAwKSB7XG4gICAgY3lFbGUuanNvbihwYXRjaCk7XG4gIH1cbn07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHlwZXMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGRlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cyc7XG5pbXBvcnQgQ3l0b3NjYXBlIGZyb20gJ2N5dG9zY2FwZSc7XG5pbXBvcnQgeyBwYXRjaCB9IGZyb20gJy4vcGF0Y2gnO1xuXG4vKipcbiAqIFRoZSBgQ3l0b3NjYXBlQ29tcG9uZW50YCBpcyBhIFJlYWN0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBmb3IgdGhlIGRlY2xhcmF0aXZlIGNyZWF0aW9uXG4gKiBhbmQgbW9kaWZpY2F0aW9uIG9mIGEgQ3l0b3NjYXBlIGluc3RhbmNlLCBhIGdyYXBoIHZpc3VhbGlzYXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN5dG9zY2FwZUNvbXBvbmVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcFR5cGVzKCkge1xuICAgIHJldHVybiB0eXBlcztcbiAgfVxuXG4gIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BzKCkge1xuICAgIHJldHVybiBkZWZhdWx0cztcbiAgfVxuXG4gIHN0YXRpYyBub3JtYWxpemVFbGVtZW50cyhlbGVtZW50cykge1xuICAgIGNvbnN0IGlzQXJyYXkgPSBlbGVtZW50cy5sZW5ndGggIT0gbnVsbDtcblxuICAgIGlmIChpc0FycmF5KSB7XG4gICAgICByZXR1cm4gZWxlbWVudHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB7IG5vZGVzLCBlZGdlcyB9ID0gZWxlbWVudHM7XG5cbiAgICAgIGlmIChub2RlcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVzID0gW107XG4gICAgICB9XG5cbiAgICAgIGlmIChlZGdlcyA9PSBudWxsKSB7XG4gICAgICAgIGVkZ2VzID0gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2Rlcy5jb25jYXQoZWRnZXMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuZGlzcGxheU5hbWUgPSAnQ3l0b3NjYXBlQ29tcG9uZW50JztcbiAgICB0aGlzLmNvbnRhaW5lclJlZiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb250YWluZXJSZWYuY3VycmVudDtcblxuICAgIGNvbnN0IHtcbiAgICAgIGdsb2JhbCxcbiAgICAgIGhlYWRsZXNzLFxuICAgICAgc3R5bGVFbmFibGVkLFxuICAgICAgaGlkZUVkZ2VzT25WaWV3cG9ydCxcbiAgICAgIHRleHR1cmVPblZpZXdwb3J0LFxuICAgICAgbW90aW9uQmx1cixcbiAgICAgIG1vdGlvbkJsdXJPcGFjaXR5LFxuICAgICAgd2hlZWxTZW5zaXRpdml0eSxcbiAgICAgIHBpeGVsUmF0aW8sXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBjb25zdCBjeSA9ICh0aGlzLl9jeSA9IG5ldyBDeXRvc2NhcGUoe1xuICAgICAgY29udGFpbmVyLFxuICAgICAgaGVhZGxlc3MsXG4gICAgICBzdHlsZUVuYWJsZWQsXG4gICAgICBoaWRlRWRnZXNPblZpZXdwb3J0LFxuICAgICAgdGV4dHVyZU9uVmlld3BvcnQsXG4gICAgICBtb3Rpb25CbHVyLFxuICAgICAgbW90aW9uQmx1ck9wYWNpdHksXG4gICAgICB3aGVlbFNlbnNpdGl2aXR5LFxuICAgICAgcGl4ZWxSYXRpbyxcbiAgICB9KSk7XG5cbiAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICB3aW5kb3dbZ2xvYmFsXSA9IGN5O1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQ3l0b3NjYXBlKG51bGwsIHRoaXMucHJvcHMpO1xuICB9XG5cbiAgdXBkYXRlQ3l0b3NjYXBlKHByZXZQcm9wcywgbmV3UHJvcHMpIHtcbiAgICBjb25zdCBjeSA9IHRoaXMuX2N5O1xuICAgIGNvbnN0IHsgZGlmZiwgdG9Kc29uLCBnZXQsIGZvckVhY2ggfSA9IG5ld1Byb3BzO1xuXG4gICAgcGF0Y2goY3ksIHByZXZQcm9wcywgbmV3UHJvcHMsIGRpZmYsIHRvSnNvbiwgZ2V0LCBmb3JFYWNoKTtcblxuICAgIGlmIChuZXdQcm9wcy5jeSAhPSBudWxsKSB7XG4gICAgICBuZXdQcm9wcy5jeShjeSk7XG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgIHRoaXMudXBkYXRlQ3l0b3NjYXBlKHByZXZQcm9wcywgdGhpcy5wcm9wcyk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLl9jeS5kZXN0cm95KCk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBpZCwgY2xhc3NOYW1lLCBzdHlsZSB9ID0gdGhpcy5wcm9wcztcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCdkaXYnLCB7XG4gICAgICByZWY6IHRoaXMuY29udGFpbmVyUmVmLFxuICAgICAgaWQsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBzdHlsZSxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuY29uc3QgQ29udGV4dEtleSA9IFN5bWJvbC5mb3IoYHJlYWN0LXJlZHV4LWNvbnRleHRgKTtcbmNvbnN0IGdUID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWxUaGlzIDpcbi8qIGZhbGwgYmFjayB0byBhIHBlci1tb2R1bGUgc2NvcGUgKHByZS04LjEgYmVoYXZpb3VyKSBpZiBgZ2xvYmFsVGhpc2AgaXMgbm90IGF2YWlsYWJsZSAqL1xue307XG5cbmZ1bmN0aW9uIGdldENvbnRleHQoKSB7XG4gIHZhciBfZ1QkQ29udGV4dEtleTtcblxuICBpZiAoIVJlYWN0LmNyZWF0ZUNvbnRleHQpIHJldHVybiB7fTtcbiAgY29uc3QgY29udGV4dE1hcCA9IChfZ1QkQ29udGV4dEtleSA9IGdUW0NvbnRleHRLZXldKSAhPSBudWxsID8gX2dUJENvbnRleHRLZXkgOiBnVFtDb250ZXh0S2V5XSA9IG5ldyBNYXAoKTtcbiAgbGV0IHJlYWxDb250ZXh0ID0gY29udGV4dE1hcC5nZXQoUmVhY3QuY3JlYXRlQ29udGV4dCk7XG5cbiAgaWYgKCFyZWFsQ29udGV4dCkge1xuICAgIHJlYWxDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICByZWFsQ29udGV4dC5kaXNwbGF5TmFtZSA9ICdSZWFjdFJlZHV4JztcbiAgICB9XG5cbiAgICBjb250ZXh0TWFwLnNldChSZWFjdC5jcmVhdGVDb250ZXh0LCByZWFsQ29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gcmVhbENvbnRleHQ7XG59XG5cbmV4cG9ydCBjb25zdCBSZWFjdFJlZHV4Q29udGV4dCA9IC8qI19fUFVSRV9fKi9nZXRDb250ZXh0KCk7XG5leHBvcnQgZGVmYXVsdCBSZWFjdFJlZHV4Q29udGV4dDsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBSZWFjdFJlZHV4Q29udGV4dCB9IGZyb20gJy4vQ29udGV4dCc7XG5pbXBvcnQgeyBjcmVhdGVTdWJzY3JpcHRpb24gfSBmcm9tICcuLi91dGlscy9TdWJzY3JpcHRpb24nO1xuaW1wb3J0IHsgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCB9IGZyb20gJy4uL3V0aWxzL3VzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QnO1xuXG5mdW5jdGlvbiBQcm92aWRlcih7XG4gIHN0b3JlLFxuICBjb250ZXh0LFxuICBjaGlsZHJlbixcbiAgc2VydmVyU3RhdGUsXG4gIHN0YWJpbGl0eUNoZWNrID0gJ29uY2UnLFxuICBub29wQ2hlY2sgPSAnb25jZSdcbn0pIHtcbiAgY29uc3QgY29udGV4dFZhbHVlID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gY3JlYXRlU3Vic2NyaXB0aW9uKHN0b3JlKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RvcmUsXG4gICAgICBzdWJzY3JpcHRpb24sXG4gICAgICBnZXRTZXJ2ZXJTdGF0ZTogc2VydmVyU3RhdGUgPyAoKSA9PiBzZXJ2ZXJTdGF0ZSA6IHVuZGVmaW5lZCxcbiAgICAgIHN0YWJpbGl0eUNoZWNrLFxuICAgICAgbm9vcENoZWNrXG4gICAgfTtcbiAgfSwgW3N0b3JlLCBzZXJ2ZXJTdGF0ZSwgc3RhYmlsaXR5Q2hlY2ssIG5vb3BDaGVja10pO1xuICBjb25zdCBwcmV2aW91c1N0YXRlID0gUmVhY3QudXNlTWVtbygoKSA9PiBzdG9yZS5nZXRTdGF0ZSgpLCBbc3RvcmVdKTtcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgc3Vic2NyaXB0aW9uXG4gICAgfSA9IGNvbnRleHRWYWx1ZTtcbiAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IHN1YnNjcmlwdGlvbi5ub3RpZnlOZXN0ZWRTdWJzO1xuICAgIHN1YnNjcmlwdGlvbi50cnlTdWJzY3JpYmUoKTtcblxuICAgIGlmIChwcmV2aW91c1N0YXRlICE9PSBzdG9yZS5nZXRTdGF0ZSgpKSB7XG4gICAgICBzdWJzY3JpcHRpb24ubm90aWZ5TmVzdGVkU3VicygpO1xuICAgIH1cblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBzdWJzY3JpcHRpb24udHJ5VW5zdWJzY3JpYmUoKTtcbiAgICAgIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlID0gdW5kZWZpbmVkO1xuICAgIH07XG4gIH0sIFtjb250ZXh0VmFsdWUsIHByZXZpb3VzU3RhdGVdKTtcbiAgY29uc3QgQ29udGV4dCA9IGNvbnRleHQgfHwgUmVhY3RSZWR1eENvbnRleHQ7IC8vIEB0cy1pZ25vcmUgJ0FueUFjdGlvbicgaXMgYXNzaWduYWJsZSB0byB0aGUgY29uc3RyYWludCBvZiB0eXBlICdBJywgYnV0ICdBJyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlXG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogY29udGV4dFZhbHVlXG4gIH0sIGNoaWxkcmVuKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUHJvdmlkZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIjtcbmNvbnN0IF9leGNsdWRlZCA9IFtcInJlYWN0UmVkdXhGb3J3YXJkZWRSZWZcIl07XG5cbi8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbmltcG9ydCBob2lzdFN0YXRpY3MgZnJvbSAnaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaXNWYWxpZEVsZW1lbnRUeXBlLCBpc0NvbnRleHRDb25zdW1lciB9IGZyb20gJ3JlYWN0LWlzJztcbmltcG9ydCBkZWZhdWx0U2VsZWN0b3JGYWN0b3J5IGZyb20gJy4uL2Nvbm5lY3Qvc2VsZWN0b3JGYWN0b3J5JztcbmltcG9ydCB7IG1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcnkgfSBmcm9tICcuLi9jb25uZWN0L21hcERpc3BhdGNoVG9Qcm9wcyc7XG5pbXBvcnQgeyBtYXBTdGF0ZVRvUHJvcHNGYWN0b3J5IH0gZnJvbSAnLi4vY29ubmVjdC9tYXBTdGF0ZVRvUHJvcHMnO1xuaW1wb3J0IHsgbWVyZ2VQcm9wc0ZhY3RvcnkgfSBmcm9tICcuLi9jb25uZWN0L21lcmdlUHJvcHMnO1xuaW1wb3J0IHsgY3JlYXRlU3Vic2NyaXB0aW9uIH0gZnJvbSAnLi4vdXRpbHMvU3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgfSBmcm9tICcuLi91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0JztcbmltcG9ydCBzaGFsbG93RXF1YWwgZnJvbSAnLi4vdXRpbHMvc2hhbGxvd0VxdWFsJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL3V0aWxzL3dhcm5pbmcnO1xuaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuL0NvbnRleHQnO1xuaW1wb3J0IHsgbm90SW5pdGlhbGl6ZWQgfSBmcm9tICcuLi91dGlscy91c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG5sZXQgdXNlU3luY0V4dGVybmFsU3RvcmUgPSBub3RJbml0aWFsaXplZDtcbmV4cG9ydCBjb25zdCBpbml0aWFsaXplQ29ubmVjdCA9IGZuID0+IHtcbiAgdXNlU3luY0V4dGVybmFsU3RvcmUgPSBmbjtcbn07IC8vIERlZmluZSBzb21lIGNvbnN0YW50IGFycmF5cyBqdXN0IHRvIGF2b2lkIHJlLWNyZWF0aW5nIHRoZXNlXG5cbmNvbnN0IEVNUFRZX0FSUkFZID0gW251bGwsIDBdO1xuY29uc3QgTk9fU1VCU0NSSVBUSU9OX0FSUkFZID0gW251bGwsIG51bGxdOyAvLyBBdHRlbXB0cyB0byBzdHJpbmdpZnkgd2hhdGV2ZXIgbm90LXJlYWxseS1hLWNvbXBvbmVudCB2YWx1ZSB3ZSB3ZXJlIGdpdmVuXG4vLyBmb3IgbG9nZ2luZyBpbiBhbiBlcnJvciBtZXNzYWdlXG5cbmNvbnN0IHN0cmluZ2lmeUNvbXBvbmVudCA9IENvbXAgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShDb21wKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIFN0cmluZyhDb21wKTtcbiAgfVxufTtcblxuLy8gVGhpcyBpcyBcImp1c3RcIiBhIGB1c2VMYXlvdXRFZmZlY3RgLCBidXQgd2l0aCB0d28gbW9kaWZpY2F0aW9uczpcbi8vIC0gd2UgbmVlZCB0byBmYWxsIGJhY2sgdG8gYHVzZUVmZmVjdGAgaW4gU1NSIHRvIGF2b2lkIGFubm95aW5nIHdhcm5pbmdzXG4vLyAtIHdlIGV4dHJhY3QgdGhpcyB0byBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGF2b2lkIGNsb3Npbmcgb3ZlciB2YWx1ZXNcbi8vICAgYW5kIGNhdXNpbmcgbWVtb3J5IGxlYWtzXG5mdW5jdGlvbiB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0V2l0aEFyZ3MoZWZmZWN0RnVuYywgZWZmZWN0QXJncywgZGVwZW5kZW5jaWVzKSB7XG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4gZWZmZWN0RnVuYyguLi5lZmZlY3RBcmdzKSwgZGVwZW5kZW5jaWVzKTtcbn0gLy8gRWZmZWN0IGNhbGxiYWNrLCBleHRyYWN0ZWQ6IGFzc2lnbiB0aGUgbGF0ZXN0IHByb3BzIHZhbHVlcyB0byByZWZzIGZvciBsYXRlciB1c2FnZVxuXG5cbmZ1bmN0aW9uIGNhcHR1cmVXcmFwcGVyUHJvcHMobGFzdFdyYXBwZXJQcm9wcywgbGFzdENoaWxkUHJvcHMsIHJlbmRlcklzU2NoZWR1bGVkLCB3cmFwcGVyUHJvcHMsIC8vIGFjdHVhbENoaWxkUHJvcHM6IHVua25vd24sXG5jaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLCBub3RpZnlOZXN0ZWRTdWJzKSB7XG4gIC8vIFdlIHdhbnQgdG8gY2FwdHVyZSB0aGUgd3JhcHBlciBwcm9wcyBhbmQgY2hpbGQgcHJvcHMgd2UgdXNlZCBmb3IgbGF0ZXIgY29tcGFyaXNvbnNcbiAgbGFzdFdyYXBwZXJQcm9wcy5jdXJyZW50ID0gd3JhcHBlclByb3BzO1xuICByZW5kZXJJc1NjaGVkdWxlZC5jdXJyZW50ID0gZmFsc2U7IC8vIElmIHRoZSByZW5kZXIgd2FzIGZyb20gYSBzdG9yZSB1cGRhdGUsIGNsZWFyIG91dCB0aGF0IHJlZmVyZW5jZSBhbmQgY2FzY2FkZSB0aGUgc3Vic2NyaWJlciB1cGRhdGVcblxuICBpZiAoY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50KSB7XG4gICAgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50ID0gbnVsbDtcbiAgICBub3RpZnlOZXN0ZWRTdWJzKCk7XG4gIH1cbn0gLy8gRWZmZWN0IGNhbGxiYWNrLCBleHRyYWN0ZWQ6IHN1YnNjcmliZSB0byB0aGUgUmVkdXggc3RvcmUgb3IgbmVhcmVzdCBjb25uZWN0ZWQgYW5jZXN0b3IsXG4vLyBjaGVjayBmb3IgdXBkYXRlcyBhZnRlciBkaXNwYXRjaGVkIGFjdGlvbnMsIGFuZCB0cmlnZ2VyIHJlLXJlbmRlcnMuXG5cblxuZnVuY3Rpb24gc3Vic2NyaWJlVXBkYXRlcyhzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMsIHN0b3JlLCBzdWJzY3JpcHRpb24sIGNoaWxkUHJvcHNTZWxlY3RvciwgbGFzdFdyYXBwZXJQcm9wcywgbGFzdENoaWxkUHJvcHMsIHJlbmRlcklzU2NoZWR1bGVkLCBpc01vdW50ZWQsIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUsIG5vdGlmeU5lc3RlZFN1YnMsIC8vIGZvcmNlQ29tcG9uZW50VXBkYXRlRGlzcGF0Y2g6IFJlYWN0LkRpc3BhdGNoPGFueT4sXG5hZGRpdGlvbmFsU3Vic2NyaWJlTGlzdGVuZXIpIHtcbiAgLy8gSWYgd2UncmUgbm90IHN1YnNjcmliZWQgdG8gdGhlIHN0b3JlLCBub3RoaW5nIHRvIGRvIGhlcmVcbiAgaWYgKCFzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMpIHJldHVybiAoKSA9PiB7fTsgLy8gQ2FwdHVyZSB2YWx1ZXMgZm9yIGNoZWNraW5nIGlmIGFuZCB3aGVuIHRoaXMgY29tcG9uZW50IHVubW91bnRzXG5cbiAgbGV0IGRpZFVuc3Vic2NyaWJlID0gZmFsc2U7XG4gIGxldCBsYXN0VGhyb3duRXJyb3IgPSBudWxsOyAvLyBXZSdsbCBydW4gdGhpcyBjYWxsYmFjayBldmVyeSB0aW1lIGEgc3RvcmUgc3Vic2NyaXB0aW9uIHVwZGF0ZSBwcm9wYWdhdGVzIHRvIHRoaXMgY29tcG9uZW50XG5cbiAgY29uc3QgY2hlY2tGb3JVcGRhdGVzID0gKCkgPT4ge1xuICAgIGlmIChkaWRVbnN1YnNjcmliZSB8fCAhaXNNb3VudGVkLmN1cnJlbnQpIHtcbiAgICAgIC8vIERvbid0IHJ1biBzdGFsZSBsaXN0ZW5lcnMuXG4gICAgICAvLyBSZWR1eCBkb2Vzbid0IGd1YXJhbnRlZSB1bnN1YnNjcmlwdGlvbnMgaGFwcGVuIHVudGlsIG5leHQgZGlzcGF0Y2guXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBUT0RPIFdlJ3JlIGN1cnJlbnRseSBjYWxsaW5nIGdldFN0YXRlIG91cnNlbHZlcyBoZXJlLCByYXRoZXIgdGhhbiBsZXR0aW5nIGB1U0VTYCBkbyBpdFxuXG5cbiAgICBjb25zdCBsYXRlc3RTdG9yZVN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBsZXQgbmV3Q2hpbGRQcm9wcywgZXJyb3I7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQWN0dWFsbHkgcnVuIHRoZSBzZWxlY3RvciB3aXRoIHRoZSBtb3N0IHJlY2VudCBzdG9yZSBzdGF0ZSBhbmQgd3JhcHBlciBwcm9wc1xuICAgICAgLy8gdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIGNoaWxkIHByb3BzIHNob3VsZCBiZVxuICAgICAgbmV3Q2hpbGRQcm9wcyA9IGNoaWxkUHJvcHNTZWxlY3RvcihsYXRlc3RTdG9yZVN0YXRlLCBsYXN0V3JhcHBlclByb3BzLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yID0gZTtcbiAgICAgIGxhc3RUaHJvd25FcnJvciA9IGU7XG4gICAgfVxuXG4gICAgaWYgKCFlcnJvcikge1xuICAgICAgbGFzdFRocm93bkVycm9yID0gbnVsbDtcbiAgICB9IC8vIElmIHRoZSBjaGlsZCBwcm9wcyBoYXZlbid0IGNoYW5nZWQsIG5vdGhpbmcgdG8gZG8gaGVyZSAtIGNhc2NhZGUgdGhlIHN1YnNjcmlwdGlvbiB1cGRhdGVcblxuXG4gICAgaWYgKG5ld0NoaWxkUHJvcHMgPT09IGxhc3RDaGlsZFByb3BzLmN1cnJlbnQpIHtcbiAgICAgIGlmICghcmVuZGVySXNTY2hlZHVsZWQuY3VycmVudCkge1xuICAgICAgICBub3RpZnlOZXN0ZWRTdWJzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNhdmUgcmVmZXJlbmNlcyB0byB0aGUgbmV3IGNoaWxkIHByb3BzLiAgTm90ZSB0aGF0IHdlIHRyYWNrIHRoZSBcImNoaWxkIHByb3BzIGZyb20gc3RvcmUgdXBkYXRlXCJcbiAgICAgIC8vIGFzIGEgcmVmIGluc3RlYWQgb2YgYSB1c2VTdGF0ZS91c2VSZWR1Y2VyIGJlY2F1c2Ugd2UgbmVlZCBhIHdheSB0byBkZXRlcm1pbmUgaWYgdGhhdCB2YWx1ZSBoYXNcbiAgICAgIC8vIGJlZW4gcHJvY2Vzc2VkLiAgSWYgdGhpcyB3ZW50IGludG8gdXNlU3RhdGUvdXNlUmVkdWNlciwgd2UgY291bGRuJ3QgY2xlYXIgb3V0IHRoZSB2YWx1ZSB3aXRob3V0XG4gICAgICAvLyBmb3JjaW5nIGFub3RoZXIgcmUtcmVuZGVyLCB3aGljaCB3ZSBkb24ndCB3YW50LlxuICAgICAgbGFzdENoaWxkUHJvcHMuY3VycmVudCA9IG5ld0NoaWxkUHJvcHM7XG4gICAgICBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQgPSBuZXdDaGlsZFByb3BzO1xuICAgICAgcmVuZGVySXNTY2hlZHVsZWQuY3VycmVudCA9IHRydWU7IC8vIFRPRE8gVGhpcyBpcyBoYWNreSBhbmQgbm90IGhvdyBgdVNFU2AgaXMgbWVhbnQgdG8gYmUgdXNlZFxuICAgICAgLy8gVHJpZ2dlciB0aGUgUmVhY3QgYHVzZVN5bmNFeHRlcm5hbFN0b3JlYCBzdWJzY3JpYmVyXG5cbiAgICAgIGFkZGl0aW9uYWxTdWJzY3JpYmVMaXN0ZW5lcigpO1xuICAgIH1cbiAgfTsgLy8gQWN0dWFsbHkgc3Vic2NyaWJlIHRvIHRoZSBuZWFyZXN0IGNvbm5lY3RlZCBhbmNlc3RvciAob3Igc3RvcmUpXG5cblxuICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IGNoZWNrRm9yVXBkYXRlcztcbiAgc3Vic2NyaXB0aW9uLnRyeVN1YnNjcmliZSgpOyAvLyBQdWxsIGRhdGEgZnJvbSB0aGUgc3RvcmUgYWZ0ZXIgZmlyc3QgcmVuZGVyIGluIGNhc2UgdGhlIHN0b3JlIGhhc1xuICAvLyBjaGFuZ2VkIHNpbmNlIHdlIGJlZ2FuLlxuXG4gIGNoZWNrRm9yVXBkYXRlcygpO1xuXG4gIGNvbnN0IHVuc3Vic2NyaWJlV3JhcHBlciA9ICgpID0+IHtcbiAgICBkaWRVbnN1YnNjcmliZSA9IHRydWU7XG4gICAgc3Vic2NyaXB0aW9uLnRyeVVuc3Vic2NyaWJlKCk7XG4gICAgc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UgPSBudWxsO1xuXG4gICAgaWYgKGxhc3RUaHJvd25FcnJvcikge1xuICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHdlIGNhdWdodCBhbiBlcnJvciBkdWUgdG8gYSBiYWQgbWFwU3RhdGUgZnVuY3Rpb24sIGJ1dCB0aGVcbiAgICAgIC8vIHBhcmVudCByZS1yZW5kZXJlZCB3aXRob3V0IHRoaXMgY29tcG9uZW50IGFuZCB3ZSdyZSBhYm91dCB0byB1bm1vdW50LlxuICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGFzIGxvbmcgYXMgd2UgZG8gdG9wLWRvd24gc3Vic2NyaXB0aW9ucyBjb3JyZWN0bHksIGJ1dFxuICAgICAgLy8gaWYgd2UgZXZlciBkbyB0aG9zZSB3cm9uZywgdGhpcyB0aHJvdyB3aWxsIHN1cmZhY2UgdGhlIGVycm9yIGluIG91ciB0ZXN0cy5cbiAgICAgIC8vIEluIHRoYXQgY2FzZSwgdGhyb3cgdGhlIGVycm9yIGZyb20gaGVyZSBzbyBpdCBkb2Vzbid0IGdldCBsb3N0LlxuICAgICAgdGhyb3cgbGFzdFRocm93bkVycm9yO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gdW5zdWJzY3JpYmVXcmFwcGVyO1xufSAvLyBSZWR1Y2VyIGluaXRpYWwgc3RhdGUgY3JlYXRpb24gZm9yIG91ciB1cGRhdGUgcmVkdWNlclxuXG5cbmNvbnN0IGluaXRTdGF0ZVVwZGF0ZXMgPSAoKSA9PiBFTVBUWV9BUlJBWTtcblxuZnVuY3Rpb24gc3RyaWN0RXF1YWwoYSwgYikge1xuICByZXR1cm4gYSA9PT0gYjtcbn1cbi8qKlxyXG4gKiBJbmZlcnMgdGhlIHR5cGUgb2YgcHJvcHMgdGhhdCBhIGNvbm5lY3RvciB3aWxsIGluamVjdCBpbnRvIGEgY29tcG9uZW50LlxyXG4gKi9cblxuXG5sZXQgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkUHVyZU9wdGlvbiA9IGZhbHNlO1xuLyoqXHJcbiAqIENvbm5lY3RzIGEgUmVhY3QgY29tcG9uZW50IHRvIGEgUmVkdXggc3RvcmUuXHJcbiAqXHJcbiAqIC0gV2l0aG91dCBhcmd1bWVudHMsIGp1c3Qgd3JhcHMgdGhlIGNvbXBvbmVudCwgd2l0aG91dCBjaGFuZ2luZyB0aGUgYmVoYXZpb3IgLyBwcm9wc1xyXG4gKlxyXG4gKiAtIElmIDIgcGFyYW1zIGFyZSBwYXNzZWQgKDNyZCBwYXJhbSwgbWVyZ2VQcm9wcywgaXMgc2tpcHBlZCksIGRlZmF1bHQgYmVoYXZpb3JcclxuICogaXMgdG8gb3ZlcnJpZGUgb3duUHJvcHMgKGFzIHN0YXRlZCBpbiB0aGUgZG9jcyksIHNvIHdoYXQgcmVtYWlucyBpcyBldmVyeXRoaW5nIHRoYXQnc1xyXG4gKiBub3QgYSBzdGF0ZSBvciBkaXNwYXRjaCBwcm9wXHJcbiAqXHJcbiAqIC0gV2hlbiAzcmQgcGFyYW0gaXMgcGFzc2VkLCB3ZSBkb24ndCBrbm93IGlmIG93blByb3BzIHByb3BhZ2F0ZSBhbmQgd2hldGhlciB0aGV5XHJcbiAqIHNob3VsZCBiZSB2YWxpZCBjb21wb25lbnQgcHJvcHMsIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBtZXJnZVByb3BzIGltcGxlbWVudGF0aW9uLlxyXG4gKiBBcyBzdWNoLCBpdCBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGV4dGVuZCBvd25Qcm9wcyBpbnRlcmZhY2UgZnJvbSBzdGF0ZSBvclxyXG4gKiBkaXNwYXRjaCBwcm9wcyBvciBib3RoIHdoZW4gYXBwbGljYWJsZVxyXG4gKlxyXG4gKiBAcGFyYW0gbWFwU3RhdGVUb1Byb3BzIEEgZnVuY3Rpb24gdGhhdCBleHRyYWN0cyB2YWx1ZXMgZnJvbSBzdGF0ZVxyXG4gKiBAcGFyYW0gbWFwRGlzcGF0Y2hUb1Byb3BzIFNldHVwIGZvciBkaXNwYXRjaGluZyBhY3Rpb25zXHJcbiAqIEBwYXJhbSBtZXJnZVByb3BzIE9wdGlvbmFsIGNhbGxiYWNrIHRvIG1lcmdlIHN0YXRlIGFuZCBkaXNwYXRjaCBwcm9wcyB0b2dldGhlclxyXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgY29ubmVjdGlvblxyXG4gKlxyXG4gKi9cblxuZnVuY3Rpb24gY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywge1xuICAvLyBUaGUgYHB1cmVgIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkLCBzbyBUUyBkb2Vzbid0IGxpa2UgdXMgZGVzdHJ1Y3R1cmluZyB0aGlzIHRvIGNoZWNrIGl0cyBleGlzdGVuY2UuXG4gIC8vIEB0cy1pZ25vcmVcbiAgcHVyZSxcbiAgYXJlU3RhdGVzRXF1YWwgPSBzdHJpY3RFcXVhbCxcbiAgYXJlT3duUHJvcHNFcXVhbCA9IHNoYWxsb3dFcXVhbCxcbiAgYXJlU3RhdGVQcm9wc0VxdWFsID0gc2hhbGxvd0VxdWFsLFxuICBhcmVNZXJnZWRQcm9wc0VxdWFsID0gc2hhbGxvd0VxdWFsLFxuICAvLyB1c2UgUmVhY3QncyBmb3J3YXJkUmVmIHRvIGV4cG9zZSBhIHJlZiBvZiB0aGUgd3JhcHBlZCBjb21wb25lbnRcbiAgZm9yd2FyZFJlZiA9IGZhbHNlLFxuICAvLyB0aGUgY29udGV4dCBjb25zdW1lciB0byB1c2VcbiAgY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0XG59ID0ge30pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAocHVyZSAhPT0gdW5kZWZpbmVkICYmICFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRQdXJlT3B0aW9uKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRQdXJlT3B0aW9uID0gdHJ1ZTtcbiAgICAgIHdhcm5pbmcoJ1RoZSBgcHVyZWAgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQuIGBjb25uZWN0YCBpcyBub3cgYWx3YXlzIGEgXCJwdXJlL21lbW9pemVkXCIgY29tcG9uZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgQ29udGV4dCA9IGNvbnRleHQ7XG4gIGNvbnN0IGluaXRNYXBTdGF0ZVRvUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHNGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcyk7XG4gIGNvbnN0IGluaXRNYXBEaXNwYXRjaFRvUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3J5KG1hcERpc3BhdGNoVG9Qcm9wcyk7XG4gIGNvbnN0IGluaXRNZXJnZVByb3BzID0gbWVyZ2VQcm9wc0ZhY3RvcnkobWVyZ2VQcm9wcyk7XG4gIGNvbnN0IHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyA9IEJvb2xlYW4obWFwU3RhdGVUb1Byb3BzKTtcblxuICBjb25zdCB3cmFwV2l0aENvbm5lY3QgPSBXcmFwcGVkQ29tcG9uZW50ID0+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhaXNWYWxpZEVsZW1lbnRUeXBlKFdyYXBwZWRDb21wb25lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFlvdSBtdXN0IHBhc3MgYSBjb21wb25lbnQgdG8gdGhlIGZ1bmN0aW9uIHJldHVybmVkIGJ5IGNvbm5lY3QuIEluc3RlYWQgcmVjZWl2ZWQgJHtzdHJpbmdpZnlDb21wb25lbnQoV3JhcHBlZENvbXBvbmVudCl9YCk7XG4gICAgfVxuXG4gICAgY29uc3Qgd3JhcHBlZENvbXBvbmVudE5hbWUgPSBXcmFwcGVkQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IFdyYXBwZWRDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JztcbiAgICBjb25zdCBkaXNwbGF5TmFtZSA9IGBDb25uZWN0KCR7d3JhcHBlZENvbXBvbmVudE5hbWV9KWA7XG4gICAgY29uc3Qgc2VsZWN0b3JGYWN0b3J5T3B0aW9ucyA9IHtcbiAgICAgIHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyxcbiAgICAgIGRpc3BsYXlOYW1lLFxuICAgICAgd3JhcHBlZENvbXBvbmVudE5hbWUsXG4gICAgICBXcmFwcGVkQ29tcG9uZW50LFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgaW5pdE1hcFN0YXRlVG9Qcm9wcyxcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGluaXRNYXBEaXNwYXRjaFRvUHJvcHMsXG4gICAgICBpbml0TWVyZ2VQcm9wcyxcbiAgICAgIGFyZVN0YXRlc0VxdWFsLFxuICAgICAgYXJlU3RhdGVQcm9wc0VxdWFsLFxuICAgICAgYXJlT3duUHJvcHNFcXVhbCxcbiAgICAgIGFyZU1lcmdlZFByb3BzRXF1YWxcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gQ29ubmVjdEZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICBjb25zdCBbcHJvcHNDb250ZXh0LCByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmLCB3cmFwcGVyUHJvcHNdID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgICAgIC8vIERpc3Rpbmd1aXNoIGJldHdlZW4gYWN0dWFsIFwiZGF0YVwiIHByb3BzIHRoYXQgd2VyZSBwYXNzZWQgdG8gdGhlIHdyYXBwZXIgY29tcG9uZW50LFxuICAgICAgICAvLyBhbmQgdmFsdWVzIG5lZWRlZCB0byBjb250cm9sIGJlaGF2aW9yIChmb3J3YXJkZWQgcmVmcywgYWx0ZXJuYXRlIGNvbnRleHQgaW5zdGFuY2VzKS5cbiAgICAgICAgLy8gVG8gbWFpbnRhaW4gdGhlIHdyYXBwZXJQcm9wcyBvYmplY3QgcmVmZXJlbmNlLCBtZW1vaXplIHRoaXMgZGVzdHJ1Y3R1cmluZy5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWZcbiAgICAgICAgfSA9IHByb3BzLFxuICAgICAgICAgICAgICB3cmFwcGVyUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShwcm9wcywgX2V4Y2x1ZGVkKTtcblxuICAgICAgICByZXR1cm4gW3Byb3BzLmNvbnRleHQsIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWYsIHdyYXBwZXJQcm9wc107XG4gICAgICB9LCBbcHJvcHNdKTtcbiAgICAgIGNvbnN0IENvbnRleHRUb1VzZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICAvLyBVc2VycyBtYXkgb3B0aW9uYWxseSBwYXNzIGluIGEgY3VzdG9tIGNvbnRleHQgaW5zdGFuY2UgdG8gdXNlIGluc3RlYWQgb2Ygb3VyIFJlYWN0UmVkdXhDb250ZXh0LlxuICAgICAgICAvLyBNZW1vaXplIHRoZSBjaGVjayB0aGF0IGRldGVybWluZXMgd2hpY2ggY29udGV4dCBpbnN0YW5jZSB3ZSBzaG91bGQgdXNlLlxuICAgICAgICByZXR1cm4gcHJvcHNDb250ZXh0ICYmIHByb3BzQ29udGV4dC5Db25zdW1lciAmJiAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlzQ29udGV4dENvbnN1bWVyKCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChwcm9wc0NvbnRleHQuQ29uc3VtZXIsIG51bGwpKSA/IHByb3BzQ29udGV4dCA6IENvbnRleHQ7XG4gICAgICB9LCBbcHJvcHNDb250ZXh0LCBDb250ZXh0XSk7IC8vIFJldHJpZXZlIHRoZSBzdG9yZSBhbmQgYW5jZXN0b3Igc3Vic2NyaXB0aW9uIHZpYSBjb250ZXh0LCBpZiBhdmFpbGFibGVcblxuICAgICAgY29uc3QgY29udGV4dFZhbHVlID0gUmVhY3QudXNlQ29udGV4dChDb250ZXh0VG9Vc2UpOyAvLyBUaGUgc3RvcmUgX211c3RfIGV4aXN0IGFzIGVpdGhlciBhIHByb3Agb3IgaW4gY29udGV4dC5cbiAgICAgIC8vIFdlJ2xsIGNoZWNrIHRvIHNlZSBpZiBpdCBfbG9va3NfIGxpa2UgYSBSZWR1eCBzdG9yZSBmaXJzdC5cbiAgICAgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIHBhc3MgdGhyb3VnaCBhIGBzdG9yZWAgcHJvcCB0aGF0IGlzIGp1c3QgYSBwbGFpbiB2YWx1ZS5cblxuICAgICAgY29uc3QgZGlkU3RvcmVDb21lRnJvbVByb3BzID0gQm9vbGVhbihwcm9wcy5zdG9yZSkgJiYgQm9vbGVhbihwcm9wcy5zdG9yZS5nZXRTdGF0ZSkgJiYgQm9vbGVhbihwcm9wcy5zdG9yZS5kaXNwYXRjaCk7XG4gICAgICBjb25zdCBkaWRTdG9yZUNvbWVGcm9tQ29udGV4dCA9IEJvb2xlYW4oY29udGV4dFZhbHVlKSAmJiBCb29sZWFuKGNvbnRleHRWYWx1ZS5zdG9yZSk7XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFkaWRTdG9yZUNvbWVGcm9tUHJvcHMgJiYgIWRpZFN0b3JlQ29tZUZyb21Db250ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgXCJzdG9yZVwiIGluIHRoZSBjb250ZXh0IG9mIGAgKyBgXCIke2Rpc3BsYXlOYW1lfVwiLiBFaXRoZXIgd3JhcCB0aGUgcm9vdCBjb21wb25lbnQgaW4gYSA8UHJvdmlkZXI+LCBgICsgYG9yIHBhc3MgYSBjdXN0b20gUmVhY3QgY29udGV4dCBwcm92aWRlciB0byA8UHJvdmlkZXI+IGFuZCB0aGUgY29ycmVzcG9uZGluZyBgICsgYFJlYWN0IGNvbnRleHQgY29uc3VtZXIgdG8gJHtkaXNwbGF5TmFtZX0gaW4gY29ubmVjdCBvcHRpb25zLmApO1xuICAgICAgfSAvLyBCYXNlZCBvbiB0aGUgcHJldmlvdXMgY2hlY2ssIG9uZSBvZiB0aGVzZSBtdXN0IGJlIHRydWVcblxuXG4gICAgICBjb25zdCBzdG9yZSA9IGRpZFN0b3JlQ29tZUZyb21Qcm9wcyA/IHByb3BzLnN0b3JlIDogY29udGV4dFZhbHVlLnN0b3JlO1xuICAgICAgY29uc3QgZ2V0U2VydmVyU3RhdGUgPSBkaWRTdG9yZUNvbWVGcm9tQ29udGV4dCA/IGNvbnRleHRWYWx1ZS5nZXRTZXJ2ZXJTdGF0ZSA6IHN0b3JlLmdldFN0YXRlO1xuICAgICAgY29uc3QgY2hpbGRQcm9wc1NlbGVjdG9yID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgICAgIC8vIFRoZSBjaGlsZCBwcm9wcyBzZWxlY3RvciBuZWVkcyB0aGUgc3RvcmUgcmVmZXJlbmNlIGFzIGFuIGlucHV0LlxuICAgICAgICAvLyBSZS1jcmVhdGUgdGhpcyBzZWxlY3RvciB3aGVuZXZlciB0aGUgc3RvcmUgY2hhbmdlcy5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRTZWxlY3RvckZhY3Rvcnkoc3RvcmUuZGlzcGF0Y2gsIHNlbGVjdG9yRmFjdG9yeU9wdGlvbnMpO1xuICAgICAgfSwgW3N0b3JlXSk7XG4gICAgICBjb25zdCBbc3Vic2NyaXB0aW9uLCBub3RpZnlOZXN0ZWRTdWJzXSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBpZiAoIXNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcykgcmV0dXJuIE5PX1NVQlNDUklQVElPTl9BUlJBWTsgLy8gVGhpcyBTdWJzY3JpcHRpb24ncyBzb3VyY2Ugc2hvdWxkIG1hdGNoIHdoZXJlIHN0b3JlIGNhbWUgZnJvbTogcHJvcHMgdnMuIGNvbnRleHQuIEEgY29tcG9uZW50XG4gICAgICAgIC8vIGNvbm5lY3RlZCB0byB0aGUgc3RvcmUgdmlhIHByb3BzIHNob3VsZG4ndCB1c2Ugc3Vic2NyaXB0aW9uIGZyb20gY29udGV4dCwgb3IgdmljZSB2ZXJzYS5cblxuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBjcmVhdGVTdWJzY3JpcHRpb24oc3RvcmUsIGRpZFN0b3JlQ29tZUZyb21Qcm9wcyA/IHVuZGVmaW5lZCA6IGNvbnRleHRWYWx1ZS5zdWJzY3JpcHRpb24pOyAvLyBgbm90aWZ5TmVzdGVkU3Vic2AgaXMgZHVwbGljYXRlZCB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGNvbXBvbmVudCBpcyB1bm1vdW50ZWQgaW5cbiAgICAgICAgLy8gdGhlIG1pZGRsZSBvZiB0aGUgbm90aWZpY2F0aW9uIGxvb3AsIHdoZXJlIGBzdWJzY3JpcHRpb25gIHdpbGwgdGhlbiBiZSBudWxsLiBUaGlzIGNhblxuICAgICAgICAvLyBwcm9iYWJseSBiZSBhdm9pZGVkIGlmIFN1YnNjcmlwdGlvbidzIGxpc3RlbmVycyBsb2dpYyBpcyBjaGFuZ2VkIHRvIG5vdCBjYWxsIGxpc3RlbmVyc1xuICAgICAgICAvLyB0aGF0IGhhdmUgYmVlbiB1bnN1YnNjcmliZWQgaW4gdGhlICBtaWRkbGUgb2YgdGhlIG5vdGlmaWNhdGlvbiBsb29wLlxuXG4gICAgICAgIGNvbnN0IG5vdGlmeU5lc3RlZFN1YnMgPSBzdWJzY3JpcHRpb24ubm90aWZ5TmVzdGVkU3Vicy5iaW5kKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIHJldHVybiBbc3Vic2NyaXB0aW9uLCBub3RpZnlOZXN0ZWRTdWJzXTtcbiAgICAgIH0sIFtzdG9yZSwgZGlkU3RvcmVDb21lRnJvbVByb3BzLCBjb250ZXh0VmFsdWVdKTsgLy8gRGV0ZXJtaW5lIHdoYXQge3N0b3JlLCBzdWJzY3JpcHRpb259IHZhbHVlIHNob3VsZCBiZSBwdXQgaW50byBuZXN0ZWQgY29udGV4dCwgaWYgbmVjZXNzYXJ5LFxuICAgICAgLy8gYW5kIG1lbW9pemUgdGhhdCB2YWx1ZSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBjb250ZXh0IHVwZGF0ZXMuXG5cbiAgICAgIGNvbnN0IG92ZXJyaWRkZW5Db250ZXh0VmFsdWUgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICAgICAgaWYgKGRpZFN0b3JlQ29tZUZyb21Qcm9wcykge1xuICAgICAgICAgIC8vIFRoaXMgY29tcG9uZW50IGlzIGRpcmVjdGx5IHN1YnNjcmliZWQgdG8gYSBzdG9yZSBmcm9tIHByb3BzLlxuICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgZGVzY2VuZGFudHMgcmVhZGluZyBmcm9tIHRoaXMgc3RvcmUgLSBwYXNzIGRvd24gd2hhdGV2ZXJcbiAgICAgICAgICAvLyB0aGUgZXhpc3RpbmcgY29udGV4dCB2YWx1ZSBpcyBmcm9tIHRoZSBuZWFyZXN0IGNvbm5lY3RlZCBhbmNlc3Rvci5cbiAgICAgICAgICByZXR1cm4gY29udGV4dFZhbHVlO1xuICAgICAgICB9IC8vIE90aGVyd2lzZSwgcHV0IHRoaXMgY29tcG9uZW50J3Mgc3Vic2NyaXB0aW9uIGluc3RhbmNlIGludG8gY29udGV4dCwgc28gdGhhdFxuICAgICAgICAvLyBjb25uZWN0ZWQgZGVzY2VuZGFudHMgd29uJ3QgdXBkYXRlIHVudGlsIGFmdGVyIHRoaXMgY29tcG9uZW50IGlzIGRvbmVcblxuXG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgY29udGV4dFZhbHVlLCB7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfSwgW2RpZFN0b3JlQ29tZUZyb21Qcm9wcywgY29udGV4dFZhbHVlLCBzdWJzY3JpcHRpb25dKTsgLy8gU2V0IHVwIHJlZnMgdG8gY29vcmRpbmF0ZSB2YWx1ZXMgYmV0d2VlbiB0aGUgc3Vic2NyaXB0aW9uIGVmZmVjdCBhbmQgdGhlIHJlbmRlciBsb2dpY1xuXG4gICAgICBjb25zdCBsYXN0Q2hpbGRQcm9wcyA9IFJlYWN0LnVzZVJlZigpO1xuICAgICAgY29uc3QgbGFzdFdyYXBwZXJQcm9wcyA9IFJlYWN0LnVzZVJlZih3cmFwcGVyUHJvcHMpO1xuICAgICAgY29uc3QgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSA9IFJlYWN0LnVzZVJlZigpO1xuICAgICAgY29uc3QgcmVuZGVySXNTY2hlZHVsZWQgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICAgICAgY29uc3QgaXNQcm9jZXNzaW5nRGlzcGF0Y2ggPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICAgICAgY29uc3QgaXNNb3VudGVkID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgICAgIGNvbnN0IGxhdGVzdFN1YnNjcmlwdGlvbkNhbGxiYWNrRXJyb3IgPSBSZWFjdC51c2VSZWYoKTtcbiAgICAgIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpc01vdW50ZWQuY3VycmVudCA9IHRydWU7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgaXNNb3VudGVkLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgIH0sIFtdKTtcbiAgICAgIGNvbnN0IGFjdHVhbENoaWxkUHJvcHNTZWxlY3RvciA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBjb25zdCBzZWxlY3RvciA9ICgpID0+IHtcbiAgICAgICAgICAvLyBUcmlja3kgbG9naWMgaGVyZTpcbiAgICAgICAgICAvLyAtIFRoaXMgcmVuZGVyIG1heSBoYXZlIGJlZW4gdHJpZ2dlcmVkIGJ5IGEgUmVkdXggc3RvcmUgdXBkYXRlIHRoYXQgcHJvZHVjZWQgbmV3IGNoaWxkIHByb3BzXG4gICAgICAgICAgLy8gLSBIb3dldmVyLCB3ZSBtYXkgaGF2ZSBnb3R0ZW4gbmV3IHdyYXBwZXIgcHJvcHMgYWZ0ZXIgdGhhdFxuICAgICAgICAgIC8vIElmIHdlIGhhdmUgbmV3IGNoaWxkIHByb3BzLCBhbmQgdGhlIHNhbWUgd3JhcHBlciBwcm9wcywgd2Uga25vdyB3ZSBzaG91bGQgdXNlIHRoZSBuZXcgY2hpbGQgcHJvcHMgYXMtaXMuXG4gICAgICAgICAgLy8gQnV0LCBpZiB3ZSBoYXZlIG5ldyB3cmFwcGVyIHByb3BzLCB0aG9zZSBtaWdodCBjaGFuZ2UgdGhlIGNoaWxkIHByb3BzLCBzbyB3ZSBoYXZlIHRvIHJlY2FsY3VsYXRlIHRoaW5ncy5cbiAgICAgICAgICAvLyBTbywgd2UnbGwgdXNlIHRoZSBjaGlsZCBwcm9wcyBmcm9tIHN0b3JlIHVwZGF0ZSBvbmx5IGlmIHRoZSB3cmFwcGVyIHByb3BzIGFyZSB0aGUgc2FtZSBhcyBsYXN0IHRpbWUuXG4gICAgICAgICAgaWYgKGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudCAmJiB3cmFwcGVyUHJvcHMgPT09IGxhc3RXcmFwcGVyUHJvcHMuY3VycmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudDtcbiAgICAgICAgICB9IC8vIFRPRE8gV2UncmUgcmVhZGluZyB0aGUgc3RvcmUgZGlyZWN0bHkgaW4gcmVuZGVyKCkgaGVyZS4gQmFkIGlkZWE/XG4gICAgICAgICAgLy8gVGhpcyB3aWxsIGxpa2VseSBjYXVzZSBCYWQgVGhpbmdzIChUTSkgdG8gaGFwcGVuIGluIENvbmN1cnJlbnQgTW9kZS5cbiAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgZG8gdGhpcyBiZWNhdXNlIG9uIHJlbmRlcnMgX25vdF8gY2F1c2VkIGJ5IHN0b3JlIHVwZGF0ZXMsIHdlIG5lZWQgdGhlIGxhdGVzdCBzdG9yZSBzdGF0ZVxuICAgICAgICAgIC8vIHRvIGRldGVybWluZSB3aGF0IHRoZSBjaGlsZCBwcm9wcyBzaG91bGQgYmUuXG5cblxuICAgICAgICAgIHJldHVybiBjaGlsZFByb3BzU2VsZWN0b3Ioc3RvcmUuZ2V0U3RhdGUoKSwgd3JhcHBlclByb3BzKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gc2VsZWN0b3I7XG4gICAgICB9LCBbc3RvcmUsIHdyYXBwZXJQcm9wc10pOyAvLyBXZSBuZWVkIHRoaXMgdG8gZXhlY3V0ZSBzeW5jaHJvbm91c2x5IGV2ZXJ5IHRpbWUgd2UgcmUtcmVuZGVyLiBIb3dldmVyLCBSZWFjdCB3YXJuc1xuICAgICAgLy8gYWJvdXQgdXNlTGF5b3V0RWZmZWN0IGluIFNTUiwgc28gd2UgdHJ5IHRvIGRldGVjdCBlbnZpcm9ubWVudCBhbmQgZmFsbCBiYWNrIHRvXG4gICAgICAvLyBqdXN0IHVzZUVmZmVjdCBpbnN0ZWFkIHRvIGF2b2lkIHRoZSB3YXJuaW5nLCBzaW5jZSBuZWl0aGVyIHdpbGwgcnVuIGFueXdheS5cblxuICAgICAgY29uc3Qgc3Vic2NyaWJlRm9yUmVhY3QgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3Vic2NyaWJlID0gcmVhY3RMaXN0ZW5lciA9PiB7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlVXBkYXRlcyhzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMsIHN0b3JlLCBzdWJzY3JpcHRpb24sIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBjaGlsZFByb3BzU2VsZWN0b3IsIGxhc3RXcmFwcGVyUHJvcHMsIGxhc3RDaGlsZFByb3BzLCByZW5kZXJJc1NjaGVkdWxlZCwgaXNNb3VudGVkLCBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLCBub3RpZnlOZXN0ZWRTdWJzLCByZWFjdExpc3RlbmVyKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gc3Vic2NyaWJlO1xuICAgICAgfSwgW3N1YnNjcmlwdGlvbl0pO1xuICAgICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdFdpdGhBcmdzKGNhcHR1cmVXcmFwcGVyUHJvcHMsIFtsYXN0V3JhcHBlclByb3BzLCBsYXN0Q2hpbGRQcm9wcywgcmVuZGVySXNTY2hlZHVsZWQsIHdyYXBwZXJQcm9wcywgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSwgbm90aWZ5TmVzdGVkU3Vic10pO1xuICAgICAgbGV0IGFjdHVhbENoaWxkUHJvcHM7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGFjdHVhbENoaWxkUHJvcHMgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZSggLy8gVE9ETyBXZSdyZSBwYXNzaW5nIHRocm91Z2ggYSBiaWcgd3JhcHBlciB0aGF0IGRvZXMgYSBidW5jaCBvZiBleHRyYSBzaWRlIGVmZmVjdHMgYmVzaWRlcyBzdWJzY3JpYmluZ1xuICAgICAgICBzdWJzY3JpYmVGb3JSZWFjdCwgLy8gVE9ETyBUaGlzIGlzIGluY3JlZGlibHkgaGFja3kuIFdlJ3ZlIGFscmVhZHkgcHJvY2Vzc2VkIHRoZSBzdG9yZSB1cGRhdGUgYW5kIGNhbGN1bGF0ZWQgbmV3IGNoaWxkIHByb3BzLFxuICAgICAgICAvLyBUT0RPIGFuZCB3ZSdyZSBqdXN0IHBhc3NpbmcgdGhhdCB0aHJvdWdoIHNvIGl0IHRyaWdnZXJzIGEgcmUtcmVuZGVyIGZvciB1cyByYXRoZXIgdGhhbiByZWx5aW5nIG9uIGB1U0VTYC5cbiAgICAgICAgYWN0dWFsQ2hpbGRQcm9wc1NlbGVjdG9yLCBnZXRTZXJ2ZXJTdGF0ZSA/ICgpID0+IGNoaWxkUHJvcHNTZWxlY3RvcihnZXRTZXJ2ZXJTdGF0ZSgpLCB3cmFwcGVyUHJvcHMpIDogYWN0dWFsQ2hpbGRQcm9wc1NlbGVjdG9yKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAobGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvci5jdXJyZW50KSB7XG4gICAgICAgICAgO1xuICAgICAgICAgIGVyci5tZXNzYWdlICs9IGBcXG5UaGUgZXJyb3IgbWF5IGJlIGNvcnJlbGF0ZWQgd2l0aCB0aGlzIHByZXZpb3VzIGVycm9yOlxcbiR7bGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvci5jdXJyZW50LnN0YWNrfVxcblxcbmA7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG5cbiAgICAgIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgICBsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGFzdENoaWxkUHJvcHMuY3VycmVudCA9IGFjdHVhbENoaWxkUHJvcHM7XG4gICAgICB9KTsgLy8gTm93IHRoYXQgYWxsIHRoYXQncyBkb25lLCB3ZSBjYW4gZmluYWxseSB0cnkgdG8gYWN0dWFsbHkgcmVuZGVyIHRoZSBjaGlsZCBjb21wb25lbnQuXG4gICAgICAvLyBXZSBtZW1vaXplIHRoZSBlbGVtZW50cyBmb3IgdGhlIHJlbmRlcmVkIGNoaWxkIGNvbXBvbmVudCBhcyBhbiBvcHRpbWl6YXRpb24uXG5cbiAgICAgIGNvbnN0IHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudCA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgYWN0dWFsQ2hpbGRQcm9wcywge1xuICAgICAgICAgICAgcmVmOiByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG4gICAgICB9LCBbcmVhY3RSZWR1eEZvcndhcmRlZFJlZiwgV3JhcHBlZENvbXBvbmVudCwgYWN0dWFsQ2hpbGRQcm9wc10pOyAvLyBJZiBSZWFjdCBzZWVzIHRoZSBleGFjdCBzYW1lIGVsZW1lbnQgcmVmZXJlbmNlIGFzIGxhc3QgdGltZSwgaXQgYmFpbHMgb3V0IG9mIHJlLXJlbmRlcmluZ1xuICAgICAgLy8gdGhhdCBjaGlsZCwgc2FtZSBhcyBpZiBpdCB3YXMgd3JhcHBlZCBpbiBSZWFjdC5tZW1vKCkgb3IgcmV0dXJuZWQgZmFsc2UgZnJvbSBzaG91bGRDb21wb25lbnRVcGRhdGUuXG5cbiAgICAgIGNvbnN0IHJlbmRlcmVkQ2hpbGQgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICAgICAgaWYgKHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcykge1xuICAgICAgICAgIC8vIElmIHRoaXMgY29tcG9uZW50IGlzIHN1YnNjcmliZWQgdG8gc3RvcmUgdXBkYXRlcywgd2UgbmVlZCB0byBwYXNzIGl0cyBvd25cbiAgICAgICAgICAvLyBzdWJzY3JpcHRpb24gaW5zdGFuY2UgZG93biB0byBvdXIgZGVzY2VuZGFudHMuIFRoYXQgbWVhbnMgcmVuZGVyaW5nIHRoZSBzYW1lXG4gICAgICAgICAgLy8gQ29udGV4dCBpbnN0YW5jZSwgYW5kIHB1dHRpbmcgYSBkaWZmZXJlbnQgdmFsdWUgaW50byB0aGUgY29udGV4dC5cbiAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGV4dFRvVXNlLlByb3ZpZGVyLCB7XG4gICAgICAgICAgICB2YWx1ZTogb3ZlcnJpZGRlbkNvbnRleHRWYWx1ZVxuICAgICAgICAgIH0sIHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVuZGVyZWRXcmFwcGVkQ29tcG9uZW50O1xuICAgICAgfSwgW0NvbnRleHRUb1VzZSwgcmVuZGVyZWRXcmFwcGVkQ29tcG9uZW50LCBvdmVycmlkZGVuQ29udGV4dFZhbHVlXSk7XG4gICAgICByZXR1cm4gcmVuZGVyZWRDaGlsZDtcbiAgICB9XG5cbiAgICBjb25zdCBfQ29ubmVjdCA9IFJlYWN0Lm1lbW8oQ29ubmVjdEZ1bmN0aW9uKTtcblxuICAgIC8vIEFkZCBhIGhhY2t5IGNhc3QgdG8gZ2V0IHRoZSByaWdodCBvdXRwdXQgdHlwZVxuICAgIGNvbnN0IENvbm5lY3QgPSBfQ29ubmVjdDtcbiAgICBDb25uZWN0LldyYXBwZWRDb21wb25lbnQgPSBXcmFwcGVkQ29tcG9uZW50O1xuICAgIENvbm5lY3QuZGlzcGxheU5hbWUgPSBDb25uZWN0RnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcblxuICAgIGlmIChmb3J3YXJkUmVmKSB7XG4gICAgICBjb25zdCBfZm9yd2FyZGVkID0gUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBmb3J3YXJkQ29ubmVjdFJlZihwcm9wcywgcmVmKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbm5lY3QsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgICAgIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWY6IHJlZlxuICAgICAgICB9KSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZm9yd2FyZGVkID0gX2ZvcndhcmRlZDtcbiAgICAgIGZvcndhcmRlZC5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuICAgICAgZm9yd2FyZGVkLldyYXBwZWRDb21wb25lbnQgPSBXcmFwcGVkQ29tcG9uZW50O1xuICAgICAgcmV0dXJuIGhvaXN0U3RhdGljcyhmb3J3YXJkZWQsIFdyYXBwZWRDb21wb25lbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBob2lzdFN0YXRpY3MoQ29ubmVjdCwgV3JhcHBlZENvbXBvbmVudCk7XG4gIH07XG5cbiAgcmV0dXJuIHdyYXBXaXRoQ29ubmVjdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdDsiLCJleHBvcnQgZnVuY3Rpb24gY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkoYXJnLCBuYW1lKSB7XG4gIHJldHVybiAoZGlzcGF0Y2gsIG9wdGlvbnMpID0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWUgb2YgdHlwZSAke3R5cGVvZiBhcmd9IGZvciAke25hbWV9IGFyZ3VtZW50IHdoZW4gY29ubmVjdGluZyBjb21wb25lbnQgJHtvcHRpb25zLndyYXBwZWRDb21wb25lbnROYW1lfS5gKTtcbiAgfTtcbn0iLCJpbXBvcnQgYmluZEFjdGlvbkNyZWF0b3JzIGZyb20gJy4uL3V0aWxzL2JpbmRBY3Rpb25DcmVhdG9ycyc7XG5pbXBvcnQgeyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50LCB3cmFwTWFwVG9Qcm9wc0Z1bmMgfSBmcm9tICcuL3dyYXBNYXBUb1Byb3BzJztcbmltcG9ydCB7IGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5IH0gZnJvbSAnLi9pbnZhbGlkQXJnRmFjdG9yeSc7XG5leHBvcnQgZnVuY3Rpb24gbWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yeShtYXBEaXNwYXRjaFRvUHJvcHMpIHtcbiAgcmV0dXJuIG1hcERpc3BhdGNoVG9Qcm9wcyAmJiB0eXBlb2YgbWFwRGlzcGF0Y2hUb1Byb3BzID09PSAnb2JqZWN0JyA/IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoZGlzcGF0Y2ggPT4gLy8gQHRzLWlnbm9yZVxuICBiaW5kQWN0aW9uQ3JlYXRvcnMobWFwRGlzcGF0Y2hUb1Byb3BzLCBkaXNwYXRjaCkpIDogIW1hcERpc3BhdGNoVG9Qcm9wcyA/IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoZGlzcGF0Y2ggPT4gKHtcbiAgICBkaXNwYXRjaFxuICB9KSkgOiB0eXBlb2YgbWFwRGlzcGF0Y2hUb1Byb3BzID09PSAnZnVuY3Rpb24nID8gLy8gQHRzLWlnbm9yZVxuICB3cmFwTWFwVG9Qcm9wc0Z1bmMobWFwRGlzcGF0Y2hUb1Byb3BzLCAnbWFwRGlzcGF0Y2hUb1Byb3BzJykgOiBjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeShtYXBEaXNwYXRjaFRvUHJvcHMsICdtYXBEaXNwYXRjaFRvUHJvcHMnKTtcbn0iLCJpbXBvcnQgeyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50LCB3cmFwTWFwVG9Qcm9wc0Z1bmMgfSBmcm9tICcuL3dyYXBNYXBUb1Byb3BzJztcbmltcG9ydCB7IGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5IH0gZnJvbSAnLi9pbnZhbGlkQXJnRmFjdG9yeSc7XG5leHBvcnQgZnVuY3Rpb24gbWFwU3RhdGVUb1Byb3BzRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMpIHtcbiAgcmV0dXJuICFtYXBTdGF0ZVRvUHJvcHMgPyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KCgpID0+ICh7fSkpIDogdHlwZW9mIG1hcFN0YXRlVG9Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/IC8vIEB0cy1pZ25vcmVcbiAgd3JhcE1hcFRvUHJvcHNGdW5jKG1hcFN0YXRlVG9Qcm9wcywgJ21hcFN0YXRlVG9Qcm9wcycpIDogY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCAnbWFwU3RhdGVUb1Byb3BzJyk7XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgdmVyaWZ5UGxhaW5PYmplY3QgZnJvbSAnLi4vdXRpbHMvdmVyaWZ5UGxhaW5PYmplY3QnO1xuaW1wb3J0IHsgY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkgfSBmcm9tICcuL2ludmFsaWRBcmdGYWN0b3J5JztcbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0TWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcykge1xuICAvLyBAdHMtaWdub3JlXG4gIHJldHVybiBfZXh0ZW5kcyh7fSwgb3duUHJvcHMsIHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBNZXJnZVByb3BzRnVuYyhtZXJnZVByb3BzKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbml0TWVyZ2VQcm9wc1Byb3h5KGRpc3BhdGNoLCB7XG4gICAgZGlzcGxheU5hbWUsXG4gICAgYXJlTWVyZ2VkUHJvcHNFcXVhbFxuICB9KSB7XG4gICAgbGV0IGhhc1J1bk9uY2UgPSBmYWxzZTtcbiAgICBsZXQgbWVyZ2VkUHJvcHM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlUHJvcHNQcm94eShzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcykge1xuICAgICAgY29uc3QgbmV4dE1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG5cbiAgICAgIGlmIChoYXNSdW5PbmNlKSB7XG4gICAgICAgIGlmICghYXJlTWVyZ2VkUHJvcHNFcXVhbChuZXh0TWVyZ2VkUHJvcHMsIG1lcmdlZFByb3BzKSkgbWVyZ2VkUHJvcHMgPSBuZXh0TWVyZ2VkUHJvcHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYXNSdW5PbmNlID0gdHJ1ZTtcbiAgICAgICAgbWVyZ2VkUHJvcHMgPSBuZXh0TWVyZ2VkUHJvcHM7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB2ZXJpZnlQbGFpbk9iamVjdChtZXJnZWRQcm9wcywgZGlzcGxheU5hbWUsICdtZXJnZVByb3BzJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgICB9O1xuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUHJvcHNGYWN0b3J5KG1lcmdlUHJvcHMpIHtcbiAgcmV0dXJuICFtZXJnZVByb3BzID8gKCkgPT4gZGVmYXVsdE1lcmdlUHJvcHMgOiB0eXBlb2YgbWVyZ2VQcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/IHdyYXBNZXJnZVByb3BzRnVuYyhtZXJnZVByb3BzKSA6IGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5KG1lcmdlUHJvcHMsICdtZXJnZVByb3BzJyk7XG59IiwiaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlXCI7XG5jb25zdCBfZXhjbHVkZWQgPSBbXCJpbml0TWFwU3RhdGVUb1Byb3BzXCIsIFwiaW5pdE1hcERpc3BhdGNoVG9Qcm9wc1wiLCBcImluaXRNZXJnZVByb3BzXCJdO1xuaW1wb3J0IHZlcmlmeVN1YnNlbGVjdG9ycyBmcm9tICcuL3ZlcmlmeVN1YnNlbGVjdG9ycyc7XG5leHBvcnQgZnVuY3Rpb24gcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIGRpc3BhdGNoLCB7XG4gIGFyZVN0YXRlc0VxdWFsLFxuICBhcmVPd25Qcm9wc0VxdWFsLFxuICBhcmVTdGF0ZVByb3BzRXF1YWxcbn0pIHtcbiAgbGV0IGhhc1J1bkF0TGVhc3RPbmNlID0gZmFsc2U7XG4gIGxldCBzdGF0ZTtcbiAgbGV0IG93blByb3BzO1xuICBsZXQgc3RhdGVQcm9wcztcbiAgbGV0IGRpc3BhdGNoUHJvcHM7XG4gIGxldCBtZXJnZWRQcm9wcztcblxuICBmdW5jdGlvbiBoYW5kbGVGaXJzdENhbGwoZmlyc3RTdGF0ZSwgZmlyc3RPd25Qcm9wcykge1xuICAgIHN0YXRlID0gZmlyc3RTdGF0ZTtcbiAgICBvd25Qcm9wcyA9IGZpcnN0T3duUHJvcHM7XG4gICAgc3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuICAgIGRpc3BhdGNoUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG93blByb3BzKTtcbiAgICBtZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuICAgIGhhc1J1bkF0TGVhc3RPbmNlID0gdHJ1ZTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVOZXdQcm9wc0FuZE5ld1N0YXRlKCkge1xuICAgIHN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcbiAgICBpZiAobWFwRGlzcGF0Y2hUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSBkaXNwYXRjaFByb3BzID0gbWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVOZXdQcm9wcygpIHtcbiAgICBpZiAobWFwU3RhdGVUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSBzdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgaWYgKG1hcERpc3BhdGNoVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgZGlzcGF0Y2hQcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTmV3U3RhdGUoKSB7XG4gICAgY29uc3QgbmV4dFN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcbiAgICBjb25zdCBzdGF0ZVByb3BzQ2hhbmdlZCA9ICFhcmVTdGF0ZVByb3BzRXF1YWwobmV4dFN0YXRlUHJvcHMsIHN0YXRlUHJvcHMpO1xuICAgIHN0YXRlUHJvcHMgPSBuZXh0U3RhdGVQcm9wcztcbiAgICBpZiAoc3RhdGVQcm9wc0NoYW5nZWQpIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlU3Vic2VxdWVudENhbGxzKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKSB7XG4gICAgY29uc3QgcHJvcHNDaGFuZ2VkID0gIWFyZU93blByb3BzRXF1YWwobmV4dE93blByb3BzLCBvd25Qcm9wcyk7XG4gICAgY29uc3Qgc3RhdGVDaGFuZ2VkID0gIWFyZVN0YXRlc0VxdWFsKG5leHRTdGF0ZSwgc3RhdGUsIG5leHRPd25Qcm9wcywgb3duUHJvcHMpO1xuICAgIHN0YXRlID0gbmV4dFN0YXRlO1xuICAgIG93blByb3BzID0gbmV4dE93blByb3BzO1xuICAgIGlmIChwcm9wc0NoYW5nZWQgJiYgc3RhdGVDaGFuZ2VkKSByZXR1cm4gaGFuZGxlTmV3UHJvcHNBbmROZXdTdGF0ZSgpO1xuICAgIGlmIChwcm9wc0NoYW5nZWQpIHJldHVybiBoYW5kbGVOZXdQcm9wcygpO1xuICAgIGlmIChzdGF0ZUNoYW5nZWQpIHJldHVybiBoYW5kbGVOZXdTdGF0ZSgpO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBwdXJlRmluYWxQcm9wc1NlbGVjdG9yKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKSB7XG4gICAgcmV0dXJuIGhhc1J1bkF0TGVhc3RPbmNlID8gaGFuZGxlU3Vic2VxdWVudENhbGxzKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKSA6IGhhbmRsZUZpcnN0Q2FsbChuZXh0U3RhdGUsIG5leHRPd25Qcm9wcyk7XG4gIH07XG59XG4vLyBUT0RPOiBBZGQgbW9yZSBjb21tZW50c1xuLy8gVGhlIHNlbGVjdG9yIHJldHVybmVkIGJ5IHNlbGVjdG9yRmFjdG9yeSB3aWxsIG1lbW9pemUgaXRzIHJlc3VsdHMsXG4vLyBhbGxvd2luZyBjb25uZWN0J3Mgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHRvIHJldHVybiBmYWxzZSBpZiBmaW5hbFxuLy8gcHJvcHMgaGF2ZSBub3QgY2hhbmdlZC5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkoZGlzcGF0Y2gsIF9yZWYpIHtcbiAgbGV0IHtcbiAgICBpbml0TWFwU3RhdGVUb1Byb3BzLFxuICAgIGluaXRNYXBEaXNwYXRjaFRvUHJvcHMsXG4gICAgaW5pdE1lcmdlUHJvcHNcbiAgfSA9IF9yZWYsXG4gICAgICBvcHRpb25zID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZiwgX2V4Y2x1ZGVkKTtcblxuICBjb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSBpbml0TWFwU3RhdGVUb1Byb3BzKGRpc3BhdGNoLCBvcHRpb25zKTtcbiAgY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3B0aW9ucyk7XG4gIGNvbnN0IG1lcmdlUHJvcHMgPSBpbml0TWVyZ2VQcm9wcyhkaXNwYXRjaCwgb3B0aW9ucyk7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2ZXJpZnlTdWJzZWxlY3RvcnMobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMpO1xuICB9XG5cbiAgcmV0dXJuIHB1cmVGaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzLCBkaXNwYXRjaCwgb3B0aW9ucyk7XG59IiwiaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi4vdXRpbHMvd2FybmluZyc7XG5cbmZ1bmN0aW9uIHZlcmlmeShzZWxlY3RvciwgbWV0aG9kTmFtZSkge1xuICBpZiAoIXNlbGVjdG9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHZhbHVlIGZvciAke21ldGhvZE5hbWV9IGluIGNvbm5lY3QuYCk7XG4gIH0gZWxzZSBpZiAobWV0aG9kTmFtZSA9PT0gJ21hcFN0YXRlVG9Qcm9wcycgfHwgbWV0aG9kTmFtZSA9PT0gJ21hcERpc3BhdGNoVG9Qcm9wcycpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZWxlY3RvciwgJ2RlcGVuZHNPbk93blByb3BzJykpIHtcbiAgICAgIHdhcm5pbmcoYFRoZSBzZWxlY3RvciBmb3IgJHttZXRob2ROYW1lfSBvZiBjb25uZWN0IGRpZCBub3Qgc3BlY2lmeSBhIHZhbHVlIGZvciBkZXBlbmRzT25Pd25Qcm9wcy5gKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmVyaWZ5U3Vic2VsZWN0b3JzKG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzKSB7XG4gIHZlcmlmeShtYXBTdGF0ZVRvUHJvcHMsICdtYXBTdGF0ZVRvUHJvcHMnKTtcbiAgdmVyaWZ5KG1hcERpc3BhdGNoVG9Qcm9wcywgJ21hcERpc3BhdGNoVG9Qcm9wcycpO1xuICB2ZXJpZnkobWVyZ2VQcm9wcywgJ21lcmdlUHJvcHMnKTtcbn0iLCJpbXBvcnQgdmVyaWZ5UGxhaW5PYmplY3QgZnJvbSAnLi4vdXRpbHMvdmVyaWZ5UGxhaW5PYmplY3QnO1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoIC8vICogTm90ZTpcbi8vICBJdCBzZWVtcyB0aGF0IHRoZSBkaXNwYXRjaCBhcmd1bWVudFxuLy8gIGNvdWxkIGJlIGEgZGlzcGF0Y2ggZnVuY3Rpb24gaW4gc29tZSBjYXNlcyAoZXg6IHdoZW5NYXBEaXNwYXRjaFRvUHJvcHNJc01pc3NpbmcpXG4vLyAgYW5kIGEgc3RhdGUgb2JqZWN0IGluIHNvbWUgb3RoZXJzIChleDogd2hlbk1hcFN0YXRlVG9Qcm9wc0lzTWlzc2luZylcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuZ2V0Q29uc3RhbnQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRDb25zdGFudFNlbGVjdG9yKGRpc3BhdGNoKSB7XG4gICAgY29uc3QgY29uc3RhbnQgPSBnZXRDb25zdGFudChkaXNwYXRjaCk7XG5cbiAgICBmdW5jdGlvbiBjb25zdGFudFNlbGVjdG9yKCkge1xuICAgICAgcmV0dXJuIGNvbnN0YW50O1xuICAgIH1cblxuICAgIGNvbnN0YW50U2VsZWN0b3IuZGVwZW5kc09uT3duUHJvcHMgPSBmYWxzZTtcbiAgICByZXR1cm4gY29uc3RhbnRTZWxlY3RvcjtcbiAgfTtcbn0gLy8gZGVwZW5kc09uT3duUHJvcHMgaXMgdXNlZCBieSBjcmVhdGVNYXBUb1Byb3BzUHJveHkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gcGFzcyBwcm9wcyBhcyBhcmdzXG4vLyB0byB0aGUgbWFwVG9Qcm9wcyBmdW5jdGlvbiBiZWluZyB3cmFwcGVkLiBJdCBpcyBhbHNvIHVzZWQgYnkgbWFrZVB1cmVQcm9wc1NlbGVjdG9yIHRvIGRldGVybWluZVxuLy8gd2hldGhlciBtYXBUb1Byb3BzIG5lZWRzIHRvIGJlIGludm9rZWQgd2hlbiBwcm9wcyBoYXZlIGNoYW5nZWQuXG4vL1xuLy8gQSBsZW5ndGggb2Ygb25lIHNpZ25hbHMgdGhhdCBtYXBUb1Byb3BzIGRvZXMgbm90IGRlcGVuZCBvbiBwcm9wcyBmcm9tIHRoZSBwYXJlbnQgY29tcG9uZW50LlxuLy8gQSBsZW5ndGggb2YgemVybyBpcyBhc3N1bWVkIHRvIG1lYW4gbWFwVG9Qcm9wcyBpcyBnZXR0aW5nIGFyZ3MgdmlhIGFyZ3VtZW50cyBvciAuLi5hcmdzIGFuZFxuLy8gdGhlcmVmb3JlIG5vdCByZXBvcnRpbmcgaXRzIGxlbmd0aCBhY2N1cmF0ZWx5Li5cbi8vIFRPRE8gQ2FuIHRoaXMgZ2V0IHB1bGxlZCBvdXQgc28gdGhhdCB3ZSBjYW4gc3Vic2NyaWJlIGRpcmVjdGx5IHRvIHRoZSBzdG9yZSBpZiB3ZSBkb24ndCBuZWVkIG93blByb3BzP1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVwZW5kc09uT3duUHJvcHMobWFwVG9Qcm9wcykge1xuICByZXR1cm4gbWFwVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcyA/IEJvb2xlYW4obWFwVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgOiBtYXBUb1Byb3BzLmxlbmd0aCAhPT0gMTtcbn0gLy8gVXNlZCBieSB3aGVuTWFwU3RhdGVUb1Byb3BzSXNGdW5jdGlvbiBhbmQgd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzRnVuY3Rpb24sXG4vLyB0aGlzIGZ1bmN0aW9uIHdyYXBzIG1hcFRvUHJvcHMgaW4gYSBwcm94eSBmdW5jdGlvbiB3aGljaCBkb2VzIHNldmVyYWwgdGhpbmdzOlxuLy9cbi8vICAqIERldGVjdHMgd2hldGhlciB0aGUgbWFwVG9Qcm9wcyBmdW5jdGlvbiBiZWluZyBjYWxsZWQgZGVwZW5kcyBvbiBwcm9wcywgd2hpY2hcbi8vICAgIGlzIHVzZWQgYnkgc2VsZWN0b3JGYWN0b3J5IHRvIGRlY2lkZSBpZiBpdCBzaG91bGQgcmVpbnZva2Ugb24gcHJvcHMgY2hhbmdlcy5cbi8vXG4vLyAgKiBPbiBmaXJzdCBjYWxsLCBoYW5kbGVzIG1hcFRvUHJvcHMgaWYgcmV0dXJucyBhbm90aGVyIGZ1bmN0aW9uLCBhbmQgdHJlYXRzIHRoYXRcbi8vICAgIG5ldyBmdW5jdGlvbiBhcyB0aGUgdHJ1ZSBtYXBUb1Byb3BzIGZvciBzdWJzZXF1ZW50IGNhbGxzLlxuLy9cbi8vICAqIE9uIGZpcnN0IGNhbGwsIHZlcmlmaWVzIHRoZSBmaXJzdCByZXN1bHQgaXMgYSBwbGFpbiBvYmplY3QsIGluIG9yZGVyIHRvIHdhcm5cbi8vICAgIHRoZSBkZXZlbG9wZXIgdGhhdCB0aGVpciBtYXBUb1Byb3BzIGZ1bmN0aW9uIGlzIG5vdCByZXR1cm5pbmcgYSB2YWxpZCByZXN1bHQuXG4vL1xuXG5leHBvcnQgZnVuY3Rpb24gd3JhcE1hcFRvUHJvcHNGdW5jKG1hcFRvUHJvcHMsIG1ldGhvZE5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRQcm94eVNlbGVjdG9yKGRpc3BhdGNoLCB7XG4gICAgZGlzcGxheU5hbWVcbiAgfSkge1xuICAgIGNvbnN0IHByb3h5ID0gZnVuY3Rpb24gbWFwVG9Qcm9wc1Byb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpIHtcbiAgICAgIHJldHVybiBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA/IHByb3h5Lm1hcFRvUHJvcHMoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcykgOiBwcm94eS5tYXBUb1Byb3BzKHN0YXRlT3JEaXNwYXRjaCwgdW5kZWZpbmVkKTtcbiAgICB9OyAvLyBhbGxvdyBkZXRlY3RGYWN0b3J5QW5kVmVyaWZ5IHRvIGdldCBvd25Qcm9wc1xuXG5cbiAgICBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA9IHRydWU7XG5cbiAgICBwcm94eS5tYXBUb1Byb3BzID0gZnVuY3Rpb24gZGV0ZWN0RmFjdG9yeUFuZFZlcmlmeShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKSB7XG4gICAgICBwcm94eS5tYXBUb1Byb3BzID0gbWFwVG9Qcm9wcztcbiAgICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gZ2V0RGVwZW5kc09uT3duUHJvcHMobWFwVG9Qcm9wcyk7XG4gICAgICBsZXQgcHJvcHMgPSBwcm94eShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKTtcblxuICAgICAgaWYgKHR5cGVvZiBwcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwcm94eS5tYXBUb1Byb3BzID0gcHJvcHM7XG4gICAgICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gZ2V0RGVwZW5kc09uT3duUHJvcHMocHJvcHMpO1xuICAgICAgICBwcm9wcyA9IHByb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgdmVyaWZ5UGxhaW5PYmplY3QocHJvcHMsIGRpc3BsYXlOYW1lLCBtZXRob2ROYW1lKTtcbiAgICAgIHJldHVybiBwcm9wcztcbiAgICB9O1xuXG4gICAgcmV0dXJuIHByb3h5O1xuICB9O1xufSIsImltcG9ydCBQcm92aWRlciBmcm9tICcuL2NvbXBvbmVudHMvUHJvdmlkZXInO1xuaW1wb3J0IGNvbm5lY3QgZnJvbSAnLi9jb21wb25lbnRzL2Nvbm5lY3QnO1xuaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuL2NvbXBvbmVudHMvQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VEaXNwYXRjaCwgY3JlYXRlRGlzcGF0Y2hIb29rIH0gZnJvbSAnLi9ob29rcy91c2VEaXNwYXRjaCc7XG5pbXBvcnQgeyB1c2VTZWxlY3RvciwgY3JlYXRlU2VsZWN0b3JIb29rIH0gZnJvbSAnLi9ob29rcy91c2VTZWxlY3Rvcic7XG5pbXBvcnQgeyB1c2VTdG9yZSwgY3JlYXRlU3RvcmVIb29rIH0gZnJvbSAnLi9ob29rcy91c2VTdG9yZSc7XG5pbXBvcnQgc2hhbGxvd0VxdWFsIGZyb20gJy4vdXRpbHMvc2hhbGxvd0VxdWFsJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0IHsgUHJvdmlkZXIsIFJlYWN0UmVkdXhDb250ZXh0LCBjb25uZWN0LCB1c2VEaXNwYXRjaCwgY3JlYXRlRGlzcGF0Y2hIb29rLCB1c2VTZWxlY3RvciwgY3JlYXRlU2VsZWN0b3JIb29rLCB1c2VTdG9yZSwgY3JlYXRlU3RvcmVIb29rLCBzaGFsbG93RXF1YWwgfTsiLCJpbXBvcnQgeyBSZWFjdFJlZHV4Q29udGV4dCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VTdG9yZSBhcyB1c2VEZWZhdWx0U3RvcmUsIGNyZWF0ZVN0b3JlSG9vayB9IGZyb20gJy4vdXNlU3RvcmUnO1xuLyoqXHJcbiAqIEhvb2sgZmFjdG9yeSwgd2hpY2ggY3JlYXRlcyBhIGB1c2VEaXNwYXRjaGAgaG9vayBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhY3QuQ29udGV4dH0gW2NvbnRleHQ9UmVhY3RSZWR1eENvbnRleHRdIENvbnRleHQgcGFzc2VkIHRvIHlvdXIgYDxQcm92aWRlcj5gLlxyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgYHVzZURpc3BhdGNoYCBob29rIGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dC5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaXNwYXRjaEhvb2soY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0KSB7XG4gIGNvbnN0IHVzZVN0b3JlID0gLy8gQHRzLWlnbm9yZVxuICBjb250ZXh0ID09PSBSZWFjdFJlZHV4Q29udGV4dCA/IHVzZURlZmF1bHRTdG9yZSA6IGNyZWF0ZVN0b3JlSG9vayhjb250ZXh0KTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVzZURpc3BhdGNoKCkge1xuICAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmUoKTsgLy8gQHRzLWlnbm9yZVxuXG4gICAgcmV0dXJuIHN0b3JlLmRpc3BhdGNoO1xuICB9O1xufVxuLyoqXHJcbiAqIEEgaG9vayB0byBhY2Nlc3MgdGhlIHJlZHV4IGBkaXNwYXRjaGAgZnVuY3Rpb24uXHJcbiAqXHJcbiAqIEByZXR1cm5zIHthbnl8ZnVuY3Rpb259IHJlZHV4IHN0b3JlJ3MgYGRpc3BhdGNoYCBmdW5jdGlvblxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKlxyXG4gKiBpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCdcclxuICogaW1wb3J0IHsgdXNlRGlzcGF0Y2ggfSBmcm9tICdyZWFjdC1yZWR1eCdcclxuICpcclxuICogZXhwb3J0IGNvbnN0IENvdW50ZXJDb21wb25lbnQgPSAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAqICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpXHJcbiAqICAgY29uc3QgaW5jcmVhc2VDb3VudGVyID0gdXNlQ2FsbGJhY2soKCkgPT4gZGlzcGF0Y2goeyB0eXBlOiAnaW5jcmVhc2UtY291bnRlcicgfSksIFtdKVxyXG4gKiAgIHJldHVybiAoXHJcbiAqICAgICA8ZGl2PlxyXG4gKiAgICAgICA8c3Bhbj57dmFsdWV9PC9zcGFuPlxyXG4gKiAgICAgICA8YnV0dG9uIG9uQ2xpY2s9e2luY3JlYXNlQ291bnRlcn0+SW5jcmVhc2UgY291bnRlcjwvYnV0dG9uPlxyXG4gKiAgICAgPC9kaXY+XHJcbiAqICAgKVxyXG4gKiB9XHJcbiAqL1xuXG5leHBvcnQgY29uc3QgdXNlRGlzcGF0Y2ggPSAvKiNfX1BVUkVfXyovY3JlYXRlRGlzcGF0Y2hIb29rKCk7IiwiaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi4vY29tcG9uZW50cy9Db250ZXh0JztcblxuLyoqXHJcbiAqIEhvb2sgZmFjdG9yeSwgd2hpY2ggY3JlYXRlcyBhIGB1c2VSZWR1eENvbnRleHRgIGhvb2sgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LiBUaGlzIGlzIGEgbG93LWxldmVsXHJcbiAqIGhvb2sgdGhhdCB5b3Ugc2hvdWxkIHVzdWFsbHkgbm90IG5lZWQgdG8gY2FsbCBkaXJlY3RseS5cclxuICpcclxuICogQHBhcmFtIHtSZWFjdC5Db250ZXh0fSBbY29udGV4dD1SZWFjdFJlZHV4Q29udGV4dF0gQ29udGV4dCBwYXNzZWQgdG8geW91ciBgPFByb3ZpZGVyPmAuXHJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBgdXNlUmVkdXhDb250ZXh0YCBob29rIGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dC5cclxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkdXhDb250ZXh0SG9vayhjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVzZVJlZHV4Q29udGV4dCgpIHtcbiAgICBjb25zdCBjb250ZXh0VmFsdWUgPSB1c2VDb250ZXh0KGNvbnRleHQpO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIWNvbnRleHRWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgZmluZCByZWFjdC1yZWR1eCBjb250ZXh0IHZhbHVlOyBwbGVhc2UgZW5zdXJlIHRoZSBjb21wb25lbnQgaXMgd3JhcHBlZCBpbiBhIDxQcm92aWRlcj4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGV4dFZhbHVlO1xuICB9O1xufVxuLyoqXHJcbiAqIEEgaG9vayB0byBhY2Nlc3MgdGhlIHZhbHVlIG9mIHRoZSBgUmVhY3RSZWR1eENvbnRleHRgLiBUaGlzIGlzIGEgbG93LWxldmVsXHJcbiAqIGhvb2sgdGhhdCB5b3Ugc2hvdWxkIHVzdWFsbHkgbm90IG5lZWQgdG8gY2FsbCBkaXJlY3RseS5cclxuICpcclxuICogQHJldHVybnMge2FueX0gdGhlIHZhbHVlIG9mIHRoZSBgUmVhY3RSZWR1eENvbnRleHRgXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqXHJcbiAqIGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcclxuICogaW1wb3J0IHsgdXNlUmVkdXhDb250ZXh0IH0gZnJvbSAncmVhY3QtcmVkdXgnXHJcbiAqXHJcbiAqIGV4cG9ydCBjb25zdCBDb3VudGVyQ29tcG9uZW50ID0gKCkgPT4ge1xyXG4gKiAgIGNvbnN0IHsgc3RvcmUgfSA9IHVzZVJlZHV4Q29udGV4dCgpXHJcbiAqICAgcmV0dXJuIDxkaXY+e3N0b3JlLmdldFN0YXRlKCl9PC9kaXY+XHJcbiAqIH1cclxuICovXG5cbmV4cG9ydCBjb25zdCB1c2VSZWR1eENvbnRleHQgPSAvKiNfX1BVUkVfXyovY3JlYXRlUmVkdXhDb250ZXh0SG9vaygpOyIsImltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VEZWJ1Z1ZhbHVlLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVSZWR1eENvbnRleHRIb29rLCB1c2VSZWR1eENvbnRleHQgYXMgdXNlRGVmYXVsdFJlZHV4Q29udGV4dCB9IGZyb20gJy4vdXNlUmVkdXhDb250ZXh0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi4vY29tcG9uZW50cy9Db250ZXh0JztcbmltcG9ydCB7IG5vdEluaXRpYWxpemVkIH0gZnJvbSAnLi4vdXRpbHMvdXNlU3luY0V4dGVybmFsU3RvcmUnO1xubGV0IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yID0gbm90SW5pdGlhbGl6ZWQ7XG5leHBvcnQgY29uc3QgaW5pdGlhbGl6ZVVzZVNlbGVjdG9yID0gZm4gPT4ge1xuICB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvciA9IGZuO1xufTtcblxuY29uc3QgcmVmRXF1YWxpdHkgPSAoYSwgYikgPT4gYSA9PT0gYjtcbi8qKlxyXG4gKiBIb29rIGZhY3RvcnksIHdoaWNoIGNyZWF0ZXMgYSBgdXNlU2VsZWN0b3JgIGhvb2sgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWN0LkNvbnRleHR9IFtjb250ZXh0PVJlYWN0UmVkdXhDb250ZXh0XSBDb250ZXh0IHBhc3NlZCB0byB5b3VyIGA8UHJvdmlkZXI+YC5cclxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGB1c2VTZWxlY3RvcmAgaG9vayBib3VuZCB0byB0aGUgc3BlY2lmaWVkIGNvbnRleHQuXHJcbiAqL1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZWxlY3Rvckhvb2soY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0KSB7XG4gIGNvbnN0IHVzZVJlZHV4Q29udGV4dCA9IGNvbnRleHQgPT09IFJlYWN0UmVkdXhDb250ZXh0ID8gdXNlRGVmYXVsdFJlZHV4Q29udGV4dCA6IGNyZWF0ZVJlZHV4Q29udGV4dEhvb2soY29udGV4dCk7XG4gIHJldHVybiBmdW5jdGlvbiB1c2VTZWxlY3RvcihzZWxlY3RvciwgZXF1YWxpdHlGbk9yT3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgZXF1YWxpdHlGbiA9IHJlZkVxdWFsaXR5LFxuICAgICAgc3RhYmlsaXR5Q2hlY2sgPSB1bmRlZmluZWQsXG4gICAgICBub29wQ2hlY2sgPSB1bmRlZmluZWRcbiAgICB9ID0gdHlwZW9mIGVxdWFsaXR5Rm5Pck9wdGlvbnMgPT09ICdmdW5jdGlvbicgPyB7XG4gICAgICBlcXVhbGl0eUZuOiBlcXVhbGl0eUZuT3JPcHRpb25zXG4gICAgfSA6IGVxdWFsaXR5Rm5Pck9wdGlvbnM7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFlvdSBtdXN0IHBhc3MgYSBzZWxlY3RvciB0byB1c2VTZWxlY3RvcmApO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHNlbGVjdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWW91IG11c3QgcGFzcyBhIGZ1bmN0aW9uIGFzIGEgc2VsZWN0b3IgdG8gdXNlU2VsZWN0b3JgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBlcXVhbGl0eUZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWW91IG11c3QgcGFzcyBhIGZ1bmN0aW9uIGFzIGFuIGVxdWFsaXR5IGZ1bmN0aW9uIHRvIHVzZVNlbGVjdG9yYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgc3RvcmUsXG4gICAgICBzdWJzY3JpcHRpb24sXG4gICAgICBnZXRTZXJ2ZXJTdGF0ZSxcbiAgICAgIHN0YWJpbGl0eUNoZWNrOiBnbG9iYWxTdGFiaWxpdHlDaGVjayxcbiAgICAgIG5vb3BDaGVjazogZ2xvYmFsTm9vcENoZWNrXG4gICAgfSA9IHVzZVJlZHV4Q29udGV4dCgpO1xuICAgIGNvbnN0IGZpcnN0UnVuID0gdXNlUmVmKHRydWUpO1xuICAgIGNvbnN0IHdyYXBwZWRTZWxlY3RvciA9IHVzZUNhbGxiYWNrKHtcbiAgICAgIFtzZWxlY3Rvci5uYW1lXShzdGF0ZSkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHNlbGVjdG9yKHN0YXRlKTtcblxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIGNvbnN0IGZpbmFsU3RhYmlsaXR5Q2hlY2sgPSB0eXBlb2Ygc3RhYmlsaXR5Q2hlY2sgPT09ICd1bmRlZmluZWQnID8gZ2xvYmFsU3RhYmlsaXR5Q2hlY2sgOiBzdGFiaWxpdHlDaGVjaztcblxuICAgICAgICAgIGlmIChmaW5hbFN0YWJpbGl0eUNoZWNrID09PSAnYWx3YXlzJyB8fCBmaW5hbFN0YWJpbGl0eUNoZWNrID09PSAnb25jZScgJiYgZmlyc3RSdW4uY3VycmVudCkge1xuICAgICAgICAgICAgY29uc3QgdG9Db21wYXJlID0gc2VsZWN0b3Ioc3RhdGUpO1xuXG4gICAgICAgICAgICBpZiAoIWVxdWFsaXR5Rm4oc2VsZWN0ZWQsIHRvQ29tcGFyZSkpIHtcbiAgICAgICAgICAgICAgbGV0IHN0YWNrID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgICAgIHN0YWNrXG4gICAgICAgICAgICAgICAgfSA9IGUpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdTZWxlY3RvciAnICsgKHNlbGVjdG9yLm5hbWUgfHwgJ3Vua25vd24nKSArICcgcmV0dXJuZWQgYSBkaWZmZXJlbnQgcmVzdWx0IHdoZW4gY2FsbGVkIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycy4gVGhpcyBjYW4gbGVhZCB0byB1bm5lY2Vzc2FyeSByZXJlbmRlcnMuJyArICdcXG5TZWxlY3RvcnMgdGhhdCByZXR1cm4gYSBuZXcgcmVmZXJlbmNlIChzdWNoIGFzIGFuIG9iamVjdCBvciBhbiBhcnJheSkgc2hvdWxkIGJlIG1lbW9pemVkOiBodHRwczovL3JlZHV4LmpzLm9yZy91c2FnZS9kZXJpdmluZy1kYXRhLXNlbGVjdG9ycyNvcHRpbWl6aW5nLXNlbGVjdG9ycy13aXRoLW1lbW9pemF0aW9uJywge1xuICAgICAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkMjogdG9Db21wYXJlLFxuICAgICAgICAgICAgICAgIHN0YWNrXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZpbmFsTm9vcENoZWNrID0gdHlwZW9mIG5vb3BDaGVjayA9PT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxOb29wQ2hlY2sgOiBub29wQ2hlY2s7XG5cbiAgICAgICAgICBpZiAoZmluYWxOb29wQ2hlY2sgPT09ICdhbHdheXMnIHx8IGZpbmFsTm9vcENoZWNrID09PSAnb25jZScgJiYgZmlyc3RSdW4uY3VycmVudCkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkID09PSBzdGF0ZSkge1xuICAgICAgICAgICAgICBsZXQgc3RhY2sgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgc3RhY2tcbiAgICAgICAgICAgICAgICB9ID0gZSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1NlbGVjdG9yICcgKyAoc2VsZWN0b3IubmFtZSB8fCAndW5rbm93bicpICsgJyByZXR1cm5lZCB0aGUgcm9vdCBzdGF0ZSB3aGVuIGNhbGxlZC4gVGhpcyBjYW4gbGVhZCB0byB1bm5lY2Vzc2FyeSByZXJlbmRlcnMuJyArICdcXG5TZWxlY3RvcnMgdGhhdCByZXR1cm4gdGhlIGVudGlyZSBzdGF0ZSBhcmUgYWxtb3N0IGNlcnRhaW5seSBhIG1pc3Rha2UsIGFzIHRoZXkgd2lsbCBjYXVzZSBhIHJlcmVuZGVyIHdoZW5ldmVyICphbnl0aGluZyogaW4gc3RhdGUgY2hhbmdlcy4nLCB7XG4gICAgICAgICAgICAgICAgc3RhY2tcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZpcnN0UnVuLmN1cnJlbnQpIGZpcnN0UnVuLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZWxlY3RlZDtcbiAgICAgIH1cblxuICAgIH1bc2VsZWN0b3IubmFtZV0sIFtzZWxlY3RvciwgZ2xvYmFsU3RhYmlsaXR5Q2hlY2ssIHN0YWJpbGl0eUNoZWNrXSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRTdGF0ZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yKHN1YnNjcmlwdGlvbi5hZGROZXN0ZWRTdWIsIHN0b3JlLmdldFN0YXRlLCBnZXRTZXJ2ZXJTdGF0ZSB8fCBzdG9yZS5nZXRTdGF0ZSwgd3JhcHBlZFNlbGVjdG9yLCBlcXVhbGl0eUZuKTtcbiAgICB1c2VEZWJ1Z1ZhbHVlKHNlbGVjdGVkU3RhdGUpO1xuICAgIHJldHVybiBzZWxlY3RlZFN0YXRlO1xuICB9O1xufVxuLyoqXHJcbiAqIEEgaG9vayB0byBhY2Nlc3MgdGhlIHJlZHV4IHN0b3JlJ3Mgc3RhdGUuIFRoaXMgaG9vayB0YWtlcyBhIHNlbGVjdG9yIGZ1bmN0aW9uXHJcbiAqIGFzIGFuIGFyZ3VtZW50LiBUaGUgc2VsZWN0b3IgaXMgY2FsbGVkIHdpdGggdGhlIHN0b3JlIHN0YXRlLlxyXG4gKlxyXG4gKiBUaGlzIGhvb2sgdGFrZXMgYW4gb3B0aW9uYWwgZXF1YWxpdHkgY29tcGFyaXNvbiBmdW5jdGlvbiBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlclxyXG4gKiB0aGF0IGFsbG93cyB5b3UgdG8gY3VzdG9taXplIHRoZSB3YXkgdGhlIHNlbGVjdGVkIHN0YXRlIGlzIGNvbXBhcmVkIHRvIGRldGVybWluZVxyXG4gKiB3aGV0aGVyIHRoZSBjb21wb25lbnQgbmVlZHMgdG8gYmUgcmUtcmVuZGVyZWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGVjdG9yIHRoZSBzZWxlY3RvciBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9uPX0gZXF1YWxpdHlGbiB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGVxdWFsaXR5XHJcbiAqXHJcbiAqIEByZXR1cm5zIHthbnl9IHRoZSBzZWxlY3RlZCBzdGF0ZVxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKlxyXG4gKiBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXHJcbiAqIGltcG9ydCB7IHVzZVNlbGVjdG9yIH0gZnJvbSAncmVhY3QtcmVkdXgnXHJcbiAqXHJcbiAqIGV4cG9ydCBjb25zdCBDb3VudGVyQ29tcG9uZW50ID0gKCkgPT4ge1xyXG4gKiAgIGNvbnN0IGNvdW50ZXIgPSB1c2VTZWxlY3RvcihzdGF0ZSA9PiBzdGF0ZS5jb3VudGVyKVxyXG4gKiAgIHJldHVybiA8ZGl2Pntjb3VudGVyfTwvZGl2PlxyXG4gKiB9XHJcbiAqL1xuXG5leHBvcnQgY29uc3QgdXNlU2VsZWN0b3IgPSAvKiNfX1BVUkVfXyovY3JlYXRlU2VsZWN0b3JIb29rKCk7IiwiaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuLi9jb21wb25lbnRzL0NvbnRleHQnO1xuaW1wb3J0IHsgdXNlUmVkdXhDb250ZXh0IGFzIHVzZURlZmF1bHRSZWR1eENvbnRleHQsIGNyZWF0ZVJlZHV4Q29udGV4dEhvb2sgfSBmcm9tICcuL3VzZVJlZHV4Q29udGV4dCc7XG4vKipcclxuICogSG9vayBmYWN0b3J5LCB3aGljaCBjcmVhdGVzIGEgYHVzZVN0b3JlYCBob29rIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cclxuICpcclxuICogQHBhcmFtIHtSZWFjdC5Db250ZXh0fSBbY29udGV4dD1SZWFjdFJlZHV4Q29udGV4dF0gQ29udGV4dCBwYXNzZWQgdG8geW91ciBgPFByb3ZpZGVyPmAuXHJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBgdXNlU3RvcmVgIGhvb2sgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBjb250ZXh0LlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0b3JlSG9vayhjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHQpIHtcbiAgY29uc3QgdXNlUmVkdXhDb250ZXh0ID0gLy8gQHRzLWlnbm9yZVxuICBjb250ZXh0ID09PSBSZWFjdFJlZHV4Q29udGV4dCA/IHVzZURlZmF1bHRSZWR1eENvbnRleHQgOiAvLyBAdHMtaWdub3JlXG4gIGNyZWF0ZVJlZHV4Q29udGV4dEhvb2soY29udGV4dCk7XG4gIHJldHVybiBmdW5jdGlvbiB1c2VTdG9yZSgpIHtcbiAgICBjb25zdCB7XG4gICAgICBzdG9yZVxuICAgIH0gPSB1c2VSZWR1eENvbnRleHQoKTsgLy8gQHRzLWlnbm9yZVxuXG4gICAgcmV0dXJuIHN0b3JlO1xuICB9O1xufVxuLyoqXHJcbiAqIEEgaG9vayB0byBhY2Nlc3MgdGhlIHJlZHV4IHN0b3JlLlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7YW55fSB0aGUgcmVkdXggc3RvcmVcclxuICpcclxuICogQGV4YW1wbGVcclxuICpcclxuICogaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xyXG4gKiBpbXBvcnQgeyB1c2VTdG9yZSB9IGZyb20gJ3JlYWN0LXJlZHV4J1xyXG4gKlxyXG4gKiBleHBvcnQgY29uc3QgRXhhbXBsZUNvbXBvbmVudCA9ICgpID0+IHtcclxuICogICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlKClcclxuICogICByZXR1cm4gPGRpdj57c3RvcmUuZ2V0U3RhdGUoKX08L2Rpdj5cclxuICogfVxyXG4gKi9cblxuZXhwb3J0IGNvbnN0IHVzZVN0b3JlID0gLyojX19QVVJFX18qL2NyZWF0ZVN0b3JlSG9vaygpOyIsIi8vIFRoZSBwcmltYXJ5IGVudHJ5IHBvaW50IGFzc3VtZXMgd2UncmUgd29ya2luZyB3aXRoIHN0YW5kYXJkIFJlYWN0RE9NL1JOLCBidXRcbi8vIG9sZGVyIHZlcnNpb25zIHRoYXQgZG8gbm90IGluY2x1ZGUgYHVzZVN5bmNFeHRlcm5hbFN0b3JlYCAoUmVhY3QgMTYuOSAtIDE3LngpLlxuLy8gQmVjYXVzZSBvZiB0aGF0LCB0aGUgdXNlU3luY0V4dGVybmFsU3RvcmUgY29tcGF0IHNoaW0gaXMgbmVlZGVkLlxuaW1wb3J0IHsgdXNlU3luY0V4dGVybmFsU3RvcmUgfSBmcm9tICd1c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltJztcbmltcG9ydCB7IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yIH0gZnJvbSAndXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvc2hpbS93aXRoLXNlbGVjdG9yJztcbmltcG9ydCB7IHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIGFzIGJhdGNoIH0gZnJvbSAnLi91dGlscy9yZWFjdEJhdGNoZWRVcGRhdGVzJztcbmltcG9ydCB7IHNldEJhdGNoIH0gZnJvbSAnLi91dGlscy9iYXRjaCc7XG5pbXBvcnQgeyBpbml0aWFsaXplVXNlU2VsZWN0b3IgfSBmcm9tICcuL2hvb2tzL3VzZVNlbGVjdG9yJztcbmltcG9ydCB7IGluaXRpYWxpemVDb25uZWN0IH0gZnJvbSAnLi9jb21wb25lbnRzL2Nvbm5lY3QnO1xuaW5pdGlhbGl6ZVVzZVNlbGVjdG9yKHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yKTtcbmluaXRpYWxpemVDb25uZWN0KHVzZVN5bmNFeHRlcm5hbFN0b3JlKTsgLy8gRW5hYmxlIGJhdGNoZWQgdXBkYXRlcyBpbiBvdXIgc3Vic2NyaXB0aW9ucyBmb3IgdXNlXG4vLyB3aXRoIHN0YW5kYXJkIFJlYWN0IHJlbmRlcmVycyAoUmVhY3RET00sIFJlYWN0IE5hdGl2ZSlcblxuc2V0QmF0Y2goYmF0Y2gpO1xuZXhwb3J0IHsgYmF0Y2ggfTtcbmV4cG9ydCAqIGZyb20gJy4vZXhwb3J0cyc7IiwiZXhwb3J0IHt9OyIsImltcG9ydCB7IGdldEJhdGNoIH0gZnJvbSAnLi9iYXRjaCc7IC8vIGVuY2Fwc3VsYXRlcyB0aGUgc3Vic2NyaXB0aW9uIGxvZ2ljIGZvciBjb25uZWN0aW5nIGEgY29tcG9uZW50IHRvIHRoZSByZWR1eCBzdG9yZSwgYXNcbi8vIHdlbGwgYXMgbmVzdGluZyBzdWJzY3JpcHRpb25zIG9mIGRlc2NlbmRhbnQgY29tcG9uZW50cywgc28gdGhhdCB3ZSBjYW4gZW5zdXJlIHRoZVxuLy8gYW5jZXN0b3IgY29tcG9uZW50cyByZS1yZW5kZXIgYmVmb3JlIGRlc2NlbmRhbnRzXG5cbmZ1bmN0aW9uIGNyZWF0ZUxpc3RlbmVyQ29sbGVjdGlvbigpIHtcbiAgY29uc3QgYmF0Y2ggPSBnZXRCYXRjaCgpO1xuICBsZXQgZmlyc3QgPSBudWxsO1xuICBsZXQgbGFzdCA9IG51bGw7XG4gIHJldHVybiB7XG4gICAgY2xlYXIoKSB7XG4gICAgICBmaXJzdCA9IG51bGw7XG4gICAgICBsYXN0ID0gbnVsbDtcbiAgICB9LFxuXG4gICAgbm90aWZ5KCkge1xuICAgICAgYmF0Y2goKCkgPT4ge1xuICAgICAgICBsZXQgbGlzdGVuZXIgPSBmaXJzdDtcblxuICAgICAgICB3aGlsZSAobGlzdGVuZXIpIHtcbiAgICAgICAgICBsaXN0ZW5lci5jYWxsYmFjaygpO1xuICAgICAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXIubmV4dDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGdldCgpIHtcbiAgICAgIGxldCBsaXN0ZW5lcnMgPSBbXTtcbiAgICAgIGxldCBsaXN0ZW5lciA9IGZpcnN0O1xuXG4gICAgICB3aGlsZSAobGlzdGVuZXIpIHtcbiAgICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICBsaXN0ZW5lciA9IGxpc3RlbmVyLm5leHQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsaXN0ZW5lcnM7XG4gICAgfSxcblxuICAgIHN1YnNjcmliZShjYWxsYmFjaykge1xuICAgICAgbGV0IGlzU3Vic2NyaWJlZCA9IHRydWU7XG4gICAgICBsZXQgbGlzdGVuZXIgPSBsYXN0ID0ge1xuICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgcHJldjogbGFzdFxuICAgICAgfTtcblxuICAgICAgaWYgKGxpc3RlbmVyLnByZXYpIHtcbiAgICAgICAgbGlzdGVuZXIucHJldi5uZXh0ID0gbGlzdGVuZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaXJzdCA9IGxpc3RlbmVyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICAgIGlmICghaXNTdWJzY3JpYmVkIHx8IGZpcnN0ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGlzU3Vic2NyaWJlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChsaXN0ZW5lci5uZXh0KSB7XG4gICAgICAgICAgbGlzdGVuZXIubmV4dC5wcmV2ID0gbGlzdGVuZXIucHJldjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsYXN0ID0gbGlzdGVuZXIucHJldjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaXN0ZW5lci5wcmV2KSB7XG4gICAgICAgICAgbGlzdGVuZXIucHJldi5uZXh0ID0gbGlzdGVuZXIubmV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaXJzdCA9IGxpc3RlbmVyLm5leHQ7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gIH07XG59XG5cbmNvbnN0IG51bGxMaXN0ZW5lcnMgPSB7XG4gIG5vdGlmeSgpIHt9LFxuXG4gIGdldDogKCkgPT4gW11cbn07XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3Vic2NyaXB0aW9uKHN0b3JlLCBwYXJlbnRTdWIpIHtcbiAgbGV0IHVuc3Vic2NyaWJlO1xuICBsZXQgbGlzdGVuZXJzID0gbnVsbExpc3RlbmVyczsgLy8gUmVhc29ucyB0byBrZWVwIHRoZSBzdWJzY3JpcHRpb24gYWN0aXZlXG5cbiAgbGV0IHN1YnNjcmlwdGlvbnNBbW91bnQgPSAwOyAvLyBJcyB0aGlzIHNwZWNpZmljIHN1YnNjcmlwdGlvbiBzdWJzY3JpYmVkIChvciBvbmx5IG5lc3RlZCBvbmVzPylcblxuICBsZXQgc2VsZlN1YnNjcmliZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBhZGROZXN0ZWRTdWIobGlzdGVuZXIpIHtcbiAgICB0cnlTdWJzY3JpYmUoKTtcbiAgICBjb25zdCBjbGVhbnVwTGlzdGVuZXIgPSBsaXN0ZW5lcnMuc3Vic2NyaWJlKGxpc3RlbmVyKTsgLy8gY2xlYW51cCBuZXN0ZWQgc3ViXG5cbiAgICBsZXQgcmVtb3ZlZCA9IGZhbHNlO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAoIXJlbW92ZWQpIHtcbiAgICAgICAgcmVtb3ZlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXBMaXN0ZW5lcigpO1xuICAgICAgICB0cnlVbnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBub3RpZnlOZXN0ZWRTdWJzKCkge1xuICAgIGxpc3RlbmVycy5ub3RpZnkoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUNoYW5nZVdyYXBwZXIoKSB7XG4gICAgaWYgKHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlKSB7XG4gICAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzU3Vic2NyaWJlZCgpIHtcbiAgICByZXR1cm4gc2VsZlN1YnNjcmliZWQ7XG4gIH1cblxuICBmdW5jdGlvbiB0cnlTdWJzY3JpYmUoKSB7XG4gICAgc3Vic2NyaXB0aW9uc0Ftb3VudCsrO1xuXG4gICAgaWYgKCF1bnN1YnNjcmliZSkge1xuICAgICAgdW5zdWJzY3JpYmUgPSBwYXJlbnRTdWIgPyBwYXJlbnRTdWIuYWRkTmVzdGVkU3ViKGhhbmRsZUNoYW5nZVdyYXBwZXIpIDogc3RvcmUuc3Vic2NyaWJlKGhhbmRsZUNoYW5nZVdyYXBwZXIpO1xuICAgICAgbGlzdGVuZXJzID0gY3JlYXRlTGlzdGVuZXJDb2xsZWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdHJ5VW5zdWJzY3JpYmUoKSB7XG4gICAgc3Vic2NyaXB0aW9uc0Ftb3VudC0tO1xuXG4gICAgaWYgKHVuc3Vic2NyaWJlICYmIHN1YnNjcmlwdGlvbnNBbW91bnQgPT09IDApIHtcbiAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICB1bnN1YnNjcmliZSA9IHVuZGVmaW5lZDtcbiAgICAgIGxpc3RlbmVycy5jbGVhcigpO1xuICAgICAgbGlzdGVuZXJzID0gbnVsbExpc3RlbmVycztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0cnlTdWJzY3JpYmVTZWxmKCkge1xuICAgIGlmICghc2VsZlN1YnNjcmliZWQpIHtcbiAgICAgIHNlbGZTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgIHRyeVN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRyeVVuc3Vic2NyaWJlU2VsZigpIHtcbiAgICBpZiAoc2VsZlN1YnNjcmliZWQpIHtcbiAgICAgIHNlbGZTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICB0cnlVbnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHtcbiAgICBhZGROZXN0ZWRTdWIsXG4gICAgbm90aWZ5TmVzdGVkU3VicyxcbiAgICBoYW5kbGVDaGFuZ2VXcmFwcGVyLFxuICAgIGlzU3Vic2NyaWJlZCxcbiAgICB0cnlTdWJzY3JpYmU6IHRyeVN1YnNjcmliZVNlbGYsXG4gICAgdHJ5VW5zdWJzY3JpYmU6IHRyeVVuc3Vic2NyaWJlU2VsZixcbiAgICBnZXRMaXN0ZW5lcnM6ICgpID0+IGxpc3RlbmVyc1xuICB9O1xuICByZXR1cm4gc3Vic2NyaXB0aW9uO1xufSIsIi8vIERlZmF1bHQgdG8gYSBkdW1teSBcImJhdGNoXCIgaW1wbGVtZW50YXRpb24gdGhhdCBqdXN0IHJ1bnMgdGhlIGNhbGxiYWNrXG5mdW5jdGlvbiBkZWZhdWx0Tm9vcEJhdGNoKGNhbGxiYWNrKSB7XG4gIGNhbGxiYWNrKCk7XG59XG5cbmxldCBiYXRjaCA9IGRlZmF1bHROb29wQmF0Y2g7IC8vIEFsbG93IGluamVjdGluZyBhbm90aGVyIGJhdGNoaW5nIGZ1bmN0aW9uIGxhdGVyXG5cbmV4cG9ydCBjb25zdCBzZXRCYXRjaCA9IG5ld0JhdGNoID0+IGJhdGNoID0gbmV3QmF0Y2g7IC8vIFN1cHBseSBhIGdldHRlciBqdXN0IHRvIHNraXAgZGVhbGluZyB3aXRoIEVTTSBiaW5kaW5nc1xuXG5leHBvcnQgY29uc3QgZ2V0QmF0Y2ggPSAoKSA9PiBiYXRjaDsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKSB7XG4gIGNvbnN0IGJvdW5kQWN0aW9uQ3JlYXRvcnMgPSB7fTtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBhY3Rpb25DcmVhdG9ycykge1xuICAgIGNvbnN0IGFjdGlvbkNyZWF0b3IgPSBhY3Rpb25DcmVhdG9yc1trZXldO1xuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBib3VuZEFjdGlvbkNyZWF0b3JzW2tleV0gPSAoLi4uYXJncykgPT4gZGlzcGF0Y2goYWN0aW9uQ3JlYXRvciguLi5hcmdzKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJvdW5kQWN0aW9uQ3JlYXRvcnM7XG59IiwiLyoqXHJcbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIG9iamVjdCB0byBpbnNwZWN0LlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXJndW1lbnQgYXBwZWFycyB0byBiZSBhIHBsYWluIG9iamVjdC5cclxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGxldCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHJldHVybiB0cnVlO1xuICBsZXQgYmFzZVByb3RvID0gcHJvdG87XG5cbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihiYXNlUHJvdG8pICE9PSBudWxsKSB7XG4gICAgYmFzZVByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGJhc2VQcm90byk7XG4gIH1cblxuICByZXR1cm4gcHJvdG8gPT09IGJhc2VQcm90bztcbn0iLCJleHBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyB9IGZyb20gJ3JlYWN0LWRvbSc7IiwiZnVuY3Rpb24gaXMoeCwgeSkge1xuICBpZiAoeCA9PT0geSkge1xuICAgIHJldHVybiB4ICE9PSAwIHx8IHkgIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIpIHtcbiAgaWYgKGlzKG9iakEsIG9iakIpKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAodHlwZW9mIG9iakEgIT09ICdvYmplY3QnIHx8IG9iakEgPT09IG51bGwgfHwgdHlwZW9mIG9iakIgIT09ICdvYmplY3QnIHx8IG9iakIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICBjb25zdCBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNBLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqQiwga2V5c0FbaV0pIHx8ICFpcyhvYmpBW2tleXNBW2ldXSwgb2JqQltrZXlzQVtpXV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBSZWFjdCBjdXJyZW50bHkgdGhyb3dzIGEgd2FybmluZyB3aGVuIHVzaW5nIHVzZUxheW91dEVmZmVjdCBvbiB0aGUgc2VydmVyLlxuLy8gVG8gZ2V0IGFyb3VuZCBpdCwgd2UgY2FuIGNvbmRpdGlvbmFsbHkgdXNlRWZmZWN0IG9uIHRoZSBzZXJ2ZXIgKG5vLW9wKSBhbmRcbi8vIHVzZUxheW91dEVmZmVjdCBpbiB0aGUgYnJvd3Nlci4gV2UgbmVlZCB1c2VMYXlvdXRFZmZlY3QgdG8gZW5zdXJlIHRoZSBzdG9yZVxuLy8gc3Vic2NyaXB0aW9uIGNhbGxiYWNrIGFsd2F5cyBoYXMgdGhlIHNlbGVjdG9yIGZyb20gdGhlIGxhdGVzdCByZW5kZXIgY29tbWl0XG4vLyBhdmFpbGFibGUsIG90aGVyd2lzZSBhIHN0b3JlIHVwZGF0ZSBtYXkgaGFwcGVuIGJldHdlZW4gcmVuZGVyIGFuZCB0aGUgZWZmZWN0LFxuLy8gd2hpY2ggbWF5IGNhdXNlIG1pc3NlZCB1cGRhdGVzOyB3ZSBhbHNvIG11c3QgZW5zdXJlIHRoZSBzdG9yZSBzdWJzY3JpcHRpb25cbi8vIGlzIGNyZWF0ZWQgc3luY2hyb25vdXNseSwgb3RoZXJ3aXNlIGEgc3RvcmUgdXBkYXRlIG1heSBvY2N1ciBiZWZvcmUgdGhlXG4vLyBzdWJzY3JpcHRpb24gaXMgY3JlYXRlZCBhbmQgYW4gaW5jb25zaXN0ZW50IHN0YXRlIG1heSBiZSBvYnNlcnZlZFxuLy8gTWF0Y2hlcyBsb2dpYyBpbiBSZWFjdCdzIGBzaGFyZWQvRXhlY3V0aW9uRW52aXJvbm1lbnRgIGZpbGVcblxuZXhwb3J0IGNvbnN0IGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpO1xuZXhwb3J0IGNvbnN0IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgPSBjYW5Vc2VET00gPyBSZWFjdC51c2VMYXlvdXRFZmZlY3QgOiBSZWFjdC51c2VFZmZlY3Q7IiwiZXhwb3J0IGNvbnN0IG5vdEluaXRpYWxpemVkID0gKCkgPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoJ3VTRVMgbm90IGluaXRpYWxpemVkIScpO1xufTsiLCJpbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tICcuL2lzUGxhaW5PYmplY3QnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi93YXJuaW5nJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZlcmlmeVBsYWluT2JqZWN0KHZhbHVlLCBkaXNwbGF5TmFtZSwgbWV0aG9kTmFtZSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgd2FybmluZyhgJHttZXRob2ROYW1lfSgpIGluICR7ZGlzcGxheU5hbWV9IG11c3QgcmV0dXJuIGEgcGxhaW4gb2JqZWN0LiBJbnN0ZWFkIHJlY2VpdmVkICR7dmFsdWV9LmApO1xuICB9XG59IiwiLyoqXHJcbiAqIFByaW50cyBhIHdhcm5pbmcgaW4gdGhlIGNvbnNvbGUgaWYgaXQgZXhpc3RzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlLlxyXG4gKiBAcmV0dXJucyB7dm9pZH1cclxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB3YXJuaW5nKG1lc3NhZ2UpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cblxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCBpZiB5b3UgZW5hYmxlXG4gICAgLy8gXCJicmVhayBvbiBhbGwgZXhjZXB0aW9uc1wiIGluIHlvdXIgY29uc29sZSxcbiAgICAvLyBpdCB3b3VsZCBwYXVzZSB0aGUgZXhlY3V0aW9uIGF0IHRoaXMgbGluZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tZW1wdHkgKi9cbiAgfSBjYXRjaCAoZSkge31cbiAgLyogZXNsaW50LWVuYWJsZSBuby1lbXB0eSAqL1xuXG59IiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9TRVJWRVJfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc2VydmVyX2NvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxudmFyIGVuYWJsZUNhY2hlRWxlbWVudCA9IGZhbHNlO1xudmFyIGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nID0gZmFsc2U7IC8vIE5vIGtub3duIGJ1Z3MsIGJ1dCBuZWVkcyBwZXJmb3JtYW5jZSB0ZXN0aW5nXG5cbnZhciBlbmFibGVMZWdhY3lIaWRkZW4gPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpYmVyXG4vLyBzdHVmZi4gSW50ZW5kZWQgdG8gZW5hYmxlIFJlYWN0IGNvcmUgbWVtYmVycyB0byBtb3JlIGVhc2lseSBkZWJ1ZyBzY2hlZHVsaW5nXG4vLyBpc3N1ZXMgaW4gREVWIGJ1aWxkcy5cblxudmFyIGVuYWJsZURlYnVnVHJhY2luZyA9IGZhbHNlOyAvLyBUcmFjayB3aGljaCBGaWJlcihzKSBzY2hlZHVsZSByZW5kZXIgd29yay5cblxudmFyIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0U7XG5cbntcbiAgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1vZHVsZS5yZWZlcmVuY2UnKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vdGU6IHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIChlLmcuIGlmIGl0J3MgYSBwb2x5ZmlsbCkuXG5cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IGVuYWJsZURlYnVnVHJhY2luZyAgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCBlbmFibGVMZWdhY3lIaWRkZW4gIHx8IHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8IGVuYWJsZVNjb3BlQVBJICB8fCBlbmFibGVDYWNoZUVsZW1lbnQgIHx8IGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBUaGlzIG5lZWRzIHRvIGluY2x1ZGUgYWxsIHBvc3NpYmxlIG1vZHVsZSByZWZlcmVuY2Ugb2JqZWN0XG4gICAgLy8gdHlwZXMgc3VwcG9ydGVkIGJ5IGFueSBGbGlnaHQgY29uZmlndXJhdGlvbiBhbnl3aGVyZSBzaW5jZVxuICAgIC8vIHdlIGRvbid0IGtub3cgd2hpY2ggRmxpZ2h0IGJ1aWxkIHRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdXNlZFxuICAgIC8vIHdpdGguXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSB8fCB0eXBlLmdldE1vZHVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuXG4gICAgc3dpdGNoICgkJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0LnR5cGU7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyICQkdHlwZW9mVHlwZSA9IHR5cGUgJiYgdHlwZS4kJHR5cGVvZjtcblxuICAgICAgICAgICAgc3dpdGNoICgkJHR5cGVvZlR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9TRVJWRVJfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG52YXIgQ29udGV4dENvbnN1bWVyID0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xudmFyIENvbnRleHRQcm92aWRlciA9IFJFQUNUX1BST1ZJREVSX1RZUEU7XG52YXIgRWxlbWVudCA9IFJFQUNUX0VMRU1FTlRfVFlQRTtcbnZhciBGb3J3YXJkUmVmID0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbnZhciBGcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG52YXIgTGF6eSA9IFJFQUNUX0xBWllfVFlQRTtcbnZhciBNZW1vID0gUkVBQ1RfTUVNT19UWVBFO1xudmFyIFBvcnRhbCA9IFJFQUNUX1BPUlRBTF9UWVBFO1xudmFyIFByb2ZpbGVyID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbnZhciBTdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbnZhciBTdXNwZW5zZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG52YXIgU3VzcGVuc2VMaXN0ID0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gZmFsc2U7XG52YXIgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNDb25jdXJyZW50TW9kZSA9IGZhbHNlOyAvLyBBc3luY01vZGUgc2hvdWxkIGJlIGRlcHJlY2F0ZWRcblxuZnVuY3Rpb24gaXNBc3luY01vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNBc3luY01vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTgrLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQ29uY3VycmVudE1vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQ29uY3VycmVudE1vZGUgPSB0cnVlOyAvLyBVc2luZyBjb25zb2xlWyd3YXJuJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuXG4gICAgICBjb25zb2xlWyd3YXJuJ10oJ1RoZSBSZWFjdElzLmlzQ29uY3VycmVudE1vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTgrLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dENvbnN1bWVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlRFWFRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST1ZJREVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZvcndhcmRSZWYob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRnJhZ21lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTGF6eShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9MQVpZX1RZUEU7XG59XG5mdW5jdGlvbiBpc01lbW8ob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTUVNT19UWVBFO1xufVxuZnVuY3Rpb24gaXNQb3J0YWwob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUE9SVEFMX1RZUEU7XG59XG5mdW5jdGlvbiBpc1Byb2ZpbGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N0cmljdE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2Uob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2VMaXN0KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbn1cblxuZXhwb3J0cy5Db250ZXh0Q29uc3VtZXIgPSBDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLkNvbnRleHRQcm92aWRlciA9IENvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuRWxlbWVudCA9IEVsZW1lbnQ7XG5leHBvcnRzLkZvcndhcmRSZWYgPSBGb3J3YXJkUmVmO1xuZXhwb3J0cy5GcmFnbWVudCA9IEZyYWdtZW50O1xuZXhwb3J0cy5MYXp5ID0gTGF6eTtcbmV4cG9ydHMuTWVtbyA9IE1lbW87XG5leHBvcnRzLlBvcnRhbCA9IFBvcnRhbDtcbmV4cG9ydHMuUHJvZmlsZXIgPSBQcm9maWxlcjtcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IFN0cmljdE1vZGU7XG5leHBvcnRzLlN1c3BlbnNlID0gU3VzcGVuc2U7XG5leHBvcnRzLlN1c3BlbnNlTGlzdCA9IFN1c3BlbnNlTGlzdDtcbmV4cG9ydHMuaXNBc3luY01vZGUgPSBpc0FzeW5jTW9kZTtcbmV4cG9ydHMuaXNDb25jdXJyZW50TW9kZSA9IGlzQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gaXNDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gaXNDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbmV4cG9ydHMuaXNGb3J3YXJkUmVmID0gaXNGb3J3YXJkUmVmO1xuZXhwb3J0cy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDtcbmV4cG9ydHMuaXNMYXp5ID0gaXNMYXp5O1xuZXhwb3J0cy5pc01lbW8gPSBpc01lbW87XG5leHBvcnRzLmlzUG9ydGFsID0gaXNQb3J0YWw7XG5leHBvcnRzLmlzUHJvZmlsZXIgPSBpc1Byb2ZpbGVyO1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBpc1N0cmljdE1vZGU7XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBpc1N1c3BlbnNlO1xuZXhwb3J0cy5pc1N1c3BlbnNlTGlzdCA9IGlzU3VzcGVuc2VMaXN0O1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGU7XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdhcGF0aHknLFxuICBhdXRob3I6ICdqYW5uaWsgc2llYmVydCAoaHR0cHM6Ly9naXRodWIuY29tL2phbm5pa3MpJyxcbiAgYmFzZTAwOiAnIzAzMUExNicsXG4gIGJhc2UwMTogJyMwQjM0MkQnLFxuICBiYXNlMDI6ICcjMTg0RTQ1JyxcbiAgYmFzZTAzOiAnIzJCNjg1RScsXG4gIGJhc2UwNDogJyM1RjlDOTInLFxuICBiYXNlMDU6ICcjODFCNUFDJyxcbiAgYmFzZTA2OiAnI0E3Q0VDOCcsXG4gIGJhc2UwNzogJyNEMkU3RTQnLFxuICBiYXNlMDg6ICcjM0U5Njg4JyxcbiAgYmFzZTA5OiAnIzNFNzk5NicsXG4gIGJhc2UwQTogJyMzRTRDOTYnLFxuICBiYXNlMEI6ICcjODgzRTk2JyxcbiAgYmFzZTBDOiAnIzk2M0U0QycsXG4gIGJhc2UwRDogJyM5Njg4M0UnLFxuICBiYXNlMEU6ICcjNEM5NjNFJyxcbiAgYmFzZTBGOiAnIzNFOTY1Qidcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2FzaGVzJyxcbiAgYXV0aG9yOiAnamFubmlrIHNpZWJlcnQgKGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5uaWtzKScsXG4gIGJhc2UwMDogJyMxQzIwMjMnLFxuICBiYXNlMDE6ICcjMzkzRjQ1JyxcbiAgYmFzZTAyOiAnIzU2NUU2NScsXG4gIGJhc2UwMzogJyM3NDdDODQnLFxuICBiYXNlMDQ6ICcjQURCM0JBJyxcbiAgYmFzZTA1OiAnI0M3Q0NEMScsXG4gIGJhc2UwNjogJyNERkUyRTUnLFxuICBiYXNlMDc6ICcjRjNGNEY1JyxcbiAgYmFzZTA4OiAnI0M3QUU5NScsXG4gIGJhc2UwOTogJyNDN0M3OTUnLFxuICBiYXNlMEE6ICcjQUVDNzk1JyxcbiAgYmFzZTBCOiAnIzk1QzdBRScsXG4gIGJhc2UwQzogJyM5NUFFQzcnLFxuICBiYXNlMEQ6ICcjQUU5NUM3JyxcbiAgYmFzZTBFOiAnI0M3OTVBRScsXG4gIGJhc2UwRjogJyNDNzk1OTUnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdhdGVsaWVyIGR1bmUnLFxuICBhdXRob3I6ICdicmFtIGRlIGhhYW4gKGh0dHA6Ly9hdGVsaWVyYnJhbS5naXRodWIuaW8vc3ludGF4LWhpZ2hsaWdodGluZy9hdGVsaWVyLXNjaGVtZXMvZHVuZSknLFxuICBiYXNlMDA6ICcjMjAyMDFkJyxcbiAgYmFzZTAxOiAnIzI5MjgyNCcsXG4gIGJhc2UwMjogJyM2ZTZiNWUnLFxuICBiYXNlMDM6ICcjN2Q3YTY4JyxcbiAgYmFzZTA0OiAnIzk5OTU4MCcsXG4gIGJhc2UwNTogJyNhNmEyOGMnLFxuICBiYXNlMDY6ICcjZThlNGNmJyxcbiAgYmFzZTA3OiAnI2ZlZmJlYycsXG4gIGJhc2UwODogJyNkNzM3MzcnLFxuICBiYXNlMDk6ICcjYjY1NjExJyxcbiAgYmFzZTBBOiAnI2NmYjAxNycsXG4gIGJhc2UwQjogJyM2MGFjMzknLFxuICBiYXNlMEM6ICcjMWZhZDgzJyxcbiAgYmFzZTBEOiAnIzY2ODRlMScsXG4gIGJhc2UwRTogJyNiODU0ZDQnLFxuICBiYXNlMEY6ICcjZDQzNTUyJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYXRlbGllciBmb3Jlc3QnLFxuICBhdXRob3I6ICdicmFtIGRlIGhhYW4gKGh0dHA6Ly9hdGVsaWVyYnJhbS5naXRodWIuaW8vc3ludGF4LWhpZ2hsaWdodGluZy9hdGVsaWVyLXNjaGVtZXMvZm9yZXN0KScsXG4gIGJhc2UwMDogJyMxYjE5MTgnLFxuICBiYXNlMDE6ICcjMmMyNDIxJyxcbiAgYmFzZTAyOiAnIzY4NjE1ZScsXG4gIGJhc2UwMzogJyM3NjZlNmInLFxuICBiYXNlMDQ6ICcjOWM5NDkxJyxcbiAgYmFzZTA1OiAnI2E4YTE5ZicsXG4gIGJhc2UwNjogJyNlNmUyZTAnLFxuICBiYXNlMDc6ICcjZjFlZmVlJyxcbiAgYmFzZTA4OiAnI2YyMmM0MCcsXG4gIGJhc2UwOTogJyNkZjUzMjAnLFxuICBiYXNlMEE6ICcjZDU5MTFhJyxcbiAgYmFzZTBCOiAnIzVhYjczOCcsXG4gIGJhc2UwQzogJyMwMGFkOWMnLFxuICBiYXNlMEQ6ICcjNDA3ZWU3JyxcbiAgYmFzZTBFOiAnIzY2NjZlYScsXG4gIGJhc2UwRjogJyNjMzNmZjMnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdhdGVsaWVyIGhlYXRoJyxcbiAgYXV0aG9yOiAnYnJhbSBkZSBoYWFuIChodHRwOi8vYXRlbGllcmJyYW0uZ2l0aHViLmlvL3N5bnRheC1oaWdobGlnaHRpbmcvYXRlbGllci1zY2hlbWVzL2hlYXRoKScsXG4gIGJhc2UwMDogJyMxYjE4MWInLFxuICBiYXNlMDE6ICcjMjkyMzI5JyxcbiAgYmFzZTAyOiAnIzY5NWQ2OScsXG4gIGJhc2UwMzogJyM3NzY5NzcnLFxuICBiYXNlMDQ6ICcjOWU4ZjllJyxcbiAgYmFzZTA1OiAnI2FiOWJhYicsXG4gIGJhc2UwNjogJyNkOGNhZDgnLFxuICBiYXNlMDc6ICcjZjdmM2Y3JyxcbiAgYmFzZTA4OiAnI2NhNDAyYicsXG4gIGJhc2UwOTogJyNhNjU5MjYnLFxuICBiYXNlMEE6ICcjYmI4YTM1JyxcbiAgYmFzZTBCOiAnIzM3OWEzNycsXG4gIGJhc2UwQzogJyMxNTkzOTMnLFxuICBiYXNlMEQ6ICcjNTE2YWVjJyxcbiAgYmFzZTBFOiAnIzdiNTljMCcsXG4gIGJhc2UwRjogJyNjYzMzY2MnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdhdGVsaWVyIGxha2VzaWRlJyxcbiAgYXV0aG9yOiAnYnJhbSBkZSBoYWFuIChodHRwOi8vYXRlbGllcmJyYW0uZ2l0aHViLmlvL3N5bnRheC1oaWdobGlnaHRpbmcvYXRlbGllci1zY2hlbWVzL2xha2VzaWRlLyknLFxuICBiYXNlMDA6ICcjMTYxYjFkJyxcbiAgYmFzZTAxOiAnIzFmMjkyZScsXG4gIGJhc2UwMjogJyM1MTZkN2InLFxuICBiYXNlMDM6ICcjNWE3YjhjJyxcbiAgYmFzZTA0OiAnIzcxOTVhOCcsXG4gIGJhc2UwNTogJyM3ZWEyYjQnLFxuICBiYXNlMDY6ICcjYzFlNGY2JyxcbiAgYmFzZTA3OiAnI2ViZjhmZicsXG4gIGJhc2UwODogJyNkMjJkNzInLFxuICBiYXNlMDk6ICcjOTM1YzI1JyxcbiAgYmFzZTBBOiAnIzhhOGEwZicsXG4gIGJhc2UwQjogJyM1NjhjM2InLFxuICBiYXNlMEM6ICcjMmQ4ZjZmJyxcbiAgYmFzZTBEOiAnIzI1N2ZhZCcsXG4gIGJhc2UwRTogJyM1ZDVkYjEnLFxuICBiYXNlMEY6ICcjYjcyZGQyJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYXRlbGllciBzZWFzaWRlJyxcbiAgYXV0aG9yOiAnYnJhbSBkZSBoYWFuIChodHRwOi8vYXRlbGllcmJyYW0uZ2l0aHViLmlvL3N5bnRheC1oaWdobGlnaHRpbmcvYXRlbGllci1zY2hlbWVzL3NlYXNpZGUvKScsXG4gIGJhc2UwMDogJyMxMzE1MTMnLFxuICBiYXNlMDE6ICcjMjQyOTI0JyxcbiAgYmFzZTAyOiAnIzVlNmU1ZScsXG4gIGJhc2UwMzogJyM2ODdkNjgnLFxuICBiYXNlMDQ6ICcjODA5OTgwJyxcbiAgYmFzZTA1OiAnIzhjYTY4YycsXG4gIGJhc2UwNjogJyNjZmU4Y2YnLFxuICBiYXNlMDc6ICcjZjBmZmYwJyxcbiAgYmFzZTA4OiAnI2U2MTkzYycsXG4gIGJhc2UwOTogJyM4NzcxMWQnLFxuICBiYXNlMEE6ICcjYzNjMzIyJyxcbiAgYmFzZTBCOiAnIzI5YTMyOScsXG4gIGJhc2UwQzogJyMxOTk5YjMnLFxuICBiYXNlMEQ6ICcjM2Q2MmY1JyxcbiAgYmFzZTBFOiAnI2FkMmJlZScsXG4gIGJhc2UwRjogJyNlNjE5YzMnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdiZXNwaW4nLFxuICBhdXRob3I6ICdqYW4gdC4gc290dCcsXG4gIGJhc2UwMDogJyMyODIxMWMnLFxuICBiYXNlMDE6ICcjMzYzMTJlJyxcbiAgYmFzZTAyOiAnIzVlNWQ1YycsXG4gIGJhc2UwMzogJyM2NjY2NjYnLFxuICBiYXNlMDQ6ICcjNzk3OTc3JyxcbiAgYmFzZTA1OiAnIzhhODk4NicsXG4gIGJhc2UwNjogJyM5ZDliOTcnLFxuICBiYXNlMDc6ICcjYmFhZTllJyxcbiAgYmFzZTA4OiAnI2NmNmE0YycsXG4gIGJhc2UwOTogJyNjZjdkMzQnLFxuICBiYXNlMEE6ICcjZjllZTk4JyxcbiAgYmFzZTBCOiAnIzU0YmUwZCcsXG4gIGJhc2UwQzogJyNhZmM0ZGInLFxuICBiYXNlMEQ6ICcjNWVhNmVhJyxcbiAgYmFzZTBFOiAnIzliODU5ZCcsXG4gIGJhc2UwRjogJyM5MzcxMjEnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdicmV3ZXInLFxuICBhdXRob3I6ICd0aW1vdGjDqWUgcG9pc290IChodHRwOi8vZ2l0aHViLmNvbS90cG9pc290KScsXG4gIGJhc2UwMDogJyMwYzBkMGUnLFxuICBiYXNlMDE6ICcjMmUyZjMwJyxcbiAgYmFzZTAyOiAnIzUxNTI1MycsXG4gIGJhc2UwMzogJyM3Mzc0NzUnLFxuICBiYXNlMDQ6ICcjOTU5Njk3JyxcbiAgYmFzZTA1OiAnI2I3YjhiOScsXG4gIGJhc2UwNjogJyNkYWRiZGMnLFxuICBiYXNlMDc6ICcjZmNmZGZlJyxcbiAgYmFzZTA4OiAnI2UzMWExYycsXG4gIGJhc2UwOTogJyNlNjU1MGQnLFxuICBiYXNlMEE6ICcjZGNhMDYwJyxcbiAgYmFzZTBCOiAnIzMxYTM1NCcsXG4gIGJhc2UwQzogJyM4MGIxZDMnLFxuICBiYXNlMEQ6ICcjMzE4MmJkJyxcbiAgYmFzZTBFOiAnIzc1NmJiMScsXG4gIGJhc2UwRjogJyNiMTU5MjgnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdicmlnaHQnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMDAwMDAwJyxcbiAgYmFzZTAxOiAnIzMwMzAzMCcsXG4gIGJhc2UwMjogJyM1MDUwNTAnLFxuICBiYXNlMDM6ICcjYjBiMGIwJyxcbiAgYmFzZTA0OiAnI2QwZDBkMCcsXG4gIGJhc2UwNTogJyNlMGUwZTAnLFxuICBiYXNlMDY6ICcjZjVmNWY1JyxcbiAgYmFzZTA3OiAnI2ZmZmZmZicsXG4gIGJhc2UwODogJyNmYjAxMjAnLFxuICBiYXNlMDk6ICcjZmM2ZDI0JyxcbiAgYmFzZTBBOiAnI2ZkYTMzMScsXG4gIGJhc2UwQjogJyNhMWM2NTknLFxuICBiYXNlMEM6ICcjNzZjN2I3JyxcbiAgYmFzZTBEOiAnIzZmYjNkMicsXG4gIGJhc2UwRTogJyNkMzgxYzMnLFxuICBiYXNlMEY6ICcjYmU2NDNjJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnY2hhbGsnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMTUxNTE1JyxcbiAgYmFzZTAxOiAnIzIwMjAyMCcsXG4gIGJhc2UwMjogJyMzMDMwMzAnLFxuICBiYXNlMDM6ICcjNTA1MDUwJyxcbiAgYmFzZTA0OiAnI2IwYjBiMCcsXG4gIGJhc2UwNTogJyNkMGQwZDAnLFxuICBiYXNlMDY6ICcjZTBlMGUwJyxcbiAgYmFzZTA3OiAnI2Y1ZjVmNScsXG4gIGJhc2UwODogJyNmYjlmYjEnLFxuICBiYXNlMDk6ICcjZWRhOTg3JyxcbiAgYmFzZTBBOiAnI2RkYjI2ZicsXG4gIGJhc2UwQjogJyNhY2MyNjcnLFxuICBiYXNlMEM6ICcjMTJjZmMwJyxcbiAgYmFzZTBEOiAnIzZmYzJlZicsXG4gIGJhc2UwRTogJyNlMWEzZWUnLFxuICBiYXNlMEY6ICcjZGVhZjhmJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnY29kZXNjaG9vbCcsXG4gIGF1dGhvcjogJ2JyZXR0b2Y4NicsXG4gIGJhc2UwMDogJyMyMzJjMzEnLFxuICBiYXNlMDE6ICcjMWMzNjU3JyxcbiAgYmFzZTAyOiAnIzJhMzQzYScsXG4gIGJhc2UwMzogJyMzZjQ5NDQnLFxuICBiYXNlMDQ6ICcjODQ4OThjJyxcbiAgYmFzZTA1OiAnIzllYTdhNicsXG4gIGJhc2UwNjogJyNhN2NmYTMnLFxuICBiYXNlMDc6ICcjYjVkOGY2JyxcbiAgYmFzZTA4OiAnIzJhNTQ5MScsXG4gIGJhc2UwOTogJyM0MzgyMGQnLFxuICBiYXNlMEE6ICcjYTAzYjFlJyxcbiAgYmFzZTBCOiAnIzIzNzk4NicsXG4gIGJhc2UwQzogJyNiMDJmMzAnLFxuICBiYXNlMEQ6ICcjNDg0ZDc5JyxcbiAgYmFzZTBFOiAnI2M1OTgyMCcsXG4gIGJhc2UwRjogJyNjOTgzNDQnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdjb2xvcnMnLFxuICBhdXRob3I6ICdtcm1ycyAoaHR0cDovL2NscnMuY2MpJyxcbiAgYmFzZTAwOiAnIzExMTExMScsXG4gIGJhc2UwMTogJyMzMzMzMzMnLFxuICBiYXNlMDI6ICcjNTU1NTU1JyxcbiAgYmFzZTAzOiAnIzc3Nzc3NycsXG4gIGJhc2UwNDogJyM5OTk5OTknLFxuICBiYXNlMDU6ICcjYmJiYmJiJyxcbiAgYmFzZTA2OiAnI2RkZGRkZCcsXG4gIGJhc2UwNzogJyNmZmZmZmYnLFxuICBiYXNlMDg6ICcjZmY0MTM2JyxcbiAgYmFzZTA5OiAnI2ZmODUxYicsXG4gIGJhc2UwQTogJyNmZmRjMDAnLFxuICBiYXNlMEI6ICcjMmVjYzQwJyxcbiAgYmFzZTBDOiAnIzdmZGJmZicsXG4gIGJhc2UwRDogJyMwMDc0ZDknLFxuICBiYXNlMEU6ICcjYjEwZGM5JyxcbiAgYmFzZTBGOiAnIzg1MTQ0Yidcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2RlZmF1bHQnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMTgxODE4JyxcbiAgYmFzZTAxOiAnIzI4MjgyOCcsXG4gIGJhc2UwMjogJyMzODM4MzgnLFxuICBiYXNlMDM6ICcjNTg1ODU4JyxcbiAgYmFzZTA0OiAnI2I4YjhiOCcsXG4gIGJhc2UwNTogJyNkOGQ4ZDgnLFxuICBiYXNlMDY6ICcjZThlOGU4JyxcbiAgYmFzZTA3OiAnI2Y4ZjhmOCcsXG4gIGJhc2UwODogJyNhYjQ2NDInLFxuICBiYXNlMDk6ICcjZGM5NjU2JyxcbiAgYmFzZTBBOiAnI2Y3Y2E4OCcsXG4gIGJhc2UwQjogJyNhMWI1NmMnLFxuICBiYXNlMEM6ICcjODZjMWI5JyxcbiAgYmFzZTBEOiAnIzdjYWZjMicsXG4gIGJhc2UwRTogJyNiYThiYWYnLFxuICBiYXNlMEY6ICcjYTE2OTQ2J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnZWlnaHRpZXMnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMmQyZDJkJyxcbiAgYmFzZTAxOiAnIzM5MzkzOScsXG4gIGJhc2UwMjogJyM1MTUxNTEnLFxuICBiYXNlMDM6ICcjNzQ3MzY5JyxcbiAgYmFzZTA0OiAnI2EwOWY5MycsXG4gIGJhc2UwNTogJyNkM2QwYzgnLFxuICBiYXNlMDY6ICcjZThlNmRmJyxcbiAgYmFzZTA3OiAnI2YyZjBlYycsXG4gIGJhc2UwODogJyNmMjc3N2EnLFxuICBiYXNlMDk6ICcjZjk5MTU3JyxcbiAgYmFzZTBBOiAnI2ZmY2M2NicsXG4gIGJhc2UwQjogJyM5OWNjOTknLFxuICBiYXNlMEM6ICcjNjZjY2NjJyxcbiAgYmFzZTBEOiAnIzY2OTljYycsXG4gIGJhc2UwRTogJyNjYzk5Y2MnLFxuICBiYXNlMEY6ICcjZDI3YjUzJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnZW1iZXJzJyxcbiAgYXV0aG9yOiAnamFubmlrIHNpZWJlcnQgKGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5uaWtzKScsXG4gIGJhc2UwMDogJyMxNjEzMEYnLFxuICBiYXNlMDE6ICcjMkMyNjIwJyxcbiAgYmFzZTAyOiAnIzQzM0IzMicsXG4gIGJhc2UwMzogJyM1QTUwNDcnLFxuICBiYXNlMDQ6ICcjOEE4MDc1JyxcbiAgYmFzZTA1OiAnI0EzOUE5MCcsXG4gIGJhc2UwNjogJyNCRUI2QUUnLFxuICBiYXNlMDc6ICcjREJENkQxJyxcbiAgYmFzZTA4OiAnIzgyNkQ1NycsXG4gIGJhc2UwOTogJyM4MjgyNTcnLFxuICBiYXNlMEE6ICcjNkQ4MjU3JyxcbiAgYmFzZTBCOiAnIzU3ODI2RCcsXG4gIGJhc2UwQzogJyM1NzZEODInLFxuICBiYXNlMEQ6ICcjNkQ1NzgyJyxcbiAgYmFzZTBFOiAnIzgyNTc2RCcsXG4gIGJhc2UwRjogJyM4MjU3NTcnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdmbGF0JyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzJDM0U1MCcsXG4gIGJhc2UwMTogJyMzNDQ5NUUnLFxuICBiYXNlMDI6ICcjN0Y4QzhEJyxcbiAgYmFzZTAzOiAnIzk1QTVBNicsXG4gIGJhc2UwNDogJyNCREMzQzcnLFxuICBiYXNlMDU6ICcjZTBlMGUwJyxcbiAgYmFzZTA2OiAnI2Y1ZjVmNScsXG4gIGJhc2UwNzogJyNFQ0YwRjEnLFxuICBiYXNlMDg6ICcjRTc0QzNDJyxcbiAgYmFzZTA5OiAnI0U2N0UyMicsXG4gIGJhc2UwQTogJyNGMUM0MEYnLFxuICBiYXNlMEI6ICcjMkVDQzcxJyxcbiAgYmFzZTBDOiAnIzFBQkM5QycsXG4gIGJhc2UwRDogJyMzNDk4REInLFxuICBiYXNlMEU6ICcjOUI1OUI2JyxcbiAgYmFzZTBGOiAnI2JlNjQzYydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2dvb2dsZScsXG4gIGF1dGhvcjogJ3NldGggd3JpZ2h0IChodHRwOi8vc2V0aGF3cmlnaHQuY29tKScsXG4gIGJhc2UwMDogJyMxZDFmMjEnLFxuICBiYXNlMDE6ICcjMjgyYTJlJyxcbiAgYmFzZTAyOiAnIzM3M2I0MScsXG4gIGJhc2UwMzogJyM5Njk4OTYnLFxuICBiYXNlMDQ6ICcjYjRiN2I0JyxcbiAgYmFzZTA1OiAnI2M1YzhjNicsXG4gIGJhc2UwNjogJyNlMGUwZTAnLFxuICBiYXNlMDc6ICcjZmZmZmZmJyxcbiAgYmFzZTA4OiAnI0NDMzQyQicsXG4gIGJhc2UwOTogJyNGOTZBMzgnLFxuICBiYXNlMEE6ICcjRkJBOTIyJyxcbiAgYmFzZTBCOiAnIzE5ODg0NCcsXG4gIGJhc2UwQzogJyMzOTcxRUQnLFxuICBiYXNlMEQ6ICcjMzk3MUVEJyxcbiAgYmFzZTBFOiAnI0EzNkFDNycsXG4gIGJhc2UwRjogJyMzOTcxRUQnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdncmF5c2NhbGUnLFxuICBhdXRob3I6ICdhbGV4YW5kcmUgZ2F2aW9saSAoaHR0cHM6Ly9naXRodWIuY29tL2FsZXh4Mi8pJyxcbiAgYmFzZTAwOiAnIzEwMTAxMCcsXG4gIGJhc2UwMTogJyMyNTI1MjUnLFxuICBiYXNlMDI6ICcjNDY0NjQ2JyxcbiAgYmFzZTAzOiAnIzUyNTI1MicsXG4gIGJhc2UwNDogJyNhYmFiYWInLFxuICBiYXNlMDU6ICcjYjliOWI5JyxcbiAgYmFzZTA2OiAnI2UzZTNlMycsXG4gIGJhc2UwNzogJyNmN2Y3ZjcnLFxuICBiYXNlMDg6ICcjN2M3YzdjJyxcbiAgYmFzZTA5OiAnIzk5OTk5OScsXG4gIGJhc2UwQTogJyNhMGEwYTAnLFxuICBiYXNlMEI6ICcjOGU4ZThlJyxcbiAgYmFzZTBDOiAnIzg2ODY4NicsXG4gIGJhc2UwRDogJyM2ODY4NjgnLFxuICBiYXNlMEU6ICcjNzQ3NDc0JyxcbiAgYmFzZTBGOiAnIzVlNWU1ZSdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2dyZWVuIHNjcmVlbicsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMwMDExMDAnLFxuICBiYXNlMDE6ICcjMDAzMzAwJyxcbiAgYmFzZTAyOiAnIzAwNTUwMCcsXG4gIGJhc2UwMzogJyMwMDc3MDAnLFxuICBiYXNlMDQ6ICcjMDA5OTAwJyxcbiAgYmFzZTA1OiAnIzAwYmIwMCcsXG4gIGJhc2UwNjogJyMwMGRkMDAnLFxuICBiYXNlMDc6ICcjMDBmZjAwJyxcbiAgYmFzZTA4OiAnIzAwNzcwMCcsXG4gIGJhc2UwOTogJyMwMDk5MDAnLFxuICBiYXNlMEE6ICcjMDA3NzAwJyxcbiAgYmFzZTBCOiAnIzAwYmIwMCcsXG4gIGJhc2UwQzogJyMwMDU1MDAnLFxuICBiYXNlMEQ6ICcjMDA5OTAwJyxcbiAgYmFzZTBFOiAnIzAwYmIwMCcsXG4gIGJhc2UwRjogJyMwMDU1MDAnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdoYXJtb25pYzE2JyxcbiAgYXV0aG9yOiAnamFubmlrIHNpZWJlcnQgKGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5uaWtzKScsXG4gIGJhc2UwMDogJyMwYjFjMmMnLFxuICBiYXNlMDE6ICcjMjIzYjU0JyxcbiAgYmFzZTAyOiAnIzQwNWM3OScsXG4gIGJhc2UwMzogJyM2MjdlOTknLFxuICBiYXNlMDQ6ICcjYWFiY2NlJyxcbiAgYmFzZTA1OiAnI2NiZDZlMicsXG4gIGJhc2UwNjogJyNlNWViZjEnLFxuICBiYXNlMDc6ICcjZjdmOWZiJyxcbiAgYmFzZTA4OiAnI2JmOGI1NicsXG4gIGJhc2UwOTogJyNiZmJmNTYnLFxuICBiYXNlMEE6ICcjOGJiZjU2JyxcbiAgYmFzZTBCOiAnIzU2YmY4YicsXG4gIGJhc2UwQzogJyM1NjhiYmYnLFxuICBiYXNlMEQ6ICcjOGI1NmJmJyxcbiAgYmFzZTBFOiAnI2JmNTY4YicsXG4gIGJhc2UwRjogJyNiZjU2NTYnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdob3BzY290Y2gnLFxuICBhdXRob3I6ICdqYW4gdC4gc290dCcsXG4gIGJhc2UwMDogJyMzMjI5MzEnLFxuICBiYXNlMDE6ICcjNDMzYjQyJyxcbiAgYmFzZTAyOiAnIzVjNTQ1YicsXG4gIGJhc2UwMzogJyM3OTczNzknLFxuICBiYXNlMDQ6ICcjOTg5NDk4JyxcbiAgYmFzZTA1OiAnI2I5YjViOCcsXG4gIGJhc2UwNjogJyNkNWQzZDUnLFxuICBiYXNlMDc6ICcjZmZmZmZmJyxcbiAgYmFzZTA4OiAnI2RkNDY0YycsXG4gIGJhc2UwOTogJyNmZDhiMTknLFxuICBiYXNlMEE6ICcjZmRjYzU5JyxcbiAgYmFzZTBCOiAnIzhmYzEzZScsXG4gIGJhc2UwQzogJyMxNDliOTMnLFxuICBiYXNlMEQ6ICcjMTI5MGJmJyxcbiAgYmFzZTBFOiAnI2M4NWU3YycsXG4gIGJhc2UwRjogJyNiMzM1MDgnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmUob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmpbJ2RlZmF1bHQnXSA6IG9iajsgfVxuXG52YXIgX3RocmVlemVyb3R3b2ZvdXIgPSByZXF1aXJlKCcuL3RocmVlemVyb3R3b2ZvdXInKTtcblxuZXhwb3J0cy50aHJlZXplcm90d29mb3VyID0gX2ludGVyb3BSZXF1aXJlKF90aHJlZXplcm90d29mb3VyKTtcblxudmFyIF9hcGF0aHkgPSByZXF1aXJlKCcuL2FwYXRoeScpO1xuXG5leHBvcnRzLmFwYXRoeSA9IF9pbnRlcm9wUmVxdWlyZShfYXBhdGh5KTtcblxudmFyIF9hc2hlcyA9IHJlcXVpcmUoJy4vYXNoZXMnKTtcblxuZXhwb3J0cy5hc2hlcyA9IF9pbnRlcm9wUmVxdWlyZShfYXNoZXMpO1xuXG52YXIgX2F0ZWxpZXJEdW5lID0gcmVxdWlyZSgnLi9hdGVsaWVyLWR1bmUnKTtcblxuZXhwb3J0cy5hdGVsaWVyRHVuZSA9IF9pbnRlcm9wUmVxdWlyZShfYXRlbGllckR1bmUpO1xuXG52YXIgX2F0ZWxpZXJGb3Jlc3QgPSByZXF1aXJlKCcuL2F0ZWxpZXItZm9yZXN0Jyk7XG5cbmV4cG9ydHMuYXRlbGllckZvcmVzdCA9IF9pbnRlcm9wUmVxdWlyZShfYXRlbGllckZvcmVzdCk7XG5cbnZhciBfYXRlbGllckhlYXRoID0gcmVxdWlyZSgnLi9hdGVsaWVyLWhlYXRoJyk7XG5cbmV4cG9ydHMuYXRlbGllckhlYXRoID0gX2ludGVyb3BSZXF1aXJlKF9hdGVsaWVySGVhdGgpO1xuXG52YXIgX2F0ZWxpZXJMYWtlc2lkZSA9IHJlcXVpcmUoJy4vYXRlbGllci1sYWtlc2lkZScpO1xuXG5leHBvcnRzLmF0ZWxpZXJMYWtlc2lkZSA9IF9pbnRlcm9wUmVxdWlyZShfYXRlbGllckxha2VzaWRlKTtcblxudmFyIF9hdGVsaWVyU2Vhc2lkZSA9IHJlcXVpcmUoJy4vYXRlbGllci1zZWFzaWRlJyk7XG5cbmV4cG9ydHMuYXRlbGllclNlYXNpZGUgPSBfaW50ZXJvcFJlcXVpcmUoX2F0ZWxpZXJTZWFzaWRlKTtcblxudmFyIF9iZXNwaW4gPSByZXF1aXJlKCcuL2Jlc3BpbicpO1xuXG5leHBvcnRzLmJlc3BpbiA9IF9pbnRlcm9wUmVxdWlyZShfYmVzcGluKTtcblxudmFyIF9icmV3ZXIgPSByZXF1aXJlKCcuL2JyZXdlcicpO1xuXG5leHBvcnRzLmJyZXdlciA9IF9pbnRlcm9wUmVxdWlyZShfYnJld2VyKTtcblxudmFyIF9icmlnaHQgPSByZXF1aXJlKCcuL2JyaWdodCcpO1xuXG5leHBvcnRzLmJyaWdodCA9IF9pbnRlcm9wUmVxdWlyZShfYnJpZ2h0KTtcblxudmFyIF9jaGFsayA9IHJlcXVpcmUoJy4vY2hhbGsnKTtcblxuZXhwb3J0cy5jaGFsayA9IF9pbnRlcm9wUmVxdWlyZShfY2hhbGspO1xuXG52YXIgX2NvZGVzY2hvb2wgPSByZXF1aXJlKCcuL2NvZGVzY2hvb2wnKTtcblxuZXhwb3J0cy5jb2Rlc2Nob29sID0gX2ludGVyb3BSZXF1aXJlKF9jb2Rlc2Nob29sKTtcblxudmFyIF9jb2xvcnMgPSByZXF1aXJlKCcuL2NvbG9ycycpO1xuXG5leHBvcnRzLmNvbG9ycyA9IF9pbnRlcm9wUmVxdWlyZShfY29sb3JzKTtcblxudmFyIF9kZWZhdWx0ID0gcmVxdWlyZSgnLi9kZWZhdWx0Jyk7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IF9pbnRlcm9wUmVxdWlyZShfZGVmYXVsdCk7XG5cbnZhciBfZWlnaHRpZXMgPSByZXF1aXJlKCcuL2VpZ2h0aWVzJyk7XG5cbmV4cG9ydHMuZWlnaHRpZXMgPSBfaW50ZXJvcFJlcXVpcmUoX2VpZ2h0aWVzKTtcblxudmFyIF9lbWJlcnMgPSByZXF1aXJlKCcuL2VtYmVycycpO1xuXG5leHBvcnRzLmVtYmVycyA9IF9pbnRlcm9wUmVxdWlyZShfZW1iZXJzKTtcblxudmFyIF9mbGF0ID0gcmVxdWlyZSgnLi9mbGF0Jyk7XG5cbmV4cG9ydHMuZmxhdCA9IF9pbnRlcm9wUmVxdWlyZShfZmxhdCk7XG5cbnZhciBfZ29vZ2xlID0gcmVxdWlyZSgnLi9nb29nbGUnKTtcblxuZXhwb3J0cy5nb29nbGUgPSBfaW50ZXJvcFJlcXVpcmUoX2dvb2dsZSk7XG5cbnZhciBfZ3JheXNjYWxlID0gcmVxdWlyZSgnLi9ncmF5c2NhbGUnKTtcblxuZXhwb3J0cy5ncmF5c2NhbGUgPSBfaW50ZXJvcFJlcXVpcmUoX2dyYXlzY2FsZSk7XG5cbnZhciBfZ3JlZW5zY3JlZW4gPSByZXF1aXJlKCcuL2dyZWVuc2NyZWVuJyk7XG5cbmV4cG9ydHMuZ3JlZW5zY3JlZW4gPSBfaW50ZXJvcFJlcXVpcmUoX2dyZWVuc2NyZWVuKTtcblxudmFyIF9oYXJtb25pYyA9IHJlcXVpcmUoJy4vaGFybW9uaWMnKTtcblxuZXhwb3J0cy5oYXJtb25pYyA9IF9pbnRlcm9wUmVxdWlyZShfaGFybW9uaWMpO1xuXG52YXIgX2hvcHNjb3RjaCA9IHJlcXVpcmUoJy4vaG9wc2NvdGNoJyk7XG5cbmV4cG9ydHMuaG9wc2NvdGNoID0gX2ludGVyb3BSZXF1aXJlKF9ob3BzY290Y2gpO1xuXG52YXIgX2lzb3RvcGUgPSByZXF1aXJlKCcuL2lzb3RvcGUnKTtcblxuZXhwb3J0cy5pc290b3BlID0gX2ludGVyb3BSZXF1aXJlKF9pc290b3BlKTtcblxudmFyIF9tYXJyYWtlc2ggPSByZXF1aXJlKCcuL21hcnJha2VzaCcpO1xuXG5leHBvcnRzLm1hcnJha2VzaCA9IF9pbnRlcm9wUmVxdWlyZShfbWFycmFrZXNoKTtcblxudmFyIF9tb2NoYSA9IHJlcXVpcmUoJy4vbW9jaGEnKTtcblxuZXhwb3J0cy5tb2NoYSA9IF9pbnRlcm9wUmVxdWlyZShfbW9jaGEpO1xuXG52YXIgX21vbm9rYWkgPSByZXF1aXJlKCcuL21vbm9rYWknKTtcblxuZXhwb3J0cy5tb25va2FpID0gX2ludGVyb3BSZXF1aXJlKF9tb25va2FpKTtcblxudmFyIF9vY2VhbiA9IHJlcXVpcmUoJy4vb2NlYW4nKTtcblxuZXhwb3J0cy5vY2VhbiA9IF9pbnRlcm9wUmVxdWlyZShfb2NlYW4pO1xuXG52YXIgX3BhcmFpc28gPSByZXF1aXJlKCcuL3BhcmFpc28nKTtcblxuZXhwb3J0cy5wYXJhaXNvID0gX2ludGVyb3BSZXF1aXJlKF9wYXJhaXNvKTtcblxudmFyIF9wb3AgPSByZXF1aXJlKCcuL3BvcCcpO1xuXG5leHBvcnRzLnBvcCA9IF9pbnRlcm9wUmVxdWlyZShfcG9wKTtcblxudmFyIF9yYWlsc2Nhc3RzID0gcmVxdWlyZSgnLi9yYWlsc2Nhc3RzJyk7XG5cbmV4cG9ydHMucmFpbHNjYXN0cyA9IF9pbnRlcm9wUmVxdWlyZShfcmFpbHNjYXN0cyk7XG5cbnZhciBfc2hhcGVzaGlmdGVyID0gcmVxdWlyZSgnLi9zaGFwZXNoaWZ0ZXInKTtcblxuZXhwb3J0cy5zaGFwZXNoaWZ0ZXIgPSBfaW50ZXJvcFJlcXVpcmUoX3NoYXBlc2hpZnRlcik7XG5cbnZhciBfc29sYXJpemVkID0gcmVxdWlyZSgnLi9zb2xhcml6ZWQnKTtcblxuZXhwb3J0cy5zb2xhcml6ZWQgPSBfaW50ZXJvcFJlcXVpcmUoX3NvbGFyaXplZCk7XG5cbnZhciBfc3VtbWVyZnJ1aXQgPSByZXF1aXJlKCcuL3N1bW1lcmZydWl0Jyk7XG5cbmV4cG9ydHMuc3VtbWVyZnJ1aXQgPSBfaW50ZXJvcFJlcXVpcmUoX3N1bW1lcmZydWl0KTtcblxudmFyIF90b21vcnJvdyA9IHJlcXVpcmUoJy4vdG9tb3Jyb3cnKTtcblxuZXhwb3J0cy50b21vcnJvdyA9IF9pbnRlcm9wUmVxdWlyZShfdG9tb3Jyb3cpO1xuXG52YXIgX3R1YmUgPSByZXF1aXJlKCcuL3R1YmUnKTtcblxuZXhwb3J0cy50dWJlID0gX2ludGVyb3BSZXF1aXJlKF90dWJlKTtcblxudmFyIF90d2lsaWdodCA9IHJlcXVpcmUoJy4vdHdpbGlnaHQnKTtcblxuZXhwb3J0cy50d2lsaWdodCA9IF9pbnRlcm9wUmVxdWlyZShfdHdpbGlnaHQpOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnaXNvdG9wZScsXG4gIGF1dGhvcjogJ2phbiB0LiBzb3R0JyxcbiAgYmFzZTAwOiAnIzAwMDAwMCcsXG4gIGJhc2UwMTogJyM0MDQwNDAnLFxuICBiYXNlMDI6ICcjNjA2MDYwJyxcbiAgYmFzZTAzOiAnIzgwODA4MCcsXG4gIGJhc2UwNDogJyNjMGMwYzAnLFxuICBiYXNlMDU6ICcjZDBkMGQwJyxcbiAgYmFzZTA2OiAnI2UwZTBlMCcsXG4gIGJhc2UwNzogJyNmZmZmZmYnLFxuICBiYXNlMDg6ICcjZmYwMDAwJyxcbiAgYmFzZTA5OiAnI2ZmOTkwMCcsXG4gIGJhc2UwQTogJyNmZjAwOTknLFxuICBiYXNlMEI6ICcjMzNmZjAwJyxcbiAgYmFzZTBDOiAnIzAwZmZmZicsXG4gIGJhc2UwRDogJyMwMDY2ZmYnLFxuICBiYXNlMEU6ICcjY2MwMGZmJyxcbiAgYmFzZTBGOiAnIzMzMDBmZidcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ21hcnJha2VzaCcsXG4gIGF1dGhvcjogJ2FsZXhhbmRyZSBnYXZpb2xpIChodHRwOi8vZ2l0aHViLmNvbS9hbGV4eDIvKScsXG4gIGJhc2UwMDogJyMyMDE2MDInLFxuICBiYXNlMDE6ICcjMzAyZTAwJyxcbiAgYmFzZTAyOiAnIzVmNWIxNycsXG4gIGJhc2UwMzogJyM2YzY4MjMnLFxuICBiYXNlMDQ6ICcjODY4MTNiJyxcbiAgYmFzZTA1OiAnIzk0OGU0OCcsXG4gIGJhc2UwNjogJyNjY2MzN2EnLFxuICBiYXNlMDc6ICcjZmFmMGE1JyxcbiAgYmFzZTA4OiAnI2MzNTM1OScsXG4gIGJhc2UwOTogJyNiMzYxNDQnLFxuICBiYXNlMEE6ICcjYTg4MzM5JyxcbiAgYmFzZTBCOiAnIzE4OTc0ZScsXG4gIGJhc2UwQzogJyM3NWE3MzgnLFxuICBiYXNlMEQ6ICcjNDc3Y2ExJyxcbiAgYmFzZTBFOiAnIzg4NjhiMycsXG4gIGJhc2UwRjogJyNiMzU4OGUnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdtb2NoYScsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMzQjMyMjgnLFxuICBiYXNlMDE6ICcjNTM0NjM2JyxcbiAgYmFzZTAyOiAnIzY0NTI0MCcsXG4gIGJhc2UwMzogJyM3ZTcwNWEnLFxuICBiYXNlMDQ6ICcjYjhhZmFkJyxcbiAgYmFzZTA1OiAnI2QwYzhjNicsXG4gIGJhc2UwNjogJyNlOWUxZGQnLFxuICBiYXNlMDc6ICcjZjVlZWViJyxcbiAgYmFzZTA4OiAnI2NiNjA3NycsXG4gIGJhc2UwOTogJyNkMjhiNzEnLFxuICBiYXNlMEE6ICcjZjRiYzg3JyxcbiAgYmFzZTBCOiAnI2JlYjU1YicsXG4gIGJhc2UwQzogJyM3YmJkYTQnLFxuICBiYXNlMEQ6ICcjOGFiM2I1JyxcbiAgYmFzZTBFOiAnI2E4OWJiOScsXG4gIGJhc2UwRjogJyNiYjk1ODQnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdtb25va2FpJyxcbiAgYXV0aG9yOiAnd2ltZXIgaGF6ZW5iZXJnIChodHRwOi8vd3d3Lm1vbm9rYWkubmwpJyxcbiAgYmFzZTAwOiAnIzI3MjgyMicsXG4gIGJhc2UwMTogJyMzODM4MzAnLFxuICBiYXNlMDI6ICcjNDk0ODNlJyxcbiAgYmFzZTAzOiAnIzc1NzE1ZScsXG4gIGJhc2UwNDogJyNhNTlmODUnLFxuICBiYXNlMDU6ICcjZjhmOGYyJyxcbiAgYmFzZTA2OiAnI2Y1ZjRmMScsXG4gIGJhc2UwNzogJyNmOWY4ZjUnLFxuICBiYXNlMDg6ICcjZjkyNjcyJyxcbiAgYmFzZTA5OiAnI2ZkOTcxZicsXG4gIGJhc2UwQTogJyNmNGJmNzUnLFxuICBiYXNlMEI6ICcjYTZlMjJlJyxcbiAgYmFzZTBDOiAnI2ExZWZlNCcsXG4gIGJhc2UwRDogJyM2NmQ5ZWYnLFxuICBiYXNlMEU6ICcjYWU4MWZmJyxcbiAgYmFzZTBGOiAnI2NjNjYzMydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ29jZWFuJyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzJiMzAzYicsXG4gIGJhc2UwMTogJyMzNDNkNDYnLFxuICBiYXNlMDI6ICcjNGY1YjY2JyxcbiAgYmFzZTAzOiAnIzY1NzM3ZScsXG4gIGJhc2UwNDogJyNhN2FkYmEnLFxuICBiYXNlMDU6ICcjYzBjNWNlJyxcbiAgYmFzZTA2OiAnI2RmZTFlOCcsXG4gIGJhc2UwNzogJyNlZmYxZjUnLFxuICBiYXNlMDg6ICcjYmY2MTZhJyxcbiAgYmFzZTA5OiAnI2QwODc3MCcsXG4gIGJhc2UwQTogJyNlYmNiOGInLFxuICBiYXNlMEI6ICcjYTNiZThjJyxcbiAgYmFzZTBDOiAnIzk2YjViNCcsXG4gIGJhc2UwRDogJyM4ZmExYjMnLFxuICBiYXNlMEU6ICcjYjQ4ZWFkJyxcbiAgYmFzZTBGOiAnI2FiNzk2Nydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ3BhcmFpc28nLFxuICBhdXRob3I6ICdqYW4gdC4gc290dCcsXG4gIGJhc2UwMDogJyMyZjFlMmUnLFxuICBiYXNlMDE6ICcjNDEzMjNmJyxcbiAgYmFzZTAyOiAnIzRmNDI0YycsXG4gIGJhc2UwMzogJyM3NzZlNzEnLFxuICBiYXNlMDQ6ICcjOGQ4Njg3JyxcbiAgYmFzZTA1OiAnI2EzOWU5YicsXG4gIGJhc2UwNjogJyNiOWI2YjAnLFxuICBiYXNlMDc6ICcjZTdlOWRiJyxcbiAgYmFzZTA4OiAnI2VmNjE1NScsXG4gIGJhc2UwOTogJyNmOTliMTUnLFxuICBiYXNlMEE6ICcjZmVjNDE4JyxcbiAgYmFzZTBCOiAnIzQ4YjY4NScsXG4gIGJhc2UwQzogJyM1YmM0YmYnLFxuICBiYXNlMEQ6ICcjMDZiNmVmJyxcbiAgYmFzZTBFOiAnIzgxNWJhNCcsXG4gIGJhc2UwRjogJyNlOTZiYTgnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdwb3AnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMDAwMDAwJyxcbiAgYmFzZTAxOiAnIzIwMjAyMCcsXG4gIGJhc2UwMjogJyMzMDMwMzAnLFxuICBiYXNlMDM6ICcjNTA1MDUwJyxcbiAgYmFzZTA0OiAnI2IwYjBiMCcsXG4gIGJhc2UwNTogJyNkMGQwZDAnLFxuICBiYXNlMDY6ICcjZTBlMGUwJyxcbiAgYmFzZTA3OiAnI2ZmZmZmZicsXG4gIGJhc2UwODogJyNlYjAwOGEnLFxuICBiYXNlMDk6ICcjZjI5MzMzJyxcbiAgYmFzZTBBOiAnI2Y4Y2ExMicsXG4gIGJhc2UwQjogJyMzN2IzNDknLFxuICBiYXNlMEM6ICcjMDBhYWJiJyxcbiAgYmFzZTBEOiAnIzBlNWE5NCcsXG4gIGJhc2UwRTogJyNiMzFlOGQnLFxuICBiYXNlMEY6ICcjN2EyZDAwJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAncmFpbHNjYXN0cycsXG4gIGF1dGhvcjogJ3J5YW4gYmF0ZXMgKGh0dHA6Ly9yYWlsc2Nhc3RzLmNvbSknLFxuICBiYXNlMDA6ICcjMmIyYjJiJyxcbiAgYmFzZTAxOiAnIzI3MjkzNScsXG4gIGJhc2UwMjogJyMzYTQwNTUnLFxuICBiYXNlMDM6ICcjNWE2NDdlJyxcbiAgYmFzZTA0OiAnI2Q0Y2ZjOScsXG4gIGJhc2UwNTogJyNlNmUxZGMnLFxuICBiYXNlMDY6ICcjZjRmMWVkJyxcbiAgYmFzZTA3OiAnI2Y5ZjdmMycsXG4gIGJhc2UwODogJyNkYTQ5MzknLFxuICBiYXNlMDk6ICcjY2M3ODMzJyxcbiAgYmFzZTBBOiAnI2ZmYzY2ZCcsXG4gIGJhc2UwQjogJyNhNWMyNjEnLFxuICBiYXNlMEM6ICcjNTE5ZjUwJyxcbiAgYmFzZTBEOiAnIzZkOWNiZScsXG4gIGJhc2UwRTogJyNiNmIzZWInLFxuICBiYXNlMEY6ICcjYmM5NDU4J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnc2hhcGVzaGlmdGVyJyxcbiAgYXV0aG9yOiAndHlsZXIgYmVuemlnZXIgKGh0dHA6Ly90eWJlbnouY29tKScsXG4gIGJhc2UwMDogJyMwMDAwMDAnLFxuICBiYXNlMDE6ICcjMDQwNDA0JyxcbiAgYmFzZTAyOiAnIzEwMjAxNScsXG4gIGJhc2UwMzogJyMzNDM0MzQnLFxuICBiYXNlMDQ6ICcjNTU1NTU1JyxcbiAgYmFzZTA1OiAnI2FiYWJhYicsXG4gIGJhc2UwNjogJyNlMGUwZTAnLFxuICBiYXNlMDc6ICcjZjlmOWY5JyxcbiAgYmFzZTA4OiAnI2U5MmYyZicsXG4gIGJhc2UwOTogJyNlMDk0NDgnLFxuICBiYXNlMEE6ICcjZGRkZDEzJyxcbiAgYmFzZTBCOiAnIzBlZDgzOScsXG4gIGJhc2UwQzogJyMyM2VkZGEnLFxuICBiYXNlMEQ6ICcjM2I0OGUzJyxcbiAgYmFzZTBFOiAnI2Y5OTZlMicsXG4gIGJhc2UwRjogJyM2OTU0MmQnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdzb2xhcml6ZWQnLFxuICBhdXRob3I6ICdldGhhbiBzY2hvb25vdmVyIChodHRwOi8vZXRoYW5zY2hvb25vdmVyLmNvbS9zb2xhcml6ZWQpJyxcbiAgYmFzZTAwOiAnIzAwMmIzNicsXG4gIGJhc2UwMTogJyMwNzM2NDInLFxuICBiYXNlMDI6ICcjNTg2ZTc1JyxcbiAgYmFzZTAzOiAnIzY1N2I4MycsXG4gIGJhc2UwNDogJyM4Mzk0OTYnLFxuICBiYXNlMDU6ICcjOTNhMWExJyxcbiAgYmFzZTA2OiAnI2VlZThkNScsXG4gIGJhc2UwNzogJyNmZGY2ZTMnLFxuICBiYXNlMDg6ICcjZGMzMjJmJyxcbiAgYmFzZTA5OiAnI2NiNGIxNicsXG4gIGJhc2UwQTogJyNiNTg5MDAnLFxuICBiYXNlMEI6ICcjODU5OTAwJyxcbiAgYmFzZTBDOiAnIzJhYTE5OCcsXG4gIGJhc2UwRDogJyMyNjhiZDInLFxuICBiYXNlMEU6ICcjNmM3MWM0JyxcbiAgYmFzZTBGOiAnI2QzMzY4Midcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ3N1bW1lcmZydWl0JyxcbiAgYXV0aG9yOiAnY2hyaXN0b3BoZXIgY29ybGV5IChodHRwOi8vY3Njb3JsZXkuZ2l0aHViLmlvLyknLFxuICBiYXNlMDA6ICcjMTUxNTE1JyxcbiAgYmFzZTAxOiAnIzIwMjAyMCcsXG4gIGJhc2UwMjogJyMzMDMwMzAnLFxuICBiYXNlMDM6ICcjNTA1MDUwJyxcbiAgYmFzZTA0OiAnI0IwQjBCMCcsXG4gIGJhc2UwNTogJyNEMEQwRDAnLFxuICBiYXNlMDY6ICcjRTBFMEUwJyxcbiAgYmFzZTA3OiAnI0ZGRkZGRicsXG4gIGJhc2UwODogJyNGRjAwODYnLFxuICBiYXNlMDk6ICcjRkQ4OTAwJyxcbiAgYmFzZTBBOiAnI0FCQTgwMCcsXG4gIGJhc2UwQjogJyMwMEM5MTgnLFxuICBiYXNlMEM6ICcjMWZhYWFhJyxcbiAgYmFzZTBEOiAnIzM3NzdFNicsXG4gIGJhc2UwRTogJyNBRDAwQTEnLFxuICBiYXNlMEY6ICcjY2M2NjMzJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAndGhyZWV6ZXJvdHdvZm91cicsXG4gIGF1dGhvcjogJ2phbiB0LiBzb3R0IChodHRwOi8vZ2l0aHViLmNvbS9pZGxlYmVyZyknLFxuICBiYXNlMDA6ICcjMDkwMzAwJyxcbiAgYmFzZTAxOiAnIzNhMzQzMicsXG4gIGJhc2UwMjogJyM0YTQ1NDMnLFxuICBiYXNlMDM6ICcjNWM1ODU1JyxcbiAgYmFzZTA0OiAnIzgwN2Q3YycsXG4gIGJhc2UwNTogJyNhNWEyYTInLFxuICBiYXNlMDY6ICcjZDZkNWQ0JyxcbiAgYmFzZTA3OiAnI2Y3ZjdmNycsXG4gIGJhc2UwODogJyNkYjJkMjAnLFxuICBiYXNlMDk6ICcjZThiYmQwJyxcbiAgYmFzZTBBOiAnI2ZkZWQwMicsXG4gIGJhc2UwQjogJyMwMWEyNTInLFxuICBiYXNlMEM6ICcjYjVlNGY0JyxcbiAgYmFzZTBEOiAnIzAxYTBlNCcsXG4gIGJhc2UwRTogJyNhMTZhOTQnLFxuICBiYXNlMEY6ICcjY2RhYjUzJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAndG9tb3Jyb3cnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMWQxZjIxJyxcbiAgYmFzZTAxOiAnIzI4MmEyZScsXG4gIGJhc2UwMjogJyMzNzNiNDEnLFxuICBiYXNlMDM6ICcjOTY5ODk2JyxcbiAgYmFzZTA0OiAnI2I0YjdiNCcsXG4gIGJhc2UwNTogJyNjNWM4YzYnLFxuICBiYXNlMDY6ICcjZTBlMGUwJyxcbiAgYmFzZTA3OiAnI2ZmZmZmZicsXG4gIGJhc2UwODogJyNjYzY2NjYnLFxuICBiYXNlMDk6ICcjZGU5MzVmJyxcbiAgYmFzZTBBOiAnI2YwYzY3NCcsXG4gIGJhc2UwQjogJyNiNWJkNjgnLFxuICBiYXNlMEM6ICcjOGFiZWI3JyxcbiAgYmFzZTBEOiAnIzgxYTJiZScsXG4gIGJhc2UwRTogJyNiMjk0YmInLFxuICBiYXNlMEY6ICcjYTM2ODVhJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnbG9uZG9uIHR1YmUnLFxuICBhdXRob3I6ICdqYW4gdC4gc290dCcsXG4gIGJhc2UwMDogJyMyMzFmMjAnLFxuICBiYXNlMDE6ICcjMWMzZjk1JyxcbiAgYmFzZTAyOiAnIzVhNTc1OCcsXG4gIGJhc2UwMzogJyM3MzcxNzEnLFxuICBiYXNlMDQ6ICcjOTU5Y2ExJyxcbiAgYmFzZTA1OiAnI2Q5ZDhkOCcsXG4gIGJhc2UwNjogJyNlN2U3ZTgnLFxuICBiYXNlMDc6ICcjZmZmZmZmJyxcbiAgYmFzZTA4OiAnI2VlMmUyNCcsXG4gIGJhc2UwOTogJyNmMzg2YTEnLFxuICBiYXNlMEE6ICcjZmZkMjA0JyxcbiAgYmFzZTBCOiAnIzAwODUzZScsXG4gIGJhc2UwQzogJyM4NWNlYmMnLFxuICBiYXNlMEQ6ICcjMDA5ZGRjJyxcbiAgYmFzZTBFOiAnIzk4MDA1ZCcsXG4gIGJhc2UwRjogJyNiMDYxMTAnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICd0d2lsaWdodCcsXG4gIGF1dGhvcjogJ2RhdmlkIGhhcnQgKGh0dHA6Ly9oYXJ0LWRldi5jb20pJyxcbiAgYmFzZTAwOiAnIzFlMWUxZScsXG4gIGJhc2UwMTogJyMzMjM1MzcnLFxuICBiYXNlMDI6ICcjNDY0YjUwJyxcbiAgYmFzZTAzOiAnIzVmNWE2MCcsXG4gIGJhc2UwNDogJyM4MzgxODQnLFxuICBiYXNlMDU6ICcjYTdhN2E3JyxcbiAgYmFzZTA2OiAnI2MzYzNjMycsXG4gIGJhc2UwNzogJyNmZmZmZmYnLFxuICBiYXNlMDg6ICcjY2Y2YTRjJyxcbiAgYmFzZTA5OiAnI2NkYTg2OScsXG4gIGJhc2UwQTogJyNmOWVlOTgnLFxuICBiYXNlMEI6ICcjOGY5ZDZhJyxcbiAgYmFzZTBDOiAnI2FmYzRkYicsXG4gIGJhc2UwRDogJyM3NTg3YTYnLFxuICBiYXNlMEU6ICcjOWI4NTlkJyxcbiAgYmFzZTBGOiAnIzliNzAzZidcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIvKiBNSVQgbGljZW5zZSAqL1xudmFyIGNzc0tleXdvcmRzID0gcmVxdWlyZSgnY29sb3ItbmFtZScpO1xuXG4vLyBOT1RFOiBjb252ZXJzaW9ucyBzaG91bGQgb25seSByZXR1cm4gcHJpbWl0aXZlIHZhbHVlcyAoaS5lLiBhcnJheXMsIG9yXG4vLyAgICAgICB2YWx1ZXMgdGhhdCBnaXZlIGNvcnJlY3QgYHR5cGVvZmAgcmVzdWx0cykuXG4vLyAgICAgICBkbyBub3QgdXNlIGJveCB2YWx1ZXMgdHlwZXMgKGkuZS4gTnVtYmVyKCksIFN0cmluZygpLCBldGMuKVxuXG52YXIgcmV2ZXJzZUtleXdvcmRzID0ge307XG5mb3IgKHZhciBrZXkgaW4gY3NzS2V5d29yZHMpIHtcblx0aWYgKGNzc0tleXdvcmRzLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRyZXZlcnNlS2V5d29yZHNbY3NzS2V5d29yZHNba2V5XV0gPSBrZXk7XG5cdH1cbn1cblxudmFyIGNvbnZlcnQgPSBtb2R1bGUuZXhwb3J0cyA9IHtcblx0cmdiOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ3JnYid9LFxuXHRoc2w6IHtjaGFubmVsczogMywgbGFiZWxzOiAnaHNsJ30sXG5cdGhzdjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdoc3YnfSxcblx0aHdiOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2h3Yid9LFxuXHRjbXlrOiB7Y2hhbm5lbHM6IDQsIGxhYmVsczogJ2NteWsnfSxcblx0eHl6OiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ3h5eid9LFxuXHRsYWI6IHtjaGFubmVsczogMywgbGFiZWxzOiAnbGFiJ30sXG5cdGxjaDoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdsY2gnfSxcblx0aGV4OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydoZXgnXX0sXG5cdGtleXdvcmQ6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2tleXdvcmQnXX0sXG5cdGFuc2kxNjoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnYW5zaTE2J119LFxuXHRhbnNpMjU2OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydhbnNpMjU2J119LFxuXHRoY2c6IHtjaGFubmVsczogMywgbGFiZWxzOiBbJ2gnLCAnYycsICdnJ119LFxuXHRhcHBsZToge2NoYW5uZWxzOiAzLCBsYWJlbHM6IFsncjE2JywgJ2cxNicsICdiMTYnXX0sXG5cdGdyYXk6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2dyYXknXX1cbn07XG5cbi8vIGhpZGUgLmNoYW5uZWxzIGFuZCAubGFiZWxzIHByb3BlcnRpZXNcbmZvciAodmFyIG1vZGVsIGluIGNvbnZlcnQpIHtcblx0aWYgKGNvbnZlcnQuaGFzT3duUHJvcGVydHkobW9kZWwpKSB7XG5cdFx0aWYgKCEoJ2NoYW5uZWxzJyBpbiBjb252ZXJ0W21vZGVsXSkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignbWlzc2luZyBjaGFubmVscyBwcm9wZXJ0eTogJyArIG1vZGVsKTtcblx0XHR9XG5cblx0XHRpZiAoISgnbGFiZWxzJyBpbiBjb252ZXJ0W21vZGVsXSkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignbWlzc2luZyBjaGFubmVsIGxhYmVscyBwcm9wZXJ0eTogJyArIG1vZGVsKTtcblx0XHR9XG5cblx0XHRpZiAoY29udmVydFttb2RlbF0ubGFiZWxzLmxlbmd0aCAhPT0gY29udmVydFttb2RlbF0uY2hhbm5lbHMpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignY2hhbm5lbCBhbmQgbGFiZWwgY291bnRzIG1pc21hdGNoOiAnICsgbW9kZWwpO1xuXHRcdH1cblxuXHRcdHZhciBjaGFubmVscyA9IGNvbnZlcnRbbW9kZWxdLmNoYW5uZWxzO1xuXHRcdHZhciBsYWJlbHMgPSBjb252ZXJ0W21vZGVsXS5sYWJlbHM7XG5cdFx0ZGVsZXRlIGNvbnZlcnRbbW9kZWxdLmNoYW5uZWxzO1xuXHRcdGRlbGV0ZSBjb252ZXJ0W21vZGVsXS5sYWJlbHM7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbbW9kZWxdLCAnY2hhbm5lbHMnLCB7dmFsdWU6IGNoYW5uZWxzfSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbbW9kZWxdLCAnbGFiZWxzJywge3ZhbHVlOiBsYWJlbHN9KTtcblx0fVxufVxuXG5jb252ZXJ0LnJnYi5oc2wgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciByID0gcmdiWzBdIC8gMjU1O1xuXHR2YXIgZyA9IHJnYlsxXSAvIDI1NTtcblx0dmFyIGIgPSByZ2JbMl0gLyAyNTU7XG5cdHZhciBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcblx0dmFyIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xuXHR2YXIgZGVsdGEgPSBtYXggLSBtaW47XG5cdHZhciBoO1xuXHR2YXIgcztcblx0dmFyIGw7XG5cblx0aWYgKG1heCA9PT0gbWluKSB7XG5cdFx0aCA9IDA7XG5cdH0gZWxzZSBpZiAociA9PT0gbWF4KSB7XG5cdFx0aCA9IChnIC0gYikgLyBkZWx0YTtcblx0fSBlbHNlIGlmIChnID09PSBtYXgpIHtcblx0XHRoID0gMiArIChiIC0gcikgLyBkZWx0YTtcblx0fSBlbHNlIGlmIChiID09PSBtYXgpIHtcblx0XHRoID0gNCArIChyIC0gZykgLyBkZWx0YTtcblx0fVxuXG5cdGggPSBNYXRoLm1pbihoICogNjAsIDM2MCk7XG5cblx0aWYgKGggPCAwKSB7XG5cdFx0aCArPSAzNjA7XG5cdH1cblxuXHRsID0gKG1pbiArIG1heCkgLyAyO1xuXG5cdGlmIChtYXggPT09IG1pbikge1xuXHRcdHMgPSAwO1xuXHR9IGVsc2UgaWYgKGwgPD0gMC41KSB7XG5cdFx0cyA9IGRlbHRhIC8gKG1heCArIG1pbik7XG5cdH0gZWxzZSB7XG5cdFx0cyA9IGRlbHRhIC8gKDIgLSBtYXggLSBtaW4pO1xuXHR9XG5cblx0cmV0dXJuIFtoLCBzICogMTAwLCBsICogMTAwXTtcbn07XG5cbmNvbnZlcnQucmdiLmhzdiA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHJkaWY7XG5cdHZhciBnZGlmO1xuXHR2YXIgYmRpZjtcblx0dmFyIGg7XG5cdHZhciBzO1xuXG5cdHZhciByID0gcmdiWzBdIC8gMjU1O1xuXHR2YXIgZyA9IHJnYlsxXSAvIDI1NTtcblx0dmFyIGIgPSByZ2JbMl0gLyAyNTU7XG5cdHZhciB2ID0gTWF0aC5tYXgociwgZywgYik7XG5cdHZhciBkaWZmID0gdiAtIE1hdGgubWluKHIsIGcsIGIpO1xuXHR2YXIgZGlmZmMgPSBmdW5jdGlvbiAoYykge1xuXHRcdHJldHVybiAodiAtIGMpIC8gNiAvIGRpZmYgKyAxIC8gMjtcblx0fTtcblxuXHRpZiAoZGlmZiA9PT0gMCkge1xuXHRcdGggPSBzID0gMDtcblx0fSBlbHNlIHtcblx0XHRzID0gZGlmZiAvIHY7XG5cdFx0cmRpZiA9IGRpZmZjKHIpO1xuXHRcdGdkaWYgPSBkaWZmYyhnKTtcblx0XHRiZGlmID0gZGlmZmMoYik7XG5cblx0XHRpZiAociA9PT0gdikge1xuXHRcdFx0aCA9IGJkaWYgLSBnZGlmO1xuXHRcdH0gZWxzZSBpZiAoZyA9PT0gdikge1xuXHRcdFx0aCA9ICgxIC8gMykgKyByZGlmIC0gYmRpZjtcblx0XHR9IGVsc2UgaWYgKGIgPT09IHYpIHtcblx0XHRcdGggPSAoMiAvIDMpICsgZ2RpZiAtIHJkaWY7XG5cdFx0fVxuXHRcdGlmIChoIDwgMCkge1xuXHRcdFx0aCArPSAxO1xuXHRcdH0gZWxzZSBpZiAoaCA+IDEpIHtcblx0XHRcdGggLT0gMTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gW1xuXHRcdGggKiAzNjAsXG5cdFx0cyAqIDEwMCxcblx0XHR2ICogMTAwXG5cdF07XG59O1xuXG5jb252ZXJ0LnJnYi5od2IgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciByID0gcmdiWzBdO1xuXHR2YXIgZyA9IHJnYlsxXTtcblx0dmFyIGIgPSByZ2JbMl07XG5cdHZhciBoID0gY29udmVydC5yZ2IuaHNsKHJnYilbMF07XG5cdHZhciB3ID0gMSAvIDI1NSAqIE1hdGgubWluKHIsIE1hdGgubWluKGcsIGIpKTtcblxuXHRiID0gMSAtIDEgLyAyNTUgKiBNYXRoLm1heChyLCBNYXRoLm1heChnLCBiKSk7XG5cblx0cmV0dXJuIFtoLCB3ICogMTAwLCBiICogMTAwXTtcbn07XG5cbmNvbnZlcnQucmdiLmNteWsgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciByID0gcmdiWzBdIC8gMjU1O1xuXHR2YXIgZyA9IHJnYlsxXSAvIDI1NTtcblx0dmFyIGIgPSByZ2JbMl0gLyAyNTU7XG5cdHZhciBjO1xuXHR2YXIgbTtcblx0dmFyIHk7XG5cdHZhciBrO1xuXG5cdGsgPSBNYXRoLm1pbigxIC0gciwgMSAtIGcsIDEgLSBiKTtcblx0YyA9ICgxIC0gciAtIGspIC8gKDEgLSBrKSB8fCAwO1xuXHRtID0gKDEgLSBnIC0gaykgLyAoMSAtIGspIHx8IDA7XG5cdHkgPSAoMSAtIGIgLSBrKSAvICgxIC0gaykgfHwgMDtcblxuXHRyZXR1cm4gW2MgKiAxMDAsIG0gKiAxMDAsIHkgKiAxMDAsIGsgKiAxMDBdO1xufTtcblxuLyoqXG4gKiBTZWUgaHR0cHM6Ly9lbi5tLndpa2lwZWRpYS5vcmcvd2lraS9FdWNsaWRlYW5fZGlzdGFuY2UjU3F1YXJlZF9FdWNsaWRlYW5fZGlzdGFuY2VcbiAqICovXG5mdW5jdGlvbiBjb21wYXJhdGl2ZURpc3RhbmNlKHgsIHkpIHtcblx0cmV0dXJuIChcblx0XHRNYXRoLnBvdyh4WzBdIC0geVswXSwgMikgK1xuXHRcdE1hdGgucG93KHhbMV0gLSB5WzFdLCAyKSArXG5cdFx0TWF0aC5wb3coeFsyXSAtIHlbMl0sIDIpXG5cdCk7XG59XG5cbmNvbnZlcnQucmdiLmtleXdvcmQgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciByZXZlcnNlZCA9IHJldmVyc2VLZXl3b3Jkc1tyZ2JdO1xuXHRpZiAocmV2ZXJzZWQpIHtcblx0XHRyZXR1cm4gcmV2ZXJzZWQ7XG5cdH1cblxuXHR2YXIgY3VycmVudENsb3Nlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuXHR2YXIgY3VycmVudENsb3Nlc3RLZXl3b3JkO1xuXG5cdGZvciAodmFyIGtleXdvcmQgaW4gY3NzS2V5d29yZHMpIHtcblx0XHRpZiAoY3NzS2V5d29yZHMuaGFzT3duUHJvcGVydHkoa2V5d29yZCkpIHtcblx0XHRcdHZhciB2YWx1ZSA9IGNzc0tleXdvcmRzW2tleXdvcmRdO1xuXG5cdFx0XHQvLyBDb21wdXRlIGNvbXBhcmF0aXZlIGRpc3RhbmNlXG5cdFx0XHR2YXIgZGlzdGFuY2UgPSBjb21wYXJhdGl2ZURpc3RhbmNlKHJnYiwgdmFsdWUpO1xuXG5cdFx0XHQvLyBDaGVjayBpZiBpdHMgbGVzcywgaWYgc28gc2V0IGFzIGNsb3Nlc3Rcblx0XHRcdGlmIChkaXN0YW5jZSA8IGN1cnJlbnRDbG9zZXN0RGlzdGFuY2UpIHtcblx0XHRcdFx0Y3VycmVudENsb3Nlc3REaXN0YW5jZSA9IGRpc3RhbmNlO1xuXHRcdFx0XHRjdXJyZW50Q2xvc2VzdEtleXdvcmQgPSBrZXl3b3JkO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjdXJyZW50Q2xvc2VzdEtleXdvcmQ7XG59O1xuXG5jb252ZXJ0LmtleXdvcmQucmdiID0gZnVuY3Rpb24gKGtleXdvcmQpIHtcblx0cmV0dXJuIGNzc0tleXdvcmRzW2tleXdvcmRdO1xufTtcblxuY29udmVydC5yZ2IueHl6ID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgciA9IHJnYlswXSAvIDI1NTtcblx0dmFyIGcgPSByZ2JbMV0gLyAyNTU7XG5cdHZhciBiID0gcmdiWzJdIC8gMjU1O1xuXG5cdC8vIGFzc3VtZSBzUkdCXG5cdHIgPSByID4gMC4wNDA0NSA/IE1hdGgucG93KCgociArIDAuMDU1KSAvIDEuMDU1KSwgMi40KSA6IChyIC8gMTIuOTIpO1xuXHRnID0gZyA+IDAuMDQwNDUgPyBNYXRoLnBvdygoKGcgKyAwLjA1NSkgLyAxLjA1NSksIDIuNCkgOiAoZyAvIDEyLjkyKTtcblx0YiA9IGIgPiAwLjA0MDQ1ID8gTWF0aC5wb3coKChiICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpIDogKGIgLyAxMi45Mik7XG5cblx0dmFyIHggPSAociAqIDAuNDEyNCkgKyAoZyAqIDAuMzU3NikgKyAoYiAqIDAuMTgwNSk7XG5cdHZhciB5ID0gKHIgKiAwLjIxMjYpICsgKGcgKiAwLjcxNTIpICsgKGIgKiAwLjA3MjIpO1xuXHR2YXIgeiA9IChyICogMC4wMTkzKSArIChnICogMC4xMTkyKSArIChiICogMC45NTA1KTtcblxuXHRyZXR1cm4gW3ggKiAxMDAsIHkgKiAxMDAsIHogKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IubGFiID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgeHl6ID0gY29udmVydC5yZ2IueHl6KHJnYik7XG5cdHZhciB4ID0geHl6WzBdO1xuXHR2YXIgeSA9IHh5elsxXTtcblx0dmFyIHogPSB4eXpbMl07XG5cdHZhciBsO1xuXHR2YXIgYTtcblx0dmFyIGI7XG5cblx0eCAvPSA5NS4wNDc7XG5cdHkgLz0gMTAwO1xuXHR6IC89IDEwOC44ODM7XG5cblx0eCA9IHggPiAwLjAwODg1NiA/IE1hdGgucG93KHgsIDEgLyAzKSA6ICg3Ljc4NyAqIHgpICsgKDE2IC8gMTE2KTtcblx0eSA9IHkgPiAwLjAwODg1NiA/IE1hdGgucG93KHksIDEgLyAzKSA6ICg3Ljc4NyAqIHkpICsgKDE2IC8gMTE2KTtcblx0eiA9IHogPiAwLjAwODg1NiA/IE1hdGgucG93KHosIDEgLyAzKSA6ICg3Ljc4NyAqIHopICsgKDE2IC8gMTE2KTtcblxuXHRsID0gKDExNiAqIHkpIC0gMTY7XG5cdGEgPSA1MDAgKiAoeCAtIHkpO1xuXHRiID0gMjAwICogKHkgLSB6KTtcblxuXHRyZXR1cm4gW2wsIGEsIGJdO1xufTtcblxuY29udmVydC5oc2wucmdiID0gZnVuY3Rpb24gKGhzbCkge1xuXHR2YXIgaCA9IGhzbFswXSAvIDM2MDtcblx0dmFyIHMgPSBoc2xbMV0gLyAxMDA7XG5cdHZhciBsID0gaHNsWzJdIC8gMTAwO1xuXHR2YXIgdDE7XG5cdHZhciB0Mjtcblx0dmFyIHQzO1xuXHR2YXIgcmdiO1xuXHR2YXIgdmFsO1xuXG5cdGlmIChzID09PSAwKSB7XG5cdFx0dmFsID0gbCAqIDI1NTtcblx0XHRyZXR1cm4gW3ZhbCwgdmFsLCB2YWxdO1xuXHR9XG5cblx0aWYgKGwgPCAwLjUpIHtcblx0XHR0MiA9IGwgKiAoMSArIHMpO1xuXHR9IGVsc2Uge1xuXHRcdHQyID0gbCArIHMgLSBsICogcztcblx0fVxuXG5cdHQxID0gMiAqIGwgLSB0MjtcblxuXHRyZ2IgPSBbMCwgMCwgMF07XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0dDMgPSBoICsgMSAvIDMgKiAtKGkgLSAxKTtcblx0XHRpZiAodDMgPCAwKSB7XG5cdFx0XHR0MysrO1xuXHRcdH1cblx0XHRpZiAodDMgPiAxKSB7XG5cdFx0XHR0My0tO1xuXHRcdH1cblxuXHRcdGlmICg2ICogdDMgPCAxKSB7XG5cdFx0XHR2YWwgPSB0MSArICh0MiAtIHQxKSAqIDYgKiB0Mztcblx0XHR9IGVsc2UgaWYgKDIgKiB0MyA8IDEpIHtcblx0XHRcdHZhbCA9IHQyO1xuXHRcdH0gZWxzZSBpZiAoMyAqIHQzIDwgMikge1xuXHRcdFx0dmFsID0gdDEgKyAodDIgLSB0MSkgKiAoMiAvIDMgLSB0MykgKiA2O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YWwgPSB0MTtcblx0XHR9XG5cblx0XHRyZ2JbaV0gPSB2YWwgKiAyNTU7XG5cdH1cblxuXHRyZXR1cm4gcmdiO1xufTtcblxuY29udmVydC5oc2wuaHN2ID0gZnVuY3Rpb24gKGhzbCkge1xuXHR2YXIgaCA9IGhzbFswXTtcblx0dmFyIHMgPSBoc2xbMV0gLyAxMDA7XG5cdHZhciBsID0gaHNsWzJdIC8gMTAwO1xuXHR2YXIgc21pbiA9IHM7XG5cdHZhciBsbWluID0gTWF0aC5tYXgobCwgMC4wMSk7XG5cdHZhciBzdjtcblx0dmFyIHY7XG5cblx0bCAqPSAyO1xuXHRzICo9IChsIDw9IDEpID8gbCA6IDIgLSBsO1xuXHRzbWluICo9IGxtaW4gPD0gMSA/IGxtaW4gOiAyIC0gbG1pbjtcblx0diA9IChsICsgcykgLyAyO1xuXHRzdiA9IGwgPT09IDAgPyAoMiAqIHNtaW4pIC8gKGxtaW4gKyBzbWluKSA6ICgyICogcykgLyAobCArIHMpO1xuXG5cdHJldHVybiBbaCwgc3YgKiAxMDAsIHYgKiAxMDBdO1xufTtcblxuY29udmVydC5oc3YucmdiID0gZnVuY3Rpb24gKGhzdikge1xuXHR2YXIgaCA9IGhzdlswXSAvIDYwO1xuXHR2YXIgcyA9IGhzdlsxXSAvIDEwMDtcblx0dmFyIHYgPSBoc3ZbMl0gLyAxMDA7XG5cdHZhciBoaSA9IE1hdGguZmxvb3IoaCkgJSA2O1xuXG5cdHZhciBmID0gaCAtIE1hdGguZmxvb3IoaCk7XG5cdHZhciBwID0gMjU1ICogdiAqICgxIC0gcyk7XG5cdHZhciBxID0gMjU1ICogdiAqICgxIC0gKHMgKiBmKSk7XG5cdHZhciB0ID0gMjU1ICogdiAqICgxIC0gKHMgKiAoMSAtIGYpKSk7XG5cdHYgKj0gMjU1O1xuXG5cdHN3aXRjaCAoaGkpIHtcblx0XHRjYXNlIDA6XG5cdFx0XHRyZXR1cm4gW3YsIHQsIHBdO1xuXHRcdGNhc2UgMTpcblx0XHRcdHJldHVybiBbcSwgdiwgcF07XG5cdFx0Y2FzZSAyOlxuXHRcdFx0cmV0dXJuIFtwLCB2LCB0XTtcblx0XHRjYXNlIDM6XG5cdFx0XHRyZXR1cm4gW3AsIHEsIHZdO1xuXHRcdGNhc2UgNDpcblx0XHRcdHJldHVybiBbdCwgcCwgdl07XG5cdFx0Y2FzZSA1OlxuXHRcdFx0cmV0dXJuIFt2LCBwLCBxXTtcblx0fVxufTtcblxuY29udmVydC5oc3YuaHNsID0gZnVuY3Rpb24gKGhzdikge1xuXHR2YXIgaCA9IGhzdlswXTtcblx0dmFyIHMgPSBoc3ZbMV0gLyAxMDA7XG5cdHZhciB2ID0gaHN2WzJdIC8gMTAwO1xuXHR2YXIgdm1pbiA9IE1hdGgubWF4KHYsIDAuMDEpO1xuXHR2YXIgbG1pbjtcblx0dmFyIHNsO1xuXHR2YXIgbDtcblxuXHRsID0gKDIgLSBzKSAqIHY7XG5cdGxtaW4gPSAoMiAtIHMpICogdm1pbjtcblx0c2wgPSBzICogdm1pbjtcblx0c2wgLz0gKGxtaW4gPD0gMSkgPyBsbWluIDogMiAtIGxtaW47XG5cdHNsID0gc2wgfHwgMDtcblx0bCAvPSAyO1xuXG5cdHJldHVybiBbaCwgc2wgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuLy8gaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzLWNvbG9yLyNod2ItdG8tcmdiXG5jb252ZXJ0Lmh3Yi5yZ2IgPSBmdW5jdGlvbiAoaHdiKSB7XG5cdHZhciBoID0gaHdiWzBdIC8gMzYwO1xuXHR2YXIgd2ggPSBod2JbMV0gLyAxMDA7XG5cdHZhciBibCA9IGh3YlsyXSAvIDEwMDtcblx0dmFyIHJhdGlvID0gd2ggKyBibDtcblx0dmFyIGk7XG5cdHZhciB2O1xuXHR2YXIgZjtcblx0dmFyIG47XG5cblx0Ly8gd2ggKyBibCBjYW50IGJlID4gMVxuXHRpZiAocmF0aW8gPiAxKSB7XG5cdFx0d2ggLz0gcmF0aW87XG5cdFx0YmwgLz0gcmF0aW87XG5cdH1cblxuXHRpID0gTWF0aC5mbG9vcig2ICogaCk7XG5cdHYgPSAxIC0gYmw7XG5cdGYgPSA2ICogaCAtIGk7XG5cblx0aWYgKChpICYgMHgwMSkgIT09IDApIHtcblx0XHRmID0gMSAtIGY7XG5cdH1cblxuXHRuID0gd2ggKyBmICogKHYgLSB3aCk7IC8vIGxpbmVhciBpbnRlcnBvbGF0aW9uXG5cblx0dmFyIHI7XG5cdHZhciBnO1xuXHR2YXIgYjtcblx0c3dpdGNoIChpKSB7XG5cdFx0ZGVmYXVsdDpcblx0XHRjYXNlIDY6XG5cdFx0Y2FzZSAwOiByID0gdjsgZyA9IG47IGIgPSB3aDsgYnJlYWs7XG5cdFx0Y2FzZSAxOiByID0gbjsgZyA9IHY7IGIgPSB3aDsgYnJlYWs7XG5cdFx0Y2FzZSAyOiByID0gd2g7IGcgPSB2OyBiID0gbjsgYnJlYWs7XG5cdFx0Y2FzZSAzOiByID0gd2g7IGcgPSBuOyBiID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSA0OiByID0gbjsgZyA9IHdoOyBiID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSA1OiByID0gdjsgZyA9IHdoOyBiID0gbjsgYnJlYWs7XG5cdH1cblxuXHRyZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xufTtcblxuY29udmVydC5jbXlrLnJnYiA9IGZ1bmN0aW9uIChjbXlrKSB7XG5cdHZhciBjID0gY215a1swXSAvIDEwMDtcblx0dmFyIG0gPSBjbXlrWzFdIC8gMTAwO1xuXHR2YXIgeSA9IGNteWtbMl0gLyAxMDA7XG5cdHZhciBrID0gY215a1szXSAvIDEwMDtcblx0dmFyIHI7XG5cdHZhciBnO1xuXHR2YXIgYjtcblxuXHRyID0gMSAtIE1hdGgubWluKDEsIGMgKiAoMSAtIGspICsgayk7XG5cdGcgPSAxIC0gTWF0aC5taW4oMSwgbSAqICgxIC0gaykgKyBrKTtcblx0YiA9IDEgLSBNYXRoLm1pbigxLCB5ICogKDEgLSBrKSArIGspO1xuXG5cdHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59O1xuXG5jb252ZXJ0Lnh5ei5yZ2IgPSBmdW5jdGlvbiAoeHl6KSB7XG5cdHZhciB4ID0geHl6WzBdIC8gMTAwO1xuXHR2YXIgeSA9IHh5elsxXSAvIDEwMDtcblx0dmFyIHogPSB4eXpbMl0gLyAxMDA7XG5cdHZhciByO1xuXHR2YXIgZztcblx0dmFyIGI7XG5cblx0ciA9ICh4ICogMy4yNDA2KSArICh5ICogLTEuNTM3MikgKyAoeiAqIC0wLjQ5ODYpO1xuXHRnID0gKHggKiAtMC45Njg5KSArICh5ICogMS44NzU4KSArICh6ICogMC4wNDE1KTtcblx0YiA9ICh4ICogMC4wNTU3KSArICh5ICogLTAuMjA0MCkgKyAoeiAqIDEuMDU3MCk7XG5cblx0Ly8gYXNzdW1lIHNSR0Jcblx0ciA9IHIgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiBNYXRoLnBvdyhyLCAxLjAgLyAyLjQpKSAtIDAuMDU1KVxuXHRcdDogciAqIDEyLjkyO1xuXG5cdGcgPSBnID4gMC4wMDMxMzA4XG5cdFx0PyAoKDEuMDU1ICogTWF0aC5wb3coZywgMS4wIC8gMi40KSkgLSAwLjA1NSlcblx0XHQ6IGcgKiAxMi45MjtcblxuXHRiID0gYiA+IDAuMDAzMTMwOFxuXHRcdD8gKCgxLjA1NSAqIE1hdGgucG93KGIsIDEuMCAvIDIuNCkpIC0gMC4wNTUpXG5cdFx0OiBiICogMTIuOTI7XG5cblx0ciA9IE1hdGgubWluKE1hdGgubWF4KDAsIHIpLCAxKTtcblx0ZyA9IE1hdGgubWluKE1hdGgubWF4KDAsIGcpLCAxKTtcblx0YiA9IE1hdGgubWluKE1hdGgubWF4KDAsIGIpLCAxKTtcblxuXHRyZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xufTtcblxuY29udmVydC54eXoubGFiID0gZnVuY3Rpb24gKHh5eikge1xuXHR2YXIgeCA9IHh5elswXTtcblx0dmFyIHkgPSB4eXpbMV07XG5cdHZhciB6ID0geHl6WzJdO1xuXHR2YXIgbDtcblx0dmFyIGE7XG5cdHZhciBiO1xuXG5cdHggLz0gOTUuMDQ3O1xuXHR5IC89IDEwMDtcblx0eiAvPSAxMDguODgzO1xuXG5cdHggPSB4ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh4LCAxIC8gMykgOiAoNy43ODcgKiB4KSArICgxNiAvIDExNik7XG5cdHkgPSB5ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh5LCAxIC8gMykgOiAoNy43ODcgKiB5KSArICgxNiAvIDExNik7XG5cdHogPSB6ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh6LCAxIC8gMykgOiAoNy43ODcgKiB6KSArICgxNiAvIDExNik7XG5cblx0bCA9ICgxMTYgKiB5KSAtIDE2O1xuXHRhID0gNTAwICogKHggLSB5KTtcblx0YiA9IDIwMCAqICh5IC0geik7XG5cblx0cmV0dXJuIFtsLCBhLCBiXTtcbn07XG5cbmNvbnZlcnQubGFiLnh5eiA9IGZ1bmN0aW9uIChsYWIpIHtcblx0dmFyIGwgPSBsYWJbMF07XG5cdHZhciBhID0gbGFiWzFdO1xuXHR2YXIgYiA9IGxhYlsyXTtcblx0dmFyIHg7XG5cdHZhciB5O1xuXHR2YXIgejtcblxuXHR5ID0gKGwgKyAxNikgLyAxMTY7XG5cdHggPSBhIC8gNTAwICsgeTtcblx0eiA9IHkgLSBiIC8gMjAwO1xuXG5cdHZhciB5MiA9IE1hdGgucG93KHksIDMpO1xuXHR2YXIgeDIgPSBNYXRoLnBvdyh4LCAzKTtcblx0dmFyIHoyID0gTWF0aC5wb3coeiwgMyk7XG5cdHkgPSB5MiA+IDAuMDA4ODU2ID8geTIgOiAoeSAtIDE2IC8gMTE2KSAvIDcuNzg3O1xuXHR4ID0geDIgPiAwLjAwODg1NiA/IHgyIDogKHggLSAxNiAvIDExNikgLyA3Ljc4Nztcblx0eiA9IHoyID4gMC4wMDg4NTYgPyB6MiA6ICh6IC0gMTYgLyAxMTYpIC8gNy43ODc7XG5cblx0eCAqPSA5NS4wNDc7XG5cdHkgKj0gMTAwO1xuXHR6ICo9IDEwOC44ODM7XG5cblx0cmV0dXJuIFt4LCB5LCB6XTtcbn07XG5cbmNvbnZlcnQubGFiLmxjaCA9IGZ1bmN0aW9uIChsYWIpIHtcblx0dmFyIGwgPSBsYWJbMF07XG5cdHZhciBhID0gbGFiWzFdO1xuXHR2YXIgYiA9IGxhYlsyXTtcblx0dmFyIGhyO1xuXHR2YXIgaDtcblx0dmFyIGM7XG5cblx0aHIgPSBNYXRoLmF0YW4yKGIsIGEpO1xuXHRoID0gaHIgKiAzNjAgLyAyIC8gTWF0aC5QSTtcblxuXHRpZiAoaCA8IDApIHtcblx0XHRoICs9IDM2MDtcblx0fVxuXG5cdGMgPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7XG5cblx0cmV0dXJuIFtsLCBjLCBoXTtcbn07XG5cbmNvbnZlcnQubGNoLmxhYiA9IGZ1bmN0aW9uIChsY2gpIHtcblx0dmFyIGwgPSBsY2hbMF07XG5cdHZhciBjID0gbGNoWzFdO1xuXHR2YXIgaCA9IGxjaFsyXTtcblx0dmFyIGE7XG5cdHZhciBiO1xuXHR2YXIgaHI7XG5cblx0aHIgPSBoIC8gMzYwICogMiAqIE1hdGguUEk7XG5cdGEgPSBjICogTWF0aC5jb3MoaHIpO1xuXHRiID0gYyAqIE1hdGguc2luKGhyKTtcblxuXHRyZXR1cm4gW2wsIGEsIGJdO1xufTtcblxuY29udmVydC5yZ2IuYW5zaTE2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0dmFyIHIgPSBhcmdzWzBdO1xuXHR2YXIgZyA9IGFyZ3NbMV07XG5cdHZhciBiID0gYXJnc1syXTtcblx0dmFyIHZhbHVlID0gMSBpbiBhcmd1bWVudHMgPyBhcmd1bWVudHNbMV0gOiBjb252ZXJ0LnJnYi5oc3YoYXJncylbMl07IC8vIGhzdiAtPiBhbnNpMTYgb3B0aW1pemF0aW9uXG5cblx0dmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlIC8gNTApO1xuXG5cdGlmICh2YWx1ZSA9PT0gMCkge1xuXHRcdHJldHVybiAzMDtcblx0fVxuXG5cdHZhciBhbnNpID0gMzBcblx0XHQrICgoTWF0aC5yb3VuZChiIC8gMjU1KSA8PCAyKVxuXHRcdHwgKE1hdGgucm91bmQoZyAvIDI1NSkgPDwgMSlcblx0XHR8IE1hdGgucm91bmQociAvIDI1NSkpO1xuXG5cdGlmICh2YWx1ZSA9PT0gMikge1xuXHRcdGFuc2kgKz0gNjA7XG5cdH1cblxuXHRyZXR1cm4gYW5zaTtcbn07XG5cbmNvbnZlcnQuaHN2LmFuc2kxNiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdC8vIG9wdGltaXphdGlvbiBoZXJlOyB3ZSBhbHJlYWR5IGtub3cgdGhlIHZhbHVlIGFuZCBkb24ndCBuZWVkIHRvIGdldFxuXHQvLyBpdCBjb252ZXJ0ZWQgZm9yIHVzLlxuXHRyZXR1cm4gY29udmVydC5yZ2IuYW5zaTE2KGNvbnZlcnQuaHN2LnJnYihhcmdzKSwgYXJnc1syXSk7XG59O1xuXG5jb252ZXJ0LnJnYi5hbnNpMjU2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0dmFyIHIgPSBhcmdzWzBdO1xuXHR2YXIgZyA9IGFyZ3NbMV07XG5cdHZhciBiID0gYXJnc1syXTtcblxuXHQvLyB3ZSB1c2UgdGhlIGV4dGVuZGVkIGdyZXlzY2FsZSBwYWxldHRlIGhlcmUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZlxuXHQvLyBibGFjayBhbmQgd2hpdGUuIG5vcm1hbCBwYWxldHRlIG9ubHkgaGFzIDQgZ3JleXNjYWxlIHNoYWRlcy5cblx0aWYgKHIgPT09IGcgJiYgZyA9PT0gYikge1xuXHRcdGlmIChyIDwgOCkge1xuXHRcdFx0cmV0dXJuIDE2O1xuXHRcdH1cblxuXHRcdGlmIChyID4gMjQ4KSB7XG5cdFx0XHRyZXR1cm4gMjMxO1xuXHRcdH1cblxuXHRcdHJldHVybiBNYXRoLnJvdW5kKCgociAtIDgpIC8gMjQ3KSAqIDI0KSArIDIzMjtcblx0fVxuXG5cdHZhciBhbnNpID0gMTZcblx0XHQrICgzNiAqIE1hdGgucm91bmQociAvIDI1NSAqIDUpKVxuXHRcdCsgKDYgKiBNYXRoLnJvdW5kKGcgLyAyNTUgKiA1KSlcblx0XHQrIE1hdGgucm91bmQoYiAvIDI1NSAqIDUpO1xuXG5cdHJldHVybiBhbnNpO1xufTtcblxuY29udmVydC5hbnNpMTYucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0dmFyIGNvbG9yID0gYXJncyAlIDEwO1xuXG5cdC8vIGhhbmRsZSBncmV5c2NhbGVcblx0aWYgKGNvbG9yID09PSAwIHx8IGNvbG9yID09PSA3KSB7XG5cdFx0aWYgKGFyZ3MgPiA1MCkge1xuXHRcdFx0Y29sb3IgKz0gMy41O1xuXHRcdH1cblxuXHRcdGNvbG9yID0gY29sb3IgLyAxMC41ICogMjU1O1xuXG5cdFx0cmV0dXJuIFtjb2xvciwgY29sb3IsIGNvbG9yXTtcblx0fVxuXG5cdHZhciBtdWx0ID0gKH5+KGFyZ3MgPiA1MCkgKyAxKSAqIDAuNTtcblx0dmFyIHIgPSAoKGNvbG9yICYgMSkgKiBtdWx0KSAqIDI1NTtcblx0dmFyIGcgPSAoKChjb2xvciA+PiAxKSAmIDEpICogbXVsdCkgKiAyNTU7XG5cdHZhciBiID0gKCgoY29sb3IgPj4gMikgJiAxKSAqIG11bHQpICogMjU1O1xuXG5cdHJldHVybiBbciwgZywgYl07XG59O1xuXG5jb252ZXJ0LmFuc2kyNTYucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Ly8gaGFuZGxlIGdyZXlzY2FsZVxuXHRpZiAoYXJncyA+PSAyMzIpIHtcblx0XHR2YXIgYyA9IChhcmdzIC0gMjMyKSAqIDEwICsgODtcblx0XHRyZXR1cm4gW2MsIGMsIGNdO1xuXHR9XG5cblx0YXJncyAtPSAxNjtcblxuXHR2YXIgcmVtO1xuXHR2YXIgciA9IE1hdGguZmxvb3IoYXJncyAvIDM2KSAvIDUgKiAyNTU7XG5cdHZhciBnID0gTWF0aC5mbG9vcigocmVtID0gYXJncyAlIDM2KSAvIDYpIC8gNSAqIDI1NTtcblx0dmFyIGIgPSAocmVtICUgNikgLyA1ICogMjU1O1xuXG5cdHJldHVybiBbciwgZywgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5oZXggPSBmdW5jdGlvbiAoYXJncykge1xuXHR2YXIgaW50ZWdlciA9ICgoTWF0aC5yb3VuZChhcmdzWzBdKSAmIDB4RkYpIDw8IDE2KVxuXHRcdCsgKChNYXRoLnJvdW5kKGFyZ3NbMV0pICYgMHhGRikgPDwgOClcblx0XHQrIChNYXRoLnJvdW5kKGFyZ3NbMl0pICYgMHhGRik7XG5cblx0dmFyIHN0cmluZyA9IGludGVnZXIudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG5cdHJldHVybiAnMDAwMDAwJy5zdWJzdHJpbmcoc3RyaW5nLmxlbmd0aCkgKyBzdHJpbmc7XG59O1xuXG5jb252ZXJ0LmhleC5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHR2YXIgbWF0Y2ggPSBhcmdzLnRvU3RyaW5nKDE2KS5tYXRjaCgvW2EtZjAtOV17Nn18W2EtZjAtOV17M30vaSk7XG5cdGlmICghbWF0Y2gpIHtcblx0XHRyZXR1cm4gWzAsIDAsIDBdO1xuXHR9XG5cblx0dmFyIGNvbG9yU3RyaW5nID0gbWF0Y2hbMF07XG5cblx0aWYgKG1hdGNoWzBdLmxlbmd0aCA9PT0gMykge1xuXHRcdGNvbG9yU3RyaW5nID0gY29sb3JTdHJpbmcuc3BsaXQoJycpLm1hcChmdW5jdGlvbiAoY2hhcikge1xuXHRcdFx0cmV0dXJuIGNoYXIgKyBjaGFyO1xuXHRcdH0pLmpvaW4oJycpO1xuXHR9XG5cblx0dmFyIGludGVnZXIgPSBwYXJzZUludChjb2xvclN0cmluZywgMTYpO1xuXHR2YXIgciA9IChpbnRlZ2VyID4+IDE2KSAmIDB4RkY7XG5cdHZhciBnID0gKGludGVnZXIgPj4gOCkgJiAweEZGO1xuXHR2YXIgYiA9IGludGVnZXIgJiAweEZGO1xuXG5cdHJldHVybiBbciwgZywgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5oY2cgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciByID0gcmdiWzBdIC8gMjU1O1xuXHR2YXIgZyA9IHJnYlsxXSAvIDI1NTtcblx0dmFyIGIgPSByZ2JbMl0gLyAyNTU7XG5cdHZhciBtYXggPSBNYXRoLm1heChNYXRoLm1heChyLCBnKSwgYik7XG5cdHZhciBtaW4gPSBNYXRoLm1pbihNYXRoLm1pbihyLCBnKSwgYik7XG5cdHZhciBjaHJvbWEgPSAobWF4IC0gbWluKTtcblx0dmFyIGdyYXlzY2FsZTtcblx0dmFyIGh1ZTtcblxuXHRpZiAoY2hyb21hIDwgMSkge1xuXHRcdGdyYXlzY2FsZSA9IG1pbiAvICgxIC0gY2hyb21hKTtcblx0fSBlbHNlIHtcblx0XHRncmF5c2NhbGUgPSAwO1xuXHR9XG5cblx0aWYgKGNocm9tYSA8PSAwKSB7XG5cdFx0aHVlID0gMDtcblx0fSBlbHNlXG5cdGlmIChtYXggPT09IHIpIHtcblx0XHRodWUgPSAoKGcgLSBiKSAvIGNocm9tYSkgJSA2O1xuXHR9IGVsc2Vcblx0aWYgKG1heCA9PT0gZykge1xuXHRcdGh1ZSA9IDIgKyAoYiAtIHIpIC8gY2hyb21hO1xuXHR9IGVsc2Uge1xuXHRcdGh1ZSA9IDQgKyAociAtIGcpIC8gY2hyb21hICsgNDtcblx0fVxuXG5cdGh1ZSAvPSA2O1xuXHRodWUgJT0gMTtcblxuXHRyZXR1cm4gW2h1ZSAqIDM2MCwgY2hyb21hICogMTAwLCBncmF5c2NhbGUgKiAxMDBdO1xufTtcblxuY29udmVydC5oc2wuaGNnID0gZnVuY3Rpb24gKGhzbCkge1xuXHR2YXIgcyA9IGhzbFsxXSAvIDEwMDtcblx0dmFyIGwgPSBoc2xbMl0gLyAxMDA7XG5cdHZhciBjID0gMTtcblx0dmFyIGYgPSAwO1xuXG5cdGlmIChsIDwgMC41KSB7XG5cdFx0YyA9IDIuMCAqIHMgKiBsO1xuXHR9IGVsc2Uge1xuXHRcdGMgPSAyLjAgKiBzICogKDEuMCAtIGwpO1xuXHR9XG5cblx0aWYgKGMgPCAxLjApIHtcblx0XHRmID0gKGwgLSAwLjUgKiBjKSAvICgxLjAgLSBjKTtcblx0fVxuXG5cdHJldHVybiBbaHNsWzBdLCBjICogMTAwLCBmICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHN2LmhjZyA9IGZ1bmN0aW9uIChoc3YpIHtcblx0dmFyIHMgPSBoc3ZbMV0gLyAxMDA7XG5cdHZhciB2ID0gaHN2WzJdIC8gMTAwO1xuXG5cdHZhciBjID0gcyAqIHY7XG5cdHZhciBmID0gMDtcblxuXHRpZiAoYyA8IDEuMCkge1xuXHRcdGYgPSAodiAtIGMpIC8gKDEgLSBjKTtcblx0fVxuXG5cdHJldHVybiBbaHN2WzBdLCBjICogMTAwLCBmICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaGNnLnJnYiA9IGZ1bmN0aW9uIChoY2cpIHtcblx0dmFyIGggPSBoY2dbMF0gLyAzNjA7XG5cdHZhciBjID0gaGNnWzFdIC8gMTAwO1xuXHR2YXIgZyA9IGhjZ1syXSAvIDEwMDtcblxuXHRpZiAoYyA9PT0gMC4wKSB7XG5cdFx0cmV0dXJuIFtnICogMjU1LCBnICogMjU1LCBnICogMjU1XTtcblx0fVxuXG5cdHZhciBwdXJlID0gWzAsIDAsIDBdO1xuXHR2YXIgaGkgPSAoaCAlIDEpICogNjtcblx0dmFyIHYgPSBoaSAlIDE7XG5cdHZhciB3ID0gMSAtIHY7XG5cdHZhciBtZyA9IDA7XG5cblx0c3dpdGNoIChNYXRoLmZsb29yKGhpKSkge1xuXHRcdGNhc2UgMDpcblx0XHRcdHB1cmVbMF0gPSAxOyBwdXJlWzFdID0gdjsgcHVyZVsyXSA9IDA7IGJyZWFrO1xuXHRcdGNhc2UgMTpcblx0XHRcdHB1cmVbMF0gPSB3OyBwdXJlWzFdID0gMTsgcHVyZVsyXSA9IDA7IGJyZWFrO1xuXHRcdGNhc2UgMjpcblx0XHRcdHB1cmVbMF0gPSAwOyBwdXJlWzFdID0gMTsgcHVyZVsyXSA9IHY7IGJyZWFrO1xuXHRcdGNhc2UgMzpcblx0XHRcdHB1cmVbMF0gPSAwOyBwdXJlWzFdID0gdzsgcHVyZVsyXSA9IDE7IGJyZWFrO1xuXHRcdGNhc2UgNDpcblx0XHRcdHB1cmVbMF0gPSB2OyBwdXJlWzFdID0gMDsgcHVyZVsyXSA9IDE7IGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRwdXJlWzBdID0gMTsgcHVyZVsxXSA9IDA7IHB1cmVbMl0gPSB3O1xuXHR9XG5cblx0bWcgPSAoMS4wIC0gYykgKiBnO1xuXG5cdHJldHVybiBbXG5cdFx0KGMgKiBwdXJlWzBdICsgbWcpICogMjU1LFxuXHRcdChjICogcHVyZVsxXSArIG1nKSAqIDI1NSxcblx0XHQoYyAqIHB1cmVbMl0gKyBtZykgKiAyNTVcblx0XTtcbn07XG5cbmNvbnZlcnQuaGNnLmhzdiA9IGZ1bmN0aW9uIChoY2cpIHtcblx0dmFyIGMgPSBoY2dbMV0gLyAxMDA7XG5cdHZhciBnID0gaGNnWzJdIC8gMTAwO1xuXG5cdHZhciB2ID0gYyArIGcgKiAoMS4wIC0gYyk7XG5cdHZhciBmID0gMDtcblxuXHRpZiAodiA+IDAuMCkge1xuXHRcdGYgPSBjIC8gdjtcblx0fVxuXG5cdHJldHVybiBbaGNnWzBdLCBmICogMTAwLCB2ICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaGNnLmhzbCA9IGZ1bmN0aW9uIChoY2cpIHtcblx0dmFyIGMgPSBoY2dbMV0gLyAxMDA7XG5cdHZhciBnID0gaGNnWzJdIC8gMTAwO1xuXG5cdHZhciBsID0gZyAqICgxLjAgLSBjKSArIDAuNSAqIGM7XG5cdHZhciBzID0gMDtcblxuXHRpZiAobCA+IDAuMCAmJiBsIDwgMC41KSB7XG5cdFx0cyA9IGMgLyAoMiAqIGwpO1xuXHR9IGVsc2Vcblx0aWYgKGwgPj0gMC41ICYmIGwgPCAxLjApIHtcblx0XHRzID0gYyAvICgyICogKDEgLSBsKSk7XG5cdH1cblxuXHRyZXR1cm4gW2hjZ1swXSwgcyAqIDEwMCwgbCAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhjZy5od2IgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdHZhciBjID0gaGNnWzFdIC8gMTAwO1xuXHR2YXIgZyA9IGhjZ1syXSAvIDEwMDtcblx0dmFyIHYgPSBjICsgZyAqICgxLjAgLSBjKTtcblx0cmV0dXJuIFtoY2dbMF0sICh2IC0gYykgKiAxMDAsICgxIC0gdikgKiAxMDBdO1xufTtcblxuY29udmVydC5od2IuaGNnID0gZnVuY3Rpb24gKGh3Yikge1xuXHR2YXIgdyA9IGh3YlsxXSAvIDEwMDtcblx0dmFyIGIgPSBod2JbMl0gLyAxMDA7XG5cdHZhciB2ID0gMSAtIGI7XG5cdHZhciBjID0gdiAtIHc7XG5cdHZhciBnID0gMDtcblxuXHRpZiAoYyA8IDEpIHtcblx0XHRnID0gKHYgLSBjKSAvICgxIC0gYyk7XG5cdH1cblxuXHRyZXR1cm4gW2h3YlswXSwgYyAqIDEwMCwgZyAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmFwcGxlLnJnYiA9IGZ1bmN0aW9uIChhcHBsZSkge1xuXHRyZXR1cm4gWyhhcHBsZVswXSAvIDY1NTM1KSAqIDI1NSwgKGFwcGxlWzFdIC8gNjU1MzUpICogMjU1LCAoYXBwbGVbMl0gLyA2NTUzNSkgKiAyNTVdO1xufTtcblxuY29udmVydC5yZ2IuYXBwbGUgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHJldHVybiBbKHJnYlswXSAvIDI1NSkgKiA2NTUzNSwgKHJnYlsxXSAvIDI1NSkgKiA2NTUzNSwgKHJnYlsyXSAvIDI1NSkgKiA2NTUzNV07XG59O1xuXG5jb252ZXJ0LmdyYXkucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0cmV0dXJuIFthcmdzWzBdIC8gMTAwICogMjU1LCBhcmdzWzBdIC8gMTAwICogMjU1LCBhcmdzWzBdIC8gMTAwICogMjU1XTtcbn07XG5cbmNvbnZlcnQuZ3JheS5oc2wgPSBjb252ZXJ0LmdyYXkuaHN2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0cmV0dXJuIFswLCAwLCBhcmdzWzBdXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5od2IgPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRyZXR1cm4gWzAsIDEwMCwgZ3JheVswXV07XG59O1xuXG5jb252ZXJ0LmdyYXkuY215ayA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHJldHVybiBbMCwgMCwgMCwgZ3JheVswXV07XG59O1xuXG5jb252ZXJ0LmdyYXkubGFiID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0cmV0dXJuIFtncmF5WzBdLCAwLCAwXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5oZXggPSBmdW5jdGlvbiAoZ3JheSkge1xuXHR2YXIgdmFsID0gTWF0aC5yb3VuZChncmF5WzBdIC8gMTAwICogMjU1KSAmIDB4RkY7XG5cdHZhciBpbnRlZ2VyID0gKHZhbCA8PCAxNikgKyAodmFsIDw8IDgpICsgdmFsO1xuXG5cdHZhciBzdHJpbmcgPSBpbnRlZ2VyLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRyZXR1cm4gJzAwMDAwMCcuc3Vic3RyaW5nKHN0cmluZy5sZW5ndGgpICsgc3RyaW5nO1xufTtcblxuY29udmVydC5yZ2IuZ3JheSA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHZhbCA9IChyZ2JbMF0gKyByZ2JbMV0gKyByZ2JbMl0pIC8gMztcblx0cmV0dXJuIFt2YWwgLyAyNTUgKiAxMDBdO1xufTtcbiIsInZhciBjb252ZXJzaW9ucyA9IHJlcXVpcmUoJy4vY29udmVyc2lvbnMnKTtcbnZhciByb3V0ZSA9IHJlcXVpcmUoJy4vcm91dGUnKTtcblxudmFyIGNvbnZlcnQgPSB7fTtcblxudmFyIG1vZGVscyA9IE9iamVjdC5rZXlzKGNvbnZlcnNpb25zKTtcblxuZnVuY3Rpb24gd3JhcFJhdyhmbikge1xuXHR2YXIgd3JhcHBlZEZuID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0XHRpZiAoYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3MgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBhcmdzO1xuXHRcdH1cblxuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuXHRcdFx0YXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZuKGFyZ3MpO1xuXHR9O1xuXG5cdC8vIHByZXNlcnZlIC5jb252ZXJzaW9uIHByb3BlcnR5IGlmIHRoZXJlIGlzIG9uZVxuXHRpZiAoJ2NvbnZlcnNpb24nIGluIGZuKSB7XG5cdFx0d3JhcHBlZEZuLmNvbnZlcnNpb24gPSBmbi5jb252ZXJzaW9uO1xuXHR9XG5cblx0cmV0dXJuIHdyYXBwZWRGbjtcbn1cblxuZnVuY3Rpb24gd3JhcFJvdW5kZWQoZm4pIHtcblx0dmFyIHdyYXBwZWRGbiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdFx0aWYgKGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gYXJncztcblx0XHR9XG5cblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXHRcdH1cblxuXHRcdHZhciByZXN1bHQgPSBmbihhcmdzKTtcblxuXHRcdC8vIHdlJ3JlIGFzc3VtaW5nIHRoZSByZXN1bHQgaXMgYW4gYXJyYXkgaGVyZS5cblx0XHQvLyBzZWUgbm90aWNlIGluIGNvbnZlcnNpb25zLmpzOyBkb24ndCB1c2UgYm94IHR5cGVzXG5cdFx0Ly8gaW4gY29udmVyc2lvbiBmdW5jdGlvbnMuXG5cdFx0aWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRmb3IgKHZhciBsZW4gPSByZXN1bHQubGVuZ3RoLCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRcdHJlc3VsdFtpXSA9IE1hdGgucm91bmQocmVzdWx0W2ldKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG5cdC8vIHByZXNlcnZlIC5jb252ZXJzaW9uIHByb3BlcnR5IGlmIHRoZXJlIGlzIG9uZVxuXHRpZiAoJ2NvbnZlcnNpb24nIGluIGZuKSB7XG5cdFx0d3JhcHBlZEZuLmNvbnZlcnNpb24gPSBmbi5jb252ZXJzaW9uO1xuXHR9XG5cblx0cmV0dXJuIHdyYXBwZWRGbjtcbn1cblxubW9kZWxzLmZvckVhY2goZnVuY3Rpb24gKGZyb21Nb2RlbCkge1xuXHRjb252ZXJ0W2Zyb21Nb2RlbF0gPSB7fTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFtmcm9tTW9kZWxdLCAnY2hhbm5lbHMnLCB7dmFsdWU6IGNvbnZlcnNpb25zW2Zyb21Nb2RlbF0uY2hhbm5lbHN9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbZnJvbU1vZGVsXSwgJ2xhYmVscycsIHt2YWx1ZTogY29udmVyc2lvbnNbZnJvbU1vZGVsXS5sYWJlbHN9KTtcblxuXHR2YXIgcm91dGVzID0gcm91dGUoZnJvbU1vZGVsKTtcblx0dmFyIHJvdXRlTW9kZWxzID0gT2JqZWN0LmtleXMocm91dGVzKTtcblxuXHRyb3V0ZU1vZGVscy5mb3JFYWNoKGZ1bmN0aW9uICh0b01vZGVsKSB7XG5cdFx0dmFyIGZuID0gcm91dGVzW3RvTW9kZWxdO1xuXG5cdFx0Y29udmVydFtmcm9tTW9kZWxdW3RvTW9kZWxdID0gd3JhcFJvdW5kZWQoZm4pO1xuXHRcdGNvbnZlcnRbZnJvbU1vZGVsXVt0b01vZGVsXS5yYXcgPSB3cmFwUmF3KGZuKTtcblx0fSk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb252ZXJ0O1xuIiwiJ3VzZSBzdHJpY3QnXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHRcImFsaWNlYmx1ZVwiOiBbMjQwLCAyNDgsIDI1NV0sXHJcblx0XCJhbnRpcXVld2hpdGVcIjogWzI1MCwgMjM1LCAyMTVdLFxyXG5cdFwiYXF1YVwiOiBbMCwgMjU1LCAyNTVdLFxyXG5cdFwiYXF1YW1hcmluZVwiOiBbMTI3LCAyNTUsIDIxMl0sXHJcblx0XCJhenVyZVwiOiBbMjQwLCAyNTUsIDI1NV0sXHJcblx0XCJiZWlnZVwiOiBbMjQ1LCAyNDUsIDIyMF0sXHJcblx0XCJiaXNxdWVcIjogWzI1NSwgMjI4LCAxOTZdLFxyXG5cdFwiYmxhY2tcIjogWzAsIDAsIDBdLFxyXG5cdFwiYmxhbmNoZWRhbG1vbmRcIjogWzI1NSwgMjM1LCAyMDVdLFxyXG5cdFwiYmx1ZVwiOiBbMCwgMCwgMjU1XSxcclxuXHRcImJsdWV2aW9sZXRcIjogWzEzOCwgNDMsIDIyNl0sXHJcblx0XCJicm93blwiOiBbMTY1LCA0MiwgNDJdLFxyXG5cdFwiYnVybHl3b29kXCI6IFsyMjIsIDE4NCwgMTM1XSxcclxuXHRcImNhZGV0Ymx1ZVwiOiBbOTUsIDE1OCwgMTYwXSxcclxuXHRcImNoYXJ0cmV1c2VcIjogWzEyNywgMjU1LCAwXSxcclxuXHRcImNob2NvbGF0ZVwiOiBbMjEwLCAxMDUsIDMwXSxcclxuXHRcImNvcmFsXCI6IFsyNTUsIDEyNywgODBdLFxyXG5cdFwiY29ybmZsb3dlcmJsdWVcIjogWzEwMCwgMTQ5LCAyMzddLFxyXG5cdFwiY29ybnNpbGtcIjogWzI1NSwgMjQ4LCAyMjBdLFxyXG5cdFwiY3JpbXNvblwiOiBbMjIwLCAyMCwgNjBdLFxyXG5cdFwiY3lhblwiOiBbMCwgMjU1LCAyNTVdLFxyXG5cdFwiZGFya2JsdWVcIjogWzAsIDAsIDEzOV0sXHJcblx0XCJkYXJrY3lhblwiOiBbMCwgMTM5LCAxMzldLFxyXG5cdFwiZGFya2dvbGRlbnJvZFwiOiBbMTg0LCAxMzQsIDExXSxcclxuXHRcImRhcmtncmF5XCI6IFsxNjksIDE2OSwgMTY5XSxcclxuXHRcImRhcmtncmVlblwiOiBbMCwgMTAwLCAwXSxcclxuXHRcImRhcmtncmV5XCI6IFsxNjksIDE2OSwgMTY5XSxcclxuXHRcImRhcmtraGFraVwiOiBbMTg5LCAxODMsIDEwN10sXHJcblx0XCJkYXJrbWFnZW50YVwiOiBbMTM5LCAwLCAxMzldLFxyXG5cdFwiZGFya29saXZlZ3JlZW5cIjogWzg1LCAxMDcsIDQ3XSxcclxuXHRcImRhcmtvcmFuZ2VcIjogWzI1NSwgMTQwLCAwXSxcclxuXHRcImRhcmtvcmNoaWRcIjogWzE1MywgNTAsIDIwNF0sXHJcblx0XCJkYXJrcmVkXCI6IFsxMzksIDAsIDBdLFxyXG5cdFwiZGFya3NhbG1vblwiOiBbMjMzLCAxNTAsIDEyMl0sXHJcblx0XCJkYXJrc2VhZ3JlZW5cIjogWzE0MywgMTg4LCAxNDNdLFxyXG5cdFwiZGFya3NsYXRlYmx1ZVwiOiBbNzIsIDYxLCAxMzldLFxyXG5cdFwiZGFya3NsYXRlZ3JheVwiOiBbNDcsIDc5LCA3OV0sXHJcblx0XCJkYXJrc2xhdGVncmV5XCI6IFs0NywgNzksIDc5XSxcclxuXHRcImRhcmt0dXJxdW9pc2VcIjogWzAsIDIwNiwgMjA5XSxcclxuXHRcImRhcmt2aW9sZXRcIjogWzE0OCwgMCwgMjExXSxcclxuXHRcImRlZXBwaW5rXCI6IFsyNTUsIDIwLCAxNDddLFxyXG5cdFwiZGVlcHNreWJsdWVcIjogWzAsIDE5MSwgMjU1XSxcclxuXHRcImRpbWdyYXlcIjogWzEwNSwgMTA1LCAxMDVdLFxyXG5cdFwiZGltZ3JleVwiOiBbMTA1LCAxMDUsIDEwNV0sXHJcblx0XCJkb2RnZXJibHVlXCI6IFszMCwgMTQ0LCAyNTVdLFxyXG5cdFwiZmlyZWJyaWNrXCI6IFsxNzgsIDM0LCAzNF0sXHJcblx0XCJmbG9yYWx3aGl0ZVwiOiBbMjU1LCAyNTAsIDI0MF0sXHJcblx0XCJmb3Jlc3RncmVlblwiOiBbMzQsIDEzOSwgMzRdLFxyXG5cdFwiZnVjaHNpYVwiOiBbMjU1LCAwLCAyNTVdLFxyXG5cdFwiZ2FpbnNib3JvXCI6IFsyMjAsIDIyMCwgMjIwXSxcclxuXHRcImdob3N0d2hpdGVcIjogWzI0OCwgMjQ4LCAyNTVdLFxyXG5cdFwiZ29sZFwiOiBbMjU1LCAyMTUsIDBdLFxyXG5cdFwiZ29sZGVucm9kXCI6IFsyMTgsIDE2NSwgMzJdLFxyXG5cdFwiZ3JheVwiOiBbMTI4LCAxMjgsIDEyOF0sXHJcblx0XCJncmVlblwiOiBbMCwgMTI4LCAwXSxcclxuXHRcImdyZWVueWVsbG93XCI6IFsxNzMsIDI1NSwgNDddLFxyXG5cdFwiZ3JleVwiOiBbMTI4LCAxMjgsIDEyOF0sXHJcblx0XCJob25leWRld1wiOiBbMjQwLCAyNTUsIDI0MF0sXHJcblx0XCJob3RwaW5rXCI6IFsyNTUsIDEwNSwgMTgwXSxcclxuXHRcImluZGlhbnJlZFwiOiBbMjA1LCA5MiwgOTJdLFxyXG5cdFwiaW5kaWdvXCI6IFs3NSwgMCwgMTMwXSxcclxuXHRcIml2b3J5XCI6IFsyNTUsIDI1NSwgMjQwXSxcclxuXHRcImtoYWtpXCI6IFsyNDAsIDIzMCwgMTQwXSxcclxuXHRcImxhdmVuZGVyXCI6IFsyMzAsIDIzMCwgMjUwXSxcclxuXHRcImxhdmVuZGVyYmx1c2hcIjogWzI1NSwgMjQwLCAyNDVdLFxyXG5cdFwibGF3bmdyZWVuXCI6IFsxMjQsIDI1MiwgMF0sXHJcblx0XCJsZW1vbmNoaWZmb25cIjogWzI1NSwgMjUwLCAyMDVdLFxyXG5cdFwibGlnaHRibHVlXCI6IFsxNzMsIDIxNiwgMjMwXSxcclxuXHRcImxpZ2h0Y29yYWxcIjogWzI0MCwgMTI4LCAxMjhdLFxyXG5cdFwibGlnaHRjeWFuXCI6IFsyMjQsIDI1NSwgMjU1XSxcclxuXHRcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFsyNTAsIDI1MCwgMjEwXSxcclxuXHRcImxpZ2h0Z3JheVwiOiBbMjExLCAyMTEsIDIxMV0sXHJcblx0XCJsaWdodGdyZWVuXCI6IFsxNDQsIDIzOCwgMTQ0XSxcclxuXHRcImxpZ2h0Z3JleVwiOiBbMjExLCAyMTEsIDIxMV0sXHJcblx0XCJsaWdodHBpbmtcIjogWzI1NSwgMTgyLCAxOTNdLFxyXG5cdFwibGlnaHRzYWxtb25cIjogWzI1NSwgMTYwLCAxMjJdLFxyXG5cdFwibGlnaHRzZWFncmVlblwiOiBbMzIsIDE3OCwgMTcwXSxcclxuXHRcImxpZ2h0c2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDI1MF0sXHJcblx0XCJsaWdodHNsYXRlZ3JheVwiOiBbMTE5LCAxMzYsIDE1M10sXHJcblx0XCJsaWdodHNsYXRlZ3JleVwiOiBbMTE5LCAxMzYsIDE1M10sXHJcblx0XCJsaWdodHN0ZWVsYmx1ZVwiOiBbMTc2LCAxOTYsIDIyMl0sXHJcblx0XCJsaWdodHllbGxvd1wiOiBbMjU1LCAyNTUsIDIyNF0sXHJcblx0XCJsaW1lXCI6IFswLCAyNTUsIDBdLFxyXG5cdFwibGltZWdyZWVuXCI6IFs1MCwgMjA1LCA1MF0sXHJcblx0XCJsaW5lblwiOiBbMjUwLCAyNDAsIDIzMF0sXHJcblx0XCJtYWdlbnRhXCI6IFsyNTUsIDAsIDI1NV0sXHJcblx0XCJtYXJvb25cIjogWzEyOCwgMCwgMF0sXHJcblx0XCJtZWRpdW1hcXVhbWFyaW5lXCI6IFsxMDIsIDIwNSwgMTcwXSxcclxuXHRcIm1lZGl1bWJsdWVcIjogWzAsIDAsIDIwNV0sXHJcblx0XCJtZWRpdW1vcmNoaWRcIjogWzE4NiwgODUsIDIxMV0sXHJcblx0XCJtZWRpdW1wdXJwbGVcIjogWzE0NywgMTEyLCAyMTldLFxyXG5cdFwibWVkaXVtc2VhZ3JlZW5cIjogWzYwLCAxNzksIDExM10sXHJcblx0XCJtZWRpdW1zbGF0ZWJsdWVcIjogWzEyMywgMTA0LCAyMzhdLFxyXG5cdFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogWzAsIDI1MCwgMTU0XSxcclxuXHRcIm1lZGl1bXR1cnF1b2lzZVwiOiBbNzIsIDIwOSwgMjA0XSxcclxuXHRcIm1lZGl1bXZpb2xldHJlZFwiOiBbMTk5LCAyMSwgMTMzXSxcclxuXHRcIm1pZG5pZ2h0Ymx1ZVwiOiBbMjUsIDI1LCAxMTJdLFxyXG5cdFwibWludGNyZWFtXCI6IFsyNDUsIDI1NSwgMjUwXSxcclxuXHRcIm1pc3R5cm9zZVwiOiBbMjU1LCAyMjgsIDIyNV0sXHJcblx0XCJtb2NjYXNpblwiOiBbMjU1LCAyMjgsIDE4MV0sXHJcblx0XCJuYXZham93aGl0ZVwiOiBbMjU1LCAyMjIsIDE3M10sXHJcblx0XCJuYXZ5XCI6IFswLCAwLCAxMjhdLFxyXG5cdFwib2xkbGFjZVwiOiBbMjUzLCAyNDUsIDIzMF0sXHJcblx0XCJvbGl2ZVwiOiBbMTI4LCAxMjgsIDBdLFxyXG5cdFwib2xpdmVkcmFiXCI6IFsxMDcsIDE0MiwgMzVdLFxyXG5cdFwib3JhbmdlXCI6IFsyNTUsIDE2NSwgMF0sXHJcblx0XCJvcmFuZ2VyZWRcIjogWzI1NSwgNjksIDBdLFxyXG5cdFwib3JjaGlkXCI6IFsyMTgsIDExMiwgMjE0XSxcclxuXHRcInBhbGVnb2xkZW5yb2RcIjogWzIzOCwgMjMyLCAxNzBdLFxyXG5cdFwicGFsZWdyZWVuXCI6IFsxNTIsIDI1MSwgMTUyXSxcclxuXHRcInBhbGV0dXJxdW9pc2VcIjogWzE3NSwgMjM4LCAyMzhdLFxyXG5cdFwicGFsZXZpb2xldHJlZFwiOiBbMjE5LCAxMTIsIDE0N10sXHJcblx0XCJwYXBheWF3aGlwXCI6IFsyNTUsIDIzOSwgMjEzXSxcclxuXHRcInBlYWNocHVmZlwiOiBbMjU1LCAyMTgsIDE4NV0sXHJcblx0XCJwZXJ1XCI6IFsyMDUsIDEzMywgNjNdLFxyXG5cdFwicGlua1wiOiBbMjU1LCAxOTIsIDIwM10sXHJcblx0XCJwbHVtXCI6IFsyMjEsIDE2MCwgMjIxXSxcclxuXHRcInBvd2RlcmJsdWVcIjogWzE3NiwgMjI0LCAyMzBdLFxyXG5cdFwicHVycGxlXCI6IFsxMjgsIDAsIDEyOF0sXHJcblx0XCJyZWJlY2NhcHVycGxlXCI6IFsxMDIsIDUxLCAxNTNdLFxyXG5cdFwicmVkXCI6IFsyNTUsIDAsIDBdLFxyXG5cdFwicm9zeWJyb3duXCI6IFsxODgsIDE0MywgMTQzXSxcclxuXHRcInJveWFsYmx1ZVwiOiBbNjUsIDEwNSwgMjI1XSxcclxuXHRcInNhZGRsZWJyb3duXCI6IFsxMzksIDY5LCAxOV0sXHJcblx0XCJzYWxtb25cIjogWzI1MCwgMTI4LCAxMTRdLFxyXG5cdFwic2FuZHlicm93blwiOiBbMjQ0LCAxNjQsIDk2XSxcclxuXHRcInNlYWdyZWVuXCI6IFs0NiwgMTM5LCA4N10sXHJcblx0XCJzZWFzaGVsbFwiOiBbMjU1LCAyNDUsIDIzOF0sXHJcblx0XCJzaWVubmFcIjogWzE2MCwgODIsIDQ1XSxcclxuXHRcInNpbHZlclwiOiBbMTkyLCAxOTIsIDE5Ml0sXHJcblx0XCJza3libHVlXCI6IFsxMzUsIDIwNiwgMjM1XSxcclxuXHRcInNsYXRlYmx1ZVwiOiBbMTA2LCA5MCwgMjA1XSxcclxuXHRcInNsYXRlZ3JheVwiOiBbMTEyLCAxMjgsIDE0NF0sXHJcblx0XCJzbGF0ZWdyZXlcIjogWzExMiwgMTI4LCAxNDRdLFxyXG5cdFwic25vd1wiOiBbMjU1LCAyNTAsIDI1MF0sXHJcblx0XCJzcHJpbmdncmVlblwiOiBbMCwgMjU1LCAxMjddLFxyXG5cdFwic3RlZWxibHVlXCI6IFs3MCwgMTMwLCAxODBdLFxyXG5cdFwidGFuXCI6IFsyMTAsIDE4MCwgMTQwXSxcclxuXHRcInRlYWxcIjogWzAsIDEyOCwgMTI4XSxcclxuXHRcInRoaXN0bGVcIjogWzIxNiwgMTkxLCAyMTZdLFxyXG5cdFwidG9tYXRvXCI6IFsyNTUsIDk5LCA3MV0sXHJcblx0XCJ0dXJxdW9pc2VcIjogWzY0LCAyMjQsIDIwOF0sXHJcblx0XCJ2aW9sZXRcIjogWzIzOCwgMTMwLCAyMzhdLFxyXG5cdFwid2hlYXRcIjogWzI0NSwgMjIyLCAxNzldLFxyXG5cdFwid2hpdGVcIjogWzI1NSwgMjU1LCAyNTVdLFxyXG5cdFwid2hpdGVzbW9rZVwiOiBbMjQ1LCAyNDUsIDI0NV0sXHJcblx0XCJ5ZWxsb3dcIjogWzI1NSwgMjU1LCAwXSxcclxuXHRcInllbGxvd2dyZWVuXCI6IFsxNTQsIDIwNSwgNTBdXHJcbn07XHJcbiIsInZhciBjb252ZXJzaW9ucyA9IHJlcXVpcmUoJy4vY29udmVyc2lvbnMnKTtcblxuLypcblx0dGhpcyBmdW5jdGlvbiByb3V0ZXMgYSBtb2RlbCB0byBhbGwgb3RoZXIgbW9kZWxzLlxuXG5cdGFsbCBmdW5jdGlvbnMgdGhhdCBhcmUgcm91dGVkIGhhdmUgYSBwcm9wZXJ0eSBgLmNvbnZlcnNpb25gIGF0dGFjaGVkXG5cdHRvIHRoZSByZXR1cm5lZCBzeW50aGV0aWMgZnVuY3Rpb24uIFRoaXMgcHJvcGVydHkgaXMgYW4gYXJyYXlcblx0b2Ygc3RyaW5ncywgZWFjaCB3aXRoIHRoZSBzdGVwcyBpbiBiZXR3ZWVuIHRoZSAnZnJvbScgYW5kICd0bydcblx0Y29sb3IgbW9kZWxzIChpbmNsdXNpdmUpLlxuXG5cdGNvbnZlcnNpb25zIHRoYXQgYXJlIG5vdCBwb3NzaWJsZSBzaW1wbHkgYXJlIG5vdCBpbmNsdWRlZC5cbiovXG5cbmZ1bmN0aW9uIGJ1aWxkR3JhcGgoKSB7XG5cdHZhciBncmFwaCA9IHt9O1xuXHQvLyBodHRwczovL2pzcGVyZi5jb20vb2JqZWN0LWtleXMtdnMtZm9yLWluLXdpdGgtY2xvc3VyZS8zXG5cdHZhciBtb2RlbHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9ucyk7XG5cblx0Zm9yICh2YXIgbGVuID0gbW9kZWxzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdGdyYXBoW21vZGVsc1tpXV0gPSB7XG5cdFx0XHQvLyBodHRwOi8vanNwZXJmLmNvbS8xLXZzLWluZmluaXR5XG5cdFx0XHQvLyBtaWNyby1vcHQsIGJ1dCB0aGlzIGlzIHNpbXBsZS5cblx0XHRcdGRpc3RhbmNlOiAtMSxcblx0XHRcdHBhcmVudDogbnVsbFxuXHRcdH07XG5cdH1cblxuXHRyZXR1cm4gZ3JhcGg7XG59XG5cbi8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JyZWFkdGgtZmlyc3Rfc2VhcmNoXG5mdW5jdGlvbiBkZXJpdmVCRlMoZnJvbU1vZGVsKSB7XG5cdHZhciBncmFwaCA9IGJ1aWxkR3JhcGgoKTtcblx0dmFyIHF1ZXVlID0gW2Zyb21Nb2RlbF07IC8vIHVuc2hpZnQgLT4gcXVldWUgLT4gcG9wXG5cblx0Z3JhcGhbZnJvbU1vZGVsXS5kaXN0YW5jZSA9IDA7XG5cblx0d2hpbGUgKHF1ZXVlLmxlbmd0aCkge1xuXHRcdHZhciBjdXJyZW50ID0gcXVldWUucG9wKCk7XG5cdFx0dmFyIGFkamFjZW50cyA9IE9iamVjdC5rZXlzKGNvbnZlcnNpb25zW2N1cnJlbnRdKTtcblxuXHRcdGZvciAodmFyIGxlbiA9IGFkamFjZW50cy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdHZhciBhZGphY2VudCA9IGFkamFjZW50c1tpXTtcblx0XHRcdHZhciBub2RlID0gZ3JhcGhbYWRqYWNlbnRdO1xuXG5cdFx0XHRpZiAobm9kZS5kaXN0YW5jZSA9PT0gLTEpIHtcblx0XHRcdFx0bm9kZS5kaXN0YW5jZSA9IGdyYXBoW2N1cnJlbnRdLmRpc3RhbmNlICsgMTtcblx0XHRcdFx0bm9kZS5wYXJlbnQgPSBjdXJyZW50O1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KGFkamFjZW50KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZ3JhcGg7XG59XG5cbmZ1bmN0aW9uIGxpbmsoZnJvbSwgdG8pIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChhcmdzKSB7XG5cdFx0cmV0dXJuIHRvKGZyb20oYXJncykpO1xuXHR9O1xufVxuXG5mdW5jdGlvbiB3cmFwQ29udmVyc2lvbih0b01vZGVsLCBncmFwaCkge1xuXHR2YXIgcGF0aCA9IFtncmFwaFt0b01vZGVsXS5wYXJlbnQsIHRvTW9kZWxdO1xuXHR2YXIgZm4gPSBjb252ZXJzaW9uc1tncmFwaFt0b01vZGVsXS5wYXJlbnRdW3RvTW9kZWxdO1xuXG5cdHZhciBjdXIgPSBncmFwaFt0b01vZGVsXS5wYXJlbnQ7XG5cdHdoaWxlIChncmFwaFtjdXJdLnBhcmVudCkge1xuXHRcdHBhdGgudW5zaGlmdChncmFwaFtjdXJdLnBhcmVudCk7XG5cdFx0Zm4gPSBsaW5rKGNvbnZlcnNpb25zW2dyYXBoW2N1cl0ucGFyZW50XVtjdXJdLCBmbik7XG5cdFx0Y3VyID0gZ3JhcGhbY3VyXS5wYXJlbnQ7XG5cdH1cblxuXHRmbi5jb252ZXJzaW9uID0gcGF0aDtcblx0cmV0dXJuIGZuO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmcm9tTW9kZWwpIHtcblx0dmFyIGdyYXBoID0gZGVyaXZlQkZTKGZyb21Nb2RlbCk7XG5cdHZhciBjb252ZXJzaW9uID0ge307XG5cblx0dmFyIG1vZGVscyA9IE9iamVjdC5rZXlzKGdyYXBoKTtcblx0Zm9yICh2YXIgbGVuID0gbW9kZWxzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdHZhciB0b01vZGVsID0gbW9kZWxzW2ldO1xuXHRcdHZhciBub2RlID0gZ3JhcGhbdG9Nb2RlbF07XG5cblx0XHRpZiAobm9kZS5wYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdC8vIG5vIHBvc3NpYmxlIGNvbnZlcnNpb24sIG9yIHRoaXMgbm9kZSBpcyB0aGUgc291cmNlIG1vZGVsLlxuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29udmVyc2lvblt0b01vZGVsXSA9IHdyYXBDb252ZXJzaW9uKHRvTW9kZWwsIGdyYXBoKTtcblx0fVxuXG5cdHJldHVybiBjb252ZXJzaW9uO1xufTtcblxuIiwiJ3VzZSBzdHJpY3QnXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHRcImFsaWNlYmx1ZVwiOiBbMjQwLCAyNDgsIDI1NV0sXHJcblx0XCJhbnRpcXVld2hpdGVcIjogWzI1MCwgMjM1LCAyMTVdLFxyXG5cdFwiYXF1YVwiOiBbMCwgMjU1LCAyNTVdLFxyXG5cdFwiYXF1YW1hcmluZVwiOiBbMTI3LCAyNTUsIDIxMl0sXHJcblx0XCJhenVyZVwiOiBbMjQwLCAyNTUsIDI1NV0sXHJcblx0XCJiZWlnZVwiOiBbMjQ1LCAyNDUsIDIyMF0sXHJcblx0XCJiaXNxdWVcIjogWzI1NSwgMjI4LCAxOTZdLFxyXG5cdFwiYmxhY2tcIjogWzAsIDAsIDBdLFxyXG5cdFwiYmxhbmNoZWRhbG1vbmRcIjogWzI1NSwgMjM1LCAyMDVdLFxyXG5cdFwiYmx1ZVwiOiBbMCwgMCwgMjU1XSxcclxuXHRcImJsdWV2aW9sZXRcIjogWzEzOCwgNDMsIDIyNl0sXHJcblx0XCJicm93blwiOiBbMTY1LCA0MiwgNDJdLFxyXG5cdFwiYnVybHl3b29kXCI6IFsyMjIsIDE4NCwgMTM1XSxcclxuXHRcImNhZGV0Ymx1ZVwiOiBbOTUsIDE1OCwgMTYwXSxcclxuXHRcImNoYXJ0cmV1c2VcIjogWzEyNywgMjU1LCAwXSxcclxuXHRcImNob2NvbGF0ZVwiOiBbMjEwLCAxMDUsIDMwXSxcclxuXHRcImNvcmFsXCI6IFsyNTUsIDEyNywgODBdLFxyXG5cdFwiY29ybmZsb3dlcmJsdWVcIjogWzEwMCwgMTQ5LCAyMzddLFxyXG5cdFwiY29ybnNpbGtcIjogWzI1NSwgMjQ4LCAyMjBdLFxyXG5cdFwiY3JpbXNvblwiOiBbMjIwLCAyMCwgNjBdLFxyXG5cdFwiY3lhblwiOiBbMCwgMjU1LCAyNTVdLFxyXG5cdFwiZGFya2JsdWVcIjogWzAsIDAsIDEzOV0sXHJcblx0XCJkYXJrY3lhblwiOiBbMCwgMTM5LCAxMzldLFxyXG5cdFwiZGFya2dvbGRlbnJvZFwiOiBbMTg0LCAxMzQsIDExXSxcclxuXHRcImRhcmtncmF5XCI6IFsxNjksIDE2OSwgMTY5XSxcclxuXHRcImRhcmtncmVlblwiOiBbMCwgMTAwLCAwXSxcclxuXHRcImRhcmtncmV5XCI6IFsxNjksIDE2OSwgMTY5XSxcclxuXHRcImRhcmtraGFraVwiOiBbMTg5LCAxODMsIDEwN10sXHJcblx0XCJkYXJrbWFnZW50YVwiOiBbMTM5LCAwLCAxMzldLFxyXG5cdFwiZGFya29saXZlZ3JlZW5cIjogWzg1LCAxMDcsIDQ3XSxcclxuXHRcImRhcmtvcmFuZ2VcIjogWzI1NSwgMTQwLCAwXSxcclxuXHRcImRhcmtvcmNoaWRcIjogWzE1MywgNTAsIDIwNF0sXHJcblx0XCJkYXJrcmVkXCI6IFsxMzksIDAsIDBdLFxyXG5cdFwiZGFya3NhbG1vblwiOiBbMjMzLCAxNTAsIDEyMl0sXHJcblx0XCJkYXJrc2VhZ3JlZW5cIjogWzE0MywgMTg4LCAxNDNdLFxyXG5cdFwiZGFya3NsYXRlYmx1ZVwiOiBbNzIsIDYxLCAxMzldLFxyXG5cdFwiZGFya3NsYXRlZ3JheVwiOiBbNDcsIDc5LCA3OV0sXHJcblx0XCJkYXJrc2xhdGVncmV5XCI6IFs0NywgNzksIDc5XSxcclxuXHRcImRhcmt0dXJxdW9pc2VcIjogWzAsIDIwNiwgMjA5XSxcclxuXHRcImRhcmt2aW9sZXRcIjogWzE0OCwgMCwgMjExXSxcclxuXHRcImRlZXBwaW5rXCI6IFsyNTUsIDIwLCAxNDddLFxyXG5cdFwiZGVlcHNreWJsdWVcIjogWzAsIDE5MSwgMjU1XSxcclxuXHRcImRpbWdyYXlcIjogWzEwNSwgMTA1LCAxMDVdLFxyXG5cdFwiZGltZ3JleVwiOiBbMTA1LCAxMDUsIDEwNV0sXHJcblx0XCJkb2RnZXJibHVlXCI6IFszMCwgMTQ0LCAyNTVdLFxyXG5cdFwiZmlyZWJyaWNrXCI6IFsxNzgsIDM0LCAzNF0sXHJcblx0XCJmbG9yYWx3aGl0ZVwiOiBbMjU1LCAyNTAsIDI0MF0sXHJcblx0XCJmb3Jlc3RncmVlblwiOiBbMzQsIDEzOSwgMzRdLFxyXG5cdFwiZnVjaHNpYVwiOiBbMjU1LCAwLCAyNTVdLFxyXG5cdFwiZ2FpbnNib3JvXCI6IFsyMjAsIDIyMCwgMjIwXSxcclxuXHRcImdob3N0d2hpdGVcIjogWzI0OCwgMjQ4LCAyNTVdLFxyXG5cdFwiZ29sZFwiOiBbMjU1LCAyMTUsIDBdLFxyXG5cdFwiZ29sZGVucm9kXCI6IFsyMTgsIDE2NSwgMzJdLFxyXG5cdFwiZ3JheVwiOiBbMTI4LCAxMjgsIDEyOF0sXHJcblx0XCJncmVlblwiOiBbMCwgMTI4LCAwXSxcclxuXHRcImdyZWVueWVsbG93XCI6IFsxNzMsIDI1NSwgNDddLFxyXG5cdFwiZ3JleVwiOiBbMTI4LCAxMjgsIDEyOF0sXHJcblx0XCJob25leWRld1wiOiBbMjQwLCAyNTUsIDI0MF0sXHJcblx0XCJob3RwaW5rXCI6IFsyNTUsIDEwNSwgMTgwXSxcclxuXHRcImluZGlhbnJlZFwiOiBbMjA1LCA5MiwgOTJdLFxyXG5cdFwiaW5kaWdvXCI6IFs3NSwgMCwgMTMwXSxcclxuXHRcIml2b3J5XCI6IFsyNTUsIDI1NSwgMjQwXSxcclxuXHRcImtoYWtpXCI6IFsyNDAsIDIzMCwgMTQwXSxcclxuXHRcImxhdmVuZGVyXCI6IFsyMzAsIDIzMCwgMjUwXSxcclxuXHRcImxhdmVuZGVyYmx1c2hcIjogWzI1NSwgMjQwLCAyNDVdLFxyXG5cdFwibGF3bmdyZWVuXCI6IFsxMjQsIDI1MiwgMF0sXHJcblx0XCJsZW1vbmNoaWZmb25cIjogWzI1NSwgMjUwLCAyMDVdLFxyXG5cdFwibGlnaHRibHVlXCI6IFsxNzMsIDIxNiwgMjMwXSxcclxuXHRcImxpZ2h0Y29yYWxcIjogWzI0MCwgMTI4LCAxMjhdLFxyXG5cdFwibGlnaHRjeWFuXCI6IFsyMjQsIDI1NSwgMjU1XSxcclxuXHRcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFsyNTAsIDI1MCwgMjEwXSxcclxuXHRcImxpZ2h0Z3JheVwiOiBbMjExLCAyMTEsIDIxMV0sXHJcblx0XCJsaWdodGdyZWVuXCI6IFsxNDQsIDIzOCwgMTQ0XSxcclxuXHRcImxpZ2h0Z3JleVwiOiBbMjExLCAyMTEsIDIxMV0sXHJcblx0XCJsaWdodHBpbmtcIjogWzI1NSwgMTgyLCAxOTNdLFxyXG5cdFwibGlnaHRzYWxtb25cIjogWzI1NSwgMTYwLCAxMjJdLFxyXG5cdFwibGlnaHRzZWFncmVlblwiOiBbMzIsIDE3OCwgMTcwXSxcclxuXHRcImxpZ2h0c2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDI1MF0sXHJcblx0XCJsaWdodHNsYXRlZ3JheVwiOiBbMTE5LCAxMzYsIDE1M10sXHJcblx0XCJsaWdodHNsYXRlZ3JleVwiOiBbMTE5LCAxMzYsIDE1M10sXHJcblx0XCJsaWdodHN0ZWVsYmx1ZVwiOiBbMTc2LCAxOTYsIDIyMl0sXHJcblx0XCJsaWdodHllbGxvd1wiOiBbMjU1LCAyNTUsIDIyNF0sXHJcblx0XCJsaW1lXCI6IFswLCAyNTUsIDBdLFxyXG5cdFwibGltZWdyZWVuXCI6IFs1MCwgMjA1LCA1MF0sXHJcblx0XCJsaW5lblwiOiBbMjUwLCAyNDAsIDIzMF0sXHJcblx0XCJtYWdlbnRhXCI6IFsyNTUsIDAsIDI1NV0sXHJcblx0XCJtYXJvb25cIjogWzEyOCwgMCwgMF0sXHJcblx0XCJtZWRpdW1hcXVhbWFyaW5lXCI6IFsxMDIsIDIwNSwgMTcwXSxcclxuXHRcIm1lZGl1bWJsdWVcIjogWzAsIDAsIDIwNV0sXHJcblx0XCJtZWRpdW1vcmNoaWRcIjogWzE4NiwgODUsIDIxMV0sXHJcblx0XCJtZWRpdW1wdXJwbGVcIjogWzE0NywgMTEyLCAyMTldLFxyXG5cdFwibWVkaXVtc2VhZ3JlZW5cIjogWzYwLCAxNzksIDExM10sXHJcblx0XCJtZWRpdW1zbGF0ZWJsdWVcIjogWzEyMywgMTA0LCAyMzhdLFxyXG5cdFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogWzAsIDI1MCwgMTU0XSxcclxuXHRcIm1lZGl1bXR1cnF1b2lzZVwiOiBbNzIsIDIwOSwgMjA0XSxcclxuXHRcIm1lZGl1bXZpb2xldHJlZFwiOiBbMTk5LCAyMSwgMTMzXSxcclxuXHRcIm1pZG5pZ2h0Ymx1ZVwiOiBbMjUsIDI1LCAxMTJdLFxyXG5cdFwibWludGNyZWFtXCI6IFsyNDUsIDI1NSwgMjUwXSxcclxuXHRcIm1pc3R5cm9zZVwiOiBbMjU1LCAyMjgsIDIyNV0sXHJcblx0XCJtb2NjYXNpblwiOiBbMjU1LCAyMjgsIDE4MV0sXHJcblx0XCJuYXZham93aGl0ZVwiOiBbMjU1LCAyMjIsIDE3M10sXHJcblx0XCJuYXZ5XCI6IFswLCAwLCAxMjhdLFxyXG5cdFwib2xkbGFjZVwiOiBbMjUzLCAyNDUsIDIzMF0sXHJcblx0XCJvbGl2ZVwiOiBbMTI4LCAxMjgsIDBdLFxyXG5cdFwib2xpdmVkcmFiXCI6IFsxMDcsIDE0MiwgMzVdLFxyXG5cdFwib3JhbmdlXCI6IFsyNTUsIDE2NSwgMF0sXHJcblx0XCJvcmFuZ2VyZWRcIjogWzI1NSwgNjksIDBdLFxyXG5cdFwib3JjaGlkXCI6IFsyMTgsIDExMiwgMjE0XSxcclxuXHRcInBhbGVnb2xkZW5yb2RcIjogWzIzOCwgMjMyLCAxNzBdLFxyXG5cdFwicGFsZWdyZWVuXCI6IFsxNTIsIDI1MSwgMTUyXSxcclxuXHRcInBhbGV0dXJxdW9pc2VcIjogWzE3NSwgMjM4LCAyMzhdLFxyXG5cdFwicGFsZXZpb2xldHJlZFwiOiBbMjE5LCAxMTIsIDE0N10sXHJcblx0XCJwYXBheWF3aGlwXCI6IFsyNTUsIDIzOSwgMjEzXSxcclxuXHRcInBlYWNocHVmZlwiOiBbMjU1LCAyMTgsIDE4NV0sXHJcblx0XCJwZXJ1XCI6IFsyMDUsIDEzMywgNjNdLFxyXG5cdFwicGlua1wiOiBbMjU1LCAxOTIsIDIwM10sXHJcblx0XCJwbHVtXCI6IFsyMjEsIDE2MCwgMjIxXSxcclxuXHRcInBvd2RlcmJsdWVcIjogWzE3NiwgMjI0LCAyMzBdLFxyXG5cdFwicHVycGxlXCI6IFsxMjgsIDAsIDEyOF0sXHJcblx0XCJyZWJlY2NhcHVycGxlXCI6IFsxMDIsIDUxLCAxNTNdLFxyXG5cdFwicmVkXCI6IFsyNTUsIDAsIDBdLFxyXG5cdFwicm9zeWJyb3duXCI6IFsxODgsIDE0MywgMTQzXSxcclxuXHRcInJveWFsYmx1ZVwiOiBbNjUsIDEwNSwgMjI1XSxcclxuXHRcInNhZGRsZWJyb3duXCI6IFsxMzksIDY5LCAxOV0sXHJcblx0XCJzYWxtb25cIjogWzI1MCwgMTI4LCAxMTRdLFxyXG5cdFwic2FuZHlicm93blwiOiBbMjQ0LCAxNjQsIDk2XSxcclxuXHRcInNlYWdyZWVuXCI6IFs0NiwgMTM5LCA4N10sXHJcblx0XCJzZWFzaGVsbFwiOiBbMjU1LCAyNDUsIDIzOF0sXHJcblx0XCJzaWVubmFcIjogWzE2MCwgODIsIDQ1XSxcclxuXHRcInNpbHZlclwiOiBbMTkyLCAxOTIsIDE5Ml0sXHJcblx0XCJza3libHVlXCI6IFsxMzUsIDIwNiwgMjM1XSxcclxuXHRcInNsYXRlYmx1ZVwiOiBbMTA2LCA5MCwgMjA1XSxcclxuXHRcInNsYXRlZ3JheVwiOiBbMTEyLCAxMjgsIDE0NF0sXHJcblx0XCJzbGF0ZWdyZXlcIjogWzExMiwgMTI4LCAxNDRdLFxyXG5cdFwic25vd1wiOiBbMjU1LCAyNTAsIDI1MF0sXHJcblx0XCJzcHJpbmdncmVlblwiOiBbMCwgMjU1LCAxMjddLFxyXG5cdFwic3RlZWxibHVlXCI6IFs3MCwgMTMwLCAxODBdLFxyXG5cdFwidGFuXCI6IFsyMTAsIDE4MCwgMTQwXSxcclxuXHRcInRlYWxcIjogWzAsIDEyOCwgMTI4XSxcclxuXHRcInRoaXN0bGVcIjogWzIxNiwgMTkxLCAyMTZdLFxyXG5cdFwidG9tYXRvXCI6IFsyNTUsIDk5LCA3MV0sXHJcblx0XCJ0dXJxdW9pc2VcIjogWzY0LCAyMjQsIDIwOF0sXHJcblx0XCJ2aW9sZXRcIjogWzIzOCwgMTMwLCAyMzhdLFxyXG5cdFwid2hlYXRcIjogWzI0NSwgMjIyLCAxNzldLFxyXG5cdFwid2hpdGVcIjogWzI1NSwgMjU1LCAyNTVdLFxyXG5cdFwid2hpdGVzbW9rZVwiOiBbMjQ1LCAyNDUsIDI0NV0sXHJcblx0XCJ5ZWxsb3dcIjogWzI1NSwgMjU1LCAwXSxcclxuXHRcInllbGxvd2dyZWVuXCI6IFsxNTQsIDIwNSwgNTBdXHJcbn07XHJcbiIsIi8qIE1JVCBsaWNlbnNlICovXG52YXIgY29sb3JOYW1lcyA9IHJlcXVpcmUoJ2NvbG9yLW5hbWUnKTtcbnZhciBzd2l6emxlID0gcmVxdWlyZSgnc2ltcGxlLXN3aXp6bGUnKTtcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIHJldmVyc2VOYW1lcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbi8vIGNyZWF0ZSBhIGxpc3Qgb2YgcmV2ZXJzZSBjb2xvciBuYW1lc1xuZm9yICh2YXIgbmFtZSBpbiBjb2xvck5hbWVzKSB7XG5cdGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbG9yTmFtZXMsIG5hbWUpKSB7XG5cdFx0cmV2ZXJzZU5hbWVzW2NvbG9yTmFtZXNbbmFtZV1dID0gbmFtZTtcblx0fVxufVxuXG52YXIgY3MgPSBtb2R1bGUuZXhwb3J0cyA9IHtcblx0dG86IHt9LFxuXHRnZXQ6IHt9XG59O1xuXG5jcy5nZXQgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdHZhciBwcmVmaXggPSBzdHJpbmcuc3Vic3RyaW5nKDAsIDMpLnRvTG93ZXJDYXNlKCk7XG5cdHZhciB2YWw7XG5cdHZhciBtb2RlbDtcblx0c3dpdGNoIChwcmVmaXgpIHtcblx0XHRjYXNlICdoc2wnOlxuXHRcdFx0dmFsID0gY3MuZ2V0LmhzbChzdHJpbmcpO1xuXHRcdFx0bW9kZWwgPSAnaHNsJztcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ2h3Yic6XG5cdFx0XHR2YWwgPSBjcy5nZXQuaHdiKHN0cmluZyk7XG5cdFx0XHRtb2RlbCA9ICdod2InO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHZhbCA9IGNzLmdldC5yZ2Ioc3RyaW5nKTtcblx0XHRcdG1vZGVsID0gJ3JnYic7XG5cdFx0XHRicmVhaztcblx0fVxuXG5cdGlmICghdmFsKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRyZXR1cm4ge21vZGVsOiBtb2RlbCwgdmFsdWU6IHZhbH07XG59O1xuXG5jcy5nZXQucmdiID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHRpZiAoIXN0cmluZykge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0dmFyIGFiYnIgPSAvXiMoW2EtZjAtOV17Myw0fSkkL2k7XG5cdHZhciBoZXggPSAvXiMoW2EtZjAtOV17Nn0pKFthLWYwLTldezJ9KT8kL2k7XG5cdHZhciByZ2JhID0gL15yZ2JhP1xcKFxccyooWystXT9cXGQrKSg/PVtcXHMsXSlcXHMqKD86LFxccyopPyhbKy1dP1xcZCspKD89W1xccyxdKVxccyooPzosXFxzKik/KFsrLV0/XFxkKylcXHMqKD86Wyx8XFwvXVxccyooWystXT9bXFxkXFwuXSspKCU/KVxccyopP1xcKSQvO1xuXHR2YXIgcGVyID0gL15yZ2JhP1xcKFxccyooWystXT9bXFxkXFwuXSspXFwlXFxzKiw/XFxzKihbKy1dP1tcXGRcXC5dKylcXCVcXHMqLD9cXHMqKFsrLV0/W1xcZFxcLl0rKVxcJVxccyooPzpbLHxcXC9dXFxzKihbKy1dP1tcXGRcXC5dKykoJT8pXFxzKik/XFwpJC87XG5cdHZhciBrZXl3b3JkID0gL14oXFx3KykkLztcblxuXHR2YXIgcmdiID0gWzAsIDAsIDAsIDFdO1xuXHR2YXIgbWF0Y2g7XG5cdHZhciBpO1xuXHR2YXIgaGV4QWxwaGE7XG5cblx0aWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKGhleCkpIHtcblx0XHRoZXhBbHBoYSA9IG1hdGNoWzJdO1xuXHRcdG1hdGNoID0gbWF0Y2hbMV07XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0XHQvLyBodHRwczovL2pzcGVyZi5jb20vc2xpY2UtdnMtc3Vic3RyLXZzLXN1YnN0cmluZy1tZXRob2RzLWxvbmctc3RyaW5nLzE5XG5cdFx0XHR2YXIgaTIgPSBpICogMjtcblx0XHRcdHJnYltpXSA9IHBhcnNlSW50KG1hdGNoLnNsaWNlKGkyLCBpMiArIDIpLCAxNik7XG5cdFx0fVxuXG5cdFx0aWYgKGhleEFscGhhKSB7XG5cdFx0XHRyZ2JbM10gPSBwYXJzZUludChoZXhBbHBoYSwgMTYpIC8gMjU1O1xuXHRcdH1cblx0fSBlbHNlIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChhYmJyKSkge1xuXHRcdG1hdGNoID0gbWF0Y2hbMV07XG5cdFx0aGV4QWxwaGEgPSBtYXRjaFszXTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdHJnYltpXSA9IHBhcnNlSW50KG1hdGNoW2ldICsgbWF0Y2hbaV0sIDE2KTtcblx0XHR9XG5cblx0XHRpZiAoaGV4QWxwaGEpIHtcblx0XHRcdHJnYlszXSA9IHBhcnNlSW50KGhleEFscGhhICsgaGV4QWxwaGEsIDE2KSAvIDI1NTtcblx0XHR9XG5cdH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2gocmdiYSkpIHtcblx0XHRmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0XHRyZ2JbaV0gPSBwYXJzZUludChtYXRjaFtpICsgMV0sIDApO1xuXHRcdH1cblxuXHRcdGlmIChtYXRjaFs0XSkge1xuXHRcdFx0aWYgKG1hdGNoWzVdKSB7XG5cdFx0XHRcdHJnYlszXSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pICogMC4wMTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJnYlszXSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChwZXIpKSB7XG5cdFx0Zm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdFx0cmdiW2ldID0gTWF0aC5yb3VuZChwYXJzZUZsb2F0KG1hdGNoW2kgKyAxXSkgKiAyLjU1KTtcblx0XHR9XG5cblx0XHRpZiAobWF0Y2hbNF0pIHtcblx0XHRcdGlmIChtYXRjaFs1XSkge1xuXHRcdFx0XHRyZ2JbM10gPSBwYXJzZUZsb2F0KG1hdGNoWzRdKSAqIDAuMDE7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZ2JbM10gPSBwYXJzZUZsb2F0KG1hdGNoWzRdKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goa2V5d29yZCkpIHtcblx0XHRpZiAobWF0Y2hbMV0gPT09ICd0cmFuc3BhcmVudCcpIHtcblx0XHRcdHJldHVybiBbMCwgMCwgMCwgMF07XG5cdFx0fVxuXG5cdFx0aWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbG9yTmFtZXMsIG1hdGNoWzFdKSkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0cmdiID0gY29sb3JOYW1lc1ttYXRjaFsxXV07XG5cdFx0cmdiWzNdID0gMTtcblxuXHRcdHJldHVybiByZ2I7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0cmdiW2ldID0gY2xhbXAocmdiW2ldLCAwLCAyNTUpO1xuXHR9XG5cdHJnYlszXSA9IGNsYW1wKHJnYlszXSwgMCwgMSk7XG5cblx0cmV0dXJuIHJnYjtcbn07XG5cbmNzLmdldC5oc2wgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdGlmICghc3RyaW5nKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHR2YXIgaHNsID0gL15oc2xhP1xcKFxccyooWystXT8oPzpcXGR7MCwzfVxcLik/XFxkKykoPzpkZWcpP1xccyosP1xccyooWystXT9bXFxkXFwuXSspJVxccyosP1xccyooWystXT9bXFxkXFwuXSspJVxccyooPzpbLHxcXC9dXFxzKihbKy1dPyg/PVxcLlxcZHxcXGQpKD86MHxbMS05XVxcZCopPyg/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPylcXHMqKT9cXCkkLztcblx0dmFyIG1hdGNoID0gc3RyaW5nLm1hdGNoKGhzbCk7XG5cblx0aWYgKG1hdGNoKSB7XG5cdFx0dmFyIGFscGhhID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG5cdFx0dmFyIGggPSAoKHBhcnNlRmxvYXQobWF0Y2hbMV0pICUgMzYwKSArIDM2MCkgJSAzNjA7XG5cdFx0dmFyIHMgPSBjbGFtcChwYXJzZUZsb2F0KG1hdGNoWzJdKSwgMCwgMTAwKTtcblx0XHR2YXIgbCA9IGNsYW1wKHBhcnNlRmxvYXQobWF0Y2hbM10pLCAwLCAxMDApO1xuXHRcdHZhciBhID0gY2xhbXAoaXNOYU4oYWxwaGEpID8gMSA6IGFscGhhLCAwLCAxKTtcblxuXHRcdHJldHVybiBbaCwgcywgbCwgYV07XG5cdH1cblxuXHRyZXR1cm4gbnVsbDtcbn07XG5cbmNzLmdldC5od2IgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdGlmICghc3RyaW5nKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHR2YXIgaHdiID0gL15od2JcXChcXHMqKFsrLV0/XFxkezAsM30oPzpcXC5cXGQrKT8pKD86ZGVnKT9cXHMqLFxccyooWystXT9bXFxkXFwuXSspJVxccyosXFxzKihbKy1dP1tcXGRcXC5dKyklXFxzKig/OixcXHMqKFsrLV0/KD89XFwuXFxkfFxcZCkoPzowfFsxLTldXFxkKik/KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KVxccyopP1xcKSQvO1xuXHR2YXIgbWF0Y2ggPSBzdHJpbmcubWF0Y2goaHdiKTtcblxuXHRpZiAobWF0Y2gpIHtcblx0XHR2YXIgYWxwaGEgPSBwYXJzZUZsb2F0KG1hdGNoWzRdKTtcblx0XHR2YXIgaCA9ICgocGFyc2VGbG9hdChtYXRjaFsxXSkgJSAzNjApICsgMzYwKSAlIDM2MDtcblx0XHR2YXIgdyA9IGNsYW1wKHBhcnNlRmxvYXQobWF0Y2hbMl0pLCAwLCAxMDApO1xuXHRcdHZhciBiID0gY2xhbXAocGFyc2VGbG9hdChtYXRjaFszXSksIDAsIDEwMCk7XG5cdFx0dmFyIGEgPSBjbGFtcChpc05hTihhbHBoYSkgPyAxIDogYWxwaGEsIDAsIDEpO1xuXHRcdHJldHVybiBbaCwgdywgYiwgYV07XG5cdH1cblxuXHRyZXR1cm4gbnVsbDtcbn07XG5cbmNzLnRvLmhleCA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHJnYmEgPSBzd2l6emxlKGFyZ3VtZW50cyk7XG5cblx0cmV0dXJuIChcblx0XHQnIycgK1xuXHRcdGhleERvdWJsZShyZ2JhWzBdKSArXG5cdFx0aGV4RG91YmxlKHJnYmFbMV0pICtcblx0XHRoZXhEb3VibGUocmdiYVsyXSkgK1xuXHRcdChyZ2JhWzNdIDwgMVxuXHRcdFx0PyAoaGV4RG91YmxlKE1hdGgucm91bmQocmdiYVszXSAqIDI1NSkpKVxuXHRcdFx0OiAnJylcblx0KTtcbn07XG5cbmNzLnRvLnJnYiA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHJnYmEgPSBzd2l6emxlKGFyZ3VtZW50cyk7XG5cblx0cmV0dXJuIHJnYmEubGVuZ3RoIDwgNCB8fCByZ2JhWzNdID09PSAxXG5cdFx0PyAncmdiKCcgKyBNYXRoLnJvdW5kKHJnYmFbMF0pICsgJywgJyArIE1hdGgucm91bmQocmdiYVsxXSkgKyAnLCAnICsgTWF0aC5yb3VuZChyZ2JhWzJdKSArICcpJ1xuXHRcdDogJ3JnYmEoJyArIE1hdGgucm91bmQocmdiYVswXSkgKyAnLCAnICsgTWF0aC5yb3VuZChyZ2JhWzFdKSArICcsICcgKyBNYXRoLnJvdW5kKHJnYmFbMl0pICsgJywgJyArIHJnYmFbM10gKyAnKSc7XG59O1xuXG5jcy50by5yZ2IucGVyY2VudCA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHJnYmEgPSBzd2l6emxlKGFyZ3VtZW50cyk7XG5cblx0dmFyIHIgPSBNYXRoLnJvdW5kKHJnYmFbMF0gLyAyNTUgKiAxMDApO1xuXHR2YXIgZyA9IE1hdGgucm91bmQocmdiYVsxXSAvIDI1NSAqIDEwMCk7XG5cdHZhciBiID0gTWF0aC5yb3VuZChyZ2JhWzJdIC8gMjU1ICogMTAwKTtcblxuXHRyZXR1cm4gcmdiYS5sZW5ndGggPCA0IHx8IHJnYmFbM10gPT09IDFcblx0XHQ/ICdyZ2IoJyArIHIgKyAnJSwgJyArIGcgKyAnJSwgJyArIGIgKyAnJSknXG5cdFx0OiAncmdiYSgnICsgciArICclLCAnICsgZyArICclLCAnICsgYiArICclLCAnICsgcmdiYVszXSArICcpJztcbn07XG5cbmNzLnRvLmhzbCA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGhzbGEgPSBzd2l6emxlKGFyZ3VtZW50cyk7XG5cdHJldHVybiBoc2xhLmxlbmd0aCA8IDQgfHwgaHNsYVszXSA9PT0gMVxuXHRcdD8gJ2hzbCgnICsgaHNsYVswXSArICcsICcgKyBoc2xhWzFdICsgJyUsICcgKyBoc2xhWzJdICsgJyUpJ1xuXHRcdDogJ2hzbGEoJyArIGhzbGFbMF0gKyAnLCAnICsgaHNsYVsxXSArICclLCAnICsgaHNsYVsyXSArICclLCAnICsgaHNsYVszXSArICcpJztcbn07XG5cbi8vIGh3YiBpcyBhIGJpdCBkaWZmZXJlbnQgdGhhbiByZ2IoYSkgJiBoc2woYSkgc2luY2UgdGhlcmUgaXMgbm8gYWxwaGEgc3BlY2lmaWMgc3ludGF4XG4vLyAoaHdiIGhhdmUgYWxwaGEgb3B0aW9uYWwgJiAxIGlzIGRlZmF1bHQgdmFsdWUpXG5jcy50by5od2IgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBod2JhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXG5cdHZhciBhID0gJyc7XG5cdGlmIChod2JhLmxlbmd0aCA+PSA0ICYmIGh3YmFbM10gIT09IDEpIHtcblx0XHRhID0gJywgJyArIGh3YmFbM107XG5cdH1cblxuXHRyZXR1cm4gJ2h3YignICsgaHdiYVswXSArICcsICcgKyBod2JhWzFdICsgJyUsICcgKyBod2JhWzJdICsgJyUnICsgYSArICcpJztcbn07XG5cbmNzLnRvLmtleXdvcmQgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHJldHVybiByZXZlcnNlTmFtZXNbcmdiLnNsaWNlKDAsIDMpXTtcbn07XG5cbi8vIGhlbHBlcnNcbmZ1bmN0aW9uIGNsYW1wKG51bSwgbWluLCBtYXgpIHtcblx0cmV0dXJuIE1hdGgubWluKE1hdGgubWF4KG1pbiwgbnVtKSwgbWF4KTtcbn1cblxuZnVuY3Rpb24gaGV4RG91YmxlKG51bSkge1xuXHR2YXIgc3RyID0gTWF0aC5yb3VuZChudW0pLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRyZXR1cm4gKHN0ci5sZW5ndGggPCAyKSA/ICcwJyArIHN0ciA6IHN0cjtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbG9yU3RyaW5nID0gcmVxdWlyZSgnY29sb3Itc3RyaW5nJyk7XG52YXIgY29udmVydCA9IHJlcXVpcmUoJ2NvbG9yLWNvbnZlcnQnKTtcblxudmFyIF9zbGljZSA9IFtdLnNsaWNlO1xuXG52YXIgc2tpcHBlZE1vZGVscyA9IFtcblx0Ly8gdG8gYmUgaG9uZXN0LCBJIGRvbid0IHJlYWxseSBmZWVsIGxpa2Uga2V5d29yZCBiZWxvbmdzIGluIGNvbG9yIGNvbnZlcnQsIGJ1dCBlaC5cblx0J2tleXdvcmQnLFxuXG5cdC8vIGdyYXkgY29uZmxpY3RzIHdpdGggc29tZSBtZXRob2QgbmFtZXMsIGFuZCBoYXMgaXRzIG93biBtZXRob2QgZGVmaW5lZC5cblx0J2dyYXknLFxuXG5cdC8vIHNob3VsZG4ndCByZWFsbHkgYmUgaW4gY29sb3ItY29udmVydCBlaXRoZXIuLi5cblx0J2hleCdcbl07XG5cbnZhciBoYXNoZWRNb2RlbEtleXMgPSB7fTtcbk9iamVjdC5rZXlzKGNvbnZlcnQpLmZvckVhY2goZnVuY3Rpb24gKG1vZGVsKSB7XG5cdGhhc2hlZE1vZGVsS2V5c1tfc2xpY2UuY2FsbChjb252ZXJ0W21vZGVsXS5sYWJlbHMpLnNvcnQoKS5qb2luKCcnKV0gPSBtb2RlbDtcbn0pO1xuXG52YXIgbGltaXRlcnMgPSB7fTtcblxuZnVuY3Rpb24gQ29sb3Iob2JqLCBtb2RlbCkge1xuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgQ29sb3IpKSB7XG5cdFx0cmV0dXJuIG5ldyBDb2xvcihvYmosIG1vZGVsKTtcblx0fVxuXG5cdGlmIChtb2RlbCAmJiBtb2RlbCBpbiBza2lwcGVkTW9kZWxzKSB7XG5cdFx0bW9kZWwgPSBudWxsO1xuXHR9XG5cblx0aWYgKG1vZGVsICYmICEobW9kZWwgaW4gY29udmVydCkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbW9kZWw6ICcgKyBtb2RlbCk7XG5cdH1cblxuXHR2YXIgaTtcblx0dmFyIGNoYW5uZWxzO1xuXG5cdGlmIChvYmogPT0gbnVsbCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVxLW51bGwsZXFlcWVxXG5cdFx0dGhpcy5tb2RlbCA9ICdyZ2InO1xuXHRcdHRoaXMuY29sb3IgPSBbMCwgMCwgMF07XG5cdFx0dGhpcy52YWxwaGEgPSAxO1xuXHR9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIENvbG9yKSB7XG5cdFx0dGhpcy5tb2RlbCA9IG9iai5tb2RlbDtcblx0XHR0aGlzLmNvbG9yID0gb2JqLmNvbG9yLnNsaWNlKCk7XG5cdFx0dGhpcy52YWxwaGEgPSBvYmoudmFscGhhO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG5cdFx0dmFyIHJlc3VsdCA9IGNvbG9yU3RyaW5nLmdldChvYmopO1xuXHRcdGlmIChyZXN1bHQgPT09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlIGNvbG9yIGZyb20gc3RyaW5nOiAnICsgb2JqKTtcblx0XHR9XG5cblx0XHR0aGlzLm1vZGVsID0gcmVzdWx0Lm1vZGVsO1xuXHRcdGNoYW5uZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5jaGFubmVscztcblx0XHR0aGlzLmNvbG9yID0gcmVzdWx0LnZhbHVlLnNsaWNlKDAsIGNoYW5uZWxzKTtcblx0XHR0aGlzLnZhbHBoYSA9IHR5cGVvZiByZXN1bHQudmFsdWVbY2hhbm5lbHNdID09PSAnbnVtYmVyJyA/IHJlc3VsdC52YWx1ZVtjaGFubmVsc10gOiAxO1xuXHR9IGVsc2UgaWYgKG9iai5sZW5ndGgpIHtcblx0XHR0aGlzLm1vZGVsID0gbW9kZWwgfHwgJ3JnYic7XG5cdFx0Y2hhbm5lbHMgPSBjb252ZXJ0W3RoaXMubW9kZWxdLmNoYW5uZWxzO1xuXHRcdHZhciBuZXdBcnIgPSBfc2xpY2UuY2FsbChvYmosIDAsIGNoYW5uZWxzKTtcblx0XHR0aGlzLmNvbG9yID0gemVyb0FycmF5KG5ld0FyciwgY2hhbm5lbHMpO1xuXHRcdHRoaXMudmFscGhhID0gdHlwZW9mIG9ialtjaGFubmVsc10gPT09ICdudW1iZXInID8gb2JqW2NoYW5uZWxzXSA6IDE7XG5cdH0gZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gJ251bWJlcicpIHtcblx0XHQvLyB0aGlzIGlzIGFsd2F5cyBSR0IgLSBjYW4gYmUgY29udmVydGVkIGxhdGVyIG9uLlxuXHRcdG9iaiAmPSAweEZGRkZGRjtcblx0XHR0aGlzLm1vZGVsID0gJ3JnYic7XG5cdFx0dGhpcy5jb2xvciA9IFtcblx0XHRcdChvYmogPj4gMTYpICYgMHhGRixcblx0XHRcdChvYmogPj4gOCkgJiAweEZGLFxuXHRcdFx0b2JqICYgMHhGRlxuXHRcdF07XG5cdFx0dGhpcy52YWxwaGEgPSAxO1xuXHR9IGVsc2Uge1xuXHRcdHRoaXMudmFscGhhID0gMTtcblxuXHRcdHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcblx0XHRpZiAoJ2FscGhhJyBpbiBvYmopIHtcblx0XHRcdGtleXMuc3BsaWNlKGtleXMuaW5kZXhPZignYWxwaGEnKSwgMSk7XG5cdFx0XHR0aGlzLnZhbHBoYSA9IHR5cGVvZiBvYmouYWxwaGEgPT09ICdudW1iZXInID8gb2JqLmFscGhhIDogMDtcblx0XHR9XG5cblx0XHR2YXIgaGFzaGVkS2V5cyA9IGtleXMuc29ydCgpLmpvaW4oJycpO1xuXHRcdGlmICghKGhhc2hlZEtleXMgaW4gaGFzaGVkTW9kZWxLZXlzKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcGFyc2UgY29sb3IgZnJvbSBvYmplY3Q6ICcgKyBKU09OLnN0cmluZ2lmeShvYmopKTtcblx0XHR9XG5cblx0XHR0aGlzLm1vZGVsID0gaGFzaGVkTW9kZWxLZXlzW2hhc2hlZEtleXNdO1xuXG5cdFx0dmFyIGxhYmVscyA9IGNvbnZlcnRbdGhpcy5tb2RlbF0ubGFiZWxzO1xuXHRcdHZhciBjb2xvciA9IFtdO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbG9yLnB1c2gob2JqW2xhYmVsc1tpXV0pO1xuXHRcdH1cblxuXHRcdHRoaXMuY29sb3IgPSB6ZXJvQXJyYXkoY29sb3IpO1xuXHR9XG5cblx0Ly8gcGVyZm9ybSBsaW1pdGF0aW9ucyAoY2xhbXBpbmcsIGV0Yy4pXG5cdGlmIChsaW1pdGVyc1t0aGlzLm1vZGVsXSkge1xuXHRcdGNoYW5uZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5jaGFubmVscztcblx0XHRmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykge1xuXHRcdFx0dmFyIGxpbWl0ID0gbGltaXRlcnNbdGhpcy5tb2RlbF1baV07XG5cdFx0XHRpZiAobGltaXQpIHtcblx0XHRcdFx0dGhpcy5jb2xvcltpXSA9IGxpbWl0KHRoaXMuY29sb3JbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHRoaXMudmFscGhhID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdGhpcy52YWxwaGEpKTtcblxuXHRpZiAoT2JqZWN0LmZyZWV6ZSkge1xuXHRcdE9iamVjdC5mcmVlemUodGhpcyk7XG5cdH1cbn1cblxuQ29sb3IucHJvdG90eXBlID0ge1xuXHR0b1N0cmluZzogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnN0cmluZygpO1xuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzW3RoaXMubW9kZWxdKCk7XG5cdH0sXG5cblx0c3RyaW5nOiBmdW5jdGlvbiAocGxhY2VzKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzLm1vZGVsIGluIGNvbG9yU3RyaW5nLnRvID8gdGhpcyA6IHRoaXMucmdiKCk7XG5cdFx0c2VsZiA9IHNlbGYucm91bmQodHlwZW9mIHBsYWNlcyA9PT0gJ251bWJlcicgPyBwbGFjZXMgOiAxKTtcblx0XHR2YXIgYXJncyA9IHNlbGYudmFscGhhID09PSAxID8gc2VsZi5jb2xvciA6IHNlbGYuY29sb3IuY29uY2F0KHRoaXMudmFscGhhKTtcblx0XHRyZXR1cm4gY29sb3JTdHJpbmcudG9bc2VsZi5tb2RlbF0oYXJncyk7XG5cdH0sXG5cblx0cGVyY2VudFN0cmluZzogZnVuY3Rpb24gKHBsYWNlcykge1xuXHRcdHZhciBzZWxmID0gdGhpcy5yZ2IoKS5yb3VuZCh0eXBlb2YgcGxhY2VzID09PSAnbnVtYmVyJyA/IHBsYWNlcyA6IDEpO1xuXHRcdHZhciBhcmdzID0gc2VsZi52YWxwaGEgPT09IDEgPyBzZWxmLmNvbG9yIDogc2VsZi5jb2xvci5jb25jYXQodGhpcy52YWxwaGEpO1xuXHRcdHJldHVybiBjb2xvclN0cmluZy50by5yZ2IucGVyY2VudChhcmdzKTtcblx0fSxcblxuXHRhcnJheTogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnZhbHBoYSA9PT0gMSA/IHRoaXMuY29sb3Iuc2xpY2UoKSA6IHRoaXMuY29sb3IuY29uY2F0KHRoaXMudmFscGhhKTtcblx0fSxcblxuXHRvYmplY3Q6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmVzdWx0ID0ge307XG5cdFx0dmFyIGNoYW5uZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5jaGFubmVscztcblx0XHR2YXIgbGFiZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5sYWJlbHM7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHtcblx0XHRcdHJlc3VsdFtsYWJlbHNbaV1dID0gdGhpcy5jb2xvcltpXTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy52YWxwaGEgIT09IDEpIHtcblx0XHRcdHJlc3VsdC5hbHBoYSA9IHRoaXMudmFscGhhO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0dW5pdEFycmF5OiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHJnYiA9IHRoaXMucmdiKCkuY29sb3I7XG5cdFx0cmdiWzBdIC89IDI1NTtcblx0XHRyZ2JbMV0gLz0gMjU1O1xuXHRcdHJnYlsyXSAvPSAyNTU7XG5cblx0XHRpZiAodGhpcy52YWxwaGEgIT09IDEpIHtcblx0XHRcdHJnYi5wdXNoKHRoaXMudmFscGhhKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmdiO1xuXHR9LFxuXG5cdHVuaXRPYmplY3Q6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKS5vYmplY3QoKTtcblx0XHRyZ2IuciAvPSAyNTU7XG5cdFx0cmdiLmcgLz0gMjU1O1xuXHRcdHJnYi5iIC89IDI1NTtcblxuXHRcdGlmICh0aGlzLnZhbHBoYSAhPT0gMSkge1xuXHRcdFx0cmdiLmFscGhhID0gdGhpcy52YWxwaGE7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJnYjtcblx0fSxcblxuXHRyb3VuZDogZnVuY3Rpb24gKHBsYWNlcykge1xuXHRcdHBsYWNlcyA9IE1hdGgubWF4KHBsYWNlcyB8fCAwLCAwKTtcblx0XHRyZXR1cm4gbmV3IENvbG9yKHRoaXMuY29sb3IubWFwKHJvdW5kVG9QbGFjZShwbGFjZXMpKS5jb25jYXQodGhpcy52YWxwaGEpLCB0aGlzLm1vZGVsKTtcblx0fSxcblxuXHRhbHBoYTogZnVuY3Rpb24gKHZhbCkge1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKHRoaXMuY29sb3IuY29uY2F0KE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHZhbCkpKSwgdGhpcy5tb2RlbCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMudmFscGhhO1xuXHR9LFxuXG5cdC8vIHJnYlxuXHRyZWQ6IGdldHNldCgncmdiJywgMCwgbWF4Zm4oMjU1KSksXG5cdGdyZWVuOiBnZXRzZXQoJ3JnYicsIDEsIG1heGZuKDI1NSkpLFxuXHRibHVlOiBnZXRzZXQoJ3JnYicsIDIsIG1heGZuKDI1NSkpLFxuXG5cdGh1ZTogZ2V0c2V0KFsnaHNsJywgJ2hzdicsICdoc2wnLCAnaHdiJywgJ2hjZyddLCAwLCBmdW5jdGlvbiAodmFsKSB7IHJldHVybiAoKHZhbCAlIDM2MCkgKyAzNjApICUgMzYwOyB9KSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBicmFjZS1zdHlsZVxuXG5cdHNhdHVyYXRpb25sOiBnZXRzZXQoJ2hzbCcsIDEsIG1heGZuKDEwMCkpLFxuXHRsaWdodG5lc3M6IGdldHNldCgnaHNsJywgMiwgbWF4Zm4oMTAwKSksXG5cblx0c2F0dXJhdGlvbnY6IGdldHNldCgnaHN2JywgMSwgbWF4Zm4oMTAwKSksXG5cdHZhbHVlOiBnZXRzZXQoJ2hzdicsIDIsIG1heGZuKDEwMCkpLFxuXG5cdGNocm9tYTogZ2V0c2V0KCdoY2cnLCAxLCBtYXhmbigxMDApKSxcblx0Z3JheTogZ2V0c2V0KCdoY2cnLCAyLCBtYXhmbigxMDApKSxcblxuXHR3aGl0ZTogZ2V0c2V0KCdod2InLCAxLCBtYXhmbigxMDApKSxcblx0d2JsYWNrOiBnZXRzZXQoJ2h3YicsIDIsIG1heGZuKDEwMCkpLFxuXG5cdGN5YW46IGdldHNldCgnY215aycsIDAsIG1heGZuKDEwMCkpLFxuXHRtYWdlbnRhOiBnZXRzZXQoJ2NteWsnLCAxLCBtYXhmbigxMDApKSxcblx0eWVsbG93OiBnZXRzZXQoJ2NteWsnLCAyLCBtYXhmbigxMDApKSxcblx0YmxhY2s6IGdldHNldCgnY215aycsIDMsIG1heGZuKDEwMCkpLFxuXG5cdHg6IGdldHNldCgneHl6JywgMCwgbWF4Zm4oMTAwKSksXG5cdHk6IGdldHNldCgneHl6JywgMSwgbWF4Zm4oMTAwKSksXG5cdHo6IGdldHNldCgneHl6JywgMiwgbWF4Zm4oMTAwKSksXG5cblx0bDogZ2V0c2V0KCdsYWInLCAwLCBtYXhmbigxMDApKSxcblx0YTogZ2V0c2V0KCdsYWInLCAxKSxcblx0YjogZ2V0c2V0KCdsYWInLCAyKSxcblxuXHRrZXl3b3JkOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IodmFsKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29udmVydFt0aGlzLm1vZGVsXS5rZXl3b3JkKHRoaXMuY29sb3IpO1xuXHR9LFxuXG5cdGhleDogZnVuY3Rpb24gKHZhbCkge1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKHZhbCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbG9yU3RyaW5nLnRvLmhleCh0aGlzLnJnYigpLnJvdW5kKCkuY29sb3IpO1xuXHR9LFxuXG5cdHJnYk51bWJlcjogZnVuY3Rpb24gKCkge1xuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpLmNvbG9yO1xuXHRcdHJldHVybiAoKHJnYlswXSAmIDB4RkYpIDw8IDE2KSB8ICgocmdiWzFdICYgMHhGRikgPDwgOCkgfCAocmdiWzJdICYgMHhGRik7XG5cdH0sXG5cblx0bHVtaW5vc2l0eTogZnVuY3Rpb24gKCkge1xuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jcmVsYXRpdmVsdW1pbmFuY2VkZWZcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKS5jb2xvcjtcblxuXHRcdHZhciBsdW0gPSBbXTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHJnYi5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGNoYW4gPSByZ2JbaV0gLyAyNTU7XG5cdFx0XHRsdW1baV0gPSAoY2hhbiA8PSAwLjAzOTI4KSA/IGNoYW4gLyAxMi45MiA6IE1hdGgucG93KCgoY2hhbiArIDAuMDU1KSAvIDEuMDU1KSwgMi40KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gMC4yMTI2ICogbHVtWzBdICsgMC43MTUyICogbHVtWzFdICsgMC4wNzIyICogbHVtWzJdO1xuXHR9LFxuXG5cdGNvbnRyYXN0OiBmdW5jdGlvbiAoY29sb3IyKSB7XG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNjb250cmFzdC1yYXRpb2RlZlxuXHRcdHZhciBsdW0xID0gdGhpcy5sdW1pbm9zaXR5KCk7XG5cdFx0dmFyIGx1bTIgPSBjb2xvcjIubHVtaW5vc2l0eSgpO1xuXG5cdFx0aWYgKGx1bTEgPiBsdW0yKSB7XG5cdFx0XHRyZXR1cm4gKGx1bTEgKyAwLjA1KSAvIChsdW0yICsgMC4wNSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChsdW0yICsgMC4wNSkgLyAobHVtMSArIDAuMDUpO1xuXHR9LFxuXG5cdGxldmVsOiBmdW5jdGlvbiAoY29sb3IyKSB7XG5cdFx0dmFyIGNvbnRyYXN0UmF0aW8gPSB0aGlzLmNvbnRyYXN0KGNvbG9yMik7XG5cdFx0aWYgKGNvbnRyYXN0UmF0aW8gPj0gNy4xKSB7XG5cdFx0XHRyZXR1cm4gJ0FBQSc7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChjb250cmFzdFJhdGlvID49IDQuNSkgPyAnQUEnIDogJyc7XG5cdH0sXG5cblx0aXNEYXJrOiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gWUlRIGVxdWF0aW9uIGZyb20gaHR0cDovLzI0d2F5cy5vcmcvMjAxMC9jYWxjdWxhdGluZy1jb2xvci1jb250cmFzdFxuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpLmNvbG9yO1xuXHRcdHZhciB5aXEgPSAocmdiWzBdICogMjk5ICsgcmdiWzFdICogNTg3ICsgcmdiWzJdICogMTE0KSAvIDEwMDA7XG5cdFx0cmV0dXJuIHlpcSA8IDEyODtcblx0fSxcblxuXHRpc0xpZ2h0OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuICF0aGlzLmlzRGFyaygpO1xuXHR9LFxuXG5cdG5lZ2F0ZTogZnVuY3Rpb24gKCkge1xuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0XHRyZ2IuY29sb3JbaV0gPSAyNTUgLSByZ2IuY29sb3JbaV07XG5cdFx0fVxuXHRcdHJldHVybiByZ2I7XG5cdH0sXG5cblx0bGlnaHRlbjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMuaHNsKCk7XG5cdFx0aHNsLmNvbG9yWzJdICs9IGhzbC5jb2xvclsyXSAqIHJhdGlvO1xuXHRcdHJldHVybiBoc2w7XG5cdH0sXG5cblx0ZGFya2VuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHNsID0gdGhpcy5oc2woKTtcblx0XHRoc2wuY29sb3JbMl0gLT0gaHNsLmNvbG9yWzJdICogcmF0aW87XG5cdFx0cmV0dXJuIGhzbDtcblx0fSxcblxuXHRzYXR1cmF0ZTogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMuaHNsKCk7XG5cdFx0aHNsLmNvbG9yWzFdICs9IGhzbC5jb2xvclsxXSAqIHJhdGlvO1xuXHRcdHJldHVybiBoc2w7XG5cdH0sXG5cblx0ZGVzYXR1cmF0ZTogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMuaHNsKCk7XG5cdFx0aHNsLmNvbG9yWzFdIC09IGhzbC5jb2xvclsxXSAqIHJhdGlvO1xuXHRcdHJldHVybiBoc2w7XG5cdH0sXG5cblx0d2hpdGVuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHdiID0gdGhpcy5od2IoKTtcblx0XHRod2IuY29sb3JbMV0gKz0gaHdiLmNvbG9yWzFdICogcmF0aW87XG5cdFx0cmV0dXJuIGh3Yjtcblx0fSxcblxuXHRibGFja2VuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHdiID0gdGhpcy5od2IoKTtcblx0XHRod2IuY29sb3JbMl0gKz0gaHdiLmNvbG9yWzJdICogcmF0aW87XG5cdFx0cmV0dXJuIGh3Yjtcblx0fSxcblxuXHRncmF5c2NhbGU6IGZ1bmN0aW9uICgpIHtcblx0XHQvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dyYXlzY2FsZSNDb252ZXJ0aW5nX2NvbG9yX3RvX2dyYXlzY2FsZVxuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpLmNvbG9yO1xuXHRcdHZhciB2YWwgPSByZ2JbMF0gKiAwLjMgKyByZ2JbMV0gKiAwLjU5ICsgcmdiWzJdICogMC4xMTtcblx0XHRyZXR1cm4gQ29sb3IucmdiKHZhbCwgdmFsLCB2YWwpO1xuXHR9LFxuXG5cdGZhZGU6IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHJldHVybiB0aGlzLmFscGhhKHRoaXMudmFscGhhIC0gKHRoaXMudmFscGhhICogcmF0aW8pKTtcblx0fSxcblxuXHRvcGFxdWVyOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHRyZXR1cm4gdGhpcy5hbHBoYSh0aGlzLnZhbHBoYSArICh0aGlzLnZhbHBoYSAqIHJhdGlvKSk7XG5cdH0sXG5cblx0cm90YXRlOiBmdW5jdGlvbiAoZGVncmVlcykge1xuXHRcdHZhciBoc2wgPSB0aGlzLmhzbCgpO1xuXHRcdHZhciBodWUgPSBoc2wuY29sb3JbMF07XG5cdFx0aHVlID0gKGh1ZSArIGRlZ3JlZXMpICUgMzYwO1xuXHRcdGh1ZSA9IGh1ZSA8IDAgPyAzNjAgKyBodWUgOiBodWU7XG5cdFx0aHNsLmNvbG9yWzBdID0gaHVlO1xuXHRcdHJldHVybiBoc2w7XG5cdH0sXG5cblx0bWl4OiBmdW5jdGlvbiAobWl4aW5Db2xvciwgd2VpZ2h0KSB7XG5cdFx0Ly8gcG9ydGVkIGZyb20gc2FzcyBpbXBsZW1lbnRhdGlvbiBpbiBDXG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3Nhc3MvbGlic2Fzcy9ibG9iLzBlNmI0YTI4NTAwOTIzNTZhYTNlY2UwN2M2YjI0OWYwMjIxY2FjZWQvZnVuY3Rpb25zLmNwcCNMMjA5XG5cdFx0aWYgKCFtaXhpbkNvbG9yIHx8ICFtaXhpbkNvbG9yLnJnYikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdBcmd1bWVudCB0byBcIm1peFwiIHdhcyBub3QgYSBDb2xvciBpbnN0YW5jZSwgYnV0IHJhdGhlciBhbiBpbnN0YW5jZSBvZiAnICsgdHlwZW9mIG1peGluQ29sb3IpO1xuXHRcdH1cblx0XHR2YXIgY29sb3IxID0gbWl4aW5Db2xvci5yZ2IoKTtcblx0XHR2YXIgY29sb3IyID0gdGhpcy5yZ2IoKTtcblx0XHR2YXIgcCA9IHdlaWdodCA9PT0gdW5kZWZpbmVkID8gMC41IDogd2VpZ2h0O1xuXG5cdFx0dmFyIHcgPSAyICogcCAtIDE7XG5cdFx0dmFyIGEgPSBjb2xvcjEuYWxwaGEoKSAtIGNvbG9yMi5hbHBoYSgpO1xuXG5cdFx0dmFyIHcxID0gKCgodyAqIGEgPT09IC0xKSA/IHcgOiAodyArIGEpIC8gKDEgKyB3ICogYSkpICsgMSkgLyAyLjA7XG5cdFx0dmFyIHcyID0gMSAtIHcxO1xuXG5cdFx0cmV0dXJuIENvbG9yLnJnYihcblx0XHRcdFx0dzEgKiBjb2xvcjEucmVkKCkgKyB3MiAqIGNvbG9yMi5yZWQoKSxcblx0XHRcdFx0dzEgKiBjb2xvcjEuZ3JlZW4oKSArIHcyICogY29sb3IyLmdyZWVuKCksXG5cdFx0XHRcdHcxICogY29sb3IxLmJsdWUoKSArIHcyICogY29sb3IyLmJsdWUoKSxcblx0XHRcdFx0Y29sb3IxLmFscGhhKCkgKiBwICsgY29sb3IyLmFscGhhKCkgKiAoMSAtIHApKTtcblx0fVxufTtcblxuLy8gbW9kZWwgY29udmVyc2lvbiBtZXRob2RzIGFuZCBzdGF0aWMgY29uc3RydWN0b3JzXG5PYmplY3Qua2V5cyhjb252ZXJ0KS5mb3JFYWNoKGZ1bmN0aW9uIChtb2RlbCkge1xuXHRpZiAoc2tpcHBlZE1vZGVscy5pbmRleE9mKG1vZGVsKSAhPT0gLTEpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHR2YXIgY2hhbm5lbHMgPSBjb252ZXJ0W21vZGVsXS5jaGFubmVscztcblxuXHQvLyBjb252ZXJzaW9uIG1ldGhvZHNcblx0Q29sb3IucHJvdG90eXBlW21vZGVsXSA9IGZ1bmN0aW9uICgpIHtcblx0XHRpZiAodGhpcy5tb2RlbCA9PT0gbW9kZWwpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IodGhpcyk7XG5cdFx0fVxuXG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IoYXJndW1lbnRzLCBtb2RlbCk7XG5cdFx0fVxuXG5cdFx0dmFyIG5ld0FscGhhID0gdHlwZW9mIGFyZ3VtZW50c1tjaGFubmVsc10gPT09ICdudW1iZXInID8gY2hhbm5lbHMgOiB0aGlzLnZhbHBoYTtcblx0XHRyZXR1cm4gbmV3IENvbG9yKGFzc2VydEFycmF5KGNvbnZlcnRbdGhpcy5tb2RlbF1bbW9kZWxdLnJhdyh0aGlzLmNvbG9yKSkuY29uY2F0KG5ld0FscGhhKSwgbW9kZWwpO1xuXHR9O1xuXG5cdC8vICdzdGF0aWMnIGNvbnN0cnVjdGlvbiBtZXRob2RzXG5cdENvbG9yW21vZGVsXSA9IGZ1bmN0aW9uIChjb2xvcikge1xuXHRcdGlmICh0eXBlb2YgY29sb3IgPT09ICdudW1iZXInKSB7XG5cdFx0XHRjb2xvciA9IHplcm9BcnJheShfc2xpY2UuY2FsbChhcmd1bWVudHMpLCBjaGFubmVscyk7XG5cdFx0fVxuXHRcdHJldHVybiBuZXcgQ29sb3IoY29sb3IsIG1vZGVsKTtcblx0fTtcbn0pO1xuXG5mdW5jdGlvbiByb3VuZFRvKG51bSwgcGxhY2VzKSB7XG5cdHJldHVybiBOdW1iZXIobnVtLnRvRml4ZWQocGxhY2VzKSk7XG59XG5cbmZ1bmN0aW9uIHJvdW5kVG9QbGFjZShwbGFjZXMpIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChudW0pIHtcblx0XHRyZXR1cm4gcm91bmRUbyhudW0sIHBsYWNlcyk7XG5cdH07XG59XG5cbmZ1bmN0aW9uIGdldHNldChtb2RlbCwgY2hhbm5lbCwgbW9kaWZpZXIpIHtcblx0bW9kZWwgPSBBcnJheS5pc0FycmF5KG1vZGVsKSA/IG1vZGVsIDogW21vZGVsXTtcblxuXHRtb2RlbC5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7XG5cdFx0KGxpbWl0ZXJzW21dIHx8IChsaW1pdGVyc1ttXSA9IFtdKSlbY2hhbm5lbF0gPSBtb2RpZmllcjtcblx0fSk7XG5cblx0bW9kZWwgPSBtb2RlbFswXTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gKHZhbCkge1xuXHRcdHZhciByZXN1bHQ7XG5cblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0aWYgKG1vZGlmaWVyKSB7XG5cdFx0XHRcdHZhbCA9IG1vZGlmaWVyKHZhbCk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3VsdCA9IHRoaXNbbW9kZWxdKCk7XG5cdFx0XHRyZXN1bHQuY29sb3JbY2hhbm5lbF0gPSB2YWw7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdHJlc3VsdCA9IHRoaXNbbW9kZWxdKCkuY29sb3JbY2hhbm5lbF07XG5cdFx0aWYgKG1vZGlmaWVyKSB7XG5cdFx0XHRyZXN1bHQgPSBtb2RpZmllcihyZXN1bHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG59XG5cbmZ1bmN0aW9uIG1heGZuKG1heCkge1xuXHRyZXR1cm4gZnVuY3Rpb24gKHYpIHtcblx0XHRyZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4obWF4LCB2KSk7XG5cdH07XG59XG5cbmZ1bmN0aW9uIGFzc2VydEFycmF5KHZhbCkge1xuXHRyZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF07XG59XG5cbmZ1bmN0aW9uIHplcm9BcnJheShhcnIsIGxlbmd0aCkge1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKHR5cGVvZiBhcnJbaV0gIT09ICdudW1iZXInKSB7XG5cdFx0XHRhcnJbaV0gPSAwO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhcnI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29sb3I7XG4iLCIvKiFcbiAqIGNvb2tpZVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBSb21hbiBTaHR5bG1hblxuICogQ29weXJpZ2h0KGMpIDIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5leHBvcnRzLnNlcmlhbGl6ZSA9IHNlcmlhbGl6ZTtcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgX190b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggZmllbGQtY29udGVudCBpbiBSRkMgNzIzMCBzZWMgMy4yXG4gKlxuICogZmllbGQtY29udGVudCA9IGZpZWxkLXZjaGFyIFsgMSooIFNQIC8gSFRBQiApIGZpZWxkLXZjaGFyIF1cbiAqIGZpZWxkLXZjaGFyICAgPSBWQ0hBUiAvIG9icy10ZXh0XG4gKiBvYnMtdGV4dCAgICAgID0gJXg4MC1GRlxuICovXG5cbnZhciBmaWVsZENvbnRlbnRSZWdFeHAgPSAvXltcXHUwMDA5XFx1MDAyMC1cXHUwMDdlXFx1MDA4MC1cXHUwMGZmXSskLztcblxuLyoqXG4gKiBQYXJzZSBhIGNvb2tpZSBoZWFkZXIuXG4gKlxuICogUGFyc2UgdGhlIGdpdmVuIGNvb2tpZSBoZWFkZXIgc3RyaW5nIGludG8gYW4gb2JqZWN0XG4gKiBUaGUgb2JqZWN0IGhhcyB0aGUgdmFyaW91cyBjb29raWVzIGFzIGtleXMobmFtZXMpID0+IHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge29iamVjdH1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc3RyIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIHZhciBvYmogPSB7fVxuICB2YXIgb3B0ID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIGRlYyA9IG9wdC5kZWNvZGUgfHwgZGVjb2RlO1xuXG4gIHZhciBpbmRleCA9IDBcbiAgd2hpbGUgKGluZGV4IDwgc3RyLmxlbmd0aCkge1xuICAgIHZhciBlcUlkeCA9IHN0ci5pbmRleE9mKCc9JywgaW5kZXgpXG5cbiAgICAvLyBubyBtb3JlIGNvb2tpZSBwYWlyc1xuICAgIGlmIChlcUlkeCA9PT0gLTEpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgdmFyIGVuZElkeCA9IHN0ci5pbmRleE9mKCc7JywgaW5kZXgpXG5cbiAgICBpZiAoZW5kSWR4ID09PSAtMSkge1xuICAgICAgZW5kSWR4ID0gc3RyLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAoZW5kSWR4IDwgZXFJZHgpIHtcbiAgICAgIC8vIGJhY2t0cmFjayBvbiBwcmlvciBzZW1pY29sb25cbiAgICAgIGluZGV4ID0gc3RyLmxhc3RJbmRleE9mKCc7JywgZXFJZHggLSAxKSArIDFcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgdmFyIGtleSA9IHN0ci5zbGljZShpbmRleCwgZXFJZHgpLnRyaW0oKVxuXG4gICAgLy8gb25seSBhc3NpZ24gb25jZVxuICAgIGlmICh1bmRlZmluZWQgPT09IG9ialtrZXldKSB7XG4gICAgICB2YXIgdmFsID0gc3RyLnNsaWNlKGVxSWR4ICsgMSwgZW5kSWR4KS50cmltKClcblxuICAgICAgLy8gcXVvdGVkIHZhbHVlc1xuICAgICAgaWYgKHZhbC5jaGFyQ29kZUF0KDApID09PSAweDIyKSB7XG4gICAgICAgIHZhbCA9IHZhbC5zbGljZSgxLCAtMSlcbiAgICAgIH1cblxuICAgICAgb2JqW2tleV0gPSB0cnlEZWNvZGUodmFsLCBkZWMpO1xuICAgIH1cblxuICAgIGluZGV4ID0gZW5kSWR4ICsgMVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBTZXJpYWxpemUgZGF0YSBpbnRvIGEgY29va2llIGhlYWRlci5cbiAqXG4gKiBTZXJpYWxpemUgdGhlIGEgbmFtZSB2YWx1ZSBwYWlyIGludG8gYSBjb29raWUgc3RyaW5nIHN1aXRhYmxlIGZvclxuICogaHR0cCBoZWFkZXJzLiBBbiBvcHRpb25hbCBvcHRpb25zIG9iamVjdCBzcGVjaWZpZWQgY29va2llIHBhcmFtZXRlcnMuXG4gKlxuICogc2VyaWFsaXplKCdmb28nLCAnYmFyJywgeyBodHRwT25seTogdHJ1ZSB9KVxuICogICA9PiBcImZvbz1iYXI7IGh0dHBPbmx5XCJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IHZhbFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZShuYW1lLCB2YWwsIG9wdGlvbnMpIHtcbiAgdmFyIG9wdCA9IG9wdGlvbnMgfHwge307XG4gIHZhciBlbmMgPSBvcHQuZW5jb2RlIHx8IGVuY29kZTtcblxuICBpZiAodHlwZW9mIGVuYyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBlbmNvZGUgaXMgaW52YWxpZCcpO1xuICB9XG5cbiAgaWYgKCFmaWVsZENvbnRlbnRSZWdFeHAudGVzdChuYW1lKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IG5hbWUgaXMgaW52YWxpZCcpO1xuICB9XG5cbiAgdmFyIHZhbHVlID0gZW5jKHZhbCk7XG5cbiAgaWYgKHZhbHVlICYmICFmaWVsZENvbnRlbnRSZWdFeHAudGVzdCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCB2YWwgaXMgaW52YWxpZCcpO1xuICB9XG5cbiAgdmFyIHN0ciA9IG5hbWUgKyAnPScgKyB2YWx1ZTtcblxuICBpZiAobnVsbCAhPSBvcHQubWF4QWdlKSB7XG4gICAgdmFyIG1heEFnZSA9IG9wdC5tYXhBZ2UgLSAwO1xuXG4gICAgaWYgKGlzTmFOKG1heEFnZSkgfHwgIWlzRmluaXRlKG1heEFnZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBtYXhBZ2UgaXMgaW52YWxpZCcpXG4gICAgfVxuXG4gICAgc3RyICs9ICc7IE1heC1BZ2U9JyArIE1hdGguZmxvb3IobWF4QWdlKTtcbiAgfVxuXG4gIGlmIChvcHQuZG9tYWluKSB7XG4gICAgaWYgKCFmaWVsZENvbnRlbnRSZWdFeHAudGVzdChvcHQuZG9tYWluKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIGRvbWFpbiBpcyBpbnZhbGlkJyk7XG4gICAgfVxuXG4gICAgc3RyICs9ICc7IERvbWFpbj0nICsgb3B0LmRvbWFpbjtcbiAgfVxuXG4gIGlmIChvcHQucGF0aCkge1xuICAgIGlmICghZmllbGRDb250ZW50UmVnRXhwLnRlc3Qob3B0LnBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gcGF0aCBpcyBpbnZhbGlkJyk7XG4gICAgfVxuXG4gICAgc3RyICs9ICc7IFBhdGg9JyArIG9wdC5wYXRoO1xuICB9XG5cbiAgaWYgKG9wdC5leHBpcmVzKSB7XG4gICAgdmFyIGV4cGlyZXMgPSBvcHQuZXhwaXJlc1xuXG4gICAgaWYgKCFpc0RhdGUoZXhwaXJlcykgfHwgaXNOYU4oZXhwaXJlcy52YWx1ZU9mKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gZXhwaXJlcyBpcyBpbnZhbGlkJyk7XG4gICAgfVxuXG4gICAgc3RyICs9ICc7IEV4cGlyZXM9JyArIGV4cGlyZXMudG9VVENTdHJpbmcoKVxuICB9XG5cbiAgaWYgKG9wdC5odHRwT25seSkge1xuICAgIHN0ciArPSAnOyBIdHRwT25seSc7XG4gIH1cblxuICBpZiAob3B0LnNlY3VyZSkge1xuICAgIHN0ciArPSAnOyBTZWN1cmUnO1xuICB9XG5cbiAgaWYgKG9wdC5wcmlvcml0eSkge1xuICAgIHZhciBwcmlvcml0eSA9IHR5cGVvZiBvcHQucHJpb3JpdHkgPT09ICdzdHJpbmcnXG4gICAgICA/IG9wdC5wcmlvcml0eS50b0xvd2VyQ2FzZSgpXG4gICAgICA6IG9wdC5wcmlvcml0eVxuXG4gICAgc3dpdGNoIChwcmlvcml0eSkge1xuICAgICAgY2FzZSAnbG93JzpcbiAgICAgICAgc3RyICs9ICc7IFByaW9yaXR5PUxvdydcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ21lZGl1bSc6XG4gICAgICAgIHN0ciArPSAnOyBQcmlvcml0eT1NZWRpdW0nXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdoaWdoJzpcbiAgICAgICAgc3RyICs9ICc7IFByaW9yaXR5PUhpZ2gnXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gcHJpb3JpdHkgaXMgaW52YWxpZCcpXG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdC5zYW1lU2l0ZSkge1xuICAgIHZhciBzYW1lU2l0ZSA9IHR5cGVvZiBvcHQuc2FtZVNpdGUgPT09ICdzdHJpbmcnXG4gICAgICA/IG9wdC5zYW1lU2l0ZS50b0xvd2VyQ2FzZSgpIDogb3B0LnNhbWVTaXRlO1xuXG4gICAgc3dpdGNoIChzYW1lU2l0ZSkge1xuICAgICAgY2FzZSB0cnVlOlxuICAgICAgICBzdHIgKz0gJzsgU2FtZVNpdGU9U3RyaWN0JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsYXgnOlxuICAgICAgICBzdHIgKz0gJzsgU2FtZVNpdGU9TGF4JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdHJpY3QnOlxuICAgICAgICBzdHIgKz0gJzsgU2FtZVNpdGU9U3RyaWN0JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdub25lJzpcbiAgICAgICAgc3RyICs9ICc7IFNhbWVTaXRlPU5vbmUnO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBzYW1lU2l0ZSBpcyBpbnZhbGlkJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0cjtcbn1cblxuLyoqXG4gKiBVUkwtZGVjb2RlIHN0cmluZyB2YWx1ZS4gT3B0aW1pemVkIHRvIHNraXAgbmF0aXZlIGNhbGwgd2hlbiBubyAlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gZGVjb2RlIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5pbmRleE9mKCclJykgIT09IC0xXG4gICAgPyBkZWNvZGVVUklDb21wb25lbnQoc3RyKVxuICAgIDogc3RyXG59XG5cbi8qKlxuICogVVJMLWVuY29kZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGVuY29kZSAodmFsKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsKVxufVxuXG4vKipcbiAqIERldGVybWluZSBpZiB2YWx1ZSBpcyBhIERhdGUuXG4gKlxuICogQHBhcmFtIHsqfSB2YWxcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNEYXRlICh2YWwpIHtcbiAgcmV0dXJuIF9fdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBEYXRlXScgfHxcbiAgICB2YWwgaW5zdGFuY2VvZiBEYXRlXG59XG5cbi8qKlxuICogVHJ5IGRlY29kaW5nIGEgc3RyaW5nIHVzaW5nIGEgZGVjb2RpbmcgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHBhcmFtIHtmdW5jdGlvbn0gZGVjb2RlXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHRyeURlY29kZShzdHIsIGRlY29kZSkge1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGUoc3RyKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cbiIsIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcImxheW91dC1iYXNlXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtcImxheW91dC1iYXNlXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImNvc2VCYXNlXCJdID0gZmFjdG9yeShyZXF1aXJlKFwibGF5b3V0LWJhc2VcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcImNvc2VCYXNlXCJdID0gZmFjdG9yeShyb290W1wibGF5b3V0QmFzZVwiXSk7XG59KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX181NTFfXykge1xucmV0dXJuIC8qKioqKiovICgoKSA9PiB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0XCJ1c2Ugc3RyaWN0XCI7XG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlc19fID0gKHtcblxuLyoqKi8gNDU6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG52YXIgY29zZUJhc2UgPSB7fTtcblxuY29zZUJhc2UubGF5b3V0QmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKTtcbmNvc2VCYXNlLkNvU0VDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgwNik7XG5jb3NlQmFzZS5Db1NFRWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzY3KTtcbmNvc2VCYXNlLkNvU0VHcmFwaCA9IF9fd2VicGFja19yZXF1aXJlX18oODgwKTtcbmNvc2VCYXNlLkNvU0VHcmFwaE1hbmFnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU3OCk7XG5jb3NlQmFzZS5Db1NFTGF5b3V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NjUpO1xuY29zZUJhc2UuQ29TRU5vZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk5MSk7XG5jb3NlQmFzZS5Db25zdHJhaW50SGFuZGxlciA9IF9fd2VicGFja19yZXF1aXJlX18oOTAyKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb3NlQmFzZTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDgwNjpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBGRExheW91dENvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5GRExheW91dENvbnN0YW50cztcblxuZnVuY3Rpb24gQ29TRUNvbnN0YW50cygpIHt9XG5cbi8vQ29TRUNvbnN0YW50cyBpbmhlcml0cyBzdGF0aWMgcHJvcHMgaW4gRkRMYXlvdXRDb25zdGFudHNcbmZvciAodmFyIHByb3AgaW4gRkRMYXlvdXRDb25zdGFudHMpIHtcbiAgQ29TRUNvbnN0YW50c1twcm9wXSA9IEZETGF5b3V0Q29uc3RhbnRzW3Byb3BdO1xufVxuXG5Db1NFQ29uc3RhbnRzLkRFRkFVTFRfVVNFX01VTFRJX0xFVkVMX1NDQUxJTkcgPSBmYWxzZTtcbkNvU0VDb25zdGFudHMuREVGQVVMVF9SQURJQUxfU0VQQVJBVElPTiA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEg7XG5Db1NFQ29uc3RhbnRzLkRFRkFVTFRfQ09NUE9ORU5UX1NFUEVSQVRJT04gPSA2MDtcbkNvU0VDb25zdGFudHMuVElMRSA9IHRydWU7XG5Db1NFQ29uc3RhbnRzLlRJTElOR19QQURESU5HX1ZFUlRJQ0FMID0gMTA7XG5Db1NFQ29uc3RhbnRzLlRJTElOR19QQURESU5HX0hPUklaT05UQUwgPSAxMDtcbkNvU0VDb25zdGFudHMuVFJBTlNGT1JNX09OX0NPTlNUUkFJTlRfSEFORExJTkcgPSB0cnVlO1xuQ29TRUNvbnN0YW50cy5FTkZPUkNFX0NPTlNUUkFJTlRTID0gdHJ1ZTtcbkNvU0VDb25zdGFudHMuQVBQTFlfTEFZT1VUID0gdHJ1ZTtcbkNvU0VDb25zdGFudHMuUkVMQVhfTU9WRU1FTlRfT05fQ09OU1RSQUlOVFMgPSB0cnVlO1xuQ29TRUNvbnN0YW50cy5UUkVFX1JFRFVDVElPTl9PTl9JTkNSRU1FTlRBTCA9IHRydWU7IC8vIHRoaXMgc2hvdWxkIGJlIHNldCB0byBmYWxzZSBpZiB0aGVyZSB3aWxsIGJlIGEgY29uc3RyYWludFxuLy8gVGhpcyBjb25zdGFudCBpcyBmb3IgZGlmZmVyZW50aWF0aW5nIHdoZXRoZXIgYWN0dWFsIGxheW91dCBhbGdvcml0aG0gdGhhdCB1c2VzIGNvc2UtYmFzZSB3YW50cyB0byBhcHBseSBvbmx5IGluY3JlbWVudGFsIGxheW91dCBvciBcbi8vIGFuIGluY3JlbWVudGFsIGxheW91dCBvbiB0b3Agb2YgYSByYW5kb21pemVkIGxheW91dC4gSWYgaXQgaXMgb25seSBpbmNyZW1lbnRhbCBsYXlvdXQsIHRoZW4gdGhpcyBjb25zdGFudCBzaG91bGQgYmUgdHJ1ZS5cbkNvU0VDb25zdGFudHMuUFVSRV9JTkNSRU1FTlRBTCA9IENvU0VDb25zdGFudHMuREVGQVVMVF9JTkNSRU1FTlRBTDtcblxubW9kdWxlLmV4cG9ydHMgPSBDb1NFQ29uc3RhbnRzO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNzY3OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIEZETGF5b3V0RWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5GRExheW91dEVkZ2U7XG5cbmZ1bmN0aW9uIENvU0VFZGdlKHNvdXJjZSwgdGFyZ2V0LCB2RWRnZSkge1xuICBGRExheW91dEVkZ2UuY2FsbCh0aGlzLCBzb3VyY2UsIHRhcmdldCwgdkVkZ2UpO1xufVxuXG5Db1NFRWRnZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEZETGF5b3V0RWRnZS5wcm90b3R5cGUpO1xuZm9yICh2YXIgcHJvcCBpbiBGRExheW91dEVkZ2UpIHtcbiAgQ29TRUVkZ2VbcHJvcF0gPSBGRExheW91dEVkZ2VbcHJvcF07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29TRUVkZ2U7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4ODA6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG52YXIgTEdyYXBoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkxHcmFwaDtcblxuZnVuY3Rpb24gQ29TRUdyYXBoKHBhcmVudCwgZ3JhcGhNZ3IsIHZHcmFwaCkge1xuICBMR3JhcGguY2FsbCh0aGlzLCBwYXJlbnQsIGdyYXBoTWdyLCB2R3JhcGgpO1xufVxuXG5Db1NFR3JhcGgucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMR3JhcGgucHJvdG90eXBlKTtcbmZvciAodmFyIHByb3AgaW4gTEdyYXBoKSB7XG4gIENvU0VHcmFwaFtwcm9wXSA9IExHcmFwaFtwcm9wXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDb1NFR3JhcGg7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA1Nzg6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG52YXIgTEdyYXBoTWFuYWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5MR3JhcGhNYW5hZ2VyO1xuXG5mdW5jdGlvbiBDb1NFR3JhcGhNYW5hZ2VyKGxheW91dCkge1xuICBMR3JhcGhNYW5hZ2VyLmNhbGwodGhpcywgbGF5b3V0KTtcbn1cblxuQ29TRUdyYXBoTWFuYWdlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKExHcmFwaE1hbmFnZXIucHJvdG90eXBlKTtcbmZvciAodmFyIHByb3AgaW4gTEdyYXBoTWFuYWdlcikge1xuICBDb1NFR3JhcGhNYW5hZ2VyW3Byb3BdID0gTEdyYXBoTWFuYWdlcltwcm9wXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDb1NFR3JhcGhNYW5hZ2VyO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNzY1OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIEZETGF5b3V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkZETGF5b3V0O1xudmFyIENvU0VHcmFwaE1hbmFnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU3OCk7XG52YXIgQ29TRUdyYXBoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4ODApO1xudmFyIENvU0VOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5OTEpO1xudmFyIENvU0VFZGdlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NjcpO1xudmFyIENvU0VDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgwNik7XG52YXIgQ29uc3RyYWludEhhbmRsZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkwMik7XG52YXIgRkRMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuRkRMYXlvdXRDb25zdGFudHM7XG52YXIgTGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkxheW91dENvbnN0YW50cztcbnZhciBQb2ludCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5Qb2ludDtcbnZhciBQb2ludEQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuUG9pbnREO1xudmFyIERpbWVuc2lvbkQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuRGltZW5zaW9uRDtcbnZhciBMYXlvdXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuTGF5b3V0O1xudmFyIEludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuSW50ZWdlcjtcbnZhciBJR2VvbWV0cnkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuSUdlb21ldHJ5O1xudmFyIExHcmFwaCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5MR3JhcGg7XG52YXIgVHJhbnNmb3JtID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLlRyYW5zZm9ybTtcbnZhciBMaW5rZWRMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkxpbmtlZExpc3Q7XG5cbmZ1bmN0aW9uIENvU0VMYXlvdXQoKSB7XG4gIEZETGF5b3V0LmNhbGwodGhpcyk7XG5cbiAgdGhpcy50b0JlVGlsZWQgPSB7fTsgLy8gTWVtb3JpemUgaWYgYSBub2RlIGlzIHRvIGJlIHRpbGVkIG9yIGlzIHRpbGVkXG4gIHRoaXMuY29uc3RyYWludHMgPSB7fTsgLy8ga2VlcCBsYXlvdXQgY29uc3RyYWludHNcbn1cblxuQ29TRUxheW91dC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEZETGF5b3V0LnByb3RvdHlwZSk7XG5cbmZvciAodmFyIHByb3AgaW4gRkRMYXlvdXQpIHtcbiAgQ29TRUxheW91dFtwcm9wXSA9IEZETGF5b3V0W3Byb3BdO1xufVxuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5uZXdHcmFwaE1hbmFnZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBnbSA9IG5ldyBDb1NFR3JhcGhNYW5hZ2VyKHRoaXMpO1xuICB0aGlzLmdyYXBoTWFuYWdlciA9IGdtO1xuICByZXR1cm4gZ207XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5uZXdHcmFwaCA9IGZ1bmN0aW9uICh2R3JhcGgpIHtcbiAgcmV0dXJuIG5ldyBDb1NFR3JhcGgobnVsbCwgdGhpcy5ncmFwaE1hbmFnZXIsIHZHcmFwaCk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5uZXdOb2RlID0gZnVuY3Rpb24gKHZOb2RlKSB7XG4gIHJldHVybiBuZXcgQ29TRU5vZGUodGhpcy5ncmFwaE1hbmFnZXIsIHZOb2RlKTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLm5ld0VkZ2UgPSBmdW5jdGlvbiAodkVkZ2UpIHtcbiAgcmV0dXJuIG5ldyBDb1NFRWRnZShudWxsLCBudWxsLCB2RWRnZSk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5pbml0UGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHtcbiAgRkRMYXlvdXQucHJvdG90eXBlLmluaXRQYXJhbWV0ZXJzLmNhbGwodGhpcywgYXJndW1lbnRzKTtcbiAgaWYgKCF0aGlzLmlzU3ViTGF5b3V0KSB7XG4gICAgaWYgKENvU0VDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCA8IDEwKSB7XG4gICAgICB0aGlzLmlkZWFsRWRnZUxlbmd0aCA9IDEwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlkZWFsRWRnZUxlbmd0aCA9IENvU0VDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSDtcbiAgICB9XG5cbiAgICB0aGlzLnVzZVNtYXJ0SWRlYWxFZGdlTGVuZ3RoQ2FsY3VsYXRpb24gPSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfVVNFX1NNQVJUX0lERUFMX0VER0VfTEVOR1RIX0NBTENVTEFUSU9OO1xuICAgIHRoaXMuZ3Jhdml0eUNvbnN0YW50ID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1NUUkVOR1RIO1xuICAgIHRoaXMuY29tcG91bmRHcmF2aXR5Q29uc3RhbnQgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfU1RSRU5HVEg7XG4gICAgdGhpcy5ncmF2aXR5UmFuZ2VGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0dSQVZJVFlfUkFOR0VfRkFDVE9SO1xuICAgIHRoaXMuY29tcG91bmRHcmF2aXR5UmFuZ2VGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfUkFOR0VfRkFDVE9SO1xuXG4gICAgLy8gdmFyaWFibGVzIGZvciB0cmVlIHJlZHVjdGlvbiBzdXBwb3J0XG4gICAgdGhpcy5wcnVuZWROb2Rlc0FsbCA9IFtdO1xuICAgIHRoaXMuZ3Jvd1RyZWVJdGVyYXRpb25zID0gMDtcbiAgICB0aGlzLmFmdGVyR3Jvd3RoSXRlcmF0aW9ucyA9IDA7XG4gICAgdGhpcy5pc1RyZWVHcm93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5pc0dyb3d0aEZpbmlzaGVkID0gZmFsc2U7XG4gIH1cbn07XG5cbi8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IENvU0UgcmVsYXRlZCBwYXJhbWV0ZXJzIHVzZWQgYnkgc3ByaW5nIGVtYmVkZGVyLlxuQ29TRUxheW91dC5wcm90b3R5cGUuaW5pdFNwcmluZ0VtYmVkZGVyID0gZnVuY3Rpb24gKCkge1xuICBGRExheW91dC5wcm90b3R5cGUuaW5pdFNwcmluZ0VtYmVkZGVyLmNhbGwodGhpcyk7XG5cbiAgLy8gdmFyaWFibGVzIGZvciBjb29saW5nXG4gIHRoaXMuY29vbGluZ0N5Y2xlID0gMDtcbiAgdGhpcy5tYXhDb29saW5nQ3ljbGUgPSB0aGlzLm1heEl0ZXJhdGlvbnMgLyBGRExheW91dENvbnN0YW50cy5DT05WRVJHRU5DRV9DSEVDS19QRVJJT0Q7XG4gIHRoaXMuZmluYWxUZW1wZXJhdHVyZSA9IDAuMDQ7XG4gIHRoaXMuY29vbGluZ0FkanVzdGVyID0gMTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmxheW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNyZWF0ZUJlbmRzQXNOZWVkZWQgPSBMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DUkVBVEVfQkVORFNfQVNfTkVFREVEO1xuICBpZiAoY3JlYXRlQmVuZHNBc05lZWRlZCkge1xuICAgIHRoaXMuY3JlYXRlQmVuZHBvaW50cygpO1xuICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsRWRnZXMoKTtcbiAgfVxuXG4gIHRoaXMubGV2ZWwgPSAwO1xuICByZXR1cm4gdGhpcy5jbGFzc2ljTGF5b3V0KCk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5jbGFzc2ljTGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLm5vZGVzV2l0aEdyYXZpdHkgPSB0aGlzLmNhbGN1bGF0ZU5vZGVzVG9BcHBseUdyYXZpdGF0aW9uVG8oKTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIuc2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24odGhpcy5ub2Rlc1dpdGhHcmF2aXR5KTtcbiAgdGhpcy5jYWxjTm9PZkNoaWxkcmVuRm9yQWxsTm9kZXMoKTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIuY2FsY0xvd2VzdENvbW1vbkFuY2VzdG9ycygpO1xuICB0aGlzLmdyYXBoTWFuYWdlci5jYWxjSW5jbHVzaW9uVHJlZURlcHRocygpO1xuICB0aGlzLmdyYXBoTWFuYWdlci5nZXRSb290KCkuY2FsY0VzdGltYXRlZFNpemUoKTtcbiAgdGhpcy5jYWxjSWRlYWxFZGdlTGVuZ3RocygpO1xuXG4gIGlmICghdGhpcy5pbmNyZW1lbnRhbCkge1xuICAgIHZhciBmb3Jlc3QgPSB0aGlzLmdldEZsYXRGb3Jlc3QoKTtcblxuICAgIC8vIFRoZSBncmFwaCBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYXlvdXQgaXMgZmxhdCBhbmQgYSBmb3Jlc3RcbiAgICBpZiAoZm9yZXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMucG9zaXRpb25Ob2Rlc1JhZGlhbGx5KGZvcmVzdCk7XG4gICAgfVxuICAgIC8vIFRoZSBncmFwaCBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYXlvdXQgaXMgbm90IGZsYXQgb3IgYSBmb3Jlc3RcbiAgICBlbHNlIHtcbiAgICAgICAgLy8gUmVkdWNlIHRoZSB0cmVlcyB3aGVuIGluY3JlbWVudGFsIG1vZGUgaXMgbm90IGVuYWJsZWQgYW5kIGdyYXBoIGlzIG5vdCBhIGZvcmVzdCBcbiAgICAgICAgdGhpcy5yZWR1Y2VUcmVlcygpO1xuICAgICAgICAvLyBVcGRhdGUgbm9kZXMgdGhhdCBncmF2aXR5IHdpbGwgYmUgYXBwbGllZFxuICAgICAgICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKCk7XG4gICAgICAgIHZhciBhbGxOb2RlcyA9IG5ldyBTZXQodGhpcy5nZXRBbGxOb2RlcygpKTtcbiAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IHRoaXMubm9kZXNXaXRoR3Jhdml0eS5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICByZXR1cm4gYWxsTm9kZXMuaGFzKHgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ncmFwaE1hbmFnZXIuc2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24oaW50ZXJzZWN0aW9uKTtcblxuICAgICAgICB0aGlzLnBvc2l0aW9uTm9kZXNSYW5kb21seSgpO1xuICAgICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChDb1NFQ29uc3RhbnRzLlRSRUVfUkVEVUNUSU9OX09OX0lOQ1JFTUVOVEFMKSB7XG4gICAgICAvLyBSZWR1Y2UgdGhlIHRyZWVzIGluIGluY3JlbWVudGFsIG1vZGUgaWYgb25seSB0aGlzIGNvbnN0YW50IGlzIHNldCB0byB0cnVlIFxuICAgICAgdGhpcy5yZWR1Y2VUcmVlcygpO1xuICAgICAgLy8gVXBkYXRlIG5vZGVzIHRoYXQgZ3Jhdml0eSB3aWxsIGJlIGFwcGxpZWRcbiAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24oKTtcbiAgICAgIHZhciBhbGxOb2RlcyA9IG5ldyBTZXQodGhpcy5nZXRBbGxOb2RlcygpKTtcbiAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSB0aGlzLm5vZGVzV2l0aEdyYXZpdHkuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiBhbGxOb2Rlcy5oYXMoeCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKGludGVyc2VjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKHRoaXMuY29uc3RyYWludHMpLmxlbmd0aCA+IDApIHtcbiAgICBDb25zdHJhaW50SGFuZGxlci5oYW5kbGVDb25zdHJhaW50cyh0aGlzKTtcbiAgICB0aGlzLmluaXRDb25zdHJhaW50VmFyaWFibGVzKCk7XG4gIH1cblxuICB0aGlzLmluaXRTcHJpbmdFbWJlZGRlcigpO1xuICBpZiAoQ29TRUNvbnN0YW50cy5BUFBMWV9MQVlPVVQpIHtcbiAgICB0aGlzLnJ1blNwcmluZ0VtYmVkZGVyKCk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnRpY2sgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMudG90YWxJdGVyYXRpb25zKys7XG5cbiAgaWYgKHRoaXMudG90YWxJdGVyYXRpb25zID09PSB0aGlzLm1heEl0ZXJhdGlvbnMgJiYgIXRoaXMuaXNUcmVlR3Jvd2luZyAmJiAhdGhpcy5pc0dyb3d0aEZpbmlzaGVkKSB7XG4gICAgaWYgKHRoaXMucHJ1bmVkTm9kZXNBbGwubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5pc1RyZWVHcm93aW5nID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMudG90YWxJdGVyYXRpb25zICUgRkRMYXlvdXRDb25zdGFudHMuQ09OVkVSR0VOQ0VfQ0hFQ0tfUEVSSU9EID09IDAgJiYgIXRoaXMuaXNUcmVlR3Jvd2luZyAmJiAhdGhpcy5pc0dyb3d0aEZpbmlzaGVkKSB7XG4gICAgaWYgKHRoaXMuaXNDb252ZXJnZWQoKSkge1xuICAgICAgaWYgKHRoaXMucHJ1bmVkTm9kZXNBbGwubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmlzVHJlZUdyb3dpbmcgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jb29saW5nQ3ljbGUrKztcblxuICAgIGlmICh0aGlzLmxheW91dFF1YWxpdHkgPT0gMCkge1xuICAgICAgLy8gcXVhbGl0eSAtIFwiZHJhZnRcIlxuICAgICAgdGhpcy5jb29saW5nQWRqdXN0ZXIgPSB0aGlzLmNvb2xpbmdDeWNsZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubGF5b3V0UXVhbGl0eSA9PSAxKSB7XG4gICAgICAvLyBxdWFsaXR5IC0gXCJkZWZhdWx0XCJcbiAgICAgIHRoaXMuY29vbGluZ0FkanVzdGVyID0gdGhpcy5jb29saW5nQ3ljbGUgLyAzO1xuICAgIH1cblxuICAgIC8vIGNvb2xpbmcgc2NoZWR1bGUgaXMgYmFzZWQgb24gaHR0cDovL3d3dy5idGx1a2UuY29tL3NpbWFuZjEuaHRtbCAtPiBjb29saW5nIHNjaGVkdWxlIDNcbiAgICB0aGlzLmNvb2xpbmdGYWN0b3IgPSBNYXRoLm1heCh0aGlzLmluaXRpYWxDb29saW5nRmFjdG9yIC0gTWF0aC5wb3codGhpcy5jb29saW5nQ3ljbGUsIE1hdGgubG9nKDEwMCAqICh0aGlzLmluaXRpYWxDb29saW5nRmFjdG9yIC0gdGhpcy5maW5hbFRlbXBlcmF0dXJlKSkgLyBNYXRoLmxvZyh0aGlzLm1heENvb2xpbmdDeWNsZSkpIC8gMTAwICogdGhpcy5jb29saW5nQWRqdXN0ZXIsIHRoaXMuZmluYWxUZW1wZXJhdHVyZSk7XG4gICAgdGhpcy5hbmltYXRpb25QZXJpb2QgPSBNYXRoLmNlaWwodGhpcy5pbml0aWFsQW5pbWF0aW9uUGVyaW9kICogTWF0aC5zcXJ0KHRoaXMuY29vbGluZ0ZhY3RvcikpO1xuICB9XG4gIC8vIE9wZXJhdGlvbnMgd2hpbGUgdHJlZSBpcyBncm93aW5nIGFnYWluIFxuICBpZiAodGhpcy5pc1RyZWVHcm93aW5nKSB7XG4gICAgaWYgKHRoaXMuZ3Jvd1RyZWVJdGVyYXRpb25zICUgMTAgPT0gMCkge1xuICAgICAgaWYgKHRoaXMucHJ1bmVkTm9kZXNBbGwubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmdyYXBoTWFuYWdlci51cGRhdGVCb3VuZHMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVHcmlkKCk7XG4gICAgICAgIHRoaXMuZ3Jvd1RyZWUodGhpcy5wcnVuZWROb2Rlc0FsbCk7XG4gICAgICAgIC8vIFVwZGF0ZSBub2RlcyB0aGF0IGdyYXZpdHkgd2lsbCBiZSBhcHBsaWVkXG4gICAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24oKTtcbiAgICAgICAgdmFyIGFsbE5vZGVzID0gbmV3IFNldCh0aGlzLmdldEFsbE5vZGVzKCkpO1xuICAgICAgICB2YXIgaW50ZXJzZWN0aW9uID0gdGhpcy5ub2Rlc1dpdGhHcmF2aXR5LmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICAgIHJldHVybiBhbGxOb2Rlcy5oYXMoeCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmdyYXBoTWFuYWdlci5zZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbihpbnRlcnNlY3Rpb24pO1xuXG4gICAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnVwZGF0ZUJvdW5kcygpO1xuICAgICAgICB0aGlzLnVwZGF0ZUdyaWQoKTtcbiAgICAgICAgaWYgKENvU0VDb25zdGFudHMuUFVSRV9JTkNSRU1FTlRBTCkgdGhpcy5jb29saW5nRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCAvIDI7ZWxzZSB0aGlzLmNvb2xpbmdGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pc1RyZWVHcm93aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNHcm93dGhGaW5pc2hlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZ3Jvd1RyZWVJdGVyYXRpb25zKys7XG4gIH1cbiAgLy8gT3BlcmF0aW9ucyBhZnRlciBncm93dGggaXMgZmluaXNoZWRcbiAgaWYgKHRoaXMuaXNHcm93dGhGaW5pc2hlZCkge1xuICAgIGlmICh0aGlzLmlzQ29udmVyZ2VkKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5hZnRlckdyb3d0aEl0ZXJhdGlvbnMgJSAxMCA9PSAwKSB7XG4gICAgICB0aGlzLmdyYXBoTWFuYWdlci51cGRhdGVCb3VuZHMoKTtcbiAgICAgIHRoaXMudXBkYXRlR3JpZCgpO1xuICAgIH1cbiAgICBpZiAoQ29TRUNvbnN0YW50cy5QVVJFX0lOQ1JFTUVOVEFMKSB0aGlzLmNvb2xpbmdGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMIC8gMiAqICgoMTAwIC0gdGhpcy5hZnRlckdyb3d0aEl0ZXJhdGlvbnMpIC8gMTAwKTtlbHNlIHRoaXMuY29vbGluZ0ZhY3RvciA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09PTElOR19GQUNUT1JfSU5DUkVNRU5UQUwgKiAoKDEwMCAtIHRoaXMuYWZ0ZXJHcm93dGhJdGVyYXRpb25zKSAvIDEwMCk7XG4gICAgdGhpcy5hZnRlckdyb3d0aEl0ZXJhdGlvbnMrKztcbiAgfVxuXG4gIHZhciBncmlkVXBkYXRlQWxsb3dlZCA9ICF0aGlzLmlzVHJlZUdyb3dpbmcgJiYgIXRoaXMuaXNHcm93dGhGaW5pc2hlZDtcbiAgdmFyIGZvcmNlVG9Ob2RlU3Vycm91bmRpbmdVcGRhdGUgPSB0aGlzLmdyb3dUcmVlSXRlcmF0aW9ucyAlIDEwID09IDEgJiYgdGhpcy5pc1RyZWVHcm93aW5nIHx8IHRoaXMuYWZ0ZXJHcm93dGhJdGVyYXRpb25zICUgMTAgPT0gMSAmJiB0aGlzLmlzR3Jvd3RoRmluaXNoZWQ7XG5cbiAgdGhpcy50b3RhbERpc3BsYWNlbWVudCA9IDA7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLnVwZGF0ZUJvdW5kcygpO1xuICB0aGlzLmNhbGNTcHJpbmdGb3JjZXMoKTtcbiAgdGhpcy5jYWxjUmVwdWxzaW9uRm9yY2VzKGdyaWRVcGRhdGVBbGxvd2VkLCBmb3JjZVRvTm9kZVN1cnJvdW5kaW5nVXBkYXRlKTtcbiAgdGhpcy5jYWxjR3Jhdml0YXRpb25hbEZvcmNlcygpO1xuICB0aGlzLm1vdmVOb2RlcygpO1xuICB0aGlzLmFuaW1hdGUoKTtcblxuICByZXR1cm4gZmFsc2U7IC8vIExheW91dCBpcyBub3QgZW5kZWQgeWV0IHJldHVybiBmYWxzZVxufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuZ2V0UG9zaXRpb25zRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsTm9kZXMoKTtcbiAgdmFyIHBEYXRhID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmVjdCA9IGFsbE5vZGVzW2ldLnJlY3Q7XG4gICAgdmFyIGlkID0gYWxsTm9kZXNbaV0uaWQ7XG4gICAgcERhdGFbaWRdID0ge1xuICAgICAgaWQ6IGlkLFxuICAgICAgeDogcmVjdC5nZXRDZW50ZXJYKCksXG4gICAgICB5OiByZWN0LmdldENlbnRlclkoKSxcbiAgICAgIHc6IHJlY3Qud2lkdGgsXG4gICAgICBoOiByZWN0LmhlaWdodFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gcERhdGE7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5ydW5TcHJpbmdFbWJlZGRlciA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5pbml0aWFsQW5pbWF0aW9uUGVyaW9kID0gMjU7XG4gIHRoaXMuYW5pbWF0aW9uUGVyaW9kID0gdGhpcy5pbml0aWFsQW5pbWF0aW9uUGVyaW9kO1xuICB2YXIgbGF5b3V0RW5kZWQgPSBmYWxzZTtcblxuICAvLyBJZiBhbWluYXRlIG9wdGlvbiBpcyAnZHVyaW5nJyBzaWduYWwgdGhhdCBsYXlvdXQgaXMgc3VwcG9zZWQgdG8gc3RhcnQgaXRlcmF0aW5nXG4gIGlmIChGRExheW91dENvbnN0YW50cy5BTklNQVRFID09PSAnZHVyaW5nJykge1xuICAgIHRoaXMuZW1pdCgnbGF5b3V0c3RhcnRlZCcpO1xuICB9IGVsc2Uge1xuICAgIC8vIElmIGFtaW5hdGUgb3B0aW9uIGlzICdkdXJpbmcnIHRpY2soKSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBvbiBpbmRleC5qc1xuICAgIHdoaWxlICghbGF5b3V0RW5kZWQpIHtcbiAgICAgIGxheW91dEVuZGVkID0gdGhpcy50aWNrKCk7XG4gICAgfVxuXG4gICAgdGhpcy5ncmFwaE1hbmFnZXIudXBkYXRlQm91bmRzKCk7XG4gIH1cbn07XG5cbi8vIG92ZXJyaWRlcyBtb3ZlTm9kZXMgbWV0aG9kIGluIEZETGF5b3V0XG5Db1NFTGF5b3V0LnByb3RvdHlwZS5tb3ZlTm9kZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsTm9kZXMgPSB0aGlzLmdldEFsbE5vZGVzKCk7XG4gIHZhciBub2RlO1xuXG4gIC8vIGNhbGN1bGF0ZSBkaXNwbGFjZW1lbnQgZm9yIGVhY2ggbm9kZSBcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBub2RlID0gbE5vZGVzW2ldO1xuICAgIG5vZGUuY2FsY3VsYXRlRGlzcGxhY2VtZW50KCk7XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXModGhpcy5jb25zdHJhaW50cykubGVuZ3RoID4gMCkge1xuICAgIHRoaXMudXBkYXRlRGlzcGxhY2VtZW50cygpO1xuICB9XG5cbiAgLy8gbW92ZSBlYWNoIG5vZGVcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBub2RlID0gbE5vZGVzW2ldO1xuICAgIG5vZGUubW92ZSgpO1xuICB9XG59O1xuXG4vLyBjb25zdHJhaW50IHJlbGF0ZWQgbWV0aG9kczogaW5pdENvbnN0cmFpbnRWYXJpYWJsZXMgYW5kIHVwZGF0ZURpc3BsYWNlbWVudHNcblxuLy8gaW5pdGlhbGl6ZSBjb25zdHJhaW50IHJlbGF0ZWQgdmFyaWFibGVzXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5pbml0Q29uc3RyYWludFZhcmlhYmxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLmlkVG9Ob2RlTWFwID0gbmV3IE1hcCgpO1xuICB0aGlzLmZpeGVkTm9kZVNldCA9IG5ldyBTZXQoKTtcblxuICB2YXIgYWxsTm9kZXMgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxOb2RlcygpO1xuXG4gIC8vIGZpbGwgaWRUb05vZGVNYXBcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gYWxsTm9kZXNbaV07XG4gICAgdGhpcy5pZFRvTm9kZU1hcC5zZXQobm9kZS5pZCwgbm9kZSk7XG4gIH1cblxuICAvLyBjYWxjdWxhdGUgZml4ZWQgbm9kZSB3ZWlnaHQgZm9yIGdpdmVuIGNvbXBvdW5kIG5vZGVcbiAgdmFyIGNhbGN1bGF0ZUNvbXBvdW5kV2VpZ2h0ID0gZnVuY3Rpb24gY2FsY3VsYXRlQ29tcG91bmRXZWlnaHQoY29tcG91bmROb2RlKSB7XG4gICAgdmFyIG5vZGVzID0gY29tcG91bmROb2RlLmdldENoaWxkKCkuZ2V0Tm9kZXMoKTtcbiAgICB2YXIgbm9kZTtcbiAgICB2YXIgZml4ZWROb2RlV2VpZ2h0ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBub2RlID0gbm9kZXNbaV07XG4gICAgICBpZiAobm9kZS5nZXRDaGlsZCgpID09IG51bGwpIHtcbiAgICAgICAgaWYgKHNlbGYuZml4ZWROb2RlU2V0Lmhhcyhub2RlLmlkKSkge1xuICAgICAgICAgIGZpeGVkTm9kZVdlaWdodCArPSAxMDA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpeGVkTm9kZVdlaWdodCArPSBjYWxjdWxhdGVDb21wb3VuZFdlaWdodChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpeGVkTm9kZVdlaWdodDtcbiAgfTtcblxuICBpZiAodGhpcy5jb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50KSB7XG4gICAgLy8gZmlsbCBmaXhlZE5vZGVTZXRcbiAgICB0aGlzLmNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZURhdGEpIHtcbiAgICAgIHNlbGYuZml4ZWROb2RlU2V0LmFkZChub2RlRGF0YS5ub2RlSWQpO1xuICAgIH0pO1xuXG4gICAgLy8gYXNzaWduIGZpeGVkIG5vZGUgd2VpZ2h0cyB0byBjb21wb3VuZHMgaWYgdGhleSBjb250YWluIGZpeGVkIG5vZGVzXG4gICAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsTm9kZXMoKTtcbiAgICB2YXIgbm9kZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5vZGUgPSBhbGxOb2Rlc1tpXTtcbiAgICAgIGlmIChub2RlLmdldENoaWxkKCkgIT0gbnVsbCkge1xuICAgICAgICB2YXIgZml4ZWROb2RlV2VpZ2h0ID0gY2FsY3VsYXRlQ29tcG91bmRXZWlnaHQobm9kZSk7XG4gICAgICAgIGlmIChmaXhlZE5vZGVXZWlnaHQgPiAwKSB7XG4gICAgICAgICAgbm9kZS5maXhlZE5vZGVXZWlnaHQgPSBmaXhlZE5vZGVXZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5jb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcbiAgICB2YXIgbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICB2YXIgbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmZpeGVkTm9kZXNPbkhvcml6b250YWwgPSBuZXcgU2V0KCk7XG4gICAgdGhpcy5maXhlZE5vZGVzT25WZXJ0aWNhbCA9IG5ldyBTZXQoKTtcblxuICAgIC8vIGZpbGwgbWFwcyBhbmQgc2V0c1xuICAgIHRoaXMuZml4ZWROb2RlU2V0LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgc2VsZi5maXhlZE5vZGVzT25Ib3Jpem9udGFsLmFkZChub2RlSWQpO1xuICAgICAgc2VsZi5maXhlZE5vZGVzT25WZXJ0aWNhbC5hZGQobm9kZUlkKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQpIHtcbiAgICAgIGlmICh0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWwpIHtcbiAgICAgICAgdmFyIHZlcnRpY2FsQWxpZ25tZW50ID0gdGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZlcnRpY2FsQWxpZ25tZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LnNldChcImR1bW15XCIgKyBpLCBbXSk7XG4gICAgICAgICAgdmVydGljYWxBbGlnbm1lbnRbaV0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LnNldChub2RlSWQsIFwiZHVtbXlcIiArIGkpO1xuICAgICAgICAgICAgc2VsZi5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChcImR1bW15XCIgKyBpKS5wdXNoKG5vZGVJZCk7XG4gICAgICAgICAgICBpZiAoc2VsZi5maXhlZE5vZGVTZXQuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgICAgc2VsZi5maXhlZE5vZGVzT25Ib3Jpem9udGFsLmFkZChcImR1bW15XCIgKyBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsKSB7XG4gICAgICAgIHZhciBob3Jpem9udGFsQWxpZ25tZW50ID0gdGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWw7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaG9yaXpvbnRhbEFsaWdubWVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHRoaXMuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LnNldChcImR1bW15XCIgKyBpLCBbXSk7XG4gICAgICAgICAgaG9yaXpvbnRhbEFsaWdubWVudFtpXS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5zZXQobm9kZUlkLCBcImR1bW15XCIgKyBpKTtcbiAgICAgICAgICAgIHNlbGYuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChcImR1bW15XCIgKyBpKS5wdXNoKG5vZGVJZCk7XG4gICAgICAgICAgICBpZiAoc2VsZi5maXhlZE5vZGVTZXQuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgICAgc2VsZi5maXhlZE5vZGVzT25WZXJ0aWNhbC5hZGQoXCJkdW1teVwiICsgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQ29TRUNvbnN0YW50cy5SRUxBWF9NT1ZFTUVOVF9PTl9DT05TVFJBSU5UUykge1xuXG4gICAgICB0aGlzLnNodWZmbGUgPSBmdW5jdGlvbiAoYXJyYXkpIHtcbiAgICAgICAgdmFyIGosIHgsIGk7XG4gICAgICAgIGZvciAoaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPj0gMiAqIGFycmF5Lmxlbmd0aCAvIDM7IGktLSkge1xuICAgICAgICAgIGogPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaSArIDEpKTtcbiAgICAgICAgICB4ID0gYXJyYXlbaV07XG4gICAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgICAgICAgICBhcnJheVtqXSA9IHg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgfTtcblxuICAgICAgdGhpcy5ub2Rlc0luUmVsYXRpdmVIb3Jpem9udGFsID0gW107XG4gICAgICB0aGlzLm5vZGVzSW5SZWxhdGl2ZVZlcnRpY2FsID0gW107XG4gICAgICB0aGlzLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcEhvcml6b250YWwgPSBuZXcgTWFwKCk7XG4gICAgICB0aGlzLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcFZlcnRpY2FsID0gbmV3IE1hcCgpO1xuICAgICAgdGhpcy5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsID0gbmV3IE1hcCgpO1xuICAgICAgdGhpcy5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbCA9IG5ldyBNYXAoKTtcblxuICAgICAgLy8gZmlsbCBhcnJheXMgYW5kIG1hcHNcbiAgICAgIHRoaXMuY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgaWYgKGNvbnN0cmFpbnQubGVmdCkge1xuICAgICAgICAgIHZhciBub2RlSWRMZWZ0ID0gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMoY29uc3RyYWludC5sZWZ0KSA/IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGNvbnN0cmFpbnQubGVmdCkgOiBjb25zdHJhaW50LmxlZnQ7XG4gICAgICAgICAgdmFyIG5vZGVJZFJpZ2h0ID0gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMoY29uc3RyYWludC5yaWdodCkgPyBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChjb25zdHJhaW50LnJpZ2h0KSA6IGNvbnN0cmFpbnQucmlnaHQ7XG5cbiAgICAgICAgICBpZiAoIXNlbGYubm9kZXNJblJlbGF0aXZlSG9yaXpvbnRhbC5pbmNsdWRlcyhub2RlSWRMZWZ0KSkge1xuICAgICAgICAgICAgc2VsZi5ub2Rlc0luUmVsYXRpdmVIb3Jpem9udGFsLnB1c2gobm9kZUlkTGVmdCk7XG4gICAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcEhvcml6b250YWwuc2V0KG5vZGVJZExlZnQsIFtdKTtcbiAgICAgICAgICAgIGlmIChzZWxmLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKG5vZGVJZExlZnQpKSB7XG4gICAgICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5zZXQobm9kZUlkTGVmdCwgc2VsZi5pZFRvTm9kZU1hcC5nZXQoc2VsZi5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChub2RlSWRMZWZ0KVswXSkuZ2V0Q2VudGVyWCgpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5zZXQobm9kZUlkTGVmdCwgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkTGVmdCkuZ2V0Q2VudGVyWCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzZWxmLm5vZGVzSW5SZWxhdGl2ZUhvcml6b250YWwuaW5jbHVkZXMobm9kZUlkUmlnaHQpKSB7XG4gICAgICAgICAgICBzZWxmLm5vZGVzSW5SZWxhdGl2ZUhvcml6b250YWwucHVzaChub2RlSWRSaWdodCk7XG4gICAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcEhvcml6b250YWwuc2V0KG5vZGVJZFJpZ2h0LCBbXSk7XG4gICAgICAgICAgICBpZiAoc2VsZi5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhub2RlSWRSaWdodCkpIHtcbiAgICAgICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLnNldChub2RlSWRSaWdodCwgc2VsZi5pZFRvTm9kZU1hcC5nZXQoc2VsZi5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChub2RlSWRSaWdodClbMF0pLmdldENlbnRlclgoKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuc2V0KG5vZGVJZFJpZ2h0LCBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWRSaWdodCkuZ2V0Q2VudGVyWCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcEhvcml6b250YWwuZ2V0KG5vZGVJZExlZnQpLnB1c2goeyByaWdodDogbm9kZUlkUmlnaHQsIGdhcDogY29uc3RyYWludC5nYXAgfSk7XG4gICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBIb3Jpem9udGFsLmdldChub2RlSWRSaWdodCkucHVzaCh7IGxlZnQ6IG5vZGVJZExlZnQsIGdhcDogY29uc3RyYWludC5nYXAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIG5vZGVJZFRvcCA9IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMoY29uc3RyYWludC50b3ApID8gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChjb25zdHJhaW50LnRvcCkgOiBjb25zdHJhaW50LnRvcDtcbiAgICAgICAgICB2YXIgbm9kZUlkQm90dG9tID0gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhjb25zdHJhaW50LmJvdHRvbSkgPyBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGNvbnN0cmFpbnQuYm90dG9tKSA6IGNvbnN0cmFpbnQuYm90dG9tO1xuXG4gICAgICAgICAgaWYgKCFzZWxmLm5vZGVzSW5SZWxhdGl2ZVZlcnRpY2FsLmluY2x1ZGVzKG5vZGVJZFRvcCkpIHtcbiAgICAgICAgICAgIHNlbGYubm9kZXNJblJlbGF0aXZlVmVydGljYWwucHVzaChub2RlSWRUb3ApO1xuICAgICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBWZXJ0aWNhbC5zZXQobm9kZUlkVG9wLCBbXSk7XG4gICAgICAgICAgICBpZiAoc2VsZi5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKG5vZGVJZFRvcCkpIHtcbiAgICAgICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5zZXQobm9kZUlkVG9wLCBzZWxmLmlkVG9Ob2RlTWFwLmdldChzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQobm9kZUlkVG9wKVswXSkuZ2V0Q2VudGVyWSgpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuc2V0KG5vZGVJZFRvcCwgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkVG9wKS5nZXRDZW50ZXJZKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXNlbGYubm9kZXNJblJlbGF0aXZlVmVydGljYWwuaW5jbHVkZXMobm9kZUlkQm90dG9tKSkge1xuICAgICAgICAgICAgc2VsZi5ub2Rlc0luUmVsYXRpdmVWZXJ0aWNhbC5wdXNoKG5vZGVJZEJvdHRvbSk7XG4gICAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcFZlcnRpY2FsLnNldChub2RlSWRCb3R0b20sIFtdKTtcbiAgICAgICAgICAgIGlmIChzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMobm9kZUlkQm90dG9tKSkge1xuICAgICAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLnNldChub2RlSWRCb3R0b20sIHNlbGYuaWRUb05vZGVNYXAuZ2V0KHNlbGYuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChub2RlSWRCb3R0b20pWzBdKS5nZXRDZW50ZXJZKCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5zZXQobm9kZUlkQm90dG9tLCBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWRCb3R0b20pLmdldENlbnRlclkoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwVmVydGljYWwuZ2V0KG5vZGVJZFRvcCkucHVzaCh7IGJvdHRvbTogbm9kZUlkQm90dG9tLCBnYXA6IGNvbnN0cmFpbnQuZ2FwIH0pO1xuICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwVmVydGljYWwuZ2V0KG5vZGVJZEJvdHRvbSkucHVzaCh7IHRvcDogbm9kZUlkVG9wLCBnYXA6IGNvbnN0cmFpbnQuZ2FwIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHN1YkdyYXBoT25Ib3Jpem9udGFsID0gbmV3IE1hcCgpOyAvLyBzdWJncmFwaCBmcm9tIHZlcnRpY2FsIFJQIGNvbnN0cmFpbnRzXG4gICAgICB2YXIgc3ViR3JhcGhPblZlcnRpY2FsID0gbmV3IE1hcCgpOyAvLyBzdWJncmFwaCBmcm9tIHZlcnRpY2FsIFJQIGNvbnN0cmFpbnRzXG5cbiAgICAgIC8vIGNvbnN0cnVjdCBzdWJncmFwaHMgZnJvbSByZWxhdGl2ZSBwbGFjZW1lbnQgY29uc3RyYWludHMgXG4gICAgICB0aGlzLmNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgIGlmIChjb25zdHJhaW50LmxlZnQpIHtcbiAgICAgICAgICB2YXIgbGVmdCA9IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKGNvbnN0cmFpbnQubGVmdCkgPyBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChjb25zdHJhaW50LmxlZnQpIDogY29uc3RyYWludC5sZWZ0O1xuICAgICAgICAgIHZhciByaWdodCA9IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKGNvbnN0cmFpbnQucmlnaHQpID8gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoY29uc3RyYWludC5yaWdodCkgOiBjb25zdHJhaW50LnJpZ2h0O1xuICAgICAgICAgIGlmIChzdWJHcmFwaE9uSG9yaXpvbnRhbC5oYXMobGVmdCkpIHtcbiAgICAgICAgICAgIHN1YkdyYXBoT25Ib3Jpem9udGFsLmdldChsZWZ0KS5wdXNoKHJpZ2h0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3ViR3JhcGhPbkhvcml6b250YWwuc2V0KGxlZnQsIFtyaWdodF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3ViR3JhcGhPbkhvcml6b250YWwuaGFzKHJpZ2h0KSkge1xuICAgICAgICAgICAgc3ViR3JhcGhPbkhvcml6b250YWwuZ2V0KHJpZ2h0KS5wdXNoKGxlZnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJHcmFwaE9uSG9yaXpvbnRhbC5zZXQocmlnaHQsIFtsZWZ0XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciB0b3AgPSBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKGNvbnN0cmFpbnQudG9wKSA/IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoY29uc3RyYWludC50b3ApIDogY29uc3RyYWludC50b3A7XG4gICAgICAgICAgdmFyIGJvdHRvbSA9IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMoY29uc3RyYWludC5ib3R0b20pID8gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChjb25zdHJhaW50LmJvdHRvbSkgOiBjb25zdHJhaW50LmJvdHRvbTtcbiAgICAgICAgICBpZiAoc3ViR3JhcGhPblZlcnRpY2FsLmhhcyh0b3ApKSB7XG4gICAgICAgICAgICBzdWJHcmFwaE9uVmVydGljYWwuZ2V0KHRvcCkucHVzaChib3R0b20pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJHcmFwaE9uVmVydGljYWwuc2V0KHRvcCwgW2JvdHRvbV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3ViR3JhcGhPblZlcnRpY2FsLmhhcyhib3R0b20pKSB7XG4gICAgICAgICAgICBzdWJHcmFwaE9uVmVydGljYWwuZ2V0KGJvdHRvbSkucHVzaCh0b3ApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJHcmFwaE9uVmVydGljYWwuc2V0KGJvdHRvbSwgW3RvcF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCBjb21wb25lbnRzIGZyb20gYSBnaXZlbiBncmFwaCBcbiAgICAgIC8vIGFsc28gcmV0dXJucyBhbiBhcnJheSB0aGF0IGtlZXBzIHdoZXRoZXIgZWFjaCBjb21wb25lbnQgY29udGFpbnMgZml4ZWQgbm9kZVxuICAgICAgdmFyIGNvbnN0cnVjdENvbXBvbmVudHMgPSBmdW5jdGlvbiBjb25zdHJ1Y3RDb21wb25lbnRzKGdyYXBoLCBmaXhlZE5vZGVzKSB7XG4gICAgICAgIHZhciBjb21wb25lbnRzID0gW107XG4gICAgICAgIHZhciBpc0ZpeGVkID0gW107XG4gICAgICAgIHZhciBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0KCk7XG4gICAgICAgIHZhciB2aXNpdGVkID0gbmV3IFNldCgpO1xuICAgICAgICB2YXIgY291bnQgPSAwO1xuXG4gICAgICAgIGdyYXBoLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICBpZiAoIXZpc2l0ZWQuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudHNbY291bnRdID0gW107XG4gICAgICAgICAgICBpc0ZpeGVkW2NvdW50XSA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIGN1cnJlbnROb2RlID0ga2V5O1xuICAgICAgICAgICAgcXVldWUucHVzaChjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICB2aXNpdGVkLmFkZChjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICBjb21wb25lbnRzW2NvdW50XS5wdXNoKGN1cnJlbnROb2RlKTtcblxuICAgICAgICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgaWYgKGZpeGVkTm9kZXMuaGFzKGN1cnJlbnROb2RlKSkge1xuICAgICAgICAgICAgICAgIGlzRml4ZWRbY291bnRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgbmVpZ2hib3JzID0gZ3JhcGguZ2V0KGN1cnJlbnROb2RlKTtcbiAgICAgICAgICAgICAgbmVpZ2hib3JzLmZvckVhY2goZnVuY3Rpb24gKG5laWdoYm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2aXNpdGVkLmhhcyhuZWlnaGJvcikpIHtcbiAgICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2gobmVpZ2hib3IpO1xuICAgICAgICAgICAgICAgICAgdmlzaXRlZC5hZGQobmVpZ2hib3IpO1xuICAgICAgICAgICAgICAgICAgY29tcG9uZW50c1tjb3VudF0ucHVzaChuZWlnaGJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4geyBjb21wb25lbnRzOiBjb21wb25lbnRzLCBpc0ZpeGVkOiBpc0ZpeGVkIH07XG4gICAgICB9O1xuXG4gICAgICB2YXIgcmVzdWx0T25Ib3Jpem9udGFsID0gY29uc3RydWN0Q29tcG9uZW50cyhzdWJHcmFwaE9uSG9yaXpvbnRhbCwgc2VsZi5maXhlZE5vZGVzT25Ib3Jpem9udGFsKTtcbiAgICAgIHRoaXMuY29tcG9uZW50c09uSG9yaXpvbnRhbCA9IHJlc3VsdE9uSG9yaXpvbnRhbC5jb21wb25lbnRzO1xuICAgICAgdGhpcy5maXhlZENvbXBvbmVudHNPbkhvcml6b250YWwgPSByZXN1bHRPbkhvcml6b250YWwuaXNGaXhlZDtcbiAgICAgIHZhciByZXN1bHRPblZlcnRpY2FsID0gY29uc3RydWN0Q29tcG9uZW50cyhzdWJHcmFwaE9uVmVydGljYWwsIHNlbGYuZml4ZWROb2Rlc09uVmVydGljYWwpO1xuICAgICAgdGhpcy5jb21wb25lbnRzT25WZXJ0aWNhbCA9IHJlc3VsdE9uVmVydGljYWwuY29tcG9uZW50cztcbiAgICAgIHRoaXMuZml4ZWRDb21wb25lbnRzT25WZXJ0aWNhbCA9IHJlc3VsdE9uVmVydGljYWwuaXNGaXhlZDtcbiAgICB9XG4gIH1cbn07XG5cbi8vIHVwZGF0ZXMgbm9kZSBkaXNwbGFjZW1lbnRzIGJhc2VkIG9uIGNvbnN0cmFpbnRzXG5Db1NFTGF5b3V0LnByb3RvdHlwZS51cGRhdGVEaXNwbGFjZW1lbnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmICh0aGlzLmNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQpIHtcbiAgICB0aGlzLmNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZURhdGEpIHtcbiAgICAgIHZhciBmaXhlZE5vZGUgPSBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlRGF0YS5ub2RlSWQpO1xuICAgICAgZml4ZWROb2RlLmRpc3BsYWNlbWVudFggPSAwO1xuICAgICAgZml4ZWROb2RlLmRpc3BsYWNlbWVudFkgPSAwO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludCkge1xuICAgIGlmICh0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWwpIHtcbiAgICAgIHZhciBhbGxWZXJ0aWNhbEFsaWdubWVudHMgPSB0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWw7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbFZlcnRpY2FsQWxpZ25tZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdG90YWxEaXNwbGFjZW1lbnRYID0gMDtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhbGxWZXJ0aWNhbEFsaWdubWVudHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBpZiAodGhpcy5maXhlZE5vZGVTZXQuaGFzKGFsbFZlcnRpY2FsQWxpZ25tZW50c1tpXVtqXSkpIHtcbiAgICAgICAgICAgIHRvdGFsRGlzcGxhY2VtZW50WCA9IDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgdG90YWxEaXNwbGFjZW1lbnRYICs9IHRoaXMuaWRUb05vZGVNYXAuZ2V0KGFsbFZlcnRpY2FsQWxpZ25tZW50c1tpXVtqXSkuZGlzcGxhY2VtZW50WDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYXZlcmFnZURpc3BsYWNlbWVudFggPSB0b3RhbERpc3BsYWNlbWVudFggLyBhbGxWZXJ0aWNhbEFsaWdubWVudHNbaV0ubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFsbFZlcnRpY2FsQWxpZ25tZW50c1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHRoaXMuaWRUb05vZGVNYXAuZ2V0KGFsbFZlcnRpY2FsQWxpZ25tZW50c1tpXVtqXSkuZGlzcGxhY2VtZW50WCA9IGF2ZXJhZ2VEaXNwbGFjZW1lbnRYO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbCkge1xuICAgICAgdmFyIGFsbEhvcml6b250YWxBbGlnbm1lbnRzID0gdGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWw7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbEhvcml6b250YWxBbGlnbm1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0b3RhbERpc3BsYWNlbWVudFkgPSAwO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFsbEhvcml6b250YWxBbGlnbm1lbnRzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZml4ZWROb2RlU2V0LmhhcyhhbGxIb3Jpem9udGFsQWxpZ25tZW50c1tpXVtqXSkpIHtcbiAgICAgICAgICAgIHRvdGFsRGlzcGxhY2VtZW50WSA9IDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgdG90YWxEaXNwbGFjZW1lbnRZICs9IHRoaXMuaWRUb05vZGVNYXAuZ2V0KGFsbEhvcml6b250YWxBbGlnbm1lbnRzW2ldW2pdKS5kaXNwbGFjZW1lbnRZO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhdmVyYWdlRGlzcGxhY2VtZW50WSA9IHRvdGFsRGlzcGxhY2VtZW50WSAvIGFsbEhvcml6b250YWxBbGlnbm1lbnRzW2ldLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhbGxIb3Jpem9udGFsQWxpZ25tZW50c1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHRoaXMuaWRUb05vZGVNYXAuZ2V0KGFsbEhvcml6b250YWxBbGlnbm1lbnRzW2ldW2pdKS5kaXNwbGFjZW1lbnRZID0gYXZlcmFnZURpc3BsYWNlbWVudFk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5jb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcblxuICAgIGlmIChDb1NFQ29uc3RhbnRzLlJFTEFYX01PVkVNRU5UX09OX0NPTlNUUkFJTlRTKSB7XG4gICAgICAvLyBzaHVmZmxlIGFycmF5IHRvIHJhbmRvbWl6ZSBub2RlIHByb2Nlc3Npbmcgb3JkZXJcbiAgICAgIGlmICh0aGlzLnRvdGFsSXRlcmF0aW9ucyAlIDEwID09IDApIHtcbiAgICAgICAgdGhpcy5zaHVmZmxlKHRoaXMubm9kZXNJblJlbGF0aXZlSG9yaXpvbnRhbCk7XG4gICAgICAgIHRoaXMuc2h1ZmZsZSh0aGlzLm5vZGVzSW5SZWxhdGl2ZVZlcnRpY2FsKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5ub2Rlc0luUmVsYXRpdmVIb3Jpem9udGFsLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICBpZiAoIXNlbGYuZml4ZWROb2Rlc09uSG9yaXpvbnRhbC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgIHZhciBkaXNwbGFjZW1lbnQgPSAwO1xuICAgICAgICAgIGlmIChzZWxmLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgIGRpc3BsYWNlbWVudCA9IHNlbGYuaWRUb05vZGVNYXAuZ2V0KHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQobm9kZUlkKVswXSkuZGlzcGxhY2VtZW50WDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGlzcGxhY2VtZW50ID0gc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRYO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcEhvcml6b250YWwuZ2V0KG5vZGVJZCkuZm9yRWFjaChmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnQucmlnaHQpIHtcbiAgICAgICAgICAgICAgdmFyIGRpZmYgPSBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuZ2V0KGNvbnN0cmFpbnQucmlnaHQpIC0gc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLmdldChub2RlSWQpIC0gZGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgICBpZiAoZGlmZiA8IGNvbnN0cmFpbnQuZ2FwKSB7XG4gICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50IC09IGNvbnN0cmFpbnQuZ2FwIC0gZGlmZjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIGRpZmYgPSBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuZ2V0KG5vZGVJZCkgLSBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuZ2V0KGNvbnN0cmFpbnQubGVmdCkgKyBkaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgIGlmIChkaWZmIDwgY29uc3RyYWludC5nYXApIHtcbiAgICAgICAgICAgICAgICBkaXNwbGFjZW1lbnQgKz0gY29uc3RyYWludC5nYXAgLSBkaWZmO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLnNldChub2RlSWQsIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5nZXQobm9kZUlkKSArIGRpc3BsYWNlbWVudCk7XG4gICAgICAgICAgaWYgKHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgc2VsZi5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChub2RlSWQpLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWQpLmRpc3BsYWNlbWVudFggPSBkaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRYID0gZGlzcGxhY2VtZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubm9kZXNJblJlbGF0aXZlVmVydGljYWwuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgIGlmICghc2VsZi5maXhlZE5vZGVzT25Ib3Jpem9udGFsLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgdmFyIGRpc3BsYWNlbWVudCA9IDA7XG4gICAgICAgICAgaWYgKHNlbGYuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICBkaXNwbGFjZW1lbnQgPSBzZWxmLmlkVG9Ob2RlTWFwLmdldChzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQobm9kZUlkKVswXSkuZGlzcGxhY2VtZW50WTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGlzcGxhY2VtZW50ID0gc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRZO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcFZlcnRpY2FsLmdldChub2RlSWQpLmZvckVhY2goZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgIGlmIChjb25zdHJhaW50LmJvdHRvbSkge1xuICAgICAgICAgICAgICB2YXIgZGlmZiA9IHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuZ2V0KGNvbnN0cmFpbnQuYm90dG9tKSAtIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuZ2V0KG5vZGVJZCkgLSBkaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgIGlmIChkaWZmIDwgY29uc3RyYWludC5nYXApIHtcbiAgICAgICAgICAgICAgICBkaXNwbGFjZW1lbnQgLT0gY29uc3RyYWludC5nYXAgLSBkaWZmO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgZGlmZiA9IHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuZ2V0KG5vZGVJZCkgLSBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLmdldChjb25zdHJhaW50LnRvcCkgKyBkaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgIGlmIChkaWZmIDwgY29uc3RyYWludC5nYXApIHtcbiAgICAgICAgICAgICAgICBkaXNwbGFjZW1lbnQgKz0gY29uc3RyYWludC5nYXAgLSBkaWZmO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5zZXQobm9kZUlkLCBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLmdldChub2RlSWQpICsgZGlzcGxhY2VtZW50KTtcbiAgICAgICAgICBpZiAoc2VsZi5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgIHNlbGYuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChub2RlSWQpLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWQpLmRpc3BsYWNlbWVudFkgPSBkaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRZID0gZGlzcGxhY2VtZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb21wb25lbnRzT25Ib3Jpem9udGFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHNPbkhvcml6b250YWxbaV07XG4gICAgICAgIGlmICh0aGlzLmZpeGVkQ29tcG9uZW50c09uSG9yaXpvbnRhbFtpXSkge1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tcG9uZW50Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhjb21wb25lbnRbal0pKSB7XG4gICAgICAgICAgICAgIHRoaXMuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoY29tcG9uZW50W2pdKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWQpLmRpc3BsYWNlbWVudFggPSAwO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaWRUb05vZGVNYXAuZ2V0KGNvbXBvbmVudFtqXSkuZGlzcGxhY2VtZW50WCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBzdW0gPSAwO1xuICAgICAgICAgIHZhciBjb3VudCA9IDA7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21wb25lbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKGNvbXBvbmVudFtqXSkpIHtcbiAgICAgICAgICAgICAgdmFyIGFjdHVhbE5vZGVzID0gdGhpcy5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChjb21wb25lbnRbal0pO1xuICAgICAgICAgICAgICBzdW0gKz0gYWN0dWFsTm9kZXMubGVuZ3RoICogdGhpcy5pZFRvTm9kZU1hcC5nZXQoYWN0dWFsTm9kZXNbMF0pLmRpc3BsYWNlbWVudFg7XG4gICAgICAgICAgICAgIGNvdW50ICs9IGFjdHVhbE5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN1bSArPSB0aGlzLmlkVG9Ob2RlTWFwLmdldChjb21wb25lbnRbal0pLmRpc3BsYWNlbWVudFg7XG4gICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBhdmVyYWdlRGlzcGxhY2VtZW50ID0gc3VtIC8gY291bnQ7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21wb25lbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKGNvbXBvbmVudFtqXSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChjb21wb25lbnRbal0pLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICAgIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WCA9IGF2ZXJhZ2VEaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5pZFRvTm9kZU1hcC5nZXQoY29tcG9uZW50W2pdKS5kaXNwbGFjZW1lbnRYID0gYXZlcmFnZURpc3BsYWNlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbXBvbmVudHNPblZlcnRpY2FsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHNPblZlcnRpY2FsW2ldO1xuICAgICAgICBpZiAodGhpcy5maXhlZENvbXBvbmVudHNPblZlcnRpY2FsW2ldKSB7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21wb25lbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMoY29tcG9uZW50W2pdKSkge1xuICAgICAgICAgICAgICB0aGlzLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoY29tcG9uZW50W2pdKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWQpLmRpc3BsYWNlbWVudFkgPSAwO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaWRUb05vZGVNYXAuZ2V0KGNvbXBvbmVudFtqXSkuZGlzcGxhY2VtZW50WSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBzdW0gPSAwO1xuICAgICAgICAgIHZhciBjb3VudCA9IDA7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21wb25lbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMoY29tcG9uZW50W2pdKSkge1xuICAgICAgICAgICAgICB2YXIgYWN0dWFsTm9kZXMgPSB0aGlzLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoY29tcG9uZW50W2pdKTtcbiAgICAgICAgICAgICAgc3VtICs9IGFjdHVhbE5vZGVzLmxlbmd0aCAqIHRoaXMuaWRUb05vZGVNYXAuZ2V0KGFjdHVhbE5vZGVzWzBdKS5kaXNwbGFjZW1lbnRZO1xuICAgICAgICAgICAgICBjb3VudCArPSBhY3R1YWxOb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdW0gKz0gdGhpcy5pZFRvTm9kZU1hcC5nZXQoY29tcG9uZW50W2pdKS5kaXNwbGFjZW1lbnRZO1xuICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgYXZlcmFnZURpc3BsYWNlbWVudCA9IHN1bSAvIGNvdW50O1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tcG9uZW50Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKGNvbXBvbmVudFtqXSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGNvbXBvbmVudFtqXSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRZID0gYXZlcmFnZURpc3BsYWNlbWVudDtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmlkVG9Ob2RlTWFwLmdldChjb21wb25lbnRbal0pLmRpc3BsYWNlbWVudFkgPSBhdmVyYWdlRGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuY2FsY3VsYXRlTm9kZXNUb0FwcGx5R3Jhdml0YXRpb25UbyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5vZGVMaXN0ID0gW107XG4gIHZhciBncmFwaDtcblxuICB2YXIgZ3JhcGhzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0R3JhcGhzKCk7XG4gIHZhciBzaXplID0gZ3JhcGhzLmxlbmd0aDtcbiAgdmFyIGk7XG4gIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICBncmFwaCA9IGdyYXBoc1tpXTtcblxuICAgIGdyYXBoLnVwZGF0ZUNvbm5lY3RlZCgpO1xuXG4gICAgaWYgKCFncmFwaC5pc0Nvbm5lY3RlZCkge1xuICAgICAgbm9kZUxpc3QgPSBub2RlTGlzdC5jb25jYXQoZ3JhcGguZ2V0Tm9kZXMoKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vZGVMaXN0O1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuY3JlYXRlQmVuZHBvaW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVkZ2VzID0gW107XG4gIGVkZ2VzID0gZWRnZXMuY29uY2F0KHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEFsbEVkZ2VzKCkpO1xuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIGk7XG4gIGZvciAoaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlZGdlID0gZWRnZXNbaV07XG5cbiAgICBpZiAoIXZpc2l0ZWQuaGFzKGVkZ2UpKSB7XG4gICAgICB2YXIgc291cmNlID0gZWRnZS5nZXRTb3VyY2UoKTtcbiAgICAgIHZhciB0YXJnZXQgPSBlZGdlLmdldFRhcmdldCgpO1xuXG4gICAgICBpZiAoc291cmNlID09IHRhcmdldCkge1xuICAgICAgICBlZGdlLmdldEJlbmRwb2ludHMoKS5wdXNoKG5ldyBQb2ludEQoKSk7XG4gICAgICAgIGVkZ2UuZ2V0QmVuZHBvaW50cygpLnB1c2gobmV3IFBvaW50RCgpKTtcbiAgICAgICAgdGhpcy5jcmVhdGVEdW1teU5vZGVzRm9yQmVuZHBvaW50cyhlZGdlKTtcbiAgICAgICAgdmlzaXRlZC5hZGQoZWRnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZWRnZUxpc3QgPSBbXTtcblxuICAgICAgICBlZGdlTGlzdCA9IGVkZ2VMaXN0LmNvbmNhdChzb3VyY2UuZ2V0RWRnZUxpc3RUb05vZGUodGFyZ2V0KSk7XG4gICAgICAgIGVkZ2VMaXN0ID0gZWRnZUxpc3QuY29uY2F0KHRhcmdldC5nZXRFZGdlTGlzdFRvTm9kZShzb3VyY2UpKTtcblxuICAgICAgICBpZiAoIXZpc2l0ZWQuaGFzKGVkZ2VMaXN0WzBdKSkge1xuICAgICAgICAgIGlmIChlZGdlTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2YXIgaztcbiAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBlZGdlTGlzdC5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICB2YXIgbXVsdGlFZGdlID0gZWRnZUxpc3Rba107XG4gICAgICAgICAgICAgIG11bHRpRWRnZS5nZXRCZW5kcG9pbnRzKCkucHVzaChuZXcgUG9pbnREKCkpO1xuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUR1bW15Tm9kZXNGb3JCZW5kcG9pbnRzKG11bHRpRWRnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVkZ2VMaXN0LmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgICAgIHZpc2l0ZWQuYWRkKGVkZ2UpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZpc2l0ZWQuc2l6ZSA9PSBlZGdlcy5sZW5ndGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUucG9zaXRpb25Ob2Rlc1JhZGlhbGx5ID0gZnVuY3Rpb24gKGZvcmVzdCkge1xuICAvLyBXZSB0aWxlIHRoZSB0cmVlcyB0byBhIGdyaWQgcm93IGJ5IHJvdzsgZmlyc3QgdHJlZSBzdGFydHMgYXQgKDAsMClcbiAgdmFyIGN1cnJlbnRTdGFydGluZ1BvaW50ID0gbmV3IFBvaW50KDAsIDApO1xuICB2YXIgbnVtYmVyT2ZDb2x1bW5zID0gTWF0aC5jZWlsKE1hdGguc3FydChmb3Jlc3QubGVuZ3RoKSk7XG4gIHZhciBoZWlnaHQgPSAwO1xuICB2YXIgY3VycmVudFkgPSAwO1xuICB2YXIgY3VycmVudFggPSAwO1xuICB2YXIgcG9pbnQgPSBuZXcgUG9pbnREKDAsIDApO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZm9yZXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGkgJSBudW1iZXJPZkNvbHVtbnMgPT0gMCkge1xuICAgICAgLy8gU3RhcnQgb2YgYSBuZXcgcm93LCBtYWtlIHRoZSB4IGNvb3JkaW5hdGUgMCwgaW5jcmVtZW50IHRoZVxuICAgICAgLy8geSBjb29yZGluYXRlIHdpdGggdGhlIG1heCBoZWlnaHQgb2YgdGhlIHByZXZpb3VzIHJvd1xuICAgICAgY3VycmVudFggPSAwO1xuICAgICAgY3VycmVudFkgPSBoZWlnaHQ7XG5cbiAgICAgIGlmIChpICE9IDApIHtcbiAgICAgICAgY3VycmVudFkgKz0gQ29TRUNvbnN0YW50cy5ERUZBVUxUX0NPTVBPTkVOVF9TRVBFUkFUSU9OO1xuICAgICAgfVxuXG4gICAgICBoZWlnaHQgPSAwO1xuICAgIH1cblxuICAgIHZhciB0cmVlID0gZm9yZXN0W2ldO1xuXG4gICAgLy8gRmluZCB0aGUgY2VudGVyIG9mIHRoZSB0cmVlXG4gICAgdmFyIGNlbnRlck5vZGUgPSBMYXlvdXQuZmluZENlbnRlck9mVHJlZSh0cmVlKTtcblxuICAgIC8vIFNldCB0aGUgc3RhcmluZyBwb2ludCBvZiB0aGUgbmV4dCB0cmVlXG4gICAgY3VycmVudFN0YXJ0aW5nUG9pbnQueCA9IGN1cnJlbnRYO1xuICAgIGN1cnJlbnRTdGFydGluZ1BvaW50LnkgPSBjdXJyZW50WTtcblxuICAgIC8vIERvIGEgcmFkaWFsIGxheW91dCBzdGFydGluZyB3aXRoIHRoZSBjZW50ZXJcbiAgICBwb2ludCA9IENvU0VMYXlvdXQucmFkaWFsTGF5b3V0KHRyZWUsIGNlbnRlck5vZGUsIGN1cnJlbnRTdGFydGluZ1BvaW50KTtcblxuICAgIGlmIChwb2ludC55ID4gaGVpZ2h0KSB7XG4gICAgICBoZWlnaHQgPSBNYXRoLmZsb29yKHBvaW50LnkpO1xuICAgIH1cblxuICAgIGN1cnJlbnRYID0gTWF0aC5mbG9vcihwb2ludC54ICsgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0NPTVBPTkVOVF9TRVBFUkFUSU9OKTtcbiAgfVxuXG4gIHRoaXMudHJhbnNmb3JtKG5ldyBQb2ludEQoTGF5b3V0Q29uc3RhbnRzLldPUkxEX0NFTlRFUl9YIC0gcG9pbnQueCAvIDIsIExheW91dENvbnN0YW50cy5XT1JMRF9DRU5URVJfWSAtIHBvaW50LnkgLyAyKSk7XG59O1xuXG5Db1NFTGF5b3V0LnJhZGlhbExheW91dCA9IGZ1bmN0aW9uICh0cmVlLCBjZW50ZXJOb2RlLCBzdGFydGluZ1BvaW50KSB7XG4gIHZhciByYWRpYWxTZXAgPSBNYXRoLm1heCh0aGlzLm1heERpYWdvbmFsSW5UcmVlKHRyZWUpLCBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfUkFESUFMX1NFUEFSQVRJT04pO1xuICBDb1NFTGF5b3V0LmJyYW5jaFJhZGlhbExheW91dChjZW50ZXJOb2RlLCBudWxsLCAwLCAzNTksIDAsIHJhZGlhbFNlcCk7XG4gIHZhciBib3VuZHMgPSBMR3JhcGguY2FsY3VsYXRlQm91bmRzKHRyZWUpO1xuXG4gIHZhciB0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKCk7XG4gIHRyYW5zZm9ybS5zZXREZXZpY2VPcmdYKGJvdW5kcy5nZXRNaW5YKCkpO1xuICB0cmFuc2Zvcm0uc2V0RGV2aWNlT3JnWShib3VuZHMuZ2V0TWluWSgpKTtcbiAgdHJhbnNmb3JtLnNldFdvcmxkT3JnWChzdGFydGluZ1BvaW50LngpO1xuICB0cmFuc2Zvcm0uc2V0V29ybGRPcmdZKHN0YXJ0aW5nUG9pbnQueSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSB0cmVlW2ldO1xuICAgIG5vZGUudHJhbnNmb3JtKHRyYW5zZm9ybSk7XG4gIH1cblxuICB2YXIgYm90dG9tUmlnaHQgPSBuZXcgUG9pbnREKGJvdW5kcy5nZXRNYXhYKCksIGJvdW5kcy5nZXRNYXhZKCkpO1xuXG4gIHJldHVybiB0cmFuc2Zvcm0uaW52ZXJzZVRyYW5zZm9ybVBvaW50KGJvdHRvbVJpZ2h0KTtcbn07XG5cbkNvU0VMYXlvdXQuYnJhbmNoUmFkaWFsTGF5b3V0ID0gZnVuY3Rpb24gKG5vZGUsIHBhcmVudE9mTm9kZSwgc3RhcnRBbmdsZSwgZW5kQW5nbGUsIGRpc3RhbmNlLCByYWRpYWxTZXBhcmF0aW9uKSB7XG4gIC8vIEZpcnN0LCBwb3NpdGlvbiB0aGlzIG5vZGUgYnkgZmluZGluZyBpdHMgYW5nbGUuXG4gIHZhciBoYWxmSW50ZXJ2YWwgPSAoZW5kQW5nbGUgLSBzdGFydEFuZ2xlICsgMSkgLyAyO1xuXG4gIGlmIChoYWxmSW50ZXJ2YWwgPCAwKSB7XG4gICAgaGFsZkludGVydmFsICs9IDE4MDtcbiAgfVxuXG4gIHZhciBub2RlQW5nbGUgPSAoaGFsZkludGVydmFsICsgc3RhcnRBbmdsZSkgJSAzNjA7XG4gIHZhciB0ZXRhID0gbm9kZUFuZ2xlICogSUdlb21ldHJ5LlRXT19QSSAvIDM2MDtcblxuICAvLyBNYWtlIHBvbGFyIHRvIGphdmEgY29yZGluYXRlIGNvbnZlcnNpb24uXG4gIHZhciBjb3NfdGV0YSA9IE1hdGguY29zKHRldGEpO1xuICB2YXIgeF8gPSBkaXN0YW5jZSAqIE1hdGguY29zKHRldGEpO1xuICB2YXIgeV8gPSBkaXN0YW5jZSAqIE1hdGguc2luKHRldGEpO1xuXG4gIG5vZGUuc2V0Q2VudGVyKHhfLCB5Xyk7XG5cbiAgLy8gVHJhdmVyc2UgYWxsIG5laWdoYm9ycyBvZiB0aGlzIG5vZGUgYW5kIHJlY3Vyc2l2ZWx5IGNhbGwgdGhpc1xuICAvLyBmdW5jdGlvbi5cbiAgdmFyIG5laWdoYm9yRWRnZXMgPSBbXTtcbiAgbmVpZ2hib3JFZGdlcyA9IG5laWdoYm9yRWRnZXMuY29uY2F0KG5vZGUuZ2V0RWRnZXMoKSk7XG4gIHZhciBjaGlsZENvdW50ID0gbmVpZ2hib3JFZGdlcy5sZW5ndGg7XG5cbiAgaWYgKHBhcmVudE9mTm9kZSAhPSBudWxsKSB7XG4gICAgY2hpbGRDb3VudC0tO1xuICB9XG5cbiAgdmFyIGJyYW5jaENvdW50ID0gMDtcblxuICB2YXIgaW5jRWRnZXNDb3VudCA9IG5laWdoYm9yRWRnZXMubGVuZ3RoO1xuICB2YXIgc3RhcnRJbmRleDtcblxuICB2YXIgZWRnZXMgPSBub2RlLmdldEVkZ2VzQmV0d2VlbihwYXJlbnRPZk5vZGUpO1xuXG4gIC8vIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBlZGdlcywgcHJ1bmUgdGhlbSB1bnRpbCB0aGVyZSByZW1haW5zIG9ubHkgb25lXG4gIC8vIGVkZ2UuXG4gIHdoaWxlIChlZGdlcy5sZW5ndGggPiAxKSB7XG4gICAgLy9uZWlnaGJvckVkZ2VzLnJlbW92ZShlZGdlcy5yZW1vdmUoMCkpO1xuICAgIHZhciB0ZW1wID0gZWRnZXNbMF07XG4gICAgZWRnZXMuc3BsaWNlKDAsIDEpO1xuICAgIHZhciBpbmRleCA9IG5laWdoYm9yRWRnZXMuaW5kZXhPZih0ZW1wKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgbmVpZ2hib3JFZGdlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICBpbmNFZGdlc0NvdW50LS07XG4gICAgY2hpbGRDb3VudC0tO1xuICB9XG5cbiAgaWYgKHBhcmVudE9mTm9kZSAhPSBudWxsKSB7XG4gICAgLy9hc3NlcnQgZWRnZXMubGVuZ3RoID09IDE7XG4gICAgc3RhcnRJbmRleCA9IChuZWlnaGJvckVkZ2VzLmluZGV4T2YoZWRnZXNbMF0pICsgMSkgJSBpbmNFZGdlc0NvdW50O1xuICB9IGVsc2Uge1xuICAgIHN0YXJ0SW5kZXggPSAwO1xuICB9XG5cbiAgdmFyIHN0ZXBBbmdsZSA9IE1hdGguYWJzKGVuZEFuZ2xlIC0gc3RhcnRBbmdsZSkgLyBjaGlsZENvdW50O1xuXG4gIGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBicmFuY2hDb3VudCAhPSBjaGlsZENvdW50OyBpID0gKytpICUgaW5jRWRnZXNDb3VudCkge1xuICAgIHZhciBjdXJyZW50TmVpZ2hib3IgPSBuZWlnaGJvckVkZ2VzW2ldLmdldE90aGVyRW5kKG5vZGUpO1xuXG4gICAgLy8gRG9uJ3QgYmFjayB0cmF2ZXJzZSB0byByb290IG5vZGUgaW4gY3VycmVudCB0cmVlLlxuICAgIGlmIChjdXJyZW50TmVpZ2hib3IgPT0gcGFyZW50T2ZOb2RlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGRTdGFydEFuZ2xlID0gKHN0YXJ0QW5nbGUgKyBicmFuY2hDb3VudCAqIHN0ZXBBbmdsZSkgJSAzNjA7XG4gICAgdmFyIGNoaWxkRW5kQW5nbGUgPSAoY2hpbGRTdGFydEFuZ2xlICsgc3RlcEFuZ2xlKSAlIDM2MDtcblxuICAgIENvU0VMYXlvdXQuYnJhbmNoUmFkaWFsTGF5b3V0KGN1cnJlbnROZWlnaGJvciwgbm9kZSwgY2hpbGRTdGFydEFuZ2xlLCBjaGlsZEVuZEFuZ2xlLCBkaXN0YW5jZSArIHJhZGlhbFNlcGFyYXRpb24sIHJhZGlhbFNlcGFyYXRpb24pO1xuXG4gICAgYnJhbmNoQ291bnQrKztcbiAgfVxufTtcblxuQ29TRUxheW91dC5tYXhEaWFnb25hbEluVHJlZSA9IGZ1bmN0aW9uICh0cmVlKSB7XG4gIHZhciBtYXhEaWFnb25hbCA9IEludGVnZXIuTUlOX1ZBTFVFO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHJlZS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gdHJlZVtpXTtcbiAgICB2YXIgZGlhZ29uYWwgPSBub2RlLmdldERpYWdvbmFsKCk7XG5cbiAgICBpZiAoZGlhZ29uYWwgPiBtYXhEaWFnb25hbCkge1xuICAgICAgbWF4RGlhZ29uYWwgPSBkaWFnb25hbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWF4RGlhZ29uYWw7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5jYWxjUmVwdWxzaW9uUmFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIGZvcm11bGEgaXMgMiB4IChsZXZlbCArIDEpIHggaWRlYWxFZGdlTGVuZ3RoXG4gIHJldHVybiAyICogKHRoaXMubGV2ZWwgKyAxKSAqIHRoaXMuaWRlYWxFZGdlTGVuZ3RoO1xufTtcblxuLy8gVGlsaW5nIG1ldGhvZHNcblxuLy8gR3JvdXAgemVybyBkZWdyZWUgbWVtYmVycyB3aG9zZSBwYXJlbnRzIGFyZSBub3QgdG8gYmUgdGlsZWQsIGNyZWF0ZSBkdW1teSBwYXJlbnRzIHdoZXJlIG5lZWRlZCBhbmQgZmlsbCBtZW1iZXJHcm91cHMgYnkgdGhlaXIgZHVtbXAgcGFyZW50IGlkJ3NcbkNvU0VMYXlvdXQucHJvdG90eXBlLmdyb3VwWmVyb0RlZ3JlZU1lbWJlcnMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgLy8gYXJyYXkgb2YgW3BhcmVudF9pZCB4IG9uZURlZ3JlZU5vZGVfaWRdXG4gIHZhciB0ZW1wTWVtYmVyR3JvdXBzID0ge307IC8vIEEgdGVtcG9yYXJ5IG1hcCBvZiBwYXJlbnQgbm9kZSBhbmQgaXRzIHplcm8gZGVncmVlIG1lbWJlcnNcbiAgdGhpcy5tZW1iZXJHcm91cHMgPSB7fTsgLy8gQSBtYXAgb2YgZHVtbXkgcGFyZW50IG5vZGUgYW5kIGl0cyB6ZXJvIGRlZ3JlZSBtZW1iZXJzIHdob3NlIHBhcmVudHMgYXJlIG5vdCB0byBiZSB0aWxlZFxuICB0aGlzLmlkVG9EdW1teU5vZGUgPSB7fTsgLy8gQSBtYXAgb2YgaWQgdG8gZHVtbXkgbm9kZSBcblxuICB2YXIgemVyb0RlZ3JlZSA9IFtdOyAvLyBMaXN0IG9mIHplcm8gZGVncmVlIG5vZGVzIHdob3NlIHBhcmVudHMgYXJlIG5vdCB0byBiZSB0aWxlZFxuICB2YXIgYWxsTm9kZXMgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxOb2RlcygpO1xuXG4gIC8vIEZpbGwgemVybyBkZWdyZWUgbGlzdFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBhbGxOb2Rlc1tpXTtcbiAgICB2YXIgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnQoKTtcbiAgICAvLyBJZiBhIG5vZGUgaGFzIHplcm8gZGVncmVlIGFuZCBpdHMgcGFyZW50IGlzIG5vdCB0byBiZSB0aWxlZCBpZiBleGlzdHMgYWRkIHRoYXQgbm9kZSB0byB6ZXJvRGVncmVzIGxpc3RcbiAgICBpZiAodGhpcy5nZXROb2RlRGVncmVlV2l0aENoaWxkcmVuKG5vZGUpID09PSAwICYmIChwYXJlbnQuaWQgPT0gdW5kZWZpbmVkIHx8ICF0aGlzLmdldFRvQmVUaWxlZChwYXJlbnQpKSkge1xuICAgICAgemVyb0RlZ3JlZS5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENyZWF0ZSBhIG1hcCBvZiBwYXJlbnQgbm9kZSBhbmQgaXRzIHplcm8gZGVncmVlIG1lbWJlcnNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB6ZXJvRGVncmVlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSB6ZXJvRGVncmVlW2ldOyAvLyBaZXJvIGRlZ3JlZSBub2RlIGl0c2VsZlxuICAgIHZhciBwX2lkID0gbm9kZS5nZXRQYXJlbnQoKS5pZDsgLy8gUGFyZW50IGlkXG5cbiAgICBpZiAodHlwZW9mIHRlbXBNZW1iZXJHcm91cHNbcF9pZF0gPT09IFwidW5kZWZpbmVkXCIpIHRlbXBNZW1iZXJHcm91cHNbcF9pZF0gPSBbXTtcblxuICAgIHRlbXBNZW1iZXJHcm91cHNbcF9pZF0gPSB0ZW1wTWVtYmVyR3JvdXBzW3BfaWRdLmNvbmNhdChub2RlKTsgLy8gUHVzaCBub2RlIHRvIHRoZSBsaXN0IGJlbG9uZ3MgdG8gaXRzIHBhcmVudCBpbiB0ZW1wTWVtYmVyR3JvdXBzXG4gIH1cblxuICAvLyBJZiB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIG5vZGVzIGF0IGEgbGV2ZWwsIGNyZWF0ZSBhIGR1bW15IGNvbXBvdW5kIGZvciB0aGVtXG4gIE9iamVjdC5rZXlzKHRlbXBNZW1iZXJHcm91cHMpLmZvckVhY2goZnVuY3Rpb24gKHBfaWQpIHtcbiAgICBpZiAodGVtcE1lbWJlckdyb3Vwc1twX2lkXS5sZW5ndGggPiAxKSB7XG4gICAgICB2YXIgZHVtbXlDb21wb3VuZElkID0gXCJEdW1teUNvbXBvdW5kX1wiICsgcF9pZDsgLy8gVGhlIGlkIG9mIGR1bW15IGNvbXBvdW5kIHdoaWNoIHdpbGwgYmUgY3JlYXRlZCBzb29uXG4gICAgICBzZWxmLm1lbWJlckdyb3Vwc1tkdW1teUNvbXBvdW5kSWRdID0gdGVtcE1lbWJlckdyb3Vwc1twX2lkXTsgLy8gQWRkIGR1bW15IGNvbXBvdW5kIHRvIG1lbWJlckdyb3Vwc1xuXG4gICAgICB2YXIgcGFyZW50ID0gdGVtcE1lbWJlckdyb3Vwc1twX2lkXVswXS5nZXRQYXJlbnQoKTsgLy8gVGhlIHBhcmVudCBvZiB6ZXJvIGRlZ3JlZSBub2RlcyB3aWxsIGJlIHRoZSBwYXJlbnQgb2YgbmV3IGR1bW15IGNvbXBvdW5kXG5cbiAgICAgIC8vIENyZWF0ZSBhIGR1bW15IGNvbXBvdW5kIHdpdGggY2FsY3VsYXRlZCBpZFxuICAgICAgdmFyIGR1bW15Q29tcG91bmQgPSBuZXcgQ29TRU5vZGUoc2VsZi5ncmFwaE1hbmFnZXIpO1xuICAgICAgZHVtbXlDb21wb3VuZC5pZCA9IGR1bW15Q29tcG91bmRJZDtcbiAgICAgIGR1bW15Q29tcG91bmQucGFkZGluZ0xlZnQgPSBwYXJlbnQucGFkZGluZ0xlZnQgfHwgMDtcbiAgICAgIGR1bW15Q29tcG91bmQucGFkZGluZ1JpZ2h0ID0gcGFyZW50LnBhZGRpbmdSaWdodCB8fCAwO1xuICAgICAgZHVtbXlDb21wb3VuZC5wYWRkaW5nQm90dG9tID0gcGFyZW50LnBhZGRpbmdCb3R0b20gfHwgMDtcbiAgICAgIGR1bW15Q29tcG91bmQucGFkZGluZ1RvcCA9IHBhcmVudC5wYWRkaW5nVG9wIHx8IDA7XG5cbiAgICAgIHNlbGYuaWRUb0R1bW15Tm9kZVtkdW1teUNvbXBvdW5kSWRdID0gZHVtbXlDb21wb3VuZDtcblxuICAgICAgdmFyIGR1bW15UGFyZW50R3JhcGggPSBzZWxmLmdldEdyYXBoTWFuYWdlcigpLmFkZChzZWxmLm5ld0dyYXBoKCksIGR1bW15Q29tcG91bmQpO1xuICAgICAgdmFyIHBhcmVudEdyYXBoID0gcGFyZW50LmdldENoaWxkKCk7XG5cbiAgICAgIC8vIEFkZCBkdW1teSBjb21wb3VuZCB0byBwYXJlbnQgdGhlIGdyYXBoXG4gICAgICBwYXJlbnRHcmFwaC5hZGQoZHVtbXlDb21wb3VuZCk7XG5cbiAgICAgIC8vIEZvciBlYWNoIHplcm8gZGVncmVlIG5vZGUgaW4gdGhpcyBsZXZlbCByZW1vdmUgaXQgZnJvbSBpdHMgcGFyZW50IGdyYXBoIGFuZCBhZGQgaXQgdG8gdGhlIGdyYXBoIG9mIGR1bW15IHBhcmVudFxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZW1wTWVtYmVyR3JvdXBzW3BfaWRdLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlID0gdGVtcE1lbWJlckdyb3Vwc1twX2lkXVtpXTtcblxuICAgICAgICBwYXJlbnRHcmFwaC5yZW1vdmUobm9kZSk7XG4gICAgICAgIGR1bW15UGFyZW50R3JhcGguYWRkKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5jbGVhckNvbXBvdW5kcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNoaWxkR3JhcGhNYXAgPSB7fTtcbiAgdmFyIGlkVG9Ob2RlID0ge307XG5cbiAgLy8gR2V0IGNvbXBvdW5kIG9yZGVyaW5nIGJ5IGZpbmRpbmcgdGhlIGlubmVyIG9uZSBmaXJzdFxuICB0aGlzLnBlcmZvcm1ERlNPbkNvbXBvdW5kcygpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb21wb3VuZE9yZGVyLmxlbmd0aDsgaSsrKSB7XG5cbiAgICBpZFRvTm9kZVt0aGlzLmNvbXBvdW5kT3JkZXJbaV0uaWRdID0gdGhpcy5jb21wb3VuZE9yZGVyW2ldO1xuICAgIGNoaWxkR3JhcGhNYXBbdGhpcy5jb21wb3VuZE9yZGVyW2ldLmlkXSA9IFtdLmNvbmNhdCh0aGlzLmNvbXBvdW5kT3JkZXJbaV0uZ2V0Q2hpbGQoKS5nZXROb2RlcygpKTtcblxuICAgIC8vIFJlbW92ZSBjaGlsZHJlbiBvZiBjb21wb3VuZHNcbiAgICB0aGlzLmdyYXBoTWFuYWdlci5yZW1vdmUodGhpcy5jb21wb3VuZE9yZGVyW2ldLmdldENoaWxkKCkpO1xuICAgIHRoaXMuY29tcG91bmRPcmRlcltpXS5jaGlsZCA9IG51bGw7XG4gIH1cblxuICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbE5vZGVzKCk7XG5cbiAgLy8gVGlsZSB0aGUgcmVtb3ZlZCBjaGlsZHJlblxuICB0aGlzLnRpbGVDb21wb3VuZE1lbWJlcnMoY2hpbGRHcmFwaE1hcCwgaWRUb05vZGUpO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuY2xlYXJaZXJvRGVncmVlTWVtYmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgdGlsZWRaZXJvRGVncmVlUGFjayA9IHRoaXMudGlsZWRaZXJvRGVncmVlUGFjayA9IFtdO1xuXG4gIE9iamVjdC5rZXlzKHRoaXMubWVtYmVyR3JvdXBzKS5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBjb21wb3VuZE5vZGUgPSBzZWxmLmlkVG9EdW1teU5vZGVbaWRdOyAvLyBHZXQgdGhlIGR1bW15IGNvbXBvdW5kXG5cbiAgICB0aWxlZFplcm9EZWdyZWVQYWNrW2lkXSA9IHNlbGYudGlsZU5vZGVzKHNlbGYubWVtYmVyR3JvdXBzW2lkXSwgY29tcG91bmROb2RlLnBhZGRpbmdMZWZ0ICsgY29tcG91bmROb2RlLnBhZGRpbmdSaWdodCk7XG5cbiAgICAvLyBTZXQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGR1bW15IGNvbXBvdW5kIGFzIGNhbGN1bGF0ZWRcbiAgICBjb21wb3VuZE5vZGUucmVjdC53aWR0aCA9IHRpbGVkWmVyb0RlZ3JlZVBhY2tbaWRdLndpZHRoO1xuICAgIGNvbXBvdW5kTm9kZS5yZWN0LmhlaWdodCA9IHRpbGVkWmVyb0RlZ3JlZVBhY2tbaWRdLmhlaWdodDtcbiAgICBjb21wb3VuZE5vZGUuc2V0Q2VudGVyKHRpbGVkWmVyb0RlZ3JlZVBhY2tbaWRdLmNlbnRlclgsIHRpbGVkWmVyb0RlZ3JlZVBhY2tbaWRdLmNlbnRlclkpO1xuXG4gICAgLy8gY29tcG91bmQgbGVmdCBhbmQgdG9wIG1hcmdpbmdzIGZvciBsYWJlbHNcbiAgICAvLyB3aGVuIG5vZGUgbGFiZWxzIGFyZSBpbmNsdWRlZCwgdGhlc2UgdmFsdWVzIG1heSBiZSBzZXQgdG8gZGlmZmVyZW50IHZhbHVlcyBiZWxvdyBhbmQgYXJlIHVzZWQgaW4gdGlsaW5nUG9zdExheW91dCxcbiAgICAvLyBvdGhlcndpc2UgdGhleSBzdGF5IGFzIHplcm9cbiAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5MZWZ0ID0gMDtcbiAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5Ub3AgPSAwO1xuXG4gICAgLy8gVXBkYXRlIGNvbXBvdW5kIGJvdW5kcyBjb25zaWRlcmluZyBpdHMgbGFiZWwgcHJvcGVydGllcyBhbmQgc2V0IGxhYmVsIG1hcmdpbnMgZm9yIGxlZnQgYW5kIHRvcFxuICAgIGlmIChDb1NFQ29uc3RhbnRzLk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUykge1xuXG4gICAgICB2YXIgd2lkdGggPSBjb21wb3VuZE5vZGUucmVjdC53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSBjb21wb3VuZE5vZGUucmVjdC5oZWlnaHQ7XG5cbiAgICAgIGlmIChjb21wb3VuZE5vZGUubGFiZWxXaWR0aCkge1xuICAgICAgICBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcImxlZnRcIikge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5yZWN0LnggLT0gY29tcG91bmROb2RlLmxhYmVsV2lkdGg7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldFdpZHRoKHdpZHRoICsgY29tcG91bmROb2RlLmxhYmVsV2lkdGgpO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpbkxlZnQgPSBjb21wb3VuZE5vZGUubGFiZWxXaWR0aDtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NIb3Jpem9udGFsID09IFwiY2VudGVyXCIgJiYgY29tcG91bmROb2RlLmxhYmVsV2lkdGggPiB3aWR0aCkge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5yZWN0LnggLT0gKGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoIC0gd2lkdGgpIC8gMjtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0V2lkdGgoY29tcG91bmROb2RlLmxhYmVsV2lkdGgpO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpbkxlZnQgPSAoY29tcG91bmROb2RlLmxhYmVsV2lkdGggLSB3aWR0aCkgLyAyO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc0hvcml6b250YWwgPT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldFdpZHRoKHdpZHRoICsgY29tcG91bmROb2RlLmxhYmVsV2lkdGgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQpIHtcbiAgICAgICAgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc1ZlcnRpY2FsID09IFwidG9wXCIpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUucmVjdC55IC09IGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodDtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0SGVpZ2h0KGhlaWdodCArIGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCk7XG4gICAgICAgICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luVG9wID0gY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0O1xuICAgICAgICB9IGVsc2UgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc1ZlcnRpY2FsID09IFwiY2VudGVyXCIgJiYgY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0ID4gaGVpZ2h0KSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnJlY3QueSAtPSAoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0IC0gaGVpZ2h0KSAvIDI7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldEhlaWdodChjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQpO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpblRvcCA9IChjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQgLSBoZWlnaHQpIC8gMjtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NWZXJ0aWNhbCA9PSBcImJvdHRvbVwiKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldEhlaWdodChoZWlnaHQgKyBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnJlcG9wdWxhdGVDb21wb3VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIGZvciAodmFyIGkgPSB0aGlzLmNvbXBvdW5kT3JkZXIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgbENvbXBvdW5kTm9kZSA9IHRoaXMuY29tcG91bmRPcmRlcltpXTtcbiAgICB2YXIgaWQgPSBsQ29tcG91bmROb2RlLmlkO1xuICAgIHZhciBob3Jpem9udGFsTWFyZ2luID0gbENvbXBvdW5kTm9kZS5wYWRkaW5nTGVmdDtcbiAgICB2YXIgdmVydGljYWxNYXJnaW4gPSBsQ29tcG91bmROb2RlLnBhZGRpbmdUb3A7XG4gICAgdmFyIGxhYmVsTWFyZ2luTGVmdCA9IGxDb21wb3VuZE5vZGUubGFiZWxNYXJnaW5MZWZ0O1xuICAgIHZhciBsYWJlbE1hcmdpblRvcCA9IGxDb21wb3VuZE5vZGUubGFiZWxNYXJnaW5Ub3A7XG5cbiAgICB0aGlzLmFkanVzdExvY2F0aW9ucyh0aGlzLnRpbGVkTWVtYmVyUGFja1tpZF0sIGxDb21wb3VuZE5vZGUucmVjdC54LCBsQ29tcG91bmROb2RlLnJlY3QueSwgaG9yaXpvbnRhbE1hcmdpbiwgdmVydGljYWxNYXJnaW4sIGxhYmVsTWFyZ2luTGVmdCwgbGFiZWxNYXJnaW5Ub3ApO1xuICB9XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5yZXBvcHVsYXRlWmVyb0RlZ3JlZU1lbWJlcnMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHRpbGVkUGFjayA9IHRoaXMudGlsZWRaZXJvRGVncmVlUGFjaztcblxuICBPYmplY3Qua2V5cyh0aWxlZFBhY2spLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGNvbXBvdW5kTm9kZSA9IHNlbGYuaWRUb0R1bW15Tm9kZVtpZF07IC8vIEdldCB0aGUgZHVtbXkgY29tcG91bmQgYnkgaXRzIGlkXG4gICAgdmFyIGhvcml6b250YWxNYXJnaW4gPSBjb21wb3VuZE5vZGUucGFkZGluZ0xlZnQ7XG4gICAgdmFyIHZlcnRpY2FsTWFyZ2luID0gY29tcG91bmROb2RlLnBhZGRpbmdUb3A7XG4gICAgdmFyIGxhYmVsTWFyZ2luTGVmdCA9IGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpbkxlZnQ7XG4gICAgdmFyIGxhYmVsTWFyZ2luVG9wID0gY29tcG91bmROb2RlLmxhYmVsTWFyZ2luVG9wO1xuXG4gICAgLy8gQWRqdXN0IHRoZSBwb3NpdGlvbnMgb2Ygbm9kZXMgd3J0IGl0cyBjb21wb3VuZFxuICAgIHNlbGYuYWRqdXN0TG9jYXRpb25zKHRpbGVkUGFja1tpZF0sIGNvbXBvdW5kTm9kZS5yZWN0LngsIGNvbXBvdW5kTm9kZS5yZWN0LnksIGhvcml6b250YWxNYXJnaW4sIHZlcnRpY2FsTWFyZ2luLCBsYWJlbE1hcmdpbkxlZnQsIGxhYmVsTWFyZ2luVG9wKTtcbiAgfSk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5nZXRUb0JlVGlsZWQgPSBmdW5jdGlvbiAobm9kZSkge1xuICB2YXIgaWQgPSBub2RlLmlkO1xuICAvL2ZpcnN0bHkgY2hlY2sgdGhlIHByZXZpb3VzIHJlc3VsdHNcbiAgaWYgKHRoaXMudG9CZVRpbGVkW2lkXSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMudG9CZVRpbGVkW2lkXTtcbiAgfVxuXG4gIC8vb25seSBjb21wb3VuZCBub2RlcyBhcmUgdG8gYmUgdGlsZWRcbiAgdmFyIGNoaWxkR3JhcGggPSBub2RlLmdldENoaWxkKCk7XG4gIGlmIChjaGlsZEdyYXBoID09IG51bGwpIHtcbiAgICB0aGlzLnRvQmVUaWxlZFtpZF0gPSBmYWxzZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgY2hpbGRyZW4gPSBjaGlsZEdyYXBoLmdldE5vZGVzKCk7IC8vIEdldCB0aGUgY2hpbGRyZW4gbm9kZXNcblxuICAvL2EgY29tcG91bmQgbm9kZSBpcyBub3QgdG8gYmUgdGlsZWQgaWYgYWxsIG9mIGl0cyBjb21wb3VuZCBjaGlsZHJlbiBhcmUgbm90IHRvIGJlIHRpbGVkXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdGhlQ2hpbGQgPSBjaGlsZHJlbltpXTtcblxuICAgIGlmICh0aGlzLmdldE5vZGVEZWdyZWUodGhlQ2hpbGQpID4gMCkge1xuICAgICAgdGhpcy50b0JlVGlsZWRbaWRdID0gZmFsc2U7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy9wYXNzIHRoZSBjaGlsZHJlbiBub3QgaGF2aW5nIHRoZSBjb21wb3VuZCBzdHJ1Y3R1cmVcbiAgICBpZiAodGhlQ2hpbGQuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgICB0aGlzLnRvQmVUaWxlZFt0aGVDaGlsZC5pZF0gPSBmYWxzZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5nZXRUb0JlVGlsZWQodGhlQ2hpbGQpKSB7XG4gICAgICB0aGlzLnRvQmVUaWxlZFtpZF0gPSBmYWxzZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgdGhpcy50b0JlVGlsZWRbaWRdID0gdHJ1ZTtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vLyBHZXQgZGVncmVlIG9mIGEgbm9kZSBkZXBlbmRpbmcgb2YgaXRzIGVkZ2VzIGFuZCBpbmRlcGVuZGVudCBvZiBpdHMgY2hpbGRyZW5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmdldE5vZGVEZWdyZWUgPSBmdW5jdGlvbiAobm9kZSkge1xuICB2YXIgaWQgPSBub2RlLmlkO1xuICB2YXIgZWRnZXMgPSBub2RlLmdldEVkZ2VzKCk7XG4gIHZhciBkZWdyZWUgPSAwO1xuXG4gIC8vIEZvciB0aGUgZWRnZXMgY29ubmVjdGVkXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWRnZSA9IGVkZ2VzW2ldO1xuICAgIGlmIChlZGdlLmdldFNvdXJjZSgpLmlkICE9PSBlZGdlLmdldFRhcmdldCgpLmlkKSB7XG4gICAgICBkZWdyZWUgPSBkZWdyZWUgKyAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVncmVlO1xufTtcblxuLy8gR2V0IGRlZ3JlZSBvZiBhIG5vZGUgd2l0aCBpdHMgY2hpbGRyZW5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmdldE5vZGVEZWdyZWVXaXRoQ2hpbGRyZW4gPSBmdW5jdGlvbiAobm9kZSkge1xuICB2YXIgZGVncmVlID0gdGhpcy5nZXROb2RlRGVncmVlKG5vZGUpO1xuICBpZiAobm9kZS5nZXRDaGlsZCgpID09IG51bGwpIHtcbiAgICByZXR1cm4gZGVncmVlO1xuICB9XG4gIHZhciBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGQoKS5nZXROb2RlcygpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgZGVncmVlICs9IHRoaXMuZ2V0Tm9kZURlZ3JlZVdpdGhDaGlsZHJlbihjaGlsZCk7XG4gIH1cbiAgcmV0dXJuIGRlZ3JlZTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnBlcmZvcm1ERlNPbkNvbXBvdW5kcyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5jb21wb3VuZE9yZGVyID0gW107XG4gIHRoaXMuZmlsbENvbXBleE9yZGVyQnlERlModGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldE5vZGVzKCkpO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuZmlsbENvbXBleE9yZGVyQnlERlMgPSBmdW5jdGlvbiAoY2hpbGRyZW4pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgIGlmIChjaGlsZC5nZXRDaGlsZCgpICE9IG51bGwpIHtcbiAgICAgIHRoaXMuZmlsbENvbXBleE9yZGVyQnlERlMoY2hpbGQuZ2V0Q2hpbGQoKS5nZXROb2RlcygpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ2V0VG9CZVRpbGVkKGNoaWxkKSkge1xuICAgICAgdGhpcy5jb21wb3VuZE9yZGVyLnB1c2goY2hpbGQpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4qIFRoaXMgbWV0aG9kIHBsYWNlcyBlYWNoIHplcm8gZGVncmVlIG1lbWJlciB3cnQgZ2l2ZW4gKHgseSkgY29vcmRpbmF0ZXMgKHRvcCBsZWZ0KS5cbiovXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5hZGp1c3RMb2NhdGlvbnMgPSBmdW5jdGlvbiAob3JnYW5pemF0aW9uLCB4LCB5LCBjb21wb3VuZEhvcml6b250YWxNYXJnaW4sIGNvbXBvdW5kVmVydGljYWxNYXJnaW4sIGNvbXBvdW5kTGFiZWxNYXJnaW5MZWZ0LCBjb21wb3VuZExhYmVsTWFyZ2luVG9wKSB7XG4gIHggKz0gY29tcG91bmRIb3Jpem9udGFsTWFyZ2luICsgY29tcG91bmRMYWJlbE1hcmdpbkxlZnQ7XG4gIHkgKz0gY29tcG91bmRWZXJ0aWNhbE1hcmdpbiArIGNvbXBvdW5kTGFiZWxNYXJnaW5Ub3A7XG5cbiAgdmFyIGxlZnQgPSB4O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgb3JnYW5pemF0aW9uLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcm93ID0gb3JnYW5pemF0aW9uLnJvd3NbaV07XG4gICAgeCA9IGxlZnQ7XG4gICAgdmFyIG1heEhlaWdodCA9IDA7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJvdy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIGxub2RlID0gcm93W2pdO1xuXG4gICAgICBsbm9kZS5yZWN0LnggPSB4OyAvLyArIGxub2RlLnJlY3Qud2lkdGggLyAyO1xuICAgICAgbG5vZGUucmVjdC55ID0geTsgLy8gKyBsbm9kZS5yZWN0LmhlaWdodCAvIDI7XG5cbiAgICAgIHggKz0gbG5vZGUucmVjdC53aWR0aCArIG9yZ2FuaXphdGlvbi5ob3Jpem9udGFsUGFkZGluZztcblxuICAgICAgaWYgKGxub2RlLnJlY3QuaGVpZ2h0ID4gbWF4SGVpZ2h0KSBtYXhIZWlnaHQgPSBsbm9kZS5yZWN0LmhlaWdodDtcbiAgICB9XG5cbiAgICB5ICs9IG1heEhlaWdodCArIG9yZ2FuaXphdGlvbi52ZXJ0aWNhbFBhZGRpbmc7XG4gIH1cbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnRpbGVDb21wb3VuZE1lbWJlcnMgPSBmdW5jdGlvbiAoY2hpbGRHcmFwaE1hcCwgaWRUb05vZGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLnRpbGVkTWVtYmVyUGFjayA9IFtdO1xuXG4gIE9iamVjdC5rZXlzKGNoaWxkR3JhcGhNYXApLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgLy8gR2V0IHRoZSBjb21wb3VuZCBub2RlXG4gICAgdmFyIGNvbXBvdW5kTm9kZSA9IGlkVG9Ob2RlW2lkXTtcblxuICAgIHNlbGYudGlsZWRNZW1iZXJQYWNrW2lkXSA9IHNlbGYudGlsZU5vZGVzKGNoaWxkR3JhcGhNYXBbaWRdLCBjb21wb3VuZE5vZGUucGFkZGluZ0xlZnQgKyBjb21wb3VuZE5vZGUucGFkZGluZ1JpZ2h0KTtcblxuICAgIGNvbXBvdW5kTm9kZS5yZWN0LndpZHRoID0gc2VsZi50aWxlZE1lbWJlclBhY2tbaWRdLndpZHRoO1xuICAgIGNvbXBvdW5kTm9kZS5yZWN0LmhlaWdodCA9IHNlbGYudGlsZWRNZW1iZXJQYWNrW2lkXS5oZWlnaHQ7XG4gICAgY29tcG91bmROb2RlLnNldENlbnRlcihzZWxmLnRpbGVkTWVtYmVyUGFja1tpZF0uY2VudGVyWCwgc2VsZi50aWxlZE1lbWJlclBhY2tbaWRdLmNlbnRlclkpO1xuXG4gICAgLy8gY29tcG91bmQgbGVmdCBhbmQgdG9wIG1hcmdpbmdzIGZvciBsYWJlbHNcbiAgICAvLyB3aGVuIG5vZGUgbGFiZWxzIGFyZSBpbmNsdWRlZCwgdGhlc2UgdmFsdWVzIG1heSBiZSBzZXQgdG8gZGlmZmVyZW50IHZhbHVlcyBiZWxvdyBhbmQgYXJlIHVzZWQgaW4gdGlsaW5nUG9zdExheW91dCxcbiAgICAvLyBvdGhlcndpc2UgdGhleSBzdGF5IGFzIHplcm9cbiAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5MZWZ0ID0gMDtcbiAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5Ub3AgPSAwO1xuXG4gICAgLy8gVXBkYXRlIGNvbXBvdW5kIGJvdW5kcyBjb25zaWRlcmluZyBpdHMgbGFiZWwgcHJvcGVydGllcyBhbmQgc2V0IGxhYmVsIG1hcmdpbnMgZm9yIGxlZnQgYW5kIHRvcFxuICAgIGlmIChDb1NFQ29uc3RhbnRzLk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUykge1xuXG4gICAgICB2YXIgd2lkdGggPSBjb21wb3VuZE5vZGUucmVjdC53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSBjb21wb3VuZE5vZGUucmVjdC5oZWlnaHQ7XG5cbiAgICAgIGlmIChjb21wb3VuZE5vZGUubGFiZWxXaWR0aCkge1xuICAgICAgICBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcImxlZnRcIikge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5yZWN0LnggLT0gY29tcG91bmROb2RlLmxhYmVsV2lkdGg7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldFdpZHRoKHdpZHRoICsgY29tcG91bmROb2RlLmxhYmVsV2lkdGgpO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpbkxlZnQgPSBjb21wb3VuZE5vZGUubGFiZWxXaWR0aDtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NIb3Jpem9udGFsID09IFwiY2VudGVyXCIgJiYgY29tcG91bmROb2RlLmxhYmVsV2lkdGggPiB3aWR0aCkge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5yZWN0LnggLT0gKGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoIC0gd2lkdGgpIC8gMjtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0V2lkdGgoY29tcG91bmROb2RlLmxhYmVsV2lkdGgpO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpbkxlZnQgPSAoY29tcG91bmROb2RlLmxhYmVsV2lkdGggLSB3aWR0aCkgLyAyO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc0hvcml6b250YWwgPT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldFdpZHRoKHdpZHRoICsgY29tcG91bmROb2RlLmxhYmVsV2lkdGgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQpIHtcbiAgICAgICAgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc1ZlcnRpY2FsID09IFwidG9wXCIpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUucmVjdC55IC09IGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodDtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0SGVpZ2h0KGhlaWdodCArIGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCk7XG4gICAgICAgICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luVG9wID0gY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0O1xuICAgICAgICB9IGVsc2UgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc1ZlcnRpY2FsID09IFwiY2VudGVyXCIgJiYgY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0ID4gaGVpZ2h0KSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnJlY3QueSAtPSAoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0IC0gaGVpZ2h0KSAvIDI7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldEhlaWdodChjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQpO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpblRvcCA9IChjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQgLSBoZWlnaHQpIC8gMjtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NWZXJ0aWNhbCA9PSBcImJvdHRvbVwiKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldEhlaWdodChoZWlnaHQgKyBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnRpbGVOb2RlcyA9IGZ1bmN0aW9uIChub2RlcywgbWluV2lkdGgpIHtcbiAgdmFyIGhvcml6b250YWxPcmcgPSB0aGlzLnRpbGVOb2Rlc0J5RmF2b3JpbmdEaW0obm9kZXMsIG1pbldpZHRoLCB0cnVlKTtcbiAgdmFyIHZlcnRpY2FsT3JnID0gdGhpcy50aWxlTm9kZXNCeUZhdm9yaW5nRGltKG5vZGVzLCBtaW5XaWR0aCwgZmFsc2UpO1xuXG4gIHZhciBob3Jpem9udGFsUmF0aW8gPSB0aGlzLmdldE9yZ1JhdGlvKGhvcml6b250YWxPcmcpO1xuICB2YXIgdmVydGljYWxSYXRpbyA9IHRoaXMuZ2V0T3JnUmF0aW8odmVydGljYWxPcmcpO1xuICB2YXIgYmVzdE9yZztcblxuICAvLyB0aGUgYmVzdCByYXRpbyBpcyB0aGUgb25lIHRoYXQgaXMgY2xvc2VyIHRvIDEgc2luY2UgdGhlIHJhdGlvcyBhcmUgYWxyZWFkeSBub3JtYWxpemVkXG4gIC8vIGFuZCB0aGUgYmVzdCBvcmdhbml6YXRpb24gaXMgdGhlIG9uZSB0aGF0IGhhcyB0aGUgYmVzdCByYXRpb1xuICBpZiAodmVydGljYWxSYXRpbyA8IGhvcml6b250YWxSYXRpbykge1xuICAgIGJlc3RPcmcgPSB2ZXJ0aWNhbE9yZztcbiAgfSBlbHNlIHtcbiAgICBiZXN0T3JnID0gaG9yaXpvbnRhbE9yZztcbiAgfVxuXG4gIHJldHVybiBiZXN0T3JnO1xufTtcblxuLy8gZ2V0IHRoZSB3aWR0aC9oZWlnaHQgcmF0aW8gb2YgdGhlIG9yZ2FuaXphdGlvbiB0aGF0IGlzIG5vcm1hbGl6ZWQgc28gdGhhdCBpdCB3aWxsIG5vdCBiZSBsZXNzIHRoYW4gMVxuQ29TRUxheW91dC5wcm90b3R5cGUuZ2V0T3JnUmF0aW8gPSBmdW5jdGlvbiAob3JnYW5pemF0aW9uKSB7XG4gIC8vIGdldCBkaW1lbnNpb25zIGFuZCBjYWxjdWxhdGUgdGhlIGluaXRpYWwgcmF0aW9cbiAgdmFyIHdpZHRoID0gb3JnYW5pemF0aW9uLndpZHRoO1xuICB2YXIgaGVpZ2h0ID0gb3JnYW5pemF0aW9uLmhlaWdodDtcbiAgdmFyIHJhdGlvID0gd2lkdGggLyBoZWlnaHQ7XG5cbiAgLy8gaWYgdGhlIGluaXRpYWwgcmF0aW8gaXMgbGVzcyB0aGVuIDEgdGhlbiBpbnZlcnNlIGl0XG4gIGlmIChyYXRpbyA8IDEpIHtcbiAgICByYXRpbyA9IDEgLyByYXRpbztcbiAgfVxuXG4gIC8vIHJldHVybiB0aGUgbm9ybWFsaXplZCByYXRpb1xuICByZXR1cm4gcmF0aW87XG59O1xuXG4vKlxuICogQ2FsY3VsYXRlcyB0aGUgaWRlYWwgd2lkdGggZm9yIHRoZSByb3dzLiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXRcbiAqIGVhY2ggbm9kZSBoYXMgdGhlIHNhbWUgc2l6ZXMgYW5kIGNhbGN1bGF0ZXMgdGhlIGlkZWFsIHJvdyB3aWR0aCB0aGF0XG4gKiBhcHByb3hpbWF0ZXMgYSBzcXVhcmUgc2hhcGVkIGNvbXBsZXggYWNjb3JkaW5nbHkuIEhvd2V2ZXIsIHNpbmNlIG5vZGVzIHdvdWxkXG4gKiBoYXZlIGRpZmZlcmVudCBzaXplcyBzb21lIHJvd3Mgd291bGQgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMgYW5kIHRoZSByZXN1bHRpbmdcbiAqIHNoYXBlIHdvdWxkIG5vdCBiZSBhbiBleGFjdCBzcXVhcmUuXG4gKi9cbkNvU0VMYXlvdXQucHJvdG90eXBlLmNhbGNJZGVhbFJvd1dpZHRoID0gZnVuY3Rpb24gKG1lbWJlcnMsIGZhdm9ySG9yaXpvbnRhbERpbSkge1xuICAvLyBUbyBhcHByb3hpbWF0ZSBhIHNxdWFyZSBzaGFwZWQgY29tcGxleCB3ZSBuZWVkIHRvIG1ha2UgY29tcGxleCB3aWR0aCBlcXVhbCB0byBjb21wbGV4IGhlaWdodC5cbiAgLy8gVG8gYWNoaWV2ZSB0aGlzIHdlIG5lZWQgdG8gc29sdmUgdGhlIGZvbGxvd2luZyBlcXVhdGlvbiBzeXN0ZW0gZm9yIGhjOlxuICAvLyAoeCArIGJ4KSAqIGhjIC0gYnggPSAoeSArIGJ5KSAqIHZjIC0gYnksIGhjICogdmMgPSBuXG4gIC8vIHdoZXJlIHggaXMgdGhlIGF2YXJhZ2Ugd2lkdGggb2YgdGhlIG5vZGVzLCB5IGlzIHRoZSBhdmFyYWdlIGhlaWdodCBvZiBub2Rlc1xuICAvLyBieCBhbmQgYnkgYXJlIHRoZSBidWZmZXIgc2l6ZXMgaW4gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZGltZW5zaW9ucyBhY2NvcmRpbmdseSxcbiAgLy8gaGMgYW5kIHZjIGFyZSB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZGltZW5zaW9uc1xuICAvLyBuIGlzIG51bWJlciBvZiBtZW1iZXJzLlxuXG4gIHZhciB2ZXJ0aWNhbFBhZGRpbmcgPSBDb1NFQ29uc3RhbnRzLlRJTElOR19QQURESU5HX1ZFUlRJQ0FMO1xuICB2YXIgaG9yaXpvbnRhbFBhZGRpbmcgPSBDb1NFQ29uc3RhbnRzLlRJTElOR19QQURESU5HX0hPUklaT05UQUw7XG5cbiAgLy8gbnVtYmVyIG9mIG1lbWJlcnNcbiAgdmFyIG1lbWJlcnNTaXplID0gbWVtYmVycy5sZW5ndGg7XG5cbiAgLy8gc3VtIG9mIHRoZSB3aWR0aCBvZiBhbGwgbWVtYmVyc1xuICB2YXIgdG90YWxXaWR0aCA9IDA7XG5cbiAgLy8gc3VtIG9mIHRoZSBoZWlnaHQgb2YgYWxsIG1lbWJlcnNcbiAgdmFyIHRvdGFsSGVpZ2h0ID0gMDtcblxuICB2YXIgbWF4V2lkdGggPSAwO1xuXG4gIC8vIHRyYXZlcnNlIGFsbCBtZW1iZXJzIHRvIGNhbGN1bGF0ZSB0b3RhbCB3aWR0aCBhbmQgdG90YWwgaGVpZ2h0IGFuZCBnZXQgdGhlIG1heGltdW0gbWVtYmVycyB3aWR0aFxuICBtZW1iZXJzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB0b3RhbFdpZHRoICs9IG5vZGUuZ2V0V2lkdGgoKTtcbiAgICB0b3RhbEhlaWdodCArPSBub2RlLmdldEhlaWdodCgpO1xuXG4gICAgaWYgKG5vZGUuZ2V0V2lkdGgoKSA+IG1heFdpZHRoKSB7XG4gICAgICBtYXhXaWR0aCA9IG5vZGUuZ2V0V2lkdGgoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIGF2ZXJhZ2Ugd2lkdGggb2YgdGhlIG1lbWJlcnNcbiAgdmFyIGF2ZXJhZ2VXaWR0aCA9IHRvdGFsV2lkdGggLyBtZW1iZXJzU2l6ZTtcblxuICAvLyBhdmVyYWdlIGhlaWdodCBvZiB0aGUgbWVtYmVyc1xuICB2YXIgYXZlcmFnZUhlaWdodCA9IHRvdGFsSGVpZ2h0IC8gbWVtYmVyc1NpemU7XG5cbiAgLy8gc29sdmluZyB0aGUgaW5pdGlhbCBlcXVhdGlvbiBzeXN0ZW0gZm9yIHRoZSBoYyB5aWVsZHMgdGhlIGZvbGxvd2luZyBzZWNvbmQgZGVncmVlIGVxdWF0aW9uOlxuICAvLyBoY14yICogKHgrYngpICsgaGMgKiAoYnkgLSBieCkgLSBuICogKHkgKyBieSkgPSAwXG5cbiAgLy8gdGhlIGRlbHRhIHZhbHVlIHRvIHNvbHZlIHRoZSBlcXVhdGlvbiBhYm92ZSBmb3IgaGNcbiAgdmFyIGRlbHRhID0gTWF0aC5wb3codmVydGljYWxQYWRkaW5nIC0gaG9yaXpvbnRhbFBhZGRpbmcsIDIpICsgNCAqIChhdmVyYWdlV2lkdGggKyBob3Jpem9udGFsUGFkZGluZykgKiAoYXZlcmFnZUhlaWdodCArIHZlcnRpY2FsUGFkZGluZykgKiBtZW1iZXJzU2l6ZTtcblxuICAvLyBzb2x2ZSB0aGUgZXF1YXRpb24gdXNpbmcgZGVsdGEgdmFsdWUgdG8gY2FsY3VsYXRlIHRoZSBob3Jpem9udGFsIGNvdW50XG4gIC8vIHRoYXQgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIGFuIGlkZWFsIHJvd1xuICB2YXIgaG9yaXpvbnRhbENvdW50RG91YmxlID0gKGhvcml6b250YWxQYWRkaW5nIC0gdmVydGljYWxQYWRkaW5nICsgTWF0aC5zcXJ0KGRlbHRhKSkgLyAoMiAqIChhdmVyYWdlV2lkdGggKyBob3Jpem9udGFsUGFkZGluZykpO1xuICAvLyByb3VuZCB0aGUgY2FsY3VsYXRlZCBob3Jpem9udGFsIGNvdW50IHVwIG9yIGRvd24gYWNjb3JkaW5nIHRvIHRoZSBmYXZvcmVkIGRpbWVuc2lvblxuICB2YXIgaG9yaXpvbnRhbENvdW50O1xuXG4gIGlmIChmYXZvckhvcml6b250YWxEaW0pIHtcbiAgICBob3Jpem9udGFsQ291bnQgPSBNYXRoLmNlaWwoaG9yaXpvbnRhbENvdW50RG91YmxlKTtcbiAgICAvLyBpZiBob3Jpem9udGFsQ291bnQgY291bnQgaXMgbm90IGEgZmxvYXQgdmFsdWUgdGhlbiBib3RoIG9mIHJvdW5kaW5nIHRvIGZsb29yIGFuZCBjZWlsXG4gICAgLy8gd2lsbCB5aWVsZCB0aGUgc2FtZSB2YWx1ZXMuIEluc3RlYWQgb2YgcmVwZWF0aW5nIHRoZSBzYW1lIGNhbGN1bGF0aW9uIHRyeSBnb2luZyB1cFxuICAgIC8vIHdoaWxlIGZhdm9yaW5nIGhvcml6b250YWwgZGltZW5zaW9uIGluIHN1Y2ggY2FzZXNcbiAgICBpZiAoaG9yaXpvbnRhbENvdW50ID09IGhvcml6b250YWxDb3VudERvdWJsZSkge1xuICAgICAgaG9yaXpvbnRhbENvdW50Kys7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGhvcml6b250YWxDb3VudCA9IE1hdGguZmxvb3IoaG9yaXpvbnRhbENvdW50RG91YmxlKTtcbiAgfVxuXG4gIC8vIGlkZWFsIHdpZHRoIHRvIGJlIGNhbGN1bGF0ZWRcbiAgdmFyIGlkZWFsV2lkdGggPSBob3Jpem9udGFsQ291bnQgKiAoYXZlcmFnZVdpZHRoICsgaG9yaXpvbnRhbFBhZGRpbmcpIC0gaG9yaXpvbnRhbFBhZGRpbmc7XG5cbiAgLy8gaWYgbWF4IHdpZHRoIGlzIGJpZ2dlciB0aGFuIGNhbGN1bGF0ZWQgaWRlYWwgd2lkdGggcmVzZXQgaWRlYWwgd2lkdGggdG8gaXRcbiAgaWYgKG1heFdpZHRoID4gaWRlYWxXaWR0aCkge1xuICAgIGlkZWFsV2lkdGggPSBtYXhXaWR0aDtcbiAgfVxuXG4gIC8vIGFkZCB0aGUgbGVmdC1yaWdodCBtYXJnaW5zIHRvIHRoZSBpZGVhbCByb3cgd2lkdGhcbiAgaWRlYWxXaWR0aCArPSBob3Jpem9udGFsUGFkZGluZyAqIDI7XG5cbiAgLy8gcmV0dXJuIHRoZSBpZGVhbCByb3cgd2lkdGgxXG4gIHJldHVybiBpZGVhbFdpZHRoO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUudGlsZU5vZGVzQnlGYXZvcmluZ0RpbSA9IGZ1bmN0aW9uIChub2RlcywgbWluV2lkdGgsIGZhdm9ySG9yaXpvbnRhbERpbSkge1xuICB2YXIgdmVydGljYWxQYWRkaW5nID0gQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19WRVJUSUNBTDtcbiAgdmFyIGhvcml6b250YWxQYWRkaW5nID0gQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19IT1JJWk9OVEFMO1xuICB2YXIgdGlsaW5nQ29tcGFyZUJ5ID0gQ29TRUNvbnN0YW50cy5USUxJTkdfQ09NUEFSRV9CWTtcbiAgdmFyIG9yZ2FuaXphdGlvbiA9IHtcbiAgICByb3dzOiBbXSxcbiAgICByb3dXaWR0aDogW10sXG4gICAgcm93SGVpZ2h0OiBbXSxcbiAgICB3aWR0aDogMCxcbiAgICBoZWlnaHQ6IG1pbldpZHRoLCAvLyBhc3N1bWUgbWluSGVpZ2h0IGVxdWFscyB0byBtaW5XaWR0aFxuICAgIHZlcnRpY2FsUGFkZGluZzogdmVydGljYWxQYWRkaW5nLFxuICAgIGhvcml6b250YWxQYWRkaW5nOiBob3Jpem9udGFsUGFkZGluZyxcbiAgICBjZW50ZXJYOiAwLFxuICAgIGNlbnRlclk6IDBcbiAgfTtcblxuICBpZiAodGlsaW5nQ29tcGFyZUJ5KSB7XG4gICAgb3JnYW5pemF0aW9uLmlkZWFsUm93V2lkdGggPSB0aGlzLmNhbGNJZGVhbFJvd1dpZHRoKG5vZGVzLCBmYXZvckhvcml6b250YWxEaW0pO1xuICB9XG5cbiAgdmFyIGdldE5vZGVBcmVhID0gZnVuY3Rpb24gZ2V0Tm9kZUFyZWEobikge1xuICAgIHJldHVybiBuLnJlY3Qud2lkdGggKiBuLnJlY3QuaGVpZ2h0O1xuICB9O1xuXG4gIHZhciBhcmVhQ29tcGFyZUZjbiA9IGZ1bmN0aW9uIGFyZWFDb21wYXJlRmNuKG4xLCBuMikge1xuICAgIHJldHVybiBnZXROb2RlQXJlYShuMikgLSBnZXROb2RlQXJlYShuMSk7XG4gIH07XG5cbiAgLy8gU29ydCB0aGUgbm9kZXMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiB0aGVpciBhcmVhc1xuICBub2Rlcy5zb3J0KGZ1bmN0aW9uIChuMSwgbjIpIHtcbiAgICB2YXIgY21wQnkgPSBhcmVhQ29tcGFyZUZjbjtcbiAgICBpZiAob3JnYW5pemF0aW9uLmlkZWFsUm93V2lkdGgpIHtcbiAgICAgIGNtcEJ5ID0gdGlsaW5nQ29tcGFyZUJ5O1xuICAgICAgcmV0dXJuIGNtcEJ5KG4xLmlkLCBuMi5pZCk7XG4gICAgfVxuICAgIHJldHVybiBjbXBCeShuMSwgbjIpO1xuICB9KTtcblxuICAvLyBDcmVhdGUgdGhlIG9yZ2FuaXphdGlvbiAtPiBjYWxjdWxhdGUgY29tcG91bmQgY2VudGVyXG4gIHZhciBzdW1DZW50ZXJYID0gMDtcbiAgdmFyIHN1bUNlbnRlclkgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGxOb2RlID0gbm9kZXNbaV07XG5cbiAgICBzdW1DZW50ZXJYICs9IGxOb2RlLmdldENlbnRlclgoKTtcbiAgICBzdW1DZW50ZXJZICs9IGxOb2RlLmdldENlbnRlclkoKTtcbiAgfVxuXG4gIG9yZ2FuaXphdGlvbi5jZW50ZXJYID0gc3VtQ2VudGVyWCAvIG5vZGVzLmxlbmd0aDtcbiAgb3JnYW5pemF0aW9uLmNlbnRlclkgPSBzdW1DZW50ZXJZIC8gbm9kZXMubGVuZ3RoO1xuXG4gIC8vIENyZWF0ZSB0aGUgb3JnYW5pemF0aW9uIC0+IHRpbGUgbWVtYmVyc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGxOb2RlID0gbm9kZXNbaV07XG5cbiAgICBpZiAob3JnYW5pemF0aW9uLnJvd3MubGVuZ3RoID09IDApIHtcbiAgICAgIHRoaXMuaW5zZXJ0Tm9kZVRvUm93KG9yZ2FuaXphdGlvbiwgbE5vZGUsIDAsIG1pbldpZHRoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2FuQWRkSG9yaXpvbnRhbChvcmdhbml6YXRpb24sIGxOb2RlLnJlY3Qud2lkdGgsIGxOb2RlLnJlY3QuaGVpZ2h0KSkge1xuICAgICAgdmFyIHJvd0luZGV4ID0gb3JnYW5pemF0aW9uLnJvd3MubGVuZ3RoIC0gMTtcbiAgICAgIGlmICghb3JnYW5pemF0aW9uLmlkZWFsUm93V2lkdGgpIHtcbiAgICAgICAgcm93SW5kZXggPSB0aGlzLmdldFNob3J0ZXN0Um93SW5kZXgob3JnYW5pemF0aW9uKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5zZXJ0Tm9kZVRvUm93KG9yZ2FuaXphdGlvbiwgbE5vZGUsIHJvd0luZGV4LCBtaW5XaWR0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5zZXJ0Tm9kZVRvUm93KG9yZ2FuaXphdGlvbiwgbE5vZGUsIG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aCwgbWluV2lkdGgpO1xuICAgIH1cblxuICAgIHRoaXMuc2hpZnRUb0xhc3RSb3cob3JnYW5pemF0aW9uKTtcbiAgfVxuXG4gIHJldHVybiBvcmdhbml6YXRpb247XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5pbnNlcnROb2RlVG9Sb3cgPSBmdW5jdGlvbiAob3JnYW5pemF0aW9uLCBub2RlLCByb3dJbmRleCwgbWluV2lkdGgpIHtcbiAgdmFyIG1pbkNvbXBvdW5kU2l6ZSA9IG1pbldpZHRoO1xuXG4gIC8vIEFkZCBuZXcgcm93IGlmIG5lZWRlZFxuICBpZiAocm93SW5kZXggPT0gb3JnYW5pemF0aW9uLnJvd3MubGVuZ3RoKSB7XG4gICAgdmFyIHNlY29uZERpbWVuc2lvbiA9IFtdO1xuXG4gICAgb3JnYW5pemF0aW9uLnJvd3MucHVzaChzZWNvbmREaW1lbnNpb24pO1xuICAgIG9yZ2FuaXphdGlvbi5yb3dXaWR0aC5wdXNoKG1pbkNvbXBvdW5kU2l6ZSk7XG4gICAgb3JnYW5pemF0aW9uLnJvd0hlaWdodC5wdXNoKDApO1xuICB9XG5cbiAgLy8gVXBkYXRlIHJvdyB3aWR0aFxuICB2YXIgdyA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtyb3dJbmRleF0gKyBub2RlLnJlY3Qud2lkdGg7XG5cbiAgaWYgKG9yZ2FuaXphdGlvbi5yb3dzW3Jvd0luZGV4XS5sZW5ndGggPiAwKSB7XG4gICAgdyArPSBvcmdhbml6YXRpb24uaG9yaXpvbnRhbFBhZGRpbmc7XG4gIH1cblxuICBvcmdhbml6YXRpb24ucm93V2lkdGhbcm93SW5kZXhdID0gdztcbiAgLy8gVXBkYXRlIGNvbXBvdW5kIHdpZHRoXG4gIGlmIChvcmdhbml6YXRpb24ud2lkdGggPCB3KSB7XG4gICAgb3JnYW5pemF0aW9uLndpZHRoID0gdztcbiAgfVxuXG4gIC8vIFVwZGF0ZSBoZWlnaHRcbiAgdmFyIGggPSBub2RlLnJlY3QuaGVpZ2h0O1xuICBpZiAocm93SW5kZXggPiAwKSBoICs9IG9yZ2FuaXphdGlvbi52ZXJ0aWNhbFBhZGRpbmc7XG5cbiAgdmFyIGV4dHJhSGVpZ2h0ID0gMDtcbiAgaWYgKGggPiBvcmdhbml6YXRpb24ucm93SGVpZ2h0W3Jvd0luZGV4XSkge1xuICAgIGV4dHJhSGVpZ2h0ID0gb3JnYW5pemF0aW9uLnJvd0hlaWdodFtyb3dJbmRleF07XG4gICAgb3JnYW5pemF0aW9uLnJvd0hlaWdodFtyb3dJbmRleF0gPSBoO1xuICAgIGV4dHJhSGVpZ2h0ID0gb3JnYW5pemF0aW9uLnJvd0hlaWdodFtyb3dJbmRleF0gLSBleHRyYUhlaWdodDtcbiAgfVxuXG4gIG9yZ2FuaXphdGlvbi5oZWlnaHQgKz0gZXh0cmFIZWlnaHQ7XG5cbiAgLy8gSW5zZXJ0IG5vZGVcbiAgb3JnYW5pemF0aW9uLnJvd3Nbcm93SW5kZXhdLnB1c2gobm9kZSk7XG59O1xuXG4vL1NjYW5zIHRoZSByb3dzIG9mIGFuIG9yZ2FuaXphdGlvbiBhbmQgcmV0dXJucyB0aGUgb25lIHdpdGggdGhlIG1pbiB3aWR0aFxuQ29TRUxheW91dC5wcm90b3R5cGUuZ2V0U2hvcnRlc3RSb3dJbmRleCA9IGZ1bmN0aW9uIChvcmdhbml6YXRpb24pIHtcbiAgdmFyIHIgPSAtMTtcbiAgdmFyIG1pbiA9IE51bWJlci5NQVhfVkFMVUU7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcmdhbml6YXRpb24ucm93cy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChvcmdhbml6YXRpb24ucm93V2lkdGhbaV0gPCBtaW4pIHtcbiAgICAgIHIgPSBpO1xuICAgICAgbWluID0gb3JnYW5pemF0aW9uLnJvd1dpZHRoW2ldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcjtcbn07XG5cbi8vU2NhbnMgdGhlIHJvd3Mgb2YgYW4gb3JnYW5pemF0aW9uIGFuZCByZXR1cm5zIHRoZSBvbmUgd2l0aCB0aGUgbWF4IHdpZHRoXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5nZXRMb25nZXN0Um93SW5kZXggPSBmdW5jdGlvbiAob3JnYW5pemF0aW9uKSB7XG4gIHZhciByID0gLTE7XG4gIHZhciBtYXggPSBOdW1iZXIuTUlOX1ZBTFVFO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgb3JnYW5pemF0aW9uLnJvd3MubGVuZ3RoOyBpKyspIHtcblxuICAgIGlmIChvcmdhbml6YXRpb24ucm93V2lkdGhbaV0gPiBtYXgpIHtcbiAgICAgIHIgPSBpO1xuICAgICAgbWF4ID0gb3JnYW5pemF0aW9uLnJvd1dpZHRoW2ldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByO1xufTtcblxuLyoqXG4qIFRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIGFkZGluZyBleHRyYSB3aWR0aCB0byB0aGUgb3JnYW5pemF0aW9uIHZpb2xhdGVzXG4qIHRoZSBhc3BlY3QgcmF0aW8oMSkgb3Igbm90LlxuKi9cbkNvU0VMYXlvdXQucHJvdG90eXBlLmNhbkFkZEhvcml6b250YWwgPSBmdW5jdGlvbiAob3JnYW5pemF0aW9uLCBleHRyYVdpZHRoLCBleHRyYUhlaWdodCkge1xuXG4gIC8vIGlmIHRoZXJlIGlzIGFuIGlkZWFsIHJvdyB3aWR0aCBzcGVjaWZpZWQgdXNlIGl0IGluc3RlYWQgb2YgY2hlY2tpbmcgdGhlIGFzcGVjdCByYXRpb1xuICBpZiAob3JnYW5pemF0aW9uLmlkZWFsUm93V2lkdGgpIHtcbiAgICB2YXIgbGFzdFJvd0luZGV4ID0gb3JnYW5pemF0aW9uLnJvd3MubGVuZ3RoIC0gMTtcbiAgICB2YXIgbGFzdFJvd1dpZHRoID0gb3JnYW5pemF0aW9uLnJvd1dpZHRoW2xhc3RSb3dJbmRleF07XG5cbiAgICAvLyBjaGVjayBhbmQgcmV0dXJuIGlmIGlkZWFsIHJvdyB3aWR0aCB3aWxsIGJlIGV4Y2VlZCBpZiB0aGUgbm9kZSBpcyBhZGRlZCB0byB0aGUgcm93XG4gICAgcmV0dXJuIGxhc3RSb3dXaWR0aCArIGV4dHJhV2lkdGggKyBvcmdhbml6YXRpb24uaG9yaXpvbnRhbFBhZGRpbmcgPD0gb3JnYW5pemF0aW9uLmlkZWFsUm93V2lkdGg7XG4gIH1cblxuICB2YXIgc3JpID0gdGhpcy5nZXRTaG9ydGVzdFJvd0luZGV4KG9yZ2FuaXphdGlvbik7XG5cbiAgaWYgKHNyaSA8IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBtaW4gPSBvcmdhbml6YXRpb24ucm93V2lkdGhbc3JpXTtcblxuICBpZiAobWluICsgb3JnYW5pemF0aW9uLmhvcml6b250YWxQYWRkaW5nICsgZXh0cmFXaWR0aCA8PSBvcmdhbml6YXRpb24ud2lkdGgpIHJldHVybiB0cnVlO1xuXG4gIHZhciBoRGlmZiA9IDA7XG5cbiAgLy8gQWRkaW5nIHRvIGFuIGV4aXN0aW5nIHJvd1xuICBpZiAob3JnYW5pemF0aW9uLnJvd0hlaWdodFtzcmldIDwgZXh0cmFIZWlnaHQpIHtcbiAgICBpZiAoc3JpID4gMCkgaERpZmYgPSBleHRyYUhlaWdodCArIG9yZ2FuaXphdGlvbi52ZXJ0aWNhbFBhZGRpbmcgLSBvcmdhbml6YXRpb24ucm93SGVpZ2h0W3NyaV07XG4gIH1cblxuICB2YXIgYWRkX3RvX3Jvd19yYXRpbztcbiAgaWYgKG9yZ2FuaXphdGlvbi53aWR0aCAtIG1pbiA+PSBleHRyYVdpZHRoICsgb3JnYW5pemF0aW9uLmhvcml6b250YWxQYWRkaW5nKSB7XG4gICAgYWRkX3RvX3Jvd19yYXRpbyA9IChvcmdhbml6YXRpb24uaGVpZ2h0ICsgaERpZmYpIC8gKG1pbiArIGV4dHJhV2lkdGggKyBvcmdhbml6YXRpb24uaG9yaXpvbnRhbFBhZGRpbmcpO1xuICB9IGVsc2Uge1xuICAgIGFkZF90b19yb3dfcmF0aW8gPSAob3JnYW5pemF0aW9uLmhlaWdodCArIGhEaWZmKSAvIG9yZ2FuaXphdGlvbi53aWR0aDtcbiAgfVxuXG4gIC8vIEFkZGluZyBhIG5ldyByb3cgZm9yIHRoaXMgbm9kZVxuICBoRGlmZiA9IGV4dHJhSGVpZ2h0ICsgb3JnYW5pemF0aW9uLnZlcnRpY2FsUGFkZGluZztcbiAgdmFyIGFkZF9uZXdfcm93X3JhdGlvO1xuICBpZiAob3JnYW5pemF0aW9uLndpZHRoIDwgZXh0cmFXaWR0aCkge1xuICAgIGFkZF9uZXdfcm93X3JhdGlvID0gKG9yZ2FuaXphdGlvbi5oZWlnaHQgKyBoRGlmZikgLyBleHRyYVdpZHRoO1xuICB9IGVsc2Uge1xuICAgIGFkZF9uZXdfcm93X3JhdGlvID0gKG9yZ2FuaXphdGlvbi5oZWlnaHQgKyBoRGlmZikgLyBvcmdhbml6YXRpb24ud2lkdGg7XG4gIH1cblxuICBpZiAoYWRkX25ld19yb3dfcmF0aW8gPCAxKSBhZGRfbmV3X3Jvd19yYXRpbyA9IDEgLyBhZGRfbmV3X3Jvd19yYXRpbztcblxuICBpZiAoYWRkX3RvX3Jvd19yYXRpbyA8IDEpIGFkZF90b19yb3dfcmF0aW8gPSAxIC8gYWRkX3RvX3Jvd19yYXRpbztcblxuICByZXR1cm4gYWRkX3RvX3Jvd19yYXRpbyA8IGFkZF9uZXdfcm93X3JhdGlvO1xufTtcblxuLy9JZiBtb3ZpbmcgdGhlIGxhc3Qgbm9kZSBmcm9tIHRoZSBsb25nZXN0IHJvdyBhbmQgYWRkaW5nIGl0IHRvIHRoZSBsYXN0XG4vL3JvdyBtYWtlcyB0aGUgYm91bmRpbmcgYm94IHNtYWxsZXIsIGRvIGl0LlxuQ29TRUxheW91dC5wcm90b3R5cGUuc2hpZnRUb0xhc3RSb3cgPSBmdW5jdGlvbiAob3JnYW5pemF0aW9uKSB7XG4gIHZhciBsb25nZXN0ID0gdGhpcy5nZXRMb25nZXN0Um93SW5kZXgob3JnYW5pemF0aW9uKTtcbiAgdmFyIGxhc3QgPSBvcmdhbml6YXRpb24ucm93V2lkdGgubGVuZ3RoIC0gMTtcbiAgdmFyIHJvdyA9IG9yZ2FuaXphdGlvbi5yb3dzW2xvbmdlc3RdO1xuICB2YXIgbm9kZSA9IHJvd1tyb3cubGVuZ3RoIC0gMV07XG5cbiAgdmFyIGRpZmYgPSBub2RlLndpZHRoICsgb3JnYW5pemF0aW9uLmhvcml6b250YWxQYWRkaW5nO1xuXG4gIC8vIENoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBvbiB0aGUgbGFzdCByb3dcbiAgaWYgKG9yZ2FuaXphdGlvbi53aWR0aCAtIG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtsYXN0XSA+IGRpZmYgJiYgbG9uZ2VzdCAhPSBsYXN0KSB7XG4gICAgLy8gUmVtb3ZlIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIGxvbmdlc3Qgcm93XG4gICAgcm93LnNwbGljZSgtMSwgMSk7XG5cbiAgICAvLyBQdXNoIGl0IHRvIHRoZSBsYXN0IHJvd1xuICAgIG9yZ2FuaXphdGlvbi5yb3dzW2xhc3RdLnB1c2gobm9kZSk7XG5cbiAgICBvcmdhbml6YXRpb24ucm93V2lkdGhbbG9uZ2VzdF0gPSBvcmdhbml6YXRpb24ucm93V2lkdGhbbG9uZ2VzdF0gLSBkaWZmO1xuICAgIG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtsYXN0XSA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtsYXN0XSArIGRpZmY7XG4gICAgb3JnYW5pemF0aW9uLndpZHRoID0gb3JnYW5pemF0aW9uLnJvd1dpZHRoW2luc3RhbmNlLmdldExvbmdlc3RSb3dJbmRleChvcmdhbml6YXRpb24pXTtcblxuICAgIC8vIFVwZGF0ZSBoZWlnaHRzIG9mIHRoZSBvcmdhbml6YXRpb25cbiAgICB2YXIgbWF4SGVpZ2h0ID0gTnVtYmVyLk1JTl9WQUxVRTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvdy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJvd1tpXS5oZWlnaHQgPiBtYXhIZWlnaHQpIG1heEhlaWdodCA9IHJvd1tpXS5oZWlnaHQ7XG4gICAgfVxuICAgIGlmIChsb25nZXN0ID4gMCkgbWF4SGVpZ2h0ICs9IG9yZ2FuaXphdGlvbi52ZXJ0aWNhbFBhZGRpbmc7XG5cbiAgICB2YXIgcHJldlRvdGFsID0gb3JnYW5pemF0aW9uLnJvd0hlaWdodFtsb25nZXN0XSArIG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbbGFzdF07XG5cbiAgICBvcmdhbml6YXRpb24ucm93SGVpZ2h0W2xvbmdlc3RdID0gbWF4SGVpZ2h0O1xuICAgIGlmIChvcmdhbml6YXRpb24ucm93SGVpZ2h0W2xhc3RdIDwgbm9kZS5oZWlnaHQgKyBvcmdhbml6YXRpb24udmVydGljYWxQYWRkaW5nKSBvcmdhbml6YXRpb24ucm93SGVpZ2h0W2xhc3RdID0gbm9kZS5oZWlnaHQgKyBvcmdhbml6YXRpb24udmVydGljYWxQYWRkaW5nO1xuXG4gICAgdmFyIGZpbmFsVG90YWwgPSBvcmdhbml6YXRpb24ucm93SGVpZ2h0W2xvbmdlc3RdICsgb3JnYW5pemF0aW9uLnJvd0hlaWdodFtsYXN0XTtcbiAgICBvcmdhbml6YXRpb24uaGVpZ2h0ICs9IGZpbmFsVG90YWwgLSBwcmV2VG90YWw7XG5cbiAgICB0aGlzLnNoaWZ0VG9MYXN0Um93KG9yZ2FuaXphdGlvbik7XG4gIH1cbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnRpbGluZ1ByZUxheW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKENvU0VDb25zdGFudHMuVElMRSkge1xuICAgIC8vIEZpbmQgemVybyBkZWdyZWUgbm9kZXMgYW5kIGNyZWF0ZSBhIGNvbXBvdW5kIGZvciBlYWNoIGxldmVsXG4gICAgdGhpcy5ncm91cFplcm9EZWdyZWVNZW1iZXJzKCk7XG4gICAgLy8gVGlsZSBhbmQgY2xlYXIgY2hpbGRyZW4gb2YgZWFjaCBjb21wb3VuZFxuICAgIHRoaXMuY2xlYXJDb21wb3VuZHMoKTtcbiAgICAvLyBTZXBhcmF0ZWx5IHRpbGUgYW5kIGNsZWFyIHplcm8gZGVncmVlIG5vZGVzIGZvciBlYWNoIGxldmVsXG4gICAgdGhpcy5jbGVhclplcm9EZWdyZWVNZW1iZXJzKCk7XG4gIH1cbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnRpbGluZ1Bvc3RMYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChDb1NFQ29uc3RhbnRzLlRJTEUpIHtcbiAgICB0aGlzLnJlcG9wdWxhdGVaZXJvRGVncmVlTWVtYmVycygpO1xuICAgIHRoaXMucmVwb3B1bGF0ZUNvbXBvdW5kcygpO1xuICB9XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VjdGlvbjogVHJlZSBSZWR1Y3Rpb24gbWV0aG9kc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlZHVjZSB0cmVlcyBcbkNvU0VMYXlvdXQucHJvdG90eXBlLnJlZHVjZVRyZWVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcHJ1bmVkTm9kZXNBbGwgPSBbXTtcbiAgdmFyIGNvbnRhaW5zTGVhZiA9IHRydWU7XG4gIHZhciBub2RlO1xuXG4gIHdoaWxlIChjb250YWluc0xlYWYpIHtcbiAgICB2YXIgYWxsTm9kZXMgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxOb2RlcygpO1xuICAgIHZhciBwcnVuZWROb2Rlc0luU3RlcFRlbXAgPSBbXTtcbiAgICBjb250YWluc0xlYWYgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5vZGUgPSBhbGxOb2Rlc1tpXTtcbiAgICAgIGlmIChub2RlLmdldEVkZ2VzKCkubGVuZ3RoID09IDEgJiYgIW5vZGUuZ2V0RWRnZXMoKVswXS5pc0ludGVyR3JhcGggJiYgbm9kZS5nZXRDaGlsZCgpID09IG51bGwpIHtcbiAgICAgICAgaWYgKENvU0VDb25zdGFudHMuUFVSRV9JTkNSRU1FTlRBTCkge1xuICAgICAgICAgIHZhciBvdGhlckVuZCA9IG5vZGUuZ2V0RWRnZXMoKVswXS5nZXRPdGhlckVuZChub2RlKTtcbiAgICAgICAgICB2YXIgcmVsYXRpdmVQb3NpdGlvbiA9IG5ldyBEaW1lbnNpb25EKG5vZGUuZ2V0Q2VudGVyWCgpIC0gb3RoZXJFbmQuZ2V0Q2VudGVyWCgpLCBub2RlLmdldENlbnRlclkoKSAtIG90aGVyRW5kLmdldENlbnRlclkoKSk7XG4gICAgICAgICAgcHJ1bmVkTm9kZXNJblN0ZXBUZW1wLnB1c2goW25vZGUsIG5vZGUuZ2V0RWRnZXMoKVswXSwgbm9kZS5nZXRPd25lcigpLCByZWxhdGl2ZVBvc2l0aW9uXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJ1bmVkTm9kZXNJblN0ZXBUZW1wLnB1c2goW25vZGUsIG5vZGUuZ2V0RWRnZXMoKVswXSwgbm9kZS5nZXRPd25lcigpXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGFpbnNMZWFmID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbnRhaW5zTGVhZiA9PSB0cnVlKSB7XG4gICAgICB2YXIgcHJ1bmVkTm9kZXNJblN0ZXAgPSBbXTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcHJ1bmVkTm9kZXNJblN0ZXBUZW1wLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChwcnVuZWROb2Rlc0luU3RlcFRlbXBbal1bMF0uZ2V0RWRnZXMoKS5sZW5ndGggPT0gMSkge1xuICAgICAgICAgIHBydW5lZE5vZGVzSW5TdGVwLnB1c2gocHJ1bmVkTm9kZXNJblN0ZXBUZW1wW2pdKTtcbiAgICAgICAgICBwcnVuZWROb2Rlc0luU3RlcFRlbXBbal1bMF0uZ2V0T3duZXIoKS5yZW1vdmUocHJ1bmVkTm9kZXNJblN0ZXBUZW1wW2pdWzBdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHJ1bmVkTm9kZXNBbGwucHVzaChwcnVuZWROb2Rlc0luU3RlcCk7XG4gICAgICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbE5vZGVzKCk7XG4gICAgICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbEVkZ2VzKCk7XG4gICAgfVxuICB9XG4gIHRoaXMucHJ1bmVkTm9kZXNBbGwgPSBwcnVuZWROb2Rlc0FsbDtcbn07XG5cbi8vIEdyb3cgdHJlZSBvbmUgc3RlcCBcbkNvU0VMYXlvdXQucHJvdG90eXBlLmdyb3dUcmVlID0gZnVuY3Rpb24gKHBydW5lZE5vZGVzQWxsKSB7XG4gIHZhciBsZW5ndGhPZlBydW5lZE5vZGVzSW5TdGVwID0gcHJ1bmVkTm9kZXNBbGwubGVuZ3RoO1xuICB2YXIgcHJ1bmVkTm9kZXNJblN0ZXAgPSBwcnVuZWROb2Rlc0FsbFtsZW5ndGhPZlBydW5lZE5vZGVzSW5TdGVwIC0gMV07XG5cbiAgdmFyIG5vZGVEYXRhO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBydW5lZE5vZGVzSW5TdGVwLmxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZURhdGEgPSBwcnVuZWROb2Rlc0luU3RlcFtpXTtcblxuICAgIHRoaXMuZmluZFBsYWNlZm9yUHJ1bmVkTm9kZShub2RlRGF0YSk7XG5cbiAgICBub2RlRGF0YVsyXS5hZGQobm9kZURhdGFbMF0pO1xuICAgIG5vZGVEYXRhWzJdLmFkZChub2RlRGF0YVsxXSwgbm9kZURhdGFbMV0uc291cmNlLCBub2RlRGF0YVsxXS50YXJnZXQpO1xuICB9XG5cbiAgcHJ1bmVkTm9kZXNBbGwuc3BsaWNlKHBydW5lZE5vZGVzQWxsLmxlbmd0aCAtIDEsIDEpO1xuICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbE5vZGVzKCk7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsRWRnZXMoKTtcbn07XG5cbi8vIEZpbmQgYW4gYXBwcm9wcmlhdGUgcG9zaXRpb24gdG8gcmVwbGFjZSBwcnVuZWQgbm9kZSwgdGhpcyBtZXRob2QgY2FuIGJlIGltcHJvdmVkXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5maW5kUGxhY2Vmb3JQcnVuZWROb2RlID0gZnVuY3Rpb24gKG5vZGVEYXRhKSB7XG5cbiAgdmFyIGdyaWRGb3JQcnVuZWROb2RlO1xuICB2YXIgbm9kZVRvQ29ubmVjdDtcbiAgdmFyIHBydW5lZE5vZGUgPSBub2RlRGF0YVswXTtcbiAgaWYgKHBydW5lZE5vZGUgPT0gbm9kZURhdGFbMV0uc291cmNlKSB7XG4gICAgbm9kZVRvQ29ubmVjdCA9IG5vZGVEYXRhWzFdLnRhcmdldDtcbiAgfSBlbHNlIHtcbiAgICBub2RlVG9Db25uZWN0ID0gbm9kZURhdGFbMV0uc291cmNlO1xuICB9XG5cbiAgaWYgKENvU0VDb25zdGFudHMuUFVSRV9JTkNSRU1FTlRBTCkge1xuICAgIHBydW5lZE5vZGUuc2V0Q2VudGVyKG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWCgpICsgbm9kZURhdGFbM10uZ2V0V2lkdGgoKSwgbm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJZKCkgKyBub2RlRGF0YVszXS5nZXRIZWlnaHQoKSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHN0YXJ0R3JpZFggPSBub2RlVG9Db25uZWN0LnN0YXJ0WDtcbiAgICB2YXIgZmluaXNoR3JpZFggPSBub2RlVG9Db25uZWN0LmZpbmlzaFg7XG4gICAgdmFyIHN0YXJ0R3JpZFkgPSBub2RlVG9Db25uZWN0LnN0YXJ0WTtcbiAgICB2YXIgZmluaXNoR3JpZFkgPSBub2RlVG9Db25uZWN0LmZpbmlzaFk7XG5cbiAgICB2YXIgdXBOb2RlQ291bnQgPSAwO1xuICAgIHZhciBkb3duTm9kZUNvdW50ID0gMDtcbiAgICB2YXIgcmlnaHROb2RlQ291bnQgPSAwO1xuICAgIHZhciBsZWZ0Tm9kZUNvdW50ID0gMDtcbiAgICB2YXIgY29udHJvbFJlZ2lvbnMgPSBbdXBOb2RlQ291bnQsIHJpZ2h0Tm9kZUNvdW50LCBkb3duTm9kZUNvdW50LCBsZWZ0Tm9kZUNvdW50XTtcblxuICAgIGlmIChzdGFydEdyaWRZID4gMCkge1xuICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0R3JpZFg7IGkgPD0gZmluaXNoR3JpZFg7IGkrKykge1xuICAgICAgICBjb250cm9sUmVnaW9uc1swXSArPSB0aGlzLmdyaWRbaV1bc3RhcnRHcmlkWSAtIDFdLmxlbmd0aCArIHRoaXMuZ3JpZFtpXVtzdGFydEdyaWRZXS5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmluaXNoR3JpZFggPCB0aGlzLmdyaWQubGVuZ3RoIC0gMSkge1xuICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0R3JpZFk7IGkgPD0gZmluaXNoR3JpZFk7IGkrKykge1xuICAgICAgICBjb250cm9sUmVnaW9uc1sxXSArPSB0aGlzLmdyaWRbZmluaXNoR3JpZFggKyAxXVtpXS5sZW5ndGggKyB0aGlzLmdyaWRbZmluaXNoR3JpZFhdW2ldLmxlbmd0aCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaW5pc2hHcmlkWSA8IHRoaXMuZ3JpZFswXS5sZW5ndGggLSAxKSB7XG4gICAgICBmb3IgKHZhciBpID0gc3RhcnRHcmlkWDsgaSA8PSBmaW5pc2hHcmlkWDsgaSsrKSB7XG4gICAgICAgIGNvbnRyb2xSZWdpb25zWzJdICs9IHRoaXMuZ3JpZFtpXVtmaW5pc2hHcmlkWSArIDFdLmxlbmd0aCArIHRoaXMuZ3JpZFtpXVtmaW5pc2hHcmlkWV0ubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0YXJ0R3JpZFggPiAwKSB7XG4gICAgICBmb3IgKHZhciBpID0gc3RhcnRHcmlkWTsgaSA8PSBmaW5pc2hHcmlkWTsgaSsrKSB7XG4gICAgICAgIGNvbnRyb2xSZWdpb25zWzNdICs9IHRoaXMuZ3JpZFtzdGFydEdyaWRYIC0gMV1baV0ubGVuZ3RoICsgdGhpcy5ncmlkW3N0YXJ0R3JpZFhdW2ldLmxlbmd0aCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBtaW4gPSBJbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICB2YXIgbWluQ291bnQ7XG4gICAgdmFyIG1pbkluZGV4O1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29udHJvbFJlZ2lvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChjb250cm9sUmVnaW9uc1tqXSA8IG1pbikge1xuICAgICAgICBtaW4gPSBjb250cm9sUmVnaW9uc1tqXTtcbiAgICAgICAgbWluQ291bnQgPSAxO1xuICAgICAgICBtaW5JbmRleCA9IGo7XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xSZWdpb25zW2pdID09IG1pbikge1xuICAgICAgICBtaW5Db3VudCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtaW5Db3VudCA9PSAzICYmIG1pbiA9PSAwKSB7XG4gICAgICBpZiAoY29udHJvbFJlZ2lvbnNbMF0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1sxXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzJdID09IDApIHtcbiAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAxO1xuICAgICAgfSBlbHNlIGlmIChjb250cm9sUmVnaW9uc1swXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzFdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbM10gPT0gMCkge1xuICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDA7XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xSZWdpb25zWzBdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbMl0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1szXSA9PSAwKSB7XG4gICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMztcbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbFJlZ2lvbnNbMV0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1syXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzNdID09IDApIHtcbiAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAyO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobWluQ291bnQgPT0gMiAmJiBtaW4gPT0gMCkge1xuICAgICAgdmFyIHJhbmRvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDIpO1xuICAgICAgaWYgKGNvbnRyb2xSZWdpb25zWzBdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbMV0gPT0gMCkge1xuICAgICAgICA7XG4gICAgICAgIGlmIChyYW5kb20gPT0gMCkge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbFJlZ2lvbnNbMF0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1syXSA9PSAwKSB7XG4gICAgICAgIGlmIChyYW5kb20gPT0gMCkge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbFJlZ2lvbnNbMF0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1szXSA9PSAwKSB7XG4gICAgICAgIGlmIChyYW5kb20gPT0gMCkge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbFJlZ2lvbnNbMV0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1syXSA9PSAwKSB7XG4gICAgICAgIGlmIChyYW5kb20gPT0gMCkge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbFJlZ2lvbnNbMV0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1szXSA9PSAwKSB7XG4gICAgICAgIGlmIChyYW5kb20gPT0gMCkge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChyYW5kb20gPT0gMCkge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1pbkNvdW50ID09IDQgJiYgbWluID09IDApIHtcbiAgICAgIHZhciByYW5kb20gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA0KTtcbiAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gcmFuZG9tO1xuICAgIH0gZWxzZSB7XG4gICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IG1pbkluZGV4O1xuICAgIH1cblxuICAgIGlmIChncmlkRm9yUHJ1bmVkTm9kZSA9PSAwKSB7XG4gICAgICBwcnVuZWROb2RlLnNldENlbnRlcihub2RlVG9Db25uZWN0LmdldENlbnRlclgoKSwgbm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJZKCkgLSBub2RlVG9Db25uZWN0LmdldEhlaWdodCgpIC8gMiAtIEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggLSBwcnVuZWROb2RlLmdldEhlaWdodCgpIC8gMik7XG4gICAgfSBlbHNlIGlmIChncmlkRm9yUHJ1bmVkTm9kZSA9PSAxKSB7XG4gICAgICBwcnVuZWROb2RlLnNldENlbnRlcihub2RlVG9Db25uZWN0LmdldENlbnRlclgoKSArIG5vZGVUb0Nvbm5lY3QuZ2V0V2lkdGgoKSAvIDIgKyBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIICsgcHJ1bmVkTm9kZS5nZXRXaWR0aCgpIC8gMiwgbm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJZKCkpO1xuICAgIH0gZWxzZSBpZiAoZ3JpZEZvclBydW5lZE5vZGUgPT0gMikge1xuICAgICAgcHJ1bmVkTm9kZS5zZXRDZW50ZXIobm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJYKCksIG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWSgpICsgbm9kZVRvQ29ubmVjdC5nZXRIZWlnaHQoKSAvIDIgKyBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIICsgcHJ1bmVkTm9kZS5nZXRIZWlnaHQoKSAvIDIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcnVuZWROb2RlLnNldENlbnRlcihub2RlVG9Db25uZWN0LmdldENlbnRlclgoKSAtIG5vZGVUb0Nvbm5lY3QuZ2V0V2lkdGgoKSAvIDIgLSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIC0gcHJ1bmVkTm9kZS5nZXRXaWR0aCgpIC8gMiwgbm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJZKCkpO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb1NFTGF5b3V0O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gOTkxOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIEZETGF5b3V0Tm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5GRExheW91dE5vZGU7XG52YXIgSU1hdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuSU1hdGg7XG5cbmZ1bmN0aW9uIENvU0VOb2RlKGdtLCBsb2MsIHNpemUsIHZOb2RlKSB7XG4gIEZETGF5b3V0Tm9kZS5jYWxsKHRoaXMsIGdtLCBsb2MsIHNpemUsIHZOb2RlKTtcbn1cblxuQ29TRU5vZGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShGRExheW91dE5vZGUucHJvdG90eXBlKTtcbmZvciAodmFyIHByb3AgaW4gRkRMYXlvdXROb2RlKSB7XG4gIENvU0VOb2RlW3Byb3BdID0gRkRMYXlvdXROb2RlW3Byb3BdO1xufVxuXG5Db1NFTm9kZS5wcm90b3R5cGUuY2FsY3VsYXRlRGlzcGxhY2VtZW50ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbGF5b3V0ID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0TGF5b3V0KCk7XG4gIC8vIHRoaXMgY2hlY2sgaXMgZm9yIGNvbXBvdW5kIG5vZGVzIHRoYXQgY29udGFpbiBmaXhlZCBub2Rlc1xuICBpZiAodGhpcy5nZXRDaGlsZCgpICE9IG51bGwgJiYgdGhpcy5maXhlZE5vZGVXZWlnaHQpIHtcbiAgICB0aGlzLmRpc3BsYWNlbWVudFggKz0gbGF5b3V0LmNvb2xpbmdGYWN0b3IgKiAodGhpcy5zcHJpbmdGb3JjZVggKyB0aGlzLnJlcHVsc2lvbkZvcmNlWCArIHRoaXMuZ3Jhdml0YXRpb25Gb3JjZVgpIC8gdGhpcy5maXhlZE5vZGVXZWlnaHQ7XG4gICAgdGhpcy5kaXNwbGFjZW1lbnRZICs9IGxheW91dC5jb29saW5nRmFjdG9yICogKHRoaXMuc3ByaW5nRm9yY2VZICsgdGhpcy5yZXB1bHNpb25Gb3JjZVkgKyB0aGlzLmdyYXZpdGF0aW9uRm9yY2VZKSAvIHRoaXMuZml4ZWROb2RlV2VpZ2h0O1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZGlzcGxhY2VtZW50WCArPSBsYXlvdXQuY29vbGluZ0ZhY3RvciAqICh0aGlzLnNwcmluZ0ZvcmNlWCArIHRoaXMucmVwdWxzaW9uRm9yY2VYICsgdGhpcy5ncmF2aXRhdGlvbkZvcmNlWCkgLyB0aGlzLm5vT2ZDaGlsZHJlbjtcbiAgICB0aGlzLmRpc3BsYWNlbWVudFkgKz0gbGF5b3V0LmNvb2xpbmdGYWN0b3IgKiAodGhpcy5zcHJpbmdGb3JjZVkgKyB0aGlzLnJlcHVsc2lvbkZvcmNlWSArIHRoaXMuZ3Jhdml0YXRpb25Gb3JjZVkpIC8gdGhpcy5ub09mQ2hpbGRyZW47XG4gIH1cblxuICBpZiAoTWF0aC5hYnModGhpcy5kaXNwbGFjZW1lbnRYKSA+IGxheW91dC5jb29saW5nRmFjdG9yICogbGF5b3V0Lm1heE5vZGVEaXNwbGFjZW1lbnQpIHtcbiAgICB0aGlzLmRpc3BsYWNlbWVudFggPSBsYXlvdXQuY29vbGluZ0ZhY3RvciAqIGxheW91dC5tYXhOb2RlRGlzcGxhY2VtZW50ICogSU1hdGguc2lnbih0aGlzLmRpc3BsYWNlbWVudFgpO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKHRoaXMuZGlzcGxhY2VtZW50WSkgPiBsYXlvdXQuY29vbGluZ0ZhY3RvciAqIGxheW91dC5tYXhOb2RlRGlzcGxhY2VtZW50KSB7XG4gICAgdGhpcy5kaXNwbGFjZW1lbnRZID0gbGF5b3V0LmNvb2xpbmdGYWN0b3IgKiBsYXlvdXQubWF4Tm9kZURpc3BsYWNlbWVudCAqIElNYXRoLnNpZ24odGhpcy5kaXNwbGFjZW1lbnRZKTtcbiAgfVxuXG4gIC8vIG5vbi1lbXB0eSBjb21wb3VuZCBub2RlLCBwcm9wb2dhdGUgbW92ZW1lbnQgdG8gY2hpbGRyZW4gYXMgd2VsbFxuICBpZiAodGhpcy5jaGlsZCAmJiB0aGlzLmNoaWxkLmdldE5vZGVzKCkubGVuZ3RoID4gMCkge1xuICAgIHRoaXMucHJvcG9nYXRlRGlzcGxhY2VtZW50VG9DaGlsZHJlbih0aGlzLmRpc3BsYWNlbWVudFgsIHRoaXMuZGlzcGxhY2VtZW50WSk7XG4gIH1cbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5wcm9wb2dhdGVEaXNwbGFjZW1lbnRUb0NoaWxkcmVuID0gZnVuY3Rpb24gKGRYLCBkWSkge1xuICB2YXIgbm9kZXMgPSB0aGlzLmdldENoaWxkKCkuZ2V0Tm9kZXMoKTtcbiAgdmFyIG5vZGU7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBub2RlID0gbm9kZXNbaV07XG4gICAgaWYgKG5vZGUuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgICBub2RlLmRpc3BsYWNlbWVudFggKz0gZFg7XG4gICAgICBub2RlLmRpc3BsYWNlbWVudFkgKz0gZFk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUucHJvcG9nYXRlRGlzcGxhY2VtZW50VG9DaGlsZHJlbihkWCwgZFkpO1xuICAgIH1cbiAgfVxufTtcblxuQ29TRU5vZGUucHJvdG90eXBlLm1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsYXlvdXQgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRMYXlvdXQoKTtcblxuICAvLyBhIHNpbXBsZSBub2RlIG9yIGFuIGVtcHR5IGNvbXBvdW5kIG5vZGUsIG1vdmUgaXRcbiAgaWYgKHRoaXMuY2hpbGQgPT0gbnVsbCB8fCB0aGlzLmNoaWxkLmdldE5vZGVzKCkubGVuZ3RoID09IDApIHtcbiAgICB0aGlzLm1vdmVCeSh0aGlzLmRpc3BsYWNlbWVudFgsIHRoaXMuZGlzcGxhY2VtZW50WSk7XG5cbiAgICBsYXlvdXQudG90YWxEaXNwbGFjZW1lbnQgKz0gTWF0aC5hYnModGhpcy5kaXNwbGFjZW1lbnRYKSArIE1hdGguYWJzKHRoaXMuZGlzcGxhY2VtZW50WSk7XG4gIH1cblxuICB0aGlzLnNwcmluZ0ZvcmNlWCA9IDA7XG4gIHRoaXMuc3ByaW5nRm9yY2VZID0gMDtcbiAgdGhpcy5yZXB1bHNpb25Gb3JjZVggPSAwO1xuICB0aGlzLnJlcHVsc2lvbkZvcmNlWSA9IDA7XG4gIHRoaXMuZ3Jhdml0YXRpb25Gb3JjZVggPSAwO1xuICB0aGlzLmdyYXZpdGF0aW9uRm9yY2VZID0gMDtcbiAgdGhpcy5kaXNwbGFjZW1lbnRYID0gMDtcbiAgdGhpcy5kaXNwbGFjZW1lbnRZID0gMDtcbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5zZXRQcmVkMSA9IGZ1bmN0aW9uIChwcmVkMSkge1xuICB0aGlzLnByZWQxID0gcHJlZDE7XG59O1xuXG5Db1NFTm9kZS5wcm90b3R5cGUuZ2V0UHJlZDEgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBwcmVkMTtcbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5nZXRQcmVkMiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHByZWQyO1xufTtcblxuQ29TRU5vZGUucHJvdG90eXBlLnNldE5leHQgPSBmdW5jdGlvbiAobmV4dCkge1xuICB0aGlzLm5leHQgPSBuZXh0O1xufTtcblxuQ29TRU5vZGUucHJvdG90eXBlLmdldE5leHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXh0O1xufTtcblxuQ29TRU5vZGUucHJvdG90eXBlLnNldFByb2Nlc3NlZCA9IGZ1bmN0aW9uIChwcm9jZXNzZWQpIHtcbiAgdGhpcy5wcm9jZXNzZWQgPSBwcm9jZXNzZWQ7XG59O1xuXG5Db1NFTm9kZS5wcm90b3R5cGUuaXNQcm9jZXNzZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBwcm9jZXNzZWQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvU0VOb2RlO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gOTAyOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSBlbHNlIHsgcmV0dXJuIEFycmF5LmZyb20oYXJyKTsgfSB9XG5cbnZhciBDb1NFQ29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MDYpO1xudmFyIExpbmtlZExpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuTGlua2VkTGlzdDtcbnZhciBNYXRyaXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuTWF0cml4O1xudmFyIFNWRCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5TVkQ7XG5cbmZ1bmN0aW9uIENvbnN0cmFpbnRIYW5kbGVyKCkge31cblxuQ29uc3RyYWludEhhbmRsZXIuaGFuZGxlQ29uc3RyYWludHMgPSBmdW5jdGlvbiAobGF5b3V0KSB7XG4gIC8vICBsZXQgbGF5b3V0ID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0TGF5b3V0KCk7XG5cbiAgLy8gZ2V0IGNvbnN0cmFpbnRzIGZyb20gbGF5b3V0XG4gIHZhciBjb25zdHJhaW50cyA9IHt9O1xuICBjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50ID0gbGF5b3V0LmNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQ7XG4gIGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQgPSBsYXlvdXQuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludDtcbiAgY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50ID0gbGF5b3V0LmNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludDtcblxuICB2YXIgaWRUb05vZGVNYXAgPSBuZXcgTWFwKCk7XG4gIHZhciBub2RlSW5kZXhlcyA9IG5ldyBNYXAoKTtcbiAgdmFyIHhDb29yZHMgPSBbXTtcbiAgdmFyIHlDb29yZHMgPSBbXTtcblxuICB2YXIgYWxsTm9kZXMgPSBsYXlvdXQuZ2V0QWxsTm9kZXMoKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgLy8gZmlsbCBpbmRleCBtYXAgYW5kIGNvb3JkaW5hdGVzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IGFsbE5vZGVzW2ldO1xuICAgIGlmIChub2RlLmdldENoaWxkKCkgPT0gbnVsbCkge1xuICAgICAgbm9kZUluZGV4ZXMuc2V0KG5vZGUuaWQsIGluZGV4KyspO1xuICAgICAgeENvb3Jkcy5wdXNoKG5vZGUuZ2V0Q2VudGVyWCgpKTtcbiAgICAgIHlDb29yZHMucHVzaChub2RlLmdldENlbnRlclkoKSk7XG4gICAgICBpZFRvTm9kZU1hcC5zZXQobm9kZS5pZCwgbm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlcmUgZXhpc3RzIHJlbGF0aXZlIHBsYWNlbWVudCBjb25zdHJhaW50IHdpdGhvdXQgZ2FwIHZhbHVlLCBzZXQgaXQgdG8gZGVmYXVsdCBcbiAgaWYgKGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCkge1xuICAgIGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICBpZiAoIWNvbnN0cmFpbnQuZ2FwICYmIGNvbnN0cmFpbnQuZ2FwICE9IDApIHtcbiAgICAgICAgaWYgKGNvbnN0cmFpbnQubGVmdCkge1xuICAgICAgICAgIGNvbnN0cmFpbnQuZ2FwID0gQ29TRUNvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIICsgaWRUb05vZGVNYXAuZ2V0KGNvbnN0cmFpbnQubGVmdCkuZ2V0V2lkdGgoKSAvIDIgKyBpZFRvTm9kZU1hcC5nZXQoY29uc3RyYWludC5yaWdodCkuZ2V0V2lkdGgoKSAvIDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3RyYWludC5nYXAgPSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggKyBpZFRvTm9kZU1hcC5nZXQoY29uc3RyYWludC50b3ApLmdldEhlaWdodCgpIC8gMiArIGlkVG9Ob2RlTWFwLmdldChjb25zdHJhaW50LmJvdHRvbSkuZ2V0SGVpZ2h0KCkgLyAyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiBhdXhpbGlhcnkgZnVuY3Rpb25zICovXG5cbiAgLy8gY2FsY3VsYXRlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gcG9zaXRpb24gb2JqZWN0c1xuICB2YXIgY2FsY3VsYXRlUG9zaXRpb25EaWZmID0gZnVuY3Rpb24gY2FsY3VsYXRlUG9zaXRpb25EaWZmKHBvczEsIHBvczIpIHtcbiAgICByZXR1cm4geyB4OiBwb3MxLnggLSBwb3MyLngsIHk6IHBvczEueSAtIHBvczIueSB9O1xuICB9O1xuXG4gIC8vIGNhbGN1bGF0ZSBhdmVyYWdlIHBvc2l0aW9uIG9mIHRoZSBub2Rlc1xuICB2YXIgY2FsY3VsYXRlQXZnUG9zaXRpb24gPSBmdW5jdGlvbiBjYWxjdWxhdGVBdmdQb3NpdGlvbihub2RlSWRTZXQpIHtcbiAgICB2YXIgeFBvc1N1bSA9IDA7XG4gICAgdmFyIHlQb3NTdW0gPSAwO1xuICAgIG5vZGVJZFNldC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgIHhQb3NTdW0gKz0geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV07XG4gICAgICB5UG9zU3VtICs9IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgeDogeFBvc1N1bSAvIG5vZGVJZFNldC5zaXplLCB5OiB5UG9zU3VtIC8gbm9kZUlkU2V0LnNpemUgfTtcbiAgfTtcblxuICAvLyBmaW5kIGFuIGFwcHJvcHJpYXRlIHBvc2l0aW9uaW5nIGZvciB0aGUgbm9kZXMgaW4gYSBnaXZlbiBncmFwaCBhY2NvcmRpbmcgdG8gcmVsYXRpdmUgcGxhY2VtZW50IGNvbnN0cmFpbnRzXG4gIC8vIHRoaXMgZnVuY3Rpb24gYWxzbyB0YWtlcyB0aGUgZml4ZWQgbm9kZXMgYW5kIGFsaWdubWVudCBjb25zdHJhaW50cyBpbnRvIGFjY291bnRcbiAgLy8gZ3JhcGg6IGRhZyB0byBiZSBldmFsdWF0ZWQsIGRpcmVjdGlvbjogXCJob3Jpem9udGFsXCIgb3IgXCJ2ZXJ0aWNhbFwiLCBcbiAgLy8gZml4ZWROb2Rlczogc2V0IG9mIGZpeGVkIG5vZGVzIHRvIGNvbnNpZGVyIGR1cmluZyBldmFsdWF0aW9uLCBkdW1teVBvc2l0aW9uczogYXBwcm9wcmlhdGUgY29vcmRpbmF0ZXMgb2YgdGhlIGR1bW15IG5vZGVzICBcbiAgdmFyIGZpbmRBcHByb3ByaWF0ZVBvc2l0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQgPSBmdW5jdGlvbiBmaW5kQXBwcm9wcmlhdGVQb3NpdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50KGdyYXBoLCBkaXJlY3Rpb24sIGZpeGVkTm9kZXMsIGR1bW15UG9zaXRpb25zLCBjb21wb25lbnRTb3VyY2VzKSB7XG5cbiAgICAvLyBmaW5kIHVuaW9uIG9mIHR3byBzZXRzXG4gICAgZnVuY3Rpb24gc2V0VW5pb24oc2V0QSwgc2V0Qikge1xuICAgICAgdmFyIHVuaW9uID0gbmV3IFNldChzZXRBKTtcbiAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlO1xuICAgICAgdmFyIF9pdGVyYXRvckVycm9yID0gdW5kZWZpbmVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBzZXRCW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IChfc3RlcCA9IF9pdGVyYXRvci5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZSkge1xuICAgICAgICAgIHZhciBlbGVtID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgICB1bmlvbi5hZGQoZWxlbSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG4gICAgICAgIF9pdGVyYXRvckVycm9yID0gZXJyO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gJiYgX2l0ZXJhdG9yLnJldHVybikge1xuICAgICAgICAgICAgX2l0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdW5pb247XG4gICAgfVxuXG4gICAgLy8gZmluZCBpbmRlZ3JlZSBjb3VudCBmb3IgZWFjaCBub2RlXG4gICAgdmFyIGluRGVncmVlcyA9IG5ldyBNYXAoKTtcblxuICAgIGdyYXBoLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIGluRGVncmVlcy5zZXQoa2V5LCAwKTtcbiAgICB9KTtcbiAgICBncmFwaC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChhZGphY2VudCkge1xuICAgICAgICBpbkRlZ3JlZXMuc2V0KGFkamFjZW50LmlkLCBpbkRlZ3JlZXMuZ2V0KGFkamFjZW50LmlkKSArIDEpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB2YXIgcG9zaXRpb25NYXAgPSBuZXcgTWFwKCk7IC8vIGtlZXBzIHRoZSBwb3NpdGlvbiBmb3IgZWFjaCBub2RlXG4gICAgdmFyIHBhc3RNYXAgPSBuZXcgTWFwKCk7IC8vIGtlZXBzIHRoZSBwcmVkZWNlc3NvcnMocGFzdCkgb2YgYSBub2RlXG4gICAgdmFyIHF1ZXVlID0gbmV3IExpbmtlZExpc3QoKTtcbiAgICBpbkRlZ3JlZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgaWYgKHZhbHVlID09IDApIHtcbiAgICAgICAgcXVldWUucHVzaChrZXkpO1xuICAgICAgICBpZiAoIWZpeGVkTm9kZXMpIHtcbiAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQoa2V5LCBub2RlSW5kZXhlcy5oYXMoa2V5KSA/IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGtleSldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KGtleSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQoa2V5LCBub2RlSW5kZXhlcy5oYXMoa2V5KSA/IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGtleSldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KGtleSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcG9zaXRpb25NYXAuc2V0KGtleSwgTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaXhlZE5vZGVzKSB7XG4gICAgICAgIHBhc3RNYXAuc2V0KGtleSwgbmV3IFNldChba2V5XSkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gYWxpZ24gc291cmNlcyBvZiBlYWNoIGNvbXBvbmVudCBpbiBlbmZvcmNlbWVudCBwaGFzZVxuICAgIGlmIChmaXhlZE5vZGVzKSB7XG4gICAgICBjb21wb25lbnRTb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCkge1xuICAgICAgICB2YXIgZml4ZWRJZHMgPSBbXTtcbiAgICAgICAgY29tcG9uZW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgIGlmIChmaXhlZE5vZGVzLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICBmaXhlZElkcy5wdXNoKG5vZGVJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGZpeGVkSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB2YXIgcG9zaXRpb24gPSAwO1xuICAgICAgICAgIGZpeGVkSWRzLmZvckVhY2goZnVuY3Rpb24gKGZpeGVkSWQpIHtcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gXCJob3Jpem9udGFsXCIpIHtcbiAgICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KGZpeGVkSWQsIG5vZGVJbmRleGVzLmhhcyhmaXhlZElkKSA/IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGZpeGVkSWQpXSA6IGR1bW15UG9zaXRpb25zLmdldChmaXhlZElkKSk7XG4gICAgICAgICAgICAgIHBvc2l0aW9uICs9IHBvc2l0aW9uTWFwLmdldChmaXhlZElkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChmaXhlZElkLCBub2RlSW5kZXhlcy5oYXMoZml4ZWRJZCkgPyB5Q29vcmRzW25vZGVJbmRleGVzLmdldChmaXhlZElkKV0gOiBkdW1teVBvc2l0aW9ucy5nZXQoZml4ZWRJZCkpO1xuICAgICAgICAgICAgICBwb3NpdGlvbiArPSBwb3NpdGlvbk1hcC5nZXQoZml4ZWRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiAvIGZpeGVkSWRzLmxlbmd0aDtcbiAgICAgICAgICBjb21wb25lbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBpZiAoIWZpeGVkTm9kZXMuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KG5vZGVJZCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBfcG9zaXRpb24gPSAwO1xuICAgICAgICAgIGNvbXBvbmVudC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gXCJob3Jpem9udGFsXCIpIHtcbiAgICAgICAgICAgICAgX3Bvc2l0aW9uICs9IG5vZGVJbmRleGVzLmhhcyhub2RlSWQpID8geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0gOiBkdW1teVBvc2l0aW9ucy5nZXQobm9kZUlkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIF9wb3NpdGlvbiArPSBub2RlSW5kZXhlcy5oYXMobm9kZUlkKSA/IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KG5vZGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX3Bvc2l0aW9uID0gX3Bvc2l0aW9uIC8gY29tcG9uZW50Lmxlbmd0aDtcbiAgICAgICAgICBjb21wb25lbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQobm9kZUlkLCBfcG9zaXRpb24pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgcG9zaXRpb25zIG9mIHRoZSBub2Rlc1xuXG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICB2YXIgY3VycmVudE5vZGUgPSBxdWV1ZS5zaGlmdCgpO1xuICAgICAgdmFyIG5laWdoYm9ycyA9IGdyYXBoLmdldChjdXJyZW50Tm9kZSk7XG4gICAgICBuZWlnaGJvcnMuZm9yRWFjaChmdW5jdGlvbiAobmVpZ2hib3IpIHtcbiAgICAgICAgaWYgKHBvc2l0aW9uTWFwLmdldChuZWlnaGJvci5pZCkgPCBwb3NpdGlvbk1hcC5nZXQoY3VycmVudE5vZGUpICsgbmVpZ2hib3IuZ2FwKSB7XG4gICAgICAgICAgaWYgKGZpeGVkTm9kZXMgJiYgZml4ZWROb2Rlcy5oYXMobmVpZ2hib3IuaWQpKSB7XG4gICAgICAgICAgICB2YXIgZml4ZWRQb3NpdGlvbiA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gXCJob3Jpem9udGFsXCIpIHtcbiAgICAgICAgICAgICAgZml4ZWRQb3NpdGlvbiA9IG5vZGVJbmRleGVzLmhhcyhuZWlnaGJvci5pZCkgPyB4Q29vcmRzW25vZGVJbmRleGVzLmdldChuZWlnaGJvci5pZCldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KG5laWdoYm9yLmlkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZpeGVkUG9zaXRpb24gPSBub2RlSW5kZXhlcy5oYXMobmVpZ2hib3IuaWQpID8geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobmVpZ2hib3IuaWQpXSA6IGR1bW15UG9zaXRpb25zLmdldChuZWlnaGJvci5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQobmVpZ2hib3IuaWQsIGZpeGVkUG9zaXRpb24pOyAvLyBUT0RPOiBtYXkgZG8gdW5uZWNlc3Nhcnkgd29ya1xuICAgICAgICAgICAgaWYgKGZpeGVkUG9zaXRpb24gPCBwb3NpdGlvbk1hcC5nZXQoY3VycmVudE5vZGUpICsgbmVpZ2hib3IuZ2FwKSB7XG4gICAgICAgICAgICAgIHZhciBkaWZmID0gcG9zaXRpb25NYXAuZ2V0KGN1cnJlbnROb2RlKSArIG5laWdoYm9yLmdhcCAtIGZpeGVkUG9zaXRpb247XG4gICAgICAgICAgICAgIHBhc3RNYXAuZ2V0KGN1cnJlbnROb2RlKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQobm9kZUlkLCBwb3NpdGlvbk1hcC5nZXQobm9kZUlkKSAtIGRpZmYpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KG5laWdoYm9yLmlkLCBwb3NpdGlvbk1hcC5nZXQoY3VycmVudE5vZGUpICsgbmVpZ2hib3IuZ2FwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW5EZWdyZWVzLnNldChuZWlnaGJvci5pZCwgaW5EZWdyZWVzLmdldChuZWlnaGJvci5pZCkgLSAxKTtcbiAgICAgICAgaWYgKGluRGVncmVlcy5nZXQobmVpZ2hib3IuaWQpID09IDApIHtcbiAgICAgICAgICBxdWV1ZS5wdXNoKG5laWdoYm9yLmlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZml4ZWROb2Rlcykge1xuICAgICAgICAgIHBhc3RNYXAuc2V0KG5laWdoYm9yLmlkLCBzZXRVbmlvbihwYXN0TWFwLmdldChjdXJyZW50Tm9kZSksIHBhc3RNYXAuZ2V0KG5laWdoYm9yLmlkKSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPSAwKSB7XG4gICAgICBfbG9vcCgpO1xuICAgIH1cblxuICAgIC8vIHJlYWRqdXN0IHBvc2l0aW9uIG9mIHRoZSBub2RlcyBhZnRlciBlbmZvcmNlbWVudFxuICAgIGlmIChmaXhlZE5vZGVzKSB7XG4gICAgICAvLyBmaW5kIGluZGVncmVlIGNvdW50IGZvciBlYWNoIG5vZGVcbiAgICAgIHZhciBzaW5rTm9kZXMgPSBuZXcgU2V0KCk7XG5cbiAgICAgIGdyYXBoLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgc2lua05vZGVzLmFkZChrZXkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdmFyIF9jb21wb25lbnRzID0gW107XG4gICAgICBwYXN0TWFwLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgaWYgKHNpbmtOb2Rlcy5oYXMoa2V5KSkge1xuICAgICAgICAgIHZhciBpc0ZpeGVkQ29tcG9uZW50ID0gZmFsc2U7XG4gICAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yID0gdHJ1ZTtcbiAgICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IyID0gZmFsc2U7XG4gICAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yMiA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gdmFsdWVbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDI7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSAoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiA9IHRydWUpIHtcbiAgICAgICAgICAgICAgdmFyIG5vZGVJZCA9IF9zdGVwMi52YWx1ZTtcblxuICAgICAgICAgICAgICBpZiAoZml4ZWROb2Rlcy5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgICAgIGlzRml4ZWRDb21wb25lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvcjIgPSB0cnVlO1xuICAgICAgICAgICAgX2l0ZXJhdG9yRXJyb3IyID0gZXJyO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yICYmIF9pdGVyYXRvcjIucmV0dXJuKSB7XG4gICAgICAgICAgICAgICAgX2l0ZXJhdG9yMi5yZXR1cm4oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMikge1xuICAgICAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yMjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghaXNGaXhlZENvbXBvbmVudCkge1xuICAgICAgICAgICAgdmFyIGlzRXhpc3QgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBleGlzdEF0ID0gdm9pZCAwO1xuICAgICAgICAgICAgX2NvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50LCBpbmRleCkge1xuICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmhhcyhbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHZhbHVlKSlbMF0pKSB7XG4gICAgICAgICAgICAgICAgaXNFeGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZXhpc3RBdCA9IGluZGV4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghaXNFeGlzdCkge1xuICAgICAgICAgICAgICBfY29tcG9uZW50cy5wdXNoKG5ldyBTZXQodmFsdWUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgICAgIF9jb21wb25lbnRzW2V4aXN0QXRdLmFkZChlbGUpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBfY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQsIGluZGV4KSB7XG4gICAgICAgIHZhciBtaW5CZWZvcmUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIHZhciBtaW5BZnRlciA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgdmFyIG1heEJlZm9yZSA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICAgICAgdmFyIG1heEFmdGVyID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuXG4gICAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMyA9IHRydWU7XG4gICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjMgPSBmYWxzZTtcbiAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yMyA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjMgPSBjb21wb25lbnRbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDM7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjMgPSAoX3N0ZXAzID0gX2l0ZXJhdG9yMy5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMyA9IHRydWUpIHtcbiAgICAgICAgICAgIHZhciBub2RlSWQgPSBfc3RlcDMudmFsdWU7XG5cbiAgICAgICAgICAgIHZhciBwb3NCZWZvcmUgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICAgICAgICAgIHBvc0JlZm9yZSA9IG5vZGVJbmRleGVzLmhhcyhub2RlSWQpID8geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0gOiBkdW1teVBvc2l0aW9ucy5nZXQobm9kZUlkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBvc0JlZm9yZSA9IG5vZGVJbmRleGVzLmhhcyhub2RlSWQpID8geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0gOiBkdW1teVBvc2l0aW9ucy5nZXQobm9kZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBwb3NBZnRlciA9IHBvc2l0aW9uTWFwLmdldChub2RlSWQpO1xuICAgICAgICAgICAgaWYgKHBvc0JlZm9yZSA8IG1pbkJlZm9yZSkge1xuICAgICAgICAgICAgICBtaW5CZWZvcmUgPSBwb3NCZWZvcmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9zQmVmb3JlID4gbWF4QmVmb3JlKSB7XG4gICAgICAgICAgICAgIG1heEJlZm9yZSA9IHBvc0JlZm9yZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb3NBZnRlciA8IG1pbkFmdGVyKSB7XG4gICAgICAgICAgICAgIG1pbkFmdGVyID0gcG9zQWZ0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9zQWZ0ZXIgPiBtYXhBZnRlcikge1xuICAgICAgICAgICAgICBtYXhBZnRlciA9IHBvc0FmdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IzID0gdHJ1ZTtcbiAgICAgICAgICBfaXRlcmF0b3JFcnJvcjMgPSBlcnI7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjMgJiYgX2l0ZXJhdG9yMy5yZXR1cm4pIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yMy5yZXR1cm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMykge1xuICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRpZmYgPSAobWluQmVmb3JlICsgbWF4QmVmb3JlKSAvIDIgLSAobWluQWZ0ZXIgKyBtYXhBZnRlcikgLyAyO1xuXG4gICAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNCA9IHRydWU7XG4gICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjQgPSBmYWxzZTtcbiAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yNCA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjQgPSBjb21wb25lbnRbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDQ7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjQgPSAoX3N0ZXA0ID0gX2l0ZXJhdG9yNC5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNCA9IHRydWUpIHtcbiAgICAgICAgICAgIHZhciBfbm9kZUlkID0gX3N0ZXA0LnZhbHVlO1xuXG4gICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQoX25vZGVJZCwgcG9zaXRpb25NYXAuZ2V0KF9ub2RlSWQpICsgZGlmZik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvcjQgPSB0cnVlO1xuICAgICAgICAgIF9pdGVyYXRvckVycm9yNCA9IGVycjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNCAmJiBfaXRlcmF0b3I0LnJldHVybikge1xuICAgICAgICAgICAgICBfaXRlcmF0b3I0LnJldHVybigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3I0KSB7XG4gICAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwb3NpdGlvbk1hcDtcbiAgfTtcblxuICAvLyBmaW5kIHRyYW5zZm9ybWF0aW9uIGJhc2VkIG9uIHJlbC4gcGxhY2VtZW50IGNvbnN0cmFpbnRzIGlmIHRoZXJlIGFyZSBib3RoIGFsaWdubWVudCBhbmQgcmVsLiBwbGFjZW1lbnQgY29uc3RyYWludHNcbiAgLy8gb3IgaWYgdGhlcmUgYXJlIG9ubHkgcmVsLiBwbGFjZW1lbnQgY29udHJhaW50cyB3aGVyZSB0aGUgbGFyZ2VzdCBjb21wb25lbnQgaXNuJ3Qgc3VmZmljaWVudGx5IGxhcmdlXG4gIHZhciBhcHBseVJlZmxlY3Rpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudCA9IGZ1bmN0aW9uIGFwcGx5UmVmbGVjdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50KHJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludHMpIHtcbiAgICAvLyB2YXJpYWJsZXMgdG8gY291bnQgdm90ZXNcbiAgICB2YXIgcmVmbGVjdE9uWSA9IDAsXG4gICAgICAgIG5vdFJlZmxlY3RPblkgPSAwO1xuICAgIHZhciByZWZsZWN0T25YID0gMCxcbiAgICAgICAgbm90UmVmbGVjdE9uWCA9IDA7XG5cbiAgICByZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgIGlmIChjb25zdHJhaW50LmxlZnQpIHtcbiAgICAgICAgeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQoY29uc3RyYWludC5sZWZ0KV0gLSB4Q29vcmRzW25vZGVJbmRleGVzLmdldChjb25zdHJhaW50LnJpZ2h0KV0gPj0gMCA/IHJlZmxlY3RPblkrKyA6IG5vdFJlZmxlY3RPblkrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGNvbnN0cmFpbnQudG9wKV0gLSB5Q29vcmRzW25vZGVJbmRleGVzLmdldChjb25zdHJhaW50LmJvdHRvbSldID49IDAgPyByZWZsZWN0T25YKysgOiBub3RSZWZsZWN0T25YKys7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAocmVmbGVjdE9uWSA+IG5vdFJlZmxlY3RPblkgJiYgcmVmbGVjdE9uWCA+IG5vdFJlZmxlY3RPblgpIHtcbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBub2RlSW5kZXhlcy5zaXplOyBfaSsrKSB7XG4gICAgICAgIHhDb29yZHNbX2ldID0gLTEgKiB4Q29vcmRzW19pXTtcbiAgICAgICAgeUNvb3Jkc1tfaV0gPSAtMSAqIHlDb29yZHNbX2ldO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVmbGVjdE9uWSA+IG5vdFJlZmxlY3RPblkpIHtcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG5vZGVJbmRleGVzLnNpemU7IF9pMisrKSB7XG4gICAgICAgIHhDb29yZHNbX2kyXSA9IC0xICogeENvb3Jkc1tfaTJdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVmbGVjdE9uWCA+IG5vdFJlZmxlY3RPblgpIHtcbiAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IG5vZGVJbmRleGVzLnNpemU7IF9pMysrKSB7XG4gICAgICAgIHlDb29yZHNbX2kzXSA9IC0xICogeUNvb3Jkc1tfaTNdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBmaW5kIHdlYWtseSBjb25uZWN0ZWQgY29tcG9uZW50cyBpbiB1bmRpcmVjdGVkIGdyYXBoXG4gIHZhciBmaW5kQ29tcG9uZW50cyA9IGZ1bmN0aW9uIGZpbmRDb21wb25lbnRzKGdyYXBoKSB7XG4gICAgLy8gZmluZCB3ZWFrbHkgY29ubmVjdGVkIGNvbXBvbmVudHMgaW4gZGFnXG4gICAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgICB2YXIgcXVldWUgPSBuZXcgTGlua2VkTGlzdCgpO1xuICAgIHZhciB2aXNpdGVkID0gbmV3IFNldCgpO1xuICAgIHZhciBjb3VudCA9IDA7XG5cbiAgICBncmFwaC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGtleSkpIHtcbiAgICAgICAgY29tcG9uZW50c1tjb3VudF0gPSBbXTtcbiAgICAgICAgdmFyIF9jdXJyZW50Tm9kZSA9IGtleTtcbiAgICAgICAgcXVldWUucHVzaChfY3VycmVudE5vZGUpO1xuICAgICAgICB2aXNpdGVkLmFkZChfY3VycmVudE5vZGUpO1xuICAgICAgICBjb21wb25lbnRzW2NvdW50XS5wdXNoKF9jdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgX2N1cnJlbnROb2RlID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICB2YXIgbmVpZ2hib3JzID0gZ3JhcGguZ2V0KF9jdXJyZW50Tm9kZSk7XG4gICAgICAgICAgbmVpZ2hib3JzLmZvckVhY2goZnVuY3Rpb24gKG5laWdoYm9yKSB7XG4gICAgICAgICAgICBpZiAoIXZpc2l0ZWQuaGFzKG5laWdoYm9yLmlkKSkge1xuICAgICAgICAgICAgICBxdWV1ZS5wdXNoKG5laWdoYm9yLmlkKTtcbiAgICAgICAgICAgICAgdmlzaXRlZC5hZGQobmVpZ2hib3IuaWQpO1xuICAgICAgICAgICAgICBjb21wb25lbnRzW2NvdW50XS5wdXNoKG5laWdoYm9yLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb3VudCsrO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjb21wb25lbnRzO1xuICB9O1xuXG4gIC8vIHJldHVybiB1bmRpcmVjdGVkIHZlcnNpb24gb2YgZ2l2ZW4gZGFnXG4gIHZhciBkYWdUb1VuZGlyZWN0ZWQgPSBmdW5jdGlvbiBkYWdUb1VuZGlyZWN0ZWQoZGFnKSB7XG4gICAgdmFyIHVuZGlyZWN0ZWQgPSBuZXcgTWFwKCk7XG5cbiAgICBkYWcuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgdW5kaXJlY3RlZC5zZXQoa2V5LCBbXSk7XG4gICAgfSk7XG5cbiAgICBkYWcuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAoYWRqYWNlbnQpIHtcbiAgICAgICAgdW5kaXJlY3RlZC5nZXQoa2V5KS5wdXNoKGFkamFjZW50KTtcbiAgICAgICAgdW5kaXJlY3RlZC5nZXQoYWRqYWNlbnQuaWQpLnB1c2goeyBpZDoga2V5LCBnYXA6IGFkamFjZW50LmdhcCwgZGlyZWN0aW9uOiBhZGphY2VudC5kaXJlY3Rpb24gfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB1bmRpcmVjdGVkO1xuICB9O1xuXG4gIC8vIHJldHVybiByZXZlcnNlZCAoZGlyZWN0aW9ucyBpbnZlcnRlZCkgdmVyc2lvbiBvZiBnaXZlbiBkYWdcbiAgdmFyIGRhZ1RvUmV2ZXJzZWQgPSBmdW5jdGlvbiBkYWdUb1JldmVyc2VkKGRhZykge1xuICAgIHZhciByZXZlcnNlZCA9IG5ldyBNYXAoKTtcblxuICAgIGRhZy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICByZXZlcnNlZC5zZXQoa2V5LCBbXSk7XG4gICAgfSk7XG5cbiAgICBkYWcuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAoYWRqYWNlbnQpIHtcbiAgICAgICAgcmV2ZXJzZWQuZ2V0KGFkamFjZW50LmlkKS5wdXNoKHsgaWQ6IGtleSwgZ2FwOiBhZGphY2VudC5nYXAsIGRpcmVjdGlvbjogYWRqYWNlbnQuZGlyZWN0aW9uIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmV2ZXJzZWQ7XG4gIH07XG5cbiAgLyoqKiogIGFwcGx5IHRyYW5zZm9ybWF0aW9uIHRvIHRoZSBpbml0aWFsIGRyYWZ0IGxheW91dCB0byBiZXR0ZXIgYWxpZ24gd2l0aCBjb25zdHJhaW5lZCBub2RlcyAqKioqL1xuICAvLyBzb2x2ZSB0aGUgT3J0aG9nb25hbCBQcm9jcnVzdGVhbiBQcm9ibGVtIHRvIHJvdGF0ZSBhbmQvb3IgcmVmbGVjdCBpbml0aWFsIGRyYWZ0IGxheW91dFxuICAvLyBoZXJlIHdlIGZvbGxvdyB0aGUgc29sdXRpb24gaW4gQ2hhcHRlciAyMC4yIG9mIEJvcmcsIEkuICYgR3JvZW5lbiwgUC4gKDIwMDUpIE1vZGVybiBNdWx0aWRpbWVuc2lvbmFsIFNjYWxpbmc6IFRoZW9yeSBhbmQgQXBwbGljYXRpb25zIFxuXG4gIC8qIGNvbnN0cnVjdCBzb3VyY2UgYW5kIHRhcmdldCBjb25maWd1cmF0aW9ucyAqL1xuXG4gIHZhciB0YXJnZXRNYXRyaXggPSBbXTsgLy8gQSAtIHRhcmdldCBjb25maWd1cmF0aW9uXG4gIHZhciBzb3VyY2VNYXRyaXggPSBbXTsgLy8gQiAtIHNvdXJjZSBjb25maWd1cmF0aW9uIFxuICB2YXIgc3RhbmRhcmRUcmFuc2Zvcm1hdGlvbiA9IGZhbHNlOyAvLyBmYWxzZSBmb3Igbm8gdHJhbnNmb3JtYXRpb24sIHRydWUgZm9yIHN0YW5kYXJ0IChQcm9jcnVzdGVzKSB0cmFuc2Zvcm1hdGlvbiAocm90YXRpb24gYW5kL29yIHJlZmxlY3Rpb24pXG4gIHZhciByZWZsZWN0aW9uVHlwZSA9IGZhbHNlOyAvLyBmYWxzZS90cnVlIGZvciByZWZsZWN0aW9uIGNoZWNrLCAncmVmbGVjdE9uWCcsICdyZWZsZWN0T25ZJyBvciAncmVmbGVjdE9uQm90aCcgZm9yIHJlZmxlY3Rpb24gdHlwZSBpZiBuZWNlc3NhcnlcbiAgdmFyIGZpeGVkTm9kZXMgPSBuZXcgU2V0KCk7XG4gIHZhciBkYWcgPSBuZXcgTWFwKCk7IC8vIGFkamFjZW5jeSBsaXN0IHRvIGtlZXAgZGlyZWN0ZWQgYWN5Y2xpYyBncmFwaCAoZGFnKSB0aGF0IGNvbnNpc3RzIG9mIHJlbGF0aXZlIHBsYWNlbWVudCBjb25zdHJhaW50c1xuICB2YXIgZGFnVW5kaXJlY3RlZCA9IG5ldyBNYXAoKTsgLy8gdW5kaXJlY3RlZCB2ZXJzaW9uIG9mIHRoZSBkYWdcbiAgdmFyIGNvbXBvbmVudHMgPSBbXTsgLy8gd2Vha2x5IGNvbm5lY3RlZCBjb21wb25lbnRzXG5cbiAgLy8gZmlsbCBmaXhlZE5vZGVzIGNvbGxlY3Rpb24gdG8gdXNlIGxhdGVyXG4gIGlmIChjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50KSB7XG4gICAgY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlRGF0YSkge1xuICAgICAgZml4ZWROb2Rlcy5hZGQobm9kZURhdGEubm9kZUlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGNvbnN0cnVjdCBkYWcgZnJvbSByZWxhdGl2ZSBwbGFjZW1lbnQgY29uc3RyYWludHMgXG4gIGlmIChjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcbiAgICAvLyBjb25zdHJ1Y3QgYm90aCBkaXJlY3RlZCBhbmQgdW5kaXJlY3RlZCB2ZXJzaW9uIG9mIHRoZSBkYWdcbiAgICBjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgaWYgKGNvbnN0cmFpbnQubGVmdCkge1xuICAgICAgICBpZiAoZGFnLmhhcyhjb25zdHJhaW50LmxlZnQpKSB7XG4gICAgICAgICAgZGFnLmdldChjb25zdHJhaW50LmxlZnQpLnB1c2goeyBpZDogY29uc3RyYWludC5yaWdodCwgZ2FwOiBjb25zdHJhaW50LmdhcCwgZGlyZWN0aW9uOiBcImhvcml6b250YWxcIiB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkYWcuc2V0KGNvbnN0cmFpbnQubGVmdCwgW3sgaWQ6IGNvbnN0cmFpbnQucmlnaHQsIGdhcDogY29uc3RyYWludC5nYXAsIGRpcmVjdGlvbjogXCJob3Jpem9udGFsXCIgfV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGFnLmhhcyhjb25zdHJhaW50LnJpZ2h0KSkge1xuICAgICAgICAgIGRhZy5zZXQoY29uc3RyYWludC5yaWdodCwgW10pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZGFnLmhhcyhjb25zdHJhaW50LnRvcCkpIHtcbiAgICAgICAgICBkYWcuZ2V0KGNvbnN0cmFpbnQudG9wKS5wdXNoKHsgaWQ6IGNvbnN0cmFpbnQuYm90dG9tLCBnYXA6IGNvbnN0cmFpbnQuZ2FwLCBkaXJlY3Rpb246IFwidmVydGljYWxcIiB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkYWcuc2V0KGNvbnN0cmFpbnQudG9wLCBbeyBpZDogY29uc3RyYWludC5ib3R0b20sIGdhcDogY29uc3RyYWludC5nYXAsIGRpcmVjdGlvbjogXCJ2ZXJ0aWNhbFwiIH1dKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRhZy5oYXMoY29uc3RyYWludC5ib3R0b20pKSB7XG4gICAgICAgICAgZGFnLnNldChjb25zdHJhaW50LmJvdHRvbSwgW10pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBkYWdVbmRpcmVjdGVkID0gZGFnVG9VbmRpcmVjdGVkKGRhZyk7XG4gICAgY29tcG9uZW50cyA9IGZpbmRDb21wb25lbnRzKGRhZ1VuZGlyZWN0ZWQpO1xuICB9XG5cbiAgaWYgKENvU0VDb25zdGFudHMuVFJBTlNGT1JNX09OX0NPTlNUUkFJTlRfSEFORExJTkcpIHtcbiAgICAvLyBmaXJzdCBjaGVjayBmaXhlZCBub2RlIGNvbnN0cmFpbnRcbiAgICBpZiAoY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludCAmJiBjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50Lmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZURhdGEsIGkpIHtcbiAgICAgICAgdGFyZ2V0TWF0cml4W2ldID0gW25vZGVEYXRhLnBvc2l0aW9uLngsIG5vZGVEYXRhLnBvc2l0aW9uLnldO1xuICAgICAgICBzb3VyY2VNYXRyaXhbaV0gPSBbeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZURhdGEubm9kZUlkKV0sIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVEYXRhLm5vZGVJZCldXTtcbiAgICAgIH0pO1xuICAgICAgc3RhbmRhcmRUcmFuc2Zvcm1hdGlvbiA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50KSB7XG4gICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyB0aGVuIGNoZWNrIGFsaWdubWVudCBjb25zdHJhaW50XG4gICAgICAgIHZhciBjb3VudCA9IDA7XG4gICAgICAgIGlmIChjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsKSB7XG4gICAgICAgICAgdmFyIHZlcnRpY2FsQWxpZ24gPSBjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsO1xuXG4gICAgICAgICAgdmFyIF9sb29wMiA9IGZ1bmN0aW9uIF9sb29wMihfaTQpIHtcbiAgICAgICAgICAgIHZhciBhbGlnbm1lbnRTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICB2ZXJ0aWNhbEFsaWduW19pNF0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgIGFsaWdubWVudFNldC5hZGQobm9kZUlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IG5ldyBTZXQoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShhbGlnbm1lbnRTZXQpKS5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZpeGVkTm9kZXMuaGFzKHgpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgdmFyIHhQb3MgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoaW50ZXJzZWN0aW9uLnNpemUgPiAwKSB4UG9zID0geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQoaW50ZXJzZWN0aW9uLnZhbHVlcygpLm5leHQoKS52YWx1ZSldO2Vsc2UgeFBvcyA9IGNhbGN1bGF0ZUF2Z1Bvc2l0aW9uKGFsaWdubWVudFNldCkueDtcblxuICAgICAgICAgICAgdmVydGljYWxBbGlnbltfaTRdLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICB0YXJnZXRNYXRyaXhbY291bnRdID0gW3hQb3MsIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldXTtcbiAgICAgICAgICAgICAgc291cmNlTWF0cml4W2NvdW50XSA9IFt4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSwgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV1dO1xuICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IHZlcnRpY2FsQWxpZ24ubGVuZ3RoOyBfaTQrKykge1xuICAgICAgICAgICAgX2xvb3AyKF9pNCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YW5kYXJkVHJhbnNmb3JtYXRpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWwpIHtcbiAgICAgICAgICB2YXIgaG9yaXpvbnRhbEFsaWduID0gY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsO1xuXG4gICAgICAgICAgdmFyIF9sb29wMyA9IGZ1bmN0aW9uIF9sb29wMyhfaTUpIHtcbiAgICAgICAgICAgIHZhciBhbGlnbm1lbnRTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBob3Jpem9udGFsQWxpZ25bX2k1XS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgYWxpZ25tZW50U2V0LmFkZChub2RlSWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgaW50ZXJzZWN0aW9uID0gbmV3IFNldChbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGFsaWdubWVudFNldCkpLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICByZXR1cm4gZml4ZWROb2Rlcy5oYXMoeCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB2YXIgeVBvcyA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmIChpbnRlcnNlY3Rpb24uc2l6ZSA+IDApIHlQb3MgPSB4Q29vcmRzW25vZGVJbmRleGVzLmdldChpbnRlcnNlY3Rpb24udmFsdWVzKCkubmV4dCgpLnZhbHVlKV07ZWxzZSB5UG9zID0gY2FsY3VsYXRlQXZnUG9zaXRpb24oYWxpZ25tZW50U2V0KS55O1xuXG4gICAgICAgICAgICBob3Jpem9udGFsQWxpZ25bX2k1XS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgdGFyZ2V0TWF0cml4W2NvdW50XSA9IFt4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSwgeVBvc107XG4gICAgICAgICAgICAgIHNvdXJjZU1hdHJpeFtjb3VudF0gPSBbeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0sIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldXTtcbiAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBob3Jpem9udGFsQWxpZ24ubGVuZ3RoOyBfaTUrKykge1xuICAgICAgICAgICAgX2xvb3AzKF9pNSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YW5kYXJkVHJhbnNmb3JtYXRpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcbiAgICAgICAgICByZWZsZWN0aW9uVHlwZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG4gICAgfSBlbHNlIGlmIChjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcbiAgICAgIC8vIGZpbmFsbHkgY2hlY2sgcmVsYXRpdmUgcGxhY2VtZW50IGNvbnN0cmFpbnRcbiAgICAgIC8vIGZpbmQgbGFyZ2VzdCBjb21wb25lbnQgaW4gZGFnXG4gICAgICB2YXIgbGFyZ2VzdENvbXBvbmVudFNpemUgPSAwO1xuICAgICAgdmFyIGxhcmdlc3RDb21wb25lbnRJbmRleCA9IDA7XG4gICAgICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBjb21wb25lbnRzLmxlbmd0aDsgX2k2KyspIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudHNbX2k2XS5sZW5ndGggPiBsYXJnZXN0Q29tcG9uZW50U2l6ZSkge1xuICAgICAgICAgIGxhcmdlc3RDb21wb25lbnRTaXplID0gY29tcG9uZW50c1tfaTZdLmxlbmd0aDtcbiAgICAgICAgICBsYXJnZXN0Q29tcG9uZW50SW5kZXggPSBfaTY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGlmIGxhcmdlc3QgY29tcG9uZW50IGlzbid0IGRvbWluYW50LCB0aGVuIHRha2UgdGhlIHZvdGVzIGZvciByZWZsZWN0aW9uXG4gICAgICBpZiAobGFyZ2VzdENvbXBvbmVudFNpemUgPCBkYWdVbmRpcmVjdGVkLnNpemUgLyAyKSB7XG4gICAgICAgIGFwcGx5UmVmbGVjdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50KGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCk7XG4gICAgICAgIHN0YW5kYXJkVHJhbnNmb3JtYXRpb24gPSBmYWxzZTtcbiAgICAgICAgcmVmbGVjdGlvblR5cGUgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHVzZSBsYXJnZXN0IGNvbXBvbmVudCBmb3IgdHJhbnNmb3JtYXRpb25cbiAgICAgICAgLy8gY29uc3RydWN0IGhvcml6b250YWwgYW5kIHZlcnRpY2FsIHN1YmdyYXBocyBpbiB0aGUgbGFyZ2VzdCBjb21wb25lbnRcbiAgICAgICAgdmFyIHN1YkdyYXBoT25Ib3Jpem9udGFsID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgc3ViR3JhcGhPblZlcnRpY2FsID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgY29uc3RyYWludHNJbmxhcmdlc3RDb21wb25lbnQgPSBbXTtcblxuICAgICAgICBjb21wb25lbnRzW2xhcmdlc3RDb21wb25lbnRJbmRleF0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgZGFnLmdldChub2RlSWQpLmZvckVhY2goZnVuY3Rpb24gKGFkamFjZW50KSB7XG4gICAgICAgICAgICBpZiAoYWRqYWNlbnQuZGlyZWN0aW9uID09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICAgICAgICAgIGlmIChzdWJHcmFwaE9uSG9yaXpvbnRhbC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgICAgIHN1YkdyYXBoT25Ib3Jpem9udGFsLmdldChub2RlSWQpLnB1c2goYWRqYWNlbnQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN1YkdyYXBoT25Ib3Jpem9udGFsLnNldChub2RlSWQsIFthZGphY2VudF0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghc3ViR3JhcGhPbkhvcml6b250YWwuaGFzKGFkamFjZW50LmlkKSkge1xuICAgICAgICAgICAgICAgIHN1YkdyYXBoT25Ib3Jpem9udGFsLnNldChhZGphY2VudC5pZCwgW10pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0cmFpbnRzSW5sYXJnZXN0Q29tcG9uZW50LnB1c2goeyBsZWZ0OiBub2RlSWQsIHJpZ2h0OiBhZGphY2VudC5pZCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChzdWJHcmFwaE9uVmVydGljYWwuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgICAgICBzdWJHcmFwaE9uVmVydGljYWwuZ2V0KG5vZGVJZCkucHVzaChhZGphY2VudCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3ViR3JhcGhPblZlcnRpY2FsLnNldChub2RlSWQsIFthZGphY2VudF0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghc3ViR3JhcGhPblZlcnRpY2FsLmhhcyhhZGphY2VudC5pZCkpIHtcbiAgICAgICAgICAgICAgICBzdWJHcmFwaE9uVmVydGljYWwuc2V0KGFkamFjZW50LmlkLCBbXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3RyYWludHNJbmxhcmdlc3RDb21wb25lbnQucHVzaCh7IHRvcDogbm9kZUlkLCBib3R0b206IGFkamFjZW50LmlkIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBhcHBseVJlZmxlY3Rpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChjb25zdHJhaW50c0lubGFyZ2VzdENvbXBvbmVudCk7XG4gICAgICAgIHJlZmxlY3Rpb25UeXBlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIGFwcHJvcHJpYXRlIHBvc2l0aW9uaW5nIGZvciBzdWJncmFwaHNcbiAgICAgICAgdmFyIHBvc2l0aW9uTWFwSG9yaXpvbnRhbCA9IGZpbmRBcHByb3ByaWF0ZVBvc2l0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQoc3ViR3JhcGhPbkhvcml6b250YWwsIFwiaG9yaXpvbnRhbFwiKTtcbiAgICAgICAgdmFyIHBvc2l0aW9uTWFwVmVydGljYWwgPSBmaW5kQXBwcm9wcmlhdGVQb3NpdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50KHN1YkdyYXBoT25WZXJ0aWNhbCwgXCJ2ZXJ0aWNhbFwiKTtcblxuICAgICAgICAvLyBjb25zdHJ1Y3Qgc291cmNlIGFuZCB0YXJnZXQgY29uZmlndXJhdGlvblxuICAgICAgICBjb21wb25lbnRzW2xhcmdlc3RDb21wb25lbnRJbmRleF0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkLCBpKSB7XG4gICAgICAgICAgc291cmNlTWF0cml4W2ldID0gW3hDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldLCB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXV07XG4gICAgICAgICAgdGFyZ2V0TWF0cml4W2ldID0gW107XG4gICAgICAgICAgaWYgKHBvc2l0aW9uTWFwSG9yaXpvbnRhbC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgdGFyZ2V0TWF0cml4W2ldWzBdID0gcG9zaXRpb25NYXBIb3Jpem9udGFsLmdldChub2RlSWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRNYXRyaXhbaV1bMF0gPSB4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHBvc2l0aW9uTWFwVmVydGljYWwuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgIHRhcmdldE1hdHJpeFtpXVsxXSA9IHBvc2l0aW9uTWFwVmVydGljYWwuZ2V0KG5vZGVJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldE1hdHJpeFtpXVsxXSA9IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3RhbmRhcmRUcmFuc2Zvcm1hdGlvbiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgdHJhbnNmb3JtYXRpb24gaXMgcmVxdWlyZWQsIHRoZW4gY2FsY3VsYXRlIGFuZCBhcHBseSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXhcbiAgICBpZiAoc3RhbmRhcmRUcmFuc2Zvcm1hdGlvbikge1xuICAgICAgLyogY2FsY3VsYXRlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAqL1xuICAgICAgdmFyIHRyYW5zZm9ybWF0aW9uTWF0cml4ID0gdm9pZCAwO1xuICAgICAgdmFyIHRhcmdldE1hdHJpeFRyYW5zcG9zZSA9IE1hdHJpeC50cmFuc3Bvc2UodGFyZ2V0TWF0cml4KTsgLy8gQSdcbiAgICAgIHZhciBzb3VyY2VNYXRyaXhUcmFuc3Bvc2UgPSBNYXRyaXgudHJhbnNwb3NlKHNvdXJjZU1hdHJpeCk7IC8vIEInXG5cbiAgICAgIC8vIGNlbnRyYWxpemUgdHJhbnNwb3NlIG1hdHJpY2VzXG4gICAgICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCB0YXJnZXRNYXRyaXhUcmFuc3Bvc2UubGVuZ3RoOyBfaTcrKykge1xuICAgICAgICB0YXJnZXRNYXRyaXhUcmFuc3Bvc2VbX2k3XSA9IE1hdHJpeC5tdWx0R2FtbWEodGFyZ2V0TWF0cml4VHJhbnNwb3NlW19pN10pO1xuICAgICAgICBzb3VyY2VNYXRyaXhUcmFuc3Bvc2VbX2k3XSA9IE1hdHJpeC5tdWx0R2FtbWEoc291cmNlTWF0cml4VHJhbnNwb3NlW19pN10pO1xuICAgICAgfVxuXG4gICAgICAvLyBkbyBhY3R1YWwgY2FsY3VsYXRpb24gZm9yIHRyYW5zZm9ybWF0aW9uIG1hdHJpeFxuICAgICAgdmFyIHRlbXBNYXRyaXggPSBNYXRyaXgubXVsdE1hdCh0YXJnZXRNYXRyaXhUcmFuc3Bvc2UsIE1hdHJpeC50cmFuc3Bvc2Uoc291cmNlTWF0cml4VHJhbnNwb3NlKSk7IC8vIHRlbXBNYXRyaXggPSBBJ0JcbiAgICAgIHZhciBTVkRSZXN1bHQgPSBTVkQuc3ZkKHRlbXBNYXRyaXgpOyAvLyBTVkQoQSdCKSA9IFVTVicsIHN2ZCBmdW5jdGlvbiByZXR1cm5zIFUsIFMgYW5kIFYgXG4gICAgICB0cmFuc2Zvcm1hdGlvbk1hdHJpeCA9IE1hdHJpeC5tdWx0TWF0KFNWRFJlc3VsdC5WLCBNYXRyaXgudHJhbnNwb3NlKFNWRFJlc3VsdC5VKSk7IC8vIHRyYW5zZm9ybWF0aW9uTWF0cml4ID0gVCA9IFZVJ1xuXG4gICAgICAvKiBhcHBseSBmb3VuZCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdG8gb2J0YWluIGZpbmFsIGRyYWZ0IGxheW91dCAqL1xuICAgICAgZm9yICh2YXIgX2k4ID0gMDsgX2k4IDwgbm9kZUluZGV4ZXMuc2l6ZTsgX2k4KyspIHtcbiAgICAgICAgdmFyIHRlbXAxID0gW3hDb29yZHNbX2k4XSwgeUNvb3Jkc1tfaThdXTtcbiAgICAgICAgdmFyIHRlbXAyID0gW3RyYW5zZm9ybWF0aW9uTWF0cml4WzBdWzBdLCB0cmFuc2Zvcm1hdGlvbk1hdHJpeFsxXVswXV07XG4gICAgICAgIHZhciB0ZW1wMyA9IFt0cmFuc2Zvcm1hdGlvbk1hdHJpeFswXVsxXSwgdHJhbnNmb3JtYXRpb25NYXRyaXhbMV1bMV1dO1xuICAgICAgICB4Q29vcmRzW19pOF0gPSBNYXRyaXguZG90UHJvZHVjdCh0ZW1wMSwgdGVtcDIpO1xuICAgICAgICB5Q29vcmRzW19pOF0gPSBNYXRyaXguZG90UHJvZHVjdCh0ZW1wMSwgdGVtcDMpO1xuICAgICAgfVxuXG4gICAgICAvLyBhcHBsaWVkIG9ubHkgYm90aCBhbGlnbm1lbnQgYW5kIHJlbC4gcGxhY2VtZW50IGNvbnN0cmFpbnRzIGV4aXN0XG4gICAgICBpZiAocmVmbGVjdGlvblR5cGUpIHtcbiAgICAgICAgYXBwbHlSZWZsZWN0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQoY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoQ29TRUNvbnN0YW50cy5FTkZPUkNFX0NPTlNUUkFJTlRTKSB7XG4gICAgLyoqKiogIGVuZm9yY2UgY29uc3RyYWludHMgb24gdGhlIHRyYW5zZm9ybWVkIGRyYWZ0IGxheW91dCAqKioqL1xuXG4gICAgLyogZmlyc3QgZW5mb3JjZSBmaXhlZCBub2RlIGNvbnN0cmFpbnQgKi9cblxuICAgIGlmIChjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50ICYmIGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIHRyYW5zbGF0aW9uQW1vdW50ID0geyB4OiAwLCB5OiAwIH07XG4gICAgICBjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVEYXRhLCBpKSB7XG4gICAgICAgIHZhciBwb3NJblRoZW9yeSA9IHsgeDogeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZURhdGEubm9kZUlkKV0sIHk6IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVEYXRhLm5vZGVJZCldIH07XG4gICAgICAgIHZhciBwb3NEZXNpcmVkID0gbm9kZURhdGEucG9zaXRpb247XG4gICAgICAgIHZhciBwb3NEaWZmID0gY2FsY3VsYXRlUG9zaXRpb25EaWZmKHBvc0Rlc2lyZWQsIHBvc0luVGhlb3J5KTtcbiAgICAgICAgdHJhbnNsYXRpb25BbW91bnQueCArPSBwb3NEaWZmLng7XG4gICAgICAgIHRyYW5zbGF0aW9uQW1vdW50LnkgKz0gcG9zRGlmZi55O1xuICAgICAgfSk7XG4gICAgICB0cmFuc2xhdGlvbkFtb3VudC54IC89IGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQubGVuZ3RoO1xuICAgICAgdHJhbnNsYXRpb25BbW91bnQueSAvPSBjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50Lmxlbmd0aDtcblxuICAgICAgeENvb3Jkcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwgaSkge1xuICAgICAgICB4Q29vcmRzW2ldICs9IHRyYW5zbGF0aW9uQW1vdW50Lng7XG4gICAgICB9KTtcblxuICAgICAgeUNvb3Jkcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwgaSkge1xuICAgICAgICB5Q29vcmRzW2ldICs9IHRyYW5zbGF0aW9uQW1vdW50Lnk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlRGF0YSkge1xuICAgICAgICB4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlRGF0YS5ub2RlSWQpXSA9IG5vZGVEYXRhLnBvc2l0aW9uLng7XG4gICAgICAgIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVEYXRhLm5vZGVJZCldID0gbm9kZURhdGEucG9zaXRpb24ueTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qIHRoZW4gZW5mb3JjZSBhbGlnbm1lbnQgY29uc3RyYWludCAqL1xuXG4gICAgaWYgKGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQpIHtcbiAgICAgIGlmIChjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsKSB7XG4gICAgICAgIHZhciB4QWxpZ24gPSBjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsO1xuXG4gICAgICAgIHZhciBfbG9vcDQgPSBmdW5jdGlvbiBfbG9vcDQoX2k5KSB7XG4gICAgICAgICAgdmFyIGFsaWdubWVudFNldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICB4QWxpZ25bX2k5XS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIGFsaWdubWVudFNldC5hZGQobm9kZUlkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgaW50ZXJzZWN0aW9uID0gbmV3IFNldChbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGFsaWdubWVudFNldCkpLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIGZpeGVkTm9kZXMuaGFzKHgpO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgICB2YXIgeFBvcyA9IHZvaWQgMDtcbiAgICAgICAgICBpZiAoaW50ZXJzZWN0aW9uLnNpemUgPiAwKSB4UG9zID0geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQoaW50ZXJzZWN0aW9uLnZhbHVlcygpLm5leHQoKS52YWx1ZSldO2Vsc2UgeFBvcyA9IGNhbGN1bGF0ZUF2Z1Bvc2l0aW9uKGFsaWdubWVudFNldCkueDtcblxuICAgICAgICAgIGFsaWdubWVudFNldC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIGlmICghZml4ZWROb2Rlcy5oYXMobm9kZUlkKSkgeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0gPSB4UG9zO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAodmFyIF9pOSA9IDA7IF9pOSA8IHhBbGlnbi5sZW5ndGg7IF9pOSsrKSB7XG4gICAgICAgICAgX2xvb3A0KF9pOSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWwpIHtcbiAgICAgICAgdmFyIHlBbGlnbiA9IGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbDtcblxuICAgICAgICB2YXIgX2xvb3A1ID0gZnVuY3Rpb24gX2xvb3A1KF9pMTApIHtcbiAgICAgICAgICB2YXIgYWxpZ25tZW50U2V0ID0gbmV3IFNldCgpO1xuICAgICAgICAgIHlBbGlnbltfaTEwXS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIGFsaWdubWVudFNldC5hZGQobm9kZUlkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgaW50ZXJzZWN0aW9uID0gbmV3IFNldChbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGFsaWdubWVudFNldCkpLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIGZpeGVkTm9kZXMuaGFzKHgpO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgICB2YXIgeVBvcyA9IHZvaWQgMDtcbiAgICAgICAgICBpZiAoaW50ZXJzZWN0aW9uLnNpemUgPiAwKSB5UG9zID0geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQoaW50ZXJzZWN0aW9uLnZhbHVlcygpLm5leHQoKS52YWx1ZSldO2Vsc2UgeVBvcyA9IGNhbGN1bGF0ZUF2Z1Bvc2l0aW9uKGFsaWdubWVudFNldCkueTtcblxuICAgICAgICAgIGFsaWdubWVudFNldC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIGlmICghZml4ZWROb2Rlcy5oYXMobm9kZUlkKSkgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0gPSB5UG9zO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAodmFyIF9pMTAgPSAwOyBfaTEwIDwgeUFsaWduLmxlbmd0aDsgX2kxMCsrKSB7XG4gICAgICAgICAgX2xvb3A1KF9pMTApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogZmluYWxseSBlbmZvcmNlIHJlbGF0aXZlIHBsYWNlbWVudCBjb25zdHJhaW50ICovXG5cbiAgICBpZiAoY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB7XG4gICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBkdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBkdW1teVBvc2l0aW9uc0ZvclZlcnRpY2FsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgZHVtbXlQb3NpdGlvbnNGb3JIb3Jpem9udGFsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgZml4ZWROb2Rlc09uSG9yaXpvbnRhbCA9IG5ldyBTZXQoKTtcbiAgICAgICAgdmFyIGZpeGVkTm9kZXNPblZlcnRpY2FsID0gbmV3IFNldCgpO1xuXG4gICAgICAgIC8vIGZpbGwgbWFwcyBhbmQgc2V0cyAgICAgIFxuICAgICAgICBmaXhlZE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgIGZpeGVkTm9kZXNPbkhvcml6b250YWwuYWRkKG5vZGVJZCk7XG4gICAgICAgICAgZml4ZWROb2Rlc09uVmVydGljYWwuYWRkKG5vZGVJZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50KSB7XG4gICAgICAgICAgaWYgKGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWwpIHtcbiAgICAgICAgICAgIHZhciB2ZXJ0aWNhbEFsaWdubWVudCA9IGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWw7XG5cbiAgICAgICAgICAgIHZhciBfbG9vcDYgPSBmdW5jdGlvbiBfbG9vcDYoX2kxMSkge1xuICAgICAgICAgICAgICBkdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LnNldChcImR1bW15XCIgKyBfaTExLCBbXSk7XG4gICAgICAgICAgICAgIHZlcnRpY2FsQWxpZ25tZW50W19pMTFdLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICAgIG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuc2V0KG5vZGVJZCwgXCJkdW1teVwiICsgX2kxMSk7XG4gICAgICAgICAgICAgICAgZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoXCJkdW1teVwiICsgX2kxMSkucHVzaChub2RlSWQpO1xuICAgICAgICAgICAgICAgIGlmIChmaXhlZE5vZGVzLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICAgICAgICBmaXhlZE5vZGVzT25Ib3Jpem9udGFsLmFkZChcImR1bW15XCIgKyBfaTExKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBkdW1teVBvc2l0aW9uc0ZvclZlcnRpY2FsQWxpZ25tZW50LnNldChcImR1bW15XCIgKyBfaTExLCB4Q29vcmRzW25vZGVJbmRleGVzLmdldCh2ZXJ0aWNhbEFsaWdubWVudFtfaTExXVswXSldKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGZvciAodmFyIF9pMTEgPSAwOyBfaTExIDwgdmVydGljYWxBbGlnbm1lbnQubGVuZ3RoOyBfaTExKyspIHtcbiAgICAgICAgICAgICAgX2xvb3A2KF9pMTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsKSB7XG4gICAgICAgICAgICB2YXIgaG9yaXpvbnRhbEFsaWdubWVudCA9IGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbDtcblxuICAgICAgICAgICAgdmFyIF9sb29wNyA9IGZ1bmN0aW9uIF9sb29wNyhfaTEyKSB7XG4gICAgICAgICAgICAgIGR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5zZXQoXCJkdW1teVwiICsgX2kxMiwgW10pO1xuICAgICAgICAgICAgICBob3Jpem9udGFsQWxpZ25tZW50W19pMTJdLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICAgIG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5zZXQobm9kZUlkLCBcImR1bW15XCIgKyBfaTEyKTtcbiAgICAgICAgICAgICAgICBkdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KFwiZHVtbXlcIiArIF9pMTIpLnB1c2gobm9kZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAoZml4ZWROb2Rlcy5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgICAgICAgZml4ZWROb2Rlc09uVmVydGljYWwuYWRkKFwiZHVtbXlcIiArIF9pMTIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGR1bW15UG9zaXRpb25zRm9ySG9yaXpvbnRhbEFsaWdubWVudC5zZXQoXCJkdW1teVwiICsgX2kxMiwgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQoaG9yaXpvbnRhbEFsaWdubWVudFtfaTEyXVswXSldKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGZvciAodmFyIF9pMTIgPSAwOyBfaTEyIDwgaG9yaXpvbnRhbEFsaWdubWVudC5sZW5ndGg7IF9pMTIrKykge1xuICAgICAgICAgICAgICBfbG9vcDcoX2kxMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uc3RydWN0IGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGRhZ3MgKHN1YmdyYXBocykgZnJvbSBvdmVyYWxsIGRhZ1xuICAgICAgICB2YXIgZGFnT25Ib3Jpem9udGFsID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgZGFnT25WZXJ0aWNhbCA9IG5ldyBNYXAoKTtcblxuICAgICAgICB2YXIgX2xvb3A4ID0gZnVuY3Rpb24gX2xvb3A4KG5vZGVJZCkge1xuICAgICAgICAgIGRhZy5nZXQobm9kZUlkKS5mb3JFYWNoKGZ1bmN0aW9uIChhZGphY2VudCkge1xuICAgICAgICAgICAgdmFyIHNvdXJjZUlkID0gdm9pZCAwO1xuICAgICAgICAgICAgdmFyIHRhcmdldE5vZGUgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoYWRqYWNlbnRbXCJkaXJlY3Rpb25cIl0gPT0gXCJob3Jpem9udGFsXCIpIHtcbiAgICAgICAgICAgICAgc291cmNlSWQgPSBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChub2RlSWQpID8gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQobm9kZUlkKSA6IG5vZGVJZDtcbiAgICAgICAgICAgICAgaWYgKG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGFkamFjZW50LmlkKSkge1xuICAgICAgICAgICAgICAgIHRhcmdldE5vZGUgPSB7IGlkOiBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChhZGphY2VudC5pZCksIGdhcDogYWRqYWNlbnQuZ2FwLCBkaXJlY3Rpb246IGFkamFjZW50LmRpcmVjdGlvbiB9O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldE5vZGUgPSBhZGphY2VudDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZGFnT25Ib3Jpem9udGFsLmhhcyhzb3VyY2VJZCkpIHtcbiAgICAgICAgICAgICAgICBkYWdPbkhvcml6b250YWwuZ2V0KHNvdXJjZUlkKS5wdXNoKHRhcmdldE5vZGUpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhZ09uSG9yaXpvbnRhbC5zZXQoc291cmNlSWQsIFt0YXJnZXROb2RlXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFkYWdPbkhvcml6b250YWwuaGFzKHRhcmdldE5vZGUuaWQpKSB7XG4gICAgICAgICAgICAgICAgZGFnT25Ib3Jpem9udGFsLnNldCh0YXJnZXROb2RlLmlkLCBbXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNvdXJjZUlkID0gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChub2RlSWQpID8gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChub2RlSWQpIDogbm9kZUlkO1xuICAgICAgICAgICAgICBpZiAobm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChhZGphY2VudC5pZCkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXROb2RlID0geyBpZDogbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChhZGphY2VudC5pZCksIGdhcDogYWRqYWNlbnQuZ2FwLCBkaXJlY3Rpb246IGFkamFjZW50LmRpcmVjdGlvbiB9O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldE5vZGUgPSBhZGphY2VudDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZGFnT25WZXJ0aWNhbC5oYXMoc291cmNlSWQpKSB7XG4gICAgICAgICAgICAgICAgZGFnT25WZXJ0aWNhbC5nZXQoc291cmNlSWQpLnB1c2godGFyZ2V0Tm9kZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGFnT25WZXJ0aWNhbC5zZXQoc291cmNlSWQsIFt0YXJnZXROb2RlXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFkYWdPblZlcnRpY2FsLmhhcyh0YXJnZXROb2RlLmlkKSkge1xuICAgICAgICAgICAgICAgIGRhZ09uVmVydGljYWwuc2V0KHRhcmdldE5vZGUuaWQsIFtdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNSA9IHRydWU7XG4gICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjUgPSBmYWxzZTtcbiAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yNSA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjUgPSBkYWcua2V5cygpW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA1OyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb241ID0gKF9zdGVwNSA9IF9pdGVyYXRvcjUubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjUgPSB0cnVlKSB7XG4gICAgICAgICAgICB2YXIgbm9kZUlkID0gX3N0ZXA1LnZhbHVlO1xuXG4gICAgICAgICAgICBfbG9vcDgobm9kZUlkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBmaW5kIHNvdXJjZSBub2RlcyBvZiBlYWNoIGNvbXBvbmVudCBpbiBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBkYWdzXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yNSA9IHRydWU7XG4gICAgICAgICAgX2l0ZXJhdG9yRXJyb3I1ID0gZXJyO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb241ICYmIF9pdGVyYXRvcjUucmV0dXJuKSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvcjUucmV0dXJuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjUpIHtcbiAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I1O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB1bmRpcmVjdGVkT25Ib3Jpem9udGFsID0gZGFnVG9VbmRpcmVjdGVkKGRhZ09uSG9yaXpvbnRhbCk7XG4gICAgICAgIHZhciB1bmRpcmVjdGVkT25WZXJ0aWNhbCA9IGRhZ1RvVW5kaXJlY3RlZChkYWdPblZlcnRpY2FsKTtcbiAgICAgICAgdmFyIGNvbXBvbmVudHNPbkhvcml6b250YWwgPSBmaW5kQ29tcG9uZW50cyh1bmRpcmVjdGVkT25Ib3Jpem9udGFsKTtcbiAgICAgICAgdmFyIGNvbXBvbmVudHNPblZlcnRpY2FsID0gZmluZENvbXBvbmVudHModW5kaXJlY3RlZE9uVmVydGljYWwpO1xuICAgICAgICB2YXIgcmV2ZXJzZWREYWdPbkhvcml6b250YWwgPSBkYWdUb1JldmVyc2VkKGRhZ09uSG9yaXpvbnRhbCk7XG4gICAgICAgIHZhciByZXZlcnNlZERhZ09uVmVydGljYWwgPSBkYWdUb1JldmVyc2VkKGRhZ09uVmVydGljYWwpO1xuICAgICAgICB2YXIgY29tcG9uZW50U291cmNlc09uSG9yaXpvbnRhbCA9IFtdO1xuICAgICAgICB2YXIgY29tcG9uZW50U291cmNlc09uVmVydGljYWwgPSBbXTtcblxuICAgICAgICBjb21wb25lbnRzT25Ib3Jpem9udGFsLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgICBjb21wb25lbnRTb3VyY2VzT25Ib3Jpem9udGFsW2luZGV4XSA9IFtdO1xuICAgICAgICAgIGNvbXBvbmVudC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIGlmIChyZXZlcnNlZERhZ09uSG9yaXpvbnRhbC5nZXQobm9kZUlkKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICBjb21wb25lbnRTb3VyY2VzT25Ib3Jpem9udGFsW2luZGV4XS5wdXNoKG5vZGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbXBvbmVudHNPblZlcnRpY2FsLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgICBjb21wb25lbnRTb3VyY2VzT25WZXJ0aWNhbFtpbmRleF0gPSBbXTtcbiAgICAgICAgICBjb21wb25lbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBpZiAocmV2ZXJzZWREYWdPblZlcnRpY2FsLmdldChub2RlSWQpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudFNvdXJjZXNPblZlcnRpY2FsW2luZGV4XS5wdXNoKG5vZGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBhcHByb3ByaWF0ZSBwb3NpdGlvbmluZyBmb3Igc3ViZ3JhcGhzXG4gICAgICAgIHZhciBwb3NpdGlvbk1hcEhvcml6b250YWwgPSBmaW5kQXBwcm9wcmlhdGVQb3NpdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50KGRhZ09uSG9yaXpvbnRhbCwgXCJob3Jpem9udGFsXCIsIGZpeGVkTm9kZXNPbkhvcml6b250YWwsIGR1bW15UG9zaXRpb25zRm9yVmVydGljYWxBbGlnbm1lbnQsIGNvbXBvbmVudFNvdXJjZXNPbkhvcml6b250YWwpO1xuICAgICAgICB2YXIgcG9zaXRpb25NYXBWZXJ0aWNhbCA9IGZpbmRBcHByb3ByaWF0ZVBvc2l0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQoZGFnT25WZXJ0aWNhbCwgXCJ2ZXJ0aWNhbFwiLCBmaXhlZE5vZGVzT25WZXJ0aWNhbCwgZHVtbXlQb3NpdGlvbnNGb3JIb3Jpem9udGFsQWxpZ25tZW50LCBjb21wb25lbnRTb3VyY2VzT25WZXJ0aWNhbCk7XG5cbiAgICAgICAgLy8gdXBkYXRlIHBvc2l0aW9ucyBvZiB0aGUgbm9kZXMgYmFzZWQgb24gcmVsYXRpdmUgcGxhY2VtZW50IGNvbnN0cmFpbnRzXG5cbiAgICAgICAgdmFyIF9sb29wOSA9IGZ1bmN0aW9uIF9sb29wOShrZXkpIHtcbiAgICAgICAgICBpZiAoZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoa2V5KSkge1xuICAgICAgICAgICAgZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoa2V5KS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0gPSBwb3NpdGlvbk1hcEhvcml6b250YWwuZ2V0KGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQoa2V5KV0gPSBwb3NpdGlvbk1hcEhvcml6b250YWwuZ2V0KGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNiA9IHRydWU7XG4gICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjYgPSBmYWxzZTtcbiAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yNiA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjYgPSBwb3NpdGlvbk1hcEhvcml6b250YWwua2V5cygpW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA2OyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb242ID0gKF9zdGVwNiA9IF9pdGVyYXRvcjYubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjYgPSB0cnVlKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gX3N0ZXA2LnZhbHVlO1xuXG4gICAgICAgICAgICBfbG9vcDkoa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yNiA9IHRydWU7XG4gICAgICAgICAgX2l0ZXJhdG9yRXJyb3I2ID0gZXJyO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb242ICYmIF9pdGVyYXRvcjYucmV0dXJuKSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvcjYucmV0dXJuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjYpIHtcbiAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfbG9vcDEwID0gZnVuY3Rpb24gX2xvb3AxMChrZXkpIHtcbiAgICAgICAgICBpZiAoZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChrZXkpKSB7XG4gICAgICAgICAgICBkdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGtleSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldID0gcG9zaXRpb25NYXBWZXJ0aWNhbC5nZXQoa2V5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB5Q29vcmRzW25vZGVJbmRleGVzLmdldChrZXkpXSA9IHBvc2l0aW9uTWFwVmVydGljYWwuZ2V0KGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNyA9IHRydWU7XG4gICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjcgPSBmYWxzZTtcbiAgICAgICAgdmFyIF9pdGVyYXRvckVycm9yNyA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjcgPSBwb3NpdGlvbk1hcFZlcnRpY2FsLmtleXMoKVtTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwNzsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNyA9IChfc3RlcDcgPSBfaXRlcmF0b3I3Lm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb243ID0gdHJ1ZSkge1xuICAgICAgICAgICAgdmFyIGtleSA9IF9zdGVwNy52YWx1ZTtcblxuICAgICAgICAgICAgX2xvb3AxMChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3I3ID0gdHJ1ZTtcbiAgICAgICAgICBfaXRlcmF0b3JFcnJvcjcgPSBlcnI7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjcgJiYgX2l0ZXJhdG9yNy5yZXR1cm4pIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yNy5yZXR1cm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yNykge1xuICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFzc2lnbiBuZXcgY29vcmRpbmF0ZXMgdG8gbm9kZXMgYWZ0ZXIgY29uc3RyYWludCBoYW5kbGluZ1xuICBmb3IgKHZhciBfaTEzID0gMDsgX2kxMyA8IGFsbE5vZGVzLmxlbmd0aDsgX2kxMysrKSB7XG4gICAgdmFyIF9ub2RlID0gYWxsTm9kZXNbX2kxM107XG4gICAgaWYgKF9ub2RlLmdldENoaWxkKCkgPT0gbnVsbCkge1xuICAgICAgX25vZGUuc2V0Q2VudGVyKHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KF9ub2RlLmlkKV0sIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KF9ub2RlLmlkKV0pO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb25zdHJhaW50SGFuZGxlcjtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU1MTpcbi8qKiovICgobW9kdWxlKSA9PiB7XG5cbm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNTUxX187XG5cbi8qKiovIH0pXG5cbi8qKioqKiovIFx0fSk7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcbi8qKioqKiovIFx0XHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi8gXHRcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvLyBzdGFydHVwXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHQvLyBUaGlzIGVudHJ5IG1vZHVsZSBpcyByZWZlcmVuY2VkIGJ5IG90aGVyIG1vZHVsZXMgc28gaXQgY2FuJ3QgYmUgaW5saW5lZFxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDUpO1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19leHBvcnRzX187XG4vKioqKioqLyB9KSgpXG47XG59KTsiLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLl9kYXNoLXVuZG8tcmVkbyB7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIGJvdHRvbTogMzBweDtcbiAgICBsZWZ0OiAzMHB4O1xuICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgei1pbmRleDogOTk5OTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7XG5cbn1cbi5fZGFzaC11bmRvLXJlZG8+ZGl2IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4uX2Rhc2gtdW5kby1yZWRvLWxpbmsge1xuICAgIGNvbG9yOiAjMDA3NEQ5O1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG9wYWNpdHk6IDAuMjtcbn1cbi5fZGFzaC11bmRvLXJlZG8tbGluazpob3ZlciB7XG4gICAgb3BhY2l0eTogMTtcbn1cbi5fZGFzaC11bmRvLXJlZG8tbGluayAuX2Rhc2gtaWNvbi11bmRvIHtcbiAgICBmb250LXNpemU6IDIwcHg7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTtcbn1cbi5fZGFzaC11bmRvLXJlZG8tbGluayAuX2Rhc2gtaWNvbi1yZWRvIHtcbiAgICBmb250LXNpemU6IDIwcHg7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpO1xufVxuLl9kYXNoLXVuZG8tcmVkby1saW5rIC5fZGFzaC11bmRvLXJlZG8tbGFiZWwge1xuICAgIGZvbnQtc2l6ZTogMTVweDtcbn1cbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2NvbXBvbmVudHMvY29yZS9Ub29sYmFyLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGVBQWU7SUFDZixZQUFZO0lBQ1osVUFBVTtJQUNWLGVBQWU7SUFDZixrQkFBa0I7SUFDbEIsYUFBYTtJQUNiLDBDQUEwQzs7QUFFOUM7QUFDQTtJQUNJLGtCQUFrQjtBQUN0QjtBQUNBO0lBQ0ksY0FBYztJQUNkLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsa0JBQWtCO0lBQ2xCLHFCQUFxQjtJQUNyQixZQUFZO0FBQ2hCO0FBQ0E7SUFDSSxVQUFVO0FBQ2Q7QUFDQTtJQUNJLGVBQWU7SUFDZix5QkFBeUI7QUFDN0I7QUFDQTtJQUNJLGVBQWU7SUFDZix3QkFBd0I7QUFDNUI7QUFDQTtJQUNJLGVBQWU7QUFDbkJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLl9kYXNoLXVuZG8tcmVkbyB7XFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXG4gICAgYm90dG9tOiAzMHB4O1xcbiAgICBsZWZ0OiAzMHB4O1xcbiAgICBmb250LXNpemU6IDIwcHg7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgei1pbmRleDogOTk5OTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcblxcbn1cXG4uX2Rhc2gtdW5kby1yZWRvPmRpdiB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuLl9kYXNoLXVuZG8tcmVkby1saW5rIHtcXG4gICAgY29sb3I6ICMwMDc0RDk7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XFxuICAgIG1hcmdpbi1yaWdodDogMTBweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBvcGFjaXR5OiAwLjI7XFxufVxcbi5fZGFzaC11bmRvLXJlZG8tbGluazpob3ZlciB7XFxuICAgIG9wYWNpdHk6IDE7XFxufVxcbi5fZGFzaC11bmRvLXJlZG8tbGluayAuX2Rhc2gtaWNvbi11bmRvIHtcXG4gICAgZm9udC1zaXplOiAyMHB4O1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpO1xcbn1cXG4uX2Rhc2gtdW5kby1yZWRvLWxpbmsgLl9kYXNoLWljb24tcmVkbyB7XFxuICAgIGZvbnQtc2l6ZTogMjBweDtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpO1xcbn1cXG4uX2Rhc2gtdW5kby1yZWRvLWxpbmsgLl9kYXNoLXVuZG8tcmVkby1sYWJlbCB7XFxuICAgIGZvbnQtc2l6ZTogMTVweDtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAuZGFzaC1jYWxsYmFjay1kYWctLWNvbnRhaW5lciB7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICBib3R0b206IDE2NXB4O1xuICAgIHJpZ2h0OiAxNnB4O1xuICAgIHdpZHRoOiA4MHZ3O1xuICAgIGhlaWdodDogY2FsYygxMDB2aCAtIDE4MHB4KTtcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIC8qIHNoYWRvdy0xICovXG4gICAgYm94LXNoYWRvdzogMHB4IDZweCAxNnB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjE2NSksXG4gICAgICAgIDBweCAycHggNnB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjEyKSxcbiAgICAgICAgMHB4IDBweCAxcHggcmdiYSg4MCwgMTAzLCAxMzIsIDAuMzIpO1xufVxuXG4uZGFzaC1jYWxsYmFjay1kYWctLWluZm8ge1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcGFkZGluZzogOHB4O1xuICAgIGJvdHRvbTogMTZweDtcbiAgICBsZWZ0OiAxNnB4O1xuICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gMzJweCk7XG4gICAgbWF4LWhlaWdodDogNTAlO1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjkpO1xuICAgIGJvcmRlcjogMnB4IHNvbGlkICNjY2M7XG4gICAgZm9udC1mYW1pbHk6IFwiQXJpYWxcIiwgc2Fucy1zZXJpZjtcbn1cblxuLmRhc2gtY2FsbGJhY2stZGFnLS1tZXNzYWdlIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgbGluZS1oZWlnaHQ6IDJlbTtcbiAgICBmb250LWZhbWlseTogXCJBcmlhbFwiLCBzYW5zLXNlcmlmO1xufVxuXG4uZGFzaC1jYWxsYmFjay1kYWctLWxheW91dFNlbGVjdG9yIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAxMHB4O1xuICAgIHJpZ2h0OiAxMHB4O1xufVxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY29tcG9uZW50cy9lcnJvci9DYWxsYmFja0dyYXBoL0NhbGxiYWNrR3JhcGhDb250YWluZXIuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZixhQUFhO0lBQ2IsV0FBVztJQUNYLFdBQVc7SUFDWCwyQkFBMkI7SUFDM0IsY0FBYztJQUNkLHNCQUFzQjtJQUN0QixtQkFBbUI7SUFDbkIscUJBQXFCO0lBQ3JCLGFBQWE7SUFDYjs7NENBRXdDO0FBQzVDOztBQUVBO0lBQ0ksa0JBQWtCO0lBQ2xCLGtCQUFrQjtJQUNsQixZQUFZO0lBQ1osWUFBWTtJQUNaLFVBQVU7SUFDViw0QkFBNEI7SUFDNUIsZUFBZTtJQUNmLGNBQWM7SUFDZCxzQkFBc0I7SUFDdEIsaUNBQWlDO0lBQ2pDLHNCQUFzQjtJQUN0QixnQ0FBZ0M7QUFDcEM7O0FBRUE7SUFDSSxhQUFhO0lBQ2Isc0JBQXNCO0lBQ3RCLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsWUFBWTtJQUNaLGdCQUFnQjtJQUNoQixnQ0FBZ0M7QUFDcEM7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsU0FBUztJQUNULFdBQVc7QUFDZlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuZGFzaC1jYWxsYmFjay1kYWctLWNvbnRhaW5lciB7XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcbiAgICBib3R0b206IDE2NXB4O1xcbiAgICByaWdodDogMTZweDtcXG4gICAgd2lkdGg6IDgwdnc7XFxuICAgIGhlaWdodDogY2FsYygxMDB2aCAtIDE4MHB4KTtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgLyogc2hhZG93LTEgKi9cXG4gICAgYm94LXNoYWRvdzogMHB4IDZweCAxNnB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjE2NSksXFxuICAgICAgICAwcHggMnB4IDZweCByZ2JhKDgwLCAxMDMsIDEzMiwgMC4xMiksXFxuICAgICAgICAwcHggMHB4IDFweCByZ2JhKDgwLCAxMDMsIDEzMiwgMC4zMik7XFxufVxcblxcbi5kYXNoLWNhbGxiYWNrLWRhZy0taW5mbyB7XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBwYWRkaW5nOiA4cHg7XFxuICAgIGJvdHRvbTogMTZweDtcXG4gICAgbGVmdDogMTZweDtcXG4gICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSAzMnB4KTtcXG4gICAgbWF4LWhlaWdodDogNTAlO1xcbiAgICBvdmVyZmxvdzogYXV0bztcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjkpO1xcbiAgICBib3JkZXI6IDJweCBzb2xpZCAjY2NjO1xcbiAgICBmb250LWZhbWlseTogXFxcIkFyaWFsXFxcIiwgc2Fucy1zZXJpZjtcXG59XFxuXFxuLmRhc2gtY2FsbGJhY2stZGFnLS1tZXNzYWdlIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGhlaWdodDogMTAwJTtcXG4gICAgbGluZS1oZWlnaHQ6IDJlbTtcXG4gICAgZm9udC1mYW1pbHk6IFxcXCJBcmlhbFxcXCIsIHNhbnMtc2VyaWY7XFxufVxcblxcbi5kYXNoLWNhbGxiYWNrLWRhZy0tbGF5b3V0U2VsZWN0b3Ige1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMTBweDtcXG4gICAgcmlnaHQ6IDEwcHg7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLmVycm9yLWNvbnRhaW5lciB7XG4gICAgbWFyZ2luLXRvcDogMTBweDtcbn1cblxuLmRhc2gtZmUtZXJyb3JfX2ljb24teCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAwO1xuICAgIHRvcDogMDtcbiAgICBjb2xvcjogI0I5QzJDRTtcbiAgICBmb250LXNpemU6IDIwcHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIG1hcmdpbi1yaWdodDogMTBweFxufVxuXG4uZGFzaC1mZS1lcnJvcl9faWNvbi14OmhvdmVyXG57XG4gY29sb3I6I2ExYTliNTtcbn1cblxuXG4uZGFzaC1mZS1lcnJvcnMge1xuICAgIG1pbi13aWR0aDogMzg2cHg7XG4gICAgbWF4LXdpZHRoOiA2NTBweDtcbiAgICBtYXgtaGVpZ2h0OiA0NTBweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi5kYXNoLWZlLWVycm9yX19pY29uLWVycm9yIHtcbiAgICB3aWR0aDogMjBweDtcbiAgICBoZWlnaHQ6IDIwcHg7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbi1yaWdodDogMTZweDtcbn1cbi5kYXNoLWZlLWVycm9yX19pY29uLWNsb3NlIHtcbiAgICB3aWR0aDogMTBweDtcbiAgICBoZWlnaHQ6IDEwcHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAxMnB4O1xuICAgIHRvcDogMTJweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4uZGFzaC1mZS1lcnJvcl9faWNvbi1hcnJvdyB7XG4gICAgd2lkdGg6IDhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgbWFyZ2luOiAwcHggOHB4O1xufVxuLmRhc2gtZmUtZXJyb3ItdG9wIHtcbiAgICBoZWlnaHQ6IDIwcHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuLmRhc2gtZmUtZXJyb3ItdG9wX19ncm91cDpmaXJzdC1jaGlsZCB7XG4gICAgLypcbiAgICAgKiA3NyUgaXMgdGhlIG1heGltdW0gc3BhY2UgYWxsb3dlZCBiYXNlZCBvZmYgb2YgdGhlIG90aGVyIGVsZW1lbnRzXG4gICAgICogaW4gdGhlIHRvcCBwYXJ0IG9mIHRoZSBlcnJvciBjb250YWluZXIgKHRpbWVzdGFtcCAmIGNvbGxhcHNlIGFycm93KS5cbiAgICAgKiB0aGlzIHdhcyBtYW51YWxseSBkZXRlcm1pbmVkICovXG4gICAgd2lkdGg6IDc3JTtcbn1cbi5kYXNoLWZlLWVycm9yLXRvcF9fZ3JvdXAge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG4uZGFzaC1mZS1lcnJvcl9fdGl0bGUge1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgbWFyZ2luOiAwcHg7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICBwYWRkaW5nOiAwcHg7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG4uZGFzaC1mZS1lcnJvcl9fdGltZXN0YW1wIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7XG59XG4uZGFzaC1mZS1lcnJvcl9fY29sbGFwc2UtLWZsaXBwZWQge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbiAgICAtbXMtdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xufVxuXG4uZGFzaC1mZS1lcnJvcl9faW5mb190aXRsZSB7XG4gICAgbWFyZ2luOiAwO1xuICAgIGNvbG9yOiAjNTA2Nzg0O1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmNmZhO1xuICAgIGJvcmRlcjogMnB4IHNvbGlkICNkZmU4ZjM7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7XG4gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDtcbiAgICBwYWRkaW5nOiAxMHB4O1xufVxuXG4uZGFzaC1mZS1lcnJvcl9faW5mbyB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2RmZThmMztcbiAgICBtYXJnaW46IDAgMCAxZW0gMDtcbiAgICBwYWRkaW5nOiAxMHB4O1xuXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcbiAgICBjb2xvcjogIzUwNjc4NDtcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG59XG5cbi5kYXNoLWZlLWVycm9yX19jdXJ2ZWQge1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cblxuLmRhc2gtZmUtZXJyb3JfX2N1cnZlZC10b3Age1xuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDtcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4O1xuICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDBweDtcbn1cblxuLmRhc2gtZmUtZXJyb3JfX2N1cnZlZC1ib3R0b20ge1xuICAgIGJvcmRlci1yYWRpdXMtYm90dG9tLWxlZnQ6IDRweDtcbiAgICBib3JkZXItcmFkaXVzLWJvdHRvbS1yaWdodDogNHB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkVGRUY7XG59XG5cbi5kYXNoLWJlLWVycm9yX19zdCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZkZjNmNDtcbiAgICBtaW4td2lkdGg6IDM4NnB4O1xuICAgIG1heC13aWR0aDogNjUwcHg7XG4gICAgLyogaWZyYW1lIGNvbnRhaW5lciBoYW5kbGVzIHRoZSBzY3JvbGxpbmcgKi9cbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuLmRhc2gtYmUtZXJyb3JfX3N0ciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZkZjNmNDtcbiAgICBtaW4td2lkdGg6IDM4NnB4O1xuICAgIG1heC13aWR0aDogNjUwcHg7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbn1cbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvRnJvbnRFbmQvRnJvbnRFbmRFcnJvci5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsUUFBUTtJQUNSLE1BQU07SUFDTixjQUFjO0lBQ2QsZUFBZTtJQUNmLGVBQWU7SUFDZjtBQUNKOztBQUVBOztDQUVDLGFBQWE7QUFDZDs7O0FBR0E7SUFDSSxnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQixxQkFBcUI7QUFDekI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsWUFBWTtJQUNaLHFCQUFxQjtJQUNyQixrQkFBa0I7QUFDdEI7QUFDQTtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLFdBQVc7SUFDWCxTQUFTO0lBQ1QscUJBQXFCO0FBQ3pCO0FBQ0E7SUFDSSxVQUFVO0lBQ1YsWUFBWTtJQUNaLGVBQWU7QUFDbkI7QUFDQTtJQUNJLFlBQVk7SUFDWixhQUFhO0lBQ2IsOEJBQThCO0lBQzlCLFdBQVc7SUFDWCxlQUFlO0FBQ25CO0FBQ0E7SUFDSTs7O3FDQUdpQztJQUNqQyxVQUFVO0FBQ2Q7QUFDQTtJQUNJLG9CQUFvQjtJQUNwQixtQkFBbUI7QUFDdkI7QUFDQTtJQUNJLGdCQUFnQjtJQUNoQixXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLFlBQVk7SUFDWixlQUFlO0lBQ2YscUJBQXFCO0lBQ3JCLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsZ0JBQWdCO0FBQ3BCO0FBQ0E7SUFDSSxrQkFBa0I7QUFDdEI7QUFDQTtJQUNJLGlDQUFpQztJQUNqQyw2QkFBNkI7SUFDN0IseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0ksU0FBUztJQUNULGNBQWM7SUFDZCxlQUFlO0lBQ2YseUJBQXlCO0lBQ3pCLHlCQUF5QjtJQUN6QixzQkFBc0I7SUFDdEIsMkJBQTJCO0lBQzNCLDRCQUE0QjtJQUM1QixhQUFhO0FBQ2pCOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLGlCQUFpQjtJQUNqQixhQUFhOztJQUViLHVCQUF1QjtJQUN2Qix5QkFBeUI7SUFDekIsY0FBYztJQUNkLGNBQWM7SUFDZCxxQkFBcUI7QUFDekI7O0FBRUE7SUFDSSxrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSwyQkFBMkI7SUFDM0IsNEJBQTRCO0lBQzVCLHdCQUF3QjtBQUM1Qjs7QUFFQTtJQUNJLDhCQUE4QjtJQUM5QiwrQkFBK0I7SUFDL0IseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsMkNBQTJDO0lBQzNDLGdCQUFnQjtJQUNoQixxQkFBcUI7QUFDekI7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixjQUFjO0lBQ2QscUJBQXFCO0lBQ3JCLHFCQUFxQjtBQUN6QlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuZXJyb3ItY29udGFpbmVyIHtcXG4gICAgbWFyZ2luLXRvcDogMTBweDtcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2ljb24teCB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIHRvcDogMDtcXG4gICAgY29sb3I6ICNCOUMyQ0U7XFxuICAgIGZvbnQtc2l6ZTogMjBweDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBtYXJnaW4tcmlnaHQ6IDEwcHhcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2ljb24teDpob3ZlclxcbntcXG4gY29sb3I6I2ExYTliNTtcXG59XFxuXFxuXFxuLmRhc2gtZmUtZXJyb3JzIHtcXG4gICAgbWluLXdpZHRoOiAzODZweDtcXG4gICAgbWF4LXdpZHRoOiA2NTBweDtcXG4gICAgbWF4LWhlaWdodDogNDUwcHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2ljb24tZXJyb3Ige1xcbiAgICB3aWR0aDogMjBweDtcXG4gICAgaGVpZ2h0OiAyMHB4O1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIG1hcmdpbi1yaWdodDogMTZweDtcXG59XFxuLmRhc2gtZmUtZXJyb3JfX2ljb24tY2xvc2Uge1xcbiAgICB3aWR0aDogMTBweDtcXG4gICAgaGVpZ2h0OiAxMHB4O1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHJpZ2h0OiAxMnB4O1xcbiAgICB0b3A6IDEycHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuLmRhc2gtZmUtZXJyb3JfX2ljb24tYXJyb3cge1xcbiAgICB3aWR0aDogOHB4O1xcbiAgICBoZWlnaHQ6IDI4cHg7XFxuICAgIG1hcmdpbjogMHB4IDhweDtcXG59XFxuLmRhc2gtZmUtZXJyb3ItdG9wIHtcXG4gICAgaGVpZ2h0OiAyMHB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5kYXNoLWZlLWVycm9yLXRvcF9fZ3JvdXA6Zmlyc3QtY2hpbGQge1xcbiAgICAvKlxcbiAgICAgKiA3NyUgaXMgdGhlIG1heGltdW0gc3BhY2UgYWxsb3dlZCBiYXNlZCBvZmYgb2YgdGhlIG90aGVyIGVsZW1lbnRzXFxuICAgICAqIGluIHRoZSB0b3AgcGFydCBvZiB0aGUgZXJyb3IgY29udGFpbmVyICh0aW1lc3RhbXAgJiBjb2xsYXBzZSBhcnJvdykuXFxuICAgICAqIHRoaXMgd2FzIG1hbnVhbGx5IGRldGVybWluZWQgKi9cXG4gICAgd2lkdGg6IDc3JTtcXG59XFxuLmRhc2gtZmUtZXJyb3ItdG9wX19ncm91cCB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9fdGl0bGUge1xcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xcbiAgICBtYXJnaW46IDBweDtcXG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcXG4gICAgcGFkZGluZzogMHB4O1xcbiAgICBmb250LXNpemU6IDE0cHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxufVxcbi5kYXNoLWZlLWVycm9yX190aW1lc3RhbXAge1xcbiAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7XFxufVxcbi5kYXNoLWZlLWVycm9yX19jb2xsYXBzZS0tZmxpcHBlZCB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gICAgLW1zLXRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19pbmZvX3RpdGxlIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBjb2xvcjogIzUwNjc4NDtcXG4gICAgZm9udC1zaXplOiAxNnB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmNmZhO1xcbiAgICBib3JkZXI6IDJweCBzb2xpZCAjZGZlOGYzO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7XFxuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7XFxuICAgIHBhZGRpbmc6IDEwcHg7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19pbmZvIHtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2RmZThmMztcXG4gICAgbWFyZ2luOiAwIDAgMWVtIDA7XFxuICAgIHBhZGRpbmc6IDEwcHg7XFxuXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgICBib3JkZXI6IDJweCBzb2xpZCAjZGZlOGYzO1xcbiAgICBjb2xvcjogIzUwNjc4NDtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2N1cnZlZCB7XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2N1cnZlZC10b3Age1xcbiAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7XFxuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7XFxuICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDBweDtcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2N1cnZlZC1ib3R0b20ge1xcbiAgICBib3JkZXItcmFkaXVzLWJvdHRvbS1sZWZ0OiA0cHg7XFxuICAgIGJvcmRlci1yYWRpdXMtYm90dG9tLXJpZ2h0OiA0cHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkVGRUY7XFxufVxcblxcbi5kYXNoLWJlLWVycm9yX19zdCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZGYzZjQ7XFxuICAgIG1pbi13aWR0aDogMzg2cHg7XFxuICAgIG1heC13aWR0aDogNjUwcHg7XFxuICAgIC8qIGlmcmFtZSBjb250YWluZXIgaGFuZGxlcyB0aGUgc2Nyb2xsaW5nICovXFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuXFxuLmRhc2gtYmUtZXJyb3JfX3N0ciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZGYzZjQ7XFxuICAgIG1pbi13aWR0aDogMzg2cHg7XFxuICAgIG1heC13aWR0aDogNjUwcHg7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAuZGFzaC1lcnJvci1tZW51IHtcbiAgICBtYXgtd2lkdGg6IDUwJTtcbiAgICBtYXgtaGVpZ2h0OiA2MCU7XG4gICAgZGlzcGxheTogY29udGVudHM7XG4gICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgZm9udC12YXJpYW50LWxpZ2F0dXJlczogY29tbW9uLWxpZ2F0dXJlcztcbiAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xufVxuXG4uZGFzaC1lcnJvci1jYXJkIHtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIC8qIHNoYWRvdy0xICovXG4gICAgYm94LXNoYWRvdzogMHB4IDZweCAxNnB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjE2NSksXG4gICAgICAgIDBweCAycHggNnB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjEyKSxcbiAgICAgICAgMHB4IDBweCAxcHggcmdiYSg4MCwgMTAzLCAxMzIsIDAuMzIpO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgdG9wOiAxNnB4O1xuICAgIHJpZ2h0OiAxNnB4O1xuICAgIGFuaW1hdGlvbjogZGFzaC1lcnJvci1jYXJkLWFuaW1hdGlvbiAwLjVzO1xuICAgIHBhZGRpbmc6IDI0cHg7XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcblxufVxuLmRhc2gtZXJyb3ItY2FyZC0tYWxlcnRzLXRyYXkge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IC0zMDBweDtcbiAgICBsZWZ0OiAtMXB4O1xuICAgIGFuaW1hdGlvbjogbm9uZTtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNlY2VjZWM7XG4gICAgYm9yZGVyLWJvdHRvbTogMDtcbiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwcHg7XG4gICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDBweDtcbiAgICB3aWR0aDogNDIycHg7XG59XG4uZGFzaC1lcnJvci1jYXJkLS1jb250YWluZXIge1xuICAgIHBhZGRpbmc6IDEwcHggMTBweDtcbiAgICB3aWR0aDogNjAwcHg7XG4gICAgbWF4LXdpZHRoOiA4MDBweDtcbiAgICBtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNTBweCk7XG4gICAgbWFyZ2luOiAxMHB4O1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIHotaW5kZXg6IDExMDA7ICAvKiBhYm92ZSB0aGUgcGxvdGx5LmpzIHRvb2xiYXIgYW5kIEJvb3RzdHJhcCBjb21wb25lbnRzICovXG59XG5cbi5kYXNoLWVycm9yLWNhcmRfX3RvcGJhciB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAzMnB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4uZGFzaC1lcnJvci1jYXJkX19tZXNzYWdlIHtcbiAgICBmb250LXNpemU6IDE0cHg7XG59XG5cbi5kYXNoLWVycm9yLWNhcmRfX21lc3NhZ2UgPiBzdHJvbmcge1xuICAgIGNvbG9yOiAjZmY0NTAwO1xufVxuXG4uZGFzaC1lcnJvci1jYXJkX19jb250ZW50IHtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIHBhZGRpbmc6IDEwcHggMTBweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMjUpLFxuICAgICAgICAwcHggMXB4IDNweCByZ2JhKDE2MiwgMTc3LCAxOTgsIDAuMzIpO1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICBtYXJnaW4tYm90dG9tOiA4cHg7XG59XG5cbi5kYXNoLWVycm9yLWNhcmRfX2xpc3QtaXRlbSB7XG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMjUpLFxuICAgICAgICAwcHggMXB4IDNweCByZ2JhKDE2MiwgMTc3LCAxOTgsIDAuMzIpO1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICBwYWRkaW5nOiAxMHB4IDEwcHg7XG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbkBrZXlmcmFtZXMgZGFzaC1lcnJvci1jYXJkLWFuaW1hdGlvbiB7XG4gICAgZnJvbSB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLjEpO1xuICAgICAgICAtbW96LXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcbiAgICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjEpO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICAgICAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgICAgICAtbXMtdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICB9XG59XG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0dsb2JhbEVycm9yT3ZlcmxheS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxjQUFjO0lBQ2QsZUFBZTtJQUNmLGlCQUFpQjtJQUNqQixzQkFBc0I7SUFDdEIsZUFBZTtJQUNmLHdDQUF3QztJQUN4QyxzQkFBc0I7QUFDMUI7O0FBRUE7SUFDSSxzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLHFCQUFxQjtJQUNyQixhQUFhO0lBQ2I7OzRDQUV3QztJQUN4QyxrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLFNBQVM7SUFDVCxXQUFXO0lBQ1gseUNBQXlDO0lBQ3pDLGFBQWE7SUFDYixnQkFBZ0I7SUFDaEIsdUJBQXVCOztBQUUzQjtBQUNBO0lBQ0ksa0JBQWtCO0lBQ2xCLFdBQVc7SUFDWCxVQUFVO0lBQ1YsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQix5QkFBeUI7SUFDekIsZ0JBQWdCO0lBQ2hCLDhCQUE4QjtJQUM5QiwrQkFBK0I7SUFDL0IsWUFBWTtBQUNoQjtBQUNBO0lBQ0ksa0JBQWtCO0lBQ2xCLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsOEJBQThCO0lBQzlCLFlBQVk7SUFDWixjQUFjO0lBQ2QsYUFBYSxHQUFHLHlEQUF5RDtBQUM3RTs7QUFFQTtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osYUFBYTtJQUNiLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsa0JBQWtCO0FBQ3RCO0FBQ0E7SUFDSSxlQUFlO0FBQ25COztBQUVBO0lBQ0ksY0FBYztBQUNsQjs7QUFFQTtJQUNJLHNCQUFzQjtJQUN0QixrQkFBa0I7SUFDbEIsdUJBQXVCO0lBQ3ZCOzZDQUN5QztJQUN6QyxrQkFBa0I7SUFDbEIsa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksbUJBQW1CO0lBQ25COzZDQUN5QztJQUN6QyxrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixhQUFhO0lBQ2IsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0k7UUFDSSxVQUFVO1FBQ1YsNkJBQTZCO1FBQzdCLDBCQUEwQjtRQUMxQix5QkFBeUI7UUFDekIscUJBQXFCO0lBQ3pCO0lBQ0E7UUFDSSxVQUFVO1FBQ1YsMkJBQTJCO1FBQzNCLHdCQUF3QjtRQUN4Qix1QkFBdUI7UUFDdkIsbUJBQW1CO0lBQ3ZCO0FBQ0pcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLmRhc2gtZXJyb3ItbWVudSB7XFxuICAgIG1heC13aWR0aDogNTAlO1xcbiAgICBtYXgtaGVpZ2h0OiA2MCU7XFxuICAgIGRpc3BsYXk6IGNvbnRlbnRzO1xcbiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xcbiAgICBmb250LXNpemU6IDE0cHg7XFxuICAgIGZvbnQtdmFyaWFudC1saWdhdHVyZXM6IGNvbW1vbi1saWdhdHVyZXM7XFxuICAgIGNvbG9yOiByZ2IoNTAsIDUwLCA1MCk7XFxufVxcblxcbi5kYXNoLWVycm9yLWNhcmQge1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIC8qIHNoYWRvdy0xICovXFxuICAgIGJveC1zaGFkb3c6IDBweCA2cHggMTZweCByZ2JhKDgwLCAxMDMsIDEzMiwgMC4xNjUpLFxcbiAgICAgICAgMHB4IDJweCA2cHggcmdiYSg4MCwgMTAzLCAxMzIsIDAuMTIpLFxcbiAgICAgICAgMHB4IDBweCAxcHggcmdiYSg4MCwgMTAzLCAxMzIsIDAuMzIpO1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXG4gICAgdG9wOiAxNnB4O1xcbiAgICByaWdodDogMTZweDtcXG4gICAgYW5pbWF0aW9uOiBkYXNoLWVycm9yLWNhcmQtYW5pbWF0aW9uIDAuNXM7XFxuICAgIHBhZGRpbmc6IDI0cHg7XFxuICAgIHRleHQtYWxpZ246IGxlZnQ7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcblxcbn1cXG4uZGFzaC1lcnJvci1jYXJkLS1hbGVydHMtdHJheSB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAtMzAwcHg7XFxuICAgIGxlZnQ6IC0xcHg7XFxuICAgIGFuaW1hdGlvbjogbm9uZTtcXG4gICAgYm94LXNoYWRvdzogbm9uZTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2VjZWNlYztcXG4gICAgYm9yZGVyLWJvdHRvbTogMDtcXG4gICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMHB4O1xcbiAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMHB4O1xcbiAgICB3aWR0aDogNDIycHg7XFxufVxcbi5kYXNoLWVycm9yLWNhcmQtLWNvbnRhaW5lciB7XFxuICAgIHBhZGRpbmc6IDEwcHggMTBweDtcXG4gICAgd2lkdGg6IDYwMHB4O1xcbiAgICBtYXgtd2lkdGg6IDgwMHB4O1xcbiAgICBtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNTBweCk7XFxuICAgIG1hcmdpbjogMTBweDtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIHotaW5kZXg6IDExMDA7ICAvKiBhYm92ZSB0aGUgcGxvdGx5LmpzIHRvb2xiYXIgYW5kIEJvb3RzdHJhcCBjb21wb25lbnRzICovXFxufVxcblxcbi5kYXNoLWVycm9yLWNhcmRfX3RvcGJhciB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBoZWlnaHQ6IDMycHg7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcbi5kYXNoLWVycm9yLWNhcmRfX21lc3NhZ2Uge1xcbiAgICBmb250LXNpemU6IDE0cHg7XFxufVxcblxcbi5kYXNoLWVycm9yLWNhcmRfX21lc3NhZ2UgPiBzdHJvbmcge1xcbiAgICBjb2xvcjogI2ZmNDUwMDtcXG59XFxuXFxuLmRhc2gtZXJyb3ItY2FyZF9fY29udGVudCB7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIHBhZGRpbmc6IDEwcHggMTBweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgIGJveC1zaGFkb3c6IDBweCAwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4yNSksXFxuICAgICAgICAwcHggMXB4IDNweCByZ2JhKDE2MiwgMTc3LCAxOTgsIDAuMzIpO1xcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XFxuICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG59XFxuXFxuLmRhc2gtZXJyb3ItY2FyZF9fbGlzdC1pdGVtIHtcXG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcXG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjI1KSxcXG4gICAgICAgIDBweCAxcHggM3B4IHJnYmEoMTYyLCAxNzcsIDE5OCwgMC4zMik7XFxuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcXG4gICAgcGFkZGluZzogMTBweCAxMHB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG5cXG5Aa2V5ZnJhbWVzIGRhc2gtZXJyb3ItY2FyZC1hbmltYXRpb24ge1xcbiAgICBmcm9tIHtcXG4gICAgICAgIG9wYWNpdHk6IDA7XFxuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgICAgIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxLjEpO1xcbiAgICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgfVxcbiAgICB0byB7XFxuICAgICAgICBvcGFjaXR5OiAxO1xcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICAgICAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMSk7XFxuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICB9XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLnBlcmN5LXNob3cge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbkBtZWRpYSBvbmx5IHBlcmN5IHtcbiAgICAucGVyY3ktaGlkZSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICAgIC5wZXJjeS1zaG93IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxufVxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY29tcG9uZW50cy9lcnJvci9QZXJjeS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxhQUFhO0FBQ2pCOztBQUVBO0lBQ0k7UUFDSSxhQUFhO0lBQ2pCO0lBQ0E7UUFDSSxjQUFjO0lBQ2xCO0FBQ0pcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLnBlcmN5LXNob3cge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG5AbWVkaWEgb25seSBwZXJjeSB7XFxuICAgIC5wZXJjeS1oaWRlIHtcXG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIH1cXG4gICAgLnBlcmN5LXNob3cge1xcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XFxuICAgIH1cXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAuZGFzaC1kZWJ1Zy1tZW51IHtcbiAgICB0cmFuc2l0aW9uOiAwLjNzO1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICBib3R0b206IDM1cHg7XG4gICAgcmlnaHQ6IDM1cHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHotaW5kZXg6IDEwMDAxO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMxMTlkZmY7XG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTtcbiAgICB3aWR0aDogNjRweDtcbiAgICBoZWlnaHQ6IDY0cHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuLmRhc2gtZGVidWctbWVudS0tb3BlbiB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoLTE4MGRlZyk7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnU6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMxMDhkZTQ7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX2ljb24ge1xuICAgIHdpZHRoOiBhdXRvO1xuICAgIGhlaWdodDogMjRweDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fb3V0ZXIge1xuICAgIHRyYW5zaXRpb246IDAuM3M7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgYm90dG9tOiAyN3B4O1xuICAgIHJpZ2h0OiAyN3B4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB6LWluZGV4OiAxMDAwMDtcbiAgICBoZWlnaHQ6IDgwcHg7XG4gICAgYm9yZGVyLXJhZGl1czogNDBweDtcbiAgICBwYWRkaW5nOiA1cHggNzhweCA1cHggNXB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjI1KSxcbiAgICAgICAgMHB4IDFweCAzcHggcmdiYSgxNjIsIDE3NywgMTk4LCAwLjMyKTtcbn1cbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyLS1jbG9zZWQge1xuICAgIGhlaWdodDogNjBweDtcbiAgICB3aWR0aDogNjBweDtcbiAgICBib3R0b206IDM3cHg7XG4gICAgcmlnaHQ6IDM3cHg7XG4gICAgcGFkZGluZzogMDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fY29udGVudCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHdpZHRoOiA3NHB4O1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X19idXR0b24ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQjlDMkNFO1xuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgd2lkdGg6IDY0cHg7XG4gICAgaGVpZ2h0OiA2NHB4O1xuICAgIGZvbnQtc2l6ZTogMTBweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XG4gICAgY29sb3I6ICNmZmY7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYTFhOWI1O1xufVxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1lbmFibGVkIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDBDQzk2O1xufVxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1lbmFibGVkOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDNiYjhhO1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tbGFiZWwge1xuICAgIGN1cnNvcjogaW5oZXJpdDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uOjpiZWZvcmUge1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3R0b206IDExMCU7XG4gICAgbGVmdDogNTAlO1xuICAgIG1hcmdpbi1sZWZ0OiAtNjBweDtcbiAgICBwYWRkaW5nOiA3cHg7XG4gICAgd2lkdGg6IDEyMHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDY4LDY4LDY4LDAuNyk7XG4gICAgY29sb3I6ICNmZmY7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGZvbnQtc2l6ZTogMTBweDtcbiAgICBsaW5lLWhlaWdodDogMS4yO1xufVxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uOmhvdmVyOjpiZWZvcmUge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG59XG4uZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tLWNhbGxiYWNrczo6YmVmb3JlIHtcbiAgICBjb250ZW50OiBcIlRvZ2dsZSBDYWxsYmFjayBHcmFwaFwiO1xufVxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1lcnJvcnM6OmJlZm9yZSB7XG4gICAgY29udGVudDogXCJUb2dnbGUgRXJyb3JzXCI7XG59XG4uZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tLWF2YWlsYWJsZSxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tYXZhaWxhYmxlOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDBDQzk2O1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbn1cbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tYXZhaWxhYmxlOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IFwiU2VydmVyIEF2YWlsYWJsZVwiO1xufVxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS11bmF2YWlsYWJsZSxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tdW5hdmFpbGFibGU6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGMTU2NEU7XG4gICAgY3Vyc29yOiBkZWZhdWx0O1xufVxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS11bmF2YWlsYWJsZTo6YmVmb3JlIHtcbiAgICBjb250ZW50OiBcIlNlcnZlciBVbmF2YWlsYWJsZS4gQ2hlY2sgaWYgdGhlIHByb2Nlc3MgaGFzIGhhbHRlZCBvciBjcmFzaGVkLlwiO1xufVxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1jb2xkLFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1jb2xkOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkREQTY4O1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbn1cbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tY29sZDo6YmVmb3JlIHtcbiAgICBjb250ZW50OiBcIkhvdCBSZWxvYWQgRGlzYWJsZWRcIjtcbn1cblxuLmRhc2gtZGVidWctYWxlcnQge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBmb250LXNpemU6IDEwcHg7XG59XG5cbi5kYXNoLWRlYnVnLWFsZXJ0LWxhYmVsIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICBib3R0b206IDgxcHg7XG4gICAgcmlnaHQ6IDI5cHg7XG4gICAgei1pbmRleDogMTAwMDI7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGJveC1zaGFkb3c6IDBweCAwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4yNSksXG4gICAgICAgIDBweCAxcHggM3B4IHJnYmEoMTYyLCAxNzcsIDE5OCwgMC4zMik7XG4gICAgYm9yZGVyLXJhZGl1czogMzJweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBwYWRkaW5nOiA0cHg7XG4gICAgY29sb3I6IHJnYig1MCwgNTAsIDUwKTtcbn1cblxuLmRhc2gtZGVidWctZXJyb3ItY291bnQge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIG1hcmdpbjogMCAzcHg7XG59XG5cbi5kYXNoLWRlYnVnLWRpc2Nvbm5lY3RlZCB7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIG1hcmdpbi1sZWZ0OiAzcHg7XG59XG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvRGVidWdNZW51LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGdCQUFnQjtJQUNoQixlQUFlO0lBQ2YsWUFBWTtJQUNaLFdBQVc7SUFDWCxhQUFhO0lBQ2IsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixjQUFjO0lBQ2QseUJBQXlCO0lBQ3pCLG1CQUFtQjtJQUNuQixXQUFXO0lBQ1gsWUFBWTtJQUNaLGVBQWU7QUFDbkI7QUFDQTtJQUNJLDBCQUEwQjtBQUM5Qjs7QUFFQTtJQUNJLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLHNCQUFzQjtJQUN0QixlQUFlO0lBQ2YsWUFBWTtJQUNaLFdBQVc7SUFDWCxhQUFhO0lBQ2IsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixjQUFjO0lBQ2QsWUFBWTtJQUNaLG1CQUFtQjtJQUNuQix5QkFBeUI7SUFDekIsc0JBQXNCO0lBQ3RCOzZDQUN5QztBQUM3QztBQUNBO0lBQ0ksWUFBWTtJQUNaLFdBQVc7SUFDWCxZQUFZO0lBQ1osV0FBVztJQUNYLFVBQVU7QUFDZDs7QUFFQTtJQUNJLGFBQWE7SUFDYixXQUFXO0lBQ1gsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIseUJBQXlCO0lBQ3pCLG1CQUFtQjtJQUNuQixXQUFXO0lBQ1gsWUFBWTtJQUNaLGVBQWU7SUFDZixhQUFhO0lBQ2Isc0JBQXNCO0lBQ3RCLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsaUNBQWlDO0lBQ2pDLFdBQVc7SUFDWCxlQUFlO0FBQ25CO0FBQ0E7SUFDSSx5QkFBeUI7QUFDN0I7QUFDQTtJQUNJLHlCQUF5QjtBQUM3QjtBQUNBO0lBQ0kseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0ksZUFBZTtBQUNuQjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixvQkFBb0I7SUFDcEIsa0JBQWtCO0lBQ2xCLHNCQUFzQjtJQUN0QixZQUFZO0lBQ1osU0FBUztJQUNULGtCQUFrQjtJQUNsQixZQUFZO0lBQ1osWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixvQ0FBb0M7SUFDcEMsV0FBVztJQUNYLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsZ0JBQWdCO0FBQ3BCO0FBQ0E7SUFDSSxtQkFBbUI7QUFDdkI7QUFDQTtJQUNJLGdDQUFnQztBQUNwQztBQUNBO0lBQ0ksd0JBQXdCO0FBQzVCO0FBQ0E7O0lBRUkseUJBQXlCO0lBQ3pCLGVBQWU7QUFDbkI7QUFDQTtJQUNJLDJCQUEyQjtBQUMvQjtBQUNBOztJQUVJLHlCQUF5QjtJQUN6QixlQUFlO0FBQ25CO0FBQ0E7SUFDSSwwRUFBMEU7QUFDOUU7QUFDQTs7SUFFSSx5QkFBeUI7SUFDekIsZUFBZTtBQUNuQjtBQUNBO0lBQ0ksOEJBQThCO0FBQ2xDOztBQUVBO0lBQ0ksYUFBYTtJQUNiLG1CQUFtQjtJQUNuQixlQUFlO0FBQ25COztBQUVBO0lBQ0ksYUFBYTtJQUNiLGVBQWU7SUFDZixZQUFZO0lBQ1osV0FBVztJQUNYLGNBQWM7SUFDZCxlQUFlO0lBQ2Y7NkNBQ3lDO0lBQ3pDLG1CQUFtQjtJQUNuQix1QkFBdUI7SUFDdkIsWUFBWTtJQUNaLHNCQUFzQjtBQUMxQjs7QUFFQTtJQUNJLGNBQWM7SUFDZCxhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksZUFBZTtJQUNmLGdCQUFnQjtBQUNwQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuZGFzaC1kZWJ1Zy1tZW51IHtcXG4gICAgdHJhbnNpdGlvbjogMC4zcztcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcbiAgICBib3R0b206IDM1cHg7XFxuICAgIHJpZ2h0OiAzNXB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgei1pbmRleDogMTAwMDE7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMxMTlkZmY7XFxuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XFxuICAgIHdpZHRoOiA2NHB4O1xcbiAgICBoZWlnaHQ6IDY0cHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLmRhc2gtZGVidWctbWVudS0tb3BlbiB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKC0xODBkZWcpO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51OmhvdmVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzEwOGRlNDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9faWNvbiB7XFxuICAgIHdpZHRoOiBhdXRvO1xcbiAgICBoZWlnaHQ6IDI0cHg7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyIHtcXG4gICAgdHJhbnNpdGlvbjogMC4zcztcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcbiAgICBib3R0b206IDI3cHg7XFxuICAgIHJpZ2h0OiAyN3B4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgei1pbmRleDogMTAwMDA7XFxuICAgIGhlaWdodDogODBweDtcXG4gICAgYm9yZGVyLXJhZGl1czogNDBweDtcXG4gICAgcGFkZGluZzogNXB4IDc4cHggNXB4IDVweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjI1KSxcXG4gICAgICAgIDBweCAxcHggM3B4IHJnYmEoMTYyLCAxNzcsIDE5OCwgMC4zMik7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyLS1jbG9zZWQge1xcbiAgICBoZWlnaHQ6IDYwcHg7XFxuICAgIHdpZHRoOiA2MHB4O1xcbiAgICBib3R0b206IDM3cHg7XFxuICAgIHJpZ2h0OiAzN3B4O1xcbiAgICBwYWRkaW5nOiAwO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19jb250ZW50IHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIGhlaWdodDogMTAwJTtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLWNvbnRhaW5lciB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICB3aWR0aDogNzRweDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uIHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQjlDMkNFO1xcbiAgICBib3JkZXItcmFkaXVzOiAxMDAlO1xcbiAgICB3aWR0aDogNjRweDtcXG4gICAgaGVpZ2h0OiA2NHB4O1xcbiAgICBmb250LXNpemU6IDEwcHg7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XFxuICAgIGNvbG9yOiAjZmZmO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbjpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNhMWE5YjU7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tZW5hYmxlZCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMENDOTY7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tZW5hYmxlZDpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwM2JiOGE7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi1sYWJlbCB7XFxuICAgIGN1cnNvcjogaW5oZXJpdDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uOjpiZWZvcmUge1xcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XFxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIGJvdHRvbTogMTEwJTtcXG4gICAgbGVmdDogNTAlO1xcbiAgICBtYXJnaW4tbGVmdDogLTYwcHg7XFxuICAgIHBhZGRpbmc6IDdweDtcXG4gICAgd2lkdGg6IDEyMHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNjgsNjgsNjgsMC43KTtcXG4gICAgY29sb3I6ICNmZmY7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgZm9udC1zaXplOiAxMHB4O1xcbiAgICBsaW5lLWhlaWdodDogMS4yO1xcbn1cXG4uZGFzaC1kZWJ1Zy1tZW51X19idXR0b246aG92ZXI6OmJlZm9yZSB7XFxuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tY2FsbGJhY2tzOjpiZWZvcmUge1xcbiAgICBjb250ZW50OiBcXFwiVG9nZ2xlIENhbGxiYWNrIEdyYXBoXFxcIjtcXG59XFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1lcnJvcnM6OmJlZm9yZSB7XFxuICAgIGNvbnRlbnQ6IFxcXCJUb2dnbGUgRXJyb3JzXFxcIjtcXG59XFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1hdmFpbGFibGUsXFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1hdmFpbGFibGU6aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDBDQzk2O1xcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tYXZhaWxhYmxlOjpiZWZvcmUge1xcbiAgICBjb250ZW50OiBcXFwiU2VydmVyIEF2YWlsYWJsZVxcXCI7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tdW5hdmFpbGFibGUsXFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS11bmF2YWlsYWJsZTpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNGMTU2NEU7XFxuICAgIGN1cnNvcjogZGVmYXVsdDtcXG59XFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS11bmF2YWlsYWJsZTo6YmVmb3JlIHtcXG4gICAgY29udGVudDogXFxcIlNlcnZlciBVbmF2YWlsYWJsZS4gQ2hlY2sgaWYgdGhlIHByb2Nlc3MgaGFzIGhhbHRlZCBvciBjcmFzaGVkLlxcXCI7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tY29sZCxcXG4uZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tLWNvbGQ6aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkREQTY4O1xcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tY29sZDo6YmVmb3JlIHtcXG4gICAgY29udGVudDogXFxcIkhvdCBSZWxvYWQgRGlzYWJsZWRcXFwiO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1hbGVydCB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGZvbnQtc2l6ZTogMTBweDtcXG59XFxuXFxuLmRhc2gtZGVidWctYWxlcnQtbGFiZWwge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxuICAgIGJvdHRvbTogODFweDtcXG4gICAgcmlnaHQ6IDI5cHg7XFxuICAgIHotaW5kZXg6IDEwMDAyO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGJveC1zaGFkb3c6IDBweCAwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4yNSksXFxuICAgICAgICAwcHggMXB4IDNweCByZ2JhKDE2MiwgMTc3LCAxOTgsIDAuMzIpO1xcbiAgICBib3JkZXItcmFkaXVzOiAzMnB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgcGFkZGluZzogNHB4O1xcbiAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1lcnJvci1jb3VudCB7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBtYXJnaW46IDAgM3B4O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1kaXNjb25uZWN0ZWQge1xcbiAgICBmb250LXNpemU6IDE0cHg7XFxuICAgIG1hcmdpbi1sZWZ0OiAzcHg7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcpIHtcbiAgdmFyIGxpc3QgPSBbXTtcblxuICAvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gXCJcIjtcbiAgICAgIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2YgaXRlbVs1XSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgKz0gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtKTtcbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSkuam9pbihcIlwiKTtcbiAgfTtcblxuICAvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxuICBsaXN0LmkgPSBmdW5jdGlvbiBpKG1vZHVsZXMsIG1lZGlhLCBkZWR1cGUsIHN1cHBvcnRzLCBsYXllcikge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgdW5kZWZpbmVkXV07XG4gICAgfVxuICAgIHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG4gICAgaWYgKGRlZHVwZSkge1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBpZCA9IHRoaXNba11bMF07XG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIF9rID0gMDsgX2sgPCBtb2R1bGVzLmxlbmd0aDsgX2srKykge1xuICAgICAgdmFyIGl0ZW0gPSBbXS5jb25jYXQobW9kdWxlc1tfa10pO1xuICAgICAgaWYgKGRlZHVwZSAmJiBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBsYXllciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW1bNV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtZWRpYSkge1xuICAgICAgICBpZiAoIWl0ZW1bMl0pIHtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3VwcG9ydHMpIHtcbiAgICAgICAgaWYgKCFpdGVtWzRdKSB7XG4gICAgICAgICAgaXRlbVs0XSA9IFwiXCIuY29uY2F0KHN1cHBvcnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNF0gPSBzdXBwb3J0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGxpc3Q7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXTtcbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICBpZiAodHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShjc3NNYXBwaW5nKSkpKTtcbiAgICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07IiwiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiZGFncmVcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW1wiZGFncmVcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiY3l0b3NjYXBlRGFncmVcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJkYWdyZVwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiY3l0b3NjYXBlRGFncmVcIl0gPSBmYWN0b3J5KHJvb3RbXCJkYWdyZVwiXSk7XG59KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX180X18pIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuLyoqKioqKi8gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuLyoqKioqKi8gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gbnM7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgaW1wbCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7IC8vIHJlZ2lzdGVycyB0aGUgZXh0ZW5zaW9uIG9uIGEgY3l0b3NjYXBlIGxpYiByZWZcblxuXG52YXIgcmVnaXN0ZXIgPSBmdW5jdGlvbiByZWdpc3RlcihjeXRvc2NhcGUpIHtcbiAgaWYgKCFjeXRvc2NhcGUpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gY2FuJ3QgcmVnaXN0ZXIgaWYgY3l0b3NjYXBlIHVuc3BlY2lmaWVkXG5cblxuICBjeXRvc2NhcGUoJ2xheW91dCcsICdkYWdyZScsIGltcGwpOyAvLyByZWdpc3RlciB3aXRoIGN5dG9zY2FwZS5qc1xufTtcblxuaWYgKHR5cGVvZiBjeXRvc2NhcGUgIT09ICd1bmRlZmluZWQnKSB7XG4gIC8vIGV4cG9zZSB0byBnbG9iYWwgY3l0b3NjYXBlIChpLmUuIHdpbmRvdy5jeXRvc2NhcGUpXG4gIHJlZ2lzdGVyKGN5dG9zY2FwZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVnaXN0ZXI7XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbnZhciBpc0Z1bmN0aW9uID0gZnVuY3Rpb24gaXNGdW5jdGlvbihvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cbnZhciBkZWZhdWx0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cbnZhciBhc3NpZ24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG52YXIgZGFncmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpOyAvLyBjb25zdHJ1Y3RvclxuLy8gb3B0aW9ucyA6IG9iamVjdCBjb250YWluaW5nIGxheW91dCBvcHRpb25zXG5cblxuZnVuY3Rpb24gRGFncmVMYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBhc3NpZ24oe30sIGRlZmF1bHRzLCBvcHRpb25zKTtcbn0gLy8gcnVucyB0aGUgbGF5b3V0XG5cblxuRGFncmVMYXlvdXQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBsYXlvdXQgPSB0aGlzO1xuICB2YXIgY3kgPSBvcHRpb25zLmN5OyAvLyBjeSBpcyBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlZCBmb3IgdXMgaW4gdGhlIGNvbnN0cnVjdG9yXG5cbiAgdmFyIGVsZXMgPSBvcHRpb25zLmVsZXM7XG5cbiAgdmFyIGdldFZhbCA9IGZ1bmN0aW9uIGdldFZhbChlbGUsIHZhbCkge1xuICAgIHJldHVybiBpc0Z1bmN0aW9uKHZhbCkgPyB2YWwuYXBwbHkoZWxlLCBbZWxlXSkgOiB2YWw7XG4gIH07XG5cbiAgdmFyIGJiID0gb3B0aW9ucy5ib3VuZGluZ0JveCB8fCB7XG4gICAgeDE6IDAsXG4gICAgeTE6IDAsXG4gICAgdzogY3kud2lkdGgoKSxcbiAgICBoOiBjeS5oZWlnaHQoKVxuICB9O1xuXG4gIGlmIChiYi54MiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYmIueDIgPSBiYi54MSArIGJiLnc7XG4gIH1cblxuICBpZiAoYmIudyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYmIudyA9IGJiLngyIC0gYmIueDE7XG4gIH1cblxuICBpZiAoYmIueTIgPT09IHVuZGVmaW5lZCkge1xuICAgIGJiLnkyID0gYmIueTEgKyBiYi5oO1xuICB9XG5cbiAgaWYgKGJiLmggPT09IHVuZGVmaW5lZCkge1xuICAgIGJiLmggPSBiYi55MiAtIGJiLnkxO1xuICB9XG5cbiAgdmFyIGcgPSBuZXcgZGFncmUuZ3JhcGhsaWIuR3JhcGgoe1xuICAgIG11bHRpZ3JhcGg6IHRydWUsXG4gICAgY29tcG91bmQ6IHRydWVcbiAgfSk7XG4gIHZhciBnT2JqID0ge307XG5cbiAgdmFyIHNldEdPYmogPSBmdW5jdGlvbiBzZXRHT2JqKG5hbWUsIHZhbCkge1xuICAgIGlmICh2YWwgIT0gbnVsbCkge1xuICAgICAgZ09ialtuYW1lXSA9IHZhbDtcbiAgICB9XG4gIH07XG5cbiAgc2V0R09iaignbm9kZXNlcCcsIG9wdGlvbnMubm9kZVNlcCk7XG4gIHNldEdPYmooJ2VkZ2VzZXAnLCBvcHRpb25zLmVkZ2VTZXApO1xuICBzZXRHT2JqKCdyYW5rc2VwJywgb3B0aW9ucy5yYW5rU2VwKTtcbiAgc2V0R09iaigncmFua2RpcicsIG9wdGlvbnMucmFua0Rpcik7XG4gIHNldEdPYmooJ2FsaWduJywgb3B0aW9ucy5hbGlnbik7XG4gIHNldEdPYmooJ3JhbmtlcicsIG9wdGlvbnMucmFua2VyKTtcbiAgc2V0R09iaignYWN5Y2xpY2VyJywgb3B0aW9ucy5hY3ljbGljZXIpO1xuICBnLnNldEdyYXBoKGdPYmopO1xuICBnLnNldERlZmF1bHRFZGdlTGFiZWwoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7fTtcbiAgfSk7XG4gIGcuc2V0RGVmYXVsdE5vZGVMYWJlbChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9KTsgLy8gYWRkIG5vZGVzIHRvIGRhZ3JlXG5cbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpO1xuXG4gIGlmIChpc0Z1bmN0aW9uKG9wdGlvbnMuc29ydCkpIHtcbiAgICBub2RlcyA9IG5vZGVzLnNvcnQob3B0aW9ucy5zb3J0KTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgIHZhciBuYmIgPSBub2RlLmxheW91dERpbWVuc2lvbnMob3B0aW9ucyk7XG4gICAgZy5zZXROb2RlKG5vZGUuaWQoKSwge1xuICAgICAgd2lkdGg6IG5iYi53LFxuICAgICAgaGVpZ2h0OiBuYmIuaCxcbiAgICAgIG5hbWU6IG5vZGUuaWQoKVxuICAgIH0pOyAvLyBjb25zb2xlLmxvZyggZy5ub2RlKG5vZGUuaWQoKSkgKTtcbiAgfSAvLyBzZXQgY29tcG91bmQgcGFyZW50c1xuXG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5vZGVzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBfbm9kZSA9IG5vZGVzW19pXTtcblxuICAgIGlmIChfbm9kZS5pc0NoaWxkKCkpIHtcbiAgICAgIGcuc2V0UGFyZW50KF9ub2RlLmlkKCksIF9ub2RlLnBhcmVudCgpLmlkKCkpO1xuICAgIH1cbiAgfSAvLyBhZGQgZWRnZXMgdG8gZGFncmVcblxuXG4gIHZhciBlZGdlcyA9IGVsZXMuZWRnZXMoKS5zdGRGaWx0ZXIoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICByZXR1cm4gIWVkZ2Uuc291cmNlKCkuaXNQYXJlbnQoKSAmJiAhZWRnZS50YXJnZXQoKS5pc1BhcmVudCgpOyAvLyBkYWdyZSBjYW4ndCBoYW5kbGUgZWRnZXMgb24gY29tcG91bmQgbm9kZXNcbiAgfSk7XG5cbiAgaWYgKGlzRnVuY3Rpb24ob3B0aW9ucy5zb3J0KSkge1xuICAgIGVkZ2VzID0gZWRnZXMuc29ydChvcHRpb25zLnNvcnQpO1xuICB9XG5cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgZWRnZXMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciBlZGdlID0gZWRnZXNbX2kyXTtcbiAgICBnLnNldEVkZ2UoZWRnZS5zb3VyY2UoKS5pZCgpLCBlZGdlLnRhcmdldCgpLmlkKCksIHtcbiAgICAgIG1pbmxlbjogZ2V0VmFsKGVkZ2UsIG9wdGlvbnMubWluTGVuKSxcbiAgICAgIHdlaWdodDogZ2V0VmFsKGVkZ2UsIG9wdGlvbnMuZWRnZVdlaWdodCksXG4gICAgICBuYW1lOiBlZGdlLmlkKClcbiAgICB9LCBlZGdlLmlkKCkpOyAvLyBjb25zb2xlLmxvZyggZy5lZGdlKGVkZ2Uuc291cmNlKCkuaWQoKSwgZWRnZS50YXJnZXQoKS5pZCgpLCBlZGdlLmlkKCkpICk7XG4gIH1cblxuICBkYWdyZS5sYXlvdXQoZyk7XG4gIHZhciBnTm9kZUlkcyA9IGcubm9kZXMoKTtcblxuICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBnTm9kZUlkcy5sZW5ndGg7IF9pMysrKSB7XG4gICAgdmFyIGlkID0gZ05vZGVJZHNbX2kzXTtcbiAgICB2YXIgbiA9IGcubm9kZShpZCk7XG4gICAgY3kuZ2V0RWxlbWVudEJ5SWQoaWQpLnNjcmF0Y2goKS5kYWdyZSA9IG47XG4gIH1cblxuICB2YXIgZGFncmVCQjtcblxuICBpZiAob3B0aW9ucy5ib3VuZGluZ0JveCkge1xuICAgIGRhZ3JlQkIgPSB7XG4gICAgICB4MTogSW5maW5pdHksXG4gICAgICB4MjogLUluZmluaXR5LFxuICAgICAgeTE6IEluZmluaXR5LFxuICAgICAgeTI6IC1JbmZpbml0eVxuICAgIH07XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgdmFyIGRNb2RlbCA9IG5vZGUuc2NyYXRjaCgpLmRhZ3JlO1xuICAgICAgZGFncmVCQi54MSA9IE1hdGgubWluKGRhZ3JlQkIueDEsIGRNb2RlbC54KTtcbiAgICAgIGRhZ3JlQkIueDIgPSBNYXRoLm1heChkYWdyZUJCLngyLCBkTW9kZWwueCk7XG4gICAgICBkYWdyZUJCLnkxID0gTWF0aC5taW4oZGFncmVCQi55MSwgZE1vZGVsLnkpO1xuICAgICAgZGFncmVCQi55MiA9IE1hdGgubWF4KGRhZ3JlQkIueTIsIGRNb2RlbC55KTtcbiAgICB9KTtcbiAgICBkYWdyZUJCLncgPSBkYWdyZUJCLngyIC0gZGFncmVCQi54MTtcbiAgICBkYWdyZUJCLmggPSBkYWdyZUJCLnkyIC0gZGFncmVCQi55MTtcbiAgfSBlbHNlIHtcbiAgICBkYWdyZUJCID0gYmI7XG4gIH1cblxuICB2YXIgY29uc3RyYWluUG9zID0gZnVuY3Rpb24gY29uc3RyYWluUG9zKHApIHtcbiAgICBpZiAob3B0aW9ucy5ib3VuZGluZ0JveCkge1xuICAgICAgdmFyIHhQY3QgPSBkYWdyZUJCLncgPT09IDAgPyAwIDogKHAueCAtIGRhZ3JlQkIueDEpIC8gZGFncmVCQi53O1xuICAgICAgdmFyIHlQY3QgPSBkYWdyZUJCLmggPT09IDAgPyAwIDogKHAueSAtIGRhZ3JlQkIueTEpIC8gZGFncmVCQi5oO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogYmIueDEgKyB4UGN0ICogYmIudyxcbiAgICAgICAgeTogYmIueTEgKyB5UGN0ICogYmIuaFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICB9O1xuXG4gIG5vZGVzLmxheW91dFBvc2l0aW9ucyhsYXlvdXQsIG9wdGlvbnMsIGZ1bmN0aW9uIChlbGUpIHtcbiAgICBlbGUgPSBfdHlwZW9mKGVsZSkgPT09IFwib2JqZWN0XCIgPyBlbGUgOiB0aGlzO1xuICAgIHZhciBkTW9kZWwgPSBlbGUuc2NyYXRjaCgpLmRhZ3JlO1xuICAgIHJldHVybiBjb25zdHJhaW5Qb3Moe1xuICAgICAgeDogZE1vZGVsLngsXG4gICAgICB5OiBkTW9kZWwueVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhZ3JlTGF5b3V0O1xuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxudmFyIGRlZmF1bHRzID0ge1xuICAvLyBkYWdyZSBhbGdvIG9wdGlvbnMsIHVzZXMgZGVmYXVsdCB2YWx1ZSBvbiB1bmRlZmluZWRcbiAgbm9kZVNlcDogdW5kZWZpbmVkLFxuICAvLyB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIGFkamFjZW50IG5vZGVzIGluIHRoZSBzYW1lIHJhbmtcbiAgZWRnZVNlcDogdW5kZWZpbmVkLFxuICAvLyB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIGFkamFjZW50IGVkZ2VzIGluIHRoZSBzYW1lIHJhbmtcbiAgcmFua1NlcDogdW5kZWZpbmVkLFxuICAvLyB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIGFkamFjZW50IG5vZGVzIGluIHRoZSBzYW1lIHJhbmtcbiAgcmFua0RpcjogdW5kZWZpbmVkLFxuICAvLyAnVEInIGZvciB0b3AgdG8gYm90dG9tIGZsb3csICdMUicgZm9yIGxlZnQgdG8gcmlnaHQsXG4gIGFsaWduOiB1bmRlZmluZWQsXG4gIC8vIGFsaWdubWVudCBmb3IgcmFuayBub2Rlcy4gQ2FuIGJlICdVTCcsICdVUicsICdETCcsIG9yICdEUicsIHdoZXJlIFUgPSB1cCwgRCA9IGRvd24sIEwgPSBsZWZ0LCBhbmQgUiA9IHJpZ2h0XG4gIGFjeWNsaWNlcjogdW5kZWZpbmVkLFxuICAvLyBJZiBzZXQgdG8gJ2dyZWVkeScsIHVzZXMgYSBncmVlZHkgaGV1cmlzdGljIGZvciBmaW5kaW5nIGEgZmVlZGJhY2sgYXJjIHNldCBmb3IgYSBncmFwaC5cbiAgLy8gQSBmZWVkYmFjayBhcmMgc2V0IGlzIGEgc2V0IG9mIGVkZ2VzIHRoYXQgY2FuIGJlIHJlbW92ZWQgdG8gbWFrZSBhIGdyYXBoIGFjeWNsaWMuXG4gIHJhbmtlcjogdW5kZWZpbmVkLFxuICAvLyBUeXBlIG9mIGFsZ29yaXRobSB0byBhc3NpZ25zIGEgcmFuayB0byBlYWNoIG5vZGUgaW4gdGhlIGlucHV0IGdyYXBoLlxuICAvLyBQb3NzaWJsZSB2YWx1ZXM6IG5ldHdvcmstc2ltcGxleCwgdGlnaHQtdHJlZSBvciBsb25nZXN0LXBhdGhcbiAgbWluTGVuOiBmdW5jdGlvbiBtaW5MZW4oZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICAvLyBudW1iZXIgb2YgcmFua3MgdG8ga2VlcCBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBvZiB0aGUgZWRnZVxuICBlZGdlV2VpZ2h0OiBmdW5jdGlvbiBlZGdlV2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgLy8gaGlnaGVyIHdlaWdodCBlZGdlcyBhcmUgZ2VuZXJhbGx5IG1hZGUgc2hvcnRlciBhbmQgc3RyYWlnaHRlciB0aGFuIGxvd2VyIHdlaWdodCBlZGdlc1xuICAvLyBnZW5lcmFsIGxheW91dCBvcHRpb25zXG4gIGZpdDogdHJ1ZSxcbiAgLy8gd2hldGhlciB0byBmaXQgdG8gdmlld3BvcnRcbiAgcGFkZGluZzogMzAsXG4gIC8vIGZpdCBwYWRkaW5nXG4gIHNwYWNpbmdGYWN0b3I6IHVuZGVmaW5lZCxcbiAgLy8gQXBwbGllcyBhIG11bHRpcGxpY2F0aXZlIGZhY3RvciAoPjApIHRvIGV4cGFuZCBvciBjb21wcmVzcyB0aGUgb3ZlcmFsbCBhcmVhIHRoYXQgdGhlIG5vZGVzIHRha2UgdXBcbiAgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzOiBmYWxzZSxcbiAgLy8gd2hldGhlciBsYWJlbHMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGRldGVybWluaW5nIHRoZSBzcGFjZSB1c2VkIGJ5IGEgbm9kZVxuICBhbmltYXRlOiBmYWxzZSxcbiAgLy8gd2hldGhlciB0byB0cmFuc2l0aW9uIHRoZSBub2RlIHBvc2l0aW9uc1xuICBhbmltYXRlRmlsdGVyOiBmdW5jdGlvbiBhbmltYXRlRmlsdGVyKG5vZGUsIGkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLy8gd2hldGhlciB0byBhbmltYXRlIHNwZWNpZmljIG5vZGVzIHdoZW4gYW5pbWF0aW9uIGlzIG9uOyBub24tYW5pbWF0ZWQgbm9kZXMgaW1tZWRpYXRlbHkgZ28gdG8gdGhlaXIgZmluYWwgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWRcbiAgYm91bmRpbmdCb3g6IHVuZGVmaW5lZCxcbiAgLy8gY29uc3RyYWluIGxheW91dCBib3VuZHM7IHsgeDEsIHkxLCB4MiwgeTIgfSBvciB7IHgxLCB5MSwgdywgaCB9XG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvcykge1xuICAgIHJldHVybiBwb3M7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBhcHBsaWVzIGEgdHJhbnNmb3JtIHRvIHRoZSBmaW5hbCBub2RlIHBvc2l0aW9uXG4gIHJlYWR5OiBmdW5jdGlvbiByZWFkeSgpIHt9LFxuICAvLyBvbiBsYXlvdXRyZWFkeVxuICBzb3J0OiB1bmRlZmluZWQsXG4gIC8vIGEgc29ydGluZyBmdW5jdGlvbiB0byBvcmRlciB0aGUgbm9kZXMgYW5kIGVkZ2VzOyBlLmcuIGZ1bmN0aW9uKGEsIGIpeyByZXR1cm4gYS5kYXRhKCd3ZWlnaHQnKSAtIGIuZGF0YSgnd2VpZ2h0JykgfVxuICAvLyBiZWNhdXNlIGN5dG9zY2FwZSBkYWdyZSBjcmVhdGVzIGEgZGlyZWN0ZWQgZ3JhcGgsIGFuZCBkaXJlY3RlZCBncmFwaHMgdXNlIHRoZSBub2RlIG9yZGVyIGFzIGEgdGllIGJyZWFrZXIgd2hlblxuICAvLyBkZWZpbmluZyB0aGUgdG9wb2xvZ3kgb2YgYSBncmFwaCwgdGhpcyBzb3J0IGZ1bmN0aW9uIGNhbiBoZWxwIGVuc3VyZSB0aGUgY29ycmVjdCBvcmRlciBvZiB0aGUgbm9kZXMvZWRnZXMuXG4gIC8vIHRoaXMgZmVhdHVyZSBpcyBtb3N0IHVzZWZ1bCB3aGVuIGFkZGluZyBhbmQgcmVtb3ZpbmcgdGhlIHNhbWUgbm9kZXMgYW5kIGVkZ2VzIG11bHRpcGxlIHRpbWVzIGluIGEgZ3JhcGguXG4gIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7fSAvLyBvbiBsYXlvdXRzdG9wXG5cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGRlZmF1bHRzO1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuLy8gU2ltcGxlLCBpbnRlcm5hbCBPYmplY3QuYXNzaWduKCkgcG9seWZpbGwgZm9yIG9wdGlvbnMgb2JqZWN0cyBldGMuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5hc3NpZ24gIT0gbnVsbCA/IE9iamVjdC5hc3NpZ24uYmluZChPYmplY3QpIDogZnVuY3Rpb24gKHRndCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgc3JjcyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgc3Jjc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBzcmNzLmZvckVhY2goZnVuY3Rpb24gKHNyYykge1xuICAgIE9iamVjdC5rZXlzKHNyYykuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgcmV0dXJuIHRndFtrXSA9IHNyY1trXTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiB0Z3Q7XG59O1xuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX180X187XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTtcbn0pOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMjMsIFRoZSBDeXRvc2NhcGUgQ29uc29ydGl1bS5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mXG4gKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSDigJxTb2Z0d2FyZeKAnSksIHRvIGRlYWwgaW5cbiAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG9cbiAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzXG4gKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG9cbiAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIOKAnEFTIElT4oCdLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBkZWJvdW5jZSA9IHJlcXVpcmUoJ2xvZGFzaC9kZWJvdW5jZScpO1xudmFyIEhlYXAgPSByZXF1aXJlKCdoZWFwJyk7XG52YXIgZ2V0ID0gcmVxdWlyZSgnbG9kYXNoL2dldCcpO1xudmFyIHNldCA9IHJlcXVpcmUoJ2xvZGFzaC9zZXQnKTtcbnZhciB0b1BhdGggPSByZXF1aXJlKCdsb2Rhc2gvdG9QYXRoJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wRGVmYXVsdExlZ2FjeSAoZSkgeyByZXR1cm4gZSAmJiB0eXBlb2YgZSA9PT0gJ29iamVjdCcgJiYgJ2RlZmF1bHQnIGluIGUgPyBlIDogeyAnZGVmYXVsdCc6IGUgfTsgfVxuXG52YXIgZGVib3VuY2VfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0TGVnYWN5KGRlYm91bmNlKTtcbnZhciBIZWFwX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdExlZ2FjeShIZWFwKTtcbnZhciBnZXRfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0TGVnYWN5KGdldCk7XG52YXIgc2V0X19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdExlZ2FjeShzZXQpO1xudmFyIHRvUGF0aF9fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9faW50ZXJvcERlZmF1bHRMZWdhY3kodG9QYXRoKTtcblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICB9IDogZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gIH0sIF90eXBlb2Yob2JqKTtcbn1cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBvYmo7XG59XG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTtcbn1cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbn1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHtcbiAgdmFyIF9pID0gYXJyID09IG51bGwgPyBudWxsIDogdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBhcnJbU3ltYm9sLml0ZXJhdG9yXSB8fCBhcnJbXCJAQGl0ZXJhdG9yXCJdO1xuICBpZiAoX2kgPT0gbnVsbCkgcmV0dXJuO1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcbiAgdmFyIF9zLCBfZTtcbiAgdHJ5IHtcbiAgICBmb3IgKF9pID0gX2kuY2FsbChhcnIpOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7XG4gICAgICBfYXJyLnB1c2goX3MudmFsdWUpO1xuICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2QgPSB0cnVlO1xuICAgIF9lID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBfYXJyO1xufVxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufVxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTtcbiAgcmV0dXJuIGFycjI7XG59XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuXG52YXIgX3dpbmRvdyA9IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IHdpbmRvdzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG52YXIgbmF2aWdhdG9yID0gX3dpbmRvdyA/IF93aW5kb3cubmF2aWdhdG9yIDogbnVsbDtcbl93aW5kb3cgPyBfd2luZG93LmRvY3VtZW50IDogbnVsbDtcbnZhciB0eXBlb2ZzdHIgPSBfdHlwZW9mKCcnKTtcbnZhciB0eXBlb2ZvYmogPSBfdHlwZW9mKHt9KTtcbnZhciB0eXBlb2ZmbiA9IF90eXBlb2YoZnVuY3Rpb24gKCkge30pO1xudmFyIHR5cGVvZmh0bWxlbGUgPSB0eXBlb2YgSFRNTEVsZW1lbnQgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihIVE1MRWxlbWVudCk7XG52YXIgaW5zdGFuY2VTdHIgPSBmdW5jdGlvbiBpbnN0YW5jZVN0cihvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouaW5zdGFuY2VTdHJpbmcgJiYgZm4kNihvYmouaW5zdGFuY2VTdHJpbmcpID8gb2JqLmluc3RhbmNlU3RyaW5nKCkgOiBudWxsO1xufTtcblxudmFyIHN0cmluZyA9IGZ1bmN0aW9uIHN0cmluZyhvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PSB0eXBlb2ZzdHI7XG59O1xudmFyIGZuJDYgPSBmdW5jdGlvbiBmbihvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PT0gdHlwZW9mZm47XG59O1xudmFyIGFycmF5ID0gZnVuY3Rpb24gYXJyYXkob2JqKSB7XG4gIHJldHVybiAhZWxlbWVudE9yQ29sbGVjdGlvbihvYmopICYmIChBcnJheS5pc0FycmF5ID8gQXJyYXkuaXNBcnJheShvYmopIDogb2JqICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgQXJyYXkpO1xufTtcbnZhciBwbGFpbk9iamVjdCA9IGZ1bmN0aW9uIHBsYWluT2JqZWN0KG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgX3R5cGVvZihvYmopID09PSB0eXBlb2ZvYmogJiYgIWFycmF5KG9iaikgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBPYmplY3Q7XG59O1xudmFyIG9iamVjdCA9IGZ1bmN0aW9uIG9iamVjdChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PT0gdHlwZW9mb2JqO1xufTtcbnZhciBudW1iZXIkMSA9IGZ1bmN0aW9uIG51bWJlcihvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PT0gX3R5cGVvZigxKSAmJiAhaXNOYU4ob2JqKTtcbn07XG52YXIgaW50ZWdlciA9IGZ1bmN0aW9uIGludGVnZXIob2JqKSB7XG4gIHJldHVybiBudW1iZXIkMShvYmopICYmIE1hdGguZmxvb3Iob2JqKSA9PT0gb2JqO1xufTtcbnZhciBodG1sRWxlbWVudCA9IGZ1bmN0aW9uIGh0bWxFbGVtZW50KG9iaikge1xuICBpZiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZmh0bWxlbGUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsICE9IG9iaiAmJiBvYmogaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbiAgfVxufTtcbnZhciBlbGVtZW50T3JDb2xsZWN0aW9uID0gZnVuY3Rpb24gZWxlbWVudE9yQ29sbGVjdGlvbihvYmopIHtcbiAgcmV0dXJuIGVsZW1lbnQob2JqKSB8fCBjb2xsZWN0aW9uKG9iaik7XG59O1xudmFyIGVsZW1lbnQgPSBmdW5jdGlvbiBlbGVtZW50KG9iaikge1xuICByZXR1cm4gaW5zdGFuY2VTdHIob2JqKSA9PT0gJ2NvbGxlY3Rpb24nICYmIG9iai5fcHJpdmF0ZS5zaW5nbGU7XG59O1xudmFyIGNvbGxlY3Rpb24gPSBmdW5jdGlvbiBjb2xsZWN0aW9uKG9iaikge1xuICByZXR1cm4gaW5zdGFuY2VTdHIob2JqKSA9PT0gJ2NvbGxlY3Rpb24nICYmICFvYmouX3ByaXZhdGUuc2luZ2xlO1xufTtcbnZhciBjb3JlID0gZnVuY3Rpb24gY29yZShvYmopIHtcbiAgcmV0dXJuIGluc3RhbmNlU3RyKG9iaikgPT09ICdjb3JlJztcbn07XG52YXIgc3R5bGVzaGVldCA9IGZ1bmN0aW9uIHN0eWxlc2hlZXQob2JqKSB7XG4gIHJldHVybiBpbnN0YW5jZVN0cihvYmopID09PSAnc3R5bGVzaGVldCc7XG59O1xudmFyIGV2ZW50ID0gZnVuY3Rpb24gZXZlbnQob2JqKSB7XG4gIHJldHVybiBpbnN0YW5jZVN0cihvYmopID09PSAnZXZlbnQnO1xufTtcbnZhciBlbXB0eVN0cmluZyA9IGZ1bmN0aW9uIGVtcHR5U3RyaW5nKG9iaikge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsKSB7XG4gICAgLy8gbnVsbCBpcyBlbXB0eVxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKG9iaiA9PT0gJycgfHwgb2JqLm1hdGNoKC9eXFxzKyQvKSkge1xuICAgIHJldHVybiB0cnVlOyAvLyBlbXB0eSBzdHJpbmcgaXMgZW1wdHlcbiAgfVxuXG4gIHJldHVybiBmYWxzZTsgLy8gb3RoZXJ3aXNlLCB3ZSBkb24ndCBrbm93IHdoYXQgd2UndmUgZ290XG59O1xudmFyIGRvbUVsZW1lbnQgPSBmdW5jdGlvbiBkb21FbGVtZW50KG9iaikge1xuICBpZiAodHlwZW9mIEhUTUxFbGVtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTsgLy8gd2UncmUgbm90IGluIGEgYnJvd3NlciBzbyBpdCBkb2Vzbid0IG1hdHRlclxuICB9IGVsc2Uge1xuICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbiAgfVxufTtcbnZhciBib3VuZGluZ0JveCA9IGZ1bmN0aW9uIGJvdW5kaW5nQm94KG9iaikge1xuICByZXR1cm4gcGxhaW5PYmplY3Qob2JqKSAmJiBudW1iZXIkMShvYmoueDEpICYmIG51bWJlciQxKG9iai54MikgJiYgbnVtYmVyJDEob2JqLnkxKSAmJiBudW1iZXIkMShvYmoueTIpO1xufTtcbnZhciBwcm9taXNlID0gZnVuY3Rpb24gcHJvbWlzZShvYmopIHtcbiAgcmV0dXJuIG9iamVjdChvYmopICYmIGZuJDYob2JqLnRoZW4pO1xufTtcbnZhciBtcyA9IGZ1bmN0aW9uIG1zKCkge1xuICByZXR1cm4gbmF2aWdhdG9yICYmIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL21zaWV8dHJpZGVudHxlZGdlL2kpO1xufTsgLy8gcHJvYmFibHkgYSBiZXR0ZXIgd2F5IHRvIGRldGVjdCB0aGlzLi4uXG5cbnZhciBtZW1vaXplID0gZnVuY3Rpb24gbWVtb2l6ZShmbiwga2V5Rm4pIHtcbiAgaWYgKCFrZXlGbikge1xuICAgIGtleUZuID0gZnVuY3Rpb24ga2V5Rm4oKSB7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICAgIH1cbiAgICAgIHZhciBhcmdzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcmdzLmpvaW4oJyQnKTtcbiAgICB9O1xuICB9XG4gIHZhciBtZW1vaXplZEZuID0gZnVuY3Rpb24gbWVtb2l6ZWRGbigpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIHJldDtcbiAgICB2YXIgayA9IGtleUZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIHZhciBjYWNoZSA9IG1lbW9pemVkRm4uY2FjaGU7XG4gICAgaWYgKCEocmV0ID0gY2FjaGVba10pKSB7XG4gICAgICByZXQgPSBjYWNoZVtrXSA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9O1xuICBtZW1vaXplZEZuLmNhY2hlID0ge307XG4gIHJldHVybiBtZW1vaXplZEZuO1xufTtcblxudmFyIGNhbWVsMmRhc2ggPSBtZW1vaXplKGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW0EtWl0pL2csIGZ1bmN0aW9uICh2KSB7XG4gICAgcmV0dXJuICctJyArIHYudG9Mb3dlckNhc2UoKTtcbiAgfSk7XG59KTtcbnZhciBkYXNoMmNhbWVsID0gbWVtb2l6ZShmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvKC1cXHcpL2csIGZ1bmN0aW9uICh2KSB7XG4gICAgcmV0dXJuIHZbMV0udG9VcHBlckNhc2UoKTtcbiAgfSk7XG59KTtcbnZhciBwcmVwZW5kQ2FtZWwgPSBtZW1vaXplKGZ1bmN0aW9uIChwcmVmaXgsIHN0cikge1xuICByZXR1cm4gcHJlZml4ICsgc3RyWzBdLnRvVXBwZXJDYXNlKCkgKyBzdHIuc3Vic3RyaW5nKDEpO1xufSwgZnVuY3Rpb24gKHByZWZpeCwgc3RyKSB7XG4gIHJldHVybiBwcmVmaXggKyAnJCcgKyBzdHI7XG59KTtcbnZhciBjYXBpdGFsaXplID0gZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHIpIHtcbiAgaWYgKGVtcHR5U3RyaW5nKHN0cikpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc3Vic3RyaW5nKDEpO1xufTtcblxudmFyIG51bWJlciA9ICcoPzpbLStdPyg/Oig/OlxcXFxkK3xcXFxcZCpcXFxcLlxcXFxkKykoPzpbRWVdWystXT9cXFxcZCspPykpJztcbnZhciByZ2JhID0gJ3JnYlthXT9cXFxcKCgnICsgbnVtYmVyICsgJ1slXT8pXFxcXHMqLFxcXFxzKignICsgbnVtYmVyICsgJ1slXT8pXFxcXHMqLFxcXFxzKignICsgbnVtYmVyICsgJ1slXT8pKD86XFxcXHMqLFxcXFxzKignICsgbnVtYmVyICsgJykpP1xcXFwpJztcbnZhciByZ2JhTm9CYWNrUmVmcyA9ICdyZ2JbYV0/XFxcXCgoPzonICsgbnVtYmVyICsgJ1slXT8pXFxcXHMqLFxcXFxzKig/OicgKyBudW1iZXIgKyAnWyVdPylcXFxccyosXFxcXHMqKD86JyArIG51bWJlciArICdbJV0/KSg/OlxcXFxzKixcXFxccyooPzonICsgbnVtYmVyICsgJykpP1xcXFwpJztcbnZhciBoc2xhID0gJ2hzbFthXT9cXFxcKCgnICsgbnVtYmVyICsgJylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIgKyAnWyVdKVxcXFxzKixcXFxccyooJyArIG51bWJlciArICdbJV0pKD86XFxcXHMqLFxcXFxzKignICsgbnVtYmVyICsgJykpP1xcXFwpJztcbnZhciBoc2xhTm9CYWNrUmVmcyA9ICdoc2xbYV0/XFxcXCgoPzonICsgbnVtYmVyICsgJylcXFxccyosXFxcXHMqKD86JyArIG51bWJlciArICdbJV0pXFxcXHMqLFxcXFxzKig/OicgKyBudW1iZXIgKyAnWyVdKSg/OlxcXFxzKixcXFxccyooPzonICsgbnVtYmVyICsgJykpP1xcXFwpJztcbnZhciBoZXgzID0gJ1xcXFwjWzAtOWEtZkEtRl17M30nO1xudmFyIGhleDYgPSAnXFxcXCNbMC05YS1mQS1GXXs2fSc7XG5cbnZhciBhc2NlbmRpbmcgPSBmdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikge1xuICBpZiAoYSA8IGIpIHtcbiAgICByZXR1cm4gLTE7XG4gIH0gZWxzZSBpZiAoYSA+IGIpIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufTtcbnZhciBkZXNjZW5kaW5nID0gZnVuY3Rpb24gZGVzY2VuZGluZyhhLCBiKSB7XG4gIHJldHVybiAtMSAqIGFzY2VuZGluZyhhLCBiKTtcbn07XG5cbnZhciBleHRlbmQgPSBPYmplY3QuYXNzaWduICE9IG51bGwgPyBPYmplY3QuYXNzaWduLmJpbmQoT2JqZWN0KSA6IGZ1bmN0aW9uICh0Z3QpIHtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBvYmogPSBhcmdzW2ldO1xuICAgIGlmIChvYmogPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGtleXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBrID0ga2V5c1tqXTtcbiAgICAgIHRndFtrXSA9IG9ialtrXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRndDtcbn07XG5cbi8vIGdldCBbciwgZywgYl0gZnJvbSAjYWJjIG9yICNhYWJiY2NcbnZhciBoZXgydHVwbGUgPSBmdW5jdGlvbiBoZXgydHVwbGUoaGV4KSB7XG4gIGlmICghKGhleC5sZW5ndGggPT09IDQgfHwgaGV4Lmxlbmd0aCA9PT0gNykgfHwgaGV4WzBdICE9PSAnIycpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHNob3J0SGV4ID0gaGV4Lmxlbmd0aCA9PT0gNDtcbiAgdmFyIHIsIGcsIGI7XG4gIHZhciBiYXNlID0gMTY7XG4gIGlmIChzaG9ydEhleCkge1xuICAgIHIgPSBwYXJzZUludChoZXhbMV0gKyBoZXhbMV0sIGJhc2UpO1xuICAgIGcgPSBwYXJzZUludChoZXhbMl0gKyBoZXhbMl0sIGJhc2UpO1xuICAgIGIgPSBwYXJzZUludChoZXhbM10gKyBoZXhbM10sIGJhc2UpO1xuICB9IGVsc2Uge1xuICAgIHIgPSBwYXJzZUludChoZXhbMV0gKyBoZXhbMl0sIGJhc2UpO1xuICAgIGcgPSBwYXJzZUludChoZXhbM10gKyBoZXhbNF0sIGJhc2UpO1xuICAgIGIgPSBwYXJzZUludChoZXhbNV0gKyBoZXhbNl0sIGJhc2UpO1xuICB9XG4gIHJldHVybiBbciwgZywgYl07XG59O1xuXG4vLyBnZXQgW3IsIGcsIGIsIGFdIGZyb20gaHNsKDAsIDAsIDApIG9yIGhzbGEoMCwgMCwgMCwgMClcbnZhciBoc2wydHVwbGUgPSBmdW5jdGlvbiBoc2wydHVwbGUoaHNsKSB7XG4gIHZhciByZXQ7XG4gIHZhciBoLCBzLCBsLCBhLCByLCBnLCBiO1xuICBmdW5jdGlvbiBodWUycmdiKHAsIHEsIHQpIHtcbiAgICBpZiAodCA8IDApIHQgKz0gMTtcbiAgICBpZiAodCA+IDEpIHQgLT0gMTtcbiAgICBpZiAodCA8IDEgLyA2KSByZXR1cm4gcCArIChxIC0gcCkgKiA2ICogdDtcbiAgICBpZiAodCA8IDEgLyAyKSByZXR1cm4gcTtcbiAgICBpZiAodCA8IDIgLyAzKSByZXR1cm4gcCArIChxIC0gcCkgKiAoMiAvIDMgLSB0KSAqIDY7XG4gICAgcmV0dXJuIHA7XG4gIH1cbiAgdmFyIG0gPSBuZXcgUmVnRXhwKCdeJyArIGhzbGEgKyAnJCcpLmV4ZWMoaHNsKTtcbiAgaWYgKG0pIHtcbiAgICAvLyBnZXQgaHVlXG4gICAgaCA9IHBhcnNlSW50KG1bMV0pO1xuICAgIGlmIChoIDwgMCkge1xuICAgICAgaCA9ICgzNjAgLSAtMSAqIGggJSAzNjApICUgMzYwO1xuICAgIH0gZWxzZSBpZiAoaCA+IDM2MCkge1xuICAgICAgaCA9IGggJSAzNjA7XG4gICAgfVxuICAgIGggLz0gMzYwOyAvLyBub3JtYWxpc2Ugb24gWzAsIDFdXG5cbiAgICBzID0gcGFyc2VGbG9hdChtWzJdKTtcbiAgICBpZiAocyA8IDAgfHwgcyA+IDEwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gc2F0dXJhdGlvbiBpcyBbMCwgMTAwXVxuICAgIHMgPSBzIC8gMTAwOyAvLyBub3JtYWxpc2Ugb24gWzAsIDFdXG5cbiAgICBsID0gcGFyc2VGbG9hdChtWzNdKTtcbiAgICBpZiAobCA8IDAgfHwgbCA+IDEwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gbGlnaHRuZXNzIGlzIFswLCAxMDBdXG4gICAgbCA9IGwgLyAxMDA7IC8vIG5vcm1hbGlzZSBvbiBbMCwgMV1cblxuICAgIGEgPSBtWzRdO1xuICAgIGlmIChhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGEgPSBwYXJzZUZsb2F0KGEpO1xuICAgICAgaWYgKGEgPCAwIHx8IGEgPiAxKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gYWxwaGEgaXMgWzAsIDFdXG4gICAgfVxuXG4gICAgLy8gbm93LCBjb252ZXJ0IHRvIHJnYlxuICAgIC8vIGNvZGUgZnJvbSBodHRwOi8vbWppamFja3Nvbi5jb20vMjAwOC8wMi9yZ2ItdG8taHNsLWFuZC1yZ2ItdG8taHN2LWNvbG9yLW1vZGVsLWNvbnZlcnNpb24tYWxnb3JpdGhtcy1pbi1qYXZhc2NyaXB0XG4gICAgaWYgKHMgPT09IDApIHtcbiAgICAgIHIgPSBnID0gYiA9IE1hdGgucm91bmQobCAqIDI1NSk7IC8vIGFjaHJvbWF0aWNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHEgPSBsIDwgMC41ID8gbCAqICgxICsgcykgOiBsICsgcyAtIGwgKiBzO1xuICAgICAgdmFyIHAgPSAyICogbCAtIHE7XG4gICAgICByID0gTWF0aC5yb3VuZCgyNTUgKiBodWUycmdiKHAsIHEsIGggKyAxIC8gMykpO1xuICAgICAgZyA9IE1hdGgucm91bmQoMjU1ICogaHVlMnJnYihwLCBxLCBoKSk7XG4gICAgICBiID0gTWF0aC5yb3VuZCgyNTUgKiBodWUycmdiKHAsIHEsIGggLSAxIC8gMykpO1xuICAgIH1cbiAgICByZXQgPSBbciwgZywgYiwgYV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn07XG5cbi8vIGdldCBbciwgZywgYiwgYV0gZnJvbSByZ2IoMCwgMCwgMCkgb3IgcmdiYSgwLCAwLCAwLCAwKVxudmFyIHJnYjJ0dXBsZSA9IGZ1bmN0aW9uIHJnYjJ0dXBsZShyZ2IpIHtcbiAgdmFyIHJldDtcbiAgdmFyIG0gPSBuZXcgUmVnRXhwKCdeJyArIHJnYmEgKyAnJCcpLmV4ZWMocmdiKTtcbiAgaWYgKG0pIHtcbiAgICByZXQgPSBbXTtcbiAgICB2YXIgaXNQY3QgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8PSAzOyBpKyspIHtcbiAgICAgIHZhciBjaGFubmVsID0gbVtpXTtcbiAgICAgIGlmIChjaGFubmVsW2NoYW5uZWwubGVuZ3RoIC0gMV0gPT09ICclJykge1xuICAgICAgICBpc1BjdFtpXSA9IHRydWU7XG4gICAgICB9XG4gICAgICBjaGFubmVsID0gcGFyc2VGbG9hdChjaGFubmVsKTtcbiAgICAgIGlmIChpc1BjdFtpXSkge1xuICAgICAgICBjaGFubmVsID0gY2hhbm5lbCAvIDEwMCAqIDI1NTsgLy8gbm9ybWFsaXNlIHRvIFswLCAyNTVdXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFubmVsIDwgMCB8fCBjaGFubmVsID4gMjU1KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gaW52YWxpZCBjaGFubmVsIHZhbHVlXG5cbiAgICAgIHJldC5wdXNoKE1hdGguZmxvb3IoY2hhbm5lbCkpO1xuICAgIH1cbiAgICB2YXIgYXRMZWFzdE9uZUlzUGN0ID0gaXNQY3RbMV0gfHwgaXNQY3RbMl0gfHwgaXNQY3RbM107XG4gICAgdmFyIGFsbEFyZVBjdCA9IGlzUGN0WzFdICYmIGlzUGN0WzJdICYmIGlzUGN0WzNdO1xuICAgIGlmIChhdExlYXN0T25lSXNQY3QgJiYgIWFsbEFyZVBjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gbXVzdCBhbGwgYmUgcGVyY2VudCB2YWx1ZXMgaWYgb25lIGlzXG5cbiAgICB2YXIgYWxwaGEgPSBtWzRdO1xuICAgIGlmIChhbHBoYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhbHBoYSA9IHBhcnNlRmxvYXQoYWxwaGEpO1xuICAgICAgaWYgKGFscGhhIDwgMCB8fCBhbHBoYSA+IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBpbnZhbGlkIGFscGhhIHZhbHVlXG5cbiAgICAgIHJldC5wdXNoKGFscGhhKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn07XG52YXIgY29sb3JuYW1lMnR1cGxlID0gZnVuY3Rpb24gY29sb3JuYW1lMnR1cGxlKGNvbG9yKSB7XG4gIHJldHVybiBjb2xvcnNbY29sb3IudG9Mb3dlckNhc2UoKV07XG59O1xudmFyIGNvbG9yMnR1cGxlID0gZnVuY3Rpb24gY29sb3IydHVwbGUoY29sb3IpIHtcbiAgcmV0dXJuIChhcnJheShjb2xvcikgPyBjb2xvciA6IG51bGwpIHx8IGNvbG9ybmFtZTJ0dXBsZShjb2xvcikgfHwgaGV4MnR1cGxlKGNvbG9yKSB8fCByZ2IydHVwbGUoY29sb3IpIHx8IGhzbDJ0dXBsZShjb2xvcik7XG59O1xudmFyIGNvbG9ycyA9IHtcbiAgLy8gc3BlY2lhbCBjb2xvdXIgbmFtZXNcbiAgdHJhbnNwYXJlbnQ6IFswLCAwLCAwLCAwXSxcbiAgLy8gTkIgYWxwaGEgPT09IDBcblxuICAvLyByZWd1bGFyIGNvbG91cnNcbiAgYWxpY2VibHVlOiBbMjQwLCAyNDgsIDI1NV0sXG4gIGFudGlxdWV3aGl0ZTogWzI1MCwgMjM1LCAyMTVdLFxuICBhcXVhOiBbMCwgMjU1LCAyNTVdLFxuICBhcXVhbWFyaW5lOiBbMTI3LCAyNTUsIDIxMl0sXG4gIGF6dXJlOiBbMjQwLCAyNTUsIDI1NV0sXG4gIGJlaWdlOiBbMjQ1LCAyNDUsIDIyMF0sXG4gIGJpc3F1ZTogWzI1NSwgMjI4LCAxOTZdLFxuICBibGFjazogWzAsIDAsIDBdLFxuICBibGFuY2hlZGFsbW9uZDogWzI1NSwgMjM1LCAyMDVdLFxuICBibHVlOiBbMCwgMCwgMjU1XSxcbiAgYmx1ZXZpb2xldDogWzEzOCwgNDMsIDIyNl0sXG4gIGJyb3duOiBbMTY1LCA0MiwgNDJdLFxuICBidXJseXdvb2Q6IFsyMjIsIDE4NCwgMTM1XSxcbiAgY2FkZXRibHVlOiBbOTUsIDE1OCwgMTYwXSxcbiAgY2hhcnRyZXVzZTogWzEyNywgMjU1LCAwXSxcbiAgY2hvY29sYXRlOiBbMjEwLCAxMDUsIDMwXSxcbiAgY29yYWw6IFsyNTUsIDEyNywgODBdLFxuICBjb3JuZmxvd2VyYmx1ZTogWzEwMCwgMTQ5LCAyMzddLFxuICBjb3Juc2lsazogWzI1NSwgMjQ4LCAyMjBdLFxuICBjcmltc29uOiBbMjIwLCAyMCwgNjBdLFxuICBjeWFuOiBbMCwgMjU1LCAyNTVdLFxuICBkYXJrYmx1ZTogWzAsIDAsIDEzOV0sXG4gIGRhcmtjeWFuOiBbMCwgMTM5LCAxMzldLFxuICBkYXJrZ29sZGVucm9kOiBbMTg0LCAxMzQsIDExXSxcbiAgZGFya2dyYXk6IFsxNjksIDE2OSwgMTY5XSxcbiAgZGFya2dyZWVuOiBbMCwgMTAwLCAwXSxcbiAgZGFya2dyZXk6IFsxNjksIDE2OSwgMTY5XSxcbiAgZGFya2toYWtpOiBbMTg5LCAxODMsIDEwN10sXG4gIGRhcmttYWdlbnRhOiBbMTM5LCAwLCAxMzldLFxuICBkYXJrb2xpdmVncmVlbjogWzg1LCAxMDcsIDQ3XSxcbiAgZGFya29yYW5nZTogWzI1NSwgMTQwLCAwXSxcbiAgZGFya29yY2hpZDogWzE1MywgNTAsIDIwNF0sXG4gIGRhcmtyZWQ6IFsxMzksIDAsIDBdLFxuICBkYXJrc2FsbW9uOiBbMjMzLCAxNTAsIDEyMl0sXG4gIGRhcmtzZWFncmVlbjogWzE0MywgMTg4LCAxNDNdLFxuICBkYXJrc2xhdGVibHVlOiBbNzIsIDYxLCAxMzldLFxuICBkYXJrc2xhdGVncmF5OiBbNDcsIDc5LCA3OV0sXG4gIGRhcmtzbGF0ZWdyZXk6IFs0NywgNzksIDc5XSxcbiAgZGFya3R1cnF1b2lzZTogWzAsIDIwNiwgMjA5XSxcbiAgZGFya3Zpb2xldDogWzE0OCwgMCwgMjExXSxcbiAgZGVlcHBpbms6IFsyNTUsIDIwLCAxNDddLFxuICBkZWVwc2t5Ymx1ZTogWzAsIDE5MSwgMjU1XSxcbiAgZGltZ3JheTogWzEwNSwgMTA1LCAxMDVdLFxuICBkaW1ncmV5OiBbMTA1LCAxMDUsIDEwNV0sXG4gIGRvZGdlcmJsdWU6IFszMCwgMTQ0LCAyNTVdLFxuICBmaXJlYnJpY2s6IFsxNzgsIDM0LCAzNF0sXG4gIGZsb3JhbHdoaXRlOiBbMjU1LCAyNTAsIDI0MF0sXG4gIGZvcmVzdGdyZWVuOiBbMzQsIDEzOSwgMzRdLFxuICBmdWNoc2lhOiBbMjU1LCAwLCAyNTVdLFxuICBnYWluc2Jvcm86IFsyMjAsIDIyMCwgMjIwXSxcbiAgZ2hvc3R3aGl0ZTogWzI0OCwgMjQ4LCAyNTVdLFxuICBnb2xkOiBbMjU1LCAyMTUsIDBdLFxuICBnb2xkZW5yb2Q6IFsyMTgsIDE2NSwgMzJdLFxuICBncmF5OiBbMTI4LCAxMjgsIDEyOF0sXG4gIGdyZXk6IFsxMjgsIDEyOCwgMTI4XSxcbiAgZ3JlZW46IFswLCAxMjgsIDBdLFxuICBncmVlbnllbGxvdzogWzE3MywgMjU1LCA0N10sXG4gIGhvbmV5ZGV3OiBbMjQwLCAyNTUsIDI0MF0sXG4gIGhvdHBpbms6IFsyNTUsIDEwNSwgMTgwXSxcbiAgaW5kaWFucmVkOiBbMjA1LCA5MiwgOTJdLFxuICBpbmRpZ286IFs3NSwgMCwgMTMwXSxcbiAgaXZvcnk6IFsyNTUsIDI1NSwgMjQwXSxcbiAga2hha2k6IFsyNDAsIDIzMCwgMTQwXSxcbiAgbGF2ZW5kZXI6IFsyMzAsIDIzMCwgMjUwXSxcbiAgbGF2ZW5kZXJibHVzaDogWzI1NSwgMjQwLCAyNDVdLFxuICBsYXduZ3JlZW46IFsxMjQsIDI1MiwgMF0sXG4gIGxlbW9uY2hpZmZvbjogWzI1NSwgMjUwLCAyMDVdLFxuICBsaWdodGJsdWU6IFsxNzMsIDIxNiwgMjMwXSxcbiAgbGlnaHRjb3JhbDogWzI0MCwgMTI4LCAxMjhdLFxuICBsaWdodGN5YW46IFsyMjQsIDI1NSwgMjU1XSxcbiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IFsyNTAsIDI1MCwgMjEwXSxcbiAgbGlnaHRncmF5OiBbMjExLCAyMTEsIDIxMV0sXG4gIGxpZ2h0Z3JlZW46IFsxNDQsIDIzOCwgMTQ0XSxcbiAgbGlnaHRncmV5OiBbMjExLCAyMTEsIDIxMV0sXG4gIGxpZ2h0cGluazogWzI1NSwgMTgyLCAxOTNdLFxuICBsaWdodHNhbG1vbjogWzI1NSwgMTYwLCAxMjJdLFxuICBsaWdodHNlYWdyZWVuOiBbMzIsIDE3OCwgMTcwXSxcbiAgbGlnaHRza3libHVlOiBbMTM1LCAyMDYsIDI1MF0sXG4gIGxpZ2h0c2xhdGVncmF5OiBbMTE5LCAxMzYsIDE1M10sXG4gIGxpZ2h0c2xhdGVncmV5OiBbMTE5LCAxMzYsIDE1M10sXG4gIGxpZ2h0c3RlZWxibHVlOiBbMTc2LCAxOTYsIDIyMl0sXG4gIGxpZ2h0eWVsbG93OiBbMjU1LCAyNTUsIDIyNF0sXG4gIGxpbWU6IFswLCAyNTUsIDBdLFxuICBsaW1lZ3JlZW46IFs1MCwgMjA1LCA1MF0sXG4gIGxpbmVuOiBbMjUwLCAyNDAsIDIzMF0sXG4gIG1hZ2VudGE6IFsyNTUsIDAsIDI1NV0sXG4gIG1hcm9vbjogWzEyOCwgMCwgMF0sXG4gIG1lZGl1bWFxdWFtYXJpbmU6IFsxMDIsIDIwNSwgMTcwXSxcbiAgbWVkaXVtYmx1ZTogWzAsIDAsIDIwNV0sXG4gIG1lZGl1bW9yY2hpZDogWzE4NiwgODUsIDIxMV0sXG4gIG1lZGl1bXB1cnBsZTogWzE0NywgMTEyLCAyMTldLFxuICBtZWRpdW1zZWFncmVlbjogWzYwLCAxNzksIDExM10sXG4gIG1lZGl1bXNsYXRlYmx1ZTogWzEyMywgMTA0LCAyMzhdLFxuICBtZWRpdW1zcHJpbmdncmVlbjogWzAsIDI1MCwgMTU0XSxcbiAgbWVkaXVtdHVycXVvaXNlOiBbNzIsIDIwOSwgMjA0XSxcbiAgbWVkaXVtdmlvbGV0cmVkOiBbMTk5LCAyMSwgMTMzXSxcbiAgbWlkbmlnaHRibHVlOiBbMjUsIDI1LCAxMTJdLFxuICBtaW50Y3JlYW06IFsyNDUsIDI1NSwgMjUwXSxcbiAgbWlzdHlyb3NlOiBbMjU1LCAyMjgsIDIyNV0sXG4gIG1vY2Nhc2luOiBbMjU1LCAyMjgsIDE4MV0sXG4gIG5hdmFqb3doaXRlOiBbMjU1LCAyMjIsIDE3M10sXG4gIG5hdnk6IFswLCAwLCAxMjhdLFxuICBvbGRsYWNlOiBbMjUzLCAyNDUsIDIzMF0sXG4gIG9saXZlOiBbMTI4LCAxMjgsIDBdLFxuICBvbGl2ZWRyYWI6IFsxMDcsIDE0MiwgMzVdLFxuICBvcmFuZ2U6IFsyNTUsIDE2NSwgMF0sXG4gIG9yYW5nZXJlZDogWzI1NSwgNjksIDBdLFxuICBvcmNoaWQ6IFsyMTgsIDExMiwgMjE0XSxcbiAgcGFsZWdvbGRlbnJvZDogWzIzOCwgMjMyLCAxNzBdLFxuICBwYWxlZ3JlZW46IFsxNTIsIDI1MSwgMTUyXSxcbiAgcGFsZXR1cnF1b2lzZTogWzE3NSwgMjM4LCAyMzhdLFxuICBwYWxldmlvbGV0cmVkOiBbMjE5LCAxMTIsIDE0N10sXG4gIHBhcGF5YXdoaXA6IFsyNTUsIDIzOSwgMjEzXSxcbiAgcGVhY2hwdWZmOiBbMjU1LCAyMTgsIDE4NV0sXG4gIHBlcnU6IFsyMDUsIDEzMywgNjNdLFxuICBwaW5rOiBbMjU1LCAxOTIsIDIwM10sXG4gIHBsdW06IFsyMjEsIDE2MCwgMjIxXSxcbiAgcG93ZGVyYmx1ZTogWzE3NiwgMjI0LCAyMzBdLFxuICBwdXJwbGU6IFsxMjgsIDAsIDEyOF0sXG4gIHJlZDogWzI1NSwgMCwgMF0sXG4gIHJvc3licm93bjogWzE4OCwgMTQzLCAxNDNdLFxuICByb3lhbGJsdWU6IFs2NSwgMTA1LCAyMjVdLFxuICBzYWRkbGVicm93bjogWzEzOSwgNjksIDE5XSxcbiAgc2FsbW9uOiBbMjUwLCAxMjgsIDExNF0sXG4gIHNhbmR5YnJvd246IFsyNDQsIDE2NCwgOTZdLFxuICBzZWFncmVlbjogWzQ2LCAxMzksIDg3XSxcbiAgc2Vhc2hlbGw6IFsyNTUsIDI0NSwgMjM4XSxcbiAgc2llbm5hOiBbMTYwLCA4MiwgNDVdLFxuICBzaWx2ZXI6IFsxOTIsIDE5MiwgMTkyXSxcbiAgc2t5Ymx1ZTogWzEzNSwgMjA2LCAyMzVdLFxuICBzbGF0ZWJsdWU6IFsxMDYsIDkwLCAyMDVdLFxuICBzbGF0ZWdyYXk6IFsxMTIsIDEyOCwgMTQ0XSxcbiAgc2xhdGVncmV5OiBbMTEyLCAxMjgsIDE0NF0sXG4gIHNub3c6IFsyNTUsIDI1MCwgMjUwXSxcbiAgc3ByaW5nZ3JlZW46IFswLCAyNTUsIDEyN10sXG4gIHN0ZWVsYmx1ZTogWzcwLCAxMzAsIDE4MF0sXG4gIHRhbjogWzIxMCwgMTgwLCAxNDBdLFxuICB0ZWFsOiBbMCwgMTI4LCAxMjhdLFxuICB0aGlzdGxlOiBbMjE2LCAxOTEsIDIxNl0sXG4gIHRvbWF0bzogWzI1NSwgOTksIDcxXSxcbiAgdHVycXVvaXNlOiBbNjQsIDIyNCwgMjA4XSxcbiAgdmlvbGV0OiBbMjM4LCAxMzAsIDIzOF0sXG4gIHdoZWF0OiBbMjQ1LCAyMjIsIDE3OV0sXG4gIHdoaXRlOiBbMjU1LCAyNTUsIDI1NV0sXG4gIHdoaXRlc21va2U6IFsyNDUsIDI0NSwgMjQ1XSxcbiAgeWVsbG93OiBbMjU1LCAyNTUsIDBdLFxuICB5ZWxsb3dncmVlbjogWzE1NCwgMjA1LCA1MF1cbn07XG5cbi8vIHNldHMgdGhlIHZhbHVlIGluIGEgbWFwIChtYXAgbWF5IG5vdCBiZSBidWlsdClcbnZhciBzZXRNYXAgPSBmdW5jdGlvbiBzZXRNYXAob3B0aW9ucykge1xuICB2YXIgb2JqID0gb3B0aW9ucy5tYXA7XG4gIHZhciBrZXlzID0gb3B0aW9ucy5rZXlzO1xuICB2YXIgbCA9IGtleXMubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmIChwbGFpbk9iamVjdChrZXkpKSB7XG4gICAgICB0aHJvdyBFcnJvcignVHJpZWQgdG8gc2V0IG1hcCB3aXRoIG9iamVjdCBrZXknKTtcbiAgICB9XG4gICAgaWYgKGkgPCBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgIC8vIGV4dGVuZCB0aGUgbWFwIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKG9ialtrZXldID09IG51bGwpIHtcbiAgICAgICAgb2JqW2tleV0gPSB7fTtcbiAgICAgIH1cbiAgICAgIG9iaiA9IG9ialtrZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzZXQgdGhlIHZhbHVlXG4gICAgICBvYmpba2V5XSA9IG9wdGlvbnMudmFsdWU7XG4gICAgfVxuICB9XG59O1xuXG4vLyBnZXRzIHRoZSB2YWx1ZSBpbiBhIG1hcCBldmVuIGlmIGl0J3Mgbm90IGJ1aWx0IGluIHBsYWNlc1xudmFyIGdldE1hcCA9IGZ1bmN0aW9uIGdldE1hcChvcHRpb25zKSB7XG4gIHZhciBvYmogPSBvcHRpb25zLm1hcDtcbiAgdmFyIGtleXMgPSBvcHRpb25zLmtleXM7XG4gIHZhciBsID0ga2V5cy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgaWYgKHBsYWluT2JqZWN0KGtleSkpIHtcbiAgICAgIHRocm93IEVycm9yKCdUcmllZCB0byBnZXQgbWFwIHdpdGggb2JqZWN0IGtleScpO1xuICAgIH1cbiAgICBvYmogPSBvYmpba2V5XTtcbiAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59O1xuXG52YXIgcGVyZm9ybWFuY2UgPSBfd2luZG93ID8gX3dpbmRvdy5wZXJmb3JtYW5jZSA6IG51bGw7XG52YXIgcG5vdyA9IHBlcmZvcm1hbmNlICYmIHBlcmZvcm1hbmNlLm5vdyA/IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xufSA6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIERhdGUubm93KCk7XG59O1xudmFyIHJhZiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKF93aW5kb3cpIHtcbiAgICBpZiAoX3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgX3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKF93aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIF93aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChfd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChmbikge1xuICAgICAgICBfd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoX3dpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChmbikge1xuICAgICAgICBfd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICBpZiAoZm4pIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBmbihwbm93KCkpO1xuICAgICAgfSwgMTAwMCAvIDYwKTtcbiAgICB9XG4gIH07XG59KCk7XG52YXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKSB7XG4gIHJldHVybiByYWYoZm4pO1xufTtcbnZhciBwZXJmb3JtYW5jZU5vdyA9IHBub3c7XG5cbnZhciBERUZBVUxUX0hBU0hfU0VFRCA9IDkyNjE7XG52YXIgSyA9IDY1NTk5OyAvLyAzNyBhbHNvIHdvcmtzIHByZXR0eSB3ZWxsXG52YXIgREVGQVVMVF9IQVNIX1NFRURfQUxUID0gNTM4MTtcbnZhciBoYXNoSXRlcmFibGVJbnRzID0gZnVuY3Rpb24gaGFzaEl0ZXJhYmxlSW50cyhpdGVyYXRvcikge1xuICB2YXIgc2VlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogREVGQVVMVF9IQVNIX1NFRUQ7XG4gIC8vIHNkYm0vc3RyaW5nLWhhc2hcbiAgdmFyIGhhc2ggPSBzZWVkO1xuICB2YXIgZW50cnk7XG4gIGZvciAoOzspIHtcbiAgICBlbnRyeSA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICBpZiAoZW50cnkuZG9uZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGhhc2ggPSBoYXNoICogSyArIGVudHJ5LnZhbHVlIHwgMDtcbiAgfVxuICByZXR1cm4gaGFzaDtcbn07XG52YXIgaGFzaEludCA9IGZ1bmN0aW9uIGhhc2hJbnQobnVtKSB7XG4gIHZhciBzZWVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBERUZBVUxUX0hBU0hfU0VFRDtcbiAgLy8gc2RibS9zdHJpbmctaGFzaFxuICByZXR1cm4gc2VlZCAqIEsgKyBudW0gfCAwO1xufTtcbnZhciBoYXNoSW50QWx0ID0gZnVuY3Rpb24gaGFzaEludEFsdChudW0pIHtcbiAgdmFyIHNlZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IERFRkFVTFRfSEFTSF9TRUVEX0FMVDtcbiAgLy8gZGpiMi9zdHJpbmctaGFzaFxuICByZXR1cm4gKHNlZWQgPDwgNSkgKyBzZWVkICsgbnVtIHwgMDtcbn07XG52YXIgY29tYmluZUhhc2hlcyA9IGZ1bmN0aW9uIGNvbWJpbmVIYXNoZXMoaGFzaDEsIGhhc2gyKSB7XG4gIHJldHVybiBoYXNoMSAqIDB4MjAwMDAwICsgaGFzaDI7XG59O1xudmFyIGNvbWJpbmVIYXNoZXNBcnJheSA9IGZ1bmN0aW9uIGNvbWJpbmVIYXNoZXNBcnJheShoYXNoZXMpIHtcbiAgcmV0dXJuIGhhc2hlc1swXSAqIDB4MjAwMDAwICsgaGFzaGVzWzFdO1xufTtcbnZhciBoYXNoQXJyYXlzID0gZnVuY3Rpb24gaGFzaEFycmF5cyhoYXNoZXMxLCBoYXNoZXMyKSB7XG4gIHJldHVybiBbaGFzaEludChoYXNoZXMxWzBdLCBoYXNoZXMyWzBdKSwgaGFzaEludEFsdChoYXNoZXMxWzFdLCBoYXNoZXMyWzFdKV07XG59O1xudmFyIGhhc2hJbnRzQXJyYXkgPSBmdW5jdGlvbiBoYXNoSW50c0FycmF5KGludHMsIHNlZWQpIHtcbiAgdmFyIGVudHJ5ID0ge1xuICAgIHZhbHVlOiAwLFxuICAgIGRvbmU6IGZhbHNlXG4gIH07XG4gIHZhciBpID0gMDtcbiAgdmFyIGxlbmd0aCA9IGludHMubGVuZ3RoO1xuICB2YXIgaXRlcmF0b3IgPSB7XG4gICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICAgIGVudHJ5LnZhbHVlID0gaW50c1tpKytdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cnkuZG9uZSA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gaGFzaEl0ZXJhYmxlSW50cyhpdGVyYXRvciwgc2VlZCk7XG59O1xudmFyIGhhc2hTdHJpbmcgPSBmdW5jdGlvbiBoYXNoU3RyaW5nKHN0ciwgc2VlZCkge1xuICB2YXIgZW50cnkgPSB7XG4gICAgdmFsdWU6IDAsXG4gICAgZG9uZTogZmFsc2VcbiAgfTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbGVuZ3RoID0gc3RyLmxlbmd0aDtcbiAgdmFyIGl0ZXJhdG9yID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgICBlbnRyeS52YWx1ZSA9IHN0ci5jaGFyQ29kZUF0KGkrKyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnRyeS5kb25lID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBoYXNoSXRlcmFibGVJbnRzKGl0ZXJhdG9yLCBzZWVkKTtcbn07XG52YXIgaGFzaFN0cmluZ3MgPSBmdW5jdGlvbiBoYXNoU3RyaW5ncygpIHtcbiAgcmV0dXJuIGhhc2hTdHJpbmdzQXJyYXkoYXJndW1lbnRzKTtcbn07XG52YXIgaGFzaFN0cmluZ3NBcnJheSA9IGZ1bmN0aW9uIGhhc2hTdHJpbmdzQXJyYXkoc3Rycykge1xuICB2YXIgaGFzaDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHN0ciA9IHN0cnNbaV07XG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIGhhc2ggPSBoYXNoU3RyaW5nKHN0cik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhc2ggPSBoYXNoU3RyaW5nKHN0ciwgaGFzaCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBoYXNoO1xufTtcblxuLypnbG9iYWwgY29uc29sZSAqL1xudmFyIHdhcm5pbmdzRW5hYmxlZCA9IHRydWU7XG52YXIgd2FyblN1cHBvcnRlZCA9IGNvbnNvbGUud2FybiAhPSBudWxsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbnZhciB0cmFjZVN1cHBvcnRlZCA9IGNvbnNvbGUudHJhY2UgIT0gbnVsbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG5cbnZhciBNQVhfSU5UJDEgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fCA5MDA3MTk5MjU0NzQwOTkxO1xudmFyIHRydWVpZnkgPSBmdW5jdGlvbiB0cnVlaWZ5KCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgZmFsc2lmeSA9IGZ1bmN0aW9uIGZhbHNpZnkoKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG52YXIgemVyb2lmeSA9IGZ1bmN0aW9uIHplcm9pZnkoKSB7XG4gIHJldHVybiAwO1xufTtcbnZhciBub29wJDEgPSBmdW5jdGlvbiBub29wKCkge307XG52YXIgZXJyb3IgPSBmdW5jdGlvbiBlcnJvcihtc2cpIHtcbiAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG59O1xudmFyIHdhcm5pbmdzID0gZnVuY3Rpb24gd2FybmluZ3MoZW5hYmxlZCkge1xuICBpZiAoZW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgd2FybmluZ3NFbmFibGVkID0gISFlbmFibGVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB3YXJuaW5nc0VuYWJsZWQ7XG4gIH1cbn07XG52YXIgd2FybiA9IGZ1bmN0aW9uIHdhcm4obXNnKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgaWYgKCF3YXJuaW5ncygpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh3YXJuU3VwcG9ydGVkKSB7XG4gICAgY29uc29sZS53YXJuKG1zZyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2cobXNnKTtcbiAgICBpZiAodHJhY2VTdXBwb3J0ZWQpIHtcbiAgICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICB9XG4gIH1cbn07IC8qIGVzbGludC1lbmFibGUgKi9cblxudmFyIGNsb25lID0gZnVuY3Rpb24gY2xvbmUob2JqKSB7XG4gIHJldHVybiBleHRlbmQoe30sIG9iaik7XG59O1xuXG4vLyBnZXRzIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBhcmd1bWVudFxudmFyIGNvcHkgPSBmdW5jdGlvbiBjb3B5KG9iaikge1xuICBpZiAob2JqID09IG51bGwpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIGlmIChhcnJheShvYmopKSB7XG4gICAgcmV0dXJuIG9iai5zbGljZSgpO1xuICB9IGVsc2UgaWYgKHBsYWluT2JqZWN0KG9iaikpIHtcbiAgICByZXR1cm4gY2xvbmUob2JqKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG59O1xudmFyIGNvcHlBcnJheSA9IGZ1bmN0aW9uIGNvcHlBcnJheShhcnIpIHtcbiAgcmV0dXJuIGFyci5zbGljZSgpO1xufTtcbnZhciB1dWlkID0gZnVuY3Rpb24gdXVpZChhLCBiIC8qIHBsYWNlaG9sZGVycyAqLykge1xuICBmb3IgKFxuICAvLyBsb29wIDopXG4gIGIgPSBhID0gJyc7XG4gIC8vIGIgLSByZXN1bHQgLCBhIC0gbnVtZXJpYyBsZXRpYWJsZVxuICBhKysgPCAzNjtcbiAgLy9cbiAgYiArPSBhICogNTEgJiA1MiAvLyBpZiBcImFcIiBpcyBub3QgOSBvciAxNCBvciAxOSBvciAyNFxuICA/XG4gIC8vICByZXR1cm4gYSByYW5kb20gbnVtYmVyIG9yIDRcbiAgKGEgXiAxNSAvLyBpZiBcImFcIiBpcyBub3QgMTVcbiAgP1xuICAvLyBnZW5lcmF0ZSBhIHJhbmRvbSBudW1iZXIgZnJvbSAwIHRvIDE1XG4gIDggXiBNYXRoLnJhbmRvbSgpICogKGEgXiAyMCA/IDE2IDogNCkgLy8gdW5sZXNzIFwiYVwiIGlzIDIwLCBpbiB3aGljaCBjYXNlIGEgcmFuZG9tIG51bWJlciBmcm9tIDggdG8gMTFcbiAgOiA0IC8vICBvdGhlcndpc2UgNFxuICApLnRvU3RyaW5nKDE2KSA6ICctJyAvLyAgaW4gb3RoZXIgY2FzZXMgKGlmIFwiYVwiIGlzIDksMTQsMTksMjQpIGluc2VydCBcIi1cIlxuICApIHtcbiAgfVxuICByZXR1cm4gYjtcbn07XG52YXIgX3N0YXRpY0VtcHR5T2JqZWN0ID0ge307XG52YXIgc3RhdGljRW1wdHlPYmplY3QgPSBmdW5jdGlvbiBzdGF0aWNFbXB0eU9iamVjdCgpIHtcbiAgcmV0dXJuIF9zdGF0aWNFbXB0eU9iamVjdDtcbn07XG52YXIgZGVmYXVsdHMkZyA9IGZ1bmN0aW9uIGRlZmF1bHRzKF9kZWZhdWx0cykge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKF9kZWZhdWx0cyk7XG4gIHJldHVybiBmdW5jdGlvbiAob3B0cykge1xuICAgIHZhciBmaWxsZWRPcHRzID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgIHZhciBvcHRWYWwgPSBvcHRzID09IG51bGwgPyB1bmRlZmluZWQgOiBvcHRzW2tleV07XG4gICAgICBmaWxsZWRPcHRzW2tleV0gPSBvcHRWYWwgPT09IHVuZGVmaW5lZCA/IF9kZWZhdWx0c1trZXldIDogb3B0VmFsO1xuICAgIH1cbiAgICByZXR1cm4gZmlsbGVkT3B0cztcbiAgfTtcbn07XG52YXIgcmVtb3ZlRnJvbUFycmF5ID0gZnVuY3Rpb24gcmVtb3ZlRnJvbUFycmF5KGFyciwgZWxlLCBvbmVDb3B5KSB7XG4gIGZvciAodmFyIGkgPSBhcnIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoYXJyW2ldID09PSBlbGUpIHtcbiAgICAgIGFyci5zcGxpY2UoaSwgMSk7XG4gICAgICBpZiAob25lQ29weSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG52YXIgY2xlYXJBcnJheSA9IGZ1bmN0aW9uIGNsZWFyQXJyYXkoYXJyKSB7XG4gIGFyci5zcGxpY2UoMCwgYXJyLmxlbmd0aCk7XG59O1xudmFyIHB1c2ggPSBmdW5jdGlvbiBwdXNoKGFyciwgb3RoZXJBcnIpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBvdGhlckFyci5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbCA9IG90aGVyQXJyW2ldO1xuICAgIGFyci5wdXNoKGVsKTtcbiAgfVxufTtcbnZhciBnZXRQcmVmaXhlZFByb3BlcnR5ID0gZnVuY3Rpb24gZ2V0UHJlZml4ZWRQcm9wZXJ0eShvYmosIHByb3BOYW1lLCBwcmVmaXgpIHtcbiAgaWYgKHByZWZpeCkge1xuICAgIHByb3BOYW1lID0gcHJlcGVuZENhbWVsKHByZWZpeCwgcHJvcE5hbWUpOyAvLyBlLmcuIChsYWJlbFdpZHRoLCBzb3VyY2UpID0+IHNvdXJjZUxhYmVsV2lkdGhcbiAgfVxuXG4gIHJldHVybiBvYmpbcHJvcE5hbWVdO1xufTtcbnZhciBzZXRQcmVmaXhlZFByb3BlcnR5ID0gZnVuY3Rpb24gc2V0UHJlZml4ZWRQcm9wZXJ0eShvYmosIHByb3BOYW1lLCBwcmVmaXgsIHZhbHVlKSB7XG4gIGlmIChwcmVmaXgpIHtcbiAgICBwcm9wTmFtZSA9IHByZXBlbmRDYW1lbChwcmVmaXgsIHByb3BOYW1lKTsgLy8gZS5nLiAobGFiZWxXaWR0aCwgc291cmNlKSA9PiBzb3VyY2VMYWJlbFdpZHRoXG4gIH1cblxuICBvYmpbcHJvcE5hbWVdID0gdmFsdWU7XG59O1xuXG4vKiBnbG9iYWwgTWFwICovXG52YXIgT2JqZWN0TWFwID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gT2JqZWN0TWFwKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBPYmplY3RNYXApO1xuICAgIHRoaXMuX29iaiA9IHt9O1xuICB9XG4gIF9jcmVhdGVDbGFzcyhPYmplY3RNYXAsIFt7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQoa2V5LCB2YWwpIHtcbiAgICAgIHRoaXMuX29ialtrZXldID0gdmFsO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVsZXRlKGtleSkge1xuICAgICAgdGhpcy5fb2JqW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2xlYXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB0aGlzLl9vYmogPSB7fTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9vYmpba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX29ialtrZXldO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gT2JqZWN0TWFwO1xufSgpO1xudmFyIE1hcCQxID0gdHlwZW9mIE1hcCAhPT0gJ3VuZGVmaW5lZCcgPyBNYXAgOiBPYmplY3RNYXA7XG5cbi8qIGdsb2JhbCBTZXQgKi9cblxudmFyIHVuZGVmID0gXCJ1bmRlZmluZWRcIiA7XG52YXIgT2JqZWN0U2V0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gT2JqZWN0U2V0KGFycmF5T3JPYmplY3RTZXQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgT2JqZWN0U2V0KTtcbiAgICB0aGlzLl9vYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgaWYgKGFycmF5T3JPYmplY3RTZXQgIT0gbnVsbCkge1xuICAgICAgdmFyIGFycjtcbiAgICAgIGlmIChhcnJheU9yT2JqZWN0U2V0Lmluc3RhbmNlU3RyaW5nICE9IG51bGwgJiYgYXJyYXlPck9iamVjdFNldC5pbnN0YW5jZVN0cmluZygpID09PSB0aGlzLmluc3RhbmNlU3RyaW5nKCkpIHtcbiAgICAgICAgYXJyID0gYXJyYXlPck9iamVjdFNldC50b0FycmF5KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcnIgPSBhcnJheU9yT2JqZWN0U2V0O1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5hZGQoYXJyW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKE9iamVjdFNldCwgW3tcbiAgICBrZXk6IFwiaW5zdGFuY2VTdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5zdGFuY2VTdHJpbmcoKSB7XG4gICAgICByZXR1cm4gJ3NldCc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGQodmFsKSB7XG4gICAgICB2YXIgbyA9IHRoaXMuX29iajtcbiAgICAgIGlmIChvW3ZhbF0gIT09IDEpIHtcbiAgICAgICAgb1t2YWxdID0gMTtcbiAgICAgICAgdGhpcy5zaXplKys7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVsZXRlKHZhbCkge1xuICAgICAgdmFyIG8gPSB0aGlzLl9vYmo7XG4gICAgICBpZiAob1t2YWxdID09PSAxKSB7XG4gICAgICAgIG9bdmFsXSA9IDA7XG4gICAgICAgIHRoaXMuc2l6ZS0tO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbGVhclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIHRoaXMuX29iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXModmFsKSB7XG4gICAgICByZXR1cm4gdGhpcy5fb2JqW3ZhbF0gPT09IDE7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvQXJyYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9BcnJheSgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fb2JqKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gX3RoaXMuaGFzKGtleSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZm9yRWFjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICByZXR1cm4gdGhpcy50b0FycmF5KCkuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBPYmplY3RTZXQ7XG59KCk7XG52YXIgU2V0JDEgPSAodHlwZW9mIFNldCA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKFNldCkpICE9PSB1bmRlZiA/IFNldCA6IE9iamVjdFNldDtcblxuLy8gcmVwcmVzZW50cyBhIG5vZGUgb3IgYW4gZWRnZVxudmFyIEVsZW1lbnQgPSBmdW5jdGlvbiBFbGVtZW50KGN5LCBwYXJhbXMpIHtcbiAgdmFyIHJlc3RvcmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHRydWU7XG4gIGlmIChjeSA9PT0gdW5kZWZpbmVkIHx8IHBhcmFtcyA9PT0gdW5kZWZpbmVkIHx8ICFjb3JlKGN5KSkge1xuICAgIGVycm9yKCdBbiBlbGVtZW50IG11c3QgaGF2ZSBhIGNvcmUgcmVmZXJlbmNlIGFuZCBwYXJhbWV0ZXJzIHNldCcpO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgZ3JvdXAgPSBwYXJhbXMuZ3JvdXA7XG5cbiAgLy8gdHJ5IHRvIGF1dG9tYXRpY2FsbHkgaW5mZXIgdGhlIGdyb3VwIGlmIHVuc3BlY2lmaWVkXG4gIGlmIChncm91cCA9PSBudWxsKSB7XG4gICAgaWYgKHBhcmFtcy5kYXRhICYmIHBhcmFtcy5kYXRhLnNvdXJjZSAhPSBudWxsICYmIHBhcmFtcy5kYXRhLnRhcmdldCAhPSBudWxsKSB7XG4gICAgICBncm91cCA9ICdlZGdlcyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyb3VwID0gJ25vZGVzJztcbiAgICB9XG4gIH1cblxuICAvLyB2YWxpZGF0ZSBncm91cFxuICBpZiAoZ3JvdXAgIT09ICdub2RlcycgJiYgZ3JvdXAgIT09ICdlZGdlcycpIHtcbiAgICBlcnJvcignQW4gZWxlbWVudCBtdXN0IGJlIG9mIHR5cGUgYG5vZGVzYCBvciBgZWRnZXNgOyB5b3Ugc3BlY2lmaWVkIGAnICsgZ3JvdXAgKyAnYCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIG1ha2UgdGhlIGVsZW1lbnQgYXJyYXktbGlrZSwganVzdCBsaWtlIGEgY29sbGVjdGlvblxuICB0aGlzLmxlbmd0aCA9IDE7XG4gIHRoaXNbMF0gPSB0aGlzO1xuXG4gIC8vIE5PVEU6IHdoZW4gc29tZXRoaW5nIGlzIGFkZGVkIGhlcmUsIGFkZCBhbHNvIHRvIGVsZS5qc29uKClcbiAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZSA9IHtcbiAgICBjeTogY3ksXG4gICAgc2luZ2xlOiB0cnVlLFxuICAgIC8vIGluZGljYXRlcyB0aGlzIGlzIGFuIGVsZW1lbnRcbiAgICBkYXRhOiBwYXJhbXMuZGF0YSB8fCB7fSxcbiAgICAvLyBkYXRhIG9iamVjdFxuICAgIHBvc2l0aW9uOiBwYXJhbXMucG9zaXRpb24gfHwge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9LFxuICAgIC8vICh4LCB5KSBwb3NpdGlvbiBwYWlyXG4gICAgYXV0b1dpZHRoOiB1bmRlZmluZWQsXG4gICAgLy8gd2lkdGggYW5kIGhlaWdodCBvZiBub2RlcyBjYWxjdWxhdGVkIGJ5IHRoZSByZW5kZXJlciB3aGVuIHNldCB0byBzcGVjaWFsICdhdXRvJyB2YWx1ZVxuICAgIGF1dG9IZWlnaHQ6IHVuZGVmaW5lZCxcbiAgICBhdXRvUGFkZGluZzogdW5kZWZpbmVkLFxuICAgIGNvbXBvdW5kQm91bmRzQ2xlYW46IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgdGhlIGNvbXBvdW5kIGRpbWVuc2lvbnMgbmVlZCB0byBiZSByZWNhbGN1bGF0ZWQgdGhlIG5leHQgdGltZSBkaW1lbnNpb25zIGFyZSByZWFkXG4gICAgbGlzdGVuZXJzOiBbXSxcbiAgICAvLyBhcnJheSBvZiBib3VuZCBsaXN0ZW5lcnNcbiAgICBncm91cDogZ3JvdXAsXG4gICAgLy8gc3RyaW5nOyAnbm9kZXMnIG9yICdlZGdlcydcbiAgICBzdHlsZToge30sXG4gICAgLy8gcHJvcGVydGllcyBhcyBzZXQgYnkgdGhlIHN0eWxlXG4gICAgcnN0eWxlOiB7fSxcbiAgICAvLyBwcm9wZXJ0aWVzIGZvciBzdHlsZSBzZW50IGZyb20gdGhlIHJlbmRlcmVyIHRvIHRoZSBjb3JlXG4gICAgc3R5bGVDeHRzOiBbXSxcbiAgICAvLyBhcHBsaWVkIHN0eWxlIGNvbnRleHRzIGZyb20gdGhlIHN0eWxlclxuICAgIHN0eWxlS2V5czoge30sXG4gICAgLy8gcGVyLWdyb3VwIGtleXMgb2Ygc3R5bGUgcHJvcGVydHkgdmFsdWVzXG4gICAgcmVtb3ZlZDogdHJ1ZSxcbiAgICAvLyB3aGV0aGVyIGl0J3MgaW5zaWRlIHRoZSB2aXM7IHRydWUgaWYgcmVtb3ZlZCAoc2V0IHRydWUgaGVyZSBzaW5jZSB3ZSBjYWxsIHJlc3RvcmUpXG4gICAgc2VsZWN0ZWQ6IHBhcmFtcy5zZWxlY3RlZCA/IHRydWUgOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIGl0J3Mgc2VsZWN0ZWRcbiAgICBzZWxlY3RhYmxlOiBwYXJhbXMuc2VsZWN0YWJsZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHBhcmFtcy5zZWxlY3RhYmxlID8gdHJ1ZSA6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgaXQncyBzZWxlY3RhYmxlXG4gICAgbG9ja2VkOiBwYXJhbXMubG9ja2VkID8gdHJ1ZSA6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgbG9ja2VkIChjYW5ub3QgYmUgbW92ZWQpXG4gICAgZ3JhYmJlZDogZmFsc2UsXG4gICAgLy8gd2hldGhlciB0aGUgZWxlbWVudCBpcyBncmFiYmVkIGJ5IHRoZSBtb3VzZTsgcmVuZGVyZXIgc2V0cyB0aGlzIHByaXZhdGVseVxuICAgIGdyYWJiYWJsZTogcGFyYW1zLmdyYWJiYWJsZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHBhcmFtcy5ncmFiYmFibGUgPyB0cnVlIDogZmFsc2UsXG4gICAgLy8gd2hldGhlciB0aGUgZWxlbWVudCBjYW4gYmUgZ3JhYmJlZFxuICAgIHBhbm5hYmxlOiBwYXJhbXMucGFubmFibGUgPT09IHVuZGVmaW5lZCA/IGdyb3VwID09PSAnZWRnZXMnID8gdHJ1ZSA6IGZhbHNlIDogcGFyYW1zLnBhbm5hYmxlID8gdHJ1ZSA6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgdGhlIGVsZW1lbnQgaGFzIHBhc3N0aHJvdWdoIHBhbm5pbmcgZW5hYmxlZFxuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgLy8gd2hldGhlciB0aGUgZWxlbWVudCBpcyBhY3RpdmUgZnJvbSB1c2VyIGludGVyYWN0aW9uXG4gICAgY2xhc3NlczogbmV3IFNldCQxKCksXG4gICAgLy8gbWFwICggY2xhc3NOYW1lID0+IHRydWUgKVxuICAgIGFuaW1hdGlvbjoge1xuICAgICAgLy8gb2JqZWN0IGZvciBjdXJyZW50bHktcnVubmluZyBhbmltYXRpb25zXG4gICAgICBjdXJyZW50OiBbXSxcbiAgICAgIHF1ZXVlOiBbXVxuICAgIH0sXG4gICAgcnNjcmF0Y2g6IHt9LFxuICAgIC8vIG9iamVjdCBpbiB3aGljaCB0aGUgcmVuZGVyZXIgY2FuIHN0b3JlIGluZm9ybWF0aW9uXG4gICAgc2NyYXRjaDogcGFyYW1zLnNjcmF0Y2ggfHwge30sXG4gICAgLy8gc2NyYXRjaCBvYmplY3RzXG4gICAgZWRnZXM6IFtdLFxuICAgIC8vIGFycmF5IG9mIGNvbm5lY3RlZCBlZGdlc1xuICAgIGNoaWxkcmVuOiBbXSxcbiAgICAvLyBhcnJheSBvZiBjaGlsZHJlblxuICAgIHBhcmVudDogcGFyYW1zLnBhcmVudCAmJiBwYXJhbXMucGFyZW50LmlzTm9kZSgpID8gcGFyYW1zLnBhcmVudCA6IG51bGwsXG4gICAgLy8gcGFyZW50IHJlZlxuICAgIHRyYXZlcnNhbENhY2hlOiB7fSxcbiAgICAvLyBjYWNoZSBvZiBvdXRwdXQgb2YgdHJhdmVyc2FsIGZ1bmN0aW9uc1xuICAgIGJhY2tncm91bmRpbmc6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgYmFja2dyb3VuZCBpbWFnZXMgYXJlIGxvYWRpbmdcbiAgICBiYkNhY2hlOiBudWxsLFxuICAgIC8vIGNhY2hlIG9mIHRoZSBjdXJyZW50IGJvdW5kaW5nIGJveFxuICAgIGJiQ2FjaGVTaGlmdDoge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9LFxuICAgIC8vIHNoaWZ0IGFwcGxpZWQgdG8gY2FjaGVkIGJiIHRvIGJlIGFwcGxpZWQgb24gbmV4dCBnZXRcbiAgICBib2R5Qm91bmRzOiBudWxsLFxuICAgIC8vIGJvdW5kcyBjYWNoZSBvZiBlbGVtZW50IGJvZHksIHcvbyBvdmVybGF5XG4gICAgb3ZlcmxheUJvdW5kczogbnVsbCxcbiAgICAvLyBib3VuZHMgY2FjaGUgb2YgZWxlbWVudCBib2R5LCBpbmNsdWRpbmcgb3ZlcmxheVxuICAgIGxhYmVsQm91bmRzOiB7XG4gICAgICAvLyBib3VuZHMgY2FjaGUgb2YgbGFiZWxzXG4gICAgICBhbGw6IG51bGwsXG4gICAgICBzb3VyY2U6IG51bGwsXG4gICAgICB0YXJnZXQ6IG51bGwsXG4gICAgICBtYWluOiBudWxsXG4gICAgfSxcbiAgICBhcnJvd0JvdW5kczoge1xuICAgICAgLy8gYm91bmRzIGNhY2hlIG9mIGVkZ2UgYXJyb3dzXG4gICAgICBzb3VyY2U6IG51bGwsXG4gICAgICB0YXJnZXQ6IG51bGwsXG4gICAgICAnbWlkLXNvdXJjZSc6IG51bGwsXG4gICAgICAnbWlkLXRhcmdldCc6IG51bGxcbiAgICB9XG4gIH07XG4gIGlmIChfcC5wb3NpdGlvbi54ID09IG51bGwpIHtcbiAgICBfcC5wb3NpdGlvbi54ID0gMDtcbiAgfVxuICBpZiAoX3AucG9zaXRpb24ueSA9PSBudWxsKSB7XG4gICAgX3AucG9zaXRpb24ueSA9IDA7XG4gIH1cblxuICAvLyByZW5kZXJlZFBvc2l0aW9uIG92ZXJyaWRlcyBpZiBzcGVjaWZpZWRcbiAgaWYgKHBhcmFtcy5yZW5kZXJlZFBvc2l0aW9uKSB7XG4gICAgdmFyIHJwb3MgPSBwYXJhbXMucmVuZGVyZWRQb3NpdGlvbjtcbiAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgX3AucG9zaXRpb24gPSB7XG4gICAgICB4OiAocnBvcy54IC0gcGFuLngpIC8gem9vbSxcbiAgICAgIHk6IChycG9zLnkgLSBwYW4ueSkgLyB6b29tXG4gICAgfTtcbiAgfVxuICB2YXIgY2xhc3NlcyA9IFtdO1xuICBpZiAoYXJyYXkocGFyYW1zLmNsYXNzZXMpKSB7XG4gICAgY2xhc3NlcyA9IHBhcmFtcy5jbGFzc2VzO1xuICB9IGVsc2UgaWYgKHN0cmluZyhwYXJhbXMuY2xhc3NlcykpIHtcbiAgICBjbGFzc2VzID0gcGFyYW1zLmNsYXNzZXMuc3BsaXQoL1xccysvKTtcbiAgfVxuICBmb3IgKHZhciBpID0gMCwgbCA9IGNsYXNzZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIGNscyA9IGNsYXNzZXNbaV07XG4gICAgaWYgKCFjbHMgfHwgY2xzID09PSAnJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIF9wLmNsYXNzZXMuYWRkKGNscyk7XG4gIH1cbiAgdGhpcy5jcmVhdGVFbWl0dGVyKCk7XG4gIHZhciBieXBhc3MgPSBwYXJhbXMuc3R5bGUgfHwgcGFyYW1zLmNzcztcbiAgaWYgKGJ5cGFzcykge1xuICAgIHdhcm4oJ1NldHRpbmcgYSBgc3R5bGVgIGJ5cGFzcyBhdCBlbGVtZW50IGNyZWF0aW9uIHNob3VsZCBiZSBkb25lIG9ubHkgd2hlbiBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4gIFRyeSB0byB1c2UgdGhlIHN0eWxlc2hlZXQgaW5zdGVhZC4nKTtcbiAgICB0aGlzLnN0eWxlKGJ5cGFzcyk7XG4gIH1cbiAgaWYgKHJlc3RvcmUgPT09IHVuZGVmaW5lZCB8fCByZXN0b3JlKSB7XG4gICAgdGhpcy5yZXN0b3JlKCk7XG4gIH1cbn07XG5cbnZhciBkZWZpbmVTZWFyY2ggPSBmdW5jdGlvbiBkZWZpbmVTZWFyY2gocGFyYW1zKSB7XG4gIHBhcmFtcyA9IHtcbiAgICBiZnM6IHBhcmFtcy5iZnMgfHwgIXBhcmFtcy5kZnMsXG4gICAgZGZzOiBwYXJhbXMuZGZzIHx8ICFwYXJhbXMuYmZzXG4gIH07XG5cbiAgLy8gZnJvbSBwc2V1ZG9jb2RlIG9uIHdpa2lwZWRpYVxuICByZXR1cm4gZnVuY3Rpb24gc2VhcmNoRm4ocm9vdHMsIGZuLCBkaXJlY3RlZCkge1xuICAgIHZhciBvcHRpb25zO1xuICAgIGlmIChwbGFpbk9iamVjdChyb290cykgJiYgIWVsZW1lbnRPckNvbGxlY3Rpb24ocm9vdHMpKSB7XG4gICAgICBvcHRpb25zID0gcm9vdHM7XG4gICAgICByb290cyA9IG9wdGlvbnMucm9vdHMgfHwgb3B0aW9ucy5yb290O1xuICAgICAgZm4gPSBvcHRpb25zLnZpc2l0O1xuICAgICAgZGlyZWN0ZWQgPSBvcHRpb25zLmRpcmVjdGVkO1xuICAgIH1cbiAgICBkaXJlY3RlZCA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgIWZuJDYoZm4pID8gZm4gOiBkaXJlY3RlZDtcbiAgICBmbiA9IGZuJDYoZm4pID8gZm4gOiBmdW5jdGlvbiAoKSB7fTtcbiAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICAgIHZhciB2ID0gcm9vdHMgPSBzdHJpbmcocm9vdHMpID8gdGhpcy5maWx0ZXIocm9vdHMpIDogcm9vdHM7XG4gICAgdmFyIFEgPSBbXTtcbiAgICB2YXIgY29ubmVjdGVkTm9kZXMgPSBbXTtcbiAgICB2YXIgY29ubmVjdGVkQnkgPSB7fTtcbiAgICB2YXIgaWQyZGVwdGggPSB7fTtcbiAgICB2YXIgViA9IHt9O1xuICAgIHZhciBqID0gMDtcbiAgICB2YXIgZm91bmQ7XG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgIG5vZGVzID0gX3RoaXMkYnlHcm91cC5ub2RlcyxcbiAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcztcblxuICAgIC8vIGVucXVldWUgdlxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZpID0gdltpXTtcbiAgICAgIHZhciB2aUlkID0gdmkuaWQoKTtcbiAgICAgIGlmICh2aS5pc05vZGUoKSkge1xuICAgICAgICBRLnVuc2hpZnQodmkpO1xuICAgICAgICBpZiAocGFyYW1zLmJmcykge1xuICAgICAgICAgIFZbdmlJZF0gPSB0cnVlO1xuICAgICAgICAgIGNvbm5lY3RlZE5vZGVzLnB1c2godmkpO1xuICAgICAgICB9XG4gICAgICAgIGlkMmRlcHRoW3ZpSWRdID0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICB2YXIgdiA9IHBhcmFtcy5iZnMgPyBRLnNoaWZ0KCkgOiBRLnBvcCgpO1xuICAgICAgdmFyIHZJZCA9IHYuaWQoKTtcbiAgICAgIGlmIChwYXJhbXMuZGZzKSB7XG4gICAgICAgIGlmIChWW3ZJZF0pIHtcbiAgICAgICAgICByZXR1cm4gXCJjb250aW51ZVwiO1xuICAgICAgICB9XG4gICAgICAgIFZbdklkXSA9IHRydWU7XG4gICAgICAgIGNvbm5lY3RlZE5vZGVzLnB1c2godik7XG4gICAgICB9XG4gICAgICB2YXIgZGVwdGggPSBpZDJkZXB0aFt2SWRdO1xuICAgICAgdmFyIHByZXZFZGdlID0gY29ubmVjdGVkQnlbdklkXTtcbiAgICAgIHZhciBzcmMgPSBwcmV2RWRnZSAhPSBudWxsID8gcHJldkVkZ2Uuc291cmNlKCkgOiBudWxsO1xuICAgICAgdmFyIHRndCA9IHByZXZFZGdlICE9IG51bGwgPyBwcmV2RWRnZS50YXJnZXQoKSA6IG51bGw7XG4gICAgICB2YXIgcHJldk5vZGUgPSBwcmV2RWRnZSA9PSBudWxsID8gdW5kZWZpbmVkIDogdi5zYW1lKHNyYykgPyB0Z3RbMF0gOiBzcmNbMF07XG4gICAgICB2YXIgcmV0ID0gdm9pZCAwO1xuICAgICAgcmV0ID0gZm4odiwgcHJldkVkZ2UsIHByZXZOb2RlLCBqKyssIGRlcHRoKTtcbiAgICAgIGlmIChyZXQgPT09IHRydWUpIHtcbiAgICAgICAgZm91bmQgPSB2O1xuICAgICAgICByZXR1cm4gXCJicmVha1wiO1xuICAgICAgfVxuICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgIH1cbiAgICAgIHZhciB2d0VkZ2VzID0gdi5jb25uZWN0ZWRFZGdlcygpLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gKCFkaXJlY3RlZCB8fCBlLnNvdXJjZSgpLnNhbWUodikpICYmIGVkZ2VzLmhhcyhlKTtcbiAgICAgIH0pO1xuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgdndFZGdlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIHZhciBlID0gdndFZGdlc1tfaTJdO1xuICAgICAgICB2YXIgdyA9IGUuY29ubmVjdGVkTm9kZXMoKS5maWx0ZXIoZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICByZXR1cm4gIW4uc2FtZSh2KSAmJiBub2Rlcy5oYXMobik7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgd0lkID0gdy5pZCgpO1xuICAgICAgICBpZiAody5sZW5ndGggIT09IDAgJiYgIVZbd0lkXSkge1xuICAgICAgICAgIHcgPSB3WzBdO1xuICAgICAgICAgIFEucHVzaCh3KTtcbiAgICAgICAgICBpZiAocGFyYW1zLmJmcykge1xuICAgICAgICAgICAgVlt3SWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbm5lY3RlZE5vZGVzLnB1c2godyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbm5lY3RlZEJ5W3dJZF0gPSBlO1xuICAgICAgICAgIGlkMmRlcHRoW3dJZF0gPSBpZDJkZXB0aFt2SWRdICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUgKFEubGVuZ3RoICE9PSAwKSB7XG4gICAgICB2YXIgX3JldCA9IF9sb29wKCk7XG4gICAgICBpZiAoX3JldCA9PT0gXCJjb250aW51ZVwiKSBjb250aW51ZTtcbiAgICAgIGlmIChfcmV0ID09PSBcImJyZWFrXCIpIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgY29ubmVjdGVkRWxlcyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgY29ubmVjdGVkTm9kZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgbm9kZSA9IGNvbm5lY3RlZE5vZGVzW19pXTtcbiAgICAgIHZhciBlZGdlID0gY29ubmVjdGVkQnlbbm9kZS5pZCgpXTtcbiAgICAgIGlmIChlZGdlICE9IG51bGwpIHtcbiAgICAgICAgY29ubmVjdGVkRWxlcy5wdXNoKGVkZ2UpO1xuICAgICAgfVxuICAgICAgY29ubmVjdGVkRWxlcy5wdXNoKG5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogY3kuY29sbGVjdGlvbihjb25uZWN0ZWRFbGVzKSxcbiAgICAgIGZvdW5kOiBjeS5jb2xsZWN0aW9uKGZvdW5kKVxuICAgIH07XG4gIH07XG59O1xuXG4vLyBzZWFyY2gsIHNwYW5uaW5nIHRyZWVzLCBldGNcbnZhciBlbGVzZm4kdiA9IHtcbiAgYnJlYWR0aEZpcnN0U2VhcmNoOiBkZWZpbmVTZWFyY2goe1xuICAgIGJmczogdHJ1ZVxuICB9KSxcbiAgZGVwdGhGaXJzdFNlYXJjaDogZGVmaW5lU2VhcmNoKHtcbiAgICBkZnM6IHRydWVcbiAgfSlcbn07XG5cbi8vIG5pY2UsIHNob3J0IG1hdGhlbWF0aWNhbCBhbGlhc1xuZWxlc2ZuJHYuYmZzID0gZWxlc2ZuJHYuYnJlYWR0aEZpcnN0U2VhcmNoO1xuZWxlc2ZuJHYuZGZzID0gZWxlc2ZuJHYuZGVwdGhGaXJzdFNlYXJjaDtcblxudmFyIGRpamtzdHJhRGVmYXVsdHMgPSBkZWZhdWx0cyRnKHtcbiAgcm9vdDogbnVsbCxcbiAgd2VpZ2h0OiBmdW5jdGlvbiB3ZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2Vcbn0pO1xudmFyIGVsZXNmbiR1ID0ge1xuICBkaWprc3RyYTogZnVuY3Rpb24gZGlqa3N0cmEob3B0aW9ucykge1xuICAgIGlmICghcGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgcm9vdDogYXJnc1swXSxcbiAgICAgICAgd2VpZ2h0OiBhcmdzWzFdLFxuICAgICAgICBkaXJlY3RlZDogYXJnc1syXVxuICAgICAgfTtcbiAgICB9XG4gICAgdmFyIF9kaWprc3RyYURlZmF1bHRzID0gZGlqa3N0cmFEZWZhdWx0cyhvcHRpb25zKSxcbiAgICAgIHJvb3QgPSBfZGlqa3N0cmFEZWZhdWx0cy5yb290LFxuICAgICAgd2VpZ2h0ID0gX2RpamtzdHJhRGVmYXVsdHMud2VpZ2h0LFxuICAgICAgZGlyZWN0ZWQgPSBfZGlqa3N0cmFEZWZhdWx0cy5kaXJlY3RlZDtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIHdlaWdodEZuID0gd2VpZ2h0O1xuICAgIHZhciBzb3VyY2UgPSBzdHJpbmcocm9vdCkgPyB0aGlzLmZpbHRlcihyb290KVswXSA6IHJvb3RbMF07XG4gICAgdmFyIGRpc3QgPSB7fTtcbiAgICB2YXIgcHJldiA9IHt9O1xuICAgIHZhciBrbm93bkRpc3QgPSB7fTtcbiAgICB2YXIgX3RoaXMkYnlHcm91cCA9IHRoaXMuYnlHcm91cCgpLFxuICAgICAgbm9kZXMgPSBfdGhpcyRieUdyb3VwLm5vZGVzLFxuICAgICAgZWRnZXMgPSBfdGhpcyRieUdyb3VwLmVkZ2VzO1xuICAgIGVkZ2VzLnVubWVyZ2VCeShmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzTG9vcCgpO1xuICAgIH0pO1xuICAgIHZhciBnZXREaXN0ID0gZnVuY3Rpb24gZ2V0RGlzdChub2RlKSB7XG4gICAgICByZXR1cm4gZGlzdFtub2RlLmlkKCldO1xuICAgIH07XG4gICAgdmFyIHNldERpc3QgPSBmdW5jdGlvbiBzZXREaXN0KG5vZGUsIGQpIHtcbiAgICAgIGRpc3Rbbm9kZS5pZCgpXSA9IGQ7XG4gICAgICBRLnVwZGF0ZUl0ZW0obm9kZSk7XG4gICAgfTtcbiAgICB2YXIgUSA9IG5ldyBIZWFwX19kZWZhdWx0W1wiZGVmYXVsdFwiXShmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGdldERpc3QoYSkgLSBnZXREaXN0KGIpO1xuICAgIH0pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICBkaXN0W25vZGUuaWQoKV0gPSBub2RlLnNhbWUoc291cmNlKSA/IDAgOiBJbmZpbml0eTtcbiAgICAgIFEucHVzaChub2RlKTtcbiAgICB9XG4gICAgdmFyIGRpc3RCZXR3ZWVuID0gZnVuY3Rpb24gZGlzdEJldHdlZW4odSwgdikge1xuICAgICAgdmFyIHV2cyA9IChkaXJlY3RlZCA/IHUuZWRnZXNUbyh2KSA6IHUuZWRnZXNXaXRoKHYpKS5pbnRlcnNlY3QoZWRnZXMpO1xuICAgICAgdmFyIHNtYWxsZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgICAgIHZhciBzbWFsbGVzdEVkZ2U7XG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdXZzLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgZWRnZSA9IHV2c1tfaV07XG4gICAgICAgIHZhciBfd2VpZ2h0ID0gd2VpZ2h0Rm4oZWRnZSk7XG4gICAgICAgIGlmIChfd2VpZ2h0IDwgc21hbGxlc3REaXN0YW5jZSB8fCAhc21hbGxlc3RFZGdlKSB7XG4gICAgICAgICAgc21hbGxlc3REaXN0YW5jZSA9IF93ZWlnaHQ7XG4gICAgICAgICAgc21hbGxlc3RFZGdlID0gZWRnZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWRnZTogc21hbGxlc3RFZGdlLFxuICAgICAgICBkaXN0OiBzbWFsbGVzdERpc3RhbmNlXG4gICAgICB9O1xuICAgIH07XG4gICAgd2hpbGUgKFEuc2l6ZSgpID4gMCkge1xuICAgICAgdmFyIHUgPSBRLnBvcCgpO1xuICAgICAgdmFyIHNtYWxsZXRzRGlzdCA9IGdldERpc3QodSk7XG4gICAgICB2YXIgdWlkID0gdS5pZCgpO1xuICAgICAga25vd25EaXN0W3VpZF0gPSBzbWFsbGV0c0Rpc3Q7XG4gICAgICBpZiAoc21hbGxldHNEaXN0ID09PSBJbmZpbml0eSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBuZWlnaGJvcnMgPSB1Lm5laWdoYm9yaG9vZCgpLmludGVyc2VjdChub2Rlcyk7XG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBuZWlnaGJvcnMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICB2YXIgdiA9IG5laWdoYm9yc1tfaTJdO1xuICAgICAgICB2YXIgdmlkID0gdi5pZCgpO1xuICAgICAgICB2YXIgdkRpc3QgPSBkaXN0QmV0d2Vlbih1LCB2KTtcbiAgICAgICAgdmFyIGFsdCA9IHNtYWxsZXRzRGlzdCArIHZEaXN0LmRpc3Q7XG4gICAgICAgIGlmIChhbHQgPCBnZXREaXN0KHYpKSB7XG4gICAgICAgICAgc2V0RGlzdCh2LCBhbHQpO1xuICAgICAgICAgIHByZXZbdmlkXSA9IHtcbiAgICAgICAgICAgIG5vZGU6IHUsXG4gICAgICAgICAgICBlZGdlOiB2RGlzdC5lZGdlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBmb3JcbiAgICB9IC8vIHdoaWxlXG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlzdGFuY2VUbzogZnVuY3Rpb24gZGlzdGFuY2VUbyhub2RlKSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBzdHJpbmcobm9kZSkgPyBub2Rlcy5maWx0ZXIobm9kZSlbMF0gOiBub2RlWzBdO1xuICAgICAgICByZXR1cm4ga25vd25EaXN0W3RhcmdldC5pZCgpXTtcbiAgICAgIH0sXG4gICAgICBwYXRoVG86IGZ1bmN0aW9uIHBhdGhUbyhub2RlKSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBzdHJpbmcobm9kZSkgPyBub2Rlcy5maWx0ZXIobm9kZSlbMF0gOiBub2RlWzBdO1xuICAgICAgICB2YXIgUyA9IFtdO1xuICAgICAgICB2YXIgdSA9IHRhcmdldDtcbiAgICAgICAgdmFyIHVpZCA9IHUuaWQoKTtcbiAgICAgICAgaWYgKHRhcmdldC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgUy51bnNoaWZ0KHRhcmdldCk7XG4gICAgICAgICAgd2hpbGUgKHByZXZbdWlkXSkge1xuICAgICAgICAgICAgdmFyIHAgPSBwcmV2W3VpZF07XG4gICAgICAgICAgICBTLnVuc2hpZnQocC5lZGdlKTtcbiAgICAgICAgICAgIFMudW5zaGlmdChwLm5vZGUpO1xuICAgICAgICAgICAgdSA9IHAubm9kZTtcbiAgICAgICAgICAgIHVpZCA9IHUuaWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZXMuc3Bhd24oUyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcblxudmFyIGVsZXNmbiR0ID0ge1xuICAvLyBrcnVza2FsJ3MgYWxnb3JpdGhtIChmaW5kcyBtaW4gc3Bhbm5pbmcgdHJlZSwgYXNzdW1pbmcgdW5kaXJlY3RlZCBncmFwaClcbiAgLy8gaW1wbGVtZW50ZWQgZnJvbSBwc2V1ZG9jb2RlIGZyb20gd2lraXBlZGlhXG4gIGtydXNrYWw6IGZ1bmN0aW9uIGtydXNrYWwod2VpZ2h0Rm4pIHtcbiAgICB3ZWlnaHRGbiA9IHdlaWdodEZuIHx8IGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9O1xuICAgIHZhciBfdGhpcyRieUdyb3VwID0gdGhpcy5ieUdyb3VwKCksXG4gICAgICBub2RlcyA9IF90aGlzJGJ5R3JvdXAubm9kZXMsXG4gICAgICBlZGdlcyA9IF90aGlzJGJ5R3JvdXAuZWRnZXM7XG4gICAgdmFyIG51bU5vZGVzID0gbm9kZXMubGVuZ3RoO1xuICAgIHZhciBmb3Jlc3QgPSBuZXcgQXJyYXkobnVtTm9kZXMpO1xuICAgIHZhciBBID0gbm9kZXM7IC8vIGFzc3VtZXMgYnlHcm91cCgpIGNyZWF0ZXMgbmV3IGNvbGxlY3Rpb25zIHRoYXQgY2FuIGJlIHNhZmVseSBtdXRhdGVkXG5cbiAgICB2YXIgZmluZFNldEluZGV4ID0gZnVuY3Rpb24gZmluZFNldEluZGV4KGVsZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3Jlc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZXMgPSBmb3Jlc3RbaV07XG4gICAgICAgIGlmIChlbGVzLmhhcyhlbGUpKSB7XG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gc3RhcnQgd2l0aCBvbmUgZm9yZXN0IHBlciBub2RlXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1Ob2RlczsgaSsrKSB7XG4gICAgICBmb3Jlc3RbaV0gPSB0aGlzLnNwYXduKG5vZGVzW2ldKTtcbiAgICB9XG4gICAgdmFyIFMgPSBlZGdlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gd2VpZ2h0Rm4oYSkgLSB3ZWlnaHRGbihiKTtcbiAgICB9KTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgUy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBlZGdlID0gU1tfaV07XG4gICAgICB2YXIgdSA9IGVkZ2Uuc291cmNlKClbMF07XG4gICAgICB2YXIgdiA9IGVkZ2UudGFyZ2V0KClbMF07XG4gICAgICB2YXIgc2V0VUluZGV4ID0gZmluZFNldEluZGV4KHUpO1xuICAgICAgdmFyIHNldFZJbmRleCA9IGZpbmRTZXRJbmRleCh2KTtcbiAgICAgIHZhciBzZXRVID0gZm9yZXN0W3NldFVJbmRleF07XG4gICAgICB2YXIgc2V0ViA9IGZvcmVzdFtzZXRWSW5kZXhdO1xuICAgICAgaWYgKHNldFVJbmRleCAhPT0gc2V0VkluZGV4KSB7XG4gICAgICAgIEEubWVyZ2UoZWRnZSk7XG5cbiAgICAgICAgLy8gY29tYmluZSBmb3Jlc3RzIGZvciB1IGFuZCB2XG4gICAgICAgIHNldFUubWVyZ2Uoc2V0Vik7XG4gICAgICAgIGZvcmVzdC5zcGxpY2Uoc2V0VkluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIEE7XG4gIH1cbn07XG5cbnZhciBhU3RhckRlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIHJvb3Q6IG51bGwsXG4gIGdvYWw6IG51bGwsXG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgaGV1cmlzdGljOiBmdW5jdGlvbiBoZXVyaXN0aWMoZWRnZSkge1xuICAgIHJldHVybiAwO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2Vcbn0pO1xudmFyIGVsZXNmbiRzID0ge1xuICAvLyBJbXBsZW1lbnRlZCBmcm9tIHBzZXVkb2NvZGUgZnJvbSB3aWtpcGVkaWFcbiAgYVN0YXI6IGZ1bmN0aW9uIGFTdGFyKG9wdGlvbnMpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIF9hU3RhckRlZmF1bHRzID0gYVN0YXJEZWZhdWx0cyhvcHRpb25zKSxcbiAgICAgIHJvb3QgPSBfYVN0YXJEZWZhdWx0cy5yb290LFxuICAgICAgZ29hbCA9IF9hU3RhckRlZmF1bHRzLmdvYWwsXG4gICAgICBoZXVyaXN0aWMgPSBfYVN0YXJEZWZhdWx0cy5oZXVyaXN0aWMsXG4gICAgICBkaXJlY3RlZCA9IF9hU3RhckRlZmF1bHRzLmRpcmVjdGVkLFxuICAgICAgd2VpZ2h0ID0gX2FTdGFyRGVmYXVsdHMud2VpZ2h0O1xuICAgIHJvb3QgPSBjeS5jb2xsZWN0aW9uKHJvb3QpWzBdO1xuICAgIGdvYWwgPSBjeS5jb2xsZWN0aW9uKGdvYWwpWzBdO1xuICAgIHZhciBzaWQgPSByb290LmlkKCk7XG4gICAgdmFyIHRpZCA9IGdvYWwuaWQoKTtcbiAgICB2YXIgZ1Njb3JlID0ge307XG4gICAgdmFyIGZTY29yZSA9IHt9O1xuICAgIHZhciBjbG9zZWRTZXRJZHMgPSB7fTtcbiAgICB2YXIgb3BlblNldCA9IG5ldyBIZWFwX19kZWZhdWx0W1wiZGVmYXVsdFwiXShmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZTY29yZVthLmlkKCldIC0gZlNjb3JlW2IuaWQoKV07XG4gICAgfSk7XG4gICAgdmFyIG9wZW5TZXRJZHMgPSBuZXcgU2V0JDEoKTtcbiAgICB2YXIgY2FtZUZyb20gPSB7fTtcbiAgICB2YXIgY2FtZUZyb21FZGdlID0ge307XG4gICAgdmFyIGFkZFRvT3BlblNldCA9IGZ1bmN0aW9uIGFkZFRvT3BlblNldChlbGUsIGlkKSB7XG4gICAgICBvcGVuU2V0LnB1c2goZWxlKTtcbiAgICAgIG9wZW5TZXRJZHMuYWRkKGlkKTtcbiAgICB9O1xuICAgIHZhciBjTWluLCBjTWluSWQ7XG4gICAgdmFyIHBvcEZyb21PcGVuU2V0ID0gZnVuY3Rpb24gcG9wRnJvbU9wZW5TZXQoKSB7XG4gICAgICBjTWluID0gb3BlblNldC5wb3AoKTtcbiAgICAgIGNNaW5JZCA9IGNNaW4uaWQoKTtcbiAgICAgIG9wZW5TZXRJZHNbXCJkZWxldGVcIl0oY01pbklkKTtcbiAgICB9O1xuICAgIHZhciBpc0luT3BlblNldCA9IGZ1bmN0aW9uIGlzSW5PcGVuU2V0KGlkKSB7XG4gICAgICByZXR1cm4gb3BlblNldElkcy5oYXMoaWQpO1xuICAgIH07XG4gICAgYWRkVG9PcGVuU2V0KHJvb3QsIHNpZCk7XG4gICAgZ1Njb3JlW3NpZF0gPSAwO1xuICAgIGZTY29yZVtzaWRdID0gaGV1cmlzdGljKHJvb3QpO1xuXG4gICAgLy8gQ291bnRlclxuICAgIHZhciBzdGVwcyA9IDA7XG5cbiAgICAvLyBNYWluIGxvb3BcbiAgICB3aGlsZSAob3BlblNldC5zaXplKCkgPiAwKSB7XG4gICAgICBwb3BGcm9tT3BlblNldCgpO1xuICAgICAgc3RlcHMrKztcblxuICAgICAgLy8gSWYgd2UndmUgZm91bmQgb3VyIGdvYWwsIHRoZW4gd2UgYXJlIGRvbmVcbiAgICAgIGlmIChjTWluSWQgPT09IHRpZCkge1xuICAgICAgICB2YXIgcGF0aCA9IFtdO1xuICAgICAgICB2YXIgcGF0aE5vZGUgPSBnb2FsO1xuICAgICAgICB2YXIgcGF0aE5vZGVJZCA9IHRpZDtcbiAgICAgICAgdmFyIHBhdGhFZGdlID0gY2FtZUZyb21FZGdlW3BhdGhOb2RlSWRdO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgcGF0aC51bnNoaWZ0KHBhdGhOb2RlKTtcbiAgICAgICAgICBpZiAocGF0aEVkZ2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgcGF0aC51bnNoaWZ0KHBhdGhFZGdlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGF0aE5vZGUgPSBjYW1lRnJvbVtwYXRoTm9kZUlkXTtcbiAgICAgICAgICBpZiAocGF0aE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhdGhOb2RlSWQgPSBwYXRoTm9kZS5pZCgpO1xuICAgICAgICAgIHBhdGhFZGdlID0gY2FtZUZyb21FZGdlW3BhdGhOb2RlSWRdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZm91bmQ6IHRydWUsXG4gICAgICAgICAgZGlzdGFuY2U6IGdTY29yZVtjTWluSWRdLFxuICAgICAgICAgIHBhdGg6IHRoaXMuc3Bhd24ocGF0aCksXG4gICAgICAgICAgc3RlcHM6IHN0ZXBzXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBjTWluIHRvIHByb2Nlc3NlZCBub2Rlc1xuICAgICAgY2xvc2VkU2V0SWRzW2NNaW5JZF0gPSB0cnVlO1xuXG4gICAgICAvLyBVcGRhdGUgc2NvcmVzIGZvciBuZWlnaGJvcnMgb2YgY01pblxuICAgICAgLy8gVGFrZSBpbnRvIGFjY291bnQgaWYgZ3JhcGggaXMgZGlyZWN0ZWQgb3Igbm90XG4gICAgICB2YXIgdndFZGdlcyA9IGNNaW4uX3ByaXZhdGUuZWRnZXM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZ3RWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGUgPSB2d0VkZ2VzW2ldO1xuXG4gICAgICAgIC8vIGVkZ2UgbXVzdCBiZSBpbiBzZXQgb2YgY2FsbGluZyBlbGVzXG4gICAgICAgIGlmICghdGhpcy5oYXNFbGVtZW50V2l0aElkKGUuaWQoKSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNNaW4gbXVzdCBiZSB0aGUgc291cmNlIG9mIGVkZ2UgaWYgZGlyZWN0ZWRcbiAgICAgICAgaWYgKGRpcmVjdGVkICYmIGUuZGF0YSgnc291cmNlJykgIT09IGNNaW5JZCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciB3U3JjID0gZS5zb3VyY2UoKTtcbiAgICAgICAgdmFyIHdUZ3QgPSBlLnRhcmdldCgpO1xuICAgICAgICB2YXIgdyA9IHdTcmMuaWQoKSAhPT0gY01pbklkID8gd1NyYyA6IHdUZ3Q7XG4gICAgICAgIHZhciB3aWQgPSB3LmlkKCk7XG5cbiAgICAgICAgLy8gbm9kZSBtdXN0IGJlIGluIHNldCBvZiBjYWxsaW5nIGVsZXNcbiAgICAgICAgaWYgKCF0aGlzLmhhc0VsZW1lbnRXaXRoSWQod2lkKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgbm9kZSBpcyBpbiBjbG9zZWRTZXQsIGlnbm9yZSBpdFxuICAgICAgICBpZiAoY2xvc2VkU2V0SWRzW3dpZF0pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5ldyB0ZW50YXRpdmUgc2NvcmUgZm9yIG5vZGUgd1xuICAgICAgICB2YXIgdGVtcFNjb3JlID0gZ1Njb3JlW2NNaW5JZF0gKyB3ZWlnaHQoZSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGdTY29yZSBmb3Igbm9kZSB3IGlmOlxuICAgICAgICAvLyAgIHcgbm90IHByZXNlbnQgaW4gb3BlblNldFxuICAgICAgICAvLyBPUlxuICAgICAgICAvLyAgIHRlbnRhdGl2ZSBnU2NvcmUgaXMgbGVzcyB0aGFuIHByZXZpb3VzIHZhbHVlXG5cbiAgICAgICAgLy8gdyBub3QgaW4gb3BlblNldFxuICAgICAgICBpZiAoIWlzSW5PcGVuU2V0KHdpZCkpIHtcbiAgICAgICAgICBnU2NvcmVbd2lkXSA9IHRlbXBTY29yZTtcbiAgICAgICAgICBmU2NvcmVbd2lkXSA9IHRlbXBTY29yZSArIGhldXJpc3RpYyh3KTtcbiAgICAgICAgICBhZGRUb09wZW5TZXQodywgd2lkKTtcbiAgICAgICAgICBjYW1lRnJvbVt3aWRdID0gY01pbjtcbiAgICAgICAgICBjYW1lRnJvbUVkZ2Vbd2lkXSA9IGU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3IGFscmVhZHkgaW4gb3BlblNldCwgYnV0IHdpdGggZ3JlYXRlciBnU2NvcmVcbiAgICAgICAgaWYgKHRlbXBTY29yZSA8IGdTY29yZVt3aWRdKSB7XG4gICAgICAgICAgZ1Njb3JlW3dpZF0gPSB0ZW1wU2NvcmU7XG4gICAgICAgICAgZlNjb3JlW3dpZF0gPSB0ZW1wU2NvcmUgKyBoZXVyaXN0aWModyk7XG4gICAgICAgICAgY2FtZUZyb21bd2lkXSA9IGNNaW47XG4gICAgICAgICAgY2FtZUZyb21FZGdlW3dpZF0gPSBlO1xuICAgICAgICB9XG4gICAgICB9IC8vIEVuZCBvZiBuZWlnaGJvcnMgdXBkYXRlXG4gICAgfSAvLyBFbmQgb2YgbWFpbiBsb29wXG5cbiAgICAvLyBJZiB3ZSd2ZSByZWFjaGVkIGhlcmUsIHRoZW4gd2UndmUgbm90IHJlYWNoZWQgb3VyIGdvYWxcbiAgICByZXR1cm4ge1xuICAgICAgZm91bmQ6IGZhbHNlLFxuICAgICAgZGlzdGFuY2U6IHVuZGVmaW5lZCxcbiAgICAgIHBhdGg6IHVuZGVmaW5lZCxcbiAgICAgIHN0ZXBzOiBzdGVwc1xuICAgIH07XG4gIH1cbn07IC8vIGVsZXNmblxuXG52YXIgZmxveWRXYXJzaGFsbERlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgZGlyZWN0ZWQ6IGZhbHNlXG59KTtcbnZhciBlbGVzZm4kciA9IHtcbiAgLy8gSW1wbGVtZW50ZWQgZnJvbSBwc2V1ZG9jb2RlIGZyb20gd2lraXBlZGlhXG4gIGZsb3lkV2Fyc2hhbGw6IGZ1bmN0aW9uIGZsb3lkV2Fyc2hhbGwob3B0aW9ucykge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgX2Zsb3lkV2Fyc2hhbGxEZWZhdWx0ID0gZmxveWRXYXJzaGFsbERlZmF1bHRzKG9wdGlvbnMpLFxuICAgICAgd2VpZ2h0ID0gX2Zsb3lkV2Fyc2hhbGxEZWZhdWx0LndlaWdodCxcbiAgICAgIGRpcmVjdGVkID0gX2Zsb3lkV2Fyc2hhbGxEZWZhdWx0LmRpcmVjdGVkO1xuICAgIHZhciB3ZWlnaHRGbiA9IHdlaWdodDtcbiAgICB2YXIgX3RoaXMkYnlHcm91cCA9IHRoaXMuYnlHcm91cCgpLFxuICAgICAgbm9kZXMgPSBfdGhpcyRieUdyb3VwLm5vZGVzLFxuICAgICAgZWRnZXMgPSBfdGhpcyRieUdyb3VwLmVkZ2VzO1xuICAgIHZhciBOID0gbm9kZXMubGVuZ3RoO1xuICAgIHZhciBOc3EgPSBOICogTjtcbiAgICB2YXIgaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2Yobm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGVzLmluZGV4T2Yobm9kZSk7XG4gICAgfTtcbiAgICB2YXIgYXRJbmRleCA9IGZ1bmN0aW9uIGF0SW5kZXgoaSkge1xuICAgICAgcmV0dXJuIG5vZGVzW2ldO1xuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIGRpc3RhbmNlIG1hdHJpeFxuICAgIHZhciBkaXN0ID0gbmV3IEFycmF5KE5zcSk7XG4gICAgZm9yICh2YXIgbiA9IDA7IG4gPCBOc3E7IG4rKykge1xuICAgICAgdmFyIGogPSBuICUgTjtcbiAgICAgIHZhciBpID0gKG4gLSBqKSAvIE47XG4gICAgICBpZiAoaSA9PT0gaikge1xuICAgICAgICBkaXN0W25dID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3Rbbl0gPSBJbmZpbml0eTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIG1hdHJpeCB1c2VkIGZvciBwYXRoIHJlY29uc3RydWN0aW9uXG4gICAgLy8gSW5pdGlhbGl6ZSBkaXN0YW5jZSBtYXRyaXhcbiAgICB2YXIgbmV4dCA9IG5ldyBBcnJheShOc3EpO1xuICAgIHZhciBlZGdlTmV4dCA9IG5ldyBBcnJheShOc3EpO1xuXG4gICAgLy8gUHJvY2VzcyBlZGdlc1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBlZGdlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBlZGdlID0gZWRnZXNbX2ldO1xuICAgICAgdmFyIHNyYyA9IGVkZ2Uuc291cmNlKClbMF07XG4gICAgICB2YXIgdGd0ID0gZWRnZS50YXJnZXQoKVswXTtcbiAgICAgIGlmIChzcmMgPT09IHRndCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gZXhjbHVkZSBsb29wc1xuXG4gICAgICB2YXIgcyA9IGluZGV4T2Yoc3JjKTtcbiAgICAgIHZhciB0ID0gaW5kZXhPZih0Z3QpO1xuICAgICAgdmFyIHN0ID0gcyAqIE4gKyB0OyAvLyBzb3VyY2UgdG8gdGFyZ2V0IGluZGV4XG4gICAgICB2YXIgX3dlaWdodCA9IHdlaWdodEZuKGVkZ2UpO1xuXG4gICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IHByb2Nlc3MgYW5vdGhlciBlZGdlIGJldHdlZW4gc2FtZSAyIG5vZGVzXG4gICAgICBpZiAoZGlzdFtzdF0gPiBfd2VpZ2h0KSB7XG4gICAgICAgIGRpc3Rbc3RdID0gX3dlaWdodDtcbiAgICAgICAgbmV4dFtzdF0gPSB0O1xuICAgICAgICBlZGdlTmV4dFtzdF0gPSBlZGdlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB1bmRpcmVjdGVkIGdyYXBoLCBwcm9jZXNzICdyZXZlcnNlZCcgZWRnZVxuICAgICAgaWYgKCFkaXJlY3RlZCkge1xuICAgICAgICB2YXIgdHMgPSB0ICogTiArIHM7IC8vIHRhcmdldCB0byBzb3VyY2UgaW5kZXhcblxuICAgICAgICBpZiAoIWRpcmVjdGVkICYmIGRpc3RbdHNdID4gX3dlaWdodCkge1xuICAgICAgICAgIGRpc3RbdHNdID0gX3dlaWdodDtcbiAgICAgICAgICBuZXh0W3RzXSA9IHM7XG4gICAgICAgICAgZWRnZU5leHRbdHNdID0gZWRnZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1haW4gbG9vcFxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgTjsgaysrKSB7XG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBOOyBfaTIrKykge1xuICAgICAgICB2YXIgaWsgPSBfaTIgKiBOICsgaztcbiAgICAgICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IE47IF9qKyspIHtcbiAgICAgICAgICB2YXIgaWogPSBfaTIgKiBOICsgX2o7XG4gICAgICAgICAgdmFyIGtqID0gayAqIE4gKyBfajtcbiAgICAgICAgICBpZiAoZGlzdFtpa10gKyBkaXN0W2tqXSA8IGRpc3RbaWpdKSB7XG4gICAgICAgICAgICBkaXN0W2lqXSA9IGRpc3RbaWtdICsgZGlzdFtral07XG4gICAgICAgICAgICBuZXh0W2lqXSA9IG5leHRbaWtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB2YXIgZ2V0QXJnRWxlID0gZnVuY3Rpb24gZ2V0QXJnRWxlKGVsZSkge1xuICAgICAgcmV0dXJuIChzdHJpbmcoZWxlKSA/IGN5LmZpbHRlcihlbGUpIDogZWxlKVswXTtcbiAgICB9O1xuICAgIHZhciBpbmRleE9mQXJnRWxlID0gZnVuY3Rpb24gaW5kZXhPZkFyZ0VsZShlbGUpIHtcbiAgICAgIHJldHVybiBpbmRleE9mKGdldEFyZ0VsZShlbGUpKTtcbiAgICB9O1xuICAgIHZhciByZXMgPSB7XG4gICAgICBkaXN0YW5jZTogZnVuY3Rpb24gZGlzdGFuY2UoZnJvbSwgdG8pIHtcbiAgICAgICAgdmFyIGkgPSBpbmRleE9mQXJnRWxlKGZyb20pO1xuICAgICAgICB2YXIgaiA9IGluZGV4T2ZBcmdFbGUodG8pO1xuICAgICAgICByZXR1cm4gZGlzdFtpICogTiArIGpdO1xuICAgICAgfSxcbiAgICAgIHBhdGg6IGZ1bmN0aW9uIHBhdGgoZnJvbSwgdG8pIHtcbiAgICAgICAgdmFyIGkgPSBpbmRleE9mQXJnRWxlKGZyb20pO1xuICAgICAgICB2YXIgaiA9IGluZGV4T2ZBcmdFbGUodG8pO1xuICAgICAgICB2YXIgZnJvbU5vZGUgPSBhdEluZGV4KGkpO1xuICAgICAgICBpZiAoaSA9PT0gaikge1xuICAgICAgICAgIHJldHVybiBmcm9tTm9kZS5jb2xsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5leHRbaSAqIE4gKyBqXSA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGF0aCA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgICAgdmFyIHByZXYgPSBpO1xuICAgICAgICB2YXIgZWRnZTtcbiAgICAgICAgcGF0aC5tZXJnZShmcm9tTm9kZSk7XG4gICAgICAgIHdoaWxlIChpICE9PSBqKSB7XG4gICAgICAgICAgcHJldiA9IGk7XG4gICAgICAgICAgaSA9IG5leHRbaSAqIE4gKyBqXTtcbiAgICAgICAgICBlZGdlID0gZWRnZU5leHRbcHJldiAqIE4gKyBpXTtcbiAgICAgICAgICBwYXRoLm1lcmdlKGVkZ2UpO1xuICAgICAgICAgIHBhdGgubWVyZ2UoYXRJbmRleChpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gcmVzO1xuICB9IC8vIGZsb3lkV2Fyc2hhbGxcbn07IC8vIGVsZXNmblxuXG52YXIgYmVsbG1hbkZvcmREZWZhdWx0cyA9IGRlZmF1bHRzJGcoe1xuICB3ZWlnaHQ6IGZ1bmN0aW9uIHdlaWdodChlZGdlKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0sXG4gIGRpcmVjdGVkOiBmYWxzZSxcbiAgcm9vdDogbnVsbFxufSk7XG52YXIgZWxlc2ZuJHEgPSB7XG4gIC8vIEltcGxlbWVudGVkIGZyb20gcHNldWRvY29kZSBmcm9tIHdpa2lwZWRpYVxuICBiZWxsbWFuRm9yZDogZnVuY3Rpb24gYmVsbG1hbkZvcmQob3B0aW9ucykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyIF9iZWxsbWFuRm9yZERlZmF1bHRzID0gYmVsbG1hbkZvcmREZWZhdWx0cyhvcHRpb25zKSxcbiAgICAgIHdlaWdodCA9IF9iZWxsbWFuRm9yZERlZmF1bHRzLndlaWdodCxcbiAgICAgIGRpcmVjdGVkID0gX2JlbGxtYW5Gb3JkRGVmYXVsdHMuZGlyZWN0ZWQsXG4gICAgICByb290ID0gX2JlbGxtYW5Gb3JkRGVmYXVsdHMucm9vdDtcbiAgICB2YXIgd2VpZ2h0Rm4gPSB3ZWlnaHQ7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgX3RoaXMkYnlHcm91cCA9IHRoaXMuYnlHcm91cCgpLFxuICAgICAgZWRnZXMgPSBfdGhpcyRieUdyb3VwLmVkZ2VzLFxuICAgICAgbm9kZXMgPSBfdGhpcyRieUdyb3VwLm5vZGVzO1xuICAgIHZhciBudW1Ob2RlcyA9IG5vZGVzLmxlbmd0aDtcbiAgICB2YXIgaW5mb01hcCA9IG5ldyBNYXAkMSgpO1xuICAgIHZhciBoYXNOZWdhdGl2ZVdlaWdodEN5Y2xlID0gZmFsc2U7XG4gICAgdmFyIG5lZ2F0aXZlV2VpZ2h0Q3ljbGVzID0gW107XG4gICAgcm9vdCA9IGN5LmNvbGxlY3Rpb24ocm9vdClbMF07IC8vIGluIGNhc2Ugc2VsZWN0b3IgcGFzc2VkXG5cbiAgICBlZGdlcy51bm1lcmdlQnkoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgIHJldHVybiBlZGdlLmlzTG9vcCgpO1xuICAgIH0pO1xuICAgIHZhciBudW1FZGdlcyA9IGVkZ2VzLmxlbmd0aDtcbiAgICB2YXIgZ2V0SW5mbyA9IGZ1bmN0aW9uIGdldEluZm8obm9kZSkge1xuICAgICAgdmFyIG9iaiA9IGluZm9NYXAuZ2V0KG5vZGUuaWQoKSk7XG4gICAgICBpZiAoIW9iaikge1xuICAgICAgICBvYmogPSB7fTtcbiAgICAgICAgaW5mb01hcC5zZXQobm9kZS5pZCgpLCBvYmopO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9O1xuICAgIHZhciBnZXROb2RlRnJvbVRvID0gZnVuY3Rpb24gZ2V0Tm9kZUZyb21Ubyh0bykge1xuICAgICAgcmV0dXJuIChzdHJpbmcodG8pID8gY3kuJCh0bykgOiB0bylbMF07XG4gICAgfTtcbiAgICB2YXIgZGlzdGFuY2VUbyA9IGZ1bmN0aW9uIGRpc3RhbmNlVG8odG8pIHtcbiAgICAgIHJldHVybiBnZXRJbmZvKGdldE5vZGVGcm9tVG8odG8pKS5kaXN0O1xuICAgIH07XG4gICAgdmFyIHBhdGhUbyA9IGZ1bmN0aW9uIHBhdGhUbyh0bykge1xuICAgICAgdmFyIHRoaXNTdGFydCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogcm9vdDtcbiAgICAgIHZhciBlbmQgPSBnZXROb2RlRnJvbVRvKHRvKTtcbiAgICAgIHZhciBwYXRoID0gW107XG4gICAgICB2YXIgbm9kZSA9IGVuZDtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5zcGF3bigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfZ2V0SW5mbyA9IGdldEluZm8obm9kZSksXG4gICAgICAgICAgZWRnZSA9IF9nZXRJbmZvLmVkZ2UsXG4gICAgICAgICAgcHJlZCA9IF9nZXRJbmZvLnByZWQ7XG4gICAgICAgIHBhdGgudW5zaGlmdChub2RlWzBdKTtcbiAgICAgICAgaWYgKG5vZGUuc2FtZSh0aGlzU3RhcnQpICYmIHBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlZGdlICE9IG51bGwpIHtcbiAgICAgICAgICBwYXRoLnVuc2hpZnQoZWRnZSk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IHByZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlcy5zcGF3bihwYXRoKTtcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6YXRpb25zIHsgZGlzdCwgcHJlZCwgZWRnZSB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1Ob2RlczsgaSsrKSB7XG4gICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgdmFyIGluZm8gPSBnZXRJbmZvKG5vZGUpO1xuICAgICAgaWYgKG5vZGUuc2FtZShyb290KSkge1xuICAgICAgICBpbmZvLmRpc3QgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5mby5kaXN0ID0gSW5maW5pdHk7XG4gICAgICB9XG4gICAgICBpbmZvLnByZWQgPSBudWxsO1xuICAgICAgaW5mby5lZGdlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBFZGdlcyByZWxheGF0aW9uXG4gICAgdmFyIHJlcGxhY2VkRWRnZSA9IGZhbHNlO1xuICAgIHZhciBjaGVja0ZvckVkZ2VSZXBsYWNlbWVudCA9IGZ1bmN0aW9uIGNoZWNrRm9yRWRnZVJlcGxhY2VtZW50KG5vZGUxLCBub2RlMiwgZWRnZSwgaW5mbzEsIGluZm8yLCB3ZWlnaHQpIHtcbiAgICAgIHZhciBkaXN0ID0gaW5mbzEuZGlzdCArIHdlaWdodDtcbiAgICAgIGlmIChkaXN0IDwgaW5mbzIuZGlzdCAmJiAhZWRnZS5zYW1lKGluZm8xLmVkZ2UpKSB7XG4gICAgICAgIGluZm8yLmRpc3QgPSBkaXN0O1xuICAgICAgICBpbmZvMi5wcmVkID0gbm9kZTE7XG4gICAgICAgIGluZm8yLmVkZ2UgPSBlZGdlO1xuICAgICAgICByZXBsYWNlZEVkZ2UgPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG4gICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IG51bU5vZGVzOyBfaSsrKSB7XG4gICAgICByZXBsYWNlZEVkZ2UgPSBmYWxzZTtcbiAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgbnVtRWRnZXM7IGUrKykge1xuICAgICAgICB2YXIgZWRnZSA9IGVkZ2VzW2VdO1xuICAgICAgICB2YXIgc3JjID0gZWRnZS5zb3VyY2UoKTtcbiAgICAgICAgdmFyIHRndCA9IGVkZ2UudGFyZ2V0KCk7XG4gICAgICAgIHZhciBfd2VpZ2h0ID0gd2VpZ2h0Rm4oZWRnZSk7XG4gICAgICAgIHZhciBzcmNJbmZvID0gZ2V0SW5mbyhzcmMpO1xuICAgICAgICB2YXIgdGd0SW5mbyA9IGdldEluZm8odGd0KTtcbiAgICAgICAgY2hlY2tGb3JFZGdlUmVwbGFjZW1lbnQoc3JjLCB0Z3QsIGVkZ2UsIHNyY0luZm8sIHRndEluZm8sIF93ZWlnaHQpO1xuXG4gICAgICAgIC8vIElmIHVuZGlyZWN0ZWQgZ3JhcGgsIHdlIG5lZWQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlICdyZXZlcnNlJyBlZGdlXG4gICAgICAgIGlmICghZGlyZWN0ZWQpIHtcbiAgICAgICAgICBjaGVja0ZvckVkZ2VSZXBsYWNlbWVudCh0Z3QsIHNyYywgZWRnZSwgdGd0SW5mbywgc3JjSW5mbywgX3dlaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghcmVwbGFjZWRFZGdlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVwbGFjZWRFZGdlKSB7XG4gICAgICAvLyBDaGVjayBmb3IgbmVnYXRpdmUgd2VpZ2h0IGN5Y2xlc1xuICAgICAgdmFyIG5lZ2F0aXZlV2VpZ2h0Q3ljbGVJZHMgPSBbXTtcbiAgICAgIGZvciAodmFyIF9lID0gMDsgX2UgPCBudW1FZGdlczsgX2UrKykge1xuICAgICAgICB2YXIgX2VkZ2UgPSBlZGdlc1tfZV07XG4gICAgICAgIHZhciBfc3JjID0gX2VkZ2Uuc291cmNlKCk7XG4gICAgICAgIHZhciBfdGd0ID0gX2VkZ2UudGFyZ2V0KCk7XG4gICAgICAgIHZhciBfd2VpZ2h0MiA9IHdlaWdodEZuKF9lZGdlKTtcbiAgICAgICAgdmFyIHNyY0Rpc3QgPSBnZXRJbmZvKF9zcmMpLmRpc3Q7XG4gICAgICAgIHZhciB0Z3REaXN0ID0gZ2V0SW5mbyhfdGd0KS5kaXN0O1xuICAgICAgICBpZiAoc3JjRGlzdCArIF93ZWlnaHQyIDwgdGd0RGlzdCB8fCAhZGlyZWN0ZWQgJiYgdGd0RGlzdCArIF93ZWlnaHQyIDwgc3JjRGlzdCkge1xuICAgICAgICAgIGlmICghaGFzTmVnYXRpdmVXZWlnaHRDeWNsZSkge1xuICAgICAgICAgICAgd2FybignR3JhcGggY29udGFpbnMgYSBuZWdhdGl2ZSB3ZWlnaHQgY3ljbGUgZm9yIEJlbGxtYW4tRm9yZCcpO1xuICAgICAgICAgICAgaGFzTmVnYXRpdmVXZWlnaHRDeWNsZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvcHRpb25zLmZpbmROZWdhdGl2ZVdlaWdodEN5Y2xlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHZhciBuZWdhdGl2ZU5vZGVzID0gW107XG4gICAgICAgICAgICBpZiAoc3JjRGlzdCArIF93ZWlnaHQyIDwgdGd0RGlzdCkge1xuICAgICAgICAgICAgICBuZWdhdGl2ZU5vZGVzLnB1c2goX3NyYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRpcmVjdGVkICYmIHRndERpc3QgKyBfd2VpZ2h0MiA8IHNyY0Rpc3QpIHtcbiAgICAgICAgICAgICAgbmVnYXRpdmVOb2Rlcy5wdXNoKF90Z3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG51bU5lZ2F0aXZlTm9kZXMgPSBuZWdhdGl2ZU5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgbnVtTmVnYXRpdmVOb2RlczsgbisrKSB7XG4gICAgICAgICAgICAgIHZhciBzdGFydCA9IG5lZ2F0aXZlTm9kZXNbbl07XG4gICAgICAgICAgICAgIHZhciBjeWNsZSA9IFtzdGFydF07XG4gICAgICAgICAgICAgIGN5Y2xlLnB1c2goZ2V0SW5mbyhzdGFydCkuZWRnZSk7XG4gICAgICAgICAgICAgIHZhciBfbm9kZSA9IGdldEluZm8oc3RhcnQpLnByZWQ7XG4gICAgICAgICAgICAgIHdoaWxlIChjeWNsZS5pbmRleE9mKF9ub2RlKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjeWNsZS5wdXNoKF9ub2RlKTtcbiAgICAgICAgICAgICAgICBjeWNsZS5wdXNoKGdldEluZm8oX25vZGUpLmVkZ2UpO1xuICAgICAgICAgICAgICAgIF9ub2RlID0gZ2V0SW5mbyhfbm9kZSkucHJlZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjeWNsZSA9IGN5Y2xlLnNsaWNlKGN5Y2xlLmluZGV4T2YoX25vZGUpKTtcbiAgICAgICAgICAgICAgdmFyIHNtYWxsZXN0SWQgPSBjeWNsZVswXS5pZCgpO1xuICAgICAgICAgICAgICB2YXIgc21hbGxlc3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgIGZvciAodmFyIGMgPSAyOyBjIDwgY3ljbGUubGVuZ3RoOyBjICs9IDIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3ljbGVbY10uaWQoKSA8IHNtYWxsZXN0SWQpIHtcbiAgICAgICAgICAgICAgICAgIHNtYWxsZXN0SWQgPSBjeWNsZVtjXS5pZCgpO1xuICAgICAgICAgICAgICAgICAgc21hbGxlc3RJbmRleCA9IGM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGN5Y2xlID0gY3ljbGUuc2xpY2Uoc21hbGxlc3RJbmRleCkuY29uY2F0KGN5Y2xlLnNsaWNlKDAsIHNtYWxsZXN0SW5kZXgpKTtcbiAgICAgICAgICAgICAgY3ljbGUucHVzaChjeWNsZVswXSk7XG4gICAgICAgICAgICAgIHZhciBjeWNsZUlkID0gY3ljbGUubWFwKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbC5pZCgpO1xuICAgICAgICAgICAgICB9KS5qb2luKFwiLFwiKTtcbiAgICAgICAgICAgICAgaWYgKG5lZ2F0aXZlV2VpZ2h0Q3ljbGVJZHMuaW5kZXhPZihjeWNsZUlkKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBuZWdhdGl2ZVdlaWdodEN5Y2xlcy5wdXNoKGVsZXMuc3Bhd24oY3ljbGUpKTtcbiAgICAgICAgICAgICAgICBuZWdhdGl2ZVdlaWdodEN5Y2xlSWRzLnB1c2goY3ljbGVJZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBkaXN0YW5jZVRvOiBkaXN0YW5jZVRvLFxuICAgICAgcGF0aFRvOiBwYXRoVG8sXG4gICAgICBoYXNOZWdhdGl2ZVdlaWdodEN5Y2xlOiBoYXNOZWdhdGl2ZVdlaWdodEN5Y2xlLFxuICAgICAgbmVnYXRpdmVXZWlnaHRDeWNsZXM6IG5lZ2F0aXZlV2VpZ2h0Q3ljbGVzXG4gICAgfTtcbiAgfSAvLyBiZWxsbWFuRm9yZFxufTsgLy8gZWxlc2ZuXG5cbnZhciBzcXJ0MiA9IE1hdGguc3FydCgyKTtcblxuLy8gRnVuY3Rpb24gd2hpY2ggY29sYXBzZXMgMiAobWV0YSkgbm9kZXMgaW50byBvbmVcbi8vIFVwZGF0ZXMgdGhlIHJlbWFpbmluZyBlZGdlIGxpc3RzXG4vLyBSZWNlaXZlcyBhcyBhIHBhcmFtYXRlciB0aGUgZWRnZSB3aGljaCBjYXVzZXMgdGhlIGNvbGxhcHNlXG52YXIgY29sbGFwc2UgPSBmdW5jdGlvbiBjb2xsYXBzZShlZGdlSW5kZXgsIG5vZGVNYXAsIHJlbWFpbmluZ0VkZ2VzKSB7XG4gIGlmIChyZW1haW5pbmdFZGdlcy5sZW5ndGggPT09IDApIHtcbiAgICBlcnJvcihcIkthcmdlci1TdGVpbiBtdXN0IGJlIHJ1biBvbiBhIGNvbm5lY3RlZCAoc3ViKWdyYXBoXCIpO1xuICB9XG4gIHZhciBlZGdlSW5mbyA9IHJlbWFpbmluZ0VkZ2VzW2VkZ2VJbmRleF07XG4gIHZhciBzb3VyY2VJbiA9IGVkZ2VJbmZvWzFdO1xuICB2YXIgdGFyZ2V0SW4gPSBlZGdlSW5mb1syXTtcbiAgdmFyIHBhcnRpdGlvbjEgPSBub2RlTWFwW3NvdXJjZUluXTtcbiAgdmFyIHBhcnRpdGlvbjIgPSBub2RlTWFwW3RhcmdldEluXTtcbiAgdmFyIG5ld0VkZ2VzID0gcmVtYWluaW5nRWRnZXM7IC8vIHJlLXVzZSBhcnJheVxuXG4gIC8vIERlbGV0ZSBhbGwgZWRnZXMgYmV0d2VlbiBwYXJ0aXRpb24xIGFuZCBwYXJ0aXRpb24yXG4gIGZvciAodmFyIGkgPSBuZXdFZGdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBlZGdlID0gbmV3RWRnZXNbaV07XG4gICAgdmFyIHNyYyA9IGVkZ2VbMV07XG4gICAgdmFyIHRndCA9IGVkZ2VbMl07XG4gICAgaWYgKG5vZGVNYXBbc3JjXSA9PT0gcGFydGl0aW9uMSAmJiBub2RlTWFwW3RndF0gPT09IHBhcnRpdGlvbjIgfHwgbm9kZU1hcFtzcmNdID09PSBwYXJ0aXRpb24yICYmIG5vZGVNYXBbdGd0XSA9PT0gcGFydGl0aW9uMSkge1xuICAgICAgbmV3RWRnZXMuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFsbCBlZGdlcyBwb2ludGluZyB0byBwYXJ0aXRpb24yIHNob3VsZCBub3cgcG9pbnQgdG8gcGFydGl0aW9uMVxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbmV3RWRnZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIF9lZGdlID0gbmV3RWRnZXNbX2ldO1xuICAgIGlmIChfZWRnZVsxXSA9PT0gcGFydGl0aW9uMikge1xuICAgICAgLy8gQ2hlY2sgc291cmNlXG4gICAgICBuZXdFZGdlc1tfaV0gPSBfZWRnZS5zbGljZSgpOyAvLyBjb3B5XG4gICAgICBuZXdFZGdlc1tfaV1bMV0gPSBwYXJ0aXRpb24xO1xuICAgIH0gZWxzZSBpZiAoX2VkZ2VbMl0gPT09IHBhcnRpdGlvbjIpIHtcbiAgICAgIC8vIENoZWNrIHRhcmdldFxuICAgICAgbmV3RWRnZXNbX2ldID0gX2VkZ2Uuc2xpY2UoKTsgLy8gY29weVxuICAgICAgbmV3RWRnZXNbX2ldWzJdID0gcGFydGl0aW9uMTtcbiAgICB9XG4gIH1cblxuICAvLyBNb3ZlIGFsbCBub2RlcyBmcm9tIHBhcnRpdGlvbjIgdG8gcGFydGl0aW9uMVxuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBub2RlTWFwLmxlbmd0aDsgX2kyKyspIHtcbiAgICBpZiAobm9kZU1hcFtfaTJdID09PSBwYXJ0aXRpb24yKSB7XG4gICAgICBub2RlTWFwW19pMl0gPSBwYXJ0aXRpb24xO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3RWRnZXM7XG59O1xuXG4vLyBDb250cmFjdHMgYSBncmFwaCB1bnRpbCB3ZSByZWFjaCBhIGNlcnRhaW4gbnVtYmVyIG9mIG1ldGEgbm9kZXNcbnZhciBjb250cmFjdFVudGlsID0gZnVuY3Rpb24gY29udHJhY3RVbnRpbChtZXRhTm9kZU1hcCwgcmVtYWluaW5nRWRnZXMsIHNpemUsIHNpemVMaW1pdCkge1xuICB3aGlsZSAoc2l6ZSA+IHNpemVMaW1pdCkge1xuICAgIC8vIENob29zZSBhbiBlZGdlIHJhbmRvbWx5XG4gICAgdmFyIGVkZ2VJbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHJlbWFpbmluZ0VkZ2VzLmxlbmd0aCk7XG5cbiAgICAvLyBDb2xsYXBzZSBncmFwaCBiYXNlZCBvbiBlZGdlXG4gICAgcmVtYWluaW5nRWRnZXMgPSBjb2xsYXBzZShlZGdlSW5kZXgsIG1ldGFOb2RlTWFwLCByZW1haW5pbmdFZGdlcyk7XG4gICAgc2l6ZS0tO1xuICB9XG4gIHJldHVybiByZW1haW5pbmdFZGdlcztcbn07XG52YXIgZWxlc2ZuJHAgPSB7XG4gIC8vIENvbXB1dGVzIHRoZSBtaW5pbXVtIGN1dCBvZiBhbiB1bmRpcmVjdGVkIGdyYXBoXG4gIC8vIFJldHVybnMgdGhlIGNvcnJlY3QgYW5zd2VyIHdpdGggaGlnaCBwcm9iYWJpbGl0eVxuICBrYXJnZXJTdGVpbjogZnVuY3Rpb24ga2FyZ2VyU3RlaW4oKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICB2YXIgX3RoaXMkYnlHcm91cCA9IHRoaXMuYnlHcm91cCgpLFxuICAgICAgbm9kZXMgPSBfdGhpcyRieUdyb3VwLm5vZGVzLFxuICAgICAgZWRnZXMgPSBfdGhpcyRieUdyb3VwLmVkZ2VzO1xuICAgIGVkZ2VzLnVubWVyZ2VCeShmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgcmV0dXJuIGVkZ2UuaXNMb29wKCk7XG4gICAgfSk7XG4gICAgdmFyIG51bU5vZGVzID0gbm9kZXMubGVuZ3RoO1xuICAgIHZhciBudW1FZGdlcyA9IGVkZ2VzLmxlbmd0aDtcbiAgICB2YXIgbnVtSXRlciA9IE1hdGguY2VpbChNYXRoLnBvdyhNYXRoLmxvZyhudW1Ob2RlcykgLyBNYXRoLkxOMiwgMikpO1xuICAgIHZhciBzdG9wU2l6ZSA9IE1hdGguZmxvb3IobnVtTm9kZXMgLyBzcXJ0Mik7XG4gICAgaWYgKG51bU5vZGVzIDwgMikge1xuICAgICAgZXJyb3IoJ0F0IGxlYXN0IDIgbm9kZXMgYXJlIHJlcXVpcmVkIGZvciBLYXJnZXItU3RlaW4gYWxnb3JpdGhtJyk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIE5vdyBzdG9yZSBlZGdlIGRlc3RpbmF0aW9uIGFzIGluZGV4ZXNcbiAgICAvLyBGb3JtYXQgZm9yIGVhY2ggZWRnZSAoZWRnZSBpbmRleCwgc291cmNlIG5vZGUgaW5kZXgsIHRhcmdldCBub2RlIGluZGV4KVxuICAgIHZhciBlZGdlSW5kZXhlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtRWRnZXM7IGkrKykge1xuICAgICAgdmFyIGUgPSBlZGdlc1tpXTtcbiAgICAgIGVkZ2VJbmRleGVzLnB1c2goW2ksIG5vZGVzLmluZGV4T2YoZS5zb3VyY2UoKSksIG5vZGVzLmluZGV4T2YoZS50YXJnZXQoKSldKTtcbiAgICB9XG5cbiAgICAvLyBXZSB3aWxsIHN0b3JlIHRoZSBiZXN0IGN1dCBmb3VuZCBoZXJlXG4gICAgdmFyIG1pbkN1dFNpemUgPSBJbmZpbml0eTtcbiAgICB2YXIgbWluQ3V0RWRnZUluZGV4ZXMgPSBbXTtcbiAgICB2YXIgbWluQ3V0Tm9kZU1hcCA9IG5ldyBBcnJheShudW1Ob2Rlcyk7XG5cbiAgICAvLyBJbml0aWFsIG1ldGEgbm9kZSBwYXJ0aXRpb25cbiAgICB2YXIgbWV0YU5vZGVNYXAgPSBuZXcgQXJyYXkobnVtTm9kZXMpO1xuICAgIHZhciBtZXRhTm9kZU1hcDIgPSBuZXcgQXJyYXkobnVtTm9kZXMpO1xuICAgIHZhciBjb3B5Tm9kZXNNYXAgPSBmdW5jdGlvbiBjb3B5Tm9kZXNNYXAoZnJvbSwgdG8pIHtcbiAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IG51bU5vZGVzOyBfaTMrKykge1xuICAgICAgICB0b1tfaTNdID0gZnJvbVtfaTNdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBNYWluIGxvb3BcbiAgICBmb3IgKHZhciBpdGVyID0gMDsgaXRlciA8PSBudW1JdGVyOyBpdGVyKyspIHtcbiAgICAgIC8vIFJlc2V0IG1ldGEgbm9kZSBwYXJ0aXRpb25cbiAgICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG51bU5vZGVzOyBfaTQrKykge1xuICAgICAgICBtZXRhTm9kZU1hcFtfaTRdID0gX2k0O1xuICAgICAgfVxuXG4gICAgICAvLyBDb250cmFjdCB1bnRpbCBzdG9wIHBvaW50IChzdG9wU2l6ZSBub2RlcylcbiAgICAgIHZhciBlZGdlc1N0YXRlID0gY29udHJhY3RVbnRpbChtZXRhTm9kZU1hcCwgZWRnZUluZGV4ZXMuc2xpY2UoKSwgbnVtTm9kZXMsIHN0b3BTaXplKTtcbiAgICAgIHZhciBlZGdlc1N0YXRlMiA9IGVkZ2VzU3RhdGUuc2xpY2UoKTsgLy8gY29weVxuXG4gICAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBjb2xhcHNlZCBub2RlcyBzdGF0ZVxuICAgICAgY29weU5vZGVzTWFwKG1ldGFOb2RlTWFwLCBtZXRhTm9kZU1hcDIpO1xuXG4gICAgICAvLyBSdW4gMiBpdGVyYXRpb25zIHN0YXJ0aW5nIGluIHRoZSBzdG9wIHN0YXRlXG4gICAgICB2YXIgcmVzMSA9IGNvbnRyYWN0VW50aWwobWV0YU5vZGVNYXAsIGVkZ2VzU3RhdGUsIHN0b3BTaXplLCAyKTtcbiAgICAgIHZhciByZXMyID0gY29udHJhY3RVbnRpbChtZXRhTm9kZU1hcDIsIGVkZ2VzU3RhdGUyLCBzdG9wU2l6ZSwgMik7XG5cbiAgICAgIC8vIElzIGFueSBvZiB0aGUgMiByZXN1bHRzIHRoZSBiZXN0IGN1dCBzbyBmYXI/XG4gICAgICBpZiAocmVzMS5sZW5ndGggPD0gcmVzMi5sZW5ndGggJiYgcmVzMS5sZW5ndGggPCBtaW5DdXRTaXplKSB7XG4gICAgICAgIG1pbkN1dFNpemUgPSByZXMxLmxlbmd0aDtcbiAgICAgICAgbWluQ3V0RWRnZUluZGV4ZXMgPSByZXMxO1xuICAgICAgICBjb3B5Tm9kZXNNYXAobWV0YU5vZGVNYXAsIG1pbkN1dE5vZGVNYXApO1xuICAgICAgfSBlbHNlIGlmIChyZXMyLmxlbmd0aCA8PSByZXMxLmxlbmd0aCAmJiByZXMyLmxlbmd0aCA8IG1pbkN1dFNpemUpIHtcbiAgICAgICAgbWluQ3V0U2l6ZSA9IHJlczIubGVuZ3RoO1xuICAgICAgICBtaW5DdXRFZGdlSW5kZXhlcyA9IHJlczI7XG4gICAgICAgIGNvcHlOb2Rlc01hcChtZXRhTm9kZU1hcDIsIG1pbkN1dE5vZGVNYXApO1xuICAgICAgfVxuICAgIH0gLy8gZW5kIG9mIG1haW4gbG9vcFxuXG4gICAgLy8gQ29uc3RydWN0IHJlc3VsdFxuICAgIHZhciBjdXQgPSB0aGlzLnNwYXduKG1pbkN1dEVkZ2VJbmRleGVzLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIGVkZ2VzW2VbMF1dO1xuICAgIH0pKTtcbiAgICB2YXIgcGFydGl0aW9uMSA9IHRoaXMuc3Bhd24oKTtcbiAgICB2YXIgcGFydGl0aW9uMiA9IHRoaXMuc3Bhd24oKTtcblxuICAgIC8vIHRyYXZlcnNlIG1ldGFOb2RlTWFwIGZvciBiZXN0IGN1dFxuICAgIHZhciB3aXRuZXNzTm9kZVBhcnRpdGlvbiA9IG1pbkN1dE5vZGVNYXBbMF07XG4gICAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgbWluQ3V0Tm9kZU1hcC5sZW5ndGg7IF9pNSsrKSB7XG4gICAgICB2YXIgcGFydGl0aW9uSWQgPSBtaW5DdXROb2RlTWFwW19pNV07XG4gICAgICB2YXIgbm9kZSA9IG5vZGVzW19pNV07XG4gICAgICBpZiAocGFydGl0aW9uSWQgPT09IHdpdG5lc3NOb2RlUGFydGl0aW9uKSB7XG4gICAgICAgIHBhcnRpdGlvbjEubWVyZ2Uobm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0aXRpb24yLm1lcmdlKG5vZGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBjb21wb25lbnRzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkaXNqb2ludCBzdWJzZXQgb2Ygbm9kZXNcbiAgICB2YXIgY29uc3RydWN0Q29tcG9uZW50ID0gZnVuY3Rpb24gY29uc3RydWN0Q29tcG9uZW50KHN1YnNldCkge1xuICAgICAgdmFyIGNvbXBvbmVudCA9IF90aGlzLnNwYXduKCk7XG4gICAgICBzdWJzZXQuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBjb21wb25lbnQubWVyZ2Uobm9kZSk7XG4gICAgICAgIG5vZGUuY29ubmVjdGVkRWRnZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgICAgLy8gZW5zdXJlIGVkZ2UgaXMgd2l0aGluIGNhbGxpbmcgY29sbGVjdGlvbiBhbmQgZWRnZSBpcyBub3QgaW4gY3V0XG4gICAgICAgICAgaWYgKF90aGlzLmNvbnRhaW5zKGVkZ2UpICYmICFjdXQuY29udGFpbnMoZWRnZSkpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5tZXJnZShlZGdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH07XG4gICAgdmFyIGNvbXBvbmVudHMgPSBbY29uc3RydWN0Q29tcG9uZW50KHBhcnRpdGlvbjEpLCBjb25zdHJ1Y3RDb21wb25lbnQocGFydGl0aW9uMildO1xuICAgIHZhciByZXQgPSB7XG4gICAgICBjdXQ6IGN1dCxcbiAgICAgIGNvbXBvbmVudHM6IGNvbXBvbmVudHMsXG4gICAgICAvLyBuLmIuIHBhcnRpdGlvbnMgYXJlIGluY2x1ZGVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgb2xkIGFwaSBzcGVjXG4gICAgICAvLyAoY291bGQgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciB2ZXJzaW9uKVxuICAgICAgcGFydGl0aW9uMTogcGFydGl0aW9uMSxcbiAgICAgIHBhcnRpdGlvbjI6IHBhcnRpdGlvbjJcbiAgICB9O1xuICAgIHJldHVybiByZXQ7XG4gIH1cbn07IC8vIGVsZXNmblxuXG52YXIgY29weVBvc2l0aW9uID0gZnVuY3Rpb24gY29weVBvc2l0aW9uKHApIHtcbiAgcmV0dXJuIHtcbiAgICB4OiBwLngsXG4gICAgeTogcC55XG4gIH07XG59O1xudmFyIG1vZGVsVG9SZW5kZXJlZFBvc2l0aW9uID0gZnVuY3Rpb24gbW9kZWxUb1JlbmRlcmVkUG9zaXRpb24ocCwgem9vbSwgcGFuKSB7XG4gIHJldHVybiB7XG4gICAgeDogcC54ICogem9vbSArIHBhbi54LFxuICAgIHk6IHAueSAqIHpvb20gKyBwYW4ueVxuICB9O1xufTtcbnZhciByZW5kZXJlZFRvTW9kZWxQb3NpdGlvbiA9IGZ1bmN0aW9uIHJlbmRlcmVkVG9Nb2RlbFBvc2l0aW9uKHAsIHpvb20sIHBhbikge1xuICByZXR1cm4ge1xuICAgIHg6IChwLnggLSBwYW4ueCkgLyB6b29tLFxuICAgIHk6IChwLnkgLSBwYW4ueSkgLyB6b29tXG4gIH07XG59O1xudmFyIGFycmF5MnBvaW50ID0gZnVuY3Rpb24gYXJyYXkycG9pbnQoYXJyKSB7XG4gIHJldHVybiB7XG4gICAgeDogYXJyWzBdLFxuICAgIHk6IGFyclsxXVxuICB9O1xufTtcbnZhciBtaW4gPSBmdW5jdGlvbiBtaW4oYXJyKSB7XG4gIHZhciBiZWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgdmFyIGVuZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogYXJyLmxlbmd0aDtcbiAgdmFyIG1pbiA9IEluZmluaXR5O1xuICBmb3IgKHZhciBpID0gYmVnaW47IGkgPCBlbmQ7IGkrKykge1xuICAgIHZhciB2YWwgPSBhcnJbaV07XG4gICAgaWYgKGlzRmluaXRlKHZhbCkpIHtcbiAgICAgIG1pbiA9IE1hdGgubWluKHZhbCwgbWluKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1pbjtcbn07XG52YXIgbWF4ID0gZnVuY3Rpb24gbWF4KGFycikge1xuICB2YXIgYmVnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gIHZhciBlbmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGFyci5sZW5ndGg7XG4gIHZhciBtYXggPSAtSW5maW5pdHk7XG4gIGZvciAodmFyIGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7XG4gICAgdmFyIHZhbCA9IGFycltpXTtcbiAgICBpZiAoaXNGaW5pdGUodmFsKSkge1xuICAgICAgbWF4ID0gTWF0aC5tYXgodmFsLCBtYXgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWF4O1xufTtcbnZhciBtZWFuID0gZnVuY3Rpb24gbWVhbihhcnIpIHtcbiAgdmFyIGJlZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICB2YXIgZW5kID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBhcnIubGVuZ3RoO1xuICB2YXIgdG90YWwgPSAwO1xuICB2YXIgbiA9IDA7XG4gIGZvciAodmFyIGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7XG4gICAgdmFyIHZhbCA9IGFycltpXTtcbiAgICBpZiAoaXNGaW5pdGUodmFsKSkge1xuICAgICAgdG90YWwgKz0gdmFsO1xuICAgICAgbisrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdG90YWwgLyBuO1xufTtcbnZhciBtZWRpYW4gPSBmdW5jdGlvbiBtZWRpYW4oYXJyKSB7XG4gIHZhciBiZWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgdmFyIGVuZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogYXJyLmxlbmd0aDtcbiAgdmFyIGNvcHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHRydWU7XG4gIHZhciBzb3J0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB0cnVlO1xuICB2YXIgaW5jbHVkZUhvbGVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiB0cnVlO1xuICBpZiAoY29weSkge1xuICAgIGFyciA9IGFyci5zbGljZShiZWdpbiwgZW5kKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoZW5kIDwgYXJyLmxlbmd0aCkge1xuICAgICAgYXJyLnNwbGljZShlbmQsIGFyci5sZW5ndGggLSBlbmQpO1xuICAgIH1cbiAgICBpZiAoYmVnaW4gPiAwKSB7XG4gICAgICBhcnIuc3BsaWNlKDAsIGJlZ2luKTtcbiAgICB9XG4gIH1cblxuICAvLyBhbGwgbm9uIGZpbml0ZSAoZS5nLiBJbmZpbml0eSwgTmFOKSBlbGVtZW50cyBtdXN0IGJlIC1JbmZpbml0eSBzbyB0aGV5IGdvIHRvIHRoZSBzdGFydFxuICB2YXIgb2ZmID0gMDsgLy8gb2Zmc2V0IGZyb20gbm9uLWZpbml0ZSB2YWx1ZXNcbiAgZm9yICh2YXIgaSA9IGFyci5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciB2ID0gYXJyW2ldO1xuICAgIGlmIChpbmNsdWRlSG9sZXMpIHtcbiAgICAgIGlmICghaXNGaW5pdGUodikpIHtcbiAgICAgICAgYXJyW2ldID0gLUluZmluaXR5O1xuICAgICAgICBvZmYrKztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8ganVzdCByZW1vdmUgaXQgaWYgd2UgZG9uJ3Qgd2FudCB0byBjb25zaWRlciBob2xlc1xuICAgICAgYXJyLnNwbGljZShpLCAxKTtcbiAgICB9XG4gIH1cbiAgaWYgKHNvcnQpIHtcbiAgICBhcnIuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEgLSBiO1xuICAgIH0pOyAvLyByZXF1aXJlcyBjb3B5ID0gdHJ1ZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgdGhlIG9yaWdcbiAgfVxuXG4gIHZhciBsZW4gPSBhcnIubGVuZ3RoO1xuICB2YXIgbWlkID0gTWF0aC5mbG9vcihsZW4gLyAyKTtcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICByZXR1cm4gYXJyW21pZCArIDEgKyBvZmZdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAoYXJyW21pZCAtIDEgKyBvZmZdICsgYXJyW21pZCArIG9mZl0pIC8gMjtcbiAgfVxufTtcbnZhciBkZWcycmFkID0gZnVuY3Rpb24gZGVnMnJhZChkZWcpIHtcbiAgcmV0dXJuIE1hdGguUEkgKiBkZWcgLyAxODA7XG59O1xudmFyIGdldEFuZ2xlRnJvbURpc3AgPSBmdW5jdGlvbiBnZXRBbmdsZUZyb21EaXNwKGRpc3BYLCBkaXNwWSkge1xuICByZXR1cm4gTWF0aC5hdGFuMihkaXNwWSwgZGlzcFgpIC0gTWF0aC5QSSAvIDI7XG59O1xudmFyIGxvZzIgPSBNYXRoLmxvZzIgfHwgZnVuY3Rpb24gKG4pIHtcbiAgcmV0dXJuIE1hdGgubG9nKG4pIC8gTWF0aC5sb2coMik7XG59O1xudmFyIHNpZ251bSA9IGZ1bmN0aW9uIHNpZ251bSh4KSB7XG4gIGlmICh4ID4gMCkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2UgaWYgKHggPCAwKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAwO1xuICB9XG59O1xudmFyIGRpc3QgPSBmdW5jdGlvbiBkaXN0KHAxLCBwMikge1xuICByZXR1cm4gTWF0aC5zcXJ0KHNxZGlzdChwMSwgcDIpKTtcbn07XG52YXIgc3FkaXN0ID0gZnVuY3Rpb24gc3FkaXN0KHAxLCBwMikge1xuICB2YXIgZHggPSBwMi54IC0gcDEueDtcbiAgdmFyIGR5ID0gcDIueSAtIHAxLnk7XG4gIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbn07XG52YXIgaW5QbGFjZVN1bU5vcm1hbGl6ZSA9IGZ1bmN0aW9uIGluUGxhY2VTdW1Ob3JtYWxpemUodikge1xuICB2YXIgbGVuZ3RoID0gdi5sZW5ndGg7XG5cbiAgLy8gRmlyc3QsIGdldCBzdW0gb2YgYWxsIGVsZW1lbnRzXG4gIHZhciB0b3RhbCA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB0b3RhbCArPSB2W2ldO1xuICB9XG5cbiAgLy8gTm93LCBkaXZpZGUgZWFjaCBieSB0aGUgc3VtIG9mIGFsbCBlbGVtZW50c1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGVuZ3RoOyBfaSsrKSB7XG4gICAgdltfaV0gPSB2W19pXSAvIHRvdGFsO1xuICB9XG4gIHJldHVybiB2O1xufTtcblxuLy8gZnJvbSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0LDqXppZXJfY3VydmUjUXVhZHJhdGljX2N1cnZlc1xudmFyIHFiZXppZXJBdCA9IGZ1bmN0aW9uIHFiZXppZXJBdChwMCwgcDEsIHAyLCB0KSB7XG4gIHJldHVybiAoMSAtIHQpICogKDEgLSB0KSAqIHAwICsgMiAqICgxIC0gdCkgKiB0ICogcDEgKyB0ICogdCAqIHAyO1xufTtcbnZhciBxYmV6aWVyUHRBdCA9IGZ1bmN0aW9uIHFiZXppZXJQdEF0KHAwLCBwMSwgcDIsIHQpIHtcbiAgcmV0dXJuIHtcbiAgICB4OiBxYmV6aWVyQXQocDAueCwgcDEueCwgcDIueCwgdCksXG4gICAgeTogcWJlemllckF0KHAwLnksIHAxLnksIHAyLnksIHQpXG4gIH07XG59O1xudmFyIGxpbmVBdCA9IGZ1bmN0aW9uIGxpbmVBdChwMCwgcDEsIHQsIGQpIHtcbiAgdmFyIHZlYyA9IHtcbiAgICB4OiBwMS54IC0gcDAueCxcbiAgICB5OiBwMS55IC0gcDAueVxuICB9O1xuICB2YXIgdmVjRGlzdCA9IGRpc3QocDAsIHAxKTtcbiAgdmFyIG5vcm1WZWMgPSB7XG4gICAgeDogdmVjLnggLyB2ZWNEaXN0LFxuICAgIHk6IHZlYy55IC8gdmVjRGlzdFxuICB9O1xuICB0ID0gdCA9PSBudWxsID8gMCA6IHQ7XG4gIGQgPSBkICE9IG51bGwgPyBkIDogdCAqIHZlY0Rpc3Q7XG4gIHJldHVybiB7XG4gICAgeDogcDAueCArIG5vcm1WZWMueCAqIGQsXG4gICAgeTogcDAueSArIG5vcm1WZWMueSAqIGRcbiAgfTtcbn07XG52YXIgYm91bmQgPSBmdW5jdGlvbiBib3VuZChtaW4sIHZhbCwgbWF4KSB7XG4gIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgdmFsKSk7XG59O1xuXG4vLyBtYWtlcyBhIGZ1bGwgYmIgKHgxLCB5MSwgeDIsIHkyLCB3LCBoKSBmcm9tIGltcGxpY2l0IHBhcmFtc1xudmFyIG1ha2VCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIG1ha2VCb3VuZGluZ0JveChiYikge1xuICBpZiAoYmIgPT0gbnVsbCkge1xuICAgIHJldHVybiB7XG4gICAgICB4MTogSW5maW5pdHksXG4gICAgICB5MTogSW5maW5pdHksXG4gICAgICB4MjogLUluZmluaXR5LFxuICAgICAgeTI6IC1JbmZpbml0eSxcbiAgICAgIHc6IDAsXG4gICAgICBoOiAwXG4gICAgfTtcbiAgfSBlbHNlIGlmIChiYi54MSAhPSBudWxsICYmIGJiLnkxICE9IG51bGwpIHtcbiAgICBpZiAoYmIueDIgIT0gbnVsbCAmJiBiYi55MiAhPSBudWxsICYmIGJiLngyID49IGJiLngxICYmIGJiLnkyID49IGJiLnkxKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4MTogYmIueDEsXG4gICAgICAgIHkxOiBiYi55MSxcbiAgICAgICAgeDI6IGJiLngyLFxuICAgICAgICB5MjogYmIueTIsXG4gICAgICAgIHc6IGJiLngyIC0gYmIueDEsXG4gICAgICAgIGg6IGJiLnkyIC0gYmIueTFcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChiYi53ICE9IG51bGwgJiYgYmIuaCAhPSBudWxsICYmIGJiLncgPj0gMCAmJiBiYi5oID49IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHgxOiBiYi54MSxcbiAgICAgICAgeTE6IGJiLnkxLFxuICAgICAgICB4MjogYmIueDEgKyBiYi53LFxuICAgICAgICB5MjogYmIueTEgKyBiYi5oLFxuICAgICAgICB3OiBiYi53LFxuICAgICAgICBoOiBiYi5oXG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcbnZhciBjb3B5Qm91bmRpbmdCb3ggPSBmdW5jdGlvbiBjb3B5Qm91bmRpbmdCb3goYmIpIHtcbiAgcmV0dXJuIHtcbiAgICB4MTogYmIueDEsXG4gICAgeDI6IGJiLngyLFxuICAgIHc6IGJiLncsXG4gICAgeTE6IGJiLnkxLFxuICAgIHkyOiBiYi55MixcbiAgICBoOiBiYi5oXG4gIH07XG59O1xudmFyIGNsZWFyQm91bmRpbmdCb3ggPSBmdW5jdGlvbiBjbGVhckJvdW5kaW5nQm94KGJiKSB7XG4gIGJiLngxID0gSW5maW5pdHk7XG4gIGJiLnkxID0gSW5maW5pdHk7XG4gIGJiLngyID0gLUluZmluaXR5O1xuICBiYi55MiA9IC1JbmZpbml0eTtcbiAgYmIudyA9IDA7XG4gIGJiLmggPSAwO1xufTtcbnZhciB1cGRhdGVCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIHVwZGF0ZUJvdW5kaW5nQm94KGJiMSwgYmIyKSB7XG4gIC8vIHVwZGF0ZSBiYjEgd2l0aCBiYjIgYm91bmRzXG5cbiAgYmIxLngxID0gTWF0aC5taW4oYmIxLngxLCBiYjIueDEpO1xuICBiYjEueDIgPSBNYXRoLm1heChiYjEueDIsIGJiMi54Mik7XG4gIGJiMS53ID0gYmIxLngyIC0gYmIxLngxO1xuICBiYjEueTEgPSBNYXRoLm1pbihiYjEueTEsIGJiMi55MSk7XG4gIGJiMS55MiA9IE1hdGgubWF4KGJiMS55MiwgYmIyLnkyKTtcbiAgYmIxLmggPSBiYjEueTIgLSBiYjEueTE7XG59O1xudmFyIGV4cGFuZEJvdW5kaW5nQm94QnlQb2ludCA9IGZ1bmN0aW9uIGV4cGFuZEJvdW5kaW5nQm94QnlQb2ludChiYiwgeCwgeSkge1xuICBiYi54MSA9IE1hdGgubWluKGJiLngxLCB4KTtcbiAgYmIueDIgPSBNYXRoLm1heChiYi54MiwgeCk7XG4gIGJiLncgPSBiYi54MiAtIGJiLngxO1xuICBiYi55MSA9IE1hdGgubWluKGJiLnkxLCB5KTtcbiAgYmIueTIgPSBNYXRoLm1heChiYi55MiwgeSk7XG4gIGJiLmggPSBiYi55MiAtIGJiLnkxO1xufTtcbnZhciBleHBhbmRCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIGV4cGFuZEJvdW5kaW5nQm94KGJiKSB7XG4gIHZhciBwYWRkaW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICBiYi54MSAtPSBwYWRkaW5nO1xuICBiYi54MiArPSBwYWRkaW5nO1xuICBiYi55MSAtPSBwYWRkaW5nO1xuICBiYi55MiArPSBwYWRkaW5nO1xuICBiYi53ID0gYmIueDIgLSBiYi54MTtcbiAgYmIuaCA9IGJiLnkyIC0gYmIueTE7XG4gIHJldHVybiBiYjtcbn07XG52YXIgZXhwYW5kQm91bmRpbmdCb3hTaWRlcyA9IGZ1bmN0aW9uIGV4cGFuZEJvdW5kaW5nQm94U2lkZXMoYmIpIHtcbiAgdmFyIHBhZGRpbmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFswXTtcbiAgdmFyIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdDtcbiAgaWYgKHBhZGRpbmcubGVuZ3RoID09PSAxKSB7XG4gICAgdG9wID0gcmlnaHQgPSBib3R0b20gPSBsZWZ0ID0gcGFkZGluZ1swXTtcbiAgfSBlbHNlIGlmIChwYWRkaW5nLmxlbmd0aCA9PT0gMikge1xuICAgIHRvcCA9IGJvdHRvbSA9IHBhZGRpbmdbMF07XG4gICAgbGVmdCA9IHJpZ2h0ID0gcGFkZGluZ1sxXTtcbiAgfSBlbHNlIGlmIChwYWRkaW5nLmxlbmd0aCA9PT0gNCkge1xuICAgIHZhciBfcGFkZGluZyA9IF9zbGljZWRUb0FycmF5KHBhZGRpbmcsIDQpO1xuICAgIHRvcCA9IF9wYWRkaW5nWzBdO1xuICAgIHJpZ2h0ID0gX3BhZGRpbmdbMV07XG4gICAgYm90dG9tID0gX3BhZGRpbmdbMl07XG4gICAgbGVmdCA9IF9wYWRkaW5nWzNdO1xuICB9XG4gIGJiLngxIC09IGxlZnQ7XG4gIGJiLngyICs9IHJpZ2h0O1xuICBiYi55MSAtPSB0b3A7XG4gIGJiLnkyICs9IGJvdHRvbTtcbiAgYmIudyA9IGJiLngyIC0gYmIueDE7XG4gIGJiLmggPSBiYi55MiAtIGJiLnkxO1xuICByZXR1cm4gYmI7XG59O1xuXG4vLyBhc3NpZ24gdGhlIHZhbHVlcyBvZiBiYjIgaW50byBiYjFcbnZhciBhc3NpZ25Cb3VuZGluZ0JveCA9IGZ1bmN0aW9uIGFzc2lnbkJvdW5kaW5nQm94KGJiMSwgYmIyKSB7XG4gIGJiMS54MSA9IGJiMi54MTtcbiAgYmIxLnkxID0gYmIyLnkxO1xuICBiYjEueDIgPSBiYjIueDI7XG4gIGJiMS55MiA9IGJiMi55MjtcbiAgYmIxLncgPSBiYjEueDIgLSBiYjEueDE7XG4gIGJiMS5oID0gYmIxLnkyIC0gYmIxLnkxO1xufTtcbnZhciBib3VuZGluZ0JveGVzSW50ZXJzZWN0ID0gZnVuY3Rpb24gYm91bmRpbmdCb3hlc0ludGVyc2VjdChiYjEsIGJiMikge1xuICAvLyBjYXNlOiBvbmUgYmIgdG8gcmlnaHQgb2Ygb3RoZXJcbiAgaWYgKGJiMS54MSA+IGJiMi54Mikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoYmIyLngxID4gYmIxLngyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gY2FzZTogb25lIGJiIHRvIGxlZnQgb2Ygb3RoZXJcbiAgaWYgKGJiMS54MiA8IGJiMi54MSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoYmIyLngyIDwgYmIxLngxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gY2FzZTogb25lIGJiIGFib3ZlIG90aGVyXG4gIGlmIChiYjEueTIgPCBiYjIueTEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGJiMi55MiA8IGJiMS55MSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGNhc2U6IG9uZSBiYiBiZWxvdyBvdGhlclxuICBpZiAoYmIxLnkxID4gYmIyLnkyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChiYjIueTEgPiBiYjEueTIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBvdGhlcndpc2UsIG11c3QgaGF2ZSBzb21lIG92ZXJsYXBcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIGluQm91bmRpbmdCb3ggPSBmdW5jdGlvbiBpbkJvdW5kaW5nQm94KGJiLCB4LCB5KSB7XG4gIHJldHVybiBiYi54MSA8PSB4ICYmIHggPD0gYmIueDIgJiYgYmIueTEgPD0geSAmJiB5IDw9IGJiLnkyO1xufTtcbnZhciBwb2ludEluQm91bmRpbmdCb3ggPSBmdW5jdGlvbiBwb2ludEluQm91bmRpbmdCb3goYmIsIHB0KSB7XG4gIHJldHVybiBpbkJvdW5kaW5nQm94KGJiLCBwdC54LCBwdC55KTtcbn07XG52YXIgYm91bmRpbmdCb3hJbkJvdW5kaW5nQm94ID0gZnVuY3Rpb24gYm91bmRpbmdCb3hJbkJvdW5kaW5nQm94KGJiMSwgYmIyKSB7XG4gIHJldHVybiBpbkJvdW5kaW5nQm94KGJiMSwgYmIyLngxLCBiYjIueTEpICYmIGluQm91bmRpbmdCb3goYmIxLCBiYjIueDIsIGJiMi55Mik7XG59O1xudmFyIHJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSA9IGZ1bmN0aW9uIHJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSh4LCB5LCBub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmcpIHtcbiAgdmFyIGNvcm5lclJhZGl1cyA9IGdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICB2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG5cbiAgLy8gQ2hlY2sgaW50ZXJzZWN0aW9ucyB3aXRoIHN0cmFpZ2h0IGxpbmUgc2VnbWVudHNcbiAgdmFyIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnM7XG5cbiAgLy8gVG9wIHNlZ21lbnQsIGxlZnQgdG8gcmlnaHRcbiAge1xuICAgIHZhciB0b3BTdGFydFggPSBub2RlWCAtIGhhbGZXaWR0aCArIGNvcm5lclJhZGl1cyAtIHBhZGRpbmc7XG4gICAgdmFyIHRvcFN0YXJ0WSA9IG5vZGVZIC0gaGFsZkhlaWdodCAtIHBhZGRpbmc7XG4gICAgdmFyIHRvcEVuZFggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cyArIHBhZGRpbmc7XG4gICAgdmFyIHRvcEVuZFkgPSB0b3BTdGFydFk7XG4gICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IGZpbml0ZUxpbmVzSW50ZXJzZWN0KHgsIHksIG5vZGVYLCBub2RlWSwgdG9wU3RhcnRYLCB0b3BTdGFydFksIHRvcEVuZFgsIHRvcEVuZFksIGZhbHNlKTtcbiAgICBpZiAoc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucztcbiAgICB9XG4gIH1cblxuICAvLyBSaWdodCBzZWdtZW50LCB0b3AgdG8gYm90dG9tXG4gIHtcbiAgICB2YXIgcmlnaHRTdGFydFggPSBub2RlWCArIGhhbGZXaWR0aCArIHBhZGRpbmc7XG4gICAgdmFyIHJpZ2h0U3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyUmFkaXVzIC0gcGFkZGluZztcbiAgICB2YXIgcmlnaHRFbmRYID0gcmlnaHRTdGFydFg7XG4gICAgdmFyIHJpZ2h0RW5kWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1cyArIHBhZGRpbmc7XG4gICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IGZpbml0ZUxpbmVzSW50ZXJzZWN0KHgsIHksIG5vZGVYLCBub2RlWSwgcmlnaHRTdGFydFgsIHJpZ2h0U3RhcnRZLCByaWdodEVuZFgsIHJpZ2h0RW5kWSwgZmFsc2UpO1xuICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgIH1cbiAgfVxuXG4gIC8vIEJvdHRvbSBzZWdtZW50LCBsZWZ0IHRvIHJpZ2h0XG4gIHtcbiAgICB2YXIgYm90dG9tU3RhcnRYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXMgLSBwYWRkaW5nO1xuICAgIHZhciBib3R0b21TdGFydFkgPSBub2RlWSArIGhhbGZIZWlnaHQgKyBwYWRkaW5nO1xuICAgIHZhciBib3R0b21FbmRYID0gbm9kZVggKyBoYWxmV2lkdGggLSBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nO1xuICAgIHZhciBib3R0b21FbmRZID0gYm90dG9tU3RhcnRZO1xuICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBmaW5pdGVMaW5lc0ludGVyc2VjdCh4LCB5LCBub2RlWCwgbm9kZVksIGJvdHRvbVN0YXJ0WCwgYm90dG9tU3RhcnRZLCBib3R0b21FbmRYLCBib3R0b21FbmRZLCBmYWxzZSk7XG4gICAgaWYgKHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnM7XG4gICAgfVxuICB9XG5cbiAgLy8gTGVmdCBzZWdtZW50LCB0b3AgdG8gYm90dG9tXG4gIHtcbiAgICB2YXIgbGVmdFN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoIC0gcGFkZGluZztcbiAgICB2YXIgbGVmdFN0YXJ0WSA9IG5vZGVZIC0gaGFsZkhlaWdodCArIGNvcm5lclJhZGl1cyAtIHBhZGRpbmc7XG4gICAgdmFyIGxlZnRFbmRYID0gbGVmdFN0YXJ0WDtcbiAgICB2YXIgbGVmdEVuZFkgPSBub2RlWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nO1xuICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBmaW5pdGVMaW5lc0ludGVyc2VjdCh4LCB5LCBub2RlWCwgbm9kZVksIGxlZnRTdGFydFgsIGxlZnRTdGFydFksIGxlZnRFbmRYLCBsZWZ0RW5kWSwgZmFsc2UpO1xuICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGludGVyc2VjdGlvbnMgd2l0aCBhcmMgc2VnbWVudHNcbiAgdmFyIGFyY0ludGVyc2VjdGlvbnM7XG5cbiAgLy8gVG9wIExlZnRcbiAge1xuICAgIHZhciB0b3BMZWZ0Q2VudGVyWCA9IG5vZGVYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzO1xuICAgIHZhciB0b3BMZWZ0Q2VudGVyWSA9IG5vZGVZIC0gaGFsZkhlaWdodCArIGNvcm5lclJhZGl1cztcbiAgICBhcmNJbnRlcnNlY3Rpb25zID0gaW50ZXJzZWN0TGluZUNpcmNsZSh4LCB5LCBub2RlWCwgbm9kZVksIHRvcExlZnRDZW50ZXJYLCB0b3BMZWZ0Q2VudGVyWSwgY29ybmVyUmFkaXVzICsgcGFkZGluZyk7XG5cbiAgICAvLyBFbnN1cmUgdGhlIGludGVyc2VjdGlvbiBpcyBvbiB0aGUgZGVzaXJlZCBxdWFydGVyIG9mIHRoZSBjaXJjbGVcbiAgICBpZiAoYXJjSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwICYmIGFyY0ludGVyc2VjdGlvbnNbMF0gPD0gdG9wTGVmdENlbnRlclggJiYgYXJjSW50ZXJzZWN0aW9uc1sxXSA8PSB0b3BMZWZ0Q2VudGVyWSkge1xuICAgICAgcmV0dXJuIFthcmNJbnRlcnNlY3Rpb25zWzBdLCBhcmNJbnRlcnNlY3Rpb25zWzFdXTtcbiAgICB9XG4gIH1cblxuICAvLyBUb3AgUmlnaHRcbiAge1xuICAgIHZhciB0b3BSaWdodENlbnRlclggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cztcbiAgICB2YXIgdG9wUmlnaHRDZW50ZXJZID0gbm9kZVkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyUmFkaXVzO1xuICAgIGFyY0ludGVyc2VjdGlvbnMgPSBpbnRlcnNlY3RMaW5lQ2lyY2xlKHgsIHksIG5vZGVYLCBub2RlWSwgdG9wUmlnaHRDZW50ZXJYLCB0b3BSaWdodENlbnRlclksIGNvcm5lclJhZGl1cyArIHBhZGRpbmcpO1xuXG4gICAgLy8gRW5zdXJlIHRoZSBpbnRlcnNlY3Rpb24gaXMgb24gdGhlIGRlc2lyZWQgcXVhcnRlciBvZiB0aGUgY2lyY2xlXG4gICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMCAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdID49IHRvcFJpZ2h0Q2VudGVyWCAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdIDw9IHRvcFJpZ2h0Q2VudGVyWSkge1xuICAgICAgcmV0dXJuIFthcmNJbnRlcnNlY3Rpb25zWzBdLCBhcmNJbnRlcnNlY3Rpb25zWzFdXTtcbiAgICB9XG4gIH1cblxuICAvLyBCb3R0b20gUmlnaHRcbiAge1xuICAgIHZhciBib3R0b21SaWdodENlbnRlclggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cztcbiAgICB2YXIgYm90dG9tUmlnaHRDZW50ZXJZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzO1xuICAgIGFyY0ludGVyc2VjdGlvbnMgPSBpbnRlcnNlY3RMaW5lQ2lyY2xlKHgsIHksIG5vZGVYLCBub2RlWSwgYm90dG9tUmlnaHRDZW50ZXJYLCBib3R0b21SaWdodENlbnRlclksIGNvcm5lclJhZGl1cyArIHBhZGRpbmcpO1xuXG4gICAgLy8gRW5zdXJlIHRoZSBpbnRlcnNlY3Rpb24gaXMgb24gdGhlIGRlc2lyZWQgcXVhcnRlciBvZiB0aGUgY2lyY2xlXG4gICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMCAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdID49IGJvdHRvbVJpZ2h0Q2VudGVyWCAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdID49IGJvdHRvbVJpZ2h0Q2VudGVyWSkge1xuICAgICAgcmV0dXJuIFthcmNJbnRlcnNlY3Rpb25zWzBdLCBhcmNJbnRlcnNlY3Rpb25zWzFdXTtcbiAgICB9XG4gIH1cblxuICAvLyBCb3R0b20gTGVmdFxuICB7XG4gICAgdmFyIGJvdHRvbUxlZnRDZW50ZXJYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXM7XG4gICAgdmFyIGJvdHRvbUxlZnRDZW50ZXJZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzO1xuICAgIGFyY0ludGVyc2VjdGlvbnMgPSBpbnRlcnNlY3RMaW5lQ2lyY2xlKHgsIHksIG5vZGVYLCBub2RlWSwgYm90dG9tTGVmdENlbnRlclgsIGJvdHRvbUxlZnRDZW50ZXJZLCBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nKTtcblxuICAgIC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuICAgIGlmIChhcmNJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDAgJiYgYXJjSW50ZXJzZWN0aW9uc1swXSA8PSBib3R0b21MZWZ0Q2VudGVyWCAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdID49IGJvdHRvbUxlZnRDZW50ZXJZKSB7XG4gICAgICByZXR1cm4gW2FyY0ludGVyc2VjdGlvbnNbMF0sIGFyY0ludGVyc2VjdGlvbnNbMV1dO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107IC8vIGlmIG5vdGhpbmdcbn07XG5cbnZhciBpbkxpbmVWaWNpbml0eSA9IGZ1bmN0aW9uIGluTGluZVZpY2luaXR5KHgsIHksIGx4MSwgbHkxLCBseDIsIGx5MiwgdG9sZXJhbmNlKSB7XG4gIHZhciB0ID0gdG9sZXJhbmNlO1xuICB2YXIgeDEgPSBNYXRoLm1pbihseDEsIGx4Mik7XG4gIHZhciB4MiA9IE1hdGgubWF4KGx4MSwgbHgyKTtcbiAgdmFyIHkxID0gTWF0aC5taW4obHkxLCBseTIpO1xuICB2YXIgeTIgPSBNYXRoLm1heChseTEsIGx5Mik7XG4gIHJldHVybiB4MSAtIHQgPD0geCAmJiB4IDw9IHgyICsgdCAmJiB5MSAtIHQgPD0geSAmJiB5IDw9IHkyICsgdDtcbn07XG52YXIgaW5CZXppZXJWaWNpbml0eSA9IGZ1bmN0aW9uIGluQmV6aWVyVmljaW5pdHkoeCwgeSwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgdG9sZXJhbmNlKSB7XG4gIHZhciBiYiA9IHtcbiAgICB4MTogTWF0aC5taW4oeDEsIHgzLCB4MikgLSB0b2xlcmFuY2UsXG4gICAgeDI6IE1hdGgubWF4KHgxLCB4MywgeDIpICsgdG9sZXJhbmNlLFxuICAgIHkxOiBNYXRoLm1pbih5MSwgeTMsIHkyKSAtIHRvbGVyYW5jZSxcbiAgICB5MjogTWF0aC5tYXgoeTEsIHkzLCB5MikgKyB0b2xlcmFuY2VcbiAgfTtcblxuICAvLyBpZiBvdXRzaWRlIHRoZSByb3VnaCBib3VuZGluZyBib3ggZm9yIHRoZSBiZXppZXIsIHRoZW4gaXQgY2FuJ3QgYmUgYSBoaXRcbiAgaWYgKHggPCBiYi54MSB8fCB4ID4gYmIueDIgfHwgeSA8IGJiLnkxIHx8IHkgPiBiYi55Mikge1xuICAgIC8vIGNvbnNvbGUubG9nKCdiZXppZXIgb3V0IG9mIHJvdWdoIGJiJylcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2RvIG1vcmUgZXhwZW5zaXZlIGNoZWNrJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG52YXIgc29sdmVRdWFkcmF0aWMgPSBmdW5jdGlvbiBzb2x2ZVF1YWRyYXRpYyhhLCBiLCBjLCB2YWwpIHtcbiAgYyAtPSB2YWw7XG4gIHZhciByID0gYiAqIGIgLSA0ICogYSAqIGM7XG4gIGlmIChyIDwgMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgc3FydFIgPSBNYXRoLnNxcnQocik7XG4gIHZhciBkZW5vbSA9IDIgKiBhO1xuICB2YXIgcm9vdDEgPSAoLWIgKyBzcXJ0UikgLyBkZW5vbTtcbiAgdmFyIHJvb3QyID0gKC1iIC0gc3FydFIpIC8gZGVub207XG4gIHJldHVybiBbcm9vdDEsIHJvb3QyXTtcbn07XG52YXIgc29sdmVDdWJpYyA9IGZ1bmN0aW9uIHNvbHZlQ3ViaWMoYSwgYiwgYywgZCwgcmVzdWx0KSB7XG4gIC8vIFNvbHZlcyBhIGN1YmljIGZ1bmN0aW9uLCByZXR1cm5zIHJvb3QgaW4gZm9ybSBbcjEsIGkxLCByMiwgaTIsIHIzLCBpM10sIHdoZXJlXG4gIC8vIHIgaXMgdGhlIHJlYWwgY29tcG9uZW50LCBpIGlzIHRoZSBpbWFnaW5hcnkgY29tcG9uZW50XG5cbiAgLy8gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIENhcmRhbm8gbWV0aG9kIGZyb20gdGhlIHllYXIgMTU0NVxuICAvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N1YmljX2Z1bmN0aW9uI1RoZV9uYXR1cmVfb2ZfdGhlX3Jvb3RzXG5cbiAgdmFyIGVwc2lsb24gPSAwLjAwMDAxO1xuXG4gIC8vIGF2b2lkIGRpdmlzaW9uIGJ5IHplcm8gd2hpbGUga2VlcGluZyB0aGUgb3ZlcmFsbCBleHByZXNzaW9uIGNsb3NlIGluIHZhbHVlXG4gIGlmIChhID09PSAwKSB7XG4gICAgYSA9IGVwc2lsb247XG4gIH1cbiAgYiAvPSBhO1xuICBjIC89IGE7XG4gIGQgLz0gYTtcbiAgdmFyIGRpc2NyaW1pbmFudCwgcSwgciwgZHVtMSwgcywgdCwgdGVybTEsIHIxMztcbiAgcSA9ICgzLjAgKiBjIC0gYiAqIGIpIC8gOS4wO1xuICByID0gLSgyNy4wICogZCkgKyBiICogKDkuMCAqIGMgLSAyLjAgKiAoYiAqIGIpKTtcbiAgciAvPSA1NC4wO1xuICBkaXNjcmltaW5hbnQgPSBxICogcSAqIHEgKyByICogcjtcbiAgcmVzdWx0WzFdID0gMDtcbiAgdGVybTEgPSBiIC8gMy4wO1xuICBpZiAoZGlzY3JpbWluYW50ID4gMCkge1xuICAgIHMgPSByICsgTWF0aC5zcXJ0KGRpc2NyaW1pbmFudCk7XG4gICAgcyA9IHMgPCAwID8gLU1hdGgucG93KC1zLCAxLjAgLyAzLjApIDogTWF0aC5wb3cocywgMS4wIC8gMy4wKTtcbiAgICB0ID0gciAtIE1hdGguc3FydChkaXNjcmltaW5hbnQpO1xuICAgIHQgPSB0IDwgMCA/IC1NYXRoLnBvdygtdCwgMS4wIC8gMy4wKSA6IE1hdGgucG93KHQsIDEuMCAvIDMuMCk7XG4gICAgcmVzdWx0WzBdID0gLXRlcm0xICsgcyArIHQ7XG4gICAgdGVybTEgKz0gKHMgKyB0KSAvIDIuMDtcbiAgICByZXN1bHRbNF0gPSByZXN1bHRbMl0gPSAtdGVybTE7XG4gICAgdGVybTEgPSBNYXRoLnNxcnQoMy4wKSAqICgtdCArIHMpIC8gMjtcbiAgICByZXN1bHRbM10gPSB0ZXJtMTtcbiAgICByZXN1bHRbNV0gPSAtdGVybTE7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJlc3VsdFs1XSA9IHJlc3VsdFszXSA9IDA7XG4gIGlmIChkaXNjcmltaW5hbnQgPT09IDApIHtcbiAgICByMTMgPSByIDwgMCA/IC1NYXRoLnBvdygtciwgMS4wIC8gMy4wKSA6IE1hdGgucG93KHIsIDEuMCAvIDMuMCk7XG4gICAgcmVzdWx0WzBdID0gLXRlcm0xICsgMi4wICogcjEzO1xuICAgIHJlc3VsdFs0XSA9IHJlc3VsdFsyXSA9IC0ocjEzICsgdGVybTEpO1xuICAgIHJldHVybjtcbiAgfVxuICBxID0gLXE7XG4gIGR1bTEgPSBxICogcSAqIHE7XG4gIGR1bTEgPSBNYXRoLmFjb3MociAvIE1hdGguc3FydChkdW0xKSk7XG4gIHIxMyA9IDIuMCAqIE1hdGguc3FydChxKTtcbiAgcmVzdWx0WzBdID0gLXRlcm0xICsgcjEzICogTWF0aC5jb3MoZHVtMSAvIDMuMCk7XG4gIHJlc3VsdFsyXSA9IC10ZXJtMSArIHIxMyAqIE1hdGguY29zKChkdW0xICsgMi4wICogTWF0aC5QSSkgLyAzLjApO1xuICByZXN1bHRbNF0gPSAtdGVybTEgKyByMTMgKiBNYXRoLmNvcygoZHVtMSArIDQuMCAqIE1hdGguUEkpIC8gMy4wKTtcbiAgcmV0dXJuO1xufTtcbnZhciBzcWRpc3RUb1F1YWRyYXRpY0JlemllciA9IGZ1bmN0aW9uIHNxZGlzdFRvUXVhZHJhdGljQmV6aWVyKHgsIHksIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpIHtcbiAgLy8gRmluZCBtaW5pbXVtIGRpc3RhbmNlIGJ5IHVzaW5nIHRoZSBtaW5pbXVtIG9mIHRoZSBkaXN0YW5jZVxuICAvLyBmdW5jdGlvbiBiZXR3ZWVuIHRoZSBnaXZlbiBwb2ludCBhbmQgdGhlIGN1cnZlXG5cbiAgLy8gVGhpcyBnaXZlcyB0aGUgY29lZmZpY2llbnRzIG9mIHRoZSByZXN1bHRpbmcgY3ViaWMgZXF1YXRpb25cbiAgLy8gd2hvc2Ugcm9vdHMgdGVsbCB1cyB3aGVyZSBhIHBvc3NpYmxlIG1pbmltdW0gaXNcbiAgLy8gKENvZWZmaWNpZW50cyBhcmUgZGl2aWRlZCBieSA0KVxuXG4gIHZhciBhID0gMS4wICogeDEgKiB4MSAtIDQgKiB4MSAqIHgyICsgMiAqIHgxICogeDMgKyA0ICogeDIgKiB4MiAtIDQgKiB4MiAqIHgzICsgeDMgKiB4MyArIHkxICogeTEgLSA0ICogeTEgKiB5MiArIDIgKiB5MSAqIHkzICsgNCAqIHkyICogeTIgLSA0ICogeTIgKiB5MyArIHkzICogeTM7XG4gIHZhciBiID0gMS4wICogOSAqIHgxICogeDIgLSAzICogeDEgKiB4MSAtIDMgKiB4MSAqIHgzIC0gNiAqIHgyICogeDIgKyAzICogeDIgKiB4MyArIDkgKiB5MSAqIHkyIC0gMyAqIHkxICogeTEgLSAzICogeTEgKiB5MyAtIDYgKiB5MiAqIHkyICsgMyAqIHkyICogeTM7XG4gIHZhciBjID0gMS4wICogMyAqIHgxICogeDEgLSA2ICogeDEgKiB4MiArIHgxICogeDMgLSB4MSAqIHggKyAyICogeDIgKiB4MiArIDIgKiB4MiAqIHggLSB4MyAqIHggKyAzICogeTEgKiB5MSAtIDYgKiB5MSAqIHkyICsgeTEgKiB5MyAtIHkxICogeSArIDIgKiB5MiAqIHkyICsgMiAqIHkyICogeSAtIHkzICogeTtcbiAgdmFyIGQgPSAxLjAgKiB4MSAqIHgyIC0geDEgKiB4MSArIHgxICogeCAtIHgyICogeCArIHkxICogeTIgLSB5MSAqIHkxICsgeTEgKiB5IC0geTIgKiB5O1xuXG4gIC8vIGRlYnVnKFwiY29lZmZpY2llbnRzOiBcIiArIGEgLyBhICsgXCIsIFwiICsgYiAvIGEgKyBcIiwgXCIgKyBjIC8gYSArIFwiLCBcIiArIGQgLyBhKTtcblxuICB2YXIgcm9vdHMgPSBbXTtcblxuICAvLyBVc2UgdGhlIGN1YmljIHNvbHZpbmcgYWxnb3JpdGhtXG4gIHNvbHZlQ3ViaWMoYSwgYiwgYywgZCwgcm9vdHMpO1xuICB2YXIgemVyb1RocmVzaG9sZCA9IDAuMDAwMDAwMTtcbiAgdmFyIHBhcmFtcyA9IFtdO1xuICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgNjsgaW5kZXggKz0gMikge1xuICAgIGlmIChNYXRoLmFicyhyb290c1tpbmRleCArIDFdKSA8IHplcm9UaHJlc2hvbGQgJiYgcm9vdHNbaW5kZXhdID49IDAgJiYgcm9vdHNbaW5kZXhdIDw9IDEuMCkge1xuICAgICAgcGFyYW1zLnB1c2gocm9vdHNbaW5kZXhdKTtcbiAgICB9XG4gIH1cbiAgcGFyYW1zLnB1c2goMS4wKTtcbiAgcGFyYW1zLnB1c2goMC4wKTtcbiAgdmFyIG1pbkRpc3RhbmNlU3F1YXJlZCA9IC0xO1xuICB2YXIgY3VyWCwgY3VyWSwgZGlzdFNxdWFyZWQ7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgY3VyWCA9IE1hdGgucG93KDEuMCAtIHBhcmFtc1tpXSwgMi4wKSAqIHgxICsgMi4wICogKDEgLSBwYXJhbXNbaV0pICogcGFyYW1zW2ldICogeDIgKyBwYXJhbXNbaV0gKiBwYXJhbXNbaV0gKiB4MztcbiAgICBjdXJZID0gTWF0aC5wb3coMSAtIHBhcmFtc1tpXSwgMi4wKSAqIHkxICsgMiAqICgxLjAgLSBwYXJhbXNbaV0pICogcGFyYW1zW2ldICogeTIgKyBwYXJhbXNbaV0gKiBwYXJhbXNbaV0gKiB5MztcbiAgICBkaXN0U3F1YXJlZCA9IE1hdGgucG93KGN1clggLSB4LCAyKSArIE1hdGgucG93KGN1clkgLSB5LCAyKTtcbiAgICAvLyBkZWJ1ZygnZGlzdGFuY2UgZm9yIHBhcmFtICcgKyBwYXJhbXNbaV0gKyBcIjogXCIgKyBNYXRoLnNxcnQoZGlzdFNxdWFyZWQpKTtcbiAgICBpZiAobWluRGlzdGFuY2VTcXVhcmVkID49IDApIHtcbiAgICAgIGlmIChkaXN0U3F1YXJlZCA8IG1pbkRpc3RhbmNlU3F1YXJlZCkge1xuICAgICAgICBtaW5EaXN0YW5jZVNxdWFyZWQgPSBkaXN0U3F1YXJlZDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbWluRGlzdGFuY2VTcXVhcmVkID0gZGlzdFNxdWFyZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBtaW5EaXN0YW5jZVNxdWFyZWQ7XG59O1xudmFyIHNxZGlzdFRvRmluaXRlTGluZSA9IGZ1bmN0aW9uIHNxZGlzdFRvRmluaXRlTGluZSh4LCB5LCB4MSwgeTEsIHgyLCB5Mikge1xuICB2YXIgb2Zmc2V0ID0gW3ggLSB4MSwgeSAtIHkxXTtcbiAgdmFyIGxpbmUgPSBbeDIgLSB4MSwgeTIgLSB5MV07XG4gIHZhciBsaW5lU3EgPSBsaW5lWzBdICogbGluZVswXSArIGxpbmVbMV0gKiBsaW5lWzFdO1xuICB2YXIgaHlwU3EgPSBvZmZzZXRbMF0gKiBvZmZzZXRbMF0gKyBvZmZzZXRbMV0gKiBvZmZzZXRbMV07XG4gIHZhciBkb3RQcm9kdWN0ID0gb2Zmc2V0WzBdICogbGluZVswXSArIG9mZnNldFsxXSAqIGxpbmVbMV07XG4gIHZhciBhZGpTcSA9IGRvdFByb2R1Y3QgKiBkb3RQcm9kdWN0IC8gbGluZVNxO1xuICBpZiAoZG90UHJvZHVjdCA8IDApIHtcbiAgICByZXR1cm4gaHlwU3E7XG4gIH1cbiAgaWYgKGFkalNxID4gbGluZVNxKSB7XG4gICAgcmV0dXJuICh4IC0geDIpICogKHggLSB4MikgKyAoeSAtIHkyKSAqICh5IC0geTIpO1xuICB9XG4gIHJldHVybiBoeXBTcSAtIGFkalNxO1xufTtcbnZhciBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMgPSBmdW5jdGlvbiBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgcG9pbnRzKSB7XG4gIHZhciB4MSwgeTEsIHgyLCB5MjtcbiAgdmFyIHkzO1xuXG4gIC8vIEludGVyc2VjdCB3aXRoIHZlcnRpY2FsIGxpbmUgdGhyb3VnaCAoeCwgeSlcbiAgdmFyIHVwID0gMDtcbiAgLy8gbGV0IGRvd24gPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICB4MSA9IHBvaW50c1tpICogMl07XG4gICAgeTEgPSBwb2ludHNbaSAqIDIgKyAxXTtcbiAgICBpZiAoaSArIDEgPCBwb2ludHMubGVuZ3RoIC8gMikge1xuICAgICAgeDIgPSBwb2ludHNbKGkgKyAxKSAqIDJdO1xuICAgICAgeTIgPSBwb2ludHNbKGkgKyAxKSAqIDIgKyAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgeDIgPSBwb2ludHNbKGkgKyAxIC0gcG9pbnRzLmxlbmd0aCAvIDIpICogMl07XG4gICAgICB5MiA9IHBvaW50c1soaSArIDEgLSBwb2ludHMubGVuZ3RoIC8gMikgKiAyICsgMV07XG4gICAgfVxuICAgIGlmICh4MSA9PSB4ICYmIHgyID09IHgpIDsgZWxzZSBpZiAoeDEgPj0geCAmJiB4ID49IHgyIHx8IHgxIDw9IHggJiYgeCA8PSB4Mikge1xuICAgICAgeTMgPSAoeCAtIHgxKSAvICh4MiAtIHgxKSAqICh5MiAtIHkxKSArIHkxO1xuICAgICAgaWYgKHkzID4geSkge1xuICAgICAgICB1cCsrO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiggeTMgPCB5ICl7XG4gICAgICAvLyBkb3duKys7XG4gICAgICAvLyB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgfVxuICBpZiAodXAgJSAyID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xudmFyIHBvaW50SW5zaWRlUG9seWdvbiA9IGZ1bmN0aW9uIHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCBiYXNlUG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBkaXJlY3Rpb24sIHBhZGRpbmcpIHtcbiAgdmFyIHRyYW5zZm9ybWVkUG9pbnRzID0gbmV3IEFycmF5KGJhc2VQb2ludHMubGVuZ3RoKTtcblxuICAvLyBHaXZlcyBuZWdhdGl2ZSBhbmdsZVxuICB2YXIgYW5nbGU7XG4gIGlmIChkaXJlY3Rpb25bMF0gIT0gbnVsbCkge1xuICAgIGFuZ2xlID0gTWF0aC5hdGFuKGRpcmVjdGlvblsxXSAvIGRpcmVjdGlvblswXSk7XG4gICAgaWYgKGRpcmVjdGlvblswXSA8IDApIHtcbiAgICAgIGFuZ2xlID0gYW5nbGUgKyBNYXRoLlBJIC8gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgYW5nbGUgPSAtYW5nbGUgLSBNYXRoLlBJIC8gMjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYW5nbGUgPSBkaXJlY3Rpb247XG4gIH1cbiAgdmFyIGNvcyA9IE1hdGguY29zKC1hbmdsZSk7XG4gIHZhciBzaW4gPSBNYXRoLnNpbigtYW5nbGUpO1xuXG4gIC8vICAgIGNvbnNvbGUubG9nKFwiYmFzZTogXCIgKyBiYXNlUG9pbnRzKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFuc2Zvcm1lZFBvaW50cy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICB0cmFuc2Zvcm1lZFBvaW50c1tpICogMl0gPSB3aWR0aCAvIDIgKiAoYmFzZVBvaW50c1tpICogMl0gKiBjb3MgLSBiYXNlUG9pbnRzW2kgKiAyICsgMV0gKiBzaW4pO1xuICAgIHRyYW5zZm9ybWVkUG9pbnRzW2kgKiAyICsgMV0gPSBoZWlnaHQgLyAyICogKGJhc2VQb2ludHNbaSAqIDIgKyAxXSAqIGNvcyArIGJhc2VQb2ludHNbaSAqIDJdICogc2luKTtcbiAgICB0cmFuc2Zvcm1lZFBvaW50c1tpICogMl0gKz0gY2VudGVyWDtcbiAgICB0cmFuc2Zvcm1lZFBvaW50c1tpICogMiArIDFdICs9IGNlbnRlclk7XG4gIH1cbiAgdmFyIHBvaW50cztcbiAgaWYgKHBhZGRpbmcgPiAwKSB7XG4gICAgdmFyIGV4cGFuZGVkTGluZVNldCA9IGV4cGFuZFBvbHlnb24odHJhbnNmb3JtZWRQb2ludHMsIC1wYWRkaW5nKTtcbiAgICBwb2ludHMgPSBqb2luTGluZXMoZXhwYW5kZWRMaW5lU2V0KTtcbiAgfSBlbHNlIHtcbiAgICBwb2ludHMgPSB0cmFuc2Zvcm1lZFBvaW50cztcbiAgfVxuICByZXR1cm4gcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIHBvaW50cyk7XG59O1xudmFyIHBvaW50SW5zaWRlUm91bmRQb2x5Z29uID0gZnVuY3Rpb24gcG9pbnRJbnNpZGVSb3VuZFBvbHlnb24oeCwgeSwgYmFzZVBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCkge1xuICB2YXIgY3V0UG9seWdvblBvaW50cyA9IG5ldyBBcnJheShiYXNlUG9pbnRzLmxlbmd0aCk7XG4gIHZhciBoYWxmVyA9IHdpZHRoIC8gMjtcbiAgdmFyIGhhbGZIID0gaGVpZ2h0IC8gMjtcbiAgdmFyIGNvcm5lclJhZGl1cyA9IGdldFJvdW5kUG9seWdvblJhZGl1cyh3aWR0aCwgaGVpZ2h0KTtcbiAgdmFyIHNxdWFyZWRDb3JuZXJSYWRpdXMgPSBjb3JuZXJSYWRpdXMgKiBjb3JuZXJSYWRpdXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYmFzZVBvaW50cy5sZW5ndGggLyA0OyBpKyspIHtcbiAgICB2YXIgc291cmNlVXYgPSB2b2lkIDAsXG4gICAgICBkZXN0VXYgPSB2b2lkIDA7XG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIHNvdXJjZVV2ID0gYmFzZVBvaW50cy5sZW5ndGggLSAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2VVdiA9IGkgKiA0IC0gMjtcbiAgICB9XG4gICAgZGVzdFV2ID0gaSAqIDQgKyAyO1xuICAgIHZhciBweCA9IGNlbnRlclggKyBoYWxmVyAqIGJhc2VQb2ludHNbaSAqIDRdO1xuICAgIHZhciBweSA9IGNlbnRlclkgKyBoYWxmSCAqIGJhc2VQb2ludHNbaSAqIDQgKyAxXTtcbiAgICB2YXIgY29zVGhldGEgPSAtYmFzZVBvaW50c1tzb3VyY2VVdl0gKiBiYXNlUG9pbnRzW2Rlc3RVdl0gLSBiYXNlUG9pbnRzW3NvdXJjZVV2ICsgMV0gKiBiYXNlUG9pbnRzW2Rlc3RVdiArIDFdO1xuICAgIHZhciBvZmZzZXQgPSBjb3JuZXJSYWRpdXMgLyBNYXRoLnRhbihNYXRoLmFjb3MoY29zVGhldGEpIC8gMik7XG4gICAgdmFyIGNwMHggPSBweCAtIG9mZnNldCAqIGJhc2VQb2ludHNbc291cmNlVXZdO1xuICAgIHZhciBjcDB5ID0gcHkgLSBvZmZzZXQgKiBiYXNlUG9pbnRzW3NvdXJjZVV2ICsgMV07XG4gICAgdmFyIGNwMXggPSBweCArIG9mZnNldCAqIGJhc2VQb2ludHNbZGVzdFV2XTtcbiAgICB2YXIgY3AxeSA9IHB5ICsgb2Zmc2V0ICogYmFzZVBvaW50c1tkZXN0VXYgKyAxXTtcbiAgICBjdXRQb2x5Z29uUG9pbnRzW2kgKiA0XSA9IGNwMHg7XG4gICAgY3V0UG9seWdvblBvaW50c1tpICogNCArIDFdID0gY3AweTtcbiAgICBjdXRQb2x5Z29uUG9pbnRzW2kgKiA0ICsgMl0gPSBjcDF4O1xuICAgIGN1dFBvbHlnb25Qb2ludHNbaSAqIDQgKyAzXSA9IGNwMXk7XG4gICAgdmFyIG9ydGh4ID0gYmFzZVBvaW50c1tzb3VyY2VVdiArIDFdO1xuICAgIHZhciBvcnRoeSA9IC1iYXNlUG9pbnRzW3NvdXJjZVV2XTtcbiAgICB2YXIgY29zQWxwaGEgPSBvcnRoeCAqIGJhc2VQb2ludHNbZGVzdFV2XSArIG9ydGh5ICogYmFzZVBvaW50c1tkZXN0VXYgKyAxXTtcbiAgICBpZiAoY29zQWxwaGEgPCAwKSB7XG4gICAgICBvcnRoeCAqPSAtMTtcbiAgICAgIG9ydGh5ICo9IC0xO1xuICAgIH1cbiAgICB2YXIgY3ggPSBjcDB4ICsgb3J0aHggKiBjb3JuZXJSYWRpdXM7XG4gICAgdmFyIGN5ID0gY3AweSArIG9ydGh5ICogY29ybmVyUmFkaXVzO1xuICAgIHZhciBzcXVhcmVkRGlzdGFuY2UgPSBNYXRoLnBvdyhjeCAtIHgsIDIpICsgTWF0aC5wb3coY3kgLSB5LCAyKTtcbiAgICBpZiAoc3F1YXJlZERpc3RhbmNlIDw9IHNxdWFyZWRDb3JuZXJSYWRpdXMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIGN1dFBvbHlnb25Qb2ludHMpO1xufTtcbnZhciBqb2luTGluZXMgPSBmdW5jdGlvbiBqb2luTGluZXMobGluZVNldCkge1xuICB2YXIgdmVydGljZXMgPSBuZXcgQXJyYXkobGluZVNldC5sZW5ndGggLyAyKTtcbiAgdmFyIGN1cnJlbnRMaW5lU3RhcnRYLCBjdXJyZW50TGluZVN0YXJ0WSwgY3VycmVudExpbmVFbmRYLCBjdXJyZW50TGluZUVuZFk7XG4gIHZhciBuZXh0TGluZVN0YXJ0WCwgbmV4dExpbmVTdGFydFksIG5leHRMaW5lRW5kWCwgbmV4dExpbmVFbmRZO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVTZXQubGVuZ3RoIC8gNDsgaSsrKSB7XG4gICAgY3VycmVudExpbmVTdGFydFggPSBsaW5lU2V0W2kgKiA0XTtcbiAgICBjdXJyZW50TGluZVN0YXJ0WSA9IGxpbmVTZXRbaSAqIDQgKyAxXTtcbiAgICBjdXJyZW50TGluZUVuZFggPSBsaW5lU2V0W2kgKiA0ICsgMl07XG4gICAgY3VycmVudExpbmVFbmRZID0gbGluZVNldFtpICogNCArIDNdO1xuICAgIGlmIChpIDwgbGluZVNldC5sZW5ndGggLyA0IC0gMSkge1xuICAgICAgbmV4dExpbmVTdGFydFggPSBsaW5lU2V0WyhpICsgMSkgKiA0XTtcbiAgICAgIG5leHRMaW5lU3RhcnRZID0gbGluZVNldFsoaSArIDEpICogNCArIDFdO1xuICAgICAgbmV4dExpbmVFbmRYID0gbGluZVNldFsoaSArIDEpICogNCArIDJdO1xuICAgICAgbmV4dExpbmVFbmRZID0gbGluZVNldFsoaSArIDEpICogNCArIDNdO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0TGluZVN0YXJ0WCA9IGxpbmVTZXRbMF07XG4gICAgICBuZXh0TGluZVN0YXJ0WSA9IGxpbmVTZXRbMV07XG4gICAgICBuZXh0TGluZUVuZFggPSBsaW5lU2V0WzJdO1xuICAgICAgbmV4dExpbmVFbmRZID0gbGluZVNldFszXTtcbiAgICB9XG4gICAgdmFyIGludGVyc2VjdGlvbiA9IGZpbml0ZUxpbmVzSW50ZXJzZWN0KGN1cnJlbnRMaW5lU3RhcnRYLCBjdXJyZW50TGluZVN0YXJ0WSwgY3VycmVudExpbmVFbmRYLCBjdXJyZW50TGluZUVuZFksIG5leHRMaW5lU3RhcnRYLCBuZXh0TGluZVN0YXJ0WSwgbmV4dExpbmVFbmRYLCBuZXh0TGluZUVuZFksIHRydWUpO1xuICAgIHZlcnRpY2VzW2kgKiAyXSA9IGludGVyc2VjdGlvblswXTtcbiAgICB2ZXJ0aWNlc1tpICogMiArIDFdID0gaW50ZXJzZWN0aW9uWzFdO1xuICB9XG4gIHJldHVybiB2ZXJ0aWNlcztcbn07XG52YXIgZXhwYW5kUG9seWdvbiA9IGZ1bmN0aW9uIGV4cGFuZFBvbHlnb24ocG9pbnRzLCBwYWQpIHtcbiAgdmFyIGV4cGFuZGVkTGluZVNldCA9IG5ldyBBcnJheShwb2ludHMubGVuZ3RoICogMik7XG4gIHZhciBjdXJyZW50UG9pbnRYLCBjdXJyZW50UG9pbnRZLCBuZXh0UG9pbnRYLCBuZXh0UG9pbnRZO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICBjdXJyZW50UG9pbnRYID0gcG9pbnRzW2kgKiAyXTtcbiAgICBjdXJyZW50UG9pbnRZID0gcG9pbnRzW2kgKiAyICsgMV07XG4gICAgaWYgKGkgPCBwb2ludHMubGVuZ3RoIC8gMiAtIDEpIHtcbiAgICAgIG5leHRQb2ludFggPSBwb2ludHNbKGkgKyAxKSAqIDJdO1xuICAgICAgbmV4dFBvaW50WSA9IHBvaW50c1soaSArIDEpICogMiArIDFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0UG9pbnRYID0gcG9pbnRzWzBdO1xuICAgICAgbmV4dFBvaW50WSA9IHBvaW50c1sxXTtcbiAgICB9XG5cbiAgICAvLyBDdXJyZW50IGxpbmU6IFtjdXJyZW50UG9pbnRYLCBjdXJyZW50UG9pbnRZXSB0byBbbmV4dFBvaW50WCwgbmV4dFBvaW50WV1cblxuICAgIC8vIEFzc3VtZSBDQ1cgcG9seWdvbiB3aW5kaW5nXG5cbiAgICB2YXIgb2Zmc2V0WCA9IG5leHRQb2ludFkgLSBjdXJyZW50UG9pbnRZO1xuICAgIHZhciBvZmZzZXRZID0gLShuZXh0UG9pbnRYIC0gY3VycmVudFBvaW50WCk7XG5cbiAgICAvLyBOb3JtYWxpemVcbiAgICB2YXIgb2Zmc2V0TGVuZ3RoID0gTWF0aC5zcXJ0KG9mZnNldFggKiBvZmZzZXRYICsgb2Zmc2V0WSAqIG9mZnNldFkpO1xuICAgIHZhciBub3JtYWxpemVkT2Zmc2V0WCA9IG9mZnNldFggLyBvZmZzZXRMZW5ndGg7XG4gICAgdmFyIG5vcm1hbGl6ZWRPZmZzZXRZID0gb2Zmc2V0WSAvIG9mZnNldExlbmd0aDtcbiAgICBleHBhbmRlZExpbmVTZXRbaSAqIDRdID0gY3VycmVudFBvaW50WCArIG5vcm1hbGl6ZWRPZmZzZXRYICogcGFkO1xuICAgIGV4cGFuZGVkTGluZVNldFtpICogNCArIDFdID0gY3VycmVudFBvaW50WSArIG5vcm1hbGl6ZWRPZmZzZXRZICogcGFkO1xuICAgIGV4cGFuZGVkTGluZVNldFtpICogNCArIDJdID0gbmV4dFBvaW50WCArIG5vcm1hbGl6ZWRPZmZzZXRYICogcGFkO1xuICAgIGV4cGFuZGVkTGluZVNldFtpICogNCArIDNdID0gbmV4dFBvaW50WSArIG5vcm1hbGl6ZWRPZmZzZXRZICogcGFkO1xuICB9XG4gIHJldHVybiBleHBhbmRlZExpbmVTZXQ7XG59O1xudmFyIGludGVyc2VjdExpbmVFbGxpcHNlID0gZnVuY3Rpb24gaW50ZXJzZWN0TGluZUVsbGlwc2UoeCwgeSwgY2VudGVyWCwgY2VudGVyWSwgZWxsaXBzZVdyYWRpdXMsIGVsbGlwc2VIcmFkaXVzKSB7XG4gIHZhciBkaXNwWCA9IGNlbnRlclggLSB4O1xuICB2YXIgZGlzcFkgPSBjZW50ZXJZIC0geTtcbiAgZGlzcFggLz0gZWxsaXBzZVdyYWRpdXM7XG4gIGRpc3BZIC89IGVsbGlwc2VIcmFkaXVzO1xuICB2YXIgbGVuID0gTWF0aC5zcXJ0KGRpc3BYICogZGlzcFggKyBkaXNwWSAqIGRpc3BZKTtcbiAgdmFyIG5ld0xlbmd0aCA9IGxlbiAtIDE7XG4gIGlmIChuZXdMZW5ndGggPCAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciBsZW5Qcm9wb3J0aW9uID0gbmV3TGVuZ3RoIC8gbGVuO1xuICByZXR1cm4gWyhjZW50ZXJYIC0geCkgKiBsZW5Qcm9wb3J0aW9uICsgeCwgKGNlbnRlclkgLSB5KSAqIGxlblByb3BvcnRpb24gKyB5XTtcbn07XG52YXIgY2hlY2tJbkVsbGlwc2UgPSBmdW5jdGlvbiBjaGVja0luRWxsaXBzZSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZLCBwYWRkaW5nKSB7XG4gIHggLT0gY2VudGVyWDtcbiAgeSAtPSBjZW50ZXJZO1xuICB4IC89IHdpZHRoIC8gMiArIHBhZGRpbmc7XG4gIHkgLz0gaGVpZ2h0IC8gMiArIHBhZGRpbmc7XG4gIHJldHVybiB4ICogeCArIHkgKiB5IDw9IDE7XG59O1xuXG4vLyBSZXR1cm5zIGludGVyc2VjdGlvbnMgb2YgaW5jcmVhc2luZyBkaXN0YW5jZSBmcm9tIGxpbmUncyBzdGFydCBwb2ludFxudmFyIGludGVyc2VjdExpbmVDaXJjbGUgPSBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lQ2lyY2xlKHgxLCB5MSwgeDIsIHkyLCBjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXMpIHtcbiAgLy8gQ2FsY3VsYXRlIGQsIGRpcmVjdGlvbiB2ZWN0b3Igb2YgbGluZVxuICB2YXIgZCA9IFt4MiAtIHgxLCB5MiAtIHkxXTsgLy8gRGlyZWN0aW9uIHZlY3RvciBvZiBsaW5lXG4gIHZhciBmID0gW3gxIC0gY2VudGVyWCwgeTEgLSBjZW50ZXJZXTtcbiAgdmFyIGEgPSBkWzBdICogZFswXSArIGRbMV0gKiBkWzFdO1xuICB2YXIgYiA9IDIgKiAoZlswXSAqIGRbMF0gKyBmWzFdICogZFsxXSk7XG4gIHZhciBjID0gZlswXSAqIGZbMF0gKyBmWzFdICogZlsxXSAtIHJhZGl1cyAqIHJhZGl1cztcbiAgdmFyIGRpc2NyaW1pbmFudCA9IGIgKiBiIC0gNCAqIGEgKiBjO1xuICBpZiAoZGlzY3JpbWluYW50IDwgMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgdDEgPSAoLWIgKyBNYXRoLnNxcnQoZGlzY3JpbWluYW50KSkgLyAoMiAqIGEpO1xuICB2YXIgdDIgPSAoLWIgLSBNYXRoLnNxcnQoZGlzY3JpbWluYW50KSkgLyAoMiAqIGEpO1xuICB2YXIgdE1pbiA9IE1hdGgubWluKHQxLCB0Mik7XG4gIHZhciB0TWF4ID0gTWF0aC5tYXgodDEsIHQyKTtcbiAgdmFyIGluUmFuZ2VQYXJhbXMgPSBbXTtcbiAgaWYgKHRNaW4gPj0gMCAmJiB0TWluIDw9IDEpIHtcbiAgICBpblJhbmdlUGFyYW1zLnB1c2godE1pbik7XG4gIH1cbiAgaWYgKHRNYXggPj0gMCAmJiB0TWF4IDw9IDEpIHtcbiAgICBpblJhbmdlUGFyYW1zLnB1c2godE1heCk7XG4gIH1cbiAgaWYgKGluUmFuZ2VQYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciBuZWFySW50ZXJzZWN0aW9uWCA9IGluUmFuZ2VQYXJhbXNbMF0gKiBkWzBdICsgeDE7XG4gIHZhciBuZWFySW50ZXJzZWN0aW9uWSA9IGluUmFuZ2VQYXJhbXNbMF0gKiBkWzFdICsgeTE7XG4gIGlmIChpblJhbmdlUGFyYW1zLmxlbmd0aCA+IDEpIHtcbiAgICBpZiAoaW5SYW5nZVBhcmFtc1swXSA9PSBpblJhbmdlUGFyYW1zWzFdKSB7XG4gICAgICByZXR1cm4gW25lYXJJbnRlcnNlY3Rpb25YLCBuZWFySW50ZXJzZWN0aW9uWV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmYXJJbnRlcnNlY3Rpb25YID0gaW5SYW5nZVBhcmFtc1sxXSAqIGRbMF0gKyB4MTtcbiAgICAgIHZhciBmYXJJbnRlcnNlY3Rpb25ZID0gaW5SYW5nZVBhcmFtc1sxXSAqIGRbMV0gKyB5MTtcbiAgICAgIHJldHVybiBbbmVhckludGVyc2VjdGlvblgsIG5lYXJJbnRlcnNlY3Rpb25ZLCBmYXJJbnRlcnNlY3Rpb25YLCBmYXJJbnRlcnNlY3Rpb25ZXTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFtuZWFySW50ZXJzZWN0aW9uWCwgbmVhckludGVyc2VjdGlvblldO1xuICB9XG59O1xudmFyIG1pZE9mVGhyZWUgPSBmdW5jdGlvbiBtaWRPZlRocmVlKGEsIGIsIGMpIHtcbiAgaWYgKGIgPD0gYSAmJiBhIDw9IGMgfHwgYyA8PSBhICYmIGEgPD0gYikge1xuICAgIHJldHVybiBhO1xuICB9IGVsc2UgaWYgKGEgPD0gYiAmJiBiIDw9IGMgfHwgYyA8PSBiICYmIGIgPD0gYSkge1xuICAgIHJldHVybiBiO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjO1xuICB9XG59O1xuXG4vLyAoeDEseTEpPT4oeDIseTIpIGludGVyc2VjdCB3aXRoICh4Myx5Myk9Pih4NCx5NClcbnZhciBmaW5pdGVMaW5lc0ludGVyc2VjdCA9IGZ1bmN0aW9uIGZpbml0ZUxpbmVzSW50ZXJzZWN0KHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NCwgaW5maW5pdGVMaW5lcykge1xuICB2YXIgZHgxMyA9IHgxIC0geDM7XG4gIHZhciBkeDIxID0geDIgLSB4MTtcbiAgdmFyIGR4NDMgPSB4NCAtIHgzO1xuICB2YXIgZHkxMyA9IHkxIC0geTM7XG4gIHZhciBkeTIxID0geTIgLSB5MTtcbiAgdmFyIGR5NDMgPSB5NCAtIHkzO1xuICB2YXIgdWFfdCA9IGR4NDMgKiBkeTEzIC0gZHk0MyAqIGR4MTM7XG4gIHZhciB1Yl90ID0gZHgyMSAqIGR5MTMgLSBkeTIxICogZHgxMztcbiAgdmFyIHVfYiA9IGR5NDMgKiBkeDIxIC0gZHg0MyAqIGR5MjE7XG4gIGlmICh1X2IgIT09IDApIHtcbiAgICB2YXIgdWEgPSB1YV90IC8gdV9iO1xuICAgIHZhciB1YiA9IHViX3QgLyB1X2I7XG4gICAgdmFyIGZscHRUaHJlc2hvbGQgPSAwLjAwMTtcbiAgICB2YXIgX21pbiA9IDAgLSBmbHB0VGhyZXNob2xkO1xuICAgIHZhciBfbWF4ID0gMSArIGZscHRUaHJlc2hvbGQ7XG4gICAgaWYgKF9taW4gPD0gdWEgJiYgdWEgPD0gX21heCAmJiBfbWluIDw9IHViICYmIHViIDw9IF9tYXgpIHtcbiAgICAgIHJldHVybiBbeDEgKyB1YSAqIGR4MjEsIHkxICsgdWEgKiBkeTIxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFpbmZpbml0ZUxpbmVzKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbeDEgKyB1YSAqIGR4MjEsIHkxICsgdWEgKiBkeTIxXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHVhX3QgPT09IDAgfHwgdWJfdCA9PT0gMCkge1xuICAgICAgLy8gUGFyYWxsZWwsIGNvaW5jaWRlbnQgbGluZXMuIENoZWNrIGlmIG92ZXJsYXBcblxuICAgICAgLy8gQ2hlY2sgZW5kcG9pbnQgb2Ygc2Vjb25kIGxpbmVcbiAgICAgIGlmIChtaWRPZlRocmVlKHgxLCB4MiwgeDQpID09PSB4NCkge1xuICAgICAgICByZXR1cm4gW3g0LCB5NF07XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIHN0YXJ0IHBvaW50IG9mIHNlY29uZCBsaW5lXG4gICAgICBpZiAobWlkT2ZUaHJlZSh4MSwgeDIsIHgzKSA9PT0geDMpIHtcbiAgICAgICAgcmV0dXJuIFt4MywgeTNdO1xuICAgICAgfVxuXG4gICAgICAvLyBFbmRwb2ludCBvZiBmaXJzdCBsaW5lXG4gICAgICBpZiAobWlkT2ZUaHJlZSh4MywgeDQsIHgyKSA9PT0geDIpIHtcbiAgICAgICAgcmV0dXJuIFt4MiwgeTJdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQYXJhbGxlbCwgbm9uLWNvaW5jaWRlbnRcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIG1hdGgucG9seWdvbkludGVyc2VjdExpbmUoIHgsIHksIGJhc2VQb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmcgKVxuLy8gaW50ZXJzZWN0IGEgbm9kZSBwb2x5Z29uIChwdHMgdHJhbnNmb3JtZWQpXG4vL1xuLy8gbWF0aC5wb2x5Z29uSW50ZXJzZWN0TGluZSggeCwgeSwgYmFzZVBvaW50cywgY2VudGVyWCwgY2VudGVyWSApXG4vLyBpbnRlcnNlY3QgdGhlIHBvaW50cyAobm8gdHJhbnNmb3JtKVxudmFyIHBvbHlnb25JbnRlcnNlY3RMaW5lID0gZnVuY3Rpb24gcG9seWdvbkludGVyc2VjdExpbmUoeCwgeSwgYmFzZVBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZykge1xuICB2YXIgaW50ZXJzZWN0aW9ucyA9IFtdO1xuICB2YXIgaW50ZXJzZWN0aW9uO1xuICB2YXIgdHJhbnNmb3JtZWRQb2ludHMgPSBuZXcgQXJyYXkoYmFzZVBvaW50cy5sZW5ndGgpO1xuICB2YXIgZG9UcmFuc2Zvcm0gPSB0cnVlO1xuICBpZiAod2lkdGggPT0gbnVsbCkge1xuICAgIGRvVHJhbnNmb3JtID0gZmFsc2U7XG4gIH1cbiAgdmFyIHBvaW50cztcbiAgaWYgKGRvVHJhbnNmb3JtKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFuc2Zvcm1lZFBvaW50cy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICAgIHRyYW5zZm9ybWVkUG9pbnRzW2kgKiAyXSA9IGJhc2VQb2ludHNbaSAqIDJdICogd2lkdGggKyBjZW50ZXJYO1xuICAgICAgdHJhbnNmb3JtZWRQb2ludHNbaSAqIDIgKyAxXSA9IGJhc2VQb2ludHNbaSAqIDIgKyAxXSAqIGhlaWdodCArIGNlbnRlclk7XG4gICAgfVxuICAgIGlmIChwYWRkaW5nID4gMCkge1xuICAgICAgdmFyIGV4cGFuZGVkTGluZVNldCA9IGV4cGFuZFBvbHlnb24odHJhbnNmb3JtZWRQb2ludHMsIC1wYWRkaW5nKTtcbiAgICAgIHBvaW50cyA9IGpvaW5MaW5lcyhleHBhbmRlZExpbmVTZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb2ludHMgPSB0cmFuc2Zvcm1lZFBvaW50cztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcG9pbnRzID0gYmFzZVBvaW50cztcbiAgfVxuICB2YXIgY3VycmVudFgsIGN1cnJlbnRZLCBuZXh0WCwgbmV4dFk7XG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHBvaW50cy5sZW5ndGggLyAyOyBfaTIrKykge1xuICAgIGN1cnJlbnRYID0gcG9pbnRzW19pMiAqIDJdO1xuICAgIGN1cnJlbnRZID0gcG9pbnRzW19pMiAqIDIgKyAxXTtcbiAgICBpZiAoX2kyIDwgcG9pbnRzLmxlbmd0aCAvIDIgLSAxKSB7XG4gICAgICBuZXh0WCA9IHBvaW50c1soX2kyICsgMSkgKiAyXTtcbiAgICAgIG5leHRZID0gcG9pbnRzWyhfaTIgKyAxKSAqIDIgKyAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dFggPSBwb2ludHNbMF07XG4gICAgICBuZXh0WSA9IHBvaW50c1sxXTtcbiAgICB9XG4gICAgaW50ZXJzZWN0aW9uID0gZmluaXRlTGluZXNJbnRlcnNlY3QoeCwgeSwgY2VudGVyWCwgY2VudGVyWSwgY3VycmVudFgsIGN1cnJlbnRZLCBuZXh0WCwgbmV4dFkpO1xuICAgIGlmIChpbnRlcnNlY3Rpb24ubGVuZ3RoICE9PSAwKSB7XG4gICAgICBpbnRlcnNlY3Rpb25zLnB1c2goaW50ZXJzZWN0aW9uWzBdLCBpbnRlcnNlY3Rpb25bMV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaW50ZXJzZWN0aW9ucztcbn07XG52YXIgcm91bmRQb2x5Z29uSW50ZXJzZWN0TGluZSA9IGZ1bmN0aW9uIHJvdW5kUG9seWdvbkludGVyc2VjdExpbmUoeCwgeSwgYmFzZVBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZykge1xuICB2YXIgaW50ZXJzZWN0aW9ucyA9IFtdO1xuICB2YXIgaW50ZXJzZWN0aW9uO1xuICB2YXIgbGluZXMgPSBuZXcgQXJyYXkoYmFzZVBvaW50cy5sZW5ndGgpO1xuICB2YXIgaGFsZlcgPSB3aWR0aCAvIDI7XG4gIHZhciBoYWxmSCA9IGhlaWdodCAvIDI7XG4gIHZhciBjb3JuZXJSYWRpdXMgPSBnZXRSb3VuZFBvbHlnb25SYWRpdXMod2lkdGgsIGhlaWdodCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYmFzZVBvaW50cy5sZW5ndGggLyA0OyBpKyspIHtcbiAgICB2YXIgc291cmNlVXYgPSB2b2lkIDAsXG4gICAgICBkZXN0VXYgPSB2b2lkIDA7XG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIHNvdXJjZVV2ID0gYmFzZVBvaW50cy5sZW5ndGggLSAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2VVdiA9IGkgKiA0IC0gMjtcbiAgICB9XG4gICAgZGVzdFV2ID0gaSAqIDQgKyAyO1xuICAgIHZhciBweCA9IGNlbnRlclggKyBoYWxmVyAqIGJhc2VQb2ludHNbaSAqIDRdO1xuICAgIHZhciBweSA9IGNlbnRlclkgKyBoYWxmSCAqIGJhc2VQb2ludHNbaSAqIDQgKyAxXTtcbiAgICB2YXIgY29zVGhldGEgPSAtYmFzZVBvaW50c1tzb3VyY2VVdl0gKiBiYXNlUG9pbnRzW2Rlc3RVdl0gLSBiYXNlUG9pbnRzW3NvdXJjZVV2ICsgMV0gKiBiYXNlUG9pbnRzW2Rlc3RVdiArIDFdO1xuICAgIHZhciBvZmZzZXQgPSBjb3JuZXJSYWRpdXMgLyBNYXRoLnRhbihNYXRoLmFjb3MoY29zVGhldGEpIC8gMik7XG4gICAgdmFyIGNwMHggPSBweCAtIG9mZnNldCAqIGJhc2VQb2ludHNbc291cmNlVXZdO1xuICAgIHZhciBjcDB5ID0gcHkgLSBvZmZzZXQgKiBiYXNlUG9pbnRzW3NvdXJjZVV2ICsgMV07XG4gICAgdmFyIGNwMXggPSBweCArIG9mZnNldCAqIGJhc2VQb2ludHNbZGVzdFV2XTtcbiAgICB2YXIgY3AxeSA9IHB5ICsgb2Zmc2V0ICogYmFzZVBvaW50c1tkZXN0VXYgKyAxXTtcbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgbGluZXNbYmFzZVBvaW50cy5sZW5ndGggLSAyXSA9IGNwMHg7XG4gICAgICBsaW5lc1tiYXNlUG9pbnRzLmxlbmd0aCAtIDFdID0gY3AweTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXNbaSAqIDQgLSAyXSA9IGNwMHg7XG4gICAgICBsaW5lc1tpICogNCAtIDFdID0gY3AweTtcbiAgICB9XG4gICAgbGluZXNbaSAqIDRdID0gY3AxeDtcbiAgICBsaW5lc1tpICogNCArIDFdID0gY3AxeTtcbiAgICB2YXIgb3J0aHggPSBiYXNlUG9pbnRzW3NvdXJjZVV2ICsgMV07XG4gICAgdmFyIG9ydGh5ID0gLWJhc2VQb2ludHNbc291cmNlVXZdO1xuICAgIHZhciBjb3NBbHBoYSA9IG9ydGh4ICogYmFzZVBvaW50c1tkZXN0VXZdICsgb3J0aHkgKiBiYXNlUG9pbnRzW2Rlc3RVdiArIDFdO1xuICAgIGlmIChjb3NBbHBoYSA8IDApIHtcbiAgICAgIG9ydGh4ICo9IC0xO1xuICAgICAgb3J0aHkgKj0gLTE7XG4gICAgfVxuICAgIHZhciBjeCA9IGNwMHggKyBvcnRoeCAqIGNvcm5lclJhZGl1cztcbiAgICB2YXIgY3kgPSBjcDB5ICsgb3J0aHkgKiBjb3JuZXJSYWRpdXM7XG4gICAgaW50ZXJzZWN0aW9uID0gaW50ZXJzZWN0TGluZUNpcmNsZSh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLCBjeCwgY3ksIGNvcm5lclJhZGl1cyk7XG4gICAgaWYgKGludGVyc2VjdGlvbi5sZW5ndGggIT09IDApIHtcbiAgICAgIGludGVyc2VjdGlvbnMucHVzaChpbnRlcnNlY3Rpb25bMF0sIGludGVyc2VjdGlvblsxXSk7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGxpbmVzLmxlbmd0aCAvIDQ7IF9pMysrKSB7XG4gICAgaW50ZXJzZWN0aW9uID0gZmluaXRlTGluZXNJbnRlcnNlY3QoeCwgeSwgY2VudGVyWCwgY2VudGVyWSwgbGluZXNbX2kzICogNF0sIGxpbmVzW19pMyAqIDQgKyAxXSwgbGluZXNbX2kzICogNCArIDJdLCBsaW5lc1tfaTMgKiA0ICsgM10sIGZhbHNlKTtcbiAgICBpZiAoaW50ZXJzZWN0aW9uLmxlbmd0aCAhPT0gMCkge1xuICAgICAgaW50ZXJzZWN0aW9ucy5wdXNoKGludGVyc2VjdGlvblswXSwgaW50ZXJzZWN0aW9uWzFdKTtcbiAgICB9XG4gIH1cbiAgaWYgKGludGVyc2VjdGlvbnMubGVuZ3RoID4gMikge1xuICAgIHZhciBsb3dlc3RJbnRlcnNlY3Rpb24gPSBbaW50ZXJzZWN0aW9uc1swXSwgaW50ZXJzZWN0aW9uc1sxXV07XG4gICAgdmFyIGxvd2VzdFNxdWFyZWREaXN0YW5jZSA9IE1hdGgucG93KGxvd2VzdEludGVyc2VjdGlvblswXSAtIHgsIDIpICsgTWF0aC5wb3cobG93ZXN0SW50ZXJzZWN0aW9uWzFdIC0geSwgMik7XG4gICAgZm9yICh2YXIgX2k0ID0gMTsgX2k0IDwgaW50ZXJzZWN0aW9ucy5sZW5ndGggLyAyOyBfaTQrKykge1xuICAgICAgdmFyIHNxdWFyZWREaXN0YW5jZSA9IE1hdGgucG93KGludGVyc2VjdGlvbnNbX2k0ICogMl0gLSB4LCAyKSArIE1hdGgucG93KGludGVyc2VjdGlvbnNbX2k0ICogMiArIDFdIC0geSwgMik7XG4gICAgICBpZiAoc3F1YXJlZERpc3RhbmNlIDw9IGxvd2VzdFNxdWFyZWREaXN0YW5jZSkge1xuICAgICAgICBsb3dlc3RJbnRlcnNlY3Rpb25bMF0gPSBpbnRlcnNlY3Rpb25zW19pNCAqIDJdO1xuICAgICAgICBsb3dlc3RJbnRlcnNlY3Rpb25bMV0gPSBpbnRlcnNlY3Rpb25zW19pNCAqIDIgKyAxXTtcbiAgICAgICAgbG93ZXN0U3F1YXJlZERpc3RhbmNlID0gc3F1YXJlZERpc3RhbmNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbG93ZXN0SW50ZXJzZWN0aW9uO1xuICB9XG4gIHJldHVybiBpbnRlcnNlY3Rpb25zO1xufTtcbnZhciBzaG9ydGVuSW50ZXJzZWN0aW9uID0gZnVuY3Rpb24gc2hvcnRlbkludGVyc2VjdGlvbihpbnRlcnNlY3Rpb24sIG9mZnNldCwgYW1vdW50KSB7XG4gIHZhciBkaXNwID0gW2ludGVyc2VjdGlvblswXSAtIG9mZnNldFswXSwgaW50ZXJzZWN0aW9uWzFdIC0gb2Zmc2V0WzFdXTtcbiAgdmFyIGxlbmd0aCA9IE1hdGguc3FydChkaXNwWzBdICogZGlzcFswXSArIGRpc3BbMV0gKiBkaXNwWzFdKTtcbiAgdmFyIGxlblJhdGlvID0gKGxlbmd0aCAtIGFtb3VudCkgLyBsZW5ndGg7XG4gIGlmIChsZW5SYXRpbyA8IDApIHtcbiAgICBsZW5SYXRpbyA9IDAuMDAwMDE7XG4gIH1cbiAgcmV0dXJuIFtvZmZzZXRbMF0gKyBsZW5SYXRpbyAqIGRpc3BbMF0sIG9mZnNldFsxXSArIGxlblJhdGlvICogZGlzcFsxXV07XG59O1xudmFyIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSA9IGZ1bmN0aW9uIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZShzaWRlcywgcm90YXRpb25SYWRpYW5zKSB7XG4gIHZhciBwb2ludHMgPSBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzKHNpZGVzLCByb3RhdGlvblJhZGlhbnMpO1xuICBwb2ludHMgPSBmaXRQb2x5Z29uVG9TcXVhcmUocG9pbnRzKTtcbiAgcmV0dXJuIHBvaW50cztcbn07XG52YXIgZml0UG9seWdvblRvU3F1YXJlID0gZnVuY3Rpb24gZml0UG9seWdvblRvU3F1YXJlKHBvaW50cykge1xuICB2YXIgeCwgeTtcbiAgdmFyIHNpZGVzID0gcG9pbnRzLmxlbmd0aCAvIDI7XG4gIHZhciBtaW5YID0gSW5maW5pdHksXG4gICAgbWluWSA9IEluZmluaXR5LFxuICAgIG1heFggPSAtSW5maW5pdHksXG4gICAgbWF4WSA9IC1JbmZpbml0eTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWRlczsgaSsrKSB7XG4gICAgeCA9IHBvaW50c1syICogaV07XG4gICAgeSA9IHBvaW50c1syICogaSArIDFdO1xuICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCB4KTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgeCk7XG4gICAgbWluWSA9IE1hdGgubWluKG1pblksIHkpO1xuICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCB5KTtcbiAgfVxuXG4gIC8vIHN0cmV0Y2ggZmFjdG9yc1xuICB2YXIgc3ggPSAyIC8gKG1heFggLSBtaW5YKTtcbiAgdmFyIHN5ID0gMiAvIChtYXhZIC0gbWluWSk7XG4gIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IHNpZGVzOyBfaTUrKykge1xuICAgIHggPSBwb2ludHNbMiAqIF9pNV0gPSBwb2ludHNbMiAqIF9pNV0gKiBzeDtcbiAgICB5ID0gcG9pbnRzWzIgKiBfaTUgKyAxXSA9IHBvaW50c1syICogX2k1ICsgMV0gKiBzeTtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeCk7XG4gICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHgpO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5KTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSk7XG4gIH1cbiAgaWYgKG1pblkgPCAtMSkge1xuICAgIGZvciAodmFyIF9pNiA9IDA7IF9pNiA8IHNpZGVzOyBfaTYrKykge1xuICAgICAgeSA9IHBvaW50c1syICogX2k2ICsgMV0gPSBwb2ludHNbMiAqIF9pNiArIDFdICsgKC0xIC0gbWluWSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwb2ludHM7XG59O1xudmFyIGdlbmVyYXRlVW5pdE5nb25Qb2ludHMgPSBmdW5jdGlvbiBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzKHNpZGVzLCByb3RhdGlvblJhZGlhbnMpIHtcbiAgdmFyIGluY3JlbWVudCA9IDEuMCAvIHNpZGVzICogMiAqIE1hdGguUEk7XG4gIHZhciBzdGFydEFuZ2xlID0gc2lkZXMgJSAyID09PSAwID8gTWF0aC5QSSAvIDIuMCArIGluY3JlbWVudCAvIDIuMCA6IE1hdGguUEkgLyAyLjA7XG4gIHN0YXJ0QW5nbGUgKz0gcm90YXRpb25SYWRpYW5zO1xuICB2YXIgcG9pbnRzID0gbmV3IEFycmF5KHNpZGVzICogMik7XG4gIHZhciBjdXJyZW50QW5nbGU7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2lkZXM7IGkrKykge1xuICAgIGN1cnJlbnRBbmdsZSA9IGkgKiBpbmNyZW1lbnQgKyBzdGFydEFuZ2xlO1xuICAgIHBvaW50c1syICogaV0gPSBNYXRoLmNvcyhjdXJyZW50QW5nbGUpOyAvLyB4XG4gICAgcG9pbnRzWzIgKiBpICsgMV0gPSBNYXRoLnNpbigtY3VycmVudEFuZ2xlKTsgLy8geVxuICB9XG5cbiAgcmV0dXJuIHBvaW50cztcbn07XG5cbi8vIFNldCB0aGUgZGVmYXVsdCByYWRpdXMsIHVubGVzcyBoYWxmIG9mIHdpZHRoIG9yIGhlaWdodCBpcyBzbWFsbGVyIHRoYW4gZGVmYXVsdFxudmFyIGdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzID0gZnVuY3Rpb24gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCkge1xuICByZXR1cm4gTWF0aC5taW4od2lkdGggLyA0LCBoZWlnaHQgLyA0LCA4KTtcbn07XG5cbi8vIFNldCB0aGUgZGVmYXVsdCByYWRpdXNcbnZhciBnZXRSb3VuZFBvbHlnb25SYWRpdXMgPSBmdW5jdGlvbiBnZXRSb3VuZFBvbHlnb25SYWRpdXMod2lkdGgsIGhlaWdodCkge1xuICByZXR1cm4gTWF0aC5taW4od2lkdGggLyAxMCwgaGVpZ2h0IC8gMTAsIDgpO1xufTtcbnZhciBnZXRDdXRSZWN0YW5nbGVDb3JuZXJMZW5ndGggPSBmdW5jdGlvbiBnZXRDdXRSZWN0YW5nbGVDb3JuZXJMZW5ndGgoKSB7XG4gIHJldHVybiA4O1xufTtcbnZhciBiZXppZXJQdHNUb1F1YWRDb2VmZiA9IGZ1bmN0aW9uIGJlemllclB0c1RvUXVhZENvZWZmKHAwLCBwMSwgcDIpIHtcbiAgcmV0dXJuIFtwMCAtIDIgKiBwMSArIHAyLCAyICogKHAxIC0gcDApLCBwMF07XG59O1xuXG4vLyBnZXQgY3VydmUgd2lkdGgsIGhlaWdodCwgYW5kIGNvbnRyb2wgcG9pbnQgcG9zaXRpb24gb2Zmc2V0cyBhcyBhIHBlcmNlbnRhZ2Ugb2Ygbm9kZSBoZWlnaHQgLyB3aWR0aFxudmFyIGdldEJhcnJlbEN1cnZlQ29uc3RhbnRzID0gZnVuY3Rpb24gZ2V0QmFycmVsQ3VydmVDb25zdGFudHMod2lkdGgsIGhlaWdodCkge1xuICByZXR1cm4ge1xuICAgIGhlaWdodE9mZnNldDogTWF0aC5taW4oMTUsIDAuMDUgKiBoZWlnaHQpLFxuICAgIHdpZHRoT2Zmc2V0OiBNYXRoLm1pbigxMDAsIDAuMjUgKiB3aWR0aCksXG4gICAgY3RybFB0T2Zmc2V0UGN0OiAwLjA1XG4gIH07XG59O1xuXG52YXIgcGFnZVJhbmtEZWZhdWx0cyA9IGRlZmF1bHRzJGcoe1xuICBkYW1waW5nRmFjdG9yOiAwLjgsXG4gIHByZWNpc2lvbjogMC4wMDAwMDEsXG4gIGl0ZXJhdGlvbnM6IDIwMCxcbiAgd2VpZ2h0OiBmdW5jdGlvbiB3ZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9XG59KTtcbnZhciBlbGVzZm4kbyA9IHtcbiAgcGFnZVJhbms6IGZ1bmN0aW9uIHBhZ2VSYW5rKG9wdGlvbnMpIHtcbiAgICB2YXIgX3BhZ2VSYW5rRGVmYXVsdHMgPSBwYWdlUmFua0RlZmF1bHRzKG9wdGlvbnMpLFxuICAgICAgZGFtcGluZ0ZhY3RvciA9IF9wYWdlUmFua0RlZmF1bHRzLmRhbXBpbmdGYWN0b3IsXG4gICAgICBwcmVjaXNpb24gPSBfcGFnZVJhbmtEZWZhdWx0cy5wcmVjaXNpb24sXG4gICAgICBpdGVyYXRpb25zID0gX3BhZ2VSYW5rRGVmYXVsdHMuaXRlcmF0aW9ucyxcbiAgICAgIHdlaWdodCA9IF9wYWdlUmFua0RlZmF1bHRzLndlaWdodDtcbiAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICAgIHZhciBfdGhpcyRieUdyb3VwID0gdGhpcy5ieUdyb3VwKCksXG4gICAgICBub2RlcyA9IF90aGlzJGJ5R3JvdXAubm9kZXMsXG4gICAgICBlZGdlcyA9IF90aGlzJGJ5R3JvdXAuZWRnZXM7XG4gICAgdmFyIG51bU5vZGVzID0gbm9kZXMubGVuZ3RoO1xuICAgIHZhciBudW1Ob2Rlc1NxZCA9IG51bU5vZGVzICogbnVtTm9kZXM7XG4gICAgdmFyIG51bUVkZ2VzID0gZWRnZXMubGVuZ3RoO1xuXG4gICAgLy8gQ29uc3RydWN0IHRyYW5zcG9zZWQgYWRqYWNlbmN5IG1hdHJpeFxuICAgIC8vIEZpcnN0IGxldHMgaGF2ZSBhIHplcm9lZCBtYXRyaXggb2YgdGhlIHJpZ2h0IHNpemVcbiAgICAvLyBXZSdsbCBhbHNvIGtlZXAgdHJhY2sgb2YgdGhlIHN1bSBvZiBlYWNoIGNvbHVtblxuICAgIHZhciBtYXRyaXggPSBuZXcgQXJyYXkobnVtTm9kZXNTcWQpO1xuICAgIHZhciBjb2x1bW5TdW0gPSBuZXcgQXJyYXkobnVtTm9kZXMpO1xuICAgIHZhciBhZGRpdGlvbmFsUHJvYiA9ICgxIC0gZGFtcGluZ0ZhY3RvcikgLyBudW1Ob2RlcztcblxuICAgIC8vIENyZWF0ZSBudWxsIG1hdHJpeFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTm9kZXM7IGkrKykge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBudW1Ob2RlczsgaisrKSB7XG4gICAgICAgIHZhciBuID0gaSAqIG51bU5vZGVzICsgajtcbiAgICAgICAgbWF0cml4W25dID0gMDtcbiAgICAgIH1cbiAgICAgIGNvbHVtblN1bVtpXSA9IDA7XG4gICAgfVxuXG4gICAgLy8gTm93LCBwcm9jZXNzIGVkZ2VzXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG51bUVkZ2VzOyBfaSsrKSB7XG4gICAgICB2YXIgZWRnZSA9IGVkZ2VzW19pXTtcbiAgICAgIHZhciBzcmNJZCA9IGVkZ2UuZGF0YSgnc291cmNlJyk7XG4gICAgICB2YXIgdGd0SWQgPSBlZGdlLmRhdGEoJ3RhcmdldCcpO1xuXG4gICAgICAvLyBEb24ndCBpbmNsdWRlIGxvb3BzIGluIHRoZSBtYXRyaXhcbiAgICAgIGlmIChzcmNJZCA9PT0gdGd0SWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgcyA9IG5vZGVzLmluZGV4T2ZJZChzcmNJZCk7XG4gICAgICB2YXIgdCA9IG5vZGVzLmluZGV4T2ZJZCh0Z3RJZCk7XG4gICAgICB2YXIgdyA9IHdlaWdodChlZGdlKTtcbiAgICAgIHZhciBfbiA9IHQgKiBudW1Ob2RlcyArIHM7XG5cbiAgICAgIC8vIFVwZGF0ZSBtYXRyaXhcbiAgICAgIG1hdHJpeFtfbl0gKz0gdztcblxuICAgICAgLy8gVXBkYXRlIGNvbHVtbiBzdW1cbiAgICAgIGNvbHVtblN1bVtzXSArPSB3O1xuICAgIH1cblxuICAgIC8vIEFkZCBhZGRpdGlvbmFsIHByb2JhYmlsaXR5IGJhc2VkIG9uIGRhbXBpbmcgZmFjdG9yXG4gICAgLy8gQWxzbywgdGFrZSBpbnRvIGFjY291bnQgY29sdW1ucyB0aGF0IGhhdmUgc3VtID0gMFxuICAgIHZhciBwID0gMS4wIC8gbnVtTm9kZXMgKyBhZGRpdGlvbmFsUHJvYjsgLy8gU2hvcnRoYW5kXG5cbiAgICAvLyBUcmF2ZXJzZSBtYXRyaXgsIGNvbHVtbiBieSBjb2x1bW5cbiAgICBmb3IgKHZhciBfaiA9IDA7IF9qIDwgbnVtTm9kZXM7IF9qKyspIHtcbiAgICAgIGlmIChjb2x1bW5TdW1bX2pdID09PSAwKSB7XG4gICAgICAgIC8vIE5vICdsaW5rcycgb3V0IGZyb20gbm9kZSBqdGgsIGFzc3VtZSBlcXVhbCBwcm9iYWJpbGl0eSBmb3IgZWFjaCBwb3NzaWJsZSBub2RlXG4gICAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG51bU5vZGVzOyBfaTIrKykge1xuICAgICAgICAgIHZhciBfbjIgPSBfaTIgKiBudW1Ob2RlcyArIF9qO1xuICAgICAgICAgIG1hdHJpeFtfbjJdID0gcDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm9kZSBqdGggaGFzIG91dGdvaW5nIGxpbmssIGNvbXB1dGUgbm9ybWFsaXplZCBwcm9iYWJpbGl0aWVzXG4gICAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IG51bU5vZGVzOyBfaTMrKykge1xuICAgICAgICAgIHZhciBfbjMgPSBfaTMgKiBudW1Ob2RlcyArIF9qO1xuICAgICAgICAgIG1hdHJpeFtfbjNdID0gbWF0cml4W19uM10gLyBjb2x1bW5TdW1bX2pdICsgYWRkaXRpb25hbFByb2I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb21wdXRlIGRvbWluYW50IGVpZ2VudmVjdG9yIHVzaW5nIHBvd2VyIG1ldGhvZFxuICAgIHZhciBlaWdlbnZlY3RvciA9IG5ldyBBcnJheShudW1Ob2Rlcyk7XG4gICAgdmFyIHRlbXAgPSBuZXcgQXJyYXkobnVtTm9kZXMpO1xuICAgIHZhciBwcmV2aW91cztcblxuICAgIC8vIFN0YXJ0IHdpdGggYSB2ZWN0b3Igb2YgYWxsIDEnc1xuICAgIC8vIEFsc28sIGluaXRpYWxpemUgYSBudWxsIHZlY3RvciB3aGljaCB3aWxsIGJlIHVzZWQgYXMgc2hvcnRoYW5kXG4gICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgbnVtTm9kZXM7IF9pNCsrKSB7XG4gICAgICBlaWdlbnZlY3RvcltfaTRdID0gMTtcbiAgICB9XG4gICAgZm9yICh2YXIgaXRlciA9IDA7IGl0ZXIgPCBpdGVyYXRpb25zOyBpdGVyKyspIHtcbiAgICAgIC8vIFRlbXAgYXJyYXkgd2l0aCBhbGwgMCdzXG4gICAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBudW1Ob2RlczsgX2k1KyspIHtcbiAgICAgICAgdGVtcFtfaTVdID0gMDtcbiAgICAgIH1cblxuICAgICAgLy8gTXVsdGlwbHkgbWF0cml4IHdpdGggcHJldmlvdXMgcmVzdWx0XG4gICAgICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBudW1Ob2RlczsgX2k2KyspIHtcbiAgICAgICAgZm9yICh2YXIgX2oyID0gMDsgX2oyIDwgbnVtTm9kZXM7IF9qMisrKSB7XG4gICAgICAgICAgdmFyIF9uNCA9IF9pNiAqIG51bU5vZGVzICsgX2oyO1xuICAgICAgICAgIHRlbXBbX2k2XSArPSBtYXRyaXhbX240XSAqIGVpZ2VudmVjdG9yW19qMl07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGluUGxhY2VTdW1Ob3JtYWxpemUodGVtcCk7XG4gICAgICBwcmV2aW91cyA9IGVpZ2VudmVjdG9yO1xuICAgICAgZWlnZW52ZWN0b3IgPSB0ZW1wO1xuICAgICAgdGVtcCA9IHByZXZpb3VzO1xuICAgICAgdmFyIGRpZmYgPSAwO1xuICAgICAgLy8gQ29tcHV0ZSBkaWZmZXJlbmNlIChzcXVhcmVkIG1vZHVsZSkgb2YgYm90aCB2ZWN0b3JzXG4gICAgICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCBudW1Ob2RlczsgX2k3KyspIHtcbiAgICAgICAgdmFyIGRlbHRhID0gcHJldmlvdXNbX2k3XSAtIGVpZ2VudmVjdG9yW19pN107XG4gICAgICAgIGRpZmYgKz0gZGVsdGEgKiBkZWx0YTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgZGlmZmVyZW5jZSBpcyBsZXNzIHRoYW4gdGhlIGRlc2lyZWQgdGhyZXNob2xkLCBzdG9wIGl0ZXJhdGluZ1xuICAgICAgaWYgKGRpZmYgPCBwcmVjaXNpb24pIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29uc3RydWN0IHJlc3VsdFxuICAgIHZhciByZXMgPSB7XG4gICAgICByYW5rOiBmdW5jdGlvbiByYW5rKG5vZGUpIHtcbiAgICAgICAgbm9kZSA9IGN5LmNvbGxlY3Rpb24obm9kZSlbMF07XG4gICAgICAgIHJldHVybiBlaWdlbnZlY3Rvcltub2Rlcy5pbmRleE9mKG5vZGUpXTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiByZXM7XG4gIH0gLy8gcGFnZVJhbmtcbn07IC8vIGVsZXNmblxuXG52YXIgZGVmYXVsdHMkZiA9IGRlZmF1bHRzJGcoe1xuICByb290OiBudWxsLFxuICB3ZWlnaHQ6IGZ1bmN0aW9uIHdlaWdodChlZGdlKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0sXG4gIGRpcmVjdGVkOiBmYWxzZSxcbiAgYWxwaGE6IDBcbn0pO1xudmFyIGVsZXNmbiRuID0ge1xuICBkZWdyZWVDZW50cmFsaXR5Tm9ybWFsaXplZDogZnVuY3Rpb24gZGVncmVlQ2VudHJhbGl0eU5vcm1hbGl6ZWQob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBkZWZhdWx0cyRmKG9wdGlvbnMpO1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gICAgdmFyIG51bU5vZGVzID0gbm9kZXMubGVuZ3RoO1xuICAgIGlmICghb3B0aW9ucy5kaXJlY3RlZCkge1xuICAgICAgdmFyIGRlZ3JlZXMgPSB7fTtcbiAgICAgIHZhciBtYXhEZWdyZWUgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1Ob2RlczsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG5cbiAgICAgICAgLy8gYWRkIGN1cnJlbnQgbm9kZSB0byB0aGUgY3VycmVudCBvcHRpb25zIG9iamVjdCBhbmQgY2FsbCBkZWdyZWVDZW50cmFsaXR5XG4gICAgICAgIG9wdGlvbnMucm9vdCA9IG5vZGU7XG4gICAgICAgIHZhciBjdXJyRGVncmVlID0gdGhpcy5kZWdyZWVDZW50cmFsaXR5KG9wdGlvbnMpO1xuICAgICAgICBpZiAobWF4RGVncmVlIDwgY3VyckRlZ3JlZS5kZWdyZWUpIHtcbiAgICAgICAgICBtYXhEZWdyZWUgPSBjdXJyRGVncmVlLmRlZ3JlZTtcbiAgICAgICAgfVxuICAgICAgICBkZWdyZWVzW25vZGUuaWQoKV0gPSBjdXJyRGVncmVlLmRlZ3JlZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRlZ3JlZTogZnVuY3Rpb24gZGVncmVlKG5vZGUpIHtcbiAgICAgICAgICBpZiAobWF4RGVncmVlID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0cmluZyhub2RlKSkge1xuICAgICAgICAgICAgLy8gZnJvbSBpcyBhIHNlbGVjdG9yIHN0cmluZ1xuICAgICAgICAgICAgbm9kZSA9IGN5LmZpbHRlcihub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRlZ3JlZXNbbm9kZS5pZCgpXSAvIG1heERlZ3JlZTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGluZGVncmVlcyA9IHt9O1xuICAgICAgdmFyIG91dGRlZ3JlZXMgPSB7fTtcbiAgICAgIHZhciBtYXhJbmRlZ3JlZSA9IDA7XG4gICAgICB2YXIgbWF4T3V0ZGVncmVlID0gMDtcbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBudW1Ob2RlczsgX2krKykge1xuICAgICAgICB2YXIgX25vZGUgPSBub2Rlc1tfaV07XG4gICAgICAgIHZhciBpZCA9IF9ub2RlLmlkKCk7XG5cbiAgICAgICAgLy8gYWRkIGN1cnJlbnQgbm9kZSB0byB0aGUgY3VycmVudCBvcHRpb25zIG9iamVjdCBhbmQgY2FsbCBkZWdyZWVDZW50cmFsaXR5XG4gICAgICAgIG9wdGlvbnMucm9vdCA9IF9ub2RlO1xuICAgICAgICB2YXIgX2N1cnJEZWdyZWUgPSB0aGlzLmRlZ3JlZUNlbnRyYWxpdHkob3B0aW9ucyk7XG4gICAgICAgIGlmIChtYXhJbmRlZ3JlZSA8IF9jdXJyRGVncmVlLmluZGVncmVlKSBtYXhJbmRlZ3JlZSA9IF9jdXJyRGVncmVlLmluZGVncmVlO1xuICAgICAgICBpZiAobWF4T3V0ZGVncmVlIDwgX2N1cnJEZWdyZWUub3V0ZGVncmVlKSBtYXhPdXRkZWdyZWUgPSBfY3VyckRlZ3JlZS5vdXRkZWdyZWU7XG4gICAgICAgIGluZGVncmVlc1tpZF0gPSBfY3VyckRlZ3JlZS5pbmRlZ3JlZTtcbiAgICAgICAgb3V0ZGVncmVlc1tpZF0gPSBfY3VyckRlZ3JlZS5vdXRkZWdyZWU7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbmRlZ3JlZTogZnVuY3Rpb24gaW5kZWdyZWUobm9kZSkge1xuICAgICAgICAgIGlmIChtYXhJbmRlZ3JlZSA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0cmluZyhub2RlKSkge1xuICAgICAgICAgICAgLy8gZnJvbSBpcyBhIHNlbGVjdG9yIHN0cmluZ1xuICAgICAgICAgICAgbm9kZSA9IGN5LmZpbHRlcihub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGluZGVncmVlc1tub2RlLmlkKCldIC8gbWF4SW5kZWdyZWU7XG4gICAgICAgIH0sXG4gICAgICAgIG91dGRlZ3JlZTogZnVuY3Rpb24gb3V0ZGVncmVlKG5vZGUpIHtcbiAgICAgICAgICBpZiAobWF4T3V0ZGVncmVlID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0cmluZyhub2RlKSkge1xuICAgICAgICAgICAgLy8gZnJvbSBpcyBhIHNlbGVjdG9yIHN0cmluZ1xuICAgICAgICAgICAgbm9kZSA9IGN5LmZpbHRlcihub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG91dGRlZ3JlZXNbbm9kZS5pZCgpXSAvIG1heE91dGRlZ3JlZTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH0sXG4gIC8vIGRlZ3JlZUNlbnRyYWxpdHlOb3JtYWxpemVkXG5cbiAgLy8gSW1wbGVtZW50ZWQgZnJvbSB0aGUgYWxnb3JpdGhtIGluIE9wc2FobCdzIHBhcGVyXG4gIC8vIFwiTm9kZSBjZW50cmFsaXR5IGluIHdlaWdodGVkIG5ldHdvcmtzOiBHZW5lcmFsaXppbmcgZGVncmVlIGFuZCBzaG9ydGVzdCBwYXRoc1wiXG4gIC8vIGNoZWNrIHRoZSBoZWFkaW5nIDIgXCJEZWdyZWVcIlxuICBkZWdyZWVDZW50cmFsaXR5OiBmdW5jdGlvbiBkZWdyZWVDZW50cmFsaXR5KG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gZGVmYXVsdHMkZihvcHRpb25zKTtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIGNhbGxpbmdFbGVzID0gdGhpcztcbiAgICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgcm9vdCA9IF9vcHRpb25zLnJvb3QsXG4gICAgICB3ZWlnaHQgPSBfb3B0aW9ucy53ZWlnaHQsXG4gICAgICBkaXJlY3RlZCA9IF9vcHRpb25zLmRpcmVjdGVkLFxuICAgICAgYWxwaGEgPSBfb3B0aW9ucy5hbHBoYTtcbiAgICByb290ID0gY3kuY29sbGVjdGlvbihyb290KVswXTtcbiAgICBpZiAoIWRpcmVjdGVkKSB7XG4gICAgICB2YXIgY29ubkVkZ2VzID0gcm9vdC5jb25uZWN0ZWRFZGdlcygpLmludGVyc2VjdGlvbihjYWxsaW5nRWxlcyk7XG4gICAgICB2YXIgayA9IGNvbm5FZGdlcy5sZW5ndGg7XG4gICAgICB2YXIgcyA9IDA7XG5cbiAgICAgIC8vIE5vdywgc3VtIGVkZ2Ugd2VpZ2h0c1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uRWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcyArPSB3ZWlnaHQoY29ubkVkZ2VzW2ldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRlZ3JlZTogTWF0aC5wb3coaywgMSAtIGFscGhhKSAqIE1hdGgucG93KHMsIGFscGhhKVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGVkZ2VzID0gcm9vdC5jb25uZWN0ZWRFZGdlcygpO1xuICAgICAgdmFyIGluY29taW5nID0gZWRnZXMuZmlsdGVyKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgIHJldHVybiBlZGdlLnRhcmdldCgpLnNhbWUocm9vdCkgJiYgY2FsbGluZ0VsZXMuaGFzKGVkZ2UpO1xuICAgICAgfSk7XG4gICAgICB2YXIgb3V0Z29pbmcgPSBlZGdlcy5maWx0ZXIoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgcmV0dXJuIGVkZ2Uuc291cmNlKCkuc2FtZShyb290KSAmJiBjYWxsaW5nRWxlcy5oYXMoZWRnZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBrX2luID0gaW5jb21pbmcubGVuZ3RoO1xuICAgICAgdmFyIGtfb3V0ID0gb3V0Z29pbmcubGVuZ3RoO1xuICAgICAgdmFyIHNfaW4gPSAwO1xuICAgICAgdmFyIHNfb3V0ID0gMDtcblxuICAgICAgLy8gTm93LCBzdW0gaW5jb21pbmcgZWRnZSB3ZWlnaHRzXG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBpbmNvbWluZy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIHNfaW4gKz0gd2VpZ2h0KGluY29taW5nW19pMl0pO1xuICAgICAgfVxuXG4gICAgICAvLyBOb3csIHN1bSBvdXRnb2luZyBlZGdlIHdlaWdodHNcbiAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IG91dGdvaW5nLmxlbmd0aDsgX2kzKyspIHtcbiAgICAgICAgc19vdXQgKz0gd2VpZ2h0KG91dGdvaW5nW19pM10pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5kZWdyZWU6IE1hdGgucG93KGtfaW4sIDEgLSBhbHBoYSkgKiBNYXRoLnBvdyhzX2luLCBhbHBoYSksXG4gICAgICAgIG91dGRlZ3JlZTogTWF0aC5wb3coa19vdXQsIDEgLSBhbHBoYSkgKiBNYXRoLnBvdyhzX291dCwgYWxwaGEpXG4gICAgICB9O1xuICAgIH1cbiAgfSAvLyBkZWdyZWVDZW50cmFsaXR5XG59OyAvLyBlbGVzZm5cblxuLy8gbmljZSwgc2hvcnQgbWF0aGVtYXRpY2FsIGFsaWFzXG5lbGVzZm4kbi5kYyA9IGVsZXNmbiRuLmRlZ3JlZUNlbnRyYWxpdHk7XG5lbGVzZm4kbi5kY24gPSBlbGVzZm4kbi5kZWdyZWVDZW50cmFsaXR5Tm9ybWFsaXNlZCA9IGVsZXNmbiRuLmRlZ3JlZUNlbnRyYWxpdHlOb3JtYWxpemVkO1xuXG52YXIgZGVmYXVsdHMkZSA9IGRlZmF1bHRzJGcoe1xuICBoYXJtb25pYzogdHJ1ZSxcbiAgd2VpZ2h0OiBmdW5jdGlvbiB3ZWlnaHQoKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0sXG4gIGRpcmVjdGVkOiBmYWxzZSxcbiAgcm9vdDogbnVsbFxufSk7XG52YXIgZWxlc2ZuJG0gPSB7XG4gIGNsb3NlbmVzc0NlbnRyYWxpdHlOb3JtYWxpemVkOiBmdW5jdGlvbiBjbG9zZW5lc3NDZW50cmFsaXR5Tm9ybWFsaXplZChvcHRpb25zKSB7XG4gICAgdmFyIF9kZWZhdWx0cyA9IGRlZmF1bHRzJGUob3B0aW9ucyksXG4gICAgICBoYXJtb25pYyA9IF9kZWZhdWx0cy5oYXJtb25pYyxcbiAgICAgIHdlaWdodCA9IF9kZWZhdWx0cy53ZWlnaHQsXG4gICAgICBkaXJlY3RlZCA9IF9kZWZhdWx0cy5kaXJlY3RlZDtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIGNsb3NlbmVzc2VzID0ge307XG4gICAgdmFyIG1heENsb3NlbmVzcyA9IDA7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICAgIHZhciBmdyA9IHRoaXMuZmxveWRXYXJzaGFsbCh7XG4gICAgICB3ZWlnaHQ6IHdlaWdodCxcbiAgICAgIGRpcmVjdGVkOiBkaXJlY3RlZFxuICAgIH0pO1xuXG4gICAgLy8gQ29tcHV0ZSBjbG9zZW5lc3MgZm9yIGV2ZXJ5IG5vZGUgYW5kIGZpbmQgdGhlIG1heGltdW0gY2xvc2VuZXNzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGN1cnJDbG9zZW5lc3MgPSAwO1xuICAgICAgdmFyIG5vZGVfaSA9IG5vZGVzW2ldO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBub2Rlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoaSAhPT0gaikge1xuICAgICAgICAgIHZhciBkID0gZncuZGlzdGFuY2Uobm9kZV9pLCBub2Rlc1tqXSk7XG4gICAgICAgICAgaWYgKGhhcm1vbmljKSB7XG4gICAgICAgICAgICBjdXJyQ2xvc2VuZXNzICs9IDEgLyBkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXJyQ2xvc2VuZXNzICs9IGQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWhhcm1vbmljKSB7XG4gICAgICAgIGN1cnJDbG9zZW5lc3MgPSAxIC8gY3VyckNsb3NlbmVzcztcbiAgICAgIH1cbiAgICAgIGlmIChtYXhDbG9zZW5lc3MgPCBjdXJyQ2xvc2VuZXNzKSB7XG4gICAgICAgIG1heENsb3NlbmVzcyA9IGN1cnJDbG9zZW5lc3M7XG4gICAgICB9XG4gICAgICBjbG9zZW5lc3Nlc1tub2RlX2kuaWQoKV0gPSBjdXJyQ2xvc2VuZXNzO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY2xvc2VuZXNzOiBmdW5jdGlvbiBjbG9zZW5lc3Mobm9kZSkge1xuICAgICAgICBpZiAobWF4Q2xvc2VuZXNzID09IDApIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RyaW5nKG5vZGUpKSB7XG4gICAgICAgICAgLy8gZnJvbSBpcyBhIHNlbGVjdG9yIHN0cmluZ1xuICAgICAgICAgIG5vZGUgPSBjeS5maWx0ZXIobm9kZSlbMF0uaWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBmcm9tIGlzIGEgbm9kZVxuICAgICAgICAgIG5vZGUgPSBub2RlLmlkKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsb3NlbmVzc2VzW25vZGVdIC8gbWF4Q2xvc2VuZXNzO1xuICAgICAgfVxuICAgIH07XG4gIH0sXG4gIC8vIEltcGxlbWVudGVkIGZyb20gcHNldWRvY29kZSBmcm9tIHdpa2lwZWRpYVxuICBjbG9zZW5lc3NDZW50cmFsaXR5OiBmdW5jdGlvbiBjbG9zZW5lc3NDZW50cmFsaXR5KG9wdGlvbnMpIHtcbiAgICB2YXIgX2RlZmF1bHRzMiA9IGRlZmF1bHRzJGUob3B0aW9ucyksXG4gICAgICByb290ID0gX2RlZmF1bHRzMi5yb290LFxuICAgICAgd2VpZ2h0ID0gX2RlZmF1bHRzMi53ZWlnaHQsXG4gICAgICBkaXJlY3RlZCA9IF9kZWZhdWx0czIuZGlyZWN0ZWQsXG4gICAgICBoYXJtb25pYyA9IF9kZWZhdWx0czIuaGFybW9uaWM7XG4gICAgcm9vdCA9IHRoaXMuZmlsdGVyKHJvb3QpWzBdO1xuXG4gICAgLy8gd2UgbmVlZCBkaXN0YW5jZSBmcm9tIHRoaXMgbm9kZSB0byBldmVyeSBvdGhlciBub2RlXG4gICAgdmFyIGRpamtzdHJhID0gdGhpcy5kaWprc3RyYSh7XG4gICAgICByb290OiByb290LFxuICAgICAgd2VpZ2h0OiB3ZWlnaHQsXG4gICAgICBkaXJlY3RlZDogZGlyZWN0ZWRcbiAgICB9KTtcbiAgICB2YXIgdG90YWxEaXN0YW5jZSA9IDA7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBuID0gbm9kZXNbaV07XG4gICAgICBpZiAoIW4uc2FtZShyb290KSkge1xuICAgICAgICB2YXIgZCA9IGRpamtzdHJhLmRpc3RhbmNlVG8obik7XG4gICAgICAgIGlmIChoYXJtb25pYykge1xuICAgICAgICAgIHRvdGFsRGlzdGFuY2UgKz0gMSAvIGQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG90YWxEaXN0YW5jZSArPSBkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXJtb25pYyA/IHRvdGFsRGlzdGFuY2UgOiAxIC8gdG90YWxEaXN0YW5jZTtcbiAgfSAvLyBjbG9zZW5lc3NDZW50cmFsaXR5XG59OyAvLyBlbGVzZm5cblxuLy8gbmljZSwgc2hvcnQgbWF0aGVtYXRpY2FsIGFsaWFzXG5lbGVzZm4kbS5jYyA9IGVsZXNmbiRtLmNsb3NlbmVzc0NlbnRyYWxpdHk7XG5lbGVzZm4kbS5jY24gPSBlbGVzZm4kbS5jbG9zZW5lc3NDZW50cmFsaXR5Tm9ybWFsaXNlZCA9IGVsZXNmbiRtLmNsb3NlbmVzc0NlbnRyYWxpdHlOb3JtYWxpemVkO1xuXG52YXIgZGVmYXVsdHMkZCA9IGRlZmF1bHRzJGcoe1xuICB3ZWlnaHQ6IG51bGwsXG4gIGRpcmVjdGVkOiBmYWxzZVxufSk7XG52YXIgZWxlc2ZuJGwgPSB7XG4gIC8vIEltcGxlbWVudGVkIGZyb20gdGhlIGFsZ29yaXRobSBpbiB0aGUgcGFwZXIgXCJPbiBWYXJpYW50cyBvZiBTaG9ydGVzdC1QYXRoIEJldHdlZW5uZXNzIENlbnRyYWxpdHkgYW5kIHRoZWlyIEdlbmVyaWMgQ29tcHV0YXRpb25cIiBieSBVbHJpayBCcmFuZGVzXG4gIGJldHdlZW5uZXNzQ2VudHJhbGl0eTogZnVuY3Rpb24gYmV0d2Vlbm5lc3NDZW50cmFsaXR5KG9wdGlvbnMpIHtcbiAgICB2YXIgX2RlZmF1bHRzID0gZGVmYXVsdHMkZChvcHRpb25zKSxcbiAgICAgIGRpcmVjdGVkID0gX2RlZmF1bHRzLmRpcmVjdGVkLFxuICAgICAgd2VpZ2h0ID0gX2RlZmF1bHRzLndlaWdodDtcbiAgICB2YXIgd2VpZ2h0ZWQgPSB3ZWlnaHQgIT0gbnVsbDtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG5cbiAgICAvLyBzdGFydGluZ1xuICAgIHZhciBWID0gdGhpcy5ub2RlcygpO1xuICAgIHZhciBBID0ge307XG4gICAgdmFyIF9DID0ge307XG4gICAgdmFyIG1heCA9IDA7XG4gICAgdmFyIEMgPSB7XG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbCkge1xuICAgICAgICBfQ1trZXldID0gdmFsO1xuICAgICAgICBpZiAodmFsID4gbWF4KSB7XG4gICAgICAgICAgbWF4ID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICAgIHJldHVybiBfQ1trZXldO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBBIGNvbnRhaW5zIHRoZSBuZWlnaGJvcmhvb2RzIG9mIGV2ZXJ5IG5vZGVcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IFYubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2ID0gVltpXTtcbiAgICAgIHZhciB2aWQgPSB2LmlkKCk7XG4gICAgICBpZiAoZGlyZWN0ZWQpIHtcbiAgICAgICAgQVt2aWRdID0gdi5vdXRnb2VycygpLm5vZGVzKCk7IC8vIGdldCBvdXRnb2VycyBvZiBldmVyeSBub2RlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBBW3ZpZF0gPSB2Lm9wZW5OZWlnaGJvcmhvb2QoKS5ub2RlcygpOyAvLyBnZXQgbmVpZ2hib3JzIG9mIGV2ZXJ5IG5vZGVcbiAgICAgIH1cblxuICAgICAgQy5zZXQodmlkLCAwKTtcbiAgICB9XG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3Aocykge1xuICAgICAgdmFyIHNpZCA9IFZbc10uaWQoKTtcbiAgICAgIHZhciBTID0gW107IC8vIHN0YWNrXG4gICAgICB2YXIgUCA9IHt9O1xuICAgICAgdmFyIGcgPSB7fTtcbiAgICAgIHZhciBkID0ge307XG4gICAgICB2YXIgUSA9IG5ldyBIZWFwX19kZWZhdWx0W1wiZGVmYXVsdFwiXShmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gZFthXSAtIGRbYl07XG4gICAgICB9KTsgLy8gcXVldWVcblxuICAgICAgLy8gaW5pdCBkaWN0aW9uYXJpZXNcbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBWLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgX3ZpZCA9IFZbX2ldLmlkKCk7XG4gICAgICAgIFBbX3ZpZF0gPSBbXTtcbiAgICAgICAgZ1tfdmlkXSA9IDA7XG4gICAgICAgIGRbX3ZpZF0gPSBJbmZpbml0eTtcbiAgICAgIH1cbiAgICAgIGdbc2lkXSA9IDE7IC8vIHNpZ21hXG4gICAgICBkW3NpZF0gPSAwOyAvLyBkaXN0YW5jZSB0byBzXG5cbiAgICAgIFEucHVzaChzaWQpO1xuICAgICAgd2hpbGUgKCFRLmVtcHR5KCkpIHtcbiAgICAgICAgdmFyIF92ID0gUS5wb3AoKTtcbiAgICAgICAgUy5wdXNoKF92KTtcbiAgICAgICAgaWYgKHdlaWdodGVkKSB7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBBW192XS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHcgPSBBW192XVtqXTtcbiAgICAgICAgICAgIHZhciB2RWxlID0gY3kuZ2V0RWxlbWVudEJ5SWQoX3YpO1xuICAgICAgICAgICAgdmFyIGVkZ2UgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAodkVsZS5lZGdlc1RvKHcpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgZWRnZSA9IHZFbGUuZWRnZXNUbyh3KVswXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVkZ2UgPSB3LmVkZ2VzVG8odkVsZSlbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZWRnZVdlaWdodCA9IHdlaWdodChlZGdlKTtcbiAgICAgICAgICAgIHcgPSB3LmlkKCk7XG4gICAgICAgICAgICBpZiAoZFt3XSA+IGRbX3ZdICsgZWRnZVdlaWdodCkge1xuICAgICAgICAgICAgICBkW3ddID0gZFtfdl0gKyBlZGdlV2VpZ2h0O1xuICAgICAgICAgICAgICBpZiAoUS5ub2Rlcy5pbmRleE9mKHcpIDwgMCkge1xuICAgICAgICAgICAgICAgIC8vaWYgdyBpcyBub3QgaW4gUVxuICAgICAgICAgICAgICAgIFEucHVzaCh3KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgcG9zaXRpb24gaWYgdyBpcyBpbiBRXG4gICAgICAgICAgICAgICAgUS51cGRhdGVJdGVtKHcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGdbd10gPSAwO1xuICAgICAgICAgICAgICBQW3ddID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZFt3XSA9PSBkW192XSArIGVkZ2VXZWlnaHQpIHtcbiAgICAgICAgICAgICAgZ1t3XSA9IGdbd10gKyBnW192XTtcbiAgICAgICAgICAgICAgUFt3XS5wdXNoKF92KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IEFbX3ZdLmxlbmd0aDsgX2orKykge1xuICAgICAgICAgICAgdmFyIF93ID0gQVtfdl1bX2pdLmlkKCk7XG4gICAgICAgICAgICBpZiAoZFtfd10gPT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgICAgUS5wdXNoKF93KTtcbiAgICAgICAgICAgICAgZFtfd10gPSBkW192XSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZFtfd10gPT0gZFtfdl0gKyAxKSB7XG4gICAgICAgICAgICAgIGdbX3ddID0gZ1tfd10gKyBnW192XTtcbiAgICAgICAgICAgICAgUFtfd10ucHVzaChfdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgZSA9IHt9O1xuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgVi5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIGVbVltfaTJdLmlkKCldID0gMDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChTLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIF93MiA9IFMucG9wKCk7XG4gICAgICAgIGZvciAodmFyIF9qMiA9IDA7IF9qMiA8IFBbX3cyXS5sZW5ndGg7IF9qMisrKSB7XG4gICAgICAgICAgdmFyIF92MiA9IFBbX3cyXVtfajJdO1xuICAgICAgICAgIGVbX3YyXSA9IGVbX3YyXSArIGdbX3YyXSAvIGdbX3cyXSAqICgxICsgZVtfdzJdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX3cyICE9IFZbc10uaWQoKSkge1xuICAgICAgICAgIEMuc2V0KF93MiwgQy5nZXQoX3cyKSArIGVbX3cyXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGZvciAodmFyIHMgPSAwOyBzIDwgVi5sZW5ndGg7IHMrKykge1xuICAgICAgX2xvb3Aocyk7XG4gICAgfVxuICAgIHZhciByZXQgPSB7XG4gICAgICBiZXR3ZWVubmVzczogZnVuY3Rpb24gYmV0d2Vlbm5lc3Mobm9kZSkge1xuICAgICAgICB2YXIgaWQgPSBjeS5jb2xsZWN0aW9uKG5vZGUpLmlkKCk7XG4gICAgICAgIHJldHVybiBDLmdldChpZCk7XG4gICAgICB9LFxuICAgICAgYmV0d2Vlbm5lc3NOb3JtYWxpemVkOiBmdW5jdGlvbiBiZXR3ZWVubmVzc05vcm1hbGl6ZWQobm9kZSkge1xuICAgICAgICBpZiAobWF4ID09IDApIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaWQgPSBjeS5jb2xsZWN0aW9uKG5vZGUpLmlkKCk7XG4gICAgICAgIHJldHVybiBDLmdldChpZCkgLyBtYXg7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIGFsaWFzXG4gICAgcmV0LmJldHdlZW5uZXNzTm9ybWFsaXNlZCA9IHJldC5iZXR3ZWVubmVzc05vcm1hbGl6ZWQ7XG4gICAgcmV0dXJuIHJldDtcbiAgfSAvLyBiZXR3ZWVubmVzc0NlbnRyYWxpdHlcbn07IC8vIGVsZXNmblxuXG4vLyBuaWNlLCBzaG9ydCBtYXRoZW1hdGljYWwgYWxpYXNcbmVsZXNmbiRsLmJjID0gZWxlc2ZuJGwuYmV0d2Vlbm5lc3NDZW50cmFsaXR5O1xuXG4vLyBJbXBsZW1lbnRlZCBieSBab2UgWGkgQHpvZXhpIGZvciBHU09DIDIwMTZcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBkZWZhdWx0cyRjID0gZGVmYXVsdHMkZyh7XG4gIGV4cGFuZEZhY3RvcjogMixcbiAgLy8gYWZmZWN0cyB0aW1lIG9mIGNvbXB1dGF0aW9uIGFuZCBjbHVzdGVyIGdyYW51bGFyaXR5IHRvIHNvbWUgZXh0ZW50OiBNICogTVxuICBpbmZsYXRlRmFjdG9yOiAyLFxuICAvLyBhZmZlY3RzIGNsdXN0ZXIgZ3JhbnVsYXJpdHkgKHRoZSBncmVhdGVyIHRoZSB2YWx1ZSwgdGhlIG1vcmUgY2x1c3RlcnMpOiBNKGksaikgLyBFKGopXG4gIG11bHRGYWN0b3I6IDEsXG4gIC8vIG9wdGlvbmFsIHNlbGYgbG9vcHMgZm9yIGVhY2ggbm9kZS4gVXNlIGEgbmV1dHJhbCB2YWx1ZSB0byBpbXByb3ZlIGNsdXN0ZXIgY29tcHV0YXRpb25zLlxuICBtYXhJdGVyYXRpb25zOiAyMCxcbiAgLy8gbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyBvZiB0aGUgTUNMIGFsZ29yaXRobSBpbiBhIHNpbmdsZSBydW5cbiAgYXR0cmlidXRlczogW1xuICAvLyBhdHRyaWJ1dGVzL2ZlYXR1cmVzIHVzZWQgdG8gZ3JvdXAgbm9kZXMsIGllLiBzaW1pbGFyaXR5IHZhbHVlcyBiZXR3ZWVuIG5vZGVzXG4gIGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1dXG59KTtcbi8qIGVzbGludC1lbmFibGUgKi9cblxudmFyIHNldE9wdGlvbnMkMyA9IGZ1bmN0aW9uIHNldE9wdGlvbnMob3B0aW9ucykge1xuICByZXR1cm4gZGVmYXVsdHMkYyhvcHRpb25zKTtcbn07XG4vKiBlc2xpbnQtZW5hYmxlICovXG5cbnZhciBnZXRTaW1pbGFyaXR5JDEgPSBmdW5jdGlvbiBnZXRTaW1pbGFyaXR5KGVkZ2UsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIHRvdGFsID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdG90YWwgKz0gYXR0cmlidXRlc1tpXShlZGdlKTtcbiAgfVxuICByZXR1cm4gdG90YWw7XG59O1xudmFyIGFkZExvb3BzID0gZnVuY3Rpb24gYWRkTG9vcHMoTSwgbiwgdmFsKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgTVtpICogbiArIGldID0gdmFsO1xuICB9XG59O1xudmFyIG5vcm1hbGl6ZSA9IGZ1bmN0aW9uIG5vcm1hbGl6ZShNLCBuKSB7XG4gIHZhciBzdW07XG4gIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG47IGNvbCsrKSB7XG4gICAgc3VtID0gMDtcbiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBuOyByb3crKykge1xuICAgICAgc3VtICs9IE1bcm93ICogbiArIGNvbF07XG4gICAgfVxuICAgIGZvciAodmFyIF9yb3cgPSAwOyBfcm93IDwgbjsgX3JvdysrKSB7XG4gICAgICBNW19yb3cgKiBuICsgY29sXSA9IE1bX3JvdyAqIG4gKyBjb2xdIC8gc3VtO1xuICAgIH1cbiAgfVxufTtcblxuLy8gVE9ETzogYmxvY2tlZCBtYXRyaXggbXVsdGlwbGljYXRpb24/XG52YXIgbW11bHQgPSBmdW5jdGlvbiBtbXVsdChBLCBCLCBuKSB7XG4gIHZhciBDID0gbmV3IEFycmF5KG4gKiBuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgQ1tpICogbiArIGpdID0gMDtcbiAgICB9XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBuOyBrKyspIHtcbiAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBuOyBfaisrKSB7XG4gICAgICAgIENbaSAqIG4gKyBfal0gKz0gQVtpICogbiArIGtdICogQltrICogbiArIF9qXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIEM7XG59O1xudmFyIGV4cGFuZCA9IGZ1bmN0aW9uIGV4cGFuZChNLCBuLCBleHBhbmRGYWN0b3IgLyoqIHBvd2VyICoqLykge1xuICB2YXIgX00gPSBNLnNsaWNlKDApO1xuICBmb3IgKHZhciBwID0gMTsgcCA8IGV4cGFuZEZhY3RvcjsgcCsrKSB7XG4gICAgTSA9IG1tdWx0KE0sIF9NLCBuKTtcbiAgfVxuICByZXR1cm4gTTtcbn07XG52YXIgaW5mbGF0ZSA9IGZ1bmN0aW9uIGluZmxhdGUoTSwgbiwgaW5mbGF0ZUZhY3RvciAvKiogciAqKi8pIHtcbiAgdmFyIF9NID0gbmV3IEFycmF5KG4gKiBuKTtcblxuICAvLyBNKGksaikgXiBpbmZsYXRlUG93ZXJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuICogbjsgaSsrKSB7XG4gICAgX01baV0gPSBNYXRoLnBvdyhNW2ldLCBpbmZsYXRlRmFjdG9yKTtcbiAgfVxuICBub3JtYWxpemUoX00sIG4pO1xuICByZXR1cm4gX007XG59O1xudmFyIGhhc0NvbnZlcmdlZCA9IGZ1bmN0aW9uIGhhc0NvbnZlcmdlZChNLCBfTSwgbjIsIHJvdW5kRmFjdG9yKSB7XG4gIC8vIENoZWNrIHRoYXQgYm90aCBtYXRyaWNlcyBoYXZlIHRoZSBzYW1lIGVsZW1lbnRzIChpLGopXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjI7IGkrKykge1xuICAgIHZhciB2MSA9IE1hdGgucm91bmQoTVtpXSAqIE1hdGgucG93KDEwLCByb3VuZEZhY3RvcikpIC8gTWF0aC5wb3coMTAsIHJvdW5kRmFjdG9yKTsgLy8gdHJ1bmNhdGUgdG8gJ3JvdW5kRmFjdG9yJyBkZWNpbWFsIHBsYWNlc1xuICAgIHZhciB2MiA9IE1hdGgucm91bmQoX01baV0gKiBNYXRoLnBvdygxMCwgcm91bmRGYWN0b3IpKSAvIE1hdGgucG93KDEwLCByb3VuZEZhY3Rvcik7XG4gICAgaWYgKHYxICE9PSB2Mikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgYXNzaWduJDIgPSBmdW5jdGlvbiBhc3NpZ24oTSwgbiwgbm9kZXMsIGN5KSB7XG4gIHZhciBjbHVzdGVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIHZhciBjbHVzdGVyID0gW107XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBuOyBqKyspIHtcbiAgICAgIC8vIFJvdy13aXNlIGF0dHJhY3RvcnMgYW5kIGVsZW1lbnRzIHRoYXQgdGhleSBhdHRyYWN0IGJlbG9uZyBpbiBzYW1lIGNsdXN0ZXJcbiAgICAgIGlmIChNYXRoLnJvdW5kKE1baSAqIG4gKyBqXSAqIDEwMDApIC8gMTAwMCA+IDApIHtcbiAgICAgICAgY2x1c3Rlci5wdXNoKG5vZGVzW2pdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNsdXN0ZXIubGVuZ3RoICE9PSAwKSB7XG4gICAgICBjbHVzdGVycy5wdXNoKGN5LmNvbGxlY3Rpb24oY2x1c3RlcikpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xudmFyIGlzRHVwbGljYXRlID0gZnVuY3Rpb24gaXNEdXBsaWNhdGUoYzEsIGMyKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYzEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWMyW2ldIHx8IGMxW2ldLmlkKCkgIT09IGMyW2ldLmlkKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIHJlbW92ZUR1cGxpY2F0ZXMgPSBmdW5jdGlvbiByZW1vdmVEdXBsaWNhdGVzKGNsdXN0ZXJzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNsdXN0ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoaSAhPSBqICYmIGlzRHVwbGljYXRlKGNsdXN0ZXJzW2ldLCBjbHVzdGVyc1tqXSkpIHtcbiAgICAgICAgY2x1c3RlcnMuc3BsaWNlKGosIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xudmFyIG1hcmtvdkNsdXN0ZXJpbmcgPSBmdW5jdGlvbiBtYXJrb3ZDbHVzdGVyaW5nKG9wdGlvbnMpIHtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICB2YXIgZWRnZXMgPSB0aGlzLmVkZ2VzKCk7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcblxuICAvLyBTZXQgcGFyYW1ldGVycyBvZiBhbGdvcml0aG06XG4gIHZhciBvcHRzID0gc2V0T3B0aW9ucyQzKG9wdGlvbnMpO1xuXG4gIC8vIE1hcCBlYWNoIG5vZGUgdG8gaXRzIHBvc2l0aW9uIGluIG5vZGUgYXJyYXlcbiAgdmFyIGlkMnBvc2l0aW9uID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZDJwb3NpdGlvbltub2Rlc1tpXS5pZCgpXSA9IGk7XG4gIH1cblxuICAvLyBHZW5lcmF0ZSBzdG9jaGFzdGljIG1hdHJpeCBNIGZyb20gaW5wdXQgZ3JhcGggRyAoc2hvdWxkIGJlIHN5bW1ldHJpYy91bmRpcmVjdGVkKVxuICB2YXIgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICBuMiA9IG4gKiBuO1xuICB2YXIgTSA9IG5ldyBBcnJheShuMiksXG4gICAgX007XG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBuMjsgX2krKykge1xuICAgIE1bX2ldID0gMDtcbiAgfVxuICBmb3IgKHZhciBlID0gMDsgZSA8IGVkZ2VzLmxlbmd0aDsgZSsrKSB7XG4gICAgdmFyIGVkZ2UgPSBlZGdlc1tlXTtcbiAgICB2YXIgX2kyID0gaWQycG9zaXRpb25bZWRnZS5zb3VyY2UoKS5pZCgpXTtcbiAgICB2YXIgaiA9IGlkMnBvc2l0aW9uW2VkZ2UudGFyZ2V0KCkuaWQoKV07XG4gICAgdmFyIHNpbSA9IGdldFNpbWlsYXJpdHkkMShlZGdlLCBvcHRzLmF0dHJpYnV0ZXMpO1xuICAgIE1bX2kyICogbiArIGpdICs9IHNpbTsgLy8gRyBzaG91bGQgYmUgc3ltbWV0cmljIGFuZCB1bmRpcmVjdGVkXG4gICAgTVtqICogbiArIF9pMl0gKz0gc2ltO1xuICB9XG5cbiAgLy8gQmVnaW4gTWFya292IGNsdXN0ZXIgYWxnb3JpdGhtXG5cbiAgLy8gU3RlcCAxOiBBZGQgc2VsZiBsb29wcyB0byBlYWNoIG5vZGUsIGllLiBhZGQgbXVsdEZhY3RvciB0byBtYXRyaXggZGlhZ29uYWxcbiAgYWRkTG9vcHMoTSwgbiwgb3B0cy5tdWx0RmFjdG9yKTtcblxuICAvLyBTdGVwIDI6IE0gPSBub3JtYWxpemUoIE0gKTtcbiAgbm9ybWFsaXplKE0sIG4pO1xuICB2YXIgaXNTdGlsbE1vdmluZyA9IHRydWU7XG4gIHZhciBpdGVyYXRpb25zID0gMDtcbiAgd2hpbGUgKGlzU3RpbGxNb3ZpbmcgJiYgaXRlcmF0aW9ucyA8IG9wdHMubWF4SXRlcmF0aW9ucykge1xuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTtcblxuICAgIC8vIFN0ZXAgMzpcbiAgICBfTSA9IGV4cGFuZChNLCBuLCBvcHRzLmV4cGFuZEZhY3Rvcik7XG5cbiAgICAvLyBTdGVwIDQ6XG4gICAgTSA9IGluZmxhdGUoX00sIG4sIG9wdHMuaW5mbGF0ZUZhY3Rvcik7XG5cbiAgICAvLyBTdGVwIDU6IGNoZWNrIHRvIHNlZSBpZiB+c3RlYWR5IHN0YXRlIGhhcyBiZWVuIHJlYWNoZWRcbiAgICBpZiAoIWhhc0NvbnZlcmdlZChNLCBfTSwgbjIsIDQpKSB7XG4gICAgICBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgaXRlcmF0aW9ucysrO1xuICB9XG5cbiAgLy8gQnVpbGQgY2x1c3RlcnMgZnJvbSBtYXRyaXhcbiAgdmFyIGNsdXN0ZXJzID0gYXNzaWduJDIoTSwgbiwgbm9kZXMsIGN5KTtcblxuICAvLyBSZW1vdmUgZHVwbGljYXRlIGNsdXN0ZXJzIGR1ZSB0byBzeW1tZXRyeSBvZiBncmFwaCBhbmQgTSBtYXRyaXhcbiAgY2x1c3RlcnMgPSByZW1vdmVEdXBsaWNhdGVzKGNsdXN0ZXJzKTtcbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcbnZhciBtYXJrb3ZDbHVzdGVyaW5nJDEgPSB7XG4gIG1hcmtvdkNsdXN0ZXJpbmc6IG1hcmtvdkNsdXN0ZXJpbmcsXG4gIG1jbDogbWFya292Q2x1c3RlcmluZ1xufTtcblxuLy8gQ29tbW9uIGRpc3RhbmNlIG1ldHJpY3MgZm9yIGNsdXN0ZXJpbmcgYWxnb3JpdGhtc1xudmFyIGlkZW50aXR5ID0gZnVuY3Rpb24gaWRlbnRpdHkoeCkge1xuICByZXR1cm4geDtcbn07XG52YXIgYWJzRGlmZiA9IGZ1bmN0aW9uIGFic0RpZmYocCwgcSkge1xuICByZXR1cm4gTWF0aC5hYnMocSAtIHApO1xufTtcbnZhciBhZGRBYnNEaWZmID0gZnVuY3Rpb24gYWRkQWJzRGlmZih0b3RhbCwgcCwgcSkge1xuICByZXR1cm4gdG90YWwgKyBhYnNEaWZmKHAsIHEpO1xufTtcbnZhciBhZGRTcXVhcmVkRGlmZiA9IGZ1bmN0aW9uIGFkZFNxdWFyZWREaWZmKHRvdGFsLCBwLCBxKSB7XG4gIHJldHVybiB0b3RhbCArIE1hdGgucG93KHEgLSBwLCAyKTtcbn07XG52YXIgc3FydCA9IGZ1bmN0aW9uIHNxcnQoeCkge1xuICByZXR1cm4gTWF0aC5zcXJ0KHgpO1xufTtcbnZhciBtYXhBYnNEaWZmID0gZnVuY3Rpb24gbWF4QWJzRGlmZihjdXJyZW50TWF4LCBwLCBxKSB7XG4gIHJldHVybiBNYXRoLm1heChjdXJyZW50TWF4LCBhYnNEaWZmKHAsIHEpKTtcbn07XG52YXIgZ2V0RGlzdGFuY2UgPSBmdW5jdGlvbiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIGluaXQsIHZpc2l0KSB7XG4gIHZhciBwb3N0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiBpZGVudGl0eTtcbiAgdmFyIHJldCA9IGluaXQ7XG4gIHZhciBwLCBxO1xuICBmb3IgKHZhciBkaW0gPSAwOyBkaW0gPCBsZW5ndGg7IGRpbSsrKSB7XG4gICAgcCA9IGdldFAoZGltKTtcbiAgICBxID0gZ2V0UShkaW0pO1xuICAgIHJldCA9IHZpc2l0KHJldCwgcCwgcSk7XG4gIH1cbiAgcmV0dXJuIHBvc3QocmV0KTtcbn07XG52YXIgZGlzdGFuY2VzID0ge1xuICBldWNsaWRlYW46IGZ1bmN0aW9uIGV1Y2xpZGVhbihsZW5ndGgsIGdldFAsIGdldFEpIHtcbiAgICBpZiAobGVuZ3RoID49IDIpIHtcbiAgICAgIHJldHVybiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIDAsIGFkZFNxdWFyZWREaWZmLCBzcXJ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZm9yIHNpbmdsZSBhdHRyIGNhc2UsIG1vcmUgZWZmaWNpZW50IHRvIGF2b2lkIHNxcnRcbiAgICAgIHJldHVybiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIDAsIGFkZEFic0RpZmYpO1xuICAgIH1cbiAgfSxcbiAgc3F1YXJlZEV1Y2xpZGVhbjogZnVuY3Rpb24gc3F1YXJlZEV1Y2xpZGVhbihsZW5ndGgsIGdldFAsIGdldFEpIHtcbiAgICByZXR1cm4gZ2V0RGlzdGFuY2UobGVuZ3RoLCBnZXRQLCBnZXRRLCAwLCBhZGRTcXVhcmVkRGlmZik7XG4gIH0sXG4gIG1hbmhhdHRhbjogZnVuY3Rpb24gbWFuaGF0dGFuKGxlbmd0aCwgZ2V0UCwgZ2V0USkge1xuICAgIHJldHVybiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIDAsIGFkZEFic0RpZmYpO1xuICB9LFxuICBtYXg6IGZ1bmN0aW9uIG1heChsZW5ndGgsIGdldFAsIGdldFEpIHtcbiAgICByZXR1cm4gZ2V0RGlzdGFuY2UobGVuZ3RoLCBnZXRQLCBnZXRRLCAtSW5maW5pdHksIG1heEFic0RpZmYpO1xuICB9XG59O1xuXG4vLyBpbiBjYXNlIHRoZSB1c2VyIGFjY2lkZW50YWxseSBkb2Vzbid0IHVzZSBjYW1lbCBjYXNlXG5kaXN0YW5jZXNbJ3NxdWFyZWQtZXVjbGlkZWFuJ10gPSBkaXN0YW5jZXNbJ3NxdWFyZWRFdWNsaWRlYW4nXTtcbmRpc3RhbmNlc1snc3F1YXJlZGV1Y2xpZGVhbiddID0gZGlzdGFuY2VzWydzcXVhcmVkRXVjbGlkZWFuJ107XG5mdW5jdGlvbiBjbHVzdGVyaW5nRGlzdGFuY2UgKG1ldGhvZCwgbGVuZ3RoLCBnZXRQLCBnZXRRLCBub2RlUCwgbm9kZVEpIHtcbiAgdmFyIGltcGw7XG4gIGlmIChmbiQ2KG1ldGhvZCkpIHtcbiAgICBpbXBsID0gbWV0aG9kO1xuICB9IGVsc2Uge1xuICAgIGltcGwgPSBkaXN0YW5jZXNbbWV0aG9kXSB8fCBkaXN0YW5jZXMuZXVjbGlkZWFuO1xuICB9XG4gIGlmIChsZW5ndGggPT09IDAgJiYgZm4kNihtZXRob2QpKSB7XG4gICAgcmV0dXJuIGltcGwobm9kZVAsIG5vZGVRKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW1wbChsZW5ndGgsIGdldFAsIGdldFEsIG5vZGVQLCBub2RlUSk7XG4gIH1cbn1cblxudmFyIGRlZmF1bHRzJGIgPSBkZWZhdWx0cyRnKHtcbiAgazogMixcbiAgbTogMixcbiAgc2Vuc2l0aXZpdHlUaHJlc2hvbGQ6IDAuMDAwMSxcbiAgZGlzdGFuY2U6ICdldWNsaWRlYW4nLFxuICBtYXhJdGVyYXRpb25zOiAxMCxcbiAgYXR0cmlidXRlczogW10sXG4gIHRlc3RNb2RlOiBmYWxzZSxcbiAgdGVzdENlbnRyb2lkczogbnVsbFxufSk7XG52YXIgc2V0T3B0aW9ucyQyID0gZnVuY3Rpb24gc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gIHJldHVybiBkZWZhdWx0cyRiKG9wdGlvbnMpO1xufTtcblxudmFyIGdldERpc3QgPSBmdW5jdGlvbiBnZXREaXN0KHR5cGUsIG5vZGUsIGNlbnRyb2lkLCBhdHRyaWJ1dGVzLCBtb2RlKSB7XG4gIHZhciBub05vZGVQID0gbW9kZSAhPT0gJ2tNZWRvaWRzJztcbiAgdmFyIGdldFAgPSBub05vZGVQID8gZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gY2VudHJvaWRbaV07XG4gIH0gOiBmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBhdHRyaWJ1dGVzW2ldKGNlbnRyb2lkKTtcbiAgfTtcbiAgdmFyIGdldFEgPSBmdW5jdGlvbiBnZXRRKGkpIHtcbiAgICByZXR1cm4gYXR0cmlidXRlc1tpXShub2RlKTtcbiAgfTtcbiAgdmFyIG5vZGVQID0gY2VudHJvaWQ7XG4gIHZhciBub2RlUSA9IG5vZGU7XG4gIHJldHVybiBjbHVzdGVyaW5nRGlzdGFuY2UodHlwZSwgYXR0cmlidXRlcy5sZW5ndGgsIGdldFAsIGdldFEsIG5vZGVQLCBub2RlUSk7XG59O1xudmFyIHJhbmRvbUNlbnRyb2lkcyA9IGZ1bmN0aW9uIHJhbmRvbUNlbnRyb2lkcyhub2RlcywgaywgYXR0cmlidXRlcykge1xuICB2YXIgbmRpbSA9IGF0dHJpYnV0ZXMubGVuZ3RoO1xuICB2YXIgbWluID0gbmV3IEFycmF5KG5kaW0pO1xuICB2YXIgbWF4ID0gbmV3IEFycmF5KG5kaW0pO1xuICB2YXIgY2VudHJvaWRzID0gbmV3IEFycmF5KGspO1xuICB2YXIgY2VudHJvaWQgPSBudWxsO1xuXG4gIC8vIEZpbmQgbWluLCBtYXggdmFsdWVzIGZvciBlYWNoIGF0dHJpYnV0ZSBkaW1lbnNpb25cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZGltOyBpKyspIHtcbiAgICBtaW5baV0gPSBub2Rlcy5taW4oYXR0cmlidXRlc1tpXSkudmFsdWU7XG4gICAgbWF4W2ldID0gbm9kZXMubWF4KGF0dHJpYnV0ZXNbaV0pLnZhbHVlO1xuICB9XG5cbiAgLy8gQnVpbGQgayBjZW50cm9pZHMsIGVhY2ggcmVwcmVzZW50ZWQgYXMgYW4gbi1kaW0gZmVhdHVyZSB2ZWN0b3JcbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBrOyBjKyspIHtcbiAgICBjZW50cm9pZCA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBuZGltOyBfaSsrKSB7XG4gICAgICBjZW50cm9pZFtfaV0gPSBNYXRoLnJhbmRvbSgpICogKG1heFtfaV0gLSBtaW5bX2ldKSArIG1pbltfaV07IC8vIHJhbmRvbSBpbml0aWFsIHZhbHVlXG4gICAgfVxuXG4gICAgY2VudHJvaWRzW2NdID0gY2VudHJvaWQ7XG4gIH1cbiAgcmV0dXJuIGNlbnRyb2lkcztcbn07XG52YXIgY2xhc3NpZnkgPSBmdW5jdGlvbiBjbGFzc2lmeShub2RlLCBjZW50cm9pZHMsIGRpc3RhbmNlLCBhdHRyaWJ1dGVzLCB0eXBlKSB7XG4gIHZhciBtaW4gPSBJbmZpbml0eTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjZW50cm9pZHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGlzdCA9IGdldERpc3QoZGlzdGFuY2UsIG5vZGUsIGNlbnRyb2lkc1tpXSwgYXR0cmlidXRlcywgdHlwZSk7XG4gICAgaWYgKGRpc3QgPCBtaW4pIHtcbiAgICAgIG1pbiA9IGRpc3Q7XG4gICAgICBpbmRleCA9IGk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbmRleDtcbn07XG52YXIgYnVpbGRDbHVzdGVyID0gZnVuY3Rpb24gYnVpbGRDbHVzdGVyKGNlbnRyb2lkLCBub2RlcywgYXNzaWdubWVudCkge1xuICB2YXIgY2x1c3RlciA9IFtdO1xuICB2YXIgbm9kZSA9IG51bGw7XG4gIGZvciAodmFyIG4gPSAwOyBuIDwgbm9kZXMubGVuZ3RoOyBuKyspIHtcbiAgICBub2RlID0gbm9kZXNbbl07XG4gICAgaWYgKGFzc2lnbm1lbnRbbm9kZS5pZCgpXSA9PT0gY2VudHJvaWQpIHtcbiAgICAgIC8vY29uc29sZS5sb2coXCJOb2RlIFwiICsgbm9kZS5pZCgpICsgXCIgaXMgYXNzb2NpYXRlZCB3aXRoIG1lZG9pZCAjOiBcIiArIG0pO1xuICAgICAgY2x1c3Rlci5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2x1c3Rlcjtcbn07XG52YXIgaGF2ZVZhbHVlc0NvbnZlcmdlZCA9IGZ1bmN0aW9uIGhhdmVWYWx1ZXNDb252ZXJnZWQodjEsIHYyLCBzZW5zaXRpdml0eVRocmVzaG9sZCkge1xuICByZXR1cm4gTWF0aC5hYnModjIgLSB2MSkgPD0gc2Vuc2l0aXZpdHlUaHJlc2hvbGQ7XG59O1xudmFyIGhhdmVNYXRyaWNlc0NvbnZlcmdlZCA9IGZ1bmN0aW9uIGhhdmVNYXRyaWNlc0NvbnZlcmdlZCh2MSwgdjIsIHNlbnNpdGl2aXR5VGhyZXNob2xkKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdjEubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHYxW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgZGlmZiA9IE1hdGguYWJzKHYxW2ldW2pdIC0gdjJbaV1bal0pO1xuICAgICAgaWYgKGRpZmYgPiBzZW5zaXRpdml0eVRocmVzaG9sZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBzZWVuQmVmb3JlID0gZnVuY3Rpb24gc2VlbkJlZm9yZShub2RlLCBtZWRvaWRzLCBuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgaWYgKG5vZGUgPT09IG1lZG9pZHNbaV0pIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG52YXIgcmFuZG9tTWVkb2lkcyA9IGZ1bmN0aW9uIHJhbmRvbU1lZG9pZHMobm9kZXMsIGspIHtcbiAgdmFyIG1lZG9pZHMgPSBuZXcgQXJyYXkoayk7XG5cbiAgLy8gRm9yIHNtYWxsIGRhdGEgc2V0cywgdGhlIHByb2JhYmlsaXR5IG9mIG1lZG9pZCBjb25mbGljdCBpcyBncmVhdGVyLFxuICAvLyBzbyB3ZSBuZWVkIHRvIGNoZWNrIHRvIHNlZSBpZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gb3IgY2hvc2UgdGhpcyBub2RlIGJlZm9yZS5cbiAgaWYgKG5vZGVzLmxlbmd0aCA8IDUwKSB7XG4gICAgLy8gUmFuZG9tbHkgc2VsZWN0IGsgbWVkb2lkcyBmcm9tIHRoZSBuIG5vZGVzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbm9kZXMubGVuZ3RoKV07XG5cbiAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgY2hvc2VuIHRoaXMgbm9kZSB0byBiZSBhIG1lZG9pZCwgZG9uJ3QgY2hvb3NlIGl0IGFnYWluIChmb3Igc21hbGwgZGF0YSBzZXRzKS5cbiAgICAgIC8vIEluc3RlYWQgY2hvb3NlIGEgZGlmZmVyZW50IHJhbmRvbSBub2RlLlxuICAgICAgd2hpbGUgKHNlZW5CZWZvcmUobm9kZSwgbWVkb2lkcywgaSkpIHtcbiAgICAgICAgbm9kZSA9IG5vZGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5vZGVzLmxlbmd0aCldO1xuICAgICAgfVxuICAgICAgbWVkb2lkc1tpXSA9IG5vZGU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFJlbGF0aXZlbHkgbGFyZ2UgZGF0YSBzZXQsIHNvIHByZXR0eSBzYWZlIHRvIG5vdCBjaGVjayBhbmQganVzdCBzZWxlY3QgcmFuZG9tIG5vZGVzXG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgazsgX2kyKyspIHtcbiAgICAgIG1lZG9pZHNbX2kyXSA9IG5vZGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5vZGVzLmxlbmd0aCldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWVkb2lkcztcbn07XG52YXIgZmluZENvc3QgPSBmdW5jdGlvbiBmaW5kQ29zdChwb3RlbnRpYWxOZXdNZWRvaWQsIGNsdXN0ZXIsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIGNvc3QgPSAwO1xuICBmb3IgKHZhciBuID0gMDsgbiA8IGNsdXN0ZXIubGVuZ3RoOyBuKyspIHtcbiAgICBjb3N0ICs9IGdldERpc3QoJ21hbmhhdHRhbicsIGNsdXN0ZXJbbl0sIHBvdGVudGlhbE5ld01lZG9pZCwgYXR0cmlidXRlcywgJ2tNZWRvaWRzJyk7XG4gIH1cbiAgcmV0dXJuIGNvc3Q7XG59O1xudmFyIGtNZWFucyA9IGZ1bmN0aW9uIGtNZWFucyhvcHRpb25zKSB7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICB2YXIgbm9kZSA9IG51bGw7XG5cbiAgLy8gU2V0IHBhcmFtZXRlcnMgb2YgYWxnb3JpdGhtOiAjIG9mIGNsdXN0ZXJzLCBkaXN0YW5jZSBtZXRyaWMsIGV0Yy5cbiAgdmFyIG9wdHMgPSBzZXRPcHRpb25zJDIob3B0aW9ucyk7XG5cbiAgLy8gQmVnaW4gay1tZWFucyBhbGdvcml0aG1cbiAgdmFyIGNsdXN0ZXJzID0gbmV3IEFycmF5KG9wdHMuayk7XG4gIHZhciBhc3NpZ25tZW50ID0ge307XG4gIHZhciBjZW50cm9pZHM7XG5cbiAgLy8gU3RlcCAxOiBJbml0aWFsaXplIGNlbnRyb2lkIHBvc2l0aW9uc1xuICBpZiAob3B0cy50ZXN0TW9kZSkge1xuICAgIGlmICh0eXBlb2Ygb3B0cy50ZXN0Q2VudHJvaWRzID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVE9ETzogaW1wbGVtZW50IGEgc2VlZGVkIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLlxuICAgICAgb3B0cy50ZXN0Q2VudHJvaWRzO1xuICAgICAgY2VudHJvaWRzID0gcmFuZG9tQ2VudHJvaWRzKG5vZGVzLCBvcHRzLmssIG9wdHMuYXR0cmlidXRlcyk7XG4gICAgfSBlbHNlIGlmIChfdHlwZW9mKG9wdHMudGVzdENlbnRyb2lkcykgPT09ICdvYmplY3QnKSB7XG4gICAgICBjZW50cm9pZHMgPSBvcHRzLnRlc3RDZW50cm9pZHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNlbnRyb2lkcyA9IHJhbmRvbUNlbnRyb2lkcyhub2Rlcywgb3B0cy5rLCBvcHRzLmF0dHJpYnV0ZXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjZW50cm9pZHMgPSByYW5kb21DZW50cm9pZHMobm9kZXMsIG9wdHMuaywgb3B0cy5hdHRyaWJ1dGVzKTtcbiAgfVxuICB2YXIgaXNTdGlsbE1vdmluZyA9IHRydWU7XG4gIHZhciBpdGVyYXRpb25zID0gMDtcbiAgd2hpbGUgKGlzU3RpbGxNb3ZpbmcgJiYgaXRlcmF0aW9ucyA8IG9wdHMubWF4SXRlcmF0aW9ucykge1xuICAgIC8vIFN0ZXAgMjogQXNzaWduIG5vZGVzIHRvIHRoZSBuZWFyZXN0IGNlbnRyb2lkXG4gICAgZm9yICh2YXIgbiA9IDA7IG4gPCBub2Rlcy5sZW5ndGg7IG4rKykge1xuICAgICAgbm9kZSA9IG5vZGVzW25dO1xuICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGNsdXN0ZXIgdGhpcyBub2RlIGJlbG9uZ3MgdG86IG5vZGUgaWQgPT4gY2x1c3RlciAjXG4gICAgICBhc3NpZ25tZW50W25vZGUuaWQoKV0gPSBjbGFzc2lmeShub2RlLCBjZW50cm9pZHMsIG9wdHMuZGlzdGFuY2UsIG9wdHMuYXR0cmlidXRlcywgJ2tNZWFucycpO1xuICAgIH1cblxuICAgIC8vIFN0ZXAgMzogRm9yIGVhY2ggb2YgdGhlIGsgY2x1c3RlcnMsIHVwZGF0ZSBpdHMgY2VudHJvaWRcbiAgICBpc1N0aWxsTW92aW5nID0gZmFsc2U7XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBvcHRzLms7IGMrKykge1xuICAgICAgLy8gR2V0IGFsbCBub2RlcyB0aGF0IGJlbG9uZyB0byB0aGlzIGNsdXN0ZXJcbiAgICAgIHZhciBjbHVzdGVyID0gYnVpbGRDbHVzdGVyKGMsIG5vZGVzLCBhc3NpZ25tZW50KTtcbiAgICAgIGlmIChjbHVzdGVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBJZiBjbHVzdGVyIGlzIGVtcHR5LCBicmVhayBvdXQgZWFybHkgJiBtb3ZlIHRvIG5leHQgY2x1c3RlclxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGNlbnRyb2lkcyBieSBjYWxjdWxhdGluZyBhdmcgb2YgYWxsIG5vZGVzIHdpdGhpbiB0aGUgY2x1c3Rlci5cbiAgICAgIHZhciBuZGltID0gb3B0cy5hdHRyaWJ1dGVzLmxlbmd0aDtcbiAgICAgIHZhciBjZW50cm9pZCA9IGNlbnRyb2lkc1tjXTsgLy8gWyBkaW1fMSwgZGltXzIsIGRpbV8zLCAuLi4gLCBkaW1fbiBdXG4gICAgICB2YXIgbmV3Q2VudHJvaWQgPSBuZXcgQXJyYXkobmRpbSk7XG4gICAgICB2YXIgc3VtID0gbmV3IEFycmF5KG5kaW0pO1xuICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCBuZGltOyBkKyspIHtcbiAgICAgICAgc3VtW2RdID0gMC4wO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsdXN0ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBub2RlID0gY2x1c3RlcltpXTtcbiAgICAgICAgICBzdW1bZF0gKz0gb3B0cy5hdHRyaWJ1dGVzW2RdKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIG5ld0NlbnRyb2lkW2RdID0gc3VtW2RdIC8gY2x1c3Rlci5sZW5ndGg7XG5cbiAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGFsZ29yaXRobSBoYXMgY29udmVyZ2VkLCBpLmUuIHdoZW4gY2VudHJvaWRzIG5vIGxvbmdlciBjaGFuZ2VcbiAgICAgICAgaWYgKCFoYXZlVmFsdWVzQ29udmVyZ2VkKG5ld0NlbnRyb2lkW2RdLCBjZW50cm9pZFtkXSwgb3B0cy5zZW5zaXRpdml0eVRocmVzaG9sZCkpIHtcbiAgICAgICAgICBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2VudHJvaWRzW2NdID0gbmV3Q2VudHJvaWQ7XG4gICAgICBjbHVzdGVyc1tjXSA9IGN5LmNvbGxlY3Rpb24oY2x1c3Rlcik7XG4gICAgfVxuICAgIGl0ZXJhdGlvbnMrKztcbiAgfVxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xudmFyIGtNZWRvaWRzID0gZnVuY3Rpb24ga01lZG9pZHMob3B0aW9ucykge1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgdmFyIG5vZGUgPSBudWxsO1xuICB2YXIgb3B0cyA9IHNldE9wdGlvbnMkMihvcHRpb25zKTtcblxuICAvLyBCZWdpbiBrLW1lZG9pZHMgYWxnb3JpdGhtXG4gIHZhciBjbHVzdGVycyA9IG5ldyBBcnJheShvcHRzLmspO1xuICB2YXIgbWVkb2lkcztcbiAgdmFyIGFzc2lnbm1lbnQgPSB7fTtcbiAgdmFyIGN1ckNvc3Q7XG4gIHZhciBtaW5Db3N0cyA9IG5ldyBBcnJheShvcHRzLmspOyAvLyBtaW5pbXVtIGNvc3QgY29uZmlndXJhdGlvbiBmb3IgZWFjaCBjbHVzdGVyXG5cbiAgLy8gU3RlcCAxOiBJbml0aWFsaXplIGsgbWVkb2lkc1xuICBpZiAob3B0cy50ZXN0TW9kZSkge1xuICAgIGlmICh0eXBlb2Ygb3B0cy50ZXN0Q2VudHJvaWRzID09PSAnbnVtYmVyJykgOyBlbHNlIGlmIChfdHlwZW9mKG9wdHMudGVzdENlbnRyb2lkcykgPT09ICdvYmplY3QnKSB7XG4gICAgICBtZWRvaWRzID0gb3B0cy50ZXN0Q2VudHJvaWRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZWRvaWRzID0gcmFuZG9tTWVkb2lkcyhub2Rlcywgb3B0cy5rKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbWVkb2lkcyA9IHJhbmRvbU1lZG9pZHMobm9kZXMsIG9wdHMuayk7XG4gIH1cbiAgdmFyIGlzU3RpbGxNb3ZpbmcgPSB0cnVlO1xuICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gIHdoaWxlIChpc1N0aWxsTW92aW5nICYmIGl0ZXJhdGlvbnMgPCBvcHRzLm1heEl0ZXJhdGlvbnMpIHtcbiAgICAvLyBTdGVwIDI6IEFzc2lnbiBub2RlcyB0byB0aGUgbmVhcmVzdCBtZWRvaWRcbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgICBub2RlID0gbm9kZXNbbl07XG4gICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggY2x1c3RlciB0aGlzIG5vZGUgYmVsb25ncyB0bzogbm9kZSBpZCA9PiBjbHVzdGVyICNcbiAgICAgIGFzc2lnbm1lbnRbbm9kZS5pZCgpXSA9IGNsYXNzaWZ5KG5vZGUsIG1lZG9pZHMsIG9wdHMuZGlzdGFuY2UsIG9wdHMuYXR0cmlidXRlcywgJ2tNZWRvaWRzJyk7XG4gICAgfVxuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTtcbiAgICAvLyBTdGVwIDM6IEZvciBlYWNoIG1lZG9pZCBtLCBhbmQgZm9yIGVhY2ggbm9kZSBhc3NvY2lhdGVkIHdpdGggbWVkaW9kIG0sXG4gICAgLy8gc2VsZWN0IHRoZSBub2RlIHdpdGggdGhlIGxvd2VzdCBjb25maWd1cmF0aW9uIGNvc3QgYXMgbmV3IG1lZG9pZC5cbiAgICBmb3IgKHZhciBtID0gMDsgbSA8IG1lZG9pZHMubGVuZ3RoOyBtKyspIHtcbiAgICAgIC8vIEdldCBhbGwgbm9kZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyBtZWRvaWRcbiAgICAgIHZhciBjbHVzdGVyID0gYnVpbGRDbHVzdGVyKG0sIG5vZGVzLCBhc3NpZ25tZW50KTtcbiAgICAgIGlmIChjbHVzdGVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBJZiBjbHVzdGVyIGlzIGVtcHR5LCBicmVhayBvdXQgZWFybHkgJiBtb3ZlIHRvIG5leHQgY2x1c3RlclxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG1pbkNvc3RzW21dID0gZmluZENvc3QobWVkb2lkc1ttXSwgY2x1c3Rlciwgb3B0cy5hdHRyaWJ1dGVzKTsgLy8gb3JpZ2luYWwgY29zdFxuXG4gICAgICAvLyBTZWxlY3QgZGlmZmVyZW50IG1lZG9pZCBpZiBpdHMgY29uZmlndXJhdGlvbiBoYXMgdGhlIGxvd2VzdCBjb3N0XG4gICAgICBmb3IgKHZhciBfbiA9IDA7IF9uIDwgY2x1c3Rlci5sZW5ndGg7IF9uKyspIHtcbiAgICAgICAgY3VyQ29zdCA9IGZpbmRDb3N0KGNsdXN0ZXJbX25dLCBjbHVzdGVyLCBvcHRzLmF0dHJpYnV0ZXMpO1xuICAgICAgICBpZiAoY3VyQ29zdCA8IG1pbkNvc3RzW21dKSB7XG4gICAgICAgICAgbWluQ29zdHNbbV0gPSBjdXJDb3N0O1xuICAgICAgICAgIG1lZG9pZHNbbV0gPSBjbHVzdGVyW19uXTtcbiAgICAgICAgICBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2x1c3RlcnNbbV0gPSBjeS5jb2xsZWN0aW9uKGNsdXN0ZXIpO1xuICAgIH1cbiAgICBpdGVyYXRpb25zKys7XG4gIH1cbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcbnZhciB1cGRhdGVDZW50cm9pZHMgPSBmdW5jdGlvbiB1cGRhdGVDZW50cm9pZHMoY2VudHJvaWRzLCBub2RlcywgVSwgd2VpZ2h0LCBvcHRzKSB7XG4gIHZhciBudW1lcmF0b3IsIGRlbm9taW5hdG9yO1xuICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjZW50cm9pZHMubGVuZ3RoOyBjKyspIHtcbiAgICAgIHdlaWdodFtuXVtjXSA9IE1hdGgucG93KFVbbl1bY10sIG9wdHMubSk7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIF9jID0gMDsgX2MgPCBjZW50cm9pZHMubGVuZ3RoOyBfYysrKSB7XG4gICAgZm9yICh2YXIgZGltID0gMDsgZGltIDwgb3B0cy5hdHRyaWJ1dGVzLmxlbmd0aDsgZGltKyspIHtcbiAgICAgIG51bWVyYXRvciA9IDA7XG4gICAgICBkZW5vbWluYXRvciA9IDA7XG4gICAgICBmb3IgKHZhciBfbjIgPSAwOyBfbjIgPCBub2Rlcy5sZW5ndGg7IF9uMisrKSB7XG4gICAgICAgIG51bWVyYXRvciArPSB3ZWlnaHRbX24yXVtfY10gKiBvcHRzLmF0dHJpYnV0ZXNbZGltXShub2Rlc1tfbjJdKTtcbiAgICAgICAgZGVub21pbmF0b3IgKz0gd2VpZ2h0W19uMl1bX2NdO1xuICAgICAgfVxuICAgICAgY2VudHJvaWRzW19jXVtkaW1dID0gbnVtZXJhdG9yIC8gZGVub21pbmF0b3I7XG4gICAgfVxuICB9XG59O1xudmFyIHVwZGF0ZU1lbWJlcnNoaXAgPSBmdW5jdGlvbiB1cGRhdGVNZW1iZXJzaGlwKFUsIF9VLCBjZW50cm9pZHMsIG5vZGVzLCBvcHRzKSB7XG4gIC8vIFNhdmUgcHJldmlvdXMgc3RlcFxuICBmb3IgKHZhciBpID0gMDsgaSA8IFUubGVuZ3RoOyBpKyspIHtcbiAgICBfVVtpXSA9IFVbaV0uc2xpY2UoKTtcbiAgfVxuICB2YXIgc3VtLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yO1xuICB2YXIgcG93ID0gMiAvIChvcHRzLm0gLSAxKTtcbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBjZW50cm9pZHMubGVuZ3RoOyBjKyspIHtcbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgICBzdW0gPSAwO1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBjZW50cm9pZHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgLy8gYWdhaW5zdCBhbGwgb3RoZXIgY2VudHJvaWRzXG4gICAgICAgIG51bWVyYXRvciA9IGdldERpc3Qob3B0cy5kaXN0YW5jZSwgbm9kZXNbbl0sIGNlbnRyb2lkc1tjXSwgb3B0cy5hdHRyaWJ1dGVzLCAnY21lYW5zJyk7XG4gICAgICAgIGRlbm9taW5hdG9yID0gZ2V0RGlzdChvcHRzLmRpc3RhbmNlLCBub2Rlc1tuXSwgY2VudHJvaWRzW2tdLCBvcHRzLmF0dHJpYnV0ZXMsICdjbWVhbnMnKTtcbiAgICAgICAgc3VtICs9IE1hdGgucG93KG51bWVyYXRvciAvIGRlbm9taW5hdG9yLCBwb3cpO1xuICAgICAgfVxuICAgICAgVVtuXVtjXSA9IDEgLyBzdW07XG4gICAgfVxuICB9XG59O1xudmFyIGFzc2lnbiQxID0gZnVuY3Rpb24gYXNzaWduKG5vZGVzLCBVLCBvcHRzLCBjeSkge1xuICB2YXIgY2x1c3RlcnMgPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBjbHVzdGVycy5sZW5ndGg7IGMrKykge1xuICAgIGNsdXN0ZXJzW2NdID0gW107XG4gIH1cbiAgdmFyIG1heDtcbiAgdmFyIGluZGV4O1xuICBmb3IgKHZhciBuID0gMDsgbiA8IFUubGVuZ3RoOyBuKyspIHtcbiAgICAvLyBmb3IgZWFjaCBub2RlIChVIGlzIE4geCBDIG1hdHJpeClcbiAgICBtYXggPSAtSW5maW5pdHk7XG4gICAgaW5kZXggPSAtMTtcbiAgICAvLyBEZXRlcm1pbmUgd2hpY2ggY2x1c3RlciB0aGUgbm9kZSBpcyBtb3N0IGxpa2VseSB0byBiZWxvbmcgaW5cbiAgICBmb3IgKHZhciBfYzIgPSAwOyBfYzIgPCBVWzBdLmxlbmd0aDsgX2MyKyspIHtcbiAgICAgIGlmIChVW25dW19jMl0gPiBtYXgpIHtcbiAgICAgICAgbWF4ID0gVVtuXVtfYzJdO1xuICAgICAgICBpbmRleCA9IF9jMjtcbiAgICAgIH1cbiAgICB9XG4gICAgY2x1c3RlcnNbaW5kZXhdLnB1c2gobm9kZXNbbl0pO1xuICB9XG5cbiAgLy8gVHVybiBldmVyeSBhcnJheSBpbnRvIGEgY29sbGVjdGlvbiBvZiBub2Rlc1xuICBmb3IgKHZhciBfYzMgPSAwOyBfYzMgPCBjbHVzdGVycy5sZW5ndGg7IF9jMysrKSB7XG4gICAgY2x1c3RlcnNbX2MzXSA9IGN5LmNvbGxlY3Rpb24oY2x1c3RlcnNbX2MzXSk7XG4gIH1cbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcbnZhciBmdXp6eUNNZWFucyA9IGZ1bmN0aW9uIGZ1enp5Q01lYW5zKG9wdGlvbnMpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gIHZhciBvcHRzID0gc2V0T3B0aW9ucyQyKG9wdGlvbnMpO1xuXG4gIC8vIEJlZ2luIGZ1enp5IGMtbWVhbnMgYWxnb3JpdGhtXG4gIHZhciBjbHVzdGVycztcbiAgdmFyIGNlbnRyb2lkcztcbiAgdmFyIFU7XG4gIHZhciBfVTtcbiAgdmFyIHdlaWdodDtcblxuICAvLyBTdGVwIDE6IEluaXRpYWxpemUgbGV0aWFibGVzLlxuICBfVSA9IG5ldyBBcnJheShub2Rlcy5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gTiB4IEMgbWF0cml4XG4gICAgX1VbaV0gPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgfVxuICBVID0gbmV3IEFycmF5KG5vZGVzLmxlbmd0aCk7XG4gIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IG5vZGVzLmxlbmd0aDsgX2kzKyspIHtcbiAgICAvLyBOIHggQyBtYXRyaXhcbiAgICBVW19pM10gPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgfVxuICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBub2Rlcy5sZW5ndGg7IF9pNCsrKSB7XG4gICAgdmFyIHRvdGFsID0gMDtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9wdHMuazsgaisrKSB7XG4gICAgICBVW19pNF1bal0gPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgdG90YWwgKz0gVVtfaTRdW2pdO1xuICAgIH1cbiAgICBmb3IgKHZhciBfaiA9IDA7IF9qIDwgb3B0cy5rOyBfaisrKSB7XG4gICAgICBVW19pNF1bX2pdID0gVVtfaTRdW19qXSAvIHRvdGFsO1xuICAgIH1cbiAgfVxuICBjZW50cm9pZHMgPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgb3B0cy5rOyBfaTUrKykge1xuICAgIGNlbnRyb2lkc1tfaTVdID0gbmV3IEFycmF5KG9wdHMuYXR0cmlidXRlcy5sZW5ndGgpO1xuICB9XG4gIHdlaWdodCA9IG5ldyBBcnJheShub2Rlcy5sZW5ndGgpO1xuICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBub2Rlcy5sZW5ndGg7IF9pNisrKSB7XG4gICAgLy8gTiB4IEMgbWF0cml4XG4gICAgd2VpZ2h0W19pNl0gPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgfVxuICAvLyBlbmQgaW5pdCBGQ01cblxuICB2YXIgaXNTdGlsbE1vdmluZyA9IHRydWU7XG4gIHZhciBpdGVyYXRpb25zID0gMDtcbiAgd2hpbGUgKGlzU3RpbGxNb3ZpbmcgJiYgaXRlcmF0aW9ucyA8IG9wdHMubWF4SXRlcmF0aW9ucykge1xuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTtcblxuICAgIC8vIFN0ZXAgMjogQ2FsY3VsYXRlIHRoZSBjZW50cm9pZHMgZm9yIGVhY2ggc3RlcC5cbiAgICB1cGRhdGVDZW50cm9pZHMoY2VudHJvaWRzLCBub2RlcywgVSwgd2VpZ2h0LCBvcHRzKTtcblxuICAgIC8vIFN0ZXAgMzogVXBkYXRlIHRoZSBwYXJ0aXRpb24gbWF0cml4IFUuXG4gICAgdXBkYXRlTWVtYmVyc2hpcChVLCBfVSwgY2VudHJvaWRzLCBub2Rlcywgb3B0cyk7XG5cbiAgICAvLyBTdGVwIDQ6IENoZWNrIGZvciBjb252ZXJnZW5jZS5cbiAgICBpZiAoIWhhdmVNYXRyaWNlc0NvbnZlcmdlZChVLCBfVSwgb3B0cy5zZW5zaXRpdml0eVRocmVzaG9sZCkpIHtcbiAgICAgIGlzU3RpbGxNb3ZpbmcgPSB0cnVlO1xuICAgIH1cbiAgICBpdGVyYXRpb25zKys7XG4gIH1cblxuICAvLyBBc3NpZ24gbm9kZXMgdG8gY2x1c3RlcnMgd2l0aCBoaWdoZXN0IHByb2JhYmlsaXR5LlxuICBjbHVzdGVycyA9IGFzc2lnbiQxKG5vZGVzLCBVLCBvcHRzLCBjeSk7XG4gIHJldHVybiB7XG4gICAgY2x1c3RlcnM6IGNsdXN0ZXJzLFxuICAgIGRlZ3JlZU9mTWVtYmVyc2hpcDogVVxuICB9O1xufTtcbnZhciBrQ2x1c3RlcmluZyA9IHtcbiAga01lYW5zOiBrTWVhbnMsXG4gIGtNZWRvaWRzOiBrTWVkb2lkcyxcbiAgZnV6enlDTWVhbnM6IGZ1enp5Q01lYW5zLFxuICBmY206IGZ1enp5Q01lYW5zXG59O1xuXG4vLyBJbXBsZW1lbnRlZCBieSBab2UgWGkgQHpvZXhpIGZvciBHU09DIDIwMTZcbnZhciBkZWZhdWx0cyRhID0gZGVmYXVsdHMkZyh7XG4gIGRpc3RhbmNlOiAnZXVjbGlkZWFuJyxcbiAgLy8gZGlzdGFuY2UgbWV0cmljIHRvIGNvbXBhcmUgbm9kZXNcbiAgbGlua2FnZTogJ21pbicsXG4gIC8vIGxpbmthZ2UgY3JpdGVyaW9uIDogaG93IHRvIGRldGVybWluZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiBjbHVzdGVycyBvZiBub2Rlc1xuICBtb2RlOiAndGhyZXNob2xkJyxcbiAgLy8gbW9kZTondGhyZXNob2xkJyA9PiBjbHVzdGVycyBtdXN0IGJlIHRocmVzaG9sZCBkaXN0YW5jZSBhcGFydFxuICB0aHJlc2hvbGQ6IEluZmluaXR5LFxuICAvLyB0aGUgZGlzdGFuY2UgdGhyZXNob2xkXG4gIC8vIG1vZGU6J2RlbmRyb2dyYW0nID0+IHRoZSBub2RlcyBhcmUgb3JnYW5pc2VkIGFzIGxlYXZlcyBpbiBhIHRyZWUgKHNpYmxpbmdzIGFyZSBjbG9zZSksIG1lcmdpbmcgbWFrZXMgY2x1c3RlcnNcbiAgYWRkRGVuZHJvZ3JhbTogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gYWRkIHRoZSBkZW5kcm9ncmFtIHRvIHRoZSBncmFwaCBmb3Igdml6XG4gIGRlbmRyb2dyYW1EZXB0aDogMCxcbiAgLy8gZGVwdGggYXQgd2hpY2ggZGVuZHJvZ3JhbSBicmFuY2hlcyBhcmUgbWVyZ2VkIGludG8gdGhlIHJldHVybmVkIGNsdXN0ZXJzXG4gIGF0dHJpYnV0ZXM6IFtdIC8vIGFycmF5IG9mIGF0dHIgZnVuY3Rpb25zXG59KTtcblxudmFyIGxpbmthZ2VBbGlhc2VzID0ge1xuICAnc2luZ2xlJzogJ21pbicsXG4gICdjb21wbGV0ZSc6ICdtYXgnXG59O1xudmFyIHNldE9wdGlvbnMkMSA9IGZ1bmN0aW9uIHNldE9wdGlvbnMob3B0aW9ucykge1xuICB2YXIgb3B0cyA9IGRlZmF1bHRzJGEob3B0aW9ucyk7XG4gIHZhciBwcmVmZXJyZWRBbGlhcyA9IGxpbmthZ2VBbGlhc2VzW29wdHMubGlua2FnZV07XG4gIGlmIChwcmVmZXJyZWRBbGlhcyAhPSBudWxsKSB7XG4gICAgb3B0cy5saW5rYWdlID0gcHJlZmVycmVkQWxpYXM7XG4gIH1cbiAgcmV0dXJuIG9wdHM7XG59O1xudmFyIG1lcmdlQ2xvc2VzdCA9IGZ1bmN0aW9uIG1lcmdlQ2xvc2VzdChjbHVzdGVycywgaW5kZXgsIGRpc3RzLCBtaW5zLCBvcHRzKSB7XG4gIC8vIEZpbmQgdHdvIGNsb3Nlc3QgY2x1c3RlcnMgZnJvbSBjYWNoZWQgbWluc1xuICB2YXIgbWluS2V5ID0gMDtcbiAgdmFyIG1pbiA9IEluZmluaXR5O1xuICB2YXIgZGlzdDtcbiAgdmFyIGF0dHJzID0gb3B0cy5hdHRyaWJ1dGVzO1xuICB2YXIgZ2V0RGlzdCA9IGZ1bmN0aW9uIGdldERpc3QobjEsIG4yKSB7XG4gICAgcmV0dXJuIGNsdXN0ZXJpbmdEaXN0YW5jZShvcHRzLmRpc3RhbmNlLCBhdHRycy5sZW5ndGgsIGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gYXR0cnNbaV0objEpO1xuICAgIH0sIGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gYXR0cnNbaV0objIpO1xuICAgIH0sIG4xLCBuMik7XG4gIH07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gY2x1c3RlcnNbaV0ua2V5O1xuICAgIHZhciBfZGlzdCA9IGRpc3RzW2tleV1bbWluc1trZXldXTtcbiAgICBpZiAoX2Rpc3QgPCBtaW4pIHtcbiAgICAgIG1pbktleSA9IGtleTtcbiAgICAgIG1pbiA9IF9kaXN0O1xuICAgIH1cbiAgfVxuICBpZiAob3B0cy5tb2RlID09PSAndGhyZXNob2xkJyAmJiBtaW4gPj0gb3B0cy50aHJlc2hvbGQgfHwgb3B0cy5tb2RlID09PSAnZGVuZHJvZ3JhbScgJiYgY2x1c3RlcnMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBjMSA9IGluZGV4W21pbktleV07XG4gIHZhciBjMiA9IGluZGV4W21pbnNbbWluS2V5XV07XG4gIHZhciBtZXJnZWQ7XG5cbiAgLy8gTWVyZ2UgdHdvIGNsb3Nlc3QgY2x1c3RlcnNcbiAgaWYgKG9wdHMubW9kZSA9PT0gJ2RlbmRyb2dyYW0nKSB7XG4gICAgbWVyZ2VkID0ge1xuICAgICAgbGVmdDogYzEsXG4gICAgICByaWdodDogYzIsXG4gICAgICBrZXk6IGMxLmtleVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgbWVyZ2VkID0ge1xuICAgICAgdmFsdWU6IGMxLnZhbHVlLmNvbmNhdChjMi52YWx1ZSksXG4gICAgICBrZXk6IGMxLmtleVxuICAgIH07XG4gIH1cbiAgY2x1c3RlcnNbYzEuaW5kZXhdID0gbWVyZ2VkO1xuICBjbHVzdGVycy5zcGxpY2UoYzIuaW5kZXgsIDEpO1xuICBpbmRleFtjMS5rZXldID0gbWVyZ2VkO1xuXG4gIC8vIFVwZGF0ZSBkaXN0YW5jZXMgd2l0aCBuZXcgbWVyZ2VkIGNsdXN0ZXJcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGNsdXN0ZXJzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBjdXIgPSBjbHVzdGVyc1tfaV07XG4gICAgaWYgKGMxLmtleSA9PT0gY3VyLmtleSkge1xuICAgICAgZGlzdCA9IEluZmluaXR5O1xuICAgIH0gZWxzZSBpZiAob3B0cy5saW5rYWdlID09PSAnbWluJykge1xuICAgICAgZGlzdCA9IGRpc3RzW2MxLmtleV1bY3VyLmtleV07XG4gICAgICBpZiAoZGlzdHNbYzEua2V5XVtjdXIua2V5XSA+IGRpc3RzW2MyLmtleV1bY3VyLmtleV0pIHtcbiAgICAgICAgZGlzdCA9IGRpc3RzW2MyLmtleV1bY3VyLmtleV07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRzLmxpbmthZ2UgPT09ICdtYXgnKSB7XG4gICAgICBkaXN0ID0gZGlzdHNbYzEua2V5XVtjdXIua2V5XTtcbiAgICAgIGlmIChkaXN0c1tjMS5rZXldW2N1ci5rZXldIDwgZGlzdHNbYzIua2V5XVtjdXIua2V5XSkge1xuICAgICAgICBkaXN0ID0gZGlzdHNbYzIua2V5XVtjdXIua2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wdHMubGlua2FnZSA9PT0gJ21lYW4nKSB7XG4gICAgICBkaXN0ID0gKGRpc3RzW2MxLmtleV1bY3VyLmtleV0gKiBjMS5zaXplICsgZGlzdHNbYzIua2V5XVtjdXIua2V5XSAqIGMyLnNpemUpIC8gKGMxLnNpemUgKyBjMi5zaXplKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdHMubW9kZSA9PT0gJ2RlbmRyb2dyYW0nKSBkaXN0ID0gZ2V0RGlzdChjdXIudmFsdWUsIGMxLnZhbHVlKTtlbHNlIGRpc3QgPSBnZXREaXN0KGN1ci52YWx1ZVswXSwgYzEudmFsdWVbMF0pO1xuICAgIH1cbiAgICBkaXN0c1tjMS5rZXldW2N1ci5rZXldID0gZGlzdHNbY3VyLmtleV1bYzEua2V5XSA9IGRpc3Q7IC8vIGRpc3RhbmNlIG1hdHJpeCBpcyBzeW1tZXRyaWNcbiAgfVxuXG4gIC8vIFVwZGF0ZSBjYWNoZWQgbWluc1xuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBjbHVzdGVycy5sZW5ndGg7IF9pMisrKSB7XG4gICAgdmFyIGtleTEgPSBjbHVzdGVyc1tfaTJdLmtleTtcbiAgICBpZiAobWluc1trZXkxXSA9PT0gYzEua2V5IHx8IG1pbnNba2V5MV0gPT09IGMyLmtleSkge1xuICAgICAgdmFyIF9taW4gPSBrZXkxO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjbHVzdGVycy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIga2V5MiA9IGNsdXN0ZXJzW2pdLmtleTtcbiAgICAgICAgaWYgKGRpc3RzW2tleTFdW2tleTJdIDwgZGlzdHNba2V5MV1bX21pbl0pIHtcbiAgICAgICAgICBfbWluID0ga2V5MjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWluc1trZXkxXSA9IF9taW47XG4gICAgfVxuICAgIGNsdXN0ZXJzW19pMl0uaW5kZXggPSBfaTI7XG4gIH1cblxuICAvLyBDbGVhbiB1cCBtZXRhIGRhdGEgdXNlZCBmb3IgY2x1c3RlcmluZ1xuICBjMS5rZXkgPSBjMi5rZXkgPSBjMS5pbmRleCA9IGMyLmluZGV4ID0gbnVsbDtcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIGdldEFsbENoaWxkcmVuID0gZnVuY3Rpb24gZ2V0QWxsQ2hpbGRyZW4ocm9vdCwgYXJyLCBjeSkge1xuICBpZiAoIXJvb3QpIHJldHVybjtcbiAgaWYgKHJvb3QudmFsdWUpIHtcbiAgICBhcnIucHVzaChyb290LnZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAocm9vdC5sZWZ0KSBnZXRBbGxDaGlsZHJlbihyb290LmxlZnQsIGFycik7XG4gICAgaWYgKHJvb3QucmlnaHQpIGdldEFsbENoaWxkcmVuKHJvb3QucmlnaHQsIGFycik7XG4gIH1cbn07XG52YXIgYnVpbGREZW5kcm9ncmFtID0gZnVuY3Rpb24gYnVpbGREZW5kcm9ncmFtKHJvb3QsIGN5KSB7XG4gIGlmICghcm9vdCkgcmV0dXJuICcnO1xuICBpZiAocm9vdC5sZWZ0ICYmIHJvb3QucmlnaHQpIHtcbiAgICB2YXIgbGVmdFN0ciA9IGJ1aWxkRGVuZHJvZ3JhbShyb290LmxlZnQsIGN5KTtcbiAgICB2YXIgcmlnaHRTdHIgPSBidWlsZERlbmRyb2dyYW0ocm9vdC5yaWdodCwgY3kpO1xuICAgIHZhciBub2RlID0gY3kuYWRkKHtcbiAgICAgIGdyb3VwOiAnbm9kZXMnLFxuICAgICAgZGF0YToge1xuICAgICAgICBpZDogbGVmdFN0ciArICcsJyArIHJpZ2h0U3RyXG4gICAgICB9XG4gICAgfSk7XG4gICAgY3kuYWRkKHtcbiAgICAgIGdyb3VwOiAnZWRnZXMnLFxuICAgICAgZGF0YToge1xuICAgICAgICBzb3VyY2U6IGxlZnRTdHIsXG4gICAgICAgIHRhcmdldDogbm9kZS5pZCgpXG4gICAgICB9XG4gICAgfSk7XG4gICAgY3kuYWRkKHtcbiAgICAgIGdyb3VwOiAnZWRnZXMnLFxuICAgICAgZGF0YToge1xuICAgICAgICBzb3VyY2U6IHJpZ2h0U3RyLFxuICAgICAgICB0YXJnZXQ6IG5vZGUuaWQoKVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBub2RlLmlkKCk7XG4gIH0gZWxzZSBpZiAocm9vdC52YWx1ZSkge1xuICAgIHJldHVybiByb290LnZhbHVlLmlkKCk7XG4gIH1cbn07XG52YXIgYnVpbGRDbHVzdGVyc0Zyb21UcmVlID0gZnVuY3Rpb24gYnVpbGRDbHVzdGVyc0Zyb21UcmVlKHJvb3QsIGssIGN5KSB7XG4gIGlmICghcm9vdCkgcmV0dXJuIFtdO1xuICB2YXIgbGVmdCA9IFtdLFxuICAgIHJpZ2h0ID0gW10sXG4gICAgbGVhdmVzID0gW107XG4gIGlmIChrID09PSAwKSB7XG4gICAgLy8gZG9uJ3QgY3V0IHRyZWUsIHNpbXBseSByZXR1cm4gYWxsIG5vZGVzIGFzIDEgc2luZ2xlIGNsdXN0ZXJcbiAgICBpZiAocm9vdC5sZWZ0KSBnZXRBbGxDaGlsZHJlbihyb290LmxlZnQsIGxlZnQpO1xuICAgIGlmIChyb290LnJpZ2h0KSBnZXRBbGxDaGlsZHJlbihyb290LnJpZ2h0LCByaWdodCk7XG4gICAgbGVhdmVzID0gbGVmdC5jb25jYXQocmlnaHQpO1xuICAgIHJldHVybiBbY3kuY29sbGVjdGlvbihsZWF2ZXMpXTtcbiAgfSBlbHNlIGlmIChrID09PSAxKSB7XG4gICAgLy8gY3V0IGF0IHJvb3RcblxuICAgIGlmIChyb290LnZhbHVlKSB7XG4gICAgICAvLyBsZWFmIG5vZGVcbiAgICAgIHJldHVybiBbY3kuY29sbGVjdGlvbihyb290LnZhbHVlKV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyb290LmxlZnQpIGdldEFsbENoaWxkcmVuKHJvb3QubGVmdCwgbGVmdCk7XG4gICAgICBpZiAocm9vdC5yaWdodCkgZ2V0QWxsQ2hpbGRyZW4ocm9vdC5yaWdodCwgcmlnaHQpO1xuICAgICAgcmV0dXJuIFtjeS5jb2xsZWN0aW9uKGxlZnQpLCBjeS5jb2xsZWN0aW9uKHJpZ2h0KV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChyb290LnZhbHVlKSB7XG4gICAgICByZXR1cm4gW2N5LmNvbGxlY3Rpb24ocm9vdC52YWx1ZSldO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocm9vdC5sZWZ0KSBsZWZ0ID0gYnVpbGRDbHVzdGVyc0Zyb21UcmVlKHJvb3QubGVmdCwgayAtIDEsIGN5KTtcbiAgICAgIGlmIChyb290LnJpZ2h0KSByaWdodCA9IGJ1aWxkQ2x1c3RlcnNGcm9tVHJlZShyb290LnJpZ2h0LCBrIC0gMSwgY3kpO1xuICAgICAgcmV0dXJuIGxlZnQuY29uY2F0KHJpZ2h0KTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBoaWVyYXJjaGljYWxDbHVzdGVyaW5nID0gZnVuY3Rpb24gaGllcmFyY2hpY2FsQ2x1c3RlcmluZyhvcHRpb25zKSB7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuXG4gIC8vIFNldCBwYXJhbWV0ZXJzIG9mIGFsZ29yaXRobTogbGlua2FnZSB0eXBlLCBkaXN0YW5jZSBtZXRyaWMsIGV0Yy5cbiAgdmFyIG9wdHMgPSBzZXRPcHRpb25zJDEob3B0aW9ucyk7XG4gIHZhciBhdHRycyA9IG9wdHMuYXR0cmlidXRlcztcbiAgdmFyIGdldERpc3QgPSBmdW5jdGlvbiBnZXREaXN0KG4xLCBuMikge1xuICAgIHJldHVybiBjbHVzdGVyaW5nRGlzdGFuY2Uob3B0cy5kaXN0YW5jZSwgYXR0cnMubGVuZ3RoLCBmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGF0dHJzW2ldKG4xKTtcbiAgICB9LCBmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGF0dHJzW2ldKG4yKTtcbiAgICB9LCBuMSwgbjIpO1xuICB9O1xuXG4gIC8vIEJlZ2luIGhpZXJhcmNoaWNhbCBhbGdvcml0aG1cbiAgdmFyIGNsdXN0ZXJzID0gW107XG4gIHZhciBkaXN0cyA9IFtdOyAvLyBkaXN0YW5jZXMgYmV0d2VlbiBlYWNoIHBhaXIgb2YgY2x1c3RlcnNcbiAgdmFyIG1pbnMgPSBbXTsgLy8gY2xvc2VzdCBjbHVzdGVyIGZvciBlYWNoIGNsdXN0ZXJcbiAgdmFyIGluZGV4ID0gW107IC8vIGhhc2ggb2YgYWxsIGNsdXN0ZXJzIGJ5IGtleVxuXG4gIC8vIEluIGFnZ2xvbWVyYXRpdmUgKGJvdHRvbS11cCkgY2x1c3RlcmluZywgZWFjaCBub2RlIHN0YXJ0cyBhcyBpdHMgb3duIGNsdXN0ZXJcbiAgZm9yICh2YXIgbiA9IDA7IG4gPCBub2Rlcy5sZW5ndGg7IG4rKykge1xuICAgIHZhciBjbHVzdGVyID0ge1xuICAgICAgdmFsdWU6IG9wdHMubW9kZSA9PT0gJ2RlbmRyb2dyYW0nID8gbm9kZXNbbl0gOiBbbm9kZXNbbl1dLFxuICAgICAga2V5OiBuLFxuICAgICAgaW5kZXg6IG5cbiAgICB9O1xuICAgIGNsdXN0ZXJzW25dID0gY2x1c3RlcjtcbiAgICBpbmRleFtuXSA9IGNsdXN0ZXI7XG4gICAgZGlzdHNbbl0gPSBbXTtcbiAgICBtaW5zW25dID0gMDtcbiAgfVxuXG4gIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiBlYWNoIHBhaXIgb2YgY2x1c3RlcnNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDw9IGk7IGorKykge1xuICAgICAgdmFyIGRpc3QgPSB2b2lkIDA7XG4gICAgICBpZiAob3B0cy5tb2RlID09PSAnZGVuZHJvZ3JhbScpIHtcbiAgICAgICAgLy8gbW9kZXMgc3RvcmUgY2x1c3RlciB2YWx1ZXMgZGlmZmVyZW50bHlcbiAgICAgICAgZGlzdCA9IGkgPT09IGogPyBJbmZpbml0eSA6IGdldERpc3QoY2x1c3RlcnNbaV0udmFsdWUsIGNsdXN0ZXJzW2pdLnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3QgPSBpID09PSBqID8gSW5maW5pdHkgOiBnZXREaXN0KGNsdXN0ZXJzW2ldLnZhbHVlWzBdLCBjbHVzdGVyc1tqXS52YWx1ZVswXSk7XG4gICAgICB9XG4gICAgICBkaXN0c1tpXVtqXSA9IGRpc3Q7XG4gICAgICBkaXN0c1tqXVtpXSA9IGRpc3Q7XG4gICAgICBpZiAoZGlzdCA8IGRpc3RzW2ldW21pbnNbaV1dKSB7XG4gICAgICAgIG1pbnNbaV0gPSBqOyAvLyBDYWNoZSBtaW5zOiBjbG9zZXN0IGNsdXN0ZXIgdG8gY2x1c3RlciBpIGlzIGNsdXN0ZXIgalxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmQgdGhlIGNsb3Nlc3QgcGFpciBvZiBjbHVzdGVycyBhbmQgbWVyZ2UgdGhlbSBpbnRvIGEgc2luZ2xlIGNsdXN0ZXIuXG4gIC8vIFVwZGF0ZSBkaXN0YW5jZXMgYmV0d2VlbiBuZXcgY2x1c3RlciBhbmQgZWFjaCBvZiB0aGUgb2xkIGNsdXN0ZXJzLCBhbmQgbG9vcCB1bnRpbCB0aHJlc2hvbGQgcmVhY2hlZC5cbiAgdmFyIG1lcmdlZCA9IG1lcmdlQ2xvc2VzdChjbHVzdGVycywgaW5kZXgsIGRpc3RzLCBtaW5zLCBvcHRzKTtcbiAgd2hpbGUgKG1lcmdlZCkge1xuICAgIG1lcmdlZCA9IG1lcmdlQ2xvc2VzdChjbHVzdGVycywgaW5kZXgsIGRpc3RzLCBtaW5zLCBvcHRzKTtcbiAgfVxuICB2YXIgcmV0Q2x1c3RlcnM7XG5cbiAgLy8gRGVuZHJvZ3JhbSBtb2RlIGJ1aWxkcyB0aGUgaGllcmFyY2h5IGFuZCBhZGRzIGludGVybWVkaWFyeSBub2RlcyArIGVkZ2VzXG4gIC8vIGluIGFkZGl0aW9uIHRvIHJldHVybmluZyB0aGUgY2x1c3RlcnMuXG4gIGlmIChvcHRzLm1vZGUgPT09ICdkZW5kcm9ncmFtJykge1xuICAgIHJldENsdXN0ZXJzID0gYnVpbGRDbHVzdGVyc0Zyb21UcmVlKGNsdXN0ZXJzWzBdLCBvcHRzLmRlbmRyb2dyYW1EZXB0aCwgY3kpO1xuICAgIGlmIChvcHRzLmFkZERlbmRyb2dyYW0pIGJ1aWxkRGVuZHJvZ3JhbShjbHVzdGVyc1swXSwgY3kpO1xuICB9IGVsc2Uge1xuICAgIC8vIFJlZ3VsYXIgbW9kZSBzaW1wbHkgcmV0dXJucyB0aGUgY2x1c3RlcnNcblxuICAgIHJldENsdXN0ZXJzID0gbmV3IEFycmF5KGNsdXN0ZXJzLmxlbmd0aCk7XG4gICAgY2x1c3RlcnMuZm9yRWFjaChmdW5jdGlvbiAoY2x1c3RlciwgaSkge1xuICAgICAgLy8gQ2xlYW4gdXAgbWV0YSBkYXRhIHVzZWQgZm9yIGNsdXN0ZXJpbmdcbiAgICAgIGNsdXN0ZXIua2V5ID0gY2x1c3Rlci5pbmRleCA9IG51bGw7XG4gICAgICByZXRDbHVzdGVyc1tpXSA9IGN5LmNvbGxlY3Rpb24oY2x1c3Rlci52YWx1ZSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJldENsdXN0ZXJzO1xufTtcbnZhciBoaWVyYXJjaGljYWxDbHVzdGVyaW5nJDEgPSB7XG4gIGhpZXJhcmNoaWNhbENsdXN0ZXJpbmc6IGhpZXJhcmNoaWNhbENsdXN0ZXJpbmcsXG4gIGhjYTogaGllcmFyY2hpY2FsQ2x1c3RlcmluZ1xufTtcblxuLy8gSW1wbGVtZW50ZWQgYnkgWm9lIFhpIEB6b2V4aSBmb3IgR1NPQyAyMDE2XG52YXIgZGVmYXVsdHMkOSA9IGRlZmF1bHRzJGcoe1xuICBkaXN0YW5jZTogJ2V1Y2xpZGVhbicsXG4gIC8vIGRpc3RhbmNlIG1ldHJpYyB0byBjb21wYXJlIGF0dHJpYnV0ZXMgYmV0d2VlbiB0d28gbm9kZXNcbiAgcHJlZmVyZW5jZTogJ21lZGlhbicsXG4gIC8vIHN1aXRhYmlsaXR5IG9mIGEgZGF0YSBwb2ludCB0byBzZXJ2ZSBhcyBhbiBleGVtcGxhclxuICBkYW1waW5nOiAwLjgsXG4gIC8vIGRhbXBpbmcgZmFjdG9yIGJldHdlZW4gWzAuNSwgMSlcbiAgbWF4SXRlcmF0aW9uczogMTAwMCxcbiAgLy8gbWF4IG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHJ1blxuICBtaW5JdGVyYXRpb25zOiAxMDAsXG4gIC8vIG1pbiBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBydW4gaW4gb3JkZXIgZm9yIGNsdXN0ZXJpbmcgdG8gc3RvcFxuICBhdHRyaWJ1dGVzOiBbLy8gZnVuY3Rpb25zIHRvIHF1YW50aWZ5IHRoZSBzaW1pbGFyaXR5IGJldHdlZW4gYW55IHR3byBwb2ludHNcbiAgICAvLyBlLmcuIG5vZGUgPT4gbm9kZS5kYXRhKCd3ZWlnaHQnKVxuICBdXG59KTtcbnZhciBzZXRPcHRpb25zID0gZnVuY3Rpb24gc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gIHZhciBkbXAgPSBvcHRpb25zLmRhbXBpbmc7XG4gIHZhciBwcmVmID0gb3B0aW9ucy5wcmVmZXJlbmNlO1xuICBpZiAoISgwLjUgPD0gZG1wICYmIGRtcCA8IDEpKSB7XG4gICAgZXJyb3IoXCJEYW1waW5nIG11c3QgcmFuZ2Ugb24gWzAuNSwgMSkuICBHb3Q6IFwiLmNvbmNhdChkbXApKTtcbiAgfVxuICB2YXIgdmFsaWRQcmVmcyA9IFsnbWVkaWFuJywgJ21lYW4nLCAnbWluJywgJ21heCddO1xuICBpZiAoISh2YWxpZFByZWZzLnNvbWUoZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gdiA9PT0gcHJlZjtcbiAgfSkgfHwgbnVtYmVyJDEocHJlZikpKSB7XG4gICAgZXJyb3IoXCJQcmVmZXJlbmNlIG11c3QgYmUgb25lIG9mIFtcIi5jb25jYXQodmFsaWRQcmVmcy5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICAgIHJldHVybiBcIidcIi5jb25jYXQocCwgXCInXCIpO1xuICAgIH0pLmpvaW4oJywgJyksIFwiXSBvciBhIG51bWJlci4gIEdvdDogXCIpLmNvbmNhdChwcmVmKSk7XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRzJDkob3B0aW9ucyk7XG59O1xuXG52YXIgZ2V0U2ltaWxhcml0eSA9IGZ1bmN0aW9uIGdldFNpbWlsYXJpdHkodHlwZSwgbjEsIG4yLCBhdHRyaWJ1dGVzKSB7XG4gIHZhciBhdHRyID0gZnVuY3Rpb24gYXR0cihuLCBpKSB7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZXNbaV0obik7XG4gIH07XG5cbiAgLy8gbmIgbmVnYXRpdmUgYmVjYXVzZSBzaW1pbGFyaXR5IHNob3VsZCBoYXZlIGFuIGludmVyc2UgcmVsYXRpb25zaGlwIHRvIGRpc3RhbmNlXG4gIHJldHVybiAtY2x1c3RlcmluZ0Rpc3RhbmNlKHR5cGUsIGF0dHJpYnV0ZXMubGVuZ3RoLCBmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBhdHRyKG4xLCBpKTtcbiAgfSwgZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gYXR0cihuMiwgaSk7XG4gIH0sIG4xLCBuMik7XG59O1xudmFyIGdldFByZWZlcmVuY2UgPSBmdW5jdGlvbiBnZXRQcmVmZXJlbmNlKFMsIHByZWZlcmVuY2UpIHtcbiAgLy8gbGFyZ2VyIHByZWZlcmVuY2UgPSBncmVhdGVyICMgb2YgY2x1c3RlcnNcbiAgdmFyIHAgPSBudWxsO1xuICBpZiAocHJlZmVyZW5jZSA9PT0gJ21lZGlhbicpIHtcbiAgICBwID0gbWVkaWFuKFMpO1xuICB9IGVsc2UgaWYgKHByZWZlcmVuY2UgPT09ICdtZWFuJykge1xuICAgIHAgPSBtZWFuKFMpO1xuICB9IGVsc2UgaWYgKHByZWZlcmVuY2UgPT09ICdtaW4nKSB7XG4gICAgcCA9IG1pbihTKTtcbiAgfSBlbHNlIGlmIChwcmVmZXJlbmNlID09PSAnbWF4Jykge1xuICAgIHAgPSBtYXgoUyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ3VzdG9tIHByZWZlcmVuY2UgbnVtYmVyLCBhcyBzZXQgYnkgdXNlclxuICAgIHAgPSBwcmVmZXJlbmNlO1xuICB9XG4gIHJldHVybiBwO1xufTtcbnZhciBmaW5kRXhlbXBsYXJzID0gZnVuY3Rpb24gZmluZEV4ZW1wbGFycyhuLCBSLCBBKSB7XG4gIHZhciBpbmRpY2VzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgaWYgKFJbaSAqIG4gKyBpXSArIEFbaSAqIG4gKyBpXSA+IDApIHtcbiAgICAgIGluZGljZXMucHVzaChpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluZGljZXM7XG59O1xudmFyIGFzc2lnbkNsdXN0ZXJzID0gZnVuY3Rpb24gYXNzaWduQ2x1c3RlcnMobiwgUywgZXhlbXBsYXJzKSB7XG4gIHZhciBjbHVzdGVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIHZhciBpbmRleCA9IC0xO1xuICAgIHZhciBtYXggPSAtSW5maW5pdHk7XG4gICAgZm9yICh2YXIgZWkgPSAwOyBlaSA8IGV4ZW1wbGFycy5sZW5ndGg7IGVpKyspIHtcbiAgICAgIHZhciBlID0gZXhlbXBsYXJzW2VpXTtcbiAgICAgIGlmIChTW2kgKiBuICsgZV0gPiBtYXgpIHtcbiAgICAgICAgaW5kZXggPSBlO1xuICAgICAgICBtYXggPSBTW2kgKiBuICsgZV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgIGNsdXN0ZXJzLnB1c2goaW5kZXgpO1xuICAgIH1cbiAgfVxuICBmb3IgKHZhciBfZWkgPSAwOyBfZWkgPCBleGVtcGxhcnMubGVuZ3RoOyBfZWkrKykge1xuICAgIGNsdXN0ZXJzW2V4ZW1wbGFyc1tfZWldXSA9IGV4ZW1wbGFyc1tfZWldO1xuICB9XG4gIHJldHVybiBjbHVzdGVycztcbn07XG52YXIgYXNzaWduID0gZnVuY3Rpb24gYXNzaWduKG4sIFMsIGV4ZW1wbGFycykge1xuICB2YXIgY2x1c3RlcnMgPSBhc3NpZ25DbHVzdGVycyhuLCBTLCBleGVtcGxhcnMpO1xuICBmb3IgKHZhciBlaSA9IDA7IGVpIDwgZXhlbXBsYXJzLmxlbmd0aDsgZWkrKykge1xuICAgIHZhciBpaSA9IFtdO1xuICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY2x1c3RlcnMubGVuZ3RoOyBjKyspIHtcbiAgICAgIGlmIChjbHVzdGVyc1tjXSA9PT0gZXhlbXBsYXJzW2VpXSkge1xuICAgICAgICBpaS5wdXNoKGMpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgbWF4SSA9IC0xO1xuICAgIHZhciBtYXhTdW0gPSAtSW5maW5pdHk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpaS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHN1bSA9IDA7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGlpLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHN1bSArPSBTW2lpW2pdICogbiArIGlpW2ldXTtcbiAgICAgIH1cbiAgICAgIGlmIChzdW0gPiBtYXhTdW0pIHtcbiAgICAgICAgbWF4SSA9IGk7XG4gICAgICAgIG1heFN1bSA9IHN1bTtcbiAgICAgIH1cbiAgICB9XG4gICAgZXhlbXBsYXJzW2VpXSA9IGlpW21heEldO1xuICB9XG4gIGNsdXN0ZXJzID0gYXNzaWduQ2x1c3RlcnMobiwgUywgZXhlbXBsYXJzKTtcbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcbnZhciBhZmZpbml0eVByb3BhZ2F0aW9uID0gZnVuY3Rpb24gYWZmaW5pdHlQcm9wYWdhdGlvbihvcHRpb25zKSB7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICB2YXIgb3B0cyA9IHNldE9wdGlvbnMob3B0aW9ucyk7XG5cbiAgLy8gTWFwIGVhY2ggbm9kZSB0byBpdHMgcG9zaXRpb24gaW4gbm9kZSBhcnJheVxuICB2YXIgaWQycG9zaXRpb24gPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGlkMnBvc2l0aW9uW25vZGVzW2ldLmlkKCldID0gaTtcbiAgfVxuXG4gIC8vIEJlZ2luIGFmZmluaXR5IHByb3BhZ2F0aW9uIGFsZ29yaXRobVxuXG4gIHZhciBuOyAvLyBudW1iZXIgb2YgZGF0YSBwb2ludHNcbiAgdmFyIG4yOyAvLyBzaXplIG9mIG1hdHJpY2VzXG4gIHZhciBTOyAvLyBzaW1pbGFyaXR5IG1hdHJpeCAoMUQgYXJyYXkpXG4gIHZhciBwOyAvLyBwcmVmZXJlbmNlL3N1aXRhYmlsaXR5IG9mIGEgZGF0YSBwb2ludCB0byBzZXJ2ZSBhcyBhbiBleGVtcGxhclxuICB2YXIgUjsgLy8gcmVzcG9uc2liaWxpdHkgbWF0cml4ICgxRCBhcnJheSlcbiAgdmFyIEE7IC8vIGF2YWlsYWJpbGl0eSBtYXRyaXggKDFEIGFycmF5KVxuXG4gIG4gPSBub2Rlcy5sZW5ndGg7XG4gIG4yID0gbiAqIG47XG5cbiAgLy8gSW5pdGlhbGl6ZSBhbmQgYnVpbGQgUyBzaW1pbGFyaXR5IG1hdHJpeFxuICBTID0gbmV3IEFycmF5KG4yKTtcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG4yOyBfaSsrKSB7XG4gICAgU1tfaV0gPSAtSW5maW5pdHk7IC8vIGZvciBjYXNlcyB3aGVyZSB0d28gZGF0YSBwb2ludHMgc2hvdWxkbid0IGJlIGxpbmtlZCB0b2dldGhlclxuICB9XG5cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbjsgX2kyKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgaWYgKF9pMiAhPT0gaikge1xuICAgICAgICBTW19pMiAqIG4gKyBqXSA9IGdldFNpbWlsYXJpdHkob3B0cy5kaXN0YW5jZSwgbm9kZXNbX2kyXSwgbm9kZXNbal0sIG9wdHMuYXR0cmlidXRlcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUGxhY2UgcHJlZmVyZW5jZXMgb24gdGhlIGRpYWdvbmFsIG9mIFNcbiAgcCA9IGdldFByZWZlcmVuY2UoUywgb3B0cy5wcmVmZXJlbmNlKTtcbiAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbjsgX2kzKyspIHtcbiAgICBTW19pMyAqIG4gKyBfaTNdID0gcDtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgUiByZXNwb25zaWJpbGl0eSBtYXRyaXhcbiAgUiA9IG5ldyBBcnJheShuMik7XG4gIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG4yOyBfaTQrKykge1xuICAgIFJbX2k0XSA9IDAuMDtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgQSBhdmFpbGFiaWxpdHkgbWF0cml4XG4gIEEgPSBuZXcgQXJyYXkobjIpO1xuICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBuMjsgX2k1KyspIHtcbiAgICBBW19pNV0gPSAwLjA7XG4gIH1cbiAgdmFyIG9sZCA9IG5ldyBBcnJheShuKTtcbiAgdmFyIFJwID0gbmV3IEFycmF5KG4pO1xuICB2YXIgc2UgPSBuZXcgQXJyYXkobik7XG4gIGZvciAodmFyIF9pNiA9IDA7IF9pNiA8IG47IF9pNisrKSB7XG4gICAgb2xkW19pNl0gPSAwLjA7XG4gICAgUnBbX2k2XSA9IDAuMDtcbiAgICBzZVtfaTZdID0gMDtcbiAgfVxuICB2YXIgZSA9IG5ldyBBcnJheShuICogb3B0cy5taW5JdGVyYXRpb25zKTtcbiAgZm9yICh2YXIgX2k3ID0gMDsgX2k3IDwgZS5sZW5ndGg7IF9pNysrKSB7XG4gICAgZVtfaTddID0gMDtcbiAgfVxuICB2YXIgaXRlcjtcbiAgZm9yIChpdGVyID0gMDsgaXRlciA8IG9wdHMubWF4SXRlcmF0aW9uczsgaXRlcisrKSB7XG4gICAgLy8gbWFpbiBhbGdvcml0aG1pYyBsb29wXG5cbiAgICAvLyBVcGRhdGUgUiByZXNwb25zaWJpbGl0eSBtYXRyaXhcbiAgICBmb3IgKHZhciBfaTggPSAwOyBfaTggPCBuOyBfaTgrKykge1xuICAgICAgdmFyIG1heCA9IC1JbmZpbml0eSxcbiAgICAgICAgbWF4MiA9IC1JbmZpbml0eSxcbiAgICAgICAgbWF4SSA9IC0xLFxuICAgICAgICBBUyA9IDAuMDtcbiAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBuOyBfaisrKSB7XG4gICAgICAgIG9sZFtfal0gPSBSW19pOCAqIG4gKyBfal07XG4gICAgICAgIEFTID0gQVtfaTggKiBuICsgX2pdICsgU1tfaTggKiBuICsgX2pdO1xuICAgICAgICBpZiAoQVMgPj0gbWF4KSB7XG4gICAgICAgICAgbWF4MiA9IG1heDtcbiAgICAgICAgICBtYXggPSBBUztcbiAgICAgICAgICBtYXhJID0gX2o7XG4gICAgICAgIH0gZWxzZSBpZiAoQVMgPiBtYXgyKSB7XG4gICAgICAgICAgbWF4MiA9IEFTO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBfajIgPSAwOyBfajIgPCBuOyBfajIrKykge1xuICAgICAgICBSW19pOCAqIG4gKyBfajJdID0gKDEgLSBvcHRzLmRhbXBpbmcpICogKFNbX2k4ICogbiArIF9qMl0gLSBtYXgpICsgb3B0cy5kYW1waW5nICogb2xkW19qMl07XG4gICAgICB9XG4gICAgICBSW19pOCAqIG4gKyBtYXhJXSA9ICgxIC0gb3B0cy5kYW1waW5nKSAqIChTW19pOCAqIG4gKyBtYXhJXSAtIG1heDIpICsgb3B0cy5kYW1waW5nICogb2xkW21heEldO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBBIGF2YWlsYWJpbGl0eSBtYXRyaXhcbiAgICBmb3IgKHZhciBfaTkgPSAwOyBfaTkgPCBuOyBfaTkrKykge1xuICAgICAgdmFyIHN1bSA9IDA7XG4gICAgICBmb3IgKHZhciBfajMgPSAwOyBfajMgPCBuOyBfajMrKykge1xuICAgICAgICBvbGRbX2ozXSA9IEFbX2ozICogbiArIF9pOV07XG4gICAgICAgIFJwW19qM10gPSBNYXRoLm1heCgwLCBSW19qMyAqIG4gKyBfaTldKTtcbiAgICAgICAgc3VtICs9IFJwW19qM107XG4gICAgICB9XG4gICAgICBzdW0gLT0gUnBbX2k5XTtcbiAgICAgIFJwW19pOV0gPSBSW19pOSAqIG4gKyBfaTldO1xuICAgICAgc3VtICs9IFJwW19pOV07XG4gICAgICBmb3IgKHZhciBfajQgPSAwOyBfajQgPCBuOyBfajQrKykge1xuICAgICAgICBBW19qNCAqIG4gKyBfaTldID0gKDEgLSBvcHRzLmRhbXBpbmcpICogTWF0aC5taW4oMCwgc3VtIC0gUnBbX2o0XSkgKyBvcHRzLmRhbXBpbmcgKiBvbGRbX2o0XTtcbiAgICAgIH1cbiAgICAgIEFbX2k5ICogbiArIF9pOV0gPSAoMSAtIG9wdHMuZGFtcGluZykgKiAoc3VtIC0gUnBbX2k5XSkgKyBvcHRzLmRhbXBpbmcgKiBvbGRbX2k5XTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgY29udmVyZ2VuY2VcbiAgICB2YXIgSyA9IDA7XG4gICAgZm9yICh2YXIgX2kxMCA9IDA7IF9pMTAgPCBuOyBfaTEwKyspIHtcbiAgICAgIHZhciBFID0gQVtfaTEwICogbiArIF9pMTBdICsgUltfaTEwICogbiArIF9pMTBdID4gMCA/IDEgOiAwO1xuICAgICAgZVtpdGVyICUgb3B0cy5taW5JdGVyYXRpb25zICogbiArIF9pMTBdID0gRTtcbiAgICAgIEsgKz0gRTtcbiAgICB9XG4gICAgaWYgKEsgPiAwICYmIChpdGVyID49IG9wdHMubWluSXRlcmF0aW9ucyAtIDEgfHwgaXRlciA9PSBvcHRzLm1heEl0ZXJhdGlvbnMgLSAxKSkge1xuICAgICAgdmFyIF9zdW0gPSAwO1xuICAgICAgZm9yICh2YXIgX2kxMSA9IDA7IF9pMTEgPCBuOyBfaTExKyspIHtcbiAgICAgICAgc2VbX2kxMV0gPSAwO1xuICAgICAgICBmb3IgKHZhciBfajUgPSAwOyBfajUgPCBvcHRzLm1pbkl0ZXJhdGlvbnM7IF9qNSsrKSB7XG4gICAgICAgICAgc2VbX2kxMV0gKz0gZVtfajUgKiBuICsgX2kxMV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlW19pMTFdID09PSAwIHx8IHNlW19pMTFdID09PSBvcHRzLm1pbkl0ZXJhdGlvbnMpIHtcbiAgICAgICAgICBfc3VtKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChfc3VtID09PSBuKSB7XG4gICAgICAgIC8vIHRoZW4gd2UgaGF2ZSBjb252ZXJnZW5jZVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBJZGVudGlmeSBleGVtcGxhcnMgKGNsdXN0ZXIgY2VudGVycylcbiAgdmFyIGV4ZW1wbGFyc0luZGljZXMgPSBmaW5kRXhlbXBsYXJzKG4sIFIsIEEpO1xuXG4gIC8vIEFzc2lnbiBub2RlcyB0byBjbHVzdGVyc1xuICB2YXIgY2x1c3RlckluZGljZXMgPSBhc3NpZ24obiwgUywgZXhlbXBsYXJzSW5kaWNlcyk7XG4gIHZhciBjbHVzdGVycyA9IHt9O1xuICBmb3IgKHZhciBjID0gMDsgYyA8IGV4ZW1wbGFyc0luZGljZXMubGVuZ3RoOyBjKyspIHtcbiAgICBjbHVzdGVyc1tleGVtcGxhcnNJbmRpY2VzW2NdXSA9IFtdO1xuICB9XG4gIGZvciAodmFyIF9pMTIgPSAwOyBfaTEyIDwgbm9kZXMubGVuZ3RoOyBfaTEyKyspIHtcbiAgICB2YXIgcG9zID0gaWQycG9zaXRpb25bbm9kZXNbX2kxMl0uaWQoKV07XG4gICAgdmFyIGNsdXN0ZXJJbmRleCA9IGNsdXN0ZXJJbmRpY2VzW3Bvc107XG4gICAgaWYgKGNsdXN0ZXJJbmRleCAhPSBudWxsKSB7XG4gICAgICAvLyB0aGUgbm9kZSBtYXkgaGF2ZSBub3QgYmVlbiBhc3NpZ25lZCBhIGNsdXN0ZXIgaWYgbm8gdmFsaWQgYXR0cmlidXRlcyB3ZXJlIHNwZWNpZmllZFxuICAgICAgY2x1c3RlcnNbY2x1c3RlckluZGV4XS5wdXNoKG5vZGVzW19pMTJdKTtcbiAgICB9XG4gIH1cbiAgdmFyIHJldENsdXN0ZXJzID0gbmV3IEFycmF5KGV4ZW1wbGFyc0luZGljZXMubGVuZ3RoKTtcbiAgZm9yICh2YXIgX2MgPSAwOyBfYyA8IGV4ZW1wbGFyc0luZGljZXMubGVuZ3RoOyBfYysrKSB7XG4gICAgcmV0Q2x1c3RlcnNbX2NdID0gY3kuY29sbGVjdGlvbihjbHVzdGVyc1tleGVtcGxhcnNJbmRpY2VzW19jXV0pO1xuICB9XG4gIHJldHVybiByZXRDbHVzdGVycztcbn07XG52YXIgYWZmaW5pdHlQcm9wYWdhdGlvbiQxID0ge1xuICBhZmZpbml0eVByb3BhZ2F0aW9uOiBhZmZpbml0eVByb3BhZ2F0aW9uLFxuICBhcDogYWZmaW5pdHlQcm9wYWdhdGlvblxufTtcblxudmFyIGhpZXJob2x6ZXJEZWZhdWx0cyA9IGRlZmF1bHRzJGcoe1xuICByb290OiB1bmRlZmluZWQsXG4gIGRpcmVjdGVkOiBmYWxzZVxufSk7XG52YXIgZWxlc2ZuJGsgPSB7XG4gIGhpZXJob2x6ZXI6IGZ1bmN0aW9uIGhpZXJob2x6ZXIob3B0aW9ucykge1xuICAgIGlmICghcGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgcm9vdDogYXJnc1swXSxcbiAgICAgICAgZGlyZWN0ZWQ6IGFyZ3NbMV1cbiAgICAgIH07XG4gICAgfVxuICAgIHZhciBfaGllcmhvbHplckRlZmF1bHRzID0gaGllcmhvbHplckRlZmF1bHRzKG9wdGlvbnMpLFxuICAgICAgcm9vdCA9IF9oaWVyaG9semVyRGVmYXVsdHMucm9vdCxcbiAgICAgIGRpcmVjdGVkID0gX2hpZXJob2x6ZXJEZWZhdWx0cy5kaXJlY3RlZDtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIGRmbGFnID0gZmFsc2U7XG4gICAgdmFyIG9kZEluO1xuICAgIHZhciBvZGRPdXQ7XG4gICAgdmFyIHN0YXJ0VmVydGV4O1xuICAgIGlmIChyb290KSBzdGFydFZlcnRleCA9IHN0cmluZyhyb290KSA/IHRoaXMuZmlsdGVyKHJvb3QpWzBdLmlkKCkgOiByb290WzBdLmlkKCk7XG4gICAgdmFyIG5vZGVzID0ge307XG4gICAgdmFyIGVkZ2VzID0ge307XG4gICAgaWYgKGRpcmVjdGVkKSB7XG4gICAgICBlbGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICAgICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgICAgIHZhciBpbmQgPSBlbGUuaW5kZWdyZWUodHJ1ZSk7XG4gICAgICAgICAgdmFyIG91dGQgPSBlbGUub3V0ZGVncmVlKHRydWUpO1xuICAgICAgICAgIHZhciBkMSA9IGluZCAtIG91dGQ7XG4gICAgICAgICAgdmFyIGQyID0gb3V0ZCAtIGluZDtcbiAgICAgICAgICBpZiAoZDEgPT0gMSkge1xuICAgICAgICAgICAgaWYgKG9kZEluKSBkZmxhZyA9IHRydWU7ZWxzZSBvZGRJbiA9IGlkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZDIgPT0gMSkge1xuICAgICAgICAgICAgaWYgKG9kZE91dCkgZGZsYWcgPSB0cnVlO2Vsc2Ugb2RkT3V0ID0gaWQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChkMiA+IDEgfHwgZDEgPiAxKSB7XG4gICAgICAgICAgICBkZmxhZyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGVzW2lkXSA9IFtdO1xuICAgICAgICAgIGVsZS5vdXRnb2VycygpLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGlmIChlLmlzRWRnZSgpKSBub2Rlc1tpZF0ucHVzaChlLmlkKCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVkZ2VzW2lkXSA9IFt1bmRlZmluZWQsIGVsZS50YXJnZXQoKS5pZCgpXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuICAgICAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgICAgdmFyIGQgPSBlbGUuZGVncmVlKHRydWUpO1xuICAgICAgICAgIGlmIChkICUgMikge1xuICAgICAgICAgICAgaWYgKCFvZGRJbikgb2RkSW4gPSBpZDtlbHNlIGlmICghb2RkT3V0KSBvZGRPdXQgPSBpZDtlbHNlIGRmbGFnID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZXNbaWRdID0gW107XG4gICAgICAgICAgZWxlLmNvbm5lY3RlZEVkZ2VzKCkuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVzW2lkXS5wdXNoKGUuaWQoKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWRnZXNbaWRdID0gW2VsZS5zb3VyY2UoKS5pZCgpLCBlbGUudGFyZ2V0KCkuaWQoKV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgZm91bmQ6IGZhbHNlLFxuICAgICAgdHJhaWw6IHVuZGVmaW5lZFxuICAgIH07XG4gICAgaWYgKGRmbGFnKSByZXR1cm4gcmVzdWx0O2Vsc2UgaWYgKG9kZE91dCAmJiBvZGRJbikge1xuICAgICAgaWYgKGRpcmVjdGVkKSB7XG4gICAgICAgIGlmIChzdGFydFZlcnRleCAmJiBvZGRPdXQgIT0gc3RhcnRWZXJ0ZXgpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHN0YXJ0VmVydGV4ID0gb2RkT3V0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHN0YXJ0VmVydGV4ICYmIG9kZE91dCAhPSBzdGFydFZlcnRleCAmJiBvZGRJbiAhPSBzdGFydFZlcnRleCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoIXN0YXJ0VmVydGV4KSB7XG4gICAgICAgICAgc3RhcnRWZXJ0ZXggPSBvZGRPdXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFzdGFydFZlcnRleCkgc3RhcnRWZXJ0ZXggPSBlbGVzWzBdLmlkKCk7XG4gICAgfVxuICAgIHZhciB3YWxrID0gZnVuY3Rpb24gd2Fsayh2KSB7XG4gICAgICB2YXIgY3VycmVudE5vZGUgPSB2O1xuICAgICAgdmFyIHN1YnRvdXIgPSBbdl07XG4gICAgICB2YXIgYWRqLCBhZGpUYWlsLCBhZGpIZWFkO1xuICAgICAgd2hpbGUgKG5vZGVzW2N1cnJlbnROb2RlXS5sZW5ndGgpIHtcbiAgICAgICAgYWRqID0gbm9kZXNbY3VycmVudE5vZGVdLnNoaWZ0KCk7XG4gICAgICAgIGFkalRhaWwgPSBlZGdlc1thZGpdWzBdO1xuICAgICAgICBhZGpIZWFkID0gZWRnZXNbYWRqXVsxXTtcbiAgICAgICAgaWYgKGN1cnJlbnROb2RlICE9IGFkakhlYWQpIHtcbiAgICAgICAgICBub2Rlc1thZGpIZWFkXSA9IG5vZGVzW2FkakhlYWRdLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGUgIT0gYWRqO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGN1cnJlbnROb2RlID0gYWRqSGVhZDtcbiAgICAgICAgfSBlbHNlIGlmICghZGlyZWN0ZWQgJiYgY3VycmVudE5vZGUgIT0gYWRqVGFpbCkge1xuICAgICAgICAgIG5vZGVzW2FkalRhaWxdID0gbm9kZXNbYWRqVGFpbF0uZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZSAhPSBhZGo7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY3VycmVudE5vZGUgPSBhZGpUYWlsO1xuICAgICAgICB9XG4gICAgICAgIHN1YnRvdXIudW5zaGlmdChhZGopO1xuICAgICAgICBzdWJ0b3VyLnVuc2hpZnQoY3VycmVudE5vZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1YnRvdXI7XG4gICAgfTtcbiAgICB2YXIgdHJhaWwgPSBbXTtcbiAgICB2YXIgc3VidG91ciA9IFtdO1xuICAgIHN1YnRvdXIgPSB3YWxrKHN0YXJ0VmVydGV4KTtcbiAgICB3aGlsZSAoc3VidG91ci5sZW5ndGggIT0gMSkge1xuICAgICAgaWYgKG5vZGVzW3N1YnRvdXJbMF1dLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHRyYWlsLnVuc2hpZnQoZWxlcy5nZXRFbGVtZW50QnlJZChzdWJ0b3VyLnNoaWZ0KCkpKTtcbiAgICAgICAgdHJhaWwudW5zaGlmdChlbGVzLmdldEVsZW1lbnRCeUlkKHN1YnRvdXIuc2hpZnQoKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3VidG91ciA9IHdhbGsoc3VidG91ci5zaGlmdCgpKS5jb25jYXQoc3VidG91cik7XG4gICAgICB9XG4gICAgfVxuICAgIHRyYWlsLnVuc2hpZnQoZWxlcy5nZXRFbGVtZW50QnlJZChzdWJ0b3VyLnNoaWZ0KCkpKTsgLy8gZmluYWwgbm9kZVxuXG4gICAgZm9yICh2YXIgZCBpbiBub2Rlcykge1xuICAgICAgaWYgKG5vZGVzW2RdLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQuZm91bmQgPSB0cnVlO1xuICAgIHJlc3VsdC50cmFpbCA9IHRoaXMuc3Bhd24odHJhaWwsIHRydWUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5cbnZhciBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkID0gZnVuY3Rpb24gaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZCgpIHtcbiAgdmFyIGVsZXMgPSB0aGlzO1xuICB2YXIgbm9kZXMgPSB7fTtcbiAgdmFyIGlkID0gMDtcbiAgdmFyIGVkZ2VDb3VudCA9IDA7XG4gIHZhciBjb21wb25lbnRzID0gW107XG4gIHZhciBzdGFjayA9IFtdO1xuICB2YXIgdmlzaXRlZEVkZ2VzID0ge307XG4gIHZhciBidWlsZENvbXBvbmVudCA9IGZ1bmN0aW9uIGJ1aWxkQ29tcG9uZW50KHgsIHkpIHtcbiAgICB2YXIgaSA9IHN0YWNrLmxlbmd0aCAtIDE7XG4gICAgdmFyIGN1dHNldCA9IFtdO1xuICAgIHZhciBjb21wb25lbnQgPSBlbGVzLnNwYXduKCk7XG4gICAgd2hpbGUgKHN0YWNrW2ldLnggIT0geCB8fCBzdGFja1tpXS55ICE9IHkpIHtcbiAgICAgIGN1dHNldC5wdXNoKHN0YWNrLnBvcCgpLmVkZ2UpO1xuICAgICAgaS0tO1xuICAgIH1cbiAgICBjdXRzZXQucHVzaChzdGFjay5wb3AoKS5lZGdlKTtcbiAgICBjdXRzZXQuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgdmFyIGNvbm5lY3RlZE5vZGVzID0gZWRnZS5jb25uZWN0ZWROb2RlcygpLmludGVyc2VjdGlvbihlbGVzKTtcbiAgICAgIGNvbXBvbmVudC5tZXJnZShlZGdlKTtcbiAgICAgIGNvbm5lY3RlZE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdmFyIG5vZGVJZCA9IG5vZGUuaWQoKTtcbiAgICAgICAgdmFyIGNvbm5lY3RlZEVkZ2VzID0gbm9kZS5jb25uZWN0ZWRFZGdlcygpLmludGVyc2VjdGlvbihlbGVzKTtcbiAgICAgICAgY29tcG9uZW50Lm1lcmdlKG5vZGUpO1xuICAgICAgICBpZiAoIW5vZGVzW25vZGVJZF0uY3V0VmVydGV4KSB7XG4gICAgICAgICAgY29tcG9uZW50Lm1lcmdlKGNvbm5lY3RlZEVkZ2VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21wb25lbnQubWVyZ2UoY29ubmVjdGVkRWRnZXMuZmlsdGVyKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgICAgICByZXR1cm4gZWRnZS5pc0xvb3AoKTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICB9O1xuICB2YXIgYmljb25uZWN0ZWRTZWFyY2ggPSBmdW5jdGlvbiBiaWNvbm5lY3RlZFNlYXJjaChyb290LCBjdXJyZW50Tm9kZSwgcGFyZW50KSB7XG4gICAgaWYgKHJvb3QgPT09IHBhcmVudCkgZWRnZUNvdW50ICs9IDE7XG4gICAgbm9kZXNbY3VycmVudE5vZGVdID0ge1xuICAgICAgaWQ6IGlkLFxuICAgICAgbG93OiBpZCsrLFxuICAgICAgY3V0VmVydGV4OiBmYWxzZVxuICAgIH07XG4gICAgdmFyIGVkZ2VzID0gZWxlcy5nZXRFbGVtZW50QnlJZChjdXJyZW50Tm9kZSkuY29ubmVjdGVkRWRnZXMoKS5pbnRlcnNlY3Rpb24oZWxlcyk7XG4gICAgaWYgKGVkZ2VzLnNpemUoKSA9PT0gMCkge1xuICAgICAgY29tcG9uZW50cy5wdXNoKGVsZXMuc3Bhd24oZWxlcy5nZXRFbGVtZW50QnlJZChjdXJyZW50Tm9kZSkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNvdXJjZUlkLCB0YXJnZXRJZCwgb3RoZXJOb2RlSWQsIGVkZ2VJZDtcbiAgICAgIGVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgc291cmNlSWQgPSBlZGdlLnNvdXJjZSgpLmlkKCk7XG4gICAgICAgIHRhcmdldElkID0gZWRnZS50YXJnZXQoKS5pZCgpO1xuICAgICAgICBvdGhlck5vZGVJZCA9IHNvdXJjZUlkID09PSBjdXJyZW50Tm9kZSA/IHRhcmdldElkIDogc291cmNlSWQ7XG4gICAgICAgIGlmIChvdGhlck5vZGVJZCAhPT0gcGFyZW50KSB7XG4gICAgICAgICAgZWRnZUlkID0gZWRnZS5pZCgpO1xuICAgICAgICAgIGlmICghdmlzaXRlZEVkZ2VzW2VkZ2VJZF0pIHtcbiAgICAgICAgICAgIHZpc2l0ZWRFZGdlc1tlZGdlSWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICB4OiBjdXJyZW50Tm9kZSxcbiAgICAgICAgICAgICAgeTogb3RoZXJOb2RlSWQsXG4gICAgICAgICAgICAgIGVkZ2U6IGVkZ2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIShvdGhlck5vZGVJZCBpbiBub2RlcykpIHtcbiAgICAgICAgICAgIGJpY29ubmVjdGVkU2VhcmNoKHJvb3QsIG90aGVyTm9kZUlkLCBjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICBub2Rlc1tjdXJyZW50Tm9kZV0ubG93ID0gTWF0aC5taW4obm9kZXNbY3VycmVudE5vZGVdLmxvdywgbm9kZXNbb3RoZXJOb2RlSWRdLmxvdyk7XG4gICAgICAgICAgICBpZiAobm9kZXNbY3VycmVudE5vZGVdLmlkIDw9IG5vZGVzW290aGVyTm9kZUlkXS5sb3cpIHtcbiAgICAgICAgICAgICAgbm9kZXNbY3VycmVudE5vZGVdLmN1dFZlcnRleCA9IHRydWU7XG4gICAgICAgICAgICAgIGJ1aWxkQ29tcG9uZW50KGN1cnJlbnROb2RlLCBvdGhlck5vZGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vZGVzW2N1cnJlbnROb2RlXS5sb3cgPSBNYXRoLm1pbihub2Rlc1tjdXJyZW50Tm9kZV0ubG93LCBub2Rlc1tvdGhlck5vZGVJZF0uaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICBlbGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIHZhciBub2RlSWQgPSBlbGUuaWQoKTtcbiAgICAgIGlmICghKG5vZGVJZCBpbiBub2RlcykpIHtcbiAgICAgICAgZWRnZUNvdW50ID0gMDtcbiAgICAgICAgYmljb25uZWN0ZWRTZWFyY2gobm9kZUlkLCBub2RlSWQpO1xuICAgICAgICBub2Rlc1tub2RlSWRdLmN1dFZlcnRleCA9IGVkZ2VDb3VudCA+IDE7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdmFyIGN1dFZlcnRpY2VzID0gT2JqZWN0LmtleXMobm9kZXMpLmZpbHRlcihmdW5jdGlvbiAoaWQpIHtcbiAgICByZXR1cm4gbm9kZXNbaWRdLmN1dFZlcnRleDtcbiAgfSkubWFwKGZ1bmN0aW9uIChpZCkge1xuICAgIHJldHVybiBlbGVzLmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgY3V0OiBlbGVzLnNwYXduKGN1dFZlcnRpY2VzKSxcbiAgICBjb21wb25lbnRzOiBjb21wb25lbnRzXG4gIH07XG59O1xudmFyIGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWQkMSA9IHtcbiAgaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZDogaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZCxcbiAgaHRiYzogaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZCxcbiAgaHRiOiBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkLFxuICBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkQ29tcG9uZW50czogaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZFxufTtcblxudmFyIHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkID0gZnVuY3Rpb24gdGFyamFuU3Ryb25nbHlDb25uZWN0ZWQoKSB7XG4gIHZhciBlbGVzID0gdGhpcztcbiAgdmFyIG5vZGVzID0ge307XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBjb21wb25lbnRzID0gW107XG4gIHZhciBzdGFjayA9IFtdO1xuICB2YXIgY3V0ID0gZWxlcy5zcGF3bihlbGVzKTtcbiAgdmFyIHN0cm9uZ2x5Q29ubmVjdGVkU2VhcmNoID0gZnVuY3Rpb24gc3Ryb25nbHlDb25uZWN0ZWRTZWFyY2goc291cmNlTm9kZUlkKSB7XG4gICAgc3RhY2sucHVzaChzb3VyY2VOb2RlSWQpO1xuICAgIG5vZGVzW3NvdXJjZU5vZGVJZF0gPSB7XG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBsb3c6IGluZGV4KyssXG4gICAgICBleHBsb3JlZDogZmFsc2VcbiAgICB9O1xuICAgIHZhciBjb25uZWN0ZWRFZGdlcyA9IGVsZXMuZ2V0RWxlbWVudEJ5SWQoc291cmNlTm9kZUlkKS5jb25uZWN0ZWRFZGdlcygpLmludGVyc2VjdGlvbihlbGVzKTtcbiAgICBjb25uZWN0ZWRFZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICB2YXIgdGFyZ2V0Tm9kZUlkID0gZWRnZS50YXJnZXQoKS5pZCgpO1xuICAgICAgaWYgKHRhcmdldE5vZGVJZCAhPT0gc291cmNlTm9kZUlkKSB7XG4gICAgICAgIGlmICghKHRhcmdldE5vZGVJZCBpbiBub2RlcykpIHtcbiAgICAgICAgICBzdHJvbmdseUNvbm5lY3RlZFNlYXJjaCh0YXJnZXROb2RlSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbm9kZXNbdGFyZ2V0Tm9kZUlkXS5leHBsb3JlZCkge1xuICAgICAgICAgIG5vZGVzW3NvdXJjZU5vZGVJZF0ubG93ID0gTWF0aC5taW4obm9kZXNbc291cmNlTm9kZUlkXS5sb3csIG5vZGVzW3RhcmdldE5vZGVJZF0ubG93KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChub2Rlc1tzb3VyY2VOb2RlSWRdLmluZGV4ID09PSBub2Rlc1tzb3VyY2VOb2RlSWRdLmxvdykge1xuICAgICAgdmFyIGNvbXBvbmVudE5vZGVzID0gZWxlcy5zcGF3bigpO1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICB2YXIgbm9kZUlkID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGNvbXBvbmVudE5vZGVzLm1lcmdlKGVsZXMuZ2V0RWxlbWVudEJ5SWQobm9kZUlkKSk7XG4gICAgICAgIG5vZGVzW25vZGVJZF0ubG93ID0gbm9kZXNbc291cmNlTm9kZUlkXS5pbmRleDtcbiAgICAgICAgbm9kZXNbbm9kZUlkXS5leHBsb3JlZCA9IHRydWU7XG4gICAgICAgIGlmIChub2RlSWQgPT09IHNvdXJjZU5vZGVJZCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgY29tcG9uZW50RWRnZXMgPSBjb21wb25lbnROb2Rlcy5lZGdlc1dpdGgoY29tcG9uZW50Tm9kZXMpO1xuICAgICAgdmFyIGNvbXBvbmVudCA9IGNvbXBvbmVudE5vZGVzLm1lcmdlKGNvbXBvbmVudEVkZ2VzKTtcbiAgICAgIGNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICAgICAgY3V0ID0gY3V0LmRpZmZlcmVuY2UoY29tcG9uZW50KTtcbiAgICB9XG4gIH07XG4gIGVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgdmFyIG5vZGVJZCA9IGVsZS5pZCgpO1xuICAgICAgaWYgKCEobm9kZUlkIGluIG5vZGVzKSkge1xuICAgICAgICBzdHJvbmdseUNvbm5lY3RlZFNlYXJjaChub2RlSWQpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiB7XG4gICAgY3V0OiBjdXQsXG4gICAgY29tcG9uZW50czogY29tcG9uZW50c1xuICB9O1xufTtcbnZhciB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZCQxID0ge1xuICB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZDogdGFyamFuU3Ryb25nbHlDb25uZWN0ZWQsXG4gIHRzYzogdGFyamFuU3Ryb25nbHlDb25uZWN0ZWQsXG4gIHRzY2M6IHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkLFxuICB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZENvbXBvbmVudHM6IHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkXG59O1xuXG52YXIgZWxlc2ZuJGogPSB7fTtcbltlbGVzZm4kdiwgZWxlc2ZuJHUsIGVsZXNmbiR0LCBlbGVzZm4kcywgZWxlc2ZuJHIsIGVsZXNmbiRxLCBlbGVzZm4kcCwgZWxlc2ZuJG8sIGVsZXNmbiRuLCBlbGVzZm4kbSwgZWxlc2ZuJGwsIG1hcmtvdkNsdXN0ZXJpbmckMSwga0NsdXN0ZXJpbmcsIGhpZXJhcmNoaWNhbENsdXN0ZXJpbmckMSwgYWZmaW5pdHlQcm9wYWdhdGlvbiQxLCBlbGVzZm4kaywgaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZCQxLCB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZCQxXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoZWxlc2ZuJGosIHByb3BzKTtcbn0pO1xuXG4vKiFcbkVtYmVkZGFibGUgTWluaW11bSBTdHJpY3RseS1Db21wbGlhbnQgUHJvbWlzZXMvQSsgMS4xLjEgVGhlbmFibGVcbkNvcHlyaWdodCAoYykgMjAxMy0yMDE0IFJhbGYgUy4gRW5nZWxzY2hhbGwgKGh0dHA6Ly9lbmdlbHNjaGFsbC5jb20pXG5MaWNlbnNlZCB1bmRlciBUaGUgTUlUIExpY2Vuc2UgKGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQpXG4qL1xuXG4vKiAgcHJvbWlzZSBzdGF0ZXMgW1Byb21pc2VzL0ErIDIuMV0gICovXG52YXIgU1RBVEVfUEVORElORyA9IDA7IC8qICBbUHJvbWlzZXMvQSsgMi4xLjFdICAqL1xudmFyIFNUQVRFX0ZVTEZJTExFRCA9IDE7IC8qICBbUHJvbWlzZXMvQSsgMi4xLjJdICAqL1xudmFyIFNUQVRFX1JFSkVDVEVEID0gMjsgLyogIFtQcm9taXNlcy9BKyAyLjEuM10gICovXG5cbi8qICBwcm9taXNlIG9iamVjdCBjb25zdHJ1Y3RvciAgKi9cbnZhciBhcGkgPSBmdW5jdGlvbiBhcGkoZXhlY3V0b3IpIHtcbiAgLyogIG9wdGlvbmFsbHkgc3VwcG9ydCBub24tY29uc3RydWN0b3IvcGxhaW4tZnVuY3Rpb24gY2FsbCAgKi9cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIGFwaSkpIHJldHVybiBuZXcgYXBpKGV4ZWN1dG9yKTtcblxuICAvKiAgaW5pdGlhbGl6ZSBvYmplY3QgICovXG4gIHRoaXMuaWQgPSAnVGhlbmFibGUvMS4wLjcnO1xuICB0aGlzLnN0YXRlID0gU1RBVEVfUEVORElORzsgLyogIGluaXRpYWwgc3RhdGUgICovXG4gIHRoaXMuZnVsZmlsbFZhbHVlID0gdW5kZWZpbmVkOyAvKiAgaW5pdGlhbCB2YWx1ZSAgKi8gLyogIFtQcm9taXNlcy9BKyAxLjMsIDIuMS4yLjJdICAqL1xuICB0aGlzLnJlamVjdFJlYXNvbiA9IHVuZGVmaW5lZDsgLyogIGluaXRpYWwgcmVhc29uICovIC8qICBbUHJvbWlzZXMvQSsgMS41LCAyLjEuMy4yXSAgKi9cbiAgdGhpcy5vbkZ1bGZpbGxlZCA9IFtdOyAvKiAgaW5pdGlhbCBoYW5kbGVycyAgKi9cbiAgdGhpcy5vblJlamVjdGVkID0gW107IC8qICBpbml0aWFsIGhhbmRsZXJzICAqL1xuXG4gIC8qICBwcm92aWRlIG9wdGlvbmFsIGluZm9ybWF0aW9uLWhpZGluZyBwcm94eSAgKi9cbiAgdGhpcy5wcm94eSA9IHtcbiAgICB0aGVuOiB0aGlzLnRoZW4uYmluZCh0aGlzKVxuICB9O1xuXG4gIC8qICBzdXBwb3J0IG9wdGlvbmFsIGV4ZWN1dG9yIGZ1bmN0aW9uICAqL1xuICBpZiAodHlwZW9mIGV4ZWN1dG9yID09PSAnZnVuY3Rpb24nKSBleGVjdXRvci5jYWxsKHRoaXMsIHRoaXMuZnVsZmlsbC5iaW5kKHRoaXMpLCB0aGlzLnJlamVjdC5iaW5kKHRoaXMpKTtcbn07XG5cbi8qICBwcm9taXNlIEFQSSBtZXRob2RzICAqL1xuYXBpLnByb3RvdHlwZSA9IHtcbiAgLyogIHByb21pc2UgcmVzb2x2aW5nIG1ldGhvZHMgICovXG4gIGZ1bGZpbGw6IGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHtcbiAgICByZXR1cm4gZGVsaXZlcih0aGlzLCBTVEFURV9GVUxGSUxMRUQsICdmdWxmaWxsVmFsdWUnLCB2YWx1ZSk7XG4gIH0sXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIGRlbGl2ZXIodGhpcywgU1RBVEVfUkVKRUNURUQsICdyZWplY3RSZWFzb24nLCB2YWx1ZSk7XG4gIH0sXG4gIC8qICBcIlRoZSB0aGVuIE1ldGhvZFwiIFtQcm9taXNlcy9BKyAxLjEsIDEuMiwgMi4yXSAgKi9cbiAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgIHZhciBjdXJyID0gdGhpcztcbiAgICB2YXIgbmV4dCA9IG5ldyBhcGkoKTsgLyogIFtQcm9taXNlcy9BKyAyLjIuN10gICovXG4gICAgY3Vyci5vbkZ1bGZpbGxlZC5wdXNoKHJlc29sdmVyKG9uRnVsZmlsbGVkLCBuZXh0LCAnZnVsZmlsbCcpKTsgLyogIFtQcm9taXNlcy9BKyAyLjIuMi8yLjIuNl0gICovXG4gICAgY3Vyci5vblJlamVjdGVkLnB1c2gocmVzb2x2ZXIob25SZWplY3RlZCwgbmV4dCwgJ3JlamVjdCcpKTsgLyogIFtQcm9taXNlcy9BKyAyLjIuMy8yLjIuNl0gICovXG4gICAgZXhlY3V0ZShjdXJyKTtcbiAgICByZXR1cm4gbmV4dC5wcm94eTsgLyogIFtQcm9taXNlcy9BKyAyLjIuNywgMy4zXSAgKi9cbiAgfVxufTtcblxuLyogIGRlbGl2ZXIgYW4gYWN0aW9uICAqL1xudmFyIGRlbGl2ZXIgPSBmdW5jdGlvbiBkZWxpdmVyKGN1cnIsIHN0YXRlLCBuYW1lLCB2YWx1ZSkge1xuICBpZiAoY3Vyci5zdGF0ZSA9PT0gU1RBVEVfUEVORElORykge1xuICAgIGN1cnIuc3RhdGUgPSBzdGF0ZTsgLyogIFtQcm9taXNlcy9BKyAyLjEuMi4xLCAyLjEuMy4xXSAgKi9cbiAgICBjdXJyW25hbWVdID0gdmFsdWU7IC8qICBbUHJvbWlzZXMvQSsgMi4xLjIuMiwgMi4xLjMuMl0gICovXG4gICAgZXhlY3V0ZShjdXJyKTtcbiAgfVxuICByZXR1cm4gY3Vycjtcbn07XG5cbi8qICBleGVjdXRlIGFsbCBoYW5kbGVycyAgKi9cbnZhciBleGVjdXRlID0gZnVuY3Rpb24gZXhlY3V0ZShjdXJyKSB7XG4gIGlmIChjdXJyLnN0YXRlID09PSBTVEFURV9GVUxGSUxMRUQpIGV4ZWN1dGVfaGFuZGxlcnMoY3VyciwgJ29uRnVsZmlsbGVkJywgY3Vyci5mdWxmaWxsVmFsdWUpO2Vsc2UgaWYgKGN1cnIuc3RhdGUgPT09IFNUQVRFX1JFSkVDVEVEKSBleGVjdXRlX2hhbmRsZXJzKGN1cnIsICdvblJlamVjdGVkJywgY3Vyci5yZWplY3RSZWFzb24pO1xufTtcblxuLyogIGV4ZWN1dGUgcGFydGljdWxhciBzZXQgb2YgaGFuZGxlcnMgICovXG52YXIgZXhlY3V0ZV9oYW5kbGVycyA9IGZ1bmN0aW9uIGV4ZWN1dGVfaGFuZGxlcnMoY3VyciwgbmFtZSwgdmFsdWUpIHtcbiAgLyogZ2xvYmFsIHNldEltbWVkaWF0ZTogdHJ1ZSAqL1xuICAvKiBnbG9iYWwgc2V0VGltZW91dDogdHJ1ZSAqL1xuXG4gIC8qICBzaG9ydC1jaXJjdWl0IHByb2Nlc3NpbmcgICovXG4gIGlmIChjdXJyW25hbWVdLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIC8qICBpdGVyYXRlIG92ZXIgYWxsIGhhbmRsZXJzLCBleGFjdGx5IG9uY2UgICovXG4gIHZhciBoYW5kbGVycyA9IGN1cnJbbmFtZV07XG4gIGN1cnJbbmFtZV0gPSBbXTsgLyogIFtQcm9taXNlcy9BKyAyLjIuMi4zLCAyLjIuMy4zXSAgKi9cbiAgdmFyIGZ1bmMgPSBmdW5jdGlvbiBmdW5jKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGhhbmRsZXJzW2ldKHZhbHVlKTtcbiAgICB9IC8qICBbUHJvbWlzZXMvQSsgMi4yLjVdICAqL1xuICB9O1xuXG4gIC8qICBleGVjdXRlIHByb2NlZHVyZSBhc3luY2hyb25vdXNseSAgKi8gLyogIFtQcm9taXNlcy9BKyAyLjIuNCwgMy4xXSAgKi9cbiAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHNldEltbWVkaWF0ZShmdW5jKTtlbHNlIHNldFRpbWVvdXQoZnVuYywgMCk7XG59O1xuXG4vKiAgZ2VuZXJhdGUgYSByZXNvbHZlciBmdW5jdGlvbiAgKi9cbnZhciByZXNvbHZlciA9IGZ1bmN0aW9uIHJlc29sdmVyKGNiLCBuZXh0LCBtZXRob2QpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIC8qICBbUHJvbWlzZXMvQSsgMi4yLjEsIDIuMi43LjMsIDIuMi43LjRdICAqL1xuICAgICAgbmV4dFttZXRob2RdLmNhbGwobmV4dCwgdmFsdWUpOyAvKiAgW1Byb21pc2VzL0ErIDIuMi43LjMsIDIuMi43LjRdICAqL2Vsc2Uge1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGNiKHZhbHVlKTtcbiAgICAgIH0gLyogIFtQcm9taXNlcy9BKyAyLjIuMi4xLCAyLjIuMy4xLCAyLjIuNSwgMy4yXSAgKi8gY2F0Y2ggKGUpIHtcbiAgICAgICAgbmV4dC5yZWplY3QoZSk7IC8qICBbUHJvbWlzZXMvQSsgMi4yLjcuMl0gICovXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUobmV4dCwgcmVzdWx0KTsgLyogIFtQcm9taXNlcy9BKyAyLjIuNy4xXSAgKi9cbiAgICB9XG4gIH07XG59O1xuXG4vKiAgXCJQcm9taXNlIFJlc29sdXRpb24gUHJvY2VkdXJlXCIgICovIC8qICBbUHJvbWlzZXMvQSsgMi4zXSAgKi9cbnZhciByZXNvbHZlID0gZnVuY3Rpb24gcmVzb2x2ZShwcm9taXNlLCB4KSB7XG4gIC8qICBzYW5pdHkgY2hlY2sgYXJndW1lbnRzICAqLyAvKiAgW1Byb21pc2VzL0ErIDIuMy4xXSAgKi9cbiAgaWYgKHByb21pc2UgPT09IHggfHwgcHJvbWlzZS5wcm94eSA9PT0geCkge1xuICAgIHByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ2Nhbm5vdCByZXNvbHZlIHByb21pc2Ugd2l0aCBpdHNlbGYnKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyogIHN1cmdpY2FsbHkgY2hlY2sgZm9yIGEgXCJ0aGVuXCIgbWV0aG9kXG4gICAgKG1haW5seSB0byBqdXN0IGNhbGwgdGhlIFwiZ2V0dGVyXCIgb2YgXCJ0aGVuXCIgb25seSBvbmNlKSAgKi9cbiAgdmFyIHRoZW47XG4gIGlmIChfdHlwZW9mKHgpID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsIHx8IHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoZW4gPSB4LnRoZW47XG4gICAgfSAvKiAgW1Byb21pc2VzL0ErIDIuMy4zLjEsIDMuNV0gICovIGNhdGNoIChlKSB7XG4gICAgICBwcm9taXNlLnJlamVjdChlKTsgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4yXSAgKi9cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvKiAgaGFuZGxlIG93biBUaGVuYWJsZXMgICAgW1Byb21pc2VzL0ErIDIuMy4yXVxuICAgIGFuZCBzaW1pbGFyIFwidGhlbmFibGVzXCIgW1Byb21pc2VzL0ErIDIuMy4zXSAgKi9cbiAgaWYgKHR5cGVvZiB0aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHJlc29sdmVkID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIC8qICBjYWxsIHJldHJpZXZlZCBcInRoZW5cIiBtZXRob2QgKi8gLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zXSAgKi9cbiAgICAgIHRoZW4uY2FsbCh4LCAvKiAgcmVzb2x2ZVByb21pc2UgICovIC8qICBbUHJvbWlzZXMvQSsgMi4zLjMuMy4xXSAgKi9cbiAgICAgIGZ1bmN0aW9uICh5KSB7XG4gICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICByZXNvbHZlZCA9IHRydWU7IC8qICBbUHJvbWlzZXMvQSsgMi4zLjMuMy4zXSAgKi9cbiAgICAgICAgaWYgKHkgPT09IHgpIC8qICBbUHJvbWlzZXMvQSsgMy42XSAgKi9cbiAgICAgICAgICBwcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKCdjaXJjdWxhciB0aGVuYWJsZSBjaGFpbicpKTtlbHNlIHJlc29sdmUocHJvbWlzZSwgeSk7XG4gICAgICB9LCAvKiAgcmVqZWN0UHJvbWlzZSAgKi8gLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjJdICAqL1xuICAgICAgZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm47XG4gICAgICAgIHJlc29sdmVkID0gdHJ1ZTsgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjNdICAqL1xuICAgICAgICBwcm9taXNlLnJlamVjdChyKTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICghcmVzb2x2ZWQpIC8qICBbUHJvbWlzZXMvQSsgMi4zLjMuMy4zXSAgKi9cbiAgICAgICAgcHJvbWlzZS5yZWplY3QoZSk7IC8qICBbUHJvbWlzZXMvQSsgMi4zLjMuMy40XSAgKi9cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICAvKiAgaGFuZGxlIG90aGVyIHZhbHVlcyAgKi9cbiAgcHJvbWlzZS5mdWxmaWxsKHgpOyAvKiAgW1Byb21pc2VzL0ErIDIuMy40LCAyLjMuMy40XSAgKi9cbn07XG5cbi8vIHNvIHdlIGFsd2F5cyBoYXZlIFByb21pc2UuYWxsKClcbmFwaS5hbGwgPSBmdW5jdGlvbiAocHMpIHtcbiAgcmV0dXJuIG5ldyBhcGkoZnVuY3Rpb24gKHJlc29sdmVBbGwsIHJlamVjdEFsbCkge1xuICAgIHZhciB2YWxzID0gbmV3IEFycmF5KHBzLmxlbmd0aCk7XG4gICAgdmFyIGRvbmVDb3VudCA9IDA7XG4gICAgdmFyIGZ1bGZpbGwgPSBmdW5jdGlvbiBmdWxmaWxsKGksIHZhbCkge1xuICAgICAgdmFsc1tpXSA9IHZhbDtcbiAgICAgIGRvbmVDb3VudCsrO1xuICAgICAgaWYgKGRvbmVDb3VudCA9PT0gcHMubGVuZ3RoKSB7XG4gICAgICAgIHJlc29sdmVBbGwodmFscyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgdmFyIHAgPSBwc1tpXTtcbiAgICAgICAgdmFyIGlzUHJvbWlzZSA9IHAgIT0gbnVsbCAmJiBwLnRoZW4gIT0gbnVsbDtcbiAgICAgICAgaWYgKGlzUHJvbWlzZSkge1xuICAgICAgICAgIHAudGhlbihmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICBmdWxmaWxsKGksIHZhbCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgcmVqZWN0QWxsKGVycik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHZhbCA9IHA7XG4gICAgICAgICAgZnVsZmlsbChpLCB2YWwpO1xuICAgICAgICB9XG4gICAgICB9KShpKTtcbiAgICB9XG4gIH0pO1xufTtcbmFwaS5yZXNvbHZlID0gZnVuY3Rpb24gKHZhbCkge1xuICByZXR1cm4gbmV3IGFwaShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgcmVzb2x2ZSh2YWwpO1xuICB9KTtcbn07XG5hcGkucmVqZWN0ID0gZnVuY3Rpb24gKHZhbCkge1xuICByZXR1cm4gbmV3IGFwaShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgcmVqZWN0KHZhbCk7XG4gIH0pO1xufTtcbnZhciBQcm9taXNlJDEgPSB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgPyBQcm9taXNlIDogYXBpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbnZhciBBbmltYXRpb24gPSBmdW5jdGlvbiBBbmltYXRpb24odGFyZ2V0LCBvcHRzLCBvcHRzMikge1xuICB2YXIgaXNDb3JlID0gY29yZSh0YXJnZXQpO1xuICB2YXIgaXNFbGUgPSAhaXNDb3JlO1xuICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlID0gZXh0ZW5kKHtcbiAgICBkdXJhdGlvbjogMTAwMFxuICB9LCBvcHRzLCBvcHRzMik7XG4gIF9wLnRhcmdldCA9IHRhcmdldDtcbiAgX3Auc3R5bGUgPSBfcC5zdHlsZSB8fCBfcC5jc3M7XG4gIF9wLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgX3AucGxheWluZyA9IGZhbHNlO1xuICBfcC5ob29rZWQgPSBmYWxzZTtcbiAgX3AuYXBwbHlpbmcgPSBmYWxzZTtcbiAgX3AucHJvZ3Jlc3MgPSAwO1xuICBfcC5jb21wbGV0ZXMgPSBbXTtcbiAgX3AuZnJhbWVzID0gW107XG4gIGlmIChfcC5jb21wbGV0ZSAmJiBmbiQ2KF9wLmNvbXBsZXRlKSkge1xuICAgIF9wLmNvbXBsZXRlcy5wdXNoKF9wLmNvbXBsZXRlKTtcbiAgfVxuICBpZiAoaXNFbGUpIHtcbiAgICB2YXIgcG9zID0gdGFyZ2V0LnBvc2l0aW9uKCk7XG4gICAgX3Auc3RhcnRQb3NpdGlvbiA9IF9wLnN0YXJ0UG9zaXRpb24gfHwge1xuICAgICAgeDogcG9zLngsXG4gICAgICB5OiBwb3MueVxuICAgIH07XG4gICAgX3Auc3RhcnRTdHlsZSA9IF9wLnN0YXJ0U3R5bGUgfHwgdGFyZ2V0LmN5KCkuc3R5bGUoKS5nZXRBbmltYXRpb25TdGFydFN0eWxlKHRhcmdldCwgX3Auc3R5bGUpO1xuICB9XG4gIGlmIChpc0NvcmUpIHtcbiAgICB2YXIgcGFuID0gdGFyZ2V0LnBhbigpO1xuICAgIF9wLnN0YXJ0UGFuID0ge1xuICAgICAgeDogcGFuLngsXG4gICAgICB5OiBwYW4ueVxuICAgIH07XG4gICAgX3Auc3RhcnRab29tID0gdGFyZ2V0Lnpvb20oKTtcbiAgfVxuXG4gIC8vIGZvciBmdXR1cmUgdGltZWxpbmUvYW5pbWF0aW9ucyBpbXBsXG4gIHRoaXMubGVuZ3RoID0gMTtcbiAgdGhpc1swXSA9IHRoaXM7XG59O1xudmFyIGFuaWZuID0gQW5pbWF0aW9uLnByb3RvdHlwZTtcbmV4dGVuZChhbmlmbiwge1xuICBpbnN0YW5jZVN0cmluZzogZnVuY3Rpb24gaW5zdGFuY2VTdHJpbmcoKSB7XG4gICAgcmV0dXJuICdhbmltYXRpb24nO1xuICB9LFxuICBob29rOiBmdW5jdGlvbiBob29rKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgaWYgKCFfcC5ob29rZWQpIHtcbiAgICAgIC8vIGFkZCB0byB0YXJnZXQncyBhbmltYXRpb24gcXVldWVcbiAgICAgIHZhciBxO1xuICAgICAgdmFyIHRBbmkgPSBfcC50YXJnZXQuX3ByaXZhdGUuYW5pbWF0aW9uO1xuICAgICAgaWYgKF9wLnF1ZXVlKSB7XG4gICAgICAgIHEgPSB0QW5pLnF1ZXVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcSA9IHRBbmkuY3VycmVudDtcbiAgICAgIH1cbiAgICAgIHEucHVzaCh0aGlzKTtcblxuICAgICAgLy8gYWRkIHRvIHRoZSBhbmltYXRpb24gbG9vcCBwb29sXG4gICAgICBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihfcC50YXJnZXQpKSB7XG4gICAgICAgIF9wLnRhcmdldC5jeSgpLmFkZFRvQW5pbWF0aW9uUG9vbChfcC50YXJnZXQpO1xuICAgICAgfVxuICAgICAgX3AuaG9va2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHBsYXk6IGZ1bmN0aW9uIHBsYXkoKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcblxuICAgIC8vIGF1dG9yZXdpbmRcbiAgICBpZiAoX3AucHJvZ3Jlc3MgPT09IDEpIHtcbiAgICAgIF9wLnByb2dyZXNzID0gMDtcbiAgICB9XG4gICAgX3AucGxheWluZyA9IHRydWU7XG4gICAgX3Auc3RhcnRlZCA9IGZhbHNlOyAvLyBuZWVkcyB0byBiZSBzdGFydGVkIGJ5IGFuaW1hdGlvbiBsb29wXG4gICAgX3Auc3RvcHBlZCA9IGZhbHNlO1xuICAgIHRoaXMuaG9vaygpO1xuXG4gICAgLy8gdGhlIGFuaW1hdGlvbiBsb29wIHdpbGwgc3RhcnQgdGhlIGFuaW1hdGlvbi4uLlxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHBsYXlpbmc6IGZ1bmN0aW9uIHBsYXlpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUucGxheWluZztcbiAgfSxcbiAgYXBwbHk6IGZ1bmN0aW9uIGFwcGx5KCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgX3AuYXBwbHlpbmcgPSB0cnVlO1xuICAgIF9wLnN0YXJ0ZWQgPSBmYWxzZTsgLy8gbmVlZHMgdG8gYmUgc3RhcnRlZCBieSBhbmltYXRpb24gbG9vcFxuICAgIF9wLnN0b3BwZWQgPSBmYWxzZTtcbiAgICB0aGlzLmhvb2soKTtcblxuICAgIC8vIHRoZSBhbmltYXRpb24gbG9vcCB3aWxsIGFwcGx5IHRoZSBhbmltYXRpb24gYXQgdGhpcyBwcm9ncmVzc1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGFwcGx5aW5nOiBmdW5jdGlvbiBhcHBseWluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5hcHBseWluZztcbiAgfSxcbiAgcGF1c2U6IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgX3AucGxheWluZyA9IGZhbHNlO1xuICAgIF9wLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIF9wLnBsYXlpbmcgPSBmYWxzZTtcbiAgICBfcC5zdGFydGVkID0gZmFsc2U7XG4gICAgX3Auc3RvcHBlZCA9IHRydWU7IC8vIHRvIGJlIHJlbW92ZWQgZnJvbSBhbmltYXRpb24gcXVldWVzXG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmV3aW5kOiBmdW5jdGlvbiByZXdpbmQoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvZ3Jlc3MoMCk7XG4gIH0sXG4gIGZhc3Rmb3J3YXJkOiBmdW5jdGlvbiBmYXN0Zm9yd2FyZCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9ncmVzcygxKTtcbiAgfSxcbiAgdGltZTogZnVuY3Rpb24gdGltZSh0KSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBpZiAodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gX3AucHJvZ3Jlc3MgKiBfcC5kdXJhdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucHJvZ3Jlc3ModCAvIF9wLmR1cmF0aW9uKTtcbiAgICB9XG4gIH0sXG4gIHByb2dyZXNzOiBmdW5jdGlvbiBwcm9ncmVzcyhwKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgd2FzUGxheWluZyA9IF9wLnBsYXlpbmc7XG4gICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIF9wLnByb2dyZXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAod2FzUGxheWluZykge1xuICAgICAgICB0aGlzLnBhdXNlKCk7XG4gICAgICB9XG4gICAgICBfcC5wcm9ncmVzcyA9IHA7XG4gICAgICBfcC5zdGFydGVkID0gZmFsc2U7XG4gICAgICBpZiAod2FzUGxheWluZykge1xuICAgICAgICB0aGlzLnBsYXkoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGNvbXBsZXRlZDogZnVuY3Rpb24gY29tcGxldGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnByb2dyZXNzID09PSAxO1xuICB9LFxuICByZXZlcnNlOiBmdW5jdGlvbiByZXZlcnNlKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgdmFyIHdhc1BsYXlpbmcgPSBfcC5wbGF5aW5nO1xuICAgIGlmICh3YXNQbGF5aW5nKSB7XG4gICAgICB0aGlzLnBhdXNlKCk7XG4gICAgfVxuICAgIF9wLnByb2dyZXNzID0gMSAtIF9wLnByb2dyZXNzO1xuICAgIF9wLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB2YXIgc3dhcCA9IGZ1bmN0aW9uIHN3YXAoYSwgYikge1xuICAgICAgdmFyIF9wYSA9IF9wW2FdO1xuICAgICAgaWYgKF9wYSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIF9wW2FdID0gX3BbYl07XG4gICAgICBfcFtiXSA9IF9wYTtcbiAgICB9O1xuICAgIHN3YXAoJ3pvb20nLCAnc3RhcnRab29tJyk7XG4gICAgc3dhcCgncGFuJywgJ3N0YXJ0UGFuJyk7XG4gICAgc3dhcCgncG9zaXRpb24nLCAnc3RhcnRQb3NpdGlvbicpO1xuXG4gICAgLy8gc3dhcCBzdHlsZXNcbiAgICBpZiAoX3Auc3R5bGUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3Auc3R5bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHByb3AgPSBfcC5zdHlsZVtpXTtcbiAgICAgICAgdmFyIG5hbWUgPSBwcm9wLm5hbWU7XG4gICAgICAgIHZhciBzdGFydFN0eWxlUHJvcCA9IF9wLnN0YXJ0U3R5bGVbbmFtZV07XG4gICAgICAgIF9wLnN0YXJ0U3R5bGVbbmFtZV0gPSBwcm9wO1xuICAgICAgICBfcC5zdHlsZVtpXSA9IHN0YXJ0U3R5bGVQcm9wO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAod2FzUGxheWluZykge1xuICAgICAgdGhpcy5wbGF5KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBwcm9taXNlOiBmdW5jdGlvbiBwcm9taXNlKHR5cGUpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciBhcnI7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdmcmFtZSc6XG4gICAgICAgIGFyciA9IF9wLmZyYW1lcztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgY2FzZSAnY29tcGxldGUnOlxuICAgICAgY2FzZSAnY29tcGxldGVkJzpcbiAgICAgICAgYXJyID0gX3AuY29tcGxldGVzO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBhcnIucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59KTtcbmFuaWZuLmNvbXBsZXRlID0gYW5pZm4uY29tcGxldGVkO1xuYW5pZm4ucnVuID0gYW5pZm4ucGxheTtcbmFuaWZuLnJ1bm5pbmcgPSBhbmlmbi5wbGF5aW5nO1xuXG52YXIgZGVmaW5lJDMgPSB7XG4gIGFuaW1hdGVkOiBmdW5jdGlvbiBhbmltYXRlZCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gYW5pbWF0ZWRJbXBsKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNlbGZJc0FycmF5TGlrZSA9IHNlbGYubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgICB2YXIgYWxsID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZiA6IFtzZWxmXTsgLy8gcHV0IGluIGFycmF5IGlmIG5vdCBhcnJheS1saWtlXG4gICAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5IHx8IHRoaXM7XG4gICAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBlbGUgPSBhbGxbMF07XG4gICAgICBpZiAoZWxlKSB7XG4gICAgICAgIHJldHVybiBlbGUuX3ByaXZhdGUuYW5pbWF0aW9uLmN1cnJlbnQubGVuZ3RoID4gMDtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICAvLyBhbmltYXRlZFxuXG4gIGNsZWFyUXVldWU6IGZ1bmN0aW9uIGNsZWFyUXVldWUoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGNsZWFyUXVldWVJbXBsKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNlbGZJc0FycmF5TGlrZSA9IHNlbGYubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgICB2YXIgYWxsID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZiA6IFtzZWxmXTsgLy8gcHV0IGluIGFycmF5IGlmIG5vdCBhcnJheS1saWtlXG4gICAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5IHx8IHRoaXM7XG4gICAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGFsbFtpXTtcbiAgICAgICAgZWxlLl9wcml2YXRlLmFuaW1hdGlvbi5xdWV1ZSA9IFtdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgfSxcbiAgLy8gY2xlYXJRdWV1ZVxuXG4gIGRlbGF5OiBmdW5jdGlvbiBkZWxheSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gZGVsYXlJbXBsKHRpbWUsIGNvbXBsZXRlKSB7XG4gICAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5IHx8IHRoaXM7XG4gICAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0ZSh7XG4gICAgICAgIGRlbGF5OiB0aW1lLFxuICAgICAgICBkdXJhdGlvbjogdGltZSxcbiAgICAgICAgY29tcGxldGU6IGNvbXBsZXRlXG4gICAgICB9KTtcbiAgICB9O1xuICB9LFxuICAvLyBkZWxheVxuXG4gIGRlbGF5QW5pbWF0aW9uOiBmdW5jdGlvbiBkZWxheUFuaW1hdGlvbigpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gZGVsYXlBbmltYXRpb25JbXBsKHRpbWUsIGNvbXBsZXRlKSB7XG4gICAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5IHx8IHRoaXM7XG4gICAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0aW9uKHtcbiAgICAgICAgZGVsYXk6IHRpbWUsXG4gICAgICAgIGR1cmF0aW9uOiB0aW1lLFxuICAgICAgICBjb21wbGV0ZTogY29tcGxldGVcbiAgICAgIH0pO1xuICAgIH07XG4gIH0sXG4gIC8vIGRlbGF5XG5cbiAgYW5pbWF0aW9uOiBmdW5jdGlvbiBhbmltYXRpb24oKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGFuaW1hdGlvbkltcGwocHJvcGVydGllcywgcGFyYW1zKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcbiAgICAgIHZhciBpc0NvcmUgPSAhc2VsZklzQXJyYXlMaWtlO1xuICAgICAgdmFyIGlzRWxlcyA9ICFpc0NvcmU7XG4gICAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgdmFyIHN0eWxlID0gY3kuc3R5bGUoKTtcbiAgICAgIHByb3BlcnRpZXMgPSBleHRlbmQoe30sIHByb3BlcnRpZXMsIHBhcmFtcyk7XG4gICAgICB2YXIgcHJvcGVydGllc0VtcHR5ID0gT2JqZWN0LmtleXMocHJvcGVydGllcykubGVuZ3RoID09PSAwO1xuICAgICAgaWYgKHByb3BlcnRpZXNFbXB0eSkge1xuICAgICAgICByZXR1cm4gbmV3IEFuaW1hdGlvbihhbGxbMF0sIHByb3BlcnRpZXMpOyAvLyBub3RoaW5nIHRvIGFuaW1hdGVcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BlcnRpZXMuZHVyYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wZXJ0aWVzLmR1cmF0aW9uID0gNDAwO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChwcm9wZXJ0aWVzLmR1cmF0aW9uKSB7XG4gICAgICAgIGNhc2UgJ3Nsb3cnOlxuICAgICAgICAgIHByb3BlcnRpZXMuZHVyYXRpb24gPSA2MDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Zhc3QnOlxuICAgICAgICAgIHByb3BlcnRpZXMuZHVyYXRpb24gPSAyMDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaXNFbGVzKSB7XG4gICAgICAgIHByb3BlcnRpZXMuc3R5bGUgPSBzdHlsZS5nZXRQcm9wc0xpc3QocHJvcGVydGllcy5zdHlsZSB8fCBwcm9wZXJ0aWVzLmNzcyk7XG4gICAgICAgIHByb3BlcnRpZXMuY3NzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKGlzRWxlcyAmJiBwcm9wZXJ0aWVzLnJlbmRlcmVkUG9zaXRpb24gIT0gbnVsbCkge1xuICAgICAgICB2YXIgcnBvcyA9IHByb3BlcnRpZXMucmVuZGVyZWRQb3NpdGlvbjtcbiAgICAgICAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICAgICAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICAgICAgcHJvcGVydGllcy5wb3NpdGlvbiA9IHJlbmRlcmVkVG9Nb2RlbFBvc2l0aW9uKHJwb3MsIHpvb20sIHBhbik7XG4gICAgICB9XG5cbiAgICAgIC8vIG92ZXJyaWRlIHBhbiB3LyBwYW5CeSBpZiBzZXRcbiAgICAgIGlmIChpc0NvcmUgJiYgcHJvcGVydGllcy5wYW5CeSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBwYW5CeSA9IHByb3BlcnRpZXMucGFuQnk7XG4gICAgICAgIHZhciBjeVBhbiA9IGN5LnBhbigpO1xuICAgICAgICBwcm9wZXJ0aWVzLnBhbiA9IHtcbiAgICAgICAgICB4OiBjeVBhbi54ICsgcGFuQnkueCxcbiAgICAgICAgICB5OiBjeVBhbi55ICsgcGFuQnkueVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBvdmVycmlkZSBwYW4gdy8gY2VudGVyIGlmIHNldFxuICAgICAgdmFyIGNlbnRlciA9IHByb3BlcnRpZXMuY2VudGVyIHx8IHByb3BlcnRpZXMuY2VudHJlO1xuICAgICAgaWYgKGlzQ29yZSAmJiBjZW50ZXIgIT0gbnVsbCkge1xuICAgICAgICB2YXIgY2VudGVyUGFuID0gY3kuZ2V0Q2VudGVyUGFuKGNlbnRlci5lbGVzLCBwcm9wZXJ0aWVzLnpvb20pO1xuICAgICAgICBpZiAoY2VudGVyUGFuICE9IG51bGwpIHtcbiAgICAgICAgICBwcm9wZXJ0aWVzLnBhbiA9IGNlbnRlclBhbjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBvdmVycmlkZSBwYW4gJiB6b29tIHcvIGZpdCBpZiBzZXRcbiAgICAgIGlmIChpc0NvcmUgJiYgcHJvcGVydGllcy5maXQgIT0gbnVsbCkge1xuICAgICAgICB2YXIgZml0ID0gcHJvcGVydGllcy5maXQ7XG4gICAgICAgIHZhciBmaXRWcCA9IGN5LmdldEZpdFZpZXdwb3J0KGZpdC5lbGVzIHx8IGZpdC5ib3VuZGluZ0JveCwgZml0LnBhZGRpbmcpO1xuICAgICAgICBpZiAoZml0VnAgIT0gbnVsbCkge1xuICAgICAgICAgIHByb3BlcnRpZXMucGFuID0gZml0VnAucGFuO1xuICAgICAgICAgIHByb3BlcnRpZXMuem9vbSA9IGZpdFZwLnpvb207XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gb3ZlcnJpZGUgem9vbSAoJiBwb3RlbnRpYWxseSBwYW4pIHcvIHpvb20gb2JqIGlmIHNldFxuICAgICAgaWYgKGlzQ29yZSAmJiBwbGFpbk9iamVjdChwcm9wZXJ0aWVzLnpvb20pKSB7XG4gICAgICAgIHZhciB2cCA9IGN5LmdldFpvb21lZFZpZXdwb3J0KHByb3BlcnRpZXMuem9vbSk7XG4gICAgICAgIGlmICh2cCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHZwLnpvb21lZCkge1xuICAgICAgICAgICAgcHJvcGVydGllcy56b29tID0gdnAuem9vbTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZwLnBhbm5lZCkge1xuICAgICAgICAgICAgcHJvcGVydGllcy5wYW4gPSB2cC5wYW47XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BlcnRpZXMuem9vbSA9IG51bGw7IC8vIGFuIGluYXZhbGlkIHpvb20gKGUuZy4gbm8gZGVsdGEpIGdldHMgYXV0b21hdGljYWxseSBkZXN0cm95ZWRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IEFuaW1hdGlvbihhbGxbMF0sIHByb3BlcnRpZXMpO1xuICAgIH07XG4gIH0sXG4gIC8vIGFuaW1hdGVcblxuICBhbmltYXRlOiBmdW5jdGlvbiBhbmltYXRlKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBhbmltYXRlSW1wbChwcm9wZXJ0aWVzLCBwYXJhbXMpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBzZWxmSXNBcnJheUxpa2UgPSBzZWxmLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGFsbCA9IHNlbGZJc0FycmF5TGlrZSA/IHNlbGYgOiBbc2VsZl07IC8vIHB1dCBpbiBhcnJheSBpZiBub3QgYXJyYXktbGlrZVxuICAgICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeSB8fCB0aGlzO1xuICAgICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgcHJvcGVydGllcyA9IGV4dGVuZCh7fSwgcHJvcGVydGllcywgcGFyYW1zKTtcbiAgICAgIH1cblxuICAgICAgLy8gbWFudWFsbHkgaG9vayBhbmQgcnVuIHRoZSBhbmltYXRpb25cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBhbGxbaV07XG4gICAgICAgIHZhciBxdWV1ZSA9IGVsZS5hbmltYXRlZCgpICYmIChwcm9wZXJ0aWVzLnF1ZXVlID09PSB1bmRlZmluZWQgfHwgcHJvcGVydGllcy5xdWV1ZSk7XG4gICAgICAgIHZhciBhbmkgPSBlbGUuYW5pbWF0aW9uKHByb3BlcnRpZXMsIHF1ZXVlID8ge1xuICAgICAgICAgIHF1ZXVlOiB0cnVlXG4gICAgICAgIH0gOiB1bmRlZmluZWQpO1xuICAgICAgICBhbmkucGxheSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gICAgfTtcbiAgfSxcblxuICAvLyBhbmltYXRlXG5cbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gc3RvcEltcGwoY2xlYXJRdWV1ZSwganVtcFRvRW5kKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gYWxsW2ldO1xuICAgICAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgICAgIHZhciBhbmlzID0gX3AuYW5pbWF0aW9uLmN1cnJlbnQ7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYW5pcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHZhciBhbmkgPSBhbmlzW2pdO1xuICAgICAgICAgIHZhciBhbmlfcCA9IGFuaS5fcHJpdmF0ZTtcbiAgICAgICAgICBpZiAoanVtcFRvRW5kKSB7XG4gICAgICAgICAgICAvLyBuZXh0IGl0ZXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGxvb3AsIHRoZSBhbmltYXRpb25cbiAgICAgICAgICAgIC8vIHdpbGwgZ28gc3RyYWlnaHQgdG8gdGhlIGVuZCBhbmQgYmUgcmVtb3ZlZFxuICAgICAgICAgICAgYW5pX3AuZHVyYXRpb24gPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNsZWFyIHRoZSBxdWV1ZSBvZiBmdXR1cmUgYW5pbWF0aW9uc1xuICAgICAgICBpZiAoY2xlYXJRdWV1ZSkge1xuICAgICAgICAgIF9wLmFuaW1hdGlvbi5xdWV1ZSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghanVtcFRvRW5kKSB7XG4gICAgICAgICAgX3AuYW5pbWF0aW9uLmN1cnJlbnQgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyB3ZSBoYXZlIHRvIG5vdGlmeSAodGhlIGFuaW1hdGlvbiBsb29wIGRvZXNuJ3QgZG8gaXQgZm9yIHVzIG9uIGBzdG9wYClcbiAgICAgIGN5Lm5vdGlmeSgnZHJhdycpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgfSAvLyBzdG9wXG59OyAvLyBkZWZpbmVcblxudmFyIGRlZmluZSQyID0ge1xuICAvLyBhY2Nlc3MgZGF0YSBmaWVsZFxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKHBhcmFtcykge1xuICAgIHZhciBkZWZhdWx0cyA9IHtcbiAgICAgIGZpZWxkOiAnZGF0YScsXG4gICAgICBiaW5kaW5nRXZlbnQ6ICdkYXRhJyxcbiAgICAgIGFsbG93QmluZGluZzogZmFsc2UsXG4gICAgICBhbGxvd1NldHRpbmc6IGZhbHNlLFxuICAgICAgYWxsb3dHZXR0aW5nOiBmYWxzZSxcbiAgICAgIHNldHRpbmdFdmVudDogJ2RhdGEnLFxuICAgICAgc2V0dGluZ1RyaWdnZXJzRXZlbnQ6IGZhbHNlLFxuICAgICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgICAgaW1tdXRhYmxlS2V5czoge30sXG4gICAgICAvLyBrZXkgPT4gdHJ1ZSBpZiBpbW11dGFibGVcbiAgICAgIHVwZGF0ZVN0eWxlOiBmYWxzZSxcbiAgICAgIGJlZm9yZUdldDogZnVuY3Rpb24gYmVmb3JlR2V0KHNlbGYpIHt9LFxuICAgICAgYmVmb3JlU2V0OiBmdW5jdGlvbiBiZWZvcmVTZXQoc2VsZiwgb2JqKSB7fSxcbiAgICAgIG9uU2V0OiBmdW5jdGlvbiBvblNldChzZWxmKSB7fSxcbiAgICAgIGNhblNldDogZnVuY3Rpb24gY2FuU2V0KHNlbGYpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfTtcbiAgICBwYXJhbXMgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBwYXJhbXMpO1xuICAgIHJldHVybiBmdW5jdGlvbiBkYXRhSW1wbChuYW1lLCB2YWx1ZSkge1xuICAgICAgdmFyIHAgPSBwYXJhbXM7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcbiAgICAgIHZhciBzaW5nbGUgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmWzBdIDogc2VsZjtcblxuICAgICAgLy8gLmRhdGEoJ2ZvbycsIC4uLilcbiAgICAgIGlmIChzdHJpbmcobmFtZSkpIHtcbiAgICAgICAgLy8gc2V0IG9yIGdldCBwcm9wZXJ0eVxuICAgICAgICB2YXIgaXNQYXRoTGlrZSA9IG5hbWUuaW5kZXhPZignLicpICE9PSAtMTsgLy8gdGhlcmUgbWlnaHQgYmUgYSBub3JtYWwgZmllbGQgd2l0aCBhIGRvdCBcbiAgICAgICAgdmFyIHBhdGggPSBpc1BhdGhMaWtlICYmIHRvUGF0aF9fZGVmYXVsdFtcImRlZmF1bHRcIl0obmFtZSk7XG5cbiAgICAgICAgLy8gLmRhdGEoJ2ZvbycpXG4gICAgICAgIGlmIChwLmFsbG93R2V0dGluZyAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gZ2V0XG5cbiAgICAgICAgICB2YXIgcmV0O1xuICAgICAgICAgIGlmIChzaW5nbGUpIHtcbiAgICAgICAgICAgIHAuYmVmb3JlR2V0KHNpbmdsZSk7XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0J3MgcGF0aCBhbmQgYSBmaWVsZCB3aXRoIHRoZSBzYW1lIG5hbWUgZG9lc24ndCBleGlzdFxuICAgICAgICAgICAgaWYgKHBhdGggJiYgc2luZ2xlLl9wcml2YXRlW3AuZmllbGRdW25hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0ID0gZ2V0X19kZWZhdWx0W1wiZGVmYXVsdFwiXShzaW5nbGUuX3ByaXZhdGVbcC5maWVsZF0sIHBhdGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0ID0gc2luZ2xlLl9wcml2YXRlW3AuZmllbGRdW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmV0O1xuXG4gICAgICAgICAgLy8gLmRhdGEoJ2ZvbycsICdiYXInKVxuICAgICAgICB9IGVsc2UgaWYgKHAuYWxsb3dTZXR0aW5nICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBzZXRcbiAgICAgICAgICB2YXIgdmFsaWQgPSAhcC5pbW11dGFibGVLZXlzW25hbWVdO1xuICAgICAgICAgIGlmICh2YWxpZCkge1xuICAgICAgICAgICAgdmFyIGNoYW5nZSA9IF9kZWZpbmVQcm9wZXJ0eSh7fSwgbmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgcC5iZWZvcmVTZXQoc2VsZiwgY2hhbmdlKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gYWxsLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICB2YXIgZWxlID0gYWxsW2ldO1xuICAgICAgICAgICAgICBpZiAocC5jYW5TZXQoZWxlKSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXRoICYmIHNpbmdsZS5fcHJpdmF0ZVtwLmZpZWxkXVtuYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBzZXRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGVsZS5fcHJpdmF0ZVtwLmZpZWxkXSwgcGF0aCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBlbGUuX3ByaXZhdGVbcC5maWVsZF1bbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdXBkYXRlIG1hcHBlcnMgaWYgYXNrZWRcbiAgICAgICAgICAgIGlmIChwLnVwZGF0ZVN0eWxlKSB7XG4gICAgICAgICAgICAgIHNlbGYudXBkYXRlU3R5bGUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2FsbCBvblNldCBjYWxsYmFja1xuICAgICAgICAgICAgcC5vblNldChzZWxmKTtcbiAgICAgICAgICAgIGlmIChwLnNldHRpbmdUcmlnZ2Vyc0V2ZW50KSB7XG4gICAgICAgICAgICAgIHNlbGZbcC50cmlnZ2VyRm5OYW1lXShwLnNldHRpbmdFdmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gLmRhdGEoeyAnZm9vJzogJ2JhcicgfSlcbiAgICAgIH0gZWxzZSBpZiAocC5hbGxvd1NldHRpbmcgJiYgcGxhaW5PYmplY3QobmFtZSkpIHtcbiAgICAgICAgLy8gZXh0ZW5kXG4gICAgICAgIHZhciBvYmogPSBuYW1lO1xuICAgICAgICB2YXIgaywgdjtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgICBwLmJlZm9yZVNldChzZWxmLCBvYmopO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwga2V5cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICBrID0ga2V5c1tfaV07XG4gICAgICAgICAgdiA9IG9ialtrXTtcbiAgICAgICAgICB2YXIgX3ZhbGlkID0gIXAuaW1tdXRhYmxlS2V5c1trXTtcbiAgICAgICAgICBpZiAoX3ZhbGlkKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFsbC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICB2YXIgX2VsZSA9IGFsbFtqXTtcbiAgICAgICAgICAgICAgaWYgKHAuY2FuU2V0KF9lbGUpKSB7XG4gICAgICAgICAgICAgICAgX2VsZS5fcHJpdmF0ZVtwLmZpZWxkXVtrXSA9IHY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1cGRhdGUgbWFwcGVycyBpZiBhc2tlZFxuICAgICAgICBpZiAocC51cGRhdGVTdHlsZSkge1xuICAgICAgICAgIHNlbGYudXBkYXRlU3R5bGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNhbGwgb25TZXQgY2FsbGJhY2tcbiAgICAgICAgcC5vblNldChzZWxmKTtcbiAgICAgICAgaWYgKHAuc2V0dGluZ1RyaWdnZXJzRXZlbnQpIHtcbiAgICAgICAgICBzZWxmW3AudHJpZ2dlckZuTmFtZV0ocC5zZXR0aW5nRXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLmRhdGEoZnVuY3Rpb24oKXsgLi4uIH0pXG4gICAgICB9IGVsc2UgaWYgKHAuYWxsb3dCaW5kaW5nICYmIGZuJDYobmFtZSkpIHtcbiAgICAgICAgLy8gYmluZCB0byBldmVudFxuICAgICAgICB2YXIgZm4gPSBuYW1lO1xuICAgICAgICBzZWxmLm9uKHAuYmluZGluZ0V2ZW50LCBmbik7XG5cbiAgICAgICAgLy8gLmRhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwLmFsbG93R2V0dGluZyAmJiBuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gZ2V0IHdob2xlIG9iamVjdFxuICAgICAgICB2YXIgX3JldDtcbiAgICAgICAgaWYgKHNpbmdsZSkge1xuICAgICAgICAgIHAuYmVmb3JlR2V0KHNpbmdsZSk7XG4gICAgICAgICAgX3JldCA9IHNpbmdsZS5fcHJpdmF0ZVtwLmZpZWxkXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3JldDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxmOyAvLyBtYWludGFpbiBjaGFpbmFiaWxpdHlcbiAgICB9OyAvLyBmdW5jdGlvblxuICB9LFxuXG4gIC8vIGRhdGFcblxuICAvLyByZW1vdmUgZGF0YSBmaWVsZFxuICByZW1vdmVEYXRhOiBmdW5jdGlvbiByZW1vdmVEYXRhKHBhcmFtcykge1xuICAgIHZhciBkZWZhdWx0cyA9IHtcbiAgICAgIGZpZWxkOiAnZGF0YScsXG4gICAgICBldmVudDogJ2RhdGEnLFxuICAgICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgICAgdHJpZ2dlckV2ZW50OiBmYWxzZSxcbiAgICAgIGltbXV0YWJsZUtleXM6IHt9IC8vIGtleSA9PiB0cnVlIGlmIGltbXV0YWJsZVxuICAgIH07XG5cbiAgICBwYXJhbXMgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBwYXJhbXMpO1xuICAgIHJldHVybiBmdW5jdGlvbiByZW1vdmVEYXRhSW1wbChuYW1lcykge1xuICAgICAgdmFyIHAgPSBwYXJhbXM7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcblxuICAgICAgLy8gLnJlbW92ZURhdGEoJ2ZvbyBiYXInKVxuICAgICAgaWYgKHN0cmluZyhuYW1lcykpIHtcbiAgICAgICAgLy8gdGhlbiBnZXQgdGhlIGxpc3Qgb2Yga2V5cywgYW5kIGRlbGV0ZSB0aGVtXG4gICAgICAgIHZhciBrZXlzID0gbmFtZXMuc3BsaXQoL1xccysvKTtcbiAgICAgICAgdmFyIGwgPSBrZXlzLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAvLyBkZWxldGUgZWFjaCBub24tZW1wdHkga2V5XG4gICAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgaWYgKGVtcHR5U3RyaW5nKGtleSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgdmFsaWQgPSAhcC5pbW11dGFibGVLZXlzW2tleV07IC8vIG5vdCB2YWxpZCBpZiBpbW11dGFibGVcbiAgICAgICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGlfYSA9IDAsIGxfYSA9IGFsbC5sZW5ndGg7IGlfYSA8IGxfYTsgaV9hKyspIHtcbiAgICAgICAgICAgICAgYWxsW2lfYV0uX3ByaXZhdGVbcC5maWVsZF1ba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHAudHJpZ2dlckV2ZW50KSB7XG4gICAgICAgICAgc2VsZltwLnRyaWdnZXJGbk5hbWVdKHAuZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLnJlbW92ZURhdGEoKVxuICAgICAgfSBlbHNlIGlmIChuYW1lcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIHRoZW4gZGVsZXRlIGFsbCBrZXlzXG5cbiAgICAgICAgZm9yICh2YXIgX2lfYSA9IDAsIF9sX2EgPSBhbGwubGVuZ3RoOyBfaV9hIDwgX2xfYTsgX2lfYSsrKSB7XG4gICAgICAgICAgdmFyIF9wcml2YXRlRmllbGRzID0gYWxsW19pX2FdLl9wcml2YXRlW3AuZmllbGRdO1xuICAgICAgICAgIHZhciBfa2V5cyA9IE9iamVjdC5rZXlzKF9wcml2YXRlRmllbGRzKTtcbiAgICAgICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBfa2V5cy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgICAgICB2YXIgX2tleSA9IF9rZXlzW19pMl07XG4gICAgICAgICAgICB2YXIgdmFsaWRLZXlUb0RlbGV0ZSA9ICFwLmltbXV0YWJsZUtleXNbX2tleV07XG4gICAgICAgICAgICBpZiAodmFsaWRLZXlUb0RlbGV0ZSkge1xuICAgICAgICAgICAgICBfcHJpdmF0ZUZpZWxkc1tfa2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHAudHJpZ2dlckV2ZW50KSB7XG4gICAgICAgICAgc2VsZltwLnRyaWdnZXJGbk5hbWVdKHAuZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VsZjsgLy8gbWFpbnRhaW4gY2hhaW5pbmdcbiAgICB9OyAvLyBmdW5jdGlvblxuICB9IC8vIHJlbW92ZURhdGFcbn07IC8vIGRlZmluZVxuXG52YXIgZGVmaW5lJDEgPSB7XG4gIGV2ZW50QWxpYXNlc09uOiBmdW5jdGlvbiBldmVudEFsaWFzZXNPbihwcm90bykge1xuICAgIHZhciBwID0gcHJvdG87XG4gICAgcC5hZGRMaXN0ZW5lciA9IHAubGlzdGVuID0gcC5iaW5kID0gcC5vbjtcbiAgICBwLnVubGlzdGVuID0gcC51bmJpbmQgPSBwLm9mZiA9IHAucmVtb3ZlTGlzdGVuZXI7XG4gICAgcC50cmlnZ2VyID0gcC5lbWl0O1xuXG4gICAgLy8gdGhpcyBpcyBqdXN0IGEgd3JhcHBlciBhbGlhcyBvZiAub24oKVxuICAgIHAucG9uID0gcC5wcm9taXNlT24gPSBmdW5jdGlvbiAoZXZlbnRzLCBzZWxlY3Rvcikge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbiBjYWxsYmFjayhlKSB7XG4gICAgICAgICAgc2VsZi5vZmYuYXBwbHkoc2VsZiwgb2ZmQXJncyk7XG4gICAgICAgICAgcmVzb2x2ZShlKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIG9uQXJncyA9IGFyZ3MuY29uY2F0KFtjYWxsYmFja10pO1xuICAgICAgICB2YXIgb2ZmQXJncyA9IG9uQXJncy5jb25jYXQoW10pO1xuICAgICAgICBzZWxmLm9uLmFwcGx5KHNlbGYsIG9uQXJncyk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG59OyAvLyBkZWZpbmVcblxuLy8gdXNlIHRoaXMgbW9kdWxlIHRvIGNoZXJyeSBwaWNrIGZ1bmN0aW9ucyBpbnRvIHlvdXIgcHJvdG90eXBlXG52YXIgZGVmaW5lID0ge307XG5bZGVmaW5lJDMsIGRlZmluZSQyLCBkZWZpbmUkMV0uZm9yRWFjaChmdW5jdGlvbiAobSkge1xuICBleHRlbmQoZGVmaW5lLCBtKTtcbn0pO1xuXG52YXIgZWxlc2ZuJGkgPSB7XG4gIGFuaW1hdGU6IGRlZmluZS5hbmltYXRlKCksXG4gIGFuaW1hdGlvbjogZGVmaW5lLmFuaW1hdGlvbigpLFxuICBhbmltYXRlZDogZGVmaW5lLmFuaW1hdGVkKCksXG4gIGNsZWFyUXVldWU6IGRlZmluZS5jbGVhclF1ZXVlKCksXG4gIGRlbGF5OiBkZWZpbmUuZGVsYXkoKSxcbiAgZGVsYXlBbmltYXRpb246IGRlZmluZS5kZWxheUFuaW1hdGlvbigpLFxuICBzdG9wOiBkZWZpbmUuc3RvcCgpXG59O1xuXG52YXIgZWxlc2ZuJGggPSB7XG4gIGNsYXNzZXM6IGZ1bmN0aW9uIGNsYXNzZXMoX2NsYXNzZXMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKF9jbGFzc2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZXQgPSBbXTtcbiAgICAgIHNlbGZbMF0uX3ByaXZhdGUuY2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uIChjbHMpIHtcbiAgICAgICAgcmV0dXJuIHJldC5wdXNoKGNscyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfSBlbHNlIGlmICghYXJyYXkoX2NsYXNzZXMpKSB7XG4gICAgICAvLyBleHRyYWN0IGNsYXNzZXMgZnJvbSBzdHJpbmdcbiAgICAgIF9jbGFzc2VzID0gKF9jbGFzc2VzIHx8ICcnKS5tYXRjaCgvXFxTKy9nKSB8fCBbXTtcbiAgICB9XG4gICAgdmFyIGNoYW5nZWQgPSBbXTtcbiAgICB2YXIgY2xhc3Nlc1NldCA9IG5ldyBTZXQkMShfY2xhc3Nlcyk7XG5cbiAgICAvLyBjaGVjayBhbmQgdXBkYXRlIGVhY2ggZWxlXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWxmLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgZWxlID0gc2VsZltqXTtcbiAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgIHZhciBlbGVDbGFzc2VzID0gX3AuY2xhc3NlcztcbiAgICAgIHZhciBjaGFuZ2VkRWxlID0gZmFsc2U7XG5cbiAgICAgIC8vIGNoZWNrIGlmIGVsZSBoYXMgYWxsIG9mIHRoZSBwYXNzZWQgY2xhc3Nlc1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfY2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2xzID0gX2NsYXNzZXNbaV07XG4gICAgICAgIHZhciBlbGVIYXNDbGFzcyA9IGVsZUNsYXNzZXMuaGFzKGNscyk7XG4gICAgICAgIGlmICghZWxlSGFzQ2xhc3MpIHtcbiAgICAgICAgICBjaGFuZ2VkRWxlID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBjaGVjayBpZiBlbGUgaGFzIGNsYXNzZXMgb3V0c2lkZSBvZiB0aG9zZSBwYXNzZWRcbiAgICAgIGlmICghY2hhbmdlZEVsZSkge1xuICAgICAgICBjaGFuZ2VkRWxlID0gZWxlQ2xhc3Nlcy5zaXplICE9PSBfY2xhc3Nlcy5sZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbmdlZEVsZSkge1xuICAgICAgICBfcC5jbGFzc2VzID0gY2xhc3Nlc1NldDtcbiAgICAgICAgY2hhbmdlZC5wdXNoKGVsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdHJpZ2dlciB1cGRhdGUgc3R5bGUgb24gdGhvc2UgZWxlcyB0aGF0IGhhZCBjbGFzcyBjaGFuZ2VzXG4gICAgaWYgKGNoYW5nZWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zcGF3bihjaGFuZ2VkKS51cGRhdGVTdHlsZSgpLmVtaXQoJ2NsYXNzJyk7XG4gICAgfVxuICAgIHJldHVybiBzZWxmO1xuICB9LFxuICBhZGRDbGFzczogZnVuY3Rpb24gYWRkQ2xhc3MoY2xhc3Nlcykge1xuICAgIHJldHVybiB0aGlzLnRvZ2dsZUNsYXNzKGNsYXNzZXMsIHRydWUpO1xuICB9LFxuICBoYXNDbGFzczogZnVuY3Rpb24gaGFzQ2xhc3MoY2xhc3NOYW1lKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgcmV0dXJuIGVsZSAhPSBudWxsICYmIGVsZS5fcHJpdmF0ZS5jbGFzc2VzLmhhcyhjbGFzc05hbWUpO1xuICB9LFxuICB0b2dnbGVDbGFzczogZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoY2xhc3NlcywgdG9nZ2xlKSB7XG4gICAgaWYgKCFhcnJheShjbGFzc2VzKSkge1xuICAgICAgLy8gZXh0cmFjdCBjbGFzc2VzIGZyb20gc3RyaW5nXG4gICAgICBjbGFzc2VzID0gY2xhc3Nlcy5tYXRjaCgvXFxTKy9nKSB8fCBbXTtcbiAgICB9XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB0b2dnbGVVbmRlZmQgPSB0b2dnbGUgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgY2hhbmdlZCA9IFtdOyAvLyBlbGVzIHdobyBoYWQgY2xhc3NlcyBjaGFuZ2VkXG5cbiAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBzZWxmLmxlbmd0aDsgaSA8IGlsOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBzZWxmW2ldO1xuICAgICAgdmFyIGVsZUNsYXNzZXMgPSBlbGUuX3ByaXZhdGUuY2xhc3NlcztcbiAgICAgIHZhciBjaGFuZ2VkRWxlID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNsYXNzZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGNscyA9IGNsYXNzZXNbal07XG4gICAgICAgIHZhciBoYXNDbGFzcyA9IGVsZUNsYXNzZXMuaGFzKGNscyk7XG4gICAgICAgIHZhciBjaGFuZ2VkTm93ID0gZmFsc2U7XG4gICAgICAgIGlmICh0b2dnbGUgfHwgdG9nZ2xlVW5kZWZkICYmICFoYXNDbGFzcykge1xuICAgICAgICAgIGVsZUNsYXNzZXMuYWRkKGNscyk7XG4gICAgICAgICAgY2hhbmdlZE5vdyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRvZ2dsZSB8fCB0b2dnbGVVbmRlZmQgJiYgaGFzQ2xhc3MpIHtcbiAgICAgICAgICBlbGVDbGFzc2VzW1wiZGVsZXRlXCJdKGNscyk7XG4gICAgICAgICAgY2hhbmdlZE5vdyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjaGFuZ2VkRWxlICYmIGNoYW5nZWROb3cpIHtcbiAgICAgICAgICBjaGFuZ2VkLnB1c2goZWxlKTtcbiAgICAgICAgICBjaGFuZ2VkRWxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBmb3IgaiBjbGFzc2VzXG4gICAgfSAvLyBmb3IgaSBlbGVzXG5cbiAgICAvLyB0cmlnZ2VyIHVwZGF0ZSBzdHlsZSBvbiB0aG9zZSBlbGVzIHRoYXQgaGFkIGNsYXNzIGNoYW5nZXNcbiAgICBpZiAoY2hhbmdlZC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNwYXduKGNoYW5nZWQpLnVwZGF0ZVN0eWxlKCkuZW1pdCgnY2xhc3MnKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGY7XG4gIH0sXG4gIHJlbW92ZUNsYXNzOiBmdW5jdGlvbiByZW1vdmVDbGFzcyhjbGFzc2VzKSB7XG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlQ2xhc3MoY2xhc3NlcywgZmFsc2UpO1xuICB9LFxuICBmbGFzaENsYXNzOiBmdW5jdGlvbiBmbGFzaENsYXNzKGNsYXNzZXMsIGR1cmF0aW9uKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChkdXJhdGlvbiA9PSBudWxsKSB7XG4gICAgICBkdXJhdGlvbiA9IDI1MDtcbiAgICB9IGVsc2UgaWYgKGR1cmF0aW9uID09PSAwKSB7XG4gICAgICByZXR1cm4gc2VsZjsgLy8gbm90aGluZyB0byBkbyByZWFsbHlcbiAgICB9XG5cbiAgICBzZWxmLmFkZENsYXNzKGNsYXNzZXMpO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5yZW1vdmVDbGFzcyhjbGFzc2VzKTtcbiAgICB9LCBkdXJhdGlvbik7XG4gICAgcmV0dXJuIHNlbGY7XG4gIH1cbn07XG5lbGVzZm4kaC5jbGFzc05hbWUgPSBlbGVzZm4kaC5jbGFzc05hbWVzID0gZWxlc2ZuJGguY2xhc3NlcztcblxuLy8gdG9rZW5zIGluIHRoZSBxdWVyeSBsYW5ndWFnZVxudmFyIHRva2VucyA9IHtcbiAgbWV0YUNoYXI6ICdbXFxcXCFcXFxcXCJcXFxcI1xcXFwkXFxcXCVcXFxcJlxcXFxcXCdcXFxcKFxcXFwpXFxcXCpcXFxcK1xcXFwsXFxcXC5cXFxcL1xcXFw6XFxcXDtcXFxcPFxcXFw9XFxcXD5cXFxcP1xcXFxAXFxcXFtcXFxcXVxcXFxeXFxcXGBcXFxce1xcXFx8XFxcXH1cXFxcfl0nLFxuICAvLyBjaGFycyB3ZSBuZWVkIHRvIGVzY2FwZSBpbiBsZXQgbmFtZXMsIGV0Y1xuICBjb21wYXJhdG9yT3A6ICc9fFxcXFwhPXw+fD49fDx8PD18XFxcXCQ9fFxcXFxePXxcXFxcKj0nLFxuICAvLyBiaW5hcnkgY29tcGFyaXNvbiBvcCAodXNlZCBpbiBkYXRhIHNlbGVjdG9ycylcbiAgYm9vbE9wOiAnXFxcXD98XFxcXCF8XFxcXF4nLFxuICAvLyBib29sZWFuICh1bmFyeSkgb3BlcmF0b3JzICh1c2VkIGluIGRhdGEgc2VsZWN0b3JzKVxuICBzdHJpbmc6ICdcIig/OlxcXFxcXFxcXCJ8W15cIl0pKlwiJyArICd8JyArIFwiJyg/OlxcXFxcXFxcJ3xbXiddKSonXCIsXG4gIC8vIHN0cmluZyBsaXRlcmFscyAodXNlZCBpbiBkYXRhIHNlbGVjdG9ycykgLS0gZG91YmxlcXVvdGVzIHwgc2luZ2xlcXVvdGVzXG4gIG51bWJlcjogbnVtYmVyLFxuICAvLyBudW1iZXIgbGl0ZXJhbCAodXNlZCBpbiBkYXRhIHNlbGVjdG9ycykgLS0tIGUuZy4gMC4xMjM0LCAxMjM0LCAxMmUxMjNcbiAgbWV0YTogJ2RlZ3JlZXxpbmRlZ3JlZXxvdXRkZWdyZWUnLFxuICAvLyBhbGxvd2VkIG1ldGFkYXRhIGZpZWxkcyAoaS5lLiBhbGxvd2VkIGZ1bmN0aW9ucyB0byB1c2UgZnJvbSBDb2xsZWN0aW9uKVxuICBzZXBhcmF0b3I6ICdcXFxccyosXFxcXHMqJyxcbiAgLy8gcXVlcmllcyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hcywgZS5nLiBlZGdlW2ZvbyA9ICdiYXInXSwgbm9kZS5zb21lQ2xhc3NcbiAgZGVzY2VuZGFudDogJ1xcXFxzKycsXG4gIGNoaWxkOiAnXFxcXHMrPlxcXFxzKycsXG4gIHN1YmplY3Q6ICdcXFxcJCcsXG4gIGdyb3VwOiAnbm9kZXxlZGdlfFxcXFwqJyxcbiAgZGlyZWN0ZWRFZGdlOiAnXFxcXHMrLT5cXFxccysnLFxuICB1bmRpcmVjdGVkRWRnZTogJ1xcXFxzKzwtPlxcXFxzKydcbn07XG50b2tlbnMudmFyaWFibGUgPSAnKD86W1xcXFx3LS5dfCg/OlxcXFxcXFxcJyArIHRva2Vucy5tZXRhQ2hhciArICcpKSsnOyAvLyBhIHZhcmlhYmxlIG5hbWUgY2FuIGhhdmUgbGV0dGVycywgbnVtYmVycywgZGFzaGVzLCBhbmQgcGVyaW9kc1xudG9rZW5zLmNsYXNzTmFtZSA9ICcoPzpbXFxcXHctXXwoPzpcXFxcXFxcXCcgKyB0b2tlbnMubWV0YUNoYXIgKyAnKSkrJzsgLy8gYSBjbGFzcyBuYW1lIGhhcyB0aGUgc2FtZSBydWxlcyBhcyBhIHZhcmlhYmxlIGV4Y2VwdCBpdCBjYW4ndCBoYXZlIGEgJy4nIGluIHRoZSBuYW1lXG50b2tlbnMudmFsdWUgPSB0b2tlbnMuc3RyaW5nICsgJ3wnICsgdG9rZW5zLm51bWJlcjsgLy8gYSB2YWx1ZSBsaXRlcmFsLCBlaXRoZXIgYSBzdHJpbmcgb3IgbnVtYmVyXG50b2tlbnMuaWQgPSB0b2tlbnMudmFyaWFibGU7IC8vIGFuIGVsZW1lbnQgaWQgKGZvbGxvd3MgdmFyaWFibGUgY29udmVudGlvbnMpXG5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBvcHMsIG9wLCBpO1xuXG4gIC8vIGFkZCBAIHZhcmlhbnRzIHRvIGNvbXBhcmF0b3JPcFxuICBvcHMgPSB0b2tlbnMuY29tcGFyYXRvck9wLnNwbGl0KCd8Jyk7XG4gIGZvciAoaSA9IDA7IGkgPCBvcHMubGVuZ3RoOyBpKyspIHtcbiAgICBvcCA9IG9wc1tpXTtcbiAgICB0b2tlbnMuY29tcGFyYXRvck9wICs9ICd8QCcgKyBvcDtcbiAgfVxuXG4gIC8vIGFkZCAhIHZhcmlhbnRzIHRvIGNvbXBhcmF0b3JPcFxuICBvcHMgPSB0b2tlbnMuY29tcGFyYXRvck9wLnNwbGl0KCd8Jyk7XG4gIGZvciAoaSA9IDA7IGkgPCBvcHMubGVuZ3RoOyBpKyspIHtcbiAgICBvcCA9IG9wc1tpXTtcbiAgICBpZiAob3AuaW5kZXhPZignIScpID49IDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gLy8gc2tpcCBvcHMgdGhhdCBleHBsaWNpdGx5IGNvbnRhaW4gIVxuICAgIGlmIChvcCA9PT0gJz0nKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIHNraXAgPSBiL2MgIT0gaXMgZXhwbGljaXRseSBkZWZpbmVkXG5cbiAgICB0b2tlbnMuY29tcGFyYXRvck9wICs9ICd8XFxcXCEnICsgb3A7XG4gIH1cbn0pKCk7XG5cbi8qKlxuICogTWFrZSBhIG5ldyBxdWVyeSBvYmplY3RcbiAqXG4gKiBAcHJvcCB0eXBlIHtUeXBlfSBUaGUgdHlwZSBlbnVtIChpbnQpIG9mIHRoZSBxdWVyeVxuICogQHByb3AgY2hlY2tzIExpc3Qgb2YgY2hlY2tzIHRvIG1ha2UgYWdhaW5zdCBhbiBlbGUgdG8gdGVzdCBmb3IgYSBtYXRjaFxuICovXG52YXIgbmV3UXVlcnkgPSBmdW5jdGlvbiBuZXdRdWVyeSgpIHtcbiAgcmV0dXJuIHtcbiAgICBjaGVja3M6IFtdXG4gIH07XG59O1xuXG4vKipcbiAqIEEgY2hlY2sgdHlwZSBlbnVtLWxpa2Ugb2JqZWN0LiAgVXNlcyBpbnRlZ2VyIHZhbHVlcyBmb3IgZmFzdCBtYXRjaCgpIGxvb2t1cC5cbiAqIFRoZSBvcmRlcmluZyBkb2VzIG5vdCBtYXR0ZXIgYXMgbG9uZyBhcyB0aGUgaW50cyBhcmUgdW5pcXVlLlxuICovXG52YXIgVHlwZSA9IHtcbiAgLyoqIEUuZy4gbm9kZSAqL1xuICBHUk9VUDogMCxcbiAgLyoqIEEgY29sbGVjdGlvbiBvZiBlbGVtZW50cyAqL1xuICBDT0xMRUNUSU9OOiAxLFxuICAvKiogQSBmaWx0ZXIoZWxlKSBmdW5jdGlvbiAqL1xuICBGSUxURVI6IDIsXG4gIC8qKiBFLmcuIFtmb28gPiAxXSAqL1xuICBEQVRBX0NPTVBBUkU6IDMsXG4gIC8qKiBFLmcuIFtmb29dICovXG4gIERBVEFfRVhJU1Q6IDQsXG4gIC8qKiBFLmcuIFs/Zm9vXSAqL1xuICBEQVRBX0JPT0w6IDUsXG4gIC8qKiBFLmcuIFtbZGVncmVlID4gMl1dICovXG4gIE1FVEFfQ09NUEFSRTogNixcbiAgLyoqIEUuZy4gOnNlbGVjdGVkICovXG4gIFNUQVRFOiA3LFxuICAvKiogRS5nLiAjZm9vICovXG4gIElEOiA4LFxuICAvKiogRS5nLiAuZm9vICovXG4gIENMQVNTOiA5LFxuICAvKiogRS5nLiAjZm9vIDwtPiAjYmFyICovXG4gIFVORElSRUNURURfRURHRTogMTAsXG4gIC8qKiBFLmcuICNmb28gLT4gI2JhciAqL1xuICBESVJFQ1RFRF9FREdFOiAxMSxcbiAgLyoqIEUuZy4gJCNmb28gLT4gI2JhciAqL1xuICBOT0RFX1NPVVJDRTogMTIsXG4gIC8qKiBFLmcuICNmb28gLT4gJCNiYXIgKi9cbiAgTk9ERV9UQVJHRVQ6IDEzLFxuICAvKiogRS5nLiAkI2ZvbyA8LT4gI2JhciAqL1xuICBOT0RFX05FSUdIQk9SOiAxNCxcbiAgLyoqIEUuZy4gI2ZvbyA+ICNiYXIgKi9cbiAgQ0hJTEQ6IDE1LFxuICAvKiogRS5nLiAjZm9vICNiYXIgKi9cbiAgREVTQ0VOREFOVDogMTYsXG4gIC8qKiBFLmcuICQjZm9vID4gI2JhciAqL1xuICBQQVJFTlQ6IDE3LFxuICAvKiogRS5nLiAkI2ZvbyAjYmFyICovXG4gIEFOQ0VTVE9SOiAxOCxcbiAgLyoqIEUuZy4gI2ZvbyA+ICRiYXIgPiAjYmF6ICovXG4gIENPTVBPVU5EX1NQTElUOiAxOSxcbiAgLyoqIEFsd2F5cyBtYXRjaGVzLCB1c2VmdWwgcGxhY2Vob2xkZXIgZm9yIHN1YmplY3QgaW4gYENPTVBPVU5EX1NQTElUYCAqL1xuICBUUlVFOiAyMFxufTtcblxudmFyIHN0YXRlU2VsZWN0b3JzID0gW3tcbiAgc2VsZWN0b3I6ICc6c2VsZWN0ZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuc2VsZWN0ZWQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzp1bnNlbGVjdGVkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5zZWxlY3RlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnNlbGVjdGFibGUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuc2VsZWN0YWJsZSgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnVuc2VsZWN0YWJsZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuc2VsZWN0YWJsZSgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmxvY2tlZCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5sb2NrZWQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzp1bmxvY2tlZCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUubG9ja2VkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6dmlzaWJsZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS52aXNpYmxlKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6aGlkZGVuJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gIWVsZS52aXNpYmxlKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6dHJhbnNwYXJlbnQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUudHJhbnNwYXJlbnQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpncmFiYmVkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmdyYWJiZWQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpmcmVlJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5ncmFiYmVkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6cmVtb3ZlZCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5yZW1vdmVkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6aW5zaWRlJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5yZW1vdmVkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6Z3JhYmJhYmxlJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmdyYWJiYWJsZSgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnVuZ3JhYmJhYmxlJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5ncmFiYmFibGUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzphbmltYXRlZCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5hbmltYXRlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnVuYW5pbWF0ZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLmFuaW1hdGVkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6cGFyZW50JyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmlzUGFyZW50KCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6Y2hpbGRsZXNzJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmlzQ2hpbGRsZXNzKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6Y2hpbGQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuaXNDaGlsZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOm9ycGhhbicsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5pc09ycGhhbigpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOm5vbm9ycGhhbicsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5pc0NoaWxkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6Y29tcG91bmQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIHJldHVybiBlbGUuaXNQYXJlbnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsZS5zb3VyY2UoKS5pc1BhcmVudCgpIHx8IGVsZS50YXJnZXQoKS5pc1BhcmVudCgpO1xuICAgIH1cbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpsb29wJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmlzTG9vcCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnNpbXBsZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5pc1NpbXBsZSgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmFjdGl2ZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5hY3RpdmUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzppbmFjdGl2ZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuYWN0aXZlKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6YmFja2dyb3VuZGluZycsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5iYWNrZ3JvdW5kaW5nKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6bm9uYmFja2dyb3VuZGluZycsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuYmFja2dyb3VuZGluZygpO1xuICB9XG59XS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gIC8vIG4uYi4gc2VsZWN0b3JzIHRoYXQgYXJlIHN0YXJ0aW5nIHN1YnN0cmluZ3Mgb2Ygb3RoZXJzIG11c3QgaGF2ZSB0aGUgbG9uZ2VyIG9uZXMgZmlyc3RcbiAgcmV0dXJuIGRlc2NlbmRpbmcoYS5zZWxlY3RvciwgYi5zZWxlY3Rvcik7XG59KTtcbnZhciBsb29rdXAgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxUb0ZuID0ge307XG4gIHZhciBzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlU2VsZWN0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgcyA9IHN0YXRlU2VsZWN0b3JzW2ldO1xuICAgIHNlbFRvRm5bcy5zZWxlY3Rvcl0gPSBzLm1hdGNoZXM7XG4gIH1cbiAgcmV0dXJuIHNlbFRvRm47XG59KCk7XG52YXIgc3RhdGVTZWxlY3Rvck1hdGNoZXMgPSBmdW5jdGlvbiBzdGF0ZVNlbGVjdG9yTWF0Y2hlcyhzZWwsIGVsZSkge1xuICByZXR1cm4gbG9va3VwW3NlbF0oZWxlKTtcbn07XG52YXIgc3RhdGVTZWxlY3RvclJlZ2V4ID0gJygnICsgc3RhdGVTZWxlY3RvcnMubWFwKGZ1bmN0aW9uIChzKSB7XG4gIHJldHVybiBzLnNlbGVjdG9yO1xufSkuam9pbignfCcpICsgJyknO1xuXG4vLyB3aGVuIGEgdG9rZW4gbGlrZSBhIHZhcmlhYmxlIGhhcyBlc2NhcGVkIG1ldGEgY2hhcmFjdGVycywgd2UgbmVlZCB0byBjbGVhbiB0aGUgYmFja3NsYXNoZXMgb3V0XG4vLyBzbyB0aGF0IHZhbHVlcyBnZXQgY29tcGFyZWQgcHJvcGVybHkgaW4gU2VsZWN0b3IuZmlsdGVyKClcbnZhciBjbGVhbk1ldGFDaGFycyA9IGZ1bmN0aW9uIGNsZWFuTWV0YUNoYXJzKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFxcXFxcXFwoJyArIHRva2Vucy5tZXRhQ2hhciArICcpJywgJ2cnKSwgZnVuY3Rpb24gKG1hdGNoLCAkMSkge1xuICAgIHJldHVybiAkMTtcbiAgfSk7XG59O1xudmFyIHJlcGxhY2VMYXN0UXVlcnkgPSBmdW5jdGlvbiByZXBsYWNlTGFzdFF1ZXJ5KHNlbGVjdG9yLCBleGFtaW5pbmdRdWVyeSwgcmVwbGFjZW1lbnRRdWVyeSkge1xuICBzZWxlY3RvcltzZWxlY3Rvci5sZW5ndGggLSAxXSA9IHJlcGxhY2VtZW50UXVlcnk7XG59O1xuXG4vLyBOT1RFOiBhZGQgbmV3IGV4cHJlc3Npb24gc3ludGF4IGhlcmUgdG8gaGF2ZSBpdCByZWNvZ25pc2VkIGJ5IHRoZSBwYXJzZXI7XG4vLyAtIGEgcXVlcnkgY29udGFpbnMgYWxsIGFkamFjZW50IChpLmUuIG5vIHNlcGFyYXRvciBpbiBiZXR3ZWVuKSBleHByZXNzaW9ucztcbi8vIC0gdGhlIGN1cnJlbnQgcXVlcnkgaXMgc3RvcmVkIGluIHNlbGVjdG9yW2ldXG4vLyAtIHlvdSBuZWVkIHRvIGNoZWNrIHRoZSBxdWVyeSBvYmplY3RzIGluIG1hdGNoKCkgZm9yIGl0IGFjdHVhbGx5IGZpbHRlciBwcm9wZXJseSwgYnV0IHRoYXQncyBwcmV0dHkgc3RyYWlnaHQgZm9yd2FyZFxudmFyIGV4cHJzID0gW3tcbiAgbmFtZTogJ2dyb3VwJyxcbiAgLy8ganVzdCB1c2VkIGZvciBpZGVudGlmeWluZyB3aGVuIGRlYnVnZ2luZ1xuICBxdWVyeTogdHJ1ZSxcbiAgcmVnZXg6ICcoJyArIHRva2Vucy5ncm91cCArICcpJyxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSwgX3JlZikge1xuICAgIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDEpLFxuICAgICAgZ3JvdXAgPSBfcmVmMlswXTtcbiAgICBxdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICB0eXBlOiBUeXBlLkdST1VQLFxuICAgICAgdmFsdWU6IGdyb3VwID09PSAnKicgPyBncm91cCA6IGdyb3VwICsgJ3MnXG4gICAgfSk7XG4gIH1cbn0sIHtcbiAgbmFtZTogJ3N0YXRlJyxcbiAgcXVlcnk6IHRydWUsXG4gIHJlZ2V4OiBzdGF0ZVNlbGVjdG9yUmVnZXgsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnksIF9yZWYzKSB7XG4gICAgdmFyIF9yZWY0ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjMsIDEpLFxuICAgICAgc3RhdGUgPSBfcmVmNFswXTtcbiAgICBxdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICB0eXBlOiBUeXBlLlNUQVRFLFxuICAgICAgdmFsdWU6IHN0YXRlXG4gICAgfSk7XG4gIH1cbn0sIHtcbiAgbmFtZTogJ2lkJyxcbiAgcXVlcnk6IHRydWUsXG4gIHJlZ2V4OiAnXFxcXCMoJyArIHRva2Vucy5pZCArICcpJyxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSwgX3JlZjUpIHtcbiAgICB2YXIgX3JlZjYgPSBfc2xpY2VkVG9BcnJheShfcmVmNSwgMSksXG4gICAgICBpZCA9IF9yZWY2WzBdO1xuICAgIHF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgIHR5cGU6IFR5cGUuSUQsXG4gICAgICB2YWx1ZTogY2xlYW5NZXRhQ2hhcnMoaWQpXG4gICAgfSk7XG4gIH1cbn0sIHtcbiAgbmFtZTogJ2NsYXNzTmFtZScsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogJ1xcXFwuKCcgKyB0b2tlbnMuY2xhc3NOYW1lICsgJyknLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5LCBfcmVmNykge1xuICAgIHZhciBfcmVmOCA9IF9zbGljZWRUb0FycmF5KF9yZWY3LCAxKSxcbiAgICAgIGNsYXNzTmFtZSA9IF9yZWY4WzBdO1xuICAgIHF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgIHR5cGU6IFR5cGUuQ0xBU1MsXG4gICAgICB2YWx1ZTogY2xlYW5NZXRhQ2hhcnMoY2xhc3NOYW1lKVxuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdkYXRhRXhpc3RzJyxcbiAgcXVlcnk6IHRydWUsXG4gIHJlZ2V4OiAnXFxcXFtcXFxccyooJyArIHRva2Vucy52YXJpYWJsZSArICcpXFxcXHMqXFxcXF0nLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5LCBfcmVmOSkge1xuICAgIHZhciBfcmVmMTAgPSBfc2xpY2VkVG9BcnJheShfcmVmOSwgMSksXG4gICAgICB2YXJpYWJsZSA9IF9yZWYxMFswXTtcbiAgICBxdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICB0eXBlOiBUeXBlLkRBVEFfRVhJU1QsXG4gICAgICBmaWVsZDogY2xlYW5NZXRhQ2hhcnModmFyaWFibGUpXG4gICAgfSk7XG4gIH1cbn0sIHtcbiAgbmFtZTogJ2RhdGFDb21wYXJlJyxcbiAgcXVlcnk6IHRydWUsXG4gIHJlZ2V4OiAnXFxcXFtcXFxccyooJyArIHRva2Vucy52YXJpYWJsZSArICcpXFxcXHMqKCcgKyB0b2tlbnMuY29tcGFyYXRvck9wICsgJylcXFxccyooJyArIHRva2Vucy52YWx1ZSArICcpXFxcXHMqXFxcXF0nLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5LCBfcmVmMTEpIHtcbiAgICB2YXIgX3JlZjEyID0gX3NsaWNlZFRvQXJyYXkoX3JlZjExLCAzKSxcbiAgICAgIHZhcmlhYmxlID0gX3JlZjEyWzBdLFxuICAgICAgY29tcGFyYXRvck9wID0gX3JlZjEyWzFdLFxuICAgICAgdmFsdWUgPSBfcmVmMTJbMl07XG4gICAgdmFyIHZhbHVlSXNTdHJpbmcgPSBuZXcgUmVnRXhwKCdeJyArIHRva2Vucy5zdHJpbmcgKyAnJCcpLmV4ZWModmFsdWUpICE9IG51bGw7XG4gICAgaWYgKHZhbHVlSXNTdHJpbmcpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgIH1cbiAgICBxdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICB0eXBlOiBUeXBlLkRBVEFfQ09NUEFSRSxcbiAgICAgIGZpZWxkOiBjbGVhbk1ldGFDaGFycyh2YXJpYWJsZSksXG4gICAgICBvcGVyYXRvcjogY29tcGFyYXRvck9wLFxuICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfSk7XG4gIH1cbn0sIHtcbiAgbmFtZTogJ2RhdGFCb29sJyxcbiAgcXVlcnk6IHRydWUsXG4gIHJlZ2V4OiAnXFxcXFtcXFxccyooJyArIHRva2Vucy5ib29sT3AgKyAnKVxcXFxzKignICsgdG9rZW5zLnZhcmlhYmxlICsgJylcXFxccypcXFxcXScsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnksIF9yZWYxMykge1xuICAgIHZhciBfcmVmMTQgPSBfc2xpY2VkVG9BcnJheShfcmVmMTMsIDIpLFxuICAgICAgYm9vbE9wID0gX3JlZjE0WzBdLFxuICAgICAgdmFyaWFibGUgPSBfcmVmMTRbMV07XG4gICAgcXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgdHlwZTogVHlwZS5EQVRBX0JPT0wsXG4gICAgICBmaWVsZDogY2xlYW5NZXRhQ2hhcnModmFyaWFibGUpLFxuICAgICAgb3BlcmF0b3I6IGJvb2xPcFxuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdtZXRhQ29tcGFyZScsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogJ1xcXFxbXFxcXFtcXFxccyooJyArIHRva2Vucy5tZXRhICsgJylcXFxccyooJyArIHRva2Vucy5jb21wYXJhdG9yT3AgKyAnKVxcXFxzKignICsgdG9rZW5zLm51bWJlciArICcpXFxcXHMqXFxcXF1cXFxcXScsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnksIF9yZWYxNSkge1xuICAgIHZhciBfcmVmMTYgPSBfc2xpY2VkVG9BcnJheShfcmVmMTUsIDMpLFxuICAgICAgbWV0YSA9IF9yZWYxNlswXSxcbiAgICAgIGNvbXBhcmF0b3JPcCA9IF9yZWYxNlsxXSxcbiAgICAgIG51bWJlciA9IF9yZWYxNlsyXTtcbiAgICBxdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICB0eXBlOiBUeXBlLk1FVEFfQ09NUEFSRSxcbiAgICAgIGZpZWxkOiBjbGVhbk1ldGFDaGFycyhtZXRhKSxcbiAgICAgIG9wZXJhdG9yOiBjb21wYXJhdG9yT3AsXG4gICAgICB2YWx1ZTogcGFyc2VGbG9hdChudW1iZXIpXG4gICAgfSk7XG4gIH1cbn0sIHtcbiAgbmFtZTogJ25leHRRdWVyeScsXG4gIHNlcGFyYXRvcjogdHJ1ZSxcbiAgcmVnZXg6IHRva2Vucy5zZXBhcmF0b3IsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnkpIHtcbiAgICB2YXIgY3VycmVudFN1YmplY3QgPSBzZWxlY3Rvci5jdXJyZW50U3ViamVjdDtcbiAgICB2YXIgZWRnZUNvdW50ID0gc2VsZWN0b3IuZWRnZUNvdW50O1xuICAgIHZhciBjb21wb3VuZENvdW50ID0gc2VsZWN0b3IuY29tcG91bmRDb3VudDtcbiAgICB2YXIgbGFzdFEgPSBzZWxlY3RvcltzZWxlY3Rvci5sZW5ndGggLSAxXTtcbiAgICBpZiAoY3VycmVudFN1YmplY3QgIT0gbnVsbCkge1xuICAgICAgbGFzdFEuc3ViamVjdCA9IGN1cnJlbnRTdWJqZWN0O1xuICAgICAgc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPSBudWxsO1xuICAgIH1cbiAgICBsYXN0US5lZGdlQ291bnQgPSBlZGdlQ291bnQ7XG4gICAgbGFzdFEuY29tcG91bmRDb3VudCA9IGNvbXBvdW5kQ291bnQ7XG4gICAgc2VsZWN0b3IuZWRnZUNvdW50ID0gMDtcbiAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50ID0gMDtcblxuICAgIC8vIGdvIG9uIHRvIG5leHQgcXVlcnlcbiAgICB2YXIgbmV4dFF1ZXJ5ID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoKytdID0gbmV3UXVlcnkoKTtcbiAgICByZXR1cm4gbmV4dFF1ZXJ5OyAvLyB0aGlzIGlzIHRoZSBuZXcgcXVlcnkgdG8gYmUgZmlsbGVkIGJ5IHRoZSBmb2xsb3dpbmcgZXhwcnNcbiAgfVxufSwge1xuICBuYW1lOiAnZGlyZWN0ZWRFZGdlJyxcbiAgc2VwYXJhdG9yOiB0cnVlLFxuICByZWdleDogdG9rZW5zLmRpcmVjdGVkRWRnZSxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSkge1xuICAgIGlmIChzZWxlY3Rvci5jdXJyZW50U3ViamVjdCA9PSBudWxsKSB7XG4gICAgICAvLyB1bmRpcmVjdGVkIGVkZ2VcbiAgICAgIHZhciBlZGdlUXVlcnkgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIHNvdXJjZSA9IHF1ZXJ5O1xuICAgICAgdmFyIHRhcmdldCA9IG5ld1F1ZXJ5KCk7XG4gICAgICBlZGdlUXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLkRJUkVDVEVEX0VER0UsXG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICB0YXJnZXQ6IHRhcmdldFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHRoZSBxdWVyeSBpbiB0aGUgc2VsZWN0b3Igc2hvdWxkIGJlIHRoZSBlZGdlIHJhdGhlciB0aGFuIHRoZSBzb3VyY2VcbiAgICAgIHJlcGxhY2VMYXN0UXVlcnkoc2VsZWN0b3IsIHF1ZXJ5LCBlZGdlUXVlcnkpO1xuICAgICAgc2VsZWN0b3IuZWRnZUNvdW50Kys7XG5cbiAgICAgIC8vIHdlJ3JlIG5vdyBwb3B1bGF0aW5nIHRoZSB0YXJnZXQgcXVlcnkgd2l0aCBleHByZXNzaW9ucyB0aGF0IGZvbGxvd1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc291cmNlL3RhcmdldFxuICAgICAgdmFyIHNyY1RndFEgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIF9zb3VyY2UgPSBxdWVyeTtcbiAgICAgIHZhciBfdGFyZ2V0ID0gbmV3UXVlcnkoKTtcbiAgICAgIHNyY1RndFEuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLk5PREVfU09VUkNFLFxuICAgICAgICBzb3VyY2U6IF9zb3VyY2UsXG4gICAgICAgIHRhcmdldDogX3RhcmdldFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHRoZSBxdWVyeSBpbiB0aGUgc2VsZWN0b3Igc2hvdWxkIGJlIHRoZSBuZWlnaGJvdXJob29kIHJhdGhlciB0aGFuIHRoZSBub2RlXG4gICAgICByZXBsYWNlTGFzdFF1ZXJ5KHNlbGVjdG9yLCBxdWVyeSwgc3JjVGd0USk7XG4gICAgICBzZWxlY3Rvci5lZGdlQ291bnQrKztcbiAgICAgIHJldHVybiBfdGFyZ2V0OyAvLyBub3cgcG9wdWxhdGluZyB0aGUgdGFyZ2V0IHdpdGggdGhlIGZvbGxvd2luZyBleHByZXNzaW9uc1xuICAgIH1cbiAgfVxufSwge1xuICBuYW1lOiAndW5kaXJlY3RlZEVkZ2UnLFxuICBzZXBhcmF0b3I6IHRydWUsXG4gIHJlZ2V4OiB0b2tlbnMudW5kaXJlY3RlZEVkZ2UsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnkpIHtcbiAgICBpZiAoc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPT0gbnVsbCkge1xuICAgICAgLy8gdW5kaXJlY3RlZCBlZGdlXG4gICAgICB2YXIgZWRnZVF1ZXJ5ID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBzb3VyY2UgPSBxdWVyeTtcbiAgICAgIHZhciB0YXJnZXQgPSBuZXdRdWVyeSgpO1xuICAgICAgZWRnZVF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5VTkRJUkVDVEVEX0VER0UsXG4gICAgICAgIG5vZGVzOiBbc291cmNlLCB0YXJnZXRdXG4gICAgICB9KTtcblxuICAgICAgLy8gdGhlIHF1ZXJ5IGluIHRoZSBzZWxlY3RvciBzaG91bGQgYmUgdGhlIGVkZ2UgcmF0aGVyIHRoYW4gdGhlIHNvdXJjZVxuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgcXVlcnksIGVkZ2VRdWVyeSk7XG4gICAgICBzZWxlY3Rvci5lZGdlQ291bnQrKztcblxuICAgICAgLy8gd2UncmUgbm93IHBvcHVsYXRpbmcgdGhlIHRhcmdldCBxdWVyeSB3aXRoIGV4cHJlc3Npb25zIHRoYXQgZm9sbG93XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBuZWlnaGJvdXJob29kXG4gICAgICB2YXIgbmhvb2RRID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBub2RlID0gcXVlcnk7XG4gICAgICB2YXIgbmVpZ2hib3IgPSBuZXdRdWVyeSgpO1xuICAgICAgbmhvb2RRLmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5OT0RFX05FSUdIQk9SLFxuICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICBuZWlnaGJvcjogbmVpZ2hib3JcbiAgICAgIH0pO1xuXG4gICAgICAvLyB0aGUgcXVlcnkgaW4gdGhlIHNlbGVjdG9yIHNob3VsZCBiZSB0aGUgbmVpZ2hib3VyaG9vZCByYXRoZXIgdGhhbiB0aGUgbm9kZVxuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgcXVlcnksIG5ob29kUSk7XG4gICAgICByZXR1cm4gbmVpZ2hib3I7IC8vIG5vdyBwb3B1bGF0aW5nIHRoZSBuZWlnaGJvciB3aXRoIGZvbGxvd2luZyBleHByZXNzaW9uc1xuICAgIH1cbiAgfVxufSwge1xuICBuYW1lOiAnY2hpbGQnLFxuICBzZXBhcmF0b3I6IHRydWUsXG4gIHJlZ2V4OiB0b2tlbnMuY2hpbGQsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnkpIHtcbiAgICBpZiAoc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPT0gbnVsbCkge1xuICAgICAgLy8gZGVmYXVsdDogY2hpbGQgcXVlcnlcbiAgICAgIHZhciBwYXJlbnRDaGlsZFF1ZXJ5ID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBjaGlsZCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV07XG4gICAgICBwYXJlbnRDaGlsZFF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5DSElMRCxcbiAgICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICAgIGNoaWxkOiBjaGlsZFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHRoZSBxdWVyeSBpbiB0aGUgc2VsZWN0b3Igc2hvdWxkIGJlIHRoZSAnPicgaXRzZWxmXG4gICAgICByZXBsYWNlTGFzdFF1ZXJ5KHNlbGVjdG9yLCBxdWVyeSwgcGFyZW50Q2hpbGRRdWVyeSk7XG4gICAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50Kys7XG5cbiAgICAgIC8vIHdlJ3JlIG5vdyBwb3B1bGF0aW5nIHRoZSBjaGlsZCBxdWVyeSB3aXRoIGV4cHJlc3Npb25zIHRoYXQgZm9sbG93XG4gICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5jdXJyZW50U3ViamVjdCA9PT0gcXVlcnkpIHtcbiAgICAgIC8vIGNvbXBvdW5kIHNwbGl0IHF1ZXJ5XG4gICAgICB2YXIgY29tcG91bmQgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIGxlZnQgPSBzZWxlY3RvcltzZWxlY3Rvci5sZW5ndGggLSAxXTtcbiAgICAgIHZhciByaWdodCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgc3ViamVjdCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgX2NoaWxkID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBfcGFyZW50ID0gbmV3UXVlcnkoKTtcblxuICAgICAgLy8gc2V0IHVwIHRoZSByb290IGNvbXBvdW5kIHFcbiAgICAgIGNvbXBvdW5kLmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5DT01QT1VORF9TUExJVCxcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgcmlnaHQ6IHJpZ2h0LFxuICAgICAgICBzdWJqZWN0OiBzdWJqZWN0XG4gICAgICB9KTtcblxuICAgICAgLy8gcG9wdWxhdGUgdGhlIHN1YmplY3QgYW5kIHJlcGxhY2UgdGhlIHEgYXQgdGhlIG9sZCBzcG90ICh3aXRoaW4gbGVmdCkgd2l0aCBUUlVFXG4gICAgICBzdWJqZWN0LmNoZWNrcyA9IHF1ZXJ5LmNoZWNrczsgLy8gdGFrZSB0aGUgY2hlY2tzIGZyb20gdGhlIGxlZnRcbiAgICAgIHF1ZXJ5LmNoZWNrcyA9IFt7XG4gICAgICAgIHR5cGU6IFR5cGUuVFJVRVxuICAgICAgfV07IC8vIGNoZWNrcyB1bmRlciBsZWZ0IHJlZnMgdGhlIHN1YmplY3QgaW1wbGljaXRseVxuXG4gICAgICAvLyBzZXQgdXAgdGhlIHJpZ2h0IHFcbiAgICAgIF9wYXJlbnQuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLlRSVUVcbiAgICAgIH0pOyAvLyBwYXJlbnQgaW1wbGljaXRseSByZWZzIHRoZSBzdWJqZWN0XG4gICAgICByaWdodC5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuUEFSRU5ULFxuICAgICAgICAvLyB0eXBlIGlzIHN3YXBwZWQgb24gcmlnaHQgc2lkZSBxdWVyaWVzXG4gICAgICAgIHBhcmVudDogX3BhcmVudCxcbiAgICAgICAgY2hpbGQ6IF9jaGlsZCAvLyBlbXB0eSBmb3Igbm93XG4gICAgICB9KTtcblxuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgbGVmdCwgY29tcG91bmQpO1xuXG4gICAgICAvLyB1cGRhdGUgdGhlIHJlZiBzaW5jZSB3ZSBtb3ZlZCB0aGluZ3MgYXJvdW5kIGZvciBgcXVlcnlgXG4gICAgICBzZWxlY3Rvci5jdXJyZW50U3ViamVjdCA9IHN1YmplY3Q7XG4gICAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50Kys7XG4gICAgICByZXR1cm4gX2NoaWxkOyAvLyBub3cgcG9wdWxhdGluZyB0aGUgcmlnaHQgc2lkZSdzIGNoaWxkXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHBhcmVudCBxdWVyeVxuICAgICAgLy8gaW5mbyBmb3IgcGFyZW50IHF1ZXJ5XG4gICAgICB2YXIgX3BhcmVudDIgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIF9jaGlsZDIgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIHBjUUNoZWNrcyA9IFt7XG4gICAgICAgIHR5cGU6IFR5cGUuUEFSRU5ULFxuICAgICAgICBwYXJlbnQ6IF9wYXJlbnQyLFxuICAgICAgICBjaGlsZDogX2NoaWxkMlxuICAgICAgfV07XG5cbiAgICAgIC8vIHRoZSBwYXJlbnQtY2hpbGQgcXVlcnkgdGFrZXMgdGhlIHBsYWNlIG9mIHRoZSBxdWVyeSBwcmV2aW91c2x5IGJlaW5nIHBvcHVsYXRlZFxuICAgICAgX3BhcmVudDIuY2hlY2tzID0gcXVlcnkuY2hlY2tzOyAvLyB0aGUgcHJldmlvdXMgcXVlcnkgY29udGFpbnMgdGhlIGNoZWNrcyBmb3IgdGhlIHBhcmVudFxuICAgICAgcXVlcnkuY2hlY2tzID0gcGNRQ2hlY2tzOyAvLyBwYyBxdWVyeSB0YWtlcyBvdmVyXG5cbiAgICAgIHNlbGVjdG9yLmNvbXBvdW5kQ291bnQrKztcbiAgICAgIHJldHVybiBfY2hpbGQyOyAvLyB3ZSdyZSBub3cgcG9wdWxhdGluZyB0aGUgY2hpbGRcbiAgICB9XG4gIH1cbn0sIHtcbiAgbmFtZTogJ2Rlc2NlbmRhbnQnLFxuICBzZXBhcmF0b3I6IHRydWUsXG4gIHJlZ2V4OiB0b2tlbnMuZGVzY2VuZGFudCxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSkge1xuICAgIGlmIChzZWxlY3Rvci5jdXJyZW50U3ViamVjdCA9PSBudWxsKSB7XG4gICAgICAvLyBkZWZhdWx0OiBkZXNjZW5kYW50IHF1ZXJ5XG4gICAgICB2YXIgYW5jQ2hRdWVyeSA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgZGVzY2VuZGFudCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgYW5jZXN0b3IgPSBzZWxlY3RvcltzZWxlY3Rvci5sZW5ndGggLSAxXTtcbiAgICAgIGFuY0NoUXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLkRFU0NFTkRBTlQsXG4gICAgICAgIGFuY2VzdG9yOiBhbmNlc3RvcixcbiAgICAgICAgZGVzY2VuZGFudDogZGVzY2VuZGFudFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHRoZSBxdWVyeSBpbiB0aGUgc2VsZWN0b3Igc2hvdWxkIGJlIHRoZSAnPicgaXRzZWxmXG4gICAgICByZXBsYWNlTGFzdFF1ZXJ5KHNlbGVjdG9yLCBxdWVyeSwgYW5jQ2hRdWVyeSk7XG4gICAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50Kys7XG5cbiAgICAgIC8vIHdlJ3JlIG5vdyBwb3B1bGF0aW5nIHRoZSBkZXNjZW5kYW50IHF1ZXJ5IHdpdGggZXhwcmVzc2lvbnMgdGhhdCBmb2xsb3dcbiAgICAgIHJldHVybiBkZXNjZW5kYW50O1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPT09IHF1ZXJ5KSB7XG4gICAgICAvLyBjb21wb3VuZCBzcGxpdCBxdWVyeVxuICAgICAgdmFyIGNvbXBvdW5kID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBsZWZ0ID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV07XG4gICAgICB2YXIgcmlnaHQgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIHN1YmplY3QgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIF9kZXNjZW5kYW50ID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBfYW5jZXN0b3IgPSBuZXdRdWVyeSgpO1xuXG4gICAgICAvLyBzZXQgdXAgdGhlIHJvb3QgY29tcG91bmQgcVxuICAgICAgY29tcG91bmQuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLkNPTVBPVU5EX1NQTElULFxuICAgICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgICByaWdodDogcmlnaHQsXG4gICAgICAgIHN1YmplY3Q6IHN1YmplY3RcbiAgICAgIH0pO1xuXG4gICAgICAvLyBwb3B1bGF0ZSB0aGUgc3ViamVjdCBhbmQgcmVwbGFjZSB0aGUgcSBhdCB0aGUgb2xkIHNwb3QgKHdpdGhpbiBsZWZ0KSB3aXRoIFRSVUVcbiAgICAgIHN1YmplY3QuY2hlY2tzID0gcXVlcnkuY2hlY2tzOyAvLyB0YWtlIHRoZSBjaGVja3MgZnJvbSB0aGUgbGVmdFxuICAgICAgcXVlcnkuY2hlY2tzID0gW3tcbiAgICAgICAgdHlwZTogVHlwZS5UUlVFXG4gICAgICB9XTsgLy8gY2hlY2tzIHVuZGVyIGxlZnQgcmVmcyB0aGUgc3ViamVjdCBpbXBsaWNpdGx5XG5cbiAgICAgIC8vIHNldCB1cCB0aGUgcmlnaHQgcVxuICAgICAgX2FuY2VzdG9yLmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5UUlVFXG4gICAgICB9KTsgLy8gYW5jZXN0b3IgaW1wbGljaXRseSByZWZzIHRoZSBzdWJqZWN0XG4gICAgICByaWdodC5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuQU5DRVNUT1IsXG4gICAgICAgIC8vIHR5cGUgaXMgc3dhcHBlZCBvbiByaWdodCBzaWRlIHF1ZXJpZXNcbiAgICAgICAgYW5jZXN0b3I6IF9hbmNlc3RvcixcbiAgICAgICAgZGVzY2VuZGFudDogX2Rlc2NlbmRhbnQgLy8gZW1wdHkgZm9yIG5vd1xuICAgICAgfSk7XG5cbiAgICAgIHJlcGxhY2VMYXN0UXVlcnkoc2VsZWN0b3IsIGxlZnQsIGNvbXBvdW5kKTtcblxuICAgICAgLy8gdXBkYXRlIHRoZSByZWYgc2luY2Ugd2UgbW92ZWQgdGhpbmdzIGFyb3VuZCBmb3IgYHF1ZXJ5YFxuICAgICAgc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPSBzdWJqZWN0O1xuICAgICAgc2VsZWN0b3IuY29tcG91bmRDb3VudCsrO1xuICAgICAgcmV0dXJuIF9kZXNjZW5kYW50OyAvLyBub3cgcG9wdWxhdGluZyB0aGUgcmlnaHQgc2lkZSdzIGRlc2NlbmRhbnRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYW5jZXN0b3IgcXVlcnlcbiAgICAgIC8vIGluZm8gZm9yIHBhcmVudCBxdWVyeVxuICAgICAgdmFyIF9hbmNlc3RvcjIgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIF9kZXNjZW5kYW50MiA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgYWRRQ2hlY2tzID0gW3tcbiAgICAgICAgdHlwZTogVHlwZS5BTkNFU1RPUixcbiAgICAgICAgYW5jZXN0b3I6IF9hbmNlc3RvcjIsXG4gICAgICAgIGRlc2NlbmRhbnQ6IF9kZXNjZW5kYW50MlxuICAgICAgfV07XG5cbiAgICAgIC8vIHRoZSBwYXJlbnQtY2hpbGQgcXVlcnkgdGFrZXMgdGhlIHBsYWNlIG9mIHRoZSBxdWVyeSBwcmV2aW91c2x5IGJlaW5nIHBvcHVsYXRlZFxuICAgICAgX2FuY2VzdG9yMi5jaGVja3MgPSBxdWVyeS5jaGVja3M7IC8vIHRoZSBwcmV2aW91cyBxdWVyeSBjb250YWlucyB0aGUgY2hlY2tzIGZvciB0aGUgcGFyZW50XG4gICAgICBxdWVyeS5jaGVja3MgPSBhZFFDaGVja3M7IC8vIHBjIHF1ZXJ5IHRha2VzIG92ZXJcblxuICAgICAgc2VsZWN0b3IuY29tcG91bmRDb3VudCsrO1xuICAgICAgcmV0dXJuIF9kZXNjZW5kYW50MjsgLy8gd2UncmUgbm93IHBvcHVsYXRpbmcgdGhlIGNoaWxkXG4gICAgfVxuICB9XG59LCB7XG4gIG5hbWU6ICdzdWJqZWN0JyxcbiAgbW9kaWZpZXI6IHRydWUsXG4gIHJlZ2V4OiB0b2tlbnMuc3ViamVjdCxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSkge1xuICAgIGlmIChzZWxlY3Rvci5jdXJyZW50U3ViamVjdCAhPSBudWxsICYmIHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ICE9PSBxdWVyeSkge1xuICAgICAgd2FybignUmVkZWZpbml0aW9uIG9mIHN1YmplY3QgaW4gc2VsZWN0b3IgYCcgKyBzZWxlY3Rvci50b1N0cmluZygpICsgJ2AnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPSBxdWVyeTtcbiAgICB2YXIgdG9wUSA9IHNlbGVjdG9yW3NlbGVjdG9yLmxlbmd0aCAtIDFdO1xuICAgIHZhciB0b3BDaGsgPSB0b3BRLmNoZWNrc1swXTtcbiAgICB2YXIgdG9wVHlwZSA9IHRvcENoayA9PSBudWxsID8gbnVsbCA6IHRvcENoay50eXBlO1xuICAgIGlmICh0b3BUeXBlID09PSBUeXBlLkRJUkVDVEVEX0VER0UpIHtcbiAgICAgIC8vIGRpcmVjdGVkIGVkZ2Ugd2l0aCBzdWJqZWN0IG9uIHRoZSB0YXJnZXRcblxuICAgICAgLy8gY2hhbmdlIHRvIHRhcmdldCBub2RlIGNoZWNrXG4gICAgICB0b3BDaGsudHlwZSA9IFR5cGUuTk9ERV9UQVJHRVQ7XG4gICAgfSBlbHNlIGlmICh0b3BUeXBlID09PSBUeXBlLlVORElSRUNURURfRURHRSkge1xuICAgICAgLy8gdW5kaXJlY3RlZCBlZGdlIHdpdGggc3ViamVjdCBvbiB0aGUgc2Vjb25kIG5vZGVcblxuICAgICAgLy8gY2hhbmdlIHRvIG5laWdoYm9yIGNoZWNrXG4gICAgICB0b3BDaGsudHlwZSA9IFR5cGUuTk9ERV9ORUlHSEJPUjtcbiAgICAgIHRvcENoay5ub2RlID0gdG9wQ2hrLm5vZGVzWzFdOyAvLyBzZWNvbmQgbm9kZSBpcyBzdWJqZWN0XG4gICAgICB0b3BDaGsubmVpZ2hib3IgPSB0b3BDaGsubm9kZXNbMF07XG5cbiAgICAgIC8vIGNsZWFuIHVwIHVudXNlZCBmaWVsZHMgZm9yIG5ldyB0eXBlXG4gICAgICB0b3BDaGsubm9kZXMgPSBudWxsO1xuICAgIH1cbiAgfVxufV07XG5leHBycy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gIHJldHVybiBlLnJlZ2V4T2JqID0gbmV3IFJlZ0V4cCgnXicgKyBlLnJlZ2V4KTtcbn0pO1xuXG4vKipcbiAqIE9mIGFsbCB0aGUgZXhwcmVzc2lvbnMsIGZpbmQgdGhlIGZpcnN0IG1hdGNoIGluIHRoZSByZW1haW5pbmcgdGV4dC5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1haW5pbmcgVGhlIHJlbWFpbmluZyB0ZXh0IHRvIHBhcnNlXG4gKiBAcmV0dXJucyBUaGUgbWF0Y2hlZCBleHByZXNzaW9uIGFuZCB0aGUgbmV3bHkgcmVtYWluaW5nIHRleHQgYHsgZXhwciwgbWF0Y2gsIG5hbWUsIHJlbWFpbmluZyB9YFxuICovXG52YXIgY29uc3VtZUV4cHIgPSBmdW5jdGlvbiBjb25zdW1lRXhwcihyZW1haW5pbmcpIHtcbiAgdmFyIGV4cHI7XG4gIHZhciBtYXRjaDtcbiAgdmFyIG5hbWU7XG4gIGZvciAodmFyIGogPSAwOyBqIDwgZXhwcnMubGVuZ3RoOyBqKyspIHtcbiAgICB2YXIgZSA9IGV4cHJzW2pdO1xuICAgIHZhciBuID0gZS5uYW1lO1xuICAgIHZhciBtID0gcmVtYWluaW5nLm1hdGNoKGUucmVnZXhPYmopO1xuICAgIGlmIChtICE9IG51bGwpIHtcbiAgICAgIG1hdGNoID0gbTtcbiAgICAgIGV4cHIgPSBlO1xuICAgICAgbmFtZSA9IG47XG4gICAgICB2YXIgY29uc3VtZWQgPSBtWzBdO1xuICAgICAgcmVtYWluaW5nID0gcmVtYWluaW5nLnN1YnN0cmluZyhjb25zdW1lZC5sZW5ndGgpO1xuICAgICAgYnJlYWs7IC8vIHdlJ3ZlIGNvbnN1bWVkIG9uZSBleHByLCBzbyB3ZSBjYW4gcmV0dXJuIG5vd1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZXhwcjogZXhwcixcbiAgICBtYXRjaDogbWF0Y2gsXG4gICAgbmFtZTogbmFtZSxcbiAgICByZW1haW5pbmc6IHJlbWFpbmluZ1xuICB9O1xufTtcblxuLyoqXG4gKiBDb25zdW1lIGFsbCB0aGUgbGVhZGluZyB3aGl0ZXNwYWNlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtYWluaW5nIFRoZSB0ZXh0IHRvIGNvbnN1bWVcbiAqIEByZXR1cm5zIFRoZSB0ZXh0IHdpdGggdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSByZW1vdmVkXG4gKi9cbnZhciBjb25zdW1lV2hpdGVzcGFjZSA9IGZ1bmN0aW9uIGNvbnN1bWVXaGl0ZXNwYWNlKHJlbWFpbmluZykge1xuICB2YXIgbWF0Y2ggPSByZW1haW5pbmcubWF0Y2goL15cXHMrLyk7XG4gIGlmIChtYXRjaCkge1xuICAgIHZhciBjb25zdW1lZCA9IG1hdGNoWzBdO1xuICAgIHJlbWFpbmluZyA9IHJlbWFpbmluZy5zdWJzdHJpbmcoY29uc3VtZWQubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gcmVtYWluaW5nO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgc3RyaW5nIGFuZCBzdG9yZSB0aGUgcGFyc2VkIHJlcHJlc2VudGF0aW9uIGluIHRoZSBTZWxlY3Rvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBUaGUgc2VsZWN0b3Igc3RyaW5nXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHNlbGVjdG9yIHdhcyBzdWNjZXNzZnVsbHkgcGFyc2VkLCBgZmFsc2VgIG90aGVyd2lzZVxuICovXG52YXIgcGFyc2UgPSBmdW5jdGlvbiBwYXJzZShzZWxlY3Rvcikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByZW1haW5pbmcgPSBzZWxmLmlucHV0VGV4dCA9IHNlbGVjdG9yO1xuICB2YXIgY3VycmVudFF1ZXJ5ID0gc2VsZlswXSA9IG5ld1F1ZXJ5KCk7XG4gIHNlbGYubGVuZ3RoID0gMTtcbiAgcmVtYWluaW5nID0gY29uc3VtZVdoaXRlc3BhY2UocmVtYWluaW5nKTsgLy8gZ2V0IHJpZCBvZiBsZWFkaW5nIHdoaXRlc3BhY2VcblxuICBmb3IgKDs7KSB7XG4gICAgdmFyIGV4cHJJbmZvID0gY29uc3VtZUV4cHIocmVtYWluaW5nKTtcbiAgICBpZiAoZXhwckluZm8uZXhwciA9PSBudWxsKSB7XG4gICAgICB3YXJuKCdUaGUgc2VsZWN0b3IgYCcgKyBzZWxlY3RvciArICdgaXMgaW52YWxpZCcpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXJncyA9IGV4cHJJbmZvLm1hdGNoLnNsaWNlKDEpO1xuXG4gICAgICAvLyBsZXQgdGhlIHRva2VuIHBvcHVsYXRlIHRoZSBzZWxlY3RvciBvYmplY3QgaW4gY3VycmVudFF1ZXJ5XG4gICAgICB2YXIgcmV0ID0gZXhwckluZm8uZXhwci5wb3B1bGF0ZShzZWxmLCBjdXJyZW50UXVlcnksIGFyZ3MpO1xuICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBleGl0IGlmIHBvcHVsYXRpb24gZmFpbGVkXG4gICAgICB9IGVsc2UgaWYgKHJldCAhPSBudWxsKSB7XG4gICAgICAgIGN1cnJlbnRRdWVyeSA9IHJldDsgLy8gY2hhbmdlIHRoZSBjdXJyZW50IHF1ZXJ5IHRvIGJlIGZpbGxlZCBpZiB0aGUgZXhwciBzcGVjaWZpZXNcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZW1haW5pbmcgPSBleHBySW5mby5yZW1haW5pbmc7XG5cbiAgICAvLyB3ZSdyZSBkb25lIHdoZW4gdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gcGFyc2VcbiAgICBpZiAocmVtYWluaW5nLm1hdGNoKC9eXFxzKiQvKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHZhciBsYXN0USA9IHNlbGZbc2VsZi5sZW5ndGggLSAxXTtcbiAgaWYgKHNlbGYuY3VycmVudFN1YmplY3QgIT0gbnVsbCkge1xuICAgIGxhc3RRLnN1YmplY3QgPSBzZWxmLmN1cnJlbnRTdWJqZWN0O1xuICB9XG4gIGxhc3RRLmVkZ2VDb3VudCA9IHNlbGYuZWRnZUNvdW50O1xuICBsYXN0US5jb21wb3VuZENvdW50ID0gc2VsZi5jb21wb3VuZENvdW50O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcSA9IHNlbGZbaV07XG5cbiAgICAvLyBpbiBmdXR1cmUsIHRoaXMgY291bGQgcG90ZW50aWFsbHkgYmUgYWxsb3dlZCBpZiB0aGVyZSB3ZXJlIG9wZXJhdG9yIHByZWNlZGVuY2UgYW5kIGRldGVjdGlvbiBvZiBpbnZhbGlkIGNvbWJpbmF0aW9uc1xuICAgIGlmIChxLmNvbXBvdW5kQ291bnQgPiAwICYmIHEuZWRnZUNvdW50ID4gMCkge1xuICAgICAgd2FybignVGhlIHNlbGVjdG9yIGAnICsgc2VsZWN0b3IgKyAnYCBpcyBpbnZhbGlkIGJlY2F1c2UgaXQgdXNlcyBib3RoIGEgY29tcG91bmQgc2VsZWN0b3IgYW5kIGFuIGVkZ2Ugc2VsZWN0b3InKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHEuZWRnZUNvdW50ID4gMSkge1xuICAgICAgd2FybignVGhlIHNlbGVjdG9yIGAnICsgc2VsZWN0b3IgKyAnYCBpcyBpbnZhbGlkIGJlY2F1c2UgaXQgdXNlcyBtdWx0aXBsZSBlZGdlIHNlbGVjdG9ycycpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAocS5lZGdlQ291bnQgPT09IDEpIHtcbiAgICAgIHdhcm4oJ1RoZSBzZWxlY3RvciBgJyArIHNlbGVjdG9yICsgJ2AgaXMgZGVwcmVjYXRlZC4gIEVkZ2Ugc2VsZWN0b3JzIGRvIG5vdCB0YWtlIGVmZmVjdCBvbiBjaGFuZ2VzIHRvIHNvdXJjZSBhbmQgdGFyZ2V0IG5vZGVzIGFmdGVyIGFuIGVkZ2UgaXMgYWRkZWQsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiAgVXNlIGEgY2xhc3Mgb3IgZGF0YSBzZWxlY3RvciBvbiBlZGdlcyBpbnN0ZWFkLCB1cGRhdGluZyB0aGUgY2xhc3Mgb3IgZGF0YSBvZiBhbiBlZGdlIHdoZW4geW91ciBhcHAgZGV0ZWN0cyBhIGNoYW5nZSBpbiBzb3VyY2Ugb3IgdGFyZ2V0IG5vZGVzLicpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTsgLy8gc3VjY2Vzc1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIHNlbGVjdG9yIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nLiAgVGhpcyB2YWx1ZSB1c2VzIGRlZmF1bHQgZm9ybWF0dGluZyxcbiAqIHNvIHRoaW5ncyBsaWtlIHNwYWNpbmcgbWF5IGRpZmZlciBmcm9tIHRoZSBpbnB1dCB0ZXh0IHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2VsZWN0b3Igc3RyaW5nXG4gKi9cbnZhciB0b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICBpZiAodGhpcy50b1N0cmluZ0NhY2hlICE9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy50b1N0cmluZ0NhY2hlO1xuICB9XG4gIHZhciBjbGVhbiA9IGZ1bmN0aW9uIGNsZWFuKG9iaikge1xuICAgIGlmIChvYmogPT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgfTtcbiAgdmFyIGNsZWFuVmFsID0gZnVuY3Rpb24gY2xlYW5WYWwodmFsKSB7XG4gICAgaWYgKHN0cmluZyh2YWwpKSB7XG4gICAgICByZXR1cm4gJ1wiJyArIHZhbCArICdcIic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjbGVhbih2YWwpO1xuICAgIH1cbiAgfTtcbiAgdmFyIHNwYWNlID0gZnVuY3Rpb24gc3BhY2UodmFsKSB7XG4gICAgcmV0dXJuICcgJyArIHZhbCArICcgJztcbiAgfTtcbiAgdmFyIGNoZWNrVG9TdHJpbmcgPSBmdW5jdGlvbiBjaGVja1RvU3RyaW5nKGNoZWNrLCBzdWJqZWN0KSB7XG4gICAgdmFyIHR5cGUgPSBjaGVjay50eXBlLFxuICAgICAgdmFsdWUgPSBjaGVjay52YWx1ZTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVHlwZS5HUk9VUDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBncm91cCA9IGNsZWFuKHZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gZ3JvdXAuc3Vic3RyaW5nKDAsIGdyb3VwLmxlbmd0aCAtIDEpO1xuICAgICAgICB9XG4gICAgICBjYXNlIFR5cGUuREFUQV9DT01QQVJFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGZpZWxkID0gY2hlY2suZmllbGQsXG4gICAgICAgICAgICBvcGVyYXRvciA9IGNoZWNrLm9wZXJhdG9yO1xuICAgICAgICAgIHJldHVybiAnWycgKyBmaWVsZCArIHNwYWNlKGNsZWFuKG9wZXJhdG9yKSkgKyBjbGVhblZhbCh2YWx1ZSkgKyAnXSc7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgVHlwZS5EQVRBX0JPT0w6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX29wZXJhdG9yID0gY2hlY2sub3BlcmF0b3IsXG4gICAgICAgICAgICBfZmllbGQgPSBjaGVjay5maWVsZDtcbiAgICAgICAgICByZXR1cm4gJ1snICsgY2xlYW4oX29wZXJhdG9yKSArIF9maWVsZCArICddJztcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLkRBVEFfRVhJU1Q6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX2ZpZWxkMiA9IGNoZWNrLmZpZWxkO1xuICAgICAgICAgIHJldHVybiAnWycgKyBfZmllbGQyICsgJ10nO1xuICAgICAgICB9XG4gICAgICBjYXNlIFR5cGUuTUVUQV9DT01QQVJFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9vcGVyYXRvcjIgPSBjaGVjay5vcGVyYXRvcixcbiAgICAgICAgICAgIF9maWVsZDMgPSBjaGVjay5maWVsZDtcbiAgICAgICAgICByZXR1cm4gJ1tbJyArIF9maWVsZDMgKyBzcGFjZShjbGVhbihfb3BlcmF0b3IyKSkgKyBjbGVhblZhbCh2YWx1ZSkgKyAnXV0nO1xuICAgICAgICB9XG4gICAgICBjYXNlIFR5cGUuU1RBVEU6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgVHlwZS5JRDpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiAnIycgKyB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLkNMQVNTOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuICcuJyArIHZhbHVlO1xuICAgICAgICB9XG4gICAgICBjYXNlIFR5cGUuUEFSRU5UOlxuICAgICAgY2FzZSBUeXBlLkNISUxEOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHF1ZXJ5VG9TdHJpbmcoY2hlY2sucGFyZW50LCBzdWJqZWN0KSArIHNwYWNlKCc+JykgKyBxdWVyeVRvU3RyaW5nKGNoZWNrLmNoaWxkLCBzdWJqZWN0KTtcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLkFOQ0VTVE9SOlxuICAgICAgY2FzZSBUeXBlLkRFU0NFTkRBTlQ6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gcXVlcnlUb1N0cmluZyhjaGVjay5hbmNlc3Rvciwgc3ViamVjdCkgKyAnICcgKyBxdWVyeVRvU3RyaW5nKGNoZWNrLmRlc2NlbmRhbnQsIHN1YmplY3QpO1xuICAgICAgICB9XG4gICAgICBjYXNlIFR5cGUuQ09NUE9VTkRfU1BMSVQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGhzID0gcXVlcnlUb1N0cmluZyhjaGVjay5sZWZ0LCBzdWJqZWN0KTtcbiAgICAgICAgICB2YXIgc3ViID0gcXVlcnlUb1N0cmluZyhjaGVjay5zdWJqZWN0LCBzdWJqZWN0KTtcbiAgICAgICAgICB2YXIgcmhzID0gcXVlcnlUb1N0cmluZyhjaGVjay5yaWdodCwgc3ViamVjdCk7XG4gICAgICAgICAgcmV0dXJuIGxocyArIChsaHMubGVuZ3RoID4gMCA/ICcgJyA6ICcnKSArIHN1YiArIHJocztcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLlRSVUU6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICB9XG4gIH07XG4gIHZhciBxdWVyeVRvU3RyaW5nID0gZnVuY3Rpb24gcXVlcnlUb1N0cmluZyhxdWVyeSwgc3ViamVjdCkge1xuICAgIHJldHVybiBxdWVyeS5jaGVja3MucmVkdWNlKGZ1bmN0aW9uIChzdHIsIGNoaywgaSkge1xuICAgICAgcmV0dXJuIHN0ciArIChzdWJqZWN0ID09PSBxdWVyeSAmJiBpID09PSAwID8gJyQnIDogJycpICsgY2hlY2tUb1N0cmluZyhjaGssIHN1YmplY3QpO1xuICAgIH0sICcnKTtcbiAgfTtcbiAgdmFyIHN0ciA9ICcnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcXVlcnkgPSB0aGlzW2ldO1xuICAgIHN0ciArPSBxdWVyeVRvU3RyaW5nKHF1ZXJ5LCBxdWVyeS5zdWJqZWN0KTtcbiAgICBpZiAodGhpcy5sZW5ndGggPiAxICYmIGkgPCB0aGlzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHN0ciArPSAnLCAnO1xuICAgIH1cbiAgfVxuICB0aGlzLnRvU3RyaW5nQ2FjaGUgPSBzdHI7XG4gIHJldHVybiBzdHI7XG59O1xudmFyIHBhcnNlJDEgPSB7XG4gIHBhcnNlOiBwYXJzZSxcbiAgdG9TdHJpbmc6IHRvU3RyaW5nXG59O1xuXG52YXIgdmFsQ21wID0gZnVuY3Rpb24gdmFsQ21wKGZpZWxkVmFsLCBvcGVyYXRvciwgdmFsdWUpIHtcbiAgdmFyIG1hdGNoZXM7XG4gIHZhciBpc0ZpZWxkU3RyID0gc3RyaW5nKGZpZWxkVmFsKTtcbiAgdmFyIGlzRmllbGROdW0gPSBudW1iZXIkMShmaWVsZFZhbCk7XG4gIHZhciBpc1ZhbFN0ciA9IHN0cmluZyh2YWx1ZSk7XG4gIHZhciBmaWVsZFN0ciwgdmFsU3RyO1xuICB2YXIgY2FzZUluc2Vuc2l0aXZlID0gZmFsc2U7XG4gIHZhciBub3RFeHByID0gZmFsc2U7XG4gIHZhciBpc0luZXFDbXAgPSBmYWxzZTtcbiAgaWYgKG9wZXJhdG9yLmluZGV4T2YoJyEnKSA+PSAwKSB7XG4gICAgb3BlcmF0b3IgPSBvcGVyYXRvci5yZXBsYWNlKCchJywgJycpO1xuICAgIG5vdEV4cHIgPSB0cnVlO1xuICB9XG4gIGlmIChvcGVyYXRvci5pbmRleE9mKCdAJykgPj0gMCkge1xuICAgIG9wZXJhdG9yID0gb3BlcmF0b3IucmVwbGFjZSgnQCcsICcnKTtcbiAgICBjYXNlSW5zZW5zaXRpdmUgPSB0cnVlO1xuICB9XG4gIGlmIChpc0ZpZWxkU3RyIHx8IGlzVmFsU3RyIHx8IGNhc2VJbnNlbnNpdGl2ZSkge1xuICAgIGZpZWxkU3RyID0gIWlzRmllbGRTdHIgJiYgIWlzRmllbGROdW0gPyAnJyA6ICcnICsgZmllbGRWYWw7XG4gICAgdmFsU3RyID0gJycgKyB2YWx1ZTtcbiAgfVxuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIGEgY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29uLCB0aGVuIHdlJ3JlIHVzaW5nIGEgU1RSSU5HIGNvbXBhcmlzb25cbiAgLy8gZXZlbiBpZiB3ZSdyZSBjb21wYXJpbmcgbnVtYmVyc1xuICBpZiAoY2FzZUluc2Vuc2l0aXZlKSB7XG4gICAgZmllbGRWYWwgPSBmaWVsZFN0ciA9IGZpZWxkU3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsdWUgPSB2YWxTdHIgPSB2YWxTdHIudG9Mb3dlckNhc2UoKTtcbiAgfVxuICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgY2FzZSAnKj0nOlxuICAgICAgbWF0Y2hlcyA9IGZpZWxkU3RyLmluZGV4T2YodmFsU3RyKSA+PSAwO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnJD0nOlxuICAgICAgbWF0Y2hlcyA9IGZpZWxkU3RyLmluZGV4T2YodmFsU3RyLCBmaWVsZFN0ci5sZW5ndGggLSB2YWxTdHIubGVuZ3RoKSA+PSAwO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnXj0nOlxuICAgICAgbWF0Y2hlcyA9IGZpZWxkU3RyLmluZGV4T2YodmFsU3RyKSA9PT0gMDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJz0nOlxuICAgICAgbWF0Y2hlcyA9IGZpZWxkVmFsID09PSB2YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJz4nOlxuICAgICAgaXNJbmVxQ21wID0gdHJ1ZTtcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFZhbCA+IHZhbHVlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnPj0nOlxuICAgICAgaXNJbmVxQ21wID0gdHJ1ZTtcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFZhbCA+PSB2YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJzwnOlxuICAgICAgaXNJbmVxQ21wID0gdHJ1ZTtcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFZhbCA8IHZhbHVlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnPD0nOlxuICAgICAgaXNJbmVxQ21wID0gdHJ1ZTtcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFZhbCA8PSB2YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBtYXRjaGVzID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIC8vIGFwcGx5IHRoZSBub3Qgb3AsIGJ1dCBudWxsIHZhbHMgZm9yIGluZXF1YWxpdGllcyBzaG91bGQgYWx3YXlzIHN0YXkgbm9uLW1hdGNoaW5nXG4gIGlmIChub3RFeHByICYmIChmaWVsZFZhbCAhPSBudWxsIHx8ICFpc0luZXFDbXApKSB7XG4gICAgbWF0Y2hlcyA9ICFtYXRjaGVzO1xuICB9XG4gIHJldHVybiBtYXRjaGVzO1xufTtcbnZhciBib29sQ21wID0gZnVuY3Rpb24gYm9vbENtcChmaWVsZFZhbCwgb3BlcmF0b3IpIHtcbiAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgIGNhc2UgJz8nOlxuICAgICAgcmV0dXJuIGZpZWxkVmFsID8gdHJ1ZSA6IGZhbHNlO1xuICAgIGNhc2UgJyEnOlxuICAgICAgcmV0dXJuIGZpZWxkVmFsID8gZmFsc2UgOiB0cnVlO1xuICAgIGNhc2UgJ14nOlxuICAgICAgcmV0dXJuIGZpZWxkVmFsID09PSB1bmRlZmluZWQ7XG4gIH1cbn07XG52YXIgZXhpc3RDbXAgPSBmdW5jdGlvbiBleGlzdENtcChmaWVsZFZhbCkge1xuICByZXR1cm4gZmllbGRWYWwgIT09IHVuZGVmaW5lZDtcbn07XG52YXIgZGF0YSQxID0gZnVuY3Rpb24gZGF0YShlbGUsIGZpZWxkKSB7XG4gIHJldHVybiBlbGUuZGF0YShmaWVsZCk7XG59O1xudmFyIG1ldGEgPSBmdW5jdGlvbiBtZXRhKGVsZSwgZmllbGQpIHtcbiAgcmV0dXJuIGVsZVtmaWVsZF0oKTtcbn07XG5cbi8qKiBBIGxvb2t1cCBvZiBgbWF0Y2goY2hlY2ssIGVsZSlgIGZ1bmN0aW9ucyBieSBgVHlwZWAgaW50ICovXG52YXIgbWF0Y2ggPSBbXTtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHF1ZXJ5IG1hdGNoZXMgZm9yIHRoZSBlbGVtZW50XG4gKiBAcGFyYW0gcXVlcnkgVGhlIGB7IHR5cGUsIHZhbHVlLCAuLi4gfWAgcXVlcnkgb2JqZWN0XG4gKiBAcGFyYW0gZWxlIFRoZSBlbGVtZW50IHRvIGNvbXBhcmUgYWdhaW5zdFxuKi9cbnZhciBtYXRjaGVzJDEgPSBmdW5jdGlvbiBtYXRjaGVzKHF1ZXJ5LCBlbGUpIHtcbiAgcmV0dXJuIHF1ZXJ5LmNoZWNrcy5ldmVyeShmdW5jdGlvbiAoY2hrKSB7XG4gICAgcmV0dXJuIG1hdGNoW2Noay50eXBlXShjaGssIGVsZSk7XG4gIH0pO1xufTtcbm1hdGNoW1R5cGUuR1JPVVBdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGdyb3VwID0gY2hlY2sudmFsdWU7XG4gIHJldHVybiBncm91cCA9PT0gJyonIHx8IGdyb3VwID09PSBlbGUuZ3JvdXAoKTtcbn07XG5tYXRjaFtUeXBlLlNUQVRFXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBzdGF0ZVNlbGVjdG9yID0gY2hlY2sudmFsdWU7XG4gIHJldHVybiBzdGF0ZVNlbGVjdG9yTWF0Y2hlcyhzdGF0ZVNlbGVjdG9yLCBlbGUpO1xufTtcbm1hdGNoW1R5cGUuSURdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGlkID0gY2hlY2sudmFsdWU7XG4gIHJldHVybiBlbGUuaWQoKSA9PT0gaWQ7XG59O1xubWF0Y2hbVHlwZS5DTEFTU10gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICB2YXIgY2xzID0gY2hlY2sudmFsdWU7XG4gIHJldHVybiBlbGUuaGFzQ2xhc3MoY2xzKTtcbn07XG5tYXRjaFtUeXBlLk1FVEFfQ09NUEFSRV0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICB2YXIgZmllbGQgPSBjaGVjay5maWVsZCxcbiAgICBvcGVyYXRvciA9IGNoZWNrLm9wZXJhdG9yLFxuICAgIHZhbHVlID0gY2hlY2sudmFsdWU7XG4gIHJldHVybiB2YWxDbXAobWV0YShlbGUsIGZpZWxkKSwgb3BlcmF0b3IsIHZhbHVlKTtcbn07XG5tYXRjaFtUeXBlLkRBVEFfQ09NUEFSRV0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICB2YXIgZmllbGQgPSBjaGVjay5maWVsZCxcbiAgICBvcGVyYXRvciA9IGNoZWNrLm9wZXJhdG9yLFxuICAgIHZhbHVlID0gY2hlY2sudmFsdWU7XG4gIHJldHVybiB2YWxDbXAoZGF0YSQxKGVsZSwgZmllbGQpLCBvcGVyYXRvciwgdmFsdWUpO1xufTtcbm1hdGNoW1R5cGUuREFUQV9CT09MXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBmaWVsZCA9IGNoZWNrLmZpZWxkLFxuICAgIG9wZXJhdG9yID0gY2hlY2sub3BlcmF0b3I7XG4gIHJldHVybiBib29sQ21wKGRhdGEkMShlbGUsIGZpZWxkKSwgb3BlcmF0b3IpO1xufTtcbm1hdGNoW1R5cGUuREFUQV9FWElTVF0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICB2YXIgZmllbGQgPSBjaGVjay5maWVsZDtcbiAgICBjaGVjay5vcGVyYXRvcjtcbiAgcmV0dXJuIGV4aXN0Q21wKGRhdGEkMShlbGUsIGZpZWxkKSk7XG59O1xubWF0Y2hbVHlwZS5VTkRJUkVDVEVEX0VER0VdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIHFBID0gY2hlY2subm9kZXNbMF07XG4gIHZhciBxQiA9IGNoZWNrLm5vZGVzWzFdO1xuICB2YXIgc3JjID0gZWxlLnNvdXJjZSgpO1xuICB2YXIgdGd0ID0gZWxlLnRhcmdldCgpO1xuICByZXR1cm4gbWF0Y2hlcyQxKHFBLCBzcmMpICYmIG1hdGNoZXMkMShxQiwgdGd0KSB8fCBtYXRjaGVzJDEocUIsIHNyYykgJiYgbWF0Y2hlcyQxKHFBLCB0Z3QpO1xufTtcbm1hdGNoW1R5cGUuTk9ERV9ORUlHSEJPUl0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLm5vZGUsIGVsZSkgJiYgZWxlLm5laWdoYm9yaG9vZCgpLnNvbWUoZnVuY3Rpb24gKG4pIHtcbiAgICByZXR1cm4gbi5pc05vZGUoKSAmJiBtYXRjaGVzJDEoY2hlY2submVpZ2hib3IsIG4pO1xuICB9KTtcbn07XG5tYXRjaFtUeXBlLkRJUkVDVEVEX0VER0VdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgcmV0dXJuIG1hdGNoZXMkMShjaGVjay5zb3VyY2UsIGVsZS5zb3VyY2UoKSkgJiYgbWF0Y2hlcyQxKGNoZWNrLnRhcmdldCwgZWxlLnRhcmdldCgpKTtcbn07XG5tYXRjaFtUeXBlLk5PREVfU09VUkNFXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHJldHVybiBtYXRjaGVzJDEoY2hlY2suc291cmNlLCBlbGUpICYmIGVsZS5vdXRnb2VycygpLnNvbWUoZnVuY3Rpb24gKG4pIHtcbiAgICByZXR1cm4gbi5pc05vZGUoKSAmJiBtYXRjaGVzJDEoY2hlY2sudGFyZ2V0LCBuKTtcbiAgfSk7XG59O1xubWF0Y2hbVHlwZS5OT0RFX1RBUkdFVF0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLnRhcmdldCwgZWxlKSAmJiBlbGUuaW5jb21lcnMoKS5zb21lKGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuIG4uaXNOb2RlKCkgJiYgbWF0Y2hlcyQxKGNoZWNrLnNvdXJjZSwgbik7XG4gIH0pO1xufTtcbm1hdGNoW1R5cGUuQ0hJTERdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgcmV0dXJuIG1hdGNoZXMkMShjaGVjay5jaGlsZCwgZWxlKSAmJiBtYXRjaGVzJDEoY2hlY2sucGFyZW50LCBlbGUucGFyZW50KCkpO1xufTtcbm1hdGNoW1R5cGUuUEFSRU5UXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHJldHVybiBtYXRjaGVzJDEoY2hlY2sucGFyZW50LCBlbGUpICYmIGVsZS5jaGlsZHJlbigpLnNvbWUoZnVuY3Rpb24gKGMpIHtcbiAgICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLmNoaWxkLCBjKTtcbiAgfSk7XG59O1xubWF0Y2hbVHlwZS5ERVNDRU5EQU5UXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHJldHVybiBtYXRjaGVzJDEoY2hlY2suZGVzY2VuZGFudCwgZWxlKSAmJiBlbGUuYW5jZXN0b3JzKCkuc29tZShmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybiBtYXRjaGVzJDEoY2hlY2suYW5jZXN0b3IsIGEpO1xuICB9KTtcbn07XG5tYXRjaFtUeXBlLkFOQ0VTVE9SXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHJldHVybiBtYXRjaGVzJDEoY2hlY2suYW5jZXN0b3IsIGVsZSkgJiYgZWxlLmRlc2NlbmRhbnRzKCkuc29tZShmdW5jdGlvbiAoZCkge1xuICAgIHJldHVybiBtYXRjaGVzJDEoY2hlY2suZGVzY2VuZGFudCwgZCk7XG4gIH0pO1xufTtcbm1hdGNoW1R5cGUuQ09NUE9VTkRfU1BMSVRdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgcmV0dXJuIG1hdGNoZXMkMShjaGVjay5zdWJqZWN0LCBlbGUpICYmIG1hdGNoZXMkMShjaGVjay5sZWZ0LCBlbGUpICYmIG1hdGNoZXMkMShjaGVjay5yaWdodCwgZWxlKTtcbn07XG5tYXRjaFtUeXBlLlRSVUVdID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG5tYXRjaFtUeXBlLkNPTExFQ1RJT05dID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGNvbGxlY3Rpb24gPSBjaGVjay52YWx1ZTtcbiAgcmV0dXJuIGNvbGxlY3Rpb24uaGFzKGVsZSk7XG59O1xubWF0Y2hbVHlwZS5GSUxURVJdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGZpbHRlciA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gZmlsdGVyKGVsZSk7XG59O1xuXG4vLyBmaWx0ZXIgYW4gZXhpc3RpbmcgY29sbGVjdGlvblxudmFyIGZpbHRlciA9IGZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvLyBmb3IgMSBpZCAjZm9vIHF1ZXJpZXMsIGp1c3QgZ2V0IHRoZSBlbGVtZW50XG4gIGlmIChzZWxmLmxlbmd0aCA9PT0gMSAmJiBzZWxmWzBdLmNoZWNrcy5sZW5ndGggPT09IDEgJiYgc2VsZlswXS5jaGVja3NbMF0udHlwZSA9PT0gVHlwZS5JRCkge1xuICAgIHJldHVybiBjb2xsZWN0aW9uLmdldEVsZW1lbnRCeUlkKHNlbGZbMF0uY2hlY2tzWzBdLnZhbHVlKS5jb2xsZWN0aW9uKCk7XG4gIH1cbiAgdmFyIHNlbGVjdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiBzZWxlY3RvckZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNlbGYubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBxdWVyeSA9IHNlbGZbal07XG4gICAgICBpZiAobWF0Y2hlcyQxKHF1ZXJ5LCBlbGVtZW50KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuICBpZiAoc2VsZi50ZXh0KCkgPT0gbnVsbCkge1xuICAgIHNlbGVjdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiBzZWxlY3RvckZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gY29sbGVjdGlvbi5maWx0ZXIoc2VsZWN0b3JGdW5jdGlvbik7XG59OyAvLyBmaWx0ZXJcblxuLy8gZG9lcyBzZWxlY3RvciBtYXRjaCBhIHNpbmdsZSBlbGVtZW50P1xudmFyIG1hdGNoZXMgPSBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGZvciAodmFyIGogPSAwOyBqIDwgc2VsZi5sZW5ndGg7IGorKykge1xuICAgIHZhciBxdWVyeSA9IHNlbGZbal07XG4gICAgaWYgKG1hdGNoZXMkMShxdWVyeSwgZWxlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn07IC8vIG1hdGNoZXNcblxudmFyIG1hdGNoaW5nID0ge1xuICBtYXRjaGVzOiBtYXRjaGVzLFxuICBmaWx0ZXI6IGZpbHRlclxufTtcblxudmFyIFNlbGVjdG9yID0gZnVuY3Rpb24gU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgdGhpcy5pbnB1dFRleHQgPSBzZWxlY3RvcjtcbiAgdGhpcy5jdXJyZW50U3ViamVjdCA9IG51bGw7XG4gIHRoaXMuY29tcG91bmRDb3VudCA9IDA7XG4gIHRoaXMuZWRnZUNvdW50ID0gMDtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICBpZiAoc2VsZWN0b3IgPT0gbnVsbCB8fCBzdHJpbmcoc2VsZWN0b3IpICYmIHNlbGVjdG9yLm1hdGNoKC9eXFxzKiQvKSkgOyBlbHNlIGlmIChlbGVtZW50T3JDb2xsZWN0aW9uKHNlbGVjdG9yKSkge1xuICAgIHRoaXMuYWRkUXVlcnkoe1xuICAgICAgY2hlY2tzOiBbe1xuICAgICAgICB0eXBlOiBUeXBlLkNPTExFQ1RJT04sXG4gICAgICAgIHZhbHVlOiBzZWxlY3Rvci5jb2xsZWN0aW9uKClcbiAgICAgIH1dXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoZm4kNihzZWxlY3RvcikpIHtcbiAgICB0aGlzLmFkZFF1ZXJ5KHtcbiAgICAgIGNoZWNrczogW3tcbiAgICAgICAgdHlwZTogVHlwZS5GSUxURVIsXG4gICAgICAgIHZhbHVlOiBzZWxlY3RvclxuICAgICAgfV1cbiAgICB9KTtcbiAgfSBlbHNlIGlmIChzdHJpbmcoc2VsZWN0b3IpKSB7XG4gICAgaWYgKCF0aGlzLnBhcnNlKHNlbGVjdG9yKSkge1xuICAgICAgdGhpcy5pbnZhbGlkID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZXJyb3IoJ0Egc2VsZWN0b3IgbXVzdCBiZSBjcmVhdGVkIGZyb20gYSBzdHJpbmc7IGZvdW5kICcpO1xuICB9XG59O1xudmFyIHNlbGZuID0gU2VsZWN0b3IucHJvdG90eXBlO1xuW3BhcnNlJDEsIG1hdGNoaW5nXS5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gIHJldHVybiBleHRlbmQoc2VsZm4sIHApO1xufSk7XG5zZWxmbi50ZXh0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5pbnB1dFRleHQ7XG59O1xuc2VsZm4uc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubGVuZ3RoO1xufTtcbnNlbGZuLmVxID0gZnVuY3Rpb24gKGkpIHtcbiAgcmV0dXJuIHRoaXNbaV07XG59O1xuc2VsZm4uc2FtZVRleHQgPSBmdW5jdGlvbiAob3RoZXJTZWwpIHtcbiAgcmV0dXJuICF0aGlzLmludmFsaWQgJiYgIW90aGVyU2VsLmludmFsaWQgJiYgdGhpcy50ZXh0KCkgPT09IG90aGVyU2VsLnRleHQoKTtcbn07XG5zZWxmbi5hZGRRdWVyeSA9IGZ1bmN0aW9uIChxKSB7XG4gIHRoaXNbdGhpcy5sZW5ndGgrK10gPSBxO1xufTtcbnNlbGZuLnNlbGVjdG9yID0gc2VsZm4udG9TdHJpbmc7XG5cbnZhciBlbGVzZm4kZyA9IHtcbiAgYWxsQXJlOiBmdW5jdGlvbiBhbGxBcmUoc2VsZWN0b3IpIHtcbiAgICB2YXIgc2VsT2JqID0gbmV3IFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICByZXR1cm4gdGhpcy5ldmVyeShmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gc2VsT2JqLm1hdGNoZXMoZWxlKTtcbiAgICB9KTtcbiAgfSxcbiAgaXM6IGZ1bmN0aW9uIGlzKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNlbE9iaiA9IG5ldyBTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgcmV0dXJuIHRoaXMuc29tZShmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gc2VsT2JqLm1hdGNoZXMoZWxlKTtcbiAgICB9KTtcbiAgfSxcbiAgc29tZTogZnVuY3Rpb24gc29tZShmbiwgdGhpc0FyZykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJldCA9ICF0aGlzQXJnID8gZm4odGhpc1tpXSwgaSwgdGhpcykgOiBmbi5hcHBseSh0aGlzQXJnLCBbdGhpc1tpXSwgaSwgdGhpc10pO1xuICAgICAgaWYgKHJldCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBldmVyeTogZnVuY3Rpb24gZXZlcnkoZm4sIHRoaXNBcmcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByZXQgPSAhdGhpc0FyZyA/IGZuKHRoaXNbaV0sIGksIHRoaXMpIDogZm4uYXBwbHkodGhpc0FyZywgW3RoaXNbaV0sIGksIHRoaXNdKTtcbiAgICAgIGlmICghcmV0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIHNhbWU6IGZ1bmN0aW9uIHNhbWUoY29sbGVjdGlvbikge1xuICAgIC8vIGNoZWFwIGNvbGxlY3Rpb24gcmVmIGNoZWNrXG4gICAgaWYgKHRoaXMgPT09IGNvbGxlY3Rpb24pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb2xsZWN0aW9uID0gdGhpcy5jeSgpLmNvbGxlY3Rpb24oY29sbGVjdGlvbik7XG4gICAgdmFyIHRoaXNMZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICB2YXIgY29sbGVjdGlvbkxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoO1xuXG4gICAgLy8gY2hlYXAgbGVuZ3RoIGNoZWNrXG4gICAgaWYgKHRoaXNMZW5ndGggIT09IGNvbGxlY3Rpb25MZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBjaGVhcCBlbGVtZW50IHJlZiBjaGVja1xuICAgIGlmICh0aGlzTGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpc1swXSA9PT0gY29sbGVjdGlvblswXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXZlcnkoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uaGFzRWxlbWVudFdpdGhJZChlbGUuaWQoKSk7XG4gICAgfSk7XG4gIH0sXG4gIGFueVNhbWU6IGZ1bmN0aW9uIGFueVNhbWUoY29sbGVjdGlvbikge1xuICAgIGNvbGxlY3Rpb24gPSB0aGlzLmN5KCkuY29sbGVjdGlvbihjb2xsZWN0aW9uKTtcbiAgICByZXR1cm4gdGhpcy5zb21lKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uLmhhc0VsZW1lbnRXaXRoSWQoZWxlLmlkKCkpO1xuICAgIH0pO1xuICB9LFxuICBhbGxBcmVOZWlnaGJvcnM6IGZ1bmN0aW9uIGFsbEFyZU5laWdoYm9ycyhjb2xsZWN0aW9uKSB7XG4gICAgY29sbGVjdGlvbiA9IHRoaXMuY3koKS5jb2xsZWN0aW9uKGNvbGxlY3Rpb24pO1xuICAgIHZhciBuaG9vZCA9IHRoaXMubmVpZ2hib3Job29kKCk7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb24uZXZlcnkoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIG5ob29kLmhhc0VsZW1lbnRXaXRoSWQoZWxlLmlkKCkpO1xuICAgIH0pO1xuICB9LFxuICBjb250YWluczogZnVuY3Rpb24gY29udGFpbnMoY29sbGVjdGlvbikge1xuICAgIGNvbGxlY3Rpb24gPSB0aGlzLmN5KCkuY29sbGVjdGlvbihjb2xsZWN0aW9uKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb24uZXZlcnkoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIHNlbGYuaGFzRWxlbWVudFdpdGhJZChlbGUuaWQoKSk7XG4gICAgfSk7XG4gIH1cbn07XG5lbGVzZm4kZy5hbGxBcmVOZWlnaGJvdXJzID0gZWxlc2ZuJGcuYWxsQXJlTmVpZ2hib3JzO1xuZWxlc2ZuJGcuaGFzID0gZWxlc2ZuJGcuY29udGFpbnM7XG5lbGVzZm4kZy5lcXVhbCA9IGVsZXNmbiRnLmVxdWFscyA9IGVsZXNmbiRnLnNhbWU7XG5cbnZhciBjYWNoZSA9IGZ1bmN0aW9uIGNhY2hlKGZuLCBuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbiB0cmF2ZXJzYWxDYWNoZShhcmcxLCBhcmcyLCBhcmczLCBhcmc0KSB7XG4gICAgdmFyIHNlbGVjdG9yT3JFbGVzID0gYXJnMTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIGtleTtcbiAgICBpZiAoc2VsZWN0b3JPckVsZXMgPT0gbnVsbCkge1xuICAgICAga2V5ID0gJyc7XG4gICAgfSBlbHNlIGlmIChlbGVtZW50T3JDb2xsZWN0aW9uKHNlbGVjdG9yT3JFbGVzKSAmJiBzZWxlY3Rvck9yRWxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGtleSA9IHNlbGVjdG9yT3JFbGVzLmlkKCk7XG4gICAgfVxuICAgIGlmIChlbGVzLmxlbmd0aCA9PT0gMSAmJiBrZXkpIHtcbiAgICAgIHZhciBfcCA9IGVsZXNbMF0uX3ByaXZhdGU7XG4gICAgICB2YXIgdGNoID0gX3AudHJhdmVyc2FsQ2FjaGUgPSBfcC50cmF2ZXJzYWxDYWNoZSB8fCB7fTtcbiAgICAgIHZhciBjaCA9IHRjaFtuYW1lXSA9IHRjaFtuYW1lXSB8fCBbXTtcbiAgICAgIHZhciBoYXNoID0gaGFzaFN0cmluZyhrZXkpO1xuICAgICAgdmFyIGNhY2hlSGl0ID0gY2hbaGFzaF07XG4gICAgICBpZiAoY2FjaGVIaXQpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlSGl0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNoW2hhc2hdID0gZm4uY2FsbChlbGVzLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZuLmNhbGwoZWxlcywgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7XG4gICAgfVxuICB9O1xufTtcblxudmFyIGVsZXNmbiRmID0ge1xuICBwYXJlbnQ6IGZ1bmN0aW9uIHBhcmVudChzZWxlY3Rvcikge1xuICAgIHZhciBwYXJlbnRzID0gW107XG5cbiAgICAvLyBvcHRpbWlzYXRpb24gZm9yIHNpbmdsZSBlbGUgY2FsbFxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIHBhcmVudCA9IHRoaXNbMF0uX3ByaXZhdGUucGFyZW50O1xuICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgdmFyIF9wYXJlbnQgPSBlbGUuX3ByaXZhdGUucGFyZW50O1xuICAgICAgaWYgKF9wYXJlbnQpIHtcbiAgICAgICAgcGFyZW50cy5wdXNoKF9wYXJlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGF3bihwYXJlbnRzLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LFxuICBwYXJlbnRzOiBmdW5jdGlvbiBwYXJlbnRzKHNlbGVjdG9yKSB7XG4gICAgdmFyIHBhcmVudHMgPSBbXTtcbiAgICB2YXIgZWxlcyA9IHRoaXMucGFyZW50KCk7XG4gICAgd2hpbGUgKGVsZXMubm9uZW1wdHkoKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgICBwYXJlbnRzLnB1c2goZWxlKTtcbiAgICAgIH1cbiAgICAgIGVsZXMgPSBlbGVzLnBhcmVudCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGF3bihwYXJlbnRzLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LFxuICBjb21tb25BbmNlc3RvcnM6IGZ1bmN0aW9uIGNvbW1vbkFuY2VzdG9ycyhzZWxlY3Rvcikge1xuICAgIHZhciBhbmNlc3RvcnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIHZhciBwYXJlbnRzID0gZWxlLnBhcmVudHMoKTtcbiAgICAgIGFuY2VzdG9ycyA9IGFuY2VzdG9ycyB8fCBwYXJlbnRzO1xuICAgICAgYW5jZXN0b3JzID0gYW5jZXN0b3JzLmludGVyc2VjdChwYXJlbnRzKTsgLy8gY3VycmVudCBsaXN0IG11c3QgYmUgY29tbW9uIHdpdGggY3VycmVudCBlbGUgcGFyZW50cyBzZXRcbiAgICB9XG5cbiAgICByZXR1cm4gYW5jZXN0b3JzLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sXG4gIG9ycGhhbnM6IGZ1bmN0aW9uIG9ycGhhbnMoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5zdGRGaWx0ZXIoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc09ycGhhbigpO1xuICAgIH0pLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sXG4gIG5vbm9ycGhhbnM6IGZ1bmN0aW9uIG5vbm9ycGhhbnMoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5zdGRGaWx0ZXIoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc0NoaWxkKCk7XG4gICAgfSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgY2hpbGRyZW46IGNhY2hlKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHZhciBjaGlsZHJlbiA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICB2YXIgZWxlQ2hpbGRyZW4gPSBlbGUuX3ByaXZhdGUuY2hpbGRyZW47XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGVsZUNoaWxkcmVuLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goZWxlQ2hpbGRyZW5bal0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGF3bihjaGlsZHJlbiwgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSwgJ2NoaWxkcmVuJyksXG4gIHNpYmxpbmdzOiBmdW5jdGlvbiBzaWJsaW5ncyhzZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLnBhcmVudCgpLmNoaWxkcmVuKCkubm90KHRoaXMpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sXG4gIGlzUGFyZW50OiBmdW5jdGlvbiBpc1BhcmVudCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzTm9kZSgpICYmIGVsZS5fcHJpdmF0ZS5jaGlsZHJlbi5sZW5ndGggIT09IDA7XG4gICAgfVxuICB9LFxuICBpc0NoaWxkbGVzczogZnVuY3Rpb24gaXNDaGlsZGxlc3MoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc05vZGUoKSAmJiBlbGUuX3ByaXZhdGUuY2hpbGRyZW4ubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgfSxcbiAgaXNDaGlsZDogZnVuY3Rpb24gaXNDaGlsZCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzTm9kZSgpICYmIGVsZS5fcHJpdmF0ZS5wYXJlbnQgIT0gbnVsbDtcbiAgICB9XG4gIH0sXG4gIGlzT3JwaGFuOiBmdW5jdGlvbiBpc09ycGhhbigpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzTm9kZSgpICYmIGVsZS5fcHJpdmF0ZS5wYXJlbnQgPT0gbnVsbDtcbiAgICB9XG4gIH0sXG4gIGRlc2NlbmRhbnRzOiBmdW5jdGlvbiBkZXNjZW5kYW50cyhzZWxlY3Rvcikge1xuICAgIHZhciBlbGVtZW50cyA9IFtdO1xuICAgIGZ1bmN0aW9uIGFkZChlbGVzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgIGVsZW1lbnRzLnB1c2goZWxlKTtcbiAgICAgICAgaWYgKGVsZS5jaGlsZHJlbigpLm5vbmVtcHR5KCkpIHtcbiAgICAgICAgICBhZGQoZWxlLmNoaWxkcmVuKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGFkZCh0aGlzLmNoaWxkcmVuKCkpO1xuICAgIHJldHVybiB0aGlzLnNwYXduKGVsZW1lbnRzLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9XG59O1xuZnVuY3Rpb24gZm9yRWFjaENvbXBvdW5kKGVsZXMsIGZuLCBpbmNsdWRlU2VsZiwgcmVjdXJzaXZlU3RlcCkge1xuICB2YXIgcSA9IFtdO1xuICB2YXIgZGlkID0gbmV3IFNldCQxKCk7XG4gIHZhciBjeSA9IGVsZXMuY3koKTtcbiAgdmFyIGhhc0NvbXBvdW5kcyA9IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgaWYgKGluY2x1ZGVTZWxmKSB7XG4gICAgICBxLnB1c2goZWxlKTtcbiAgICB9IGVsc2UgaWYgKGhhc0NvbXBvdW5kcykge1xuICAgICAgcmVjdXJzaXZlU3RlcChxLCBkaWQsIGVsZSk7XG4gICAgfVxuICB9XG4gIHdoaWxlIChxLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgX2VsZSA9IHEuc2hpZnQoKTtcbiAgICBmbihfZWxlKTtcbiAgICBkaWQuYWRkKF9lbGUuaWQoKSk7XG4gICAgaWYgKGhhc0NvbXBvdW5kcykge1xuICAgICAgcmVjdXJzaXZlU3RlcChxLCBkaWQsIF9lbGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZWxlcztcbn1cbmZ1bmN0aW9uIGFkZENoaWxkcmVuKHEsIGRpZCwgZWxlKSB7XG4gIGlmIChlbGUuaXNQYXJlbnQoKSkge1xuICAgIHZhciBjaGlsZHJlbiA9IGVsZS5fcHJpdmF0ZS5jaGlsZHJlbjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIGlmICghZGlkLmhhcyhjaGlsZC5pZCgpKSkge1xuICAgICAgICBxLnB1c2goY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyB2ZXJ5IGVmZmljaWVudCB2ZXJzaW9uIG9mIGVsZXMuYWRkKCBlbGVzLmRlc2NlbmRhbnRzKCkgKS5mb3JFYWNoKClcbi8vIGZvciBpbnRlcm5hbCB1c2VcbmVsZXNmbiRmLmZvckVhY2hEb3duID0gZnVuY3Rpb24gKGZuKSB7XG4gIHZhciBpbmNsdWRlU2VsZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgcmV0dXJuIGZvckVhY2hDb21wb3VuZCh0aGlzLCBmbiwgaW5jbHVkZVNlbGYsIGFkZENoaWxkcmVuKTtcbn07XG5mdW5jdGlvbiBhZGRQYXJlbnQocSwgZGlkLCBlbGUpIHtcbiAgaWYgKGVsZS5pc0NoaWxkKCkpIHtcbiAgICB2YXIgcGFyZW50ID0gZWxlLl9wcml2YXRlLnBhcmVudDtcbiAgICBpZiAoIWRpZC5oYXMocGFyZW50LmlkKCkpKSB7XG4gICAgICBxLnB1c2gocGFyZW50KTtcbiAgICB9XG4gIH1cbn1cbmVsZXNmbiRmLmZvckVhY2hVcCA9IGZ1bmN0aW9uIChmbikge1xuICB2YXIgaW5jbHVkZVNlbGYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gIHJldHVybiBmb3JFYWNoQ29tcG91bmQodGhpcywgZm4sIGluY2x1ZGVTZWxmLCBhZGRQYXJlbnQpO1xufTtcbmZ1bmN0aW9uIGFkZFBhcmVudEFuZENoaWxkcmVuKHEsIGRpZCwgZWxlKSB7XG4gIGFkZFBhcmVudChxLCBkaWQsIGVsZSk7XG4gIGFkZENoaWxkcmVuKHEsIGRpZCwgZWxlKTtcbn1cbmVsZXNmbiRmLmZvckVhY2hVcEFuZERvd24gPSBmdW5jdGlvbiAoZm4pIHtcbiAgdmFyIGluY2x1ZGVTZWxmID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICByZXR1cm4gZm9yRWFjaENvbXBvdW5kKHRoaXMsIGZuLCBpbmNsdWRlU2VsZiwgYWRkUGFyZW50QW5kQ2hpbGRyZW4pO1xufTtcblxuLy8gYWxpYXNlc1xuZWxlc2ZuJGYuYW5jZXN0b3JzID0gZWxlc2ZuJGYucGFyZW50cztcblxudmFyIGZuJDUsIGVsZXNmbiRlO1xuZm4kNSA9IGVsZXNmbiRlID0ge1xuICBkYXRhOiBkZWZpbmUuZGF0YSh7XG4gICAgZmllbGQ6ICdkYXRhJyxcbiAgICBiaW5kaW5nRXZlbnQ6ICdkYXRhJyxcbiAgICBhbGxvd0JpbmRpbmc6IHRydWUsXG4gICAgYWxsb3dTZXR0aW5nOiB0cnVlLFxuICAgIHNldHRpbmdFdmVudDogJ2RhdGEnLFxuICAgIHNldHRpbmdUcmlnZ2Vyc0V2ZW50OiB0cnVlLFxuICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICBhbGxvd0dldHRpbmc6IHRydWUsXG4gICAgaW1tdXRhYmxlS2V5czoge1xuICAgICAgJ2lkJzogdHJ1ZSxcbiAgICAgICdzb3VyY2UnOiB0cnVlLFxuICAgICAgJ3RhcmdldCc6IHRydWUsXG4gICAgICAncGFyZW50JzogdHJ1ZVxuICAgIH0sXG4gICAgdXBkYXRlU3R5bGU6IHRydWVcbiAgfSksXG4gIHJlbW92ZURhdGE6IGRlZmluZS5yZW1vdmVEYXRhKHtcbiAgICBmaWVsZDogJ2RhdGEnLFxuICAgIGV2ZW50OiAnZGF0YScsXG4gICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgIHRyaWdnZXJFdmVudDogdHJ1ZSxcbiAgICBpbW11dGFibGVLZXlzOiB7XG4gICAgICAnaWQnOiB0cnVlLFxuICAgICAgJ3NvdXJjZSc6IHRydWUsXG4gICAgICAndGFyZ2V0JzogdHJ1ZSxcbiAgICAgICdwYXJlbnQnOiB0cnVlXG4gICAgfSxcbiAgICB1cGRhdGVTdHlsZTogdHJ1ZVxuICB9KSxcbiAgc2NyYXRjaDogZGVmaW5lLmRhdGEoe1xuICAgIGZpZWxkOiAnc2NyYXRjaCcsXG4gICAgYmluZGluZ0V2ZW50OiAnc2NyYXRjaCcsXG4gICAgYWxsb3dCaW5kaW5nOiB0cnVlLFxuICAgIGFsbG93U2V0dGluZzogdHJ1ZSxcbiAgICBzZXR0aW5nRXZlbnQ6ICdzY3JhdGNoJyxcbiAgICBzZXR0aW5nVHJpZ2dlcnNFdmVudDogdHJ1ZSxcbiAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgYWxsb3dHZXR0aW5nOiB0cnVlLFxuICAgIHVwZGF0ZVN0eWxlOiB0cnVlXG4gIH0pLFxuICByZW1vdmVTY3JhdGNoOiBkZWZpbmUucmVtb3ZlRGF0YSh7XG4gICAgZmllbGQ6ICdzY3JhdGNoJyxcbiAgICBldmVudDogJ3NjcmF0Y2gnLFxuICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICB0cmlnZ2VyRXZlbnQ6IHRydWUsXG4gICAgdXBkYXRlU3R5bGU6IHRydWVcbiAgfSksXG4gIHJzY3JhdGNoOiBkZWZpbmUuZGF0YSh7XG4gICAgZmllbGQ6ICdyc2NyYXRjaCcsXG4gICAgYWxsb3dCaW5kaW5nOiBmYWxzZSxcbiAgICBhbGxvd1NldHRpbmc6IHRydWUsXG4gICAgc2V0dGluZ1RyaWdnZXJzRXZlbnQ6IGZhbHNlLFxuICAgIGFsbG93R2V0dGluZzogdHJ1ZVxuICB9KSxcbiAgcmVtb3ZlUnNjcmF0Y2g6IGRlZmluZS5yZW1vdmVEYXRhKHtcbiAgICBmaWVsZDogJ3JzY3JhdGNoJyxcbiAgICB0cmlnZ2VyRXZlbnQ6IGZhbHNlXG4gIH0pLFxuICBpZDogZnVuY3Rpb24gaWQoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5kYXRhLmlkO1xuICAgIH1cbiAgfVxufTtcblxuLy8gYWxpYXNlc1xuZm4kNS5hdHRyID0gZm4kNS5kYXRhO1xuZm4kNS5yZW1vdmVBdHRyID0gZm4kNS5yZW1vdmVEYXRhO1xudmFyIGRhdGEgPSBlbGVzZm4kZTtcblxudmFyIGVsZXNmbiRkID0ge307XG5mdW5jdGlvbiBkZWZpbmVEZWdyZWVGdW5jdGlvbihjYWxsYmFjaykge1xuICByZXR1cm4gZnVuY3Rpb24gKGluY2x1ZGVMb29wcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoaW5jbHVkZUxvb3BzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGluY2x1ZGVMb29wcyA9IHRydWU7XG4gICAgfVxuICAgIGlmIChzZWxmLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2VsZi5pc05vZGUoKSAmJiAhc2VsZi5yZW1vdmVkKCkpIHtcbiAgICAgIHZhciBkZWdyZWUgPSAwO1xuICAgICAgdmFyIG5vZGUgPSBzZWxmWzBdO1xuICAgICAgdmFyIGNvbm5lY3RlZEVkZ2VzID0gbm9kZS5fcHJpdmF0ZS5lZGdlcztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGVkRWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBjb25uZWN0ZWRFZGdlc1tpXTtcbiAgICAgICAgaWYgKCFpbmNsdWRlTG9vcHMgJiYgZWRnZS5pc0xvb3AoKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGRlZ3JlZSArPSBjYWxsYmFjayhub2RlLCBlZGdlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWdyZWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH07XG59XG5leHRlbmQoZWxlc2ZuJGQsIHtcbiAgZGVncmVlOiBkZWZpbmVEZWdyZWVGdW5jdGlvbihmdW5jdGlvbiAobm9kZSwgZWRnZSkge1xuICAgIGlmIChlZGdlLnNvdXJjZSgpLnNhbWUoZWRnZS50YXJnZXQoKSkpIHtcbiAgICAgIHJldHVybiAyO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH0pLFxuICBpbmRlZ3JlZTogZGVmaW5lRGVncmVlRnVuY3Rpb24oZnVuY3Rpb24gKG5vZGUsIGVkZ2UpIHtcbiAgICBpZiAoZWRnZS50YXJnZXQoKS5zYW1lKG5vZGUpKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9KSxcbiAgb3V0ZGVncmVlOiBkZWZpbmVEZWdyZWVGdW5jdGlvbihmdW5jdGlvbiAobm9kZSwgZWRnZSkge1xuICAgIGlmIChlZGdlLnNvdXJjZSgpLnNhbWUobm9kZSkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH0pXG59KTtcbmZ1bmN0aW9uIGRlZmluZURlZ3JlZUJvdW5kc0Z1bmN0aW9uKGRlZ3JlZUZuLCBjYWxsYmFjaykge1xuICByZXR1cm4gZnVuY3Rpb24gKGluY2x1ZGVMb29wcykge1xuICAgIHZhciByZXQ7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBub2Rlc1tpXTtcbiAgICAgIHZhciBkZWdyZWUgPSBlbGVbZGVncmVlRm5dKGluY2x1ZGVMb29wcyk7XG4gICAgICBpZiAoZGVncmVlICE9PSB1bmRlZmluZWQgJiYgKHJldCA9PT0gdW5kZWZpbmVkIHx8IGNhbGxiYWNrKGRlZ3JlZSwgcmV0KSkpIHtcbiAgICAgICAgcmV0ID0gZGVncmVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9O1xufVxuZXh0ZW5kKGVsZXNmbiRkLCB7XG4gIG1pbkRlZ3JlZTogZGVmaW5lRGVncmVlQm91bmRzRnVuY3Rpb24oJ2RlZ3JlZScsIGZ1bmN0aW9uIChkZWdyZWUsIG1pbikge1xuICAgIHJldHVybiBkZWdyZWUgPCBtaW47XG4gIH0pLFxuICBtYXhEZWdyZWU6IGRlZmluZURlZ3JlZUJvdW5kc0Z1bmN0aW9uKCdkZWdyZWUnLCBmdW5jdGlvbiAoZGVncmVlLCBtYXgpIHtcbiAgICByZXR1cm4gZGVncmVlID4gbWF4O1xuICB9KSxcbiAgbWluSW5kZWdyZWU6IGRlZmluZURlZ3JlZUJvdW5kc0Z1bmN0aW9uKCdpbmRlZ3JlZScsIGZ1bmN0aW9uIChkZWdyZWUsIG1pbikge1xuICAgIHJldHVybiBkZWdyZWUgPCBtaW47XG4gIH0pLFxuICBtYXhJbmRlZ3JlZTogZGVmaW5lRGVncmVlQm91bmRzRnVuY3Rpb24oJ2luZGVncmVlJywgZnVuY3Rpb24gKGRlZ3JlZSwgbWF4KSB7XG4gICAgcmV0dXJuIGRlZ3JlZSA+IG1heDtcbiAgfSksXG4gIG1pbk91dGRlZ3JlZTogZGVmaW5lRGVncmVlQm91bmRzRnVuY3Rpb24oJ291dGRlZ3JlZScsIGZ1bmN0aW9uIChkZWdyZWUsIG1pbikge1xuICAgIHJldHVybiBkZWdyZWUgPCBtaW47XG4gIH0pLFxuICBtYXhPdXRkZWdyZWU6IGRlZmluZURlZ3JlZUJvdW5kc0Z1bmN0aW9uKCdvdXRkZWdyZWUnLCBmdW5jdGlvbiAoZGVncmVlLCBtYXgpIHtcbiAgICByZXR1cm4gZGVncmVlID4gbWF4O1xuICB9KVxufSk7XG5leHRlbmQoZWxlc2ZuJGQsIHtcbiAgdG90YWxEZWdyZWU6IGZ1bmN0aW9uIHRvdGFsRGVncmVlKGluY2x1ZGVMb29wcykge1xuICAgIHZhciB0b3RhbCA9IDA7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRvdGFsICs9IG5vZGVzW2ldLmRlZ3JlZShpbmNsdWRlTG9vcHMpO1xuICAgIH1cbiAgICByZXR1cm4gdG90YWw7XG4gIH1cbn0pO1xuXG52YXIgZm4kNCwgZWxlc2ZuJGM7XG52YXIgYmVmb3JlUG9zaXRpb25TZXQgPSBmdW5jdGlvbiBiZWZvcmVQb3NpdGlvblNldChlbGVzLCBuZXdQb3MsIHNpbGVudCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICBpZiAoIWVsZS5sb2NrZWQoKSkge1xuICAgICAgdmFyIG9sZFBvcyA9IGVsZS5fcHJpdmF0ZS5wb3NpdGlvbjtcbiAgICAgIHZhciBkZWx0YSA9IHtcbiAgICAgICAgeDogbmV3UG9zLnggIT0gbnVsbCA/IG5ld1Bvcy54IC0gb2xkUG9zLnggOiAwLFxuICAgICAgICB5OiBuZXdQb3MueSAhPSBudWxsID8gbmV3UG9zLnkgLSBvbGRQb3MueSA6IDBcbiAgICAgIH07XG4gICAgICBpZiAoZWxlLmlzUGFyZW50KCkgJiYgIShkZWx0YS54ID09PSAwICYmIGRlbHRhLnkgPT09IDApKSB7XG4gICAgICAgIGVsZS5jaGlsZHJlbigpLnNoaWZ0KGRlbHRhLCBzaWxlbnQpO1xuICAgICAgfVxuICAgICAgZWxlLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpO1xuICAgIH1cbiAgfVxufTtcbnZhciBwb3NpdGlvbkRlZiA9IHtcbiAgZmllbGQ6ICdwb3NpdGlvbicsXG4gIGJpbmRpbmdFdmVudDogJ3Bvc2l0aW9uJyxcbiAgYWxsb3dCaW5kaW5nOiB0cnVlLFxuICBhbGxvd1NldHRpbmc6IHRydWUsXG4gIHNldHRpbmdFdmVudDogJ3Bvc2l0aW9uJyxcbiAgc2V0dGluZ1RyaWdnZXJzRXZlbnQ6IHRydWUsXG4gIHRyaWdnZXJGbk5hbWU6ICdlbWl0QW5kTm90aWZ5JyxcbiAgYWxsb3dHZXR0aW5nOiB0cnVlLFxuICB2YWxpZEtleXM6IFsneCcsICd5J10sXG4gIGJlZm9yZUdldDogZnVuY3Rpb24gYmVmb3JlR2V0KGVsZSkge1xuICAgIGVsZS51cGRhdGVDb21wb3VuZEJvdW5kcygpO1xuICB9LFxuICBiZWZvcmVTZXQ6IGZ1bmN0aW9uIGJlZm9yZVNldChlbGVzLCBuZXdQb3MpIHtcbiAgICBiZWZvcmVQb3NpdGlvblNldChlbGVzLCBuZXdQb3MsIGZhbHNlKTtcbiAgfSxcbiAgb25TZXQ6IGZ1bmN0aW9uIG9uU2V0KGVsZXMpIHtcbiAgICBlbGVzLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpO1xuICB9LFxuICBjYW5TZXQ6IGZ1bmN0aW9uIGNhblNldChlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5sb2NrZWQoKTtcbiAgfVxufTtcbmZuJDQgPSBlbGVzZm4kYyA9IHtcbiAgcG9zaXRpb246IGRlZmluZS5kYXRhKHBvc2l0aW9uRGVmKSxcbiAgLy8gcG9zaXRpb24gYnV0IG5vIG5vdGlmaWNhdGlvbiB0byByZW5kZXJlclxuICBzaWxlbnRQb3NpdGlvbjogZGVmaW5lLmRhdGEoZXh0ZW5kKHt9LCBwb3NpdGlvbkRlZiwge1xuICAgIGFsbG93QmluZGluZzogZmFsc2UsXG4gICAgYWxsb3dTZXR0aW5nOiB0cnVlLFxuICAgIHNldHRpbmdUcmlnZ2Vyc0V2ZW50OiBmYWxzZSxcbiAgICBhbGxvd0dldHRpbmc6IGZhbHNlLFxuICAgIGJlZm9yZVNldDogZnVuY3Rpb24gYmVmb3JlU2V0KGVsZXMsIG5ld1Bvcykge1xuICAgICAgYmVmb3JlUG9zaXRpb25TZXQoZWxlcywgbmV3UG9zLCB0cnVlKTtcbiAgICB9LFxuICAgIG9uU2V0OiBmdW5jdGlvbiBvblNldChlbGVzKSB7XG4gICAgICBlbGVzLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpO1xuICAgIH1cbiAgfSkpLFxuICBwb3NpdGlvbnM6IGZ1bmN0aW9uIHBvc2l0aW9ucyhwb3MsIHNpbGVudCkge1xuICAgIGlmIChwbGFpbk9iamVjdChwb3MpKSB7XG4gICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgIHRoaXMuc2lsZW50UG9zaXRpb24ocG9zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucG9zaXRpb24ocG9zKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZuJDYocG9zKSkge1xuICAgICAgdmFyIF9mbiA9IHBvcztcbiAgICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICAgIGN5LnN0YXJ0QmF0Y2goKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgICAgdmFyIF9wb3MgPSB2b2lkIDA7XG4gICAgICAgIGlmIChfcG9zID0gX2ZuKGVsZSwgaSkpIHtcbiAgICAgICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgICAgICBlbGUuc2lsZW50UG9zaXRpb24oX3Bvcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsZS5wb3NpdGlvbihfcG9zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN5LmVuZEJhdGNoKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIHNpbGVudFBvc2l0aW9uczogZnVuY3Rpb24gc2lsZW50UG9zaXRpb25zKHBvcykge1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9ucyhwb3MsIHRydWUpO1xuICB9LFxuICBzaGlmdDogZnVuY3Rpb24gc2hpZnQoZGltLCB2YWwsIHNpbGVudCkge1xuICAgIHZhciBkZWx0YTtcbiAgICBpZiAocGxhaW5PYmplY3QoZGltKSkge1xuICAgICAgZGVsdGEgPSB7XG4gICAgICAgIHg6IG51bWJlciQxKGRpbS54KSA/IGRpbS54IDogMCxcbiAgICAgICAgeTogbnVtYmVyJDEoZGltLnkpID8gZGltLnkgOiAwXG4gICAgICB9O1xuICAgICAgc2lsZW50ID0gdmFsO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nKGRpbSkgJiYgbnVtYmVyJDEodmFsKSkge1xuICAgICAgZGVsdGEgPSB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDBcbiAgICAgIH07XG4gICAgICBkZWx0YVtkaW1dID0gdmFsO1xuICAgIH1cbiAgICBpZiAoZGVsdGEgIT0gbnVsbCkge1xuICAgICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgICAgY3kuc3RhcnRCYXRjaCgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuXG4gICAgICAgIC8vIGV4Y2x1ZGUgYW55IG5vZGUgdGhhdCBpcyBhIGRlc2NlbmRhbnQgb2YgdGhlIGNhbGxpbmcgY29sbGVjdGlvblxuICAgICAgICBpZiAoY3kuaGFzQ29tcG91bmROb2RlcygpICYmIGVsZS5pc0NoaWxkKCkgJiYgZWxlLmFuY2VzdG9ycygpLmFueVNhbWUodGhpcykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcG9zID0gZWxlLnBvc2l0aW9uKCk7XG4gICAgICAgIHZhciBuZXdQb3MgPSB7XG4gICAgICAgICAgeDogcG9zLnggKyBkZWx0YS54LFxuICAgICAgICAgIHk6IHBvcy55ICsgZGVsdGEueVxuICAgICAgICB9O1xuICAgICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgICAgZWxlLnNpbGVudFBvc2l0aW9uKG5ld1Bvcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlLnBvc2l0aW9uKG5ld1Bvcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN5LmVuZEJhdGNoKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBzaWxlbnRTaGlmdDogZnVuY3Rpb24gc2lsZW50U2hpZnQoZGltLCB2YWwpIHtcbiAgICBpZiAocGxhaW5PYmplY3QoZGltKSkge1xuICAgICAgdGhpcy5zaGlmdChkaW0sIHRydWUpO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nKGRpbSkgJiYgbnVtYmVyJDEodmFsKSkge1xuICAgICAgdGhpcy5zaGlmdChkaW0sIHZhbCwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICAvLyBnZXQvc2V0IHRoZSByZW5kZXJlZCAoaS5lLiBvbiBzY3JlZW4pIHBvc2l0b24gb2YgdGhlIGVsZW1lbnRcbiAgcmVuZGVyZWRQb3NpdGlvbjogZnVuY3Rpb24gcmVuZGVyZWRQb3NpdGlvbihkaW0sIHZhbCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgdmFyIHJwb3MgPSBwbGFpbk9iamVjdChkaW0pID8gZGltIDogdW5kZWZpbmVkO1xuICAgIHZhciBzZXR0aW5nID0gcnBvcyAhPT0gdW5kZWZpbmVkIHx8IHZhbCAhPT0gdW5kZWZpbmVkICYmIHN0cmluZyhkaW0pO1xuICAgIGlmIChlbGUgJiYgZWxlLmlzTm9kZSgpKSB7XG4gICAgICAvLyBtdXN0IGhhdmUgYW4gZWxlbWVudCBhbmQgbXVzdCBiZSBhIG5vZGUgdG8gcmV0dXJuIHBvc2l0aW9uXG4gICAgICBpZiAoc2V0dGluZykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgX2VsZSA9IHRoaXNbaV07XG4gICAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBzZXQgb25lIGRpbWVuc2lvblxuICAgICAgICAgICAgX2VsZS5wb3NpdGlvbihkaW0sICh2YWwgLSBwYW5bZGltXSkgLyB6b29tKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJwb3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gc2V0IHdob2xlIHBvc2l0aW9uXG4gICAgICAgICAgICBfZWxlLnBvc2l0aW9uKHJlbmRlcmVkVG9Nb2RlbFBvc2l0aW9uKHJwb3MsIHpvb20sIHBhbikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZ2V0dGluZ1xuICAgICAgICB2YXIgcG9zID0gZWxlLnBvc2l0aW9uKCk7XG4gICAgICAgIHJwb3MgPSBtb2RlbFRvUmVuZGVyZWRQb3NpdGlvbihwb3MsIHpvb20sIHBhbik7XG4gICAgICAgIGlmIChkaW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSB3aG9sZSByZW5kZXJlZCBwb3NpdGlvblxuICAgICAgICAgIHJldHVybiBycG9zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSBzcGVjaWZpZWQgZGltZW5zaW9uXG4gICAgICAgICAgcmV0dXJuIHJwb3NbZGltXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXNldHRpbmcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIGZvciBlbXB0eSBjb2xsZWN0aW9uIGNhc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICAvLyBnZXQvc2V0IHRoZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgcGFyZW50XG4gIHJlbGF0aXZlUG9zaXRpb246IGZ1bmN0aW9uIHJlbGF0aXZlUG9zaXRpb24oZGltLCB2YWwpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIHBwb3MgPSBwbGFpbk9iamVjdChkaW0pID8gZGltIDogdW5kZWZpbmVkO1xuICAgIHZhciBzZXR0aW5nID0gcHBvcyAhPT0gdW5kZWZpbmVkIHx8IHZhbCAhPT0gdW5kZWZpbmVkICYmIHN0cmluZyhkaW0pO1xuICAgIHZhciBoYXNDb21wb3VuZE5vZGVzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICAgIGlmIChlbGUgJiYgZWxlLmlzTm9kZSgpKSB7XG4gICAgICAvLyBtdXN0IGhhdmUgYW4gZWxlbWVudCBhbmQgbXVzdCBiZSBhIG5vZGUgdG8gcmV0dXJuIHBvc2l0aW9uXG4gICAgICBpZiAoc2V0dGluZykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgX2VsZTIgPSB0aGlzW2ldO1xuICAgICAgICAgIHZhciBwYXJlbnQgPSBoYXNDb21wb3VuZE5vZGVzID8gX2VsZTIucGFyZW50KCkgOiBudWxsO1xuICAgICAgICAgIHZhciBoYXNQYXJlbnQgPSBwYXJlbnQgJiYgcGFyZW50Lmxlbmd0aCA+IDA7XG4gICAgICAgICAgdmFyIHJlbGF0aXZlVG9QYXJlbnQgPSBoYXNQYXJlbnQ7XG4gICAgICAgICAgaWYgKGhhc1BhcmVudCkge1xuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50WzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgb3JpZ2luID0gcmVsYXRpdmVUb1BhcmVudCA/IHBhcmVudC5wb3NpdGlvbigpIDoge1xuICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgIHk6IDBcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gc2V0IG9uZSBkaW1lbnNpb25cbiAgICAgICAgICAgIF9lbGUyLnBvc2l0aW9uKGRpbSwgdmFsICsgb3JpZ2luW2RpbV0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHBvcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBzZXQgd2hvbGUgcG9zaXRpb25cbiAgICAgICAgICAgIF9lbGUyLnBvc2l0aW9uKHtcbiAgICAgICAgICAgICAgeDogcHBvcy54ICsgb3JpZ2luLngsXG4gICAgICAgICAgICAgIHk6IHBwb3MueSArIG9yaWdpbi55XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGdldHRpbmdcbiAgICAgICAgdmFyIHBvcyA9IGVsZS5wb3NpdGlvbigpO1xuICAgICAgICB2YXIgX3BhcmVudCA9IGhhc0NvbXBvdW5kTm9kZXMgPyBlbGUucGFyZW50KCkgOiBudWxsO1xuICAgICAgICB2YXIgX2hhc1BhcmVudCA9IF9wYXJlbnQgJiYgX3BhcmVudC5sZW5ndGggPiAwO1xuICAgICAgICB2YXIgX3JlbGF0aXZlVG9QYXJlbnQgPSBfaGFzUGFyZW50O1xuICAgICAgICBpZiAoX2hhc1BhcmVudCkge1xuICAgICAgICAgIF9wYXJlbnQgPSBfcGFyZW50WzBdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfb3JpZ2luID0gX3JlbGF0aXZlVG9QYXJlbnQgPyBfcGFyZW50LnBvc2l0aW9uKCkgOiB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH07XG4gICAgICAgIHBwb3MgPSB7XG4gICAgICAgICAgeDogcG9zLnggLSBfb3JpZ2luLngsXG4gICAgICAgICAgeTogcG9zLnkgLSBfb3JpZ2luLnlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGRpbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gdGhlbiByZXR1cm4gdGhlIHdob2xlIHJlbmRlcmVkIHBvc2l0aW9uXG4gICAgICAgICAgcmV0dXJuIHBwb3M7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdGhlbiByZXR1cm4gdGhlIHNwZWNpZmllZCBkaW1lbnNpb25cbiAgICAgICAgICByZXR1cm4gcHBvc1tkaW1dO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghc2V0dGluZykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gZm9yIGVtcHR5IGNvbGxlY3Rpb24gY2FzZVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9XG59O1xuXG4vLyBhbGlhc2VzXG5mbiQ0Lm1vZGVsUG9zaXRpb24gPSBmbiQ0LnBvaW50ID0gZm4kNC5wb3NpdGlvbjtcbmZuJDQubW9kZWxQb3NpdGlvbnMgPSBmbiQ0LnBvaW50cyA9IGZuJDQucG9zaXRpb25zO1xuZm4kNC5yZW5kZXJlZFBvaW50ID0gZm4kNC5yZW5kZXJlZFBvc2l0aW9uO1xuZm4kNC5yZWxhdGl2ZVBvaW50ID0gZm4kNC5yZWxhdGl2ZVBvc2l0aW9uO1xudmFyIHBvc2l0aW9uID0gZWxlc2ZuJGM7XG5cbnZhciBmbiQzLCBlbGVzZm4kYjtcbmZuJDMgPSBlbGVzZm4kYiA9IHt9O1xuZWxlc2ZuJGIucmVuZGVyZWRCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBiYiA9IHRoaXMuYm91bmRpbmdCb3gob3B0aW9ucyk7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgdmFyIHgxID0gYmIueDEgKiB6b29tICsgcGFuLng7XG4gIHZhciB4MiA9IGJiLngyICogem9vbSArIHBhbi54O1xuICB2YXIgeTEgPSBiYi55MSAqIHpvb20gKyBwYW4ueTtcbiAgdmFyIHkyID0gYmIueTIgKiB6b29tICsgcGFuLnk7XG4gIHJldHVybiB7XG4gICAgeDE6IHgxLFxuICAgIHgyOiB4MixcbiAgICB5MTogeTEsXG4gICAgeTI6IHkyLFxuICAgIHc6IHgyIC0geDEsXG4gICAgaDogeTIgLSB5MVxuICB9O1xufTtcbmVsZXNmbiRiLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNpbGVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSB8fCAhY3kuaGFzQ29tcG91bmROb2RlcygpKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdGhpcy5mb3JFYWNoVXAoZnVuY3Rpb24gKGVsZSkge1xuICAgIGlmIChlbGUuaXNQYXJlbnQoKSkge1xuICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgICAgX3AuY29tcG91bmRCb3VuZHNDbGVhbiA9IGZhbHNlO1xuICAgICAgX3AuYmJDYWNoZSA9IG51bGw7XG4gICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICBlbGUuZW1pdEFuZE5vdGlmeSgnYm91bmRzJyk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuZWxlc2ZuJGIudXBkYXRlQ29tcG91bmRCb3VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBmb3JjZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcblxuICAvLyBub3QgcG9zc2libGUgdG8gZG8gb24gbm9uLWNvbXBvdW5kIGdyYXBocyBvciB3aXRoIHRoZSBzdHlsZSBkaXNhYmxlZFxuICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpIHx8ICFjeS5oYXNDb21wb3VuZE5vZGVzKCkpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNhdmUgY3ljbGVzIHdoZW4gYmF0Y2hpbmcgLS0gYnV0IGJvdW5kcyB3aWxsIGJlIHN0YWxlIChvciBub3QgZXhpc3QgeWV0KVxuICBpZiAoIWZvcmNlICYmIGN5LmJhdGNoaW5nKCkpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBmdW5jdGlvbiB1cGRhdGUocGFyZW50KSB7XG4gICAgaWYgKCFwYXJlbnQuaXNQYXJlbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgX3AgPSBwYXJlbnQuX3ByaXZhdGU7XG4gICAgdmFyIGNoaWxkcmVuID0gcGFyZW50LmNoaWxkcmVuKCk7XG4gICAgdmFyIGluY2x1ZGVMYWJlbHMgPSBwYXJlbnQucHN0eWxlKCdjb21wb3VuZC1zaXppbmctd3J0LWxhYmVscycpLnZhbHVlID09PSAnaW5jbHVkZSc7XG4gICAgdmFyIG1pbiA9IHtcbiAgICAgIHdpZHRoOiB7XG4gICAgICAgIHZhbDogcGFyZW50LnBzdHlsZSgnbWluLXdpZHRoJykucGZWYWx1ZSxcbiAgICAgICAgbGVmdDogcGFyZW50LnBzdHlsZSgnbWluLXdpZHRoLWJpYXMtbGVmdCcpLFxuICAgICAgICByaWdodDogcGFyZW50LnBzdHlsZSgnbWluLXdpZHRoLWJpYXMtcmlnaHQnKVxuICAgICAgfSxcbiAgICAgIGhlaWdodDoge1xuICAgICAgICB2YWw6IHBhcmVudC5wc3R5bGUoJ21pbi1oZWlnaHQnKS5wZlZhbHVlLFxuICAgICAgICB0b3A6IHBhcmVudC5wc3R5bGUoJ21pbi1oZWlnaHQtYmlhcy10b3AnKSxcbiAgICAgICAgYm90dG9tOiBwYXJlbnQucHN0eWxlKCdtaW4taGVpZ2h0LWJpYXMtYm90dG9tJylcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBiYiA9IGNoaWxkcmVuLmJvdW5kaW5nQm94KHtcbiAgICAgIGluY2x1ZGVMYWJlbHM6IGluY2x1ZGVMYWJlbHMsXG4gICAgICBpbmNsdWRlT3ZlcmxheXM6IGZhbHNlLFxuICAgICAgLy8gdXBkYXRpbmcgdGhlIGNvbXBvdW5kIGJvdW5kcyBoYXBwZW5zIG91dHNpZGUgb2YgdGhlIHJlZ3VsYXJcbiAgICAgIC8vIGNhY2hlIGN5Y2xlIChpLmUuIGJlZm9yZSBmaXJlZCBldmVudHMpXG4gICAgICB1c2VDYWNoZTogZmFsc2VcbiAgICB9KTtcbiAgICB2YXIgcG9zID0gX3AucG9zaXRpb247XG5cbiAgICAvLyBpZiBjaGlsZHJlbiB0YWtlIHVwIHplcm8gYXJlYSB0aGVuIGtlZXAgcG9zaXRpb24gYW5kIGZhbGwgYmFjayBvbiBzdHlsZXNoZWV0IHcvaFxuICAgIGlmIChiYi53ID09PSAwIHx8IGJiLmggPT09IDApIHtcbiAgICAgIGJiID0ge1xuICAgICAgICB3OiBwYXJlbnQucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWUsXG4gICAgICAgIGg6IHBhcmVudC5wc3R5bGUoJ2hlaWdodCcpLnBmVmFsdWVcbiAgICAgIH07XG4gICAgICBiYi54MSA9IHBvcy54IC0gYmIudyAvIDI7XG4gICAgICBiYi54MiA9IHBvcy54ICsgYmIudyAvIDI7XG4gICAgICBiYi55MSA9IHBvcy55IC0gYmIuaCAvIDI7XG4gICAgICBiYi55MiA9IHBvcy55ICsgYmIuaCAvIDI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVCaWFzVmFsdWVzKHByb3BEaWZmLCBwcm9wQmlhcywgcHJvcEJpYXNDb21wbGVtZW50KSB7XG4gICAgICB2YXIgYmlhc0RpZmYgPSAwO1xuICAgICAgdmFyIGJpYXNDb21wbGVtZW50RGlmZiA9IDA7XG4gICAgICB2YXIgYmlhc1RvdGFsID0gcHJvcEJpYXMgKyBwcm9wQmlhc0NvbXBsZW1lbnQ7XG4gICAgICBpZiAocHJvcERpZmYgPiAwICYmIGJpYXNUb3RhbCA+IDApIHtcbiAgICAgICAgYmlhc0RpZmYgPSBwcm9wQmlhcyAvIGJpYXNUb3RhbCAqIHByb3BEaWZmO1xuICAgICAgICBiaWFzQ29tcGxlbWVudERpZmYgPSBwcm9wQmlhc0NvbXBsZW1lbnQgLyBiaWFzVG90YWwgKiBwcm9wRGlmZjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJpYXNEaWZmOiBiaWFzRGlmZixcbiAgICAgICAgYmlhc0NvbXBsZW1lbnREaWZmOiBiaWFzQ29tcGxlbWVudERpZmZcbiAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVQYWRkaW5nVmFsdWVzKHdpZHRoLCBoZWlnaHQsIHBhZGRpbmdPYmplY3QsIHJlbGF0aXZlVG8pIHtcbiAgICAgIC8vIEFzc3VtaW5nIHBlcmNlbnRhZ2UgaXMgbnVtYmVyIGZyb20gMCB0byAxXG4gICAgICBpZiAocGFkZGluZ09iamVjdC51bml0cyA9PT0gJyUnKSB7XG4gICAgICAgIHN3aXRjaCAocmVsYXRpdmVUbykge1xuICAgICAgICAgIGNhc2UgJ3dpZHRoJzpcbiAgICAgICAgICAgIHJldHVybiB3aWR0aCA+IDAgPyBwYWRkaW5nT2JqZWN0LnBmVmFsdWUgKiB3aWR0aCA6IDA7XG4gICAgICAgICAgY2FzZSAnaGVpZ2h0JzpcbiAgICAgICAgICAgIHJldHVybiBoZWlnaHQgPiAwID8gcGFkZGluZ09iamVjdC5wZlZhbHVlICogaGVpZ2h0IDogMDtcbiAgICAgICAgICBjYXNlICdhdmVyYWdlJzpcbiAgICAgICAgICAgIHJldHVybiB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCA/IHBhZGRpbmdPYmplY3QucGZWYWx1ZSAqICh3aWR0aCArIGhlaWdodCkgLyAyIDogMDtcbiAgICAgICAgICBjYXNlICdtaW4nOlxuICAgICAgICAgICAgcmV0dXJuIHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwID8gd2lkdGggPiBoZWlnaHQgPyBwYWRkaW5nT2JqZWN0LnBmVmFsdWUgKiBoZWlnaHQgOiBwYWRkaW5nT2JqZWN0LnBmVmFsdWUgKiB3aWR0aCA6IDA7XG4gICAgICAgICAgY2FzZSAnbWF4JzpcbiAgICAgICAgICAgIHJldHVybiB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCA/IHdpZHRoID4gaGVpZ2h0ID8gcGFkZGluZ09iamVjdC5wZlZhbHVlICogd2lkdGggOiBwYWRkaW5nT2JqZWN0LnBmVmFsdWUgKiBoZWlnaHQgOiAwO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwYWRkaW5nT2JqZWN0LnVuaXRzID09PSAncHgnKSB7XG4gICAgICAgIHJldHVybiBwYWRkaW5nT2JqZWN0LnBmVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGxlZnRWYWwgPSBtaW4ud2lkdGgubGVmdC52YWx1ZTtcbiAgICBpZiAobWluLndpZHRoLmxlZnQudW5pdHMgPT09ICdweCcgJiYgbWluLndpZHRoLnZhbCA+IDApIHtcbiAgICAgIGxlZnRWYWwgPSBsZWZ0VmFsICogMTAwIC8gbWluLndpZHRoLnZhbDtcbiAgICB9XG4gICAgdmFyIHJpZ2h0VmFsID0gbWluLndpZHRoLnJpZ2h0LnZhbHVlO1xuICAgIGlmIChtaW4ud2lkdGgucmlnaHQudW5pdHMgPT09ICdweCcgJiYgbWluLndpZHRoLnZhbCA+IDApIHtcbiAgICAgIHJpZ2h0VmFsID0gcmlnaHRWYWwgKiAxMDAgLyBtaW4ud2lkdGgudmFsO1xuICAgIH1cbiAgICB2YXIgdG9wVmFsID0gbWluLmhlaWdodC50b3AudmFsdWU7XG4gICAgaWYgKG1pbi5oZWlnaHQudG9wLnVuaXRzID09PSAncHgnICYmIG1pbi5oZWlnaHQudmFsID4gMCkge1xuICAgICAgdG9wVmFsID0gdG9wVmFsICogMTAwIC8gbWluLmhlaWdodC52YWw7XG4gICAgfVxuICAgIHZhciBib3R0b21WYWwgPSBtaW4uaGVpZ2h0LmJvdHRvbS52YWx1ZTtcbiAgICBpZiAobWluLmhlaWdodC5ib3R0b20udW5pdHMgPT09ICdweCcgJiYgbWluLmhlaWdodC52YWwgPiAwKSB7XG4gICAgICBib3R0b21WYWwgPSBib3R0b21WYWwgKiAxMDAgLyBtaW4uaGVpZ2h0LnZhbDtcbiAgICB9XG4gICAgdmFyIHdpZHRoQmlhc0RpZmZzID0gY29tcHV0ZUJpYXNWYWx1ZXMobWluLndpZHRoLnZhbCAtIGJiLncsIGxlZnRWYWwsIHJpZ2h0VmFsKTtcbiAgICB2YXIgZGlmZkxlZnQgPSB3aWR0aEJpYXNEaWZmcy5iaWFzRGlmZjtcbiAgICB2YXIgZGlmZlJpZ2h0ID0gd2lkdGhCaWFzRGlmZnMuYmlhc0NvbXBsZW1lbnREaWZmO1xuICAgIHZhciBoZWlnaHRCaWFzRGlmZnMgPSBjb21wdXRlQmlhc1ZhbHVlcyhtaW4uaGVpZ2h0LnZhbCAtIGJiLmgsIHRvcFZhbCwgYm90dG9tVmFsKTtcbiAgICB2YXIgZGlmZlRvcCA9IGhlaWdodEJpYXNEaWZmcy5iaWFzRGlmZjtcbiAgICB2YXIgZGlmZkJvdHRvbSA9IGhlaWdodEJpYXNEaWZmcy5iaWFzQ29tcGxlbWVudERpZmY7XG4gICAgX3AuYXV0b1BhZGRpbmcgPSBjb21wdXRlUGFkZGluZ1ZhbHVlcyhiYi53LCBiYi5oLCBwYXJlbnQucHN0eWxlKCdwYWRkaW5nJyksIHBhcmVudC5wc3R5bGUoJ3BhZGRpbmctcmVsYXRpdmUtdG8nKS52YWx1ZSk7XG4gICAgX3AuYXV0b1dpZHRoID0gTWF0aC5tYXgoYmIudywgbWluLndpZHRoLnZhbCk7XG4gICAgcG9zLnggPSAoLWRpZmZMZWZ0ICsgYmIueDEgKyBiYi54MiArIGRpZmZSaWdodCkgLyAyO1xuICAgIF9wLmF1dG9IZWlnaHQgPSBNYXRoLm1heChiYi5oLCBtaW4uaGVpZ2h0LnZhbCk7XG4gICAgcG9zLnkgPSAoLWRpZmZUb3AgKyBiYi55MSArIGJiLnkyICsgZGlmZkJvdHRvbSkgLyAyO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICBpZiAoIV9wLmNvbXBvdW5kQm91bmRzQ2xlYW4gfHwgZm9yY2UpIHtcbiAgICAgIHVwZGF0ZShlbGUpO1xuICAgICAgaWYgKCFjeS5iYXRjaGluZygpKSB7XG4gICAgICAgIF9wLmNvbXBvdW5kQm91bmRzQ2xlYW4gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG52YXIgbm9uaW5mID0gZnVuY3Rpb24gbm9uaW5mKHgpIHtcbiAgaWYgKHggPT09IEluZmluaXR5IHx8IHggPT09IC1JbmZpbml0eSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiB4O1xufTtcbnZhciB1cGRhdGVCb3VuZHMgPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHMoYiwgeDEsIHkxLCB4MiwgeTIpIHtcbiAgLy8gZG9uJ3QgdXBkYXRlIHdpdGggemVybyBhcmVhIGJveGVzXG4gIGlmICh4MiAtIHgxID09PSAwIHx8IHkyIC0geTEgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBkb24ndCB1cGRhdGUgd2l0aCBudWxsIGRpbVxuICBpZiAoeDEgPT0gbnVsbCB8fCB5MSA9PSBudWxsIHx8IHgyID09IG51bGwgfHwgeTIgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBiLngxID0geDEgPCBiLngxID8geDEgOiBiLngxO1xuICBiLngyID0geDIgPiBiLngyID8geDIgOiBiLngyO1xuICBiLnkxID0geTEgPCBiLnkxID8geTEgOiBiLnkxO1xuICBiLnkyID0geTIgPiBiLnkyID8geTIgOiBiLnkyO1xuICBiLncgPSBiLngyIC0gYi54MTtcbiAgYi5oID0gYi55MiAtIGIueTE7XG59O1xudmFyIHVwZGF0ZUJvdW5kc0Zyb21Cb3ggPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHNGcm9tQm94KGIsIGIyKSB7XG4gIGlmIChiMiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGI7XG4gIH1cbiAgcmV0dXJuIHVwZGF0ZUJvdW5kcyhiLCBiMi54MSwgYjIueTEsIGIyLngyLCBiMi55Mik7XG59O1xudmFyIHByZWZpeGVkUHJvcGVydHkgPSBmdW5jdGlvbiBwcmVmaXhlZFByb3BlcnR5KG9iaiwgZmllbGQsIHByZWZpeCkge1xuICByZXR1cm4gZ2V0UHJlZml4ZWRQcm9wZXJ0eShvYmosIGZpZWxkLCBwcmVmaXgpO1xufTtcbnZhciB1cGRhdGVCb3VuZHNGcm9tQXJyb3cgPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHNGcm9tQXJyb3coYm91bmRzLCBlbGUsIHByZWZpeCkge1xuICBpZiAoZWxlLmN5KCkuaGVhZGxlc3MoKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciByc3R5bGUgPSBfcC5yc3R5bGU7XG4gIHZhciBoYWxmQXJXID0gcnN0eWxlLmFycm93V2lkdGggLyAyO1xuICB2YXIgYXJyb3dUeXBlID0gZWxlLnBzdHlsZShwcmVmaXggKyAnLWFycm93LXNoYXBlJykudmFsdWU7XG4gIHZhciB4O1xuICB2YXIgeTtcbiAgaWYgKGFycm93VHlwZSAhPT0gJ25vbmUnKSB7XG4gICAgaWYgKHByZWZpeCA9PT0gJ3NvdXJjZScpIHtcbiAgICAgIHggPSByc3R5bGUuc3JjWDtcbiAgICAgIHkgPSByc3R5bGUuc3JjWTtcbiAgICB9IGVsc2UgaWYgKHByZWZpeCA9PT0gJ3RhcmdldCcpIHtcbiAgICAgIHggPSByc3R5bGUudGd0WDtcbiAgICAgIHkgPSByc3R5bGUudGd0WTtcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IHJzdHlsZS5taWRYO1xuICAgICAgeSA9IHJzdHlsZS5taWRZO1xuICAgIH1cblxuICAgIC8vIGFsd2F5cyBzdG9yZSB0aGUgaW5kaXZpZHVhbCBhcnJvdyBib3VuZHNcbiAgICB2YXIgYmJzID0gX3AuYXJyb3dCb3VuZHMgPSBfcC5hcnJvd0JvdW5kcyB8fCB7fTtcbiAgICB2YXIgYmIgPSBiYnNbcHJlZml4XSA9IGJic1twcmVmaXhdIHx8IHt9O1xuICAgIGJiLngxID0geCAtIGhhbGZBclc7XG4gICAgYmIueTEgPSB5IC0gaGFsZkFyVztcbiAgICBiYi54MiA9IHggKyBoYWxmQXJXO1xuICAgIGJiLnkyID0geSArIGhhbGZBclc7XG4gICAgYmIudyA9IGJiLngyIC0gYmIueDE7XG4gICAgYmIuaCA9IGJiLnkyIC0gYmIueTE7XG4gICAgZXhwYW5kQm91bmRpbmdCb3goYmIsIDEpO1xuICAgIHVwZGF0ZUJvdW5kcyhib3VuZHMsIGJiLngxLCBiYi55MSwgYmIueDIsIGJiLnkyKTtcbiAgfVxufTtcbnZhciB1cGRhdGVCb3VuZHNGcm9tTGFiZWwgPSBmdW5jdGlvbiB1cGRhdGVCb3VuZHNGcm9tTGFiZWwoYm91bmRzLCBlbGUsIHByZWZpeCkge1xuICBpZiAoZWxlLmN5KCkuaGVhZGxlc3MoKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgcHJlZml4RGFzaDtcbiAgaWYgKHByZWZpeCkge1xuICAgIHByZWZpeERhc2ggPSBwcmVmaXggKyAnLSc7XG4gIH0gZWxzZSB7XG4gICAgcHJlZml4RGFzaCA9ICcnO1xuICB9XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHJzdHlsZSA9IF9wLnJzdHlsZTtcbiAgdmFyIGxhYmVsID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ2xhYmVsJykuc3RyVmFsdWU7XG4gIGlmIChsYWJlbCkge1xuICAgIHZhciBoYWxpZ24gPSBlbGUucHN0eWxlKCd0ZXh0LWhhbGlnbicpO1xuICAgIHZhciB2YWxpZ24gPSBlbGUucHN0eWxlKCd0ZXh0LXZhbGlnbicpO1xuICAgIHZhciBsYWJlbFdpZHRoID0gcHJlZml4ZWRQcm9wZXJ0eShyc3R5bGUsICdsYWJlbFdpZHRoJywgcHJlZml4KTtcbiAgICB2YXIgbGFiZWxIZWlnaHQgPSBwcmVmaXhlZFByb3BlcnR5KHJzdHlsZSwgJ2xhYmVsSGVpZ2h0JywgcHJlZml4KTtcbiAgICB2YXIgbGFiZWxYID0gcHJlZml4ZWRQcm9wZXJ0eShyc3R5bGUsICdsYWJlbFgnLCBwcmVmaXgpO1xuICAgIHZhciBsYWJlbFkgPSBwcmVmaXhlZFByb3BlcnR5KHJzdHlsZSwgJ2xhYmVsWScsIHByZWZpeCk7XG4gICAgdmFyIG1hcmdpblggPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAndGV4dC1tYXJnaW4teCcpLnBmVmFsdWU7XG4gICAgdmFyIG1hcmdpblkgPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAndGV4dC1tYXJnaW4teScpLnBmVmFsdWU7XG4gICAgdmFyIGlzRWRnZSA9IGVsZS5pc0VkZ2UoKTtcbiAgICB2YXIgcm90YXRpb24gPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAndGV4dC1yb3RhdGlvbicpO1xuICAgIHZhciBvdXRsaW5lV2lkdGggPSBlbGUucHN0eWxlKCd0ZXh0LW91dGxpbmUtd2lkdGgnKS5wZlZhbHVlO1xuICAgIHZhciBib3JkZXJXaWR0aCA9IGVsZS5wc3R5bGUoJ3RleHQtYm9yZGVyLXdpZHRoJykucGZWYWx1ZTtcbiAgICB2YXIgaGFsZkJvcmRlcldpZHRoID0gYm9yZGVyV2lkdGggLyAyO1xuICAgIHZhciBwYWRkaW5nID0gZWxlLnBzdHlsZSgndGV4dC1iYWNrZ3JvdW5kLXBhZGRpbmcnKS5wZlZhbHVlO1xuICAgIHZhciBtYXJnaW5PZkVycm9yID0gMjsgLy8gZXhwYW5kIHRvIHdvcmsgYXJvdW5kIGJyb3dzZXIgZGltZW5zaW9uIGluYWNjdXJhY2llc1xuXG4gICAgdmFyIGxoID0gbGFiZWxIZWlnaHQ7XG4gICAgdmFyIGx3ID0gbGFiZWxXaWR0aDtcbiAgICB2YXIgbHdfMiA9IGx3IC8gMjtcbiAgICB2YXIgbGhfMiA9IGxoIC8gMjtcbiAgICB2YXIgbHgxLCBseDIsIGx5MSwgbHkyO1xuICAgIGlmIChpc0VkZ2UpIHtcbiAgICAgIGx4MSA9IGxhYmVsWCAtIGx3XzI7XG4gICAgICBseDIgPSBsYWJlbFggKyBsd18yO1xuICAgICAgbHkxID0gbGFiZWxZIC0gbGhfMjtcbiAgICAgIGx5MiA9IGxhYmVsWSArIGxoXzI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAoaGFsaWduLnZhbHVlKSB7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgIGx4MSA9IGxhYmVsWCAtIGx3O1xuICAgICAgICAgIGx4MiA9IGxhYmVsWDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgICBseDEgPSBsYWJlbFggLSBsd18yO1xuICAgICAgICAgIGx4MiA9IGxhYmVsWCArIGx3XzI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICBseDEgPSBsYWJlbFg7XG4gICAgICAgICAgbHgyID0gbGFiZWxYICsgbHc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHZhbGlnbi52YWx1ZSkge1xuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgIGx5MSA9IGxhYmVsWSAtIGxoO1xuICAgICAgICAgIGx5MiA9IGxhYmVsWTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgICBseTEgPSBsYWJlbFkgLSBsaF8yO1xuICAgICAgICAgIGx5MiA9IGxhYmVsWSArIGxoXzI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgbHkxID0gbGFiZWxZO1xuICAgICAgICAgIGx5MiA9IGxhYmVsWSArIGxoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNoaWZ0IGJ5IG1hcmdpbiBhbmQgZXhwYW5kIGJ5IG91dGxpbmUgYW5kIGJvcmRlclxuICAgIGx4MSArPSBtYXJnaW5YIC0gTWF0aC5tYXgob3V0bGluZVdpZHRoLCBoYWxmQm9yZGVyV2lkdGgpIC0gcGFkZGluZyAtIG1hcmdpbk9mRXJyb3I7XG4gICAgbHgyICs9IG1hcmdpblggKyBNYXRoLm1heChvdXRsaW5lV2lkdGgsIGhhbGZCb3JkZXJXaWR0aCkgKyBwYWRkaW5nICsgbWFyZ2luT2ZFcnJvcjtcbiAgICBseTEgKz0gbWFyZ2luWSAtIE1hdGgubWF4KG91dGxpbmVXaWR0aCwgaGFsZkJvcmRlcldpZHRoKSAtIHBhZGRpbmcgLSBtYXJnaW5PZkVycm9yO1xuICAgIGx5MiArPSBtYXJnaW5ZICsgTWF0aC5tYXgob3V0bGluZVdpZHRoLCBoYWxmQm9yZGVyV2lkdGgpICsgcGFkZGluZyArIG1hcmdpbk9mRXJyb3I7XG5cbiAgICAvLyBhbHdheXMgc3RvcmUgdGhlIHVucm90YXRlZCBsYWJlbCBib3VuZHMgc2VwYXJhdGVseVxuICAgIHZhciBiYlByZWZpeCA9IHByZWZpeCB8fCAnbWFpbic7XG4gICAgdmFyIGJicyA9IF9wLmxhYmVsQm91bmRzO1xuICAgIHZhciBiYiA9IGJic1tiYlByZWZpeF0gPSBiYnNbYmJQcmVmaXhdIHx8IHt9O1xuICAgIGJiLngxID0gbHgxO1xuICAgIGJiLnkxID0gbHkxO1xuICAgIGJiLngyID0gbHgyO1xuICAgIGJiLnkyID0gbHkyO1xuICAgIGJiLncgPSBseDIgLSBseDE7XG4gICAgYmIuaCA9IGx5MiAtIGx5MTtcbiAgICB2YXIgaXNBdXRvcm90YXRlID0gaXNFZGdlICYmIHJvdGF0aW9uLnN0clZhbHVlID09PSAnYXV0b3JvdGF0ZSc7XG4gICAgdmFyIGlzUGZWYWx1ZSA9IHJvdGF0aW9uLnBmVmFsdWUgIT0gbnVsbCAmJiByb3RhdGlvbi5wZlZhbHVlICE9PSAwO1xuICAgIGlmIChpc0F1dG9yb3RhdGUgfHwgaXNQZlZhbHVlKSB7XG4gICAgICB2YXIgdGhldGEgPSBpc0F1dG9yb3RhdGUgPyBwcmVmaXhlZFByb3BlcnR5KF9wLnJzdHlsZSwgJ2xhYmVsQW5nbGUnLCBwcmVmaXgpIDogcm90YXRpb24ucGZWYWx1ZTtcbiAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyh0aGV0YSk7XG4gICAgICB2YXIgc2luID0gTWF0aC5zaW4odGhldGEpO1xuXG4gICAgICAvLyByb3RhdGlvbiBwb2ludCAoZGVmYXVsdCB2YWx1ZSBmb3IgY2VudGVyLWNlbnRlcilcbiAgICAgIHZhciB4byA9IChseDEgKyBseDIpIC8gMjtcbiAgICAgIHZhciB5byA9IChseTEgKyBseTIpIC8gMjtcbiAgICAgIGlmICghaXNFZGdlKSB7XG4gICAgICAgIHN3aXRjaCAoaGFsaWduLnZhbHVlKSB7XG4gICAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgICB4byA9IGx4MjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgIHhvID0gbHgxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh2YWxpZ24udmFsdWUpIHtcbiAgICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgeW8gPSBseTI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgICAgeW8gPSBseTE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHJvdGF0ZSA9IGZ1bmN0aW9uIHJvdGF0ZSh4LCB5KSB7XG4gICAgICAgIHggPSB4IC0geG87XG4gICAgICAgIHkgPSB5IC0geW87XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogeCAqIGNvcyAtIHkgKiBzaW4gKyB4byxcbiAgICAgICAgICB5OiB4ICogc2luICsgeSAqIGNvcyArIHlvXG4gICAgICAgIH07XG4gICAgICB9O1xuICAgICAgdmFyIHB4MXkxID0gcm90YXRlKGx4MSwgbHkxKTtcbiAgICAgIHZhciBweDF5MiA9IHJvdGF0ZShseDEsIGx5Mik7XG4gICAgICB2YXIgcHgyeTEgPSByb3RhdGUobHgyLCBseTEpO1xuICAgICAgdmFyIHB4MnkyID0gcm90YXRlKGx4MiwgbHkyKTtcbiAgICAgIGx4MSA9IE1hdGgubWluKHB4MXkxLngsIHB4MXkyLngsIHB4MnkxLngsIHB4MnkyLngpO1xuICAgICAgbHgyID0gTWF0aC5tYXgocHgxeTEueCwgcHgxeTIueCwgcHgyeTEueCwgcHgyeTIueCk7XG4gICAgICBseTEgPSBNYXRoLm1pbihweDF5MS55LCBweDF5Mi55LCBweDJ5MS55LCBweDJ5Mi55KTtcbiAgICAgIGx5MiA9IE1hdGgubWF4KHB4MXkxLnksIHB4MXkyLnksIHB4MnkxLnksIHB4MnkyLnkpO1xuICAgIH1cbiAgICB2YXIgYmJQcmVmaXhSb3QgPSBiYlByZWZpeCArICdSb3QnO1xuICAgIHZhciBiYlJvdCA9IGJic1tiYlByZWZpeFJvdF0gPSBiYnNbYmJQcmVmaXhSb3RdIHx8IHt9O1xuICAgIGJiUm90LngxID0gbHgxO1xuICAgIGJiUm90LnkxID0gbHkxO1xuICAgIGJiUm90LngyID0gbHgyO1xuICAgIGJiUm90LnkyID0gbHkyO1xuICAgIGJiUm90LncgPSBseDIgLSBseDE7XG4gICAgYmJSb3QuaCA9IGx5MiAtIGx5MTtcbiAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBseDEsIGx5MSwgbHgyLCBseTIpO1xuICAgIHVwZGF0ZUJvdW5kcyhfcC5sYWJlbEJvdW5kcy5hbGwsIGx4MSwgbHkxLCBseDIsIGx5Mik7XG4gIH1cbiAgcmV0dXJuIGJvdW5kcztcbn07XG5cbi8vIGdldCB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBlbGVtZW50cyAoaW4gcmF3IG1vZGVsIHBvc2l0aW9uKVxudmFyIGJvdW5kaW5nQm94SW1wbCA9IGZ1bmN0aW9uIGJvdW5kaW5nQm94SW1wbChlbGUsIG9wdGlvbnMpIHtcbiAgdmFyIGN5ID0gZWxlLl9wcml2YXRlLmN5O1xuICB2YXIgc3R5bGVFbmFibGVkID0gY3kuc3R5bGVFbmFibGVkKCk7XG4gIHZhciBoZWFkbGVzcyA9IGN5LmhlYWRsZXNzKCk7XG4gIHZhciBib3VuZHMgPSBtYWtlQm91bmRpbmdCb3goKTtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgaXNOb2RlID0gZWxlLmlzTm9kZSgpO1xuICB2YXIgaXNFZGdlID0gZWxlLmlzRWRnZSgpO1xuICB2YXIgZXgxLCBleDIsIGV5MSwgZXkyOyAvLyBleHRyZW1hIG9mIGJvZHkgLyBsaW5lc1xuICB2YXIgeCwgeTsgLy8gbm9kZSBwb3NcbiAgdmFyIHJzdHlsZSA9IF9wLnJzdHlsZTtcbiAgdmFyIG1hbnVhbEV4cGFuc2lvbiA9IGlzTm9kZSAmJiBzdHlsZUVuYWJsZWQgPyBlbGUucHN0eWxlKCdib3VuZHMtZXhwYW5zaW9uJykucGZWYWx1ZSA6IFswXTtcblxuICAvLyBtdXN0IHVzZSBgZGlzcGxheWAgcHJvcCBvbmx5LCBhcyByZWFkaW5nIGBjb21wb3VuZC53aWR0aCgpYCBjYXVzZXMgcmVjdXJzaW9uXG4gIC8vIChvdGhlciBmYWN0b3JzIGxpa2Ugd2lkdGggdmFsdWVzIHdpbGwgYmUgY29uc2lkZXJlZCBsYXRlciBpbiB0aGlzIGZ1bmN0aW9uIGFueXdheSlcbiAgdmFyIGlzRGlzcGxheWVkID0gZnVuY3Rpb24gaXNEaXNwbGF5ZWQoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5wc3R5bGUoJ2Rpc3BsYXknKS52YWx1ZSAhPT0gJ25vbmUnO1xuICB9O1xuICB2YXIgZGlzcGxheWVkID0gIXN0eWxlRW5hYmxlZCB8fCBpc0Rpc3BsYXllZChlbGUpXG5cbiAgLy8gbXVzdCB0YWtlIGludG8gYWNjb3VudCBjb25uZWN0ZWQgbm9kZXMgYi9jIG9mIGltcGxpY2l0IGVkZ2UgaGlkaW5nIG9uIGRpc3BsYXk6bm9uZSBub2RlXG4gICYmICghaXNFZGdlIHx8IGlzRGlzcGxheWVkKGVsZS5zb3VyY2UoKSkgJiYgaXNEaXNwbGF5ZWQoZWxlLnRhcmdldCgpKSk7XG4gIGlmIChkaXNwbGF5ZWQpIHtcbiAgICAvLyBkaXNwbGF5ZWQgc3VmZmljZXMsIHNpbmNlIHdlIHdpbGwgZmluZCB6ZXJvIGFyZWEgZWxlcyBhbnl3YXlcbiAgICB2YXIgb3ZlcmxheU9wYWNpdHkgPSAwO1xuICAgIHZhciBvdmVybGF5UGFkZGluZyA9IDA7XG4gICAgaWYgKHN0eWxlRW5hYmxlZCAmJiBvcHRpb25zLmluY2x1ZGVPdmVybGF5cykge1xuICAgICAgb3ZlcmxheU9wYWNpdHkgPSBlbGUucHN0eWxlKCdvdmVybGF5LW9wYWNpdHknKS52YWx1ZTtcbiAgICAgIGlmIChvdmVybGF5T3BhY2l0eSAhPT0gMCkge1xuICAgICAgICBvdmVybGF5UGFkZGluZyA9IGVsZS5wc3R5bGUoJ292ZXJsYXktcGFkZGluZycpLnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgdW5kZXJsYXlPcGFjaXR5ID0gMDtcbiAgICB2YXIgdW5kZXJsYXlQYWRkaW5nID0gMDtcbiAgICBpZiAoc3R5bGVFbmFibGVkICYmIG9wdGlvbnMuaW5jbHVkZVVuZGVybGF5cykge1xuICAgICAgdW5kZXJsYXlPcGFjaXR5ID0gZWxlLnBzdHlsZSgndW5kZXJsYXktb3BhY2l0eScpLnZhbHVlO1xuICAgICAgaWYgKHVuZGVybGF5T3BhY2l0eSAhPT0gMCkge1xuICAgICAgICB1bmRlcmxheVBhZGRpbmcgPSBlbGUucHN0eWxlKCd1bmRlcmxheS1wYWRkaW5nJykudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBwYWRkaW5nID0gTWF0aC5tYXgob3ZlcmxheVBhZGRpbmcsIHVuZGVybGF5UGFkZGluZyk7XG4gICAgdmFyIHcgPSAwO1xuICAgIHZhciB3SGFsZiA9IDA7XG4gICAgaWYgKHN0eWxlRW5hYmxlZCkge1xuICAgICAgdyA9IGVsZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZTtcbiAgICAgIHdIYWxmID0gdyAvIDI7XG4gICAgfVxuICAgIGlmIChpc05vZGUgJiYgb3B0aW9ucy5pbmNsdWRlTm9kZXMpIHtcbiAgICAgIHZhciBwb3MgPSBlbGUucG9zaXRpb24oKTtcbiAgICAgIHggPSBwb3MueDtcbiAgICAgIHkgPSBwb3MueTtcbiAgICAgIHZhciBfdyA9IGVsZS5vdXRlcldpZHRoKCk7XG4gICAgICB2YXIgaGFsZlcgPSBfdyAvIDI7XG4gICAgICB2YXIgaCA9IGVsZS5vdXRlckhlaWdodCgpO1xuICAgICAgdmFyIGhhbGZIID0gaCAvIDI7XG5cbiAgICAgIC8vIGhhbmRsZSBub2RlIGRpbWVuc2lvbnNcbiAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgZXgxID0geCAtIGhhbGZXO1xuICAgICAgZXgyID0geCArIGhhbGZXO1xuICAgICAgZXkxID0geSAtIGhhbGZIO1xuICAgICAgZXkyID0geSArIGhhbGZIO1xuICAgICAgdXBkYXRlQm91bmRzKGJvdW5kcywgZXgxLCBleTEsIGV4MiwgZXkyKTtcbiAgICB9IGVsc2UgaWYgKGlzRWRnZSAmJiBvcHRpb25zLmluY2x1ZGVFZGdlcykge1xuICAgICAgaWYgKHN0eWxlRW5hYmxlZCAmJiAhaGVhZGxlc3MpIHtcbiAgICAgICAgdmFyIGN1cnZlU3R5bGUgPSBlbGUucHN0eWxlKCdjdXJ2ZS1zdHlsZScpLnN0clZhbHVlO1xuXG4gICAgICAgIC8vIGhhbmRsZSBlZGdlIGRpbWVuc2lvbnMgKHJvdWdoIGJveCBlc3RpbWF0ZSlcbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgIGV4MSA9IE1hdGgubWluKHJzdHlsZS5zcmNYLCByc3R5bGUubWlkWCwgcnN0eWxlLnRndFgpO1xuICAgICAgICBleDIgPSBNYXRoLm1heChyc3R5bGUuc3JjWCwgcnN0eWxlLm1pZFgsIHJzdHlsZS50Z3RYKTtcbiAgICAgICAgZXkxID0gTWF0aC5taW4ocnN0eWxlLnNyY1ksIHJzdHlsZS5taWRZLCByc3R5bGUudGd0WSk7XG4gICAgICAgIGV5MiA9IE1hdGgubWF4KHJzdHlsZS5zcmNZLCByc3R5bGUubWlkWSwgcnN0eWxlLnRndFkpO1xuXG4gICAgICAgIC8vIHRha2UgaW50byBhY2NvdW50IGVkZ2Ugd2lkdGhcbiAgICAgICAgZXgxIC09IHdIYWxmO1xuICAgICAgICBleDIgKz0gd0hhbGY7XG4gICAgICAgIGV5MSAtPSB3SGFsZjtcbiAgICAgICAgZXkyICs9IHdIYWxmO1xuICAgICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBleDEsIGV5MSwgZXgyLCBleTIpO1xuXG4gICAgICAgIC8vIHByZWNpc2UgZWRnZXNcbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgIGlmIChjdXJ2ZVN0eWxlID09PSAnaGF5c3RhY2snKSB7XG4gICAgICAgICAgdmFyIGhwdHMgPSByc3R5bGUuaGF5c3RhY2tQdHM7XG4gICAgICAgICAgaWYgKGhwdHMgJiYgaHB0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGV4MSA9IGhwdHNbMF0ueDtcbiAgICAgICAgICAgIGV5MSA9IGhwdHNbMF0ueTtcbiAgICAgICAgICAgIGV4MiA9IGhwdHNbMV0ueDtcbiAgICAgICAgICAgIGV5MiA9IGhwdHNbMV0ueTtcbiAgICAgICAgICAgIGlmIChleDEgPiBleDIpIHtcbiAgICAgICAgICAgICAgdmFyIHRlbXAgPSBleDE7XG4gICAgICAgICAgICAgIGV4MSA9IGV4MjtcbiAgICAgICAgICAgICAgZXgyID0gdGVtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleTEgPiBleTIpIHtcbiAgICAgICAgICAgICAgdmFyIF90ZW1wID0gZXkxO1xuICAgICAgICAgICAgICBleTEgPSBleTI7XG4gICAgICAgICAgICAgIGV5MiA9IF90ZW1wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlQm91bmRzKGJvdW5kcywgZXgxIC0gd0hhbGYsIGV5MSAtIHdIYWxmLCBleDIgKyB3SGFsZiwgZXkyICsgd0hhbGYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjdXJ2ZVN0eWxlID09PSAnYmV6aWVyJyB8fCBjdXJ2ZVN0eWxlID09PSAndW5idW5kbGVkLWJlemllcicgfHwgY3VydmVTdHlsZSA9PT0gJ3NlZ21lbnRzJyB8fCBjdXJ2ZVN0eWxlID09PSAndGF4aScpIHtcbiAgICAgICAgICB2YXIgcHRzO1xuICAgICAgICAgIHN3aXRjaCAoY3VydmVTdHlsZSkge1xuICAgICAgICAgICAgY2FzZSAnYmV6aWVyJzpcbiAgICAgICAgICAgIGNhc2UgJ3VuYnVuZGxlZC1iZXppZXInOlxuICAgICAgICAgICAgICBwdHMgPSByc3R5bGUuYmV6aWVyUHRzO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NlZ21lbnRzJzpcbiAgICAgICAgICAgIGNhc2UgJ3RheGknOlxuICAgICAgICAgICAgICBwdHMgPSByc3R5bGUubGluZVB0cztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwdHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwdHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgdmFyIHB0ID0gcHRzW2pdO1xuICAgICAgICAgICAgICBleDEgPSBwdC54IC0gd0hhbGY7XG4gICAgICAgICAgICAgIGV4MiA9IHB0LnggKyB3SGFsZjtcbiAgICAgICAgICAgICAgZXkxID0gcHQueSAtIHdIYWxmO1xuICAgICAgICAgICAgICBleTIgPSBwdC55ICsgd0hhbGY7XG4gICAgICAgICAgICAgIHVwZGF0ZUJvdW5kcyhib3VuZHMsIGV4MSwgZXkxLCBleDIsIGV5Mik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIGJlemllci1saWtlIG9yIHNlZ21lbnQtbGlrZSBlZGdlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBoZWFkbGVzcyBvciBzdHlsZSBkaXNhYmxlZFxuXG4gICAgICAgIC8vIGZhbGxiYWNrIG9uIHNvdXJjZSBhbmQgdGFyZ2V0IHBvc2l0aW9uc1xuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICB2YXIgbjEgPSBlbGUuc291cmNlKCk7XG4gICAgICAgIHZhciBuMXBvcyA9IG4xLnBvc2l0aW9uKCk7XG4gICAgICAgIHZhciBuMiA9IGVsZS50YXJnZXQoKTtcbiAgICAgICAgdmFyIG4ycG9zID0gbjIucG9zaXRpb24oKTtcbiAgICAgICAgZXgxID0gbjFwb3MueDtcbiAgICAgICAgZXgyID0gbjJwb3MueDtcbiAgICAgICAgZXkxID0gbjFwb3MueTtcbiAgICAgICAgZXkyID0gbjJwb3MueTtcbiAgICAgICAgaWYgKGV4MSA+IGV4Mikge1xuICAgICAgICAgIHZhciBfdGVtcDIgPSBleDE7XG4gICAgICAgICAgZXgxID0gZXgyO1xuICAgICAgICAgIGV4MiA9IF90ZW1wMjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXkxID4gZXkyKSB7XG4gICAgICAgICAgdmFyIF90ZW1wMyA9IGV5MTtcbiAgICAgICAgICBleTEgPSBleTI7XG4gICAgICAgICAgZXkyID0gX3RlbXAzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGFrZSBpbnRvIGFjY291bnQgZWRnZSB3aWR0aFxuICAgICAgICBleDEgLT0gd0hhbGY7XG4gICAgICAgIGV4MiArPSB3SGFsZjtcbiAgICAgICAgZXkxIC09IHdIYWxmO1xuICAgICAgICBleTIgKz0gd0hhbGY7XG4gICAgICAgIHVwZGF0ZUJvdW5kcyhib3VuZHMsIGV4MSwgZXkxLCBleDIsIGV5Mik7XG4gICAgICB9IC8vIGhlYWRsZXNzIG9yIHN0eWxlIGRpc2FibGVkXG4gICAgfSAvLyBlZGdlc1xuXG4gICAgLy8gaGFuZGxlIGVkZ2UgYXJyb3cgc2l6ZVxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIGlmIChzdHlsZUVuYWJsZWQgJiYgb3B0aW9ucy5pbmNsdWRlRWRnZXMgJiYgaXNFZGdlKSB7XG4gICAgICB1cGRhdGVCb3VuZHNGcm9tQXJyb3coYm91bmRzLCBlbGUsICdtaWQtc291cmNlJyk7XG4gICAgICB1cGRhdGVCb3VuZHNGcm9tQXJyb3coYm91bmRzLCBlbGUsICdtaWQtdGFyZ2V0Jyk7XG4gICAgICB1cGRhdGVCb3VuZHNGcm9tQXJyb3coYm91bmRzLCBlbGUsICdzb3VyY2UnKTtcbiAgICAgIHVwZGF0ZUJvdW5kc0Zyb21BcnJvdyhib3VuZHMsIGVsZSwgJ3RhcmdldCcpO1xuICAgIH1cblxuICAgIC8vIGdob3N0XG4gICAgLy8vLy8vLy9cblxuICAgIGlmIChzdHlsZUVuYWJsZWQpIHtcbiAgICAgIHZhciBnaG9zdCA9IGVsZS5wc3R5bGUoJ2dob3N0JykudmFsdWUgPT09ICd5ZXMnO1xuICAgICAgaWYgKGdob3N0KSB7XG4gICAgICAgIHZhciBneCA9IGVsZS5wc3R5bGUoJ2dob3N0LW9mZnNldC14JykucGZWYWx1ZTtcbiAgICAgICAgdmFyIGd5ID0gZWxlLnBzdHlsZSgnZ2hvc3Qtb2Zmc2V0LXknKS5wZlZhbHVlO1xuICAgICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBib3VuZHMueDEgKyBneCwgYm91bmRzLnkxICsgZ3ksIGJvdW5kcy54MiArIGd4LCBib3VuZHMueTIgKyBneSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYWx3YXlzIHN0b3JlIHRoZSBib2R5IGJvdW5kcyBzZXBhcmF0ZWx5IGZyb20gdGhlIGxhYmVsc1xuICAgIHZhciBiYkJvZHkgPSBfcC5ib2R5Qm91bmRzID0gX3AuYm9keUJvdW5kcyB8fCB7fTtcbiAgICBhc3NpZ25Cb3VuZGluZ0JveChiYkJvZHksIGJvdW5kcyk7XG4gICAgZXhwYW5kQm91bmRpbmdCb3hTaWRlcyhiYkJvZHksIG1hbnVhbEV4cGFuc2lvbik7XG4gICAgZXhwYW5kQm91bmRpbmdCb3goYmJCb2R5LCAxKTsgLy8gZXhwYW5kIHRvIHdvcmsgYXJvdW5kIGJyb3dzZXIgZGltZW5zaW9uIGluYWNjdXJhY2llc1xuXG4gICAgLy8gb3ZlcmxheVxuICAgIC8vLy8vLy8vLy9cblxuICAgIGlmIChzdHlsZUVuYWJsZWQpIHtcbiAgICAgIGV4MSA9IGJvdW5kcy54MTtcbiAgICAgIGV4MiA9IGJvdW5kcy54MjtcbiAgICAgIGV5MSA9IGJvdW5kcy55MTtcbiAgICAgIGV5MiA9IGJvdW5kcy55MjtcbiAgICAgIHVwZGF0ZUJvdW5kcyhib3VuZHMsIGV4MSAtIHBhZGRpbmcsIGV5MSAtIHBhZGRpbmcsIGV4MiArIHBhZGRpbmcsIGV5MiArIHBhZGRpbmcpO1xuICAgIH1cblxuICAgIC8vIGFsd2F5cyBzdG9yZSB0aGUgYm9keSBib3VuZHMgc2VwYXJhdGVseSBmcm9tIHRoZSBsYWJlbHNcbiAgICB2YXIgYmJPdmVybGF5ID0gX3Aub3ZlcmxheUJvdW5kcyA9IF9wLm92ZXJsYXlCb3VuZHMgfHwge307XG4gICAgYXNzaWduQm91bmRpbmdCb3goYmJPdmVybGF5LCBib3VuZHMpO1xuICAgIGV4cGFuZEJvdW5kaW5nQm94U2lkZXMoYmJPdmVybGF5LCBtYW51YWxFeHBhbnNpb24pO1xuICAgIGV4cGFuZEJvdW5kaW5nQm94KGJiT3ZlcmxheSwgMSk7IC8vIGV4cGFuZCB0byB3b3JrIGFyb3VuZCBicm93c2VyIGRpbWVuc2lvbiBpbmFjY3VyYWNpZXNcblxuICAgIC8vIGhhbmRsZSBsYWJlbCBkaW1lbnNpb25zXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIHZhciBiYkxhYmVscyA9IF9wLmxhYmVsQm91bmRzID0gX3AubGFiZWxCb3VuZHMgfHwge307XG4gICAgaWYgKGJiTGFiZWxzLmFsbCAhPSBudWxsKSB7XG4gICAgICBjbGVhckJvdW5kaW5nQm94KGJiTGFiZWxzLmFsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJiTGFiZWxzLmFsbCA9IG1ha2VCb3VuZGluZ0JveCgpO1xuICAgIH1cbiAgICBpZiAoc3R5bGVFbmFibGVkICYmIG9wdGlvbnMuaW5jbHVkZUxhYmVscykge1xuICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZU1haW5MYWJlbHMpIHtcbiAgICAgICAgdXBkYXRlQm91bmRzRnJvbUxhYmVsKGJvdW5kcywgZWxlLCBudWxsKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0VkZ2UpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZVNvdXJjZUxhYmVscykge1xuICAgICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21MYWJlbChib3VuZHMsIGVsZSwgJ3NvdXJjZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVUYXJnZXRMYWJlbHMpIHtcbiAgICAgICAgICB1cGRhdGVCb3VuZHNGcm9tTGFiZWwoYm91bmRzLCBlbGUsICd0YXJnZXQnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gc3R5bGUgZW5hYmxlZCBmb3IgbGFiZWxzXG4gIH0gLy8gaWYgZGlzcGxheWVkXG5cbiAgYm91bmRzLngxID0gbm9uaW5mKGJvdW5kcy54MSk7XG4gIGJvdW5kcy55MSA9IG5vbmluZihib3VuZHMueTEpO1xuICBib3VuZHMueDIgPSBub25pbmYoYm91bmRzLngyKTtcbiAgYm91bmRzLnkyID0gbm9uaW5mKGJvdW5kcy55Mik7XG4gIGJvdW5kcy53ID0gbm9uaW5mKGJvdW5kcy54MiAtIGJvdW5kcy54MSk7XG4gIGJvdW5kcy5oID0gbm9uaW5mKGJvdW5kcy55MiAtIGJvdW5kcy55MSk7XG4gIGlmIChib3VuZHMudyA+IDAgJiYgYm91bmRzLmggPiAwICYmIGRpc3BsYXllZCkge1xuICAgIGV4cGFuZEJvdW5kaW5nQm94U2lkZXMoYm91bmRzLCBtYW51YWxFeHBhbnNpb24pO1xuXG4gICAgLy8gZXhwYW5kIGJvdW5kcyBieSAxIGJlY2F1c2UgYW50aWFsaWFzaW5nIGNhbiBpbmNyZWFzZSB0aGUgdmlzdWFsL2VmZmVjdGl2ZSBzaXplIGJ5IDEgb24gYWxsIHNpZGVzXG4gICAgZXhwYW5kQm91bmRpbmdCb3goYm91bmRzLCAxKTtcbiAgfVxuICByZXR1cm4gYm91bmRzO1xufTtcbnZhciBnZXRLZXkgPSBmdW5jdGlvbiBnZXRLZXkob3B0cykge1xuICB2YXIgaSA9IDA7XG4gIHZhciB0ZiA9IGZ1bmN0aW9uIHRmKHZhbCkge1xuICAgIHJldHVybiAodmFsID8gMSA6IDApIDw8IGkrKztcbiAgfTtcbiAgdmFyIGtleSA9IDA7XG4gIGtleSArPSB0ZihvcHRzLmluY3VkZU5vZGVzKTtcbiAga2V5ICs9IHRmKG9wdHMuaW5jbHVkZUVkZ2VzKTtcbiAga2V5ICs9IHRmKG9wdHMuaW5jbHVkZUxhYmVscyk7XG4gIGtleSArPSB0ZihvcHRzLmluY2x1ZGVNYWluTGFiZWxzKTtcbiAga2V5ICs9IHRmKG9wdHMuaW5jbHVkZVNvdXJjZUxhYmVscyk7XG4gIGtleSArPSB0ZihvcHRzLmluY2x1ZGVUYXJnZXRMYWJlbHMpO1xuICBrZXkgKz0gdGYob3B0cy5pbmNsdWRlT3ZlcmxheXMpO1xuICByZXR1cm4ga2V5O1xufTtcbnZhciBnZXRCb3VuZGluZ0JveFBvc0tleSA9IGZ1bmN0aW9uIGdldEJvdW5kaW5nQm94UG9zS2V5KGVsZSkge1xuICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgdmFyIHAxID0gZWxlLnNvdXJjZSgpLnBvc2l0aW9uKCk7XG4gICAgdmFyIHAyID0gZWxlLnRhcmdldCgpLnBvc2l0aW9uKCk7XG4gICAgdmFyIHIgPSBmdW5jdGlvbiByKHgpIHtcbiAgICAgIHJldHVybiBNYXRoLnJvdW5kKHgpO1xuICAgIH07XG4gICAgcmV0dXJuIGhhc2hJbnRzQXJyYXkoW3IocDEueCksIHIocDEueSksIHIocDIueCksIHIocDIueSldKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufTtcbnZhciBjYWNoZWRCb3VuZGluZ0JveEltcGwgPSBmdW5jdGlvbiBjYWNoZWRCb3VuZGluZ0JveEltcGwoZWxlLCBvcHRzKSB7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIGJiO1xuICB2YXIgaXNFZGdlID0gZWxlLmlzRWRnZSgpO1xuICB2YXIga2V5ID0gb3B0cyA9PSBudWxsID8gZGVmQmJPcHRzS2V5IDogZ2V0S2V5KG9wdHMpO1xuICB2YXIgdXNpbmdEZWZPcHRzID0ga2V5ID09PSBkZWZCYk9wdHNLZXk7XG4gIHZhciBjdXJyUG9zS2V5ID0gZ2V0Qm91bmRpbmdCb3hQb3NLZXkoZWxlKTtcbiAgdmFyIGlzUG9zS2V5U2FtZSA9IF9wLmJiQ2FjaGVQb3NLZXkgPT09IGN1cnJQb3NLZXk7XG4gIHZhciB1c2VDYWNoZSA9IG9wdHMudXNlQ2FjaGUgJiYgaXNQb3NLZXlTYW1lO1xuICB2YXIgaXNEaXJ0eSA9IGZ1bmN0aW9uIGlzRGlydHkoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5iYkNhY2hlID09IG51bGwgfHwgZWxlLl9wcml2YXRlLnN0eWxlRGlydHk7XG4gIH07XG4gIHZhciBuZWVkUmVjYWxjID0gIXVzZUNhY2hlIHx8IGlzRGlydHkoZWxlKSB8fCBpc0VkZ2UgJiYgaXNEaXJ0eShlbGUuc291cmNlKCkpIHx8IGlzRGlydHkoZWxlLnRhcmdldCgpKTtcbiAgaWYgKG5lZWRSZWNhbGMpIHtcbiAgICBpZiAoIWlzUG9zS2V5U2FtZSkge1xuICAgICAgZWxlLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZSh1c2VDYWNoZSk7XG4gICAgfVxuICAgIGJiID0gYm91bmRpbmdCb3hJbXBsKGVsZSwgZGVmQmJPcHRzKTtcbiAgICBfcC5iYkNhY2hlID0gYmI7XG4gICAgX3AuYmJDYWNoZVBvc0tleSA9IGN1cnJQb3NLZXk7XG4gIH0gZWxzZSB7XG4gICAgYmIgPSBfcC5iYkNhY2hlO1xuICB9XG5cbiAgLy8gbm90IHVzaW5nIGRlZiBvcHRzID0+IG5lZWQgdG8gYnVpbGQgdXAgYmIgZnJvbSBjb21iaW5hdGlvbiBvZiBzdWIgYmJzXG4gIGlmICghdXNpbmdEZWZPcHRzKSB7XG4gICAgdmFyIGlzTm9kZSA9IGVsZS5pc05vZGUoKTtcbiAgICBiYiA9IG1ha2VCb3VuZGluZ0JveCgpO1xuICAgIGlmIChvcHRzLmluY2x1ZGVOb2RlcyAmJiBpc05vZGUgfHwgb3B0cy5pbmNsdWRlRWRnZXMgJiYgIWlzTm9kZSkge1xuICAgICAgaWYgKG9wdHMuaW5jbHVkZU92ZXJsYXlzKSB7XG4gICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21Cb3goYmIsIF9wLm92ZXJsYXlCb3VuZHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXBkYXRlQm91bmRzRnJvbUJveChiYiwgX3AuYm9keUJvdW5kcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRzLmluY2x1ZGVMYWJlbHMpIHtcbiAgICAgIGlmIChvcHRzLmluY2x1ZGVNYWluTGFiZWxzICYmICghaXNFZGdlIHx8IG9wdHMuaW5jbHVkZVNvdXJjZUxhYmVscyAmJiBvcHRzLmluY2x1ZGVUYXJnZXRMYWJlbHMpKSB7XG4gICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21Cb3goYmIsIF9wLmxhYmVsQm91bmRzLmFsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3B0cy5pbmNsdWRlTWFpbkxhYmVscykge1xuICAgICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21Cb3goYmIsIF9wLmxhYmVsQm91bmRzLm1haW5Sb3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLmluY2x1ZGVTb3VyY2VMYWJlbHMpIHtcbiAgICAgICAgICB1cGRhdGVCb3VuZHNGcm9tQm94KGJiLCBfcC5sYWJlbEJvdW5kcy5zb3VyY2VSb3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLmluY2x1ZGVUYXJnZXRMYWJlbHMpIHtcbiAgICAgICAgICB1cGRhdGVCb3VuZHNGcm9tQm94KGJiLCBfcC5sYWJlbEJvdW5kcy50YXJnZXRSb3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGJiLncgPSBiYi54MiAtIGJiLngxO1xuICAgIGJiLmggPSBiYi55MiAtIGJiLnkxO1xuICB9XG4gIHJldHVybiBiYjtcbn07XG52YXIgZGVmQmJPcHRzID0ge1xuICBpbmNsdWRlTm9kZXM6IHRydWUsXG4gIGluY2x1ZGVFZGdlczogdHJ1ZSxcbiAgaW5jbHVkZUxhYmVsczogdHJ1ZSxcbiAgaW5jbHVkZU1haW5MYWJlbHM6IHRydWUsXG4gIGluY2x1ZGVTb3VyY2VMYWJlbHM6IHRydWUsXG4gIGluY2x1ZGVUYXJnZXRMYWJlbHM6IHRydWUsXG4gIGluY2x1ZGVPdmVybGF5czogdHJ1ZSxcbiAgaW5jbHVkZVVuZGVybGF5czogdHJ1ZSxcbiAgdXNlQ2FjaGU6IHRydWVcbn07XG52YXIgZGVmQmJPcHRzS2V5ID0gZ2V0S2V5KGRlZkJiT3B0cyk7XG52YXIgZmlsbGVkQmJPcHRzID0gZGVmYXVsdHMkZyhkZWZCYk9wdHMpO1xuZWxlc2ZuJGIuYm91bmRpbmdCb3ggPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICB2YXIgYm91bmRzO1xuXG4gIC8vIHRoZSBtYWluIHVzZWNhc2UgaXMgZWxlLmJvdW5kaW5nQm94KCkgZm9yIGEgc2luZ2xlIGVsZW1lbnQgd2l0aCBuby9kZWYgb3B0aW9uc1xuICAvLyBzcGVjaWZpZWQgcy50LiB0aGUgY2FjaGUgaXMgdXNlZCwgc28gY2hlY2sgZm9yIHRoaXMgY2FzZSB0byBtYWtlIGl0IGZhc3RlciBieVxuICAvLyBhdm9pZGluZyB0aGUgb3ZlcmhlYWQgb2YgdGhlIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uXG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzWzBdLl9wcml2YXRlLmJiQ2FjaGUgIT0gbnVsbCAmJiAhdGhpc1swXS5fcHJpdmF0ZS5zdHlsZURpcnR5ICYmIChvcHRpb25zID09PSB1bmRlZmluZWQgfHwgb3B0aW9ucy51c2VDYWNoZSA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMudXNlQ2FjaGUgPT09IHRydWUpKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3B0aW9ucyA9IGRlZkJiT3B0cztcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IGZpbGxlZEJiT3B0cyhvcHRpb25zKTtcbiAgICB9XG4gICAgYm91bmRzID0gY2FjaGVkQm91bmRpbmdCb3hJbXBsKHRoaXNbMF0sIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIGJvdW5kcyA9IG1ha2VCb3VuZGluZ0JveCgpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IGRlZkJiT3B0cztcbiAgICB2YXIgb3B0cyA9IGZpbGxlZEJiT3B0cyhvcHRpb25zKTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIGN5ID0gZWxlcy5jeSgpO1xuICAgIHZhciBzdHlsZUVuYWJsZWQgPSBjeS5zdHlsZUVuYWJsZWQoKTtcbiAgICBpZiAoc3R5bGVFbmFibGVkKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgICAgdmFyIGN1cnJQb3NLZXkgPSBnZXRCb3VuZGluZ0JveFBvc0tleShlbGUpO1xuICAgICAgICB2YXIgaXNQb3NLZXlTYW1lID0gX3AuYmJDYWNoZVBvc0tleSA9PT0gY3VyclBvc0tleTtcbiAgICAgICAgdmFyIHVzZUNhY2hlID0gb3B0cy51c2VDYWNoZSAmJiBpc1Bvc0tleVNhbWUgJiYgIV9wLnN0eWxlRGlydHk7XG4gICAgICAgIGVsZS5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUodXNlQ2FjaGUpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNvbXBvdW5kQm91bmRzKCFvcHRpb25zLnVzZUNhY2hlKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZWxlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfZWxlID0gZWxlc1tfaV07XG4gICAgICB1cGRhdGVCb3VuZHNGcm9tQm94KGJvdW5kcywgY2FjaGVkQm91bmRpbmdCb3hJbXBsKF9lbGUsIG9wdHMpKTtcbiAgICB9XG4gIH1cbiAgYm91bmRzLngxID0gbm9uaW5mKGJvdW5kcy54MSk7XG4gIGJvdW5kcy55MSA9IG5vbmluZihib3VuZHMueTEpO1xuICBib3VuZHMueDIgPSBub25pbmYoYm91bmRzLngyKTtcbiAgYm91bmRzLnkyID0gbm9uaW5mKGJvdW5kcy55Mik7XG4gIGJvdW5kcy53ID0gbm9uaW5mKGJvdW5kcy54MiAtIGJvdW5kcy54MSk7XG4gIGJvdW5kcy5oID0gbm9uaW5mKGJvdW5kcy55MiAtIGJvdW5kcy55MSk7XG4gIHJldHVybiBib3VuZHM7XG59O1xuZWxlc2ZuJGIuZGlydHlCb3VuZGluZ0JveENhY2hlID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgX3AgPSB0aGlzW2ldLl9wcml2YXRlO1xuICAgIF9wLmJiQ2FjaGUgPSBudWxsO1xuICAgIF9wLmJiQ2FjaGVQb3NLZXkgPSBudWxsO1xuICAgIF9wLmJvZHlCb3VuZHMgPSBudWxsO1xuICAgIF9wLm92ZXJsYXlCb3VuZHMgPSBudWxsO1xuICAgIF9wLmxhYmVsQm91bmRzLmFsbCA9IG51bGw7XG4gICAgX3AubGFiZWxCb3VuZHMuc291cmNlID0gbnVsbDtcbiAgICBfcC5sYWJlbEJvdW5kcy50YXJnZXQgPSBudWxsO1xuICAgIF9wLmxhYmVsQm91bmRzLm1haW4gPSBudWxsO1xuICAgIF9wLmxhYmVsQm91bmRzLnNvdXJjZVJvdCA9IG51bGw7XG4gICAgX3AubGFiZWxCb3VuZHMudGFyZ2V0Um90ID0gbnVsbDtcbiAgICBfcC5sYWJlbEJvdW5kcy5tYWluUm90ID0gbnVsbDtcbiAgICBfcC5hcnJvd0JvdW5kcy5zb3VyY2UgPSBudWxsO1xuICAgIF9wLmFycm93Qm91bmRzLnRhcmdldCA9IG51bGw7XG4gICAgX3AuYXJyb3dCb3VuZHNbJ21pZC1zb3VyY2UnXSA9IG51bGw7XG4gICAgX3AuYXJyb3dCb3VuZHNbJ21pZC10YXJnZXQnXSA9IG51bGw7XG4gIH1cbiAgdGhpcy5lbWl0QW5kTm90aWZ5KCdib3VuZHMnKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBwcml2YXRlIGhlbHBlciB0byBnZXQgYm91bmRpbmcgYm94IGZvciBjdXN0b20gbm9kZSBwb3NpdGlvbnNcbi8vIC0gZ29vZCBmb3IgcGVyZiBpbiBjZXJ0YWluIGNhc2VzIGJ1dCBjdXJyZW50bHkgcmVxdWlyZXMgZGlydHlpbmcgdGhlIHJlbmRlcmVkIHN0eWxlXG4vLyAtIHdvdWxkIGJlIGJldHRlciB0byBub3QgbW9kaWZ5IHRoZSBub2RlcyBidXQgdGhlIG5vZGVzIGFyZSByZWFkIGRpcmVjdGx5IGV2ZXJ5d2hlcmUgaW4gdGhlIHJlbmRlcmVyLi4uXG4vLyAtIHRyeSB0byB1c2UgZm9yIG9ubHkgdGhpbmdzIGxpa2UgZGlzY3JldGUgbGF5b3V0cyB3aGVyZSB0aGUgbm9kZSBwb3NpdGlvbiB3b3VsZCBjaGFuZ2UgYW55d2F5XG5lbGVzZm4kYi5ib3VuZGluZ0JveEF0ID0gZnVuY3Rpb24gKGZuKSB7XG4gIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICB2YXIgaGFzQ29tcG91bmROb2RlcyA9IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgdmFyIHBhcmVudHMgPSBjeS5jb2xsZWN0aW9uKCk7XG4gIGlmIChoYXNDb21wb3VuZE5vZGVzKSB7XG4gICAgcGFyZW50cyA9IG5vZGVzLmZpbHRlcihmdW5jdGlvbiAobm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGUuaXNQYXJlbnQoKTtcbiAgICB9KTtcbiAgICBub2RlcyA9IG5vZGVzLm5vdChwYXJlbnRzKTtcbiAgfVxuICBpZiAocGxhaW5PYmplY3QoZm4pKSB7XG4gICAgdmFyIG9iaiA9IGZuO1xuICAgIGZuID0gZnVuY3Rpb24gZm4oKSB7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH07XG4gIH1cbiAgdmFyIHN0b3JlT2xkUG9zID0gZnVuY3Rpb24gc3RvcmVPbGRQb3Mobm9kZSwgaSkge1xuICAgIHJldHVybiBub2RlLl9wcml2YXRlLmJiQXRPbGRQb3MgPSBmbihub2RlLCBpKTtcbiAgfTtcbiAgdmFyIGdldE9sZFBvcyA9IGZ1bmN0aW9uIGdldE9sZFBvcyhub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuX3ByaXZhdGUuYmJBdE9sZFBvcztcbiAgfTtcbiAgY3kuc3RhcnRCYXRjaCgpO1xuICBub2Rlcy5mb3JFYWNoKHN0b3JlT2xkUG9zKS5zaWxlbnRQb3NpdGlvbnMoZm4pO1xuICBpZiAoaGFzQ29tcG91bmROb2Rlcykge1xuICAgIHBhcmVudHMuZGlydHlDb21wb3VuZEJvdW5kc0NhY2hlKCk7XG4gICAgcGFyZW50cy5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcbiAgICBwYXJlbnRzLnVwZGF0ZUNvbXBvdW5kQm91bmRzKHRydWUpOyAvLyBmb3JjZSB1cGRhdGUgYi9jIHdlJ3JlIGluc2lkZSBhIGJhdGNoIGN5Y2xlXG4gIH1cblxuICB2YXIgYmIgPSBjb3B5Qm91bmRpbmdCb3godGhpcy5ib3VuZGluZ0JveCh7XG4gICAgdXNlQ2FjaGU6IGZhbHNlXG4gIH0pKTtcbiAgbm9kZXMuc2lsZW50UG9zaXRpb25zKGdldE9sZFBvcyk7XG4gIGlmIChoYXNDb21wb3VuZE5vZGVzKSB7XG4gICAgcGFyZW50cy5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUoKTtcbiAgICBwYXJlbnRzLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpO1xuICAgIHBhcmVudHMudXBkYXRlQ29tcG91bmRCb3VuZHModHJ1ZSk7IC8vIGZvcmNlIHVwZGF0ZSBiL2Mgd2UncmUgaW5zaWRlIGEgYmF0Y2ggY3ljbGVcbiAgfVxuXG4gIGN5LmVuZEJhdGNoKCk7XG4gIHJldHVybiBiYjtcbn07XG5mbiQzLmJvdW5kaW5nYm94ID0gZm4kMy5iYiA9IGZuJDMuYm91bmRpbmdCb3g7XG5mbiQzLnJlbmRlcmVkQm91bmRpbmdib3ggPSBmbiQzLnJlbmRlcmVkQm91bmRpbmdCb3g7XG52YXIgYm91bmRzID0gZWxlc2ZuJGI7XG5cbnZhciBmbiQyLCBlbGVzZm4kYTtcbmZuJDIgPSBlbGVzZm4kYSA9IHt9O1xudmFyIGRlZmluZURpbUZucyA9IGZ1bmN0aW9uIGRlZmluZURpbUZucyhvcHRzKSB7XG4gIG9wdHMudXBwZXJjYXNlTmFtZSA9IGNhcGl0YWxpemUob3B0cy5uYW1lKTtcbiAgb3B0cy5hdXRvTmFtZSA9ICdhdXRvJyArIG9wdHMudXBwZXJjYXNlTmFtZTtcbiAgb3B0cy5sYWJlbE5hbWUgPSAnbGFiZWwnICsgb3B0cy51cHBlcmNhc2VOYW1lO1xuICBvcHRzLm91dGVyTmFtZSA9ICdvdXRlcicgKyBvcHRzLnVwcGVyY2FzZU5hbWU7XG4gIG9wdHMudXBwZXJjYXNlT3V0ZXJOYW1lID0gY2FwaXRhbGl6ZShvcHRzLm91dGVyTmFtZSk7XG4gIGZuJDJbb3B0cy5uYW1lXSA9IGZ1bmN0aW9uIGRpbUltcGwoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgIHZhciBjeSA9IF9wLmN5O1xuICAgIHZhciBzdHlsZUVuYWJsZWQgPSBjeS5fcHJpdmF0ZS5zdHlsZUVuYWJsZWQ7XG4gICAgaWYgKGVsZSkge1xuICAgICAgaWYgKHN0eWxlRW5hYmxlZCkge1xuICAgICAgICBpZiAoZWxlLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICBlbGUudXBkYXRlQ29tcG91bmRCb3VuZHMoKTtcbiAgICAgICAgICByZXR1cm4gX3Bbb3B0cy5hdXRvTmFtZV0gfHwgMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZCA9IGVsZS5wc3R5bGUob3B0cy5uYW1lKTtcbiAgICAgICAgc3dpdGNoIChkLnN0clZhbHVlKSB7XG4gICAgICAgICAgY2FzZSAnbGFiZWwnOlxuICAgICAgICAgICAgZWxlLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZSgpO1xuICAgICAgICAgICAgcmV0dXJuIF9wLnJzdHlsZVtvcHRzLmxhYmVsTmFtZV0gfHwgMDtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGQucGZWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBmbiQyWydvdXRlcicgKyBvcHRzLnVwcGVyY2FzZU5hbWVdID0gZnVuY3Rpb24gb3V0ZXJEaW1JbXBsKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICB2YXIgY3kgPSBfcC5jeTtcbiAgICB2YXIgc3R5bGVFbmFibGVkID0gY3kuX3ByaXZhdGUuc3R5bGVFbmFibGVkO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIGlmIChzdHlsZUVuYWJsZWQpIHtcbiAgICAgICAgdmFyIGRpbSA9IGVsZVtvcHRzLm5hbWVdKCk7XG4gICAgICAgIHZhciBib3JkZXIgPSBlbGUucHN0eWxlKCdib3JkZXItd2lkdGgnKS5wZlZhbHVlOyAvLyBuLmIuIDEvMiBlYWNoIHNpZGVcbiAgICAgICAgdmFyIHBhZGRpbmcgPSAyICogZWxlLnBhZGRpbmcoKTtcbiAgICAgICAgcmV0dXJuIGRpbSArIGJvcmRlciArIHBhZGRpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGZuJDJbJ3JlbmRlcmVkJyArIG9wdHMudXBwZXJjYXNlTmFtZV0gPSBmdW5jdGlvbiByZW5kZXJlZERpbUltcGwoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgdmFyIGQgPSBlbGVbb3B0cy5uYW1lXSgpO1xuICAgICAgcmV0dXJuIGQgKiB0aGlzLmN5KCkuem9vbSgpO1xuICAgIH1cbiAgfTtcbiAgZm4kMlsncmVuZGVyZWQnICsgb3B0cy51cHBlcmNhc2VPdXRlck5hbWVdID0gZnVuY3Rpb24gcmVuZGVyZWRPdXRlckRpbUltcGwoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgdmFyIG9kID0gZWxlW29wdHMub3V0ZXJOYW1lXSgpO1xuICAgICAgcmV0dXJuIG9kICogdGhpcy5jeSgpLnpvb20oKTtcbiAgICB9XG4gIH07XG59O1xuZGVmaW5lRGltRm5zKHtcbiAgbmFtZTogJ3dpZHRoJ1xufSk7XG5kZWZpbmVEaW1GbnMoe1xuICBuYW1lOiAnaGVpZ2h0J1xufSk7XG5lbGVzZm4kYS5wYWRkaW5nID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICBpZiAoZWxlLmlzUGFyZW50KCkpIHtcbiAgICBlbGUudXBkYXRlQ29tcG91bmRCb3VuZHMoKTtcbiAgICBpZiAoX3AuYXV0b1BhZGRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIF9wLmF1dG9QYWRkaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWxlLnBzdHlsZSgncGFkZGluZycpLnBmVmFsdWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBlbGUucHN0eWxlKCdwYWRkaW5nJykucGZWYWx1ZTtcbiAgfVxufTtcbmVsZXNmbiRhLnBhZGRlZEhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIHJldHVybiBlbGUuaGVpZ2h0KCkgKyAyICogZWxlLnBhZGRpbmcoKTtcbn07XG5lbGVzZm4kYS5wYWRkZWRXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIHJldHVybiBlbGUud2lkdGgoKSArIDIgKiBlbGUucGFkZGluZygpO1xufTtcbnZhciB3aWR0aEhlaWdodCA9IGVsZXNmbiRhO1xuXG52YXIgaWZFZGdlID0gZnVuY3Rpb24gaWZFZGdlKGVsZSwgZ2V0VmFsdWUpIHtcbiAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgIHJldHVybiBnZXRWYWx1ZShlbGUpO1xuICB9XG59O1xudmFyIGlmRWRnZVJlbmRlcmVkUG9zaXRpb24gPSBmdW5jdGlvbiBpZkVkZ2VSZW5kZXJlZFBvc2l0aW9uKGVsZSwgZ2V0UG9pbnQpIHtcbiAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgIHZhciBjeSA9IGVsZS5jeSgpO1xuICAgIHJldHVybiBtb2RlbFRvUmVuZGVyZWRQb3NpdGlvbihnZXRQb2ludChlbGUpLCBjeS56b29tKCksIGN5LnBhbigpKTtcbiAgfVxufTtcbnZhciBpZkVkZ2VSZW5kZXJlZFBvc2l0aW9ucyA9IGZ1bmN0aW9uIGlmRWRnZVJlbmRlcmVkUG9zaXRpb25zKGVsZSwgZ2V0UG9pbnRzKSB7XG4gIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICB2YXIgY3kgPSBlbGUuY3koKTtcbiAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgcmV0dXJuIGdldFBvaW50cyhlbGUpLm1hcChmdW5jdGlvbiAocCkge1xuICAgICAgcmV0dXJuIG1vZGVsVG9SZW5kZXJlZFBvc2l0aW9uKHAsIHpvb20sIHBhbik7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgY29udHJvbFBvaW50cyA9IGZ1bmN0aW9uIGNvbnRyb2xQb2ludHMoZWxlKSB7XG4gIHJldHVybiBlbGUucmVuZGVyZXIoKS5nZXRDb250cm9sUG9pbnRzKGVsZSk7XG59O1xudmFyIHNlZ21lbnRQb2ludHMgPSBmdW5jdGlvbiBzZWdtZW50UG9pbnRzKGVsZSkge1xuICByZXR1cm4gZWxlLnJlbmRlcmVyKCkuZ2V0U2VnbWVudFBvaW50cyhlbGUpO1xufTtcbnZhciBzb3VyY2VFbmRwb2ludCA9IGZ1bmN0aW9uIHNvdXJjZUVuZHBvaW50KGVsZSkge1xuICByZXR1cm4gZWxlLnJlbmRlcmVyKCkuZ2V0U291cmNlRW5kcG9pbnQoZWxlKTtcbn07XG52YXIgdGFyZ2V0RW5kcG9pbnQgPSBmdW5jdGlvbiB0YXJnZXRFbmRwb2ludChlbGUpIHtcbiAgcmV0dXJuIGVsZS5yZW5kZXJlcigpLmdldFRhcmdldEVuZHBvaW50KGVsZSk7XG59O1xudmFyIG1pZHBvaW50ID0gZnVuY3Rpb24gbWlkcG9pbnQoZWxlKSB7XG4gIHJldHVybiBlbGUucmVuZGVyZXIoKS5nZXRFZGdlTWlkcG9pbnQoZWxlKTtcbn07XG52YXIgcHRzID0ge1xuICBjb250cm9sUG9pbnRzOiB7XG4gICAgZ2V0OiBjb250cm9sUG9pbnRzLFxuICAgIG11bHQ6IHRydWVcbiAgfSxcbiAgc2VnbWVudFBvaW50czoge1xuICAgIGdldDogc2VnbWVudFBvaW50cyxcbiAgICBtdWx0OiB0cnVlXG4gIH0sXG4gIHNvdXJjZUVuZHBvaW50OiB7XG4gICAgZ2V0OiBzb3VyY2VFbmRwb2ludFxuICB9LFxuICB0YXJnZXRFbmRwb2ludDoge1xuICAgIGdldDogdGFyZ2V0RW5kcG9pbnRcbiAgfSxcbiAgbWlkcG9pbnQ6IHtcbiAgICBnZXQ6IG1pZHBvaW50XG4gIH1cbn07XG52YXIgcmVuZGVyZWROYW1lID0gZnVuY3Rpb24gcmVuZGVyZWROYW1lKG5hbWUpIHtcbiAgcmV0dXJuICdyZW5kZXJlZCcgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnN1YnN0cigxKTtcbn07XG52YXIgZWRnZVBvaW50cyA9IE9iamVjdC5rZXlzKHB0cykucmVkdWNlKGZ1bmN0aW9uIChvYmosIG5hbWUpIHtcbiAgdmFyIHNwZWMgPSBwdHNbbmFtZV07XG4gIHZhciByTmFtZSA9IHJlbmRlcmVkTmFtZShuYW1lKTtcbiAgb2JqW25hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpZkVkZ2UodGhpcywgc3BlYy5nZXQpO1xuICB9O1xuICBpZiAoc3BlYy5tdWx0KSB7XG4gICAgb2JqW3JOYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBpZkVkZ2VSZW5kZXJlZFBvc2l0aW9ucyh0aGlzLCBzcGVjLmdldCk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBvYmpbck5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGlmRWRnZVJlbmRlcmVkUG9zaXRpb24odGhpcywgc3BlYy5nZXQpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIG9iajtcbn0sIHt9KTtcblxudmFyIGRpbWVuc2lvbnMgPSBleHRlbmQoe30sIHBvc2l0aW9uLCBib3VuZHMsIHdpZHRoSGVpZ2h0LCBlZGdlUG9pbnRzKTtcblxuLyohXG5FdmVudCBvYmplY3QgYmFzZWQgb24galF1ZXJ5IGV2ZW50cywgTUlUIGxpY2Vuc2VcblxuaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2UvXG5odHRwczovL3RsZHJsZWdhbC5jb20vbGljZW5zZS9taXQtbGljZW5zZVxuaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvYmxvYi9tYXN0ZXIvc3JjL2V2ZW50LmpzXG4qL1xuXG52YXIgRXZlbnQgPSBmdW5jdGlvbiBFdmVudChzcmMsIHByb3BzKSB7XG4gIHRoaXMucmVjeWNsZShzcmMsIHByb3BzKTtcbn07XG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbFxuRXZlbnQucHJvdG90eXBlID0ge1xuICBpbnN0YW5jZVN0cmluZzogZnVuY3Rpb24gaW5zdGFuY2VTdHJpbmcoKSB7XG4gICAgcmV0dXJuICdldmVudCc7XG4gIH0sXG4gIHJlY3ljbGU6IGZ1bmN0aW9uIHJlY3ljbGUoc3JjLCBwcm9wcykge1xuICAgIHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSByZXR1cm5GYWxzZTtcbiAgICBpZiAoc3JjICE9IG51bGwgJiYgc3JjLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAvLyBCcm93c2VyIEV2ZW50IG9iamVjdFxuICAgICAgdGhpcy50eXBlID0gc3JjLnR5cGU7XG5cbiAgICAgIC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkXG4gICAgICAvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgPyByZXR1cm5UcnVlIDogcmV0dXJuRmFsc2U7XG4gICAgfSBlbHNlIGlmIChzcmMgIT0gbnVsbCAmJiBzcmMudHlwZSkge1xuICAgICAgLy8gUGxhaW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIGV2ZW50IGRldGFpbHNcbiAgICAgIHByb3BzID0gc3JjO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFdmVudCBzdHJpbmdcbiAgICAgIHRoaXMudHlwZSA9IHNyYztcbiAgICB9XG5cbiAgICAvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdFxuICAgIGlmIChwcm9wcyAhPSBudWxsKSB7XG4gICAgICAvLyBtb3JlIGVmZmljaWVudCB0byBtYW51YWxseSBjb3B5IGZpZWxkcyB3ZSB1c2VcbiAgICAgIHRoaXMub3JpZ2luYWxFdmVudCA9IHByb3BzLm9yaWdpbmFsRXZlbnQ7XG4gICAgICB0aGlzLnR5cGUgPSBwcm9wcy50eXBlICE9IG51bGwgPyBwcm9wcy50eXBlIDogdGhpcy50eXBlO1xuICAgICAgdGhpcy5jeSA9IHByb3BzLmN5O1xuICAgICAgdGhpcy50YXJnZXQgPSBwcm9wcy50YXJnZXQ7XG4gICAgICB0aGlzLnBvc2l0aW9uID0gcHJvcHMucG9zaXRpb247XG4gICAgICB0aGlzLnJlbmRlcmVkUG9zaXRpb24gPSBwcm9wcy5yZW5kZXJlZFBvc2l0aW9uO1xuICAgICAgdGhpcy5uYW1lc3BhY2UgPSBwcm9wcy5uYW1lc3BhY2U7XG4gICAgICB0aGlzLmxheW91dCA9IHByb3BzLmxheW91dDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3kgIT0gbnVsbCAmJiB0aGlzLnBvc2l0aW9uICE9IG51bGwgJiYgdGhpcy5yZW5kZXJlZFBvc2l0aW9uID09IG51bGwpIHtcbiAgICAgIC8vIGNyZWF0ZSBhIHJlbmRlcmVkIHBvc2l0aW9uIGJhc2VkIG9uIHRoZSBwYXNzZWQgcG9zaXRpb25cbiAgICAgIHZhciBwb3MgPSB0aGlzLnBvc2l0aW9uO1xuICAgICAgdmFyIHpvb20gPSB0aGlzLmN5Lnpvb20oKTtcbiAgICAgIHZhciBwYW4gPSB0aGlzLmN5LnBhbigpO1xuICAgICAgdGhpcy5yZW5kZXJlZFBvc2l0aW9uID0ge1xuICAgICAgICB4OiBwb3MueCAqIHpvb20gKyBwYW4ueCxcbiAgICAgICAgeTogcG9zLnkgKiB6b29tICsgcGFuLnlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmVcbiAgICB0aGlzLnRpbWVTdGFtcCA9IHNyYyAmJiBzcmMudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG4gIH0sXG4gIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7XG4gICAgdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG4gICAgaWYgKCFlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgcHJldmVudERlZmF1bHQgZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnRcbiAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSxcbiAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24oKSB7XG4gICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG4gICAgdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG4gICAgaWYgKCFlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgc3RvcFByb3BhZ2F0aW9uIGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50XG4gICAgaWYgKGUuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgfSxcbiAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbiBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSB7XG4gICAgdGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG4gICAgdGhpcy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfSxcbiAgaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSxcbiAgaXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuICBpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2Vcbn07XG5cbnZhciBldmVudFJlZ2V4ID0gL14oW14uXSspKFxcLig/OlteLl0rKSk/JC87IC8vIHJlZ2V4IGZvciBtYXRjaGluZyBldmVudCBzdHJpbmdzIChlLmcuIFwiY2xpY2submFtZXNwYWNlXCIpXG52YXIgdW5pdmVyc2FsTmFtZXNwYWNlID0gJy4qJzsgLy8gbWF0Y2hlcyBhcyBpZiBubyBuYW1lc3BhY2Ugc3BlY2lmaWVkIGFuZCBwcmV2ZW50cyB1c2VycyBmcm9tIHVuYmluZGluZyBhY2NpZGVudGFsbHlcblxudmFyIGRlZmF1bHRzJDggPSB7XG4gIHF1YWxpZmllckNvbXBhcmU6IGZ1bmN0aW9uIHF1YWxpZmllckNvbXBhcmUocTEsIHEyKSB7XG4gICAgcmV0dXJuIHExID09PSBxMjtcbiAgfSxcbiAgZXZlbnRNYXRjaGVzOiBmdW5jdGlvbiBldmVudE1hdGNoZXMoIC8qY29udGV4dCwgbGlzdGVuZXIsIGV2ZW50T2JqKi9cbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGFkZEV2ZW50RmllbGRzOiBmdW5jdGlvbiBhZGRFdmVudEZpZWxkcyggLypjb250ZXh0LCBldnQqL1xuICApIHt9LFxuICBjYWxsYmFja0NvbnRleHQ6IGZ1bmN0aW9uIGNhbGxiYWNrQ29udGV4dChjb250ZXh0IC8qLCBsaXN0ZW5lciwgZXZlbnRPYmoqLykge1xuICAgIHJldHVybiBjb250ZXh0O1xuICB9LFxuICBiZWZvcmVFbWl0OiBmdW5jdGlvbiBiZWZvcmVFbWl0KCAvKiBjb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmogKi9cbiAgKSB7fSxcbiAgYWZ0ZXJFbWl0OiBmdW5jdGlvbiBhZnRlckVtaXQoIC8qIGNvbnRleHQsIGxpc3RlbmVyLCBldmVudE9iaiAqL1xuICApIHt9LFxuICBidWJibGU6IGZ1bmN0aW9uIGJ1YmJsZSggLypjb250ZXh0Ki9cbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBwYXJlbnQ6IGZ1bmN0aW9uIHBhcmVudCggLypjb250ZXh0Ki9cbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG4gIGNvbnRleHQ6IG51bGxcbn07XG52YXIgZGVmYXVsdHNLZXlzID0gT2JqZWN0LmtleXMoZGVmYXVsdHMkOCk7XG52YXIgZW1wdHlPcHRzID0ge307XG5mdW5jdGlvbiBFbWl0dGVyKCkge1xuICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZW1wdHlPcHRzO1xuICB2YXIgY29udGV4dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAvLyBtaWNyby1vcHRpbWlzYXRpb24gdnMgT2JqZWN0LmFzc2lnbigpIC0tIHJlZHVjZXMgRWxlbWVudCBpbnN0YW50aWF0aW9uIHRpbWVcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWZhdWx0c0tleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gZGVmYXVsdHNLZXlzW2ldO1xuICAgIHRoaXNba2V5XSA9IG9wdHNba2V5XSB8fCBkZWZhdWx0cyQ4W2tleV07XG4gIH1cbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dCB8fCB0aGlzLmNvbnRleHQ7XG4gIHRoaXMubGlzdGVuZXJzID0gW107XG4gIHRoaXMuZW1pdHRpbmcgPSAwO1xufVxudmFyIHAgPSBFbWl0dGVyLnByb3RvdHlwZTtcbnZhciBmb3JFYWNoRXZlbnQgPSBmdW5jdGlvbiBmb3JFYWNoRXZlbnQoc2VsZiwgaGFuZGxlciwgZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mLCBjb25mT3ZlcnJpZGVzKSB7XG4gIGlmIChmbiQ2KHF1YWxpZmllcikpIHtcbiAgICBjYWxsYmFjayA9IHF1YWxpZmllcjtcbiAgICBxdWFsaWZpZXIgPSBudWxsO1xuICB9XG4gIGlmIChjb25mT3ZlcnJpZGVzKSB7XG4gICAgaWYgKGNvbmYgPT0gbnVsbCkge1xuICAgICAgY29uZiA9IGNvbmZPdmVycmlkZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmYgPSBleHRlbmQoe30sIGNvbmYsIGNvbmZPdmVycmlkZXMpO1xuICAgIH1cbiAgfVxuICB2YXIgZXZlbnRMaXN0ID0gYXJyYXkoZXZlbnRzKSA/IGV2ZW50cyA6IGV2ZW50cy5zcGxpdCgvXFxzKy8pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50TGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBldnQgPSBldmVudExpc3RbaV07XG4gICAgaWYgKGVtcHR5U3RyaW5nKGV2dCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgbWF0Y2ggPSBldnQubWF0Y2goZXZlbnRSZWdleCk7IC8vIHR5cGVbLm5hbWVzcGFjZV1cblxuICAgIGlmIChtYXRjaCkge1xuICAgICAgdmFyIHR5cGUgPSBtYXRjaFsxXTtcbiAgICAgIHZhciBuYW1lc3BhY2UgPSBtYXRjaFsyXSA/IG1hdGNoWzJdIDogbnVsbDtcbiAgICAgIHZhciByZXQgPSBoYW5kbGVyKHNlbGYsIGV2dCwgdHlwZSwgbmFtZXNwYWNlLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mKTtcbiAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvLyBhbGxvdyBleGl0aW5nIGVhcmx5XG4gICAgfVxuICB9XG59O1xuXG52YXIgbWFrZUV2ZW50T2JqID0gZnVuY3Rpb24gbWFrZUV2ZW50T2JqKHNlbGYsIG9iaikge1xuICBzZWxmLmFkZEV2ZW50RmllbGRzKHNlbGYuY29udGV4dCwgb2JqKTtcbiAgcmV0dXJuIG5ldyBFdmVudChvYmoudHlwZSwgb2JqKTtcbn07XG52YXIgZm9yRWFjaEV2ZW50T2JqID0gZnVuY3Rpb24gZm9yRWFjaEV2ZW50T2JqKHNlbGYsIGhhbmRsZXIsIGV2ZW50cykge1xuICBpZiAoZXZlbnQoZXZlbnRzKSkge1xuICAgIGhhbmRsZXIoc2VsZiwgZXZlbnRzKTtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAocGxhaW5PYmplY3QoZXZlbnRzKSkge1xuICAgIGhhbmRsZXIoc2VsZiwgbWFrZUV2ZW50T2JqKHNlbGYsIGV2ZW50cykpO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgZXZlbnRMaXN0ID0gYXJyYXkoZXZlbnRzKSA/IGV2ZW50cyA6IGV2ZW50cy5zcGxpdCgvXFxzKy8pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50TGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBldnQgPSBldmVudExpc3RbaV07XG4gICAgaWYgKGVtcHR5U3RyaW5nKGV2dCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgbWF0Y2ggPSBldnQubWF0Y2goZXZlbnRSZWdleCk7IC8vIHR5cGVbLm5hbWVzcGFjZV1cblxuICAgIGlmIChtYXRjaCkge1xuICAgICAgdmFyIHR5cGUgPSBtYXRjaFsxXTtcbiAgICAgIHZhciBuYW1lc3BhY2UgPSBtYXRjaFsyXSA/IG1hdGNoWzJdIDogbnVsbDtcbiAgICAgIHZhciBldmVudE9iaiA9IG1ha2VFdmVudE9iaihzZWxmLCB7XG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlLFxuICAgICAgICB0YXJnZXQ6IHNlbGYuY29udGV4dFxuICAgICAgfSk7XG4gICAgICBoYW5kbGVyKHNlbGYsIGV2ZW50T2JqKTtcbiAgICB9XG4gIH1cbn07XG5wLm9uID0gcC5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudHMsIHF1YWxpZmllciwgY2FsbGJhY2ssIGNvbmYsIGNvbmZPdmVycmlkZXMpIHtcbiAgZm9yRWFjaEV2ZW50KHRoaXMsIGZ1bmN0aW9uIChzZWxmLCBldmVudCwgdHlwZSwgbmFtZXNwYWNlLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mKSB7XG4gICAgaWYgKGZuJDYoY2FsbGJhY2spKSB7XG4gICAgICBzZWxmLmxpc3RlbmVycy5wdXNoKHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICAvLyBmdWxsIGV2ZW50IHN0cmluZ1xuICAgICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICAgIC8vIGNhbGxiYWNrIHRvIHJ1blxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAvLyB0aGUgZXZlbnQgdHlwZSAoZS5nLiAnY2xpY2snKVxuICAgICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSxcbiAgICAgICAgLy8gdGhlIGV2ZW50IG5hbWVzcGFjZSAoZS5nLiBcIi5mb29cIilcbiAgICAgICAgcXVhbGlmaWVyOiBxdWFsaWZpZXIsXG4gICAgICAgIC8vIGEgcmVzdHJpY3Rpb24gb24gd2hldGhlciB0byBtYXRjaCB0aGlzIGVtaXR0ZXJcbiAgICAgICAgY29uZjogY29uZiAvLyBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25cbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mLCBjb25mT3ZlcnJpZGVzKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xucC5vbmUgPSBmdW5jdGlvbiAoZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mKSB7XG4gIHJldHVybiB0aGlzLm9uKGV2ZW50cywgcXVhbGlmaWVyLCBjYWxsYmFjaywgY29uZiwge1xuICAgIG9uZTogdHJ1ZVxuICB9KTtcbn07XG5wLnJlbW92ZUxpc3RlbmVyID0gcC5vZmYgPSBmdW5jdGlvbiAoZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG4gIGlmICh0aGlzLmVtaXR0aW5nICE9PSAwKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMgPSBjb3B5QXJyYXkodGhpcy5saXN0ZW5lcnMpO1xuICB9XG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycztcbiAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoaSkge1xuICAgIHZhciBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTtcbiAgICBmb3JFYWNoRXZlbnQoX3RoaXMsIGZ1bmN0aW9uIChzZWxmLCBldmVudCwgdHlwZSwgbmFtZXNwYWNlLCBxdWFsaWZpZXIsIGNhbGxiYWNrIC8qLCBjb25mKi8pIHtcbiAgICAgIGlmICgobGlzdGVuZXIudHlwZSA9PT0gdHlwZSB8fCBldmVudHMgPT09ICcqJykgJiYgKCFuYW1lc3BhY2UgJiYgbGlzdGVuZXIubmFtZXNwYWNlICE9PSAnLionIHx8IGxpc3RlbmVyLm5hbWVzcGFjZSA9PT0gbmFtZXNwYWNlKSAmJiAoIXF1YWxpZmllciB8fCBzZWxmLnF1YWxpZmllckNvbXBhcmUobGlzdGVuZXIucXVhbGlmaWVyLCBxdWFsaWZpZXIpKSAmJiAoIWNhbGxiYWNrIHx8IGxpc3RlbmVyLmNhbGxiYWNrID09PSBjYWxsYmFjaykpIHtcbiAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0sIGV2ZW50cywgcXVhbGlmaWVyLCBjYWxsYmFjaywgY29uZik7XG4gIH07XG4gIGZvciAodmFyIGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBfbG9vcChpKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5wLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucmVtb3ZlTGlzdGVuZXIoJyonKTtcbn07XG5wLmVtaXQgPSBwLnRyaWdnZXIgPSBmdW5jdGlvbiAoZXZlbnRzLCBleHRyYVBhcmFtcywgbWFudWFsQ2FsbGJhY2spIHtcbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzO1xuICB2YXIgbnVtTGlzdGVuZXJzQmVmb3JlRW1pdCA9IGxpc3RlbmVycy5sZW5ndGg7XG4gIHRoaXMuZW1pdHRpbmcrKztcbiAgaWYgKCFhcnJheShleHRyYVBhcmFtcykpIHtcbiAgICBleHRyYVBhcmFtcyA9IFtleHRyYVBhcmFtc107XG4gIH1cbiAgZm9yRWFjaEV2ZW50T2JqKHRoaXMsIGZ1bmN0aW9uIChzZWxmLCBldmVudE9iaikge1xuICAgIGlmIChtYW51YWxDYWxsYmFjayAhPSBudWxsKSB7XG4gICAgICBsaXN0ZW5lcnMgPSBbe1xuICAgICAgICBldmVudDogZXZlbnRPYmouZXZlbnQsXG4gICAgICAgIHR5cGU6IGV2ZW50T2JqLnR5cGUsXG4gICAgICAgIG5hbWVzcGFjZTogZXZlbnRPYmoubmFtZXNwYWNlLFxuICAgICAgICBjYWxsYmFjazogbWFudWFsQ2FsbGJhY2tcbiAgICAgIH1dO1xuICAgICAgbnVtTGlzdGVuZXJzQmVmb3JlRW1pdCA9IGxpc3RlbmVycy5sZW5ndGg7XG4gICAgfVxuICAgIHZhciBfbG9vcDIgPSBmdW5jdGlvbiBfbG9vcDIoaSkge1xuICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgICAgaWYgKGxpc3RlbmVyLnR5cGUgPT09IGV2ZW50T2JqLnR5cGUgJiYgKCFsaXN0ZW5lci5uYW1lc3BhY2UgfHwgbGlzdGVuZXIubmFtZXNwYWNlID09PSBldmVudE9iai5uYW1lc3BhY2UgfHwgbGlzdGVuZXIubmFtZXNwYWNlID09PSB1bml2ZXJzYWxOYW1lc3BhY2UpICYmIHNlbGYuZXZlbnRNYXRjaGVzKHNlbGYuY29udGV4dCwgbGlzdGVuZXIsIGV2ZW50T2JqKSkge1xuICAgICAgICB2YXIgYXJncyA9IFtldmVudE9ial07XG4gICAgICAgIGlmIChleHRyYVBhcmFtcyAhPSBudWxsKSB7XG4gICAgICAgICAgcHVzaChhcmdzLCBleHRyYVBhcmFtcyk7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5iZWZvcmVFbWl0KHNlbGYuY29udGV4dCwgbGlzdGVuZXIsIGV2ZW50T2JqKTtcbiAgICAgICAgaWYgKGxpc3RlbmVyLmNvbmYgJiYgbGlzdGVuZXIuY29uZi5vbmUpIHtcbiAgICAgICAgICBzZWxmLmxpc3RlbmVycyA9IHNlbGYubGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbiAobCkge1xuICAgICAgICAgICAgcmV0dXJuIGwgIT09IGxpc3RlbmVyO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb250ZXh0ID0gc2VsZi5jYWxsYmFja0NvbnRleHQoc2VsZi5jb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmopO1xuICAgICAgICB2YXIgcmV0ID0gbGlzdGVuZXIuY2FsbGJhY2suYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIHNlbGYuYWZ0ZXJFbWl0KHNlbGYuY29udGV4dCwgbGlzdGVuZXIsIGV2ZW50T2JqKTtcbiAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBldmVudE9iai5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBldmVudE9iai5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9IC8vIGlmIGxpc3RlbmVyIG1hdGNoZXNcbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTGlzdGVuZXJzQmVmb3JlRW1pdDsgaSsrKSB7XG4gICAgICBfbG9vcDIoaSk7XG4gICAgfSAvLyBmb3IgbGlzdGVuZXJcblxuICAgIGlmIChzZWxmLmJ1YmJsZShzZWxmLmNvbnRleHQpICYmICFldmVudE9iai5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKSB7XG4gICAgICBzZWxmLnBhcmVudChzZWxmLmNvbnRleHQpLmVtaXQoZXZlbnRPYmosIGV4dHJhUGFyYW1zKTtcbiAgICB9XG4gIH0sIGV2ZW50cyk7XG4gIHRoaXMuZW1pdHRpbmctLTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG52YXIgZW1pdHRlck9wdGlvbnMkMSA9IHtcbiAgcXVhbGlmaWVyQ29tcGFyZTogZnVuY3Rpb24gcXVhbGlmaWVyQ29tcGFyZShzZWxlY3RvcjEsIHNlbGVjdG9yMikge1xuICAgIGlmIChzZWxlY3RvcjEgPT0gbnVsbCB8fCBzZWxlY3RvcjIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHNlbGVjdG9yMSA9PSBudWxsICYmIHNlbGVjdG9yMiA9PSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc2VsZWN0b3IxLnNhbWVUZXh0KHNlbGVjdG9yMik7XG4gICAgfVxuICB9LFxuICBldmVudE1hdGNoZXM6IGZ1bmN0aW9uIGV2ZW50TWF0Y2hlcyhlbGUsIGxpc3RlbmVyLCBldmVudE9iaikge1xuICAgIHZhciBzZWxlY3RvciA9IGxpc3RlbmVyLnF1YWxpZmllcjtcbiAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVsZSAhPT0gZXZlbnRPYmoudGFyZ2V0ICYmIGVsZW1lbnQoZXZlbnRPYmoudGFyZ2V0KSAmJiBzZWxlY3Rvci5tYXRjaGVzKGV2ZW50T2JqLnRhcmdldCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBhZGRFdmVudEZpZWxkczogZnVuY3Rpb24gYWRkRXZlbnRGaWVsZHMoZWxlLCBldnQpIHtcbiAgICBldnQuY3kgPSBlbGUuY3koKTtcbiAgICBldnQudGFyZ2V0ID0gZWxlO1xuICB9LFxuICBjYWxsYmFja0NvbnRleHQ6IGZ1bmN0aW9uIGNhbGxiYWNrQ29udGV4dChlbGUsIGxpc3RlbmVyLCBldmVudE9iaikge1xuICAgIHJldHVybiBsaXN0ZW5lci5xdWFsaWZpZXIgIT0gbnVsbCA/IGV2ZW50T2JqLnRhcmdldCA6IGVsZTtcbiAgfSxcbiAgYmVmb3JlRW1pdDogZnVuY3Rpb24gYmVmb3JlRW1pdChjb250ZXh0LCBsaXN0ZW5lciAvKiwgZXZlbnRPYmoqLykge1xuICAgIGlmIChsaXN0ZW5lci5jb25mICYmIGxpc3RlbmVyLmNvbmYub25jZSkge1xuICAgICAgbGlzdGVuZXIuY29uZi5vbmNlQ29sbGVjdGlvbi5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lci5ldmVudCwgbGlzdGVuZXIucXVhbGlmaWVyLCBsaXN0ZW5lci5jYWxsYmFjayk7XG4gICAgfVxuICB9LFxuICBidWJibGU6IGZ1bmN0aW9uIGJ1YmJsZSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgcGFyZW50OiBmdW5jdGlvbiBwYXJlbnQoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5pc0NoaWxkKCkgPyBlbGUucGFyZW50KCkgOiBlbGUuY3koKTtcbiAgfVxufTtcbnZhciBhcmdTZWxlY3RvciQxID0gZnVuY3Rpb24gYXJnU2VsZWN0b3IoYXJnKSB7XG4gIGlmIChzdHJpbmcoYXJnKSkge1xuICAgIHJldHVybiBuZXcgU2VsZWN0b3IoYXJnKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYXJnO1xuICB9XG59O1xudmFyIGVsZXNmbiQ5ID0ge1xuICBjcmVhdGVFbWl0dGVyOiBmdW5jdGlvbiBjcmVhdGVFbWl0dGVyKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgICBpZiAoIV9wLmVtaXR0ZXIpIHtcbiAgICAgICAgX3AuZW1pdHRlciA9IG5ldyBFbWl0dGVyKGVtaXR0ZXJPcHRpb25zJDEsIGVsZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBlbWl0dGVyOiBmdW5jdGlvbiBlbWl0dGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmVtaXR0ZXI7XG4gIH0sXG4gIG9uOiBmdW5jdGlvbiBvbihldmVudHMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICAgIHZhciBhcmdTZWwgPSBhcmdTZWxlY3RvciQxKHNlbGVjdG9yKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgZWxlLmVtaXR0ZXIoKS5vbihldmVudHMsIGFyZ1NlbCwgY2FsbGJhY2spO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmVtb3ZlTGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGFyZ1NlbCA9IGFyZ1NlbGVjdG9yJDEoc2VsZWN0b3IpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBlbGUuZW1pdHRlcigpLnJlbW92ZUxpc3RlbmVyKGV2ZW50cywgYXJnU2VsLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZW1vdmVBbGxMaXN0ZW5lcnM6IGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgZWxlLmVtaXR0ZXIoKS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIG9uZTogZnVuY3Rpb24gb25lKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGFyZ1NlbCA9IGFyZ1NlbGVjdG9yJDEoc2VsZWN0b3IpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBlbGUuZW1pdHRlcigpLm9uZShldmVudHMsIGFyZ1NlbCwgY2FsbGJhY2spO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgb25jZTogZnVuY3Rpb24gb25jZShldmVudHMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICAgIHZhciBhcmdTZWwgPSBhcmdTZWxlY3RvciQxKHNlbGVjdG9yKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgZWxlLmVtaXR0ZXIoKS5vbihldmVudHMsIGFyZ1NlbCwgY2FsbGJhY2ssIHtcbiAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgb25jZUNvbGxlY3Rpb246IHRoaXNcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgZW1pdDogZnVuY3Rpb24gZW1pdChldmVudHMsIGV4dHJhUGFyYW1zKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGVsZS5lbWl0dGVyKCkuZW1pdChldmVudHMsIGV4dHJhUGFyYW1zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGVtaXRBbmROb3RpZnk6IGZ1bmN0aW9uIGVtaXRBbmROb3RpZnkoZXZlbnQsIGV4dHJhUGFyYW1zKSB7XG4gICAgLy8gZm9yIGludGVybmFsIHVzZSBvbmx5XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBlbXB0eSBjb2xsZWN0aW9ucyBkb24ndCBuZWVkIHRvIG5vdGlmeSBhbnl0aGluZ1xuXG4gICAgLy8gbm90aWZ5IHJlbmRlcmVyXG4gICAgdGhpcy5jeSgpLm5vdGlmeShldmVudCwgdGhpcyk7XG4gICAgdGhpcy5lbWl0KGV2ZW50LCBleHRyYVBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn07XG5kZWZpbmUuZXZlbnRBbGlhc2VzT24oZWxlc2ZuJDkpO1xuXG52YXIgZWxlc2ZuJDggPSB7XG4gIG5vZGVzOiBmdW5jdGlvbiBub2RlcyhzZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzTm9kZSgpO1xuICAgIH0pLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sXG4gIGVkZ2VzOiBmdW5jdGlvbiBlZGdlcyhzZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzRWRnZSgpO1xuICAgIH0pLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sXG4gIC8vIGludGVybmFsIGhlbHBlciB0byBnZXQgbm9kZXMgYW5kIGVkZ2VzIGFzIHNlcGFyYXRlIGNvbGxlY3Rpb25zIHdpdGggc2luZ2xlIGl0ZXJhdGlvbiBvdmVyIGVsZW1lbnRzXG4gIGJ5R3JvdXA6IGZ1bmN0aW9uIGJ5R3JvdXAoKSB7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5zcGF3bigpO1xuICAgIHZhciBlZGdlcyA9IHRoaXMuc3Bhd24oKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgICBub2Rlcy5wdXNoKGVsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlZGdlcy5wdXNoKGVsZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBub2Rlczogbm9kZXMsXG4gICAgICBlZGdlczogZWRnZXNcbiAgICB9O1xuICB9LFxuICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcihfZmlsdGVyLCB0aGlzQXJnKSB7XG4gICAgaWYgKF9maWx0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gY2hlY2sgdGhpcyBmaXJzdCBiL2MgaXQncyB0aGUgbW9zdCBjb21tb24vcGVyZm9ybWFudCBjYXNlXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2UgaWYgKHN0cmluZyhfZmlsdGVyKSB8fCBlbGVtZW50T3JDb2xsZWN0aW9uKF9maWx0ZXIpKSB7XG4gICAgICByZXR1cm4gbmV3IFNlbGVjdG9yKF9maWx0ZXIpLmZpbHRlcih0aGlzKTtcbiAgICB9IGVsc2UgaWYgKGZuJDYoX2ZpbHRlcikpIHtcbiAgICAgIHZhciBmaWx0ZXJFbGVzID0gdGhpcy5zcGF3bigpO1xuICAgICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgICB2YXIgaW5jbHVkZSA9IHRoaXNBcmcgPyBfZmlsdGVyLmFwcGx5KHRoaXNBcmcsIFtlbGUsIGksIGVsZXNdKSA6IF9maWx0ZXIoZWxlLCBpLCBlbGVzKTtcbiAgICAgICAgaWYgKGluY2x1ZGUpIHtcbiAgICAgICAgICBmaWx0ZXJFbGVzLnB1c2goZWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZpbHRlckVsZXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKCk7IC8vIGlmIG5vdCBoYW5kbGVkIGJ5IGFib3ZlLCBnaXZlICdlbSBhbiBlbXB0eSBjb2xsZWN0aW9uXG4gIH0sXG5cbiAgbm90OiBmdW5jdGlvbiBub3QodG9SZW1vdmUpIHtcbiAgICBpZiAoIXRvUmVtb3ZlKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0cmluZyh0b1JlbW92ZSkpIHtcbiAgICAgICAgdG9SZW1vdmUgPSB0aGlzLmZpbHRlcih0b1JlbW92ZSk7XG4gICAgICB9XG4gICAgICB2YXIgZWxlbWVudHMgPSB0aGlzLnNwYXduKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzW2ldO1xuICAgICAgICB2YXIgcmVtb3ZlID0gdG9SZW1vdmUuaGFzKGVsZW1lbnQpO1xuICAgICAgICBpZiAoIXJlbW92ZSkge1xuICAgICAgICAgIGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBlbGVtZW50cztcbiAgICB9XG4gIH0sXG4gIGFic29sdXRlQ29tcGxlbWVudDogZnVuY3Rpb24gYWJzb2x1dGVDb21wbGVtZW50KCkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICByZXR1cm4gY3kubXV0YWJsZUVsZW1lbnRzKCkubm90KHRoaXMpO1xuICB9LFxuICBpbnRlcnNlY3Q6IGZ1bmN0aW9uIGludGVyc2VjdChvdGhlcikge1xuICAgIC8vIGlmIGEgc2VsZWN0b3IgaXMgc3BlY2lmaWVkLCB0aGVuIGZpbHRlciBieSBpdCBpbnN0ZWFkXG4gICAgaWYgKHN0cmluZyhvdGhlcikpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IG90aGVyO1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9XG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy5zcGF3bigpO1xuICAgIHZhciBjb2wxID0gdGhpcztcbiAgICB2YXIgY29sMiA9IG90aGVyO1xuICAgIHZhciBjb2wxU21hbGxlciA9IHRoaXMubGVuZ3RoIDwgb3RoZXIubGVuZ3RoO1xuICAgIHZhciBjb2xTID0gY29sMVNtYWxsZXIgPyBjb2wxIDogY29sMjtcbiAgICB2YXIgY29sTCA9IGNvbDFTbWFsbGVyID8gY29sMiA6IGNvbDE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xTLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gY29sU1tpXTtcbiAgICAgIGlmIChjb2xMLmhhcyhlbGUpKSB7XG4gICAgICAgIGVsZW1lbnRzLnB1c2goZWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9LFxuICB4b3I6IGZ1bmN0aW9uIHhvcihvdGhlcikge1xuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gICAgaWYgKHN0cmluZyhvdGhlcikpIHtcbiAgICAgIG90aGVyID0gY3kuJChvdGhlcik7XG4gICAgfVxuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuc3Bhd24oKTtcbiAgICB2YXIgY29sMSA9IHRoaXM7XG4gICAgdmFyIGNvbDIgPSBvdGhlcjtcbiAgICB2YXIgYWRkID0gZnVuY3Rpb24gYWRkKGNvbCwgb3RoZXIpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBjb2xbaV07XG4gICAgICAgIHZhciBpZCA9IGVsZS5fcHJpdmF0ZS5kYXRhLmlkO1xuICAgICAgICB2YXIgaW5PdGhlciA9IG90aGVyLmhhc0VsZW1lbnRXaXRoSWQoaWQpO1xuICAgICAgICBpZiAoIWluT3RoZXIpIHtcbiAgICAgICAgICBlbGVtZW50cy5wdXNoKGVsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGFkZChjb2wxLCBjb2wyKTtcbiAgICBhZGQoY29sMiwgY29sMSk7XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9LFxuICBkaWZmOiBmdW5jdGlvbiBkaWZmKG90aGVyKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgICBpZiAoc3RyaW5nKG90aGVyKSkge1xuICAgICAgb3RoZXIgPSBjeS4kKG90aGVyKTtcbiAgICB9XG4gICAgdmFyIGxlZnQgPSB0aGlzLnNwYXduKCk7XG4gICAgdmFyIHJpZ2h0ID0gdGhpcy5zcGF3bigpO1xuICAgIHZhciBib3RoID0gdGhpcy5zcGF3bigpO1xuICAgIHZhciBjb2wxID0gdGhpcztcbiAgICB2YXIgY29sMiA9IG90aGVyO1xuICAgIHZhciBhZGQgPSBmdW5jdGlvbiBhZGQoY29sLCBvdGhlciwgcmV0RWxlcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2wubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGNvbFtpXTtcbiAgICAgICAgdmFyIGlkID0gZWxlLl9wcml2YXRlLmRhdGEuaWQ7XG4gICAgICAgIHZhciBpbk90aGVyID0gb3RoZXIuaGFzRWxlbWVudFdpdGhJZChpZCk7XG4gICAgICAgIGlmIChpbk90aGVyKSB7XG4gICAgICAgICAgYm90aC5tZXJnZShlbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldEVsZXMucHVzaChlbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBhZGQoY29sMSwgY29sMiwgbGVmdCk7XG4gICAgYWRkKGNvbDIsIGNvbDEsIHJpZ2h0KTtcbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogbGVmdCxcbiAgICAgIHJpZ2h0OiByaWdodCxcbiAgICAgIGJvdGg6IGJvdGhcbiAgICB9O1xuICB9LFxuICBhZGQ6IGZ1bmN0aW9uIGFkZCh0b0FkZCkge1xuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gICAgaWYgKCF0b0FkZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmIChzdHJpbmcodG9BZGQpKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSB0b0FkZDtcbiAgICAgIHRvQWRkID0gY3kubXV0YWJsZUVsZW1lbnRzKCkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9XG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy5zcGF3blNlbGYoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvQWRkLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdG9BZGRbaV07XG4gICAgICB2YXIgYWRkID0gIXRoaXMuaGFzKGVsZSk7XG4gICAgICBpZiAoYWRkKSB7XG4gICAgICAgIGVsZW1lbnRzLnB1c2goZWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9LFxuICAvLyBpbiBwbGFjZSBtZXJnZSBvbiBjYWxsaW5nIGNvbGxlY3Rpb25cbiAgbWVyZ2U6IGZ1bmN0aW9uIG1lcmdlKHRvQWRkKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgY3kgPSBfcC5jeTtcbiAgICBpZiAoIXRvQWRkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHRvQWRkICYmIHN0cmluZyh0b0FkZCkpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IHRvQWRkO1xuICAgICAgdG9BZGQgPSBjeS5tdXRhYmxlRWxlbWVudHMoKS5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH1cbiAgICB2YXIgbWFwID0gX3AubWFwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9BZGQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0b0FkZEVsZSA9IHRvQWRkW2ldO1xuICAgICAgdmFyIGlkID0gdG9BZGRFbGUuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICAgIHZhciBhZGQgPSAhbWFwLmhhcyhpZCk7XG4gICAgICBpZiAoYWRkKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMubGVuZ3RoKys7XG4gICAgICAgIHRoaXNbaW5kZXhdID0gdG9BZGRFbGU7XG4gICAgICAgIG1hcC5zZXQoaWQsIHtcbiAgICAgICAgICBlbGU6IHRvQWRkRWxlLFxuICAgICAgICAgIGluZGV4OiBpbmRleFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgdW5tZXJnZUF0OiBmdW5jdGlvbiB1bm1lcmdlQXQoaSkge1xuICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgdmFyIG1hcCA9IF9wLm1hcDtcblxuICAgIC8vIHJlbW92ZSBlbGVcbiAgICB0aGlzW2ldID0gdW5kZWZpbmVkO1xuICAgIG1hcFtcImRlbGV0ZVwiXShpZCk7XG4gICAgdmFyIHVubWVyZ2VkTGFzdEVsZSA9IGkgPT09IHRoaXMubGVuZ3RoIC0gMTtcblxuICAgIC8vIHJlcGxhY2UgZW1wdHkgc3BvdCB3aXRoIGxhc3QgZWxlIGluIGNvbGxlY3Rpb25cbiAgICBpZiAodGhpcy5sZW5ndGggPiAxICYmICF1bm1lcmdlZExhc3RFbGUpIHtcbiAgICAgIHZhciBsYXN0RWxlSSA9IHRoaXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBsYXN0RWxlID0gdGhpc1tsYXN0RWxlSV07XG4gICAgICB2YXIgbGFzdEVsZUlkID0gbGFzdEVsZS5fcHJpdmF0ZS5kYXRhLmlkO1xuICAgICAgdGhpc1tsYXN0RWxlSV0gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzW2ldID0gbGFzdEVsZTtcbiAgICAgIG1hcC5zZXQobGFzdEVsZUlkLCB7XG4gICAgICAgIGVsZTogbGFzdEVsZSxcbiAgICAgICAgaW5kZXg6IGlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHRoZSBjb2xsZWN0aW9uIGlzIG5vdyAxIGVsZSBzbWFsbGVyXG4gICAgdGhpcy5sZW5ndGgtLTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgLy8gcmVtb3ZlIHNpbmdsZSBlbGUgaW4gcGxhY2UgaW4gY2FsbGluZyBjb2xsZWN0aW9uXG4gIHVubWVyZ2VPbmU6IGZ1bmN0aW9uIHVubWVyZ2VPbmUoZWxlKSB7XG4gICAgZWxlID0gZWxlWzBdO1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgdmFyIGlkID0gZWxlLl9wcml2YXRlLmRhdGEuaWQ7XG4gICAgdmFyIG1hcCA9IF9wLm1hcDtcbiAgICB2YXIgZW50cnkgPSBtYXAuZ2V0KGlkKTtcbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICByZXR1cm4gdGhpczsgLy8gbm8gbmVlZCB0byByZW1vdmVcbiAgICB9XG5cbiAgICB2YXIgaSA9IGVudHJ5LmluZGV4O1xuICAgIHRoaXMudW5tZXJnZUF0KGkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICAvLyByZW1vdmUgZWxlcyBpbiBwbGFjZSBvbiBjYWxsaW5nIGNvbGxlY3Rpb25cbiAgdW5tZXJnZTogZnVuY3Rpb24gdW5tZXJnZSh0b1JlbW92ZSkge1xuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gICAgaWYgKCF0b1JlbW92ZSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmICh0b1JlbW92ZSAmJiBzdHJpbmcodG9SZW1vdmUpKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSB0b1JlbW92ZTtcbiAgICAgIHRvUmVtb3ZlID0gY3kubXV0YWJsZUVsZW1lbnRzKCkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b1JlbW92ZS5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy51bm1lcmdlT25lKHRvUmVtb3ZlW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgdW5tZXJnZUJ5OiBmdW5jdGlvbiB1bm1lcmdlQnkodG9SbUZuKSB7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgaWYgKHRvUm1GbihlbGUpKSB7XG4gICAgICAgIHRoaXMudW5tZXJnZUF0KGkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgbWFwOiBmdW5jdGlvbiBtYXAobWFwRm4sIHRoaXNBcmcpIHtcbiAgICB2YXIgYXJyID0gW107XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICB2YXIgcmV0ID0gdGhpc0FyZyA/IG1hcEZuLmFwcGx5KHRoaXNBcmcsIFtlbGUsIGksIGVsZXNdKSA6IG1hcEZuKGVsZSwgaSwgZWxlcyk7XG4gICAgICBhcnIucHVzaChyZXQpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyO1xuICB9LFxuICByZWR1Y2U6IGZ1bmN0aW9uIHJlZHVjZShmbiwgaW5pdGlhbFZhbHVlKSB7XG4gICAgdmFyIHZhbCA9IGluaXRpYWxWYWx1ZTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWwgPSBmbih2YWwsIGVsZXNbaV0sIGksIGVsZXMpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9LFxuICBtYXg6IGZ1bmN0aW9uIG1heCh2YWxGbiwgdGhpc0FyZykge1xuICAgIHZhciBtYXggPSAtSW5maW5pdHk7XG4gICAgdmFyIG1heEVsZTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgIHZhciB2YWwgPSB0aGlzQXJnID8gdmFsRm4uYXBwbHkodGhpc0FyZywgW2VsZSwgaSwgZWxlc10pIDogdmFsRm4oZWxlLCBpLCBlbGVzKTtcbiAgICAgIGlmICh2YWwgPiBtYXgpIHtcbiAgICAgICAgbWF4ID0gdmFsO1xuICAgICAgICBtYXhFbGUgPSBlbGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogbWF4LFxuICAgICAgZWxlOiBtYXhFbGVcbiAgICB9O1xuICB9LFxuICBtaW46IGZ1bmN0aW9uIG1pbih2YWxGbiwgdGhpc0FyZykge1xuICAgIHZhciBtaW4gPSBJbmZpbml0eTtcbiAgICB2YXIgbWluRWxlO1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgdmFyIHZhbCA9IHRoaXNBcmcgPyB2YWxGbi5hcHBseSh0aGlzQXJnLCBbZWxlLCBpLCBlbGVzXSkgOiB2YWxGbihlbGUsIGksIGVsZXMpO1xuICAgICAgaWYgKHZhbCA8IG1pbikge1xuICAgICAgICBtaW4gPSB2YWw7XG4gICAgICAgIG1pbkVsZSA9IGVsZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBtaW4sXG4gICAgICBlbGU6IG1pbkVsZVxuICAgIH07XG4gIH1cbn07XG5cbi8vIGFsaWFzZXNcbnZhciBmbiQxID0gZWxlc2ZuJDg7XG5mbiQxWyd1J10gPSBmbiQxWyd8J10gPSBmbiQxWycrJ10gPSBmbiQxLnVuaW9uID0gZm4kMS5vciA9IGZuJDEuYWRkO1xuZm4kMVsnXFxcXCddID0gZm4kMVsnISddID0gZm4kMVsnLSddID0gZm4kMS5kaWZmZXJlbmNlID0gZm4kMS5yZWxhdGl2ZUNvbXBsZW1lbnQgPSBmbiQxLnN1YnRyYWN0ID0gZm4kMS5ub3Q7XG5mbiQxWyduJ10gPSBmbiQxWycmJ10gPSBmbiQxWycuJ10gPSBmbiQxLmFuZCA9IGZuJDEuaW50ZXJzZWN0aW9uID0gZm4kMS5pbnRlcnNlY3Q7XG5mbiQxWydeJ10gPSBmbiQxWycoKyknXSA9IGZuJDFbJygtKSddID0gZm4kMS5zeW1tZXRyaWNEaWZmZXJlbmNlID0gZm4kMS5zeW1kaWZmID0gZm4kMS54b3I7XG5mbiQxLmZuRmlsdGVyID0gZm4kMS5maWx0ZXJGbiA9IGZuJDEuc3RkRmlsdGVyID0gZm4kMS5maWx0ZXI7XG5mbiQxLmNvbXBsZW1lbnQgPSBmbiQxLmFic2NvbXAgPSBmbiQxLmFic29sdXRlQ29tcGxlbWVudDtcblxudmFyIGVsZXNmbiQ3ID0ge1xuICBpc05vZGU6IGZ1bmN0aW9uIGlzTm9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5ncm91cCgpID09PSAnbm9kZXMnO1xuICB9LFxuICBpc0VkZ2U6IGZ1bmN0aW9uIGlzRWRnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5ncm91cCgpID09PSAnZWRnZXMnO1xuICB9LFxuICBpc0xvb3A6IGZ1bmN0aW9uIGlzTG9vcCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0VkZ2UoKSAmJiB0aGlzLnNvdXJjZSgpWzBdID09PSB0aGlzLnRhcmdldCgpWzBdO1xuICB9LFxuICBpc1NpbXBsZTogZnVuY3Rpb24gaXNTaW1wbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNFZGdlKCkgJiYgdGhpcy5zb3VyY2UoKVswXSAhPT0gdGhpcy50YXJnZXQoKVswXTtcbiAgfSxcbiAgZ3JvdXA6IGZ1bmN0aW9uIGdyb3VwKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuX3ByaXZhdGUuZ3JvdXA7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqICBFbGVtZW50cyBhcmUgZHJhd24gaW4gYSBzcGVjaWZpYyBvcmRlciBiYXNlZCBvbiBjb21wb3VuZCBkZXB0aCAobG93IHRvIGhpZ2gpLCB0aGUgZWxlbWVudCB0eXBlIChub2RlcyBhYm92ZSBlZGdlcyksXG4gKiAgYW5kIHotaW5kZXggKGxvdyB0byBoaWdoKS4gIFRoZXNlIHN0eWxlcyBhZmZlY3QgaG93IHRoaXMgYXBwbGllczpcbiAqXG4gKiAgei1jb21wb3VuZC1kZXB0aDogTWF5IGJlIGBib3R0b20gfCBvcnBoYW4gfCBhdXRvIHwgdG9wYC4gIFRoZSBmaXJzdCBkcmF3biBpcyBgYm90dG9tYCwgdGhlbiBgb3JwaGFuYCB3aGljaCBpcyB0aGVcbiAqICAgICAgc2FtZSBkZXB0aCBhcyB0aGUgcm9vdCBvZiB0aGUgY29tcG91bmQgZ3JhcGgsIGZvbGxvd2VkIGJ5IHRoZSBkZWZhdWx0IHZhbHVlIGBhdXRvYCB3aGljaCBkcmF3cyBpbiBvcmRlciBmcm9tXG4gKiAgICAgIHJvb3QgdG8gbGVhdmVzIG9mIHRoZSBjb21wb3VuZCBncmFwaC4gIFRoZSBsYXN0IGRyYXduIGlzIGB0b3BgLlxuICogIHotaW5kZXgtY29tcGFyZTogTWF5IGJlIGBhdXRvIHwgbWFudWFsYC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBhdXRvYCB3aGljaCBhbHdheXMgZHJhd3MgZWRnZXMgdW5kZXIgbm9kZXMuXG4gKiAgICAgIGBtYW51YWxgIGlnbm9yZXMgdGhpcyBjb252ZW50aW9uIGFuZCBkcmF3cyBiYXNlZCBvbiB0aGUgYHotaW5kZXhgIHZhbHVlIHNldHRpbmcuXG4gKiAgei1pbmRleDogQW4gaW50ZWdlciB2YWx1ZSB0aGF0IGFmZmVjdHMgdGhlIHJlbGF0aXZlIGRyYXcgb3JkZXIgb2YgZWxlbWVudHMuICBJbiBnZW5lcmFsLCBhbiBlbGVtZW50IHdpdGggYSBoaWdoZXJcbiAqICAgICAgYHotaW5kZXhgIHdpbGwgYmUgZHJhd24gb24gdG9wIG9mIGFuIGVsZW1lbnQgd2l0aCBhIGxvd2VyIGB6LWluZGV4YC5cbiAqL1xudmFyIHpJbmRleFNvcnQgPSBmdW5jdGlvbiB6SW5kZXhTb3J0KGEsIGIpIHtcbiAgdmFyIGN5ID0gYS5jeSgpO1xuICB2YXIgaGFzQ29tcG91bmROb2RlcyA9IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgZnVuY3Rpb24gZ2V0RGVwdGgoZWxlKSB7XG4gICAgdmFyIHN0eWxlID0gZWxlLnBzdHlsZSgnei1jb21wb3VuZC1kZXB0aCcpO1xuICAgIGlmIChzdHlsZS52YWx1ZSA9PT0gJ2F1dG8nKSB7XG4gICAgICByZXR1cm4gaGFzQ29tcG91bmROb2RlcyA/IGVsZS56RGVwdGgoKSA6IDA7XG4gICAgfSBlbHNlIGlmIChzdHlsZS52YWx1ZSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKHN0eWxlLnZhbHVlID09PSAndG9wJykge1xuICAgICAgcmV0dXJuIE1BWF9JTlQkMTtcbiAgICB9XG4gICAgLy8gJ29ycGhhbidcbiAgICByZXR1cm4gMDtcbiAgfVxuICB2YXIgZGVwdGhEaWZmID0gZ2V0RGVwdGgoYSkgLSBnZXREZXB0aChiKTtcbiAgaWYgKGRlcHRoRGlmZiAhPT0gMCkge1xuICAgIHJldHVybiBkZXB0aERpZmY7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0RWxlRGVwdGgoZWxlKSB7XG4gICAgdmFyIHN0eWxlID0gZWxlLnBzdHlsZSgnei1pbmRleC1jb21wYXJlJyk7XG4gICAgaWYgKHN0eWxlLnZhbHVlID09PSAnYXV0bycpIHtcbiAgICAgIHJldHVybiBlbGUuaXNOb2RlKCkgPyAxIDogMDtcbiAgICB9XG4gICAgLy8gJ21hbnVhbCdcbiAgICByZXR1cm4gMDtcbiAgfVxuICB2YXIgZWxlRGlmZiA9IGdldEVsZURlcHRoKGEpIC0gZ2V0RWxlRGVwdGgoYik7XG4gIGlmIChlbGVEaWZmICE9PSAwKSB7XG4gICAgcmV0dXJuIGVsZURpZmY7XG4gIH1cbiAgdmFyIHpEaWZmID0gYS5wc3R5bGUoJ3otaW5kZXgnKS52YWx1ZSAtIGIucHN0eWxlKCd6LWluZGV4JykudmFsdWU7XG4gIGlmICh6RGlmZiAhPT0gMCkge1xuICAgIHJldHVybiB6RGlmZjtcbiAgfVxuICAvLyBjb21wYXJlIGluZGljZXMgaW4gdGhlIGNvcmUgKG9yZGVyIGFkZGVkIHRvIGdyYXBoIHcvIGxhc3Qgb24gdG9wKVxuICByZXR1cm4gYS5wb29sSW5kZXgoKSAtIGIucG9vbEluZGV4KCk7XG59O1xuXG52YXIgZWxlc2ZuJDYgPSB7XG4gIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goZm4sIHRoaXNBcmcpIHtcbiAgICBpZiAoZm4kNihmbikpIHtcbiAgICAgIHZhciBOID0gdGhpcy5sZW5ndGg7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgICAgdmFyIHJldCA9IHRoaXNBcmcgPyBmbi5hcHBseSh0aGlzQXJnLCBbZWxlLCBpLCB0aGlzXSkgOiBmbihlbGUsIGksIHRoaXMpO1xuICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IC8vIGV4aXQgZWFjaCBlYXJseSBvbiByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgdG9BcnJheTogZnVuY3Rpb24gdG9BcnJheSgpIHtcbiAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFycmF5LnB1c2godGhpc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfSxcbiAgc2xpY2U6IGZ1bmN0aW9uIHNsaWNlKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICB2YXIgdGhpc1NpemUgPSB0aGlzLmxlbmd0aDtcbiAgICBpZiAoZW5kID09IG51bGwpIHtcbiAgICAgIGVuZCA9IHRoaXNTaXplO1xuICAgIH1cbiAgICBpZiAoc3RhcnQgPT0gbnVsbCkge1xuICAgICAgc3RhcnQgPSAwO1xuICAgIH1cbiAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICBzdGFydCA9IHRoaXNTaXplICsgc3RhcnQ7XG4gICAgfVxuICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICBlbmQgPSB0aGlzU2l6ZSArIGVuZDtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpID49IDAgJiYgaSA8IGVuZCAmJiBpIDwgdGhpc1NpemU7IGkrKykge1xuICAgICAgYXJyYXkucHVzaCh0aGlzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oYXJyYXkpO1xuICB9LFxuICBzaXplOiBmdW5jdGlvbiBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLmxlbmd0aDtcbiAgfSxcbiAgZXE6IGZ1bmN0aW9uIGVxKGkpIHtcbiAgICByZXR1cm4gdGhpc1tpXSB8fCB0aGlzLnNwYXduKCk7XG4gIH0sXG4gIGZpcnN0OiBmdW5jdGlvbiBmaXJzdCgpIHtcbiAgICByZXR1cm4gdGhpc1swXSB8fCB0aGlzLnNwYXduKCk7XG4gIH0sXG4gIGxhc3Q6IGZ1bmN0aW9uIGxhc3QoKSB7XG4gICAgcmV0dXJuIHRoaXNbdGhpcy5sZW5ndGggLSAxXSB8fCB0aGlzLnNwYXduKCk7XG4gIH0sXG4gIGVtcHR5OiBmdW5jdGlvbiBlbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDA7XG4gIH0sXG4gIG5vbmVtcHR5OiBmdW5jdGlvbiBub25lbXB0eSgpIHtcbiAgICByZXR1cm4gIXRoaXMuZW1wdHkoKTtcbiAgfSxcbiAgc29ydDogZnVuY3Rpb24gc29ydChzb3J0Rm4pIHtcbiAgICBpZiAoIWZuJDYoc29ydEZuKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHZhciBzb3J0ZWQgPSB0aGlzLnRvQXJyYXkoKS5zb3J0KHNvcnRGbik7XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oc29ydGVkKTtcbiAgfSxcbiAgc29ydEJ5WkluZGV4OiBmdW5jdGlvbiBzb3J0QnlaSW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuc29ydCh6SW5kZXhTb3J0KTtcbiAgfSxcbiAgekRlcHRoOiBmdW5jdGlvbiB6RGVwdGgoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKCFlbGUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gbGV0IGN5ID0gZWxlLmN5KCk7XG4gICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgIHZhciBncm91cCA9IF9wLmdyb3VwO1xuICAgIGlmIChncm91cCA9PT0gJ25vZGVzJykge1xuICAgICAgdmFyIGRlcHRoID0gX3AuZGF0YS5wYXJlbnQgPyBlbGUucGFyZW50cygpLnNpemUoKSA6IDA7XG4gICAgICBpZiAoIWVsZS5pc1BhcmVudCgpKSB7XG4gICAgICAgIHJldHVybiBNQVhfSU5UJDEgLSAxOyAvLyBjaGlsZGxlc3Mgbm9kZXMgYWx3YXlzIG9uIHRvcFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVwdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzcmMgPSBfcC5zb3VyY2U7XG4gICAgICB2YXIgdGd0ID0gX3AudGFyZ2V0O1xuICAgICAgdmFyIHNyY0RlcHRoID0gc3JjLnpEZXB0aCgpO1xuICAgICAgdmFyIHRndERlcHRoID0gdGd0LnpEZXB0aCgpO1xuICAgICAgcmV0dXJuIE1hdGgubWF4KHNyY0RlcHRoLCB0Z3REZXB0aCwgMCk7IC8vIGRlcHRoIG9mIGRlZXBlc3QgcGFyZW50XG4gICAgfVxuICB9XG59O1xuXG5lbGVzZm4kNi5lYWNoID0gZWxlc2ZuJDYuZm9yRWFjaDtcbnZhciBkZWZpbmVTeW1ib2xJdGVyYXRvciA9IGZ1bmN0aW9uIGRlZmluZVN5bWJvbEl0ZXJhdG9yKCkge1xuICB2YXIgdHlwZW9mVW5kZWYgPSBcInVuZGVmaW5lZFwiIDtcbiAgdmFyIGlzSXRlcmF0b3JTdXBwb3J0ZWQgPSAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKFN5bWJvbCkpICE9IHR5cGVvZlVuZGVmICYmIF90eXBlb2YoU3ltYm9sLml0ZXJhdG9yKSAhPSB0eXBlb2ZVbmRlZjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gIGlmIChpc0l0ZXJhdG9yU3VwcG9ydGVkKSB7XG4gICAgZWxlc2ZuJDZbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgICB2YXIgZW50cnkgPSB7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9O1xuICAgICAgdmFyIGkgPSAwO1xuICAgICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgICAgcmV0dXJuIF9kZWZpbmVQcm9wZXJ0eSh7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGVudHJ5LnZhbHVlID0gX3RoaXNbaSsrXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW50cnkudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBlbnRyeS5kb25lID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgICAgICB9XG4gICAgICB9LCBTeW1ib2wuaXRlcmF0b3IsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn07XG5kZWZpbmVTeW1ib2xJdGVyYXRvcigpO1xuXG52YXIgZ2V0TGF5b3V0RGltZW5zaW9uT3B0aW9ucyA9IGRlZmF1bHRzJGcoe1xuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlXG59KTtcbnZhciBlbGVzZm4kNSA9IHtcbiAgLy8gQ2FsY3VsYXRlcyBhbmQgcmV0dXJucyBub2RlIGRpbWVuc2lvbnMgeyB4LCB5IH0gYmFzZWQgb24gb3B0aW9ucyBnaXZlblxuICBsYXlvdXREaW1lbnNpb25zOiBmdW5jdGlvbiBsYXlvdXREaW1lbnNpb25zKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gZ2V0TGF5b3V0RGltZW5zaW9uT3B0aW9ucyhvcHRpb25zKTtcbiAgICB2YXIgZGltcztcbiAgICBpZiAoIXRoaXMudGFrZXNVcFNwYWNlKCkpIHtcbiAgICAgIGRpbXMgPSB7XG4gICAgICAgIHc6IDAsXG4gICAgICAgIGg6IDBcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLm5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVscykge1xuICAgICAgdmFyIGJiRGltID0gdGhpcy5ib3VuZGluZ0JveCgpO1xuICAgICAgZGltcyA9IHtcbiAgICAgICAgdzogYmJEaW0udyxcbiAgICAgICAgaDogYmJEaW0uaFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGltcyA9IHtcbiAgICAgICAgdzogdGhpcy5vdXRlcldpZHRoKCksXG4gICAgICAgIGg6IHRoaXMub3V0ZXJIZWlnaHQoKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBzYW5pdGlzZSB0aGUgZGltZW5zaW9ucyBmb3IgZXh0ZXJuYWwgbGF5b3V0cyAoYXZvaWQgZGl2aXNpb24gYnkgemVybylcbiAgICBpZiAoZGltcy53ID09PSAwIHx8IGRpbXMuaCA9PT0gMCkge1xuICAgICAgZGltcy53ID0gZGltcy5oID0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGRpbXM7XG4gIH0sXG4gIC8vIHVzaW5nIHN0YW5kYXJkIGxheW91dCBvcHRpb25zLCBhcHBseSBwb3NpdGlvbiBmdW5jdGlvbiAody8gb3Igdy9vIGFuaW1hdGlvbilcbiAgbGF5b3V0UG9zaXRpb25zOiBmdW5jdGlvbiBsYXlvdXRQb3NpdGlvbnMobGF5b3V0LCBvcHRpb25zLCBmbikge1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKS5maWx0ZXIoZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJldHVybiAhbi5pc1BhcmVudCgpO1xuICAgIH0pO1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgbGF5b3V0RWxlcyA9IG9wdGlvbnMuZWxlczsgLy8gbm9kZXMgJiBlZGdlc1xuICAgIHZhciBnZXRNZW1vaXplS2V5ID0gZnVuY3Rpb24gZ2V0TWVtb2l6ZUtleShub2RlKSB7XG4gICAgICByZXR1cm4gbm9kZS5pZCgpO1xuICAgIH07XG4gICAgdmFyIGZuTWVtID0gbWVtb2l6ZShmbiwgZ2V0TWVtb2l6ZUtleSk7IC8vIG1lbW9pemVkIHZlcnNpb24gb2YgcG9zaXRpb24gZnVuY3Rpb25cblxuICAgIGxheW91dC5lbWl0KHtcbiAgICAgIHR5cGU6ICdsYXlvdXRzdGFydCcsXG4gICAgICBsYXlvdXQ6IGxheW91dFxuICAgIH0pO1xuICAgIGxheW91dC5hbmltYXRpb25zID0gW107XG4gICAgdmFyIGNhbGN1bGF0ZVNwYWNpbmcgPSBmdW5jdGlvbiBjYWxjdWxhdGVTcGFjaW5nKHNwYWNpbmcsIG5vZGVzQmIsIHBvcykge1xuICAgICAgdmFyIGNlbnRlciA9IHtcbiAgICAgICAgeDogbm9kZXNCYi54MSArIG5vZGVzQmIudyAvIDIsXG4gICAgICAgIHk6IG5vZGVzQmIueTEgKyBub2Rlc0JiLmggLyAyXG4gICAgICB9O1xuICAgICAgdmFyIHNwYWNpbmdWZWN0b3IgPSB7XG4gICAgICAgIC8vIHNjYWxlIGZyb20gY2VudGVyIG9mIGJvdW5kaW5nIGJveCAobm90IG5lY2Vzc2FyaWx5IDAsMClcbiAgICAgICAgeDogKHBvcy54IC0gY2VudGVyLngpICogc3BhY2luZyxcbiAgICAgICAgeTogKHBvcy55IC0gY2VudGVyLnkpICogc3BhY2luZ1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IGNlbnRlci54ICsgc3BhY2luZ1ZlY3Rvci54LFxuICAgICAgICB5OiBjZW50ZXIueSArIHNwYWNpbmdWZWN0b3IueVxuICAgICAgfTtcbiAgICB9O1xuICAgIHZhciB1c2VTcGFjaW5nRmFjdG9yID0gb3B0aW9ucy5zcGFjaW5nRmFjdG9yICYmIG9wdGlvbnMuc3BhY2luZ0ZhY3RvciAhPT0gMTtcbiAgICB2YXIgc3BhY2luZ0JiID0gZnVuY3Rpb24gc3BhY2luZ0JiKCkge1xuICAgICAgaWYgKCF1c2VTcGFjaW5nRmFjdG9yKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIHZhciBwb3MgPSBmbk1lbShub2RlLCBpKTtcbiAgICAgICAgZXhwYW5kQm91bmRpbmdCb3hCeVBvaW50KGJiLCBwb3MueCwgcG9zLnkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJiO1xuICAgIH07XG4gICAgdmFyIGJiID0gc3BhY2luZ0JiKCk7XG4gICAgdmFyIGdldEZpbmFsUG9zID0gbWVtb2l6ZShmdW5jdGlvbiAobm9kZSwgaSkge1xuICAgICAgdmFyIG5ld1BvcyA9IGZuTWVtKG5vZGUsIGkpO1xuICAgICAgaWYgKHVzZVNwYWNpbmdGYWN0b3IpIHtcbiAgICAgICAgdmFyIHNwYWNpbmcgPSBNYXRoLmFicyhvcHRpb25zLnNwYWNpbmdGYWN0b3IpO1xuICAgICAgICBuZXdQb3MgPSBjYWxjdWxhdGVTcGFjaW5nKHNwYWNpbmcsIGJiLCBuZXdQb3MpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMudHJhbnNmb3JtICE9IG51bGwpIHtcbiAgICAgICAgbmV3UG9zID0gb3B0aW9ucy50cmFuc2Zvcm0obm9kZSwgbmV3UG9zKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXdQb3M7XG4gICAgfSwgZ2V0TWVtb2l6ZUtleSk7XG4gICAgaWYgKG9wdGlvbnMuYW5pbWF0ZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICB2YXIgbmV3UG9zID0gZ2V0RmluYWxQb3Mobm9kZSwgaSk7XG4gICAgICAgIHZhciBhbmltYXRlTm9kZSA9IG9wdGlvbnMuYW5pbWF0ZUZpbHRlciA9PSBudWxsIHx8IG9wdGlvbnMuYW5pbWF0ZUZpbHRlcihub2RlLCBpKTtcbiAgICAgICAgaWYgKGFuaW1hdGVOb2RlKSB7XG4gICAgICAgICAgdmFyIGFuaSA9IG5vZGUuYW5pbWF0aW9uKHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBuZXdQb3MsXG4gICAgICAgICAgICBkdXJhdGlvbjogb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvbixcbiAgICAgICAgICAgIGVhc2luZzogb3B0aW9ucy5hbmltYXRpb25FYXNpbmdcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBsYXlvdXQuYW5pbWF0aW9ucy5wdXNoKGFuaSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9kZS5wb3NpdGlvbihuZXdQb3MpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5maXQpIHtcbiAgICAgICAgdmFyIGZpdEFuaSA9IGN5LmFuaW1hdGlvbih7XG4gICAgICAgICAgZml0OiB7XG4gICAgICAgICAgICBib3VuZGluZ0JveDogbGF5b3V0RWxlcy5ib3VuZGluZ0JveEF0KGdldEZpbmFsUG9zKSxcbiAgICAgICAgICAgIHBhZGRpbmc6IG9wdGlvbnMucGFkZGluZ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZHVyYXRpb246IG9wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb24sXG4gICAgICAgICAgZWFzaW5nOiBvcHRpb25zLmFuaW1hdGlvbkVhc2luZ1xuICAgICAgICB9KTtcbiAgICAgICAgbGF5b3V0LmFuaW1hdGlvbnMucHVzaChmaXRBbmkpO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnpvb20gIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnBhbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciB6b29tUGFuQW5pID0gY3kuYW5pbWF0aW9uKHtcbiAgICAgICAgICB6b29tOiBvcHRpb25zLnpvb20sXG4gICAgICAgICAgcGFuOiBvcHRpb25zLnBhbixcbiAgICAgICAgICBkdXJhdGlvbjogb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvbixcbiAgICAgICAgICBlYXNpbmc6IG9wdGlvbnMuYW5pbWF0aW9uRWFzaW5nXG4gICAgICAgIH0pO1xuICAgICAgICBsYXlvdXQuYW5pbWF0aW9ucy5wdXNoKHpvb21QYW5BbmkpO1xuICAgICAgfVxuICAgICAgbGF5b3V0LmFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoYW5pKSB7XG4gICAgICAgIHJldHVybiBhbmkucGxheSgpO1xuICAgICAgfSk7XG4gICAgICBsYXlvdXQub25lKCdsYXlvdXRyZWFkeScsIG9wdGlvbnMucmVhZHkpO1xuICAgICAgbGF5b3V0LmVtaXQoe1xuICAgICAgICB0eXBlOiAnbGF5b3V0cmVhZHknLFxuICAgICAgICBsYXlvdXQ6IGxheW91dFxuICAgICAgfSk7XG4gICAgICBQcm9taXNlJDEuYWxsKGxheW91dC5hbmltYXRpb25zLm1hcChmdW5jdGlvbiAoYW5pKSB7XG4gICAgICAgIHJldHVybiBhbmkucHJvbWlzZSgpO1xuICAgICAgfSkpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICBsYXlvdXQub25lKCdsYXlvdXRzdG9wJywgb3B0aW9ucy5zdG9wKTtcbiAgICAgICAgbGF5b3V0LmVtaXQoe1xuICAgICAgICAgIHR5cGU6ICdsYXlvdXRzdG9wJyxcbiAgICAgICAgICBsYXlvdXQ6IGxheW91dFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2Rlcy5wb3NpdGlvbnMoZ2V0RmluYWxQb3MpO1xuICAgICAgaWYgKG9wdGlvbnMuZml0KSB7XG4gICAgICAgIGN5LmZpdChvcHRpb25zLmVsZXMsIG9wdGlvbnMucGFkZGluZyk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy56b29tICE9IG51bGwpIHtcbiAgICAgICAgY3kuem9vbShvcHRpb25zLnpvb20pO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMucGFuKSB7XG4gICAgICAgIGN5LnBhbihvcHRpb25zLnBhbik7XG4gICAgICB9XG4gICAgICBsYXlvdXQub25lKCdsYXlvdXRyZWFkeScsIG9wdGlvbnMucmVhZHkpO1xuICAgICAgbGF5b3V0LmVtaXQoe1xuICAgICAgICB0eXBlOiAnbGF5b3V0cmVhZHknLFxuICAgICAgICBsYXlvdXQ6IGxheW91dFxuICAgICAgfSk7XG4gICAgICBsYXlvdXQub25lKCdsYXlvdXRzdG9wJywgb3B0aW9ucy5zdG9wKTtcbiAgICAgIGxheW91dC5lbWl0KHtcbiAgICAgICAgdHlwZTogJ2xheW91dHN0b3AnLFxuICAgICAgICBsYXlvdXQ6IGxheW91dFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIGxheW91dDogZnVuY3Rpb24gbGF5b3V0KG9wdGlvbnMpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgcmV0dXJuIGN5Lm1ha2VMYXlvdXQoZXh0ZW5kKHt9LCBvcHRpb25zLCB7XG4gICAgICBlbGVzOiB0aGlzXG4gICAgfSkpO1xuICB9XG59O1xuXG4vLyBhbGlhc2VzOlxuZWxlc2ZuJDUuY3JlYXRlTGF5b3V0ID0gZWxlc2ZuJDUubWFrZUxheW91dCA9IGVsZXNmbiQ1LmxheW91dDtcblxuZnVuY3Rpb24gc3R5bGVDYWNoZShrZXksIGZuLCBlbGUpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgY2FjaGUgPSBfcC5zdHlsZUNhY2hlID0gX3Auc3R5bGVDYWNoZSB8fCBbXTtcbiAgdmFyIHZhbDtcbiAgaWYgKCh2YWwgPSBjYWNoZVtrZXldKSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfSBlbHNlIHtcbiAgICB2YWwgPSBjYWNoZVtrZXldID0gZm4oZWxlKTtcbiAgICByZXR1cm4gdmFsO1xuICB9XG59XG5mdW5jdGlvbiBjYWNoZVN0eWxlRnVuY3Rpb24oa2V5LCBmbikge1xuICBrZXkgPSBoYXNoU3RyaW5nKGtleSk7XG4gIHJldHVybiBmdW5jdGlvbiBjYWNoZWRTdHlsZUZ1bmN0aW9uKGVsZSkge1xuICAgIHJldHVybiBzdHlsZUNhY2hlKGtleSwgZm4sIGVsZSk7XG4gIH07XG59XG5mdW5jdGlvbiBjYWNoZVByb3RvdHlwZVN0eWxlRnVuY3Rpb24oa2V5LCBmbikge1xuICBrZXkgPSBoYXNoU3RyaW5nKGtleSk7XG4gIHZhciBzZWxmRm4gPSBmdW5jdGlvbiBzZWxmRm4oZWxlKSB7XG4gICAgcmV0dXJuIGZuLmNhbGwoZWxlKTtcbiAgfTtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNhY2hlZFByb3RvdHlwZVN0eWxlRnVuY3Rpb24oKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIHN0eWxlQ2FjaGUoa2V5LCBzZWxmRm4sIGVsZSk7XG4gICAgfVxuICB9O1xufVxudmFyIGVsZXNmbiQ0ID0ge1xuICByZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGU6IGZ1bmN0aW9uIHJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZSh1c2VDYWNoZSkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgcmVuZGVyZXIgPSBjeS5yZW5kZXJlcigpO1xuICAgIHZhciBzdHlsZUVuYWJsZWQgPSBjeS5zdHlsZUVuYWJsZWQoKTtcbiAgICBpZiAocmVuZGVyZXIgJiYgc3R5bGVFbmFibGVkKSB7XG4gICAgICByZW5kZXJlci5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUodGhpcywgdXNlQ2FjaGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZGlydHlTdHlsZUNhY2hlOiBmdW5jdGlvbiBkaXJ0eVN0eWxlQ2FjaGUoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBkaXJ0eSA9IGZ1bmN0aW9uIGRpcnR5KGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5zdHlsZUNhY2hlID0gbnVsbDtcbiAgICB9O1xuICAgIGlmIChjeS5oYXNDb21wb3VuZE5vZGVzKCkpIHtcbiAgICAgIHZhciBlbGVzO1xuICAgICAgZWxlcyA9IHRoaXMuc3Bhd25TZWxmKCkubWVyZ2UodGhpcy5kZXNjZW5kYW50cygpKS5tZXJnZSh0aGlzLnBhcmVudHMoKSk7XG4gICAgICBlbGVzLm1lcmdlKGVsZXMuY29ubmVjdGVkRWRnZXMoKSk7XG4gICAgICBlbGVzLmZvckVhY2goZGlydHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICBkaXJ0eShlbGUpO1xuICAgICAgICBlbGUuY29ubmVjdGVkRWRnZXMoKS5mb3JFYWNoKGRpcnR5KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgLy8gZnVsbHkgdXBkYXRlcyAocmVjYWxjdWxhdGVzKSB0aGUgc3R5bGUgZm9yIHRoZSBlbGVtZW50c1xuICB1cGRhdGVTdHlsZTogZnVuY3Rpb24gdXBkYXRlU3R5bGUobm90aWZ5UmVuZGVyZXIpIHtcbiAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAoY3kuYmF0Y2hpbmcoKSkge1xuICAgICAgdmFyIGJFbGVzID0gY3kuX3ByaXZhdGUuYmF0Y2hTdHlsZUVsZXM7XG4gICAgICBiRWxlcy5tZXJnZSh0aGlzKTtcbiAgICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZyBhbmQgZXhpdCBlYXJseSB3aGVuIGJhdGNoaW5nXG4gICAgfVxuXG4gICAgdmFyIGhhc0NvbXBvdW5kcyA9IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgICB2YXIgdXBkYXRlZEVsZXMgPSB0aGlzO1xuICAgIG5vdGlmeVJlbmRlcmVyID0gbm90aWZ5UmVuZGVyZXIgfHwgbm90aWZ5UmVuZGVyZXIgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBmYWxzZTtcbiAgICBpZiAoaGFzQ29tcG91bmRzKSB7XG4gICAgICAvLyB0aGVuIGFkZCBldmVyeXRoaW5nIHVwIGFuZCBkb3duIGZvciBjb21wb3VuZCBzZWxlY3RvciBjaGVja3NcbiAgICAgIHVwZGF0ZWRFbGVzID0gdGhpcy5zcGF3blNlbGYoKS5tZXJnZSh0aGlzLmRlc2NlbmRhbnRzKCkpLm1lcmdlKHRoaXMucGFyZW50cygpKTtcbiAgICB9XG5cbiAgICAvLyBsZXQgY2hhbmdlZEVsZXMgPSBzdHlsZS5hcHBseSggdXBkYXRlZEVsZXMgKTtcbiAgICB2YXIgY2hhbmdlZEVsZXMgPSB1cGRhdGVkRWxlcztcbiAgICBpZiAobm90aWZ5UmVuZGVyZXIpIHtcbiAgICAgIGNoYW5nZWRFbGVzLmVtaXRBbmROb3RpZnkoJ3N0eWxlJyk7IC8vIGxldCByZW5kZXJlciBrbm93IHdlIGNoYW5nZWQgc3R5bGVcbiAgICB9IGVsc2Uge1xuICAgICAgY2hhbmdlZEVsZXMuZW1pdCgnc3R5bGUnKTsgLy8ganVzdCBmaXJlIHRoZSBldmVudFxuICAgIH1cblxuICAgIHVwZGF0ZWRFbGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5zdHlsZURpcnR5ID0gdHJ1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICAvLyBwcml2YXRlOiBjbGVhcnMgZGlydHkgZmxhZyBhbmQgcmVjYWxjdWxhdGVzIHN0eWxlXG4gIGNsZWFuU3R5bGU6IGZ1bmN0aW9uIGNsZWFuU3R5bGUoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGlmIChlbGUuX3ByaXZhdGUuc3R5bGVEaXJ0eSkge1xuICAgICAgICAvLyBuLmIuIHRoaXMgZmxhZyBzaG91bGQgYmUgc2V0IGJlZm9yZSBhcHBseSgpIHRvIGF2b2lkIHBvdGVudGlhbCBpbmZpbml0ZSByZWN1cnNpb25cbiAgICAgICAgZWxlLl9wcml2YXRlLnN0eWxlRGlydHkgPSBmYWxzZTtcbiAgICAgICAgY3kuc3R5bGUoKS5hcHBseShlbGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLy8gZ2V0IHRoZSBpbnRlcm5hbCBwYXJzZWQgc3R5bGUgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5XG4gIHBhcnNlZFN0eWxlOiBmdW5jdGlvbiBwYXJzZWRTdHlsZShwcm9wZXJ0eSkge1xuICAgIHZhciBpbmNsdWRlTm9uRGVmYXVsdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICB2YXIgY3kgPSBlbGUuY3koKTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlbGUpIHtcbiAgICAgIHRoaXMuY2xlYW5TdHlsZSgpO1xuICAgICAgdmFyIG92ZXJyaWRkZW5TdHlsZSA9IGVsZS5fcHJpdmF0ZS5zdHlsZVtwcm9wZXJ0eV07XG4gICAgICBpZiAob3ZlcnJpZGRlblN0eWxlICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG92ZXJyaWRkZW5TdHlsZTtcbiAgICAgIH0gZWxzZSBpZiAoaW5jbHVkZU5vbkRlZmF1bHQpIHtcbiAgICAgICAgcmV0dXJuIGN5LnN0eWxlKCkuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgbnVtZXJpY1N0eWxlOiBmdW5jdGlvbiBudW1lcmljU3R5bGUocHJvcGVydHkpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoIWVsZS5jeSgpLnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlbGUpIHtcbiAgICAgIHZhciBwc3R5bGUgPSBlbGUucHN0eWxlKHByb3BlcnR5KTtcbiAgICAgIHJldHVybiBwc3R5bGUucGZWYWx1ZSAhPT0gdW5kZWZpbmVkID8gcHN0eWxlLnBmVmFsdWUgOiBwc3R5bGUudmFsdWU7XG4gICAgfVxuICB9LFxuICBudW1lcmljU3R5bGVVbml0czogZnVuY3Rpb24gbnVtZXJpY1N0eWxlVW5pdHMocHJvcGVydHkpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoIWVsZS5jeSgpLnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUucHN0eWxlKHByb3BlcnR5KS51bml0cztcbiAgICB9XG4gIH0sXG4gIC8vIGdldCB0aGUgc3BlY2lmaWVkIGNzcyBwcm9wZXJ0eSBhcyBhIHJlbmRlcmVkIHZhbHVlIChpLmUuIG9uLXNjcmVlbiB2YWx1ZSlcbiAgLy8gb3IgZ2V0IHRoZSB3aG9sZSByZW5kZXJlZCBzdHlsZSBpZiBubyBwcm9wZXJ0eSBzcGVjaWZpZWQgKE5CIGRvZXNuJ3QgYWxsb3cgc2V0dGluZylcbiAgcmVuZGVyZWRTdHlsZTogZnVuY3Rpb24gcmVuZGVyZWRTdHlsZShwcm9wZXJ0eSkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIGN5LnN0eWxlKCkuZ2V0UmVuZGVyZWRTdHlsZShlbGUsIHByb3BlcnR5KTtcbiAgICB9XG4gIH0sXG4gIC8vIHJlYWQgdGhlIGNhbGN1bGF0ZWQgY3NzIHN0eWxlIG9mIHRoZSBlbGVtZW50IG9yIG92ZXJyaWRlIHRoZSBzdHlsZSAodmlhIGEgYnlwYXNzKVxuICBzdHlsZTogZnVuY3Rpb24gc3R5bGUobmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHZhciB1cGRhdGVUcmFuc2l0aW9ucyA9IGZhbHNlO1xuICAgIHZhciBzdHlsZSA9IGN5LnN0eWxlKCk7XG4gICAgaWYgKHBsYWluT2JqZWN0KG5hbWUpKSB7XG4gICAgICAvLyB0aGVuIGV4dGVuZCB0aGUgYnlwYXNzXG4gICAgICB2YXIgcHJvcHMgPSBuYW1lO1xuICAgICAgc3R5bGUuYXBwbHlCeXBhc3ModGhpcywgcHJvcHMsIHVwZGF0ZVRyYW5zaXRpb25zKTtcbiAgICAgIHRoaXMuZW1pdEFuZE5vdGlmeSgnc3R5bGUnKTsgLy8gbGV0IHRoZSByZW5kZXJlciBrbm93IHdlJ3ZlIHVwZGF0ZWQgc3R5bGVcbiAgICB9IGVsc2UgaWYgKHN0cmluZyhuYW1lKSkge1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdGhlbiBnZXQgdGhlIHByb3BlcnR5IGZyb20gdGhlIHN0eWxlXG4gICAgICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgICAgICBpZiAoZWxlKSB7XG4gICAgICAgICAgcmV0dXJuIHN0eWxlLmdldFN0eWxlUHJvcGVydHlWYWx1ZShlbGUsIG5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGVtcHR5IGNvbGxlY3Rpb24gPT4gY2FuJ3QgZ2V0IGFueSB2YWx1ZVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdGhlbiBzZXQgdGhlIGJ5cGFzcyB3aXRoIHRoZSBwcm9wZXJ0eSB2YWx1ZVxuICAgICAgICBzdHlsZS5hcHBseUJ5cGFzcyh0aGlzLCBuYW1lLCB2YWx1ZSwgdXBkYXRlVHJhbnNpdGlvbnMpO1xuICAgICAgICB0aGlzLmVtaXRBbmROb3RpZnkoJ3N0eWxlJyk7IC8vIGxldCB0aGUgcmVuZGVyZXIga25vdyB3ZSd2ZSB1cGRhdGVkIHN0eWxlXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBfZWxlID0gdGhpc1swXTtcbiAgICAgIGlmIChfZWxlKSB7XG4gICAgICAgIHJldHVybiBzdHlsZS5nZXRSYXdTdHlsZShfZWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGVtcHR5IGNvbGxlY3Rpb24gPT4gY2FuJ3QgZ2V0IGFueSB2YWx1ZVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIHJlbW92ZVN0eWxlOiBmdW5jdGlvbiByZW1vdmVTdHlsZShuYW1lcykge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdmFyIHVwZGF0ZVRyYW5zaXRpb25zID0gZmFsc2U7XG4gICAgdmFyIHN0eWxlID0gY3kuc3R5bGUoKTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgaWYgKG5hbWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgc3R5bGUucmVtb3ZlQWxsQnlwYXNzZXMoZWxlLCB1cGRhdGVUcmFuc2l0aW9ucyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWVzID0gbmFtZXMuc3BsaXQoL1xccysvKTtcbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBlbGVzLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgX2VsZTIgPSBlbGVzW19pXTtcbiAgICAgICAgc3R5bGUucmVtb3ZlQnlwYXNzZXMoX2VsZTIsIG5hbWVzLCB1cGRhdGVUcmFuc2l0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZW1pdEFuZE5vdGlmeSgnc3R5bGUnKTsgLy8gbGV0IHRoZSByZW5kZXJlciBrbm93IHdlJ3ZlIHVwZGF0ZWQgc3R5bGVcblxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIHNob3c6IGZ1bmN0aW9uIHNob3coKSB7XG4gICAgdGhpcy5jc3MoJ2Rpc3BsYXknLCAnZWxlbWVudCcpO1xuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIGhpZGU6IGZ1bmN0aW9uIGhpZGUoKSB7XG4gICAgdGhpcy5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIGVmZmVjdGl2ZU9wYWNpdHk6IGZ1bmN0aW9uIGVmZmVjdGl2ZU9wYWNpdHkoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICB2YXIgaGFzQ29tcG91bmROb2RlcyA9IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgICB2YXIgcGFyZW50T3BhY2l0eSA9IGVsZS5wc3R5bGUoJ29wYWNpdHknKS52YWx1ZTtcbiAgICAgIGlmICghaGFzQ29tcG91bmROb2Rlcykge1xuICAgICAgICByZXR1cm4gcGFyZW50T3BhY2l0eTtcbiAgICAgIH1cbiAgICAgIHZhciBwYXJlbnRzID0gIV9wLmRhdGEucGFyZW50ID8gbnVsbCA6IGVsZS5wYXJlbnRzKCk7XG4gICAgICBpZiAocGFyZW50cykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgcGFyZW50ID0gcGFyZW50c1tpXTtcbiAgICAgICAgICB2YXIgb3BhY2l0eSA9IHBhcmVudC5wc3R5bGUoJ29wYWNpdHknKS52YWx1ZTtcbiAgICAgICAgICBwYXJlbnRPcGFjaXR5ID0gb3BhY2l0eSAqIHBhcmVudE9wYWNpdHk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJlbnRPcGFjaXR5O1xuICAgIH1cbiAgfSxcbiAgdHJhbnNwYXJlbnQ6IGZ1bmN0aW9uIHRyYW5zcGFyZW50KCkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBoYXNDb21wb3VuZE5vZGVzID0gZWxlLmN5KCkuaGFzQ29tcG91bmROb2RlcygpO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIGlmICghaGFzQ29tcG91bmROb2Rlcykge1xuICAgICAgICByZXR1cm4gZWxlLnBzdHlsZSgnb3BhY2l0eScpLnZhbHVlID09PSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsZS5lZmZlY3RpdmVPcGFjaXR5KCkgPT09IDA7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBiYWNrZ3JvdW5kaW5nOiBmdW5jdGlvbiBiYWNrZ3JvdW5kaW5nKCkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHJldHVybiBlbGUuX3ByaXZhdGUuYmFja2dyb3VuZGluZyA/IHRydWUgOiBmYWxzZTtcbiAgfVxufTtcbmZ1bmN0aW9uIGNoZWNrQ29tcG91bmQoZWxlLCBwYXJlbnRPaykge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBwYXJlbnRzID0gX3AuZGF0YS5wYXJlbnQgPyBlbGUucGFyZW50cygpIDogbnVsbDtcbiAgaWYgKHBhcmVudHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW2ldO1xuICAgICAgaWYgKCFwYXJlbnRPayhwYXJlbnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBkZWZpbmVEZXJpdmVkU3RhdGVGdW5jdGlvbihzcGVjcykge1xuICB2YXIgb2sgPSBzcGVjcy5vaztcbiAgdmFyIGVkZ2VPa1ZpYU5vZGUgPSBzcGVjcy5lZGdlT2tWaWFOb2RlIHx8IHNwZWNzLm9rO1xuICB2YXIgcGFyZW50T2sgPSBzcGVjcy5wYXJlbnRPayB8fCBzcGVjcy5vaztcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBoYXNDb21wb3VuZE5vZGVzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgIGlmICghb2soZWxlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgIHJldHVybiAhaGFzQ29tcG91bmROb2RlcyB8fCBjaGVja0NvbXBvdW5kKGVsZSwgcGFyZW50T2spO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNyYyA9IF9wLnNvdXJjZTtcbiAgICAgICAgdmFyIHRndCA9IF9wLnRhcmdldDtcbiAgICAgICAgcmV0dXJuIGVkZ2VPa1ZpYU5vZGUoc3JjKSAmJiAoIWhhc0NvbXBvdW5kTm9kZXMgfHwgY2hlY2tDb21wb3VuZChzcmMsIGVkZ2VPa1ZpYU5vZGUpKSAmJiAoc3JjID09PSB0Z3QgfHwgZWRnZU9rVmlhTm9kZSh0Z3QpICYmICghaGFzQ29tcG91bmROb2RlcyB8fCBjaGVja0NvbXBvdW5kKHRndCwgZWRnZU9rVmlhTm9kZSkpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG52YXIgZWxlVGFrZXNVcFNwYWNlID0gY2FjaGVTdHlsZUZ1bmN0aW9uKCdlbGVUYWtlc1VwU3BhY2UnLCBmdW5jdGlvbiAoZWxlKSB7XG4gIHJldHVybiBlbGUucHN0eWxlKCdkaXNwbGF5JykudmFsdWUgPT09ICdlbGVtZW50JyAmJiBlbGUud2lkdGgoKSAhPT0gMCAmJiAoZWxlLmlzTm9kZSgpID8gZWxlLmhlaWdodCgpICE9PSAwIDogdHJ1ZSk7XG59KTtcbmVsZXNmbiQ0LnRha2VzVXBTcGFjZSA9IGNhY2hlUHJvdG90eXBlU3R5bGVGdW5jdGlvbigndGFrZXNVcFNwYWNlJywgZGVmaW5lRGVyaXZlZFN0YXRlRnVuY3Rpb24oe1xuICBvazogZWxlVGFrZXNVcFNwYWNlXG59KSk7XG52YXIgZWxlSW50ZXJhY3RpdmUgPSBjYWNoZVN0eWxlRnVuY3Rpb24oJ2VsZUludGVyYWN0aXZlJywgZnVuY3Rpb24gKGVsZSkge1xuICByZXR1cm4gZWxlLnBzdHlsZSgnZXZlbnRzJykudmFsdWUgPT09ICd5ZXMnICYmIGVsZS5wc3R5bGUoJ3Zpc2liaWxpdHknKS52YWx1ZSA9PT0gJ3Zpc2libGUnICYmIGVsZVRha2VzVXBTcGFjZShlbGUpO1xufSk7XG52YXIgcGFyZW50SW50ZXJhY3RpdmUgPSBjYWNoZVN0eWxlRnVuY3Rpb24oJ3BhcmVudEludGVyYWN0aXZlJywgZnVuY3Rpb24gKHBhcmVudCkge1xuICByZXR1cm4gcGFyZW50LnBzdHlsZSgndmlzaWJpbGl0eScpLnZhbHVlID09PSAndmlzaWJsZScgJiYgZWxlVGFrZXNVcFNwYWNlKHBhcmVudCk7XG59KTtcbmVsZXNmbiQ0LmludGVyYWN0aXZlID0gY2FjaGVQcm90b3R5cGVTdHlsZUZ1bmN0aW9uKCdpbnRlcmFjdGl2ZScsIGRlZmluZURlcml2ZWRTdGF0ZUZ1bmN0aW9uKHtcbiAgb2s6IGVsZUludGVyYWN0aXZlLFxuICBwYXJlbnRPazogcGFyZW50SW50ZXJhY3RpdmUsXG4gIGVkZ2VPa1ZpYU5vZGU6IGVsZVRha2VzVXBTcGFjZVxufSkpO1xuZWxlc2ZuJDQubm9uaW50ZXJhY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICBpZiAoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuaW50ZXJhY3RpdmUoKTtcbiAgfVxufTtcbnZhciBlbGVWaXNpYmxlID0gY2FjaGVTdHlsZUZ1bmN0aW9uKCdlbGVWaXNpYmxlJywgZnVuY3Rpb24gKGVsZSkge1xuICByZXR1cm4gZWxlLnBzdHlsZSgndmlzaWJpbGl0eScpLnZhbHVlID09PSAndmlzaWJsZScgJiYgZWxlLnBzdHlsZSgnb3BhY2l0eScpLnBmVmFsdWUgIT09IDAgJiYgZWxlVGFrZXNVcFNwYWNlKGVsZSk7XG59KTtcbnZhciBlZGdlVmlzaWJsZVZpYU5vZGUgPSBlbGVUYWtlc1VwU3BhY2U7XG5lbGVzZm4kNC52aXNpYmxlID0gY2FjaGVQcm90b3R5cGVTdHlsZUZ1bmN0aW9uKCd2aXNpYmxlJywgZGVmaW5lRGVyaXZlZFN0YXRlRnVuY3Rpb24oe1xuICBvazogZWxlVmlzaWJsZSxcbiAgZWRnZU9rVmlhTm9kZTogZWRnZVZpc2libGVWaWFOb2RlXG59KSk7XG5lbGVzZm4kNC5oaWRkZW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICBpZiAoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUudmlzaWJsZSgpO1xuICB9XG59O1xuZWxlc2ZuJDQuaXNCdW5kbGVkQmV6aWVyID0gY2FjaGVQcm90b3R5cGVTdHlsZUZ1bmN0aW9uKCdpc0J1bmRsZWRCZXppZXInLCBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5jeSgpLnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAhdGhpcy5yZW1vdmVkKCkgJiYgdGhpcy5wc3R5bGUoJ2N1cnZlLXN0eWxlJykudmFsdWUgPT09ICdiZXppZXInICYmIHRoaXMudGFrZXNVcFNwYWNlKCk7XG59KTtcbmVsZXNmbiQ0LmJ5cGFzcyA9IGVsZXNmbiQ0LmNzcyA9IGVsZXNmbiQ0LnN0eWxlO1xuZWxlc2ZuJDQucmVuZGVyZWRDc3MgPSBlbGVzZm4kNC5yZW5kZXJlZFN0eWxlO1xuZWxlc2ZuJDQucmVtb3ZlQnlwYXNzID0gZWxlc2ZuJDQucmVtb3ZlQ3NzID0gZWxlc2ZuJDQucmVtb3ZlU3R5bGU7XG5lbGVzZm4kNC5wc3R5bGUgPSBlbGVzZm4kNC5wYXJzZWRTdHlsZTtcblxudmFyIGVsZXNmbiQzID0ge307XG5mdW5jdGlvbiBkZWZpbmVTd2l0Y2hGdW5jdGlvbihwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgY2hhbmdlZEVsZXMgPSBbXTtcblxuICAgIC8vIGUuZy4gY3kubm9kZXMoKS5zZWxlY3QoIGRhdGEsIGhhbmRsZXIgKVxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgdmFyIGRhdGEgPSBhcmdzWzBdO1xuICAgICAgdmFyIGhhbmRsZXIgPSBhcmdzWzFdO1xuICAgICAgdGhpcy5vbihwYXJhbXMuZXZlbnQsIGRhdGEsIGhhbmRsZXIpO1xuICAgIH1cblxuICAgIC8vIGUuZy4gY3kubm9kZXMoKS5zZWxlY3QoIGhhbmRsZXIgKVxuICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIGZuJDYoYXJnc1swXSkpIHtcbiAgICAgIHZhciBfaGFuZGxlciA9IGFyZ3NbMF07XG4gICAgICB0aGlzLm9uKHBhcmFtcy5ldmVudCwgX2hhbmRsZXIpO1xuICAgIH1cblxuICAgIC8vIGUuZy4gY3kubm9kZXMoKS5zZWxlY3QoKVxuICAgIC8vIGUuZy4gKHByaXZhdGUpIGN5Lm5vZGVzKCkuc2VsZWN0KFsndGFwc2VsZWN0J10pXG4gICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDAgfHwgYXJncy5sZW5ndGggPT09IDEgJiYgYXJyYXkoYXJnc1swXSkpIHtcbiAgICAgIHZhciBhZGRsRXZlbnRzID0gYXJncy5sZW5ndGggPT09IDEgPyBhcmdzWzBdIDogbnVsbDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgICAgdmFyIGFibGUgPSAhcGFyYW1zLmFibGVGaWVsZCB8fCBlbGUuX3ByaXZhdGVbcGFyYW1zLmFibGVGaWVsZF07XG4gICAgICAgIHZhciBjaGFuZ2VkID0gZWxlLl9wcml2YXRlW3BhcmFtcy5maWVsZF0gIT0gcGFyYW1zLnZhbHVlO1xuICAgICAgICBpZiAocGFyYW1zLm92ZXJyaWRlQWJsZSkge1xuICAgICAgICAgIHZhciBvdmVycmlkZUFibGUgPSBwYXJhbXMub3ZlcnJpZGVBYmxlKGVsZSk7XG4gICAgICAgICAgaWYgKG92ZXJyaWRlQWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhYmxlID0gb3ZlcnJpZGVBYmxlO1xuICAgICAgICAgICAgaWYgKCFvdmVycmlkZUFibGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9IC8vIHRvIHNhdmUgY3ljbGVzIGFzc3VtZSBub3QgYWJsZSBmb3IgYWxsIG9uIG92ZXJyaWRlXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFibGUpIHtcbiAgICAgICAgICBlbGUuX3ByaXZhdGVbcGFyYW1zLmZpZWxkXSA9IHBhcmFtcy52YWx1ZTtcbiAgICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgY2hhbmdlZEVsZXMucHVzaChlbGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGNoYW5nZWRDb2xsID0gdGhpcy5zcGF3bihjaGFuZ2VkRWxlcyk7XG4gICAgICBjaGFuZ2VkQ29sbC51cGRhdGVTdHlsZSgpOyAvLyBjaGFuZ2Ugb2Ygc3RhdGUgPT4gcG9zc2libGUgY2hhbmdlIG9mIHN0eWxlXG4gICAgICBjaGFuZ2VkQ29sbC5lbWl0KHBhcmFtcy5ldmVudCk7XG4gICAgICBpZiAoYWRkbEV2ZW50cykge1xuICAgICAgICBjaGFuZ2VkQ29sbC5lbWl0KGFkZGxFdmVudHMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn1cbmZ1bmN0aW9uIGRlZmluZVN3aXRjaFNldChwYXJhbXMpIHtcbiAgZWxlc2ZuJDNbcGFyYW1zLmZpZWxkXSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICBpZiAocGFyYW1zLm92ZXJyaWRlRmllbGQpIHtcbiAgICAgICAgdmFyIHZhbCA9IHBhcmFtcy5vdmVycmlkZUZpZWxkKGVsZSk7XG4gICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBlbGUuX3ByaXZhdGVbcGFyYW1zLmZpZWxkXTtcbiAgICB9XG4gIH07XG4gIGVsZXNmbiQzW3BhcmFtcy5vbl0gPSBkZWZpbmVTd2l0Y2hGdW5jdGlvbih7XG4gICAgZXZlbnQ6IHBhcmFtcy5vbixcbiAgICBmaWVsZDogcGFyYW1zLmZpZWxkLFxuICAgIGFibGVGaWVsZDogcGFyYW1zLmFibGVGaWVsZCxcbiAgICBvdmVycmlkZUFibGU6IHBhcmFtcy5vdmVycmlkZUFibGUsXG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIGVsZXNmbiQzW3BhcmFtcy5vZmZdID0gZGVmaW5lU3dpdGNoRnVuY3Rpb24oe1xuICAgIGV2ZW50OiBwYXJhbXMub2ZmLFxuICAgIGZpZWxkOiBwYXJhbXMuZmllbGQsXG4gICAgYWJsZUZpZWxkOiBwYXJhbXMuYWJsZUZpZWxkLFxuICAgIG92ZXJyaWRlQWJsZTogcGFyYW1zLm92ZXJyaWRlQWJsZSxcbiAgICB2YWx1ZTogZmFsc2VcbiAgfSk7XG59XG5kZWZpbmVTd2l0Y2hTZXQoe1xuICBmaWVsZDogJ2xvY2tlZCcsXG4gIG92ZXJyaWRlRmllbGQ6IGZ1bmN0aW9uIG92ZXJyaWRlRmllbGQoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5jeSgpLmF1dG9sb2NrKCkgPyB0cnVlIDogdW5kZWZpbmVkO1xuICB9LFxuICBvbjogJ2xvY2snLFxuICBvZmY6ICd1bmxvY2snXG59KTtcbmRlZmluZVN3aXRjaFNldCh7XG4gIGZpZWxkOiAnZ3JhYmJhYmxlJyxcbiAgb3ZlcnJpZGVGaWVsZDogZnVuY3Rpb24gb3ZlcnJpZGVGaWVsZChlbGUpIHtcbiAgICByZXR1cm4gZWxlLmN5KCkuYXV0b3VuZ3JhYmlmeSgpIHx8IGVsZS5wYW5uYWJsZSgpID8gZmFsc2UgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIG9uOiAnZ3JhYmlmeScsXG4gIG9mZjogJ3VuZ3JhYmlmeSdcbn0pO1xuZGVmaW5lU3dpdGNoU2V0KHtcbiAgZmllbGQ6ICdzZWxlY3RlZCcsXG4gIGFibGVGaWVsZDogJ3NlbGVjdGFibGUnLFxuICBvdmVycmlkZUFibGU6IGZ1bmN0aW9uIG92ZXJyaWRlQWJsZShlbGUpIHtcbiAgICByZXR1cm4gZWxlLmN5KCkuYXV0b3Vuc2VsZWN0aWZ5KCkgPyBmYWxzZSA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgb246ICdzZWxlY3QnLFxuICBvZmY6ICd1bnNlbGVjdCdcbn0pO1xuZGVmaW5lU3dpdGNoU2V0KHtcbiAgZmllbGQ6ICdzZWxlY3RhYmxlJyxcbiAgb3ZlcnJpZGVGaWVsZDogZnVuY3Rpb24gb3ZlcnJpZGVGaWVsZChlbGUpIHtcbiAgICByZXR1cm4gZWxlLmN5KCkuYXV0b3Vuc2VsZWN0aWZ5KCkgPyBmYWxzZSA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgb246ICdzZWxlY3RpZnknLFxuICBvZmY6ICd1bnNlbGVjdGlmeSdcbn0pO1xuZWxlc2ZuJDMuZGVzZWxlY3QgPSBlbGVzZm4kMy51bnNlbGVjdDtcbmVsZXNmbiQzLmdyYWJiZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICBpZiAoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5ncmFiYmVkO1xuICB9XG59O1xuZGVmaW5lU3dpdGNoU2V0KHtcbiAgZmllbGQ6ICdhY3RpdmUnLFxuICBvbjogJ2FjdGl2YXRlJyxcbiAgb2ZmOiAndW5hY3RpdmF0ZSdcbn0pO1xuZGVmaW5lU3dpdGNoU2V0KHtcbiAgZmllbGQ6ICdwYW5uYWJsZScsXG4gIG9uOiAncGFuaWZ5JyxcbiAgb2ZmOiAndW5wYW5pZnknXG59KTtcbmVsZXNmbiQzLmluYWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgaWYgKGVsZSkge1xuICAgIHJldHVybiAhZWxlLl9wcml2YXRlLmFjdGl2ZTtcbiAgfVxufTtcblxudmFyIGVsZXNmbiQyID0ge307XG5cbi8vIERBRyBmdW5jdGlvbnNcbi8vLy8vLy8vLy8vLy8vLy9cblxudmFyIGRlZmluZURhZ0V4dHJlbWl0eSA9IGZ1bmN0aW9uIGRlZmluZURhZ0V4dHJlbWl0eShwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGRhZ0V4dHJlbWl0eUltcGwoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIHJldCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICBpZiAoIWVsZS5pc05vZGUoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBkaXNxdWFsaWZpZWQgPSBmYWxzZTtcbiAgICAgIHZhciBlZGdlcyA9IGVsZS5jb25uZWN0ZWRFZGdlcygpO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBlZGdlcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgZWRnZSA9IGVkZ2VzW2pdO1xuICAgICAgICB2YXIgc3JjID0gZWRnZS5zb3VyY2UoKTtcbiAgICAgICAgdmFyIHRndCA9IGVkZ2UudGFyZ2V0KCk7XG4gICAgICAgIGlmIChwYXJhbXMubm9JbmNvbWluZ0VkZ2VzICYmIHRndCA9PT0gZWxlICYmIHNyYyAhPT0gZWxlIHx8IHBhcmFtcy5ub091dGdvaW5nRWRnZXMgJiYgc3JjID09PSBlbGUgJiYgdGd0ICE9PSBlbGUpIHtcbiAgICAgICAgICBkaXNxdWFsaWZpZWQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWRpc3F1YWxpZmllZCkge1xuICAgICAgICByZXQucHVzaChlbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGF3bihyZXQsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH07XG59O1xudmFyIGRlZmluZURhZ09uZUhvcCA9IGZ1bmN0aW9uIGRlZmluZURhZ09uZUhvcChwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICB2YXIgb0VsZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgaWYgKCFlbGUuaXNOb2RlKCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgZWRnZXMgPSBlbGUuY29ubmVjdGVkRWRnZXMoKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWRnZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tqXTtcbiAgICAgICAgdmFyIHNyYyA9IGVkZ2Uuc291cmNlKCk7XG4gICAgICAgIHZhciB0Z3QgPSBlZGdlLnRhcmdldCgpO1xuICAgICAgICBpZiAocGFyYW1zLm91dGdvaW5nICYmIHNyYyA9PT0gZWxlKSB7XG4gICAgICAgICAgb0VsZXMucHVzaChlZGdlKTtcbiAgICAgICAgICBvRWxlcy5wdXNoKHRndCk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFyYW1zLmluY29taW5nICYmIHRndCA9PT0gZWxlKSB7XG4gICAgICAgICAgb0VsZXMucHVzaChlZGdlKTtcbiAgICAgICAgICBvRWxlcy5wdXNoKHNyYyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ob0VsZXMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH07XG59O1xudmFyIGRlZmluZURhZ0FsbEhvcHMgPSBmdW5jdGlvbiBkZWZpbmVEYWdBbGxIb3BzKHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIHZhciBzRWxlcyA9IFtdO1xuICAgIHZhciBzRWxlc0lkcyA9IHt9O1xuICAgIGZvciAoOzspIHtcbiAgICAgIHZhciBuZXh0ID0gcGFyYW1zLm91dGdvaW5nID8gZWxlcy5vdXRnb2VycygpIDogZWxlcy5pbmNvbWVycygpO1xuICAgICAgaWYgKG5leHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvLyBkb25lIGlmIG5vbmUgbGVmdFxuXG4gICAgICB2YXIgbmV3TmV4dCA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBuID0gbmV4dFtpXTtcbiAgICAgICAgdmFyIG5pZCA9IG4uaWQoKTtcbiAgICAgICAgaWYgKCFzRWxlc0lkc1tuaWRdKSB7XG4gICAgICAgICAgc0VsZXNJZHNbbmlkXSA9IHRydWU7XG4gICAgICAgICAgc0VsZXMucHVzaChuKTtcbiAgICAgICAgICBuZXdOZXh0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFuZXdOZXh0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvLyBkb25lIGlmIHRvdWNoZWQgYWxsIG91dGdvZXJzIGFscmVhZHlcblxuICAgICAgZWxlcyA9IG5leHQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKHNFbGVzLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9O1xufTtcbmVsZXNmbiQyLmNsZWFyVHJhdmVyc2FsQ2FjaGUgPSBmdW5jdGlvbiAoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHRoaXNbaV0uX3ByaXZhdGUudHJhdmVyc2FsQ2FjaGUgPSBudWxsO1xuICB9XG59O1xuZXh0ZW5kKGVsZXNmbiQyLCB7XG4gIC8vIGdldCB0aGUgcm9vdCBub2RlcyBpbiB0aGUgREFHXG4gIHJvb3RzOiBkZWZpbmVEYWdFeHRyZW1pdHkoe1xuICAgIG5vSW5jb21pbmdFZGdlczogdHJ1ZVxuICB9KSxcbiAgLy8gZ2V0IHRoZSBsZWFmIG5vZGVzIGluIHRoZSBEQUdcbiAgbGVhdmVzOiBkZWZpbmVEYWdFeHRyZW1pdHkoe1xuICAgIG5vT3V0Z29pbmdFZGdlczogdHJ1ZVxuICB9KSxcbiAgLy8gbm9ybWFsbHkgY2FsbGVkIGNoaWxkcmVuIGluIGdyYXBoIHRoZW9yeVxuICAvLyB0aGVzZSBub2RlcyA9ZWRnZXM9PiBvdXRnb2luZyBub2Rlc1xuICBvdXRnb2VyczogY2FjaGUoZGVmaW5lRGFnT25lSG9wKHtcbiAgICBvdXRnb2luZzogdHJ1ZVxuICB9KSwgJ291dGdvZXJzJyksXG4gIC8vIGFrYSBEQUcgZGVzY2VuZGFudHNcbiAgc3VjY2Vzc29yczogZGVmaW5lRGFnQWxsSG9wcyh7XG4gICAgb3V0Z29pbmc6IHRydWVcbiAgfSksXG4gIC8vIG5vcm1hbGx5IGNhbGxlZCBwYXJlbnRzIGluIGdyYXBoIHRoZW9yeVxuICAvLyB0aGVzZSBub2RlcyA8PWVkZ2VzPSBpbmNvbWluZyBub2Rlc1xuICBpbmNvbWVyczogY2FjaGUoZGVmaW5lRGFnT25lSG9wKHtcbiAgICBpbmNvbWluZzogdHJ1ZVxuICB9KSwgJ2luY29tZXJzJyksXG4gIC8vIGFrYSBEQUcgYW5jZXN0b3JzXG4gIHByZWRlY2Vzc29yczogZGVmaW5lRGFnQWxsSG9wcyh7XG4gICAgaW5jb21pbmc6IHRydWVcbiAgfSlcbn0pO1xuXG4vLyBOZWlnaGJvdXJob29kIGZ1bmN0aW9uc1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuZXh0ZW5kKGVsZXNmbiQyLCB7XG4gIG5laWdoYm9yaG9vZDogY2FjaGUoZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZW1lbnRzID0gW107XG4gICAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIGZvciBhbGwgbm9kZXNcbiAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICB2YXIgY29ubmVjdGVkRWRnZXMgPSBub2RlLmNvbm5lY3RlZEVkZ2VzKCk7XG5cbiAgICAgIC8vIGZvciBlYWNoIGNvbm5lY3RlZCBlZGdlLCBhZGQgdGhlIGVkZ2UgYW5kIHRoZSBvdGhlciBub2RlXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbm5lY3RlZEVkZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBlZGdlID0gY29ubmVjdGVkRWRnZXNbal07XG4gICAgICAgIHZhciBzcmMgPSBlZGdlLnNvdXJjZSgpO1xuICAgICAgICB2YXIgdGd0ID0gZWRnZS50YXJnZXQoKTtcbiAgICAgICAgdmFyIG90aGVyTm9kZSA9IG5vZGUgPT09IHNyYyA/IHRndCA6IHNyYztcblxuICAgICAgICAvLyBuZWVkIGNoZWNrIGluIGNhc2Ugb2YgbG9vcFxuICAgICAgICBpZiAob3RoZXJOb2RlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBlbGVtZW50cy5wdXNoKG90aGVyTm9kZVswXSk7IC8vIGFkZCBub2RlIDEgaG9wIGF3YXlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCBjb25uZWN0ZWQgZWRnZVxuICAgICAgICBlbGVtZW50cy5wdXNoKGVkZ2VbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGF3bihlbGVtZW50cywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSwgJ25laWdoYm9yaG9vZCcpLFxuICBjbG9zZWROZWlnaGJvcmhvb2Q6IGZ1bmN0aW9uIGNsb3NlZE5laWdoYm9yaG9vZChzZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLm5laWdoYm9yaG9vZCgpLmFkZCh0aGlzKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LFxuICBvcGVuTmVpZ2hib3Job29kOiBmdW5jdGlvbiBvcGVuTmVpZ2hib3Job29kKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMubmVpZ2hib3Job29kKHNlbGVjdG9yKTtcbiAgfVxufSk7XG5cbi8vIGFsaWFzZXNcbmVsZXNmbiQyLm5laWdoYm91cmhvb2QgPSBlbGVzZm4kMi5uZWlnaGJvcmhvb2Q7XG5lbGVzZm4kMi5jbG9zZWROZWlnaGJvdXJob29kID0gZWxlc2ZuJDIuY2xvc2VkTmVpZ2hib3Job29kO1xuZWxlc2ZuJDIub3Blbk5laWdoYm91cmhvb2QgPSBlbGVzZm4kMi5vcGVuTmVpZ2hib3Job29kO1xuXG4vLyBFZGdlIGZ1bmN0aW9uc1xuLy8vLy8vLy8vLy8vLy8vLy9cblxuZXh0ZW5kKGVsZXNmbiQyLCB7XG4gIHNvdXJjZTogY2FjaGUoZnVuY3Rpb24gc291cmNlSW1wbChzZWxlY3Rvcikge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBzcmM7XG4gICAgaWYgKGVsZSkge1xuICAgICAgc3JjID0gZWxlLl9wcml2YXRlLnNvdXJjZSB8fCBlbGUuY3koKS5jb2xsZWN0aW9uKCk7XG4gICAgfVxuICAgIHJldHVybiBzcmMgJiYgc2VsZWN0b3IgPyBzcmMuZmlsdGVyKHNlbGVjdG9yKSA6IHNyYztcbiAgfSwgJ3NvdXJjZScpLFxuICB0YXJnZXQ6IGNhY2hlKGZ1bmN0aW9uIHRhcmdldEltcGwoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICB2YXIgdGd0O1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHRndCA9IGVsZS5fcHJpdmF0ZS50YXJnZXQgfHwgZWxlLmN5KCkuY29sbGVjdGlvbigpO1xuICAgIH1cbiAgICByZXR1cm4gdGd0ICYmIHNlbGVjdG9yID8gdGd0LmZpbHRlcihzZWxlY3RvcikgOiB0Z3Q7XG4gIH0sICd0YXJnZXQnKSxcbiAgc291cmNlczogZGVmaW5lU291cmNlRnVuY3Rpb24oe1xuICAgIGF0dHI6ICdzb3VyY2UnXG4gIH0pLFxuICB0YXJnZXRzOiBkZWZpbmVTb3VyY2VGdW5jdGlvbih7XG4gICAgYXR0cjogJ3RhcmdldCdcbiAgfSlcbn0pO1xuZnVuY3Rpb24gZGVmaW5lU291cmNlRnVuY3Rpb24ocGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzb3VyY2VJbXBsKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNvdXJjZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgdmFyIHNyYyA9IGVsZS5fcHJpdmF0ZVtwYXJhbXMuYXR0cl07XG4gICAgICBpZiAoc3JjKSB7XG4gICAgICAgIHNvdXJjZXMucHVzaChzcmMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGF3bihzb3VyY2VzLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9O1xufVxuZXh0ZW5kKGVsZXNmbiQyLCB7XG4gIGVkZ2VzV2l0aDogY2FjaGUoZGVmaW5lRWRnZXNXaXRoRnVuY3Rpb24oKSwgJ2VkZ2VzV2l0aCcpLFxuICBlZGdlc1RvOiBjYWNoZShkZWZpbmVFZGdlc1dpdGhGdW5jdGlvbih7XG4gICAgdGhpc0lzU3JjOiB0cnVlXG4gIH0pLCAnZWRnZXNUbycpXG59KTtcbmZ1bmN0aW9uIGRlZmluZUVkZ2VzV2l0aEZ1bmN0aW9uKHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24gZWRnZXNXaXRoSW1wbChvdGhlck5vZGVzKSB7XG4gICAgdmFyIGVsZW1lbnRzID0gW107XG4gICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgICB2YXIgcCA9IHBhcmFtcyB8fCB7fTtcblxuICAgIC8vIGdldCBlbGVtZW50cyBpZiBhIHNlbGVjdG9yIGlzIHNwZWNpZmllZFxuICAgIGlmIChzdHJpbmcob3RoZXJOb2RlcykpIHtcbiAgICAgIG90aGVyTm9kZXMgPSBjeS4kKG90aGVyTm9kZXMpO1xuICAgIH1cbiAgICBmb3IgKHZhciBoID0gMDsgaCA8IG90aGVyTm9kZXMubGVuZ3RoOyBoKyspIHtcbiAgICAgIHZhciBlZGdlcyA9IG90aGVyTm9kZXNbaF0uX3ByaXZhdGUuZWRnZXM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlZGdlID0gZWRnZXNbaV07XG4gICAgICAgIHZhciBlZGdlRGF0YSA9IGVkZ2UuX3ByaXZhdGUuZGF0YTtcbiAgICAgICAgdmFyIHRoaXNUb090aGVyID0gdGhpcy5oYXNFbGVtZW50V2l0aElkKGVkZ2VEYXRhLnNvdXJjZSkgJiYgb3RoZXJOb2Rlcy5oYXNFbGVtZW50V2l0aElkKGVkZ2VEYXRhLnRhcmdldCk7XG4gICAgICAgIHZhciBvdGhlclRvVGhpcyA9IG90aGVyTm9kZXMuaGFzRWxlbWVudFdpdGhJZChlZGdlRGF0YS5zb3VyY2UpICYmIHRoaXMuaGFzRWxlbWVudFdpdGhJZChlZGdlRGF0YS50YXJnZXQpO1xuICAgICAgICB2YXIgZWRnZUNvbm5lY3RzVGhpc0FuZE90aGVyID0gdGhpc1RvT3RoZXIgfHwgb3RoZXJUb1RoaXM7XG4gICAgICAgIGlmICghZWRnZUNvbm5lY3RzVGhpc0FuZE90aGVyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHAudGhpc0lzU3JjIHx8IHAudGhpc0lzVGd0KSB7XG4gICAgICAgICAgaWYgKHAudGhpc0lzU3JjICYmICF0aGlzVG9PdGhlcikge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwLnRoaXNJc1RndCAmJiAhb3RoZXJUb1RoaXMpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50cy5wdXNoKGVkZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGF3bihlbGVtZW50cywgdHJ1ZSk7XG4gIH07XG59XG5leHRlbmQoZWxlc2ZuJDIsIHtcbiAgY29ubmVjdGVkRWRnZXM6IGNhY2hlKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHZhciByZXRFbGVzID0gW107XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5vZGUgPSBlbGVzW2ldO1xuICAgICAgaWYgKCFub2RlLmlzTm9kZSgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGVkZ2VzID0gbm9kZS5fcHJpdmF0ZS5lZGdlcztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWRnZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tqXTtcbiAgICAgICAgcmV0RWxlcy5wdXNoKGVkZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGF3bihyZXRFbGVzLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LCAnY29ubmVjdGVkRWRnZXMnKSxcbiAgY29ubmVjdGVkTm9kZXM6IGNhY2hlKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHZhciByZXRFbGVzID0gW107XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVkZ2UgPSBlbGVzW2ldO1xuICAgICAgaWYgKCFlZGdlLmlzRWRnZSgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmV0RWxlcy5wdXNoKGVkZ2Uuc291cmNlKClbMF0pO1xuICAgICAgcmV0RWxlcy5wdXNoKGVkZ2UudGFyZ2V0KClbMF0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGF3bihyZXRFbGVzLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LCAnY29ubmVjdGVkTm9kZXMnKSxcbiAgcGFyYWxsZWxFZGdlczogY2FjaGUoZGVmaW5lUGFyYWxsZWxFZGdlc0Z1bmN0aW9uKCksICdwYXJhbGxlbEVkZ2VzJyksXG4gIGNvZGlyZWN0ZWRFZGdlczogY2FjaGUoZGVmaW5lUGFyYWxsZWxFZGdlc0Z1bmN0aW9uKHtcbiAgICBjb2RpcmVjdGVkOiB0cnVlXG4gIH0pLCAnY29kaXJlY3RlZEVkZ2VzJylcbn0pO1xuZnVuY3Rpb24gZGVmaW5lUGFyYWxsZWxFZGdlc0Z1bmN0aW9uKHBhcmFtcykge1xuICB2YXIgZGVmYXVsdHMgPSB7XG4gICAgY29kaXJlY3RlZDogZmFsc2VcbiAgfTtcbiAgcGFyYW1zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgcGFyYW1zKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHBhcmFsbGVsRWRnZXNJbXBsKHNlbGVjdG9yKSB7XG4gICAgLy8gbWljcm8tb3B0aW1pc2VkIGZvciByZW5kZXJlclxuICAgIHZhciBlbGVtZW50cyA9IFtdO1xuICAgIHZhciBlZGdlcyA9IHRoaXMuZWRnZXMoKTtcbiAgICB2YXIgcCA9IHBhcmFtcztcblxuICAgIC8vIGxvb2sgYXQgYWxsIHRoZSBlZGdlcyBpbiB0aGUgY29sbGVjdGlvblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlZGdlMSA9IGVkZ2VzW2ldO1xuICAgICAgdmFyIGVkZ2UxX3AgPSBlZGdlMS5fcHJpdmF0ZTtcbiAgICAgIHZhciBzcmMxID0gZWRnZTFfcC5zb3VyY2U7XG4gICAgICB2YXIgc3JjaWQxID0gc3JjMS5fcHJpdmF0ZS5kYXRhLmlkO1xuICAgICAgdmFyIHRndGlkMSA9IGVkZ2UxX3AuZGF0YS50YXJnZXQ7XG4gICAgICB2YXIgc3JjRWRnZXMxID0gc3JjMS5fcHJpdmF0ZS5lZGdlcztcblxuICAgICAgLy8gbG9vayBhdCBlZGdlcyBjb25uZWN0ZWQgdG8gdGhlIHNyYyBub2RlIG9mIHRoaXMgZWRnZVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzcmNFZGdlczEubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGVkZ2UyID0gc3JjRWRnZXMxW2pdO1xuICAgICAgICB2YXIgZWRnZTJkYXRhID0gZWRnZTIuX3ByaXZhdGUuZGF0YTtcbiAgICAgICAgdmFyIHRndGlkMiA9IGVkZ2UyZGF0YS50YXJnZXQ7XG4gICAgICAgIHZhciBzcmNpZDIgPSBlZGdlMmRhdGEuc291cmNlO1xuICAgICAgICB2YXIgY29kaXJlY3RlZCA9IHRndGlkMiA9PT0gdGd0aWQxICYmIHNyY2lkMiA9PT0gc3JjaWQxO1xuICAgICAgICB2YXIgb3BwZGlyZWN0ZWQgPSBzcmNpZDEgPT09IHRndGlkMiAmJiB0Z3RpZDEgPT09IHNyY2lkMjtcbiAgICAgICAgaWYgKHAuY29kaXJlY3RlZCAmJiBjb2RpcmVjdGVkIHx8ICFwLmNvZGlyZWN0ZWQgJiYgKGNvZGlyZWN0ZWQgfHwgb3BwZGlyZWN0ZWQpKSB7XG4gICAgICAgICAgZWxlbWVudHMucHVzaChlZGdlMik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oZWxlbWVudHMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH07XG59XG5cbi8vIE1pc2MgZnVuY3Rpb25zXG4vLy8vLy8vLy8vLy8vLy8vL1xuXG5leHRlbmQoZWxlc2ZuJDIsIHtcbiAgY29tcG9uZW50czogZnVuY3Rpb24gY29tcG9uZW50cyhyb290KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBjeSA9IHNlbGYuY3koKTtcbiAgICB2YXIgdmlzaXRlZCA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICB2YXIgdW52aXNpdGVkID0gcm9vdCA9PSBudWxsID8gc2VsZi5ub2RlcygpIDogcm9vdC5ub2RlcygpO1xuICAgIHZhciBjb21wb25lbnRzID0gW107XG4gICAgaWYgKHJvb3QgIT0gbnVsbCAmJiB1bnZpc2l0ZWQuZW1wdHkoKSkge1xuICAgICAgLy8gcm9vdCBtYXkgY29udGFpbiBvbmx5IGVkZ2VzXG4gICAgICB1bnZpc2l0ZWQgPSByb290LnNvdXJjZXMoKTsgLy8gZG9lc24ndCBtYXR0ZXIgd2hpY2ggbm9kZSB0byB1c2UgKHVuZGlyZWN0ZWQpLCBzbyBqdXN0IHVzZSB0aGUgc291cmNlIHNpZGVzXG4gICAgfVxuXG4gICAgdmFyIHZpc2l0SW5Db21wb25lbnQgPSBmdW5jdGlvbiB2aXNpdEluQ29tcG9uZW50KG5vZGUsIGNvbXBvbmVudCkge1xuICAgICAgdmlzaXRlZC5tZXJnZShub2RlKTtcbiAgICAgIHVudmlzaXRlZC51bm1lcmdlKG5vZGUpO1xuICAgICAgY29tcG9uZW50Lm1lcmdlKG5vZGUpO1xuICAgIH07XG4gICAgaWYgKHVudmlzaXRlZC5lbXB0eSgpKSB7XG4gICAgICByZXR1cm4gc2VsZi5zcGF3bigpO1xuICAgIH1cbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcCgpIHtcbiAgICAgIC8vIGVhY2ggaXRlcmF0aW9uIHlpZWxkcyBhIGNvbXBvbmVudFxuICAgICAgdmFyIGNtcHQgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICBjb21wb25lbnRzLnB1c2goY21wdCk7XG4gICAgICB2YXIgcm9vdCA9IHVudmlzaXRlZFswXTtcbiAgICAgIHZpc2l0SW5Db21wb25lbnQocm9vdCwgY21wdCk7XG4gICAgICBzZWxmLmJmcyh7XG4gICAgICAgIGRpcmVjdGVkOiBmYWxzZSxcbiAgICAgICAgcm9vdHM6IHJvb3QsXG4gICAgICAgIHZpc2l0OiBmdW5jdGlvbiB2aXNpdCh2KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0SW5Db21wb25lbnQodiwgY21wdCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY21wdC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIG5vZGUuY29ubmVjdGVkRWRnZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgLy8gY29ubmVjdGVkRWRnZXMoKSB1c3VhbGx5IGNhY2hlZFxuICAgICAgICAgIGlmIChzZWxmLmhhcyhlKSAmJiBjbXB0LmhhcyhlLnNvdXJjZSgpKSAmJiBjbXB0LmhhcyhlLnRhcmdldCgpKSkge1xuICAgICAgICAgICAgLy8gaGFzKCkgaXMgY2hlYXBcbiAgICAgICAgICAgIGNtcHQubWVyZ2UoZSk7IC8vIGZvckVhY2goKSBvbmx5IGNvbnNpZGVycyBub2RlcyAtLSBzZXRzIE4gYXQgY2FsbCB0aW1lXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgZG8ge1xuICAgICAgX2xvb3AoKTtcbiAgICB9IHdoaWxlICh1bnZpc2l0ZWQubGVuZ3RoID4gMCk7XG4gICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gIH0sXG4gIGNvbXBvbmVudDogZnVuY3Rpb24gY29tcG9uZW50KCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHJldHVybiBlbGUuY3koKS5tdXRhYmxlRWxlbWVudHMoKS5jb21wb25lbnRzKGVsZSlbMF07XG4gIH1cbn0pO1xuZWxlc2ZuJDIuY29tcG9uZW50c09mID0gZWxlc2ZuJDIuY29tcG9uZW50cztcblxuLy8gcmVwcmVzZW50cyBhIHNldCBvZiBub2RlcywgZWRnZXMsIG9yIGJvdGggdG9nZXRoZXJcbnZhciBDb2xsZWN0aW9uID0gZnVuY3Rpb24gQ29sbGVjdGlvbihjeSwgZWxlbWVudHMpIHtcbiAgdmFyIHVuaXF1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG4gIHZhciByZW1vdmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBmYWxzZTtcbiAgaWYgKGN5ID09PSB1bmRlZmluZWQpIHtcbiAgICBlcnJvcignQSBjb2xsZWN0aW9uIG11c3QgaGF2ZSBhIHJlZmVyZW5jZSB0byB0aGUgY29yZScpO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbWFwID0gbmV3IE1hcCQxKCk7XG4gIHZhciBjcmVhdGVkRWxlbWVudHMgPSBmYWxzZTtcbiAgaWYgKCFlbGVtZW50cykge1xuICAgIGVsZW1lbnRzID0gW107XG4gIH0gZWxzZSBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCAmJiBwbGFpbk9iamVjdChlbGVtZW50c1swXSkgJiYgIWVsZW1lbnQoZWxlbWVudHNbMF0pKSB7XG4gICAgY3JlYXRlZEVsZW1lbnRzID0gdHJ1ZTtcblxuICAgIC8vIG1ha2UgZWxlbWVudHMgZnJvbSBqc29uIGFuZCByZXN0b3JlIGFsbCBhdCBvbmNlIGxhdGVyXG4gICAgdmFyIGVsZXMgPSBbXTtcbiAgICB2YXIgZWxlc0lkcyA9IG5ldyBTZXQkMSgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIganNvbiA9IGVsZW1lbnRzW2ldO1xuICAgICAgaWYgKGpzb24uZGF0YSA9PSBudWxsKSB7XG4gICAgICAgIGpzb24uZGF0YSA9IHt9O1xuICAgICAgfVxuICAgICAgdmFyIF9kYXRhID0ganNvbi5kYXRhO1xuXG4gICAgICAvLyBtYWtlIHN1cmUgbmV3bHkgY3JlYXRlZCBlbGVtZW50cyBoYXZlIHZhbGlkIGlkc1xuICAgICAgaWYgKF9kYXRhLmlkID09IG51bGwpIHtcbiAgICAgICAgX2RhdGEuaWQgPSB1dWlkKCk7XG4gICAgICB9IGVsc2UgaWYgKGN5Lmhhc0VsZW1lbnRXaXRoSWQoX2RhdGEuaWQpIHx8IGVsZXNJZHMuaGFzKF9kYXRhLmlkKSkge1xuICAgICAgICBjb250aW51ZTsgLy8gY2FuJ3QgY3JlYXRlIGVsZW1lbnQgaWYgcHJpb3IgaWQgYWxyZWFkeSBleGlzdHNcbiAgICAgIH1cblxuICAgICAgdmFyIGVsZSA9IG5ldyBFbGVtZW50KGN5LCBqc29uLCBmYWxzZSk7XG4gICAgICBlbGVzLnB1c2goZWxlKTtcbiAgICAgIGVsZXNJZHMuYWRkKF9kYXRhLmlkKTtcbiAgICB9XG4gICAgZWxlbWVudHMgPSBlbGVzO1xuICB9XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgZm9yICh2YXIgX2kgPSAwLCBfbCA9IGVsZW1lbnRzLmxlbmd0aDsgX2kgPCBfbDsgX2krKykge1xuICAgIHZhciBlbGVtZW50JDEgPSBlbGVtZW50c1tfaV1bMF07IC8vIFswXSBpbiBjYXNlIGVsZW1lbnRzIGlzIGFuIGFycmF5IG9mIGNvbGxlY3Rpb25zLCByYXRoZXIgdGhhbiBhcnJheSBvZiBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50JDEgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBpZCA9IGVsZW1lbnQkMS5fcHJpdmF0ZS5kYXRhLmlkO1xuICAgIGlmICghdW5pcXVlIHx8ICFtYXAuaGFzKGlkKSkge1xuICAgICAgaWYgKHVuaXF1ZSkge1xuICAgICAgICBtYXAuc2V0KGlkLCB7XG4gICAgICAgICAgaW5kZXg6IHRoaXMubGVuZ3RoLFxuICAgICAgICAgIGVsZTogZWxlbWVudCQxXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpc1t0aGlzLmxlbmd0aF0gPSBlbGVtZW50JDE7XG4gICAgICB0aGlzLmxlbmd0aCsrO1xuICAgIH1cbiAgfVxuICB0aGlzLl9wcml2YXRlID0ge1xuICAgIGVsZXM6IHRoaXMsXG4gICAgY3k6IGN5LFxuICAgIGdldCBtYXAoKSB7XG4gICAgICBpZiAodGhpcy5sYXp5TWFwID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5yZWJ1aWxkTWFwKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5sYXp5TWFwO1xuICAgIH0sXG4gICAgc2V0IG1hcChtKSB7XG4gICAgICB0aGlzLmxhenlNYXAgPSBtO1xuICAgIH0sXG4gICAgcmVidWlsZE1hcDogZnVuY3Rpb24gcmVidWlsZE1hcCgpIHtcbiAgICAgIHZhciBtID0gdGhpcy5sYXp5TWFwID0gbmV3IE1hcCQxKCk7XG4gICAgICB2YXIgZWxlcyA9IHRoaXMuZWxlcztcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGVsZXMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICB2YXIgX2VsZSA9IGVsZXNbX2kyXTtcbiAgICAgICAgbS5zZXQoX2VsZS5pZCgpLCB7XG4gICAgICAgICAgaW5kZXg6IF9pMixcbiAgICAgICAgICBlbGU6IF9lbGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBpZiAodW5pcXVlKSB7XG4gICAgdGhpcy5fcHJpdmF0ZS5tYXAgPSBtYXA7XG4gIH1cblxuICAvLyByZXN0b3JlIHRoZSBlbGVtZW50cyBpZiB3ZSBjcmVhdGVkIHRoZW0gZnJvbSBqc29uXG4gIGlmIChjcmVhdGVkRWxlbWVudHMgJiYgIXJlbW92ZWQpIHtcbiAgICB0aGlzLnJlc3RvcmUoKTtcbiAgfVxufTtcblxuLy8gRnVuY3Rpb25zXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8vIGtlZXAgdGhlIHByb3RvdHlwZXMgaW4gc3luYyAoYW4gZWxlbWVudCBoYXMgdGhlIHNhbWUgZnVuY3Rpb25zIGFzIGEgY29sbGVjdGlvbilcbi8vIGFuZCB1c2UgZWxlZm4gYW5kIGVsZXNmbiBhcyBzaG9ydGhhbmRzIHRvIHRoZSBwcm90b3R5cGVzXG52YXIgZWxlc2ZuJDEgPSBFbGVtZW50LnByb3RvdHlwZSA9IENvbGxlY3Rpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShBcnJheS5wcm90b3R5cGUpO1xuZWxlc2ZuJDEuaW5zdGFuY2VTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAnY29sbGVjdGlvbic7XG59O1xuZWxlc2ZuJDEuc3Bhd24gPSBmdW5jdGlvbiAoZWxlcywgdW5pcXVlKSB7XG4gIHJldHVybiBuZXcgQ29sbGVjdGlvbih0aGlzLmN5KCksIGVsZXMsIHVuaXF1ZSk7XG59O1xuZWxlc2ZuJDEuc3Bhd25TZWxmID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5zcGF3bih0aGlzKTtcbn07XG5lbGVzZm4kMS5jeSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuY3k7XG59O1xuZWxlc2ZuJDEucmVuZGVyZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9wcml2YXRlLmN5LnJlbmRlcmVyKCk7XG59O1xuZWxlc2ZuJDEuZWxlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXNbMF07XG59O1xuZWxlc2ZuJDEuY29sbGVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKGNvbGxlY3Rpb24odGhpcykpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSBlbHNlIHtcbiAgICAvLyBhbiBlbGVtZW50XG4gICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKHRoaXMuX3ByaXZhdGUuY3ksIFt0aGlzXSk7XG4gIH1cbn07XG5lbGVzZm4kMS51bmlxdWUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgQ29sbGVjdGlvbih0aGlzLl9wcml2YXRlLmN5LCB0aGlzLCB0cnVlKTtcbn07XG5lbGVzZm4kMS5oYXNFbGVtZW50V2l0aElkID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlkID0gJycgKyBpZDsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcblxuICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5tYXAuaGFzKGlkKTtcbn07XG5lbGVzZm4kMS5nZXRFbGVtZW50QnlJZCA9IGZ1bmN0aW9uIChpZCkge1xuICBpZCA9ICcnICsgaWQ7IC8vIGlkIG11c3QgYmUgc3RyaW5nXG5cbiAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgdmFyIGVudHJ5ID0gdGhpcy5fcHJpdmF0ZS5tYXAuZ2V0KGlkKTtcbiAgcmV0dXJuIGVudHJ5ID8gZW50cnkuZWxlIDogbmV3IENvbGxlY3Rpb24oY3kpOyAvLyBnZXQgZWxlIG9yIGVtcHR5IGNvbGxlY3Rpb25cbn07XG5cbmVsZXNmbiQxLiRpZCA9IGVsZXNmbiQxLmdldEVsZW1lbnRCeUlkO1xuZWxlc2ZuJDEucG9vbEluZGV4ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICB2YXIgZWxlcyA9IGN5Ll9wcml2YXRlLmVsZW1lbnRzO1xuICB2YXIgaWQgPSB0aGlzWzBdLl9wcml2YXRlLmRhdGEuaWQ7XG4gIHJldHVybiBlbGVzLl9wcml2YXRlLm1hcC5nZXQoaWQpLmluZGV4O1xufTtcbmVsZXNmbiQxLmluZGV4T2YgPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHZhciBpZCA9IGVsZVswXS5fcHJpdmF0ZS5kYXRhLmlkO1xuICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5tYXAuZ2V0KGlkKS5pbmRleDtcbn07XG5lbGVzZm4kMS5pbmRleE9mSWQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgaWQgPSAnJyArIGlkOyAvLyBpZCBtdXN0IGJlIHN0cmluZ1xuXG4gIHJldHVybiB0aGlzLl9wcml2YXRlLm1hcC5nZXQoaWQpLmluZGV4O1xufTtcbmVsZXNmbiQxLmpzb24gPSBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBlbGUgPSB0aGlzLmVsZW1lbnQoKTtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICBpZiAoZWxlID09IG51bGwgJiYgb2JqKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gLy8gY2FuJ3Qgc2V0IHRvIG5vIGVsZXNcblxuICBpZiAoZWxlID09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IC8vIGNhbid0IGdldCBmcm9tIG5vIGVsZXNcblxuICB2YXIgcCA9IGVsZS5fcHJpdmF0ZTtcbiAgaWYgKHBsYWluT2JqZWN0KG9iaikpIHtcbiAgICAvLyBzZXRcblxuICAgIGN5LnN0YXJ0QmF0Y2goKTtcbiAgICBpZiAob2JqLmRhdGEpIHtcbiAgICAgIGVsZS5kYXRhKG9iai5kYXRhKTtcbiAgICAgIHZhciBfZGF0YTIgPSBwLmRhdGE7XG4gICAgICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgICAgIC8vIHNvdXJjZSBhbmQgdGFyZ2V0IGFyZSBpbW11dGFibGUgdmlhIGRhdGEoKVxuICAgICAgICB2YXIgbW92ZSA9IGZhbHNlO1xuICAgICAgICB2YXIgc3BlYyA9IHt9O1xuICAgICAgICB2YXIgc3JjID0gb2JqLmRhdGEuc291cmNlO1xuICAgICAgICB2YXIgdGd0ID0gb2JqLmRhdGEudGFyZ2V0O1xuICAgICAgICBpZiAoc3JjICE9IG51bGwgJiYgc3JjICE9IF9kYXRhMi5zb3VyY2UpIHtcbiAgICAgICAgICBzcGVjLnNvdXJjZSA9ICcnICsgc3JjOyAvLyBpZCBtdXN0IGJlIHN0cmluZ1xuICAgICAgICAgIG1vdmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0Z3QgIT0gbnVsbCAmJiB0Z3QgIT0gX2RhdGEyLnRhcmdldCkge1xuICAgICAgICAgIHNwZWMudGFyZ2V0ID0gJycgKyB0Z3Q7IC8vIGlkIG11c3QgYmUgc3RyaW5nXG4gICAgICAgICAgbW92ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vdmUpIHtcbiAgICAgICAgICBlbGUgPSBlbGUubW92ZShzcGVjKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcGFyZW50IGlzIGltbXV0YWJsZSB2aWEgZGF0YSgpXG4gICAgICAgIHZhciBuZXdQYXJlbnRWYWxTcGVjZCA9ICgncGFyZW50JyBpbiBvYmouZGF0YSk7XG4gICAgICAgIHZhciBwYXJlbnQgPSBvYmouZGF0YS5wYXJlbnQ7XG4gICAgICAgIGlmIChuZXdQYXJlbnRWYWxTcGVjZCAmJiAocGFyZW50ICE9IG51bGwgfHwgX2RhdGEyLnBhcmVudCAhPSBudWxsKSAmJiBwYXJlbnQgIT0gX2RhdGEyLnBhcmVudCkge1xuICAgICAgICAgIGlmIChwYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gY2FuJ3Qgc2V0IHVuZGVmaW5lZCBpbXBlcmF0aXZlbHksIHNvIHVzZSBudWxsXG4gICAgICAgICAgICBwYXJlbnQgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHBhcmVudCA9ICcnICsgcGFyZW50OyAvLyBpZCBtdXN0IGJlIHN0cmluZ1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVsZSA9IGVsZS5tb3ZlKHtcbiAgICAgICAgICAgIHBhcmVudDogcGFyZW50XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9iai5wb3NpdGlvbikge1xuICAgICAgZWxlLnBvc2l0aW9uKG9iai5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgLy8gaWdub3JlIGdyb3VwIC0tIGltbXV0YWJsZVxuXG4gICAgdmFyIGNoZWNrU3dpdGNoID0gZnVuY3Rpb24gY2hlY2tTd2l0Y2goaywgdHJ1ZUZuTmFtZSwgZmFsc2VGbk5hbWUpIHtcbiAgICAgIHZhciBvYmpfayA9IG9ialtrXTtcbiAgICAgIGlmIChvYmpfayAhPSBudWxsICYmIG9ial9rICE9PSBwW2tdKSB7XG4gICAgICAgIGlmIChvYmpfaykge1xuICAgICAgICAgIGVsZVt0cnVlRm5OYW1lXSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZVtmYWxzZUZuTmFtZV0oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgY2hlY2tTd2l0Y2goJ3JlbW92ZWQnLCAncmVtb3ZlJywgJ3Jlc3RvcmUnKTtcbiAgICBjaGVja1N3aXRjaCgnc2VsZWN0ZWQnLCAnc2VsZWN0JywgJ3Vuc2VsZWN0Jyk7XG4gICAgY2hlY2tTd2l0Y2goJ3NlbGVjdGFibGUnLCAnc2VsZWN0aWZ5JywgJ3Vuc2VsZWN0aWZ5Jyk7XG4gICAgY2hlY2tTd2l0Y2goJ2xvY2tlZCcsICdsb2NrJywgJ3VubG9jaycpO1xuICAgIGNoZWNrU3dpdGNoKCdncmFiYmFibGUnLCAnZ3JhYmlmeScsICd1bmdyYWJpZnknKTtcbiAgICBjaGVja1N3aXRjaCgncGFubmFibGUnLCAncGFuaWZ5JywgJ3VucGFuaWZ5Jyk7XG4gICAgaWYgKG9iai5jbGFzc2VzICE9IG51bGwpIHtcbiAgICAgIGVsZS5jbGFzc2VzKG9iai5jbGFzc2VzKTtcbiAgICB9XG4gICAgY3kuZW5kQmF0Y2goKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSBlbHNlIGlmIChvYmogPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIGdldFxuXG4gICAgdmFyIGpzb24gPSB7XG4gICAgICBkYXRhOiBjb3B5KHAuZGF0YSksXG4gICAgICBwb3NpdGlvbjogY29weShwLnBvc2l0aW9uKSxcbiAgICAgIGdyb3VwOiBwLmdyb3VwLFxuICAgICAgcmVtb3ZlZDogcC5yZW1vdmVkLFxuICAgICAgc2VsZWN0ZWQ6IHAuc2VsZWN0ZWQsXG4gICAgICBzZWxlY3RhYmxlOiBwLnNlbGVjdGFibGUsXG4gICAgICBsb2NrZWQ6IHAubG9ja2VkLFxuICAgICAgZ3JhYmJhYmxlOiBwLmdyYWJiYWJsZSxcbiAgICAgIHBhbm5hYmxlOiBwLnBhbm5hYmxlLFxuICAgICAgY2xhc3NlczogbnVsbFxuICAgIH07XG4gICAganNvbi5jbGFzc2VzID0gJyc7XG4gICAgdmFyIGkgPSAwO1xuICAgIHAuY2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uIChjbHMpIHtcbiAgICAgIHJldHVybiBqc29uLmNsYXNzZXMgKz0gaSsrID09PSAwID8gY2xzIDogJyAnICsgY2xzO1xuICAgIH0pO1xuICAgIHJldHVybiBqc29uO1xuICB9XG59O1xuZWxlc2ZuJDEuanNvbnMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBqc29ucyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICB2YXIganNvbiA9IGVsZS5qc29uKCk7XG4gICAganNvbnMucHVzaChqc29uKTtcbiAgfVxuICByZXR1cm4ganNvbnM7XG59O1xuZWxlc2ZuJDEuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIGVsZXNBcnIgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgdmFyIGpzb24gPSBlbGUuanNvbigpO1xuICAgIHZhciBjbG9uZSA9IG5ldyBFbGVtZW50KGN5LCBqc29uLCBmYWxzZSk7IC8vIE5CIG5vIHJlc3RvcmVcblxuICAgIGVsZXNBcnIucHVzaChjbG9uZSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKGN5LCBlbGVzQXJyKTtcbn07XG5lbGVzZm4kMS5jb3B5ID0gZWxlc2ZuJDEuY2xvbmU7XG5lbGVzZm4kMS5yZXN0b3JlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm90aWZ5UmVuZGVyZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7XG4gIHZhciBhZGRUb1Bvb2wgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGN5ID0gc2VsZi5jeSgpO1xuICB2YXIgY3lfcCA9IGN5Ll9wcml2YXRlO1xuXG4gIC8vIGNyZWF0ZSBhcnJheXMgb2Ygbm9kZXMgYW5kIGVkZ2VzLCBzaW5jZSB3ZSBuZWVkIHRvXG4gIC8vIHJlc3RvcmUgdGhlIG5vZGVzIGZpcnN0XG4gIHZhciBub2RlcyA9IFtdO1xuICB2YXIgZWRnZXMgPSBbXTtcbiAgdmFyIGVsZW1lbnRzO1xuICBmb3IgKHZhciBfaTMgPSAwLCBsID0gc2VsZi5sZW5ndGg7IF9pMyA8IGw7IF9pMysrKSB7XG4gICAgdmFyIGVsZSA9IHNlbGZbX2kzXTtcbiAgICBpZiAoYWRkVG9Qb29sICYmICFlbGUucmVtb3ZlZCgpKSB7XG4gICAgICAvLyBkb24ndCBuZWVkIHRvIGhhbmRsZSB0aGlzIGVsZVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8ga2VlcCBub2RlcyBmaXJzdCBpbiB0aGUgYXJyYXkgYW5kIGVkZ2VzIGFmdGVyXG4gICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgLy8gcHV0IHRvIGZyb250IG9mIGFycmF5IGlmIG5vZGVcbiAgICAgIG5vZGVzLnB1c2goZWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcHV0IHRvIGVuZCBvZiBhcnJheSBpZiBlZGdlXG4gICAgICBlZGdlcy5wdXNoKGVsZSk7XG4gICAgfVxuICB9XG4gIGVsZW1lbnRzID0gbm9kZXMuY29uY2F0KGVkZ2VzKTtcbiAgdmFyIGk7XG4gIHZhciByZW1vdmVGcm9tRWxlbWVudHMgPSBmdW5jdGlvbiByZW1vdmVGcm9tRWxlbWVudHMoKSB7XG4gICAgZWxlbWVudHMuc3BsaWNlKGksIDEpO1xuICAgIGktLTtcbiAgfTtcblxuICAvLyBub3csIHJlc3RvcmUgZWFjaCBlbGVtZW50XG4gIGZvciAoaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBfZWxlMiA9IGVsZW1lbnRzW2ldO1xuICAgIHZhciBfcHJpdmF0ZSA9IF9lbGUyLl9wcml2YXRlO1xuICAgIHZhciBfZGF0YTMgPSBfcHJpdmF0ZS5kYXRhO1xuXG4gICAgLy8gdGhlIHRyYXZlcnNhbCBjYWNoZSBzaG91bGQgc3RhcnQgZnJlc2ggd2hlbiBlbGUgaXMgYWRkZWRcbiAgICBfZWxlMi5jbGVhclRyYXZlcnNhbENhY2hlKCk7XG5cbiAgICAvLyBzZXQgaWQgYW5kIHZhbGlkYXRlXG4gICAgaWYgKCFhZGRUb1Bvb2wgJiYgIV9wcml2YXRlLnJlbW92ZWQpIDsgZWxzZSBpZiAoX2RhdGEzLmlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIF9kYXRhMy5pZCA9IHV1aWQoKTtcbiAgICB9IGVsc2UgaWYgKG51bWJlciQxKF9kYXRhMy5pZCkpIHtcbiAgICAgIF9kYXRhMy5pZCA9ICcnICsgX2RhdGEzLmlkOyAvLyBub3cgaXQncyBhIHN0cmluZ1xuICAgIH0gZWxzZSBpZiAoZW1wdHlTdHJpbmcoX2RhdGEzLmlkKSB8fCAhc3RyaW5nKF9kYXRhMy5pZCkpIHtcbiAgICAgIGVycm9yKCdDYW4gbm90IGNyZWF0ZSBlbGVtZW50IHdpdGggaW52YWxpZCBzdHJpbmcgSUQgYCcgKyBfZGF0YTMuaWQgKyAnYCcpO1xuXG4gICAgICAvLyBjYW4ndCBjcmVhdGUgZWxlbWVudCBpZiBpdCBoYXMgZW1wdHkgc3RyaW5nIGFzIGlkIG9yIG5vbi1zdHJpbmcgaWRcbiAgICAgIHJlbW92ZUZyb21FbGVtZW50cygpO1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmIChjeS5oYXNFbGVtZW50V2l0aElkKF9kYXRhMy5pZCkpIHtcbiAgICAgIGVycm9yKCdDYW4gbm90IGNyZWF0ZSBzZWNvbmQgZWxlbWVudCB3aXRoIElEIGAnICsgX2RhdGEzLmlkICsgJ2AnKTtcblxuICAgICAgLy8gY2FuJ3QgY3JlYXRlIGVsZW1lbnQgaWYgb25lIGFscmVhZHkgaGFzIHRoYXQgaWRcbiAgICAgIHJlbW92ZUZyb21FbGVtZW50cygpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBpZCA9IF9kYXRhMy5pZDsgLy8gaWQgaXMgZmluYWxpc2VkLCBub3cgbGV0J3Mga2VlcCBhIHJlZlxuXG4gICAgaWYgKF9lbGUyLmlzTm9kZSgpKSB7XG4gICAgICAvLyBleHRyYSBjaGVja3MgZm9yIG5vZGVzXG4gICAgICB2YXIgcG9zID0gX3ByaXZhdGUucG9zaXRpb247XG5cbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgbm9kZXMgaGF2ZSBhIGRlZmluZWQgcG9zaXRpb25cblxuICAgICAgaWYgKHBvcy54ID09IG51bGwpIHtcbiAgICAgICAgcG9zLnggPSAwO1xuICAgICAgfVxuICAgICAgaWYgKHBvcy55ID09IG51bGwpIHtcbiAgICAgICAgcG9zLnkgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoX2VsZTIuaXNFZGdlKCkpIHtcbiAgICAgIC8vIGV4dHJhIGNoZWNrcyBmb3IgZWRnZXNcblxuICAgICAgdmFyIGVkZ2UgPSBfZWxlMjtcbiAgICAgIHZhciBmaWVsZHMgPSBbJ3NvdXJjZScsICd0YXJnZXQnXTtcbiAgICAgIHZhciBmaWVsZHNMZW5ndGggPSBmaWVsZHMubGVuZ3RoO1xuICAgICAgdmFyIGJhZFNvdXJjZU9yVGFyZ2V0ID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGZpZWxkc0xlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBmaWVsZCA9IGZpZWxkc1tqXTtcbiAgICAgICAgdmFyIHZhbCA9IF9kYXRhM1tmaWVsZF07XG4gICAgICAgIGlmIChudW1iZXIkMSh2YWwpKSB7XG4gICAgICAgICAgdmFsID0gX2RhdGEzW2ZpZWxkXSA9ICcnICsgX2RhdGEzW2ZpZWxkXTsgLy8gbm93IHN0cmluZ1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IHZhbCA9PT0gJycpIHtcbiAgICAgICAgICAvLyBjYW4ndCBjcmVhdGUgaWYgc291cmNlIG9yIHRhcmdldCBpcyBub3QgZGVmaW5lZCBwcm9wZXJseVxuICAgICAgICAgIGVycm9yKCdDYW4gbm90IGNyZWF0ZSBlZGdlIGAnICsgaWQgKyAnYCB3aXRoIHVuc3BlY2lmaWVkICcgKyBmaWVsZCk7XG4gICAgICAgICAgYmFkU291cmNlT3JUYXJnZXQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKCFjeS5oYXNFbGVtZW50V2l0aElkKHZhbCkpIHtcbiAgICAgICAgICAvLyBjYW4ndCBjcmVhdGUgZWRnZSBpZiBvbmUgb2YgaXRzIG5vZGVzIGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgICBlcnJvcignQ2FuIG5vdCBjcmVhdGUgZWRnZSBgJyArIGlkICsgJ2Agd2l0aCBub25leGlzdGFudCAnICsgZmllbGQgKyAnIGAnICsgdmFsICsgJ2AnKTtcbiAgICAgICAgICBiYWRTb3VyY2VPclRhcmdldCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChiYWRTb3VyY2VPclRhcmdldCkge1xuICAgICAgICByZW1vdmVGcm9tRWxlbWVudHMoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIGNhbid0IGNyZWF0ZSB0aGlzXG5cbiAgICAgIHZhciBzcmMgPSBjeS5nZXRFbGVtZW50QnlJZChfZGF0YTMuc291cmNlKTtcbiAgICAgIHZhciB0Z3QgPSBjeS5nZXRFbGVtZW50QnlJZChfZGF0YTMudGFyZ2V0KTtcblxuICAgICAgLy8gb25seSBvbmUgZWRnZSBpbiBub2RlIGlmIGxvb3BcbiAgICAgIGlmIChzcmMuc2FtZSh0Z3QpKSB7XG4gICAgICAgIHNyYy5fcHJpdmF0ZS5lZGdlcy5wdXNoKGVkZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3JjLl9wcml2YXRlLmVkZ2VzLnB1c2goZWRnZSk7XG4gICAgICAgIHRndC5fcHJpdmF0ZS5lZGdlcy5wdXNoKGVkZ2UpO1xuICAgICAgfVxuICAgICAgZWRnZS5fcHJpdmF0ZS5zb3VyY2UgPSBzcmM7XG4gICAgICBlZGdlLl9wcml2YXRlLnRhcmdldCA9IHRndDtcbiAgICB9IC8vIGlmIGlzIGVkZ2VcblxuICAgIC8vIGNyZWF0ZSBtb2NrIGlkcyAvIGluZGV4ZXMgbWFwcyBmb3IgZWxlbWVudCBzbyBpdCBjYW4gYmUgdXNlZCBsaWtlIGNvbGxlY3Rpb25zXG4gICAgX3ByaXZhdGUubWFwID0gbmV3IE1hcCQxKCk7XG4gICAgX3ByaXZhdGUubWFwLnNldChpZCwge1xuICAgICAgZWxlOiBfZWxlMixcbiAgICAgIGluZGV4OiAwXG4gICAgfSk7XG4gICAgX3ByaXZhdGUucmVtb3ZlZCA9IGZhbHNlO1xuICAgIGlmIChhZGRUb1Bvb2wpIHtcbiAgICAgIGN5LmFkZFRvUG9vbChfZWxlMik7XG4gICAgfVxuICB9IC8vIGZvciBlYWNoIGVsZW1lbnRcblxuICAvLyBkbyBjb21wb3VuZCBub2RlIHNhbml0eSBjaGVja3NcbiAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgbm9kZXMubGVuZ3RoOyBfaTQrKykge1xuICAgIC8vIGVhY2ggbm9kZVxuICAgIHZhciBub2RlID0gbm9kZXNbX2k0XTtcbiAgICB2YXIgX2RhdGE0ID0gbm9kZS5fcHJpdmF0ZS5kYXRhO1xuICAgIGlmIChudW1iZXIkMShfZGF0YTQucGFyZW50KSkge1xuICAgICAgLy8gdGhlbiBhdXRvbWFrZSBzdHJpbmdcbiAgICAgIF9kYXRhNC5wYXJlbnQgPSAnJyArIF9kYXRhNC5wYXJlbnQ7XG4gICAgfVxuICAgIHZhciBwYXJlbnRJZCA9IF9kYXRhNC5wYXJlbnQ7XG4gICAgdmFyIHNwZWNpZmllZFBhcmVudCA9IHBhcmVudElkICE9IG51bGw7XG4gICAgaWYgKHNwZWNpZmllZFBhcmVudCB8fCBub2RlLl9wcml2YXRlLnBhcmVudCkge1xuICAgICAgdmFyIHBhcmVudCA9IG5vZGUuX3ByaXZhdGUucGFyZW50ID8gY3kuY29sbGVjdGlvbigpLm1lcmdlKG5vZGUuX3ByaXZhdGUucGFyZW50KSA6IGN5LmdldEVsZW1lbnRCeUlkKHBhcmVudElkKTtcbiAgICAgIGlmIChwYXJlbnQuZW1wdHkoKSkge1xuICAgICAgICAvLyBub24tZXhpc3RhbnQgcGFyZW50OyBqdXN0IHJlbW92ZSBpdFxuICAgICAgICBfZGF0YTQucGFyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIGlmIChwYXJlbnRbMF0ucmVtb3ZlZCgpKSB7XG4gICAgICAgIHdhcm4oJ05vZGUgYWRkZWQgd2l0aCBtaXNzaW5nIHBhcmVudCwgcmVmZXJlbmNlIHRvIHBhcmVudCByZW1vdmVkJyk7XG4gICAgICAgIF9kYXRhNC5wYXJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIG5vZGUuX3ByaXZhdGUucGFyZW50ID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBzZWxmQXNQYXJlbnQgPSBmYWxzZTtcbiAgICAgICAgdmFyIGFuY2VzdG9yID0gcGFyZW50O1xuICAgICAgICB3aGlsZSAoIWFuY2VzdG9yLmVtcHR5KCkpIHtcbiAgICAgICAgICBpZiAobm9kZS5zYW1lKGFuY2VzdG9yKSkge1xuICAgICAgICAgICAgLy8gbWFyayBzZWxmIGFzIHBhcmVudCBhbmQgcmVtb3ZlIGZyb20gZGF0YVxuICAgICAgICAgICAgc2VsZkFzUGFyZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIF9kYXRhNC5wYXJlbnQgPSB1bmRlZmluZWQ7IC8vIHJlbW92ZSBwYXJlbnQgcmVmZXJlbmNlXG5cbiAgICAgICAgICAgIC8vIGV4aXQgb3Igd2UgbG9vcCBmb3JldmVyXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbGZBc1BhcmVudCkge1xuICAgICAgICAgIC8vIGNvbm5lY3Qgd2l0aCBjaGlsZHJlblxuICAgICAgICAgIHBhcmVudFswXS5fcHJpdmF0ZS5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgICAgICAgIG5vZGUuX3ByaXZhdGUucGFyZW50ID0gcGFyZW50WzBdO1xuXG4gICAgICAgICAgLy8gbGV0IHRoZSBjb3JlIGtub3cgd2UgaGF2ZSBhIGNvbXBvdW5kIGdyYXBoXG4gICAgICAgICAgY3lfcC5oYXNDb21wb3VuZE5vZGVzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBlbHNlXG4gICAgfSAvLyBpZiBzcGVjaWZpZWQgcGFyZW50XG4gIH0gLy8gZm9yIGVhY2ggbm9kZVxuXG4gIGlmIChlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIHJlc3RvcmVkID0gZWxlbWVudHMubGVuZ3RoID09PSBzZWxmLmxlbmd0aCA/IHNlbGYgOiBuZXcgQ29sbGVjdGlvbihjeSwgZWxlbWVudHMpO1xuICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IHJlc3RvcmVkLmxlbmd0aDsgX2k1KyspIHtcbiAgICAgIHZhciBfZWxlMyA9IHJlc3RvcmVkW19pNV07XG4gICAgICBpZiAoX2VsZTMuaXNOb2RlKCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGFkZGluZyBhbiBlZGdlIGludmFsaWRhdGVzIHRoZSB0cmF2ZXJzYWwgY2FjaGVzIGZvciB0aGUgcGFyYWxsZWwgZWRnZXNcbiAgICAgIF9lbGUzLnBhcmFsbGVsRWRnZXMoKS5jbGVhclRyYXZlcnNhbENhY2hlKCk7XG5cbiAgICAgIC8vIGFkZGluZyBhbiBlZGdlIGludmFsaWRhdGVzIHRoZSB0cmF2ZXJzYWwgY2FjaGUgZm9yIHRoZSBjb25uZWN0ZWQgbm9kZXNcbiAgICAgIF9lbGUzLnNvdXJjZSgpLmNsZWFyVHJhdmVyc2FsQ2FjaGUoKTtcbiAgICAgIF9lbGUzLnRhcmdldCgpLmNsZWFyVHJhdmVyc2FsQ2FjaGUoKTtcbiAgICB9XG4gICAgdmFyIHRvVXBkYXRlU3R5bGU7XG4gICAgaWYgKGN5X3AuaGFzQ29tcG91bmROb2Rlcykge1xuICAgICAgdG9VcGRhdGVTdHlsZSA9IGN5LmNvbGxlY3Rpb24oKS5tZXJnZShyZXN0b3JlZCkubWVyZ2UocmVzdG9yZWQuY29ubmVjdGVkTm9kZXMoKSkubWVyZ2UocmVzdG9yZWQucGFyZW50KCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0b1VwZGF0ZVN0eWxlID0gcmVzdG9yZWQ7XG4gICAgfVxuICAgIHRvVXBkYXRlU3R5bGUuZGlydHlDb21wb3VuZEJvdW5kc0NhY2hlKCkuZGlydHlCb3VuZGluZ0JveENhY2hlKCkudXBkYXRlU3R5bGUobm90aWZ5UmVuZGVyZXIpO1xuICAgIGlmIChub3RpZnlSZW5kZXJlcikge1xuICAgICAgcmVzdG9yZWQuZW1pdEFuZE5vdGlmeSgnYWRkJyk7XG4gICAgfSBlbHNlIGlmIChhZGRUb1Bvb2wpIHtcbiAgICAgIHJlc3RvcmVkLmVtaXQoJ2FkZCcpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2VsZjsgLy8gY2hhaW5hYmlsaXR5XG59O1xuXG5lbGVzZm4kMS5yZW1vdmVkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgcmV0dXJuIGVsZSAmJiBlbGUuX3ByaXZhdGUucmVtb3ZlZDtcbn07XG5lbGVzZm4kMS5pbnNpZGUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICByZXR1cm4gZWxlICYmICFlbGUuX3ByaXZhdGUucmVtb3ZlZDtcbn07XG5lbGVzZm4kMS5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBub3RpZnlSZW5kZXJlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdHJ1ZTtcbiAgdmFyIHJlbW92ZUZyb21Qb29sID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBlbGVzVG9SZW1vdmUgPSBbXTtcbiAgdmFyIGVsZXNUb1JlbW92ZUlkcyA9IHt9O1xuICB2YXIgY3kgPSBzZWxmLl9wcml2YXRlLmN5O1xuXG4gIC8vIGFkZCBjb25uZWN0ZWQgZWRnZXNcbiAgZnVuY3Rpb24gYWRkQ29ubmVjdGVkRWRnZXMobm9kZSkge1xuICAgIHZhciBlZGdlcyA9IG5vZGUuX3ByaXZhdGUuZWRnZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgYWRkKGVkZ2VzW2ldKTtcbiAgICB9XG4gIH1cblxuICAvLyBhZGQgZGVzY2VuZGFudCBub2Rlc1xuICBmdW5jdGlvbiBhZGRDaGlsZHJlbihub2RlKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gbm9kZS5fcHJpdmF0ZS5jaGlsZHJlbjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhZGQoY2hpbGRyZW5baV0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBhZGQoZWxlKSB7XG4gICAgdmFyIGFscmVhZHlBZGRlZCA9IGVsZXNUb1JlbW92ZUlkc1tlbGUuaWQoKV07XG4gICAgaWYgKHJlbW92ZUZyb21Qb29sICYmIGVsZS5yZW1vdmVkKCkgfHwgYWxyZWFkeUFkZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZXNUb1JlbW92ZUlkc1tlbGUuaWQoKV0gPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICBlbGVzVG9SZW1vdmUucHVzaChlbGUpOyAvLyBub2RlcyBhcmUgcmVtb3ZlZCBsYXN0XG5cbiAgICAgIGFkZENvbm5lY3RlZEVkZ2VzKGVsZSk7XG4gICAgICBhZGRDaGlsZHJlbihlbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVzVG9SZW1vdmUudW5zaGlmdChlbGUpOyAvLyBlZGdlcyBhcmUgcmVtb3ZlZCBmaXJzdFxuICAgIH1cbiAgfVxuXG4gIC8vIG1ha2UgdGhlIGxpc3Qgb2YgZWxlbWVudHMgdG8gcmVtb3ZlXG4gIC8vIChtYXkgYmUgcmVtb3ZpbmcgbW9yZSB0aGFuIHNwZWNpZmllZCBkdWUgdG8gY29ubmVjdGVkIGVkZ2VzIGV0YylcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IHNlbGYubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IHNlbGZbaV07XG4gICAgYWRkKGVsZSk7XG4gIH1cbiAgZnVuY3Rpb24gcmVtb3ZlRWRnZVJlZihub2RlLCBlZGdlKSB7XG4gICAgdmFyIGNvbm5lY3RlZEVkZ2VzID0gbm9kZS5fcHJpdmF0ZS5lZGdlcztcbiAgICByZW1vdmVGcm9tQXJyYXkoY29ubmVjdGVkRWRnZXMsIGVkZ2UpO1xuXG4gICAgLy8gcmVtb3ZpbmcgYW4gZWRnZXMgaW52YWxpZGF0ZXMgdGhlIHRyYXZlcnNhbCBjYWNoZSBmb3IgaXRzIG5vZGVzXG4gICAgbm9kZS5jbGVhclRyYXZlcnNhbENhY2hlKCk7XG4gIH1cbiAgZnVuY3Rpb24gcmVtb3ZlUGFyYWxsZWxSZWYocGxsRWRnZSkge1xuICAgIC8vIHJlbW92aW5nIGFuIGVkZ2UgaW52YWxpZGF0ZXMgdGhlIHRyYXZlcnNhbCBjYWNoZXMgZm9yIHRoZSBwYXJhbGxlbCBlZGdlc1xuICAgIHBsbEVkZ2UuY2xlYXJUcmF2ZXJzYWxDYWNoZSgpO1xuICB9XG4gIHZhciBhbHRlcmVkUGFyZW50cyA9IFtdO1xuICBhbHRlcmVkUGFyZW50cy5pZHMgPSB7fTtcbiAgZnVuY3Rpb24gcmVtb3ZlQ2hpbGRSZWYocGFyZW50LCBlbGUpIHtcbiAgICBlbGUgPSBlbGVbMF07XG4gICAgcGFyZW50ID0gcGFyZW50WzBdO1xuICAgIHZhciBjaGlsZHJlbiA9IHBhcmVudC5fcHJpdmF0ZS5jaGlsZHJlbjtcbiAgICB2YXIgcGlkID0gcGFyZW50LmlkKCk7XG4gICAgcmVtb3ZlRnJvbUFycmF5KGNoaWxkcmVuLCBlbGUpOyAvLyByZW1vdmUgcGFyZW50ID0+IGNoaWxkIHJlZlxuXG4gICAgZWxlLl9wcml2YXRlLnBhcmVudCA9IG51bGw7IC8vIHJlbW92ZSBjaGlsZCA9PiBwYXJlbnQgcmVmXG5cbiAgICBpZiAoIWFsdGVyZWRQYXJlbnRzLmlkc1twaWRdKSB7XG4gICAgICBhbHRlcmVkUGFyZW50cy5pZHNbcGlkXSA9IHRydWU7XG4gICAgICBhbHRlcmVkUGFyZW50cy5wdXNoKHBhcmVudCk7XG4gICAgfVxuICB9XG4gIHNlbGYuZGlydHlDb21wb3VuZEJvdW5kc0NhY2hlKCk7XG4gIGlmIChyZW1vdmVGcm9tUG9vbCkge1xuICAgIGN5LnJlbW92ZUZyb21Qb29sKGVsZXNUb1JlbW92ZSk7IC8vIHJlbW92ZSBmcm9tIGNvcmUgcG9vbFxuICB9XG5cbiAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgZWxlc1RvUmVtb3ZlLmxlbmd0aDsgX2k2KyspIHtcbiAgICB2YXIgX2VsZTQgPSBlbGVzVG9SZW1vdmVbX2k2XTtcbiAgICBpZiAoX2VsZTQuaXNFZGdlKCkpIHtcbiAgICAgIC8vIHJlbW92ZSByZWZlcmVuY2VzIHRvIHRoaXMgZWRnZSBpbiBpdHMgY29ubmVjdGVkIG5vZGVzXG4gICAgICB2YXIgc3JjID0gX2VsZTQuc291cmNlKClbMF07XG4gICAgICB2YXIgdGd0ID0gX2VsZTQudGFyZ2V0KClbMF07XG4gICAgICByZW1vdmVFZGdlUmVmKHNyYywgX2VsZTQpO1xuICAgICAgcmVtb3ZlRWRnZVJlZih0Z3QsIF9lbGU0KTtcbiAgICAgIHZhciBwbGxFZGdlcyA9IF9lbGU0LnBhcmFsbGVsRWRnZXMoKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGxsRWRnZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIHBsbEVkZ2UgPSBwbGxFZGdlc1tqXTtcbiAgICAgICAgcmVtb3ZlUGFyYWxsZWxSZWYocGxsRWRnZSk7XG4gICAgICAgIGlmIChwbGxFZGdlLmlzQnVuZGxlZEJlemllcigpKSB7XG4gICAgICAgICAgcGxsRWRnZS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyByZW1vdmUgcmVmZXJlbmNlIHRvIHBhcmVudFxuICAgICAgdmFyIHBhcmVudCA9IF9lbGU0LnBhcmVudCgpO1xuICAgICAgaWYgKHBhcmVudC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgcmVtb3ZlQ2hpbGRSZWYocGFyZW50LCBfZWxlNCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZW1vdmVGcm9tUG9vbCkge1xuICAgICAgLy8gbWFyayBhcyByZW1vdmVkXG4gICAgICBfZWxlNC5fcHJpdmF0ZS5yZW1vdmVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIGNvbXBvdW5kIGdyYXBoIG9yIG5vdFxuICB2YXIgZWxlc1N0aWxsSW5zaWRlID0gY3kuX3ByaXZhdGUuZWxlbWVudHM7XG4gIGN5Ll9wcml2YXRlLmhhc0NvbXBvdW5kTm9kZXMgPSBmYWxzZTtcbiAgZm9yICh2YXIgX2k3ID0gMDsgX2k3IDwgZWxlc1N0aWxsSW5zaWRlLmxlbmd0aDsgX2k3KyspIHtcbiAgICB2YXIgX2VsZTUgPSBlbGVzU3RpbGxJbnNpZGVbX2k3XTtcbiAgICBpZiAoX2VsZTUuaXNQYXJlbnQoKSkge1xuICAgICAgY3kuX3ByaXZhdGUuaGFzQ29tcG91bmROb2RlcyA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgdmFyIHJlbW92ZWRFbGVtZW50cyA9IG5ldyBDb2xsZWN0aW9uKHRoaXMuY3koKSwgZWxlc1RvUmVtb3ZlKTtcbiAgaWYgKHJlbW92ZWRFbGVtZW50cy5zaXplKCkgPiAwKSB7XG4gICAgLy8gbXVzdCBtYW51YWxseSBub3RpZnkgc2luY2UgdHJpZ2dlciB3b24ndCBkbyB0aGlzIGF1dG9tYXRpY2FsbHkgb25jZSByZW1vdmVkXG5cbiAgICBpZiAobm90aWZ5UmVuZGVyZXIpIHtcbiAgICAgIHJlbW92ZWRFbGVtZW50cy5lbWl0QW5kTm90aWZ5KCdyZW1vdmUnKTtcbiAgICB9IGVsc2UgaWYgKHJlbW92ZUZyb21Qb29sKSB7XG4gICAgICByZW1vdmVkRWxlbWVudHMuZW1pdCgncmVtb3ZlJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gdGhlIHBhcmVudHMgd2hvIHdlcmUgbW9kaWZpZWQgYnkgdGhlIHJlbW92YWwgbmVlZCB0aGVpciBzdHlsZSB1cGRhdGVkXG4gIGZvciAodmFyIF9pOCA9IDA7IF9pOCA8IGFsdGVyZWRQYXJlbnRzLmxlbmd0aDsgX2k4KyspIHtcbiAgICB2YXIgX2VsZTYgPSBhbHRlcmVkUGFyZW50c1tfaThdO1xuICAgIGlmICghcmVtb3ZlRnJvbVBvb2wgfHwgIV9lbGU2LnJlbW92ZWQoKSkge1xuICAgICAgX2VsZTYudXBkYXRlU3R5bGUoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWRFbGVtZW50cztcbn07XG5lbGVzZm4kMS5tb3ZlID0gZnVuY3Rpb24gKHN0cnVjdCkge1xuICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICB2YXIgZWxlcyA9IHRoaXM7XG5cbiAgLy8ganVzdCBjbGVhbiB1cCByZWZzLCBjYWNoZXMsIGV0Yy4gaW4gdGhlIHNhbWUgd2F5IGFzIHdoZW4gcmVtb3ZpbmcgYW5kIHRoZW4gcmVzdG9yaW5nXG4gIC8vIChvdXIgY2FsbHMgdG8gcmVtb3ZlL3Jlc3RvcmUgZG8gbm90IHJlbW92ZSBmcm9tIHRoZSBncmFwaCBvciBtYWtlIGV2ZW50cylcbiAgdmFyIG5vdGlmeVJlbmRlcmVyID0gZmFsc2U7XG4gIHZhciBtb2RpZnlQb29sID0gZmFsc2U7XG4gIHZhciB0b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKGlkKSB7XG4gICAgcmV0dXJuIGlkID09IG51bGwgPyBpZCA6ICcnICsgaWQ7XG4gIH07IC8vIGlkIG11c3QgYmUgc3RyaW5nXG5cbiAgaWYgKHN0cnVjdC5zb3VyY2UgIT09IHVuZGVmaW5lZCB8fCBzdHJ1Y3QudGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgc3JjSWQgPSB0b1N0cmluZyhzdHJ1Y3Quc291cmNlKTtcbiAgICB2YXIgdGd0SWQgPSB0b1N0cmluZyhzdHJ1Y3QudGFyZ2V0KTtcbiAgICB2YXIgc3JjRXhpc3RzID0gc3JjSWQgIT0gbnVsbCAmJiBjeS5oYXNFbGVtZW50V2l0aElkKHNyY0lkKTtcbiAgICB2YXIgdGd0RXhpc3RzID0gdGd0SWQgIT0gbnVsbCAmJiBjeS5oYXNFbGVtZW50V2l0aElkKHRndElkKTtcbiAgICBpZiAoc3JjRXhpc3RzIHx8IHRndEV4aXN0cykge1xuICAgICAgY3kuYmF0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBhdm9pZCBkdXBsaWNhdGUgc3R5bGUgdXBkYXRlc1xuICAgICAgICBlbGVzLnJlbW92ZShub3RpZnlSZW5kZXJlciwgbW9kaWZ5UG9vbCk7IC8vIGNsZWFuIHVwIHJlZnMgZXRjLlxuICAgICAgICBlbGVzLmVtaXRBbmROb3RpZnkoJ21vdmVvdXQnKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgICAgdmFyIF9kYXRhNSA9IGVsZS5fcHJpdmF0ZS5kYXRhO1xuICAgICAgICAgIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICAgICAgICAgIGlmIChzcmNFeGlzdHMpIHtcbiAgICAgICAgICAgICAgX2RhdGE1LnNvdXJjZSA9IHNyY0lkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRndEV4aXN0cykge1xuICAgICAgICAgICAgICBfZGF0YTUudGFyZ2V0ID0gdGd0SWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsZXMucmVzdG9yZShub3RpZnlSZW5kZXJlciwgbW9kaWZ5UG9vbCk7IC8vIG1ha2UgbmV3IHJlZnMsIHN0eWxlLCBldGMuXG4gICAgICB9KTtcblxuICAgICAgZWxlcy5lbWl0QW5kTm90aWZ5KCdtb3ZlJyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHN0cnVjdC5wYXJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIG1vdmUgbm9kZSB0byBuZXcgcGFyZW50XG4gICAgdmFyIHBhcmVudElkID0gdG9TdHJpbmcoc3RydWN0LnBhcmVudCk7XG4gICAgdmFyIHBhcmVudEV4aXN0cyA9IHBhcmVudElkID09PSBudWxsIHx8IGN5Lmhhc0VsZW1lbnRXaXRoSWQocGFyZW50SWQpO1xuICAgIGlmIChwYXJlbnRFeGlzdHMpIHtcbiAgICAgIHZhciBwaWRUb0Fzc2lnbiA9IHBhcmVudElkID09PSBudWxsID8gdW5kZWZpbmVkIDogcGFyZW50SWQ7XG4gICAgICBjeS5iYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGF2b2lkIGR1cGxpY2F0ZSBzdHlsZSB1cGRhdGVzXG4gICAgICAgIHZhciB1cGRhdGVkID0gZWxlcy5yZW1vdmUobm90aWZ5UmVuZGVyZXIsIG1vZGlmeVBvb2wpOyAvLyBjbGVhbiB1cCByZWZzIGV0Yy5cbiAgICAgICAgdXBkYXRlZC5lbWl0QW5kTm90aWZ5KCdtb3Zlb3V0Jyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgICAgIHZhciBfZGF0YTYgPSBlbGUuX3ByaXZhdGUuZGF0YTtcbiAgICAgICAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgICAgICBfZGF0YTYucGFyZW50ID0gcGlkVG9Bc3NpZ247XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZWQucmVzdG9yZShub3RpZnlSZW5kZXJlciwgbW9kaWZ5UG9vbCk7IC8vIG1ha2UgbmV3IHJlZnMsIHN0eWxlLCBldGMuXG4gICAgICB9KTtcblxuICAgICAgZWxlcy5lbWl0QW5kTm90aWZ5KCdtb3ZlJyk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufTtcbltlbGVzZm4kaiwgZWxlc2ZuJGksIGVsZXNmbiRoLCBlbGVzZm4kZywgZWxlc2ZuJGYsIGRhdGEsIGVsZXNmbiRkLCBkaW1lbnNpb25zLCBlbGVzZm4kOSwgZWxlc2ZuJDgsIGVsZXNmbiQ3LCBlbGVzZm4kNiwgZWxlc2ZuJDUsIGVsZXNmbiQ0LCBlbGVzZm4kMywgZWxlc2ZuJDJdLmZvckVhY2goZnVuY3Rpb24gKHByb3BzKSB7XG4gIGV4dGVuZChlbGVzZm4kMSwgcHJvcHMpO1xufSk7XG5cbnZhciBjb3JlZm4kOSA9IHtcbiAgYWRkOiBmdW5jdGlvbiBhZGQob3B0cykge1xuICAgIHZhciBlbGVtZW50cztcbiAgICB2YXIgY3kgPSB0aGlzO1xuXG4gICAgLy8gYWRkIHRoZSBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50T3JDb2xsZWN0aW9uKG9wdHMpKSB7XG4gICAgICB2YXIgZWxlcyA9IG9wdHM7XG4gICAgICBpZiAoZWxlcy5fcHJpdmF0ZS5jeSA9PT0gY3kpIHtcbiAgICAgICAgLy8gc2FtZSBpbnN0YW5jZSA9PiBqdXN0IHJlc3RvcmVcbiAgICAgICAgZWxlbWVudHMgPSBlbGVzLnJlc3RvcmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSwgY29weSBmcm9tIGpzb25cbiAgICAgICAgdmFyIGpzb25zID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgICAgIGpzb25zLnB1c2goZWxlLmpzb24oKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudHMgPSBuZXcgQ29sbGVjdGlvbihjeSwganNvbnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNwZWNpZnkgYW4gYXJyYXkgb2Ygb3B0aW9uc1xuICAgIGVsc2UgaWYgKGFycmF5KG9wdHMpKSB7XG4gICAgICB2YXIgX2pzb25zID0gb3B0cztcbiAgICAgIGVsZW1lbnRzID0gbmV3IENvbGxlY3Rpb24oY3ksIF9qc29ucyk7XG4gICAgfVxuXG4gICAgLy8gc3BlY2lmeSB2aWEgb3B0cy5ub2RlcyBhbmQgb3B0cy5lZGdlc1xuICAgIGVsc2UgaWYgKHBsYWluT2JqZWN0KG9wdHMpICYmIChhcnJheShvcHRzLm5vZGVzKSB8fCBhcnJheShvcHRzLmVkZ2VzKSkpIHtcbiAgICAgIHZhciBlbGVzQnlHcm91cCA9IG9wdHM7XG4gICAgICB2YXIgX2pzb25zMiA9IFtdO1xuICAgICAgdmFyIGdycyA9IFsnbm9kZXMnLCAnZWRnZXMnXTtcbiAgICAgIGZvciAodmFyIF9pID0gMCwgaWwgPSBncnMubGVuZ3RoOyBfaSA8IGlsOyBfaSsrKSB7XG4gICAgICAgIHZhciBncm91cCA9IGdyc1tfaV07XG4gICAgICAgIHZhciBlbGVzQXJyYXkgPSBlbGVzQnlHcm91cFtncm91cF07XG4gICAgICAgIGlmIChhcnJheShlbGVzQXJyYXkpKSB7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGpsID0gZWxlc0FycmF5Lmxlbmd0aDsgaiA8IGpsOyBqKyspIHtcbiAgICAgICAgICAgIHZhciBqc29uID0gZXh0ZW5kKHtcbiAgICAgICAgICAgICAgZ3JvdXA6IGdyb3VwXG4gICAgICAgICAgICB9LCBlbGVzQXJyYXlbal0pO1xuICAgICAgICAgICAgX2pzb25zMi5wdXNoKGpzb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxlbWVudHMgPSBuZXcgQ29sbGVjdGlvbihjeSwgX2pzb25zMik7XG4gICAgfVxuXG4gICAgLy8gc3BlY2lmeSBvcHRpb25zIGZvciBvbmUgZWxlbWVudFxuICAgIGVsc2Uge1xuICAgICAgdmFyIF9qc29uID0gb3B0cztcbiAgICAgIGVsZW1lbnRzID0gbmV3IEVsZW1lbnQoY3ksIF9qc29uKS5jb2xsZWN0aW9uKCk7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50cztcbiAgfSxcbiAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoY29sbGVjdGlvbikge1xuICAgIGlmIChlbGVtZW50T3JDb2xsZWN0aW9uKGNvbGxlY3Rpb24pKSA7IGVsc2UgaWYgKHN0cmluZyhjb2xsZWN0aW9uKSkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gY29sbGVjdGlvbjtcbiAgICAgIGNvbGxlY3Rpb24gPSB0aGlzLiQoc2VsZWN0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gY29sbGVjdGlvbi5yZW1vdmUoKTtcbiAgfVxufTtcblxuLyogZ2xvYmFsIEZsb2F0MzJBcnJheSAqL1xuXG4vKiEgQmV6aWVyIGN1cnZlIGZ1bmN0aW9uIGdlbmVyYXRvci4gQ29weXJpZ2h0IEdhZXRhbiBSZW5hdWRlYXUuIE1JVCBMaWNlbnNlOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01JVF9MaWNlbnNlICovXG5mdW5jdGlvbiBnZW5lcmF0ZUN1YmljQmV6aWVyKG1YMSwgbVkxLCBtWDIsIG1ZMikge1xuICB2YXIgTkVXVE9OX0lURVJBVElPTlMgPSA0LFxuICAgIE5FV1RPTl9NSU5fU0xPUEUgPSAwLjAwMSxcbiAgICBTVUJESVZJU0lPTl9QUkVDSVNJT04gPSAwLjAwMDAwMDEsXG4gICAgU1VCRElWSVNJT05fTUFYX0lURVJBVElPTlMgPSAxMCxcbiAgICBrU3BsaW5lVGFibGVTaXplID0gMTEsXG4gICAga1NhbXBsZVN0ZXBTaXplID0gMS4wIC8gKGtTcGxpbmVUYWJsZVNpemUgLSAxLjApLFxuICAgIGZsb2F0MzJBcnJheVN1cHBvcnRlZCA9IHR5cGVvZiBGbG9hdDMyQXJyYXkgIT09ICd1bmRlZmluZWQnO1xuXG4gIC8qIE11c3QgY29udGFpbiBmb3VyIGFyZ3VtZW50cy4gKi9cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggIT09IDQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiBBcmd1bWVudHMgbXVzdCBiZSBudW1iZXJzLiAqL1xuICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzW2ldICE9PSBcIm51bWJlclwiIHx8IGlzTmFOKGFyZ3VtZW50c1tpXSkgfHwgIWlzRmluaXRlKGFyZ3VtZW50c1tpXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiBYIHZhbHVlcyBtdXN0IGJlIGluIHRoZSBbMCwgMV0gcmFuZ2UuICovXG4gIG1YMSA9IE1hdGgubWluKG1YMSwgMSk7XG4gIG1YMiA9IE1hdGgubWluKG1YMiwgMSk7XG4gIG1YMSA9IE1hdGgubWF4KG1YMSwgMCk7XG4gIG1YMiA9IE1hdGgubWF4KG1YMiwgMCk7XG4gIHZhciBtU2FtcGxlVmFsdWVzID0gZmxvYXQzMkFycmF5U3VwcG9ydGVkID8gbmV3IEZsb2F0MzJBcnJheShrU3BsaW5lVGFibGVTaXplKSA6IG5ldyBBcnJheShrU3BsaW5lVGFibGVTaXplKTtcbiAgZnVuY3Rpb24gQShhQTEsIGFBMikge1xuICAgIHJldHVybiAxLjAgLSAzLjAgKiBhQTIgKyAzLjAgKiBhQTE7XG4gIH1cbiAgZnVuY3Rpb24gQihhQTEsIGFBMikge1xuICAgIHJldHVybiAzLjAgKiBhQTIgLSA2LjAgKiBhQTE7XG4gIH1cbiAgZnVuY3Rpb24gQyhhQTEpIHtcbiAgICByZXR1cm4gMy4wICogYUExO1xuICB9XG4gIGZ1bmN0aW9uIGNhbGNCZXppZXIoYVQsIGFBMSwgYUEyKSB7XG4gICAgcmV0dXJuICgoQShhQTEsIGFBMikgKiBhVCArIEIoYUExLCBhQTIpKSAqIGFUICsgQyhhQTEpKSAqIGFUO1xuICB9XG4gIGZ1bmN0aW9uIGdldFNsb3BlKGFULCBhQTEsIGFBMikge1xuICAgIHJldHVybiAzLjAgKiBBKGFBMSwgYUEyKSAqIGFUICogYVQgKyAyLjAgKiBCKGFBMSwgYUEyKSAqIGFUICsgQyhhQTEpO1xuICB9XG4gIGZ1bmN0aW9uIG5ld3RvblJhcGhzb25JdGVyYXRlKGFYLCBhR3Vlc3NUKSB7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IE5FV1RPTl9JVEVSQVRJT05TOyArK19pKSB7XG4gICAgICB2YXIgY3VycmVudFNsb3BlID0gZ2V0U2xvcGUoYUd1ZXNzVCwgbVgxLCBtWDIpO1xuICAgICAgaWYgKGN1cnJlbnRTbG9wZSA9PT0gMC4wKSB7XG4gICAgICAgIHJldHVybiBhR3Vlc3NUO1xuICAgICAgfVxuICAgICAgdmFyIGN1cnJlbnRYID0gY2FsY0JlemllcihhR3Vlc3NULCBtWDEsIG1YMikgLSBhWDtcbiAgICAgIGFHdWVzc1QgLT0gY3VycmVudFggLyBjdXJyZW50U2xvcGU7XG4gICAgfVxuICAgIHJldHVybiBhR3Vlc3NUO1xuICB9XG4gIGZ1bmN0aW9uIGNhbGNTYW1wbGVWYWx1ZXMoKSB7XG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwga1NwbGluZVRhYmxlU2l6ZTsgKytfaTIpIHtcbiAgICAgIG1TYW1wbGVWYWx1ZXNbX2kyXSA9IGNhbGNCZXppZXIoX2kyICoga1NhbXBsZVN0ZXBTaXplLCBtWDEsIG1YMik7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGJpbmFyeVN1YmRpdmlkZShhWCwgYUEsIGFCKSB7XG4gICAgdmFyIGN1cnJlbnRYLFxuICAgICAgY3VycmVudFQsXG4gICAgICBpID0gMDtcbiAgICBkbyB7XG4gICAgICBjdXJyZW50VCA9IGFBICsgKGFCIC0gYUEpIC8gMi4wO1xuICAgICAgY3VycmVudFggPSBjYWxjQmV6aWVyKGN1cnJlbnRULCBtWDEsIG1YMikgLSBhWDtcbiAgICAgIGlmIChjdXJyZW50WCA+IDAuMCkge1xuICAgICAgICBhQiA9IGN1cnJlbnRUO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYUEgPSBjdXJyZW50VDtcbiAgICAgIH1cbiAgICB9IHdoaWxlIChNYXRoLmFicyhjdXJyZW50WCkgPiBTVUJESVZJU0lPTl9QUkVDSVNJT04gJiYgKytpIDwgU1VCRElWSVNJT05fTUFYX0lURVJBVElPTlMpO1xuICAgIHJldHVybiBjdXJyZW50VDtcbiAgfVxuICBmdW5jdGlvbiBnZXRURm9yWChhWCkge1xuICAgIHZhciBpbnRlcnZhbFN0YXJ0ID0gMC4wLFxuICAgICAgY3VycmVudFNhbXBsZSA9IDEsXG4gICAgICBsYXN0U2FtcGxlID0ga1NwbGluZVRhYmxlU2l6ZSAtIDE7XG4gICAgZm9yICg7IGN1cnJlbnRTYW1wbGUgIT09IGxhc3RTYW1wbGUgJiYgbVNhbXBsZVZhbHVlc1tjdXJyZW50U2FtcGxlXSA8PSBhWDsgKytjdXJyZW50U2FtcGxlKSB7XG4gICAgICBpbnRlcnZhbFN0YXJ0ICs9IGtTYW1wbGVTdGVwU2l6ZTtcbiAgICB9XG4gICAgLS1jdXJyZW50U2FtcGxlO1xuICAgIHZhciBkaXN0ID0gKGFYIC0gbVNhbXBsZVZhbHVlc1tjdXJyZW50U2FtcGxlXSkgLyAobVNhbXBsZVZhbHVlc1tjdXJyZW50U2FtcGxlICsgMV0gLSBtU2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGVdKSxcbiAgICAgIGd1ZXNzRm9yVCA9IGludGVydmFsU3RhcnQgKyBkaXN0ICoga1NhbXBsZVN0ZXBTaXplLFxuICAgICAgaW5pdGlhbFNsb3BlID0gZ2V0U2xvcGUoZ3Vlc3NGb3JULCBtWDEsIG1YMik7XG4gICAgaWYgKGluaXRpYWxTbG9wZSA+PSBORVdUT05fTUlOX1NMT1BFKSB7XG4gICAgICByZXR1cm4gbmV3dG9uUmFwaHNvbkl0ZXJhdGUoYVgsIGd1ZXNzRm9yVCk7XG4gICAgfSBlbHNlIGlmIChpbml0aWFsU2xvcGUgPT09IDAuMCkge1xuICAgICAgcmV0dXJuIGd1ZXNzRm9yVDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJpbmFyeVN1YmRpdmlkZShhWCwgaW50ZXJ2YWxTdGFydCwgaW50ZXJ2YWxTdGFydCArIGtTYW1wbGVTdGVwU2l6ZSk7XG4gICAgfVxuICB9XG4gIHZhciBfcHJlY29tcHV0ZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gcHJlY29tcHV0ZSgpIHtcbiAgICBfcHJlY29tcHV0ZWQgPSB0cnVlO1xuICAgIGlmIChtWDEgIT09IG1ZMSB8fCBtWDIgIT09IG1ZMikge1xuICAgICAgY2FsY1NhbXBsZVZhbHVlcygpO1xuICAgIH1cbiAgfVxuICB2YXIgZiA9IGZ1bmN0aW9uIGYoYVgpIHtcbiAgICBpZiAoIV9wcmVjb21wdXRlZCkge1xuICAgICAgcHJlY29tcHV0ZSgpO1xuICAgIH1cbiAgICBpZiAobVgxID09PSBtWTEgJiYgbVgyID09PSBtWTIpIHtcbiAgICAgIHJldHVybiBhWDtcbiAgICB9XG4gICAgaWYgKGFYID09PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKGFYID09PSAxKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIGNhbGNCZXppZXIoZ2V0VEZvclgoYVgpLCBtWTEsIG1ZMik7XG4gIH07XG4gIGYuZ2V0Q29udHJvbFBvaW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gW3tcbiAgICAgIHg6IG1YMSxcbiAgICAgIHk6IG1ZMVxuICAgIH0sIHtcbiAgICAgIHg6IG1YMixcbiAgICAgIHk6IG1ZMlxuICAgIH1dO1xuICB9O1xuICB2YXIgc3RyID0gXCJnZW5lcmF0ZUJlemllcihcIiArIFttWDEsIG1ZMSwgbVgyLCBtWTJdICsgXCIpXCI7XG4gIGYudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfTtcbiAgcmV0dXJuIGY7XG59XG5cbi8qISBSdW5nZS1LdXR0YSBzcHJpbmcgcGh5c2ljcyBmdW5jdGlvbiBnZW5lcmF0b3IuIEFkYXB0ZWQgZnJvbSBGcmFtZXIuanMsIGNvcHlyaWdodCBLb2VuIEJvay4gTUlUIExpY2Vuc2U6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTUlUX0xpY2Vuc2UgKi9cbi8qIEdpdmVuIGEgdGVuc2lvbiwgZnJpY3Rpb24sIGFuZCBkdXJhdGlvbiwgYSBzaW11bGF0aW9uIGF0IDYwRlBTIHdpbGwgZmlyc3QgcnVuIHdpdGhvdXQgYSBkZWZpbmVkIGR1cmF0aW9uIGluIG9yZGVyIHRvIGNhbGN1bGF0ZSB0aGUgZnVsbCBwYXRoLiBBIHNlY29uZCBwYXNzXG4gICB0aGVuIGFkanVzdHMgdGhlIHRpbWUgZGVsdGEgLS0gdXNpbmcgdGhlIHJlbGF0aW9uIGJldHdlZW4gYWN0dWFsIHRpbWUgYW5kIGR1cmF0aW9uIC0tIHRvIGNhbGN1bGF0ZSB0aGUgcGF0aCBmb3IgdGhlIGR1cmF0aW9uLWNvbnN0cmFpbmVkIGFuaW1hdGlvbi4gKi9cbnZhciBnZW5lcmF0ZVNwcmluZ1JLNCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gc3ByaW5nQWNjZWxlcmF0aW9uRm9yU3RhdGUoc3RhdGUpIHtcbiAgICByZXR1cm4gLXN0YXRlLnRlbnNpb24gKiBzdGF0ZS54IC0gc3RhdGUuZnJpY3Rpb24gKiBzdGF0ZS52O1xuICB9XG4gIGZ1bmN0aW9uIHNwcmluZ0V2YWx1YXRlU3RhdGVXaXRoRGVyaXZhdGl2ZShpbml0aWFsU3RhdGUsIGR0LCBkZXJpdmF0aXZlKSB7XG4gICAgdmFyIHN0YXRlID0ge1xuICAgICAgeDogaW5pdGlhbFN0YXRlLnggKyBkZXJpdmF0aXZlLmR4ICogZHQsXG4gICAgICB2OiBpbml0aWFsU3RhdGUudiArIGRlcml2YXRpdmUuZHYgKiBkdCxcbiAgICAgIHRlbnNpb246IGluaXRpYWxTdGF0ZS50ZW5zaW9uLFxuICAgICAgZnJpY3Rpb246IGluaXRpYWxTdGF0ZS5mcmljdGlvblxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGR4OiBzdGF0ZS52LFxuICAgICAgZHY6IHNwcmluZ0FjY2VsZXJhdGlvbkZvclN0YXRlKHN0YXRlKVxuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gc3ByaW5nSW50ZWdyYXRlU3RhdGUoc3RhdGUsIGR0KSB7XG4gICAgdmFyIGEgPSB7XG4gICAgICAgIGR4OiBzdGF0ZS52LFxuICAgICAgICBkdjogc3ByaW5nQWNjZWxlcmF0aW9uRm9yU3RhdGUoc3RhdGUpXG4gICAgICB9LFxuICAgICAgYiA9IHNwcmluZ0V2YWx1YXRlU3RhdGVXaXRoRGVyaXZhdGl2ZShzdGF0ZSwgZHQgKiAwLjUsIGEpLFxuICAgICAgYyA9IHNwcmluZ0V2YWx1YXRlU3RhdGVXaXRoRGVyaXZhdGl2ZShzdGF0ZSwgZHQgKiAwLjUsIGIpLFxuICAgICAgZCA9IHNwcmluZ0V2YWx1YXRlU3RhdGVXaXRoRGVyaXZhdGl2ZShzdGF0ZSwgZHQsIGMpLFxuICAgICAgZHhkdCA9IDEuMCAvIDYuMCAqIChhLmR4ICsgMi4wICogKGIuZHggKyBjLmR4KSArIGQuZHgpLFxuICAgICAgZHZkdCA9IDEuMCAvIDYuMCAqIChhLmR2ICsgMi4wICogKGIuZHYgKyBjLmR2KSArIGQuZHYpO1xuICAgIHN0YXRlLnggPSBzdGF0ZS54ICsgZHhkdCAqIGR0O1xuICAgIHN0YXRlLnYgPSBzdGF0ZS52ICsgZHZkdCAqIGR0O1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gc3ByaW5nUks0RmFjdG9yeSh0ZW5zaW9uLCBmcmljdGlvbiwgZHVyYXRpb24pIHtcbiAgICB2YXIgaW5pdFN0YXRlID0ge1xuICAgICAgICB4OiAtMSxcbiAgICAgICAgdjogMCxcbiAgICAgICAgdGVuc2lvbjogbnVsbCxcbiAgICAgICAgZnJpY3Rpb246IG51bGxcbiAgICAgIH0sXG4gICAgICBwYXRoID0gWzBdLFxuICAgICAgdGltZV9sYXBzZWQgPSAwLFxuICAgICAgdG9sZXJhbmNlID0gMSAvIDEwMDAwLFxuICAgICAgRFQgPSAxNiAvIDEwMDAsXG4gICAgICBoYXZlX2R1cmF0aW9uLFxuICAgICAgZHQsXG4gICAgICBsYXN0X3N0YXRlO1xuICAgIHRlbnNpb24gPSBwYXJzZUZsb2F0KHRlbnNpb24pIHx8IDUwMDtcbiAgICBmcmljdGlvbiA9IHBhcnNlRmxvYXQoZnJpY3Rpb24pIHx8IDIwO1xuICAgIGR1cmF0aW9uID0gZHVyYXRpb24gfHwgbnVsbDtcbiAgICBpbml0U3RhdGUudGVuc2lvbiA9IHRlbnNpb247XG4gICAgaW5pdFN0YXRlLmZyaWN0aW9uID0gZnJpY3Rpb247XG4gICAgaGF2ZV9kdXJhdGlvbiA9IGR1cmF0aW9uICE9PSBudWxsO1xuXG4gICAgLyogQ2FsY3VsYXRlIHRoZSBhY3R1YWwgdGltZSBpdCB0YWtlcyBmb3IgdGhpcyBhbmltYXRpb24gdG8gY29tcGxldGUgd2l0aCB0aGUgcHJvdmlkZWQgY29uZGl0aW9ucy4gKi9cbiAgICBpZiAoaGF2ZV9kdXJhdGlvbikge1xuICAgICAgLyogUnVuIHRoZSBzaW11bGF0aW9uIHdpdGhvdXQgYSBkdXJhdGlvbi4gKi9cbiAgICAgIHRpbWVfbGFwc2VkID0gc3ByaW5nUks0RmFjdG9yeSh0ZW5zaW9uLCBmcmljdGlvbik7XG4gICAgICAvKiBDb21wdXRlIHRoZSBhZGp1c3RlZCB0aW1lIGRlbHRhLiAqL1xuICAgICAgZHQgPSB0aW1lX2xhcHNlZCAvIGR1cmF0aW9uICogRFQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGR0ID0gRFQ7XG4gICAgfVxuICAgIGZvciAoOzspIHtcbiAgICAgIC8qIE5leHQvc3RlcCBmdW5jdGlvbiAuKi9cbiAgICAgIGxhc3Rfc3RhdGUgPSBzcHJpbmdJbnRlZ3JhdGVTdGF0ZShsYXN0X3N0YXRlIHx8IGluaXRTdGF0ZSwgZHQpO1xuICAgICAgLyogU3RvcmUgdGhlIHBvc2l0aW9uLiAqL1xuICAgICAgcGF0aC5wdXNoKDEgKyBsYXN0X3N0YXRlLngpO1xuICAgICAgdGltZV9sYXBzZWQgKz0gMTY7XG4gICAgICAvKiBJZiB0aGUgY2hhbmdlIHRocmVzaG9sZCBpcyByZWFjaGVkLCBicmVhay4gKi9cbiAgICAgIGlmICghKE1hdGguYWJzKGxhc3Rfc3RhdGUueCkgPiB0b2xlcmFuY2UgJiYgTWF0aC5hYnMobGFzdF9zdGF0ZS52KSA+IHRvbGVyYW5jZSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogSWYgZHVyYXRpb24gaXMgbm90IGRlZmluZWQsIHJldHVybiB0aGUgYWN0dWFsIHRpbWUgcmVxdWlyZWQgZm9yIGNvbXBsZXRpbmcgdGhpcyBhbmltYXRpb24uIE90aGVyd2lzZSwgcmV0dXJuIGEgY2xvc3VyZSB0aGF0IGhvbGRzIHRoZVxuICAgICAgIGNvbXB1dGVkIHBhdGggYW5kIHJldHVybnMgYSBzbmFwc2hvdCBvZiB0aGUgcG9zaXRpb24gYWNjb3JkaW5nIHRvIGEgZ2l2ZW4gcGVyY2VudENvbXBsZXRlLiAqL1xuICAgIHJldHVybiAhaGF2ZV9kdXJhdGlvbiA/IHRpbWVfbGFwc2VkIDogZnVuY3Rpb24gKHBlcmNlbnRDb21wbGV0ZSkge1xuICAgICAgcmV0dXJuIHBhdGhbcGVyY2VudENvbXBsZXRlICogKHBhdGgubGVuZ3RoIC0gMSkgfCAwXTtcbiAgICB9O1xuICB9O1xufSgpO1xuXG52YXIgY3ViaWNCZXppZXIgPSBmdW5jdGlvbiBjdWJpY0Jlemllcih0MSwgcDEsIHQyLCBwMikge1xuICB2YXIgYmV6aWVyID0gZ2VuZXJhdGVDdWJpY0Jlemllcih0MSwgcDEsIHQyLCBwMik7XG4gIHJldHVybiBmdW5jdGlvbiAoc3RhcnQsIGVuZCwgcGVyY2VudCkge1xuICAgIHJldHVybiBzdGFydCArIChlbmQgLSBzdGFydCkgKiBiZXppZXIocGVyY2VudCk7XG4gIH07XG59O1xudmFyIGVhc2luZ3MgPSB7XG4gICdsaW5lYXInOiBmdW5jdGlvbiBsaW5lYXIoc3RhcnQsIGVuZCwgcGVyY2VudCkge1xuICAgIHJldHVybiBzdGFydCArIChlbmQgLSBzdGFydCkgKiBwZXJjZW50O1xuICB9LFxuICAvLyBkZWZhdWx0IGVhc2luZ3NcbiAgJ2Vhc2UnOiBjdWJpY0JlemllcigwLjI1LCAwLjEsIDAuMjUsIDEpLFxuICAnZWFzZS1pbic6IGN1YmljQmV6aWVyKDAuNDIsIDAsIDEsIDEpLFxuICAnZWFzZS1vdXQnOiBjdWJpY0JlemllcigwLCAwLCAwLjU4LCAxKSxcbiAgJ2Vhc2UtaW4tb3V0JzogY3ViaWNCZXppZXIoMC40MiwgMCwgMC41OCwgMSksXG4gIC8vIHNpbmVcbiAgJ2Vhc2UtaW4tc2luZSc6IGN1YmljQmV6aWVyKDAuNDcsIDAsIDAuNzQ1LCAwLjcxNSksXG4gICdlYXNlLW91dC1zaW5lJzogY3ViaWNCZXppZXIoMC4zOSwgMC41NzUsIDAuNTY1LCAxKSxcbiAgJ2Vhc2UtaW4tb3V0LXNpbmUnOiBjdWJpY0JlemllcigwLjQ0NSwgMC4wNSwgMC41NSwgMC45NSksXG4gIC8vIHF1YWRcbiAgJ2Vhc2UtaW4tcXVhZCc6IGN1YmljQmV6aWVyKDAuNTUsIDAuMDg1LCAwLjY4LCAwLjUzKSxcbiAgJ2Vhc2Utb3V0LXF1YWQnOiBjdWJpY0JlemllcigwLjI1LCAwLjQ2LCAwLjQ1LCAwLjk0KSxcbiAgJ2Vhc2UtaW4tb3V0LXF1YWQnOiBjdWJpY0JlemllcigwLjQ1NSwgMC4wMywgMC41MTUsIDAuOTU1KSxcbiAgLy8gY3ViaWNcbiAgJ2Vhc2UtaW4tY3ViaWMnOiBjdWJpY0JlemllcigwLjU1LCAwLjA1NSwgMC42NzUsIDAuMTkpLFxuICAnZWFzZS1vdXQtY3ViaWMnOiBjdWJpY0JlemllcigwLjIxNSwgMC42MSwgMC4zNTUsIDEpLFxuICAnZWFzZS1pbi1vdXQtY3ViaWMnOiBjdWJpY0JlemllcigwLjY0NSwgMC4wNDUsIDAuMzU1LCAxKSxcbiAgLy8gcXVhcnRcbiAgJ2Vhc2UtaW4tcXVhcnQnOiBjdWJpY0JlemllcigwLjg5NSwgMC4wMywgMC42ODUsIDAuMjIpLFxuICAnZWFzZS1vdXQtcXVhcnQnOiBjdWJpY0JlemllcigwLjE2NSwgMC44NCwgMC40NCwgMSksXG4gICdlYXNlLWluLW91dC1xdWFydCc6IGN1YmljQmV6aWVyKDAuNzcsIDAsIDAuMTc1LCAxKSxcbiAgLy8gcXVpbnRcbiAgJ2Vhc2UtaW4tcXVpbnQnOiBjdWJpY0JlemllcigwLjc1NSwgMC4wNSwgMC44NTUsIDAuMDYpLFxuICAnZWFzZS1vdXQtcXVpbnQnOiBjdWJpY0JlemllcigwLjIzLCAxLCAwLjMyLCAxKSxcbiAgJ2Vhc2UtaW4tb3V0LXF1aW50JzogY3ViaWNCZXppZXIoMC44NiwgMCwgMC4wNywgMSksXG4gIC8vIGV4cG9cbiAgJ2Vhc2UtaW4tZXhwbyc6IGN1YmljQmV6aWVyKDAuOTUsIDAuMDUsIDAuNzk1LCAwLjAzNSksXG4gICdlYXNlLW91dC1leHBvJzogY3ViaWNCZXppZXIoMC4xOSwgMSwgMC4yMiwgMSksXG4gICdlYXNlLWluLW91dC1leHBvJzogY3ViaWNCZXppZXIoMSwgMCwgMCwgMSksXG4gIC8vIGNpcmNcbiAgJ2Vhc2UtaW4tY2lyYyc6IGN1YmljQmV6aWVyKDAuNiwgMC4wNCwgMC45OCwgMC4zMzUpLFxuICAnZWFzZS1vdXQtY2lyYyc6IGN1YmljQmV6aWVyKDAuMDc1LCAwLjgyLCAwLjE2NSwgMSksXG4gICdlYXNlLWluLW91dC1jaXJjJzogY3ViaWNCZXppZXIoMC43ODUsIDAuMTM1LCAwLjE1LCAwLjg2KSxcbiAgLy8gdXNlciBwYXJhbSBlYXNpbmdzLi4uXG5cbiAgJ3NwcmluZyc6IGZ1bmN0aW9uIHNwcmluZyh0ZW5zaW9uLCBmcmljdGlvbiwgZHVyYXRpb24pIHtcbiAgICBpZiAoZHVyYXRpb24gPT09IDApIHtcbiAgICAgIC8vIGNhbid0IGdldCBhIHNwcmluZyB3LyBkdXJhdGlvbiAwXG4gICAgICByZXR1cm4gZWFzaW5ncy5saW5lYXI7IC8vIGR1cmF0aW9uIDAgPT4ganVtcCB0byBlbmQgc28gaW1wbCBkb2Vzbid0IG1hdHRlclxuICAgIH1cblxuICAgIHZhciBzcHJpbmcgPSBnZW5lcmF0ZVNwcmluZ1JLNCh0ZW5zaW9uLCBmcmljdGlvbiwgZHVyYXRpb24pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhcnQsIGVuZCwgcGVyY2VudCkge1xuICAgICAgcmV0dXJuIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAqIHNwcmluZyhwZXJjZW50KTtcbiAgICB9O1xuICB9LFxuICAnY3ViaWMtYmV6aWVyJzogY3ViaWNCZXppZXJcbn07XG5cbmZ1bmN0aW9uIGdldEVhc2VkVmFsdWUodHlwZSwgc3RhcnQsIGVuZCwgcGVyY2VudCwgZWFzaW5nRm4pIHtcbiAgaWYgKHBlcmNlbnQgPT09IDEpIHtcbiAgICByZXR1cm4gZW5kO1xuICB9XG4gIGlmIChzdGFydCA9PT0gZW5kKSB7XG4gICAgcmV0dXJuIGVuZDtcbiAgfVxuICB2YXIgdmFsID0gZWFzaW5nRm4oc3RhcnQsIGVuZCwgcGVyY2VudCk7XG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIGlmICh0eXBlLnJvdW5kVmFsdWUgfHwgdHlwZS5jb2xvcikge1xuICAgIHZhbCA9IE1hdGgucm91bmQodmFsKTtcbiAgfVxuICBpZiAodHlwZS5taW4gIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbCA9IE1hdGgubWF4KHZhbCwgdHlwZS5taW4pO1xuICB9XG4gIGlmICh0eXBlLm1heCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsID0gTWF0aC5taW4odmFsLCB0eXBlLm1heCk7XG4gIH1cbiAgcmV0dXJuIHZhbDtcbn1cbmZ1bmN0aW9uIGdldFZhbHVlKHByb3AsIHNwZWMpIHtcbiAgaWYgKHByb3AucGZWYWx1ZSAhPSBudWxsIHx8IHByb3AudmFsdWUgIT0gbnVsbCkge1xuICAgIGlmIChwcm9wLnBmVmFsdWUgIT0gbnVsbCAmJiAoc3BlYyA9PSBudWxsIHx8IHNwZWMudHlwZS51bml0cyAhPT0gJyUnKSkge1xuICAgICAgcmV0dXJuIHByb3AucGZWYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHByb3AudmFsdWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBwcm9wO1xuICB9XG59XG5mdW5jdGlvbiBlYXNlKHN0YXJ0UHJvcCwgZW5kUHJvcCwgcGVyY2VudCwgZWFzaW5nRm4sIHByb3BTcGVjKSB7XG4gIHZhciB0eXBlID0gcHJvcFNwZWMgIT0gbnVsbCA/IHByb3BTcGVjLnR5cGUgOiBudWxsO1xuICBpZiAocGVyY2VudCA8IDApIHtcbiAgICBwZXJjZW50ID0gMDtcbiAgfSBlbHNlIGlmIChwZXJjZW50ID4gMSkge1xuICAgIHBlcmNlbnQgPSAxO1xuICB9XG4gIHZhciBzdGFydCA9IGdldFZhbHVlKHN0YXJ0UHJvcCwgcHJvcFNwZWMpO1xuICB2YXIgZW5kID0gZ2V0VmFsdWUoZW5kUHJvcCwgcHJvcFNwZWMpO1xuICBpZiAobnVtYmVyJDEoc3RhcnQpICYmIG51bWJlciQxKGVuZCkpIHtcbiAgICByZXR1cm4gZ2V0RWFzZWRWYWx1ZSh0eXBlLCBzdGFydCwgZW5kLCBwZXJjZW50LCBlYXNpbmdGbik7XG4gIH0gZWxzZSBpZiAoYXJyYXkoc3RhcnQpICYmIGFycmF5KGVuZCkpIHtcbiAgICB2YXIgZWFzZWRBcnIgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNpID0gc3RhcnRbaV07XG4gICAgICB2YXIgZWkgPSBlbmRbaV07XG4gICAgICBpZiAoc2kgIT0gbnVsbCAmJiBlaSAhPSBudWxsKSB7XG4gICAgICAgIHZhciB2YWwgPSBnZXRFYXNlZFZhbHVlKHR5cGUsIHNpLCBlaSwgcGVyY2VudCwgZWFzaW5nRm4pO1xuICAgICAgICBlYXNlZEFyci5wdXNoKHZhbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlYXNlZEFyci5wdXNoKGVpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVhc2VkQXJyO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHN0ZXAkMShzZWxmLCBhbmksIG5vdywgaXNDb3JlKSB7XG4gIHZhciBpc0VsZXMgPSAhaXNDb3JlO1xuICB2YXIgX3AgPSBzZWxmLl9wcml2YXRlO1xuICB2YXIgYW5pX3AgPSBhbmkuX3ByaXZhdGU7XG4gIHZhciBwRWFzaW5nID0gYW5pX3AuZWFzaW5nO1xuICB2YXIgc3RhcnRUaW1lID0gYW5pX3Auc3RhcnRUaW1lO1xuICB2YXIgY3kgPSBpc0NvcmUgPyBzZWxmIDogc2VsZi5jeSgpO1xuICB2YXIgc3R5bGUgPSBjeS5zdHlsZSgpO1xuICBpZiAoIWFuaV9wLmVhc2luZ0ltcGwpIHtcbiAgICBpZiAocEVhc2luZyA9PSBudWxsKSB7XG4gICAgICAvLyB1c2UgZGVmYXVsdFxuICAgICAgYW5pX3AuZWFzaW5nSW1wbCA9IGVhc2luZ3NbJ2xpbmVhciddO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGVuIGRlZmluZSB3LyBuYW1lXG4gICAgICB2YXIgZWFzaW5nVmFscztcbiAgICAgIGlmIChzdHJpbmcocEVhc2luZykpIHtcbiAgICAgICAgdmFyIGVhc2luZ1Byb3AgPSBzdHlsZS5wYXJzZSgndHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nLCBwRWFzaW5nKTtcbiAgICAgICAgZWFzaW5nVmFscyA9IGVhc2luZ1Byb3AudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGVuIGFzc3VtZSBwcmVwYXJzZWQgYXJyYXlcbiAgICAgICAgZWFzaW5nVmFscyA9IHBFYXNpbmc7XG4gICAgICB9XG4gICAgICB2YXIgbmFtZSwgYXJncztcbiAgICAgIGlmIChzdHJpbmcoZWFzaW5nVmFscykpIHtcbiAgICAgICAgbmFtZSA9IGVhc2luZ1ZhbHM7XG4gICAgICAgIGFyZ3MgPSBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5hbWUgPSBlYXNpbmdWYWxzWzFdO1xuICAgICAgICBhcmdzID0gZWFzaW5nVmFscy5zbGljZSgyKS5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICByZXR1cm4gK247XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBjcmVhdGUgd2l0aCBhcmdzXG4gICAgICAgIGlmIChuYW1lID09PSAnc3ByaW5nJykge1xuICAgICAgICAgIGFyZ3MucHVzaChhbmlfcC5kdXJhdGlvbik7IC8vIG5lZWQgZHVyYXRpb24gdG8gZ2VuZXJhdGUgc3ByaW5nXG4gICAgICAgIH1cblxuICAgICAgICBhbmlfcC5lYXNpbmdJbXBsID0gZWFzaW5nc1tuYW1lXS5hcHBseShudWxsLCBhcmdzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHN0YXRpYyBpbXBsIGJ5IG5hbWVcbiAgICAgICAgYW5pX3AuZWFzaW5nSW1wbCA9IGVhc2luZ3NbbmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHZhciBlYXNpbmcgPSBhbmlfcC5lYXNpbmdJbXBsO1xuICB2YXIgcGVyY2VudDtcbiAgaWYgKGFuaV9wLmR1cmF0aW9uID09PSAwKSB7XG4gICAgcGVyY2VudCA9IDE7XG4gIH0gZWxzZSB7XG4gICAgcGVyY2VudCA9IChub3cgLSBzdGFydFRpbWUpIC8gYW5pX3AuZHVyYXRpb247XG4gIH1cbiAgaWYgKGFuaV9wLmFwcGx5aW5nKSB7XG4gICAgcGVyY2VudCA9IGFuaV9wLnByb2dyZXNzO1xuICB9XG4gIGlmIChwZXJjZW50IDwgMCkge1xuICAgIHBlcmNlbnQgPSAwO1xuICB9IGVsc2UgaWYgKHBlcmNlbnQgPiAxKSB7XG4gICAgcGVyY2VudCA9IDE7XG4gIH1cbiAgaWYgKGFuaV9wLmRlbGF5ID09IG51bGwpIHtcbiAgICAvLyB0aGVuIHVwZGF0ZVxuXG4gICAgdmFyIHN0YXJ0UG9zID0gYW5pX3Auc3RhcnRQb3NpdGlvbjtcbiAgICB2YXIgZW5kUG9zID0gYW5pX3AucG9zaXRpb247XG4gICAgaWYgKGVuZFBvcyAmJiBpc0VsZXMgJiYgIXNlbGYubG9ja2VkKCkpIHtcbiAgICAgIHZhciBuZXdQb3MgPSB7fTtcbiAgICAgIGlmICh2YWxpZChzdGFydFBvcy54LCBlbmRQb3MueCkpIHtcbiAgICAgICAgbmV3UG9zLnggPSBlYXNlKHN0YXJ0UG9zLngsIGVuZFBvcy54LCBwZXJjZW50LCBlYXNpbmcpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbGlkKHN0YXJ0UG9zLnksIGVuZFBvcy55KSkge1xuICAgICAgICBuZXdQb3MueSA9IGVhc2Uoc3RhcnRQb3MueSwgZW5kUG9zLnksIHBlcmNlbnQsIGVhc2luZyk7XG4gICAgICB9XG4gICAgICBzZWxmLnBvc2l0aW9uKG5ld1Bvcyk7XG4gICAgfVxuICAgIHZhciBzdGFydFBhbiA9IGFuaV9wLnN0YXJ0UGFuO1xuICAgIHZhciBlbmRQYW4gPSBhbmlfcC5wYW47XG4gICAgdmFyIHBhbiA9IF9wLnBhbjtcbiAgICB2YXIgYW5pbWF0aW5nUGFuID0gZW5kUGFuICE9IG51bGwgJiYgaXNDb3JlO1xuICAgIGlmIChhbmltYXRpbmdQYW4pIHtcbiAgICAgIGlmICh2YWxpZChzdGFydFBhbi54LCBlbmRQYW4ueCkpIHtcbiAgICAgICAgcGFuLnggPSBlYXNlKHN0YXJ0UGFuLngsIGVuZFBhbi54LCBwZXJjZW50LCBlYXNpbmcpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbGlkKHN0YXJ0UGFuLnksIGVuZFBhbi55KSkge1xuICAgICAgICBwYW4ueSA9IGVhc2Uoc3RhcnRQYW4ueSwgZW5kUGFuLnksIHBlcmNlbnQsIGVhc2luZyk7XG4gICAgICB9XG4gICAgICBzZWxmLmVtaXQoJ3BhbicpO1xuICAgIH1cbiAgICB2YXIgc3RhcnRab29tID0gYW5pX3Auc3RhcnRab29tO1xuICAgIHZhciBlbmRab29tID0gYW5pX3Auem9vbTtcbiAgICB2YXIgYW5pbWF0aW5nWm9vbSA9IGVuZFpvb20gIT0gbnVsbCAmJiBpc0NvcmU7XG4gICAgaWYgKGFuaW1hdGluZ1pvb20pIHtcbiAgICAgIGlmICh2YWxpZChzdGFydFpvb20sIGVuZFpvb20pKSB7XG4gICAgICAgIF9wLnpvb20gPSBib3VuZChfcC5taW5ab29tLCBlYXNlKHN0YXJ0Wm9vbSwgZW5kWm9vbSwgcGVyY2VudCwgZWFzaW5nKSwgX3AubWF4Wm9vbSk7XG4gICAgICB9XG4gICAgICBzZWxmLmVtaXQoJ3pvb20nKTtcbiAgICB9XG4gICAgaWYgKGFuaW1hdGluZ1BhbiB8fCBhbmltYXRpbmdab29tKSB7XG4gICAgICBzZWxmLmVtaXQoJ3ZpZXdwb3J0Jyk7XG4gICAgfVxuICAgIHZhciBwcm9wcyA9IGFuaV9wLnN0eWxlO1xuICAgIGlmIChwcm9wcyAmJiBwcm9wcy5sZW5ndGggPiAwICYmIGlzRWxlcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcHJvcCA9IHByb3BzW2ldO1xuICAgICAgICB2YXIgX25hbWUgPSBwcm9wLm5hbWU7XG4gICAgICAgIHZhciBlbmQgPSBwcm9wO1xuICAgICAgICB2YXIgc3RhcnQgPSBhbmlfcC5zdGFydFN0eWxlW19uYW1lXTtcbiAgICAgICAgdmFyIHByb3BTcGVjID0gc3R5bGUucHJvcGVydGllc1tzdGFydC5uYW1lXTtcbiAgICAgICAgdmFyIGVhc2VkVmFsID0gZWFzZShzdGFydCwgZW5kLCBwZXJjZW50LCBlYXNpbmcsIHByb3BTcGVjKTtcbiAgICAgICAgc3R5bGUub3ZlcnJpZGVCeXBhc3Moc2VsZiwgX25hbWUsIGVhc2VkVmFsKTtcbiAgICAgIH0gLy8gZm9yIHByb3BzXG5cbiAgICAgIHNlbGYuZW1pdCgnc3R5bGUnKTtcbiAgICB9IC8vIGlmXG4gIH1cblxuICBhbmlfcC5wcm9ncmVzcyA9IHBlcmNlbnQ7XG4gIHJldHVybiBwZXJjZW50O1xufVxuZnVuY3Rpb24gdmFsaWQoc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT0gbnVsbCB8fCBlbmQgPT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobnVtYmVyJDEoc3RhcnQpICYmIG51bWJlciQxKGVuZCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChzdGFydCAmJiBlbmQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0QW5pbWF0aW9uKHNlbGYsIGFuaSwgbm93LCBpc0NvcmUpIHtcbiAgdmFyIGFuaV9wID0gYW5pLl9wcml2YXRlO1xuICBhbmlfcC5zdGFydGVkID0gdHJ1ZTtcbiAgYW5pX3Auc3RhcnRUaW1lID0gbm93IC0gYW5pX3AucHJvZ3Jlc3MgKiBhbmlfcC5kdXJhdGlvbjtcbn1cblxuZnVuY3Rpb24gc3RlcEFsbChub3csIGN5KSB7XG4gIHZhciBlbGVzID0gY3kuX3ByaXZhdGUuYW5pRWxlcztcbiAgdmFyIGRvbmVFbGVzID0gW107XG4gIGZ1bmN0aW9uIHN0ZXBPbmUoZWxlLCBpc0NvcmUpIHtcbiAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgdmFyIGN1cnJlbnQgPSBfcC5hbmltYXRpb24uY3VycmVudDtcbiAgICB2YXIgcXVldWUgPSBfcC5hbmltYXRpb24ucXVldWU7XG4gICAgdmFyIHJhbkFuaXMgPSBmYWxzZTtcblxuICAgIC8vIGlmIG5vdGhpbmcgY3VycmVudGx5IGFuaW1hdGluZywgZ2V0IHNvbWV0aGluZyBmcm9tIHRoZSBxdWV1ZVxuICAgIGlmIChjdXJyZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdmFyIG5leHQgPSBxdWV1ZS5zaGlmdCgpO1xuICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgY3VycmVudC5wdXNoKG5leHQpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgY2FsbGJhY2tzID0gZnVuY3Rpb24gY2FsbGJhY2tzKF9jYWxsYmFja3MpIHtcbiAgICAgIGZvciAodmFyIGogPSBfY2FsbGJhY2tzLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIHZhciBjYiA9IF9jYWxsYmFja3Nbal07XG4gICAgICAgIGNiKCk7XG4gICAgICB9XG4gICAgICBfY2FsbGJhY2tzLnNwbGljZSgwLCBfY2FsbGJhY2tzLmxlbmd0aCk7XG4gICAgfTtcblxuICAgIC8vIHN0ZXAgYW5kIHJlbW92ZSBpZiBkb25lXG4gICAgZm9yICh2YXIgaSA9IGN1cnJlbnQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBhbmkgPSBjdXJyZW50W2ldO1xuICAgICAgdmFyIGFuaV9wID0gYW5pLl9wcml2YXRlO1xuICAgICAgaWYgKGFuaV9wLnN0b3BwZWQpIHtcbiAgICAgICAgY3VycmVudC5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGFuaV9wLmhvb2tlZCA9IGZhbHNlO1xuICAgICAgICBhbmlfcC5wbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIGFuaV9wLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgY2FsbGJhY2tzKGFuaV9wLmZyYW1lcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFhbmlfcC5wbGF5aW5nICYmICFhbmlfcC5hcHBseWluZykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYW4gYXBwbHkoKSB3aGlsZSBwbGF5aW5nIHNob3VsZG4ndCBkbyBhbnl0aGluZ1xuICAgICAgaWYgKGFuaV9wLnBsYXlpbmcgJiYgYW5pX3AuYXBwbHlpbmcpIHtcbiAgICAgICAgYW5pX3AuYXBwbHlpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghYW5pX3Auc3RhcnRlZCkge1xuICAgICAgICBzdGFydEFuaW1hdGlvbihlbGUsIGFuaSwgbm93KTtcbiAgICAgIH1cbiAgICAgIHN0ZXAkMShlbGUsIGFuaSwgbm93LCBpc0NvcmUpO1xuICAgICAgaWYgKGFuaV9wLmFwcGx5aW5nKSB7XG4gICAgICAgIGFuaV9wLmFwcGx5aW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBjYWxsYmFja3MoYW5pX3AuZnJhbWVzKTtcbiAgICAgIGlmIChhbmlfcC5zdGVwICE9IG51bGwpIHtcbiAgICAgICAgYW5pX3Auc3RlcChub3cpO1xuICAgICAgfVxuICAgICAgaWYgKGFuaS5jb21wbGV0ZWQoKSkge1xuICAgICAgICBjdXJyZW50LnNwbGljZShpLCAxKTtcbiAgICAgICAgYW5pX3AuaG9va2VkID0gZmFsc2U7XG4gICAgICAgIGFuaV9wLnBsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgYW5pX3Auc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICBjYWxsYmFja3MoYW5pX3AuY29tcGxldGVzKTtcbiAgICAgIH1cbiAgICAgIHJhbkFuaXMgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWlzQ29yZSAmJiBjdXJyZW50Lmxlbmd0aCA9PT0gMCAmJiBxdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIGRvbmVFbGVzLnB1c2goZWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJhbkFuaXM7XG4gIH0gLy8gc3RlcEVsZW1lbnRcblxuICAvLyBoYW5kbGUgYWxsIGVsZXNcbiAgdmFyIHJhbkVsZUFuaSA9IGZhbHNlO1xuICBmb3IgKHZhciBlID0gMDsgZSA8IGVsZXMubGVuZ3RoOyBlKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tlXTtcbiAgICB2YXIgaGFuZGxlZFRoaXNFbGUgPSBzdGVwT25lKGVsZSk7XG4gICAgcmFuRWxlQW5pID0gcmFuRWxlQW5pIHx8IGhhbmRsZWRUaGlzRWxlO1xuICB9IC8vIGVhY2ggZWxlbWVudFxuXG4gIHZhciByYW5Db3JlQW5pID0gc3RlcE9uZShjeSwgdHJ1ZSk7XG5cbiAgLy8gbm90aWZ5IHJlbmRlcmVyXG4gIGlmIChyYW5FbGVBbmkgfHwgcmFuQ29yZUFuaSkge1xuICAgIGlmIChlbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGN5Lm5vdGlmeSgnZHJhdycsIGVsZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjeS5ub3RpZnkoJ2RyYXcnKTtcbiAgICB9XG4gIH1cblxuICAvLyByZW1vdmUgZWxlbWVudHMgZnJvbSBsaXN0IG9mIGN1cnJlbnRseSBhbmltYXRpbmcgaWYgaXRzIHF1ZXVlcyBhcmUgZW1wdHlcbiAgZWxlcy51bm1lcmdlKGRvbmVFbGVzKTtcbiAgY3kuZW1pdCgnc3RlcCcpO1xufSAvLyBzdGVwQWxsXG5cbnZhciBjb3JlZm4kOCA9IHtcbiAgLy8gcHVsbCBpbiBhbmltYXRpb24gZnVuY3Rpb25zXG4gIGFuaW1hdGU6IGRlZmluZS5hbmltYXRlKCksXG4gIGFuaW1hdGlvbjogZGVmaW5lLmFuaW1hdGlvbigpLFxuICBhbmltYXRlZDogZGVmaW5lLmFuaW1hdGVkKCksXG4gIGNsZWFyUXVldWU6IGRlZmluZS5jbGVhclF1ZXVlKCksXG4gIGRlbGF5OiBkZWZpbmUuZGVsYXkoKSxcbiAgZGVsYXlBbmltYXRpb246IGRlZmluZS5kZWxheUFuaW1hdGlvbigpLFxuICBzdG9wOiBkZWZpbmUuc3RvcCgpLFxuICBhZGRUb0FuaW1hdGlvblBvb2w6IGZ1bmN0aW9uIGFkZFRvQW5pbWF0aW9uUG9vbChlbGVzKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBzYXZlIGN5Y2xlcyB3aGVuIG5vIHN0eWxlIHVzZWRcblxuICAgIGN5Ll9wcml2YXRlLmFuaUVsZXMubWVyZ2UoZWxlcyk7XG4gIH0sXG4gIHN0b3BBbmltYXRpb25Mb29wOiBmdW5jdGlvbiBzdG9wQW5pbWF0aW9uTG9vcCgpIHtcbiAgICB0aGlzLl9wcml2YXRlLmFuaW1hdGlvbnNSdW5uaW5nID0gZmFsc2U7XG4gIH0sXG4gIHN0YXJ0QW5pbWF0aW9uTG9vcDogZnVuY3Rpb24gc3RhcnRBbmltYXRpb25Mb29wKCkge1xuICAgIHZhciBjeSA9IHRoaXM7XG4gICAgY3kuX3ByaXZhdGUuYW5pbWF0aW9uc1J1bm5pbmcgPSB0cnVlO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIHNhdmUgY3ljbGVzIHdoZW4gbm8gc3R5bGUgdXNlZFxuXG4gICAgLy8gTkIgdGhlIGFuaW1hdGlvbiBsb29wIHdpbGwgZXhlYyBpbiBoZWFkbGVzcyBlbnZpcm9ubWVudHMgaWYgc3R5bGUgZW5hYmxlZFxuICAgIC8vIGFuZCBleHBsaWNpdCBjeS5kZXN0cm95KCkgaXMgbmVjZXNzYXJ5IHRvIHN0b3AgdGhlIGxvb3BcblxuICAgIGZ1bmN0aW9uIGhlYWRsZXNzU3RlcCgpIHtcbiAgICAgIGlmICghY3kuX3ByaXZhdGUuYW5pbWF0aW9uc1J1bm5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uIGFuaW1hdGlvblN0ZXAobm93KSB7XG4gICAgICAgIHN0ZXBBbGwobm93LCBjeSk7XG4gICAgICAgIGhlYWRsZXNzU3RlcCgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciByZW5kZXJlciA9IGN5LnJlbmRlcmVyKCk7XG4gICAgaWYgKHJlbmRlcmVyICYmIHJlbmRlcmVyLmJlZm9yZVJlbmRlcikge1xuICAgICAgLy8gbGV0IHRoZSByZW5kZXJlciBzY2hlZHVsZSBhbmltYXRpb25zXG4gICAgICByZW5kZXJlci5iZWZvcmVSZW5kZXIoZnVuY3Rpb24gcmVuZGVyZXJBbmltYXRpb25TdGVwKHdpbGxEcmF3LCBub3cpIHtcbiAgICAgICAgc3RlcEFsbChub3csIGN5KTtcbiAgICAgIH0sIHJlbmRlcmVyLmJlZm9yZVJlbmRlclByaW9yaXRpZXMuYW5pbWF0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG1hbmFnZSB0aGUgYW5pbWF0aW9uIGxvb3Agb3Vyc2VsdmVzXG4gICAgICBoZWFkbGVzc1N0ZXAoKTsgLy8gZmlyc3QgY2FsbFxuICAgIH1cbiAgfVxufTtcblxudmFyIGVtaXR0ZXJPcHRpb25zID0ge1xuICBxdWFsaWZpZXJDb21wYXJlOiBmdW5jdGlvbiBxdWFsaWZpZXJDb21wYXJlKHNlbGVjdG9yMSwgc2VsZWN0b3IyKSB7XG4gICAgaWYgKHNlbGVjdG9yMSA9PSBudWxsIHx8IHNlbGVjdG9yMiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gc2VsZWN0b3IxID09IG51bGwgJiYgc2VsZWN0b3IyID09IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzZWxlY3RvcjEuc2FtZVRleHQoc2VsZWN0b3IyKTtcbiAgICB9XG4gIH0sXG4gIGV2ZW50TWF0Y2hlczogZnVuY3Rpb24gZXZlbnRNYXRjaGVzKGN5LCBsaXN0ZW5lciwgZXZlbnRPYmopIHtcbiAgICB2YXIgc2VsZWN0b3IgPSBsaXN0ZW5lci5xdWFsaWZpZXI7XG4gICAgaWYgKHNlbGVjdG9yICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBjeSAhPT0gZXZlbnRPYmoudGFyZ2V0ICYmIGVsZW1lbnQoZXZlbnRPYmoudGFyZ2V0KSAmJiBzZWxlY3Rvci5tYXRjaGVzKGV2ZW50T2JqLnRhcmdldCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBhZGRFdmVudEZpZWxkczogZnVuY3Rpb24gYWRkRXZlbnRGaWVsZHMoY3ksIGV2dCkge1xuICAgIGV2dC5jeSA9IGN5O1xuICAgIGV2dC50YXJnZXQgPSBjeTtcbiAgfSxcbiAgY2FsbGJhY2tDb250ZXh0OiBmdW5jdGlvbiBjYWxsYmFja0NvbnRleHQoY3ksIGxpc3RlbmVyLCBldmVudE9iaikge1xuICAgIHJldHVybiBsaXN0ZW5lci5xdWFsaWZpZXIgIT0gbnVsbCA/IGV2ZW50T2JqLnRhcmdldCA6IGN5O1xuICB9XG59O1xudmFyIGFyZ1NlbGVjdG9yID0gZnVuY3Rpb24gYXJnU2VsZWN0b3IoYXJnKSB7XG4gIGlmIChzdHJpbmcoYXJnKSkge1xuICAgIHJldHVybiBuZXcgU2VsZWN0b3IoYXJnKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYXJnO1xuICB9XG59O1xudmFyIGVsZXNmbiA9IHtcbiAgY3JlYXRlRW1pdHRlcjogZnVuY3Rpb24gY3JlYXRlRW1pdHRlcigpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIGlmICghX3AuZW1pdHRlcikge1xuICAgICAgX3AuZW1pdHRlciA9IG5ldyBFbWl0dGVyKGVtaXR0ZXJPcHRpb25zLCB0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGVtaXR0ZXI6IGZ1bmN0aW9uIGVtaXR0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuZW1pdHRlcjtcbiAgfSxcbiAgb246IGZ1bmN0aW9uIG9uKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5lbWl0dGVyKCkub24oZXZlbnRzLCBhcmdTZWxlY3RvcihzZWxlY3RvciksIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmVtb3ZlTGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5lbWl0dGVyKCkucmVtb3ZlTGlzdGVuZXIoZXZlbnRzLCBhcmdTZWxlY3RvcihzZWxlY3RvciksIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmVtb3ZlQWxsTGlzdGVuZXJzOiBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5lbWl0dGVyKCkucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIG9uZTogZnVuY3Rpb24gb25lKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5lbWl0dGVyKCkub25lKGV2ZW50cywgYXJnU2VsZWN0b3Ioc2VsZWN0b3IpLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIG9uY2U6IGZ1bmN0aW9uIG9uY2UoZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5vbmUoZXZlbnRzLCBhcmdTZWxlY3RvcihzZWxlY3RvciksIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZW1pdDogZnVuY3Rpb24gZW1pdChldmVudHMsIGV4dHJhUGFyYW1zKSB7XG4gICAgdGhpcy5lbWl0dGVyKCkuZW1pdChldmVudHMsIGV4dHJhUGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZW1pdEFuZE5vdGlmeTogZnVuY3Rpb24gZW1pdEFuZE5vdGlmeShldmVudCwgZWxlcykge1xuICAgIHRoaXMuZW1pdChldmVudCk7XG4gICAgdGhpcy5ub3RpZnkoZXZlbnQsIGVsZXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59O1xuZGVmaW5lLmV2ZW50QWxpYXNlc09uKGVsZXNmbik7XG5cbnZhciBjb3JlZm4kNyA9IHtcbiAgcG5nOiBmdW5jdGlvbiBwbmcob3B0aW9ucykge1xuICAgIHZhciByZW5kZXJlciA9IHRoaXMuX3ByaXZhdGUucmVuZGVyZXI7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIHJlbmRlcmVyLnBuZyhvcHRpb25zKTtcbiAgfSxcbiAganBnOiBmdW5jdGlvbiBqcGcob3B0aW9ucykge1xuICAgIHZhciByZW5kZXJlciA9IHRoaXMuX3ByaXZhdGUucmVuZGVyZXI7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5iZyA9IG9wdGlvbnMuYmcgfHwgJyNmZmYnO1xuICAgIHJldHVybiByZW5kZXJlci5qcGcob3B0aW9ucyk7XG4gIH1cbn07XG5jb3JlZm4kNy5qcGVnID0gY29yZWZuJDcuanBnO1xuXG52YXIgY29yZWZuJDYgPSB7XG4gIGxheW91dDogZnVuY3Rpb24gbGF5b3V0KG9wdGlvbnMpIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIGlmIChvcHRpb25zID09IG51bGwpIHtcbiAgICAgIGVycm9yKCdMYXlvdXQgb3B0aW9ucyBtdXN0IGJlIHNwZWNpZmllZCB0byBtYWtlIGEgbGF5b3V0Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm5hbWUgPT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0EgYG5hbWVgIG11c3QgYmUgc3BlY2lmaWVkIHRvIG1ha2UgYSBsYXlvdXQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgdmFyIExheW91dCA9IGN5LmV4dGVuc2lvbignbGF5b3V0JywgbmFtZSk7XG4gICAgaWYgKExheW91dCA9PSBudWxsKSB7XG4gICAgICBlcnJvcignTm8gc3VjaCBsYXlvdXQgYCcgKyBuYW1lICsgJ2AgZm91bmQuICBEaWQgeW91IGZvcmdldCB0byBpbXBvcnQgaXQgYW5kIGBjeXRvc2NhcGUudXNlKClgIGl0PycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZWxlcztcbiAgICBpZiAoc3RyaW5nKG9wdGlvbnMuZWxlcykpIHtcbiAgICAgIGVsZXMgPSBjeS4kKG9wdGlvbnMuZWxlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZXMgPSBvcHRpb25zLmVsZXMgIT0gbnVsbCA/IG9wdGlvbnMuZWxlcyA6IGN5LiQoKTtcbiAgICB9XG4gICAgdmFyIGxheW91dCA9IG5ldyBMYXlvdXQoZXh0ZW5kKHt9LCBvcHRpb25zLCB7XG4gICAgICBjeTogY3ksXG4gICAgICBlbGVzOiBlbGVzXG4gICAgfSkpO1xuICAgIHJldHVybiBsYXlvdXQ7XG4gIH1cbn07XG5jb3JlZm4kNi5jcmVhdGVMYXlvdXQgPSBjb3JlZm4kNi5tYWtlTGF5b3V0ID0gY29yZWZuJDYubGF5b3V0O1xuXG52YXIgY29yZWZuJDUgPSB7XG4gIG5vdGlmeTogZnVuY3Rpb24gbm90aWZ5KGV2ZW50TmFtZSwgZXZlbnRFbGVzKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBpZiAodGhpcy5iYXRjaGluZygpKSB7XG4gICAgICBfcC5iYXRjaE5vdGlmaWNhdGlvbnMgPSBfcC5iYXRjaE5vdGlmaWNhdGlvbnMgfHwge307XG4gICAgICB2YXIgZWxlcyA9IF9wLmJhdGNoTm90aWZpY2F0aW9uc1tldmVudE5hbWVdID0gX3AuYmF0Y2hOb3RpZmljYXRpb25zW2V2ZW50TmFtZV0gfHwgdGhpcy5jb2xsZWN0aW9uKCk7XG4gICAgICBpZiAoZXZlbnRFbGVzICE9IG51bGwpIHtcbiAgICAgICAgZWxlcy5tZXJnZShldmVudEVsZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuOyAvLyBub3RpZmljYXRpb25zIGFyZSBkaXNhYmxlZCBkdXJpbmcgYmF0Y2hpbmdcbiAgICB9XG5cbiAgICBpZiAoIV9wLm5vdGlmaWNhdGlvbnNFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBleGl0IG9uIGRpc2FibGVkXG5cbiAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyKCk7XG5cbiAgICAvLyBleGl0IGlmIGRlc3Ryb3koKSBjYWxsZWQgb24gY29yZSBvciByZW5kZXJlciBpbiBiZXR3ZWVuIGZyYW1lcyAjMTQ5OSAjMTUyOFxuICAgIGlmICh0aGlzLmRlc3Ryb3llZCgpIHx8ICFyZW5kZXJlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZW5kZXJlci5ub3RpZnkoZXZlbnROYW1lLCBldmVudEVsZXMpO1xuICB9LFxuICBub3RpZmljYXRpb25zOiBmdW5jdGlvbiBub3RpZmljYXRpb25zKGJvb2wpIHtcbiAgICB2YXIgcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgaWYgKGJvb2wgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHAubm90aWZpY2F0aW9uc0VuYWJsZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHAubm90aWZpY2F0aW9uc0VuYWJsZWQgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgbm9Ob3RpZmljYXRpb25zOiBmdW5jdGlvbiBub05vdGlmaWNhdGlvbnMoY2FsbGJhY2spIHtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMoZmFsc2UpO1xuICAgIGNhbGxiYWNrKCk7XG4gICAgdGhpcy5ub3RpZmljYXRpb25zKHRydWUpO1xuICB9LFxuICBiYXRjaGluZzogZnVuY3Rpb24gYmF0Y2hpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuYmF0Y2hDb3VudCA+IDA7XG4gIH0sXG4gIHN0YXJ0QmF0Y2g6IGZ1bmN0aW9uIHN0YXJ0QmF0Y2goKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBpZiAoX3AuYmF0Y2hDb3VudCA9PSBudWxsKSB7XG4gICAgICBfcC5iYXRjaENvdW50ID0gMDtcbiAgICB9XG4gICAgaWYgKF9wLmJhdGNoQ291bnQgPT09IDApIHtcbiAgICAgIF9wLmJhdGNoU3R5bGVFbGVzID0gdGhpcy5jb2xsZWN0aW9uKCk7XG4gICAgICBfcC5iYXRjaE5vdGlmaWNhdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgX3AuYmF0Y2hDb3VudCsrO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBlbmRCYXRjaDogZnVuY3Rpb24gZW5kQmF0Y2goKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBpZiAoX3AuYmF0Y2hDb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIF9wLmJhdGNoQ291bnQtLTtcbiAgICBpZiAoX3AuYmF0Y2hDb3VudCA9PT0gMCkge1xuICAgICAgLy8gdXBkYXRlIHN0eWxlIGZvciBkaXJ0eSBlbGVzXG4gICAgICBfcC5iYXRjaFN0eWxlRWxlcy51cGRhdGVTdHlsZSgpO1xuICAgICAgdmFyIHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcigpO1xuXG4gICAgICAvLyBub3RpZnkgdGhlIHJlbmRlcmVyIG9mIHF1ZXVlZCBlbGVzIGFuZCBldmVudCB0eXBlc1xuICAgICAgT2JqZWN0LmtleXMoX3AuYmF0Y2hOb3RpZmljYXRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgICAgdmFyIGVsZXMgPSBfcC5iYXRjaE5vdGlmaWNhdGlvbnNbZXZlbnROYW1lXTtcbiAgICAgICAgaWYgKGVsZXMuZW1wdHkoKSkge1xuICAgICAgICAgIHJlbmRlcmVyLm5vdGlmeShldmVudE5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlbmRlcmVyLm5vdGlmeShldmVudE5hbWUsIGVsZXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGJhdGNoOiBmdW5jdGlvbiBiYXRjaChjYWxsYmFjaykge1xuICAgIHRoaXMuc3RhcnRCYXRjaCgpO1xuICAgIGNhbGxiYWNrKCk7XG4gICAgdGhpcy5lbmRCYXRjaCgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgYmF0Y2hEYXRhOiBmdW5jdGlvbiBiYXRjaERhdGEobWFwKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICByZXR1cm4gdGhpcy5iYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaWRzID0gT2JqZWN0LmtleXMobWFwKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBpZCA9IGlkc1tpXTtcbiAgICAgICAgdmFyIGRhdGEgPSBtYXBbaWRdO1xuICAgICAgICB2YXIgZWxlID0gY3kuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICBlbGUuZGF0YShkYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufTtcblxudmFyIHJlbmRlcmVyRGVmYXVsdHMgPSBkZWZhdWx0cyRnKHtcbiAgaGlkZUVkZ2VzT25WaWV3cG9ydDogZmFsc2UsXG4gIHRleHR1cmVPblZpZXdwb3J0OiBmYWxzZSxcbiAgbW90aW9uQmx1cjogZmFsc2UsXG4gIG1vdGlvbkJsdXJPcGFjaXR5OiAwLjA1LFxuICBwaXhlbFJhdGlvOiB1bmRlZmluZWQsXG4gIGRlc2t0b3BUYXBUaHJlc2hvbGQ6IDQsXG4gIHRvdWNoVGFwVGhyZXNob2xkOiA4LFxuICB3aGVlbFNlbnNpdGl2aXR5OiAxLFxuICBkZWJ1ZzogZmFsc2UsXG4gIHNob3dGcHM6IGZhbHNlXG59KTtcbnZhciBjb3JlZm4kNCA9IHtcbiAgcmVuZGVyVG86IGZ1bmN0aW9uIHJlbmRlclRvKGNvbnRleHQsIHpvb20sIHBhbiwgcHhSYXRpbykge1xuICAgIHZhciByID0gdGhpcy5fcHJpdmF0ZS5yZW5kZXJlcjtcbiAgICByLnJlbmRlclRvKGNvbnRleHQsIHpvb20sIHBhbiwgcHhSYXRpbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHJlbmRlcmVyOiBmdW5jdGlvbiByZW5kZXJlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5yZW5kZXJlcjtcbiAgfSxcbiAgZm9yY2VSZW5kZXI6IGZ1bmN0aW9uIGZvcmNlUmVuZGVyKCkge1xuICAgIHRoaXMubm90aWZ5KCdkcmF3Jyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHJlc2l6ZTogZnVuY3Rpb24gcmVzaXplKCkge1xuICAgIHRoaXMuaW52YWxpZGF0ZVNpemUoKTtcbiAgICB0aGlzLmVtaXRBbmROb3RpZnkoJ3Jlc2l6ZScpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBpbml0UmVuZGVyZXI6IGZ1bmN0aW9uIGluaXRSZW5kZXJlcihvcHRpb25zKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICB2YXIgUmVuZGVyZXJQcm90byA9IGN5LmV4dGVuc2lvbigncmVuZGVyZXInLCBvcHRpb25zLm5hbWUpO1xuICAgIGlmIChSZW5kZXJlclByb3RvID09IG51bGwpIHtcbiAgICAgIGVycm9yKFwiQ2FuIG5vdCBpbml0aWFsaXNlOiBObyBzdWNoIHJlbmRlcmVyIGBcIi5jb25jYXQob3B0aW9ucy5uYW1lLCBcImAgZm91bmQuIERpZCB5b3UgZm9yZ2V0IHRvIGltcG9ydCBpdCBhbmQgYGN5dG9zY2FwZS51c2UoKWAgaXQ/XCIpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMud2hlZWxTZW5zaXRpdml0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB3YXJuKFwiWW91IGhhdmUgc2V0IGEgY3VzdG9tIHdoZWVsIHNlbnNpdGl2aXR5LiAgVGhpcyB3aWxsIG1ha2UgeW91ciBhcHAgem9vbSB1bm5hdHVyYWxseSB3aGVuIHVzaW5nIG1haW5zdHJlYW0gbWljZS4gIFlvdSBzaG91bGQgY2hhbmdlIHRoaXMgdmFsdWUgZnJvbSB0aGUgZGVmYXVsdCBvbmx5IGlmIHlvdSBjYW4gZ3VhcmFudGVlIHRoYXQgYWxsIHlvdXIgdXNlcnMgd2lsbCB1c2UgdGhlIHNhbWUgaGFyZHdhcmUgYW5kIE9TIGNvbmZpZ3VyYXRpb24gYXMgeW91ciBjdXJyZW50IG1hY2hpbmUuXCIpO1xuICAgIH1cbiAgICB2YXIgck9wdHMgPSByZW5kZXJlckRlZmF1bHRzKG9wdGlvbnMpO1xuICAgIHJPcHRzLmN5ID0gY3k7XG4gICAgY3kuX3ByaXZhdGUucmVuZGVyZXIgPSBuZXcgUmVuZGVyZXJQcm90byhyT3B0cyk7XG4gICAgdGhpcy5ub3RpZnkoJ2luaXQnKTtcbiAgfSxcbiAgZGVzdHJveVJlbmRlcmVyOiBmdW5jdGlvbiBkZXN0cm95UmVuZGVyZXIoKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICBjeS5ub3RpZnkoJ2Rlc3Ryb3knKTsgLy8gZGVzdHJveSB0aGUgcmVuZGVyZXJcblxuICAgIHZhciBkb21FbGUgPSBjeS5jb250YWluZXIoKTtcbiAgICBpZiAoZG9tRWxlKSB7XG4gICAgICBkb21FbGUuX2N5cmVnID0gbnVsbDtcbiAgICAgIHdoaWxlIChkb21FbGUuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGRvbUVsZS5yZW1vdmVDaGlsZChkb21FbGUuY2hpbGROb2Rlc1swXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGN5Ll9wcml2YXRlLnJlbmRlcmVyID0gbnVsbDsgLy8gdG8gYmUgZXh0cmEgc2FmZSwgcmVtb3ZlIHRoZSByZWZcbiAgICBjeS5tdXRhYmxlRWxlbWVudHMoKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgIF9wLnJzY3JhdGNoID0ge307XG4gICAgICBfcC5yc3R5bGUgPSB7fTtcbiAgICAgIF9wLmFuaW1hdGlvbi5jdXJyZW50ID0gW107XG4gICAgICBfcC5hbmltYXRpb24ucXVldWUgPSBbXTtcbiAgICB9KTtcbiAgfSxcbiAgb25SZW5kZXI6IGZ1bmN0aW9uIG9uUmVuZGVyKGZuKSB7XG4gICAgcmV0dXJuIHRoaXMub24oJ3JlbmRlcicsIGZuKTtcbiAgfSxcbiAgb2ZmUmVuZGVyOiBmdW5jdGlvbiBvZmZSZW5kZXIoZm4pIHtcbiAgICByZXR1cm4gdGhpcy5vZmYoJ3JlbmRlcicsIGZuKTtcbiAgfVxufTtcbmNvcmVmbiQ0LmludmFsaWRhdGVEaW1lbnNpb25zID0gY29yZWZuJDQucmVzaXplO1xuXG52YXIgY29yZWZuJDMgPSB7XG4gIC8vIGdldCBhIGNvbGxlY3Rpb25cbiAgLy8gLSBlbXB0eSBjb2xsZWN0aW9uIG9uIG5vIGFyZ3NcbiAgLy8gLSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzIGluIHRoZSBncmFwaCBvbiBzZWxlY3RvciBhcmdcbiAgLy8gLSBndWFyYW50ZWUgYSByZXR1cm5lZCBjb2xsZWN0aW9uIHdoZW4gZWxlbWVudHMgb3IgY29sbGVjdGlvbiBzcGVjaWZpZWRcbiAgY29sbGVjdGlvbjogZnVuY3Rpb24gY29sbGVjdGlvbihlbGVzLCBvcHRzKSB7XG4gICAgaWYgKHN0cmluZyhlbGVzKSkge1xuICAgICAgcmV0dXJuIHRoaXMuJChlbGVzKTtcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnRPckNvbGxlY3Rpb24oZWxlcykpIHtcbiAgICAgIHJldHVybiBlbGVzLmNvbGxlY3Rpb24oKTtcbiAgICB9IGVsc2UgaWYgKGFycmF5KGVsZXMpKSB7XG4gICAgICBpZiAoIW9wdHMpIHtcbiAgICAgICAgb3B0cyA9IHt9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKHRoaXMsIGVsZXMsIG9wdHMudW5pcXVlLCBvcHRzLnJlbW92ZWQpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IENvbGxlY3Rpb24odGhpcyk7XG4gIH0sXG4gIG5vZGVzOiBmdW5jdGlvbiBub2RlcyhzZWxlY3Rvcikge1xuICAgIHZhciBub2RlcyA9IHRoaXMuJChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzTm9kZSgpO1xuICAgIH0pO1xuICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIG5vZGVzLmZpbHRlcihzZWxlY3Rvcik7XG4gICAgfVxuICAgIHJldHVybiBub2RlcztcbiAgfSxcbiAgZWRnZXM6IGZ1bmN0aW9uIGVkZ2VzKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVkZ2VzID0gdGhpcy4kKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNFZGdlKCk7XG4gICAgfSk7XG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gZWRnZXMuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIGVkZ2VzO1xuICB9LFxuICAvLyBzZWFyY2ggdGhlIGdyYXBoIGxpa2UgalF1ZXJ5XG4gICQ6IGZ1bmN0aW9uICQoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWxlcyA9IHRoaXMuX3ByaXZhdGUuZWxlbWVudHM7XG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gZWxlcy5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWxlcy5zcGF3blNlbGYoKTtcbiAgICB9XG4gIH0sXG4gIG11dGFibGVFbGVtZW50czogZnVuY3Rpb24gbXV0YWJsZUVsZW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmVsZW1lbnRzO1xuICB9XG59O1xuXG4vLyBhbGlhc2VzXG5jb3JlZm4kMy5lbGVtZW50cyA9IGNvcmVmbiQzLmZpbHRlciA9IGNvcmVmbiQzLiQ7XG5cbnZhciBzdHlmbiQ4ID0ge307XG5cbi8vIGtleXMgZm9yIHN0eWxlIGJsb2NrcywgZS5nLiB0dGZmdHRcbnZhciBUUlVFID0gJ3QnO1xudmFyIEZBTFNFID0gJ2YnO1xuXG4vLyAocG90ZW50aWFsbHkgZXhwZW5zaXZlIGNhbGN1bGF0aW9uKVxuLy8gYXBwbHkgdGhlIHN0eWxlIHRvIHRoZSBlbGVtZW50IGJhc2VkIG9uXG4vLyAtIGl0cyBieXBhc3Ncbi8vIC0gd2hhdCBzZWxlY3RvcnMgbWF0Y2ggaXRcbnN0eWZuJDguYXBwbHkgPSBmdW5jdGlvbiAoZWxlcykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBfcCA9IHNlbGYuX3ByaXZhdGU7XG4gIHZhciBjeSA9IF9wLmN5O1xuICB2YXIgdXBkYXRlZEVsZXMgPSBjeS5jb2xsZWN0aW9uKCk7XG4gIGZvciAodmFyIGllID0gMDsgaWUgPCBlbGVzLmxlbmd0aDsgaWUrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2llXTtcbiAgICB2YXIgY3h0TWV0YSA9IHNlbGYuZ2V0Q29udGV4dE1ldGEoZWxlKTtcbiAgICBpZiAoY3h0TWV0YS5lbXB0eSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBjeHRTdHlsZSA9IHNlbGYuZ2V0Q29udGV4dFN0eWxlKGN4dE1ldGEpO1xuICAgIHZhciBhcHAgPSBzZWxmLmFwcGx5Q29udGV4dFN0eWxlKGN4dE1ldGEsIGN4dFN0eWxlLCBlbGUpO1xuICAgIGlmIChlbGUuX3ByaXZhdGUuYXBwbGllZEluaXRTdHlsZSkge1xuICAgICAgc2VsZi51cGRhdGVUcmFuc2l0aW9ucyhlbGUsIGFwcC5kaWZmUHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGUuX3ByaXZhdGUuYXBwbGllZEluaXRTdHlsZSA9IHRydWU7XG4gICAgfVxuICAgIHZhciBoaW50c0RpZmYgPSBzZWxmLnVwZGF0ZVN0eWxlSGludHMoZWxlKTtcbiAgICBpZiAoaGludHNEaWZmKSB7XG4gICAgICB1cGRhdGVkRWxlcy5wdXNoKGVsZSk7XG4gICAgfVxuICB9IC8vIGZvciBlbGVtZW50c1xuXG4gIHJldHVybiB1cGRhdGVkRWxlcztcbn07XG5zdHlmbiQ4LmdldFByb3BlcnRpZXNEaWZmID0gZnVuY3Rpb24gKG9sZEN4dEtleSwgbmV3Q3h0S2V5KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGNhY2hlID0gc2VsZi5fcHJpdmF0ZS5wcm9wRGlmZnMgPSBzZWxmLl9wcml2YXRlLnByb3BEaWZmcyB8fCB7fTtcbiAgdmFyIGR1YWxDeHRLZXkgPSBvbGRDeHRLZXkgKyAnLScgKyBuZXdDeHRLZXk7XG4gIHZhciBjYWNoZWRWYWwgPSBjYWNoZVtkdWFsQ3h0S2V5XTtcbiAgaWYgKGNhY2hlZFZhbCkge1xuICAgIHJldHVybiBjYWNoZWRWYWw7XG4gIH1cbiAgdmFyIGRpZmZQcm9wcyA9IFtdO1xuICB2YXIgYWRkZWRQcm9wID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjeHQgPSBzZWxmW2ldO1xuICAgIHZhciBvbGRIYXNDeHQgPSBvbGRDeHRLZXlbaV0gPT09IFRSVUU7XG4gICAgdmFyIG5ld0hhc0N4dCA9IG5ld0N4dEtleVtpXSA9PT0gVFJVRTtcbiAgICB2YXIgY3h0SGFzRGlmZmVkID0gb2xkSGFzQ3h0ICE9PSBuZXdIYXNDeHQ7XG4gICAgdmFyIGN4dEhhc01hcHBlZFByb3BzID0gY3h0Lm1hcHBlZFByb3BlcnRpZXMubGVuZ3RoID4gMDtcbiAgICBpZiAoY3h0SGFzRGlmZmVkIHx8IG5ld0hhc0N4dCAmJiBjeHRIYXNNYXBwZWRQcm9wcykge1xuICAgICAgdmFyIHByb3BzID0gdm9pZCAwO1xuICAgICAgaWYgKGN4dEhhc0RpZmZlZCAmJiBjeHRIYXNNYXBwZWRQcm9wcykge1xuICAgICAgICBwcm9wcyA9IGN4dC5wcm9wZXJ0aWVzOyAvLyBzdWZmaWNlcyBiL2MgbWFwcGVkUHJvcGVydGllcyBpcyBhIHN1YnNldCBvZiBwcm9wZXJ0aWVzXG4gICAgICB9IGVsc2UgaWYgKGN4dEhhc0RpZmZlZCkge1xuICAgICAgICBwcm9wcyA9IGN4dC5wcm9wZXJ0aWVzOyAvLyBuZWVkIHRvIGNoZWNrIHRoZW0gYWxsXG4gICAgICB9IGVsc2UgaWYgKGN4dEhhc01hcHBlZFByb3BzKSB7XG4gICAgICAgIHByb3BzID0gY3h0Lm1hcHBlZFByb3BlcnRpZXM7IC8vIG9ubHkgbmVlZCB0byBjaGVjayBtYXBwZWRcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgcHJvcCA9IHByb3BzW2pdO1xuICAgICAgICB2YXIgbmFtZSA9IHByb3AubmFtZTtcblxuICAgICAgICAvLyBpZiBhIGxhdGVyIGNvbnRleHQgb3ZlcnJpZGVzIHRoaXMgcHJvcGVydHksIHRoZW4gdGhlIGZhY3QgdGhhdCB0aGlzIGNvbnRleHQgaGFzIHN3aXRjaGVkL2RpZmZlZCBkb2Vzbid0IG1hdHRlclxuICAgICAgICAvLyAoc2VtaSBleHBlbnNpdmUgY2hlY2sgc2luY2UgaXQgbWFrZXMgdGhpcyBmdW5jdGlvbiBPKG5eMikgb24gY29udGV4dCBsZW5ndGgsIGJ1dCB3b3J0aCBpdCBzaW5jZSBvdmVyYWxsIHJlc3VsdFxuICAgICAgICAvLyBpcyBjYWNoZWQpXG4gICAgICAgIHZhciBsYXRlckN4dE92ZXJyaWRlcyA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBrID0gaSArIDE7IGsgPCBzZWxmLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgdmFyIGxhdGVyQ3h0ID0gc2VsZltrXTtcbiAgICAgICAgICB2YXIgaGFzTGF0ZXJDeHQgPSBuZXdDeHRLZXlba10gPT09IFRSVUU7XG4gICAgICAgICAgaWYgKCFoYXNMYXRlckN4dCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSAvLyBjYW4ndCBvdmVycmlkZSB1bmxlc3MgdGhlIGNvbnRleHQgaXMgYWN0aXZlXG5cbiAgICAgICAgICBsYXRlckN4dE92ZXJyaWRlcyA9IGxhdGVyQ3h0LnByb3BlcnRpZXNbcHJvcC5uYW1lXSAhPSBudWxsO1xuICAgICAgICAgIGlmIChsYXRlckN4dE92ZXJyaWRlcykge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfSAvLyBleGl0IGVhcmx5IGFzIGxvbmcgYXMgb25lIGxhdGVyIGNvbnRleHQgb3ZlcnJpZGVzXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWFkZGVkUHJvcFtuYW1lXSAmJiAhbGF0ZXJDeHRPdmVycmlkZXMpIHtcbiAgICAgICAgICBhZGRlZFByb3BbbmFtZV0gPSB0cnVlO1xuICAgICAgICAgIGRpZmZQcm9wcy5wdXNoKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9IC8vIGZvciBwcm9wc1xuICAgIH0gLy8gaWZcbiAgfSAvLyBmb3IgY29udGV4dHNcblxuICBjYWNoZVtkdWFsQ3h0S2V5XSA9IGRpZmZQcm9wcztcbiAgcmV0dXJuIGRpZmZQcm9wcztcbn07XG5zdHlmbiQ4LmdldENvbnRleHRNZXRhID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBjeHRLZXkgPSAnJztcbiAgdmFyIGRpZmZQcm9wcztcbiAgdmFyIHByZXZLZXkgPSBlbGUuX3ByaXZhdGUuc3R5bGVDeHRLZXkgfHwgJyc7XG5cbiAgLy8gZ2V0IHRoZSBjeHQga2V5XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjb250ZXh0ID0gc2VsZltpXTtcbiAgICB2YXIgY29udGV4dFNlbGVjdG9yTWF0Y2hlcyA9IGNvbnRleHQuc2VsZWN0b3IgJiYgY29udGV4dC5zZWxlY3Rvci5tYXRjaGVzKGVsZSk7IC8vIE5COiBjb250ZXh0LnNlbGVjdG9yIG1heSBiZSBudWxsIGZvciAnY29yZSdcblxuICAgIGlmIChjb250ZXh0U2VsZWN0b3JNYXRjaGVzKSB7XG4gICAgICBjeHRLZXkgKz0gVFJVRTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3h0S2V5ICs9IEZBTFNFO1xuICAgIH1cbiAgfSAvLyBmb3IgY29udGV4dFxuXG4gIGRpZmZQcm9wcyA9IHNlbGYuZ2V0UHJvcGVydGllc0RpZmYocHJldktleSwgY3h0S2V5KTtcbiAgZWxlLl9wcml2YXRlLnN0eWxlQ3h0S2V5ID0gY3h0S2V5O1xuICByZXR1cm4ge1xuICAgIGtleTogY3h0S2V5LFxuICAgIGRpZmZQcm9wTmFtZXM6IGRpZmZQcm9wcyxcbiAgICBlbXB0eTogZGlmZlByb3BzLmxlbmd0aCA9PT0gMFxuICB9O1xufTtcblxuLy8gZ2V0cyBhIGNvbXB1dGVkIGVsZSBzdHlsZSBvYmplY3QgYmFzZWQgb24gbWF0Y2hlZCBjb250ZXh0c1xuc3R5Zm4kOC5nZXRDb250ZXh0U3R5bGUgPSBmdW5jdGlvbiAoY3h0TWV0YSkge1xuICB2YXIgY3h0S2V5ID0gY3h0TWV0YS5rZXk7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGN4dFN0eWxlcyA9IHRoaXMuX3ByaXZhdGUuY29udGV4dFN0eWxlcyA9IHRoaXMuX3ByaXZhdGUuY29udGV4dFN0eWxlcyB8fCB7fTtcblxuICAvLyBpZiBhbHJlYWR5IGNvbXB1dGVkIHN0eWxlLCByZXR1cm5lZCBjYWNoZWQgY29weVxuICBpZiAoY3h0U3R5bGVzW2N4dEtleV0pIHtcbiAgICByZXR1cm4gY3h0U3R5bGVzW2N4dEtleV07XG4gIH1cbiAgdmFyIHN0eWxlID0ge1xuICAgIF9wcml2YXRlOiB7XG4gICAgICBrZXk6IGN4dEtleVxuICAgIH1cbiAgfTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGN4dCA9IHNlbGZbaV07XG4gICAgdmFyIGhhc0N4dCA9IGN4dEtleVtpXSA9PT0gVFJVRTtcbiAgICBpZiAoIWhhc0N4dCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgY3h0LnByb3BlcnRpZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBwcm9wID0gY3h0LnByb3BlcnRpZXNbal07XG4gICAgICBzdHlsZVtwcm9wLm5hbWVdID0gcHJvcDtcbiAgICB9XG4gIH1cbiAgY3h0U3R5bGVzW2N4dEtleV0gPSBzdHlsZTtcbiAgcmV0dXJuIHN0eWxlO1xufTtcbnN0eWZuJDguYXBwbHlDb250ZXh0U3R5bGUgPSBmdW5jdGlvbiAoY3h0TWV0YSwgY3h0U3R5bGUsIGVsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBkaWZmUHJvcHMgPSBjeHRNZXRhLmRpZmZQcm9wTmFtZXM7XG4gIHZhciByZXREaWZmUHJvcHMgPSB7fTtcbiAgdmFyIHR5cGVzID0gc2VsZi50eXBlcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWZmUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGlmZlByb3BOYW1lID0gZGlmZlByb3BzW2ldO1xuICAgIHZhciBjeHRQcm9wID0gY3h0U3R5bGVbZGlmZlByb3BOYW1lXTtcbiAgICB2YXIgZWxlUHJvcCA9IGVsZS5wc3R5bGUoZGlmZlByb3BOYW1lKTtcbiAgICBpZiAoIWN4dFByb3ApIHtcbiAgICAgIC8vIG5vIGNvbnRleHQgcHJvcCBtZWFucyBkZWxldGVcbiAgICAgIGlmICghZWxlUHJvcCkge1xuICAgICAgICBjb250aW51ZTsgLy8gbm8gZXhpc3RpbmcgcHJvcCBtZWFucyBub3RoaW5nIG5lZWRzIHRvIGJlIHJlbW92ZWRcbiAgICAgICAgLy8gbmIgYWZmZWN0cyBpbml0aWFsIGFwcGxpY2F0aW9uIG9uIG1hcHBlZCB2YWx1ZXMgbGlrZSBjb250cm9sLXBvaW50LWRpc3RhbmNlc1xuICAgICAgfSBlbHNlIGlmIChlbGVQcm9wLmJ5cGFzcykge1xuICAgICAgICBjeHRQcm9wID0ge1xuICAgICAgICAgIG5hbWU6IGRpZmZQcm9wTmFtZSxcbiAgICAgICAgICBkZWxldGVCeXBhc3NlZDogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3h0UHJvcCA9IHtcbiAgICAgICAgICBuYW1lOiBkaWZmUHJvcE5hbWUsXG4gICAgICAgICAgXCJkZWxldGVcIjogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNhdmUgY3ljbGVzIHdoZW4gdGhlIGNvbnRleHQgcHJvcCBkb2Vzbid0IG5lZWQgdG8gYmUgYXBwbGllZFxuICAgIGlmIChlbGVQcm9wID09PSBjeHRQcm9wKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBzYXZlIGN5Y2xlcyB3aGVuIGEgbWFwcGVkIGNvbnRleHQgcHJvcCBkb2Vzbid0IG5lZWQgdG8gYmUgYXBwbGllZFxuICAgIGlmIChjeHRQcm9wLm1hcHBlZCA9PT0gdHlwZXMuZm4gLy8gY29udGV4dCBwcm9wIGlzIGZ1bmN0aW9uIG1hcHBlclxuICAgICYmIGVsZVByb3AgIT0gbnVsbCAvLyBzb21lIHByb3BzIGNhbiBiZSBudWxsIGV2ZW4gYnkgZGVmYXVsdCAoZS5nLiBhIHByb3AgdGhhdCBvdmVycmlkZXMgYW5vdGhlciBvbmUpXG4gICAgJiYgZWxlUHJvcC5tYXBwaW5nICE9IG51bGwgLy8gZWxlIHByb3AgaXMgYSBjb25jcmV0ZSB2YWx1ZSBmcm9tIGZyb20gYSBtYXBwZXJcbiAgICAmJiBlbGVQcm9wLm1hcHBpbmcudmFsdWUgPT09IGN4dFByb3AudmFsdWUgLy8gdGhlIGN1cnJlbnQgcHJvcCBvbiB0aGUgZWxlIGlzIGEgZmxhdCBwcm9wIHZhbHVlIGZvciB0aGUgZnVuY3Rpb24gbWFwcGVyXG4gICAgKSB7XG4gICAgICAvLyBOQiBkb24ndCB3cml0ZSB0byBjeHRQcm9wLCBhcyBpdCdzIHNoYXJlZCBhbW9uZyBlbGVzIChzdG9yZWQgaW4gc3R5bGVzaGVldClcbiAgICAgIHZhciBtYXBwaW5nID0gZWxlUHJvcC5tYXBwaW5nOyAvLyBjYW4gd3JpdGUgdG8gbWFwcGluZywgYXMgaXQncyBhIHBlci1lbGUgY29weVxuICAgICAgdmFyIGZuVmFsdWUgPSBtYXBwaW5nLmZuVmFsdWUgPSBjeHRQcm9wLnZhbHVlKGVsZSk7IC8vIHRlbXBvcmFyaWx5IGNhY2hlIHRoZSB2YWx1ZSBpbiBjYXNlIG9mIGEgbWlzc1xuXG4gICAgICBpZiAoZm5WYWx1ZSA9PT0gbWFwcGluZy5wcmV2Rm5WYWx1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIHJldERpZmZQcm9wID0gcmV0RGlmZlByb3BzW2RpZmZQcm9wTmFtZV0gPSB7XG4gICAgICBwcmV2OiBlbGVQcm9wXG4gICAgfTtcbiAgICBzZWxmLmFwcGx5UGFyc2VkUHJvcGVydHkoZWxlLCBjeHRQcm9wKTtcbiAgICByZXREaWZmUHJvcC5uZXh0ID0gZWxlLnBzdHlsZShkaWZmUHJvcE5hbWUpO1xuICAgIGlmIChyZXREaWZmUHJvcC5uZXh0ICYmIHJldERpZmZQcm9wLm5leHQuYnlwYXNzKSB7XG4gICAgICByZXREaWZmUHJvcC5uZXh0ID0gcmV0RGlmZlByb3AubmV4dC5ieXBhc3NlZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBkaWZmUHJvcHM6IHJldERpZmZQcm9wc1xuICB9O1xufTtcbnN0eWZuJDgudXBkYXRlU3R5bGVIaW50cyA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBwcm9wTmFtZXMgPSBzZWxmLnByb3BlcnR5R3JvdXBOYW1lcztcbiAgdmFyIHByb3BHcktleXMgPSBzZWxmLnByb3BlcnR5R3JvdXBLZXlzO1xuICB2YXIgcHJvcEhhc2ggPSBmdW5jdGlvbiBwcm9wSGFzaChlbGUsIHByb3BOYW1lcywgc2VlZEtleSkge1xuICAgIHJldHVybiBzZWxmLmdldFByb3BlcnRpZXNIYXNoKGVsZSwgcHJvcE5hbWVzLCBzZWVkS2V5KTtcbiAgfTtcbiAgdmFyIG9sZFN0eWxlS2V5ID0gX3Auc3R5bGVLZXk7XG4gIGlmIChlbGUucmVtb3ZlZCgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBpc05vZGUgPSBfcC5ncm91cCA9PT0gJ25vZGVzJztcblxuICAvLyBnZXQgdGhlIHN0eWxlIGtleSBoYXNoZXMgcGVyIHByb3AgZ3JvdXBcbiAgLy8gYnV0IGxhemlseSAtLSBvbmx5IHVzZSBub24tZGVmYXVsdCBwcm9wIHZhbHVlcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBoYXNoZXNcbiAgLy9cblxuICB2YXIgb3ZlcnJpZGRlblN0eWxlcyA9IGVsZS5fcHJpdmF0ZS5zdHlsZTtcbiAgcHJvcE5hbWVzID0gT2JqZWN0LmtleXMob3ZlcnJpZGRlblN0eWxlcyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcEdyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBncktleSA9IHByb3BHcktleXNbaV07XG4gICAgX3Auc3R5bGVLZXlzW2dyS2V5XSA9IFtERUZBVUxUX0hBU0hfU0VFRCwgREVGQVVMVF9IQVNIX1NFRURfQUxUXTtcbiAgfVxuICB2YXIgdXBkYXRlR3JLZXkxID0gZnVuY3Rpb24gdXBkYXRlR3JLZXkxKHZhbCwgZ3JLZXkpIHtcbiAgICByZXR1cm4gX3Auc3R5bGVLZXlzW2dyS2V5XVswXSA9IGhhc2hJbnQodmFsLCBfcC5zdHlsZUtleXNbZ3JLZXldWzBdKTtcbiAgfTtcbiAgdmFyIHVwZGF0ZUdyS2V5MiA9IGZ1bmN0aW9uIHVwZGF0ZUdyS2V5Mih2YWwsIGdyS2V5KSB7XG4gICAgcmV0dXJuIF9wLnN0eWxlS2V5c1tncktleV1bMV0gPSBoYXNoSW50QWx0KHZhbCwgX3Auc3R5bGVLZXlzW2dyS2V5XVsxXSk7XG4gIH07XG4gIHZhciB1cGRhdGVHcktleSA9IGZ1bmN0aW9uIHVwZGF0ZUdyS2V5KHZhbCwgZ3JLZXkpIHtcbiAgICB1cGRhdGVHcktleTEodmFsLCBncktleSk7XG4gICAgdXBkYXRlR3JLZXkyKHZhbCwgZ3JLZXkpO1xuICB9O1xuICB2YXIgdXBkYXRlR3JLZXlXU3RyID0gZnVuY3Rpb24gdXBkYXRlR3JLZXlXU3RyKHN0clZhbCwgZ3JLZXkpIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHN0clZhbC5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIGNoID0gc3RyVmFsLmNoYXJDb2RlQXQoaik7XG4gICAgICB1cGRhdGVHcktleTEoY2gsIGdyS2V5KTtcbiAgICAgIHVwZGF0ZUdyS2V5MihjaCwgZ3JLZXkpO1xuICAgIH1cbiAgfTtcblxuICAvLyAtIGhhc2hpbmcgd29ya3Mgb24gMzIgYml0IGludHMgYi9jIHdlIHVzZSBiaXR3aXNlIG9wc1xuICAvLyAtIHNtYWxsIG51bWJlcnMgZ2V0IGN1dCBvZmYgKGUuZy4gMC4xMjMgaXMgc2VlbiBhcyAwIGJ5IHRoZSBoYXNoaW5nIGZ1bmN0aW9uKVxuICAvLyAtIHJhaXNlIHVwIHNtYWxsIG51bWJlcnMgc28gbW9yZSBzaWduaWZpY2FudCBkaWdpdHMgYXJlIHNlZW4gYnkgaGFzaGluZ1xuICAvLyAtIG1ha2Ugc21hbGwgbnVtYmVycyBsYXJnZXIgdGhhbiBhIG5vcm1hbCB2YWx1ZSB0byBhdm9pZCBjb2xsaXNpb25zXG4gIC8vIC0gd29ya3MgaW4gcHJhY3RpY2UgYW5kIGl0J3MgcmVsYXRpdmVseSBjaGVhcFxuICB2YXIgTiA9IDIwMDAwMDAwMDA7XG4gIHZhciBjbGVhbk51bSA9IGZ1bmN0aW9uIGNsZWFuTnVtKHZhbCkge1xuICAgIHJldHVybiAtMTI4IDwgdmFsICYmIHZhbCA8IDEyOCAmJiBNYXRoLmZsb29yKHZhbCkgIT09IHZhbCA/IE4gLSAodmFsICogMTAyNCB8IDApIDogdmFsO1xuICB9O1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgcHJvcE5hbWVzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBuYW1lID0gcHJvcE5hbWVzW19pXTtcbiAgICB2YXIgcGFyc2VkUHJvcCA9IG92ZXJyaWRkZW5TdHlsZXNbbmFtZV07XG4gICAgaWYgKHBhcnNlZFByb3AgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBwcm9wSW5mbyA9IHRoaXMucHJvcGVydGllc1tuYW1lXTtcbiAgICB2YXIgdHlwZSA9IHByb3BJbmZvLnR5cGU7XG4gICAgdmFyIF9ncktleSA9IHByb3BJbmZvLmdyb3VwS2V5O1xuICAgIHZhciBub3JtYWxpemVkTnVtYmVyVmFsID0gdm9pZCAwO1xuICAgIGlmIChwcm9wSW5mby5oYXNoT3ZlcnJpZGUgIT0gbnVsbCkge1xuICAgICAgbm9ybWFsaXplZE51bWJlclZhbCA9IHByb3BJbmZvLmhhc2hPdmVycmlkZShlbGUsIHBhcnNlZFByb3ApO1xuICAgIH0gZWxzZSBpZiAocGFyc2VkUHJvcC5wZlZhbHVlICE9IG51bGwpIHtcbiAgICAgIG5vcm1hbGl6ZWROdW1iZXJWYWwgPSBwYXJzZWRQcm9wLnBmVmFsdWU7XG4gICAgfVxuXG4gICAgLy8gbWlnaHQgbm90IGJlIGEgbnVtYmVyIGlmIGl0IGFsbG93cyBlbnVtc1xuICAgIHZhciBudW1iZXJWYWwgPSBwcm9wSW5mby5lbnVtcyA9PSBudWxsID8gcGFyc2VkUHJvcC52YWx1ZSA6IG51bGw7XG4gICAgdmFyIGhhdmVOb3JtTnVtID0gbm9ybWFsaXplZE51bWJlclZhbCAhPSBudWxsO1xuICAgIHZhciBoYXZlVW5pdGVkTnVtID0gbnVtYmVyVmFsICE9IG51bGw7XG4gICAgdmFyIGhhdmVOdW0gPSBoYXZlTm9ybU51bSB8fCBoYXZlVW5pdGVkTnVtO1xuICAgIHZhciB1bml0cyA9IHBhcnNlZFByb3AudW5pdHM7XG5cbiAgICAvLyBudW1iZXJzIGFyZSBjaGVhcGVyIHRvIGhhc2ggdGhhbiBzdHJpbmdzXG4gICAgLy8gMSBoYXNoIG9wIHZzIG4gaGFzaCBvcHMgKGZvciBsZW5ndGggbiBzdHJpbmcpXG4gICAgaWYgKHR5cGUubnVtYmVyICYmIGhhdmVOdW0gJiYgIXR5cGUubXVsdGlwbGUpIHtcbiAgICAgIHZhciB2ID0gaGF2ZU5vcm1OdW0gPyBub3JtYWxpemVkTnVtYmVyVmFsIDogbnVtYmVyVmFsO1xuICAgICAgdXBkYXRlR3JLZXkoY2xlYW5OdW0odiksIF9ncktleSk7XG4gICAgICBpZiAoIWhhdmVOb3JtTnVtICYmIHVuaXRzICE9IG51bGwpIHtcbiAgICAgICAgdXBkYXRlR3JLZXlXU3RyKHVuaXRzLCBfZ3JLZXkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGVHcktleVdTdHIocGFyc2VkUHJvcC5zdHJWYWx1ZSwgX2dyS2V5KTtcbiAgICB9XG4gIH1cblxuICAvLyBvdmVyYWxsIHN0eWxlIGtleVxuICAvL1xuXG4gIHZhciBoYXNoID0gW0RFRkFVTFRfSEFTSF9TRUVELCBERUZBVUxUX0hBU0hfU0VFRF9BTFRdO1xuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBwcm9wR3JLZXlzLmxlbmd0aDsgX2kyKyspIHtcbiAgICB2YXIgX2dyS2V5MiA9IHByb3BHcktleXNbX2kyXTtcbiAgICB2YXIgZ3JIYXNoID0gX3Auc3R5bGVLZXlzW19ncktleTJdO1xuICAgIGhhc2hbMF0gPSBoYXNoSW50KGdySGFzaFswXSwgaGFzaFswXSk7XG4gICAgaGFzaFsxXSA9IGhhc2hJbnRBbHQoZ3JIYXNoWzFdLCBoYXNoWzFdKTtcbiAgfVxuICBfcC5zdHlsZUtleSA9IGNvbWJpbmVIYXNoZXMoaGFzaFswXSwgaGFzaFsxXSk7XG5cbiAgLy8gbGFiZWwgZGltc1xuICAvL1xuXG4gIHZhciBzayA9IF9wLnN0eWxlS2V5cztcbiAgX3AubGFiZWxEaW1zS2V5ID0gY29tYmluZUhhc2hlc0FycmF5KHNrLmxhYmVsRGltZW5zaW9ucyk7XG4gIHZhciBsYWJlbEtleXMgPSBwcm9wSGFzaChlbGUsIFsnbGFiZWwnXSwgc2subGFiZWxEaW1lbnNpb25zKTtcbiAgX3AubGFiZWxLZXkgPSBjb21iaW5lSGFzaGVzQXJyYXkobGFiZWxLZXlzKTtcbiAgX3AubGFiZWxTdHlsZUtleSA9IGNvbWJpbmVIYXNoZXNBcnJheShoYXNoQXJyYXlzKHNrLmNvbW1vbkxhYmVsLCBsYWJlbEtleXMpKTtcbiAgaWYgKCFpc05vZGUpIHtcbiAgICB2YXIgc291cmNlTGFiZWxLZXlzID0gcHJvcEhhc2goZWxlLCBbJ3NvdXJjZS1sYWJlbCddLCBzay5sYWJlbERpbWVuc2lvbnMpO1xuICAgIF9wLnNvdXJjZUxhYmVsS2V5ID0gY29tYmluZUhhc2hlc0FycmF5KHNvdXJjZUxhYmVsS2V5cyk7XG4gICAgX3Auc291cmNlTGFiZWxTdHlsZUtleSA9IGNvbWJpbmVIYXNoZXNBcnJheShoYXNoQXJyYXlzKHNrLmNvbW1vbkxhYmVsLCBzb3VyY2VMYWJlbEtleXMpKTtcbiAgICB2YXIgdGFyZ2V0TGFiZWxLZXlzID0gcHJvcEhhc2goZWxlLCBbJ3RhcmdldC1sYWJlbCddLCBzay5sYWJlbERpbWVuc2lvbnMpO1xuICAgIF9wLnRhcmdldExhYmVsS2V5ID0gY29tYmluZUhhc2hlc0FycmF5KHRhcmdldExhYmVsS2V5cyk7XG4gICAgX3AudGFyZ2V0TGFiZWxTdHlsZUtleSA9IGNvbWJpbmVIYXNoZXNBcnJheShoYXNoQXJyYXlzKHNrLmNvbW1vbkxhYmVsLCB0YXJnZXRMYWJlbEtleXMpKTtcbiAgfVxuXG4gIC8vIG5vZGVcbiAgLy9cblxuICBpZiAoaXNOb2RlKSB7XG4gICAgdmFyIF9wJHN0eWxlS2V5cyA9IF9wLnN0eWxlS2V5cyxcbiAgICAgIG5vZGVCb2R5ID0gX3Akc3R5bGVLZXlzLm5vZGVCb2R5LFxuICAgICAgbm9kZUJvcmRlciA9IF9wJHN0eWxlS2V5cy5ub2RlQm9yZGVyLFxuICAgICAgYmFja2dyb3VuZEltYWdlID0gX3Akc3R5bGVLZXlzLmJhY2tncm91bmRJbWFnZSxcbiAgICAgIGNvbXBvdW5kID0gX3Akc3R5bGVLZXlzLmNvbXBvdW5kLFxuICAgICAgcGllID0gX3Akc3R5bGVLZXlzLnBpZTtcbiAgICB2YXIgbm9kZUtleXMgPSBbbm9kZUJvZHksIG5vZGVCb3JkZXIsIGJhY2tncm91bmRJbWFnZSwgY29tcG91bmQsIHBpZV0uZmlsdGVyKGZ1bmN0aW9uIChrKSB7XG4gICAgICByZXR1cm4gayAhPSBudWxsO1xuICAgIH0pLnJlZHVjZShoYXNoQXJyYXlzLCBbREVGQVVMVF9IQVNIX1NFRUQsIERFRkFVTFRfSEFTSF9TRUVEX0FMVF0pO1xuICAgIF9wLm5vZGVLZXkgPSBjb21iaW5lSGFzaGVzQXJyYXkobm9kZUtleXMpO1xuICAgIF9wLmhhc1BpZSA9IHBpZSAhPSBudWxsICYmIHBpZVswXSAhPT0gREVGQVVMVF9IQVNIX1NFRUQgJiYgcGllWzFdICE9PSBERUZBVUxUX0hBU0hfU0VFRF9BTFQ7XG4gIH1cbiAgcmV0dXJuIG9sZFN0eWxlS2V5ICE9PSBfcC5zdHlsZUtleTtcbn07XG5zdHlmbiQ4LmNsZWFyU3R5bGVIaW50cyA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICBfcC5zdHlsZUN4dEtleSA9ICcnO1xuICBfcC5zdHlsZUtleXMgPSB7fTtcbiAgX3Auc3R5bGVLZXkgPSBudWxsO1xuICBfcC5sYWJlbEtleSA9IG51bGw7XG4gIF9wLmxhYmVsU3R5bGVLZXkgPSBudWxsO1xuICBfcC5zb3VyY2VMYWJlbEtleSA9IG51bGw7XG4gIF9wLnNvdXJjZUxhYmVsU3R5bGVLZXkgPSBudWxsO1xuICBfcC50YXJnZXRMYWJlbEtleSA9IG51bGw7XG4gIF9wLnRhcmdldExhYmVsU3R5bGVLZXkgPSBudWxsO1xuICBfcC5ub2RlS2V5ID0gbnVsbDtcbiAgX3AuaGFzUGllID0gbnVsbDtcbn07XG5cbi8vIGFwcGx5IGEgcHJvcGVydHkgdG8gdGhlIHN0eWxlIChmb3IgaW50ZXJuYWwgdXNlKVxuLy8gcmV0dXJucyB3aGV0aGVyIGFwcGxpY2F0aW9uIHdhcyBzdWNjZXNzZnVsXG4vL1xuLy8gbm93LCB0aGlzIGZ1bmN0aW9uIGZsYXR0ZW5zIHRoZSBwcm9wZXJ0eSwgYW5kIGhlcmUncyBob3c6XG4vL1xuLy8gZm9yIHBhcnNlZFByb3A6eyBieXBhc3M6IHRydWUsIGRlbGV0ZUJ5cGFzczogdHJ1ZSB9XG4vLyBubyBwcm9wZXJ0eSBpcyBnZW5lcmF0ZWQsIGluc3RlYWQgdGhlIGJ5cGFzcyBwcm9wZXJ0eSBpbiB0aGVcbi8vIGVsZW1lbnQncyBzdHlsZSBpcyByZXBsYWNlZCBieSB3aGF0J3MgcG9pbnRlZCB0byBieSB0aGUgYGJ5cGFzc2VkYFxuLy8gZmllbGQgaW4gdGhlIGJ5cGFzcyBwcm9wZXJ0eSAoaS5lLiByZXN0b3JpbmcgdGhlIHByb3BlcnR5IHRoZVxuLy8gYnlwYXNzIHdhcyBvdmVycmlkaW5nKVxuLy9cbi8vIGZvciBwYXJzZWRQcm9wOnsgbWFwcGVkOiB0cnV0aHkgfVxuLy8gdGhlIGdlbmVyYXRlZCBmbGF0dGVuZWRQcm9wOnsgbWFwcGluZzogcHJvcCB9XG4vL1xuLy8gZm9yIHBhcnNlZFByb3A6eyBieXBhc3M6IHRydWUgfVxuLy8gdGhlIGdlbmVyYXRlZCBmbGF0dGVuZWRQcm9wOnsgYnlwYXNzZWQ6IHBhcnNlZFByb3AgfVxuc3R5Zm4kOC5hcHBseVBhcnNlZFByb3BlcnR5ID0gZnVuY3Rpb24gKGVsZSwgcGFyc2VkUHJvcCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBwcm9wID0gcGFyc2VkUHJvcDtcbiAgdmFyIHN0eWxlID0gZWxlLl9wcml2YXRlLnN0eWxlO1xuICB2YXIgZmxhdFByb3A7XG4gIHZhciB0eXBlcyA9IHNlbGYudHlwZXM7XG4gIHZhciB0eXBlID0gc2VsZi5wcm9wZXJ0aWVzW3Byb3AubmFtZV0udHlwZTtcbiAgdmFyIHByb3BJc0J5cGFzcyA9IHByb3AuYnlwYXNzO1xuICB2YXIgb3JpZ1Byb3AgPSBzdHlsZVtwcm9wLm5hbWVdO1xuICB2YXIgb3JpZ1Byb3BJc0J5cGFzcyA9IG9yaWdQcm9wICYmIG9yaWdQcm9wLmJ5cGFzcztcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgZmxhdFByb3BNYXBwaW5nID0gJ21hcHBpbmcnO1xuICB2YXIgZ2V0VmFsID0gZnVuY3Rpb24gZ2V0VmFsKHApIHtcbiAgICBpZiAocCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHAucGZWYWx1ZSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gcC5wZlZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcC52YWx1ZTtcbiAgICB9XG4gIH07XG4gIHZhciBjaGVja1RyaWdnZXJzID0gZnVuY3Rpb24gY2hlY2tUcmlnZ2VycygpIHtcbiAgICB2YXIgZnJvbVZhbCA9IGdldFZhbChvcmlnUHJvcCk7XG4gICAgdmFyIHRvVmFsID0gZ2V0VmFsKHByb3ApO1xuICAgIHNlbGYuY2hlY2tUcmlnZ2VycyhlbGUsIHByb3AubmFtZSwgZnJvbVZhbCwgdG9WYWwpO1xuICB9O1xuICBpZiAocHJvcCAmJiBwcm9wLm5hbWUuc3Vic3RyKDAsIDMpID09PSAncGllJykge1xuICAgIHdhcm4oJ1RoZSBwaWUgc3R5bGUgcHJvcGVydGllcyBhcmUgZGVwcmVjYXRlZC4gIENyZWF0ZSBjaGFydHMgdXNpbmcgYmFja2dyb3VuZCBpbWFnZXMgaW5zdGVhZC4nKTtcbiAgfVxuXG4gIC8vIGVkZ2Ugc2FuaXR5IGNoZWNrcyB0byBwcmV2ZW50IHRoZSBjbGllbnQgZnJvbSBtYWtpbmcgc2VyaW91cyBtaXN0YWtlc1xuICBpZiAocGFyc2VkUHJvcC5uYW1lID09PSAnY3VydmUtc3R5bGUnICYmIGVsZS5pc0VkZ2UoKSAmJiAoXG4gIC8vIGxvb3BzIG11c3QgYmUgYnVuZGxlZCBiZXppZXJzXG4gIHBhcnNlZFByb3AudmFsdWUgIT09ICdiZXppZXInICYmIGVsZS5pc0xvb3AoKSB8fFxuICAvLyBlZGdlcyBjb25uZWN0ZWQgdG8gY29tcG91bmQgbm9kZXMgY2FuIG5vdCBiZSBoYXlzdGFja3NcbiAgcGFyc2VkUHJvcC52YWx1ZSA9PT0gJ2hheXN0YWNrJyAmJiAoZWxlLnNvdXJjZSgpLmlzUGFyZW50KCkgfHwgZWxlLnRhcmdldCgpLmlzUGFyZW50KCkpKSkge1xuICAgIHByb3AgPSBwYXJzZWRQcm9wID0gdGhpcy5wYXJzZShwYXJzZWRQcm9wLm5hbWUsICdiZXppZXInLCBwcm9wSXNCeXBhc3MpO1xuICB9XG4gIGlmIChwcm9wW1wiZGVsZXRlXCJdKSB7XG4gICAgLy8gZGVsZXRlIHRoZSBwcm9wZXJ0eSBhbmQgdXNlIHRoZSBkZWZhdWx0IHZhbHVlIG9uIGZhbHNleSB2YWx1ZVxuICAgIHN0eWxlW3Byb3AubmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgY2hlY2tUcmlnZ2VycygpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChwcm9wLmRlbGV0ZUJ5cGFzc2VkKSB7XG4gICAgLy8gZGVsZXRlIHRoZSBwcm9wZXJ0eSB0aGF0IHRoZVxuICAgIGlmICghb3JpZ1Byb3ApIHtcbiAgICAgIGNoZWNrVHJpZ2dlcnMoKTtcbiAgICAgIHJldHVybiB0cnVlOyAvLyBjYW4ndCBkZWxldGUgaWYgbm8gcHJvcFxuICAgIH0gZWxzZSBpZiAob3JpZ1Byb3AuYnlwYXNzKSB7XG4gICAgICAvLyBkZWxldGUgYnlwYXNzZWRcbiAgICAgIG9yaWdQcm9wLmJ5cGFzc2VkID0gdW5kZWZpbmVkO1xuICAgICAgY2hlY2tUcmlnZ2VycygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gd2UncmUgdW5zdWNjZXNzZnVsIGRlbGV0aW5nIHRoZSBieXBhc3NlZFxuICAgIH1cbiAgfVxuXG4gIC8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gZGVsZXRlIHRoZSBjdXJyZW50IGJ5cGFzc1xuICBpZiAocHJvcC5kZWxldGVCeXBhc3MpIHtcbiAgICAvLyB0aGVuIHRoaXMgcHJvcGVydHkgaXMganVzdCBoZXJlIHRvIGluZGljYXRlIHdlIG5lZWQgdG8gZGVsZXRlXG4gICAgaWYgKCFvcmlnUHJvcCkge1xuICAgICAgY2hlY2tUcmlnZ2VycygpO1xuICAgICAgcmV0dXJuIHRydWU7IC8vIHByb3BlcnR5IGlzIGFscmVhZHkgbm90IGRlZmluZWRcbiAgICB9IGVsc2UgaWYgKG9yaWdQcm9wLmJ5cGFzcykge1xuICAgICAgLy8gdGhlbiByZXBsYWNlIHRoZSBieXBhc3MgcHJvcGVydHkgd2l0aCB0aGUgb3JpZ2luYWxcbiAgICAgIC8vIGJlY2F1c2UgdGhlIGJ5cGFzc2VkIHByb3BlcnR5IHdhcyBhbHJlYWR5IGFwcGxpZWQgKGFuZCB0aGVyZWZvcmUgcGFyc2VkKSwgd2UgY2FuIGp1c3QgcmVwbGFjZSBpdCAobm8gcmVhcHBseWluZyBuZWNlc3NhcnkpXG4gICAgICBzdHlsZVtwcm9wLm5hbWVdID0gb3JpZ1Byb3AuYnlwYXNzZWQ7XG4gICAgICBjaGVja1RyaWdnZXJzKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlOyAvLyB3ZSdyZSB1bnN1Y2Nlc3NmdWwgZGVsZXRpbmcgdGhlIGJ5cGFzc1xuICAgIH1cbiAgfVxuXG4gIHZhciBwcmludE1hcHBpbmdFcnIgPSBmdW5jdGlvbiBwcmludE1hcHBpbmdFcnIoKSB7XG4gICAgd2FybignRG8gbm90IGFzc2lnbiBtYXBwaW5ncyB0byBlbGVtZW50cyB3aXRob3V0IGNvcnJlc3BvbmRpbmcgZGF0YSAoaS5lLiBlbGUgYCcgKyBlbGUuaWQoKSArICdgIGhhcyBubyBtYXBwaW5nIGZvciBwcm9wZXJ0eSBgJyArIHByb3AubmFtZSArICdgIHdpdGggZGF0YSBmaWVsZCBgJyArIHByb3AuZmllbGQgKyAnYCk7IHRyeSBhIGBbJyArIHByb3AuZmllbGQgKyAnXWAgc2VsZWN0b3IgdG8gbGltaXQgc2NvcGUgdG8gZWxlbWVudHMgd2l0aCBgJyArIHByb3AuZmllbGQgKyAnYCBkZWZpbmVkJyk7XG4gIH07XG5cbiAgLy8gcHV0IHRoZSBwcm9wZXJ0eSBpbiB0aGUgc3R5bGUgb2JqZWN0c1xuICBzd2l0Y2ggKHByb3AubWFwcGVkKSB7XG4gICAgLy8gZmxhdHRlbiB0aGUgcHJvcGVydHkgaWYgbWFwcGVkXG4gICAgY2FzZSB0eXBlcy5tYXBEYXRhOlxuICAgICAge1xuICAgICAgICAvLyBmbGF0dGVuIHRoZSBmaWVsZCAoZS5nLiBkYXRhLmZvby5iYXIpXG4gICAgICAgIHZhciBmaWVsZHMgPSBwcm9wLmZpZWxkLnNwbGl0KCcuJyk7XG4gICAgICAgIHZhciBmaWVsZFZhbCA9IF9wLmRhdGE7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aCAmJiBmaWVsZFZhbDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2ldO1xuICAgICAgICAgIGZpZWxkVmFsID0gZmllbGRWYWxbZmllbGRdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWVsZFZhbCA9PSBudWxsKSB7XG4gICAgICAgICAgcHJpbnRNYXBwaW5nRXJyKCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwZXJjZW50O1xuICAgICAgICBpZiAoIW51bWJlciQxKGZpZWxkVmFsKSkge1xuICAgICAgICAgIC8vIHRoZW4gZG9uJ3QgYXBwbHkgYW5kIGZhbGwgYmFjayBvbiB0aGUgZXhpc3Rpbmcgc3R5bGVcbiAgICAgICAgICB3YXJuKCdEbyBub3QgdXNlIGNvbnRpbnVvdXMgbWFwcGVycyB3aXRob3V0IHNwZWNpZnlpbmcgbnVtZXJpYyBkYXRhIChpLmUuIGAnICsgcHJvcC5maWVsZCArICc6ICcgKyBmaWVsZFZhbCArICdgIGZvciBgJyArIGVsZS5pZCgpICsgJ2AgaXMgbm9uLW51bWVyaWMpJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBmaWVsZFdpZHRoID0gcHJvcC5maWVsZE1heCAtIHByb3AuZmllbGRNaW47XG4gICAgICAgICAgaWYgKGZpZWxkV2lkdGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIHNhZmV0eSBjaGVjayAtLSBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IGFzIG5vIHByb3BzIG9mIHplcm8gcmFuZ2Ugc2hvdWxkIGJlIHBhc3NlZCBoZXJlXG4gICAgICAgICAgICBwZXJjZW50ID0gMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVyY2VudCA9IChmaWVsZFZhbCAtIHByb3AuZmllbGRNaW4pIC8gZmllbGRXaWR0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtYWtlIHN1cmUgdG8gYm91bmQgcGVyY2VudCB2YWx1ZVxuICAgICAgICBpZiAocGVyY2VudCA8IDApIHtcbiAgICAgICAgICBwZXJjZW50ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChwZXJjZW50ID4gMSkge1xuICAgICAgICAgIHBlcmNlbnQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlLmNvbG9yKSB7XG4gICAgICAgICAgdmFyIHIxID0gcHJvcC52YWx1ZU1pblswXTtcbiAgICAgICAgICB2YXIgcjIgPSBwcm9wLnZhbHVlTWF4WzBdO1xuICAgICAgICAgIHZhciBnMSA9IHByb3AudmFsdWVNaW5bMV07XG4gICAgICAgICAgdmFyIGcyID0gcHJvcC52YWx1ZU1heFsxXTtcbiAgICAgICAgICB2YXIgYjEgPSBwcm9wLnZhbHVlTWluWzJdO1xuICAgICAgICAgIHZhciBiMiA9IHByb3AudmFsdWVNYXhbMl07XG4gICAgICAgICAgdmFyIGExID0gcHJvcC52YWx1ZU1pblszXSA9PSBudWxsID8gMSA6IHByb3AudmFsdWVNaW5bM107XG4gICAgICAgICAgdmFyIGEyID0gcHJvcC52YWx1ZU1heFszXSA9PSBudWxsID8gMSA6IHByb3AudmFsdWVNYXhbM107XG4gICAgICAgICAgdmFyIGNsciA9IFtNYXRoLnJvdW5kKHIxICsgKHIyIC0gcjEpICogcGVyY2VudCksIE1hdGgucm91bmQoZzEgKyAoZzIgLSBnMSkgKiBwZXJjZW50KSwgTWF0aC5yb3VuZChiMSArIChiMiAtIGIxKSAqIHBlcmNlbnQpLCBNYXRoLnJvdW5kKGExICsgKGEyIC0gYTEpICogcGVyY2VudCldO1xuICAgICAgICAgIGZsYXRQcm9wID0ge1xuICAgICAgICAgICAgLy8gY29sb3VycyBhcmUgc2ltcGxlLCBzbyBqdXN0IGNyZWF0ZSB0aGUgZmxhdCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGV4cGVuc2l2ZSBzdHJpbmcgcGFyc2luZ1xuICAgICAgICAgICAgYnlwYXNzOiBwcm9wLmJ5cGFzcyxcbiAgICAgICAgICAgIC8vIHdlJ3JlIGEgYnlwYXNzIGlmIHRoZSBtYXBwaW5nIHByb3BlcnR5IGlzIGEgYnlwYXNzXG4gICAgICAgICAgICBuYW1lOiBwcm9wLm5hbWUsXG4gICAgICAgICAgICB2YWx1ZTogY2xyLFxuICAgICAgICAgICAgc3RyVmFsdWU6ICdyZ2IoJyArIGNsclswXSArICcsICcgKyBjbHJbMV0gKyAnLCAnICsgY2xyWzJdICsgJyknXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlLm51bWJlcikge1xuICAgICAgICAgIHZhciBjYWxjVmFsdWUgPSBwcm9wLnZhbHVlTWluICsgKHByb3AudmFsdWVNYXggLSBwcm9wLnZhbHVlTWluKSAqIHBlcmNlbnQ7XG4gICAgICAgICAgZmxhdFByb3AgPSB0aGlzLnBhcnNlKHByb3AubmFtZSwgY2FsY1ZhbHVlLCBwcm9wLmJ5cGFzcywgZmxhdFByb3BNYXBwaW5nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGNhbiBvbmx5IG1hcCB0byBjb2xvdXJzIGFuZCBudW1iZXJzXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZsYXRQcm9wKSB7XG4gICAgICAgICAgLy8gaWYgd2UgY2FuJ3QgZmxhdHRlbiB0aGUgcHJvcGVydHksIHRoZW4gZG9uJ3QgYXBwbHkgdGhlIHByb3BlcnR5IGFuZCBmYWxsIGJhY2sgb24gdGhlIGV4aXN0aW5nIHN0eWxlXG4gICAgICAgICAgcHJpbnRNYXBwaW5nRXJyKCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZsYXRQcm9wLm1hcHBpbmcgPSBwcm9wOyAvLyBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBtYXBwaW5nXG4gICAgICAgIHByb3AgPSBmbGF0UHJvcDsgLy8gdGhlIGZsYXR0ZW5lZCAobWFwcGVkKSBwcm9wZXJ0eSBpcyB0aGUgb25lIHdlIHdhbnRcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIC8vIGRpcmVjdCBtYXBwaW5nXG4gICAgY2FzZSB0eXBlcy5kYXRhOlxuICAgICAge1xuICAgICAgICAvLyBmbGF0dGVuIHRoZSBmaWVsZCAoZS5nLiBkYXRhLmZvby5iYXIpXG4gICAgICAgIHZhciBfZmllbGRzID0gcHJvcC5maWVsZC5zcGxpdCgnLicpO1xuICAgICAgICB2YXIgX2ZpZWxkVmFsID0gX3AuZGF0YTtcbiAgICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgX2ZpZWxkcy5sZW5ndGggJiYgX2ZpZWxkVmFsOyBfaTMrKykge1xuICAgICAgICAgIHZhciBfZmllbGQgPSBfZmllbGRzW19pM107XG4gICAgICAgICAgX2ZpZWxkVmFsID0gX2ZpZWxkVmFsW19maWVsZF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9maWVsZFZhbCAhPSBudWxsKSB7XG4gICAgICAgICAgZmxhdFByb3AgPSB0aGlzLnBhcnNlKHByb3AubmFtZSwgX2ZpZWxkVmFsLCBwcm9wLmJ5cGFzcywgZmxhdFByb3BNYXBwaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZsYXRQcm9wKSB7XG4gICAgICAgICAgLy8gaWYgd2UgY2FuJ3QgZmxhdHRlbiB0aGUgcHJvcGVydHksIHRoZW4gZG9uJ3QgYXBwbHkgYW5kIGZhbGwgYmFjayBvbiB0aGUgZXhpc3Rpbmcgc3R5bGVcbiAgICAgICAgICBwcmludE1hcHBpbmdFcnIoKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZmxhdFByb3AubWFwcGluZyA9IHByb3A7IC8vIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIG1hcHBpbmdcbiAgICAgICAgcHJvcCA9IGZsYXRQcm9wOyAvLyB0aGUgZmxhdHRlbmVkIChtYXBwZWQpIHByb3BlcnR5IGlzIHRoZSBvbmUgd2Ugd2FudFxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNhc2UgdHlwZXMuZm46XG4gICAgICB7XG4gICAgICAgIHZhciBmbiA9IHByb3AudmFsdWU7XG4gICAgICAgIHZhciBmblJldFZhbCA9IHByb3AuZm5WYWx1ZSAhPSBudWxsID8gcHJvcC5mblZhbHVlIDogZm4oZWxlKTsgLy8gY2hlY2sgZm9yIGNhY2hlZCB2YWx1ZSBiZWZvcmUgY2FsbGluZyBmdW5jdGlvblxuXG4gICAgICAgIHByb3AucHJldkZuVmFsdWUgPSBmblJldFZhbDtcbiAgICAgICAgaWYgKGZuUmV0VmFsID09IG51bGwpIHtcbiAgICAgICAgICB3YXJuKCdDdXN0b20gZnVuY3Rpb24gbWFwcGVycyBtYXkgbm90IHJldHVybiBudWxsIChpLmUuIGAnICsgcHJvcC5uYW1lICsgJ2AgZm9yIGVsZSBgJyArIGVsZS5pZCgpICsgJ2AgaXMgbnVsbCknKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZmxhdFByb3AgPSB0aGlzLnBhcnNlKHByb3AubmFtZSwgZm5SZXRWYWwsIHByb3AuYnlwYXNzLCBmbGF0UHJvcE1hcHBpbmcpO1xuICAgICAgICBpZiAoIWZsYXRQcm9wKSB7XG4gICAgICAgICAgd2FybignQ3VzdG9tIGZ1bmN0aW9uIG1hcHBlcnMgbWF5IG5vdCByZXR1cm4gaW52YWxpZCB2YWx1ZXMgZm9yIHRoZSBwcm9wZXJ0eSB0eXBlIChpLmUuIGAnICsgcHJvcC5uYW1lICsgJ2AgZm9yIGVsZSBgJyArIGVsZS5pZCgpICsgJ2AgaXMgaW52YWxpZCknKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZmxhdFByb3AubWFwcGluZyA9IGNvcHkocHJvcCk7IC8vIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIG1hcHBpbmdcbiAgICAgICAgcHJvcCA9IGZsYXRQcm9wOyAvLyB0aGUgZmxhdHRlbmVkIChtYXBwZWQpIHByb3BlcnR5IGlzIHRoZSBvbmUgd2Ugd2FudFxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgYnJlYWs7XG4gICAgLy8ganVzdCBzZXQgdGhlIHByb3BlcnR5XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIC8vIG5vdCBhIHZhbGlkIG1hcHBpbmdcbiAgfVxuXG4gIC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBhIGJ5cGFzcyBwcm9wZXJ0eSwgdGhlbiBsaW5rIHRoZSByZXN1bHRhbnQgcHJvcGVydHkgdG8gdGhlIG9yaWdpbmFsIG9uZVxuICBpZiAocHJvcElzQnlwYXNzKSB7XG4gICAgaWYgKG9yaWdQcm9wSXNCeXBhc3MpIHtcbiAgICAgIC8vIHRoZW4gdGhpcyBieXBhc3Mgb3ZlcnJpZGVzIHRoZSBleGlzdGluZyBvbmVcbiAgICAgIHByb3AuYnlwYXNzZWQgPSBvcmlnUHJvcC5ieXBhc3NlZDsgLy8gc3RlYWwgYnlwYXNzZWQgcHJvcCBmcm9tIG9sZCBieXBhc3NcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhlbiBsaW5rIHRoZSBvcmlnIHByb3AgdG8gdGhlIG5ldyBieXBhc3NcbiAgICAgIHByb3AuYnlwYXNzZWQgPSBvcmlnUHJvcDtcbiAgICB9XG4gICAgc3R5bGVbcHJvcC5uYW1lXSA9IHByb3A7IC8vIGFuZCBzZXRcbiAgfSBlbHNlIHtcbiAgICAvLyBwcm9wIGlzIG5vdCBieXBhc3NcbiAgICBpZiAob3JpZ1Byb3BJc0J5cGFzcykge1xuICAgICAgLy8gdGhlbiBrZWVwIHRoZSBvcmlnIHByb3AgKHNpbmNlIGl0J3MgYSBieXBhc3MpIGFuZCBsaW5rIHRvIHRoZSBuZXcgcHJvcFxuICAgICAgb3JpZ1Byb3AuYnlwYXNzZWQgPSBwcm9wO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGVuIGp1c3QgcmVwbGFjZSB0aGUgb2xkIHByb3Agd2l0aCB0aGUgbmV3IG9uZVxuICAgICAgc3R5bGVbcHJvcC5uYW1lXSA9IHByb3A7XG4gICAgfVxuICB9XG4gIGNoZWNrVHJpZ2dlcnMoKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuc3R5Zm4kOC5jbGVhbkVsZW1lbnRzID0gZnVuY3Rpb24gKGVsZXMsIGtlZXBCeXBhc3Nlcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICB0aGlzLmNsZWFyU3R5bGVIaW50cyhlbGUpO1xuICAgIGVsZS5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUoKTtcbiAgICBlbGUuZGlydHlCb3VuZGluZ0JveENhY2hlKCk7XG4gICAgaWYgKCFrZWVwQnlwYXNzZXMpIHtcbiAgICAgIGVsZS5fcHJpdmF0ZS5zdHlsZSA9IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc3R5bGUgPSBlbGUuX3ByaXZhdGUuc3R5bGU7XG4gICAgICB2YXIgcHJvcE5hbWVzID0gT2JqZWN0LmtleXMoc3R5bGUpO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wTmFtZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIHByb3BOYW1lID0gcHJvcE5hbWVzW2pdO1xuICAgICAgICB2YXIgZWxlUHJvcCA9IHN0eWxlW3Byb3BOYW1lXTtcbiAgICAgICAgaWYgKGVsZVByb3AgIT0gbnVsbCkge1xuICAgICAgICAgIGlmIChlbGVQcm9wLmJ5cGFzcykge1xuICAgICAgICAgICAgZWxlUHJvcC5ieXBhc3NlZCA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlW3Byb3BOYW1lXSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG4vLyB1cGRhdGVzIHRoZSB2aXN1YWwgc3R5bGUgZm9yIGFsbCBlbGVtZW50cyAodXNlZnVsIGZvciBtYW51YWwgc3R5bGUgbW9kaWZpY2F0aW9uIGFmdGVyIGluaXQpXG5zdHlmbiQ4LnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgdmFyIGVsZXMgPSBjeS5tdXRhYmxlRWxlbWVudHMoKTtcbiAgZWxlcy51cGRhdGVTdHlsZSgpO1xufTtcblxuLy8gZGlmZlByb3BzIDogeyBuYW1lID0+IHsgcHJldiwgbmV4dCB9IH1cbnN0eWZuJDgudXBkYXRlVHJhbnNpdGlvbnMgPSBmdW5jdGlvbiAoZWxlLCBkaWZmUHJvcHMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBwcm9wcyA9IGVsZS5wc3R5bGUoJ3RyYW5zaXRpb24tcHJvcGVydHknKS52YWx1ZTtcbiAgdmFyIGR1cmF0aW9uID0gZWxlLnBzdHlsZSgndHJhbnNpdGlvbi1kdXJhdGlvbicpLnBmVmFsdWU7XG4gIHZhciBkZWxheSA9IGVsZS5wc3R5bGUoJ3RyYW5zaXRpb24tZGVsYXknKS5wZlZhbHVlO1xuICBpZiAocHJvcHMubGVuZ3RoID4gMCAmJiBkdXJhdGlvbiA+IDApIHtcbiAgICB2YXIgc3R5bGUgPSB7fTtcblxuICAgIC8vIGJ1aWxkIHVwIHRoZSBzdHlsZSB0byBhbmltYXRlIHRvd2FyZHNcbiAgICB2YXIgYW55UHJldiA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gcHJvcHNbaV07XG4gICAgICB2YXIgc3R5UHJvcCA9IGVsZS5wc3R5bGUocHJvcCk7XG4gICAgICB2YXIgZGlmZlByb3AgPSBkaWZmUHJvcHNbcHJvcF07XG4gICAgICBpZiAoIWRpZmZQcm9wKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIHByZXZQcm9wID0gZGlmZlByb3AucHJldjtcbiAgICAgIHZhciBmcm9tUHJvcCA9IHByZXZQcm9wO1xuICAgICAgdmFyIHRvUHJvcCA9IGRpZmZQcm9wLm5leHQgIT0gbnVsbCA/IGRpZmZQcm9wLm5leHQgOiBzdHlQcm9wO1xuICAgICAgdmFyIGRpZmYgPSBmYWxzZTtcbiAgICAgIHZhciBpbml0VmFsID0gdm9pZCAwO1xuICAgICAgdmFyIGluaXREdCA9IDAuMDAwMDAxOyAvLyBkZWx0YSB0aW1lICUgdmFsdWUgZm9yIGluaXRWYWwgKGFsbG93cyBhbmltYXRpbmcgb3V0IG9mIGluaXQgemVybyBvcGFjaXR5KVxuXG4gICAgICBpZiAoIWZyb21Qcm9wKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zaWRlciBweCB2YWx1ZXNcbiAgICAgIGlmIChudW1iZXIkMShmcm9tUHJvcC5wZlZhbHVlKSAmJiBudW1iZXIkMSh0b1Byb3AucGZWYWx1ZSkpIHtcbiAgICAgICAgZGlmZiA9IHRvUHJvcC5wZlZhbHVlIC0gZnJvbVByb3AucGZWYWx1ZTsgLy8gbm9uemVybyBpcyB0cnV0aHlcbiAgICAgICAgaW5pdFZhbCA9IGZyb21Qcm9wLnBmVmFsdWUgKyBpbml0RHQgKiBkaWZmO1xuXG4gICAgICAgIC8vIGNvbnNpZGVyIG51bWVyaWNhbCB2YWx1ZXNcbiAgICAgIH0gZWxzZSBpZiAobnVtYmVyJDEoZnJvbVByb3AudmFsdWUpICYmIG51bWJlciQxKHRvUHJvcC52YWx1ZSkpIHtcbiAgICAgICAgZGlmZiA9IHRvUHJvcC52YWx1ZSAtIGZyb21Qcm9wLnZhbHVlOyAvLyBub256ZXJvIGlzIHRydXRoeVxuICAgICAgICBpbml0VmFsID0gZnJvbVByb3AudmFsdWUgKyBpbml0RHQgKiBkaWZmO1xuXG4gICAgICAgIC8vIGNvbnNpZGVyIGNvbG91ciB2YWx1ZXNcbiAgICAgIH0gZWxzZSBpZiAoYXJyYXkoZnJvbVByb3AudmFsdWUpICYmIGFycmF5KHRvUHJvcC52YWx1ZSkpIHtcbiAgICAgICAgZGlmZiA9IGZyb21Qcm9wLnZhbHVlWzBdICE9PSB0b1Byb3AudmFsdWVbMF0gfHwgZnJvbVByb3AudmFsdWVbMV0gIT09IHRvUHJvcC52YWx1ZVsxXSB8fCBmcm9tUHJvcC52YWx1ZVsyXSAhPT0gdG9Qcm9wLnZhbHVlWzJdO1xuICAgICAgICBpbml0VmFsID0gZnJvbVByb3Auc3RyVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHRoZSBwcmV2aW91cyB2YWx1ZSBpcyBnb29kIGZvciBhbiBhbmltYXRpb24gb25seSBpZiBpdCdzIGRpZmZlcmVudFxuICAgICAgaWYgKGRpZmYpIHtcbiAgICAgICAgc3R5bGVbcHJvcF0gPSB0b1Byb3Auc3RyVmFsdWU7IC8vIHRvIHZhbFxuICAgICAgICB0aGlzLmFwcGx5QnlwYXNzKGVsZSwgcHJvcCwgaW5pdFZhbCk7IC8vIGZyb20gdmFsXG4gICAgICAgIGFueVByZXYgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gLy8gZW5kIGlmIHByb3BzIGFsbG93IGFuaVxuXG4gICAgLy8gY2FuJ3QgdHJhbnNpdGlvbiBpZiB0aGVyZSdzIG5vdGhpbmcgcHJldmlvdXMgdG8gdHJhbnNpdGlvbiBmcm9tXG4gICAgaWYgKCFhbnlQcmV2KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIF9wLnRyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgIG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgICAgZWxlLmRlbGF5QW5pbWF0aW9uKGRlbGF5KS5wbGF5KCkucHJvbWlzZSgpLnRoZW4ocmVzb2x2ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZWxlLmFuaW1hdGlvbih7XG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICBlYXNpbmc6IGVsZS5wc3R5bGUoJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJykudmFsdWUsXG4gICAgICAgIHF1ZXVlOiBmYWxzZVxuICAgICAgfSkucGxheSgpLnByb21pc2UoKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGlmKCAhaXNCeXBhc3MgKXtcbiAgICAgIHNlbGYucmVtb3ZlQnlwYXNzZXMoZWxlLCBwcm9wcyk7XG4gICAgICBlbGUuZW1pdEFuZE5vdGlmeSgnc3R5bGUnKTtcbiAgICAgIC8vIH1cblxuICAgICAgX3AudHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKF9wLnRyYW5zaXRpb25pbmcpIHtcbiAgICB0aGlzLnJlbW92ZUJ5cGFzc2VzKGVsZSwgcHJvcHMpO1xuICAgIGVsZS5lbWl0QW5kTm90aWZ5KCdzdHlsZScpO1xuICAgIF9wLnRyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgfVxufTtcbnN0eWZuJDguY2hlY2tUcmlnZ2VyID0gZnVuY3Rpb24gKGVsZSwgbmFtZSwgZnJvbVZhbHVlLCB0b1ZhbHVlLCBnZXRUcmlnZ2VyLCBvblRyaWdnZXIpIHtcbiAgdmFyIHByb3AgPSB0aGlzLnByb3BlcnRpZXNbbmFtZV07XG4gIHZhciB0cmlnZ2VyQ2hlY2sgPSBnZXRUcmlnZ2VyKHByb3ApO1xuICBpZiAodHJpZ2dlckNoZWNrICE9IG51bGwgJiYgdHJpZ2dlckNoZWNrKGZyb21WYWx1ZSwgdG9WYWx1ZSkpIHtcbiAgICBvblRyaWdnZXIocHJvcCk7XG4gIH1cbn07XG5zdHlmbiQ4LmNoZWNrWk9yZGVyVHJpZ2dlciA9IGZ1bmN0aW9uIChlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICB0aGlzLmNoZWNrVHJpZ2dlcihlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSwgZnVuY3Rpb24gKHByb3ApIHtcbiAgICByZXR1cm4gcHJvcC50cmlnZ2Vyc1pPcmRlcjtcbiAgfSwgZnVuY3Rpb24gKCkge1xuICAgIF90aGlzLl9wcml2YXRlLmN5Lm5vdGlmeSgnem9yZGVyJywgZWxlKTtcbiAgfSk7XG59O1xuc3R5Zm4kOC5jaGVja0JvdW5kc1RyaWdnZXIgPSBmdW5jdGlvbiAoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUpIHtcbiAgdGhpcy5jaGVja1RyaWdnZXIoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUsIGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgcmV0dXJuIHByb3AudHJpZ2dlcnNCb3VuZHM7XG4gIH0sIGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgZWxlLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpO1xuICAgIGVsZS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcblxuICAgIC8vIGlmIHRoZSBwcm9wIGNoYW5nZSBtYWtlcyB0aGUgYmIgb2YgcGxsIGJlemllciBlZGdlcyBpbnZhbGlkLFxuICAgIC8vIHRoZW4gZGlydHkgdGhlIHBsbCBlZGdlIGJiIGNhY2hlIGFzIHdlbGxcbiAgICBpZiAoXG4gICAgLy8gb25seSBmb3IgYmV6aWVycyAtLSBzbyBwZXJmb3JtYW5jZSBvZiBvdGhlciBlZGdlcyBpc24ndCBhZmZlY3RlZFxuICAgIHByb3AudHJpZ2dlcnNCb3VuZHNPZlBhcmFsbGVsQmV6aWVycyAmJiAobmFtZSA9PT0gJ2N1cnZlLXN0eWxlJyAmJiAoZnJvbVZhbHVlID09PSAnYmV6aWVyJyB8fCB0b1ZhbHVlID09PSAnYmV6aWVyJykgfHwgbmFtZSA9PT0gJ2Rpc3BsYXknICYmIChmcm9tVmFsdWUgPT09ICdub25lJyB8fCB0b1ZhbHVlID09PSAnbm9uZScpKSkge1xuICAgICAgZWxlLnBhcmFsbGVsRWRnZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChwbGxFZGdlKSB7XG4gICAgICAgIGlmIChwbGxFZGdlLmlzQnVuZGxlZEJlemllcigpKSB7XG4gICAgICAgICAgcGxsRWRnZS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn07XG5zdHlmbiQ4LmNoZWNrVHJpZ2dlcnMgPSBmdW5jdGlvbiAoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUpIHtcbiAgZWxlLmRpcnR5U3R5bGVDYWNoZSgpO1xuICB0aGlzLmNoZWNrWk9yZGVyVHJpZ2dlcihlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSk7XG4gIHRoaXMuY2hlY2tCb3VuZHNUcmlnZ2VyKGVsZSwgbmFtZSwgZnJvbVZhbHVlLCB0b1ZhbHVlKTtcbn07XG5cbnZhciBzdHlmbiQ3ID0ge307XG5cbi8vIGJ5cGFzc2VzIGFyZSBhcHBsaWVkIHRvIGFuIGV4aXN0aW5nIHN0eWxlIG9uIGFuIGVsZW1lbnQsIGFuZCBqdXN0IHRhY2tlZCBvbiB0ZW1wb3JhcmlseVxuLy8gcmV0dXJucyB0cnVlIGlmZiBhcHBsaWNhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBmb3IgYXQgbGVhc3QgMSBzcGVjaWZpZWQgcHJvcGVydHlcbnN0eWZuJDcuYXBwbHlCeXBhc3MgPSBmdW5jdGlvbiAoZWxlcywgbmFtZSwgdmFsdWUsIHVwZGF0ZVRyYW5zaXRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHByb3BzID0gW107XG4gIHZhciBpc0J5cGFzcyA9IHRydWU7XG5cbiAgLy8gcHV0IGFsbCB0aGUgcHJvcGVydGllcyAoY2FuIHNwZWNpZnkgb25lIG9yIG1hbnkpIGluIGFuIGFycmF5IGFmdGVyIHBhcnNpbmcgdGhlbVxuICBpZiAobmFtZSA9PT0gJyonIHx8IG5hbWUgPT09ICcqKicpIHtcbiAgICAvLyBhcHBseSB0byBhbGwgcHJvcGVydHkgbmFtZXNcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcHJvcCA9IHNlbGYucHJvcGVydGllc1tpXTtcbiAgICAgICAgdmFyIF9uYW1lID0gcHJvcC5uYW1lO1xuICAgICAgICB2YXIgcGFyc2VkUHJvcCA9IHRoaXMucGFyc2UoX25hbWUsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgaWYgKHBhcnNlZFByb3ApIHtcbiAgICAgICAgICBwcm9wcy5wdXNoKHBhcnNlZFByb3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHN0cmluZyhuYW1lKSkge1xuICAgIC8vIHRoZW4gcGFyc2UgdGhlIHNpbmdsZSBwcm9wZXJ0eVxuICAgIHZhciBfcGFyc2VkUHJvcCA9IHRoaXMucGFyc2UobmFtZSwgdmFsdWUsIHRydWUpO1xuICAgIGlmIChfcGFyc2VkUHJvcCkge1xuICAgICAgcHJvcHMucHVzaChfcGFyc2VkUHJvcCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHBsYWluT2JqZWN0KG5hbWUpKSB7XG4gICAgLy8gdGhlbiBwYXJzZSBlYWNoIHByb3BlcnR5XG4gICAgdmFyIHNwZWNpZmllZFByb3BzID0gbmFtZTtcbiAgICB1cGRhdGVUcmFuc2l0aW9ucyA9IHZhbHVlO1xuICAgIHZhciBuYW1lcyA9IE9iamVjdC5rZXlzKHNwZWNpZmllZFByb3BzKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbmFtZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX25hbWUyID0gbmFtZXNbX2ldO1xuICAgICAgdmFyIF92YWx1ZSA9IHNwZWNpZmllZFByb3BzW19uYW1lMl07XG4gICAgICBpZiAoX3ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdHJ5IGNhbWVsIGNhc2UgbmFtZSB0b29cbiAgICAgICAgX3ZhbHVlID0gc3BlY2lmaWVkUHJvcHNbZGFzaDJjYW1lbChfbmFtZTIpXTtcbiAgICAgIH1cbiAgICAgIGlmIChfdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgX3BhcnNlZFByb3AyID0gdGhpcy5wYXJzZShfbmFtZTIsIF92YWx1ZSwgdHJ1ZSk7XG4gICAgICAgIGlmIChfcGFyc2VkUHJvcDIpIHtcbiAgICAgICAgICBwcm9wcy5wdXNoKF9wYXJzZWRQcm9wMik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gY2FuJ3QgZG8gYW55dGhpbmcgd2l0aG91dCB3ZWxsIGRlZmluZWQgcHJvcGVydGllc1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHdlJ3ZlIGZhaWxlZCBpZiB0aGVyZSBhcmUgbm8gdmFsaWQgcHJvcGVydGllc1xuICBpZiAocHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gbm93LCBhcHBseSB0aGUgYnlwYXNzIHByb3BlcnRpZXMgb24gdGhlIGVsZW1lbnRzXG4gIHZhciByZXQgPSBmYWxzZTsgLy8gcmV0dXJuIHRydWUgaWYgYXQgbGVhc3Qgb25lIHN1Y2Nlc2Z1bCBieXBhc3MgYXBwbGllZFxuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBlbGVzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAvLyBmb3IgZWFjaCBlbGVcbiAgICB2YXIgZWxlID0gZWxlc1tfaTJdO1xuICAgIHZhciBkaWZmUHJvcHMgPSB7fTtcbiAgICB2YXIgZGlmZlByb3AgPSB2b2lkIDA7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wcy5sZW5ndGg7IGorKykge1xuICAgICAgLy8gZm9yIGVhY2ggcHJvcFxuICAgICAgdmFyIF9wcm9wID0gcHJvcHNbal07XG4gICAgICBpZiAodXBkYXRlVHJhbnNpdGlvbnMpIHtcbiAgICAgICAgdmFyIHByZXZQcm9wID0gZWxlLnBzdHlsZShfcHJvcC5uYW1lKTtcbiAgICAgICAgZGlmZlByb3AgPSBkaWZmUHJvcHNbX3Byb3AubmFtZV0gPSB7XG4gICAgICAgICAgcHJldjogcHJldlByb3BcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldCA9IHRoaXMuYXBwbHlQYXJzZWRQcm9wZXJ0eShlbGUsIGNvcHkoX3Byb3ApKSB8fCByZXQ7XG4gICAgICBpZiAodXBkYXRlVHJhbnNpdGlvbnMpIHtcbiAgICAgICAgZGlmZlByb3AubmV4dCA9IGVsZS5wc3R5bGUoX3Byb3AubmFtZSk7XG4gICAgICB9XG4gICAgfSAvLyBmb3IgcHJvcHNcblxuICAgIGlmIChyZXQpIHtcbiAgICAgIHRoaXMudXBkYXRlU3R5bGVIaW50cyhlbGUpO1xuICAgIH1cbiAgICBpZiAodXBkYXRlVHJhbnNpdGlvbnMpIHtcbiAgICAgIHRoaXMudXBkYXRlVHJhbnNpdGlvbnMoZWxlLCBkaWZmUHJvcHMsIGlzQnlwYXNzKTtcbiAgICB9XG4gIH0gLy8gZm9yIGVsZXNcblxuICByZXR1cm4gcmV0O1xufTtcblxuLy8gb25seSB1c2VmdWwgaW4gc3BlY2lmaWMgY2FzZXMgbGlrZSBhbmltYXRpb25cbnN0eWZuJDcub3ZlcnJpZGVCeXBhc3MgPSBmdW5jdGlvbiAoZWxlcywgbmFtZSwgdmFsdWUpIHtcbiAgbmFtZSA9IGNhbWVsMmRhc2gobmFtZSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHZhciBwcm9wID0gZWxlLl9wcml2YXRlLnN0eWxlW25hbWVdO1xuICAgIHZhciB0eXBlID0gdGhpcy5wcm9wZXJ0aWVzW25hbWVdLnR5cGU7XG4gICAgdmFyIGlzQ29sb3IgPSB0eXBlLmNvbG9yO1xuICAgIHZhciBpc011bHRpID0gdHlwZS5tdXRpcGxlO1xuICAgIHZhciBvbGRWYWx1ZSA9ICFwcm9wID8gbnVsbCA6IHByb3AucGZWYWx1ZSAhPSBudWxsID8gcHJvcC5wZlZhbHVlIDogcHJvcC52YWx1ZTtcbiAgICBpZiAoIXByb3AgfHwgIXByb3AuYnlwYXNzKSB7XG4gICAgICAvLyBuZWVkIGEgYnlwYXNzIGlmIG9uZSBkb2Vzbid0IGV4aXN0XG4gICAgICB0aGlzLmFwcGx5QnlwYXNzKGVsZSwgbmFtZSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wLnZhbHVlID0gdmFsdWU7XG4gICAgICBpZiAocHJvcC5wZlZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgcHJvcC5wZlZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNDb2xvcikge1xuICAgICAgICBwcm9wLnN0clZhbHVlID0gJ3JnYignICsgdmFsdWUuam9pbignLCcpICsgJyknO1xuICAgICAgfSBlbHNlIGlmIChpc011bHRpKSB7XG4gICAgICAgIHByb3Auc3RyVmFsdWUgPSB2YWx1ZS5qb2luKCcgJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9wLnN0clZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlU3R5bGVIaW50cyhlbGUpO1xuICAgIH1cbiAgICB0aGlzLmNoZWNrVHJpZ2dlcnMoZWxlLCBuYW1lLCBvbGRWYWx1ZSwgdmFsdWUpO1xuICB9XG59O1xuc3R5Zm4kNy5yZW1vdmVBbGxCeXBhc3NlcyA9IGZ1bmN0aW9uIChlbGVzLCB1cGRhdGVUcmFuc2l0aW9ucykge1xuICByZXR1cm4gdGhpcy5yZW1vdmVCeXBhc3NlcyhlbGVzLCB0aGlzLnByb3BlcnR5TmFtZXMsIHVwZGF0ZVRyYW5zaXRpb25zKTtcbn07XG5zdHlmbiQ3LnJlbW92ZUJ5cGFzc2VzID0gZnVuY3Rpb24gKGVsZXMsIHByb3BzLCB1cGRhdGVUcmFuc2l0aW9ucykge1xuICB2YXIgaXNCeXBhc3MgPSB0cnVlO1xuICBmb3IgKHZhciBqID0gMDsgaiA8IGVsZXMubGVuZ3RoOyBqKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tqXTtcbiAgICB2YXIgZGlmZlByb3BzID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBwcm9wc1tpXTtcbiAgICAgIHZhciBwcm9wID0gdGhpcy5wcm9wZXJ0aWVzW25hbWVdO1xuICAgICAgdmFyIHByZXZQcm9wID0gZWxlLnBzdHlsZShwcm9wLm5hbWUpO1xuICAgICAgaWYgKCFwcmV2UHJvcCB8fCAhcHJldlByb3AuYnlwYXNzKSB7XG4gICAgICAgIC8vIGlmIGEgYnlwYXNzIGRvZXNuJ3QgZXhpc3QgZm9yIHRoZSBwcm9wLCBub3RoaW5nIG5lZWRzIHRvIGJlIHJlbW92ZWRcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWUgPSAnJzsgLy8gZW1wdHkgPT4gcmVtb3ZlIGJ5cGFzc1xuICAgICAgdmFyIHBhcnNlZFByb3AgPSB0aGlzLnBhcnNlKG5hbWUsIHZhbHVlLCB0cnVlKTtcbiAgICAgIHZhciBkaWZmUHJvcCA9IGRpZmZQcm9wc1twcm9wLm5hbWVdID0ge1xuICAgICAgICBwcmV2OiBwcmV2UHJvcFxuICAgICAgfTtcbiAgICAgIHRoaXMuYXBwbHlQYXJzZWRQcm9wZXJ0eShlbGUsIHBhcnNlZFByb3ApO1xuICAgICAgZGlmZlByb3AubmV4dCA9IGVsZS5wc3R5bGUocHJvcC5uYW1lKTtcbiAgICB9IC8vIGZvciBwcm9wc1xuXG4gICAgdGhpcy51cGRhdGVTdHlsZUhpbnRzKGVsZSk7XG4gICAgaWYgKHVwZGF0ZVRyYW5zaXRpb25zKSB7XG4gICAgICB0aGlzLnVwZGF0ZVRyYW5zaXRpb25zKGVsZSwgZGlmZlByb3BzLCBpc0J5cGFzcyk7XG4gICAgfVxuICB9IC8vIGZvciBlbGVzXG59O1xuXG52YXIgc3R5Zm4kNiA9IHt9O1xuXG4vLyBnZXRzIHdoYXQgYW4gZW0gc2l6ZSBjb3JyZXNwb25kcyB0byBpbiBwaXhlbHMgcmVsYXRpdmUgdG8gYSBkb20gZWxlbWVudFxuc3R5Zm4kNi5nZXRFbVNpemVJblBpeGVscyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHB4ID0gdGhpcy5jb250YWluZXJDc3MoJ2ZvbnQtc2l6ZScpO1xuICBpZiAocHggIT0gbnVsbCkge1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHB4KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMTsgLy8gZm9yIGhlYWRsZXNzXG4gIH1cbn07XG5cbi8vIGdldHMgY3NzIHByb3BlcnR5IGZyb20gdGhlIGNvcmUgY29udGFpbmVyXG5zdHlmbiQ2LmNvbnRhaW5lckNzcyA9IGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICB2YXIgZG9tRWxlbWVudCA9IGN5LmNvbnRhaW5lcigpO1xuICB2YXIgY29udGFpbmVyV2luZG93ID0gY3kud2luZG93KCk7XG4gIGlmIChjb250YWluZXJXaW5kb3cgJiYgZG9tRWxlbWVudCAmJiBjb250YWluZXJXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSkge1xuICAgIHJldHVybiBjb250YWluZXJXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb21FbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKHByb3BOYW1lKTtcbiAgfVxufTtcblxudmFyIHN0eWZuJDUgPSB7fTtcblxuLy8gZ2V0cyB0aGUgcmVuZGVyZWQgc3R5bGUgZm9yIGFuIGVsZW1lbnRcbnN0eWZuJDUuZ2V0UmVuZGVyZWRTdHlsZSA9IGZ1bmN0aW9uIChlbGUsIHByb3ApIHtcbiAgaWYgKHByb3ApIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHlsZVByb3BlcnR5VmFsdWUoZWxlLCBwcm9wLCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSYXdTdHlsZShlbGUsIHRydWUpO1xuICB9XG59O1xuXG4vLyBnZXRzIHRoZSByYXcgc3R5bGUgZm9yIGFuIGVsZW1lbnRcbnN0eWZuJDUuZ2V0UmF3U3R5bGUgPSBmdW5jdGlvbiAoZWxlLCBpc1JlbmRlcmVkVmFsKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgZWxlID0gZWxlWzBdOyAvLyBpbnN1cmUgaXQncyBhbiBlbGVtZW50XG5cbiAgaWYgKGVsZSkge1xuICAgIHZhciByc3R5bGUgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBzZWxmLnByb3BlcnRpZXNbaV07XG4gICAgICB2YXIgdmFsID0gc2VsZi5nZXRTdHlsZVByb3BlcnR5VmFsdWUoZWxlLCBwcm9wLm5hbWUsIGlzUmVuZGVyZWRWYWwpO1xuICAgICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICAgIHJzdHlsZVtwcm9wLm5hbWVdID0gdmFsO1xuICAgICAgICByc3R5bGVbZGFzaDJjYW1lbChwcm9wLm5hbWUpXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJzdHlsZTtcbiAgfVxufTtcbnN0eWZuJDUuZ2V0SW5kZXhlZFN0eWxlID0gZnVuY3Rpb24gKGVsZSwgcHJvcGVydHksIHN1YnByb3BlcnR5LCBpbmRleCkge1xuICB2YXIgcHN0eWxlID0gZWxlLnBzdHlsZShwcm9wZXJ0eSlbc3VicHJvcGVydHldW2luZGV4XTtcbiAgcmV0dXJuIHBzdHlsZSAhPSBudWxsID8gcHN0eWxlIDogZWxlLmN5KCkuc3R5bGUoKS5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHkpW3N1YnByb3BlcnR5XVswXTtcbn07XG5zdHlmbiQ1LmdldFN0eWxlUHJvcGVydHlWYWx1ZSA9IGZ1bmN0aW9uIChlbGUsIHByb3BOYW1lLCBpc1JlbmRlcmVkVmFsKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgZWxlID0gZWxlWzBdOyAvLyBpbnN1cmUgaXQncyBhbiBlbGVtZW50XG5cbiAgaWYgKGVsZSkge1xuICAgIHZhciBwcm9wID0gc2VsZi5wcm9wZXJ0aWVzW3Byb3BOYW1lXTtcbiAgICBpZiAocHJvcC5hbGlhcykge1xuICAgICAgcHJvcCA9IHByb3AucG9pbnRzVG87XG4gICAgfVxuICAgIHZhciB0eXBlID0gcHJvcC50eXBlO1xuICAgIHZhciBzdHlsZVByb3AgPSBlbGUucHN0eWxlKHByb3AubmFtZSk7XG4gICAgaWYgKHN0eWxlUHJvcCkge1xuICAgICAgdmFyIHZhbHVlID0gc3R5bGVQcm9wLnZhbHVlLFxuICAgICAgICB1bml0cyA9IHN0eWxlUHJvcC51bml0cyxcbiAgICAgICAgc3RyVmFsdWUgPSBzdHlsZVByb3Auc3RyVmFsdWU7XG4gICAgICBpZiAoaXNSZW5kZXJlZFZhbCAmJiB0eXBlLm51bWJlciAmJiB2YWx1ZSAhPSBudWxsICYmIG51bWJlciQxKHZhbHVlKSkge1xuICAgICAgICB2YXIgem9vbSA9IGVsZS5jeSgpLnpvb20oKTtcbiAgICAgICAgdmFyIGdldFJlbmRlcmVkVmFsdWUgPSBmdW5jdGlvbiBnZXRSZW5kZXJlZFZhbHVlKHZhbCkge1xuICAgICAgICAgIHJldHVybiB2YWwgKiB6b29tO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgZ2V0VmFsdWVTdHJpbmdXaXRoVW5pdHMgPSBmdW5jdGlvbiBnZXRWYWx1ZVN0cmluZ1dpdGhVbml0cyh2YWwsIHVuaXRzKSB7XG4gICAgICAgICAgcmV0dXJuIGdldFJlbmRlcmVkVmFsdWUodmFsKSArIHVuaXRzO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgaXNBcnJheVZhbHVlID0gYXJyYXkodmFsdWUpO1xuICAgICAgICB2YXIgaGF2ZVVuaXRzID0gaXNBcnJheVZhbHVlID8gdW5pdHMuZXZlcnkoZnVuY3Rpb24gKHUpIHtcbiAgICAgICAgICByZXR1cm4gdSAhPSBudWxsO1xuICAgICAgICB9KSA6IHVuaXRzICE9IG51bGw7XG4gICAgICAgIGlmIChoYXZlVW5pdHMpIHtcbiAgICAgICAgICBpZiAoaXNBcnJheVZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKGZ1bmN0aW9uICh2LCBpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZVN0cmluZ1dpdGhVbml0cyh2LCB1bml0c1tpXSk7XG4gICAgICAgICAgICB9KS5qb2luKCcgJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZVN0cmluZ1dpdGhVbml0cyh2YWx1ZSwgdW5pdHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaXNBcnJheVZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgIHJldHVybiBzdHJpbmcodikgPyB2IDogJycgKyBnZXRSZW5kZXJlZFZhbHVlKHYpO1xuICAgICAgICAgICAgfSkuam9pbignICcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJycgKyBnZXRSZW5kZXJlZFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RyVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3RyVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuc3R5Zm4kNS5nZXRBbmltYXRpb25TdGFydFN0eWxlID0gZnVuY3Rpb24gKGVsZSwgYW5pUHJvcHMpIHtcbiAgdmFyIHJzdHlsZSA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFuaVByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGFuaVByb3AgPSBhbmlQcm9wc1tpXTtcbiAgICB2YXIgbmFtZSA9IGFuaVByb3AubmFtZTtcbiAgICB2YXIgc3R5bGVQcm9wID0gZWxlLnBzdHlsZShuYW1lKTtcbiAgICBpZiAoc3R5bGVQcm9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIHRoZW4gbWFrZSBhIHByb3Agb2YgaXRcbiAgICAgIGlmIChwbGFpbk9iamVjdChzdHlsZVByb3ApKSB7XG4gICAgICAgIHN0eWxlUHJvcCA9IHRoaXMucGFyc2UobmFtZSwgc3R5bGVQcm9wLnN0clZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0eWxlUHJvcCA9IHRoaXMucGFyc2UobmFtZSwgc3R5bGVQcm9wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0eWxlUHJvcCkge1xuICAgICAgcnN0eWxlW25hbWVdID0gc3R5bGVQcm9wO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcnN0eWxlO1xufTtcbnN0eWZuJDUuZ2V0UHJvcHNMaXN0ID0gZnVuY3Rpb24gKHByb3BzT2JqKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHJzdHlsZSA9IFtdO1xuICB2YXIgc3R5bGUgPSBwcm9wc09iajtcbiAgdmFyIHByb3BzID0gc2VsZi5wcm9wZXJ0aWVzO1xuICBpZiAoc3R5bGUpIHtcbiAgICB2YXIgbmFtZXMgPSBPYmplY3Qua2V5cyhzdHlsZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgIHZhciB2YWwgPSBzdHlsZVtuYW1lXTtcbiAgICAgIHZhciBwcm9wID0gcHJvcHNbbmFtZV0gfHwgcHJvcHNbY2FtZWwyZGFzaChuYW1lKV07XG4gICAgICB2YXIgc3R5bGVQcm9wID0gdGhpcy5wYXJzZShwcm9wLm5hbWUsIHZhbCk7XG4gICAgICBpZiAoc3R5bGVQcm9wKSB7XG4gICAgICAgIHJzdHlsZS5wdXNoKHN0eWxlUHJvcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByc3R5bGU7XG59O1xuc3R5Zm4kNS5nZXROb25EZWZhdWx0UHJvcGVydGllc0hhc2ggPSBmdW5jdGlvbiAoZWxlLCBwcm9wTmFtZXMsIHNlZWQpIHtcbiAgdmFyIGhhc2ggPSBzZWVkLnNsaWNlKCk7XG4gIHZhciBuYW1lLCB2YWwsIHN0clZhbCwgY2hWYWw7XG4gIHZhciBpLCBqO1xuICBmb3IgKGkgPSAwOyBpIDwgcHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbmFtZSA9IHByb3BOYW1lc1tpXTtcbiAgICB2YWwgPSBlbGUucHN0eWxlKG5hbWUsIGZhbHNlKTtcbiAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAodmFsLnBmVmFsdWUgIT0gbnVsbCkge1xuICAgICAgaGFzaFswXSA9IGhhc2hJbnQoY2hWYWwsIGhhc2hbMF0pO1xuICAgICAgaGFzaFsxXSA9IGhhc2hJbnRBbHQoY2hWYWwsIGhhc2hbMV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHJWYWwgPSB2YWwuc3RyVmFsdWU7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgc3RyVmFsLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNoVmFsID0gc3RyVmFsLmNoYXJDb2RlQXQoaik7XG4gICAgICAgIGhhc2hbMF0gPSBoYXNoSW50KGNoVmFsLCBoYXNoWzBdKTtcbiAgICAgICAgaGFzaFsxXSA9IGhhc2hJbnRBbHQoY2hWYWwsIGhhc2hbMV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gaGFzaDtcbn07XG5zdHlmbiQ1LmdldFByb3BlcnRpZXNIYXNoID0gc3R5Zm4kNS5nZXROb25EZWZhdWx0UHJvcGVydGllc0hhc2g7XG5cbnZhciBzdHlmbiQ0ID0ge307XG5zdHlmbiQ0LmFwcGVuZEZyb21Kc29uID0gZnVuY3Rpb24gKGpzb24pIHtcbiAgdmFyIHN0eWxlID0gdGhpcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBqc29uLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNvbnRleHQgPSBqc29uW2ldO1xuICAgIHZhciBzZWxlY3RvciA9IGNvbnRleHQuc2VsZWN0b3I7XG4gICAgdmFyIHByb3BzID0gY29udGV4dC5zdHlsZSB8fCBjb250ZXh0LmNzcztcbiAgICB2YXIgbmFtZXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7XG4gICAgc3R5bGUuc2VsZWN0b3Ioc2VsZWN0b3IpOyAvLyBhcHBseSBzZWxlY3RvclxuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBuYW1lcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIG5hbWUgPSBuYW1lc1tqXTtcbiAgICAgIHZhciB2YWx1ZSA9IHByb3BzW25hbWVdO1xuICAgICAgc3R5bGUuY3NzKG5hbWUsIHZhbHVlKTsgLy8gYXBwbHkgcHJvcGVydHlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3R5bGU7XG59O1xuXG4vLyBhY2Nlc3NpYmxlIGN5LnN0eWxlKCkgZnVuY3Rpb25cbnN0eWZuJDQuZnJvbUpzb24gPSBmdW5jdGlvbiAoanNvbikge1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuICBzdHlsZS5yZXNldFRvRGVmYXVsdCgpO1xuICBzdHlsZS5hcHBlbmRGcm9tSnNvbihqc29uKTtcbiAgcmV0dXJuIHN0eWxlO1xufTtcblxuLy8gZ2V0IGpzb24gZnJvbSBjeS5zdHlsZSgpIGFwaVxuc3R5Zm4kNC5qc29uID0gZnVuY3Rpb24gKCkge1xuICB2YXIganNvbiA9IFtdO1xuICBmb3IgKHZhciBpID0gdGhpcy5kZWZhdWx0TGVuZ3RoOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjeHQgPSB0aGlzW2ldO1xuICAgIHZhciBzZWxlY3RvciA9IGN4dC5zZWxlY3RvcjtcbiAgICB2YXIgcHJvcHMgPSBjeHQucHJvcGVydGllcztcbiAgICB2YXIgY3NzID0ge307XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wc1tqXTtcbiAgICAgIGNzc1twcm9wLm5hbWVdID0gcHJvcC5zdHJWYWx1ZTtcbiAgICB9XG4gICAganNvbi5wdXNoKHtcbiAgICAgIHNlbGVjdG9yOiAhc2VsZWN0b3IgPyAnY29yZScgOiBzZWxlY3Rvci50b1N0cmluZygpLFxuICAgICAgc3R5bGU6IGNzc1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBqc29uO1xufTtcblxudmFyIHN0eWZuJDMgPSB7fTtcbnN0eWZuJDMuYXBwZW5kRnJvbVN0cmluZyA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuICB2YXIgcmVtYWluaW5nID0gJycgKyBzdHJpbmc7XG4gIHZhciBzZWxBbmRCbG9ja1N0cjtcbiAgdmFyIGJsb2NrUmVtO1xuICB2YXIgcHJvcEFuZFZhbFN0cjtcblxuICAvLyByZW1vdmUgY29tbWVudHMgZnJvbSB0aGUgc3R5bGUgc3RyaW5nXG4gIHJlbWFpbmluZyA9IHJlbWFpbmluZy5yZXBsYWNlKC9bL11bKl0oXFxzfC4pKz9bKl1bL10vZywgJycpO1xuICBmdW5jdGlvbiByZW1vdmVTZWxBbmRCbG9ja0Zyb21SZW1haW5pbmcoKSB7XG4gICAgLy8gcmVtb3ZlIHRoZSBwYXJzZWQgc2VsZWN0b3IgYW5kIGJsb2NrIGZyb20gdGhlIHJlbWFpbmluZyB0ZXh0IHRvIHBhcnNlXG4gICAgaWYgKHJlbWFpbmluZy5sZW5ndGggPiBzZWxBbmRCbG9ja1N0ci5sZW5ndGgpIHtcbiAgICAgIHJlbWFpbmluZyA9IHJlbWFpbmluZy5zdWJzdHIoc2VsQW5kQmxvY2tTdHIubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVtYWluaW5nID0gJyc7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHJlbW92ZVByb3BBbmRWYWxGcm9tUmVtKCkge1xuICAgIC8vIHJlbW92ZSB0aGUgcGFyc2VkIHByb3BlcnR5IGFuZCB2YWx1ZSBmcm9tIHRoZSByZW1haW5pbmcgYmxvY2sgdGV4dCB0byBwYXJzZVxuICAgIGlmIChibG9ja1JlbS5sZW5ndGggPiBwcm9wQW5kVmFsU3RyLmxlbmd0aCkge1xuICAgICAgYmxvY2tSZW0gPSBibG9ja1JlbS5zdWJzdHIocHJvcEFuZFZhbFN0ci5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBibG9ja1JlbSA9ICcnO1xuICAgIH1cbiAgfVxuICBmb3IgKDs7KSB7XG4gICAgdmFyIG5vdGhpbmdMZWZ0VG9QYXJzZSA9IHJlbWFpbmluZy5tYXRjaCgvXlxccyokLyk7XG4gICAgaWYgKG5vdGhpbmdMZWZ0VG9QYXJzZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBzZWxBbmRCbG9jayA9IHJlbWFpbmluZy5tYXRjaCgvXlxccyooKD86LnxcXHMpKz8pXFxzKlxceygoPzoufFxccykrPylcXH0vKTtcbiAgICBpZiAoIXNlbEFuZEJsb2NrKSB7XG4gICAgICB3YXJuKCdIYWx0aW5nIHN0eWxlc2hlZXQgcGFyc2luZzogU3RyaW5nIHN0eWxlc2hlZXQgY29udGFpbnMgbW9yZSB0byBwYXJzZSBidXQgbm8gc2VsZWN0b3IgYW5kIGJsb2NrIGZvdW5kIGluOiAnICsgcmVtYWluaW5nKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBzZWxBbmRCbG9ja1N0ciA9IHNlbEFuZEJsb2NrWzBdO1xuXG4gICAgLy8gcGFyc2UgdGhlIHNlbGVjdG9yXG4gICAgdmFyIHNlbGVjdG9yU3RyID0gc2VsQW5kQmxvY2tbMV07XG4gICAgaWYgKHNlbGVjdG9yU3RyICE9PSAnY29yZScpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IG5ldyBTZWxlY3RvcihzZWxlY3RvclN0cik7XG4gICAgICBpZiAoc2VsZWN0b3IuaW52YWxpZCkge1xuICAgICAgICB3YXJuKCdTa2lwcGluZyBwYXJzaW5nIG9mIGJsb2NrOiBJbnZhbGlkIHNlbGVjdG9yIGZvdW5kIGluIHN0cmluZyBzdHlsZXNoZWV0OiAnICsgc2VsZWN0b3JTdHIpO1xuXG4gICAgICAgIC8vIHNraXAgdGhpcyBzZWxlY3RvciBhbmQgYmxvY2tcbiAgICAgICAgcmVtb3ZlU2VsQW5kQmxvY2tGcm9tUmVtYWluaW5nKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHBhcnNlIHRoZSBibG9jayBvZiBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXNcbiAgICB2YXIgYmxvY2tTdHIgPSBzZWxBbmRCbG9ja1syXTtcbiAgICB2YXIgaW52YWxpZEJsb2NrID0gZmFsc2U7XG4gICAgYmxvY2tSZW0gPSBibG9ja1N0cjtcbiAgICB2YXIgcHJvcHMgPSBbXTtcbiAgICBmb3IgKDs7KSB7XG4gICAgICB2YXIgX25vdGhpbmdMZWZ0VG9QYXJzZSA9IGJsb2NrUmVtLm1hdGNoKC9eXFxzKiQvKTtcbiAgICAgIGlmIChfbm90aGluZ0xlZnRUb1BhcnNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BBbmRWYWwgPSBibG9ja1JlbS5tYXRjaCgvXlxccyooLis/KVxccyo6XFxzKiguKz8pKD86XFxzKjt8XFxzKiQpLyk7XG4gICAgICBpZiAoIXByb3BBbmRWYWwpIHtcbiAgICAgICAgd2FybignU2tpcHBpbmcgcGFyc2luZyBvZiBibG9jazogSW52YWxpZCBmb3JtYXR0aW5nIG9mIHN0eWxlIHByb3BlcnR5IGFuZCB2YWx1ZSBkZWZpbml0aW9ucyBmb3VuZCBpbjonICsgYmxvY2tTdHIpO1xuICAgICAgICBpbnZhbGlkQmxvY2sgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHByb3BBbmRWYWxTdHIgPSBwcm9wQW5kVmFsWzBdO1xuICAgICAgdmFyIHByb3BTdHIgPSBwcm9wQW5kVmFsWzFdO1xuICAgICAgdmFyIHZhbFN0ciA9IHByb3BBbmRWYWxbMl07XG4gICAgICB2YXIgcHJvcCA9IHNlbGYucHJvcGVydGllc1twcm9wU3RyXTtcbiAgICAgIGlmICghcHJvcCkge1xuICAgICAgICB3YXJuKCdTa2lwcGluZyBwcm9wZXJ0eTogSW52YWxpZCBwcm9wZXJ0eSBuYW1lIGluOiAnICsgcHJvcEFuZFZhbFN0cik7XG5cbiAgICAgICAgLy8gc2tpcCB0aGlzIHByb3BlcnR5IGluIHRoZSBibG9ja1xuICAgICAgICByZW1vdmVQcm9wQW5kVmFsRnJvbVJlbSgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBwYXJzZWRQcm9wID0gc3R5bGUucGFyc2UocHJvcFN0ciwgdmFsU3RyKTtcbiAgICAgIGlmICghcGFyc2VkUHJvcCkge1xuICAgICAgICB3YXJuKCdTa2lwcGluZyBwcm9wZXJ0eTogSW52YWxpZCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluOiAnICsgcHJvcEFuZFZhbFN0cik7XG5cbiAgICAgICAgLy8gc2tpcCB0aGlzIHByb3BlcnR5IGluIHRoZSBibG9ja1xuICAgICAgICByZW1vdmVQcm9wQW5kVmFsRnJvbVJlbSgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHByb3BzLnB1c2goe1xuICAgICAgICBuYW1lOiBwcm9wU3RyLFxuICAgICAgICB2YWw6IHZhbFN0clxuICAgICAgfSk7XG4gICAgICByZW1vdmVQcm9wQW5kVmFsRnJvbVJlbSgpO1xuICAgIH1cbiAgICBpZiAoaW52YWxpZEJsb2NrKSB7XG4gICAgICByZW1vdmVTZWxBbmRCbG9ja0Zyb21SZW1haW5pbmcoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIHB1dCB0aGUgcGFyc2VkIGJsb2NrIGluIHRoZSBzdHlsZVxuICAgIHN0eWxlLnNlbGVjdG9yKHNlbGVjdG9yU3RyKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgX3Byb3AgPSBwcm9wc1tpXTtcbiAgICAgIHN0eWxlLmNzcyhfcHJvcC5uYW1lLCBfcHJvcC52YWwpO1xuICAgIH1cbiAgICByZW1vdmVTZWxBbmRCbG9ja0Zyb21SZW1haW5pbmcoKTtcbiAgfVxuICByZXR1cm4gc3R5bGU7XG59O1xuc3R5Zm4kMy5mcm9tU3RyaW5nID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuICBzdHlsZS5yZXNldFRvRGVmYXVsdCgpO1xuICBzdHlsZS5hcHBlbmRGcm9tU3RyaW5nKHN0cmluZyk7XG4gIHJldHVybiBzdHlsZTtcbn07XG5cbnZhciBzdHlmbiQyID0ge307XG4oZnVuY3Rpb24gKCkge1xuICB2YXIgbnVtYmVyJDEgPSBudW1iZXI7XG4gIHZhciByZ2JhID0gcmdiYU5vQmFja1JlZnM7XG4gIHZhciBoc2xhID0gaHNsYU5vQmFja1JlZnM7XG4gIHZhciBoZXgzJDEgPSBoZXgzO1xuICB2YXIgaGV4NiQxID0gaGV4NjtcbiAgdmFyIGRhdGEgPSBmdW5jdGlvbiBkYXRhKHByZWZpeCkge1xuICAgIHJldHVybiAnXicgKyBwcmVmaXggKyAnXFxcXHMqXFxcXChcXFxccyooW1xcXFx3XFxcXC5dKylcXFxccypcXFxcKSQnO1xuICB9O1xuICB2YXIgbWFwRGF0YSA9IGZ1bmN0aW9uIG1hcERhdGEocHJlZml4KSB7XG4gICAgdmFyIG1hcEFyZyA9IG51bWJlciQxICsgJ3xcXFxcdyt8JyArIHJnYmEgKyAnfCcgKyBoc2xhICsgJ3wnICsgaGV4MyQxICsgJ3wnICsgaGV4NiQxO1xuICAgIHJldHVybiAnXicgKyBwcmVmaXggKyAnXFxcXHMqXFxcXCgoW1xcXFx3XFxcXC5dKylcXFxccypcXFxcLFxcXFxzKignICsgbnVtYmVyJDEgKyAnKVxcXFxzKlxcXFwsXFxcXHMqKCcgKyBudW1iZXIkMSArICcpXFxcXHMqLFxcXFxzKignICsgbWFwQXJnICsgJylcXFxccypcXFxcLFxcXFxzKignICsgbWFwQXJnICsgJylcXFxcKSQnO1xuICB9O1xuICB2YXIgdXJsUmVnZXhlcyA9IFsnXnVybFxcXFxzKlxcXFwoXFxcXHMqW1xcJ1wiXT8oLis/KVtcXCdcIl0/XFxcXHMqXFxcXCkkJywgJ14obm9uZSkkJywgJ14oLispJCddO1xuXG4gIC8vIGVhY2ggdmlzdWFsIHN0eWxlIHByb3BlcnR5IGhhcyBhIHR5cGUgYW5kIG5lZWRzIHRvIGJlIHZhbGlkYXRlZCBhY2NvcmRpbmcgdG8gaXRcbiAgc3R5Zm4kMi50eXBlcyA9IHtcbiAgICB0aW1lOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICB1bml0czogJ3N8bXMnLFxuICAgICAgaW1wbGljaXRVbml0czogJ21zJ1xuICAgIH0sXG4gICAgcGVyY2VudDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxMDAsXG4gICAgICB1bml0czogJyUnLFxuICAgICAgaW1wbGljaXRVbml0czogJyUnXG4gICAgfSxcbiAgICBwZXJjZW50YWdlczoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxMDAsXG4gICAgICB1bml0czogJyUnLFxuICAgICAgaW1wbGljaXRVbml0czogJyUnLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIHplcm9PbmVOdW1iZXI6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG1pbjogMCxcbiAgICAgIG1heDogMSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICB6ZXJvT25lTnVtYmVyczoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxLFxuICAgICAgdW5pdGxlc3M6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgbk9uZU9uZU51bWJlcjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAtMSxcbiAgICAgIG1heDogMSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICBub25OZWdhdGl2ZUludDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgaW50ZWdlcjogdHJ1ZSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICBub25OZWdhdGl2ZU51bWJlcjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgdW5pdGxlc3M6IHRydWVcbiAgICB9LFxuICAgIHBvc2l0aW9uOiB7XG4gICAgICBlbnVtczogWydwYXJlbnQnLCAnb3JpZ2luJ11cbiAgICB9LFxuICAgIG5vZGVTaXplOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBlbnVtczogWydsYWJlbCddXG4gICAgfSxcbiAgICBudW1iZXI6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICBudW1iZXJzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICB1bml0bGVzczogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBwb3NpdGl2ZU51bWJlcjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgdW5pdGxlc3M6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBzdHJpY3RNaW46IHRydWVcbiAgICB9LFxuICAgIHNpemU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG1pbjogMFxuICAgIH0sXG4gICAgYmlkaXJlY3Rpb25hbFNpemU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZVxuICAgIH0sXG4gICAgLy8gYWxsb3dzIG5lZ2F0aXZlXG4gICAgYmlkaXJlY3Rpb25hbFNpemVNYXliZVBlcmNlbnQ6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIGFsbG93UGVyY2VudDogdHJ1ZVxuICAgIH0sXG4gICAgLy8gYWxsb3dzIG5lZ2F0aXZlXG4gICAgYmlkaXJlY3Rpb25hbFNpemVzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgLy8gYWxsb3dzIG5lZ2F0aXZlXG4gICAgc2l6ZU1heWJlUGVyY2VudDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgYWxsb3dQZXJjZW50OiB0cnVlXG4gICAgfSxcbiAgICBheGlzRGlyZWN0aW9uOiB7XG4gICAgICBlbnVtczogWydob3Jpem9udGFsJywgJ2xlZnR3YXJkJywgJ3JpZ2h0d2FyZCcsICd2ZXJ0aWNhbCcsICd1cHdhcmQnLCAnZG93bndhcmQnLCAnYXV0byddXG4gICAgfSxcbiAgICBwYWRkaW5nUmVsYXRpdmVUbzoge1xuICAgICAgZW51bXM6IFsnd2lkdGgnLCAnaGVpZ2h0JywgJ2F2ZXJhZ2UnLCAnbWluJywgJ21heCddXG4gICAgfSxcbiAgICBiZ1dIOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBhbGxvd1BlcmNlbnQ6IHRydWUsXG4gICAgICBlbnVtczogWydhdXRvJ10sXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgYmdQb3M6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIGFsbG93UGVyY2VudDogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBiZ1JlbGF0aXZlVG86IHtcbiAgICAgIGVudW1zOiBbJ2lubmVyJywgJ2luY2x1ZGUtcGFkZGluZyddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGJnUmVwZWF0OiB7XG4gICAgICBlbnVtczogWydyZXBlYXQnLCAncmVwZWF0LXgnLCAncmVwZWF0LXknLCAnbm8tcmVwZWF0J10sXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgYmdGaXQ6IHtcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAnY29udGFpbicsICdjb3ZlciddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGJnQ3Jvc3NPcmlnaW46IHtcbiAgICAgIGVudW1zOiBbJ2Fub255bW91cycsICd1c2UtY3JlZGVudGlhbHMnLCAnbnVsbCddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGJnQ2xpcDoge1xuICAgICAgZW51bXM6IFsnbm9uZScsICdub2RlJ10sXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgYmdDb250YWlubWVudDoge1xuICAgICAgZW51bXM6IFsnaW5zaWRlJywgJ292ZXInXSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBjb2xvcjoge1xuICAgICAgY29sb3I6IHRydWVcbiAgICB9LFxuICAgIGNvbG9yczoge1xuICAgICAgY29sb3I6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgZmlsbDoge1xuICAgICAgZW51bXM6IFsnc29saWQnLCAnbGluZWFyLWdyYWRpZW50JywgJ3JhZGlhbC1ncmFkaWVudCddXG4gICAgfSxcbiAgICBib29sOiB7XG4gICAgICBlbnVtczogWyd5ZXMnLCAnbm8nXVxuICAgIH0sXG4gICAgYm9vbHM6IHtcbiAgICAgIGVudW1zOiBbJ3llcycsICdubyddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGxpbmVTdHlsZToge1xuICAgICAgZW51bXM6IFsnc29saWQnLCAnZG90dGVkJywgJ2Rhc2hlZCddXG4gICAgfSxcbiAgICBsaW5lQ2FwOiB7XG4gICAgICBlbnVtczogWydidXR0JywgJ3JvdW5kJywgJ3NxdWFyZSddXG4gICAgfSxcbiAgICBib3JkZXJTdHlsZToge1xuICAgICAgZW51bXM6IFsnc29saWQnLCAnZG90dGVkJywgJ2Rhc2hlZCcsICdkb3VibGUnXVxuICAgIH0sXG4gICAgY3VydmVTdHlsZToge1xuICAgICAgZW51bXM6IFsnYmV6aWVyJywgJ3VuYnVuZGxlZC1iZXppZXInLCAnaGF5c3RhY2snLCAnc2VnbWVudHMnLCAnc3RyYWlnaHQnLCAnc3RyYWlnaHQtdHJpYW5nbGUnLCAndGF4aSddXG4gICAgfSxcbiAgICBmb250RmFtaWx5OiB7XG4gICAgICByZWdleDogJ14oW1xcXFx3LSBcXFxcXCJdKyg/OlxcXFxzKixcXFxccypbXFxcXHctIFxcXFxcIl0rKSopJCdcbiAgICB9LFxuICAgIGZvbnRTdHlsZToge1xuICAgICAgZW51bXM6IFsnaXRhbGljJywgJ25vcm1hbCcsICdvYmxpcXVlJ11cbiAgICB9LFxuICAgIGZvbnRXZWlnaHQ6IHtcbiAgICAgIGVudW1zOiBbJ25vcm1hbCcsICdib2xkJywgJ2JvbGRlcicsICdsaWdodGVyJywgJzEwMCcsICcyMDAnLCAnMzAwJywgJzQwMCcsICc1MDAnLCAnNjAwJywgJzgwMCcsICc5MDAnLCAxMDAsIDIwMCwgMzAwLCA0MDAsIDUwMCwgNjAwLCA3MDAsIDgwMCwgOTAwXVxuICAgIH0sXG4gICAgdGV4dERlY29yYXRpb246IHtcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAndW5kZXJsaW5lJywgJ292ZXJsaW5lJywgJ2xpbmUtdGhyb3VnaCddXG4gICAgfSxcbiAgICB0ZXh0VHJhbnNmb3JtOiB7XG4gICAgICBlbnVtczogWydub25lJywgJ3VwcGVyY2FzZScsICdsb3dlcmNhc2UnXVxuICAgIH0sXG4gICAgdGV4dFdyYXA6IHtcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAnd3JhcCcsICdlbGxpcHNpcyddXG4gICAgfSxcbiAgICB0ZXh0T3ZlcmZsb3dXcmFwOiB7XG4gICAgICBlbnVtczogWyd3aGl0ZXNwYWNlJywgJ2FueXdoZXJlJ11cbiAgICB9LFxuICAgIHRleHRCYWNrZ3JvdW5kU2hhcGU6IHtcbiAgICAgIGVudW1zOiBbJ3JlY3RhbmdsZScsICdyb3VuZHJlY3RhbmdsZScsICdyb3VuZC1yZWN0YW5nbGUnXVxuICAgIH0sXG4gICAgbm9kZVNoYXBlOiB7XG4gICAgICBlbnVtczogWydyZWN0YW5nbGUnLCAncm91bmRyZWN0YW5nbGUnLCAncm91bmQtcmVjdGFuZ2xlJywgJ2N1dHJlY3RhbmdsZScsICdjdXQtcmVjdGFuZ2xlJywgJ2JvdHRvbXJvdW5kcmVjdGFuZ2xlJywgJ2JvdHRvbS1yb3VuZC1yZWN0YW5nbGUnLCAnYmFycmVsJywgJ2VsbGlwc2UnLCAndHJpYW5nbGUnLCAncm91bmQtdHJpYW5nbGUnLCAnc3F1YXJlJywgJ3BlbnRhZ29uJywgJ3JvdW5kLXBlbnRhZ29uJywgJ2hleGFnb24nLCAncm91bmQtaGV4YWdvbicsICdjb25jYXZlaGV4YWdvbicsICdjb25jYXZlLWhleGFnb24nLCAnaGVwdGFnb24nLCAncm91bmQtaGVwdGFnb24nLCAnb2N0YWdvbicsICdyb3VuZC1vY3RhZ29uJywgJ3RhZycsICdyb3VuZC10YWcnLCAnc3RhcicsICdkaWFtb25kJywgJ3JvdW5kLWRpYW1vbmQnLCAndmVlJywgJ3Job21ib2lkJywgJ3JpZ2h0LXJob21ib2lkJywgJ3BvbHlnb24nXVxuICAgIH0sXG4gICAgb3ZlcmxheVNoYXBlOiB7XG4gICAgICBlbnVtczogWydyb3VuZHJlY3RhbmdsZScsICdyb3VuZC1yZWN0YW5nbGUnLCAnZWxsaXBzZSddXG4gICAgfSxcbiAgICBjb21wb3VuZEluY2x1ZGVMYWJlbHM6IHtcbiAgICAgIGVudW1zOiBbJ2luY2x1ZGUnLCAnZXhjbHVkZSddXG4gICAgfSxcbiAgICBhcnJvd1NoYXBlOiB7XG4gICAgICBlbnVtczogWyd0ZWUnLCAndHJpYW5nbGUnLCAndHJpYW5nbGUtdGVlJywgJ2NpcmNsZS10cmlhbmdsZScsICd0cmlhbmdsZS1jcm9zcycsICd0cmlhbmdsZS1iYWNrY3VydmUnLCAndmVlJywgJ3NxdWFyZScsICdjaXJjbGUnLCAnZGlhbW9uZCcsICdjaGV2cm9uJywgJ25vbmUnXVxuICAgIH0sXG4gICAgYXJyb3dGaWxsOiB7XG4gICAgICBlbnVtczogWydmaWxsZWQnLCAnaG9sbG93J11cbiAgICB9LFxuICAgIGRpc3BsYXk6IHtcbiAgICAgIGVudW1zOiBbJ2VsZW1lbnQnLCAnbm9uZSddXG4gICAgfSxcbiAgICB2aXNpYmlsaXR5OiB7XG4gICAgICBlbnVtczogWydoaWRkZW4nLCAndmlzaWJsZSddXG4gICAgfSxcbiAgICB6Q29tcG91bmREZXB0aDoge1xuICAgICAgZW51bXM6IFsnYm90dG9tJywgJ29ycGhhbicsICdhdXRvJywgJ3RvcCddXG4gICAgfSxcbiAgICB6SW5kZXhDb21wYXJlOiB7XG4gICAgICBlbnVtczogWydhdXRvJywgJ21hbnVhbCddXG4gICAgfSxcbiAgICB2YWxpZ246IHtcbiAgICAgIGVudW1zOiBbJ3RvcCcsICdjZW50ZXInLCAnYm90dG9tJ11cbiAgICB9LFxuICAgIGhhbGlnbjoge1xuICAgICAgZW51bXM6IFsnbGVmdCcsICdjZW50ZXInLCAncmlnaHQnXVxuICAgIH0sXG4gICAganVzdGlmaWNhdGlvbjoge1xuICAgICAgZW51bXM6IFsnbGVmdCcsICdjZW50ZXInLCAncmlnaHQnLCAnYXV0byddXG4gICAgfSxcbiAgICB0ZXh0OiB7XG4gICAgICBzdHJpbmc6IHRydWVcbiAgICB9LFxuICAgIGRhdGE6IHtcbiAgICAgIG1hcHBpbmc6IHRydWUsXG4gICAgICByZWdleDogZGF0YSgnZGF0YScpXG4gICAgfSxcbiAgICBsYXlvdXREYXRhOiB7XG4gICAgICBtYXBwaW5nOiB0cnVlLFxuICAgICAgcmVnZXg6IGRhdGEoJ2xheW91dERhdGEnKVxuICAgIH0sXG4gICAgc2NyYXRjaDoge1xuICAgICAgbWFwcGluZzogdHJ1ZSxcbiAgICAgIHJlZ2V4OiBkYXRhKCdzY3JhdGNoJylcbiAgICB9LFxuICAgIG1hcERhdGE6IHtcbiAgICAgIG1hcHBpbmc6IHRydWUsXG4gICAgICByZWdleDogbWFwRGF0YSgnbWFwRGF0YScpXG4gICAgfSxcbiAgICBtYXBMYXlvdXREYXRhOiB7XG4gICAgICBtYXBwaW5nOiB0cnVlLFxuICAgICAgcmVnZXg6IG1hcERhdGEoJ21hcExheW91dERhdGEnKVxuICAgIH0sXG4gICAgbWFwU2NyYXRjaDoge1xuICAgICAgbWFwcGluZzogdHJ1ZSxcbiAgICAgIHJlZ2V4OiBtYXBEYXRhKCdtYXBTY3JhdGNoJylcbiAgICB9LFxuICAgIGZuOiB7XG4gICAgICBtYXBwaW5nOiB0cnVlLFxuICAgICAgZm46IHRydWVcbiAgICB9LFxuICAgIHVybDoge1xuICAgICAgcmVnZXhlczogdXJsUmVnZXhlcyxcbiAgICAgIHNpbmdsZVJlZ2V4TWF0Y2hWYWx1ZTogdHJ1ZVxuICAgIH0sXG4gICAgdXJsczoge1xuICAgICAgcmVnZXhlczogdXJsUmVnZXhlcyxcbiAgICAgIHNpbmdsZVJlZ2V4TWF0Y2hWYWx1ZTogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBwcm9wTGlzdDoge1xuICAgICAgcHJvcExpc3Q6IHRydWVcbiAgICB9LFxuICAgIGFuZ2xlOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICB1bml0czogJ2RlZ3xyYWQnLFxuICAgICAgaW1wbGljaXRVbml0czogJ3JhZCdcbiAgICB9LFxuICAgIHRleHRSb3RhdGlvbjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgdW5pdHM6ICdkZWd8cmFkJyxcbiAgICAgIGltcGxpY2l0VW5pdHM6ICdyYWQnLFxuICAgICAgZW51bXM6IFsnbm9uZScsICdhdXRvcm90YXRlJ11cbiAgICB9LFxuICAgIHBvbHlnb25Qb2ludExpc3Q6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgZXZlbk11bHRpcGxlOiB0cnVlLFxuICAgICAgbWluOiAtMSxcbiAgICAgIG1heDogMSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICBlZGdlRGlzdGFuY2VzOiB7XG4gICAgICBlbnVtczogWydpbnRlcnNlY3Rpb24nLCAnbm9kZS1wb3NpdGlvbicsICdlbmRwb2ludHMnXVxuICAgIH0sXG4gICAgZWRnZUVuZHBvaW50OiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICAgIHVuaXRzOiAnJXxweHxlbXxkZWd8cmFkJyxcbiAgICAgIGltcGxpY2l0VW5pdHM6ICdweCcsXG4gICAgICBlbnVtczogWydpbnNpZGUtdG8tbm9kZScsICdvdXRzaWRlLXRvLW5vZGUnLCAnb3V0c2lkZS10by1ub2RlLW9yLWxhYmVsJywgJ291dHNpZGUtdG8tbGluZScsICdvdXRzaWRlLXRvLWxpbmUtb3ItbGFiZWwnXSxcbiAgICAgIHNpbmdsZUVudW06IHRydWUsXG4gICAgICB2YWxpZGF0ZTogZnVuY3Rpb24gdmFsaWRhdGUodmFsQXJyLCB1bml0c0Fycikge1xuICAgICAgICBzd2l0Y2ggKHZhbEFyci5sZW5ndGgpIHtcbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAvLyBjYW4gYmUgJSBvciBweCBvbmx5XG4gICAgICAgICAgICByZXR1cm4gdW5pdHNBcnJbMF0gIT09ICdkZWcnICYmIHVuaXRzQXJyWzBdICE9PSAncmFkJyAmJiB1bml0c0FyclsxXSAhPT0gJ2RlZycgJiYgdW5pdHNBcnJbMV0gIT09ICdyYWQnO1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIC8vIGNhbiBiZSBlbnVtLCBkZWcsIG9yIHJhZCBvbmx5XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nKHZhbEFyclswXSkgfHwgdW5pdHNBcnJbMF0gPT09ICdkZWcnIHx8IHVuaXRzQXJyWzBdID09PSAncmFkJztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBlYXNpbmc6IHtcbiAgICAgIHJlZ2V4ZXM6IFsnXihzcHJpbmcpXFxcXHMqXFxcXChcXFxccyooJyArIG51bWJlciQxICsgJylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIkMSArICcpXFxcXHMqXFxcXCkkJywgJ14oY3ViaWMtYmV6aWVyKVxcXFxzKlxcXFwoXFxcXHMqKCcgKyBudW1iZXIkMSArICcpXFxcXHMqLFxcXFxzKignICsgbnVtYmVyJDEgKyAnKVxcXFxzKixcXFxccyooJyArIG51bWJlciQxICsgJylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIkMSArICcpXFxcXHMqXFxcXCkkJ10sXG4gICAgICBlbnVtczogWydsaW5lYXInLCAnZWFzZScsICdlYXNlLWluJywgJ2Vhc2Utb3V0JywgJ2Vhc2UtaW4tb3V0JywgJ2Vhc2UtaW4tc2luZScsICdlYXNlLW91dC1zaW5lJywgJ2Vhc2UtaW4tb3V0LXNpbmUnLCAnZWFzZS1pbi1xdWFkJywgJ2Vhc2Utb3V0LXF1YWQnLCAnZWFzZS1pbi1vdXQtcXVhZCcsICdlYXNlLWluLWN1YmljJywgJ2Vhc2Utb3V0LWN1YmljJywgJ2Vhc2UtaW4tb3V0LWN1YmljJywgJ2Vhc2UtaW4tcXVhcnQnLCAnZWFzZS1vdXQtcXVhcnQnLCAnZWFzZS1pbi1vdXQtcXVhcnQnLCAnZWFzZS1pbi1xdWludCcsICdlYXNlLW91dC1xdWludCcsICdlYXNlLWluLW91dC1xdWludCcsICdlYXNlLWluLWV4cG8nLCAnZWFzZS1vdXQtZXhwbycsICdlYXNlLWluLW91dC1leHBvJywgJ2Vhc2UtaW4tY2lyYycsICdlYXNlLW91dC1jaXJjJywgJ2Vhc2UtaW4tb3V0LWNpcmMnXVxuICAgIH0sXG4gICAgZ3JhZGllbnREaXJlY3Rpb246IHtcbiAgICAgIGVudW1zOiBbJ3RvLWJvdHRvbScsICd0by10b3AnLCAndG8tbGVmdCcsICd0by1yaWdodCcsICd0by1ib3R0b20tcmlnaHQnLCAndG8tYm90dG9tLWxlZnQnLCAndG8tdG9wLXJpZ2h0JywgJ3RvLXRvcC1sZWZ0JywgJ3RvLXJpZ2h0LWJvdHRvbScsICd0by1sZWZ0LWJvdHRvbScsICd0by1yaWdodC10b3AnLCAndG8tbGVmdC10b3AnIC8vIGRpZmZlcmVudCBvcmRlclxuICAgICAgXVxuICAgIH0sXG5cbiAgICBib3VuZHNFeHBhbnNpb246IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uIHZhbGlkYXRlKHZhbEFycikge1xuICAgICAgICB2YXIgbGVuZ3RoID0gdmFsQXJyLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGxlbmd0aCA9PT0gMSB8fCBsZW5ndGggPT09IDIgfHwgbGVuZ3RoID09PSA0O1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIGRpZmYgPSB7XG4gICAgemVyb05vblplcm86IGZ1bmN0aW9uIHplcm9Ob25aZXJvKHZhbDEsIHZhbDIpIHtcbiAgICAgIGlmICgodmFsMSA9PSBudWxsIHx8IHZhbDIgPT0gbnVsbCkgJiYgdmFsMSAhPT0gdmFsMikge1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gbnVsbCBjYXNlcyBjb3VsZCByZXByZXNlbnQgYW55IHZhbHVlXG4gICAgICB9XG4gICAgICBpZiAodmFsMSA9PSAwICYmIHZhbDIgIT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAodmFsMSAhPSAwICYmIHZhbDIgPT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFueTogZnVuY3Rpb24gYW55KHZhbDEsIHZhbDIpIHtcbiAgICAgIHJldHVybiB2YWwxICE9IHZhbDI7XG4gICAgfSxcbiAgICBlbXB0eU5vbkVtcHR5OiBmdW5jdGlvbiBlbXB0eU5vbkVtcHR5KHN0cjEsIHN0cjIpIHtcbiAgICAgIHZhciBlbXB0eTEgPSBlbXB0eVN0cmluZyhzdHIxKTtcbiAgICAgIHZhciBlbXB0eTIgPSBlbXB0eVN0cmluZyhzdHIyKTtcbiAgICAgIHJldHVybiBlbXB0eTEgJiYgIWVtcHR5MiB8fCAhZW1wdHkxICYmIGVtcHR5MjtcbiAgICB9XG4gIH07XG5cbiAgLy8gZGVmaW5lIHZpc3VhbCBzdHlsZSBwcm9wZXJ0aWVzXG4gIC8vXG4gIC8vIC0gbi5iLiBhZGRpbmcgYSBuZXcgZ3JvdXAgb2YgcHJvcHMgbWF5IHJlcXVpcmUgdXBkYXRlcyB0byB1cGRhdGVTdHlsZUhpbnRzKClcbiAgLy8gLSBhZGRpbmcgbmV3IHByb3BzIHRvIGFuIGV4aXN0aW5nIGdyb3VwIGdldHMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5XG5cbiAgdmFyIHQgPSBzdHlmbiQyLnR5cGVzO1xuICB2YXIgbWFpbkxhYmVsID0gW3tcbiAgICBuYW1lOiAnbGFiZWwnLFxuICAgIHR5cGU6IHQudGV4dCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnksXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuZW1wdHlOb25FbXB0eVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtcm90YXRpb24nLFxuICAgIHR5cGU6IHQudGV4dFJvdGF0aW9uLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtbWFyZ2luLXgnLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1tYXJnaW4teScsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBzb3VyY2VMYWJlbCA9IFt7XG4gICAgbmFtZTogJ3NvdXJjZS1sYWJlbCcsXG4gICAgdHlwZTogdC50ZXh0LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NvdXJjZS10ZXh0LXJvdGF0aW9uJyxcbiAgICB0eXBlOiB0LnRleHRSb3RhdGlvbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzb3VyY2UtdGV4dC1tYXJnaW4teCcsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzb3VyY2UtdGV4dC1tYXJnaW4teScsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzb3VyY2UtdGV4dC1vZmZzZXQnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciB0YXJnZXRMYWJlbCA9IFt7XG4gICAgbmFtZTogJ3RhcmdldC1sYWJlbCcsXG4gICAgdHlwZTogdC50ZXh0LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RhcmdldC10ZXh0LXJvdGF0aW9uJyxcbiAgICB0eXBlOiB0LnRleHRSb3RhdGlvbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXJnZXQtdGV4dC1tYXJnaW4teCcsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXJnZXQtdGV4dC1tYXJnaW4teScsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXJnZXQtdGV4dC1vZmZzZXQnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBsYWJlbERpbWVuc2lvbnMgPSBbe1xuICAgIG5hbWU6ICdmb250LWZhbWlseScsXG4gICAgdHlwZTogdC5mb250RmFtaWx5LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2ZvbnQtc3R5bGUnLFxuICAgIHR5cGU6IHQuZm9udFN0eWxlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2ZvbnQtd2VpZ2h0JyxcbiAgICB0eXBlOiB0LmZvbnRXZWlnaHQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZm9udC1zaXplJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC10cmFuc2Zvcm0nLFxuICAgIHR5cGU6IHQudGV4dFRyYW5zZm9ybSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LXdyYXAnLFxuICAgIHR5cGU6IHQudGV4dFdyYXAsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1vdmVyZmxvdy13cmFwJyxcbiAgICB0eXBlOiB0LnRleHRPdmVyZmxvd1dyYXAsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1tYXgtd2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW91dGxpbmUtd2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWhlaWdodCcsXG4gICAgdHlwZTogdC5wb3NpdGl2ZU51bWJlcixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBjb21tb25MYWJlbCA9IFt7XG4gICAgbmFtZTogJ3RleHQtdmFsaWduJyxcbiAgICB0eXBlOiB0LnZhbGlnbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWhhbGlnbicsXG4gICAgdHlwZTogdC5oYWxpZ24sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW91dGxpbmUtY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW91dGxpbmUtb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1iYWNrZ3JvdW5kLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1iYWNrZ3JvdW5kLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYmFja2dyb3VuZC1wYWRkaW5nJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1ib3JkZXItb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1ib3JkZXItY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWJvcmRlci13aWR0aCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYm9yZGVyLXN0eWxlJyxcbiAgICB0eXBlOiB0LmJvcmRlclN0eWxlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYmFja2dyb3VuZC1zaGFwZScsXG4gICAgdHlwZTogdC50ZXh0QmFja2dyb3VuZFNoYXBlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtanVzdGlmaWNhdGlvbicsXG4gICAgdHlwZTogdC5qdXN0aWZpY2F0aW9uXG4gIH1dO1xuICB2YXIgYmVoYXZpb3IgPSBbe1xuICAgIG5hbWU6ICdldmVudHMnLFxuICAgIHR5cGU6IHQuYm9vbCxcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWV2ZW50cycsXG4gICAgdHlwZTogdC5ib29sLFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLmFueVxuICB9XTtcbiAgdmFyIHZpc2liaWxpdHkgPSBbe1xuICAgIG5hbWU6ICdkaXNwbGF5JyxcbiAgICB0eXBlOiB0LmRpc3BsYXksXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuYW55LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueSxcbiAgICB0cmlnZ2Vyc0JvdW5kc09mUGFyYWxsZWxCZXppZXJzOiB0cnVlXG4gIH0sIHtcbiAgICBuYW1lOiAndmlzaWJpbGl0eScsXG4gICAgdHlwZTogdC52aXNpYmlsaXR5LFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ29wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlcixcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi56ZXJvTm9uWmVyb1xuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAnbWluLXpvb21lZC1mb250LXNpemUnLFxuICAgIHR5cGU6IHQuc2l6ZVxuICB9LCB7XG4gICAgbmFtZTogJ3otY29tcG91bmQtZGVwdGgnLFxuICAgIHR5cGU6IHQuekNvbXBvdW5kRGVwdGgsXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnei1pbmRleC1jb21wYXJlJyxcbiAgICB0eXBlOiB0LnpJbmRleENvbXBhcmUsXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnei1pbmRleCcsXG4gICAgdHlwZTogdC5udW1iZXIsXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgb3ZlcmxheSA9IFt7XG4gICAgbmFtZTogJ292ZXJsYXktcGFkZGluZycsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ292ZXJsYXktY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdvdmVybGF5LW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlcixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi56ZXJvTm9uWmVyb1xuICB9LCB7XG4gICAgbmFtZTogJ292ZXJsYXktc2hhcGUnLFxuICAgIHR5cGU6IHQub3ZlcmxheVNoYXBlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9XTtcbiAgdmFyIHVuZGVybGF5ID0gW3tcbiAgICBuYW1lOiAndW5kZXJsYXktcGFkZGluZycsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3VuZGVybGF5LWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAndW5kZXJsYXktb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLnplcm9Ob25aZXJvXG4gIH0sIHtcbiAgICBuYW1lOiAndW5kZXJsYXktc2hhcGUnLFxuICAgIHR5cGU6IHQub3ZlcmxheVNoYXBlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9XTtcbiAgdmFyIHRyYW5zaXRpb24gPSBbe1xuICAgIG5hbWU6ICd0cmFuc2l0aW9uLXByb3BlcnR5JyxcbiAgICB0eXBlOiB0LnByb3BMaXN0XG4gIH0sIHtcbiAgICBuYW1lOiAndHJhbnNpdGlvbi1kdXJhdGlvbicsXG4gICAgdHlwZTogdC50aW1lXG4gIH0sIHtcbiAgICBuYW1lOiAndHJhbnNpdGlvbi1kZWxheScsXG4gICAgdHlwZTogdC50aW1lXG4gIH0sIHtcbiAgICBuYW1lOiAndHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nLFxuICAgIHR5cGU6IHQuZWFzaW5nXG4gIH1dO1xuICB2YXIgbm9kZVNpemVIYXNoT3ZlcnJpZGUgPSBmdW5jdGlvbiBub2RlU2l6ZUhhc2hPdmVycmlkZShlbGUsIHBhcnNlZFByb3ApIHtcbiAgICBpZiAocGFyc2VkUHJvcC52YWx1ZSA9PT0gJ2xhYmVsJykge1xuICAgICAgcmV0dXJuIC1lbGUucG9vbEluZGV4KCk7IC8vIG5vIGhhc2gga2V5IGhpdHMgaXMgdXNpbmcgbGFiZWwgc2l6ZSAoaGl0cmF0ZSBmb3IgcGVyZiBwcm9iYWJseSBsb3cgYW55d2F5KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcGFyc2VkUHJvcC5wZlZhbHVlO1xuICAgIH1cbiAgfTtcbiAgdmFyIG5vZGVCb2R5ID0gW3tcbiAgICBuYW1lOiAnaGVpZ2h0JyxcbiAgICB0eXBlOiB0Lm5vZGVTaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueSxcbiAgICBoYXNoT3ZlcnJpZGU6IG5vZGVTaXplSGFzaE92ZXJyaWRlXG4gIH0sIHtcbiAgICBuYW1lOiAnd2lkdGgnLFxuICAgIHR5cGU6IHQubm9kZVNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55LFxuICAgIGhhc2hPdmVycmlkZTogbm9kZVNpemVIYXNoT3ZlcnJpZGVcbiAgfSwge1xuICAgIG5hbWU6ICdzaGFwZScsXG4gICAgdHlwZTogdC5ub2RlU2hhcGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc2hhcGUtcG9seWdvbi1wb2ludHMnLFxuICAgIHR5cGU6IHQucG9seWdvblBvaW50TGlzdCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1maWxsJyxcbiAgICB0eXBlOiB0LmZpbGxcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtYmxhY2tlbicsXG4gICAgdHlwZTogdC5uT25lT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1ncmFkaWVudC1zdG9wLWNvbG9ycycsXG4gICAgdHlwZTogdC5jb2xvcnNcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJyxcbiAgICB0eXBlOiB0LnBlcmNlbnRhZ2VzXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1ncmFkaWVudC1kaXJlY3Rpb24nLFxuICAgIHR5cGU6IHQuZ3JhZGllbnREaXJlY3Rpb25cbiAgfSwge1xuICAgIG5hbWU6ICdwYWRkaW5nJyxcbiAgICB0eXBlOiB0LnNpemVNYXliZVBlcmNlbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAncGFkZGluZy1yZWxhdGl2ZS10bycsXG4gICAgdHlwZTogdC5wYWRkaW5nUmVsYXRpdmVUbyxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdib3VuZHMtZXhwYW5zaW9uJyxcbiAgICB0eXBlOiB0LmJvdW5kc0V4cGFuc2lvbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBub2RlQm9yZGVyID0gW3tcbiAgICBuYW1lOiAnYm9yZGVyLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnYm9yZGVyLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ2JvcmRlci13aWR0aCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2JvcmRlci1zdHlsZScsXG4gICAgdHlwZTogdC5ib3JkZXJTdHlsZVxuICB9XTtcbiAgdmFyIGJhY2tncm91bmRJbWFnZSA9IFt7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtaW1hZ2UnLFxuICAgIHR5cGU6IHQudXJsc1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtaW1hZ2UtY3Jvc3NvcmlnaW4nLFxuICAgIHR5cGU6IHQuYmdDcm9zc09yaWdpblxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtaW1hZ2Utb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyc1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtaW1hZ2UtY29udGFpbm1lbnQnLFxuICAgIHR5cGU6IHQuYmdDb250YWlubWVudFxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtaW1hZ2Utc21vb3RoaW5nJyxcbiAgICB0eXBlOiB0LmJvb2xzXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1wb3NpdGlvbi14JyxcbiAgICB0eXBlOiB0LmJnUG9zXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1wb3NpdGlvbi15JyxcbiAgICB0eXBlOiB0LmJnUG9zXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC13aWR0aC1yZWxhdGl2ZS10bycsXG4gICAgdHlwZTogdC5iZ1JlbGF0aXZlVG9cbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWhlaWdodC1yZWxhdGl2ZS10bycsXG4gICAgdHlwZTogdC5iZ1JlbGF0aXZlVG9cbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLXJlcGVhdCcsXG4gICAgdHlwZTogdC5iZ1JlcGVhdFxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtZml0JyxcbiAgICB0eXBlOiB0LmJnRml0XG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1jbGlwJyxcbiAgICB0eXBlOiB0LmJnQ2xpcFxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtd2lkdGgnLFxuICAgIHR5cGU6IHQuYmdXSFxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtaGVpZ2h0JyxcbiAgICB0eXBlOiB0LmJnV0hcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLW9mZnNldC14JyxcbiAgICB0eXBlOiB0LmJnUG9zXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1vZmZzZXQteScsXG4gICAgdHlwZTogdC5iZ1Bvc1xuICB9XTtcbiAgdmFyIGNvbXBvdW5kID0gW3tcbiAgICBuYW1lOiAncG9zaXRpb24nLFxuICAgIHR5cGU6IHQucG9zaXRpb24sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnY29tcG91bmQtc2l6aW5nLXdydC1sYWJlbHMnLFxuICAgIHR5cGU6IHQuY29tcG91bmRJbmNsdWRlTGFiZWxzLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ21pbi13aWR0aCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ21pbi13aWR0aC1iaWFzLWxlZnQnLFxuICAgIHR5cGU6IHQuc2l6ZU1heWJlUGVyY2VudCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdtaW4td2lkdGgtYmlhcy1yaWdodCcsXG4gICAgdHlwZTogdC5zaXplTWF5YmVQZXJjZW50LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ21pbi1oZWlnaHQnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdtaW4taGVpZ2h0LWJpYXMtdG9wJyxcbiAgICB0eXBlOiB0LnNpemVNYXliZVBlcmNlbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbWluLWhlaWdodC1iaWFzLWJvdHRvbScsXG4gICAgdHlwZTogdC5zaXplTWF5YmVQZXJjZW50LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9XTtcbiAgdmFyIGVkZ2VMaW5lID0gW3tcbiAgICBuYW1lOiAnbGluZS1zdHlsZScsXG4gICAgdHlwZTogdC5saW5lU3R5bGVcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1maWxsJyxcbiAgICB0eXBlOiB0LmZpbGxcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWNhcCcsXG4gICAgdHlwZTogdC5saW5lQ2FwXG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWRhc2gtcGF0dGVybicsXG4gICAgdHlwZTogdC5udW1iZXJzXG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1kYXNoLW9mZnNldCcsXG4gICAgdHlwZTogdC5udW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWdyYWRpZW50LXN0b3AtY29sb3JzJyxcbiAgICB0eXBlOiB0LmNvbG9yc1xuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtZ3JhZGllbnQtc3RvcC1wb3NpdGlvbnMnLFxuICAgIHR5cGU6IHQucGVyY2VudGFnZXNcbiAgfSwge1xuICAgIG5hbWU6ICdjdXJ2ZS1zdHlsZScsXG4gICAgdHlwZTogdC5jdXJ2ZVN0eWxlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueSxcbiAgICB0cmlnZ2Vyc0JvdW5kc09mUGFyYWxsZWxCZXppZXJzOiB0cnVlXG4gIH0sIHtcbiAgICBuYW1lOiAnaGF5c3RhY2stcmFkaXVzJyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXIsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc291cmNlLWVuZHBvaW50JyxcbiAgICB0eXBlOiB0LmVkZ2VFbmRwb2ludCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXJnZXQtZW5kcG9pbnQnLFxuICAgIHR5cGU6IHQuZWRnZUVuZHBvaW50LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2NvbnRyb2wtcG9pbnQtc3RlcC1zaXplJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnY29udHJvbC1wb2ludC1kaXN0YW5jZXMnLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemVzLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2NvbnRyb2wtcG9pbnQtd2VpZ2h0cycsXG4gICAgdHlwZTogdC5udW1iZXJzLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NlZ21lbnQtZGlzdGFuY2VzJyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplcyxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzZWdtZW50LXdlaWdodHMnLFxuICAgIHR5cGU6IHQubnVtYmVycyxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXhpLXR1cm4nLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemVNYXliZVBlcmNlbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGF4aS10dXJuLW1pbi1kaXN0YW5jZScsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RheGktZGlyZWN0aW9uJyxcbiAgICB0eXBlOiB0LmF4aXNEaXJlY3Rpb24sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZWRnZS1kaXN0YW5jZXMnLFxuICAgIHR5cGU6IHQuZWRnZURpc3RhbmNlcyxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdhcnJvdy1zY2FsZScsXG4gICAgdHlwZTogdC5wb3NpdGl2ZU51bWJlcixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdsb29wLWRpcmVjdGlvbicsXG4gICAgdHlwZTogdC5hbmdsZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdsb29wLXN3ZWVwJyxcbiAgICB0eXBlOiB0LmFuZ2xlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NvdXJjZS1kaXN0YW5jZS1mcm9tLW5vZGUnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXJnZXQtZGlzdGFuY2UtZnJvbS1ub2RlJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgZ2hvc3QgPSBbe1xuICAgIG5hbWU6ICdnaG9zdCcsXG4gICAgdHlwZTogdC5ib29sLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2dob3N0LW9mZnNldC14JyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2dob3N0LW9mZnNldC15JyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2dob3N0LW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9XTtcbiAgdmFyIGNvcmUgPSBbe1xuICAgIG5hbWU6ICdzZWxlY3Rpb24tYm94LWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnc2VsZWN0aW9uLWJveC1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdzZWxlY3Rpb24tYm94LWJvcmRlci1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLXdpZHRoJyxcbiAgICB0eXBlOiB0LnNpemVcbiAgfSwge1xuICAgIG5hbWU6ICdhY3RpdmUtYmctY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdhY3RpdmUtYmctb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAnYWN0aXZlLWJnLXNpemUnLFxuICAgIHR5cGU6IHQuc2l6ZVxuICB9LCB7XG4gICAgbmFtZTogJ291dHNpZGUtdGV4dHVyZS1iZy1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ291dHNpZGUtdGV4dHVyZS1iZy1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfV07XG5cbiAgLy8gcGllIGJhY2tncm91bmRzIGZvciBub2Rlc1xuICB2YXIgcGllID0gW107XG4gIHN0eWZuJDIucGllQmFja2dyb3VuZE4gPSAxNjsgLy8gYmVjYXVzZSB0aGUgcGllIHByb3BlcnRpZXMgYXJlIG51bWJlcmVkLCBnaXZlIGFjY2VzcyB0byBhIGNvbnN0YW50IE4gKGZvciByZW5kZXJlciB1c2UpXG4gIHBpZS5wdXNoKHtcbiAgICBuYW1lOiAncGllLXNpemUnLFxuICAgIHR5cGU6IHQuc2l6ZU1heWJlUGVyY2VudFxuICB9KTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPD0gc3R5Zm4kMi5waWVCYWNrZ3JvdW5kTjsgaSsrKSB7XG4gICAgcGllLnB1c2goe1xuICAgICAgbmFtZTogJ3BpZS0nICsgaSArICctYmFja2dyb3VuZC1jb2xvcicsXG4gICAgICB0eXBlOiB0LmNvbG9yXG4gICAgfSk7XG4gICAgcGllLnB1c2goe1xuICAgICAgbmFtZTogJ3BpZS0nICsgaSArICctYmFja2dyb3VuZC1zaXplJyxcbiAgICAgIHR5cGU6IHQucGVyY2VudFxuICAgIH0pO1xuICAgIHBpZS5wdXNoKHtcbiAgICAgIG5hbWU6ICdwaWUtJyArIGkgKyAnLWJhY2tncm91bmQtb3BhY2l0eScsXG4gICAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGVkZ2UgYXJyb3dzXG4gIHZhciBlZGdlQXJyb3cgPSBbXTtcbiAgdmFyIGFycm93UHJlZml4ZXMgPSBzdHlmbiQyLmFycm93UHJlZml4ZXMgPSBbJ3NvdXJjZScsICdtaWQtc291cmNlJywgJ3RhcmdldCcsICdtaWQtdGFyZ2V0J107XG4gIFt7XG4gICAgbmFtZTogJ2Fycm93LXNoYXBlJyxcbiAgICB0eXBlOiB0LmFycm93U2hhcGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnYXJyb3ctY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdhcnJvdy1maWxsJyxcbiAgICB0eXBlOiB0LmFycm93RmlsbFxuICB9XS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgYXJyb3dQcmVmaXhlcy5mb3JFYWNoKGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgICAgIHZhciBuYW1lID0gcHJlZml4ICsgJy0nICsgcHJvcC5uYW1lO1xuICAgICAgdmFyIHR5cGUgPSBwcm9wLnR5cGUsXG4gICAgICAgIHRyaWdnZXJzQm91bmRzID0gcHJvcC50cmlnZ2Vyc0JvdW5kcztcbiAgICAgIGVkZ2VBcnJvdy5wdXNoKHtcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgdHJpZ2dlcnNCb3VuZHM6IHRyaWdnZXJzQm91bmRzXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSwge30pO1xuICB2YXIgcHJvcHMgPSBzdHlmbiQyLnByb3BlcnRpZXMgPSBbXS5jb25jYXQoYmVoYXZpb3IsIHRyYW5zaXRpb24sIHZpc2liaWxpdHksIG92ZXJsYXksIHVuZGVybGF5LCBnaG9zdCwgY29tbW9uTGFiZWwsIGxhYmVsRGltZW5zaW9ucywgbWFpbkxhYmVsLCBzb3VyY2VMYWJlbCwgdGFyZ2V0TGFiZWwsIG5vZGVCb2R5LCBub2RlQm9yZGVyLCBiYWNrZ3JvdW5kSW1hZ2UsIHBpZSwgY29tcG91bmQsIGVkZ2VMaW5lLCBlZGdlQXJyb3csIGNvcmUpO1xuICB2YXIgcHJvcEdyb3VwcyA9IHN0eWZuJDIucHJvcGVydHlHcm91cHMgPSB7XG4gICAgLy8gY29tbW9uIHRvIGFsbCBlbGVzXG4gICAgYmVoYXZpb3I6IGJlaGF2aW9yLFxuICAgIHRyYW5zaXRpb246IHRyYW5zaXRpb24sXG4gICAgdmlzaWJpbGl0eTogdmlzaWJpbGl0eSxcbiAgICBvdmVybGF5OiBvdmVybGF5LFxuICAgIHVuZGVybGF5OiB1bmRlcmxheSxcbiAgICBnaG9zdDogZ2hvc3QsXG4gICAgLy8gbGFiZWxzXG4gICAgY29tbW9uTGFiZWw6IGNvbW1vbkxhYmVsLFxuICAgIGxhYmVsRGltZW5zaW9uczogbGFiZWxEaW1lbnNpb25zLFxuICAgIG1haW5MYWJlbDogbWFpbkxhYmVsLFxuICAgIHNvdXJjZUxhYmVsOiBzb3VyY2VMYWJlbCxcbiAgICB0YXJnZXRMYWJlbDogdGFyZ2V0TGFiZWwsXG4gICAgLy8gbm9kZSBwcm9wc1xuICAgIG5vZGVCb2R5OiBub2RlQm9keSxcbiAgICBub2RlQm9yZGVyOiBub2RlQm9yZGVyLFxuICAgIGJhY2tncm91bmRJbWFnZTogYmFja2dyb3VuZEltYWdlLFxuICAgIHBpZTogcGllLFxuICAgIGNvbXBvdW5kOiBjb21wb3VuZCxcbiAgICAvLyBlZGdlIHByb3BzXG4gICAgZWRnZUxpbmU6IGVkZ2VMaW5lLFxuICAgIGVkZ2VBcnJvdzogZWRnZUFycm93LFxuICAgIGNvcmU6IGNvcmVcbiAgfTtcbiAgdmFyIHByb3BHcm91cE5hbWVzID0gc3R5Zm4kMi5wcm9wZXJ0eUdyb3VwTmFtZXMgPSB7fTtcbiAgdmFyIHByb3BHcm91cEtleXMgPSBzdHlmbiQyLnByb3BlcnR5R3JvdXBLZXlzID0gT2JqZWN0LmtleXMocHJvcEdyb3Vwcyk7XG4gIHByb3BHcm91cEtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcHJvcEdyb3VwTmFtZXNba2V5XSA9IHByb3BHcm91cHNba2V5XS5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHJldHVybiBwcm9wLm5hbWU7XG4gICAgfSk7XG4gICAgcHJvcEdyb3Vwc1trZXldLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHJldHVybiBwcm9wLmdyb3VwS2V5ID0ga2V5O1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBkZWZpbmUgYWxpYXNlc1xuICB2YXIgYWxpYXNlcyA9IHN0eWZuJDIuYWxpYXNlcyA9IFt7XG4gICAgbmFtZTogJ2NvbnRlbnQnLFxuICAgIHBvaW50c1RvOiAnbGFiZWwnXG4gIH0sIHtcbiAgICBuYW1lOiAnY29udHJvbC1wb2ludC1kaXN0YW5jZScsXG4gICAgcG9pbnRzVG86ICdjb250cm9sLXBvaW50LWRpc3RhbmNlcydcbiAgfSwge1xuICAgIG5hbWU6ICdjb250cm9sLXBvaW50LXdlaWdodCcsXG4gICAgcG9pbnRzVG86ICdjb250cm9sLXBvaW50LXdlaWdodHMnXG4gIH0sIHtcbiAgICBuYW1lOiAnZWRnZS10ZXh0LXJvdGF0aW9uJyxcbiAgICBwb2ludHNUbzogJ3RleHQtcm90YXRpb24nXG4gIH0sIHtcbiAgICBuYW1lOiAncGFkZGluZy1sZWZ0JyxcbiAgICBwb2ludHNUbzogJ3BhZGRpbmcnXG4gIH0sIHtcbiAgICBuYW1lOiAncGFkZGluZy1yaWdodCcsXG4gICAgcG9pbnRzVG86ICdwYWRkaW5nJ1xuICB9LCB7XG4gICAgbmFtZTogJ3BhZGRpbmctdG9wJyxcbiAgICBwb2ludHNUbzogJ3BhZGRpbmcnXG4gIH0sIHtcbiAgICBuYW1lOiAncGFkZGluZy1ib3R0b20nLFxuICAgIHBvaW50c1RvOiAncGFkZGluZydcbiAgfV07XG5cbiAgLy8gbGlzdCBvZiBwcm9wZXJ0eSBuYW1lc1xuICBzdHlmbiQyLnByb3BlcnR5TmFtZXMgPSBwcm9wcy5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICByZXR1cm4gcC5uYW1lO1xuICB9KTtcblxuICAvLyBhbGxvdyBhY2Nlc3Mgb2YgcHJvcGVydGllcyBieSBuYW1lICggZS5nLiBzdHlsZS5wcm9wZXJ0aWVzLmhlaWdodCApXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBwcm9wcy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgcHJvcCA9IHByb3BzW19pXTtcbiAgICBwcm9wc1twcm9wLm5hbWVdID0gcHJvcDsgLy8gYWxsb3cgbG9va3VwIGJ5IG5hbWVcbiAgfVxuXG4gIC8vIG1hcCBhbGlhc2VzXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGFsaWFzZXMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciBhbGlhcyA9IGFsaWFzZXNbX2kyXTtcbiAgICB2YXIgcG9pbnRzVG9Qcm9wID0gcHJvcHNbYWxpYXMucG9pbnRzVG9dO1xuICAgIHZhciBhbGlhc1Byb3AgPSB7XG4gICAgICBuYW1lOiBhbGlhcy5uYW1lLFxuICAgICAgYWxpYXM6IHRydWUsXG4gICAgICBwb2ludHNUbzogcG9pbnRzVG9Qcm9wXG4gICAgfTtcblxuICAgIC8vIGFkZCBhbGlhcyBwcm9wIGZvciBwYXJzaW5nXG4gICAgcHJvcHMucHVzaChhbGlhc1Byb3ApO1xuICAgIHByb3BzW2FsaWFzLm5hbWVdID0gYWxpYXNQcm9wOyAvLyBhbGxvdyBsb29rdXAgYnkgbmFtZVxuICB9XG59KSgpO1xuXG5zdHlmbiQyLmdldERlZmF1bHRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiB0aGlzLmdldERlZmF1bHRQcm9wZXJ0aWVzKClbbmFtZV07XG59O1xuc3R5Zm4kMi5nZXREZWZhdWx0UHJvcGVydGllcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgaWYgKF9wLmRlZmF1bHRQcm9wZXJ0aWVzICE9IG51bGwpIHtcbiAgICByZXR1cm4gX3AuZGVmYXVsdFByb3BlcnRpZXM7XG4gIH1cbiAgdmFyIHJhd1Byb3BzID0gZXh0ZW5kKHtcbiAgICAvLyBjb3JlIHByb3BzXG4gICAgJ3NlbGVjdGlvbi1ib3gtY29sb3InOiAnI2RkZCcsXG4gICAgJ3NlbGVjdGlvbi1ib3gtb3BhY2l0eSc6IDAuNjUsXG4gICAgJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLWNvbG9yJzogJyNhYWEnLFxuICAgICdzZWxlY3Rpb24tYm94LWJvcmRlci13aWR0aCc6IDEsXG4gICAgJ2FjdGl2ZS1iZy1jb2xvcic6ICdibGFjaycsXG4gICAgJ2FjdGl2ZS1iZy1vcGFjaXR5JzogMC4xNSxcbiAgICAnYWN0aXZlLWJnLXNpemUnOiAzMCxcbiAgICAnb3V0c2lkZS10ZXh0dXJlLWJnLWNvbG9yJzogJyMwMDAnLFxuICAgICdvdXRzaWRlLXRleHR1cmUtYmctb3BhY2l0eSc6IDAuMTI1LFxuICAgIC8vIGNvbW1vbiBub2RlL2VkZ2UgcHJvcHNcbiAgICAnZXZlbnRzJzogJ3llcycsXG4gICAgJ3RleHQtZXZlbnRzJzogJ25vJyxcbiAgICAndGV4dC12YWxpZ24nOiAndG9wJyxcbiAgICAndGV4dC1oYWxpZ24nOiAnY2VudGVyJyxcbiAgICAndGV4dC1qdXN0aWZpY2F0aW9uJzogJ2F1dG8nLFxuICAgICdsaW5lLWhlaWdodCc6IDEsXG4gICAgJ2NvbG9yJzogJyMwMDAnLFxuICAgICd0ZXh0LW91dGxpbmUtY29sb3InOiAnIzAwMCcsXG4gICAgJ3RleHQtb3V0bGluZS13aWR0aCc6IDAsXG4gICAgJ3RleHQtb3V0bGluZS1vcGFjaXR5JzogMSxcbiAgICAndGV4dC1vcGFjaXR5JzogMSxcbiAgICAndGV4dC1kZWNvcmF0aW9uJzogJ25vbmUnLFxuICAgICd0ZXh0LXRyYW5zZm9ybSc6ICdub25lJyxcbiAgICAndGV4dC13cmFwJzogJ25vbmUnLFxuICAgICd0ZXh0LW92ZXJmbG93LXdyYXAnOiAnd2hpdGVzcGFjZScsXG4gICAgJ3RleHQtbWF4LXdpZHRoJzogOTk5OSxcbiAgICAndGV4dC1iYWNrZ3JvdW5kLWNvbG9yJzogJyMwMDAnLFxuICAgICd0ZXh0LWJhY2tncm91bmQtb3BhY2l0eSc6IDAsXG4gICAgJ3RleHQtYmFja2dyb3VuZC1zaGFwZSc6ICdyZWN0YW5nbGUnLFxuICAgICd0ZXh0LWJhY2tncm91bmQtcGFkZGluZyc6IDAsXG4gICAgJ3RleHQtYm9yZGVyLW9wYWNpdHknOiAwLFxuICAgICd0ZXh0LWJvcmRlci13aWR0aCc6IDAsXG4gICAgJ3RleHQtYm9yZGVyLXN0eWxlJzogJ3NvbGlkJyxcbiAgICAndGV4dC1ib3JkZXItY29sb3InOiAnIzAwMCcsXG4gICAgJ2ZvbnQtZmFtaWx5JzogJ0hlbHZldGljYSBOZXVlLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYnLFxuICAgICdmb250LXN0eWxlJzogJ25vcm1hbCcsXG4gICAgJ2ZvbnQtd2VpZ2h0JzogJ25vcm1hbCcsXG4gICAgJ2ZvbnQtc2l6ZSc6IDE2LFxuICAgICdtaW4tem9vbWVkLWZvbnQtc2l6ZSc6IDAsXG4gICAgJ3RleHQtcm90YXRpb24nOiAnbm9uZScsXG4gICAgJ3NvdXJjZS10ZXh0LXJvdGF0aW9uJzogJ25vbmUnLFxuICAgICd0YXJnZXQtdGV4dC1yb3RhdGlvbic6ICdub25lJyxcbiAgICAndmlzaWJpbGl0eSc6ICd2aXNpYmxlJyxcbiAgICAnZGlzcGxheSc6ICdlbGVtZW50JyxcbiAgICAnb3BhY2l0eSc6IDEsXG4gICAgJ3otY29tcG91bmQtZGVwdGgnOiAnYXV0bycsXG4gICAgJ3otaW5kZXgtY29tcGFyZSc6ICdhdXRvJyxcbiAgICAnei1pbmRleCc6IDAsXG4gICAgJ2xhYmVsJzogJycsXG4gICAgJ3RleHQtbWFyZ2luLXgnOiAwLFxuICAgICd0ZXh0LW1hcmdpbi15JzogMCxcbiAgICAnc291cmNlLWxhYmVsJzogJycsXG4gICAgJ3NvdXJjZS10ZXh0LW9mZnNldCc6IDAsXG4gICAgJ3NvdXJjZS10ZXh0LW1hcmdpbi14JzogMCxcbiAgICAnc291cmNlLXRleHQtbWFyZ2luLXknOiAwLFxuICAgICd0YXJnZXQtbGFiZWwnOiAnJyxcbiAgICAndGFyZ2V0LXRleHQtb2Zmc2V0JzogMCxcbiAgICAndGFyZ2V0LXRleHQtbWFyZ2luLXgnOiAwLFxuICAgICd0YXJnZXQtdGV4dC1tYXJnaW4teSc6IDAsXG4gICAgJ292ZXJsYXktb3BhY2l0eSc6IDAsXG4gICAgJ292ZXJsYXktY29sb3InOiAnIzAwMCcsXG4gICAgJ292ZXJsYXktcGFkZGluZyc6IDEwLFxuICAgICdvdmVybGF5LXNoYXBlJzogJ3JvdW5kLXJlY3RhbmdsZScsXG4gICAgJ3VuZGVybGF5LW9wYWNpdHknOiAwLFxuICAgICd1bmRlcmxheS1jb2xvcic6ICcjMDAwJyxcbiAgICAndW5kZXJsYXktcGFkZGluZyc6IDEwLFxuICAgICd1bmRlcmxheS1zaGFwZSc6ICdyb3VuZC1yZWN0YW5nbGUnLFxuICAgICd0cmFuc2l0aW9uLXByb3BlcnR5JzogJ25vbmUnLFxuICAgICd0cmFuc2l0aW9uLWR1cmF0aW9uJzogMCxcbiAgICAndHJhbnNpdGlvbi1kZWxheSc6IDAsXG4gICAgJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJzogJ2xpbmVhcicsXG4gICAgLy8gbm9kZSBwcm9wc1xuICAgICdiYWNrZ3JvdW5kLWJsYWNrZW4nOiAwLFxuICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJyM5OTknLFxuICAgICdiYWNrZ3JvdW5kLWZpbGwnOiAnc29saWQnLFxuICAgICdiYWNrZ3JvdW5kLW9wYWNpdHknOiAxLFxuICAgICdiYWNrZ3JvdW5kLWltYWdlJzogJ25vbmUnLFxuICAgICdiYWNrZ3JvdW5kLWltYWdlLWNyb3Nzb3JpZ2luJzogJ2Fub255bW91cycsXG4gICAgJ2JhY2tncm91bmQtaW1hZ2Utb3BhY2l0eSc6IDEsXG4gICAgJ2JhY2tncm91bmQtaW1hZ2UtY29udGFpbm1lbnQnOiAnaW5zaWRlJyxcbiAgICAnYmFja2dyb3VuZC1pbWFnZS1zbW9vdGhpbmcnOiAneWVzJyxcbiAgICAnYmFja2dyb3VuZC1wb3NpdGlvbi14JzogJzUwJScsXG4gICAgJ2JhY2tncm91bmQtcG9zaXRpb24teSc6ICc1MCUnLFxuICAgICdiYWNrZ3JvdW5kLW9mZnNldC14JzogMCxcbiAgICAnYmFja2dyb3VuZC1vZmZzZXQteSc6IDAsXG4gICAgJ2JhY2tncm91bmQtd2lkdGgtcmVsYXRpdmUtdG8nOiAnaW5jbHVkZS1wYWRkaW5nJyxcbiAgICAnYmFja2dyb3VuZC1oZWlnaHQtcmVsYXRpdmUtdG8nOiAnaW5jbHVkZS1wYWRkaW5nJyxcbiAgICAnYmFja2dyb3VuZC1yZXBlYXQnOiAnbm8tcmVwZWF0JyxcbiAgICAnYmFja2dyb3VuZC1maXQnOiAnbm9uZScsXG4gICAgJ2JhY2tncm91bmQtY2xpcCc6ICdub2RlJyxcbiAgICAnYmFja2dyb3VuZC13aWR0aCc6ICdhdXRvJyxcbiAgICAnYmFja2dyb3VuZC1oZWlnaHQnOiAnYXV0bycsXG4gICAgJ2JvcmRlci1jb2xvcic6ICcjMDAwJyxcbiAgICAnYm9yZGVyLW9wYWNpdHknOiAxLFxuICAgICdib3JkZXItd2lkdGgnOiAwLFxuICAgICdib3JkZXItc3R5bGUnOiAnc29saWQnLFxuICAgICdoZWlnaHQnOiAzMCxcbiAgICAnd2lkdGgnOiAzMCxcbiAgICAnc2hhcGUnOiAnZWxsaXBzZScsXG4gICAgJ3NoYXBlLXBvbHlnb24tcG9pbnRzJzogJy0xLCAtMSwgICAxLCAtMSwgICAxLCAxLCAgIC0xLCAxJyxcbiAgICAnYm91bmRzLWV4cGFuc2lvbic6IDAsXG4gICAgLy8gbm9kZSBncmFkaWVudFxuICAgICdiYWNrZ3JvdW5kLWdyYWRpZW50LWRpcmVjdGlvbic6ICd0by1ib3R0b20nLFxuICAgICdiYWNrZ3JvdW5kLWdyYWRpZW50LXN0b3AtY29sb3JzJzogJyM5OTknLFxuICAgICdiYWNrZ3JvdW5kLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJzogJzAlJyxcbiAgICAvLyBnaG9zdCBwcm9wc1xuICAgICdnaG9zdCc6ICdubycsXG4gICAgJ2dob3N0LW9mZnNldC15JzogMCxcbiAgICAnZ2hvc3Qtb2Zmc2V0LXgnOiAwLFxuICAgICdnaG9zdC1vcGFjaXR5JzogMCxcbiAgICAvLyBjb21wb3VuZCBwcm9wc1xuICAgICdwYWRkaW5nJzogMCxcbiAgICAncGFkZGluZy1yZWxhdGl2ZS10byc6ICd3aWR0aCcsXG4gICAgJ3Bvc2l0aW9uJzogJ29yaWdpbicsXG4gICAgJ2NvbXBvdW5kLXNpemluZy13cnQtbGFiZWxzJzogJ2luY2x1ZGUnLFxuICAgICdtaW4td2lkdGgnOiAwLFxuICAgICdtaW4td2lkdGgtYmlhcy1sZWZ0JzogMCxcbiAgICAnbWluLXdpZHRoLWJpYXMtcmlnaHQnOiAwLFxuICAgICdtaW4taGVpZ2h0JzogMCxcbiAgICAnbWluLWhlaWdodC1iaWFzLXRvcCc6IDAsXG4gICAgJ21pbi1oZWlnaHQtYmlhcy1ib3R0b20nOiAwXG4gIH0sIHtcbiAgICAvLyBub2RlIHBpZSBiZ1xuICAgICdwaWUtc2l6ZSc6ICcxMDAlJ1xuICB9LCBbe1xuICAgIG5hbWU6ICdwaWUte3tpfX0tYmFja2dyb3VuZC1jb2xvcicsXG4gICAgdmFsdWU6ICdibGFjaydcbiAgfSwge1xuICAgIG5hbWU6ICdwaWUte3tpfX0tYmFja2dyb3VuZC1zaXplJyxcbiAgICB2YWx1ZTogJzAlJ1xuICB9LCB7XG4gICAgbmFtZTogJ3BpZS17e2l9fS1iYWNrZ3JvdW5kLW9wYWNpdHknLFxuICAgIHZhbHVlOiAxXG4gIH1dLnJlZHVjZShmdW5jdGlvbiAoY3NzLCBwcm9wKSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gc3R5Zm4kMi5waWVCYWNrZ3JvdW5kTjsgaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IHByb3AubmFtZS5yZXBsYWNlKCd7e2l9fScsIGkpO1xuICAgICAgdmFyIHZhbCA9IHByb3AudmFsdWU7XG4gICAgICBjc3NbbmFtZV0gPSB2YWw7XG4gICAgfVxuICAgIHJldHVybiBjc3M7XG4gIH0sIHt9KSwge1xuICAgIC8vIGVkZ2UgcHJvcHNcbiAgICAnbGluZS1zdHlsZSc6ICdzb2xpZCcsXG4gICAgJ2xpbmUtY29sb3InOiAnIzk5OScsXG4gICAgJ2xpbmUtZmlsbCc6ICdzb2xpZCcsXG4gICAgJ2xpbmUtY2FwJzogJ2J1dHQnLFxuICAgICdsaW5lLW9wYWNpdHknOiAxLFxuICAgICdsaW5lLWdyYWRpZW50LXN0b3AtY29sb3JzJzogJyM5OTknLFxuICAgICdsaW5lLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJzogJzAlJyxcbiAgICAnY29udHJvbC1wb2ludC1zdGVwLXNpemUnOiA0MCxcbiAgICAnY29udHJvbC1wb2ludC13ZWlnaHRzJzogMC41LFxuICAgICdzZWdtZW50LXdlaWdodHMnOiAwLjUsXG4gICAgJ3NlZ21lbnQtZGlzdGFuY2VzJzogMjAsXG4gICAgJ3RheGktdHVybic6ICc1MCUnLFxuICAgICd0YXhpLXR1cm4tbWluLWRpc3RhbmNlJzogMTAsXG4gICAgJ3RheGktZGlyZWN0aW9uJzogJ2F1dG8nLFxuICAgICdlZGdlLWRpc3RhbmNlcyc6ICdpbnRlcnNlY3Rpb24nLFxuICAgICdjdXJ2ZS1zdHlsZSc6ICdoYXlzdGFjaycsXG4gICAgJ2hheXN0YWNrLXJhZGl1cyc6IDAsXG4gICAgJ2Fycm93LXNjYWxlJzogMSxcbiAgICAnbG9vcC1kaXJlY3Rpb24nOiAnLTQ1ZGVnJyxcbiAgICAnbG9vcC1zd2VlcCc6ICctOTBkZWcnLFxuICAgICdzb3VyY2UtZGlzdGFuY2UtZnJvbS1ub2RlJzogMCxcbiAgICAndGFyZ2V0LWRpc3RhbmNlLWZyb20tbm9kZSc6IDAsXG4gICAgJ3NvdXJjZS1lbmRwb2ludCc6ICdvdXRzaWRlLXRvLW5vZGUnLFxuICAgICd0YXJnZXQtZW5kcG9pbnQnOiAnb3V0c2lkZS10by1ub2RlJyxcbiAgICAnbGluZS1kYXNoLXBhdHRlcm4nOiBbNiwgM10sXG4gICAgJ2xpbmUtZGFzaC1vZmZzZXQnOiAwXG4gIH0sIFt7XG4gICAgbmFtZTogJ2Fycm93LXNoYXBlJyxcbiAgICB2YWx1ZTogJ25vbmUnXG4gIH0sIHtcbiAgICBuYW1lOiAnYXJyb3ctY29sb3InLFxuICAgIHZhbHVlOiAnIzk5OSdcbiAgfSwge1xuICAgIG5hbWU6ICdhcnJvdy1maWxsJyxcbiAgICB2YWx1ZTogJ2ZpbGxlZCdcbiAgfV0ucmVkdWNlKGZ1bmN0aW9uIChjc3MsIHByb3ApIHtcbiAgICBzdHlmbiQyLmFycm93UHJlZml4ZXMuZm9yRWFjaChmdW5jdGlvbiAocHJlZml4KSB7XG4gICAgICB2YXIgbmFtZSA9IHByZWZpeCArICctJyArIHByb3AubmFtZTtcbiAgICAgIHZhciB2YWwgPSBwcm9wLnZhbHVlO1xuICAgICAgY3NzW25hbWVdID0gdmFsO1xuICAgIH0pO1xuICAgIHJldHVybiBjc3M7XG4gIH0sIHt9KSk7XG4gIHZhciBwYXJzZWRQcm9wcyA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwcm9wID0gdGhpcy5wcm9wZXJ0aWVzW2ldO1xuICAgIGlmIChwcm9wLnBvaW50c1RvKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIG5hbWUgPSBwcm9wLm5hbWU7XG4gICAgdmFyIHZhbCA9IHJhd1Byb3BzW25hbWVdO1xuICAgIHZhciBwYXJzZWRQcm9wID0gdGhpcy5wYXJzZShuYW1lLCB2YWwpO1xuICAgIHBhcnNlZFByb3BzW25hbWVdID0gcGFyc2VkUHJvcDtcbiAgfVxuICBfcC5kZWZhdWx0UHJvcGVydGllcyA9IHBhcnNlZFByb3BzO1xuICByZXR1cm4gX3AuZGVmYXVsdFByb3BlcnRpZXM7XG59O1xuc3R5Zm4kMi5hZGREZWZhdWx0U3R5bGVzaGVldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zZWxlY3RvcignOnBhcmVudCcpLmNzcyh7XG4gICAgJ3NoYXBlJzogJ3JlY3RhbmdsZScsXG4gICAgJ3BhZGRpbmcnOiAxMCxcbiAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjZWVlJyxcbiAgICAnYm9yZGVyLWNvbG9yJzogJyNjY2MnLFxuICAgICdib3JkZXItd2lkdGgnOiAxXG4gIH0pLnNlbGVjdG9yKCdlZGdlJykuY3NzKHtcbiAgICAnd2lkdGgnOiAzXG4gIH0pLnNlbGVjdG9yKCc6bG9vcCcpLmNzcyh7XG4gICAgJ2N1cnZlLXN0eWxlJzogJ2JlemllcidcbiAgfSkuc2VsZWN0b3IoJ2VkZ2U6Y29tcG91bmQnKS5jc3Moe1xuICAgICdjdXJ2ZS1zdHlsZSc6ICdiZXppZXInLFxuICAgICdzb3VyY2UtZW5kcG9pbnQnOiAnb3V0c2lkZS10by1saW5lJyxcbiAgICAndGFyZ2V0LWVuZHBvaW50JzogJ291dHNpZGUtdG8tbGluZSdcbiAgfSkuc2VsZWN0b3IoJzpzZWxlY3RlZCcpLmNzcyh7XG4gICAgJ2JhY2tncm91bmQtY29sb3InOiAnIzAxNjlEOScsXG4gICAgJ2xpbmUtY29sb3InOiAnIzAxNjlEOScsXG4gICAgJ3NvdXJjZS1hcnJvdy1jb2xvcic6ICcjMDE2OUQ5JyxcbiAgICAndGFyZ2V0LWFycm93LWNvbG9yJzogJyMwMTY5RDknLFxuICAgICdtaWQtc291cmNlLWFycm93LWNvbG9yJzogJyMwMTY5RDknLFxuICAgICdtaWQtdGFyZ2V0LWFycm93LWNvbG9yJzogJyMwMTY5RDknXG4gIH0pLnNlbGVjdG9yKCc6cGFyZW50OnNlbGVjdGVkJykuY3NzKHtcbiAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjQ0NFMUY5JyxcbiAgICAnYm9yZGVyLWNvbG9yJzogJyNhZWM4ZTUnXG4gIH0pLnNlbGVjdG9yKCc6YWN0aXZlJykuY3NzKHtcbiAgICAnb3ZlcmxheS1jb2xvcic6ICdibGFjaycsXG4gICAgJ292ZXJsYXktcGFkZGluZyc6IDEwLFxuICAgICdvdmVybGF5LW9wYWNpdHknOiAwLjI1XG4gIH0pO1xuICB0aGlzLmRlZmF1bHRMZW5ndGggPSB0aGlzLmxlbmd0aDtcbn07XG5cbnZhciBzdHlmbiQxID0ge307XG5cbi8vIGEgY2FjaGluZyBsYXllciBmb3IgcHJvcGVydHkgcGFyc2luZ1xuc3R5Zm4kMS5wYXJzZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgcHJvcElzQnlwYXNzLCBwcm9wSXNGbGF0KSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvLyBmdW5jdGlvbiB2YWx1ZXMgY2FuJ3QgYmUgY2FjaGVkIGluIGFsbCBjYXNlcywgYW5kIHRoZXJlIGlzbid0IG11Y2ggYmVuZWZpdCBvZiBjYWNoaW5nIHRoZW0gYW55d2F5XG4gIGlmIChmbiQ2KHZhbHVlKSkge1xuICAgIHJldHVybiBzZWxmLnBhcnNlSW1wbFdhcm4obmFtZSwgdmFsdWUsIHByb3BJc0J5cGFzcywgcHJvcElzRmxhdCk7XG4gIH1cbiAgdmFyIGZsYXRLZXkgPSBwcm9wSXNGbGF0ID09PSAnbWFwcGluZycgfHwgcHJvcElzRmxhdCA9PT0gdHJ1ZSB8fCBwcm9wSXNGbGF0ID09PSBmYWxzZSB8fCBwcm9wSXNGbGF0ID09IG51bGwgPyAnZG9udGNhcmUnIDogcHJvcElzRmxhdDtcbiAgdmFyIGJ5cGFzc0tleSA9IHByb3BJc0J5cGFzcyA/ICd0JyA6ICdmJztcbiAgdmFyIHZhbHVlS2V5ID0gJycgKyB2YWx1ZTtcbiAgdmFyIGFyZ0hhc2ggPSBoYXNoU3RyaW5ncyhuYW1lLCB2YWx1ZUtleSwgYnlwYXNzS2V5LCBmbGF0S2V5KTtcbiAgdmFyIHByb3BDYWNoZSA9IHNlbGYucHJvcENhY2hlID0gc2VsZi5wcm9wQ2FjaGUgfHwgW107XG4gIHZhciByZXQ7XG4gIGlmICghKHJldCA9IHByb3BDYWNoZVthcmdIYXNoXSkpIHtcbiAgICByZXQgPSBwcm9wQ2FjaGVbYXJnSGFzaF0gPSBzZWxmLnBhcnNlSW1wbFdhcm4obmFtZSwgdmFsdWUsIHByb3BJc0J5cGFzcywgcHJvcElzRmxhdCk7XG4gIH1cblxuICAvLyAtIGJ5cGFzc2VzIGNhbid0IGJlIHNoYXJlZCBiL2MgdGhlIHZhbHVlIGNhbiBiZSBjaGFuZ2VkIGJ5IGFuaW1hdGlvbnMgb3Igb3RoZXJ3aXNlIG92ZXJyaWRkZW5cbiAgLy8gLSBtYXBwaW5ncyBjYW4ndCBiZSBzaGFyZWQgYi9jIG1hcHBpbmdzIGFyZSBwZXItZWxlbWVudFxuICBpZiAocHJvcElzQnlwYXNzIHx8IHByb3BJc0ZsYXQgPT09ICdtYXBwaW5nJykge1xuICAgIC8vIG5lZWQgYSBjb3B5IHNpbmNlIHByb3BzIGFyZSBtdXRhdGVkIGxhdGVyIGluIHRoZWlyIGxpZmVjeWNsZXNcbiAgICByZXQgPSBjb3B5KHJldCk7XG4gICAgaWYgKHJldCkge1xuICAgICAgcmV0LnZhbHVlID0gY29weShyZXQudmFsdWUpOyAvLyBiZWNhdXNlIGl0IGNvdWxkIGJlIGFuIGFycmF5LCBlLmcuIGNvbG91clxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59O1xuc3R5Zm4kMS5wYXJzZUltcGxXYXJuID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBwcm9wSXNCeXBhc3MsIHByb3BJc0ZsYXQpIHtcbiAgdmFyIHByb3AgPSB0aGlzLnBhcnNlSW1wbChuYW1lLCB2YWx1ZSwgcHJvcElzQnlwYXNzLCBwcm9wSXNGbGF0KTtcbiAgaWYgKCFwcm9wICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICB3YXJuKFwiVGhlIHN0eWxlIHByb3BlcnR5IGBcIi5jb25jYXQobmFtZSwgXCI6IFwiKS5jb25jYXQodmFsdWUsIFwiYCBpcyBpbnZhbGlkXCIpKTtcbiAgfVxuICBpZiAocHJvcCAmJiAocHJvcC5uYW1lID09PSAnd2lkdGgnIHx8IHByb3AubmFtZSA9PT0gJ2hlaWdodCcpICYmIHZhbHVlID09PSAnbGFiZWwnKSB7XG4gICAgd2FybignVGhlIHN0eWxlIHZhbHVlIG9mIGBsYWJlbGAgaXMgZGVwcmVjYXRlZCBmb3IgYCcgKyBwcm9wLm5hbWUgKyAnYCcpO1xuICB9XG4gIHJldHVybiBwcm9wO1xufTtcblxuLy8gcGFyc2UgYSBwcm9wZXJ0eTsgcmV0dXJuIG51bGwgb24gaW52YWxpZDsgcmV0dXJuIHBhcnNlZCBwcm9wZXJ0eSBvdGhlcndpc2Vcbi8vIGZpZWxkcyA6XG4vLyAtIG5hbWUgOiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHlcbi8vIC0gdmFsdWUgOiB0aGUgcGFyc2VkLCBuYXRpdmUtdHlwZWQgdmFsdWUgb2YgdGhlIHByb3BlcnR5XG4vLyAtIHN0clZhbHVlIDogYSBzdHJpbmcgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpbiB2YWxpZCBjc3Ncbi8vIC0gYnlwYXNzIDogdHJ1ZSBpZmYgdGhlIHByb3BlcnR5IGlzIGEgYnlwYXNzIHByb3BlcnR5XG5zdHlmbiQxLnBhcnNlSW1wbCA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgcHJvcElzQnlwYXNzLCBwcm9wSXNGbGF0KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgbmFtZSA9IGNhbWVsMmRhc2gobmFtZSk7IC8vIG1ha2Ugc3VyZSB0aGUgcHJvcGVydHkgbmFtZSBpcyBpbiBkYXNoIGZvcm0gKGUuZy4gJ3Byb3BlcnR5LW5hbWUnIG5vdCAncHJvcGVydHlOYW1lJylcblxuICB2YXIgcHJvcGVydHkgPSBzZWxmLnByb3BlcnRpZXNbbmFtZV07XG4gIHZhciBwYXNzZWRWYWx1ZSA9IHZhbHVlO1xuICB2YXIgdHlwZXMgPSBzZWxmLnR5cGVzO1xuICBpZiAoIXByb3BlcnR5KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gcmV0dXJuIG51bGwgb24gcHJvcGVydHkgb2YgdW5rbm93biBuYW1lXG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gY2FuJ3QgYXNzaWduIHVuZGVmaW5lZFxuXG4gIC8vIHRoZSBwcm9wZXJ0eSBtYXkgYmUgYW4gYWxpYXNcbiAgaWYgKHByb3BlcnR5LmFsaWFzKSB7XG4gICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5wb2ludHNUbztcbiAgICBuYW1lID0gcHJvcGVydHkubmFtZTtcbiAgfVxuICB2YXIgdmFsdWVJc1N0cmluZyA9IHN0cmluZyh2YWx1ZSk7XG4gIGlmICh2YWx1ZUlzU3RyaW5nKSB7XG4gICAgLy8gdHJpbSB0aGUgdmFsdWUgdG8gbWFrZSBwYXJzaW5nIGVhc2llclxuICAgIHZhbHVlID0gdmFsdWUudHJpbSgpO1xuICB9XG4gIHZhciB0eXBlID0gcHJvcGVydHkudHlwZTtcbiAgaWYgKCF0eXBlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gbm8gdHlwZSwgbm8gbHVja1xuXG4gIC8vIGNoZWNrIGlmIGJ5cGFzcyBpcyBudWxsIG9yIGVtcHR5IHN0cmluZyAoaS5lLiBpbmRpY2F0aW9uIHRvIGRlbGV0ZSBieXBhc3MgcHJvcGVydHkpXG4gIGlmIChwcm9wSXNCeXBhc3MgJiYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbnVsbCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGJ5cGFzczogdHJ1ZSxcbiAgICAgIGRlbGV0ZUJ5cGFzczogdHJ1ZVxuICAgIH07XG4gIH1cblxuICAvLyBjaGVjayBpZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uIHVzZWQgYXMgYSBtYXBwZXJcbiAgaWYgKGZuJDYodmFsdWUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBzdHJWYWx1ZTogJ2ZuJyxcbiAgICAgIG1hcHBlZDogdHlwZXMuZm4sXG4gICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgIH07XG4gIH1cblxuICAvLyBjaGVjayBpZiB2YWx1ZSBpcyBtYXBwZWRcbiAgdmFyIGRhdGEsIG1hcERhdGE7XG4gIGlmICghdmFsdWVJc1N0cmluZyB8fCBwcm9wSXNGbGF0IHx8IHZhbHVlLmxlbmd0aCA8IDcgfHwgdmFsdWVbMV0gIT09ICdhJykgOyBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPj0gNyAmJiB2YWx1ZVswXSA9PT0gJ2QnICYmIChkYXRhID0gbmV3IFJlZ0V4cCh0eXBlcy5kYXRhLnJlZ2V4KS5leGVjKHZhbHVlKSkpIHtcbiAgICBpZiAocHJvcElzQnlwYXNzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBtYXBwZXJzIG5vdCBhbGxvd2VkIGluIGJ5cGFzc1xuXG4gICAgdmFyIG1hcHBlZCA9IHR5cGVzLmRhdGE7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogZGF0YSxcbiAgICAgIHN0clZhbHVlOiAnJyArIHZhbHVlLFxuICAgICAgbWFwcGVkOiBtYXBwZWQsXG4gICAgICBmaWVsZDogZGF0YVsxXSxcbiAgICAgIGJ5cGFzczogcHJvcElzQnlwYXNzXG4gICAgfTtcbiAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPj0gMTAgJiYgdmFsdWVbMF0gPT09ICdtJyAmJiAobWFwRGF0YSA9IG5ldyBSZWdFeHAodHlwZXMubWFwRGF0YS5yZWdleCkuZXhlYyh2YWx1ZSkpKSB7XG4gICAgaWYgKHByb3BJc0J5cGFzcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gbWFwcGVycyBub3QgYWxsb3dlZCBpbiBieXBhc3NcbiAgICBpZiAodHlwZS5tdWx0aXBsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gaW1wb3NzaWJsZSB0byBtYXAgdG8gbnVtXG5cbiAgICB2YXIgX21hcHBlZCA9IHR5cGVzLm1hcERhdGE7XG5cbiAgICAvLyB3ZSBjYW4gbWFwIG9ubHkgaWYgdGhlIHR5cGUgaXMgYSBjb2xvdXIgb3IgYSBudW1iZXJcbiAgICBpZiAoISh0eXBlLmNvbG9yIHx8IHR5cGUubnVtYmVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgdmFsdWVNaW4gPSB0aGlzLnBhcnNlKG5hbWUsIG1hcERhdGFbNF0pOyAvLyBwYXJzZSB0byB2YWxpZGF0ZVxuICAgIGlmICghdmFsdWVNaW4gfHwgdmFsdWVNaW4ubWFwcGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBjYW4ndCBiZSBpbnZhbGlkIG9yIG1hcHBlZFxuXG4gICAgdmFyIHZhbHVlTWF4ID0gdGhpcy5wYXJzZShuYW1lLCBtYXBEYXRhWzVdKTsgLy8gcGFyc2UgdG8gdmFsaWRhdGVcbiAgICBpZiAoIXZhbHVlTWF4IHx8IHZhbHVlTWF4Lm1hcHBlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gY2FuJ3QgYmUgaW52YWxpZCBvciBtYXBwZWRcblxuICAgIC8vIGNoZWNrIGlmIHZhbHVlTWluIGFuZCB2YWx1ZU1heCBhcmUgdGhlIHNhbWVcbiAgICBpZiAodmFsdWVNaW4ucGZWYWx1ZSA9PT0gdmFsdWVNYXgucGZWYWx1ZSB8fCB2YWx1ZU1pbi5zdHJWYWx1ZSA9PT0gdmFsdWVNYXguc3RyVmFsdWUpIHtcbiAgICAgIHdhcm4oJ2AnICsgbmFtZSArICc6ICcgKyB2YWx1ZSArICdgIGlzIG5vdCBhIHZhbGlkIG1hcHBlciBiZWNhdXNlIHRoZSBvdXRwdXQgcmFuZ2UgaXMgemVybzsgY29udmVydGluZyB0byBgJyArIG5hbWUgKyAnOiAnICsgdmFsdWVNaW4uc3RyVmFsdWUgKyAnYCcpO1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2UobmFtZSwgdmFsdWVNaW4uc3RyVmFsdWUpOyAvLyBjYW4ndCBtYWtlIG11Y2ggb2YgYSBtYXBwZXIgd2l0aG91dCBhIHJhbmdlXG4gICAgfSBlbHNlIGlmICh0eXBlLmNvbG9yKSB7XG4gICAgICB2YXIgYzEgPSB2YWx1ZU1pbi52YWx1ZTtcbiAgICAgIHZhciBjMiA9IHZhbHVlTWF4LnZhbHVlO1xuICAgICAgdmFyIHNhbWUgPSBjMVswXSA9PT0gYzJbMF0gLy8gcmVkXG4gICAgICAmJiBjMVsxXSA9PT0gYzJbMV0gLy8gZ3JlZW5cbiAgICAgICYmIGMxWzJdID09PSBjMlsyXSAvLyBibHVlXG4gICAgICAmJiAoXG4gICAgICAvLyBvcHRpb25hbCBhbHBoYVxuICAgICAgYzFbM10gPT09IGMyWzNdIC8vIHNhbWUgYWxwaGEgb3V0cmlnaHRcbiAgICAgIHx8IChjMVszXSA9PSBudWxsIHx8IGMxWzNdID09PSAxIC8vIGZ1bGwgb3BhY2l0eSBmb3IgY29sb3VyIDE/XG4gICAgICApICYmIChjMlszXSA9PSBudWxsIHx8IGMyWzNdID09PSAxKSAvLyBmdWxsIG9wYWNpdHkgZm9yIGNvbG91ciAyP1xuICAgICAgKTtcblxuICAgICAgaWYgKHNhbWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSAvLyBjYW4ndCBtYWtlIGEgbWFwcGVyIHdpdGhvdXQgYSByYW5nZVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IG1hcERhdGEsXG4gICAgICBzdHJWYWx1ZTogJycgKyB2YWx1ZSxcbiAgICAgIG1hcHBlZDogX21hcHBlZCxcbiAgICAgIGZpZWxkOiBtYXBEYXRhWzFdLFxuICAgICAgZmllbGRNaW46IHBhcnNlRmxvYXQobWFwRGF0YVsyXSksXG4gICAgICAvLyBtaW4gJiBtYXggYXJlIG51bWVyaWNcbiAgICAgIGZpZWxkTWF4OiBwYXJzZUZsb2F0KG1hcERhdGFbM10pLFxuICAgICAgdmFsdWVNaW46IHZhbHVlTWluLnZhbHVlLFxuICAgICAgdmFsdWVNYXg6IHZhbHVlTWF4LnZhbHVlLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlLm11bHRpcGxlICYmIHByb3BJc0ZsYXQgIT09ICdtdWx0aXBsZScpIHtcbiAgICB2YXIgdmFscztcbiAgICBpZiAodmFsdWVJc1N0cmluZykge1xuICAgICAgdmFscyA9IHZhbHVlLnNwbGl0KC9cXHMrLyk7XG4gICAgfSBlbHNlIGlmIChhcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHMgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFscyA9IFt2YWx1ZV07XG4gICAgfVxuICAgIGlmICh0eXBlLmV2ZW5NdWx0aXBsZSAmJiB2YWxzLmxlbmd0aCAlIDIgIT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgdmFsQXJyID0gW107XG4gICAgdmFyIHVuaXRzQXJyID0gW107XG4gICAgdmFyIHBmVmFsQXJyID0gW107XG4gICAgdmFyIHN0clZhbCA9ICcnO1xuICAgIHZhciBoYXNFbnVtID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcCA9IHNlbGYucGFyc2UobmFtZSwgdmFsc1tpXSwgcHJvcElzQnlwYXNzLCAnbXVsdGlwbGUnKTtcbiAgICAgIGhhc0VudW0gPSBoYXNFbnVtIHx8IHN0cmluZyhwLnZhbHVlKTtcbiAgICAgIHZhbEFyci5wdXNoKHAudmFsdWUpO1xuICAgICAgcGZWYWxBcnIucHVzaChwLnBmVmFsdWUgIT0gbnVsbCA/IHAucGZWYWx1ZSA6IHAudmFsdWUpO1xuICAgICAgdW5pdHNBcnIucHVzaChwLnVuaXRzKTtcbiAgICAgIHN0clZhbCArPSAoaSA+IDAgPyAnICcgOiAnJykgKyBwLnN0clZhbHVlO1xuICAgIH1cbiAgICBpZiAodHlwZS52YWxpZGF0ZSAmJiAhdHlwZS52YWxpZGF0ZSh2YWxBcnIsIHVuaXRzQXJyKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0eXBlLnNpbmdsZUVudW0gJiYgaGFzRW51bSkge1xuICAgICAgaWYgKHZhbEFyci5sZW5ndGggPT09IDEgJiYgc3RyaW5nKHZhbEFyclswXSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgIHZhbHVlOiB2YWxBcnJbMF0sXG4gICAgICAgICAgc3RyVmFsdWU6IHZhbEFyclswXSxcbiAgICAgICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IHZhbEFycixcbiAgICAgIHBmVmFsdWU6IHBmVmFsQXJyLFxuICAgICAgc3RyVmFsdWU6IHN0clZhbCxcbiAgICAgIGJ5cGFzczogcHJvcElzQnlwYXNzLFxuICAgICAgdW5pdHM6IHVuaXRzQXJyXG4gICAgfTtcbiAgfVxuXG4gIC8vIHNldmVyYWwgdHlwZXMgYWxzbyBhbGxvdyBlbnVtc1xuICB2YXIgY2hlY2tFbnVtcyA9IGZ1bmN0aW9uIGNoZWNrRW51bXMoKSB7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHR5cGUuZW51bXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgZW4gPSB0eXBlLmVudW1zW19pXTtcbiAgICAgIGlmIChlbiA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBzdHJWYWx1ZTogJycgKyB2YWx1ZSxcbiAgICAgICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICAvLyBjaGVjayB0aGUgdHlwZSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBvYmplY3RcbiAgaWYgKHR5cGUubnVtYmVyKSB7XG4gICAgdmFyIHVuaXRzO1xuICAgIHZhciBpbXBsaWNpdFVuaXRzID0gJ3B4JzsgLy8gbm90IHNldCA9PiBweFxuXG4gICAgaWYgKHR5cGUudW5pdHMpIHtcbiAgICAgIC8vIHVzZSBzcGVjaWZpZWQgdW5pdHMgaWYgc2V0XG4gICAgICB1bml0cyA9IHR5cGUudW5pdHM7XG4gICAgfVxuICAgIGlmICh0eXBlLmltcGxpY2l0VW5pdHMpIHtcbiAgICAgIGltcGxpY2l0VW5pdHMgPSB0eXBlLmltcGxpY2l0VW5pdHM7XG4gICAgfVxuICAgIGlmICghdHlwZS51bml0bGVzcykge1xuICAgICAgaWYgKHZhbHVlSXNTdHJpbmcpIHtcbiAgICAgICAgdmFyIHVuaXRzUmVnZXggPSAncHh8ZW0nICsgKHR5cGUuYWxsb3dQZXJjZW50ID8gJ3xcXFxcJScgOiAnJyk7XG4gICAgICAgIGlmICh1bml0cykge1xuICAgICAgICAgIHVuaXRzUmVnZXggPSB1bml0cztcbiAgICAgICAgfSAvLyBvbmx5IGFsbG93IGV4cGxpY2l0IHVuaXRzIGlmIHNvIHNldFxuICAgICAgICB2YXIgbWF0Y2ggPSB2YWx1ZS5tYXRjaCgnXignICsgbnVtYmVyICsgJykoJyArIHVuaXRzUmVnZXggKyAnKT8nICsgJyQnKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgdmFsdWUgPSBtYXRjaFsxXTtcbiAgICAgICAgICB1bml0cyA9IG1hdGNoWzJdIHx8IGltcGxpY2l0VW5pdHM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXVuaXRzIHx8IHR5cGUuaW1wbGljaXRVbml0cykge1xuICAgICAgICB1bml0cyA9IGltcGxpY2l0VW5pdHM7IC8vIGltcGxpY2l0bHkgcHggaWYgdW5zcGVjaWZpZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuXG4gICAgLy8gaWYgbm90IGEgbnVtYmVyIGFuZCBlbnVtcyBub3QgYWxsb3dlZCwgdGhlbiB0aGUgdmFsdWUgaXMgaW52YWxpZFxuICAgIGlmIChpc05hTih2YWx1ZSkgJiYgdHlwZS5lbnVtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiB0aGlzIG51bWJlciB0eXBlIGFsc28gYWNjZXB0cyBzcGVjaWFsIGtleXdvcmRzIGluIHBsYWNlIG9mIG51bWJlcnNcbiAgICAvLyAoaS5lLiBgbGVmdGAsIGBhdXRvYCwgZXRjKVxuICAgIGlmIChpc05hTih2YWx1ZSkgJiYgdHlwZS5lbnVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWx1ZSA9IHBhc3NlZFZhbHVlO1xuICAgICAgcmV0dXJuIGNoZWNrRW51bXMoKTtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiB2YWx1ZSBtdXN0IGJlIGFuIGludGVnZXJcbiAgICBpZiAodHlwZS5pbnRlZ2VyICYmICFpbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgdmFsdWUgaXMgd2l0aGluIHJhbmdlXG4gICAgaWYgKHR5cGUubWluICE9PSB1bmRlZmluZWQgJiYgKHZhbHVlIDwgdHlwZS5taW4gfHwgdHlwZS5zdHJpY3RNaW4gJiYgdmFsdWUgPT09IHR5cGUubWluKSB8fCB0eXBlLm1heCAhPT0gdW5kZWZpbmVkICYmICh2YWx1ZSA+IHR5cGUubWF4IHx8IHR5cGUuc3RyaWN0TWF4ICYmIHZhbHVlID09PSB0eXBlLm1heCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgcmV0ID0ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIHN0clZhbHVlOiAnJyArIHZhbHVlICsgKHVuaXRzID8gdW5pdHMgOiAnJyksXG4gICAgICB1bml0czogdW5pdHMsXG4gICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgIH07XG5cbiAgICAvLyBub3JtYWxpc2UgdmFsdWUgaW4gcGl4ZWxzXG4gICAgaWYgKHR5cGUudW5pdGxlc3MgfHwgdW5pdHMgIT09ICdweCcgJiYgdW5pdHMgIT09ICdlbScpIHtcbiAgICAgIHJldC5wZlZhbHVlID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldC5wZlZhbHVlID0gdW5pdHMgPT09ICdweCcgfHwgIXVuaXRzID8gdmFsdWUgOiB0aGlzLmdldEVtU2l6ZUluUGl4ZWxzKCkgKiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBub3JtYWxpc2UgdmFsdWUgaW4gbXNcbiAgICBpZiAodW5pdHMgPT09ICdtcycgfHwgdW5pdHMgPT09ICdzJykge1xuICAgICAgcmV0LnBmVmFsdWUgPSB1bml0cyA9PT0gJ21zJyA/IHZhbHVlIDogMTAwMCAqIHZhbHVlO1xuICAgIH1cblxuICAgIC8vIG5vcm1hbGlzZSB2YWx1ZSBpbiByYWRcbiAgICBpZiAodW5pdHMgPT09ICdkZWcnIHx8IHVuaXRzID09PSAncmFkJykge1xuICAgICAgcmV0LnBmVmFsdWUgPSB1bml0cyA9PT0gJ3JhZCcgPyB2YWx1ZSA6IGRlZzJyYWQodmFsdWUpO1xuICAgIH1cblxuICAgIC8vIG5vcm1hbGl6ZSB2YWx1ZSBpbiAlXG4gICAgaWYgKHVuaXRzID09PSAnJScpIHtcbiAgICAgIHJldC5wZlZhbHVlID0gdmFsdWUgLyAxMDA7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH0gZWxzZSBpZiAodHlwZS5wcm9wTGlzdCkge1xuICAgIHZhciBwcm9wcyA9IFtdO1xuICAgIHZhciBwcm9wc1N0ciA9ICcnICsgdmFsdWU7XG4gICAgaWYgKHByb3BzU3RyID09PSAnbm9uZScpIDsgZWxzZSB7XG4gICAgICAvLyBnbyBvdmVyIGVhY2ggcHJvcFxuXG4gICAgICB2YXIgcHJvcHNTcGxpdCA9IHByb3BzU3RyLnNwbGl0KC9cXHMqLFxccyp8XFxzKy8pO1xuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgcHJvcHNTcGxpdC5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIHZhciBwcm9wTmFtZSA9IHByb3BzU3BsaXRbX2kyXS50cmltKCk7XG4gICAgICAgIGlmIChzZWxmLnByb3BlcnRpZXNbcHJvcE5hbWVdKSB7XG4gICAgICAgICAgcHJvcHMucHVzaChwcm9wTmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2FybignYCcgKyBwcm9wTmFtZSArICdgIGlzIG5vdCBhIHZhbGlkIHByb3BlcnR5IG5hbWUnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogcHJvcHMsXG4gICAgICBzdHJWYWx1ZTogcHJvcHMubGVuZ3RoID09PSAwID8gJ25vbmUnIDogcHJvcHMuam9pbignICcpLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuICB9IGVsc2UgaWYgKHR5cGUuY29sb3IpIHtcbiAgICB2YXIgdHVwbGUgPSBjb2xvcjJ0dXBsZSh2YWx1ZSk7XG4gICAgaWYgKCF0dXBsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IHR1cGxlLFxuICAgICAgcGZWYWx1ZTogdHVwbGUsXG4gICAgICBzdHJWYWx1ZTogJ3JnYignICsgdHVwbGVbMF0gKyAnLCcgKyB0dXBsZVsxXSArICcsJyArIHR1cGxlWzJdICsgJyknLFxuICAgICAgLy8gbi5iLiBubyBzcGFjZXMgYi9jIG9mIG11bHRpcGxlIHN1cHBvcnRcbiAgICAgIGJ5cGFzczogcHJvcElzQnlwYXNzXG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlLnJlZ2V4IHx8IHR5cGUucmVnZXhlcykge1xuICAgIC8vIGZpcnN0IGNoZWNrIGVudW1zXG4gICAgaWYgKHR5cGUuZW51bXMpIHtcbiAgICAgIHZhciBlbnVtUHJvcCA9IGNoZWNrRW51bXMoKTtcbiAgICAgIGlmIChlbnVtUHJvcCkge1xuICAgICAgICByZXR1cm4gZW51bVByb3A7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciByZWdleGVzID0gdHlwZS5yZWdleGVzID8gdHlwZS5yZWdleGVzIDogW3R5cGUucmVnZXhdO1xuICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IHJlZ2V4ZXMubGVuZ3RoOyBfaTMrKykge1xuICAgICAgdmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cChyZWdleGVzW19pM10pOyAvLyBtYWtlIGEgcmVnZXggZnJvbSB0aGUgdHlwZSBzdHJpbmdcbiAgICAgIHZhciBtID0gcmVnZXguZXhlYyh2YWx1ZSk7XG4gICAgICBpZiAobSkge1xuICAgICAgICAvLyByZWdleCBtYXRjaGVzXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICB2YWx1ZTogdHlwZS5zaW5nbGVSZWdleE1hdGNoVmFsdWUgPyBtWzFdIDogbSxcbiAgICAgICAgICBzdHJWYWx1ZTogJycgKyB2YWx1ZSxcbiAgICAgICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDsgLy8gZGlkbid0IG1hdGNoIGFueVxuICB9IGVsc2UgaWYgKHR5cGUuc3RyaW5nKSB7XG4gICAgLy8ganVzdCByZXR1cm5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiAnJyArIHZhbHVlLFxuICAgICAgc3RyVmFsdWU6ICcnICsgdmFsdWUsXG4gICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZS5lbnVtcykge1xuICAgIC8vIGNoZWNrIGVudW1zIGxhc3QgYmVjYXVzZSBpdCdzIGEgY29tYm8gdHlwZSBpbiBvdGhlcnNcbiAgICByZXR1cm4gY2hlY2tFbnVtcygpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsOyAvLyBub3QgYSB0eXBlIHdlIGNhbiBoYW5kbGVcbiAgfVxufTtcblxudmFyIFN0eWxlID0gZnVuY3Rpb24gU3R5bGUoY3kpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFN0eWxlKSkge1xuICAgIHJldHVybiBuZXcgU3R5bGUoY3kpO1xuICB9XG4gIGlmICghY29yZShjeSkpIHtcbiAgICBlcnJvcignQSBzdHlsZSBtdXN0IGhhdmUgYSBjb3JlIHJlZmVyZW5jZScpO1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLl9wcml2YXRlID0ge1xuICAgIGN5OiBjeSxcbiAgICBjb3JlU3R5bGU6IHt9XG4gIH07XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgdGhpcy5yZXNldFRvRGVmYXVsdCgpO1xufTtcbnZhciBzdHlmbiA9IFN0eWxlLnByb3RvdHlwZTtcbnN0eWZuLmluc3RhbmNlU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ3N0eWxlJztcbn07XG5cbi8vIHJlbW92ZSBhbGwgY29udGV4dHNcbnN0eWZuLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICB2YXIgY3kgPSBfcC5jeTtcbiAgdmFyIGVsZXMgPSBjeS5lbGVtZW50cygpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzW2ldID0gdW5kZWZpbmVkO1xuICB9XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgX3AuY29udGV4dFN0eWxlcyA9IHt9O1xuICBfcC5wcm9wRGlmZnMgPSB7fTtcbiAgdGhpcy5jbGVhbkVsZW1lbnRzKGVsZXMsIHRydWUpO1xuICBlbGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgIHZhciBlbGVfcCA9IGVsZVswXS5fcHJpdmF0ZTtcbiAgICBlbGVfcC5zdHlsZURpcnR5ID0gdHJ1ZTtcbiAgICBlbGVfcC5hcHBsaWVkSW5pdFN0eWxlID0gZmFsc2U7XG4gIH0pO1xuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbnN0eWZuLnJlc2V0VG9EZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNsZWFyKCk7XG4gIHRoaXMuYWRkRGVmYXVsdFN0eWxlc2hlZXQoKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBidWlsZHMgYSBzdHlsZSBvYmplY3QgZm9yIHRoZSAnY29yZScgc2VsZWN0b3JcbnN0eWZuLmNvcmUgPSBmdW5jdGlvbiAocHJvcE5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuY29yZVN0eWxlW3Byb3BOYW1lXSB8fCB0aGlzLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wTmFtZSk7XG59O1xuXG4vLyBjcmVhdGUgYSBuZXcgY29udGV4dCBmcm9tIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3Igc3RyaW5nIGFuZCBzd2l0Y2ggdG8gdGhhdCBjb250ZXh0XG5zdHlmbi5zZWxlY3RvciA9IGZ1bmN0aW9uIChzZWxlY3RvclN0cikge1xuICAvLyAnY29yZScgaXMgYSBzcGVjaWFsIGNhc2UgYW5kIGRvZXMgbm90IG5lZWQgYSBzZWxlY3RvclxuICB2YXIgc2VsZWN0b3IgPSBzZWxlY3RvclN0ciA9PT0gJ2NvcmUnID8gbnVsbCA6IG5ldyBTZWxlY3RvcihzZWxlY3RvclN0cik7XG4gIHZhciBpID0gdGhpcy5sZW5ndGgrKzsgLy8gbmV3IGNvbnRleHQgbWVhbnMgbmV3IGluZGV4XG4gIHRoaXNbaV0gPSB7XG4gICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgIHByb3BlcnRpZXM6IFtdLFxuICAgIG1hcHBlZFByb3BlcnRpZXM6IFtdLFxuICAgIGluZGV4OiBpXG4gIH07XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxuLy8gYWRkIG9uZSBvciBtYW55IGNzcyBydWxlcyB0byB0aGUgY3VycmVudCBjb250ZXh0XG5zdHlmbi5jc3MgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgIHZhciBtYXAgPSBhcmdzWzBdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHNlbGYucHJvcGVydGllc1tpXTtcbiAgICAgIHZhciBtYXBWYWwgPSBtYXBbcHJvcC5uYW1lXTtcbiAgICAgIGlmIChtYXBWYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtYXBWYWwgPSBtYXBbZGFzaDJjYW1lbChwcm9wLm5hbWUpXTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXBWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNzc1J1bGUocHJvcC5uYW1lLCBtYXBWYWwpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgIHRoaXMuY3NzUnVsZShhcmdzWzBdLCBhcmdzWzFdKTtcbiAgfVxuXG4gIC8vIGRvIG5vdGhpbmcgaWYgYXJncyBhcmUgaW52YWxpZFxuXG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxuc3R5Zm4uc3R5bGUgPSBzdHlmbi5jc3M7XG5cbi8vIGFkZCBhIHNpbmdsZSBjc3MgcnVsZSB0byB0aGUgY3VycmVudCBjb250ZXh0XG5zdHlmbi5jc3NSdWxlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gIC8vIG5hbWUtdmFsdWUgcGFpclxuICB2YXIgcHJvcGVydHkgPSB0aGlzLnBhcnNlKG5hbWUsIHZhbHVlKTtcblxuICAvLyBhZGQgcHJvcGVydHkgdG8gY3VycmVudCBjb250ZXh0IGlmIHZhbGlkXG4gIGlmIChwcm9wZXJ0eSkge1xuICAgIHZhciBpID0gdGhpcy5sZW5ndGggLSAxO1xuICAgIHRoaXNbaV0ucHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTtcbiAgICB0aGlzW2ldLnByb3BlcnRpZXNbcHJvcGVydHkubmFtZV0gPSBwcm9wZXJ0eTsgLy8gYWxsb3cgYWNjZXNzIGJ5IG5hbWUgYXMgd2VsbFxuXG4gICAgaWYgKHByb3BlcnR5Lm5hbWUubWF0Y2goL3BpZS0oXFxkKyktYmFja2dyb3VuZC1zaXplLykgJiYgcHJvcGVydHkudmFsdWUpIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUuaGFzUGllID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHByb3BlcnR5Lm1hcHBlZCkge1xuICAgICAgdGhpc1tpXS5tYXBwZWRQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkpO1xuICAgIH1cblxuICAgIC8vIGFkZCB0byBjb3JlIHN0eWxlIGlmIG5lY2Vzc2FyeVxuICAgIHZhciBjdXJyZW50U2VsZWN0b3JJc0NvcmUgPSAhdGhpc1tpXS5zZWxlY3RvcjtcbiAgICBpZiAoY3VycmVudFNlbGVjdG9ySXNDb3JlKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLmNvcmVTdHlsZVtwcm9wZXJ0eS5uYW1lXSA9IHByb3BlcnR5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbnN0eWZuLmFwcGVuZCA9IGZ1bmN0aW9uIChzdHlsZSkge1xuICBpZiAoc3R5bGVzaGVldChzdHlsZSkpIHtcbiAgICBzdHlsZS5hcHBlbmRUb1N0eWxlKHRoaXMpO1xuICB9IGVsc2UgaWYgKGFycmF5KHN0eWxlKSkge1xuICAgIHRoaXMuYXBwZW5kRnJvbUpzb24oc3R5bGUpO1xuICB9IGVsc2UgaWYgKHN0cmluZyhzdHlsZSkpIHtcbiAgICB0aGlzLmFwcGVuZEZyb21TdHJpbmcoc3R5bGUpO1xuICB9IC8vIHlvdSBwcm9iYWJseSB3b3VsZG4ndCB3YW50IHRvIGFwcGVuZCBhIFN0eWxlLCBzaW5jZSB5b3UnZCBkdXBsaWNhdGUgdGhlIGRlZmF1bHQgcGFydHNcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIHN0YXRpYyBmdW5jdGlvblxuU3R5bGUuZnJvbUpzb24gPSBmdW5jdGlvbiAoY3ksIGpzb24pIHtcbiAgdmFyIHN0eWxlID0gbmV3IFN0eWxlKGN5KTtcbiAgc3R5bGUuZnJvbUpzb24oanNvbik7XG4gIHJldHVybiBzdHlsZTtcbn07XG5TdHlsZS5mcm9tU3RyaW5nID0gZnVuY3Rpb24gKGN5LCBzdHJpbmcpIHtcbiAgcmV0dXJuIG5ldyBTdHlsZShjeSkuZnJvbVN0cmluZyhzdHJpbmcpO1xufTtcbltzdHlmbiQ4LCBzdHlmbiQ3LCBzdHlmbiQ2LCBzdHlmbiQ1LCBzdHlmbiQ0LCBzdHlmbiQzLCBzdHlmbiQyLCBzdHlmbiQxXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoc3R5Zm4sIHByb3BzKTtcbn0pO1xuU3R5bGUudHlwZXMgPSBzdHlmbi50eXBlcztcblN0eWxlLnByb3BlcnRpZXMgPSBzdHlmbi5wcm9wZXJ0aWVzO1xuU3R5bGUucHJvcGVydHlHcm91cHMgPSBzdHlmbi5wcm9wZXJ0eUdyb3VwcztcblN0eWxlLnByb3BlcnR5R3JvdXBOYW1lcyA9IHN0eWZuLnByb3BlcnR5R3JvdXBOYW1lcztcblN0eWxlLnByb3BlcnR5R3JvdXBLZXlzID0gc3R5Zm4ucHJvcGVydHlHcm91cEtleXM7XG5cbnZhciBjb3JlZm4kMiA9IHtcbiAgc3R5bGU6IGZ1bmN0aW9uIHN0eWxlKG5ld1N0eWxlKSB7XG4gICAgaWYgKG5ld1N0eWxlKSB7XG4gICAgICB2YXIgcyA9IHRoaXMuc2V0U3R5bGUobmV3U3R5bGUpO1xuICAgICAgcy51cGRhdGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuc3R5bGU7XG4gIH0sXG4gIHNldFN0eWxlOiBmdW5jdGlvbiBzZXRTdHlsZShzdHlsZSkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgaWYgKHN0eWxlc2hlZXQoc3R5bGUpKSB7XG4gICAgICBfcC5zdHlsZSA9IHN0eWxlLmdlbmVyYXRlU3R5bGUodGhpcyk7XG4gICAgfSBlbHNlIGlmIChhcnJheShzdHlsZSkpIHtcbiAgICAgIF9wLnN0eWxlID0gU3R5bGUuZnJvbUpzb24odGhpcywgc3R5bGUpO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nKHN0eWxlKSkge1xuICAgICAgX3Auc3R5bGUgPSBTdHlsZS5mcm9tU3RyaW5nKHRoaXMsIHN0eWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3Auc3R5bGUgPSBTdHlsZSh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIF9wLnN0eWxlO1xuICB9LFxuICAvLyBlLmcuIGN5LmRhdGEoKSBjaGFuZ2VkID0+IHJlY2FsYyBlbGUgbWFwcGVyc1xuICB1cGRhdGVTdHlsZTogZnVuY3Rpb24gdXBkYXRlU3R5bGUoKSB7XG4gICAgdGhpcy5tdXRhYmxlRWxlbWVudHMoKS51cGRhdGVTdHlsZSgpOyAvLyBqdXN0IHNlbmQgdG8gYWxsIGVsZXNcbiAgfVxufTtcblxudmFyIGRlZmF1bHRTZWxlY3Rpb25UeXBlID0gJ3NpbmdsZSc7XG52YXIgY29yZWZuJDEgPSB7XG4gIGF1dG9sb2NrOiBmdW5jdGlvbiBhdXRvbG9jayhib29sKSB7XG4gICAgaWYgKGJvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcHJpdmF0ZS5hdXRvbG9jayA9IGJvb2wgPyB0cnVlIDogZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmF1dG9sb2NrO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICBhdXRvdW5ncmFiaWZ5OiBmdW5jdGlvbiBhdXRvdW5ncmFiaWZ5KGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLmF1dG91bmdyYWJpZnkgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5hdXRvdW5ncmFiaWZ5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICBhdXRvdW5zZWxlY3RpZnk6IGZ1bmN0aW9uIGF1dG91bnNlbGVjdGlmeShib29sKSB7XG4gICAgaWYgKGJvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcHJpdmF0ZS5hdXRvdW5zZWxlY3RpZnkgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5hdXRvdW5zZWxlY3RpZnk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIHNlbGVjdGlvblR5cGU6IGZ1bmN0aW9uIHNlbGVjdGlvblR5cGUoc2VsVHlwZSkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgaWYgKF9wLnNlbGVjdGlvblR5cGUgPT0gbnVsbCkge1xuICAgICAgX3Auc2VsZWN0aW9uVHlwZSA9IGRlZmF1bHRTZWxlY3Rpb25UeXBlO1xuICAgIH1cbiAgICBpZiAoc2VsVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoc2VsVHlwZSA9PT0gJ2FkZGl0aXZlJyB8fCBzZWxUeXBlID09PSAnc2luZ2xlJykge1xuICAgICAgICBfcC5zZWxlY3Rpb25UeXBlID0gc2VsVHlwZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIF9wLnNlbGVjdGlvblR5cGU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBwYW5uaW5nRW5hYmxlZDogZnVuY3Rpb24gcGFubmluZ0VuYWJsZWQoYm9vbCkge1xuICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUucGFubmluZ0VuYWJsZWQgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5wYW5uaW5nRW5hYmxlZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgdXNlclBhbm5pbmdFbmFibGVkOiBmdW5jdGlvbiB1c2VyUGFubmluZ0VuYWJsZWQoYm9vbCkge1xuICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUudXNlclBhbm5pbmdFbmFibGVkID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUudXNlclBhbm5pbmdFbmFibGVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICB6b29taW5nRW5hYmxlZDogZnVuY3Rpb24gem9vbWluZ0VuYWJsZWQoYm9vbCkge1xuICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUuem9vbWluZ0VuYWJsZWQgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS56b29taW5nRW5hYmxlZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgdXNlclpvb21pbmdFbmFibGVkOiBmdW5jdGlvbiB1c2VyWm9vbWluZ0VuYWJsZWQoYm9vbCkge1xuICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUudXNlclpvb21pbmdFbmFibGVkID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUudXNlclpvb21pbmdFbmFibGVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICBib3hTZWxlY3Rpb25FbmFibGVkOiBmdW5jdGlvbiBib3hTZWxlY3Rpb25FbmFibGVkKGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLmJveFNlbGVjdGlvbkVuYWJsZWQgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5ib3hTZWxlY3Rpb25FbmFibGVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICBwYW46IGZ1bmN0aW9uIHBhbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgcGFuID0gdGhpcy5fcHJpdmF0ZS5wYW47XG4gICAgdmFyIGRpbSwgdmFsLCBkaW1zLCB4LCB5O1xuICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgLy8gLnBhbigpXG4gICAgICAgIHJldHVybiBwYW47XG4gICAgICBjYXNlIDE6XG4gICAgICAgIGlmIChzdHJpbmcoYXJnc1swXSkpIHtcbiAgICAgICAgICAvLyAucGFuKCd4JylcbiAgICAgICAgICBkaW0gPSBhcmdzWzBdO1xuICAgICAgICAgIHJldHVybiBwYW5bZGltXTtcbiAgICAgICAgfSBlbHNlIGlmIChwbGFpbk9iamVjdChhcmdzWzBdKSkge1xuICAgICAgICAgIC8vIC5wYW4oeyB4OiAwLCB5OiAxMDAgfSlcbiAgICAgICAgICBpZiAoIXRoaXMuX3ByaXZhdGUucGFubmluZ0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkaW1zID0gYXJnc1swXTtcbiAgICAgICAgICB4ID0gZGltcy54O1xuICAgICAgICAgIHkgPSBkaW1zLnk7XG4gICAgICAgICAgaWYgKG51bWJlciQxKHgpKSB7XG4gICAgICAgICAgICBwYW4ueCA9IHg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChudW1iZXIkMSh5KSkge1xuICAgICAgICAgICAgcGFuLnkgPSB5O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmVtaXQoJ3BhbiB2aWV3cG9ydCcpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICAvLyAucGFuKCd4JywgMTAwKVxuICAgICAgICBpZiAoIXRoaXMuX3ByaXZhdGUucGFubmluZ0VuYWJsZWQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBkaW0gPSBhcmdzWzBdO1xuICAgICAgICB2YWwgPSBhcmdzWzFdO1xuICAgICAgICBpZiAoKGRpbSA9PT0gJ3gnIHx8IGRpbSA9PT0gJ3knKSAmJiBudW1iZXIkMSh2YWwpKSB7XG4gICAgICAgICAgcGFuW2RpbV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KCdwYW4gdmlld3BvcnQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBpbnZhbGlkXG4gICAgfVxuXG4gICAgdGhpcy5ub3RpZnkoJ3ZpZXdwb3J0Jyk7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgcGFuQnk6IGZ1bmN0aW9uIHBhbkJ5KGFyZzAsIGFyZzEpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgcGFuID0gdGhpcy5fcHJpdmF0ZS5wYW47XG4gICAgdmFyIGRpbSwgdmFsLCBkaW1zLCB4LCB5O1xuICAgIGlmICghdGhpcy5fcHJpdmF0ZS5wYW5uaW5nRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaWYgKHBsYWluT2JqZWN0KGFyZzApKSB7XG4gICAgICAgICAgLy8gLnBhbkJ5KHsgeDogMCwgeTogMTAwIH0pXG4gICAgICAgICAgZGltcyA9IGFyZ3NbMF07XG4gICAgICAgICAgeCA9IGRpbXMueDtcbiAgICAgICAgICB5ID0gZGltcy55O1xuICAgICAgICAgIGlmIChudW1iZXIkMSh4KSkge1xuICAgICAgICAgICAgcGFuLnggKz0geDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG51bWJlciQxKHkpKSB7XG4gICAgICAgICAgICBwYW4ueSArPSB5O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmVtaXQoJ3BhbiB2aWV3cG9ydCcpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICAvLyAucGFuQnkoJ3gnLCAxMDApXG4gICAgICAgIGRpbSA9IGFyZzA7XG4gICAgICAgIHZhbCA9IGFyZzE7XG4gICAgICAgIGlmICgoZGltID09PSAneCcgfHwgZGltID09PSAneScpICYmIG51bWJlciQxKHZhbCkpIHtcbiAgICAgICAgICBwYW5bZGltXSArPSB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KCdwYW4gdmlld3BvcnQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBpbnZhbGlkXG4gICAgfVxuXG4gICAgdGhpcy5ub3RpZnkoJ3ZpZXdwb3J0Jyk7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgZml0OiBmdW5jdGlvbiBmaXQoZWxlbWVudHMsIHBhZGRpbmcpIHtcbiAgICB2YXIgdmlld3BvcnRTdGF0ZSA9IHRoaXMuZ2V0Rml0Vmlld3BvcnQoZWxlbWVudHMsIHBhZGRpbmcpO1xuICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgICAgX3Auem9vbSA9IHZpZXdwb3J0U3RhdGUuem9vbTtcbiAgICAgIF9wLnBhbiA9IHZpZXdwb3J0U3RhdGUucGFuO1xuICAgICAgdGhpcy5lbWl0KCdwYW4gem9vbSB2aWV3cG9ydCcpO1xuICAgICAgdGhpcy5ub3RpZnkoJ3ZpZXdwb3J0Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIGdldEZpdFZpZXdwb3J0OiBmdW5jdGlvbiBnZXRGaXRWaWV3cG9ydChlbGVtZW50cywgcGFkZGluZykge1xuICAgIGlmIChudW1iZXIkMShlbGVtZW50cykgJiYgcGFkZGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBlbGVtZW50cyBpcyBvcHRpb25hbFxuICAgICAgcGFkZGluZyA9IGVsZW1lbnRzO1xuICAgICAgZWxlbWVudHMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghdGhpcy5fcHJpdmF0ZS5wYW5uaW5nRW5hYmxlZCB8fCAhdGhpcy5fcHJpdmF0ZS56b29taW5nRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgYmI7XG4gICAgaWYgKHN0cmluZyhlbGVtZW50cykpIHtcbiAgICAgIHZhciBzZWwgPSBlbGVtZW50cztcbiAgICAgIGVsZW1lbnRzID0gdGhpcy4kKHNlbCk7XG4gICAgfSBlbHNlIGlmIChib3VuZGluZ0JveChlbGVtZW50cykpIHtcbiAgICAgIC8vIGFzc3VtZSBiYlxuICAgICAgdmFyIGJiZSA9IGVsZW1lbnRzO1xuICAgICAgYmIgPSB7XG4gICAgICAgIHgxOiBiYmUueDEsXG4gICAgICAgIHkxOiBiYmUueTEsXG4gICAgICAgIHgyOiBiYmUueDIsXG4gICAgICAgIHkyOiBiYmUueTJcbiAgICAgIH07XG4gICAgICBiYi53ID0gYmIueDIgLSBiYi54MTtcbiAgICAgIGJiLmggPSBiYi55MiAtIGJiLnkxO1xuICAgIH0gZWxzZSBpZiAoIWVsZW1lbnRPckNvbGxlY3Rpb24oZWxlbWVudHMpKSB7XG4gICAgICBlbGVtZW50cyA9IHRoaXMubXV0YWJsZUVsZW1lbnRzKCk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50T3JDb2xsZWN0aW9uKGVsZW1lbnRzKSAmJiBlbGVtZW50cy5lbXB0eSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBjYW4ndCBmaXQgdG8gbm90aGluZ1xuXG4gICAgYmIgPSBiYiB8fCBlbGVtZW50cy5ib3VuZGluZ0JveCgpO1xuICAgIHZhciB3ID0gdGhpcy53aWR0aCgpO1xuICAgIHZhciBoID0gdGhpcy5oZWlnaHQoKTtcbiAgICB2YXIgem9vbTtcbiAgICBwYWRkaW5nID0gbnVtYmVyJDEocGFkZGluZykgPyBwYWRkaW5nIDogMDtcbiAgICBpZiAoIWlzTmFOKHcpICYmICFpc05hTihoKSAmJiB3ID4gMCAmJiBoID4gMCAmJiAhaXNOYU4oYmIudykgJiYgIWlzTmFOKGJiLmgpICYmIGJiLncgPiAwICYmIGJiLmggPiAwKSB7XG4gICAgICB6b29tID0gTWF0aC5taW4oKHcgLSAyICogcGFkZGluZykgLyBiYi53LCAoaCAtIDIgKiBwYWRkaW5nKSAvIGJiLmgpO1xuXG4gICAgICAvLyBjcm9wIHpvb21cbiAgICAgIHpvb20gPSB6b29tID4gdGhpcy5fcHJpdmF0ZS5tYXhab29tID8gdGhpcy5fcHJpdmF0ZS5tYXhab29tIDogem9vbTtcbiAgICAgIHpvb20gPSB6b29tIDwgdGhpcy5fcHJpdmF0ZS5taW5ab29tID8gdGhpcy5fcHJpdmF0ZS5taW5ab29tIDogem9vbTtcbiAgICAgIHZhciBwYW4gPSB7XG4gICAgICAgIC8vIG5vdyBwYW4gdG8gbWlkZGxlXG4gICAgICAgIHg6ICh3IC0gem9vbSAqIChiYi54MSArIGJiLngyKSkgLyAyLFxuICAgICAgICB5OiAoaCAtIHpvb20gKiAoYmIueTEgKyBiYi55MikpIC8gMlxuICAgICAgfTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHpvb206IHpvb20sXG4gICAgICAgIHBhbjogcGFuXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm47XG4gIH0sXG4gIHpvb21SYW5nZTogZnVuY3Rpb24gem9vbVJhbmdlKG1pbiwgbWF4KSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBpZiAobWF4ID09IG51bGwpIHtcbiAgICAgIHZhciBvcHRzID0gbWluO1xuICAgICAgbWluID0gb3B0cy5taW47XG4gICAgICBtYXggPSBvcHRzLm1heDtcbiAgICB9XG4gICAgaWYgKG51bWJlciQxKG1pbikgJiYgbnVtYmVyJDEobWF4KSAmJiBtaW4gPD0gbWF4KSB7XG4gICAgICBfcC5taW5ab29tID0gbWluO1xuICAgICAgX3AubWF4Wm9vbSA9IG1heDtcbiAgICB9IGVsc2UgaWYgKG51bWJlciQxKG1pbikgJiYgbWF4ID09PSB1bmRlZmluZWQgJiYgbWluIDw9IF9wLm1heFpvb20pIHtcbiAgICAgIF9wLm1pblpvb20gPSBtaW47XG4gICAgfSBlbHNlIGlmIChudW1iZXIkMShtYXgpICYmIG1pbiA9PT0gdW5kZWZpbmVkICYmIG1heCA+PSBfcC5taW5ab29tKSB7XG4gICAgICBfcC5tYXhab29tID0gbWF4O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgbWluWm9vbTogZnVuY3Rpb24gbWluWm9vbSh6b29tKSB7XG4gICAgaWYgKHpvb20gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUubWluWm9vbTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuem9vbVJhbmdlKHtcbiAgICAgICAgbWluOiB6b29tXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIG1heFpvb206IGZ1bmN0aW9uIG1heFpvb20oem9vbSkge1xuICAgIGlmICh6b29tID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLm1heFpvb207XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnpvb21SYW5nZSh7XG4gICAgICAgIG1heDogem9vbVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICBnZXRab29tZWRWaWV3cG9ydDogZnVuY3Rpb24gZ2V0Wm9vbWVkVmlld3BvcnQocGFyYW1zKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgY3VycmVudFBhbiA9IF9wLnBhbjtcbiAgICB2YXIgY3VycmVudFpvb20gPSBfcC56b29tO1xuICAgIHZhciBwb3M7IC8vIGluIHJlbmRlcmVkIHB4XG4gICAgdmFyIHpvb207XG4gICAgdmFyIGJhaWwgPSBmYWxzZTtcbiAgICBpZiAoIV9wLnpvb21pbmdFbmFibGVkKSB7XG4gICAgICAvLyB6b29taW5nIGRpc2FibGVkXG4gICAgICBiYWlsID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG51bWJlciQxKHBhcmFtcykpIHtcbiAgICAgIC8vIHRoZW4gc2V0IHRoZSB6b29tXG4gICAgICB6b29tID0gcGFyYW1zO1xuICAgIH0gZWxzZSBpZiAocGxhaW5PYmplY3QocGFyYW1zKSkge1xuICAgICAgLy8gdGhlbiB6b29tIGFib3V0IGEgcG9pbnRcbiAgICAgIHpvb20gPSBwYXJhbXMubGV2ZWw7XG4gICAgICBpZiAocGFyYW1zLnBvc2l0aW9uICE9IG51bGwpIHtcbiAgICAgICAgcG9zID0gbW9kZWxUb1JlbmRlcmVkUG9zaXRpb24ocGFyYW1zLnBvc2l0aW9uLCBjdXJyZW50Wm9vbSwgY3VycmVudFBhbik7XG4gICAgICB9IGVsc2UgaWYgKHBhcmFtcy5yZW5kZXJlZFBvc2l0aW9uICE9IG51bGwpIHtcbiAgICAgICAgcG9zID0gcGFyYW1zLnJlbmRlcmVkUG9zaXRpb247XG4gICAgICB9XG4gICAgICBpZiAocG9zICE9IG51bGwgJiYgIV9wLnBhbm5pbmdFbmFibGVkKSB7XG4gICAgICAgIC8vIHBhbm5pbmcgZGlzYWJsZWRcbiAgICAgICAgYmFpbCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY3JvcCB6b29tXG4gICAgem9vbSA9IHpvb20gPiBfcC5tYXhab29tID8gX3AubWF4Wm9vbSA6IHpvb207XG4gICAgem9vbSA9IHpvb20gPCBfcC5taW5ab29tID8gX3AubWluWm9vbSA6IHpvb207XG5cbiAgICAvLyBjYW4ndCB6b29tIHdpdGggaW52YWxpZCBwYXJhbXNcbiAgICBpZiAoYmFpbCB8fCAhbnVtYmVyJDEoem9vbSkgfHwgem9vbSA9PT0gY3VycmVudFpvb20gfHwgcG9zICE9IG51bGwgJiYgKCFudW1iZXIkMShwb3MueCkgfHwgIW51bWJlciQxKHBvcy55KSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAocG9zICE9IG51bGwpIHtcbiAgICAgIC8vIHNldCB6b29tIGFib3V0IHBvc2l0aW9uXG4gICAgICB2YXIgcGFuMSA9IGN1cnJlbnRQYW47XG4gICAgICB2YXIgem9vbTEgPSBjdXJyZW50Wm9vbTtcbiAgICAgIHZhciB6b29tMiA9IHpvb207XG4gICAgICB2YXIgcGFuMiA9IHtcbiAgICAgICAgeDogLXpvb20yIC8gem9vbTEgKiAocG9zLnggLSBwYW4xLngpICsgcG9zLngsXG4gICAgICAgIHk6IC16b29tMiAvIHpvb20xICogKHBvcy55IC0gcGFuMS55KSArIHBvcy55XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgem9vbWVkOiB0cnVlLFxuICAgICAgICBwYW5uZWQ6IHRydWUsXG4gICAgICAgIHpvb206IHpvb20yLFxuICAgICAgICBwYW46IHBhbjJcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGp1c3Qgc2V0IHRoZSB6b29tXG4gICAgICByZXR1cm4ge1xuICAgICAgICB6b29tZWQ6IHRydWUsXG4gICAgICAgIHBhbm5lZDogZmFsc2UsXG4gICAgICAgIHpvb206IHpvb20sXG4gICAgICAgIHBhbjogY3VycmVudFBhblxuICAgICAgfTtcbiAgICB9XG4gIH0sXG4gIHpvb206IGZ1bmN0aW9uIHpvb20ocGFyYW1zKSB7XG4gICAgaWYgKHBhcmFtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBnZXRcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnpvb207XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNldFxuICAgICAgdmFyIHZwID0gdGhpcy5nZXRab29tZWRWaWV3cG9ydChwYXJhbXMpO1xuICAgICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICAgIGlmICh2cCA9PSBudWxsIHx8ICF2cC56b29tZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBfcC56b29tID0gdnAuem9vbTtcbiAgICAgIGlmICh2cC5wYW5uZWQpIHtcbiAgICAgICAgX3AucGFuLnggPSB2cC5wYW4ueDtcbiAgICAgICAgX3AucGFuLnkgPSB2cC5wYW4ueTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZW1pdCgnem9vbScgKyAodnAucGFubmVkID8gJyBwYW4nIDogJycpICsgJyB2aWV3cG9ydCcpO1xuICAgICAgdGhpcy5ub3RpZnkoJ3ZpZXdwb3J0Jyk7XG4gICAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgICB9XG4gIH0sXG5cbiAgdmlld3BvcnQ6IGZ1bmN0aW9uIHZpZXdwb3J0KG9wdHMpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciB6b29tRGVmZCA9IHRydWU7XG4gICAgdmFyIHBhbkRlZmQgPSB0cnVlO1xuICAgIHZhciBldmVudHMgPSBbXTsgLy8gdG8gdHJpZ2dlclxuICAgIHZhciB6b29tRmFpbGVkID0gZmFsc2U7XG4gICAgdmFyIHBhbkZhaWxlZCA9IGZhbHNlO1xuICAgIGlmICghb3B0cykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmICghbnVtYmVyJDEob3B0cy56b29tKSkge1xuICAgICAgem9vbURlZmQgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFwbGFpbk9iamVjdChvcHRzLnBhbikpIHtcbiAgICAgIHBhbkRlZmQgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCF6b29tRGVmZCAmJiAhcGFuRGVmZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmICh6b29tRGVmZCkge1xuICAgICAgdmFyIHogPSBvcHRzLnpvb207XG4gICAgICBpZiAoeiA8IF9wLm1pblpvb20gfHwgeiA+IF9wLm1heFpvb20gfHwgIV9wLnpvb21pbmdFbmFibGVkKSB7XG4gICAgICAgIHpvb21GYWlsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3Auem9vbSA9IHo7XG4gICAgICAgIGV2ZW50cy5wdXNoKCd6b29tJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwYW5EZWZkICYmICghem9vbUZhaWxlZCB8fCAhb3B0cy5jYW5jZWxPbkZhaWxlZFpvb20pICYmIF9wLnBhbm5pbmdFbmFibGVkKSB7XG4gICAgICB2YXIgcCA9IG9wdHMucGFuO1xuICAgICAgaWYgKG51bWJlciQxKHAueCkpIHtcbiAgICAgICAgX3AucGFuLnggPSBwLng7XG4gICAgICAgIHBhbkZhaWxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKG51bWJlciQxKHAueSkpIHtcbiAgICAgICAgX3AucGFuLnkgPSBwLnk7XG4gICAgICAgIHBhbkZhaWxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCFwYW5GYWlsZWQpIHtcbiAgICAgICAgZXZlbnRzLnB1c2goJ3BhbicpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGV2ZW50cy5wdXNoKCd2aWV3cG9ydCcpO1xuICAgICAgdGhpcy5lbWl0KGV2ZW50cy5qb2luKCcgJykpO1xuICAgICAgdGhpcy5ub3RpZnkoJ3ZpZXdwb3J0Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIGNlbnRlcjogZnVuY3Rpb24gY2VudGVyKGVsZW1lbnRzKSB7XG4gICAgdmFyIHBhbiA9IHRoaXMuZ2V0Q2VudGVyUGFuKGVsZW1lbnRzKTtcbiAgICBpZiAocGFuKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLnBhbiA9IHBhbjtcbiAgICAgIHRoaXMuZW1pdCgncGFuIHZpZXdwb3J0Jyk7XG4gICAgICB0aGlzLm5vdGlmeSgndmlld3BvcnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgZ2V0Q2VudGVyUGFuOiBmdW5jdGlvbiBnZXRDZW50ZXJQYW4oZWxlbWVudHMsIHpvb20pIHtcbiAgICBpZiAoIXRoaXMuX3ByaXZhdGUucGFubmluZ0VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHN0cmluZyhlbGVtZW50cykpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IGVsZW1lbnRzO1xuICAgICAgZWxlbWVudHMgPSB0aGlzLm11dGFibGVFbGVtZW50cygpLmZpbHRlcihzZWxlY3Rvcik7XG4gICAgfSBlbHNlIGlmICghZWxlbWVudE9yQ29sbGVjdGlvbihlbGVtZW50cykpIHtcbiAgICAgIGVsZW1lbnRzID0gdGhpcy5tdXRhYmxlRWxlbWVudHMoKTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gY2FuJ3QgY2VudHJlIHBhbiB0byBub3RoaW5nXG5cbiAgICB2YXIgYmIgPSBlbGVtZW50cy5ib3VuZGluZ0JveCgpO1xuICAgIHZhciB3ID0gdGhpcy53aWR0aCgpO1xuICAgIHZhciBoID0gdGhpcy5oZWlnaHQoKTtcbiAgICB6b29tID0gem9vbSA9PT0gdW5kZWZpbmVkID8gdGhpcy5fcHJpdmF0ZS56b29tIDogem9vbTtcbiAgICB2YXIgcGFuID0ge1xuICAgICAgLy8gbWlkZGxlXG4gICAgICB4OiAodyAtIHpvb20gKiAoYmIueDEgKyBiYi54MikpIC8gMixcbiAgICAgIHk6IChoIC0gem9vbSAqIChiYi55MSArIGJiLnkyKSkgLyAyXG4gICAgfTtcbiAgICByZXR1cm4gcGFuO1xuICB9LFxuICByZXNldDogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgaWYgKCF0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkIHx8ICF0aGlzLl9wcml2YXRlLnpvb21pbmdFbmFibGVkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy52aWV3cG9ydCh7XG4gICAgICBwYW46IHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMFxuICAgICAgfSxcbiAgICAgIHpvb206IDFcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICBpbnZhbGlkYXRlU2l6ZTogZnVuY3Rpb24gaW52YWxpZGF0ZVNpemUoKSB7XG4gICAgdGhpcy5fcHJpdmF0ZS5zaXplQ2FjaGUgPSBudWxsO1xuICB9LFxuICBzaXplOiBmdW5jdGlvbiBzaXplKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgdmFyIGNvbnRhaW5lciA9IF9wLmNvbnRhaW5lcjtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIHJldHVybiBfcC5zaXplQ2FjaGUgPSBfcC5zaXplQ2FjaGUgfHwgKGNvbnRhaW5lciA/IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdHlsZSA9IGN5LndpbmRvdygpLmdldENvbXB1dGVkU3R5bGUoY29udGFpbmVyKTtcbiAgICAgIHZhciB2YWwgPSBmdW5jdGlvbiB2YWwobmFtZSkge1xuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aDogY29udGFpbmVyLmNsaWVudFdpZHRoIC0gdmFsKCdwYWRkaW5nLWxlZnQnKSAtIHZhbCgncGFkZGluZy1yaWdodCcpLFxuICAgICAgICBoZWlnaHQ6IGNvbnRhaW5lci5jbGllbnRIZWlnaHQgLSB2YWwoJ3BhZGRpbmctdG9wJykgLSB2YWwoJ3BhZGRpbmctYm90dG9tJylcbiAgICAgIH07XG4gICAgfSgpIDoge1xuICAgICAgLy8gZmFsbGJhY2sgaWYgbm8gY29udGFpbmVyIChub3QgMCBiL2MgY2FuIGJlIHVzZWQgZm9yIGRpdmlkaW5nIGV0YylcbiAgICAgIHdpZHRoOiAxLFxuICAgICAgaGVpZ2h0OiAxXG4gICAgfSk7XG4gIH0sXG4gIHdpZHRoOiBmdW5jdGlvbiB3aWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5zaXplKCkud2lkdGg7XG4gIH0sXG4gIGhlaWdodDogZnVuY3Rpb24gaGVpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLnNpemUoKS5oZWlnaHQ7XG4gIH0sXG4gIGV4dGVudDogZnVuY3Rpb24gZXh0ZW50KCkge1xuICAgIHZhciBwYW4gPSB0aGlzLl9wcml2YXRlLnBhbjtcbiAgICB2YXIgem9vbSA9IHRoaXMuX3ByaXZhdGUuem9vbTtcbiAgICB2YXIgcmIgPSB0aGlzLnJlbmRlcmVkRXh0ZW50KCk7XG4gICAgdmFyIGIgPSB7XG4gICAgICB4MTogKHJiLngxIC0gcGFuLngpIC8gem9vbSxcbiAgICAgIHgyOiAocmIueDIgLSBwYW4ueCkgLyB6b29tLFxuICAgICAgeTE6IChyYi55MSAtIHBhbi55KSAvIHpvb20sXG4gICAgICB5MjogKHJiLnkyIC0gcGFuLnkpIC8gem9vbVxuICAgIH07XG4gICAgYi53ID0gYi54MiAtIGIueDE7XG4gICAgYi5oID0gYi55MiAtIGIueTE7XG4gICAgcmV0dXJuIGI7XG4gIH0sXG4gIHJlbmRlcmVkRXh0ZW50OiBmdW5jdGlvbiByZW5kZXJlZEV4dGVudCgpIHtcbiAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoKCk7XG4gICAgdmFyIGhlaWdodCA9IHRoaXMuaGVpZ2h0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHgxOiAwLFxuICAgICAgeTE6IDAsXG4gICAgICB4Mjogd2lkdGgsXG4gICAgICB5MjogaGVpZ2h0LFxuICAgICAgdzogd2lkdGgsXG4gICAgICBoOiBoZWlnaHRcbiAgICB9O1xuICB9LFxuICBtdWx0aUNsaWNrRGVib3VuY2VUaW1lOiBmdW5jdGlvbiBtdWx0aUNsaWNrRGVib3VuY2VUaW1lKF9pbnQpIHtcbiAgICBpZiAoX2ludCkgdGhpcy5fcHJpdmF0ZS5tdWx0aUNsaWNrRGVib3VuY2VUaW1lID0gX2ludDtlbHNlIHJldHVybiB0aGlzLl9wcml2YXRlLm11bHRpQ2xpY2tEZWJvdW5jZVRpbWU7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH1cbn07XG5cbi8vIGFsaWFzZXNcbmNvcmVmbiQxLmNlbnRyZSA9IGNvcmVmbiQxLmNlbnRlcjtcblxuLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbmNvcmVmbiQxLmF1dG9sb2NrTm9kZXMgPSBjb3JlZm4kMS5hdXRvbG9jaztcbmNvcmVmbiQxLmF1dG91bmdyYWJpZnlOb2RlcyA9IGNvcmVmbiQxLmF1dG91bmdyYWJpZnk7XG5cbnZhciBmbiA9IHtcbiAgZGF0YTogZGVmaW5lLmRhdGEoe1xuICAgIGZpZWxkOiAnZGF0YScsXG4gICAgYmluZGluZ0V2ZW50OiAnZGF0YScsXG4gICAgYWxsb3dCaW5kaW5nOiB0cnVlLFxuICAgIGFsbG93U2V0dGluZzogdHJ1ZSxcbiAgICBzZXR0aW5nRXZlbnQ6ICdkYXRhJyxcbiAgICBzZXR0aW5nVHJpZ2dlcnNFdmVudDogdHJ1ZSxcbiAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgYWxsb3dHZXR0aW5nOiB0cnVlLFxuICAgIHVwZGF0ZVN0eWxlOiB0cnVlXG4gIH0pLFxuICByZW1vdmVEYXRhOiBkZWZpbmUucmVtb3ZlRGF0YSh7XG4gICAgZmllbGQ6ICdkYXRhJyxcbiAgICBldmVudDogJ2RhdGEnLFxuICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICB0cmlnZ2VyRXZlbnQ6IHRydWUsXG4gICAgdXBkYXRlU3R5bGU6IHRydWVcbiAgfSksXG4gIHNjcmF0Y2g6IGRlZmluZS5kYXRhKHtcbiAgICBmaWVsZDogJ3NjcmF0Y2gnLFxuICAgIGJpbmRpbmdFdmVudDogJ3NjcmF0Y2gnLFxuICAgIGFsbG93QmluZGluZzogdHJ1ZSxcbiAgICBhbGxvd1NldHRpbmc6IHRydWUsXG4gICAgc2V0dGluZ0V2ZW50OiAnc2NyYXRjaCcsXG4gICAgc2V0dGluZ1RyaWdnZXJzRXZlbnQ6IHRydWUsXG4gICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgIGFsbG93R2V0dGluZzogdHJ1ZSxcbiAgICB1cGRhdGVTdHlsZTogdHJ1ZVxuICB9KSxcbiAgcmVtb3ZlU2NyYXRjaDogZGVmaW5lLnJlbW92ZURhdGEoe1xuICAgIGZpZWxkOiAnc2NyYXRjaCcsXG4gICAgZXZlbnQ6ICdzY3JhdGNoJyxcbiAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgdHJpZ2dlckV2ZW50OiB0cnVlLFxuICAgIHVwZGF0ZVN0eWxlOiB0cnVlXG4gIH0pXG59O1xuXG4vLyBhbGlhc2VzXG5mbi5hdHRyID0gZm4uZGF0YTtcbmZuLnJlbW92ZUF0dHIgPSBmbi5yZW1vdmVEYXRhO1xuXG52YXIgQ29yZSA9IGZ1bmN0aW9uIENvcmUob3B0cykge1xuICB2YXIgY3kgPSB0aGlzO1xuICBvcHRzID0gZXh0ZW5kKHt9LCBvcHRzKTtcbiAgdmFyIGNvbnRhaW5lciA9IG9wdHMuY29udGFpbmVyO1xuXG4gIC8vIGFsbG93IGZvciBwYXNzaW5nIGEgd3JhcHBlZCBqcXVlcnkgb2JqZWN0XG4gIC8vIGUuZy4gY3l0b3NjYXBlKHsgY29udGFpbmVyOiAkKCcjY3knKSB9KVxuICBpZiAoY29udGFpbmVyICYmICFodG1sRWxlbWVudChjb250YWluZXIpICYmIGh0bWxFbGVtZW50KGNvbnRhaW5lclswXSkpIHtcbiAgICBjb250YWluZXIgPSBjb250YWluZXJbMF07XG4gIH1cbiAgdmFyIHJlZyA9IGNvbnRhaW5lciA/IGNvbnRhaW5lci5fY3lyZWcgOiBudWxsOyAvLyBlLmcuIGFscmVhZHkgcmVnaXN0ZXJlZCBzb21lIGluZm8gKGUuZy4gcmVhZGllcykgdmlhIGpxdWVyeVxuICByZWcgPSByZWcgfHwge307XG4gIGlmIChyZWcgJiYgcmVnLmN5KSB7XG4gICAgcmVnLmN5LmRlc3Ryb3koKTtcbiAgICByZWcgPSB7fTsgLy8gb2xkIGluc3RhbmNlID0+IHJlcGxhY2UgcmVnIGNvbXBsZXRlbHlcbiAgfVxuXG4gIHZhciByZWFkaWVzID0gcmVnLnJlYWRpZXMgPSByZWcucmVhZGllcyB8fCBbXTtcbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIGNvbnRhaW5lci5fY3lyZWcgPSByZWc7XG4gIH0gLy8gbWFrZSBzdXJlIGNvbnRhaW5lciBhc3NvYydkIHJlZyBwb2ludHMgdG8gdGhpcyBjeVxuICByZWcuY3kgPSBjeTtcbiAgdmFyIGhlYWQgPSBfd2luZG93ICE9PSB1bmRlZmluZWQgJiYgY29udGFpbmVyICE9PSB1bmRlZmluZWQgJiYgIW9wdHMuaGVhZGxlc3M7XG4gIHZhciBvcHRpb25zID0gb3B0cztcbiAgb3B0aW9ucy5sYXlvdXQgPSBleHRlbmQoe1xuICAgIG5hbWU6IGhlYWQgPyAnZ3JpZCcgOiAnbnVsbCdcbiAgfSwgb3B0aW9ucy5sYXlvdXQpO1xuICBvcHRpb25zLnJlbmRlcmVyID0gZXh0ZW5kKHtcbiAgICBuYW1lOiBoZWFkID8gJ2NhbnZhcycgOiAnbnVsbCdcbiAgfSwgb3B0aW9ucy5yZW5kZXJlcik7XG4gIHZhciBkZWZWYWwgPSBmdW5jdGlvbiBkZWZWYWwoZGVmLCB2YWwsIGFsdFZhbCkge1xuICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9IGVsc2UgaWYgKGFsdFZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gYWx0VmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGVmO1xuICAgIH1cbiAgfTtcbiAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZSA9IHtcbiAgICBjb250YWluZXI6IGNvbnRhaW5lcixcbiAgICAvLyBodG1sIGRvbSBlbGUgY29udGFpbmVyXG4gICAgcmVhZHk6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgcmVhZHkgaGFzIGJlZW4gdHJpZ2dlcmVkXG4gICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAvLyBjYWNoZWQgb3B0aW9uc1xuICAgIGVsZW1lbnRzOiBuZXcgQ29sbGVjdGlvbih0aGlzKSxcbiAgICAvLyBlbGVtZW50cyBpbiB0aGUgZ3JhcGhcbiAgICBsaXN0ZW5lcnM6IFtdLFxuICAgIC8vIGxpc3Qgb2YgbGlzdGVuZXJzXG4gICAgYW5pRWxlczogbmV3IENvbGxlY3Rpb24odGhpcyksXG4gICAgLy8gZWxlbWVudHMgYmVpbmcgYW5pbWF0ZWRcbiAgICBkYXRhOiBvcHRpb25zLmRhdGEgfHwge30sXG4gICAgLy8gZGF0YSBmb3IgdGhlIGNvcmVcbiAgICBzY3JhdGNoOiB7fSxcbiAgICAvLyBzY3JhdGNoIG9iamVjdCBmb3IgY29yZVxuICAgIGxheW91dDogbnVsbCxcbiAgICByZW5kZXJlcjogbnVsbCxcbiAgICBkZXN0cm95ZWQ6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgZGVzdHJveSB3YXMgY2FsbGVkXG4gICAgbm90aWZpY2F0aW9uc0VuYWJsZWQ6IHRydWUsXG4gICAgLy8gd2hldGhlciBub3RpZmljYXRpb25zIGFyZSBzZW50IHRvIHRoZSByZW5kZXJlclxuICAgIG1pblpvb206IDFlLTUwLFxuICAgIG1heFpvb206IDFlNTAsXG4gICAgem9vbWluZ0VuYWJsZWQ6IGRlZlZhbCh0cnVlLCBvcHRpb25zLnpvb21pbmdFbmFibGVkKSxcbiAgICB1c2VyWm9vbWluZ0VuYWJsZWQ6IGRlZlZhbCh0cnVlLCBvcHRpb25zLnVzZXJab29taW5nRW5hYmxlZCksXG4gICAgcGFubmluZ0VuYWJsZWQ6IGRlZlZhbCh0cnVlLCBvcHRpb25zLnBhbm5pbmdFbmFibGVkKSxcbiAgICB1c2VyUGFubmluZ0VuYWJsZWQ6IGRlZlZhbCh0cnVlLCBvcHRpb25zLnVzZXJQYW5uaW5nRW5hYmxlZCksXG4gICAgYm94U2VsZWN0aW9uRW5hYmxlZDogZGVmVmFsKHRydWUsIG9wdGlvbnMuYm94U2VsZWN0aW9uRW5hYmxlZCksXG4gICAgYXV0b2xvY2s6IGRlZlZhbChmYWxzZSwgb3B0aW9ucy5hdXRvbG9jaywgb3B0aW9ucy5hdXRvbG9ja05vZGVzKSxcbiAgICBhdXRvdW5ncmFiaWZ5OiBkZWZWYWwoZmFsc2UsIG9wdGlvbnMuYXV0b3VuZ3JhYmlmeSwgb3B0aW9ucy5hdXRvdW5ncmFiaWZ5Tm9kZXMpLFxuICAgIGF1dG91bnNlbGVjdGlmeTogZGVmVmFsKGZhbHNlLCBvcHRpb25zLmF1dG91bnNlbGVjdGlmeSksXG4gICAgc3R5bGVFbmFibGVkOiBvcHRpb25zLnN0eWxlRW5hYmxlZCA9PT0gdW5kZWZpbmVkID8gaGVhZCA6IG9wdGlvbnMuc3R5bGVFbmFibGVkLFxuICAgIHpvb206IG51bWJlciQxKG9wdGlvbnMuem9vbSkgPyBvcHRpb25zLnpvb20gOiAxLFxuICAgIHBhbjoge1xuICAgICAgeDogcGxhaW5PYmplY3Qob3B0aW9ucy5wYW4pICYmIG51bWJlciQxKG9wdGlvbnMucGFuLngpID8gb3B0aW9ucy5wYW4ueCA6IDAsXG4gICAgICB5OiBwbGFpbk9iamVjdChvcHRpb25zLnBhbikgJiYgbnVtYmVyJDEob3B0aW9ucy5wYW4ueSkgPyBvcHRpb25zLnBhbi55IDogMFxuICAgIH0sXG4gICAgYW5pbWF0aW9uOiB7XG4gICAgICAvLyBvYmplY3QgZm9yIGN1cnJlbnRseS1ydW5uaW5nIGFuaW1hdGlvbnNcbiAgICAgIGN1cnJlbnQ6IFtdLFxuICAgICAgcXVldWU6IFtdXG4gICAgfSxcbiAgICBoYXNDb21wb3VuZE5vZGVzOiBmYWxzZSxcbiAgICBtdWx0aUNsaWNrRGVib3VuY2VUaW1lOiBkZWZWYWwoMjUwLCBvcHRpb25zLm11bHRpQ2xpY2tEZWJvdW5jZVRpbWUpXG4gIH07XG4gIHRoaXMuY3JlYXRlRW1pdHRlcigpO1xuXG4gIC8vIHNldCBzZWxlY3Rpb24gdHlwZVxuICB0aGlzLnNlbGVjdGlvblR5cGUob3B0aW9ucy5zZWxlY3Rpb25UeXBlKTtcblxuICAvLyBpbml0IHpvb20gYm91bmRzXG4gIHRoaXMuem9vbVJhbmdlKHtcbiAgICBtaW46IG9wdGlvbnMubWluWm9vbSxcbiAgICBtYXg6IG9wdGlvbnMubWF4Wm9vbVxuICB9KTtcbiAgdmFyIGxvYWRFeHREYXRhID0gZnVuY3Rpb24gbG9hZEV4dERhdGEoZXh0RGF0YSwgbmV4dCkge1xuICAgIHZhciBhbnlJc1Byb21pc2UgPSBleHREYXRhLnNvbWUocHJvbWlzZSk7XG4gICAgaWYgKGFueUlzUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UkMS5hbGwoZXh0RGF0YSkudGhlbihuZXh0KTsgLy8gbG9hZCBhbGwgZGF0YSBhc3luY2hyb25vdXNseSwgdGhlbiBleGVjIHJlc3Qgb2YgaW5pdFxuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0KGV4dERhdGEpOyAvLyBleGVjIHN5bmNocm9ub3VzbHkgZm9yIGNvbnZlbmllbmNlXG4gICAgfVxuICB9O1xuXG4gIC8vIHN0YXJ0IHdpdGggdGhlIGRlZmF1bHQgc3R5bGVzaGVldCBzbyB3ZSBoYXZlIHNvbWV0aGluZyBiZWZvcmUgbG9hZGluZyBhbiBleHRlcm5hbCBzdHlsZXNoZWV0XG4gIGlmIChfcC5zdHlsZUVuYWJsZWQpIHtcbiAgICBjeS5zZXRTdHlsZShbXSk7XG4gIH1cblxuICAvLyBjcmVhdGUgdGhlIHJlbmRlcmVyXG4gIHZhciByZW5kZXJlck9wdGlvbnMgPSBleHRlbmQoe30sIG9wdGlvbnMsIG9wdGlvbnMucmVuZGVyZXIpOyAvLyBhbGxvdyByZW5kZXJpbmcgaGludHMgaW4gdG9wIGxldmVsIG9wdGlvbnNcbiAgY3kuaW5pdFJlbmRlcmVyKHJlbmRlcmVyT3B0aW9ucyk7XG4gIHZhciBzZXRFbGVzQW5kTGF5b3V0ID0gZnVuY3Rpb24gc2V0RWxlc0FuZExheW91dChlbGVtZW50cywgb25sb2FkLCBvbmRvbmUpIHtcbiAgICBjeS5ub3RpZmljYXRpb25zKGZhbHNlKTtcblxuICAgIC8vIHJlbW92ZSBvbGQgZWxlbWVudHNcbiAgICB2YXIgb2xkRWxlcyA9IGN5Lm11dGFibGVFbGVtZW50cygpO1xuICAgIGlmIChvbGRFbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9sZEVsZXMucmVtb3ZlKCk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50cyAhPSBudWxsKSB7XG4gICAgICBpZiAocGxhaW5PYmplY3QoZWxlbWVudHMpIHx8IGFycmF5KGVsZW1lbnRzKSkge1xuICAgICAgICBjeS5hZGQoZWxlbWVudHMpO1xuICAgICAgfVxuICAgIH1cbiAgICBjeS5vbmUoJ2xheW91dHJlYWR5JywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGN5Lm5vdGlmaWNhdGlvbnModHJ1ZSk7XG4gICAgICBjeS5lbWl0KGUpOyAvLyB3ZSBtaXNzZWQgdGhpcyBldmVudCBieSB0dXJuaW5nIG5vdGlmaWNhdGlvbnMgb2ZmLCBzbyBwYXNzIGl0IG9uXG5cbiAgICAgIGN5Lm9uZSgnbG9hZCcsIG9ubG9hZCk7XG4gICAgICBjeS5lbWl0QW5kTm90aWZ5KCdsb2FkJyk7XG4gICAgfSkub25lKCdsYXlvdXRzdG9wJywgZnVuY3Rpb24gKCkge1xuICAgICAgY3kub25lKCdkb25lJywgb25kb25lKTtcbiAgICAgIGN5LmVtaXQoJ2RvbmUnKTtcbiAgICB9KTtcbiAgICB2YXIgbGF5b3V0T3B0cyA9IGV4dGVuZCh7fSwgY3kuX3ByaXZhdGUub3B0aW9ucy5sYXlvdXQpO1xuICAgIGxheW91dE9wdHMuZWxlcyA9IGN5LmVsZW1lbnRzKCk7XG4gICAgY3kubGF5b3V0KGxheW91dE9wdHMpLnJ1bigpO1xuICB9O1xuICBsb2FkRXh0RGF0YShbb3B0aW9ucy5zdHlsZSwgb3B0aW9ucy5lbGVtZW50c10sIGZ1bmN0aW9uICh0aGVucykge1xuICAgIHZhciBpbml0U3R5bGUgPSB0aGVuc1swXTtcbiAgICB2YXIgaW5pdEVsZXMgPSB0aGVuc1sxXTtcblxuICAgIC8vIGluaXQgc3R5bGVcbiAgICBpZiAoX3Auc3R5bGVFbmFibGVkKSB7XG4gICAgICBjeS5zdHlsZSgpLmFwcGVuZChpbml0U3R5bGUpO1xuICAgIH1cblxuICAgIC8vIGluaXRpYWwgbG9hZFxuICAgIHNldEVsZXNBbmRMYXlvdXQoaW5pdEVsZXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIG9ucmVhZHlcbiAgICAgIGN5LnN0YXJ0QW5pbWF0aW9uTG9vcCgpO1xuICAgICAgX3AucmVhZHkgPSB0cnVlO1xuXG4gICAgICAvLyBpZiBhIHJlYWR5IGNhbGxiYWNrIGlzIHNwZWNpZmllZCBhcyBhbiBvcHRpb24sIHRoZSBiaW5kIGl0XG4gICAgICBpZiAoZm4kNihvcHRpb25zLnJlYWR5KSkge1xuICAgICAgICBjeS5vbigncmVhZHknLCBvcHRpb25zLnJlYWR5KTtcbiAgICAgIH1cblxuICAgICAgLy8gYmluZCBhbGwgdGhlIHJlYWR5IGhhbmRsZXJzIHJlZ2lzdGVyZWQgYmVmb3JlIGNyZWF0aW5nIHRoaXMgaW5zdGFuY2VcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVhZGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZm4gPSByZWFkaWVzW2ldO1xuICAgICAgICBjeS5vbigncmVhZHknLCBmbik7XG4gICAgICB9XG4gICAgICBpZiAocmVnKSB7XG4gICAgICAgIHJlZy5yZWFkaWVzID0gW107XG4gICAgICB9IC8vIGNsZWFyIGIvYyB3ZSd2ZSBib3VuZCB0aGVtIGFsbCBhbmQgZG9uJ3Qgd2FudCB0byBrZWVwIGl0IGFyb3VuZCBpbiBjYXNlIGEgbmV3IGNvcmUgdXNlcyB0aGUgc2FtZSBkaXYgZXRjXG5cbiAgICAgIGN5LmVtaXQoJ3JlYWR5Jyk7XG4gICAgfSwgb3B0aW9ucy5kb25lKTtcbiAgfSk7XG59O1xudmFyIGNvcmVmbiA9IENvcmUucHJvdG90eXBlOyAvLyBzaG9ydCBhbGlhc1xuXG5leHRlbmQoY29yZWZuLCB7XG4gIGluc3RhbmNlU3RyaW5nOiBmdW5jdGlvbiBpbnN0YW5jZVN0cmluZygpIHtcbiAgICByZXR1cm4gJ2NvcmUnO1xuICB9LFxuICBpc1JlYWR5OiBmdW5jdGlvbiBpc1JlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnJlYWR5O1xuICB9LFxuICBkZXN0cm95ZWQ6IGZ1bmN0aW9uIGRlc3Ryb3llZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5kZXN0cm95ZWQ7XG4gIH0sXG4gIHJlYWR5OiBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIGlmICh0aGlzLmlzUmVhZHkoKSkge1xuICAgICAgdGhpcy5lbWl0dGVyKCkuZW1pdCgncmVhZHknLCBbXSwgZm4pOyAvLyBqdXN0IGNhbGxzIGZuIGFzIHRob3VnaCB0cmlnZ2VyZWQgdmlhIHJlYWR5IGV2ZW50XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub24oJ3JlYWR5JywgZm4pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIGlmIChjeS5kZXN0cm95ZWQoKSkgcmV0dXJuO1xuICAgIGN5LnN0b3BBbmltYXRpb25Mb29wKCk7XG4gICAgY3kuZGVzdHJveVJlbmRlcmVyKCk7XG4gICAgdGhpcy5lbWl0KCdkZXN0cm95Jyk7XG4gICAgY3kuX3ByaXZhdGUuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICByZXR1cm4gY3k7XG4gIH0sXG4gIGhhc0VsZW1lbnRXaXRoSWQ6IGZ1bmN0aW9uIGhhc0VsZW1lbnRXaXRoSWQoaWQpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5lbGVtZW50cy5oYXNFbGVtZW50V2l0aElkKGlkKTtcbiAgfSxcbiAgZ2V0RWxlbWVudEJ5SWQ6IGZ1bmN0aW9uIGdldEVsZW1lbnRCeUlkKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuZWxlbWVudHMuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICB9LFxuICBoYXNDb21wb3VuZE5vZGVzOiBmdW5jdGlvbiBoYXNDb21wb3VuZE5vZGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmhhc0NvbXBvdW5kTm9kZXM7XG4gIH0sXG4gIGhlYWRsZXNzOiBmdW5jdGlvbiBoZWFkbGVzcygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5yZW5kZXJlci5pc0hlYWRsZXNzKCk7XG4gIH0sXG4gIHN0eWxlRW5hYmxlZDogZnVuY3Rpb24gc3R5bGVFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnN0eWxlRW5hYmxlZDtcbiAgfSxcbiAgYWRkVG9Qb29sOiBmdW5jdGlvbiBhZGRUb1Bvb2woZWxlcykge1xuICAgIHRoaXMuX3ByaXZhdGUuZWxlbWVudHMubWVyZ2UoZWxlcyk7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgcmVtb3ZlRnJvbVBvb2w6IGZ1bmN0aW9uIHJlbW92ZUZyb21Qb29sKGVsZXMpIHtcbiAgICB0aGlzLl9wcml2YXRlLmVsZW1lbnRzLnVubWVyZ2UoZWxlcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGNvbnRhaW5lcjogZnVuY3Rpb24gY29udGFpbmVyKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmNvbnRhaW5lciB8fCBudWxsO1xuICB9LFxuICB3aW5kb3c6IGZ1bmN0aW9uIHdpbmRvdygpIHtcbiAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fcHJpdmF0ZS5jb250YWluZXI7XG4gICAgaWYgKGNvbnRhaW5lciA9PSBudWxsKSByZXR1cm4gX3dpbmRvdztcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IHRoaXMuX3ByaXZhdGUuY29udGFpbmVyLm93bmVyRG9jdW1lbnQ7XG4gICAgaWYgKG93bmVyRG9jdW1lbnQgPT09IHVuZGVmaW5lZCB8fCBvd25lckRvY3VtZW50ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBfd2luZG93O1xuICAgIH1cbiAgICByZXR1cm4gb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCBfd2luZG93O1xuICB9LFxuICBtb3VudDogZnVuY3Rpb24gbW91bnQoY29udGFpbmVyKSB7XG4gICAgaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBjeSA9IHRoaXM7XG4gICAgdmFyIF9wID0gY3kuX3ByaXZhdGU7XG4gICAgdmFyIG9wdGlvbnMgPSBfcC5vcHRpb25zO1xuICAgIGlmICghaHRtbEVsZW1lbnQoY29udGFpbmVyKSAmJiBodG1sRWxlbWVudChjb250YWluZXJbMF0pKSB7XG4gICAgICBjb250YWluZXIgPSBjb250YWluZXJbMF07XG4gICAgfVxuICAgIGN5LnN0b3BBbmltYXRpb25Mb29wKCk7XG4gICAgY3kuZGVzdHJveVJlbmRlcmVyKCk7XG4gICAgX3AuY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIF9wLnN0eWxlRW5hYmxlZCA9IHRydWU7XG4gICAgY3kuaW52YWxpZGF0ZVNpemUoKTtcbiAgICBjeS5pbml0UmVuZGVyZXIoZXh0ZW5kKHt9LCBvcHRpb25zLCBvcHRpb25zLnJlbmRlcmVyLCB7XG4gICAgICAvLyBhbGxvdyBjdXN0b20gcmVuZGVyZXIgbmFtZSB0byBiZSByZS11c2VkLCBvdGhlcndpc2UgdXNlIGNhbnZhc1xuICAgICAgbmFtZTogb3B0aW9ucy5yZW5kZXJlci5uYW1lID09PSAnbnVsbCcgPyAnY2FudmFzJyA6IG9wdGlvbnMucmVuZGVyZXIubmFtZVxuICAgIH0pKTtcbiAgICBjeS5zdGFydEFuaW1hdGlvbkxvb3AoKTtcbiAgICBjeS5zdHlsZShvcHRpb25zLnN0eWxlKTtcbiAgICBjeS5lbWl0KCdtb3VudCcpO1xuICAgIHJldHVybiBjeTtcbiAgfSxcbiAgdW5tb3VudDogZnVuY3Rpb24gdW5tb3VudCgpIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIGN5LnN0b3BBbmltYXRpb25Mb29wKCk7XG4gICAgY3kuZGVzdHJveVJlbmRlcmVyKCk7XG4gICAgY3kuaW5pdFJlbmRlcmVyKHtcbiAgICAgIG5hbWU6ICdudWxsJ1xuICAgIH0pO1xuICAgIGN5LmVtaXQoJ3VubW91bnQnKTtcbiAgICByZXR1cm4gY3k7XG4gIH0sXG4gIG9wdGlvbnM6IGZ1bmN0aW9uIG9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIGNvcHkodGhpcy5fcHJpdmF0ZS5vcHRpb25zKTtcbiAgfSxcbiAganNvbjogZnVuY3Rpb24ganNvbihvYmopIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIHZhciBfcCA9IGN5Ll9wcml2YXRlO1xuICAgIHZhciBlbGVzID0gY3kubXV0YWJsZUVsZW1lbnRzKCk7XG4gICAgdmFyIGdldEZyZXNoUmVmID0gZnVuY3Rpb24gZ2V0RnJlc2hSZWYoZWxlKSB7XG4gICAgICByZXR1cm4gY3kuZ2V0RWxlbWVudEJ5SWQoZWxlLmlkKCkpO1xuICAgIH07XG4gICAgaWYgKHBsYWluT2JqZWN0KG9iaikpIHtcbiAgICAgIC8vIHNldFxuXG4gICAgICBjeS5zdGFydEJhdGNoKCk7XG4gICAgICBpZiAob2JqLmVsZW1lbnRzKSB7XG4gICAgICAgIHZhciBpZEluSnNvbiA9IHt9O1xuICAgICAgICB2YXIgdXBkYXRlRWxlcyA9IGZ1bmN0aW9uIHVwZGF0ZUVsZXMoanNvbnMsIGdyKSB7XG4gICAgICAgICAgdmFyIHRvQWRkID0gW107XG4gICAgICAgICAgdmFyIHRvTW9kID0gW107XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBqc29ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGpzb24gPSBqc29uc1tpXTtcbiAgICAgICAgICAgIGlmICghanNvbi5kYXRhLmlkKSB7XG4gICAgICAgICAgICAgIHdhcm4oJ2N5Lmpzb24oKSBjYW5ub3QgaGFuZGxlIGVsZW1lbnRzIHdpdGhvdXQgYW4gSUQgYXR0cmlidXRlJyk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGlkID0gJycgKyBqc29uLmRhdGEuaWQ7IC8vIGlkIG11c3QgYmUgc3RyaW5nXG4gICAgICAgICAgICB2YXIgZWxlID0gY3kuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICAgICAgaWRJbkpzb25baWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChlbGUubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgIC8vIGV4aXN0aW5nIGVsZW1lbnQgc2hvdWxkIGJlIHVwZGF0ZWRcbiAgICAgICAgICAgICAgdG9Nb2QucHVzaCh7XG4gICAgICAgICAgICAgICAgZWxlOiBlbGUsXG4gICAgICAgICAgICAgICAganNvbjoganNvblxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBzaG91bGQgYmUgYWRkZWRcbiAgICAgICAgICAgICAgaWYgKGdyKSB7XG4gICAgICAgICAgICAgICAganNvbi5ncm91cCA9IGdyO1xuICAgICAgICAgICAgICAgIHRvQWRkLnB1c2goanNvbik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9BZGQucHVzaChqc29uKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjeS5hZGQodG9BZGQpO1xuICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCB0b01vZC5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBfdG9Nb2QkX2kgPSB0b01vZFtfaV0sXG4gICAgICAgICAgICAgIF9lbGUgPSBfdG9Nb2QkX2kuZWxlLFxuICAgICAgICAgICAgICBfanNvbiA9IF90b01vZCRfaS5qc29uO1xuICAgICAgICAgICAgX2VsZS5qc29uKF9qc29uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmIChhcnJheShvYmouZWxlbWVudHMpKSB7XG4gICAgICAgICAgLy8gZWxlbWVudHM6IFtdXG4gICAgICAgICAgdXBkYXRlRWxlcyhvYmouZWxlbWVudHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGVsZW1lbnRzOiB7IG5vZGVzOiBbXSwgZWRnZXM6IFtdIH1cbiAgICAgICAgICB2YXIgZ3JzID0gWydub2RlcycsICdlZGdlcyddO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZ3IgPSBncnNbaV07XG4gICAgICAgICAgICB2YXIgZWxlbWVudHMgPSBvYmouZWxlbWVudHNbZ3JdO1xuICAgICAgICAgICAgaWYgKGFycmF5KGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICB1cGRhdGVFbGVzKGVsZW1lbnRzLCBncik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnRzVG9SZW1vdmUgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICAgIGVsZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gIWlkSW5Kc29uW2VsZS5pZCgpXTtcbiAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgaWYgKGVsZS5pc1BhcmVudCgpKSB7XG4gICAgICAgICAgICBwYXJlbnRzVG9SZW1vdmUubWVyZ2UoZWxlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlLnJlbW92ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gc28gdGhhdCBjaGlsZHJlbiBhcmUgbm90IHJlbW92ZWQgdy9wYXJlbnRcbiAgICAgICAgcGFyZW50c1RvUmVtb3ZlLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgIHJldHVybiBlbGUuY2hpbGRyZW4oKS5tb3ZlKHtcbiAgICAgICAgICAgIHBhcmVudDogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBpbnRlcm1lZGlhdGUgcGFyZW50cyBtYXkgYmUgbW92ZWQgYnkgcHJpb3IgbGluZSwgc28gbWFrZSBzdXJlIHdlIHJlbW92ZSBieSBmcmVzaCByZWZzXG4gICAgICAgIHBhcmVudHNUb1JlbW92ZS5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0RnJlc2hSZWYoZWxlKS5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAob2JqLnN0eWxlKSB7XG4gICAgICAgIGN5LnN0eWxlKG9iai5zdHlsZSk7XG4gICAgICB9XG4gICAgICBpZiAob2JqLnpvb20gIT0gbnVsbCAmJiBvYmouem9vbSAhPT0gX3Auem9vbSkge1xuICAgICAgICBjeS56b29tKG9iai56b29tKTtcbiAgICAgIH1cbiAgICAgIGlmIChvYmoucGFuKSB7XG4gICAgICAgIGlmIChvYmoucGFuLnggIT09IF9wLnBhbi54IHx8IG9iai5wYW4ueSAhPT0gX3AucGFuLnkpIHtcbiAgICAgICAgICBjeS5wYW4ob2JqLnBhbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChvYmouZGF0YSkge1xuICAgICAgICBjeS5kYXRhKG9iai5kYXRhKTtcbiAgICAgIH1cbiAgICAgIHZhciBmaWVsZHMgPSBbJ21pblpvb20nLCAnbWF4Wm9vbScsICd6b29taW5nRW5hYmxlZCcsICd1c2VyWm9vbWluZ0VuYWJsZWQnLCAncGFubmluZ0VuYWJsZWQnLCAndXNlclBhbm5pbmdFbmFibGVkJywgJ2JveFNlbGVjdGlvbkVuYWJsZWQnLCAnYXV0b2xvY2snLCAnYXV0b3VuZ3JhYmlmeScsICdhdXRvdW5zZWxlY3RpZnknLCAnbXVsdGlDbGlja0RlYm91bmNlVGltZSddO1xuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgZmllbGRzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgdmFyIGYgPSBmaWVsZHNbX2kyXTtcbiAgICAgICAgaWYgKG9ialtmXSAhPSBudWxsKSB7XG4gICAgICAgICAgY3lbZl0ob2JqW2ZdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY3kuZW5kQmF0Y2goKTtcbiAgICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBnZXRcbiAgICAgIHZhciBmbGF0ID0gISFvYmo7XG4gICAgICB2YXIganNvbiA9IHt9O1xuICAgICAgaWYgKGZsYXQpIHtcbiAgICAgICAganNvbi5lbGVtZW50cyA9IHRoaXMuZWxlbWVudHMoKS5tYXAoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgIHJldHVybiBlbGUuanNvbigpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGpzb24uZWxlbWVudHMgPSB7fTtcbiAgICAgICAgZWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICB2YXIgZ3JvdXAgPSBlbGUuZ3JvdXAoKTtcbiAgICAgICAgICBpZiAoIWpzb24uZWxlbWVudHNbZ3JvdXBdKSB7XG4gICAgICAgICAgICBqc29uLmVsZW1lbnRzW2dyb3VwXSA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBqc29uLmVsZW1lbnRzW2dyb3VwXS5wdXNoKGVsZS5qc29uKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9wcml2YXRlLnN0eWxlRW5hYmxlZCkge1xuICAgICAgICBqc29uLnN0eWxlID0gY3kuc3R5bGUoKS5qc29uKCk7XG4gICAgICB9XG4gICAgICBqc29uLmRhdGEgPSBjb3B5KGN5LmRhdGEoKSk7XG4gICAgICB2YXIgb3B0aW9ucyA9IF9wLm9wdGlvbnM7XG4gICAgICBqc29uLnpvb21pbmdFbmFibGVkID0gX3Auem9vbWluZ0VuYWJsZWQ7XG4gICAgICBqc29uLnVzZXJab29taW5nRW5hYmxlZCA9IF9wLnVzZXJab29taW5nRW5hYmxlZDtcbiAgICAgIGpzb24uem9vbSA9IF9wLnpvb207XG4gICAgICBqc29uLm1pblpvb20gPSBfcC5taW5ab29tO1xuICAgICAganNvbi5tYXhab29tID0gX3AubWF4Wm9vbTtcbiAgICAgIGpzb24ucGFubmluZ0VuYWJsZWQgPSBfcC5wYW5uaW5nRW5hYmxlZDtcbiAgICAgIGpzb24udXNlclBhbm5pbmdFbmFibGVkID0gX3AudXNlclBhbm5pbmdFbmFibGVkO1xuICAgICAganNvbi5wYW4gPSBjb3B5KF9wLnBhbik7XG4gICAgICBqc29uLmJveFNlbGVjdGlvbkVuYWJsZWQgPSBfcC5ib3hTZWxlY3Rpb25FbmFibGVkO1xuICAgICAganNvbi5yZW5kZXJlciA9IGNvcHkob3B0aW9ucy5yZW5kZXJlcik7XG4gICAgICBqc29uLmhpZGVFZGdlc09uVmlld3BvcnQgPSBvcHRpb25zLmhpZGVFZGdlc09uVmlld3BvcnQ7XG4gICAgICBqc29uLnRleHR1cmVPblZpZXdwb3J0ID0gb3B0aW9ucy50ZXh0dXJlT25WaWV3cG9ydDtcbiAgICAgIGpzb24ud2hlZWxTZW5zaXRpdml0eSA9IG9wdGlvbnMud2hlZWxTZW5zaXRpdml0eTtcbiAgICAgIGpzb24ubW90aW9uQmx1ciA9IG9wdGlvbnMubW90aW9uQmx1cjtcbiAgICAgIGpzb24ubXVsdGlDbGlja0RlYm91bmNlVGltZSA9IG9wdGlvbnMubXVsdGlDbGlja0RlYm91bmNlVGltZTtcbiAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbiAgfVxufSk7XG5jb3JlZm4uJGlkID0gY29yZWZuLmdldEVsZW1lbnRCeUlkO1xuW2NvcmVmbiQ5LCBjb3JlZm4kOCwgZWxlc2ZuLCBjb3JlZm4kNywgY29yZWZuJDYsIGNvcmVmbiQ1LCBjb3JlZm4kNCwgY29yZWZuJDMsIGNvcmVmbiQyLCBjb3JlZm4kMSwgZm5dLmZvckVhY2goZnVuY3Rpb24gKHByb3BzKSB7XG4gIGV4dGVuZChjb3JlZm4sIHByb3BzKTtcbn0pO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGRlZmF1bHRzJDcgPSB7XG4gIGZpdDogdHJ1ZSxcbiAgLy8gd2hldGhlciB0byBmaXQgdGhlIHZpZXdwb3J0IHRvIHRoZSBncmFwaFxuICBkaXJlY3RlZDogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdGhlIHRyZWUgaXMgZGlyZWN0ZWQgZG93bndhcmRzIChvciBlZGdlcyBjYW4gcG9pbnQgaW4gYW55IGRpcmVjdGlvbiBpZiBmYWxzZSlcbiAgcGFkZGluZzogMzAsXG4gIC8vIHBhZGRpbmcgb24gZml0XG4gIGNpcmNsZTogZmFsc2UsXG4gIC8vIHB1dCBkZXB0aHMgaW4gY29uY2VudHJpYyBjaXJjbGVzIGlmIHRydWUsIHB1dCBkZXB0aHMgdG9wIGRvd24gaWYgZmFsc2VcbiAgZ3JpZDogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gY3JlYXRlIGFuIGV2ZW4gZ3JpZCBpbnRvIHdoaWNoIHRoZSBEQUcgaXMgcGxhY2VkIChjaXJjbGU6ZmFsc2Ugb25seSlcbiAgc3BhY2luZ0ZhY3RvcjogMS43NSxcbiAgLy8gcG9zaXRpdmUgc3BhY2luZyBmYWN0b3IsIGxhcmdlciA9PiBtb3JlIHNwYWNlIGJldHdlZW4gbm9kZXMgKE4uQi4gbi9hIGlmIGNhdXNlcyBvdmVybGFwKVxuICBib3VuZGluZ0JveDogdW5kZWZpbmVkLFxuICAvLyBjb25zdHJhaW4gbGF5b3V0IGJvdW5kczsgeyB4MSwgeTEsIHgyLCB5MiB9IG9yIHsgeDEsIHkxLCB3LCBoIH1cbiAgYXZvaWRPdmVybGFwOiB0cnVlLFxuICAvLyBwcmV2ZW50cyBub2RlIG92ZXJsYXAsIG1heSBvdmVyZmxvdyBib3VuZGluZ0JveCBpZiBub3QgZW5vdWdoIHNwYWNlXG4gIG5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsczogZmFsc2UsXG4gIC8vIEV4Y2x1ZGVzIHRoZSBsYWJlbCB3aGVuIGNhbGN1bGF0aW5nIG5vZGUgYm91bmRpbmcgYm94ZXMgZm9yIHRoZSBsYXlvdXQgYWxnb3JpdGhtXG4gIHJvb3RzOiB1bmRlZmluZWQsXG4gIC8vIHRoZSByb290cyBvZiB0aGUgdHJlZXNcbiAgZGVwdGhTb3J0OiB1bmRlZmluZWQsXG4gIC8vIGEgc29ydGluZyBmdW5jdGlvbiB0byBvcmRlciBub2RlcyBhdCBlcXVhbCBkZXB0aC4gZS5nLiBmdW5jdGlvbihhLCBiKXsgcmV0dXJuIGEuZGF0YSgnd2VpZ2h0JykgLSBiLmRhdGEoJ3dlaWdodCcpIH1cbiAgYW5pbWF0ZTogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gdHJhbnNpdGlvbiB0aGUgbm9kZSBwb3NpdGlvbnNcbiAgYW5pbWF0aW9uRHVyYXRpb246IDUwMCxcbiAgLy8gZHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zIGlmIGVuYWJsZWRcbiAgYW5pbWF0aW9uRWFzaW5nOiB1bmRlZmluZWQsXG4gIC8vIGVhc2luZyBvZiBhbmltYXRpb24gaWYgZW5hYmxlZCxcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLiAgQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkLiAgTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgcmVhZHk6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRzdG9wXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9IC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0c1xufTtcblxudmFyIGRlcHJlY2F0ZWRPcHRpb25EZWZhdWx0cyA9IHtcbiAgbWF4aW1hbDogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gc2hpZnQgbm9kZXMgZG93biB0aGVpciBuYXR1cmFsIEJGUyBkZXB0aHMgaW4gb3JkZXIgdG8gYXZvaWQgdXB3YXJkcyBlZGdlcyAoREFHUyBvbmx5KTsgc2V0dGluZyBhY3ljbGljIHRvIHRydWUgc2V0cyBtYXhpbWFsIHRvIHRydWUgYWxzb1xuICBhY3ljbGljOiBmYWxzZSAvLyB3aGV0aGVyIHRoZSB0cmVlIGlzIGFjeWNsaWMgYW5kIHRodXMgYSBub2RlIGNvdWxkIGJlIHNoaWZ0ZWQgKGR1ZSB0byB0aGUgbWF4aW1hbCBvcHRpb24pIG11bHRpcGxlIHRpbWVzIHdpdGhvdXQgY2F1c2luZyBhbiBpbmZpbml0ZSBsb29wOyBzZXR0aW5nIHRvIHRydWUgc2V0cyBtYXhpbWFsIHRvIHRydWUgYWxzbzsgaWYgeW91IGFyZSB1bmNlcnRhaW4gd2hldGhlciBhIHRyZWUgaXMgYWN5Y2xpYywgc2V0IHRvIGZhbHNlIHRvIGF2b2lkIHBvdGVudGlhbCBpbmZpbml0ZSBsb29wc1xufTtcblxuLyogZXNsaW50LWVuYWJsZSAqL1xuXG52YXIgZ2V0SW5mbyA9IGZ1bmN0aW9uIGdldEluZm8oZWxlKSB7XG4gIHJldHVybiBlbGUuc2NyYXRjaCgnYnJlYWR0aGZpcnN0Jyk7XG59O1xudmFyIHNldEluZm8gPSBmdW5jdGlvbiBzZXRJbmZvKGVsZSwgb2JqKSB7XG4gIHJldHVybiBlbGUuc2NyYXRjaCgnYnJlYWR0aGZpcnN0Jywgb2JqKTtcbn07XG5mdW5jdGlvbiBCcmVhZHRoRmlyc3RMYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRzJDcsIGRlcHJlY2F0ZWRPcHRpb25EZWZhdWx0cywgb3B0aW9ucyk7XG59XG5CcmVhZHRoRmlyc3RMYXlvdXQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHBhcmFtcyA9IHRoaXMub3B0aW9ucztcbiAgdmFyIG9wdGlvbnMgPSBwYXJhbXM7XG4gIHZhciBjeSA9IHBhcmFtcy5jeTtcbiAgdmFyIGVsZXMgPSBvcHRpb25zLmVsZXM7XG4gIHZhciBub2RlcyA9IGVsZXMubm9kZXMoKS5maWx0ZXIoZnVuY3Rpb24gKG4pIHtcbiAgICByZXR1cm4gIW4uaXNQYXJlbnQoKTtcbiAgfSk7XG4gIHZhciBncmFwaCA9IGVsZXM7XG4gIHZhciBkaXJlY3RlZCA9IG9wdGlvbnMuZGlyZWN0ZWQ7XG4gIHZhciBtYXhpbWFsID0gb3B0aW9ucy5hY3ljbGljIHx8IG9wdGlvbnMubWF4aW1hbCB8fCBvcHRpb25zLm1heGltYWxBZGp1c3RtZW50cyA+IDA7IC8vIG1heGltYWxBZGp1c3RtZW50cyBmb3IgY29tcGF0LiB3LyBvbGQgY29kZTsgYWxzbywgc2V0dGluZyBhY3ljbGljIHRvIHRydWUgc2V0cyBtYXhpbWFsIHRvIHRydWVcblxuICB2YXIgYmIgPSBtYWtlQm91bmRpbmdCb3gob3B0aW9ucy5ib3VuZGluZ0JveCA/IG9wdGlvbnMuYm91bmRpbmdCb3ggOiB7XG4gICAgeDE6IDAsXG4gICAgeTE6IDAsXG4gICAgdzogY3kud2lkdGgoKSxcbiAgICBoOiBjeS5oZWlnaHQoKVxuICB9KTtcbiAgdmFyIHJvb3RzO1xuICBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihvcHRpb25zLnJvb3RzKSkge1xuICAgIHJvb3RzID0gb3B0aW9ucy5yb290cztcbiAgfSBlbHNlIGlmIChhcnJheShvcHRpb25zLnJvb3RzKSkge1xuICAgIHZhciByb290c0FycmF5ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRpb25zLnJvb3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWQgPSBvcHRpb25zLnJvb3RzW2ldO1xuICAgICAgdmFyIGVsZSA9IGN5LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgIHJvb3RzQXJyYXkucHVzaChlbGUpO1xuICAgIH1cbiAgICByb290cyA9IGN5LmNvbGxlY3Rpb24ocm9vdHNBcnJheSk7XG4gIH0gZWxzZSBpZiAoc3RyaW5nKG9wdGlvbnMucm9vdHMpKSB7XG4gICAgcm9vdHMgPSBjeS4kKG9wdGlvbnMucm9vdHMpO1xuICB9IGVsc2Uge1xuICAgIGlmIChkaXJlY3RlZCkge1xuICAgICAgcm9vdHMgPSBub2Rlcy5yb290cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgY29tcG9uZW50cyA9IGVsZXMuY29tcG9uZW50cygpO1xuICAgICAgcm9vdHMgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChfaSkge1xuICAgICAgICB2YXIgY29tcCA9IGNvbXBvbmVudHNbX2ldO1xuICAgICAgICB2YXIgbWF4RGVncmVlID0gY29tcC5tYXhEZWdyZWUoZmFsc2UpO1xuICAgICAgICB2YXIgY29tcFJvb3RzID0gY29tcC5maWx0ZXIoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgIHJldHVybiBlbGUuZGVncmVlKGZhbHNlKSA9PT0gbWF4RGVncmVlO1xuICAgICAgICB9KTtcbiAgICAgICAgcm9vdHMgPSByb290cy5hZGQoY29tcFJvb3RzKTtcbiAgICAgIH07XG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgY29tcG9uZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgX2xvb3AoX2kpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB2YXIgZGVwdGhzID0gW107XG4gIHZhciBmb3VuZEJ5QmZzID0ge307XG4gIHZhciBhZGRUb0RlcHRoID0gZnVuY3Rpb24gYWRkVG9EZXB0aChlbGUsIGQpIHtcbiAgICBpZiAoZGVwdGhzW2RdID09IG51bGwpIHtcbiAgICAgIGRlcHRoc1tkXSA9IFtdO1xuICAgIH1cbiAgICB2YXIgaSA9IGRlcHRoc1tkXS5sZW5ndGg7XG4gICAgZGVwdGhzW2RdLnB1c2goZWxlKTtcbiAgICBzZXRJbmZvKGVsZSwge1xuICAgICAgaW5kZXg6IGksXG4gICAgICBkZXB0aDogZFxuICAgIH0pO1xuICB9O1xuICB2YXIgY2hhbmdlRGVwdGggPSBmdW5jdGlvbiBjaGFuZ2VEZXB0aChlbGUsIG5ld0RlcHRoKSB7XG4gICAgdmFyIF9nZXRJbmZvID0gZ2V0SW5mbyhlbGUpLFxuICAgICAgZGVwdGggPSBfZ2V0SW5mby5kZXB0aCxcbiAgICAgIGluZGV4ID0gX2dldEluZm8uaW5kZXg7XG4gICAgZGVwdGhzW2RlcHRoXVtpbmRleF0gPSBudWxsO1xuICAgIGFkZFRvRGVwdGgoZWxlLCBuZXdEZXB0aCk7XG4gIH07XG5cbiAgLy8gZmluZCB0aGUgZGVwdGhzIG9mIHRoZSBub2Rlc1xuICBncmFwaC5iZnMoe1xuICAgIHJvb3RzOiByb290cyxcbiAgICBkaXJlY3RlZDogb3B0aW9ucy5kaXJlY3RlZCxcbiAgICB2aXNpdDogZnVuY3Rpb24gdmlzaXQobm9kZSwgZWRnZSwgcE5vZGUsIGksIGRlcHRoKSB7XG4gICAgICB2YXIgZWxlID0gbm9kZVswXTtcbiAgICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuICAgICAgYWRkVG9EZXB0aChlbGUsIGRlcHRoKTtcbiAgICAgIGZvdW5kQnlCZnNbaWRdID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIGNoZWNrIGZvciBub2RlcyBub3QgZm91bmQgYnkgYmZzXG4gIHZhciBvcnBoYW5Ob2RlcyA9IFtdO1xuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBub2Rlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgdmFyIF9lbGUgPSBub2Rlc1tfaTJdO1xuICAgIGlmIChmb3VuZEJ5QmZzW19lbGUuaWQoKV0pIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcnBoYW5Ob2Rlcy5wdXNoKF9lbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFzc2lnbiB0aGUgbm9kZXMgYSBkZXB0aCBhbmQgaW5kZXhcblxuICB2YXIgYXNzaWduRGVwdGhzQXQgPSBmdW5jdGlvbiBhc3NpZ25EZXB0aHNBdChpKSB7XG4gICAgdmFyIGVsZXMgPSBkZXB0aHNbaV07XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBlbGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgX2VsZTIgPSBlbGVzW2pdO1xuICAgICAgaWYgKF9lbGUyID09IG51bGwpIHtcbiAgICAgICAgZWxlcy5zcGxpY2UoaiwgMSk7XG4gICAgICAgIGotLTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzZXRJbmZvKF9lbGUyLCB7XG4gICAgICAgIGRlcHRoOiBpLFxuICAgICAgICBpbmRleDogalxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICB2YXIgYXNzaWduRGVwdGhzID0gZnVuY3Rpb24gYXNzaWduRGVwdGhzKCkge1xuICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGRlcHRocy5sZW5ndGg7IF9pMysrKSB7XG4gICAgICBhc3NpZ25EZXB0aHNBdChfaTMpO1xuICAgIH1cbiAgfTtcbiAgdmFyIGFkanVzdE1heGltYWxseSA9IGZ1bmN0aW9uIGFkanVzdE1heGltYWxseShlbGUsIHNoaWZ0ZWQpIHtcbiAgICB2YXIgZUluZm8gPSBnZXRJbmZvKGVsZSk7XG4gICAgdmFyIGluY29tZXJzID0gZWxlLmluY29tZXJzKCkuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuICAgICAgcmV0dXJuIGVsLmlzTm9kZSgpICYmIGVsZXMuaGFzKGVsKTtcbiAgICB9KTtcbiAgICB2YXIgbWF4RGVwdGggPSAtMTtcbiAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IGluY29tZXJzLmxlbmd0aDsgaysrKSB7XG4gICAgICB2YXIgaW5jbXIgPSBpbmNvbWVyc1trXTtcbiAgICAgIHZhciBpSW5mbyA9IGdldEluZm8oaW5jbXIpO1xuICAgICAgbWF4RGVwdGggPSBNYXRoLm1heChtYXhEZXB0aCwgaUluZm8uZGVwdGgpO1xuICAgIH1cbiAgICBpZiAoZUluZm8uZGVwdGggPD0gbWF4RGVwdGgpIHtcbiAgICAgIGlmICghb3B0aW9ucy5hY3ljbGljICYmIHNoaWZ0ZWRbaWRdKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgdmFyIG5ld0RlcHRoID0gbWF4RGVwdGggKyAxO1xuICAgICAgY2hhbmdlRGVwdGgoZWxlLCBuZXdEZXB0aCk7XG4gICAgICBzaGlmdGVkW2lkXSA9IG5ld0RlcHRoO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvLyBmb3IgdGhlIGRpcmVjdGVkIGNhc2UsIHRyeSB0byBtYWtlIHRoZSBlZGdlcyBhbGwgZ28gZG93biAoaS5lLiBkZXB0aCBpID0+IGRlcHRoIGkgKyAxKVxuICBpZiAoZGlyZWN0ZWQgJiYgbWF4aW1hbCkge1xuICAgIHZhciBRID0gW107XG4gICAgdmFyIHNoaWZ0ZWQgPSB7fTtcbiAgICB2YXIgZW5xdWV1ZSA9IGZ1bmN0aW9uIGVucXVldWUobikge1xuICAgICAgcmV0dXJuIFEucHVzaChuKTtcbiAgICB9O1xuICAgIHZhciBkZXF1ZXVlID0gZnVuY3Rpb24gZGVxdWV1ZSgpIHtcbiAgICAgIHJldHVybiBRLnNoaWZ0KCk7XG4gICAgfTtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICByZXR1cm4gUS5wdXNoKG4pO1xuICAgIH0pO1xuICAgIHdoaWxlIChRLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBfZWxlMyA9IGRlcXVldWUoKTtcbiAgICAgIHZhciBkaWRTaGlmdCA9IGFkanVzdE1heGltYWxseShfZWxlMywgc2hpZnRlZCk7XG4gICAgICBpZiAoZGlkU2hpZnQpIHtcbiAgICAgICAgX2VsZTMub3V0Z29lcnMoKS5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgcmV0dXJuIGVsLmlzTm9kZSgpICYmIGVsZXMuaGFzKGVsKTtcbiAgICAgICAgfSkuZm9yRWFjaChlbnF1ZXVlKTtcbiAgICAgIH0gZWxzZSBpZiAoZGlkU2hpZnQgPT09IG51bGwpIHtcbiAgICAgICAgd2FybignRGV0ZWN0ZWQgZG91YmxlIG1heGltYWwgc2hpZnQgZm9yIG5vZGUgYCcgKyBfZWxlMy5pZCgpICsgJ2AuICBCYWlsaW5nIG1heGltYWwgYWRqdXN0bWVudCBkdWUgdG8gY3ljbGUuICBVc2UgYG9wdGlvbnMubWF4aW1hbDogdHJ1ZWAgb25seSBvbiBEQUdzLicpO1xuICAgICAgICBicmVhazsgLy8gZXhpdCBvbiBmYWlsdXJlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXNzaWduRGVwdGhzKCk7IC8vIGNsZWFyIGhvbGVzXG5cbiAgLy8gZmluZCBtaW4gZGlzdGFuY2Ugd2UgbmVlZCB0byBsZWF2ZSBiZXR3ZWVuIG5vZGVzXG4gIHZhciBtaW5EaXN0YW5jZSA9IDA7XG4gIGlmIChvcHRpb25zLmF2b2lkT3ZlcmxhcCkge1xuICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG5vZGVzLmxlbmd0aDsgX2k0KyspIHtcbiAgICAgIHZhciBuID0gbm9kZXNbX2k0XTtcbiAgICAgIHZhciBuYmIgPSBuLmxheW91dERpbWVuc2lvbnMob3B0aW9ucyk7XG4gICAgICB2YXIgdyA9IG5iYi53O1xuICAgICAgdmFyIGggPSBuYmIuaDtcbiAgICAgIG1pbkRpc3RhbmNlID0gTWF0aC5tYXgobWluRGlzdGFuY2UsIHcsIGgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGdldCB0aGUgd2VpZ2h0ZWQgcGVyY2VudCBmb3IgYW4gZWxlbWVudCBiYXNlZCBvbiBpdHMgY29ubmVjdGl2aXR5IHRvIG90aGVyIGxldmVsc1xuICB2YXIgY2FjaGVkV2VpZ2h0ZWRQZXJjZW50ID0ge307XG4gIHZhciBnZXRXZWlnaHRlZFBlcmNlbnQgPSBmdW5jdGlvbiBnZXRXZWlnaHRlZFBlcmNlbnQoZWxlKSB7XG4gICAgaWYgKGNhY2hlZFdlaWdodGVkUGVyY2VudFtlbGUuaWQoKV0pIHtcbiAgICAgIHJldHVybiBjYWNoZWRXZWlnaHRlZFBlcmNlbnRbZWxlLmlkKCldO1xuICAgIH1cbiAgICB2YXIgZWxlRGVwdGggPSBnZXRJbmZvKGVsZSkuZGVwdGg7XG4gICAgdmFyIG5laWdoYm9ycyA9IGVsZS5uZWlnaGJvcmhvb2QoKTtcbiAgICB2YXIgcGVyY2VudCA9IDA7XG4gICAgdmFyIHNhbXBsZXMgPSAwO1xuICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IG5laWdoYm9ycy5sZW5ndGg7IF9pNSsrKSB7XG4gICAgICB2YXIgbmVpZ2hib3IgPSBuZWlnaGJvcnNbX2k1XTtcbiAgICAgIGlmIChuZWlnaGJvci5pc0VkZ2UoKSB8fCBuZWlnaGJvci5pc1BhcmVudCgpIHx8ICFub2Rlcy5oYXMobmVpZ2hib3IpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGJmID0gZ2V0SW5mbyhuZWlnaGJvcik7XG4gICAgICBpZiAoYmYgPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGJmLmluZGV4O1xuICAgICAgdmFyIGRlcHRoID0gYmYuZGVwdGg7XG5cbiAgICAgIC8vIHVuYXNzaWduZWQgbmVpZ2hib3VycyBzaG91bGRuJ3QgYWZmZWN0IHRoZSBvcmRlcmluZ1xuICAgICAgaWYgKGluZGV4ID09IG51bGwgfHwgZGVwdGggPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBuRGVwdGggPSBkZXB0aHNbZGVwdGhdLmxlbmd0aDtcbiAgICAgIGlmIChkZXB0aCA8IGVsZURlcHRoKSB7XG4gICAgICAgIC8vIG9ubHkgZ2V0IGluZmx1ZW5jZWQgYnkgZWxlbWVudHMgYWJvdmVcbiAgICAgICAgcGVyY2VudCArPSBpbmRleCAvIG5EZXB0aDtcbiAgICAgICAgc2FtcGxlcysrO1xuICAgICAgfVxuICAgIH1cbiAgICBzYW1wbGVzID0gTWF0aC5tYXgoMSwgc2FtcGxlcyk7XG4gICAgcGVyY2VudCA9IHBlcmNlbnQgLyBzYW1wbGVzO1xuICAgIGlmIChzYW1wbGVzID09PSAwKSB7XG4gICAgICAvLyBwdXQgbG9uZSBub2RlcyBhdCB0aGUgc3RhcnRcbiAgICAgIHBlcmNlbnQgPSAwO1xuICAgIH1cbiAgICBjYWNoZWRXZWlnaHRlZFBlcmNlbnRbZWxlLmlkKCldID0gcGVyY2VudDtcbiAgICByZXR1cm4gcGVyY2VudDtcbiAgfTtcblxuICAvLyByZWFycmFuZ2UgdGhlIGluZGljZXMgaW4gZWFjaCBkZXB0aCBsZXZlbCBiYXNlZCBvbiBjb25uZWN0aXZpdHlcblxuICB2YXIgc29ydEZuID0gZnVuY3Rpb24gc29ydEZuKGEsIGIpIHtcbiAgICB2YXIgYXBjdCA9IGdldFdlaWdodGVkUGVyY2VudChhKTtcbiAgICB2YXIgYnBjdCA9IGdldFdlaWdodGVkUGVyY2VudChiKTtcbiAgICB2YXIgZGlmZiA9IGFwY3QgLSBicGN0O1xuICAgIGlmIChkaWZmID09PSAwKSB7XG4gICAgICByZXR1cm4gYXNjZW5kaW5nKGEuaWQoKSwgYi5pZCgpKTsgLy8gbWFrZSBzdXJlIHNvcnQgZG9lc24ndCBoYXZlIGRvbid0LWNhcmUgY29tcGFyaXNvbnNcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGRpZmY7XG4gICAgfVxuICB9O1xuICBpZiAob3B0aW9ucy5kZXB0aFNvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHNvcnRGbiA9IG9wdGlvbnMuZGVwdGhTb3J0O1xuICB9XG5cbiAgLy8gc29ydCBlYWNoIGxldmVsIHRvIG1ha2UgY29ubmVjdGVkIG5vZGVzIGNsb3NlclxuICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBkZXB0aHMubGVuZ3RoOyBfaTYrKykge1xuICAgIGRlcHRoc1tfaTZdLnNvcnQoc29ydEZuKTtcbiAgICBhc3NpZ25EZXB0aHNBdChfaTYpO1xuICB9XG5cbiAgLy8gYXNzaWduIG9ycGhhbiBub2RlcyB0byBhIG5ldyB0b3AtbGV2ZWwgZGVwdGhcbiAgdmFyIG9ycGhhbkRlcHRoID0gW107XG4gIGZvciAodmFyIF9pNyA9IDA7IF9pNyA8IG9ycGhhbk5vZGVzLmxlbmd0aDsgX2k3KyspIHtcbiAgICBvcnBoYW5EZXB0aC5wdXNoKG9ycGhhbk5vZGVzW19pN10pO1xuICB9XG4gIGRlcHRocy51bnNoaWZ0KG9ycGhhbkRlcHRoKTtcbiAgYXNzaWduRGVwdGhzKCk7XG4gIHZhciBiaWdnZXN0RGVwdGhTaXplID0gMDtcbiAgZm9yICh2YXIgX2k4ID0gMDsgX2k4IDwgZGVwdGhzLmxlbmd0aDsgX2k4KyspIHtcbiAgICBiaWdnZXN0RGVwdGhTaXplID0gTWF0aC5tYXgoZGVwdGhzW19pOF0ubGVuZ3RoLCBiaWdnZXN0RGVwdGhTaXplKTtcbiAgfVxuICB2YXIgY2VudGVyID0ge1xuICAgIHg6IGJiLngxICsgYmIudyAvIDIsXG4gICAgeTogYmIueDEgKyBiYi5oIC8gMlxuICB9O1xuICB2YXIgbWF4RGVwdGhTaXplID0gZGVwdGhzLnJlZHVjZShmdW5jdGlvbiAobWF4LCBlbGVzKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KG1heCwgZWxlcy5sZW5ndGgpO1xuICB9LCAwKTtcbiAgdmFyIGdldFBvc2l0aW9uID0gZnVuY3Rpb24gZ2V0UG9zaXRpb24oZWxlKSB7XG4gICAgdmFyIF9nZXRJbmZvMiA9IGdldEluZm8oZWxlKSxcbiAgICAgIGRlcHRoID0gX2dldEluZm8yLmRlcHRoLFxuICAgICAgaW5kZXggPSBfZ2V0SW5mbzIuaW5kZXg7XG4gICAgdmFyIGRlcHRoU2l6ZSA9IGRlcHRoc1tkZXB0aF0ubGVuZ3RoO1xuICAgIHZhciBkaXN0YW5jZVggPSBNYXRoLm1heChiYi53IC8gKChvcHRpb25zLmdyaWQgPyBtYXhEZXB0aFNpemUgOiBkZXB0aFNpemUpICsgMSksIG1pbkRpc3RhbmNlKTtcbiAgICB2YXIgZGlzdGFuY2VZID0gTWF0aC5tYXgoYmIuaCAvIChkZXB0aHMubGVuZ3RoICsgMSksIG1pbkRpc3RhbmNlKTtcbiAgICB2YXIgcmFkaXVzU3RlcFNpemUgPSBNYXRoLm1pbihiYi53IC8gMiAvIGRlcHRocy5sZW5ndGgsIGJiLmggLyAyIC8gZGVwdGhzLmxlbmd0aCk7XG4gICAgcmFkaXVzU3RlcFNpemUgPSBNYXRoLm1heChyYWRpdXNTdGVwU2l6ZSwgbWluRGlzdGFuY2UpO1xuICAgIGlmICghb3B0aW9ucy5jaXJjbGUpIHtcbiAgICAgIHZhciBlcG9zID0ge1xuICAgICAgICB4OiBjZW50ZXIueCArIChpbmRleCArIDEgLSAoZGVwdGhTaXplICsgMSkgLyAyKSAqIGRpc3RhbmNlWCxcbiAgICAgICAgeTogKGRlcHRoICsgMSkgKiBkaXN0YW5jZVlcbiAgICAgIH07XG4gICAgICByZXR1cm4gZXBvcztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJhZGl1cyA9IHJhZGl1c1N0ZXBTaXplICogZGVwdGggKyByYWRpdXNTdGVwU2l6ZSAtIChkZXB0aHMubGVuZ3RoID4gMCAmJiBkZXB0aHNbMF0ubGVuZ3RoIDw9IDMgPyByYWRpdXNTdGVwU2l6ZSAvIDIgOiAwKTtcbiAgICAgIHZhciB0aGV0YSA9IDIgKiBNYXRoLlBJIC8gZGVwdGhzW2RlcHRoXS5sZW5ndGggKiBpbmRleDtcbiAgICAgIGlmIChkZXB0aCA9PT0gMCAmJiBkZXB0aHNbMF0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJhZGl1cyA9IDE7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBjZW50ZXIueCArIHJhZGl1cyAqIE1hdGguY29zKHRoZXRhKSxcbiAgICAgICAgeTogY2VudGVyLnkgKyByYWRpdXMgKiBNYXRoLnNpbih0aGV0YSlcbiAgICAgIH07XG4gICAgfVxuICB9O1xuICBlbGVzLm5vZGVzKCkubGF5b3V0UG9zaXRpb25zKHRoaXMsIG9wdGlvbnMsIGdldFBvc2l0aW9uKTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG52YXIgZGVmYXVsdHMkNiA9IHtcbiAgZml0OiB0cnVlLFxuICAvLyB3aGV0aGVyIHRvIGZpdCB0aGUgdmlld3BvcnQgdG8gdGhlIGdyYXBoXG4gIHBhZGRpbmc6IDMwLFxuICAvLyB0aGUgcGFkZGluZyBvbiBmaXRcbiAgYm91bmRpbmdCb3g6IHVuZGVmaW5lZCxcbiAgLy8gY29uc3RyYWluIGxheW91dCBib3VuZHM7IHsgeDEsIHkxLCB4MiwgeTIgfSBvciB7IHgxLCB5MSwgdywgaCB9XG4gIGF2b2lkT3ZlcmxhcDogdHJ1ZSxcbiAgLy8gcHJldmVudHMgbm9kZSBvdmVybGFwLCBtYXkgb3ZlcmZsb3cgYm91bmRpbmdCb3ggYW5kIHJhZGl1cyBpZiBub3QgZW5vdWdoIHNwYWNlXG4gIG5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsczogZmFsc2UsXG4gIC8vIEV4Y2x1ZGVzIHRoZSBsYWJlbCB3aGVuIGNhbGN1bGF0aW5nIG5vZGUgYm91bmRpbmcgYm94ZXMgZm9yIHRoZSBsYXlvdXQgYWxnb3JpdGhtXG4gIHNwYWNpbmdGYWN0b3I6IHVuZGVmaW5lZCxcbiAgLy8gQXBwbGllcyBhIG11bHRpcGxpY2F0aXZlIGZhY3RvciAoPjApIHRvIGV4cGFuZCBvciBjb21wcmVzcyB0aGUgb3ZlcmFsbCBhcmVhIHRoYXQgdGhlIG5vZGVzIHRha2UgdXBcbiAgcmFkaXVzOiB1bmRlZmluZWQsXG4gIC8vIHRoZSByYWRpdXMgb2YgdGhlIGNpcmNsZVxuICBzdGFydEFuZ2xlOiAzIC8gMiAqIE1hdGguUEksXG4gIC8vIHdoZXJlIG5vZGVzIHN0YXJ0IGluIHJhZGlhbnNcbiAgc3dlZXA6IHVuZGVmaW5lZCxcbiAgLy8gaG93IG1hbnkgcmFkaWFucyBzaG91bGQgYmUgYmV0d2VlbiB0aGUgZmlyc3QgYW5kIGxhc3Qgbm9kZSAoZGVmYXVsdHMgdG8gZnVsbCBjaXJjbGUpXG4gIGNsb2Nrd2lzZTogdHJ1ZSxcbiAgLy8gd2hldGhlciB0aGUgbGF5b3V0IHNob3VsZCBnbyBjbG9ja3dpc2UgKHRydWUpIG9yIGNvdW50ZXJjbG9ja3dpc2UvYW50aWNsb2Nrd2lzZSAoZmFsc2UpXG4gIHNvcnQ6IHVuZGVmaW5lZCxcbiAgLy8gYSBzb3J0aW5nIGZ1bmN0aW9uIHRvIG9yZGVyIHRoZSBub2RlczsgZS5nLiBmdW5jdGlvbihhLCBiKXsgcmV0dXJuIGEuZGF0YSgnd2VpZ2h0JykgLSBiLmRhdGEoJ3dlaWdodCcpIH1cbiAgYW5pbWF0ZTogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gdHJhbnNpdGlvbiB0aGUgbm9kZSBwb3NpdGlvbnNcbiAgYW5pbWF0aW9uRHVyYXRpb246IDUwMCxcbiAgLy8gZHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zIGlmIGVuYWJsZWRcbiAgYW5pbWF0aW9uRWFzaW5nOiB1bmRlZmluZWQsXG4gIC8vIGVhc2luZyBvZiBhbmltYXRpb24gaWYgZW5hYmxlZFxuICBhbmltYXRlRmlsdGVyOiBmdW5jdGlvbiBhbmltYXRlRmlsdGVyKG5vZGUsIGkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLy8gYSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgbm9kZSBzaG91bGQgYmUgYW5pbWF0ZWQuICBBbGwgbm9kZXMgYW5pbWF0ZWQgYnkgZGVmYXVsdCBvbiBhbmltYXRlIGVuYWJsZWQuICBOb24tYW5pbWF0ZWQgbm9kZXMgYXJlIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgbGF5b3V0IHN0YXJ0c1xuICByZWFkeTogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRyZWFkeVxuICBzdG9wOiB1bmRlZmluZWQsXG4gIC8vIGNhbGxiYWNrIG9uIGxheW91dHN0b3BcbiAgdHJhbnNmb3JtOiBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSwgcG9zaXRpb24pIHtcbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH0gLy8gdHJhbnNmb3JtIGEgZ2l2ZW4gbm9kZSBwb3NpdGlvbi4gVXNlZnVsIGZvciBjaGFuZ2luZyBmbG93IGRpcmVjdGlvbiBpbiBkaXNjcmV0ZSBsYXlvdXRzIFxufTtcblxuZnVuY3Rpb24gQ2lyY2xlTGF5b3V0KG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cyQ2LCBvcHRpb25zKTtcbn1cbkNpcmNsZUxheW91dC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcGFyYW1zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgb3B0aW9ucyA9IHBhcmFtcztcbiAgdmFyIGN5ID0gcGFyYW1zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIGNsb2Nrd2lzZSA9IG9wdGlvbnMuY291bnRlcmNsb2Nrd2lzZSAhPT0gdW5kZWZpbmVkID8gIW9wdGlvbnMuY291bnRlcmNsb2Nrd2lzZSA6IG9wdGlvbnMuY2xvY2t3aXNlO1xuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCkubm90KCc6cGFyZW50Jyk7XG4gIGlmIChvcHRpb25zLnNvcnQpIHtcbiAgICBub2RlcyA9IG5vZGVzLnNvcnQob3B0aW9ucy5zb3J0KTtcbiAgfVxuICB2YXIgYmIgPSBtYWtlQm91bmRpbmdCb3gob3B0aW9ucy5ib3VuZGluZ0JveCA/IG9wdGlvbnMuYm91bmRpbmdCb3ggOiB7XG4gICAgeDE6IDAsXG4gICAgeTE6IDAsXG4gICAgdzogY3kud2lkdGgoKSxcbiAgICBoOiBjeS5oZWlnaHQoKVxuICB9KTtcbiAgdmFyIGNlbnRlciA9IHtcbiAgICB4OiBiYi54MSArIGJiLncgLyAyLFxuICAgIHk6IGJiLnkxICsgYmIuaCAvIDJcbiAgfTtcbiAgdmFyIHN3ZWVwID0gb3B0aW9ucy5zd2VlcCA9PT0gdW5kZWZpbmVkID8gMiAqIE1hdGguUEkgLSAyICogTWF0aC5QSSAvIG5vZGVzLmxlbmd0aCA6IG9wdGlvbnMuc3dlZXA7XG4gIHZhciBkVGhldGEgPSBzd2VlcCAvIE1hdGgubWF4KDEsIG5vZGVzLmxlbmd0aCAtIDEpO1xuICB2YXIgcjtcbiAgdmFyIG1pbkRpc3RhbmNlID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBuID0gbm9kZXNbaV07XG4gICAgdmFyIG5iYiA9IG4ubGF5b3V0RGltZW5zaW9ucyhvcHRpb25zKTtcbiAgICB2YXIgdyA9IG5iYi53O1xuICAgIHZhciBoID0gbmJiLmg7XG4gICAgbWluRGlzdGFuY2UgPSBNYXRoLm1heChtaW5EaXN0YW5jZSwgdywgaCk7XG4gIH1cbiAgaWYgKG51bWJlciQxKG9wdGlvbnMucmFkaXVzKSkge1xuICAgIHIgPSBvcHRpb25zLnJhZGl1cztcbiAgfSBlbHNlIGlmIChub2Rlcy5sZW5ndGggPD0gMSkge1xuICAgIHIgPSAwO1xuICB9IGVsc2Uge1xuICAgIHIgPSBNYXRoLm1pbihiYi5oLCBiYi53KSAvIDIgLSBtaW5EaXN0YW5jZTtcbiAgfVxuXG4gIC8vIGNhbGN1bGF0ZSB0aGUgcmFkaXVzXG4gIGlmIChub2Rlcy5sZW5ndGggPiAxICYmIG9wdGlvbnMuYXZvaWRPdmVybGFwKSB7XG4gICAgLy8gYnV0IG9ubHkgaWYgbW9yZSB0aGFuIG9uZSBub2RlIChjYW4ndCBvdmVybGFwKVxuICAgIG1pbkRpc3RhbmNlICo9IDEuNzU7IC8vIGp1c3QgdG8gaGF2ZSBzb21lIG5pY2Ugc3BhY2luZ1xuXG4gICAgdmFyIGRjb3MgPSBNYXRoLmNvcyhkVGhldGEpIC0gTWF0aC5jb3MoMCk7XG4gICAgdmFyIGRzaW4gPSBNYXRoLnNpbihkVGhldGEpIC0gTWF0aC5zaW4oMCk7XG4gICAgdmFyIHJNaW4gPSBNYXRoLnNxcnQobWluRGlzdGFuY2UgKiBtaW5EaXN0YW5jZSAvIChkY29zICogZGNvcyArIGRzaW4gKiBkc2luKSk7IC8vIHMudC4gbm8gbm9kZXMgb3ZlcmxhcHBpbmdcbiAgICByID0gTWF0aC5tYXgock1pbiwgcik7XG4gIH1cbiAgdmFyIGdldFBvcyA9IGZ1bmN0aW9uIGdldFBvcyhlbGUsIGkpIHtcbiAgICB2YXIgdGhldGEgPSBvcHRpb25zLnN0YXJ0QW5nbGUgKyBpICogZFRoZXRhICogKGNsb2Nrd2lzZSA/IDEgOiAtMSk7XG4gICAgdmFyIHJ4ID0gciAqIE1hdGguY29zKHRoZXRhKTtcbiAgICB2YXIgcnkgPSByICogTWF0aC5zaW4odGhldGEpO1xuICAgIHZhciBwb3MgPSB7XG4gICAgICB4OiBjZW50ZXIueCArIHJ4LFxuICAgICAgeTogY2VudGVyLnkgKyByeVxuICAgIH07XG4gICAgcmV0dXJuIHBvcztcbiAgfTtcbiAgZWxlcy5ub2RlcygpLmxheW91dFBvc2l0aW9ucyh0aGlzLCBvcHRpb25zLCBnZXRQb3MpO1xuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbnZhciBkZWZhdWx0cyQ1ID0ge1xuICBmaXQ6IHRydWUsXG4gIC8vIHdoZXRoZXIgdG8gZml0IHRoZSB2aWV3cG9ydCB0byB0aGUgZ3JhcGhcbiAgcGFkZGluZzogMzAsXG4gIC8vIHRoZSBwYWRkaW5nIG9uIGZpdFxuICBzdGFydEFuZ2xlOiAzIC8gMiAqIE1hdGguUEksXG4gIC8vIHdoZXJlIG5vZGVzIHN0YXJ0IGluIHJhZGlhbnNcbiAgc3dlZXA6IHVuZGVmaW5lZCxcbiAgLy8gaG93IG1hbnkgcmFkaWFucyBzaG91bGQgYmUgYmV0d2VlbiB0aGUgZmlyc3QgYW5kIGxhc3Qgbm9kZSAoZGVmYXVsdHMgdG8gZnVsbCBjaXJjbGUpXG4gIGNsb2Nrd2lzZTogdHJ1ZSxcbiAgLy8gd2hldGhlciB0aGUgbGF5b3V0IHNob3VsZCBnbyBjbG9ja3dpc2UgKHRydWUpIG9yIGNvdW50ZXJjbG9ja3dpc2UvYW50aWNsb2Nrd2lzZSAoZmFsc2UpXG4gIGVxdWlkaXN0YW50OiBmYWxzZSxcbiAgLy8gd2hldGhlciBsZXZlbHMgaGF2ZSBhbiBlcXVhbCByYWRpYWwgZGlzdGFuY2UgYmV0d2VuIHRoZW0sIG1heSBjYXVzZSBib3VuZGluZyBib3ggb3ZlcmZsb3dcbiAgbWluTm9kZVNwYWNpbmc6IDEwLFxuICAvLyBtaW4gc3BhY2luZyBiZXR3ZWVuIG91dHNpZGUgb2Ygbm9kZXMgKHVzZWQgZm9yIHJhZGl1cyBhZGp1c3RtZW50KVxuICBib3VuZGluZ0JveDogdW5kZWZpbmVkLFxuICAvLyBjb25zdHJhaW4gbGF5b3V0IGJvdW5kczsgeyB4MSwgeTEsIHgyLCB5MiB9IG9yIHsgeDEsIHkxLCB3LCBoIH1cbiAgYXZvaWRPdmVybGFwOiB0cnVlLFxuICAvLyBwcmV2ZW50cyBub2RlIG92ZXJsYXAsIG1heSBvdmVyZmxvdyBib3VuZGluZ0JveCBpZiBub3QgZW5vdWdoIHNwYWNlXG4gIG5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsczogZmFsc2UsXG4gIC8vIEV4Y2x1ZGVzIHRoZSBsYWJlbCB3aGVuIGNhbGN1bGF0aW5nIG5vZGUgYm91bmRpbmcgYm94ZXMgZm9yIHRoZSBsYXlvdXQgYWxnb3JpdGhtXG4gIGhlaWdodDogdW5kZWZpbmVkLFxuICAvLyBoZWlnaHQgb2YgbGF5b3V0IGFyZWEgKG92ZXJyaWRlcyBjb250YWluZXIgaGVpZ2h0KVxuICB3aWR0aDogdW5kZWZpbmVkLFxuICAvLyB3aWR0aCBvZiBsYXlvdXQgYXJlYSAob3ZlcnJpZGVzIGNvbnRhaW5lciB3aWR0aClcbiAgc3BhY2luZ0ZhY3RvcjogdW5kZWZpbmVkLFxuICAvLyBBcHBsaWVzIGEgbXVsdGlwbGljYXRpdmUgZmFjdG9yICg+MCkgdG8gZXhwYW5kIG9yIGNvbXByZXNzIHRoZSBvdmVyYWxsIGFyZWEgdGhhdCB0aGUgbm9kZXMgdGFrZSB1cFxuICBjb25jZW50cmljOiBmdW5jdGlvbiBjb25jZW50cmljKG5vZGUpIHtcbiAgICAvLyByZXR1cm5zIG51bWVyaWMgdmFsdWUgZm9yIGVhY2ggbm9kZSwgcGxhY2luZyBoaWdoZXIgbm9kZXMgaW4gbGV2ZWxzIHRvd2FyZHMgdGhlIGNlbnRyZVxuICAgIHJldHVybiBub2RlLmRlZ3JlZSgpO1xuICB9LFxuICBsZXZlbFdpZHRoOiBmdW5jdGlvbiBsZXZlbFdpZHRoKG5vZGVzKSB7XG4gICAgLy8gdGhlIHZhcmlhdGlvbiBvZiBjb25jZW50cmljIHZhbHVlcyBpbiBlYWNoIGxldmVsXG4gICAgcmV0dXJuIG5vZGVzLm1heERlZ3JlZSgpIC8gNDtcbiAgfSxcbiAgYW5pbWF0ZTogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gdHJhbnNpdGlvbiB0aGUgbm9kZSBwb3NpdGlvbnNcbiAgYW5pbWF0aW9uRHVyYXRpb246IDUwMCxcbiAgLy8gZHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zIGlmIGVuYWJsZWRcbiAgYW5pbWF0aW9uRWFzaW5nOiB1bmRlZmluZWQsXG4gIC8vIGVhc2luZyBvZiBhbmltYXRpb24gaWYgZW5hYmxlZFxuICBhbmltYXRlRmlsdGVyOiBmdW5jdGlvbiBhbmltYXRlRmlsdGVyKG5vZGUsIGkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLy8gYSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgbm9kZSBzaG91bGQgYmUgYW5pbWF0ZWQuICBBbGwgbm9kZXMgYW5pbWF0ZWQgYnkgZGVmYXVsdCBvbiBhbmltYXRlIGVuYWJsZWQuICBOb24tYW5pbWF0ZWQgbm9kZXMgYXJlIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgbGF5b3V0IHN0YXJ0c1xuICByZWFkeTogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRyZWFkeVxuICBzdG9wOiB1bmRlZmluZWQsXG4gIC8vIGNhbGxiYWNrIG9uIGxheW91dHN0b3BcbiAgdHJhbnNmb3JtOiBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSwgcG9zaXRpb24pIHtcbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH0gLy8gdHJhbnNmb3JtIGEgZ2l2ZW4gbm9kZSBwb3NpdGlvbi4gVXNlZnVsIGZvciBjaGFuZ2luZyBmbG93IGRpcmVjdGlvbiBpbiBkaXNjcmV0ZSBsYXlvdXRzXG59O1xuXG5mdW5jdGlvbiBDb25jZW50cmljTGF5b3V0KG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cyQ1LCBvcHRpb25zKTtcbn1cbkNvbmNlbnRyaWNMYXlvdXQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHBhcmFtcyA9IHRoaXMub3B0aW9ucztcbiAgdmFyIG9wdGlvbnMgPSBwYXJhbXM7XG4gIHZhciBjbG9ja3dpc2UgPSBvcHRpb25zLmNvdW50ZXJjbG9ja3dpc2UgIT09IHVuZGVmaW5lZCA/ICFvcHRpb25zLmNvdW50ZXJjbG9ja3dpc2UgOiBvcHRpb25zLmNsb2Nrd2lzZTtcbiAgdmFyIGN5ID0gcGFyYW1zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpLm5vdCgnOnBhcmVudCcpO1xuICB2YXIgYmIgPSBtYWtlQm91bmRpbmdCb3gob3B0aW9ucy5ib3VuZGluZ0JveCA/IG9wdGlvbnMuYm91bmRpbmdCb3ggOiB7XG4gICAgeDE6IDAsXG4gICAgeTE6IDAsXG4gICAgdzogY3kud2lkdGgoKSxcbiAgICBoOiBjeS5oZWlnaHQoKVxuICB9KTtcbiAgdmFyIGNlbnRlciA9IHtcbiAgICB4OiBiYi54MSArIGJiLncgLyAyLFxuICAgIHk6IGJiLnkxICsgYmIuaCAvIDJcbiAgfTtcbiAgdmFyIG5vZGVWYWx1ZXMgPSBbXTsgLy8geyBub2RlLCB2YWx1ZSB9XG4gIHZhciBtYXhOb2RlU2l6ZSA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgIHZhciB2YWx1ZSA9IHZvaWQgMDtcblxuICAgIC8vIGNhbGN1bGF0ZSB0aGUgbm9kZSB2YWx1ZVxuICAgIHZhbHVlID0gb3B0aW9ucy5jb25jZW50cmljKG5vZGUpO1xuICAgIG5vZGVWYWx1ZXMucHVzaCh7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBub2RlOiBub2RlXG4gICAgfSk7XG5cbiAgICAvLyBmb3Igc3R5bGUgbWFwcGluZ1xuICAgIG5vZGUuX3ByaXZhdGUuc2NyYXRjaC5jb25jZW50cmljID0gdmFsdWU7XG4gIH1cblxuICAvLyBpbiBjYXNlIHdlIHVzZWQgdGhlIGBjb25jZW50cmljYCBpbiBzdHlsZVxuICBub2Rlcy51cGRhdGVTdHlsZSgpO1xuXG4gIC8vIGNhbGN1bGF0ZSBtYXggc2l6ZSBub3cgYmFzZWQgb24gcG90ZW50aWFsbHkgdXBkYXRlZCBtYXBwZXJzXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBub2Rlcy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgX25vZGUgPSBub2Rlc1tfaV07XG4gICAgdmFyIG5iYiA9IF9ub2RlLmxheW91dERpbWVuc2lvbnMob3B0aW9ucyk7XG4gICAgbWF4Tm9kZVNpemUgPSBNYXRoLm1heChtYXhOb2RlU2l6ZSwgbmJiLncsIG5iYi5oKTtcbiAgfVxuXG4gIC8vIHNvcnQgbm9kZSB2YWx1ZXMgaW4gZGVzY3JlYXNpbmcgb3JkZXJcbiAgbm9kZVZhbHVlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGIudmFsdWUgLSBhLnZhbHVlO1xuICB9KTtcbiAgdmFyIGxldmVsV2lkdGggPSBvcHRpb25zLmxldmVsV2lkdGgobm9kZXMpO1xuXG4gIC8vIHB1dCB0aGUgdmFsdWVzIGludG8gbGV2ZWxzXG4gIHZhciBsZXZlbHMgPSBbW11dO1xuICB2YXIgY3VycmVudExldmVsID0gbGV2ZWxzWzBdO1xuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBub2RlVmFsdWVzLmxlbmd0aDsgX2kyKyspIHtcbiAgICB2YXIgdmFsID0gbm9kZVZhbHVlc1tfaTJdO1xuICAgIGlmIChjdXJyZW50TGV2ZWwubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGRpZmYgPSBNYXRoLmFicyhjdXJyZW50TGV2ZWxbMF0udmFsdWUgLSB2YWwudmFsdWUpO1xuICAgICAgaWYgKGRpZmYgPj0gbGV2ZWxXaWR0aCkge1xuICAgICAgICBjdXJyZW50TGV2ZWwgPSBbXTtcbiAgICAgICAgbGV2ZWxzLnB1c2goY3VycmVudExldmVsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY3VycmVudExldmVsLnB1c2godmFsKTtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBwb3NpdGlvbnMgZnJvbSBsZXZlbHNcblxuICB2YXIgbWluRGlzdCA9IG1heE5vZGVTaXplICsgb3B0aW9ucy5taW5Ob2RlU3BhY2luZzsgLy8gbWluIGRpc3QgYmV0d2VlbiBub2Rlc1xuXG4gIGlmICghb3B0aW9ucy5hdm9pZE92ZXJsYXApIHtcbiAgICAvLyB0aGVuIHN0cmljdGx5IGNvbnN0cmFpbiB0byBiYlxuICAgIHZhciBmaXJzdEx2bEhhc011bHRpID0gbGV2ZWxzLmxlbmd0aCA+IDAgJiYgbGV2ZWxzWzBdLmxlbmd0aCA+IDE7XG4gICAgdmFyIG1heFIgPSBNYXRoLm1pbihiYi53LCBiYi5oKSAvIDIgLSBtaW5EaXN0O1xuICAgIHZhciByU3RlcCA9IG1heFIgLyAobGV2ZWxzLmxlbmd0aCArIGZpcnN0THZsSGFzTXVsdGkgPyAxIDogMCk7XG4gICAgbWluRGlzdCA9IE1hdGgubWluKG1pbkRpc3QsIHJTdGVwKTtcbiAgfVxuXG4gIC8vIGZpbmQgdGhlIG1ldHJpY3MgZm9yIGVhY2ggbGV2ZWxcbiAgdmFyIHIgPSAwO1xuICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBsZXZlbHMubGVuZ3RoOyBfaTMrKykge1xuICAgIHZhciBsZXZlbCA9IGxldmVsc1tfaTNdO1xuICAgIHZhciBzd2VlcCA9IG9wdGlvbnMuc3dlZXAgPT09IHVuZGVmaW5lZCA/IDIgKiBNYXRoLlBJIC0gMiAqIE1hdGguUEkgLyBsZXZlbC5sZW5ndGggOiBvcHRpb25zLnN3ZWVwO1xuICAgIHZhciBkVGhldGEgPSBsZXZlbC5kVGhldGEgPSBzd2VlcCAvIE1hdGgubWF4KDEsIGxldmVsLmxlbmd0aCAtIDEpO1xuXG4gICAgLy8gY2FsY3VsYXRlIHRoZSByYWRpdXNcbiAgICBpZiAobGV2ZWwubGVuZ3RoID4gMSAmJiBvcHRpb25zLmF2b2lkT3ZlcmxhcCkge1xuICAgICAgLy8gYnV0IG9ubHkgaWYgbW9yZSB0aGFuIG9uZSBub2RlIChjYW4ndCBvdmVybGFwKVxuICAgICAgdmFyIGRjb3MgPSBNYXRoLmNvcyhkVGhldGEpIC0gTWF0aC5jb3MoMCk7XG4gICAgICB2YXIgZHNpbiA9IE1hdGguc2luKGRUaGV0YSkgLSBNYXRoLnNpbigwKTtcbiAgICAgIHZhciByTWluID0gTWF0aC5zcXJ0KG1pbkRpc3QgKiBtaW5EaXN0IC8gKGRjb3MgKiBkY29zICsgZHNpbiAqIGRzaW4pKTsgLy8gcy50LiBubyBub2RlcyBvdmVybGFwcGluZ1xuXG4gICAgICByID0gTWF0aC5tYXgock1pbiwgcik7XG4gICAgfVxuICAgIGxldmVsLnIgPSByO1xuICAgIHIgKz0gbWluRGlzdDtcbiAgfVxuICBpZiAob3B0aW9ucy5lcXVpZGlzdGFudCkge1xuICAgIHZhciByRGVsdGFNYXggPSAwO1xuICAgIHZhciBfciA9IDA7XG4gICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgbGV2ZWxzLmxlbmd0aDsgX2k0KyspIHtcbiAgICAgIHZhciBfbGV2ZWwgPSBsZXZlbHNbX2k0XTtcbiAgICAgIHZhciByRGVsdGEgPSBfbGV2ZWwuciAtIF9yO1xuICAgICAgckRlbHRhTWF4ID0gTWF0aC5tYXgockRlbHRhTWF4LCByRGVsdGEpO1xuICAgIH1cbiAgICBfciA9IDA7XG4gICAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgbGV2ZWxzLmxlbmd0aDsgX2k1KyspIHtcbiAgICAgIHZhciBfbGV2ZWwyID0gbGV2ZWxzW19pNV07XG4gICAgICBpZiAoX2k1ID09PSAwKSB7XG4gICAgICAgIF9yID0gX2xldmVsMi5yO1xuICAgICAgfVxuICAgICAgX2xldmVsMi5yID0gX3I7XG4gICAgICBfciArPSByRGVsdGFNYXg7XG4gICAgfVxuICB9XG5cbiAgLy8gY2FsY3VsYXRlIHRoZSBub2RlIHBvc2l0aW9uc1xuICB2YXIgcG9zID0ge307IC8vIGlkID0+IHBvc2l0aW9uXG4gIGZvciAodmFyIF9pNiA9IDA7IF9pNiA8IGxldmVscy5sZW5ndGg7IF9pNisrKSB7XG4gICAgdmFyIF9sZXZlbDMgPSBsZXZlbHNbX2k2XTtcbiAgICB2YXIgX2RUaGV0YSA9IF9sZXZlbDMuZFRoZXRhO1xuICAgIHZhciBfcjIgPSBfbGV2ZWwzLnI7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBfbGV2ZWwzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgX3ZhbCA9IF9sZXZlbDNbal07XG4gICAgICB2YXIgdGhldGEgPSBvcHRpb25zLnN0YXJ0QW5nbGUgKyAoY2xvY2t3aXNlID8gMSA6IC0xKSAqIF9kVGhldGEgKiBqO1xuICAgICAgdmFyIHAgPSB7XG4gICAgICAgIHg6IGNlbnRlci54ICsgX3IyICogTWF0aC5jb3ModGhldGEpLFxuICAgICAgICB5OiBjZW50ZXIueSArIF9yMiAqIE1hdGguc2luKHRoZXRhKVxuICAgICAgfTtcbiAgICAgIHBvc1tfdmFsLm5vZGUuaWQoKV0gPSBwO1xuICAgIH1cbiAgfVxuXG4gIC8vIHBvc2l0aW9uIHRoZSBub2Rlc1xuICBlbGVzLm5vZGVzKCkubGF5b3V0UG9zaXRpb25zKHRoaXMsIG9wdGlvbnMsIGZ1bmN0aW9uIChlbGUpIHtcbiAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICByZXR1cm4gcG9zW2lkXTtcbiAgfSk7XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxuLypcblRoZSBDb1NFIGxheW91dCB3YXMgd3JpdHRlbiBieSBHZXJhcmRvIEh1Y2suXG5odHRwczovL3d3dy5saW5rZWRpbi5jb20vaW4vZ2VyYXJkb2h1Y2svXG5cbkJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgYXJ0aWNsZTpcbmh0dHA6Ly9kbC5hY20ub3JnL2NpdGF0aW9uLmNmbT9pZD0xNDk4MDQ3XG5cbk1vZGlmaWNhdGlvbnMgdHJhY2tlZCBvbiBHaXRodWIuXG4qL1xudmFyIERFQlVHO1xuXG4vKipcbiAqIEBicmllZiA6ICBkZWZhdWx0IGxheW91dCBvcHRpb25zXG4gKi9cbnZhciBkZWZhdWx0cyQ0ID0ge1xuICAvLyBDYWxsZWQgb24gYGxheW91dHJlYWR5YFxuICByZWFkeTogZnVuY3Rpb24gcmVhZHkoKSB7fSxcbiAgLy8gQ2FsbGVkIG9uIGBsYXlvdXRzdG9wYFxuICBzdG9wOiBmdW5jdGlvbiBzdG9wKCkge30sXG4gIC8vIFdoZXRoZXIgdG8gYW5pbWF0ZSB3aGlsZSBydW5uaW5nIHRoZSBsYXlvdXRcbiAgLy8gdHJ1ZSA6IEFuaW1hdGUgY29udGludW91c2x5IGFzIHRoZSBsYXlvdXQgaXMgcnVubmluZ1xuICAvLyBmYWxzZSA6IEp1c3Qgc2hvdyB0aGUgZW5kIHJlc3VsdFxuICAvLyAnZW5kJyA6IEFuaW1hdGUgd2l0aCB0aGUgZW5kIHJlc3VsdCwgZnJvbSB0aGUgaW5pdGlhbCBwb3NpdGlvbnMgdG8gdGhlIGVuZCBwb3NpdGlvbnNcbiAgYW5pbWF0ZTogdHJ1ZSxcbiAgLy8gRWFzaW5nIG9mIHRoZSBhbmltYXRpb24gZm9yIGFuaW1hdGU6J2VuZCdcbiAgYW5pbWF0aW9uRWFzaW5nOiB1bmRlZmluZWQsXG4gIC8vIFRoZSBkdXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGZvciBhbmltYXRlOidlbmQnXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiB1bmRlZmluZWQsXG4gIC8vIEEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkXG4gIC8vIEFsbCBub2RlcyBhbmltYXRlZCBieSBkZWZhdWx0IG9uIGFuaW1hdGUgZW5hYmxlZFxuICAvLyBOb24tYW5pbWF0ZWQgbm9kZXMgYXJlIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgbGF5b3V0IHN0YXJ0c1xuICBhbmltYXRlRmlsdGVyOiBmdW5jdGlvbiBhbmltYXRlRmlsdGVyKG5vZGUsIGkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLy8gVGhlIGxheW91dCBhbmltYXRlcyBvbmx5IGFmdGVyIHRoaXMgbWFueSBtaWxsaXNlY29uZHMgZm9yIGFuaW1hdGU6dHJ1ZVxuICAvLyAocHJldmVudHMgZmxhc2hpbmcgb24gZmFzdCBydW5zKVxuICBhbmltYXRpb25UaHJlc2hvbGQ6IDI1MCxcbiAgLy8gTnVtYmVyIG9mIGl0ZXJhdGlvbnMgYmV0d2VlbiBjb25zZWN1dGl2ZSBzY3JlZW4gcG9zaXRpb25zIHVwZGF0ZVxuICByZWZyZXNoOiAyMCxcbiAgLy8gV2hldGhlciB0byBmaXQgdGhlIG5ldHdvcmsgdmlldyBhZnRlciB3aGVuIGRvbmVcbiAgZml0OiB0cnVlLFxuICAvLyBQYWRkaW5nIG9uIGZpdFxuICBwYWRkaW5nOiAzMCxcbiAgLy8gQ29uc3RyYWluIGxheW91dCBib3VuZHM7IHsgeDEsIHkxLCB4MiwgeTIgfSBvciB7IHgxLCB5MSwgdywgaCB9XG4gIGJvdW5kaW5nQm94OiB1bmRlZmluZWQsXG4gIC8vIEV4Y2x1ZGVzIHRoZSBsYWJlbCB3aGVuIGNhbGN1bGF0aW5nIG5vZGUgYm91bmRpbmcgYm94ZXMgZm9yIHRoZSBsYXlvdXQgYWxnb3JpdGhtXG4gIG5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsczogZmFsc2UsXG4gIC8vIFJhbmRvbWl6ZSB0aGUgaW5pdGlhbCBwb3NpdGlvbnMgb2YgdGhlIG5vZGVzICh0cnVlKSBvciB1c2UgZXhpc3RpbmcgcG9zaXRpb25zIChmYWxzZSlcbiAgcmFuZG9taXplOiBmYWxzZSxcbiAgLy8gRXh0cmEgc3BhY2luZyBiZXR3ZWVuIGNvbXBvbmVudHMgaW4gbm9uLWNvbXBvdW5kIGdyYXBoc1xuICBjb21wb25lbnRTcGFjaW5nOiA0MCxcbiAgLy8gTm9kZSByZXB1bHNpb24gKG5vbiBvdmVybGFwcGluZykgbXVsdGlwbGllclxuICBub2RlUmVwdWxzaW9uOiBmdW5jdGlvbiBub2RlUmVwdWxzaW9uKG5vZGUpIHtcbiAgICByZXR1cm4gMjA0ODtcbiAgfSxcbiAgLy8gTm9kZSByZXB1bHNpb24gKG92ZXJsYXBwaW5nKSBtdWx0aXBsaWVyXG4gIG5vZGVPdmVybGFwOiA0LFxuICAvLyBJZGVhbCBlZGdlIChub24gbmVzdGVkKSBsZW5ndGhcbiAgaWRlYWxFZGdlTGVuZ3RoOiBmdW5jdGlvbiBpZGVhbEVkZ2VMZW5ndGgoZWRnZSkge1xuICAgIHJldHVybiAzMjtcbiAgfSxcbiAgLy8gRGl2aXNvciB0byBjb21wdXRlIGVkZ2UgZm9yY2VzXG4gIGVkZ2VFbGFzdGljaXR5OiBmdW5jdGlvbiBlZGdlRWxhc3RpY2l0eShlZGdlKSB7XG4gICAgcmV0dXJuIDMyO1xuICB9LFxuICAvLyBOZXN0aW5nIGZhY3RvciAobXVsdGlwbGllcikgdG8gY29tcHV0ZSBpZGVhbCBlZGdlIGxlbmd0aCBmb3IgbmVzdGVkIGVkZ2VzXG4gIG5lc3RpbmdGYWN0b3I6IDEuMixcbiAgLy8gR3Jhdml0eSBmb3JjZSAoY29uc3RhbnQpXG4gIGdyYXZpdHk6IDEsXG4gIC8vIE1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gcGVyZm9ybVxuICBudW1JdGVyOiAxMDAwLFxuICAvLyBJbml0aWFsIHRlbXBlcmF0dXJlIChtYXhpbXVtIG5vZGUgZGlzcGxhY2VtZW50KVxuICBpbml0aWFsVGVtcDogMTAwMCxcbiAgLy8gQ29vbGluZyBmYWN0b3IgKGhvdyB0aGUgdGVtcGVyYXR1cmUgaXMgcmVkdWNlZCBiZXR3ZWVuIGNvbnNlY3V0aXZlIGl0ZXJhdGlvbnNcbiAgY29vbGluZ0ZhY3RvcjogMC45OSxcbiAgLy8gTG93ZXIgdGVtcGVyYXR1cmUgdGhyZXNob2xkIChiZWxvdyB0aGlzIHBvaW50IHRoZSBsYXlvdXQgd2lsbCBlbmQpXG4gIG1pblRlbXA6IDEuMFxufTtcblxuLyoqXG4gKiBAYnJpZWYgICAgICAgOiBjb25zdHJ1Y3RvclxuICogQGFyZyBvcHRpb25zIDogb2JqZWN0IGNvbnRhaW5pbmcgbGF5b3V0IG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gQ29zZUxheW91dChvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMkNCwgb3B0aW9ucyk7XG4gIHRoaXMub3B0aW9ucy5sYXlvdXQgPSB0aGlzO1xuXG4gIC8vIEV4Y2x1ZGUgYW55IGVkZ2UgdGhhdCBoYXMgYSBzb3VyY2Ugb3IgdGFyZ2V0IG5vZGUgdGhhdCBpcyBub3QgaW4gdGhlIHNldCBvZiBwYXNzZWQtaW4gbm9kZXNcbiAgdmFyIG5vZGVzID0gdGhpcy5vcHRpb25zLmVsZXMubm9kZXMoKTtcbiAgdmFyIGVkZ2VzID0gdGhpcy5vcHRpb25zLmVsZXMuZWRnZXMoKTtcbiAgdmFyIG5vdEVkZ2VzID0gZWRnZXMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIHNvdXJjZUlkID0gZS5zb3VyY2UoKS5kYXRhKCdpZCcpO1xuICAgIHZhciB0YXJnZXRJZCA9IGUudGFyZ2V0KCkuZGF0YSgnaWQnKTtcbiAgICB2YXIgaGFzU291cmNlID0gbm9kZXMuc29tZShmdW5jdGlvbiAobikge1xuICAgICAgcmV0dXJuIG4uZGF0YSgnaWQnKSA9PT0gc291cmNlSWQ7XG4gICAgfSk7XG4gICAgdmFyIGhhc1RhcmdldCA9IG5vZGVzLnNvbWUoZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJldHVybiBuLmRhdGEoJ2lkJykgPT09IHRhcmdldElkO1xuICAgIH0pO1xuICAgIHJldHVybiAhaGFzU291cmNlIHx8ICFoYXNUYXJnZXQ7XG4gIH0pO1xuICB0aGlzLm9wdGlvbnMuZWxlcyA9IHRoaXMub3B0aW9ucy5lbGVzLm5vdChub3RFZGdlcyk7XG59XG5cbi8qKlxuICogQGJyaWVmIDogcnVucyB0aGUgbGF5b3V0XG4gKi9cbkNvc2VMYXlvdXQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBjeSA9IG9wdGlvbnMuY3k7XG4gIHZhciBsYXlvdXQgPSB0aGlzO1xuICBsYXlvdXQuc3RvcHBlZCA9IGZhbHNlO1xuICBpZiAob3B0aW9ucy5hbmltYXRlID09PSB0cnVlIHx8IG9wdGlvbnMuYW5pbWF0ZSA9PT0gZmFsc2UpIHtcbiAgICBsYXlvdXQuZW1pdCh7XG4gICAgICB0eXBlOiAnbGF5b3V0c3RhcnQnLFxuICAgICAgbGF5b3V0OiBsYXlvdXRcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFNldCBERUJVRyAtIEdsb2JhbCB2YXJpYWJsZVxuICBpZiAodHJ1ZSA9PT0gb3B0aW9ucy5kZWJ1Zykge1xuICAgIERFQlVHID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBERUJVRyA9IGZhbHNlO1xuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSBsYXlvdXQgaW5mb1xuICB2YXIgbGF5b3V0SW5mbyA9IGNyZWF0ZUxheW91dEluZm8oY3ksIGxheW91dCwgb3B0aW9ucyk7XG5cbiAgLy8gU2hvdyBMYXlvdXRJbmZvIGNvbnRlbnRzIGlmIGRlYnVnZ2luZ1xuICBpZiAoREVCVUcpIHtcbiAgICBwcmludExheW91dEluZm8obGF5b3V0SW5mbyk7XG4gIH1cblxuICAvLyBJZiByZXF1aXJlZCwgcmFuZG9taXplIG5vZGUgcG9zaXRpb25zXG4gIGlmIChvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgIHJhbmRvbWl6ZVBvc2l0aW9ucyhsYXlvdXRJbmZvKTtcbiAgfVxuICB2YXIgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2VOb3coKTtcbiAgdmFyIHJlZnJlc2ggPSBmdW5jdGlvbiByZWZyZXNoKCkge1xuICAgIHJlZnJlc2hQb3NpdGlvbnMobGF5b3V0SW5mbywgY3ksIG9wdGlvbnMpO1xuXG4gICAgLy8gRml0IHRoZSBncmFwaCBpZiBuZWNlc3NhcnlcbiAgICBpZiAodHJ1ZSA9PT0gb3B0aW9ucy5maXQpIHtcbiAgICAgIGN5LmZpdChvcHRpb25zLnBhZGRpbmcpO1xuICAgIH1cbiAgfTtcbiAgdmFyIG1haW5Mb29wID0gZnVuY3Rpb24gbWFpbkxvb3AoaSkge1xuICAgIGlmIChsYXlvdXQuc3RvcHBlZCB8fCBpID49IG9wdGlvbnMubnVtSXRlcikge1xuICAgICAgLy8gbG9nRGVidWcoXCJMYXlvdXQgbWFudWFsbHkgc3RvcHBlZC4gU3RvcHBpbmcgY29tcHV0YXRpb24gaW4gc3RlcCBcIiArIGkpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIERvIG9uZSBzdGVwIGluIHRoZSBwaGlzaWNhbCBzaW11bGF0aW9uXG4gICAgc3RlcChsYXlvdXRJbmZvLCBvcHRpb25zKTtcblxuICAgIC8vIFVwZGF0ZSB0ZW1wZXJhdHVyZVxuICAgIGxheW91dEluZm8udGVtcGVyYXR1cmUgPSBsYXlvdXRJbmZvLnRlbXBlcmF0dXJlICogb3B0aW9ucy5jb29saW5nRmFjdG9yO1xuICAgIC8vIGxvZ0RlYnVnKFwiTmV3IHRlbXBlcmF0dXJlOiBcIiArIGxheW91dEluZm8udGVtcGVyYXR1cmUpO1xuXG4gICAgaWYgKGxheW91dEluZm8udGVtcGVyYXR1cmUgPCBvcHRpb25zLm1pblRlbXApIHtcbiAgICAgIC8vIGxvZ0RlYnVnKFwiVGVtcGVyYXR1cmUgZHJvcCBiZWxvdyBtaW5pbXVtIHRocmVzaG9sZC4gU3RvcHBpbmcgY29tcHV0YXRpb24gaW4gc3RlcCBcIiArIGkpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgdmFyIGRvbmUgPSBmdW5jdGlvbiBkb25lKCkge1xuICAgIGlmIChvcHRpb25zLmFuaW1hdGUgPT09IHRydWUgfHwgb3B0aW9ucy5hbmltYXRlID09PSBmYWxzZSkge1xuICAgICAgcmVmcmVzaCgpO1xuXG4gICAgICAvLyBMYXlvdXQgaGFzIGZpbmlzaGVkXG4gICAgICBsYXlvdXQub25lKCdsYXlvdXRzdG9wJywgb3B0aW9ucy5zdG9wKTtcbiAgICAgIGxheW91dC5lbWl0KHtcbiAgICAgICAgdHlwZTogJ2xheW91dHN0b3AnLFxuICAgICAgICBsYXlvdXQ6IGxheW91dFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBub2RlcyA9IG9wdGlvbnMuZWxlcy5ub2RlcygpO1xuICAgICAgdmFyIGdldFNjYWxlZFBvcyA9IGdldFNjYWxlSW5Cb3VuZHNGbihsYXlvdXRJbmZvLCBvcHRpb25zLCBub2Rlcyk7XG4gICAgICBub2Rlcy5sYXlvdXRQb3NpdGlvbnMobGF5b3V0LCBvcHRpb25zLCBnZXRTY2FsZWRQb3MpO1xuICAgIH1cbiAgfTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbG9vcFJldCA9IHRydWU7XG4gIGlmIChvcHRpb25zLmFuaW1hdGUgPT09IHRydWUpIHtcbiAgICB2YXIgZnJhbWUgPSBmdW5jdGlvbiBmcmFtZSgpIHtcbiAgICAgIHZhciBmID0gMDtcbiAgICAgIHdoaWxlIChsb29wUmV0ICYmIGYgPCBvcHRpb25zLnJlZnJlc2gpIHtcbiAgICAgICAgbG9vcFJldCA9IG1haW5Mb29wKGkpO1xuICAgICAgICBpKys7XG4gICAgICAgIGYrKztcbiAgICAgIH1cbiAgICAgIGlmICghbG9vcFJldCkge1xuICAgICAgICAvLyBpdCdzIGRvbmVcbiAgICAgICAgc2VwYXJhdGVDb21wb25lbnRzKGxheW91dEluZm8sIG9wdGlvbnMpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbm93ID0gcGVyZm9ybWFuY2VOb3coKTtcbiAgICAgICAgaWYgKG5vdyAtIHN0YXJ0VGltZSA+PSBvcHRpb25zLmFuaW1hdGlvblRocmVzaG9sZCkge1xuICAgICAgICAgIHJlZnJlc2goKTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnJhbWUpO1xuICAgICAgfVxuICAgIH07XG4gICAgZnJhbWUoKTtcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAobG9vcFJldCkge1xuICAgICAgbG9vcFJldCA9IG1haW5Mb29wKGkpO1xuICAgICAgaSsrO1xuICAgIH1cbiAgICBzZXBhcmF0ZUNvbXBvbmVudHMobGF5b3V0SW5mbywgb3B0aW9ucyk7XG4gICAgZG9uZSgpO1xuICB9XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxuLyoqXG4gKiBAYnJpZWYgOiBjYWxsZWQgb24gY29udGludW91cyBsYXlvdXRzIHRvIHN0b3AgdGhlbSBiZWZvcmUgdGhleSBmaW5pc2hcbiAqL1xuQ29zZUxheW91dC5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zdG9wcGVkID0gdHJ1ZTtcbiAgaWYgKHRoaXMudGhyZWFkKSB7XG4gICAgdGhpcy50aHJlYWQuc3RvcCgpO1xuICB9XG4gIHRoaXMuZW1pdCgnbGF5b3V0c3RvcCcpO1xuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbkNvc2VMYXlvdXQucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLnRocmVhZCkge1xuICAgIHRoaXMudGhyZWFkLnN0b3AoKTtcbiAgfVxuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbi8qKlxuICogQGJyaWVmICAgICA6IENyZWF0ZXMgYW4gb2JqZWN0IHdoaWNoIGlzIGNvbnRhaW5zIGFsbCB0aGUgZGF0YVxuICogICAgICAgICAgICAgIHVzZWQgaW4gdGhlIGxheW91dCBwcm9jZXNzXG4gKiBAYXJnIGN5ICAgIDogY3l0b3NjYXBlLmpzIG9iamVjdFxuICogQHJldHVybiAgICA6IGxheW91dEluZm8gb2JqZWN0IGluaXRpYWxpemVkXG4gKi9cbnZhciBjcmVhdGVMYXlvdXRJbmZvID0gZnVuY3Rpb24gY3JlYXRlTGF5b3V0SW5mbyhjeSwgbGF5b3V0LCBvcHRpb25zKSB7XG4gIC8vIFNob3J0Y3V0XG4gIHZhciBlZGdlcyA9IG9wdGlvbnMuZWxlcy5lZGdlcygpO1xuICB2YXIgbm9kZXMgPSBvcHRpb25zLmVsZXMubm9kZXMoKTtcbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KG9wdGlvbnMuYm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDoge1xuICAgIHgxOiAwLFxuICAgIHkxOiAwLFxuICAgIHc6IGN5LndpZHRoKCksXG4gICAgaDogY3kuaGVpZ2h0KClcbiAgfSk7XG4gIHZhciBsYXlvdXRJbmZvID0ge1xuICAgIGlzQ29tcG91bmQ6IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKSxcbiAgICBsYXlvdXROb2RlczogW10sXG4gICAgaWRUb0luZGV4OiB7fSxcbiAgICBub2RlU2l6ZTogbm9kZXMuc2l6ZSgpLFxuICAgIGdyYXBoU2V0OiBbXSxcbiAgICBpbmRleFRvR3JhcGg6IFtdLFxuICAgIGxheW91dEVkZ2VzOiBbXSxcbiAgICBlZGdlU2l6ZTogZWRnZXMuc2l6ZSgpLFxuICAgIHRlbXBlcmF0dXJlOiBvcHRpb25zLmluaXRpYWxUZW1wLFxuICAgIGNsaWVudFdpZHRoOiBiYi53LFxuICAgIGNsaWVudEhlaWdodDogYmIuaCxcbiAgICBib3VuZGluZ0JveDogYmJcbiAgfTtcbiAgdmFyIGNvbXBvbmVudHMgPSBvcHRpb25zLmVsZXMuY29tcG9uZW50cygpO1xuICB2YXIgaWQyY21wdElkID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjb21wb25lbnQgPSBjb21wb25lbnRzW2ldO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tcG9uZW50Lmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgbm9kZSA9IGNvbXBvbmVudFtqXTtcbiAgICAgIGlkMmNtcHRJZFtub2RlLmlkKCldID0gaTtcbiAgICB9XG4gIH1cblxuICAvLyBJdGVyYXRlIG92ZXIgYWxsIG5vZGVzLCBjcmVhdGluZyBsYXlvdXQgbm9kZXNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLm5vZGVTaXplOyBpKyspIHtcbiAgICB2YXIgbiA9IG5vZGVzW2ldO1xuICAgIHZhciBuYmIgPSBuLmxheW91dERpbWVuc2lvbnMob3B0aW9ucyk7XG4gICAgdmFyIHRlbXBOb2RlID0ge307XG4gICAgdGVtcE5vZGUuaXNMb2NrZWQgPSBuLmxvY2tlZCgpO1xuICAgIHRlbXBOb2RlLmlkID0gbi5kYXRhKCdpZCcpO1xuICAgIHRlbXBOb2RlLnBhcmVudElkID0gbi5kYXRhKCdwYXJlbnQnKTtcbiAgICB0ZW1wTm9kZS5jbXB0SWQgPSBpZDJjbXB0SWRbbi5pZCgpXTtcbiAgICB0ZW1wTm9kZS5jaGlsZHJlbiA9IFtdO1xuICAgIHRlbXBOb2RlLnBvc2l0aW9uWCA9IG4ucG9zaXRpb24oJ3gnKTtcbiAgICB0ZW1wTm9kZS5wb3NpdGlvblkgPSBuLnBvc2l0aW9uKCd5Jyk7XG4gICAgdGVtcE5vZGUub2Zmc2V0WCA9IDA7XG4gICAgdGVtcE5vZGUub2Zmc2V0WSA9IDA7XG4gICAgdGVtcE5vZGUuaGVpZ2h0ID0gbmJiLnc7XG4gICAgdGVtcE5vZGUud2lkdGggPSBuYmIuaDtcbiAgICB0ZW1wTm9kZS5tYXhYID0gdGVtcE5vZGUucG9zaXRpb25YICsgdGVtcE5vZGUud2lkdGggLyAyO1xuICAgIHRlbXBOb2RlLm1pblggPSB0ZW1wTm9kZS5wb3NpdGlvblggLSB0ZW1wTm9kZS53aWR0aCAvIDI7XG4gICAgdGVtcE5vZGUubWF4WSA9IHRlbXBOb2RlLnBvc2l0aW9uWSArIHRlbXBOb2RlLmhlaWdodCAvIDI7XG4gICAgdGVtcE5vZGUubWluWSA9IHRlbXBOb2RlLnBvc2l0aW9uWSAtIHRlbXBOb2RlLmhlaWdodCAvIDI7XG4gICAgdGVtcE5vZGUucGFkTGVmdCA9IHBhcnNlRmxvYXQobi5zdHlsZSgncGFkZGluZycpKTtcbiAgICB0ZW1wTm9kZS5wYWRSaWdodCA9IHBhcnNlRmxvYXQobi5zdHlsZSgncGFkZGluZycpKTtcbiAgICB0ZW1wTm9kZS5wYWRUb3AgPSBwYXJzZUZsb2F0KG4uc3R5bGUoJ3BhZGRpbmcnKSk7XG4gICAgdGVtcE5vZGUucGFkQm90dG9tID0gcGFyc2VGbG9hdChuLnN0eWxlKCdwYWRkaW5nJykpO1xuXG4gICAgLy8gZm9yY2VzXG4gICAgdGVtcE5vZGUubm9kZVJlcHVsc2lvbiA9IGZuJDYob3B0aW9ucy5ub2RlUmVwdWxzaW9uKSA/IG9wdGlvbnMubm9kZVJlcHVsc2lvbihuKSA6IG9wdGlvbnMubm9kZVJlcHVsc2lvbjtcblxuICAgIC8vIEFkZCBuZXcgbm9kZVxuICAgIGxheW91dEluZm8ubGF5b3V0Tm9kZXMucHVzaCh0ZW1wTm9kZSk7XG4gICAgLy8gQWRkIGVudHJ5IHRvIGlkLWluZGV4IG1hcFxuICAgIGxheW91dEluZm8uaWRUb0luZGV4W3RlbXBOb2RlLmlkXSA9IGk7XG4gIH1cblxuICAvLyBJbmxpbmUgaW1wbGVtZW50YXRpb24gb2YgYSBxdWV1ZSwgdXNlZCBmb3IgdHJhdmVyc2luZyB0aGUgZ3JhcGggaW4gQkZTIG9yZGVyXG4gIHZhciBxdWV1ZSA9IFtdO1xuICB2YXIgc3RhcnQgPSAwOyAvLyBQb2ludHMgdG8gdGhlIHN0YXJ0IHRoZSBxdWV1ZVxuICB2YXIgZW5kID0gLTE7IC8vIFBvaW50cyB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZVxuXG4gIHZhciB0ZW1wR3JhcGggPSBbXTtcblxuICAvLyBTZWNvbmQgcGFzcyB0byBhZGQgY2hpbGQgaW5mb3JtYXRpb24gYW5kXG4gIC8vIGluaXRpYWxpemUgcXVldWUgZm9yIGhpZXJhcmNoaWNhbCB0cmF2ZXJzYWxcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLm5vZGVTaXplOyBpKyspIHtcbiAgICB2YXIgbiA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbaV07XG4gICAgdmFyIHBfaWQgPSBuLnBhcmVudElkO1xuICAgIC8vIENoZWNrIGlmIG5vZGUgbiBoYXMgYSBwYXJlbnQgbm9kZVxuICAgIGlmIChudWxsICE9IHBfaWQpIHtcbiAgICAgIC8vIEFkZCBub2RlIElkIHRvIHBhcmVudCdzIGxpc3Qgb2YgY2hpbGRyZW5cbiAgICAgIGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbcF9pZF1dLmNoaWxkcmVuLnB1c2gobi5pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIGEgbm9kZSBkb2Vzbid0IGhhdmUgYSBwYXJlbnQsIHRoZW4gaXQncyBpbiB0aGUgcm9vdCBncmFwaFxuICAgICAgcXVldWVbKytlbmRdID0gbi5pZDtcbiAgICAgIHRlbXBHcmFwaC5wdXNoKG4uaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCByb290IGdyYXBoIHRvIGdyYXBoU2V0XG4gIGxheW91dEluZm8uZ3JhcGhTZXQucHVzaCh0ZW1wR3JhcGgpO1xuXG4gIC8vIFRyYXZlcnNlIHRoZSBncmFwaCwgbGV2ZWwgYnkgbGV2ZWwsXG4gIHdoaWxlIChzdGFydCA8PSBlbmQpIHtcbiAgICAvLyBHZXQgdGhlIG5vZGUgdG8gdmlzaXQgYW5kIHJlbW92ZSBpdCBmcm9tIHF1ZXVlXG4gICAgdmFyIG5vZGVfaWQgPSBxdWV1ZVtzdGFydCsrXTtcbiAgICB2YXIgbm9kZV9peCA9IGxheW91dEluZm8uaWRUb0luZGV4W25vZGVfaWRdO1xuICAgIHZhciBub2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tub2RlX2l4XTtcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBBZGQgY2hpbGRyZW4gbm9kZXMgYXMgYSBuZXcgZ3JhcGggdG8gZ3JhcGggc2V0XG4gICAgICBsYXlvdXRJbmZvLmdyYXBoU2V0LnB1c2goY2hpbGRyZW4pO1xuICAgICAgLy8gQWRkIGNoaWxkcmVuIHRvIHF1ZSBxdWV1ZSB0byBiZSB2aXNpdGVkXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHF1ZXVlWysrZW5kXSA9IGNoaWxkcmVuW2ldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENyZWF0ZSBpbmRleFRvR3JhcGggbWFwXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5ncmFwaFNldC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBncmFwaCA9IGxheW91dEluZm8uZ3JhcGhTZXRbaV07XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBncmFwaC5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIGluZGV4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbZ3JhcGhbal1dO1xuICAgICAgbGF5b3V0SW5mby5pbmRleFRvR3JhcGhbaW5kZXhdID0gaTtcbiAgICB9XG4gIH1cblxuICAvLyBJdGVyYXRlIG92ZXIgYWxsIGVkZ2VzLCBjcmVhdGluZyBMYXlvdXQgRWRnZXNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLmVkZ2VTaXplOyBpKyspIHtcbiAgICB2YXIgZSA9IGVkZ2VzW2ldO1xuICAgIHZhciB0ZW1wRWRnZSA9IHt9O1xuICAgIHRlbXBFZGdlLmlkID0gZS5kYXRhKCdpZCcpO1xuICAgIHRlbXBFZGdlLnNvdXJjZUlkID0gZS5kYXRhKCdzb3VyY2UnKTtcbiAgICB0ZW1wRWRnZS50YXJnZXRJZCA9IGUuZGF0YSgndGFyZ2V0Jyk7XG5cbiAgICAvLyBDb21wdXRlIGlkZWFsIGxlbmd0aFxuICAgIHZhciBpZGVhbExlbmd0aCA9IGZuJDYob3B0aW9ucy5pZGVhbEVkZ2VMZW5ndGgpID8gb3B0aW9ucy5pZGVhbEVkZ2VMZW5ndGgoZSkgOiBvcHRpb25zLmlkZWFsRWRnZUxlbmd0aDtcbiAgICB2YXIgZWxhc3RpY2l0eSA9IGZuJDYob3B0aW9ucy5lZGdlRWxhc3RpY2l0eSkgPyBvcHRpb25zLmVkZ2VFbGFzdGljaXR5KGUpIDogb3B0aW9ucy5lZGdlRWxhc3RpY2l0eTtcblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYW4gaW50ZXIgZ3JhcGggZWRnZVxuICAgIHZhciBzb3VyY2VJeCA9IGxheW91dEluZm8uaWRUb0luZGV4W3RlbXBFZGdlLnNvdXJjZUlkXTtcbiAgICB2YXIgdGFyZ2V0SXggPSBsYXlvdXRJbmZvLmlkVG9JbmRleFt0ZW1wRWRnZS50YXJnZXRJZF07XG4gICAgdmFyIHNvdXJjZUdyYXBoID0gbGF5b3V0SW5mby5pbmRleFRvR3JhcGhbc291cmNlSXhdO1xuICAgIHZhciB0YXJnZXRHcmFwaCA9IGxheW91dEluZm8uaW5kZXhUb0dyYXBoW3RhcmdldEl4XTtcbiAgICBpZiAoc291cmNlR3JhcGggIT0gdGFyZ2V0R3JhcGgpIHtcbiAgICAgIC8vIEZpbmQgbG93ZXN0IGNvbW1vbiBncmFwaCBhbmNlc3RvclxuICAgICAgdmFyIGxjYSA9IGZpbmRMQ0EodGVtcEVkZ2Uuc291cmNlSWQsIHRlbXBFZGdlLnRhcmdldElkLCBsYXlvdXRJbmZvKTtcblxuICAgICAgLy8gQ29tcHV0ZSBzdW0gb2Ygbm9kZSBkZXB0aHMsIHJlbGF0aXZlIHRvIGxjYSBncmFwaFxuICAgICAgdmFyIGxjYUdyYXBoID0gbGF5b3V0SW5mby5ncmFwaFNldFtsY2FdO1xuICAgICAgdmFyIGRlcHRoID0gMDtcblxuICAgICAgLy8gU291cmNlIGRlcHRoXG4gICAgICB2YXIgdGVtcE5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW3NvdXJjZUl4XTtcbiAgICAgIHdoaWxlICgtMSA9PT0gbGNhR3JhcGguaW5kZXhPZih0ZW1wTm9kZS5pZCkpIHtcbiAgICAgICAgdGVtcE5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W3RlbXBOb2RlLnBhcmVudElkXV07XG4gICAgICAgIGRlcHRoKys7XG4gICAgICB9XG5cbiAgICAgIC8vIFRhcmdldCBkZXB0aFxuICAgICAgdGVtcE5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW3RhcmdldEl4XTtcbiAgICAgIHdoaWxlICgtMSA9PT0gbGNhR3JhcGguaW5kZXhPZih0ZW1wTm9kZS5pZCkpIHtcbiAgICAgICAgdGVtcE5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W3RlbXBOb2RlLnBhcmVudElkXV07XG4gICAgICAgIGRlcHRoKys7XG4gICAgICB9XG5cbiAgICAgIC8vIGxvZ0RlYnVnKCdMQ0Egb2Ygbm9kZXMgJyArIHRlbXBFZGdlLnNvdXJjZUlkICsgJyBhbmQgJyArIHRlbXBFZGdlLnRhcmdldElkICtcbiAgICAgIC8vICBcIi4gSW5kZXg6IFwiICsgbGNhICsgXCIgQ29udGVudHM6IFwiICsgbGNhR3JhcGgudG9TdHJpbmcoKSArXG4gICAgICAvLyAgXCIuIERlcHRoOiBcIiArIGRlcHRoKTtcblxuICAgICAgLy8gVXBkYXRlIGlkZWFsTGVuZ3RoXG4gICAgICBpZGVhbExlbmd0aCAqPSBkZXB0aCAqIG9wdGlvbnMubmVzdGluZ0ZhY3RvcjtcbiAgICB9XG4gICAgdGVtcEVkZ2UuaWRlYWxMZW5ndGggPSBpZGVhbExlbmd0aDtcbiAgICB0ZW1wRWRnZS5lbGFzdGljaXR5ID0gZWxhc3RpY2l0eTtcbiAgICBsYXlvdXRJbmZvLmxheW91dEVkZ2VzLnB1c2godGVtcEVkZ2UpO1xuICB9XG5cbiAgLy8gRmluYWxseSwgcmV0dXJuIGxheW91dEluZm8gb2JqZWN0XG4gIHJldHVybiBsYXlvdXRJbmZvO1xufTtcblxuLyoqXG4gKiBAYnJpZWYgOiBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBpbmRleCBvZiB0aGUgbG93ZXN0IGNvbW1vblxuICogICAgICAgICAgZ3JhcGggYW5jZXN0b3IgYmV0d2VlbiAyIG5vZGVzIGluIHRoZSBzdWJ0cmVlXG4gKiAgICAgICAgICAoZnJvbSB0aGUgZ3JhcGggaGllcmFyY2h5IGluZHVjZWQgdHJlZSkgd2hvc2VcbiAqICAgICAgICAgIHJvb3QgaXMgZ3JhcGhJeFxuICpcbiAqIEBhcmcgbm9kZTE6IG5vZGUxJ3MgSURcbiAqIEBhcmcgbm9kZTI6IG5vZGUyJ3MgSURcbiAqIEBhcmcgbGF5b3V0SW5mbzogbGF5b3V0SW5mbyBvYmplY3RcbiAqXG4gKi9cbnZhciBmaW5kTENBID0gZnVuY3Rpb24gZmluZExDQShub2RlMSwgbm9kZTIsIGxheW91dEluZm8pIHtcbiAgLy8gRmluZCB0aGVpciBjb21tb24gYW5jZXN0ZXIsIHN0YXJ0aW5nIGZyb20gdGhlIHJvb3QgZ3JhcGhcbiAgdmFyIHJlcyA9IGZpbmRMQ0FfYXV4KG5vZGUxLCBub2RlMiwgMCwgbGF5b3V0SW5mbyk7XG4gIGlmICgyID4gcmVzLmNvdW50KSB7XG4gICAgLy8gSWYgYXV4IGZ1bmN0aW9uIGNvdWxkbid0IGZpbmQgdGhlIGNvbW1vbiBhbmNlc3RlcixcbiAgICAvLyB0aGVuIGl0IGlzIHRoZSByb290IGdyYXBoXG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlcy5ncmFwaDtcbiAgfVxufTtcblxuLyoqXG4gKiBAYnJpZWYgICAgICAgICAgOiBBdXhpbGlhcnkgZnVuY3Rpb24gdXNlZCBmb3IgTENBIGNvbXB1dGF0aW9uXG4gKlxuICogQGFyZyBub2RlMSAgICAgIDogbm9kZTEncyBJRFxuICogQGFyZyBub2RlMiAgICAgIDogbm9kZTIncyBJRFxuICogQGFyZyBncmFwaEl4ICAgIDogc3ViZ3JhcGggaW5kZXhcbiAqIEBhcmcgbGF5b3V0SW5mbyA6IGxheW91dEluZm8gb2JqZWN0XG4gKlxuICogQHJldHVybiAgICAgICAgIDogb2JqZWN0IG9mIHRoZSBmb3JtIHtjb3VudDogWCwgZ3JhcGg6IFl9LCB3aGVyZTpcbiAqICAgICAgICAgICAgICAgICAgIFggaXMgdGhlIG51bWJlciBvZiBhbmNlc3RvcnMgKG1heDogMikgZm91bmQgaW5cbiAqICAgICAgICAgICAgICAgICAgIGdyYXBoSXggKGFuZCBpdCdzIHN1YmdyYXBocyksXG4gKiAgICAgICAgICAgICAgICAgICBZIGlzIHRoZSBncmFwaCBpbmRleCBvZiB0aGUgbG93ZXN0IGdyYXBoIGNvbnRhaW5pbmdcbiAqICAgICAgICAgICAgICAgICAgIGFsbCBYIG5vZGVzXG4gKi9cbnZhciBmaW5kTENBX2F1eCA9IGZ1bmN0aW9uIGZpbmRMQ0FfYXV4KG5vZGUxLCBub2RlMiwgZ3JhcGhJeCwgbGF5b3V0SW5mbykge1xuICB2YXIgZ3JhcGggPSBsYXlvdXRJbmZvLmdyYXBoU2V0W2dyYXBoSXhdO1xuICAvLyBJZiBib3RoIG5vZGVzIGJlbG9uZ3MgdG8gZ3JhcGhJeFxuICBpZiAoLTEgPCBncmFwaC5pbmRleE9mKG5vZGUxKSAmJiAtMSA8IGdyYXBoLmluZGV4T2Yobm9kZTIpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvdW50OiAyLFxuICAgICAgZ3JhcGg6IGdyYXBoSXhcbiAgICB9O1xuICB9XG5cbiAgLy8gTWFrZSByZWN1cnNpdmUgY2FsbHMgZm9yIGFsbCBzdWJncmFwaHNcbiAgdmFyIGMgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGdyYXBoLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGVJZCA9IGdyYXBoW2ldO1xuICAgIHZhciBub2RlSXggPSBsYXlvdXRJbmZvLmlkVG9JbmRleFtub2RlSWRdO1xuICAgIHZhciBjaGlsZHJlbiA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbm9kZUl4XS5jaGlsZHJlbjtcblxuICAgIC8vIElmIHRoZSBub2RlIGhhcyBubyBjaGlsZCwgc2tpcCBpdFxuICAgIGlmICgwID09PSBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgY2hpbGRHcmFwaEl4ID0gbGF5b3V0SW5mby5pbmRleFRvR3JhcGhbbGF5b3V0SW5mby5pZFRvSW5kZXhbY2hpbGRyZW5bMF1dXTtcbiAgICB2YXIgcmVzdWx0ID0gZmluZExDQV9hdXgobm9kZTEsIG5vZGUyLCBjaGlsZEdyYXBoSXgsIGxheW91dEluZm8pO1xuICAgIGlmICgwID09PSByZXN1bHQuY291bnQpIHtcbiAgICAgIC8vIE5laXRoZXIgbm9kZTEgbm9yIG5vZGUyIGFyZSBwcmVzZW50IGluIHRoaXMgc3ViZ3JhcGhcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAoMSA9PT0gcmVzdWx0LmNvdW50KSB7XG4gICAgICAvLyBPbmUgb2YgKG5vZGUxLCBub2RlMikgaXMgcHJlc2VudCBpbiB0aGlzIHN1YmdyYXBoXG4gICAgICBjKys7XG4gICAgICBpZiAoMiA9PT0gYykge1xuICAgICAgICAvLyBXZSd2ZSBhbHJlYWR5IGZvdW5kIGJvdGggbm9kZXMsIG5vIG5lZWQgdG8ga2VlcCBzZWFyY2hpbmdcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEJvdGggbm9kZXMgYXJlIHByZXNlbnQgaW4gdGhpcyBzdWJncmFwaFxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjb3VudDogYyxcbiAgICBncmFwaDogZ3JhcGhJeFxuICB9O1xufTtcblxuLyoqXG4gKiBAYnJpZWY6IHByaW50c0xheW91dEluZm8gaW50byBqcyBjb25zb2xlXG4gKiAgICAgICAgIE9ubHkgdXNlZCBmb3IgZGViYnVnaW5nXG4gKi9cbnZhciBwcmludExheW91dEluZm87IFxuXG4vKipcbiAqIEBicmllZiA6IFJhbmRvbWl6ZXMgdGhlIHBvc2l0aW9uIG9mIGFsbCBub2Rlc1xuICovXG52YXIgcmFuZG9taXplUG9zaXRpb25zID0gZnVuY3Rpb24gcmFuZG9taXplUG9zaXRpb25zKGxheW91dEluZm8sIGN5KSB7XG4gIHZhciB3aWR0aCA9IGxheW91dEluZm8uY2xpZW50V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBsYXlvdXRJbmZvLmNsaWVudEhlaWdodDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLm5vZGVTaXplOyBpKyspIHtcbiAgICB2YXIgbiA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbaV07XG5cbiAgICAvLyBObyBuZWVkIHRvIHJhbmRvbWl6ZSBjb21wb3VuZCBub2RlcyBvciBsb2NrZWQgbm9kZXNcbiAgICBpZiAoMCA9PT0gbi5jaGlsZHJlbi5sZW5ndGggJiYgIW4uaXNMb2NrZWQpIHtcbiAgICAgIG4ucG9zaXRpb25YID0gTWF0aC5yYW5kb20oKSAqIHdpZHRoO1xuICAgICAgbi5wb3NpdGlvblkgPSBNYXRoLnJhbmRvbSgpICogaGVpZ2h0O1xuICAgIH1cbiAgfVxufTtcbnZhciBnZXRTY2FsZUluQm91bmRzRm4gPSBmdW5jdGlvbiBnZXRTY2FsZUluQm91bmRzRm4obGF5b3V0SW5mbywgb3B0aW9ucywgbm9kZXMpIHtcbiAgdmFyIGJiID0gbGF5b3V0SW5mby5ib3VuZGluZ0JveDtcbiAgdmFyIGNvc2VCQiA9IHtcbiAgICB4MTogSW5maW5pdHksXG4gICAgeDI6IC1JbmZpbml0eSxcbiAgICB5MTogSW5maW5pdHksXG4gICAgeTI6IC1JbmZpbml0eVxuICB9O1xuICBpZiAob3B0aW9ucy5ib3VuZGluZ0JveCkge1xuICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHZhciBsbm9kZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbbm9kZS5kYXRhKCdpZCcpXV07XG4gICAgICBjb3NlQkIueDEgPSBNYXRoLm1pbihjb3NlQkIueDEsIGxub2RlLnBvc2l0aW9uWCk7XG4gICAgICBjb3NlQkIueDIgPSBNYXRoLm1heChjb3NlQkIueDIsIGxub2RlLnBvc2l0aW9uWCk7XG4gICAgICBjb3NlQkIueTEgPSBNYXRoLm1pbihjb3NlQkIueTEsIGxub2RlLnBvc2l0aW9uWSk7XG4gICAgICBjb3NlQkIueTIgPSBNYXRoLm1heChjb3NlQkIueTIsIGxub2RlLnBvc2l0aW9uWSk7XG4gICAgfSk7XG4gICAgY29zZUJCLncgPSBjb3NlQkIueDIgLSBjb3NlQkIueDE7XG4gICAgY29zZUJCLmggPSBjb3NlQkIueTIgLSBjb3NlQkIueTE7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIChlbGUsIGkpIHtcbiAgICB2YXIgbG5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W2VsZS5kYXRhKCdpZCcpXV07XG4gICAgaWYgKG9wdGlvbnMuYm91bmRpbmdCb3gpIHtcbiAgICAgIC8vIHRoZW4gYWRkIGV4dHJhIGJvdW5kaW5nIGJveCBjb25zdHJhaW50XG4gICAgICB2YXIgcGN0WCA9IChsbm9kZS5wb3NpdGlvblggLSBjb3NlQkIueDEpIC8gY29zZUJCLnc7XG4gICAgICB2YXIgcGN0WSA9IChsbm9kZS5wb3NpdGlvblkgLSBjb3NlQkIueTEpIC8gY29zZUJCLmg7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBiYi54MSArIHBjdFggKiBiYi53LFxuICAgICAgICB5OiBiYi55MSArIHBjdFkgKiBiYi5oXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBsbm9kZS5wb3NpdGlvblgsXG4gICAgICAgIHk6IGxub2RlLnBvc2l0aW9uWVxuICAgICAgfTtcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIEBicmllZiAgICAgICAgICA6IFVwZGF0ZXMgdGhlIHBvc2l0aW9ucyBvZiBub2RlcyBpbiB0aGUgbmV0d29ya1xuICogQGFyZyBsYXlvdXRJbmZvIDogTGF5b3V0SW5mbyBvYmplY3RcbiAqIEBhcmcgY3kgICAgICAgICA6IEN5dG9zY2FwZSBvYmplY3RcbiAqIEBhcmcgb3B0aW9ucyAgICA6IExheW91dCBvcHRpb25zXG4gKi9cbnZhciByZWZyZXNoUG9zaXRpb25zID0gZnVuY3Rpb24gcmVmcmVzaFBvc2l0aW9ucyhsYXlvdXRJbmZvLCBjeSwgb3B0aW9ucykge1xuICAvLyB2YXIgcyA9ICdSZWZyZXNoaW5nIHBvc2l0aW9ucyc7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuXG4gIHZhciBsYXlvdXQgPSBvcHRpb25zLmxheW91dDtcbiAgdmFyIG5vZGVzID0gb3B0aW9ucy5lbGVzLm5vZGVzKCk7XG4gIHZhciBnZXRTY2FsZWRQb3MgPSBnZXRTY2FsZUluQm91bmRzRm4obGF5b3V0SW5mbywgb3B0aW9ucywgbm9kZXMpO1xuICBub2Rlcy5wb3NpdGlvbnMoZ2V0U2NhbGVkUG9zKTtcblxuICAvLyBUcmlnZ2VyIGxheW91dFJlYWR5IG9ubHkgb24gZmlyc3QgY2FsbFxuICBpZiAodHJ1ZSAhPT0gbGF5b3V0SW5mby5yZWFkeSkge1xuICAgIC8vIHMgPSAnVHJpZ2dlcmluZyBsYXlvdXRyZWFkeSc7XG4gICAgLy8gbG9nRGVidWcocyk7XG4gICAgbGF5b3V0SW5mby5yZWFkeSA9IHRydWU7XG4gICAgbGF5b3V0Lm9uZSgnbGF5b3V0cmVhZHknLCBvcHRpb25zLnJlYWR5KTtcbiAgICBsYXlvdXQuZW1pdCh7XG4gICAgICB0eXBlOiAnbGF5b3V0cmVhZHknLFxuICAgICAgbGF5b3V0OiB0aGlzXG4gICAgfSk7XG4gIH1cbn07XG5cbi8qKlxuICogQGJyaWVmIDogTG9ncyBhIGRlYnVnIG1lc3NhZ2UgaW4gSlMgY29uc29sZSwgaWYgREVCVUcgaXMgT05cbiAqL1xuLy8gdmFyIGxvZ0RlYnVnID0gZnVuY3Rpb24odGV4dCkge1xuLy8gICBpZiAoREVCVUcpIHtcbi8vICAgICBjb25zb2xlLmRlYnVnKHRleHQpO1xuLy8gICB9XG4vLyB9O1xuXG4vKipcbiAqIEBicmllZiAgICAgICAgICA6IFBlcmZvcm1zIG9uZSBpdGVyYXRpb24gb2YgdGhlIHBoeXNpY2FsIHNpbXVsYXRpb25cbiAqIEBhcmcgbGF5b3V0SW5mbyA6IExheW91dEluZm8gb2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAqIEBhcmcgY3kgICAgICAgICA6IEN5dG9zY2FwZSBvYmplY3RcbiAqIEBhcmcgb3B0aW9ucyAgICA6IExheW91dCBvcHRpb25zXG4gKi9cbnZhciBzdGVwID0gZnVuY3Rpb24gc3RlcChsYXlvdXRJbmZvLCBvcHRpb25zLCBfc3RlcCkge1xuICAvLyB2YXIgcyA9IFwiXFxuXFxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1wiO1xuICAvLyBzICs9IFwiXFxuU1RFUDogXCIgKyBzdGVwO1xuICAvLyBzICs9IFwiXFxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xcblwiO1xuICAvLyBsb2dEZWJ1ZyhzKTtcblxuICAvLyBDYWxjdWxhdGUgbm9kZSByZXB1bHNpb25zXG4gIGNhbGN1bGF0ZU5vZGVGb3JjZXMobGF5b3V0SW5mbywgb3B0aW9ucyk7XG4gIC8vIENhbGN1bGF0ZSBlZGdlIGZvcmNlc1xuICBjYWxjdWxhdGVFZGdlRm9yY2VzKGxheW91dEluZm8pO1xuICAvLyBDYWxjdWxhdGUgZ3Jhdml0eSBmb3JjZXNcbiAgY2FsY3VsYXRlR3Jhdml0eUZvcmNlcyhsYXlvdXRJbmZvLCBvcHRpb25zKTtcbiAgLy8gUHJvcGFnYXRlIGZvcmNlcyBmcm9tIHBhcmVudCB0byBjaGlsZFxuICBwcm9wYWdhdGVGb3JjZXMobGF5b3V0SW5mbyk7XG4gIC8vIFVwZGF0ZSBwb3NpdGlvbnMgYmFzZWQgb24gY2FsY3VsYXRlZCBmb3JjZXNcbiAgdXBkYXRlUG9zaXRpb25zKGxheW91dEluZm8pO1xufTtcblxuLyoqXG4gKiBAYnJpZWYgOiBDb21wdXRlcyB0aGUgbm9kZSByZXB1bHNpb24gZm9yY2VzXG4gKi9cbnZhciBjYWxjdWxhdGVOb2RlRm9yY2VzID0gZnVuY3Rpb24gY2FsY3VsYXRlTm9kZUZvcmNlcyhsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG4gIC8vIEdvIHRocm91Z2ggZWFjaCBvZiB0aGUgZ3JhcGhzIGluIGdyYXBoU2V0XG4gIC8vIE5vZGVzIG9ubHkgcmVwZWwgZWFjaCBvdGhlciBpZiB0aGV5IGJlbG9uZyB0byB0aGUgc2FtZSBncmFwaFxuICAvLyB2YXIgcyA9ICdjYWxjdWxhdGVOb2RlRm9yY2VzJztcbiAgLy8gbG9nRGVidWcocyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5ncmFwaFNldC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBncmFwaCA9IGxheW91dEluZm8uZ3JhcGhTZXRbaV07XG4gICAgdmFyIG51bU5vZGVzID0gZ3JhcGgubGVuZ3RoO1xuXG4gICAgLy8gcyA9IFwiU2V0OiBcIiArIGdyYXBoLnRvU3RyaW5nKCk7XG4gICAgLy8gbG9nRGVidWcocyk7XG5cbiAgICAvLyBOb3cgZ2V0IGFsbCB0aGUgcGFpcnMgb2Ygbm9kZXNcbiAgICAvLyBPbmx5IGdldCBlYWNoIHBhaXIgb25jZSwgKEEsIEIpID0gKEIsIEEpXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBudW1Ob2RlczsgaisrKSB7XG4gICAgICB2YXIgbm9kZTEgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W2dyYXBoW2pdXV07XG4gICAgICBmb3IgKHZhciBrID0gaiArIDE7IGsgPCBudW1Ob2RlczsgaysrKSB7XG4gICAgICAgIHZhciBub2RlMiA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbZ3JhcGhba11dXTtcbiAgICAgICAgbm9kZVJlcHVsc2lvbihub2RlMSwgbm9kZTIsIGxheW91dEluZm8sIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbnZhciByYW5kb21EaXN0YW5jZSA9IGZ1bmN0aW9uIHJhbmRvbURpc3RhbmNlKG1heCkge1xuICByZXR1cm4gLW1heCArIDIgKiBtYXggKiBNYXRoLnJhbmRvbSgpO1xufTtcblxuLyoqXG4gKiBAYnJpZWYgOiBDb21wdXRlIHRoZSBub2RlIHJlcHVsc2lvbiBmb3JjZXMgYmV0d2VlbiBhIHBhaXIgb2Ygbm9kZXNcbiAqL1xudmFyIG5vZGVSZXB1bHNpb24gPSBmdW5jdGlvbiBub2RlUmVwdWxzaW9uKG5vZGUxLCBub2RlMiwgbGF5b3V0SW5mbywgb3B0aW9ucykge1xuICAvLyB2YXIgcyA9IFwiTm9kZSByZXB1bHNpb24uIE5vZGUxOiBcIiArIG5vZGUxLmlkICsgXCIgTm9kZTI6IFwiICsgbm9kZTIuaWQ7XG5cbiAgdmFyIGNtcHRJZDEgPSBub2RlMS5jbXB0SWQ7XG4gIHZhciBjbXB0SWQyID0gbm9kZTIuY21wdElkO1xuICBpZiAoY21wdElkMSAhPT0gY21wdElkMiAmJiAhbGF5b3V0SW5mby5pc0NvbXBvdW5kKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gR2V0IGRpcmVjdGlvbiBvZiBsaW5lIGNvbm5lY3RpbmcgYm90aCBub2RlIGNlbnRlcnNcbiAgdmFyIGRpcmVjdGlvblggPSBub2RlMi5wb3NpdGlvblggLSBub2RlMS5wb3NpdGlvblg7XG4gIHZhciBkaXJlY3Rpb25ZID0gbm9kZTIucG9zaXRpb25ZIC0gbm9kZTEucG9zaXRpb25ZO1xuICB2YXIgbWF4UmFuZERpc3QgPSAxO1xuICAvLyBzICs9IFwiXFxuZGlyZWN0aW9uWDogXCIgKyBkaXJlY3Rpb25YICsgXCIsIGRpcmVjdGlvblk6IFwiICsgZGlyZWN0aW9uWTtcblxuICAvLyBJZiBib3RoIGNlbnRlcnMgYXJlIHRoZSBzYW1lLCBhcHBseSBhIHJhbmRvbSBmb3JjZVxuICBpZiAoMCA9PT0gZGlyZWN0aW9uWCAmJiAwID09PSBkaXJlY3Rpb25ZKSB7XG4gICAgZGlyZWN0aW9uWCA9IHJhbmRvbURpc3RhbmNlKG1heFJhbmREaXN0KTtcbiAgICBkaXJlY3Rpb25ZID0gcmFuZG9tRGlzdGFuY2UobWF4UmFuZERpc3QpO1xuICB9XG4gIHZhciBvdmVybGFwID0gbm9kZXNPdmVybGFwKG5vZGUxLCBub2RlMiwgZGlyZWN0aW9uWCwgZGlyZWN0aW9uWSk7XG4gIGlmIChvdmVybGFwID4gMCkge1xuICAgIC8vIHMgKz0gXCJcXG5Ob2RlcyBETyBvdmVybGFwLlwiO1xuICAgIC8vIHMgKz0gXCJcXG5PdmVybGFwOiBcIiArIG92ZXJsYXA7XG4gICAgLy8gSWYgbm9kZXMgb3ZlcmxhcCwgcmVwdWxzaW9uIGZvcmNlIGlzIHByb3BvcnRpb25hbFxuICAgIC8vIHRvIHRoZSBvdmVybGFwXG4gICAgdmFyIGZvcmNlID0gb3B0aW9ucy5ub2RlT3ZlcmxhcCAqIG92ZXJsYXA7XG5cbiAgICAvLyBDb21wdXRlIHRoZSBtb2R1bGUgYW5kIGNvbXBvbmVudHMgb2YgdGhlIGZvcmNlIHZlY3RvclxuICAgIHZhciBkaXN0YW5jZSA9IE1hdGguc3FydChkaXJlY3Rpb25YICogZGlyZWN0aW9uWCArIGRpcmVjdGlvblkgKiBkaXJlY3Rpb25ZKTtcbiAgICAvLyBzICs9IFwiXFxuRGlzdGFuY2U6IFwiICsgZGlzdGFuY2U7XG4gICAgdmFyIGZvcmNlWCA9IGZvcmNlICogZGlyZWN0aW9uWCAvIGRpc3RhbmNlO1xuICAgIHZhciBmb3JjZVkgPSBmb3JjZSAqIGRpcmVjdGlvblkgLyBkaXN0YW5jZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBzICs9IFwiXFxuTm9kZXMgZG8gTk9UIG92ZXJsYXAuXCI7XG4gICAgLy8gSWYgdGhlcmUncyBubyBvdmVybGFwLCBmb3JjZSBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsXG4gICAgLy8gdG8gc3F1YXJlZCBkaXN0YW5jZVxuXG4gICAgLy8gR2V0IGNsaXBwaW5nIHBvaW50cyBmb3IgYm90aCBub2Rlc1xuICAgIHZhciBwb2ludDEgPSBmaW5kQ2xpcHBpbmdQb2ludChub2RlMSwgZGlyZWN0aW9uWCwgZGlyZWN0aW9uWSk7XG4gICAgdmFyIHBvaW50MiA9IGZpbmRDbGlwcGluZ1BvaW50KG5vZGUyLCAtMSAqIGRpcmVjdGlvblgsIC0xICogZGlyZWN0aW9uWSk7XG5cbiAgICAvLyBVc2UgY2xpcHBpbmcgcG9pbnRzIHRvIGNvbXB1dGUgZGlzdGFuY2VcbiAgICB2YXIgZGlzdGFuY2VYID0gcG9pbnQyLnggLSBwb2ludDEueDtcbiAgICB2YXIgZGlzdGFuY2VZID0gcG9pbnQyLnkgLSBwb2ludDEueTtcbiAgICB2YXIgZGlzdGFuY2VTcXIgPSBkaXN0YW5jZVggKiBkaXN0YW5jZVggKyBkaXN0YW5jZVkgKiBkaXN0YW5jZVk7XG4gICAgdmFyIGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRpc3RhbmNlU3FyKTtcbiAgICAvLyBzICs9IFwiXFxuRGlzdGFuY2U6IFwiICsgZGlzdGFuY2U7XG5cbiAgICAvLyBDb21wdXRlIHRoZSBtb2R1bGUgYW5kIGNvbXBvbmVudHMgb2YgdGhlIGZvcmNlIHZlY3RvclxuICAgIHZhciBmb3JjZSA9IChub2RlMS5ub2RlUmVwdWxzaW9uICsgbm9kZTIubm9kZVJlcHVsc2lvbikgLyBkaXN0YW5jZVNxcjtcbiAgICB2YXIgZm9yY2VYID0gZm9yY2UgKiBkaXN0YW5jZVggLyBkaXN0YW5jZTtcbiAgICB2YXIgZm9yY2VZID0gZm9yY2UgKiBkaXN0YW5jZVkgLyBkaXN0YW5jZTtcbiAgfVxuXG4gIC8vIEFwcGx5IGZvcmNlXG4gIGlmICghbm9kZTEuaXNMb2NrZWQpIHtcbiAgICBub2RlMS5vZmZzZXRYIC09IGZvcmNlWDtcbiAgICBub2RlMS5vZmZzZXRZIC09IGZvcmNlWTtcbiAgfVxuICBpZiAoIW5vZGUyLmlzTG9ja2VkKSB7XG4gICAgbm9kZTIub2Zmc2V0WCArPSBmb3JjZVg7XG4gICAgbm9kZTIub2Zmc2V0WSArPSBmb3JjZVk7XG4gIH1cblxuICAvLyBzICs9IFwiXFxuRm9yY2VYOiBcIiArIGZvcmNlWCArIFwiIEZvcmNlWTogXCIgKyBmb3JjZVk7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuXG4gIHJldHVybjtcbn07XG5cbi8qKlxuICogQGJyaWVmICA6IERldGVybWluZXMgd2hldGhlciB0d28gbm9kZXMgb3ZlcmxhcCBvciBub3RcbiAqIEByZXR1cm4gOiBBbW91bnQgb2Ygb3ZlcmxhcHBpbmcgKDAgPT4gbm8gb3ZlcmxhcClcbiAqL1xudmFyIG5vZGVzT3ZlcmxhcCA9IGZ1bmN0aW9uIG5vZGVzT3ZlcmxhcChub2RlMSwgbm9kZTIsIGRYLCBkWSkge1xuICBpZiAoZFggPiAwKSB7XG4gICAgdmFyIG92ZXJsYXBYID0gbm9kZTEubWF4WCAtIG5vZGUyLm1pblg7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG92ZXJsYXBYID0gbm9kZTIubWF4WCAtIG5vZGUxLm1pblg7XG4gIH1cbiAgaWYgKGRZID4gMCkge1xuICAgIHZhciBvdmVybGFwWSA9IG5vZGUxLm1heFkgLSBub2RlMi5taW5ZO1xuICB9IGVsc2Uge1xuICAgIHZhciBvdmVybGFwWSA9IG5vZGUyLm1heFkgLSBub2RlMS5taW5ZO1xuICB9XG4gIGlmIChvdmVybGFwWCA+PSAwICYmIG92ZXJsYXBZID49IDApIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KG92ZXJsYXBYICogb3ZlcmxhcFggKyBvdmVybGFwWSAqIG92ZXJsYXBZKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufTtcblxuLyoqXG4gKiBAYnJpZWYgOiBGaW5kcyB0aGUgcG9pbnQgaW4gd2hpY2ggYW4gZWRnZSAoZGlyZWN0aW9uIGRYLCBkWSkgaW50ZXJzZWN0c1xuICogICAgICAgICAgdGhlIHJlY3Rhbmd1bGFyIGJvdW5kaW5nIGJveCBvZiBpdCdzIHNvdXJjZS90YXJnZXQgbm9kZVxuICovXG52YXIgZmluZENsaXBwaW5nUG9pbnQgPSBmdW5jdGlvbiBmaW5kQ2xpcHBpbmdQb2ludChub2RlLCBkWCwgZFkpIHtcbiAgLy8gU2hvcmN1dHNcbiAgdmFyIFggPSBub2RlLnBvc2l0aW9uWDtcbiAgdmFyIFkgPSBub2RlLnBvc2l0aW9uWTtcbiAgdmFyIEggPSBub2RlLmhlaWdodCB8fCAxO1xuICB2YXIgVyA9IG5vZGUud2lkdGggfHwgMTtcbiAgdmFyIGRpclNsb3BlID0gZFkgLyBkWDtcbiAgdmFyIG5vZGVTbG9wZSA9IEggLyBXO1xuXG4gIC8vIHZhciBzID0gJ0NvbXB1dGluZyBjbGlwcGluZyBwb2ludCBvZiBub2RlICcgKyBub2RlLmlkICtcbiAgLy8gICBcIiAuIEhlaWdodDogIFwiICsgSCArIFwiLCBXaWR0aDogXCIgKyBXICtcbiAgLy8gICBcIlxcbkRpcmVjdGlvbiBcIiArIGRYICsgXCIsIFwiICsgZFk7XG4gIC8vXG4gIC8vIENvbXB1dGUgaW50ZXJzZWN0aW9uXG4gIHZhciByZXMgPSB7fTtcblxuICAvLyBDYXNlOiBWZXJ0aWNhbCBkaXJlY3Rpb24gKHVwKVxuICBpZiAoMCA9PT0gZFggJiYgMCA8IGRZKSB7XG4gICAgcmVzLnggPSBYO1xuICAgIC8vIHMgKz0gXCJcXG5VcCBkaXJlY3Rpb25cIjtcbiAgICByZXMueSA9IFkgKyBIIC8gMjtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLy8gQ2FzZTogVmVydGljYWwgZGlyZWN0aW9uIChkb3duKVxuICBpZiAoMCA9PT0gZFggJiYgMCA+IGRZKSB7XG4gICAgcmVzLnggPSBYO1xuICAgIHJlcy55ID0gWSArIEggLyAyO1xuICAgIC8vIHMgKz0gXCJcXG5Eb3duIGRpcmVjdGlvblwiO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8vIENhc2U6IEludGVyc2VjdHMgdGhlIHJpZ2h0IGJvcmRlclxuICBpZiAoMCA8IGRYICYmIC0xICogbm9kZVNsb3BlIDw9IGRpclNsb3BlICYmIGRpclNsb3BlIDw9IG5vZGVTbG9wZSkge1xuICAgIHJlcy54ID0gWCArIFcgLyAyO1xuICAgIHJlcy55ID0gWSArIFcgKiBkWSAvIDIgLyBkWDtcbiAgICAvLyBzICs9IFwiXFxuUmlnaHRib3JkZXJcIjtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvLyBDYXNlOiBJbnRlcnNlY3RzIHRoZSBsZWZ0IGJvcmRlclxuICBpZiAoMCA+IGRYICYmIC0xICogbm9kZVNsb3BlIDw9IGRpclNsb3BlICYmIGRpclNsb3BlIDw9IG5vZGVTbG9wZSkge1xuICAgIHJlcy54ID0gWCAtIFcgLyAyO1xuICAgIHJlcy55ID0gWSAtIFcgKiBkWSAvIDIgLyBkWDtcbiAgICAvLyBzICs9IFwiXFxuTGVmdGJvcmRlclwiO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8vIENhc2U6IEludGVyc2VjdHMgdGhlIHRvcCBib3JkZXJcbiAgaWYgKDAgPCBkWSAmJiAoZGlyU2xvcGUgPD0gLTEgKiBub2RlU2xvcGUgfHwgZGlyU2xvcGUgPj0gbm9kZVNsb3BlKSkge1xuICAgIHJlcy54ID0gWCArIEggKiBkWCAvIDIgLyBkWTtcbiAgICByZXMueSA9IFkgKyBIIC8gMjtcbiAgICAvLyBzICs9IFwiXFxuVG9wIGJvcmRlclwiO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8vIENhc2U6IEludGVyc2VjdHMgdGhlIGJvdHRvbSBib3JkZXJcbiAgaWYgKDAgPiBkWSAmJiAoZGlyU2xvcGUgPD0gLTEgKiBub2RlU2xvcGUgfHwgZGlyU2xvcGUgPj0gbm9kZVNsb3BlKSkge1xuICAgIHJlcy54ID0gWCAtIEggKiBkWCAvIDIgLyBkWTtcbiAgICByZXMueSA9IFkgLSBIIC8gMjtcbiAgICAvLyBzICs9IFwiXFxuQm90dG9tIGJvcmRlclwiO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8vIHMgKz0gXCJcXG5DbGlwcGluZyBwb2ludCBmb3VuZCBhdCBcIiArIHJlcy54ICsgXCIsIFwiICsgcmVzLnk7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuICByZXR1cm4gcmVzO1xufTtcblxuLyoqXG4gKiBAYnJpZWYgOiBDYWxjdWxhdGVzIGFsbCBlZGdlIGZvcmNlc1xuICovXG52YXIgY2FsY3VsYXRlRWRnZUZvcmNlcyA9IGZ1bmN0aW9uIGNhbGN1bGF0ZUVkZ2VGb3JjZXMobGF5b3V0SW5mbywgb3B0aW9ucykge1xuICAvLyBJdGVyYXRlIG92ZXIgYWxsIGVkZ2VzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5lZGdlU2l6ZTsgaSsrKSB7XG4gICAgLy8gR2V0IGVkZ2UsIHNvdXJjZSAmIHRhcmdldCBub2Rlc1xuICAgIHZhciBlZGdlID0gbGF5b3V0SW5mby5sYXlvdXRFZGdlc1tpXTtcbiAgICB2YXIgc291cmNlSXggPSBsYXlvdXRJbmZvLmlkVG9JbmRleFtlZGdlLnNvdXJjZUlkXTtcbiAgICB2YXIgc291cmNlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tzb3VyY2VJeF07XG4gICAgdmFyIHRhcmdldEl4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbZWRnZS50YXJnZXRJZF07XG4gICAgdmFyIHRhcmdldCA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbdGFyZ2V0SXhdO1xuXG4gICAgLy8gR2V0IGRpcmVjdGlvbiBvZiBsaW5lIGNvbm5lY3RpbmcgYm90aCBub2RlIGNlbnRlcnNcbiAgICB2YXIgZGlyZWN0aW9uWCA9IHRhcmdldC5wb3NpdGlvblggLSBzb3VyY2UucG9zaXRpb25YO1xuICAgIHZhciBkaXJlY3Rpb25ZID0gdGFyZ2V0LnBvc2l0aW9uWSAtIHNvdXJjZS5wb3NpdGlvblk7XG5cbiAgICAvLyBJZiBib3RoIGNlbnRlcnMgYXJlIHRoZSBzYW1lLCBkbyBub3RoaW5nLlxuICAgIC8vIEEgcmFuZG9tIGZvcmNlIGhhcyBhbHJlYWR5IGJlZW4gYXBwbGllZCBhcyBub2RlIHJlcHVsc2lvblxuICAgIGlmICgwID09PSBkaXJlY3Rpb25YICYmIDAgPT09IGRpcmVjdGlvblkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEdldCBjbGlwcGluZyBwb2ludHMgZm9yIGJvdGggbm9kZXNcbiAgICB2YXIgcG9pbnQxID0gZmluZENsaXBwaW5nUG9pbnQoc291cmNlLCBkaXJlY3Rpb25YLCBkaXJlY3Rpb25ZKTtcbiAgICB2YXIgcG9pbnQyID0gZmluZENsaXBwaW5nUG9pbnQodGFyZ2V0LCAtMSAqIGRpcmVjdGlvblgsIC0xICogZGlyZWN0aW9uWSk7XG4gICAgdmFyIGx4ID0gcG9pbnQyLnggLSBwb2ludDEueDtcbiAgICB2YXIgbHkgPSBwb2ludDIueSAtIHBvaW50MS55O1xuICAgIHZhciBsID0gTWF0aC5zcXJ0KGx4ICogbHggKyBseSAqIGx5KTtcbiAgICB2YXIgZm9yY2UgPSBNYXRoLnBvdyhlZGdlLmlkZWFsTGVuZ3RoIC0gbCwgMikgLyBlZGdlLmVsYXN0aWNpdHk7XG4gICAgaWYgKDAgIT09IGwpIHtcbiAgICAgIHZhciBmb3JjZVggPSBmb3JjZSAqIGx4IC8gbDtcbiAgICAgIHZhciBmb3JjZVkgPSBmb3JjZSAqIGx5IC8gbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZvcmNlWCA9IDA7XG4gICAgICB2YXIgZm9yY2VZID0gMDtcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhpcyBmb3JjZSB0byB0YXJnZXQgYW5kIHNvdXJjZSBub2Rlc1xuICAgIGlmICghc291cmNlLmlzTG9ja2VkKSB7XG4gICAgICBzb3VyY2Uub2Zmc2V0WCArPSBmb3JjZVg7XG4gICAgICBzb3VyY2Uub2Zmc2V0WSArPSBmb3JjZVk7XG4gICAgfVxuICAgIGlmICghdGFyZ2V0LmlzTG9ja2VkKSB7XG4gICAgICB0YXJnZXQub2Zmc2V0WCAtPSBmb3JjZVg7XG4gICAgICB0YXJnZXQub2Zmc2V0WSAtPSBmb3JjZVk7XG4gICAgfVxuXG4gICAgLy8gdmFyIHMgPSAnRWRnZSBmb3JjZSBiZXR3ZWVuIG5vZGVzICcgKyBzb3VyY2UuaWQgKyAnIGFuZCAnICsgdGFyZ2V0LmlkO1xuICAgIC8vIHMgKz0gXCJcXG5EaXN0YW5jZTogXCIgKyBsICsgXCIgRm9yY2U6IChcIiArIGZvcmNlWCArIFwiLCBcIiArIGZvcmNlWSArIFwiKVwiO1xuICAgIC8vIGxvZ0RlYnVnKHMpO1xuICB9XG59O1xuXG4vKipcbiAqIEBicmllZiA6IENvbXB1dGVzIGdyYXZpdHkgZm9yY2VzIGZvciBhbGwgbm9kZXNcbiAqL1xudmFyIGNhbGN1bGF0ZUdyYXZpdHlGb3JjZXMgPSBmdW5jdGlvbiBjYWxjdWxhdGVHcmF2aXR5Rm9yY2VzKGxheW91dEluZm8sIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMuZ3Jhdml0eSA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgZGlzdFRocmVzaG9sZCA9IDE7XG5cbiAgLy8gdmFyIHMgPSAnY2FsY3VsYXRlR3Jhdml0eUZvcmNlcyc7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8uZ3JhcGhTZXQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZ3JhcGggPSBsYXlvdXRJbmZvLmdyYXBoU2V0W2ldO1xuICAgIHZhciBudW1Ob2RlcyA9IGdyYXBoLmxlbmd0aDtcblxuICAgIC8vIHMgPSBcIlNldDogXCIgKyBncmFwaC50b1N0cmluZygpO1xuICAgIC8vIGxvZ0RlYnVnKHMpO1xuXG4gICAgLy8gQ29tcHV0ZSBncmFwaCBjZW50ZXJcbiAgICBpZiAoMCA9PT0gaSkge1xuICAgICAgdmFyIGNlbnRlclggPSBsYXlvdXRJbmZvLmNsaWVudEhlaWdodCAvIDI7XG4gICAgICB2YXIgY2VudGVyWSA9IGxheW91dEluZm8uY2xpZW50V2lkdGggLyAyO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBHZXQgUGFyZW50IG5vZGUgZm9yIHRoaXMgZ3JhcGgsIGFuZCB1c2UgaXRzIHBvc2l0aW9uIGFzIGNlbnRlclxuICAgICAgdmFyIHRlbXAgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W2dyYXBoWzBdXV07XG4gICAgICB2YXIgcGFyZW50ID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFt0ZW1wLnBhcmVudElkXV07XG4gICAgICB2YXIgY2VudGVyWCA9IHBhcmVudC5wb3NpdGlvblg7XG4gICAgICB2YXIgY2VudGVyWSA9IHBhcmVudC5wb3NpdGlvblk7XG4gICAgfVxuICAgIC8vIHMgPSBcIkNlbnRlciBmb3VuZCBhdDogXCIgKyBjZW50ZXJYICsgXCIsIFwiICsgY2VudGVyWTtcbiAgICAvLyBsb2dEZWJ1ZyhzKTtcblxuICAgIC8vIEFwcGx5IGZvcmNlIHRvIGFsbCBub2RlcyBpbiBncmFwaFxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbnVtTm9kZXM7IGorKykge1xuICAgICAgdmFyIG5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W2dyYXBoW2pdXV07XG4gICAgICAvLyBzID0gXCJOb2RlOiBcIiArIG5vZGUuaWQ7XG5cbiAgICAgIGlmIChub2RlLmlzTG9ja2VkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGR4ID0gY2VudGVyWCAtIG5vZGUucG9zaXRpb25YO1xuICAgICAgdmFyIGR5ID0gY2VudGVyWSAtIG5vZGUucG9zaXRpb25ZO1xuICAgICAgdmFyIGQgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgICAgaWYgKGQgPiBkaXN0VGhyZXNob2xkKSB7XG4gICAgICAgIHZhciBmeCA9IG9wdGlvbnMuZ3Jhdml0eSAqIGR4IC8gZDtcbiAgICAgICAgdmFyIGZ5ID0gb3B0aW9ucy5ncmF2aXR5ICogZHkgLyBkO1xuICAgICAgICBub2RlLm9mZnNldFggKz0gZng7XG4gICAgICAgIG5vZGUub2Zmc2V0WSArPSBmeTtcbiAgICAgICAgLy8gcyArPSBcIjogQXBwbGllZCBmb3JjZTogXCIgKyBmeCArIFwiLCBcIiArIGZ5O1xuICAgICAgfVxuICAgICAgLy8gbG9nRGVidWcocyk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEBicmllZiAgICAgICAgICA6IFRoaXMgZnVuY3Rpb24gcHJvcGFnYXRlcyB0aGUgZXhpc3Rpbmcgb2Zmc2V0cyBmcm9tXG4gKiAgICAgICAgICAgICAgICAgICBwYXJlbnQgbm9kZXMgdG8gaXRzIGRlc2NlbmRlbnRzLlxuICogQGFyZyBsYXlvdXRJbmZvIDogbGF5b3V0SW5mbyBPYmplY3RcbiAqIEBhcmcgY3kgICAgICAgICA6IGN5dG9zY2FwZSBPYmplY3RcbiAqIEBhcmcgb3B0aW9ucyAgICA6IExheW91dCBvcHRpb25zXG4gKi9cbnZhciBwcm9wYWdhdGVGb3JjZXMgPSBmdW5jdGlvbiBwcm9wYWdhdGVGb3JjZXMobGF5b3V0SW5mbywgb3B0aW9ucykge1xuICAvLyBJbmxpbmUgaW1wbGVtZW50YXRpb24gb2YgYSBxdWV1ZSwgdXNlZCBmb3IgdHJhdmVyc2luZyB0aGUgZ3JhcGggaW4gQkZTIG9yZGVyXG4gIHZhciBxdWV1ZSA9IFtdO1xuICB2YXIgc3RhcnQgPSAwOyAvLyBQb2ludHMgdG8gdGhlIHN0YXJ0IHRoZSBxdWV1ZVxuICB2YXIgZW5kID0gLTE7IC8vIFBvaW50cyB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZVxuXG4gIC8vIGxvZ0RlYnVnKCdwcm9wYWdhdGVGb3JjZXMnKTtcblxuICAvLyBTdGFydCBieSB2aXNpdGluZyB0aGUgbm9kZXMgaW4gdGhlIHJvb3QgZ3JhcGhcbiAgcXVldWUucHVzaC5hcHBseShxdWV1ZSwgbGF5b3V0SW5mby5ncmFwaFNldFswXSk7XG4gIGVuZCArPSBsYXlvdXRJbmZvLmdyYXBoU2V0WzBdLmxlbmd0aDtcblxuICAvLyBUcmF2ZXJzZSB0aGUgZ3JhcGgsIGxldmVsIGJ5IGxldmVsLFxuICB3aGlsZSAoc3RhcnQgPD0gZW5kKSB7XG4gICAgLy8gR2V0IHRoZSBub2RlIHRvIHZpc2l0IGFuZCByZW1vdmUgaXQgZnJvbSBxdWV1ZVxuICAgIHZhciBub2RlSWQgPSBxdWV1ZVtzdGFydCsrXTtcbiAgICB2YXIgbm9kZUluZGV4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbbm9kZUlkXTtcbiAgICB2YXIgbm9kZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbm9kZUluZGV4XTtcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuXG4gICAgLy8gV2Ugb25seSBuZWVkIHRvIHByb2Nlc3MgdGhlIG5vZGUgaWYgaXQncyBjb21wb3VuZFxuICAgIGlmICgwIDwgY2hpbGRyZW4ubGVuZ3RoICYmICFub2RlLmlzTG9ja2VkKSB7XG4gICAgICB2YXIgb2ZmWCA9IG5vZGUub2Zmc2V0WDtcbiAgICAgIHZhciBvZmZZID0gbm9kZS5vZmZzZXRZO1xuXG4gICAgICAvLyB2YXIgcyA9IFwiUHJvcGFnYXRpbmcgb2Zmc2V0IGZyb20gcGFyZW50IG5vZGUgOiBcIiArIG5vZGUuaWQgK1xuICAgICAgLy8gICBcIi4gT2Zmc2V0WDogXCIgKyBvZmZYICsgXCIuIE9mZnNldFk6IFwiICsgb2ZmWTtcbiAgICAgIC8vIHMgKz0gXCJcXG4gQ2hpbGRyZW46IFwiICsgY2hpbGRyZW4udG9TdHJpbmcoKTtcbiAgICAgIC8vIGxvZ0RlYnVnKHMpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZE5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W2NoaWxkcmVuW2ldXV07XG4gICAgICAgIC8vIFByb3BhZ2F0ZSBvZmZzZXRcbiAgICAgICAgY2hpbGROb2RlLm9mZnNldFggKz0gb2ZmWDtcbiAgICAgICAgY2hpbGROb2RlLm9mZnNldFkgKz0gb2ZmWTtcbiAgICAgICAgLy8gQWRkIGNoaWxkcmVuIHRvIHF1ZXVlIHRvIGJlIHZpc2l0ZWRcbiAgICAgICAgcXVldWVbKytlbmRdID0gY2hpbGRyZW5baV07XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc2V0IHBhcmVudCBvZmZzZXRzXG4gICAgICBub2RlLm9mZnNldFggPSAwO1xuICAgICAgbm9kZS5vZmZzZXRZID0gMDtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQGJyaWVmIDogVXBkYXRlcyB0aGUgbGF5b3V0IG1vZGVsIHBvc2l0aW9ucywgYmFzZWQgb25cbiAqICAgICAgICAgIHRoZSBhY2N1bXVsYXRlZCBmb3JjZXNcbiAqL1xudmFyIHVwZGF0ZVBvc2l0aW9ucyA9IGZ1bmN0aW9uIHVwZGF0ZVBvc2l0aW9ucyhsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG4gIC8vIHZhciBzID0gJ1VwZGF0aW5nIHBvc2l0aW9ucyc7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuXG4gIC8vIFJlc2V0IGJvdW5kYXJpZXMgZm9yIGNvbXBvdW5kIG5vZGVzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5ub2RlU2l6ZTsgaSsrKSB7XG4gICAgdmFyIG4gPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2ldO1xuICAgIGlmICgwIDwgbi5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIC8vIGxvZ0RlYnVnKFwiUmVzZXR0aW5nIGJvdW5kYXJpZXMgb2YgY29tcG91bmQgbm9kZTogXCIgKyBuLmlkKTtcbiAgICAgIG4ubWF4WCA9IHVuZGVmaW5lZDtcbiAgICAgIG4ubWluWCA9IHVuZGVmaW5lZDtcbiAgICAgIG4ubWF4WSA9IHVuZGVmaW5lZDtcbiAgICAgIG4ubWluWSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLm5vZGVTaXplOyBpKyspIHtcbiAgICB2YXIgbiA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbaV07XG4gICAgaWYgKDAgPCBuLmNoaWxkcmVuLmxlbmd0aCB8fCBuLmlzTG9ja2VkKSB7XG4gICAgICAvLyBObyBuZWVkIHRvIHNldCBjb21wb3VuZCBvciBsb2NrZWQgbm9kZSBwb3NpdGlvblxuICAgICAgLy8gbG9nRGVidWcoXCJTa2lwcGluZyBwb3NpdGlvbiB1cGRhdGUgb2Ygbm9kZTogXCIgKyBuLmlkKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBzID0gXCJOb2RlOiBcIiArIG4uaWQgKyBcIiBQcmV2aW91cyBwb3NpdGlvbjogKFwiICtcbiAgICAvLyBuLnBvc2l0aW9uWCArIFwiLCBcIiArIG4ucG9zaXRpb25ZICsgXCIpLlwiO1xuXG4gICAgLy8gTGltaXQgZGlzcGxhY2VtZW50IGluIG9yZGVyIHRvIGltcHJvdmUgc3RhYmlsaXR5XG4gICAgdmFyIHRlbXBGb3JjZSA9IGxpbWl0Rm9yY2Uobi5vZmZzZXRYLCBuLm9mZnNldFksIGxheW91dEluZm8udGVtcGVyYXR1cmUpO1xuICAgIG4ucG9zaXRpb25YICs9IHRlbXBGb3JjZS54O1xuICAgIG4ucG9zaXRpb25ZICs9IHRlbXBGb3JjZS55O1xuICAgIG4ub2Zmc2V0WCA9IDA7XG4gICAgbi5vZmZzZXRZID0gMDtcbiAgICBuLm1pblggPSBuLnBvc2l0aW9uWCAtIG4ud2lkdGg7XG4gICAgbi5tYXhYID0gbi5wb3NpdGlvblggKyBuLndpZHRoO1xuICAgIG4ubWluWSA9IG4ucG9zaXRpb25ZIC0gbi5oZWlnaHQ7XG4gICAgbi5tYXhZID0gbi5wb3NpdGlvblkgKyBuLmhlaWdodDtcbiAgICAvLyBzICs9IFwiIE5ldyBQb3NpdGlvbjogKFwiICsgbi5wb3NpdGlvblggKyBcIiwgXCIgKyBuLnBvc2l0aW9uWSArIFwiKS5cIjtcbiAgICAvLyBsb2dEZWJ1ZyhzKTtcblxuICAgIC8vIFVwZGF0ZSBhbmNlc3RyeSBib3VkYXJpZXNcbiAgICB1cGRhdGVBbmNlc3RyeUJvdW5kYXJpZXMobiwgbGF5b3V0SW5mbyk7XG4gIH1cblxuICAvLyBVcGRhdGUgc2l6ZSwgcG9zaXRpb24gb2YgY29tcHVuZCBub2Rlc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8ubm9kZVNpemU7IGkrKykge1xuICAgIHZhciBuID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tpXTtcbiAgICBpZiAoMCA8IG4uY2hpbGRyZW4ubGVuZ3RoICYmICFuLmlzTG9ja2VkKSB7XG4gICAgICBuLnBvc2l0aW9uWCA9IChuLm1heFggKyBuLm1pblgpIC8gMjtcbiAgICAgIG4ucG9zaXRpb25ZID0gKG4ubWF4WSArIG4ubWluWSkgLyAyO1xuICAgICAgbi53aWR0aCA9IG4ubWF4WCAtIG4ubWluWDtcbiAgICAgIG4uaGVpZ2h0ID0gbi5tYXhZIC0gbi5taW5ZO1xuICAgICAgLy8gcyA9IFwiVXBkYXRpbmcgcG9zaXRpb24sIHNpemUgb2YgY29tcG91bmQgbm9kZSBcIiArIG4uaWQ7XG4gICAgICAvLyBzICs9IFwiXFxuUG9zaXRpb25YOiBcIiArIG4ucG9zaXRpb25YICsgXCIsIFBvc2l0aW9uWTogXCIgKyBuLnBvc2l0aW9uWTtcbiAgICAgIC8vIHMgKz0gXCJcXG5XaWR0aDogXCIgKyBuLndpZHRoICsgXCIsIEhlaWdodDogXCIgKyBuLmhlaWdodDtcbiAgICAgIC8vIGxvZ0RlYnVnKHMpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBAYnJpZWYgOiBMaW1pdHMgYSBmb3JjZSAoZm9yY2VYLCBmb3JjZVkpIHRvIGJlIG5vdFxuICogICAgICAgICAgZ3JlYXRlciAoaW4gbW9kdWxvKSB0aGFuIG1heC5cbiA4ICAgICAgICAgIFByZXNlcnZlcyBmb3JjZSBkaXJlY3Rpb24uXG4gICovXG52YXIgbGltaXRGb3JjZSA9IGZ1bmN0aW9uIGxpbWl0Rm9yY2UoZm9yY2VYLCBmb3JjZVksIG1heCkge1xuICAvLyB2YXIgcyA9IFwiTGltaXRpbmcgZm9yY2U6IChcIiArIGZvcmNlWCArIFwiLCBcIiArIGZvcmNlWSArIFwiKS4gTWF4OiBcIiArIG1heDtcbiAgdmFyIGZvcmNlID0gTWF0aC5zcXJ0KGZvcmNlWCAqIGZvcmNlWCArIGZvcmNlWSAqIGZvcmNlWSk7XG4gIGlmIChmb3JjZSA+IG1heCkge1xuICAgIHZhciByZXMgPSB7XG4gICAgICB4OiBtYXggKiBmb3JjZVggLyBmb3JjZSxcbiAgICAgIHk6IG1heCAqIGZvcmNlWSAvIGZvcmNlXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgeDogZm9yY2VYLFxuICAgICAgeTogZm9yY2VZXG4gICAgfTtcbiAgfVxuXG4gIC8vIHMgKz0gXCIuXFxuUmVzdWx0OiAoXCIgKyByZXMueCArIFwiLCBcIiArIHJlcy55ICsgXCIpXCI7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuXG4gIHJldHVybiByZXM7XG59O1xuXG4vKipcbiAqIEBicmllZiA6IEZ1bmN0aW9uIHVzZWQgZm9yIGtlZXBpbmcgdHJhY2sgb2YgY29tcG91bmQgbm9kZVxuICogICAgICAgICAgc2l6ZXMsIHNpbmNlIHRoZXkgc2hvdWxkIGJvdW5kIGFsbCB0aGVpciBzdWJub2Rlcy5cbiAqL1xudmFyIHVwZGF0ZUFuY2VzdHJ5Qm91bmRhcmllcyA9IGZ1bmN0aW9uIHVwZGF0ZUFuY2VzdHJ5Qm91bmRhcmllcyhub2RlLCBsYXlvdXRJbmZvKSB7XG4gIC8vIHZhciBzID0gXCJQcm9wYWdhdGluZyBuZXcgcG9zaXRpb24vc2l6ZSBvZiBub2RlIFwiICsgbm9kZS5pZDtcbiAgdmFyIHBhcmVudElkID0gbm9kZS5wYXJlbnRJZDtcbiAgaWYgKG51bGwgPT0gcGFyZW50SWQpIHtcbiAgICAvLyBJZiB0aGVyZSdzIG5vIHBhcmVudCwgd2UgYXJlIGRvbmVcbiAgICAvLyBzICs9IFwiLiBObyBwYXJlbnQgbm9kZS5cIjtcbiAgICAvLyBsb2dEZWJ1ZyhzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBHZXQgUGFyZW50IE5vZGVcbiAgdmFyIHAgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W3BhcmVudElkXV07XG4gIHZhciBmbGFnID0gZmFsc2U7XG5cbiAgLy8gTWF4WFxuICBpZiAobnVsbCA9PSBwLm1heFggfHwgbm9kZS5tYXhYICsgcC5wYWRSaWdodCA+IHAubWF4WCkge1xuICAgIHAubWF4WCA9IG5vZGUubWF4WCArIHAucGFkUmlnaHQ7XG4gICAgZmxhZyA9IHRydWU7XG4gICAgLy8gcyArPSBcIlxcbk5ldyBtYXhYIGZvciBwYXJlbnQgbm9kZSBcIiArIHAuaWQgKyBcIjogXCIgKyBwLm1heFg7XG4gIH1cblxuICAvLyBNaW5YXG4gIGlmIChudWxsID09IHAubWluWCB8fCBub2RlLm1pblggLSBwLnBhZExlZnQgPCBwLm1pblgpIHtcbiAgICBwLm1pblggPSBub2RlLm1pblggLSBwLnBhZExlZnQ7XG4gICAgZmxhZyA9IHRydWU7XG4gICAgLy8gcyArPSBcIlxcbk5ldyBtaW5YIGZvciBwYXJlbnQgbm9kZSBcIiArIHAuaWQgKyBcIjogXCIgKyBwLm1pblg7XG4gIH1cblxuICAvLyBNYXhZXG4gIGlmIChudWxsID09IHAubWF4WSB8fCBub2RlLm1heFkgKyBwLnBhZEJvdHRvbSA+IHAubWF4WSkge1xuICAgIHAubWF4WSA9IG5vZGUubWF4WSArIHAucGFkQm90dG9tO1xuICAgIGZsYWcgPSB0cnVlO1xuICAgIC8vIHMgKz0gXCJcXG5OZXcgbWF4WSBmb3IgcGFyZW50IG5vZGUgXCIgKyBwLmlkICsgXCI6IFwiICsgcC5tYXhZO1xuICB9XG5cbiAgLy8gTWluWVxuICBpZiAobnVsbCA9PSBwLm1pblkgfHwgbm9kZS5taW5ZIC0gcC5wYWRUb3AgPCBwLm1pblkpIHtcbiAgICBwLm1pblkgPSBub2RlLm1pblkgLSBwLnBhZFRvcDtcbiAgICBmbGFnID0gdHJ1ZTtcbiAgICAvLyBzICs9IFwiXFxuTmV3IG1pblkgZm9yIHBhcmVudCBub2RlIFwiICsgcC5pZCArIFwiOiBcIiArIHAubWluWTtcbiAgfVxuXG4gIC8vIElmIHVwZGF0ZWQgYm91bmRhcmllcywgcHJvcGFnYXRlIGNoYW5nZXMgdXB3YXJkXG4gIGlmIChmbGFnKSB7XG4gICAgLy8gbG9nRGVidWcocyk7XG4gICAgcmV0dXJuIHVwZGF0ZUFuY2VzdHJ5Qm91bmRhcmllcyhwLCBsYXlvdXRJbmZvKTtcbiAgfVxuXG4gIC8vIHMgKz0gXCIuIE5vIGNoYW5nZXMgaW4gYm91bmRhcmllcy9wb3NpdGlvbiBvZiBwYXJlbnQgbm9kZSBcIiArIHAuaWQ7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuICByZXR1cm47XG59O1xudmFyIHNlcGFyYXRlQ29tcG9uZW50cyA9IGZ1bmN0aW9uIHNlcGFyYXRlQ29tcG9uZW50cyhsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG4gIHZhciBub2RlcyA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXM7XG4gIHZhciBjb21wb25lbnRzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgIHZhciBjaWQgPSBub2RlLmNtcHRJZDtcbiAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50c1tjaWRdID0gY29tcG9uZW50c1tjaWRdIHx8IFtdO1xuICAgIGNvbXBvbmVudC5wdXNoKG5vZGUpO1xuICB9XG4gIHZhciB0b3RhbEEgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYyA9IGNvbXBvbmVudHNbaV07XG4gICAgaWYgKCFjKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgYy54MSA9IEluZmluaXR5O1xuICAgIGMueDIgPSAtSW5maW5pdHk7XG4gICAgYy55MSA9IEluZmluaXR5O1xuICAgIGMueTIgPSAtSW5maW5pdHk7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBjLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgbiA9IGNbal07XG4gICAgICBjLngxID0gTWF0aC5taW4oYy54MSwgbi5wb3NpdGlvblggLSBuLndpZHRoIC8gMik7XG4gICAgICBjLngyID0gTWF0aC5tYXgoYy54Miwgbi5wb3NpdGlvblggKyBuLndpZHRoIC8gMik7XG4gICAgICBjLnkxID0gTWF0aC5taW4oYy55MSwgbi5wb3NpdGlvblkgLSBuLmhlaWdodCAvIDIpO1xuICAgICAgYy55MiA9IE1hdGgubWF4KGMueTIsIG4ucG9zaXRpb25ZICsgbi5oZWlnaHQgLyAyKTtcbiAgICB9XG4gICAgYy53ID0gYy54MiAtIGMueDE7XG4gICAgYy5oID0gYy55MiAtIGMueTE7XG4gICAgdG90YWxBICs9IGMudyAqIGMuaDtcbiAgfVxuICBjb21wb25lbnRzLnNvcnQoZnVuY3Rpb24gKGMxLCBjMikge1xuICAgIHJldHVybiBjMi53ICogYzIuaCAtIGMxLncgKiBjMS5oO1xuICB9KTtcbiAgdmFyIHggPSAwO1xuICB2YXIgeSA9IDA7XG4gIHZhciB1c2VkVyA9IDA7XG4gIHZhciByb3dIID0gMDtcbiAgdmFyIG1heFJvd1cgPSBNYXRoLnNxcnQodG90YWxBKSAqIGxheW91dEluZm8uY2xpZW50V2lkdGggLyBsYXlvdXRJbmZvLmNsaWVudEhlaWdodDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGMgPSBjb21wb25lbnRzW2ldO1xuICAgIGlmICghYykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgYy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIG4gPSBjW2pdO1xuICAgICAgaWYgKCFuLmlzTG9ja2VkKSB7XG4gICAgICAgIG4ucG9zaXRpb25YICs9IHggLSBjLngxO1xuICAgICAgICBuLnBvc2l0aW9uWSArPSB5IC0gYy55MTtcbiAgICAgIH1cbiAgICB9XG4gICAgeCArPSBjLncgKyBvcHRpb25zLmNvbXBvbmVudFNwYWNpbmc7XG4gICAgdXNlZFcgKz0gYy53ICsgb3B0aW9ucy5jb21wb25lbnRTcGFjaW5nO1xuICAgIHJvd0ggPSBNYXRoLm1heChyb3dILCBjLmgpO1xuICAgIGlmICh1c2VkVyA+IG1heFJvd1cpIHtcbiAgICAgIHkgKz0gcm93SCArIG9wdGlvbnMuY29tcG9uZW50U3BhY2luZztcbiAgICAgIHggPSAwO1xuICAgICAgdXNlZFcgPSAwO1xuICAgICAgcm93SCA9IDA7XG4gICAgfVxuICB9XG59O1xuXG52YXIgZGVmYXVsdHMkMyA9IHtcbiAgZml0OiB0cnVlLFxuICAvLyB3aGV0aGVyIHRvIGZpdCB0aGUgdmlld3BvcnQgdG8gdGhlIGdyYXBoXG4gIHBhZGRpbmc6IDMwLFxuICAvLyBwYWRkaW5nIHVzZWQgb24gZml0XG4gIGJvdW5kaW5nQm94OiB1bmRlZmluZWQsXG4gIC8vIGNvbnN0cmFpbiBsYXlvdXQgYm91bmRzOyB7IHgxLCB5MSwgeDIsIHkyIH0gb3IgeyB4MSwgeTEsIHcsIGggfVxuICBhdm9pZE92ZXJsYXA6IHRydWUsXG4gIC8vIHByZXZlbnRzIG5vZGUgb3ZlcmxhcCwgbWF5IG92ZXJmbG93IGJvdW5kaW5nQm94IGlmIG5vdCBlbm91Z2ggc3BhY2VcbiAgYXZvaWRPdmVybGFwUGFkZGluZzogMTAsXG4gIC8vIGV4dHJhIHNwYWNpbmcgYXJvdW5kIG5vZGVzIHdoZW4gYXZvaWRPdmVybGFwOiB0cnVlXG4gIG5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsczogZmFsc2UsXG4gIC8vIEV4Y2x1ZGVzIHRoZSBsYWJlbCB3aGVuIGNhbGN1bGF0aW5nIG5vZGUgYm91bmRpbmcgYm94ZXMgZm9yIHRoZSBsYXlvdXQgYWxnb3JpdGhtXG4gIHNwYWNpbmdGYWN0b3I6IHVuZGVmaW5lZCxcbiAgLy8gQXBwbGllcyBhIG11bHRpcGxpY2F0aXZlIGZhY3RvciAoPjApIHRvIGV4cGFuZCBvciBjb21wcmVzcyB0aGUgb3ZlcmFsbCBhcmVhIHRoYXQgdGhlIG5vZGVzIHRha2UgdXBcbiAgY29uZGVuc2U6IGZhbHNlLFxuICAvLyB1c2VzIGFsbCBhdmFpbGFibGUgc3BhY2Ugb24gZmFsc2UsIHVzZXMgbWluaW1hbCBzcGFjZSBvbiB0cnVlXG4gIHJvd3M6IHVuZGVmaW5lZCxcbiAgLy8gZm9yY2UgbnVtIG9mIHJvd3MgaW4gdGhlIGdyaWRcbiAgY29sczogdW5kZWZpbmVkLFxuICAvLyBmb3JjZSBudW0gb2YgY29sdW1ucyBpbiB0aGUgZ3JpZFxuICBwb3NpdGlvbjogZnVuY3Rpb24gcG9zaXRpb24obm9kZSkge30sXG4gIC8vIHJldHVybnMgeyByb3csIGNvbCB9IGZvciBlbGVtZW50XG4gIHNvcnQ6IHVuZGVmaW5lZCxcbiAgLy8gYSBzb3J0aW5nIGZ1bmN0aW9uIHRvIG9yZGVyIHRoZSBub2RlczsgZS5nLiBmdW5jdGlvbihhLCBiKXsgcmV0dXJuIGEuZGF0YSgnd2VpZ2h0JykgLSBiLmRhdGEoJ3dlaWdodCcpIH1cbiAgYW5pbWF0ZTogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gdHJhbnNpdGlvbiB0aGUgbm9kZSBwb3NpdGlvbnNcbiAgYW5pbWF0aW9uRHVyYXRpb246IDUwMCxcbiAgLy8gZHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zIGlmIGVuYWJsZWRcbiAgYW5pbWF0aW9uRWFzaW5nOiB1bmRlZmluZWQsXG4gIC8vIGVhc2luZyBvZiBhbmltYXRpb24gaWYgZW5hYmxlZFxuICBhbmltYXRlRmlsdGVyOiBmdW5jdGlvbiBhbmltYXRlRmlsdGVyKG5vZGUsIGkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLy8gYSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgbm9kZSBzaG91bGQgYmUgYW5pbWF0ZWQuICBBbGwgbm9kZXMgYW5pbWF0ZWQgYnkgZGVmYXVsdCBvbiBhbmltYXRlIGVuYWJsZWQuICBOb24tYW5pbWF0ZWQgbm9kZXMgYXJlIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgbGF5b3V0IHN0YXJ0c1xuICByZWFkeTogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRyZWFkeVxuICBzdG9wOiB1bmRlZmluZWQsXG4gIC8vIGNhbGxiYWNrIG9uIGxheW91dHN0b3BcbiAgdHJhbnNmb3JtOiBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSwgcG9zaXRpb24pIHtcbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH0gLy8gdHJhbnNmb3JtIGEgZ2l2ZW4gbm9kZSBwb3NpdGlvbi4gVXNlZnVsIGZvciBjaGFuZ2luZyBmbG93IGRpcmVjdGlvbiBpbiBkaXNjcmV0ZSBsYXlvdXRzIFxufTtcblxuZnVuY3Rpb24gR3JpZExheW91dChvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMkMywgb3B0aW9ucyk7XG59XG5HcmlkTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBwYXJhbXMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBvcHRpb25zID0gcGFyYW1zO1xuICB2YXIgY3kgPSBwYXJhbXMuY3k7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCkubm90KCc6cGFyZW50Jyk7XG4gIGlmIChvcHRpb25zLnNvcnQpIHtcbiAgICBub2RlcyA9IG5vZGVzLnNvcnQob3B0aW9ucy5zb3J0KTtcbiAgfVxuICB2YXIgYmIgPSBtYWtlQm91bmRpbmdCb3gob3B0aW9ucy5ib3VuZGluZ0JveCA/IG9wdGlvbnMuYm91bmRpbmdCb3ggOiB7XG4gICAgeDE6IDAsXG4gICAgeTE6IDAsXG4gICAgdzogY3kud2lkdGgoKSxcbiAgICBoOiBjeS5oZWlnaHQoKVxuICB9KTtcbiAgaWYgKGJiLmggPT09IDAgfHwgYmIudyA9PT0gMCkge1xuICAgIGVsZXMubm9kZXMoKS5sYXlvdXRQb3NpdGlvbnModGhpcywgb3B0aW9ucywgZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogYmIueDEsXG4gICAgICAgIHk6IGJiLnkxXG4gICAgICB9O1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIHdpZHRoL2hlaWdodCAqIHNwbGl0c14yID0gY2VsbHMgd2hlcmUgc3BsaXRzIGlzIG51bWJlciBvZiB0aW1lcyB0byBzcGxpdCB3aWR0aFxuICAgIHZhciBjZWxscyA9IG5vZGVzLnNpemUoKTtcbiAgICB2YXIgc3BsaXRzID0gTWF0aC5zcXJ0KGNlbGxzICogYmIuaCAvIGJiLncpO1xuICAgIHZhciByb3dzID0gTWF0aC5yb3VuZChzcGxpdHMpO1xuICAgIHZhciBjb2xzID0gTWF0aC5yb3VuZChiYi53IC8gYmIuaCAqIHNwbGl0cyk7XG4gICAgdmFyIHNtYWxsID0gZnVuY3Rpb24gc21hbGwodmFsKSB7XG4gICAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKHJvd3MsIGNvbHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG1pbiA9IE1hdGgubWluKHJvd3MsIGNvbHMpO1xuICAgICAgICBpZiAobWluID09IHJvd3MpIHtcbiAgICAgICAgICByb3dzID0gdmFsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbHMgPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBsYXJnZSA9IGZ1bmN0aW9uIGxhcmdlKHZhbCkge1xuICAgICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChyb3dzLCBjb2xzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBtYXggPSBNYXRoLm1heChyb3dzLCBjb2xzKTtcbiAgICAgICAgaWYgKG1heCA9PSByb3dzKSB7XG4gICAgICAgICAgcm93cyA9IHZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2xzID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgb1Jvd3MgPSBvcHRpb25zLnJvd3M7XG4gICAgdmFyIG9Db2xzID0gb3B0aW9ucy5jb2xzICE9IG51bGwgPyBvcHRpb25zLmNvbHMgOiBvcHRpb25zLmNvbHVtbnM7XG5cbiAgICAvLyBpZiByb3dzIG9yIGNvbHVtbnMgd2VyZSBzZXQgaW4gb3B0aW9ucywgdXNlIHRob3NlIHZhbHVlc1xuICAgIGlmIChvUm93cyAhPSBudWxsICYmIG9Db2xzICE9IG51bGwpIHtcbiAgICAgIHJvd3MgPSBvUm93cztcbiAgICAgIGNvbHMgPSBvQ29scztcbiAgICB9IGVsc2UgaWYgKG9Sb3dzICE9IG51bGwgJiYgb0NvbHMgPT0gbnVsbCkge1xuICAgICAgcm93cyA9IG9Sb3dzO1xuICAgICAgY29scyA9IE1hdGguY2VpbChjZWxscyAvIHJvd3MpO1xuICAgIH0gZWxzZSBpZiAob1Jvd3MgPT0gbnVsbCAmJiBvQ29scyAhPSBudWxsKSB7XG4gICAgICBjb2xzID0gb0NvbHM7XG4gICAgICByb3dzID0gTWF0aC5jZWlsKGNlbGxzIC8gY29scyk7XG4gICAgfVxuXG4gICAgLy8gb3RoZXJ3aXNlIHVzZSB0aGUgYXV0b21hdGljIHZhbHVlcyBhbmQgYWRqdXN0IGFjY29yZGluZ2x5XG5cbiAgICAvLyBpZiByb3VuZGluZyB3YXMgdXAsIHNlZSBpZiB3ZSBjYW4gcmVkdWNlIHJvd3Mgb3IgY29sdW1uc1xuICAgIGVsc2UgaWYgKGNvbHMgKiByb3dzID4gY2VsbHMpIHtcbiAgICAgIHZhciBzbSA9IHNtYWxsKCk7XG4gICAgICB2YXIgbGcgPSBsYXJnZSgpO1xuXG4gICAgICAvLyByZWR1Y2luZyB0aGUgc21hbGwgc2lkZSB0YWtlcyBhd2F5IHRoZSBtb3N0IGNlbGxzLCBzbyB0cnkgaXQgZmlyc3RcbiAgICAgIGlmICgoc20gLSAxKSAqIGxnID49IGNlbGxzKSB7XG4gICAgICAgIHNtYWxsKHNtIC0gMSk7XG4gICAgICB9IGVsc2UgaWYgKChsZyAtIDEpICogc20gPj0gY2VsbHMpIHtcbiAgICAgICAgbGFyZ2UobGcgLSAxKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgcm91bmRpbmcgd2FzIHRvbyBsb3csIGFkZCByb3dzIG9yIGNvbHVtbnNcbiAgICAgIHdoaWxlIChjb2xzICogcm93cyA8IGNlbGxzKSB7XG4gICAgICAgIHZhciBfc20gPSBzbWFsbCgpO1xuICAgICAgICB2YXIgX2xnID0gbGFyZ2UoKTtcblxuICAgICAgICAvLyB0cnkgdG8gYWRkIHRvIGxhcmdlciBzaWRlIGZpcnN0IChhZGRzIGxlc3MgaW4gbXVsdGlwbGljYXRpb24pXG4gICAgICAgIGlmICgoX2xnICsgMSkgKiBfc20gPj0gY2VsbHMpIHtcbiAgICAgICAgICBsYXJnZShfbGcgKyAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzbWFsbChfc20gKyAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB2YXIgY2VsbFdpZHRoID0gYmIudyAvIGNvbHM7XG4gICAgdmFyIGNlbGxIZWlnaHQgPSBiYi5oIC8gcm93cztcbiAgICBpZiAob3B0aW9ucy5jb25kZW5zZSkge1xuICAgICAgY2VsbFdpZHRoID0gMDtcbiAgICAgIGNlbGxIZWlnaHQgPSAwO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5hdm9pZE92ZXJsYXApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgdmFyIHBvcyA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb247XG4gICAgICAgIGlmIChwb3MueCA9PSBudWxsIHx8IHBvcy55ID09IG51bGwpIHtcbiAgICAgICAgICAvLyBmb3IgYmJcbiAgICAgICAgICBwb3MueCA9IDA7XG4gICAgICAgICAgcG9zLnkgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBuYmIgPSBub2RlLmxheW91dERpbWVuc2lvbnMob3B0aW9ucyk7XG4gICAgICAgIHZhciBwID0gb3B0aW9ucy5hdm9pZE92ZXJsYXBQYWRkaW5nO1xuICAgICAgICB2YXIgdyA9IG5iYi53ICsgcDtcbiAgICAgICAgdmFyIGggPSBuYmIuaCArIHA7XG4gICAgICAgIGNlbGxXaWR0aCA9IE1hdGgubWF4KGNlbGxXaWR0aCwgdyk7XG4gICAgICAgIGNlbGxIZWlnaHQgPSBNYXRoLm1heChjZWxsSGVpZ2h0LCBoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGNlbGxVc2VkID0ge307IC8vIGUuZy4gJ2MtMC0yJyA9PiB0cnVlXG5cbiAgICB2YXIgdXNlZCA9IGZ1bmN0aW9uIHVzZWQocm93LCBjb2wpIHtcbiAgICAgIHJldHVybiBjZWxsVXNlZFsnYy0nICsgcm93ICsgJy0nICsgY29sXSA/IHRydWUgOiBmYWxzZTtcbiAgICB9O1xuICAgIHZhciB1c2UgPSBmdW5jdGlvbiB1c2Uocm93LCBjb2wpIHtcbiAgICAgIGNlbGxVc2VkWydjLScgKyByb3cgKyAnLScgKyBjb2xdID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLy8gdG8ga2VlcCB0cmFjayBvZiBjdXJyZW50IGNlbGwgcG9zaXRpb25cbiAgICB2YXIgcm93ID0gMDtcbiAgICB2YXIgY29sID0gMDtcbiAgICB2YXIgbW92ZVRvTmV4dENlbGwgPSBmdW5jdGlvbiBtb3ZlVG9OZXh0Q2VsbCgpIHtcbiAgICAgIGNvbCsrO1xuICAgICAgaWYgKGNvbCA+PSBjb2xzKSB7XG4gICAgICAgIGNvbCA9IDA7XG4gICAgICAgIHJvdysrO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBnZXQgYSBjYWNoZSBvZiBhbGwgdGhlIG1hbnVhbCBwb3NpdGlvbnNcbiAgICB2YXIgaWQybWFuUG9zID0ge307XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5vZGVzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9ub2RlID0gbm9kZXNbX2ldO1xuICAgICAgdmFyIHJjUG9zID0gb3B0aW9ucy5wb3NpdGlvbihfbm9kZSk7XG4gICAgICBpZiAocmNQb3MgJiYgKHJjUG9zLnJvdyAhPT0gdW5kZWZpbmVkIHx8IHJjUG9zLmNvbCAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAvLyBtdXN0IGhhdmUgYXQgbGVhc3Qgcm93IG9yIGNvbCBkZWYnZFxuICAgICAgICB2YXIgX3BvcyA9IHtcbiAgICAgICAgICByb3c6IHJjUG9zLnJvdyxcbiAgICAgICAgICBjb2w6IHJjUG9zLmNvbFxuICAgICAgICB9O1xuICAgICAgICBpZiAoX3Bvcy5jb2wgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIGZpbmQgdW51c2VkIGNvbFxuICAgICAgICAgIF9wb3MuY29sID0gMDtcbiAgICAgICAgICB3aGlsZSAodXNlZChfcG9zLnJvdywgX3Bvcy5jb2wpKSB7XG4gICAgICAgICAgICBfcG9zLmNvbCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChfcG9zLnJvdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gZmluZCB1bnVzZWQgcm93XG4gICAgICAgICAgX3Bvcy5yb3cgPSAwO1xuICAgICAgICAgIHdoaWxlICh1c2VkKF9wb3Mucm93LCBfcG9zLmNvbCkpIHtcbiAgICAgICAgICAgIF9wb3Mucm93Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlkMm1hblBvc1tfbm9kZS5pZCgpXSA9IF9wb3M7XG4gICAgICAgIHVzZShfcG9zLnJvdywgX3Bvcy5jb2wpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgZ2V0UG9zID0gZnVuY3Rpb24gZ2V0UG9zKGVsZW1lbnQsIGkpIHtcbiAgICAgIHZhciB4LCB5O1xuICAgICAgaWYgKGVsZW1lbnQubG9ja2VkKCkgfHwgZWxlbWVudC5pc1BhcmVudCgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gc2VlIGlmIHdlIGhhdmUgYSBtYW51YWwgcG9zaXRpb24gc2V0XG4gICAgICB2YXIgcmNQb3MgPSBpZDJtYW5Qb3NbZWxlbWVudC5pZCgpXTtcbiAgICAgIGlmIChyY1Bvcykge1xuICAgICAgICB4ID0gcmNQb3MuY29sICogY2VsbFdpZHRoICsgY2VsbFdpZHRoIC8gMiArIGJiLngxO1xuICAgICAgICB5ID0gcmNQb3Mucm93ICogY2VsbEhlaWdodCArIGNlbGxIZWlnaHQgLyAyICsgYmIueTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBvdGhlcndpc2Ugc2V0IGF1dG9tYXRpY2FsbHlcblxuICAgICAgICB3aGlsZSAodXNlZChyb3csIGNvbCkpIHtcbiAgICAgICAgICBtb3ZlVG9OZXh0Q2VsbCgpO1xuICAgICAgICB9XG4gICAgICAgIHggPSBjb2wgKiBjZWxsV2lkdGggKyBjZWxsV2lkdGggLyAyICsgYmIueDE7XG4gICAgICAgIHkgPSByb3cgKiBjZWxsSGVpZ2h0ICsgY2VsbEhlaWdodCAvIDIgKyBiYi55MTtcbiAgICAgICAgdXNlKHJvdywgY29sKTtcbiAgICAgICAgbW92ZVRvTmV4dENlbGwoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHlcbiAgICAgIH07XG4gICAgfTtcbiAgICBub2Rlcy5sYXlvdXRQb3NpdGlvbnModGhpcywgb3B0aW9ucywgZ2V0UG9zKTtcbiAgfVxuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbi8vIGRlZmF1bHQgbGF5b3V0IG9wdGlvbnNcbnZhciBkZWZhdWx0cyQyID0ge1xuICByZWFkeTogZnVuY3Rpb24gcmVhZHkoKSB7fSxcbiAgLy8gb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHt9IC8vIG9uIGxheW91dHN0b3Bcbn07XG5cbi8vIGNvbnN0cnVjdG9yXG4vLyBvcHRpb25zIDogb2JqZWN0IGNvbnRhaW5pbmcgbGF5b3V0IG9wdGlvbnNcbmZ1bmN0aW9uIE51bGxMYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRzJDIsIG9wdGlvbnMpO1xufVxuXG4vLyBydW5zIHRoZSBsYXlvdXRcbk51bGxMYXlvdXQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzOyAvLyBlbGVtZW50cyB0byBjb25zaWRlciBpbiB0aGUgbGF5b3V0XG4gIHZhciBsYXlvdXQgPSB0aGlzO1xuXG4gIC8vIGN5IGlzIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVkIGZvciB1cyBpbiB0aGUgY29uc3RydWN0b3JcbiAgLy8gKGRpc2FibGUgZXNsaW50IGZvciBuZXh0IGxpbmUgYXMgdGhpcyBzZXJ2ZXMgYXMgZXhhbXBsZSBsYXlvdXQgY29kZSB0byBleHRlcm5hbCBkZXZlbG9wZXJzKVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgb3B0aW9ucy5jeTtcbiAgbGF5b3V0LmVtaXQoJ2xheW91dHN0YXJ0Jyk7XG5cbiAgLy8gcHV0cyBhbGwgbm9kZXMgYXQgKDAsIDApXG4gIC8vIG4uYi4gbW9zdCBsYXlvdXRzIHdvdWxkIHVzZSBsYXlvdXRQb3NpdGlvbnMoKSwgaW5zdGVhZCBvZiBwb3NpdGlvbnMoKSBhbmQgbWFudWFsIGV2ZW50c1xuICBlbGVzLm5vZGVzKCkucG9zaXRpb25zKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuICB9KTtcblxuICAvLyB0cmlnZ2VyIGxheW91dHJlYWR5IHdoZW4gZWFjaCBub2RlIGhhcyBoYWQgaXRzIHBvc2l0aW9uIHNldCBhdCBsZWFzdCBvbmNlXG4gIGxheW91dC5vbmUoJ2xheW91dHJlYWR5Jywgb3B0aW9ucy5yZWFkeSk7XG4gIGxheW91dC5lbWl0KCdsYXlvdXRyZWFkeScpO1xuXG4gIC8vIHRyaWdnZXIgbGF5b3V0c3RvcCB3aGVuIHRoZSBsYXlvdXQgc3RvcHMgKGUuZy4gZmluaXNoZXMpXG4gIGxheW91dC5vbmUoJ2xheW91dHN0b3AnLCBvcHRpb25zLnN0b3ApO1xuICBsYXlvdXQuZW1pdCgnbGF5b3V0c3RvcCcpO1xuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbi8vIGNhbGxlZCBvbiBjb250aW51b3VzIGxheW91dHMgdG8gc3RvcCB0aGVtIGJlZm9yZSB0aGV5IGZpbmlzaFxuTnVsbExheW91dC5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG52YXIgZGVmYXVsdHMkMSA9IHtcbiAgcG9zaXRpb25zOiB1bmRlZmluZWQsXG4gIC8vIG1hcCBvZiAobm9kZSBpZCkgPT4gKHBvc2l0aW9uIG9iaik7IG9yIGZ1bmN0aW9uKG5vZGUpeyByZXR1cm4gc29tUG9zOyB9XG4gIHpvb206IHVuZGVmaW5lZCxcbiAgLy8gdGhlIHpvb20gbGV2ZWwgdG8gc2V0IChwcm9iIHdhbnQgZml0ID0gZmFsc2UgaWYgc2V0KVxuICBwYW46IHVuZGVmaW5lZCxcbiAgLy8gdGhlIHBhbiBsZXZlbCB0byBzZXQgKHByb2Igd2FudCBmaXQgPSBmYWxzZSBpZiBzZXQpXG4gIGZpdDogdHJ1ZSxcbiAgLy8gd2hldGhlciB0byBmaXQgdG8gdmlld3BvcnRcbiAgcGFkZGluZzogMzAsXG4gIC8vIHBhZGRpbmcgb24gZml0XG4gIHNwYWNpbmdGYWN0b3I6IHVuZGVmaW5lZCxcbiAgLy8gQXBwbGllcyBhIG11bHRpcGxpY2F0aXZlIGZhY3RvciAoPjApIHRvIGV4cGFuZCBvciBjb21wcmVzcyB0aGUgb3ZlcmFsbCBhcmVhIHRoYXQgdGhlIG5vZGVzIHRha2UgdXBcbiAgYW5pbWF0ZTogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gdHJhbnNpdGlvbiB0aGUgbm9kZSBwb3NpdGlvbnNcbiAgYW5pbWF0aW9uRHVyYXRpb246IDUwMCxcbiAgLy8gZHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zIGlmIGVuYWJsZWRcbiAgYW5pbWF0aW9uRWFzaW5nOiB1bmRlZmluZWQsXG4gIC8vIGVhc2luZyBvZiBhbmltYXRpb24gaWYgZW5hYmxlZFxuICBhbmltYXRlRmlsdGVyOiBmdW5jdGlvbiBhbmltYXRlRmlsdGVyKG5vZGUsIGkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLy8gYSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgbm9kZSBzaG91bGQgYmUgYW5pbWF0ZWQuICBBbGwgbm9kZXMgYW5pbWF0ZWQgYnkgZGVmYXVsdCBvbiBhbmltYXRlIGVuYWJsZWQuICBOb24tYW5pbWF0ZWQgbm9kZXMgYXJlIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgbGF5b3V0IHN0YXJ0c1xuICByZWFkeTogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRyZWFkeVxuICBzdG9wOiB1bmRlZmluZWQsXG4gIC8vIGNhbGxiYWNrIG9uIGxheW91dHN0b3BcbiAgdHJhbnNmb3JtOiBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSwgcG9zaXRpb24pIHtcbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH0gLy8gdHJhbnNmb3JtIGEgZ2l2ZW4gbm9kZSBwb3NpdGlvbi4gVXNlZnVsIGZvciBjaGFuZ2luZyBmbG93IGRpcmVjdGlvbiBpbiBkaXNjcmV0ZSBsYXlvdXRzXG59O1xuXG5mdW5jdGlvbiBQcmVzZXRMYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRzJDEsIG9wdGlvbnMpO1xufVxuUHJlc2V0TGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpO1xuICB2YXIgcG9zSXNGbiA9IGZuJDYob3B0aW9ucy5wb3NpdGlvbnMpO1xuICBmdW5jdGlvbiBnZXRQb3NpdGlvbihub2RlKSB7XG4gICAgaWYgKG9wdGlvbnMucG9zaXRpb25zID09IG51bGwpIHtcbiAgICAgIHJldHVybiBjb3B5UG9zaXRpb24obm9kZS5wb3NpdGlvbigpKTtcbiAgICB9XG4gICAgaWYgKHBvc0lzRm4pIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnBvc2l0aW9ucyhub2RlKTtcbiAgICB9XG4gICAgdmFyIHBvcyA9IG9wdGlvbnMucG9zaXRpb25zW25vZGUuX3ByaXZhdGUuZGF0YS5pZF07XG4gICAgaWYgKHBvcyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHBvcztcbiAgfVxuICBub2Rlcy5sYXlvdXRQb3NpdGlvbnModGhpcywgb3B0aW9ucywgZnVuY3Rpb24gKG5vZGUsIGkpIHtcbiAgICB2YXIgcG9zaXRpb24gPSBnZXRQb3NpdGlvbihub2RlKTtcbiAgICBpZiAobm9kZS5sb2NrZWQoKSB8fCBwb3NpdGlvbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfSk7XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxudmFyIGRlZmF1bHRzID0ge1xuICBmaXQ6IHRydWUsXG4gIC8vIHdoZXRoZXIgdG8gZml0IHRvIHZpZXdwb3J0XG4gIHBhZGRpbmc6IDMwLFxuICAvLyBmaXQgcGFkZGluZ1xuICBib3VuZGluZ0JveDogdW5kZWZpbmVkLFxuICAvLyBjb25zdHJhaW4gbGF5b3V0IGJvdW5kczsgeyB4MSwgeTEsIHgyLCB5MiB9IG9yIHsgeDEsIHkxLCB3LCBoIH1cbiAgYW5pbWF0ZTogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gdHJhbnNpdGlvbiB0aGUgbm9kZSBwb3NpdGlvbnNcbiAgYW5pbWF0aW9uRHVyYXRpb246IDUwMCxcbiAgLy8gZHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zIGlmIGVuYWJsZWRcbiAgYW5pbWF0aW9uRWFzaW5nOiB1bmRlZmluZWQsXG4gIC8vIGVhc2luZyBvZiBhbmltYXRpb24gaWYgZW5hYmxlZFxuICBhbmltYXRlRmlsdGVyOiBmdW5jdGlvbiBhbmltYXRlRmlsdGVyKG5vZGUsIGkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLy8gYSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgbm9kZSBzaG91bGQgYmUgYW5pbWF0ZWQuICBBbGwgbm9kZXMgYW5pbWF0ZWQgYnkgZGVmYXVsdCBvbiBhbmltYXRlIGVuYWJsZWQuICBOb24tYW5pbWF0ZWQgbm9kZXMgYXJlIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgbGF5b3V0IHN0YXJ0c1xuICByZWFkeTogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRyZWFkeVxuICBzdG9wOiB1bmRlZmluZWQsXG4gIC8vIGNhbGxiYWNrIG9uIGxheW91dHN0b3BcbiAgdHJhbnNmb3JtOiBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSwgcG9zaXRpb24pIHtcbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH0gLy8gdHJhbnNmb3JtIGEgZ2l2ZW4gbm9kZSBwb3NpdGlvbi4gVXNlZnVsIGZvciBjaGFuZ2luZyBmbG93IGRpcmVjdGlvbiBpbiBkaXNjcmV0ZSBsYXlvdXRzIFxufTtcblxuZnVuY3Rpb24gUmFuZG9tTGF5b3V0KG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgb3B0aW9ucyk7XG59XG5SYW5kb21MYXlvdXQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBjeSA9IG9wdGlvbnMuY3k7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuICB2YXIgYmIgPSBtYWtlQm91bmRpbmdCb3gob3B0aW9ucy5ib3VuZGluZ0JveCA/IG9wdGlvbnMuYm91bmRpbmdCb3ggOiB7XG4gICAgeDE6IDAsXG4gICAgeTE6IDAsXG4gICAgdzogY3kud2lkdGgoKSxcbiAgICBoOiBjeS5oZWlnaHQoKVxuICB9KTtcbiAgdmFyIGdldFBvcyA9IGZ1bmN0aW9uIGdldFBvcyhub2RlLCBpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGJiLngxICsgTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogYmIudyksXG4gICAgICB5OiBiYi55MSArIE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIGJiLmgpXG4gICAgfTtcbiAgfTtcbiAgZWxlcy5ub2RlcygpLmxheW91dFBvc2l0aW9ucyh0aGlzLCBvcHRpb25zLCBnZXRQb3MpO1xuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbnZhciBsYXlvdXQgPSBbe1xuICBuYW1lOiAnYnJlYWR0aGZpcnN0JyxcbiAgaW1wbDogQnJlYWR0aEZpcnN0TGF5b3V0XG59LCB7XG4gIG5hbWU6ICdjaXJjbGUnLFxuICBpbXBsOiBDaXJjbGVMYXlvdXRcbn0sIHtcbiAgbmFtZTogJ2NvbmNlbnRyaWMnLFxuICBpbXBsOiBDb25jZW50cmljTGF5b3V0XG59LCB7XG4gIG5hbWU6ICdjb3NlJyxcbiAgaW1wbDogQ29zZUxheW91dFxufSwge1xuICBuYW1lOiAnZ3JpZCcsXG4gIGltcGw6IEdyaWRMYXlvdXRcbn0sIHtcbiAgbmFtZTogJ251bGwnLFxuICBpbXBsOiBOdWxsTGF5b3V0XG59LCB7XG4gIG5hbWU6ICdwcmVzZXQnLFxuICBpbXBsOiBQcmVzZXRMYXlvdXRcbn0sIHtcbiAgbmFtZTogJ3JhbmRvbScsXG4gIGltcGw6IFJhbmRvbUxheW91dFxufV07XG5cbmZ1bmN0aW9uIE51bGxSZW5kZXJlcihvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIHRoaXMubm90aWZpY2F0aW9ucyA9IDA7IC8vIGZvciB0ZXN0aW5nXG59XG5cbnZhciBub29wID0gZnVuY3Rpb24gbm9vcCgpIHt9O1xudmFyIHRocm93SW1nRXJyID0gZnVuY3Rpb24gdGhyb3dJbWdFcnIoKSB7XG4gIHRocm93IG5ldyBFcnJvcignQSBoZWFkbGVzcyBpbnN0YW5jZSBjYW4gbm90IHJlbmRlciBpbWFnZXMnKTtcbn07XG5OdWxsUmVuZGVyZXIucHJvdG90eXBlID0ge1xuICByZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGU6IG5vb3AsXG4gIG5vdGlmeTogZnVuY3Rpb24gbm90aWZ5KCkge1xuICAgIHRoaXMubm90aWZpY2F0aW9ucysrO1xuICB9LFxuICBpbml0OiBub29wLFxuICBpc0hlYWRsZXNzOiBmdW5jdGlvbiBpc0hlYWRsZXNzKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBwbmc6IHRocm93SW1nRXJyLFxuICBqcGc6IHRocm93SW1nRXJyXG59O1xuXG52YXIgQlJwJGYgPSB7fTtcbkJScCRmLmFycm93U2hhcGVXaWR0aCA9IDAuMztcbkJScCRmLnJlZ2lzdGVyQXJyb3dTaGFwZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBhcnJvd1NoYXBlcyA9IHRoaXMuYXJyb3dTaGFwZXMgPSB7fTtcbiAgdmFyIHJlbmRlcmVyID0gdGhpcztcblxuICAvLyBDb250cmFjdCBmb3IgYXJyb3cgc2hhcGVzOlxuICAvLyAwLCAwIGlzIGFycm93IHRpcFxuICAvLyAoMCwgMSkgaXMgZGlyZWN0aW9uIHRvd2FyZHMgbm9kZVxuICAvLyAoMSwgMCkgaXMgcmlnaHRcbiAgLy9cbiAgLy8gZnVuY3Rpb25hbCBhcGk6XG4gIC8vIGNvbGxpZGU6IGNoZWNrIHgsIHkgaW4gc2hhcGVcbiAgLy8gcm91Z2hDb2xsaWRlOiBjYWxsZWQgYmVmb3JlIGNvbGxpZGUsIG5vIGZhbHNlIG5lZ2F0aXZlc1xuICAvLyBkcmF3OiBkcmF3XG4gIC8vIHNwYWNpbmc6IGRpc3QoYXJyb3dUaXAsIG5vZGVCb3VuZGFyeSlcbiAgLy8gZ2FwOiBkaXN0KGVkZ2VUaXAsIG5vZGVCb3VuZGFyeSksIGVkZ2VUaXAgbWF5ICE9IGFycm93VGlwXG5cbiAgdmFyIGJiQ29sbGlkZSA9IGZ1bmN0aW9uIGJiQ29sbGlkZSh4LCB5LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCwgcGFkZGluZykge1xuICAgIHZhciB4MSA9IHRyYW5zbGF0aW9uLnggLSBzaXplIC8gMiAtIHBhZGRpbmc7XG4gICAgdmFyIHgyID0gdHJhbnNsYXRpb24ueCArIHNpemUgLyAyICsgcGFkZGluZztcbiAgICB2YXIgeTEgPSB0cmFuc2xhdGlvbi55IC0gc2l6ZSAvIDIgLSBwYWRkaW5nO1xuICAgIHZhciB5MiA9IHRyYW5zbGF0aW9uLnkgKyBzaXplIC8gMiArIHBhZGRpbmc7XG4gICAgdmFyIGluc2lkZSA9IHgxIDw9IHggJiYgeCA8PSB4MiAmJiB5MSA8PSB5ICYmIHkgPD0geTI7XG4gICAgcmV0dXJuIGluc2lkZTtcbiAgfTtcbiAgdmFyIHRyYW5zZm9ybSA9IGZ1bmN0aW9uIHRyYW5zZm9ybSh4LCB5LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pIHtcbiAgICB2YXIgeFJvdGF0ZWQgPSB4ICogTWF0aC5jb3MoYW5nbGUpIC0geSAqIE1hdGguc2luKGFuZ2xlKTtcbiAgICB2YXIgeVJvdGF0ZWQgPSB4ICogTWF0aC5zaW4oYW5nbGUpICsgeSAqIE1hdGguY29zKGFuZ2xlKTtcbiAgICB2YXIgeFNjYWxlZCA9IHhSb3RhdGVkICogc2l6ZTtcbiAgICB2YXIgeVNjYWxlZCA9IHlSb3RhdGVkICogc2l6ZTtcbiAgICB2YXIgeFRyYW5zbGF0ZWQgPSB4U2NhbGVkICsgdHJhbnNsYXRpb24ueDtcbiAgICB2YXIgeVRyYW5zbGF0ZWQgPSB5U2NhbGVkICsgdHJhbnNsYXRpb24ueTtcbiAgICByZXR1cm4ge1xuICAgICAgeDogeFRyYW5zbGF0ZWQsXG4gICAgICB5OiB5VHJhbnNsYXRlZFxuICAgIH07XG4gIH07XG4gIHZhciB0cmFuc2Zvcm1Qb2ludHMgPSBmdW5jdGlvbiB0cmFuc2Zvcm1Qb2ludHMocHRzLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pIHtcbiAgICB2YXIgcmV0UHRzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwdHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIHZhciB4ID0gcHRzW2ldO1xuICAgICAgdmFyIHkgPSBwdHNbaSArIDFdO1xuICAgICAgcmV0UHRzLnB1c2godHJhbnNmb3JtKHgsIHksIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbikpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0UHRzO1xuICB9O1xuICB2YXIgcG9pbnRzVG9BcnIgPSBmdW5jdGlvbiBwb2ludHNUb0FycihwdHMpIHtcbiAgICB2YXIgcmV0ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwID0gcHRzW2ldO1xuICAgICAgcmV0LnB1c2gocC54LCBwLnkpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9O1xuICB2YXIgc3RhbmRhcmRHYXAgPSBmdW5jdGlvbiBzdGFuZGFyZEdhcChlZGdlKSB7XG4gICAgcmV0dXJuIGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWUgKiBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS5wZlZhbHVlICogMjtcbiAgfTtcbiAgdmFyIGRlZmluZUFycm93U2hhcGUgPSBmdW5jdGlvbiBkZWZpbmVBcnJvd1NoYXBlKG5hbWUsIGRlZm4pIHtcbiAgICBpZiAoc3RyaW5nKGRlZm4pKSB7XG4gICAgICBkZWZuID0gYXJyb3dTaGFwZXNbZGVmbl07XG4gICAgfVxuICAgIGFycm93U2hhcGVzW25hbWVdID0gZXh0ZW5kKHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICBwb2ludHM6IFstMC4xNSwgLTAuMywgMC4xNSwgLTAuMywgMC4xNSwgMC4zLCAtMC4xNSwgMC4zXSxcbiAgICAgIGNvbGxpZGU6IGZ1bmN0aW9uIGNvbGxpZGUoeCwgeSwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBwYWRkaW5nKSB7XG4gICAgICAgIHZhciBwb2ludHMgPSBwb2ludHNUb0Fycih0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHMsIHNpemUgKyAyICogcGFkZGluZywgYW5nbGUsIHRyYW5zbGF0aW9uKSk7XG4gICAgICAgIHZhciBpbnNpZGUgPSBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgcG9pbnRzKTtcbiAgICAgICAgcmV0dXJuIGluc2lkZTtcbiAgICAgIH0sXG4gICAgICByb3VnaENvbGxpZGU6IGJiQ29sbGlkZSxcbiAgICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uKSB7XG4gICAgICAgIHZhciBwb2ludHMgPSB0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHMsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICAgIHJlbmRlcmVyLmFycm93U2hhcGVJbXBsKCdwb2x5Z29uJykoY29udGV4dCwgcG9pbnRzKTtcbiAgICAgIH0sXG4gICAgICBzcGFjaW5nOiBmdW5jdGlvbiBzcGFjaW5nKGVkZ2UpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9LFxuICAgICAgZ2FwOiBzdGFuZGFyZEdhcFxuICAgIH0sIGRlZm4pO1xuICB9O1xuICBkZWZpbmVBcnJvd1NoYXBlKCdub25lJywge1xuICAgIGNvbGxpZGU6IGZhbHNpZnksXG4gICAgcm91Z2hDb2xsaWRlOiBmYWxzaWZ5LFxuICAgIGRyYXc6IG5vb3AkMSxcbiAgICBzcGFjaW5nOiB6ZXJvaWZ5LFxuICAgIGdhcDogemVyb2lmeVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgndHJpYW5nbGUnLCB7XG4gICAgcG9pbnRzOiBbLTAuMTUsIC0wLjMsIDAsIDAsIDAuMTUsIC0wLjNdXG4gIH0pO1xuICBkZWZpbmVBcnJvd1NoYXBlKCdhcnJvdycsICd0cmlhbmdsZScpO1xuICBkZWZpbmVBcnJvd1NoYXBlKCd0cmlhbmdsZS1iYWNrY3VydmUnLCB7XG4gICAgcG9pbnRzOiBhcnJvd1NoYXBlc1sndHJpYW5nbGUnXS5wb2ludHMsXG4gICAgY29udHJvbFBvaW50OiBbMCwgLTAuMTVdLFxuICAgIHJvdWdoQ29sbGlkZTogYmJDb2xsaWRlLFxuICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBlZGdlV2lkdGgpIHtcbiAgICAgIHZhciBwdHNUcmFucyA9IHRyYW5zZm9ybVBvaW50cyh0aGlzLnBvaW50cywgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uKTtcbiAgICAgIHZhciBjdHJsUHQgPSB0aGlzLmNvbnRyb2xQb2ludDtcbiAgICAgIHZhciBjdHJsUHRUcmFucyA9IHRyYW5zZm9ybShjdHJsUHRbMF0sIGN0cmxQdFsxXSwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uKTtcbiAgICAgIHJlbmRlcmVyLmFycm93U2hhcGVJbXBsKHRoaXMubmFtZSkoY29udGV4dCwgcHRzVHJhbnMsIGN0cmxQdFRyYW5zKTtcbiAgICB9LFxuICAgIGdhcDogZnVuY3Rpb24gZ2FwKGVkZ2UpIHtcbiAgICAgIHJldHVybiBzdGFuZGFyZEdhcChlZGdlKSAqIDAuODtcbiAgICB9XG4gIH0pO1xuICBkZWZpbmVBcnJvd1NoYXBlKCd0cmlhbmdsZS10ZWUnLCB7XG4gICAgcG9pbnRzOiBbMCwgMCwgMC4xNSwgLTAuMywgLTAuMTUsIC0wLjMsIDAsIDBdLFxuICAgIHBvaW50c1RlZTogWy0wLjE1LCAtMC40LCAtMC4xNSwgLTAuNSwgMC4xNSwgLTAuNSwgMC4xNSwgLTAuNF0sXG4gICAgY29sbGlkZTogZnVuY3Rpb24gY29sbGlkZSh4LCB5LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCwgcGFkZGluZykge1xuICAgICAgdmFyIHRyaVB0cyA9IHBvaW50c1RvQXJyKHRyYW5zZm9ybVBvaW50cyh0aGlzLnBvaW50cywgc2l6ZSArIDIgKiBwYWRkaW5nLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICAgIHZhciB0ZWVQdHMgPSBwb2ludHNUb0Fycih0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHNUZWUsIHNpemUgKyAyICogcGFkZGluZywgYW5nbGUsIHRyYW5zbGF0aW9uKSk7XG4gICAgICB2YXIgaW5zaWRlID0gcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIHRyaVB0cykgfHwgcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIHRlZVB0cyk7XG4gICAgICByZXR1cm4gaW5zaWRlO1xuICAgIH0sXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCkge1xuICAgICAgdmFyIHRyaVB0cyA9IHRyYW5zZm9ybVBvaW50cyh0aGlzLnBvaW50cywgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uKTtcbiAgICAgIHZhciB0ZWVQdHMgPSB0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHNUZWUsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICByZW5kZXJlci5hcnJvd1NoYXBlSW1wbCh0aGlzLm5hbWUpKGNvbnRleHQsIHRyaVB0cywgdGVlUHRzKTtcbiAgICB9XG4gIH0pO1xuICBkZWZpbmVBcnJvd1NoYXBlKCdjaXJjbGUtdHJpYW5nbGUnLCB7XG4gICAgcmFkaXVzOiAwLjE1LFxuICAgIHBvaW50c1RyOiBbMCwgLTAuMTUsIDAuMTUsIC0wLjQ1LCAtMC4xNSwgLTAuNDUsIDAsIC0wLjE1XSxcbiAgICBjb2xsaWRlOiBmdW5jdGlvbiBjb2xsaWRlKHgsIHksIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoLCBwYWRkaW5nKSB7XG4gICAgICB2YXIgdCA9IHRyYW5zbGF0aW9uO1xuICAgICAgdmFyIGNpcmNsZUluc2lkZSA9IE1hdGgucG93KHQueCAtIHgsIDIpICsgTWF0aC5wb3codC55IC0geSwgMikgPD0gTWF0aC5wb3coKHNpemUgKyAyICogcGFkZGluZykgKiB0aGlzLnJhZGl1cywgMik7XG4gICAgICB2YXIgdHJpUHRzID0gcG9pbnRzVG9BcnIodHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzLCBzaXplICsgMiAqIHBhZGRpbmcsIGFuZ2xlLCB0cmFuc2xhdGlvbikpO1xuICAgICAgcmV0dXJuIHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCB0cmlQdHMpIHx8IGNpcmNsZUluc2lkZTtcbiAgICB9LFxuICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBlZGdlV2lkdGgpIHtcbiAgICAgIHZhciB0cmlQdHMgPSB0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHNUciwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uKTtcbiAgICAgIHJlbmRlcmVyLmFycm93U2hhcGVJbXBsKHRoaXMubmFtZSkoY29udGV4dCwgdHJpUHRzLCB0cmFuc2xhdGlvbi54LCB0cmFuc2xhdGlvbi55LCB0aGlzLnJhZGl1cyAqIHNpemUpO1xuICAgIH0sXG4gICAgc3BhY2luZzogZnVuY3Rpb24gc3BhY2luZyhlZGdlKSB7XG4gICAgICByZXR1cm4gcmVuZGVyZXIuZ2V0QXJyb3dXaWR0aChlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlLCBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZSkgKiB0aGlzLnJhZGl1cztcbiAgICB9XG4gIH0pO1xuICBkZWZpbmVBcnJvd1NoYXBlKCd0cmlhbmdsZS1jcm9zcycsIHtcbiAgICBwb2ludHM6IFswLCAwLCAwLjE1LCAtMC4zLCAtMC4xNSwgLTAuMywgMCwgMF0sXG4gICAgYmFzZUNyb3NzTGluZVB0czogWy0wLjE1LCAtMC40LFxuICAgIC8vIGZpcnN0IGhhbGYgb2YgdGhlIHJlY3RhbmdsZVxuICAgIC0wLjE1LCAtMC40LCAwLjE1LCAtMC40LFxuICAgIC8vIHNlY29uZCBoYWxmIG9mIHRoZSByZWN0YW5nbGVcbiAgICAwLjE1LCAtMC40XSxcbiAgICBjcm9zc0xpbmVQdHM6IGZ1bmN0aW9uIGNyb3NzTGluZVB0cyhzaXplLCBlZGdlV2lkdGgpIHtcbiAgICAgIC8vIHNoaWZ0IHBvaW50cyBzbyB0aGF0IHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBjcm9zcyBwb2ludHMgbWF0Y2hlcyBlZGdlIHdpZHRoXG4gICAgICB2YXIgcCA9IHRoaXMuYmFzZUNyb3NzTGluZVB0cy5zbGljZSgpO1xuICAgICAgdmFyIHNoaWZ0RmFjdG9yID0gZWRnZVdpZHRoIC8gc2l6ZTtcbiAgICAgIHZhciB5MCA9IDM7XG4gICAgICB2YXIgeTEgPSA1O1xuICAgICAgcFt5MF0gPSBwW3kwXSAtIHNoaWZ0RmFjdG9yO1xuICAgICAgcFt5MV0gPSBwW3kxXSAtIHNoaWZ0RmFjdG9yO1xuICAgICAgcmV0dXJuIHA7XG4gICAgfSxcbiAgICBjb2xsaWRlOiBmdW5jdGlvbiBjb2xsaWRlKHgsIHksIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoLCBwYWRkaW5nKSB7XG4gICAgICB2YXIgdHJpUHRzID0gcG9pbnRzVG9BcnIodHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzLCBzaXplICsgMiAqIHBhZGRpbmcsIGFuZ2xlLCB0cmFuc2xhdGlvbikpO1xuICAgICAgdmFyIHRlZVB0cyA9IHBvaW50c1RvQXJyKHRyYW5zZm9ybVBvaW50cyh0aGlzLmNyb3NzTGluZVB0cyhzaXplLCBlZGdlV2lkdGgpLCBzaXplICsgMiAqIHBhZGRpbmcsIGFuZ2xlLCB0cmFuc2xhdGlvbikpO1xuICAgICAgdmFyIGluc2lkZSA9IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCB0cmlQdHMpIHx8IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCB0ZWVQdHMpO1xuICAgICAgcmV0dXJuIGluc2lkZTtcbiAgICB9LFxuICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBlZGdlV2lkdGgpIHtcbiAgICAgIHZhciB0cmlQdHMgPSB0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHMsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICB2YXIgY3Jvc3NMaW5lUHRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMuY3Jvc3NMaW5lUHRzKHNpemUsIGVkZ2VXaWR0aCksIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICByZW5kZXJlci5hcnJvd1NoYXBlSW1wbCh0aGlzLm5hbWUpKGNvbnRleHQsIHRyaVB0cywgY3Jvc3NMaW5lUHRzKTtcbiAgICB9XG4gIH0pO1xuICBkZWZpbmVBcnJvd1NoYXBlKCd2ZWUnLCB7XG4gICAgcG9pbnRzOiBbLTAuMTUsIC0wLjMsIDAsIDAsIDAuMTUsIC0wLjMsIDAsIC0wLjE1XSxcbiAgICBnYXA6IGZ1bmN0aW9uIGdhcChlZGdlKSB7XG4gICAgICByZXR1cm4gc3RhbmRhcmRHYXAoZWRnZSkgKiAwLjUyNTtcbiAgICB9XG4gIH0pO1xuICBkZWZpbmVBcnJvd1NoYXBlKCdjaXJjbGUnLCB7XG4gICAgcmFkaXVzOiAwLjE1LFxuICAgIGNvbGxpZGU6IGZ1bmN0aW9uIGNvbGxpZGUoeCwgeSwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBlZGdlV2lkdGgsIHBhZGRpbmcpIHtcbiAgICAgIHZhciB0ID0gdHJhbnNsYXRpb247XG4gICAgICB2YXIgaW5zaWRlID0gTWF0aC5wb3codC54IC0geCwgMikgKyBNYXRoLnBvdyh0LnkgLSB5LCAyKSA8PSBNYXRoLnBvdygoc2l6ZSArIDIgKiBwYWRkaW5nKSAqIHRoaXMucmFkaXVzLCAyKTtcbiAgICAgIHJldHVybiBpbnNpZGU7XG4gICAgfSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKSB7XG4gICAgICByZW5kZXJlci5hcnJvd1NoYXBlSW1wbCh0aGlzLm5hbWUpKGNvbnRleHQsIHRyYW5zbGF0aW9uLngsIHRyYW5zbGF0aW9uLnksIHRoaXMucmFkaXVzICogc2l6ZSk7XG4gICAgfSxcbiAgICBzcGFjaW5nOiBmdW5jdGlvbiBzcGFjaW5nKGVkZ2UpIHtcbiAgICAgIHJldHVybiByZW5kZXJlci5nZXRBcnJvd1dpZHRoKGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWUsIGVkZ2UucHN0eWxlKCdhcnJvdy1zY2FsZScpLnZhbHVlKSAqIHRoaXMucmFkaXVzO1xuICAgIH1cbiAgfSk7XG4gIGRlZmluZUFycm93U2hhcGUoJ3RlZScsIHtcbiAgICBwb2ludHM6IFstMC4xNSwgMCwgLTAuMTUsIC0wLjEsIDAuMTUsIC0wLjEsIDAuMTUsIDBdLFxuICAgIHNwYWNpbmc6IGZ1bmN0aW9uIHNwYWNpbmcoZWRnZSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSxcbiAgICBnYXA6IGZ1bmN0aW9uIGdhcChlZGdlKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH0pO1xuICBkZWZpbmVBcnJvd1NoYXBlKCdzcXVhcmUnLCB7XG4gICAgcG9pbnRzOiBbLTAuMTUsIDAuMDAsIDAuMTUsIDAuMDAsIDAuMTUsIC0wLjMsIC0wLjE1LCAtMC4zXVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnZGlhbW9uZCcsIHtcbiAgICBwb2ludHM6IFstMC4xNSwgLTAuMTUsIDAsIC0wLjMsIDAuMTUsIC0wLjE1LCAwLCAwXSxcbiAgICBnYXA6IGZ1bmN0aW9uIGdhcChlZGdlKSB7XG4gICAgICByZXR1cm4gZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZSAqIGVkZ2UucHN0eWxlKCdhcnJvdy1zY2FsZScpLnZhbHVlO1xuICAgIH1cbiAgfSk7XG4gIGRlZmluZUFycm93U2hhcGUoJ2NoZXZyb24nLCB7XG4gICAgcG9pbnRzOiBbMCwgMCwgLTAuMTUsIC0wLjE1LCAtMC4xLCAtMC4yLCAwLCAtMC4xLCAwLjEsIC0wLjIsIDAuMTUsIC0wLjE1XSxcbiAgICBnYXA6IGZ1bmN0aW9uIGdhcChlZGdlKSB7XG4gICAgICByZXR1cm4gMC45NSAqIGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWUgKiBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZTtcbiAgICB9XG4gIH0pO1xufTtcblxudmFyIEJScCRlID0ge307XG5cbi8vIFByb2plY3QgbW91c2VcbkJScCRlLnByb2plY3RJbnRvVmlld3BvcnQgPSBmdW5jdGlvbiAoY2xpZW50WCwgY2xpZW50WSkge1xuICB2YXIgY3kgPSB0aGlzLmN5O1xuICB2YXIgb2Zmc2V0cyA9IHRoaXMuZmluZENvbnRhaW5lckNsaWVudENvb3JkcygpO1xuICB2YXIgb2Zmc2V0TGVmdCA9IG9mZnNldHNbMF07XG4gIHZhciBvZmZzZXRUb3AgPSBvZmZzZXRzWzFdO1xuICB2YXIgc2NhbGUgPSBvZmZzZXRzWzRdO1xuICB2YXIgcGFuID0gY3kucGFuKCk7XG4gIHZhciB6b29tID0gY3kuem9vbSgpO1xuICB2YXIgeCA9ICgoY2xpZW50WCAtIG9mZnNldExlZnQpIC8gc2NhbGUgLSBwYW4ueCkgLyB6b29tO1xuICB2YXIgeSA9ICgoY2xpZW50WSAtIG9mZnNldFRvcCkgLyBzY2FsZSAtIHBhbi55KSAvIHpvb207XG4gIHJldHVybiBbeCwgeV07XG59O1xuQlJwJGUuZmluZENvbnRhaW5lckNsaWVudENvb3JkcyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY29udGFpbmVyQkIpIHtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXJCQjtcbiAgfVxuICB2YXIgY29udGFpbmVyID0gdGhpcy5jb250YWluZXI7XG4gIHZhciByZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc3R5bGUgPSB0aGlzLmN5LndpbmRvdygpLmdldENvbXB1dGVkU3R5bGUoY29udGFpbmVyKTtcbiAgdmFyIHN0eWxlVmFsdWUgPSBmdW5jdGlvbiBzdHlsZVZhbHVlKG5hbWUpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpKTtcbiAgfTtcbiAgdmFyIHBhZGRpbmcgPSB7XG4gICAgbGVmdDogc3R5bGVWYWx1ZSgncGFkZGluZy1sZWZ0JyksXG4gICAgcmlnaHQ6IHN0eWxlVmFsdWUoJ3BhZGRpbmctcmlnaHQnKSxcbiAgICB0b3A6IHN0eWxlVmFsdWUoJ3BhZGRpbmctdG9wJyksXG4gICAgYm90dG9tOiBzdHlsZVZhbHVlKCdwYWRkaW5nLWJvdHRvbScpXG4gIH07XG4gIHZhciBib3JkZXIgPSB7XG4gICAgbGVmdDogc3R5bGVWYWx1ZSgnYm9yZGVyLWxlZnQtd2lkdGgnKSxcbiAgICByaWdodDogc3R5bGVWYWx1ZSgnYm9yZGVyLXJpZ2h0LXdpZHRoJyksXG4gICAgdG9wOiBzdHlsZVZhbHVlKCdib3JkZXItdG9wLXdpZHRoJyksXG4gICAgYm90dG9tOiBzdHlsZVZhbHVlKCdib3JkZXItYm90dG9tLXdpZHRoJylcbiAgfTtcbiAgdmFyIGNsaWVudFdpZHRoID0gY29udGFpbmVyLmNsaWVudFdpZHRoO1xuICB2YXIgY2xpZW50SGVpZ2h0ID0gY29udGFpbmVyLmNsaWVudEhlaWdodDtcbiAgdmFyIHBhZGRpbmdIb3IgPSBwYWRkaW5nLmxlZnQgKyBwYWRkaW5nLnJpZ2h0O1xuICB2YXIgcGFkZGluZ1ZlciA9IHBhZGRpbmcudG9wICsgcGFkZGluZy5ib3R0b207XG4gIHZhciBib3JkZXJIb3IgPSBib3JkZXIubGVmdCArIGJvcmRlci5yaWdodDtcbiAgdmFyIHNjYWxlID0gcmVjdC53aWR0aCAvIChjbGllbnRXaWR0aCArIGJvcmRlckhvcik7XG4gIHZhciB1bnNjYWxlZFcgPSBjbGllbnRXaWR0aCAtIHBhZGRpbmdIb3I7XG4gIHZhciB1bnNjYWxlZEggPSBjbGllbnRIZWlnaHQgLSBwYWRkaW5nVmVyO1xuICB2YXIgbGVmdCA9IHJlY3QubGVmdCArIHBhZGRpbmcubGVmdCArIGJvcmRlci5sZWZ0O1xuICB2YXIgdG9wID0gcmVjdC50b3AgKyBwYWRkaW5nLnRvcCArIGJvcmRlci50b3A7XG4gIHJldHVybiB0aGlzLmNvbnRhaW5lckJCID0gW2xlZnQsIHRvcCwgdW5zY2FsZWRXLCB1bnNjYWxlZEgsIHNjYWxlXTtcbn07XG5CUnAkZS5pbnZhbGlkYXRlQ29udGFpbmVyQ2xpZW50Q29vcmRzQ2FjaGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuY29udGFpbmVyQkIgPSBudWxsO1xufTtcbkJScCRlLmZpbmROZWFyZXN0RWxlbWVudCA9IGZ1bmN0aW9uICh4LCB5LCBpbnRlcmFjdGl2ZUVsZW1lbnRzT25seSwgaXNUb3VjaCkge1xuICByZXR1cm4gdGhpcy5maW5kTmVhcmVzdEVsZW1lbnRzKHgsIHksIGludGVyYWN0aXZlRWxlbWVudHNPbmx5LCBpc1RvdWNoKVswXTtcbn07XG5CUnAkZS5maW5kTmVhcmVzdEVsZW1lbnRzID0gZnVuY3Rpb24gKHgsIHksIGludGVyYWN0aXZlRWxlbWVudHNPbmx5LCBpc1RvdWNoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgZWxlcyA9IHIuZ2V0Q2FjaGVkWlNvcnRlZEVsZXMoKTtcbiAgdmFyIG5lYXIgPSBbXTsgLy8gMSBub2RlIG1heCwgMSBlZGdlIG1heFxuICB2YXIgem9vbSA9IHIuY3kuem9vbSgpO1xuICB2YXIgaGFzQ29tcG91bmRzID0gci5jeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gIHZhciBlZGdlVGhyZXNob2xkID0gKGlzVG91Y2ggPyAyNCA6IDgpIC8gem9vbTtcbiAgdmFyIG5vZGVUaHJlc2hvbGQgPSAoaXNUb3VjaCA/IDggOiAyKSAvIHpvb207XG4gIHZhciBsYWJlbFRocmVzaG9sZCA9IChpc1RvdWNoID8gOCA6IDIpIC8gem9vbTtcbiAgdmFyIG1pblNxRGlzdCA9IEluZmluaXR5O1xuICB2YXIgbmVhckVkZ2U7XG4gIHZhciBuZWFyTm9kZTtcbiAgaWYgKGludGVyYWN0aXZlRWxlbWVudHNPbmx5KSB7XG4gICAgZWxlcyA9IGVsZXMuaW50ZXJhY3RpdmU7XG4gIH1cbiAgZnVuY3Rpb24gYWRkRWxlKGVsZSwgc3FEaXN0KSB7XG4gICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgaWYgKG5lYXJOb2RlKSB7XG4gICAgICAgIHJldHVybjsgLy8gY2FuJ3QgcmVwbGFjZSBub2RlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZWFyTm9kZSA9IGVsZTtcbiAgICAgICAgbmVhci5wdXNoKGVsZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbGUuaXNFZGdlKCkgJiYgKHNxRGlzdCA9PSBudWxsIHx8IHNxRGlzdCA8IG1pblNxRGlzdCkpIHtcbiAgICAgIGlmIChuZWFyRWRnZSkge1xuICAgICAgICAvLyB0aGVuIHJlcGxhY2UgZXhpc3RpbmcgZWRnZVxuICAgICAgICAvLyBjYW4gcmVwbGFjZSBvbmx5IGlmIHNhbWUgei1pbmRleFxuICAgICAgICBpZiAobmVhckVkZ2UucHN0eWxlKCd6LWNvbXBvdW5kLWRlcHRoJykudmFsdWUgPT09IGVsZS5wc3R5bGUoJ3otY29tcG91bmQtZGVwdGgnKS52YWx1ZSAmJiBuZWFyRWRnZS5wc3R5bGUoJ3otY29tcG91bmQtZGVwdGgnKS52YWx1ZSA9PT0gZWxlLnBzdHlsZSgnei1jb21wb3VuZC1kZXB0aCcpLnZhbHVlKSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZWFyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobmVhcltpXS5pc0VkZ2UoKSkge1xuICAgICAgICAgICAgICBuZWFyW2ldID0gZWxlO1xuICAgICAgICAgICAgICBuZWFyRWRnZSA9IGVsZTtcbiAgICAgICAgICAgICAgbWluU3FEaXN0ID0gc3FEaXN0ICE9IG51bGwgPyBzcURpc3QgOiBtaW5TcURpc3Q7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmVhci5wdXNoKGVsZSk7XG4gICAgICAgIG5lYXJFZGdlID0gZWxlO1xuICAgICAgICBtaW5TcURpc3QgPSBzcURpc3QgIT0gbnVsbCA/IHNxRGlzdCA6IG1pblNxRGlzdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gY2hlY2tOb2RlKG5vZGUpIHtcbiAgICB2YXIgd2lkdGggPSBub2RlLm91dGVyV2lkdGgoKSArIDIgKiBub2RlVGhyZXNob2xkO1xuICAgIHZhciBoZWlnaHQgPSBub2RlLm91dGVySGVpZ2h0KCkgKyAyICogbm9kZVRocmVzaG9sZDtcbiAgICB2YXIgaHcgPSB3aWR0aCAvIDI7XG4gICAgdmFyIGhoID0gaGVpZ2h0IC8gMjtcbiAgICB2YXIgcG9zID0gbm9kZS5wb3NpdGlvbigpO1xuICAgIGlmIChwb3MueCAtIGh3IDw9IHggJiYgeCA8PSBwb3MueCArIGh3IC8vIGJiIGNoZWNrIHhcbiAgICAmJiBwb3MueSAtIGhoIDw9IHkgJiYgeSA8PSBwb3MueSArIGhoIC8vIGJiIGNoZWNrIHlcbiAgICApIHtcbiAgICAgIHZhciBzaGFwZSA9IHIubm9kZVNoYXBlc1tzZWxmLmdldE5vZGVTaGFwZShub2RlKV07XG4gICAgICBpZiAoc2hhcGUuY2hlY2tQb2ludCh4LCB5LCAwLCB3aWR0aCwgaGVpZ2h0LCBwb3MueCwgcG9zLnkpKSB7XG4gICAgICAgIGFkZEVsZShub2RlLCAwKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGNoZWNrRWRnZShlZGdlKSB7XG4gICAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgICB2YXIgc3R5bGVXaWR0aCA9IGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWU7XG4gICAgdmFyIHNjYWxlID0gZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykudmFsdWU7XG4gICAgdmFyIHdpZHRoID0gc3R5bGVXaWR0aCAvIDIgKyBlZGdlVGhyZXNob2xkOyAvLyBtb3JlIGxpa2UgYSBkaXN0YW5jZSByYWRpdXMgZnJvbSBjZW50cmVcbiAgICB2YXIgd2lkdGhTcSA9IHdpZHRoICogd2lkdGg7XG4gICAgdmFyIHdpZHRoMiA9IHdpZHRoICogMjtcbiAgICB2YXIgc3JjID0gX3Auc291cmNlO1xuICAgIHZhciB0Z3QgPSBfcC50YXJnZXQ7XG4gICAgdmFyIHNxRGlzdDtcbiAgICBpZiAocnMuZWRnZVR5cGUgPT09ICdzZWdtZW50cycgfHwgcnMuZWRnZVR5cGUgPT09ICdzdHJhaWdodCcgfHwgcnMuZWRnZVR5cGUgPT09ICdoYXlzdGFjaycpIHtcbiAgICAgIHZhciBwdHMgPSBycy5hbGxwdHM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSArIDMgPCBwdHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgaWYgKGluTGluZVZpY2luaXR5KHgsIHksIHB0c1tpXSwgcHRzW2kgKyAxXSwgcHRzW2kgKyAyXSwgcHRzW2kgKyAzXSwgd2lkdGgyKSAmJiB3aWR0aFNxID4gKHNxRGlzdCA9IHNxZGlzdFRvRmluaXRlTGluZSh4LCB5LCBwdHNbaV0sIHB0c1tpICsgMV0sIHB0c1tpICsgMl0sIHB0c1tpICsgM10pKSkge1xuICAgICAgICAgIGFkZEVsZShlZGdlLCBzcURpc3QpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChycy5lZGdlVHlwZSA9PT0gJ2JlemllcicgfHwgcnMuZWRnZVR5cGUgPT09ICdtdWx0aWJlemllcicgfHwgcnMuZWRnZVR5cGUgPT09ICdzZWxmJyB8fCBycy5lZGdlVHlwZSA9PT0gJ2NvbXBvdW5kJykge1xuICAgICAgdmFyIHB0cyA9IHJzLmFsbHB0cztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpICsgNSA8IHJzLmFsbHB0cy5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICBpZiAoaW5CZXppZXJWaWNpbml0eSh4LCB5LCBwdHNbaV0sIHB0c1tpICsgMV0sIHB0c1tpICsgMl0sIHB0c1tpICsgM10sIHB0c1tpICsgNF0sIHB0c1tpICsgNV0sIHdpZHRoMikgJiYgd2lkdGhTcSA+IChzcURpc3QgPSBzcWRpc3RUb1F1YWRyYXRpY0Jlemllcih4LCB5LCBwdHNbaV0sIHB0c1tpICsgMV0sIHB0c1tpICsgMl0sIHB0c1tpICsgM10sIHB0c1tpICsgNF0sIHB0c1tpICsgNV0pKSkge1xuICAgICAgICAgIGFkZEVsZShlZGdlLCBzcURpc3QpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgd2UncmUgY2xvc2UgdG8gdGhlIGVkZ2UgYnV0IGRpZG4ndCBoaXQgaXQsIG1heWJlIHdlIGhpdCBpdHMgYXJyb3dzXG5cbiAgICB2YXIgc3JjID0gc3JjIHx8IF9wLnNvdXJjZTtcbiAgICB2YXIgdGd0ID0gdGd0IHx8IF9wLnRhcmdldDtcbiAgICB2YXIgYXJTaXplID0gc2VsZi5nZXRBcnJvd1dpZHRoKHN0eWxlV2lkdGgsIHNjYWxlKTtcbiAgICB2YXIgYXJyb3dzID0gW3tcbiAgICAgIG5hbWU6ICdzb3VyY2UnLFxuICAgICAgeDogcnMuYXJyb3dTdGFydFgsXG4gICAgICB5OiBycy5hcnJvd1N0YXJ0WSxcbiAgICAgIGFuZ2xlOiBycy5zcmNBcnJvd0FuZ2xlXG4gICAgfSwge1xuICAgICAgbmFtZTogJ3RhcmdldCcsXG4gICAgICB4OiBycy5hcnJvd0VuZFgsXG4gICAgICB5OiBycy5hcnJvd0VuZFksXG4gICAgICBhbmdsZTogcnMudGd0QXJyb3dBbmdsZVxuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdtaWQtc291cmNlJyxcbiAgICAgIHg6IHJzLm1pZFgsXG4gICAgICB5OiBycy5taWRZLFxuICAgICAgYW5nbGU6IHJzLm1pZHNyY0Fycm93QW5nbGVcbiAgICB9LCB7XG4gICAgICBuYW1lOiAnbWlkLXRhcmdldCcsXG4gICAgICB4OiBycy5taWRYLFxuICAgICAgeTogcnMubWlkWSxcbiAgICAgIGFuZ2xlOiBycy5taWR0Z3RBcnJvd0FuZ2xlXG4gICAgfV07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBhciA9IGFycm93c1tpXTtcbiAgICAgIHZhciBzaGFwZSA9IHIuYXJyb3dTaGFwZXNbZWRnZS5wc3R5bGUoYXIubmFtZSArICctYXJyb3ctc2hhcGUnKS52YWx1ZV07XG4gICAgICB2YXIgZWRnZVdpZHRoID0gZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZTtcbiAgICAgIGlmIChzaGFwZS5yb3VnaENvbGxpZGUoeCwgeSwgYXJTaXplLCBhci5hbmdsZSwge1xuICAgICAgICB4OiBhci54LFxuICAgICAgICB5OiBhci55XG4gICAgICB9LCBlZGdlV2lkdGgsIGVkZ2VUaHJlc2hvbGQpICYmIHNoYXBlLmNvbGxpZGUoeCwgeSwgYXJTaXplLCBhci5hbmdsZSwge1xuICAgICAgICB4OiBhci54LFxuICAgICAgICB5OiBhci55XG4gICAgICB9LCBlZGdlV2lkdGgsIGVkZ2VUaHJlc2hvbGQpKSB7XG4gICAgICAgIGFkZEVsZShlZGdlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZm9yIGNvbXBvdW5kIGdyYXBocywgaGl0dGluZyBlZGdlIG1heSBhY3R1YWxseSB3YW50IGEgY29ubmVjdGVkIG5vZGUgaW5zdGVhZCAoYi9jIGVkZ2UgbWF5IGhhdmUgZ3JlYXRlciB6LWluZGV4IHByZWNlZGVuY2UpXG4gICAgaWYgKGhhc0NvbXBvdW5kcyAmJiBuZWFyLmxlbmd0aCA+IDApIHtcbiAgICAgIGNoZWNrTm9kZShzcmMpO1xuICAgICAgY2hlY2tOb2RlKHRndCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHByZXByb3Aob2JqLCBuYW1lLCBwcmUpIHtcbiAgICByZXR1cm4gZ2V0UHJlZml4ZWRQcm9wZXJ0eShvYmosIG5hbWUsIHByZSk7XG4gIH1cbiAgZnVuY3Rpb24gY2hlY2tMYWJlbChlbGUsIHByZWZpeCkge1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICB2YXIgdGggPSBsYWJlbFRocmVzaG9sZDtcbiAgICB2YXIgcHJlZml4RGFzaDtcbiAgICBpZiAocHJlZml4KSB7XG4gICAgICBwcmVmaXhEYXNoID0gcHJlZml4ICsgJy0nO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmVmaXhEYXNoID0gJyc7XG4gICAgfVxuICAgIGVsZS5ib3VuZGluZ0JveCgpO1xuICAgIHZhciBiYiA9IF9wLmxhYmVsQm91bmRzW3ByZWZpeCB8fCAnbWFpbiddO1xuICAgIHZhciB0ZXh0ID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ2xhYmVsJykudmFsdWU7XG4gICAgdmFyIGV2ZW50c0VuYWJsZWQgPSBlbGUucHN0eWxlKCd0ZXh0LWV2ZW50cycpLnN0clZhbHVlID09PSAneWVzJztcbiAgICBpZiAoIWV2ZW50c0VuYWJsZWQgfHwgIXRleHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGx4ID0gcHJlcHJvcChfcC5yc2NyYXRjaCwgJ2xhYmVsWCcsIHByZWZpeCk7XG4gICAgdmFyIGx5ID0gcHJlcHJvcChfcC5yc2NyYXRjaCwgJ2xhYmVsWScsIHByZWZpeCk7XG4gICAgdmFyIHRoZXRhID0gcHJlcHJvcChfcC5yc2NyYXRjaCwgJ2xhYmVsQW5nbGUnLCBwcmVmaXgpO1xuICAgIHZhciBveCA9IGVsZS5wc3R5bGUocHJlZml4RGFzaCArICd0ZXh0LW1hcmdpbi14JykucGZWYWx1ZTtcbiAgICB2YXIgb3kgPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAndGV4dC1tYXJnaW4teScpLnBmVmFsdWU7XG4gICAgdmFyIGx4MSA9IGJiLngxIC0gdGggLSBveDsgLy8gKC1veCwgLW95KSBhcyBiYiBhbHJlYWR5IGluY2x1ZGVzIG1hcmdpblxuICAgIHZhciBseDIgPSBiYi54MiArIHRoIC0gb3g7IC8vIGFuZCByb3RhdGlvbiBpcyBhYm91dCAobHgsIGx5KVxuICAgIHZhciBseTEgPSBiYi55MSAtIHRoIC0gb3k7XG4gICAgdmFyIGx5MiA9IGJiLnkyICsgdGggLSBveTtcbiAgICBpZiAodGhldGEpIHtcbiAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyh0aGV0YSk7XG4gICAgICB2YXIgc2luID0gTWF0aC5zaW4odGhldGEpO1xuICAgICAgdmFyIHJvdGF0ZSA9IGZ1bmN0aW9uIHJvdGF0ZSh4LCB5KSB7XG4gICAgICAgIHggPSB4IC0gbHg7XG4gICAgICAgIHkgPSB5IC0gbHk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogeCAqIGNvcyAtIHkgKiBzaW4gKyBseCxcbiAgICAgICAgICB5OiB4ICogc2luICsgeSAqIGNvcyArIGx5XG4gICAgICAgIH07XG4gICAgICB9O1xuICAgICAgdmFyIHB4MXkxID0gcm90YXRlKGx4MSwgbHkxKTtcbiAgICAgIHZhciBweDF5MiA9IHJvdGF0ZShseDEsIGx5Mik7XG4gICAgICB2YXIgcHgyeTEgPSByb3RhdGUobHgyLCBseTEpO1xuICAgICAgdmFyIHB4MnkyID0gcm90YXRlKGx4MiwgbHkyKTtcbiAgICAgIHZhciBwb2ludHMgPSBbXG4gICAgICAvLyB3aXRoIHRoZSBtYXJnaW4gYWRkZWQgYWZ0ZXIgdGhlIHJvdGF0aW9uIGlzIGFwcGxpZWRcbiAgICAgIHB4MXkxLnggKyBveCwgcHgxeTEueSArIG95LCBweDJ5MS54ICsgb3gsIHB4MnkxLnkgKyBveSwgcHgyeTIueCArIG94LCBweDJ5Mi55ICsgb3ksIHB4MXkyLnggKyBveCwgcHgxeTIueSArIG95XTtcbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgcG9pbnRzKSkge1xuICAgICAgICBhZGRFbGUoZWxlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRvIGEgY2hlYXBlciBiYiBjaGVja1xuICAgICAgaWYgKGluQm91bmRpbmdCb3goYmIsIHgsIHkpKSB7XG4gICAgICAgIGFkZEVsZShlbGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZm9yICh2YXIgaSA9IGVsZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAvLyByZXZlcnNlIG9yZGVyIGZvciBwcmVjZWRlbmNlXG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgY2hlY2tOb2RlKGVsZSkgfHwgY2hlY2tMYWJlbChlbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGVuIGVkZ2VcbiAgICAgIGNoZWNrRWRnZShlbGUpIHx8IGNoZWNrTGFiZWwoZWxlKSB8fCBjaGVja0xhYmVsKGVsZSwgJ3NvdXJjZScpIHx8IGNoZWNrTGFiZWwoZWxlLCAndGFyZ2V0Jyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZWFyO1xufTtcblxuLy8gJ0dpdmUgbWUgZXZlcnl0aGluZyBmcm9tIHRoaXMgYm94J1xuQlJwJGUuZ2V0QWxsSW5Cb3ggPSBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIpIHtcbiAgdmFyIGVsZXMgPSB0aGlzLmdldENhY2hlZFpTb3J0ZWRFbGVzKCkuaW50ZXJhY3RpdmU7XG4gIHZhciBib3ggPSBbXTtcbiAgdmFyIHgxYyA9IE1hdGgubWluKHgxLCB4Mik7XG4gIHZhciB4MmMgPSBNYXRoLm1heCh4MSwgeDIpO1xuICB2YXIgeTFjID0gTWF0aC5taW4oeTEsIHkyKTtcbiAgdmFyIHkyYyA9IE1hdGgubWF4KHkxLCB5Mik7XG4gIHgxID0geDFjO1xuICB4MiA9IHgyYztcbiAgeTEgPSB5MWM7XG4gIHkyID0geTJjO1xuICB2YXIgYm94QmIgPSBtYWtlQm91bmRpbmdCb3goe1xuICAgIHgxOiB4MSxcbiAgICB5MTogeTEsXG4gICAgeDI6IHgyLFxuICAgIHkyOiB5MlxuICB9KTtcbiAgZm9yICh2YXIgZSA9IDA7IGUgPCBlbGVzLmxlbmd0aDsgZSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbZV07XG4gICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgdmFyIG5vZGUgPSBlbGU7XG4gICAgICB2YXIgbm9kZUJiID0gbm9kZS5ib3VuZGluZ0JveCh7XG4gICAgICAgIGluY2x1ZGVOb2RlczogdHJ1ZSxcbiAgICAgICAgaW5jbHVkZUVkZ2VzOiBmYWxzZSxcbiAgICAgICAgaW5jbHVkZUxhYmVsczogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgaWYgKGJvdW5kaW5nQm94ZXNJbnRlcnNlY3QoYm94QmIsIG5vZGVCYikgJiYgIWJvdW5kaW5nQm94SW5Cb3VuZGluZ0JveChub2RlQmIsIGJveEJiKSkge1xuICAgICAgICBib3gucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGVkZ2UgPSBlbGU7XG4gICAgICB2YXIgX3AgPSBlZGdlLl9wcml2YXRlO1xuICAgICAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gICAgICBpZiAocnMuc3RhcnRYICE9IG51bGwgJiYgcnMuc3RhcnRZICE9IG51bGwgJiYgIWluQm91bmRpbmdCb3goYm94QmIsIHJzLnN0YXJ0WCwgcnMuc3RhcnRZKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChycy5lbmRYICE9IG51bGwgJiYgcnMuZW5kWSAhPSBudWxsICYmICFpbkJvdW5kaW5nQm94KGJveEJiLCBycy5lbmRYLCBycy5lbmRZKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChycy5lZGdlVHlwZSA9PT0gJ2JlemllcicgfHwgcnMuZWRnZVR5cGUgPT09ICdtdWx0aWJlemllcicgfHwgcnMuZWRnZVR5cGUgPT09ICdzZWxmJyB8fCBycy5lZGdlVHlwZSA9PT0gJ2NvbXBvdW5kJyB8fCBycy5lZGdlVHlwZSA9PT0gJ3NlZ21lbnRzJyB8fCBycy5lZGdlVHlwZSA9PT0gJ2hheXN0YWNrJykge1xuICAgICAgICB2YXIgcHRzID0gX3AucnN0eWxlLmJlemllclB0cyB8fCBfcC5yc3R5bGUubGluZVB0cyB8fCBfcC5yc3R5bGUuaGF5c3RhY2tQdHM7XG4gICAgICAgIHZhciBhbGxJbnNpZGUgPSB0cnVlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHB0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghcG9pbnRJbkJvdW5kaW5nQm94KGJveEJiLCBwdHNbaV0pKSB7XG4gICAgICAgICAgICBhbGxJbnNpZGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYWxsSW5zaWRlKSB7XG4gICAgICAgICAgYm94LnB1c2goZWRnZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocnMuZWRnZVR5cGUgPT09ICdoYXlzdGFjaycgfHwgcnMuZWRnZVR5cGUgPT09ICdzdHJhaWdodCcpIHtcbiAgICAgICAgYm94LnB1c2goZWRnZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBib3g7XG59O1xuXG52YXIgQlJwJGQgPSB7fTtcbkJScCRkLmNhbGN1bGF0ZUFycm93QW5nbGVzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIGlzSGF5c3RhY2sgPSBycy5lZGdlVHlwZSA9PT0gJ2hheXN0YWNrJztcbiAgdmFyIGlzQmV6aWVyID0gcnMuZWRnZVR5cGUgPT09ICdiZXppZXInO1xuICB2YXIgaXNNdWx0aWJlemllciA9IHJzLmVkZ2VUeXBlID09PSAnbXVsdGliZXppZXInO1xuICB2YXIgaXNTZWdtZW50cyA9IHJzLmVkZ2VUeXBlID09PSAnc2VnbWVudHMnO1xuICB2YXIgaXNDb21wb3VuZCA9IHJzLmVkZ2VUeXBlID09PSAnY29tcG91bmQnO1xuICB2YXIgaXNTZWxmID0gcnMuZWRnZVR5cGUgPT09ICdzZWxmJztcblxuICAvLyBEaXNwbGFjZW1lbnQgZ2l2ZXMgZGlyZWN0aW9uIGZvciBhcnJvd2hlYWQgb3JpZW50YXRpb25cbiAgdmFyIGRpc3BYLCBkaXNwWTtcbiAgdmFyIHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLCBtaWRYLCBtaWRZO1xuICBpZiAoaXNIYXlzdGFjaykge1xuICAgIHN0YXJ0WCA9IHJzLmhheXN0YWNrUHRzWzBdO1xuICAgIHN0YXJ0WSA9IHJzLmhheXN0YWNrUHRzWzFdO1xuICAgIGVuZFggPSBycy5oYXlzdGFja1B0c1syXTtcbiAgICBlbmRZID0gcnMuaGF5c3RhY2tQdHNbM107XG4gIH0gZWxzZSB7XG4gICAgc3RhcnRYID0gcnMuYXJyb3dTdGFydFg7XG4gICAgc3RhcnRZID0gcnMuYXJyb3dTdGFydFk7XG4gICAgZW5kWCA9IHJzLmFycm93RW5kWDtcbiAgICBlbmRZID0gcnMuYXJyb3dFbmRZO1xuICB9XG4gIG1pZFggPSBycy5taWRYO1xuICBtaWRZID0gcnMubWlkWTtcblxuICAvLyBzb3VyY2VcbiAgLy9cblxuICBpZiAoaXNTZWdtZW50cykge1xuICAgIGRpc3BYID0gc3RhcnRYIC0gcnMuc2VncHRzWzBdO1xuICAgIGRpc3BZID0gc3RhcnRZIC0gcnMuc2VncHRzWzFdO1xuICB9IGVsc2UgaWYgKGlzTXVsdGliZXppZXIgfHwgaXNDb21wb3VuZCB8fCBpc1NlbGYgfHwgaXNCZXppZXIpIHtcbiAgICB2YXIgcHRzID0gcnMuYWxscHRzO1xuICAgIHZhciBiWCA9IHFiZXppZXJBdChwdHNbMF0sIHB0c1syXSwgcHRzWzRdLCAwLjEpO1xuICAgIHZhciBiWSA9IHFiZXppZXJBdChwdHNbMV0sIHB0c1szXSwgcHRzWzVdLCAwLjEpO1xuICAgIGRpc3BYID0gc3RhcnRYIC0gYlg7XG4gICAgZGlzcFkgPSBzdGFydFkgLSBiWTtcbiAgfSBlbHNlIHtcbiAgICBkaXNwWCA9IHN0YXJ0WCAtIG1pZFg7XG4gICAgZGlzcFkgPSBzdGFydFkgLSBtaWRZO1xuICB9XG4gIHJzLnNyY0Fycm93QW5nbGUgPSBnZXRBbmdsZUZyb21EaXNwKGRpc3BYLCBkaXNwWSk7XG5cbiAgLy8gbWlkIHRhcmdldFxuICAvL1xuXG4gIHZhciBtaWRYID0gcnMubWlkWDtcbiAgdmFyIG1pZFkgPSBycy5taWRZO1xuICBpZiAoaXNIYXlzdGFjaykge1xuICAgIG1pZFggPSAoc3RhcnRYICsgZW5kWCkgLyAyO1xuICAgIG1pZFkgPSAoc3RhcnRZICsgZW5kWSkgLyAyO1xuICB9XG4gIGRpc3BYID0gZW5kWCAtIHN0YXJ0WDtcbiAgZGlzcFkgPSBlbmRZIC0gc3RhcnRZO1xuICBpZiAoaXNTZWdtZW50cykge1xuICAgIHZhciBwdHMgPSBycy5hbGxwdHM7XG4gICAgaWYgKHB0cy5sZW5ndGggLyAyICUgMiA9PT0gMCkge1xuICAgICAgdmFyIGkyID0gcHRzLmxlbmd0aCAvIDI7XG4gICAgICB2YXIgaTEgPSBpMiAtIDI7XG4gICAgICBkaXNwWCA9IHB0c1tpMl0gLSBwdHNbaTFdO1xuICAgICAgZGlzcFkgPSBwdHNbaTIgKyAxXSAtIHB0c1tpMSArIDFdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgaTIgPSBwdHMubGVuZ3RoIC8gMiAtIDE7XG4gICAgICB2YXIgaTEgPSBpMiAtIDI7XG4gICAgICB2YXIgaTMgPSBpMiArIDI7XG4gICAgICBkaXNwWCA9IHB0c1tpMl0gLSBwdHNbaTFdO1xuICAgICAgZGlzcFkgPSBwdHNbaTIgKyAxXSAtIHB0c1tpMSArIDFdO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc011bHRpYmV6aWVyIHx8IGlzQ29tcG91bmQgfHwgaXNTZWxmKSB7XG4gICAgdmFyIHB0cyA9IHJzLmFsbHB0cztcbiAgICB2YXIgY3B0cyA9IHJzLmN0cmxwdHM7XG4gICAgdmFyIGJwMHgsIGJwMHk7XG4gICAgdmFyIGJwMXgsIGJwMXk7XG4gICAgaWYgKGNwdHMubGVuZ3RoIC8gMiAlIDIgPT09IDApIHtcbiAgICAgIHZhciBwMCA9IHB0cy5sZW5ndGggLyAyIC0gMTsgLy8gc3RhcnRwdFxuICAgICAgdmFyIGljID0gcDAgKyAyO1xuICAgICAgdmFyIHAxID0gaWMgKyAyO1xuICAgICAgYnAweCA9IHFiZXppZXJBdChwdHNbcDBdLCBwdHNbaWNdLCBwdHNbcDFdLCAwLjApO1xuICAgICAgYnAweSA9IHFiZXppZXJBdChwdHNbcDAgKyAxXSwgcHRzW2ljICsgMV0sIHB0c1twMSArIDFdLCAwLjApO1xuICAgICAgYnAxeCA9IHFiZXppZXJBdChwdHNbcDBdLCBwdHNbaWNdLCBwdHNbcDFdLCAwLjAwMDEpO1xuICAgICAgYnAxeSA9IHFiZXppZXJBdChwdHNbcDAgKyAxXSwgcHRzW2ljICsgMV0sIHB0c1twMSArIDFdLCAwLjAwMDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgaWMgPSBwdHMubGVuZ3RoIC8gMiAtIDE7IC8vIGN0cnB0XG4gICAgICB2YXIgcDAgPSBpYyAtIDI7IC8vIHN0YXJ0cHRcbiAgICAgIHZhciBwMSA9IGljICsgMjsgLy8gZW5kcHRcblxuICAgICAgYnAweCA9IHFiZXppZXJBdChwdHNbcDBdLCBwdHNbaWNdLCBwdHNbcDFdLCAwLjQ5OTkpO1xuICAgICAgYnAweSA9IHFiZXppZXJBdChwdHNbcDAgKyAxXSwgcHRzW2ljICsgMV0sIHB0c1twMSArIDFdLCAwLjQ5OTkpO1xuICAgICAgYnAxeCA9IHFiZXppZXJBdChwdHNbcDBdLCBwdHNbaWNdLCBwdHNbcDFdLCAwLjUpO1xuICAgICAgYnAxeSA9IHFiZXppZXJBdChwdHNbcDAgKyAxXSwgcHRzW2ljICsgMV0sIHB0c1twMSArIDFdLCAwLjUpO1xuICAgIH1cbiAgICBkaXNwWCA9IGJwMXggLSBicDB4O1xuICAgIGRpc3BZID0gYnAxeSAtIGJwMHk7XG4gIH1cbiAgcnMubWlkdGd0QXJyb3dBbmdsZSA9IGdldEFuZ2xlRnJvbURpc3AoZGlzcFgsIGRpc3BZKTtcbiAgcnMubWlkRGlzcFggPSBkaXNwWDtcbiAgcnMubWlkRGlzcFkgPSBkaXNwWTtcblxuICAvLyBtaWQgc291cmNlXG4gIC8vXG5cbiAgZGlzcFggKj0gLTE7XG4gIGRpc3BZICo9IC0xO1xuICBpZiAoaXNTZWdtZW50cykge1xuICAgIHZhciBwdHMgPSBycy5hbGxwdHM7XG4gICAgaWYgKHB0cy5sZW5ndGggLyAyICUgMiA9PT0gMCkgOyBlbHNlIHtcbiAgICAgIHZhciBpMiA9IHB0cy5sZW5ndGggLyAyIC0gMTtcbiAgICAgIHZhciBpMyA9IGkyICsgMjtcbiAgICAgIGRpc3BYID0gLShwdHNbaTNdIC0gcHRzW2kyXSk7XG4gICAgICBkaXNwWSA9IC0ocHRzW2kzICsgMV0gLSBwdHNbaTIgKyAxXSk7XG4gICAgfVxuICB9XG4gIHJzLm1pZHNyY0Fycm93QW5nbGUgPSBnZXRBbmdsZUZyb21EaXNwKGRpc3BYLCBkaXNwWSk7XG5cbiAgLy8gdGFyZ2V0XG4gIC8vXG5cbiAgaWYgKGlzU2VnbWVudHMpIHtcbiAgICBkaXNwWCA9IGVuZFggLSBycy5zZWdwdHNbcnMuc2VncHRzLmxlbmd0aCAtIDJdO1xuICAgIGRpc3BZID0gZW5kWSAtIHJzLnNlZ3B0c1tycy5zZWdwdHMubGVuZ3RoIC0gMV07XG4gIH0gZWxzZSBpZiAoaXNNdWx0aWJlemllciB8fCBpc0NvbXBvdW5kIHx8IGlzU2VsZiB8fCBpc0Jlemllcikge1xuICAgIHZhciBwdHMgPSBycy5hbGxwdHM7XG4gICAgdmFyIGwgPSBwdHMubGVuZ3RoO1xuICAgIHZhciBiWCA9IHFiZXppZXJBdChwdHNbbCAtIDZdLCBwdHNbbCAtIDRdLCBwdHNbbCAtIDJdLCAwLjkpO1xuICAgIHZhciBiWSA9IHFiZXppZXJBdChwdHNbbCAtIDVdLCBwdHNbbCAtIDNdLCBwdHNbbCAtIDFdLCAwLjkpO1xuICAgIGRpc3BYID0gZW5kWCAtIGJYO1xuICAgIGRpc3BZID0gZW5kWSAtIGJZO1xuICB9IGVsc2Uge1xuICAgIGRpc3BYID0gZW5kWCAtIG1pZFg7XG4gICAgZGlzcFkgPSBlbmRZIC0gbWlkWTtcbiAgfVxuICBycy50Z3RBcnJvd0FuZ2xlID0gZ2V0QW5nbGVGcm9tRGlzcChkaXNwWCwgZGlzcFkpO1xufTtcbkJScCRkLmdldEFycm93V2lkdGggPSBCUnAkZC5nZXRBcnJvd0hlaWdodCA9IGZ1bmN0aW9uIChlZGdlV2lkdGgsIHNjYWxlKSB7XG4gIHZhciBjYWNoZSA9IHRoaXMuYXJyb3dXaWR0aENhY2hlID0gdGhpcy5hcnJvd1dpZHRoQ2FjaGUgfHwge307XG4gIHZhciBjYWNoZWRWYWwgPSBjYWNoZVtlZGdlV2lkdGggKyAnLCAnICsgc2NhbGVdO1xuICBpZiAoY2FjaGVkVmFsKSB7XG4gICAgcmV0dXJuIGNhY2hlZFZhbDtcbiAgfVxuICBjYWNoZWRWYWwgPSBNYXRoLm1heChNYXRoLnBvdyhlZGdlV2lkdGggKiAxMy4zNywgMC45KSwgMjkpICogc2NhbGU7XG4gIGNhY2hlW2VkZ2VXaWR0aCArICcsICcgKyBzY2FsZV0gPSBjYWNoZWRWYWw7XG4gIHJldHVybiBjYWNoZWRWYWw7XG59O1xuXG52YXIgQlJwJGMgPSB7fTtcbkJScCRjLmZpbmRNaWRwdFB0c0V0YyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbykge1xuICB2YXIgcG9zUHRzID0gcGFpckluZm8ucG9zUHRzLFxuICAgIGludGVyc2VjdGlvblB0cyA9IHBhaXJJbmZvLmludGVyc2VjdGlvblB0cyxcbiAgICB2ZWN0b3JOb3JtSW52ZXJzZSA9IHBhaXJJbmZvLnZlY3Rvck5vcm1JbnZlcnNlO1xuICB2YXIgbWlkcHRQdHM7XG5cbiAgLy8gbi5iLiBhc3N1bWVzIGFsbCBlZGdlcyBpbiBiZXppZXIgYnVuZGxlIGhhdmUgc2FtZSBlbmRwb2ludHMgc3BlY2lmaWVkXG4gIHZhciBzcmNNYW5FbmRwdCA9IGVkZ2UucHN0eWxlKCdzb3VyY2UtZW5kcG9pbnQnKTtcbiAgdmFyIHRndE1hbkVuZHB0ID0gZWRnZS5wc3R5bGUoJ3RhcmdldC1lbmRwb2ludCcpO1xuICB2YXIgaGF2ZU1hbnVhbEVuZFB0cyA9IHNyY01hbkVuZHB0LnVuaXRzICE9IG51bGwgJiYgdGd0TWFuRW5kcHQudW5pdHMgIT0gbnVsbDtcbiAgdmFyIHJlY2FsY1ZlY3Rvck5vcm1JbnZlcnNlID0gZnVuY3Rpb24gcmVjYWxjVmVjdG9yTm9ybUludmVyc2UoeDEsIHkxLCB4MiwgeTIpIHtcbiAgICB2YXIgZHkgPSB5MiAtIHkxO1xuICAgIHZhciBkeCA9IHgyIC0geDE7XG4gICAgdmFyIGwgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgIHJldHVybiB7XG4gICAgICB4OiAtZHkgLyBsLFxuICAgICAgeTogZHggLyBsXG4gICAgfTtcbiAgfTtcbiAgdmFyIGVkZ2VEaXN0YW5jZXMgPSBlZGdlLnBzdHlsZSgnZWRnZS1kaXN0YW5jZXMnKS52YWx1ZTtcbiAgc3dpdGNoIChlZGdlRGlzdGFuY2VzKSB7XG4gICAgY2FzZSAnbm9kZS1wb3NpdGlvbic6XG4gICAgICBtaWRwdFB0cyA9IHBvc1B0cztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ludGVyc2VjdGlvbic6XG4gICAgICBtaWRwdFB0cyA9IGludGVyc2VjdGlvblB0cztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2VuZHBvaW50cyc6XG4gICAgICB7XG4gICAgICAgIGlmIChoYXZlTWFudWFsRW5kUHRzKSB7XG4gICAgICAgICAgdmFyIF90aGlzJG1hbnVhbEVuZHB0VG9QeCA9IHRoaXMubWFudWFsRW5kcHRUb1B4KGVkZ2Uuc291cmNlKClbMF0sIHNyY01hbkVuZHB0KSxcbiAgICAgICAgICAgIF90aGlzJG1hbnVhbEVuZHB0VG9QeDIgPSBfc2xpY2VkVG9BcnJheShfdGhpcyRtYW51YWxFbmRwdFRvUHgsIDIpLFxuICAgICAgICAgICAgeDEgPSBfdGhpcyRtYW51YWxFbmRwdFRvUHgyWzBdLFxuICAgICAgICAgICAgeTEgPSBfdGhpcyRtYW51YWxFbmRwdFRvUHgyWzFdO1xuICAgICAgICAgIHZhciBfdGhpcyRtYW51YWxFbmRwdFRvUHgzID0gdGhpcy5tYW51YWxFbmRwdFRvUHgoZWRnZS50YXJnZXQoKVswXSwgdGd0TWFuRW5kcHQpLFxuICAgICAgICAgICAgX3RoaXMkbWFudWFsRW5kcHRUb1B4NCA9IF9zbGljZWRUb0FycmF5KF90aGlzJG1hbnVhbEVuZHB0VG9QeDMsIDIpLFxuICAgICAgICAgICAgeDIgPSBfdGhpcyRtYW51YWxFbmRwdFRvUHg0WzBdLFxuICAgICAgICAgICAgeTIgPSBfdGhpcyRtYW51YWxFbmRwdFRvUHg0WzFdO1xuICAgICAgICAgIHZhciBlbmRQdHMgPSB7XG4gICAgICAgICAgICB4MTogeDEsXG4gICAgICAgICAgICB5MTogeTEsXG4gICAgICAgICAgICB4MjogeDIsXG4gICAgICAgICAgICB5MjogeTJcbiAgICAgICAgICB9O1xuICAgICAgICAgIHZlY3Rvck5vcm1JbnZlcnNlID0gcmVjYWxjVmVjdG9yTm9ybUludmVyc2UoeDEsIHkxLCB4MiwgeTIpO1xuICAgICAgICAgIG1pZHB0UHRzID0gZW5kUHRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhcm4oXCJFZGdlIFwiLmNvbmNhdChlZGdlLmlkKCksIFwiIGhhcyBlZGdlLWRpc3RhbmNlczplbmRwb2ludHMgc3BlY2lmaWVkIHdpdGhvdXQgbWFudWFsIGVuZHBvaW50cyBzcGVjaWZpZWQgdmlhIHNvdXJjZS1lbmRwb2ludCBhbmQgdGFyZ2V0LWVuZHBvaW50LiAgRmFsbGluZyBiYWNrIG9uIGVkZ2UtZGlzdGFuY2VzOmludGVyc2VjdGlvbiAoZGVmYXVsdCkuXCIpKTtcbiAgICAgICAgICBtaWRwdFB0cyA9IGludGVyc2VjdGlvblB0czsgLy8gYmFjayB0byBkZWZhdWx0XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIG1pZHB0UHRzOiBtaWRwdFB0cyxcbiAgICB2ZWN0b3JOb3JtSW52ZXJzZTogdmVjdG9yTm9ybUludmVyc2VcbiAgfTtcbn07XG5CUnAkYy5maW5kSGF5c3RhY2tQb2ludHMgPSBmdW5jdGlvbiAoZWRnZXMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlZGdlID0gZWRnZXNbaV07XG4gICAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgICBpZiAoIXJzLmhheXN0YWNrKSB7XG4gICAgICB2YXIgYW5nbGUgPSBNYXRoLnJhbmRvbSgpICogMiAqIE1hdGguUEk7XG4gICAgICBycy5zb3VyY2UgPSB7XG4gICAgICAgIHg6IE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgeTogTWF0aC5zaW4oYW5nbGUpXG4gICAgICB9O1xuICAgICAgYW5nbGUgPSBNYXRoLnJhbmRvbSgpICogMiAqIE1hdGguUEk7XG4gICAgICBycy50YXJnZXQgPSB7XG4gICAgICAgIHg6IE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgeTogTWF0aC5zaW4oYW5nbGUpXG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgc3JjID0gX3Auc291cmNlO1xuICAgIHZhciB0Z3QgPSBfcC50YXJnZXQ7XG4gICAgdmFyIHNyY1BvcyA9IHNyYy5wb3NpdGlvbigpO1xuICAgIHZhciB0Z3RQb3MgPSB0Z3QucG9zaXRpb24oKTtcbiAgICB2YXIgc3JjVyA9IHNyYy53aWR0aCgpO1xuICAgIHZhciB0Z3RXID0gdGd0LndpZHRoKCk7XG4gICAgdmFyIHNyY0ggPSBzcmMuaGVpZ2h0KCk7XG4gICAgdmFyIHRndEggPSB0Z3QuaGVpZ2h0KCk7XG4gICAgdmFyIHJhZGl1cyA9IGVkZ2UucHN0eWxlKCdoYXlzdGFjay1yYWRpdXMnKS52YWx1ZTtcbiAgICB2YXIgaGFsZlJhZGl1cyA9IHJhZGl1cyAvIDI7IC8vIGIvYyBoYXZlIHRvIGhhbGYgd2lkdGgvaGVpZ2h0XG5cbiAgICBycy5oYXlzdGFja1B0cyA9IHJzLmFsbHB0cyA9IFtycy5zb3VyY2UueCAqIHNyY1cgKiBoYWxmUmFkaXVzICsgc3JjUG9zLngsIHJzLnNvdXJjZS55ICogc3JjSCAqIGhhbGZSYWRpdXMgKyBzcmNQb3MueSwgcnMudGFyZ2V0LnggKiB0Z3RXICogaGFsZlJhZGl1cyArIHRndFBvcy54LCBycy50YXJnZXQueSAqIHRndEggKiBoYWxmUmFkaXVzICsgdGd0UG9zLnldO1xuICAgIHJzLm1pZFggPSAocnMuYWxscHRzWzBdICsgcnMuYWxscHRzWzJdKSAvIDI7XG4gICAgcnMubWlkWSA9IChycy5hbGxwdHNbMV0gKyBycy5hbGxwdHNbM10pIC8gMjtcblxuICAgIC8vIGFsd2F5cyBvdmVycmlkZSBhcyBoYXlzdGFjayBpbiBjYXNlIHNldCB0byBkaWZmZXJlbnQgdHlwZSBwcmV2aW91c2x5XG4gICAgcnMuZWRnZVR5cGUgPSAnaGF5c3RhY2snO1xuICAgIHJzLmhheXN0YWNrID0gdHJ1ZTtcbiAgICB0aGlzLnN0b3JlRWRnZVByb2plY3Rpb25zKGVkZ2UpO1xuICAgIHRoaXMuY2FsY3VsYXRlQXJyb3dBbmdsZXMoZWRnZSk7XG4gICAgdGhpcy5yZWNhbGN1bGF0ZUVkZ2VMYWJlbFByb2plY3Rpb25zKGVkZ2UpO1xuICAgIHRoaXMuY2FsY3VsYXRlTGFiZWxBbmdsZXMoZWRnZSk7XG4gIH1cbn07XG5CUnAkYy5maW5kU2VnbWVudHNQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSwgcGFpckluZm8pIHtcbiAgLy8gU2VnbWVudHMgKG11bHRpcGxlIHN0cmFpZ2h0IGxpbmVzKVxuXG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBzZWdtZW50V3MgPSBlZGdlLnBzdHlsZSgnc2VnbWVudC13ZWlnaHRzJyk7XG4gIHZhciBzZWdtZW50RHMgPSBlZGdlLnBzdHlsZSgnc2VnbWVudC1kaXN0YW5jZXMnKTtcbiAgdmFyIHNlZ21lbnRzTiA9IE1hdGgubWluKHNlZ21lbnRXcy5wZlZhbHVlLmxlbmd0aCwgc2VnbWVudERzLnBmVmFsdWUubGVuZ3RoKTtcbiAgcnMuZWRnZVR5cGUgPSAnc2VnbWVudHMnO1xuICBycy5zZWdwdHMgPSBbXTtcbiAgZm9yICh2YXIgcyA9IDA7IHMgPCBzZWdtZW50c047IHMrKykge1xuICAgIHZhciB3ID0gc2VnbWVudFdzLnBmVmFsdWVbc107XG4gICAgdmFyIGQgPSBzZWdtZW50RHMucGZWYWx1ZVtzXTtcbiAgICB2YXIgdzEgPSAxIC0gdztcbiAgICB2YXIgdzIgPSB3O1xuICAgIHZhciBfdGhpcyRmaW5kTWlkcHRQdHNFdGMgPSB0aGlzLmZpbmRNaWRwdFB0c0V0YyhlZGdlLCBwYWlySW5mbyksXG4gICAgICBtaWRwdFB0cyA9IF90aGlzJGZpbmRNaWRwdFB0c0V0Yy5taWRwdFB0cyxcbiAgICAgIHZlY3Rvck5vcm1JbnZlcnNlID0gX3RoaXMkZmluZE1pZHB0UHRzRXRjLnZlY3Rvck5vcm1JbnZlcnNlO1xuICAgIHZhciBhZGp1c3RlZE1pZHB0ID0ge1xuICAgICAgeDogbWlkcHRQdHMueDEgKiB3MSArIG1pZHB0UHRzLngyICogdzIsXG4gICAgICB5OiBtaWRwdFB0cy55MSAqIHcxICsgbWlkcHRQdHMueTIgKiB3MlxuICAgIH07XG4gICAgcnMuc2VncHRzLnB1c2goYWRqdXN0ZWRNaWRwdC54ICsgdmVjdG9yTm9ybUludmVyc2UueCAqIGQsIGFkanVzdGVkTWlkcHQueSArIHZlY3Rvck5vcm1JbnZlcnNlLnkgKiBkKTtcbiAgfVxufTtcbkJScCRjLmZpbmRMb29wUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UsIHBhaXJJbmZvLCBpLCBlZGdlSXNVbmJ1bmRsZWQpIHtcbiAgLy8gU2VsZi1lZGdlXG5cbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIGRpckNvdW50cyA9IHBhaXJJbmZvLmRpckNvdW50cyxcbiAgICBzcmNQb3MgPSBwYWlySW5mby5zcmNQb3M7XG4gIHZhciBjdHJscHREaXN0cyA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LWRpc3RhbmNlcycpO1xuICB2YXIgY3RybHB0RGlzdCA9IGN0cmxwdERpc3RzID8gY3RybHB0RGlzdHMucGZWYWx1ZVswXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGxvb3BEaXIgPSBlZGdlLnBzdHlsZSgnbG9vcC1kaXJlY3Rpb24nKS5wZlZhbHVlO1xuICB2YXIgbG9vcFN3cCA9IGVkZ2UucHN0eWxlKCdsb29wLXN3ZWVwJykucGZWYWx1ZTtcbiAgdmFyIHN0ZXBTaXplID0gZWRnZS5wc3R5bGUoJ2NvbnRyb2wtcG9pbnQtc3RlcC1zaXplJykucGZWYWx1ZTtcbiAgcnMuZWRnZVR5cGUgPSAnc2VsZic7XG4gIHZhciBqID0gaTtcbiAgdmFyIGxvb3BEaXN0ID0gc3RlcFNpemU7XG4gIGlmIChlZGdlSXNVbmJ1bmRsZWQpIHtcbiAgICBqID0gMDtcbiAgICBsb29wRGlzdCA9IGN0cmxwdERpc3Q7XG4gIH1cbiAgdmFyIGxvb3BBbmdsZSA9IGxvb3BEaXIgLSBNYXRoLlBJIC8gMjtcbiAgdmFyIG91dEFuZ2xlID0gbG9vcEFuZ2xlIC0gbG9vcFN3cCAvIDI7XG4gIHZhciBpbkFuZ2xlID0gbG9vcEFuZ2xlICsgbG9vcFN3cCAvIDI7XG5cbiAgLy8gaW5jcmVhc2UgYnkgc3RlcCBzaXplIGZvciBvdmVybGFwcGluZyBsb29wcywga2V5ZWQgb24gZGlyZWN0aW9uIGFuZCBzd2VlcCB2YWx1ZXNcbiAgdmFyIGRjID0gU3RyaW5nKGxvb3BEaXIgKyAnXycgKyBsb29wU3dwKTtcbiAgaiA9IGRpckNvdW50c1tkY10gPT09IHVuZGVmaW5lZCA/IGRpckNvdW50c1tkY10gPSAwIDogKytkaXJDb3VudHNbZGNdO1xuICBycy5jdHJscHRzID0gW3NyY1Bvcy54ICsgTWF0aC5jb3Mob3V0QW5nbGUpICogMS40ICogbG9vcERpc3QgKiAoaiAvIDMgKyAxKSwgc3JjUG9zLnkgKyBNYXRoLnNpbihvdXRBbmdsZSkgKiAxLjQgKiBsb29wRGlzdCAqIChqIC8gMyArIDEpLCBzcmNQb3MueCArIE1hdGguY29zKGluQW5nbGUpICogMS40ICogbG9vcERpc3QgKiAoaiAvIDMgKyAxKSwgc3JjUG9zLnkgKyBNYXRoLnNpbihpbkFuZ2xlKSAqIDEuNCAqIGxvb3BEaXN0ICogKGogLyAzICsgMSldO1xufTtcbkJScCRjLmZpbmRDb21wb3VuZExvb3BQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSwgcGFpckluZm8sIGksIGVkZ2VJc1VuYnVuZGxlZCkge1xuICAvLyBDb21wb3VuZCBlZGdlXG5cbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgcnMuZWRnZVR5cGUgPSAnY29tcG91bmQnO1xuICB2YXIgc3JjUG9zID0gcGFpckluZm8uc3JjUG9zLFxuICAgIHRndFBvcyA9IHBhaXJJbmZvLnRndFBvcyxcbiAgICBzcmNXID0gcGFpckluZm8uc3JjVyxcbiAgICBzcmNIID0gcGFpckluZm8uc3JjSCxcbiAgICB0Z3RXID0gcGFpckluZm8udGd0VyxcbiAgICB0Z3RIID0gcGFpckluZm8udGd0SDtcbiAgdmFyIHN0ZXBTaXplID0gZWRnZS5wc3R5bGUoJ2NvbnRyb2wtcG9pbnQtc3RlcC1zaXplJykucGZWYWx1ZTtcbiAgdmFyIGN0cmxwdERpc3RzID0gZWRnZS5wc3R5bGUoJ2NvbnRyb2wtcG9pbnQtZGlzdGFuY2VzJyk7XG4gIHZhciBjdHJscHREaXN0ID0gY3RybHB0RGlzdHMgPyBjdHJscHREaXN0cy5wZlZhbHVlWzBdIDogdW5kZWZpbmVkO1xuICB2YXIgaiA9IGk7XG4gIHZhciBsb29wRGlzdCA9IHN0ZXBTaXplO1xuICBpZiAoZWRnZUlzVW5idW5kbGVkKSB7XG4gICAgaiA9IDA7XG4gICAgbG9vcERpc3QgPSBjdHJscHREaXN0O1xuICB9XG4gIHZhciBsb29wVyA9IDUwO1xuICB2YXIgbG9vcGFQb3MgPSB7XG4gICAgeDogc3JjUG9zLnggLSBzcmNXIC8gMixcbiAgICB5OiBzcmNQb3MueSAtIHNyY0ggLyAyXG4gIH07XG4gIHZhciBsb29wYlBvcyA9IHtcbiAgICB4OiB0Z3RQb3MueCAtIHRndFcgLyAyLFxuICAgIHk6IHRndFBvcy55IC0gdGd0SCAvIDJcbiAgfTtcbiAgdmFyIGxvb3BQb3MgPSB7XG4gICAgeDogTWF0aC5taW4obG9vcGFQb3MueCwgbG9vcGJQb3MueCksXG4gICAgeTogTWF0aC5taW4obG9vcGFQb3MueSwgbG9vcGJQb3MueSlcbiAgfTtcblxuICAvLyBhdm9pZHMgY2FzZXMgd2l0aCBpbXBvc3NpYmxlIGJlemllcnNcbiAgdmFyIG1pbkNvbXBvdW5kU3RyZXRjaCA9IDAuNTtcbiAgdmFyIGNvbXBvdW5kU3RyZXRjaEEgPSBNYXRoLm1heChtaW5Db21wb3VuZFN0cmV0Y2gsIE1hdGgubG9nKHNyY1cgKiAwLjAxKSk7XG4gIHZhciBjb21wb3VuZFN0cmV0Y2hCID0gTWF0aC5tYXgobWluQ29tcG91bmRTdHJldGNoLCBNYXRoLmxvZyh0Z3RXICogMC4wMSkpO1xuICBycy5jdHJscHRzID0gW2xvb3BQb3MueCwgbG9vcFBvcy55IC0gKDEgKyBNYXRoLnBvdyhsb29wVywgMS4xMikgLyAxMDApICogbG9vcERpc3QgKiAoaiAvIDMgKyAxKSAqIGNvbXBvdW5kU3RyZXRjaEEsIGxvb3BQb3MueCAtICgxICsgTWF0aC5wb3cobG9vcFcsIDEuMTIpIC8gMTAwKSAqIGxvb3BEaXN0ICogKGogLyAzICsgMSkgKiBjb21wb3VuZFN0cmV0Y2hCLCBsb29wUG9zLnldO1xufTtcbkJScCRjLmZpbmRTdHJhaWdodEVkZ2VQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICAvLyBTdHJhaWdodCBlZGdlIHdpdGhpbiBidW5kbGVcblxuICBlZGdlLl9wcml2YXRlLnJzY3JhdGNoLmVkZ2VUeXBlID0gJ3N0cmFpZ2h0Jztcbn07XG5CUnAkYy5maW5kQmV6aWVyUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UsIHBhaXJJbmZvLCBpLCBlZGdlSXNVbmJ1bmRsZWQsIGVkZ2VJc1N3YXBwZWQpIHtcbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIHN0ZXBTaXplID0gZWRnZS5wc3R5bGUoJ2NvbnRyb2wtcG9pbnQtc3RlcC1zaXplJykucGZWYWx1ZTtcbiAgdmFyIGN0cmxwdERpc3RzID0gZWRnZS5wc3R5bGUoJ2NvbnRyb2wtcG9pbnQtZGlzdGFuY2VzJyk7XG4gIHZhciBjdHJscHRXcyA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LXdlaWdodHMnKTtcbiAgdmFyIGJlemllck4gPSBjdHJscHREaXN0cyAmJiBjdHJscHRXcyA/IE1hdGgubWluKGN0cmxwdERpc3RzLnZhbHVlLmxlbmd0aCwgY3RybHB0V3MudmFsdWUubGVuZ3RoKSA6IDE7XG4gIHZhciBjdHJscHREaXN0ID0gY3RybHB0RGlzdHMgPyBjdHJscHREaXN0cy5wZlZhbHVlWzBdIDogdW5kZWZpbmVkO1xuICB2YXIgY3RybHB0V2VpZ2h0ID0gY3RybHB0V3MudmFsdWVbMF07XG5cbiAgLy8gKE11bHRpKWJlemllclxuXG4gIHZhciBtdWx0aSA9IGVkZ2VJc1VuYnVuZGxlZDtcbiAgcnMuZWRnZVR5cGUgPSBtdWx0aSA/ICdtdWx0aWJlemllcicgOiAnYmV6aWVyJztcbiAgcnMuY3RybHB0cyA9IFtdO1xuICBmb3IgKHZhciBiID0gMDsgYiA8IGJlemllck47IGIrKykge1xuICAgIHZhciBub3JtY3RybHB0RGlzdCA9ICgwLjUgLSBwYWlySW5mby5lbGVzLmxlbmd0aCAvIDIgKyBpKSAqIHN0ZXBTaXplICogKGVkZ2VJc1N3YXBwZWQgPyAtMSA6IDEpO1xuICAgIHZhciBtYW5jdHJscHREaXN0ID0gdm9pZCAwO1xuICAgIHZhciBzaWduID0gc2lnbnVtKG5vcm1jdHJscHREaXN0KTtcbiAgICBpZiAobXVsdGkpIHtcbiAgICAgIGN0cmxwdERpc3QgPSBjdHJscHREaXN0cyA/IGN0cmxwdERpc3RzLnBmVmFsdWVbYl0gOiBzdGVwU2l6ZTsgLy8gZmFsbCBiYWNrIG9uIHN0ZXAgc2l6ZVxuICAgICAgY3RybHB0V2VpZ2h0ID0gY3RybHB0V3MudmFsdWVbYl07XG4gICAgfVxuICAgIGlmIChlZGdlSXNVbmJ1bmRsZWQpIHtcbiAgICAgIC8vIG11bHRpIG9yIHNpbmdsZSB1bmJ1bmRsZWRcbiAgICAgIG1hbmN0cmxwdERpc3QgPSBjdHJscHREaXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBtYW5jdHJscHREaXN0ID0gY3RybHB0RGlzdCAhPT0gdW5kZWZpbmVkID8gc2lnbiAqIGN0cmxwdERpc3QgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHZhciBkaXN0YW5jZUZyb21NaWRwb2ludCA9IG1hbmN0cmxwdERpc3QgIT09IHVuZGVmaW5lZCA/IG1hbmN0cmxwdERpc3QgOiBub3JtY3RybHB0RGlzdDtcbiAgICB2YXIgdzEgPSAxIC0gY3RybHB0V2VpZ2h0O1xuICAgIHZhciB3MiA9IGN0cmxwdFdlaWdodDtcbiAgICB2YXIgX3RoaXMkZmluZE1pZHB0UHRzRXRjMiA9IHRoaXMuZmluZE1pZHB0UHRzRXRjKGVkZ2UsIHBhaXJJbmZvKSxcbiAgICAgIG1pZHB0UHRzID0gX3RoaXMkZmluZE1pZHB0UHRzRXRjMi5taWRwdFB0cyxcbiAgICAgIHZlY3Rvck5vcm1JbnZlcnNlID0gX3RoaXMkZmluZE1pZHB0UHRzRXRjMi52ZWN0b3JOb3JtSW52ZXJzZTtcbiAgICB2YXIgYWRqdXN0ZWRNaWRwdCA9IHtcbiAgICAgIHg6IG1pZHB0UHRzLngxICogdzEgKyBtaWRwdFB0cy54MiAqIHcyLFxuICAgICAgeTogbWlkcHRQdHMueTEgKiB3MSArIG1pZHB0UHRzLnkyICogdzJcbiAgICB9O1xuICAgIHJzLmN0cmxwdHMucHVzaChhZGp1c3RlZE1pZHB0LnggKyB2ZWN0b3JOb3JtSW52ZXJzZS54ICogZGlzdGFuY2VGcm9tTWlkcG9pbnQsIGFkanVzdGVkTWlkcHQueSArIHZlY3Rvck5vcm1JbnZlcnNlLnkgKiBkaXN0YW5jZUZyb21NaWRwb2ludCk7XG4gIH1cbn07XG5CUnAkYy5maW5kVGF4aVBvaW50cyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbykge1xuICAvLyBUYXhpY2FiIGdlb21ldHJ5IHdpdGggdHdvIHR1cm5zIG1heGltdW1cblxuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICBycy5lZGdlVHlwZSA9ICdzZWdtZW50cyc7XG4gIHZhciBWRVJUSUNBTCA9ICd2ZXJ0aWNhbCc7XG4gIHZhciBIT1JJWk9OVEFMID0gJ2hvcml6b250YWwnO1xuICB2YXIgTEVGVFdBUkQgPSAnbGVmdHdhcmQnO1xuICB2YXIgUklHSFRXQVJEID0gJ3JpZ2h0d2FyZCc7XG4gIHZhciBET1dOV0FSRCA9ICdkb3dud2FyZCc7XG4gIHZhciBVUFdBUkQgPSAndXB3YXJkJztcbiAgdmFyIEFVVE8gPSAnYXV0byc7XG4gIHZhciBwb3NQdHMgPSBwYWlySW5mby5wb3NQdHMsXG4gICAgc3JjVyA9IHBhaXJJbmZvLnNyY1csXG4gICAgc3JjSCA9IHBhaXJJbmZvLnNyY0gsXG4gICAgdGd0VyA9IHBhaXJJbmZvLnRndFcsXG4gICAgdGd0SCA9IHBhaXJJbmZvLnRndEg7XG4gIHZhciBlZGdlRGlzdGFuY2VzID0gZWRnZS5wc3R5bGUoJ2VkZ2UtZGlzdGFuY2VzJykudmFsdWU7XG4gIHZhciBkSW5jbHVkZXNOb2RlQm9keSA9IGVkZ2VEaXN0YW5jZXMgIT09ICdub2RlLXBvc2l0aW9uJztcbiAgdmFyIHRheGlEaXIgPSBlZGdlLnBzdHlsZSgndGF4aS1kaXJlY3Rpb24nKS52YWx1ZTtcbiAgdmFyIHJhd1RheGlEaXIgPSB0YXhpRGlyOyAvLyB1bnByb2Nlc3NlZCB2YWx1ZVxuICB2YXIgdGF4aVR1cm4gPSBlZGdlLnBzdHlsZSgndGF4aS10dXJuJyk7XG4gIHZhciB0dXJuSXNQZXJjZW50ID0gdGF4aVR1cm4udW5pdHMgPT09ICclJztcbiAgdmFyIHRheGlUdXJuUGZWYWwgPSB0YXhpVHVybi5wZlZhbHVlO1xuICB2YXIgdHVybklzTmVnYXRpdmUgPSB0YXhpVHVyblBmVmFsIDwgMDsgLy8gaS5lLiBmcm9tIHRhcmdldCBzaWRlXG4gIHZhciBtaW5EID0gZWRnZS5wc3R5bGUoJ3RheGktdHVybi1taW4tZGlzdGFuY2UnKS5wZlZhbHVlO1xuICB2YXIgZHcgPSBkSW5jbHVkZXNOb2RlQm9keSA/IChzcmNXICsgdGd0VykgLyAyIDogMDtcbiAgdmFyIGRoID0gZEluY2x1ZGVzTm9kZUJvZHkgPyAoc3JjSCArIHRndEgpIC8gMiA6IDA7XG4gIHZhciBwZHggPSBwb3NQdHMueDIgLSBwb3NQdHMueDE7XG4gIHZhciBwZHkgPSBwb3NQdHMueTIgLSBwb3NQdHMueTE7XG5cbiAgLy8gdGFrZSBhd2F5IHRoZSBlZmZlY3RpdmUgdy9oIGZyb20gdGhlIG1hZ25pdHVkZSBvZiB0aGUgZGVsdGEgdmFsdWVcbiAgdmFyIHN1YkRXSCA9IGZ1bmN0aW9uIHN1YkRXSChkeHksIGR3aCkge1xuICAgIGlmIChkeHkgPiAwKSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoZHh5IC0gZHdoLCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIE1hdGgubWluKGR4eSArIGR3aCwgMCk7XG4gICAgfVxuICB9O1xuICB2YXIgZHggPSBzdWJEV0gocGR4LCBkdyk7XG4gIHZhciBkeSA9IHN1YkRXSChwZHksIGRoKTtcbiAgdmFyIGlzRXhwbGljaXREaXIgPSBmYWxzZTtcbiAgaWYgKHJhd1RheGlEaXIgPT09IEFVVE8pIHtcbiAgICB0YXhpRGlyID0gTWF0aC5hYnMoZHgpID4gTWF0aC5hYnMoZHkpID8gSE9SSVpPTlRBTCA6IFZFUlRJQ0FMO1xuICB9IGVsc2UgaWYgKHJhd1RheGlEaXIgPT09IFVQV0FSRCB8fCByYXdUYXhpRGlyID09PSBET1dOV0FSRCkge1xuICAgIHRheGlEaXIgPSBWRVJUSUNBTDtcbiAgICBpc0V4cGxpY2l0RGlyID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChyYXdUYXhpRGlyID09PSBMRUZUV0FSRCB8fCByYXdUYXhpRGlyID09PSBSSUdIVFdBUkQpIHtcbiAgICB0YXhpRGlyID0gSE9SSVpPTlRBTDtcbiAgICBpc0V4cGxpY2l0RGlyID0gdHJ1ZTtcbiAgfVxuICB2YXIgaXNWZXJ0ID0gdGF4aURpciA9PT0gVkVSVElDQUw7XG4gIHZhciBsID0gaXNWZXJ0ID8gZHkgOiBkeDtcbiAgdmFyIHBsID0gaXNWZXJ0ID8gcGR5IDogcGR4O1xuICB2YXIgc2duTCA9IHNpZ251bShwbCk7XG4gIHZhciBmb3JjZWREaXIgPSBmYWxzZTtcbiAgaWYgKCEoaXNFeHBsaWNpdERpciAmJiAodHVybklzUGVyY2VudCB8fCB0dXJuSXNOZWdhdGl2ZSkpIC8vIGZvcmNpbmcgaW4gdGhpcyBjYXNlIHdvdWxkIGNhdXNlIHdlaXJkIGdyb3dpbmcgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvblxuICAmJiAocmF3VGF4aURpciA9PT0gRE9XTldBUkQgJiYgcGwgPCAwIHx8IHJhd1RheGlEaXIgPT09IFVQV0FSRCAmJiBwbCA+IDAgfHwgcmF3VGF4aURpciA9PT0gTEVGVFdBUkQgJiYgcGwgPiAwIHx8IHJhd1RheGlEaXIgPT09IFJJR0hUV0FSRCAmJiBwbCA8IDApKSB7XG4gICAgc2duTCAqPSAtMTtcbiAgICBsID0gc2duTCAqIE1hdGguYWJzKGwpO1xuICAgIGZvcmNlZERpciA9IHRydWU7XG4gIH1cbiAgdmFyIGQ7XG4gIGlmICh0dXJuSXNQZXJjZW50KSB7XG4gICAgdmFyIHAgPSB0YXhpVHVyblBmVmFsIDwgMCA/IDEgKyB0YXhpVHVyblBmVmFsIDogdGF4aVR1cm5QZlZhbDtcbiAgICBkID0gcCAqIGw7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGsgPSB0YXhpVHVyblBmVmFsIDwgMCA/IGwgOiAwO1xuICAgIGQgPSBrICsgdGF4aVR1cm5QZlZhbCAqIHNnbkw7XG4gIH1cbiAgdmFyIGdldElzVG9vQ2xvc2UgPSBmdW5jdGlvbiBnZXRJc1Rvb0Nsb3NlKGQpIHtcbiAgICByZXR1cm4gTWF0aC5hYnMoZCkgPCBtaW5EIHx8IE1hdGguYWJzKGQpID49IE1hdGguYWJzKGwpO1xuICB9O1xuICB2YXIgaXNUb29DbG9zZVNyYyA9IGdldElzVG9vQ2xvc2UoZCk7XG4gIHZhciBpc1Rvb0Nsb3NlVGd0ID0gZ2V0SXNUb29DbG9zZShNYXRoLmFicyhsKSAtIE1hdGguYWJzKGQpKTtcbiAgdmFyIGlzVG9vQ2xvc2UgPSBpc1Rvb0Nsb3NlU3JjIHx8IGlzVG9vQ2xvc2VUZ3Q7XG4gIGlmIChpc1Rvb0Nsb3NlICYmICFmb3JjZWREaXIpIHtcbiAgICAvLyBub24taWRlYWwgcm91dGluZ1xuICAgIGlmIChpc1ZlcnQpIHtcbiAgICAgIC8vIHZlcnRpY2FsIGZhbGxiYWNrc1xuICAgICAgdmFyIGxTaGFwZUluc2lkZVNyYyA9IE1hdGguYWJzKHBsKSA8PSBzcmNIIC8gMjtcbiAgICAgIHZhciBsU2hhcGVJbnNpZGVUZ3QgPSBNYXRoLmFicyhwZHgpIDw9IHRndFcgLyAyO1xuICAgICAgaWYgKGxTaGFwZUluc2lkZVNyYykge1xuICAgICAgICAvLyBob3Jpem9udGFsIFotc2hhcGUgKGRpcmVjdGlvbiBub3QgcmVzcGVjdGVkKVxuICAgICAgICB2YXIgeCA9IChwb3NQdHMueDEgKyBwb3NQdHMueDIpIC8gMjtcbiAgICAgICAgdmFyIHkxID0gcG9zUHRzLnkxLFxuICAgICAgICAgIHkyID0gcG9zUHRzLnkyO1xuICAgICAgICBycy5zZWdwdHMgPSBbeCwgeTEsIHgsIHkyXTtcbiAgICAgIH0gZWxzZSBpZiAobFNoYXBlSW5zaWRlVGd0KSB7XG4gICAgICAgIC8vIHZlcnRpY2FsIFotc2hhcGUgKGRpc3RhbmNlIG5vdCByZXNwZWN0ZWQpXG4gICAgICAgIHZhciB5ID0gKHBvc1B0cy55MSArIHBvc1B0cy55MikgLyAyO1xuICAgICAgICB2YXIgeDEgPSBwb3NQdHMueDEsXG4gICAgICAgICAgeDIgPSBwb3NQdHMueDI7XG4gICAgICAgIHJzLnNlZ3B0cyA9IFt4MSwgeSwgeDIsIHldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTC1zaGFwZSBmYWxsYmFjayAodHVybiBkaXN0YW5jZSBub3QgcmVzcGVjdGVkLCBidXQgd29ya3Mgd2VsbCB3aXRoIHRyZWUgc2libGluZ3MpXG4gICAgICAgIHJzLnNlZ3B0cyA9IFtwb3NQdHMueDEsIHBvc1B0cy55Ml07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGhvcml6b250YWwgZmFsbGJhY2tzXG4gICAgICB2YXIgX2xTaGFwZUluc2lkZVNyYyA9IE1hdGguYWJzKHBsKSA8PSBzcmNXIC8gMjtcbiAgICAgIHZhciBfbFNoYXBlSW5zaWRlVGd0ID0gTWF0aC5hYnMocGR5KSA8PSB0Z3RIIC8gMjtcbiAgICAgIGlmIChfbFNoYXBlSW5zaWRlU3JjKSB7XG4gICAgICAgIC8vIHZlcnRpY2FsIFotc2hhcGUgKGRpcmVjdGlvbiBub3QgcmVzcGVjdGVkKVxuICAgICAgICB2YXIgX3kgPSAocG9zUHRzLnkxICsgcG9zUHRzLnkyKSAvIDI7XG4gICAgICAgIHZhciBfeCA9IHBvc1B0cy54MSxcbiAgICAgICAgICBfeDIgPSBwb3NQdHMueDI7XG4gICAgICAgIHJzLnNlZ3B0cyA9IFtfeCwgX3ksIF94MiwgX3ldO1xuICAgICAgfSBlbHNlIGlmIChfbFNoYXBlSW5zaWRlVGd0KSB7XG4gICAgICAgIC8vIGhvcml6b250YWwgWi1zaGFwZSAodHVybiBkaXN0YW5jZSBub3QgcmVzcGVjdGVkKVxuICAgICAgICB2YXIgX3gzID0gKHBvc1B0cy54MSArIHBvc1B0cy54MikgLyAyO1xuICAgICAgICB2YXIgX3kyID0gcG9zUHRzLnkxLFxuICAgICAgICAgIF95MyA9IHBvc1B0cy55MjtcbiAgICAgICAgcnMuc2VncHRzID0gW194MywgX3kyLCBfeDMsIF95M107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBMLXNoYXBlICh0dXJuIGRpc3RhbmNlIG5vdCByZXNwZWN0ZWQsIGJ1dCB3b3JrcyB3ZWxsIGZvciB0cmVlIHNpYmxpbmdzKVxuICAgICAgICBycy5zZWdwdHMgPSBbcG9zUHRzLngyLCBwb3NQdHMueTFdO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBpZGVhbCByb3V0aW5nXG4gICAgaWYgKGlzVmVydCkge1xuICAgICAgdmFyIF95NCA9IHBvc1B0cy55MSArIGQgKyAoZEluY2x1ZGVzTm9kZUJvZHkgPyBzcmNIIC8gMiAqIHNnbkwgOiAwKTtcbiAgICAgIHZhciBfeDQgPSBwb3NQdHMueDEsXG4gICAgICAgIF94NSA9IHBvc1B0cy54MjtcbiAgICAgIHJzLnNlZ3B0cyA9IFtfeDQsIF95NCwgX3g1LCBfeTRdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBob3Jpem9udGFsXG4gICAgICB2YXIgX3g2ID0gcG9zUHRzLngxICsgZCArIChkSW5jbHVkZXNOb2RlQm9keSA/IHNyY1cgLyAyICogc2duTCA6IDApO1xuICAgICAgdmFyIF95NSA9IHBvc1B0cy55MSxcbiAgICAgICAgX3k2ID0gcG9zUHRzLnkyO1xuICAgICAgcnMuc2VncHRzID0gW194NiwgX3k1LCBfeDYsIF95Nl07XG4gICAgfVxuICB9XG59O1xuQlJwJGMudHJ5VG9Db3JyZWN0SW52YWxpZFBvaW50cyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbykge1xuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuXG4gIC8vIGNhbiBvbmx5IGNvcnJlY3QgYmV6aWVycyBmb3Igbm93Li4uXG4gIGlmIChycy5lZGdlVHlwZSA9PT0gJ2JlemllcicpIHtcbiAgICB2YXIgc3JjUG9zID0gcGFpckluZm8uc3JjUG9zLFxuICAgICAgdGd0UG9zID0gcGFpckluZm8udGd0UG9zLFxuICAgICAgc3JjVyA9IHBhaXJJbmZvLnNyY1csXG4gICAgICBzcmNIID0gcGFpckluZm8uc3JjSCxcbiAgICAgIHRndFcgPSBwYWlySW5mby50Z3RXLFxuICAgICAgdGd0SCA9IHBhaXJJbmZvLnRndEgsXG4gICAgICBzcmNTaGFwZSA9IHBhaXJJbmZvLnNyY1NoYXBlLFxuICAgICAgdGd0U2hhcGUgPSBwYWlySW5mby50Z3RTaGFwZTtcbiAgICB2YXIgYmFkU3RhcnQgPSAhbnVtYmVyJDEocnMuc3RhcnRYKSB8fCAhbnVtYmVyJDEocnMuc3RhcnRZKTtcbiAgICB2YXIgYmFkQVN0YXJ0ID0gIW51bWJlciQxKHJzLmFycm93U3RhcnRYKSB8fCAhbnVtYmVyJDEocnMuYXJyb3dTdGFydFkpO1xuICAgIHZhciBiYWRFbmQgPSAhbnVtYmVyJDEocnMuZW5kWCkgfHwgIW51bWJlciQxKHJzLmVuZFkpO1xuICAgIHZhciBiYWRBRW5kID0gIW51bWJlciQxKHJzLmFycm93RW5kWCkgfHwgIW51bWJlciQxKHJzLmFycm93RW5kWSk7XG4gICAgdmFyIG1pbkNwQURpc3RGYWN0b3IgPSAzO1xuICAgIHZhciBhcnJvd1cgPSB0aGlzLmdldEFycm93V2lkdGgoZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZSwgZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykudmFsdWUpICogdGhpcy5hcnJvd1NoYXBlV2lkdGg7XG4gICAgdmFyIG1pbkNwQURpc3QgPSBtaW5DcEFEaXN0RmFjdG9yICogYXJyb3dXO1xuICAgIHZhciBzdGFydEFDcERpc3QgPSBkaXN0KHtcbiAgICAgIHg6IHJzLmN0cmxwdHNbMF0sXG4gICAgICB5OiBycy5jdHJscHRzWzFdXG4gICAgfSwge1xuICAgICAgeDogcnMuc3RhcnRYLFxuICAgICAgeTogcnMuc3RhcnRZXG4gICAgfSk7XG4gICAgdmFyIGNsb3NlU3RhcnRBQ3AgPSBzdGFydEFDcERpc3QgPCBtaW5DcEFEaXN0O1xuICAgIHZhciBlbmRBQ3BEaXN0ID0gZGlzdCh7XG4gICAgICB4OiBycy5jdHJscHRzWzBdLFxuICAgICAgeTogcnMuY3RybHB0c1sxXVxuICAgIH0sIHtcbiAgICAgIHg6IHJzLmVuZFgsXG4gICAgICB5OiBycy5lbmRZXG4gICAgfSk7XG4gICAgdmFyIGNsb3NlRW5kQUNwID0gZW5kQUNwRGlzdCA8IG1pbkNwQURpc3Q7XG4gICAgdmFyIG92ZXJsYXBwaW5nID0gZmFsc2U7XG4gICAgaWYgKGJhZFN0YXJ0IHx8IGJhZEFTdGFydCB8fCBjbG9zZVN0YXJ0QUNwKSB7XG4gICAgICBvdmVybGFwcGluZyA9IHRydWU7XG5cbiAgICAgIC8vIHByb2plY3QgY29udHJvbCBwb2ludCBhbG9uZyBsaW5lIGZyb20gc3JjIGNlbnRyZSB0byBvdXRzaWRlIHRoZSBzcmMgc2hhcGVcbiAgICAgIC8vIChvdGhlcndpc2UgaW50ZXJzZWN0aW9uIHdpbGwgeWllbGQgbm90aGluZylcbiAgICAgIHZhciBjcEQgPSB7XG4gICAgICAgIC8vIGRlbHRhXG4gICAgICAgIHg6IHJzLmN0cmxwdHNbMF0gLSBzcmNQb3MueCxcbiAgICAgICAgeTogcnMuY3RybHB0c1sxXSAtIHNyY1Bvcy55XG4gICAgICB9O1xuICAgICAgdmFyIGNwTCA9IE1hdGguc3FydChjcEQueCAqIGNwRC54ICsgY3BELnkgKiBjcEQueSk7IC8vIGxlbmd0aCBvZiBsaW5lXG4gICAgICB2YXIgY3BNID0ge1xuICAgICAgICAvLyBub3JtYWxpc2VkIGRlbHRhXG4gICAgICAgIHg6IGNwRC54IC8gY3BMLFxuICAgICAgICB5OiBjcEQueSAvIGNwTFxuICAgICAgfTtcbiAgICAgIHZhciByYWRpdXMgPSBNYXRoLm1heChzcmNXLCBzcmNIKTtcbiAgICAgIHZhciBjcFByb2ogPSB7XG4gICAgICAgIC8vICoyIHJhZGl1cyBndWFyYW50ZWVzIG91dHNpZGUgc2hhcGVcbiAgICAgICAgeDogcnMuY3RybHB0c1swXSArIGNwTS54ICogMiAqIHJhZGl1cyxcbiAgICAgICAgeTogcnMuY3RybHB0c1sxXSArIGNwTS55ICogMiAqIHJhZGl1c1xuICAgICAgfTtcbiAgICAgIHZhciBzcmNDdHJsUHRJbnRuID0gc3JjU2hhcGUuaW50ZXJzZWN0TGluZShzcmNQb3MueCwgc3JjUG9zLnksIHNyY1csIHNyY0gsIGNwUHJvai54LCBjcFByb2oueSwgMCk7XG4gICAgICBpZiAoY2xvc2VTdGFydEFDcCkge1xuICAgICAgICBycy5jdHJscHRzWzBdID0gcnMuY3RybHB0c1swXSArIGNwTS54ICogKG1pbkNwQURpc3QgLSBzdGFydEFDcERpc3QpO1xuICAgICAgICBycy5jdHJscHRzWzFdID0gcnMuY3RybHB0c1sxXSArIGNwTS55ICogKG1pbkNwQURpc3QgLSBzdGFydEFDcERpc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcnMuY3RybHB0c1swXSA9IHNyY0N0cmxQdEludG5bMF0gKyBjcE0ueCAqIG1pbkNwQURpc3Q7XG4gICAgICAgIHJzLmN0cmxwdHNbMV0gPSBzcmNDdHJsUHRJbnRuWzFdICsgY3BNLnkgKiBtaW5DcEFEaXN0O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYmFkRW5kIHx8IGJhZEFFbmQgfHwgY2xvc2VFbmRBQ3ApIHtcbiAgICAgIG92ZXJsYXBwaW5nID0gdHJ1ZTtcblxuICAgICAgLy8gcHJvamVjdCBjb250cm9sIHBvaW50IGFsb25nIGxpbmUgZnJvbSB0Z3QgY2VudHJlIHRvIG91dHNpZGUgdGhlIHRndCBzaGFwZVxuICAgICAgLy8gKG90aGVyd2lzZSBpbnRlcnNlY3Rpb24gd2lsbCB5aWVsZCBub3RoaW5nKVxuICAgICAgdmFyIF9jcEQgPSB7XG4gICAgICAgIC8vIGRlbHRhXG4gICAgICAgIHg6IHJzLmN0cmxwdHNbMF0gLSB0Z3RQb3MueCxcbiAgICAgICAgeTogcnMuY3RybHB0c1sxXSAtIHRndFBvcy55XG4gICAgICB9O1xuICAgICAgdmFyIF9jcEwgPSBNYXRoLnNxcnQoX2NwRC54ICogX2NwRC54ICsgX2NwRC55ICogX2NwRC55KTsgLy8gbGVuZ3RoIG9mIGxpbmVcbiAgICAgIHZhciBfY3BNID0ge1xuICAgICAgICAvLyBub3JtYWxpc2VkIGRlbHRhXG4gICAgICAgIHg6IF9jcEQueCAvIF9jcEwsXG4gICAgICAgIHk6IF9jcEQueSAvIF9jcExcbiAgICAgIH07XG4gICAgICB2YXIgX3JhZGl1cyA9IE1hdGgubWF4KHNyY1csIHNyY0gpO1xuICAgICAgdmFyIF9jcFByb2ogPSB7XG4gICAgICAgIC8vICoyIHJhZGl1cyBndWFyYW50ZWVzIG91dHNpZGUgc2hhcGVcbiAgICAgICAgeDogcnMuY3RybHB0c1swXSArIF9jcE0ueCAqIDIgKiBfcmFkaXVzLFxuICAgICAgICB5OiBycy5jdHJscHRzWzFdICsgX2NwTS55ICogMiAqIF9yYWRpdXNcbiAgICAgIH07XG4gICAgICB2YXIgdGd0Q3RybFB0SW50biA9IHRndFNoYXBlLmludGVyc2VjdExpbmUodGd0UG9zLngsIHRndFBvcy55LCB0Z3RXLCB0Z3RILCBfY3BQcm9qLngsIF9jcFByb2oueSwgMCk7XG4gICAgICBpZiAoY2xvc2VFbmRBQ3ApIHtcbiAgICAgICAgcnMuY3RybHB0c1swXSA9IHJzLmN0cmxwdHNbMF0gKyBfY3BNLnggKiAobWluQ3BBRGlzdCAtIGVuZEFDcERpc3QpO1xuICAgICAgICBycy5jdHJscHRzWzFdID0gcnMuY3RybHB0c1sxXSArIF9jcE0ueSAqIChtaW5DcEFEaXN0IC0gZW5kQUNwRGlzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBycy5jdHJscHRzWzBdID0gdGd0Q3RybFB0SW50blswXSArIF9jcE0ueCAqIG1pbkNwQURpc3Q7XG4gICAgICAgIHJzLmN0cmxwdHNbMV0gPSB0Z3RDdHJsUHRJbnRuWzFdICsgX2NwTS55ICogbWluQ3BBRGlzdDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG92ZXJsYXBwaW5nKSB7XG4gICAgICAvLyByZWNhbGMgZW5kcHRzXG4gICAgICB0aGlzLmZpbmRFbmRwb2ludHMoZWRnZSk7XG4gICAgfVxuICB9XG59O1xuQlJwJGMuc3RvcmVBbGxwdHMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICBpZiAocnMuZWRnZVR5cGUgPT09ICdtdWx0aWJlemllcicgfHwgcnMuZWRnZVR5cGUgPT09ICdiZXppZXInIHx8IHJzLmVkZ2VUeXBlID09PSAnc2VsZicgfHwgcnMuZWRnZVR5cGUgPT09ICdjb21wb3VuZCcpIHtcbiAgICBycy5hbGxwdHMgPSBbXTtcbiAgICBycy5hbGxwdHMucHVzaChycy5zdGFydFgsIHJzLnN0YXJ0WSk7XG4gICAgZm9yICh2YXIgYiA9IDA7IGIgKyAxIDwgcnMuY3RybHB0cy5sZW5ndGg7IGIgKz0gMikge1xuICAgICAgLy8gY3RybCBwdCBpdHNlbGZcbiAgICAgIHJzLmFsbHB0cy5wdXNoKHJzLmN0cmxwdHNbYl0sIHJzLmN0cmxwdHNbYiArIDFdKTtcblxuICAgICAgLy8gdGhlIG1pZHB0IGJldHdlZW4gY3RybHB0cyBhcyBpbnRlcm1lZGlhdGUgZGVzdGluYXRpb24gcHRzXG4gICAgICBpZiAoYiArIDMgPCBycy5jdHJscHRzLmxlbmd0aCkge1xuICAgICAgICBycy5hbGxwdHMucHVzaCgocnMuY3RybHB0c1tiXSArIHJzLmN0cmxwdHNbYiArIDJdKSAvIDIsIChycy5jdHJscHRzW2IgKyAxXSArIHJzLmN0cmxwdHNbYiArIDNdKSAvIDIpO1xuICAgICAgfVxuICAgIH1cbiAgICBycy5hbGxwdHMucHVzaChycy5lbmRYLCBycy5lbmRZKTtcbiAgICB2YXIgbSwgbXQ7XG4gICAgaWYgKHJzLmN0cmxwdHMubGVuZ3RoIC8gMiAlIDIgPT09IDApIHtcbiAgICAgIG0gPSBycy5hbGxwdHMubGVuZ3RoIC8gMiAtIDE7XG4gICAgICBycy5taWRYID0gcnMuYWxscHRzW21dO1xuICAgICAgcnMubWlkWSA9IHJzLmFsbHB0c1ttICsgMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSBycy5hbGxwdHMubGVuZ3RoIC8gMiAtIDM7XG4gICAgICBtdCA9IDAuNTtcbiAgICAgIHJzLm1pZFggPSBxYmV6aWVyQXQocnMuYWxscHRzW21dLCBycy5hbGxwdHNbbSArIDJdLCBycy5hbGxwdHNbbSArIDRdLCBtdCk7XG4gICAgICBycy5taWRZID0gcWJlemllckF0KHJzLmFsbHB0c1ttICsgMV0sIHJzLmFsbHB0c1ttICsgM10sIHJzLmFsbHB0c1ttICsgNV0sIG10KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocnMuZWRnZVR5cGUgPT09ICdzdHJhaWdodCcpIHtcbiAgICAvLyBuZWVkIHRvIGNhbGMgdGhlc2UgYWZ0ZXIgZW5kcHRzXG4gICAgcnMuYWxscHRzID0gW3JzLnN0YXJ0WCwgcnMuc3RhcnRZLCBycy5lbmRYLCBycy5lbmRZXTtcblxuICAgIC8vIGRlZmF1bHQgbWlkcHQgZm9yIGxhYmVscyBldGNcbiAgICBycy5taWRYID0gKHJzLnN0YXJ0WCArIHJzLmVuZFggKyBycy5hcnJvd1N0YXJ0WCArIHJzLmFycm93RW5kWCkgLyA0O1xuICAgIHJzLm1pZFkgPSAocnMuc3RhcnRZICsgcnMuZW5kWSArIHJzLmFycm93U3RhcnRZICsgcnMuYXJyb3dFbmRZKSAvIDQ7XG4gIH0gZWxzZSBpZiAocnMuZWRnZVR5cGUgPT09ICdzZWdtZW50cycpIHtcbiAgICBycy5hbGxwdHMgPSBbXTtcbiAgICBycy5hbGxwdHMucHVzaChycy5zdGFydFgsIHJzLnN0YXJ0WSk7XG4gICAgcnMuYWxscHRzLnB1c2guYXBwbHkocnMuYWxscHRzLCBycy5zZWdwdHMpO1xuICAgIHJzLmFsbHB0cy5wdXNoKHJzLmVuZFgsIHJzLmVuZFkpO1xuICAgIGlmIChycy5zZWdwdHMubGVuZ3RoICUgNCA9PT0gMCkge1xuICAgICAgdmFyIGkyID0gcnMuc2VncHRzLmxlbmd0aCAvIDI7XG4gICAgICB2YXIgaTEgPSBpMiAtIDI7XG4gICAgICBycy5taWRYID0gKHJzLnNlZ3B0c1tpMV0gKyBycy5zZWdwdHNbaTJdKSAvIDI7XG4gICAgICBycy5taWRZID0gKHJzLnNlZ3B0c1tpMSArIDFdICsgcnMuc2VncHRzW2kyICsgMV0pIC8gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9pID0gcnMuc2VncHRzLmxlbmd0aCAvIDIgLSAxO1xuICAgICAgcnMubWlkWCA9IHJzLnNlZ3B0c1tfaV07XG4gICAgICBycy5taWRZID0gcnMuc2VncHRzW19pICsgMV07XG4gICAgfVxuICB9XG59O1xuQlJwJGMuY2hlY2tGb3JJbnZhbGlkRWRnZVdhcm5pbmcgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcnMgPSBlZGdlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICBpZiAocnMubm9kZXNPdmVybGFwIHx8IG51bWJlciQxKHJzLnN0YXJ0WCkgJiYgbnVtYmVyJDEocnMuc3RhcnRZKSAmJiBudW1iZXIkMShycy5lbmRYKSAmJiBudW1iZXIkMShycy5lbmRZKSkge1xuICAgIHJzLmxvZ2dlZEVyciA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIGlmICghcnMubG9nZ2VkRXJyKSB7XG4gICAgICBycy5sb2dnZWRFcnIgPSB0cnVlO1xuICAgICAgd2FybignRWRnZSBgJyArIGVkZ2UuaWQoKSArICdgIGhhcyBpbnZhbGlkIGVuZHBvaW50cyBhbmQgc28gaXQgaXMgaW1wb3NzaWJsZSB0byBkcmF3LiAgQWRqdXN0IHlvdXIgZWRnZSBzdHlsZSAoZS5nLiBjb250cm9sIHBvaW50cykgYWNjb3JkaW5nbHkgb3IgdXNlIGFuIGFsdGVybmF0aXZlIGVkZ2UgdHlwZS4gIFRoaXMgaXMgZXhwZWN0ZWQgYmVoYXZpb3VyIHdoZW4gdGhlIHNvdXJjZSBub2RlIGFuZCB0aGUgdGFyZ2V0IG5vZGUgb3ZlcmxhcC4nKTtcbiAgICB9XG4gIH1cbn07XG5CUnAkYy5maW5kRWRnZUNvbnRyb2xQb2ludHMgPSBmdW5jdGlvbiAoZWRnZXMpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcbiAgaWYgKCFlZGdlcyB8fCBlZGdlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgY3kgPSByLmN5O1xuICB2YXIgaGFzQ29tcG91bmRzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICB2YXIgaGFzaFRhYmxlID0ge1xuICAgIG1hcDogbmV3IE1hcCQxKCksXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQocGFpcklkKSB7XG4gICAgICB2YXIgbWFwMiA9IHRoaXMubWFwLmdldChwYWlySWRbMF0pO1xuICAgICAgaWYgKG1hcDIgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbWFwMi5nZXQocGFpcklkWzFdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQocGFpcklkLCB2YWwpIHtcbiAgICAgIHZhciBtYXAyID0gdGhpcy5tYXAuZ2V0KHBhaXJJZFswXSk7XG4gICAgICBpZiAobWFwMiA9PSBudWxsKSB7XG4gICAgICAgIG1hcDIgPSBuZXcgTWFwJDEoKTtcbiAgICAgICAgdGhpcy5tYXAuc2V0KHBhaXJJZFswXSwgbWFwMik7XG4gICAgICB9XG4gICAgICBtYXAyLnNldChwYWlySWRbMV0sIHZhbCk7XG4gICAgfVxuICB9O1xuICB2YXIgcGFpcklkcyA9IFtdO1xuICB2YXIgaGF5c3RhY2tFZGdlcyA9IFtdO1xuXG4gIC8vIGNyZWF0ZSBhIHRhYmxlIG9mIGVkZ2UgKHNyYywgdGd0KSA9PiBsaXN0IG9mIGVkZ2VzIGJldHdlZW4gdGhlbVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVkZ2UgPSBlZGdlc1tpXTtcbiAgICB2YXIgX3AgPSBlZGdlLl9wcml2YXRlO1xuICAgIHZhciBjdXJ2ZVN0eWxlID0gZWRnZS5wc3R5bGUoJ2N1cnZlLXN0eWxlJykudmFsdWU7XG5cbiAgICAvLyBpZ25vcmUgZWRnZXMgd2hvIGFyZSBub3QgdG8gYmUgZGlzcGxheWVkXG4gICAgLy8gdGhleSBzaG91bGRuJ3QgdGFrZSB1cCBzcGFjZVxuICAgIGlmIChlZGdlLnJlbW92ZWQoKSB8fCAhZWRnZS50YWtlc1VwU3BhY2UoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjdXJ2ZVN0eWxlID09PSAnaGF5c3RhY2snKSB7XG4gICAgICBoYXlzdGFja0VkZ2VzLnB1c2goZWRnZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGVkZ2VJc1VuYnVuZGxlZCA9IGN1cnZlU3R5bGUgPT09ICd1bmJ1bmRsZWQtYmV6aWVyJyB8fCBjdXJ2ZVN0eWxlID09PSAnc2VnbWVudHMnIHx8IGN1cnZlU3R5bGUgPT09ICdzdHJhaWdodCcgfHwgY3VydmVTdHlsZSA9PT0gJ3N0cmFpZ2h0LXRyaWFuZ2xlJyB8fCBjdXJ2ZVN0eWxlID09PSAndGF4aSc7XG4gICAgdmFyIGVkZ2VJc0JlemllciA9IGN1cnZlU3R5bGUgPT09ICd1bmJ1bmRsZWQtYmV6aWVyJyB8fCBjdXJ2ZVN0eWxlID09PSAnYmV6aWVyJztcbiAgICB2YXIgc3JjID0gX3Auc291cmNlO1xuICAgIHZhciB0Z3QgPSBfcC50YXJnZXQ7XG4gICAgdmFyIHNyY0luZGV4ID0gc3JjLnBvb2xJbmRleCgpO1xuICAgIHZhciB0Z3RJbmRleCA9IHRndC5wb29sSW5kZXgoKTtcbiAgICB2YXIgcGFpcklkID0gW3NyY0luZGV4LCB0Z3RJbmRleF0uc29ydCgpO1xuICAgIHZhciB0YWJsZUVudHJ5ID0gaGFzaFRhYmxlLmdldChwYWlySWQpO1xuICAgIGlmICh0YWJsZUVudHJ5ID09IG51bGwpIHtcbiAgICAgIHRhYmxlRW50cnkgPSB7XG4gICAgICAgIGVsZXM6IFtdXG4gICAgICB9O1xuICAgICAgaGFzaFRhYmxlLnNldChwYWlySWQsIHRhYmxlRW50cnkpO1xuICAgICAgcGFpcklkcy5wdXNoKHBhaXJJZCk7XG4gICAgfVxuICAgIHRhYmxlRW50cnkuZWxlcy5wdXNoKGVkZ2UpO1xuICAgIGlmIChlZGdlSXNVbmJ1bmRsZWQpIHtcbiAgICAgIHRhYmxlRW50cnkuaGFzVW5idW5kbGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGVkZ2VJc0Jlemllcikge1xuICAgICAgdGFibGVFbnRyeS5oYXNCZXppZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZvciBlYWNoIHBhaXIgKHNyYywgdGd0KSwgY3JlYXRlIHRoZSBjdHJsIHB0c1xuICAvLyBOZXN0ZWQgZm9yIGxvb3AgaXMgT0s7IHRvdGFsIG51bWJlciBvZiBpdGVyYXRpb25zIGZvciBib3RoIGxvb3BzID0gZWRnZUNvdW50XG4gIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKHApIHtcbiAgICB2YXIgcGFpcklkID0gcGFpcklkc1twXTtcbiAgICB2YXIgcGFpckluZm8gPSBoYXNoVGFibGUuZ2V0KHBhaXJJZCk7XG4gICAgdmFyIHN3YXBwZWRwYWlySW5mbyA9IHZvaWQgMDtcbiAgICBpZiAoIXBhaXJJbmZvLmhhc1VuYnVuZGxlZCkge1xuICAgICAgdmFyIHBsbEVkZ2VzID0gcGFpckluZm8uZWxlc1swXS5wYXJhbGxlbEVkZ2VzKCkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBlLmlzQnVuZGxlZEJlemllcigpO1xuICAgICAgfSk7XG4gICAgICBjbGVhckFycmF5KHBhaXJJbmZvLmVsZXMpO1xuICAgICAgcGxsRWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICByZXR1cm4gcGFpckluZm8uZWxlcy5wdXNoKGVkZ2UpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGZvciBlYWNoIHBhaXIgaWQsIHRoZSBlZGdlcyBzaG91bGQgYmUgc29ydGVkIGJ5IGluZGV4XG4gICAgICBwYWlySW5mby5lbGVzLnNvcnQoZnVuY3Rpb24gKGVkZ2UxLCBlZGdlMikge1xuICAgICAgICByZXR1cm4gZWRnZTEucG9vbEluZGV4KCkgLSBlZGdlMi5wb29sSW5kZXgoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgZmlyc3RFZGdlID0gcGFpckluZm8uZWxlc1swXTtcbiAgICB2YXIgc3JjID0gZmlyc3RFZGdlLnNvdXJjZSgpO1xuICAgIHZhciB0Z3QgPSBmaXJzdEVkZ2UudGFyZ2V0KCk7XG5cbiAgICAvLyBtYWtlIHN1cmUgc3JjL3RndCBkaXN0aW5jdGlvbiBpcyBjb25zaXN0ZW50IHcuci50LiBwYWlySWRcbiAgICBpZiAoc3JjLnBvb2xJbmRleCgpID4gdGd0LnBvb2xJbmRleCgpKSB7XG4gICAgICB2YXIgdGVtcCA9IHNyYztcbiAgICAgIHNyYyA9IHRndDtcbiAgICAgIHRndCA9IHRlbXA7XG4gICAgfVxuICAgIHZhciBzcmNQb3MgPSBwYWlySW5mby5zcmNQb3MgPSBzcmMucG9zaXRpb24oKTtcbiAgICB2YXIgdGd0UG9zID0gcGFpckluZm8udGd0UG9zID0gdGd0LnBvc2l0aW9uKCk7XG4gICAgdmFyIHNyY1cgPSBwYWlySW5mby5zcmNXID0gc3JjLm91dGVyV2lkdGgoKTtcbiAgICB2YXIgc3JjSCA9IHBhaXJJbmZvLnNyY0ggPSBzcmMub3V0ZXJIZWlnaHQoKTtcbiAgICB2YXIgdGd0VyA9IHBhaXJJbmZvLnRndFcgPSB0Z3Qub3V0ZXJXaWR0aCgpO1xuICAgIHZhciB0Z3RIID0gcGFpckluZm8udGd0SCA9IHRndC5vdXRlckhlaWdodCgpO1xuICAgIHZhciBzcmNTaGFwZSA9IHBhaXJJbmZvLnNyY1NoYXBlID0gci5ub2RlU2hhcGVzW190aGlzLmdldE5vZGVTaGFwZShzcmMpXTtcbiAgICB2YXIgdGd0U2hhcGUgPSBwYWlySW5mby50Z3RTaGFwZSA9IHIubm9kZVNoYXBlc1tfdGhpcy5nZXROb2RlU2hhcGUodGd0KV07XG4gICAgcGFpckluZm8uZGlyQ291bnRzID0ge1xuICAgICAgJ25vcnRoJzogMCxcbiAgICAgICd3ZXN0JzogMCxcbiAgICAgICdzb3V0aCc6IDAsXG4gICAgICAnZWFzdCc6IDAsXG4gICAgICAnbm9ydGh3ZXN0JzogMCxcbiAgICAgICdzb3V0aHdlc3QnOiAwLFxuICAgICAgJ25vcnRoZWFzdCc6IDAsXG4gICAgICAnc291dGhlYXN0JzogMFxuICAgIH07XG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgcGFpckluZm8uZWxlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICB2YXIgX2VkZ2UgPSBwYWlySW5mby5lbGVzW19pMl07XG4gICAgICB2YXIgcnMgPSBfZWRnZVswXS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICAgIHZhciBfY3VydmVTdHlsZSA9IF9lZGdlLnBzdHlsZSgnY3VydmUtc3R5bGUnKS52YWx1ZTtcbiAgICAgIHZhciBfZWRnZUlzVW5idW5kbGVkID0gX2N1cnZlU3R5bGUgPT09ICd1bmJ1bmRsZWQtYmV6aWVyJyB8fCBfY3VydmVTdHlsZSA9PT0gJ3NlZ21lbnRzJyB8fCBfY3VydmVTdHlsZSA9PT0gJ3RheGknO1xuXG4gICAgICAvLyB3aGV0aGVyIHRoZSBub3JtYWxpc2VkIHBhaXIgb3JkZXIgaXMgdGhlIHJldmVyc2Ugb2YgdGhlIGVkZ2UncyBzcmMtdGd0IG9yZGVyXG4gICAgICB2YXIgZWRnZUlzU3dhcHBlZCA9ICFzcmMuc2FtZShfZWRnZS5zb3VyY2UoKSk7XG4gICAgICBpZiAoIXBhaXJJbmZvLmNhbGN1bGF0ZWRJbnRlcnNlY3Rpb24gJiYgc3JjICE9PSB0Z3QgJiYgKHBhaXJJbmZvLmhhc0JlemllciB8fCBwYWlySW5mby5oYXNVbmJ1bmRsZWQpKSB7XG4gICAgICAgIHBhaXJJbmZvLmNhbGN1bGF0ZWRJbnRlcnNlY3Rpb24gPSB0cnVlO1xuXG4gICAgICAgIC8vIHB0IG91dHNpZGUgc3JjIHNoYXBlIHRvIGNhbGMgZGlzdGFuY2UvZGlzcGxhY2VtZW50IGZyb20gc3JjIHRvIHRndFxuICAgICAgICB2YXIgc3JjT3V0c2lkZSA9IHNyY1NoYXBlLmludGVyc2VjdExpbmUoc3JjUG9zLngsIHNyY1Bvcy55LCBzcmNXLCBzcmNILCB0Z3RQb3MueCwgdGd0UG9zLnksIDApO1xuICAgICAgICB2YXIgc3JjSW50biA9IHBhaXJJbmZvLnNyY0ludG4gPSBzcmNPdXRzaWRlO1xuXG4gICAgICAgIC8vIHB0IG91dHNpZGUgdGd0IHNoYXBlIHRvIGNhbGMgZGlzdGFuY2UvZGlzcGxhY2VtZW50IGZyb20gc3JjIHRvIHRndFxuICAgICAgICB2YXIgdGd0T3V0c2lkZSA9IHRndFNoYXBlLmludGVyc2VjdExpbmUodGd0UG9zLngsIHRndFBvcy55LCB0Z3RXLCB0Z3RILCBzcmNQb3MueCwgc3JjUG9zLnksIDApO1xuICAgICAgICB2YXIgdGd0SW50biA9IHBhaXJJbmZvLnRndEludG4gPSB0Z3RPdXRzaWRlO1xuICAgICAgICB2YXIgaW50ZXJzZWN0aW9uUHRzID0gcGFpckluZm8uaW50ZXJzZWN0aW9uUHRzID0ge1xuICAgICAgICAgIHgxOiBzcmNPdXRzaWRlWzBdLFxuICAgICAgICAgIHgyOiB0Z3RPdXRzaWRlWzBdLFxuICAgICAgICAgIHkxOiBzcmNPdXRzaWRlWzFdLFxuICAgICAgICAgIHkyOiB0Z3RPdXRzaWRlWzFdXG4gICAgICAgIH07XG4gICAgICAgIHZhciBwb3NQdHMgPSBwYWlySW5mby5wb3NQdHMgPSB7XG4gICAgICAgICAgeDE6IHNyY1Bvcy54LFxuICAgICAgICAgIHgyOiB0Z3RQb3MueCxcbiAgICAgICAgICB5MTogc3JjUG9zLnksXG4gICAgICAgICAgeTI6IHRndFBvcy55XG4gICAgICAgIH07XG4gICAgICAgIHZhciBkeSA9IHRndE91dHNpZGVbMV0gLSBzcmNPdXRzaWRlWzFdO1xuICAgICAgICB2YXIgZHggPSB0Z3RPdXRzaWRlWzBdIC0gc3JjT3V0c2lkZVswXTtcbiAgICAgICAgdmFyIGwgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgICAgICB2YXIgdmVjdG9yID0gcGFpckluZm8udmVjdG9yID0ge1xuICAgICAgICAgIHg6IGR4LFxuICAgICAgICAgIHk6IGR5XG4gICAgICAgIH07XG4gICAgICAgIHZhciB2ZWN0b3JOb3JtID0gcGFpckluZm8udmVjdG9yTm9ybSA9IHtcbiAgICAgICAgICB4OiB2ZWN0b3IueCAvIGwsXG4gICAgICAgICAgeTogdmVjdG9yLnkgLyBsXG4gICAgICAgIH07XG4gICAgICAgIHZhciB2ZWN0b3JOb3JtSW52ZXJzZSA9IHtcbiAgICAgICAgICB4OiAtdmVjdG9yTm9ybS55LFxuICAgICAgICAgIHk6IHZlY3Rvck5vcm0ueFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIGlmIG5vZGUgc2hhcGVzIG92ZXJsYXAsIHRoZW4gbm8gY3RybCBwdHMgdG8gZHJhd1xuICAgICAgICBwYWlySW5mby5ub2Rlc092ZXJsYXAgPSAhbnVtYmVyJDEobCkgfHwgdGd0U2hhcGUuY2hlY2tQb2ludChzcmNPdXRzaWRlWzBdLCBzcmNPdXRzaWRlWzFdLCAwLCB0Z3RXLCB0Z3RILCB0Z3RQb3MueCwgdGd0UG9zLnkpIHx8IHNyY1NoYXBlLmNoZWNrUG9pbnQodGd0T3V0c2lkZVswXSwgdGd0T3V0c2lkZVsxXSwgMCwgc3JjVywgc3JjSCwgc3JjUG9zLngsIHNyY1Bvcy55KTtcbiAgICAgICAgcGFpckluZm8udmVjdG9yTm9ybUludmVyc2UgPSB2ZWN0b3JOb3JtSW52ZXJzZTtcbiAgICAgICAgc3dhcHBlZHBhaXJJbmZvID0ge1xuICAgICAgICAgIG5vZGVzT3ZlcmxhcDogcGFpckluZm8ubm9kZXNPdmVybGFwLFxuICAgICAgICAgIGRpckNvdW50czogcGFpckluZm8uZGlyQ291bnRzLFxuICAgICAgICAgIGNhbGN1bGF0ZWRJbnRlcnNlY3Rpb246IHRydWUsXG4gICAgICAgICAgaGFzQmV6aWVyOiBwYWlySW5mby5oYXNCZXppZXIsXG4gICAgICAgICAgaGFzVW5idW5kbGVkOiBwYWlySW5mby5oYXNVbmJ1bmRsZWQsXG4gICAgICAgICAgZWxlczogcGFpckluZm8uZWxlcyxcbiAgICAgICAgICBzcmNQb3M6IHRndFBvcyxcbiAgICAgICAgICB0Z3RQb3M6IHNyY1BvcyxcbiAgICAgICAgICBzcmNXOiB0Z3RXLFxuICAgICAgICAgIHNyY0g6IHRndEgsXG4gICAgICAgICAgdGd0Vzogc3JjVyxcbiAgICAgICAgICB0Z3RIOiBzcmNILFxuICAgICAgICAgIHNyY0ludG46IHRndEludG4sXG4gICAgICAgICAgdGd0SW50bjogc3JjSW50bixcbiAgICAgICAgICBzcmNTaGFwZTogdGd0U2hhcGUsXG4gICAgICAgICAgdGd0U2hhcGU6IHNyY1NoYXBlLFxuICAgICAgICAgIHBvc1B0czoge1xuICAgICAgICAgICAgeDE6IHBvc1B0cy54MixcbiAgICAgICAgICAgIHkxOiBwb3NQdHMueTIsXG4gICAgICAgICAgICB4MjogcG9zUHRzLngxLFxuICAgICAgICAgICAgeTI6IHBvc1B0cy55MVxuICAgICAgICAgIH0sXG4gICAgICAgICAgaW50ZXJzZWN0aW9uUHRzOiB7XG4gICAgICAgICAgICB4MTogaW50ZXJzZWN0aW9uUHRzLngyLFxuICAgICAgICAgICAgeTE6IGludGVyc2VjdGlvblB0cy55MixcbiAgICAgICAgICAgIHgyOiBpbnRlcnNlY3Rpb25QdHMueDEsXG4gICAgICAgICAgICB5MjogaW50ZXJzZWN0aW9uUHRzLnkxXG4gICAgICAgICAgfSxcbiAgICAgICAgICB2ZWN0b3I6IHtcbiAgICAgICAgICAgIHg6IC12ZWN0b3IueCxcbiAgICAgICAgICAgIHk6IC12ZWN0b3IueVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdmVjdG9yTm9ybToge1xuICAgICAgICAgICAgeDogLXZlY3Rvck5vcm0ueCxcbiAgICAgICAgICAgIHk6IC12ZWN0b3JOb3JtLnlcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZlY3Rvck5vcm1JbnZlcnNlOiB7XG4gICAgICAgICAgICB4OiAtdmVjdG9yTm9ybUludmVyc2UueCxcbiAgICAgICAgICAgIHk6IC12ZWN0b3JOb3JtSW52ZXJzZS55XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIHBhc3NlZFBhaXJJbmZvID0gZWRnZUlzU3dhcHBlZCA/IHN3YXBwZWRwYWlySW5mbyA6IHBhaXJJbmZvO1xuICAgICAgcnMubm9kZXNPdmVybGFwID0gcGFzc2VkUGFpckluZm8ubm9kZXNPdmVybGFwO1xuICAgICAgcnMuc3JjSW50biA9IHBhc3NlZFBhaXJJbmZvLnNyY0ludG47XG4gICAgICBycy50Z3RJbnRuID0gcGFzc2VkUGFpckluZm8udGd0SW50bjtcbiAgICAgIGlmIChoYXNDb21wb3VuZHMgJiYgKHNyYy5pc1BhcmVudCgpIHx8IHNyYy5pc0NoaWxkKCkgfHwgdGd0LmlzUGFyZW50KCkgfHwgdGd0LmlzQ2hpbGQoKSkgJiYgKHNyYy5wYXJlbnRzKCkuYW55U2FtZSh0Z3QpIHx8IHRndC5wYXJlbnRzKCkuYW55U2FtZShzcmMpIHx8IHNyYy5zYW1lKHRndCkgJiYgc3JjLmlzUGFyZW50KCkpKSB7XG4gICAgICAgIF90aGlzLmZpbmRDb21wb3VuZExvb3BQb2ludHMoX2VkZ2UsIHBhc3NlZFBhaXJJbmZvLCBfaTIsIF9lZGdlSXNVbmJ1bmRsZWQpO1xuICAgICAgfSBlbHNlIGlmIChzcmMgPT09IHRndCkge1xuICAgICAgICBfdGhpcy5maW5kTG9vcFBvaW50cyhfZWRnZSwgcGFzc2VkUGFpckluZm8sIF9pMiwgX2VkZ2VJc1VuYnVuZGxlZCk7XG4gICAgICB9IGVsc2UgaWYgKF9jdXJ2ZVN0eWxlID09PSAnc2VnbWVudHMnKSB7XG4gICAgICAgIF90aGlzLmZpbmRTZWdtZW50c1BvaW50cyhfZWRnZSwgcGFzc2VkUGFpckluZm8pO1xuICAgICAgfSBlbHNlIGlmIChfY3VydmVTdHlsZSA9PT0gJ3RheGknKSB7XG4gICAgICAgIF90aGlzLmZpbmRUYXhpUG9pbnRzKF9lZGdlLCBwYXNzZWRQYWlySW5mbyk7XG4gICAgICB9IGVsc2UgaWYgKF9jdXJ2ZVN0eWxlID09PSAnc3RyYWlnaHQnIHx8ICFfZWRnZUlzVW5idW5kbGVkICYmIHBhaXJJbmZvLmVsZXMubGVuZ3RoICUgMiA9PT0gMSAmJiBfaTIgPT09IE1hdGguZmxvb3IocGFpckluZm8uZWxlcy5sZW5ndGggLyAyKSkge1xuICAgICAgICBfdGhpcy5maW5kU3RyYWlnaHRFZGdlUG9pbnRzKF9lZGdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzLmZpbmRCZXppZXJQb2ludHMoX2VkZ2UsIHBhc3NlZFBhaXJJbmZvLCBfaTIsIF9lZGdlSXNVbmJ1bmRsZWQsIGVkZ2VJc1N3YXBwZWQpO1xuICAgICAgfVxuICAgICAgX3RoaXMuZmluZEVuZHBvaW50cyhfZWRnZSk7XG4gICAgICBfdGhpcy50cnlUb0NvcnJlY3RJbnZhbGlkUG9pbnRzKF9lZGdlLCBwYXNzZWRQYWlySW5mbyk7XG4gICAgICBfdGhpcy5jaGVja0ZvckludmFsaWRFZGdlV2FybmluZyhfZWRnZSk7XG4gICAgICBfdGhpcy5zdG9yZUFsbHB0cyhfZWRnZSk7XG4gICAgICBfdGhpcy5zdG9yZUVkZ2VQcm9qZWN0aW9ucyhfZWRnZSk7XG4gICAgICBfdGhpcy5jYWxjdWxhdGVBcnJvd0FuZ2xlcyhfZWRnZSk7XG4gICAgICBfdGhpcy5yZWNhbGN1bGF0ZUVkZ2VMYWJlbFByb2plY3Rpb25zKF9lZGdlKTtcbiAgICAgIF90aGlzLmNhbGN1bGF0ZUxhYmVsQW5nbGVzKF9lZGdlKTtcbiAgICB9IC8vIGZvciBwYWlyIGVkZ2VzXG4gIH07XG4gIGZvciAodmFyIHAgPSAwOyBwIDwgcGFpcklkcy5sZW5ndGg7IHArKykge1xuICAgIF9sb29wKHApO1xuICB9IC8vIGZvciBwYWlyIGlkc1xuXG4gIC8vIGhheXN0YWNrcyBhdm9pZCB0aGUgZXhwZW5zZSBvZiBwYWlySW5mbyBzdHVmZiAoaW50ZXJzZWN0aW9ucyBldGMuKVxuICB0aGlzLmZpbmRIYXlzdGFja1BvaW50cyhoYXlzdGFja0VkZ2VzKTtcbn07XG5mdW5jdGlvbiBnZXRQdHMocHRzKSB7XG4gIHZhciByZXRQdHMgPSBbXTtcbiAgaWYgKHB0cyA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIHggPSBwdHNbaV07XG4gICAgdmFyIHkgPSBwdHNbaSArIDFdO1xuICAgIHJldFB0cy5wdXNoKHtcbiAgICAgIHg6IHgsXG4gICAgICB5OiB5XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJldFB0cztcbn1cbkJScCRjLmdldFNlZ21lbnRQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcnMgPSBlZGdlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgdHlwZSA9IHJzLmVkZ2VUeXBlO1xuICBpZiAodHlwZSA9PT0gJ3NlZ21lbnRzJykge1xuICAgIHRoaXMucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKGVkZ2UpO1xuICAgIHJldHVybiBnZXRQdHMocnMuc2VncHRzKTtcbiAgfVxufTtcbkJScCRjLmdldENvbnRyb2xQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcnMgPSBlZGdlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgdHlwZSA9IHJzLmVkZ2VUeXBlO1xuICBpZiAodHlwZSA9PT0gJ2JlemllcicgfHwgdHlwZSA9PT0gJ211bHRpYmV6aWVyJyB8fCB0eXBlID09PSAnc2VsZicgfHwgdHlwZSA9PT0gJ2NvbXBvdW5kJykge1xuICAgIHRoaXMucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKGVkZ2UpO1xuICAgIHJldHVybiBnZXRQdHMocnMuY3RybHB0cyk7XG4gIH1cbn07XG5CUnAkYy5nZXRFZGdlTWlkcG9pbnQgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcnMgPSBlZGdlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICB0aGlzLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZShlZGdlKTtcbiAgcmV0dXJuIHtcbiAgICB4OiBycy5taWRYLFxuICAgIHk6IHJzLm1pZFlcbiAgfTtcbn07XG5cbnZhciBCUnAkYiA9IHt9O1xuQlJwJGIubWFudWFsRW5kcHRUb1B4ID0gZnVuY3Rpb24gKG5vZGUsIHByb3ApIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgbnBvcyA9IG5vZGUucG9zaXRpb24oKTtcbiAgdmFyIHcgPSBub2RlLm91dGVyV2lkdGgoKTtcbiAgdmFyIGggPSBub2RlLm91dGVySGVpZ2h0KCk7XG4gIGlmIChwcm9wLnZhbHVlLmxlbmd0aCA9PT0gMikge1xuICAgIHZhciBwID0gW3Byb3AucGZWYWx1ZVswXSwgcHJvcC5wZlZhbHVlWzFdXTtcbiAgICBpZiAocHJvcC51bml0c1swXSA9PT0gJyUnKSB7XG4gICAgICBwWzBdID0gcFswXSAqIHc7XG4gICAgfVxuICAgIGlmIChwcm9wLnVuaXRzWzFdID09PSAnJScpIHtcbiAgICAgIHBbMV0gPSBwWzFdICogaDtcbiAgICB9XG4gICAgcFswXSArPSBucG9zLng7XG4gICAgcFsxXSArPSBucG9zLnk7XG4gICAgcmV0dXJuIHA7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGFuZ2xlID0gcHJvcC5wZlZhbHVlWzBdO1xuICAgIGFuZ2xlID0gLU1hdGguUEkgLyAyICsgYW5nbGU7IC8vIHN0YXJ0IGF0IDEyIG8nY2xvY2tcblxuICAgIHZhciBsID0gMiAqIE1hdGgubWF4KHcsIGgpO1xuICAgIHZhciBfcCA9IFtucG9zLnggKyBNYXRoLmNvcyhhbmdsZSkgKiBsLCBucG9zLnkgKyBNYXRoLnNpbihhbmdsZSkgKiBsXTtcbiAgICByZXR1cm4gci5ub2RlU2hhcGVzW3RoaXMuZ2V0Tm9kZVNoYXBlKG5vZGUpXS5pbnRlcnNlY3RMaW5lKG5wb3MueCwgbnBvcy55LCB3LCBoLCBfcFswXSwgX3BbMV0sIDApO1xuICB9XG59O1xuQlJwJGIuZmluZEVuZHBvaW50cyA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGludGVyc2VjdDtcbiAgdmFyIHNvdXJjZSA9IGVkZ2Uuc291cmNlKClbMF07XG4gIHZhciB0YXJnZXQgPSBlZGdlLnRhcmdldCgpWzBdO1xuICB2YXIgc3JjUG9zID0gc291cmNlLnBvc2l0aW9uKCk7XG4gIHZhciB0Z3RQb3MgPSB0YXJnZXQucG9zaXRpb24oKTtcbiAgdmFyIHRndEFyU2hhcGUgPSBlZGdlLnBzdHlsZSgndGFyZ2V0LWFycm93LXNoYXBlJykudmFsdWU7XG4gIHZhciBzcmNBclNoYXBlID0gZWRnZS5wc3R5bGUoJ3NvdXJjZS1hcnJvdy1zaGFwZScpLnZhbHVlO1xuICB2YXIgdGd0RGlzdCA9IGVkZ2UucHN0eWxlKCd0YXJnZXQtZGlzdGFuY2UtZnJvbS1ub2RlJykucGZWYWx1ZTtcbiAgdmFyIHNyY0Rpc3QgPSBlZGdlLnBzdHlsZSgnc291cmNlLWRpc3RhbmNlLWZyb20tbm9kZScpLnBmVmFsdWU7XG4gIHZhciBjdXJ2ZVN0eWxlID0gZWRnZS5wc3R5bGUoJ2N1cnZlLXN0eWxlJykudmFsdWU7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBldCA9IHJzLmVkZ2VUeXBlO1xuICB2YXIgdGF4aSA9IGN1cnZlU3R5bGUgPT09ICd0YXhpJztcbiAgdmFyIHNlbGYgPSBldCA9PT0gJ3NlbGYnIHx8IGV0ID09PSAnY29tcG91bmQnO1xuICB2YXIgYmV6aWVyID0gZXQgPT09ICdiZXppZXInIHx8IGV0ID09PSAnbXVsdGliZXppZXInIHx8IHNlbGY7XG4gIHZhciBtdWx0aSA9IGV0ICE9PSAnYmV6aWVyJztcbiAgdmFyIGxpbmVzID0gZXQgPT09ICdzdHJhaWdodCcgfHwgZXQgPT09ICdzZWdtZW50cyc7XG4gIHZhciBzZWdtZW50cyA9IGV0ID09PSAnc2VnbWVudHMnO1xuICB2YXIgaGFzRW5kcHRzID0gYmV6aWVyIHx8IG11bHRpIHx8IGxpbmVzO1xuICB2YXIgb3ZlcnJpZGVFbmRwdHMgPSBzZWxmIHx8IHRheGk7XG4gIHZhciBzcmNNYW5FbmRwdCA9IGVkZ2UucHN0eWxlKCdzb3VyY2UtZW5kcG9pbnQnKTtcbiAgdmFyIHNyY01hbkVuZHB0VmFsID0gb3ZlcnJpZGVFbmRwdHMgPyAnb3V0c2lkZS10by1ub2RlJyA6IHNyY01hbkVuZHB0LnZhbHVlO1xuICB2YXIgdGd0TWFuRW5kcHQgPSBlZGdlLnBzdHlsZSgndGFyZ2V0LWVuZHBvaW50Jyk7XG4gIHZhciB0Z3RNYW5FbmRwdFZhbCA9IG92ZXJyaWRlRW5kcHRzID8gJ291dHNpZGUtdG8tbm9kZScgOiB0Z3RNYW5FbmRwdC52YWx1ZTtcbiAgcnMuc3JjTWFuRW5kcHQgPSBzcmNNYW5FbmRwdDtcbiAgcnMudGd0TWFuRW5kcHQgPSB0Z3RNYW5FbmRwdDtcbiAgdmFyIHAxOyAvLyBsYXN0IGtub3duIHBvaW50IG9mIGVkZ2Ugb24gdGFyZ2V0IHNpZGVcbiAgdmFyIHAyOyAvLyBsYXN0IGtub3duIHBvaW50IG9mIGVkZ2Ugb24gc291cmNlIHNpZGVcblxuICB2YXIgcDFfaTsgLy8gcG9pbnQgdG8gaW50ZXJzZWN0IHdpdGggdGFyZ2V0IHNoYXBlXG4gIHZhciBwMl9pOyAvLyBwb2ludCB0byBpbnRlcnNlY3Qgd2l0aCBzb3VyY2Ugc2hhcGVcblxuICBpZiAoYmV6aWVyKSB7XG4gICAgdmFyIGNwU3RhcnQgPSBbcnMuY3RybHB0c1swXSwgcnMuY3RybHB0c1sxXV07XG4gICAgdmFyIGNwRW5kID0gbXVsdGkgPyBbcnMuY3RybHB0c1tycy5jdHJscHRzLmxlbmd0aCAtIDJdLCBycy5jdHJscHRzW3JzLmN0cmxwdHMubGVuZ3RoIC0gMV1dIDogY3BTdGFydDtcbiAgICBwMSA9IGNwRW5kO1xuICAgIHAyID0gY3BTdGFydDtcbiAgfSBlbHNlIGlmIChsaW5lcykge1xuICAgIHZhciBzcmNBcnJvd0Zyb21QdCA9ICFzZWdtZW50cyA/IFt0Z3RQb3MueCwgdGd0UG9zLnldIDogcnMuc2VncHRzLnNsaWNlKDAsIDIpO1xuICAgIHZhciB0Z3RBcnJvd0Zyb21QdCA9ICFzZWdtZW50cyA/IFtzcmNQb3MueCwgc3JjUG9zLnldIDogcnMuc2VncHRzLnNsaWNlKHJzLnNlZ3B0cy5sZW5ndGggLSAyKTtcbiAgICBwMSA9IHRndEFycm93RnJvbVB0O1xuICAgIHAyID0gc3JjQXJyb3dGcm9tUHQ7XG4gIH1cbiAgaWYgKHRndE1hbkVuZHB0VmFsID09PSAnaW5zaWRlLXRvLW5vZGUnKSB7XG4gICAgaW50ZXJzZWN0ID0gW3RndFBvcy54LCB0Z3RQb3MueV07XG4gIH0gZWxzZSBpZiAodGd0TWFuRW5kcHQudW5pdHMpIHtcbiAgICBpbnRlcnNlY3QgPSB0aGlzLm1hbnVhbEVuZHB0VG9QeCh0YXJnZXQsIHRndE1hbkVuZHB0KTtcbiAgfSBlbHNlIGlmICh0Z3RNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZScpIHtcbiAgICBpbnRlcnNlY3QgPSBycy50Z3RJbnRuOyAvLyB1c2UgY2FjaGVkIHZhbHVlIGZyb20gY3RybHB0IGNhbGNcbiAgfSBlbHNlIHtcbiAgICBpZiAodGd0TWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLW5vZGUnIHx8IHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1ub2RlLW9yLWxhYmVsJykge1xuICAgICAgcDFfaSA9IHAxO1xuICAgIH0gZWxzZSBpZiAodGd0TWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLWxpbmUnIHx8IHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lLW9yLWxhYmVsJykge1xuICAgICAgcDFfaSA9IFtzcmNQb3MueCwgc3JjUG9zLnldO1xuICAgIH1cbiAgICBpbnRlcnNlY3QgPSByLm5vZGVTaGFwZXNbdGhpcy5nZXROb2RlU2hhcGUodGFyZ2V0KV0uaW50ZXJzZWN0TGluZSh0Z3RQb3MueCwgdGd0UG9zLnksIHRhcmdldC5vdXRlcldpZHRoKCksIHRhcmdldC5vdXRlckhlaWdodCgpLCBwMV9pWzBdLCBwMV9pWzFdLCAwKTtcbiAgICBpZiAodGd0TWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLW5vZGUtb3ItbGFiZWwnIHx8IHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lLW9yLWxhYmVsJykge1xuICAgICAgdmFyIHRycyA9IHRhcmdldC5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICAgIHZhciBsdyA9IHRycy5sYWJlbFdpZHRoO1xuICAgICAgdmFyIGxoID0gdHJzLmxhYmVsSGVpZ2h0O1xuICAgICAgdmFyIGx4ID0gdHJzLmxhYmVsWDtcbiAgICAgIHZhciBseSA9IHRycy5sYWJlbFk7XG4gICAgICB2YXIgbHcyID0gbHcgLyAyO1xuICAgICAgdmFyIGxoMiA9IGxoIC8gMjtcbiAgICAgIHZhciB2YSA9IHRhcmdldC5wc3R5bGUoJ3RleHQtdmFsaWduJykudmFsdWU7XG4gICAgICBpZiAodmEgPT09ICd0b3AnKSB7XG4gICAgICAgIGx5IC09IGxoMjtcbiAgICAgIH0gZWxzZSBpZiAodmEgPT09ICdib3R0b20nKSB7XG4gICAgICAgIGx5ICs9IGxoMjtcbiAgICAgIH1cbiAgICAgIHZhciBoYSA9IHRhcmdldC5wc3R5bGUoJ3RleHQtaGFsaWduJykudmFsdWU7XG4gICAgICBpZiAoaGEgPT09ICdsZWZ0Jykge1xuICAgICAgICBseCAtPSBsdzI7XG4gICAgICB9IGVsc2UgaWYgKGhhID09PSAncmlnaHQnKSB7XG4gICAgICAgIGx4ICs9IGx3MjtcbiAgICAgIH1cbiAgICAgIHZhciBsYWJlbEludGVyc2VjdCA9IHBvbHlnb25JbnRlcnNlY3RMaW5lKHAxX2lbMF0sIHAxX2lbMV0sIFtseCAtIGx3MiwgbHkgLSBsaDIsIGx4ICsgbHcyLCBseSAtIGxoMiwgbHggKyBsdzIsIGx5ICsgbGgyLCBseCAtIGx3MiwgbHkgKyBsaDJdLCB0Z3RQb3MueCwgdGd0UG9zLnkpO1xuICAgICAgaWYgKGxhYmVsSW50ZXJzZWN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIHJlZlB0ID0gc3JjUG9zO1xuICAgICAgICB2YXIgaW50U3FkaXN0ID0gc3FkaXN0KHJlZlB0LCBhcnJheTJwb2ludChpbnRlcnNlY3QpKTtcbiAgICAgICAgdmFyIGxhYkludFNxZGlzdCA9IHNxZGlzdChyZWZQdCwgYXJyYXkycG9pbnQobGFiZWxJbnRlcnNlY3QpKTtcbiAgICAgICAgdmFyIG1pblNxRGlzdCA9IGludFNxZGlzdDtcbiAgICAgICAgaWYgKGxhYkludFNxZGlzdCA8IGludFNxZGlzdCkge1xuICAgICAgICAgIGludGVyc2VjdCA9IGxhYmVsSW50ZXJzZWN0O1xuICAgICAgICAgIG1pblNxRGlzdCA9IGxhYkludFNxZGlzdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGFiZWxJbnRlcnNlY3QubGVuZ3RoID4gMikge1xuICAgICAgICAgIHZhciBsYWJJbnQyU3FEaXN0ID0gc3FkaXN0KHJlZlB0LCB7XG4gICAgICAgICAgICB4OiBsYWJlbEludGVyc2VjdFsyXSxcbiAgICAgICAgICAgIHk6IGxhYmVsSW50ZXJzZWN0WzNdXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGxhYkludDJTcURpc3QgPCBtaW5TcURpc3QpIHtcbiAgICAgICAgICAgIGludGVyc2VjdCA9IFtsYWJlbEludGVyc2VjdFsyXSwgbGFiZWxJbnRlcnNlY3RbM11dO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICB2YXIgYXJyb3dFbmQgPSBzaG9ydGVuSW50ZXJzZWN0aW9uKGludGVyc2VjdCwgcDEsIHIuYXJyb3dTaGFwZXNbdGd0QXJTaGFwZV0uc3BhY2luZyhlZGdlKSArIHRndERpc3QpO1xuICB2YXIgZWRnZUVuZCA9IHNob3J0ZW5JbnRlcnNlY3Rpb24oaW50ZXJzZWN0LCBwMSwgci5hcnJvd1NoYXBlc1t0Z3RBclNoYXBlXS5nYXAoZWRnZSkgKyB0Z3REaXN0KTtcbiAgcnMuZW5kWCA9IGVkZ2VFbmRbMF07XG4gIHJzLmVuZFkgPSBlZGdlRW5kWzFdO1xuICBycy5hcnJvd0VuZFggPSBhcnJvd0VuZFswXTtcbiAgcnMuYXJyb3dFbmRZID0gYXJyb3dFbmRbMV07XG4gIGlmIChzcmNNYW5FbmRwdFZhbCA9PT0gJ2luc2lkZS10by1ub2RlJykge1xuICAgIGludGVyc2VjdCA9IFtzcmNQb3MueCwgc3JjUG9zLnldO1xuICB9IGVsc2UgaWYgKHNyY01hbkVuZHB0LnVuaXRzKSB7XG4gICAgaW50ZXJzZWN0ID0gdGhpcy5tYW51YWxFbmRwdFRvUHgoc291cmNlLCBzcmNNYW5FbmRwdCk7XG4gIH0gZWxzZSBpZiAoc3JjTWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLWxpbmUnKSB7XG4gICAgaW50ZXJzZWN0ID0gcnMuc3JjSW50bjsgLy8gdXNlIGNhY2hlZCB2YWx1ZSBmcm9tIGN0cmxwdCBjYWxjXG4gIH0gZWxzZSB7XG4gICAgaWYgKHNyY01hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1ub2RlJyB8fCBzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbm9kZS1vci1sYWJlbCcpIHtcbiAgICAgIHAyX2kgPSBwMjtcbiAgICB9IGVsc2UgaWYgKHNyY01hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lJyB8fCBzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZS1vci1sYWJlbCcpIHtcbiAgICAgIHAyX2kgPSBbdGd0UG9zLngsIHRndFBvcy55XTtcbiAgICB9XG4gICAgaW50ZXJzZWN0ID0gci5ub2RlU2hhcGVzW3RoaXMuZ2V0Tm9kZVNoYXBlKHNvdXJjZSldLmludGVyc2VjdExpbmUoc3JjUG9zLngsIHNyY1Bvcy55LCBzb3VyY2Uub3V0ZXJXaWR0aCgpLCBzb3VyY2Uub3V0ZXJIZWlnaHQoKSwgcDJfaVswXSwgcDJfaVsxXSwgMCk7XG4gICAgaWYgKHNyY01hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1ub2RlLW9yLWxhYmVsJyB8fCBzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZS1vci1sYWJlbCcpIHtcbiAgICAgIHZhciBzcnMgPSBzb3VyY2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgICB2YXIgX2x3ID0gc3JzLmxhYmVsV2lkdGg7XG4gICAgICB2YXIgX2xoID0gc3JzLmxhYmVsSGVpZ2h0O1xuICAgICAgdmFyIF9seCA9IHNycy5sYWJlbFg7XG4gICAgICB2YXIgX2x5ID0gc3JzLmxhYmVsWTtcbiAgICAgIHZhciBfbHcyID0gX2x3IC8gMjtcbiAgICAgIHZhciBfbGgyID0gX2xoIC8gMjtcbiAgICAgIHZhciBfdmEgPSBzb3VyY2UucHN0eWxlKCd0ZXh0LXZhbGlnbicpLnZhbHVlO1xuICAgICAgaWYgKF92YSA9PT0gJ3RvcCcpIHtcbiAgICAgICAgX2x5IC09IF9saDI7XG4gICAgICB9IGVsc2UgaWYgKF92YSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgX2x5ICs9IF9saDI7XG4gICAgICB9XG4gICAgICB2YXIgX2hhID0gc291cmNlLnBzdHlsZSgndGV4dC1oYWxpZ24nKS52YWx1ZTtcbiAgICAgIGlmIChfaGEgPT09ICdsZWZ0Jykge1xuICAgICAgICBfbHggLT0gX2x3MjtcbiAgICAgIH0gZWxzZSBpZiAoX2hhID09PSAncmlnaHQnKSB7XG4gICAgICAgIF9seCArPSBfbHcyO1xuICAgICAgfVxuICAgICAgdmFyIF9sYWJlbEludGVyc2VjdCA9IHBvbHlnb25JbnRlcnNlY3RMaW5lKHAyX2lbMF0sIHAyX2lbMV0sIFtfbHggLSBfbHcyLCBfbHkgLSBfbGgyLCBfbHggKyBfbHcyLCBfbHkgLSBfbGgyLCBfbHggKyBfbHcyLCBfbHkgKyBfbGgyLCBfbHggLSBfbHcyLCBfbHkgKyBfbGgyXSwgc3JjUG9zLngsIHNyY1Bvcy55KTtcbiAgICAgIGlmIChfbGFiZWxJbnRlcnNlY3QubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgX3JlZlB0ID0gdGd0UG9zO1xuICAgICAgICB2YXIgX2ludFNxZGlzdCA9IHNxZGlzdChfcmVmUHQsIGFycmF5MnBvaW50KGludGVyc2VjdCkpO1xuICAgICAgICB2YXIgX2xhYkludFNxZGlzdCA9IHNxZGlzdChfcmVmUHQsIGFycmF5MnBvaW50KF9sYWJlbEludGVyc2VjdCkpO1xuICAgICAgICB2YXIgX21pblNxRGlzdCA9IF9pbnRTcWRpc3Q7XG4gICAgICAgIGlmIChfbGFiSW50U3FkaXN0IDwgX2ludFNxZGlzdCkge1xuICAgICAgICAgIGludGVyc2VjdCA9IFtfbGFiZWxJbnRlcnNlY3RbMF0sIF9sYWJlbEludGVyc2VjdFsxXV07XG4gICAgICAgICAgX21pblNxRGlzdCA9IF9sYWJJbnRTcWRpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9sYWJlbEludGVyc2VjdC5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgdmFyIF9sYWJJbnQyU3FEaXN0ID0gc3FkaXN0KF9yZWZQdCwge1xuICAgICAgICAgICAgeDogX2xhYmVsSW50ZXJzZWN0WzJdLFxuICAgICAgICAgICAgeTogX2xhYmVsSW50ZXJzZWN0WzNdXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKF9sYWJJbnQyU3FEaXN0IDwgX21pblNxRGlzdCkge1xuICAgICAgICAgICAgaW50ZXJzZWN0ID0gW19sYWJlbEludGVyc2VjdFsyXSwgX2xhYmVsSW50ZXJzZWN0WzNdXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIGFycm93U3RhcnQgPSBzaG9ydGVuSW50ZXJzZWN0aW9uKGludGVyc2VjdCwgcDIsIHIuYXJyb3dTaGFwZXNbc3JjQXJTaGFwZV0uc3BhY2luZyhlZGdlKSArIHNyY0Rpc3QpO1xuICB2YXIgZWRnZVN0YXJ0ID0gc2hvcnRlbkludGVyc2VjdGlvbihpbnRlcnNlY3QsIHAyLCByLmFycm93U2hhcGVzW3NyY0FyU2hhcGVdLmdhcChlZGdlKSArIHNyY0Rpc3QpO1xuICBycy5zdGFydFggPSBlZGdlU3RhcnRbMF07XG4gIHJzLnN0YXJ0WSA9IGVkZ2VTdGFydFsxXTtcbiAgcnMuYXJyb3dTdGFydFggPSBhcnJvd1N0YXJ0WzBdO1xuICBycy5hcnJvd1N0YXJ0WSA9IGFycm93U3RhcnRbMV07XG4gIGlmIChoYXNFbmRwdHMpIHtcbiAgICBpZiAoIW51bWJlciQxKHJzLnN0YXJ0WCkgfHwgIW51bWJlciQxKHJzLnN0YXJ0WSkgfHwgIW51bWJlciQxKHJzLmVuZFgpIHx8ICFudW1iZXIkMShycy5lbmRZKSkge1xuICAgICAgcnMuYmFkTGluZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJzLmJhZExpbmUgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn07XG5CUnAkYi5nZXRTb3VyY2VFbmRwb2ludCA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2VbMF0uX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHRoaXMucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKGVkZ2UpO1xuICBzd2l0Y2ggKHJzLmVkZ2VUeXBlKSB7XG4gICAgY2FzZSAnaGF5c3RhY2snOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogcnMuaGF5c3RhY2tQdHNbMF0sXG4gICAgICAgIHk6IHJzLmhheXN0YWNrUHRzWzFdXG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBycy5hcnJvd1N0YXJ0WCxcbiAgICAgICAgeTogcnMuYXJyb3dTdGFydFlcbiAgICAgIH07XG4gIH1cbn07XG5CUnAkYi5nZXRUYXJnZXRFbmRwb2ludCA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2VbMF0uX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHRoaXMucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKGVkZ2UpO1xuICBzd2l0Y2ggKHJzLmVkZ2VUeXBlKSB7XG4gICAgY2FzZSAnaGF5c3RhY2snOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogcnMuaGF5c3RhY2tQdHNbMl0sXG4gICAgICAgIHk6IHJzLmhheXN0YWNrUHRzWzNdXG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBycy5hcnJvd0VuZFgsXG4gICAgICAgIHk6IHJzLmFycm93RW5kWVxuICAgICAgfTtcbiAgfVxufTtcblxudmFyIEJScCRhID0ge307XG5mdW5jdGlvbiBwdXNoQmV6aWVyUHRzKHIsIGVkZ2UsIHB0cykge1xuICB2YXIgcWJlemllckF0JDEgPSBmdW5jdGlvbiBxYmV6aWVyQXQkMShwMSwgcDIsIHAzLCB0KSB7XG4gICAgcmV0dXJuIHFiZXppZXJBdChwMSwgcDIsIHAzLCB0KTtcbiAgfTtcbiAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgdmFyIGJwdHMgPSBfcC5yc3R5bGUuYmV6aWVyUHRzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHIuYmV6aWVyUHJvalBjdHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcCA9IHIuYmV6aWVyUHJvalBjdHNbaV07XG4gICAgYnB0cy5wdXNoKHtcbiAgICAgIHg6IHFiZXppZXJBdCQxKHB0c1swXSwgcHRzWzJdLCBwdHNbNF0sIHApLFxuICAgICAgeTogcWJlemllckF0JDEocHRzWzFdLCBwdHNbM10sIHB0c1s1XSwgcClcbiAgICB9KTtcbiAgfVxufVxuQlJwJGEuc3RvcmVFZGdlUHJvamVjdGlvbnMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgX3AgPSBlZGdlLl9wcml2YXRlO1xuICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgdmFyIGV0ID0gcnMuZWRnZVR5cGU7XG5cbiAgLy8gY2xlYXIgdGhlIGNhY2hlZCBwb2ludHMgc3RhdGVcbiAgX3AucnN0eWxlLmJlemllclB0cyA9IG51bGw7XG4gIF9wLnJzdHlsZS5saW5lUHRzID0gbnVsbDtcbiAgX3AucnN0eWxlLmhheXN0YWNrUHRzID0gbnVsbDtcbiAgaWYgKGV0ID09PSAnbXVsdGliZXppZXInIHx8IGV0ID09PSAnYmV6aWVyJyB8fCBldCA9PT0gJ3NlbGYnIHx8IGV0ID09PSAnY29tcG91bmQnKSB7XG4gICAgX3AucnN0eWxlLmJlemllclB0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpICsgNSA8IHJzLmFsbHB0cy5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgcHVzaEJlemllclB0cyh0aGlzLCBlZGdlLCBycy5hbGxwdHMuc2xpY2UoaSwgaSArIDYpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXQgPT09ICdzZWdtZW50cycpIHtcbiAgICB2YXIgbHB0cyA9IF9wLnJzdHlsZS5saW5lUHRzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgKyAxIDwgcnMuYWxscHRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBscHRzLnB1c2goe1xuICAgICAgICB4OiBycy5hbGxwdHNbaV0sXG4gICAgICAgIHk6IHJzLmFsbHB0c1tpICsgMV1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChldCA9PT0gJ2hheXN0YWNrJykge1xuICAgIHZhciBocHRzID0gcnMuaGF5c3RhY2tQdHM7XG4gICAgX3AucnN0eWxlLmhheXN0YWNrUHRzID0gW3tcbiAgICAgIHg6IGhwdHNbMF0sXG4gICAgICB5OiBocHRzWzFdXG4gICAgfSwge1xuICAgICAgeDogaHB0c1syXSxcbiAgICAgIHk6IGhwdHNbM11cbiAgICB9XTtcbiAgfVxuICBfcC5yc3R5bGUuYXJyb3dXaWR0aCA9IHRoaXMuZ2V0QXJyb3dXaWR0aChlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlLCBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZSkgKiB0aGlzLmFycm93U2hhcGVXaWR0aDtcbn07XG5CUnAkYS5yZWNhbGN1bGF0ZUVkZ2VQcm9qZWN0aW9ucyA9IGZ1bmN0aW9uIChlZGdlcykge1xuICB0aGlzLmZpbmRFZGdlQ29udHJvbFBvaW50cyhlZGdlcyk7XG59O1xuXG4vKiBnbG9iYWwgZG9jdW1lbnQgKi9cblxudmFyIEJScCQ5ID0ge307XG5CUnAkOS5yZWNhbGN1bGF0ZU5vZGVMYWJlbFByb2plY3Rpb24gPSBmdW5jdGlvbiAobm9kZSkge1xuICB2YXIgY29udGVudCA9IG5vZGUucHN0eWxlKCdsYWJlbCcpLnN0clZhbHVlO1xuICBpZiAoZW1wdHlTdHJpbmcoY29udGVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHRleHRYLCB0ZXh0WTtcbiAgdmFyIF9wID0gbm9kZS5fcHJpdmF0ZTtcbiAgdmFyIG5vZGVXaWR0aCA9IG5vZGUud2lkdGgoKTtcbiAgdmFyIG5vZGVIZWlnaHQgPSBub2RlLmhlaWdodCgpO1xuICB2YXIgcGFkZGluZyA9IG5vZGUucGFkZGluZygpO1xuICB2YXIgbm9kZVBvcyA9IG5vZGUucG9zaXRpb24oKTtcbiAgdmFyIHRleHRIYWxpZ24gPSBub2RlLnBzdHlsZSgndGV4dC1oYWxpZ24nKS5zdHJWYWx1ZTtcbiAgdmFyIHRleHRWYWxpZ24gPSBub2RlLnBzdHlsZSgndGV4dC12YWxpZ24nKS5zdHJWYWx1ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHZhciByc3R5bGUgPSBfcC5yc3R5bGU7XG4gIHN3aXRjaCAodGV4dEhhbGlnbikge1xuICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgdGV4dFggPSBub2RlUG9zLnggLSBub2RlV2lkdGggLyAyIC0gcGFkZGluZztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHRleHRYID0gbm9kZVBvcy54ICsgbm9kZVdpZHRoIC8gMiArIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gZS5nLiBjZW50ZXJcbiAgICAgIHRleHRYID0gbm9kZVBvcy54O1xuICB9XG4gIHN3aXRjaCAodGV4dFZhbGlnbikge1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgICB0ZXh0WSA9IG5vZGVQb3MueSAtIG5vZGVIZWlnaHQgLyAyIC0gcGFkZGluZztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICB0ZXh0WSA9IG5vZGVQb3MueSArIG5vZGVIZWlnaHQgLyAyICsgcGFkZGluZztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBlLmcuIG1pZGRsZVxuICAgICAgdGV4dFkgPSBub2RlUG9zLnk7XG4gIH1cbiAgcnMubGFiZWxYID0gdGV4dFg7XG4gIHJzLmxhYmVsWSA9IHRleHRZO1xuICByc3R5bGUubGFiZWxYID0gdGV4dFg7XG4gIHJzdHlsZS5sYWJlbFkgPSB0ZXh0WTtcbiAgdGhpcy5jYWxjdWxhdGVMYWJlbEFuZ2xlcyhub2RlKTtcbiAgdGhpcy5hcHBseUxhYmVsRGltZW5zaW9ucyhub2RlKTtcbn07XG52YXIgbGluZUFuZ2xlRnJvbURlbHRhID0gZnVuY3Rpb24gbGluZUFuZ2xlRnJvbURlbHRhKGR4LCBkeSkge1xuICB2YXIgYW5nbGUgPSBNYXRoLmF0YW4oZHkgLyBkeCk7XG4gIGlmIChkeCA9PT0gMCAmJiBhbmdsZSA8IDApIHtcbiAgICBhbmdsZSA9IGFuZ2xlICogLTE7XG4gIH1cbiAgcmV0dXJuIGFuZ2xlO1xufTtcbnZhciBsaW5lQW5nbGUgPSBmdW5jdGlvbiBsaW5lQW5nbGUocDAsIHAxKSB7XG4gIHZhciBkeCA9IHAxLnggLSBwMC54O1xuICB2YXIgZHkgPSBwMS55IC0gcDAueTtcbiAgcmV0dXJuIGxpbmVBbmdsZUZyb21EZWx0YShkeCwgZHkpO1xufTtcbnZhciBiZXppZXJBbmdsZSA9IGZ1bmN0aW9uIGJlemllckFuZ2xlKHAwLCBwMSwgcDIsIHQpIHtcbiAgdmFyIHQwID0gYm91bmQoMCwgdCAtIDAuMDAxLCAxKTtcbiAgdmFyIHQxID0gYm91bmQoMCwgdCArIDAuMDAxLCAxKTtcbiAgdmFyIGxwMCA9IHFiZXppZXJQdEF0KHAwLCBwMSwgcDIsIHQwKTtcbiAgdmFyIGxwMSA9IHFiZXppZXJQdEF0KHAwLCBwMSwgcDIsIHQxKTtcbiAgcmV0dXJuIGxpbmVBbmdsZShscDAsIGxwMSk7XG59O1xuQlJwJDkucmVjYWxjdWxhdGVFZGdlTGFiZWxQcm9qZWN0aW9ucyA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBwO1xuICB2YXIgX3AgPSBlZGdlLl9wcml2YXRlO1xuICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgY29udGVudCA9IHtcbiAgICBtaWQ6IGVkZ2UucHN0eWxlKCdsYWJlbCcpLnN0clZhbHVlLFxuICAgIHNvdXJjZTogZWRnZS5wc3R5bGUoJ3NvdXJjZS1sYWJlbCcpLnN0clZhbHVlLFxuICAgIHRhcmdldDogZWRnZS5wc3R5bGUoJ3RhcmdldC1sYWJlbCcpLnN0clZhbHVlXG4gIH07XG4gIGlmIChjb250ZW50Lm1pZCB8fCBjb250ZW50LnNvdXJjZSB8fCBjb250ZW50LnRhcmdldCkgOyBlbHNlIHtcbiAgICByZXR1cm47IC8vIG5vIGxhYmVscyA9PiBubyBjYWxjc1xuICB9XG5cbiAgLy8gYWRkIGNlbnRlciBwb2ludCB0byBzdHlsZSBzbyBib3VuZGluZyBib3ggY2FsY3VsYXRpb25zIGNhbiB1c2UgaXRcbiAgLy9cbiAgcCA9IHtcbiAgICB4OiBycy5taWRYLFxuICAgIHk6IHJzLm1pZFlcbiAgfTtcbiAgdmFyIHNldFJzID0gZnVuY3Rpb24gc2V0UnMocHJvcE5hbWUsIHByZWZpeCwgdmFsdWUpIHtcbiAgICBzZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzY3JhdGNoLCBwcm9wTmFtZSwgcHJlZml4LCB2YWx1ZSk7XG4gICAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc3R5bGUsIHByb3BOYW1lLCBwcmVmaXgsIHZhbHVlKTtcbiAgfTtcbiAgc2V0UnMoJ2xhYmVsWCcsIG51bGwsIHAueCk7XG4gIHNldFJzKCdsYWJlbFknLCBudWxsLCBwLnkpO1xuICB2YXIgbWlkQW5nbGUgPSBsaW5lQW5nbGVGcm9tRGVsdGEocnMubWlkRGlzcFgsIHJzLm1pZERpc3BZKTtcbiAgc2V0UnMoJ2xhYmVsQXV0b0FuZ2xlJywgbnVsbCwgbWlkQW5nbGUpO1xuICB2YXIgY3JlYXRlQ29udHJvbFBvaW50SW5mbyA9IGZ1bmN0aW9uIGNyZWF0ZUNvbnRyb2xQb2ludEluZm8oKSB7XG4gICAgaWYgKGNyZWF0ZUNvbnRyb2xQb2ludEluZm8uY2FjaGUpIHtcbiAgICAgIHJldHVybiBjcmVhdGVDb250cm9sUG9pbnRJbmZvLmNhY2hlO1xuICAgIH0gLy8gdXNlIGNhY2hlIHNvIG9ubHkgMXggcGVyIGVkZ2VcblxuICAgIHZhciBjdHJscHRzID0gW107XG5cbiAgICAvLyBzdG9yZSBlYWNoIGN0cmxwdCBpbmZvIGluaXRcbiAgICBmb3IgKHZhciBpID0gMDsgaSArIDUgPCBycy5hbGxwdHMubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgIHZhciBwMCA9IHtcbiAgICAgICAgeDogcnMuYWxscHRzW2ldLFxuICAgICAgICB5OiBycy5hbGxwdHNbaSArIDFdXG4gICAgICB9O1xuICAgICAgdmFyIHAxID0ge1xuICAgICAgICB4OiBycy5hbGxwdHNbaSArIDJdLFxuICAgICAgICB5OiBycy5hbGxwdHNbaSArIDNdXG4gICAgICB9OyAvLyBjdHJscHRcbiAgICAgIHZhciBwMiA9IHtcbiAgICAgICAgeDogcnMuYWxscHRzW2kgKyA0XSxcbiAgICAgICAgeTogcnMuYWxscHRzW2kgKyA1XVxuICAgICAgfTtcbiAgICAgIGN0cmxwdHMucHVzaCh7XG4gICAgICAgIHAwOiBwMCxcbiAgICAgICAgcDE6IHAxLFxuICAgICAgICBwMjogcDIsXG4gICAgICAgIHN0YXJ0RGlzdDogMCxcbiAgICAgICAgbGVuZ3RoOiAwLFxuICAgICAgICBzZWdtZW50czogW11cbiAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgYnB0cyA9IF9wLnJzdHlsZS5iZXppZXJQdHM7XG4gICAgdmFyIG5Qcm9qcyA9IHIuYmV6aWVyUHJvalBjdHMubGVuZ3RoO1xuICAgIGZ1bmN0aW9uIGFkZFNlZ21lbnQoY3AsIHAwLCBwMSwgdDAsIHQxKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gZGlzdChwMCwgcDEpO1xuICAgICAgdmFyIHByZXZTZWdtZW50ID0gY3Auc2VnbWVudHNbY3Auc2VnbWVudHMubGVuZ3RoIC0gMV07XG4gICAgICB2YXIgc2VnbWVudCA9IHtcbiAgICAgICAgcDA6IHAwLFxuICAgICAgICBwMTogcDEsXG4gICAgICAgIHQwOiB0MCxcbiAgICAgICAgdDE6IHQxLFxuICAgICAgICBzdGFydERpc3Q6IHByZXZTZWdtZW50ID8gcHJldlNlZ21lbnQuc3RhcnREaXN0ICsgcHJldlNlZ21lbnQubGVuZ3RoIDogMCxcbiAgICAgICAgbGVuZ3RoOiBsZW5ndGhcbiAgICAgIH07XG4gICAgICBjcC5zZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuICAgICAgY3AubGVuZ3RoICs9IGxlbmd0aDtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgZWFjaCBjdHJscHQgd2l0aCBzZWdtZW50IGluZm9cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgY3RybHB0cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBjcCA9IGN0cmxwdHNbX2ldO1xuICAgICAgdmFyIHByZXZDcCA9IGN0cmxwdHNbX2kgLSAxXTtcbiAgICAgIGlmIChwcmV2Q3ApIHtcbiAgICAgICAgY3Auc3RhcnREaXN0ID0gcHJldkNwLnN0YXJ0RGlzdCArIHByZXZDcC5sZW5ndGg7XG4gICAgICB9XG4gICAgICBhZGRTZWdtZW50KGNwLCBjcC5wMCwgYnB0c1tfaSAqIG5Qcm9qc10sIDAsIHIuYmV6aWVyUHJvalBjdHNbMF0pOyAvLyBmaXJzdFxuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5Qcm9qcyAtIDE7IGorKykge1xuICAgICAgICBhZGRTZWdtZW50KGNwLCBicHRzW19pICogblByb2pzICsgal0sIGJwdHNbX2kgKiBuUHJvanMgKyBqICsgMV0sIHIuYmV6aWVyUHJvalBjdHNbal0sIHIuYmV6aWVyUHJvalBjdHNbaiArIDFdKTtcbiAgICAgIH1cbiAgICAgIGFkZFNlZ21lbnQoY3AsIGJwdHNbX2kgKiBuUHJvanMgKyBuUHJvanMgLSAxXSwgY3AucDIsIHIuYmV6aWVyUHJvalBjdHNbblByb2pzIC0gMV0sIDEpOyAvLyBsYXN0XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUNvbnRyb2xQb2ludEluZm8uY2FjaGUgPSBjdHJscHRzO1xuICB9O1xuICB2YXIgY2FsY3VsYXRlRW5kUHJvamVjdGlvbiA9IGZ1bmN0aW9uIGNhbGN1bGF0ZUVuZFByb2plY3Rpb24ocHJlZml4KSB7XG4gICAgdmFyIGFuZ2xlO1xuICAgIHZhciBpc1NyYyA9IHByZWZpeCA9PT0gJ3NvdXJjZSc7XG4gICAgaWYgKCFjb250ZW50W3ByZWZpeF0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG9mZnNldCA9IGVkZ2UucHN0eWxlKHByZWZpeCArICctdGV4dC1vZmZzZXQnKS5wZlZhbHVlO1xuICAgIHN3aXRjaCAocnMuZWRnZVR5cGUpIHtcbiAgICAgIGNhc2UgJ3NlbGYnOlxuICAgICAgY2FzZSAnY29tcG91bmQnOlxuICAgICAgY2FzZSAnYmV6aWVyJzpcbiAgICAgIGNhc2UgJ211bHRpYmV6aWVyJzpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBjcHMgPSBjcmVhdGVDb250cm9sUG9pbnRJbmZvKCk7XG4gICAgICAgICAgdmFyIHNlbGVjdGVkO1xuICAgICAgICAgIHZhciBzdGFydERpc3QgPSAwO1xuICAgICAgICAgIHZhciB0b3RhbERpc3QgPSAwO1xuXG4gICAgICAgICAgLy8gZmluZCB0aGUgc2VnbWVudCB3ZSdyZSBvblxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgX2NwID0gY3BzW2lzU3JjID8gaSA6IGNwcy5sZW5ndGggLSAxIC0gaV07XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IF9jcC5zZWdtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICB2YXIgX3NlZyA9IF9jcC5zZWdtZW50c1tpc1NyYyA/IGogOiBfY3Auc2VnbWVudHMubGVuZ3RoIC0gMSAtIGpdO1xuICAgICAgICAgICAgICB2YXIgbGFzdFNlZyA9IGkgPT09IGNwcy5sZW5ndGggLSAxICYmIGogPT09IF9jcC5zZWdtZW50cy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICBzdGFydERpc3QgPSB0b3RhbERpc3Q7XG4gICAgICAgICAgICAgIHRvdGFsRGlzdCArPSBfc2VnLmxlbmd0aDtcbiAgICAgICAgICAgICAgaWYgKHRvdGFsRGlzdCA+PSBvZmZzZXQgfHwgbGFzdFNlZykge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkID0ge1xuICAgICAgICAgICAgICAgICAgY3A6IF9jcCxcbiAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IF9zZWdcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBjcCA9IHNlbGVjdGVkLmNwO1xuICAgICAgICAgIHZhciBzZWcgPSBzZWxlY3RlZC5zZWdtZW50O1xuICAgICAgICAgIHZhciB0U2VnbWVudCA9IChvZmZzZXQgLSBzdGFydERpc3QpIC8gc2VnLmxlbmd0aDtcbiAgICAgICAgICB2YXIgc2VnRHQgPSBzZWcudDEgLSBzZWcudDA7XG4gICAgICAgICAgdmFyIHQgPSBpc1NyYyA/IHNlZy50MCArIHNlZ0R0ICogdFNlZ21lbnQgOiBzZWcudDEgLSBzZWdEdCAqIHRTZWdtZW50O1xuICAgICAgICAgIHQgPSBib3VuZCgwLCB0LCAxKTtcbiAgICAgICAgICBwID0gcWJlemllclB0QXQoY3AucDAsIGNwLnAxLCBjcC5wMiwgdCk7XG4gICAgICAgICAgYW5nbGUgPSBiZXppZXJBbmdsZShjcC5wMCwgY3AucDEsIGNwLnAyLCB0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgY2FzZSAnc3RyYWlnaHQnOlxuICAgICAgY2FzZSAnc2VnbWVudHMnOlxuICAgICAgY2FzZSAnaGF5c3RhY2snOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGQgPSAwLFxuICAgICAgICAgICAgZGksXG4gICAgICAgICAgICBkMDtcbiAgICAgICAgICB2YXIgcDAsIHAxO1xuICAgICAgICAgIHZhciBsID0gcnMuYWxscHRzLmxlbmd0aDtcbiAgICAgICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgKyAzIDwgbDsgX2kyICs9IDIpIHtcbiAgICAgICAgICAgIGlmIChpc1NyYykge1xuICAgICAgICAgICAgICBwMCA9IHtcbiAgICAgICAgICAgICAgICB4OiBycy5hbGxwdHNbX2kyXSxcbiAgICAgICAgICAgICAgICB5OiBycy5hbGxwdHNbX2kyICsgMV1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgcDEgPSB7XG4gICAgICAgICAgICAgICAgeDogcnMuYWxscHRzW19pMiArIDJdLFxuICAgICAgICAgICAgICAgIHk6IHJzLmFsbHB0c1tfaTIgKyAzXVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcDAgPSB7XG4gICAgICAgICAgICAgICAgeDogcnMuYWxscHRzW2wgLSAyIC0gX2kyXSxcbiAgICAgICAgICAgICAgICB5OiBycy5hbGxwdHNbbCAtIDEgLSBfaTJdXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHAxID0ge1xuICAgICAgICAgICAgICAgIHg6IHJzLmFsbHB0c1tsIC0gNCAtIF9pMl0sXG4gICAgICAgICAgICAgICAgeTogcnMuYWxscHRzW2wgLSAzIC0gX2kyXVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGkgPSBkaXN0KHAwLCBwMSk7XG4gICAgICAgICAgICBkMCA9IGQ7XG4gICAgICAgICAgICBkICs9IGRpO1xuICAgICAgICAgICAgaWYgKGQgPj0gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgcEQgPSBvZmZzZXQgLSBkMDtcbiAgICAgICAgICB2YXIgX3QgPSBwRCAvIGRpO1xuICAgICAgICAgIF90ID0gYm91bmQoMCwgX3QsIDEpO1xuICAgICAgICAgIHAgPSBsaW5lQXQocDAsIHAxLCBfdCk7XG4gICAgICAgICAgYW5nbGUgPSBsaW5lQW5nbGUocDAsIHAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRScygnbGFiZWxYJywgcHJlZml4LCBwLngpO1xuICAgIHNldFJzKCdsYWJlbFknLCBwcmVmaXgsIHAueSk7XG4gICAgc2V0UnMoJ2xhYmVsQXV0b0FuZ2xlJywgcHJlZml4LCBhbmdsZSk7XG4gIH07XG4gIGNhbGN1bGF0ZUVuZFByb2plY3Rpb24oJ3NvdXJjZScpO1xuICBjYWxjdWxhdGVFbmRQcm9qZWN0aW9uKCd0YXJnZXQnKTtcbiAgdGhpcy5hcHBseUxhYmVsRGltZW5zaW9ucyhlZGdlKTtcbn07XG5CUnAkOS5hcHBseUxhYmVsRGltZW5zaW9ucyA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdGhpcy5hcHBseVByZWZpeGVkTGFiZWxEaW1lbnNpb25zKGVsZSk7XG4gIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICB0aGlzLmFwcGx5UHJlZml4ZWRMYWJlbERpbWVuc2lvbnMoZWxlLCAnc291cmNlJyk7XG4gICAgdGhpcy5hcHBseVByZWZpeGVkTGFiZWxEaW1lbnNpb25zKGVsZSwgJ3RhcmdldCcpO1xuICB9XG59O1xuQlJwJDkuYXBwbHlQcmVmaXhlZExhYmVsRGltZW5zaW9ucyA9IGZ1bmN0aW9uIChlbGUsIHByZWZpeCkge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciB0ZXh0ID0gdGhpcy5nZXRMYWJlbFRleHQoZWxlLCBwcmVmaXgpO1xuICB2YXIgbGFiZWxEaW1zID0gdGhpcy5jYWxjdWxhdGVMYWJlbERpbWVuc2lvbnMoZWxlLCB0ZXh0KTtcbiAgdmFyIGxpbmVIZWlnaHQgPSBlbGUucHN0eWxlKCdsaW5lLWhlaWdodCcpLnBmVmFsdWU7XG4gIHZhciB0ZXh0V3JhcCA9IGVsZS5wc3R5bGUoJ3RleHQtd3JhcCcpLnN0clZhbHVlO1xuICB2YXIgbGluZXMgPSBnZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzY3JhdGNoLCAnbGFiZWxXcmFwQ2FjaGVkTGluZXMnLCBwcmVmaXgpIHx8IFtdO1xuICB2YXIgbnVtTGluZXMgPSB0ZXh0V3JhcCAhPT0gJ3dyYXAnID8gMSA6IE1hdGgubWF4KGxpbmVzLmxlbmd0aCwgMSk7XG4gIHZhciBub3JtUGVyTGluZUhlaWdodCA9IGxhYmVsRGltcy5oZWlnaHQgLyBudW1MaW5lcztcbiAgdmFyIGxhYmVsTGluZUhlaWdodCA9IG5vcm1QZXJMaW5lSGVpZ2h0ICogbGluZUhlaWdodDtcbiAgdmFyIHdpZHRoID0gbGFiZWxEaW1zLndpZHRoO1xuICB2YXIgaGVpZ2h0ID0gbGFiZWxEaW1zLmhlaWdodCArIChudW1MaW5lcyAtIDEpICogKGxpbmVIZWlnaHQgLSAxKSAqIG5vcm1QZXJMaW5lSGVpZ2h0O1xuICBzZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzdHlsZSwgJ2xhYmVsV2lkdGgnLCBwcmVmaXgsIHdpZHRoKTtcbiAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgJ2xhYmVsV2lkdGgnLCBwcmVmaXgsIHdpZHRoKTtcbiAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc3R5bGUsICdsYWJlbEhlaWdodCcsIHByZWZpeCwgaGVpZ2h0KTtcbiAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgJ2xhYmVsSGVpZ2h0JywgcHJlZml4LCBoZWlnaHQpO1xuICBzZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzY3JhdGNoLCAnbGFiZWxMaW5lSGVpZ2h0JywgcHJlZml4LCBsYWJlbExpbmVIZWlnaHQpO1xufTtcbkJScCQ5LmdldExhYmVsVGV4dCA9IGZ1bmN0aW9uIChlbGUsIHByZWZpeCkge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBwZmQgPSBwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJztcbiAgdmFyIHRleHQgPSBlbGUucHN0eWxlKHBmZCArICdsYWJlbCcpLnN0clZhbHVlO1xuICB2YXIgdGV4dFRyYW5zZm9ybSA9IGVsZS5wc3R5bGUoJ3RleHQtdHJhbnNmb3JtJykudmFsdWU7XG4gIHZhciByc2NyYXRjaCA9IGZ1bmN0aW9uIHJzY3JhdGNoKHByb3BOYW1lLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgcHJvcE5hbWUsIHByZWZpeCwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgcHJvcE5hbWUsIHByZWZpeCk7XG4gICAgfVxuICB9O1xuXG4gIC8vIGZvciBlbXB0eSB0ZXh0LCBza2lwIGFsbCBwcm9jZXNzaW5nXG4gIGlmICghdGV4dCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBpZiAodGV4dFRyYW5zZm9ybSA9PSAnbm9uZScpIDsgZWxzZSBpZiAodGV4dFRyYW5zZm9ybSA9PSAndXBwZXJjYXNlJykge1xuICAgIHRleHQgPSB0ZXh0LnRvVXBwZXJDYXNlKCk7XG4gIH0gZWxzZSBpZiAodGV4dFRyYW5zZm9ybSA9PSAnbG93ZXJjYXNlJykge1xuICAgIHRleHQgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgdmFyIHdyYXBTdHlsZSA9IGVsZS5wc3R5bGUoJ3RleHQtd3JhcCcpLnZhbHVlO1xuICBpZiAod3JhcFN0eWxlID09PSAnd3JhcCcpIHtcbiAgICB2YXIgbGFiZWxLZXkgPSByc2NyYXRjaCgnbGFiZWxLZXknKTtcblxuICAgIC8vIHNhdmUgcmVjYWxjIGlmIHRoZSBsYWJlbCBpcyB0aGUgc2FtZSBhcyBiZWZvcmVcbiAgICBpZiAobGFiZWxLZXkgIT0gbnVsbCAmJiByc2NyYXRjaCgnbGFiZWxXcmFwS2V5JykgPT09IGxhYmVsS2V5KSB7XG4gICAgICByZXR1cm4gcnNjcmF0Y2goJ2xhYmVsV3JhcENhY2hlZFRleHQnKTtcbiAgICB9XG4gICAgdmFyIHp3c3AgPSBcIlxcdTIwMEJcIjtcbiAgICB2YXIgbGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcbiAgICB2YXIgbWF4VyA9IGVsZS5wc3R5bGUoJ3RleHQtbWF4LXdpZHRoJykucGZWYWx1ZTtcbiAgICB2YXIgb3ZlcmZsb3cgPSBlbGUucHN0eWxlKCd0ZXh0LW92ZXJmbG93LXdyYXAnKS52YWx1ZTtcbiAgICB2YXIgb3ZlcmZsb3dBbnkgPSBvdmVyZmxvdyA9PT0gJ2FueXdoZXJlJztcbiAgICB2YXIgd3JhcHBlZExpbmVzID0gW107XG4gICAgdmFyIHdvcmRzUmVnZXggPSAvW1xcc1xcdTIwMGJdKy87XG4gICAgdmFyIHdvcmRTZXBhcmF0b3IgPSBvdmVyZmxvd0FueSA/ICcnIDogJyAnO1xuICAgIGZvciAodmFyIGwgPSAwOyBsIDwgbGluZXMubGVuZ3RoOyBsKyspIHtcbiAgICAgIHZhciBsaW5lID0gbGluZXNbbF07XG4gICAgICB2YXIgbGluZURpbXMgPSB0aGlzLmNhbGN1bGF0ZUxhYmVsRGltZW5zaW9ucyhlbGUsIGxpbmUpO1xuICAgICAgdmFyIGxpbmVXID0gbGluZURpbXMud2lkdGg7XG4gICAgICBpZiAob3ZlcmZsb3dBbnkpIHtcbiAgICAgICAgdmFyIHByb2Nlc3NlZExpbmUgPSBsaW5lLnNwbGl0KCcnKS5qb2luKHp3c3ApO1xuICAgICAgICBsaW5lID0gcHJvY2Vzc2VkTGluZTtcbiAgICAgIH1cbiAgICAgIGlmIChsaW5lVyA+IG1heFcpIHtcbiAgICAgICAgLy8gbGluZSBpcyB0b28gbG9uZ1xuICAgICAgICB2YXIgd29yZHMgPSBsaW5lLnNwbGl0KHdvcmRzUmVnZXgpO1xuICAgICAgICB2YXIgc3VibGluZSA9ICcnO1xuICAgICAgICBmb3IgKHZhciB3ID0gMDsgdyA8IHdvcmRzLmxlbmd0aDsgdysrKSB7XG4gICAgICAgICAgdmFyIHdvcmQgPSB3b3Jkc1t3XTtcbiAgICAgICAgICB2YXIgdGVzdExpbmUgPSBzdWJsaW5lLmxlbmd0aCA9PT0gMCA/IHdvcmQgOiBzdWJsaW5lICsgd29yZFNlcGFyYXRvciArIHdvcmQ7XG4gICAgICAgICAgdmFyIHRlc3REaW1zID0gdGhpcy5jYWxjdWxhdGVMYWJlbERpbWVuc2lvbnMoZWxlLCB0ZXN0TGluZSk7XG4gICAgICAgICAgdmFyIHRlc3RXID0gdGVzdERpbXMud2lkdGg7XG4gICAgICAgICAgaWYgKHRlc3RXIDw9IG1heFcpIHtcbiAgICAgICAgICAgIC8vIHdvcmQgZml0cyBvbiBjdXJyZW50IGxpbmVcbiAgICAgICAgICAgIHN1YmxpbmUgKz0gd29yZCArIHdvcmRTZXBhcmF0b3I7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHdvcmQgc3RhcnRzIG5ldyBsaW5lXG4gICAgICAgICAgICBpZiAoc3VibGluZSkge1xuICAgICAgICAgICAgICB3cmFwcGVkTGluZXMucHVzaChzdWJsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1YmxpbmUgPSB3b3JkICsgd29yZFNlcGFyYXRvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGVyZSdzIHJlbWFpbmluZyB0ZXh0LCBwdXQgaXQgaW4gYSB3cmFwcGVkIGxpbmVcbiAgICAgICAgaWYgKCFzdWJsaW5lLm1hdGNoKC9eW1xcc1xcdTIwMGJdKyQvKSkge1xuICAgICAgICAgIHdyYXBwZWRMaW5lcy5wdXNoKHN1YmxpbmUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBsaW5lIGlzIGFscmVhZHkgc2hvcnQgZW5vdWdoXG4gICAgICAgIHdyYXBwZWRMaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgfVxuICAgIH0gLy8gZm9yXG5cbiAgICByc2NyYXRjaCgnbGFiZWxXcmFwQ2FjaGVkTGluZXMnLCB3cmFwcGVkTGluZXMpO1xuICAgIHRleHQgPSByc2NyYXRjaCgnbGFiZWxXcmFwQ2FjaGVkVGV4dCcsIHdyYXBwZWRMaW5lcy5qb2luKCdcXG4nKSk7XG4gICAgcnNjcmF0Y2goJ2xhYmVsV3JhcEtleScsIGxhYmVsS2V5KTtcbiAgfSBlbHNlIGlmICh3cmFwU3R5bGUgPT09ICdlbGxpcHNpcycpIHtcbiAgICB2YXIgX21heFcgPSBlbGUucHN0eWxlKCd0ZXh0LW1heC13aWR0aCcpLnBmVmFsdWU7XG4gICAgdmFyIGVsbGlwc2l6ZWQgPSAnJztcbiAgICB2YXIgZWxsaXBzaXMgPSBcIlxcdTIwMjZcIjtcbiAgICB2YXIgaW5jTGFzdENoID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuY2FsY3VsYXRlTGFiZWxEaW1lbnNpb25zKGVsZSwgdGV4dCkud2lkdGggPCBfbWF4Vykge1xuICAgICAgLy8gdGhlIGxhYmVsIGFscmVhZHkgZml0c1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHdpZHRoV2l0aE5leHRDaCA9IHRoaXMuY2FsY3VsYXRlTGFiZWxEaW1lbnNpb25zKGVsZSwgZWxsaXBzaXplZCArIHRleHRbaV0gKyBlbGxpcHNpcykud2lkdGg7XG4gICAgICBpZiAod2lkdGhXaXRoTmV4dENoID4gX21heFcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBlbGxpcHNpemVkICs9IHRleHRbaV07XG4gICAgICBpZiAoaSA9PT0gdGV4dC5sZW5ndGggLSAxKSB7XG4gICAgICAgIGluY0xhc3RDaCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaW5jTGFzdENoKSB7XG4gICAgICBlbGxpcHNpemVkICs9IGVsbGlwc2lzO1xuICAgIH1cbiAgICByZXR1cm4gZWxsaXBzaXplZDtcbiAgfSAvLyBpZiBlbGxpcHNpemVcblxuICByZXR1cm4gdGV4dDtcbn07XG5CUnAkOS5nZXRMYWJlbEp1c3RpZmljYXRpb24gPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHZhciBqdXN0aWZpY2F0aW9uID0gZWxlLnBzdHlsZSgndGV4dC1qdXN0aWZpY2F0aW9uJykuc3RyVmFsdWU7XG4gIHZhciB0ZXh0SGFsaWduID0gZWxlLnBzdHlsZSgndGV4dC1oYWxpZ24nKS5zdHJWYWx1ZTtcbiAgaWYgKGp1c3RpZmljYXRpb24gPT09ICdhdXRvJykge1xuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIHN3aXRjaCAodGV4dEhhbGlnbikge1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuICdjZW50ZXInO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2NlbnRlcic7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBqdXN0aWZpY2F0aW9uO1xuICB9XG59O1xuQlJwJDkuY2FsY3VsYXRlTGFiZWxEaW1lbnNpb25zID0gZnVuY3Rpb24gKGVsZSwgdGV4dCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjYWNoZUtleSA9IGhhc2hTdHJpbmcodGV4dCwgZWxlLl9wcml2YXRlLmxhYmVsRGltc0tleSk7XG4gIHZhciBjYWNoZSA9IHIubGFiZWxEaW1DYWNoZSB8fCAoci5sYWJlbERpbUNhY2hlID0gW10pO1xuICB2YXIgZXhpc3RpbmdWYWwgPSBjYWNoZVtjYWNoZUtleV07XG4gIGlmIChleGlzdGluZ1ZhbCAhPSBudWxsKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nVmFsO1xuICB9XG4gIHZhciBwYWRkaW5nID0gMDsgLy8gYWRkIHBhZGRpbmcgYXJvdW5kIHRleHQgZGltcywgYXMgdGhlIG1lYXN1cmVtZW50IGlzbid0IHRoYXQgYWNjdXJhdGVcbiAgdmFyIGZTdHlsZSA9IGVsZS5wc3R5bGUoJ2ZvbnQtc3R5bGUnKS5zdHJWYWx1ZTtcbiAgdmFyIHNpemUgPSBlbGUucHN0eWxlKCdmb250LXNpemUnKS5wZlZhbHVlO1xuICB2YXIgZmFtaWx5ID0gZWxlLnBzdHlsZSgnZm9udC1mYW1pbHknKS5zdHJWYWx1ZTtcbiAgdmFyIHdlaWdodCA9IGVsZS5wc3R5bGUoJ2ZvbnQtd2VpZ2h0Jykuc3RyVmFsdWU7XG4gIHZhciBjYW52YXMgPSB0aGlzLmxhYmVsQ2FsY0NhbnZhcztcbiAgdmFyIGMyZCA9IHRoaXMubGFiZWxDYWxjQ2FudmFzQ29udGV4dDtcbiAgaWYgKCFjYW52YXMpIHtcbiAgICBjYW52YXMgPSB0aGlzLmxhYmVsQ2FsY0NhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGMyZCA9IHRoaXMubGFiZWxDYWxjQ2FudmFzQ29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIHZhciBkcyA9IGNhbnZhcy5zdHlsZTtcbiAgICBkcy5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgZHMubGVmdCA9ICctOTk5OXB4JztcbiAgICBkcy50b3AgPSAnLTk5OTlweCc7XG4gICAgZHMuekluZGV4ID0gJy0xJztcbiAgICBkcy52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgZHMucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgfVxuICBjMmQuZm9udCA9IFwiXCIuY29uY2F0KGZTdHlsZSwgXCIgXCIpLmNvbmNhdCh3ZWlnaHQsIFwiIFwiKS5jb25jYXQoc2l6ZSwgXCJweCBcIikuY29uY2F0KGZhbWlseSk7XG4gIHZhciB3aWR0aCA9IDA7XG4gIHZhciBoZWlnaHQgPSAwO1xuICB2YXIgbGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBsaW5lID0gbGluZXNbaV07XG4gICAgdmFyIG1ldHJpY3MgPSBjMmQubWVhc3VyZVRleHQobGluZSk7XG4gICAgdmFyIHcgPSBNYXRoLmNlaWwobWV0cmljcy53aWR0aCk7XG4gICAgdmFyIGggPSBzaXplO1xuICAgIHdpZHRoID0gTWF0aC5tYXgodywgd2lkdGgpO1xuICAgIGhlaWdodCArPSBoO1xuICB9XG4gIHdpZHRoICs9IHBhZGRpbmc7XG4gIGhlaWdodCArPSBwYWRkaW5nO1xuICByZXR1cm4gY2FjaGVbY2FjaGVLZXldID0ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9O1xufTtcbkJScCQ5LmNhbGN1bGF0ZUxhYmVsQW5nbGUgPSBmdW5jdGlvbiAoZWxlLCBwcmVmaXgpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgdmFyIGlzRWRnZSA9IGVsZS5pc0VkZ2UoKTtcbiAgdmFyIHByZWZpeERhc2ggPSBwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJztcbiAgdmFyIHJvdCA9IGVsZS5wc3R5bGUocHJlZml4RGFzaCArICd0ZXh0LXJvdGF0aW9uJyk7XG4gIHZhciByb3RTdHIgPSByb3Quc3RyVmFsdWU7XG4gIGlmIChyb3RTdHIgPT09ICdub25lJykge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2UgaWYgKGlzRWRnZSAmJiByb3RTdHIgPT09ICdhdXRvcm90YXRlJykge1xuICAgIHJldHVybiBycy5sYWJlbEF1dG9BbmdsZTtcbiAgfSBlbHNlIGlmIChyb3RTdHIgPT09ICdhdXRvcm90YXRlJykge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByb3QucGZWYWx1ZTtcbiAgfVxufTtcbkJScCQ5LmNhbGN1bGF0ZUxhYmVsQW5nbGVzID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBpc0VkZ2UgPSBlbGUuaXNFZGdlKCk7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHJzLmxhYmVsQW5nbGUgPSByLmNhbGN1bGF0ZUxhYmVsQW5nbGUoZWxlKTtcbiAgaWYgKGlzRWRnZSkge1xuICAgIHJzLnNvdXJjZUxhYmVsQW5nbGUgPSByLmNhbGN1bGF0ZUxhYmVsQW5nbGUoZWxlLCAnc291cmNlJyk7XG4gICAgcnMudGFyZ2V0TGFiZWxBbmdsZSA9IHIuY2FsY3VsYXRlTGFiZWxBbmdsZShlbGUsICd0YXJnZXQnKTtcbiAgfVxufTtcblxudmFyIEJScCQ4ID0ge307XG52YXIgVE9PX1NNQUxMX0NVVF9SRUNUID0gMjg7XG52YXIgd2FybmVkQ3V0UmVjdCA9IGZhbHNlO1xuQlJwJDguZ2V0Tm9kZVNoYXBlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgc2hhcGUgPSBub2RlLnBzdHlsZSgnc2hhcGUnKS52YWx1ZTtcbiAgaWYgKHNoYXBlID09PSAnY3V0cmVjdGFuZ2xlJyAmJiAobm9kZS53aWR0aCgpIDwgVE9PX1NNQUxMX0NVVF9SRUNUIHx8IG5vZGUuaGVpZ2h0KCkgPCBUT09fU01BTExfQ1VUX1JFQ1QpKSB7XG4gICAgaWYgKCF3YXJuZWRDdXRSZWN0KSB7XG4gICAgICB3YXJuKCdUaGUgYGN1dHJlY3RhbmdsZWAgbm9kZSBzaGFwZSBjYW4gbm90IGJlIHVzZWQgYXQgc21hbGwgc2l6ZXMgc28gYHJlY3RhbmdsZWAgaXMgdXNlZCBpbnN0ZWFkJyk7XG4gICAgICB3YXJuZWRDdXRSZWN0ID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuICdyZWN0YW5nbGUnO1xuICB9XG4gIGlmIChub2RlLmlzUGFyZW50KCkpIHtcbiAgICBpZiAoc2hhcGUgPT09ICdyZWN0YW5nbGUnIHx8IHNoYXBlID09PSAncm91bmRyZWN0YW5nbGUnIHx8IHNoYXBlID09PSAncm91bmQtcmVjdGFuZ2xlJyB8fCBzaGFwZSA9PT0gJ2N1dHJlY3RhbmdsZScgfHwgc2hhcGUgPT09ICdjdXQtcmVjdGFuZ2xlJyB8fCBzaGFwZSA9PT0gJ2JhcnJlbCcpIHtcbiAgICAgIHJldHVybiBzaGFwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdyZWN0YW5nbGUnO1xuICAgIH1cbiAgfVxuICBpZiAoc2hhcGUgPT09ICdwb2x5Z29uJykge1xuICAgIHZhciBwb2ludHMgPSBub2RlLnBzdHlsZSgnc2hhcGUtcG9seWdvbi1wb2ludHMnKS52YWx1ZTtcbiAgICByZXR1cm4gci5ub2RlU2hhcGVzLm1ha2VQb2x5Z29uKHBvaW50cykubmFtZTtcbiAgfVxuICByZXR1cm4gc2hhcGU7XG59O1xuXG52YXIgQlJwJDcgPSB7fTtcbkJScCQ3LnJlZ2lzdGVyQ2FsY3VsYXRpb25MaXN0ZW5lcnMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjeSA9IHRoaXMuY3k7XG4gIHZhciBlbGVzVG9VcGRhdGUgPSBjeS5jb2xsZWN0aW9uKCk7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGVucXVldWUgPSBmdW5jdGlvbiBlbnF1ZXVlKGVsZXMpIHtcbiAgICB2YXIgZGlydHlTdHlsZUNhY2hlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgICBlbGVzVG9VcGRhdGUubWVyZ2UoZWxlcyk7XG4gICAgaWYgKGRpcnR5U3R5bGVDYWNoZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgICAgICB2YXIgcnN0eWxlID0gX3AucnN0eWxlO1xuICAgICAgICByc3R5bGUuY2xlYW4gPSBmYWxzZTtcbiAgICAgICAgcnN0eWxlLmNsZWFuQ29ubmVjdGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByLmJpbmRlcihjeSkub24oJ2JvdW5kcy4qIGRpcnR5LionLCBmdW5jdGlvbiBvbkRpcnR5Qm91bmRzKGUpIHtcbiAgICB2YXIgZWxlID0gZS50YXJnZXQ7XG4gICAgZW5xdWV1ZShlbGUpO1xuICB9KS5vbignc3R5bGUuKiBiYWNrZ3JvdW5kLionLCBmdW5jdGlvbiBvbkRpcnR5U3R5bGUoZSkge1xuICAgIHZhciBlbGUgPSBlLnRhcmdldDtcbiAgICBlbnF1ZXVlKGVsZSwgZmFsc2UpO1xuICB9KTtcbiAgdmFyIHVwZGF0ZUVsZUNhbGNzID0gZnVuY3Rpb24gdXBkYXRlRWxlQ2FsY3Mod2lsbERyYXcpIHtcbiAgICBpZiAod2lsbERyYXcpIHtcbiAgICAgIHZhciBmbnMgPSByLm9uVXBkYXRlRWxlQ2FsY3NGbnM7XG5cbiAgICAgIC8vIGJlY2F1c2Ugd2UgbmVlZCB0byBoYXZlIHVwLXRvLWRhdGUgc3R5bGUgKGUuZy4gc3R5bGVzaGVldCBtYXBwZXJzKVxuICAgICAgLy8gYmVmb3JlIGNhbGN1bGF0aW5nIHJlbmRlcmVkIHN0eWxlIChhbmQgcHN0eWxlIG1pZ2h0IG5vdCBiZSBjYWxsZWQgeWV0KVxuICAgICAgZWxlc1RvVXBkYXRlLmNsZWFuU3R5bGUoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlc1RvVXBkYXRlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBlbGVzVG9VcGRhdGVbaV07XG4gICAgICAgIHZhciByc3R5bGUgPSBlbGUuX3ByaXZhdGUucnN0eWxlO1xuICAgICAgICBpZiAoZWxlLmlzTm9kZSgpICYmICFyc3R5bGUuY2xlYW5Db25uZWN0ZWQpIHtcbiAgICAgICAgICBlbnF1ZXVlKGVsZS5jb25uZWN0ZWRFZGdlcygpKTtcbiAgICAgICAgICByc3R5bGUuY2xlYW5Db25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm5zKSB7XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBmbnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgdmFyIGZuID0gZm5zW19pXTtcbiAgICAgICAgICBmbih3aWxsRHJhdywgZWxlc1RvVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgci5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUoZWxlc1RvVXBkYXRlKTtcbiAgICAgIGVsZXNUb1VwZGF0ZSA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICB9XG4gIH07XG4gIHIuZmx1c2hSZW5kZXJlZFN0eWxlUXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdXBkYXRlRWxlQ2FsY3ModHJ1ZSk7XG4gIH07XG4gIHIuYmVmb3JlUmVuZGVyKHVwZGF0ZUVsZUNhbGNzLCByLmJlZm9yZVJlbmRlclByaW9yaXRpZXMuZWxlQ2FsY3MpO1xufTtcbkJScCQ3Lm9uVXBkYXRlRWxlQ2FsY3MgPSBmdW5jdGlvbiAoZm4pIHtcbiAgdmFyIGZucyA9IHRoaXMub25VcGRhdGVFbGVDYWxjc0ZucyA9IHRoaXMub25VcGRhdGVFbGVDYWxjc0ZucyB8fCBbXTtcbiAgZm5zLnB1c2goZm4pO1xufTtcbkJScCQ3LnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZSA9IGZ1bmN0aW9uIChlbGVzLCB1c2VDYWNoZSkge1xuICB2YXIgaXNDbGVhbkNvbm5lY3RlZCA9IGZ1bmN0aW9uIGlzQ2xlYW5Db25uZWN0ZWQoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5yc3R5bGUuY2xlYW5Db25uZWN0ZWQ7XG4gIH07XG4gIHZhciBlZGdlcyA9IFtdO1xuICB2YXIgbm9kZXMgPSBbXTtcblxuICAvLyB0aGUgcmVuZGVyZXIgY2FuJ3QgYmUgdXNlZCBmb3IgY2FsY3Mgd2hlbiBkZXN0cm95ZWQsIGUuZy4gZWxlLmJvdW5kaW5nQm94KClcbiAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gdXNlIGNhY2hlIGJ5IGRlZmF1bHQgZm9yIHBlcmZcbiAgaWYgKHVzZUNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICB1c2VDYWNoZSA9IHRydWU7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgIHZhciByc3R5bGUgPSBfcC5yc3R5bGU7XG5cbiAgICAvLyBhbiBlZGdlIG1heSBiZSBpbXBsaWNpdGx5IGRpcnR5IGIvYyBvZiBvbmUgb2YgaXRzIGNvbm5lY3RlZCBub2Rlc1xuICAgIC8vIChhbmQgYSByZXF1ZXN0IGZvciByZWNhbGMgbWF5IGNvbWUgaW4gYmV0d2VlbiBmcmFtZXMpXG4gICAgaWYgKGVsZS5pc0VkZ2UoKSAmJiAoIWlzQ2xlYW5Db25uZWN0ZWQoZWxlLnNvdXJjZSgpKSB8fCAhaXNDbGVhbkNvbm5lY3RlZChlbGUudGFyZ2V0KCkpKSkge1xuICAgICAgcnN0eWxlLmNsZWFuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gb25seSB1cGRhdGUgaWYgZGlydHkgYW5kIGluIGdyYXBoXG4gICAgaWYgKHVzZUNhY2hlICYmIHJzdHlsZS5jbGVhbiB8fCBlbGUucmVtb3ZlZCgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBvbmx5IHVwZGF0ZSBpZiBub3QgZGlzcGxheTogbm9uZVxuICAgIGlmIChlbGUucHN0eWxlKCdkaXNwbGF5JykudmFsdWUgPT09ICdub25lJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChfcC5ncm91cCA9PT0gJ25vZGVzJykge1xuICAgICAgbm9kZXMucHVzaChlbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlZGdlc1xuICAgICAgZWRnZXMucHVzaChlbGUpO1xuICAgIH1cbiAgICByc3R5bGUuY2xlYW4gPSB0cnVlO1xuICB9XG5cbiAgLy8gdXBkYXRlIG5vZGUgZGF0YSBmcm9tIHByb2plY3Rpb25zXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG5vZGVzLmxlbmd0aDsgX2kyKyspIHtcbiAgICB2YXIgX2VsZSA9IG5vZGVzW19pMl07XG4gICAgdmFyIF9wMiA9IF9lbGUuX3ByaXZhdGU7XG4gICAgdmFyIF9yc3R5bGUgPSBfcDIucnN0eWxlO1xuICAgIHZhciBwb3MgPSBfZWxlLnBvc2l0aW9uKCk7XG4gICAgdGhpcy5yZWNhbGN1bGF0ZU5vZGVMYWJlbFByb2plY3Rpb24oX2VsZSk7XG4gICAgX3JzdHlsZS5ub2RlWCA9IHBvcy54O1xuICAgIF9yc3R5bGUubm9kZVkgPSBwb3MueTtcbiAgICBfcnN0eWxlLm5vZGVXID0gX2VsZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZTtcbiAgICBfcnN0eWxlLm5vZGVIID0gX2VsZS5wc3R5bGUoJ2hlaWdodCcpLnBmVmFsdWU7XG4gIH1cbiAgdGhpcy5yZWNhbGN1bGF0ZUVkZ2VQcm9qZWN0aW9ucyhlZGdlcyk7XG5cbiAgLy8gdXBkYXRlIGVkZ2UgZGF0YSBmcm9tIHByb2plY3Rpb25zXG4gIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGVkZ2VzLmxlbmd0aDsgX2kzKyspIHtcbiAgICB2YXIgX2VsZTIgPSBlZGdlc1tfaTNdO1xuICAgIHZhciBfcDMgPSBfZWxlMi5fcHJpdmF0ZTtcbiAgICB2YXIgX3JzdHlsZTIgPSBfcDMucnN0eWxlO1xuICAgIHZhciBycyA9IF9wMy5yc2NyYXRjaDtcblxuICAgIC8vIHVwZGF0ZSByc3R5bGUgcG9zaXRpb25zXG4gICAgX3JzdHlsZTIuc3JjWCA9IHJzLmFycm93U3RhcnRYO1xuICAgIF9yc3R5bGUyLnNyY1kgPSBycy5hcnJvd1N0YXJ0WTtcbiAgICBfcnN0eWxlMi50Z3RYID0gcnMuYXJyb3dFbmRYO1xuICAgIF9yc3R5bGUyLnRndFkgPSBycy5hcnJvd0VuZFk7XG4gICAgX3JzdHlsZTIubWlkWCA9IHJzLm1pZFg7XG4gICAgX3JzdHlsZTIubWlkWSA9IHJzLm1pZFk7XG4gICAgX3JzdHlsZTIubGFiZWxBbmdsZSA9IHJzLmxhYmVsQW5nbGU7XG4gICAgX3JzdHlsZTIuc291cmNlTGFiZWxBbmdsZSA9IHJzLnNvdXJjZUxhYmVsQW5nbGU7XG4gICAgX3JzdHlsZTIudGFyZ2V0TGFiZWxBbmdsZSA9IHJzLnRhcmdldExhYmVsQW5nbGU7XG4gIH1cbn07XG5cbnZhciBCUnAkNiA9IHt9O1xuQlJwJDYudXBkYXRlQ2FjaGVkR3JhYmJlZEVsZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGVzID0gdGhpcy5jYWNoZWRaU29ydGVkRWxlcztcbiAgaWYgKCFlbGVzKSB7XG4gICAgLy8ganVzdCBsZXQgdGhpcyBiZSByZWNhbGN1bGF0ZWQgb24gdGhlIG5leHQgeiBzb3J0IHRpY2tcbiAgICByZXR1cm47XG4gIH1cbiAgZWxlcy5kcmFnID0gW107XG4gIGVsZXMubm9uZHJhZyA9IFtdO1xuICB2YXIgZ3JhYlRhcmdldHMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgdmFyIHJzID0gZWxlLl9wcml2YXRlLnJzY3JhdGNoO1xuICAgIGlmIChlbGUuZ3JhYmJlZCgpICYmICFlbGUuaXNQYXJlbnQoKSkge1xuICAgICAgZ3JhYlRhcmdldHMucHVzaChlbGUpO1xuICAgIH0gZWxzZSBpZiAocnMuaW5EcmFnTGF5ZXIpIHtcbiAgICAgIGVsZXMuZHJhZy5wdXNoKGVsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZXMubm9uZHJhZy5wdXNoKGVsZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gcHV0IHRoZSBncmFiIHRhcmdldCBub2RlcyBsYXN0IHNvIGl0J3Mgb24gdG9wIG9mIGl0cyBuZWlnaGJvdXJob29kXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JhYlRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZ3JhYlRhcmdldHNbaV07XG4gICAgZWxlcy5kcmFnLnB1c2goZWxlKTtcbiAgfVxufTtcbkJScCQ2LmludmFsaWRhdGVDYWNoZWRaU29ydGVkRWxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5jYWNoZWRaU29ydGVkRWxlcyA9IG51bGw7XG59O1xuQlJwJDYuZ2V0Q2FjaGVkWlNvcnRlZEVsZXMgPSBmdW5jdGlvbiAoZm9yY2VSZWNhbGMpIHtcbiAgaWYgKGZvcmNlUmVjYWxjIHx8ICF0aGlzLmNhY2hlZFpTb3J0ZWRFbGVzKSB7XG4gICAgdmFyIGVsZXMgPSB0aGlzLmN5Lm11dGFibGVFbGVtZW50cygpLnRvQXJyYXkoKTtcbiAgICBlbGVzLnNvcnQoekluZGV4U29ydCk7XG4gICAgZWxlcy5pbnRlcmFjdGl2ZSA9IGVsZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaW50ZXJhY3RpdmUoKTtcbiAgICB9KTtcbiAgICB0aGlzLmNhY2hlZFpTb3J0ZWRFbGVzID0gZWxlcztcbiAgICB0aGlzLnVwZGF0ZUNhY2hlZEdyYWJiZWRFbGVzKCk7XG4gIH0gZWxzZSB7XG4gICAgZWxlcyA9IHRoaXMuY2FjaGVkWlNvcnRlZEVsZXM7XG4gIH1cbiAgcmV0dXJuIGVsZXM7XG59O1xuXG52YXIgQlJwJDUgPSB7fTtcbltCUnAkZSwgQlJwJGQsIEJScCRjLCBCUnAkYiwgQlJwJGEsIEJScCQ5LCBCUnAkOCwgQlJwJDcsIEJScCQ2XS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoQlJwJDUsIHByb3BzKTtcbn0pO1xuXG52YXIgQlJwJDQgPSB7fTtcbkJScCQ0LmdldENhY2hlZEltYWdlID0gZnVuY3Rpb24gKHVybCwgY3Jvc3NPcmlnaW4sIG9uTG9hZCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBpbWFnZUNhY2hlID0gci5pbWFnZUNhY2hlID0gci5pbWFnZUNhY2hlIHx8IHt9O1xuICB2YXIgY2FjaGUgPSBpbWFnZUNhY2hlW3VybF07XG4gIGlmIChjYWNoZSkge1xuICAgIGlmICghY2FjaGUuaW1hZ2UuY29tcGxldGUpIHtcbiAgICAgIGNhY2hlLmltYWdlLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbkxvYWQpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGUuaW1hZ2U7XG4gIH0gZWxzZSB7XG4gICAgY2FjaGUgPSBpbWFnZUNhY2hlW3VybF0gPSBpbWFnZUNhY2hlW3VybF0gfHwge307XG4gICAgdmFyIGltYWdlID0gY2FjaGUuaW1hZ2UgPSBuZXcgSW1hZ2UoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gICAgaW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIG9uTG9hZCk7XG4gICAgaW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpbWFnZS5lcnJvciA9IHRydWU7XG4gICAgfSk7XG5cbiAgICAvLyAjMTU4MiBzYWZhcmkgZG9lc24ndCBsb2FkIGRhdGEgdXJpcyB3aXRoIGNyb3NzT3JpZ2luIHByb3Blcmx5XG4gICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyMzk3OFxuICAgIHZhciBkYXRhVXJpUHJlZml4ID0gJ2RhdGE6JztcbiAgICB2YXIgaXNEYXRhVXJpID0gdXJsLnN1YnN0cmluZygwLCBkYXRhVXJpUHJlZml4Lmxlbmd0aCkudG9Mb3dlckNhc2UoKSA9PT0gZGF0YVVyaVByZWZpeDtcbiAgICBpZiAoIWlzRGF0YVVyaSkge1xuICAgICAgLy8gaWYgY3Jvc3NvcmlnaW4gaXMgJ251bGwnKHN0cmluZ2lmaWVkKSwgdGhlbiBtYW51YWxseSBzZXQgaXQgdG8gbnVsbCBcbiAgICAgIGNyb3NzT3JpZ2luID0gY3Jvc3NPcmlnaW4gPT09ICdudWxsJyA/IG51bGwgOiBjcm9zc09yaWdpbjtcbiAgICAgIGltYWdlLmNyb3NzT3JpZ2luID0gY3Jvc3NPcmlnaW47IC8vIHByZXZlbnQgdGFpbnRlZCBjYW52YXNcbiAgICB9XG5cbiAgICBpbWFnZS5zcmMgPSB1cmw7XG4gICAgcmV0dXJuIGltYWdlO1xuICB9XG59O1xuXG52YXIgQlJwJDMgPSB7fTtcblxuLyogZ2xvYmFsIGRvY3VtZW50LCB3aW5kb3csIFJlc2l6ZU9ic2VydmVyLCBNdXRhdGlvbk9ic2VydmVyICovXG5cbkJScCQzLnJlZ2lzdGVyQmluZGluZyA9IGZ1bmN0aW9uICh0YXJnZXQsIGV2ZW50LCBoYW5kbGVyLCB1c2VDYXB0dXJlKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzLCBbMV0pOyAvLyBjb3B5XG4gIHZhciBiID0gdGhpcy5iaW5kZXIodGFyZ2V0KTtcbiAgcmV0dXJuIGIub24uYXBwbHkoYiwgYXJncyk7XG59O1xuQlJwJDMuYmluZGVyID0gZnVuY3Rpb24gKHRndCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjb250YWluZXJXaW5kb3cgPSByLmN5LndpbmRvdygpO1xuICB2YXIgdGd0SXNEb20gPSB0Z3QgPT09IGNvbnRhaW5lcldpbmRvdyB8fCB0Z3QgPT09IGNvbnRhaW5lcldpbmRvdy5kb2N1bWVudCB8fCB0Z3QgPT09IGNvbnRhaW5lcldpbmRvdy5kb2N1bWVudC5ib2R5IHx8IGRvbUVsZW1lbnQodGd0KTtcbiAgaWYgKHIuc3VwcG9ydHNQYXNzaXZlRXZlbnRzID09IG51bGwpIHtcbiAgICAvLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL0V2ZW50TGlzdGVuZXJPcHRpb25zL2Jsb2IvZ2gtcGFnZXMvZXhwbGFpbmVyLm1kI2ZlYXR1cmUtZGV0ZWN0aW9uXG4gICAgdmFyIHN1cHBvcnRzUGFzc2l2ZSA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICB2YXIgb3B0cyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHN1cHBvcnRzUGFzc2l2ZSA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29udGFpbmVyV2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBudWxsLCBvcHRzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIG5vdCBzdXBwb3J0ZWRcbiAgICB9XG4gICAgci5zdXBwb3J0c1Bhc3NpdmVFdmVudHMgPSBzdXBwb3J0c1Bhc3NpdmU7XG4gIH1cbiAgdmFyIG9uID0gZnVuY3Rpb24gb24oZXZlbnQsIGhhbmRsZXIsIHVzZUNhcHR1cmUpIHtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgaWYgKHRndElzRG9tICYmIHIuc3VwcG9ydHNQYXNzaXZlRXZlbnRzKSB7XG4gICAgICAvLyByZXBsYWNlIHVzZUNhcHR1cmUgdy8gb3B0cyBvYmpcbiAgICAgIGFyZ3NbMl0gPSB7XG4gICAgICAgIGNhcHR1cmU6IHVzZUNhcHR1cmUgIT0gbnVsbCA/IHVzZUNhcHR1cmUgOiBmYWxzZSxcbiAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICAgIG9uY2U6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICByLmJpbmRpbmdzLnB1c2goe1xuICAgICAgdGFyZ2V0OiB0Z3QsXG4gICAgICBhcmdzOiBhcmdzXG4gICAgfSk7XG4gICAgKHRndC5hZGRFdmVudExpc3RlbmVyIHx8IHRndC5vbikuYXBwbHkodGd0LCBhcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBvbjogb24sXG4gICAgYWRkRXZlbnRMaXN0ZW5lcjogb24sXG4gICAgYWRkTGlzdGVuZXI6IG9uLFxuICAgIGJpbmQ6IG9uXG4gIH07XG59O1xuQlJwJDMubm9kZUlzRHJhZ2dhYmxlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5pc05vZGUoKSAmJiAhbm9kZS5sb2NrZWQoKSAmJiBub2RlLmdyYWJiYWJsZSgpO1xufTtcbkJScCQzLm5vZGVJc0dyYWJiYWJsZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHJldHVybiB0aGlzLm5vZGVJc0RyYWdnYWJsZShub2RlKSAmJiBub2RlLmludGVyYWN0aXZlKCk7XG59O1xuQlJwJDMubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgY29udGFpbmVyV2luZG93ID0gci5jeS53aW5kb3coKTtcbiAgdmFyIGlzU2VsZWN0ZWQgPSBmdW5jdGlvbiBpc1NlbGVjdGVkKGVsZSkge1xuICAgIHJldHVybiBlbGUuc2VsZWN0ZWQoKTtcbiAgfTtcbiAgdmFyIHRyaWdnZXJFdmVudHMgPSBmdW5jdGlvbiB0cmlnZ2VyRXZlbnRzKHRhcmdldCwgbmFtZXMsIGUsIHBvc2l0aW9uKSB7XG4gICAgaWYgKHRhcmdldCA9PSBudWxsKSB7XG4gICAgICB0YXJnZXQgPSByLmN5O1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IG5hbWVzW2ldO1xuICAgICAgdGFyZ2V0LmVtaXQoe1xuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0eXBlOiBuYW1lLFxuICAgICAgICBwb3NpdGlvbjogcG9zaXRpb25cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgdmFyIGlzTXVsdFNlbEtleURvd24gPSBmdW5jdGlvbiBpc011bHRTZWxLZXlEb3duKGUpIHtcbiAgICByZXR1cm4gZS5zaGlmdEtleSB8fCBlLm1ldGFLZXkgfHwgZS5jdHJsS2V5OyAvLyBtYXliZSBlLmFsdEtleVxuICB9O1xuXG4gIHZhciBhbGxvd1Bhbm5pbmdQYXNzdGhyb3VnaCA9IGZ1bmN0aW9uIGFsbG93UGFubmluZ1Bhc3N0aHJvdWdoKGRvd24sIGRvd25zKSB7XG4gICAgdmFyIGFsbG93UGFzc3Rocm91Z2ggPSB0cnVlO1xuICAgIGlmIChyLmN5Lmhhc0NvbXBvdW5kTm9kZXMoKSAmJiBkb3duICYmIGRvd24ucGFubmFibGUoKSkge1xuICAgICAgLy8gYSBncmFiYmFibGUgY29tcG91bmQgbm9kZSBiZWxvdyB0aGUgZWxlID0+IG5vIHBhc3N0aHJvdWdoIHBhbm5pbmdcbiAgICAgIGZvciAodmFyIGkgPSAwOyBkb3ducyAmJiBpIDwgZG93bnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGRvd24gPSBkb3duc1tpXTtcblxuICAgICAgICAvL2lmIGFueSBwYXJlbnQgbm9kZSBpbiBldmVudCBoaWVyYXJjaHkgaXNuJ3QgcGFubmFibGUsIHJlamVjdCBwYXNzdGhyb3VnaFxuICAgICAgICBpZiAoZG93bi5pc05vZGUoKSAmJiBkb3duLmlzUGFyZW50KCkgJiYgIWRvd24ucGFubmFibGUoKSkge1xuICAgICAgICAgIGFsbG93UGFzc3Rocm91Z2ggPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhbGxvd1Bhc3N0aHJvdWdoID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGFsbG93UGFzc3Rocm91Z2g7XG4gIH07XG4gIHZhciBzZXRHcmFiYmVkID0gZnVuY3Rpb24gc2V0R3JhYmJlZChlbGUpIHtcbiAgICBlbGVbMF0uX3ByaXZhdGUuZ3JhYmJlZCA9IHRydWU7XG4gIH07XG4gIHZhciBzZXRGcmVlZCA9IGZ1bmN0aW9uIHNldEZyZWVkKGVsZSkge1xuICAgIGVsZVswXS5fcHJpdmF0ZS5ncmFiYmVkID0gZmFsc2U7XG4gIH07XG4gIHZhciBzZXRJbkRyYWdMYXllciA9IGZ1bmN0aW9uIHNldEluRHJhZ0xheWVyKGVsZSkge1xuICAgIGVsZVswXS5fcHJpdmF0ZS5yc2NyYXRjaC5pbkRyYWdMYXllciA9IHRydWU7XG4gIH07XG4gIHZhciBzZXRPdXREcmFnTGF5ZXIgPSBmdW5jdGlvbiBzZXRPdXREcmFnTGF5ZXIoZWxlKSB7XG4gICAgZWxlWzBdLl9wcml2YXRlLnJzY3JhdGNoLmluRHJhZ0xheWVyID0gZmFsc2U7XG4gIH07XG4gIHZhciBzZXRHcmFiVGFyZ2V0ID0gZnVuY3Rpb24gc2V0R3JhYlRhcmdldChlbGUpIHtcbiAgICBlbGVbMF0uX3ByaXZhdGUucnNjcmF0Y2guaXNHcmFiVGFyZ2V0ID0gdHJ1ZTtcbiAgfTtcbiAgdmFyIHJlbW92ZUdyYWJUYXJnZXQgPSBmdW5jdGlvbiByZW1vdmVHcmFiVGFyZ2V0KGVsZSkge1xuICAgIGVsZVswXS5fcHJpdmF0ZS5yc2NyYXRjaC5pc0dyYWJUYXJnZXQgPSBmYWxzZTtcbiAgfTtcbiAgdmFyIGFkZFRvRHJhZ0xpc3QgPSBmdW5jdGlvbiBhZGRUb0RyYWdMaXN0KGVsZSwgb3B0cykge1xuICAgIHZhciBsaXN0ID0gb3B0cy5hZGRUb0xpc3Q7XG4gICAgdmFyIGxpc3RIYXNFbGUgPSBsaXN0LmhhcyhlbGUpO1xuICAgIGlmICghbGlzdEhhc0VsZSAmJiBlbGUuZ3JhYmJhYmxlKCkgJiYgIWVsZS5sb2NrZWQoKSkge1xuICAgICAgbGlzdC5tZXJnZShlbGUpO1xuICAgICAgc2V0R3JhYmJlZChlbGUpO1xuICAgIH1cbiAgfTtcblxuICAvLyBoZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGNoaWxkIG5vZGVzIGFuZCBpbm5lciBlZGdlc1xuICAvLyBvZiBhIGNvbXBvdW5kIG5vZGUgdG8gYmUgZHJhZ2dlZCBhcyB3ZWxsIGFzIHRoZSBncmFiYmVkIGFuZCBzZWxlY3RlZCBub2Rlc1xuICB2YXIgYWRkRGVzY2VuZGFudHNUb0RyYWcgPSBmdW5jdGlvbiBhZGREZXNjZW5kYW50c1RvRHJhZyhub2RlLCBvcHRzKSB7XG4gICAgaWYgKCFub2RlLmN5KCkuaGFzQ29tcG91bmROb2RlcygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChvcHRzLmluRHJhZ0xheWVyID09IG51bGwgJiYgb3B0cy5hZGRUb0xpc3QgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gbm90aGluZyB0byBkb1xuXG4gICAgdmFyIGlubmVyTm9kZXMgPSBub2RlLmRlc2NlbmRhbnRzKCk7XG4gICAgaWYgKG9wdHMuaW5EcmFnTGF5ZXIpIHtcbiAgICAgIGlubmVyTm9kZXMuZm9yRWFjaChzZXRJbkRyYWdMYXllcik7XG4gICAgICBpbm5lck5vZGVzLmNvbm5lY3RlZEVkZ2VzKCkuZm9yRWFjaChzZXRJbkRyYWdMYXllcik7XG4gICAgfVxuICAgIGlmIChvcHRzLmFkZFRvTGlzdCkge1xuICAgICAgYWRkVG9EcmFnTGlzdChpbm5lck5vZGVzLCBvcHRzKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gYWRkcyB0aGUgZ2l2ZW4gbm9kZXMgYW5kIGl0cyBuZWlnaGJvdXJob29kIHRvIHRoZSBkcmFnIGxheWVyXG4gIHZhciBhZGROb2Rlc1RvRHJhZyA9IGZ1bmN0aW9uIGFkZE5vZGVzVG9EcmFnKG5vZGVzLCBvcHRzKSB7XG4gICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgdmFyIGhhc0NvbXBvdW5kTm9kZXMgPSBub2Rlcy5jeSgpLmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgICBpZiAob3B0cy5pbkRyYWdMYXllcikge1xuICAgICAgbm9kZXMuZm9yRWFjaChzZXRJbkRyYWdMYXllcik7XG4gICAgICBub2Rlcy5uZWlnaGJvcmhvb2QoKS5zdGRGaWx0ZXIoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICByZXR1cm4gIWhhc0NvbXBvdW5kTm9kZXMgfHwgZWxlLmlzRWRnZSgpO1xuICAgICAgfSkuZm9yRWFjaChzZXRJbkRyYWdMYXllcik7XG4gICAgfVxuICAgIGlmIChvcHRzLmFkZFRvTGlzdCkge1xuICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgIGFkZFRvRHJhZ0xpc3QoZWxlLCBvcHRzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBhZGREZXNjZW5kYW50c1RvRHJhZyhub2Rlcywgb3B0cyk7IC8vIGFsd2F5cyBhZGQgdG8gZHJhZ1xuXG4gICAgLy8gYWxzbyBhZGQgbm9kZXMgYW5kIGVkZ2VzIHJlbGF0ZWQgdG8gdGhlIHRvcG1vc3QgYW5jZXN0b3JcbiAgICB1cGRhdGVBbmNlc3RvcnNJbkRyYWdMYXllcihub2Rlcywge1xuICAgICAgaW5EcmFnTGF5ZXI6IG9wdHMuaW5EcmFnTGF5ZXJcbiAgICB9KTtcbiAgICByLnVwZGF0ZUNhY2hlZEdyYWJiZWRFbGVzKCk7XG4gIH07XG4gIHZhciBhZGROb2RlVG9EcmFnID0gYWRkTm9kZXNUb0RyYWc7XG4gIHZhciBmcmVlRHJhZ2dlZEVsZW1lbnRzID0gZnVuY3Rpb24gZnJlZURyYWdnZWRFbGVtZW50cyhncmFiYmVkRWxlcykge1xuICAgIGlmICghZ3JhYmJlZEVsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBqdXN0IGdvIG92ZXIgYWxsIGVsZW1lbnRzIHJhdGhlciB0aGFuIGRvaW5nIGEgYnVuY2ggb2YgKHBvc3NpYmx5IGV4cGVuc2l2ZSkgdHJhdmVyc2Fsc1xuICAgIHIuZ2V0Q2FjaGVkWlNvcnRlZEVsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHNldEZyZWVkKGVsZSk7XG4gICAgICBzZXRPdXREcmFnTGF5ZXIoZWxlKTtcbiAgICAgIHJlbW92ZUdyYWJUYXJnZXQoZWxlKTtcbiAgICB9KTtcbiAgICByLnVwZGF0ZUNhY2hlZEdyYWJiZWRFbGVzKCk7XG4gIH07XG5cbiAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGljaCBhbmNlc3RvciBub2RlcyBhbmQgZWRnZXMgc2hvdWxkIGdvXG4gIC8vIHRvIHRoZSBkcmFnIGxheWVyIChvciBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIGRyYWcgbGF5ZXIpLlxuICB2YXIgdXBkYXRlQW5jZXN0b3JzSW5EcmFnTGF5ZXIgPSBmdW5jdGlvbiB1cGRhdGVBbmNlc3RvcnNJbkRyYWdMYXllcihub2RlLCBvcHRzKSB7XG4gICAgaWYgKG9wdHMuaW5EcmFnTGF5ZXIgPT0gbnVsbCAmJiBvcHRzLmFkZFRvTGlzdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBub3RoaW5nIHRvIGRvXG5cbiAgICBpZiAoIW5vZGUuY3koKS5oYXNDb21wb3VuZE5vZGVzKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBmaW5kIHRvcC1sZXZlbCBwYXJlbnRcbiAgICB2YXIgcGFyZW50ID0gbm9kZS5hbmNlc3RvcnMoKS5vcnBoYW5zKCk7XG5cbiAgICAvLyBubyBwYXJlbnQgbm9kZTogbm8gbm9kZXMgdG8gYWRkIHRvIHRoZSBkcmFnIGxheWVyXG4gICAgaWYgKHBhcmVudC5zYW1lKG5vZGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBub2RlcyA9IHBhcmVudC5kZXNjZW5kYW50cygpLnNwYXduU2VsZigpLm1lcmdlKHBhcmVudCkudW5tZXJnZShub2RlKS51bm1lcmdlKG5vZGUuZGVzY2VuZGFudHMoKSk7XG4gICAgdmFyIGVkZ2VzID0gbm9kZXMuY29ubmVjdGVkRWRnZXMoKTtcbiAgICBpZiAob3B0cy5pbkRyYWdMYXllcikge1xuICAgICAgZWRnZXMuZm9yRWFjaChzZXRJbkRyYWdMYXllcik7XG4gICAgICBub2Rlcy5mb3JFYWNoKHNldEluRHJhZ0xheWVyKTtcbiAgICB9XG4gICAgaWYgKG9wdHMuYWRkVG9MaXN0KSB7XG4gICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgYWRkVG9EcmFnTGlzdChlbGUsIG9wdHMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICB2YXIgYmx1ckFjdGl2ZURvbUVsZW1lbnQgPSBmdW5jdGlvbiBibHVyQWN0aXZlRG9tRWxlbWVudCgpIHtcbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPSBudWxsICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1ciAhPSBudWxsKSB7XG4gICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKTtcbiAgICB9XG4gIH07XG4gIHZhciBoYXZlTXV0YXRpb25zQXBpID0gdHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnO1xuICB2YXIgaGF2ZVJlc2l6ZU9ic2VydmVyQXBpID0gdHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJztcblxuICAvLyB3YXRjaCBmb3Igd2hlbiB0aGUgY3kgY29udGFpbmVyIGlzIHJlbW92ZWQgZnJvbSB0aGUgZG9tXG4gIGlmIChoYXZlTXV0YXRpb25zQXBpKSB7XG4gICAgci5yZW1vdmVPYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChtdXRucykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdXRucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbXV0biA9IG11dG5zW2ldO1xuICAgICAgICB2YXIgck5vZGVzID0gbXV0bi5yZW1vdmVkTm9kZXM7XG4gICAgICAgIGlmIChyTm9kZXMpIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJOb2Rlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHJOb2RlID0gck5vZGVzW2pdO1xuICAgICAgICAgICAgaWYgKHJOb2RlID09PSByLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgICByLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHIuY29udGFpbmVyLnBhcmVudE5vZGUpIHtcbiAgICAgIHIucmVtb3ZlT2JzZXJ2ZXIub2JzZXJ2ZShyLmNvbnRhaW5lci5wYXJlbnROb2RlLCB7XG4gICAgICAgIGNoaWxkTGlzdDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnRE9NTm9kZVJlbW92ZWQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgci5kZXN0cm95KCk7XG4gICAgfSk7XG4gIH1cbiAgdmFyIG9uUmVzaXplID0gZGVib3VuY2VfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGZ1bmN0aW9uICgpIHtcbiAgICByLmN5LnJlc2l6ZSgpO1xuICB9LCAxMDApO1xuICBpZiAoaGF2ZU11dGF0aW9uc0FwaSkge1xuICAgIHIuc3R5bGVPYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG9uUmVzaXplKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gICAgci5zdHlsZU9ic2VydmVyLm9ic2VydmUoci5jb250YWluZXIsIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGF1dG8gcmVzaXplXG4gIHIucmVnaXN0ZXJCaW5kaW5nKGNvbnRhaW5lcldpbmRvdywgJ3Jlc2l6ZScsIG9uUmVzaXplKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gIGlmIChoYXZlUmVzaXplT2JzZXJ2ZXJBcGkpIHtcbiAgICByLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKG9uUmVzaXplKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gICAgci5yZXNpemVPYnNlcnZlci5vYnNlcnZlKHIuY29udGFpbmVyKTtcbiAgfVxuICB2YXIgZm9yRWFjaFVwID0gZnVuY3Rpb24gZm9yRWFjaFVwKGRvbUVsZSwgZm4pIHtcbiAgICB3aGlsZSAoZG9tRWxlICE9IG51bGwpIHtcbiAgICAgIGZuKGRvbUVsZSk7XG4gICAgICBkb21FbGUgPSBkb21FbGUucGFyZW50Tm9kZTtcbiAgICB9XG4gIH07XG4gIHZhciBpbnZhbGlkYXRlQ29vcmRzID0gZnVuY3Rpb24gaW52YWxpZGF0ZUNvb3JkcygpIHtcbiAgICByLmludmFsaWRhdGVDb250YWluZXJDbGllbnRDb29yZHNDYWNoZSgpO1xuICB9O1xuICBmb3JFYWNoVXAoci5jb250YWluZXIsIGZ1bmN0aW9uIChkb21FbGUpIHtcbiAgICByLnJlZ2lzdGVyQmluZGluZyhkb21FbGUsICd0cmFuc2l0aW9uZW5kJywgaW52YWxpZGF0ZUNvb3Jkcyk7XG4gICAgci5yZWdpc3RlckJpbmRpbmcoZG9tRWxlLCAnYW5pbWF0aW9uZW5kJywgaW52YWxpZGF0ZUNvb3Jkcyk7XG4gICAgci5yZWdpc3RlckJpbmRpbmcoZG9tRWxlLCAnc2Nyb2xsJywgaW52YWxpZGF0ZUNvb3Jkcyk7XG4gIH0pO1xuXG4gIC8vIHN0b3AgcmlnaHQgY2xpY2sgbWVudSBmcm9tIGFwcGVhcmluZyBvbiBjeVxuICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ2NvbnRleHRtZW51JywgZnVuY3Rpb24gKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH0pO1xuICB2YXIgaW5Cb3hTZWxlY3Rpb24gPSBmdW5jdGlvbiBpbkJveFNlbGVjdGlvbigpIHtcbiAgICByZXR1cm4gci5zZWxlY3Rpb25bNF0gIT09IDA7XG4gIH07XG4gIHZhciBldmVudEluQ29udGFpbmVyID0gZnVuY3Rpb24gZXZlbnRJbkNvbnRhaW5lcihlKSB7XG4gICAgLy8gc2F2ZSBjeWNsZXMgaWYgbW91c2UgZXZlbnRzIGFyZW4ndCB0byBiZSBjYXB0dXJlZFxuICAgIHZhciBjb250YWluZXJQYWdlQ29vcmRzID0gci5maW5kQ29udGFpbmVyQ2xpZW50Q29vcmRzKCk7XG4gICAgdmFyIHggPSBjb250YWluZXJQYWdlQ29vcmRzWzBdO1xuICAgIHZhciB5ID0gY29udGFpbmVyUGFnZUNvb3Jkc1sxXTtcbiAgICB2YXIgd2lkdGggPSBjb250YWluZXJQYWdlQ29vcmRzWzJdO1xuICAgIHZhciBoZWlnaHQgPSBjb250YWluZXJQYWdlQ29vcmRzWzNdO1xuICAgIHZhciBwb3NpdGlvbnMgPSBlLnRvdWNoZXMgPyBlLnRvdWNoZXMgOiBbZV07XG4gICAgdmFyIGF0TGVhc3RPbmVQb3NJbnNpZGUgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHAgPSBwb3NpdGlvbnNbaV07XG4gICAgICBpZiAoeCA8PSBwLmNsaWVudFggJiYgcC5jbGllbnRYIDw9IHggKyB3aWR0aCAmJiB5IDw9IHAuY2xpZW50WSAmJiBwLmNsaWVudFkgPD0geSArIGhlaWdodCkge1xuICAgICAgICBhdExlYXN0T25lUG9zSW5zaWRlID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghYXRMZWFzdE9uZVBvc0luc2lkZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgY29udGFpbmVyID0gci5jb250YWluZXI7XG4gICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0O1xuICAgIHZhciB0UGFyZW50ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgdmFyIGNvbnRhaW5lcklzVGFyZ2V0ID0gZmFsc2U7XG4gICAgd2hpbGUgKHRQYXJlbnQpIHtcbiAgICAgIGlmICh0UGFyZW50ID09PSBjb250YWluZXIpIHtcbiAgICAgICAgY29udGFpbmVySXNUYXJnZXQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRQYXJlbnQgPSB0UGFyZW50LnBhcmVudE5vZGU7XG4gICAgfVxuICAgIGlmICghY29udGFpbmVySXNUYXJnZXQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIGlmIHRhcmdldCBpcyBvdXRpc2RlIGN5IGNvbnRhaW5lciwgdGhlbiB0aGlzIGV2ZW50IGlzIG5vdCBmb3IgdXNcblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIC8vIFByaW1hcnkga2V5XG4gIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnbW91c2Vkb3duJywgZnVuY3Rpb24gbW91c2Vkb3duSGFuZGxlcihlKSB7XG4gICAgaWYgKCFldmVudEluQ29udGFpbmVyKGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBibHVyQWN0aXZlRG9tRWxlbWVudCgpO1xuICAgIHIuaG92ZXJEYXRhLmNhcHR1cmUgPSB0cnVlO1xuICAgIHIuaG92ZXJEYXRhLndoaWNoID0gZS53aGljaDtcbiAgICB2YXIgY3kgPSByLmN5O1xuICAgIHZhciBncG9zID0gW2UuY2xpZW50WCwgZS5jbGllbnRZXTtcbiAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGdwb3NbMF0sIGdwb3NbMV0pO1xuICAgIHZhciBzZWxlY3QgPSByLnNlbGVjdGlvbjtcbiAgICB2YXIgbmVhcnMgPSByLmZpbmROZWFyZXN0RWxlbWVudHMocG9zWzBdLCBwb3NbMV0sIHRydWUsIGZhbHNlKTtcbiAgICB2YXIgbmVhciA9IG5lYXJzWzBdO1xuICAgIHZhciBkcmFnZ2VkRWxlbWVudHMgPSByLmRyYWdEYXRhLnBvc3NpYmxlRHJhZ0VsZW1lbnRzO1xuICAgIHIuaG92ZXJEYXRhLm1kb3duUG9zID0gcG9zO1xuICAgIHIuaG92ZXJEYXRhLm1kb3duR1BvcyA9IGdwb3M7XG4gICAgdmFyIGNoZWNrRm9yVGFwaG9sZCA9IGZ1bmN0aW9uIGNoZWNrRm9yVGFwaG9sZCgpIHtcbiAgICAgIHIuaG92ZXJEYXRhLnRhcGhvbGRDYW5jZWxsZWQgPSBmYWxzZTtcbiAgICAgIGNsZWFyVGltZW91dChyLmhvdmVyRGF0YS50YXBob2xkVGltZW91dCk7XG4gICAgICByLmhvdmVyRGF0YS50YXBob2xkVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoci5ob3ZlckRhdGEudGFwaG9sZENhbmNlbGxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgZWxlID0gci5ob3ZlckRhdGEuZG93bjtcbiAgICAgICAgICBpZiAoZWxlKSB7XG4gICAgICAgICAgICBlbGUuZW1pdCh7XG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICAgIHR5cGU6ICd0YXBob2xkJyxcbiAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjeS5lbWl0KHtcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgICAgdHlwZTogJ3RhcGhvbGQnLFxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCByLnRhcGhvbGREdXJhdGlvbik7XG4gICAgfTtcblxuICAgIC8vIFJpZ2h0IGNsaWNrIGJ1dHRvblxuICAgIGlmIChlLndoaWNoID09IDMpIHtcbiAgICAgIHIuaG92ZXJEYXRhLmN4dFN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgdmFyIGN4dEV2dCA9IHtcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdHlwZTogJ2N4dHRhcHN0YXJ0JyxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAobmVhcikge1xuICAgICAgICBuZWFyLmFjdGl2YXRlKCk7XG4gICAgICAgIG5lYXIuZW1pdChjeHRFdnQpO1xuICAgICAgICByLmhvdmVyRGF0YS5kb3duID0gbmVhcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN5LmVtaXQoY3h0RXZ0KTtcbiAgICAgIH1cbiAgICAgIHIuaG92ZXJEYXRhLmRvd25UaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICByLmhvdmVyRGF0YS5jeHREcmFnZ2VkID0gZmFsc2U7XG5cbiAgICAgIC8vIFByaW1hcnkgYnV0dG9uXG4gICAgfSBlbHNlIGlmIChlLndoaWNoID09IDEpIHtcbiAgICAgIGlmIChuZWFyKSB7XG4gICAgICAgIG5lYXIuYWN0aXZhdGUoKTtcbiAgICAgIH1cblxuICAgICAgLy8gRWxlbWVudCBkcmFnZ2luZ1xuICAgICAge1xuICAgICAgICAvLyBJZiBzb21ldGhpbmcgaXMgdW5kZXIgdGhlIGN1cnNvciBhbmQgaXQgaXMgZHJhZ2dhYmxlLCBwcmVwYXJlIHRvIGdyYWIgaXRcbiAgICAgICAgaWYgKG5lYXIgIT0gbnVsbCkge1xuICAgICAgICAgIGlmIChyLm5vZGVJc0dyYWJiYWJsZShuZWFyKSkge1xuICAgICAgICAgICAgdmFyIG1ha2VFdmVudCA9IGZ1bmN0aW9uIG1ha2VFdmVudCh0eXBlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIHRyaWdnZXJHcmFiID0gZnVuY3Rpb24gdHJpZ2dlckdyYWIoZWxlKSB7XG4gICAgICAgICAgICAgIGVsZS5lbWl0KG1ha2VFdmVudCgnZ3JhYicpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzZXRHcmFiVGFyZ2V0KG5lYXIpO1xuICAgICAgICAgICAgaWYgKCFuZWFyLnNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgZHJhZ2dlZEVsZW1lbnRzID0gci5kcmFnRGF0YS5wb3NzaWJsZURyYWdFbGVtZW50cyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgICAgICAgICAgYWRkTm9kZVRvRHJhZyhuZWFyLCB7XG4gICAgICAgICAgICAgICAgYWRkVG9MaXN0OiBkcmFnZ2VkRWxlbWVudHNcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIG5lYXIuZW1pdChtYWtlRXZlbnQoJ2dyYWJvbicpKS5lbWl0KG1ha2VFdmVudCgnZ3JhYicpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRyYWdnZWRFbGVtZW50cyA9IHIuZHJhZ0RhdGEucG9zc2libGVEcmFnRWxlbWVudHMgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICAgICAgICAgIHZhciBzZWxlY3RlZE5vZGVzID0gY3kuJChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZS5pc05vZGUoKSAmJiBlbGUuc2VsZWN0ZWQoKSAmJiByLm5vZGVJc0dyYWJiYWJsZShlbGUpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYWRkTm9kZXNUb0RyYWcoc2VsZWN0ZWROb2Rlcywge1xuICAgICAgICAgICAgICAgIGFkZFRvTGlzdDogZHJhZ2dlZEVsZW1lbnRzXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBuZWFyLmVtaXQobWFrZUV2ZW50KCdncmFib24nKSk7XG4gICAgICAgICAgICAgIHNlbGVjdGVkTm9kZXMuZm9yRWFjaCh0cmlnZ2VyR3JhYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByLmhvdmVyRGF0YS5kb3duID0gbmVhcjtcbiAgICAgICAgci5ob3ZlckRhdGEuZG93bnMgPSBuZWFycztcbiAgICAgICAgci5ob3ZlckRhdGEuZG93blRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudHMobmVhciwgWydtb3VzZWRvd24nLCAndGFwc3RhcnQnLCAndm1vdXNlZG93biddLCBlLCB7XG4gICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgeTogcG9zWzFdXG4gICAgICB9KTtcbiAgICAgIGlmIChuZWFyID09IG51bGwpIHtcbiAgICAgICAgc2VsZWN0WzRdID0gMTtcbiAgICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0ge1xuICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgfTtcbiAgICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgIH0gZWxzZSBpZiAobmVhci5wYW5uYWJsZSgpKSB7XG4gICAgICAgIHNlbGVjdFs0XSA9IDE7IC8vIGZvciBmdXR1cmUgcGFuXG4gICAgICB9XG5cbiAgICAgIGNoZWNrRm9yVGFwaG9sZCgpO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgc2VsZWN0aW9uIGJveCBjb29yZGluYXRlc1xuICAgIHNlbGVjdFswXSA9IHNlbGVjdFsyXSA9IHBvc1swXTtcbiAgICBzZWxlY3RbMV0gPSBzZWxlY3RbM10gPSBwb3NbMV07XG4gIH0sIGZhbHNlKTtcbiAgci5yZWdpc3RlckJpbmRpbmcoY29udGFpbmVyV2luZG93LCAnbW91c2Vtb3ZlJywgZnVuY3Rpb24gbW91c2Vtb3ZlSGFuZGxlcihlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIHZhciBjYXB0dXJlID0gci5ob3ZlckRhdGEuY2FwdHVyZTtcbiAgICBpZiAoIWNhcHR1cmUgJiYgIWV2ZW50SW5Db250YWluZXIoZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHByZXZlbnREZWZhdWx0ID0gZmFsc2U7XG4gICAgdmFyIGN5ID0gci5jeTtcbiAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICB2YXIgZ3BvcyA9IFtlLmNsaWVudFgsIGUuY2xpZW50WV07XG4gICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChncG9zWzBdLCBncG9zWzFdKTtcbiAgICB2YXIgbWRvd25Qb3MgPSByLmhvdmVyRGF0YS5tZG93blBvcztcbiAgICB2YXIgbWRvd25HUG9zID0gci5ob3ZlckRhdGEubWRvd25HUG9zO1xuICAgIHZhciBzZWxlY3QgPSByLnNlbGVjdGlvbjtcbiAgICB2YXIgbmVhciA9IG51bGw7XG4gICAgaWYgKCFyLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgJiYgIXIuaG92ZXJEYXRhLmRyYWdnaW5nICYmICFyLmhvdmVyRGF0YS5zZWxlY3RpbmcpIHtcbiAgICAgIG5lYXIgPSByLmZpbmROZWFyZXN0RWxlbWVudChwb3NbMF0sIHBvc1sxXSwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cbiAgICB2YXIgbGFzdCA9IHIuaG92ZXJEYXRhLmxhc3Q7XG4gICAgdmFyIGRvd24gPSByLmhvdmVyRGF0YS5kb3duO1xuICAgIHZhciBkaXNwID0gW3Bvc1swXSAtIHNlbGVjdFsyXSwgcG9zWzFdIC0gc2VsZWN0WzNdXTtcbiAgICB2YXIgZHJhZ2dlZEVsZW1lbnRzID0gci5kcmFnRGF0YS5wb3NzaWJsZURyYWdFbGVtZW50cztcbiAgICB2YXIgaXNPdmVyVGhyZXNob2xkRHJhZztcbiAgICBpZiAobWRvd25HUG9zKSB7XG4gICAgICB2YXIgZHggPSBncG9zWzBdIC0gbWRvd25HUG9zWzBdO1xuICAgICAgdmFyIGR4MiA9IGR4ICogZHg7XG4gICAgICB2YXIgZHkgPSBncG9zWzFdIC0gbWRvd25HUG9zWzFdO1xuICAgICAgdmFyIGR5MiA9IGR5ICogZHk7XG4gICAgICB2YXIgZGlzdDIgPSBkeDIgKyBkeTI7XG4gICAgICByLmhvdmVyRGF0YS5pc092ZXJUaHJlc2hvbGREcmFnID0gaXNPdmVyVGhyZXNob2xkRHJhZyA9IGRpc3QyID49IHIuZGVza3RvcFRhcFRocmVzaG9sZDI7XG4gICAgfVxuICAgIHZhciBtdWx0U2VsS2V5RG93biA9IGlzTXVsdFNlbEtleURvd24oZSk7XG4gICAgaWYgKGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgIHIuaG92ZXJEYXRhLnRhcGhvbGRDYW5jZWxsZWQgPSB0cnVlO1xuICAgIH1cbiAgICB2YXIgdXBkYXRlRHJhZ0RlbHRhID0gZnVuY3Rpb24gdXBkYXRlRHJhZ0RlbHRhKCkge1xuICAgICAgdmFyIGRyYWdEZWx0YSA9IHIuaG92ZXJEYXRhLmRyYWdEZWx0YSA9IHIuaG92ZXJEYXRhLmRyYWdEZWx0YSB8fCBbXTtcbiAgICAgIGlmIChkcmFnRGVsdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRyYWdEZWx0YS5wdXNoKGRpc3BbMF0pO1xuICAgICAgICBkcmFnRGVsdGEucHVzaChkaXNwWzFdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyYWdEZWx0YVswXSArPSBkaXNwWzBdO1xuICAgICAgICBkcmFnRGVsdGFbMV0gKz0gZGlzcFsxXTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICB0cmlnZ2VyRXZlbnRzKG5lYXIsIFsnbW91c2Vtb3ZlJywgJ3Ztb3VzZW1vdmUnLCAndGFwZHJhZyddLCBlLCB7XG4gICAgICB4OiBwb3NbMF0sXG4gICAgICB5OiBwb3NbMV1cbiAgICB9KTtcbiAgICB2YXIgZ29JbnRvQm94TW9kZSA9IGZ1bmN0aW9uIGdvSW50b0JveE1vZGUoKSB7XG4gICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICBpZiAoIXIuaG92ZXJEYXRhLnNlbGVjdGluZykge1xuICAgICAgICBjeS5lbWl0KHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgIHR5cGU6ICdib3hzdGFydCcsXG4gICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBzZWxlY3RbNF0gPSAxO1xuICAgICAgci5ob3ZlckRhdGEuc2VsZWN0aW5nID0gdHJ1ZTtcbiAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICByLnJlZHJhdygpO1xuICAgIH07XG5cbiAgICAvLyB0cmlnZ2VyIGNvbnRleHQgZHJhZyBpZiBybW91c2UgZG93blxuICAgIGlmIChyLmhvdmVyRGF0YS53aGljaCA9PT0gMykge1xuICAgICAgLy8gYnV0IG9ubHkgaWYgb3ZlciB0aHJlc2hvbGRcbiAgICAgIGlmIChpc092ZXJUaHJlc2hvbGREcmFnKSB7XG4gICAgICAgIHZhciBjeHRFdnQgPSB7XG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICB0eXBlOiAnY3h0ZHJhZycsXG4gICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGRvd24pIHtcbiAgICAgICAgICBkb3duLmVtaXQoY3h0RXZ0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjeS5lbWl0KGN4dEV2dCk7XG4gICAgICAgIH1cbiAgICAgICAgci5ob3ZlckRhdGEuY3h0RHJhZ2dlZCA9IHRydWU7XG4gICAgICAgIGlmICghci5ob3ZlckRhdGEuY3h0T3ZlciB8fCBuZWFyICE9PSByLmhvdmVyRGF0YS5jeHRPdmVyKSB7XG4gICAgICAgICAgaWYgKHIuaG92ZXJEYXRhLmN4dE92ZXIpIHtcbiAgICAgICAgICAgIHIuaG92ZXJEYXRhLmN4dE92ZXIuZW1pdCh7XG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICAgIHR5cGU6ICdjeHRkcmFnb3V0JyxcbiAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByLmhvdmVyRGF0YS5jeHRPdmVyID0gbmVhcjtcbiAgICAgICAgICBpZiAobmVhcikge1xuICAgICAgICAgICAgbmVhci5lbWl0KHtcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgICAgdHlwZTogJ2N4dGRyYWdvdmVyJyxcbiAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB3ZSBhcmUgZHJhZyBwYW5uaW5nIHRoZSBlbnRpcmUgZ3JhcGhcbiAgICB9IGVsc2UgaWYgKHIuaG92ZXJEYXRhLmRyYWdnaW5nKSB7XG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWU7XG4gICAgICBpZiAoY3kucGFubmluZ0VuYWJsZWQoKSAmJiBjeS51c2VyUGFubmluZ0VuYWJsZWQoKSkge1xuICAgICAgICB2YXIgZGVsdGFQO1xuICAgICAgICBpZiAoci5ob3ZlckRhdGEuanVzdFN0YXJ0ZWRQYW4pIHtcbiAgICAgICAgICB2YXIgbWRQb3MgPSByLmhvdmVyRGF0YS5tZG93blBvcztcbiAgICAgICAgICBkZWx0YVAgPSB7XG4gICAgICAgICAgICB4OiAocG9zWzBdIC0gbWRQb3NbMF0pICogem9vbSxcbiAgICAgICAgICAgIHk6IChwb3NbMV0gLSBtZFBvc1sxXSkgKiB6b29tXG4gICAgICAgICAgfTtcbiAgICAgICAgICByLmhvdmVyRGF0YS5qdXN0U3RhcnRlZFBhbiA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbHRhUCA9IHtcbiAgICAgICAgICAgIHg6IGRpc3BbMF0gKiB6b29tLFxuICAgICAgICAgICAgeTogZGlzcFsxXSAqIHpvb21cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGN5LnBhbkJ5KGRlbHRhUCk7XG4gICAgICAgIGN5LmVtaXQoJ2RyYWdwYW4nKTtcbiAgICAgICAgci5ob3ZlckRhdGEuZHJhZ2dlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIE5lZWRzIHJlcHJvamVjdCBkdWUgdG8gcGFuIGNoYW5naW5nIHZpZXdwb3J0XG4gICAgICBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuXG4gICAgICAvLyBDaGVja3MgcHJpbWFyeSBidXR0b24gZG93biAmIG91dCBvZiB0aW1lICYgbW91c2Ugbm90IG1vdmVkIG11Y2hcbiAgICB9IGVsc2UgaWYgKHNlbGVjdFs0XSA9PSAxICYmIChkb3duID09IG51bGwgfHwgZG93bi5wYW5uYWJsZSgpKSkge1xuICAgICAgaWYgKGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgICAgaWYgKCFyLmhvdmVyRGF0YS5kcmFnZ2luZyAmJiBjeS5ib3hTZWxlY3Rpb25FbmFibGVkKCkgJiYgKG11bHRTZWxLZXlEb3duIHx8ICFjeS5wYW5uaW5nRW5hYmxlZCgpIHx8ICFjeS51c2VyUGFubmluZ0VuYWJsZWQoKSkpIHtcbiAgICAgICAgICBnb0ludG9Cb3hNb2RlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXIuaG92ZXJEYXRhLnNlbGVjdGluZyAmJiBjeS5wYW5uaW5nRW5hYmxlZCgpICYmIGN5LnVzZXJQYW5uaW5nRW5hYmxlZCgpKSB7XG4gICAgICAgICAgdmFyIGFsbG93UGFzc3Rocm91Z2ggPSBhbGxvd1Bhbm5pbmdQYXNzdGhyb3VnaChkb3duLCByLmhvdmVyRGF0YS5kb3ducyk7XG4gICAgICAgICAgaWYgKGFsbG93UGFzc3Rocm91Z2gpIHtcbiAgICAgICAgICAgIHIuaG92ZXJEYXRhLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHIuaG92ZXJEYXRhLmp1c3RTdGFydGVkUGFuID0gdHJ1ZTtcbiAgICAgICAgICAgIHNlbGVjdFs0XSA9IDA7XG4gICAgICAgICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSBhcnJheTJwb2ludChtZG93blBvcyk7XG4gICAgICAgICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRvd24gJiYgZG93bi5wYW5uYWJsZSgpICYmIGRvd24uYWN0aXZlKCkpIHtcbiAgICAgICAgICBkb3duLnVuYWN0aXZhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZG93biAmJiBkb3duLnBhbm5hYmxlKCkgJiYgZG93bi5hY3RpdmUoKSkge1xuICAgICAgICBkb3duLnVuYWN0aXZhdGUoKTtcbiAgICAgIH1cbiAgICAgIGlmICgoIWRvd24gfHwgIWRvd24uZ3JhYmJlZCgpKSAmJiBuZWFyICE9IGxhc3QpIHtcbiAgICAgICAgaWYgKGxhc3QpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnRzKGxhc3QsIFsnbW91c2VvdXQnLCAndGFwZHJhZ291dCddLCBlLCB7XG4gICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmVhcikge1xuICAgICAgICAgIHRyaWdnZXJFdmVudHMobmVhciwgWydtb3VzZW92ZXInLCAndGFwZHJhZ292ZXInXSwgZSwge1xuICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgci5ob3ZlckRhdGEubGFzdCA9IG5lYXI7XG4gICAgICB9XG4gICAgICBpZiAoZG93bikge1xuICAgICAgICBpZiAoaXNPdmVyVGhyZXNob2xkRHJhZykge1xuICAgICAgICAgIC8vIHRoZW4gd2UgY2FuIHRha2UgYWN0aW9uXG5cbiAgICAgICAgICBpZiAoY3kuYm94U2VsZWN0aW9uRW5hYmxlZCgpICYmIG11bHRTZWxLZXlEb3duKSB7XG4gICAgICAgICAgICAvLyB0aGVuIHNlbGVjdGlvbiBvdmVycmlkZXNcbiAgICAgICAgICAgIGlmIChkb3duICYmIGRvd24uZ3JhYmJlZCgpKSB7XG4gICAgICAgICAgICAgIGZyZWVEcmFnZ2VkRWxlbWVudHMoZHJhZ2dlZEVsZW1lbnRzKTtcbiAgICAgICAgICAgICAgZG93bi5lbWl0KCdmcmVlb24nKTtcbiAgICAgICAgICAgICAgZHJhZ2dlZEVsZW1lbnRzLmVtaXQoJ2ZyZWUnKTtcbiAgICAgICAgICAgICAgaWYgKHIuZHJhZ0RhdGEuZGlkRHJhZykge1xuICAgICAgICAgICAgICAgIGRvd24uZW1pdCgnZHJhZ2ZyZWVvbicpO1xuICAgICAgICAgICAgICAgIGRyYWdnZWRFbGVtZW50cy5lbWl0KCdkcmFnZnJlZScpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnb0ludG9Cb3hNb2RlKCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChkb3duICYmIGRvd24uZ3JhYmJlZCgpICYmIHIubm9kZUlzRHJhZ2dhYmxlKGRvd24pKSB7XG4gICAgICAgICAgICAvLyBkcmFnIG5vZGVcbiAgICAgICAgICAgIHZhciBqdXN0U3RhcnRlZERyYWcgPSAhci5kcmFnRGF0YS5kaWREcmFnO1xuICAgICAgICAgICAgaWYgKGp1c3RTdGFydGVkRHJhZykge1xuICAgICAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHIuZHJhZ0RhdGEuZGlkRHJhZyA9IHRydWU7IC8vIGluZGljYXRlIHRoYXQgd2UgYWN0dWFsbHkgZGlkIGRyYWcgdGhlIG5vZGVcblxuICAgICAgICAgICAgLy8gbm93LCBhZGQgdGhlIGVsZW1lbnRzIHRvIHRoZSBkcmFnIGxheWVyIGlmIG5vdCBkb25lIGFscmVhZHlcbiAgICAgICAgICAgIGlmICghci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzKSB7XG4gICAgICAgICAgICAgIGFkZE5vZGVzVG9EcmFnKGRyYWdnZWRFbGVtZW50cywge1xuICAgICAgICAgICAgICAgIGluRHJhZ0xheWVyOiB0cnVlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHRvdGFsU2hpZnQgPSB7XG4gICAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICAgIHk6IDBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAobnVtYmVyJDEoZGlzcFswXSkgJiYgbnVtYmVyJDEoZGlzcFsxXSkpIHtcbiAgICAgICAgICAgICAgdG90YWxTaGlmdC54ICs9IGRpc3BbMF07XG4gICAgICAgICAgICAgIHRvdGFsU2hpZnQueSArPSBkaXNwWzFdO1xuICAgICAgICAgICAgICBpZiAoanVzdFN0YXJ0ZWREcmFnKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRyYWdEZWx0YSA9IHIuaG92ZXJEYXRhLmRyYWdEZWx0YTtcbiAgICAgICAgICAgICAgICBpZiAoZHJhZ0RlbHRhICYmIG51bWJlciQxKGRyYWdEZWx0YVswXSkgJiYgbnVtYmVyJDEoZHJhZ0RlbHRhWzFdKSkge1xuICAgICAgICAgICAgICAgICAgdG90YWxTaGlmdC54ICs9IGRyYWdEZWx0YVswXTtcbiAgICAgICAgICAgICAgICAgIHRvdGFsU2hpZnQueSArPSBkcmFnRGVsdGFbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgPSB0cnVlO1xuICAgICAgICAgICAgZHJhZ2dlZEVsZW1lbnRzLnNpbGVudFNoaWZ0KHRvdGFsU2hpZnQpLmVtaXQoJ3Bvc2l0aW9uIGRyYWcnKTtcbiAgICAgICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gb3RoZXJ3aXNlIHNhdmUgZHJhZyBkZWx0YSBmb3Igd2hlbiB3ZSBhY3R1YWxseSBzdGFydCBkcmFnZ2luZyBzbyB0aGUgcmVsYXRpdmUgZ3JhYiBwb3MgaXMgY29uc3RhbnRcbiAgICAgICAgICB1cGRhdGVEcmFnRGVsdGEoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBwcmV2ZW50IHRoZSBkcmFnZ2luZyBmcm9tIHRyaWdnZXJpbmcgdGV4dCBzZWxlY3Rpb24gb24gdGhlIHBhZ2VcbiAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICB9XG4gICAgc2VsZWN0WzJdID0gcG9zWzBdO1xuICAgIHNlbGVjdFszXSA9IHBvc1sxXTtcbiAgICBpZiAocHJldmVudERlZmF1bHQpIHtcbiAgICAgIGlmIChlLnN0b3BQcm9wYWdhdGlvbikgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCBmYWxzZSk7XG4gIHZhciBjbGlja1RpbWVvdXQsIGRpZERvdWJsZUNsaWNrLCBwcmV2Q2xpY2tUaW1lU3RhbXA7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKGNvbnRhaW5lcldpbmRvdywgJ21vdXNldXAnLCBmdW5jdGlvbiBtb3VzZXVwSGFuZGxlcihlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIHZhciBjYXB0dXJlID0gci5ob3ZlckRhdGEuY2FwdHVyZTtcbiAgICBpZiAoIWNhcHR1cmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgci5ob3ZlckRhdGEuY2FwdHVyZSA9IGZhbHNlO1xuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgdmFyIHNlbGVjdCA9IHIuc2VsZWN0aW9uO1xuICAgIHZhciBuZWFyID0gci5maW5kTmVhcmVzdEVsZW1lbnQocG9zWzBdLCBwb3NbMV0sIHRydWUsIGZhbHNlKTtcbiAgICB2YXIgZHJhZ2dlZEVsZW1lbnRzID0gci5kcmFnRGF0YS5wb3NzaWJsZURyYWdFbGVtZW50cztcbiAgICB2YXIgZG93biA9IHIuaG92ZXJEYXRhLmRvd247XG4gICAgdmFyIG11bHRTZWxLZXlEb3duID0gaXNNdWx0U2VsS2V5RG93bihlKTtcbiAgICBpZiAoci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uKSB7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9XG4gICAgci5ob3ZlckRhdGEudGFwaG9sZENhbmNlbGxlZCA9IHRydWU7XG4gICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkOyAvLyBub3QgYWN0aXZlIGJnIG5vd1xuXG4gICAgaWYgKGRvd24pIHtcbiAgICAgIGRvd24udW5hY3RpdmF0ZSgpO1xuICAgIH1cbiAgICBpZiAoci5ob3ZlckRhdGEud2hpY2ggPT09IDMpIHtcbiAgICAgIHZhciBjeHRFdnQgPSB7XG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHR5cGU6ICdjeHR0YXBlbmQnLFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChkb3duKSB7XG4gICAgICAgIGRvd24uZW1pdChjeHRFdnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3kuZW1pdChjeHRFdnQpO1xuICAgICAgfVxuICAgICAgaWYgKCFyLmhvdmVyRGF0YS5jeHREcmFnZ2VkKSB7XG4gICAgICAgIHZhciBjeHRUYXAgPSB7XG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICB0eXBlOiAnY3h0dGFwJyxcbiAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoZG93bikge1xuICAgICAgICAgIGRvd24uZW1pdChjeHRUYXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN5LmVtaXQoY3h0VGFwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgci5ob3ZlckRhdGEuY3h0RHJhZ2dlZCA9IGZhbHNlO1xuICAgICAgci5ob3ZlckRhdGEud2hpY2ggPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoci5ob3ZlckRhdGEud2hpY2ggPT09IDEpIHtcbiAgICAgIHRyaWdnZXJFdmVudHMobmVhciwgWydtb3VzZXVwJywgJ3RhcGVuZCcsICd2bW91c2V1cCddLCBlLCB7XG4gICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgeTogcG9zWzFdXG4gICAgICB9KTtcbiAgICAgIGlmICghci5kcmFnRGF0YS5kaWREcmFnICYmXG4gICAgICAvLyBkaWRuJ3QgbW92ZSBhIG5vZGUgYXJvdW5kXG4gICAgICAhci5ob3ZlckRhdGEuZHJhZ2dlZCAmJlxuICAgICAgLy8gZGlkbid0IHBhblxuICAgICAgIXIuaG92ZXJEYXRhLnNlbGVjdGluZyAmJlxuICAgICAgLy8gbm90IGJveCBzZWxlY3Rpb25cbiAgICAgICFyLmhvdmVyRGF0YS5pc092ZXJUaHJlc2hvbGREcmFnIC8vIGRpZG4ndCBtb3ZlIHRvbyBtdWNoXG4gICAgICApIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50cyhkb3duLCBbXCJjbGlja1wiLCBcInRhcFwiLCBcInZjbGlja1wiXSwgZSwge1xuICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgfSk7XG4gICAgICAgIGRpZERvdWJsZUNsaWNrID0gZmFsc2U7XG4gICAgICAgIGlmIChlLnRpbWVTdGFtcCAtIHByZXZDbGlja1RpbWVTdGFtcCA8PSBjeS5tdWx0aUNsaWNrRGVib3VuY2VUaW1lKCkpIHtcbiAgICAgICAgICBjbGlja1RpbWVvdXQgJiYgY2xlYXJUaW1lb3V0KGNsaWNrVGltZW91dCk7XG4gICAgICAgICAgZGlkRG91YmxlQ2xpY2sgPSB0cnVlO1xuICAgICAgICAgIHByZXZDbGlja1RpbWVTdGFtcCA9IG51bGw7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50cyhkb3duLCBbXCJkYmxjbGlja1wiLCBcImRibHRhcFwiLCBcInZkYmxjbGlja1wiXSwgZSwge1xuICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xpY2tUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoZGlkRG91YmxlQ2xpY2spIHJldHVybjtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudHMoZG93biwgW1wib25lY2xpY2tcIiwgXCJvbmV0YXBcIiwgXCJ2b25lY2xpY2tcIl0sIGUsIHtcbiAgICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIGN5Lm11bHRpQ2xpY2tEZWJvdW5jZVRpbWUoKSk7XG4gICAgICAgICAgcHJldkNsaWNrVGltZVN0YW1wID0gZS50aW1lU3RhbXA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRGVzZWxlY3QgYWxsIGVsZW1lbnRzIGlmIG5vdGhpbmcgaXMgY3VycmVudGx5IHVuZGVyIHRoZSBtb3VzZSBjdXJzb3IgYW5kIHdlIGFyZW4ndCBkcmFnZ2luZyBzb21ldGhpbmdcbiAgICAgIGlmIChkb3duID09IG51bGwgLy8gbm90IG1vdXNlZG93biBvbiBub2RlXG4gICAgICAmJiAhci5kcmFnRGF0YS5kaWREcmFnIC8vIGRpZG4ndCBtb3ZlIHRoZSBub2RlIGFyb3VuZFxuICAgICAgJiYgIXIuaG92ZXJEYXRhLnNlbGVjdGluZyAvLyBub3QgYm94IHNlbGVjdGlvblxuICAgICAgJiYgIXIuaG92ZXJEYXRhLmRyYWdnZWQgLy8gZGlkbid0IHBhblxuICAgICAgJiYgIWlzTXVsdFNlbEtleURvd24oZSkpIHtcbiAgICAgICAgY3kuJChpc1NlbGVjdGVkKS51bnNlbGVjdChbJ3RhcHVuc2VsZWN0J10pO1xuICAgICAgICBpZiAoZHJhZ2dlZEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICByLmRyYWdEYXRhLnBvc3NpYmxlRHJhZ0VsZW1lbnRzID0gZHJhZ2dlZEVsZW1lbnRzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgfVxuXG4gICAgICAvLyBTaW5nbGUgc2VsZWN0aW9uXG4gICAgICBpZiAobmVhciA9PSBkb3duICYmICFyLmRyYWdEYXRhLmRpZERyYWcgJiYgIXIuaG92ZXJEYXRhLnNlbGVjdGluZykge1xuICAgICAgICBpZiAobmVhciAhPSBudWxsICYmIG5lYXIuX3ByaXZhdGUuc2VsZWN0YWJsZSkge1xuICAgICAgICAgIGlmIChyLmhvdmVyRGF0YS5kcmFnZ2luZykgOyBlbHNlIGlmIChjeS5zZWxlY3Rpb25UeXBlKCkgPT09ICdhZGRpdGl2ZScgfHwgbXVsdFNlbEtleURvd24pIHtcbiAgICAgICAgICAgIGlmIChuZWFyLnNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgbmVhci51bnNlbGVjdChbJ3RhcHVuc2VsZWN0J10pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmVhci5zZWxlY3QoWyd0YXBzZWxlY3QnXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghbXVsdFNlbEtleURvd24pIHtcbiAgICAgICAgICAgICAgY3kuJChpc1NlbGVjdGVkKS51bm1lcmdlKG5lYXIpLnVuc2VsZWN0KFsndGFwdW5zZWxlY3QnXSk7XG4gICAgICAgICAgICAgIG5lYXIuc2VsZWN0KFsndGFwc2VsZWN0J10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHIuaG92ZXJEYXRhLnNlbGVjdGluZykge1xuICAgICAgICB2YXIgYm94ID0gY3kuY29sbGVjdGlvbihyLmdldEFsbEluQm94KHNlbGVjdFswXSwgc2VsZWN0WzFdLCBzZWxlY3RbMl0sIHNlbGVjdFszXSkpO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgICBpZiAoYm94Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBjeS5lbWl0KHtcbiAgICAgICAgICB0eXBlOiAnYm94ZW5kJyxcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgZWxlV291bGRCZVNlbGVjdGVkID0gZnVuY3Rpb24gZWxlV291bGRCZVNlbGVjdGVkKGVsZSkge1xuICAgICAgICAgIHJldHVybiBlbGUuc2VsZWN0YWJsZSgpICYmICFlbGUuc2VsZWN0ZWQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGN5LnNlbGVjdGlvblR5cGUoKSA9PT0gJ2FkZGl0aXZlJykge1xuICAgICAgICAgIGJveC5lbWl0KCdib3gnKS5zdGRGaWx0ZXIoZWxlV291bGRCZVNlbGVjdGVkKS5zZWxlY3QoKS5lbWl0KCdib3hzZWxlY3QnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIW11bHRTZWxLZXlEb3duKSB7XG4gICAgICAgICAgICBjeS4kKGlzU2VsZWN0ZWQpLnVubWVyZ2UoYm94KS51bnNlbGVjdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBib3guZW1pdCgnYm94Jykuc3RkRmlsdGVyKGVsZVdvdWxkQmVTZWxlY3RlZCkuc2VsZWN0KCkuZW1pdCgnYm94c2VsZWN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbHdheXMgbmVlZCByZWRyYXcgaW4gY2FzZSBlbGVzIHVuc2VsZWN0YWJsZVxuICAgICAgICByLnJlZHJhdygpO1xuICAgICAgfVxuXG4gICAgICAvLyBDYW5jZWwgZHJhZyBwYW5cbiAgICAgIGlmIChyLmhvdmVyRGF0YS5kcmFnZ2luZykge1xuICAgICAgICByLmhvdmVyRGF0YS5kcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgIH1cbiAgICAgIGlmICghc2VsZWN0WzRdKSB7XG4gICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgdmFyIGRvd25XYXNHcmFiYmVkID0gZG93biAmJiBkb3duLmdyYWJiZWQoKTtcbiAgICAgICAgZnJlZURyYWdnZWRFbGVtZW50cyhkcmFnZ2VkRWxlbWVudHMpO1xuICAgICAgICBpZiAoZG93bldhc0dyYWJiZWQpIHtcbiAgICAgICAgICBkb3duLmVtaXQoJ2ZyZWVvbicpO1xuICAgICAgICAgIGRyYWdnZWRFbGVtZW50cy5lbWl0KCdmcmVlJyk7XG4gICAgICAgICAgaWYgKHIuZHJhZ0RhdGEuZGlkRHJhZykge1xuICAgICAgICAgICAgZG93bi5lbWl0KCdkcmFnZnJlZW9uJyk7XG4gICAgICAgICAgICBkcmFnZ2VkRWxlbWVudHMuZW1pdCgnZHJhZ2ZyZWUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIGVsc2Ugbm90IHJpZ2h0IG1vdXNlXG5cbiAgICBzZWxlY3RbNF0gPSAwO1xuICAgIHIuaG92ZXJEYXRhLmRvd24gPSBudWxsO1xuICAgIHIuaG92ZXJEYXRhLmN4dFN0YXJ0ZWQgPSBmYWxzZTtcbiAgICByLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgPSBmYWxzZTtcbiAgICByLmhvdmVyRGF0YS5zZWxlY3RpbmcgPSBmYWxzZTtcbiAgICByLmhvdmVyRGF0YS5pc092ZXJUaHJlc2hvbGREcmFnID0gZmFsc2U7XG4gICAgci5kcmFnRGF0YS5kaWREcmFnID0gZmFsc2U7XG4gICAgci5ob3ZlckRhdGEuZHJhZ2dlZCA9IGZhbHNlO1xuICAgIHIuaG92ZXJEYXRhLmRyYWdEZWx0YSA9IFtdO1xuICAgIHIuaG92ZXJEYXRhLm1kb3duUG9zID0gbnVsbDtcbiAgICByLmhvdmVyRGF0YS5tZG93bkdQb3MgPSBudWxsO1xuICB9LCBmYWxzZSk7XG4gIHZhciB3aGVlbEhhbmRsZXIgPSBmdW5jdGlvbiB3aGVlbEhhbmRsZXIoZSkge1xuICAgIGlmIChyLnNjcm9sbGluZ1BhZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIHdoaWxlIHNjcm9sbGluZywgaWdub3JlIHdoZWVsLXRvLXpvb21cblxuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgIHZhciBycG9zID0gW3Bvc1swXSAqIHpvb20gKyBwYW4ueCwgcG9zWzFdICogem9vbSArIHBhbi55XTtcbiAgICBpZiAoci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzIHx8IHIuaG92ZXJEYXRhLmRyYWdnaW5nIHx8IHIuaG92ZXJEYXRhLmN4dFN0YXJ0ZWQgfHwgaW5Cb3hTZWxlY3Rpb24oKSkge1xuICAgICAgLy8gaWYgcGFuIGRyYWdnaW5nIG9yIGN4dCBkcmFnZ2luZywgd2hlZWwgbW92ZW1lbnRzIG1ha2Ugbm8gem9vbVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY3kucGFubmluZ0VuYWJsZWQoKSAmJiBjeS51c2VyUGFubmluZ0VuYWJsZWQoKSAmJiBjeS56b29taW5nRW5hYmxlZCgpICYmIGN5LnVzZXJab29taW5nRW5hYmxlZCgpKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByLmRhdGEud2hlZWxab29taW5nID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dChyLmRhdGEud2hlZWxUaW1lb3V0KTtcbiAgICAgIHIuZGF0YS53aGVlbFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgci5kYXRhLndoZWVsWm9vbWluZyA9IGZhbHNlO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgIH0sIDE1MCk7XG4gICAgICB2YXIgZGlmZjtcbiAgICAgIGlmIChlLmRlbHRhWSAhPSBudWxsKSB7XG4gICAgICAgIGRpZmYgPSBlLmRlbHRhWSAvIC0yNTA7XG4gICAgICB9IGVsc2UgaWYgKGUud2hlZWxEZWx0YVkgIT0gbnVsbCkge1xuICAgICAgICBkaWZmID0gZS53aGVlbERlbHRhWSAvIDEwMDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaWZmID0gZS53aGVlbERlbHRhIC8gMTAwMDtcbiAgICAgIH1cbiAgICAgIGRpZmYgPSBkaWZmICogci53aGVlbFNlbnNpdGl2aXR5O1xuICAgICAgdmFyIG5lZWRzV2hlZWxGaXggPSBlLmRlbHRhTW9kZSA9PT0gMTtcbiAgICAgIGlmIChuZWVkc1doZWVsRml4KSB7XG4gICAgICAgIC8vIGZpeGVzIHNsb3cgd2hlZWwgZXZlbnRzIG9uIGZmL2xpbnV4IGFuZCBmZi93aW5kb3dzXG4gICAgICAgIGRpZmYgKj0gMzM7XG4gICAgICB9XG4gICAgICB2YXIgbmV3Wm9vbSA9IGN5Lnpvb20oKSAqIE1hdGgucG93KDEwLCBkaWZmKTtcbiAgICAgIGlmIChlLnR5cGUgPT09ICdnZXN0dXJlY2hhbmdlJykge1xuICAgICAgICBuZXdab29tID0gci5nZXN0dXJlU3RhcnRab29tICogZS5zY2FsZTtcbiAgICAgIH1cbiAgICAgIGN5Lnpvb20oe1xuICAgICAgICBsZXZlbDogbmV3Wm9vbSxcbiAgICAgICAgcmVuZGVyZWRQb3NpdGlvbjoge1xuICAgICAgICAgIHg6IHJwb3NbMF0sXG4gICAgICAgICAgeTogcnBvc1sxXVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGN5LmVtaXQoZS50eXBlID09PSAnZ2VzdHVyZWNoYW5nZScgPyAncGluY2h6b29tJyA6ICdzY3JvbGx6b29tJyk7XG4gICAgfVxuICB9O1xuXG4gIC8vIEZ1bmN0aW9ucyB0byBoZWxwIHdpdGggd2hldGhlciBtb3VzZSB3aGVlbCBzaG91bGQgdHJpZ2dlciB6b29taW5nXG4gIC8vIC0tXG4gIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnd2hlZWwnLCB3aGVlbEhhbmRsZXIsIHRydWUpO1xuXG4gIC8vIGRpc2FibGUgbm9uc3RhbmRhcmQgd2hlZWwgZXZlbnRzXG4gIC8vIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnbW91c2V3aGVlbCcsIHdoZWVsSGFuZGxlciwgdHJ1ZSk7XG4gIC8vIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnRE9NTW91c2VTY3JvbGwnLCB3aGVlbEhhbmRsZXIsIHRydWUpO1xuICAvLyByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ01vek1vdXNlUGl4ZWxTY3JvbGwnLCB3aGVlbEhhbmRsZXIsIHRydWUpOyAvLyBvbGRlciBmaXJlZm94XG5cbiAgci5yZWdpc3RlckJpbmRpbmcoY29udGFpbmVyV2luZG93LCAnc2Nyb2xsJywgZnVuY3Rpb24gc2Nyb2xsSGFuZGxlcihlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHIuc2Nyb2xsaW5nUGFnZSA9IHRydWU7XG4gICAgY2xlYXJUaW1lb3V0KHIuc2Nyb2xsaW5nUGFnZVRpbWVvdXQpO1xuICAgIHIuc2Nyb2xsaW5nUGFnZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHIuc2Nyb2xsaW5nUGFnZSA9IGZhbHNlO1xuICAgIH0sIDI1MCk7XG4gIH0sIHRydWUpO1xuXG4gIC8vIGRlc2t0b3Agc2FmYXJpIHBpbmNoIHRvIHpvb20gc3RhcnRcbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdnZXN0dXJlc3RhcnQnLCBmdW5jdGlvbiBnZXN0dXJlU3RhcnRIYW5kbGVyKGUpIHtcbiAgICByLmdlc3R1cmVTdGFydFpvb20gPSByLmN5Lnpvb20oKTtcbiAgICBpZiAoIXIuaGFzVG91Y2hTdGFydGVkKSB7XG4gICAgICAvLyBkb24ndCBhZmZlY3QgdG91Y2ggZGV2aWNlcyBsaWtlIGlwaG9uZVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSwgdHJ1ZSk7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnZ2VzdHVyZWNoYW5nZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKCFyLmhhc1RvdWNoU3RhcnRlZCkge1xuICAgICAgLy8gZG9uJ3QgYWZmZWN0IHRvdWNoIGRldmljZXMgbGlrZSBpcGhvbmVcbiAgICAgIHdoZWVsSGFuZGxlcihlKTtcbiAgICB9XG4gIH0sIHRydWUpO1xuXG4gIC8vIEZ1bmN0aW9ucyB0byBoZWxwIHdpdGggaGFuZGxpbmcgbW91c2VvdXQvbW91c2VvdmVyIG9uIHRoZSBDeXRvc2NhcGUgY29udGFpbmVyXG4gIC8vIEhhbmRsZSBtb3VzZW91dCBvbiBDeXRvc2NhcGUgY29udGFpbmVyXG4gIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnbW91c2VvdXQnLCBmdW5jdGlvbiBtb3VzZU91dEhhbmRsZXIoZSkge1xuICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgIHIuY3kuZW1pdCh7XG4gICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgdHlwZTogJ21vdXNlb3V0JyxcbiAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgeTogcG9zWzFdXG4gICAgICB9XG4gICAgfSk7XG4gIH0sIGZhbHNlKTtcbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdtb3VzZW92ZXInLCBmdW5jdGlvbiBtb3VzZU92ZXJIYW5kbGVyKGUpIHtcbiAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgICByLmN5LmVtaXQoe1xuICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgIHR5cGU6ICdtb3VzZW92ZXInLFxuICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICB5OiBwb3NbMV1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgZmFsc2UpO1xuICB2YXIgZjF4MSwgZjF5MSwgZjJ4MSwgZjJ5MTsgLy8gc3RhcnRpbmcgcG9pbnRzIGZvciBwaW5jaC10by16b29tXG4gIHZhciBkaXN0YW5jZTEsIGRpc3RhbmNlMVNxOyAvLyBpbml0aWFsIGRpc3RhbmNlIGJldHdlZW4gZmluZ2VyIDEgYW5kIGZpbmdlciAyIGZvciBwaW5jaC10by16b29tXG4gIHZhciBjZW50ZXIxLCBtb2RlbENlbnRlcjE7IC8vIGNlbnRlciBwb2ludCBvbiBzdGFydCBwaW5jaCB0byB6b29tXG4gIHZhciBvZmZzZXRMZWZ0LCBvZmZzZXRUb3A7XG4gIHZhciBjb250YWluZXJXaWR0aCwgY29udGFpbmVySGVpZ2h0O1xuICB2YXIgdHdvRmluZ2Vyc1N0YXJ0SW5zaWRlO1xuICB2YXIgZGlzdGFuY2UgPSBmdW5jdGlvbiBkaXN0YW5jZSh4MSwgeTEsIHgyLCB5Mikge1xuICAgIHJldHVybiBNYXRoLnNxcnQoKHgyIC0geDEpICogKHgyIC0geDEpICsgKHkyIC0geTEpICogKHkyIC0geTEpKTtcbiAgfTtcbiAgdmFyIGRpc3RhbmNlU3EgPSBmdW5jdGlvbiBkaXN0YW5jZVNxKHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgcmV0dXJuICh4MiAtIHgxKSAqICh4MiAtIHgxKSArICh5MiAtIHkxKSAqICh5MiAtIHkxKTtcbiAgfTtcbiAgdmFyIHRvdWNoc3RhcnRIYW5kbGVyO1xuICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ3RvdWNoc3RhcnQnLCB0b3VjaHN0YXJ0SGFuZGxlciA9IGZ1bmN0aW9uIHRvdWNoc3RhcnRIYW5kbGVyKGUpIHtcbiAgICByLmhhc1RvdWNoU3RhcnRlZCA9IHRydWU7XG4gICAgaWYgKCFldmVudEluQ29udGFpbmVyKGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGJsdXJBY3RpdmVEb21FbGVtZW50KCk7XG4gICAgci50b3VjaERhdGEuY2FwdHVyZSA9IHRydWU7XG4gICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIG5vdyA9IHIudG91Y2hEYXRhLm5vdztcbiAgICB2YXIgZWFybGllciA9IHIudG91Y2hEYXRhLmVhcmxpZXI7XG4gICAgaWYgKGUudG91Y2hlc1swXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMF0uY2xpZW50WCwgZS50b3VjaGVzWzBdLmNsaWVudFkpO1xuICAgICAgbm93WzBdID0gcG9zWzBdO1xuICAgICAgbm93WzFdID0gcG9zWzFdO1xuICAgIH1cbiAgICBpZiAoZS50b3VjaGVzWzFdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1sxXS5jbGllbnRYLCBlLnRvdWNoZXNbMV0uY2xpZW50WSk7XG4gICAgICBub3dbMl0gPSBwb3NbMF07XG4gICAgICBub3dbM10gPSBwb3NbMV07XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXNbMl0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzJdLmNsaWVudFgsIGUudG91Y2hlc1syXS5jbGllbnRZKTtcbiAgICAgIG5vd1s0XSA9IHBvc1swXTtcbiAgICAgIG5vd1s1XSA9IHBvc1sxXTtcbiAgICB9XG5cbiAgICAvLyByZWNvcmQgc3RhcnRpbmcgcG9pbnRzIGZvciBwaW5jaC10by16b29tXG4gICAgaWYgKGUudG91Y2hlc1sxXSkge1xuICAgICAgci50b3VjaERhdGEuc2luZ2xlVG91Y2hNb3ZlZCA9IHRydWU7XG4gICAgICBmcmVlRHJhZ2dlZEVsZW1lbnRzKHIuZHJhZ0RhdGEudG91Y2hEcmFnRWxlcyk7XG4gICAgICB2YXIgb2Zmc2V0cyA9IHIuZmluZENvbnRhaW5lckNsaWVudENvb3JkcygpO1xuICAgICAgb2Zmc2V0TGVmdCA9IG9mZnNldHNbMF07XG4gICAgICBvZmZzZXRUb3AgPSBvZmZzZXRzWzFdO1xuICAgICAgY29udGFpbmVyV2lkdGggPSBvZmZzZXRzWzJdO1xuICAgICAgY29udGFpbmVySGVpZ2h0ID0gb2Zmc2V0c1szXTtcbiAgICAgIGYxeDEgPSBlLnRvdWNoZXNbMF0uY2xpZW50WCAtIG9mZnNldExlZnQ7XG4gICAgICBmMXkxID0gZS50b3VjaGVzWzBdLmNsaWVudFkgLSBvZmZzZXRUb3A7XG4gICAgICBmMngxID0gZS50b3VjaGVzWzFdLmNsaWVudFggLSBvZmZzZXRMZWZ0O1xuICAgICAgZjJ5MSA9IGUudG91Y2hlc1sxXS5jbGllbnRZIC0gb2Zmc2V0VG9wO1xuICAgICAgdHdvRmluZ2Vyc1N0YXJ0SW5zaWRlID0gMCA8PSBmMXgxICYmIGYxeDEgPD0gY29udGFpbmVyV2lkdGggJiYgMCA8PSBmMngxICYmIGYyeDEgPD0gY29udGFpbmVyV2lkdGggJiYgMCA8PSBmMXkxICYmIGYxeTEgPD0gY29udGFpbmVySGVpZ2h0ICYmIDAgPD0gZjJ5MSAmJiBmMnkxIDw9IGNvbnRhaW5lckhlaWdodDtcbiAgICAgIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgICAgZGlzdGFuY2UxID0gZGlzdGFuY2UoZjF4MSwgZjF5MSwgZjJ4MSwgZjJ5MSk7XG4gICAgICBkaXN0YW5jZTFTcSA9IGRpc3RhbmNlU3EoZjF4MSwgZjF5MSwgZjJ4MSwgZjJ5MSk7XG4gICAgICBjZW50ZXIxID0gWyhmMXgxICsgZjJ4MSkgLyAyLCAoZjF5MSArIGYyeTEpIC8gMl07XG4gICAgICBtb2RlbENlbnRlcjEgPSBbKGNlbnRlcjFbMF0gLSBwYW4ueCkgLyB6b29tLCAoY2VudGVyMVsxXSAtIHBhbi55KSAvIHpvb21dO1xuXG4gICAgICAvLyBjb25zaWRlciBjb250ZXh0IHRhcFxuICAgICAgdmFyIGN4dERpc3RUaHJlc2hvbGQgPSAyMDA7XG4gICAgICB2YXIgY3h0RGlzdFRocmVzaG9sZFNxID0gY3h0RGlzdFRocmVzaG9sZCAqIGN4dERpc3RUaHJlc2hvbGQ7XG4gICAgICBpZiAoZGlzdGFuY2UxU3EgPCBjeHREaXN0VGhyZXNob2xkU3EgJiYgIWUudG91Y2hlc1syXSkge1xuICAgICAgICB2YXIgbmVhcjEgPSByLmZpbmROZWFyZXN0RWxlbWVudChub3dbMF0sIG5vd1sxXSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHZhciBuZWFyMiA9IHIuZmluZE5lYXJlc3RFbGVtZW50KG5vd1syXSwgbm93WzNdLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgaWYgKG5lYXIxICYmIG5lYXIxLmlzTm9kZSgpKSB7XG4gICAgICAgICAgbmVhcjEuYWN0aXZhdGUoKS5lbWl0KHtcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICB0eXBlOiAnY3h0dGFwc3RhcnQnLFxuICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByLnRvdWNoRGF0YS5zdGFydCA9IG5lYXIxO1xuICAgICAgICB9IGVsc2UgaWYgKG5lYXIyICYmIG5lYXIyLmlzTm9kZSgpKSB7XG4gICAgICAgICAgbmVhcjIuYWN0aXZhdGUoKS5lbWl0KHtcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICB0eXBlOiAnY3h0dGFwc3RhcnQnLFxuICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByLnRvdWNoRGF0YS5zdGFydCA9IG5lYXIyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN5LmVtaXQoe1xuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgIHR5cGU6ICdjeHR0YXBzdGFydCcsXG4gICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLnRvdWNoRGF0YS5zdGFydCkge1xuICAgICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0Ll9wcml2YXRlLmdyYWJiZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByLnRvdWNoRGF0YS5jeHQgPSB0cnVlO1xuICAgICAgICByLnRvdWNoRGF0YS5jeHREcmFnZ2VkID0gZmFsc2U7XG4gICAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZS50b3VjaGVzWzJdKSB7XG4gICAgICAvLyBpZ25vcmVcblxuICAgICAgLy8gc2FmYXJpIG9uIGlvcyBwYW5zIHRoZSBwYWdlIG90aGVyd2lzZSAobm9ybWFsbHkgeW91IHNob3VsZCBiZSBhYmxlIHRvIHByZXZlbnRkZWZhdWx0IG9uIHRvdWNobW92ZS4uLilcbiAgICAgIGlmIChjeS5ib3hTZWxlY3Rpb25FbmFibGVkKCkpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZS50b3VjaGVzWzFdKSA7IGVsc2UgaWYgKGUudG91Y2hlc1swXSkge1xuICAgICAgdmFyIG5lYXJzID0gci5maW5kTmVhcmVzdEVsZW1lbnRzKG5vd1swXSwgbm93WzFdLCB0cnVlLCB0cnVlKTtcbiAgICAgIHZhciBuZWFyID0gbmVhcnNbMF07XG4gICAgICBpZiAobmVhciAhPSBudWxsKSB7XG4gICAgICAgIG5lYXIuYWN0aXZhdGUoKTtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQgPSBuZWFyO1xuICAgICAgICByLnRvdWNoRGF0YS5zdGFydHMgPSBuZWFycztcbiAgICAgICAgaWYgKHIubm9kZUlzR3JhYmJhYmxlKG5lYXIpKSB7XG4gICAgICAgICAgdmFyIGRyYWdnZWRFbGVzID0gci5kcmFnRGF0YS50b3VjaERyYWdFbGVzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICAgIHZhciBzZWxlY3RlZE5vZGVzID0gbnVsbDtcbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgICAgICAgICBpZiAobmVhci5zZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICAvLyByZXNldCBkcmFnIGVsZW1lbnRzLCBzaW5jZSBuZWFyIHdpbGwgYmUgYWRkZWQgYWdhaW5cblxuICAgICAgICAgICAgc2VsZWN0ZWROb2RlcyA9IGN5LiQoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlLnNlbGVjdGVkKCkgJiYgci5ub2RlSXNHcmFiYmFibGUoZWxlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYWRkTm9kZXNUb0RyYWcoc2VsZWN0ZWROb2Rlcywge1xuICAgICAgICAgICAgICBhZGRUb0xpc3Q6IGRyYWdnZWRFbGVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWRkTm9kZVRvRHJhZyhuZWFyLCB7XG4gICAgICAgICAgICAgIGFkZFRvTGlzdDogZHJhZ2dlZEVsZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRHcmFiVGFyZ2V0KG5lYXIpO1xuICAgICAgICAgIHZhciBtYWtlRXZlbnQgPSBmdW5jdGlvbiBtYWtlRXZlbnQodHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfTtcbiAgICAgICAgICBuZWFyLmVtaXQobWFrZUV2ZW50KCdncmFib24nKSk7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkTm9kZXMpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkTm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgICBuLmVtaXQobWFrZUV2ZW50KCdncmFiJykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5lYXIuZW1pdChtYWtlRXZlbnQoJ2dyYWInKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnRzKG5lYXIsIFsndG91Y2hzdGFydCcsICd0YXBzdGFydCcsICd2bW91c2Vkb3duJ10sIGUsIHtcbiAgICAgICAgeDogbm93WzBdLFxuICAgICAgICB5OiBub3dbMV1cbiAgICAgIH0pO1xuICAgICAgaWYgKG5lYXIgPT0gbnVsbCkge1xuICAgICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB7XG4gICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICB9O1xuICAgICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgICByLnJlZHJhdygpO1xuICAgICAgfVxuXG4gICAgICAvLyBUYXAsIHRhcGhvbGRcbiAgICAgIC8vIC0tLS0tXG5cbiAgICAgIHIudG91Y2hEYXRhLnNpbmdsZVRvdWNoTW92ZWQgPSBmYWxzZTtcbiAgICAgIHIudG91Y2hEYXRhLnNpbmdsZVRvdWNoU3RhcnRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgICBjbGVhclRpbWVvdXQoci50b3VjaERhdGEudGFwaG9sZFRpbWVvdXQpO1xuICAgICAgci50b3VjaERhdGEudGFwaG9sZFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHIudG91Y2hEYXRhLnNpbmdsZVRvdWNoTW92ZWQgPT09IGZhbHNlICYmICFyLnBpbmNoaW5nIC8vIGlmIHBpbmNoaW5nLCB0aGVuIHRhcGhvbGQgdW5zZWxlY3Qgc2hvdWxkbid0IHRha2UgZWZmZWN0XG4gICAgICAgICYmICFyLnRvdWNoRGF0YS5zZWxlY3RpbmcgLy8gYm94IHNlbGVjdGlvbiBzaG91bGRuJ3QgYWxsb3cgdGFwaG9sZCB0aHJvdWdoXG4gICAgICAgICkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudHMoci50b3VjaERhdGEuc3RhcnQsIFsndGFwaG9sZCddLCBlLCB7XG4gICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSwgci50YXBob2xkRHVyYXRpb24pO1xuICAgIH1cbiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA+PSAxKSB7XG4gICAgICB2YXIgc1BvcyA9IHIudG91Y2hEYXRhLnN0YXJ0UG9zaXRpb24gPSBbbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbF07XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vdy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzUG9zW2ldID0gZWFybGllcltpXSA9IG5vd1tpXTtcbiAgICAgIH1cbiAgICAgIHZhciB0b3VjaDAgPSBlLnRvdWNoZXNbMF07XG4gICAgICByLnRvdWNoRGF0YS5zdGFydEdQb3NpdGlvbiA9IFt0b3VjaDAuY2xpZW50WCwgdG91Y2gwLmNsaWVudFldO1xuICAgIH1cbiAgfSwgZmFsc2UpO1xuICB2YXIgdG91Y2htb3ZlSGFuZGxlcjtcbiAgci5yZWdpc3RlckJpbmRpbmcod2luZG93LCAndG91Y2htb3ZlJywgdG91Y2htb3ZlSGFuZGxlciA9IGZ1bmN0aW9uIHRvdWNobW92ZUhhbmRsZXIoZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICB2YXIgY2FwdHVyZSA9IHIudG91Y2hEYXRhLmNhcHR1cmU7XG4gICAgaWYgKCFjYXB0dXJlICYmICFldmVudEluQ29udGFpbmVyKGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBzZWxlY3QgPSByLnNlbGVjdGlvbjtcbiAgICB2YXIgY3kgPSByLmN5O1xuICAgIHZhciBub3cgPSByLnRvdWNoRGF0YS5ub3c7XG4gICAgdmFyIGVhcmxpZXIgPSByLnRvdWNoRGF0YS5lYXJsaWVyO1xuICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgIGlmIChlLnRvdWNoZXNbMF0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzBdLmNsaWVudFgsIGUudG91Y2hlc1swXS5jbGllbnRZKTtcbiAgICAgIG5vd1swXSA9IHBvc1swXTtcbiAgICAgIG5vd1sxXSA9IHBvc1sxXTtcbiAgICB9XG4gICAgaWYgKGUudG91Y2hlc1sxXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMV0uY2xpZW50WCwgZS50b3VjaGVzWzFdLmNsaWVudFkpO1xuICAgICAgbm93WzJdID0gcG9zWzBdO1xuICAgICAgbm93WzNdID0gcG9zWzFdO1xuICAgIH1cbiAgICBpZiAoZS50b3VjaGVzWzJdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1syXS5jbGllbnRYLCBlLnRvdWNoZXNbMl0uY2xpZW50WSk7XG4gICAgICBub3dbNF0gPSBwb3NbMF07XG4gICAgICBub3dbNV0gPSBwb3NbMV07XG4gICAgfVxuICAgIHZhciBzdGFydEdQb3MgPSByLnRvdWNoRGF0YS5zdGFydEdQb3NpdGlvbjtcbiAgICB2YXIgaXNPdmVyVGhyZXNob2xkRHJhZztcbiAgICBpZiAoY2FwdHVyZSAmJiBlLnRvdWNoZXNbMF0gJiYgc3RhcnRHUG9zKSB7XG4gICAgICB2YXIgZGlzcCA9IFtdO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBub3cubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgZGlzcFtqXSA9IG5vd1tqXSAtIGVhcmxpZXJbal07XG4gICAgICB9XG4gICAgICB2YXIgZHggPSBlLnRvdWNoZXNbMF0uY2xpZW50WCAtIHN0YXJ0R1Bvc1swXTtcbiAgICAgIHZhciBkeDIgPSBkeCAqIGR4O1xuICAgICAgdmFyIGR5ID0gZS50b3VjaGVzWzBdLmNsaWVudFkgLSBzdGFydEdQb3NbMV07XG4gICAgICB2YXIgZHkyID0gZHkgKiBkeTtcbiAgICAgIHZhciBkaXN0MiA9IGR4MiArIGR5MjtcbiAgICAgIGlzT3ZlclRocmVzaG9sZERyYWcgPSBkaXN0MiA+PSByLnRvdWNoVGFwVGhyZXNob2xkMjtcbiAgICB9XG5cbiAgICAvLyBjb250ZXh0IHN3aXBlIGNhbmNlbGxpbmdcbiAgICBpZiAoY2FwdHVyZSAmJiByLnRvdWNoRGF0YS5jeHQpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHZhciBmMXgyID0gZS50b3VjaGVzWzBdLmNsaWVudFggLSBvZmZzZXRMZWZ0LFxuICAgICAgICBmMXkyID0gZS50b3VjaGVzWzBdLmNsaWVudFkgLSBvZmZzZXRUb3A7XG4gICAgICB2YXIgZjJ4MiA9IGUudG91Y2hlc1sxXS5jbGllbnRYIC0gb2Zmc2V0TGVmdCxcbiAgICAgICAgZjJ5MiA9IGUudG91Y2hlc1sxXS5jbGllbnRZIC0gb2Zmc2V0VG9wO1xuICAgICAgLy8gdmFyIGRpc3RhbmNlMiA9IGRpc3RhbmNlKCBmMXgyLCBmMXkyLCBmMngyLCBmMnkyICk7XG4gICAgICB2YXIgZGlzdGFuY2UyU3EgPSBkaXN0YW5jZVNxKGYxeDIsIGYxeTIsIGYyeDIsIGYyeTIpO1xuICAgICAgdmFyIGZhY3RvclNxID0gZGlzdGFuY2UyU3EgLyBkaXN0YW5jZTFTcTtcbiAgICAgIHZhciBkaXN0VGhyZXNob2xkID0gMTUwO1xuICAgICAgdmFyIGRpc3RUaHJlc2hvbGRTcSA9IGRpc3RUaHJlc2hvbGQgKiBkaXN0VGhyZXNob2xkO1xuICAgICAgdmFyIGZhY3RvclRocmVzaG9sZCA9IDEuNTtcbiAgICAgIHZhciBmYWN0b3JUaHJlc2hvbGRTcSA9IGZhY3RvclRocmVzaG9sZCAqIGZhY3RvclRocmVzaG9sZDtcblxuICAgICAgLy8gY2FuY2VsIGN0eCBnZXN0dXJlcyBpZiB0aGUgZGlzdGFuY2UgYi90IHRoZSBmaW5nZXJzIGluY3JlYXNlc1xuICAgICAgaWYgKGZhY3RvclNxID49IGZhY3RvclRocmVzaG9sZFNxIHx8IGRpc3RhbmNlMlNxID49IGRpc3RUaHJlc2hvbGRTcSkge1xuICAgICAgICByLnRvdWNoRGF0YS5jeHQgPSBmYWxzZTtcbiAgICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgICB2YXIgY3h0RXZ0ID0ge1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgdHlwZTogJ2N4dHRhcGVuZCcsXG4gICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHIudG91Y2hEYXRhLnN0YXJ0KSB7XG4gICAgICAgICAgci50b3VjaERhdGEuc3RhcnQudW5hY3RpdmF0ZSgpLmVtaXQoY3h0RXZ0KTtcbiAgICAgICAgICByLnRvdWNoRGF0YS5zdGFydCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3kuZW1pdChjeHRFdnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29udGV4dCBzd2lwZVxuICAgIGlmIChjYXB0dXJlICYmIHIudG91Y2hEYXRhLmN4dCkge1xuICAgICAgdmFyIGN4dEV2dCA9IHtcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdHlwZTogJ2N4dGRyYWcnLFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICBpZiAoci50b3VjaERhdGEuc3RhcnQpIHtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQuZW1pdChjeHRFdnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3kuZW1pdChjeHRFdnQpO1xuICAgICAgfVxuICAgICAgaWYgKHIudG91Y2hEYXRhLnN0YXJ0KSB7XG4gICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0Ll9wcml2YXRlLmdyYWJiZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHIudG91Y2hEYXRhLmN4dERyYWdnZWQgPSB0cnVlO1xuICAgICAgdmFyIG5lYXIgPSByLmZpbmROZWFyZXN0RWxlbWVudChub3dbMF0sIG5vd1sxXSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICBpZiAoIXIudG91Y2hEYXRhLmN4dE92ZXIgfHwgbmVhciAhPT0gci50b3VjaERhdGEuY3h0T3Zlcikge1xuICAgICAgICBpZiAoci50b3VjaERhdGEuY3h0T3Zlcikge1xuICAgICAgICAgIHIudG91Y2hEYXRhLmN4dE92ZXIuZW1pdCh7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgdHlwZTogJ2N4dGRyYWdvdXQnLFxuICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByLnRvdWNoRGF0YS5jeHRPdmVyID0gbmVhcjtcbiAgICAgICAgaWYgKG5lYXIpIHtcbiAgICAgICAgICBuZWFyLmVtaXQoe1xuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgIHR5cGU6ICdjeHRkcmFnb3ZlcicsXG4gICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGJveCBzZWxlY3Rpb25cbiAgICB9IGVsc2UgaWYgKGNhcHR1cmUgJiYgZS50b3VjaGVzWzJdICYmIGN5LmJveFNlbGVjdGlvbkVuYWJsZWQoKSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5sYXN0VGhyZWVUb3VjaCA9ICtuZXcgRGF0ZSgpO1xuICAgICAgaWYgKCFyLnRvdWNoRGF0YS5zZWxlY3RpbmcpIHtcbiAgICAgICAgY3kuZW1pdCh7XG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICB0eXBlOiAnYm94c3RhcnQnLFxuICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgci50b3VjaERhdGEuc2VsZWN0aW5nID0gdHJ1ZTtcbiAgICAgIHIudG91Y2hEYXRhLmRpZFNlbGVjdCA9IHRydWU7XG4gICAgICBzZWxlY3RbNF0gPSAxO1xuICAgICAgaWYgKCFzZWxlY3QgfHwgc2VsZWN0Lmxlbmd0aCA9PT0gMCB8fCBzZWxlY3RbMF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzZWxlY3RbMF0gPSAobm93WzBdICsgbm93WzJdICsgbm93WzRdKSAvIDM7XG4gICAgICAgIHNlbGVjdFsxXSA9IChub3dbMV0gKyBub3dbM10gKyBub3dbNV0pIC8gMztcbiAgICAgICAgc2VsZWN0WzJdID0gKG5vd1swXSArIG5vd1syXSArIG5vd1s0XSkgLyAzICsgMTtcbiAgICAgICAgc2VsZWN0WzNdID0gKG5vd1sxXSArIG5vd1szXSArIG5vd1s1XSkgLyAzICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGVjdFsyXSA9IChub3dbMF0gKyBub3dbMl0gKyBub3dbNF0pIC8gMztcbiAgICAgICAgc2VsZWN0WzNdID0gKG5vd1sxXSArIG5vd1szXSArIG5vd1s1XSkgLyAzO1xuICAgICAgfVxuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIHIucmVkcmF3KCk7XG5cbiAgICAgIC8vIHBpbmNoIHRvIHpvb21cbiAgICB9IGVsc2UgaWYgKGNhcHR1cmUgJiYgZS50b3VjaGVzWzFdICYmICFyLnRvdWNoRGF0YS5kaWRTZWxlY3QgLy8gZG9uJ3QgYWxsb3cgYm94IHNlbGVjdGlvbiB0byBkZWdyYWRlIHRvIHBpbmNoLXRvLXpvb21cbiAgICAmJiBjeS56b29taW5nRW5hYmxlZCgpICYmIGN5LnBhbm5pbmdFbmFibGVkKCkgJiYgY3kudXNlclpvb21pbmdFbmFibGVkKCkgJiYgY3kudXNlclBhbm5pbmdFbmFibGVkKCkpIHtcbiAgICAgIC8vIHR3byBmaW5nZXJzID0+IHBpbmNoIHRvIHpvb21cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICB2YXIgZHJhZ2dlZEVsZXMgPSByLmRyYWdEYXRhLnRvdWNoRHJhZ0VsZXM7XG4gICAgICBpZiAoZHJhZ2dlZEVsZXMpIHtcbiAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHJhZ2dlZEVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZGVfcCA9IGRyYWdnZWRFbGVzW2ldLl9wcml2YXRlO1xuICAgICAgICAgIGRlX3AuZ3JhYmJlZCA9IGZhbHNlO1xuICAgICAgICAgIGRlX3AucnNjcmF0Y2guaW5EcmFnTGF5ZXIgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIF9zdGFydCA9IHIudG91Y2hEYXRhLnN0YXJ0O1xuXG4gICAgICAvLyAoeDIsIHkyKSBmb3IgZmluZ2VycyAxIGFuZCAyXG4gICAgICB2YXIgZjF4MiA9IGUudG91Y2hlc1swXS5jbGllbnRYIC0gb2Zmc2V0TGVmdCxcbiAgICAgICAgZjF5MiA9IGUudG91Y2hlc1swXS5jbGllbnRZIC0gb2Zmc2V0VG9wO1xuICAgICAgdmFyIGYyeDIgPSBlLnRvdWNoZXNbMV0uY2xpZW50WCAtIG9mZnNldExlZnQsXG4gICAgICAgIGYyeTIgPSBlLnRvdWNoZXNbMV0uY2xpZW50WSAtIG9mZnNldFRvcDtcbiAgICAgIHZhciBkaXN0YW5jZTIgPSBkaXN0YW5jZShmMXgyLCBmMXkyLCBmMngyLCBmMnkyKTtcbiAgICAgIC8vIHZhciBkaXN0YW5jZTJTcSA9IGRpc3RhbmNlU3EoIGYxeDIsIGYxeTIsIGYyeDIsIGYyeTIgKTtcbiAgICAgIC8vIHZhciBmYWN0b3IgPSBNYXRoLnNxcnQoIGRpc3RhbmNlMlNxICkgLyBNYXRoLnNxcnQoIGRpc3RhbmNlMVNxICk7XG4gICAgICB2YXIgZmFjdG9yID0gZGlzdGFuY2UyIC8gZGlzdGFuY2UxO1xuICAgICAgaWYgKHR3b0ZpbmdlcnNTdGFydEluc2lkZSkge1xuICAgICAgICAvLyBkZWx0YSBmaW5nZXIxXG4gICAgICAgIHZhciBkZjF4ID0gZjF4MiAtIGYxeDE7XG4gICAgICAgIHZhciBkZjF5ID0gZjF5MiAtIGYxeTE7XG5cbiAgICAgICAgLy8gZGVsdGEgZmluZ2VyIDJcbiAgICAgICAgdmFyIGRmMnggPSBmMngyIC0gZjJ4MTtcbiAgICAgICAgdmFyIGRmMnkgPSBmMnkyIC0gZjJ5MTtcblxuICAgICAgICAvLyB0cmFuc2xhdGlvbiBpcyB0aGUgbm9ybWFsaXNlZCB2ZWN0b3Igb2YgdGhlIHR3byBmaW5nZXJzIG1vdmVtZW50XG4gICAgICAgIC8vIGkuZS4gc28gcGluY2hpbmcgY2FuY2VscyBvdXQgYW5kIG1vdmluZyB0b2dldGhlciBwYW5zXG4gICAgICAgIHZhciB0eCA9IChkZjF4ICsgZGYyeCkgLyAyO1xuICAgICAgICB2YXIgdHkgPSAoZGYxeSArIGRmMnkpIC8gMjtcblxuICAgICAgICAvLyBub3cgY2FsY3VsYXRlIHRoZSB6b29tXG4gICAgICAgIHZhciB6b29tMSA9IGN5Lnpvb20oKTtcbiAgICAgICAgdmFyIHpvb20yID0gem9vbTEgKiBmYWN0b3I7XG4gICAgICAgIHZhciBwYW4xID0gY3kucGFuKCk7XG5cbiAgICAgICAgLy8gdGhlIG1vZGVsIGNlbnRlciBwb2ludCBjb252ZXJ0ZWQgdG8gdGhlIGN1cnJlbnQgcmVuZGVyZWQgcG9zXG4gICAgICAgIHZhciBjdHJ4ID0gbW9kZWxDZW50ZXIxWzBdICogem9vbTEgKyBwYW4xLng7XG4gICAgICAgIHZhciBjdHJ5ID0gbW9kZWxDZW50ZXIxWzFdICogem9vbTEgKyBwYW4xLnk7XG4gICAgICAgIHZhciBwYW4yID0ge1xuICAgICAgICAgIHg6IC16b29tMiAvIHpvb20xICogKGN0cnggLSBwYW4xLnggLSB0eCkgKyBjdHJ4LFxuICAgICAgICAgIHk6IC16b29tMiAvIHpvb20xICogKGN0cnkgLSBwYW4xLnkgLSB0eSkgKyBjdHJ5XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gcmVtb3ZlIGRyYWdnZWQgZWxlc1xuICAgICAgICBpZiAoX3N0YXJ0ICYmIF9zdGFydC5hY3RpdmUoKSkge1xuICAgICAgICAgIHZhciBkcmFnZ2VkRWxlcyA9IHIuZHJhZ0RhdGEudG91Y2hEcmFnRWxlcztcbiAgICAgICAgICBmcmVlRHJhZ2dlZEVsZW1lbnRzKGRyYWdnZWRFbGVzKTtcbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgICBfc3RhcnQudW5hY3RpdmF0ZSgpLmVtaXQoJ2ZyZWVvbicpO1xuICAgICAgICAgIGRyYWdnZWRFbGVzLmVtaXQoJ2ZyZWUnKTtcbiAgICAgICAgICBpZiAoci5kcmFnRGF0YS5kaWREcmFnKSB7XG4gICAgICAgICAgICBfc3RhcnQuZW1pdCgnZHJhZ2ZyZWVvbicpO1xuICAgICAgICAgICAgZHJhZ2dlZEVsZXMuZW1pdCgnZHJhZ2ZyZWUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY3kudmlld3BvcnQoe1xuICAgICAgICAgIHpvb206IHpvb20yLFxuICAgICAgICAgIHBhbjogcGFuMixcbiAgICAgICAgICBjYW5jZWxPbkZhaWxlZFpvb206IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGN5LmVtaXQoJ3BpbmNoem9vbScpO1xuICAgICAgICBkaXN0YW5jZTEgPSBkaXN0YW5jZTI7XG4gICAgICAgIGYxeDEgPSBmMXgyO1xuICAgICAgICBmMXkxID0gZjF5MjtcbiAgICAgICAgZjJ4MSA9IGYyeDI7XG4gICAgICAgIGYyeTEgPSBmMnkyO1xuICAgICAgICByLnBpbmNoaW5nID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUmUtcHJvamVjdFxuICAgICAgaWYgKGUudG91Y2hlc1swXSkge1xuICAgICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WSk7XG4gICAgICAgIG5vd1swXSA9IHBvc1swXTtcbiAgICAgICAgbm93WzFdID0gcG9zWzFdO1xuICAgICAgfVxuICAgICAgaWYgKGUudG91Y2hlc1sxXSkge1xuICAgICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1sxXS5jbGllbnRYLCBlLnRvdWNoZXNbMV0uY2xpZW50WSk7XG4gICAgICAgIG5vd1syXSA9IHBvc1swXTtcbiAgICAgICAgbm93WzNdID0gcG9zWzFdO1xuICAgICAgfVxuICAgICAgaWYgKGUudG91Y2hlc1syXSkge1xuICAgICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1syXS5jbGllbnRYLCBlLnRvdWNoZXNbMl0uY2xpZW50WSk7XG4gICAgICAgIG5vd1s0XSA9IHBvc1swXTtcbiAgICAgICAgbm93WzVdID0gcG9zWzFdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZS50b3VjaGVzWzBdICYmICFyLnRvdWNoRGF0YS5kaWRTZWxlY3QgLy8gZG9uJ3QgYWxsb3cgYm94IHNlbGVjdGlvbiB0byBkZWdyYWRlIHRvIHNpbmdsZSBmaW5nZXIgZXZlbnRzIGxpa2UgcGFubmluZ1xuICAgICkge1xuICAgICAgdmFyIHN0YXJ0ID0gci50b3VjaERhdGEuc3RhcnQ7XG4gICAgICB2YXIgbGFzdCA9IHIudG91Y2hEYXRhLmxhc3Q7XG4gICAgICB2YXIgbmVhcjtcbiAgICAgIGlmICghci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzICYmICFyLnN3aXBlUGFubmluZykge1xuICAgICAgICBuZWFyID0gci5maW5kTmVhcmVzdEVsZW1lbnQobm93WzBdLCBub3dbMV0sIHRydWUsIHRydWUpO1xuICAgICAgfVxuICAgICAgaWYgKGNhcHR1cmUgJiYgc3RhcnQgIT0gbnVsbCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGRyYWdnaW5nIG5vZGVzXG4gICAgICBpZiAoY2FwdHVyZSAmJiBzdGFydCAhPSBudWxsICYmIHIubm9kZUlzRHJhZ2dhYmxlKHN0YXJ0KSkge1xuICAgICAgICBpZiAoaXNPdmVyVGhyZXNob2xkRHJhZykge1xuICAgICAgICAgIC8vIHRoZW4gZHJhZ2dpbmcgY2FuIGhhcHBlblxuICAgICAgICAgIHZhciBkcmFnZ2VkRWxlcyA9IHIuZHJhZ0RhdGEudG91Y2hEcmFnRWxlcztcbiAgICAgICAgICB2YXIganVzdFN0YXJ0ZWREcmFnID0gIXIuZHJhZ0RhdGEuZGlkRHJhZztcbiAgICAgICAgICBpZiAoanVzdFN0YXJ0ZWREcmFnKSB7XG4gICAgICAgICAgICBhZGROb2Rlc1RvRHJhZyhkcmFnZ2VkRWxlcywge1xuICAgICAgICAgICAgICBpbkRyYWdMYXllcjogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHIuZHJhZ0RhdGEuZGlkRHJhZyA9IHRydWU7XG4gICAgICAgICAgdmFyIHRvdGFsU2hpZnQgPSB7XG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogMFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKG51bWJlciQxKGRpc3BbMF0pICYmIG51bWJlciQxKGRpc3BbMV0pKSB7XG4gICAgICAgICAgICB0b3RhbFNoaWZ0LnggKz0gZGlzcFswXTtcbiAgICAgICAgICAgIHRvdGFsU2hpZnQueSArPSBkaXNwWzFdO1xuICAgICAgICAgICAgaWYgKGp1c3RTdGFydGVkRHJhZykge1xuICAgICAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgICAgICAgdmFyIGRyYWdEZWx0YSA9IHIudG91Y2hEYXRhLmRyYWdEZWx0YTtcbiAgICAgICAgICAgICAgaWYgKGRyYWdEZWx0YSAmJiBudW1iZXIkMShkcmFnRGVsdGFbMF0pICYmIG51bWJlciQxKGRyYWdEZWx0YVsxXSkpIHtcbiAgICAgICAgICAgICAgICB0b3RhbFNoaWZ0LnggKz0gZHJhZ0RlbHRhWzBdO1xuICAgICAgICAgICAgICAgIHRvdGFsU2hpZnQueSArPSBkcmFnRGVsdGFbMV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzID0gdHJ1ZTtcbiAgICAgICAgICBkcmFnZ2VkRWxlcy5zaWxlbnRTaGlmdCh0b3RhbFNoaWZ0KS5lbWl0KCdwb3NpdGlvbiBkcmFnJyk7XG4gICAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgICAgaWYgKHIudG91Y2hEYXRhLnN0YXJ0UG9zaXRpb25bMF0gPT0gZWFybGllclswXSAmJiByLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uWzFdID09IGVhcmxpZXJbMV0pIHtcbiAgICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByLnJlZHJhdygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG90aGVyd2lzZSBrZWVwIHRyYWNrIG9mIGRyYWcgZGVsdGEgZm9yIGxhdGVyXG4gICAgICAgICAgdmFyIGRyYWdEZWx0YSA9IHIudG91Y2hEYXRhLmRyYWdEZWx0YSA9IHIudG91Y2hEYXRhLmRyYWdEZWx0YSB8fCBbXTtcbiAgICAgICAgICBpZiAoZHJhZ0RlbHRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZHJhZ0RlbHRhLnB1c2goZGlzcFswXSk7XG4gICAgICAgICAgICBkcmFnRGVsdGEucHVzaChkaXNwWzFdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZHJhZ0RlbHRhWzBdICs9IGRpc3BbMF07XG4gICAgICAgICAgICBkcmFnRGVsdGFbMV0gKz0gZGlzcFsxXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gdG91Y2htb3ZlXG4gICAgICB7XG4gICAgICAgIHRyaWdnZXJFdmVudHMoc3RhcnQgfHwgbmVhciwgWyd0b3VjaG1vdmUnLCAndGFwZHJhZycsICd2bW91c2Vtb3ZlJ10sIGUsIHtcbiAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgeTogbm93WzFdXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKCFzdGFydCB8fCAhc3RhcnQuZ3JhYmJlZCgpKSAmJiBuZWFyICE9IGxhc3QpIHtcbiAgICAgICAgICBpZiAobGFzdCkge1xuICAgICAgICAgICAgbGFzdC5lbWl0KHtcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgICAgdHlwZTogJ3RhcGRyYWdvdXQnLFxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChuZWFyKSB7XG4gICAgICAgICAgICBuZWFyLmVtaXQoe1xuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgICB0eXBlOiAndGFwZHJhZ292ZXInLFxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHIudG91Y2hEYXRhLmxhc3QgPSBuZWFyO1xuICAgICAgfVxuXG4gICAgICAvLyBjaGVjayB0byBjYW5jZWwgdGFwaG9sZFxuICAgICAgaWYgKGNhcHR1cmUpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAobm93W2ldICYmIHIudG91Y2hEYXRhLnN0YXJ0UG9zaXRpb25baV0gJiYgaXNPdmVyVGhyZXNob2xkRHJhZykge1xuICAgICAgICAgICAgci50b3VjaERhdGEuc2luZ2xlVG91Y2hNb3ZlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHBhbm5pbmdcbiAgICAgIGlmIChjYXB0dXJlICYmIChzdGFydCA9PSBudWxsIHx8IHN0YXJ0LnBhbm5hYmxlKCkpICYmIGN5LnBhbm5pbmdFbmFibGVkKCkgJiYgY3kudXNlclBhbm5pbmdFbmFibGVkKCkpIHtcbiAgICAgICAgdmFyIGFsbG93UGFzc3Rocm91Z2ggPSBhbGxvd1Bhbm5pbmdQYXNzdGhyb3VnaChzdGFydCwgci50b3VjaERhdGEuc3RhcnRzKTtcbiAgICAgICAgaWYgKGFsbG93UGFzc3Rocm91Z2gpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgaWYgKCFyLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24pIHtcbiAgICAgICAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IGFycmF5MnBvaW50KHIudG91Y2hEYXRhLnN0YXJ0UG9zaXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoci5zd2lwZVBhbm5pbmcpIHtcbiAgICAgICAgICAgIGN5LnBhbkJ5KHtcbiAgICAgICAgICAgICAgeDogZGlzcFswXSAqIHpvb20sXG4gICAgICAgICAgICAgIHk6IGRpc3BbMV0gKiB6b29tXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGN5LmVtaXQoJ2RyYWdwYW4nKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgICAgICAgIHIuc3dpcGVQYW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIGN5LnBhbkJ5KHtcbiAgICAgICAgICAgICAgeDogZHggKiB6b29tLFxuICAgICAgICAgICAgICB5OiBkeSAqIHpvb21cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY3kuZW1pdCgnZHJhZ3BhbicpO1xuICAgICAgICAgICAgaWYgKHN0YXJ0KSB7XG4gICAgICAgICAgICAgIHN0YXJ0LnVuYWN0aXZhdGUoKTtcbiAgICAgICAgICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgICAgICAgICAgci50b3VjaERhdGEuc3RhcnQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlLXByb2plY3RcbiAgICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMF0uY2xpZW50WCwgZS50b3VjaGVzWzBdLmNsaWVudFkpO1xuICAgICAgICBub3dbMF0gPSBwb3NbMF07XG4gICAgICAgIG5vd1sxXSA9IHBvc1sxXTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBub3cubGVuZ3RoOyBqKyspIHtcbiAgICAgIGVhcmxpZXJbal0gPSBub3dbal07XG4gICAgfVxuXG4gICAgLy8gdGhlIGFjdGl2ZSBiZyBpbmRpY2F0b3Igc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiBtYWtpbmcgYSBzd2lwZSB0aGF0IGlzIG5laXRoZXIgZm9yIGRyYWdnaW5nIG5vZGVzIG9yIHBhbm5pbmdcbiAgICBpZiAoY2FwdHVyZSAmJiBlLnRvdWNoZXMubGVuZ3RoID4gMCAmJiAhci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzICYmICFyLnN3aXBlUGFubmluZyAmJiByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gIT0gbnVsbCkge1xuICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIHIucmVkcmF3KCk7XG4gICAgfVxuICB9LCBmYWxzZSk7XG4gIHZhciB0b3VjaGNhbmNlbEhhbmRsZXI7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKGNvbnRhaW5lcldpbmRvdywgJ3RvdWNoY2FuY2VsJywgdG91Y2hjYW5jZWxIYW5kbGVyID0gZnVuY3Rpb24gdG91Y2hjYW5jZWxIYW5kbGVyKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIHN0YXJ0ID0gci50b3VjaERhdGEuc3RhcnQ7XG4gICAgci50b3VjaERhdGEuY2FwdHVyZSA9IGZhbHNlO1xuICAgIGlmIChzdGFydCkge1xuICAgICAgc3RhcnQudW5hY3RpdmF0ZSgpO1xuICAgIH1cbiAgfSk7XG4gIHZhciB0b3VjaGVuZEhhbmRsZXIsIGRpZERvdWJsZVRvdWNoLCB0b3VjaFRpbWVvdXQsIHByZXZUb3VjaFRpbWVTdGFtcDtcbiAgci5yZWdpc3RlckJpbmRpbmcoY29udGFpbmVyV2luZG93LCAndG91Y2hlbmQnLCB0b3VjaGVuZEhhbmRsZXIgPSBmdW5jdGlvbiB0b3VjaGVuZEhhbmRsZXIoZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB2YXIgc3RhcnQgPSByLnRvdWNoRGF0YS5zdGFydDtcbiAgICB2YXIgY2FwdHVyZSA9IHIudG91Y2hEYXRhLmNhcHR1cmU7XG4gICAgaWYgKGNhcHR1cmUpIHtcbiAgICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHIudG91Y2hEYXRhLmNhcHR1cmUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgc2VsZWN0ID0gci5zZWxlY3Rpb247XG4gICAgci5zd2lwZVBhbm5pbmcgPSBmYWxzZTtcbiAgICByLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgPSBmYWxzZTtcbiAgICB2YXIgY3kgPSByLmN5O1xuICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgIHZhciBub3cgPSByLnRvdWNoRGF0YS5ub3c7XG4gICAgdmFyIGVhcmxpZXIgPSByLnRvdWNoRGF0YS5lYXJsaWVyO1xuICAgIGlmIChlLnRvdWNoZXNbMF0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzBdLmNsaWVudFgsIGUudG91Y2hlc1swXS5jbGllbnRZKTtcbiAgICAgIG5vd1swXSA9IHBvc1swXTtcbiAgICAgIG5vd1sxXSA9IHBvc1sxXTtcbiAgICB9XG4gICAgaWYgKGUudG91Y2hlc1sxXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMV0uY2xpZW50WCwgZS50b3VjaGVzWzFdLmNsaWVudFkpO1xuICAgICAgbm93WzJdID0gcG9zWzBdO1xuICAgICAgbm93WzNdID0gcG9zWzFdO1xuICAgIH1cbiAgICBpZiAoZS50b3VjaGVzWzJdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1syXS5jbGllbnRYLCBlLnRvdWNoZXNbMl0uY2xpZW50WSk7XG4gICAgICBub3dbNF0gPSBwb3NbMF07XG4gICAgICBub3dbNV0gPSBwb3NbMV07XG4gICAgfVxuICAgIGlmIChzdGFydCkge1xuICAgICAgc3RhcnQudW5hY3RpdmF0ZSgpO1xuICAgIH1cbiAgICB2YXIgY3R4VGFwZW5kO1xuICAgIGlmIChyLnRvdWNoRGF0YS5jeHQpIHtcbiAgICAgIGN0eFRhcGVuZCA9IHtcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdHlwZTogJ2N4dHRhcGVuZCcsXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKHN0YXJ0KSB7XG4gICAgICAgIHN0YXJ0LmVtaXQoY3R4VGFwZW5kKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN5LmVtaXQoY3R4VGFwZW5kKTtcbiAgICAgIH1cbiAgICAgIGlmICghci50b3VjaERhdGEuY3h0RHJhZ2dlZCkge1xuICAgICAgICB2YXIgY3R4VGFwID0ge1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgdHlwZTogJ2N4dHRhcCcsXG4gICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHN0YXJ0KSB7XG4gICAgICAgICAgc3RhcnQuZW1pdChjdHhUYXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN5LmVtaXQoY3R4VGFwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHIudG91Y2hEYXRhLnN0YXJ0KSB7XG4gICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0Ll9wcml2YXRlLmdyYWJiZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHIudG91Y2hEYXRhLmN4dCA9IGZhbHNlO1xuICAgICAgci50b3VjaERhdGEuc3RhcnQgPSBudWxsO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBubyBtb3JlIGJveCBzZWxlY3Rpb24gaWYgd2UgZG9uJ3QgaGF2ZSB0aHJlZSBmaW5nZXJzXG4gICAgaWYgKCFlLnRvdWNoZXNbMl0gJiYgY3kuYm94U2VsZWN0aW9uRW5hYmxlZCgpICYmIHIudG91Y2hEYXRhLnNlbGVjdGluZykge1xuICAgICAgci50b3VjaERhdGEuc2VsZWN0aW5nID0gZmFsc2U7XG4gICAgICB2YXIgYm94ID0gY3kuY29sbGVjdGlvbihyLmdldEFsbEluQm94KHNlbGVjdFswXSwgc2VsZWN0WzFdLCBzZWxlY3RbMl0sIHNlbGVjdFszXSkpO1xuICAgICAgc2VsZWN0WzBdID0gdW5kZWZpbmVkO1xuICAgICAgc2VsZWN0WzFdID0gdW5kZWZpbmVkO1xuICAgICAgc2VsZWN0WzJdID0gdW5kZWZpbmVkO1xuICAgICAgc2VsZWN0WzNdID0gdW5kZWZpbmVkO1xuICAgICAgc2VsZWN0WzRdID0gMDtcbiAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICBjeS5lbWl0KHtcbiAgICAgICAgdHlwZTogJ2JveGVuZCcsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHZhciBlbGVXb3VsZEJlU2VsZWN0ZWQgPSBmdW5jdGlvbiBlbGVXb3VsZEJlU2VsZWN0ZWQoZWxlKSB7XG4gICAgICAgIHJldHVybiBlbGUuc2VsZWN0YWJsZSgpICYmICFlbGUuc2VsZWN0ZWQoKTtcbiAgICAgIH07XG4gICAgICBib3guZW1pdCgnYm94Jykuc3RkRmlsdGVyKGVsZVdvdWxkQmVTZWxlY3RlZCkuc2VsZWN0KCkuZW1pdCgnYm94c2VsZWN0Jyk7XG4gICAgICBpZiAoYm94Lm5vbmVtcHR5KCkpIHtcbiAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICByLnJlZHJhdygpO1xuICAgIH1cbiAgICBpZiAoc3RhcnQgIT0gbnVsbCkge1xuICAgICAgc3RhcnQudW5hY3RpdmF0ZSgpO1xuICAgIH1cbiAgICBpZiAoZS50b3VjaGVzWzJdKSB7XG4gICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgIH0gZWxzZSBpZiAoZS50b3VjaGVzWzFdKSA7IGVsc2UgaWYgKGUudG91Y2hlc1swXSkgOyBlbHNlIGlmICghZS50b3VjaGVzWzBdKSB7XG4gICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgdmFyIGRyYWdnZWRFbGVzID0gci5kcmFnRGF0YS50b3VjaERyYWdFbGVzO1xuICAgICAgaWYgKHN0YXJ0ICE9IG51bGwpIHtcbiAgICAgICAgdmFyIHN0YXJ0V2FzR3JhYmJlZCA9IHN0YXJ0Ll9wcml2YXRlLmdyYWJiZWQ7XG4gICAgICAgIGZyZWVEcmFnZ2VkRWxlbWVudHMoZHJhZ2dlZEVsZXMpO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgIGlmIChzdGFydFdhc0dyYWJiZWQpIHtcbiAgICAgICAgICBzdGFydC5lbWl0KCdmcmVlb24nKTtcbiAgICAgICAgICBkcmFnZ2VkRWxlcy5lbWl0KCdmcmVlJyk7XG4gICAgICAgICAgaWYgKHIuZHJhZ0RhdGEuZGlkRHJhZykge1xuICAgICAgICAgICAgc3RhcnQuZW1pdCgnZHJhZ2ZyZWVvbicpO1xuICAgICAgICAgICAgZHJhZ2dlZEVsZXMuZW1pdCgnZHJhZ2ZyZWUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50cyhzdGFydCwgWyd0b3VjaGVuZCcsICd0YXBlbmQnLCAndm1vdXNldXAnLCAndGFwZHJhZ291dCddLCBlLCB7XG4gICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICB9KTtcbiAgICAgICAgc3RhcnQudW5hY3RpdmF0ZSgpO1xuICAgICAgICByLnRvdWNoRGF0YS5zdGFydCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbmVhciA9IHIuZmluZE5lYXJlc3RFbGVtZW50KG5vd1swXSwgbm93WzFdLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdHJpZ2dlckV2ZW50cyhuZWFyLCBbJ3RvdWNoZW5kJywgJ3RhcGVuZCcsICd2bW91c2V1cCcsICd0YXBkcmFnb3V0J10sIGUsIHtcbiAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgeTogbm93WzFdXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdmFyIGR4ID0gci50b3VjaERhdGEuc3RhcnRQb3NpdGlvblswXSAtIG5vd1swXTtcbiAgICAgIHZhciBkeDIgPSBkeCAqIGR4O1xuICAgICAgdmFyIGR5ID0gci50b3VjaERhdGEuc3RhcnRQb3NpdGlvblsxXSAtIG5vd1sxXTtcbiAgICAgIHZhciBkeTIgPSBkeSAqIGR5O1xuICAgICAgdmFyIGRpc3QyID0gZHgyICsgZHkyO1xuICAgICAgdmFyIHJkaXN0MiA9IGRpc3QyICogem9vbSAqIHpvb207XG5cbiAgICAgIC8vIFRhcCBldmVudCwgcm91Z2hseSBzYW1lIGFzIG1vdXNlIGNsaWNrIGV2ZW50IGZvciB0b3VjaFxuICAgICAgaWYgKCFyLnRvdWNoRGF0YS5zaW5nbGVUb3VjaE1vdmVkKSB7XG4gICAgICAgIGlmICghc3RhcnQpIHtcbiAgICAgICAgICBjeS4kKCc6c2VsZWN0ZWQnKS51bnNlbGVjdChbJ3RhcHVuc2VsZWN0J10pO1xuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudHMoc3RhcnQsIFsndGFwJywgJ3ZjbGljayddLCBlLCB7XG4gICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICB9KTtcbiAgICAgICAgZGlkRG91YmxlVG91Y2ggPSBmYWxzZTtcbiAgICAgICAgaWYgKGUudGltZVN0YW1wIC0gcHJldlRvdWNoVGltZVN0YW1wIDw9IGN5Lm11bHRpQ2xpY2tEZWJvdW5jZVRpbWUoKSkge1xuICAgICAgICAgIHRvdWNoVGltZW91dCAmJiBjbGVhclRpbWVvdXQodG91Y2hUaW1lb3V0KTtcbiAgICAgICAgICBkaWREb3VibGVUb3VjaCA9IHRydWU7XG4gICAgICAgICAgcHJldlRvdWNoVGltZVN0YW1wID0gbnVsbDtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnRzKHN0YXJ0LCBbJ2RibHRhcCcsICd2ZGJsY2xpY2snXSwgZSwge1xuICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG91Y2hUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoZGlkRG91YmxlVG91Y2gpIHJldHVybjtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudHMoc3RhcnQsIFsnb25ldGFwJywgJ3ZvbmVjbGljayddLCBlLCB7XG4gICAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LCBjeS5tdWx0aUNsaWNrRGVib3VuY2VUaW1lKCkpO1xuICAgICAgICAgIHByZXZUb3VjaFRpbWVTdGFtcCA9IGUudGltZVN0YW1wO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFByZXBhcmUgdG8gc2VsZWN0IHRoZSBjdXJyZW50bHkgdG91Y2hlZCBub2RlLCBvbmx5IGlmIGl0IGhhc24ndCBiZWVuIGRyYWdnZWQgcGFzdCBhIGNlcnRhaW4gZGlzdGFuY2VcbiAgICAgIGlmIChzdGFydCAhPSBudWxsICYmICFyLmRyYWdEYXRhLmRpZERyYWcgLy8gZGlkbid0IGRyYWcgbm9kZXMgYXJvdW5kXG4gICAgICAmJiBzdGFydC5fcHJpdmF0ZS5zZWxlY3RhYmxlICYmIHJkaXN0MiA8IHIudG91Y2hUYXBUaHJlc2hvbGQyICYmICFyLnBpbmNoaW5nIC8vIHBpbmNoIHRvIHpvb20gc2hvdWxkIG5vdCBhZmZlY3Qgc2VsZWN0aW9uXG4gICAgICApIHtcbiAgICAgICAgaWYgKGN5LnNlbGVjdGlvblR5cGUoKSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICBjeS4kKGlzU2VsZWN0ZWQpLnVubWVyZ2Uoc3RhcnQpLnVuc2VsZWN0KFsndGFwdW5zZWxlY3QnXSk7XG4gICAgICAgICAgc3RhcnQuc2VsZWN0KFsndGFwc2VsZWN0J10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChzdGFydC5zZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICBzdGFydC51bnNlbGVjdChbJ3RhcHVuc2VsZWN0J10pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGFydC5zZWxlY3QoWyd0YXBzZWxlY3QnXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgfVxuICAgICAgci50b3VjaERhdGEuc2luZ2xlVG91Y2hNb3ZlZCA9IHRydWU7XG4gICAgfVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbm93Lmxlbmd0aDsgaisrKSB7XG4gICAgICBlYXJsaWVyW2pdID0gbm93W2pdO1xuICAgIH1cbiAgICByLmRyYWdEYXRhLmRpZERyYWcgPSBmYWxzZTsgLy8gcmVzZXQgZm9yIG5leHQgdG91Y2hzdGFydFxuXG4gICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHIudG91Y2hEYXRhLmRyYWdEZWx0YSA9IFtdO1xuICAgICAgci50b3VjaERhdGEuc3RhcnRQb3NpdGlvbiA9IFtudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsXTtcbiAgICAgIHIudG91Y2hEYXRhLnN0YXJ0R1Bvc2l0aW9uID0gbnVsbDtcbiAgICAgIHIudG91Y2hEYXRhLmRpZFNlbGVjdCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA8IDIpIHtcbiAgICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8vIHRoZSBvbGQgc3RhcnQgZ2xvYmFsIHBvcyduIG1heSBub3QgYmUgdGhlIHNhbWUgZmluZ2VyIHRoYXQgcmVtYWluc1xuICAgICAgICByLnRvdWNoRGF0YS5zdGFydEdQb3NpdGlvbiA9IFtlLnRvdWNoZXNbMF0uY2xpZW50WCwgZS50b3VjaGVzWzBdLmNsaWVudFldO1xuICAgICAgfVxuICAgICAgci5waW5jaGluZyA9IGZhbHNlO1xuICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICByLnJlZHJhdygpO1xuICAgIH1cblxuICAgIC8vci5yZWRyYXcoKTtcbiAgfSwgZmFsc2UpO1xuXG4gIC8vIGZhbGxiYWNrIGNvbXBhdGliaWxpdHkgbGF5ZXIgZm9yIG1zIHBvaW50ZXIgZXZlbnRzXG4gIGlmICh0eXBlb2YgVG91Y2hFdmVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB2YXIgcG9pbnRlcnMgPSBbXTtcbiAgICB2YXIgbWFrZVRvdWNoID0gZnVuY3Rpb24gbWFrZVRvdWNoKGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNsaWVudFg6IGUuY2xpZW50WCxcbiAgICAgICAgY2xpZW50WTogZS5jbGllbnRZLFxuICAgICAgICBmb3JjZTogMSxcbiAgICAgICAgaWRlbnRpZmllcjogZS5wb2ludGVySWQsXG4gICAgICAgIHBhZ2VYOiBlLnBhZ2VYLFxuICAgICAgICBwYWdlWTogZS5wYWdlWSxcbiAgICAgICAgcmFkaXVzWDogZS53aWR0aCAvIDIsXG4gICAgICAgIHJhZGl1c1k6IGUuaGVpZ2h0IC8gMixcbiAgICAgICAgc2NyZWVuWDogZS5zY3JlZW5YLFxuICAgICAgICBzY3JlZW5ZOiBlLnNjcmVlblksXG4gICAgICAgIHRhcmdldDogZS50YXJnZXRcbiAgICAgIH07XG4gICAgfTtcbiAgICB2YXIgbWFrZVBvaW50ZXIgPSBmdW5jdGlvbiBtYWtlUG9pbnRlcihlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBldmVudDogZSxcbiAgICAgICAgdG91Y2g6IG1ha2VUb3VjaChlKVxuICAgICAgfTtcbiAgICB9O1xuICAgIHZhciBhZGRQb2ludGVyID0gZnVuY3Rpb24gYWRkUG9pbnRlcihlKSB7XG4gICAgICBwb2ludGVycy5wdXNoKG1ha2VQb2ludGVyKGUpKTtcbiAgICB9O1xuICAgIHZhciByZW1vdmVQb2ludGVyID0gZnVuY3Rpb24gcmVtb3ZlUG9pbnRlcihlKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwID0gcG9pbnRlcnNbaV07XG4gICAgICAgIGlmIChwLmV2ZW50LnBvaW50ZXJJZCA9PT0gZS5wb2ludGVySWQpIHtcbiAgICAgICAgICBwb2ludGVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgdXBkYXRlUG9pbnRlciA9IGZ1bmN0aW9uIHVwZGF0ZVBvaW50ZXIoZSkge1xuICAgICAgdmFyIHAgPSBwb2ludGVycy5maWx0ZXIoZnVuY3Rpb24gKHApIHtcbiAgICAgICAgcmV0dXJuIHAuZXZlbnQucG9pbnRlcklkID09PSBlLnBvaW50ZXJJZDtcbiAgICAgIH0pWzBdO1xuICAgICAgcC5ldmVudCA9IGU7XG4gICAgICBwLnRvdWNoID0gbWFrZVRvdWNoKGUpO1xuICAgIH07XG4gICAgdmFyIGFkZFRvdWNoZXNUb0V2ZW50ID0gZnVuY3Rpb24gYWRkVG91Y2hlc1RvRXZlbnQoZSkge1xuICAgICAgZS50b3VjaGVzID0gcG9pbnRlcnMubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHJldHVybiBwLnRvdWNoO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICB2YXIgcG9pbnRlcklzTW91c2UgPSBmdW5jdGlvbiBwb2ludGVySXNNb3VzZShlKSB7XG4gICAgICByZXR1cm4gZS5wb2ludGVyVHlwZSA9PT0gJ21vdXNlJyB8fCBlLnBvaW50ZXJUeXBlID09PSA0O1xuICAgIH07XG4gICAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdwb2ludGVyZG93bicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAocG9pbnRlcklzTW91c2UoZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBtb3VzZSBhbHJlYWR5IGhhbmRsZWRcblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgYWRkUG9pbnRlcihlKTtcbiAgICAgIGFkZFRvdWNoZXNUb0V2ZW50KGUpO1xuICAgICAgdG91Y2hzdGFydEhhbmRsZXIoZSk7XG4gICAgfSk7XG4gICAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdwb2ludGVydXAnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKHBvaW50ZXJJc01vdXNlKGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gbW91c2UgYWxyZWFkeSBoYW5kbGVkXG5cbiAgICAgIHJlbW92ZVBvaW50ZXIoZSk7XG4gICAgICBhZGRUb3VjaGVzVG9FdmVudChlKTtcbiAgICAgIHRvdWNoZW5kSGFuZGxlcihlKTtcbiAgICB9KTtcbiAgICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ3BvaW50ZXJjYW5jZWwnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKHBvaW50ZXJJc01vdXNlKGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gbW91c2UgYWxyZWFkeSBoYW5kbGVkXG5cbiAgICAgIHJlbW92ZVBvaW50ZXIoZSk7XG4gICAgICBhZGRUb3VjaGVzVG9FdmVudChlKTtcbiAgICAgIHRvdWNoY2FuY2VsSGFuZGxlcihlKTtcbiAgICB9KTtcbiAgICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ3BvaW50ZXJtb3ZlJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChwb2ludGVySXNNb3VzZShlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIG1vdXNlIGFscmVhZHkgaGFuZGxlZFxuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB1cGRhdGVQb2ludGVyKGUpO1xuICAgICAgYWRkVG91Y2hlc1RvRXZlbnQoZSk7XG4gICAgICB0b3VjaG1vdmVIYW5kbGVyKGUpO1xuICAgIH0pO1xuICB9XG59O1xuXG52YXIgQlJwJDIgPSB7fTtcbkJScCQyLmdlbmVyYXRlUG9seWdvbiA9IGZ1bmN0aW9uIChuYW1lLCBwb2ludHMpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1tuYW1lXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiBuYW1lLFxuICAgIHBvaW50czogcG9pbnRzLFxuICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKCdwb2x5Z29uJywgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgdGhpcy5wb2ludHMpO1xuICAgIH0sXG4gICAgaW50ZXJzZWN0TGluZTogZnVuY3Rpb24gaW50ZXJzZWN0TGluZShub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcpIHtcbiAgICAgIHJldHVybiBwb2x5Z29uSW50ZXJzZWN0TGluZSh4LCB5LCB0aGlzLnBvaW50cywgbm9kZVgsIG5vZGVZLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIsIHBhZGRpbmcpO1xuICAgIH0sXG4gICAgY2hlY2tQb2ludDogZnVuY3Rpb24gY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZKSB7XG4gICAgICByZXR1cm4gcG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBbMCwgLTFdLCBwYWRkaW5nKTtcbiAgICB9XG4gIH07XG59O1xuQlJwJDIuZ2VuZXJhdGVFbGxpcHNlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ub2RlU2hhcGVzWydlbGxpcHNlJ10gPSB7XG4gICAgcmVuZGVyZXI6IHRoaXMsXG4gICAgbmFtZTogJ2VsbGlwc2UnLFxuICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKHRoaXMubmFtZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfSxcbiAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZykge1xuICAgICAgcmV0dXJuIGludGVyc2VjdExpbmVFbGxpcHNlKHgsIHksIG5vZGVYLCBub2RlWSwgd2lkdGggLyAyICsgcGFkZGluZywgaGVpZ2h0IC8gMiArIHBhZGRpbmcpO1xuICAgIH0sXG4gICAgY2hlY2tQb2ludDogZnVuY3Rpb24gY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZKSB7XG4gICAgICByZXR1cm4gY2hlY2tJbkVsbGlwc2UoeCwgeSwgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSwgcGFkZGluZyk7XG4gICAgfVxuICB9O1xufTtcbkJScCQyLmdlbmVyYXRlUm91bmRQb2x5Z29uID0gZnVuY3Rpb24gKG5hbWUsIHBvaW50cykge1xuICAvLyBQcmUtY29tcHV0ZSBjb250cm9sIHBvaW50c1xuICAvLyBTaW5jZSB0aGVzZSBwb2ludHMgZGVwZW5kIG9uIHRoZSByYWRpdXMgbGVuZ3RoICh3aGljaCBpbiB0dXJucyBkZXBlbmQgb24gdGhlIHdpZHRoL2hlaWdodCBvZiB0aGUgbm9kZSkgd2Ugd2lsbCBvbmx5IHByZS1jb21wdXRlXG4gIC8vIHRoZSB1bml0IHZlY3RvcnMuXG4gIC8vIEZvciBzaW1wbGljaXR5IHRoZSBsYXlvdXQgd2lsbCBiZTpcbiAgLy8gWyBwMCwgVW5pdFZlY3RvclAwUDEsIHAxLCBVbmlWZWN0b3JQMVAyLCAuLi4sIHBuLCBVbml0VmVjdG9yUG5QMCBdXG4gIHZhciBhbGxQb2ludHMgPSBuZXcgQXJyYXkocG9pbnRzLmxlbmd0aCAqIDIpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICB2YXIgc291cmNlSW5kZXggPSBpICogMjtcbiAgICB2YXIgZGVzdEluZGV4ID0gdm9pZCAwO1xuICAgIGlmIChpIDwgcG9pbnRzLmxlbmd0aCAvIDIgLSAxKSB7XG4gICAgICBkZXN0SW5kZXggPSAoaSArIDEpICogMjtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVzdEluZGV4ID0gMDtcbiAgICB9XG4gICAgYWxsUG9pbnRzW2kgKiA0XSA9IHBvaW50c1tzb3VyY2VJbmRleF07XG4gICAgYWxsUG9pbnRzW2kgKiA0ICsgMV0gPSBwb2ludHNbc291cmNlSW5kZXggKyAxXTtcbiAgICB2YXIgeERlc3QgPSBwb2ludHNbZGVzdEluZGV4XSAtIHBvaW50c1tzb3VyY2VJbmRleF07XG4gICAgdmFyIHlEZXN0ID0gcG9pbnRzW2Rlc3RJbmRleCArIDFdIC0gcG9pbnRzW3NvdXJjZUluZGV4ICsgMV07XG4gICAgdmFyIG5vcm0gPSBNYXRoLnNxcnQoeERlc3QgKiB4RGVzdCArIHlEZXN0ICogeURlc3QpO1xuICAgIGFsbFBvaW50c1tpICogNCArIDJdID0geERlc3QgLyBub3JtO1xuICAgIGFsbFBvaW50c1tpICogNCArIDNdID0geURlc3QgLyBub3JtO1xuICB9XG4gIHJldHVybiB0aGlzLm5vZGVTaGFwZXNbbmFtZV0gPSB7XG4gICAgcmVuZGVyZXI6IHRoaXMsXG4gICAgbmFtZTogbmFtZSxcbiAgICBwb2ludHM6IGFsbFBvaW50cyxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCgncm91bmQtcG9seWdvbicsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHRoaXMucG9pbnRzKTtcbiAgICB9LFxuICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIGludGVyc2VjdExpbmUobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nKSB7XG4gICAgICByZXR1cm4gcm91bmRQb2x5Z29uSW50ZXJzZWN0TGluZSh4LCB5LCB0aGlzLnBvaW50cywgbm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9LFxuICAgIGNoZWNrUG9pbnQ6IGZ1bmN0aW9uIGNoZWNrUG9pbnQoeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSkge1xuICAgICAgcmV0dXJuIHBvaW50SW5zaWRlUm91bmRQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gIH07XG59O1xuQlJwJDIuZ2VuZXJhdGVSb3VuZFJlY3RhbmdsZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1sncm91bmQtcmVjdGFuZ2xlJ10gPSB0aGlzLm5vZGVTaGFwZXNbJ3JvdW5kcmVjdGFuZ2xlJ10gPSB7XG4gICAgcmVuZGVyZXI6IHRoaXMsXG4gICAgbmFtZTogJ3JvdW5kLXJlY3RhbmdsZScsXG4gICAgcG9pbnRzOiBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCksXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLm5vZGVTaGFwZUltcGwodGhpcy5uYW1lLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9LFxuICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIGludGVyc2VjdExpbmUobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nKSB7XG4gICAgICByZXR1cm4gcm91bmRSZWN0YW5nbGVJbnRlcnNlY3RMaW5lKHgsIHksIG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZyk7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkpIHtcbiAgICAgIHZhciBjb3JuZXJSYWRpdXMgPSBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHZhciBkaWFtID0gY29ybmVyUmFkaXVzICogMjtcblxuICAgICAgLy8gQ2hlY2sgaEJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCAtIGRpYW0sIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayB2Qm94XG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCAtIGRpYW0sIGhlaWdodCwgWzAsIC0xXSwgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIHRvcCBsZWZ0IHF1YXJ0ZXIgY2lyY2xlXG4gICAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSwgZGlhbSwgZGlhbSwgY2VudGVyWCAtIHdpZHRoIC8gMiArIGNvcm5lclJhZGl1cywgY2VudGVyWSAtIGhlaWdodCAvIDIgKyBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayB0b3AgcmlnaHQgcXVhcnRlciBjaXJjbGVcbiAgICAgIGlmIChjaGVja0luRWxsaXBzZSh4LCB5LCBkaWFtLCBkaWFtLCBjZW50ZXJYICsgd2lkdGggLyAyIC0gY29ybmVyUmFkaXVzLCBjZW50ZXJZIC0gaGVpZ2h0IC8gMiArIGNvcm5lclJhZGl1cywgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGJvdHRvbSByaWdodCBxdWFydGVyIGNpcmNsZVxuICAgICAgaWYgKGNoZWNrSW5FbGxpcHNlKHgsIHksIGRpYW0sIGRpYW0sIGNlbnRlclggKyB3aWR0aCAvIDIgLSBjb3JuZXJSYWRpdXMsIGNlbnRlclkgKyBoZWlnaHQgLyAyIC0gY29ybmVyUmFkaXVzLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgYm90dG9tIGxlZnQgcXVhcnRlciBjaXJjbGVcbiAgICAgIGlmIChjaGVja0luRWxsaXBzZSh4LCB5LCBkaWFtLCBkaWFtLCBjZW50ZXJYIC0gd2lkdGggLyAyICsgY29ybmVyUmFkaXVzLCBjZW50ZXJZICsgaGVpZ2h0IC8gMiAtIGNvcm5lclJhZGl1cywgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xufTtcbkJScCQyLmdlbmVyYXRlQ3V0UmVjdGFuZ2xlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ub2RlU2hhcGVzWydjdXQtcmVjdGFuZ2xlJ10gPSB0aGlzLm5vZGVTaGFwZXNbJ2N1dHJlY3RhbmdsZSddID0ge1xuICAgIHJlbmRlcmVyOiB0aGlzLFxuICAgIG5hbWU6ICdjdXQtcmVjdGFuZ2xlJyxcbiAgICBjb3JuZXJMZW5ndGg6IGdldEN1dFJlY3RhbmdsZUNvcm5lckxlbmd0aCgpLFxuICAgIHBvaW50czogZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDQsIDApLFxuICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKHRoaXMubmFtZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfSxcbiAgICBnZW5lcmF0ZUN1dFRyaWFuZ2xlUHRzOiBmdW5jdGlvbiBnZW5lcmF0ZUN1dFRyaWFuZ2xlUHRzKHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkpIHtcbiAgICAgIHZhciBjbCA9IHRoaXMuY29ybmVyTGVuZ3RoO1xuICAgICAgdmFyIGhoID0gaGVpZ2h0IC8gMjtcbiAgICAgIHZhciBodyA9IHdpZHRoIC8gMjtcbiAgICAgIHZhciB4QmVnaW4gPSBjZW50ZXJYIC0gaHc7XG4gICAgICB2YXIgeEVuZCA9IGNlbnRlclggKyBodztcbiAgICAgIHZhciB5QmVnaW4gPSBjZW50ZXJZIC0gaGg7XG4gICAgICB2YXIgeUVuZCA9IGNlbnRlclkgKyBoaDtcblxuICAgICAgLy8gcG9pbnRzIGFyZSBpbiBjbG9ja3dpc2Ugb3JkZXIsIGlubmVyIChpbWFnaW5hcnkpIHRyaWFuZ2xlIHB0IG9uIFs0LCA1XVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9wTGVmdDogW3hCZWdpbiwgeUJlZ2luICsgY2wsIHhCZWdpbiArIGNsLCB5QmVnaW4sIHhCZWdpbiArIGNsLCB5QmVnaW4gKyBjbF0sXG4gICAgICAgIHRvcFJpZ2h0OiBbeEVuZCAtIGNsLCB5QmVnaW4sIHhFbmQsIHlCZWdpbiArIGNsLCB4RW5kIC0gY2wsIHlCZWdpbiArIGNsXSxcbiAgICAgICAgYm90dG9tUmlnaHQ6IFt4RW5kLCB5RW5kIC0gY2wsIHhFbmQgLSBjbCwgeUVuZCwgeEVuZCAtIGNsLCB5RW5kIC0gY2xdLFxuICAgICAgICBib3R0b21MZWZ0OiBbeEJlZ2luICsgY2wsIHlFbmQsIHhCZWdpbiwgeUVuZCAtIGNsLCB4QmVnaW4gKyBjbCwgeUVuZCAtIGNsXVxuICAgICAgfTtcbiAgICB9LFxuICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIGludGVyc2VjdExpbmUobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nKSB7XG4gICAgICB2YXIgY1B0cyA9IHRoaXMuZ2VuZXJhdGVDdXRUcmlhbmdsZVB0cyh3aWR0aCArIDIgKiBwYWRkaW5nLCBoZWlnaHQgKyAyICogcGFkZGluZywgbm9kZVgsIG5vZGVZKTtcbiAgICAgIHZhciBwdHMgPSBbXS5jb25jYXQuYXBwbHkoW10sIFtjUHRzLnRvcExlZnQuc3BsaWNlKDAsIDQpLCBjUHRzLnRvcFJpZ2h0LnNwbGljZSgwLCA0KSwgY1B0cy5ib3R0b21SaWdodC5zcGxpY2UoMCwgNCksIGNQdHMuYm90dG9tTGVmdC5zcGxpY2UoMCwgNCldKTtcbiAgICAgIHJldHVybiBwb2x5Z29uSW50ZXJzZWN0TGluZSh4LCB5LCBwdHMsIG5vZGVYLCBub2RlWSk7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkpIHtcbiAgICAgIC8vIENoZWNrIGhCb3hcbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgdGhpcy5wb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQgLSAyICogdGhpcy5jb3JuZXJMZW5ndGgsIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayB2Qm94XG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCAtIDIgKiB0aGlzLmNvcm5lckxlbmd0aCwgaGVpZ2h0LCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBjdXRUcmlhbmdsZVB0cyA9IHRoaXMuZ2VuZXJhdGVDdXRUcmlhbmdsZVB0cyh3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZKTtcbiAgICAgIHJldHVybiBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgY3V0VHJpYW5nbGVQdHMudG9wTGVmdCkgfHwgcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIGN1dFRyaWFuZ2xlUHRzLnRvcFJpZ2h0KSB8fCBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgY3V0VHJpYW5nbGVQdHMuYm90dG9tUmlnaHQpIHx8IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBjdXRUcmlhbmdsZVB0cy5ib3R0b21MZWZ0KTtcbiAgICB9XG4gIH07XG59O1xuQlJwJDIuZ2VuZXJhdGVCYXJyZWwgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLm5vZGVTaGFwZXNbJ2JhcnJlbCddID0ge1xuICAgIHJlbmRlcmVyOiB0aGlzLFxuICAgIG5hbWU6ICdiYXJyZWwnLFxuICAgIHBvaW50czogZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDQsIDApLFxuICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKHRoaXMubmFtZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfSxcbiAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZykge1xuICAgICAgLy8gdXNlIHR3byBmaXhlZCB0IHZhbHVlcyBmb3IgdGhlIGJlemllciBjdXJ2ZSBhcHByb3hpbWF0aW9uXG5cbiAgICAgIHZhciB0MCA9IDAuMTU7XG4gICAgICB2YXIgdDEgPSAwLjU7XG4gICAgICB2YXIgdDIgPSAwLjg1O1xuICAgICAgdmFyIGJQdHMgPSB0aGlzLmdlbmVyYXRlQmFycmVsQmV6aWVyUHRzKHdpZHRoICsgMiAqIHBhZGRpbmcsIGhlaWdodCArIDIgKiBwYWRkaW5nLCBub2RlWCwgbm9kZVkpO1xuICAgICAgdmFyIGFwcHJveGltYXRlQmFycmVsQ3VydmVQdHMgPSBmdW5jdGlvbiBhcHByb3hpbWF0ZUJhcnJlbEN1cnZlUHRzKHB0cykge1xuICAgICAgICAvLyBhcHByb3hpbWF0ZSBjdXJ2ZSBwdHMgYmFzZWQgb24gdGhlIHR3byB0IHZhbHVlc1xuICAgICAgICB2YXIgbTAgPSBxYmV6aWVyUHRBdCh7XG4gICAgICAgICAgeDogcHRzWzBdLFxuICAgICAgICAgIHk6IHB0c1sxXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogcHRzWzJdLFxuICAgICAgICAgIHk6IHB0c1szXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogcHRzWzRdLFxuICAgICAgICAgIHk6IHB0c1s1XVxuICAgICAgICB9LCB0MCk7XG4gICAgICAgIHZhciBtMSA9IHFiZXppZXJQdEF0KHtcbiAgICAgICAgICB4OiBwdHNbMF0sXG4gICAgICAgICAgeTogcHRzWzFdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBwdHNbMl0sXG4gICAgICAgICAgeTogcHRzWzNdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBwdHNbNF0sXG4gICAgICAgICAgeTogcHRzWzVdXG4gICAgICAgIH0sIHQxKTtcbiAgICAgICAgdmFyIG0yID0gcWJlemllclB0QXQoe1xuICAgICAgICAgIHg6IHB0c1swXSxcbiAgICAgICAgICB5OiBwdHNbMV1cbiAgICAgICAgfSwge1xuICAgICAgICAgIHg6IHB0c1syXSxcbiAgICAgICAgICB5OiBwdHNbM11cbiAgICAgICAgfSwge1xuICAgICAgICAgIHg6IHB0c1s0XSxcbiAgICAgICAgICB5OiBwdHNbNV1cbiAgICAgICAgfSwgdDIpO1xuICAgICAgICByZXR1cm4gW3B0c1swXSwgcHRzWzFdLCBtMC54LCBtMC55LCBtMS54LCBtMS55LCBtMi54LCBtMi55LCBwdHNbNF0sIHB0c1s1XV07XG4gICAgICB9O1xuICAgICAgdmFyIHB0cyA9IFtdLmNvbmNhdChhcHByb3hpbWF0ZUJhcnJlbEN1cnZlUHRzKGJQdHMudG9wTGVmdCksIGFwcHJveGltYXRlQmFycmVsQ3VydmVQdHMoYlB0cy50b3BSaWdodCksIGFwcHJveGltYXRlQmFycmVsQ3VydmVQdHMoYlB0cy5ib3R0b21SaWdodCksIGFwcHJveGltYXRlQmFycmVsQ3VydmVQdHMoYlB0cy5ib3R0b21MZWZ0KSk7XG4gICAgICByZXR1cm4gcG9seWdvbkludGVyc2VjdExpbmUoeCwgeSwgcHRzLCBub2RlWCwgbm9kZVkpO1xuICAgIH0sXG4gICAgZ2VuZXJhdGVCYXJyZWxCZXppZXJQdHM6IGZ1bmN0aW9uIGdlbmVyYXRlQmFycmVsQmV6aWVyUHRzKHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkpIHtcbiAgICAgIHZhciBoaCA9IGhlaWdodCAvIDI7XG4gICAgICB2YXIgaHcgPSB3aWR0aCAvIDI7XG4gICAgICB2YXIgeEJlZ2luID0gY2VudGVyWCAtIGh3O1xuICAgICAgdmFyIHhFbmQgPSBjZW50ZXJYICsgaHc7XG4gICAgICB2YXIgeUJlZ2luID0gY2VudGVyWSAtIGhoO1xuICAgICAgdmFyIHlFbmQgPSBjZW50ZXJZICsgaGg7XG4gICAgICB2YXIgY3VydmVDb25zdGFudHMgPSBnZXRCYXJyZWxDdXJ2ZUNvbnN0YW50cyh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHZhciBoT2Zmc2V0ID0gY3VydmVDb25zdGFudHMuaGVpZ2h0T2Zmc2V0O1xuICAgICAgdmFyIHdPZmZzZXQgPSBjdXJ2ZUNvbnN0YW50cy53aWR0aE9mZnNldDtcbiAgICAgIHZhciBjdHJsUHRYT2Zmc2V0ID0gY3VydmVDb25zdGFudHMuY3RybFB0T2Zmc2V0UGN0ICogd2lkdGg7XG5cbiAgICAgIC8vIHBvaW50cyBhcmUgaW4gY2xvY2t3aXNlIG9yZGVyLCBpbm5lciAoaW1hZ2luYXJ5KSBjb250cm9sIHB0IG9uIFs0LCA1XVxuICAgICAgdmFyIHB0cyA9IHtcbiAgICAgICAgdG9wTGVmdDogW3hCZWdpbiwgeUJlZ2luICsgaE9mZnNldCwgeEJlZ2luICsgY3RybFB0WE9mZnNldCwgeUJlZ2luLCB4QmVnaW4gKyB3T2Zmc2V0LCB5QmVnaW5dLFxuICAgICAgICB0b3BSaWdodDogW3hFbmQgLSB3T2Zmc2V0LCB5QmVnaW4sIHhFbmQgLSBjdHJsUHRYT2Zmc2V0LCB5QmVnaW4sIHhFbmQsIHlCZWdpbiArIGhPZmZzZXRdLFxuICAgICAgICBib3R0b21SaWdodDogW3hFbmQsIHlFbmQgLSBoT2Zmc2V0LCB4RW5kIC0gY3RybFB0WE9mZnNldCwgeUVuZCwgeEVuZCAtIHdPZmZzZXQsIHlFbmRdLFxuICAgICAgICBib3R0b21MZWZ0OiBbeEJlZ2luICsgd09mZnNldCwgeUVuZCwgeEJlZ2luICsgY3RybFB0WE9mZnNldCwgeUVuZCwgeEJlZ2luLCB5RW5kIC0gaE9mZnNldF1cbiAgICAgIH07XG4gICAgICBwdHMudG9wTGVmdC5pc1RvcCA9IHRydWU7XG4gICAgICBwdHMudG9wUmlnaHQuaXNUb3AgPSB0cnVlO1xuICAgICAgcHRzLmJvdHRvbUxlZnQuaXNCb3R0b20gPSB0cnVlO1xuICAgICAgcHRzLmJvdHRvbVJpZ2h0LmlzQm90dG9tID0gdHJ1ZTtcbiAgICAgIHJldHVybiBwdHM7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkpIHtcbiAgICAgIHZhciBjdXJ2ZUNvbnN0YW50cyA9IGdldEJhcnJlbEN1cnZlQ29uc3RhbnRzKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdmFyIGhPZmZzZXQgPSBjdXJ2ZUNvbnN0YW50cy5oZWlnaHRPZmZzZXQ7XG4gICAgICB2YXIgd09mZnNldCA9IGN1cnZlQ29uc3RhbnRzLndpZHRoT2Zmc2V0O1xuXG4gICAgICAvLyBDaGVjayBoQm94XG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0IC0gMiAqIGhPZmZzZXQsIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayB2Qm94XG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCAtIDIgKiB3T2Zmc2V0LCBoZWlnaHQsIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIGJhcnJlbEN1cnZlUHRzID0gdGhpcy5nZW5lcmF0ZUJhcnJlbEJlemllclB0cyh3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZKTtcbiAgICAgIHZhciBnZXRDdXJ2ZVQgPSBmdW5jdGlvbiBnZXRDdXJ2ZVQoeCwgeSwgY3VydmVQdHMpIHtcbiAgICAgICAgdmFyIHgwID0gY3VydmVQdHNbNF07XG4gICAgICAgIHZhciB4MSA9IGN1cnZlUHRzWzJdO1xuICAgICAgICB2YXIgeDIgPSBjdXJ2ZVB0c1swXTtcbiAgICAgICAgdmFyIHkwID0gY3VydmVQdHNbNV07XG4gICAgICAgIC8vIHZhciB5MSA9IGN1cnZlUHRzWyAzIF07XG4gICAgICAgIHZhciB5MiA9IGN1cnZlUHRzWzFdO1xuICAgICAgICB2YXIgeE1pbiA9IE1hdGgubWluKHgwLCB4Mik7XG4gICAgICAgIHZhciB4TWF4ID0gTWF0aC5tYXgoeDAsIHgyKTtcbiAgICAgICAgdmFyIHlNaW4gPSBNYXRoLm1pbih5MCwgeTIpO1xuICAgICAgICB2YXIgeU1heCA9IE1hdGgubWF4KHkwLCB5Mik7XG4gICAgICAgIGlmICh4TWluIDw9IHggJiYgeCA8PSB4TWF4ICYmIHlNaW4gPD0geSAmJiB5IDw9IHlNYXgpIHtcbiAgICAgICAgICB2YXIgY29lZmYgPSBiZXppZXJQdHNUb1F1YWRDb2VmZih4MCwgeDEsIHgyKTtcbiAgICAgICAgICB2YXIgcm9vdHMgPSBzb2x2ZVF1YWRyYXRpYyhjb2VmZlswXSwgY29lZmZbMV0sIGNvZWZmWzJdLCB4KTtcbiAgICAgICAgICB2YXIgdmFsaWRSb290cyA9IHJvb3RzLmZpbHRlcihmdW5jdGlvbiAocikge1xuICAgICAgICAgICAgcmV0dXJuIDAgPD0gciAmJiByIDw9IDE7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHZhbGlkUm9vdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbGlkUm9vdHNbMF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIHZhciBjdXJ2ZVJlZ2lvbnMgPSBPYmplY3Qua2V5cyhiYXJyZWxDdXJ2ZVB0cyk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1cnZlUmVnaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY29ybmVyID0gY3VydmVSZWdpb25zW2ldO1xuICAgICAgICB2YXIgY29ybmVyUHRzID0gYmFycmVsQ3VydmVQdHNbY29ybmVyXTtcbiAgICAgICAgdmFyIHQgPSBnZXRDdXJ2ZVQoeCwgeSwgY29ybmVyUHRzKTtcbiAgICAgICAgaWYgKHQgPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciB5MCA9IGNvcm5lclB0c1s1XTtcbiAgICAgICAgdmFyIHkxID0gY29ybmVyUHRzWzNdO1xuICAgICAgICB2YXIgeTIgPSBjb3JuZXJQdHNbMV07XG4gICAgICAgIHZhciBiZXpZID0gcWJlemllckF0KHkwLCB5MSwgeTIsIHQpO1xuICAgICAgICBpZiAoY29ybmVyUHRzLmlzVG9wICYmIGJlelkgPD0geSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3JuZXJQdHMuaXNCb3R0b20gJiYgeSA8PSBiZXpZKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG59O1xuQlJwJDIuZ2VuZXJhdGVCb3R0b21Sb3VuZHJlY3RhbmdsZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1snYm90dG9tLXJvdW5kLXJlY3RhbmdsZSddID0gdGhpcy5ub2RlU2hhcGVzWydib3R0b21yb3VuZHJlY3RhbmdsZSddID0ge1xuICAgIHJlbmRlcmVyOiB0aGlzLFxuICAgIG5hbWU6ICdib3R0b20tcm91bmQtcmVjdGFuZ2xlJyxcbiAgICBwb2ludHM6IGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg0LCAwKSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCh0aGlzLm5hbWUsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpO1xuICAgIH0sXG4gICAgaW50ZXJzZWN0TGluZTogZnVuY3Rpb24gaW50ZXJzZWN0TGluZShub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcpIHtcbiAgICAgIHZhciB0b3BTdGFydFggPSBub2RlWCAtICh3aWR0aCAvIDIgKyBwYWRkaW5nKTtcbiAgICAgIHZhciB0b3BTdGFydFkgPSBub2RlWSAtIChoZWlnaHQgLyAyICsgcGFkZGluZyk7XG4gICAgICB2YXIgdG9wRW5kWSA9IHRvcFN0YXJ0WTtcbiAgICAgIHZhciB0b3BFbmRYID0gbm9kZVggKyAod2lkdGggLyAyICsgcGFkZGluZyk7XG4gICAgICB2YXIgdG9wSW50ZXJzZWN0aW9ucyA9IGZpbml0ZUxpbmVzSW50ZXJzZWN0KHgsIHksIG5vZGVYLCBub2RlWSwgdG9wU3RhcnRYLCB0b3BTdGFydFksIHRvcEVuZFgsIHRvcEVuZFksIGZhbHNlKTtcbiAgICAgIGlmICh0b3BJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHRvcEludGVyc2VjdGlvbnM7XG4gICAgICB9XG4gICAgICByZXR1cm4gcm91bmRSZWN0YW5nbGVJbnRlcnNlY3RMaW5lKHgsIHksIG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZyk7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkpIHtcbiAgICAgIHZhciBjb3JuZXJSYWRpdXMgPSBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHZhciBkaWFtID0gMiAqIGNvcm5lclJhZGl1cztcblxuICAgICAgLy8gQ2hlY2sgaEJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCAtIGRpYW0sIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayB2Qm94XG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCAtIGRpYW0sIGhlaWdodCwgWzAsIC0xXSwgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGNoZWNrIG5vbi1yb3VuZGVkIHRvcCBzaWRlXG4gICAgICB2YXIgb3V0ZXJXaWR0aCA9IHdpZHRoIC8gMiArIDIgKiBwYWRkaW5nO1xuICAgICAgdmFyIG91dGVySGVpZ2h0ID0gaGVpZ2h0IC8gMiArIDIgKiBwYWRkaW5nO1xuICAgICAgdmFyIHBvaW50cyA9IFtjZW50ZXJYIC0gb3V0ZXJXaWR0aCwgY2VudGVyWSAtIG91dGVySGVpZ2h0LCBjZW50ZXJYIC0gb3V0ZXJXaWR0aCwgY2VudGVyWSwgY2VudGVyWCArIG91dGVyV2lkdGgsIGNlbnRlclksIGNlbnRlclggKyBvdXRlcldpZHRoLCBjZW50ZXJZIC0gb3V0ZXJIZWlnaHRdO1xuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBwb2ludHMpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBib3R0b20gcmlnaHQgcXVhcnRlciBjaXJjbGVcbiAgICAgIGlmIChjaGVja0luRWxsaXBzZSh4LCB5LCBkaWFtLCBkaWFtLCBjZW50ZXJYICsgd2lkdGggLyAyIC0gY29ybmVyUmFkaXVzLCBjZW50ZXJZICsgaGVpZ2h0IC8gMiAtIGNvcm5lclJhZGl1cywgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGJvdHRvbSBsZWZ0IHF1YXJ0ZXIgY2lyY2xlXG4gICAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSwgZGlhbSwgZGlhbSwgY2VudGVyWCAtIHdpZHRoIC8gMiArIGNvcm5lclJhZGl1cywgY2VudGVyWSArIGhlaWdodCAvIDIgLSBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbn07XG5CUnAkMi5yZWdpc3Rlck5vZGVTaGFwZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBub2RlU2hhcGVzID0gdGhpcy5ub2RlU2hhcGVzID0ge307XG4gIHZhciByZW5kZXJlciA9IHRoaXM7XG4gIHRoaXMuZ2VuZXJhdGVFbGxpcHNlKCk7XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCd0cmlhbmdsZScsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSgzLCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLXRyaWFuZ2xlJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDMsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3JlY3RhbmdsZScsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg0LCAwKSk7XG4gIG5vZGVTaGFwZXNbJ3NxdWFyZSddID0gbm9kZVNoYXBlc1sncmVjdGFuZ2xlJ107XG4gIHRoaXMuZ2VuZXJhdGVSb3VuZFJlY3RhbmdsZSgpO1xuICB0aGlzLmdlbmVyYXRlQ3V0UmVjdGFuZ2xlKCk7XG4gIHRoaXMuZ2VuZXJhdGVCYXJyZWwoKTtcbiAgdGhpcy5nZW5lcmF0ZUJvdHRvbVJvdW5kcmVjdGFuZ2xlKCk7XG4gIHtcbiAgICB2YXIgZGlhbW9uZFBvaW50cyA9IFswLCAxLCAxLCAwLCAwLCAtMSwgLTEsIDBdO1xuICAgIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdkaWFtb25kJywgZGlhbW9uZFBvaW50cyk7XG4gICAgdGhpcy5nZW5lcmF0ZVJvdW5kUG9seWdvbigncm91bmQtZGlhbW9uZCcsIGRpYW1vbmRQb2ludHMpO1xuICB9XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdwZW50YWdvbicsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg1LCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLXBlbnRhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDUsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ2hleGFnb24nLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNiwgMCkpO1xuICB0aGlzLmdlbmVyYXRlUm91bmRQb2x5Z29uKCdyb3VuZC1oZXhhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDYsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ2hlcHRhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDcsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVJvdW5kUG9seWdvbigncm91bmQtaGVwdGFnb24nLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNywgMCkpO1xuICB0aGlzLmdlbmVyYXRlUG9seWdvbignb2N0YWdvbicsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg4LCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLW9jdGFnb24nLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoOCwgMCkpO1xuICB2YXIgc3RhcjVQb2ludHMgPSBuZXcgQXJyYXkoMjApO1xuICB7XG4gICAgdmFyIG91dGVyUG9pbnRzID0gZ2VuZXJhdGVVbml0TmdvblBvaW50cyg1LCAwKTtcbiAgICB2YXIgaW5uZXJQb2ludHMgPSBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzKDUsIE1hdGguUEkgLyA1KTtcblxuICAgIC8vIE91dGVyIHJhZGl1cyBpcyAxOyBpbm5lciByYWRpdXMgb2Ygc3RhciBpcyBzbWFsbGVyXG4gICAgdmFyIGlubmVyUmFkaXVzID0gMC41ICogKDMgLSBNYXRoLnNxcnQoNSkpO1xuICAgIGlubmVyUmFkaXVzICo9IDEuNTc7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbm5lclBvaW50cy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICAgIGlubmVyUG9pbnRzW2kgKiAyXSAqPSBpbm5lclJhZGl1cztcbiAgICAgIGlubmVyUG9pbnRzW2kgKiAyICsgMV0gKj0gaW5uZXJSYWRpdXM7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjAgLyA0OyBpKyspIHtcbiAgICAgIHN0YXI1UG9pbnRzW2kgKiA0XSA9IG91dGVyUG9pbnRzW2kgKiAyXTtcbiAgICAgIHN0YXI1UG9pbnRzW2kgKiA0ICsgMV0gPSBvdXRlclBvaW50c1tpICogMiArIDFdO1xuICAgICAgc3RhcjVQb2ludHNbaSAqIDQgKyAyXSA9IGlubmVyUG9pbnRzW2kgKiAyXTtcbiAgICAgIHN0YXI1UG9pbnRzW2kgKiA0ICsgM10gPSBpbm5lclBvaW50c1tpICogMiArIDFdO1xuICAgIH1cbiAgfVxuICBzdGFyNVBvaW50cyA9IGZpdFBvbHlnb25Ub1NxdWFyZShzdGFyNVBvaW50cyk7XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdzdGFyJywgc3RhcjVQb2ludHMpO1xuICB0aGlzLmdlbmVyYXRlUG9seWdvbigndmVlJywgWy0xLCAtMSwgMCwgLTAuMzMzLCAxLCAtMSwgMCwgMV0pO1xuICB0aGlzLmdlbmVyYXRlUG9seWdvbigncmhvbWJvaWQnLCBbLTEsIC0xLCAwLjMzMywgLTEsIDEsIDEsIC0wLjMzMywgMV0pO1xuICB0aGlzLmdlbmVyYXRlUG9seWdvbigncmlnaHQtcmhvbWJvaWQnLCBbLTAuMzMzLCAtMSwgMSwgLTEsIDAuMzMzLCAxLCAtMSwgMV0pO1xuICB0aGlzLm5vZGVTaGFwZXNbJ2NvbmNhdmVoZXhhZ29uJ10gPSB0aGlzLmdlbmVyYXRlUG9seWdvbignY29uY2F2ZS1oZXhhZ29uJywgWy0xLCAtMC45NSwgLTAuNzUsIDAsIC0xLCAwLjk1LCAxLCAwLjk1LCAwLjc1LCAwLCAxLCAtMC45NV0pO1xuICB7XG4gICAgdmFyIHRhZ1BvaW50cyA9IFstMSwgLTEsIDAuMjUsIC0xLCAxLCAwLCAwLjI1LCAxLCAtMSwgMV07XG4gICAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3RhZycsIHRhZ1BvaW50cyk7XG4gICAgdGhpcy5nZW5lcmF0ZVJvdW5kUG9seWdvbigncm91bmQtdGFnJywgdGFnUG9pbnRzKTtcbiAgfVxuICBub2RlU2hhcGVzLm1ha2VQb2x5Z29uID0gZnVuY3Rpb24gKHBvaW50cykge1xuICAgIC8vIHVzZSBjYWNoaW5nIG9uIHVzZXItc3BlY2lmaWVkIHBvbHlnb25zIHNvIHRoZXkgYXJlIGFzIGZhc3QgYXMgbmF0aXZlIHNoYXBlc1xuXG4gICAgdmFyIGtleSA9IHBvaW50cy5qb2luKCckJyk7XG4gICAgdmFyIG5hbWUgPSAncG9seWdvbi0nICsga2V5O1xuICAgIHZhciBzaGFwZTtcbiAgICBpZiAoc2hhcGUgPSB0aGlzW25hbWVdKSB7XG4gICAgICAvLyBnb3QgY2FjaGVkIHNoYXBlXG4gICAgICByZXR1cm4gc2hhcGU7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIGFuZCBjYWNoZSBuZXcgc2hhcGVcbiAgICByZXR1cm4gcmVuZGVyZXIuZ2VuZXJhdGVQb2x5Z29uKG5hbWUsIHBvaW50cyk7XG4gIH07XG59O1xuXG52YXIgQlJwJDEgPSB7fTtcbkJScCQxLnRpbWVUb1JlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucmVkcmF3VG90YWxUaW1lIC8gdGhpcy5yZWRyYXdDb3VudDtcbn07XG5CUnAkMS5yZWRyYXcgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCBzdGF0aWNFbXB0eU9iamVjdCgpO1xuICB2YXIgciA9IHRoaXM7XG4gIGlmIChyLmF2ZXJhZ2VSZWRyYXdUaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByLmF2ZXJhZ2VSZWRyYXdUaW1lID0gMDtcbiAgfVxuICBpZiAoci5sYXN0UmVkcmF3VGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgci5sYXN0UmVkcmF3VGltZSA9IDA7XG4gIH1cbiAgaWYgKHIubGFzdERyYXdUaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByLmxhc3REcmF3VGltZSA9IDA7XG4gIH1cbiAgci5yZXF1ZXN0ZWRGcmFtZSA9IHRydWU7XG4gIHIucmVuZGVyT3B0aW9ucyA9IG9wdGlvbnM7XG59O1xuQlJwJDEuYmVmb3JlUmVuZGVyID0gZnVuY3Rpb24gKGZuLCBwcmlvcml0eSkge1xuICAvLyB0aGUgcmVuZGVyZXIgY2FuJ3QgYWRkIHRpY2sgY2FsbGJhY2tzIHdoZW4gZGVzdHJveWVkXG4gIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocHJpb3JpdHkgPT0gbnVsbCkge1xuICAgIGVycm9yKCdQcmlvcml0eSBpcyBub3Qgb3B0aW9uYWwgZm9yIGJlZm9yZVJlbmRlcicpO1xuICB9XG4gIHZhciBjYnMgPSB0aGlzLmJlZm9yZVJlbmRlckNhbGxiYWNrcztcbiAgY2JzLnB1c2goe1xuICAgIGZuOiBmbixcbiAgICBwcmlvcml0eTogcHJpb3JpdHlcbiAgfSk7XG5cbiAgLy8gaGlnaGVyIHByaW9yaXR5IGNhbGxiYWNrcyBleGVjdXRlZCBmaXJzdFxuICBjYnMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLnByaW9yaXR5IC0gYS5wcmlvcml0eTtcbiAgfSk7XG59O1xudmFyIGJlZm9yZVJlbmRlckNhbGxiYWNrcyA9IGZ1bmN0aW9uIGJlZm9yZVJlbmRlckNhbGxiYWNrcyhyLCB3aWxsRHJhdywgc3RhcnRUaW1lKSB7XG4gIHZhciBjYnMgPSByLmJlZm9yZVJlbmRlckNhbGxiYWNrcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYnMubGVuZ3RoOyBpKyspIHtcbiAgICBjYnNbaV0uZm4od2lsbERyYXcsIHN0YXJ0VGltZSk7XG4gIH1cbn07XG5CUnAkMS5zdGFydFJlbmRlckxvb3AgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGN5ID0gci5jeTtcbiAgaWYgKHIucmVuZGVyTG9vcFN0YXJ0ZWQpIHtcbiAgICByZXR1cm47XG4gIH0gZWxzZSB7XG4gICAgci5yZW5kZXJMb29wU3RhcnRlZCA9IHRydWU7XG4gIH1cbiAgdmFyIHJlbmRlckZuID0gZnVuY3Rpb24gcmVuZGVyRm4ocmVxdWVzdFRpbWUpIHtcbiAgICBpZiAoci5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGN5LmJhdGNoaW5nKCkpIDsgZWxzZSBpZiAoci5yZXF1ZXN0ZWRGcmFtZSAmJiAhci5za2lwRnJhbWUpIHtcbiAgICAgIGJlZm9yZVJlbmRlckNhbGxiYWNrcyhyLCB0cnVlLCByZXF1ZXN0VGltZSk7XG4gICAgICB2YXIgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2VOb3coKTtcbiAgICAgIHIucmVuZGVyKHIucmVuZGVyT3B0aW9ucyk7XG4gICAgICB2YXIgZW5kVGltZSA9IHIubGFzdERyYXdUaW1lID0gcGVyZm9ybWFuY2VOb3coKTtcbiAgICAgIGlmIChyLmF2ZXJhZ2VSZWRyYXdUaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgci5hdmVyYWdlUmVkcmF3VGltZSA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gICAgICB9XG4gICAgICBpZiAoci5yZWRyYXdDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHIucmVkcmF3Q291bnQgPSAwO1xuICAgICAgfVxuICAgICAgci5yZWRyYXdDb3VudCsrO1xuICAgICAgaWYgKHIucmVkcmF3VG90YWxUaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgci5yZWRyYXdUb3RhbFRpbWUgPSAwO1xuICAgICAgfVxuICAgICAgdmFyIGR1cmF0aW9uID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcbiAgICAgIHIucmVkcmF3VG90YWxUaW1lICs9IGR1cmF0aW9uO1xuICAgICAgci5sYXN0UmVkcmF3VGltZSA9IGR1cmF0aW9uO1xuXG4gICAgICAvLyB1c2UgYSB3ZWlnaHRlZCBhdmVyYWdlIHdpdGggYSBiaWFzIGZyb20gdGhlIHByZXZpb3VzIGF2ZXJhZ2Ugc28gd2UgZG9uJ3Qgc3Bpa2Ugc28gZWFzaWx5XG4gICAgICByLmF2ZXJhZ2VSZWRyYXdUaW1lID0gci5hdmVyYWdlUmVkcmF3VGltZSAvIDIgKyBkdXJhdGlvbiAvIDI7XG4gICAgICByLnJlcXVlc3RlZEZyYW1lID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJlZm9yZVJlbmRlckNhbGxiYWNrcyhyLCBmYWxzZSwgcmVxdWVzdFRpbWUpO1xuICAgIH1cbiAgICByLnNraXBGcmFtZSA9IGZhbHNlO1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShyZW5kZXJGbik7XG4gIH07XG4gIHJlcXVlc3RBbmltYXRpb25GcmFtZShyZW5kZXJGbik7XG59O1xuXG52YXIgQmFzZVJlbmRlcmVyID0gZnVuY3Rpb24gQmFzZVJlbmRlcmVyKG9wdGlvbnMpIHtcbiAgdGhpcy5pbml0KG9wdGlvbnMpO1xufTtcbnZhciBCUiA9IEJhc2VSZW5kZXJlcjtcbnZhciBCUnAgPSBCUi5wcm90b3R5cGU7XG5CUnAuY2xpZW50RnVuY3Rpb25zID0gWydyZWRyYXdIaW50JywgJ3JlbmRlcicsICdyZW5kZXJUbycsICdtYXRjaENhbnZhc1NpemUnLCAnbm9kZVNoYXBlSW1wbCcsICdhcnJvd1NoYXBlSW1wbCddO1xuQlJwLmluaXQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICB2YXIgciA9IHRoaXM7XG4gIHIub3B0aW9ucyA9IG9wdGlvbnM7XG4gIHIuY3kgPSBvcHRpb25zLmN5O1xuICB2YXIgY3RyID0gci5jb250YWluZXIgPSBvcHRpb25zLmN5LmNvbnRhaW5lcigpO1xuICB2YXIgY29udGFpbmVyV2luZG93ID0gci5jeS53aW5kb3coKTtcblxuICAvLyBwcmVwZW5kIGEgc3R5bGVzaGVldCBpbiB0aGUgaGVhZCBzdWNoIHRoYXRcbiAgaWYgKGNvbnRhaW5lcldpbmRvdykge1xuICAgIHZhciBkb2N1bWVudCA9IGNvbnRhaW5lcldpbmRvdy5kb2N1bWVudDtcbiAgICB2YXIgaGVhZCA9IGRvY3VtZW50LmhlYWQ7XG4gICAgdmFyIHN0eWxlc2hlZXRJZCA9ICdfX19fX19fX19fY3l0b3NjYXBlX3N0eWxlc2hlZXQnO1xuICAgIHZhciBjbGFzc05hbWUgPSAnX19fX19fX19fX2N5dG9zY2FwZV9jb250YWluZXInO1xuICAgIHZhciBzdHlsZXNoZWV0QWxyZWFkeUV4aXN0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN0eWxlc2hlZXRJZCkgIT0gbnVsbDtcbiAgICBpZiAoY3RyLmNsYXNzTmFtZS5pbmRleE9mKGNsYXNzTmFtZSkgPCAwKSB7XG4gICAgICBjdHIuY2xhc3NOYW1lID0gKGN0ci5jbGFzc05hbWUgfHwgJycpICsgJyAnICsgY2xhc3NOYW1lO1xuICAgIH1cbiAgICBpZiAoIXN0eWxlc2hlZXRBbHJlYWR5RXhpc3RzKSB7XG4gICAgICB2YXIgc3R5bGVzaGVldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICBzdHlsZXNoZWV0LmlkID0gc3R5bGVzaGVldElkO1xuICAgICAgc3R5bGVzaGVldC50ZXh0Q29udGVudCA9ICcuJyArIGNsYXNzTmFtZSArICcgeyBwb3NpdGlvbjogcmVsYXRpdmU7IH0nO1xuICAgICAgaGVhZC5pbnNlcnRCZWZvcmUoc3R5bGVzaGVldCwgaGVhZC5jaGlsZHJlblswXSk7IC8vIGZpcnN0IHNvIGxvd2VzdCBwcmlvcml0eVxuICAgIH1cblxuICAgIHZhciBjb21wdXRlZFN0eWxlID0gY29udGFpbmVyV2luZG93LmdldENvbXB1dGVkU3R5bGUoY3RyKTtcbiAgICB2YXIgcG9zaXRpb24gPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3Bvc2l0aW9uJyk7XG4gICAgaWYgKHBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgICAgd2FybignQSBDeXRvc2NhcGUgY29udGFpbmVyIGhhcyBzdHlsZSBwb3NpdGlvbjpzdGF0aWMgYW5kIHNvIGNhbiBub3QgdXNlIFVJIGV4dGVuc2lvbnMgcHJvcGVybHknKTtcbiAgICB9XG4gIH1cbiAgci5zZWxlY3Rpb24gPSBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXTsgLy8gQ29vcmRpbmF0ZXMgZm9yIHNlbGVjdGlvbiBib3gsIHBsdXMgZW5hYmxlZCBmbGFnXG5cbiAgci5iZXppZXJQcm9qUGN0cyA9IFswLjA1LCAwLjIyNSwgMC40LCAwLjUsIDAuNiwgMC43NzUsIDAuOTVdO1xuXG4gIC8vLS1Qb2ludGVyLXJlbGF0ZWQgZGF0YVxuICByLmhvdmVyRGF0YSA9IHtcbiAgICBkb3duOiBudWxsLFxuICAgIGxhc3Q6IG51bGwsXG4gICAgZG93blRpbWU6IG51bGwsXG4gICAgdHJpZ2dlck1vZGU6IG51bGwsXG4gICAgZHJhZ2dpbmc6IGZhbHNlLFxuICAgIGluaXRpYWxQYW46IFtudWxsLCBudWxsXSxcbiAgICBjYXB0dXJlOiBmYWxzZVxuICB9O1xuICByLmRyYWdEYXRhID0ge1xuICAgIHBvc3NpYmxlRHJhZ0VsZW1lbnRzOiBbXVxuICB9O1xuICByLnRvdWNoRGF0YSA9IHtcbiAgICBzdGFydDogbnVsbCxcbiAgICBjYXB0dXJlOiBmYWxzZSxcbiAgICAvLyBUaGVzZSAzIGZpZWxkcyByZWxhdGVkIHRvIHRhcCwgdGFwaG9sZCBldmVudHNcbiAgICBzdGFydFBvc2l0aW9uOiBbbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbF0sXG4gICAgc2luZ2xlVG91Y2hTdGFydFRpbWU6IG51bGwsXG4gICAgc2luZ2xlVG91Y2hNb3ZlZDogdHJ1ZSxcbiAgICBub3c6IFtudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsXSxcbiAgICBlYXJsaWVyOiBbbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbF1cbiAgfTtcbiAgci5yZWRyYXdzID0gMDtcbiAgci5zaG93RnBzID0gb3B0aW9ucy5zaG93RnBzO1xuICByLmRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcbiAgci5oaWRlRWRnZXNPblZpZXdwb3J0ID0gb3B0aW9ucy5oaWRlRWRnZXNPblZpZXdwb3J0O1xuICByLnRleHR1cmVPblZpZXdwb3J0ID0gb3B0aW9ucy50ZXh0dXJlT25WaWV3cG9ydDtcbiAgci53aGVlbFNlbnNpdGl2aXR5ID0gb3B0aW9ucy53aGVlbFNlbnNpdGl2aXR5O1xuICByLm1vdGlvbkJsdXJFbmFibGVkID0gb3B0aW9ucy5tb3Rpb25CbHVyOyAvLyBvbiBieSBkZWZhdWx0XG4gIHIuZm9yY2VkUGl4ZWxSYXRpbyA9IG51bWJlciQxKG9wdGlvbnMucGl4ZWxSYXRpbykgPyBvcHRpb25zLnBpeGVsUmF0aW8gOiBudWxsO1xuICByLm1vdGlvbkJsdXIgPSBvcHRpb25zLm1vdGlvbkJsdXI7IC8vIGZvciBpbml0aWFsIGtpY2sgb2ZmXG4gIHIubW90aW9uQmx1ck9wYWNpdHkgPSBvcHRpb25zLm1vdGlvbkJsdXJPcGFjaXR5O1xuICByLm1vdGlvbkJsdXJUcmFuc3BhcmVuY3kgPSAxIC0gci5tb3Rpb25CbHVyT3BhY2l0eTtcbiAgci5tb3Rpb25CbHVyUHhSYXRpbyA9IDE7XG4gIHIubWJQeFJCbHVycnkgPSAxOyAvLzAuODtcbiAgci5taW5NYkxvd1F1YWxGcmFtZXMgPSA0O1xuICByLmZ1bGxRdWFsaXR5TWIgPSBmYWxzZTtcbiAgci5jbGVhcmVkRm9yTW90aW9uQmx1ciA9IFtdO1xuICByLmRlc2t0b3BUYXBUaHJlc2hvbGQgPSBvcHRpb25zLmRlc2t0b3BUYXBUaHJlc2hvbGQ7XG4gIHIuZGVza3RvcFRhcFRocmVzaG9sZDIgPSBvcHRpb25zLmRlc2t0b3BUYXBUaHJlc2hvbGQgKiBvcHRpb25zLmRlc2t0b3BUYXBUaHJlc2hvbGQ7XG4gIHIudG91Y2hUYXBUaHJlc2hvbGQgPSBvcHRpb25zLnRvdWNoVGFwVGhyZXNob2xkO1xuICByLnRvdWNoVGFwVGhyZXNob2xkMiA9IG9wdGlvbnMudG91Y2hUYXBUaHJlc2hvbGQgKiBvcHRpb25zLnRvdWNoVGFwVGhyZXNob2xkO1xuICByLnRhcGhvbGREdXJhdGlvbiA9IDUwMDtcbiAgci5iaW5kaW5ncyA9IFtdO1xuICByLmJlZm9yZVJlbmRlckNhbGxiYWNrcyA9IFtdO1xuICByLmJlZm9yZVJlbmRlclByaW9yaXRpZXMgPSB7XG4gICAgLy8gaGlnaGVyIHByaW9yaXR5IGV4ZWNzIGJlZm9yZSBsb3dlciBvbmVcbiAgICBhbmltYXRpb25zOiA0MDAsXG4gICAgZWxlQ2FsY3M6IDMwMCxcbiAgICBlbGVUeHJEZXE6IDIwMCxcbiAgICBseXJUeHJEZXE6IDE1MCxcbiAgICBseXJUeHJTa2lwOiAxMDBcbiAgfTtcbiAgci5yZWdpc3Rlck5vZGVTaGFwZXMoKTtcbiAgci5yZWdpc3RlckFycm93U2hhcGVzKCk7XG4gIHIucmVnaXN0ZXJDYWxjdWxhdGlvbkxpc3RlbmVycygpO1xufTtcbkJScC5ub3RpZnkgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBlbGVzKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGN5ID0gci5jeTtcblxuICAvLyB0aGUgcmVuZGVyZXIgY2FuJ3QgYmUgbm90aWZpZWQgYWZ0ZXIgaXQncyBkZXN0cm95ZWRcbiAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChldmVudE5hbWUgPT09ICdpbml0Jykge1xuICAgIHIubG9hZCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZXZlbnROYW1lID09PSAnZGVzdHJveScpIHtcbiAgICByLmRlc3Ryb3koKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGV2ZW50TmFtZSA9PT0gJ2FkZCcgfHwgZXZlbnROYW1lID09PSAncmVtb3ZlJyB8fCBldmVudE5hbWUgPT09ICdtb3ZlJyAmJiBjeS5oYXNDb21wb3VuZE5vZGVzKCkgfHwgZXZlbnROYW1lID09PSAnbG9hZCcgfHwgZXZlbnROYW1lID09PSAnem9yZGVyJyB8fCBldmVudE5hbWUgPT09ICdtb3VudCcpIHtcbiAgICByLmludmFsaWRhdGVDYWNoZWRaU29ydGVkRWxlcygpO1xuICB9XG4gIGlmIChldmVudE5hbWUgPT09ICd2aWV3cG9ydCcpIHtcbiAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICB9XG4gIGlmIChldmVudE5hbWUgPT09ICdsb2FkJyB8fCBldmVudE5hbWUgPT09ICdyZXNpemUnIHx8IGV2ZW50TmFtZSA9PT0gJ21vdW50Jykge1xuICAgIHIuaW52YWxpZGF0ZUNvbnRhaW5lckNsaWVudENvb3Jkc0NhY2hlKCk7XG4gICAgci5tYXRjaENhbnZhc1NpemUoci5jb250YWluZXIpO1xuICB9XG4gIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgdGhpcy5zdGFydFJlbmRlckxvb3AoKTtcbiAgdGhpcy5yZWRyYXcoKTtcbn07XG5CUnAuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICByLmRlc3Ryb3llZCA9IHRydWU7XG4gIHIuY3kuc3RvcEFuaW1hdGlvbkxvb3AoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByLmJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGJpbmRpbmcgPSByLmJpbmRpbmdzW2ldO1xuICAgIHZhciBiID0gYmluZGluZztcbiAgICB2YXIgdGd0ID0gYi50YXJnZXQ7XG4gICAgKHRndC5vZmYgfHwgdGd0LnJlbW92ZUV2ZW50TGlzdGVuZXIpLmFwcGx5KHRndCwgYi5hcmdzKTtcbiAgfVxuICByLmJpbmRpbmdzID0gW107XG4gIHIuYmVmb3JlUmVuZGVyQ2FsbGJhY2tzID0gW107XG4gIHIub25VcGRhdGVFbGVDYWxjc0ZucyA9IFtdO1xuICBpZiAoci5yZW1vdmVPYnNlcnZlcikge1xuICAgIHIucmVtb3ZlT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICB9XG4gIGlmIChyLnN0eWxlT2JzZXJ2ZXIpIHtcbiAgICByLnN0eWxlT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICB9XG4gIGlmIChyLnJlc2l6ZU9ic2VydmVyKSB7XG4gICAgci5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gIH1cbiAgaWYgKHIubGFiZWxDYWxjRGl2KSB7XG4gICAgdHJ5IHtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoci5sYWJlbENhbGNEaXYpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gaWUxMCBpc3N1ZSAjMTAxNFxuICAgIH1cbiAgfVxufTtcbkJScC5pc0hlYWRsZXNzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZmFsc2U7XG59O1xuW0JScCRmLCBCUnAkNSwgQlJwJDQsIEJScCQzLCBCUnAkMiwgQlJwJDFdLmZvckVhY2goZnVuY3Rpb24gKHByb3BzKSB7XG4gIGV4dGVuZChCUnAsIHByb3BzKTtcbn0pO1xuXG52YXIgZnVsbEZwc1RpbWUgPSAxMDAwIC8gNjA7IC8vIGFzc3VtZSA2MCBmcmFtZXMgcGVyIHNlY29uZFxuXG52YXIgZGVmcyA9IHtcbiAgc2V0dXBEZXF1ZXVlaW5nOiBmdW5jdGlvbiBzZXR1cERlcXVldWVpbmcob3B0cykge1xuICAgIHJldHVybiBmdW5jdGlvbiBzZXR1cERlcXVldWVpbmdJbXBsKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHIgPSB0aGlzLnJlbmRlcmVyO1xuICAgICAgaWYgKHNlbGYuZGVxdWV1ZWluZ1NldHVwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYuZGVxdWV1ZWluZ1NldHVwID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBxdWV1ZVJlZHJhdyA9IGRlYm91bmNlX19kZWZhdWx0W1wiZGVmYXVsdFwiXShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgIH0sIG9wdHMuZGVxUmVkcmF3VGhyZXNob2xkKTtcbiAgICAgIHZhciBkZXF1ZXVlID0gZnVuY3Rpb24gZGVxdWV1ZSh3aWxsRHJhdywgZnJhbWVTdGFydFRpbWUpIHtcbiAgICAgICAgdmFyIHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gICAgICAgIHZhciBhdmdSZW5kZXJUaW1lID0gci5hdmVyYWdlUmVkcmF3VGltZTtcbiAgICAgICAgdmFyIHJlbmRlclRpbWUgPSByLmxhc3RSZWRyYXdUaW1lO1xuICAgICAgICB2YXIgZGVxZCA9IFtdO1xuICAgICAgICB2YXIgZXh0ZW50ID0gci5jeS5leHRlbnQoKTtcbiAgICAgICAgdmFyIHBpeGVsUmF0aW8gPSByLmdldFBpeGVsUmF0aW8oKTtcblxuICAgICAgICAvLyBpZiB3ZSBhcmVuJ3QgaW4gYSB0aWNrIHRoYXQgY2F1c2VzIGEgZHJhdywgdGhlbiB0aGUgcmVuZGVyZWQgc3R5bGVcbiAgICAgICAgLy8gcXVldWUgd29uJ3QgYXV0b21hdGljYWxseSBiZSBmbHVzaGVkIGJlZm9yZSBkZXF1ZXVlaW5nIHN0YXJ0c1xuICAgICAgICBpZiAoIXdpbGxEcmF3KSB7XG4gICAgICAgICAgci5mbHVzaFJlbmRlcmVkU3R5bGVRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgICAgICAgICB2YXIgbm93ID0gcGVyZm9ybWFuY2VOb3coKTtcbiAgICAgICAgICB2YXIgZHVyYXRpb24gPSBub3cgLSBzdGFydFRpbWU7XG4gICAgICAgICAgdmFyIGZyYW1lRHVyYXRpb24gPSBub3cgLSBmcmFtZVN0YXJ0VGltZTtcbiAgICAgICAgICBpZiAocmVuZGVyVGltZSA8IGZ1bGxGcHNUaW1lKSB7XG4gICAgICAgICAgICAvLyBpZiB3ZSdyZSByZW5kZXJpbmcgZmFzdGVyIHRoYW4gdGhlIGlkZWFsIGZwcywgdGhlbiBkbyBkZXF1ZXVlaW5nXG4gICAgICAgICAgICAvLyBkdXJpbmcgYWxsIG9mIHRoZSByZW1haW5pbmcgZnJhbWUgdGltZVxuXG4gICAgICAgICAgICB2YXIgdGltZUF2YWlsYWJsZSA9IGZ1bGxGcHNUaW1lIC0gKHdpbGxEcmF3ID8gYXZnUmVuZGVyVGltZSA6IDApO1xuICAgICAgICAgICAgaWYgKGZyYW1lRHVyYXRpb24gPj0gb3B0cy5kZXFGYXN0Q29zdCAqIHRpbWVBdmFpbGFibGUpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh3aWxsRHJhdykge1xuICAgICAgICAgICAgICBpZiAoZHVyYXRpb24gPj0gb3B0cy5kZXFDb3N0ICogcmVuZGVyVGltZSB8fCBkdXJhdGlvbiA+PSBvcHRzLmRlcUF2Z0Nvc3QgKiBhdmdSZW5kZXJUaW1lKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJhbWVEdXJhdGlvbiA+PSBvcHRzLmRlcU5vRHJhd0Nvc3QgKiBmdWxsRnBzVGltZSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHRoaXNEZXFkID0gb3B0cy5kZXEoc2VsZiwgcGl4ZWxSYXRpbywgZXh0ZW50KTtcbiAgICAgICAgICBpZiAodGhpc0RlcWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzRGVxZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBkZXFkLnB1c2godGhpc0RlcWRbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjYWxsYmFja3Mgb24gZGVxdWV1ZVxuICAgICAgICBpZiAoZGVxZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgb3B0cy5vbkRlcWQoc2VsZiwgZGVxZCk7XG4gICAgICAgICAgaWYgKCF3aWxsRHJhdyAmJiBvcHRzLnNob3VsZFJlZHJhdyhzZWxmLCBkZXFkLCBwaXhlbFJhdGlvLCBleHRlbnQpKSB7XG4gICAgICAgICAgICBxdWV1ZVJlZHJhdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBwcmlvcml0eSA9IG9wdHMucHJpb3JpdHkgfHwgbm9vcCQxO1xuICAgICAgci5iZWZvcmVSZW5kZXIoZGVxdWV1ZSwgcHJpb3JpdHkoc2VsZikpO1xuICAgIH07XG4gIH1cbn07XG5cbi8vIEFsbG93cyBsb29rdXBzIGZvciAoZWxlLCBsdmwpID0+IGNhY2hlLlxuLy8gVXNlcyBrZXlzIHNvIGVsZW1lbnRzIG1heSBzaGFyZSB0aGUgc2FtZSBjYWNoZS5cbnZhciBFbGVtZW50VGV4dHVyZUNhY2hlTG9va3VwID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRWxlbWVudFRleHR1cmVDYWNoZUxvb2t1cChnZXRLZXkpIHtcbiAgICB2YXIgZG9lc0VsZUludmFsaWRhdGVLZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNpZnk7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEVsZW1lbnRUZXh0dXJlQ2FjaGVMb29rdXApO1xuICAgIHRoaXMuaWRzQnlLZXkgPSBuZXcgTWFwJDEoKTtcbiAgICB0aGlzLmtleUZvcklkID0gbmV3IE1hcCQxKCk7XG4gICAgdGhpcy5jYWNoZXNCeUx2bCA9IG5ldyBNYXAkMSgpO1xuICAgIHRoaXMubHZscyA9IFtdO1xuICAgIHRoaXMuZ2V0S2V5ID0gZ2V0S2V5O1xuICAgIHRoaXMuZG9lc0VsZUludmFsaWRhdGVLZXkgPSBkb2VzRWxlSW52YWxpZGF0ZUtleTtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoRWxlbWVudFRleHR1cmVDYWNoZUxvb2t1cCwgW3tcbiAgICBrZXk6IFwiZ2V0SWRzRm9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldElkc0ZvcihrZXkpIHtcbiAgICAgIGlmIChrZXkgPT0gbnVsbCkge1xuICAgICAgICBlcnJvcihcIkNhbiBub3QgZ2V0IGlkIGxpc3QgZm9yIG51bGwga2V5XCIpO1xuICAgICAgfVxuICAgICAgdmFyIGlkc0J5S2V5ID0gdGhpcy5pZHNCeUtleTtcbiAgICAgIHZhciBpZHMgPSB0aGlzLmlkc0J5S2V5LmdldChrZXkpO1xuICAgICAgaWYgKCFpZHMpIHtcbiAgICAgICAgaWRzID0gbmV3IFNldCQxKCk7XG4gICAgICAgIGlkc0J5S2V5LnNldChrZXksIGlkcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaWRzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRJZEZvcktleVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRJZEZvcktleShrZXksIGlkKSB7XG4gICAgICBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5nZXRJZHNGb3Ioa2V5KS5hZGQoaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZWxldGVJZEZvcktleVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWxldGVJZEZvcktleShrZXksIGlkKSB7XG4gICAgICBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5nZXRJZHNGb3Ioa2V5KVtcImRlbGV0ZVwiXShpZCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldE51bWJlck9mSWRzRm9yS2V5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE51bWJlck9mSWRzRm9yS2V5KGtleSkge1xuICAgICAgaWYgKGtleSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SWRzRm9yKGtleSkuc2l6ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXBkYXRlS2V5TWFwcGluZ0ZvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVLZXlNYXBwaW5nRm9yKGVsZSkge1xuICAgICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgICB2YXIgcHJldktleSA9IHRoaXMua2V5Rm9ySWQuZ2V0KGlkKTtcbiAgICAgIHZhciBjdXJyS2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgICAgIHRoaXMuZGVsZXRlSWRGb3JLZXkocHJldktleSwgaWQpO1xuICAgICAgdGhpcy5hZGRJZEZvcktleShjdXJyS2V5LCBpZCk7XG4gICAgICB0aGlzLmtleUZvcklkLnNldChpZCwgY3VycktleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZUtleU1hcHBpbmdGb3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVsZXRlS2V5TWFwcGluZ0ZvcihlbGUpIHtcbiAgICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuICAgICAgdmFyIHByZXZLZXkgPSB0aGlzLmtleUZvcklkLmdldChpZCk7XG4gICAgICB0aGlzLmRlbGV0ZUlkRm9yS2V5KHByZXZLZXksIGlkKTtcbiAgICAgIHRoaXMua2V5Rm9ySWRbXCJkZWxldGVcIl0oaWQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJrZXlIYXNDaGFuZ2VkRm9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGtleUhhc0NoYW5nZWRGb3IoZWxlKSB7XG4gICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICAgIHZhciBwcmV2S2V5ID0gdGhpcy5rZXlGb3JJZC5nZXQoaWQpO1xuICAgICAgdmFyIG5ld0tleSA9IHRoaXMuZ2V0S2V5KGVsZSk7XG4gICAgICByZXR1cm4gcHJldktleSAhPT0gbmV3S2V5O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc0ludmFsaWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNJbnZhbGlkKGVsZSkge1xuICAgICAgcmV0dXJuIHRoaXMua2V5SGFzQ2hhbmdlZEZvcihlbGUpIHx8IHRoaXMuZG9lc0VsZUludmFsaWRhdGVLZXkoZWxlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q2FjaGVzQXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q2FjaGVzQXQobHZsKSB7XG4gICAgICB2YXIgY2FjaGVzQnlMdmwgPSB0aGlzLmNhY2hlc0J5THZsLFxuICAgICAgICBsdmxzID0gdGhpcy5sdmxzO1xuICAgICAgdmFyIGNhY2hlcyA9IGNhY2hlc0J5THZsLmdldChsdmwpO1xuICAgICAgaWYgKCFjYWNoZXMpIHtcbiAgICAgICAgY2FjaGVzID0gbmV3IE1hcCQxKCk7XG4gICAgICAgIGNhY2hlc0J5THZsLnNldChsdmwsIGNhY2hlcyk7XG4gICAgICAgIGx2bHMucHVzaChsdmwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNhY2hlcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q2FjaGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q2FjaGUoa2V5LCBsdmwpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldENhY2hlc0F0KGx2bCkuZ2V0KGtleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoZWxlLCBsdmwpIHtcbiAgICAgIHZhciBrZXkgPSB0aGlzLmdldEtleShlbGUpO1xuICAgICAgdmFyIGNhY2hlID0gdGhpcy5nZXRDYWNoZShrZXksIGx2bCk7XG5cbiAgICAgIC8vIGdldHRpbmcgZm9yIGFuIGVsZW1lbnQgbWF5IG5lZWQgdG8gYWRkIHRvIHRoZSBpZCBsaXN0IGIvYyBlbGVzIGNhbiBzaGFyZSBrZXlzXG4gICAgICBpZiAoY2FjaGUgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUtleU1hcHBpbmdGb3IoZWxlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjYWNoZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Rm9yQ2FjaGVkS2V5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEZvckNhY2hlZEtleShlbGUsIGx2bCkge1xuICAgICAgdmFyIGtleSA9IHRoaXMua2V5Rm9ySWQuZ2V0KGVsZS5pZCgpKTsgLy8gbi5iLiB1c2UgY2FjaGVkIGtleSwgbm90IG5ld2x5IGNvbXB1dGVkIGtleVxuICAgICAgdmFyIGNhY2hlID0gdGhpcy5nZXRDYWNoZShrZXksIGx2bCk7XG4gICAgICByZXR1cm4gY2FjaGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc0NhY2hlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhc0NhY2hlKGtleSwgbHZsKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDYWNoZXNBdChsdmwpLmhhcyhrZXkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzKGVsZSwgbHZsKSB7XG4gICAgICB2YXIga2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgICAgIHJldHVybiB0aGlzLmhhc0NhY2hlKGtleSwgbHZsKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Q2FjaGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Q2FjaGUoa2V5LCBsdmwsIGNhY2hlKSB7XG4gICAgICBjYWNoZS5rZXkgPSBrZXk7XG4gICAgICB0aGlzLmdldENhY2hlc0F0KGx2bCkuc2V0KGtleSwgY2FjaGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0KGVsZSwgbHZsLCBjYWNoZSkge1xuICAgICAgdmFyIGtleSA9IHRoaXMuZ2V0S2V5KGVsZSk7XG4gICAgICB0aGlzLnNldENhY2hlKGtleSwgbHZsLCBjYWNoZSk7XG4gICAgICB0aGlzLnVwZGF0ZUtleU1hcHBpbmdGb3IoZWxlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlQ2FjaGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVsZXRlQ2FjaGUoa2V5LCBsdmwpIHtcbiAgICAgIHRoaXMuZ2V0Q2FjaGVzQXQobHZsKVtcImRlbGV0ZVwiXShrZXkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZWxldGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2RlbGV0ZShlbGUsIGx2bCkge1xuICAgICAgdmFyIGtleSA9IHRoaXMuZ2V0S2V5KGVsZSk7XG4gICAgICB0aGlzLmRlbGV0ZUNhY2hlKGtleSwgbHZsKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW52YWxpZGF0ZUtleVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnZhbGlkYXRlS2V5KGtleSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgIHRoaXMubHZscy5mb3JFYWNoKGZ1bmN0aW9uIChsdmwpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmRlbGV0ZUNhY2hlKGtleSwgbHZsKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHJldHVybnMgdHJ1ZSBpZiBubyBvdGhlciBlbGVzIHJlZmVyZW5jZSB0aGUgaW52YWxpZGF0ZWQgY2FjaGUgKG4uYi4gb3RoZXIgZWxlcyBtYXkgbmVlZCB0aGUgY2FjaGUgd2l0aCB0aGUgc2FtZSBrZXkpXG4gIH0sIHtcbiAgICBrZXk6IFwiaW52YWxpZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnZhbGlkYXRlKGVsZSkge1xuICAgICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgICB2YXIga2V5ID0gdGhpcy5rZXlGb3JJZC5nZXQoaWQpOyAvLyBuLmIuIHVzZSBzdG9yZWQga2V5IHJhdGhlciB0aGFuIGN1cnJlbnQgKHBvdGVudGlhbCBrZXkpXG5cbiAgICAgIHRoaXMuZGVsZXRlS2V5TWFwcGluZ0ZvcihlbGUpO1xuICAgICAgdmFyIGVudGlyZUtleUludmFsaWRhdGVkID0gdGhpcy5kb2VzRWxlSW52YWxpZGF0ZUtleShlbGUpO1xuICAgICAgaWYgKGVudGlyZUtleUludmFsaWRhdGVkKSB7XG4gICAgICAgIC8vIGNsZWFyIG1hcHBpbmcgZm9yIGN1cnJlbnQga2V5XG4gICAgICAgIHRoaXMuaW52YWxpZGF0ZUtleShrZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVudGlyZUtleUludmFsaWRhdGVkIHx8IHRoaXMuZ2V0TnVtYmVyT2ZJZHNGb3JLZXkoa2V5KSA9PT0gMDtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIEVsZW1lbnRUZXh0dXJlQ2FjaGVMb29rdXA7XG59KCk7XG5cbnZhciBtaW5UeHJIID0gMjU7IC8vIHRoZSBzaXplIG9mIHRoZSB0ZXh0dXJlIGNhY2hlIGZvciBzbWFsbCBoZWlnaHQgZWxlcyAoc3BlY2lhbCBjYXNlKVxudmFyIHR4clN0ZXBIID0gNTA7IC8vIHRoZSBtaW4gc2l6ZSBvZiB0aGUgcmVndWxhciBjYWNoZSwgYW5kIHRoZSBzaXplIGl0IGluY3JlYXNlcyB3aXRoIGVhY2ggc3RlcCB1cFxudmFyIG1pbkx2bCQxID0gLTQ7IC8vIHdoZW4gc2NhbGluZyBzbWFsbGVyIHRoYW4gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIHJlLXJlbmRlclxudmFyIG1heEx2bCQxID0gMzsgLy8gd2hlbiBsYXJnZXIgdGhhbiB0aGlzIHNjYWxlIGp1c3QgcmVuZGVyIGRpcmVjdGx5IChjYWNoaW5nIGlzIG5vdCBoZWxwZnVsKVxudmFyIG1heFpvb20kMSA9IDcuOTk7IC8vIGJleW9uZCB0aGlzIHpvb20gbGV2ZWwsIGxheWVyZWQgdGV4dHVyZXMgYXJlIG5vdCB1c2VkXG52YXIgZWxlVHhyU3BhY2luZyA9IDg7IC8vIHNwYWNpbmcgYmV0d2VlbiBlbGVtZW50cyBvbiB0ZXh0dXJlcyB0byBhdm9pZCBibGl0dGluZyBvdmVybGFwc1xudmFyIGRlZlR4cldpZHRoID0gMTAyNDsgLy8gZGVmYXVsdC9taW5pbXVtIHRleHR1cmUgd2lkdGhcbnZhciBtYXhUeHJXID0gMTAyNDsgLy8gdGhlIG1heGltdW0gd2lkdGggb2YgYSB0ZXh0dXJlXG52YXIgbWF4VHhySCA9IDEwMjQ7IC8vIHRoZSBtYXhpbXVtIGhlaWdodCBvZiBhIHRleHR1cmVcbnZhciBtaW5VdGlsaXR5ID0gMC4yOyAvLyBpZiB1c2FnZSBvZiB0ZXh0dXJlIGlzIGxlc3MgdGhhbiB0aGlzLCBpdCBpcyByZXRpcmVkXG52YXIgbWF4RnVsbG5lc3MgPSAwLjg7IC8vIGZ1bGxuZXNzIG9mIHRleHR1cmUgYWZ0ZXIgd2hpY2ggcXVldWUgcmVtb3ZhbCBpcyBjaGVja2VkXG52YXIgbWF4RnVsbG5lc3NDaGVja3MgPSAxMDsgLy8gZGVxdWV1ZWQgYWZ0ZXIgdGhpcyBtYW55IGNoZWNrc1xudmFyIGRlcUNvc3QkMSA9IDAuMTU7IC8vICUgb2YgYWRkJ2wgcmVuZGVyaW5nIGNvc3QgYWxsb3dlZCBmb3IgZGVxdWV1aW5nIGVsZSBjYWNoZXMgZWFjaCBmcmFtZVxudmFyIGRlcUF2Z0Nvc3QkMSA9IDAuMTsgLy8gJSBvZiBhZGQnbCByZW5kZXJpbmcgY29zdCBjb21wYXJlZCB0byBhdmVyYWdlIG92ZXJhbGwgcmVkcmF3IHRpbWVcbnZhciBkZXFOb0RyYXdDb3N0JDEgPSAwLjk7IC8vICUgb2YgYXZnIGZyYW1lIHRpbWUgdGhhdCBjYW4gYmUgdXNlZCBmb3IgZGVxdWV1ZWluZyB3aGVuIG5vdCBkcmF3aW5nXG52YXIgZGVxRmFzdENvc3QkMSA9IDAuOTsgLy8gJSBvZiBmcmFtZSB0aW1lIHRvIGJlIHVzZWQgd2hlbiA+NjBmcHNcbnZhciBkZXFSZWRyYXdUaHJlc2hvbGQkMSA9IDEwMDsgLy8gdGltZSB0byBiYXRjaCByZWRyYXdzIHRvZ2V0aGVyIGZyb20gZGVxdWV1ZWluZyB0byBhbGxvdyBtb3JlIGRlcXVldWVpbmcgY2FsY3MgdG8gaGFwcGVuIGluIHRoZSBtZWFud2hpbGVcbnZhciBtYXhEZXFTaXplJDEgPSAxOyAvLyBudW1iZXIgb2YgZWxlcyB0byBkZXF1ZXVlIGFuZCByZW5kZXIgYXQgaGlnaGVyIHRleHR1cmUgaW4gZWFjaCBiYXRjaFxuXG52YXIgZ2V0VHhyUmVhc29ucyA9IHtcbiAgZGVxdWV1ZTogJ2RlcXVldWUnLFxuICBkb3duc2NhbGU6ICdkb3duc2NhbGUnLFxuICBoaWdoUXVhbGl0eTogJ2hpZ2hRdWFsaXR5J1xufTtcbnZhciBpbml0RGVmYXVsdHMgPSBkZWZhdWx0cyRnKHtcbiAgZ2V0S2V5OiBudWxsLFxuICBkb2VzRWxlSW52YWxpZGF0ZUtleTogZmFsc2lmeSxcbiAgZHJhd0VsZW1lbnQ6IG51bGwsXG4gIGdldEJvdW5kaW5nQm94OiBudWxsLFxuICBnZXRSb3RhdGlvblBvaW50OiBudWxsLFxuICBnZXRSb3RhdGlvbk9mZnNldDogbnVsbCxcbiAgaXNWaXNpYmxlOiB0cnVlaWZ5LFxuICBhbGxvd0VkZ2VUeHJDYWNoaW5nOiB0cnVlLFxuICBhbGxvd1BhcmVudFR4ckNhY2hpbmc6IHRydWVcbn0pO1xudmFyIEVsZW1lbnRUZXh0dXJlQ2FjaGUgPSBmdW5jdGlvbiBFbGVtZW50VGV4dHVyZUNhY2hlKHJlbmRlcmVyLCBpbml0T3B0aW9ucykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgc2VsZi5vbkRlcXVldWVzID0gW107XG4gIHZhciBvcHRzID0gaW5pdERlZmF1bHRzKGluaXRPcHRpb25zKTtcbiAgZXh0ZW5kKHNlbGYsIG9wdHMpO1xuICBzZWxmLmxvb2t1cCA9IG5ldyBFbGVtZW50VGV4dHVyZUNhY2hlTG9va3VwKG9wdHMuZ2V0S2V5LCBvcHRzLmRvZXNFbGVJbnZhbGlkYXRlS2V5KTtcbiAgc2VsZi5zZXR1cERlcXVldWVpbmcoKTtcbn07XG52YXIgRVRDcCA9IEVsZW1lbnRUZXh0dXJlQ2FjaGUucHJvdG90eXBlO1xuRVRDcC5yZWFzb25zID0gZ2V0VHhyUmVhc29ucztcblxuLy8gdGhlIGxpc3Qgb2YgdGV4dHVyZXMgaW4gd2hpY2ggbmV3IHN1YnRleHR1cmVzIGZvciBlbGVtZW50cyBjYW4gYmUgcGxhY2VkXG5FVENwLmdldFRleHR1cmVRdWV1ZSA9IGZ1bmN0aW9uICh0eHJIKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5lbGVJbWdDYWNoZXMgPSBzZWxmLmVsZUltZ0NhY2hlcyB8fCB7fTtcbiAgcmV0dXJuIHNlbGYuZWxlSW1nQ2FjaGVzW3R4ckhdID0gc2VsZi5lbGVJbWdDYWNoZXNbdHhySF0gfHwgW107XG59O1xuXG4vLyB0aGUgbGlzdCBvZiB1c3VzZWQgdGV4dHVyZXMgd2hpY2ggY2FuIGJlIHJlY3ljbGVkIChpbiB1c2UgaW4gdGV4dHVyZSBxdWV1ZSlcbkVUQ3AuZ2V0UmV0aXJlZFRleHR1cmVRdWV1ZSA9IGZ1bmN0aW9uICh0eHJIKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHJ0eHRyUXMgPSBzZWxmLmVsZUltZ0NhY2hlcy5yZXRpcmVkID0gc2VsZi5lbGVJbWdDYWNoZXMucmV0aXJlZCB8fCB7fTtcbiAgdmFyIHJ0eHRyUSA9IHJ0eHRyUXNbdHhySF0gPSBydHh0clFzW3R4ckhdIHx8IFtdO1xuICByZXR1cm4gcnR4dHJRO1xufTtcblxuLy8gcXVldWUgb2YgZWxlbWVudCBkcmF3IHJlcXVlc3RzIGF0IGRpZmZlcmVudCBzY2FsZSBsZXZlbHNcbkVUQ3AuZ2V0RWxlbWVudFF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBxID0gc2VsZi5lbGVDYWNoZVF1ZXVlID0gc2VsZi5lbGVDYWNoZVF1ZXVlIHx8IG5ldyBIZWFwX19kZWZhdWx0W1wiZGVmYXVsdFwiXShmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLnJlcXMgLSBhLnJlcXM7XG4gIH0pO1xuICByZXR1cm4gcTtcbn07XG5cbi8vIHF1ZXVlIG9mIGVsZW1lbnQgZHJhdyByZXF1ZXN0cyBhdCBkaWZmZXJlbnQgc2NhbGUgbGV2ZWxzIChlbGVtZW50IGlkIGxvb2t1cClcbkVUQ3AuZ2V0RWxlbWVudEtleVRvUXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGsycSA9IHNlbGYuZWxlS2V5VG9DYWNoZVF1ZXVlID0gc2VsZi5lbGVLZXlUb0NhY2hlUXVldWUgfHwge307XG4gIHJldHVybiBrMnE7XG59O1xuRVRDcC5nZXRFbGVtZW50ID0gZnVuY3Rpb24gKGVsZSwgYmIsIHB4UmF0aW8sIGx2bCwgcmVhc29uKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHIgPSB0aGlzLnJlbmRlcmVyO1xuICB2YXIgem9vbSA9IHIuY3kuem9vbSgpO1xuICB2YXIgbG9va3VwID0gdGhpcy5sb29rdXA7XG4gIGlmICghYmIgfHwgYmIudyA9PT0gMCB8fCBiYi5oID09PSAwIHx8IGlzTmFOKGJiLncpIHx8IGlzTmFOKGJiLmgpIHx8ICFlbGUudmlzaWJsZSgpIHx8IGVsZS5yZW1vdmVkKCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoIXNlbGYuYWxsb3dFZGdlVHhyQ2FjaGluZyAmJiBlbGUuaXNFZGdlKCkgfHwgIXNlbGYuYWxsb3dQYXJlbnRUeHJDYWNoaW5nICYmIGVsZS5pc1BhcmVudCgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGx2bCA9PSBudWxsKSB7XG4gICAgbHZsID0gTWF0aC5jZWlsKGxvZzIoem9vbSAqIHB4UmF0aW8pKTtcbiAgfVxuICBpZiAobHZsIDwgbWluTHZsJDEpIHtcbiAgICBsdmwgPSBtaW5MdmwkMTtcbiAgfSBlbHNlIGlmICh6b29tID49IG1heFpvb20kMSB8fCBsdmwgPiBtYXhMdmwkMSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBzY2FsZSA9IE1hdGgucG93KDIsIGx2bCk7XG4gIHZhciBlbGVTY2FsZWRIID0gYmIuaCAqIHNjYWxlO1xuICB2YXIgZWxlU2NhbGVkVyA9IGJiLncgKiBzY2FsZTtcbiAgdmFyIHNjYWxlZExhYmVsU2hvd24gPSByLmVsZVRleHRCaWdnZXJUaGFuTWluKGVsZSwgc2NhbGUpO1xuICBpZiAoIXRoaXMuaXNWaXNpYmxlKGVsZSwgc2NhbGVkTGFiZWxTaG93bikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgZWxlQ2FjaGUgPSBsb29rdXAuZ2V0KGVsZSwgbHZsKTtcblxuICAvLyBpZiB0aGlzIGdldCB3YXMgb24gYW4gdW51c2VkL2ludmFsaWRhdGVkIGNhY2hlLCB0aGVuIHJlc3RvcmUgdGhlIHRleHR1cmUgdXNhZ2UgbWV0cmljXG4gIGlmIChlbGVDYWNoZSAmJiBlbGVDYWNoZS5pbnZhbGlkYXRlZCkge1xuICAgIGVsZUNhY2hlLmludmFsaWRhdGVkID0gZmFsc2U7XG4gICAgZWxlQ2FjaGUudGV4dHVyZS5pbnZhbGlkYXRlZFdpZHRoIC09IGVsZUNhY2hlLndpZHRoO1xuICB9XG4gIGlmIChlbGVDYWNoZSkge1xuICAgIHJldHVybiBlbGVDYWNoZTtcbiAgfVxuICB2YXIgdHhySDsgLy8gd2hpY2ggdGV4dHVyZSBoZWlnaHQgdGhpcyBlbGUgYmVsb25ncyB0b1xuXG4gIGlmIChlbGVTY2FsZWRIIDw9IG1pblR4ckgpIHtcbiAgICB0eHJIID0gbWluVHhySDtcbiAgfSBlbHNlIGlmIChlbGVTY2FsZWRIIDw9IHR4clN0ZXBIKSB7XG4gICAgdHhySCA9IHR4clN0ZXBIO1xuICB9IGVsc2Uge1xuICAgIHR4ckggPSBNYXRoLmNlaWwoZWxlU2NhbGVkSCAvIHR4clN0ZXBIKSAqIHR4clN0ZXBIO1xuICB9XG4gIGlmIChlbGVTY2FsZWRIID4gbWF4VHhySCB8fCBlbGVTY2FsZWRXID4gbWF4VHhyVykge1xuICAgIHJldHVybiBudWxsOyAvLyBjYWNoaW5nIGxhcmdlIGVsZW1lbnRzIGlzIG5vdCBlZmZpY2llbnRcbiAgfVxuXG4gIHZhciB0eHJRID0gc2VsZi5nZXRUZXh0dXJlUXVldWUodHhySCk7XG5cbiAgLy8gZmlyc3QgdHJ5IHRoZSBzZWNvbmQgbGFzdCBvbmUgaW4gY2FzZSBpdCBoYXMgc3BhY2UgYXQgdGhlIGVuZFxuICB2YXIgdHhyID0gdHhyUVt0eHJRLmxlbmd0aCAtIDJdO1xuICB2YXIgYWRkTmV3VHhyID0gZnVuY3Rpb24gYWRkTmV3VHhyKCkge1xuICAgIHJldHVybiBzZWxmLnJlY3ljbGVUZXh0dXJlKHR4ckgsIGVsZVNjYWxlZFcpIHx8IHNlbGYuYWRkVGV4dHVyZSh0eHJILCBlbGVTY2FsZWRXKTtcbiAgfTtcblxuICAvLyB0cnkgdGhlIGxhc3Qgb25lIGlmIHRoZXJlIGlzIG5vIHNlY29uZCBsYXN0IG9uZVxuICBpZiAoIXR4cikge1xuICAgIHR4ciA9IHR4clFbdHhyUS5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIC8vIGlmIHRoZSBsYXN0IG9uZSBkb2Vzbid0IGV4aXN0LCB3ZSBuZWVkIGEgZmlyc3Qgb25lXG4gIGlmICghdHhyKSB7XG4gICAgdHhyID0gYWRkTmV3VHhyKCk7XG4gIH1cblxuICAvLyBpZiB0aGVyZSdzIG5vIHJvb20gaW4gdGhlIGN1cnJlbnQgdGV4dHVyZSwgd2UgbmVlZCBhIG5ldyBvbmVcbiAgaWYgKHR4ci53aWR0aCAtIHR4ci51c2VkV2lkdGggPCBlbGVTY2FsZWRXKSB7XG4gICAgdHhyID0gYWRkTmV3VHhyKCk7XG4gIH1cbiAgdmFyIHNjYWxhYmxlRnJvbSA9IGZ1bmN0aW9uIHNjYWxhYmxlRnJvbShvdGhlckNhY2hlKSB7XG4gICAgcmV0dXJuIG90aGVyQ2FjaGUgJiYgb3RoZXJDYWNoZS5zY2FsZWRMYWJlbFNob3duID09PSBzY2FsZWRMYWJlbFNob3duO1xuICB9O1xuICB2YXIgZGVxaW5nID0gcmVhc29uICYmIHJlYXNvbiA9PT0gZ2V0VHhyUmVhc29ucy5kZXF1ZXVlO1xuICB2YXIgaGlnaFF1YWxpdHlSZXEgPSByZWFzb24gJiYgcmVhc29uID09PSBnZXRUeHJSZWFzb25zLmhpZ2hRdWFsaXR5O1xuICB2YXIgZG93bnNjYWxlUmVxID0gcmVhc29uICYmIHJlYXNvbiA9PT0gZ2V0VHhyUmVhc29ucy5kb3duc2NhbGU7XG4gIHZhciBoaWdoZXJDYWNoZTsgLy8gdGhlIG5lYXJlc3QgY2FjaGUgd2l0aCBhIGhpZ2hlciBsZXZlbFxuICBmb3IgKHZhciBsID0gbHZsICsgMTsgbCA8PSBtYXhMdmwkMTsgbCsrKSB7XG4gICAgdmFyIGMgPSBsb29rdXAuZ2V0KGVsZSwgbCk7XG4gICAgaWYgKGMpIHtcbiAgICAgIGhpZ2hlckNhY2hlID0gYztcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICB2YXIgb25lVXBDYWNoZSA9IGhpZ2hlckNhY2hlICYmIGhpZ2hlckNhY2hlLmxldmVsID09PSBsdmwgKyAxID8gaGlnaGVyQ2FjaGUgOiBudWxsO1xuICB2YXIgZG93bnNjYWxlID0gZnVuY3Rpb24gZG93bnNjYWxlKCkge1xuICAgIHR4ci5jb250ZXh0LmRyYXdJbWFnZShvbmVVcENhY2hlLnRleHR1cmUuY2FudmFzLCBvbmVVcENhY2hlLngsIDAsIG9uZVVwQ2FjaGUud2lkdGgsIG9uZVVwQ2FjaGUuaGVpZ2h0LCB0eHIudXNlZFdpZHRoLCAwLCBlbGVTY2FsZWRXLCBlbGVTY2FsZWRIKTtcbiAgfTtcblxuICAvLyByZXNldCBlbGUgYXJlYSBpbiB0ZXh0dXJlXG4gIHR4ci5jb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgdHhyLmNvbnRleHQuY2xlYXJSZWN0KHR4ci51c2VkV2lkdGgsIDAsIGVsZVNjYWxlZFcsIHR4ckgpO1xuICBpZiAoc2NhbGFibGVGcm9tKG9uZVVwQ2FjaGUpKSB7XG4gICAgLy8gdGhlbiB3ZSBjYW4gcmVsYXRpdmVseSBjaGVhcGx5IHJlc2NhbGUgdGhlIGV4aXN0aW5nIGltYWdlIHcvbyByZXJlbmRlcmluZ1xuICAgIGRvd25zY2FsZSgpO1xuICB9IGVsc2UgaWYgKHNjYWxhYmxlRnJvbShoaWdoZXJDYWNoZSkpIHtcbiAgICAvLyB0aGVuIHVzZSB0aGUgaGlnaGVyIGNhY2hlIGZvciBub3cgYW5kIHF1ZXVlIHRoZSBuZXh0IGxldmVsIGRvd25cbiAgICAvLyB0byBjaGVhcGx5IHNjYWxlIHRvd2FyZHMgdGhlIHNtYWxsZXIgbGV2ZWxcblxuICAgIGlmIChoaWdoUXVhbGl0eVJlcSkge1xuICAgICAgZm9yICh2YXIgX2wgPSBoaWdoZXJDYWNoZS5sZXZlbDsgX2wgPiBsdmw7IF9sLS0pIHtcbiAgICAgICAgb25lVXBDYWNoZSA9IHNlbGYuZ2V0RWxlbWVudChlbGUsIGJiLCBweFJhdGlvLCBfbCwgZ2V0VHhyUmVhc29ucy5kb3duc2NhbGUpO1xuICAgICAgfVxuICAgICAgZG93bnNjYWxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYucXVldWVFbGVtZW50KGVsZSwgaGlnaGVyQ2FjaGUubGV2ZWwgLSAxKTtcbiAgICAgIHJldHVybiBoaWdoZXJDYWNoZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxvd2VyQ2FjaGU7IC8vIHRoZSBuZWFyZXN0IGNhY2hlIHdpdGggYSBsb3dlciBsZXZlbFxuICAgIGlmICghZGVxaW5nICYmICFoaWdoUXVhbGl0eVJlcSAmJiAhZG93bnNjYWxlUmVxKSB7XG4gICAgICBmb3IgKHZhciBfbDIgPSBsdmwgLSAxOyBfbDIgPj0gbWluTHZsJDE7IF9sMi0tKSB7XG4gICAgICAgIHZhciBfYyA9IGxvb2t1cC5nZXQoZWxlLCBfbDIpO1xuICAgICAgICBpZiAoX2MpIHtcbiAgICAgICAgICBsb3dlckNhY2hlID0gX2M7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNjYWxhYmxlRnJvbShsb3dlckNhY2hlKSkge1xuICAgICAgLy8gdGhlbiB1c2UgdGhlIGxvd2VyIHF1YWxpdHkgY2FjaGUgZm9yIG5vdyBhbmQgcXVldWUgdGhlIGJldHRlciBvbmUgZm9yIGxhdGVyXG5cbiAgICAgIHNlbGYucXVldWVFbGVtZW50KGVsZSwgbHZsKTtcbiAgICAgIHJldHVybiBsb3dlckNhY2hlO1xuICAgIH1cbiAgICB0eHIuY29udGV4dC50cmFuc2xhdGUodHhyLnVzZWRXaWR0aCwgMCk7XG4gICAgdHhyLmNvbnRleHQuc2NhbGUoc2NhbGUsIHNjYWxlKTtcbiAgICB0aGlzLmRyYXdFbGVtZW50KHR4ci5jb250ZXh0LCBlbGUsIGJiLCBzY2FsZWRMYWJlbFNob3duLCBmYWxzZSk7XG4gICAgdHhyLmNvbnRleHQuc2NhbGUoMSAvIHNjYWxlLCAxIC8gc2NhbGUpO1xuICAgIHR4ci5jb250ZXh0LnRyYW5zbGF0ZSgtdHhyLnVzZWRXaWR0aCwgMCk7XG4gIH1cbiAgZWxlQ2FjaGUgPSB7XG4gICAgeDogdHhyLnVzZWRXaWR0aCxcbiAgICB0ZXh0dXJlOiB0eHIsXG4gICAgbGV2ZWw6IGx2bCxcbiAgICBzY2FsZTogc2NhbGUsXG4gICAgd2lkdGg6IGVsZVNjYWxlZFcsXG4gICAgaGVpZ2h0OiBlbGVTY2FsZWRILFxuICAgIHNjYWxlZExhYmVsU2hvd246IHNjYWxlZExhYmVsU2hvd25cbiAgfTtcbiAgdHhyLnVzZWRXaWR0aCArPSBNYXRoLmNlaWwoZWxlU2NhbGVkVyArIGVsZVR4clNwYWNpbmcpO1xuICB0eHIuZWxlQ2FjaGVzLnB1c2goZWxlQ2FjaGUpO1xuICBsb29rdXAuc2V0KGVsZSwgbHZsLCBlbGVDYWNoZSk7XG4gIHNlbGYuY2hlY2tUZXh0dXJlRnVsbG5lc3ModHhyKTtcbiAgcmV0dXJuIGVsZUNhY2hlO1xufTtcbkVUQ3AuaW52YWxpZGF0ZUVsZW1lbnRzID0gZnVuY3Rpb24gKGVsZXMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5pbnZhbGlkYXRlRWxlbWVudChlbGVzW2ldKTtcbiAgfVxufTtcbkVUQ3AuaW52YWxpZGF0ZUVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGxvb2t1cCA9IHNlbGYubG9va3VwO1xuICB2YXIgY2FjaGVzID0gW107XG4gIHZhciBpbnZhbGlkID0gbG9va3VwLmlzSW52YWxpZChlbGUpO1xuICBpZiAoIWludmFsaWQpIHtcbiAgICByZXR1cm47IC8vIG92ZXJyaWRlIHRoZSBpbnZhbGlkYXRpb24gcmVxdWVzdCBpZiB0aGUgZWxlbWVudCBrZXkgaGFzIG5vdCBjaGFuZ2VkXG4gIH1cblxuICBmb3IgKHZhciBsdmwgPSBtaW5MdmwkMTsgbHZsIDw9IG1heEx2bCQxOyBsdmwrKykge1xuICAgIHZhciBjYWNoZSA9IGxvb2t1cC5nZXRGb3JDYWNoZWRLZXkoZWxlLCBsdmwpO1xuICAgIGlmIChjYWNoZSkge1xuICAgICAgY2FjaGVzLnB1c2goY2FjaGUpO1xuICAgIH1cbiAgfVxuICB2YXIgbm9PdGhlckVsZXNVc2VDYWNoZSA9IGxvb2t1cC5pbnZhbGlkYXRlKGVsZSk7XG4gIGlmIChub090aGVyRWxlc1VzZUNhY2hlKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBfY2FjaGUgPSBjYWNoZXNbaV07XG4gICAgICB2YXIgdHhyID0gX2NhY2hlLnRleHR1cmU7XG5cbiAgICAgIC8vIHJlbW92ZSBzcGFjZSBmcm9tIHRoZSB0ZXh0dXJlIGl0IGJlbG9uZ3MgdG9cbiAgICAgIHR4ci5pbnZhbGlkYXRlZFdpZHRoICs9IF9jYWNoZS53aWR0aDtcblxuICAgICAgLy8gbWFyayB0aGUgY2FjaGUgYXMgaW52YWxpZGF0ZWRcbiAgICAgIF9jYWNoZS5pbnZhbGlkYXRlZCA9IHRydWU7XG5cbiAgICAgIC8vIHJldGlyZSB0aGUgdGV4dHVyZSBpZiBpdHMgdXRpbGl0eSBpcyBsb3dcbiAgICAgIHNlbGYuY2hlY2tUZXh0dXJlVXRpbGl0eSh0eHIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlbW92ZSBmcm9tIHF1ZXVlIHNpbmNlIHRoZSBvbGQgcmVxIHdhcyBmb3IgdGhlIG9sZCBzdGF0ZVxuICBzZWxmLnJlbW92ZUZyb21RdWV1ZShlbGUpO1xufTtcbkVUQ3AuY2hlY2tUZXh0dXJlVXRpbGl0eSA9IGZ1bmN0aW9uICh0eHIpIHtcbiAgLy8gaW52YWxpZGF0ZSBhbGwgZW50cmllcyBpbiB0aGUgY2FjaGUgaWYgdGhlIGNhY2hlIHNpemUgaXMgc21hbGxcbiAgaWYgKHR4ci5pbnZhbGlkYXRlZFdpZHRoID49IG1pblV0aWxpdHkgKiB0eHIud2lkdGgpIHtcbiAgICB0aGlzLnJldGlyZVRleHR1cmUodHhyKTtcbiAgfVxufTtcbkVUQ3AuY2hlY2tUZXh0dXJlRnVsbG5lc3MgPSBmdW5jdGlvbiAodHhyKSB7XG4gIC8vIGlmIHRleHR1cmUgaGFzIGJlZW4gbW9zdGx5IGZpbGxlZCBhbmQgcGFzc2VkIG92ZXIgc2V2ZXJhbCB0aW1lcywgcmVtb3ZlXG4gIC8vIGl0IGZyb20gdGhlIHF1ZXVlIHNvIHdlIGRvbid0IG5lZWQgdG8gd2FzdGUgdGltZSBsb29raW5nIGF0IGl0IHRvIHB1dCBuZXcgdGhpbmdzXG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgdHhyUSA9IHNlbGYuZ2V0VGV4dHVyZVF1ZXVlKHR4ci5oZWlnaHQpO1xuICBpZiAodHhyLnVzZWRXaWR0aCAvIHR4ci53aWR0aCA+IG1heEZ1bGxuZXNzICYmIHR4ci5mdWxsbmVzc0NoZWNrcyA+PSBtYXhGdWxsbmVzc0NoZWNrcykge1xuICAgIHJlbW92ZUZyb21BcnJheSh0eHJRLCB0eHIpO1xuICB9IGVsc2Uge1xuICAgIHR4ci5mdWxsbmVzc0NoZWNrcysrO1xuICB9XG59O1xuRVRDcC5yZXRpcmVUZXh0dXJlID0gZnVuY3Rpb24gKHR4cikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0eHJIID0gdHhyLmhlaWdodDtcbiAgdmFyIHR4clEgPSBzZWxmLmdldFRleHR1cmVRdWV1ZSh0eHJIKTtcbiAgdmFyIGxvb2t1cCA9IHRoaXMubG9va3VwO1xuXG4gIC8vIHJldGlyZSB0aGUgdGV4dHVyZSBmcm9tIHRoZSBhY3RpdmUgLyBzZWFyY2hhYmxlIHF1ZXVlOlxuXG4gIHJlbW92ZUZyb21BcnJheSh0eHJRLCB0eHIpO1xuICB0eHIucmV0aXJlZCA9IHRydWU7XG5cbiAgLy8gcmVtb3ZlIHRoZSByZWZzIGZyb20gdGhlIGVsZXMgdG8gdGhlIGNhY2hlczpcblxuICB2YXIgZWxlQ2FjaGVzID0gdHhyLmVsZUNhY2hlcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVDYWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlQ2FjaGUgPSBlbGVDYWNoZXNbaV07XG4gICAgbG9va3VwLmRlbGV0ZUNhY2hlKGVsZUNhY2hlLmtleSwgZWxlQ2FjaGUubGV2ZWwpO1xuICB9XG4gIGNsZWFyQXJyYXkoZWxlQ2FjaGVzKTtcblxuICAvLyBhZGQgdGhlIHRleHR1cmUgdG8gYSByZXRpcmVkIHF1ZXVlIHNvIGl0IGNhbiBiZSByZWN5Y2xlZCBpbiBmdXR1cmU6XG5cbiAgdmFyIHJ0eHRyUSA9IHNlbGYuZ2V0UmV0aXJlZFRleHR1cmVRdWV1ZSh0eHJIKTtcbiAgcnR4dHJRLnB1c2godHhyKTtcbn07XG5FVENwLmFkZFRleHR1cmUgPSBmdW5jdGlvbiAodHhySCwgbWluVykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0eHJRID0gc2VsZi5nZXRUZXh0dXJlUXVldWUodHhySCk7XG4gIHZhciB0eHIgPSB7fTtcbiAgdHhyUS5wdXNoKHR4cik7XG4gIHR4ci5lbGVDYWNoZXMgPSBbXTtcbiAgdHhyLmhlaWdodCA9IHR4ckg7XG4gIHR4ci53aWR0aCA9IE1hdGgubWF4KGRlZlR4cldpZHRoLCBtaW5XKTtcbiAgdHhyLnVzZWRXaWR0aCA9IDA7XG4gIHR4ci5pbnZhbGlkYXRlZFdpZHRoID0gMDtcbiAgdHhyLmZ1bGxuZXNzQ2hlY2tzID0gMDtcbiAgdHhyLmNhbnZhcyA9IHNlbGYucmVuZGVyZXIubWFrZU9mZnNjcmVlbkNhbnZhcyh0eHIud2lkdGgsIHR4ci5oZWlnaHQpO1xuICB0eHIuY29udGV4dCA9IHR4ci5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgcmV0dXJuIHR4cjtcbn07XG5FVENwLnJlY3ljbGVUZXh0dXJlID0gZnVuY3Rpb24gKHR4ckgsIG1pblcpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgdHhyUSA9IHNlbGYuZ2V0VGV4dHVyZVF1ZXVlKHR4ckgpO1xuICB2YXIgcnR4dHJRID0gc2VsZi5nZXRSZXRpcmVkVGV4dHVyZVF1ZXVlKHR4ckgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJ0eHRyUS5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0eHIgPSBydHh0clFbaV07XG4gICAgaWYgKHR4ci53aWR0aCA+PSBtaW5XKSB7XG4gICAgICB0eHIucmV0aXJlZCA9IGZhbHNlO1xuICAgICAgdHhyLnVzZWRXaWR0aCA9IDA7XG4gICAgICB0eHIuaW52YWxpZGF0ZWRXaWR0aCA9IDA7XG4gICAgICB0eHIuZnVsbG5lc3NDaGVja3MgPSAwO1xuICAgICAgY2xlYXJBcnJheSh0eHIuZWxlQ2FjaGVzKTtcbiAgICAgIHR4ci5jb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICAgIHR4ci5jb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB0eHIud2lkdGgsIHR4ci5oZWlnaHQpO1xuICAgICAgcmVtb3ZlRnJvbUFycmF5KHJ0eHRyUSwgdHhyKTtcbiAgICAgIHR4clEucHVzaCh0eHIpO1xuICAgICAgcmV0dXJuIHR4cjtcbiAgICB9XG4gIH1cbn07XG5FVENwLnF1ZXVlRWxlbWVudCA9IGZ1bmN0aW9uIChlbGUsIGx2bCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBxID0gc2VsZi5nZXRFbGVtZW50UXVldWUoKTtcbiAgdmFyIGsycSA9IHNlbGYuZ2V0RWxlbWVudEtleVRvUXVldWUoKTtcbiAgdmFyIGtleSA9IHRoaXMuZ2V0S2V5KGVsZSk7XG4gIHZhciBleGlzdGluZ1JlcSA9IGsycVtrZXldO1xuICBpZiAoZXhpc3RpbmdSZXEpIHtcbiAgICAvLyB1c2UgdGhlIG1heCBsdmwgYi9jIGluIGJldHdlZW4gbHZscyBhcmUgY2hlYXAgdG8gbWFrZVxuICAgIGV4aXN0aW5nUmVxLmxldmVsID0gTWF0aC5tYXgoZXhpc3RpbmdSZXEubGV2ZWwsIGx2bCk7XG4gICAgZXhpc3RpbmdSZXEuZWxlcy5tZXJnZShlbGUpO1xuICAgIGV4aXN0aW5nUmVxLnJlcXMrKztcbiAgICBxLnVwZGF0ZUl0ZW0oZXhpc3RpbmdSZXEpO1xuICB9IGVsc2Uge1xuICAgIHZhciByZXEgPSB7XG4gICAgICBlbGVzOiBlbGUuc3Bhd24oKS5tZXJnZShlbGUpLFxuICAgICAgbGV2ZWw6IGx2bCxcbiAgICAgIHJlcXM6IDEsXG4gICAgICBrZXk6IGtleVxuICAgIH07XG4gICAgcS5wdXNoKHJlcSk7XG4gICAgazJxW2tleV0gPSByZXE7XG4gIH1cbn07XG5FVENwLmRlcXVldWUgPSBmdW5jdGlvbiAocHhSYXRpbyAvKiwgZXh0ZW50Ki8pIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcSA9IHNlbGYuZ2V0RWxlbWVudFF1ZXVlKCk7XG4gIHZhciBrMnEgPSBzZWxmLmdldEVsZW1lbnRLZXlUb1F1ZXVlKCk7XG4gIHZhciBkZXF1ZXVlZCA9IFtdO1xuICB2YXIgbG9va3VwID0gc2VsZi5sb29rdXA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbWF4RGVxU2l6ZSQxOyBpKyspIHtcbiAgICBpZiAocS5zaXplKCkgPiAwKSB7XG4gICAgICB2YXIgcmVxID0gcS5wb3AoKTtcbiAgICAgIHZhciBrZXkgPSByZXEua2V5O1xuICAgICAgdmFyIGVsZSA9IHJlcS5lbGVzWzBdOyAvLyBhbGwgZWxlcyBoYXZlIHRoZSBzYW1lIGtleVxuICAgICAgdmFyIGNhY2hlRXhpc3RzID0gbG9va3VwLmhhc0NhY2hlKGVsZSwgcmVxLmxldmVsKTtcblxuICAgICAgLy8gY2xlYXIgb3V0IHRoZSBrZXkgdG8gcmVxIGxvb2t1cFxuICAgICAgazJxW2tleV0gPSBudWxsO1xuXG4gICAgICAvLyBkZXF1ZXVlaW5nIGlzbid0IG5lY2Vzc2FyeSB3aXRoIGFuIGV4aXN0aW5nIGNhY2hlXG4gICAgICBpZiAoY2FjaGVFeGlzdHMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBkZXF1ZXVlZC5wdXNoKHJlcSk7XG4gICAgICB2YXIgYmIgPSBzZWxmLmdldEJvdW5kaW5nQm94KGVsZSk7XG4gICAgICBzZWxmLmdldEVsZW1lbnQoZWxlLCBiYiwgcHhSYXRpbywgcmVxLmxldmVsLCBnZXRUeHJSZWFzb25zLmRlcXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlcXVldWVkO1xufTtcbkVUQ3AucmVtb3ZlRnJvbVF1ZXVlID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBxID0gc2VsZi5nZXRFbGVtZW50UXVldWUoKTtcbiAgdmFyIGsycSA9IHNlbGYuZ2V0RWxlbWVudEtleVRvUXVldWUoKTtcbiAgdmFyIGtleSA9IHRoaXMuZ2V0S2V5KGVsZSk7XG4gIHZhciByZXEgPSBrMnFba2V5XTtcbiAgaWYgKHJlcSAhPSBudWxsKSB7XG4gICAgaWYgKHJlcS5lbGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gcmVtb3ZlIGlmIGxhc3QgZWxlIGluIHRoZSByZXFcbiAgICAgIC8vIGJyaW5nIHRvIGZyb250IG9mIHF1ZXVlXG4gICAgICByZXEucmVxcyA9IE1BWF9JTlQkMTtcbiAgICAgIHEudXBkYXRlSXRlbShyZXEpO1xuICAgICAgcS5wb3AoKTsgLy8gcmVtb3ZlIGZyb20gcXVldWVcblxuICAgICAgazJxW2tleV0gPSBudWxsOyAvLyByZW1vdmUgZnJvbSBsb29rdXAgbWFwXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSBqdXN0IHJlbW92ZSBlbGUgZnJvbSByZXFcbiAgICAgIHJlcS5lbGVzLnVubWVyZ2UoZWxlKTtcbiAgICB9XG4gIH1cbn07XG5FVENwLm9uRGVxdWV1ZSA9IGZ1bmN0aW9uIChmbikge1xuICB0aGlzLm9uRGVxdWV1ZXMucHVzaChmbik7XG59O1xuRVRDcC5vZmZEZXF1ZXVlID0gZnVuY3Rpb24gKGZuKSB7XG4gIHJlbW92ZUZyb21BcnJheSh0aGlzLm9uRGVxdWV1ZXMsIGZuKTtcbn07XG5FVENwLnNldHVwRGVxdWV1ZWluZyA9IGRlZnMuc2V0dXBEZXF1ZXVlaW5nKHtcbiAgZGVxUmVkcmF3VGhyZXNob2xkOiBkZXFSZWRyYXdUaHJlc2hvbGQkMSxcbiAgZGVxQ29zdDogZGVxQ29zdCQxLFxuICBkZXFBdmdDb3N0OiBkZXFBdmdDb3N0JDEsXG4gIGRlcU5vRHJhd0Nvc3Q6IGRlcU5vRHJhd0Nvc3QkMSxcbiAgZGVxRmFzdENvc3Q6IGRlcUZhc3RDb3N0JDEsXG4gIGRlcTogZnVuY3Rpb24gZGVxKHNlbGYsIHB4UmF0aW8sIGV4dGVudCkge1xuICAgIHJldHVybiBzZWxmLmRlcXVldWUocHhSYXRpbywgZXh0ZW50KTtcbiAgfSxcbiAgb25EZXFkOiBmdW5jdGlvbiBvbkRlcWQoc2VsZiwgZGVxZCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vbkRlcXVldWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZm4gPSBzZWxmLm9uRGVxdWV1ZXNbaV07XG4gICAgICBmbihkZXFkKTtcbiAgICB9XG4gIH0sXG4gIHNob3VsZFJlZHJhdzogZnVuY3Rpb24gc2hvdWxkUmVkcmF3KHNlbGYsIGRlcWQsIHB4UmF0aW8sIGV4dGVudCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVxZC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZXMgPSBkZXFkW2ldLmVsZXM7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGVsZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGJiID0gZWxlc1tqXS5ib3VuZGluZ0JveCgpO1xuICAgICAgICBpZiAoYm91bmRpbmdCb3hlc0ludGVyc2VjdChiYiwgZXh0ZW50KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgcHJpb3JpdHk6IGZ1bmN0aW9uIHByaW9yaXR5KHNlbGYpIHtcbiAgICByZXR1cm4gc2VsZi5yZW5kZXJlci5iZWZvcmVSZW5kZXJQcmlvcml0aWVzLmVsZVR4ckRlcTtcbiAgfVxufSk7XG5cbnZhciBkZWZOdW1MYXllcnMgPSAxOyAvLyBkZWZhdWx0IG51bWJlciBvZiBsYXllcnMgdG8gdXNlXG52YXIgbWluTHZsID0gLTQ7IC8vIHdoZW4gc2NhbGluZyBzbWFsbGVyIHRoYW4gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIHJlLXJlbmRlclxudmFyIG1heEx2bCA9IDI7IC8vIHdoZW4gbGFyZ2VyIHRoYW4gdGhpcyBzY2FsZSBqdXN0IHJlbmRlciBkaXJlY3RseSAoY2FjaGluZyBpcyBub3QgaGVscGZ1bClcbnZhciBtYXhab29tID0gMy45OTsgLy8gYmV5b25kIHRoaXMgem9vbSBsZXZlbCwgbGF5ZXJlZCB0ZXh0dXJlcyBhcmUgbm90IHVzZWRcbnZhciBkZXFSZWRyYXdUaHJlc2hvbGQgPSA1MDsgLy8gdGltZSB0byBiYXRjaCByZWRyYXdzIHRvZ2V0aGVyIGZyb20gZGVxdWV1ZWluZyB0byBhbGxvdyBtb3JlIGRlcXVldWVpbmcgY2FsY3MgdG8gaGFwcGVuIGluIHRoZSBtZWFud2hpbGVcbnZhciByZWZpbmVFbGVEZWJvdW5jZVRpbWUgPSA1MDsgLy8gdGltZSB0byBkZWJvdW5jZSBzaGFycGVyIGVsZSB0ZXh0dXJlIHVwZGF0ZXNcbnZhciBkZXFDb3N0ID0gMC4xNTsgLy8gJSBvZiBhZGQnbCByZW5kZXJpbmcgY29zdCBhbGxvd2VkIGZvciBkZXF1ZXVpbmcgZWxlIGNhY2hlcyBlYWNoIGZyYW1lXG52YXIgZGVxQXZnQ29zdCA9IDAuMTsgLy8gJSBvZiBhZGQnbCByZW5kZXJpbmcgY29zdCBjb21wYXJlZCB0byBhdmVyYWdlIG92ZXJhbGwgcmVkcmF3IHRpbWVcbnZhciBkZXFOb0RyYXdDb3N0ID0gMC45OyAvLyAlIG9mIGF2ZyBmcmFtZSB0aW1lIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGRlcXVldWVpbmcgd2hlbiBub3QgZHJhd2luZ1xudmFyIGRlcUZhc3RDb3N0ID0gMC45OyAvLyAlIG9mIGZyYW1lIHRpbWUgdG8gYmUgdXNlZCB3aGVuID42MGZwc1xudmFyIG1heERlcVNpemUgPSAxOyAvLyBudW1iZXIgb2YgZWxlcyB0byBkZXF1ZXVlIGFuZCByZW5kZXIgYXQgaGlnaGVyIHRleHR1cmUgaW4gZWFjaCBiYXRjaFxudmFyIGludmFsaWRUaHJlc2hvbGQgPSAyNTA7IC8vIHRpbWUgdGhyZXNob2xkIGZvciBkaXNhYmxpbmcgYi9jIG9mIGludmFsaWRhdGlvbnNcbnZhciBtYXhMYXllckFyZWEgPSA0MDAwICogNDAwMDsgLy8gbGF5ZXJzIGNhbid0IGJlIGJpZ2dlciB0aGFuIHRoaXNcbnZhciB1c2VIaWdoUXVhbGl0eUVsZVR4clJlcXMgPSB0cnVlOyAvLyB3aGV0aGVyIHRvIHVzZSBoaWdoIHF1YWxpdHkgZWxlIHR4ciByZXF1ZXN0cyAoZ2VuZXJhbGx5IGZhc3RlciBhbmQgY2hlYXBlciBpbiB0aGUgbG9uZ3Rlcm0pXG5cbi8vIHZhciBsb2cgPSBmdW5jdGlvbigpeyBjb25zb2xlLmxvZy5hcHBseSggY29uc29sZSwgYXJndW1lbnRzICk7IH07XG5cbnZhciBMYXllcmVkVGV4dHVyZUNhY2hlID0gZnVuY3Rpb24gTGF5ZXJlZFRleHR1cmVDYWNoZShyZW5kZXJlcikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByID0gc2VsZi5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICB2YXIgY3kgPSByLmN5O1xuICBzZWxmLmxheWVyc0J5TGV2ZWwgPSB7fTsgLy8gZS5nLiAyID0+IFsgbGF5ZXIxLCBsYXllcjIsIC4uLiwgbGF5ZXJOIF1cblxuICBzZWxmLmZpcnN0R2V0ID0gdHJ1ZTtcbiAgc2VsZi5sYXN0SW52YWxpZGF0aW9uVGltZSA9IHBlcmZvcm1hbmNlTm93KCkgLSAyICogaW52YWxpZFRocmVzaG9sZDtcbiAgc2VsZi5za2lwcGluZyA9IGZhbHNlO1xuICBzZWxmLmVsZVR4ckRlcXMgPSBjeS5jb2xsZWN0aW9uKCk7XG4gIHNlbGYuc2NoZWR1bGVFbGVtZW50UmVmaW5lbWVudCA9IGRlYm91bmNlX19kZWZhdWx0W1wiZGVmYXVsdFwiXShmdW5jdGlvbiAoKSB7XG4gICAgc2VsZi5yZWZpbmVFbGVtZW50VGV4dHVyZXMoc2VsZi5lbGVUeHJEZXFzKTtcbiAgICBzZWxmLmVsZVR4ckRlcXMudW5tZXJnZShzZWxmLmVsZVR4ckRlcXMpO1xuICB9LCByZWZpbmVFbGVEZWJvdW5jZVRpbWUpO1xuICByLmJlZm9yZVJlbmRlcihmdW5jdGlvbiAod2lsbERyYXcsIG5vdykge1xuICAgIGlmIChub3cgLSBzZWxmLmxhc3RJbnZhbGlkYXRpb25UaW1lIDw9IGludmFsaWRUaHJlc2hvbGQpIHtcbiAgICAgIHNlbGYuc2tpcHBpbmcgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLnNraXBwaW5nID0gZmFsc2U7XG4gICAgfVxuICB9LCByLmJlZm9yZVJlbmRlclByaW9yaXRpZXMubHlyVHhyU2tpcCk7XG4gIHZhciBxU29ydCA9IGZ1bmN0aW9uIHFTb3J0KGEsIGIpIHtcbiAgICByZXR1cm4gYi5yZXFzIC0gYS5yZXFzO1xuICB9O1xuICBzZWxmLmxheWVyc1F1ZXVlID0gbmV3IEhlYXBfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHFTb3J0KTtcbiAgc2VsZi5zZXR1cERlcXVldWVpbmcoKTtcbn07XG52YXIgTFRDcCA9IExheWVyZWRUZXh0dXJlQ2FjaGUucHJvdG90eXBlO1xudmFyIGxheWVySWRQb29sID0gMDtcbnZhciBNQVhfSU5UID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcbkxUQ3AubWFrZUxheWVyID0gZnVuY3Rpb24gKGJiLCBsdmwpIHtcbiAgdmFyIHNjYWxlID0gTWF0aC5wb3coMiwgbHZsKTtcbiAgdmFyIHcgPSBNYXRoLmNlaWwoYmIudyAqIHNjYWxlKTtcbiAgdmFyIGggPSBNYXRoLmNlaWwoYmIuaCAqIHNjYWxlKTtcbiAgdmFyIGNhbnZhcyA9IHRoaXMucmVuZGVyZXIubWFrZU9mZnNjcmVlbkNhbnZhcyh3LCBoKTtcbiAgdmFyIGxheWVyID0ge1xuICAgIGlkOiBsYXllcklkUG9vbCA9ICsrbGF5ZXJJZFBvb2wgJSBNQVhfSU5ULFxuICAgIGJiOiBiYixcbiAgICBsZXZlbDogbHZsLFxuICAgIHdpZHRoOiB3LFxuICAgIGhlaWdodDogaCxcbiAgICBjYW52YXM6IGNhbnZhcyxcbiAgICBjb250ZXh0OiBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSxcbiAgICBlbGVzOiBbXSxcbiAgICBlbGVzUXVldWU6IFtdLFxuICAgIHJlcXM6IDBcbiAgfTtcblxuICAvLyBsb2coJ21ha2UgbGF5ZXIgJXMgd2l0aCB3ICVzIGFuZCBoICVzIGFuZCBsdmwgJXMnLCBsYXllci5pZCwgbGF5ZXIud2lkdGgsIGxheWVyLmhlaWdodCwgbGF5ZXIubGV2ZWwpO1xuXG4gIHZhciBjeHQgPSBsYXllci5jb250ZXh0O1xuICB2YXIgZHggPSAtbGF5ZXIuYmIueDE7XG4gIHZhciBkeSA9IC1sYXllci5iYi55MTtcblxuICAvLyBkbyB0aGUgdHJhbnNmb3JtIG9uIGNyZWF0aW9uIHRvIHNhdmUgY3ljbGVzIChpdCdzIHRoZSBzYW1lIGZvciBhbGwgZWxlcylcbiAgY3h0LnNjYWxlKHNjYWxlLCBzY2FsZSk7XG4gIGN4dC50cmFuc2xhdGUoZHgsIGR5KTtcbiAgcmV0dXJuIGxheWVyO1xufTtcbkxUQ3AuZ2V0TGF5ZXJzID0gZnVuY3Rpb24gKGVsZXMsIHB4UmF0aW8sIGx2bCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByID0gc2VsZi5yZW5kZXJlcjtcbiAgdmFyIGN5ID0gci5jeTtcbiAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gIHZhciBmaXJzdEdldCA9IHNlbGYuZmlyc3RHZXQ7XG4gIHNlbGYuZmlyc3RHZXQgPSBmYWxzZTtcblxuICAvLyBsb2coJy0tXFxuZ2V0IGxheWVycyB3aXRoICVzIGVsZXMnLCBlbGVzLmxlbmd0aCk7XG4gIC8vbG9nIGVsZXMubWFwKGZ1bmN0aW9uKGVsZSl7IHJldHVybiBlbGUuaWQoKSB9KSApO1xuXG4gIGlmIChsdmwgPT0gbnVsbCkge1xuICAgIGx2bCA9IE1hdGguY2VpbChsb2cyKHpvb20gKiBweFJhdGlvKSk7XG4gICAgaWYgKGx2bCA8IG1pbkx2bCkge1xuICAgICAgbHZsID0gbWluTHZsO1xuICAgIH0gZWxzZSBpZiAoem9vbSA+PSBtYXhab29tIHx8IGx2bCA+IG1heEx2bCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIHNlbGYudmFsaWRhdGVMYXllcnNFbGVzT3JkZXJpbmcobHZsLCBlbGVzKTtcbiAgdmFyIGxheWVyc0J5THZsID0gc2VsZi5sYXllcnNCeUxldmVsO1xuICB2YXIgc2NhbGUgPSBNYXRoLnBvdygyLCBsdmwpO1xuICB2YXIgbGF5ZXJzID0gbGF5ZXJzQnlMdmxbbHZsXSA9IGxheWVyc0J5THZsW2x2bF0gfHwgW107XG4gIHZhciBiYjtcbiAgdmFyIGx2bENvbXBsZXRlID0gc2VsZi5sZXZlbElzQ29tcGxldGUobHZsLCBlbGVzKTtcbiAgdmFyIHRtcExheWVycztcbiAgdmFyIGNoZWNrVGVtcExldmVscyA9IGZ1bmN0aW9uIGNoZWNrVGVtcExldmVscygpIHtcbiAgICB2YXIgY2FuVXNlQXNUbXBMdmwgPSBmdW5jdGlvbiBjYW5Vc2VBc1RtcEx2bChsKSB7XG4gICAgICBzZWxmLnZhbGlkYXRlTGF5ZXJzRWxlc09yZGVyaW5nKGwsIGVsZXMpO1xuICAgICAgaWYgKHNlbGYubGV2ZWxJc0NvbXBsZXRlKGwsIGVsZXMpKSB7XG4gICAgICAgIHRtcExheWVycyA9IGxheWVyc0J5THZsW2xdO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBjaGVja0x2bHMgPSBmdW5jdGlvbiBjaGVja0x2bHMoZGlyKSB7XG4gICAgICBpZiAodG1wTGF5ZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGwgPSBsdmwgKyBkaXI7IG1pbkx2bCA8PSBsICYmIGwgPD0gbWF4THZsOyBsICs9IGRpcikge1xuICAgICAgICBpZiAoY2FuVXNlQXNUbXBMdmwobCkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgY2hlY2tMdmxzKCsxKTtcbiAgICBjaGVja0x2bHMoLTEpO1xuXG4gICAgLy8gcmVtb3ZlIHRoZSBpbnZhbGlkIGxheWVyczsgdGhleSB3aWxsIGJlIHJlcGxhY2VkIGFzIG5lZWRlZCBsYXRlciBpbiB0aGlzIGZ1bmN0aW9uXG4gICAgZm9yICh2YXIgaSA9IGxheWVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGxheWVyID0gbGF5ZXJzW2ldO1xuICAgICAgaWYgKGxheWVyLmludmFsaWQpIHtcbiAgICAgICAgcmVtb3ZlRnJvbUFycmF5KGxheWVycywgbGF5ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgaWYgKCFsdmxDb21wbGV0ZSkge1xuICAgIC8vIGlmIHRoZSBjdXJyZW50IGxldmVsIGlzIGluY29tcGxldGUsIHRoZW4gdXNlIHRoZSBjbG9zZXN0LCBiZXN0IHF1YWxpdHkgbGF5ZXJzZXQgdGVtcG9yYXJpbHlcbiAgICAvLyBhbmQgbGF0ZXIgcXVldWUgdGhlIGN1cnJlbnQgbGF5ZXJzZXQgc28gd2UgY2FuIGdldCB0aGUgcHJvcGVyIHF1YWxpdHkgbGV2ZWwgc29vblxuXG4gICAgY2hlY2tUZW1wTGV2ZWxzKCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbG9nKCdsZXZlbCBjb21wbGV0ZSwgdXNpbmcgZXhpc3RpbmcgbGF5ZXJzXFxuLS0nKTtcbiAgICByZXR1cm4gbGF5ZXJzO1xuICB9XG4gIHZhciBnZXRCYiA9IGZ1bmN0aW9uIGdldEJiKCkge1xuICAgIGlmICghYmIpIHtcbiAgICAgIGJiID0gbWFrZUJvdW5kaW5nQm94KCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdXBkYXRlQm91bmRpbmdCb3goYmIsIGVsZXNbaV0uYm91bmRpbmdCb3goKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYjtcbiAgfTtcbiAgdmFyIG1ha2VMYXllciA9IGZ1bmN0aW9uIG1ha2VMYXllcihvcHRzKSB7XG4gICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgdmFyIGFmdGVyID0gb3B0cy5hZnRlcjtcbiAgICBnZXRCYigpO1xuICAgIHZhciBhcmVhID0gYmIudyAqIHNjYWxlICogKGJiLmggKiBzY2FsZSk7XG4gICAgaWYgKGFyZWEgPiBtYXhMYXllckFyZWEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgbGF5ZXIgPSBzZWxmLm1ha2VMYXllcihiYiwgbHZsKTtcbiAgICBpZiAoYWZ0ZXIgIT0gbnVsbCkge1xuICAgICAgdmFyIGluZGV4ID0gbGF5ZXJzLmluZGV4T2YoYWZ0ZXIpICsgMTtcbiAgICAgIGxheWVycy5zcGxpY2UoaW5kZXgsIDAsIGxheWVyKTtcbiAgICB9IGVsc2UgaWYgKG9wdHMuaW5zZXJ0ID09PSB1bmRlZmluZWQgfHwgb3B0cy5pbnNlcnQpIHtcbiAgICAgIC8vIG5vIGFmdGVyIHNwZWNpZmllZCA9PiBmaXJzdCBsYXllciBtYWRlIHNvIHB1dCBhdCBzdGFydFxuICAgICAgbGF5ZXJzLnVuc2hpZnQobGF5ZXIpO1xuICAgIH1cblxuICAgIC8vIGlmKCB0bXBMYXllcnMgKXtcbiAgICAvL3NlbGYucXVldWVMYXllciggbGF5ZXIgKTtcbiAgICAvLyB9XG5cbiAgICByZXR1cm4gbGF5ZXI7XG4gIH07XG4gIGlmIChzZWxmLnNraXBwaW5nICYmICFmaXJzdEdldCkge1xuICAgIC8vIGxvZygnc2tpcCBsYXllcnMnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIGxvZygnZG8gbGF5ZXJzJyk7XG5cbiAgdmFyIGxheWVyID0gbnVsbDtcbiAgdmFyIG1heEVsZXNQZXJMYXllciA9IGVsZXMubGVuZ3RoIC8gZGVmTnVtTGF5ZXJzO1xuICB2YXIgYWxsb3dMYXp5UXVldWVpbmcgPSAhZmlyc3RHZXQ7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHZhciBycyA9IGVsZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICB2YXIgY2FjaGVzID0gcnMuaW1nTGF5ZXJDYWNoZXMgPSBycy5pbWdMYXllckNhY2hlcyB8fCB7fTtcblxuICAgIC8vIGxvZygnbG9vayBhdCBlbGUnLCBlbGUuaWQoKSk7XG5cbiAgICB2YXIgZXhpc3RpbmdMYXllciA9IGNhY2hlc1tsdmxdO1xuICAgIGlmIChleGlzdGluZ0xheWVyKSB7XG4gICAgICAvLyByZXVzZSBsYXllciBmb3IgbGF0ZXIgZWxlc1xuICAgICAgLy8gbG9nKCdyZXVzZSBsYXllciBmb3InLCBlbGUuaWQoKSk7XG4gICAgICBsYXllciA9IGV4aXN0aW5nTGF5ZXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFsYXllciB8fCBsYXllci5lbGVzLmxlbmd0aCA+PSBtYXhFbGVzUGVyTGF5ZXIgfHwgIWJvdW5kaW5nQm94SW5Cb3VuZGluZ0JveChsYXllci5iYiwgZWxlLmJvdW5kaW5nQm94KCkpKSB7XG4gICAgICAvLyBsb2coJ21ha2UgbmV3IGxheWVyIGZvciBlbGUgJXMnLCBlbGUuaWQoKSk7XG5cbiAgICAgIGxheWVyID0gbWFrZUxheWVyKHtcbiAgICAgICAgaW5zZXJ0OiB0cnVlLFxuICAgICAgICBhZnRlcjogbGF5ZXJcbiAgICAgIH0pO1xuXG4gICAgICAvLyBpZiBub3cgbGF5ZXIgY2FuIGJlIGJ1aWx0IHRoZW4gd2UgY2FuJ3QgdXNlIGxheWVycyBhdCB0aGlzIGxldmVsXG4gICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBsb2coJ25ldyBsYXllciB3aXRoIGlkICVzJywgbGF5ZXIuaWQpO1xuICAgIH1cblxuICAgIGlmICh0bXBMYXllcnMgfHwgYWxsb3dMYXp5UXVldWVpbmcpIHtcbiAgICAgIC8vIGxvZygncXVldWUgZWxlICVzIGluIGxheWVyICVzJywgZWxlLmlkKCksIGxheWVyLmlkKTtcbiAgICAgIHNlbGYucXVldWVMYXllcihsYXllciwgZWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbG9nKCdkcmF3IGVsZSAlcyBpbiBsYXllciAlcycsIGVsZS5pZCgpLCBsYXllci5pZCk7XG4gICAgICBzZWxmLmRyYXdFbGVJbkxheWVyKGxheWVyLCBlbGUsIGx2bCwgcHhSYXRpbyk7XG4gICAgfVxuICAgIGxheWVyLmVsZXMucHVzaChlbGUpO1xuICAgIGNhY2hlc1tsdmxdID0gbGF5ZXI7XG4gIH1cblxuICAvLyBsb2coJy0tJyk7XG5cbiAgaWYgKHRtcExheWVycykge1xuICAgIC8vIHRoZW4gd2Ugb25seSBxdWV1ZWQgdGhlIGN1cnJlbnQgbGF5ZXJzZXQgYW5kIGNhbid0IGRyYXcgaXQgeWV0XG4gICAgcmV0dXJuIHRtcExheWVycztcbiAgfVxuICBpZiAoYWxsb3dMYXp5UXVldWVpbmcpIHtcbiAgICAvLyBsb2coJ2xhenkgcXVldWUgbGV2ZWwnLCBsdmwpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBsYXllcnM7XG59O1xuXG4vLyBhIGxheWVyIG1heSB3YW50IHRvIHVzZSBhbiBlbGUgY2FjaGUgb2YgYSBoaWdoZXIgbGV2ZWwgdG8gYXZvaWQgYmx1cnJpbmVzc1xuLy8gc28gdGhlIGxheWVyIGxldmVsIG1pZ2h0IG5vdCBlcXVhbCB0aGUgZWxlIGxldmVsXG5MVENwLmdldEVsZUxldmVsRm9yTGF5ZXJMZXZlbCA9IGZ1bmN0aW9uIChsdmwsIHB4UmF0aW8pIHtcbiAgcmV0dXJuIGx2bDtcbn07XG5MVENwLmRyYXdFbGVJbkxheWVyID0gZnVuY3Rpb24gKGxheWVyLCBlbGUsIGx2bCwgcHhSYXRpbykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByID0gdGhpcy5yZW5kZXJlcjtcbiAgdmFyIGNvbnRleHQgPSBsYXllci5jb250ZXh0O1xuICB2YXIgYmIgPSBlbGUuYm91bmRpbmdCb3goKTtcbiAgaWYgKGJiLncgPT09IDAgfHwgYmIuaCA9PT0gMCB8fCAhZWxlLnZpc2libGUoKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBsdmwgPSBzZWxmLmdldEVsZUxldmVsRm9yTGF5ZXJMZXZlbChsdmwsIHB4UmF0aW8pO1xuICB7XG4gICAgci5zZXRJbWdTbW9vdGhpbmcoY29udGV4dCwgZmFsc2UpO1xuICB9XG4gIHtcbiAgICByLmRyYXdDYWNoZWRFbGVtZW50KGNvbnRleHQsIGVsZSwgbnVsbCwgbnVsbCwgbHZsLCB1c2VIaWdoUXVhbGl0eUVsZVR4clJlcXMpO1xuICB9XG4gIHtcbiAgICByLnNldEltZ1Ntb290aGluZyhjb250ZXh0LCB0cnVlKTtcbiAgfVxufTtcbkxUQ3AubGV2ZWxJc0NvbXBsZXRlID0gZnVuY3Rpb24gKGx2bCwgZWxlcykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBsYXllcnMgPSBzZWxmLmxheWVyc0J5TGV2ZWxbbHZsXTtcbiAgaWYgKCFsYXllcnMgfHwgbGF5ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbnVtRWxlc0luTGF5ZXJzID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbGF5ZXIgPSBsYXllcnNbaV07XG5cbiAgICAvLyBpZiB0aGVyZSBhcmUgYW55IGVsZXMgbmVlZGVkIHRvIGJlIGRyYXduIHlldCwgdGhlIGxldmVsIGlzIG5vdCBjb21wbGV0ZVxuICAgIGlmIChsYXllci5yZXFzID4gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSBsYXllciBpcyBpbnZhbGlkLCB0aGUgbGV2ZWwgaXMgbm90IGNvbXBsZXRlXG4gICAgaWYgKGxheWVyLmludmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbnVtRWxlc0luTGF5ZXJzICs9IGxheWVyLmVsZXMubGVuZ3RoO1xuICB9XG5cbiAgLy8gd2Ugc2hvdWxkIGhhdmUgZXhhY3RseSB0aGUgbnVtYmVyIG9mIGVsZXMgcGFzc2VkIGluIHRvIGJlIGNvbXBsZXRlXG4gIGlmIChudW1FbGVzSW5MYXllcnMgIT09IGVsZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcbkxUQ3AudmFsaWRhdGVMYXllcnNFbGVzT3JkZXJpbmcgPSBmdW5jdGlvbiAobHZsLCBlbGVzKSB7XG4gIHZhciBsYXllcnMgPSB0aGlzLmxheWVyc0J5TGV2ZWxbbHZsXTtcbiAgaWYgKCFsYXllcnMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBpZiBpbiBhIGxheWVyIHRoZSBlbGVzIGFyZSBub3QgaW4gdGhlIHNhbWUgb3JkZXIsIHRoZW4gdGhlIGxheWVyIGlzIGludmFsaWRcbiAgLy8gKGkuZS4gdGhlcmUgaXMgYW4gZWxlIGluIGJldHdlZW4gdGhlIGVsZXMgaW4gdGhlIGxheWVyKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGxheWVyID0gbGF5ZXJzW2ldO1xuICAgIHZhciBvZmZzZXQgPSAtMTtcblxuICAgIC8vIGZpbmQgdGhlIG9mZnNldFxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWxlcy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGxheWVyLmVsZXNbMF0gPT09IGVsZXNbal0pIHtcbiAgICAgICAgb2Zmc2V0ID0gajtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAvLyB0aGVuIHRoZSBsYXllciBoYXMgbm9uZXhpc3RlbnQgZWxlbWVudHMgYW5kIGlzIGludmFsaWRcbiAgICAgIHRoaXMuaW52YWxpZGF0ZUxheWVyKGxheWVyKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIHRoZSBlbGVzIGluIHRoZSBsYXllciBtdXN0IGJlIGluIHRoZSBzYW1lIGNvbnRpbnVvdXMgb3JkZXIsIGVsc2UgdGhlIGxheWVyIGlzIGludmFsaWRcblxuICAgIHZhciBvID0gb2Zmc2V0O1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGF5ZXIuZWxlcy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGxheWVyLmVsZXNbal0gIT09IGVsZXNbbyArIGpdKSB7XG4gICAgICAgIC8vIGxvZygnaW52YWxpZGF0ZSBiYXNlZCBvbiBvcmRlcmluZycsIGxheWVyLmlkKTtcblxuICAgICAgICB0aGlzLmludmFsaWRhdGVMYXllcihsYXllcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbkxUQ3AudXBkYXRlRWxlbWVudHNJbkxheWVycyA9IGZ1bmN0aW9uIChlbGVzLCB1cGRhdGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgaXNFbGVzID0gZWxlbWVudChlbGVzWzBdKTtcblxuICAvLyBjb2xsZWN0IHVkcGF0ZWQgZWxlbWVudHMgKGNhc2NhZGVkIGZyb20gdGhlIGxheWVycykgYW5kIHVwZGF0ZSBlYWNoXG4gIC8vIGxheWVyIGl0c2VsZiBhbG9uZyB0aGUgd2F5XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciByZXEgPSBpc0VsZXMgPyBudWxsIDogZWxlc1tpXTtcbiAgICB2YXIgZWxlID0gaXNFbGVzID8gZWxlc1tpXSA6IGVsZXNbaV0uZWxlO1xuICAgIHZhciBycyA9IGVsZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICB2YXIgY2FjaGVzID0gcnMuaW1nTGF5ZXJDYWNoZXMgPSBycy5pbWdMYXllckNhY2hlcyB8fCB7fTtcbiAgICBmb3IgKHZhciBsID0gbWluTHZsOyBsIDw9IG1heEx2bDsgbCsrKSB7XG4gICAgICB2YXIgbGF5ZXIgPSBjYWNoZXNbbF07XG4gICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB1cGRhdGUgaXMgYSByZXF1ZXN0IGZyb20gdGhlIGVsZSBjYWNoZSwgdGhlbiBpdCBhZmZlY3RzIG9ubHlcbiAgICAgIC8vIHRoZSBtYXRjaGluZyBsZXZlbFxuICAgICAgaWYgKHJlcSAmJiBzZWxmLmdldEVsZUxldmVsRm9yTGF5ZXJMZXZlbChsYXllci5sZXZlbCkgIT09IHJlcS5sZXZlbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZShsYXllciwgZWxlLCByZXEpO1xuICAgIH1cbiAgfVxufTtcbkxUQ3AuaGF2ZUxheWVycyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgaGF2ZUxheWVycyA9IGZhbHNlO1xuICBmb3IgKHZhciBsID0gbWluTHZsOyBsIDw9IG1heEx2bDsgbCsrKSB7XG4gICAgdmFyIGxheWVycyA9IHNlbGYubGF5ZXJzQnlMZXZlbFtsXTtcbiAgICBpZiAobGF5ZXJzICYmIGxheWVycy5sZW5ndGggPiAwKSB7XG4gICAgICBoYXZlTGF5ZXJzID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGF2ZUxheWVycztcbn07XG5MVENwLmludmFsaWRhdGVFbGVtZW50cyA9IGZ1bmN0aW9uIChlbGVzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKGVsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNlbGYubGFzdEludmFsaWRhdGlvblRpbWUgPSBwZXJmb3JtYW5jZU5vdygpO1xuXG4gIC8vIGxvZygndXBkYXRlIGludmFsaWRhdGUgbGF5ZXIgdGltZSBmcm9tIGVsZXMnKTtcblxuICBpZiAoZWxlcy5sZW5ndGggPT09IDAgfHwgIXNlbGYuaGF2ZUxheWVycygpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNlbGYudXBkYXRlRWxlbWVudHNJbkxheWVycyhlbGVzLCBmdW5jdGlvbiBpbnZhbEFzc29jTGF5ZXJzKGxheWVyLCBlbGUsIHJlcSkge1xuICAgIHNlbGYuaW52YWxpZGF0ZUxheWVyKGxheWVyKTtcbiAgfSk7XG59O1xuTFRDcC5pbnZhbGlkYXRlTGF5ZXIgPSBmdW5jdGlvbiAobGF5ZXIpIHtcbiAgLy8gbG9nKCd1cGRhdGUgaW52YWxpZGF0ZSBsYXllciB0aW1lJyk7XG5cbiAgdGhpcy5sYXN0SW52YWxpZGF0aW9uVGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gIGlmIChsYXllci5pbnZhbGlkKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIHNhdmUgY3ljbGVzXG5cbiAgdmFyIGx2bCA9IGxheWVyLmxldmVsO1xuICB2YXIgZWxlcyA9IGxheWVyLmVsZXM7XG4gIHZhciBsYXllcnMgPSB0aGlzLmxheWVyc0J5TGV2ZWxbbHZsXTtcblxuICAvLyBsb2coJ2ludmFsaWRhdGUgbGF5ZXInLCBsYXllci5pZCApO1xuXG4gIHJlbW92ZUZyb21BcnJheShsYXllcnMsIGxheWVyKTtcbiAgLy8gbGF5ZXIuZWxlcyA9IFtdO1xuXG4gIGxheWVyLmVsZXNRdWV1ZSA9IFtdO1xuICBsYXllci5pbnZhbGlkID0gdHJ1ZTtcbiAgaWYgKGxheWVyLnJlcGxhY2VtZW50KSB7XG4gICAgbGF5ZXIucmVwbGFjZW1lbnQuaW52YWxpZCA9IHRydWU7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNhY2hlcyA9IGVsZXNbaV0uX3ByaXZhdGUucnNjcmF0Y2guaW1nTGF5ZXJDYWNoZXM7XG4gICAgaWYgKGNhY2hlcykge1xuICAgICAgY2FjaGVzW2x2bF0gPSBudWxsO1xuICAgIH1cbiAgfVxufTtcbkxUQ3AucmVmaW5lRWxlbWVudFRleHR1cmVzID0gZnVuY3Rpb24gKGVsZXMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIC8vIGxvZygncmVmaW5lJywgZWxlcy5sZW5ndGgpO1xuXG4gIHNlbGYudXBkYXRlRWxlbWVudHNJbkxheWVycyhlbGVzLCBmdW5jdGlvbiByZWZpbmVFYWNoRWxlKGxheWVyLCBlbGUsIHJlcSkge1xuICAgIHZhciByTHlyID0gbGF5ZXIucmVwbGFjZW1lbnQ7XG4gICAgaWYgKCFyTHlyKSB7XG4gICAgICByTHlyID0gbGF5ZXIucmVwbGFjZW1lbnQgPSBzZWxmLm1ha2VMYXllcihsYXllci5iYiwgbGF5ZXIubGV2ZWwpO1xuICAgICAgckx5ci5yZXBsYWNlcyA9IGxheWVyO1xuICAgICAgckx5ci5lbGVzID0gbGF5ZXIuZWxlcztcblxuICAgICAgLy8gbG9nKCdtYWtlIHJlcGxhY2VtZW50IGxheWVyICVzIGZvciAlcyB3aXRoIGxldmVsICVzJywgckx5ci5pZCwgbGF5ZXIuaWQsIHJMeXIubGV2ZWwpO1xuICAgIH1cblxuICAgIGlmICghckx5ci5yZXFzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJMeXIuZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzZWxmLnF1ZXVlTGF5ZXIockx5ciwgckx5ci5lbGVzW2ldKTtcbiAgICAgIH1cblxuICAgICAgLy8gbG9nKCdxdWV1ZSByZXBsYWNlbWVudCBsYXllciByZWZpbmVtZW50Jywgckx5ci5pZCk7XG4gICAgfVxuICB9KTtcbn07XG5cbkxUQ3AuZW5xdWV1ZUVsZW1lbnRSZWZpbmVtZW50ID0gZnVuY3Rpb24gKGVsZSkge1xuICB0aGlzLmVsZVR4ckRlcXMubWVyZ2UoZWxlKTtcbiAgdGhpcy5zY2hlZHVsZUVsZW1lbnRSZWZpbmVtZW50KCk7XG59O1xuTFRDcC5xdWV1ZUxheWVyID0gZnVuY3Rpb24gKGxheWVyLCBlbGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcSA9IHNlbGYubGF5ZXJzUXVldWU7XG4gIHZhciBlbGVzUSA9IGxheWVyLmVsZXNRdWV1ZTtcbiAgdmFyIGhhc0lkID0gZWxlc1EuaGFzSWQgPSBlbGVzUS5oYXNJZCB8fCB7fTtcblxuICAvLyBpZiBhIGxheWVyIGlzIGdvaW5nIHRvIGJlIHJlcGxhY2VkLCBxdWV1aW5nIGlzIGEgd2FzdGUgb2YgdGltZVxuICBpZiAobGF5ZXIucmVwbGFjZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGVsZSkge1xuICAgIGlmIChoYXNJZFtlbGUuaWQoKV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxlc1EucHVzaChlbGUpO1xuICAgIGhhc0lkW2VsZS5pZCgpXSA9IHRydWU7XG4gIH1cbiAgaWYgKGxheWVyLnJlcXMpIHtcbiAgICBsYXllci5yZXFzKys7XG4gICAgcS51cGRhdGVJdGVtKGxheWVyKTtcbiAgfSBlbHNlIHtcbiAgICBsYXllci5yZXFzID0gMTtcbiAgICBxLnB1c2gobGF5ZXIpO1xuICB9XG59O1xuTFRDcC5kZXF1ZXVlID0gZnVuY3Rpb24gKHB4UmF0aW8pIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcSA9IHNlbGYubGF5ZXJzUXVldWU7XG4gIHZhciBkZXFkID0gW107XG4gIHZhciBlbGVEZXFzID0gMDtcbiAgd2hpbGUgKGVsZURlcXMgPCBtYXhEZXFTaXplKSB7XG4gICAgaWYgKHEuc2l6ZSgpID09PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIGxheWVyID0gcS5wZWVrKCk7XG5cbiAgICAvLyBpZiBhIGxheWVyIGhhcyBiZWVuIG9yIHdpbGwgYmUgcmVwbGFjZWQsIHRoZW4gZG9uJ3Qgd2FzdGUgdGltZSB3aXRoIGl0XG4gICAgaWYgKGxheWVyLnJlcGxhY2VtZW50KSB7XG4gICAgICAvLyBsb2coJ2xheWVyICVzIGluIHF1ZXVlIHNraXBwZWQgYi9jIGl0IGFscmVhZHkgaGFzIGEgcmVwbGFjZW1lbnQnLCBsYXllci5pZCk7XG4gICAgICBxLnBvcCgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhpcyBpcyBhIHJlcGxhY2VtZW50IGxheWVyIHRoYXQgaGFzIGJlZW4gc3VwZXJjZWRlZCwgdGhlbiBmb3JnZXQgaXRcbiAgICBpZiAobGF5ZXIucmVwbGFjZXMgJiYgbGF5ZXIgIT09IGxheWVyLnJlcGxhY2VzLnJlcGxhY2VtZW50KSB7XG4gICAgICAvLyBsb2coJ2xheWVyIGlzIG5vIGxvbmdlciB0aGUgbW9zdCB1cHRvZGF0ZSByZXBsYWNlbWVudDsgZGVxdWV1ZWQnLCBsYXllci5pZClcbiAgICAgIHEucG9wKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGxheWVyLmludmFsaWQpIHtcbiAgICAgIC8vIGxvZygncmVwbGFjZW1lbnQgbGF5ZXIgJXMgaXMgaW52YWxpZDsgZGVxdWV1ZWQnLCBsYXllci5pZCk7XG4gICAgICBxLnBvcCgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBlbGUgPSBsYXllci5lbGVzUXVldWUuc2hpZnQoKTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICAvLyBsb2coJ2RlcXVldWUgbGF5ZXIgJXMnLCBsYXllci5pZCk7XG5cbiAgICAgIHNlbGYuZHJhd0VsZUluTGF5ZXIobGF5ZXIsIGVsZSwgbGF5ZXIubGV2ZWwsIHB4UmF0aW8pO1xuICAgICAgZWxlRGVxcysrO1xuICAgIH1cbiAgICBpZiAoZGVxZC5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIHdlIG5lZWQgb25seSBvbmUgZW50cnkgaW4gZGVxZCB0byBxdWV1ZSByZWRyYXdpbmcgZXRjXG4gICAgICBkZXFkLnB1c2godHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIGxheWVyIGhhcyBhbGwgaXRzIGVsZXMgZG9uZSwgdGhlbiByZW1vdmUgZnJvbSB0aGUgcXVldWVcbiAgICBpZiAobGF5ZXIuZWxlc1F1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcS5wb3AoKTtcbiAgICAgIGxheWVyLnJlcXMgPSAwO1xuXG4gICAgICAvLyBsb2coJ2RlcXVldWUgb2YgbGF5ZXIgJXMgY29tcGxldGUnLCBsYXllci5pZCk7XG5cbiAgICAgIC8vIHdoZW4gYSByZXBsYWNlbWVudCBsYXllciBpcyBkZXF1ZXVlZCwgaXQgcmVwbGFjZXMgdGhlIG9sZCBsYXllciBpbiB0aGUgbGV2ZWxcbiAgICAgIGlmIChsYXllci5yZXBsYWNlcykge1xuICAgICAgICBzZWxmLmFwcGx5TGF5ZXJSZXBsYWNlbWVudChsYXllcik7XG4gICAgICB9XG4gICAgICBzZWxmLnJlcXVlc3RSZWRyYXcoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlcWQ7XG59O1xuTFRDcC5hcHBseUxheWVyUmVwbGFjZW1lbnQgPSBmdW5jdGlvbiAobGF5ZXIpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgbGF5ZXJzSW5MZXZlbCA9IHNlbGYubGF5ZXJzQnlMZXZlbFtsYXllci5sZXZlbF07XG4gIHZhciByZXBsYWNlZCA9IGxheWVyLnJlcGxhY2VzO1xuICB2YXIgaW5kZXggPSBsYXllcnNJbkxldmVsLmluZGV4T2YocmVwbGFjZWQpO1xuXG4gIC8vIGlmIHRoZSByZXBsYWNlZCBsYXllciBpcyBub3QgaW4gdGhlIGFjdGl2ZSBsaXN0IGZvciB0aGUgbGV2ZWwsIHRoZW4gcmVwbGFjaW5nXG4gIC8vIHJlZnMgd291bGQgYmUgYSBtaXN0YWtlIChpLmUuIG92ZXJ3cml0aW5nIHRoZSB0cnVlIGFjdGl2ZSBsYXllcilcbiAgaWYgKGluZGV4IDwgMCB8fCByZXBsYWNlZC5pbnZhbGlkKSB7XG4gICAgLy8gbG9nKCdyZXBsYWNlbWVudCBsYXllciB3b3VsZCBoYXZlIG5vIGVmZmVjdCcsIGxheWVyLmlkKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbGF5ZXJzSW5MZXZlbFtpbmRleF0gPSBsYXllcjsgLy8gcmVwbGFjZSBsZXZlbCByZWZcblxuICAvLyByZXBsYWNlIHJlZnMgaW4gZWxlc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheWVyLmVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgX3AgPSBsYXllci5lbGVzW2ldLl9wcml2YXRlO1xuICAgIHZhciBjYWNoZSA9IF9wLmltZ0xheWVyQ2FjaGVzID0gX3AuaW1nTGF5ZXJDYWNoZXMgfHwge307XG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICBjYWNoZVtsYXllci5sZXZlbF0gPSBsYXllcjtcbiAgICB9XG4gIH1cblxuICAvLyBsb2coJ2FwcGx5IHJlcGxhY2VtZW50IGxheWVyICVzIG92ZXIgJXMnLCBsYXllci5pZCwgcmVwbGFjZWQuaWQpO1xuXG4gIHNlbGYucmVxdWVzdFJlZHJhdygpO1xufTtcbkxUQ3AucmVxdWVzdFJlZHJhdyA9IGRlYm91bmNlX19kZWZhdWx0W1wiZGVmYXVsdFwiXShmdW5jdGlvbiAoKSB7XG4gIHZhciByID0gdGhpcy5yZW5kZXJlcjtcbiAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICByLnJlZHJhdygpO1xufSwgMTAwKTtcbkxUQ3Auc2V0dXBEZXF1ZXVlaW5nID0gZGVmcy5zZXR1cERlcXVldWVpbmcoe1xuICBkZXFSZWRyYXdUaHJlc2hvbGQ6IGRlcVJlZHJhd1RocmVzaG9sZCxcbiAgZGVxQ29zdDogZGVxQ29zdCxcbiAgZGVxQXZnQ29zdDogZGVxQXZnQ29zdCxcbiAgZGVxTm9EcmF3Q29zdDogZGVxTm9EcmF3Q29zdCxcbiAgZGVxRmFzdENvc3Q6IGRlcUZhc3RDb3N0LFxuICBkZXE6IGZ1bmN0aW9uIGRlcShzZWxmLCBweFJhdGlvKSB7XG4gICAgcmV0dXJuIHNlbGYuZGVxdWV1ZShweFJhdGlvKTtcbiAgfSxcbiAgb25EZXFkOiBub29wJDEsXG4gIHNob3VsZFJlZHJhdzogdHJ1ZWlmeSxcbiAgcHJpb3JpdHk6IGZ1bmN0aW9uIHByaW9yaXR5KHNlbGYpIHtcbiAgICByZXR1cm4gc2VsZi5yZW5kZXJlci5iZWZvcmVSZW5kZXJQcmlvcml0aWVzLmx5clR4ckRlcTtcbiAgfVxufSk7XG5cbnZhciBDUnAkYSA9IHt9O1xudmFyIGltcGw7XG5mdW5jdGlvbiBwb2x5Z29uKGNvbnRleHQsIHBvaW50cykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwdCA9IHBvaW50c1tpXTtcbiAgICBjb250ZXh0LmxpbmVUbyhwdC54LCBwdC55KTtcbiAgfVxufVxuZnVuY3Rpb24gdHJpYW5nbGVCYWNrY3VydmUoY29udGV4dCwgcG9pbnRzLCBjb250cm9sUG9pbnQpIHtcbiAgdmFyIGZpcnN0UHQ7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHB0ID0gcG9pbnRzW2ldO1xuICAgIGlmIChpID09PSAwKSB7XG4gICAgICBmaXJzdFB0ID0gcHQ7XG4gICAgfVxuICAgIGNvbnRleHQubGluZVRvKHB0LngsIHB0LnkpO1xuICB9XG4gIGNvbnRleHQucXVhZHJhdGljQ3VydmVUbyhjb250cm9sUG9pbnQueCwgY29udHJvbFBvaW50LnksIGZpcnN0UHQueCwgZmlyc3RQdC55KTtcbn1cbmZ1bmN0aW9uIHRyaWFuZ2xlVGVlKGNvbnRleHQsIHRyaWFuZ2xlUG9pbnRzLCB0ZWVQb2ludHMpIHtcbiAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgfVxuICB2YXIgdHJpUHRzID0gdHJpYW5nbGVQb2ludHM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHJpUHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHB0ID0gdHJpUHRzW2ldO1xuICAgIGNvbnRleHQubGluZVRvKHB0LngsIHB0LnkpO1xuICB9XG4gIHZhciB0ZWVQdHMgPSB0ZWVQb2ludHM7XG4gIHZhciBmaXJzdFRlZVB0ID0gdGVlUG9pbnRzWzBdO1xuICBjb250ZXh0Lm1vdmVUbyhmaXJzdFRlZVB0LngsIGZpcnN0VGVlUHQueSk7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgdGVlUHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHB0ID0gdGVlUHRzW2ldO1xuICAgIGNvbnRleHQubGluZVRvKHB0LngsIHB0LnkpO1xuICB9XG4gIGlmIChjb250ZXh0LmNsb3NlUGF0aCkge1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNpcmNsZVRyaWFuZ2xlKGNvbnRleHQsIHRyaWFuZ2xlUG9pbnRzLCByeCwgcnksIHIpIHtcbiAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgfVxuICBjb250ZXh0LmFyYyhyeCwgcnksIHIsIDAsIE1hdGguUEkgKiAyLCBmYWxzZSk7XG4gIHZhciB0cmlQdHMgPSB0cmlhbmdsZVBvaW50cztcbiAgdmFyIGZpcnN0VHJQdCA9IHRyaVB0c1swXTtcbiAgY29udGV4dC5tb3ZlVG8oZmlyc3RUclB0LngsIGZpcnN0VHJQdC55KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmlQdHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHQgPSB0cmlQdHNbaV07XG4gICAgY29udGV4dC5saW5lVG8ocHQueCwgcHQueSk7XG4gIH1cbiAgaWYgKGNvbnRleHQuY2xvc2VQYXRoKSB7XG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgfVxufVxuZnVuY3Rpb24gY2lyY2xlKGNvbnRleHQsIHJ4LCByeSwgcikge1xuICBjb250ZXh0LmFyYyhyeCwgcnksIHIsIDAsIE1hdGguUEkgKiAyLCBmYWxzZSk7XG59XG5DUnAkYS5hcnJvd1NoYXBlSW1wbCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiAoaW1wbCB8fCAoaW1wbCA9IHtcbiAgICAncG9seWdvbic6IHBvbHlnb24sXG4gICAgJ3RyaWFuZ2xlLWJhY2tjdXJ2ZSc6IHRyaWFuZ2xlQmFja2N1cnZlLFxuICAgICd0cmlhbmdsZS10ZWUnOiB0cmlhbmdsZVRlZSxcbiAgICAnY2lyY2xlLXRyaWFuZ2xlJzogY2lyY2xlVHJpYW5nbGUsXG4gICAgJ3RyaWFuZ2xlLWNyb3NzJzogdHJpYW5nbGVUZWUsXG4gICAgJ2NpcmNsZSc6IGNpcmNsZVxuICB9KSlbbmFtZV07XG59O1xuXG52YXIgQ1JwJDkgPSB7fTtcbkNScCQ5LmRyYXdFbGVtZW50ID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgc2hpZnRUb09yaWdpbldpdGhCYiwgc2hvd0xhYmVsLCBzaG93T3ZlcmxheSwgc2hvd09wYWNpdHkpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgci5kcmF3Tm9kZShjb250ZXh0LCBlbGUsIHNoaWZ0VG9PcmlnaW5XaXRoQmIsIHNob3dMYWJlbCwgc2hvd092ZXJsYXksIHNob3dPcGFjaXR5KTtcbiAgfSBlbHNlIHtcbiAgICByLmRyYXdFZGdlKGNvbnRleHQsIGVsZSwgc2hpZnRUb09yaWdpbldpdGhCYiwgc2hvd0xhYmVsLCBzaG93T3ZlcmxheSwgc2hvd09wYWNpdHkpO1xuICB9XG59O1xuQ1JwJDkuZHJhd0VsZW1lbnRPdmVybGF5ID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSkge1xuICB2YXIgciA9IHRoaXM7XG4gIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICByLmRyYXdOb2RlT3ZlcmxheShjb250ZXh0LCBlbGUpO1xuICB9IGVsc2Uge1xuICAgIHIuZHJhd0VkZ2VPdmVybGF5KGNvbnRleHQsIGVsZSk7XG4gIH1cbn07XG5DUnAkOS5kcmF3RWxlbWVudFVuZGVybGF5ID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSkge1xuICB2YXIgciA9IHRoaXM7XG4gIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICByLmRyYXdOb2RlVW5kZXJsYXkoY29udGV4dCwgZWxlKTtcbiAgfSBlbHNlIHtcbiAgICByLmRyYXdFZGdlVW5kZXJsYXkoY29udGV4dCwgZWxlKTtcbiAgfVxufTtcbkNScCQ5LmRyYXdDYWNoZWRFbGVtZW50UG9ydGlvbiA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUsIGVsZVR4ckNhY2hlLCBweFJhdGlvLCBsdmwsIHJlYXNvbiwgZ2V0Um90YXRpb24sIGdldE9wYWNpdHkpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgYmIgPSBlbGVUeHJDYWNoZS5nZXRCb3VuZGluZ0JveChlbGUpO1xuICBpZiAoYmIudyA9PT0gMCB8fCBiYi5oID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIGlnbm9yZSB6ZXJvIHNpemUgY2FzZVxuXG4gIHZhciBlbGVDYWNoZSA9IGVsZVR4ckNhY2hlLmdldEVsZW1lbnQoZWxlLCBiYiwgcHhSYXRpbywgbHZsLCByZWFzb24pO1xuICBpZiAoZWxlQ2FjaGUgIT0gbnVsbCkge1xuICAgIHZhciBvcGFjaXR5ID0gZ2V0T3BhY2l0eShyLCBlbGUpO1xuICAgIGlmIChvcGFjaXR5ID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aGV0YSA9IGdldFJvdGF0aW9uKHIsIGVsZSk7XG4gICAgdmFyIHgxID0gYmIueDEsXG4gICAgICB5MSA9IGJiLnkxLFxuICAgICAgdyA9IGJiLncsXG4gICAgICBoID0gYmIuaDtcbiAgICB2YXIgeCwgeSwgc3gsIHN5LCBzbW9vdGg7XG4gICAgaWYgKHRoZXRhICE9PSAwKSB7XG4gICAgICB2YXIgcm90UHQgPSBlbGVUeHJDYWNoZS5nZXRSb3RhdGlvblBvaW50KGVsZSk7XG4gICAgICBzeCA9IHJvdFB0Lng7XG4gICAgICBzeSA9IHJvdFB0Lnk7XG4gICAgICBjb250ZXh0LnRyYW5zbGF0ZShzeCwgc3kpO1xuICAgICAgY29udGV4dC5yb3RhdGUodGhldGEpO1xuICAgICAgc21vb3RoID0gci5nZXRJbWdTbW9vdGhpbmcoY29udGV4dCk7XG4gICAgICBpZiAoIXNtb290aCkge1xuICAgICAgICByLnNldEltZ1Ntb290aGluZyhjb250ZXh0LCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHZhciBvZmYgPSBlbGVUeHJDYWNoZS5nZXRSb3RhdGlvbk9mZnNldChlbGUpO1xuICAgICAgeCA9IG9mZi54O1xuICAgICAgeSA9IG9mZi55O1xuICAgIH0gZWxzZSB7XG4gICAgICB4ID0geDE7XG4gICAgICB5ID0geTE7XG4gICAgfVxuICAgIHZhciBvbGRHbG9iYWxBbHBoYTtcbiAgICBpZiAob3BhY2l0eSAhPT0gMSkge1xuICAgICAgb2xkR2xvYmFsQWxwaGEgPSBjb250ZXh0Lmdsb2JhbEFscGhhO1xuICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IG9sZEdsb2JhbEFscGhhICogb3BhY2l0eTtcbiAgICB9XG4gICAgY29udGV4dC5kcmF3SW1hZ2UoZWxlQ2FjaGUudGV4dHVyZS5jYW52YXMsIGVsZUNhY2hlLngsIDAsIGVsZUNhY2hlLndpZHRoLCBlbGVDYWNoZS5oZWlnaHQsIHgsIHksIHcsIGgpO1xuICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7XG4gICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb2xkR2xvYmFsQWxwaGE7XG4gICAgfVxuICAgIGlmICh0aGV0YSAhPT0gMCkge1xuICAgICAgY29udGV4dC5yb3RhdGUoLXRoZXRhKTtcbiAgICAgIGNvbnRleHQudHJhbnNsYXRlKC1zeCwgLXN5KTtcbiAgICAgIGlmICghc21vb3RoKSB7XG4gICAgICAgIHIuc2V0SW1nU21vb3RoaW5nKGNvbnRleHQsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZWxlVHhyQ2FjaGUuZHJhd0VsZW1lbnQoY29udGV4dCwgZWxlKTsgLy8gZGlyZWN0IGRyYXcgZmFsbGJhY2tcbiAgfVxufTtcblxudmFyIGdldFplcm9Sb3RhdGlvbiA9IGZ1bmN0aW9uIGdldFplcm9Sb3RhdGlvbigpIHtcbiAgcmV0dXJuIDA7XG59O1xudmFyIGdldExhYmVsUm90YXRpb24gPSBmdW5jdGlvbiBnZXRMYWJlbFJvdGF0aW9uKHIsIGVsZSkge1xuICByZXR1cm4gci5nZXRUZXh0QW5nbGUoZWxlLCBudWxsKTtcbn07XG52YXIgZ2V0U291cmNlTGFiZWxSb3RhdGlvbiA9IGZ1bmN0aW9uIGdldFNvdXJjZUxhYmVsUm90YXRpb24ociwgZWxlKSB7XG4gIHJldHVybiByLmdldFRleHRBbmdsZShlbGUsICdzb3VyY2UnKTtcbn07XG52YXIgZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvbiA9IGZ1bmN0aW9uIGdldFRhcmdldExhYmVsUm90YXRpb24ociwgZWxlKSB7XG4gIHJldHVybiByLmdldFRleHRBbmdsZShlbGUsICd0YXJnZXQnKTtcbn07XG52YXIgZ2V0T3BhY2l0eSA9IGZ1bmN0aW9uIGdldE9wYWNpdHkociwgZWxlKSB7XG4gIHJldHVybiBlbGUuZWZmZWN0aXZlT3BhY2l0eSgpO1xufTtcbnZhciBnZXRUZXh0T3BhY2l0eSA9IGZ1bmN0aW9uIGdldFRleHRPcGFjaXR5KGUsIGVsZSkge1xuICByZXR1cm4gZWxlLnBzdHlsZSgndGV4dC1vcGFjaXR5JykucGZWYWx1ZSAqIGVsZS5lZmZlY3RpdmVPcGFjaXR5KCk7XG59O1xuQ1JwJDkuZHJhd0NhY2hlZEVsZW1lbnQgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBweFJhdGlvLCBleHRlbnQsIGx2bCwgcmVxdWVzdEhpZ2hRdWFsaXR5KSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIF9yJGRhdGEgPSByLmRhdGEsXG4gICAgZWxlVHhyQ2FjaGUgPSBfciRkYXRhLmVsZVR4ckNhY2hlLFxuICAgIGxibFR4ckNhY2hlID0gX3IkZGF0YS5sYmxUeHJDYWNoZSxcbiAgICBzbGJUeHJDYWNoZSA9IF9yJGRhdGEuc2xiVHhyQ2FjaGUsXG4gICAgdGxiVHhyQ2FjaGUgPSBfciRkYXRhLnRsYlR4ckNhY2hlO1xuICB2YXIgYmIgPSBlbGUuYm91bmRpbmdCb3goKTtcbiAgdmFyIHJlYXNvbiA9IHJlcXVlc3RIaWdoUXVhbGl0eSA9PT0gdHJ1ZSA/IGVsZVR4ckNhY2hlLnJlYXNvbnMuaGlnaFF1YWxpdHkgOiBudWxsO1xuICBpZiAoYmIudyA9PT0gMCB8fCBiYi5oID09PSAwIHx8ICFlbGUudmlzaWJsZSgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghZXh0ZW50IHx8IGJvdW5kaW5nQm94ZXNJbnRlcnNlY3QoYmIsIGV4dGVudCkpIHtcbiAgICB2YXIgaXNFZGdlID0gZWxlLmlzRWRnZSgpO1xuICAgIHZhciBiYWRMaW5lID0gZWxlLmVsZW1lbnQoKS5fcHJpdmF0ZS5yc2NyYXRjaC5iYWRMaW5lO1xuICAgIHIuZHJhd0VsZW1lbnRVbmRlcmxheShjb250ZXh0LCBlbGUpO1xuICAgIHIuZHJhd0NhY2hlZEVsZW1lbnRQb3J0aW9uKGNvbnRleHQsIGVsZSwgZWxlVHhyQ2FjaGUsIHB4UmF0aW8sIGx2bCwgcmVhc29uLCBnZXRaZXJvUm90YXRpb24sIGdldE9wYWNpdHkpO1xuICAgIGlmICghaXNFZGdlIHx8ICFiYWRMaW5lKSB7XG4gICAgICByLmRyYXdDYWNoZWRFbGVtZW50UG9ydGlvbihjb250ZXh0LCBlbGUsIGxibFR4ckNhY2hlLCBweFJhdGlvLCBsdmwsIHJlYXNvbiwgZ2V0TGFiZWxSb3RhdGlvbiwgZ2V0VGV4dE9wYWNpdHkpO1xuICAgIH1cbiAgICBpZiAoaXNFZGdlICYmICFiYWRMaW5lKSB7XG4gICAgICByLmRyYXdDYWNoZWRFbGVtZW50UG9ydGlvbihjb250ZXh0LCBlbGUsIHNsYlR4ckNhY2hlLCBweFJhdGlvLCBsdmwsIHJlYXNvbiwgZ2V0U291cmNlTGFiZWxSb3RhdGlvbiwgZ2V0VGV4dE9wYWNpdHkpO1xuICAgICAgci5kcmF3Q2FjaGVkRWxlbWVudFBvcnRpb24oY29udGV4dCwgZWxlLCB0bGJUeHJDYWNoZSwgcHhSYXRpbywgbHZsLCByZWFzb24sIGdldFRhcmdldExhYmVsUm90YXRpb24sIGdldFRleHRPcGFjaXR5KTtcbiAgICB9XG4gICAgci5kcmF3RWxlbWVudE92ZXJsYXkoY29udGV4dCwgZWxlKTtcbiAgfVxufTtcbkNScCQ5LmRyYXdFbGVtZW50cyA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGVzKSB7XG4gIHZhciByID0gdGhpcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgci5kcmF3RWxlbWVudChjb250ZXh0LCBlbGUpO1xuICB9XG59O1xuQ1JwJDkuZHJhd0NhY2hlZEVsZW1lbnRzID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZXMsIHB4UmF0aW8sIGV4dGVudCkge1xuICB2YXIgciA9IHRoaXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHIuZHJhd0NhY2hlZEVsZW1lbnQoY29udGV4dCwgZWxlLCBweFJhdGlvLCBleHRlbnQpO1xuICB9XG59O1xuQ1JwJDkuZHJhd0NhY2hlZE5vZGVzID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZXMsIHB4UmF0aW8sIGV4dGVudCkge1xuICB2YXIgciA9IHRoaXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIGlmICghZWxlLmlzTm9kZSgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgci5kcmF3Q2FjaGVkRWxlbWVudChjb250ZXh0LCBlbGUsIHB4UmF0aW8sIGV4dGVudCk7XG4gIH1cbn07XG5DUnAkOS5kcmF3TGF5ZXJlZEVsZW1lbnRzID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZXMsIHB4UmF0aW8sIGV4dGVudCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBsYXllcnMgPSByLmRhdGEubHlyVHhyQ2FjaGUuZ2V0TGF5ZXJzKGVsZXMsIHB4UmF0aW8pO1xuICBpZiAobGF5ZXJzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBsYXllciA9IGxheWVyc1tpXTtcbiAgICAgIHZhciBiYiA9IGxheWVyLmJiO1xuICAgICAgaWYgKGJiLncgPT09IDAgfHwgYmIuaCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGxheWVyLmNhbnZhcywgYmIueDEsIGJiLnkxLCBiYi53LCBiYi5oKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gZmFsbCBiYWNrIG9uIHBsYWluIGNhY2hpbmcgaWYgbm8gbGF5ZXJzXG4gICAgci5kcmF3Q2FjaGVkRWxlbWVudHMoY29udGV4dCwgZWxlcywgcHhSYXRpbywgZXh0ZW50KTtcbiAgfVxufTtcblxuLyogZ2xvYmFsIFBhdGgyRCAqL1xudmFyIENScCQ4ID0ge307XG5DUnAkOC5kcmF3RWRnZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlZGdlLCBzaGlmdFRvT3JpZ2luV2l0aEJiKSB7XG4gIHZhciBkcmF3TGFiZWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHRydWU7XG4gIHZhciBzaG91bGREcmF3T3ZlcmxheSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdHJ1ZTtcbiAgdmFyIHNob3VsZERyYXdPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiB0cnVlO1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIGlmIChzaG91bGREcmF3T3BhY2l0eSAmJiAhZWRnZS52aXNpYmxlKCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBpZiBiZXppZXIgY3RybCBwdHMgY2FuIG5vdCBiZSBjYWxjdWxhdGVkLCB0aGVuIGRpZVxuICBpZiAocnMuYmFkTGluZSB8fCBycy5hbGxwdHMgPT0gbnVsbCB8fCBpc05hTihycy5hbGxwdHNbMF0pKSB7XG4gICAgLy8gaXNOYU4gaW4gY2FzZSBlZGdlIGlzIGltcG9zc2libGUgYW5kIGJyb3dzZXIgYnVncyAoZS5nLiBzYWZhcmkpXG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBiYjtcbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBiYiA9IHNoaWZ0VG9PcmlnaW5XaXRoQmI7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLWJiLngxLCAtYmIueTEpO1xuICB9XG4gIHZhciBvcGFjaXR5ID0gc2hvdWxkRHJhd09wYWNpdHkgPyBlZGdlLnBzdHlsZSgnb3BhY2l0eScpLnZhbHVlIDogMTtcbiAgdmFyIGxpbmVPcGFjaXR5ID0gc2hvdWxkRHJhd09wYWNpdHkgPyBlZGdlLnBzdHlsZSgnbGluZS1vcGFjaXR5JykudmFsdWUgOiAxO1xuICB2YXIgY3VydmVTdHlsZSA9IGVkZ2UucHN0eWxlKCdjdXJ2ZS1zdHlsZScpLnZhbHVlO1xuICB2YXIgbGluZVN0eWxlID0gZWRnZS5wc3R5bGUoJ2xpbmUtc3R5bGUnKS52YWx1ZTtcbiAgdmFyIGVkZ2VXaWR0aCA9IGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWU7XG4gIHZhciBsaW5lQ2FwID0gZWRnZS5wc3R5bGUoJ2xpbmUtY2FwJykudmFsdWU7XG4gIHZhciBlZmZlY3RpdmVMaW5lT3BhY2l0eSA9IG9wYWNpdHkgKiBsaW5lT3BhY2l0eTtcbiAgLy8gc2VwYXJhdGUgYXJyb3cgb3BhY2l0eSB3b3VsZCByZXF1aXJlIGFycm93LW9wYWNpdHkgcHJvcGVydHlcbiAgdmFyIGVmZmVjdGl2ZUFycm93T3BhY2l0eSA9IG9wYWNpdHkgKiBsaW5lT3BhY2l0eTtcbiAgdmFyIGRyYXdMaW5lID0gZnVuY3Rpb24gZHJhd0xpbmUoKSB7XG4gICAgdmFyIHN0cm9rZU9wYWNpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGVmZmVjdGl2ZUxpbmVPcGFjaXR5O1xuICAgIGlmIChjdXJ2ZVN0eWxlID09PSAnc3RyYWlnaHQtdHJpYW5nbGUnKSB7XG4gICAgICByLmVsZVN0cm9rZVN0eWxlKGNvbnRleHQsIGVkZ2UsIHN0cm9rZU9wYWNpdHkpO1xuICAgICAgci5kcmF3RWRnZVRyaWFuZ2xlUGF0aChlZGdlLCBjb250ZXh0LCBycy5hbGxwdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IGVkZ2VXaWR0aDtcbiAgICAgIGNvbnRleHQubGluZUNhcCA9IGxpbmVDYXA7XG4gICAgICByLmVsZVN0cm9rZVN0eWxlKGNvbnRleHQsIGVkZ2UsIHN0cm9rZU9wYWNpdHkpO1xuICAgICAgci5kcmF3RWRnZVBhdGgoZWRnZSwgY29udGV4dCwgcnMuYWxscHRzLCBsaW5lU3R5bGUpO1xuICAgICAgY29udGV4dC5saW5lQ2FwID0gJ2J1dHQnOyAvLyByZXNldCBmb3Igb3RoZXIgZHJhd2luZyBmdW5jdGlvbnNcbiAgICB9XG4gIH07XG5cbiAgdmFyIGRyYXdPdmVybGF5ID0gZnVuY3Rpb24gZHJhd092ZXJsYXkoKSB7XG4gICAgaWYgKCFzaG91bGREcmF3T3ZlcmxheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByLmRyYXdFZGdlT3ZlcmxheShjb250ZXh0LCBlZGdlKTtcbiAgfTtcbiAgdmFyIGRyYXdVbmRlcmxheSA9IGZ1bmN0aW9uIGRyYXdVbmRlcmxheSgpIHtcbiAgICBpZiAoIXNob3VsZERyYXdPdmVybGF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHIuZHJhd0VkZ2VVbmRlcmxheShjb250ZXh0LCBlZGdlKTtcbiAgfTtcbiAgdmFyIGRyYXdBcnJvd3MgPSBmdW5jdGlvbiBkcmF3QXJyb3dzKCkge1xuICAgIHZhciBhcnJvd09wYWNpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGVmZmVjdGl2ZUFycm93T3BhY2l0eTtcbiAgICByLmRyYXdBcnJvd2hlYWRzKGNvbnRleHQsIGVkZ2UsIGFycm93T3BhY2l0eSk7XG4gIH07XG4gIHZhciBkcmF3VGV4dCA9IGZ1bmN0aW9uIGRyYXdUZXh0KCkge1xuICAgIHIuZHJhd0VsZW1lbnRUZXh0KGNvbnRleHQsIGVkZ2UsIG51bGwsIGRyYXdMYWJlbCk7XG4gIH07XG4gIGNvbnRleHQubGluZUpvaW4gPSAncm91bmQnO1xuICB2YXIgZ2hvc3QgPSBlZGdlLnBzdHlsZSgnZ2hvc3QnKS52YWx1ZSA9PT0gJ3llcyc7XG4gIGlmIChnaG9zdCkge1xuICAgIHZhciBneCA9IGVkZ2UucHN0eWxlKCdnaG9zdC1vZmZzZXQteCcpLnBmVmFsdWU7XG4gICAgdmFyIGd5ID0gZWRnZS5wc3R5bGUoJ2dob3N0LW9mZnNldC15JykucGZWYWx1ZTtcbiAgICB2YXIgZ2hvc3RPcGFjaXR5ID0gZWRnZS5wc3R5bGUoJ2dob3N0LW9wYWNpdHknKS52YWx1ZTtcbiAgICB2YXIgZWZmZWN0aXZlR2hvc3RPcGFjaXR5ID0gZWZmZWN0aXZlTGluZU9wYWNpdHkgKiBnaG9zdE9wYWNpdHk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoZ3gsIGd5KTtcbiAgICBkcmF3TGluZShlZmZlY3RpdmVHaG9zdE9wYWNpdHkpO1xuICAgIGRyYXdBcnJvd3MoZWZmZWN0aXZlR2hvc3RPcGFjaXR5KTtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgtZ3gsIC1neSk7XG4gIH1cbiAgZHJhd1VuZGVybGF5KCk7XG4gIGRyYXdMaW5lKCk7XG4gIGRyYXdBcnJvd3MoKTtcbiAgZHJhd092ZXJsYXkoKTtcbiAgZHJhd1RleHQoKTtcbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZShiYi54MSwgYmIueTEpO1xuICB9XG59O1xudmFyIGRyYXdFZGdlT3ZlcmxheVVuZGVybGF5ID0gZnVuY3Rpb24gZHJhd0VkZ2VPdmVybGF5VW5kZXJsYXkob3ZlcmxheU9yVW5kZXJsYXkpIHtcbiAgaWYgKCFbJ292ZXJsYXknLCAndW5kZXJsYXknXS5pbmNsdWRlcyhvdmVybGF5T3JVbmRlcmxheSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RhdGUnKTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKGNvbnRleHQsIGVkZ2UpIHtcbiAgICBpZiAoIWVkZ2UudmlzaWJsZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBvcGFjaXR5ID0gZWRnZS5wc3R5bGUoXCJcIi5jb25jYXQob3ZlcmxheU9yVW5kZXJsYXksIFwiLW9wYWNpdHlcIikpLnZhbHVlO1xuICAgIGlmIChvcGFjaXR5ID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciByID0gdGhpcztcbiAgICB2YXIgdXNlUGF0aHMgPSByLnVzZVBhdGhzKCk7XG4gICAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICB2YXIgcGFkZGluZyA9IGVkZ2UucHN0eWxlKFwiXCIuY29uY2F0KG92ZXJsYXlPclVuZGVybGF5LCBcIi1wYWRkaW5nXCIpKS5wZlZhbHVlO1xuICAgIHZhciB3aWR0aCA9IDIgKiBwYWRkaW5nO1xuICAgIHZhciBjb2xvciA9IGVkZ2UucHN0eWxlKFwiXCIuY29uY2F0KG92ZXJsYXlPclVuZGVybGF5LCBcIi1jb2xvclwiKSkudmFsdWU7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSB3aWR0aDtcbiAgICBpZiAocnMuZWRnZVR5cGUgPT09ICdzZWxmJyAmJiAhdXNlUGF0aHMpIHtcbiAgICAgIGNvbnRleHQubGluZUNhcCA9ICdidXR0JztcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dC5saW5lQ2FwID0gJ3JvdW5kJztcbiAgICB9XG4gICAgci5jb2xvclN0cm9rZVN0eWxlKGNvbnRleHQsIGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0sIG9wYWNpdHkpO1xuICAgIHIuZHJhd0VkZ2VQYXRoKGVkZ2UsIGNvbnRleHQsIHJzLmFsbHB0cywgJ3NvbGlkJyk7XG4gIH07XG59O1xuQ1JwJDguZHJhd0VkZ2VPdmVybGF5ID0gZHJhd0VkZ2VPdmVybGF5VW5kZXJsYXkoJ292ZXJsYXknKTtcbkNScCQ4LmRyYXdFZGdlVW5kZXJsYXkgPSBkcmF3RWRnZU92ZXJsYXlVbmRlcmxheSgndW5kZXJsYXknKTtcbkNScCQ4LmRyYXdFZGdlUGF0aCA9IGZ1bmN0aW9uIChlZGdlLCBjb250ZXh0LCBwdHMsIHR5cGUpIHtcbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIGNhbnZhc0N4dCA9IGNvbnRleHQ7XG4gIHZhciBwYXRoO1xuICB2YXIgcGF0aENhY2hlSGl0ID0gZmFsc2U7XG4gIHZhciB1c2VQYXRocyA9IHRoaXMudXNlUGF0aHMoKTtcbiAgdmFyIGxpbmVEYXNoUGF0dGVybiA9IGVkZ2UucHN0eWxlKCdsaW5lLWRhc2gtcGF0dGVybicpLnBmVmFsdWU7XG4gIHZhciBsaW5lRGFzaE9mZnNldCA9IGVkZ2UucHN0eWxlKCdsaW5lLWRhc2gtb2Zmc2V0JykucGZWYWx1ZTtcbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgdmFyIHBhdGhDYWNoZUtleSA9IHB0cy5qb2luKCckJyk7XG4gICAgdmFyIGtleU1hdGNoZXMgPSBycy5wYXRoQ2FjaGVLZXkgJiYgcnMucGF0aENhY2hlS2V5ID09PSBwYXRoQ2FjaGVLZXk7XG4gICAgaWYgKGtleU1hdGNoZXMpIHtcbiAgICAgIHBhdGggPSBjb250ZXh0ID0gcnMucGF0aENhY2hlO1xuICAgICAgcGF0aENhY2hlSGl0ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aCA9IGNvbnRleHQgPSBuZXcgUGF0aDJEKCk7XG4gICAgICBycy5wYXRoQ2FjaGVLZXkgPSBwYXRoQ2FjaGVLZXk7XG4gICAgICBycy5wYXRoQ2FjaGUgPSBwYXRoO1xuICAgIH1cbiAgfVxuICBpZiAoY2FudmFzQ3h0LnNldExpbmVEYXNoKSB7XG4gICAgLy8gZm9yIHZlcnkgb3V0b2ZkYXRlIGJyb3dzZXJzXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdkb3R0ZWQnOlxuICAgICAgICBjYW52YXNDeHQuc2V0TGluZURhc2goWzEsIDFdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkYXNoZWQnOlxuICAgICAgICBjYW52YXNDeHQuc2V0TGluZURhc2gobGluZURhc2hQYXR0ZXJuKTtcbiAgICAgICAgY2FudmFzQ3h0LmxpbmVEYXNoT2Zmc2V0ID0gbGluZURhc2hPZmZzZXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc29saWQnOlxuICAgICAgICBjYW52YXNDeHQuc2V0TGluZURhc2goW10pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKCFwYXRoQ2FjaGVIaXQgJiYgIXJzLmJhZExpbmUpIHtcbiAgICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgfVxuICAgIGNvbnRleHQubW92ZVRvKHB0c1swXSwgcHRzWzFdKTtcbiAgICBzd2l0Y2ggKHJzLmVkZ2VUeXBlKSB7XG4gICAgICBjYXNlICdiZXppZXInOlxuICAgICAgY2FzZSAnc2VsZic6XG4gICAgICBjYXNlICdjb21wb3VuZCc6XG4gICAgICBjYXNlICdtdWx0aWJlemllcic6XG4gICAgICAgIGZvciAodmFyIGkgPSAyOyBpICsgMyA8IHB0cy5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICAgIGNvbnRleHQucXVhZHJhdGljQ3VydmVUbyhwdHNbaV0sIHB0c1tpICsgMV0sIHB0c1tpICsgMl0sIHB0c1tpICsgM10pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3RyYWlnaHQnOlxuICAgICAgY2FzZSAnc2VnbWVudHMnOlxuICAgICAgY2FzZSAnaGF5c3RhY2snOlxuICAgICAgICBmb3IgKHZhciBfaSA9IDI7IF9pICsgMSA8IHB0cy5sZW5ndGg7IF9pICs9IDIpIHtcbiAgICAgICAgICBjb250ZXh0LmxpbmVUbyhwdHNbX2ldLCBwdHNbX2kgKyAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGNvbnRleHQgPSBjYW52YXNDeHQ7XG4gIGlmICh1c2VQYXRocykge1xuICAgIGNvbnRleHQuc3Ryb2tlKHBhdGgpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gIH1cblxuICAvLyByZXNldCBhbnkgbGluZSBkYXNoZXNcbiAgaWYgKGNvbnRleHQuc2V0TGluZURhc2gpIHtcbiAgICAvLyBmb3IgdmVyeSBvdXRvZmRhdGUgYnJvd3NlcnNcbiAgICBjb250ZXh0LnNldExpbmVEYXNoKFtdKTtcbiAgfVxufTtcbkNScCQ4LmRyYXdFZGdlVHJpYW5nbGVQYXRoID0gZnVuY3Rpb24gKGVkZ2UsIGNvbnRleHQsIHB0cykge1xuICAvLyB1c2UgbGluZSBzdHJva2Ugc3R5bGUgZm9yIHRyaWFuZ2xlIGZpbGwgc3R5bGVcbiAgY29udGV4dC5maWxsU3R5bGUgPSBjb250ZXh0LnN0cm9rZVN0eWxlO1xuICB2YXIgZWRnZVdpZHRoID0gZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgKyAxIDwgcHRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIHZlY3RvciA9IFtwdHNbaSArIDJdIC0gcHRzW2ldLCBwdHNbaSArIDNdIC0gcHRzW2kgKyAxXV07XG4gICAgdmFyIGxlbmd0aCA9IE1hdGguc3FydCh2ZWN0b3JbMF0gKiB2ZWN0b3JbMF0gKyB2ZWN0b3JbMV0gKiB2ZWN0b3JbMV0pO1xuICAgIHZhciBub3JtYWwgPSBbdmVjdG9yWzFdIC8gbGVuZ3RoLCAtdmVjdG9yWzBdIC8gbGVuZ3RoXTtcbiAgICB2YXIgdHJpYW5nbGVIZWFkID0gW25vcm1hbFswXSAqIGVkZ2VXaWR0aCAvIDIsIG5vcm1hbFsxXSAqIGVkZ2VXaWR0aCAvIDJdO1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgY29udGV4dC5tb3ZlVG8ocHRzW2ldIC0gdHJpYW5nbGVIZWFkWzBdLCBwdHNbaSArIDFdIC0gdHJpYW5nbGVIZWFkWzFdKTtcbiAgICBjb250ZXh0LmxpbmVUbyhwdHNbaV0gKyB0cmlhbmdsZUhlYWRbMF0sIHB0c1tpICsgMV0gKyB0cmlhbmdsZUhlYWRbMV0pO1xuICAgIGNvbnRleHQubGluZVRvKHB0c1tpICsgMl0sIHB0c1tpICsgM10pO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgY29udGV4dC5maWxsKCk7XG4gIH1cbn07XG5DUnAkOC5kcmF3QXJyb3doZWFkcyA9IGZ1bmN0aW9uIChjb250ZXh0LCBlZGdlLCBvcGFjaXR5KSB7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBpc0hheXN0YWNrID0gcnMuZWRnZVR5cGUgPT09ICdoYXlzdGFjayc7XG4gIGlmICghaXNIYXlzdGFjaykge1xuICAgIHRoaXMuZHJhd0Fycm93aGVhZChjb250ZXh0LCBlZGdlLCAnc291cmNlJywgcnMuYXJyb3dTdGFydFgsIHJzLmFycm93U3RhcnRZLCBycy5zcmNBcnJvd0FuZ2xlLCBvcGFjaXR5KTtcbiAgfVxuICB0aGlzLmRyYXdBcnJvd2hlYWQoY29udGV4dCwgZWRnZSwgJ21pZC10YXJnZXQnLCBycy5taWRYLCBycy5taWRZLCBycy5taWR0Z3RBcnJvd0FuZ2xlLCBvcGFjaXR5KTtcbiAgdGhpcy5kcmF3QXJyb3doZWFkKGNvbnRleHQsIGVkZ2UsICdtaWQtc291cmNlJywgcnMubWlkWCwgcnMubWlkWSwgcnMubWlkc3JjQXJyb3dBbmdsZSwgb3BhY2l0eSk7XG4gIGlmICghaXNIYXlzdGFjaykge1xuICAgIHRoaXMuZHJhd0Fycm93aGVhZChjb250ZXh0LCBlZGdlLCAndGFyZ2V0JywgcnMuYXJyb3dFbmRYLCBycy5hcnJvd0VuZFksIHJzLnRndEFycm93QW5nbGUsIG9wYWNpdHkpO1xuICB9XG59O1xuQ1JwJDguZHJhd0Fycm93aGVhZCA9IGZ1bmN0aW9uIChjb250ZXh0LCBlZGdlLCBwcmVmaXgsIHgsIHksIGFuZ2xlLCBvcGFjaXR5KSB7XG4gIGlmIChpc05hTih4KSB8fCB4ID09IG51bGwgfHwgaXNOYU4oeSkgfHwgeSA9PSBudWxsIHx8IGlzTmFOKGFuZ2xlKSB8fCBhbmdsZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGFycm93U2hhcGUgPSBlZGdlLnBzdHlsZShwcmVmaXggKyAnLWFycm93LXNoYXBlJykudmFsdWU7XG4gIGlmIChhcnJvd1NoYXBlID09PSAnbm9uZScpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGFycm93Q2xlYXJGaWxsID0gZWRnZS5wc3R5bGUocHJlZml4ICsgJy1hcnJvdy1maWxsJykudmFsdWUgPT09ICdob2xsb3cnID8gJ2JvdGgnIDogJ2ZpbGxlZCc7XG4gIHZhciBhcnJvd0ZpbGwgPSBlZGdlLnBzdHlsZShwcmVmaXggKyAnLWFycm93LWZpbGwnKS52YWx1ZTtcbiAgdmFyIGVkZ2VXaWR0aCA9IGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWU7XG4gIHZhciBlZGdlT3BhY2l0eSA9IGVkZ2UucHN0eWxlKCdvcGFjaXR5JykudmFsdWU7XG4gIGlmIChvcGFjaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICBvcGFjaXR5ID0gZWRnZU9wYWNpdHk7XG4gIH1cbiAgdmFyIGdjbyA9IGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uO1xuICBpZiAob3BhY2l0eSAhPT0gMSB8fCBhcnJvd0ZpbGwgPT09ICdob2xsb3cnKSB7XG4gICAgLy8gdGhlbiBleHRyYSBjbGVhciBpcyBuZWVkZWRcbiAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdkZXN0aW5hdGlvbi1vdXQnO1xuICAgIHNlbGYuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgMjU1LCAyNTUsIDI1NSwgMSk7XG4gICAgc2VsZi5jb2xvclN0cm9rZVN0eWxlKGNvbnRleHQsIDI1NSwgMjU1LCAyNTUsIDEpO1xuICAgIHNlbGYuZHJhd0Fycm93U2hhcGUoZWRnZSwgY29udGV4dCwgYXJyb3dDbGVhckZpbGwsIGVkZ2VXaWR0aCwgYXJyb3dTaGFwZSwgeCwgeSwgYW5nbGUpO1xuICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gZ2NvO1xuICB9IC8vIG90aGVyd2lzZSwgdGhlIG9wYXF1ZSBhcnJvdyBjbGVhcnMgaXQgZm9yIGZyZWUgOilcblxuICB2YXIgY29sb3IgPSBlZGdlLnBzdHlsZShwcmVmaXggKyAnLWFycm93LWNvbG9yJykudmFsdWU7XG4gIHNlbGYuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgb3BhY2l0eSk7XG4gIHNlbGYuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgc2VsZi5kcmF3QXJyb3dTaGFwZShlZGdlLCBjb250ZXh0LCBhcnJvd0ZpbGwsIGVkZ2VXaWR0aCwgYXJyb3dTaGFwZSwgeCwgeSwgYW5nbGUpO1xufTtcbkNScCQ4LmRyYXdBcnJvd1NoYXBlID0gZnVuY3Rpb24gKGVkZ2UsIGNvbnRleHQsIGZpbGwsIGVkZ2VXaWR0aCwgc2hhcGUsIHgsIHksIGFuZ2xlKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIHVzZVBhdGhzID0gdGhpcy51c2VQYXRocygpICYmIHNoYXBlICE9PSAndHJpYW5nbGUtY3Jvc3MnO1xuICB2YXIgcGF0aENhY2hlSGl0ID0gZmFsc2U7XG4gIHZhciBwYXRoO1xuICB2YXIgY2FudmFzQ29udGV4dCA9IGNvbnRleHQ7XG4gIHZhciB0cmFuc2xhdGlvbiA9IHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcbiAgdmFyIHNjYWxlID0gZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykudmFsdWU7XG4gIHZhciBzaXplID0gdGhpcy5nZXRBcnJvd1dpZHRoKGVkZ2VXaWR0aCwgc2NhbGUpO1xuICB2YXIgc2hhcGVJbXBsID0gci5hcnJvd1NoYXBlc1tzaGFwZV07XG4gIGlmICh1c2VQYXRocykge1xuICAgIHZhciBjYWNoZSA9IHIuYXJyb3dQYXRoQ2FjaGUgPSByLmFycm93UGF0aENhY2hlIHx8IFtdO1xuICAgIHZhciBrZXkgPSBoYXNoU3RyaW5nKHNoYXBlKTtcbiAgICB2YXIgY2FjaGVkUGF0aCA9IGNhY2hlW2tleV07XG4gICAgaWYgKGNhY2hlZFBhdGggIT0gbnVsbCkge1xuICAgICAgcGF0aCA9IGNvbnRleHQgPSBjYWNoZWRQYXRoO1xuICAgICAgcGF0aENhY2hlSGl0ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aCA9IGNvbnRleHQgPSBuZXcgUGF0aDJEKCk7XG4gICAgICBjYWNoZVtrZXldID0gcGF0aDtcbiAgICB9XG4gIH1cbiAgaWYgKCFwYXRoQ2FjaGVIaXQpIHtcbiAgICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgfVxuICAgIGlmICh1c2VQYXRocykge1xuICAgICAgLy8gc3RvcmUgaW4gdGhlIHBhdGggY2FjaGUgd2l0aCB2YWx1ZXMgZWFzaWx5IG1hbmlwdWxhdGVkIGxhdGVyXG4gICAgICBzaGFwZUltcGwuZHJhdyhjb250ZXh0LCAxLCAwLCB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDBcbiAgICAgIH0sIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaGFwZUltcGwuZHJhdyhjb250ZXh0LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCk7XG4gICAgfVxuICAgIGlmIChjb250ZXh0LmNsb3NlUGF0aCkge1xuICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICB9XG4gIH1cbiAgY29udGV4dCA9IGNhbnZhc0NvbnRleHQ7XG4gIGlmICh1c2VQYXRocykge1xuICAgIC8vIHNldCB0cmFuc2Zvcm0gdG8gYXJyb3cgcG9zaXRpb24vb3JpZW50YXRpb25cbiAgICBjb250ZXh0LnRyYW5zbGF0ZSh4LCB5KTtcbiAgICBjb250ZXh0LnJvdGF0ZShhbmdsZSk7XG4gICAgY29udGV4dC5zY2FsZShzaXplLCBzaXplKTtcbiAgfVxuICBpZiAoZmlsbCA9PT0gJ2ZpbGxlZCcgfHwgZmlsbCA9PT0gJ2JvdGgnKSB7XG4gICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICBjb250ZXh0LmZpbGwocGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIH1cbiAgfVxuICBpZiAoZmlsbCA9PT0gJ2hvbGxvdycgfHwgZmlsbCA9PT0gJ2JvdGgnKSB7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSAoc2hhcGVJbXBsLm1hdGNoRWRnZVdpZHRoID8gZWRnZVdpZHRoIDogMSkgLyAodXNlUGF0aHMgPyBzaXplIDogMSk7XG4gICAgY29udGV4dC5saW5lSm9pbiA9ICdtaXRlcic7XG4gICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICBjb250ZXh0LnN0cm9rZShwYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dC5zdHJva2UoKTtcbiAgICB9XG4gIH1cbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgLy8gcmVzZXQgdHJhbnNmb3JtIGJ5IGFwcGx5aW5nIGludmVyc2VcbiAgICBjb250ZXh0LnNjYWxlKDEgLyBzaXplLCAxIC8gc2l6ZSk7XG4gICAgY29udGV4dC5yb3RhdGUoLWFuZ2xlKTtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgteCwgLXkpO1xuICB9XG59O1xuXG52YXIgQ1JwJDcgPSB7fTtcbkNScCQ3LnNhZmVEcmF3SW1hZ2UgPSBmdW5jdGlvbiAoY29udGV4dCwgaW1nLCBpeCwgaXksIGl3LCBpaCwgeCwgeSwgdywgaCkge1xuICAvLyBkZXRlY3QgcHJvYmxlbWF0aWMgY2FzZXMgZm9yIG9sZCBicm93c2VycyB3aXRoIGJhZCBpbWFnZXMgKGNoZWFwZXIgdGhhbiB0cnktY2F0Y2gpXG4gIGlmIChpdyA8PSAwIHx8IGloIDw9IDAgfHwgdyA8PSAwIHx8IGggPD0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgaXgsIGl5LCBpdywgaWgsIHgsIHksIHcsIGgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgd2FybihlKTtcbiAgfVxufTtcbkNScCQ3LmRyYXdJbnNjcmliZWRJbWFnZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBpbWcsIG5vZGUsIGluZGV4LCBub2RlT3BhY2l0eSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBwb3MgPSBub2RlLnBvc2l0aW9uKCk7XG4gIHZhciBub2RlWCA9IHBvcy54O1xuICB2YXIgbm9kZVkgPSBwb3MueTtcbiAgdmFyIHN0eWxlT2JqID0gbm9kZS5jeSgpLnN0eWxlKCk7XG4gIHZhciBnZXRJbmRleGVkU3R5bGUgPSBzdHlsZU9iai5nZXRJbmRleGVkU3R5bGUuYmluZChzdHlsZU9iaik7XG4gIHZhciBmaXQgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtZml0JywgJ3ZhbHVlJywgaW5kZXgpO1xuICB2YXIgcmVwZWF0ID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXJlcGVhdCcsICd2YWx1ZScsIGluZGV4KTtcbiAgdmFyIG5vZGVXID0gbm9kZS53aWR0aCgpO1xuICB2YXIgbm9kZUggPSBub2RlLmhlaWdodCgpO1xuICB2YXIgcGFkZGluZ1gyID0gbm9kZS5wYWRkaW5nKCkgKiAyO1xuICB2YXIgbm9kZVRXID0gbm9kZVcgKyAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXdpZHRoLXJlbGF0aXZlLXRvJywgJ3ZhbHVlJywgaW5kZXgpID09PSAnaW5uZXInID8gMCA6IHBhZGRpbmdYMik7XG4gIHZhciBub2RlVEggPSBub2RlSCArIChnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtaGVpZ2h0LXJlbGF0aXZlLXRvJywgJ3ZhbHVlJywgaW5kZXgpID09PSAnaW5uZXInID8gMCA6IHBhZGRpbmdYMik7XG4gIHZhciBycyA9IG5vZGUuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBjbGlwID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWNsaXAnLCAndmFsdWUnLCBpbmRleCk7XG4gIHZhciBzaG91bGRDbGlwID0gY2xpcCA9PT0gJ25vZGUnO1xuICB2YXIgaW1nT3BhY2l0eSA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1pbWFnZS1vcGFjaXR5JywgJ3ZhbHVlJywgaW5kZXgpICogbm9kZU9wYWNpdHk7XG4gIHZhciBzbW9vdGggPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtaW1hZ2Utc21vb3RoaW5nJywgJ3ZhbHVlJywgaW5kZXgpO1xuICB2YXIgaW1nVyA9IGltZy53aWR0aCB8fCBpbWcuY2FjaGVkVztcbiAgdmFyIGltZ0ggPSBpbWcuaGVpZ2h0IHx8IGltZy5jYWNoZWRIO1xuXG4gIC8vIHdvcmthcm91bmQgZm9yIGJyb2tlbiBicm93c2VycyBsaWtlIGllXG4gIGlmIChudWxsID09IGltZ1cgfHwgbnVsbCA9PSBpbWdIKSB7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpbWcpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgICBpbWdXID0gaW1nLmNhY2hlZFcgPSBpbWcud2lkdGggfHwgaW1nLm9mZnNldFdpZHRoO1xuICAgIGltZ0ggPSBpbWcuY2FjaGVkSCA9IGltZy5oZWlnaHQgfHwgaW1nLm9mZnNldEhlaWdodDtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGltZyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgfVxuXG4gIHZhciB3ID0gaW1nVztcbiAgdmFyIGggPSBpbWdIO1xuICBpZiAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXdpZHRoJywgJ3ZhbHVlJywgaW5kZXgpICE9PSAnYXV0bycpIHtcbiAgICBpZiAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXdpZHRoJywgJ3VuaXRzJywgaW5kZXgpID09PSAnJScpIHtcbiAgICAgIHcgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtd2lkdGgnLCAncGZWYWx1ZScsIGluZGV4KSAqIG5vZGVUVztcbiAgICB9IGVsc2Uge1xuICAgICAgdyA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC13aWR0aCcsICdwZlZhbHVlJywgaW5kZXgpO1xuICAgIH1cbiAgfVxuICBpZiAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWhlaWdodCcsICd2YWx1ZScsIGluZGV4KSAhPT0gJ2F1dG8nKSB7XG4gICAgaWYgKGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1oZWlnaHQnLCAndW5pdHMnLCBpbmRleCkgPT09ICclJykge1xuICAgICAgaCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1oZWlnaHQnLCAncGZWYWx1ZScsIGluZGV4KSAqIG5vZGVUSDtcbiAgICB9IGVsc2Uge1xuICAgICAgaCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1oZWlnaHQnLCAncGZWYWx1ZScsIGluZGV4KTtcbiAgICB9XG4gIH1cbiAgaWYgKHcgPT09IDAgfHwgaCA9PT0gMCkge1xuICAgIHJldHVybjsgLy8gbm8gcG9pbnQgaW4gZHJhd2luZyBlbXB0eSBpbWFnZSAoYW5kIGNocm9tZSBpcyBicm9rZW4gaW4gdGhpcyBjYXNlKVxuICB9XG5cbiAgaWYgKGZpdCA9PT0gJ2NvbnRhaW4nKSB7XG4gICAgdmFyIHNjYWxlID0gTWF0aC5taW4obm9kZVRXIC8gdywgbm9kZVRIIC8gaCk7XG4gICAgdyAqPSBzY2FsZTtcbiAgICBoICo9IHNjYWxlO1xuICB9IGVsc2UgaWYgKGZpdCA9PT0gJ2NvdmVyJykge1xuICAgIHZhciBzY2FsZSA9IE1hdGgubWF4KG5vZGVUVyAvIHcsIG5vZGVUSCAvIGgpO1xuICAgIHcgKj0gc2NhbGU7XG4gICAgaCAqPSBzY2FsZTtcbiAgfVxuICB2YXIgeCA9IG5vZGVYIC0gbm9kZVRXIC8gMjsgLy8gbGVmdFxuICB2YXIgcG9zWFVuaXRzID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXgnLCAndW5pdHMnLCBpbmRleCk7XG4gIHZhciBwb3NYUGZWYWwgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtcG9zaXRpb24teCcsICdwZlZhbHVlJywgaW5kZXgpO1xuICBpZiAocG9zWFVuaXRzID09PSAnJScpIHtcbiAgICB4ICs9IChub2RlVFcgLSB3KSAqIHBvc1hQZlZhbDtcbiAgfSBlbHNlIHtcbiAgICB4ICs9IHBvc1hQZlZhbDtcbiAgfVxuICB2YXIgb2ZmWFVuaXRzID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLW9mZnNldC14JywgJ3VuaXRzJywgaW5kZXgpO1xuICB2YXIgb2ZmWFBmVmFsID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLW9mZnNldC14JywgJ3BmVmFsdWUnLCBpbmRleCk7XG4gIGlmIChvZmZYVW5pdHMgPT09ICclJykge1xuICAgIHggKz0gKG5vZGVUVyAtIHcpICogb2ZmWFBmVmFsO1xuICB9IGVsc2Uge1xuICAgIHggKz0gb2ZmWFBmVmFsO1xuICB9XG4gIHZhciB5ID0gbm9kZVkgLSBub2RlVEggLyAyOyAvLyB0b3BcbiAgdmFyIHBvc1lVbml0cyA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1wb3NpdGlvbi15JywgJ3VuaXRzJywgaW5kZXgpO1xuICB2YXIgcG9zWVBmVmFsID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXknLCAncGZWYWx1ZScsIGluZGV4KTtcbiAgaWYgKHBvc1lVbml0cyA9PT0gJyUnKSB7XG4gICAgeSArPSAobm9kZVRIIC0gaCkgKiBwb3NZUGZWYWw7XG4gIH0gZWxzZSB7XG4gICAgeSArPSBwb3NZUGZWYWw7XG4gIH1cbiAgdmFyIG9mZllVbml0cyA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1vZmZzZXQteScsICd1bml0cycsIGluZGV4KTtcbiAgdmFyIG9mZllQZlZhbCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1vZmZzZXQteScsICdwZlZhbHVlJywgaW5kZXgpO1xuICBpZiAob2ZmWVVuaXRzID09PSAnJScpIHtcbiAgICB5ICs9IChub2RlVEggLSBoKSAqIG9mZllQZlZhbDtcbiAgfSBlbHNlIHtcbiAgICB5ICs9IG9mZllQZlZhbDtcbiAgfVxuICBpZiAocnMucGF0aENhY2hlKSB7XG4gICAgeCAtPSBub2RlWDtcbiAgICB5IC09IG5vZGVZO1xuICAgIG5vZGVYID0gMDtcbiAgICBub2RlWSA9IDA7XG4gIH1cbiAgdmFyIGdBbHBoYSA9IGNvbnRleHQuZ2xvYmFsQWxwaGE7XG4gIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBpbWdPcGFjaXR5O1xuICB2YXIgc21vb3RoaW5nRW5hYmxlZCA9IHIuZ2V0SW1nU21vb3RoaW5nKGNvbnRleHQpO1xuICB2YXIgaXNTbW9vdGhpbmdTd2l0Y2hlZCA9IGZhbHNlO1xuICBpZiAoc21vb3RoID09PSAnbm8nICYmIHNtb290aGluZ0VuYWJsZWQpIHtcbiAgICByLnNldEltZ1Ntb290aGluZyhjb250ZXh0LCBmYWxzZSk7XG4gICAgaXNTbW9vdGhpbmdTd2l0Y2hlZCA9IHRydWU7XG4gIH0gZWxzZSBpZiAoc21vb3RoID09PSAneWVzJyAmJiAhc21vb3RoaW5nRW5hYmxlZCkge1xuICAgIHIuc2V0SW1nU21vb3RoaW5nKGNvbnRleHQsIHRydWUpO1xuICAgIGlzU21vb3RoaW5nU3dpdGNoZWQgPSB0cnVlO1xuICB9XG4gIGlmIChyZXBlYXQgPT09ICduby1yZXBlYXQnKSB7XG4gICAgaWYgKHNob3VsZENsaXApIHtcbiAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgaWYgKHJzLnBhdGhDYWNoZSkge1xuICAgICAgICBjb250ZXh0LmNsaXAocnMucGF0aENhY2hlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHIubm9kZVNoYXBlc1tyLmdldE5vZGVTaGFwZShub2RlKV0uZHJhdyhjb250ZXh0LCBub2RlWCwgbm9kZVksIG5vZGVUVywgbm9kZVRIKTtcbiAgICAgICAgY29udGV4dC5jbGlwKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHIuc2FmZURyYXdJbWFnZShjb250ZXh0LCBpbWcsIDAsIDAsIGltZ1csIGltZ0gsIHgsIHksIHcsIGgpO1xuICAgIGlmIChzaG91bGRDbGlwKSB7XG4gICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIHBhdHRlcm4gPSBjb250ZXh0LmNyZWF0ZVBhdHRlcm4oaW1nLCByZXBlYXQpO1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gcGF0dGVybjtcbiAgICByLm5vZGVTaGFwZXNbci5nZXROb2RlU2hhcGUobm9kZSldLmRyYXcoY29udGV4dCwgbm9kZVgsIG5vZGVZLCBub2RlVFcsIG5vZGVUSCk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoeCwgeSk7XG4gICAgY29udGV4dC5maWxsKCk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLXgsIC15KTtcbiAgfVxuICBjb250ZXh0Lmdsb2JhbEFscGhhID0gZ0FscGhhO1xuICBpZiAoaXNTbW9vdGhpbmdTd2l0Y2hlZCkge1xuICAgIHIuc2V0SW1nU21vb3RoaW5nKGNvbnRleHQsIHNtb290aGluZ0VuYWJsZWQpO1xuICB9XG59O1xuXG52YXIgQ1JwJDYgPSB7fTtcbkNScCQ2LmVsZVRleHRCaWdnZXJUaGFuTWluID0gZnVuY3Rpb24gKGVsZSwgc2NhbGUpIHtcbiAgaWYgKCFzY2FsZSkge1xuICAgIHZhciB6b29tID0gZWxlLmN5KCkuem9vbSgpO1xuICAgIHZhciBweFJhdGlvID0gdGhpcy5nZXRQaXhlbFJhdGlvKCk7XG4gICAgdmFyIGx2bCA9IE1hdGguY2VpbChsb2cyKHpvb20gKiBweFJhdGlvKSk7IC8vIHRoZSBlZmZlY3RpdmUgdGV4dHVyZSBsZXZlbFxuXG4gICAgc2NhbGUgPSBNYXRoLnBvdygyLCBsdmwpO1xuICB9XG4gIHZhciBjb21wdXRlZFNpemUgPSBlbGUucHN0eWxlKCdmb250LXNpemUnKS5wZlZhbHVlICogc2NhbGU7XG4gIHZhciBtaW5TaXplID0gZWxlLnBzdHlsZSgnbWluLXpvb21lZC1mb250LXNpemUnKS5wZlZhbHVlO1xuICBpZiAoY29tcHV0ZWRTaXplIDwgbWluU2l6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5DUnAkNi5kcmF3RWxlbWVudFRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBzaGlmdFRvT3JpZ2luV2l0aEJiLCBmb3JjZSwgcHJlZml4KSB7XG4gIHZhciB1c2VFbGVPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiB0cnVlO1xuICB2YXIgciA9IHRoaXM7XG4gIGlmIChmb3JjZSA9PSBudWxsKSB7XG4gICAgaWYgKHVzZUVsZU9wYWNpdHkgJiYgIXIuZWxlVGV4dEJpZ2dlclRoYW5NaW4oZWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSBlbHNlIGlmIChmb3JjZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgIHZhciBsYWJlbCA9IGVsZS5wc3R5bGUoJ2xhYmVsJyk7XG4gICAgaWYgKCFsYWJlbCB8fCAhbGFiZWwudmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGp1c3RpZmljYXRpb24gPSByLmdldExhYmVsSnVzdGlmaWNhdGlvbihlbGUpO1xuICAgIGNvbnRleHQudGV4dEFsaWduID0ganVzdGlmaWNhdGlvbjtcbiAgICBjb250ZXh0LnRleHRCYXNlbGluZSA9ICdib3R0b20nO1xuICB9IGVsc2Uge1xuICAgIHZhciBiYWRMaW5lID0gZWxlLmVsZW1lbnQoKS5fcHJpdmF0ZS5yc2NyYXRjaC5iYWRMaW5lO1xuICAgIHZhciBfbGFiZWwgPSBlbGUucHN0eWxlKCdsYWJlbCcpO1xuICAgIHZhciBzcmNMYWJlbCA9IGVsZS5wc3R5bGUoJ3NvdXJjZS1sYWJlbCcpO1xuICAgIHZhciB0Z3RMYWJlbCA9IGVsZS5wc3R5bGUoJ3RhcmdldC1sYWJlbCcpO1xuICAgIGlmIChiYWRMaW5lIHx8ICghX2xhYmVsIHx8ICFfbGFiZWwudmFsdWUpICYmICghc3JjTGFiZWwgfHwgIXNyY0xhYmVsLnZhbHVlKSAmJiAoIXRndExhYmVsIHx8ICF0Z3RMYWJlbC52YWx1ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29udGV4dC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICBjb250ZXh0LnRleHRCYXNlbGluZSA9ICdib3R0b20nO1xuICB9XG4gIHZhciBhcHBseVJvdGF0aW9uID0gIXNoaWZ0VG9PcmlnaW5XaXRoQmI7XG4gIHZhciBiYjtcbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBiYiA9IHNoaWZ0VG9PcmlnaW5XaXRoQmI7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLWJiLngxLCAtYmIueTEpO1xuICB9XG4gIGlmIChwcmVmaXggPT0gbnVsbCkge1xuICAgIHIuZHJhd1RleHQoY29udGV4dCwgZWxlLCBudWxsLCBhcHBseVJvdGF0aW9uLCB1c2VFbGVPcGFjaXR5KTtcbiAgICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgICByLmRyYXdUZXh0KGNvbnRleHQsIGVsZSwgJ3NvdXJjZScsIGFwcGx5Um90YXRpb24sIHVzZUVsZU9wYWNpdHkpO1xuICAgICAgci5kcmF3VGV4dChjb250ZXh0LCBlbGUsICd0YXJnZXQnLCBhcHBseVJvdGF0aW9uLCB1c2VFbGVPcGFjaXR5KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgci5kcmF3VGV4dChjb250ZXh0LCBlbGUsIHByZWZpeCwgYXBwbHlSb3RhdGlvbiwgdXNlRWxlT3BhY2l0eSk7XG4gIH1cbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZShiYi54MSwgYmIueTEpO1xuICB9XG59O1xuQ1JwJDYuZ2V0Rm9udENhY2hlID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgdmFyIGNhY2hlO1xuICB0aGlzLmZvbnRDYWNoZXMgPSB0aGlzLmZvbnRDYWNoZXMgfHwgW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5mb250Q2FjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2FjaGUgPSB0aGlzLmZvbnRDYWNoZXNbaV07XG4gICAgaWYgKGNhY2hlLmNvbnRleHQgPT09IGNvbnRleHQpIHtcbiAgICAgIHJldHVybiBjYWNoZTtcbiAgICB9XG4gIH1cbiAgY2FjaGUgPSB7XG4gICAgY29udGV4dDogY29udGV4dFxuICB9O1xuICB0aGlzLmZvbnRDYWNoZXMucHVzaChjYWNoZSk7XG4gIHJldHVybiBjYWNoZTtcbn07XG5cbi8vIHNldCB1cCBjYW52YXMgY29udGV4dCB3aXRoIGZvbnRcbi8vIHJldHVybnMgdHJhbnNmb3JtZWQgdGV4dCBzdHJpbmdcbkNScCQ2LnNldHVwVGV4dFN0eWxlID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSkge1xuICB2YXIgdXNlRWxlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcbiAgLy8gRm9udCBzdHlsZVxuICB2YXIgbGFiZWxTdHlsZSA9IGVsZS5wc3R5bGUoJ2ZvbnQtc3R5bGUnKS5zdHJWYWx1ZTtcbiAgdmFyIGxhYmVsU2l6ZSA9IGVsZS5wc3R5bGUoJ2ZvbnQtc2l6ZScpLnBmVmFsdWUgKyAncHgnO1xuICB2YXIgbGFiZWxGYW1pbHkgPSBlbGUucHN0eWxlKCdmb250LWZhbWlseScpLnN0clZhbHVlO1xuICB2YXIgbGFiZWxXZWlnaHQgPSBlbGUucHN0eWxlKCdmb250LXdlaWdodCcpLnN0clZhbHVlO1xuICB2YXIgb3BhY2l0eSA9IHVzZUVsZU9wYWNpdHkgPyBlbGUuZWZmZWN0aXZlT3BhY2l0eSgpICogZWxlLnBzdHlsZSgndGV4dC1vcGFjaXR5JykudmFsdWUgOiAxO1xuICB2YXIgb3V0bGluZU9wYWNpdHkgPSBlbGUucHN0eWxlKCd0ZXh0LW91dGxpbmUtb3BhY2l0eScpLnZhbHVlICogb3BhY2l0eTtcbiAgdmFyIGNvbG9yID0gZWxlLnBzdHlsZSgnY29sb3InKS52YWx1ZTtcbiAgdmFyIG91dGxpbmVDb2xvciA9IGVsZS5wc3R5bGUoJ3RleHQtb3V0bGluZS1jb2xvcicpLnZhbHVlO1xuICBjb250ZXh0LmZvbnQgPSBsYWJlbFN0eWxlICsgJyAnICsgbGFiZWxXZWlnaHQgKyAnICcgKyBsYWJlbFNpemUgKyAnICcgKyBsYWJlbEZhbWlseTtcbiAgY29udGV4dC5saW5lSm9pbiA9ICdyb3VuZCc7IC8vIHNvIHRleHQgb3V0bGluZXMgYXJlbid0IGphZ2dlZFxuXG4gIHRoaXMuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgb3BhY2l0eSk7XG4gIHRoaXMuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBvdXRsaW5lQ29sb3JbMF0sIG91dGxpbmVDb2xvclsxXSwgb3V0bGluZUNvbG9yWzJdLCBvdXRsaW5lT3BhY2l0eSk7XG59O1xuXG4vLyBUT0RPIGVuc3VyZSByZS11c2VkXG5mdW5jdGlvbiByb3VuZFJlY3QoY3R4LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciByYWRpdXMgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IDU7XG4gIGN0eC5iZWdpblBhdGgoKTtcbiAgY3R4Lm1vdmVUbyh4ICsgcmFkaXVzLCB5KTtcbiAgY3R4LmxpbmVUbyh4ICsgd2lkdGggLSByYWRpdXMsIHkpO1xuICBjdHgucXVhZHJhdGljQ3VydmVUbyh4ICsgd2lkdGgsIHksIHggKyB3aWR0aCwgeSArIHJhZGl1cyk7XG4gIGN0eC5saW5lVG8oeCArIHdpZHRoLCB5ICsgaGVpZ2h0IC0gcmFkaXVzKTtcbiAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB4ICsgd2lkdGggLSByYWRpdXMsIHkgKyBoZWlnaHQpO1xuICBjdHgubGluZVRvKHggKyByYWRpdXMsIHkgKyBoZWlnaHQpO1xuICBjdHgucXVhZHJhdGljQ3VydmVUbyh4LCB5ICsgaGVpZ2h0LCB4LCB5ICsgaGVpZ2h0IC0gcmFkaXVzKTtcbiAgY3R4LmxpbmVUbyh4LCB5ICsgcmFkaXVzKTtcbiAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCwgeSwgeCArIHJhZGl1cywgeSk7XG4gIGN0eC5jbG9zZVBhdGgoKTtcbiAgY3R4LmZpbGwoKTtcbn1cbkNScCQ2LmdldFRleHRBbmdsZSA9IGZ1bmN0aW9uIChlbGUsIHByZWZpeCkge1xuICB2YXIgdGhldGE7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHJzY3JhdGNoID0gX3AucnNjcmF0Y2g7XG4gIHZhciBwZGFzaCA9IHByZWZpeCA/IHByZWZpeCArICctJyA6ICcnO1xuICB2YXIgcm90YXRpb24gPSBlbGUucHN0eWxlKHBkYXNoICsgJ3RleHQtcm90YXRpb24nKTtcbiAgdmFyIHRleHRBbmdsZSA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbEFuZ2xlJywgcHJlZml4KTtcbiAgaWYgKHJvdGF0aW9uLnN0clZhbHVlID09PSAnYXV0b3JvdGF0ZScpIHtcbiAgICB0aGV0YSA9IGVsZS5pc0VkZ2UoKSA/IHRleHRBbmdsZSA6IDA7XG4gIH0gZWxzZSBpZiAocm90YXRpb24uc3RyVmFsdWUgPT09ICdub25lJykge1xuICAgIHRoZXRhID0gMDtcbiAgfSBlbHNlIHtcbiAgICB0aGV0YSA9IHJvdGF0aW9uLnBmVmFsdWU7XG4gIH1cbiAgcmV0dXJuIHRoZXRhO1xufTtcbkNScCQ2LmRyYXdUZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgcHJlZml4KSB7XG4gIHZhciBhcHBseVJvdGF0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB0cnVlO1xuICB2YXIgdXNlRWxlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdHJ1ZTtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcnNjcmF0Y2ggPSBfcC5yc2NyYXRjaDtcbiAgdmFyIHBhcmVudE9wYWNpdHkgPSB1c2VFbGVPcGFjaXR5ID8gZWxlLmVmZmVjdGl2ZU9wYWNpdHkoKSA6IDE7XG4gIGlmICh1c2VFbGVPcGFjaXR5ICYmIChwYXJlbnRPcGFjaXR5ID09PSAwIHx8IGVsZS5wc3R5bGUoJ3RleHQtb3BhY2l0eScpLnZhbHVlID09PSAwKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIHVzZSAnbWFpbicgYXMgYW4gYWxpYXMgZm9yIHRoZSBtYWluIGxhYmVsIChpLmUuIG51bGwgcHJlZml4KVxuICBpZiAocHJlZml4ID09PSAnbWFpbicpIHtcbiAgICBwcmVmaXggPSBudWxsO1xuICB9XG4gIHZhciB0ZXh0WCA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbFgnLCBwcmVmaXgpO1xuICB2YXIgdGV4dFkgPSBnZXRQcmVmaXhlZFByb3BlcnR5KHJzY3JhdGNoLCAnbGFiZWxZJywgcHJlZml4KTtcbiAgdmFyIG9yZ1RleHRYLCBvcmdUZXh0WTsgLy8gdXNlZCBmb3Igcm90YXRpb25cbiAgdmFyIHRleHQgPSB0aGlzLmdldExhYmVsVGV4dChlbGUsIHByZWZpeCk7XG4gIGlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dCAhPT0gJycgJiYgIWlzTmFOKHRleHRYKSAmJiAhaXNOYU4odGV4dFkpKSB7XG4gICAgdGhpcy5zZXR1cFRleHRTdHlsZShjb250ZXh0LCBlbGUsIHVzZUVsZU9wYWNpdHkpO1xuICAgIHZhciBwZGFzaCA9IHByZWZpeCA/IHByZWZpeCArICctJyA6ICcnO1xuICAgIHZhciB0ZXh0VyA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbFdpZHRoJywgcHJlZml4KTtcbiAgICB2YXIgdGV4dEggPSBnZXRQcmVmaXhlZFByb3BlcnR5KHJzY3JhdGNoLCAnbGFiZWxIZWlnaHQnLCBwcmVmaXgpO1xuICAgIHZhciBtYXJnaW5YID0gZWxlLnBzdHlsZShwZGFzaCArICd0ZXh0LW1hcmdpbi14JykucGZWYWx1ZTtcbiAgICB2YXIgbWFyZ2luWSA9IGVsZS5wc3R5bGUocGRhc2ggKyAndGV4dC1tYXJnaW4teScpLnBmVmFsdWU7XG4gICAgdmFyIGlzRWRnZSA9IGVsZS5pc0VkZ2UoKTtcbiAgICB2YXIgaGFsaWduID0gZWxlLnBzdHlsZSgndGV4dC1oYWxpZ24nKS52YWx1ZTtcbiAgICB2YXIgdmFsaWduID0gZWxlLnBzdHlsZSgndGV4dC12YWxpZ24nKS52YWx1ZTtcbiAgICBpZiAoaXNFZGdlKSB7XG4gICAgICBoYWxpZ24gPSAnY2VudGVyJztcbiAgICAgIHZhbGlnbiA9ICdjZW50ZXInO1xuICAgIH1cbiAgICB0ZXh0WCArPSBtYXJnaW5YO1xuICAgIHRleHRZICs9IG1hcmdpblk7XG4gICAgdmFyIHRoZXRhO1xuICAgIGlmICghYXBwbHlSb3RhdGlvbikge1xuICAgICAgdGhldGEgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGV0YSA9IHRoaXMuZ2V0VGV4dEFuZ2xlKGVsZSwgcHJlZml4KTtcbiAgICB9XG4gICAgaWYgKHRoZXRhICE9PSAwKSB7XG4gICAgICBvcmdUZXh0WCA9IHRleHRYO1xuICAgICAgb3JnVGV4dFkgPSB0ZXh0WTtcbiAgICAgIGNvbnRleHQudHJhbnNsYXRlKG9yZ1RleHRYLCBvcmdUZXh0WSk7XG4gICAgICBjb250ZXh0LnJvdGF0ZSh0aGV0YSk7XG4gICAgICB0ZXh0WCA9IDA7XG4gICAgICB0ZXh0WSA9IDA7XG4gICAgfVxuICAgIHN3aXRjaCAodmFsaWduKSB7XG4gICAgICBjYXNlICd0b3AnOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgIHRleHRZICs9IHRleHRIIC8gMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICB0ZXh0WSArPSB0ZXh0SDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBiYWNrZ3JvdW5kT3BhY2l0eSA9IGVsZS5wc3R5bGUoJ3RleHQtYmFja2dyb3VuZC1vcGFjaXR5JykudmFsdWU7XG4gICAgdmFyIGJvcmRlck9wYWNpdHkgPSBlbGUucHN0eWxlKCd0ZXh0LWJvcmRlci1vcGFjaXR5JykudmFsdWU7XG4gICAgdmFyIHRleHRCb3JkZXJXaWR0aCA9IGVsZS5wc3R5bGUoJ3RleHQtYm9yZGVyLXdpZHRoJykucGZWYWx1ZTtcbiAgICB2YXIgYmFja2dyb3VuZFBhZGRpbmcgPSBlbGUucHN0eWxlKCd0ZXh0LWJhY2tncm91bmQtcGFkZGluZycpLnBmVmFsdWU7XG4gICAgaWYgKGJhY2tncm91bmRPcGFjaXR5ID4gMCB8fCB0ZXh0Qm9yZGVyV2lkdGggPiAwICYmIGJvcmRlck9wYWNpdHkgPiAwKSB7XG4gICAgICB2YXIgYmdYID0gdGV4dFggLSBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIHN3aXRjaCAoaGFsaWduKSB7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgIGJnWCAtPSB0ZXh0VztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgICBiZ1ggLT0gdGV4dFcgLyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFyIGJnWSA9IHRleHRZIC0gdGV4dEggLSBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIHZhciBiZ1cgPSB0ZXh0VyArIDIgKiBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIHZhciBiZ0ggPSB0ZXh0SCArIDIgKiBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIGlmIChiYWNrZ3JvdW5kT3BhY2l0eSA+IDApIHtcbiAgICAgICAgdmFyIHRleHRGaWxsID0gY29udGV4dC5maWxsU3R5bGU7XG4gICAgICAgIHZhciB0ZXh0QmFja2dyb3VuZENvbG9yID0gZWxlLnBzdHlsZSgndGV4dC1iYWNrZ3JvdW5kLWNvbG9yJykudmFsdWU7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJ3JnYmEoJyArIHRleHRCYWNrZ3JvdW5kQ29sb3JbMF0gKyAnLCcgKyB0ZXh0QmFja2dyb3VuZENvbG9yWzFdICsgJywnICsgdGV4dEJhY2tncm91bmRDb2xvclsyXSArICcsJyArIGJhY2tncm91bmRPcGFjaXR5ICogcGFyZW50T3BhY2l0eSArICcpJztcbiAgICAgICAgdmFyIHN0eWxlU2hhcGUgPSBlbGUucHN0eWxlKCd0ZXh0LWJhY2tncm91bmQtc2hhcGUnKS5zdHJWYWx1ZTtcbiAgICAgICAgaWYgKHN0eWxlU2hhcGUuaW5kZXhPZigncm91bmQnKSA9PT0gMCkge1xuICAgICAgICAgIHJvdW5kUmVjdChjb250ZXh0LCBiZ1gsIGJnWSwgYmdXLCBiZ0gsIDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRleHQuZmlsbFJlY3QoYmdYLCBiZ1ksIGJnVywgYmdIKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IHRleHRGaWxsO1xuICAgICAgfVxuICAgICAgaWYgKHRleHRCb3JkZXJXaWR0aCA+IDAgJiYgYm9yZGVyT3BhY2l0eSA+IDApIHtcbiAgICAgICAgdmFyIHRleHRTdHJva2UgPSBjb250ZXh0LnN0cm9rZVN0eWxlO1xuICAgICAgICB2YXIgdGV4dExpbmVXaWR0aCA9IGNvbnRleHQubGluZVdpZHRoO1xuICAgICAgICB2YXIgdGV4dEJvcmRlckNvbG9yID0gZWxlLnBzdHlsZSgndGV4dC1ib3JkZXItY29sb3InKS52YWx1ZTtcbiAgICAgICAgdmFyIHRleHRCb3JkZXJTdHlsZSA9IGVsZS5wc3R5bGUoJ3RleHQtYm9yZGVyLXN0eWxlJykudmFsdWU7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAncmdiYSgnICsgdGV4dEJvcmRlckNvbG9yWzBdICsgJywnICsgdGV4dEJvcmRlckNvbG9yWzFdICsgJywnICsgdGV4dEJvcmRlckNvbG9yWzJdICsgJywnICsgYm9yZGVyT3BhY2l0eSAqIHBhcmVudE9wYWNpdHkgKyAnKSc7XG4gICAgICAgIGNvbnRleHQubGluZVdpZHRoID0gdGV4dEJvcmRlcldpZHRoO1xuICAgICAgICBpZiAoY29udGV4dC5zZXRMaW5lRGFzaCkge1xuICAgICAgICAgIC8vIGZvciB2ZXJ5IG91dG9mZGF0ZSBicm93c2Vyc1xuICAgICAgICAgIHN3aXRjaCAodGV4dEJvcmRlclN0eWxlKSB7XG4gICAgICAgICAgICBjYXNlICdkb3R0ZWQnOlxuICAgICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFsxLCAxXSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGFzaGVkJzpcbiAgICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbNCwgMl0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RvdWJsZSc6XG4gICAgICAgICAgICAgIGNvbnRleHQubGluZVdpZHRoID0gdGV4dEJvcmRlcldpZHRoIC8gNDsgLy8gNTAlIHJlc2VydmVkIGZvciB3aGl0ZSBiZXR3ZWVuIHRoZSB0d28gYm9yZGVyc1xuICAgICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFtdKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzb2xpZCc6XG4gICAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goW10pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5zdHJva2VSZWN0KGJnWCwgYmdZLCBiZ1csIGJnSCk7XG4gICAgICAgIGlmICh0ZXh0Qm9yZGVyU3R5bGUgPT09ICdkb3VibGUnKSB7XG4gICAgICAgICAgdmFyIHdoaXRlV2lkdGggPSB0ZXh0Qm9yZGVyV2lkdGggLyAyO1xuICAgICAgICAgIGNvbnRleHQuc3Ryb2tlUmVjdChiZ1ggKyB3aGl0ZVdpZHRoLCBiZ1kgKyB3aGl0ZVdpZHRoLCBiZ1cgLSB3aGl0ZVdpZHRoICogMiwgYmdIIC0gd2hpdGVXaWR0aCAqIDIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb250ZXh0LnNldExpbmVEYXNoKSB7XG4gICAgICAgICAgLy8gZm9yIHZlcnkgb3V0b2ZkYXRlIGJyb3dzZXJzXG4gICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5saW5lV2lkdGggPSB0ZXh0TGluZVdpZHRoO1xuICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gdGV4dFN0cm9rZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGxpbmVXaWR0aCA9IDIgKiBlbGUucHN0eWxlKCd0ZXh0LW91dGxpbmUtd2lkdGgnKS5wZlZhbHVlOyAvLyAqMiBiL2MgdGhlIHN0cm9rZSBpcyBkcmF3biBjZW50cmVkIG9uIHRoZSBtaWRkbGVcblxuICAgIGlmIChsaW5lV2lkdGggPiAwKSB7XG4gICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcbiAgICB9XG4gICAgaWYgKGVsZS5wc3R5bGUoJ3RleHQtd3JhcCcpLnZhbHVlID09PSAnd3JhcCcpIHtcbiAgICAgIHZhciBsaW5lcyA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbFdyYXBDYWNoZWRMaW5lcycsIHByZWZpeCk7XG4gICAgICB2YXIgbGluZUhlaWdodCA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbExpbmVIZWlnaHQnLCBwcmVmaXgpO1xuICAgICAgdmFyIGhhbGZUZXh0VyA9IHRleHRXIC8gMjtcbiAgICAgIHZhciBqdXN0aWZpY2F0aW9uID0gdGhpcy5nZXRMYWJlbEp1c3RpZmljYXRpb24oZWxlKTtcbiAgICAgIGlmIChqdXN0aWZpY2F0aW9uID09PSAnYXV0bycpIDsgZWxzZSBpZiAoaGFsaWduID09PSAnbGVmdCcpIHtcbiAgICAgICAgLy8gYXV0byBqdXN0aWZpY2F0aW9uIDogcmlnaHRcbiAgICAgICAgaWYgKGp1c3RpZmljYXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgIHRleHRYICs9IC10ZXh0VztcbiAgICAgICAgfSBlbHNlIGlmIChqdXN0aWZpY2F0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgICAgIHRleHRYICs9IC1oYWxmVGV4dFc7XG4gICAgICAgIH0gLy8gZWxzZSBzYW1lIGFzIGF1dG9cbiAgICAgIH0gZWxzZSBpZiAoaGFsaWduID09PSAnY2VudGVyJykge1xuICAgICAgICAvLyBhdXRvIGp1c3RmaWNhdGlvbiA6IGNlbnRlclxuICAgICAgICBpZiAoanVzdGlmaWNhdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgdGV4dFggKz0gLWhhbGZUZXh0VztcbiAgICAgICAgfSBlbHNlIGlmIChqdXN0aWZpY2F0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgdGV4dFggKz0gaGFsZlRleHRXO1xuICAgICAgICB9IC8vIGVsc2Ugc2FtZSBhcyBhdXRvXG4gICAgICB9IGVsc2UgaWYgKGhhbGlnbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAvLyBhdXRvIGp1c3RpZmljYXRpb24gOiBsZWZ0XG4gICAgICAgIGlmIChqdXN0aWZpY2F0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgICAgIHRleHRYICs9IGhhbGZUZXh0VztcbiAgICAgICAgfSBlbHNlIGlmIChqdXN0aWZpY2F0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgdGV4dFggKz0gdGV4dFc7XG4gICAgICAgIH0gLy8gZWxzZSBzYW1lIGFzIGF1dG9cbiAgICAgIH1cblxuICAgICAgc3dpdGNoICh2YWxpZ24pIHtcbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICB0ZXh0WSAtPSAobGluZXMubGVuZ3RoIC0gMSkgKiBsaW5lSGVpZ2h0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIHRleHRZIC09IChsaW5lcy5sZW5ndGggLSAxKSAqIGxpbmVIZWlnaHQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBsID0gMDsgbCA8IGxpbmVzLmxlbmd0aDsgbCsrKSB7XG4gICAgICAgIGlmIChsaW5lV2lkdGggPiAwKSB7XG4gICAgICAgICAgY29udGV4dC5zdHJva2VUZXh0KGxpbmVzW2xdLCB0ZXh0WCwgdGV4dFkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuZmlsbFRleHQobGluZXNbbF0sIHRleHRYLCB0ZXh0WSk7XG4gICAgICAgIHRleHRZICs9IGxpbmVIZWlnaHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChsaW5lV2lkdGggPiAwKSB7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlVGV4dCh0ZXh0LCB0ZXh0WCwgdGV4dFkpO1xuICAgICAgfVxuICAgICAgY29udGV4dC5maWxsVGV4dCh0ZXh0LCB0ZXh0WCwgdGV4dFkpO1xuICAgIH1cbiAgICBpZiAodGhldGEgIT09IDApIHtcbiAgICAgIGNvbnRleHQucm90YXRlKC10aGV0YSk7XG4gICAgICBjb250ZXh0LnRyYW5zbGF0ZSgtb3JnVGV4dFgsIC1vcmdUZXh0WSk7XG4gICAgfVxuICB9XG59O1xuXG4vKiBnbG9iYWwgUGF0aDJEICovXG52YXIgQ1JwJDUgPSB7fTtcbkNScCQ1LmRyYXdOb2RlID0gZnVuY3Rpb24gKGNvbnRleHQsIG5vZGUsIHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgdmFyIGRyYXdMYWJlbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogdHJ1ZTtcbiAgdmFyIHNob3VsZERyYXdPdmVybGF5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB0cnVlO1xuICB2YXIgc2hvdWxkRHJhd09wYWNpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IHRydWU7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIG5vZGVXaWR0aCwgbm9kZUhlaWdodDtcbiAgdmFyIF9wID0gbm9kZS5fcHJpdmF0ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHZhciBwb3MgPSBub2RlLnBvc2l0aW9uKCk7XG4gIGlmICghbnVtYmVyJDEocG9zLngpIHx8ICFudW1iZXIkMShwb3MueSkpIHtcbiAgICByZXR1cm47IC8vIGNhbid0IGRyYXcgbm9kZSB3aXRoIHVuZGVmaW5lZCBwb3NpdGlvblxuICB9XG5cbiAgaWYgKHNob3VsZERyYXdPcGFjaXR5ICYmICFub2RlLnZpc2libGUoKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgZWxlT3BhY2l0eSA9IHNob3VsZERyYXdPcGFjaXR5ID8gbm9kZS5lZmZlY3RpdmVPcGFjaXR5KCkgOiAxO1xuICB2YXIgdXNlUGF0aHMgPSByLnVzZVBhdGhzKCk7XG4gIHZhciBwYXRoO1xuICB2YXIgcGF0aENhY2hlSGl0ID0gZmFsc2U7XG4gIHZhciBwYWRkaW5nID0gbm9kZS5wYWRkaW5nKCk7XG4gIG5vZGVXaWR0aCA9IG5vZGUud2lkdGgoKSArIDIgKiBwYWRkaW5nO1xuICBub2RlSGVpZ2h0ID0gbm9kZS5oZWlnaHQoKSArIDIgKiBwYWRkaW5nO1xuXG4gIC8vXG4gIC8vIHNldHVwIHNoaWZ0XG5cbiAgdmFyIGJiO1xuICBpZiAoc2hpZnRUb09yaWdpbldpdGhCYikge1xuICAgIGJiID0gc2hpZnRUb09yaWdpbldpdGhCYjtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgtYmIueDEsIC1iYi55MSk7XG4gIH1cblxuICAvL1xuICAvLyBsb2FkIGJnIGltYWdlXG5cbiAgdmFyIGJnSW1nUHJvcCA9IG5vZGUucHN0eWxlKCdiYWNrZ3JvdW5kLWltYWdlJyk7XG4gIHZhciB1cmxzID0gYmdJbWdQcm9wLnZhbHVlO1xuICB2YXIgdXJsRGVmaW5lZCA9IG5ldyBBcnJheSh1cmxzLmxlbmd0aCk7XG4gIHZhciBpbWFnZSA9IG5ldyBBcnJheSh1cmxzLmxlbmd0aCk7XG4gIHZhciBudW1JbWFnZXMgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdXJsID0gdXJsc1tpXTtcbiAgICB2YXIgZGVmZCA9IHVybERlZmluZWRbaV0gPSB1cmwgIT0gbnVsbCAmJiB1cmwgIT09ICdub25lJztcbiAgICBpZiAoZGVmZCkge1xuICAgICAgdmFyIGJnSW1nQ3Jvc3NPcmlnaW4gPSBub2RlLmN5KCkuc3R5bGUoKS5nZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtaW1hZ2UtY3Jvc3NvcmlnaW4nLCAndmFsdWUnLCBpKTtcbiAgICAgIG51bUltYWdlcysrO1xuXG4gICAgICAvLyBnZXQgaW1hZ2UsIGFuZCBpZiBub3QgbG9hZGVkIHRoZW4gYXNrIHRvIHJlZHJhdyB3aGVuIGxhdGVyIGxvYWRlZFxuICAgICAgaW1hZ2VbaV0gPSByLmdldENhY2hlZEltYWdlKHVybCwgYmdJbWdDcm9zc09yaWdpbiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBfcC5iYWNrZ3JvdW5kVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbm9kZS5lbWl0QW5kTm90aWZ5KCdiYWNrZ3JvdW5kJyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvL1xuICAvLyBzZXR1cCBzdHlsZXNcblxuICB2YXIgZGFya25lc3MgPSBub2RlLnBzdHlsZSgnYmFja2dyb3VuZC1ibGFja2VuJykudmFsdWU7XG4gIHZhciBib3JkZXJXaWR0aCA9IG5vZGUucHN0eWxlKCdib3JkZXItd2lkdGgnKS5wZlZhbHVlO1xuICB2YXIgYmdPcGFjaXR5ID0gbm9kZS5wc3R5bGUoJ2JhY2tncm91bmQtb3BhY2l0eScpLnZhbHVlICogZWxlT3BhY2l0eTtcbiAgdmFyIGJvcmRlckNvbG9yID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1jb2xvcicpLnZhbHVlO1xuICB2YXIgYm9yZGVyU3R5bGUgPSBub2RlLnBzdHlsZSgnYm9yZGVyLXN0eWxlJykudmFsdWU7XG4gIHZhciBib3JkZXJPcGFjaXR5ID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1vcGFjaXR5JykudmFsdWUgKiBlbGVPcGFjaXR5O1xuICBjb250ZXh0LmxpbmVKb2luID0gJ21pdGVyJzsgLy8gc28gYm9yZGVycyBhcmUgc3F1YXJlIHdpdGggdGhlIG5vZGUgc2hhcGVcblxuICB2YXIgc2V0dXBTaGFwZUNvbG9yID0gZnVuY3Rpb24gc2V0dXBTaGFwZUNvbG9yKCkge1xuICAgIHZhciBiZ09weSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogYmdPcGFjaXR5O1xuICAgIHIuZWxlRmlsbFN0eWxlKGNvbnRleHQsIG5vZGUsIGJnT3B5KTtcbiAgfTtcbiAgdmFyIHNldHVwQm9yZGVyQ29sb3IgPSBmdW5jdGlvbiBzZXR1cEJvcmRlckNvbG9yKCkge1xuICAgIHZhciBiZHJPcHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGJvcmRlck9wYWNpdHk7XG4gICAgci5jb2xvclN0cm9rZVN0eWxlKGNvbnRleHQsIGJvcmRlckNvbG9yWzBdLCBib3JkZXJDb2xvclsxXSwgYm9yZGVyQ29sb3JbMl0sIGJkck9weSk7XG4gIH07XG5cbiAgLy9cbiAgLy8gc2V0dXAgc2hhcGVcblxuICB2YXIgc3R5bGVTaGFwZSA9IG5vZGUucHN0eWxlKCdzaGFwZScpLnN0clZhbHVlO1xuICB2YXIgc2hhcGVQdHMgPSBub2RlLnBzdHlsZSgnc2hhcGUtcG9seWdvbi1wb2ludHMnKS5wZlZhbHVlO1xuICBpZiAodXNlUGF0aHMpIHtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZShwb3MueCwgcG9zLnkpO1xuICAgIHZhciBwYXRoQ2FjaGUgPSByLm5vZGVQYXRoQ2FjaGUgPSByLm5vZGVQYXRoQ2FjaGUgfHwgW107XG4gICAgdmFyIGtleSA9IGhhc2hTdHJpbmdzKHN0eWxlU2hhcGUgPT09ICdwb2x5Z29uJyA/IHN0eWxlU2hhcGUgKyAnLCcgKyBzaGFwZVB0cy5qb2luKCcsJykgOiBzdHlsZVNoYXBlLCAnJyArIG5vZGVIZWlnaHQsICcnICsgbm9kZVdpZHRoKTtcbiAgICB2YXIgY2FjaGVkUGF0aCA9IHBhdGhDYWNoZVtrZXldO1xuICAgIGlmIChjYWNoZWRQYXRoICE9IG51bGwpIHtcbiAgICAgIHBhdGggPSBjYWNoZWRQYXRoO1xuICAgICAgcGF0aENhY2hlSGl0ID0gdHJ1ZTtcbiAgICAgIHJzLnBhdGhDYWNoZSA9IHBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGggPSBuZXcgUGF0aDJEKCk7XG4gICAgICBwYXRoQ2FjaGVba2V5XSA9IHJzLnBhdGhDYWNoZSA9IHBhdGg7XG4gICAgfVxuICB9XG4gIHZhciBkcmF3U2hhcGUgPSBmdW5jdGlvbiBkcmF3U2hhcGUoKSB7XG4gICAgaWYgKCFwYXRoQ2FjaGVIaXQpIHtcbiAgICAgIHZhciBucG9zID0gcG9zO1xuICAgICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAgIG5wb3MgPSB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByLm5vZGVTaGFwZXNbci5nZXROb2RlU2hhcGUobm9kZSldLmRyYXcocGF0aCB8fCBjb250ZXh0LCBucG9zLngsIG5wb3MueSwgbm9kZVdpZHRoLCBub2RlSGVpZ2h0KTtcbiAgICB9XG4gICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICBjb250ZXh0LmZpbGwocGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIH1cbiAgfTtcbiAgdmFyIGRyYXdJbWFnZXMgPSBmdW5jdGlvbiBkcmF3SW1hZ2VzKCkge1xuICAgIHZhciBub2RlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZWxlT3BhY2l0eTtcbiAgICB2YXIgaW5zaWRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICAgIHZhciBwcmV2QmdpbmcgPSBfcC5iYWNrZ3JvdW5kaW5nO1xuICAgIHZhciB0b3RhbENvbXBsZXRlZCA9IDA7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGltYWdlLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIGJnQ29udGFpbm1lbnQgPSBub2RlLmN5KCkuc3R5bGUoKS5nZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtaW1hZ2UtY29udGFpbm1lbnQnLCAndmFsdWUnLCBfaSk7XG4gICAgICBpZiAoaW5zaWRlICYmIGJnQ29udGFpbm1lbnQgPT09ICdvdmVyJyB8fCAhaW5zaWRlICYmIGJnQ29udGFpbm1lbnQgPT09ICdpbnNpZGUnKSB7XG4gICAgICAgIHRvdGFsQ29tcGxldGVkKys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHVybERlZmluZWRbX2ldICYmIGltYWdlW19pXS5jb21wbGV0ZSAmJiAhaW1hZ2VbX2ldLmVycm9yKSB7XG4gICAgICAgIHRvdGFsQ29tcGxldGVkKys7XG4gICAgICAgIHIuZHJhd0luc2NyaWJlZEltYWdlKGNvbnRleHQsIGltYWdlW19pXSwgbm9kZSwgX2ksIG5vZGVPcGFjaXR5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgX3AuYmFja2dyb3VuZGluZyA9ICEodG90YWxDb21wbGV0ZWQgPT09IG51bUltYWdlcyk7XG4gICAgaWYgKHByZXZCZ2luZyAhPT0gX3AuYmFja2dyb3VuZGluZykge1xuICAgICAgLy8gdXBkYXRlIHN0eWxlIGIvYyA6YmFja2dyb3VuZGluZyBzdGF0ZSBjaGFuZ2VkXG4gICAgICBub2RlLnVwZGF0ZVN0eWxlKGZhbHNlKTtcbiAgICB9XG4gIH07XG4gIHZhciBkcmF3UGllID0gZnVuY3Rpb24gZHJhd1BpZSgpIHtcbiAgICB2YXIgcmVkcmF3U2hhcGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICAgIHZhciBwaWVPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBlbGVPcGFjaXR5O1xuICAgIGlmIChyLmhhc1BpZShub2RlKSkge1xuICAgICAgci5kcmF3UGllKGNvbnRleHQsIG5vZGUsIHBpZU9wYWNpdHkpO1xuXG4gICAgICAvLyByZWRyYXcvcmVzdG9yZSBwYXRoIGlmIHN0ZXBzIGFmdGVyIHBpZSBuZWVkIGl0XG4gICAgICBpZiAocmVkcmF3U2hhcGUpIHtcbiAgICAgICAgaWYgKCF1c2VQYXRocykge1xuICAgICAgICAgIHIubm9kZVNoYXBlc1tyLmdldE5vZGVTaGFwZShub2RlKV0uZHJhdyhjb250ZXh0LCBwb3MueCwgcG9zLnksIG5vZGVXaWR0aCwgbm9kZUhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHZhciBkYXJrZW4gPSBmdW5jdGlvbiBkYXJrZW4oKSB7XG4gICAgdmFyIGRhcmtlbk9wYWNpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGVsZU9wYWNpdHk7XG4gICAgdmFyIG9wYWNpdHkgPSAoZGFya25lc3MgPiAwID8gZGFya25lc3MgOiAtZGFya25lc3MpICogZGFya2VuT3BhY2l0eTtcbiAgICB2YXIgYyA9IGRhcmtuZXNzID4gMCA/IDAgOiAyNTU7XG4gICAgaWYgKGRhcmtuZXNzICE9PSAwKSB7XG4gICAgICByLmNvbG9yRmlsbFN0eWxlKGNvbnRleHQsIGMsIGMsIGMsIG9wYWNpdHkpO1xuICAgICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAgIGNvbnRleHQuZmlsbChwYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIGRyYXdCb3JkZXIgPSBmdW5jdGlvbiBkcmF3Qm9yZGVyKCkge1xuICAgIGlmIChib3JkZXJXaWR0aCA+IDApIHtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gYm9yZGVyV2lkdGg7XG4gICAgICBjb250ZXh0LmxpbmVDYXAgPSAnYnV0dCc7XG4gICAgICBpZiAoY29udGV4dC5zZXRMaW5lRGFzaCkge1xuICAgICAgICAvLyBmb3IgdmVyeSBvdXRvZmRhdGUgYnJvd3NlcnNcbiAgICAgICAgc3dpdGNoIChib3JkZXJTdHlsZSkge1xuICAgICAgICAgIGNhc2UgJ2RvdHRlZCc6XG4gICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFsxLCAxXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdkYXNoZWQnOlxuICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbNCwgMl0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnc29saWQnOlxuICAgICAgICAgIGNhc2UgJ2RvdWJsZSc6XG4gICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFtdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodXNlUGF0aHMpIHtcbiAgICAgICAgY29udGV4dC5zdHJva2UocGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgfVxuICAgICAgaWYgKGJvcmRlclN0eWxlID09PSAnZG91YmxlJykge1xuICAgICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IGJvcmRlcldpZHRoIC8gMztcbiAgICAgICAgdmFyIGdjbyA9IGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uO1xuICAgICAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdkZXN0aW5hdGlvbi1vdXQnO1xuICAgICAgICBpZiAodXNlUGF0aHMpIHtcbiAgICAgICAgICBjb250ZXh0LnN0cm9rZShwYXRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gZ2NvO1xuICAgICAgfVxuXG4gICAgICAvLyByZXNldCBpbiBjYXNlIHdlIGNoYW5nZWQgdGhlIGJvcmRlciBzdHlsZVxuICAgICAgaWYgKGNvbnRleHQuc2V0TGluZURhc2gpIHtcbiAgICAgICAgLy8gZm9yIHZlcnkgb3V0b2ZkYXRlIGJyb3dzZXJzXG4gICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goW10pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIGRyYXdPdmVybGF5ID0gZnVuY3Rpb24gZHJhd092ZXJsYXkoKSB7XG4gICAgaWYgKHNob3VsZERyYXdPdmVybGF5KSB7XG4gICAgICByLmRyYXdOb2RlT3ZlcmxheShjb250ZXh0LCBub2RlLCBwb3MsIG5vZGVXaWR0aCwgbm9kZUhlaWdodCk7XG4gICAgfVxuICB9O1xuICB2YXIgZHJhd1VuZGVybGF5ID0gZnVuY3Rpb24gZHJhd1VuZGVybGF5KCkge1xuICAgIGlmIChzaG91bGREcmF3T3ZlcmxheSkge1xuICAgICAgci5kcmF3Tm9kZVVuZGVybGF5KGNvbnRleHQsIG5vZGUsIHBvcywgbm9kZVdpZHRoLCBub2RlSGVpZ2h0KTtcbiAgICB9XG4gIH07XG4gIHZhciBkcmF3VGV4dCA9IGZ1bmN0aW9uIGRyYXdUZXh0KCkge1xuICAgIHIuZHJhd0VsZW1lbnRUZXh0KGNvbnRleHQsIG5vZGUsIG51bGwsIGRyYXdMYWJlbCk7XG4gIH07XG4gIHZhciBnaG9zdCA9IG5vZGUucHN0eWxlKCdnaG9zdCcpLnZhbHVlID09PSAneWVzJztcbiAgaWYgKGdob3N0KSB7XG4gICAgdmFyIGd4ID0gbm9kZS5wc3R5bGUoJ2dob3N0LW9mZnNldC14JykucGZWYWx1ZTtcbiAgICB2YXIgZ3kgPSBub2RlLnBzdHlsZSgnZ2hvc3Qtb2Zmc2V0LXknKS5wZlZhbHVlO1xuICAgIHZhciBnaG9zdE9wYWNpdHkgPSBub2RlLnBzdHlsZSgnZ2hvc3Qtb3BhY2l0eScpLnZhbHVlO1xuICAgIHZhciBlZmZHaG9zdE9wYWNpdHkgPSBnaG9zdE9wYWNpdHkgKiBlbGVPcGFjaXR5O1xuICAgIGNvbnRleHQudHJhbnNsYXRlKGd4LCBneSk7XG4gICAgc2V0dXBTaGFwZUNvbG9yKGdob3N0T3BhY2l0eSAqIGJnT3BhY2l0eSk7XG4gICAgZHJhd1NoYXBlKCk7XG4gICAgZHJhd0ltYWdlcyhlZmZHaG9zdE9wYWNpdHksIHRydWUpO1xuICAgIHNldHVwQm9yZGVyQ29sb3IoZ2hvc3RPcGFjaXR5ICogYm9yZGVyT3BhY2l0eSk7XG4gICAgZHJhd0JvcmRlcigpO1xuICAgIGRyYXdQaWUoZGFya25lc3MgIT09IDAgfHwgYm9yZGVyV2lkdGggIT09IDApO1xuICAgIGRyYXdJbWFnZXMoZWZmR2hvc3RPcGFjaXR5LCBmYWxzZSk7XG4gICAgZGFya2VuKGVmZkdob3N0T3BhY2l0eSk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLWd4LCAtZ3kpO1xuICB9XG4gIGlmICh1c2VQYXRocykge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKC1wb3MueCwgLXBvcy55KTtcbiAgfVxuICBkcmF3VW5kZXJsYXkoKTtcbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgY29udGV4dC50cmFuc2xhdGUocG9zLngsIHBvcy55KTtcbiAgfVxuICBzZXR1cFNoYXBlQ29sb3IoKTtcbiAgZHJhd1NoYXBlKCk7XG4gIGRyYXdJbWFnZXMoZWxlT3BhY2l0eSwgdHJ1ZSk7XG4gIHNldHVwQm9yZGVyQ29sb3IoKTtcbiAgZHJhd0JvcmRlcigpO1xuICBkcmF3UGllKGRhcmtuZXNzICE9PSAwIHx8IGJvcmRlcldpZHRoICE9PSAwKTtcbiAgZHJhd0ltYWdlcyhlbGVPcGFjaXR5LCBmYWxzZSk7XG4gIGRhcmtlbigpO1xuICBpZiAodXNlUGF0aHMpIHtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgtcG9zLngsIC1wb3MueSk7XG4gIH1cbiAgZHJhd1RleHQoKTtcbiAgZHJhd092ZXJsYXkoKTtcblxuICAvL1xuICAvLyBjbGVhbiB1cCBzaGlmdFxuXG4gIGlmIChzaGlmdFRvT3JpZ2luV2l0aEJiKSB7XG4gICAgY29udGV4dC50cmFuc2xhdGUoYmIueDEsIGJiLnkxKTtcbiAgfVxufTtcbnZhciBkcmF3Tm9kZU92ZXJsYXlVbmRlcmxheSA9IGZ1bmN0aW9uIGRyYXdOb2RlT3ZlcmxheVVuZGVybGF5KG92ZXJsYXlPclVuZGVybGF5KSB7XG4gIGlmICghWydvdmVybGF5JywgJ3VuZGVybGF5J10uaW5jbHVkZXMob3ZlcmxheU9yVW5kZXJsYXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0YXRlJyk7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIChjb250ZXh0LCBub2RlLCBwb3MsIG5vZGVXaWR0aCwgbm9kZUhlaWdodCkge1xuICAgIHZhciByID0gdGhpcztcbiAgICBpZiAoIW5vZGUudmlzaWJsZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBwYWRkaW5nID0gbm9kZS5wc3R5bGUoXCJcIi5jb25jYXQob3ZlcmxheU9yVW5kZXJsYXksIFwiLXBhZGRpbmdcIikpLnBmVmFsdWU7XG4gICAgdmFyIG9wYWNpdHkgPSBub2RlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItb3BhY2l0eVwiKSkudmFsdWU7XG4gICAgdmFyIGNvbG9yID0gbm9kZS5wc3R5bGUoXCJcIi5jb25jYXQob3ZlcmxheU9yVW5kZXJsYXksIFwiLWNvbG9yXCIpKS52YWx1ZTtcbiAgICB2YXIgc2hhcGUgPSBub2RlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItc2hhcGVcIikpLnZhbHVlO1xuICAgIGlmIChvcGFjaXR5ID4gMCkge1xuICAgICAgcG9zID0gcG9zIHx8IG5vZGUucG9zaXRpb24oKTtcbiAgICAgIGlmIChub2RlV2lkdGggPT0gbnVsbCB8fCBub2RlSGVpZ2h0ID09IG51bGwpIHtcbiAgICAgICAgdmFyIF9wYWRkaW5nID0gbm9kZS5wYWRkaW5nKCk7XG4gICAgICAgIG5vZGVXaWR0aCA9IG5vZGUud2lkdGgoKSArIDIgKiBfcGFkZGluZztcbiAgICAgICAgbm9kZUhlaWdodCA9IG5vZGUuaGVpZ2h0KCkgKyAyICogX3BhZGRpbmc7XG4gICAgICB9XG4gICAgICByLmNvbG9yRmlsbFN0eWxlKGNvbnRleHQsIGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0sIG9wYWNpdHkpO1xuICAgICAgci5ub2RlU2hhcGVzW3NoYXBlXS5kcmF3KGNvbnRleHQsIHBvcy54LCBwb3MueSwgbm9kZVdpZHRoICsgcGFkZGluZyAqIDIsIG5vZGVIZWlnaHQgKyBwYWRkaW5nICogMik7XG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICB9XG4gIH07XG59O1xuQ1JwJDUuZHJhd05vZGVPdmVybGF5ID0gZHJhd05vZGVPdmVybGF5VW5kZXJsYXkoJ292ZXJsYXknKTtcbkNScCQ1LmRyYXdOb2RlVW5kZXJsYXkgPSBkcmF3Tm9kZU92ZXJsYXlVbmRlcmxheSgndW5kZXJsYXknKTtcblxuLy8gZG9lcyB0aGUgbm9kZSBoYXZlIGF0IGxlYXN0IG9uZSBwaWUgcGllY2U/XG5DUnAkNS5oYXNQaWUgPSBmdW5jdGlvbiAobm9kZSkge1xuICBub2RlID0gbm9kZVswXTsgLy8gZW5zdXJlIGVsZSByZWZcblxuICByZXR1cm4gbm9kZS5fcHJpdmF0ZS5oYXNQaWU7XG59O1xuQ1JwJDUuZHJhd1BpZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBub2RlLCBub2RlT3BhY2l0eSwgcG9zKSB7XG4gIG5vZGUgPSBub2RlWzBdOyAvLyBlbnN1cmUgZWxlIHJlZlxuICBwb3MgPSBwb3MgfHwgbm9kZS5wb3NpdGlvbigpO1xuICB2YXIgY3lTdHlsZSA9IG5vZGUuY3koKS5zdHlsZSgpO1xuICB2YXIgcGllU2l6ZSA9IG5vZGUucHN0eWxlKCdwaWUtc2l6ZScpO1xuICB2YXIgeCA9IHBvcy54O1xuICB2YXIgeSA9IHBvcy55O1xuICB2YXIgbm9kZVcgPSBub2RlLndpZHRoKCk7XG4gIHZhciBub2RlSCA9IG5vZGUuaGVpZ2h0KCk7XG4gIHZhciByYWRpdXMgPSBNYXRoLm1pbihub2RlVywgbm9kZUgpIC8gMjsgLy8gbXVzdCBmaXQgaW4gbm9kZVxuICB2YXIgbGFzdFBlcmNlbnQgPSAwOyAvLyB3aGF0ICUgdG8gY29udGludWUgZHJhd2luZyBwaWUgc2xpY2VzIGZyb20gb24gWzAsIDFdXG4gIHZhciB1c2VQYXRocyA9IHRoaXMudXNlUGF0aHMoKTtcbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgeCA9IDA7XG4gICAgeSA9IDA7XG4gIH1cbiAgaWYgKHBpZVNpemUudW5pdHMgPT09ICclJykge1xuICAgIHJhZGl1cyA9IHJhZGl1cyAqIHBpZVNpemUucGZWYWx1ZTtcbiAgfSBlbHNlIGlmIChwaWVTaXplLnBmVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJhZGl1cyA9IHBpZVNpemUucGZWYWx1ZSAvIDI7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDE7IGkgPD0gY3lTdHlsZS5waWVCYWNrZ3JvdW5kTjsgaSsrKSB7XG4gICAgLy8gMS4uTlxuICAgIHZhciBzaXplID0gbm9kZS5wc3R5bGUoJ3BpZS0nICsgaSArICctYmFja2dyb3VuZC1zaXplJykudmFsdWU7XG4gICAgdmFyIGNvbG9yID0gbm9kZS5wc3R5bGUoJ3BpZS0nICsgaSArICctYmFja2dyb3VuZC1jb2xvcicpLnZhbHVlO1xuICAgIHZhciBvcGFjaXR5ID0gbm9kZS5wc3R5bGUoJ3BpZS0nICsgaSArICctYmFja2dyb3VuZC1vcGFjaXR5JykudmFsdWUgKiBub2RlT3BhY2l0eTtcbiAgICB2YXIgcGVyY2VudCA9IHNpemUgLyAxMDA7IC8vIG1hcCBpbnRlZ2VyIHJhbmdlIFswLCAxMDBdIHRvIFswLCAxXVxuXG4gICAgLy8gcGVyY2VudCBjYW4ndCBwdXNoIGJleW9uZCAxXG4gICAgaWYgKHBlcmNlbnQgKyBsYXN0UGVyY2VudCA+IDEpIHtcbiAgICAgIHBlcmNlbnQgPSAxIC0gbGFzdFBlcmNlbnQ7XG4gICAgfVxuICAgIHZhciBhbmdsZVN0YXJ0ID0gMS41ICogTWF0aC5QSSArIDIgKiBNYXRoLlBJICogbGFzdFBlcmNlbnQ7IC8vIHN0YXJ0IGF0IDEyIG8nY2xvY2sgYW5kIGdvIGNsb2Nrd2lzZVxuICAgIHZhciBhbmdsZURlbHRhID0gMiAqIE1hdGguUEkgKiBwZXJjZW50O1xuICAgIHZhciBhbmdsZUVuZCA9IGFuZ2xlU3RhcnQgKyBhbmdsZURlbHRhO1xuXG4gICAgLy8gaWdub3JlIGlmXG4gICAgLy8gLSB6ZXJvIHNpemVcbiAgICAvLyAtIHdlJ3JlIGFscmVhZHkgYmV5b25kIHRoZSBmdWxsIGNpcmNsZVxuICAgIC8vIC0gYWRkaW5nIHRoZSBjdXJyZW50IHNsaWNlIHdvdWxkIGdvIGJleW9uZCB0aGUgZnVsbCBjaXJjbGVcbiAgICBpZiAoc2l6ZSA9PT0gMCB8fCBsYXN0UGVyY2VudCA+PSAxIHx8IGxhc3RQZXJjZW50ICsgcGVyY2VudCA+IDEpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIGNvbnRleHQubW92ZVRvKHgsIHkpO1xuICAgIGNvbnRleHQuYXJjKHgsIHksIHJhZGl1cywgYW5nbGVTdGFydCwgYW5nbGVFbmQpO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgICBsYXN0UGVyY2VudCArPSBwZXJjZW50O1xuICB9XG59O1xuXG52YXIgQ1JwJDQgPSB7fTtcbnZhciBtb3Rpb25CbHVyRGVsYXkgPSAxMDA7XG5cbi8vIHZhciBpc0ZpcmVmb3ggPSB0eXBlb2YgSW5zdGFsbFRyaWdnZXIgIT09ICd1bmRlZmluZWQnO1xuXG5DUnAkNC5nZXRQaXhlbFJhdGlvID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY29udGV4dCA9IHRoaXMuZGF0YS5jb250ZXh0c1swXTtcbiAgaWYgKHRoaXMuZm9yY2VkUGl4ZWxSYXRpbyAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9yY2VkUGl4ZWxSYXRpbztcbiAgfVxuICB2YXIgYmFja2luZ1N0b3JlID0gY29udGV4dC5iYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IGNvbnRleHQud2Via2l0QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjb250ZXh0Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY29udGV4dC5tc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY29udGV4dC5vQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjb250ZXh0LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgMTtcbiAgcmV0dXJuICh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSAvIGJhY2tpbmdTdG9yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxufTtcblxuQ1JwJDQucGFpbnRDYWNoZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gIHZhciBjYWNoZXMgPSB0aGlzLnBhaW50Q2FjaGVzID0gdGhpcy5wYWludENhY2hlcyB8fCBbXTtcbiAgdmFyIG5lZWRUb0NyZWF0ZUNhY2hlID0gdHJ1ZTtcbiAgdmFyIGNhY2hlO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNhY2hlcy5sZW5ndGg7IGkrKykge1xuICAgIGNhY2hlID0gY2FjaGVzW2ldO1xuICAgIGlmIChjYWNoZS5jb250ZXh0ID09PSBjb250ZXh0KSB7XG4gICAgICBuZWVkVG9DcmVhdGVDYWNoZSA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChuZWVkVG9DcmVhdGVDYWNoZSkge1xuICAgIGNhY2hlID0ge1xuICAgICAgY29udGV4dDogY29udGV4dFxuICAgIH07XG4gICAgY2FjaGVzLnB1c2goY2FjaGUpO1xuICB9XG4gIHJldHVybiBjYWNoZTtcbn07XG5DUnAkNC5jcmVhdGVHcmFkaWVudFN0eWxlRm9yID0gZnVuY3Rpb24gKGNvbnRleHQsIHNoYXBlU3R5bGVOYW1lLCBlbGUsIGZpbGwsIG9wYWNpdHkpIHtcbiAgdmFyIGdyYWRpZW50U3R5bGU7XG4gIHZhciB1c2VQYXRocyA9IHRoaXMudXNlUGF0aHMoKTtcbiAgdmFyIGNvbG9ycyA9IGVsZS5wc3R5bGUoc2hhcGVTdHlsZU5hbWUgKyAnLWdyYWRpZW50LXN0b3AtY29sb3JzJykudmFsdWUsXG4gICAgcG9zaXRpb25zID0gZWxlLnBzdHlsZShzaGFwZVN0eWxlTmFtZSArICctZ3JhZGllbnQtc3RvcC1wb3NpdGlvbnMnKS5wZlZhbHVlO1xuICBpZiAoZmlsbCA9PT0gJ3JhZGlhbC1ncmFkaWVudCcpIHtcbiAgICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgICB2YXIgc3RhcnQgPSBlbGUuc291cmNlRW5kcG9pbnQoKSxcbiAgICAgICAgZW5kID0gZWxlLnRhcmdldEVuZHBvaW50KCksXG4gICAgICAgIG1pZCA9IGVsZS5taWRwb2ludCgpO1xuICAgICAgdmFyIGQxID0gZGlzdChzdGFydCwgbWlkKTtcbiAgICAgIHZhciBkMiA9IGRpc3QoZW5kLCBtaWQpO1xuICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlUmFkaWFsR3JhZGllbnQobWlkLngsIG1pZC55LCAwLCBtaWQueCwgbWlkLnksIE1hdGgubWF4KGQxLCBkMikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcG9zID0gdXNlUGF0aHMgPyB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH0gOiBlbGUucG9zaXRpb24oKSxcbiAgICAgICAgd2lkdGggPSBlbGUucGFkZGVkV2lkdGgoKSxcbiAgICAgICAgaGVpZ2h0ID0gZWxlLnBhZGRlZEhlaWdodCgpO1xuICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlUmFkaWFsR3JhZGllbnQocG9zLngsIHBvcy55LCAwLCBwb3MueCwgcG9zLnksIE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgICAgdmFyIF9zdGFydCA9IGVsZS5zb3VyY2VFbmRwb2ludCgpLFxuICAgICAgICBfZW5kID0gZWxlLnRhcmdldEVuZHBvaW50KCk7XG4gICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfc3RhcnQueCwgX3N0YXJ0LnksIF9lbmQueCwgX2VuZC55KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9wb3MgPSB1c2VQYXRocyA/IHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDBcbiAgICAgICAgfSA6IGVsZS5wb3NpdGlvbigpLFxuICAgICAgICBfd2lkdGggPSBlbGUucGFkZGVkV2lkdGgoKSxcbiAgICAgICAgX2hlaWdodCA9IGVsZS5wYWRkZWRIZWlnaHQoKSxcbiAgICAgICAgaGFsZldpZHRoID0gX3dpZHRoIC8gMixcbiAgICAgICAgaGFsZkhlaWdodCA9IF9oZWlnaHQgLyAyO1xuICAgICAgdmFyIGRpcmVjdGlvbiA9IGVsZS5wc3R5bGUoJ2JhY2tncm91bmQtZ3JhZGllbnQtZGlyZWN0aW9uJykudmFsdWU7XG4gICAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgICBjYXNlICd0by1ib3R0b20nOlxuICAgICAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZUxpbmVhckdyYWRpZW50KF9wb3MueCwgX3Bvcy55IC0gaGFsZkhlaWdodCwgX3Bvcy54LCBfcG9zLnkgKyBoYWxmSGVpZ2h0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG8tdG9wJzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLngsIF9wb3MueSArIGhhbGZIZWlnaHQsIF9wb3MueCwgX3Bvcy55IC0gaGFsZkhlaWdodCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvLWxlZnQnOlxuICAgICAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZUxpbmVhckdyYWRpZW50KF9wb3MueCArIGhhbGZXaWR0aCwgX3Bvcy55LCBfcG9zLnggLSBoYWxmV2lkdGgsIF9wb3MueSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvLXJpZ2h0JzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggLSBoYWxmV2lkdGgsIF9wb3MueSwgX3Bvcy54ICsgaGFsZldpZHRoLCBfcG9zLnkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0by1ib3R0b20tcmlnaHQnOlxuICAgICAgICBjYXNlICd0by1yaWdodC1ib3R0b20nOlxuICAgICAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZUxpbmVhckdyYWRpZW50KF9wb3MueCAtIGhhbGZXaWR0aCwgX3Bvcy55IC0gaGFsZkhlaWdodCwgX3Bvcy54ICsgaGFsZldpZHRoLCBfcG9zLnkgKyBoYWxmSGVpZ2h0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG8tdG9wLXJpZ2h0JzpcbiAgICAgICAgY2FzZSAndG8tcmlnaHQtdG9wJzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggLSBoYWxmV2lkdGgsIF9wb3MueSArIGhhbGZIZWlnaHQsIF9wb3MueCArIGhhbGZXaWR0aCwgX3Bvcy55IC0gaGFsZkhlaWdodCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvLWJvdHRvbS1sZWZ0JzpcbiAgICAgICAgY2FzZSAndG8tbGVmdC1ib3R0b20nOlxuICAgICAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZUxpbmVhckdyYWRpZW50KF9wb3MueCArIGhhbGZXaWR0aCwgX3Bvcy55IC0gaGFsZkhlaWdodCwgX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkgKyBoYWxmSGVpZ2h0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG8tdG9wLWxlZnQnOlxuICAgICAgICBjYXNlICd0by1sZWZ0LXRvcCc6XG4gICAgICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3Bvcy54ICsgaGFsZldpZHRoLCBfcG9zLnkgKyBoYWxmSGVpZ2h0LCBfcG9zLnggLSBoYWxmV2lkdGgsIF9wb3MueSAtIGhhbGZIZWlnaHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoIWdyYWRpZW50U3R5bGUpIHJldHVybiBudWxsOyAvLyBpbnZhbGlkIGdyYWRpZW50IHN0eWxlXG5cbiAgdmFyIGhhc1Bvc2l0aW9ucyA9IHBvc2l0aW9ucy5sZW5ndGggPT09IGNvbG9ycy5sZW5ndGg7XG4gIHZhciBsZW5ndGggPSBjb2xvcnMubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgZ3JhZGllbnRTdHlsZS5hZGRDb2xvclN0b3AoaGFzUG9zaXRpb25zID8gcG9zaXRpb25zW2ldIDogaSAvIChsZW5ndGggLSAxKSwgJ3JnYmEoJyArIGNvbG9yc1tpXVswXSArICcsJyArIGNvbG9yc1tpXVsxXSArICcsJyArIGNvbG9yc1tpXVsyXSArICcsJyArIG9wYWNpdHkgKyAnKScpO1xuICB9XG4gIHJldHVybiBncmFkaWVudFN0eWxlO1xufTtcbkNScCQ0LmdyYWRpZW50RmlsbFN0eWxlID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgZmlsbCwgb3BhY2l0eSkge1xuICB2YXIgZ3JhZGllbnRTdHlsZSA9IHRoaXMuY3JlYXRlR3JhZGllbnRTdHlsZUZvcihjb250ZXh0LCAnYmFja2dyb3VuZCcsIGVsZSwgZmlsbCwgb3BhY2l0eSk7XG4gIGlmICghZ3JhZGllbnRTdHlsZSkgcmV0dXJuIG51bGw7IC8vIGVycm9yXG4gIGNvbnRleHQuZmlsbFN0eWxlID0gZ3JhZGllbnRTdHlsZTtcbn07XG5DUnAkNC5jb2xvckZpbGxTdHlsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCByLCBnLCBiLCBhKSB7XG4gIGNvbnRleHQuZmlsbFN0eWxlID0gJ3JnYmEoJyArIHIgKyAnLCcgKyBnICsgJywnICsgYiArICcsJyArIGEgKyAnKSc7XG4gIC8vIHR1cm4gb2ZmIGZvciBub3csIHNlZW1zIGNvbnRleHQgZG9lcyBpdHMgb3duIGNhY2hpbmdcblxuICAvLyB2YXIgY2FjaGUgPSB0aGlzLnBhaW50Q2FjaGUoY29udGV4dCk7XG5cbiAgLy8gdmFyIGZpbGxTdHlsZSA9ICdyZ2JhKCcgKyByICsgJywnICsgZyArICcsJyArIGIgKyAnLCcgKyBhICsgJyknO1xuXG4gIC8vIGlmKCBjYWNoZS5maWxsU3R5bGUgIT09IGZpbGxTdHlsZSApe1xuICAvLyAgIGNvbnRleHQuZmlsbFN0eWxlID0gY2FjaGUuZmlsbFN0eWxlID0gZmlsbFN0eWxlO1xuICAvLyB9XG59O1xuXG5DUnAkNC5lbGVGaWxsU3R5bGUgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBvcGFjaXR5KSB7XG4gIHZhciBiYWNrZ3JvdW5kRmlsbCA9IGVsZS5wc3R5bGUoJ2JhY2tncm91bmQtZmlsbCcpLnZhbHVlO1xuICBpZiAoYmFja2dyb3VuZEZpbGwgPT09ICdsaW5lYXItZ3JhZGllbnQnIHx8IGJhY2tncm91bmRGaWxsID09PSAncmFkaWFsLWdyYWRpZW50Jykge1xuICAgIHRoaXMuZ3JhZGllbnRGaWxsU3R5bGUoY29udGV4dCwgZWxlLCBiYWNrZ3JvdW5kRmlsbCwgb3BhY2l0eSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJhY2tncm91bmRDb2xvciA9IGVsZS5wc3R5bGUoJ2JhY2tncm91bmQtY29sb3InKS52YWx1ZTtcbiAgICB0aGlzLmNvbG9yRmlsbFN0eWxlKGNvbnRleHQsIGJhY2tncm91bmRDb2xvclswXSwgYmFja2dyb3VuZENvbG9yWzFdLCBiYWNrZ3JvdW5kQ29sb3JbMl0sIG9wYWNpdHkpO1xuICB9XG59O1xuQ1JwJDQuZ3JhZGllbnRTdHJva2VTdHlsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUsIGZpbGwsIG9wYWNpdHkpIHtcbiAgdmFyIGdyYWRpZW50U3R5bGUgPSB0aGlzLmNyZWF0ZUdyYWRpZW50U3R5bGVGb3IoY29udGV4dCwgJ2xpbmUnLCBlbGUsIGZpbGwsIG9wYWNpdHkpO1xuICBpZiAoIWdyYWRpZW50U3R5bGUpIHJldHVybiBudWxsOyAvLyBlcnJvclxuICBjb250ZXh0LnN0cm9rZVN0eWxlID0gZ3JhZGllbnRTdHlsZTtcbn07XG5DUnAkNC5jb2xvclN0cm9rZVN0eWxlID0gZnVuY3Rpb24gKGNvbnRleHQsIHIsIGcsIGIsIGEpIHtcbiAgY29udGV4dC5zdHJva2VTdHlsZSA9ICdyZ2JhKCcgKyByICsgJywnICsgZyArICcsJyArIGIgKyAnLCcgKyBhICsgJyknO1xuICAvLyB0dXJuIG9mZiBmb3Igbm93LCBzZWVtcyBjb250ZXh0IGRvZXMgaXRzIG93biBjYWNoaW5nXG5cbiAgLy8gdmFyIGNhY2hlID0gdGhpcy5wYWludENhY2hlKGNvbnRleHQpO1xuXG4gIC8vIHZhciBzdHJva2VTdHlsZSA9ICdyZ2JhKCcgKyByICsgJywnICsgZyArICcsJyArIGIgKyAnLCcgKyBhICsgJyknO1xuXG4gIC8vIGlmKCBjYWNoZS5zdHJva2VTdHlsZSAhPT0gc3Ryb2tlU3R5bGUgKXtcbiAgLy8gICBjb250ZXh0LnN0cm9rZVN0eWxlID0gY2FjaGUuc3Ryb2tlU3R5bGUgPSBzdHJva2VTdHlsZTtcbiAgLy8gfVxufTtcblxuQ1JwJDQuZWxlU3Ryb2tlU3R5bGUgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBvcGFjaXR5KSB7XG4gIHZhciBsaW5lRmlsbCA9IGVsZS5wc3R5bGUoJ2xpbmUtZmlsbCcpLnZhbHVlO1xuICBpZiAobGluZUZpbGwgPT09ICdsaW5lYXItZ3JhZGllbnQnIHx8IGxpbmVGaWxsID09PSAncmFkaWFsLWdyYWRpZW50Jykge1xuICAgIHRoaXMuZ3JhZGllbnRTdHJva2VTdHlsZShjb250ZXh0LCBlbGUsIGxpbmVGaWxsLCBvcGFjaXR5KTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGluZUNvbG9yID0gZWxlLnBzdHlsZSgnbGluZS1jb2xvcicpLnZhbHVlO1xuICAgIHRoaXMuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBsaW5lQ29sb3JbMF0sIGxpbmVDb2xvclsxXSwgbGluZUNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgfVxufTtcblxuLy8gUmVzaXplIGNhbnZhc1xuQ1JwJDQubWF0Y2hDYW52YXNTaXplID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBkYXRhID0gci5kYXRhO1xuICB2YXIgYmIgPSByLmZpbmRDb250YWluZXJDbGllbnRDb29yZHMoKTtcbiAgdmFyIHdpZHRoID0gYmJbMl07XG4gIHZhciBoZWlnaHQgPSBiYlszXTtcbiAgdmFyIHBpeGVsUmF0aW8gPSByLmdldFBpeGVsUmF0aW8oKTtcbiAgdmFyIG1iUHhSYXRpbyA9IHIubW90aW9uQmx1clB4UmF0aW87XG4gIGlmIChjb250YWluZXIgPT09IHIuZGF0YS5idWZmZXJDYW52YXNlc1tyLk1PVElPTkJMVVJfQlVGRkVSX05PREVdIHx8IGNvbnRhaW5lciA9PT0gci5kYXRhLmJ1ZmZlckNhbnZhc2VzW3IuTU9USU9OQkxVUl9CVUZGRVJfRFJBR10pIHtcbiAgICBwaXhlbFJhdGlvID0gbWJQeFJhdGlvO1xuICB9XG4gIHZhciBjYW52YXNXaWR0aCA9IHdpZHRoICogcGl4ZWxSYXRpbztcbiAgdmFyIGNhbnZhc0hlaWdodCA9IGhlaWdodCAqIHBpeGVsUmF0aW87XG4gIHZhciBjYW52YXM7XG4gIGlmIChjYW52YXNXaWR0aCA9PT0gci5jYW52YXNXaWR0aCAmJiBjYW52YXNIZWlnaHQgPT09IHIuY2FudmFzSGVpZ2h0KSB7XG4gICAgcmV0dXJuOyAvLyBzYXZlIGN5Y2xlcyBpZiBzYW1lXG4gIH1cblxuICByLmZvbnRDYWNoZXMgPSBudWxsOyAvLyByZXNpemluZyByZXNldHMgdGhlIHN0eWxlXG5cbiAgdmFyIGNhbnZhc0NvbnRhaW5lciA9IGRhdGEuY2FudmFzQ29udGFpbmVyO1xuICBjYW52YXNDb250YWluZXIuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gIGNhbnZhc0NvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHIuQ0FOVkFTX0xBWUVSUzsgaSsrKSB7XG4gICAgY2FudmFzID0gZGF0YS5jYW52YXNlc1tpXTtcbiAgICBjYW52YXMud2lkdGggPSBjYW52YXNXaWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gY2FudmFzSGVpZ2h0O1xuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHIuQlVGRkVSX0NPVU5UOyBpKyspIHtcbiAgICBjYW52YXMgPSBkYXRhLmJ1ZmZlckNhbnZhc2VzW2ldO1xuICAgIGNhbnZhcy53aWR0aCA9IGNhbnZhc1dpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBjYW52YXNIZWlnaHQ7XG4gICAgY2FudmFzLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuICAgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuICB9XG4gIHIudGV4dHVyZU11bHQgPSAxO1xuICBpZiAocGl4ZWxSYXRpbyA8PSAxKSB7XG4gICAgY2FudmFzID0gZGF0YS5idWZmZXJDYW52YXNlc1tyLlRFWFRVUkVfQlVGRkVSXTtcbiAgICByLnRleHR1cmVNdWx0ID0gMjtcbiAgICBjYW52YXMud2lkdGggPSBjYW52YXNXaWR0aCAqIHIudGV4dHVyZU11bHQ7XG4gICAgY2FudmFzLmhlaWdodCA9IGNhbnZhc0hlaWdodCAqIHIudGV4dHVyZU11bHQ7XG4gIH1cbiAgci5jYW52YXNXaWR0aCA9IGNhbnZhc1dpZHRoO1xuICByLmNhbnZhc0hlaWdodCA9IGNhbnZhc0hlaWdodDtcbn07XG5DUnAkNC5yZW5kZXJUbyA9IGZ1bmN0aW9uIChjeHQsIHpvb20sIHBhbiwgcHhSYXRpbykge1xuICB0aGlzLnJlbmRlcih7XG4gICAgZm9yY2VkQ29udGV4dDogY3h0LFxuICAgIGZvcmNlZFpvb206IHpvb20sXG4gICAgZm9yY2VkUGFuOiBwYW4sXG4gICAgZHJhd0FsbExheWVyczogdHJ1ZSxcbiAgICBmb3JjZWRQeFJhdGlvOiBweFJhdGlvXG4gIH0pO1xufTtcbkNScCQ0LnJlbmRlciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHN0YXRpY0VtcHR5T2JqZWN0KCk7XG4gIHZhciBmb3JjZWRDb250ZXh0ID0gb3B0aW9ucy5mb3JjZWRDb250ZXh0O1xuICB2YXIgZHJhd0FsbExheWVycyA9IG9wdGlvbnMuZHJhd0FsbExheWVycztcbiAgdmFyIGRyYXdPbmx5Tm9kZUxheWVyID0gb3B0aW9ucy5kcmF3T25seU5vZGVMYXllcjtcbiAgdmFyIGZvcmNlZFpvb20gPSBvcHRpb25zLmZvcmNlZFpvb207XG4gIHZhciBmb3JjZWRQYW4gPSBvcHRpb25zLmZvcmNlZFBhbjtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgcGl4ZWxSYXRpbyA9IG9wdGlvbnMuZm9yY2VkUHhSYXRpbyA9PT0gdW5kZWZpbmVkID8gdGhpcy5nZXRQaXhlbFJhdGlvKCkgOiBvcHRpb25zLmZvcmNlZFB4UmF0aW87XG4gIHZhciBjeSA9IHIuY3k7XG4gIHZhciBkYXRhID0gci5kYXRhO1xuICB2YXIgbmVlZERyYXcgPSBkYXRhLmNhbnZhc05lZWRzUmVkcmF3O1xuICB2YXIgdGV4dHVyZURyYXcgPSByLnRleHR1cmVPblZpZXdwb3J0ICYmICFmb3JjZWRDb250ZXh0ICYmIChyLnBpbmNoaW5nIHx8IHIuaG92ZXJEYXRhLmRyYWdnaW5nIHx8IHIuc3dpcGVQYW5uaW5nIHx8IHIuZGF0YS53aGVlbFpvb21pbmcpO1xuICB2YXIgbW90aW9uQmx1ciA9IG9wdGlvbnMubW90aW9uQmx1ciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5tb3Rpb25CbHVyIDogci5tb3Rpb25CbHVyO1xuICB2YXIgbWJQeFJhdGlvID0gci5tb3Rpb25CbHVyUHhSYXRpbztcbiAgdmFyIGhhc0NvbXBvdW5kTm9kZXMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gIHZhciBpbk5vZGVEcmFnR2VzdHVyZSA9IHIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcztcbiAgdmFyIGluQm94U2VsZWN0aW9uID0gci5ob3ZlckRhdGEuc2VsZWN0aW5nIHx8IHIudG91Y2hEYXRhLnNlbGVjdGluZyA/IHRydWUgOiBmYWxzZTtcbiAgbW90aW9uQmx1ciA9IG1vdGlvbkJsdXIgJiYgIWZvcmNlZENvbnRleHQgJiYgci5tb3Rpb25CbHVyRW5hYmxlZCAmJiAhaW5Cb3hTZWxlY3Rpb247XG4gIHZhciBtb3Rpb25CbHVyRmFkZUVmZmVjdCA9IG1vdGlvbkJsdXI7XG4gIGlmICghZm9yY2VkQ29udGV4dCkge1xuICAgIGlmIChyLnByZXZQeFJhdGlvICE9PSBwaXhlbFJhdGlvKSB7XG4gICAgICByLmludmFsaWRhdGVDb250YWluZXJDbGllbnRDb29yZHNDYWNoZSgpO1xuICAgICAgci5tYXRjaENhbnZhc1NpemUoci5jb250YWluZXIpO1xuICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgICB9XG4gICAgci5wcmV2UHhSYXRpbyA9IHBpeGVsUmF0aW87XG4gIH1cbiAgaWYgKCFmb3JjZWRDb250ZXh0ICYmIHIubW90aW9uQmx1clRpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQoci5tb3Rpb25CbHVyVGltZW91dCk7XG4gIH1cbiAgaWYgKG1vdGlvbkJsdXIpIHtcbiAgICBpZiAoci5tYkZyYW1lcyA9PSBudWxsKSB7XG4gICAgICByLm1iRnJhbWVzID0gMDtcbiAgICB9XG4gICAgci5tYkZyYW1lcysrO1xuICAgIGlmIChyLm1iRnJhbWVzIDwgMykge1xuICAgICAgLy8gbmVlZCBzZXZlcmFsIGZyYW1lcyBiZWZvcmUgZXZlbiBoaWdoIHF1YWxpdHkgbW90aW9uYmx1clxuICAgICAgbW90aW9uQmx1ckZhZGVFZmZlY3QgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBnbyB0byBsb3dlciBxdWFsaXR5IGJsdXJyeSBmcmFtZXMgd2hlbiBzZXZlcmFsIG0vYiBmcmFtZXMgaGF2ZSBiZWVuIHJlbmRlcmVkIChhdm9pZHMgZmxhc2hpbmcpXG4gICAgaWYgKHIubWJGcmFtZXMgPiByLm1pbk1iTG93UXVhbEZyYW1lcykge1xuICAgICAgLy9yLmZ1bGxRdWFsaXR5TWIgPSBmYWxzZTtcbiAgICAgIHIubW90aW9uQmx1clB4UmF0aW8gPSByLm1iUHhSQmx1cnJ5O1xuICAgIH1cbiAgfVxuICBpZiAoci5jbGVhcmluZ01vdGlvbkJsdXIpIHtcbiAgICByLm1vdGlvbkJsdXJQeFJhdGlvID0gMTtcbiAgfVxuXG4gIC8vIGIvYyBkcmF3VG9Db250ZXh0KCkgbWF5IGJlIGFzeW5jIHcuci50LiByZWRyYXcoKSwga2VlcCB0cmFjayBvZiBsYXN0IHRleHR1cmUgZnJhbWVcbiAgLy8gYmVjYXVzZSBhIHJvZ3VlIGFzeW5jIHRleHR1cmUgZnJhbWUgd291bGQgY2xlYXIgbmVlZERyYXdcbiAgaWYgKHIudGV4dHVyZURyYXdMYXN0RnJhbWUgJiYgIXRleHR1cmVEcmF3KSB7XG4gICAgbmVlZERyYXdbci5OT0RFXSA9IHRydWU7XG4gICAgbmVlZERyYXdbci5TRUxFQ1RfQk9YXSA9IHRydWU7XG4gIH1cbiAgdmFyIHN0eWxlID0gY3kuc3R5bGUoKTtcbiAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gIHZhciBlZmZlY3RpdmVab29tID0gZm9yY2VkWm9vbSAhPT0gdW5kZWZpbmVkID8gZm9yY2VkWm9vbSA6IHpvb207XG4gIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgdmFyIGVmZmVjdGl2ZVBhbiA9IHtcbiAgICB4OiBwYW4ueCxcbiAgICB5OiBwYW4ueVxuICB9O1xuICB2YXIgdnAgPSB7XG4gICAgem9vbTogem9vbSxcbiAgICBwYW46IHtcbiAgICAgIHg6IHBhbi54LFxuICAgICAgeTogcGFuLnlcbiAgICB9XG4gIH07XG4gIHZhciBwcmV2VnAgPSByLnByZXZWaWV3cG9ydDtcbiAgdmFyIHZpZXdwb3J0SXNEaWZmID0gcHJldlZwID09PSB1bmRlZmluZWQgfHwgdnAuem9vbSAhPT0gcHJldlZwLnpvb20gfHwgdnAucGFuLnggIT09IHByZXZWcC5wYW4ueCB8fCB2cC5wYW4ueSAhPT0gcHJldlZwLnBhbi55O1xuXG4gIC8vIHdlIHdhbnQgdGhlIGxvdyBxdWFsaXR5IG1vdGlvbmJsdXIgb25seSB3aGVuIHRoZSB2aWV3cG9ydCBpcyBiZWluZyBtYW5pcHVsYXRlZCBldGMgKHdoZXJlIGl0J3Mgbm90IG5vdGljZWQpXG4gIGlmICghdmlld3BvcnRJc0RpZmYgJiYgIShpbk5vZGVEcmFnR2VzdHVyZSAmJiAhaGFzQ29tcG91bmROb2RlcykpIHtcbiAgICByLm1vdGlvbkJsdXJQeFJhdGlvID0gMTtcbiAgfVxuICBpZiAoZm9yY2VkUGFuKSB7XG4gICAgZWZmZWN0aXZlUGFuID0gZm9yY2VkUGFuO1xuICB9XG5cbiAgLy8gYXBwbHkgcGl4ZWwgcmF0aW9cblxuICBlZmZlY3RpdmVab29tICo9IHBpeGVsUmF0aW87XG4gIGVmZmVjdGl2ZVBhbi54ICo9IHBpeGVsUmF0aW87XG4gIGVmZmVjdGl2ZVBhbi55ICo9IHBpeGVsUmF0aW87XG4gIHZhciBlbGVzID0gci5nZXRDYWNoZWRaU29ydGVkRWxlcygpO1xuICBmdW5jdGlvbiBtYmNsZWFyKGNvbnRleHQsIHgsIHksIHcsIGgpIHtcbiAgICB2YXIgZ2NvID0gY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb247XG4gICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnZGVzdGluYXRpb24tb3V0JztcbiAgICByLmNvbG9yRmlsbFN0eWxlKGNvbnRleHQsIDI1NSwgMjU1LCAyNTUsIHIubW90aW9uQmx1clRyYW5zcGFyZW5jeSk7XG4gICAgY29udGV4dC5maWxsUmVjdCh4LCB5LCB3LCBoKTtcbiAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGdjbztcbiAgfVxuICBmdW5jdGlvbiBzZXRDb250ZXh0VHJhbnNmb3JtKGNvbnRleHQsIGNsZWFyKSB7XG4gICAgdmFyIGVQYW4sIGVab29tLCB3LCBoO1xuICAgIGlmICghci5jbGVhcmluZ01vdGlvbkJsdXIgJiYgKGNvbnRleHQgPT09IGRhdGEuYnVmZmVyQ29udGV4dHNbci5NT1RJT05CTFVSX0JVRkZFUl9OT0RFXSB8fCBjb250ZXh0ID09PSBkYXRhLmJ1ZmZlckNvbnRleHRzW3IuTU9USU9OQkxVUl9CVUZGRVJfRFJBR10pKSB7XG4gICAgICBlUGFuID0ge1xuICAgICAgICB4OiBwYW4ueCAqIG1iUHhSYXRpbyxcbiAgICAgICAgeTogcGFuLnkgKiBtYlB4UmF0aW9cbiAgICAgIH07XG4gICAgICBlWm9vbSA9IHpvb20gKiBtYlB4UmF0aW87XG4gICAgICB3ID0gci5jYW52YXNXaWR0aCAqIG1iUHhSYXRpbztcbiAgICAgIGggPSByLmNhbnZhc0hlaWdodCAqIG1iUHhSYXRpbztcbiAgICB9IGVsc2Uge1xuICAgICAgZVBhbiA9IGVmZmVjdGl2ZVBhbjtcbiAgICAgIGVab29tID0gZWZmZWN0aXZlWm9vbTtcbiAgICAgIHcgPSByLmNhbnZhc1dpZHRoO1xuICAgICAgaCA9IHIuY2FudmFzSGVpZ2h0O1xuICAgIH1cbiAgICBjb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICBpZiAoY2xlYXIgPT09ICdtb3Rpb25CbHVyJykge1xuICAgICAgbWJjbGVhcihjb250ZXh0LCAwLCAwLCB3LCBoKTtcbiAgICB9IGVsc2UgaWYgKCFmb3JjZWRDb250ZXh0ICYmIChjbGVhciA9PT0gdW5kZWZpbmVkIHx8IGNsZWFyKSkge1xuICAgICAgY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdywgaCk7XG4gICAgfVxuICAgIGlmICghZHJhd0FsbExheWVycykge1xuICAgICAgY29udGV4dC50cmFuc2xhdGUoZVBhbi54LCBlUGFuLnkpO1xuICAgICAgY29udGV4dC5zY2FsZShlWm9vbSwgZVpvb20pO1xuICAgIH1cbiAgICBpZiAoZm9yY2VkUGFuKSB7XG4gICAgICBjb250ZXh0LnRyYW5zbGF0ZShmb3JjZWRQYW4ueCwgZm9yY2VkUGFuLnkpO1xuICAgIH1cbiAgICBpZiAoZm9yY2VkWm9vbSkge1xuICAgICAgY29udGV4dC5zY2FsZShmb3JjZWRab29tLCBmb3JjZWRab29tKTtcbiAgICB9XG4gIH1cbiAgaWYgKCF0ZXh0dXJlRHJhdykge1xuICAgIHIudGV4dHVyZURyYXdMYXN0RnJhbWUgPSBmYWxzZTtcbiAgfVxuICBpZiAodGV4dHVyZURyYXcpIHtcbiAgICByLnRleHR1cmVEcmF3TGFzdEZyYW1lID0gdHJ1ZTtcbiAgICBpZiAoIXIudGV4dHVyZUNhY2hlKSB7XG4gICAgICByLnRleHR1cmVDYWNoZSA9IHt9O1xuICAgICAgci50ZXh0dXJlQ2FjaGUuYmIgPSBjeS5tdXRhYmxlRWxlbWVudHMoKS5ib3VuZGluZ0JveCgpO1xuICAgICAgci50ZXh0dXJlQ2FjaGUudGV4dHVyZSA9IHIuZGF0YS5idWZmZXJDYW52YXNlc1tyLlRFWFRVUkVfQlVGRkVSXTtcbiAgICAgIHZhciBjeHQgPSByLmRhdGEuYnVmZmVyQ29udGV4dHNbci5URVhUVVJFX0JVRkZFUl07XG4gICAgICBjeHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgY3h0LmNsZWFyUmVjdCgwLCAwLCByLmNhbnZhc1dpZHRoICogci50ZXh0dXJlTXVsdCwgci5jYW52YXNIZWlnaHQgKiByLnRleHR1cmVNdWx0KTtcbiAgICAgIHIucmVuZGVyKHtcbiAgICAgICAgZm9yY2VkQ29udGV4dDogY3h0LFxuICAgICAgICBkcmF3T25seU5vZGVMYXllcjogdHJ1ZSxcbiAgICAgICAgZm9yY2VkUHhSYXRpbzogcGl4ZWxSYXRpbyAqIHIudGV4dHVyZU11bHRcbiAgICAgIH0pO1xuICAgICAgdmFyIHZwID0gci50ZXh0dXJlQ2FjaGUudmlld3BvcnQgPSB7XG4gICAgICAgIHpvb206IGN5Lnpvb20oKSxcbiAgICAgICAgcGFuOiBjeS5wYW4oKSxcbiAgICAgICAgd2lkdGg6IHIuY2FudmFzV2lkdGgsXG4gICAgICAgIGhlaWdodDogci5jYW52YXNIZWlnaHRcbiAgICAgIH07XG4gICAgICB2cC5tcGFuID0ge1xuICAgICAgICB4OiAoMCAtIHZwLnBhbi54KSAvIHZwLnpvb20sXG4gICAgICAgIHk6ICgwIC0gdnAucGFuLnkpIC8gdnAuem9vbVxuICAgICAgfTtcbiAgICB9XG4gICAgbmVlZERyYXdbci5EUkFHXSA9IGZhbHNlO1xuICAgIG5lZWREcmF3W3IuTk9ERV0gPSBmYWxzZTtcbiAgICB2YXIgY29udGV4dCA9IGRhdGEuY29udGV4dHNbci5OT0RFXTtcbiAgICB2YXIgdGV4dHVyZSA9IHIudGV4dHVyZUNhY2hlLnRleHR1cmU7XG4gICAgdmFyIHZwID0gci50ZXh0dXJlQ2FjaGUudmlld3BvcnQ7XG4gICAgY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgaWYgKG1vdGlvbkJsdXIpIHtcbiAgICAgIG1iY2xlYXIoY29udGV4dCwgMCwgMCwgdnAud2lkdGgsIHZwLmhlaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHZwLndpZHRoLCB2cC5oZWlnaHQpO1xuICAgIH1cbiAgICB2YXIgb3V0c2lkZUJnQ29sb3IgPSBzdHlsZS5jb3JlKCdvdXRzaWRlLXRleHR1cmUtYmctY29sb3InKS52YWx1ZTtcbiAgICB2YXIgb3V0c2lkZUJnT3BhY2l0eSA9IHN0eWxlLmNvcmUoJ291dHNpZGUtdGV4dHVyZS1iZy1vcGFjaXR5JykudmFsdWU7XG4gICAgci5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBvdXRzaWRlQmdDb2xvclswXSwgb3V0c2lkZUJnQ29sb3JbMV0sIG91dHNpZGVCZ0NvbG9yWzJdLCBvdXRzaWRlQmdPcGFjaXR5KTtcbiAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIHZwLndpZHRoLCB2cC5oZWlnaHQpO1xuICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgIHNldENvbnRleHRUcmFuc2Zvcm0oY29udGV4dCwgZmFsc2UpO1xuICAgIGNvbnRleHQuY2xlYXJSZWN0KHZwLm1wYW4ueCwgdnAubXBhbi55LCB2cC53aWR0aCAvIHZwLnpvb20gLyBwaXhlbFJhdGlvLCB2cC5oZWlnaHQgLyB2cC56b29tIC8gcGl4ZWxSYXRpbyk7XG4gICAgY29udGV4dC5kcmF3SW1hZ2UodGV4dHVyZSwgdnAubXBhbi54LCB2cC5tcGFuLnksIHZwLndpZHRoIC8gdnAuem9vbSAvIHBpeGVsUmF0aW8sIHZwLmhlaWdodCAvIHZwLnpvb20gLyBwaXhlbFJhdGlvKTtcbiAgfSBlbHNlIGlmIChyLnRleHR1cmVPblZpZXdwb3J0ICYmICFmb3JjZWRDb250ZXh0KSB7XG4gICAgLy8gY2xlYXIgdGhlIGNhY2hlIHNpbmNlIHdlIGRvbid0IG5lZWQgaXRcbiAgICByLnRleHR1cmVDYWNoZSA9IG51bGw7XG4gIH1cbiAgdmFyIGV4dGVudCA9IGN5LmV4dGVudCgpO1xuICB2YXIgdnBNYW5pcCA9IHIucGluY2hpbmcgfHwgci5ob3ZlckRhdGEuZHJhZ2dpbmcgfHwgci5zd2lwZVBhbm5pbmcgfHwgci5kYXRhLndoZWVsWm9vbWluZyB8fCByLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgfHwgci5jeS5hbmltYXRlZCgpO1xuICB2YXIgaGlkZUVkZ2VzID0gci5oaWRlRWRnZXNPblZpZXdwb3J0ICYmIHZwTWFuaXA7XG4gIHZhciBuZWVkTWJDbGVhciA9IFtdO1xuICBuZWVkTWJDbGVhcltyLk5PREVdID0gIW5lZWREcmF3W3IuTk9ERV0gJiYgbW90aW9uQmx1ciAmJiAhci5jbGVhcmVkRm9yTW90aW9uQmx1cltyLk5PREVdIHx8IHIuY2xlYXJpbmdNb3Rpb25CbHVyO1xuICBpZiAobmVlZE1iQ2xlYXJbci5OT0RFXSkge1xuICAgIHIuY2xlYXJlZEZvck1vdGlvbkJsdXJbci5OT0RFXSA9IHRydWU7XG4gIH1cbiAgbmVlZE1iQ2xlYXJbci5EUkFHXSA9ICFuZWVkRHJhd1tyLkRSQUddICYmIG1vdGlvbkJsdXIgJiYgIXIuY2xlYXJlZEZvck1vdGlvbkJsdXJbci5EUkFHXSB8fCByLmNsZWFyaW5nTW90aW9uQmx1cjtcbiAgaWYgKG5lZWRNYkNsZWFyW3IuRFJBR10pIHtcbiAgICByLmNsZWFyZWRGb3JNb3Rpb25CbHVyW3IuRFJBR10gPSB0cnVlO1xuICB9XG4gIGlmIChuZWVkRHJhd1tyLk5PREVdIHx8IGRyYXdBbGxMYXllcnMgfHwgZHJhd09ubHlOb2RlTGF5ZXIgfHwgbmVlZE1iQ2xlYXJbci5OT0RFXSkge1xuICAgIHZhciB1c2VCdWZmZXIgPSBtb3Rpb25CbHVyICYmICFuZWVkTWJDbGVhcltyLk5PREVdICYmIG1iUHhSYXRpbyAhPT0gMTtcbiAgICB2YXIgY29udGV4dCA9IGZvcmNlZENvbnRleHQgfHwgKHVzZUJ1ZmZlciA/IHIuZGF0YS5idWZmZXJDb250ZXh0c1tyLk1PVElPTkJMVVJfQlVGRkVSX05PREVdIDogZGF0YS5jb250ZXh0c1tyLk5PREVdKTtcbiAgICB2YXIgY2xlYXIgPSBtb3Rpb25CbHVyICYmICF1c2VCdWZmZXIgPyAnbW90aW9uQmx1cicgOiB1bmRlZmluZWQ7XG4gICAgc2V0Q29udGV4dFRyYW5zZm9ybShjb250ZXh0LCBjbGVhcik7XG4gICAgaWYgKGhpZGVFZGdlcykge1xuICAgICAgci5kcmF3Q2FjaGVkTm9kZXMoY29udGV4dCwgZWxlcy5ub25kcmFnLCBwaXhlbFJhdGlvLCBleHRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByLmRyYXdMYXllcmVkRWxlbWVudHMoY29udGV4dCwgZWxlcy5ub25kcmFnLCBwaXhlbFJhdGlvLCBleHRlbnQpO1xuICAgIH1cbiAgICBpZiAoci5kZWJ1Zykge1xuICAgICAgci5kcmF3RGVidWdQb2ludHMoY29udGV4dCwgZWxlcy5ub25kcmFnKTtcbiAgICB9XG4gICAgaWYgKCFkcmF3QWxsTGF5ZXJzICYmICFtb3Rpb25CbHVyKSB7XG4gICAgICBuZWVkRHJhd1tyLk5PREVdID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmICghZHJhd09ubHlOb2RlTGF5ZXIgJiYgKG5lZWREcmF3W3IuRFJBR10gfHwgZHJhd0FsbExheWVycyB8fCBuZWVkTWJDbGVhcltyLkRSQUddKSkge1xuICAgIHZhciB1c2VCdWZmZXIgPSBtb3Rpb25CbHVyICYmICFuZWVkTWJDbGVhcltyLkRSQUddICYmIG1iUHhSYXRpbyAhPT0gMTtcbiAgICB2YXIgY29udGV4dCA9IGZvcmNlZENvbnRleHQgfHwgKHVzZUJ1ZmZlciA/IHIuZGF0YS5idWZmZXJDb250ZXh0c1tyLk1PVElPTkJMVVJfQlVGRkVSX0RSQUddIDogZGF0YS5jb250ZXh0c1tyLkRSQUddKTtcbiAgICBzZXRDb250ZXh0VHJhbnNmb3JtKGNvbnRleHQsIG1vdGlvbkJsdXIgJiYgIXVzZUJ1ZmZlciA/ICdtb3Rpb25CbHVyJyA6IHVuZGVmaW5lZCk7XG4gICAgaWYgKGhpZGVFZGdlcykge1xuICAgICAgci5kcmF3Q2FjaGVkTm9kZXMoY29udGV4dCwgZWxlcy5kcmFnLCBwaXhlbFJhdGlvLCBleHRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByLmRyYXdDYWNoZWRFbGVtZW50cyhjb250ZXh0LCBlbGVzLmRyYWcsIHBpeGVsUmF0aW8sIGV4dGVudCk7XG4gICAgfVxuICAgIGlmIChyLmRlYnVnKSB7XG4gICAgICByLmRyYXdEZWJ1Z1BvaW50cyhjb250ZXh0LCBlbGVzLmRyYWcpO1xuICAgIH1cbiAgICBpZiAoIWRyYXdBbGxMYXllcnMgJiYgIW1vdGlvbkJsdXIpIHtcbiAgICAgIG5lZWREcmF3W3IuRFJBR10gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKHIuc2hvd0ZwcyB8fCAhZHJhd09ubHlOb2RlTGF5ZXIgJiYgbmVlZERyYXdbci5TRUxFQ1RfQk9YXSAmJiAhZHJhd0FsbExheWVycykge1xuICAgIHZhciBjb250ZXh0ID0gZm9yY2VkQ29udGV4dCB8fCBkYXRhLmNvbnRleHRzW3IuU0VMRUNUX0JPWF07XG4gICAgc2V0Q29udGV4dFRyYW5zZm9ybShjb250ZXh0KTtcbiAgICBpZiAoci5zZWxlY3Rpb25bNF0gPT0gMSAmJiAoci5ob3ZlckRhdGEuc2VsZWN0aW5nIHx8IHIudG91Y2hEYXRhLnNlbGVjdGluZykpIHtcbiAgICAgIHZhciB6b29tID0gci5jeS56b29tKCk7XG4gICAgICB2YXIgYm9yZGVyV2lkdGggPSBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LWJvcmRlci13aWR0aCcpLnZhbHVlIC8gem9vbTtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gYm9yZGVyV2lkdGg7XG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2JhKCcgKyBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LWNvbG9yJykudmFsdWVbMF0gKyAnLCcgKyBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LWNvbG9yJykudmFsdWVbMV0gKyAnLCcgKyBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LWNvbG9yJykudmFsdWVbMl0gKyAnLCcgKyBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LW9wYWNpdHknKS52YWx1ZSArICcpJztcbiAgICAgIGNvbnRleHQuZmlsbFJlY3Qoci5zZWxlY3Rpb25bMF0sIHIuc2VsZWN0aW9uWzFdLCByLnNlbGVjdGlvblsyXSAtIHIuc2VsZWN0aW9uWzBdLCByLnNlbGVjdGlvblszXSAtIHIuc2VsZWN0aW9uWzFdKTtcbiAgICAgIGlmIChib3JkZXJXaWR0aCA+IDApIHtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9ICdyZ2JhKCcgKyBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LWJvcmRlci1jb2xvcicpLnZhbHVlWzBdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1ib3JkZXItY29sb3InKS52YWx1ZVsxXSArICcsJyArIHN0eWxlLmNvcmUoJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLWNvbG9yJykudmFsdWVbMl0gKyAnLCcgKyBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LW9wYWNpdHknKS52YWx1ZSArICcpJztcbiAgICAgICAgY29udGV4dC5zdHJva2VSZWN0KHIuc2VsZWN0aW9uWzBdLCByLnNlbGVjdGlvblsxXSwgci5zZWxlY3Rpb25bMl0gLSByLnNlbGVjdGlvblswXSwgci5zZWxlY3Rpb25bM10gLSByLnNlbGVjdGlvblsxXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkYXRhLmJnQWN0aXZlUG9zaXN0aW9uICYmICFyLmhvdmVyRGF0YS5zZWxlY3RpbmcpIHtcbiAgICAgIHZhciB6b29tID0gci5jeS56b29tKCk7XG4gICAgICB2YXIgcG9zID0gZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbjtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJ3JnYmEoJyArIHN0eWxlLmNvcmUoJ2FjdGl2ZS1iZy1jb2xvcicpLnZhbHVlWzBdICsgJywnICsgc3R5bGUuY29yZSgnYWN0aXZlLWJnLWNvbG9yJykudmFsdWVbMV0gKyAnLCcgKyBzdHlsZS5jb3JlKCdhY3RpdmUtYmctY29sb3InKS52YWx1ZVsyXSArICcsJyArIHN0eWxlLmNvcmUoJ2FjdGl2ZS1iZy1vcGFjaXR5JykudmFsdWUgKyAnKSc7XG4gICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgY29udGV4dC5hcmMocG9zLngsIHBvcy55LCBzdHlsZS5jb3JlKCdhY3RpdmUtYmctc2l6ZScpLnBmVmFsdWUgLyB6b29tLCAwLCAyICogTWF0aC5QSSk7XG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICB9XG4gICAgdmFyIHRpbWVUb1JlbmRlciA9IHIubGFzdFJlZHJhd1RpbWU7XG4gICAgaWYgKHIuc2hvd0ZwcyAmJiB0aW1lVG9SZW5kZXIpIHtcbiAgICAgIHRpbWVUb1JlbmRlciA9IE1hdGgucm91bmQodGltZVRvUmVuZGVyKTtcbiAgICAgIHZhciBmcHMgPSBNYXRoLnJvdW5kKDEwMDAgLyB0aW1lVG9SZW5kZXIpO1xuICAgICAgY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2JhKDI1NSwgMCwgMCwgMC43NSknO1xuICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9ICdyZ2JhKDI1NSwgMCwgMCwgMC43NSknO1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSAxO1xuICAgICAgY29udGV4dC5maWxsVGV4dCgnMSBmcmFtZSA9ICcgKyB0aW1lVG9SZW5kZXIgKyAnIG1zID0gJyArIGZwcyArICcgZnBzJywgMCwgMjApO1xuICAgICAgdmFyIG1heEZwcyA9IDYwO1xuICAgICAgY29udGV4dC5zdHJva2VSZWN0KDAsIDMwLCAyNTAsIDIwKTtcbiAgICAgIGNvbnRleHQuZmlsbFJlY3QoMCwgMzAsIDI1MCAqIE1hdGgubWluKGZwcyAvIG1heEZwcywgMSksIDIwKTtcbiAgICB9XG4gICAgaWYgKCFkcmF3QWxsTGF5ZXJzKSB7XG4gICAgICBuZWVkRHJhd1tyLlNFTEVDVF9CT1hdID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gbW90aW9uYmx1cjogYmxpdCByZW5kZXJlZCBibHVycnkgZnJhbWVzXG4gIGlmIChtb3Rpb25CbHVyICYmIG1iUHhSYXRpbyAhPT0gMSkge1xuICAgIHZhciBjeHROb2RlID0gZGF0YS5jb250ZXh0c1tyLk5PREVdO1xuICAgIHZhciB0eHROb2RlID0gci5kYXRhLmJ1ZmZlckNhbnZhc2VzW3IuTU9USU9OQkxVUl9CVUZGRVJfTk9ERV07XG4gICAgdmFyIGN4dERyYWcgPSBkYXRhLmNvbnRleHRzW3IuRFJBR107XG4gICAgdmFyIHR4dERyYWcgPSByLmRhdGEuYnVmZmVyQ2FudmFzZXNbci5NT1RJT05CTFVSX0JVRkZFUl9EUkFHXTtcbiAgICB2YXIgZHJhd01vdGlvbkJsdXIgPSBmdW5jdGlvbiBkcmF3TW90aW9uQmx1cihjeHQsIHR4dCwgbmVlZENsZWFyKSB7XG4gICAgICBjeHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgaWYgKG5lZWRDbGVhciB8fCAhbW90aW9uQmx1ckZhZGVFZmZlY3QpIHtcbiAgICAgICAgY3h0LmNsZWFyUmVjdCgwLCAwLCByLmNhbnZhc1dpZHRoLCByLmNhbnZhc0hlaWdodCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYmNsZWFyKGN4dCwgMCwgMCwgci5jYW52YXNXaWR0aCwgci5jYW52YXNIZWlnaHQpO1xuICAgICAgfVxuICAgICAgdmFyIHB4ciA9IG1iUHhSYXRpbztcbiAgICAgIGN4dC5kcmF3SW1hZ2UodHh0LFxuICAgICAgLy8gaW1nXG4gICAgICAwLCAwLFxuICAgICAgLy8gc3gsIHN5XG4gICAgICByLmNhbnZhc1dpZHRoICogcHhyLCByLmNhbnZhc0hlaWdodCAqIHB4cixcbiAgICAgIC8vIHN3LCBzaFxuICAgICAgMCwgMCxcbiAgICAgIC8vIHgsIHlcbiAgICAgIHIuY2FudmFzV2lkdGgsIHIuY2FudmFzSGVpZ2h0IC8vIHcsIGhcbiAgICAgICk7XG4gICAgfTtcblxuICAgIGlmIChuZWVkRHJhd1tyLk5PREVdIHx8IG5lZWRNYkNsZWFyW3IuTk9ERV0pIHtcbiAgICAgIGRyYXdNb3Rpb25CbHVyKGN4dE5vZGUsIHR4dE5vZGUsIG5lZWRNYkNsZWFyW3IuTk9ERV0pO1xuICAgICAgbmVlZERyYXdbci5OT0RFXSA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmVlZERyYXdbci5EUkFHXSB8fCBuZWVkTWJDbGVhcltyLkRSQUddKSB7XG4gICAgICBkcmF3TW90aW9uQmx1cihjeHREcmFnLCB0eHREcmFnLCBuZWVkTWJDbGVhcltyLkRSQUddKTtcbiAgICAgIG5lZWREcmF3W3IuRFJBR10gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgci5wcmV2Vmlld3BvcnQgPSB2cDtcbiAgaWYgKHIuY2xlYXJpbmdNb3Rpb25CbHVyKSB7XG4gICAgci5jbGVhcmluZ01vdGlvbkJsdXIgPSBmYWxzZTtcbiAgICByLm1vdGlvbkJsdXJDbGVhcmVkID0gdHJ1ZTtcbiAgICByLm1vdGlvbkJsdXIgPSB0cnVlO1xuICB9XG4gIGlmIChtb3Rpb25CbHVyKSB7XG4gICAgci5tb3Rpb25CbHVyVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgci5tb3Rpb25CbHVyVGltZW91dCA9IG51bGw7XG4gICAgICByLmNsZWFyZWRGb3JNb3Rpb25CbHVyW3IuTk9ERV0gPSBmYWxzZTtcbiAgICAgIHIuY2xlYXJlZEZvck1vdGlvbkJsdXJbci5EUkFHXSA9IGZhbHNlO1xuICAgICAgci5tb3Rpb25CbHVyID0gZmFsc2U7XG4gICAgICByLmNsZWFyaW5nTW90aW9uQmx1ciA9ICF0ZXh0dXJlRHJhdztcbiAgICAgIHIubWJGcmFtZXMgPSAwO1xuICAgICAgbmVlZERyYXdbci5OT0RFXSA9IHRydWU7XG4gICAgICBuZWVkRHJhd1tyLkRSQUddID0gdHJ1ZTtcbiAgICAgIHIucmVkcmF3KCk7XG4gICAgfSwgbW90aW9uQmx1ckRlbGF5KTtcbiAgfVxuICBpZiAoIWZvcmNlZENvbnRleHQpIHtcbiAgICBjeS5lbWl0KCdyZW5kZXInKTtcbiAgfVxufTtcblxudmFyIENScCQzID0ge307XG5cbi8vIEBPIFBvbHlnb24gZHJhd2luZ1xuQ1JwJDMuZHJhd1BvbHlnb25QYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBvaW50cykge1xuICB2YXIgaGFsZlcgPSB3aWR0aCAvIDI7XG4gIHZhciBoYWxmSCA9IGhlaWdodCAvIDI7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cbiAgY29udGV4dC5tb3ZlVG8oeCArIGhhbGZXICogcG9pbnRzWzBdLCB5ICsgaGFsZkggKiBwb2ludHNbMV0pO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IHBvaW50cy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZlcgKiBwb2ludHNbaSAqIDJdLCB5ICsgaGFsZkggKiBwb2ludHNbaSAqIDIgKyAxXSk7XG4gIH1cbiAgY29udGV4dC5jbG9zZVBhdGgoKTtcbn07XG5DUnAkMy5kcmF3Um91bmRQb2x5Z29uUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwb2ludHMpIHtcbiAgdmFyIGhhbGZXID0gd2lkdGggLyAyO1xuICB2YXIgaGFsZkggPSBoZWlnaHQgLyAyO1xuICB2YXIgY29ybmVyUmFkaXVzID0gZ2V0Um91bmRQb2x5Z29uUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICB9XG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBwb2ludHMubGVuZ3RoIC8gNDsgX2krKykge1xuICAgIHZhciBzb3VyY2VVdiA9IHZvaWQgMCxcbiAgICAgIGRlc3RVdiA9IHZvaWQgMDtcbiAgICBpZiAoX2kgPT09IDApIHtcbiAgICAgIHNvdXJjZVV2ID0gcG9pbnRzLmxlbmd0aCAtIDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvdXJjZVV2ID0gX2kgKiA0IC0gMjtcbiAgICB9XG4gICAgZGVzdFV2ID0gX2kgKiA0ICsgMjtcbiAgICB2YXIgcHggPSB4ICsgaGFsZlcgKiBwb2ludHNbX2kgKiA0XTtcbiAgICB2YXIgcHkgPSB5ICsgaGFsZkggKiBwb2ludHNbX2kgKiA0ICsgMV07XG4gICAgdmFyIGNvc1RoZXRhID0gLXBvaW50c1tzb3VyY2VVdl0gKiBwb2ludHNbZGVzdFV2XSAtIHBvaW50c1tzb3VyY2VVdiArIDFdICogcG9pbnRzW2Rlc3RVdiArIDFdO1xuICAgIHZhciBvZmZzZXQgPSBjb3JuZXJSYWRpdXMgLyBNYXRoLnRhbihNYXRoLmFjb3MoY29zVGhldGEpIC8gMik7XG4gICAgdmFyIGNwMHggPSBweCAtIG9mZnNldCAqIHBvaW50c1tzb3VyY2VVdl07XG4gICAgdmFyIGNwMHkgPSBweSAtIG9mZnNldCAqIHBvaW50c1tzb3VyY2VVdiArIDFdO1xuICAgIHZhciBjcDF4ID0gcHggKyBvZmZzZXQgKiBwb2ludHNbZGVzdFV2XTtcbiAgICB2YXIgY3AxeSA9IHB5ICsgb2Zmc2V0ICogcG9pbnRzW2Rlc3RVdiArIDFdO1xuICAgIGlmIChfaSA9PT0gMCkge1xuICAgICAgY29udGV4dC5tb3ZlVG8oY3AweCwgY3AweSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQubGluZVRvKGNwMHgsIGNwMHkpO1xuICAgIH1cbiAgICBjb250ZXh0LmFyY1RvKHB4LCBweSwgY3AxeCwgY3AxeSwgY29ybmVyUmFkaXVzKTtcbiAgfVxuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcblxuLy8gUm91bmQgcmVjdGFuZ2xlIGRyYXdpbmdcbkNScCQzLmRyYXdSb3VuZFJlY3RhbmdsZVBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICB2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG4gIHZhciBjb3JuZXJSYWRpdXMgPSBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KTtcbiAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgfVxuXG4gIC8vIFN0YXJ0IGF0IHRvcCBtaWRkbGVcbiAgY29udGV4dC5tb3ZlVG8oeCwgeSAtIGhhbGZIZWlnaHQpO1xuICAvLyBBcmMgZnJvbSBtaWRkbGUgdG9wIHRvIHJpZ2h0IHNpZGVcbiAgY29udGV4dC5hcmNUbyh4ICsgaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCwgeCArIGhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzKTtcbiAgLy8gQXJjIGZyb20gcmlnaHQgc2lkZSB0byBib3R0b21cbiAgY29udGV4dC5hcmNUbyh4ICsgaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCwgeSArIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyk7XG4gIC8vIEFyYyBmcm9tIGJvdHRvbSB0byBsZWZ0IHNpZGVcbiAgY29udGV4dC5hcmNUbyh4IC0gaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCAtIGhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzKTtcbiAgLy8gQXJjIGZyb20gbGVmdCBzaWRlIHRvIHRvcEJvcmRlclxuICBjb250ZXh0LmFyY1RvKHggLSBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0LCB4LCB5IC0gaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzKTtcbiAgLy8gSm9pbiBsaW5lXG4gIGNvbnRleHQubGluZVRvKHgsIHkgLSBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5jbG9zZVBhdGgoKTtcbn07XG5DUnAkMy5kcmF3Qm90dG9tUm91bmRSZWN0YW5nbGVQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuICB2YXIgY29ybmVyUmFkaXVzID0gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCk7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cblxuICAvLyBTdGFydCBhdCB0b3AgbWlkZGxlXG4gIGNvbnRleHQubW92ZVRvKHgsIHkgLSBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5saW5lVG8oeCArIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZldpZHRoLCB5KTtcbiAgY29udGV4dC5hcmNUbyh4ICsgaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCwgeSArIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyk7XG4gIGNvbnRleHQuYXJjVG8oeCAtIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQsIHggLSBoYWxmV2lkdGgsIHksIGNvcm5lclJhZGl1cyk7XG4gIGNvbnRleHQubGluZVRvKHggLSBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5saW5lVG8oeCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcbkNScCQzLmRyYXdDdXRSZWN0YW5nbGVQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuICB2YXIgY29ybmVyTGVuZ3RoID0gZ2V0Q3V0UmVjdGFuZ2xlQ29ybmVyTGVuZ3RoKCk7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cbiAgY29udGV4dC5tb3ZlVG8oeCAtIGhhbGZXaWR0aCArIGNvcm5lckxlbmd0aCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZldpZHRoIC0gY29ybmVyTGVuZ3RoLCB5IC0gaGFsZkhlaWdodCk7XG4gIGNvbnRleHQubGluZVRvKHggKyBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyTGVuZ3RoKTtcbiAgY29udGV4dC5saW5lVG8oeCArIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQgLSBjb3JuZXJMZW5ndGgpO1xuICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZldpZHRoIC0gY29ybmVyTGVuZ3RoLCB5ICsgaGFsZkhlaWdodCk7XG4gIGNvbnRleHQubGluZVRvKHggLSBoYWxmV2lkdGggKyBjb3JuZXJMZW5ndGgsIHkgKyBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5saW5lVG8oeCAtIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQgLSBjb3JuZXJMZW5ndGgpO1xuICBjb250ZXh0LmxpbmVUbyh4IC0gaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCArIGNvcm5lckxlbmd0aCk7XG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG59O1xuQ1JwJDMuZHJhd0JhcnJlbFBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICB2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG4gIHZhciB4QmVnaW4gPSB4IC0gaGFsZldpZHRoO1xuICB2YXIgeEVuZCA9IHggKyBoYWxmV2lkdGg7XG4gIHZhciB5QmVnaW4gPSB5IC0gaGFsZkhlaWdodDtcbiAgdmFyIHlFbmQgPSB5ICsgaGFsZkhlaWdodDtcbiAgdmFyIGJhcnJlbEN1cnZlQ29uc3RhbnRzID0gZ2V0QmFycmVsQ3VydmVDb25zdGFudHMod2lkdGgsIGhlaWdodCk7XG4gIHZhciB3T2Zmc2V0ID0gYmFycmVsQ3VydmVDb25zdGFudHMud2lkdGhPZmZzZXQ7XG4gIHZhciBoT2Zmc2V0ID0gYmFycmVsQ3VydmVDb25zdGFudHMuaGVpZ2h0T2Zmc2V0O1xuICB2YXIgY3RybFB0WE9mZnNldCA9IGJhcnJlbEN1cnZlQ29uc3RhbnRzLmN0cmxQdE9mZnNldFBjdCAqIHdPZmZzZXQ7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cbiAgY29udGV4dC5tb3ZlVG8oeEJlZ2luLCB5QmVnaW4gKyBoT2Zmc2V0KTtcbiAgY29udGV4dC5saW5lVG8oeEJlZ2luLCB5RW5kIC0gaE9mZnNldCk7XG4gIGNvbnRleHQucXVhZHJhdGljQ3VydmVUbyh4QmVnaW4gKyBjdHJsUHRYT2Zmc2V0LCB5RW5kLCB4QmVnaW4gKyB3T2Zmc2V0LCB5RW5kKTtcbiAgY29udGV4dC5saW5lVG8oeEVuZCAtIHdPZmZzZXQsIHlFbmQpO1xuICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oeEVuZCAtIGN0cmxQdFhPZmZzZXQsIHlFbmQsIHhFbmQsIHlFbmQgLSBoT2Zmc2V0KTtcbiAgY29udGV4dC5saW5lVG8oeEVuZCwgeUJlZ2luICsgaE9mZnNldCk7XG4gIGNvbnRleHQucXVhZHJhdGljQ3VydmVUbyh4RW5kIC0gY3RybFB0WE9mZnNldCwgeUJlZ2luLCB4RW5kIC0gd09mZnNldCwgeUJlZ2luKTtcbiAgY29udGV4dC5saW5lVG8oeEJlZ2luICsgd09mZnNldCwgeUJlZ2luKTtcbiAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKHhCZWdpbiArIGN0cmxQdFhPZmZzZXQsIHlCZWdpbiwgeEJlZ2luLCB5QmVnaW4gKyBoT2Zmc2V0KTtcbiAgY29udGV4dC5jbG9zZVBhdGgoKTtcbn07XG52YXIgc2luMCA9IE1hdGguc2luKDApO1xudmFyIGNvczAgPSBNYXRoLmNvcygwKTtcbnZhciBzaW4gPSB7fTtcbnZhciBjb3MgPSB7fTtcbnZhciBlbGxpcHNlU3RlcFNpemUgPSBNYXRoLlBJIC8gNDA7XG5mb3IgKHZhciBpID0gMCAqIE1hdGguUEk7IGkgPCAyICogTWF0aC5QSTsgaSArPSBlbGxpcHNlU3RlcFNpemUpIHtcbiAgc2luW2ldID0gTWF0aC5zaW4oaSk7XG4gIGNvc1tpXSA9IE1hdGguY29zKGkpO1xufVxuQ1JwJDMuZHJhd0VsbGlwc2VQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpIHtcbiAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgfVxuICBpZiAoY29udGV4dC5lbGxpcHNlKSB7XG4gICAgY29udGV4dC5lbGxpcHNlKGNlbnRlclgsIGNlbnRlclksIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgMCwgMCwgMiAqIE1hdGguUEkpO1xuICB9IGVsc2Uge1xuICAgIHZhciB4UG9zLCB5UG9zO1xuICAgIHZhciBydyA9IHdpZHRoIC8gMjtcbiAgICB2YXIgcmggPSBoZWlnaHQgLyAyO1xuICAgIGZvciAodmFyIGkgPSAwICogTWF0aC5QSTsgaSA8IDIgKiBNYXRoLlBJOyBpICs9IGVsbGlwc2VTdGVwU2l6ZSkge1xuICAgICAgeFBvcyA9IGNlbnRlclggLSBydyAqIHNpbltpXSAqIHNpbjAgKyBydyAqIGNvc1tpXSAqIGNvczA7XG4gICAgICB5UG9zID0gY2VudGVyWSArIHJoICogY29zW2ldICogc2luMCArIHJoICogc2luW2ldICogY29zMDtcbiAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgIGNvbnRleHQubW92ZVRvKHhQb3MsIHlQb3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dC5saW5lVG8oeFBvcywgeVBvcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG59O1xuXG4vKiBnbG9iYWwgYXRvYiwgQXJyYXlCdWZmZXIsIFVpbnQ4QXJyYXksIEJsb2IgKi9cbnZhciBDUnAkMiA9IHt9O1xuQ1JwJDIuY3JlYXRlQnVmZmVyID0gZnVuY3Rpb24gKHcsIGgpIHtcbiAgdmFyIGJ1ZmZlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gIGJ1ZmZlci53aWR0aCA9IHc7XG4gIGJ1ZmZlci5oZWlnaHQgPSBoO1xuICByZXR1cm4gW2J1ZmZlciwgYnVmZmVyLmdldENvbnRleHQoJzJkJyldO1xufTtcbkNScCQyLmJ1ZmZlckNhbnZhc0ltYWdlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeTtcbiAgdmFyIGVsZXMgPSBjeS5tdXRhYmxlRWxlbWVudHMoKTtcbiAgdmFyIGJiID0gZWxlcy5ib3VuZGluZ0JveCgpO1xuICB2YXIgY3RyUmVjdCA9IHRoaXMuZmluZENvbnRhaW5lckNsaWVudENvb3JkcygpO1xuICB2YXIgd2lkdGggPSBvcHRpb25zLmZ1bGwgPyBNYXRoLmNlaWwoYmIudykgOiBjdHJSZWN0WzJdO1xuICB2YXIgaGVpZ2h0ID0gb3B0aW9ucy5mdWxsID8gTWF0aC5jZWlsKGJiLmgpIDogY3RyUmVjdFszXTtcbiAgdmFyIHNwZWNkTWF4RGltcyA9IG51bWJlciQxKG9wdGlvbnMubWF4V2lkdGgpIHx8IG51bWJlciQxKG9wdGlvbnMubWF4SGVpZ2h0KTtcbiAgdmFyIHB4UmF0aW8gPSB0aGlzLmdldFBpeGVsUmF0aW8oKTtcbiAgdmFyIHNjYWxlID0gMTtcbiAgaWYgKG9wdGlvbnMuc2NhbGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHdpZHRoICo9IG9wdGlvbnMuc2NhbGU7XG4gICAgaGVpZ2h0ICo9IG9wdGlvbnMuc2NhbGU7XG4gICAgc2NhbGUgPSBvcHRpb25zLnNjYWxlO1xuICB9IGVsc2UgaWYgKHNwZWNkTWF4RGltcykge1xuICAgIHZhciBtYXhTY2FsZVcgPSBJbmZpbml0eTtcbiAgICB2YXIgbWF4U2NhbGVIID0gSW5maW5pdHk7XG4gICAgaWYgKG51bWJlciQxKG9wdGlvbnMubWF4V2lkdGgpKSB7XG4gICAgICBtYXhTY2FsZVcgPSBzY2FsZSAqIG9wdGlvbnMubWF4V2lkdGggLyB3aWR0aDtcbiAgICB9XG4gICAgaWYgKG51bWJlciQxKG9wdGlvbnMubWF4SGVpZ2h0KSkge1xuICAgICAgbWF4U2NhbGVIID0gc2NhbGUgKiBvcHRpb25zLm1heEhlaWdodCAvIGhlaWdodDtcbiAgICB9XG4gICAgc2NhbGUgPSBNYXRoLm1pbihtYXhTY2FsZVcsIG1heFNjYWxlSCk7XG4gICAgd2lkdGggKj0gc2NhbGU7XG4gICAgaGVpZ2h0ICo9IHNjYWxlO1xuICB9XG4gIGlmICghc3BlY2RNYXhEaW1zKSB7XG4gICAgd2lkdGggKj0gcHhSYXRpbztcbiAgICBoZWlnaHQgKj0gcHhSYXRpbztcbiAgICBzY2FsZSAqPSBweFJhdGlvO1xuICB9XG4gIHZhciBidWZmQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICBidWZmQ2FudmFzLndpZHRoID0gd2lkdGg7XG4gIGJ1ZmZDYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICBidWZmQ2FudmFzLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuICBidWZmQ2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gIHZhciBidWZmQ3h0ID0gYnVmZkNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gIC8vIFJhc3Rlcml6ZSB0aGUgbGF5ZXJzLCBidXQgb25seSBpZiBjb250YWluZXIgaGFzIG5vbnplcm8gc2l6ZVxuICBpZiAod2lkdGggPiAwICYmIGhlaWdodCA+IDApIHtcbiAgICBidWZmQ3h0LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBidWZmQ3h0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdzb3VyY2Utb3Zlcic7XG4gICAgdmFyIHpzb3J0ZWRFbGVzID0gdGhpcy5nZXRDYWNoZWRaU29ydGVkRWxlcygpO1xuICAgIGlmIChvcHRpb25zLmZ1bGwpIHtcbiAgICAgIC8vIGRyYXcgdGhlIGZ1bGwgYm91bmRzIG9mIHRoZSBncmFwaFxuICAgICAgYnVmZkN4dC50cmFuc2xhdGUoLWJiLngxICogc2NhbGUsIC1iYi55MSAqIHNjYWxlKTtcbiAgICAgIGJ1ZmZDeHQuc2NhbGUoc2NhbGUsIHNjYWxlKTtcbiAgICAgIHRoaXMuZHJhd0VsZW1lbnRzKGJ1ZmZDeHQsIHpzb3J0ZWRFbGVzKTtcbiAgICAgIGJ1ZmZDeHQuc2NhbGUoMSAvIHNjYWxlLCAxIC8gc2NhbGUpO1xuICAgICAgYnVmZkN4dC50cmFuc2xhdGUoYmIueDEgKiBzY2FsZSwgYmIueTEgKiBzY2FsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRyYXcgdGhlIGN1cnJlbnQgdmlld1xuICAgICAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICAgICAgdmFyIHRyYW5zbGF0aW9uID0ge1xuICAgICAgICB4OiBwYW4ueCAqIHNjYWxlLFxuICAgICAgICB5OiBwYW4ueSAqIHNjYWxlXG4gICAgICB9O1xuICAgICAgc2NhbGUgKj0gY3kuem9vbSgpO1xuICAgICAgYnVmZkN4dC50cmFuc2xhdGUodHJhbnNsYXRpb24ueCwgdHJhbnNsYXRpb24ueSk7XG4gICAgICBidWZmQ3h0LnNjYWxlKHNjYWxlLCBzY2FsZSk7XG4gICAgICB0aGlzLmRyYXdFbGVtZW50cyhidWZmQ3h0LCB6c29ydGVkRWxlcyk7XG4gICAgICBidWZmQ3h0LnNjYWxlKDEgLyBzY2FsZSwgMSAvIHNjYWxlKTtcbiAgICAgIGJ1ZmZDeHQudHJhbnNsYXRlKC10cmFuc2xhdGlvbi54LCAtdHJhbnNsYXRpb24ueSk7XG4gICAgfVxuXG4gICAgLy8gbmVlZCB0byBmaWxsIGJnIGF0IGVuZCBsaWtlIHRoaXMgaW4gb3JkZXIgdG8gZmlsbCBjbGVhcmVkIHRyYW5zcGFyZW50IHBpeGVscyBpbiBqcGdzXG4gICAgaWYgKG9wdGlvbnMuYmcpIHtcbiAgICAgIGJ1ZmZDeHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLW92ZXInO1xuICAgICAgYnVmZkN4dC5maWxsU3R5bGUgPSBvcHRpb25zLmJnO1xuICAgICAgYnVmZkN4dC5yZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgYnVmZkN4dC5maWxsKCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBidWZmQ2FudmFzO1xufTtcbmZ1bmN0aW9uIGI2NFRvQmxvYihiNjQsIG1pbWVUeXBlKSB7XG4gIHZhciBieXRlcyA9IGF0b2IoYjY0KTtcbiAgdmFyIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZXMubGVuZ3RoKTtcbiAgdmFyIGJ1ZmZVaW50OCA9IG5ldyBVaW50OEFycmF5KGJ1ZmYpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgYnVmZlVpbnQ4W2ldID0gYnl0ZXMuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gbmV3IEJsb2IoW2J1ZmZdLCB7XG4gICAgdHlwZTogbWltZVR5cGVcbiAgfSk7XG59XG5mdW5jdGlvbiBiNjRVcmlUb0I2NChiNjR1cmkpIHtcbiAgdmFyIGkgPSBiNjR1cmkuaW5kZXhPZignLCcpO1xuICByZXR1cm4gYjY0dXJpLnN1YnN0cihpICsgMSk7XG59XG5mdW5jdGlvbiBvdXRwdXQob3B0aW9ucywgY2FudmFzLCBtaW1lVHlwZSkge1xuICB2YXIgZ2V0QjY0VXJpID0gZnVuY3Rpb24gZ2V0QjY0VXJpKCkge1xuICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKG1pbWVUeXBlLCBvcHRpb25zLnF1YWxpdHkpO1xuICB9O1xuICBzd2l0Y2ggKG9wdGlvbnMub3V0cHV0KSB7XG4gICAgY2FzZSAnYmxvYi1wcm9taXNlJzpcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjYW52YXMudG9CbG9iKGZ1bmN0aW9uIChibG9iKSB7XG4gICAgICAgICAgICBpZiAoYmxvYiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIHJlc29sdmUoYmxvYik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdgY2FudmFzLnRvQmxvYigpYCBzZW50IGEgbnVsbCB2YWx1ZSBpbiBpdHMgY2FsbGJhY2snKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgbWltZVR5cGUsIG9wdGlvbnMucXVhbGl0eSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICBjYXNlICdibG9iJzpcbiAgICAgIHJldHVybiBiNjRUb0Jsb2IoYjY0VXJpVG9CNjQoZ2V0QjY0VXJpKCkpLCBtaW1lVHlwZSk7XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgIHJldHVybiBiNjRVcmlUb0I2NChnZXRCNjRVcmkoKSk7XG4gICAgY2FzZSAnYmFzZTY0dXJpJzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGdldEI2NFVyaSgpO1xuICB9XG59XG5DUnAkMi5wbmcgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICByZXR1cm4gb3V0cHV0KG9wdGlvbnMsIHRoaXMuYnVmZmVyQ2FudmFzSW1hZ2Uob3B0aW9ucyksICdpbWFnZS9wbmcnKTtcbn07XG5DUnAkMi5qcGcgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICByZXR1cm4gb3V0cHV0KG9wdGlvbnMsIHRoaXMuYnVmZmVyQ2FudmFzSW1hZ2Uob3B0aW9ucyksICdpbWFnZS9qcGVnJyk7XG59O1xuXG52YXIgQ1JwJDEgPSB7fTtcbkNScCQxLm5vZGVTaGFwZUltcGwgPSBmdW5jdGlvbiAobmFtZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzKSB7XG4gIHN3aXRjaCAobmFtZSkge1xuICAgIGNhc2UgJ2VsbGlwc2UnOlxuICAgICAgcmV0dXJuIHRoaXMuZHJhd0VsbGlwc2VQYXRoKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpO1xuICAgIGNhc2UgJ3BvbHlnb24nOlxuICAgICAgcmV0dXJuIHRoaXMuZHJhd1BvbHlnb25QYXRoKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHBvaW50cyk7XG4gICAgY2FzZSAncm91bmQtcG9seWdvbic6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3Um91bmRQb2x5Z29uUGF0aChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwb2ludHMpO1xuICAgIGNhc2UgJ3JvdW5kcmVjdGFuZ2xlJzpcbiAgICBjYXNlICdyb3VuZC1yZWN0YW5nbGUnOlxuICAgICAgcmV0dXJuIHRoaXMuZHJhd1JvdW5kUmVjdGFuZ2xlUGF0aChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBjYXNlICdjdXRyZWN0YW5nbGUnOlxuICAgIGNhc2UgJ2N1dC1yZWN0YW5nbGUnOlxuICAgICAgcmV0dXJuIHRoaXMuZHJhd0N1dFJlY3RhbmdsZVBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgY2FzZSAnYm90dG9tcm91bmRyZWN0YW5nbGUnOlxuICAgIGNhc2UgJ2JvdHRvbS1yb3VuZC1yZWN0YW5nbGUnOlxuICAgICAgcmV0dXJuIHRoaXMuZHJhd0JvdHRvbVJvdW5kUmVjdGFuZ2xlUGF0aChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBjYXNlICdiYXJyZWwnOlxuICAgICAgcmV0dXJuIHRoaXMuZHJhd0JhcnJlbFBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gIH1cbn07XG5cbnZhciBDUiA9IENhbnZhc1JlbmRlcmVyO1xudmFyIENScCA9IENhbnZhc1JlbmRlcmVyLnByb3RvdHlwZTtcbkNScC5DQU5WQVNfTEFZRVJTID0gMztcbi8vXG5DUnAuU0VMRUNUX0JPWCA9IDA7XG5DUnAuRFJBRyA9IDE7XG5DUnAuTk9ERSA9IDI7XG5DUnAuQlVGRkVSX0NPVU5UID0gMztcbi8vXG5DUnAuVEVYVFVSRV9CVUZGRVIgPSAwO1xuQ1JwLk1PVElPTkJMVVJfQlVGRkVSX05PREUgPSAxO1xuQ1JwLk1PVElPTkJMVVJfQlVGRkVSX0RSQUcgPSAyO1xuZnVuY3Rpb24gQ2FudmFzUmVuZGVyZXIob3B0aW9ucykge1xuICB2YXIgciA9IHRoaXM7XG4gIHIuZGF0YSA9IHtcbiAgICBjYW52YXNlczogbmV3IEFycmF5KENScC5DQU5WQVNfTEFZRVJTKSxcbiAgICBjb250ZXh0czogbmV3IEFycmF5KENScC5DQU5WQVNfTEFZRVJTKSxcbiAgICBjYW52YXNOZWVkc1JlZHJhdzogbmV3IEFycmF5KENScC5DQU5WQVNfTEFZRVJTKSxcbiAgICBidWZmZXJDYW52YXNlczogbmV3IEFycmF5KENScC5CVUZGRVJfQ09VTlQpLFxuICAgIGJ1ZmZlckNvbnRleHRzOiBuZXcgQXJyYXkoQ1JwLkNBTlZBU19MQVlFUlMpXG4gIH07XG4gIHZhciB0YXBIbE9mZkF0dHIgPSAnLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yJztcbiAgdmFyIHRhcEhsT2ZmU3R5bGUgPSAncmdiYSgwLDAsMCwwKSc7XG4gIHIuZGF0YS5jYW52YXNDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICB2YXIgY29udGFpbmVyU3R5bGUgPSByLmRhdGEuY2FudmFzQ29udGFpbmVyLnN0eWxlO1xuICByLmRhdGEuY2FudmFzQ29udGFpbmVyLnN0eWxlW3RhcEhsT2ZmQXR0cl0gPSB0YXBIbE9mZlN0eWxlO1xuICBjb250YWluZXJTdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gIGNvbnRhaW5lclN0eWxlLnpJbmRleCA9ICcwJztcbiAgY29udGFpbmVyU3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgdmFyIGNvbnRhaW5lciA9IG9wdGlvbnMuY3kuY29udGFpbmVyKCk7XG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChyLmRhdGEuY2FudmFzQ29udGFpbmVyKTtcbiAgY29udGFpbmVyLnN0eWxlW3RhcEhsT2ZmQXR0cl0gPSB0YXBIbE9mZlN0eWxlO1xuICB2YXIgc3R5bGVNYXAgPSB7XG4gICAgJy13ZWJraXQtdXNlci1zZWxlY3QnOiAnbm9uZScsXG4gICAgJy1tb3otdXNlci1zZWxlY3QnOiAnLW1vei1ub25lJyxcbiAgICAndXNlci1zZWxlY3QnOiAnbm9uZScsXG4gICAgJy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcic6ICdyZ2JhKDAsMCwwLDApJyxcbiAgICAnb3V0bGluZS1zdHlsZSc6ICdub25lJ1xuICB9O1xuICBpZiAobXMoKSkge1xuICAgIHN0eWxlTWFwWyctbXMtdG91Y2gtYWN0aW9uJ10gPSAnbm9uZSc7XG4gICAgc3R5bGVNYXBbJ3RvdWNoLWFjdGlvbiddID0gJ25vbmUnO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgQ1JwLkNBTlZBU19MQVlFUlM7IGkrKykge1xuICAgIHZhciBjYW52YXMgPSByLmRhdGEuY2FudmFzZXNbaV0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIHIuZGF0YS5jb250ZXh0c1tpXSA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIE9iamVjdC5rZXlzKHN0eWxlTWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICBjYW52YXMuc3R5bGVba10gPSBzdHlsZU1hcFtrXTtcbiAgICB9KTtcbiAgICBjYW52YXMuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnLCAnbGF5ZXInICsgaSk7XG4gICAgY2FudmFzLnN0eWxlLnpJbmRleCA9IFN0cmluZyhDUnAuQ0FOVkFTX0xBWUVSUyAtIGkpO1xuICAgIHIuZGF0YS5jYW52YXNDb250YWluZXIuYXBwZW5kQ2hpbGQoY2FudmFzKTtcbiAgICByLmRhdGEuY2FudmFzTmVlZHNSZWRyYXdbaV0gPSBmYWxzZTtcbiAgfVxuICByLmRhdGEudG9wQ2FudmFzID0gci5kYXRhLmNhbnZhc2VzWzBdO1xuICByLmRhdGEuY2FudmFzZXNbQ1JwLk5PREVdLnNldEF0dHJpYnV0ZSgnZGF0YS1pZCcsICdsYXllcicgKyBDUnAuTk9ERSArICctbm9kZScpO1xuICByLmRhdGEuY2FudmFzZXNbQ1JwLlNFTEVDVF9CT1hdLnNldEF0dHJpYnV0ZSgnZGF0YS1pZCcsICdsYXllcicgKyBDUnAuU0VMRUNUX0JPWCArICctc2VsZWN0Ym94Jyk7XG4gIHIuZGF0YS5jYW52YXNlc1tDUnAuRFJBR10uc2V0QXR0cmlidXRlKCdkYXRhLWlkJywgJ2xheWVyJyArIENScC5EUkFHICsgJy1kcmFnJyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgQ1JwLkJVRkZFUl9DT1VOVDsgaSsrKSB7XG4gICAgci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICByLmRhdGEuYnVmZmVyQ29udGV4dHNbaV0gPSByLmRhdGEuYnVmZmVyQ2FudmFzZXNbaV0uZ2V0Q29udGV4dCgnMmQnKTtcbiAgICByLmRhdGEuYnVmZmVyQ2FudmFzZXNbaV0uc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIHIuZGF0YS5idWZmZXJDYW52YXNlc1tpXS5zZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnLCAnYnVmZmVyJyArIGkpO1xuICAgIHIuZGF0YS5idWZmZXJDYW52YXNlc1tpXS5zdHlsZS56SW5kZXggPSBTdHJpbmcoLWkgLSAxKTtcbiAgICByLmRhdGEuYnVmZmVyQ2FudmFzZXNbaV0uc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgIC8vci5kYXRhLmNhbnZhc0NvbnRhaW5lci5hcHBlbmRDaGlsZChyLmRhdGEuYnVmZmVyQ2FudmFzZXNbaV0pO1xuICB9XG5cbiAgci5wYXRoc0VuYWJsZWQgPSB0cnVlO1xuICB2YXIgZW1wdHlCYiA9IG1ha2VCb3VuZGluZ0JveCgpO1xuICB2YXIgZ2V0Qm94Q2VudGVyID0gZnVuY3Rpb24gZ2V0Qm94Q2VudGVyKGJiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IChiYi54MSArIGJiLngyKSAvIDIsXG4gICAgICB5OiAoYmIueTEgKyBiYi55MikgLyAyXG4gICAgfTtcbiAgfTtcbiAgdmFyIGdldENlbnRlck9mZnNldCA9IGZ1bmN0aW9uIGdldENlbnRlck9mZnNldChiYikge1xuICAgIHJldHVybiB7XG4gICAgICB4OiAtYmIudyAvIDIsXG4gICAgICB5OiAtYmIuaCAvIDJcbiAgICB9O1xuICB9O1xuICB2YXIgYmFja2dyb3VuZFRpbWVzdGFtcEhhc0NoYW5nZWQgPSBmdW5jdGlvbiBiYWNrZ3JvdW5kVGltZXN0YW1wSGFzQ2hhbmdlZChlbGUpIHtcbiAgICB2YXIgX3AgPSBlbGVbMF0uX3ByaXZhdGU7XG4gICAgdmFyIHNhbWUgPSBfcC5vbGRCYWNrZ3JvdW5kVGltZXN0YW1wID09PSBfcC5iYWNrZ3JvdW5kVGltZXN0YW1wO1xuICAgIHJldHVybiAhc2FtZTtcbiAgfTtcbiAgdmFyIGdldFN0eWxlS2V5ID0gZnVuY3Rpb24gZ2V0U3R5bGVLZXkoZWxlKSB7XG4gICAgcmV0dXJuIGVsZVswXS5fcHJpdmF0ZS5ub2RlS2V5O1xuICB9O1xuICB2YXIgZ2V0TGFiZWxLZXkgPSBmdW5jdGlvbiBnZXRMYWJlbEtleShlbGUpIHtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLmxhYmVsU3R5bGVLZXk7XG4gIH07XG4gIHZhciBnZXRTb3VyY2VMYWJlbEtleSA9IGZ1bmN0aW9uIGdldFNvdXJjZUxhYmVsS2V5KGVsZSkge1xuICAgIHJldHVybiBlbGVbMF0uX3ByaXZhdGUuc291cmNlTGFiZWxTdHlsZUtleTtcbiAgfTtcbiAgdmFyIGdldFRhcmdldExhYmVsS2V5ID0gZnVuY3Rpb24gZ2V0VGFyZ2V0TGFiZWxLZXkoZWxlKSB7XG4gICAgcmV0dXJuIGVsZVswXS5fcHJpdmF0ZS50YXJnZXRMYWJlbFN0eWxlS2V5O1xuICB9O1xuICB2YXIgZHJhd0VsZW1lbnQgPSBmdW5jdGlvbiBkcmF3RWxlbWVudChjb250ZXh0LCBlbGUsIGJiLCBzY2FsZWRMYWJlbFNob3duLCB1c2VFbGVPcGFjaXR5KSB7XG4gICAgcmV0dXJuIHIuZHJhd0VsZW1lbnQoY29udGV4dCwgZWxlLCBiYiwgZmFsc2UsIGZhbHNlLCB1c2VFbGVPcGFjaXR5KTtcbiAgfTtcbiAgdmFyIGRyYXdMYWJlbCA9IGZ1bmN0aW9uIGRyYXdMYWJlbChjb250ZXh0LCBlbGUsIGJiLCBzY2FsZWRMYWJlbFNob3duLCB1c2VFbGVPcGFjaXR5KSB7XG4gICAgcmV0dXJuIHIuZHJhd0VsZW1lbnRUZXh0KGNvbnRleHQsIGVsZSwgYmIsIHNjYWxlZExhYmVsU2hvd24sICdtYWluJywgdXNlRWxlT3BhY2l0eSk7XG4gIH07XG4gIHZhciBkcmF3U291cmNlTGFiZWwgPSBmdW5jdGlvbiBkcmF3U291cmNlTGFiZWwoY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgdXNlRWxlT3BhY2l0eSkge1xuICAgIHJldHVybiByLmRyYXdFbGVtZW50VGV4dChjb250ZXh0LCBlbGUsIGJiLCBzY2FsZWRMYWJlbFNob3duLCAnc291cmNlJywgdXNlRWxlT3BhY2l0eSk7XG4gIH07XG4gIHZhciBkcmF3VGFyZ2V0TGFiZWwgPSBmdW5jdGlvbiBkcmF3VGFyZ2V0TGFiZWwoY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgdXNlRWxlT3BhY2l0eSkge1xuICAgIHJldHVybiByLmRyYXdFbGVtZW50VGV4dChjb250ZXh0LCBlbGUsIGJiLCBzY2FsZWRMYWJlbFNob3duLCAndGFyZ2V0JywgdXNlRWxlT3BhY2l0eSk7XG4gIH07XG4gIHZhciBnZXRFbGVtZW50Qm94ID0gZnVuY3Rpb24gZ2V0RWxlbWVudEJveChlbGUpIHtcbiAgICBlbGUuYm91bmRpbmdCb3goKTtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLmJvZHlCb3VuZHM7XG4gIH07XG4gIHZhciBnZXRMYWJlbEJveCA9IGZ1bmN0aW9uIGdldExhYmVsQm94KGVsZSkge1xuICAgIGVsZS5ib3VuZGluZ0JveCgpO1xuICAgIHJldHVybiBlbGVbMF0uX3ByaXZhdGUubGFiZWxCb3VuZHMubWFpbiB8fCBlbXB0eUJiO1xuICB9O1xuICB2YXIgZ2V0U291cmNlTGFiZWxCb3ggPSBmdW5jdGlvbiBnZXRTb3VyY2VMYWJlbEJveChlbGUpIHtcbiAgICBlbGUuYm91bmRpbmdCb3goKTtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLmxhYmVsQm91bmRzLnNvdXJjZSB8fCBlbXB0eUJiO1xuICB9O1xuICB2YXIgZ2V0VGFyZ2V0TGFiZWxCb3ggPSBmdW5jdGlvbiBnZXRUYXJnZXRMYWJlbEJveChlbGUpIHtcbiAgICBlbGUuYm91bmRpbmdCb3goKTtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLmxhYmVsQm91bmRzLnRhcmdldCB8fCBlbXB0eUJiO1xuICB9O1xuICB2YXIgaXNMYWJlbFZpc2libGVBdFNjYWxlID0gZnVuY3Rpb24gaXNMYWJlbFZpc2libGVBdFNjYWxlKGVsZSwgc2NhbGVkTGFiZWxTaG93bikge1xuICAgIHJldHVybiBzY2FsZWRMYWJlbFNob3duO1xuICB9O1xuICB2YXIgZ2V0RWxlbWVudFJvdGF0aW9uUG9pbnQgPSBmdW5jdGlvbiBnZXRFbGVtZW50Um90YXRpb25Qb2ludChlbGUpIHtcbiAgICByZXR1cm4gZ2V0Qm94Q2VudGVyKGdldEVsZW1lbnRCb3goZWxlKSk7XG4gIH07XG4gIHZhciBhZGRUZXh0TWFyZ2luID0gZnVuY3Rpb24gYWRkVGV4dE1hcmdpbihwcmVmaXgsIHB0LCBlbGUpIHtcbiAgICB2YXIgcHJlID0gcHJlZml4ID8gcHJlZml4ICsgJy0nIDogJyc7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHB0LnggKyBlbGUucHN0eWxlKHByZSArICd0ZXh0LW1hcmdpbi14JykucGZWYWx1ZSxcbiAgICAgIHk6IHB0LnkgKyBlbGUucHN0eWxlKHByZSArICd0ZXh0LW1hcmdpbi15JykucGZWYWx1ZVxuICAgIH07XG4gIH07XG4gIHZhciBnZXRSc1B0ID0gZnVuY3Rpb24gZ2V0UnNQdChlbGUsIHgsIHkpIHtcbiAgICB2YXIgcnMgPSBlbGVbMF0uX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHJzW3hdLFxuICAgICAgeTogcnNbeV1cbiAgICB9O1xuICB9O1xuICB2YXIgZ2V0TGFiZWxSb3RhdGlvblBvaW50ID0gZnVuY3Rpb24gZ2V0TGFiZWxSb3RhdGlvblBvaW50KGVsZSkge1xuICAgIHJldHVybiBhZGRUZXh0TWFyZ2luKCcnLCBnZXRSc1B0KGVsZSwgJ2xhYmVsWCcsICdsYWJlbFknKSwgZWxlKTtcbiAgfTtcbiAgdmFyIGdldFNvdXJjZUxhYmVsUm90YXRpb25Qb2ludCA9IGZ1bmN0aW9uIGdldFNvdXJjZUxhYmVsUm90YXRpb25Qb2ludChlbGUpIHtcbiAgICByZXR1cm4gYWRkVGV4dE1hcmdpbignc291cmNlJywgZ2V0UnNQdChlbGUsICdzb3VyY2VMYWJlbFgnLCAnc291cmNlTGFiZWxZJyksIGVsZSk7XG4gIH07XG4gIHZhciBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uUG9pbnQgPSBmdW5jdGlvbiBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uUG9pbnQoZWxlKSB7XG4gICAgcmV0dXJuIGFkZFRleHRNYXJnaW4oJ3RhcmdldCcsIGdldFJzUHQoZWxlLCAndGFyZ2V0TGFiZWxYJywgJ3RhcmdldExhYmVsWScpLCBlbGUpO1xuICB9O1xuICB2YXIgZ2V0RWxlbWVudFJvdGF0aW9uT2Zmc2V0ID0gZnVuY3Rpb24gZ2V0RWxlbWVudFJvdGF0aW9uT2Zmc2V0KGVsZSkge1xuICAgIHJldHVybiBnZXRDZW50ZXJPZmZzZXQoZ2V0RWxlbWVudEJveChlbGUpKTtcbiAgfTtcbiAgdmFyIGdldFNvdXJjZUxhYmVsUm90YXRpb25PZmZzZXQgPSBmdW5jdGlvbiBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uT2Zmc2V0KGVsZSkge1xuICAgIHJldHVybiBnZXRDZW50ZXJPZmZzZXQoZ2V0U291cmNlTGFiZWxCb3goZWxlKSk7XG4gIH07XG4gIHZhciBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uT2Zmc2V0ID0gZnVuY3Rpb24gZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvbk9mZnNldChlbGUpIHtcbiAgICByZXR1cm4gZ2V0Q2VudGVyT2Zmc2V0KGdldFRhcmdldExhYmVsQm94KGVsZSkpO1xuICB9O1xuICB2YXIgZ2V0TGFiZWxSb3RhdGlvbk9mZnNldCA9IGZ1bmN0aW9uIGdldExhYmVsUm90YXRpb25PZmZzZXQoZWxlKSB7XG4gICAgdmFyIGJiID0gZ2V0TGFiZWxCb3goZWxlKTtcbiAgICB2YXIgcCA9IGdldENlbnRlck9mZnNldChnZXRMYWJlbEJveChlbGUpKTtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICBzd2l0Y2ggKGVsZS5wc3R5bGUoJ3RleHQtaGFsaWduJykudmFsdWUpIHtcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgcC54ID0gLWJiLnc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICBwLnggPSAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChlbGUucHN0eWxlKCd0ZXh0LXZhbGlnbicpLnZhbHVlKSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgcC55ID0gLWJiLmg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgcC55ID0gMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHA7XG4gIH07XG4gIHZhciBlbGVUeHJDYWNoZSA9IHIuZGF0YS5lbGVUeHJDYWNoZSA9IG5ldyBFbGVtZW50VGV4dHVyZUNhY2hlKHIsIHtcbiAgICBnZXRLZXk6IGdldFN0eWxlS2V5LFxuICAgIGRvZXNFbGVJbnZhbGlkYXRlS2V5OiBiYWNrZ3JvdW5kVGltZXN0YW1wSGFzQ2hhbmdlZCxcbiAgICBkcmF3RWxlbWVudDogZHJhd0VsZW1lbnQsXG4gICAgZ2V0Qm91bmRpbmdCb3g6IGdldEVsZW1lbnRCb3gsXG4gICAgZ2V0Um90YXRpb25Qb2ludDogZ2V0RWxlbWVudFJvdGF0aW9uUG9pbnQsXG4gICAgZ2V0Um90YXRpb25PZmZzZXQ6IGdldEVsZW1lbnRSb3RhdGlvbk9mZnNldCxcbiAgICBhbGxvd0VkZ2VUeHJDYWNoaW5nOiBmYWxzZSxcbiAgICBhbGxvd1BhcmVudFR4ckNhY2hpbmc6IGZhbHNlXG4gIH0pO1xuICB2YXIgbGJsVHhyQ2FjaGUgPSByLmRhdGEubGJsVHhyQ2FjaGUgPSBuZXcgRWxlbWVudFRleHR1cmVDYWNoZShyLCB7XG4gICAgZ2V0S2V5OiBnZXRMYWJlbEtleSxcbiAgICBkcmF3RWxlbWVudDogZHJhd0xhYmVsLFxuICAgIGdldEJvdW5kaW5nQm94OiBnZXRMYWJlbEJveCxcbiAgICBnZXRSb3RhdGlvblBvaW50OiBnZXRMYWJlbFJvdGF0aW9uUG9pbnQsXG4gICAgZ2V0Um90YXRpb25PZmZzZXQ6IGdldExhYmVsUm90YXRpb25PZmZzZXQsXG4gICAgaXNWaXNpYmxlOiBpc0xhYmVsVmlzaWJsZUF0U2NhbGVcbiAgfSk7XG4gIHZhciBzbGJUeHJDYWNoZSA9IHIuZGF0YS5zbGJUeHJDYWNoZSA9IG5ldyBFbGVtZW50VGV4dHVyZUNhY2hlKHIsIHtcbiAgICBnZXRLZXk6IGdldFNvdXJjZUxhYmVsS2V5LFxuICAgIGRyYXdFbGVtZW50OiBkcmF3U291cmNlTGFiZWwsXG4gICAgZ2V0Qm91bmRpbmdCb3g6IGdldFNvdXJjZUxhYmVsQm94LFxuICAgIGdldFJvdGF0aW9uUG9pbnQ6IGdldFNvdXJjZUxhYmVsUm90YXRpb25Qb2ludCxcbiAgICBnZXRSb3RhdGlvbk9mZnNldDogZ2V0U291cmNlTGFiZWxSb3RhdGlvbk9mZnNldCxcbiAgICBpc1Zpc2libGU6IGlzTGFiZWxWaXNpYmxlQXRTY2FsZVxuICB9KTtcbiAgdmFyIHRsYlR4ckNhY2hlID0gci5kYXRhLnRsYlR4ckNhY2hlID0gbmV3IEVsZW1lbnRUZXh0dXJlQ2FjaGUociwge1xuICAgIGdldEtleTogZ2V0VGFyZ2V0TGFiZWxLZXksXG4gICAgZHJhd0VsZW1lbnQ6IGRyYXdUYXJnZXRMYWJlbCxcbiAgICBnZXRCb3VuZGluZ0JveDogZ2V0VGFyZ2V0TGFiZWxCb3gsXG4gICAgZ2V0Um90YXRpb25Qb2ludDogZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvblBvaW50LFxuICAgIGdldFJvdGF0aW9uT2Zmc2V0OiBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uT2Zmc2V0LFxuICAgIGlzVmlzaWJsZTogaXNMYWJlbFZpc2libGVBdFNjYWxlXG4gIH0pO1xuICB2YXIgbHlyVHhyQ2FjaGUgPSByLmRhdGEubHlyVHhyQ2FjaGUgPSBuZXcgTGF5ZXJlZFRleHR1cmVDYWNoZShyKTtcbiAgci5vblVwZGF0ZUVsZUNhbGNzKGZ1bmN0aW9uIGludmFsaWRhdGVUZXh0dXJlQ2FjaGVzKHdpbGxEcmF3LCBlbGVzKSB7XG4gICAgLy8gZWFjaCBjYWNoZSBzaG91bGQgY2hlY2sgZm9yIHN1Yi1rZXkgZGlmZiB0byBzZWUgdGhhdCB0aGUgdXBkYXRlIGFmZmVjdHMgdGhhdCBjYWNoZSBwYXJ0aWN1bGFybHlcbiAgICBlbGVUeHJDYWNoZS5pbnZhbGlkYXRlRWxlbWVudHMoZWxlcyk7XG4gICAgbGJsVHhyQ2FjaGUuaW52YWxpZGF0ZUVsZW1lbnRzKGVsZXMpO1xuICAgIHNsYlR4ckNhY2hlLmludmFsaWRhdGVFbGVtZW50cyhlbGVzKTtcbiAgICB0bGJUeHJDYWNoZS5pbnZhbGlkYXRlRWxlbWVudHMoZWxlcyk7XG5cbiAgICAvLyBhbnkgY2hhbmdlIGludmFsaWRhdGVzIHRoZSBsYXllcnNcbiAgICBseXJUeHJDYWNoZS5pbnZhbGlkYXRlRWxlbWVudHMoZWxlcyk7XG5cbiAgICAvLyB1cGRhdGUgdGhlIG9sZCBiZyB0aW1lc3RhbXAgc28gZGlmZnMgY2FuIGJlIGRvbmUgaW4gdGhlIGVsZSB0eHIgY2FjaGVzXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGVsZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX3AgPSBlbGVzW19pXS5fcHJpdmF0ZTtcbiAgICAgIF9wLm9sZEJhY2tncm91bmRUaW1lc3RhbXAgPSBfcC5iYWNrZ3JvdW5kVGltZXN0YW1wO1xuICAgIH1cbiAgfSk7XG4gIHZhciByZWZpbmVJbkxheWVycyA9IGZ1bmN0aW9uIHJlZmluZUluTGF5ZXJzKHJlcXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGx5clR4ckNhY2hlLmVucXVldWVFbGVtZW50UmVmaW5lbWVudChyZXFzW2ldLmVsZSk7XG4gICAgfVxuICB9O1xuICBlbGVUeHJDYWNoZS5vbkRlcXVldWUocmVmaW5lSW5MYXllcnMpO1xuICBsYmxUeHJDYWNoZS5vbkRlcXVldWUocmVmaW5lSW5MYXllcnMpO1xuICBzbGJUeHJDYWNoZS5vbkRlcXVldWUocmVmaW5lSW5MYXllcnMpO1xuICB0bGJUeHJDYWNoZS5vbkRlcXVldWUocmVmaW5lSW5MYXllcnMpO1xufVxuQ1JwLnJlZHJhd0hpbnQgPSBmdW5jdGlvbiAoZ3JvdXAsIGJvb2wpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICBzd2l0Y2ggKGdyb3VwKSB7XG4gICAgY2FzZSAnZWxlcyc6XG4gICAgICByLmRhdGEuY2FudmFzTmVlZHNSZWRyYXdbQ1JwLk5PREVdID0gYm9vbDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2RyYWcnOlxuICAgICAgci5kYXRhLmNhbnZhc05lZWRzUmVkcmF3W0NScC5EUkFHXSA9IGJvb2w7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgci5kYXRhLmNhbnZhc05lZWRzUmVkcmF3W0NScC5TRUxFQ1RfQk9YXSA9IGJvb2w7XG4gICAgICBicmVhaztcbiAgfVxufTtcblxuLy8gd2hldGhlciB0byB1c2UgUGF0aDJEIGNhY2hpbmcgZm9yIGRyYXdpbmdcbnZhciBwYXRoc0ltcGxkID0gdHlwZW9mIFBhdGgyRCAhPT0gJ3VuZGVmaW5lZCc7XG5DUnAucGF0aDJkRW5hYmxlZCA9IGZ1bmN0aW9uIChvbikge1xuICBpZiAob24gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0aGlzLnBhdGhzRW5hYmxlZDtcbiAgfVxuICB0aGlzLnBhdGhzRW5hYmxlZCA9IG9uID8gdHJ1ZSA6IGZhbHNlO1xufTtcbkNScC51c2VQYXRocyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHBhdGhzSW1wbGQgJiYgdGhpcy5wYXRoc0VuYWJsZWQ7XG59O1xuQ1JwLnNldEltZ1Ntb290aGluZyA9IGZ1bmN0aW9uIChjb250ZXh0LCBib29sKSB7XG4gIGlmIChjb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZCAhPSBudWxsKSB7XG4gICAgY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBib29sO1xuICB9IGVsc2Uge1xuICAgIGNvbnRleHQud2Via2l0SW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gYm9vbDtcbiAgICBjb250ZXh0Lm1vekltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGJvb2w7XG4gICAgY29udGV4dC5tc0ltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGJvb2w7XG4gIH1cbn07XG5DUnAuZ2V0SW1nU21vb3RoaW5nID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgaWYgKGNvbnRleHQuaW1hZ2VTbW9vdGhpbmdFbmFibGVkICE9IG51bGwpIHtcbiAgICByZXR1cm4gY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvbnRleHQud2Via2l0SW1hZ2VTbW9vdGhpbmdFbmFibGVkIHx8IGNvbnRleHQubW96SW1hZ2VTbW9vdGhpbmdFbmFibGVkIHx8IGNvbnRleHQubXNJbWFnZVNtb290aGluZ0VuYWJsZWQ7XG4gIH1cbn07XG5DUnAubWFrZU9mZnNjcmVlbkNhbnZhcyA9IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciBjYW52YXM7XG4gIGlmICgodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKE9mZnNjcmVlbkNhbnZhcykpICE9PSAoXCJ1bmRlZmluZWRcIiApKSB7XG4gICAgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgfSBlbHNlIHtcbiAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cbiAgcmV0dXJuIGNhbnZhcztcbn07XG5bQ1JwJGEsIENScCQ5LCBDUnAkOCwgQ1JwJDcsIENScCQ2LCBDUnAkNSwgQ1JwJDQsIENScCQzLCBDUnAkMiwgQ1JwJDFdLmZvckVhY2goZnVuY3Rpb24gKHByb3BzKSB7XG4gIGV4dGVuZChDUnAsIHByb3BzKTtcbn0pO1xuXG52YXIgcmVuZGVyZXIgPSBbe1xuICBuYW1lOiAnbnVsbCcsXG4gIGltcGw6IE51bGxSZW5kZXJlclxufSwge1xuICBuYW1lOiAnYmFzZScsXG4gIGltcGw6IEJSXG59LCB7XG4gIG5hbWU6ICdjYW52YXMnLFxuICBpbXBsOiBDUlxufV07XG5cbnZhciBpbmNFeHRzID0gW3tcbiAgdHlwZTogJ2xheW91dCcsXG4gIGV4dGVuc2lvbnM6IGxheW91dFxufSwge1xuICB0eXBlOiAncmVuZGVyZXInLFxuICBleHRlbnNpb25zOiByZW5kZXJlclxufV07XG5cbi8vIHJlZ2lzdGVyZWQgZXh0ZW5zaW9ucyB0byBjeXRvc2NhcGUsIGluZGV4ZWQgYnkgbmFtZVxudmFyIGV4dGVuc2lvbnMgPSB7fTtcblxuLy8gcmVnaXN0ZXJlZCBtb2R1bGVzIGZvciBleHRlbnNpb25zLCBpbmRleGVkIGJ5IG5hbWVcbnZhciBtb2R1bGVzID0ge307XG5mdW5jdGlvbiBzZXRFeHRlbnNpb24odHlwZSwgbmFtZSwgcmVnaXN0cmFudCkge1xuICB2YXIgZXh0ID0gcmVnaXN0cmFudDtcbiAgdmFyIG92ZXJyaWRlRXJyID0gZnVuY3Rpb24gb3ZlcnJpZGVFcnIoZmllbGQpIHtcbiAgICB3YXJuKCdDYW4gbm90IHJlZ2lzdGVyIGAnICsgbmFtZSArICdgIGZvciBgJyArIHR5cGUgKyAnYCBzaW5jZSBgJyArIGZpZWxkICsgJ2AgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHByb3RvdHlwZSBhbmQgY2FuIG5vdCBiZSBvdmVycmlkZGVuJyk7XG4gIH07XG4gIGlmICh0eXBlID09PSAnY29yZScpIHtcbiAgICBpZiAoQ29yZS5wcm90b3R5cGVbbmFtZV0pIHtcbiAgICAgIHJldHVybiBvdmVycmlkZUVycihuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgQ29yZS5wcm90b3R5cGVbbmFtZV0gPSByZWdpc3RyYW50O1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlID09PSAnY29sbGVjdGlvbicpIHtcbiAgICBpZiAoQ29sbGVjdGlvbi5wcm90b3R5cGVbbmFtZV0pIHtcbiAgICAgIHJldHVybiBvdmVycmlkZUVycihuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgQ29sbGVjdGlvbi5wcm90b3R5cGVbbmFtZV0gPSByZWdpc3RyYW50O1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbGF5b3V0Jykge1xuICAgIC8vIGZpbGwgaW4gbWlzc2luZyBsYXlvdXQgZnVuY3Rpb25zIGluIHRoZSBwcm90b3R5cGVcblxuICAgIHZhciBMYXlvdXQgPSBmdW5jdGlvbiBMYXlvdXQob3B0aW9ucykge1xuICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgIHJlZ2lzdHJhbnQuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICAgICAgLy8gbWFrZSBzdXJlIGxheW91dCBoYXMgX3ByaXZhdGUgZm9yIHVzZSB3LyBzdGQgYXBpcyBsaWtlIC5vbigpXG4gICAgICBpZiAoIXBsYWluT2JqZWN0KHRoaXMuX3ByaXZhdGUpKSB7XG4gICAgICAgIHRoaXMuX3ByaXZhdGUgPSB7fTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3ByaXZhdGUuY3kgPSBvcHRpb25zLmN5O1xuICAgICAgdGhpcy5fcHJpdmF0ZS5saXN0ZW5lcnMgPSBbXTtcbiAgICAgIHRoaXMuY3JlYXRlRW1pdHRlcigpO1xuICAgIH07XG4gICAgdmFyIGxheW91dFByb3RvID0gTGF5b3V0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocmVnaXN0cmFudC5wcm90b3R5cGUpO1xuICAgIHZhciBvcHRMYXlvdXRGbnMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdExheW91dEZucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGZuTmFtZSA9IG9wdExheW91dEZuc1tpXTtcbiAgICAgIGxheW91dFByb3RvW2ZuTmFtZV0gPSBsYXlvdXRQcm90b1tmbk5hbWVdIHx8IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIGVpdGhlciAuc3RhcnQoKSBvciAucnVuKCkgaXMgZGVmaW5lZCwgc28gYXV0b2dlbiB0aGUgb3RoZXJcbiAgICBpZiAobGF5b3V0UHJvdG8uc3RhcnQgJiYgIWxheW91dFByb3RvLnJ1bikge1xuICAgICAgbGF5b3V0UHJvdG8ucnVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN0YXJ0KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKCFsYXlvdXRQcm90by5zdGFydCAmJiBsYXlvdXRQcm90by5ydW4pIHtcbiAgICAgIGxheW91dFByb3RvLnN0YXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJ1bigpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH07XG4gICAgfVxuICAgIHZhciByZWdTdG9wID0gcmVnaXN0cmFudC5wcm90b3R5cGUuc3RvcDtcbiAgICBsYXlvdXRQcm90by5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9wdHMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICBpZiAob3B0cyAmJiBvcHRzLmFuaW1hdGUpIHtcbiAgICAgICAgdmFyIGFuaXMgPSB0aGlzLmFuaW1hdGlvbnM7XG4gICAgICAgIGlmIChhbmlzKSB7XG4gICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFuaXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhbmlzW19pXS5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmVnU3RvcCkge1xuICAgICAgICByZWdTdG9wLmNhbGwodGhpcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVtaXQoJ2xheW91dHN0b3AnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgaWYgKCFsYXlvdXRQcm90by5kZXN0cm95KSB7XG4gICAgICBsYXlvdXRQcm90by5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH07XG4gICAgfVxuICAgIGxheW91dFByb3RvLmN5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuY3k7XG4gICAgfTtcbiAgICB2YXIgZ2V0Q3kgPSBmdW5jdGlvbiBnZXRDeShsYXlvdXQpIHtcbiAgICAgIHJldHVybiBsYXlvdXQuX3ByaXZhdGUuY3k7XG4gICAgfTtcbiAgICB2YXIgZW1pdHRlck9wdHMgPSB7XG4gICAgICBhZGRFdmVudEZpZWxkczogZnVuY3Rpb24gYWRkRXZlbnRGaWVsZHMobGF5b3V0LCBldnQpIHtcbiAgICAgICAgZXZ0LmxheW91dCA9IGxheW91dDtcbiAgICAgICAgZXZ0LmN5ID0gZ2V0Q3kobGF5b3V0KTtcbiAgICAgICAgZXZ0LnRhcmdldCA9IGxheW91dDtcbiAgICAgIH0sXG4gICAgICBidWJibGU6IGZ1bmN0aW9uIGJ1YmJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgICAgcGFyZW50OiBmdW5jdGlvbiBwYXJlbnQobGF5b3V0KSB7XG4gICAgICAgIHJldHVybiBnZXRDeShsYXlvdXQpO1xuICAgICAgfVxuICAgIH07XG4gICAgZXh0ZW5kKGxheW91dFByb3RvLCB7XG4gICAgICBjcmVhdGVFbWl0dGVyOiBmdW5jdGlvbiBjcmVhdGVFbWl0dGVyKCkge1xuICAgICAgICB0aGlzLl9wcml2YXRlLmVtaXR0ZXIgPSBuZXcgRW1pdHRlcihlbWl0dGVyT3B0cywgdGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICAgIGVtaXR0ZXI6IGZ1bmN0aW9uIGVtaXR0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmVtaXR0ZXI7XG4gICAgICB9LFxuICAgICAgb246IGZ1bmN0aW9uIG9uKGV2dCwgY2IpIHtcbiAgICAgICAgdGhpcy5lbWl0dGVyKCkub24oZXZ0LCBjYik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICAgIG9uZTogZnVuY3Rpb24gb25lKGV2dCwgY2IpIHtcbiAgICAgICAgdGhpcy5lbWl0dGVyKCkub25lKGV2dCwgY2IpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICBvbmNlOiBmdW5jdGlvbiBvbmNlKGV2dCwgY2IpIHtcbiAgICAgICAgdGhpcy5lbWl0dGVyKCkub25lKGV2dCwgY2IpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoZXZ0LCBjYikge1xuICAgICAgICB0aGlzLmVtaXR0ZXIoKS5yZW1vdmVMaXN0ZW5lcihldnQsIGNiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgICAgcmVtb3ZlQWxsTGlzdGVuZXJzOiBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnMoKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcigpLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICBlbWl0OiBmdW5jdGlvbiBlbWl0KGV2dCwgcGFyYW1zKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcigpLmVtaXQoZXZ0LCBwYXJhbXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkZWZpbmUuZXZlbnRBbGlhc2VzT24obGF5b3V0UHJvdG8pO1xuICAgIGV4dCA9IExheW91dDsgLy8gcmVwbGFjZSB3aXRoIG91ciB3cmFwcGVkIGxheW91dFxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdyZW5kZXJlcicgJiYgbmFtZSAhPT0gJ251bGwnICYmIG5hbWUgIT09ICdiYXNlJykge1xuICAgIC8vIHVzZXIgcmVnaXN0ZXJlZCByZW5kZXJlcnMgaW5oZXJpdCBmcm9tIGJhc2VcblxuICAgIHZhciBCYXNlUmVuZGVyZXIgPSBnZXRFeHRlbnNpb24oJ3JlbmRlcmVyJywgJ2Jhc2UnKTtcbiAgICB2YXIgYlByb3RvID0gQmFzZVJlbmRlcmVyLnByb3RvdHlwZTtcbiAgICB2YXIgUmVnaXN0cmFudFJlbmRlcmVyID0gcmVnaXN0cmFudDtcbiAgICB2YXIgclByb3RvID0gcmVnaXN0cmFudC5wcm90b3R5cGU7XG4gICAgdmFyIFJlbmRlcmVyID0gZnVuY3Rpb24gUmVuZGVyZXIoKSB7XG4gICAgICBCYXNlUmVuZGVyZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIFJlZ2lzdHJhbnRSZW5kZXJlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgdmFyIHByb3RvID0gUmVuZGVyZXIucHJvdG90eXBlO1xuICAgIGZvciAodmFyIHBOYW1lIGluIGJQcm90bykge1xuICAgICAgdmFyIHBWYWwgPSBiUHJvdG9bcE5hbWVdO1xuICAgICAgdmFyIGV4aXN0c0luUiA9IHJQcm90b1twTmFtZV0gIT0gbnVsbDtcbiAgICAgIGlmIChleGlzdHNJblIpIHtcbiAgICAgICAgcmV0dXJuIG92ZXJyaWRlRXJyKHBOYW1lKTtcbiAgICAgIH1cbiAgICAgIHByb3RvW3BOYW1lXSA9IHBWYWw7IC8vIHRha2UgaW1wbCBmcm9tIGJhc2VcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfcE5hbWUgaW4gclByb3RvKSB7XG4gICAgICBwcm90b1tfcE5hbWVdID0gclByb3RvW19wTmFtZV07IC8vIHRha2UgaW1wbCBmcm9tIHJlZ2lzdHJhbnRcbiAgICB9XG5cbiAgICBiUHJvdG8uY2xpZW50RnVuY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHByb3RvW25hbWVdID0gcHJvdG9bbmFtZV0gfHwgZnVuY3Rpb24gKCkge1xuICAgICAgICBlcnJvcignUmVuZGVyZXIgZG9lcyBub3QgaW1wbGVtZW50IGByZW5kZXJlci4nICsgbmFtZSArICcoKWAgb24gaXRzIHByb3RvdHlwZScpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBleHQgPSBSZW5kZXJlcjtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnX19wcm90b19fJyB8fCB0eXBlID09PSAnY29uc3RydWN0b3InIHx8IHR5cGUgPT09ICdwcm90b3R5cGUnKSB7XG4gICAgLy8gdG8gYXZvaWQgcG90ZW50aWFsIHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICByZXR1cm4gZXJyb3IodHlwZSArICcgaXMgYW4gaWxsZWdhbCB0eXBlIHRvIGJlIHJlZ2lzdGVyZWQsIHBvc3NpYmx5IGxlYWQgdG8gcHJvdG90eXBlIHBvbGx1dGlvbnMnKTtcbiAgfVxuICByZXR1cm4gc2V0TWFwKHtcbiAgICBtYXA6IGV4dGVuc2lvbnMsXG4gICAga2V5czogW3R5cGUsIG5hbWVdLFxuICAgIHZhbHVlOiBleHRcbiAgfSk7XG59XG5mdW5jdGlvbiBnZXRFeHRlbnNpb24odHlwZSwgbmFtZSkge1xuICByZXR1cm4gZ2V0TWFwKHtcbiAgICBtYXA6IGV4dGVuc2lvbnMsXG4gICAga2V5czogW3R5cGUsIG5hbWVdXG4gIH0pO1xufVxuZnVuY3Rpb24gc2V0TW9kdWxlKHR5cGUsIG5hbWUsIG1vZHVsZVR5cGUsIG1vZHVsZU5hbWUsIHJlZ2lzdHJhbnQpIHtcbiAgcmV0dXJuIHNldE1hcCh7XG4gICAgbWFwOiBtb2R1bGVzLFxuICAgIGtleXM6IFt0eXBlLCBuYW1lLCBtb2R1bGVUeXBlLCBtb2R1bGVOYW1lXSxcbiAgICB2YWx1ZTogcmVnaXN0cmFudFxuICB9KTtcbn1cbmZ1bmN0aW9uIGdldE1vZHVsZSh0eXBlLCBuYW1lLCBtb2R1bGVUeXBlLCBtb2R1bGVOYW1lKSB7XG4gIHJldHVybiBnZXRNYXAoe1xuICAgIG1hcDogbW9kdWxlcyxcbiAgICBrZXlzOiBbdHlwZSwgbmFtZSwgbW9kdWxlVHlwZSwgbW9kdWxlTmFtZV1cbiAgfSk7XG59XG52YXIgZXh0ZW5zaW9uID0gZnVuY3Rpb24gZXh0ZW5zaW9uKCkge1xuICAvLyBlLmcuIGV4dGVuc2lvbigncmVuZGVyZXInLCAnc3ZnJylcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICByZXR1cm4gZ2V0RXh0ZW5zaW9uLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyBlLmcuIGV4dGVuc2lvbigncmVuZGVyZXInLCAnc3ZnJywgeyAuLi4gfSlcbiAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgIHJldHVybiBzZXRFeHRlbnNpb24uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIGUuZy4gZXh0ZW5zaW9uKCdyZW5kZXJlcicsICdzdmcnLCAnbm9kZVNoYXBlJywgJ2VsbGlwc2UnKVxuICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0KSB7XG4gICAgcmV0dXJuIGdldE1vZHVsZS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gZS5nLiBleHRlbnNpb24oJ3JlbmRlcmVyJywgJ3N2ZycsICdub2RlU2hhcGUnLCAnZWxsaXBzZScsIHsgLi4uIH0pXG4gIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDUpIHtcbiAgICByZXR1cm4gc2V0TW9kdWxlLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIH0gZWxzZSB7XG4gICAgZXJyb3IoJ0ludmFsaWQgZXh0ZW5zaW9uIGFjY2VzcyBzeW50YXgnKTtcbiAgfVxufTtcblxuLy8gYWxsb3dzIGEgY29yZSBpbnN0YW5jZSB0byBhY2Nlc3MgZXh0ZW5zaW9ucyBpbnRlcm5hbGx5XG5Db3JlLnByb3RvdHlwZS5leHRlbnNpb24gPSBleHRlbnNpb247XG5cbi8vIGluY2x1ZGVkIGV4dGVuc2lvbnNcbmluY0V4dHMuZm9yRWFjaChmdW5jdGlvbiAoZ3JvdXApIHtcbiAgZ3JvdXAuZXh0ZW5zaW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChleHQpIHtcbiAgICBzZXRFeHRlbnNpb24oZ3JvdXAudHlwZSwgZXh0Lm5hbWUsIGV4dC5pbXBsKTtcbiAgfSk7XG59KTtcblxuLy8gYSBkdW1teSBzdHlsZXNoZWV0IG9iamVjdCB0aGF0IGRvZXNuJ3QgbmVlZCBhIHJlZmVyZW5jZSB0byB0aGUgY29yZVxuLy8gKHVzZWZ1bCBmb3IgaW5pdClcbnZhciBTdHlsZXNoZWV0ID0gZnVuY3Rpb24gU3R5bGVzaGVldCgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFN0eWxlc2hlZXQpKSB7XG4gICAgcmV0dXJuIG5ldyBTdHlsZXNoZWV0KCk7XG4gIH1cbiAgdGhpcy5sZW5ndGggPSAwO1xufTtcbnZhciBzaGVldGZuID0gU3R5bGVzaGVldC5wcm90b3R5cGU7XG5zaGVldGZuLmluc3RhbmNlU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ3N0eWxlc2hlZXQnO1xufTtcblxuLy8ganVzdCBzdG9yZSB0aGUgc2VsZWN0b3IgdG8gYmUgcGFyc2VkIGxhdGVyXG5zaGVldGZuLnNlbGVjdG9yID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHZhciBpID0gdGhpcy5sZW5ndGgrKztcbiAgdGhpc1tpXSA9IHtcbiAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgcHJvcGVydGllczogW11cbiAgfTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG4vLyBqdXN0IHN0b3JlIHRoZSBwcm9wZXJ0eSB0byBiZSBwYXJzZWQgbGF0ZXJcbnNoZWV0Zm4uY3NzID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpID0gdGhpcy5sZW5ndGggLSAxO1xuICBpZiAoc3RyaW5nKG5hbWUpKSB7XG4gICAgdGhpc1tpXS5wcm9wZXJ0aWVzLnB1c2goe1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH0pO1xuICB9IGVsc2UgaWYgKHBsYWluT2JqZWN0KG5hbWUpKSB7XG4gICAgdmFyIG1hcCA9IG5hbWU7XG4gICAgdmFyIHByb3BOYW1lcyA9IE9iamVjdC5rZXlzKG1hcCk7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wTmFtZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBrZXkgPSBwcm9wTmFtZXNbal07XG4gICAgICB2YXIgbWFwVmFsID0gbWFwW2tleV07XG4gICAgICBpZiAobWFwVmFsID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcCA9IFN0eWxlLnByb3BlcnRpZXNba2V5XSB8fCBTdHlsZS5wcm9wZXJ0aWVzW2Rhc2gyY2FtZWwoa2V5KV07XG4gICAgICBpZiAocHJvcCA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIF9uYW1lID0gcHJvcC5uYW1lO1xuICAgICAgdmFyIF92YWx1ZSA9IG1hcFZhbDtcbiAgICAgIHRoaXNbaV0ucHJvcGVydGllcy5wdXNoKHtcbiAgICAgICAgbmFtZTogX25hbWUsXG4gICAgICAgIHZhbHVlOiBfdmFsdWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbnNoZWV0Zm4uc3R5bGUgPSBzaGVldGZuLmNzcztcblxuLy8gZ2VuZXJhdGUgYSByZWFsIHN0eWxlIG9iamVjdCBmcm9tIHRoZSBkdW1teSBzdHlsZXNoZWV0XG5zaGVldGZuLmdlbmVyYXRlU3R5bGUgPSBmdW5jdGlvbiAoY3kpIHtcbiAgdmFyIHN0eWxlID0gbmV3IFN0eWxlKGN5KTtcbiAgcmV0dXJuIHRoaXMuYXBwZW5kVG9TdHlsZShzdHlsZSk7XG59O1xuXG4vLyBhcHBlbmQgYSBkdW1teSBzdHlsZXNoZWV0IG9iamVjdCBvbiBhIHJlYWwgc3R5bGUgb2JqZWN0XG5zaGVldGZuLmFwcGVuZFRvU3R5bGUgPSBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNvbnRleHQgPSB0aGlzW2ldO1xuICAgIHZhciBzZWxlY3RvciA9IGNvbnRleHQuc2VsZWN0b3I7XG4gICAgdmFyIHByb3BzID0gY29udGV4dC5wcm9wZXJ0aWVzO1xuICAgIHN0eWxlLnNlbGVjdG9yKHNlbGVjdG9yKTsgLy8gYXBwbHkgc2VsZWN0b3JcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcHJvcHMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBwcm9wID0gcHJvcHNbal07XG4gICAgICBzdHlsZS5jc3MocHJvcC5uYW1lLCBwcm9wLnZhbHVlKTsgLy8gYXBwbHkgcHJvcGVydHlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3R5bGU7XG59O1xuXG52YXIgdmVyc2lvbiA9IFwiMy4yNy4wXCI7XG5cbnZhciBjeXRvc2NhcGUgPSBmdW5jdGlvbiBjeXRvc2NhcGUob3B0aW9ucykge1xuICAvLyBpZiBubyBvcHRpb25zIHNwZWNpZmllZCwgdXNlIGRlZmF1bHRcbiAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBpbnN0YW5jZVxuICBpZiAocGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICByZXR1cm4gbmV3IENvcmUob3B0aW9ucyk7XG4gIH1cblxuICAvLyBhbGxvdyBmb3IgcmVnaXN0cmF0aW9uIG9mIGV4dGVuc2lvbnNcbiAgZWxzZSBpZiAoc3RyaW5nKG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIGV4dGVuc2lvbi5hcHBseShleHRlbnNpb24sIGFyZ3VtZW50cyk7XG4gIH1cbn07XG5cbi8vIGUuZy4gY3l0b3NjYXBlLnVzZSggcmVxdWlyZSgnY3l0b3NjYXBlLWZvbycpLCBiYXIgKVxuY3l0b3NjYXBlLnVzZSA9IGZ1bmN0aW9uIChleHQpIHtcbiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOyAvLyBhcmdzIHRvIHBhc3MgdG8gZXh0XG5cbiAgYXJncy51bnNoaWZ0KGN5dG9zY2FwZSk7IC8vIGN5dG9zY2FwZSBpcyBmaXJzdCBhcmcgdG8gZXh0XG5cbiAgZXh0LmFwcGx5KG51bGwsIGFyZ3MpO1xuICByZXR1cm4gdGhpcztcbn07XG5jeXRvc2NhcGUud2FybmluZ3MgPSBmdW5jdGlvbiAoYm9vbCkge1xuICByZXR1cm4gd2FybmluZ3MoYm9vbCk7XG59O1xuXG4vLyByZXBsYWNlZCBieSBidWlsZCBzeXN0ZW1cbmN5dG9zY2FwZS52ZXJzaW9uID0gdmVyc2lvbjtcblxuLy8gZXhwb3NlIHB1YmxpYyBhcGlzIChtb3N0bHkgZm9yIGV4dGVuc2lvbnMpXG5jeXRvc2NhcGUuc3R5bGVzaGVldCA9IGN5dG9zY2FwZS5TdHlsZXNoZWV0ID0gU3R5bGVzaGVldDtcblxubW9kdWxlLmV4cG9ydHMgPSBjeXRvc2NhcGU7XG4iLCIvKlxuQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQgQ2hyaXMgUGV0dGl0dFxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG5hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG5USEUgU09GVFdBUkUuXG4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ3JhcGhsaWI6IHJlcXVpcmUoXCIuL2xpYi9ncmFwaGxpYlwiKSxcblxuICBsYXlvdXQ6IHJlcXVpcmUoXCIuL2xpYi9sYXlvdXRcIiksXG4gIGRlYnVnOiByZXF1aXJlKFwiLi9saWIvZGVidWdcIiksXG4gIHV0aWw6IHtcbiAgICB0aW1lOiByZXF1aXJlKFwiLi9saWIvdXRpbFwiKS50aW1lLFxuICAgIG5vdGltZTogcmVxdWlyZShcIi4vbGliL3V0aWxcIikubm90aW1lXG4gIH0sXG4gIHZlcnNpb246IHJlcXVpcmUoXCIuL2xpYi92ZXJzaW9uXCIpXG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIGdyZWVkeUZBUyA9IHJlcXVpcmUoXCIuL2dyZWVkeS1mYXNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBydW46IHJ1bixcbiAgdW5kbzogdW5kb1xufTtcblxuZnVuY3Rpb24gcnVuKGcpIHtcbiAgdmFyIGZhcyA9IChnLmdyYXBoKCkuYWN5Y2xpY2VyID09PSBcImdyZWVkeVwiXG4gICAgPyBncmVlZHlGQVMoZywgd2VpZ2h0Rm4oZykpXG4gICAgOiBkZnNGQVMoZykpO1xuICBfLmZvckVhY2goZmFzLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGxhYmVsID0gZy5lZGdlKGUpO1xuICAgIGcucmVtb3ZlRWRnZShlKTtcbiAgICBsYWJlbC5mb3J3YXJkTmFtZSA9IGUubmFtZTtcbiAgICBsYWJlbC5yZXZlcnNlZCA9IHRydWU7XG4gICAgZy5zZXRFZGdlKGUudywgZS52LCBsYWJlbCwgXy51bmlxdWVJZChcInJldlwiKSk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHdlaWdodEZuKGcpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuIGcuZWRnZShlKS53ZWlnaHQ7XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZnNGQVMoZykge1xuICB2YXIgZmFzID0gW107XG4gIHZhciBzdGFjayA9IHt9O1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuXG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgaWYgKF8uaGFzKHZpc2l0ZWQsIHYpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZpc2l0ZWRbdl0gPSB0cnVlO1xuICAgIHN0YWNrW3ZdID0gdHJ1ZTtcbiAgICBfLmZvckVhY2goZy5vdXRFZGdlcyh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgaWYgKF8uaGFzKHN0YWNrLCBlLncpKSB7XG4gICAgICAgIGZhcy5wdXNoKGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGZzKGUudyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZGVsZXRlIHN0YWNrW3ZdO1xuICB9XG5cbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZGZzKTtcbiAgcmV0dXJuIGZhcztcbn1cblxuZnVuY3Rpb24gdW5kbyhnKSB7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgbGFiZWwgPSBnLmVkZ2UoZSk7XG4gICAgaWYgKGxhYmVsLnJldmVyc2VkKSB7XG4gICAgICBnLnJlbW92ZUVkZ2UoZSk7XG5cbiAgICAgIHZhciBmb3J3YXJkTmFtZSA9IGxhYmVsLmZvcndhcmROYW1lO1xuICAgICAgZGVsZXRlIGxhYmVsLnJldmVyc2VkO1xuICAgICAgZGVsZXRlIGxhYmVsLmZvcndhcmROYW1lO1xuICAgICAgZy5zZXRFZGdlKGUudywgZS52LCBsYWJlbCwgZm9yd2FyZE5hbWUpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBhZGRCb3JkZXJTZWdtZW50cztcblxuZnVuY3Rpb24gYWRkQm9yZGVyU2VnbWVudHMoZykge1xuICBmdW5jdGlvbiBkZnModikge1xuICAgIHZhciBjaGlsZHJlbiA9IGcuY2hpbGRyZW4odik7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgXy5mb3JFYWNoKGNoaWxkcmVuLCBkZnMpO1xuICAgIH1cblxuICAgIGlmIChfLmhhcyhub2RlLCBcIm1pblJhbmtcIikpIHtcbiAgICAgIG5vZGUuYm9yZGVyTGVmdCA9IFtdO1xuICAgICAgbm9kZS5ib3JkZXJSaWdodCA9IFtdO1xuICAgICAgZm9yICh2YXIgcmFuayA9IG5vZGUubWluUmFuaywgbWF4UmFuayA9IG5vZGUubWF4UmFuayArIDE7XG4gICAgICAgIHJhbmsgPCBtYXhSYW5rO1xuICAgICAgICArK3JhbmspIHtcbiAgICAgICAgYWRkQm9yZGVyTm9kZShnLCBcImJvcmRlckxlZnRcIiwgXCJfYmxcIiwgdiwgbm9kZSwgcmFuayk7XG4gICAgICAgIGFkZEJvcmRlck5vZGUoZywgXCJib3JkZXJSaWdodFwiLCBcIl9iclwiLCB2LCBub2RlLCByYW5rKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfLmZvckVhY2goZy5jaGlsZHJlbigpLCBkZnMpO1xufVxuXG5mdW5jdGlvbiBhZGRCb3JkZXJOb2RlKGcsIHByb3AsIHByZWZpeCwgc2csIHNnTm9kZSwgcmFuaykge1xuICB2YXIgbGFiZWwgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHJhbms6IHJhbmssIGJvcmRlclR5cGU6IHByb3AgfTtcbiAgdmFyIHByZXYgPSBzZ05vZGVbcHJvcF1bcmFuayAtIDFdO1xuICB2YXIgY3VyciA9IHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwiYm9yZGVyXCIsIGxhYmVsLCBwcmVmaXgpO1xuICBzZ05vZGVbcHJvcF1bcmFua10gPSBjdXJyO1xuICBnLnNldFBhcmVudChjdXJyLCBzZyk7XG4gIGlmIChwcmV2KSB7XG4gICAgZy5zZXRFZGdlKHByZXYsIGN1cnIsIHsgd2VpZ2h0OiAxIH0pO1xuICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhZGp1c3Q6IGFkanVzdCxcbiAgdW5kbzogdW5kb1xufTtcblxuZnVuY3Rpb24gYWRqdXN0KGcpIHtcbiAgdmFyIHJhbmtEaXIgPSBnLmdyYXBoKCkucmFua2Rpci50b0xvd2VyQ2FzZSgpO1xuICBpZiAocmFua0RpciA9PT0gXCJsclwiIHx8IHJhbmtEaXIgPT09IFwicmxcIikge1xuICAgIHN3YXBXaWR0aEhlaWdodChnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bmRvKGcpIHtcbiAgdmFyIHJhbmtEaXIgPSBnLmdyYXBoKCkucmFua2Rpci50b0xvd2VyQ2FzZSgpO1xuICBpZiAocmFua0RpciA9PT0gXCJidFwiIHx8IHJhbmtEaXIgPT09IFwicmxcIikge1xuICAgIHJldmVyc2VZKGcpO1xuICB9XG5cbiAgaWYgKHJhbmtEaXIgPT09IFwibHJcIiB8fCByYW5rRGlyID09PSBcInJsXCIpIHtcbiAgICBzd2FwWFkoZyk7XG4gICAgc3dhcFdpZHRoSGVpZ2h0KGcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN3YXBXaWR0aEhlaWdodChnKSB7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgc3dhcFdpZHRoSGVpZ2h0T25lKGcubm9kZSh2KSk7IH0pO1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7IHN3YXBXaWR0aEhlaWdodE9uZShnLmVkZ2UoZSkpOyB9KTtcbn1cblxuZnVuY3Rpb24gc3dhcFdpZHRoSGVpZ2h0T25lKGF0dHJzKSB7XG4gIHZhciB3ID0gYXR0cnMud2lkdGg7XG4gIGF0dHJzLndpZHRoID0gYXR0cnMuaGVpZ2h0O1xuICBhdHRycy5oZWlnaHQgPSB3O1xufVxuXG5mdW5jdGlvbiByZXZlcnNlWShnKSB7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgcmV2ZXJzZVlPbmUoZy5ub2RlKHYpKTsgfSk7XG5cbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIF8uZm9yRWFjaChlZGdlLnBvaW50cywgcmV2ZXJzZVlPbmUpO1xuICAgIGlmIChfLmhhcyhlZGdlLCBcInlcIikpIHtcbiAgICAgIHJldmVyc2VZT25lKGVkZ2UpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJldmVyc2VZT25lKGF0dHJzKSB7XG4gIGF0dHJzLnkgPSAtYXR0cnMueTtcbn1cblxuZnVuY3Rpb24gc3dhcFhZKGcpIHtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikgeyBzd2FwWFlPbmUoZy5ub2RlKHYpKTsgfSk7XG5cbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIF8uZm9yRWFjaChlZGdlLnBvaW50cywgc3dhcFhZT25lKTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ4XCIpKSB7XG4gICAgICBzd2FwWFlPbmUoZWRnZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc3dhcFhZT25lKGF0dHJzKSB7XG4gIHZhciB4ID0gYXR0cnMueDtcbiAgYXR0cnMueCA9IGF0dHJzLnk7XG4gIGF0dHJzLnkgPSB4O1xufVxuIiwiLypcbiAqIFNpbXBsZSBkb3VibHkgbGlua2VkIGxpc3QgaW1wbGVtZW50YXRpb24gZGVyaXZlZCBmcm9tIENvcm1lbiwgZXQgYWwuLFxuICogXCJJbnRyb2R1Y3Rpb24gdG8gQWxnb3JpdGhtc1wiLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gTGlzdDtcblxuZnVuY3Rpb24gTGlzdCgpIHtcbiAgdmFyIHNlbnRpbmVsID0ge307XG4gIHNlbnRpbmVsLl9uZXh0ID0gc2VudGluZWwuX3ByZXYgPSBzZW50aW5lbDtcbiAgdGhpcy5fc2VudGluZWwgPSBzZW50aW5lbDtcbn1cblxuTGlzdC5wcm90b3R5cGUuZGVxdWV1ZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VudGluZWwgPSB0aGlzLl9zZW50aW5lbDtcbiAgdmFyIGVudHJ5ID0gc2VudGluZWwuX3ByZXY7XG4gIGlmIChlbnRyeSAhPT0gc2VudGluZWwpIHtcbiAgICB1bmxpbmsoZW50cnkpO1xuICAgIHJldHVybiBlbnRyeTtcbiAgfVxufTtcblxuTGlzdC5wcm90b3R5cGUuZW5xdWV1ZSA9IGZ1bmN0aW9uKGVudHJ5KSB7XG4gIHZhciBzZW50aW5lbCA9IHRoaXMuX3NlbnRpbmVsO1xuICBpZiAoZW50cnkuX3ByZXYgJiYgZW50cnkuX25leHQpIHtcbiAgICB1bmxpbmsoZW50cnkpO1xuICB9XG4gIGVudHJ5Ll9uZXh0ID0gc2VudGluZWwuX25leHQ7XG4gIHNlbnRpbmVsLl9uZXh0Ll9wcmV2ID0gZW50cnk7XG4gIHNlbnRpbmVsLl9uZXh0ID0gZW50cnk7XG4gIGVudHJ5Ll9wcmV2ID0gc2VudGluZWw7XG59O1xuXG5MaXN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3RycyA9IFtdO1xuICB2YXIgc2VudGluZWwgPSB0aGlzLl9zZW50aW5lbDtcbiAgdmFyIGN1cnIgPSBzZW50aW5lbC5fcHJldjtcbiAgd2hpbGUgKGN1cnIgIT09IHNlbnRpbmVsKSB7XG4gICAgc3Rycy5wdXNoKEpTT04uc3RyaW5naWZ5KGN1cnIsIGZpbHRlck91dExpbmtzKSk7XG4gICAgY3VyciA9IGN1cnIuX3ByZXY7XG4gIH1cbiAgcmV0dXJuIFwiW1wiICsgc3Rycy5qb2luKFwiLCBcIikgKyBcIl1cIjtcbn07XG5cbmZ1bmN0aW9uIHVubGluayhlbnRyeSkge1xuICBlbnRyeS5fcHJldi5fbmV4dCA9IGVudHJ5Ll9uZXh0O1xuICBlbnRyeS5fbmV4dC5fcHJldiA9IGVudHJ5Ll9wcmV2O1xuICBkZWxldGUgZW50cnkuX25leHQ7XG4gIGRlbGV0ZSBlbnRyeS5fcHJldjtcbn1cblxuZnVuY3Rpb24gZmlsdGVyT3V0TGlua3Moaywgdikge1xuICBpZiAoayAhPT0gXCJfbmV4dFwiICYmIGsgIT09IFwiX3ByZXZcIikge1xuICAgIHJldHVybiB2O1xuICB9XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuL2dyYXBobGliXCIpLkdyYXBoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZGVidWdPcmRlcmluZzogZGVidWdPcmRlcmluZ1xufTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIGRlYnVnT3JkZXJpbmcoZykge1xuICB2YXIgbGF5ZXJNYXRyaXggPSB1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7XG5cbiAgdmFyIGggPSBuZXcgR3JhcGgoeyBjb21wb3VuZDogdHJ1ZSwgbXVsdGlncmFwaDogdHJ1ZSB9KS5zZXRHcmFwaCh7fSk7XG5cbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIGguc2V0Tm9kZSh2LCB7IGxhYmVsOiB2IH0pO1xuICAgIGguc2V0UGFyZW50KHYsIFwibGF5ZXJcIiArIGcubm9kZSh2KS5yYW5rKTtcbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIGguc2V0RWRnZShlLnYsIGUudywge30sIGUubmFtZSk7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChsYXllck1hdHJpeCwgZnVuY3Rpb24obGF5ZXIsIGkpIHtcbiAgICB2YXIgbGF5ZXJWID0gXCJsYXllclwiICsgaTtcbiAgICBoLnNldE5vZGUobGF5ZXJWLCB7IHJhbms6IFwic2FtZVwiIH0pO1xuICAgIF8ucmVkdWNlKGxheWVyLCBmdW5jdGlvbih1LCB2KSB7XG4gICAgICBoLnNldEVkZ2UodSwgdiwgeyBzdHlsZTogXCJpbnZpc1wiIH0pO1xuICAgICAgcmV0dXJuIHY7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiBoO1xufVxuIiwiLyogZ2xvYmFsIHdpbmRvdyAqL1xuXG52YXIgZ3JhcGhsaWI7XG5cbmlmICh0eXBlb2YgcmVxdWlyZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gIHRyeSB7XG4gICAgZ3JhcGhsaWIgPSByZXF1aXJlKFwiZ3JhcGhsaWJcIik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBjb250aW51ZSByZWdhcmRsZXNzIG9mIGVycm9yXG4gIH1cbn1cblxuaWYgKCFncmFwaGxpYikge1xuICBncmFwaGxpYiA9IHdpbmRvdy5ncmFwaGxpYjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBncmFwaGxpYjtcbiIsInZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4vZ3JhcGhsaWJcIikuR3JhcGg7XG52YXIgTGlzdCA9IHJlcXVpcmUoXCIuL2RhdGEvbGlzdFwiKTtcblxuLypcbiAqIEEgZ3JlZWR5IGhldXJpc3RpYyBmb3IgZmluZGluZyBhIGZlZWRiYWNrIGFyYyBzZXQgZm9yIGEgZ3JhcGguIEEgZmVlZGJhY2tcbiAqIGFyYyBzZXQgaXMgYSBzZXQgb2YgZWRnZXMgdGhhdCBjYW4gYmUgcmVtb3ZlZCB0byBtYWtlIGEgZ3JhcGggYWN5Y2xpYy5cbiAqIFRoZSBhbGdvcml0aG0gY29tZXMgZnJvbTogUC4gRWFkZXMsIFguIExpbiwgYW5kIFcuIEYuIFNteXRoLCBcIkEgZmFzdCBhbmRcbiAqIGVmZmVjdGl2ZSBoZXVyaXN0aWMgZm9yIHRoZSBmZWVkYmFjayBhcmMgc2V0IHByb2JsZW0uXCIgVGhpcyBpbXBsZW1lbnRhdGlvblxuICogYWRqdXN0cyB0aGF0IGZyb20gdGhlIHBhcGVyIHRvIGFsbG93IGZvciB3ZWlnaHRlZCBlZGdlcy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBncmVlZHlGQVM7XG5cbnZhciBERUZBVUxUX1dFSUdIVF9GTiA9IF8uY29uc3RhbnQoMSk7XG5cbmZ1bmN0aW9uIGdyZWVkeUZBUyhnLCB3ZWlnaHRGbikge1xuICBpZiAoZy5ub2RlQ291bnQoKSA8PSAxKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciBzdGF0ZSA9IGJ1aWxkU3RhdGUoZywgd2VpZ2h0Rm4gfHwgREVGQVVMVF9XRUlHSFRfRk4pO1xuICB2YXIgcmVzdWx0cyA9IGRvR3JlZWR5RkFTKHN0YXRlLmdyYXBoLCBzdGF0ZS5idWNrZXRzLCBzdGF0ZS56ZXJvSWR4KTtcblxuICAvLyBFeHBhbmQgbXVsdGktZWRnZXNcbiAgcmV0dXJuIF8uZmxhdHRlbihfLm1hcChyZXN1bHRzLCBmdW5jdGlvbihlKSB7XG4gICAgcmV0dXJuIGcub3V0RWRnZXMoZS52LCBlLncpO1xuICB9KSwgdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGRvR3JlZWR5RkFTKGcsIGJ1Y2tldHMsIHplcm9JZHgpIHtcbiAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgdmFyIHNvdXJjZXMgPSBidWNrZXRzW2J1Y2tldHMubGVuZ3RoIC0gMV07XG4gIHZhciBzaW5rcyA9IGJ1Y2tldHNbMF07XG5cbiAgdmFyIGVudHJ5O1xuICB3aGlsZSAoZy5ub2RlQ291bnQoKSkge1xuICAgIHdoaWxlICgoZW50cnkgPSBzaW5rcy5kZXF1ZXVlKCkpKSAgIHsgcmVtb3ZlTm9kZShnLCBidWNrZXRzLCB6ZXJvSWR4LCBlbnRyeSk7IH1cbiAgICB3aGlsZSAoKGVudHJ5ID0gc291cmNlcy5kZXF1ZXVlKCkpKSB7IHJlbW92ZU5vZGUoZywgYnVja2V0cywgemVyb0lkeCwgZW50cnkpOyB9XG4gICAgaWYgKGcubm9kZUNvdW50KCkpIHtcbiAgICAgIGZvciAodmFyIGkgPSBidWNrZXRzLmxlbmd0aCAtIDI7IGkgPiAwOyAtLWkpIHtcbiAgICAgICAgZW50cnkgPSBidWNrZXRzW2ldLmRlcXVldWUoKTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuY29uY2F0KHJlbW92ZU5vZGUoZywgYnVja2V0cywgemVyb0lkeCwgZW50cnksIHRydWUpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiByZW1vdmVOb2RlKGcsIGJ1Y2tldHMsIHplcm9JZHgsIGVudHJ5LCBjb2xsZWN0UHJlZGVjZXNzb3JzKSB7XG4gIHZhciByZXN1bHRzID0gY29sbGVjdFByZWRlY2Vzc29ycyA/IFtdIDogdW5kZWZpbmVkO1xuXG4gIF8uZm9yRWFjaChnLmluRWRnZXMoZW50cnkudiksIGZ1bmN0aW9uKGVkZ2UpIHtcbiAgICB2YXIgd2VpZ2h0ID0gZy5lZGdlKGVkZ2UpO1xuICAgIHZhciB1RW50cnkgPSBnLm5vZGUoZWRnZS52KTtcblxuICAgIGlmIChjb2xsZWN0UHJlZGVjZXNzb3JzKSB7XG4gICAgICByZXN1bHRzLnB1c2goeyB2OiBlZGdlLnYsIHc6IGVkZ2UudyB9KTtcbiAgICB9XG5cbiAgICB1RW50cnkub3V0IC09IHdlaWdodDtcbiAgICBhc3NpZ25CdWNrZXQoYnVja2V0cywgemVyb0lkeCwgdUVudHJ5KTtcbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGcub3V0RWRnZXMoZW50cnkudiksIGZ1bmN0aW9uKGVkZ2UpIHtcbiAgICB2YXIgd2VpZ2h0ID0gZy5lZGdlKGVkZ2UpO1xuICAgIHZhciB3ID0gZWRnZS53O1xuICAgIHZhciB3RW50cnkgPSBnLm5vZGUodyk7XG4gICAgd0VudHJ5W1wiaW5cIl0gLT0gd2VpZ2h0O1xuICAgIGFzc2lnbkJ1Y2tldChidWNrZXRzLCB6ZXJvSWR4LCB3RW50cnkpO1xuICB9KTtcblxuICBnLnJlbW92ZU5vZGUoZW50cnkudik7XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU3RhdGUoZywgd2VpZ2h0Rm4pIHtcbiAgdmFyIGZhc0dyYXBoID0gbmV3IEdyYXBoKCk7XG4gIHZhciBtYXhJbiA9IDA7XG4gIHZhciBtYXhPdXQgPSAwO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBmYXNHcmFwaC5zZXROb2RlKHYsIHsgdjogdiwgXCJpblwiOiAwLCBvdXQ6IDAgfSk7XG4gIH0pO1xuXG4gIC8vIEFnZ3JlZ2F0ZSB3ZWlnaHRzIG9uIG5vZGVzLCBidXQgYWxzbyBzdW0gdGhlIHdlaWdodHMgYWNyb3NzIG11bHRpLWVkZ2VzXG4gIC8vIGludG8gYSBzaW5nbGUgZWRnZSBmb3IgdGhlIGZhc0dyYXBoLlxuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIHByZXZXZWlnaHQgPSBmYXNHcmFwaC5lZGdlKGUudiwgZS53KSB8fCAwO1xuICAgIHZhciB3ZWlnaHQgPSB3ZWlnaHRGbihlKTtcbiAgICB2YXIgZWRnZVdlaWdodCA9IHByZXZXZWlnaHQgKyB3ZWlnaHQ7XG4gICAgZmFzR3JhcGguc2V0RWRnZShlLnYsIGUudywgZWRnZVdlaWdodCk7XG4gICAgbWF4T3V0ID0gTWF0aC5tYXgobWF4T3V0LCBmYXNHcmFwaC5ub2RlKGUudikub3V0ICs9IHdlaWdodCk7XG4gICAgbWF4SW4gID0gTWF0aC5tYXgobWF4SW4sICBmYXNHcmFwaC5ub2RlKGUudylbXCJpblwiXSAgKz0gd2VpZ2h0KTtcbiAgfSk7XG5cbiAgdmFyIGJ1Y2tldHMgPSBfLnJhbmdlKG1heE91dCArIG1heEluICsgMykubWFwKGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IExpc3QoKTsgfSk7XG4gIHZhciB6ZXJvSWR4ID0gbWF4SW4gKyAxO1xuXG4gIF8uZm9yRWFjaChmYXNHcmFwaC5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgYXNzaWduQnVja2V0KGJ1Y2tldHMsIHplcm9JZHgsIGZhc0dyYXBoLm5vZGUodikpO1xuICB9KTtcblxuICByZXR1cm4geyBncmFwaDogZmFzR3JhcGgsIGJ1Y2tldHM6IGJ1Y2tldHMsIHplcm9JZHg6IHplcm9JZHggfTtcbn1cblxuZnVuY3Rpb24gYXNzaWduQnVja2V0KGJ1Y2tldHMsIHplcm9JZHgsIGVudHJ5KSB7XG4gIGlmICghZW50cnkub3V0KSB7XG4gICAgYnVja2V0c1swXS5lbnF1ZXVlKGVudHJ5KTtcbiAgfSBlbHNlIGlmICghZW50cnlbXCJpblwiXSkge1xuICAgIGJ1Y2tldHNbYnVja2V0cy5sZW5ndGggLSAxXS5lbnF1ZXVlKGVudHJ5KTtcbiAgfSBlbHNlIHtcbiAgICBidWNrZXRzW2VudHJ5Lm91dCAtIGVudHJ5W1wiaW5cIl0gKyB6ZXJvSWR4XS5lbnF1ZXVlKGVudHJ5KTtcbiAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIGFjeWNsaWMgPSByZXF1aXJlKFwiLi9hY3ljbGljXCIpO1xudmFyIG5vcm1hbGl6ZSA9IHJlcXVpcmUoXCIuL25vcm1hbGl6ZVwiKTtcbnZhciByYW5rID0gcmVxdWlyZShcIi4vcmFua1wiKTtcbnZhciBub3JtYWxpemVSYW5rcyA9IHJlcXVpcmUoXCIuL3V0aWxcIikubm9ybWFsaXplUmFua3M7XG52YXIgcGFyZW50RHVtbXlDaGFpbnMgPSByZXF1aXJlKFwiLi9wYXJlbnQtZHVtbXktY2hhaW5zXCIpO1xudmFyIHJlbW92ZUVtcHR5UmFua3MgPSByZXF1aXJlKFwiLi91dGlsXCIpLnJlbW92ZUVtcHR5UmFua3M7XG52YXIgbmVzdGluZ0dyYXBoID0gcmVxdWlyZShcIi4vbmVzdGluZy1ncmFwaFwiKTtcbnZhciBhZGRCb3JkZXJTZWdtZW50cyA9IHJlcXVpcmUoXCIuL2FkZC1ib3JkZXItc2VnbWVudHNcIik7XG52YXIgY29vcmRpbmF0ZVN5c3RlbSA9IHJlcXVpcmUoXCIuL2Nvb3JkaW5hdGUtc3lzdGVtXCIpO1xudmFyIG9yZGVyID0gcmVxdWlyZShcIi4vb3JkZXJcIik7XG52YXIgcG9zaXRpb24gPSByZXF1aXJlKFwiLi9wb3NpdGlvblwiKTtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuL2dyYXBobGliXCIpLkdyYXBoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxheW91dDtcblxuZnVuY3Rpb24gbGF5b3V0KGcsIG9wdHMpIHtcbiAgdmFyIHRpbWUgPSBvcHRzICYmIG9wdHMuZGVidWdUaW1pbmcgPyB1dGlsLnRpbWUgOiB1dGlsLm5vdGltZTtcbiAgdGltZShcImxheW91dFwiLCBmdW5jdGlvbigpIHtcbiAgICB2YXIgbGF5b3V0R3JhcGggPSBcbiAgICAgIHRpbWUoXCIgIGJ1aWxkTGF5b3V0R3JhcGhcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBidWlsZExheW91dEdyYXBoKGcpOyB9KTtcbiAgICB0aW1lKFwiICBydW5MYXlvdXRcIiwgICAgICAgIGZ1bmN0aW9uKCkgeyBydW5MYXlvdXQobGF5b3V0R3JhcGgsIHRpbWUpOyB9KTtcbiAgICB0aW1lKFwiICB1cGRhdGVJbnB1dEdyYXBoXCIsIGZ1bmN0aW9uKCkgeyB1cGRhdGVJbnB1dEdyYXBoKGcsIGxheW91dEdyYXBoKTsgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBydW5MYXlvdXQoZywgdGltZSkge1xuICB0aW1lKFwiICAgIG1ha2VTcGFjZUZvckVkZ2VMYWJlbHNcIiwgZnVuY3Rpb24oKSB7IG1ha2VTcGFjZUZvckVkZ2VMYWJlbHMoZyk7IH0pO1xuICB0aW1lKFwiICAgIHJlbW92ZVNlbGZFZGdlc1wiLCAgICAgICAgZnVuY3Rpb24oKSB7IHJlbW92ZVNlbGZFZGdlcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgYWN5Y2xpY1wiLCAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgYWN5Y2xpYy5ydW4oZyk7IH0pO1xuICB0aW1lKFwiICAgIG5lc3RpbmdHcmFwaC5ydW5cIiwgICAgICAgZnVuY3Rpb24oKSB7IG5lc3RpbmdHcmFwaC5ydW4oZyk7IH0pO1xuICB0aW1lKFwiICAgIHJhbmtcIiwgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJhbmsodXRpbC5hc05vbkNvbXBvdW5kR3JhcGgoZykpOyB9KTtcbiAgdGltZShcIiAgICBpbmplY3RFZGdlTGFiZWxQcm94aWVzXCIsIGZ1bmN0aW9uKCkgeyBpbmplY3RFZGdlTGFiZWxQcm94aWVzKGcpOyB9KTtcbiAgdGltZShcIiAgICByZW1vdmVFbXB0eVJhbmtzXCIsICAgICAgIGZ1bmN0aW9uKCkgeyByZW1vdmVFbXB0eVJhbmtzKGcpOyB9KTtcbiAgdGltZShcIiAgICBuZXN0aW5nR3JhcGguY2xlYW51cFwiLCAgIGZ1bmN0aW9uKCkgeyBuZXN0aW5nR3JhcGguY2xlYW51cChnKTsgfSk7XG4gIHRpbWUoXCIgICAgbm9ybWFsaXplUmFua3NcIiwgICAgICAgICBmdW5jdGlvbigpIHsgbm9ybWFsaXplUmFua3MoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFzc2lnblJhbmtNaW5NYXhcIiwgICAgICAgZnVuY3Rpb24oKSB7IGFzc2lnblJhbmtNaW5NYXgoZyk7IH0pO1xuICB0aW1lKFwiICAgIHJlbW92ZUVkZ2VMYWJlbFByb3hpZXNcIiwgZnVuY3Rpb24oKSB7IHJlbW92ZUVkZ2VMYWJlbFByb3hpZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIG5vcm1hbGl6ZS5ydW5cIiwgICAgICAgICAgZnVuY3Rpb24oKSB7IG5vcm1hbGl6ZS5ydW4oZyk7IH0pO1xuICB0aW1lKFwiICAgIHBhcmVudER1bW15Q2hhaW5zXCIsICAgICAgZnVuY3Rpb24oKSB7IHBhcmVudER1bW15Q2hhaW5zKGcpOyB9KTtcbiAgdGltZShcIiAgICBhZGRCb3JkZXJTZWdtZW50c1wiLCAgICAgIGZ1bmN0aW9uKCkgeyBhZGRCb3JkZXJTZWdtZW50cyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgb3JkZXJcIiwgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgb3JkZXIoZyk7IH0pO1xuICB0aW1lKFwiICAgIGluc2VydFNlbGZFZGdlc1wiLCAgICAgICAgZnVuY3Rpb24oKSB7IGluc2VydFNlbGZFZGdlcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgYWRqdXN0Q29vcmRpbmF0ZVN5c3RlbVwiLCBmdW5jdGlvbigpIHsgY29vcmRpbmF0ZVN5c3RlbS5hZGp1c3QoZyk7IH0pO1xuICB0aW1lKFwiICAgIHBvc2l0aW9uXCIsICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHBvc2l0aW9uKGcpOyB9KTtcbiAgdGltZShcIiAgICBwb3NpdGlvblNlbGZFZGdlc1wiLCAgICAgIGZ1bmN0aW9uKCkgeyBwb3NpdGlvblNlbGZFZGdlcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgcmVtb3ZlQm9yZGVyTm9kZXNcIiwgICAgICBmdW5jdGlvbigpIHsgcmVtb3ZlQm9yZGVyTm9kZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIG5vcm1hbGl6ZS51bmRvXCIsICAgICAgICAgZnVuY3Rpb24oKSB7IG5vcm1hbGl6ZS51bmRvKGcpOyB9KTtcbiAgdGltZShcIiAgICBmaXh1cEVkZ2VMYWJlbENvb3Jkc1wiLCAgIGZ1bmN0aW9uKCkgeyBmaXh1cEVkZ2VMYWJlbENvb3JkcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgdW5kb0Nvb3JkaW5hdGVTeXN0ZW1cIiwgICBmdW5jdGlvbigpIHsgY29vcmRpbmF0ZVN5c3RlbS51bmRvKGcpOyB9KTtcbiAgdGltZShcIiAgICB0cmFuc2xhdGVHcmFwaFwiLCAgICAgICAgIGZ1bmN0aW9uKCkgeyB0cmFuc2xhdGVHcmFwaChnKTsgfSk7XG4gIHRpbWUoXCIgICAgYXNzaWduTm9kZUludGVyc2VjdHNcIiwgICBmdW5jdGlvbigpIHsgYXNzaWduTm9kZUludGVyc2VjdHMoZyk7IH0pO1xuICB0aW1lKFwiICAgIHJldmVyc2VQb2ludHNcIiwgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldmVyc2VQb2ludHNGb3JSZXZlcnNlZEVkZ2VzKGcpOyB9KTtcbiAgdGltZShcIiAgICBhY3ljbGljLnVuZG9cIiwgICAgICAgICAgIGZ1bmN0aW9uKCkgeyBhY3ljbGljLnVuZG8oZyk7IH0pO1xufVxuXG4vKlxuICogQ29waWVzIGZpbmFsIGxheW91dCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBsYXlvdXQgZ3JhcGggYmFjayB0byB0aGUgaW5wdXRcbiAqIGdyYXBoLiBUaGlzIHByb2Nlc3Mgb25seSBjb3BpZXMgd2hpdGVsaXN0ZWQgYXR0cmlidXRlcyBmcm9tIHRoZSBsYXlvdXQgZ3JhcGhcbiAqIHRvIHRoZSBpbnB1dCBncmFwaCwgc28gaXQgc2VydmVzIGFzIGEgZ29vZCBwbGFjZSB0byBkZXRlcm1pbmUgd2hhdFxuICogYXR0cmlidXRlcyBjYW4gaW5mbHVlbmNlIGxheW91dC5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlSW5wdXRHcmFwaChpbnB1dEdyYXBoLCBsYXlvdXRHcmFwaCkge1xuICBfLmZvckVhY2goaW5wdXRHcmFwaC5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIGlucHV0TGFiZWwgPSBpbnB1dEdyYXBoLm5vZGUodik7XG4gICAgdmFyIGxheW91dExhYmVsID0gbGF5b3V0R3JhcGgubm9kZSh2KTtcblxuICAgIGlmIChpbnB1dExhYmVsKSB7XG4gICAgICBpbnB1dExhYmVsLnggPSBsYXlvdXRMYWJlbC54O1xuICAgICAgaW5wdXRMYWJlbC55ID0gbGF5b3V0TGFiZWwueTtcblxuICAgICAgaWYgKGxheW91dEdyYXBoLmNoaWxkcmVuKHYpLmxlbmd0aCkge1xuICAgICAgICBpbnB1dExhYmVsLndpZHRoID0gbGF5b3V0TGFiZWwud2lkdGg7XG4gICAgICAgIGlucHV0TGFiZWwuaGVpZ2h0ID0gbGF5b3V0TGFiZWwuaGVpZ2h0O1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGlucHV0R3JhcGguZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBpbnB1dExhYmVsID0gaW5wdXRHcmFwaC5lZGdlKGUpO1xuICAgIHZhciBsYXlvdXRMYWJlbCA9IGxheW91dEdyYXBoLmVkZ2UoZSk7XG5cbiAgICBpbnB1dExhYmVsLnBvaW50cyA9IGxheW91dExhYmVsLnBvaW50cztcbiAgICBpZiAoXy5oYXMobGF5b3V0TGFiZWwsIFwieFwiKSkge1xuICAgICAgaW5wdXRMYWJlbC54ID0gbGF5b3V0TGFiZWwueDtcbiAgICAgIGlucHV0TGFiZWwueSA9IGxheW91dExhYmVsLnk7XG4gICAgfVxuICB9KTtcblxuICBpbnB1dEdyYXBoLmdyYXBoKCkud2lkdGggPSBsYXlvdXRHcmFwaC5ncmFwaCgpLndpZHRoO1xuICBpbnB1dEdyYXBoLmdyYXBoKCkuaGVpZ2h0ID0gbGF5b3V0R3JhcGguZ3JhcGgoKS5oZWlnaHQ7XG59XG5cbnZhciBncmFwaE51bUF0dHJzID0gW1wibm9kZXNlcFwiLCBcImVkZ2VzZXBcIiwgXCJyYW5rc2VwXCIsIFwibWFyZ2lueFwiLCBcIm1hcmdpbnlcIl07XG52YXIgZ3JhcGhEZWZhdWx0cyA9IHsgcmFua3NlcDogNTAsIGVkZ2VzZXA6IDIwLCBub2Rlc2VwOiA1MCwgcmFua2RpcjogXCJ0YlwiIH07XG52YXIgZ3JhcGhBdHRycyA9IFtcImFjeWNsaWNlclwiLCBcInJhbmtlclwiLCBcInJhbmtkaXJcIiwgXCJhbGlnblwiXTtcbnZhciBub2RlTnVtQXR0cnMgPSBbXCJ3aWR0aFwiLCBcImhlaWdodFwiXTtcbnZhciBub2RlRGVmYXVsdHMgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcbnZhciBlZGdlTnVtQXR0cnMgPSBbXCJtaW5sZW5cIiwgXCJ3ZWlnaHRcIiwgXCJ3aWR0aFwiLCBcImhlaWdodFwiLCBcImxhYmVsb2Zmc2V0XCJdO1xudmFyIGVkZ2VEZWZhdWx0cyA9IHtcbiAgbWlubGVuOiAxLCB3ZWlnaHQ6IDEsIHdpZHRoOiAwLCBoZWlnaHQ6IDAsXG4gIGxhYmVsb2Zmc2V0OiAxMCwgbGFiZWxwb3M6IFwiclwiXG59O1xudmFyIGVkZ2VBdHRycyA9IFtcImxhYmVscG9zXCJdO1xuXG4vKlxuICogQ29uc3RydWN0cyBhIG5ldyBncmFwaCBmcm9tIHRoZSBpbnB1dCBncmFwaCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGxheW91dC5cbiAqIFRoaXMgcHJvY2VzcyBjb3BpZXMgb25seSB3aGl0ZWxpc3RlZCBhdHRyaWJ1dGVzIGZyb20gdGhlIGlucHV0IGdyYXBoIHRvIHRoZVxuICogbGF5b3V0IGdyYXBoLiBUaHVzIHRoaXMgZnVuY3Rpb24gc2VydmVzIGFzIGEgZ29vZCBwbGFjZSB0byBkZXRlcm1pbmUgd2hhdFxuICogYXR0cmlidXRlcyBjYW4gaW5mbHVlbmNlIGxheW91dC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRMYXlvdXRHcmFwaChpbnB1dEdyYXBoKSB7XG4gIHZhciBnID0gbmV3IEdyYXBoKHsgbXVsdGlncmFwaDogdHJ1ZSwgY29tcG91bmQ6IHRydWUgfSk7XG4gIHZhciBncmFwaCA9IGNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLmdyYXBoKCkpO1xuXG4gIGcuc2V0R3JhcGgoXy5tZXJnZSh7fSxcbiAgICBncmFwaERlZmF1bHRzLFxuICAgIHNlbGVjdE51bWJlckF0dHJzKGdyYXBoLCBncmFwaE51bUF0dHJzKSxcbiAgICBfLnBpY2soZ3JhcGgsIGdyYXBoQXR0cnMpKSk7XG5cbiAgXy5mb3JFYWNoKGlucHV0R3JhcGgubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gY2Fub25pY2FsaXplKGlucHV0R3JhcGgubm9kZSh2KSk7XG4gICAgZy5zZXROb2RlKHYsIF8uZGVmYXVsdHMoc2VsZWN0TnVtYmVyQXR0cnMobm9kZSwgbm9kZU51bUF0dHJzKSwgbm9kZURlZmF1bHRzKSk7XG4gICAgZy5zZXRQYXJlbnQodiwgaW5wdXRHcmFwaC5wYXJlbnQodikpO1xuICB9KTtcblxuICBfLmZvckVhY2goaW5wdXRHcmFwaC5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBjYW5vbmljYWxpemUoaW5wdXRHcmFwaC5lZGdlKGUpKTtcbiAgICBnLnNldEVkZ2UoZSwgXy5tZXJnZSh7fSxcbiAgICAgIGVkZ2VEZWZhdWx0cyxcbiAgICAgIHNlbGVjdE51bWJlckF0dHJzKGVkZ2UsIGVkZ2VOdW1BdHRycyksXG4gICAgICBfLnBpY2soZWRnZSwgZWRnZUF0dHJzKSkpO1xuICB9KTtcblxuICByZXR1cm4gZztcbn1cblxuLypcbiAqIFRoaXMgaWRlYSBjb21lcyBmcm9tIHRoZSBHYW5zbmVyIHBhcGVyOiB0byBhY2NvdW50IGZvciBlZGdlIGxhYmVscyBpbiBvdXJcbiAqIGxheW91dCB3ZSBzcGxpdCBlYWNoIHJhbmsgaW4gaGFsZiBieSBkb3VibGluZyBtaW5sZW4gYW5kIGhhbHZpbmcgcmFua3NlcC5cbiAqIFRoZW4gd2UgY2FuIHBsYWNlIGxhYmVscyBhdCB0aGVzZSBtaWQtcG9pbnRzIGJldHdlZW4gbm9kZXMuXG4gKlxuICogV2UgYWxzbyBhZGQgc29tZSBtaW5pbWFsIHBhZGRpbmcgdG8gdGhlIHdpZHRoIHRvIHB1c2ggdGhlIGxhYmVsIGZvciB0aGUgZWRnZVxuICogYXdheSBmcm9tIHRoZSBlZGdlIGl0c2VsZiBhIGJpdC5cbiAqL1xuZnVuY3Rpb24gbWFrZVNwYWNlRm9yRWRnZUxhYmVscyhnKSB7XG4gIHZhciBncmFwaCA9IGcuZ3JhcGgoKTtcbiAgZ3JhcGgucmFua3NlcCAvPSAyO1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgZWRnZS5taW5sZW4gKj0gMjtcbiAgICBpZiAoZWRnZS5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpICE9PSBcImNcIikge1xuICAgICAgaWYgKGdyYXBoLnJhbmtkaXIgPT09IFwiVEJcIiB8fCBncmFwaC5yYW5rZGlyID09PSBcIkJUXCIpIHtcbiAgICAgICAgZWRnZS53aWR0aCArPSBlZGdlLmxhYmVsb2Zmc2V0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWRnZS5oZWlnaHQgKz0gZWRnZS5sYWJlbG9mZnNldDtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG4vKlxuICogQ3JlYXRlcyB0ZW1wb3JhcnkgZHVtbXkgbm9kZXMgdGhhdCBjYXB0dXJlIHRoZSByYW5rIGluIHdoaWNoIGVhY2ggZWRnZSdzXG4gKiBsYWJlbCBpcyBnb2luZyB0bywgaWYgaXQgaGFzIG9uZSBvZiBub24temVybyB3aWR0aCBhbmQgaGVpZ2h0LiBXZSBkbyB0aGlzXG4gKiBzbyB0aGF0IHdlIGNhbiBzYWZlbHkgcmVtb3ZlIGVtcHR5IHJhbmtzIHdoaWxlIHByZXNlcnZpbmcgYmFsYW5jZSBmb3IgdGhlXG4gKiBsYWJlbCdzIHBvc2l0aW9uLlxuICovXG5mdW5jdGlvbiBpbmplY3RFZGdlTGFiZWxQcm94aWVzKGcpIHtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIGlmIChlZGdlLndpZHRoICYmIGVkZ2UuaGVpZ2h0KSB7XG4gICAgICB2YXIgdiA9IGcubm9kZShlLnYpO1xuICAgICAgdmFyIHcgPSBnLm5vZGUoZS53KTtcbiAgICAgIHZhciBsYWJlbCA9IHsgcmFuazogKHcucmFuayAtIHYucmFuaykgLyAyICsgdi5yYW5rLCBlOiBlIH07XG4gICAgICB1dGlsLmFkZER1bW15Tm9kZShnLCBcImVkZ2UtcHJveHlcIiwgbGFiZWwsIFwiX2VwXCIpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFzc2lnblJhbmtNaW5NYXgoZykge1xuICB2YXIgbWF4UmFuayA9IDA7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBpZiAobm9kZS5ib3JkZXJUb3ApIHtcbiAgICAgIG5vZGUubWluUmFuayA9IGcubm9kZShub2RlLmJvcmRlclRvcCkucmFuaztcbiAgICAgIG5vZGUubWF4UmFuayA9IGcubm9kZShub2RlLmJvcmRlckJvdHRvbSkucmFuaztcbiAgICAgIG1heFJhbmsgPSBfLm1heChtYXhSYW5rLCBub2RlLm1heFJhbmspO1xuICAgIH1cbiAgfSk7XG4gIGcuZ3JhcGgoKS5tYXhSYW5rID0gbWF4UmFuaztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRWRnZUxhYmVsUHJveGllcyhnKSB7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBpZiAobm9kZS5kdW1teSA9PT0gXCJlZGdlLXByb3h5XCIpIHtcbiAgICAgIGcuZWRnZShub2RlLmUpLmxhYmVsUmFuayA9IG5vZGUucmFuaztcbiAgICAgIGcucmVtb3ZlTm9kZSh2KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0cmFuc2xhdGVHcmFwaChnKSB7XG4gIHZhciBtaW5YID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICB2YXIgbWF4WCA9IDA7XG4gIHZhciBtaW5ZID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICB2YXIgbWF4WSA9IDA7XG4gIHZhciBncmFwaExhYmVsID0gZy5ncmFwaCgpO1xuICB2YXIgbWFyZ2luWCA9IGdyYXBoTGFiZWwubWFyZ2lueCB8fCAwO1xuICB2YXIgbWFyZ2luWSA9IGdyYXBoTGFiZWwubWFyZ2lueSB8fCAwO1xuXG4gIGZ1bmN0aW9uIGdldEV4dHJlbWVzKGF0dHJzKSB7XG4gICAgdmFyIHggPSBhdHRycy54O1xuICAgIHZhciB5ID0gYXR0cnMueTtcbiAgICB2YXIgdyA9IGF0dHJzLndpZHRoO1xuICAgIHZhciBoID0gYXR0cnMuaGVpZ2h0O1xuICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCB4IC0gdyAvIDIpO1xuICAgIG1heFggPSBNYXRoLm1heChtYXhYLCB4ICsgdyAvIDIpO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5IC0gaCAvIDIpO1xuICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCB5ICsgaCAvIDIpO1xuICB9XG5cbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikgeyBnZXRFeHRyZW1lcyhnLm5vZGUodikpOyB9KTtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIGlmIChfLmhhcyhlZGdlLCBcInhcIikpIHtcbiAgICAgIGdldEV4dHJlbWVzKGVkZ2UpO1xuICAgIH1cbiAgfSk7XG5cbiAgbWluWCAtPSBtYXJnaW5YO1xuICBtaW5ZIC09IG1hcmdpblk7XG5cbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIG5vZGUueCAtPSBtaW5YO1xuICAgIG5vZGUueSAtPSBtaW5ZO1xuICB9KTtcblxuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgXy5mb3JFYWNoKGVkZ2UucG9pbnRzLCBmdW5jdGlvbihwKSB7XG4gICAgICBwLnggLT0gbWluWDtcbiAgICAgIHAueSAtPSBtaW5ZO1xuICAgIH0pO1xuICAgIGlmIChfLmhhcyhlZGdlLCBcInhcIikpIHsgZWRnZS54IC09IG1pblg7IH1cbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ5XCIpKSB7IGVkZ2UueSAtPSBtaW5ZOyB9XG4gIH0pO1xuXG4gIGdyYXBoTGFiZWwud2lkdGggPSBtYXhYIC0gbWluWCArIG1hcmdpblg7XG4gIGdyYXBoTGFiZWwuaGVpZ2h0ID0gbWF4WSAtIG1pblkgKyBtYXJnaW5ZO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25Ob2RlSW50ZXJzZWN0cyhnKSB7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICB2YXIgbm9kZVYgPSBnLm5vZGUoZS52KTtcbiAgICB2YXIgbm9kZVcgPSBnLm5vZGUoZS53KTtcbiAgICB2YXIgcDEsIHAyO1xuICAgIGlmICghZWRnZS5wb2ludHMpIHtcbiAgICAgIGVkZ2UucG9pbnRzID0gW107XG4gICAgICBwMSA9IG5vZGVXO1xuICAgICAgcDIgPSBub2RlVjtcbiAgICB9IGVsc2Uge1xuICAgICAgcDEgPSBlZGdlLnBvaW50c1swXTtcbiAgICAgIHAyID0gZWRnZS5wb2ludHNbZWRnZS5wb2ludHMubGVuZ3RoIC0gMV07XG4gICAgfVxuICAgIGVkZ2UucG9pbnRzLnVuc2hpZnQodXRpbC5pbnRlcnNlY3RSZWN0KG5vZGVWLCBwMSkpO1xuICAgIGVkZ2UucG9pbnRzLnB1c2godXRpbC5pbnRlcnNlY3RSZWN0KG5vZGVXLCBwMikpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZml4dXBFZGdlTGFiZWxDb29yZHMoZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgaWYgKF8uaGFzKGVkZ2UsIFwieFwiKSkge1xuICAgICAgaWYgKGVkZ2UubGFiZWxwb3MgPT09IFwibFwiIHx8IGVkZ2UubGFiZWxwb3MgPT09IFwiclwiKSB7XG4gICAgICAgIGVkZ2Uud2lkdGggLT0gZWRnZS5sYWJlbG9mZnNldDtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoZWRnZS5sYWJlbHBvcykge1xuICAgICAgY2FzZSBcImxcIjogZWRnZS54IC09IGVkZ2Uud2lkdGggLyAyICsgZWRnZS5sYWJlbG9mZnNldDsgYnJlYWs7XG4gICAgICBjYXNlIFwiclwiOiBlZGdlLnggKz0gZWRnZS53aWR0aCAvIDIgKyBlZGdlLmxhYmVsb2Zmc2V0OyBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXZlcnNlUG9pbnRzRm9yUmV2ZXJzZWRFZGdlcyhnKSB7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBpZiAoZWRnZS5yZXZlcnNlZCkge1xuICAgICAgZWRnZS5wb2ludHMucmV2ZXJzZSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUJvcmRlck5vZGVzKGcpIHtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIGlmIChnLmNoaWxkcmVuKHYpLmxlbmd0aCkge1xuICAgICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgICB2YXIgdCA9IGcubm9kZShub2RlLmJvcmRlclRvcCk7XG4gICAgICB2YXIgYiA9IGcubm9kZShub2RlLmJvcmRlckJvdHRvbSk7XG4gICAgICB2YXIgbCA9IGcubm9kZShfLmxhc3Qobm9kZS5ib3JkZXJMZWZ0KSk7XG4gICAgICB2YXIgciA9IGcubm9kZShfLmxhc3Qobm9kZS5ib3JkZXJSaWdodCkpO1xuXG4gICAgICBub2RlLndpZHRoID0gTWF0aC5hYnMoci54IC0gbC54KTtcbiAgICAgIG5vZGUuaGVpZ2h0ID0gTWF0aC5hYnMoYi55IC0gdC55KTtcbiAgICAgIG5vZGUueCA9IGwueCArIG5vZGUud2lkdGggLyAyO1xuICAgICAgbm9kZS55ID0gdC55ICsgbm9kZS5oZWlnaHQgLyAyO1xuICAgIH1cbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIGlmIChnLm5vZGUodikuZHVtbXkgPT09IFwiYm9yZGVyXCIpIHtcbiAgICAgIGcucmVtb3ZlTm9kZSh2KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVTZWxmRWRnZXMoZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgaWYgKGUudiA9PT0gZS53KSB7XG4gICAgICB2YXIgbm9kZSA9IGcubm9kZShlLnYpO1xuICAgICAgaWYgKCFub2RlLnNlbGZFZGdlcykge1xuICAgICAgICBub2RlLnNlbGZFZGdlcyA9IFtdO1xuICAgICAgfVxuICAgICAgbm9kZS5zZWxmRWRnZXMucHVzaCh7IGU6IGUsIGxhYmVsOiBnLmVkZ2UoZSkgfSk7XG4gICAgICBnLnJlbW92ZUVkZ2UoZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gaW5zZXJ0U2VsZkVkZ2VzKGcpIHtcbiAgdmFyIGxheWVycyA9IHV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtcbiAgXy5mb3JFYWNoKGxheWVycywgZnVuY3Rpb24obGF5ZXIpIHtcbiAgICB2YXIgb3JkZXJTaGlmdCA9IDA7XG4gICAgXy5mb3JFYWNoKGxheWVyLCBmdW5jdGlvbih2LCBpKSB7XG4gICAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICAgIG5vZGUub3JkZXIgPSBpICsgb3JkZXJTaGlmdDtcbiAgICAgIF8uZm9yRWFjaChub2RlLnNlbGZFZGdlcywgZnVuY3Rpb24oc2VsZkVkZ2UpIHtcbiAgICAgICAgdXRpbC5hZGREdW1teU5vZGUoZywgXCJzZWxmZWRnZVwiLCB7XG4gICAgICAgICAgd2lkdGg6IHNlbGZFZGdlLmxhYmVsLndpZHRoLFxuICAgICAgICAgIGhlaWdodDogc2VsZkVkZ2UubGFiZWwuaGVpZ2h0LFxuICAgICAgICAgIHJhbms6IG5vZGUucmFuayxcbiAgICAgICAgICBvcmRlcjogaSArICgrK29yZGVyU2hpZnQpLFxuICAgICAgICAgIGU6IHNlbGZFZGdlLmUsXG4gICAgICAgICAgbGFiZWw6IHNlbGZFZGdlLmxhYmVsXG4gICAgICAgIH0sIFwiX3NlXCIpO1xuICAgICAgfSk7XG4gICAgICBkZWxldGUgbm9kZS5zZWxmRWRnZXM7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwb3NpdGlvblNlbGZFZGdlcyhnKSB7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBpZiAobm9kZS5kdW1teSA9PT0gXCJzZWxmZWRnZVwiKSB7XG4gICAgICB2YXIgc2VsZk5vZGUgPSBnLm5vZGUobm9kZS5lLnYpO1xuICAgICAgdmFyIHggPSBzZWxmTm9kZS54ICsgc2VsZk5vZGUud2lkdGggLyAyO1xuICAgICAgdmFyIHkgPSBzZWxmTm9kZS55O1xuICAgICAgdmFyIGR4ID0gbm9kZS54IC0geDtcbiAgICAgIHZhciBkeSA9IHNlbGZOb2RlLmhlaWdodCAvIDI7XG4gICAgICBnLnNldEVkZ2Uobm9kZS5lLCBub2RlLmxhYmVsKTtcbiAgICAgIGcucmVtb3ZlTm9kZSh2KTtcbiAgICAgIG5vZGUubGFiZWwucG9pbnRzID0gW1xuICAgICAgICB7IHg6IHggKyAyICogZHggLyAzLCB5OiB5IC0gZHkgfSxcbiAgICAgICAgeyB4OiB4ICsgNSAqIGR4IC8gNiwgeTogeSAtIGR5IH0sXG4gICAgICAgIHsgeDogeCArICAgICBkeCAgICAsIHk6IHkgfSxcbiAgICAgICAgeyB4OiB4ICsgNSAqIGR4IC8gNiwgeTogeSArIGR5IH0sXG4gICAgICAgIHsgeDogeCArIDIgKiBkeCAvIDMsIHk6IHkgKyBkeSB9XG4gICAgICBdO1xuICAgICAgbm9kZS5sYWJlbC54ID0gbm9kZS54O1xuICAgICAgbm9kZS5sYWJlbC55ID0gbm9kZS55O1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdE51bWJlckF0dHJzKG9iaiwgYXR0cnMpIHtcbiAgcmV0dXJuIF8ubWFwVmFsdWVzKF8ucGljayhvYmosIGF0dHJzKSwgTnVtYmVyKTtcbn1cblxuZnVuY3Rpb24gY2Fub25pY2FsaXplKGF0dHJzKSB7XG4gIHZhciBuZXdBdHRycyA9IHt9O1xuICBfLmZvckVhY2goYXR0cnMsIGZ1bmN0aW9uKHYsIGspIHtcbiAgICBuZXdBdHRyc1trLnRvTG93ZXJDYXNlKCldID0gdjtcbiAgfSk7XG4gIHJldHVybiBuZXdBdHRycztcbn1cbiIsIi8qIGdsb2JhbCB3aW5kb3cgKi9cblxudmFyIGxvZGFzaDtcblxuaWYgKHR5cGVvZiByZXF1aXJlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgdHJ5IHtcbiAgICBsb2Rhc2ggPSB7XG4gICAgICBjbG9uZURlZXA6IHJlcXVpcmUoXCJsb2Rhc2gvY2xvbmVEZWVwXCIpLFxuICAgICAgY29uc3RhbnQ6IHJlcXVpcmUoXCJsb2Rhc2gvY29uc3RhbnRcIiksXG4gICAgICBkZWZhdWx0czogcmVxdWlyZShcImxvZGFzaC9kZWZhdWx0c1wiKSxcbiAgICAgIGVhY2g6IHJlcXVpcmUoXCJsb2Rhc2gvZWFjaFwiKSxcbiAgICAgIGZpbHRlcjogcmVxdWlyZShcImxvZGFzaC9maWx0ZXJcIiksXG4gICAgICBmaW5kOiByZXF1aXJlKFwibG9kYXNoL2ZpbmRcIiksXG4gICAgICBmbGF0dGVuOiByZXF1aXJlKFwibG9kYXNoL2ZsYXR0ZW5cIiksXG4gICAgICBmb3JFYWNoOiByZXF1aXJlKFwibG9kYXNoL2ZvckVhY2hcIiksXG4gICAgICBmb3JJbjogcmVxdWlyZShcImxvZGFzaC9mb3JJblwiKSxcbiAgICAgIGhhczogIHJlcXVpcmUoXCJsb2Rhc2gvaGFzXCIpLFxuICAgICAgaXNVbmRlZmluZWQ6IHJlcXVpcmUoXCJsb2Rhc2gvaXNVbmRlZmluZWRcIiksXG4gICAgICBsYXN0OiByZXF1aXJlKFwibG9kYXNoL2xhc3RcIiksXG4gICAgICBtYXA6IHJlcXVpcmUoXCJsb2Rhc2gvbWFwXCIpLFxuICAgICAgbWFwVmFsdWVzOiByZXF1aXJlKFwibG9kYXNoL21hcFZhbHVlc1wiKSxcbiAgICAgIG1heDogcmVxdWlyZShcImxvZGFzaC9tYXhcIiksXG4gICAgICBtZXJnZTogcmVxdWlyZShcImxvZGFzaC9tZXJnZVwiKSxcbiAgICAgIG1pbjogcmVxdWlyZShcImxvZGFzaC9taW5cIiksXG4gICAgICBtaW5CeTogcmVxdWlyZShcImxvZGFzaC9taW5CeVwiKSxcbiAgICAgIG5vdzogcmVxdWlyZShcImxvZGFzaC9ub3dcIiksXG4gICAgICBwaWNrOiByZXF1aXJlKFwibG9kYXNoL3BpY2tcIiksXG4gICAgICByYW5nZTogcmVxdWlyZShcImxvZGFzaC9yYW5nZVwiKSxcbiAgICAgIHJlZHVjZTogcmVxdWlyZShcImxvZGFzaC9yZWR1Y2VcIiksXG4gICAgICBzb3J0Qnk6IHJlcXVpcmUoXCJsb2Rhc2gvc29ydEJ5XCIpLFxuICAgICAgdW5pcXVlSWQ6IHJlcXVpcmUoXCJsb2Rhc2gvdW5pcXVlSWRcIiksXG4gICAgICB2YWx1ZXM6IHJlcXVpcmUoXCJsb2Rhc2gvdmFsdWVzXCIpLFxuICAgICAgemlwT2JqZWN0OiByZXF1aXJlKFwibG9kYXNoL3ppcE9iamVjdFwiKSxcbiAgICB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gY29udGludWUgcmVnYXJkbGVzcyBvZiBlcnJvclxuICB9XG59XG5cbmlmICghbG9kYXNoKSB7XG4gIGxvZGFzaCA9IHdpbmRvdy5fO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxvZGFzaDtcbiIsInZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcnVuOiBydW4sXG4gIGNsZWFudXA6IGNsZWFudXBcbn07XG5cbi8qXG4gKiBBIG5lc3RpbmcgZ3JhcGggY3JlYXRlcyBkdW1teSBub2RlcyBmb3IgdGhlIHRvcHMgYW5kIGJvdHRvbXMgb2Ygc3ViZ3JhcGhzLFxuICogYWRkcyBhcHByb3ByaWF0ZSBlZGdlcyB0byBlbnN1cmUgdGhhdCBhbGwgY2x1c3RlciBub2RlcyBhcmUgcGxhY2VkIGJldHdlZW5cbiAqIHRoZXNlIGJvdW5kcmllcywgYW5kIGVuc3VyZXMgdGhhdCB0aGUgZ3JhcGggaXMgY29ubmVjdGVkLlxuICpcbiAqIEluIGFkZGl0aW9uIHdlIGVuc3VyZSwgdGhyb3VnaCB0aGUgdXNlIG9mIHRoZSBtaW5sZW4gcHJvcGVydHksIHRoYXQgbm9kZXNcbiAqIGFuZCBzdWJncmFwaCBib3JkZXIgbm9kZXMgdG8gbm90IGVuZCB1cCBvbiB0aGUgc2FtZSByYW5rLlxuICpcbiAqIFByZWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gSW5wdXQgZ3JhcGggaXMgYSBEQUdcbiAqICAgIDIuIE5vZGVzIGluIHRoZSBpbnB1dCBncmFwaCBoYXMgYSBtaW5sZW4gYXR0cmlidXRlXG4gKlxuICogUG9zdGNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gSW5wdXQgZ3JhcGggaXMgY29ubmVjdGVkLlxuICogICAgMi4gRHVtbXkgbm9kZXMgYXJlIGFkZGVkIGZvciB0aGUgdG9wcyBhbmQgYm90dG9tcyBvZiBzdWJncmFwaHMuXG4gKiAgICAzLiBUaGUgbWlubGVuIGF0dHJpYnV0ZSBmb3Igbm9kZXMgaXMgYWRqdXN0ZWQgdG8gZW5zdXJlIG5vZGVzIGRvIG5vdFxuICogICAgICAgZ2V0IHBsYWNlZCBvbiB0aGUgc2FtZSByYW5rIGFzIHN1YmdyYXBoIGJvcmRlciBub2Rlcy5cbiAqXG4gKiBUaGUgbmVzdGluZyBncmFwaCBpZGVhIGNvbWVzIGZyb20gU2FuZGVyLCBcIkxheW91dCBvZiBDb21wb3VuZCBEaXJlY3RlZFxuICogR3JhcGhzLlwiXG4gKi9cbmZ1bmN0aW9uIHJ1bihnKSB7XG4gIHZhciByb290ID0gdXRpbC5hZGREdW1teU5vZGUoZywgXCJyb290XCIsIHt9LCBcIl9yb290XCIpO1xuICB2YXIgZGVwdGhzID0gdHJlZURlcHRocyhnKTtcbiAgdmFyIGhlaWdodCA9IF8ubWF4KF8udmFsdWVzKGRlcHRocykpIC0gMTsgLy8gTm90ZTogZGVwdGhzIGlzIGFuIE9iamVjdCBub3QgYW4gYXJyYXlcbiAgdmFyIG5vZGVTZXAgPSAyICogaGVpZ2h0ICsgMTtcblxuICBnLmdyYXBoKCkubmVzdGluZ1Jvb3QgPSByb290O1xuXG4gIC8vIE11bHRpcGx5IG1pbmxlbiBieSBub2RlU2VwIHRvIGFsaWduIG5vZGVzIG9uIG5vbi1ib3JkZXIgcmFua3MuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHsgZy5lZGdlKGUpLm1pbmxlbiAqPSBub2RlU2VwOyB9KTtcblxuICAvLyBDYWxjdWxhdGUgYSB3ZWlnaHQgdGhhdCBpcyBzdWZmaWNpZW50IHRvIGtlZXAgc3ViZ3JhcGhzIHZlcnRpY2FsbHkgY29tcGFjdFxuICB2YXIgd2VpZ2h0ID0gc3VtV2VpZ2h0cyhnKSArIDE7XG5cbiAgLy8gQ3JlYXRlIGJvcmRlciBub2RlcyBhbmQgbGluayB0aGVtIHVwXG4gIF8uZm9yRWFjaChnLmNoaWxkcmVuKCksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgZGZzKGcsIHJvb3QsIG5vZGVTZXAsIHdlaWdodCwgaGVpZ2h0LCBkZXB0aHMsIGNoaWxkKTtcbiAgfSk7XG5cbiAgLy8gU2F2ZSB0aGUgbXVsdGlwbGllciBmb3Igbm9kZSBsYXllcnMgZm9yIGxhdGVyIHJlbW92YWwgb2YgZW1wdHkgYm9yZGVyXG4gIC8vIGxheWVycy5cbiAgZy5ncmFwaCgpLm5vZGVSYW5rRmFjdG9yID0gbm9kZVNlcDtcbn1cblxuZnVuY3Rpb24gZGZzKGcsIHJvb3QsIG5vZGVTZXAsIHdlaWdodCwgaGVpZ2h0LCBkZXB0aHMsIHYpIHtcbiAgdmFyIGNoaWxkcmVuID0gZy5jaGlsZHJlbih2KTtcbiAgaWYgKCFjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICBpZiAodiAhPT0gcm9vdCkge1xuICAgICAgZy5zZXRFZGdlKHJvb3QsIHYsIHsgd2VpZ2h0OiAwLCBtaW5sZW46IG5vZGVTZXAgfSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB0b3AgPSB1dGlsLmFkZEJvcmRlck5vZGUoZywgXCJfYnRcIik7XG4gIHZhciBib3R0b20gPSB1dGlsLmFkZEJvcmRlck5vZGUoZywgXCJfYmJcIik7XG4gIHZhciBsYWJlbCA9IGcubm9kZSh2KTtcblxuICBnLnNldFBhcmVudCh0b3AsIHYpO1xuICBsYWJlbC5ib3JkZXJUb3AgPSB0b3A7XG4gIGcuc2V0UGFyZW50KGJvdHRvbSwgdik7XG4gIGxhYmVsLmJvcmRlckJvdHRvbSA9IGJvdHRvbTtcblxuICBfLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgZGZzKGcsIHJvb3QsIG5vZGVTZXAsIHdlaWdodCwgaGVpZ2h0LCBkZXB0aHMsIGNoaWxkKTtcblxuICAgIHZhciBjaGlsZE5vZGUgPSBnLm5vZGUoY2hpbGQpO1xuICAgIHZhciBjaGlsZFRvcCA9IGNoaWxkTm9kZS5ib3JkZXJUb3AgPyBjaGlsZE5vZGUuYm9yZGVyVG9wIDogY2hpbGQ7XG4gICAgdmFyIGNoaWxkQm90dG9tID0gY2hpbGROb2RlLmJvcmRlckJvdHRvbSA/IGNoaWxkTm9kZS5ib3JkZXJCb3R0b20gOiBjaGlsZDtcbiAgICB2YXIgdGhpc1dlaWdodCA9IGNoaWxkTm9kZS5ib3JkZXJUb3AgPyB3ZWlnaHQgOiAyICogd2VpZ2h0O1xuICAgIHZhciBtaW5sZW4gPSBjaGlsZFRvcCAhPT0gY2hpbGRCb3R0b20gPyAxIDogaGVpZ2h0IC0gZGVwdGhzW3ZdICsgMTtcblxuICAgIGcuc2V0RWRnZSh0b3AsIGNoaWxkVG9wLCB7XG4gICAgICB3ZWlnaHQ6IHRoaXNXZWlnaHQsXG4gICAgICBtaW5sZW46IG1pbmxlbixcbiAgICAgIG5lc3RpbmdFZGdlOiB0cnVlXG4gICAgfSk7XG5cbiAgICBnLnNldEVkZ2UoY2hpbGRCb3R0b20sIGJvdHRvbSwge1xuICAgICAgd2VpZ2h0OiB0aGlzV2VpZ2h0LFxuICAgICAgbWlubGVuOiBtaW5sZW4sXG4gICAgICBuZXN0aW5nRWRnZTogdHJ1ZVxuICAgIH0pO1xuICB9KTtcblxuICBpZiAoIWcucGFyZW50KHYpKSB7XG4gICAgZy5zZXRFZGdlKHJvb3QsIHRvcCwgeyB3ZWlnaHQ6IDAsIG1pbmxlbjogaGVpZ2h0ICsgZGVwdGhzW3ZdIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRyZWVEZXB0aHMoZykge1xuICB2YXIgZGVwdGhzID0ge307XG4gIGZ1bmN0aW9uIGRmcyh2LCBkZXB0aCkge1xuICAgIHZhciBjaGlsZHJlbiA9IGcuY2hpbGRyZW4odik7XG4gICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgXy5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICBkZnMoY2hpbGQsIGRlcHRoICsgMSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZGVwdGhzW3ZdID0gZGVwdGg7XG4gIH1cbiAgXy5mb3JFYWNoKGcuY2hpbGRyZW4oKSwgZnVuY3Rpb24odikgeyBkZnModiwgMSk7IH0pO1xuICByZXR1cm4gZGVwdGhzO1xufVxuXG5mdW5jdGlvbiBzdW1XZWlnaHRzKGcpIHtcbiAgcmV0dXJuIF8ucmVkdWNlKGcuZWRnZXMoKSwgZnVuY3Rpb24oYWNjLCBlKSB7XG4gICAgcmV0dXJuIGFjYyArIGcuZWRnZShlKS53ZWlnaHQ7XG4gIH0sIDApO1xufVxuXG5mdW5jdGlvbiBjbGVhbnVwKGcpIHtcbiAgdmFyIGdyYXBoTGFiZWwgPSBnLmdyYXBoKCk7XG4gIGcucmVtb3ZlTm9kZShncmFwaExhYmVsLm5lc3RpbmdSb290KTtcbiAgZGVsZXRlIGdyYXBoTGFiZWwubmVzdGluZ1Jvb3Q7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBpZiAoZWRnZS5uZXN0aW5nRWRnZSkge1xuICAgICAgZy5yZW1vdmVFZGdlKGUpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBydW46IHJ1bixcbiAgdW5kbzogdW5kb1xufTtcblxuLypcbiAqIEJyZWFrcyBhbnkgbG9uZyBlZGdlcyBpbiB0aGUgZ3JhcGggaW50byBzaG9ydCBzZWdtZW50cyB0aGF0IHNwYW4gMSBsYXllclxuICogZWFjaC4gVGhpcyBvcGVyYXRpb24gaXMgdW5kb2FibGUgd2l0aCB0aGUgZGVub3JtYWxpemUgZnVuY3Rpb24uXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gVGhlIGlucHV0IGdyYXBoIGlzIGEgREFHLlxuICogICAgMi4gRWFjaCBub2RlIGluIHRoZSBncmFwaCBoYXMgYSBcInJhbmtcIiBwcm9wZXJ0eS5cbiAqXG4gKiBQb3N0LWNvbmRpdGlvbjpcbiAqXG4gKiAgICAxLiBBbGwgZWRnZXMgaW4gdGhlIGdyYXBoIGhhdmUgYSBsZW5ndGggb2YgMS5cbiAqICAgIDIuIER1bW15IG5vZGVzIGFyZSBhZGRlZCB3aGVyZSBlZGdlcyBoYXZlIGJlZW4gc3BsaXQgaW50byBzZWdtZW50cy5cbiAqICAgIDMuIFRoZSBncmFwaCBpcyBhdWdtZW50ZWQgd2l0aCBhIFwiZHVtbXlDaGFpbnNcIiBhdHRyaWJ1dGUgd2hpY2ggY29udGFpbnNcbiAqICAgICAgIHRoZSBmaXJzdCBkdW1teSBpbiBlYWNoIGNoYWluIG9mIGR1bW15IG5vZGVzIHByb2R1Y2VkLlxuICovXG5mdW5jdGlvbiBydW4oZykge1xuICBnLmdyYXBoKCkuZHVtbXlDaGFpbnMgPSBbXTtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZWRnZSkgeyBub3JtYWxpemVFZGdlKGcsIGVkZ2UpOyB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRWRnZShnLCBlKSB7XG4gIHZhciB2ID0gZS52O1xuICB2YXIgdlJhbmsgPSBnLm5vZGUodikucmFuaztcbiAgdmFyIHcgPSBlLnc7XG4gIHZhciB3UmFuayA9IGcubm9kZSh3KS5yYW5rO1xuICB2YXIgbmFtZSA9IGUubmFtZTtcbiAgdmFyIGVkZ2VMYWJlbCA9IGcuZWRnZShlKTtcbiAgdmFyIGxhYmVsUmFuayA9IGVkZ2VMYWJlbC5sYWJlbFJhbms7XG5cbiAgaWYgKHdSYW5rID09PSB2UmFuayArIDEpIHJldHVybjtcblxuICBnLnJlbW92ZUVkZ2UoZSk7XG5cbiAgdmFyIGR1bW15LCBhdHRycywgaTtcbiAgZm9yIChpID0gMCwgKyt2UmFuazsgdlJhbmsgPCB3UmFuazsgKytpLCArK3ZSYW5rKSB7XG4gICAgZWRnZUxhYmVsLnBvaW50cyA9IFtdO1xuICAgIGF0dHJzID0ge1xuICAgICAgd2lkdGg6IDAsIGhlaWdodDogMCxcbiAgICAgIGVkZ2VMYWJlbDogZWRnZUxhYmVsLCBlZGdlT2JqOiBlLFxuICAgICAgcmFuazogdlJhbmtcbiAgICB9O1xuICAgIGR1bW15ID0gdXRpbC5hZGREdW1teU5vZGUoZywgXCJlZGdlXCIsIGF0dHJzLCBcIl9kXCIpO1xuICAgIGlmICh2UmFuayA9PT0gbGFiZWxSYW5rKSB7XG4gICAgICBhdHRycy53aWR0aCA9IGVkZ2VMYWJlbC53aWR0aDtcbiAgICAgIGF0dHJzLmhlaWdodCA9IGVkZ2VMYWJlbC5oZWlnaHQ7XG4gICAgICBhdHRycy5kdW1teSA9IFwiZWRnZS1sYWJlbFwiO1xuICAgICAgYXR0cnMubGFiZWxwb3MgPSBlZGdlTGFiZWwubGFiZWxwb3M7XG4gICAgfVxuICAgIGcuc2V0RWRnZSh2LCBkdW1teSwgeyB3ZWlnaHQ6IGVkZ2VMYWJlbC53ZWlnaHQgfSwgbmFtZSk7XG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIGcuZ3JhcGgoKS5kdW1teUNoYWlucy5wdXNoKGR1bW15KTtcbiAgICB9XG4gICAgdiA9IGR1bW15O1xuICB9XG5cbiAgZy5zZXRFZGdlKHYsIHcsIHsgd2VpZ2h0OiBlZGdlTGFiZWwud2VpZ2h0IH0sIG5hbWUpO1xufVxuXG5mdW5jdGlvbiB1bmRvKGcpIHtcbiAgXy5mb3JFYWNoKGcuZ3JhcGgoKS5kdW1teUNoYWlucywgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIHZhciBvcmlnTGFiZWwgPSBub2RlLmVkZ2VMYWJlbDtcbiAgICB2YXIgdztcbiAgICBnLnNldEVkZ2Uobm9kZS5lZGdlT2JqLCBvcmlnTGFiZWwpO1xuICAgIHdoaWxlIChub2RlLmR1bW15KSB7XG4gICAgICB3ID0gZy5zdWNjZXNzb3JzKHYpWzBdO1xuICAgICAgZy5yZW1vdmVOb2RlKHYpO1xuICAgICAgb3JpZ0xhYmVsLnBvaW50cy5wdXNoKHsgeDogbm9kZS54LCB5OiBub2RlLnkgfSk7XG4gICAgICBpZiAobm9kZS5kdW1teSA9PT0gXCJlZGdlLWxhYmVsXCIpIHtcbiAgICAgICAgb3JpZ0xhYmVsLnggPSBub2RlLng7XG4gICAgICAgIG9yaWdMYWJlbC55ID0gbm9kZS55O1xuICAgICAgICBvcmlnTGFiZWwud2lkdGggPSBub2RlLndpZHRoO1xuICAgICAgICBvcmlnTGFiZWwuaGVpZ2h0ID0gbm9kZS5oZWlnaHQ7XG4gICAgICB9XG4gICAgICB2ID0gdztcbiAgICAgIG5vZGUgPSBnLm5vZGUodik7XG4gICAgfVxuICB9KTtcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBhZGRTdWJncmFwaENvbnN0cmFpbnRzO1xuXG5mdW5jdGlvbiBhZGRTdWJncmFwaENvbnN0cmFpbnRzKGcsIGNnLCB2cykge1xuICB2YXIgcHJldiA9IHt9LFxuICAgIHJvb3RQcmV2O1xuXG4gIF8uZm9yRWFjaCh2cywgZnVuY3Rpb24odikge1xuICAgIHZhciBjaGlsZCA9IGcucGFyZW50KHYpLFxuICAgICAgcGFyZW50LFxuICAgICAgcHJldkNoaWxkO1xuICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgcGFyZW50ID0gZy5wYXJlbnQoY2hpbGQpO1xuICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICBwcmV2Q2hpbGQgPSBwcmV2W3BhcmVudF07XG4gICAgICAgIHByZXZbcGFyZW50XSA9IGNoaWxkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJldkNoaWxkID0gcm9vdFByZXY7XG4gICAgICAgIHJvb3RQcmV2ID0gY2hpbGQ7XG4gICAgICB9XG4gICAgICBpZiAocHJldkNoaWxkICYmIHByZXZDaGlsZCAhPT0gY2hpbGQpIHtcbiAgICAgICAgY2cuc2V0RWRnZShwcmV2Q2hpbGQsIGNoaWxkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2hpbGQgPSBwYXJlbnQ7XG4gICAgfVxuICB9KTtcblxuICAvKlxuICBmdW5jdGlvbiBkZnModikge1xuICAgIHZhciBjaGlsZHJlbiA9IHYgPyBnLmNoaWxkcmVuKHYpIDogZy5jaGlsZHJlbigpO1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIHZhciBtaW4gPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gICAgICAgICAgc3ViZ3JhcGhzID0gW107XG4gICAgICBfLmVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICAgIHZhciBjaGlsZE1pbiA9IGRmcyhjaGlsZCk7XG4gICAgICAgIGlmIChnLmNoaWxkcmVuKGNoaWxkKS5sZW5ndGgpIHtcbiAgICAgICAgICBzdWJncmFwaHMucHVzaCh7IHY6IGNoaWxkLCBvcmRlcjogY2hpbGRNaW4gfSk7XG4gICAgICAgIH1cbiAgICAgICAgbWluID0gTWF0aC5taW4obWluLCBjaGlsZE1pbik7XG4gICAgICB9KTtcbiAgICAgIF8ucmVkdWNlKF8uc29ydEJ5KHN1YmdyYXBocywgXCJvcmRlclwiKSwgZnVuY3Rpb24ocHJldiwgY3Vycikge1xuICAgICAgICBjZy5zZXRFZGdlKHByZXYudiwgY3Vyci52KTtcbiAgICAgICAgcmV0dXJuIGN1cnI7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBtaW47XG4gICAgfVxuICAgIHJldHVybiBnLm5vZGUodikub3JkZXI7XG4gIH1cbiAgZGZzKHVuZGVmaW5lZCk7XG4gICovXG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gYmFyeWNlbnRlcjtcblxuZnVuY3Rpb24gYmFyeWNlbnRlcihnLCBtb3ZhYmxlKSB7XG4gIHJldHVybiBfLm1hcChtb3ZhYmxlLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIGluViA9IGcuaW5FZGdlcyh2KTtcbiAgICBpZiAoIWluVi5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7IHY6IHYgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJlc3VsdCA9IF8ucmVkdWNlKGluViwgZnVuY3Rpb24oYWNjLCBlKSB7XG4gICAgICAgIHZhciBlZGdlID0gZy5lZGdlKGUpLFxuICAgICAgICAgIG5vZGVVID0gZy5ub2RlKGUudik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VtOiBhY2Muc3VtICsgKGVkZ2Uud2VpZ2h0ICogbm9kZVUub3JkZXIpLFxuICAgICAgICAgIHdlaWdodDogYWNjLndlaWdodCArIGVkZ2Uud2VpZ2h0XG4gICAgICAgIH07XG4gICAgICB9LCB7IHN1bTogMCwgd2VpZ2h0OiAwIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB2OiB2LFxuICAgICAgICBiYXJ5Y2VudGVyOiByZXN1bHQuc3VtIC8gcmVzdWx0LndlaWdodCxcbiAgICAgICAgd2VpZ2h0OiByZXN1bHQud2VpZ2h0XG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59XG5cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuLi9ncmFwaGxpYlwiKS5HcmFwaDtcblxubW9kdWxlLmV4cG9ydHMgPSBidWlsZExheWVyR3JhcGg7XG5cbi8qXG4gKiBDb25zdHJ1Y3RzIGEgZ3JhcGggdGhhdCBjYW4gYmUgdXNlZCB0byBzb3J0IGEgbGF5ZXIgb2Ygbm9kZXMuIFRoZSBncmFwaCB3aWxsXG4gKiBjb250YWluIGFsbCBiYXNlIGFuZCBzdWJncmFwaCBub2RlcyBmcm9tIHRoZSByZXF1ZXN0IGxheWVyIGluIHRoZWlyIG9yaWdpbmFsXG4gKiBoaWVyYXJjaHkgYW5kIGFueSBlZGdlcyB0aGF0IGFyZSBpbmNpZGVudCBvbiB0aGVzZSBub2RlcyBhbmQgYXJlIG9mIHRoZSB0eXBlXG4gKiByZXF1ZXN0ZWQgYnkgdGhlIFwicmVsYXRpb25zaGlwXCIgcGFyYW1ldGVyLlxuICpcbiAqIE5vZGVzIGZyb20gdGhlIHJlcXVlc3RlZCByYW5rIHRoYXQgZG8gbm90IGhhdmUgcGFyZW50cyBhcmUgYXNzaWduZWQgYSByb290XG4gKiBub2RlIGluIHRoZSBvdXRwdXQgZ3JhcGgsIHdoaWNoIGlzIHNldCBpbiB0aGUgcm9vdCBncmFwaCBhdHRyaWJ1dGUuIFRoaXNcbiAqIG1ha2VzIGl0IGVhc3kgdG8gd2FsayB0aGUgaGllcmFyY2h5IG9mIG1vdmFibGUgbm9kZXMgZHVyaW5nIG9yZGVyaW5nLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIElucHV0IGdyYXBoIGlzIGEgREFHXG4gKiAgICAyLiBCYXNlIG5vZGVzIGluIHRoZSBpbnB1dCBncmFwaCBoYXZlIGEgcmFuayBhdHRyaWJ1dGVcbiAqICAgIDMuIFN1YmdyYXBoIG5vZGVzIGluIHRoZSBpbnB1dCBncmFwaCBoYXMgbWluUmFuayBhbmQgbWF4UmFuayBhdHRyaWJ1dGVzXG4gKiAgICA0LiBFZGdlcyBoYXZlIGFuIGFzc2lnbmVkIHdlaWdodFxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBPdXRwdXQgZ3JhcGggaGFzIGFsbCBub2RlcyBpbiB0aGUgbW92YWJsZSByYW5rIHdpdGggcHJlc2VydmVkXG4gKiAgICAgICBoaWVyYXJjaHkuXG4gKiAgICAyLiBSb290IG5vZGVzIGluIHRoZSBtb3ZhYmxlIGxheWVyIGFyZSBtYWRlIGNoaWxkcmVuIG9mIHRoZSBub2RlXG4gKiAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIHJvb3QgYXR0cmlidXRlIG9mIHRoZSBncmFwaC5cbiAqICAgIDMuIE5vbi1tb3ZhYmxlIG5vZGVzIGluY2lkZW50IG9uIG1vdmFibGUgbm9kZXMsIHNlbGVjdGVkIGJ5IHRoZVxuICogICAgICAgcmVsYXRpb25zaGlwIHBhcmFtZXRlciwgYXJlIGluY2x1ZGVkIGluIHRoZSBncmFwaCAod2l0aG91dCBoaWVyYXJjaHkpLlxuICogICAgNC4gRWRnZXMgaW5jaWRlbnQgb24gbW92YWJsZSBub2Rlcywgc2VsZWN0ZWQgYnkgdGhlIHJlbGF0aW9uc2hpcFxuICogICAgICAgcGFyYW1ldGVyLCBhcmUgYWRkZWQgdG8gdGhlIG91dHB1dCBncmFwaC5cbiAqICAgIDUuIFRoZSB3ZWlnaHRzIGZvciBjb3BpZWQgZWRnZXMgYXJlIGFnZ3JlZ2F0ZWQgYXMgbmVlZCwgc2luY2UgdGhlIG91dHB1dFxuICogICAgICAgZ3JhcGggaXMgbm90IGEgbXVsdGktZ3JhcGguXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkTGF5ZXJHcmFwaChnLCByYW5rLCByZWxhdGlvbnNoaXApIHtcbiAgdmFyIHJvb3QgPSBjcmVhdGVSb290Tm9kZShnKSxcbiAgICByZXN1bHQgPSBuZXcgR3JhcGgoeyBjb21wb3VuZDogdHJ1ZSB9KS5zZXRHcmFwaCh7IHJvb3Q6IHJvb3QgfSlcbiAgICAgIC5zZXREZWZhdWx0Tm9kZUxhYmVsKGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KTsgfSk7XG5cbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpLFxuICAgICAgcGFyZW50ID0gZy5wYXJlbnQodik7XG5cbiAgICBpZiAobm9kZS5yYW5rID09PSByYW5rIHx8IG5vZGUubWluUmFuayA8PSByYW5rICYmIHJhbmsgPD0gbm9kZS5tYXhSYW5rKSB7XG4gICAgICByZXN1bHQuc2V0Tm9kZSh2KTtcbiAgICAgIHJlc3VsdC5zZXRQYXJlbnQodiwgcGFyZW50IHx8IHJvb3QpO1xuXG4gICAgICAvLyBUaGlzIGFzc3VtZXMgd2UgaGF2ZSBvbmx5IHNob3J0IGVkZ2VzIVxuICAgICAgXy5mb3JFYWNoKGdbcmVsYXRpb25zaGlwXSh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgICB2YXIgdSA9IGUudiA9PT0gdiA/IGUudyA6IGUudixcbiAgICAgICAgICBlZGdlID0gcmVzdWx0LmVkZ2UodSwgdiksXG4gICAgICAgICAgd2VpZ2h0ID0gIV8uaXNVbmRlZmluZWQoZWRnZSkgPyBlZGdlLndlaWdodCA6IDA7XG4gICAgICAgIHJlc3VsdC5zZXRFZGdlKHUsIHYsIHsgd2VpZ2h0OiBnLmVkZ2UoZSkud2VpZ2h0ICsgd2VpZ2h0IH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChfLmhhcyhub2RlLCBcIm1pblJhbmtcIikpIHtcbiAgICAgICAgcmVzdWx0LnNldE5vZGUodiwge1xuICAgICAgICAgIGJvcmRlckxlZnQ6IG5vZGUuYm9yZGVyTGVmdFtyYW5rXSxcbiAgICAgICAgICBib3JkZXJSaWdodDogbm9kZS5ib3JkZXJSaWdodFtyYW5rXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvb3ROb2RlKGcpIHtcbiAgdmFyIHY7XG4gIHdoaWxlIChnLmhhc05vZGUoKHYgPSBfLnVuaXF1ZUlkKFwiX3Jvb3RcIikpKSk7XG4gIHJldHVybiB2O1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjcm9zc0NvdW50O1xuXG4vKlxuICogQSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgbGF5ZXJpbmcgKGFuIGFycmF5IG9mIGxheWVycywgZWFjaCB3aXRoIGFuIGFycmF5IG9mXG4gKiBvcmRlcmVyZCBub2RlcykgYW5kIGEgZ3JhcGggYW5kIHJldHVybnMgYSB3ZWlnaHRlZCBjcm9zc2luZyBjb3VudC5cbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBJbnB1dCBncmFwaCBtdXN0IGJlIHNpbXBsZSAobm90IGEgbXVsdGlncmFwaCksIGRpcmVjdGVkLCBhbmQgaW5jbHVkZVxuICogICAgICAgb25seSBzaW1wbGUgZWRnZXMuXG4gKiAgICAyLiBFZGdlcyBpbiB0aGUgaW5wdXQgZ3JhcGggbXVzdCBoYXZlIGFzc2lnbmVkIHdlaWdodHMuXG4gKlxuICogUG9zdC1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIFRoZSBncmFwaCBhbmQgbGF5ZXJpbmcgbWF0cml4IGFyZSBsZWZ0IHVuY2hhbmdlZC5cbiAqXG4gKiBUaGlzIGFsZ29yaXRobSBpcyBkZXJpdmVkIGZyb20gQmFydGgsIGV0IGFsLiwgXCJCaWxheWVyIENyb3NzIENvdW50aW5nLlwiXG4gKi9cbmZ1bmN0aW9uIGNyb3NzQ291bnQoZywgbGF5ZXJpbmcpIHtcbiAgdmFyIGNjID0gMDtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBsYXllcmluZy5sZW5ndGg7ICsraSkge1xuICAgIGNjICs9IHR3b0xheWVyQ3Jvc3NDb3VudChnLCBsYXllcmluZ1tpLTFdLCBsYXllcmluZ1tpXSk7XG4gIH1cbiAgcmV0dXJuIGNjO1xufVxuXG5mdW5jdGlvbiB0d29MYXllckNyb3NzQ291bnQoZywgbm9ydGhMYXllciwgc291dGhMYXllcikge1xuICAvLyBTb3J0IGFsbCBvZiB0aGUgZWRnZXMgYmV0d2VlbiB0aGUgbm9ydGggYW5kIHNvdXRoIGxheWVycyBieSB0aGVpciBwb3NpdGlvblxuICAvLyBpbiB0aGUgbm9ydGggbGF5ZXIgYW5kIHRoZW4gdGhlIHNvdXRoLiBNYXAgdGhlc2UgZWRnZXMgdG8gdGhlIHBvc2l0aW9uIG9mXG4gIC8vIHRoZWlyIGhlYWQgaW4gdGhlIHNvdXRoIGxheWVyLlxuICB2YXIgc291dGhQb3MgPSBfLnppcE9iamVjdChzb3V0aExheWVyLFxuICAgIF8ubWFwKHNvdXRoTGF5ZXIsIGZ1bmN0aW9uICh2LCBpKSB7IHJldHVybiBpOyB9KSk7XG4gIHZhciBzb3V0aEVudHJpZXMgPSBfLmZsYXR0ZW4oXy5tYXAobm9ydGhMYXllciwgZnVuY3Rpb24odikge1xuICAgIHJldHVybiBfLnNvcnRCeShfLm1hcChnLm91dEVkZ2VzKHYpLCBmdW5jdGlvbihlKSB7XG4gICAgICByZXR1cm4geyBwb3M6IHNvdXRoUG9zW2Uud10sIHdlaWdodDogZy5lZGdlKGUpLndlaWdodCB9O1xuICAgIH0pLCBcInBvc1wiKTtcbiAgfSksIHRydWUpO1xuXG4gIC8vIEJ1aWxkIHRoZSBhY2N1bXVsYXRvciB0cmVlXG4gIHZhciBmaXJzdEluZGV4ID0gMTtcbiAgd2hpbGUgKGZpcnN0SW5kZXggPCBzb3V0aExheWVyLmxlbmd0aCkgZmlyc3RJbmRleCA8PD0gMTtcbiAgdmFyIHRyZWVTaXplID0gMiAqIGZpcnN0SW5kZXggLSAxO1xuICBmaXJzdEluZGV4IC09IDE7XG4gIHZhciB0cmVlID0gXy5tYXAobmV3IEFycmF5KHRyZWVTaXplKSwgZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9KTtcblxuICAvLyBDYWxjdWxhdGUgdGhlIHdlaWdodGVkIGNyb3NzaW5nc1xuICB2YXIgY2MgPSAwO1xuICBfLmZvckVhY2goc291dGhFbnRyaWVzLmZvckVhY2goZnVuY3Rpb24oZW50cnkpIHtcbiAgICB2YXIgaW5kZXggPSBlbnRyeS5wb3MgKyBmaXJzdEluZGV4O1xuICAgIHRyZWVbaW5kZXhdICs9IGVudHJ5LndlaWdodDtcbiAgICB2YXIgd2VpZ2h0U3VtID0gMDtcbiAgICB3aGlsZSAoaW5kZXggPiAwKSB7XG4gICAgICBpZiAoaW5kZXggJSAyKSB7XG4gICAgICAgIHdlaWdodFN1bSArPSB0cmVlW2luZGV4ICsgMV07XG4gICAgICB9XG4gICAgICBpbmRleCA9IChpbmRleCAtIDEpID4+IDE7XG4gICAgICB0cmVlW2luZGV4XSArPSBlbnRyeS53ZWlnaHQ7XG4gICAgfVxuICAgIGNjICs9IGVudHJ5LndlaWdodCAqIHdlaWdodFN1bTtcbiAgfSkpO1xuXG4gIHJldHVybiBjYztcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgaW5pdE9yZGVyID0gcmVxdWlyZShcIi4vaW5pdC1vcmRlclwiKTtcbnZhciBjcm9zc0NvdW50ID0gcmVxdWlyZShcIi4vY3Jvc3MtY291bnRcIik7XG52YXIgc29ydFN1YmdyYXBoID0gcmVxdWlyZShcIi4vc29ydC1zdWJncmFwaFwiKTtcbnZhciBidWlsZExheWVyR3JhcGggPSByZXF1aXJlKFwiLi9idWlsZC1sYXllci1ncmFwaFwiKTtcbnZhciBhZGRTdWJncmFwaENvbnN0cmFpbnRzID0gcmVxdWlyZShcIi4vYWRkLXN1YmdyYXBoLWNvbnN0cmFpbnRzXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4uL2dyYXBobGliXCIpLkdyYXBoO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBvcmRlcjtcblxuLypcbiAqIEFwcGxpZXMgaGV1cmlzdGljcyB0byBtaW5pbWl6ZSBlZGdlIGNyb3NzaW5ncyBpbiB0aGUgZ3JhcGggYW5kIHNldHMgdGhlIGJlc3RcbiAqIG9yZGVyIHNvbHV0aW9uIGFzIGFuIG9yZGVyIGF0dHJpYnV0ZSBvbiBlYWNoIG5vZGUuXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gR3JhcGggbXVzdCBiZSBEQUdcbiAqICAgIDIuIEdyYXBoIG5vZGVzIG11c3QgYmUgb2JqZWN0cyB3aXRoIGEgXCJyYW5rXCIgYXR0cmlidXRlXG4gKiAgICAzLiBHcmFwaCBlZGdlcyBtdXN0IGhhdmUgdGhlIFwid2VpZ2h0XCIgYXR0cmlidXRlXG4gKlxuICogUG9zdC1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEdyYXBoIG5vZGVzIHdpbGwgaGF2ZSBhbiBcIm9yZGVyXCIgYXR0cmlidXRlIGJhc2VkIG9uIHRoZSByZXN1bHRzIG9mIHRoZVxuICogICAgICAgYWxnb3JpdGhtLlxuICovXG5mdW5jdGlvbiBvcmRlcihnKSB7XG4gIHZhciBtYXhSYW5rID0gdXRpbC5tYXhSYW5rKGcpLFxuICAgIGRvd25MYXllckdyYXBocyA9IGJ1aWxkTGF5ZXJHcmFwaHMoZywgXy5yYW5nZSgxLCBtYXhSYW5rICsgMSksIFwiaW5FZGdlc1wiKSxcbiAgICB1cExheWVyR3JhcGhzID0gYnVpbGRMYXllckdyYXBocyhnLCBfLnJhbmdlKG1heFJhbmsgLSAxLCAtMSwgLTEpLCBcIm91dEVkZ2VzXCIpO1xuXG4gIHZhciBsYXllcmluZyA9IGluaXRPcmRlcihnKTtcbiAgYXNzaWduT3JkZXIoZywgbGF5ZXJpbmcpO1xuXG4gIHZhciBiZXN0Q0MgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gICAgYmVzdDtcblxuICBmb3IgKHZhciBpID0gMCwgbGFzdEJlc3QgPSAwOyBsYXN0QmVzdCA8IDQ7ICsraSwgKytsYXN0QmVzdCkge1xuICAgIHN3ZWVwTGF5ZXJHcmFwaHMoaSAlIDIgPyBkb3duTGF5ZXJHcmFwaHMgOiB1cExheWVyR3JhcGhzLCBpICUgNCA+PSAyKTtcblxuICAgIGxheWVyaW5nID0gdXRpbC5idWlsZExheWVyTWF0cml4KGcpO1xuICAgIHZhciBjYyA9IGNyb3NzQ291bnQoZywgbGF5ZXJpbmcpO1xuICAgIGlmIChjYyA8IGJlc3RDQykge1xuICAgICAgbGFzdEJlc3QgPSAwO1xuICAgICAgYmVzdCA9IF8uY2xvbmVEZWVwKGxheWVyaW5nKTtcbiAgICAgIGJlc3RDQyA9IGNjO1xuICAgIH1cbiAgfVxuXG4gIGFzc2lnbk9yZGVyKGcsIGJlc3QpO1xufVxuXG5mdW5jdGlvbiBidWlsZExheWVyR3JhcGhzKGcsIHJhbmtzLCByZWxhdGlvbnNoaXApIHtcbiAgcmV0dXJuIF8ubWFwKHJhbmtzLCBmdW5jdGlvbihyYW5rKSB7XG4gICAgcmV0dXJuIGJ1aWxkTGF5ZXJHcmFwaChnLCByYW5rLCByZWxhdGlvbnNoaXApO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gc3dlZXBMYXllckdyYXBocyhsYXllckdyYXBocywgYmlhc1JpZ2h0KSB7XG4gIHZhciBjZyA9IG5ldyBHcmFwaCgpO1xuICBfLmZvckVhY2gobGF5ZXJHcmFwaHMsIGZ1bmN0aW9uKGxnKSB7XG4gICAgdmFyIHJvb3QgPSBsZy5ncmFwaCgpLnJvb3Q7XG4gICAgdmFyIHNvcnRlZCA9IHNvcnRTdWJncmFwaChsZywgcm9vdCwgY2csIGJpYXNSaWdodCk7XG4gICAgXy5mb3JFYWNoKHNvcnRlZC52cywgZnVuY3Rpb24odiwgaSkge1xuICAgICAgbGcubm9kZSh2KS5vcmRlciA9IGk7XG4gICAgfSk7XG4gICAgYWRkU3ViZ3JhcGhDb25zdHJhaW50cyhsZywgY2csIHNvcnRlZC52cyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25PcmRlcihnLCBsYXllcmluZykge1xuICBfLmZvckVhY2gobGF5ZXJpbmcsIGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgXy5mb3JFYWNoKGxheWVyLCBmdW5jdGlvbih2LCBpKSB7XG4gICAgICBnLm5vZGUodikub3JkZXIgPSBpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdE9yZGVyO1xuXG4vKlxuICogQXNzaWducyBhbiBpbml0aWFsIG9yZGVyIHZhbHVlIGZvciBlYWNoIG5vZGUgYnkgcGVyZm9ybWluZyBhIERGUyBzZWFyY2hcbiAqIHN0YXJ0aW5nIGZyb20gbm9kZXMgaW4gdGhlIGZpcnN0IHJhbmsuIE5vZGVzIGFyZSBhc3NpZ25lZCBhbiBvcmRlciBpbiB0aGVpclxuICogcmFuayBhcyB0aGV5IGFyZSBmaXJzdCB2aXNpdGVkLlxuICpcbiAqIFRoaXMgYXBwcm9hY2ggY29tZXMgZnJvbSBHYW5zbmVyLCBldCBhbC4sIFwiQSBUZWNobmlxdWUgZm9yIERyYXdpbmcgRGlyZWN0ZWRcbiAqIEdyYXBocy5cIlxuICpcbiAqIFJldHVybnMgYSBsYXllcmluZyBtYXRyaXggd2l0aCBhbiBhcnJheSBwZXIgbGF5ZXIgYW5kIGVhY2ggbGF5ZXIgc29ydGVkIGJ5XG4gKiB0aGUgb3JkZXIgb2YgaXRzIG5vZGVzLlxuICovXG5mdW5jdGlvbiBpbml0T3JkZXIoZykge1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuICB2YXIgc2ltcGxlTm9kZXMgPSBfLmZpbHRlcihnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICByZXR1cm4gIWcuY2hpbGRyZW4odikubGVuZ3RoO1xuICB9KTtcbiAgdmFyIG1heFJhbmsgPSBfLm1heChfLm1hcChzaW1wbGVOb2RlcywgZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpLnJhbms7IH0pKTtcbiAgdmFyIGxheWVycyA9IF8ubWFwKF8ucmFuZ2UobWF4UmFuayArIDEpLCBmdW5jdGlvbigpIHsgcmV0dXJuIFtdOyB9KTtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIGlmIChfLmhhcyh2aXNpdGVkLCB2KSkgcmV0dXJuO1xuICAgIHZpc2l0ZWRbdl0gPSB0cnVlO1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIGxheWVyc1tub2RlLnJhbmtdLnB1c2godik7XG4gICAgXy5mb3JFYWNoKGcuc3VjY2Vzc29ycyh2KSwgZGZzKTtcbiAgfVxuXG4gIHZhciBvcmRlcmVkVnMgPSBfLnNvcnRCeShzaW1wbGVOb2RlcywgZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpLnJhbms7IH0pO1xuICBfLmZvckVhY2gob3JkZXJlZFZzLCBkZnMpO1xuXG4gIHJldHVybiBsYXllcnM7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlc29sdmVDb25mbGljdHM7XG5cbi8qXG4gKiBHaXZlbiBhIGxpc3Qgb2YgZW50cmllcyBvZiB0aGUgZm9ybSB7diwgYmFyeWNlbnRlciwgd2VpZ2h0fSBhbmQgYVxuICogY29uc3RyYWludCBncmFwaCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmVzb2x2ZSBhbnkgY29uZmxpY3RzIGJldHdlZW4gdGhlXG4gKiBjb25zdHJhaW50IGdyYXBoIGFuZCB0aGUgYmFyeWNlbnRlcnMgZm9yIHRoZSBlbnRyaWVzLiBJZiB0aGUgYmFyeWNlbnRlcnMgZm9yXG4gKiBhbiBlbnRyeSB3b3VsZCB2aW9sYXRlIGEgY29uc3RyYWludCBpbiB0aGUgY29uc3RyYWludCBncmFwaCB0aGVuIHdlIGNvYWxlc2NlXG4gKiB0aGUgbm9kZXMgaW4gdGhlIGNvbmZsaWN0IGludG8gYSBuZXcgbm9kZSB0aGF0IHJlc3BlY3RzIHRoZSBjb250cmFpbnQgYW5kXG4gKiBhZ2dyZWdhdGVzIGJhcnljZW50ZXIgYW5kIHdlaWdodCBpbmZvcm1hdGlvbi5cbiAqXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBkZXNjcmlwdGlvbiBpbiBGb3JzdGVyLCBcIkEgRmFzdCBhbmRcbiAqIFNpbXBsZSBIdWVyaXN0aWMgZm9yIENvbnN0cmFpbmVkIFR3by1MZXZlbCBDcm9zc2luZyBSZWR1Y3Rpb24sXCIgdGhvdWdodCBpdFxuICogZGlmZmVycyBpbiBzb21lIHNwZWNpZmljIGRldGFpbHMuXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gRWFjaCBlbnRyeSBoYXMgdGhlIGZvcm0ge3YsIGJhcnljZW50ZXIsIHdlaWdodH0sIG9yIGlmIHRoZSBub2RlIGhhc1xuICogICAgICAgbm8gYmFyeWNlbnRlciwgdGhlbiB7dn0uXG4gKlxuICogUmV0dXJuczpcbiAqXG4gKiAgICBBIG5ldyBsaXN0IG9mIGVudHJpZXMgb2YgdGhlIGZvcm0ge3ZzLCBpLCBiYXJ5Y2VudGVyLCB3ZWlnaHR9LiBUaGUgbGlzdFxuICogICAgYHZzYCBtYXkgZWl0aGVyIGJlIGEgc2luZ2xldG9uIG9yIGl0IG1heSBiZSBhbiBhZ2dyZWdhdGlvbiBvZiBub2Rlc1xuICogICAgb3JkZXJlZCBzdWNoIHRoYXQgdGhleSBkbyBub3QgdmlvbGF0ZSBjb25zdHJhaW50cyBmcm9tIHRoZSBjb25zdHJhaW50XG4gKiAgICBncmFwaC4gVGhlIHByb3BlcnR5IGBpYCBpcyB0aGUgbG93ZXN0IG9yaWdpbmFsIGluZGV4IG9mIGFueSBvZiB0aGVcbiAqICAgIGVsZW1lbnRzIGluIGB2c2AuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVDb25mbGljdHMoZW50cmllcywgY2cpIHtcbiAgdmFyIG1hcHBlZEVudHJpZXMgPSB7fTtcbiAgXy5mb3JFYWNoKGVudHJpZXMsIGZ1bmN0aW9uKGVudHJ5LCBpKSB7XG4gICAgdmFyIHRtcCA9IG1hcHBlZEVudHJpZXNbZW50cnkudl0gPSB7XG4gICAgICBpbmRlZ3JlZTogMCxcbiAgICAgIFwiaW5cIjogW10sXG4gICAgICBvdXQ6IFtdLFxuICAgICAgdnM6IFtlbnRyeS52XSxcbiAgICAgIGk6IGlcbiAgICB9O1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChlbnRyeS5iYXJ5Y2VudGVyKSkge1xuICAgICAgdG1wLmJhcnljZW50ZXIgPSBlbnRyeS5iYXJ5Y2VudGVyO1xuICAgICAgdG1wLndlaWdodCA9IGVudHJ5LndlaWdodDtcbiAgICB9XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChjZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVudHJ5ViA9IG1hcHBlZEVudHJpZXNbZS52XTtcbiAgICB2YXIgZW50cnlXID0gbWFwcGVkRW50cmllc1tlLnddO1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChlbnRyeVYpICYmICFfLmlzVW5kZWZpbmVkKGVudHJ5VykpIHtcbiAgICAgIGVudHJ5Vy5pbmRlZ3JlZSsrO1xuICAgICAgZW50cnlWLm91dC5wdXNoKG1hcHBlZEVudHJpZXNbZS53XSk7XG4gICAgfVxuICB9KTtcblxuICB2YXIgc291cmNlU2V0ID0gXy5maWx0ZXIobWFwcGVkRW50cmllcywgZnVuY3Rpb24oZW50cnkpIHtcbiAgICByZXR1cm4gIWVudHJ5LmluZGVncmVlO1xuICB9KTtcblxuICByZXR1cm4gZG9SZXNvbHZlQ29uZmxpY3RzKHNvdXJjZVNldCk7XG59XG5cbmZ1bmN0aW9uIGRvUmVzb2x2ZUNvbmZsaWN0cyhzb3VyY2VTZXQpIHtcbiAgdmFyIGVudHJpZXMgPSBbXTtcblxuICBmdW5jdGlvbiBoYW5kbGVJbih2RW50cnkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odUVudHJ5KSB7XG4gICAgICBpZiAodUVudHJ5Lm1lcmdlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoXy5pc1VuZGVmaW5lZCh1RW50cnkuYmFyeWNlbnRlcikgfHxcbiAgICAgICAgICBfLmlzVW5kZWZpbmVkKHZFbnRyeS5iYXJ5Y2VudGVyKSB8fFxuICAgICAgICAgIHVFbnRyeS5iYXJ5Y2VudGVyID49IHZFbnRyeS5iYXJ5Y2VudGVyKSB7XG4gICAgICAgIG1lcmdlRW50cmllcyh2RW50cnksIHVFbnRyeSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZU91dCh2RW50cnkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24od0VudHJ5KSB7XG4gICAgICB3RW50cnlbXCJpblwiXS5wdXNoKHZFbnRyeSk7XG4gICAgICBpZiAoLS13RW50cnkuaW5kZWdyZWUgPT09IDApIHtcbiAgICAgICAgc291cmNlU2V0LnB1c2god0VudHJ5KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgd2hpbGUgKHNvdXJjZVNldC5sZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBzb3VyY2VTZXQucG9wKCk7XG4gICAgZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICBfLmZvckVhY2goZW50cnlbXCJpblwiXS5yZXZlcnNlKCksIGhhbmRsZUluKGVudHJ5KSk7XG4gICAgXy5mb3JFYWNoKGVudHJ5Lm91dCwgaGFuZGxlT3V0KGVudHJ5KSk7XG4gIH1cblxuICByZXR1cm4gXy5tYXAoXy5maWx0ZXIoZW50cmllcywgZnVuY3Rpb24oZW50cnkpIHsgcmV0dXJuICFlbnRyeS5tZXJnZWQ7IH0pLFxuICAgIGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgICByZXR1cm4gXy5waWNrKGVudHJ5LCBbXCJ2c1wiLCBcImlcIiwgXCJiYXJ5Y2VudGVyXCIsIFwid2VpZ2h0XCJdKTtcbiAgICB9KTtcblxufVxuXG5mdW5jdGlvbiBtZXJnZUVudHJpZXModGFyZ2V0LCBzb3VyY2UpIHtcbiAgdmFyIHN1bSA9IDA7XG4gIHZhciB3ZWlnaHQgPSAwO1xuXG4gIGlmICh0YXJnZXQud2VpZ2h0KSB7XG4gICAgc3VtICs9IHRhcmdldC5iYXJ5Y2VudGVyICogdGFyZ2V0LndlaWdodDtcbiAgICB3ZWlnaHQgKz0gdGFyZ2V0LndlaWdodDtcbiAgfVxuXG4gIGlmIChzb3VyY2Uud2VpZ2h0KSB7XG4gICAgc3VtICs9IHNvdXJjZS5iYXJ5Y2VudGVyICogc291cmNlLndlaWdodDtcbiAgICB3ZWlnaHQgKz0gc291cmNlLndlaWdodDtcbiAgfVxuXG4gIHRhcmdldC52cyA9IHNvdXJjZS52cy5jb25jYXQodGFyZ2V0LnZzKTtcbiAgdGFyZ2V0LmJhcnljZW50ZXIgPSBzdW0gLyB3ZWlnaHQ7XG4gIHRhcmdldC53ZWlnaHQgPSB3ZWlnaHQ7XG4gIHRhcmdldC5pID0gTWF0aC5taW4oc291cmNlLmksIHRhcmdldC5pKTtcbiAgc291cmNlLm1lcmdlZCA9IHRydWU7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgYmFyeWNlbnRlciA9IHJlcXVpcmUoXCIuL2JhcnljZW50ZXJcIik7XG52YXIgcmVzb2x2ZUNvbmZsaWN0cyA9IHJlcXVpcmUoXCIuL3Jlc29sdmUtY29uZmxpY3RzXCIpO1xudmFyIHNvcnQgPSByZXF1aXJlKFwiLi9zb3J0XCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNvcnRTdWJncmFwaDtcblxuZnVuY3Rpb24gc29ydFN1YmdyYXBoKGcsIHYsIGNnLCBiaWFzUmlnaHQpIHtcbiAgdmFyIG1vdmFibGUgPSBnLmNoaWxkcmVuKHYpO1xuICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgdmFyIGJsID0gbm9kZSA/IG5vZGUuYm9yZGVyTGVmdCA6IHVuZGVmaW5lZDtcbiAgdmFyIGJyID0gbm9kZSA/IG5vZGUuYm9yZGVyUmlnaHQ6IHVuZGVmaW5lZDtcbiAgdmFyIHN1YmdyYXBocyA9IHt9O1xuXG4gIGlmIChibCkge1xuICAgIG1vdmFibGUgPSBfLmZpbHRlcihtb3ZhYmxlLCBmdW5jdGlvbih3KSB7XG4gICAgICByZXR1cm4gdyAhPT0gYmwgJiYgdyAhPT0gYnI7XG4gICAgfSk7XG4gIH1cblxuICB2YXIgYmFyeWNlbnRlcnMgPSBiYXJ5Y2VudGVyKGcsIG1vdmFibGUpO1xuICBfLmZvckVhY2goYmFyeWNlbnRlcnMsIGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgaWYgKGcuY2hpbGRyZW4oZW50cnkudikubGVuZ3RoKSB7XG4gICAgICB2YXIgc3ViZ3JhcGhSZXN1bHQgPSBzb3J0U3ViZ3JhcGgoZywgZW50cnkudiwgY2csIGJpYXNSaWdodCk7XG4gICAgICBzdWJncmFwaHNbZW50cnkudl0gPSBzdWJncmFwaFJlc3VsdDtcbiAgICAgIGlmIChfLmhhcyhzdWJncmFwaFJlc3VsdCwgXCJiYXJ5Y2VudGVyXCIpKSB7XG4gICAgICAgIG1lcmdlQmFyeWNlbnRlcnMoZW50cnksIHN1YmdyYXBoUmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHZhciBlbnRyaWVzID0gcmVzb2x2ZUNvbmZsaWN0cyhiYXJ5Y2VudGVycywgY2cpO1xuICBleHBhbmRTdWJncmFwaHMoZW50cmllcywgc3ViZ3JhcGhzKTtcblxuICB2YXIgcmVzdWx0ID0gc29ydChlbnRyaWVzLCBiaWFzUmlnaHQpO1xuXG4gIGlmIChibCkge1xuICAgIHJlc3VsdC52cyA9IF8uZmxhdHRlbihbYmwsIHJlc3VsdC52cywgYnJdLCB0cnVlKTtcbiAgICBpZiAoZy5wcmVkZWNlc3NvcnMoYmwpLmxlbmd0aCkge1xuICAgICAgdmFyIGJsUHJlZCA9IGcubm9kZShnLnByZWRlY2Vzc29ycyhibClbMF0pLFxuICAgICAgICBiclByZWQgPSBnLm5vZGUoZy5wcmVkZWNlc3NvcnMoYnIpWzBdKTtcbiAgICAgIGlmICghXy5oYXMocmVzdWx0LCBcImJhcnljZW50ZXJcIikpIHtcbiAgICAgICAgcmVzdWx0LmJhcnljZW50ZXIgPSAwO1xuICAgICAgICByZXN1bHQud2VpZ2h0ID0gMDtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5iYXJ5Y2VudGVyID0gKHJlc3VsdC5iYXJ5Y2VudGVyICogcmVzdWx0LndlaWdodCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBibFByZWQub3JkZXIgKyBiclByZWQub3JkZXIpIC8gKHJlc3VsdC53ZWlnaHQgKyAyKTtcbiAgICAgIHJlc3VsdC53ZWlnaHQgKz0gMjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBleHBhbmRTdWJncmFwaHMoZW50cmllcywgc3ViZ3JhcGhzKSB7XG4gIF8uZm9yRWFjaChlbnRyaWVzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIGVudHJ5LnZzID0gXy5mbGF0dGVuKGVudHJ5LnZzLm1hcChmdW5jdGlvbih2KSB7XG4gICAgICBpZiAoc3ViZ3JhcGhzW3ZdKSB7XG4gICAgICAgIHJldHVybiBzdWJncmFwaHNbdl0udnM7XG4gICAgICB9XG4gICAgICByZXR1cm4gdjtcbiAgICB9KSwgdHJ1ZSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtZXJnZUJhcnljZW50ZXJzKHRhcmdldCwgb3RoZXIpIHtcbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHRhcmdldC5iYXJ5Y2VudGVyKSkge1xuICAgIHRhcmdldC5iYXJ5Y2VudGVyID0gKHRhcmdldC5iYXJ5Y2VudGVyICogdGFyZ2V0LndlaWdodCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIuYmFyeWNlbnRlciAqIG90aGVyLndlaWdodCkgL1xuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcmdldC53ZWlnaHQgKyBvdGhlci53ZWlnaHQpO1xuICAgIHRhcmdldC53ZWlnaHQgKz0gb3RoZXIud2VpZ2h0O1xuICB9IGVsc2Uge1xuICAgIHRhcmdldC5iYXJ5Y2VudGVyID0gb3RoZXIuYmFyeWNlbnRlcjtcbiAgICB0YXJnZXQud2VpZ2h0ID0gb3RoZXIud2VpZ2h0O1xuICB9XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuLi91dGlsXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNvcnQ7XG5cbmZ1bmN0aW9uIHNvcnQoZW50cmllcywgYmlhc1JpZ2h0KSB7XG4gIHZhciBwYXJ0cyA9IHV0aWwucGFydGl0aW9uKGVudHJpZXMsIGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgcmV0dXJuIF8uaGFzKGVudHJ5LCBcImJhcnljZW50ZXJcIik7XG4gIH0pO1xuICB2YXIgc29ydGFibGUgPSBwYXJ0cy5saHMsXG4gICAgdW5zb3J0YWJsZSA9IF8uc29ydEJ5KHBhcnRzLnJocywgZnVuY3Rpb24oZW50cnkpIHsgcmV0dXJuIC1lbnRyeS5pOyB9KSxcbiAgICB2cyA9IFtdLFxuICAgIHN1bSA9IDAsXG4gICAgd2VpZ2h0ID0gMCxcbiAgICB2c0luZGV4ID0gMDtcblxuICBzb3J0YWJsZS5zb3J0KGNvbXBhcmVXaXRoQmlhcyghIWJpYXNSaWdodCkpO1xuXG4gIHZzSW5kZXggPSBjb25zdW1lVW5zb3J0YWJsZSh2cywgdW5zb3J0YWJsZSwgdnNJbmRleCk7XG5cbiAgXy5mb3JFYWNoKHNvcnRhYmxlLCBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICB2c0luZGV4ICs9IGVudHJ5LnZzLmxlbmd0aDtcbiAgICB2cy5wdXNoKGVudHJ5LnZzKTtcbiAgICBzdW0gKz0gZW50cnkuYmFyeWNlbnRlciAqIGVudHJ5LndlaWdodDtcbiAgICB3ZWlnaHQgKz0gZW50cnkud2VpZ2h0O1xuICAgIHZzSW5kZXggPSBjb25zdW1lVW5zb3J0YWJsZSh2cywgdW5zb3J0YWJsZSwgdnNJbmRleCk7XG4gIH0pO1xuXG4gIHZhciByZXN1bHQgPSB7IHZzOiBfLmZsYXR0ZW4odnMsIHRydWUpIH07XG4gIGlmICh3ZWlnaHQpIHtcbiAgICByZXN1bHQuYmFyeWNlbnRlciA9IHN1bSAvIHdlaWdodDtcbiAgICByZXN1bHQud2VpZ2h0ID0gd2VpZ2h0O1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGNvbnN1bWVVbnNvcnRhYmxlKHZzLCB1bnNvcnRhYmxlLCBpbmRleCkge1xuICB2YXIgbGFzdDtcbiAgd2hpbGUgKHVuc29ydGFibGUubGVuZ3RoICYmIChsYXN0ID0gXy5sYXN0KHVuc29ydGFibGUpKS5pIDw9IGluZGV4KSB7XG4gICAgdW5zb3J0YWJsZS5wb3AoKTtcbiAgICB2cy5wdXNoKGxhc3QudnMpO1xuICAgIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufVxuXG5mdW5jdGlvbiBjb21wYXJlV2l0aEJpYXMoYmlhcykge1xuICByZXR1cm4gZnVuY3Rpb24oZW50cnlWLCBlbnRyeVcpIHtcbiAgICBpZiAoZW50cnlWLmJhcnljZW50ZXIgPCBlbnRyeVcuYmFyeWNlbnRlcikge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gZWxzZSBpZiAoZW50cnlWLmJhcnljZW50ZXIgPiBlbnRyeVcuYmFyeWNlbnRlcikge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuICFiaWFzID8gZW50cnlWLmkgLSBlbnRyeVcuaSA6IGVudHJ5Vy5pIC0gZW50cnlWLmk7XG4gIH07XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnREdW1teUNoYWlucztcblxuZnVuY3Rpb24gcGFyZW50RHVtbXlDaGFpbnMoZykge1xuICB2YXIgcG9zdG9yZGVyTnVtcyA9IHBvc3RvcmRlcihnKTtcblxuICBfLmZvckVhY2goZy5ncmFwaCgpLmR1bW15Q2hhaW5zLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgdmFyIGVkZ2VPYmogPSBub2RlLmVkZ2VPYmo7XG4gICAgdmFyIHBhdGhEYXRhID0gZmluZFBhdGgoZywgcG9zdG9yZGVyTnVtcywgZWRnZU9iai52LCBlZGdlT2JqLncpO1xuICAgIHZhciBwYXRoID0gcGF0aERhdGEucGF0aDtcbiAgICB2YXIgbGNhID0gcGF0aERhdGEubGNhO1xuICAgIHZhciBwYXRoSWR4ID0gMDtcbiAgICB2YXIgcGF0aFYgPSBwYXRoW3BhdGhJZHhdO1xuICAgIHZhciBhc2NlbmRpbmcgPSB0cnVlO1xuXG4gICAgd2hpbGUgKHYgIT09IGVkZ2VPYmoudykge1xuICAgICAgbm9kZSA9IGcubm9kZSh2KTtcblxuICAgICAgaWYgKGFzY2VuZGluZykge1xuICAgICAgICB3aGlsZSAoKHBhdGhWID0gcGF0aFtwYXRoSWR4XSkgIT09IGxjYSAmJlxuICAgICAgICAgICAgICAgZy5ub2RlKHBhdGhWKS5tYXhSYW5rIDwgbm9kZS5yYW5rKSB7XG4gICAgICAgICAgcGF0aElkeCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhdGhWID09PSBsY2EpIHtcbiAgICAgICAgICBhc2NlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWFzY2VuZGluZykge1xuICAgICAgICB3aGlsZSAocGF0aElkeCA8IHBhdGgubGVuZ3RoIC0gMSAmJlxuICAgICAgICAgICAgICAgZy5ub2RlKHBhdGhWID0gcGF0aFtwYXRoSWR4ICsgMV0pLm1pblJhbmsgPD0gbm9kZS5yYW5rKSB7XG4gICAgICAgICAgcGF0aElkeCsrO1xuICAgICAgICB9XG4gICAgICAgIHBhdGhWID0gcGF0aFtwYXRoSWR4XTtcbiAgICAgIH1cblxuICAgICAgZy5zZXRQYXJlbnQodiwgcGF0aFYpO1xuICAgICAgdiA9IGcuc3VjY2Vzc29ycyh2KVswXTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBGaW5kIGEgcGF0aCBmcm9tIHYgdG8gdyB0aHJvdWdoIHRoZSBsb3dlc3QgY29tbW9uIGFuY2VzdG9yIChMQ0EpLiBSZXR1cm4gdGhlXG4vLyBmdWxsIHBhdGggYW5kIHRoZSBMQ0EuXG5mdW5jdGlvbiBmaW5kUGF0aChnLCBwb3N0b3JkZXJOdW1zLCB2LCB3KSB7XG4gIHZhciB2UGF0aCA9IFtdO1xuICB2YXIgd1BhdGggPSBbXTtcbiAgdmFyIGxvdyA9IE1hdGgubWluKHBvc3RvcmRlck51bXNbdl0ubG93LCBwb3N0b3JkZXJOdW1zW3ddLmxvdyk7XG4gIHZhciBsaW0gPSBNYXRoLm1heChwb3N0b3JkZXJOdW1zW3ZdLmxpbSwgcG9zdG9yZGVyTnVtc1t3XS5saW0pO1xuICB2YXIgcGFyZW50O1xuICB2YXIgbGNhO1xuXG4gIC8vIFRyYXZlcnNlIHVwIGZyb20gdiB0byBmaW5kIHRoZSBMQ0FcbiAgcGFyZW50ID0gdjtcbiAgZG8ge1xuICAgIHBhcmVudCA9IGcucGFyZW50KHBhcmVudCk7XG4gICAgdlBhdGgucHVzaChwYXJlbnQpO1xuICB9IHdoaWxlIChwYXJlbnQgJiZcbiAgICAgICAgICAgKHBvc3RvcmRlck51bXNbcGFyZW50XS5sb3cgPiBsb3cgfHwgbGltID4gcG9zdG9yZGVyTnVtc1twYXJlbnRdLmxpbSkpO1xuICBsY2EgPSBwYXJlbnQ7XG5cbiAgLy8gVHJhdmVyc2UgZnJvbSB3IHRvIExDQVxuICBwYXJlbnQgPSB3O1xuICB3aGlsZSAoKHBhcmVudCA9IGcucGFyZW50KHBhcmVudCkpICE9PSBsY2EpIHtcbiAgICB3UGF0aC5wdXNoKHBhcmVudCk7XG4gIH1cblxuICByZXR1cm4geyBwYXRoOiB2UGF0aC5jb25jYXQod1BhdGgucmV2ZXJzZSgpKSwgbGNhOiBsY2EgfTtcbn1cblxuZnVuY3Rpb24gcG9zdG9yZGVyKGcpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICB2YXIgbGltID0gMDtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIHZhciBsb3cgPSBsaW07XG4gICAgXy5mb3JFYWNoKGcuY2hpbGRyZW4odiksIGRmcyk7XG4gICAgcmVzdWx0W3ZdID0geyBsb3c6IGxvdywgbGltOiBsaW0rKyB9O1xuICB9XG4gIF8uZm9yRWFjaChnLmNoaWxkcmVuKCksIGRmcyk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuR3JhcGg7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuLi91dGlsXCIpO1xuXG4vKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgY29vcmRpbmF0ZSBhc3NpZ25tZW50IGJhc2VkIG9uIEJyYW5kZXMgYW5kIEvDtnBmLCBcIkZhc3RcbiAqIGFuZCBTaW1wbGUgSG9yaXpvbnRhbCBDb29yZGluYXRlIEFzc2lnbm1lbnQuXCJcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcG9zaXRpb25YOiBwb3NpdGlvblgsXG4gIGZpbmRUeXBlMUNvbmZsaWN0czogZmluZFR5cGUxQ29uZmxpY3RzLFxuICBmaW5kVHlwZTJDb25mbGljdHM6IGZpbmRUeXBlMkNvbmZsaWN0cyxcbiAgYWRkQ29uZmxpY3Q6IGFkZENvbmZsaWN0LFxuICBoYXNDb25mbGljdDogaGFzQ29uZmxpY3QsXG4gIHZlcnRpY2FsQWxpZ25tZW50OiB2ZXJ0aWNhbEFsaWdubWVudCxcbiAgaG9yaXpvbnRhbENvbXBhY3Rpb246IGhvcml6b250YWxDb21wYWN0aW9uLFxuICBhbGlnbkNvb3JkaW5hdGVzOiBhbGlnbkNvb3JkaW5hdGVzLFxuICBmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudDogZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQsXG4gIGJhbGFuY2U6IGJhbGFuY2Vcbn07XG5cbi8qXG4gKiBNYXJrcyBhbGwgZWRnZXMgaW4gdGhlIGdyYXBoIHdpdGggYSB0eXBlLTEgY29uZmxpY3Qgd2l0aCB0aGUgXCJ0eXBlMUNvbmZsaWN0XCJcbiAqIHByb3BlcnR5LiBBIHR5cGUtMSBjb25mbGljdCBpcyBvbmUgd2hlcmUgYSBub24taW5uZXIgc2VnbWVudCBjcm9zc2VzIGFuXG4gKiBpbm5lciBzZWdtZW50LiBBbiBpbm5lciBzZWdtZW50IGlzIGFuIGVkZ2Ugd2l0aCBib3RoIGluY2lkZW50IG5vZGVzIG1hcmtlZFxuICogd2l0aCB0aGUgXCJkdW1teVwiIHByb3BlcnR5LlxuICpcbiAqIFRoaXMgYWxnb3JpdGhtIHNjYW5zIGxheWVyIGJ5IGxheWVyLCBzdGFydGluZyB3aXRoIHRoZSBzZWNvbmQsIGZvciB0eXBlLTFcbiAqIGNvbmZsaWN0cyBiZXR3ZWVuIHRoZSBjdXJyZW50IGxheWVyIGFuZCB0aGUgcHJldmlvdXMgbGF5ZXIuIEZvciBlYWNoIGxheWVyXG4gKiBpdCBzY2FucyB0aGUgbm9kZXMgZnJvbSBsZWZ0IHRvIHJpZ2h0IHVudGlsIGl0IHJlYWNoZXMgb25lIHRoYXQgaXMgaW5jaWRlbnRcbiAqIG9uIGFuIGlubmVyIHNlZ21lbnQuIEl0IHRoZW4gc2NhbnMgcHJlZGVjZXNzb3JzIHRvIGRldGVybWluZSBpZiB0aGV5IGhhdmVcbiAqIGVkZ2VzIHRoYXQgY3Jvc3MgdGhhdCBpbm5lciBzZWdtZW50LiBBdCB0aGUgZW5kIGEgZmluYWwgc2NhbiBpcyBkb25lIGZvciBhbGxcbiAqIG5vZGVzIG9uIHRoZSBjdXJyZW50IHJhbmsgdG8gc2VlIGlmIHRoZXkgY3Jvc3MgdGhlIGxhc3QgdmlzaXRlZCBpbm5lclxuICogc2VnbWVudC5cbiAqXG4gKiBUaGlzIGFsZ29yaXRobSAoc2FmZWx5KSBhc3N1bWVzIHRoYXQgYSBkdW1teSBub2RlIHdpbGwgb25seSBiZSBpbmNpZGVudCBvbiBhXG4gKiBzaW5nbGUgbm9kZSBpbiB0aGUgbGF5ZXJzIGJlaW5nIHNjYW5uZWQuXG4gKi9cbmZ1bmN0aW9uIGZpbmRUeXBlMUNvbmZsaWN0cyhnLCBsYXllcmluZykge1xuICB2YXIgY29uZmxpY3RzID0ge307XG5cbiAgZnVuY3Rpb24gdmlzaXRMYXllcihwcmV2TGF5ZXIsIGxheWVyKSB7XG4gICAgdmFyXG4gICAgICAvLyBsYXN0IHZpc2l0ZWQgbm9kZSBpbiB0aGUgcHJldmlvdXMgbGF5ZXIgdGhhdCBpcyBpbmNpZGVudCBvbiBhbiBpbm5lclxuICAgICAgLy8gc2VnbWVudC5cbiAgICAgIGswID0gMCxcbiAgICAgIC8vIFRyYWNrcyB0aGUgbGFzdCBub2RlIGluIHRoaXMgbGF5ZXIgc2Nhbm5lZCBmb3IgY3Jvc3NpbmdzIHdpdGggYSB0eXBlLTFcbiAgICAgIC8vIHNlZ21lbnQuXG4gICAgICBzY2FuUG9zID0gMCxcbiAgICAgIHByZXZMYXllckxlbmd0aCA9IHByZXZMYXllci5sZW5ndGgsXG4gICAgICBsYXN0Tm9kZSA9IF8ubGFzdChsYXllcik7XG5cbiAgICBfLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYsIGkpIHtcbiAgICAgIHZhciB3ID0gZmluZE90aGVySW5uZXJTZWdtZW50Tm9kZShnLCB2KSxcbiAgICAgICAgazEgPSB3ID8gZy5ub2RlKHcpLm9yZGVyIDogcHJldkxheWVyTGVuZ3RoO1xuXG4gICAgICBpZiAodyB8fCB2ID09PSBsYXN0Tm9kZSkge1xuICAgICAgICBfLmZvckVhY2gobGF5ZXIuc2xpY2Uoc2NhblBvcywgaSArMSksIGZ1bmN0aW9uKHNjYW5Ob2RlKSB7XG4gICAgICAgICAgXy5mb3JFYWNoKGcucHJlZGVjZXNzb3JzKHNjYW5Ob2RlKSwgZnVuY3Rpb24odSkge1xuICAgICAgICAgICAgdmFyIHVMYWJlbCA9IGcubm9kZSh1KSxcbiAgICAgICAgICAgICAgdVBvcyA9IHVMYWJlbC5vcmRlcjtcbiAgICAgICAgICAgIGlmICgodVBvcyA8IGswIHx8IGsxIDwgdVBvcykgJiZcbiAgICAgICAgICAgICAgICAhKHVMYWJlbC5kdW1teSAmJiBnLm5vZGUoc2Nhbk5vZGUpLmR1bW15KSkge1xuICAgICAgICAgICAgICBhZGRDb25mbGljdChjb25mbGljdHMsIHUsIHNjYW5Ob2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNjYW5Qb3MgPSBpICsgMTtcbiAgICAgICAgazAgPSBrMTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBsYXllcjtcbiAgfVxuXG4gIF8ucmVkdWNlKGxheWVyaW5nLCB2aXNpdExheWVyKTtcbiAgcmV0dXJuIGNvbmZsaWN0cztcbn1cblxuZnVuY3Rpb24gZmluZFR5cGUyQ29uZmxpY3RzKGcsIGxheWVyaW5nKSB7XG4gIHZhciBjb25mbGljdHMgPSB7fTtcblxuICBmdW5jdGlvbiBzY2FuKHNvdXRoLCBzb3V0aFBvcywgc291dGhFbmQsIHByZXZOb3J0aEJvcmRlciwgbmV4dE5vcnRoQm9yZGVyKSB7XG4gICAgdmFyIHY7XG4gICAgXy5mb3JFYWNoKF8ucmFuZ2Uoc291dGhQb3MsIHNvdXRoRW5kKSwgZnVuY3Rpb24oaSkge1xuICAgICAgdiA9IHNvdXRoW2ldO1xuICAgICAgaWYgKGcubm9kZSh2KS5kdW1teSkge1xuICAgICAgICBfLmZvckVhY2goZy5wcmVkZWNlc3NvcnModiksIGZ1bmN0aW9uKHUpIHtcbiAgICAgICAgICB2YXIgdU5vZGUgPSBnLm5vZGUodSk7XG4gICAgICAgICAgaWYgKHVOb2RlLmR1bW15ICYmXG4gICAgICAgICAgICAgICh1Tm9kZS5vcmRlciA8IHByZXZOb3J0aEJvcmRlciB8fCB1Tm9kZS5vcmRlciA+IG5leHROb3J0aEJvcmRlcikpIHtcbiAgICAgICAgICAgIGFkZENvbmZsaWN0KGNvbmZsaWN0cywgdSwgdik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gdmlzaXRMYXllcihub3J0aCwgc291dGgpIHtcbiAgICB2YXIgcHJldk5vcnRoUG9zID0gLTEsXG4gICAgICBuZXh0Tm9ydGhQb3MsXG4gICAgICBzb3V0aFBvcyA9IDA7XG5cbiAgICBfLmZvckVhY2goc291dGgsIGZ1bmN0aW9uKHYsIHNvdXRoTG9va2FoZWFkKSB7XG4gICAgICBpZiAoZy5ub2RlKHYpLmR1bW15ID09PSBcImJvcmRlclwiKSB7XG4gICAgICAgIHZhciBwcmVkZWNlc3NvcnMgPSBnLnByZWRlY2Vzc29ycyh2KTtcbiAgICAgICAgaWYgKHByZWRlY2Vzc29ycy5sZW5ndGgpIHtcbiAgICAgICAgICBuZXh0Tm9ydGhQb3MgPSBnLm5vZGUocHJlZGVjZXNzb3JzWzBdKS5vcmRlcjtcbiAgICAgICAgICBzY2FuKHNvdXRoLCBzb3V0aFBvcywgc291dGhMb29rYWhlYWQsIHByZXZOb3J0aFBvcywgbmV4dE5vcnRoUG9zKTtcbiAgICAgICAgICBzb3V0aFBvcyA9IHNvdXRoTG9va2FoZWFkO1xuICAgICAgICAgIHByZXZOb3J0aFBvcyA9IG5leHROb3J0aFBvcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2Nhbihzb3V0aCwgc291dGhQb3MsIHNvdXRoLmxlbmd0aCwgbmV4dE5vcnRoUG9zLCBub3J0aC5sZW5ndGgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNvdXRoO1xuICB9XG5cbiAgXy5yZWR1Y2UobGF5ZXJpbmcsIHZpc2l0TGF5ZXIpO1xuICByZXR1cm4gY29uZmxpY3RzO1xufVxuXG5mdW5jdGlvbiBmaW5kT3RoZXJJbm5lclNlZ21lbnROb2RlKGcsIHYpIHtcbiAgaWYgKGcubm9kZSh2KS5kdW1teSkge1xuICAgIHJldHVybiBfLmZpbmQoZy5wcmVkZWNlc3NvcnModiksIGZ1bmN0aW9uKHUpIHtcbiAgICAgIHJldHVybiBnLm5vZGUodSkuZHVtbXk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkQ29uZmxpY3QoY29uZmxpY3RzLCB2LCB3KSB7XG4gIGlmICh2ID4gdykge1xuICAgIHZhciB0bXAgPSB2O1xuICAgIHYgPSB3O1xuICAgIHcgPSB0bXA7XG4gIH1cblxuICB2YXIgY29uZmxpY3RzViA9IGNvbmZsaWN0c1t2XTtcbiAgaWYgKCFjb25mbGljdHNWKSB7XG4gICAgY29uZmxpY3RzW3ZdID0gY29uZmxpY3RzViA9IHt9O1xuICB9XG4gIGNvbmZsaWN0c1Zbd10gPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBoYXNDb25mbGljdChjb25mbGljdHMsIHYsIHcpIHtcbiAgaWYgKHYgPiB3KSB7XG4gICAgdmFyIHRtcCA9IHY7XG4gICAgdiA9IHc7XG4gICAgdyA9IHRtcDtcbiAgfVxuICByZXR1cm4gXy5oYXMoY29uZmxpY3RzW3ZdLCB3KTtcbn1cblxuLypcbiAqIFRyeSB0byBhbGlnbiBub2RlcyBpbnRvIHZlcnRpY2FsIFwiYmxvY2tzXCIgd2hlcmUgcG9zc2libGUuIFRoaXMgYWxnb3JpdGhtXG4gKiBhdHRlbXB0cyB0byBhbGlnbiBhIG5vZGUgd2l0aCBvbmUgb2YgaXRzIG1lZGlhbiBuZWlnaGJvcnMuIElmIHRoZSBlZGdlXG4gKiBjb25uZWN0aW5nIGEgbmVpZ2hib3IgaXMgYSB0eXBlLTEgY29uZmxpY3QgdGhlbiB3ZSBpZ25vcmUgdGhhdCBwb3NzaWJpbGl0eS5cbiAqIElmIGEgcHJldmlvdXMgbm9kZSBoYXMgYWxyZWFkeSBmb3JtZWQgYSBibG9jayB3aXRoIGEgbm9kZSBhZnRlciB0aGUgbm9kZVxuICogd2UncmUgdHJ5aW5nIHRvIGZvcm0gYSBibG9jayB3aXRoLCB3ZSBhbHNvIGlnbm9yZSB0aGF0IHBvc3NpYmlsaXR5IC0gb3VyXG4gKiBibG9ja3Mgd291bGQgYmUgc3BsaXQgaW4gdGhhdCBzY2VuYXJpby5cbiAqL1xuZnVuY3Rpb24gdmVydGljYWxBbGlnbm1lbnQoZywgbGF5ZXJpbmcsIGNvbmZsaWN0cywgbmVpZ2hib3JGbikge1xuICB2YXIgcm9vdCA9IHt9LFxuICAgIGFsaWduID0ge30sXG4gICAgcG9zID0ge307XG5cbiAgLy8gV2UgY2FjaGUgdGhlIHBvc2l0aW9uIGhlcmUgYmFzZWQgb24gdGhlIGxheWVyaW5nIGJlY2F1c2UgdGhlIGdyYXBoIGFuZFxuICAvLyBsYXllcmluZyBtYXkgYmUgb3V0IG9mIHN5bmMuIFRoZSBsYXllcmluZyBtYXRyaXggaXMgbWFuaXB1bGF0ZWQgdG9cbiAgLy8gZ2VuZXJhdGUgZGlmZmVyZW50IGV4dHJlbWUgYWxpZ25tZW50cy5cbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odiwgb3JkZXIpIHtcbiAgICAgIHJvb3Rbdl0gPSB2O1xuICAgICAgYWxpZ25bdl0gPSB2O1xuICAgICAgcG9zW3ZdID0gb3JkZXI7XG4gICAgfSk7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChsYXllcmluZywgZnVuY3Rpb24obGF5ZXIpIHtcbiAgICB2YXIgcHJldklkeCA9IC0xO1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odikge1xuICAgICAgdmFyIHdzID0gbmVpZ2hib3JGbih2KTtcbiAgICAgIGlmICh3cy5sZW5ndGgpIHtcbiAgICAgICAgd3MgPSBfLnNvcnRCeSh3cywgZnVuY3Rpb24odykgeyByZXR1cm4gcG9zW3ddOyB9KTtcbiAgICAgICAgdmFyIG1wID0gKHdzLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgICAgZm9yICh2YXIgaSA9IE1hdGguZmxvb3IobXApLCBpbCA9IE1hdGguY2VpbChtcCk7IGkgPD0gaWw7ICsraSkge1xuICAgICAgICAgIHZhciB3ID0gd3NbaV07XG4gICAgICAgICAgaWYgKGFsaWduW3ZdID09PSB2ICYmXG4gICAgICAgICAgICAgIHByZXZJZHggPCBwb3Nbd10gJiZcbiAgICAgICAgICAgICAgIWhhc0NvbmZsaWN0KGNvbmZsaWN0cywgdiwgdykpIHtcbiAgICAgICAgICAgIGFsaWduW3ddID0gdjtcbiAgICAgICAgICAgIGFsaWduW3ZdID0gcm9vdFt2XSA9IHJvb3Rbd107XG4gICAgICAgICAgICBwcmV2SWR4ID0gcG9zW3ddO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4geyByb290OiByb290LCBhbGlnbjogYWxpZ24gfTtcbn1cblxuZnVuY3Rpb24gaG9yaXpvbnRhbENvbXBhY3Rpb24oZywgbGF5ZXJpbmcsIHJvb3QsIGFsaWduLCByZXZlcnNlU2VwKSB7XG4gIC8vIFRoaXMgcG9ydGlvbiBvZiB0aGUgYWxnb3JpdGhtIGRpZmZlcnMgZnJvbSBCSyBkdWUgdG8gYSBudW1iZXIgb2YgcHJvYmxlbXMuXG4gIC8vIEluc3RlYWQgb2YgdGhlaXIgYWxnb3JpdGhtIHdlIGNvbnN0cnVjdCBhIG5ldyBibG9jayBncmFwaCBhbmQgZG8gdHdvXG4gIC8vIHN3ZWVwcy4gVGhlIGZpcnN0IHN3ZWVwIHBsYWNlcyBibG9ja3Mgd2l0aCB0aGUgc21hbGxlc3QgcG9zc2libGVcbiAgLy8gY29vcmRpbmF0ZXMuIFRoZSBzZWNvbmQgc3dlZXAgcmVtb3ZlcyB1bnVzZWQgc3BhY2UgYnkgbW92aW5nIGJsb2NrcyB0byB0aGVcbiAgLy8gZ3JlYXRlc3QgY29vcmRpbmF0ZXMgd2l0aG91dCB2aW9sYXRpbmcgc2VwYXJhdGlvbi5cbiAgdmFyIHhzID0ge30sXG4gICAgYmxvY2tHID0gYnVpbGRCbG9ja0dyYXBoKGcsIGxheWVyaW5nLCByb290LCByZXZlcnNlU2VwKSxcbiAgICBib3JkZXJUeXBlID0gcmV2ZXJzZVNlcCA/IFwiYm9yZGVyTGVmdFwiIDogXCJib3JkZXJSaWdodFwiO1xuXG4gIGZ1bmN0aW9uIGl0ZXJhdGUoc2V0WHNGdW5jLCBuZXh0Tm9kZXNGdW5jKSB7XG4gICAgdmFyIHN0YWNrID0gYmxvY2tHLm5vZGVzKCk7XG4gICAgdmFyIGVsZW0gPSBzdGFjay5wb3AoKTtcbiAgICB2YXIgdmlzaXRlZCA9IHt9O1xuICAgIHdoaWxlIChlbGVtKSB7XG4gICAgICBpZiAodmlzaXRlZFtlbGVtXSkge1xuICAgICAgICBzZXRYc0Z1bmMoZWxlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2aXNpdGVkW2VsZW1dID0gdHJ1ZTtcbiAgICAgICAgc3RhY2sucHVzaChlbGVtKTtcbiAgICAgICAgc3RhY2sgPSBzdGFjay5jb25jYXQobmV4dE5vZGVzRnVuYyhlbGVtKSk7XG4gICAgICB9XG5cbiAgICAgIGVsZW0gPSBzdGFjay5wb3AoKTtcbiAgICB9XG4gIH1cblxuICAvLyBGaXJzdCBwYXNzLCBhc3NpZ24gc21hbGxlc3QgY29vcmRpbmF0ZXNcbiAgZnVuY3Rpb24gcGFzczEoZWxlbSkge1xuICAgIHhzW2VsZW1dID0gYmxvY2tHLmluRWRnZXMoZWxlbSkucmVkdWNlKGZ1bmN0aW9uKGFjYywgZSkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KGFjYywgeHNbZS52XSArIGJsb2NrRy5lZGdlKGUpKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8vIFNlY29uZCBwYXNzLCBhc3NpZ24gZ3JlYXRlc3QgY29vcmRpbmF0ZXNcbiAgZnVuY3Rpb24gcGFzczIoZWxlbSkge1xuICAgIHZhciBtaW4gPSBibG9ja0cub3V0RWRnZXMoZWxlbSkucmVkdWNlKGZ1bmN0aW9uKGFjYywgZSkge1xuICAgICAgcmV0dXJuIE1hdGgubWluKGFjYywgeHNbZS53XSAtIGJsb2NrRy5lZGdlKGUpKTtcbiAgICB9LCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuXG4gICAgdmFyIG5vZGUgPSBnLm5vZGUoZWxlbSk7XG4gICAgaWYgKG1pbiAhPT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZICYmIG5vZGUuYm9yZGVyVHlwZSAhPT0gYm9yZGVyVHlwZSkge1xuICAgICAgeHNbZWxlbV0gPSBNYXRoLm1heCh4c1tlbGVtXSwgbWluKTtcbiAgICB9XG4gIH1cblxuICBpdGVyYXRlKHBhc3MxLCBibG9ja0cucHJlZGVjZXNzb3JzLmJpbmQoYmxvY2tHKSk7XG4gIGl0ZXJhdGUocGFzczIsIGJsb2NrRy5zdWNjZXNzb3JzLmJpbmQoYmxvY2tHKSk7XG5cbiAgLy8gQXNzaWduIHggY29vcmRpbmF0ZXMgdG8gYWxsIG5vZGVzXG4gIF8uZm9yRWFjaChhbGlnbiwgZnVuY3Rpb24odikge1xuICAgIHhzW3ZdID0geHNbcm9vdFt2XV07XG4gIH0pO1xuXG4gIHJldHVybiB4cztcbn1cblxuXG5mdW5jdGlvbiBidWlsZEJsb2NrR3JhcGgoZywgbGF5ZXJpbmcsIHJvb3QsIHJldmVyc2VTZXApIHtcbiAgdmFyIGJsb2NrR3JhcGggPSBuZXcgR3JhcGgoKSxcbiAgICBncmFwaExhYmVsID0gZy5ncmFwaCgpLFxuICAgIHNlcEZuID0gc2VwKGdyYXBoTGFiZWwubm9kZXNlcCwgZ3JhcGhMYWJlbC5lZGdlc2VwLCByZXZlcnNlU2VwKTtcblxuICBfLmZvckVhY2gobGF5ZXJpbmcsIGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgdmFyIHU7XG4gICAgXy5mb3JFYWNoKGxheWVyLCBmdW5jdGlvbih2KSB7XG4gICAgICB2YXIgdlJvb3QgPSByb290W3ZdO1xuICAgICAgYmxvY2tHcmFwaC5zZXROb2RlKHZSb290KTtcbiAgICAgIGlmICh1KSB7XG4gICAgICAgIHZhciB1Um9vdCA9IHJvb3RbdV0sXG4gICAgICAgICAgcHJldk1heCA9IGJsb2NrR3JhcGguZWRnZSh1Um9vdCwgdlJvb3QpO1xuICAgICAgICBibG9ja0dyYXBoLnNldEVkZ2UodVJvb3QsIHZSb290LCBNYXRoLm1heChzZXBGbihnLCB2LCB1KSwgcHJldk1heCB8fCAwKSk7XG4gICAgICB9XG4gICAgICB1ID0gdjtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIGJsb2NrR3JhcGg7XG59XG5cbi8qXG4gKiBSZXR1cm5zIHRoZSBhbGlnbm1lbnQgdGhhdCBoYXMgdGhlIHNtYWxsZXN0IHdpZHRoIG9mIHRoZSBnaXZlbiBhbGlnbm1lbnRzLlxuICovXG5mdW5jdGlvbiBmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudChnLCB4c3MpIHtcbiAgcmV0dXJuIF8ubWluQnkoXy52YWx1ZXMoeHNzKSwgZnVuY3Rpb24gKHhzKSB7XG4gICAgdmFyIG1heCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICB2YXIgbWluID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuXG4gICAgXy5mb3JJbih4cywgZnVuY3Rpb24gKHgsIHYpIHtcbiAgICAgIHZhciBoYWxmV2lkdGggPSB3aWR0aChnLCB2KSAvIDI7XG5cbiAgICAgIG1heCA9IE1hdGgubWF4KHggKyBoYWxmV2lkdGgsIG1heCk7XG4gICAgICBtaW4gPSBNYXRoLm1pbih4IC0gaGFsZldpZHRoLCBtaW4pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1heCAtIG1pbjtcbiAgfSk7XG59XG5cbi8qXG4gKiBBbGlnbiB0aGUgY29vcmRpbmF0ZXMgb2YgZWFjaCBvZiB0aGUgbGF5b3V0IGFsaWdubWVudHMgc3VjaCB0aGF0XG4gKiBsZWZ0LWJpYXNlZCBhbGlnbm1lbnRzIGhhdmUgdGhlaXIgbWluaW11bSBjb29yZGluYXRlIGF0IHRoZSBzYW1lIHBvaW50IGFzXG4gKiB0aGUgbWluaW11bSBjb29yZGluYXRlIG9mIHRoZSBzbWFsbGVzdCB3aWR0aCBhbGlnbm1lbnQgYW5kIHJpZ2h0LWJpYXNlZFxuICogYWxpZ25tZW50cyBoYXZlIHRoZWlyIG1heGltdW0gY29vcmRpbmF0ZSBhdCB0aGUgc2FtZSBwb2ludCBhcyB0aGUgbWF4aW11bVxuICogY29vcmRpbmF0ZSBvZiB0aGUgc21hbGxlc3Qgd2lkdGggYWxpZ25tZW50LlxuICovXG5mdW5jdGlvbiBhbGlnbkNvb3JkaW5hdGVzKHhzcywgYWxpZ25Ubykge1xuICB2YXIgYWxpZ25Ub1ZhbHMgPSBfLnZhbHVlcyhhbGlnblRvKSxcbiAgICBhbGlnblRvTWluID0gXy5taW4oYWxpZ25Ub1ZhbHMpLFxuICAgIGFsaWduVG9NYXggPSBfLm1heChhbGlnblRvVmFscyk7XG5cbiAgXy5mb3JFYWNoKFtcInVcIiwgXCJkXCJdLCBmdW5jdGlvbih2ZXJ0KSB7XG4gICAgXy5mb3JFYWNoKFtcImxcIiwgXCJyXCJdLCBmdW5jdGlvbihob3Jpeikge1xuICAgICAgdmFyIGFsaWdubWVudCA9IHZlcnQgKyBob3JpeixcbiAgICAgICAgeHMgPSB4c3NbYWxpZ25tZW50XSxcbiAgICAgICAgZGVsdGE7XG4gICAgICBpZiAoeHMgPT09IGFsaWduVG8pIHJldHVybjtcblxuICAgICAgdmFyIHhzVmFscyA9IF8udmFsdWVzKHhzKTtcbiAgICAgIGRlbHRhID0gaG9yaXogPT09IFwibFwiID8gYWxpZ25Ub01pbiAtIF8ubWluKHhzVmFscykgOiBhbGlnblRvTWF4IC0gXy5tYXgoeHNWYWxzKTtcblxuICAgICAgaWYgKGRlbHRhKSB7XG4gICAgICAgIHhzc1thbGlnbm1lbnRdID0gXy5tYXBWYWx1ZXMoeHMsIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHggKyBkZWx0YTsgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBiYWxhbmNlKHhzcywgYWxpZ24pIHtcbiAgcmV0dXJuIF8ubWFwVmFsdWVzKHhzcy51bCwgZnVuY3Rpb24oaWdub3JlLCB2KSB7XG4gICAgaWYgKGFsaWduKSB7XG4gICAgICByZXR1cm4geHNzW2FsaWduLnRvTG93ZXJDYXNlKCldW3ZdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgeHMgPSBfLnNvcnRCeShfLm1hcCh4c3MsIHYpKTtcbiAgICAgIHJldHVybiAoeHNbMV0gKyB4c1syXSkgLyAyO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBvc2l0aW9uWChnKSB7XG4gIHZhciBsYXllcmluZyA9IHV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtcbiAgdmFyIGNvbmZsaWN0cyA9IF8ubWVyZ2UoXG4gICAgZmluZFR5cGUxQ29uZmxpY3RzKGcsIGxheWVyaW5nKSxcbiAgICBmaW5kVHlwZTJDb25mbGljdHMoZywgbGF5ZXJpbmcpKTtcblxuICB2YXIgeHNzID0ge307XG4gIHZhciBhZGp1c3RlZExheWVyaW5nO1xuICBfLmZvckVhY2goW1widVwiLCBcImRcIl0sIGZ1bmN0aW9uKHZlcnQpIHtcbiAgICBhZGp1c3RlZExheWVyaW5nID0gdmVydCA9PT0gXCJ1XCIgPyBsYXllcmluZyA6IF8udmFsdWVzKGxheWVyaW5nKS5yZXZlcnNlKCk7XG4gICAgXy5mb3JFYWNoKFtcImxcIiwgXCJyXCJdLCBmdW5jdGlvbihob3Jpeikge1xuICAgICAgaWYgKGhvcml6ID09PSBcInJcIikge1xuICAgICAgICBhZGp1c3RlZExheWVyaW5nID0gXy5tYXAoYWRqdXN0ZWRMYXllcmluZywgZnVuY3Rpb24oaW5uZXIpIHtcbiAgICAgICAgICByZXR1cm4gXy52YWx1ZXMoaW5uZXIpLnJldmVyc2UoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZWlnaGJvckZuID0gKHZlcnQgPT09IFwidVwiID8gZy5wcmVkZWNlc3NvcnMgOiBnLnN1Y2Nlc3NvcnMpLmJpbmQoZyk7XG4gICAgICB2YXIgYWxpZ24gPSB2ZXJ0aWNhbEFsaWdubWVudChnLCBhZGp1c3RlZExheWVyaW5nLCBjb25mbGljdHMsIG5laWdoYm9yRm4pO1xuICAgICAgdmFyIHhzID0gaG9yaXpvbnRhbENvbXBhY3Rpb24oZywgYWRqdXN0ZWRMYXllcmluZyxcbiAgICAgICAgYWxpZ24ucm9vdCwgYWxpZ24uYWxpZ24sIGhvcml6ID09PSBcInJcIik7XG4gICAgICBpZiAoaG9yaXogPT09IFwiclwiKSB7XG4gICAgICAgIHhzID0gXy5tYXBWYWx1ZXMoeHMsIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIC14OyB9KTtcbiAgICAgIH1cbiAgICAgIHhzc1t2ZXJ0ICsgaG9yaXpdID0geHM7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHZhciBzbWFsbGVzdFdpZHRoID0gZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQoZywgeHNzKTtcbiAgYWxpZ25Db29yZGluYXRlcyh4c3MsIHNtYWxsZXN0V2lkdGgpO1xuICByZXR1cm4gYmFsYW5jZSh4c3MsIGcuZ3JhcGgoKS5hbGlnbik7XG59XG5cbmZ1bmN0aW9uIHNlcChub2RlU2VwLCBlZGdlU2VwLCByZXZlcnNlU2VwKSB7XG4gIHJldHVybiBmdW5jdGlvbihnLCB2LCB3KSB7XG4gICAgdmFyIHZMYWJlbCA9IGcubm9kZSh2KTtcbiAgICB2YXIgd0xhYmVsID0gZy5ub2RlKHcpO1xuICAgIHZhciBzdW0gPSAwO1xuICAgIHZhciBkZWx0YTtcblxuICAgIHN1bSArPSB2TGFiZWwud2lkdGggLyAyO1xuICAgIGlmIChfLmhhcyh2TGFiZWwsIFwibGFiZWxwb3NcIikpIHtcbiAgICAgIHN3aXRjaCAodkxhYmVsLmxhYmVscG9zLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgXCJsXCI6IGRlbHRhID0gLXZMYWJlbC53aWR0aCAvIDI7IGJyZWFrO1xuICAgICAgY2FzZSBcInJcIjogZGVsdGEgPSB2TGFiZWwud2lkdGggLyAyOyBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbHRhKSB7XG4gICAgICBzdW0gKz0gcmV2ZXJzZVNlcCA/IGRlbHRhIDogLWRlbHRhO1xuICAgIH1cbiAgICBkZWx0YSA9IDA7XG5cbiAgICBzdW0gKz0gKHZMYWJlbC5kdW1teSA/IGVkZ2VTZXAgOiBub2RlU2VwKSAvIDI7XG4gICAgc3VtICs9ICh3TGFiZWwuZHVtbXkgPyBlZGdlU2VwIDogbm9kZVNlcCkgLyAyO1xuXG4gICAgc3VtICs9IHdMYWJlbC53aWR0aCAvIDI7XG4gICAgaWYgKF8uaGFzKHdMYWJlbCwgXCJsYWJlbHBvc1wiKSkge1xuICAgICAgc3dpdGNoICh3TGFiZWwubGFiZWxwb3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSBcImxcIjogZGVsdGEgPSB3TGFiZWwud2lkdGggLyAyOyBicmVhaztcbiAgICAgIGNhc2UgXCJyXCI6IGRlbHRhID0gLXdMYWJlbC53aWR0aCAvIDI7IGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsdGEpIHtcbiAgICAgIHN1bSArPSByZXZlcnNlU2VwID8gZGVsdGEgOiAtZGVsdGE7XG4gICAgfVxuICAgIGRlbHRhID0gMDtcblxuICAgIHJldHVybiBzdW07XG4gIH07XG59XG5cbmZ1bmN0aW9uIHdpZHRoKGcsIHYpIHtcbiAgcmV0dXJuIGcubm9kZSh2KS53aWR0aDtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuLi91dGlsXCIpO1xudmFyIHBvc2l0aW9uWCA9IHJlcXVpcmUoXCIuL2JrXCIpLnBvc2l0aW9uWDtcblxubW9kdWxlLmV4cG9ydHMgPSBwb3NpdGlvbjtcblxuZnVuY3Rpb24gcG9zaXRpb24oZykge1xuICBnID0gdXRpbC5hc05vbkNvbXBvdW5kR3JhcGgoZyk7XG5cbiAgcG9zaXRpb25ZKGcpO1xuICBfLmZvckVhY2gocG9zaXRpb25YKGcpLCBmdW5jdGlvbih4LCB2KSB7XG4gICAgZy5ub2RlKHYpLnggPSB4O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcG9zaXRpb25ZKGcpIHtcbiAgdmFyIGxheWVyaW5nID0gdXRpbC5idWlsZExheWVyTWF0cml4KGcpO1xuICB2YXIgcmFua1NlcCA9IGcuZ3JhcGgoKS5yYW5rc2VwO1xuICB2YXIgcHJldlkgPSAwO1xuICBfLmZvckVhY2gobGF5ZXJpbmcsIGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgdmFyIG1heEhlaWdodCA9IF8ubWF4KF8ubWFwKGxheWVyLCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodikuaGVpZ2h0OyB9KSk7XG4gICAgXy5mb3JFYWNoKGxheWVyLCBmdW5jdGlvbih2KSB7XG4gICAgICBnLm5vZGUodikueSA9IHByZXZZICsgbWF4SGVpZ2h0IC8gMjtcbiAgICB9KTtcbiAgICBwcmV2WSArPSBtYXhIZWlnaHQgKyByYW5rU2VwO1xuICB9KTtcbn1cblxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuLi9ncmFwaGxpYlwiKS5HcmFwaDtcbnZhciBzbGFjayA9IHJlcXVpcmUoXCIuL3V0aWxcIikuc2xhY2s7XG5cbm1vZHVsZS5leHBvcnRzID0gZmVhc2libGVUcmVlO1xuXG4vKlxuICogQ29uc3RydWN0cyBhIHNwYW5uaW5nIHRyZWUgd2l0aCB0aWdodCBlZGdlcyBhbmQgYWRqdXN0ZWQgdGhlIGlucHV0IG5vZGUnc1xuICogcmFua3MgdG8gYWNoaWV2ZSB0aGlzLiBBIHRpZ2h0IGVkZ2UgaXMgb25lIHRoYXQgaXMgaGFzIGEgbGVuZ3RoIHRoYXQgbWF0Y2hlc1xuICogaXRzIFwibWlubGVuXCIgYXR0cmlidXRlLlxuICpcbiAqIFRoZSBiYXNpYyBzdHJ1Y3R1cmUgZm9yIHRoaXMgZnVuY3Rpb24gaXMgZGVyaXZlZCBmcm9tIEdhbnNuZXIsIGV0IGFsLiwgXCJBXG4gKiBUZWNobmlxdWUgZm9yIERyYXdpbmcgRGlyZWN0ZWQgR3JhcGhzLlwiXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gR3JhcGggbXVzdCBiZSBhIERBRy5cbiAqICAgIDIuIEdyYXBoIG11c3QgYmUgY29ubmVjdGVkLlxuICogICAgMy4gR3JhcGggbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBub2RlLlxuICogICAgNS4gR3JhcGggbm9kZXMgbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBhc3NpZ25lZCBhIFwicmFua1wiIHByb3BlcnR5IHRoYXRcbiAqICAgICAgIHJlc3BlY3RzIHRoZSBcIm1pbmxlblwiIHByb3BlcnR5IG9mIGluY2lkZW50IGVkZ2VzLlxuICogICAgNi4gR3JhcGggZWRnZXMgbXVzdCBoYXZlIGEgXCJtaW5sZW5cIiBwcm9wZXJ0eS5cbiAqXG4gKiBQb3N0LWNvbmRpdGlvbnM6XG4gKlxuICogICAgLSBHcmFwaCBub2RlcyB3aWxsIGhhdmUgdGhlaXIgcmFuayBhZGp1c3RlZCB0byBlbnN1cmUgdGhhdCBhbGwgZWRnZXMgYXJlXG4gKiAgICAgIHRpZ2h0LlxuICpcbiAqIFJldHVybnMgYSB0cmVlICh1bmRpcmVjdGVkIGdyYXBoKSB0aGF0IGlzIGNvbnN0cnVjdGVkIHVzaW5nIG9ubHkgXCJ0aWdodFwiXG4gKiBlZGdlcy5cbiAqL1xuZnVuY3Rpb24gZmVhc2libGVUcmVlKGcpIHtcbiAgdmFyIHQgPSBuZXcgR3JhcGgoeyBkaXJlY3RlZDogZmFsc2UgfSk7XG5cbiAgLy8gQ2hvb3NlIGFyYml0cmFyeSBub2RlIGZyb20gd2hpY2ggdG8gc3RhcnQgb3VyIHRyZWVcbiAgdmFyIHN0YXJ0ID0gZy5ub2RlcygpWzBdO1xuICB2YXIgc2l6ZSA9IGcubm9kZUNvdW50KCk7XG4gIHQuc2V0Tm9kZShzdGFydCwge30pO1xuXG4gIHZhciBlZGdlLCBkZWx0YTtcbiAgd2hpbGUgKHRpZ2h0VHJlZSh0LCBnKSA8IHNpemUpIHtcbiAgICBlZGdlID0gZmluZE1pblNsYWNrRWRnZSh0LCBnKTtcbiAgICBkZWx0YSA9IHQuaGFzTm9kZShlZGdlLnYpID8gc2xhY2soZywgZWRnZSkgOiAtc2xhY2soZywgZWRnZSk7XG4gICAgc2hpZnRSYW5rcyh0LCBnLCBkZWx0YSk7XG4gIH1cblxuICByZXR1cm4gdDtcbn1cblxuLypcbiAqIEZpbmRzIGEgbWF4aW1hbCB0cmVlIG9mIHRpZ2h0IGVkZ2VzIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlXG4gKiB0cmVlLlxuICovXG5mdW5jdGlvbiB0aWdodFRyZWUodCwgZykge1xuICBmdW5jdGlvbiBkZnModikge1xuICAgIF8uZm9yRWFjaChnLm5vZGVFZGdlcyh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgdmFyIGVkZ2VWID0gZS52LFxuICAgICAgICB3ID0gKHYgPT09IGVkZ2VWKSA/IGUudyA6IGVkZ2VWO1xuICAgICAgaWYgKCF0Lmhhc05vZGUodykgJiYgIXNsYWNrKGcsIGUpKSB7XG4gICAgICAgIHQuc2V0Tm9kZSh3LCB7fSk7XG4gICAgICAgIHQuc2V0RWRnZSh2LCB3LCB7fSk7XG4gICAgICAgIGRmcyh3KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF8uZm9yRWFjaCh0Lm5vZGVzKCksIGRmcyk7XG4gIHJldHVybiB0Lm5vZGVDb3VudCgpO1xufVxuXG4vKlxuICogRmluZHMgdGhlIGVkZ2Ugd2l0aCB0aGUgc21hbGxlc3Qgc2xhY2sgdGhhdCBpcyBpbmNpZGVudCBvbiB0cmVlIGFuZCByZXR1cm5zXG4gKiBpdC5cbiAqL1xuZnVuY3Rpb24gZmluZE1pblNsYWNrRWRnZSh0LCBnKSB7XG4gIHJldHVybiBfLm1pbkJ5KGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIGlmICh0Lmhhc05vZGUoZS52KSAhPT0gdC5oYXNOb2RlKGUudykpIHtcbiAgICAgIHJldHVybiBzbGFjayhnLCBlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzaGlmdFJhbmtzKHQsIGcsIGRlbHRhKSB7XG4gIF8uZm9yRWFjaCh0Lm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBnLm5vZGUodikucmFuayArPSBkZWx0YTtcbiAgfSk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHJhbmtVdGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcbnZhciBsb25nZXN0UGF0aCA9IHJhbmtVdGlsLmxvbmdlc3RQYXRoO1xudmFyIGZlYXNpYmxlVHJlZSA9IHJlcXVpcmUoXCIuL2ZlYXNpYmxlLXRyZWVcIik7XG52YXIgbmV0d29ya1NpbXBsZXggPSByZXF1aXJlKFwiLi9uZXR3b3JrLXNpbXBsZXhcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gcmFuaztcblxuLypcbiAqIEFzc2lnbnMgYSByYW5rIHRvIGVhY2ggbm9kZSBpbiB0aGUgaW5wdXQgZ3JhcGggdGhhdCByZXNwZWN0cyB0aGUgXCJtaW5sZW5cIlxuICogY29uc3RyYWludCBzcGVjaWZpZWQgb24gZWRnZXMgYmV0d2VlbiBub2Rlcy5cbiAqXG4gKiBUaGlzIGJhc2ljIHN0cnVjdHVyZSBpcyBkZXJpdmVkIGZyb20gR2Fuc25lciwgZXQgYWwuLCBcIkEgVGVjaG5pcXVlIGZvclxuICogRHJhd2luZyBEaXJlY3RlZCBHcmFwaHMuXCJcbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBHcmFwaCBtdXN0IGJlIGEgY29ubmVjdGVkIERBR1xuICogICAgMi4gR3JhcGggbm9kZXMgbXVzdCBiZSBvYmplY3RzXG4gKiAgICAzLiBHcmFwaCBlZGdlcyBtdXN0IGhhdmUgXCJ3ZWlnaHRcIiBhbmQgXCJtaW5sZW5cIiBhdHRyaWJ1dGVzXG4gKlxuICogUG9zdC1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEdyYXBoIG5vZGVzIHdpbGwgaGF2ZSBhIFwicmFua1wiIGF0dHJpYnV0ZSBiYXNlZCBvbiB0aGUgcmVzdWx0cyBvZiB0aGVcbiAqICAgICAgIGFsZ29yaXRobS4gUmFua3MgY2FuIHN0YXJ0IGF0IGFueSBpbmRleCAoaW5jbHVkaW5nIG5lZ2F0aXZlKSwgd2UnbGxcbiAqICAgICAgIGZpeCB0aGVtIHVwIGxhdGVyLlxuICovXG5mdW5jdGlvbiByYW5rKGcpIHtcbiAgc3dpdGNoKGcuZ3JhcGgoKS5yYW5rZXIpIHtcbiAgY2FzZSBcIm5ldHdvcmstc2ltcGxleFwiOiBuZXR3b3JrU2ltcGxleFJhbmtlcihnKTsgYnJlYWs7XG4gIGNhc2UgXCJ0aWdodC10cmVlXCI6IHRpZ2h0VHJlZVJhbmtlcihnKTsgYnJlYWs7XG4gIGNhc2UgXCJsb25nZXN0LXBhdGhcIjogbG9uZ2VzdFBhdGhSYW5rZXIoZyk7IGJyZWFrO1xuICBkZWZhdWx0OiBuZXR3b3JrU2ltcGxleFJhbmtlcihnKTtcbiAgfVxufVxuXG4vLyBBIGZhc3QgYW5kIHNpbXBsZSByYW5rZXIsIGJ1dCByZXN1bHRzIGFyZSBmYXIgZnJvbSBvcHRpbWFsLlxudmFyIGxvbmdlc3RQYXRoUmFua2VyID0gbG9uZ2VzdFBhdGg7XG5cbmZ1bmN0aW9uIHRpZ2h0VHJlZVJhbmtlcihnKSB7XG4gIGxvbmdlc3RQYXRoKGcpO1xuICBmZWFzaWJsZVRyZWUoZyk7XG59XG5cbmZ1bmN0aW9uIG5ldHdvcmtTaW1wbGV4UmFua2VyKGcpIHtcbiAgbmV0d29ya1NpbXBsZXgoZyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIGZlYXNpYmxlVHJlZSA9IHJlcXVpcmUoXCIuL2ZlYXNpYmxlLXRyZWVcIik7XG52YXIgc2xhY2sgPSByZXF1aXJlKFwiLi91dGlsXCIpLnNsYWNrO1xudmFyIGluaXRSYW5rID0gcmVxdWlyZShcIi4vdXRpbFwiKS5sb25nZXN0UGF0aDtcbnZhciBwcmVvcmRlciA9IHJlcXVpcmUoXCIuLi9ncmFwaGxpYlwiKS5hbGcucHJlb3JkZXI7XG52YXIgcG9zdG9yZGVyID0gcmVxdWlyZShcIi4uL2dyYXBobGliXCIpLmFsZy5wb3N0b3JkZXI7XG52YXIgc2ltcGxpZnkgPSByZXF1aXJlKFwiLi4vdXRpbFwiKS5zaW1wbGlmeTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXR3b3JrU2ltcGxleDtcblxuLy8gRXhwb3NlIHNvbWUgaW50ZXJuYWxzIGZvciB0ZXN0aW5nIHB1cnBvc2VzXG5uZXR3b3JrU2ltcGxleC5pbml0TG93TGltVmFsdWVzID0gaW5pdExvd0xpbVZhbHVlcztcbm5ldHdvcmtTaW1wbGV4LmluaXRDdXRWYWx1ZXMgPSBpbml0Q3V0VmFsdWVzO1xubmV0d29ya1NpbXBsZXguY2FsY0N1dFZhbHVlID0gY2FsY0N1dFZhbHVlO1xubmV0d29ya1NpbXBsZXgubGVhdmVFZGdlID0gbGVhdmVFZGdlO1xubmV0d29ya1NpbXBsZXguZW50ZXJFZGdlID0gZW50ZXJFZGdlO1xubmV0d29ya1NpbXBsZXguZXhjaGFuZ2VFZGdlcyA9IGV4Y2hhbmdlRWRnZXM7XG5cbi8qXG4gKiBUaGUgbmV0d29yayBzaW1wbGV4IGFsZ29yaXRobSBhc3NpZ25zIHJhbmtzIHRvIGVhY2ggbm9kZSBpbiB0aGUgaW5wdXQgZ3JhcGhcbiAqIGFuZCBpdGVyYXRpdmVseSBpbXByb3ZlcyB0aGUgcmFua2luZyB0byByZWR1Y2UgdGhlIGxlbmd0aCBvZiBlZGdlcy5cbiAqXG4gKiBQcmVjb25kaXRpb25zOlxuICpcbiAqICAgIDEuIFRoZSBpbnB1dCBncmFwaCBtdXN0IGJlIGEgREFHLlxuICogICAgMi4gQWxsIG5vZGVzIGluIHRoZSBncmFwaCBtdXN0IGhhdmUgYW4gb2JqZWN0IHZhbHVlLlxuICogICAgMy4gQWxsIGVkZ2VzIGluIHRoZSBncmFwaCBtdXN0IGhhdmUgXCJtaW5sZW5cIiBhbmQgXCJ3ZWlnaHRcIiBhdHRyaWJ1dGVzLlxuICpcbiAqIFBvc3Rjb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEFsbCBub2RlcyBpbiB0aGUgZ3JhcGggd2lsbCBoYXZlIGFuIGFzc2lnbmVkIFwicmFua1wiIGF0dHJpYnV0ZSB0aGF0IGhhc1xuICogICAgICAgYmVlbiBvcHRpbWl6ZWQgYnkgdGhlIG5ldHdvcmsgc2ltcGxleCBhbGdvcml0aG0uIFJhbmtzIHN0YXJ0IGF0IDAuXG4gKlxuICpcbiAqIEEgcm91Z2ggc2tldGNoIG9mIHRoZSBhbGdvcml0aG0gaXMgYXMgZm9sbG93czpcbiAqXG4gKiAgICAxLiBBc3NpZ24gaW5pdGlhbCByYW5rcyB0byBlYWNoIG5vZGUuIFdlIHVzZSB0aGUgbG9uZ2VzdCBwYXRoIGFsZ29yaXRobSxcbiAqICAgICAgIHdoaWNoIGFzc2lnbnMgcmFua3MgdG8gdGhlIGxvd2VzdCBwb3NpdGlvbiBwb3NzaWJsZS4gSW4gZ2VuZXJhbCB0aGlzXG4gKiAgICAgICBsZWFkcyB0byB2ZXJ5IHdpZGUgYm90dG9tIHJhbmtzIGFuZCB1bm5lY2Vzc2FyaWx5IGxvbmcgZWRnZXMuXG4gKiAgICAyLiBDb25zdHJ1Y3QgYSBmZWFzaWJsZSB0aWdodCB0cmVlLiBBIHRpZ2h0IHRyZWUgaXMgb25lIHN1Y2ggdGhhdCBhbGxcbiAqICAgICAgIGVkZ2VzIGluIHRoZSB0cmVlIGhhdmUgbm8gc2xhY2sgKGRpZmZlcmVuY2UgYmV0d2VlbiBsZW5ndGggb2YgZWRnZVxuICogICAgICAgYW5kIG1pbmxlbiBmb3IgdGhlIGVkZ2UpLiBUaGlzIGJ5IGl0c2VsZiBncmVhdGx5IGltcHJvdmVzIHRoZSBhc3NpZ25lZFxuICogICAgICAgcmFua2luZ3MgYnkgc2hvcnRpbmcgZWRnZXMuXG4gKiAgICAzLiBJdGVyYXRpdmVseSBmaW5kIGVkZ2VzIHRoYXQgaGF2ZSBuZWdhdGl2ZSBjdXQgdmFsdWVzLiBHZW5lcmFsbHkgYVxuICogICAgICAgbmVnYXRpdmUgY3V0IHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSBlZGdlIGNvdWxkIGJlIHJlbW92ZWQgYW5kIGEgbmV3XG4gKiAgICAgICB0cmVlIGVkZ2UgY291bGQgYmUgYWRkZWQgdG8gcHJvZHVjZSBhIG1vcmUgY29tcGFjdCBncmFwaC5cbiAqXG4gKiBNdWNoIG9mIHRoZSBhbGdvcml0aG1zIGhlcmUgYXJlIGRlcml2ZWQgZnJvbSBHYW5zbmVyLCBldCBhbC4sIFwiQSBUZWNobmlxdWVcbiAqIGZvciBEcmF3aW5nIERpcmVjdGVkIEdyYXBocy5cIiBUaGUgc3RydWN0dXJlIG9mIHRoZSBmaWxlIHJvdWdobHkgZm9sbG93cyB0aGVcbiAqIHN0cnVjdHVyZSBvZiB0aGUgb3ZlcmFsbCBhbGdvcml0aG0uXG4gKi9cbmZ1bmN0aW9uIG5ldHdvcmtTaW1wbGV4KGcpIHtcbiAgZyA9IHNpbXBsaWZ5KGcpO1xuICBpbml0UmFuayhnKTtcbiAgdmFyIHQgPSBmZWFzaWJsZVRyZWUoZyk7XG4gIGluaXRMb3dMaW1WYWx1ZXModCk7XG4gIGluaXRDdXRWYWx1ZXModCwgZyk7XG5cbiAgdmFyIGUsIGY7XG4gIHdoaWxlICgoZSA9IGxlYXZlRWRnZSh0KSkpIHtcbiAgICBmID0gZW50ZXJFZGdlKHQsIGcsIGUpO1xuICAgIGV4Y2hhbmdlRWRnZXModCwgZywgZSwgZik7XG4gIH1cbn1cblxuLypcbiAqIEluaXRpYWxpemVzIGN1dCB2YWx1ZXMgZm9yIGFsbCBlZGdlcyBpbiB0aGUgdHJlZS5cbiAqL1xuZnVuY3Rpb24gaW5pdEN1dFZhbHVlcyh0LCBnKSB7XG4gIHZhciB2cyA9IHBvc3RvcmRlcih0LCB0Lm5vZGVzKCkpO1xuICB2cyA9IHZzLnNsaWNlKDAsIHZzLmxlbmd0aCAtIDEpO1xuICBfLmZvckVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICBhc3NpZ25DdXRWYWx1ZSh0LCBnLCB2KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFzc2lnbkN1dFZhbHVlKHQsIGcsIGNoaWxkKSB7XG4gIHZhciBjaGlsZExhYiA9IHQubm9kZShjaGlsZCk7XG4gIHZhciBwYXJlbnQgPSBjaGlsZExhYi5wYXJlbnQ7XG4gIHQuZWRnZShjaGlsZCwgcGFyZW50KS5jdXR2YWx1ZSA9IGNhbGNDdXRWYWx1ZSh0LCBnLCBjaGlsZCk7XG59XG5cbi8qXG4gKiBHaXZlbiB0aGUgdGlnaHQgdHJlZSwgaXRzIGdyYXBoLCBhbmQgYSBjaGlsZCBpbiB0aGUgZ3JhcGggY2FsY3VsYXRlIGFuZFxuICogcmV0dXJuIHRoZSBjdXQgdmFsdWUgZm9yIHRoZSBlZGdlIGJldHdlZW4gdGhlIGNoaWxkIGFuZCBpdHMgcGFyZW50LlxuICovXG5mdW5jdGlvbiBjYWxjQ3V0VmFsdWUodCwgZywgY2hpbGQpIHtcbiAgdmFyIGNoaWxkTGFiID0gdC5ub2RlKGNoaWxkKTtcbiAgdmFyIHBhcmVudCA9IGNoaWxkTGFiLnBhcmVudDtcbiAgLy8gVHJ1ZSBpZiB0aGUgY2hpbGQgaXMgb24gdGhlIHRhaWwgZW5kIG9mIHRoZSBlZGdlIGluIHRoZSBkaXJlY3RlZCBncmFwaFxuICB2YXIgY2hpbGRJc1RhaWwgPSB0cnVlO1xuICAvLyBUaGUgZ3JhcGgncyB2aWV3IG9mIHRoZSB0cmVlIGVkZ2Ugd2UncmUgaW5zcGVjdGluZ1xuICB2YXIgZ3JhcGhFZGdlID0gZy5lZGdlKGNoaWxkLCBwYXJlbnQpO1xuICAvLyBUaGUgYWNjdW11bGF0ZWQgY3V0IHZhbHVlIGZvciB0aGUgZWRnZSBiZXR3ZWVuIHRoaXMgbm9kZSBhbmQgaXRzIHBhcmVudFxuICB2YXIgY3V0VmFsdWUgPSAwO1xuXG4gIGlmICghZ3JhcGhFZGdlKSB7XG4gICAgY2hpbGRJc1RhaWwgPSBmYWxzZTtcbiAgICBncmFwaEVkZ2UgPSBnLmVkZ2UocGFyZW50LCBjaGlsZCk7XG4gIH1cblxuICBjdXRWYWx1ZSA9IGdyYXBoRWRnZS53ZWlnaHQ7XG5cbiAgXy5mb3JFYWNoKGcubm9kZUVkZ2VzKGNoaWxkKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBpc091dEVkZ2UgPSBlLnYgPT09IGNoaWxkLFxuICAgICAgb3RoZXIgPSBpc091dEVkZ2UgPyBlLncgOiBlLnY7XG5cbiAgICBpZiAob3RoZXIgIT09IHBhcmVudCkge1xuICAgICAgdmFyIHBvaW50c1RvSGVhZCA9IGlzT3V0RWRnZSA9PT0gY2hpbGRJc1RhaWwsXG4gICAgICAgIG90aGVyV2VpZ2h0ID0gZy5lZGdlKGUpLndlaWdodDtcblxuICAgICAgY3V0VmFsdWUgKz0gcG9pbnRzVG9IZWFkID8gb3RoZXJXZWlnaHQgOiAtb3RoZXJXZWlnaHQ7XG4gICAgICBpZiAoaXNUcmVlRWRnZSh0LCBjaGlsZCwgb3RoZXIpKSB7XG4gICAgICAgIHZhciBvdGhlckN1dFZhbHVlID0gdC5lZGdlKGNoaWxkLCBvdGhlcikuY3V0dmFsdWU7XG4gICAgICAgIGN1dFZhbHVlICs9IHBvaW50c1RvSGVhZCA/IC1vdGhlckN1dFZhbHVlIDogb3RoZXJDdXRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBjdXRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gaW5pdExvd0xpbVZhbHVlcyh0cmVlLCByb290KSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHJvb3QgPSB0cmVlLm5vZGVzKClbMF07XG4gIH1cbiAgZGZzQXNzaWduTG93TGltKHRyZWUsIHt9LCAxLCByb290KTtcbn1cblxuZnVuY3Rpb24gZGZzQXNzaWduTG93TGltKHRyZWUsIHZpc2l0ZWQsIG5leHRMaW0sIHYsIHBhcmVudCkge1xuICB2YXIgbG93ID0gbmV4dExpbTtcbiAgdmFyIGxhYmVsID0gdHJlZS5ub2RlKHYpO1xuXG4gIHZpc2l0ZWRbdl0gPSB0cnVlO1xuICBfLmZvckVhY2godHJlZS5uZWlnaGJvcnModiksIGZ1bmN0aW9uKHcpIHtcbiAgICBpZiAoIV8uaGFzKHZpc2l0ZWQsIHcpKSB7XG4gICAgICBuZXh0TGltID0gZGZzQXNzaWduTG93TGltKHRyZWUsIHZpc2l0ZWQsIG5leHRMaW0sIHcsIHYpO1xuICAgIH1cbiAgfSk7XG5cbiAgbGFiZWwubG93ID0gbG93O1xuICBsYWJlbC5saW0gPSBuZXh0TGltKys7XG4gIGlmIChwYXJlbnQpIHtcbiAgICBsYWJlbC5wYXJlbnQgPSBwYXJlbnQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gVE9ETyBzaG91bGQgYmUgYWJsZSB0byByZW1vdmUgdGhpcyB3aGVuIHdlIGluY3JlbWVudGFsbHkgdXBkYXRlIGxvdyBsaW1cbiAgICBkZWxldGUgbGFiZWwucGFyZW50O1xuICB9XG5cbiAgcmV0dXJuIG5leHRMaW07XG59XG5cbmZ1bmN0aW9uIGxlYXZlRWRnZSh0cmVlKSB7XG4gIHJldHVybiBfLmZpbmQodHJlZS5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgcmV0dXJuIHRyZWUuZWRnZShlKS5jdXR2YWx1ZSA8IDA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlbnRlckVkZ2UodCwgZywgZWRnZSkge1xuICB2YXIgdiA9IGVkZ2UudjtcbiAgdmFyIHcgPSBlZGdlLnc7XG5cbiAgLy8gRm9yIHRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gd2UgYXNzdW1lIHRoYXQgdiBpcyB0aGUgdGFpbCBhbmQgdyBpcyB0aGVcbiAgLy8gaGVhZCwgc28gaWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIGVkZ2UgaW4gdGhlIGdyYXBoIHdlIHNob3VsZCBmbGlwIGl0IHRvXG4gIC8vIG1hdGNoIHRoZSBjb3JyZWN0IG9yaWVudGF0aW9uLlxuICBpZiAoIWcuaGFzRWRnZSh2LCB3KSkge1xuICAgIHYgPSBlZGdlLnc7XG4gICAgdyA9IGVkZ2UudjtcbiAgfVxuXG4gIHZhciB2TGFiZWwgPSB0Lm5vZGUodik7XG4gIHZhciB3TGFiZWwgPSB0Lm5vZGUodyk7XG4gIHZhciB0YWlsTGFiZWwgPSB2TGFiZWw7XG4gIHZhciBmbGlwID0gZmFsc2U7XG5cbiAgLy8gSWYgdGhlIHJvb3QgaXMgaW4gdGhlIHRhaWwgb2YgdGhlIGVkZ2UgdGhlbiB3ZSBuZWVkIHRvIGZsaXAgdGhlIGxvZ2ljIHRoYXRcbiAgLy8gY2hlY2tzIGZvciB0aGUgaGVhZCBhbmQgdGFpbCBub2RlcyBpbiB0aGUgY2FuZGlkYXRlcyBmdW5jdGlvbiBiZWxvdy5cbiAgaWYgKHZMYWJlbC5saW0gPiB3TGFiZWwubGltKSB7XG4gICAgdGFpbExhYmVsID0gd0xhYmVsO1xuICAgIGZsaXAgPSB0cnVlO1xuICB9XG5cbiAgdmFyIGNhbmRpZGF0ZXMgPSBfLmZpbHRlcihnLmVkZ2VzKCksIGZ1bmN0aW9uKGVkZ2UpIHtcbiAgICByZXR1cm4gZmxpcCA9PT0gaXNEZXNjZW5kYW50KHQsIHQubm9kZShlZGdlLnYpLCB0YWlsTGFiZWwpICYmXG4gICAgICAgICAgIGZsaXAgIT09IGlzRGVzY2VuZGFudCh0LCB0Lm5vZGUoZWRnZS53KSwgdGFpbExhYmVsKTtcbiAgfSk7XG5cbiAgcmV0dXJuIF8ubWluQnkoY2FuZGlkYXRlcywgZnVuY3Rpb24oZWRnZSkgeyByZXR1cm4gc2xhY2soZywgZWRnZSk7IH0pO1xufVxuXG5mdW5jdGlvbiBleGNoYW5nZUVkZ2VzKHQsIGcsIGUsIGYpIHtcbiAgdmFyIHYgPSBlLnY7XG4gIHZhciB3ID0gZS53O1xuICB0LnJlbW92ZUVkZ2Uodiwgdyk7XG4gIHQuc2V0RWRnZShmLnYsIGYudywge30pO1xuICBpbml0TG93TGltVmFsdWVzKHQpO1xuICBpbml0Q3V0VmFsdWVzKHQsIGcpO1xuICB1cGRhdGVSYW5rcyh0LCBnKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUmFua3ModCwgZykge1xuICB2YXIgcm9vdCA9IF8uZmluZCh0Lm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgcmV0dXJuICFnLm5vZGUodikucGFyZW50OyB9KTtcbiAgdmFyIHZzID0gcHJlb3JkZXIodCwgcm9vdCk7XG4gIHZzID0gdnMuc2xpY2UoMSk7XG4gIF8uZm9yRWFjaCh2cywgZnVuY3Rpb24odikge1xuICAgIHZhciBwYXJlbnQgPSB0Lm5vZGUodikucGFyZW50LFxuICAgICAgZWRnZSA9IGcuZWRnZSh2LCBwYXJlbnQpLFxuICAgICAgZmxpcHBlZCA9IGZhbHNlO1xuXG4gICAgaWYgKCFlZGdlKSB7XG4gICAgICBlZGdlID0gZy5lZGdlKHBhcmVudCwgdik7XG4gICAgICBmbGlwcGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBnLm5vZGUodikucmFuayA9IGcubm9kZShwYXJlbnQpLnJhbmsgKyAoZmxpcHBlZCA/IGVkZ2UubWlubGVuIDogLWVkZ2UubWlubGVuKTtcbiAgfSk7XG59XG5cbi8qXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVkZ2UgaXMgaW4gdGhlIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIGlzVHJlZUVkZ2UodHJlZSwgdSwgdikge1xuICByZXR1cm4gdHJlZS5oYXNFZGdlKHUsIHYpO1xufVxuXG4vKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBkZXNjZW5kYW50IG9mIHRoZSByb290IG5vZGUgcGVyIHRoZVxuICogYXNzaWduZWQgbG93IGFuZCBsaW0gYXR0cmlidXRlcyBpbiB0aGUgdHJlZS5cbiAqL1xuZnVuY3Rpb24gaXNEZXNjZW5kYW50KHRyZWUsIHZMYWJlbCwgcm9vdExhYmVsKSB7XG4gIHJldHVybiByb290TGFiZWwubG93IDw9IHZMYWJlbC5saW0gJiYgdkxhYmVsLmxpbSA8PSByb290TGFiZWwubGltO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGxvbmdlc3RQYXRoOiBsb25nZXN0UGF0aCxcbiAgc2xhY2s6IHNsYWNrXG59O1xuXG4vKlxuICogSW5pdGlhbGl6ZXMgcmFua3MgZm9yIHRoZSBpbnB1dCBncmFwaCB1c2luZyB0aGUgbG9uZ2VzdCBwYXRoIGFsZ29yaXRobS4gVGhpc1xuICogYWxnb3JpdGhtIHNjYWxlcyB3ZWxsIGFuZCBpcyBmYXN0IGluIHByYWN0aWNlLCBpdCB5aWVsZHMgcmF0aGVyIHBvb3JcbiAqIHNvbHV0aW9ucy4gTm9kZXMgYXJlIHB1c2hlZCB0byB0aGUgbG93ZXN0IGxheWVyIHBvc3NpYmxlLCBsZWF2aW5nIHRoZSBib3R0b21cbiAqIHJhbmtzIHdpZGUgYW5kIGxlYXZpbmcgZWRnZXMgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LiBIb3dldmVyLCBkdWUgdG8gaXRzXG4gKiBzcGVlZCwgdGhpcyBhbGdvcml0aG0gaXMgZ29vZCBmb3IgZ2V0dGluZyBhbiBpbml0aWFsIHJhbmtpbmcgdGhhdCBjYW4gYmUgZmVkXG4gKiBpbnRvIG90aGVyIGFsZ29yaXRobXMuXG4gKlxuICogVGhpcyBhbGdvcml0aG0gZG9lcyBub3Qgbm9ybWFsaXplIGxheWVycyBiZWNhdXNlIGl0IHdpbGwgYmUgdXNlZCBieSBvdGhlclxuICogYWxnb3JpdGhtcyBpbiBtb3N0IGNhc2VzLiBJZiB1c2luZyB0aGlzIGFsZ29yaXRobSBkaXJlY3RseSwgYmUgc3VyZSB0b1xuICogcnVuIG5vcm1hbGl6ZSBhdCB0aGUgZW5kLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIElucHV0IGdyYXBoIGlzIGEgREFHLlxuICogICAgMi4gSW5wdXQgZ3JhcGggbm9kZSBsYWJlbHMgY2FuIGJlIGFzc2lnbmVkIHByb3BlcnRpZXMuXG4gKlxuICogUG9zdC1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEVhY2ggbm9kZSB3aWxsIGJlIGFzc2lnbiBhbiAodW5ub3JtYWxpemVkKSBcInJhbmtcIiBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gbG9uZ2VzdFBhdGgoZykge1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuXG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgdmFyIGxhYmVsID0gZy5ub2RlKHYpO1xuICAgIGlmIChfLmhhcyh2aXNpdGVkLCB2KSkge1xuICAgICAgcmV0dXJuIGxhYmVsLnJhbms7XG4gICAgfVxuICAgIHZpc2l0ZWRbdl0gPSB0cnVlO1xuXG4gICAgdmFyIHJhbmsgPSBfLm1pbihfLm1hcChnLm91dEVkZ2VzKHYpLCBmdW5jdGlvbihlKSB7XG4gICAgICByZXR1cm4gZGZzKGUudykgLSBnLmVkZ2UoZSkubWlubGVuO1xuICAgIH0pKTtcblxuICAgIGlmIChyYW5rID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgfHwgLy8gcmV0dXJuIHZhbHVlIG9mIF8ubWFwKFtdKSBmb3IgTG9kYXNoIDNcbiAgICAgICAgcmFuayA9PT0gdW5kZWZpbmVkIHx8IC8vIHJldHVybiB2YWx1ZSBvZiBfLm1hcChbXSkgZm9yIExvZGFzaCA0XG4gICAgICAgIHJhbmsgPT09IG51bGwpIHsgLy8gcmV0dXJuIHZhbHVlIG9mIF8ubWFwKFtudWxsXSlcbiAgICAgIHJhbmsgPSAwO1xuICAgIH1cblxuICAgIHJldHVybiAobGFiZWwucmFuayA9IHJhbmspO1xuICB9XG5cbiAgXy5mb3JFYWNoKGcuc291cmNlcygpLCBkZnMpO1xufVxuXG4vKlxuICogUmV0dXJucyB0aGUgYW1vdW50IG9mIHNsYWNrIGZvciB0aGUgZ2l2ZW4gZWRnZS4gVGhlIHNsYWNrIGlzIGRlZmluZWQgYXMgdGhlXG4gKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGxlbmd0aCBvZiB0aGUgZWRnZSBhbmQgaXRzIG1pbmltdW0gbGVuZ3RoLlxuICovXG5mdW5jdGlvbiBzbGFjayhnLCBlKSB7XG4gIHJldHVybiBnLm5vZGUoZS53KS5yYW5rIC0gZy5ub2RlKGUudikucmFuayAtIGcuZWRnZShlKS5taW5sZW47XG59XG4iLCIvKiBlc2xpbnQgXCJuby1jb25zb2xlXCI6IG9mZiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaGxpYlwiKS5HcmFwaDtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFkZER1bW15Tm9kZTogYWRkRHVtbXlOb2RlLFxuICBzaW1wbGlmeTogc2ltcGxpZnksXG4gIGFzTm9uQ29tcG91bmRHcmFwaDogYXNOb25Db21wb3VuZEdyYXBoLFxuICBzdWNjZXNzb3JXZWlnaHRzOiBzdWNjZXNzb3JXZWlnaHRzLFxuICBwcmVkZWNlc3NvcldlaWdodHM6IHByZWRlY2Vzc29yV2VpZ2h0cyxcbiAgaW50ZXJzZWN0UmVjdDogaW50ZXJzZWN0UmVjdCxcbiAgYnVpbGRMYXllck1hdHJpeDogYnVpbGRMYXllck1hdHJpeCxcbiAgbm9ybWFsaXplUmFua3M6IG5vcm1hbGl6ZVJhbmtzLFxuICByZW1vdmVFbXB0eVJhbmtzOiByZW1vdmVFbXB0eVJhbmtzLFxuICBhZGRCb3JkZXJOb2RlOiBhZGRCb3JkZXJOb2RlLFxuICBtYXhSYW5rOiBtYXhSYW5rLFxuICBwYXJ0aXRpb246IHBhcnRpdGlvbixcbiAgdGltZTogdGltZSxcbiAgbm90aW1lOiBub3RpbWVcbn07XG5cbi8qXG4gKiBBZGRzIGEgZHVtbXkgbm9kZSB0byB0aGUgZ3JhcGggYW5kIHJldHVybiB2LlxuICovXG5mdW5jdGlvbiBhZGREdW1teU5vZGUoZywgdHlwZSwgYXR0cnMsIG5hbWUpIHtcbiAgdmFyIHY7XG4gIGRvIHtcbiAgICB2ID0gXy51bmlxdWVJZChuYW1lKTtcbiAgfSB3aGlsZSAoZy5oYXNOb2RlKHYpKTtcblxuICBhdHRycy5kdW1teSA9IHR5cGU7XG4gIGcuc2V0Tm9kZSh2LCBhdHRycyk7XG4gIHJldHVybiB2O1xufVxuXG4vKlxuICogUmV0dXJucyBhIG5ldyBncmFwaCB3aXRoIG9ubHkgc2ltcGxlIGVkZ2VzLiBIYW5kbGVzIGFnZ3JlZ2F0aW9uIG9mIGRhdGFcbiAqIGFzc29jaWF0ZWQgd2l0aCBtdWx0aS1lZGdlcy5cbiAqL1xuZnVuY3Rpb24gc2ltcGxpZnkoZykge1xuICB2YXIgc2ltcGxpZmllZCA9IG5ldyBHcmFwaCgpLnNldEdyYXBoKGcuZ3JhcGgoKSk7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgc2ltcGxpZmllZC5zZXROb2RlKHYsIGcubm9kZSh2KSk7IH0pO1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIHNpbXBsZUxhYmVsID0gc2ltcGxpZmllZC5lZGdlKGUudiwgZS53KSB8fCB7IHdlaWdodDogMCwgbWlubGVuOiAxIH07XG4gICAgdmFyIGxhYmVsID0gZy5lZGdlKGUpO1xuICAgIHNpbXBsaWZpZWQuc2V0RWRnZShlLnYsIGUudywge1xuICAgICAgd2VpZ2h0OiBzaW1wbGVMYWJlbC53ZWlnaHQgKyBsYWJlbC53ZWlnaHQsXG4gICAgICBtaW5sZW46IE1hdGgubWF4KHNpbXBsZUxhYmVsLm1pbmxlbiwgbGFiZWwubWlubGVuKVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHNpbXBsaWZpZWQ7XG59XG5cbmZ1bmN0aW9uIGFzTm9uQ29tcG91bmRHcmFwaChnKSB7XG4gIHZhciBzaW1wbGlmaWVkID0gbmV3IEdyYXBoKHsgbXVsdGlncmFwaDogZy5pc011bHRpZ3JhcGgoKSB9KS5zZXRHcmFwaChnLmdyYXBoKCkpO1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgaWYgKCFnLmNoaWxkcmVuKHYpLmxlbmd0aCkge1xuICAgICAgc2ltcGxpZmllZC5zZXROb2RlKHYsIGcubm9kZSh2KSk7XG4gICAgfVxuICB9KTtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHNpbXBsaWZpZWQuc2V0RWRnZShlLCBnLmVkZ2UoZSkpO1xuICB9KTtcbiAgcmV0dXJuIHNpbXBsaWZpZWQ7XG59XG5cbmZ1bmN0aW9uIHN1Y2Nlc3NvcldlaWdodHMoZykge1xuICB2YXIgd2VpZ2h0TWFwID0gXy5tYXAoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIHN1Y3MgPSB7fTtcbiAgICBfLmZvckVhY2goZy5vdXRFZGdlcyh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgc3Vjc1tlLnddID0gKHN1Y3NbZS53XSB8fCAwKSArIGcuZWRnZShlKS53ZWlnaHQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN1Y3M7XG4gIH0pO1xuICByZXR1cm4gXy56aXBPYmplY3QoZy5ub2RlcygpLCB3ZWlnaHRNYXApO1xufVxuXG5mdW5jdGlvbiBwcmVkZWNlc3NvcldlaWdodHMoZykge1xuICB2YXIgd2VpZ2h0TWFwID0gXy5tYXAoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIHByZWRzID0ge307XG4gICAgXy5mb3JFYWNoKGcuaW5FZGdlcyh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgcHJlZHNbZS52XSA9IChwcmVkc1tlLnZdIHx8IDApICsgZy5lZGdlKGUpLndlaWdodDtcbiAgICB9KTtcbiAgICByZXR1cm4gcHJlZHM7XG4gIH0pO1xuICByZXR1cm4gXy56aXBPYmplY3QoZy5ub2RlcygpLCB3ZWlnaHRNYXApO1xufVxuXG4vKlxuICogRmluZHMgd2hlcmUgYSBsaW5lIHN0YXJ0aW5nIGF0IHBvaW50ICh7eCwgeX0pIHdvdWxkIGludGVyc2VjdCBhIHJlY3RhbmdsZVxuICogKHt4LCB5LCB3aWR0aCwgaGVpZ2h0fSkgaWYgaXQgd2VyZSBwb2ludGluZyBhdCB0aGUgcmVjdGFuZ2xlJ3MgY2VudGVyLlxuICovXG5mdW5jdGlvbiBpbnRlcnNlY3RSZWN0KHJlY3QsIHBvaW50KSB7XG4gIHZhciB4ID0gcmVjdC54O1xuICB2YXIgeSA9IHJlY3QueTtcblxuICAvLyBSZWN0YW5nbGUgaW50ZXJzZWN0aW9uIGFsZ29yaXRobSBmcm9tOlxuICAvLyBodHRwOi8vbWF0aC5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMTA4MTEzL2ZpbmQtZWRnZS1iZXR3ZWVuLXR3by1ib3hlc1xuICB2YXIgZHggPSBwb2ludC54IC0geDtcbiAgdmFyIGR5ID0gcG9pbnQueSAtIHk7XG4gIHZhciB3ID0gcmVjdC53aWR0aCAvIDI7XG4gIHZhciBoID0gcmVjdC5oZWlnaHQgLyAyO1xuXG4gIGlmICghZHggJiYgIWR5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IHBvc3NpYmxlIHRvIGZpbmQgaW50ZXJzZWN0aW9uIGluc2lkZSBvZiB0aGUgcmVjdGFuZ2xlXCIpO1xuICB9XG5cbiAgdmFyIHN4LCBzeTtcbiAgaWYgKE1hdGguYWJzKGR5KSAqIHcgPiBNYXRoLmFicyhkeCkgKiBoKSB7XG4gICAgLy8gSW50ZXJzZWN0aW9uIGlzIHRvcCBvciBib3R0b20gb2YgcmVjdC5cbiAgICBpZiAoZHkgPCAwKSB7XG4gICAgICBoID0gLWg7XG4gICAgfVxuICAgIHN4ID0gaCAqIGR4IC8gZHk7XG4gICAgc3kgPSBoO1xuICB9IGVsc2Uge1xuICAgIC8vIEludGVyc2VjdGlvbiBpcyBsZWZ0IG9yIHJpZ2h0IG9mIHJlY3QuXG4gICAgaWYgKGR4IDwgMCkge1xuICAgICAgdyA9IC13O1xuICAgIH1cbiAgICBzeCA9IHc7XG4gICAgc3kgPSB3ICogZHkgLyBkeDtcbiAgfVxuXG4gIHJldHVybiB7IHg6IHggKyBzeCwgeTogeSArIHN5IH07XG59XG5cbi8qXG4gKiBHaXZlbiBhIERBRyB3aXRoIGVhY2ggbm9kZSBhc3NpZ25lZCBcInJhbmtcIiBhbmQgXCJvcmRlclwiIHByb3BlcnRpZXMsIHRoaXNcbiAqIGZ1bmN0aW9uIHdpbGwgcHJvZHVjZSBhIG1hdHJpeCB3aXRoIHRoZSBpZHMgb2YgZWFjaCBub2RlLlxuICovXG5mdW5jdGlvbiBidWlsZExheWVyTWF0cml4KGcpIHtcbiAgdmFyIGxheWVyaW5nID0gXy5tYXAoXy5yYW5nZShtYXhSYW5rKGcpICsgMSksIGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH0pO1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgdmFyIHJhbmsgPSBub2RlLnJhbms7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHJhbmspKSB7XG4gICAgICBsYXllcmluZ1tyYW5rXVtub2RlLm9yZGVyXSA9IHY7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGxheWVyaW5nO1xufVxuXG4vKlxuICogQWRqdXN0cyB0aGUgcmFua3MgZm9yIGFsbCBub2RlcyBpbiB0aGUgZ3JhcGggc3VjaCB0aGF0IGFsbCBub2RlcyB2IGhhdmVcbiAqIHJhbmsodikgPj0gMCBhbmQgYXQgbGVhc3Qgb25lIG5vZGUgdyBoYXMgcmFuayh3KSA9IDAuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJhbmtzKGcpIHtcbiAgdmFyIG1pbiA9IF8ubWluKF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpLnJhbms7IH0pKTtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIGlmIChfLmhhcyhub2RlLCBcInJhbmtcIikpIHtcbiAgICAgIG5vZGUucmFuayAtPSBtaW47XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRW1wdHlSYW5rcyhnKSB7XG4gIC8vIFJhbmtzIG1heSBub3Qgc3RhcnQgYXQgMCwgc28gd2UgbmVlZCB0byBvZmZzZXQgdGhlbVxuICB2YXIgb2Zmc2V0ID0gXy5taW4oXy5tYXAoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodikucmFuazsgfSkpO1xuXG4gIHZhciBsYXllcnMgPSBbXTtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciByYW5rID0gZy5ub2RlKHYpLnJhbmsgLSBvZmZzZXQ7XG4gICAgaWYgKCFsYXllcnNbcmFua10pIHtcbiAgICAgIGxheWVyc1tyYW5rXSA9IFtdO1xuICAgIH1cbiAgICBsYXllcnNbcmFua10ucHVzaCh2KTtcbiAgfSk7XG5cbiAgdmFyIGRlbHRhID0gMDtcbiAgdmFyIG5vZGVSYW5rRmFjdG9yID0gZy5ncmFwaCgpLm5vZGVSYW5rRmFjdG9yO1xuICBfLmZvckVhY2gobGF5ZXJzLCBmdW5jdGlvbih2cywgaSkge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHZzKSAmJiBpICUgbm9kZVJhbmtGYWN0b3IgIT09IDApIHtcbiAgICAgIC0tZGVsdGE7XG4gICAgfSBlbHNlIGlmIChkZWx0YSkge1xuICAgICAgXy5mb3JFYWNoKHZzLCBmdW5jdGlvbih2KSB7IGcubm9kZSh2KS5yYW5rICs9IGRlbHRhOyB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRCb3JkZXJOb2RlKGcsIHByZWZpeCwgcmFuaywgb3JkZXIpIHtcbiAgdmFyIG5vZGUgPSB7XG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwXG4gIH07XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDQpIHtcbiAgICBub2RlLnJhbmsgPSByYW5rO1xuICAgIG5vZGUub3JkZXIgPSBvcmRlcjtcbiAgfVxuICByZXR1cm4gYWRkRHVtbXlOb2RlKGcsIFwiYm9yZGVyXCIsIG5vZGUsIHByZWZpeCk7XG59XG5cbmZ1bmN0aW9uIG1heFJhbmsoZykge1xuICByZXR1cm4gXy5tYXgoXy5tYXAoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIHJhbmsgPSBnLm5vZGUodikucmFuaztcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocmFuaykpIHtcbiAgICAgIHJldHVybiByYW5rO1xuICAgIH1cbiAgfSkpO1xufVxuXG4vKlxuICogUGFydGl0aW9uIGEgY29sbGVjdGlvbiBpbnRvIHR3byBncm91cHM6IGBsaHNgIGFuZCBgcmhzYC4gSWYgdGhlIHN1cHBsaWVkXG4gKiBmdW5jdGlvbiByZXR1cm5zIHRydWUgZm9yIGFuIGVudHJ5IGl0IGdvZXMgaW50byBgbGhzYC4gT3RoZXJ3aXNlIGl0IGdvZXNcbiAqIGludG8gYHJocy5cbiAqL1xuZnVuY3Rpb24gcGFydGl0aW9uKGNvbGxlY3Rpb24sIGZuKSB7XG4gIHZhciByZXN1bHQgPSB7IGxoczogW10sIHJoczogW10gfTtcbiAgXy5mb3JFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaWYgKGZuKHZhbHVlKSkge1xuICAgICAgcmVzdWx0Lmxocy5wdXNoKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnJocy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKlxuICogUmV0dXJucyBhIG5ldyBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmbmAgd2l0aCBhIHRpbWVyLiBUaGUgd3JhcHBlciBsb2dzIHRoZVxuICogdGltZSBpdCB0YWtlcyB0byBleGVjdXRlIHRoZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gdGltZShuYW1lLCBmbikge1xuICB2YXIgc3RhcnQgPSBfLm5vdygpO1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGZpbmFsbHkge1xuICAgIGNvbnNvbGUubG9nKG5hbWUgKyBcIiB0aW1lOiBcIiArIChfLm5vdygpIC0gc3RhcnQpICsgXCJtc1wiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3RpbWUobmFtZSwgZm4pIHtcbiAgcmV0dXJuIGZuKCk7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiMC44LjVcIjtcbiIsIi8qKlxuICogQSBzaW1wbGUgZGVwZW5kZW5jeSBncmFwaFxuICovXG5cbi8qKlxuICogSGVscGVyIGZvciBjcmVhdGluZyBhIFRvcG9sb2dpY2FsIFNvcnQgdXNpbmcgRGVwdGgtRmlyc3QtU2VhcmNoIG9uIGEgc2V0IG9mIGVkZ2VzLlxuICpcbiAqIERldGVjdHMgY3ljbGVzIGFuZCB0aHJvd3MgYW4gRXJyb3IgaWYgb25lIGlzIGRldGVjdGVkICh1bmxlc3MgdGhlIFwiY2lyY3VsYXJcIlxuICogcGFyYW1ldGVyIGlzIFwidHJ1ZVwiIGluIHdoaWNoIGNhc2UgaXQgaWdub3JlcyB0aGVtKS5cbiAqXG4gKiBAcGFyYW0gZWRnZXMgVGhlIHNldCBvZiBlZGdlcyB0byBERlMgdGhyb3VnaFxuICogQHBhcmFtIGxlYXZlc09ubHkgV2hldGhlciB0byBvbmx5IHJldHVybiBcImxlYWZcIiBub2RlcyAob25lcyB3aG8gaGF2ZSBubyBlZGdlcylcbiAqIEBwYXJhbSByZXN1bHQgQW4gYXJyYXkgaW4gd2hpY2ggdGhlIHJlc3VsdHMgd2lsbCBiZSBwb3B1bGF0ZWRcbiAqIEBwYXJhbSBjaXJjdWxhciBBIGJvb2xlYW4gdG8gYWxsb3cgY2lyY3VsYXIgZGVwZW5kZW5jaWVzXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZURGUyhlZGdlcywgbGVhdmVzT25seSwgcmVzdWx0LCBjaXJjdWxhcikge1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuICByZXR1cm4gZnVuY3Rpb24gKHN0YXJ0KSB7XG4gICAgaWYgKHZpc2l0ZWRbc3RhcnRdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBpbkN1cnJlbnRQYXRoID0ge307XG4gICAgdmFyIGN1cnJlbnRQYXRoID0gW107XG4gICAgdmFyIHRvZG8gPSBbXTsgLy8gdXNlZCBhcyBhIHN0YWNrXG4gICAgdG9kby5wdXNoKHsgbm9kZTogc3RhcnQsIHByb2Nlc3NlZDogZmFsc2UgfSk7XG4gICAgd2hpbGUgKHRvZG8ubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSB0b2RvW3RvZG8ubGVuZ3RoIC0gMV07IC8vIHBlZWsgYXQgdGhlIHRvZG8gc3RhY2tcbiAgICAgIHZhciBwcm9jZXNzZWQgPSBjdXJyZW50LnByb2Nlc3NlZDtcbiAgICAgIHZhciBub2RlID0gY3VycmVudC5ub2RlO1xuICAgICAgaWYgKCFwcm9jZXNzZWQpIHtcbiAgICAgICAgLy8gSGF2ZW4ndCB2aXNpdGVkIGVkZ2VzIHlldCAodmlzaXRpbmcgcGhhc2UpXG4gICAgICAgIGlmICh2aXNpdGVkW25vZGVdKSB7XG4gICAgICAgICAgdG9kby5wb3AoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmIChpbkN1cnJlbnRQYXRoW25vZGVdKSB7XG4gICAgICAgICAgLy8gSXQncyBub3QgYSBEQUdcbiAgICAgICAgICBpZiAoY2lyY3VsYXIpIHtcbiAgICAgICAgICAgIHRvZG8ucG9wKCk7XG4gICAgICAgICAgICAvLyBJZiB3ZSdyZSB0b2xlcmF0aW5nIGN5Y2xlcywgZG9uJ3QgcmV2aXNpdCB0aGUgbm9kZVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRQYXRoLnB1c2gobm9kZSk7XG4gICAgICAgICAgdGhyb3cgbmV3IERlcEdyYXBoQ3ljbGVFcnJvcihjdXJyZW50UGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbkN1cnJlbnRQYXRoW25vZGVdID0gdHJ1ZTtcbiAgICAgICAgY3VycmVudFBhdGgucHVzaChub2RlKTtcbiAgICAgICAgdmFyIG5vZGVFZGdlcyA9IGVkZ2VzW25vZGVdO1xuICAgICAgICAvLyAocHVzaCBlZGdlcyBvbnRvIHRoZSB0b2RvIHN0YWNrIGluIHJldmVyc2Ugb3JkZXIgdG8gYmUgb3JkZXItY29tcGF0aWJsZSB3aXRoIHRoZSBvbGQgREZTIGltcGxlbWVudGF0aW9uKVxuICAgICAgICBmb3IgKHZhciBpID0gbm9kZUVkZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgdG9kby5wdXNoKHsgbm9kZTogbm9kZUVkZ2VzW2ldLCBwcm9jZXNzZWQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQucHJvY2Vzc2VkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEhhdmUgdmlzaXRlZCBlZGdlcyAoc3RhY2sgdW5yb2xsaW5nIHBoYXNlKVxuICAgICAgICB0b2RvLnBvcCgpO1xuICAgICAgICBjdXJyZW50UGF0aC5wb3AoKTtcbiAgICAgICAgaW5DdXJyZW50UGF0aFtub2RlXSA9IGZhbHNlO1xuICAgICAgICB2aXNpdGVkW25vZGVdID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFsZWF2ZXNPbmx5IHx8IGVkZ2VzW25vZGVdLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKG5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFNpbXBsZSBEZXBlbmRlbmN5IEdyYXBoXG4gKi9cbnZhciBEZXBHcmFwaCA9IChleHBvcnRzLkRlcEdyYXBoID0gZnVuY3Rpb24gRGVwR3JhcGgob3B0cykge1xuICB0aGlzLm5vZGVzID0ge307IC8vIE5vZGUgLT4gTm9kZS9EYXRhICh0cmVhdGVkIGxpa2UgYSBTZXQpXG4gIHRoaXMub3V0Z29pbmdFZGdlcyA9IHt9OyAvLyBOb2RlIC0+IFtEZXBlbmRlbmN5IE5vZGVdXG4gIHRoaXMuaW5jb21pbmdFZGdlcyA9IHt9OyAvLyBOb2RlIC0+IFtEZXBlbmRhbnQgTm9kZV1cbiAgdGhpcy5jaXJjdWxhciA9IG9wdHMgJiYgISFvcHRzLmNpcmN1bGFyOyAvLyBBbGxvd3MgY2lyY3VsYXIgZGVwc1xufSk7XG5EZXBHcmFwaC5wcm90b3R5cGUgPSB7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBncmFwaC5cbiAgICovXG4gIHNpemU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5ub2RlcykubGVuZ3RoO1xuICB9LFxuICAvKipcbiAgICogQWRkIGEgbm9kZSB0byB0aGUgZGVwZW5kZW5jeSBncmFwaC4gSWYgYSBub2RlIGFscmVhZHkgZXhpc3RzLCB0aGlzIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcuXG4gICAqL1xuICBhZGROb2RlOiBmdW5jdGlvbiAobm9kZSwgZGF0YSkge1xuICAgIGlmICghdGhpcy5oYXNOb2RlKG5vZGUpKSB7XG4gICAgICAvLyBDaGVja2luZyB0aGUgYXJndW1lbnRzIGxlbmd0aCBhbGxvd3MgdGhlIHVzZXIgdG8gYWRkIGEgbm9kZSB3aXRoIHVuZGVmaW5lZCBkYXRhXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICB0aGlzLm5vZGVzW25vZGVdID0gZGF0YTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubm9kZXNbbm9kZV0gPSBub2RlO1xuICAgICAgfVxuICAgICAgdGhpcy5vdXRnb2luZ0VkZ2VzW25vZGVdID0gW107XG4gICAgICB0aGlzLmluY29taW5nRWRnZXNbbm9kZV0gPSBbXTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBub2RlIGZyb20gdGhlIGRlcGVuZGVuY3kgZ3JhcGguIElmIGEgbm9kZSBkb2VzIG5vdCBleGlzdCwgdGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nLlxuICAgKi9cbiAgcmVtb3ZlTm9kZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAodGhpcy5oYXNOb2RlKG5vZGUpKSB7XG4gICAgICBkZWxldGUgdGhpcy5ub2Rlc1tub2RlXTtcbiAgICAgIGRlbGV0ZSB0aGlzLm91dGdvaW5nRWRnZXNbbm9kZV07XG4gICAgICBkZWxldGUgdGhpcy5pbmNvbWluZ0VkZ2VzW25vZGVdO1xuICAgICAgW3RoaXMuaW5jb21pbmdFZGdlcywgdGhpcy5vdXRnb2luZ0VkZ2VzXS5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlTGlzdCkge1xuICAgICAgICBPYmplY3Qua2V5cyhlZGdlTGlzdCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgdmFyIGlkeCA9IGVkZ2VMaXN0W2tleV0uaW5kZXhPZihub2RlKTtcbiAgICAgICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgICAgIGVkZ2VMaXN0W2tleV0uc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbm9kZSBleGlzdHMgaW4gdGhlIGdyYXBoXG4gICAqL1xuICBoYXNOb2RlOiBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiB0aGlzLm5vZGVzLmhhc093blByb3BlcnR5KG5vZGUpO1xuICB9LFxuICAvKipcbiAgICogR2V0IHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIG5vZGUgbmFtZVxuICAgKi9cbiAgZ2V0Tm9kZURhdGE6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXNbbm9kZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgbm9kZSk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogU2V0IHRoZSBhc3NvY2lhdGVkIGRhdGEgZm9yIGEgZ2l2ZW4gbm9kZSBuYW1lLiBJZiB0aGUgbm9kZSBkb2VzIG5vdCBleGlzdCwgdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBlcnJvclxuICAgKi9cbiAgc2V0Tm9kZURhdGE6IGZ1bmN0aW9uIChub2RlLCBkYXRhKSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgdGhpcy5ub2Rlc1tub2RlXSA9IGRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgbm9kZSk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogQWRkIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBub2Rlcy4gSWYgZWl0aGVyIG9mIHRoZSBub2RlcyBkb2VzIG5vdCBleGlzdCxcbiAgICogYW4gRXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gICAqL1xuICBhZGREZXBlbmRlbmN5OiBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcbiAgICBpZiAoIXRoaXMuaGFzTm9kZShmcm9tKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBmcm9tKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmhhc05vZGUodG8pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIHRvKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3V0Z29pbmdFZGdlc1tmcm9tXS5pbmRleE9mKHRvKSA9PT0gLTEpIHtcbiAgICAgIHRoaXMub3V0Z29pbmdFZGdlc1tmcm9tXS5wdXNoKHRvKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW5jb21pbmdFZGdlc1t0b10uaW5kZXhPZihmcm9tKSA9PT0gLTEpIHtcbiAgICAgIHRoaXMuaW5jb21pbmdFZGdlc1t0b10ucHVzaChmcm9tKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBkZXBlbmRlbmN5IGJldHdlZW4gdHdvIG5vZGVzLlxuICAgKi9cbiAgcmVtb3ZlRGVwZW5kZW5jeTogZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gICAgdmFyIGlkeDtcbiAgICBpZiAodGhpcy5oYXNOb2RlKGZyb20pKSB7XG4gICAgICBpZHggPSB0aGlzLm91dGdvaW5nRWRnZXNbZnJvbV0uaW5kZXhPZih0byk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgdGhpcy5vdXRnb2luZ0VkZ2VzW2Zyb21dLnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc05vZGUodG8pKSB7XG4gICAgICBpZHggPSB0aGlzLmluY29taW5nRWRnZXNbdG9dLmluZGV4T2YoZnJvbSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgdGhpcy5pbmNvbWluZ0VkZ2VzW3RvXS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBjbG9uZSBvZiB0aGUgZGVwZW5kZW5jeSBncmFwaC4gSWYgYW55IGN1c3RvbSBkYXRhIGlzIGF0dGFjaGVkXG4gICAqIHRvIHRoZSBub2RlcywgaXQgd2lsbCBvbmx5IGJlIHNoYWxsb3cgY29waWVkLlxuICAgKi9cbiAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc291cmNlID0gdGhpcztcbiAgICB2YXIgcmVzdWx0ID0gbmV3IERlcEdyYXBoKCk7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2Uubm9kZXMpO1xuICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgcmVzdWx0Lm5vZGVzW25dID0gc291cmNlLm5vZGVzW25dO1xuICAgICAgcmVzdWx0Lm91dGdvaW5nRWRnZXNbbl0gPSBzb3VyY2Uub3V0Z29pbmdFZGdlc1tuXS5zbGljZSgwKTtcbiAgICAgIHJlc3VsdC5pbmNvbWluZ0VkZ2VzW25dID0gc291cmNlLmluY29taW5nRWRnZXNbbl0uc2xpY2UoMCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSxcbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBjb250YWluaW5nIHRoZSBkaXJlY3QgZGVwZW5kZW5jaWVzIG9mIHRoZSBzcGVjaWZpZWQgbm9kZS5cbiAgICpcbiAgICogVGhyb3dzIGFuIEVycm9yIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBkb2VzIG5vdCBleGlzdC5cbiAgICovXG4gIGRpcmVjdERlcGVuZGVuY2llc09mOiBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmICh0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm91dGdvaW5nRWRnZXNbbm9kZV0uc2xpY2UoMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgbm9kZSk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogR2V0IGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG5vZGVzIHRoYXQgZGlyZWN0bHkgZGVwZW5kIG9uIHRoZSBzcGVjaWZpZWQgbm9kZS5cbiAgICpcbiAgICogVGhyb3dzIGFuIEVycm9yIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBkb2VzIG5vdCBleGlzdC5cbiAgICovXG4gIGRpcmVjdERlcGVuZGFudHNPZjogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAodGhpcy5oYXNOb2RlKG5vZGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbmNvbWluZ0VkZ2VzW25vZGVdLnNsaWNlKDApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBjb250YWluaW5nIHRoZSBub2RlcyB0aGF0IHRoZSBzcGVjaWZpZWQgbm9kZSBkZXBlbmRzIG9uICh0cmFuc2l0aXZlbHkpLlxuICAgKlxuICAgKiBUaHJvd3MgYW4gRXJyb3IgaWYgdGhlIGdyYXBoIGhhcyBhIGN5Y2xlLCBvciB0aGUgc3BlY2lmaWVkIG5vZGUgZG9lcyBub3QgZXhpc3QuXG4gICAqXG4gICAqIElmIGBsZWF2ZXNPbmx5YCBpcyB0cnVlLCBvbmx5IG5vZGVzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBhbnkgb3RoZXIgbm9kZXMgd2lsbCBiZSByZXR1cm5lZFxuICAgKiBpbiB0aGUgYXJyYXkuXG4gICAqL1xuICBkZXBlbmRlbmNpZXNPZjogZnVuY3Rpb24gKG5vZGUsIGxlYXZlc09ubHkpIHtcbiAgICBpZiAodGhpcy5oYXNOb2RlKG5vZGUpKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICB2YXIgREZTID0gY3JlYXRlREZTKFxuICAgICAgICB0aGlzLm91dGdvaW5nRWRnZXMsXG4gICAgICAgIGxlYXZlc09ubHksXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgdGhpcy5jaXJjdWxhclxuICAgICAgKTtcbiAgICAgIERGUyhub2RlKTtcbiAgICAgIHZhciBpZHggPSByZXN1bHQuaW5kZXhPZihub2RlKTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICByZXN1bHQuc3BsaWNlKGlkeCwgMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIGdldCBhbiBhcnJheSBjb250YWluaW5nIHRoZSBub2RlcyB0aGF0IGRlcGVuZCBvbiB0aGUgc3BlY2lmaWVkIG5vZGUgKHRyYW5zaXRpdmVseSkuXG4gICAqXG4gICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgZ3JhcGggaGFzIGEgY3ljbGUsIG9yIHRoZSBzcGVjaWZpZWQgbm9kZSBkb2VzIG5vdCBleGlzdC5cbiAgICpcbiAgICogSWYgYGxlYXZlc09ubHlgIGlzIHRydWUsIG9ubHkgbm9kZXMgdGhhdCBkbyBub3QgaGF2ZSBhbnkgZGVwZW5kYW50cyB3aWxsIGJlIHJldHVybmVkIGluIHRoZSBhcnJheS5cbiAgICovXG4gIGRlcGVuZGFudHNPZjogZnVuY3Rpb24gKG5vZGUsIGxlYXZlc09ubHkpIHtcbiAgICBpZiAodGhpcy5oYXNOb2RlKG5vZGUpKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICB2YXIgREZTID0gY3JlYXRlREZTKFxuICAgICAgICB0aGlzLmluY29taW5nRWRnZXMsXG4gICAgICAgIGxlYXZlc09ubHksXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgdGhpcy5jaXJjdWxhclxuICAgICAgKTtcbiAgICAgIERGUyhub2RlKTtcbiAgICAgIHZhciBpZHggPSByZXN1bHQuaW5kZXhPZihub2RlKTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICByZXN1bHQuc3BsaWNlKGlkeCwgMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIENvbnN0cnVjdCB0aGUgb3ZlcmFsbCBwcm9jZXNzaW5nIG9yZGVyIGZvciB0aGUgZGVwZW5kZW5jeSBncmFwaC5cbiAgICpcbiAgICogVGhyb3dzIGFuIEVycm9yIGlmIHRoZSBncmFwaCBoYXMgYSBjeWNsZS5cbiAgICpcbiAgICogSWYgYGxlYXZlc09ubHlgIGlzIHRydWUsIG9ubHkgbm9kZXMgdGhhdCBkbyBub3QgZGVwZW5kIG9uIGFueSBvdGhlciBub2RlcyB3aWxsIGJlIHJldHVybmVkLlxuICAgKi9cbiAgb3ZlcmFsbE9yZGVyOiBmdW5jdGlvbiAobGVhdmVzT25seSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLm5vZGVzKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7IC8vIEVtcHR5IGdyYXBoXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghdGhpcy5jaXJjdWxhcikge1xuICAgICAgICAvLyBMb29rIGZvciBjeWNsZXMgLSB3ZSBydW4gdGhlIERGUyBzdGFydGluZyBhdCBhbGwgdGhlIG5vZGVzIGluIGNhc2UgdGhlcmVcbiAgICAgICAgLy8gYXJlIHNldmVyYWwgZGlzY29ubmVjdGVkIHN1YmdyYXBocyBpbnNpZGUgdGhpcyBkZXBlbmRlbmN5IGdyYXBoLlxuICAgICAgICB2YXIgQ3ljbGVERlMgPSBjcmVhdGVERlModGhpcy5vdXRnb2luZ0VkZ2VzLCBmYWxzZSwgW10sIHRoaXMuY2lyY3VsYXIpO1xuICAgICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICBDeWNsZURGUyhuKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBERlMgPSBjcmVhdGVERlMoXG4gICAgICAgIHRoaXMub3V0Z29pbmdFZGdlcyxcbiAgICAgICAgbGVhdmVzT25seSxcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICB0aGlzLmNpcmN1bGFyXG4gICAgICApO1xuICAgICAgLy8gRmluZCBhbGwgcG90ZW50aWFsIHN0YXJ0aW5nIHBvaW50cyAobm9kZXMgd2l0aCBub3RoaW5nIGRlcGVuZGluZyBvbiB0aGVtKSBhblxuICAgICAgLy8gcnVuIGEgREZTIHN0YXJ0aW5nIGF0IHRoZXNlIHBvaW50cyB0byBnZXQgdGhlIG9yZGVyXG4gICAgICBrZXlzXG4gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5pbmNvbWluZ0VkZ2VzW25vZGVdLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgfSlcbiAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICBERlMobik7XG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBJZiB3ZSdyZSBhbGxvd2luZyBjeWNsZXMgLSB3ZSBuZWVkIHRvIHJ1biB0aGUgREZTIGFnYWluc3QgYW55IHJlbWFpbmluZ1xuICAgICAgLy8gbm9kZXMgdGhhdCBkaWQgbm90IGVuZCB1cCBpbiB0aGUgaW5pdGlhbCByZXN1bHQgKGFzIHRoZXkgYXJlIHBhcnQgb2YgYVxuICAgICAgLy8gc3ViZ3JhcGggdGhhdCBkb2VzIG5vdCBoYXZlIGEgY2xlYXIgc3RhcnRpbmcgcG9pbnQpXG4gICAgICBpZiAodGhpcy5jaXJjdWxhcikge1xuICAgICAgICBrZXlzXG4gICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5pbmRleE9mKG5vZGUpID09PSAtMTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICBERlMobik7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogR2V0IGFuIGFycmF5IG9mIG5vZGVzIHRoYXQgaGF2ZSBubyBkZXBlbmRhbnRzIChpLmUuIG5vdGhpbmcgZGVwZW5kcyBvbiB0aGVtKS5cbiAgICovXG4gIGVudHJ5Tm9kZXM6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMubm9kZXMpLmZpbHRlcihmdW5jdGlvbiAobm9kZSkge1xuICAgICAgcmV0dXJuIHNlbGYuaW5jb21pbmdFZGdlc1tub2RlXS5sZW5ndGggPT09IDA7XG4gICAgfSk7XG4gIH1cbn07XG5cbi8vIENyZWF0ZSBzb21lIGFsaWFzZXNcbkRlcEdyYXBoLnByb3RvdHlwZS5kaXJlY3REZXBlbmRlbnRzT2YgPSBEZXBHcmFwaC5wcm90b3R5cGUuZGlyZWN0RGVwZW5kYW50c09mO1xuRGVwR3JhcGgucHJvdG90eXBlLmRlcGVuZGVudHNPZiA9IERlcEdyYXBoLnByb3RvdHlwZS5kZXBlbmRhbnRzT2Y7XG5cbi8qKlxuICogQ3ljbGUgZXJyb3IsIGluY2x1ZGluZyB0aGUgcGF0aCBvZiB0aGUgY3ljbGUuXG4gKi9cbnZhciBEZXBHcmFwaEN5Y2xlRXJyb3IgPSAoZXhwb3J0cy5EZXBHcmFwaEN5Y2xlRXJyb3IgPSBmdW5jdGlvbiAoY3ljbGVQYXRoKSB7XG4gIHZhciBtZXNzYWdlID0gXCJEZXBlbmRlbmN5IEN5Y2xlIEZvdW5kOiBcIiArIGN5Y2xlUGF0aC5qb2luKFwiIC0+IFwiKTtcbiAgdmFyIGluc3RhbmNlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICBpbnN0YW5jZS5jeWNsZVBhdGggPSBjeWNsZVBhdGg7XG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihpbnN0YW5jZSwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpKTtcbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoaW5zdGFuY2UsIERlcEdyYXBoQ3ljbGVFcnJvcik7XG4gIH1cbiAgcmV0dXJuIGluc3RhbmNlO1xufSk7XG5EZXBHcmFwaEN5Y2xlRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUsIHtcbiAgY29uc3RydWN0b3I6IHtcbiAgICB2YWx1ZTogRXJyb3IsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH1cbn0pO1xuT2JqZWN0LnNldFByb3RvdHlwZU9mKERlcEdyYXBoQ3ljbGVFcnJvciwgRXJyb3IpO1xuIiwiLyoqXG4gKiBpbnNwaXJlZCBieSBpcy1udW1iZXIgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzLW51bWJlcj5cbiAqIGJ1dCBzaWduaWZpY2FudGx5IHNpbXBsaWZpZWQgYW5kIHNwZWQgdXAgYnkgaWdub3JpbmcgbnVtYmVyIGFuZCBzdHJpbmcgY29uc3RydWN0b3JzXG4gKiBpZSB0aGVzZSByZXR1cm4gZmFsc2U6XG4gKiAgIG5ldyBOdW1iZXIoMSlcbiAqICAgbmV3IFN0cmluZygnMScpXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgYWxsQmxhbmtDaGFyQ29kZXMgPSByZXF1aXJlKCdpcy1zdHJpbmctYmxhbmsnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihuKSB7XG4gICAgdmFyIHR5cGUgPSB0eXBlb2YgbjtcbiAgICBpZih0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgb3JpZ2luYWwgPSBuO1xuICAgICAgICBuID0gK247XG4gICAgICAgIC8vIHdoaXRlc3BhY2Ugc3RyaW5ncyBjYXN0IHRvIHplcm8gLSBmaWx0ZXIgdGhlbSBvdXRcbiAgICAgICAgaWYobj09PTAgJiYgYWxsQmxhbmtDaGFyQ29kZXMob3JpZ2luYWwpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGVsc2UgaWYodHlwZSAhPT0gJ251bWJlcicpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBuIC0gbiA8IDE7XG59O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIENocmlzIFBldHRpdHRcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAqIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXIgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4gKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dFxuICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxuICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXG4gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG52YXIgbGliID0gcmVxdWlyZShcIi4vbGliXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgR3JhcGg6IGxpYi5HcmFwaCxcbiAganNvbjogcmVxdWlyZShcIi4vbGliL2pzb25cIiksXG4gIGFsZzogcmVxdWlyZShcIi4vbGliL2FsZ1wiKSxcbiAgdmVyc2lvbjogbGliLnZlcnNpb25cbn07XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcG9uZW50cztcblxuZnVuY3Rpb24gY29tcG9uZW50cyhnKSB7XG4gIHZhciB2aXNpdGVkID0ge307XG4gIHZhciBjbXB0cyA9IFtdO1xuICB2YXIgY21wdDtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIGlmIChfLmhhcyh2aXNpdGVkLCB2KSkgcmV0dXJuO1xuICAgIHZpc2l0ZWRbdl0gPSB0cnVlO1xuICAgIGNtcHQucHVzaCh2KTtcbiAgICBfLmVhY2goZy5zdWNjZXNzb3JzKHYpLCBkZnMpO1xuICAgIF8uZWFjaChnLnByZWRlY2Vzc29ycyh2KSwgZGZzKTtcbiAgfVxuXG4gIF8uZWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBjbXB0ID0gW107XG4gICAgZGZzKHYpO1xuICAgIGlmIChjbXB0Lmxlbmd0aCkge1xuICAgICAgY21wdHMucHVzaChjbXB0KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBjbXB0cztcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBkZnM7XG5cbi8qXG4gKiBBIGhlbHBlciB0aGF0IHByZWZvcm1zIGEgcHJlLSBvciBwb3N0LW9yZGVyIHRyYXZlcnNhbCBvbiB0aGUgaW5wdXQgZ3JhcGhcbiAqIGFuZCByZXR1cm5zIHRoZSBub2RlcyBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIHZpc2l0ZWQuIElmIHRoZSBncmFwaCBpc1xuICogdW5kaXJlY3RlZCB0aGVuIHRoaXMgYWxnb3JpdGhtIHdpbGwgbmF2aWdhdGUgdXNpbmcgbmVpZ2hib3JzLiBJZiB0aGUgZ3JhcGhcbiAqIGlzIGRpcmVjdGVkIHRoZW4gdGhpcyBhbGdvcml0aG0gd2lsbCBuYXZpZ2F0ZSB1c2luZyBzdWNjZXNzb3JzLlxuICpcbiAqIE9yZGVyIG11c3QgYmUgb25lIG9mIFwicHJlXCIgb3IgXCJwb3N0XCIuXG4gKi9cbmZ1bmN0aW9uIGRmcyhnLCB2cywgb3JkZXIpIHtcbiAgaWYgKCFfLmlzQXJyYXkodnMpKSB7XG4gICAgdnMgPSBbdnNdO1xuICB9XG5cbiAgdmFyIG5hdmlnYXRpb24gPSAoZy5pc0RpcmVjdGVkKCkgPyBnLnN1Y2Nlc3NvcnMgOiBnLm5laWdoYm9ycykuYmluZChnKTtcblxuICB2YXIgYWNjID0gW107XG4gIHZhciB2aXNpdGVkID0ge307XG4gIF8uZWFjaCh2cywgZnVuY3Rpb24odikge1xuICAgIGlmICghZy5oYXNOb2RlKHYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHcmFwaCBkb2VzIG5vdCBoYXZlIG5vZGU6IFwiICsgdik7XG4gICAgfVxuXG4gICAgZG9EZnMoZywgdiwgb3JkZXIgPT09IFwicG9zdFwiLCB2aXNpdGVkLCBuYXZpZ2F0aW9uLCBhY2MpO1xuICB9KTtcbiAgcmV0dXJuIGFjYztcbn1cblxuZnVuY3Rpb24gZG9EZnMoZywgdiwgcG9zdG9yZGVyLCB2aXNpdGVkLCBuYXZpZ2F0aW9uLCBhY2MpIHtcbiAgaWYgKCFfLmhhcyh2aXNpdGVkLCB2KSkge1xuICAgIHZpc2l0ZWRbdl0gPSB0cnVlO1xuXG4gICAgaWYgKCFwb3N0b3JkZXIpIHsgYWNjLnB1c2godik7IH1cbiAgICBfLmVhY2gobmF2aWdhdGlvbih2KSwgZnVuY3Rpb24odykge1xuICAgICAgZG9EZnMoZywgdywgcG9zdG9yZGVyLCB2aXNpdGVkLCBuYXZpZ2F0aW9uLCBhY2MpO1xuICAgIH0pO1xuICAgIGlmIChwb3N0b3JkZXIpIHsgYWNjLnB1c2godik7IH1cbiAgfVxufVxuIiwidmFyIGRpamtzdHJhID0gcmVxdWlyZShcIi4vZGlqa3N0cmFcIik7XG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZGlqa3N0cmFBbGw7XG5cbmZ1bmN0aW9uIGRpamtzdHJhQWxsKGcsIHdlaWdodEZ1bmMsIGVkZ2VGdW5jKSB7XG4gIHJldHVybiBfLnRyYW5zZm9ybShnLm5vZGVzKCksIGZ1bmN0aW9uKGFjYywgdikge1xuICAgIGFjY1t2XSA9IGRpamtzdHJhKGcsIHYsIHdlaWdodEZ1bmMsIGVkZ2VGdW5jKTtcbiAgfSwge30pO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIFByaW9yaXR5UXVldWUgPSByZXF1aXJlKFwiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBkaWprc3RyYTtcblxudmFyIERFRkFVTFRfV0VJR0hUX0ZVTkMgPSBfLmNvbnN0YW50KDEpO1xuXG5mdW5jdGlvbiBkaWprc3RyYShnLCBzb3VyY2UsIHdlaWdodEZuLCBlZGdlRm4pIHtcbiAgcmV0dXJuIHJ1bkRpamtzdHJhKGcsIFN0cmluZyhzb3VyY2UpLFxuICAgIHdlaWdodEZuIHx8IERFRkFVTFRfV0VJR0hUX0ZVTkMsXG4gICAgZWRnZUZuIHx8IGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcub3V0RWRnZXModik7IH0pO1xufVxuXG5mdW5jdGlvbiBydW5EaWprc3RyYShnLCBzb3VyY2UsIHdlaWdodEZuLCBlZGdlRm4pIHtcbiAgdmFyIHJlc3VsdHMgPSB7fTtcbiAgdmFyIHBxID0gbmV3IFByaW9yaXR5UXVldWUoKTtcbiAgdmFyIHYsIHZFbnRyeTtcblxuICB2YXIgdXBkYXRlTmVpZ2hib3JzID0gZnVuY3Rpb24oZWRnZSkge1xuICAgIHZhciB3ID0gZWRnZS52ICE9PSB2ID8gZWRnZS52IDogZWRnZS53O1xuICAgIHZhciB3RW50cnkgPSByZXN1bHRzW3ddO1xuICAgIHZhciB3ZWlnaHQgPSB3ZWlnaHRGbihlZGdlKTtcbiAgICB2YXIgZGlzdGFuY2UgPSB2RW50cnkuZGlzdGFuY2UgKyB3ZWlnaHQ7XG5cbiAgICBpZiAod2VpZ2h0IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZGlqa3N0cmEgZG9lcyBub3QgYWxsb3cgbmVnYXRpdmUgZWRnZSB3ZWlnaHRzLiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgXCJCYWQgZWRnZTogXCIgKyBlZGdlICsgXCIgV2VpZ2h0OiBcIiArIHdlaWdodCk7XG4gICAgfVxuXG4gICAgaWYgKGRpc3RhbmNlIDwgd0VudHJ5LmRpc3RhbmNlKSB7XG4gICAgICB3RW50cnkuZGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgIHdFbnRyeS5wcmVkZWNlc3NvciA9IHY7XG4gICAgICBwcS5kZWNyZWFzZSh3LCBkaXN0YW5jZSk7XG4gICAgfVxuICB9O1xuXG4gIGcubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgZGlzdGFuY2UgPSB2ID09PSBzb3VyY2UgPyAwIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIHJlc3VsdHNbdl0gPSB7IGRpc3RhbmNlOiBkaXN0YW5jZSB9O1xuICAgIHBxLmFkZCh2LCBkaXN0YW5jZSk7XG4gIH0pO1xuXG4gIHdoaWxlIChwcS5zaXplKCkgPiAwKSB7XG4gICAgdiA9IHBxLnJlbW92ZU1pbigpO1xuICAgIHZFbnRyeSA9IHJlc3VsdHNbdl07XG4gICAgaWYgKHZFbnRyeS5kaXN0YW5jZSA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBlZGdlRm4odikuZm9yRWFjaCh1cGRhdGVOZWlnaGJvcnMpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgdGFyamFuID0gcmVxdWlyZShcIi4vdGFyamFuXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbmRDeWNsZXM7XG5cbmZ1bmN0aW9uIGZpbmRDeWNsZXMoZykge1xuICByZXR1cm4gXy5maWx0ZXIodGFyamFuKGcpLCBmdW5jdGlvbihjbXB0KSB7XG4gICAgcmV0dXJuIGNtcHQubGVuZ3RoID4gMSB8fCAoY21wdC5sZW5ndGggPT09IDEgJiYgZy5oYXNFZGdlKGNtcHRbMF0sIGNtcHRbMF0pKTtcbiAgfSk7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZmxveWRXYXJzaGFsbDtcblxudmFyIERFRkFVTFRfV0VJR0hUX0ZVTkMgPSBfLmNvbnN0YW50KDEpO1xuXG5mdW5jdGlvbiBmbG95ZFdhcnNoYWxsKGcsIHdlaWdodEZuLCBlZGdlRm4pIHtcbiAgcmV0dXJuIHJ1bkZsb3lkV2Fyc2hhbGwoZyxcbiAgICB3ZWlnaHRGbiB8fCBERUZBVUxUX1dFSUdIVF9GVU5DLFxuICAgIGVkZ2VGbiB8fCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm91dEVkZ2VzKHYpOyB9KTtcbn1cblxuZnVuY3Rpb24gcnVuRmxveWRXYXJzaGFsbChnLCB3ZWlnaHRGbiwgZWRnZUZuKSB7XG4gIHZhciByZXN1bHRzID0ge307XG4gIHZhciBub2RlcyA9IGcubm9kZXMoKTtcblxuICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHYpIHtcbiAgICByZXN1bHRzW3ZdID0ge307XG4gICAgcmVzdWx0c1t2XVt2XSA9IHsgZGlzdGFuY2U6IDAgfTtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHcpIHtcbiAgICAgIGlmICh2ICE9PSB3KSB7XG4gICAgICAgIHJlc3VsdHNbdl1bd10gPSB7IGRpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBlZGdlRm4odikuZm9yRWFjaChmdW5jdGlvbihlZGdlKSB7XG4gICAgICB2YXIgdyA9IGVkZ2UudiA9PT0gdiA/IGVkZ2UudyA6IGVkZ2UudjtcbiAgICAgIHZhciBkID0gd2VpZ2h0Rm4oZWRnZSk7XG4gICAgICByZXN1bHRzW3ZdW3ddID0geyBkaXN0YW5jZTogZCwgcHJlZGVjZXNzb3I6IHYgfTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihrKSB7XG4gICAgdmFyIHJvd0sgPSByZXN1bHRzW2tdO1xuICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24oaSkge1xuICAgICAgdmFyIHJvd0kgPSByZXN1bHRzW2ldO1xuICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihqKSB7XG4gICAgICAgIHZhciBpayA9IHJvd0lba107XG4gICAgICAgIHZhciBraiA9IHJvd0tbal07XG4gICAgICAgIHZhciBpaiA9IHJvd0lbal07XG4gICAgICAgIHZhciBhbHREaXN0YW5jZSA9IGlrLmRpc3RhbmNlICsga2ouZGlzdGFuY2U7XG4gICAgICAgIGlmIChhbHREaXN0YW5jZSA8IGlqLmRpc3RhbmNlKSB7XG4gICAgICAgICAgaWouZGlzdGFuY2UgPSBhbHREaXN0YW5jZTtcbiAgICAgICAgICBpai5wcmVkZWNlc3NvciA9IGtqLnByZWRlY2Vzc29yO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29tcG9uZW50czogcmVxdWlyZShcIi4vY29tcG9uZW50c1wiKSxcbiAgZGlqa3N0cmE6IHJlcXVpcmUoXCIuL2RpamtzdHJhXCIpLFxuICBkaWprc3RyYUFsbDogcmVxdWlyZShcIi4vZGlqa3N0cmEtYWxsXCIpLFxuICBmaW5kQ3ljbGVzOiByZXF1aXJlKFwiLi9maW5kLWN5Y2xlc1wiKSxcbiAgZmxveWRXYXJzaGFsbDogcmVxdWlyZShcIi4vZmxveWQtd2Fyc2hhbGxcIiksXG4gIGlzQWN5Y2xpYzogcmVxdWlyZShcIi4vaXMtYWN5Y2xpY1wiKSxcbiAgcG9zdG9yZGVyOiByZXF1aXJlKFwiLi9wb3N0b3JkZXJcIiksXG4gIHByZW9yZGVyOiByZXF1aXJlKFwiLi9wcmVvcmRlclwiKSxcbiAgcHJpbTogcmVxdWlyZShcIi4vcHJpbVwiKSxcbiAgdGFyamFuOiByZXF1aXJlKFwiLi90YXJqYW5cIiksXG4gIHRvcHNvcnQ6IHJlcXVpcmUoXCIuL3RvcHNvcnRcIilcbn07XG4iLCJ2YXIgdG9wc29ydCA9IHJlcXVpcmUoXCIuL3RvcHNvcnRcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBY3ljbGljO1xuXG5mdW5jdGlvbiBpc0FjeWNsaWMoZykge1xuICB0cnkge1xuICAgIHRvcHNvcnQoZyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIHRvcHNvcnQuQ3ljbGVFeGNlcHRpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsInZhciBkZnMgPSByZXF1aXJlKFwiLi9kZnNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gcG9zdG9yZGVyO1xuXG5mdW5jdGlvbiBwb3N0b3JkZXIoZywgdnMpIHtcbiAgcmV0dXJuIGRmcyhnLCB2cywgXCJwb3N0XCIpO1xufVxuIiwidmFyIGRmcyA9IHJlcXVpcmUoXCIuL2Rmc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwcmVvcmRlcjtcblxuZnVuY3Rpb24gcHJlb3JkZXIoZywgdnMpIHtcbiAgcmV0dXJuIGRmcyhnLCB2cywgXCJwcmVcIik7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi4vZ3JhcGhcIik7XG52YXIgUHJpb3JpdHlRdWV1ZSA9IHJlcXVpcmUoXCIuLi9kYXRhL3ByaW9yaXR5LXF1ZXVlXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHByaW07XG5cbmZ1bmN0aW9uIHByaW0oZywgd2VpZ2h0RnVuYykge1xuICB2YXIgcmVzdWx0ID0gbmV3IEdyYXBoKCk7XG4gIHZhciBwYXJlbnRzID0ge307XG4gIHZhciBwcSA9IG5ldyBQcmlvcml0eVF1ZXVlKCk7XG4gIHZhciB2O1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZU5laWdoYm9ycyhlZGdlKSB7XG4gICAgdmFyIHcgPSBlZGdlLnYgPT09IHYgPyBlZGdlLncgOiBlZGdlLnY7XG4gICAgdmFyIHByaSA9IHBxLnByaW9yaXR5KHcpO1xuICAgIGlmIChwcmkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGVkZ2VXZWlnaHQgPSB3ZWlnaHRGdW5jKGVkZ2UpO1xuICAgICAgaWYgKGVkZ2VXZWlnaHQgPCBwcmkpIHtcbiAgICAgICAgcGFyZW50c1t3XSA9IHY7XG4gICAgICAgIHBxLmRlY3JlYXNlKHcsIGVkZ2VXZWlnaHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChnLm5vZGVDb3VudCgpID09PSAwKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIF8uZWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBwcS5hZGQodiwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgICByZXN1bHQuc2V0Tm9kZSh2KTtcbiAgfSk7XG5cbiAgLy8gU3RhcnQgZnJvbSBhbiBhcmJpdHJhcnkgbm9kZVxuICBwcS5kZWNyZWFzZShnLm5vZGVzKClbMF0sIDApO1xuXG4gIHZhciBpbml0ID0gZmFsc2U7XG4gIHdoaWxlIChwcS5zaXplKCkgPiAwKSB7XG4gICAgdiA9IHBxLnJlbW92ZU1pbigpO1xuICAgIGlmIChfLmhhcyhwYXJlbnRzLCB2KSkge1xuICAgICAgcmVzdWx0LnNldEVkZ2UodiwgcGFyZW50c1t2XSk7XG4gICAgfSBlbHNlIGlmIChpbml0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnB1dCBncmFwaCBpcyBub3QgY29ubmVjdGVkOiBcIiArIGcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbml0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBnLm5vZGVFZGdlcyh2KS5mb3JFYWNoKHVwZGF0ZU5laWdoYm9ycyk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHRhcmphbjtcblxuZnVuY3Rpb24gdGFyamFuKGcpIHtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIHN0YWNrID0gW107XG4gIHZhciB2aXNpdGVkID0ge307IC8vIG5vZGUgaWQgLT4geyBvblN0YWNrLCBsb3dsaW5rLCBpbmRleCB9XG4gIHZhciByZXN1bHRzID0gW107XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgZW50cnkgPSB2aXNpdGVkW3ZdID0ge1xuICAgICAgb25TdGFjazogdHJ1ZSxcbiAgICAgIGxvd2xpbms6IGluZGV4LFxuICAgICAgaW5kZXg6IGluZGV4KytcbiAgICB9O1xuICAgIHN0YWNrLnB1c2godik7XG5cbiAgICBnLnN1Y2Nlc3NvcnModikuZm9yRWFjaChmdW5jdGlvbih3KSB7XG4gICAgICBpZiAoIV8uaGFzKHZpc2l0ZWQsIHcpKSB7XG4gICAgICAgIGRmcyh3KTtcbiAgICAgICAgZW50cnkubG93bGluayA9IE1hdGgubWluKGVudHJ5Lmxvd2xpbmssIHZpc2l0ZWRbd10ubG93bGluayk7XG4gICAgICB9IGVsc2UgaWYgKHZpc2l0ZWRbd10ub25TdGFjaykge1xuICAgICAgICBlbnRyeS5sb3dsaW5rID0gTWF0aC5taW4oZW50cnkubG93bGluaywgdmlzaXRlZFt3XS5pbmRleCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZW50cnkubG93bGluayA9PT0gZW50cnkuaW5kZXgpIHtcbiAgICAgIHZhciBjbXB0ID0gW107XG4gICAgICB2YXIgdztcbiAgICAgIGRvIHtcbiAgICAgICAgdyA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB2aXNpdGVkW3ddLm9uU3RhY2sgPSBmYWxzZTtcbiAgICAgICAgY21wdC5wdXNoKHcpO1xuICAgICAgfSB3aGlsZSAodiAhPT0gdyk7XG4gICAgICByZXN1bHRzLnB1c2goY21wdCk7XG4gICAgfVxuICB9XG5cbiAgZy5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24odikge1xuICAgIGlmICghXy5oYXModmlzaXRlZCwgdikpIHtcbiAgICAgIGRmcyh2KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHRzO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHRvcHNvcnQ7XG50b3Bzb3J0LkN5Y2xlRXhjZXB0aW9uID0gQ3ljbGVFeGNlcHRpb247XG5cbmZ1bmN0aW9uIHRvcHNvcnQoZykge1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuICB2YXIgc3RhY2sgPSB7fTtcbiAgdmFyIHJlc3VsdHMgPSBbXTtcblxuICBmdW5jdGlvbiB2aXNpdChub2RlKSB7XG4gICAgaWYgKF8uaGFzKHN0YWNrLCBub2RlKSkge1xuICAgICAgdGhyb3cgbmV3IEN5Y2xlRXhjZXB0aW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmhhcyh2aXNpdGVkLCBub2RlKSkge1xuICAgICAgc3RhY2tbbm9kZV0gPSB0cnVlO1xuICAgICAgdmlzaXRlZFtub2RlXSA9IHRydWU7XG4gICAgICBfLmVhY2goZy5wcmVkZWNlc3NvcnMobm9kZSksIHZpc2l0KTtcbiAgICAgIGRlbGV0ZSBzdGFja1tub2RlXTtcbiAgICAgIHJlc3VsdHMucHVzaChub2RlKTtcbiAgICB9XG4gIH1cblxuICBfLmVhY2goZy5zaW5rcygpLCB2aXNpdCk7XG5cbiAgaWYgKF8uc2l6ZSh2aXNpdGVkKSAhPT0gZy5ub2RlQ291bnQoKSkge1xuICAgIHRocm93IG5ldyBDeWNsZUV4Y2VwdGlvbigpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIEN5Y2xlRXhjZXB0aW9uKCkge31cbkN5Y2xlRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpOyAvLyBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIEVycm9yIHRvIHBhc3MgdGVzdGluZyIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBQcmlvcml0eVF1ZXVlO1xuXG4vKipcbiAqIEEgbWluLXByaW9yaXR5IHF1ZXVlIGRhdGEgc3RydWN0dXJlLiBUaGlzIGFsZ29yaXRobSBpcyBkZXJpdmVkIGZyb20gQ29ybWVuLFxuICogZXQgYWwuLCBcIkludHJvZHVjdGlvbiB0byBBbGdvcml0aG1zXCIuIFRoZSBiYXNpYyBpZGVhIG9mIGEgbWluLXByaW9yaXR5XG4gKiBxdWV1ZSBpcyB0aGF0IHlvdSBjYW4gZWZmaWNpZW50bHkgKGluIE8oMSkgdGltZSkgZ2V0IHRoZSBzbWFsbGVzdCBrZXkgaW5cbiAqIHRoZSBxdWV1ZS4gQWRkaW5nIGFuZCByZW1vdmluZyBlbGVtZW50cyB0YWtlcyBPKGxvZyBuKSB0aW1lLiBBIGtleSBjYW5cbiAqIGhhdmUgaXRzIHByaW9yaXR5IGRlY3JlYXNlZCBpbiBPKGxvZyBuKSB0aW1lLlxuICovXG5mdW5jdGlvbiBQcmlvcml0eVF1ZXVlKCkge1xuICB0aGlzLl9hcnIgPSBbXTtcbiAgdGhpcy5fa2V5SW5kaWNlcyA9IHt9O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcXVldWUuIFRha2VzIGBPKDEpYCB0aW1lLlxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9hcnIubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBrZXlzIHRoYXQgYXJlIGluIHRoZSBxdWV1ZS4gVGFrZXMgYE8obilgIHRpbWUuXG4gKi9cblByaW9yaXR5UXVldWUucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2Fyci5tYXAoZnVuY3Rpb24oeCkgeyByZXR1cm4geC5rZXk7IH0pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiAqKmtleSoqIGlzIGluIHRoZSBxdWV1ZSBhbmQgYGZhbHNlYCBpZiBub3QuXG4gKi9cblByaW9yaXR5UXVldWUucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uKGtleSkge1xuICByZXR1cm4gXy5oYXModGhpcy5fa2V5SW5kaWNlcywga2V5KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcHJpb3JpdHkgZm9yICoqa2V5KiouIElmICoqa2V5KiogaXMgbm90IHByZXNlbnQgaW4gdGhlIHF1ZXVlXG4gKiB0aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBgdW5kZWZpbmVkYC4gVGFrZXMgYE8oMSlgIHRpbWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGtleVxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5wcmlvcml0eSA9IGZ1bmN0aW9uKGtleSkge1xuICB2YXIgaW5kZXggPSB0aGlzLl9rZXlJbmRpY2VzW2tleV07XG4gIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FycltpbmRleF0ucHJpb3JpdHk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUga2V5IGZvciB0aGUgbWluaW11bSBlbGVtZW50IGluIHRoaXMgcXVldWUuIElmIHRoZSBxdWV1ZSBpc1xuICogZW1wdHkgdGhpcyBmdW5jdGlvbiB0aHJvd3MgYW4gRXJyb3IuIFRha2VzIGBPKDEpYCB0aW1lLlxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5taW4gPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuc2l6ZSgpID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUXVldWUgdW5kZXJmbG93XCIpO1xuICB9XG4gIHJldHVybiB0aGlzLl9hcnJbMF0ua2V5O1xufTtcblxuLyoqXG4gKiBJbnNlcnRzIGEgbmV3IGtleSBpbnRvIHRoZSBwcmlvcml0eSBxdWV1ZS4gSWYgdGhlIGtleSBhbHJlYWR5IGV4aXN0cyBpblxuICogdGhlIHF1ZXVlIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBgZmFsc2VgOyBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gYHRydWVgLlxuICogVGFrZXMgYE8obilgIHRpbWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGtleSB0aGUga2V5IHRvIGFkZFxuICogQHBhcmFtIHtOdW1iZXJ9IHByaW9yaXR5IHRoZSBpbml0aWFsIHByaW9yaXR5IGZvciB0aGUga2V5XG4gKi9cblByaW9yaXR5UXVldWUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGtleSwgcHJpb3JpdHkpIHtcbiAgdmFyIGtleUluZGljZXMgPSB0aGlzLl9rZXlJbmRpY2VzO1xuICBrZXkgPSBTdHJpbmcoa2V5KTtcbiAgaWYgKCFfLmhhcyhrZXlJbmRpY2VzLCBrZXkpKSB7XG4gICAgdmFyIGFyciA9IHRoaXMuX2FycjtcbiAgICB2YXIgaW5kZXggPSBhcnIubGVuZ3RoO1xuICAgIGtleUluZGljZXNba2V5XSA9IGluZGV4O1xuICAgIGFyci5wdXNoKHtrZXk6IGtleSwgcHJpb3JpdHk6IHByaW9yaXR5fSk7XG4gICAgdGhpcy5fZGVjcmVhc2UoaW5kZXgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgc21hbGxlc3Qga2V5IGluIHRoZSBxdWV1ZS4gVGFrZXMgYE8obG9nIG4pYCB0aW1lLlxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5yZW1vdmVNaW4gPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fc3dhcCgwLCB0aGlzLl9hcnIubGVuZ3RoIC0gMSk7XG4gIHZhciBtaW4gPSB0aGlzLl9hcnIucG9wKCk7XG4gIGRlbGV0ZSB0aGlzLl9rZXlJbmRpY2VzW21pbi5rZXldO1xuICB0aGlzLl9oZWFwaWZ5KDApO1xuICByZXR1cm4gbWluLmtleTtcbn07XG5cbi8qKlxuICogRGVjcmVhc2VzIHRoZSBwcmlvcml0eSBmb3IgKiprZXkqKiB0byAqKnByaW9yaXR5KiouIElmIHRoZSBuZXcgcHJpb3JpdHkgaXNcbiAqIGdyZWF0ZXIgdGhhbiB0aGUgcHJldmlvdXMgcHJpb3JpdHksIHRoaXMgZnVuY3Rpb24gd2lsbCB0aHJvdyBhbiBFcnJvci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0ga2V5IHRoZSBrZXkgZm9yIHdoaWNoIHRvIHJhaXNlIHByaW9yaXR5XG4gKiBAcGFyYW0ge051bWJlcn0gcHJpb3JpdHkgdGhlIG5ldyBwcmlvcml0eSBmb3IgdGhlIGtleVxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5kZWNyZWFzZSA9IGZ1bmN0aW9uKGtleSwgcHJpb3JpdHkpIHtcbiAgdmFyIGluZGV4ID0gdGhpcy5fa2V5SW5kaWNlc1trZXldO1xuICBpZiAocHJpb3JpdHkgPiB0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTmV3IHByaW9yaXR5IGlzIGdyZWF0ZXIgdGhhbiBjdXJyZW50IHByaW9yaXR5LiBcIiArXG4gICAgICAgIFwiS2V5OiBcIiArIGtleSArIFwiIE9sZDogXCIgKyB0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5ICsgXCIgTmV3OiBcIiArIHByaW9yaXR5KTtcbiAgfVxuICB0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5ID0gcHJpb3JpdHk7XG4gIHRoaXMuX2RlY3JlYXNlKGluZGV4KTtcbn07XG5cblByaW9yaXR5UXVldWUucHJvdG90eXBlLl9oZWFwaWZ5ID0gZnVuY3Rpb24oaSkge1xuICB2YXIgYXJyID0gdGhpcy5fYXJyO1xuICB2YXIgbCA9IDIgKiBpO1xuICB2YXIgciA9IGwgKyAxO1xuICB2YXIgbGFyZ2VzdCA9IGk7XG4gIGlmIChsIDwgYXJyLmxlbmd0aCkge1xuICAgIGxhcmdlc3QgPSBhcnJbbF0ucHJpb3JpdHkgPCBhcnJbbGFyZ2VzdF0ucHJpb3JpdHkgPyBsIDogbGFyZ2VzdDtcbiAgICBpZiAociA8IGFyci5sZW5ndGgpIHtcbiAgICAgIGxhcmdlc3QgPSBhcnJbcl0ucHJpb3JpdHkgPCBhcnJbbGFyZ2VzdF0ucHJpb3JpdHkgPyByIDogbGFyZ2VzdDtcbiAgICB9XG4gICAgaWYgKGxhcmdlc3QgIT09IGkpIHtcbiAgICAgIHRoaXMuX3N3YXAoaSwgbGFyZ2VzdCk7XG4gICAgICB0aGlzLl9oZWFwaWZ5KGxhcmdlc3QpO1xuICAgIH1cbiAgfVxufTtcblxuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuX2RlY3JlYXNlID0gZnVuY3Rpb24oaW5kZXgpIHtcbiAgdmFyIGFyciA9IHRoaXMuX2FycjtcbiAgdmFyIHByaW9yaXR5ID0gYXJyW2luZGV4XS5wcmlvcml0eTtcbiAgdmFyIHBhcmVudDtcbiAgd2hpbGUgKGluZGV4ICE9PSAwKSB7XG4gICAgcGFyZW50ID0gaW5kZXggPj4gMTtcbiAgICBpZiAoYXJyW3BhcmVudF0ucHJpb3JpdHkgPCBwcmlvcml0eSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMuX3N3YXAoaW5kZXgsIHBhcmVudCk7XG4gICAgaW5kZXggPSBwYXJlbnQ7XG4gIH1cbn07XG5cblByaW9yaXR5UXVldWUucHJvdG90eXBlLl9zd2FwID0gZnVuY3Rpb24oaSwgaikge1xuICB2YXIgYXJyID0gdGhpcy5fYXJyO1xuICB2YXIga2V5SW5kaWNlcyA9IHRoaXMuX2tleUluZGljZXM7XG4gIHZhciBvcmlnQXJySSA9IGFycltpXTtcbiAgdmFyIG9yaWdBcnJKID0gYXJyW2pdO1xuICBhcnJbaV0gPSBvcmlnQXJySjtcbiAgYXJyW2pdID0gb3JpZ0Fyckk7XG4gIGtleUluZGljZXNbb3JpZ0Fyckoua2V5XSA9IGk7XG4gIGtleUluZGljZXNbb3JpZ0Fyckkua2V5XSA9IGo7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEdyYXBoO1xuXG52YXIgREVGQVVMVF9FREdFX05BTUUgPSBcIlxceDAwXCI7XG52YXIgR1JBUEhfTk9ERSA9IFwiXFx4MDBcIjtcbnZhciBFREdFX0tFWV9ERUxJTSA9IFwiXFx4MDFcIjtcblxuLy8gSW1wbGVtZW50YXRpb24gbm90ZXM6XG4vL1xuLy8gICogTm9kZSBpZCBxdWVyeSBmdW5jdGlvbnMgc2hvdWxkIHJldHVybiBzdHJpbmcgaWRzIGZvciB0aGUgbm9kZXNcbi8vICAqIEVkZ2UgaWQgcXVlcnkgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gYW4gXCJlZGdlT2JqXCIsIGVkZ2Ugb2JqZWN0LCB0aGF0IGlzXG4vLyAgICBjb21wb3NlZCBvZiBlbm91Z2ggaW5mb3JtYXRpb24gdG8gdW5pcXVlbHkgaWRlbnRpZnkgYW4gZWRnZToge3YsIHcsIG5hbWV9LlxuLy8gICogSW50ZXJuYWxseSB3ZSB1c2UgYW4gXCJlZGdlSWRcIiwgYSBzdHJpbmdpZmllZCBmb3JtIG9mIHRoZSBlZGdlT2JqLCB0b1xuLy8gICAgcmVmZXJlbmNlIGVkZ2VzLiBUaGlzIGlzIGJlY2F1c2Ugd2UgbmVlZCBhIHBlcmZvcm1hbnQgd2F5IHRvIGxvb2sgdGhlc2Vcbi8vICAgIGVkZ2VzIHVwIGFuZCwgb2JqZWN0IHByb3BlcnRpZXMsIHdoaWNoIGhhdmUgc3RyaW5nIGtleXMsIGFyZSB0aGUgY2xvc2VzdFxuLy8gICAgd2UncmUgZ29pbmcgdG8gZ2V0IHRvIGEgcGVyZm9ybWFudCBoYXNodGFibGUgaW4gSmF2YVNjcmlwdC5cblxuZnVuY3Rpb24gR3JhcGgob3B0cykge1xuICB0aGlzLl9pc0RpcmVjdGVkID0gXy5oYXMob3B0cywgXCJkaXJlY3RlZFwiKSA/IG9wdHMuZGlyZWN0ZWQgOiB0cnVlO1xuICB0aGlzLl9pc011bHRpZ3JhcGggPSBfLmhhcyhvcHRzLCBcIm11bHRpZ3JhcGhcIikgPyBvcHRzLm11bHRpZ3JhcGggOiBmYWxzZTtcbiAgdGhpcy5faXNDb21wb3VuZCA9IF8uaGFzKG9wdHMsIFwiY29tcG91bmRcIikgPyBvcHRzLmNvbXBvdW5kIDogZmFsc2U7XG5cbiAgLy8gTGFiZWwgZm9yIHRoZSBncmFwaCBpdHNlbGZcbiAgdGhpcy5fbGFiZWwgPSB1bmRlZmluZWQ7XG5cbiAgLy8gRGVmYXVsdHMgdG8gYmUgc2V0IHdoZW4gY3JlYXRpbmcgYSBuZXcgbm9kZVxuICB0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm4gPSBfLmNvbnN0YW50KHVuZGVmaW5lZCk7XG5cbiAgLy8gRGVmYXVsdHMgdG8gYmUgc2V0IHdoZW4gY3JlYXRpbmcgYSBuZXcgZWRnZVxuICB0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm4gPSBfLmNvbnN0YW50KHVuZGVmaW5lZCk7XG5cbiAgLy8gdiAtPiBsYWJlbFxuICB0aGlzLl9ub2RlcyA9IHt9O1xuXG4gIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgLy8gdiAtPiBwYXJlbnRcbiAgICB0aGlzLl9wYXJlbnQgPSB7fTtcblxuICAgIC8vIHYgLT4gY2hpbGRyZW5cbiAgICB0aGlzLl9jaGlsZHJlbiA9IHt9O1xuICAgIHRoaXMuX2NoaWxkcmVuW0dSQVBIX05PREVdID0ge307XG4gIH1cblxuICAvLyB2IC0+IGVkZ2VPYmpcbiAgdGhpcy5faW4gPSB7fTtcblxuICAvLyB1IC0+IHYgLT4gTnVtYmVyXG4gIHRoaXMuX3ByZWRzID0ge307XG5cbiAgLy8gdiAtPiBlZGdlT2JqXG4gIHRoaXMuX291dCA9IHt9O1xuXG4gIC8vIHYgLT4gdyAtPiBOdW1iZXJcbiAgdGhpcy5fc3VjcyA9IHt9O1xuXG4gIC8vIGUgLT4gZWRnZU9ialxuICB0aGlzLl9lZGdlT2JqcyA9IHt9O1xuXG4gIC8vIGUgLT4gbGFiZWxcbiAgdGhpcy5fZWRnZUxhYmVscyA9IHt9O1xufVxuXG4vKiBOdW1iZXIgb2Ygbm9kZXMgaW4gdGhlIGdyYXBoLiBTaG91bGQgb25seSBiZSBjaGFuZ2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbi4gKi9cbkdyYXBoLnByb3RvdHlwZS5fbm9kZUNvdW50ID0gMDtcblxuLyogTnVtYmVyIG9mIGVkZ2VzIGluIHRoZSBncmFwaC4gU2hvdWxkIG9ubHkgYmUgY2hhbmdlZCBieSB0aGUgaW1wbGVtZW50YXRpb24uICovXG5HcmFwaC5wcm90b3R5cGUuX2VkZ2VDb3VudCA9IDA7XG5cblxuLyogPT09IEdyYXBoIGZ1bmN0aW9ucyA9PT09PT09PT0gKi9cblxuR3JhcGgucHJvdG90eXBlLmlzRGlyZWN0ZWQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2lzRGlyZWN0ZWQ7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaXNNdWx0aWdyYXBoID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9pc011bHRpZ3JhcGg7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaXNDb21wb3VuZCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5faXNDb21wb3VuZDtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zZXRHcmFwaCA9IGZ1bmN0aW9uKGxhYmVsKSB7XG4gIHRoaXMuX2xhYmVsID0gbGFiZWw7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmdyYXBoID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9sYWJlbDtcbn07XG5cblxuLyogPT09IE5vZGUgZnVuY3Rpb25zID09PT09PT09PT0gKi9cblxuR3JhcGgucHJvdG90eXBlLnNldERlZmF1bHROb2RlTGFiZWwgPSBmdW5jdGlvbihuZXdEZWZhdWx0KSB7XG4gIGlmICghXy5pc0Z1bmN0aW9uKG5ld0RlZmF1bHQpKSB7XG4gICAgbmV3RGVmYXVsdCA9IF8uY29uc3RhbnQobmV3RGVmYXVsdCk7XG4gIH1cbiAgdGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuID0gbmV3RGVmYXVsdDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUubm9kZUNvdW50ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9ub2RlQ291bnQ7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUubm9kZXMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIF8ua2V5cyh0aGlzLl9ub2Rlcyk7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc291cmNlcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHJldHVybiBfLmZpbHRlcih0aGlzLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICByZXR1cm4gXy5pc0VtcHR5KHNlbGYuX2luW3ZdKTtcbiAgfSk7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2lua3MgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICByZXR1cm4gXy5maWx0ZXIodGhpcy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuIF8uaXNFbXB0eShzZWxmLl9vdXRbdl0pO1xuICB9KTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zZXROb2RlcyA9IGZ1bmN0aW9uKHZzLCB2YWx1ZSkge1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBfLmVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAxKSB7XG4gICAgICBzZWxmLnNldE5vZGUodiwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLnNldE5vZGUodik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0Tm9kZSA9IGZ1bmN0aW9uKHYsIHZhbHVlKSB7XG4gIGlmIChfLmhhcyh0aGlzLl9ub2RlcywgdikpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRoaXMuX25vZGVzW3ZdID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdGhpcy5fbm9kZXNbdl0gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IHZhbHVlIDogdGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuKHYpO1xuICBpZiAodGhpcy5faXNDb21wb3VuZCkge1xuICAgIHRoaXMuX3BhcmVudFt2XSA9IEdSQVBIX05PREU7XG4gICAgdGhpcy5fY2hpbGRyZW5bdl0gPSB7fTtcbiAgICB0aGlzLl9jaGlsZHJlbltHUkFQSF9OT0RFXVt2XSA9IHRydWU7XG4gIH1cbiAgdGhpcy5faW5bdl0gPSB7fTtcbiAgdGhpcy5fcHJlZHNbdl0gPSB7fTtcbiAgdGhpcy5fb3V0W3ZdID0ge307XG4gIHRoaXMuX3N1Y3Nbdl0gPSB7fTtcbiAgKyt0aGlzLl9ub2RlQ291bnQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLm5vZGUgPSBmdW5jdGlvbih2KSB7XG4gIHJldHVybiB0aGlzLl9ub2Rlc1t2XTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5oYXNOb2RlID0gZnVuY3Rpb24odikge1xuICByZXR1cm4gXy5oYXModGhpcy5fbm9kZXMsIHYpO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnJlbW92ZU5vZGUgPSAgZnVuY3Rpb24odikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmIChfLmhhcyh0aGlzLl9ub2RlcywgdikpIHtcbiAgICB2YXIgcmVtb3ZlRWRnZSA9IGZ1bmN0aW9uKGUpIHsgc2VsZi5yZW1vdmVFZGdlKHNlbGYuX2VkZ2VPYmpzW2VdKTsgfTtcbiAgICBkZWxldGUgdGhpcy5fbm9kZXNbdl07XG4gICAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICAgIHRoaXMuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0KHYpO1xuICAgICAgZGVsZXRlIHRoaXMuX3BhcmVudFt2XTtcbiAgICAgIF8uZWFjaCh0aGlzLmNoaWxkcmVuKHYpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICBzZWxmLnNldFBhcmVudChjaGlsZCk7XG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSB0aGlzLl9jaGlsZHJlblt2XTtcbiAgICB9XG4gICAgXy5lYWNoKF8ua2V5cyh0aGlzLl9pblt2XSksIHJlbW92ZUVkZ2UpO1xuICAgIGRlbGV0ZSB0aGlzLl9pblt2XTtcbiAgICBkZWxldGUgdGhpcy5fcHJlZHNbdl07XG4gICAgXy5lYWNoKF8ua2V5cyh0aGlzLl9vdXRbdl0pLCByZW1vdmVFZGdlKTtcbiAgICBkZWxldGUgdGhpcy5fb3V0W3ZdO1xuICAgIGRlbGV0ZSB0aGlzLl9zdWNzW3ZdO1xuICAgIC0tdGhpcy5fbm9kZUNvdW50O1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNldFBhcmVudCA9IGZ1bmN0aW9uKHYsIHBhcmVudCkge1xuICBpZiAoIXRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3Qgc2V0IHBhcmVudCBpbiBhIG5vbi1jb21wb3VuZCBncmFwaFwiKTtcbiAgfVxuXG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmVudCkpIHtcbiAgICBwYXJlbnQgPSBHUkFQSF9OT0RFO1xuICB9IGVsc2Uge1xuICAgIC8vIENvZXJjZSBwYXJlbnQgdG8gc3RyaW5nXG4gICAgcGFyZW50ICs9IFwiXCI7XG4gICAgZm9yICh2YXIgYW5jZXN0b3IgPSBwYXJlbnQ7XG4gICAgICAhXy5pc1VuZGVmaW5lZChhbmNlc3Rvcik7XG4gICAgICBhbmNlc3RvciA9IHRoaXMucGFyZW50KGFuY2VzdG9yKSkge1xuICAgICAgaWYgKGFuY2VzdG9yID09PSB2KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNldHRpbmcgXCIgKyBwYXJlbnQrIFwiIGFzIHBhcmVudCBvZiBcIiArIHYgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCIgd291bGQgY3JlYXRlIGEgY3ljbGVcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZXROb2RlKHBhcmVudCk7XG4gIH1cblxuICB0aGlzLnNldE5vZGUodik7XG4gIHRoaXMuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0KHYpO1xuICB0aGlzLl9wYXJlbnRbdl0gPSBwYXJlbnQ7XG4gIHRoaXMuX2NoaWxkcmVuW3BhcmVudF1bdl0gPSB0cnVlO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3QgPSBmdW5jdGlvbih2KSB7XG4gIGRlbGV0ZSB0aGlzLl9jaGlsZHJlblt0aGlzLl9wYXJlbnRbdl1dW3ZdO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnBhcmVudCA9IGZ1bmN0aW9uKHYpIHtcbiAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5fcGFyZW50W3ZdO1xuICAgIGlmIChwYXJlbnQgIT09IEdSQVBIX05PREUpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuY2hpbGRyZW4gPSBmdW5jdGlvbih2KSB7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHYpKSB7XG4gICAgdiA9IEdSQVBIX05PREU7XG4gIH1cblxuICBpZiAodGhpcy5faXNDb21wb3VuZCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuX2NoaWxkcmVuW3ZdO1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgcmV0dXJuIF8ua2V5cyhjaGlsZHJlbik7XG4gICAgfVxuICB9IGVsc2UgaWYgKHYgPT09IEdSQVBIX05PREUpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlcygpO1xuICB9IGVsc2UgaWYgKHRoaXMuaGFzTm9kZSh2KSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLnByZWRlY2Vzc29ycyA9IGZ1bmN0aW9uKHYpIHtcbiAgdmFyIHByZWRzViA9IHRoaXMuX3ByZWRzW3ZdO1xuICBpZiAocHJlZHNWKSB7XG4gICAgcmV0dXJuIF8ua2V5cyhwcmVkc1YpO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc3VjY2Vzc29ycyA9IGZ1bmN0aW9uKHYpIHtcbiAgdmFyIHN1Y3NWID0gdGhpcy5fc3Vjc1t2XTtcbiAgaWYgKHN1Y3NWKSB7XG4gICAgcmV0dXJuIF8ua2V5cyhzdWNzVik7XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5uZWlnaGJvcnMgPSBmdW5jdGlvbih2KSB7XG4gIHZhciBwcmVkcyA9IHRoaXMucHJlZGVjZXNzb3JzKHYpO1xuICBpZiAocHJlZHMpIHtcbiAgICByZXR1cm4gXy51bmlvbihwcmVkcywgdGhpcy5zdWNjZXNzb3JzKHYpKTtcbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLmlzTGVhZiA9IGZ1bmN0aW9uICh2KSB7XG4gIHZhciBuZWlnaGJvcnM7XG4gIGlmICh0aGlzLmlzRGlyZWN0ZWQoKSkge1xuICAgIG5laWdoYm9ycyA9IHRoaXMuc3VjY2Vzc29ycyh2KTtcbiAgfSBlbHNlIHtcbiAgICBuZWlnaGJvcnMgPSB0aGlzLm5laWdoYm9ycyh2KTtcbiAgfVxuICByZXR1cm4gbmVpZ2hib3JzLmxlbmd0aCA9PT0gMDtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5maWx0ZXJOb2RlcyA9IGZ1bmN0aW9uKGZpbHRlcikge1xuICB2YXIgY29weSA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKHtcbiAgICBkaXJlY3RlZDogdGhpcy5faXNEaXJlY3RlZCxcbiAgICBtdWx0aWdyYXBoOiB0aGlzLl9pc011bHRpZ3JhcGgsXG4gICAgY29tcG91bmQ6IHRoaXMuX2lzQ29tcG91bmRcbiAgfSk7XG5cbiAgY29weS5zZXRHcmFwaCh0aGlzLmdyYXBoKCkpO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgXy5lYWNoKHRoaXMuX25vZGVzLCBmdW5jdGlvbih2YWx1ZSwgdikge1xuICAgIGlmIChmaWx0ZXIodikpIHtcbiAgICAgIGNvcHkuc2V0Tm9kZSh2LCB2YWx1ZSk7XG4gICAgfVxuICB9KTtcblxuICBfLmVhY2godGhpcy5fZWRnZU9ianMsIGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAoY29weS5oYXNOb2RlKGUudikgJiYgY29weS5oYXNOb2RlKGUudykpIHtcbiAgICAgIGNvcHkuc2V0RWRnZShlLCBzZWxmLmVkZ2UoZSkpO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIHBhcmVudHMgPSB7fTtcbiAgZnVuY3Rpb24gZmluZFBhcmVudCh2KSB7XG4gICAgdmFyIHBhcmVudCA9IHNlbGYucGFyZW50KHYpO1xuICAgIGlmIChwYXJlbnQgPT09IHVuZGVmaW5lZCB8fCBjb3B5Lmhhc05vZGUocGFyZW50KSkge1xuICAgICAgcGFyZW50c1t2XSA9IHBhcmVudDtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfSBlbHNlIGlmIChwYXJlbnQgaW4gcGFyZW50cykge1xuICAgICAgcmV0dXJuIHBhcmVudHNbcGFyZW50XTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmRQYXJlbnQocGFyZW50KTtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5faXNDb21wb3VuZCkge1xuICAgIF8uZWFjaChjb3B5Lm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICAgIGNvcHkuc2V0UGFyZW50KHYsIGZpbmRQYXJlbnQodikpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGNvcHk7XG59O1xuXG4vKiA9PT0gRWRnZSBmdW5jdGlvbnMgPT09PT09PT09PSAqL1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0RGVmYXVsdEVkZ2VMYWJlbCA9IGZ1bmN0aW9uKG5ld0RlZmF1bHQpIHtcbiAgaWYgKCFfLmlzRnVuY3Rpb24obmV3RGVmYXVsdCkpIHtcbiAgICBuZXdEZWZhdWx0ID0gXy5jb25zdGFudChuZXdEZWZhdWx0KTtcbiAgfVxuICB0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm4gPSBuZXdEZWZhdWx0O1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5lZGdlQ291bnQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2VkZ2VDb3VudDtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5lZGdlcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gXy52YWx1ZXModGhpcy5fZWRnZU9ianMpO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNldFBhdGggPSBmdW5jdGlvbih2cywgdmFsdWUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgXy5yZWR1Y2UodnMsIGZ1bmN0aW9uKHYsIHcpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAxKSB7XG4gICAgICBzZWxmLnNldEVkZ2UodiwgdywgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLnNldEVkZ2Uodiwgdyk7XG4gICAgfVxuICAgIHJldHVybiB3O1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKlxuICogc2V0RWRnZSh2LCB3LCBbdmFsdWUsIFtuYW1lXV0pXG4gKiBzZXRFZGdlKHsgdiwgdywgW25hbWVdIH0sIFt2YWx1ZV0pXG4gKi9cbkdyYXBoLnByb3RvdHlwZS5zZXRFZGdlID0gZnVuY3Rpb24oKSB7XG4gIHZhciB2LCB3LCBuYW1lLCB2YWx1ZTtcbiAgdmFyIHZhbHVlU3BlY2lmaWVkID0gZmFsc2U7XG4gIHZhciBhcmcwID0gYXJndW1lbnRzWzBdO1xuXG4gIGlmICh0eXBlb2YgYXJnMCA9PT0gXCJvYmplY3RcIiAmJiBhcmcwICE9PSBudWxsICYmIFwidlwiIGluIGFyZzApIHtcbiAgICB2ID0gYXJnMC52O1xuICAgIHcgPSBhcmcwLnc7XG4gICAgbmFtZSA9IGFyZzAubmFtZTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgdmFsdWUgPSBhcmd1bWVudHNbMV07XG4gICAgICB2YWx1ZVNwZWNpZmllZCA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHYgPSBhcmcwO1xuICAgIHcgPSBhcmd1bWVudHNbMV07XG4gICAgbmFtZSA9IGFyZ3VtZW50c1szXTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcbiAgICAgIHZhbHVlID0gYXJndW1lbnRzWzJdO1xuICAgICAgdmFsdWVTcGVjaWZpZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHYgPSBcIlwiICsgdjtcbiAgdyA9IFwiXCIgKyB3O1xuICBpZiAoIV8uaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBuYW1lID0gXCJcIiArIG5hbWU7XG4gIH1cblxuICB2YXIgZSA9IGVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCB2LCB3LCBuYW1lKTtcbiAgaWYgKF8uaGFzKHRoaXMuX2VkZ2VMYWJlbHMsIGUpKSB7XG4gICAgaWYgKHZhbHVlU3BlY2lmaWVkKSB7XG4gICAgICB0aGlzLl9lZGdlTGFiZWxzW2VdID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKG5hbWUpICYmICF0aGlzLl9pc011bHRpZ3JhcGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3Qgc2V0IGEgbmFtZWQgZWRnZSB3aGVuIGlzTXVsdGlncmFwaCA9IGZhbHNlXCIpO1xuICB9XG5cbiAgLy8gSXQgZGlkbid0IGV4aXN0LCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBpdC5cbiAgLy8gRmlyc3QgZW5zdXJlIHRoZSBub2RlcyBleGlzdC5cbiAgdGhpcy5zZXROb2RlKHYpO1xuICB0aGlzLnNldE5vZGUodyk7XG5cbiAgdGhpcy5fZWRnZUxhYmVsc1tlXSA9IHZhbHVlU3BlY2lmaWVkID8gdmFsdWUgOiB0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm4odiwgdywgbmFtZSk7XG5cbiAgdmFyIGVkZ2VPYmogPSBlZGdlQXJnc1RvT2JqKHRoaXMuX2lzRGlyZWN0ZWQsIHYsIHcsIG5hbWUpO1xuICAvLyBFbnN1cmUgd2UgYWRkIHVuZGlyZWN0ZWQgZWRnZXMgaW4gYSBjb25zaXN0ZW50IHdheS5cbiAgdiA9IGVkZ2VPYmoudjtcbiAgdyA9IGVkZ2VPYmoudztcblxuICBPYmplY3QuZnJlZXplKGVkZ2VPYmopO1xuICB0aGlzLl9lZGdlT2Jqc1tlXSA9IGVkZ2VPYmo7XG4gIGluY3JlbWVudE9ySW5pdEVudHJ5KHRoaXMuX3ByZWRzW3ddLCB2KTtcbiAgaW5jcmVtZW50T3JJbml0RW50cnkodGhpcy5fc3Vjc1t2XSwgdyk7XG4gIHRoaXMuX2luW3ddW2VdID0gZWRnZU9iajtcbiAgdGhpcy5fb3V0W3ZdW2VdID0gZWRnZU9iajtcbiAgdGhpcy5fZWRnZUNvdW50Kys7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmVkZ2UgPSBmdW5jdGlvbih2LCB3LCBuYW1lKSB7XG4gIHZhciBlID0gKGFyZ3VtZW50cy5sZW5ndGggPT09IDFcbiAgICA/IGVkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIGFyZ3VtZW50c1swXSlcbiAgICA6IGVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCB2LCB3LCBuYW1lKSk7XG4gIHJldHVybiB0aGlzLl9lZGdlTGFiZWxzW2VdO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmhhc0VkZ2UgPSBmdW5jdGlvbih2LCB3LCBuYW1lKSB7XG4gIHZhciBlID0gKGFyZ3VtZW50cy5sZW5ndGggPT09IDFcbiAgICA/IGVkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIGFyZ3VtZW50c1swXSlcbiAgICA6IGVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCB2LCB3LCBuYW1lKSk7XG4gIHJldHVybiBfLmhhcyh0aGlzLl9lZGdlTGFiZWxzLCBlKTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5yZW1vdmVFZGdlID0gZnVuY3Rpb24odiwgdywgbmFtZSkge1xuICB2YXIgZSA9IChhcmd1bWVudHMubGVuZ3RoID09PSAxXG4gICAgPyBlZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCBhcmd1bWVudHNbMF0pXG4gICAgOiBlZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSkpO1xuICB2YXIgZWRnZSA9IHRoaXMuX2VkZ2VPYmpzW2VdO1xuICBpZiAoZWRnZSkge1xuICAgIHYgPSBlZGdlLnY7XG4gICAgdyA9IGVkZ2UudztcbiAgICBkZWxldGUgdGhpcy5fZWRnZUxhYmVsc1tlXTtcbiAgICBkZWxldGUgdGhpcy5fZWRnZU9ianNbZV07XG4gICAgZGVjcmVtZW50T3JSZW1vdmVFbnRyeSh0aGlzLl9wcmVkc1t3XSwgdik7XG4gICAgZGVjcmVtZW50T3JSZW1vdmVFbnRyeSh0aGlzLl9zdWNzW3ZdLCB3KTtcbiAgICBkZWxldGUgdGhpcy5faW5bd11bZV07XG4gICAgZGVsZXRlIHRoaXMuX291dFt2XVtlXTtcbiAgICB0aGlzLl9lZGdlQ291bnQtLTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5pbkVkZ2VzID0gZnVuY3Rpb24odiwgdSkge1xuICB2YXIgaW5WID0gdGhpcy5faW5bdl07XG4gIGlmIChpblYpIHtcbiAgICB2YXIgZWRnZXMgPSBfLnZhbHVlcyhpblYpO1xuICAgIGlmICghdSkge1xuICAgICAgcmV0dXJuIGVkZ2VzO1xuICAgIH1cbiAgICByZXR1cm4gXy5maWx0ZXIoZWRnZXMsIGZ1bmN0aW9uKGVkZ2UpIHsgcmV0dXJuIGVkZ2UudiA9PT0gdTsgfSk7XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5vdXRFZGdlcyA9IGZ1bmN0aW9uKHYsIHcpIHtcbiAgdmFyIG91dFYgPSB0aGlzLl9vdXRbdl07XG4gIGlmIChvdXRWKSB7XG4gICAgdmFyIGVkZ2VzID0gXy52YWx1ZXMob3V0Vik7XG4gICAgaWYgKCF3KSB7XG4gICAgICByZXR1cm4gZWRnZXM7XG4gICAgfVxuICAgIHJldHVybiBfLmZpbHRlcihlZGdlcywgZnVuY3Rpb24oZWRnZSkgeyByZXR1cm4gZWRnZS53ID09PSB3OyB9KTtcbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLm5vZGVFZGdlcyA9IGZ1bmN0aW9uKHYsIHcpIHtcbiAgdmFyIGluRWRnZXMgPSB0aGlzLmluRWRnZXModiwgdyk7XG4gIGlmIChpbkVkZ2VzKSB7XG4gICAgcmV0dXJuIGluRWRnZXMuY29uY2F0KHRoaXMub3V0RWRnZXModiwgdykpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBpbmNyZW1lbnRPckluaXRFbnRyeShtYXAsIGspIHtcbiAgaWYgKG1hcFtrXSkge1xuICAgIG1hcFtrXSsrO1xuICB9IGVsc2Uge1xuICAgIG1hcFtrXSA9IDE7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjcmVtZW50T3JSZW1vdmVFbnRyeShtYXAsIGspIHtcbiAgaWYgKCEtLW1hcFtrXSkgeyBkZWxldGUgbWFwW2tdOyB9XG59XG5cbmZ1bmN0aW9uIGVkZ2VBcmdzVG9JZChpc0RpcmVjdGVkLCB2Xywgd18sIG5hbWUpIHtcbiAgdmFyIHYgPSBcIlwiICsgdl87XG4gIHZhciB3ID0gXCJcIiArIHdfO1xuICBpZiAoIWlzRGlyZWN0ZWQgJiYgdiA+IHcpIHtcbiAgICB2YXIgdG1wID0gdjtcbiAgICB2ID0gdztcbiAgICB3ID0gdG1wO1xuICB9XG4gIHJldHVybiB2ICsgRURHRV9LRVlfREVMSU0gKyB3ICsgRURHRV9LRVlfREVMSU0gK1xuICAgICAgICAgICAgIChfLmlzVW5kZWZpbmVkKG5hbWUpID8gREVGQVVMVF9FREdFX05BTUUgOiBuYW1lKTtcbn1cblxuZnVuY3Rpb24gZWRnZUFyZ3NUb09iaihpc0RpcmVjdGVkLCB2Xywgd18sIG5hbWUpIHtcbiAgdmFyIHYgPSBcIlwiICsgdl87XG4gIHZhciB3ID0gXCJcIiArIHdfO1xuICBpZiAoIWlzRGlyZWN0ZWQgJiYgdiA+IHcpIHtcbiAgICB2YXIgdG1wID0gdjtcbiAgICB2ID0gdztcbiAgICB3ID0gdG1wO1xuICB9XG4gIHZhciBlZGdlT2JqID0gIHsgdjogdiwgdzogdyB9O1xuICBpZiAobmFtZSkge1xuICAgIGVkZ2VPYmoubmFtZSA9IG5hbWU7XG4gIH1cbiAgcmV0dXJuIGVkZ2VPYmo7XG59XG5cbmZ1bmN0aW9uIGVkZ2VPYmpUb0lkKGlzRGlyZWN0ZWQsIGVkZ2VPYmopIHtcbiAgcmV0dXJuIGVkZ2VBcmdzVG9JZChpc0RpcmVjdGVkLCBlZGdlT2JqLnYsIGVkZ2VPYmoudywgZWRnZU9iai5uYW1lKTtcbn1cbiIsIi8vIEluY2x1ZGVzIG9ubHkgdGhlIFwiY29yZVwiIG9mIGdyYXBobGliXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgR3JhcGg6IHJlcXVpcmUoXCIuL2dyYXBoXCIpLFxuICB2ZXJzaW9uOiByZXF1aXJlKFwiLi92ZXJzaW9uXCIpXG59O1xuIiwidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHdyaXRlOiB3cml0ZSxcbiAgcmVhZDogcmVhZFxufTtcblxuZnVuY3Rpb24gd3JpdGUoZykge1xuICB2YXIganNvbiA9IHtcbiAgICBvcHRpb25zOiB7XG4gICAgICBkaXJlY3RlZDogZy5pc0RpcmVjdGVkKCksXG4gICAgICBtdWx0aWdyYXBoOiBnLmlzTXVsdGlncmFwaCgpLFxuICAgICAgY29tcG91bmQ6IGcuaXNDb21wb3VuZCgpXG4gICAgfSxcbiAgICBub2Rlczogd3JpdGVOb2RlcyhnKSxcbiAgICBlZGdlczogd3JpdGVFZGdlcyhnKVxuICB9O1xuICBpZiAoIV8uaXNVbmRlZmluZWQoZy5ncmFwaCgpKSkge1xuICAgIGpzb24udmFsdWUgPSBfLmNsb25lKGcuZ3JhcGgoKSk7XG4gIH1cbiAgcmV0dXJuIGpzb247XG59XG5cbmZ1bmN0aW9uIHdyaXRlTm9kZXMoZykge1xuICByZXR1cm4gXy5tYXAoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGVWYWx1ZSA9IGcubm9kZSh2KTtcbiAgICB2YXIgcGFyZW50ID0gZy5wYXJlbnQodik7XG4gICAgdmFyIG5vZGUgPSB7IHY6IHYgfTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQobm9kZVZhbHVlKSkge1xuICAgICAgbm9kZS52YWx1ZSA9IG5vZGVWYWx1ZTtcbiAgICB9XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmVudCkpIHtcbiAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlRWRnZXMoZykge1xuICByZXR1cm4gXy5tYXAoZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2VWYWx1ZSA9IGcuZWRnZShlKTtcbiAgICB2YXIgZWRnZSA9IHsgdjogZS52LCB3OiBlLncgfTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZS5uYW1lKSkge1xuICAgICAgZWRnZS5uYW1lID0gZS5uYW1lO1xuICAgIH1cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZWRnZVZhbHVlKSkge1xuICAgICAgZWRnZS52YWx1ZSA9IGVkZ2VWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGVkZ2U7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkKGpzb24pIHtcbiAgdmFyIGcgPSBuZXcgR3JhcGgoanNvbi5vcHRpb25zKS5zZXRHcmFwaChqc29uLnZhbHVlKTtcbiAgXy5lYWNoKGpzb24ubm9kZXMsIGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgZy5zZXROb2RlKGVudHJ5LnYsIGVudHJ5LnZhbHVlKTtcbiAgICBpZiAoZW50cnkucGFyZW50KSB7XG4gICAgICBnLnNldFBhcmVudChlbnRyeS52LCBlbnRyeS5wYXJlbnQpO1xuICAgIH1cbiAgfSk7XG4gIF8uZWFjaChqc29uLmVkZ2VzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIGcuc2V0RWRnZSh7IHY6IGVudHJ5LnYsIHc6IGVudHJ5LncsIG5hbWU6IGVudHJ5Lm5hbWUgfSwgZW50cnkudmFsdWUpO1xuICB9KTtcbiAgcmV0dXJuIGc7XG59XG4iLCIvKiBnbG9iYWwgd2luZG93ICovXG5cbnZhciBsb2Rhc2g7XG5cbmlmICh0eXBlb2YgcmVxdWlyZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gIHRyeSB7XG4gICAgbG9kYXNoID0ge1xuICAgICAgY2xvbmU6IHJlcXVpcmUoXCJsb2Rhc2gvY2xvbmVcIiksXG4gICAgICBjb25zdGFudDogcmVxdWlyZShcImxvZGFzaC9jb25zdGFudFwiKSxcbiAgICAgIGVhY2g6IHJlcXVpcmUoXCJsb2Rhc2gvZWFjaFwiKSxcbiAgICAgIGZpbHRlcjogcmVxdWlyZShcImxvZGFzaC9maWx0ZXJcIiksXG4gICAgICBoYXM6ICByZXF1aXJlKFwibG9kYXNoL2hhc1wiKSxcbiAgICAgIGlzQXJyYXk6IHJlcXVpcmUoXCJsb2Rhc2gvaXNBcnJheVwiKSxcbiAgICAgIGlzRW1wdHk6IHJlcXVpcmUoXCJsb2Rhc2gvaXNFbXB0eVwiKSxcbiAgICAgIGlzRnVuY3Rpb246IHJlcXVpcmUoXCJsb2Rhc2gvaXNGdW5jdGlvblwiKSxcbiAgICAgIGlzVW5kZWZpbmVkOiByZXF1aXJlKFwibG9kYXNoL2lzVW5kZWZpbmVkXCIpLFxuICAgICAga2V5czogcmVxdWlyZShcImxvZGFzaC9rZXlzXCIpLFxuICAgICAgbWFwOiByZXF1aXJlKFwibG9kYXNoL21hcFwiKSxcbiAgICAgIHJlZHVjZTogcmVxdWlyZShcImxvZGFzaC9yZWR1Y2VcIiksXG4gICAgICBzaXplOiByZXF1aXJlKFwibG9kYXNoL3NpemVcIiksXG4gICAgICB0cmFuc2Zvcm06IHJlcXVpcmUoXCJsb2Rhc2gvdHJhbnNmb3JtXCIpLFxuICAgICAgdW5pb246IHJlcXVpcmUoXCJsb2Rhc2gvdW5pb25cIiksXG4gICAgICB2YWx1ZXM6IHJlcXVpcmUoXCJsb2Rhc2gvdmFsdWVzXCIpXG4gICAgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGNvbnRpbnVlIHJlZ2FyZGxlc3Mgb2YgZXJyb3JcbiAgfVxufVxuXG5pZiAoIWxvZGFzaCkge1xuICBsb2Rhc2ggPSB3aW5kb3cuXztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsb2Rhc2g7XG4iLCJtb2R1bGUuZXhwb3J0cyA9ICcyLjEuOCc7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2hlYXAnKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS44LjBcbihmdW5jdGlvbigpIHtcbiAgdmFyIEhlYXAsIGRlZmF1bHRDbXAsIGZsb29yLCBoZWFwaWZ5LCBoZWFwcG9wLCBoZWFwcHVzaCwgaGVhcHB1c2hwb3AsIGhlYXByZXBsYWNlLCBpbnNvcnQsIG1pbiwgbmxhcmdlc3QsIG5zbWFsbGVzdCwgdXBkYXRlSXRlbSwgX3NpZnRkb3duLCBfc2lmdHVwO1xuXG4gIGZsb29yID0gTWF0aC5mbG9vciwgbWluID0gTWF0aC5taW47XG5cblxuICAvKlxuICBEZWZhdWx0IGNvbXBhcmlzb24gZnVuY3Rpb24gdG8gYmUgdXNlZFxuICAgKi9cblxuICBkZWZhdWx0Q21wID0gZnVuY3Rpb24oeCwgeSkge1xuICAgIGlmICh4IDwgeSkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBpZiAoeCA+IHkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfTtcblxuXG4gIC8qXG4gIEluc2VydCBpdGVtIHggaW4gbGlzdCBhLCBhbmQga2VlcCBpdCBzb3J0ZWQgYXNzdW1pbmcgYSBpcyBzb3J0ZWQuXG4gIFxuICBJZiB4IGlzIGFscmVhZHkgaW4gYSwgaW5zZXJ0IGl0IHRvIHRoZSByaWdodCBvZiB0aGUgcmlnaHRtb3N0IHguXG4gIFxuICBPcHRpb25hbCBhcmdzIGxvIChkZWZhdWx0IDApIGFuZCBoaSAoZGVmYXVsdCBhLmxlbmd0aCkgYm91bmQgdGhlIHNsaWNlXG4gIG9mIGEgdG8gYmUgc2VhcmNoZWQuXG4gICAqL1xuXG4gIGluc29ydCA9IGZ1bmN0aW9uKGEsIHgsIGxvLCBoaSwgY21wKSB7XG4gICAgdmFyIG1pZDtcbiAgICBpZiAobG8gPT0gbnVsbCkge1xuICAgICAgbG8gPSAwO1xuICAgIH1cbiAgICBpZiAoY21wID09IG51bGwpIHtcbiAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG4gICAgfVxuICAgIGlmIChsbyA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbG8gbXVzdCBiZSBub24tbmVnYXRpdmUnKTtcbiAgICB9XG4gICAgaWYgKGhpID09IG51bGwpIHtcbiAgICAgIGhpID0gYS5sZW5ndGg7XG4gICAgfVxuICAgIHdoaWxlIChsbyA8IGhpKSB7XG4gICAgICBtaWQgPSBmbG9vcigobG8gKyBoaSkgLyAyKTtcbiAgICAgIGlmIChjbXAoeCwgYVttaWRdKSA8IDApIHtcbiAgICAgICAgaGkgPSBtaWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsbyA9IG1pZCArIDE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoW10uc3BsaWNlLmFwcGx5KGEsIFtsbywgbG8gLSBsb10uY29uY2F0KHgpKSwgeCk7XG4gIH07XG5cblxuICAvKlxuICBQdXNoIGl0ZW0gb250byBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuXG4gICAqL1xuXG4gIGhlYXBwdXNoID0gZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGNtcCkge1xuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgYXJyYXkucHVzaChpdGVtKTtcbiAgICByZXR1cm4gX3NpZnRkb3duKGFycmF5LCAwLCBhcnJheS5sZW5ndGggLSAxLCBjbXApO1xuICB9O1xuXG5cbiAgLypcbiAgUG9wIHRoZSBzbWFsbGVzdCBpdGVtIG9mZiB0aGUgaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LlxuICAgKi9cblxuICBoZWFwcG9wID0gZnVuY3Rpb24oYXJyYXksIGNtcCkge1xuICAgIHZhciBsYXN0ZWx0LCByZXR1cm5pdGVtO1xuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgbGFzdGVsdCA9IGFycmF5LnBvcCgpO1xuICAgIGlmIChhcnJheS5sZW5ndGgpIHtcbiAgICAgIHJldHVybml0ZW0gPSBhcnJheVswXTtcbiAgICAgIGFycmF5WzBdID0gbGFzdGVsdDtcbiAgICAgIF9zaWZ0dXAoYXJyYXksIDAsIGNtcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybml0ZW0gPSBsYXN0ZWx0O1xuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuaXRlbTtcbiAgfTtcblxuXG4gIC8qXG4gIFBvcCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHNtYWxsZXN0IHZhbHVlLCBhbmQgYWRkIHRoZSBuZXcgaXRlbS5cbiAgXG4gIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBoZWFwcG9wKCkgZm9sbG93ZWQgYnkgaGVhcHB1c2goKSwgYW5kIGNhbiBiZVxuICBtb3JlIGFwcHJvcHJpYXRlIHdoZW4gdXNpbmcgYSBmaXhlZCBzaXplIGhlYXAuIE5vdGUgdGhhdCB0aGUgdmFsdWVcbiAgcmV0dXJuZWQgbWF5IGJlIGxhcmdlciB0aGFuIGl0ZW0hIFRoYXQgY29uc3RyYWlucyByZWFzb25hYmxlIHVzZSBvZlxuICB0aGlzIHJvdXRpbmUgdW5sZXNzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIGNvbmRpdGlvbmFsIHJlcGxhY2VtZW50OlxuICAgICAgaWYgaXRlbSA+IGFycmF5WzBdXG4gICAgICAgIGl0ZW0gPSBoZWFwcmVwbGFjZShhcnJheSwgaXRlbSlcbiAgICovXG5cbiAgaGVhcHJlcGxhY2UgPSBmdW5jdGlvbihhcnJheSwgaXRlbSwgY21wKSB7XG4gICAgdmFyIHJldHVybml0ZW07XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICByZXR1cm5pdGVtID0gYXJyYXlbMF07XG4gICAgYXJyYXlbMF0gPSBpdGVtO1xuICAgIF9zaWZ0dXAoYXJyYXksIDAsIGNtcCk7XG4gICAgcmV0dXJuIHJldHVybml0ZW07XG4gIH07XG5cblxuICAvKlxuICBGYXN0IHZlcnNpb24gb2YgYSBoZWFwcHVzaCBmb2xsb3dlZCBieSBhIGhlYXBwb3AuXG4gICAqL1xuXG4gIGhlYXBwdXNocG9wID0gZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGNtcCkge1xuICAgIHZhciBfcmVmO1xuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgaWYgKGFycmF5Lmxlbmd0aCAmJiBjbXAoYXJyYXlbMF0sIGl0ZW0pIDwgMCkge1xuICAgICAgX3JlZiA9IFthcnJheVswXSwgaXRlbV0sIGl0ZW0gPSBfcmVmWzBdLCBhcnJheVswXSA9IF9yZWZbMV07XG4gICAgICBfc2lmdHVwKGFycmF5LCAwLCBjbXApO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbTtcbiAgfTtcblxuXG4gIC8qXG4gIFRyYW5zZm9ybSBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gTyhhcnJheS5sZW5ndGgpIHRpbWUuXG4gICAqL1xuXG4gIGhlYXBpZnkgPSBmdW5jdGlvbihhcnJheSwgY21wKSB7XG4gICAgdmFyIGksIF9pLCBfaiwgX2xlbiwgX3JlZiwgX3JlZjEsIF9yZXN1bHRzLCBfcmVzdWx0czE7XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICBfcmVmMSA9IChmdW5jdGlvbigpIHtcbiAgICAgIF9yZXN1bHRzMSA9IFtdO1xuICAgICAgZm9yICh2YXIgX2ogPSAwLCBfcmVmID0gZmxvb3IoYXJyYXkubGVuZ3RoIC8gMik7IDAgPD0gX3JlZiA/IF9qIDwgX3JlZiA6IF9qID4gX3JlZjsgMCA8PSBfcmVmID8gX2orKyA6IF9qLS0peyBfcmVzdWx0czEucHVzaChfaik7IH1cbiAgICAgIHJldHVybiBfcmVzdWx0czE7XG4gICAgfSkuYXBwbHkodGhpcykucmV2ZXJzZSgpO1xuICAgIF9yZXN1bHRzID0gW107XG4gICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMS5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgaSA9IF9yZWYxW19pXTtcbiAgICAgIF9yZXN1bHRzLnB1c2goX3NpZnR1cChhcnJheSwgaSwgY21wKSk7XG4gICAgfVxuICAgIHJldHVybiBfcmVzdWx0cztcbiAgfTtcblxuXG4gIC8qXG4gIFVwZGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGdpdmVuIGl0ZW0gaW4gdGhlIGhlYXAuXG4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBpdGVtIGlzIGJlaW5nIG1vZGlmaWVkLlxuICAgKi9cblxuICB1cGRhdGVJdGVtID0gZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGNtcCkge1xuICAgIHZhciBwb3M7XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICBwb3MgPSBhcnJheS5pbmRleE9mKGl0ZW0pO1xuICAgIGlmIChwb3MgPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIF9zaWZ0ZG93bihhcnJheSwgMCwgcG9zLCBjbXApO1xuICAgIHJldHVybiBfc2lmdHVwKGFycmF5LCBwb3MsIGNtcCk7XG4gIH07XG5cblxuICAvKlxuICBGaW5kIHRoZSBuIGxhcmdlc3QgZWxlbWVudHMgaW4gYSBkYXRhc2V0LlxuICAgKi9cblxuICBubGFyZ2VzdCA9IGZ1bmN0aW9uKGFycmF5LCBuLCBjbXApIHtcbiAgICB2YXIgZWxlbSwgcmVzdWx0LCBfaSwgX2xlbiwgX3JlZjtcbiAgICBpZiAoY21wID09IG51bGwpIHtcbiAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG4gICAgfVxuICAgIHJlc3VsdCA9IGFycmF5LnNsaWNlKDAsIG4pO1xuICAgIGlmICghcmVzdWx0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaGVhcGlmeShyZXN1bHQsIGNtcCk7XG4gICAgX3JlZiA9IGFycmF5LnNsaWNlKG4pO1xuICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgZWxlbSA9IF9yZWZbX2ldO1xuICAgICAgaGVhcHB1c2hwb3AocmVzdWx0LCBlbGVtLCBjbXApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LnNvcnQoY21wKS5yZXZlcnNlKCk7XG4gIH07XG5cblxuICAvKlxuICBGaW5kIHRoZSBuIHNtYWxsZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cbiAgICovXG5cbiAgbnNtYWxsZXN0ID0gZnVuY3Rpb24oYXJyYXksIG4sIGNtcCkge1xuICAgIHZhciBlbGVtLCBpLCBsb3MsIHJlc3VsdCwgX2ksIF9qLCBfbGVuLCBfcmVmLCBfcmVmMSwgX3Jlc3VsdHM7XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICBpZiAobiAqIDEwIDw9IGFycmF5Lmxlbmd0aCkge1xuICAgICAgcmVzdWx0ID0gYXJyYXkuc2xpY2UoMCwgbikuc29ydChjbXApO1xuICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBsb3MgPSByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdO1xuICAgICAgX3JlZiA9IGFycmF5LnNsaWNlKG4pO1xuICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgIGVsZW0gPSBfcmVmW19pXTtcbiAgICAgICAgaWYgKGNtcChlbGVtLCBsb3MpIDwgMCkge1xuICAgICAgICAgIGluc29ydChyZXN1bHQsIGVsZW0sIDAsIG51bGwsIGNtcCk7XG4gICAgICAgICAgcmVzdWx0LnBvcCgpO1xuICAgICAgICAgIGxvcyA9IHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGhlYXBpZnkoYXJyYXksIGNtcCk7XG4gICAgX3Jlc3VsdHMgPSBbXTtcbiAgICBmb3IgKGkgPSBfaiA9IDAsIF9yZWYxID0gbWluKG4sIGFycmF5Lmxlbmd0aCk7IDAgPD0gX3JlZjEgPyBfaiA8IF9yZWYxIDogX2ogPiBfcmVmMTsgaSA9IDAgPD0gX3JlZjEgPyArK19qIDogLS1faikge1xuICAgICAgX3Jlc3VsdHMucHVzaChoZWFwcG9wKGFycmF5LCBjbXApKTtcbiAgICB9XG4gICAgcmV0dXJuIF9yZXN1bHRzO1xuICB9O1xuXG4gIF9zaWZ0ZG93biA9IGZ1bmN0aW9uKGFycmF5LCBzdGFydHBvcywgcG9zLCBjbXApIHtcbiAgICB2YXIgbmV3aXRlbSwgcGFyZW50LCBwYXJlbnRwb3M7XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICBuZXdpdGVtID0gYXJyYXlbcG9zXTtcbiAgICB3aGlsZSAocG9zID4gc3RhcnRwb3MpIHtcbiAgICAgIHBhcmVudHBvcyA9IChwb3MgLSAxKSA+PiAxO1xuICAgICAgcGFyZW50ID0gYXJyYXlbcGFyZW50cG9zXTtcbiAgICAgIGlmIChjbXAobmV3aXRlbSwgcGFyZW50KSA8IDApIHtcbiAgICAgICAgYXJyYXlbcG9zXSA9IHBhcmVudDtcbiAgICAgICAgcG9zID0gcGFyZW50cG9zO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXlbcG9zXSA9IG5ld2l0ZW07XG4gIH07XG5cbiAgX3NpZnR1cCA9IGZ1bmN0aW9uKGFycmF5LCBwb3MsIGNtcCkge1xuICAgIHZhciBjaGlsZHBvcywgZW5kcG9zLCBuZXdpdGVtLCByaWdodHBvcywgc3RhcnRwb3M7XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICBlbmRwb3MgPSBhcnJheS5sZW5ndGg7XG4gICAgc3RhcnRwb3MgPSBwb3M7XG4gICAgbmV3aXRlbSA9IGFycmF5W3Bvc107XG4gICAgY2hpbGRwb3MgPSAyICogcG9zICsgMTtcbiAgICB3aGlsZSAoY2hpbGRwb3MgPCBlbmRwb3MpIHtcbiAgICAgIHJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxO1xuICAgICAgaWYgKHJpZ2h0cG9zIDwgZW5kcG9zICYmICEoY21wKGFycmF5W2NoaWxkcG9zXSwgYXJyYXlbcmlnaHRwb3NdKSA8IDApKSB7XG4gICAgICAgIGNoaWxkcG9zID0gcmlnaHRwb3M7XG4gICAgICB9XG4gICAgICBhcnJheVtwb3NdID0gYXJyYXlbY2hpbGRwb3NdO1xuICAgICAgcG9zID0gY2hpbGRwb3M7XG4gICAgICBjaGlsZHBvcyA9IDIgKiBwb3MgKyAxO1xuICAgIH1cbiAgICBhcnJheVtwb3NdID0gbmV3aXRlbTtcbiAgICByZXR1cm4gX3NpZnRkb3duKGFycmF5LCBzdGFydHBvcywgcG9zLCBjbXApO1xuICB9O1xuXG4gIEhlYXAgPSAoZnVuY3Rpb24oKSB7XG4gICAgSGVhcC5wdXNoID0gaGVhcHB1c2g7XG5cbiAgICBIZWFwLnBvcCA9IGhlYXBwb3A7XG5cbiAgICBIZWFwLnJlcGxhY2UgPSBoZWFwcmVwbGFjZTtcblxuICAgIEhlYXAucHVzaHBvcCA9IGhlYXBwdXNocG9wO1xuXG4gICAgSGVhcC5oZWFwaWZ5ID0gaGVhcGlmeTtcblxuICAgIEhlYXAudXBkYXRlSXRlbSA9IHVwZGF0ZUl0ZW07XG5cbiAgICBIZWFwLm5sYXJnZXN0ID0gbmxhcmdlc3Q7XG5cbiAgICBIZWFwLm5zbWFsbGVzdCA9IG5zbWFsbGVzdDtcblxuICAgIGZ1bmN0aW9uIEhlYXAoY21wKSB7XG4gICAgICB0aGlzLmNtcCA9IGNtcCAhPSBudWxsID8gY21wIDogZGVmYXVsdENtcDtcbiAgICAgIHRoaXMubm9kZXMgPSBbXTtcbiAgICB9XG5cbiAgICBIZWFwLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIGhlYXBwdXNoKHRoaXMubm9kZXMsIHgsIHRoaXMuY21wKTtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gaGVhcHBvcCh0aGlzLm5vZGVzLCB0aGlzLmNtcCk7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLnBlZWsgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzWzBdO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzLmluZGV4T2YoeCkgIT09IC0xO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIGhlYXByZXBsYWNlKHRoaXMubm9kZXMsIHgsIHRoaXMuY21wKTtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUucHVzaHBvcCA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiBoZWFwcHVzaHBvcCh0aGlzLm5vZGVzLCB4LCB0aGlzLmNtcCk7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLmhlYXBpZnkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBoZWFwaWZ5KHRoaXMubm9kZXMsIHRoaXMuY21wKTtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUudXBkYXRlSXRlbSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiB1cGRhdGVJdGVtKHRoaXMubm9kZXMsIHgsIHRoaXMuY21wKTtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzID0gW107XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLmVtcHR5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2Rlcy5sZW5ndGggPT09IDA7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzLmxlbmd0aDtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBoZWFwO1xuICAgICAgaGVhcCA9IG5ldyBIZWFwKCk7XG4gICAgICBoZWFwLm5vZGVzID0gdGhpcy5ub2Rlcy5zbGljZSgwKTtcbiAgICAgIHJldHVybiBoZWFwO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2Rlcy5zbGljZSgwKTtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUuaW5zZXJ0ID0gSGVhcC5wcm90b3R5cGUucHVzaDtcblxuICAgIEhlYXAucHJvdG90eXBlLnRvcCA9IEhlYXAucHJvdG90eXBlLnBlZWs7XG5cbiAgICBIZWFwLnByb3RvdHlwZS5mcm9udCA9IEhlYXAucHJvdG90eXBlLnBlZWs7XG5cbiAgICBIZWFwLnByb3RvdHlwZS5oYXMgPSBIZWFwLnByb3RvdHlwZS5jb250YWlucztcblxuICAgIEhlYXAucHJvdG90eXBlLmNvcHkgPSBIZWFwLnByb3RvdHlwZS5jbG9uZTtcblxuICAgIHJldHVybiBIZWFwO1xuXG4gIH0pKCk7XG5cbiAgKGZ1bmN0aW9uKHJvb3QsIGZhY3RvcnkpIHtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICByZXR1cm4gZGVmaW5lKFtdLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcm9vdC5IZWFwID0gZmFjdG9yeSgpO1xuICAgIH1cbiAgfSkodGhpcywgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIEhlYXA7XG4gIH0pO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbi8qKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vISBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbnZhciBSRUFDVF9TVEFUSUNTID0ge1xuICBjaGlsZENvbnRleHRUeXBlczogdHJ1ZSxcbiAgY29udGV4dFR5cGU6IHRydWUsXG4gIGNvbnRleHRUeXBlczogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgZ2V0RGVmYXVsdFByb3BzOiB0cnVlLFxuICBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I6IHRydWUsXG4gIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wczogdHJ1ZSxcbiAgbWl4aW5zOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWUsXG4gIHR5cGU6IHRydWVcbn07XG52YXIgS05PV05fU1RBVElDUyA9IHtcbiAgbmFtZTogdHJ1ZSxcbiAgbGVuZ3RoOiB0cnVlLFxuICBwcm90b3R5cGU6IHRydWUsXG4gIGNhbGxlcjogdHJ1ZSxcbiAgY2FsbGVlOiB0cnVlLFxuICBhcmd1bWVudHM6IHRydWUsXG4gIGFyaXR5OiB0cnVlXG59O1xudmFyIEZPUldBUkRfUkVGX1NUQVRJQ1MgPSB7XG4gICckJHR5cGVvZic6IHRydWUsXG4gIHJlbmRlcjogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlXG59O1xudmFyIE1FTU9fU1RBVElDUyA9IHtcbiAgJyQkdHlwZW9mJzogdHJ1ZSxcbiAgY29tcGFyZTogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlLFxuICB0eXBlOiB0cnVlXG59O1xudmFyIFRZUEVfU1RBVElDUyA9IHt9O1xuVFlQRV9TVEFUSUNTW3JlYWN0SXMuRm9yd2FyZFJlZl0gPSBGT1JXQVJEX1JFRl9TVEFUSUNTO1xuVFlQRV9TVEFUSUNTW3JlYWN0SXMuTWVtb10gPSBNRU1PX1NUQVRJQ1M7XG5cbmZ1bmN0aW9uIGdldFN0YXRpY3MoY29tcG9uZW50KSB7XG4gIC8vIFJlYWN0IHYxNi4xMSBhbmQgYmVsb3dcbiAgaWYgKHJlYWN0SXMuaXNNZW1vKGNvbXBvbmVudCkpIHtcbiAgICByZXR1cm4gTUVNT19TVEFUSUNTO1xuICB9IC8vIFJlYWN0IHYxNi4xMiBhbmQgYWJvdmVcblxuXG4gIHJldHVybiBUWVBFX1NUQVRJQ1NbY29tcG9uZW50WyckJHR5cGVvZiddXSB8fCBSRUFDVF9TVEFUSUNTO1xufVxuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciBvYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuZnVuY3Rpb24gaG9pc3ROb25SZWFjdFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50LCBzb3VyY2VDb21wb25lbnQsIGJsYWNrbGlzdCkge1xuICBpZiAodHlwZW9mIHNvdXJjZUNvbXBvbmVudCAhPT0gJ3N0cmluZycpIHtcbiAgICAvLyBkb24ndCBob2lzdCBvdmVyIHN0cmluZyAoaHRtbCkgY29tcG9uZW50c1xuICAgIGlmIChvYmplY3RQcm90b3R5cGUpIHtcbiAgICAgIHZhciBpbmhlcml0ZWRDb21wb25lbnQgPSBnZXRQcm90b3R5cGVPZihzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgICBpZiAoaW5oZXJpdGVkQ29tcG9uZW50ICYmIGluaGVyaXRlZENvbXBvbmVudCAhPT0gb2JqZWN0UHJvdG90eXBlKSB7XG4gICAgICAgIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKHRhcmdldENvbXBvbmVudCwgaW5oZXJpdGVkQ29tcG9uZW50LCBibGFja2xpc3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgaWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAga2V5cyA9IGtleXMuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2VDb21wb25lbnQpKTtcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0U3RhdGljcyA9IGdldFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50KTtcbiAgICB2YXIgc291cmNlU3RhdGljcyA9IGdldFN0YXRpY3Moc291cmNlQ29tcG9uZW50KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmICghS05PV05fU1RBVElDU1trZXldICYmICEoYmxhY2tsaXN0ICYmIGJsYWNrbGlzdFtrZXldKSAmJiAhKHNvdXJjZVN0YXRpY3MgJiYgc291cmNlU3RhdGljc1trZXldKSAmJiAhKHRhcmdldFN0YXRpY3MgJiYgdGFyZ2V0U3RhdGljc1trZXldKSkge1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2VDb21wb25lbnQsIGtleSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBBdm9pZCBmYWlsdXJlcyBmcm9tIHJlYWQtb25seSBwcm9wZXJ0aWVzXG4gICAgICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0Q29tcG9uZW50LCBrZXksIGRlc2NyaXB0b3IpO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXRDb21wb25lbnQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaG9pc3ROb25SZWFjdFN0YXRpY3M7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBVc2UgaW52YXJpYW50KCkgdG8gYXNzZXJ0IHN0YXRlIHdoaWNoIHlvdXIgcHJvZ3JhbSBhc3N1bWVzIHRvIGJlIHRydWUuXG4gKlxuICogUHJvdmlkZSBzcHJpbnRmLXN0eWxlIGZvcm1hdCAob25seSAlcyBpcyBzdXBwb3J0ZWQpIGFuZCBhcmd1bWVudHNcbiAqIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBicm9rZSBhbmQgd2hhdCB5b3Ugd2VyZVxuICogZXhwZWN0aW5nLlxuICpcbiAqIFRoZSBpbnZhcmlhbnQgbWVzc2FnZSB3aWxsIGJlIHN0cmlwcGVkIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgaW52YXJpYW50XG4gKiB3aWxsIHJlbWFpbiB0byBlbnN1cmUgbG9naWMgZG9lcyBub3QgZGlmZmVyIGluIHByb2R1Y3Rpb24uXG4gKi9cblxudmFyIGludmFyaWFudCA9IGZ1bmN0aW9uKGNvbmRpdGlvbiwgZm9ybWF0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFyaWFudCByZXF1aXJlcyBhbiBlcnJvciBtZXNzYWdlIGFyZ3VtZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB2YXIgZXJyb3I7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgJ01pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50ICcgK1xuICAgICAgICAnZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4nXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXJncyA9IFthLCBiLCBjLCBkLCBlLCBmXTtcbiAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJnc1thcmdJbmRleCsrXTsgfSlcbiAgICAgICk7XG4gICAgICBlcnJvci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgIH1cblxuICAgIGVycm9yLmZyYW1lc1RvUG9wID0gMTsgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCBpbnZhcmlhbnQncyBvd24gZnJhbWVcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBpbnZhcmlhbnQ7XG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG4vKipcclxuICogSXMgdGhpcyBzdHJpbmcgYWxsIHdoaXRlc3BhY2U/XHJcbiAqIFRoaXMgc29sdXRpb24ga2luZCBvZiBtYWtlcyBteSBicmFpbiBodXJ0LCBidXQgaXQncyBzaWduaWZpY2FudGx5IGZhc3RlclxyXG4gKiB0aGFuICFzdHIudHJpbSgpIG9yIGFueSBvdGhlciBzb2x1dGlvbiBJIGNvdWxkIGZpbmQuXHJcbiAqXHJcbiAqIHdoaXRlc3BhY2UgY29kZXMgZnJvbTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XaGl0ZXNwYWNlX2NoYXJhY3RlclxyXG4gKiBhbmQgdmVyaWZpZWQgd2l0aDpcclxuICpcclxuICogIGZvcih2YXIgaSA9IDA7IGkgPCA2NTUzNjsgaSsrKSB7XHJcbiAqICAgICAgdmFyIHMgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpO1xyXG4gKiAgICAgIGlmKCtzPT09MCAmJiAhcy50cmltKCkpIGNvbnNvbGUubG9nKGksIHMpO1xyXG4gKiAgfVxyXG4gKlxyXG4gKiB3aGljaCBjb3VudHMgYSBjb3VwbGUgb2YgdGhlc2UgYXMgKm5vdCogd2hpdGVzcGFjZSwgYnV0IGZpbmRzIG5vdGhpbmcgZWxzZVxyXG4gKiB0aGF0ICppcyogd2hpdGVzcGFjZS4gTm90ZSB0aGF0IGNoYXJDb2RlQXQgc3RvcHMgYXQgMTYgYml0cywgYnV0IGl0IGFwcGVhcnNcclxuICogdGhhdCB0aGVyZSBhcmUgbm8gd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGFib3ZlIHRoaXMsIGFuZCBjb2RlIHBvaW50cyBhYm92ZVxyXG4gKiB0aGlzIGRvIG5vdCBtYXAgb250byB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzLlxyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oc3RyKXtcclxuICAgIHZhciBsID0gc3RyLmxlbmd0aCxcclxuICAgICAgICBhO1xyXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGEgPSBzdHIuY2hhckNvZGVBdChpKTtcclxuICAgICAgICBpZigoYSA8IDkgfHwgYSA+IDEzKSAmJiAoYSAhPT0gMzIpICYmIChhICE9PSAxMzMpICYmIChhICE9PSAxNjApICYmXHJcbiAgICAgICAgICAgIChhICE9PSA1NzYwKSAmJiAoYSAhPT0gNjE1OCkgJiYgKGEgPCA4MTkyIHx8IGEgPiA4MjA1KSAmJlxyXG4gICAgICAgICAgICAoYSAhPT0gODIzMikgJiYgKGEgIT09IDgyMzMpICYmIChhICE9PSA4MjM5KSAmJiAoYSAhPT0gODI4NykgJiZcclxuICAgICAgICAgICAgKGEgIT09IDgyODgpICYmIChhICE9PSAxMjI4OCkgJiYgKGEgIT09IDY1Mjc5KSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcbiIsIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImxheW91dEJhc2VcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wibGF5b3V0QmFzZVwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuLyoqKioqKi8gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRnZXQ6IGdldHRlclxuLyoqKioqKi8gXHRcdFx0fSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDI4KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gTGF5b3V0Q29uc3RhbnRzKCkge31cblxuLyoqXHJcbiAqIExheW91dCBRdWFsaXR5OiAwOmRyYWZ0LCAxOmRlZmF1bHQsIDI6cHJvb2ZcclxuICovXG5MYXlvdXRDb25zdGFudHMuUVVBTElUWSA9IDE7XG5cbi8qKlxyXG4gKiBEZWZhdWx0IHBhcmFtZXRlcnNcclxuICovXG5MYXlvdXRDb25zdGFudHMuREVGQVVMVF9DUkVBVEVfQkVORFNfQVNfTkVFREVEID0gZmFsc2U7XG5MYXlvdXRDb25zdGFudHMuREVGQVVMVF9JTkNSRU1FTlRBTCA9IGZhbHNlO1xuTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX09OX0xBWU9VVCA9IHRydWU7XG5MYXlvdXRDb25zdGFudHMuREVGQVVMVF9BTklNQVRJT05fRFVSSU5HX0xBWU9VVCA9IGZhbHNlO1xuTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX1BFUklPRCA9IDUwO1xuTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfVU5JRk9STV9MRUFGX05PREVfU0laRVMgPSBmYWxzZTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlY3Rpb246IEdlbmVyYWwgb3RoZXIgY29uc3RhbnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLypcclxuICogTWFyZ2lucyBvZiBhIGdyYXBoIHRvIGJlIGFwcGxpZWQgb24gYm91ZGluZyByZWN0YW5nbGUgb2YgaXRzIGNvbnRlbnRzLiBXZVxyXG4gKiBhc3N1bWUgbWFyZ2lucyBvbiBhbGwgZm91ciBzaWRlcyB0byBiZSB1bmlmb3JtLlxyXG4gKi9cbkxheW91dENvbnN0YW50cy5ERUZBVUxUX0dSQVBIX01BUkdJTiA9IDE1O1xuXG4vKlxyXG4gKiBXaGV0aGVyIHRvIGNvbnNpZGVyIGxhYmVscyBpbiBub2RlIGRpbWVuc2lvbnMgb3Igbm90XHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUyA9IGZhbHNlO1xuXG4vKlxyXG4gKiBEZWZhdWx0IGRpbWVuc2lvbiBvZiBhIG5vbi1jb21wb3VuZCBub2RlLlxyXG4gKi9cbkxheW91dENvbnN0YW50cy5TSU1QTEVfTk9ERV9TSVpFID0gNDA7XG5cbi8qXHJcbiAqIERlZmF1bHQgZGltZW5zaW9uIG9mIGEgbm9uLWNvbXBvdW5kIG5vZGUuXHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLlNJTVBMRV9OT0RFX0hBTEZfU0laRSA9IExheW91dENvbnN0YW50cy5TSU1QTEVfTk9ERV9TSVpFIC8gMjtcblxuLypcclxuICogRW1wdHkgY29tcG91bmQgbm9kZSBzaXplLiBXaGVuIGEgY29tcG91bmQgbm9kZSBpcyBlbXB0eSwgaXRzIGJvdGhcclxuICogZGltZW5zaW9ucyBzaG91bGQgYmUgb2YgdGhpcyB2YWx1ZS5cclxuICovXG5MYXlvdXRDb25zdGFudHMuRU1QVFlfQ09NUE9VTkRfTk9ERV9TSVpFID0gNDA7XG5cbi8qXHJcbiAqIE1pbmltdW0gbGVuZ3RoIHRoYXQgYW4gZWRnZSBzaG91bGQgdGFrZSBkdXJpbmcgbGF5b3V0XHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLk1JTl9FREdFX0xFTkdUSCA9IDE7XG5cbi8qXHJcbiAqIFdvcmxkIGJvdW5kYXJpZXMgdGhhdCBsYXlvdXQgb3BlcmF0ZXMgb25cclxuICovXG5MYXlvdXRDb25zdGFudHMuV09STERfQk9VTkRBUlkgPSAxMDAwMDAwO1xuXG4vKlxyXG4gKiBXb3JsZCBib3VuZGFyaWVzIHRoYXQgcmFuZG9tIHBvc2l0aW9uaW5nIGNhbiBiZSBwZXJmb3JtZWQgd2l0aFxyXG4gKi9cbkxheW91dENvbnN0YW50cy5JTklUSUFMX1dPUkxEX0JPVU5EQVJZID0gTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZIC8gMTAwMDtcblxuLypcclxuICogQ29vcmRpbmF0ZXMgb2YgdGhlIHdvcmxkIGNlbnRlclxyXG4gKi9cbkxheW91dENvbnN0YW50cy5XT1JMRF9DRU5URVJfWCA9IDEyMDA7XG5MYXlvdXRDb25zdGFudHMuV09STERfQ0VOVEVSX1kgPSA5MDA7XG5cbm1vZHVsZS5leHBvcnRzID0gTGF5b3V0Q29uc3RhbnRzO1xuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIExHcmFwaE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG52YXIgSUdlb21ldHJ5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcbnZhciBJTWF0aCA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5cbmZ1bmN0aW9uIExFZGdlKHNvdXJjZSwgdGFyZ2V0LCB2RWRnZSkge1xuICBMR3JhcGhPYmplY3QuY2FsbCh0aGlzLCB2RWRnZSk7XG5cbiAgdGhpcy5pc092ZXJsYXBpbmdTb3VyY2VBbmRUYXJnZXQgPSBmYWxzZTtcbiAgdGhpcy52R3JhcGhPYmplY3QgPSB2RWRnZTtcbiAgdGhpcy5iZW5kcG9pbnRzID0gW107XG4gIHRoaXMuc291cmNlID0gc291cmNlO1xuICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbn1cblxuTEVkZ2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMR3JhcGhPYmplY3QucHJvdG90eXBlKTtcblxuZm9yICh2YXIgcHJvcCBpbiBMR3JhcGhPYmplY3QpIHtcbiAgTEVkZ2VbcHJvcF0gPSBMR3JhcGhPYmplY3RbcHJvcF07XG59XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRTb3VyY2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnNvdXJjZTtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRUYXJnZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnRhcmdldDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5pc0ludGVyR3JhcGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmlzSW50ZXJHcmFwaDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxlbmd0aDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5pc092ZXJsYXBpbmdTb3VyY2VBbmRUYXJnZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmlzT3ZlcmxhcGluZ1NvdXJjZUFuZFRhcmdldDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRCZW5kcG9pbnRzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5iZW5kcG9pbnRzO1xufTtcblxuTEVkZ2UucHJvdG90eXBlLmdldExjYSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubGNhO1xufTtcblxuTEVkZ2UucHJvdG90eXBlLmdldFNvdXJjZUluTGNhID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5zb3VyY2VJbkxjYTtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRUYXJnZXRJbkxjYSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMudGFyZ2V0SW5MY2E7XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuZ2V0T3RoZXJFbmQgPSBmdW5jdGlvbiAobm9kZSkge1xuICBpZiAodGhpcy5zb3VyY2UgPT09IG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy50YXJnZXQ7XG4gIH0gZWxzZSBpZiAodGhpcy50YXJnZXQgPT09IG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2U7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgXCJOb2RlIGlzIG5vdCBpbmNpZGVudCB3aXRoIHRoaXMgZWRnZVwiO1xuICB9XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuZ2V0T3RoZXJFbmRJbkdyYXBoID0gZnVuY3Rpb24gKG5vZGUsIGdyYXBoKSB7XG4gIHZhciBvdGhlckVuZCA9IHRoaXMuZ2V0T3RoZXJFbmQobm9kZSk7XG4gIHZhciByb290ID0gZ3JhcGguZ2V0R3JhcGhNYW5hZ2VyKCkuZ2V0Um9vdCgpO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKG90aGVyRW5kLmdldE93bmVyKCkgPT0gZ3JhcGgpIHtcbiAgICAgIHJldHVybiBvdGhlckVuZDtcbiAgICB9XG5cbiAgICBpZiAob3RoZXJFbmQuZ2V0T3duZXIoKSA9PSByb290KSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBvdGhlckVuZCA9IG90aGVyRW5kLmdldE93bmVyKCkuZ2V0UGFyZW50KCk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS51cGRhdGVMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjbGlwUG9pbnRDb29yZGluYXRlcyA9IG5ldyBBcnJheSg0KTtcblxuICB0aGlzLmlzT3ZlcmxhcGluZ1NvdXJjZUFuZFRhcmdldCA9IElHZW9tZXRyeS5nZXRJbnRlcnNlY3Rpb24odGhpcy50YXJnZXQuZ2V0UmVjdCgpLCB0aGlzLnNvdXJjZS5nZXRSZWN0KCksIGNsaXBQb2ludENvb3JkaW5hdGVzKTtcblxuICBpZiAoIXRoaXMuaXNPdmVybGFwaW5nU291cmNlQW5kVGFyZ2V0KSB7XG4gICAgdGhpcy5sZW5ndGhYID0gY2xpcFBvaW50Q29vcmRpbmF0ZXNbMF0gLSBjbGlwUG9pbnRDb29yZGluYXRlc1syXTtcbiAgICB0aGlzLmxlbmd0aFkgPSBjbGlwUG9pbnRDb29yZGluYXRlc1sxXSAtIGNsaXBQb2ludENvb3JkaW5hdGVzWzNdO1xuXG4gICAgaWYgKE1hdGguYWJzKHRoaXMubGVuZ3RoWCkgPCAxLjApIHtcbiAgICAgIHRoaXMubGVuZ3RoWCA9IElNYXRoLnNpZ24odGhpcy5sZW5ndGhYKTtcbiAgICB9XG5cbiAgICBpZiAoTWF0aC5hYnModGhpcy5sZW5ndGhZKSA8IDEuMCkge1xuICAgICAgdGhpcy5sZW5ndGhZID0gSU1hdGguc2lnbih0aGlzLmxlbmd0aFkpO1xuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5zcXJ0KHRoaXMubGVuZ3RoWCAqIHRoaXMubGVuZ3RoWCArIHRoaXMubGVuZ3RoWSAqIHRoaXMubGVuZ3RoWSk7XG4gIH1cbn07XG5cbkxFZGdlLnByb3RvdHlwZS51cGRhdGVMZW5ndGhTaW1wbGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMubGVuZ3RoWCA9IHRoaXMudGFyZ2V0LmdldENlbnRlclgoKSAtIHRoaXMuc291cmNlLmdldENlbnRlclgoKTtcbiAgdGhpcy5sZW5ndGhZID0gdGhpcy50YXJnZXQuZ2V0Q2VudGVyWSgpIC0gdGhpcy5zb3VyY2UuZ2V0Q2VudGVyWSgpO1xuXG4gIGlmIChNYXRoLmFicyh0aGlzLmxlbmd0aFgpIDwgMS4wKSB7XG4gICAgdGhpcy5sZW5ndGhYID0gSU1hdGguc2lnbih0aGlzLmxlbmd0aFgpO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKHRoaXMubGVuZ3RoWSkgPCAxLjApIHtcbiAgICB0aGlzLmxlbmd0aFkgPSBJTWF0aC5zaWduKHRoaXMubGVuZ3RoWSk7XG4gIH1cblxuICB0aGlzLmxlbmd0aCA9IE1hdGguc3FydCh0aGlzLmxlbmd0aFggKiB0aGlzLmxlbmd0aFggKyB0aGlzLmxlbmd0aFkgKiB0aGlzLmxlbmd0aFkpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBMRWRnZTtcblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIExHcmFwaE9iamVjdCh2R3JhcGhPYmplY3QpIHtcbiAgdGhpcy52R3JhcGhPYmplY3QgPSB2R3JhcGhPYmplY3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTEdyYXBoT2JqZWN0O1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIExHcmFwaE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG52YXIgSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xudmFyIFJlY3RhbmdsZUQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIFJhbmRvbVNlZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KTtcbnZhciBQb2ludEQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXG5mdW5jdGlvbiBMTm9kZShnbSwgbG9jLCBzaXplLCB2Tm9kZSkge1xuICAvL0FsdGVybmF0aXZlIGNvbnN0cnVjdG9yIDEgOiBMTm9kZShMR3JhcGhNYW5hZ2VyIGdtLCBQb2ludCBsb2MsIERpbWVuc2lvbiBzaXplLCBPYmplY3Qgdk5vZGUpXG4gIGlmIChzaXplID09IG51bGwgJiYgdk5vZGUgPT0gbnVsbCkge1xuICAgIHZOb2RlID0gbG9jO1xuICB9XG5cbiAgTEdyYXBoT2JqZWN0LmNhbGwodGhpcywgdk5vZGUpO1xuXG4gIC8vQWx0ZXJuYXRpdmUgY29uc3RydWN0b3IgMiA6IExOb2RlKExheW91dCBsYXlvdXQsIE9iamVjdCB2Tm9kZSlcbiAgaWYgKGdtLmdyYXBoTWFuYWdlciAhPSBudWxsKSBnbSA9IGdtLmdyYXBoTWFuYWdlcjtcblxuICB0aGlzLmVzdGltYXRlZFNpemUgPSBJbnRlZ2VyLk1JTl9WQUxVRTtcbiAgdGhpcy5pbmNsdXNpb25UcmVlRGVwdGggPSBJbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdGhpcy52R3JhcGhPYmplY3QgPSB2Tm9kZTtcbiAgdGhpcy5lZGdlcyA9IFtdO1xuICB0aGlzLmdyYXBoTWFuYWdlciA9IGdtO1xuXG4gIGlmIChzaXplICE9IG51bGwgJiYgbG9jICE9IG51bGwpIHRoaXMucmVjdCA9IG5ldyBSZWN0YW5nbGVEKGxvYy54LCBsb2MueSwgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpO2Vsc2UgdGhpcy5yZWN0ID0gbmV3IFJlY3RhbmdsZUQoKTtcbn1cblxuTE5vZGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMR3JhcGhPYmplY3QucHJvdG90eXBlKTtcbmZvciAodmFyIHByb3AgaW4gTEdyYXBoT2JqZWN0KSB7XG4gIExOb2RlW3Byb3BdID0gTEdyYXBoT2JqZWN0W3Byb3BdO1xufVxuXG5MTm9kZS5wcm90b3R5cGUuZ2V0RWRnZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmVkZ2VzO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldENoaWxkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5jaGlsZDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRPd25lciA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gIGlmICh0aGlzLm93bmVyICE9IG51bGwpIHtcbiAgLy8gICAgaWYgKCEodGhpcy5vd25lciA9PSBudWxsIHx8IHRoaXMub3duZXIuZ2V0Tm9kZXMoKS5pbmRleE9mKHRoaXMpID4gLTEpKSB7XG4gIC8vICAgICAgdGhyb3cgXCJhc3NlcnQgZmFpbGVkXCI7XG4gIC8vICAgIH1cbiAgLy8gIH1cblxuICByZXR1cm4gdGhpcy5vd25lcjtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucmVjdC53aWR0aDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5zZXRXaWR0aCA9IGZ1bmN0aW9uICh3aWR0aCkge1xuICB0aGlzLnJlY3Qud2lkdGggPSB3aWR0aDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QuaGVpZ2h0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLnNldEhlaWdodCA9IGZ1bmN0aW9uIChoZWlnaHQpIHtcbiAgdGhpcy5yZWN0LmhlaWdodCA9IGhlaWdodDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRDZW50ZXJYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZWN0LnggKyB0aGlzLnJlY3Qud2lkdGggLyAyO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldENlbnRlclkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QueSArIHRoaXMucmVjdC5oZWlnaHQgLyAyO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldENlbnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBQb2ludEQodGhpcy5yZWN0LnggKyB0aGlzLnJlY3Qud2lkdGggLyAyLCB0aGlzLnJlY3QueSArIHRoaXMucmVjdC5oZWlnaHQgLyAyKTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRMb2NhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBQb2ludEQodGhpcy5yZWN0LngsIHRoaXMucmVjdC55KTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRSZWN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZWN0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldERpYWdvbmFsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMucmVjdC53aWR0aCAqIHRoaXMucmVjdC53aWR0aCArIHRoaXMucmVjdC5oZWlnaHQgKiB0aGlzLnJlY3QuaGVpZ2h0KTtcbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBoYWxmIHRoZSBkaWFnb25hbCBsZW5ndGggb2YgdGhpcyBub2RlLlxuICovXG5MTm9kZS5wcm90b3R5cGUuZ2V0SGFsZlRoZURpYWdvbmFsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMucmVjdC5oZWlnaHQgKiB0aGlzLnJlY3QuaGVpZ2h0ICsgdGhpcy5yZWN0LndpZHRoICogdGhpcy5yZWN0LndpZHRoKSAvIDI7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuc2V0UmVjdCA9IGZ1bmN0aW9uICh1cHBlckxlZnQsIGRpbWVuc2lvbikge1xuICB0aGlzLnJlY3QueCA9IHVwcGVyTGVmdC54O1xuICB0aGlzLnJlY3QueSA9IHVwcGVyTGVmdC55O1xuICB0aGlzLnJlY3Qud2lkdGggPSBkaW1lbnNpb24ud2lkdGg7XG4gIHRoaXMucmVjdC5oZWlnaHQgPSBkaW1lbnNpb24uaGVpZ2h0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLnNldENlbnRlciA9IGZ1bmN0aW9uIChjeCwgY3kpIHtcbiAgdGhpcy5yZWN0LnggPSBjeCAtIHRoaXMucmVjdC53aWR0aCAvIDI7XG4gIHRoaXMucmVjdC55ID0gY3kgLSB0aGlzLnJlY3QuaGVpZ2h0IC8gMjtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5zZXRMb2NhdGlvbiA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gIHRoaXMucmVjdC54ID0geDtcbiAgdGhpcy5yZWN0LnkgPSB5O1xufTtcblxuTE5vZGUucHJvdG90eXBlLm1vdmVCeSA9IGZ1bmN0aW9uIChkeCwgZHkpIHtcbiAgdGhpcy5yZWN0LnggKz0gZHg7XG4gIHRoaXMucmVjdC55ICs9IGR5O1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldEVkZ2VMaXN0VG9Ob2RlID0gZnVuY3Rpb24gKHRvKSB7XG4gIHZhciBlZGdlTGlzdCA9IFtdO1xuICB2YXIgZWRnZTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIHNlbGYuZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuXG4gICAgaWYgKGVkZ2UudGFyZ2V0ID09IHRvKSB7XG4gICAgICBpZiAoZWRnZS5zb3VyY2UgIT0gc2VsZikgdGhyb3cgXCJJbmNvcnJlY3QgZWRnZSBzb3VyY2UhXCI7XG5cbiAgICAgIGVkZ2VMaXN0LnB1c2goZWRnZSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZWRnZUxpc3Q7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0RWRnZXNCZXR3ZWVuID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gIHZhciBlZGdlTGlzdCA9IFtdO1xuICB2YXIgZWRnZTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYuZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuXG4gICAgaWYgKCEoZWRnZS5zb3VyY2UgPT0gc2VsZiB8fCBlZGdlLnRhcmdldCA9PSBzZWxmKSkgdGhyb3cgXCJJbmNvcnJlY3QgZWRnZSBzb3VyY2UgYW5kL29yIHRhcmdldFwiO1xuXG4gICAgaWYgKGVkZ2UudGFyZ2V0ID09IG90aGVyIHx8IGVkZ2Uuc291cmNlID09IG90aGVyKSB7XG4gICAgICBlZGdlTGlzdC5wdXNoKGVkZ2UpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGVkZ2VMaXN0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldE5laWdoYm9yc0xpc3QgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBuZWlnaGJvcnMgPSBuZXcgU2V0KCk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLmVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcblxuICAgIGlmIChlZGdlLnNvdXJjZSA9PSBzZWxmKSB7XG4gICAgICBuZWlnaGJvcnMuYWRkKGVkZ2UudGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVkZ2UudGFyZ2V0ICE9IHNlbGYpIHtcbiAgICAgICAgdGhyb3cgXCJJbmNvcnJlY3QgaW5jaWRlbmN5IVwiO1xuICAgICAgfVxuXG4gICAgICBuZWlnaGJvcnMuYWRkKGVkZ2Uuc291cmNlKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBuZWlnaGJvcnM7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUud2l0aENoaWxkcmVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgd2l0aE5laWdoYm9yc0xpc3QgPSBuZXcgU2V0KCk7XG4gIHZhciBjaGlsZE5vZGU7XG4gIHZhciBjaGlsZHJlbjtcblxuICB3aXRoTmVpZ2hib3JzTGlzdC5hZGQodGhpcyk7XG5cbiAgaWYgKHRoaXMuY2hpbGQgIT0gbnVsbCkge1xuICAgIHZhciBub2RlcyA9IHRoaXMuY2hpbGQuZ2V0Tm9kZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZE5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIGNoaWxkcmVuID0gY2hpbGROb2RlLndpdGhDaGlsZHJlbigpO1xuICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB3aXRoTmVpZ2hib3JzTGlzdC5hZGQobm9kZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd2l0aE5laWdoYm9yc0xpc3Q7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0Tm9PZkNoaWxkcmVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm9PZkNoaWxkcmVuID0gMDtcbiAgdmFyIGNoaWxkTm9kZTtcblxuICBpZiAodGhpcy5jaGlsZCA9PSBudWxsKSB7XG4gICAgbm9PZkNoaWxkcmVuID0gMTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLmNoaWxkLmdldE5vZGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGROb2RlID0gbm9kZXNbaV07XG5cbiAgICAgIG5vT2ZDaGlsZHJlbiArPSBjaGlsZE5vZGUuZ2V0Tm9PZkNoaWxkcmVuKCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG5vT2ZDaGlsZHJlbiA9PSAwKSB7XG4gICAgbm9PZkNoaWxkcmVuID0gMTtcbiAgfVxuICByZXR1cm4gbm9PZkNoaWxkcmVuO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldEVzdGltYXRlZFNpemUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmVzdGltYXRlZFNpemUgPT0gSW50ZWdlci5NSU5fVkFMVUUpIHtcbiAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgfVxuICByZXR1cm4gdGhpcy5lc3RpbWF0ZWRTaXplO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmNhbGNFc3RpbWF0ZWRTaXplID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jaGlsZCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuZXN0aW1hdGVkU2l6ZSA9ICh0aGlzLnJlY3Qud2lkdGggKyB0aGlzLnJlY3QuaGVpZ2h0KSAvIDI7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5lc3RpbWF0ZWRTaXplID0gdGhpcy5jaGlsZC5jYWxjRXN0aW1hdGVkU2l6ZSgpO1xuICAgIHRoaXMucmVjdC53aWR0aCA9IHRoaXMuZXN0aW1hdGVkU2l6ZTtcbiAgICB0aGlzLnJlY3QuaGVpZ2h0ID0gdGhpcy5lc3RpbWF0ZWRTaXplO1xuXG4gICAgcmV0dXJuIHRoaXMuZXN0aW1hdGVkU2l6ZTtcbiAgfVxufTtcblxuTE5vZGUucHJvdG90eXBlLnNjYXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByYW5kb21DZW50ZXJYO1xuICB2YXIgcmFuZG9tQ2VudGVyWTtcblxuICB2YXIgbWluWCA9IC1MYXlvdXRDb25zdGFudHMuSU5JVElBTF9XT1JMRF9CT1VOREFSWTtcbiAgdmFyIG1heFggPSBMYXlvdXRDb25zdGFudHMuSU5JVElBTF9XT1JMRF9CT1VOREFSWTtcbiAgcmFuZG9tQ2VudGVyWCA9IExheW91dENvbnN0YW50cy5XT1JMRF9DRU5URVJfWCArIFJhbmRvbVNlZWQubmV4dERvdWJsZSgpICogKG1heFggLSBtaW5YKSArIG1pblg7XG5cbiAgdmFyIG1pblkgPSAtTGF5b3V0Q29uc3RhbnRzLklOSVRJQUxfV09STERfQk9VTkRBUlk7XG4gIHZhciBtYXhZID0gTGF5b3V0Q29uc3RhbnRzLklOSVRJQUxfV09STERfQk9VTkRBUlk7XG4gIHJhbmRvbUNlbnRlclkgPSBMYXlvdXRDb25zdGFudHMuV09STERfQ0VOVEVSX1kgKyBSYW5kb21TZWVkLm5leHREb3VibGUoKSAqIChtYXhZIC0gbWluWSkgKyBtaW5ZO1xuXG4gIHRoaXMucmVjdC54ID0gcmFuZG9tQ2VudGVyWDtcbiAgdGhpcy5yZWN0LnkgPSByYW5kb21DZW50ZXJZO1xufTtcblxuTE5vZGUucHJvdG90eXBlLnVwZGF0ZUJvdW5kcyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgdGhyb3cgXCJhc3NlcnQgZmFpbGVkXCI7XG4gIH1cbiAgaWYgKHRoaXMuZ2V0Q2hpbGQoKS5nZXROb2RlcygpLmxlbmd0aCAhPSAwKSB7XG4gICAgLy8gd3JhcCB0aGUgY2hpbGRyZW4gbm9kZXMgYnkgcmUtYXJyYW5naW5nIHRoZSBib3VuZGFyaWVzXG4gICAgdmFyIGNoaWxkR3JhcGggPSB0aGlzLmdldENoaWxkKCk7XG4gICAgY2hpbGRHcmFwaC51cGRhdGVCb3VuZHModHJ1ZSk7XG5cbiAgICB0aGlzLnJlY3QueCA9IGNoaWxkR3JhcGguZ2V0TGVmdCgpO1xuICAgIHRoaXMucmVjdC55ID0gY2hpbGRHcmFwaC5nZXRUb3AoKTtcblxuICAgIHRoaXMuc2V0V2lkdGgoY2hpbGRHcmFwaC5nZXRSaWdodCgpIC0gY2hpbGRHcmFwaC5nZXRMZWZ0KCkpO1xuICAgIHRoaXMuc2V0SGVpZ2h0KGNoaWxkR3JhcGguZ2V0Qm90dG9tKCkgLSBjaGlsZEdyYXBoLmdldFRvcCgpKTtcblxuICAgIC8vIFVwZGF0ZSBjb21wb3VuZCBib3VuZHMgY29uc2lkZXJpbmcgaXRzIGxhYmVsIHByb3BlcnRpZXMgICAgXG4gICAgaWYgKExheW91dENvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMpIHtcblxuICAgICAgdmFyIHdpZHRoID0gY2hpbGRHcmFwaC5nZXRSaWdodCgpIC0gY2hpbGRHcmFwaC5nZXRMZWZ0KCk7XG4gICAgICB2YXIgaGVpZ2h0ID0gY2hpbGRHcmFwaC5nZXRCb3R0b20oKSAtIGNoaWxkR3JhcGguZ2V0VG9wKCk7XG5cbiAgICAgIGlmICh0aGlzLmxhYmVsV2lkdGgpIHtcbiAgICAgICAgaWYgKHRoaXMubGFiZWxQb3NIb3Jpem9udGFsID09IFwibGVmdFwiKSB7XG4gICAgICAgICAgdGhpcy5yZWN0LnggLT0gdGhpcy5sYWJlbFdpZHRoO1xuICAgICAgICAgIHRoaXMuc2V0V2lkdGgod2lkdGggKyB0aGlzLmxhYmVsV2lkdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGFiZWxQb3NIb3Jpem9udGFsID09IFwiY2VudGVyXCIgJiYgdGhpcy5sYWJlbFdpZHRoID4gd2lkdGgpIHtcbiAgICAgICAgICB0aGlzLnJlY3QueCAtPSAodGhpcy5sYWJlbFdpZHRoIC0gd2lkdGgpIC8gMjtcbiAgICAgICAgICB0aGlzLnNldFdpZHRoKHRoaXMubGFiZWxXaWR0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sYWJlbFBvc0hvcml6b250YWwgPT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgdGhpcy5zZXRXaWR0aCh3aWR0aCArIHRoaXMubGFiZWxXaWR0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubGFiZWxIZWlnaHQpIHtcbiAgICAgICAgaWYgKHRoaXMubGFiZWxQb3NWZXJ0aWNhbCA9PSBcInRvcFwiKSB7XG4gICAgICAgICAgdGhpcy5yZWN0LnkgLT0gdGhpcy5sYWJlbEhlaWdodDtcbiAgICAgICAgICB0aGlzLnNldEhlaWdodChoZWlnaHQgKyB0aGlzLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhYmVsUG9zVmVydGljYWwgPT0gXCJjZW50ZXJcIiAmJiB0aGlzLmxhYmVsSGVpZ2h0ID4gaGVpZ2h0KSB7XG4gICAgICAgICAgdGhpcy5yZWN0LnkgLT0gKHRoaXMubGFiZWxIZWlnaHQgLSBoZWlnaHQpIC8gMjtcbiAgICAgICAgICB0aGlzLnNldEhlaWdodCh0aGlzLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhYmVsUG9zVmVydGljYWwgPT0gXCJib3R0b21cIikge1xuICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0KGhlaWdodCArIHRoaXMubGFiZWxIZWlnaHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0SW5jbHVzaW9uVHJlZURlcHRoID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5pbmNsdXNpb25UcmVlRGVwdGggPT0gSW50ZWdlci5NQVhfVkFMVUUpIHtcbiAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgfVxuICByZXR1cm4gdGhpcy5pbmNsdXNpb25UcmVlRGVwdGg7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKHRyYW5zKSB7XG4gIHZhciBsZWZ0ID0gdGhpcy5yZWN0Lng7XG5cbiAgaWYgKGxlZnQgPiBMYXlvdXRDb25zdGFudHMuV09STERfQk9VTkRBUlkpIHtcbiAgICBsZWZ0ID0gTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZO1xuICB9IGVsc2UgaWYgKGxlZnQgPCAtTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZKSB7XG4gICAgbGVmdCA9IC1MYXlvdXRDb25zdGFudHMuV09STERfQk9VTkRBUlk7XG4gIH1cblxuICB2YXIgdG9wID0gdGhpcy5yZWN0Lnk7XG5cbiAgaWYgKHRvcCA+IExheW91dENvbnN0YW50cy5XT1JMRF9CT1VOREFSWSkge1xuICAgIHRvcCA9IExheW91dENvbnN0YW50cy5XT1JMRF9CT1VOREFSWTtcbiAgfSBlbHNlIGlmICh0b3AgPCAtTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZKSB7XG4gICAgdG9wID0gLUxheW91dENvbnN0YW50cy5XT1JMRF9CT1VOREFSWTtcbiAgfVxuXG4gIHZhciBsZWZ0VG9wID0gbmV3IFBvaW50RChsZWZ0LCB0b3ApO1xuICB2YXIgdkxlZnRUb3AgPSB0cmFucy5pbnZlcnNlVHJhbnNmb3JtUG9pbnQobGVmdFRvcCk7XG5cbiAgdGhpcy5zZXRMb2NhdGlvbih2TGVmdFRvcC54LCB2TGVmdFRvcC55KTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRMZWZ0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZWN0Lng7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0UmlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QueCArIHRoaXMucmVjdC53aWR0aDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRUb3AgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QueTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRCb3R0b20gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QueSArIHRoaXMucmVjdC5oZWlnaHQ7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0UGFyZW50ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5vd25lciA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gdGhpcy5vd25lci5nZXRQYXJlbnQoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTE5vZGU7XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgTGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuZnVuY3Rpb24gRkRMYXlvdXRDb25zdGFudHMoKSB7fVxuXG4vL0ZETGF5b3V0Q29uc3RhbnRzIGluaGVyaXRzIHN0YXRpYyBwcm9wcyBpbiBMYXlvdXRDb25zdGFudHNcbmZvciAodmFyIHByb3AgaW4gTGF5b3V0Q29uc3RhbnRzKSB7XG4gIEZETGF5b3V0Q29uc3RhbnRzW3Byb3BdID0gTGF5b3V0Q29uc3RhbnRzW3Byb3BdO1xufVxuXG5GRExheW91dENvbnN0YW50cy5NQVhfSVRFUkFUSU9OUyA9IDI1MDA7XG5cbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSA1MDtcbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfU1BSSU5HX1NUUkVOR1RIID0gMC40NTtcbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfUkVQVUxTSU9OX1NUUkVOR1RIID0gNDUwMC4wO1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1NUUkVOR1RIID0gMC40O1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1NUUkVOR1RIID0gMS4wO1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1JBTkdFX0ZBQ1RPUiA9IDMuODtcbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9SQU5HRV9GQUNUT1IgPSAxLjU7XG5GRExheW91dENvbnN0YW50cy5ERUZBVUxUX1VTRV9TTUFSVF9JREVBTF9FREdFX0xFTkdUSF9DQUxDVUxBVElPTiA9IHRydWU7XG5GRExheW91dENvbnN0YW50cy5ERUZBVUxUX1VTRV9TTUFSVF9SRVBVTFNJT05fUkFOR0VfQ0FMQ1VMQVRJT04gPSB0cnVlO1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCA9IDAuMztcbkZETGF5b3V0Q29uc3RhbnRzLkNPT0xJTkdfQURBUFRBVElPTl9GQUNUT1IgPSAwLjMzO1xuRkRMYXlvdXRDb25zdGFudHMuQURBUFRBVElPTl9MT1dFUl9OT0RFX0xJTUlUID0gMTAwMDtcbkZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fVVBQRVJfTk9ERV9MSU1JVCA9IDUwMDA7XG5GRExheW91dENvbnN0YW50cy5NQVhfTk9ERV9ESVNQTEFDRU1FTlRfSU5DUkVNRU5UQUwgPSAxMDAuMDtcbkZETGF5b3V0Q29uc3RhbnRzLk1BWF9OT0RFX0RJU1BMQUNFTUVOVCA9IEZETGF5b3V0Q29uc3RhbnRzLk1BWF9OT0RFX0RJU1BMQUNFTUVOVF9JTkNSRU1FTlRBTCAqIDM7XG5GRExheW91dENvbnN0YW50cy5NSU5fUkVQVUxTSU9OX0RJU1QgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIC8gMTAuMDtcbkZETGF5b3V0Q29uc3RhbnRzLkNPTlZFUkdFTkNFX0NIRUNLX1BFUklPRCA9IDEwMDtcbkZETGF5b3V0Q29uc3RhbnRzLlBFUl9MRVZFTF9JREVBTF9FREdFX0xFTkdUSF9GQUNUT1IgPSAwLjE7XG5GRExheW91dENvbnN0YW50cy5NSU5fRURHRV9MRU5HVEggPSAxO1xuRkRMYXlvdXRDb25zdGFudHMuR1JJRF9DQUxDVUxBVElPTl9DSEVDS19QRVJJT0QgPSAxMDtcblxubW9kdWxlLmV4cG9ydHMgPSBGRExheW91dENvbnN0YW50cztcblxuLyoqKi8gfSksXG4vKiA1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIFBvaW50RCh4LCB5KSB7XG4gIGlmICh4ID09IG51bGwgJiYgeSA9PSBudWxsKSB7XG4gICAgdGhpcy54ID0gMDtcbiAgICB0aGlzLnkgPSAwO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgfVxufVxuXG5Qb2ludEQucHJvdG90eXBlLmdldFggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLng7XG59O1xuXG5Qb2ludEQucHJvdG90eXBlLmdldFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnk7XG59O1xuXG5Qb2ludEQucHJvdG90eXBlLnNldFggPSBmdW5jdGlvbiAoeCkge1xuICB0aGlzLnggPSB4O1xufTtcblxuUG9pbnRELnByb3RvdHlwZS5zZXRZID0gZnVuY3Rpb24gKHkpIHtcbiAgdGhpcy55ID0geTtcbn07XG5cblBvaW50RC5wcm90b3R5cGUuZ2V0RGlmZmVyZW5jZSA9IGZ1bmN0aW9uIChwdCkge1xuICByZXR1cm4gbmV3IERpbWVuc2lvbkQodGhpcy54IC0gcHQueCwgdGhpcy55IC0gcHQueSk7XG59O1xuXG5Qb2ludEQucHJvdG90eXBlLmdldENvcHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgUG9pbnREKHRoaXMueCwgdGhpcy55KTtcbn07XG5cblBvaW50RC5wcm90b3R5cGUudHJhbnNsYXRlID0gZnVuY3Rpb24gKGRpbSkge1xuICB0aGlzLnggKz0gZGltLndpZHRoO1xuICB0aGlzLnkgKz0gZGltLmhlaWdodDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvaW50RDtcblxuLyoqKi8gfSksXG4vKiA2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBMR3JhcGhPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xudmFyIEludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIExHcmFwaE1hbmFnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xudmFyIExOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcbnZhciBMRWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG52YXIgUmVjdGFuZ2xlRCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xudmFyIFBvaW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG52YXIgTGlua2VkTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXG5mdW5jdGlvbiBMR3JhcGgocGFyZW50LCBvYmoyLCB2R3JhcGgpIHtcbiAgTEdyYXBoT2JqZWN0LmNhbGwodGhpcywgdkdyYXBoKTtcbiAgdGhpcy5lc3RpbWF0ZWRTaXplID0gSW50ZWdlci5NSU5fVkFMVUU7XG4gIHRoaXMubWFyZ2luID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBUEhfTUFSR0lOO1xuICB0aGlzLmVkZ2VzID0gW107XG4gIHRoaXMubm9kZXMgPSBbXTtcbiAgdGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICB0aGlzLnBhcmVudCA9IHBhcmVudDtcblxuICBpZiAob2JqMiAhPSBudWxsICYmIG9iajIgaW5zdGFuY2VvZiBMR3JhcGhNYW5hZ2VyKSB7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIgPSBvYmoyO1xuICB9IGVsc2UgaWYgKG9iajIgIT0gbnVsbCAmJiBvYmoyIGluc3RhbmNlb2YgTGF5b3V0KSB7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIgPSBvYmoyLmdyYXBoTWFuYWdlcjtcbiAgfVxufVxuXG5MR3JhcGgucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMR3JhcGhPYmplY3QucHJvdG90eXBlKTtcbmZvciAodmFyIHByb3AgaW4gTEdyYXBoT2JqZWN0KSB7XG4gIExHcmFwaFtwcm9wXSA9IExHcmFwaE9iamVjdFtwcm9wXTtcbn1cblxuTEdyYXBoLnByb3RvdHlwZS5nZXROb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZXM7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmdldEVkZ2VzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5lZGdlcztcbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuZ2V0R3JhcGhNYW5hZ2VyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ncmFwaE1hbmFnZXI7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmdldFBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucGFyZW50O1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5nZXRMZWZ0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5sZWZ0O1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5nZXRSaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucmlnaHQ7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmdldFRvcCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMudG9wO1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5nZXRCb3R0b20gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmJvdHRvbTtcbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuaXNDb25uZWN0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkO1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAob2JqMSwgc291cmNlTm9kZSwgdGFyZ2V0Tm9kZSkge1xuICBpZiAoc291cmNlTm9kZSA9PSBudWxsICYmIHRhcmdldE5vZGUgPT0gbnVsbCkge1xuICAgIHZhciBuZXdOb2RlID0gb2JqMTtcbiAgICBpZiAodGhpcy5ncmFwaE1hbmFnZXIgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJHcmFwaCBoYXMgbm8gZ3JhcGggbWdyIVwiO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZXROb2RlcygpLmluZGV4T2YobmV3Tm9kZSkgPiAtMSkge1xuICAgICAgdGhyb3cgXCJOb2RlIGFscmVhZHkgaW4gZ3JhcGghXCI7XG4gICAgfVxuICAgIG5ld05vZGUub3duZXIgPSB0aGlzO1xuICAgIHRoaXMuZ2V0Tm9kZXMoKS5wdXNoKG5ld05vZGUpO1xuXG4gICAgcmV0dXJuIG5ld05vZGU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5ld0VkZ2UgPSBvYmoxO1xuICAgIGlmICghKHRoaXMuZ2V0Tm9kZXMoKS5pbmRleE9mKHNvdXJjZU5vZGUpID4gLTEgJiYgdGhpcy5nZXROb2RlcygpLmluZGV4T2YodGFyZ2V0Tm9kZSkgPiAtMSkpIHtcbiAgICAgIHRocm93IFwiU291cmNlIG9yIHRhcmdldCBub3QgaW4gZ3JhcGghXCI7XG4gICAgfVxuXG4gICAgaWYgKCEoc291cmNlTm9kZS5vd25lciA9PSB0YXJnZXROb2RlLm93bmVyICYmIHNvdXJjZU5vZGUub3duZXIgPT0gdGhpcykpIHtcbiAgICAgIHRocm93IFwiQm90aCBvd25lcnMgbXVzdCBiZSB0aGlzIGdyYXBoIVwiO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2VOb2RlLm93bmVyICE9IHRhcmdldE5vZGUub3duZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIHNldCBzb3VyY2UgYW5kIHRhcmdldFxuICAgIG5ld0VkZ2Uuc291cmNlID0gc291cmNlTm9kZTtcbiAgICBuZXdFZGdlLnRhcmdldCA9IHRhcmdldE5vZGU7XG5cbiAgICAvLyBzZXQgYXMgaW50cmEtZ3JhcGggZWRnZVxuICAgIG5ld0VkZ2UuaXNJbnRlckdyYXBoID0gZmFsc2U7XG5cbiAgICAvLyBhZGQgdG8gZ3JhcGggZWRnZSBsaXN0XG4gICAgdGhpcy5nZXRFZGdlcygpLnB1c2gobmV3RWRnZSk7XG5cbiAgICAvLyBhZGQgdG8gaW5jaWRlbmN5IGxpc3RzXG4gICAgc291cmNlTm9kZS5lZGdlcy5wdXNoKG5ld0VkZ2UpO1xuXG4gICAgaWYgKHRhcmdldE5vZGUgIT0gc291cmNlTm9kZSkge1xuICAgICAgdGFyZ2V0Tm9kZS5lZGdlcy5wdXNoKG5ld0VkZ2UpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdFZGdlO1xuICB9XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIG5vZGUgPSBvYmo7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBMTm9kZSkge1xuICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgIHRocm93IFwiTm9kZSBpcyBudWxsIVwiO1xuICAgIH1cbiAgICBpZiAoIShub2RlLm93bmVyICE9IG51bGwgJiYgbm9kZS5vd25lciA9PSB0aGlzKSkge1xuICAgICAgdGhyb3cgXCJPd25lciBncmFwaCBpcyBpbnZhbGlkIVwiO1xuICAgIH1cbiAgICBpZiAodGhpcy5ncmFwaE1hbmFnZXIgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJPd25lciBncmFwaCBtYW5hZ2VyIGlzIGludmFsaWQhXCI7XG4gICAgfVxuICAgIC8vIHJlbW92ZSBpbmNpZGVudCBlZGdlcyBmaXJzdCAobWFrZSBhIGNvcHkgdG8gZG8gaXQgc2FmZWx5KVxuICAgIHZhciBlZGdlc1RvQmVSZW1vdmVkID0gbm9kZS5lZGdlcy5zbGljZSgpO1xuICAgIHZhciBlZGdlO1xuICAgIHZhciBzID0gZWRnZXNUb0JlUmVtb3ZlZC5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgIGVkZ2UgPSBlZGdlc1RvQmVSZW1vdmVkW2ldO1xuXG4gICAgICBpZiAoZWRnZS5pc0ludGVyR3JhcGgpIHtcbiAgICAgICAgdGhpcy5ncmFwaE1hbmFnZXIucmVtb3ZlKGVkZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWRnZS5zb3VyY2Uub3duZXIucmVtb3ZlKGVkZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG5vdyB0aGUgbm9kZSBpdHNlbGZcbiAgICB2YXIgaW5kZXggPSB0aGlzLm5vZGVzLmluZGV4T2Yobm9kZSk7XG4gICAgaWYgKGluZGV4ID09IC0xKSB7XG4gICAgICB0aHJvdyBcIk5vZGUgbm90IGluIG93bmVyIG5vZGUgbGlzdCFcIjtcbiAgICB9XG5cbiAgICB0aGlzLm5vZGVzLnNwbGljZShpbmRleCwgMSk7XG4gIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTEVkZ2UpIHtcbiAgICB2YXIgZWRnZSA9IG9iajtcbiAgICBpZiAoZWRnZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcIkVkZ2UgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKCEoZWRnZS5zb3VyY2UgIT0gbnVsbCAmJiBlZGdlLnRhcmdldCAhPSBudWxsKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2UgYW5kL29yIHRhcmdldCBpcyBudWxsIVwiO1xuICAgIH1cbiAgICBpZiAoIShlZGdlLnNvdXJjZS5vd25lciAhPSBudWxsICYmIGVkZ2UudGFyZ2V0Lm93bmVyICE9IG51bGwgJiYgZWRnZS5zb3VyY2Uub3duZXIgPT0gdGhpcyAmJiBlZGdlLnRhcmdldC5vd25lciA9PSB0aGlzKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2UgYW5kL29yIHRhcmdldCBvd25lciBpcyBpbnZhbGlkIVwiO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VJbmRleCA9IGVkZ2Uuc291cmNlLmVkZ2VzLmluZGV4T2YoZWRnZSk7XG4gICAgdmFyIHRhcmdldEluZGV4ID0gZWRnZS50YXJnZXQuZWRnZXMuaW5kZXhPZihlZGdlKTtcbiAgICBpZiAoIShzb3VyY2VJbmRleCA+IC0xICYmIHRhcmdldEluZGV4ID4gLTEpKSB7XG4gICAgICB0aHJvdyBcIlNvdXJjZSBhbmQvb3IgdGFyZ2V0IGRvZXNuJ3Qga25vdyB0aGlzIGVkZ2UhXCI7XG4gICAgfVxuXG4gICAgZWRnZS5zb3VyY2UuZWRnZXMuc3BsaWNlKHNvdXJjZUluZGV4LCAxKTtcblxuICAgIGlmIChlZGdlLnRhcmdldCAhPSBlZGdlLnNvdXJjZSkge1xuICAgICAgZWRnZS50YXJnZXQuZWRnZXMuc3BsaWNlKHRhcmdldEluZGV4LCAxKTtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXggPSBlZGdlLnNvdXJjZS5vd25lci5nZXRFZGdlcygpLmluZGV4T2YoZWRnZSk7XG4gICAgaWYgKGluZGV4ID09IC0xKSB7XG4gICAgICB0aHJvdyBcIk5vdCBpbiBvd25lcidzIGVkZ2UgbGlzdCFcIjtcbiAgICB9XG5cbiAgICBlZGdlLnNvdXJjZS5vd25lci5nZXRFZGdlcygpLnNwbGljZShpbmRleCwgMSk7XG4gIH1cbn07XG5cbkxHcmFwaC5wcm90b3R5cGUudXBkYXRlTGVmdFRvcCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRvcCA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgbGVmdCA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgbm9kZVRvcDtcbiAgdmFyIG5vZGVMZWZ0O1xuICB2YXIgbWFyZ2luO1xuXG4gIHZhciBub2RlcyA9IHRoaXMuZ2V0Tm9kZXMoKTtcbiAgdmFyIHMgPSBub2Rlcy5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICB2YXIgbE5vZGUgPSBub2Rlc1tpXTtcbiAgICBub2RlVG9wID0gbE5vZGUuZ2V0VG9wKCk7XG4gICAgbm9kZUxlZnQgPSBsTm9kZS5nZXRMZWZ0KCk7XG5cbiAgICBpZiAodG9wID4gbm9kZVRvcCkge1xuICAgICAgdG9wID0gbm9kZVRvcDtcbiAgICB9XG5cbiAgICBpZiAobGVmdCA+IG5vZGVMZWZ0KSB7XG4gICAgICBsZWZ0ID0gbm9kZUxlZnQ7XG4gICAgfVxuICB9XG5cbiAgLy8gRG8gd2UgaGF2ZSBhbnkgbm9kZXMgaW4gdGhpcyBncmFwaD9cbiAgaWYgKHRvcCA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKG5vZGVzWzBdLmdldFBhcmVudCgpLnBhZGRpbmdMZWZ0ICE9IHVuZGVmaW5lZCkge1xuICAgIG1hcmdpbiA9IG5vZGVzWzBdLmdldFBhcmVudCgpLnBhZGRpbmdMZWZ0O1xuICB9IGVsc2Uge1xuICAgIG1hcmdpbiA9IHRoaXMubWFyZ2luO1xuICB9XG5cbiAgdGhpcy5sZWZ0ID0gbGVmdCAtIG1hcmdpbjtcbiAgdGhpcy50b3AgPSB0b3AgLSBtYXJnaW47XG5cbiAgLy8gQXBwbHkgdGhlIG1hcmdpbnMgYW5kIHJldHVybiB0aGUgcmVzdWx0XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcy5sZWZ0LCB0aGlzLnRvcCk7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLnVwZGF0ZUJvdW5kcyA9IGZ1bmN0aW9uIChyZWN1cnNpdmUpIHtcbiAgLy8gY2FsY3VsYXRlIGJvdW5kc1xuICB2YXIgbGVmdCA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgcmlnaHQgPSAtSW50ZWdlci5NQVhfVkFMVUU7XG4gIHZhciB0b3AgPSBJbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIGJvdHRvbSA9IC1JbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIG5vZGVMZWZ0O1xuICB2YXIgbm9kZVJpZ2h0O1xuICB2YXIgbm9kZVRvcDtcbiAgdmFyIG5vZGVCb3R0b207XG4gIHZhciBtYXJnaW47XG5cbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcztcbiAgdmFyIHMgPSBub2Rlcy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIGxOb2RlID0gbm9kZXNbaV07XG5cbiAgICBpZiAocmVjdXJzaXZlICYmIGxOb2RlLmNoaWxkICE9IG51bGwpIHtcbiAgICAgIGxOb2RlLnVwZGF0ZUJvdW5kcygpO1xuICAgIH1cbiAgICBub2RlTGVmdCA9IGxOb2RlLmdldExlZnQoKTtcbiAgICBub2RlUmlnaHQgPSBsTm9kZS5nZXRSaWdodCgpO1xuICAgIG5vZGVUb3AgPSBsTm9kZS5nZXRUb3AoKTtcbiAgICBub2RlQm90dG9tID0gbE5vZGUuZ2V0Qm90dG9tKCk7XG5cbiAgICBpZiAobGVmdCA+IG5vZGVMZWZ0KSB7XG4gICAgICBsZWZ0ID0gbm9kZUxlZnQ7XG4gICAgfVxuXG4gICAgaWYgKHJpZ2h0IDwgbm9kZVJpZ2h0KSB7XG4gICAgICByaWdodCA9IG5vZGVSaWdodDtcbiAgICB9XG5cbiAgICBpZiAodG9wID4gbm9kZVRvcCkge1xuICAgICAgdG9wID0gbm9kZVRvcDtcbiAgICB9XG5cbiAgICBpZiAoYm90dG9tIDwgbm9kZUJvdHRvbSkge1xuICAgICAgYm90dG9tID0gbm9kZUJvdHRvbTtcbiAgICB9XG4gIH1cblxuICB2YXIgYm91bmRpbmdSZWN0ID0gbmV3IFJlY3RhbmdsZUQobGVmdCwgdG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7XG4gIGlmIChsZWZ0ID09IEludGVnZXIuTUFYX1ZBTFVFKSB7XG4gICAgdGhpcy5sZWZ0ID0gdGhpcy5wYXJlbnQuZ2V0TGVmdCgpO1xuICAgIHRoaXMucmlnaHQgPSB0aGlzLnBhcmVudC5nZXRSaWdodCgpO1xuICAgIHRoaXMudG9wID0gdGhpcy5wYXJlbnQuZ2V0VG9wKCk7XG4gICAgdGhpcy5ib3R0b20gPSB0aGlzLnBhcmVudC5nZXRCb3R0b20oKTtcbiAgfVxuXG4gIGlmIChub2Rlc1swXS5nZXRQYXJlbnQoKS5wYWRkaW5nTGVmdCAhPSB1bmRlZmluZWQpIHtcbiAgICBtYXJnaW4gPSBub2Rlc1swXS5nZXRQYXJlbnQoKS5wYWRkaW5nTGVmdDtcbiAgfSBlbHNlIHtcbiAgICBtYXJnaW4gPSB0aGlzLm1hcmdpbjtcbiAgfVxuXG4gIHRoaXMubGVmdCA9IGJvdW5kaW5nUmVjdC54IC0gbWFyZ2luO1xuICB0aGlzLnJpZ2h0ID0gYm91bmRpbmdSZWN0LnggKyBib3VuZGluZ1JlY3Qud2lkdGggKyBtYXJnaW47XG4gIHRoaXMudG9wID0gYm91bmRpbmdSZWN0LnkgLSBtYXJnaW47XG4gIHRoaXMuYm90dG9tID0gYm91bmRpbmdSZWN0LnkgKyBib3VuZGluZ1JlY3QuaGVpZ2h0ICsgbWFyZ2luO1xufTtcblxuTEdyYXBoLmNhbGN1bGF0ZUJvdW5kcyA9IGZ1bmN0aW9uIChub2Rlcykge1xuICB2YXIgbGVmdCA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgcmlnaHQgPSAtSW50ZWdlci5NQVhfVkFMVUU7XG4gIHZhciB0b3AgPSBJbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIGJvdHRvbSA9IC1JbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIG5vZGVMZWZ0O1xuICB2YXIgbm9kZVJpZ2h0O1xuICB2YXIgbm9kZVRvcDtcbiAgdmFyIG5vZGVCb3R0b207XG5cbiAgdmFyIHMgPSBub2Rlcy5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICB2YXIgbE5vZGUgPSBub2Rlc1tpXTtcbiAgICBub2RlTGVmdCA9IGxOb2RlLmdldExlZnQoKTtcbiAgICBub2RlUmlnaHQgPSBsTm9kZS5nZXRSaWdodCgpO1xuICAgIG5vZGVUb3AgPSBsTm9kZS5nZXRUb3AoKTtcbiAgICBub2RlQm90dG9tID0gbE5vZGUuZ2V0Qm90dG9tKCk7XG5cbiAgICBpZiAobGVmdCA+IG5vZGVMZWZ0KSB7XG4gICAgICBsZWZ0ID0gbm9kZUxlZnQ7XG4gICAgfVxuXG4gICAgaWYgKHJpZ2h0IDwgbm9kZVJpZ2h0KSB7XG4gICAgICByaWdodCA9IG5vZGVSaWdodDtcbiAgICB9XG5cbiAgICBpZiAodG9wID4gbm9kZVRvcCkge1xuICAgICAgdG9wID0gbm9kZVRvcDtcbiAgICB9XG5cbiAgICBpZiAoYm90dG9tIDwgbm9kZUJvdHRvbSkge1xuICAgICAgYm90dG9tID0gbm9kZUJvdHRvbTtcbiAgICB9XG4gIH1cblxuICB2YXIgYm91bmRpbmdSZWN0ID0gbmV3IFJlY3RhbmdsZUQobGVmdCwgdG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7XG5cbiAgcmV0dXJuIGJvdW5kaW5nUmVjdDtcbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuZ2V0SW5jbHVzaW9uVHJlZURlcHRoID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcyA9PSB0aGlzLmdyYXBoTWFuYWdlci5nZXRSb290KCkpIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0SW5jbHVzaW9uVHJlZURlcHRoKCk7XG4gIH1cbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuZ2V0RXN0aW1hdGVkU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuZXN0aW1hdGVkU2l6ZSA9PSBJbnRlZ2VyLk1JTl9WQUxVRSkge1xuICAgIHRocm93IFwiYXNzZXJ0IGZhaWxlZFwiO1xuICB9XG4gIHJldHVybiB0aGlzLmVzdGltYXRlZFNpemU7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmNhbGNFc3RpbWF0ZWRTaXplID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2l6ZSA9IDA7XG4gIHZhciBub2RlcyA9IHRoaXMubm9kZXM7XG4gIHZhciBzID0gbm9kZXMubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIGxOb2RlID0gbm9kZXNbaV07XG4gICAgc2l6ZSArPSBsTm9kZS5jYWxjRXN0aW1hdGVkU2l6ZSgpO1xuICB9XG5cbiAgaWYgKHNpemUgPT0gMCkge1xuICAgIHRoaXMuZXN0aW1hdGVkU2l6ZSA9IExheW91dENvbnN0YW50cy5FTVBUWV9DT01QT1VORF9OT0RFX1NJWkU7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5lc3RpbWF0ZWRTaXplID0gc2l6ZSAvIE1hdGguc3FydCh0aGlzLm5vZGVzLmxlbmd0aCk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lc3RpbWF0ZWRTaXplO1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS51cGRhdGVDb25uZWN0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKHRoaXMubm9kZXMubGVuZ3RoID09IDApIHtcbiAgICB0aGlzLmlzQ29ubmVjdGVkID0gdHJ1ZTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcXVldWUgPSBuZXcgTGlua2VkTGlzdCgpO1xuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIGN1cnJlbnROb2RlID0gdGhpcy5ub2Rlc1swXTtcbiAgdmFyIG5laWdoYm9yRWRnZXM7XG4gIHZhciBjdXJyZW50TmVpZ2hib3I7XG4gIHZhciBjaGlsZHJlbk9mTm9kZSA9IGN1cnJlbnROb2RlLndpdGhDaGlsZHJlbigpO1xuICBjaGlsZHJlbk9mTm9kZS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcXVldWUucHVzaChub2RlKTtcbiAgICB2aXNpdGVkLmFkZChub2RlKTtcbiAgfSk7XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPT0gMCkge1xuICAgIGN1cnJlbnROb2RlID0gcXVldWUuc2hpZnQoKTtcblxuICAgIC8vIFRyYXZlcnNlIGFsbCBuZWlnaGJvcnMgb2YgdGhpcyBub2RlXG4gICAgbmVpZ2hib3JFZGdlcyA9IGN1cnJlbnROb2RlLmdldEVkZ2VzKCk7XG4gICAgdmFyIHNpemUgPSBuZWlnaGJvckVkZ2VzLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgdmFyIG5laWdoYm9yRWRnZSA9IG5laWdoYm9yRWRnZXNbaV07XG4gICAgICBjdXJyZW50TmVpZ2hib3IgPSBuZWlnaGJvckVkZ2UuZ2V0T3RoZXJFbmRJbkdyYXBoKGN1cnJlbnROb2RlLCB0aGlzKTtcblxuICAgICAgLy8gQWRkIHVudmlzaXRlZCBuZWlnaGJvcnMgdG8gdGhlIGxpc3QgdG8gdmlzaXRcbiAgICAgIGlmIChjdXJyZW50TmVpZ2hib3IgIT0gbnVsbCAmJiAhdmlzaXRlZC5oYXMoY3VycmVudE5laWdoYm9yKSkge1xuICAgICAgICB2YXIgY2hpbGRyZW5PZk5laWdoYm9yID0gY3VycmVudE5laWdoYm9yLndpdGhDaGlsZHJlbigpO1xuXG4gICAgICAgIGNoaWxkcmVuT2ZOZWlnaGJvci5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgcXVldWUucHVzaChub2RlKTtcbiAgICAgICAgICB2aXNpdGVkLmFkZChub2RlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuXG4gIGlmICh2aXNpdGVkLnNpemUgPj0gdGhpcy5ub2Rlcy5sZW5ndGgpIHtcbiAgICB2YXIgbm9PZlZpc2l0ZWRJblRoaXNHcmFwaCA9IDA7XG5cbiAgICB2aXNpdGVkLmZvckVhY2goZnVuY3Rpb24gKHZpc2l0ZWROb2RlKSB7XG4gICAgICBpZiAodmlzaXRlZE5vZGUub3duZXIgPT0gc2VsZikge1xuICAgICAgICBub09mVmlzaXRlZEluVGhpc0dyYXBoKys7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAobm9PZlZpc2l0ZWRJblRoaXNHcmFwaCA9PSB0aGlzLm5vZGVzLmxlbmd0aCkge1xuICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IExHcmFwaDtcblxuLyoqKi8gfSksXG4vKiA3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBMR3JhcGg7XG52YXIgTEVkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXG5mdW5jdGlvbiBMR3JhcGhNYW5hZ2VyKGxheW91dCkge1xuICBMR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOyAvLyBJdCBtYXkgYmUgYmV0dGVyIHRvIGluaXRpbGl6ZSB0aGlzIG91dCBvZiB0aGlzIGZ1bmN0aW9uIGJ1dCBpdCBnaXZlcyBhbiBlcnJvciAoUmlnaHQtaGFuZCBzaWRlIG9mICdpbnN0YW5jZW9mJyBpcyBub3QgY2FsbGFibGUpIG5vdy5cbiAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG5cbiAgdGhpcy5ncmFwaHMgPSBbXTtcbiAgdGhpcy5lZGdlcyA9IFtdO1xufVxuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5hZGRSb290ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbmdyYXBoID0gdGhpcy5sYXlvdXQubmV3R3JhcGgoKTtcbiAgdmFyIG5ub2RlID0gdGhpcy5sYXlvdXQubmV3Tm9kZShudWxsKTtcbiAgdmFyIHJvb3QgPSB0aGlzLmFkZChuZ3JhcGgsIG5ub2RlKTtcbiAgdGhpcy5zZXRSb290R3JhcGgocm9vdCk7XG4gIHJldHVybiB0aGlzLnJvb3RHcmFwaDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChuZXdHcmFwaCwgcGFyZW50Tm9kZSwgbmV3RWRnZSwgc291cmNlTm9kZSwgdGFyZ2V0Tm9kZSkge1xuICAvL3RoZXJlIGFyZSBqdXN0IDIgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRoZW4gaXQgYWRkcyBhbiBMR3JhcGggZWxzZSBpdCBhZGRzIGFuIExFZGdlXG4gIGlmIChuZXdFZGdlID09IG51bGwgJiYgc291cmNlTm9kZSA9PSBudWxsICYmIHRhcmdldE5vZGUgPT0gbnVsbCkge1xuICAgIGlmIChuZXdHcmFwaCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcIkdyYXBoIGlzIG51bGwhXCI7XG4gICAgfVxuICAgIGlmIChwYXJlbnROb2RlID09IG51bGwpIHtcbiAgICAgIHRocm93IFwiUGFyZW50IG5vZGUgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JhcGhzLmluZGV4T2YobmV3R3JhcGgpID4gLTEpIHtcbiAgICAgIHRocm93IFwiR3JhcGggYWxyZWFkeSBpbiB0aGlzIGdyYXBoIG1nciFcIjtcbiAgICB9XG5cbiAgICB0aGlzLmdyYXBocy5wdXNoKG5ld0dyYXBoKTtcblxuICAgIGlmIChuZXdHcmFwaC5wYXJlbnQgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJBbHJlYWR5IGhhcyBhIHBhcmVudCFcIjtcbiAgICB9XG4gICAgaWYgKHBhcmVudE5vZGUuY2hpbGQgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJBbHJlYWR5IGhhcyBhIGNoaWxkIVwiO1xuICAgIH1cblxuICAgIG5ld0dyYXBoLnBhcmVudCA9IHBhcmVudE5vZGU7XG4gICAgcGFyZW50Tm9kZS5jaGlsZCA9IG5ld0dyYXBoO1xuXG4gICAgcmV0dXJuIG5ld0dyYXBoO1xuICB9IGVsc2Uge1xuICAgIC8vY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgcGFyYW1ldGVyc1xuICAgIHRhcmdldE5vZGUgPSBuZXdFZGdlO1xuICAgIHNvdXJjZU5vZGUgPSBwYXJlbnROb2RlO1xuICAgIG5ld0VkZ2UgPSBuZXdHcmFwaDtcbiAgICB2YXIgc291cmNlR3JhcGggPSBzb3VyY2VOb2RlLmdldE93bmVyKCk7XG4gICAgdmFyIHRhcmdldEdyYXBoID0gdGFyZ2V0Tm9kZS5nZXRPd25lcigpO1xuXG4gICAgaWYgKCEoc291cmNlR3JhcGggIT0gbnVsbCAmJiBzb3VyY2VHcmFwaC5nZXRHcmFwaE1hbmFnZXIoKSA9PSB0aGlzKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2Ugbm90IGluIHRoaXMgZ3JhcGggbWdyIVwiO1xuICAgIH1cbiAgICBpZiAoISh0YXJnZXRHcmFwaCAhPSBudWxsICYmIHRhcmdldEdyYXBoLmdldEdyYXBoTWFuYWdlcigpID09IHRoaXMpKSB7XG4gICAgICB0aHJvdyBcIlRhcmdldCBub3QgaW4gdGhpcyBncmFwaCBtZ3IhXCI7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZUdyYXBoID09IHRhcmdldEdyYXBoKSB7XG4gICAgICBuZXdFZGdlLmlzSW50ZXJHcmFwaCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHNvdXJjZUdyYXBoLmFkZChuZXdFZGdlLCBzb3VyY2VOb2RlLCB0YXJnZXROb2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RWRnZS5pc0ludGVyR3JhcGggPSB0cnVlO1xuXG4gICAgICAvLyBzZXQgc291cmNlIGFuZCB0YXJnZXRcbiAgICAgIG5ld0VkZ2Uuc291cmNlID0gc291cmNlTm9kZTtcbiAgICAgIG5ld0VkZ2UudGFyZ2V0ID0gdGFyZ2V0Tm9kZTtcblxuICAgICAgLy8gYWRkIGVkZ2UgdG8gaW50ZXItZ3JhcGggZWRnZSBsaXN0XG4gICAgICBpZiAodGhpcy5lZGdlcy5pbmRleE9mKG5ld0VkZ2UpID4gLTEpIHtcbiAgICAgICAgdGhyb3cgXCJFZGdlIGFscmVhZHkgaW4gaW50ZXItZ3JhcGggZWRnZSBsaXN0IVwiO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVkZ2VzLnB1c2gobmV3RWRnZSk7XG5cbiAgICAgIC8vIGFkZCBlZGdlIHRvIHNvdXJjZSBhbmQgdGFyZ2V0IGluY2lkZW5jeSBsaXN0c1xuICAgICAgaWYgKCEobmV3RWRnZS5zb3VyY2UgIT0gbnVsbCAmJiBuZXdFZGdlLnRhcmdldCAhPSBudWxsKSkge1xuICAgICAgICB0aHJvdyBcIkVkZ2Ugc291cmNlIGFuZC9vciB0YXJnZXQgaXMgbnVsbCFcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKCEobmV3RWRnZS5zb3VyY2UuZWRnZXMuaW5kZXhPZihuZXdFZGdlKSA9PSAtMSAmJiBuZXdFZGdlLnRhcmdldC5lZGdlcy5pbmRleE9mKG5ld0VkZ2UpID09IC0xKSkge1xuICAgICAgICB0aHJvdyBcIkVkZ2UgYWxyZWFkeSBpbiBzb3VyY2UgYW5kL29yIHRhcmdldCBpbmNpZGVuY3kgbGlzdCFcIjtcbiAgICAgIH1cblxuICAgICAgbmV3RWRnZS5zb3VyY2UuZWRnZXMucHVzaChuZXdFZGdlKTtcbiAgICAgIG5ld0VkZ2UudGFyZ2V0LmVkZ2VzLnB1c2gobmV3RWRnZSk7XG5cbiAgICAgIHJldHVybiBuZXdFZGdlO1xuICAgIH1cbiAgfVxufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGxPYmopIHtcbiAgaWYgKGxPYmogaW5zdGFuY2VvZiBMR3JhcGgpIHtcbiAgICB2YXIgZ3JhcGggPSBsT2JqO1xuICAgIGlmIChncmFwaC5nZXRHcmFwaE1hbmFnZXIoKSAhPSB0aGlzKSB7XG4gICAgICB0aHJvdyBcIkdyYXBoIG5vdCBpbiB0aGlzIGdyYXBoIG1nclwiO1xuICAgIH1cbiAgICBpZiAoIShncmFwaCA9PSB0aGlzLnJvb3RHcmFwaCB8fCBncmFwaC5wYXJlbnQgIT0gbnVsbCAmJiBncmFwaC5wYXJlbnQuZ3JhcGhNYW5hZ2VyID09IHRoaXMpKSB7XG4gICAgICB0aHJvdyBcIkludmFsaWQgcGFyZW50IG5vZGUhXCI7XG4gICAgfVxuXG4gICAgLy8gZmlyc3QgdGhlIGVkZ2VzIChtYWtlIGEgY29weSB0byBkbyBpdCBzYWZlbHkpXG4gICAgdmFyIGVkZ2VzVG9CZVJlbW92ZWQgPSBbXTtcblxuICAgIGVkZ2VzVG9CZVJlbW92ZWQgPSBlZGdlc1RvQmVSZW1vdmVkLmNvbmNhdChncmFwaC5nZXRFZGdlcygpKTtcblxuICAgIHZhciBlZGdlO1xuICAgIHZhciBzID0gZWRnZXNUb0JlUmVtb3ZlZC5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgIGVkZ2UgPSBlZGdlc1RvQmVSZW1vdmVkW2ldO1xuICAgICAgZ3JhcGgucmVtb3ZlKGVkZ2UpO1xuICAgIH1cblxuICAgIC8vIHRoZW4gdGhlIG5vZGVzIChtYWtlIGEgY29weSB0byBkbyBpdCBzYWZlbHkpXG4gICAgdmFyIG5vZGVzVG9CZVJlbW92ZWQgPSBbXTtcblxuICAgIG5vZGVzVG9CZVJlbW92ZWQgPSBub2Rlc1RvQmVSZW1vdmVkLmNvbmNhdChncmFwaC5nZXROb2RlcygpKTtcblxuICAgIHZhciBub2RlO1xuICAgIHMgPSBub2Rlc1RvQmVSZW1vdmVkLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHM7IGkrKykge1xuICAgICAgbm9kZSA9IG5vZGVzVG9CZVJlbW92ZWRbaV07XG4gICAgICBncmFwaC5yZW1vdmUobm9kZSk7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgZ3JhcGggaXMgdGhlIHJvb3RcbiAgICBpZiAoZ3JhcGggPT0gdGhpcy5yb290R3JhcGgpIHtcbiAgICAgIHRoaXMuc2V0Um9vdEdyYXBoKG51bGwpO1xuICAgIH1cblxuICAgIC8vIG5vdyByZW1vdmUgdGhlIGdyYXBoIGl0c2VsZlxuICAgIHZhciBpbmRleCA9IHRoaXMuZ3JhcGhzLmluZGV4T2YoZ3JhcGgpO1xuICAgIHRoaXMuZ3JhcGhzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBhbHNvIHJlc2V0IHRoZSBwYXJlbnQgb2YgdGhlIGdyYXBoXG4gICAgZ3JhcGgucGFyZW50ID0gbnVsbDtcbiAgfSBlbHNlIGlmIChsT2JqIGluc3RhbmNlb2YgTEVkZ2UpIHtcbiAgICBlZGdlID0gbE9iajtcbiAgICBpZiAoZWRnZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcIkVkZ2UgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKCFlZGdlLmlzSW50ZXJHcmFwaCkge1xuICAgICAgdGhyb3cgXCJOb3QgYW4gaW50ZXItZ3JhcGggZWRnZSFcIjtcbiAgICB9XG4gICAgaWYgKCEoZWRnZS5zb3VyY2UgIT0gbnVsbCAmJiBlZGdlLnRhcmdldCAhPSBudWxsKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2UgYW5kL29yIHRhcmdldCBpcyBudWxsIVwiO1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSBlZGdlIGZyb20gc291cmNlIGFuZCB0YXJnZXQgbm9kZXMnIGluY2lkZW5jeSBsaXN0c1xuXG4gICAgaWYgKCEoZWRnZS5zb3VyY2UuZWRnZXMuaW5kZXhPZihlZGdlKSAhPSAtMSAmJiBlZGdlLnRhcmdldC5lZGdlcy5pbmRleE9mKGVkZ2UpICE9IC0xKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2UgYW5kL29yIHRhcmdldCBkb2Vzbid0IGtub3cgdGhpcyBlZGdlIVwiO1xuICAgIH1cblxuICAgIHZhciBpbmRleCA9IGVkZ2Uuc291cmNlLmVkZ2VzLmluZGV4T2YoZWRnZSk7XG4gICAgZWRnZS5zb3VyY2UuZWRnZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpbmRleCA9IGVkZ2UudGFyZ2V0LmVkZ2VzLmluZGV4T2YoZWRnZSk7XG4gICAgZWRnZS50YXJnZXQuZWRnZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIHJlbW92ZSBlZGdlIGZyb20gb3duZXIgZ3JhcGggbWFuYWdlcidzIGludGVyLWdyYXBoIGVkZ2UgbGlzdFxuXG4gICAgaWYgKCEoZWRnZS5zb3VyY2Uub3duZXIgIT0gbnVsbCAmJiBlZGdlLnNvdXJjZS5vd25lci5nZXRHcmFwaE1hbmFnZXIoKSAhPSBudWxsKSkge1xuICAgICAgdGhyb3cgXCJFZGdlIG93bmVyIGdyYXBoIG9yIG93bmVyIGdyYXBoIG1hbmFnZXIgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKGVkZ2Uuc291cmNlLm93bmVyLmdldEdyYXBoTWFuYWdlcigpLmVkZ2VzLmluZGV4T2YoZWRnZSkgPT0gLTEpIHtcbiAgICAgIHRocm93IFwiTm90IGluIG93bmVyIGdyYXBoIG1hbmFnZXIncyBlZGdlIGxpc3QhXCI7XG4gICAgfVxuXG4gICAgdmFyIGluZGV4ID0gZWRnZS5zb3VyY2Uub3duZXIuZ2V0R3JhcGhNYW5hZ2VyKCkuZWRnZXMuaW5kZXhPZihlZGdlKTtcbiAgICBlZGdlLnNvdXJjZS5vd25lci5nZXRHcmFwaE1hbmFnZXIoKS5lZGdlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS51cGRhdGVCb3VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMucm9vdEdyYXBoLnVwZGF0ZUJvdW5kcyh0cnVlKTtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldEdyYXBocyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhzO1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuZ2V0QWxsTm9kZXMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmFsbE5vZGVzID09IG51bGwpIHtcbiAgICB2YXIgbm9kZUxpc3QgPSBbXTtcbiAgICB2YXIgZ3JhcGhzID0gdGhpcy5nZXRHcmFwaHMoKTtcbiAgICB2YXIgcyA9IGdyYXBocy5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgIG5vZGVMaXN0ID0gbm9kZUxpc3QuY29uY2F0KGdyYXBoc1tpXS5nZXROb2RlcygpKTtcbiAgICB9XG4gICAgdGhpcy5hbGxOb2RlcyA9IG5vZGVMaXN0O1xuICB9XG4gIHJldHVybiB0aGlzLmFsbE5vZGVzO1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUucmVzZXRBbGxOb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5hbGxOb2RlcyA9IG51bGw7XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5yZXNldEFsbEVkZ2VzID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmFsbEVkZ2VzID0gbnVsbDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLnJlc2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuYWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24gPSBudWxsO1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuZ2V0QWxsRWRnZXMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmFsbEVkZ2VzID09IG51bGwpIHtcbiAgICB2YXIgZWRnZUxpc3QgPSBbXTtcbiAgICB2YXIgZ3JhcGhzID0gdGhpcy5nZXRHcmFwaHMoKTtcbiAgICB2YXIgcyA9IGdyYXBocy5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncmFwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGVkZ2VMaXN0ID0gZWRnZUxpc3QuY29uY2F0KGdyYXBoc1tpXS5nZXRFZGdlcygpKTtcbiAgICB9XG5cbiAgICBlZGdlTGlzdCA9IGVkZ2VMaXN0LmNvbmNhdCh0aGlzLmVkZ2VzKTtcblxuICAgIHRoaXMuYWxsRWRnZXMgPSBlZGdlTGlzdDtcbiAgfVxuICByZXR1cm4gdGhpcy5hbGxFZGdlcztcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5hbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbjtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLnNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uID0gZnVuY3Rpb24gKG5vZGVMaXN0KSB7XG4gIGlmICh0aGlzLmFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uICE9IG51bGwpIHtcbiAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgfVxuXG4gIHRoaXMuYWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24gPSBub2RlTGlzdDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldFJvb3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJvb3RHcmFwaDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLnNldFJvb3RHcmFwaCA9IGZ1bmN0aW9uIChncmFwaCkge1xuICBpZiAoZ3JhcGguZ2V0R3JhcGhNYW5hZ2VyKCkgIT0gdGhpcykge1xuICAgIHRocm93IFwiUm9vdCBub3QgaW4gdGhpcyBncmFwaCBtZ3IhXCI7XG4gIH1cblxuICB0aGlzLnJvb3RHcmFwaCA9IGdyYXBoO1xuICAvLyByb290IGdyYXBoIG11c3QgaGF2ZSBhIHJvb3Qgbm9kZSBhc3NvY2lhdGVkIHdpdGggaXQgZm9yIGNvbnZlbmllbmNlXG4gIGlmIChncmFwaC5wYXJlbnQgPT0gbnVsbCkge1xuICAgIGdyYXBoLnBhcmVudCA9IHRoaXMubGF5b3V0Lm5ld05vZGUoXCJSb290IG5vZGVcIik7XG4gIH1cbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldExheW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubGF5b3V0O1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuaXNPbmVBbmNlc3Rvck9mT3RoZXIgPSBmdW5jdGlvbiAoZmlyc3ROb2RlLCBzZWNvbmROb2RlKSB7XG4gIGlmICghKGZpcnN0Tm9kZSAhPSBudWxsICYmIHNlY29uZE5vZGUgIT0gbnVsbCkpIHtcbiAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgfVxuXG4gIGlmIChmaXJzdE5vZGUgPT0gc2Vjb25kTm9kZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIElzIHNlY29uZCBub2RlIGFuIGFuY2VzdG9yIG9mIHRoZSBmaXJzdCBvbmU/XG4gIHZhciBvd25lckdyYXBoID0gZmlyc3ROb2RlLmdldE93bmVyKCk7XG4gIHZhciBwYXJlbnROb2RlO1xuXG4gIGRvIHtcbiAgICBwYXJlbnROb2RlID0gb3duZXJHcmFwaC5nZXRQYXJlbnQoKTtcblxuICAgIGlmIChwYXJlbnROb2RlID09IG51bGwpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChwYXJlbnROb2RlID09IHNlY29uZE5vZGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIG93bmVyR3JhcGggPSBwYXJlbnROb2RlLmdldE93bmVyKCk7XG4gICAgaWYgKG93bmVyR3JhcGggPT0gbnVsbCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcbiAgLy8gSXMgZmlyc3Qgbm9kZSBhbiBhbmNlc3RvciBvZiB0aGUgc2Vjb25kIG9uZT9cbiAgb3duZXJHcmFwaCA9IHNlY29uZE5vZGUuZ2V0T3duZXIoKTtcblxuICBkbyB7XG4gICAgcGFyZW50Tm9kZSA9IG93bmVyR3JhcGguZ2V0UGFyZW50KCk7XG5cbiAgICBpZiAocGFyZW50Tm9kZSA9PSBudWxsKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAocGFyZW50Tm9kZSA9PSBmaXJzdE5vZGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIG93bmVyR3JhcGggPSBwYXJlbnROb2RlLmdldE93bmVyKCk7XG4gICAgaWYgKG93bmVyR3JhcGggPT0gbnVsbCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5jYWxjTG93ZXN0Q29tbW9uQW5jZXN0b3JzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWRnZTtcbiAgdmFyIHNvdXJjZU5vZGU7XG4gIHZhciB0YXJnZXROb2RlO1xuICB2YXIgc291cmNlQW5jZXN0b3JHcmFwaDtcbiAgdmFyIHRhcmdldEFuY2VzdG9yR3JhcGg7XG5cbiAgdmFyIGVkZ2VzID0gdGhpcy5nZXRBbGxFZGdlcygpO1xuICB2YXIgcyA9IGVkZ2VzLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICBlZGdlID0gZWRnZXNbaV07XG5cbiAgICBzb3VyY2VOb2RlID0gZWRnZS5zb3VyY2U7XG4gICAgdGFyZ2V0Tm9kZSA9IGVkZ2UudGFyZ2V0O1xuICAgIGVkZ2UubGNhID0gbnVsbDtcbiAgICBlZGdlLnNvdXJjZUluTGNhID0gc291cmNlTm9kZTtcbiAgICBlZGdlLnRhcmdldEluTGNhID0gdGFyZ2V0Tm9kZTtcblxuICAgIGlmIChzb3VyY2VOb2RlID09IHRhcmdldE5vZGUpIHtcbiAgICAgIGVkZ2UubGNhID0gc291cmNlTm9kZS5nZXRPd25lcigpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgc291cmNlQW5jZXN0b3JHcmFwaCA9IHNvdXJjZU5vZGUuZ2V0T3duZXIoKTtcblxuICAgIHdoaWxlIChlZGdlLmxjYSA9PSBudWxsKSB7XG4gICAgICBlZGdlLnRhcmdldEluTGNhID0gdGFyZ2V0Tm9kZTtcbiAgICAgIHRhcmdldEFuY2VzdG9yR3JhcGggPSB0YXJnZXROb2RlLmdldE93bmVyKCk7XG5cbiAgICAgIHdoaWxlIChlZGdlLmxjYSA9PSBudWxsKSB7XG4gICAgICAgIGlmICh0YXJnZXRBbmNlc3RvckdyYXBoID09IHNvdXJjZUFuY2VzdG9yR3JhcGgpIHtcbiAgICAgICAgICBlZGdlLmxjYSA9IHRhcmdldEFuY2VzdG9yR3JhcGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0QW5jZXN0b3JHcmFwaCA9PSB0aGlzLnJvb3RHcmFwaCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVkZ2UubGNhICE9IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgICAgICAgfVxuICAgICAgICBlZGdlLnRhcmdldEluTGNhID0gdGFyZ2V0QW5jZXN0b3JHcmFwaC5nZXRQYXJlbnQoKTtcbiAgICAgICAgdGFyZ2V0QW5jZXN0b3JHcmFwaCA9IGVkZ2UudGFyZ2V0SW5MY2EuZ2V0T3duZXIoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNvdXJjZUFuY2VzdG9yR3JhcGggPT0gdGhpcy5yb290R3JhcGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChlZGdlLmxjYSA9PSBudWxsKSB7XG4gICAgICAgIGVkZ2Uuc291cmNlSW5MY2EgPSBzb3VyY2VBbmNlc3RvckdyYXBoLmdldFBhcmVudCgpO1xuICAgICAgICBzb3VyY2VBbmNlc3RvckdyYXBoID0gZWRnZS5zb3VyY2VJbkxjYS5nZXRPd25lcigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlZGdlLmxjYSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgICB9XG4gIH1cbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmNhbGNMb3dlc3RDb21tb25BbmNlc3RvciA9IGZ1bmN0aW9uIChmaXJzdE5vZGUsIHNlY29uZE5vZGUpIHtcbiAgaWYgKGZpcnN0Tm9kZSA9PSBzZWNvbmROb2RlKSB7XG4gICAgcmV0dXJuIGZpcnN0Tm9kZS5nZXRPd25lcigpO1xuICB9XG4gIHZhciBmaXJzdE93bmVyR3JhcGggPSBmaXJzdE5vZGUuZ2V0T3duZXIoKTtcblxuICBkbyB7XG4gICAgaWYgKGZpcnN0T3duZXJHcmFwaCA9PSBudWxsKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIHNlY29uZE93bmVyR3JhcGggPSBzZWNvbmROb2RlLmdldE93bmVyKCk7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoc2Vjb25kT3duZXJHcmFwaCA9PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2Vjb25kT3duZXJHcmFwaCA9PSBmaXJzdE93bmVyR3JhcGgpIHtcbiAgICAgICAgcmV0dXJuIHNlY29uZE93bmVyR3JhcGg7XG4gICAgICB9XG4gICAgICBzZWNvbmRPd25lckdyYXBoID0gc2Vjb25kT3duZXJHcmFwaC5nZXRQYXJlbnQoKS5nZXRPd25lcigpO1xuICAgIH0gd2hpbGUgKHRydWUpO1xuXG4gICAgZmlyc3RPd25lckdyYXBoID0gZmlyc3RPd25lckdyYXBoLmdldFBhcmVudCgpLmdldE93bmVyKCk7XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIHJldHVybiBmaXJzdE93bmVyR3JhcGg7XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5jYWxjSW5jbHVzaW9uVHJlZURlcHRocyA9IGZ1bmN0aW9uIChncmFwaCwgZGVwdGgpIHtcbiAgaWYgKGdyYXBoID09IG51bGwgJiYgZGVwdGggPT0gbnVsbCkge1xuICAgIGdyYXBoID0gdGhpcy5yb290R3JhcGg7XG4gICAgZGVwdGggPSAxO1xuICB9XG4gIHZhciBub2RlO1xuXG4gIHZhciBub2RlcyA9IGdyYXBoLmdldE5vZGVzKCk7XG4gIHZhciBzID0gbm9kZXMubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHM7IGkrKykge1xuICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICBub2RlLmluY2x1c2lvblRyZWVEZXB0aCA9IGRlcHRoO1xuXG4gICAgaWYgKG5vZGUuY2hpbGQgIT0gbnVsbCkge1xuICAgICAgdGhpcy5jYWxjSW5jbHVzaW9uVHJlZURlcHRocyhub2RlLmNoaWxkLCBkZXB0aCArIDEpO1xuICAgIH1cbiAgfVxufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuaW5jbHVkZXNJbnZhbGlkRWRnZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVkZ2U7XG4gIHZhciBlZGdlc1RvUmVtb3ZlID0gW107XG5cbiAgdmFyIHMgPSB0aGlzLmVkZ2VzLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICBlZGdlID0gdGhpcy5lZGdlc1tpXTtcblxuICAgIGlmICh0aGlzLmlzT25lQW5jZXN0b3JPZk90aGVyKGVkZ2Uuc291cmNlLCBlZGdlLnRhcmdldCkpIHtcbiAgICAgIGVkZ2VzVG9SZW1vdmUucHVzaChlZGdlKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZW1vdmUgaW52YWxpZCBlZGdlcyBmcm9tIGdyYXBoIG1hbmFnZXJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5yZW1vdmUoZWRnZXNUb1JlbW92ZVtpXSk7XG4gIH1cblxuICAvLyBJbnZhbGlkIGVkZ2VzIGFyZSBjbGVhcmVkLCBzbyByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBMR3JhcGhNYW5hZ2VyO1xuXG4vKioqLyB9KSxcbi8qIDggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLyoqXG4gKiBUaGlzIGNsYXNzIG1haW50YWlucyBhIGxpc3Qgb2Ygc3RhdGljIGdlb21ldHJ5IHJlbGF0ZWQgdXRpbGl0eSBtZXRob2RzLlxuICpcbiAqXG4gKiBDb3B5cmlnaHQ6IGktVmlzIFJlc2VhcmNoIEdyb3VwLCBCaWxrZW50IFVuaXZlcnNpdHksIDIwMDcgLSBwcmVzZW50XG4gKi9cblxudmFyIFBvaW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG5cbmZ1bmN0aW9uIElHZW9tZXRyeSgpIHt9XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2FsY3VsYXRlcyAqaGFsZiogdGhlIGFtb3VudCBpbiB4IGFuZCB5IGRpcmVjdGlvbnMgb2YgdGhlIHR3b1xuICogaW5wdXQgcmVjdGFuZ2xlcyBuZWVkZWQgdG8gc2VwYXJhdGUgdGhlbSBrZWVwaW5nIHRoZWlyIHJlc3BlY3RpdmVcbiAqIHBvc2l0aW9uaW5nLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGluIHRoZSBpbnB1dCBhcnJheS4gQW4gaW5wdXRcbiAqIHNlcGFyYXRpb24gYnVmZmVyIGFkZGVkIHRvIHRoZSBhbW91bnQgaW4gYm90aCBkaXJlY3Rpb25zLiBXZSBhc3N1bWUgdGhhdFxuICogdGhlIHR3byByZWN0YW5nbGVzIGRvIGludGVyc2VjdC5cbiAqL1xuSUdlb21ldHJ5LmNhbGNTZXBhcmF0aW9uQW1vdW50ID0gZnVuY3Rpb24gKHJlY3RBLCByZWN0Qiwgb3ZlcmxhcEFtb3VudCwgc2VwYXJhdGlvbkJ1ZmZlcikge1xuICBpZiAoIXJlY3RBLmludGVyc2VjdHMocmVjdEIpKSB7XG4gICAgdGhyb3cgXCJhc3NlcnQgZmFpbGVkXCI7XG4gIH1cblxuICB2YXIgZGlyZWN0aW9ucyA9IG5ldyBBcnJheSgyKTtcblxuICB0aGlzLmRlY2lkZURpcmVjdGlvbnNGb3JPdmVybGFwcGluZ05vZGVzKHJlY3RBLCByZWN0QiwgZGlyZWN0aW9ucyk7XG5cbiAgb3ZlcmxhcEFtb3VudFswXSA9IE1hdGgubWluKHJlY3RBLmdldFJpZ2h0KCksIHJlY3RCLmdldFJpZ2h0KCkpIC0gTWF0aC5tYXgocmVjdEEueCwgcmVjdEIueCk7XG4gIG92ZXJsYXBBbW91bnRbMV0gPSBNYXRoLm1pbihyZWN0QS5nZXRCb3R0b20oKSwgcmVjdEIuZ2V0Qm90dG9tKCkpIC0gTWF0aC5tYXgocmVjdEEueSwgcmVjdEIueSk7XG5cbiAgLy8gdXBkYXRlIHRoZSBvdmVybGFwcGluZyBhbW91bnRzIGZvciB0aGUgZm9sbG93aW5nIGNhc2VzOlxuICBpZiAocmVjdEEuZ2V0WCgpIDw9IHJlY3RCLmdldFgoKSAmJiByZWN0QS5nZXRSaWdodCgpID49IHJlY3RCLmdldFJpZ2h0KCkpIHtcbiAgICAvKiBDYXNlIHguMTpcbiAgICAqXG4gICAgKiByZWN0QVxuICAgICogXHR8ICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgKiBcdHwgICAgICAgIF9fX19fX19fXyAgICAgIHxcbiAgICAqIFx0fCAgICAgICAgfCAgICAgICB8ICAgICAgfFxuICAgICogXHR8X19fX19fX198X19fX19fX3xfX19fX198XG4gICAgKiBcdFx0XHQgfCAgICAgICB8XG4gICAgKiAgICAgICAgICAgfCAgICAgICB8XG4gICAgKiAgICAgICAgcmVjdEJcbiAgICAqL1xuICAgIG92ZXJsYXBBbW91bnRbMF0gKz0gTWF0aC5taW4ocmVjdEIuZ2V0WCgpIC0gcmVjdEEuZ2V0WCgpLCByZWN0QS5nZXRSaWdodCgpIC0gcmVjdEIuZ2V0UmlnaHQoKSk7XG4gIH0gZWxzZSBpZiAocmVjdEIuZ2V0WCgpIDw9IHJlY3RBLmdldFgoKSAmJiByZWN0Qi5nZXRSaWdodCgpID49IHJlY3RBLmdldFJpZ2h0KCkpIHtcbiAgICAvKiBDYXNlIHguMjpcbiAgICAqXG4gICAgKiByZWN0QlxuICAgICogXHR8ICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgKiBcdHwgICAgICAgIF9fX19fX19fXyAgICAgIHxcbiAgICAqIFx0fCAgICAgICAgfCAgICAgICB8ICAgICAgfFxuICAgICogXHR8X19fX19fX198X19fX19fX3xfX19fX198XG4gICAgKiBcdFx0XHQgfCAgICAgICB8XG4gICAgKiAgICAgICAgICAgfCAgICAgICB8XG4gICAgKiAgICAgICAgcmVjdEFcbiAgICAqL1xuICAgIG92ZXJsYXBBbW91bnRbMF0gKz0gTWF0aC5taW4ocmVjdEEuZ2V0WCgpIC0gcmVjdEIuZ2V0WCgpLCByZWN0Qi5nZXRSaWdodCgpIC0gcmVjdEEuZ2V0UmlnaHQoKSk7XG4gIH1cbiAgaWYgKHJlY3RBLmdldFkoKSA8PSByZWN0Qi5nZXRZKCkgJiYgcmVjdEEuZ2V0Qm90dG9tKCkgPj0gcmVjdEIuZ2V0Qm90dG9tKCkpIHtcbiAgICAvKiBDYXNlIHkuMTpcbiAgICAgKiAgICAgICAgICBfX19fX19fXyByZWN0QVxuICAgICAqICAgICAgICAgfFxuICAgICAqICAgICAgICAgfFxuICAgICAqICAgX19fX19ffF9fX18gIHJlY3RCXG4gICAgICogICAgICAgICB8ICAgIHxcbiAgICAgKiAgICAgICAgIHwgICAgfFxuICAgICAqICAgX19fX19ffF9fX198XG4gICAgICogICAgICAgICB8XG4gICAgICogICAgICAgICB8XG4gICAgICogICAgICAgICB8X19fX19fX19cbiAgICAgKlxuICAgICAqL1xuICAgIG92ZXJsYXBBbW91bnRbMV0gKz0gTWF0aC5taW4ocmVjdEIuZ2V0WSgpIC0gcmVjdEEuZ2V0WSgpLCByZWN0QS5nZXRCb3R0b20oKSAtIHJlY3RCLmdldEJvdHRvbSgpKTtcbiAgfSBlbHNlIGlmIChyZWN0Qi5nZXRZKCkgPD0gcmVjdEEuZ2V0WSgpICYmIHJlY3RCLmdldEJvdHRvbSgpID49IHJlY3RBLmdldEJvdHRvbSgpKSB7XG4gICAgLyogQ2FzZSB5LjI6XG4gICAgKiAgICAgICAgICBfX19fX19fXyByZWN0QlxuICAgICogICAgICAgICB8XG4gICAgKiAgICAgICAgIHxcbiAgICAqICAgX19fX19ffF9fX18gIHJlY3RBXG4gICAgKiAgICAgICAgIHwgICAgfFxuICAgICogICAgICAgICB8ICAgIHxcbiAgICAqICAgX19fX19ffF9fX198XG4gICAgKiAgICAgICAgIHxcbiAgICAqICAgICAgICAgfFxuICAgICogICAgICAgICB8X19fX19fX19cbiAgICAqXG4gICAgKi9cbiAgICBvdmVybGFwQW1vdW50WzFdICs9IE1hdGgubWluKHJlY3RBLmdldFkoKSAtIHJlY3RCLmdldFkoKSwgcmVjdEIuZ2V0Qm90dG9tKCkgLSByZWN0QS5nZXRCb3R0b20oKSk7XG4gIH1cblxuICAvLyBmaW5kIHNsb3BlIG9mIHRoZSBsaW5lIHBhc3NlcyB0d28gY2VudGVyc1xuICB2YXIgc2xvcGUgPSBNYXRoLmFicygocmVjdEIuZ2V0Q2VudGVyWSgpIC0gcmVjdEEuZ2V0Q2VudGVyWSgpKSAvIChyZWN0Qi5nZXRDZW50ZXJYKCkgLSByZWN0QS5nZXRDZW50ZXJYKCkpKTtcbiAgLy8gaWYgY2VudGVycyBhcmUgb3ZlcmxhcHBlZFxuICBpZiAocmVjdEIuZ2V0Q2VudGVyWSgpID09PSByZWN0QS5nZXRDZW50ZXJZKCkgJiYgcmVjdEIuZ2V0Q2VudGVyWCgpID09PSByZWN0QS5nZXRDZW50ZXJYKCkpIHtcbiAgICAvLyBhc3N1bWUgdGhlIHNsb3BlIGlzIDEgKDQ1IGRlZ3JlZSlcbiAgICBzbG9wZSA9IDEuMDtcbiAgfVxuXG4gIHZhciBtb3ZlQnlZID0gc2xvcGUgKiBvdmVybGFwQW1vdW50WzBdO1xuICB2YXIgbW92ZUJ5WCA9IG92ZXJsYXBBbW91bnRbMV0gLyBzbG9wZTtcbiAgaWYgKG92ZXJsYXBBbW91bnRbMF0gPCBtb3ZlQnlYKSB7XG4gICAgbW92ZUJ5WCA9IG92ZXJsYXBBbW91bnRbMF07XG4gIH0gZWxzZSB7XG4gICAgbW92ZUJ5WSA9IG92ZXJsYXBBbW91bnRbMV07XG4gIH1cbiAgLy8gcmV0dXJuIGhhbGYgdGhlIGFtb3VudCBzbyB0aGF0IGlmIGVhY2ggcmVjdGFuZ2xlIGlzIG1vdmVkIGJ5IHRoZXNlXG4gIC8vIGFtb3VudHMgaW4gb3Bwb3NpdGUgZGlyZWN0aW9ucywgb3ZlcmxhcCB3aWxsIGJlIHJlc29sdmVkXG4gIG92ZXJsYXBBbW91bnRbMF0gPSAtMSAqIGRpcmVjdGlvbnNbMF0gKiAobW92ZUJ5WCAvIDIgKyBzZXBhcmF0aW9uQnVmZmVyKTtcbiAgb3ZlcmxhcEFtb3VudFsxXSA9IC0xICogZGlyZWN0aW9uc1sxXSAqIChtb3ZlQnlZIC8gMiArIHNlcGFyYXRpb25CdWZmZXIpO1xufTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBkZWNpZGVzIHRoZSBzZXBhcmF0aW9uIGRpcmVjdGlvbiBvZiBvdmVybGFwcGluZyBub2Rlc1xuICpcbiAqIGlmIGRpcmVjdGlvbnNbMF0gPSAtMSwgdGhlbiByZWN0QSBnb2VzIGxlZnRcbiAqIGlmIGRpcmVjdGlvbnNbMF0gPSAxLCAgdGhlbiByZWN0QSBnb2VzIHJpZ2h0XG4gKiBpZiBkaXJlY3Rpb25zWzFdID0gLTEsIHRoZW4gcmVjdEEgZ29lcyB1cFxuICogaWYgZGlyZWN0aW9uc1sxXSA9IDEsICB0aGVuIHJlY3RBIGdvZXMgZG93blxuICovXG5JR2VvbWV0cnkuZGVjaWRlRGlyZWN0aW9uc0Zvck92ZXJsYXBwaW5nTm9kZXMgPSBmdW5jdGlvbiAocmVjdEEsIHJlY3RCLCBkaXJlY3Rpb25zKSB7XG4gIGlmIChyZWN0QS5nZXRDZW50ZXJYKCkgPCByZWN0Qi5nZXRDZW50ZXJYKCkpIHtcbiAgICBkaXJlY3Rpb25zWzBdID0gLTE7XG4gIH0gZWxzZSB7XG4gICAgZGlyZWN0aW9uc1swXSA9IDE7XG4gIH1cblxuICBpZiAocmVjdEEuZ2V0Q2VudGVyWSgpIDwgcmVjdEIuZ2V0Q2VudGVyWSgpKSB7XG4gICAgZGlyZWN0aW9uc1sxXSA9IC0xO1xuICB9IGVsc2Uge1xuICAgIGRpcmVjdGlvbnNbMV0gPSAxO1xuICB9XG59O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNhbGN1bGF0ZXMgdGhlIGludGVyc2VjdGlvbiAoY2xpcHBpbmcpIHBvaW50cyBvZiB0aGUgdHdvXG4gKiBpbnB1dCByZWN0YW5nbGVzIHdpdGggbGluZSBzZWdtZW50IGRlZmluZWQgYnkgdGhlIGNlbnRlcnMgb2YgdGhlc2UgdHdvXG4gKiByZWN0YW5nbGVzLiBUaGUgY2xpcHBpbmcgcG9pbnRzIGFyZSBzYXZlZCBpbiB0aGUgaW5wdXQgZG91YmxlIGFycmF5IGFuZFxuICogd2hldGhlciBvciBub3QgdGhlIHR3byByZWN0YW5nbGVzIG92ZXJsYXAgaXMgcmV0dXJuZWQuXG4gKi9cbklHZW9tZXRyeS5nZXRJbnRlcnNlY3Rpb24yID0gZnVuY3Rpb24gKHJlY3RBLCByZWN0QiwgcmVzdWx0KSB7XG4gIC8vcmVzdWx0WzAtMV0gd2lsbCBjb250YWluIGNsaXBQb2ludCBvZiByZWN0QSwgcmVzdWx0WzItM10gd2lsbCBjb250YWluIGNsaXBQb2ludCBvZiByZWN0QlxuICB2YXIgcDF4ID0gcmVjdEEuZ2V0Q2VudGVyWCgpO1xuICB2YXIgcDF5ID0gcmVjdEEuZ2V0Q2VudGVyWSgpO1xuICB2YXIgcDJ4ID0gcmVjdEIuZ2V0Q2VudGVyWCgpO1xuICB2YXIgcDJ5ID0gcmVjdEIuZ2V0Q2VudGVyWSgpO1xuXG4gIC8vaWYgdHdvIHJlY3RhbmdsZXMgaW50ZXJzZWN0LCB0aGVuIGNsaXBwaW5nIHBvaW50cyBhcmUgY2VudGVyc1xuICBpZiAocmVjdEEuaW50ZXJzZWN0cyhyZWN0QikpIHtcbiAgICByZXN1bHRbMF0gPSBwMXg7XG4gICAgcmVzdWx0WzFdID0gcDF5O1xuICAgIHJlc3VsdFsyXSA9IHAyeDtcbiAgICByZXN1bHRbM10gPSBwMnk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy92YXJpYWJsZXMgZm9yIHJlY3RBXG4gIHZhciB0b3BMZWZ0QXggPSByZWN0QS5nZXRYKCk7XG4gIHZhciB0b3BMZWZ0QXkgPSByZWN0QS5nZXRZKCk7XG4gIHZhciB0b3BSaWdodEF4ID0gcmVjdEEuZ2V0UmlnaHQoKTtcbiAgdmFyIGJvdHRvbUxlZnRBeCA9IHJlY3RBLmdldFgoKTtcbiAgdmFyIGJvdHRvbUxlZnRBeSA9IHJlY3RBLmdldEJvdHRvbSgpO1xuICB2YXIgYm90dG9tUmlnaHRBeCA9IHJlY3RBLmdldFJpZ2h0KCk7XG4gIHZhciBoYWxmV2lkdGhBID0gcmVjdEEuZ2V0V2lkdGhIYWxmKCk7XG4gIHZhciBoYWxmSGVpZ2h0QSA9IHJlY3RBLmdldEhlaWdodEhhbGYoKTtcbiAgLy92YXJpYWJsZXMgZm9yIHJlY3RCXG4gIHZhciB0b3BMZWZ0QnggPSByZWN0Qi5nZXRYKCk7XG4gIHZhciB0b3BMZWZ0QnkgPSByZWN0Qi5nZXRZKCk7XG4gIHZhciB0b3BSaWdodEJ4ID0gcmVjdEIuZ2V0UmlnaHQoKTtcbiAgdmFyIGJvdHRvbUxlZnRCeCA9IHJlY3RCLmdldFgoKTtcbiAgdmFyIGJvdHRvbUxlZnRCeSA9IHJlY3RCLmdldEJvdHRvbSgpO1xuICB2YXIgYm90dG9tUmlnaHRCeCA9IHJlY3RCLmdldFJpZ2h0KCk7XG4gIHZhciBoYWxmV2lkdGhCID0gcmVjdEIuZ2V0V2lkdGhIYWxmKCk7XG4gIHZhciBoYWxmSGVpZ2h0QiA9IHJlY3RCLmdldEhlaWdodEhhbGYoKTtcblxuICAvL2ZsYWcgd2hldGhlciBjbGlwcGluZyBwb2ludHMgYXJlIGZvdW5kXG4gIHZhciBjbGlwUG9pbnRBRm91bmQgPSBmYWxzZTtcbiAgdmFyIGNsaXBQb2ludEJGb3VuZCA9IGZhbHNlO1xuXG4gIC8vIGxpbmUgaXMgdmVydGljYWxcbiAgaWYgKHAxeCA9PT0gcDJ4KSB7XG4gICAgaWYgKHAxeSA+IHAyeSkge1xuICAgICAgcmVzdWx0WzBdID0gcDF4O1xuICAgICAgcmVzdWx0WzFdID0gdG9wTGVmdEF5O1xuICAgICAgcmVzdWx0WzJdID0gcDJ4O1xuICAgICAgcmVzdWx0WzNdID0gYm90dG9tTGVmdEJ5O1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAocDF5IDwgcDJ5KSB7XG4gICAgICByZXN1bHRbMF0gPSBwMXg7XG4gICAgICByZXN1bHRbMV0gPSBib3R0b21MZWZ0QXk7XG4gICAgICByZXN1bHRbMl0gPSBwMng7XG4gICAgICByZXN1bHRbM10gPSB0b3BMZWZ0Qnk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vbm90IGxpbmUsIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICAvLyBsaW5lIGlzIGhvcml6b250YWxcbiAgZWxzZSBpZiAocDF5ID09PSBwMnkpIHtcbiAgICAgIGlmIChwMXggPiBwMngpIHtcbiAgICAgICAgcmVzdWx0WzBdID0gdG9wTGVmdEF4O1xuICAgICAgICByZXN1bHRbMV0gPSBwMXk7XG4gICAgICAgIHJlc3VsdFsyXSA9IHRvcFJpZ2h0Qng7XG4gICAgICAgIHJlc3VsdFszXSA9IHAyeTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChwMXggPCBwMngpIHtcbiAgICAgICAgcmVzdWx0WzBdID0gdG9wUmlnaHRBeDtcbiAgICAgICAgcmVzdWx0WzFdID0gcDF5O1xuICAgICAgICByZXN1bHRbMl0gPSB0b3BMZWZ0Qng7XG4gICAgICAgIHJlc3VsdFszXSA9IHAyeTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy9ub3QgdmFsaWQgbGluZSwgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vc2xvcGVzIG9mIHJlY3RBJ3MgYW5kIHJlY3RCJ3MgZGlhZ29uYWxzXG4gICAgICB2YXIgc2xvcGVBID0gcmVjdEEuaGVpZ2h0IC8gcmVjdEEud2lkdGg7XG4gICAgICB2YXIgc2xvcGVCID0gcmVjdEIuaGVpZ2h0IC8gcmVjdEIud2lkdGg7XG5cbiAgICAgIC8vc2xvcGUgb2YgbGluZSBiZXR3ZWVuIGNlbnRlciBvZiByZWN0QSBhbmQgY2VudGVyIG9mIHJlY3RCXG4gICAgICB2YXIgc2xvcGVQcmltZSA9IChwMnkgLSBwMXkpIC8gKHAyeCAtIHAxeCk7XG4gICAgICB2YXIgY2FyZGluYWxEaXJlY3Rpb25BID0gdm9pZCAwO1xuICAgICAgdmFyIGNhcmRpbmFsRGlyZWN0aW9uQiA9IHZvaWQgMDtcbiAgICAgIHZhciB0ZW1wUG9pbnRBeCA9IHZvaWQgMDtcbiAgICAgIHZhciB0ZW1wUG9pbnRBeSA9IHZvaWQgMDtcbiAgICAgIHZhciB0ZW1wUG9pbnRCeCA9IHZvaWQgMDtcbiAgICAgIHZhciB0ZW1wUG9pbnRCeSA9IHZvaWQgMDtcblxuICAgICAgLy9kZXRlcm1pbmUgd2hldGhlciBjbGlwcGluZyBwb2ludCBpcyB0aGUgY29ybmVyIG9mIG5vZGVBXG4gICAgICBpZiAoLXNsb3BlQSA9PT0gc2xvcGVQcmltZSkge1xuICAgICAgICBpZiAocDF4ID4gcDJ4KSB7XG4gICAgICAgICAgcmVzdWx0WzBdID0gYm90dG9tTGVmdEF4O1xuICAgICAgICAgIHJlc3VsdFsxXSA9IGJvdHRvbUxlZnRBeTtcbiAgICAgICAgICBjbGlwUG9pbnRBRm91bmQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdFswXSA9IHRvcFJpZ2h0QXg7XG4gICAgICAgICAgcmVzdWx0WzFdID0gdG9wTGVmdEF5O1xuICAgICAgICAgIGNsaXBQb2ludEFGb3VuZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2xvcGVBID09PSBzbG9wZVByaW1lKSB7XG4gICAgICAgIGlmIChwMXggPiBwMngpIHtcbiAgICAgICAgICByZXN1bHRbMF0gPSB0b3BMZWZ0QXg7XG4gICAgICAgICAgcmVzdWx0WzFdID0gdG9wTGVmdEF5O1xuICAgICAgICAgIGNsaXBQb2ludEFGb3VuZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0WzBdID0gYm90dG9tUmlnaHRBeDtcbiAgICAgICAgICByZXN1bHRbMV0gPSBib3R0b21MZWZ0QXk7XG4gICAgICAgICAgY2xpcFBvaW50QUZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvL2RldGVybWluZSB3aGV0aGVyIGNsaXBwaW5nIHBvaW50IGlzIHRoZSBjb3JuZXIgb2Ygbm9kZUJcbiAgICAgIGlmICgtc2xvcGVCID09PSBzbG9wZVByaW1lKSB7XG4gICAgICAgIGlmIChwMnggPiBwMXgpIHtcbiAgICAgICAgICByZXN1bHRbMl0gPSBib3R0b21MZWZ0Qng7XG4gICAgICAgICAgcmVzdWx0WzNdID0gYm90dG9tTGVmdEJ5O1xuICAgICAgICAgIGNsaXBQb2ludEJGb3VuZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0WzJdID0gdG9wUmlnaHRCeDtcbiAgICAgICAgICByZXN1bHRbM10gPSB0b3BMZWZ0Qnk7XG4gICAgICAgICAgY2xpcFBvaW50QkZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzbG9wZUIgPT09IHNsb3BlUHJpbWUpIHtcbiAgICAgICAgaWYgKHAyeCA+IHAxeCkge1xuICAgICAgICAgIHJlc3VsdFsyXSA9IHRvcExlZnRCeDtcbiAgICAgICAgICByZXN1bHRbM10gPSB0b3BMZWZ0Qnk7XG4gICAgICAgICAgY2xpcFBvaW50QkZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRbMl0gPSBib3R0b21SaWdodEJ4O1xuICAgICAgICAgIHJlc3VsdFszXSA9IGJvdHRvbUxlZnRCeTtcbiAgICAgICAgICBjbGlwUG9pbnRCRm91bmQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vaWYgYm90aCBjbGlwcGluZyBwb2ludHMgYXJlIGNvcm5lcnNcbiAgICAgIGlmIChjbGlwUG9pbnRBRm91bmQgJiYgY2xpcFBvaW50QkZvdW5kKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy9kZXRlcm1pbmUgQ2FyZGluYWwgRGlyZWN0aW9uIG9mIHJlY3RhbmdsZXNcbiAgICAgIGlmIChwMXggPiBwMngpIHtcbiAgICAgICAgaWYgKHAxeSA+IHAyeSkge1xuICAgICAgICAgIGNhcmRpbmFsRGlyZWN0aW9uQSA9IHRoaXMuZ2V0Q2FyZGluYWxEaXJlY3Rpb24oc2xvcGVBLCBzbG9wZVByaW1lLCA0KTtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkIgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKHNsb3BlQiwgc2xvcGVQcmltZSwgMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FyZGluYWxEaXJlY3Rpb25BID0gdGhpcy5nZXRDYXJkaW5hbERpcmVjdGlvbigtc2xvcGVBLCBzbG9wZVByaW1lLCAzKTtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkIgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKC1zbG9wZUIsIHNsb3BlUHJpbWUsIDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocDF5ID4gcDJ5KSB7XG4gICAgICAgICAgY2FyZGluYWxEaXJlY3Rpb25BID0gdGhpcy5nZXRDYXJkaW5hbERpcmVjdGlvbigtc2xvcGVBLCBzbG9wZVByaW1lLCAxKTtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkIgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKC1zbG9wZUIsIHNsb3BlUHJpbWUsIDMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhcmRpbmFsRGlyZWN0aW9uQSA9IHRoaXMuZ2V0Q2FyZGluYWxEaXJlY3Rpb24oc2xvcGVBLCBzbG9wZVByaW1lLCAyKTtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkIgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKHNsb3BlQiwgc2xvcGVQcmltZSwgNCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vY2FsY3VsYXRlIGNsaXBwaW5nIFBvaW50IGlmIGl0IGlzIG5vdCBmb3VuZCBiZWZvcmVcbiAgICAgIGlmICghY2xpcFBvaW50QUZvdW5kKSB7XG4gICAgICAgIHN3aXRjaCAoY2FyZGluYWxEaXJlY3Rpb25BKSB7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdGVtcFBvaW50QXkgPSB0b3BMZWZ0QXk7XG4gICAgICAgICAgICB0ZW1wUG9pbnRBeCA9IHAxeCArIC1oYWxmSGVpZ2h0QSAvIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMF0gPSB0ZW1wUG9pbnRBeDtcbiAgICAgICAgICAgIHJlc3VsdFsxXSA9IHRlbXBQb2ludEF5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgdGVtcFBvaW50QXggPSBib3R0b21SaWdodEF4O1xuICAgICAgICAgICAgdGVtcFBvaW50QXkgPSBwMXkgKyBoYWxmV2lkdGhBICogc2xvcGVQcmltZTtcbiAgICAgICAgICAgIHJlc3VsdFswXSA9IHRlbXBQb2ludEF4O1xuICAgICAgICAgICAgcmVzdWx0WzFdID0gdGVtcFBvaW50QXk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICB0ZW1wUG9pbnRBeSA9IGJvdHRvbUxlZnRBeTtcbiAgICAgICAgICAgIHRlbXBQb2ludEF4ID0gcDF4ICsgaGFsZkhlaWdodEEgLyBzbG9wZVByaW1lO1xuICAgICAgICAgICAgcmVzdWx0WzBdID0gdGVtcFBvaW50QXg7XG4gICAgICAgICAgICByZXN1bHRbMV0gPSB0ZW1wUG9pbnRBeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHRlbXBQb2ludEF4ID0gYm90dG9tTGVmdEF4O1xuICAgICAgICAgICAgdGVtcFBvaW50QXkgPSBwMXkgKyAtaGFsZldpZHRoQSAqIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMF0gPSB0ZW1wUG9pbnRBeDtcbiAgICAgICAgICAgIHJlc3VsdFsxXSA9IHRlbXBQb2ludEF5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghY2xpcFBvaW50QkZvdW5kKSB7XG4gICAgICAgIHN3aXRjaCAoY2FyZGluYWxEaXJlY3Rpb25CKSB7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdGVtcFBvaW50QnkgPSB0b3BMZWZ0Qnk7XG4gICAgICAgICAgICB0ZW1wUG9pbnRCeCA9IHAyeCArIC1oYWxmSGVpZ2h0QiAvIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMl0gPSB0ZW1wUG9pbnRCeDtcbiAgICAgICAgICAgIHJlc3VsdFszXSA9IHRlbXBQb2ludEJ5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgdGVtcFBvaW50QnggPSBib3R0b21SaWdodEJ4O1xuICAgICAgICAgICAgdGVtcFBvaW50QnkgPSBwMnkgKyBoYWxmV2lkdGhCICogc2xvcGVQcmltZTtcbiAgICAgICAgICAgIHJlc3VsdFsyXSA9IHRlbXBQb2ludEJ4O1xuICAgICAgICAgICAgcmVzdWx0WzNdID0gdGVtcFBvaW50Qnk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICB0ZW1wUG9pbnRCeSA9IGJvdHRvbUxlZnRCeTtcbiAgICAgICAgICAgIHRlbXBQb2ludEJ4ID0gcDJ4ICsgaGFsZkhlaWdodEIgLyBzbG9wZVByaW1lO1xuICAgICAgICAgICAgcmVzdWx0WzJdID0gdGVtcFBvaW50Qng7XG4gICAgICAgICAgICByZXN1bHRbM10gPSB0ZW1wUG9pbnRCeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHRlbXBQb2ludEJ4ID0gYm90dG9tTGVmdEJ4O1xuICAgICAgICAgICAgdGVtcFBvaW50QnkgPSBwMnkgKyAtaGFsZldpZHRoQiAqIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMl0gPSB0ZW1wUG9pbnRCeDtcbiAgICAgICAgICAgIHJlc3VsdFszXSA9IHRlbXBQb2ludEJ5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBpbiB3aGljaCBjYXJkaW5hbCBkaXJlY3Rpb24gZG9lcyBpbnB1dCBwb2ludCBzdGF5c1xuICogMTogTm9ydGhcbiAqIDI6IEVhc3RcbiAqIDM6IFNvdXRoXG4gKiA0OiBXZXN0XG4gKi9cbklHZW9tZXRyeS5nZXRDYXJkaW5hbERpcmVjdGlvbiA9IGZ1bmN0aW9uIChzbG9wZSwgc2xvcGVQcmltZSwgbGluZSkge1xuICBpZiAoc2xvcGUgPiBzbG9wZVByaW1lKSB7XG4gICAgcmV0dXJuIGxpbmU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDEgKyBsaW5lICUgNDtcbiAgfVxufTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjYWxjdWxhdGVzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBsaW5lcyBkZWZpbmVkIGJ5XG4gKiBwb2ludCBwYWlycyAoczEsczIpIGFuZCAoZjEsZjIpLlxuICovXG5JR2VvbWV0cnkuZ2V0SW50ZXJzZWN0aW9uID0gZnVuY3Rpb24gKHMxLCBzMiwgZjEsIGYyKSB7XG4gIGlmIChmMiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SW50ZXJzZWN0aW9uMihzMSwgczIsIGYxKTtcbiAgfVxuXG4gIHZhciB4MSA9IHMxLng7XG4gIHZhciB5MSA9IHMxLnk7XG4gIHZhciB4MiA9IHMyLng7XG4gIHZhciB5MiA9IHMyLnk7XG4gIHZhciB4MyA9IGYxLng7XG4gIHZhciB5MyA9IGYxLnk7XG4gIHZhciB4NCA9IGYyLng7XG4gIHZhciB5NCA9IGYyLnk7XG4gIHZhciB4ID0gdm9pZCAwLFxuICAgICAgeSA9IHZvaWQgMDsgLy8gaW50ZXJzZWN0aW9uIHBvaW50XG4gIHZhciBhMSA9IHZvaWQgMCxcbiAgICAgIGEyID0gdm9pZCAwLFxuICAgICAgYjEgPSB2b2lkIDAsXG4gICAgICBiMiA9IHZvaWQgMCxcbiAgICAgIGMxID0gdm9pZCAwLFxuICAgICAgYzIgPSB2b2lkIDA7IC8vIGNvZWZmaWNpZW50cyBvZiBsaW5lIGVxbnMuXG4gIHZhciBkZW5vbSA9IHZvaWQgMDtcblxuICBhMSA9IHkyIC0geTE7XG4gIGIxID0geDEgLSB4MjtcbiAgYzEgPSB4MiAqIHkxIC0geDEgKiB5MjsgLy8geyBhMSp4ICsgYjEqeSArIGMxID0gMCBpcyBsaW5lIDEgfVxuXG4gIGEyID0geTQgLSB5MztcbiAgYjIgPSB4MyAtIHg0O1xuICBjMiA9IHg0ICogeTMgLSB4MyAqIHk0OyAvLyB7IGEyKnggKyBiMip5ICsgYzIgPSAwIGlzIGxpbmUgMiB9XG5cbiAgZGVub20gPSBhMSAqIGIyIC0gYTIgKiBiMTtcblxuICBpZiAoZGVub20gPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHggPSAoYjEgKiBjMiAtIGIyICogYzEpIC8gZGVub207XG4gIHkgPSAoYTIgKiBjMSAtIGExICogYzIpIC8gZGVub207XG5cbiAgcmV0dXJuIG5ldyBQb2ludCh4LCB5KTtcbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgZmluZHMgYW5kIHJldHVybnMgdGhlIGFuZ2xlIG9mIHRoZSB2ZWN0b3IgZnJvbSB0aGUgKyB4LWF4aXNcbiAqIGluIGNsb2Nrd2lzZSBkaXJlY3Rpb24gKGNvbXBhdGlibGUgdy8gSmF2YSBjb29yZGluYXRlIHN5c3RlbSEpLlxuICovXG5JR2VvbWV0cnkuYW5nbGVPZlZlY3RvciA9IGZ1bmN0aW9uIChDeCwgQ3ksIE54LCBOeSkge1xuICB2YXIgQ19hbmdsZSA9IHZvaWQgMDtcblxuICBpZiAoQ3ggIT09IE54KSB7XG4gICAgQ19hbmdsZSA9IE1hdGguYXRhbigoTnkgLSBDeSkgLyAoTnggLSBDeCkpO1xuXG4gICAgaWYgKE54IDwgQ3gpIHtcbiAgICAgIENfYW5nbGUgKz0gTWF0aC5QSTtcbiAgICB9IGVsc2UgaWYgKE55IDwgQ3kpIHtcbiAgICAgIENfYW5nbGUgKz0gdGhpcy5UV09fUEk7XG4gICAgfVxuICB9IGVsc2UgaWYgKE55IDwgQ3kpIHtcbiAgICBDX2FuZ2xlID0gdGhpcy5PTkVfQU5EX0hBTEZfUEk7IC8vIDI3MCBkZWdyZWVzXG4gIH0gZWxzZSB7XG4gICAgQ19hbmdsZSA9IHRoaXMuSEFMRl9QSTsgLy8gOTAgZGVncmVlc1xuICB9XG5cbiAgcmV0dXJuIENfYW5nbGU7XG59O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB0d28gbGluZSBzZWdtZW50cyAob25lIHdpdGggcG9pbnRcbiAqIHAxIGFuZCBwMiwgdGhlIG90aGVyIHdpdGggcG9pbnQgcDMgYW5kIHA0KSBpbnRlcnNlY3QgYXQgYSBwb2ludCBvdGhlclxuICogdGhhbiB0aGVzZSBwb2ludHMuXG4gKi9cbklHZW9tZXRyeS5kb0ludGVyc2VjdCA9IGZ1bmN0aW9uIChwMSwgcDIsIHAzLCBwNCkge1xuICB2YXIgYSA9IHAxLng7XG4gIHZhciBiID0gcDEueTtcbiAgdmFyIGMgPSBwMi54O1xuICB2YXIgZCA9IHAyLnk7XG4gIHZhciBwID0gcDMueDtcbiAgdmFyIHEgPSBwMy55O1xuICB2YXIgciA9IHA0Lng7XG4gIHZhciBzID0gcDQueTtcbiAgdmFyIGRldCA9IChjIC0gYSkgKiAocyAtIHEpIC0gKHIgLSBwKSAqIChkIC0gYik7XG5cbiAgaWYgKGRldCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGFtYmRhID0gKChzIC0gcSkgKiAociAtIGEpICsgKHAgLSByKSAqIChzIC0gYikpIC8gZGV0O1xuICAgIHZhciBnYW1tYSA9ICgoYiAtIGQpICogKHIgLSBhKSArIChjIC0gYSkgKiAocyAtIGIpKSAvIGRldDtcbiAgICByZXR1cm4gMCA8IGxhbWJkYSAmJiBsYW1iZGEgPCAxICYmIDAgPCBnYW1tYSAmJiBnYW1tYSA8IDE7XG4gIH1cbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2hlY2tzIGFuZCBjYWxjdWxhdGVzIHRoZSBpbnRlcnNlY3Rpb24gb2YgXG4gKiBhIGxpbmUgc2VnbWVudCBhbmQgYSBjaXJjbGUuXG4gKi9cbklHZW9tZXRyeS5maW5kQ2lyY2xlTGluZUludGVyc2VjdGlvbnMgPSBmdW5jdGlvbiAoRXgsIEV5LCBMeCwgTHksIEN4LCBDeSwgcikge1xuXG4gIC8vIEUgaXMgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSByYXksXG4gIC8vIEwgaXMgdGhlIGVuZCBwb2ludCBvZiB0aGUgcmF5LFxuICAvLyBDIGlzIHRoZSBjZW50ZXIgb2Ygc3BoZXJlIHlvdSdyZSB0ZXN0aW5nIGFnYWluc3RcbiAgLy8gciBpcyB0aGUgcmFkaXVzIG9mIHRoYXQgc3BoZXJlXG5cbiAgLy8gQ29tcHV0ZTpcbiAgLy8gZCA9IEwgLSBFICggRGlyZWN0aW9uIHZlY3RvciBvZiByYXksIGZyb20gc3RhcnQgdG8gZW5kIClcbiAgLy8gZiA9IEUgLSBDICggVmVjdG9yIGZyb20gY2VudGVyIHNwaGVyZSB0byByYXkgc3RhcnQgKVxuXG4gIC8vIFRoZW4gdGhlIGludGVyc2VjdGlvbiBpcyBmb3VuZCBieS4uXG4gIC8vIFAgPSBFICsgdCAqIGRcbiAgLy8gVGhpcyBpcyBhIHBhcmFtZXRyaWMgZXF1YXRpb246XG4gIC8vIFB4ID0gRXggKyB0ZHhcbiAgLy8gUHkgPSBFeSArIHRkeVxuXG4gIC8vIGdldCBhLCBiLCBjIHZhbHVlc1xuICB2YXIgYSA9IChMeCAtIEV4KSAqIChMeCAtIEV4KSArIChMeSAtIEV5KSAqIChMeSAtIEV5KTtcbiAgdmFyIGIgPSAyICogKChFeCAtIEN4KSAqIChMeCAtIEV4KSArIChFeSAtIEN5KSAqIChMeSAtIEV5KSk7XG4gIHZhciBjID0gKEV4IC0gQ3gpICogKEV4IC0gQ3gpICsgKEV5IC0gQ3kpICogKEV5IC0gQ3kpIC0gciAqIHI7XG5cbiAgLy8gZ2V0IGRpc2NyaW1pbmFudFxuICB2YXIgZGlzYyA9IGIgKiBiIC0gNCAqIGEgKiBjO1xuICBpZiAoZGlzYyA+PSAwKSB7XG4gICAgLy8gaW5zZXJ0IGludG8gcXVhZHJhdGljIGZvcm11bGFcbiAgICB2YXIgdDEgPSAoLWIgKyBNYXRoLnNxcnQoYiAqIGIgLSA0ICogYSAqIGMpKSAvICgyICogYSk7XG4gICAgdmFyIHQyID0gKC1iIC0gTWF0aC5zcXJ0KGIgKiBiIC0gNCAqIGEgKiBjKSkgLyAoMiAqIGEpO1xuICAgIHZhciBpbnRlcnNlY3Rpb25zID0gbnVsbDtcbiAgICBpZiAodDEgPj0gMCAmJiB0MSA8PSAxKSB7XG4gICAgICAvLyB0MSBpcyB0aGUgaW50ZXJzZWN0aW9uLCBhbmQgaXQncyBjbG9zZXIgdGhhbiB0MlxuICAgICAgLy8gKHNpbmNlIHQxIHVzZXMgLWIgLSBkaXNjcmltaW5hbnQpXG4gICAgICAvLyBJbXBhbGUsIFBva2VcbiAgICAgIHJldHVybiBbdDFdO1xuICAgIH1cblxuICAgIC8vIGhlcmUgdDEgZGlkbid0IGludGVyc2VjdCBzbyB3ZSBhcmUgZWl0aGVyIHN0YXJ0ZWRcbiAgICAvLyBpbnNpZGUgdGhlIHNwaGVyZSBvciBjb21wbGV0ZWx5IHBhc3QgaXRcbiAgICBpZiAodDIgPj0gMCAmJiB0MiA8PSAxKSB7XG4gICAgICAvLyBFeGl0V291bmRcbiAgICAgIHJldHVybiBbdDJdO1xuICAgIH1cblxuICAgIHJldHVybiBpbnRlcnNlY3Rpb25zO1xuICB9IGVsc2UgcmV0dXJuIG51bGw7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VjdGlvbjogQ2xhc3MgQ29uc3RhbnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqXG4gKiBTb21lIHVzZWZ1bCBwcmUtY2FsY3VsYXRlZCBjb25zdGFudHNcbiAqL1xuSUdlb21ldHJ5LkhBTEZfUEkgPSAwLjUgKiBNYXRoLlBJO1xuSUdlb21ldHJ5Lk9ORV9BTkRfSEFMRl9QSSA9IDEuNSAqIE1hdGguUEk7XG5JR2VvbWV0cnkuVFdPX1BJID0gMi4wICogTWF0aC5QSTtcbklHZW9tZXRyeS5USFJFRV9QSSA9IDMuMCAqIE1hdGguUEk7XG5cbm1vZHVsZS5leHBvcnRzID0gSUdlb21ldHJ5O1xuXG4vKioqLyB9KSxcbi8qIDkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gSU1hdGgoKSB7fVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNpZ24gb2YgdGhlIGlucHV0IHZhbHVlLlxuICovXG5JTWF0aC5zaWduID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA+IDApIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIGlmICh2YWx1ZSA8IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG5cbklNYXRoLmZsb29yID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA8IDAgPyBNYXRoLmNlaWwodmFsdWUpIDogTWF0aC5mbG9vcih2YWx1ZSk7XG59O1xuXG5JTWF0aC5jZWlsID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA8IDAgPyBNYXRoLmZsb29yKHZhbHVlKSA6IE1hdGguY2VpbCh2YWx1ZSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IElNYXRoO1xuXG4vKioqLyB9KSxcbi8qIDEwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIEludGVnZXIoKSB7fVxuXG5JbnRlZ2VyLk1BWF9WQUxVRSA9IDIxNDc0ODM2NDc7XG5JbnRlZ2VyLk1JTl9WQUxVRSA9IC0yMTQ3NDgzNjQ4O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEludGVnZXI7XG5cbi8qKiovIH0pLFxuLyogMTEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIG5vZGVGcm9tID0gZnVuY3Rpb24gbm9kZUZyb20odmFsdWUpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBuZXh0OiBudWxsLCBwcmV2OiBudWxsIH07XG59O1xuXG52YXIgYWRkID0gZnVuY3Rpb24gYWRkKHByZXYsIG5vZGUsIG5leHQsIGxpc3QpIHtcbiAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICBwcmV2Lm5leHQgPSBub2RlO1xuICB9IGVsc2Uge1xuICAgIGxpc3QuaGVhZCA9IG5vZGU7XG4gIH1cblxuICBpZiAobmV4dCAhPT0gbnVsbCkge1xuICAgIG5leHQucHJldiA9IG5vZGU7XG4gIH0gZWxzZSB7XG4gICAgbGlzdC50YWlsID0gbm9kZTtcbiAgfVxuXG4gIG5vZGUucHJldiA9IHByZXY7XG4gIG5vZGUubmV4dCA9IG5leHQ7XG5cbiAgbGlzdC5sZW5ndGgrKztcblxuICByZXR1cm4gbm9kZTtcbn07XG5cbnZhciBfcmVtb3ZlID0gZnVuY3Rpb24gX3JlbW92ZShub2RlLCBsaXN0KSB7XG4gIHZhciBwcmV2ID0gbm9kZS5wcmV2LFxuICAgICAgbmV4dCA9IG5vZGUubmV4dDtcblxuXG4gIGlmIChwcmV2ICE9PSBudWxsKSB7XG4gICAgcHJldi5uZXh0ID0gbmV4dDtcbiAgfSBlbHNlIHtcbiAgICBsaXN0LmhlYWQgPSBuZXh0O1xuICB9XG5cbiAgaWYgKG5leHQgIT09IG51bGwpIHtcbiAgICBuZXh0LnByZXYgPSBwcmV2O1xuICB9IGVsc2Uge1xuICAgIGxpc3QudGFpbCA9IHByZXY7XG4gIH1cblxuICBub2RlLnByZXYgPSBub2RlLm5leHQgPSBudWxsO1xuXG4gIGxpc3QubGVuZ3RoLS07XG5cbiAgcmV0dXJuIG5vZGU7XG59O1xuXG52YXIgTGlua2VkTGlzdCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTGlua2VkTGlzdCh2YWxzKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMaW5rZWRMaXN0KTtcblxuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLmhlYWQgPSBudWxsO1xuICAgIHRoaXMudGFpbCA9IG51bGw7XG5cbiAgICBpZiAodmFscyAhPSBudWxsKSB7XG4gICAgICB2YWxzLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLnB1c2godik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTGlua2VkTGlzdCwgW3tcbiAgICBrZXk6IFwic2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaXplKCkge1xuICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnNlcnRCZWZvcmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5zZXJ0QmVmb3JlKHZhbCwgb3RoZXJOb2RlKSB7XG4gICAgICByZXR1cm4gYWRkKG90aGVyTm9kZS5wcmV2LCBub2RlRnJvbSh2YWwpLCBvdGhlck5vZGUsIHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnNlcnRBZnRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnNlcnRBZnRlcih2YWwsIG90aGVyTm9kZSkge1xuICAgICAgcmV0dXJuIGFkZChvdGhlck5vZGUsIG5vZGVGcm9tKHZhbCksIG90aGVyTm9kZS5uZXh0LCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5zZXJ0Tm9kZUJlZm9yZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnNlcnROb2RlQmVmb3JlKG5ld05vZGUsIG90aGVyTm9kZSkge1xuICAgICAgcmV0dXJuIGFkZChvdGhlck5vZGUucHJldiwgbmV3Tm9kZSwgb3RoZXJOb2RlLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5zZXJ0Tm9kZUFmdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluc2VydE5vZGVBZnRlcihuZXdOb2RlLCBvdGhlck5vZGUpIHtcbiAgICAgIHJldHVybiBhZGQob3RoZXJOb2RlLCBuZXdOb2RlLCBvdGhlck5vZGUubmV4dCwgdGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInB1c2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHVzaCh2YWwpIHtcbiAgICAgIHJldHVybiBhZGQodGhpcy50YWlsLCBub2RlRnJvbSh2YWwpLCBudWxsLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5zaGlmdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bnNoaWZ0KHZhbCkge1xuICAgICAgcmV0dXJuIGFkZChudWxsLCBub2RlRnJvbSh2YWwpLCB0aGlzLmhlYWQsIHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlKG5vZGUpIHtcbiAgICAgIHJldHVybiBfcmVtb3ZlKG5vZGUsIHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwb3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcG9wKCkge1xuICAgICAgcmV0dXJuIF9yZW1vdmUodGhpcy50YWlsLCB0aGlzKS52YWx1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicG9wTm9kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwb3BOb2RlKCkge1xuICAgICAgcmV0dXJuIF9yZW1vdmUodGhpcy50YWlsLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hpZnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hpZnQoKSB7XG4gICAgICByZXR1cm4gX3JlbW92ZSh0aGlzLmhlYWQsIHRoaXMpLnZhbHVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaGlmdE5vZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hpZnROb2RlKCkge1xuICAgICAgcmV0dXJuIF9yZW1vdmUodGhpcy5oZWFkLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0X29iamVjdF9hdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRfb2JqZWN0X2F0KGluZGV4KSB7XG4gICAgICBpZiAoaW5kZXggPD0gdGhpcy5sZW5ndGgoKSkge1xuICAgICAgICB2YXIgaSA9IDE7XG4gICAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5oZWFkO1xuICAgICAgICB3aGlsZSAoaSA8IGluZGV4KSB7XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldF9vYmplY3RfYXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0X29iamVjdF9hdChpbmRleCwgdmFsdWUpIHtcbiAgICAgIGlmIChpbmRleCA8PSB0aGlzLmxlbmd0aCgpKSB7XG4gICAgICAgIHZhciBpID0gMTtcbiAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmhlYWQ7XG4gICAgICAgIHdoaWxlIChpIDwgaW5kZXgpIHtcbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LnZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIExpbmtlZExpc3Q7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTGlua2VkTGlzdDtcblxuLyoqKi8gfSksXG4vKiAxMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG4vKlxyXG4gKlRoaXMgY2xhc3MgaXMgdGhlIGphdmFzY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFBvaW50LmphdmEgY2xhc3MgaW4gamRrXHJcbiAqL1xuZnVuY3Rpb24gUG9pbnQoeCwgeSwgcCkge1xuICB0aGlzLnggPSBudWxsO1xuICB0aGlzLnkgPSBudWxsO1xuICBpZiAoeCA9PSBudWxsICYmIHkgPT0gbnVsbCAmJiBwID09IG51bGwpIHtcbiAgICB0aGlzLnggPSAwO1xuICAgIHRoaXMueSA9IDA7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHggPT0gJ251bWJlcicgJiYgdHlwZW9mIHkgPT0gJ251bWJlcicgJiYgcCA9PSBudWxsKSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICB9IGVsc2UgaWYgKHguY29uc3RydWN0b3IubmFtZSA9PSAnUG9pbnQnICYmIHkgPT0gbnVsbCAmJiBwID09IG51bGwpIHtcbiAgICBwID0geDtcbiAgICB0aGlzLnggPSBwLng7XG4gICAgdGhpcy55ID0gcC55O1xuICB9XG59XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy54O1xufTtcblxuUG9pbnQucHJvdG90eXBlLmdldFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0TG9jYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcy54LCB0aGlzLnkpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLnNldExvY2F0aW9uID0gZnVuY3Rpb24gKHgsIHksIHApIHtcbiAgaWYgKHguY29uc3RydWN0b3IubmFtZSA9PSAnUG9pbnQnICYmIHkgPT0gbnVsbCAmJiBwID09IG51bGwpIHtcbiAgICBwID0geDtcbiAgICB0aGlzLnNldExvY2F0aW9uKHAueCwgcC55KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgeCA9PSAnbnVtYmVyJyAmJiB0eXBlb2YgeSA9PSAnbnVtYmVyJyAmJiBwID09IG51bGwpIHtcbiAgICAvL2lmIGJvdGggcGFyYW1ldGVycyBhcmUgaW50ZWdlciBqdXN0IG1vdmUgKHgseSkgbG9jYXRpb25cbiAgICBpZiAocGFyc2VJbnQoeCkgPT0geCAmJiBwYXJzZUludCh5KSA9PSB5KSB7XG4gICAgICB0aGlzLm1vdmUoeCwgeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMueCA9IE1hdGguZmxvb3IoeCArIDAuNSk7XG4gICAgICB0aGlzLnkgPSBNYXRoLmZsb29yKHkgKyAwLjUpO1xuICAgIH1cbiAgfVxufTtcblxuUG9pbnQucHJvdG90eXBlLm1vdmUgPSBmdW5jdGlvbiAoeCwgeSkge1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xufTtcblxuUG9pbnQucHJvdG90eXBlLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uIChkeCwgZHkpIHtcbiAgdGhpcy54ICs9IGR4O1xuICB0aGlzLnkgKz0gZHk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKG9iaikge1xuICBpZiAob2JqLmNvbnN0cnVjdG9yLm5hbWUgPT0gXCJQb2ludFwiKSB7XG4gICAgdmFyIHB0ID0gb2JqO1xuICAgIHJldHVybiB0aGlzLnggPT0gcHQueCAmJiB0aGlzLnkgPT0gcHQueTtcbiAgfVxuICByZXR1cm4gdGhpcyA9PSBvYmo7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgUG9pbnQoKS5jb25zdHJ1Y3Rvci5uYW1lICsgXCJbeD1cIiArIHRoaXMueCArIFwiLHk9XCIgKyB0aGlzLnkgKyBcIl1cIjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUG9pbnQ7XG5cbi8qKiovIH0pLFxuLyogMTMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gUmVjdGFuZ2xlRCh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHRoaXMueCA9IDA7XG4gIHRoaXMueSA9IDA7XG4gIHRoaXMud2lkdGggPSAwO1xuICB0aGlzLmhlaWdodCA9IDA7XG5cbiAgaWYgKHggIT0gbnVsbCAmJiB5ICE9IG51bGwgJiYgd2lkdGggIT0gbnVsbCAmJiBoZWlnaHQgIT0gbnVsbCkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cbn1cblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMueDtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLnNldFggPSBmdW5jdGlvbiAoeCkge1xuICB0aGlzLnggPSB4O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMueTtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLnNldFkgPSBmdW5jdGlvbiAoeSkge1xuICB0aGlzLnkgPSB5O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndpZHRoO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuc2V0V2lkdGggPSBmdW5jdGlvbiAod2lkdGgpIHtcbiAgdGhpcy53aWR0aCA9IHdpZHRoO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5oZWlnaHQ7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5zZXRIZWlnaHQgPSBmdW5jdGlvbiAoaGVpZ2h0KSB7XG4gIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0UmlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnggKyB0aGlzLndpZHRoO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0Qm90dG9tID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy55ICsgdGhpcy5oZWlnaHQ7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5pbnRlcnNlY3RzID0gZnVuY3Rpb24gKGEpIHtcbiAgaWYgKHRoaXMuZ2V0UmlnaHQoKSA8IGEueCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0aGlzLmdldEJvdHRvbSgpIDwgYS55KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGEuZ2V0UmlnaHQoKSA8IHRoaXMueCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChhLmdldEJvdHRvbSgpIDwgdGhpcy55KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRDZW50ZXJYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy54ICsgdGhpcy53aWR0aCAvIDI7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRNaW5YID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5nZXRYKCk7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRNYXhYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5nZXRYKCkgKyB0aGlzLndpZHRoO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0Q2VudGVyWSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMueSArIHRoaXMuaGVpZ2h0IC8gMjtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLmdldE1pblkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmdldFkoKTtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLmdldE1heFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmdldFkoKSArIHRoaXMuaGVpZ2h0O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0V2lkdGhIYWxmID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53aWR0aCAvIDI7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRIZWlnaHRIYWxmID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5oZWlnaHQgLyAyO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWN0YW5nbGVEO1xuXG4vKioqLyB9KSxcbi8qIDE0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuZnVuY3Rpb24gVW5pcXVlSURHZW5lcmV0b3IoKSB7fVxuXG5VbmlxdWVJREdlbmVyZXRvci5sYXN0SUQgPSAwO1xuXG5VbmlxdWVJREdlbmVyZXRvci5jcmVhdGVJRCA9IGZ1bmN0aW9uIChvYmopIHtcbiAgaWYgKFVuaXF1ZUlER2VuZXJldG9yLmlzUHJpbWl0aXZlKG9iaikpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIGlmIChvYmoudW5pcXVlSUQgIT0gbnVsbCkge1xuICAgIHJldHVybiBvYmoudW5pcXVlSUQ7XG4gIH1cbiAgb2JqLnVuaXF1ZUlEID0gVW5pcXVlSURHZW5lcmV0b3IuZ2V0U3RyaW5nKCk7XG4gIFVuaXF1ZUlER2VuZXJldG9yLmxhc3RJRCsrO1xuICByZXR1cm4gb2JqLnVuaXF1ZUlEO1xufTtcblxuVW5pcXVlSURHZW5lcmV0b3IuZ2V0U3RyaW5nID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlmIChpZCA9PSBudWxsKSBpZCA9IFVuaXF1ZUlER2VuZXJldG9yLmxhc3RJRDtcbiAgcmV0dXJuIFwiT2JqZWN0I1wiICsgaWQgKyBcIlwiO1xufTtcblxuVW5pcXVlSURHZW5lcmV0b3IuaXNQcmltaXRpdmUgPSBmdW5jdGlvbiAoYXJnKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGFyZyA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKGFyZyk7XG4gIHJldHVybiBhcmcgPT0gbnVsbCB8fCB0eXBlICE9IFwib2JqZWN0XCIgJiYgdHlwZSAhPSBcImZ1bmN0aW9uXCI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVuaXF1ZUlER2VuZXJldG9yO1xuXG4vKioqLyB9KSxcbi8qIDE1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXG52YXIgTGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbnZhciBMR3JhcGhNYW5hZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcbnZhciBMTm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG52YXIgTEVkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xudmFyIExHcmFwaCA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG52YXIgUG9pbnREID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcbnZhciBUcmFuc2Zvcm0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KTtcbnZhciBFbWl0dGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSk7XG5cbmZ1bmN0aW9uIExheW91dChpc1JlbW90ZVVzZSkge1xuICBFbWl0dGVyLmNhbGwodGhpcyk7XG5cbiAgLy9MYXlvdXQgUXVhbGl0eTogMDpkcmFmdCwgMTpkZWZhdWx0LCAyOnByb29mXG4gIHRoaXMubGF5b3V0UXVhbGl0eSA9IExheW91dENvbnN0YW50cy5RVUFMSVRZO1xuICAvL1doZXRoZXIgbGF5b3V0IHNob3VsZCBjcmVhdGUgYmVuZHBvaW50cyBhcyBuZWVkZWQgb3Igbm90XG4gIHRoaXMuY3JlYXRlQmVuZHNBc05lZWRlZCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0NSRUFURV9CRU5EU19BU19ORUVERUQ7XG4gIC8vV2hldGhlciBsYXlvdXQgc2hvdWxkIGJlIGluY3JlbWVudGFsIG9yIG5vdFxuICB0aGlzLmluY3JlbWVudGFsID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUw7XG4gIC8vV2hldGhlciB3ZSBhbmltYXRlIGZyb20gYmVmb3JlIHRvIGFmdGVyIGxheW91dCBub2RlIHBvc2l0aW9uc1xuICB0aGlzLmFuaW1hdGlvbk9uTGF5b3V0ID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX09OX0xBWU9VVDtcbiAgLy9XaGV0aGVyIHdlIGFuaW1hdGUgdGhlIGxheW91dCBwcm9jZXNzIG9yIG5vdFxuICB0aGlzLmFuaW1hdGlvbkR1cmluZ0xheW91dCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0FOSU1BVElPTl9EVVJJTkdfTEFZT1VUO1xuICAvL051bWJlciBpdGVyYXRpb25zIHRoYXQgc2hvdWxkIGJlIGRvbmUgYmV0d2VlbiB0d28gc3VjY2Vzc2l2ZSBhbmltYXRpb25zXG4gIHRoaXMuYW5pbWF0aW9uUGVyaW9kID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX1BFUklPRDtcbiAgLyoqXHJcbiAgICogV2hldGhlciBvciBub3QgbGVhZiBub2RlcyAobm9uLWNvbXBvdW5kIG5vZGVzKSBhcmUgb2YgdW5pZm9ybSBzaXplcy4gV2hlblxyXG4gICAqIHRoZXkgYXJlLCBib3RoIHNwcmluZyBhbmQgcmVwdWxzaW9uIGZvcmNlcyBiZXR3ZWVuIHR3byBsZWFmIG5vZGVzIGNhbiBiZVxyXG4gICAqIGNhbGN1bGF0ZWQgd2l0aG91dCB0aGUgZXhwZW5zaXZlIGNsaXBwaW5nIHBvaW50IGNhbGN1bGF0aW9ucywgcmVzdWx0aW5nXHJcbiAgICogaW4gbWFqb3Igc3BlZWQtdXAuXHJcbiAgICovXG4gIHRoaXMudW5pZm9ybUxlYWZOb2RlU2l6ZXMgPSBMYXlvdXRDb25zdGFudHMuREVGQVVMVF9VTklGT1JNX0xFQUZfTk9ERV9TSVpFUztcbiAgLyoqXHJcbiAgICogVGhpcyBpcyB1c2VkIGZvciBjcmVhdGlvbiBvZiBiZW5kcG9pbnRzIGJ5IHVzaW5nIGR1bW15IG5vZGVzIGFuZCBlZGdlcy5cclxuICAgKiBNYXBzIGFuIExFZGdlIHRvIGl0cyBkdW1teSBiZW5kcG9pbnQgcGF0aC5cclxuICAgKi9cbiAgdGhpcy5lZGdlVG9EdW1teU5vZGVzID0gbmV3IE1hcCgpO1xuICB0aGlzLmdyYXBoTWFuYWdlciA9IG5ldyBMR3JhcGhNYW5hZ2VyKHRoaXMpO1xuICB0aGlzLmlzTGF5b3V0RmluaXNoZWQgPSBmYWxzZTtcbiAgdGhpcy5pc1N1YkxheW91dCA9IGZhbHNlO1xuICB0aGlzLmlzUmVtb3RlVXNlID0gZmFsc2U7XG5cbiAgaWYgKGlzUmVtb3RlVXNlICE9IG51bGwpIHtcbiAgICB0aGlzLmlzUmVtb3RlVXNlID0gaXNSZW1vdGVVc2U7XG4gIH1cbn1cblxuTGF5b3V0LlJBTkRPTV9TRUVEID0gMTtcblxuTGF5b3V0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRW1pdHRlci5wcm90b3R5cGUpO1xuXG5MYXlvdXQucHJvdG90eXBlLmdldEdyYXBoTWFuYWdlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhNYW5hZ2VyO1xufTtcblxuTGF5b3V0LnByb3RvdHlwZS5nZXRBbGxOb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEFsbE5vZGVzKCk7XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLmdldEFsbEVkZ2VzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsRWRnZXMoKTtcbn07XG5cbkxheW91dC5wcm90b3R5cGUuZ2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbigpO1xufTtcblxuTGF5b3V0LnByb3RvdHlwZS5uZXdHcmFwaE1hbmFnZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBnbSA9IG5ldyBMR3JhcGhNYW5hZ2VyKHRoaXMpO1xuICB0aGlzLmdyYXBoTWFuYWdlciA9IGdtO1xuICByZXR1cm4gZ207XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLm5ld0dyYXBoID0gZnVuY3Rpb24gKHZHcmFwaCkge1xuICByZXR1cm4gbmV3IExHcmFwaChudWxsLCB0aGlzLmdyYXBoTWFuYWdlciwgdkdyYXBoKTtcbn07XG5cbkxheW91dC5wcm90b3R5cGUubmV3Tm9kZSA9IGZ1bmN0aW9uICh2Tm9kZSkge1xuICByZXR1cm4gbmV3IExOb2RlKHRoaXMuZ3JhcGhNYW5hZ2VyLCB2Tm9kZSk7XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLm5ld0VkZ2UgPSBmdW5jdGlvbiAodkVkZ2UpIHtcbiAgcmV0dXJuIG5ldyBMRWRnZShudWxsLCBudWxsLCB2RWRnZSk7XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLmNoZWNrTGF5b3V0U3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKSA9PSBudWxsIHx8IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKS5nZXROb2RlcygpLmxlbmd0aCA9PSAwIHx8IHRoaXMuZ3JhcGhNYW5hZ2VyLmluY2x1ZGVzSW52YWxpZEVkZ2UoKTtcbn07XG5cbkxheW91dC5wcm90b3R5cGUucnVuTGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmlzTGF5b3V0RmluaXNoZWQgPSBmYWxzZTtcblxuICBpZiAodGhpcy50aWxpbmdQcmVMYXlvdXQpIHtcbiAgICB0aGlzLnRpbGluZ1ByZUxheW91dCgpO1xuICB9XG5cbiAgdGhpcy5pbml0UGFyYW1ldGVycygpO1xuICB2YXIgaXNMYXlvdXRTdWNjZXNzZnVsbDtcblxuICBpZiAodGhpcy5jaGVja0xheW91dFN1Y2Nlc3MoKSkge1xuICAgIGlzTGF5b3V0U3VjY2Vzc2Z1bGwgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBpc0xheW91dFN1Y2Nlc3NmdWxsID0gdGhpcy5sYXlvdXQoKTtcbiAgfVxuXG4gIGlmIChMYXlvdXRDb25zdGFudHMuQU5JTUFURSA9PT0gJ2R1cmluZycpIHtcbiAgICAvLyBJZiB0aGlzIGlzIGEgJ2R1cmluZycgbGF5b3V0IGFuaW1hdGlvbi4gTGF5b3V0IGlzIG5vdCBmaW5pc2hlZCB5ZXQuIFxuICAgIC8vIFdlIG5lZWQgdG8gcGVyZm9ybSB0aGVzZSBpbiBpbmRleC5qcyB3aGVuIGxheW91dCBpcyByZWFsbHkgZmluaXNoZWQuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzTGF5b3V0U3VjY2Vzc2Z1bGwpIHtcbiAgICBpZiAoIXRoaXMuaXNTdWJMYXlvdXQpIHtcbiAgICAgIHRoaXMuZG9Qb3N0TGF5b3V0KCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMudGlsaW5nUG9zdExheW91dCkge1xuICAgIHRoaXMudGlsaW5nUG9zdExheW91dCgpO1xuICB9XG5cbiAgdGhpcy5pc0xheW91dEZpbmlzaGVkID0gdHJ1ZTtcblxuICByZXR1cm4gaXNMYXlvdXRTdWNjZXNzZnVsbDtcbn07XG5cbi8qKlxyXG4gKiBUaGlzIG1ldGhvZCBwZXJmb3JtcyB0aGUgb3BlcmF0aW9ucyByZXF1aXJlZCBhZnRlciBsYXlvdXQuXHJcbiAqL1xuTGF5b3V0LnByb3RvdHlwZS5kb1Bvc3RMYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIC8vYXNzZXJ0ICFpc1N1YkxheW91dCA6IFwiU2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gc3ViLWxheW91dCFcIjtcbiAgLy8gUHJvcGFnYXRlIGdlb21ldHJpYyBjaGFuZ2VzIHRvIHYtbGV2ZWwgb2JqZWN0c1xuICBpZiAoIXRoaXMuaW5jcmVtZW50YWwpIHtcbiAgICB0aGlzLnRyYW5zZm9ybSgpO1xuICB9XG4gIHRoaXMudXBkYXRlKCk7XG59O1xuXG4vKipcclxuICogVGhpcyBtZXRob2QgdXBkYXRlcyB0aGUgZ2VvbWV0cnkgb2YgdGhlIHRhcmdldCBncmFwaCBhY2NvcmRpbmcgdG9cclxuICogY2FsY3VsYXRlZCBsYXlvdXQuXHJcbiAqL1xuTGF5b3V0LnByb3RvdHlwZS51cGRhdGUyID0gZnVuY3Rpb24gKCkge1xuICAvLyB1cGRhdGUgYmVuZCBwb2ludHNcbiAgaWYgKHRoaXMuY3JlYXRlQmVuZHNBc05lZWRlZCkge1xuICAgIHRoaXMuY3JlYXRlQmVuZHBvaW50c0Zyb21EdW1teU5vZGVzKCk7XG5cbiAgICAvLyByZXNldCBhbGwgZWRnZXMsIHNpbmNlIHRoZSB0b3BvbG9neSBoYXMgY2hhbmdlZFxuICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsRWRnZXMoKTtcbiAgfVxuXG4gIC8vIHBlcmZvcm0gZWRnZSwgbm9kZSBhbmQgcm9vdCB1cGRhdGVzIGlmIGxheW91dCBpcyBub3QgY2FsbGVkXG4gIC8vIHJlbW90ZWx5XG4gIGlmICghdGhpcy5pc1JlbW90ZVVzZSkge1xuICAgIC8vIHVwZGF0ZSBhbGwgZWRnZXNcbiAgICB2YXIgZWRnZTtcbiAgICB2YXIgYWxsRWRnZXMgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxFZGdlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsRWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGVkZ2UgPSBhbGxFZGdlc1tpXTtcbiAgICAgIC8vICAgICAgdGhpcy51cGRhdGUoZWRnZSk7XG4gICAgfVxuXG4gICAgLy8gcmVjdXJzaXZlbHkgdXBkYXRlIG5vZGVzXG4gICAgdmFyIG5vZGU7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldE5vZGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgLy8gICAgICB0aGlzLnVwZGF0ZShub2RlKTtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgcm9vdCBncmFwaFxuICAgIHRoaXMudXBkYXRlKHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKSk7XG4gIH1cbn07XG5cbkxheW91dC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKG9iaikge1xuICBpZiAob2JqID09IG51bGwpIHtcbiAgICB0aGlzLnVwZGF0ZTIoKTtcbiAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBMTm9kZSkge1xuICAgIHZhciBub2RlID0gb2JqO1xuICAgIGlmIChub2RlLmdldENoaWxkKCkgIT0gbnVsbCkge1xuICAgICAgLy8gc2luY2Ugbm9kZSBpcyBjb21wb3VuZCwgcmVjdXJzaXZlbHkgdXBkYXRlIGNoaWxkIG5vZGVzXG4gICAgICB2YXIgbm9kZXMgPSBub2RlLmdldENoaWxkKCkuZ2V0Tm9kZXMoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdXBkYXRlKG5vZGVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgbC1sZXZlbCBub2RlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHYtbGV2ZWwgZ3JhcGggb2JqZWN0LFxuICAgIC8vIHRoZW4gaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSB2LWxldmVsIG5vZGUgaW1wbGVtZW50cyB0aGVcbiAgICAvLyBpbnRlcmZhY2UgVXBkYXRhYmxlLlxuICAgIGlmIChub2RlLnZHcmFwaE9iamVjdCAhPSBudWxsKSB7XG4gICAgICAvLyBjYXN0IHRvIFVwZGF0YWJsZSB3aXRob3V0IGFueSB0eXBlIGNoZWNrXG4gICAgICB2YXIgdk5vZGUgPSBub2RlLnZHcmFwaE9iamVjdDtcblxuICAgICAgLy8gY2FsbCB0aGUgdXBkYXRlIG1ldGhvZCBvZiB0aGUgaW50ZXJmYWNlXG4gICAgICB2Tm9kZS51cGRhdGUobm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIExFZGdlKSB7XG4gICAgdmFyIGVkZ2UgPSBvYmo7XG4gICAgLy8gaWYgdGhlIGwtbGV2ZWwgZWRnZSBpcyBhc3NvY2lhdGVkIHdpdGggYSB2LWxldmVsIGdyYXBoIG9iamVjdCxcbiAgICAvLyB0aGVuIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgdi1sZXZlbCBlZGdlIGltcGxlbWVudHMgdGhlXG4gICAgLy8gaW50ZXJmYWNlIFVwZGF0YWJsZS5cblxuICAgIGlmIChlZGdlLnZHcmFwaE9iamVjdCAhPSBudWxsKSB7XG4gICAgICAvLyBjYXN0IHRvIFVwZGF0YWJsZSB3aXRob3V0IGFueSB0eXBlIGNoZWNrXG4gICAgICB2YXIgdkVkZ2UgPSBlZGdlLnZHcmFwaE9iamVjdDtcblxuICAgICAgLy8gY2FsbCB0aGUgdXBkYXRlIG1ldGhvZCBvZiB0aGUgaW50ZXJmYWNlXG4gICAgICB2RWRnZS51cGRhdGUoZWRnZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIExHcmFwaCkge1xuICAgIHZhciBncmFwaCA9IG9iajtcbiAgICAvLyBpZiB0aGUgbC1sZXZlbCBncmFwaCBpcyBhc3NvY2lhdGVkIHdpdGggYSB2LWxldmVsIGdyYXBoIG9iamVjdCxcbiAgICAvLyB0aGVuIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgdi1sZXZlbCBvYmplY3QgaW1wbGVtZW50cyB0aGVcbiAgICAvLyBpbnRlcmZhY2UgVXBkYXRhYmxlLlxuXG4gICAgaWYgKGdyYXBoLnZHcmFwaE9iamVjdCAhPSBudWxsKSB7XG4gICAgICAvLyBjYXN0IHRvIFVwZGF0YWJsZSB3aXRob3V0IGFueSB0eXBlIGNoZWNrXG4gICAgICB2YXIgdkdyYXBoID0gZ3JhcGgudkdyYXBoT2JqZWN0O1xuXG4gICAgICAvLyBjYWxsIHRoZSB1cGRhdGUgbWV0aG9kIG9mIHRoZSBpbnRlcmZhY2VcbiAgICAgIHZHcmFwaC51cGRhdGUoZ3JhcGgpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXHJcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IGFsbCBsYXlvdXQgcGFyYW1ldGVycyB0byBkZWZhdWx0IHZhbHVlc1xyXG4gKiBkZXRlcm1pbmVkIGF0IGNvbXBpbGUgdGltZS5cclxuICovXG5MYXlvdXQucHJvdG90eXBlLmluaXRQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuaXNTdWJMYXlvdXQpIHtcbiAgICB0aGlzLmxheW91dFF1YWxpdHkgPSBMYXlvdXRDb25zdGFudHMuUVVBTElUWTtcbiAgICB0aGlzLmFuaW1hdGlvbkR1cmluZ0xheW91dCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0FOSU1BVElPTl9EVVJJTkdfTEFZT1VUO1xuICAgIHRoaXMuYW5pbWF0aW9uUGVyaW9kID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX1BFUklPRDtcbiAgICB0aGlzLmFuaW1hdGlvbk9uTGF5b3V0ID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX09OX0xBWU9VVDtcbiAgICB0aGlzLmluY3JlbWVudGFsID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUw7XG4gICAgdGhpcy5jcmVhdGVCZW5kc0FzTmVlZGVkID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ1JFQVRFX0JFTkRTX0FTX05FRURFRDtcbiAgICB0aGlzLnVuaWZvcm1MZWFmTm9kZVNpemVzID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfVU5JRk9STV9MRUFGX05PREVfU0laRVM7XG4gIH1cblxuICBpZiAodGhpcy5hbmltYXRpb25EdXJpbmdMYXlvdXQpIHtcbiAgICB0aGlzLmFuaW1hdGlvbk9uTGF5b3V0ID0gZmFsc2U7XG4gIH1cbn07XG5cbkxheW91dC5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKG5ld0xlZnRUb3ApIHtcbiAgaWYgKG5ld0xlZnRUb3AgPT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0obmV3IFBvaW50RCgwLCAwKSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gY3JlYXRlIGEgdHJhbnNmb3JtYXRpb24gb2JqZWN0IChmcm9tIEVjbGlwc2UgdG8gbGF5b3V0KS4gV2hlbiBhblxuICAgIC8vIGludmVyc2UgdHJhbnNmb3JtIGlzIGFwcGxpZWQsIHdlIGdldCB1cHBlci1sZWZ0IGNvb3JkaW5hdGUgb2YgdGhlXG4gICAgLy8gZHJhd2luZyBvciB0aGUgcm9vdCBncmFwaCBhdCBnaXZlbiBpbnB1dCBjb29yZGluYXRlIChzb21lIG1hcmdpbnNcbiAgICAvLyBhbHJlYWR5IGluY2x1ZGVkIGluIGNhbGN1bGF0aW9uIG9mIGxlZnQtdG9wKS5cblxuICAgIHZhciB0cmFucyA9IG5ldyBUcmFuc2Zvcm0oKTtcbiAgICB2YXIgbGVmdFRvcCA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKS51cGRhdGVMZWZ0VG9wKCk7XG5cbiAgICBpZiAobGVmdFRvcCAhPSBudWxsKSB7XG4gICAgICB0cmFucy5zZXRXb3JsZE9yZ1gobmV3TGVmdFRvcC54KTtcbiAgICAgIHRyYW5zLnNldFdvcmxkT3JnWShuZXdMZWZ0VG9wLnkpO1xuXG4gICAgICB0cmFucy5zZXREZXZpY2VPcmdYKGxlZnRUb3AueCk7XG4gICAgICB0cmFucy5zZXREZXZpY2VPcmdZKGxlZnRUb3AueSk7XG5cbiAgICAgIHZhciBub2RlcyA9IHRoaXMuZ2V0QWxsTm9kZXMoKTtcbiAgICAgIHZhciBub2RlO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgbm9kZS50cmFuc2Zvcm0odHJhbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuTGF5b3V0LnByb3RvdHlwZS5wb3NpdGlvbk5vZGVzUmFuZG9tbHkgPSBmdW5jdGlvbiAoZ3JhcGgpIHtcblxuICBpZiAoZ3JhcGggPT0gdW5kZWZpbmVkKSB7XG4gICAgLy9hc3NlcnQgIXRoaXMuaW5jcmVtZW50YWw7XG4gICAgdGhpcy5wb3NpdGlvbk5vZGVzUmFuZG9tbHkodGhpcy5nZXRHcmFwaE1hbmFnZXIoKS5nZXRSb290KCkpO1xuICAgIHRoaXMuZ2V0R3JhcGhNYW5hZ2VyKCkuZ2V0Um9vdCgpLnVwZGF0ZUJvdW5kcyh0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbE5vZGU7XG4gICAgdmFyIGNoaWxkR3JhcGg7XG5cbiAgICB2YXIgbm9kZXMgPSBncmFwaC5nZXROb2RlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxOb2RlID0gbm9kZXNbaV07XG4gICAgICBjaGlsZEdyYXBoID0gbE5vZGUuZ2V0Q2hpbGQoKTtcblxuICAgICAgaWYgKGNoaWxkR3JhcGggPT0gbnVsbCkge1xuICAgICAgICBsTm9kZS5zY2F0dGVyKCk7XG4gICAgICB9IGVsc2UgaWYgKGNoaWxkR3JhcGguZ2V0Tm9kZXMoKS5sZW5ndGggPT0gMCkge1xuICAgICAgICBsTm9kZS5zY2F0dGVyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvc2l0aW9uTm9kZXNSYW5kb21seShjaGlsZEdyYXBoKTtcbiAgICAgICAgbE5vZGUudXBkYXRlQm91bmRzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG4vKipcclxuICogVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgdHJlZXMgd2hlcmUgZWFjaCB0cmVlIGlzIHJlcHJlc2VudGVkIGFzIGFcclxuICogbGlzdCBvZiBsLW5vZGVzLiBUaGUgbWV0aG9kIHJldHVybnMgYSBsaXN0IG9mIHNpemUgMCB3aGVuOlxyXG4gKiAtIFRoZSBncmFwaCBpcyBub3QgZmxhdCBvclxyXG4gKiAtIE9uZSBvZiB0aGUgY29tcG9uZW50KHMpIG9mIHRoZSBncmFwaCBpcyBub3QgYSB0cmVlLlxyXG4gKi9cbkxheW91dC5wcm90b3R5cGUuZ2V0RmxhdEZvcmVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGZsYXRGb3Jlc3QgPSBbXTtcbiAgdmFyIGlzRm9yZXN0ID0gdHJ1ZTtcblxuICAvLyBRdWljayByZWZlcmVuY2UgZm9yIGFsbCBub2RlcyBpbiB0aGUgZ3JhcGggbWFuYWdlciBhc3NvY2lhdGVkIHdpdGhcbiAgLy8gdGhpcyBsYXlvdXQuIFRoZSBsaXN0IHNob3VsZCBub3QgYmUgY2hhbmdlZC5cbiAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldE5vZGVzKCk7XG5cbiAgLy8gRmlyc3QgYmUgc3VyZSB0aGF0IHRoZSBncmFwaCBpcyBmbGF0XG4gIHZhciBpc0ZsYXQgPSB0cnVlO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYWxsTm9kZXNbaV0uZ2V0Q2hpbGQoKSAhPSBudWxsKSB7XG4gICAgICBpc0ZsYXQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm4gZW1wdHkgZm9yZXN0IGlmIHRoZSBncmFwaCBpcyBub3QgZmxhdC5cbiAgaWYgKCFpc0ZsYXQpIHtcbiAgICByZXR1cm4gZmxhdEZvcmVzdDtcbiAgfVxuXG4gIC8vIFJ1biBCRlMgZm9yIGVhY2ggY29tcG9uZW50IG9mIHRoZSBncmFwaC5cblxuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIHRvQmVWaXNpdGVkID0gW107XG4gIHZhciBwYXJlbnRzID0gbmV3IE1hcCgpO1xuICB2YXIgdW5Qcm9jZXNzZWROb2RlcyA9IFtdO1xuXG4gIHVuUHJvY2Vzc2VkTm9kZXMgPSB1blByb2Nlc3NlZE5vZGVzLmNvbmNhdChhbGxOb2Rlcyk7XG5cbiAgLy8gRWFjaCBpdGVyYXRpb24gb2YgdGhpcyBsb29wIGZpbmRzIGEgY29tcG9uZW50IG9mIHRoZSBncmFwaCBhbmRcbiAgLy8gZGVjaWRlcyB3aGV0aGVyIGl0IGlzIGEgdHJlZSBvciBub3QuIElmIGl0IGlzIGEgdHJlZSwgYWRkcyBpdCB0byB0aGVcbiAgLy8gZm9yZXN0IGFuZCBjb250aW51ZWQgd2l0aCB0aGUgbmV4dCBjb21wb25lbnQuXG5cbiAgd2hpbGUgKHVuUHJvY2Vzc2VkTm9kZXMubGVuZ3RoID4gMCAmJiBpc0ZvcmVzdCkge1xuICAgIHRvQmVWaXNpdGVkLnB1c2godW5Qcm9jZXNzZWROb2Rlc1swXSk7XG5cbiAgICAvLyBTdGFydCB0aGUgQkZTLiBFYWNoIGl0ZXJhdGlvbiBvZiB0aGlzIGxvb3AgdmlzaXRzIGEgbm9kZSBpbiBhXG4gICAgLy8gQkZTIG1hbm5lci5cbiAgICB3aGlsZSAodG9CZVZpc2l0ZWQubGVuZ3RoID4gMCAmJiBpc0ZvcmVzdCkge1xuICAgICAgLy9wb29sIG9wZXJhdGlvblxuICAgICAgdmFyIGN1cnJlbnROb2RlID0gdG9CZVZpc2l0ZWRbMF07XG4gICAgICB0b0JlVmlzaXRlZC5zcGxpY2UoMCwgMSk7XG4gICAgICB2aXNpdGVkLmFkZChjdXJyZW50Tm9kZSk7XG5cbiAgICAgIC8vIFRyYXZlcnNlIGFsbCBuZWlnaGJvcnMgb2YgdGhpcyBub2RlXG4gICAgICB2YXIgbmVpZ2hib3JFZGdlcyA9IGN1cnJlbnROb2RlLmdldEVkZ2VzKCk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVpZ2hib3JFZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY3VycmVudE5laWdoYm9yID0gbmVpZ2hib3JFZGdlc1tpXS5nZXRPdGhlckVuZChjdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgLy8gSWYgQkZTIGlzIG5vdCBncm93aW5nIGZyb20gdGhpcyBuZWlnaGJvci5cbiAgICAgICAgaWYgKHBhcmVudHMuZ2V0KGN1cnJlbnROb2RlKSAhPSBjdXJyZW50TmVpZ2hib3IpIHtcbiAgICAgICAgICAvLyBXZSBoYXZlbid0IHByZXZpb3VzbHkgdmlzaXRlZCB0aGlzIG5laWdoYm9yLlxuICAgICAgICAgIGlmICghdmlzaXRlZC5oYXMoY3VycmVudE5laWdoYm9yKSkge1xuICAgICAgICAgICAgdG9CZVZpc2l0ZWQucHVzaChjdXJyZW50TmVpZ2hib3IpO1xuICAgICAgICAgICAgcGFyZW50cy5zZXQoY3VycmVudE5laWdoYm9yLCBjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFNpbmNlIHdlIGhhdmUgcHJldmlvdXNseSB2aXNpdGVkIHRoaXMgbmVpZ2hib3IgYW5kXG4gICAgICAgICAgLy8gdGhpcyBuZWlnaGJvciBpcyBub3QgcGFyZW50IG9mIGN1cnJlbnROb2RlLCBnaXZlblxuICAgICAgICAgIC8vIGdyYXBoIGNvbnRhaW5zIGEgY29tcG9uZW50IHRoYXQgaXMgbm90IHRyZWUsIGhlbmNlXG4gICAgICAgICAgLy8gaXQgaXMgbm90IGEgZm9yZXN0LlxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBpc0ZvcmVzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBncmFwaCBjb250YWlucyBhIGNvbXBvbmVudCB0aGF0IGlzIG5vdCBhIHRyZWUuIEVtcHR5XG4gICAgLy8gcHJldmlvdXNseSBmb3VuZCB0cmVlcy4gVGhlIG1ldGhvZCB3aWxsIGVuZC5cbiAgICBpZiAoIWlzRm9yZXN0KSB7XG4gICAgICBmbGF0Rm9yZXN0ID0gW107XG4gICAgfVxuICAgIC8vIFNhdmUgY3VycmVudGx5IHZpc2l0ZWQgbm9kZXMgYXMgYSB0cmVlIGluIG91ciBmb3Jlc3QuIFJlc2V0XG4gICAgLy8gdmlzaXRlZCBhbmQgcGFyZW50cyBsaXN0cy4gQ29udGludWUgd2l0aCB0aGUgbmV4dCBjb21wb25lbnQgb2ZcbiAgICAvLyB0aGUgZ3JhcGgsIGlmIGFueS5cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIHRlbXAgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHZpc2l0ZWQpKTtcbiAgICAgICAgZmxhdEZvcmVzdC5wdXNoKHRlbXApO1xuICAgICAgICAvL2ZsYXRGb3Jlc3QgPSBmbGF0Rm9yZXN0LmNvbmNhdCh0ZW1wKTtcbiAgICAgICAgLy91blByb2Nlc3NlZE5vZGVzLnJlbW92ZUFsbCh2aXNpdGVkKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZW1wLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gdGVtcFtpXTtcbiAgICAgICAgICB2YXIgaW5kZXggPSB1blByb2Nlc3NlZE5vZGVzLmluZGV4T2YodmFsdWUpO1xuICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB1blByb2Nlc3NlZE5vZGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgIHBhcmVudHMgPSBuZXcgTWFwKCk7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gZmxhdEZvcmVzdDtcbn07XG5cbi8qKlxyXG4gKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGR1bW15IG5vZGVzIChhbiBsLWxldmVsIG5vZGUgd2l0aCBtaW5pbWFsIGRpbWVuc2lvbnMpXHJcbiAqIGZvciB0aGUgZ2l2ZW4gZWRnZSAob25lIHBlciBiZW5kcG9pbnQpLiBUaGUgZXhpc3RpbmcgbC1sZXZlbCBzdHJ1Y3R1cmVcclxuICogaXMgdXBkYXRlZCBhY2NvcmRpbmdseS5cclxuICovXG5MYXlvdXQucHJvdG90eXBlLmNyZWF0ZUR1bW15Tm9kZXNGb3JCZW5kcG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIGR1bW15Tm9kZXMgPSBbXTtcbiAgdmFyIHByZXYgPSBlZGdlLnNvdXJjZTtcblxuICB2YXIgZ3JhcGggPSB0aGlzLmdyYXBoTWFuYWdlci5jYWxjTG93ZXN0Q29tbW9uQW5jZXN0b3IoZWRnZS5zb3VyY2UsIGVkZ2UudGFyZ2V0KTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2UuYmVuZHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgIC8vIGNyZWF0ZSBuZXcgZHVtbXkgbm9kZVxuICAgIHZhciBkdW1teU5vZGUgPSB0aGlzLm5ld05vZGUobnVsbCk7XG4gICAgZHVtbXlOb2RlLnNldFJlY3QobmV3IFBvaW50KDAsIDApLCBuZXcgRGltZW5zaW9uKDEsIDEpKTtcblxuICAgIGdyYXBoLmFkZChkdW1teU5vZGUpO1xuXG4gICAgLy8gY3JlYXRlIG5ldyBkdW1teSBlZGdlIGJldHdlZW4gcHJldiBhbmQgZHVtbXkgbm9kZVxuICAgIHZhciBkdW1teUVkZ2UgPSB0aGlzLm5ld0VkZ2UobnVsbCk7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIuYWRkKGR1bW15RWRnZSwgcHJldiwgZHVtbXlOb2RlKTtcblxuICAgIGR1bW15Tm9kZXMuYWRkKGR1bW15Tm9kZSk7XG4gICAgcHJldiA9IGR1bW15Tm9kZTtcbiAgfVxuXG4gIHZhciBkdW1teUVkZ2UgPSB0aGlzLm5ld0VkZ2UobnVsbCk7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLmFkZChkdW1teUVkZ2UsIHByZXYsIGVkZ2UudGFyZ2V0KTtcblxuICB0aGlzLmVkZ2VUb0R1bW15Tm9kZXMuc2V0KGVkZ2UsIGR1bW15Tm9kZXMpO1xuXG4gIC8vIHJlbW92ZSByZWFsIGVkZ2UgZnJvbSBncmFwaCBtYW5hZ2VyIGlmIGl0IGlzIGludGVyLWdyYXBoXG4gIGlmIChlZGdlLmlzSW50ZXJHcmFwaCgpKSB7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIucmVtb3ZlKGVkZ2UpO1xuICB9XG4gIC8vIGVsc2UsIHJlbW92ZSB0aGUgZWRnZSBmcm9tIHRoZSBjdXJyZW50IGdyYXBoXG4gIGVsc2Uge1xuICAgICAgZ3JhcGgucmVtb3ZlKGVkZ2UpO1xuICAgIH1cblxuICByZXR1cm4gZHVtbXlOb2Rlcztcbn07XG5cbi8qKlxyXG4gKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGJlbmRwb2ludHMgZm9yIGVkZ2VzIGZyb20gdGhlIGR1bW15IG5vZGVzXHJcbiAqIGF0IGwtbGV2ZWwuXHJcbiAqL1xuTGF5b3V0LnByb3RvdHlwZS5jcmVhdGVCZW5kcG9pbnRzRnJvbUR1bW15Tm9kZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlZGdlcyA9IFtdO1xuICBlZGdlcyA9IGVkZ2VzLmNvbmNhdCh0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxFZGdlcygpKTtcbiAgZWRnZXMgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHRoaXMuZWRnZVRvRHVtbXlOb2Rlcy5rZXlzKCkpKS5jb25jYXQoZWRnZXMpO1xuXG4gIGZvciAodmFyIGsgPSAwOyBrIDwgZWRnZXMubGVuZ3RoOyBrKyspIHtcbiAgICB2YXIgbEVkZ2UgPSBlZGdlc1trXTtcblxuICAgIGlmIChsRWRnZS5iZW5kcG9pbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBwYXRoID0gdGhpcy5lZGdlVG9EdW1teU5vZGVzLmdldChsRWRnZSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZHVtbXlOb2RlID0gcGF0aFtpXTtcbiAgICAgICAgdmFyIHAgPSBuZXcgUG9pbnREKGR1bW15Tm9kZS5nZXRDZW50ZXJYKCksIGR1bW15Tm9kZS5nZXRDZW50ZXJZKCkpO1xuXG4gICAgICAgIC8vIHVwZGF0ZSBiZW5kcG9pbnQncyBsb2NhdGlvbiBhY2NvcmRpbmcgdG8gZHVtbXkgbm9kZVxuICAgICAgICB2YXIgZWJwID0gbEVkZ2UuYmVuZHBvaW50cy5nZXQoaSk7XG4gICAgICAgIGVicC54ID0gcC54O1xuICAgICAgICBlYnAueSA9IHAueTtcblxuICAgICAgICAvLyByZW1vdmUgdGhlIGR1bW15IG5vZGUsIGR1bW15IGVkZ2VzIGluY2lkZW50IHdpdGggdGhpc1xuICAgICAgICAvLyBkdW1teSBub2RlIGlzIGFsc28gcmVtb3ZlZCAod2l0aGluIHRoZSByZW1vdmUgbWV0aG9kKVxuICAgICAgICBkdW1teU5vZGUuZ2V0T3duZXIoKS5yZW1vdmUoZHVtbXlOb2RlKTtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIHRoZSByZWFsIGVkZ2UgdG8gZ3JhcGhcbiAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLmFkZChsRWRnZSwgbEVkZ2Uuc291cmNlLCBsRWRnZS50YXJnZXQpO1xuICAgIH1cbiAgfVxufTtcblxuTGF5b3V0LnRyYW5zZm9ybSA9IGZ1bmN0aW9uIChzbGlkZXJWYWx1ZSwgZGVmYXVsdFZhbHVlLCBtaW5EaXYsIG1heE11bCkge1xuICBpZiAobWluRGl2ICE9IHVuZGVmaW5lZCAmJiBtYXhNdWwgIT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHZhbHVlID0gZGVmYXVsdFZhbHVlO1xuXG4gICAgaWYgKHNsaWRlclZhbHVlIDw9IDUwKSB7XG4gICAgICB2YXIgbWluVmFsdWUgPSBkZWZhdWx0VmFsdWUgLyBtaW5EaXY7XG4gICAgICB2YWx1ZSAtPSAoZGVmYXVsdFZhbHVlIC0gbWluVmFsdWUpIC8gNTAgKiAoNTAgLSBzbGlkZXJWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBtYXhWYWx1ZSA9IGRlZmF1bHRWYWx1ZSAqIG1heE11bDtcbiAgICAgIHZhbHVlICs9IChtYXhWYWx1ZSAtIGRlZmF1bHRWYWx1ZSkgLyA1MCAqIChzbGlkZXJWYWx1ZSAtIDUwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGEsIGI7XG5cbiAgICBpZiAoc2xpZGVyVmFsdWUgPD0gNTApIHtcbiAgICAgIGEgPSA5LjAgKiBkZWZhdWx0VmFsdWUgLyA1MDAuMDtcbiAgICAgIGIgPSBkZWZhdWx0VmFsdWUgLyAxMC4wO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gOS4wICogZGVmYXVsdFZhbHVlIC8gNTAuMDtcbiAgICAgIGIgPSAtOCAqIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYSAqIHNsaWRlclZhbHVlICsgYjtcbiAgfVxufTtcblxuLyoqXHJcbiAqIFRoaXMgbWV0aG9kIGZpbmRzIGFuZCByZXR1cm5zIHRoZSBjZW50ZXIgb2YgdGhlIGdpdmVuIG5vZGVzLCBhc3N1bWluZ1xyXG4gKiB0aGF0IHRoZSBnaXZlbiBub2RlcyBmb3JtIGEgdHJlZSBpbiB0aGVtc2VsdmVzLlxyXG4gKi9cbkxheW91dC5maW5kQ2VudGVyT2ZUcmVlID0gZnVuY3Rpb24gKG5vZGVzKSB7XG4gIHZhciBsaXN0ID0gW107XG4gIGxpc3QgPSBsaXN0LmNvbmNhdChub2Rlcyk7XG5cbiAgdmFyIHJlbW92ZWROb2RlcyA9IFtdO1xuICB2YXIgcmVtYWluaW5nRGVncmVlcyA9IG5ldyBNYXAoKTtcbiAgdmFyIGZvdW5kQ2VudGVyID0gZmFsc2U7XG4gIHZhciBjZW50ZXJOb2RlID0gbnVsbDtcblxuICBpZiAobGlzdC5sZW5ndGggPT0gMSB8fCBsaXN0Lmxlbmd0aCA9PSAyKSB7XG4gICAgZm91bmRDZW50ZXIgPSB0cnVlO1xuICAgIGNlbnRlck5vZGUgPSBsaXN0WzBdO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBsaXN0W2ldO1xuICAgIHZhciBkZWdyZWUgPSBub2RlLmdldE5laWdoYm9yc0xpc3QoKS5zaXplO1xuICAgIHJlbWFpbmluZ0RlZ3JlZXMuc2V0KG5vZGUsIG5vZGUuZ2V0TmVpZ2hib3JzTGlzdCgpLnNpemUpO1xuXG4gICAgaWYgKGRlZ3JlZSA9PSAxKSB7XG4gICAgICByZW1vdmVkTm9kZXMucHVzaChub2RlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgdGVtcExpc3QgPSBbXTtcbiAgdGVtcExpc3QgPSB0ZW1wTGlzdC5jb25jYXQocmVtb3ZlZE5vZGVzKTtcblxuICB3aGlsZSAoIWZvdW5kQ2VudGVyKSB7XG4gICAgdmFyIHRlbXBMaXN0MiA9IFtdO1xuICAgIHRlbXBMaXN0MiA9IHRlbXBMaXN0Mi5jb25jYXQodGVtcExpc3QpO1xuICAgIHRlbXBMaXN0ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gbGlzdFtpXTtcblxuICAgICAgdmFyIGluZGV4ID0gbGlzdC5pbmRleE9mKG5vZGUpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgbGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmVpZ2hib3VycyA9IG5vZGUuZ2V0TmVpZ2hib3JzTGlzdCgpO1xuXG4gICAgICBuZWlnaGJvdXJzLmZvckVhY2goZnVuY3Rpb24gKG5laWdoYm91cikge1xuICAgICAgICBpZiAocmVtb3ZlZE5vZGVzLmluZGV4T2YobmVpZ2hib3VyKSA8IDApIHtcbiAgICAgICAgICB2YXIgb3RoZXJEZWdyZWUgPSByZW1haW5pbmdEZWdyZWVzLmdldChuZWlnaGJvdXIpO1xuICAgICAgICAgIHZhciBuZXdEZWdyZWUgPSBvdGhlckRlZ3JlZSAtIDE7XG5cbiAgICAgICAgICBpZiAobmV3RGVncmVlID09IDEpIHtcbiAgICAgICAgICAgIHRlbXBMaXN0LnB1c2gobmVpZ2hib3VyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZW1haW5pbmdEZWdyZWVzLnNldChuZWlnaGJvdXIsIG5ld0RlZ3JlZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbW92ZWROb2RlcyA9IHJlbW92ZWROb2Rlcy5jb25jYXQodGVtcExpc3QpO1xuXG4gICAgaWYgKGxpc3QubGVuZ3RoID09IDEgfHwgbGlzdC5sZW5ndGggPT0gMikge1xuICAgICAgZm91bmRDZW50ZXIgPSB0cnVlO1xuICAgICAgY2VudGVyTm9kZSA9IGxpc3RbMF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNlbnRlck5vZGU7XG59O1xuXG4vKipcclxuICogRHVyaW5nIHRoZSBjb2Fyc2VuaW5nIHByb2Nlc3MsIHRoaXMgbGF5b3V0IG1heSBiZSByZWZlcmVuY2VkIGJ5IHR3byBncmFwaCBtYW5hZ2Vyc1xyXG4gKiB0aGlzIHNldHRlciBmdW5jdGlvbiBncmFudHMgYWNjZXNzIHRvIGNoYW5nZSB0aGUgY3VycmVudGx5IGJlaW5nIHVzZWQgZ3JhcGggbWFuYWdlclxyXG4gKi9cbkxheW91dC5wcm90b3R5cGUuc2V0R3JhcGhNYW5hZ2VyID0gZnVuY3Rpb24gKGdtKSB7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyID0gZ207XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IExheW91dDtcblxuLyoqKi8gfSksXG4vKiAxNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBSYW5kb21TZWVkKCkge31cbi8vIGFkYXB0ZWQgZnJvbTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE5MzAzNzI1XG5SYW5kb21TZWVkLnNlZWQgPSAxO1xuUmFuZG9tU2VlZC54ID0gMDtcblxuUmFuZG9tU2VlZC5uZXh0RG91YmxlID0gZnVuY3Rpb24gKCkge1xuICBSYW5kb21TZWVkLnggPSBNYXRoLnNpbihSYW5kb21TZWVkLnNlZWQrKykgKiAxMDAwMDtcbiAgcmV0dXJuIFJhbmRvbVNlZWQueCAtIE1hdGguZmxvb3IoUmFuZG9tU2VlZC54KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmFuZG9tU2VlZDtcblxuLyoqKi8gfSksXG4vKiAxNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgUG9pbnREID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblxuZnVuY3Rpb24gVHJhbnNmb3JtKHgsIHkpIHtcbiAgdGhpcy5sd29ybGRPcmdYID0gMC4wO1xuICB0aGlzLmx3b3JsZE9yZ1kgPSAwLjA7XG4gIHRoaXMubGRldmljZU9yZ1ggPSAwLjA7XG4gIHRoaXMubGRldmljZU9yZ1kgPSAwLjA7XG4gIHRoaXMubHdvcmxkRXh0WCA9IDEuMDtcbiAgdGhpcy5sd29ybGRFeHRZID0gMS4wO1xuICB0aGlzLmxkZXZpY2VFeHRYID0gMS4wO1xuICB0aGlzLmxkZXZpY2VFeHRZID0gMS4wO1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldFdvcmxkT3JnWCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubHdvcmxkT3JnWDtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0V29ybGRPcmdYID0gZnVuY3Rpb24gKHdveCkge1xuICB0aGlzLmx3b3JsZE9yZ1ggPSB3b3g7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldFdvcmxkT3JnWSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubHdvcmxkT3JnWTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0V29ybGRPcmdZID0gZnVuY3Rpb24gKHdveSkge1xuICB0aGlzLmx3b3JsZE9yZ1kgPSB3b3k7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldFdvcmxkRXh0WCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubHdvcmxkRXh0WDtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0V29ybGRFeHRYID0gZnVuY3Rpb24gKHdleCkge1xuICB0aGlzLmx3b3JsZEV4dFggPSB3ZXg7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldFdvcmxkRXh0WSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubHdvcmxkRXh0WTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0V29ybGRFeHRZID0gZnVuY3Rpb24gKHdleSkge1xuICB0aGlzLmx3b3JsZEV4dFkgPSB3ZXk7XG59O1xuXG4vKiBEZXZpY2UgcmVsYXRlZCAqL1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldERldmljZU9yZ1ggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxkZXZpY2VPcmdYO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5zZXREZXZpY2VPcmdYID0gZnVuY3Rpb24gKGRveCkge1xuICB0aGlzLmxkZXZpY2VPcmdYID0gZG94O1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5nZXREZXZpY2VPcmdZID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5sZGV2aWNlT3JnWTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0RGV2aWNlT3JnWSA9IGZ1bmN0aW9uIChkb3kpIHtcbiAgdGhpcy5sZGV2aWNlT3JnWSA9IGRveTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuZ2V0RGV2aWNlRXh0WCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubGRldmljZUV4dFg7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnNldERldmljZUV4dFggPSBmdW5jdGlvbiAoZGV4KSB7XG4gIHRoaXMubGRldmljZUV4dFggPSBkZXg7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldERldmljZUV4dFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxkZXZpY2VFeHRZO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5zZXREZXZpY2VFeHRZID0gZnVuY3Rpb24gKGRleSkge1xuICB0aGlzLmxkZXZpY2VFeHRZID0gZGV5O1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS50cmFuc2Zvcm1YID0gZnVuY3Rpb24gKHgpIHtcbiAgdmFyIHhEZXZpY2UgPSAwLjA7XG4gIHZhciB3b3JsZEV4dFggPSB0aGlzLmx3b3JsZEV4dFg7XG4gIGlmICh3b3JsZEV4dFggIT0gMC4wKSB7XG4gICAgeERldmljZSA9IHRoaXMubGRldmljZU9yZ1ggKyAoeCAtIHRoaXMubHdvcmxkT3JnWCkgKiB0aGlzLmxkZXZpY2VFeHRYIC8gd29ybGRFeHRYO1xuICB9XG5cbiAgcmV0dXJuIHhEZXZpY2U7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnRyYW5zZm9ybVkgPSBmdW5jdGlvbiAoeSkge1xuICB2YXIgeURldmljZSA9IDAuMDtcbiAgdmFyIHdvcmxkRXh0WSA9IHRoaXMubHdvcmxkRXh0WTtcbiAgaWYgKHdvcmxkRXh0WSAhPSAwLjApIHtcbiAgICB5RGV2aWNlID0gdGhpcy5sZGV2aWNlT3JnWSArICh5IC0gdGhpcy5sd29ybGRPcmdZKSAqIHRoaXMubGRldmljZUV4dFkgLyB3b3JsZEV4dFk7XG4gIH1cblxuICByZXR1cm4geURldmljZTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuaW52ZXJzZVRyYW5zZm9ybVggPSBmdW5jdGlvbiAoeCkge1xuICB2YXIgeFdvcmxkID0gMC4wO1xuICB2YXIgZGV2aWNlRXh0WCA9IHRoaXMubGRldmljZUV4dFg7XG4gIGlmIChkZXZpY2VFeHRYICE9IDAuMCkge1xuICAgIHhXb3JsZCA9IHRoaXMubHdvcmxkT3JnWCArICh4IC0gdGhpcy5sZGV2aWNlT3JnWCkgKiB0aGlzLmx3b3JsZEV4dFggLyBkZXZpY2VFeHRYO1xuICB9XG5cbiAgcmV0dXJuIHhXb3JsZDtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuaW52ZXJzZVRyYW5zZm9ybVkgPSBmdW5jdGlvbiAoeSkge1xuICB2YXIgeVdvcmxkID0gMC4wO1xuICB2YXIgZGV2aWNlRXh0WSA9IHRoaXMubGRldmljZUV4dFk7XG4gIGlmIChkZXZpY2VFeHRZICE9IDAuMCkge1xuICAgIHlXb3JsZCA9IHRoaXMubHdvcmxkT3JnWSArICh5IC0gdGhpcy5sZGV2aWNlT3JnWSkgKiB0aGlzLmx3b3JsZEV4dFkgLyBkZXZpY2VFeHRZO1xuICB9XG4gIHJldHVybiB5V29ybGQ7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmludmVyc2VUcmFuc2Zvcm1Qb2ludCA9IGZ1bmN0aW9uIChpblBvaW50KSB7XG4gIHZhciBvdXRQb2ludCA9IG5ldyBQb2ludEQodGhpcy5pbnZlcnNlVHJhbnNmb3JtWChpblBvaW50LngpLCB0aGlzLmludmVyc2VUcmFuc2Zvcm1ZKGluUG9pbnQueSkpO1xuICByZXR1cm4gb3V0UG9pbnQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxuLyoqKi8gfSksXG4vKiAxOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IGVsc2UgeyByZXR1cm4gQXJyYXkuZnJvbShhcnIpOyB9IH1cblxudmFyIExheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpO1xudmFyIEZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIElHZW9tZXRyeSA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7XG52YXIgSU1hdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXG5mdW5jdGlvbiBGRExheW91dCgpIHtcbiAgTGF5b3V0LmNhbGwodGhpcyk7XG5cbiAgdGhpcy51c2VTbWFydElkZWFsRWRnZUxlbmd0aENhbGN1bGF0aW9uID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9VU0VfU01BUlRfSURFQUxfRURHRV9MRU5HVEhfQ0FMQ1VMQVRJT047XG4gIHRoaXMuZ3Jhdml0eUNvbnN0YW50ID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1NUUkVOR1RIO1xuICB0aGlzLmNvbXBvdW5kR3Jhdml0eUNvbnN0YW50ID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1NUUkVOR1RIO1xuICB0aGlzLmdyYXZpdHlSYW5nZUZhY3RvciA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9SQU5HRV9GQUNUT1I7XG4gIHRoaXMuY29tcG91bmRHcmF2aXR5UmFuZ2VGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfUkFOR0VfRkFDVE9SO1xuICB0aGlzLmRpc3BsYWNlbWVudFRocmVzaG9sZFBlck5vZGUgPSAzLjAgKiBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIC8gMTAwO1xuICB0aGlzLmNvb2xpbmdGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMO1xuICB0aGlzLmluaXRpYWxDb29saW5nRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTDtcbiAgdGhpcy50b3RhbERpc3BsYWNlbWVudCA9IDAuMDtcbiAgdGhpcy5vbGRUb3RhbERpc3BsYWNlbWVudCA9IDAuMDtcbiAgdGhpcy5tYXhJdGVyYXRpb25zID0gRkRMYXlvdXRDb25zdGFudHMuTUFYX0lURVJBVElPTlM7XG59XG5cbkZETGF5b3V0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTGF5b3V0LnByb3RvdHlwZSk7XG5cbmZvciAodmFyIHByb3AgaW4gTGF5b3V0KSB7XG4gIEZETGF5b3V0W3Byb3BdID0gTGF5b3V0W3Byb3BdO1xufVxuXG5GRExheW91dC5wcm90b3R5cGUuaW5pdFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7XG4gIExheW91dC5wcm90b3R5cGUuaW5pdFBhcmFtZXRlcnMuY2FsbCh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIHRoaXMudG90YWxJdGVyYXRpb25zID0gMDtcbiAgdGhpcy5ub3RBbmltYXRlZEl0ZXJhdGlvbnMgPSAwO1xuXG4gIHRoaXMudXNlRlJHcmlkVmFyaWFudCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfVVNFX1NNQVJUX1JFUFVMU0lPTl9SQU5HRV9DQUxDVUxBVElPTjtcblxuICB0aGlzLmdyaWQgPSBbXTtcbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjSWRlYWxFZGdlTGVuZ3RocyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVkZ2U7XG4gIHZhciBvcmlnaW5hbElkZWFsTGVuZ3RoO1xuICB2YXIgbGNhRGVwdGg7XG4gIHZhciBzb3VyY2U7XG4gIHZhciB0YXJnZXQ7XG4gIHZhciBzaXplT2ZTb3VyY2VJbkxjYTtcbiAgdmFyIHNpemVPZlRhcmdldEluTGNhO1xuXG4gIHZhciBhbGxFZGdlcyA9IHRoaXMuZ2V0R3JhcGhNYW5hZ2VyKCkuZ2V0QWxsRWRnZXMoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxFZGdlcy5sZW5ndGg7IGkrKykge1xuICAgIGVkZ2UgPSBhbGxFZGdlc1tpXTtcblxuICAgIG9yaWdpbmFsSWRlYWxMZW5ndGggPSBlZGdlLmlkZWFsTGVuZ3RoO1xuXG4gICAgaWYgKGVkZ2UuaXNJbnRlckdyYXBoKSB7XG4gICAgICBzb3VyY2UgPSBlZGdlLmdldFNvdXJjZSgpO1xuICAgICAgdGFyZ2V0ID0gZWRnZS5nZXRUYXJnZXQoKTtcblxuICAgICAgc2l6ZU9mU291cmNlSW5MY2EgPSBlZGdlLmdldFNvdXJjZUluTGNhKCkuZ2V0RXN0aW1hdGVkU2l6ZSgpO1xuICAgICAgc2l6ZU9mVGFyZ2V0SW5MY2EgPSBlZGdlLmdldFRhcmdldEluTGNhKCkuZ2V0RXN0aW1hdGVkU2l6ZSgpO1xuXG4gICAgICBpZiAodGhpcy51c2VTbWFydElkZWFsRWRnZUxlbmd0aENhbGN1bGF0aW9uKSB7XG4gICAgICAgIGVkZ2UuaWRlYWxMZW5ndGggKz0gc2l6ZU9mU291cmNlSW5MY2EgKyBzaXplT2ZUYXJnZXRJbkxjYSAtIDIgKiBMYXlvdXRDb25zdGFudHMuU0lNUExFX05PREVfU0laRTtcbiAgICAgIH1cblxuICAgICAgbGNhRGVwdGggPSBlZGdlLmdldExjYSgpLmdldEluY2x1c2lvblRyZWVEZXB0aCgpO1xuXG4gICAgICBlZGdlLmlkZWFsTGVuZ3RoICs9IG9yaWdpbmFsSWRlYWxMZW5ndGggKiBGRExheW91dENvbnN0YW50cy5QRVJfTEVWRUxfSURFQUxfRURHRV9MRU5HVEhfRkFDVE9SICogKHNvdXJjZS5nZXRJbmNsdXNpb25UcmVlRGVwdGgoKSArIHRhcmdldC5nZXRJbmNsdXNpb25UcmVlRGVwdGgoKSAtIDIgKiBsY2FEZXB0aCk7XG4gICAgfVxuICB9XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuaW5pdFNwcmluZ0VtYmVkZGVyID0gZnVuY3Rpb24gKCkge1xuXG4gIHZhciBzID0gdGhpcy5nZXRBbGxOb2RlcygpLmxlbmd0aDtcbiAgaWYgKHRoaXMuaW5jcmVtZW50YWwpIHtcbiAgICBpZiAocyA+IEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fTE9XRVJfTk9ERV9MSU1JVCkge1xuICAgICAgdGhpcy5jb29saW5nRmFjdG9yID0gTWF0aC5tYXgodGhpcy5jb29saW5nRmFjdG9yICogRkRMYXlvdXRDb25zdGFudHMuQ09PTElOR19BREFQVEFUSU9OX0ZBQ1RPUiwgdGhpcy5jb29saW5nRmFjdG9yIC0gKHMgLSBGRExheW91dENvbnN0YW50cy5BREFQVEFUSU9OX0xPV0VSX05PREVfTElNSVQpIC8gKEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fVVBQRVJfTk9ERV9MSU1JVCAtIEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fTE9XRVJfTk9ERV9MSU1JVCkgKiB0aGlzLmNvb2xpbmdGYWN0b3IgKiAoMSAtIEZETGF5b3V0Q29uc3RhbnRzLkNPT0xJTkdfQURBUFRBVElPTl9GQUNUT1IpKTtcbiAgICB9XG4gICAgdGhpcy5tYXhOb2RlRGlzcGxhY2VtZW50ID0gRkRMYXlvdXRDb25zdGFudHMuTUFYX05PREVfRElTUExBQ0VNRU5UX0lOQ1JFTUVOVEFMO1xuICB9IGVsc2Uge1xuICAgIGlmIChzID4gRkRMYXlvdXRDb25zdGFudHMuQURBUFRBVElPTl9MT1dFUl9OT0RFX0xJTUlUKSB7XG4gICAgICB0aGlzLmNvb2xpbmdGYWN0b3IgPSBNYXRoLm1heChGRExheW91dENvbnN0YW50cy5DT09MSU5HX0FEQVBUQVRJT05fRkFDVE9SLCAxLjAgLSAocyAtIEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fTE9XRVJfTk9ERV9MSU1JVCkgLyAoRkRMYXlvdXRDb25zdGFudHMuQURBUFRBVElPTl9VUFBFUl9OT0RFX0xJTUlUIC0gRkRMYXlvdXRDb25zdGFudHMuQURBUFRBVElPTl9MT1dFUl9OT0RFX0xJTUlUKSAqICgxIC0gRkRMYXlvdXRDb25zdGFudHMuQ09PTElOR19BREFQVEFUSU9OX0ZBQ1RPUikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvb2xpbmdGYWN0b3IgPSAxLjA7XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbENvb2xpbmdGYWN0b3IgPSB0aGlzLmNvb2xpbmdGYWN0b3I7XG4gICAgdGhpcy5tYXhOb2RlRGlzcGxhY2VtZW50ID0gRkRMYXlvdXRDb25zdGFudHMuTUFYX05PREVfRElTUExBQ0VNRU5UO1xuICB9XG5cbiAgdGhpcy5tYXhJdGVyYXRpb25zID0gTWF0aC5tYXgodGhpcy5nZXRBbGxOb2RlcygpLmxlbmd0aCAqIDUsIHRoaXMubWF4SXRlcmF0aW9ucyk7XG5cbiAgLy8gUmVhc3NpZ24gdGhpcyBhdHRyaWJ1dGUgYnkgdXNpbmcgbmV3IGNvbnN0YW50IHZhbHVlXG4gIHRoaXMuZGlzcGxhY2VtZW50VGhyZXNob2xkUGVyTm9kZSA9IDMuMCAqIEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggLyAxMDA7XG4gIHRoaXMudG90YWxEaXNwbGFjZW1lbnRUaHJlc2hvbGQgPSB0aGlzLmRpc3BsYWNlbWVudFRocmVzaG9sZFBlck5vZGUgKiB0aGlzLmdldEFsbE5vZGVzKCkubGVuZ3RoO1xuXG4gIHRoaXMucmVwdWxzaW9uUmFuZ2UgPSB0aGlzLmNhbGNSZXB1bHNpb25SYW5nZSgpO1xufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLmNhbGNTcHJpbmdGb3JjZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsRWRnZXMgPSB0aGlzLmdldEFsbEVkZ2VzKCk7XG4gIHZhciBlZGdlO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbEVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgZWRnZSA9IGxFZGdlc1tpXTtcblxuICAgIHRoaXMuY2FsY1NwcmluZ0ZvcmNlKGVkZ2UsIGVkZ2UuaWRlYWxMZW5ndGgpO1xuICB9XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuY2FsY1JlcHVsc2lvbkZvcmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGdyaWRVcGRhdGVBbGxvd2VkID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuICB2YXIgZm9yY2VUb05vZGVTdXJyb3VuZGluZ1VwZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgdmFyIGksIGo7XG4gIHZhciBub2RlQSwgbm9kZUI7XG4gIHZhciBsTm9kZXMgPSB0aGlzLmdldEFsbE5vZGVzKCk7XG4gIHZhciBwcm9jZXNzZWROb2RlU2V0O1xuXG4gIGlmICh0aGlzLnVzZUZSR3JpZFZhcmlhbnQpIHtcbiAgICBpZiAodGhpcy50b3RhbEl0ZXJhdGlvbnMgJSBGRExheW91dENvbnN0YW50cy5HUklEX0NBTENVTEFUSU9OX0NIRUNLX1BFUklPRCA9PSAxICYmIGdyaWRVcGRhdGVBbGxvd2VkKSB7XG4gICAgICB0aGlzLnVwZGF0ZUdyaWQoKTtcbiAgICB9XG5cbiAgICBwcm9jZXNzZWROb2RlU2V0ID0gbmV3IFNldCgpO1xuXG4gICAgLy8gY2FsY3VsYXRlIHJlcHVsc2lvbiBmb3JjZXMgYmV0d2VlbiBlYWNoIG5vZGVzIGFuZCBpdHMgc3Vycm91bmRpbmdcbiAgICBmb3IgKGkgPSAwOyBpIDwgbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBub2RlQSA9IGxOb2Rlc1tpXTtcbiAgICAgIHRoaXMuY2FsY3VsYXRlUmVwdWxzaW9uRm9yY2VPZkFOb2RlKG5vZGVBLCBwcm9jZXNzZWROb2RlU2V0LCBncmlkVXBkYXRlQWxsb3dlZCwgZm9yY2VUb05vZGVTdXJyb3VuZGluZ1VwZGF0ZSk7XG4gICAgICBwcm9jZXNzZWROb2RlU2V0LmFkZChub2RlQSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoaSA9IDA7IGkgPCBsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5vZGVBID0gbE5vZGVzW2ldO1xuXG4gICAgICBmb3IgKGogPSBpICsgMTsgaiA8IGxOb2Rlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBub2RlQiA9IGxOb2Rlc1tqXTtcblxuICAgICAgICAvLyBJZiBib3RoIG5vZGVzIGFyZSBub3QgbWVtYmVycyBvZiB0aGUgc2FtZSBncmFwaCwgc2tpcC5cbiAgICAgICAgaWYgKG5vZGVBLmdldE93bmVyKCkgIT0gbm9kZUIuZ2V0T3duZXIoKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxjUmVwdWxzaW9uRm9yY2Uobm9kZUEsIG5vZGVCKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjR3Jhdml0YXRpb25hbEZvcmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5vZGU7XG4gIHZhciBsTm9kZXMgPSB0aGlzLmdldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBub2RlID0gbE5vZGVzW2ldO1xuICAgIHRoaXMuY2FsY0dyYXZpdGF0aW9uYWxGb3JjZShub2RlKTtcbiAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLm1vdmVOb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGxOb2RlcyA9IHRoaXMuZ2V0QWxsTm9kZXMoKTtcbiAgdmFyIG5vZGU7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBub2RlID0gbE5vZGVzW2ldO1xuICAgIG5vZGUubW92ZSgpO1xuICB9XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuY2FsY1NwcmluZ0ZvcmNlID0gZnVuY3Rpb24gKGVkZ2UsIGlkZWFsTGVuZ3RoKSB7XG4gIHZhciBzb3VyY2VOb2RlID0gZWRnZS5nZXRTb3VyY2UoKTtcbiAgdmFyIHRhcmdldE5vZGUgPSBlZGdlLmdldFRhcmdldCgpO1xuXG4gIHZhciBsZW5ndGg7XG4gIHZhciBzcHJpbmdGb3JjZTtcbiAgdmFyIHNwcmluZ0ZvcmNlWDtcbiAgdmFyIHNwcmluZ0ZvcmNlWTtcblxuICAvLyBVcGRhdGUgZWRnZSBsZW5ndGhcbiAgaWYgKHRoaXMudW5pZm9ybUxlYWZOb2RlU2l6ZXMgJiYgc291cmNlTm9kZS5nZXRDaGlsZCgpID09IG51bGwgJiYgdGFyZ2V0Tm9kZS5nZXRDaGlsZCgpID09IG51bGwpIHtcbiAgICBlZGdlLnVwZGF0ZUxlbmd0aFNpbXBsZSgpO1xuICB9IGVsc2Uge1xuICAgIGVkZ2UudXBkYXRlTGVuZ3RoKCk7XG5cbiAgICBpZiAoZWRnZS5pc092ZXJsYXBpbmdTb3VyY2VBbmRUYXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBsZW5ndGggPSBlZGdlLmdldExlbmd0aCgpO1xuXG4gIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuO1xuXG4gIC8vIENhbGN1bGF0ZSBzcHJpbmcgZm9yY2VzXG4gIHNwcmluZ0ZvcmNlID0gZWRnZS5lZGdlRWxhc3RpY2l0eSAqIChsZW5ndGggLSBpZGVhbExlbmd0aCk7XG5cbiAgLy8gUHJvamVjdCBmb3JjZSBvbnRvIHggYW5kIHkgYXhlc1xuICBzcHJpbmdGb3JjZVggPSBzcHJpbmdGb3JjZSAqIChlZGdlLmxlbmd0aFggLyBsZW5ndGgpO1xuICBzcHJpbmdGb3JjZVkgPSBzcHJpbmdGb3JjZSAqIChlZGdlLmxlbmd0aFkgLyBsZW5ndGgpO1xuXG4gIC8vIEFwcGx5IGZvcmNlcyBvbiB0aGUgZW5kIG5vZGVzXG4gIHNvdXJjZU5vZGUuc3ByaW5nRm9yY2VYICs9IHNwcmluZ0ZvcmNlWDtcbiAgc291cmNlTm9kZS5zcHJpbmdGb3JjZVkgKz0gc3ByaW5nRm9yY2VZO1xuICB0YXJnZXROb2RlLnNwcmluZ0ZvcmNlWCAtPSBzcHJpbmdGb3JjZVg7XG4gIHRhcmdldE5vZGUuc3ByaW5nRm9yY2VZIC09IHNwcmluZ0ZvcmNlWTtcbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjUmVwdWxzaW9uRm9yY2UgPSBmdW5jdGlvbiAobm9kZUEsIG5vZGVCKSB7XG4gIHZhciByZWN0QSA9IG5vZGVBLmdldFJlY3QoKTtcbiAgdmFyIHJlY3RCID0gbm9kZUIuZ2V0UmVjdCgpO1xuICB2YXIgb3ZlcmxhcEFtb3VudCA9IG5ldyBBcnJheSgyKTtcbiAgdmFyIGNsaXBQb2ludHMgPSBuZXcgQXJyYXkoNCk7XG4gIHZhciBkaXN0YW5jZVg7XG4gIHZhciBkaXN0YW5jZVk7XG4gIHZhciBkaXN0YW5jZVNxdWFyZWQ7XG4gIHZhciBkaXN0YW5jZTtcbiAgdmFyIHJlcHVsc2lvbkZvcmNlO1xuICB2YXIgcmVwdWxzaW9uRm9yY2VYO1xuICB2YXIgcmVwdWxzaW9uRm9yY2VZO1xuXG4gIGlmIChyZWN0QS5pbnRlcnNlY3RzKHJlY3RCKSkgLy8gdHdvIG5vZGVzIG92ZXJsYXBcbiAgICB7XG4gICAgICAvLyBjYWxjdWxhdGUgc2VwYXJhdGlvbiBhbW91bnQgaW4geCBhbmQgeSBkaXJlY3Rpb25zXG4gICAgICBJR2VvbWV0cnkuY2FsY1NlcGFyYXRpb25BbW91bnQocmVjdEEsIHJlY3RCLCBvdmVybGFwQW1vdW50LCBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIC8gMi4wKTtcblxuICAgICAgcmVwdWxzaW9uRm9yY2VYID0gMiAqIG92ZXJsYXBBbW91bnRbMF07XG4gICAgICByZXB1bHNpb25Gb3JjZVkgPSAyICogb3ZlcmxhcEFtb3VudFsxXTtcblxuICAgICAgdmFyIGNoaWxkcmVuQ29uc3RhbnQgPSBub2RlQS5ub09mQ2hpbGRyZW4gKiBub2RlQi5ub09mQ2hpbGRyZW4gLyAobm9kZUEubm9PZkNoaWxkcmVuICsgbm9kZUIubm9PZkNoaWxkcmVuKTtcblxuICAgICAgLy8gQXBwbHkgZm9yY2VzIG9uIHRoZSB0d28gbm9kZXNcbiAgICAgIG5vZGVBLnJlcHVsc2lvbkZvcmNlWCAtPSBjaGlsZHJlbkNvbnN0YW50ICogcmVwdWxzaW9uRm9yY2VYO1xuICAgICAgbm9kZUEucmVwdWxzaW9uRm9yY2VZIC09IGNoaWxkcmVuQ29uc3RhbnQgKiByZXB1bHNpb25Gb3JjZVk7XG4gICAgICBub2RlQi5yZXB1bHNpb25Gb3JjZVggKz0gY2hpbGRyZW5Db25zdGFudCAqIHJlcHVsc2lvbkZvcmNlWDtcbiAgICAgIG5vZGVCLnJlcHVsc2lvbkZvcmNlWSArPSBjaGlsZHJlbkNvbnN0YW50ICogcmVwdWxzaW9uRm9yY2VZO1xuICAgIH0gZWxzZSAvLyBubyBvdmVybGFwXG4gICAge1xuICAgICAgLy8gY2FsY3VsYXRlIGRpc3RhbmNlXG5cbiAgICAgIGlmICh0aGlzLnVuaWZvcm1MZWFmTm9kZVNpemVzICYmIG5vZGVBLmdldENoaWxkKCkgPT0gbnVsbCAmJiBub2RlQi5nZXRDaGlsZCgpID09IG51bGwpIC8vIHNpbXBseSBiYXNlIHJlcHVsc2lvbiBvbiBkaXN0YW5jZSBvZiBub2RlIGNlbnRlcnNcbiAgICAgICAge1xuICAgICAgICAgIGRpc3RhbmNlWCA9IHJlY3RCLmdldENlbnRlclgoKSAtIHJlY3RBLmdldENlbnRlclgoKTtcbiAgICAgICAgICBkaXN0YW5jZVkgPSByZWN0Qi5nZXRDZW50ZXJZKCkgLSByZWN0QS5nZXRDZW50ZXJZKCk7XG4gICAgICAgIH0gZWxzZSAvLyB1c2UgY2xpcHBpbmcgcG9pbnRzXG4gICAgICAgIHtcbiAgICAgICAgICBJR2VvbWV0cnkuZ2V0SW50ZXJzZWN0aW9uKHJlY3RBLCByZWN0QiwgY2xpcFBvaW50cyk7XG5cbiAgICAgICAgICBkaXN0YW5jZVggPSBjbGlwUG9pbnRzWzJdIC0gY2xpcFBvaW50c1swXTtcbiAgICAgICAgICBkaXN0YW5jZVkgPSBjbGlwUG9pbnRzWzNdIC0gY2xpcFBvaW50c1sxXTtcbiAgICAgICAgfVxuXG4gICAgICAvLyBObyByZXB1bHNpb24gcmFuZ2UuIEZSIGdyaWQgdmFyaWFudCBzaG91bGQgdGFrZSBjYXJlIG9mIHRoaXMuXG4gICAgICBpZiAoTWF0aC5hYnMoZGlzdGFuY2VYKSA8IEZETGF5b3V0Q29uc3RhbnRzLk1JTl9SRVBVTFNJT05fRElTVCkge1xuICAgICAgICBkaXN0YW5jZVggPSBJTWF0aC5zaWduKGRpc3RhbmNlWCkgKiBGRExheW91dENvbnN0YW50cy5NSU5fUkVQVUxTSU9OX0RJU1Q7XG4gICAgICB9XG5cbiAgICAgIGlmIChNYXRoLmFicyhkaXN0YW5jZVkpIDwgRkRMYXlvdXRDb25zdGFudHMuTUlOX1JFUFVMU0lPTl9ESVNUKSB7XG4gICAgICAgIGRpc3RhbmNlWSA9IElNYXRoLnNpZ24oZGlzdGFuY2VZKSAqIEZETGF5b3V0Q29uc3RhbnRzLk1JTl9SRVBVTFNJT05fRElTVDtcbiAgICAgIH1cblxuICAgICAgZGlzdGFuY2VTcXVhcmVkID0gZGlzdGFuY2VYICogZGlzdGFuY2VYICsgZGlzdGFuY2VZICogZGlzdGFuY2VZO1xuICAgICAgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGlzdGFuY2VTcXVhcmVkKTtcblxuICAgICAgLy8gSGVyZSB3ZSB1c2UgaGFsZiBvZiB0aGUgbm9kZXMnIHJlcHVsc2lvbiB2YWx1ZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgIHJlcHVsc2lvbkZvcmNlID0gKG5vZGVBLm5vZGVSZXB1bHNpb24gLyAyICsgbm9kZUIubm9kZVJlcHVsc2lvbiAvIDIpICogbm9kZUEubm9PZkNoaWxkcmVuICogbm9kZUIubm9PZkNoaWxkcmVuIC8gZGlzdGFuY2VTcXVhcmVkO1xuXG4gICAgICAvLyBQcm9qZWN0IGZvcmNlIG9udG8geCBhbmQgeSBheGVzXG4gICAgICByZXB1bHNpb25Gb3JjZVggPSByZXB1bHNpb25Gb3JjZSAqIGRpc3RhbmNlWCAvIGRpc3RhbmNlO1xuICAgICAgcmVwdWxzaW9uRm9yY2VZID0gcmVwdWxzaW9uRm9yY2UgKiBkaXN0YW5jZVkgLyBkaXN0YW5jZTtcblxuICAgICAgLy8gQXBwbHkgZm9yY2VzIG9uIHRoZSB0d28gbm9kZXMgICAgXG4gICAgICBub2RlQS5yZXB1bHNpb25Gb3JjZVggLT0gcmVwdWxzaW9uRm9yY2VYO1xuICAgICAgbm9kZUEucmVwdWxzaW9uRm9yY2VZIC09IHJlcHVsc2lvbkZvcmNlWTtcbiAgICAgIG5vZGVCLnJlcHVsc2lvbkZvcmNlWCArPSByZXB1bHNpb25Gb3JjZVg7XG4gICAgICBub2RlQi5yZXB1bHNpb25Gb3JjZVkgKz0gcmVwdWxzaW9uRm9yY2VZO1xuICAgIH1cbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjR3Jhdml0YXRpb25hbEZvcmNlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIG93bmVyR3JhcGg7XG4gIHZhciBvd25lckNlbnRlclg7XG4gIHZhciBvd25lckNlbnRlclk7XG4gIHZhciBkaXN0YW5jZVg7XG4gIHZhciBkaXN0YW5jZVk7XG4gIHZhciBhYnNEaXN0YW5jZVg7XG4gIHZhciBhYnNEaXN0YW5jZVk7XG4gIHZhciBlc3RpbWF0ZWRTaXplO1xuICBvd25lckdyYXBoID0gbm9kZS5nZXRPd25lcigpO1xuXG4gIG93bmVyQ2VudGVyWCA9IChvd25lckdyYXBoLmdldFJpZ2h0KCkgKyBvd25lckdyYXBoLmdldExlZnQoKSkgLyAyO1xuICBvd25lckNlbnRlclkgPSAob3duZXJHcmFwaC5nZXRUb3AoKSArIG93bmVyR3JhcGguZ2V0Qm90dG9tKCkpIC8gMjtcbiAgZGlzdGFuY2VYID0gbm9kZS5nZXRDZW50ZXJYKCkgLSBvd25lckNlbnRlclg7XG4gIGRpc3RhbmNlWSA9IG5vZGUuZ2V0Q2VudGVyWSgpIC0gb3duZXJDZW50ZXJZO1xuICBhYnNEaXN0YW5jZVggPSBNYXRoLmFicyhkaXN0YW5jZVgpICsgbm9kZS5nZXRXaWR0aCgpIC8gMjtcbiAgYWJzRGlzdGFuY2VZID0gTWF0aC5hYnMoZGlzdGFuY2VZKSArIG5vZGUuZ2V0SGVpZ2h0KCkgLyAyO1xuXG4gIGlmIChub2RlLmdldE93bmVyKCkgPT0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpKSAvLyBpbiB0aGUgcm9vdCBncmFwaFxuICAgIHtcbiAgICAgIGVzdGltYXRlZFNpemUgPSBvd25lckdyYXBoLmdldEVzdGltYXRlZFNpemUoKSAqIHRoaXMuZ3Jhdml0eVJhbmdlRmFjdG9yO1xuXG4gICAgICBpZiAoYWJzRGlzdGFuY2VYID4gZXN0aW1hdGVkU2l6ZSB8fCBhYnNEaXN0YW5jZVkgPiBlc3RpbWF0ZWRTaXplKSB7XG4gICAgICAgIG5vZGUuZ3Jhdml0YXRpb25Gb3JjZVggPSAtdGhpcy5ncmF2aXR5Q29uc3RhbnQgKiBkaXN0YW5jZVg7XG4gICAgICAgIG5vZGUuZ3Jhdml0YXRpb25Gb3JjZVkgPSAtdGhpcy5ncmF2aXR5Q29uc3RhbnQgKiBkaXN0YW5jZVk7XG4gICAgICB9XG4gICAgfSBlbHNlIC8vIGluc2lkZSBhIGNvbXBvdW5kXG4gICAge1xuICAgICAgZXN0aW1hdGVkU2l6ZSA9IG93bmVyR3JhcGguZ2V0RXN0aW1hdGVkU2l6ZSgpICogdGhpcy5jb21wb3VuZEdyYXZpdHlSYW5nZUZhY3RvcjtcblxuICAgICAgaWYgKGFic0Rpc3RhbmNlWCA+IGVzdGltYXRlZFNpemUgfHwgYWJzRGlzdGFuY2VZID4gZXN0aW1hdGVkU2l6ZSkge1xuICAgICAgICBub2RlLmdyYXZpdGF0aW9uRm9yY2VYID0gLXRoaXMuZ3Jhdml0eUNvbnN0YW50ICogZGlzdGFuY2VYICogdGhpcy5jb21wb3VuZEdyYXZpdHlDb25zdGFudDtcbiAgICAgICAgbm9kZS5ncmF2aXRhdGlvbkZvcmNlWSA9IC10aGlzLmdyYXZpdHlDb25zdGFudCAqIGRpc3RhbmNlWSAqIHRoaXMuY29tcG91bmRHcmF2aXR5Q29uc3RhbnQ7XG4gICAgICB9XG4gICAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLmlzQ29udmVyZ2VkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY29udmVyZ2VkO1xuICB2YXIgb3NjaWxhdGluZyA9IGZhbHNlO1xuXG4gIGlmICh0aGlzLnRvdGFsSXRlcmF0aW9ucyA+IHRoaXMubWF4SXRlcmF0aW9ucyAvIDMpIHtcbiAgICBvc2NpbGF0aW5nID0gTWF0aC5hYnModGhpcy50b3RhbERpc3BsYWNlbWVudCAtIHRoaXMub2xkVG90YWxEaXNwbGFjZW1lbnQpIDwgMjtcbiAgfVxuXG4gIGNvbnZlcmdlZCA9IHRoaXMudG90YWxEaXNwbGFjZW1lbnQgPCB0aGlzLnRvdGFsRGlzcGxhY2VtZW50VGhyZXNob2xkO1xuXG4gIHRoaXMub2xkVG90YWxEaXNwbGFjZW1lbnQgPSB0aGlzLnRvdGFsRGlzcGxhY2VtZW50O1xuXG4gIHJldHVybiBjb252ZXJnZWQgfHwgb3NjaWxhdGluZztcbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5hbmltYXRlID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5hbmltYXRpb25EdXJpbmdMYXlvdXQgJiYgIXRoaXMuaXNTdWJMYXlvdXQpIHtcbiAgICBpZiAodGhpcy5ub3RBbmltYXRlZEl0ZXJhdGlvbnMgPT0gdGhpcy5hbmltYXRpb25QZXJpb2QpIHtcbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICB0aGlzLm5vdEFuaW1hdGVkSXRlcmF0aW9ucyA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubm90QW5pbWF0ZWRJdGVyYXRpb25zKys7XG4gICAgfVxuICB9XG59O1xuXG4vL1RoaXMgbWV0aG9kIGNhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiAod2VpZ2h0KSBmb3IgYWxsIG5vZGVzXG5GRExheW91dC5wcm90b3R5cGUuY2FsY05vT2ZDaGlsZHJlbkZvckFsbE5vZGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm9kZTtcbiAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsTm9kZXMoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZSA9IGFsbE5vZGVzW2ldO1xuICAgIG5vZGUubm9PZkNoaWxkcmVuID0gbm9kZS5nZXROb09mQ2hpbGRyZW4oKTtcbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlY3Rpb246IEZSLUdyaWQgVmFyaWFudCBSZXB1bHNpb24gRm9yY2UgQ2FsY3VsYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjR3JpZCA9IGZ1bmN0aW9uIChncmFwaCkge1xuXG4gIHZhciBzaXplWCA9IDA7XG4gIHZhciBzaXplWSA9IDA7XG5cbiAgc2l6ZVggPSBwYXJzZUludChNYXRoLmNlaWwoKGdyYXBoLmdldFJpZ2h0KCkgLSBncmFwaC5nZXRMZWZ0KCkpIC8gdGhpcy5yZXB1bHNpb25SYW5nZSkpO1xuICBzaXplWSA9IHBhcnNlSW50KE1hdGguY2VpbCgoZ3JhcGguZ2V0Qm90dG9tKCkgLSBncmFwaC5nZXRUb3AoKSkgLyB0aGlzLnJlcHVsc2lvblJhbmdlKSk7XG5cbiAgdmFyIGdyaWQgPSBuZXcgQXJyYXkoc2l6ZVgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZVg7IGkrKykge1xuICAgIGdyaWRbaV0gPSBuZXcgQXJyYXkoc2l6ZVkpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplWDsgaSsrKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzaXplWTsgaisrKSB7XG4gICAgICBncmlkW2ldW2pdID0gbmV3IEFycmF5KCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdyaWQ7XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuYWRkTm9kZVRvR3JpZCA9IGZ1bmN0aW9uICh2LCBsZWZ0LCB0b3ApIHtcblxuICB2YXIgc3RhcnRYID0gMDtcbiAgdmFyIGZpbmlzaFggPSAwO1xuICB2YXIgc3RhcnRZID0gMDtcbiAgdmFyIGZpbmlzaFkgPSAwO1xuXG4gIHN0YXJ0WCA9IHBhcnNlSW50KE1hdGguZmxvb3IoKHYuZ2V0UmVjdCgpLnggLSBsZWZ0KSAvIHRoaXMucmVwdWxzaW9uUmFuZ2UpKTtcbiAgZmluaXNoWCA9IHBhcnNlSW50KE1hdGguZmxvb3IoKHYuZ2V0UmVjdCgpLndpZHRoICsgdi5nZXRSZWN0KCkueCAtIGxlZnQpIC8gdGhpcy5yZXB1bHNpb25SYW5nZSkpO1xuICBzdGFydFkgPSBwYXJzZUludChNYXRoLmZsb29yKCh2LmdldFJlY3QoKS55IC0gdG9wKSAvIHRoaXMucmVwdWxzaW9uUmFuZ2UpKTtcbiAgZmluaXNoWSA9IHBhcnNlSW50KE1hdGguZmxvb3IoKHYuZ2V0UmVjdCgpLmhlaWdodCArIHYuZ2V0UmVjdCgpLnkgLSB0b3ApIC8gdGhpcy5yZXB1bHNpb25SYW5nZSkpO1xuXG4gIGZvciAodmFyIGkgPSBzdGFydFg7IGkgPD0gZmluaXNoWDsgaSsrKSB7XG4gICAgZm9yICh2YXIgaiA9IHN0YXJ0WTsgaiA8PSBmaW5pc2hZOyBqKyspIHtcbiAgICAgIHRoaXMuZ3JpZFtpXVtqXS5wdXNoKHYpO1xuICAgICAgdi5zZXRHcmlkQ29vcmRpbmF0ZXMoc3RhcnRYLCBmaW5pc2hYLCBzdGFydFksIGZpbmlzaFkpO1xuICAgIH1cbiAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLnVwZGF0ZUdyaWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpO1xuICB2YXIgbm9kZUE7XG4gIHZhciBsTm9kZXMgPSB0aGlzLmdldEFsbE5vZGVzKCk7XG5cbiAgdGhpcy5ncmlkID0gdGhpcy5jYWxjR3JpZCh0aGlzLmdyYXBoTWFuYWdlci5nZXRSb290KCkpO1xuXG4gIC8vIHB1dCBhbGwgbm9kZXMgdG8gcHJvcGVyIGdyaWQgY2VsbHNcbiAgZm9yIChpID0gMDsgaSA8IGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIG5vZGVBID0gbE5vZGVzW2ldO1xuICAgIHRoaXMuYWRkTm9kZVRvR3JpZChub2RlQSwgdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldExlZnQoKSwgdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldFRvcCgpKTtcbiAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLmNhbGN1bGF0ZVJlcHVsc2lvbkZvcmNlT2ZBTm9kZSA9IGZ1bmN0aW9uIChub2RlQSwgcHJvY2Vzc2VkTm9kZVNldCwgZ3JpZFVwZGF0ZUFsbG93ZWQsIGZvcmNlVG9Ob2RlU3Vycm91bmRpbmdVcGRhdGUpIHtcblxuICBpZiAodGhpcy50b3RhbEl0ZXJhdGlvbnMgJSBGRExheW91dENvbnN0YW50cy5HUklEX0NBTENVTEFUSU9OX0NIRUNLX1BFUklPRCA9PSAxICYmIGdyaWRVcGRhdGVBbGxvd2VkIHx8IGZvcmNlVG9Ob2RlU3Vycm91bmRpbmdVcGRhdGUpIHtcbiAgICB2YXIgc3Vycm91bmRpbmcgPSBuZXcgU2V0KCk7XG4gICAgbm9kZUEuc3Vycm91bmRpbmcgPSBuZXcgQXJyYXkoKTtcbiAgICB2YXIgbm9kZUI7XG4gICAgdmFyIGdyaWQgPSB0aGlzLmdyaWQ7XG5cbiAgICBmb3IgKHZhciBpID0gbm9kZUEuc3RhcnRYIC0gMTsgaSA8IG5vZGVBLmZpbmlzaFggKyAyOyBpKyspIHtcbiAgICAgIGZvciAodmFyIGogPSBub2RlQS5zdGFydFkgLSAxOyBqIDwgbm9kZUEuZmluaXNoWSArIDI7IGorKykge1xuICAgICAgICBpZiAoIShpIDwgMCB8fCBqIDwgMCB8fCBpID49IGdyaWQubGVuZ3RoIHx8IGogPj0gZ3JpZFswXS5sZW5ndGgpKSB7XG4gICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBncmlkW2ldW2pdLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBub2RlQiA9IGdyaWRbaV1bal1ba107XG5cbiAgICAgICAgICAgIC8vIElmIGJvdGggbm9kZXMgYXJlIG5vdCBtZW1iZXJzIG9mIHRoZSBzYW1lIGdyYXBoLCBcbiAgICAgICAgICAgIC8vIG9yIGJvdGggbm9kZXMgYXJlIHRoZSBzYW1lLCBza2lwLlxuICAgICAgICAgICAgaWYgKG5vZGVBLmdldE93bmVyKCkgIT0gbm9kZUIuZ2V0T3duZXIoKSB8fCBub2RlQSA9PSBub2RlQikge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHJlcHVsc2lvbiBmb3JjZSBiZXR3ZWVuXG4gICAgICAgICAgICAvLyBub2RlQSBhbmQgbm9kZUIgaGFzIGFscmVhZHkgYmVlbiBjYWxjdWxhdGVkXG4gICAgICAgICAgICBpZiAoIXByb2Nlc3NlZE5vZGVTZXQuaGFzKG5vZGVCKSAmJiAhc3Vycm91bmRpbmcuaGFzKG5vZGVCKSkge1xuICAgICAgICAgICAgICB2YXIgZGlzdGFuY2VYID0gTWF0aC5hYnMobm9kZUEuZ2V0Q2VudGVyWCgpIC0gbm9kZUIuZ2V0Q2VudGVyWCgpKSAtIChub2RlQS5nZXRXaWR0aCgpIC8gMiArIG5vZGVCLmdldFdpZHRoKCkgLyAyKTtcbiAgICAgICAgICAgICAgdmFyIGRpc3RhbmNlWSA9IE1hdGguYWJzKG5vZGVBLmdldENlbnRlclkoKSAtIG5vZGVCLmdldENlbnRlclkoKSkgLSAobm9kZUEuZ2V0SGVpZ2h0KCkgLyAyICsgbm9kZUIuZ2V0SGVpZ2h0KCkgLyAyKTtcblxuICAgICAgICAgICAgICAvLyBpZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiBub2RlQSBhbmQgbm9kZUIgXG4gICAgICAgICAgICAgIC8vIGlzIGxlc3MgdGhlbiBjYWxjdWxhdGlvbiByYW5nZVxuICAgICAgICAgICAgICBpZiAoZGlzdGFuY2VYIDw9IHRoaXMucmVwdWxzaW9uUmFuZ2UgJiYgZGlzdGFuY2VZIDw9IHRoaXMucmVwdWxzaW9uUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICAvL3RoZW4gYWRkIG5vZGVCIHRvIHN1cnJvdW5kaW5nIG9mIG5vZGVBXG4gICAgICAgICAgICAgICAgc3Vycm91bmRpbmcuYWRkKG5vZGVCKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGVBLnN1cnJvdW5kaW5nID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShzdXJyb3VuZGluZykpO1xuICB9XG4gIGZvciAoaSA9IDA7IGkgPCBub2RlQS5zdXJyb3VuZGluZy5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMuY2FsY1JlcHVsc2lvbkZvcmNlKG5vZGVBLCBub2RlQS5zdXJyb3VuZGluZ1tpXSk7XG4gIH1cbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjUmVwdWxzaW9uUmFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAwLjA7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZETGF5b3V0O1xuXG4vKioqLyB9KSxcbi8qIDE5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBMRWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG52YXIgRkRMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXG5mdW5jdGlvbiBGRExheW91dEVkZ2Uoc291cmNlLCB0YXJnZXQsIHZFZGdlKSB7XG4gIExFZGdlLmNhbGwodGhpcywgc291cmNlLCB0YXJnZXQsIHZFZGdlKTtcblxuICAvLyBJZGVhbCBsZW5ndGggYW5kIGVsYXN0aWNpdHkgdmFsdWUgZm9yIHRoaXMgZWRnZVxuICB0aGlzLmlkZWFsTGVuZ3RoID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSDtcbiAgdGhpcy5lZGdlRWxhc3RpY2l0eSA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfU1BSSU5HX1NUUkVOR1RIO1xufVxuXG5GRExheW91dEVkZ2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMRWRnZS5wcm90b3R5cGUpO1xuXG5mb3IgKHZhciBwcm9wIGluIExFZGdlKSB7XG4gIEZETGF5b3V0RWRnZVtwcm9wXSA9IExFZGdlW3Byb3BdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEZETGF5b3V0RWRnZTtcblxuLyoqKi8gfSksXG4vKiAyMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgTE5vZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xudmFyIEZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblxuZnVuY3Rpb24gRkRMYXlvdXROb2RlKGdtLCBsb2MsIHNpemUsIHZOb2RlKSB7XG4gIC8vIGFsdGVybmF0aXZlIGNvbnN0cnVjdG9yIGlzIGhhbmRsZWQgaW5zaWRlIExOb2RlXG4gIExOb2RlLmNhbGwodGhpcywgZ20sIGxvYywgc2l6ZSwgdk5vZGUpO1xuXG4gIC8vIFJlcHVsc2lvbiB2YWx1ZSBvZiB0aGlzIG5vZGVcbiAgdGhpcy5ub2RlUmVwdWxzaW9uID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9SRVBVTFNJT05fU1RSRU5HVEg7XG5cbiAgLy9TcHJpbmcsIHJlcHVsc2lvbiBhbmQgZ3Jhdml0YXRpb25hbCBmb3JjZXMgYWN0aW5nIG9uIHRoaXMgbm9kZVxuICB0aGlzLnNwcmluZ0ZvcmNlWCA9IDA7XG4gIHRoaXMuc3ByaW5nRm9yY2VZID0gMDtcbiAgdGhpcy5yZXB1bHNpb25Gb3JjZVggPSAwO1xuICB0aGlzLnJlcHVsc2lvbkZvcmNlWSA9IDA7XG4gIHRoaXMuZ3Jhdml0YXRpb25Gb3JjZVggPSAwO1xuICB0aGlzLmdyYXZpdGF0aW9uRm9yY2VZID0gMDtcbiAgLy9BbW91bnQgYnkgd2hpY2ggdGhpcyBub2RlIGlzIHRvIGJlIG1vdmVkIGluIHRoaXMgaXRlcmF0aW9uXG4gIHRoaXMuZGlzcGxhY2VtZW50WCA9IDA7XG4gIHRoaXMuZGlzcGxhY2VtZW50WSA9IDA7XG5cbiAgLy9TdGFydCBhbmQgZmluaXNoIGdyaWQgY29vcmRpbmF0ZXMgdGhhdCB0aGlzIG5vZGUgaXMgZmFsbGVuIGludG9cbiAgdGhpcy5zdGFydFggPSAwO1xuICB0aGlzLmZpbmlzaFggPSAwO1xuICB0aGlzLnN0YXJ0WSA9IDA7XG4gIHRoaXMuZmluaXNoWSA9IDA7XG5cbiAgLy9HZW9tZXRyaWMgbmVpZ2hib3JzIG9mIHRoaXMgbm9kZVxuICB0aGlzLnN1cnJvdW5kaW5nID0gW107XG59XG5cbkZETGF5b3V0Tm9kZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKExOb2RlLnByb3RvdHlwZSk7XG5cbmZvciAodmFyIHByb3AgaW4gTE5vZGUpIHtcbiAgRkRMYXlvdXROb2RlW3Byb3BdID0gTE5vZGVbcHJvcF07XG59XG5cbkZETGF5b3V0Tm9kZS5wcm90b3R5cGUuc2V0R3JpZENvb3JkaW5hdGVzID0gZnVuY3Rpb24gKF9zdGFydFgsIF9maW5pc2hYLCBfc3RhcnRZLCBfZmluaXNoWSkge1xuICB0aGlzLnN0YXJ0WCA9IF9zdGFydFg7XG4gIHRoaXMuZmluaXNoWCA9IF9maW5pc2hYO1xuICB0aGlzLnN0YXJ0WSA9IF9zdGFydFk7XG4gIHRoaXMuZmluaXNoWSA9IF9maW5pc2hZO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBGRExheW91dE5vZGU7XG5cbi8qKiovIH0pLFxuLyogMjEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gRGltZW5zaW9uRCh3aWR0aCwgaGVpZ2h0KSB7XG4gIHRoaXMud2lkdGggPSAwO1xuICB0aGlzLmhlaWdodCA9IDA7XG4gIGlmICh3aWR0aCAhPT0gbnVsbCAmJiBoZWlnaHQgIT09IG51bGwpIHtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gIH1cbn1cblxuRGltZW5zaW9uRC5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndpZHRoO1xufTtcblxuRGltZW5zaW9uRC5wcm90b3R5cGUuc2V0V2lkdGggPSBmdW5jdGlvbiAod2lkdGgpIHtcbiAgdGhpcy53aWR0aCA9IHdpZHRoO1xufTtcblxuRGltZW5zaW9uRC5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5oZWlnaHQ7XG59O1xuXG5EaW1lbnNpb25ELnByb3RvdHlwZS5zZXRIZWlnaHQgPSBmdW5jdGlvbiAoaGVpZ2h0KSB7XG4gIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBEaW1lbnNpb25EO1xuXG4vKioqLyB9KSxcbi8qIDIyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBVbmlxdWVJREdlbmVyZXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xuXG5mdW5jdGlvbiBIYXNoTWFwKCkge1xuICB0aGlzLm1hcCA9IHt9O1xuICB0aGlzLmtleXMgPSBbXTtcbn1cblxuSGFzaE1hcC5wcm90b3R5cGUucHV0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdmFyIHRoZUlkID0gVW5pcXVlSURHZW5lcmV0b3IuY3JlYXRlSUQoa2V5KTtcbiAgaWYgKCF0aGlzLmNvbnRhaW5zKHRoZUlkKSkge1xuICAgIHRoaXMubWFwW3RoZUlkXSA9IHZhbHVlO1xuICAgIHRoaXMua2V5cy5wdXNoKGtleSk7XG4gIH1cbn07XG5cbkhhc2hNYXAucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKGtleSkge1xuICB2YXIgdGhlSWQgPSBVbmlxdWVJREdlbmVyZXRvci5jcmVhdGVJRChrZXkpO1xuICByZXR1cm4gdGhpcy5tYXBba2V5XSAhPSBudWxsO1xufTtcblxuSGFzaE1hcC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xuICB2YXIgdGhlSWQgPSBVbmlxdWVJREdlbmVyZXRvci5jcmVhdGVJRChrZXkpO1xuICByZXR1cm4gdGhpcy5tYXBbdGhlSWRdO1xufTtcblxuSGFzaE1hcC5wcm90b3R5cGUua2V5U2V0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5rZXlzO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBIYXNoTWFwO1xuXG4vKioqLyB9KSxcbi8qIDIzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBVbmlxdWVJREdlbmVyZXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xuXG5mdW5jdGlvbiBIYXNoU2V0KCkge1xuICB0aGlzLnNldCA9IHt9O1xufVxuO1xuXG5IYXNoU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciB0aGVJZCA9IFVuaXF1ZUlER2VuZXJldG9yLmNyZWF0ZUlEKG9iaik7XG4gIGlmICghdGhpcy5jb250YWlucyh0aGVJZCkpIHRoaXMuc2V0W3RoZUlkXSA9IG9iajtcbn07XG5cbkhhc2hTZXQucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgZGVsZXRlIHRoaXMuc2V0W1VuaXF1ZUlER2VuZXJldG9yLmNyZWF0ZUlEKG9iaildO1xufTtcblxuSGFzaFNldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc2V0ID0ge307XG59O1xuXG5IYXNoU2V0LnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHRoaXMuc2V0W1VuaXF1ZUlER2VuZXJldG9yLmNyZWF0ZUlEKG9iaildID09IG9iajtcbn07XG5cbkhhc2hTZXQucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnNpemUoKSA9PT0gMDtcbn07XG5cbkhhc2hTZXQucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnNldCkubGVuZ3RoO1xufTtcblxuLy9jb25jYXRzIHRoaXMuc2V0IHRvIHRoZSBnaXZlbiBsaXN0XG5IYXNoU2V0LnByb3RvdHlwZS5hZGRBbGxUbyA9IGZ1bmN0aW9uIChsaXN0KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModGhpcy5zZXQpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBsaXN0LnB1c2godGhpcy5zZXRba2V5c1tpXV0pO1xuICB9XG59O1xuXG5IYXNoU2V0LnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5zZXQpLmxlbmd0aDtcbn07XG5cbkhhc2hTZXQucHJvdG90eXBlLmFkZEFsbCA9IGZ1bmN0aW9uIChsaXN0KSB7XG4gIHZhciBzID0gbGlzdC5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIHYgPSBsaXN0W2ldO1xuICAgIHRoaXMuYWRkKHYpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEhhc2hTZXQ7XG5cbi8qKiovIH0pLFxuLyogMjQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLy8gU29tZSBtYXRyaXggKDFkIGFuZCAyZCBhcnJheSkgb3BlcmF0aW9uc1xuZnVuY3Rpb24gTWF0cml4KCkge31cblxuLyoqXG4gKiBtYXRyaXggbXVsdGlwbGljYXRpb25cbiAqIGFycmF5MSwgYXJyYXkyIGFuZCByZXN1bHQgYXJlIDJkIGFycmF5c1xuICovXG5NYXRyaXgubXVsdE1hdCA9IGZ1bmN0aW9uIChhcnJheTEsIGFycmF5Mikge1xuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheTEubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRbaV0gPSBbXTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFycmF5MlswXS5sZW5ndGg7IGorKykge1xuICAgICAgcmVzdWx0W2ldW2pdID0gMDtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgYXJyYXkxWzBdLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHJlc3VsdFtpXVtqXSArPSBhcnJheTFbaV1ba10gKiBhcnJheTJba11bal07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIG1hdHJpeCB0cmFuc3Bvc2VcbiAqIGFycmF5IGFuZCByZXN1bHQgYXJlIDJkIGFycmF5c1xuICovXG5NYXRyaXgudHJhbnNwb3NlID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5WzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzdWx0W2ldID0gW107XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBhcnJheS5sZW5ndGg7IGorKykge1xuICAgICAgcmVzdWx0W2ldW2pdID0gYXJyYXlbal1baV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogbXVsdGlwbHkgYXJyYXkgd2l0aCBjb25zdGFudFxuICogYXJyYXkgYW5kIHJlc3VsdCBhcmUgMWQgYXJyYXlzXG4gKi9cbk1hdHJpeC5tdWx0Q29ucyA9IGZ1bmN0aW9uIChhcnJheSwgY29uc3RhbnQpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRbaV0gPSBhcnJheVtpXSAqIGNvbnN0YW50O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogc3Vic3RyYWN0IHR3byBhcnJheXNcbiAqIGFycmF5MSwgYXJyYXkyIGFuZCByZXN1bHQgYXJlIDFkIGFycmF5c1xuICovXG5NYXRyaXgubWludXNPcCA9IGZ1bmN0aW9uIChhcnJheTEsIGFycmF5Mikge1xuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheTEubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRbaV0gPSBhcnJheTFbaV0gLSBhcnJheTJbaV07XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBkb3QgcHJvZHVjdCBvZiB0d28gYXJyYXlzIHdpdGggc2FtZSBzaXplXG4gKiBhcnJheTEgYW5kIGFycmF5MiBhcmUgMWQgYXJyYXlzXG4gKi9cbk1hdHJpeC5kb3RQcm9kdWN0ID0gZnVuY3Rpb24gKGFycmF5MSwgYXJyYXkyKSB7XG4gIHZhciBwcm9kdWN0ID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5MS5sZW5ndGg7IGkrKykge1xuICAgIHByb2R1Y3QgKz0gYXJyYXkxW2ldICogYXJyYXkyW2ldO1xuICB9XG5cbiAgcmV0dXJuIHByb2R1Y3Q7XG59O1xuXG4vKipcbiAqIG1hZ25pdHVkZSBvZiBhbiBhcnJheVxuICogYXJyYXkgaXMgMWQgYXJyYXlcbiAqL1xuTWF0cml4Lm1hZyA9IGZ1bmN0aW9uIChhcnJheSkge1xuICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZG90UHJvZHVjdChhcnJheSwgYXJyYXkpKTtcbn07XG5cbi8qKlxuICogbm9ybWFsaXphdGlvbiBvZiBhbiBhcnJheVxuICogYXJyYXkgYW5kIHJlc3VsdCBhcmUgMWQgYXJyYXlcbiAqL1xuTWF0cml4Lm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBtYWduaXR1ZGUgPSB0aGlzLm1hZyhhcnJheSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIHJlc3VsdFtpXSA9IGFycmF5W2ldIC8gbWFnbml0dWRlO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogbXVsdGlwbHkgYW4gYXJyYXkgd2l0aCBjZW50ZXJpbmcgbWF0cml4XG4gKiBhcnJheSBhbmQgcmVzdWx0IGFyZSAxZCBhcnJheVxuICovXG5NYXRyaXgubXVsdEdhbW1hID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIHN1bSA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIHN1bSArPSBhcnJheVtpXTtcbiAgfVxuXG4gIHN1bSAqPSAtMSAvIGFycmF5Lmxlbmd0aDtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJyYXkubGVuZ3RoOyBfaSsrKSB7XG4gICAgcmVzdWx0W19pXSA9IHN1bSArIGFycmF5W19pXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBhIHNwZWNpYWwgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gKiByZXN1bHQgPSAwLjUgKiBDICogSU5WICogQ15UICogYXJyYXlcbiAqIGFycmF5IGFuZCByZXN1bHQgYXJlIDFkLCBDIGFuZCBJTlYgYXJlIDJkIGFycmF5c1xuICovXG5NYXRyaXgubXVsdEwgPSBmdW5jdGlvbiAoYXJyYXksIEMsIElOVikge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciB0ZW1wMSA9IFtdO1xuICB2YXIgdGVtcDIgPSBbXTtcblxuICAvLyBtdWx0aXBseSBieSBDXlRcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBDWzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHN1bSA9IDA7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBDLmxlbmd0aDsgaisrKSB7XG4gICAgICBzdW0gKz0gLTAuNSAqIENbal1baV0gKiBhcnJheVtqXTtcbiAgICB9XG4gICAgdGVtcDFbaV0gPSBzdW07XG4gIH1cbiAgLy8gbXVsdGlwbHkgdGhlIHJlc3VsdCBieSBJTlZcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgSU5WLmxlbmd0aDsgX2kyKyspIHtcbiAgICB2YXIgX3N1bSA9IDA7XG4gICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IElOVi5sZW5ndGg7IF9qKyspIHtcbiAgICAgIF9zdW0gKz0gSU5WW19pMl1bX2pdICogdGVtcDFbX2pdO1xuICAgIH1cbiAgICB0ZW1wMltfaTJdID0gX3N1bTtcbiAgfVxuICAvLyBtdWx0aXBseSB0aGUgcmVzdWx0IGJ5IENcbiAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgQy5sZW5ndGg7IF9pMysrKSB7XG4gICAgdmFyIF9zdW0yID0gMDtcbiAgICBmb3IgKHZhciBfajIgPSAwOyBfajIgPCBDWzBdLmxlbmd0aDsgX2oyKyspIHtcbiAgICAgIF9zdW0yICs9IENbX2kzXVtfajJdICogdGVtcDJbX2oyXTtcbiAgICB9XG4gICAgcmVzdWx0W19pM10gPSBfc3VtMjtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hdHJpeDtcblxuLyoqKi8gfSksXG4vKiAyNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG4vKipcbiAqIEEgY2xhc3NpYyBRdWlja3NvcnQgYWxnb3JpdGhtIHdpdGggSG9hcmUncyBwYXJ0aXRpb25cbiAqIC0gV29ya3MgYWxzbyBvbiBMaW5rZWRMaXN0IG9iamVjdHNcbiAqXG4gKiBDb3B5cmlnaHQ6IGktVmlzIFJlc2VhcmNoIEdyb3VwLCBCaWxrZW50IFVuaXZlcnNpdHksIDIwMDcgLSBwcmVzZW50XG4gKi9cblxudmFyIExpbmtlZExpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKTtcblxudmFyIFF1aWNrc29ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBRdWlja3NvcnQoQSwgY29tcGFyZUZ1bmN0aW9uKSB7XG4gICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBRdWlja3NvcnQpO1xuXG4gICAgICAgIGlmIChjb21wYXJlRnVuY3Rpb24gIT09IG51bGwgfHwgY29tcGFyZUZ1bmN0aW9uICE9PSB1bmRlZmluZWQpIHRoaXMuY29tcGFyZUZ1bmN0aW9uID0gdGhpcy5fZGVmYXVsdENvbXBhcmVGdW5jdGlvbjtcblxuICAgICAgICB2YXIgbGVuZ3RoID0gdm9pZCAwO1xuICAgICAgICBpZiAoQSBpbnN0YW5jZW9mIExpbmtlZExpc3QpIGxlbmd0aCA9IEEuc2l6ZSgpO2Vsc2UgbGVuZ3RoID0gQS5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5fcXVpY2tzb3J0KEEsIDAsIGxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhRdWlja3NvcnQsIFt7XG4gICAgICAgIGtleTogJ19xdWlja3NvcnQnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3F1aWNrc29ydChBLCBwLCByKSB7XG4gICAgICAgICAgICBpZiAocCA8IHIpIHtcbiAgICAgICAgICAgICAgICB2YXIgcSA9IHRoaXMuX3BhcnRpdGlvbihBLCBwLCByKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9xdWlja3NvcnQoQSwgcCwgcSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcXVpY2tzb3J0KEEsIHEgKyAxLCByKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnX3BhcnRpdGlvbicsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfcGFydGl0aW9uKEEsIHAsIHIpIHtcbiAgICAgICAgICAgIHZhciB4ID0gdGhpcy5fZ2V0KEEsIHApO1xuICAgICAgICAgICAgdmFyIGkgPSBwO1xuICAgICAgICAgICAgdmFyIGogPSByO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5jb21wYXJlRnVuY3Rpb24oeCwgdGhpcy5fZ2V0KEEsIGopKSkge1xuICAgICAgICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICAgICAgfXdoaWxlICh0aGlzLmNvbXBhcmVGdW5jdGlvbih0aGlzLl9nZXQoQSwgaSksIHgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9aWYgKGkgPCBqKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N3YXAoQSwgaSwgaik7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSByZXR1cm4gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnX2dldCcsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0KG9iamVjdCwgaW5kZXgpIHtcbiAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBMaW5rZWRMaXN0KSByZXR1cm4gb2JqZWN0LmdldF9vYmplY3RfYXQoaW5kZXgpO2Vsc2UgcmV0dXJuIG9iamVjdFtpbmRleF07XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ19zZXQnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3NldChvYmplY3QsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpbmtlZExpc3QpIG9iamVjdC5zZXRfb2JqZWN0X2F0KGluZGV4LCB2YWx1ZSk7ZWxzZSBvYmplY3RbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ19zd2FwJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9zd2FwKEEsIGksIGopIHtcbiAgICAgICAgICAgIHZhciB0ZW1wID0gdGhpcy5fZ2V0KEEsIGkpO1xuICAgICAgICAgICAgdGhpcy5fc2V0KEEsIGksIHRoaXMuX2dldChBLCBqKSk7XG4gICAgICAgICAgICB0aGlzLl9zZXQoQSwgaiwgdGVtcCk7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ19kZWZhdWx0Q29tcGFyZUZ1bmN0aW9uJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9kZWZhdWx0Q29tcGFyZUZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiID4gYTtcbiAgICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBRdWlja3NvcnQ7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gUXVpY2tzb3J0O1xuXG4vKioqLyB9KSxcbi8qIDI2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbi8vIFNpbmd1bGFyIFZhbHVlIERlY29tcG9zaXRpb24gaW1wbGVtZW50YXRpb25cbmZ1bmN0aW9uIFNWRCgpIHt9O1xuXG4vKiBCZWxvdyBzaW5ndWxhciB2YWx1ZSBkZWNvbXBvc2l0aW9uIChzdmQpIGNvZGUgaW5jbHVkaW5nIGh5cG90IGZ1bmN0aW9uIGlzIGFkb3B0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZHJhZ29uZmx5LWFpL0phbWFKU1xuICAgU29tZSBjaGFuZ2VzIGFyZSBhcHBsaWVkIHRvIG1ha2UgdGhlIGNvZGUgY29tcGF0aWJsZSB3aXRoIHRoZSBmY29zZSBjb2RlIGFuZCB0byBtYWtlIGl0IGluZGVwZW5kZW50IGZyb20gSmFtYS5cbiAgIElucHV0IG1hdHJpeCBpcyBjaGFuZ2VkIHRvIGEgMkQgYXJyYXkgaW5zdGVhZCBvZiBKYW1hIG1hdHJpeC4gTWF0cml4IGRpbWVuc2lvbnMgYXJlIHRha2VuIGFjY29yZGluZyB0byAyRCBhcnJheSBpbnN0ZWFkIG9mIHVzaW5nIEphbWEgZnVuY3Rpb25zLlxuICAgQW4gb2JqZWN0IHRoYXQgaW5jbHVkZXMgc2luZ3VsYXIgdmFsdWUgY29tcG9uZW50cyBpcyBjcmVhdGVkIGZvciByZXR1cm4uIFxuICAgVGhlIHR5cGVzIG9mIGlucHV0IHBhcmFtZXRlcnMgb2YgdGhlIGh5cG90IGZ1bmN0aW9uIGFyZSByZW1vdmVkLiBcbiAgIGxldCBpcyB1c2VkIGluc3RlYWQgb2YgdmFyIGZvciB0aGUgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24uXG4qL1xuLypcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNFxuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL1xuXG4gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT05cblxuICAgMS4gRGVmaW5pdGlvbnMuXG5cbiAgICAgIFwiTGljZW5zZVwiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbixcbiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LlxuXG4gICAgICBcIkxpY2Vuc29yXCIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5XG4gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuXG5cbiAgICAgIFwiTGVnYWwgRW50aXR5XCIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbFxuICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vblxuICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbixcbiAgICAgIFwiY29udHJvbFwiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlXG4gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvclxuICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlXG4gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LlxuXG4gICAgICBcIllvdVwiIChvciBcIllvdXJcIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eVxuICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS5cblxuICAgICAgXCJTb3VyY2VcIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucyxcbiAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb25cbiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuXG5cbiAgICAgIFwiT2JqZWN0XCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWxcbiAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXRcbiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbixcbiAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy5cblxuICAgICAgXCJXb3JrXCIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvclxuICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYVxuICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrXG4gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLlxuXG4gICAgICBcIkRlcml2YXRpdmUgV29ya3NcIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3RcbiAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGVcbiAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnNcbiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzXG4gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW5cbiAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZixcbiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuXG5cbiAgICAgIFwiQ29udHJpYnV0aW9uXCIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmdcbiAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnNcbiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseVxuICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lclxuICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mXG4gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgXCJzdWJtaXR0ZWRcIlxuICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudFxuICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG9cbiAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsXG4gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZVxuICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0XG4gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZVxuICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgXCJOb3QgYSBDb250cmlidXRpb24uXCJcblxuICAgICAgXCJDb250cmlidXRvclwiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eVxuICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kXG4gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay5cblxuICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG4gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsXG4gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZVxuICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsXG4gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGVcbiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uXG5cbiAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLFxuICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGVcbiAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLFxuICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssXG4gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZVxuICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXJcbiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocylcbiAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91XG4gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYVxuICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29ya1xuICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3RcbiAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXNcbiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZVxuICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLlxuXG4gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZVxuICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0XG4gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdVxuICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbiAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yXG4gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmRcblxuICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlc1xuICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZFxuXG4gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3NcbiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kXG4gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yayxcbiAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mXG4gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZFxuXG4gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSBcIk5PVElDRVwiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0c1xuICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3RcbiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWRcbiAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3RcbiAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmVcbiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZFxuICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3JcbiAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvcixcbiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kXG4gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzXG4gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZFxuICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uXG4gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGVcbiAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWRcbiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWRcbiAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuXG5cbiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZFxuICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvclxuICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsXG4gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGhcbiAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuXG5cbiAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSxcbiAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29ya1xuICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcbiAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLlxuICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeVxuICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWRcbiAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy5cblxuICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZVxuICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLFxuICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlXG4gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS5cblxuICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yXG4gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoXG4gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yXG4gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9uc1xuICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQVxuICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlXG4gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnlcbiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS5cblxuICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksXG4gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSxcbiAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5XG4gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZVxuICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLFxuICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhXG4gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlXG4gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsXG4gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbFxuICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvclxuICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLlxuXG4gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nXG4gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLFxuICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSxcbiAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzXG4gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seVxuICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGZcbiAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSxcbiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eVxuICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvblxuICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuXG5cbiAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OU1xuXG4gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuXG5cbiAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nXG4gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBcInt9XCJcbiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlXG4gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZVxuICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhXG4gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlXG4gICAgICBzYW1lIFwicHJpbnRlZCBwYWdlXCIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llclxuICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLlxuXG4gICBDb3B5cmlnaHQge3l5eXl9IHtuYW1lIG9mIGNvcHlyaWdodCBvd25lcn1cblxuICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5TVkQuc3ZkID0gZnVuY3Rpb24gKEEpIHtcbiAgdGhpcy5VID0gbnVsbDtcbiAgdGhpcy5WID0gbnVsbDtcbiAgdGhpcy5zID0gbnVsbDtcbiAgdGhpcy5tID0gMDtcbiAgdGhpcy5uID0gMDtcbiAgdGhpcy5tID0gQS5sZW5ndGg7XG4gIHRoaXMubiA9IEFbMF0ubGVuZ3RoO1xuICB2YXIgbnUgPSBNYXRoLm1pbih0aGlzLm0sIHRoaXMubik7XG4gIHRoaXMucyA9IGZ1bmN0aW9uIChzKSB7XG4gICAgdmFyIGEgPSBbXTtcbiAgICB3aGlsZSAocy0tID4gMCkge1xuICAgICAgYS5wdXNoKDApO1xuICAgIH1yZXR1cm4gYTtcbiAgfShNYXRoLm1pbih0aGlzLm0gKyAxLCB0aGlzLm4pKTtcbiAgdGhpcy5VID0gZnVuY3Rpb24gKGRpbXMpIHtcbiAgICB2YXIgYWxsb2NhdGUgPSBmdW5jdGlvbiBhbGxvY2F0ZShkaW1zKSB7XG4gICAgICBpZiAoZGltcy5sZW5ndGggPT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBhcnJheSA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbXNbMF07IGkrKykge1xuICAgICAgICAgIGFycmF5LnB1c2goYWxsb2NhdGUoZGltcy5zbGljZSgxKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBhbGxvY2F0ZShkaW1zKTtcbiAgfShbdGhpcy5tLCBudV0pO1xuICB0aGlzLlYgPSBmdW5jdGlvbiAoZGltcykge1xuICAgIHZhciBhbGxvY2F0ZSA9IGZ1bmN0aW9uIGFsbG9jYXRlKGRpbXMpIHtcbiAgICAgIGlmIChkaW1zLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGFycmF5ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGltc1swXTsgaSsrKSB7XG4gICAgICAgICAgYXJyYXkucHVzaChhbGxvY2F0ZShkaW1zLnNsaWNlKDEpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGFsbG9jYXRlKGRpbXMpO1xuICB9KFt0aGlzLm4sIHRoaXMubl0pO1xuICB2YXIgZSA9IGZ1bmN0aW9uIChzKSB7XG4gICAgdmFyIGEgPSBbXTtcbiAgICB3aGlsZSAocy0tID4gMCkge1xuICAgICAgYS5wdXNoKDApO1xuICAgIH1yZXR1cm4gYTtcbiAgfSh0aGlzLm4pO1xuICB2YXIgd29yayA9IGZ1bmN0aW9uIChzKSB7XG4gICAgdmFyIGEgPSBbXTtcbiAgICB3aGlsZSAocy0tID4gMCkge1xuICAgICAgYS5wdXNoKDApO1xuICAgIH1yZXR1cm4gYTtcbiAgfSh0aGlzLm0pO1xuICB2YXIgd2FudHUgPSB0cnVlO1xuICB2YXIgd2FudHYgPSB0cnVlO1xuICB2YXIgbmN0ID0gTWF0aC5taW4odGhpcy5tIC0gMSwgdGhpcy5uKTtcbiAgdmFyIG5ydCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMubiAtIDIsIHRoaXMubSkpO1xuICBmb3IgKHZhciBrID0gMDsgayA8IE1hdGgubWF4KG5jdCwgbnJ0KTsgaysrKSB7XG4gICAgaWYgKGsgPCBuY3QpIHtcbiAgICAgIHRoaXMuc1trXSA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gazsgaSA8IHRoaXMubTsgaSsrKSB7XG4gICAgICAgIHRoaXMuc1trXSA9IFNWRC5oeXBvdCh0aGlzLnNba10sIEFbaV1ba10pO1xuICAgICAgfVxuICAgICAgO1xuICAgICAgaWYgKHRoaXMuc1trXSAhPT0gMC4wKSB7XG4gICAgICAgIGlmIChBW2tdW2tdIDwgMC4wKSB7XG4gICAgICAgICAgdGhpcy5zW2tdID0gLXRoaXMuc1trXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBfaSA9IGs7IF9pIDwgdGhpcy5tOyBfaSsrKSB7XG4gICAgICAgICAgQVtfaV1ba10gLz0gdGhpcy5zW2tdO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgICAgQVtrXVtrXSArPSAxLjA7XG4gICAgICB9XG4gICAgICB0aGlzLnNba10gPSAtdGhpcy5zW2tdO1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gayArIDE7IGogPCB0aGlzLm47IGorKykge1xuICAgICAgaWYgKGZ1bmN0aW9uIChsaHMsIHJocykge1xuICAgICAgICByZXR1cm4gbGhzICYmIHJocztcbiAgICAgIH0oayA8IG5jdCwgdGhpcy5zW2tdICE9PSAwLjApKSB7XG4gICAgICAgIHZhciB0ID0gMDtcbiAgICAgICAgZm9yICh2YXIgX2kyID0gazsgX2kyIDwgdGhpcy5tOyBfaTIrKykge1xuICAgICAgICAgIHQgKz0gQVtfaTJdW2tdICogQVtfaTJdW2pdO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgICAgdCA9IC10IC8gQVtrXVtrXTtcbiAgICAgICAgZm9yICh2YXIgX2kzID0gazsgX2kzIDwgdGhpcy5tOyBfaTMrKykge1xuICAgICAgICAgIEFbX2kzXVtqXSArPSB0ICogQVtfaTNdW2tdO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgIH1cbiAgICAgIGVbal0gPSBBW2tdW2pdO1xuICAgIH1cbiAgICA7XG4gICAgaWYgKGZ1bmN0aW9uIChsaHMsIHJocykge1xuICAgICAgcmV0dXJuIGxocyAmJiByaHM7XG4gICAgfSh3YW50dSwgayA8IG5jdCkpIHtcbiAgICAgIGZvciAodmFyIF9pNCA9IGs7IF9pNCA8IHRoaXMubTsgX2k0KyspIHtcbiAgICAgICAgdGhpcy5VW19pNF1ba10gPSBBW19pNF1ba107XG4gICAgICB9XG4gICAgICA7XG4gICAgfVxuICAgIGlmIChrIDwgbnJ0KSB7XG4gICAgICBlW2tdID0gMDtcbiAgICAgIGZvciAodmFyIF9pNSA9IGsgKyAxOyBfaTUgPCB0aGlzLm47IF9pNSsrKSB7XG4gICAgICAgIGVba10gPSBTVkQuaHlwb3QoZVtrXSwgZVtfaTVdKTtcbiAgICAgIH1cbiAgICAgIDtcbiAgICAgIGlmIChlW2tdICE9PSAwLjApIHtcbiAgICAgICAgaWYgKGVbayArIDFdIDwgMC4wKSB7XG4gICAgICAgICAgZVtrXSA9IC1lW2tdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIF9pNiA9IGsgKyAxOyBfaTYgPCB0aGlzLm47IF9pNisrKSB7XG4gICAgICAgICAgZVtfaTZdIC89IGVba107XG4gICAgICAgIH1cbiAgICAgICAgO1xuICAgICAgICBlW2sgKyAxXSArPSAxLjA7XG4gICAgICB9XG4gICAgICBlW2tdID0gLWVba107XG4gICAgICBpZiAoZnVuY3Rpb24gKGxocywgcmhzKSB7XG4gICAgICAgIHJldHVybiBsaHMgJiYgcmhzO1xuICAgICAgfShrICsgMSA8IHRoaXMubSwgZVtrXSAhPT0gMC4wKSkge1xuICAgICAgICBmb3IgKHZhciBfaTcgPSBrICsgMTsgX2k3IDwgdGhpcy5tOyBfaTcrKykge1xuICAgICAgICAgIHdvcmtbX2k3XSA9IDAuMDtcbiAgICAgICAgfVxuICAgICAgICA7XG4gICAgICAgIGZvciAodmFyIF9qID0gayArIDE7IF9qIDwgdGhpcy5uOyBfaisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgX2k4ID0gayArIDE7IF9pOCA8IHRoaXMubTsgX2k4KyspIHtcbiAgICAgICAgICAgIHdvcmtbX2k4XSArPSBlW19qXSAqIEFbX2k4XVtfal07XG4gICAgICAgICAgfVxuICAgICAgICAgIDtcbiAgICAgICAgfVxuICAgICAgICA7XG4gICAgICAgIGZvciAodmFyIF9qMiA9IGsgKyAxOyBfajIgPCB0aGlzLm47IF9qMisrKSB7XG4gICAgICAgICAgdmFyIF90ID0gLWVbX2oyXSAvIGVbayArIDFdO1xuICAgICAgICAgIGZvciAodmFyIF9pOSA9IGsgKyAxOyBfaTkgPCB0aGlzLm07IF9pOSsrKSB7XG4gICAgICAgICAgICBBW19pOV1bX2oyXSArPSBfdCAqIHdvcmtbX2k5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgIH1cbiAgICAgIGlmICh3YW50dikge1xuICAgICAgICBmb3IgKHZhciBfaTEwID0gayArIDE7IF9pMTAgPCB0aGlzLm47IF9pMTArKykge1xuICAgICAgICAgIHRoaXMuVltfaTEwXVtrXSA9IGVbX2kxMF07XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgcCA9IE1hdGgubWluKHRoaXMubiwgdGhpcy5tICsgMSk7XG4gIGlmIChuY3QgPCB0aGlzLm4pIHtcbiAgICB0aGlzLnNbbmN0XSA9IEFbbmN0XVtuY3RdO1xuICB9XG4gIGlmICh0aGlzLm0gPCBwKSB7XG4gICAgdGhpcy5zW3AgLSAxXSA9IDAuMDtcbiAgfVxuICBpZiAobnJ0ICsgMSA8IHApIHtcbiAgICBlW25ydF0gPSBBW25ydF1bcCAtIDFdO1xuICB9XG4gIGVbcCAtIDFdID0gMC4wO1xuICBpZiAod2FudHUpIHtcbiAgICBmb3IgKHZhciBfajMgPSBuY3Q7IF9qMyA8IG51OyBfajMrKykge1xuICAgICAgZm9yICh2YXIgX2kxMSA9IDA7IF9pMTEgPCB0aGlzLm07IF9pMTErKykge1xuICAgICAgICB0aGlzLlVbX2kxMV1bX2ozXSA9IDAuMDtcbiAgICAgIH1cbiAgICAgIDtcbiAgICAgIHRoaXMuVVtfajNdW19qM10gPSAxLjA7XG4gICAgfTtcbiAgICBmb3IgKHZhciBfayA9IG5jdCAtIDE7IF9rID49IDA7IF9rLS0pIHtcbiAgICAgIGlmICh0aGlzLnNbX2tdICE9PSAwLjApIHtcbiAgICAgICAgZm9yICh2YXIgX2o0ID0gX2sgKyAxOyBfajQgPCBudTsgX2o0KyspIHtcbiAgICAgICAgICB2YXIgX3QyID0gMDtcbiAgICAgICAgICBmb3IgKHZhciBfaTEyID0gX2s7IF9pMTIgPCB0aGlzLm07IF9pMTIrKykge1xuICAgICAgICAgICAgX3QyICs9IHRoaXMuVVtfaTEyXVtfa10gKiB0aGlzLlVbX2kxMl1bX2o0XTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIF90MiA9IC1fdDIgLyB0aGlzLlVbX2tdW19rXTtcbiAgICAgICAgICBmb3IgKHZhciBfaTEzID0gX2s7IF9pMTMgPCB0aGlzLm07IF9pMTMrKykge1xuICAgICAgICAgICAgdGhpcy5VW19pMTNdW19qNF0gKz0gX3QyICogdGhpcy5VW19pMTNdW19rXTtcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKHZhciBfaTE0ID0gX2s7IF9pMTQgPCB0aGlzLm07IF9pMTQrKykge1xuICAgICAgICAgIHRoaXMuVVtfaTE0XVtfa10gPSAtdGhpcy5VW19pMTRdW19rXTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5VW19rXVtfa10gPSAxLjAgKyB0aGlzLlVbX2tdW19rXTtcbiAgICAgICAgZm9yICh2YXIgX2kxNSA9IDA7IF9pMTUgPCBfayAtIDE7IF9pMTUrKykge1xuICAgICAgICAgIHRoaXMuVVtfaTE1XVtfa10gPSAwLjA7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBfaTE2ID0gMDsgX2kxNiA8IHRoaXMubTsgX2kxNisrKSB7XG4gICAgICAgICAgdGhpcy5VW19pMTZdW19rXSA9IDAuMDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5VW19rXVtfa10gPSAxLjA7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBpZiAod2FudHYpIHtcbiAgICBmb3IgKHZhciBfazIgPSB0aGlzLm4gLSAxOyBfazIgPj0gMDsgX2syLS0pIHtcbiAgICAgIGlmIChmdW5jdGlvbiAobGhzLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIGxocyAmJiByaHM7XG4gICAgICB9KF9rMiA8IG5ydCwgZVtfazJdICE9PSAwLjApKSB7XG4gICAgICAgIGZvciAodmFyIF9qNSA9IF9rMiArIDE7IF9qNSA8IG51OyBfajUrKykge1xuICAgICAgICAgIHZhciBfdDMgPSAwO1xuICAgICAgICAgIGZvciAodmFyIF9pMTcgPSBfazIgKyAxOyBfaTE3IDwgdGhpcy5uOyBfaTE3KyspIHtcbiAgICAgICAgICAgIF90MyArPSB0aGlzLlZbX2kxN11bX2syXSAqIHRoaXMuVltfaTE3XVtfajVdO1xuICAgICAgICAgIH07XG4gICAgICAgICAgX3QzID0gLV90MyAvIHRoaXMuVltfazIgKyAxXVtfazJdO1xuICAgICAgICAgIGZvciAodmFyIF9pMTggPSBfazIgKyAxOyBfaTE4IDwgdGhpcy5uOyBfaTE4KyspIHtcbiAgICAgICAgICAgIHRoaXMuVltfaTE4XVtfajVdICs9IF90MyAqIHRoaXMuVltfaTE4XVtfazJdO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBfaTE5ID0gMDsgX2kxOSA8IHRoaXMubjsgX2kxOSsrKSB7XG4gICAgICAgIHRoaXMuVltfaTE5XVtfazJdID0gMC4wO1xuICAgICAgfTtcbiAgICAgIHRoaXMuVltfazJdW19rMl0gPSAxLjA7XG4gICAgfTtcbiAgfVxuICB2YXIgcHAgPSBwIC0gMTtcbiAgdmFyIGl0ZXIgPSAwO1xuICB2YXIgZXBzID0gTWF0aC5wb3coMi4wLCAtNTIuMCk7XG4gIHZhciB0aW55ID0gTWF0aC5wb3coMi4wLCAtOTY2LjApO1xuICB3aGlsZSAocCA+IDApIHtcbiAgICB2YXIgX2szID0gdm9pZCAwO1xuICAgIHZhciBrYXNlID0gdm9pZCAwO1xuICAgIGZvciAoX2szID0gcCAtIDI7IF9rMyA+PSAtMTsgX2szLS0pIHtcbiAgICAgIGlmIChfazMgPT09IC0xKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKE1hdGguYWJzKGVbX2szXSkgPD0gdGlueSArIGVwcyAqIChNYXRoLmFicyh0aGlzLnNbX2szXSkgKyBNYXRoLmFicyh0aGlzLnNbX2szICsgMV0pKSkge1xuICAgICAgICBlW19rM10gPSAwLjA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKF9rMyA9PT0gcCAtIDIpIHtcbiAgICAgIGthc2UgPSA0O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIga3MgPSB2b2lkIDA7XG4gICAgICBmb3IgKGtzID0gcCAtIDE7IGtzID49IF9rMzsga3MtLSkge1xuICAgICAgICBpZiAoa3MgPT09IF9rMykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfdDQgPSAoa3MgIT09IHAgPyBNYXRoLmFicyhlW2tzXSkgOiAwLjApICsgKGtzICE9PSBfazMgKyAxID8gTWF0aC5hYnMoZVtrcyAtIDFdKSA6IDAuMCk7XG4gICAgICAgIGlmIChNYXRoLmFicyh0aGlzLnNba3NdKSA8PSB0aW55ICsgZXBzICogX3Q0KSB7XG4gICAgICAgICAgdGhpcy5zW2tzXSA9IDAuMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChrcyA9PT0gX2szKSB7XG4gICAgICAgIGthc2UgPSAzO1xuICAgICAgfSBlbHNlIGlmIChrcyA9PT0gcCAtIDEpIHtcbiAgICAgICAga2FzZSA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrYXNlID0gMjtcbiAgICAgICAgX2szID0ga3M7XG4gICAgICB9XG4gICAgfVxuICAgIF9rMysrO1xuICAgIHN3aXRjaCAoa2FzZSkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGYgPSBlW3AgLSAyXTtcbiAgICAgICAgICBlW3AgLSAyXSA9IDAuMDtcbiAgICAgICAgICBmb3IgKHZhciBfajYgPSBwIC0gMjsgX2o2ID49IF9rMzsgX2o2LS0pIHtcbiAgICAgICAgICAgIHZhciBfdDUgPSBTVkQuaHlwb3QodGhpcy5zW19qNl0sIGYpO1xuICAgICAgICAgICAgdmFyIGNzID0gdGhpcy5zW19qNl0gLyBfdDU7XG4gICAgICAgICAgICB2YXIgc24gPSBmIC8gX3Q1O1xuICAgICAgICAgICAgdGhpcy5zW19qNl0gPSBfdDU7XG4gICAgICAgICAgICBpZiAoX2o2ICE9PSBfazMpIHtcbiAgICAgICAgICAgICAgZiA9IC1zbiAqIGVbX2o2IC0gMV07XG4gICAgICAgICAgICAgIGVbX2o2IC0gMV0gPSBjcyAqIGVbX2o2IC0gMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod2FudHYpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgX2kyMCA9IDA7IF9pMjAgPCB0aGlzLm47IF9pMjArKykge1xuICAgICAgICAgICAgICAgIF90NSA9IGNzICogdGhpcy5WW19pMjBdW19qNl0gKyBzbiAqIHRoaXMuVltfaTIwXVtwIC0gMV07XG4gICAgICAgICAgICAgICAgdGhpcy5WW19pMjBdW3AgLSAxXSA9IC1zbiAqIHRoaXMuVltfaTIwXVtfajZdICsgY3MgKiB0aGlzLlZbX2kyMF1bcCAtIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVltfaTIwXVtfajZdID0gX3Q1O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9mID0gZVtfazMgLSAxXTtcbiAgICAgICAgICBlW19rMyAtIDFdID0gMC4wO1xuICAgICAgICAgIGZvciAodmFyIF9qNyA9IF9rMzsgX2o3IDwgcDsgX2o3KyspIHtcbiAgICAgICAgICAgIHZhciBfdDYgPSBTVkQuaHlwb3QodGhpcy5zW19qN10sIF9mKTtcbiAgICAgICAgICAgIHZhciBfY3MgPSB0aGlzLnNbX2o3XSAvIF90NjtcbiAgICAgICAgICAgIHZhciBfc24gPSBfZiAvIF90NjtcbiAgICAgICAgICAgIHRoaXMuc1tfajddID0gX3Q2O1xuICAgICAgICAgICAgX2YgPSAtX3NuICogZVtfajddO1xuICAgICAgICAgICAgZVtfajddID0gX2NzICogZVtfajddO1xuICAgICAgICAgICAgaWYgKHdhbnR1KSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pMjEgPSAwOyBfaTIxIDwgdGhpcy5tOyBfaTIxKyspIHtcbiAgICAgICAgICAgICAgICBfdDYgPSBfY3MgKiB0aGlzLlVbX2kyMV1bX2o3XSArIF9zbiAqIHRoaXMuVVtfaTIxXVtfazMgLSAxXTtcbiAgICAgICAgICAgICAgICB0aGlzLlVbX2kyMV1bX2szIC0gMV0gPSAtX3NuICogdGhpcy5VW19pMjFdW19qN10gKyBfY3MgKiB0aGlzLlVbX2kyMV1bX2szIC0gMV07XG4gICAgICAgICAgICAgICAgdGhpcy5VW19pMjFdW19qN10gPSBfdDY7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgc2NhbGUgPSBNYXRoLm1heChNYXRoLm1heChNYXRoLm1heChNYXRoLm1heChNYXRoLmFicyh0aGlzLnNbcCAtIDFdKSwgTWF0aC5hYnModGhpcy5zW3AgLSAyXSkpLCBNYXRoLmFicyhlW3AgLSAyXSkpLCBNYXRoLmFicyh0aGlzLnNbX2szXSkpLCBNYXRoLmFicyhlW19rM10pKTtcbiAgICAgICAgICB2YXIgc3AgPSB0aGlzLnNbcCAtIDFdIC8gc2NhbGU7XG4gICAgICAgICAgdmFyIHNwbTEgPSB0aGlzLnNbcCAtIDJdIC8gc2NhbGU7XG4gICAgICAgICAgdmFyIGVwbTEgPSBlW3AgLSAyXSAvIHNjYWxlO1xuICAgICAgICAgIHZhciBzayA9IHRoaXMuc1tfazNdIC8gc2NhbGU7XG4gICAgICAgICAgdmFyIGVrID0gZVtfazNdIC8gc2NhbGU7XG4gICAgICAgICAgdmFyIGIgPSAoKHNwbTEgKyBzcCkgKiAoc3BtMSAtIHNwKSArIGVwbTEgKiBlcG0xKSAvIDIuMDtcbiAgICAgICAgICB2YXIgYyA9IHNwICogZXBtMSAqIChzcCAqIGVwbTEpO1xuICAgICAgICAgIHZhciBzaGlmdCA9IDAuMDtcbiAgICAgICAgICBpZiAoZnVuY3Rpb24gKGxocywgcmhzKSB7XG4gICAgICAgICAgICByZXR1cm4gbGhzIHx8IHJocztcbiAgICAgICAgICB9KGIgIT09IDAuMCwgYyAhPT0gMC4wKSkge1xuICAgICAgICAgICAgc2hpZnQgPSBNYXRoLnNxcnQoYiAqIGIgKyBjKTtcbiAgICAgICAgICAgIGlmIChiIDwgMC4wKSB7XG4gICAgICAgICAgICAgIHNoaWZ0ID0gLXNoaWZ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2hpZnQgPSBjIC8gKGIgKyBzaGlmdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBfZjIgPSAoc2sgKyBzcCkgKiAoc2sgLSBzcCkgKyBzaGlmdDtcbiAgICAgICAgICB2YXIgZyA9IHNrICogZWs7XG4gICAgICAgICAgZm9yICh2YXIgX2o4ID0gX2szOyBfajggPCBwIC0gMTsgX2o4KyspIHtcbiAgICAgICAgICAgIHZhciBfdDcgPSBTVkQuaHlwb3QoX2YyLCBnKTtcbiAgICAgICAgICAgIHZhciBfY3MyID0gX2YyIC8gX3Q3O1xuICAgICAgICAgICAgdmFyIF9zbjIgPSBnIC8gX3Q3O1xuICAgICAgICAgICAgaWYgKF9qOCAhPT0gX2szKSB7XG4gICAgICAgICAgICAgIGVbX2o4IC0gMV0gPSBfdDc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfZjIgPSBfY3MyICogdGhpcy5zW19qOF0gKyBfc24yICogZVtfajhdO1xuICAgICAgICAgICAgZVtfajhdID0gX2NzMiAqIGVbX2o4XSAtIF9zbjIgKiB0aGlzLnNbX2o4XTtcbiAgICAgICAgICAgIGcgPSBfc24yICogdGhpcy5zW19qOCArIDFdO1xuICAgICAgICAgICAgdGhpcy5zW19qOCArIDFdID0gX2NzMiAqIHRoaXMuc1tfajggKyAxXTtcbiAgICAgICAgICAgIGlmICh3YW50dikge1xuICAgICAgICAgICAgICBmb3IgKHZhciBfaTIyID0gMDsgX2kyMiA8IHRoaXMubjsgX2kyMisrKSB7XG4gICAgICAgICAgICAgICAgX3Q3ID0gX2NzMiAqIHRoaXMuVltfaTIyXVtfajhdICsgX3NuMiAqIHRoaXMuVltfaTIyXVtfajggKyAxXTtcbiAgICAgICAgICAgICAgICB0aGlzLlZbX2kyMl1bX2o4ICsgMV0gPSAtX3NuMiAqIHRoaXMuVltfaTIyXVtfajhdICsgX2NzMiAqIHRoaXMuVltfaTIyXVtfajggKyAxXTtcbiAgICAgICAgICAgICAgICB0aGlzLlZbX2kyMl1bX2o4XSA9IF90NztcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF90NyA9IFNWRC5oeXBvdChfZjIsIGcpO1xuICAgICAgICAgICAgX2NzMiA9IF9mMiAvIF90NztcbiAgICAgICAgICAgIF9zbjIgPSBnIC8gX3Q3O1xuICAgICAgICAgICAgdGhpcy5zW19qOF0gPSBfdDc7XG4gICAgICAgICAgICBfZjIgPSBfY3MyICogZVtfajhdICsgX3NuMiAqIHRoaXMuc1tfajggKyAxXTtcbiAgICAgICAgICAgIHRoaXMuc1tfajggKyAxXSA9IC1fc24yICogZVtfajhdICsgX2NzMiAqIHRoaXMuc1tfajggKyAxXTtcbiAgICAgICAgICAgIGcgPSBfc24yICogZVtfajggKyAxXTtcbiAgICAgICAgICAgIGVbX2o4ICsgMV0gPSBfY3MyICogZVtfajggKyAxXTtcbiAgICAgICAgICAgIGlmICh3YW50dSAmJiBfajggPCB0aGlzLm0gLSAxKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pMjMgPSAwOyBfaTIzIDwgdGhpcy5tOyBfaTIzKyspIHtcbiAgICAgICAgICAgICAgICBfdDcgPSBfY3MyICogdGhpcy5VW19pMjNdW19qOF0gKyBfc24yICogdGhpcy5VW19pMjNdW19qOCArIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVtfaTIzXVtfajggKyAxXSA9IC1fc24yICogdGhpcy5VW19pMjNdW19qOF0gKyBfY3MyICogdGhpcy5VW19pMjNdW19qOCArIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVtfaTIzXVtfajhdID0gX3Q3O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgZVtwIC0gMl0gPSBfZjI7XG4gICAgICAgICAgaXRlciA9IGl0ZXIgKyAxO1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0aGlzLnNbX2szXSA8PSAwLjApIHtcbiAgICAgICAgICAgIHRoaXMuc1tfazNdID0gdGhpcy5zW19rM10gPCAwLjAgPyAtdGhpcy5zW19rM10gOiAwLjA7XG4gICAgICAgICAgICBpZiAod2FudHYpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgX2kyNCA9IDA7IF9pMjQgPD0gcHA7IF9pMjQrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuVltfaTI0XVtfazNdID0gLXRoaXMuVltfaTI0XVtfazNdO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAoX2szIDwgcHApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNbX2szXSA+PSB0aGlzLnNbX2szICsgMV0pIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgX3Q4ID0gdGhpcy5zW19rM107XG4gICAgICAgICAgICB0aGlzLnNbX2szXSA9IHRoaXMuc1tfazMgKyAxXTtcbiAgICAgICAgICAgIHRoaXMuc1tfazMgKyAxXSA9IF90ODtcbiAgICAgICAgICAgIGlmICh3YW50diAmJiBfazMgPCB0aGlzLm4gLSAxKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pMjUgPSAwOyBfaTI1IDwgdGhpcy5uOyBfaTI1KyspIHtcbiAgICAgICAgICAgICAgICBfdDggPSB0aGlzLlZbX2kyNV1bX2szICsgMV07XG4gICAgICAgICAgICAgICAgdGhpcy5WW19pMjVdW19rMyArIDFdID0gdGhpcy5WW19pMjVdW19rM107XG4gICAgICAgICAgICAgICAgdGhpcy5WW19pMjVdW19rM10gPSBfdDg7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod2FudHUgJiYgX2szIDwgdGhpcy5tIC0gMSkge1xuICAgICAgICAgICAgICBmb3IgKHZhciBfaTI2ID0gMDsgX2kyNiA8IHRoaXMubTsgX2kyNisrKSB7XG4gICAgICAgICAgICAgICAgX3Q4ID0gdGhpcy5VW19pMjZdW19rMyArIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVtfaTI2XVtfazMgKyAxXSA9IHRoaXMuVVtfaTI2XVtfazNdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVtfaTI2XVtfazNdID0gX3Q4O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2szKys7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpdGVyID0gMDtcbiAgICAgICAgICBwLS07XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfTtcbiAgdmFyIHJlc3VsdCA9IHsgVTogdGhpcy5VLCBWOiB0aGlzLlYsIFM6IHRoaXMucyB9O1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gc3FydChhXjIgKyBiXjIpIHdpdGhvdXQgdW5kZXIvb3ZlcmZsb3cuXG5TVkQuaHlwb3QgPSBmdW5jdGlvbiAoYSwgYikge1xuICB2YXIgciA9IHZvaWQgMDtcbiAgaWYgKE1hdGguYWJzKGEpID4gTWF0aC5hYnMoYikpIHtcbiAgICByID0gYiAvIGE7XG4gICAgciA9IE1hdGguYWJzKGEpICogTWF0aC5zcXJ0KDEgKyByICogcik7XG4gIH0gZWxzZSBpZiAoYiAhPSAwKSB7XG4gICAgciA9IGEgLyBiO1xuICAgIHIgPSBNYXRoLmFicyhiKSAqIE1hdGguc3FydCgxICsgciAqIHIpO1xuICB9IGVsc2Uge1xuICAgIHIgPSAwLjA7XG4gIH1cbiAgcmV0dXJuIHI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNWRDtcblxuLyoqKi8gfSksXG4vKiAyNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG4vKipcbiAqICAgTmVlZGxlbWFuLVd1bnNjaCBhbGdvcml0aG0gaXMgYW4gcHJvY2VkdXJlIHRvIGNvbXB1dGUgdGhlIG9wdGltYWwgZ2xvYmFsIGFsaWdubWVudCBvZiB0d28gc3RyaW5nXG4gKiAgIHNlcXVlbmNlcyBieSBTLkIuTmVlZGxlbWFuIGFuZCBDLkQuV3Vuc2NoICgxOTcwKS5cbiAqXG4gKiAgIEFzaWRlIGZyb20gdGhlIGlucHV0cywgeW91IGNhbiBhc3NpZ24gdGhlIHNjb3JlcyBmb3IsXG4gKiAgIC0gTWF0Y2g6IFRoZSB0d28gY2hhcmFjdGVycyBhdCB0aGUgY3VycmVudCBpbmRleCBhcmUgc2FtZS5cbiAqICAgLSBNaXNtYXRjaDogVGhlIHR3byBjaGFyYWN0ZXJzIGF0IHRoZSBjdXJyZW50IGluZGV4IGFyZSBkaWZmZXJlbnQuXG4gKiAgIC0gSW5zZXJ0aW9uL0RlbGV0aW9uKGdhcHMpOiBUaGUgYmVzdCBhbGlnbm1lbnQgaW52b2x2ZXMgb25lIGxldHRlciBhbGlnbmluZyB0byBhIGdhcCBpbiB0aGUgb3RoZXIgc3RyaW5nLlxuICovXG5cbnZhciBOZWVkbGVtYW5XdW5zY2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmVlZGxlbWFuV3Vuc2NoKHNlcXVlbmNlMSwgc2VxdWVuY2UyKSB7XG4gICAgICAgIHZhciBtYXRjaF9zY29yZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogMTtcbiAgICAgICAgdmFyIG1pc21hdGNoX3BlbmFsdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IC0xO1xuICAgICAgICB2YXIgZ2FwX3BlbmFsdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IC0xO1xuXG4gICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOZWVkbGVtYW5XdW5zY2gpO1xuXG4gICAgICAgIHRoaXMuc2VxdWVuY2UxID0gc2VxdWVuY2UxO1xuICAgICAgICB0aGlzLnNlcXVlbmNlMiA9IHNlcXVlbmNlMjtcbiAgICAgICAgdGhpcy5tYXRjaF9zY29yZSA9IG1hdGNoX3Njb3JlO1xuICAgICAgICB0aGlzLm1pc21hdGNoX3BlbmFsdHkgPSBtaXNtYXRjaF9wZW5hbHR5O1xuICAgICAgICB0aGlzLmdhcF9wZW5hbHR5ID0gZ2FwX3BlbmFsdHk7XG5cbiAgICAgICAgLy8gSnVzdCB0aGUgcmVtb3ZlIHJlZHVuZGFuY3lcbiAgICAgICAgdGhpcy5pTWF4ID0gc2VxdWVuY2UxLmxlbmd0aCArIDE7XG4gICAgICAgIHRoaXMuak1heCA9IHNlcXVlbmNlMi5sZW5ndGggKyAxO1xuXG4gICAgICAgIC8vIEdyaWQgbWF0cml4IG9mIHNjb3Jlc1xuICAgICAgICB0aGlzLmdyaWQgPSBuZXcgQXJyYXkodGhpcy5pTWF4KTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmlNYXg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5ncmlkW2ldID0gbmV3IEFycmF5KHRoaXMuak1heCk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5qTWF4OyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRbaV1bal0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhY2ViYWNrIG1hdHJpeCAoMkQgYXJyYXksIGVhY2ggY2VsbCBpcyBhbiBhcnJheSBvZiBib29sZWFuIHZhbHVlcyBmb3IgW2BEaWFnYCwgYFVwYCwgYExlZnRgXSBwb3NpdGlvbnMpXG4gICAgICAgIHRoaXMudHJhY2ViYWNrR3JpZCA9IG5ldyBBcnJheSh0aGlzLmlNYXgpO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdGhpcy5pTWF4OyBfaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNlYmFja0dyaWRbX2ldID0gbmV3IEFycmF5KHRoaXMuak1heCk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCB0aGlzLmpNYXg7IF9qKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYWNlYmFja0dyaWRbX2ldW19qXSA9IFtudWxsLCBudWxsLCBudWxsXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBhbGlnbmVkIHNlcXVlbmNlcyAocmV0dXJuIG11bHRpcGxlIHBvc3NpYmlsaXRpZXMpXG4gICAgICAgIHRoaXMuYWxpZ25tZW50cyA9IFtdO1xuXG4gICAgICAgIC8vIEZpbmFsIGFsaWdubWVudCBzY29yZVxuICAgICAgICB0aGlzLnNjb3JlID0gLTE7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHNjb3JlcyBhbmQgdHJhY2ViYWNrc1xuICAgICAgICB0aGlzLmNvbXB1dGVHcmlkcygpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhOZWVkbGVtYW5XdW5zY2gsIFt7XG4gICAgICAgIGtleTogXCJnZXRTY29yZVwiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2NvcmUoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zY29yZTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiBcImdldEFsaWdubWVudHNcIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFsaWdubWVudHMoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hbGlnbm1lbnRzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFpbiBkeW5hbWljIHByb2dyYW1taW5nIHByb2NlZHVyZVxuXG4gICAgfSwge1xuICAgICAgICBrZXk6IFwiY29tcHV0ZUdyaWRzXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wdXRlR3JpZHMoKSB7XG4gICAgICAgICAgICAvLyBGaWxsIGluIHRoZSBmaXJzdCByb3dcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgdGhpcy5qTWF4OyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRbMF1bal0gPSB0aGlzLmdyaWRbMF1baiAtIDFdICsgdGhpcy5nYXBfcGVuYWx0eTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYWNlYmFja0dyaWRbMF1bal0gPSBbZmFsc2UsIGZhbHNlLCB0cnVlXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmlsbCBpbiB0aGUgZmlyc3QgY29sdW1uXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHRoaXMuaU1heDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkW2ldWzBdID0gdGhpcy5ncmlkW2kgLSAxXVswXSArIHRoaXMuZ2FwX3BlbmFsdHk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFjZWJhY2tHcmlkW2ldWzBdID0gW2ZhbHNlLCB0cnVlLCBmYWxzZV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpbGwgdGhlIHJlc3Qgb2YgdGhlIGdyaWRcbiAgICAgICAgICAgIGZvciAodmFyIF9pMiA9IDE7IF9pMiA8IHRoaXMuaU1heDsgX2kyKyspIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfajIgPSAxOyBfajIgPCB0aGlzLmpNYXg7IF9qMisrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIG1heCBzY29yZShzKSBhbW9uZyBbYERpYWdgLCBgVXBgLCBgTGVmdGBdXG4gICAgICAgICAgICAgICAgICAgIHZhciBkaWFnID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXF1ZW5jZTFbX2kyIC0gMV0gPT09IHRoaXMuc2VxdWVuY2UyW19qMiAtIDFdKSBkaWFnID0gdGhpcy5ncmlkW19pMiAtIDFdW19qMiAtIDFdICsgdGhpcy5tYXRjaF9zY29yZTtlbHNlIGRpYWcgPSB0aGlzLmdyaWRbX2kyIC0gMV1bX2oyIC0gMV0gKyB0aGlzLm1pc21hdGNoX3BlbmFsdHk7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHVwID0gdGhpcy5ncmlkW19pMiAtIDFdW19qMl0gKyB0aGlzLmdhcF9wZW5hbHR5O1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGVmdCA9IHRoaXMuZ3JpZFtfaTJdW19qMiAtIDFdICsgdGhpcy5nYXBfcGVuYWx0eTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBleGlzdHMgbXVsdGlwbGUgbWF4IHZhbHVlcywgY2FwdHVyZSB0aGVtIGZvciBtdWx0aXBsZSBwYXRoc1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWF4T2YgPSBbZGlhZywgdXAsIGxlZnRdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kaWNlcyA9IHRoaXMuYXJyYXlBbGxNYXhJbmRleGVzKG1heE9mKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgR3JpZHNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkW19pMl1bX2oyXSA9IG1heE9mW2luZGljZXNbMF1dO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYWNlYmFja0dyaWRbX2kyXVtfajJdID0gW2luZGljZXMuaW5jbHVkZXMoMCksIGluZGljZXMuaW5jbHVkZXMoMSksIGluZGljZXMuaW5jbHVkZXMoMildO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIGFsaWdubWVudCBzY29yZVxuICAgICAgICAgICAgdGhpcy5zY29yZSA9IHRoaXMuZ3JpZFt0aGlzLmlNYXggLSAxXVt0aGlzLmpNYXggLSAxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldHMgYWxsIHBvc3NpYmxlIHZhbGlkIHNlcXVlbmNlIGNvbWJpbmF0aW9uc1xuXG4gICAgfSwge1xuICAgICAgICBrZXk6IFwiYWxpZ25tZW50VHJhY2ViYWNrXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBhbGlnbm1lbnRUcmFjZWJhY2soKSB7XG4gICAgICAgICAgICB2YXIgaW5Qcm9jZXNzQWxpZ25tZW50cyA9IFtdO1xuXG4gICAgICAgICAgICBpblByb2Nlc3NBbGlnbm1lbnRzLnB1c2goeyBwb3M6IFt0aGlzLnNlcXVlbmNlMS5sZW5ndGgsIHRoaXMuc2VxdWVuY2UyLmxlbmd0aF0sXG4gICAgICAgICAgICAgICAgc2VxMTogXCJcIixcbiAgICAgICAgICAgICAgICBzZXEyOiBcIlwiXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgd2hpbGUgKGluUHJvY2Vzc0FsaWdubWVudHNbMF0pIHtcbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudCA9IGluUHJvY2Vzc0FsaWdubWVudHNbMF07XG4gICAgICAgICAgICAgICAgdmFyIGRpcmVjdGlvbnMgPSB0aGlzLnRyYWNlYmFja0dyaWRbY3VycmVudC5wb3NbMF1dW2N1cnJlbnQucG9zWzFdXTtcblxuICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb25zWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGluUHJvY2Vzc0FsaWdubWVudHMucHVzaCh7IHBvczogW2N1cnJlbnQucG9zWzBdIC0gMSwgY3VycmVudC5wb3NbMV0gLSAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcTE6IHRoaXMuc2VxdWVuY2UxW2N1cnJlbnQucG9zWzBdIC0gMV0gKyBjdXJyZW50LnNlcTEsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXEyOiB0aGlzLnNlcXVlbmNlMltjdXJyZW50LnBvc1sxXSAtIDFdICsgY3VycmVudC5zZXEyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICBpblByb2Nlc3NBbGlnbm1lbnRzLnB1c2goeyBwb3M6IFtjdXJyZW50LnBvc1swXSAtIDEsIGN1cnJlbnQucG9zWzFdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcTE6IHRoaXMuc2VxdWVuY2UxW2N1cnJlbnQucG9zWzBdIC0gMV0gKyBjdXJyZW50LnNlcTEsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXEyOiAnLScgKyBjdXJyZW50LnNlcTJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb25zWzJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGluUHJvY2Vzc0FsaWdubWVudHMucHVzaCh7IHBvczogW2N1cnJlbnQucG9zWzBdLCBjdXJyZW50LnBvc1sxXSAtIDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VxMTogJy0nICsgY3VycmVudC5zZXExLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VxMjogdGhpcy5zZXF1ZW5jZTJbY3VycmVudC5wb3NbMV0gLSAxXSArIGN1cnJlbnQuc2VxMlxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5wb3NbMF0gPT09IDAgJiYgY3VycmVudC5wb3NbMV0gPT09IDApIHRoaXMuYWxpZ25tZW50cy5wdXNoKHsgc2VxdWVuY2UxOiBjdXJyZW50LnNlcTEsXG4gICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlMjogY3VycmVudC5zZXEyXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpblByb2Nlc3NBbGlnbm1lbnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFsaWdubWVudHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIZWxwZXIgRnVuY3Rpb25zXG5cbiAgICB9LCB7XG4gICAgICAgIGtleTogXCJnZXRBbGxJbmRleGVzXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBbGxJbmRleGVzKGFyciwgdmFsKSB7XG4gICAgICAgICAgICB2YXIgaW5kZXhlcyA9IFtdLFxuICAgICAgICAgICAgICAgIGkgPSAtMTtcbiAgICAgICAgICAgIHdoaWxlICgoaSA9IGFyci5pbmRleE9mKHZhbCwgaSArIDEpKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpbmRleGVzLnB1c2goaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW5kZXhlcztcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiBcImFycmF5QWxsTWF4SW5kZXhlc1wiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gYXJyYXlBbGxNYXhJbmRleGVzKGFycmF5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBbGxJbmRleGVzKGFycmF5LCBNYXRoLm1heC5hcHBseShudWxsLCBhcnJheSkpO1xuICAgICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIE5lZWRsZW1hbld1bnNjaDtcbn0oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOZWVkbGVtYW5XdW5zY2g7XG5cbi8qKiovIH0pLFxuLyogMjggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGxheW91dEJhc2UgPSBmdW5jdGlvbiBsYXlvdXRCYXNlKCkge1xuICByZXR1cm47XG59O1xuXG5sYXlvdXRCYXNlLkZETGF5b3V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7XG5sYXlvdXRCYXNlLkZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbmxheW91dEJhc2UuRkRMYXlvdXRFZGdlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSk7XG5sYXlvdXRCYXNlLkZETGF5b3V0Tm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjApO1xubGF5b3V0QmFzZS5EaW1lbnNpb25EID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMSk7XG5sYXlvdXRCYXNlLkhhc2hNYXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKTtcbmxheW91dEJhc2UuSGFzaFNldCA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpO1xubGF5b3V0QmFzZS5JR2VvbWV0cnkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xubGF5b3V0QmFzZS5JTWF0aCA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5sYXlvdXRCYXNlLkludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcbmxheW91dEJhc2UuUG9pbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKTtcbmxheW91dEJhc2UuUG9pbnREID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcbmxheW91dEJhc2UuUmFuZG9tU2VlZCA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpO1xubGF5b3V0QmFzZS5SZWN0YW5nbGVEID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7XG5sYXlvdXRCYXNlLlRyYW5zZm9ybSA9IF9fd2VicGFja19yZXF1aXJlX18oMTcpO1xubGF5b3V0QmFzZS5VbmlxdWVJREdlbmVyZXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xubGF5b3V0QmFzZS5RdWlja3NvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTtcbmxheW91dEJhc2UuTGlua2VkTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xubGF5b3V0QmFzZS5MR3JhcGhPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xubGF5b3V0QmFzZS5MR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xubGF5b3V0QmFzZS5MRWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5sYXlvdXRCYXNlLkxHcmFwaE1hbmFnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xubGF5b3V0QmFzZS5MTm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5sYXlvdXRCYXNlLkxheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpO1xubGF5b3V0QmFzZS5MYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xubGF5b3V0QmFzZS5OZWVkbGVtYW5XdW5zY2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KTtcbmxheW91dEJhc2UuTWF0cml4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7XG5sYXlvdXRCYXNlLlNWRCA9IF9fd2VicGFja19yZXF1aXJlX18oMjYpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxheW91dEJhc2U7XG5cbi8qKiovIH0pLFxuLyogMjkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gRW1pdHRlcigpIHtcbiAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbn1cblxudmFyIHAgPSBFbWl0dGVyLnByb3RvdHlwZTtcblxucC5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCwgY2FsbGJhY2spIHtcbiAgdGhpcy5saXN0ZW5lcnMucHVzaCh7XG4gICAgZXZlbnQ6IGV2ZW50LFxuICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuICB9KTtcbn07XG5cbnAucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGNhbGxiYWNrKSB7XG4gIGZvciAodmFyIGkgPSB0aGlzLmxpc3RlbmVycy5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGwgPSB0aGlzLmxpc3RlbmVyc1tpXTtcblxuICAgIGlmIChsLmV2ZW50ID09PSBldmVudCAmJiBsLmNhbGxiYWNrID09PSBjYWxsYmFjaykge1xuICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfVxufTtcblxucC5lbWl0ID0gZnVuY3Rpb24gKGV2ZW50LCBkYXRhKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5saXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbCA9IHRoaXMubGlzdGVuZXJzW2ldO1xuXG4gICAgaWYgKGV2ZW50ID09PSBsLmV2ZW50KSB7XG4gICAgICBsLmNhbGxiYWNrKGRhdGEpO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFbWl0dGVyO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG59KTsiLCIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIGBUeXBlRXJyb3JgIG1lc3NhZ2UgZm9yIFwiRnVuY3Rpb25zXCIgbWV0aG9kcy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKiBVc2VkIGFzIHRoZSBpbnRlcm5hbCBhcmd1bWVudCBwbGFjZWhvbGRlci4gKi9cbnZhciBQTEFDRUhPTERFUiA9ICdfX2xvZGFzaF9wbGFjZWhvbGRlcl9fJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgZnVuY3Rpb24gbWV0YWRhdGEuICovXG52YXIgQklORF9GTEFHID0gMSxcbiAgICBCSU5EX0tFWV9GTEFHID0gMixcbiAgICBDVVJSWV9CT1VORF9GTEFHID0gNCxcbiAgICBDVVJSWV9GTEFHID0gOCxcbiAgICBDVVJSWV9SSUdIVF9GTEFHID0gMTYsXG4gICAgUEFSVElBTF9GTEFHID0gMzIsXG4gICAgUEFSVElBTF9SSUdIVF9GTEFHID0gNjQsXG4gICAgQVJZX0ZMQUcgPSAxMjgsXG4gICAgUkVBUkdfRkxBRyA9IDI1NixcbiAgICBGTElQX0ZMQUcgPSA1MTI7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTEsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCxcbiAgICBOQU4gPSAwIC8gMDtcblxuLyoqIFVzZWQgdG8gYXNzb2NpYXRlIHdyYXAgbWV0aG9kcyB3aXRoIHRoZWlyIGJpdCBmbGFncy4gKi9cbnZhciB3cmFwRmxhZ3MgPSBbXG4gIFsnYXJ5JywgQVJZX0ZMQUddLFxuICBbJ2JpbmQnLCBCSU5EX0ZMQUddLFxuICBbJ2JpbmRLZXknLCBCSU5EX0tFWV9GTEFHXSxcbiAgWydjdXJyeScsIENVUlJZX0ZMQUddLFxuICBbJ2N1cnJ5UmlnaHQnLCBDVVJSWV9SSUdIVF9GTEFHXSxcbiAgWydmbGlwJywgRkxJUF9GTEFHXSxcbiAgWydwYXJ0aWFsJywgUEFSVElBTF9GTEFHXSxcbiAgWydwYXJ0aWFsUmlnaHQnLCBQQVJUSUFMX1JJR0hUX0ZMQUddLFxuICBbJ3JlYXJnJywgUkVBUkdfRkxBR11cbl07XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKipcbiAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGBcbiAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICovXG52YXIgcmVSZWdFeHBDaGFyID0gL1tcXFxcXiQuKis/KClbXFxde318XS9nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBtYXRjaCB3cmFwIGRldGFpbCBjb21tZW50cy4gKi9cbnZhciByZVdyYXBDb21tZW50ID0gL1xceyg/OlxcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggLitcXF0gXFwqXFwvKT9cXG4/LyxcbiAgICByZVdyYXBEZXRhaWxzID0gL1xce1xcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggKC4rKVxcXSBcXCovLFxuICAgIHJlU3BsaXREZXRhaWxzID0gLyw/ICYgLztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG52YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xudmFyIHJlSXNVaW50ID0gL14oPzowfFsxLTldXFxkKikkLztcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4vKipcbiAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICovXG5mdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG59XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBhcnJheUVhY2goYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluY2x1ZGVzYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIHNwZWNpZnlpbmcgYW4gaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheUluY2x1ZGVzKGFycmF5LCB2YWx1ZSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuICByZXR1cm4gISFsZW5ndGggJiYgYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCAwKSA+IC0xO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgaWYgKHZhbHVlICE9PSB2YWx1ZSkge1xuICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG4gIH1cbiAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBudW1iZXIgb2YgYHBsYWNlaG9sZGVyYCBvY2N1cnJlbmNlcyBpbiBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciBjb3VudC5cbiAqL1xuZnVuY3Rpb24gY291bnRIb2xkZXJzKGFycmF5LCBwbGFjZWhvbGRlcikge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gMDtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBpZiAoYXJyYXlbbGVuZ3RoXSA9PT0gcGxhY2Vob2xkZXIpIHtcbiAgICAgIHJlc3VsdCsrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGhvc3Qgb2JqZWN0IGluIElFIDwgOS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGhvc3Qgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSG9zdE9iamVjdCh2YWx1ZSkge1xuICAvLyBNYW55IGhvc3Qgb2JqZWN0cyBhcmUgYE9iamVjdGAgb2JqZWN0cyB0aGF0IGNhbiBjb2VyY2UgdG8gc3RyaW5nc1xuICAvLyBkZXNwaXRlIGhhdmluZyBpbXByb3Blcmx5IGRlZmluZWQgYHRvU3RyaW5nYCBtZXRob2RzLlxuICB2YXIgcmVzdWx0ID0gZmFsc2U7XG4gIGlmICh2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9ICEhKHZhbHVlICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXBsYWNlcyBhbGwgYHBsYWNlaG9sZGVyYCBlbGVtZW50cyBpbiBgYXJyYXlgIHdpdGggYW4gaW50ZXJuYWwgcGxhY2Vob2xkZXJcbiAqIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZWlyIGluZGV4ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB0byByZXBsYWNlLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgaWYgKHZhbHVlID09PSBwbGFjZWhvbGRlciB8fCB2YWx1ZSA9PT0gUExBQ0VIT0xERVIpIHtcbiAgICAgIGFycmF5W2luZGV4XSA9IFBMQUNFSE9MREVSO1xuICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovXG52YXIgY29yZUpzRGF0YSA9IHJvb3RbJ19fY29yZS1qc19zaGFyZWRfXyddO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqL1xudmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJztcbn0oKSk7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xudmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qIFVzZWQgdG8gc2V0IGB0b1N0cmluZ2AgbWV0aG9kcy4gKi9cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHtcbiAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKSxcbiAgICAgIG5hbWUgPSBnZXROYXRpdmUubmFtZTtcblxuICByZXR1cm4gKG5hbWUgJiYgbmFtZS5sZW5ndGggPiAyKSA/IGZ1bmMgOiB1bmRlZmluZWQ7XG59KCkpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNyZWF0ZWAgd2l0aG91dCBzdXBwb3J0IGZvciBhc3NpZ25pbmdcbiAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvdG90eXBlIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZUNyZWF0ZShwcm90bykge1xuICByZXR1cm4gaXNPYmplY3QocHJvdG8pID8gb2JqZWN0Q3JlYXRlKHByb3RvKSA6IHt9O1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHBhdHRlcm4gPSAoaXNGdW5jdGlvbih2YWx1ZSkgfHwgaXNIb3N0T2JqZWN0KHZhbHVlKSkgPyByZUlzTmF0aXZlIDogcmVJc0hvc3RDdG9yO1xuICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSB0aGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMsXG4gKiBwbGFjZWhvbGRlcnMsIGFuZCBwcm92aWRlZCBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBhcnJheSBvZiBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqIEBwYXJhbXMge2Jvb2xlYW59IFtpc0N1cnJpZWRdIFNwZWNpZnkgY29tcG9zaW5nIGZvciBhIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VBcmdzKGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpIHtcbiAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgYXJnc0xlbmd0aCA9IGFyZ3MubGVuZ3RoLFxuICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgbGVmdEluZGV4ID0gLTEsXG4gICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgcmFuZ2VMZW5ndGggPSBuYXRpdmVNYXgoYXJnc0xlbmd0aCAtIGhvbGRlcnNMZW5ndGgsIDApLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVmdExlbmd0aCArIHJhbmdlTGVuZ3RoKSxcbiAgICAgIGlzVW5jdXJyaWVkID0gIWlzQ3VycmllZDtcblxuICB3aGlsZSAoKytsZWZ0SW5kZXggPCBsZWZ0TGVuZ3RoKSB7XG4gICAgcmVzdWx0W2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2FyZ3NJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgcmVzdWx0W2hvbGRlcnNbYXJnc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleF07XG4gICAgfVxuICB9XG4gIHdoaWxlIChyYW5nZUxlbmd0aC0tKSB7XG4gICAgcmVzdWx0W2xlZnRJbmRleCsrXSA9IGFyZ3NbYXJnc0luZGV4KytdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBjb21wb3NlQXJnc2AgZXhjZXB0IHRoYXQgdGhlIGFyZ3VtZW50cyBjb21wb3NpdGlvblxuICogaXMgdGFpbG9yZWQgZm9yIGBfLnBhcnRpYWxSaWdodGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICogQHBhcmFtIHtBcnJheX0gaG9sZGVycyBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICogQHBhcmFtcyB7Ym9vbGVhbn0gW2lzQ3VycmllZF0gU3BlY2lmeSBjb21wb3NpbmcgZm9yIGEgY3VycmllZCBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFscywgaG9sZGVycywgaXNDdXJyaWVkKSB7XG4gIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgIGhvbGRlcnNJbmRleCA9IC0xLFxuICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgcmlnaHRJbmRleCA9IC0xLFxuICAgICAgcmlnaHRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsXG4gICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICByZXN1bHQgPSBBcnJheShyYW5nZUxlbmd0aCArIHJpZ2h0TGVuZ3RoKSxcbiAgICAgIGlzVW5jdXJyaWVkID0gIWlzQ3VycmllZDtcblxuICB3aGlsZSAoKythcmdzSW5kZXggPCByYW5nZUxlbmd0aCkge1xuICAgIHJlc3VsdFthcmdzSW5kZXhdID0gYXJnc1thcmdzSW5kZXhdO1xuICB9XG4gIHZhciBvZmZzZXQgPSBhcmdzSW5kZXg7XG4gIHdoaWxlICgrK3JpZ2h0SW5kZXggPCByaWdodExlbmd0aCkge1xuICAgIHJlc3VsdFtvZmZzZXQgKyByaWdodEluZGV4XSA9IHBhcnRpYWxzW3JpZ2h0SW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2hvbGRlcnNJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgcmVzdWx0W29mZnNldCArIGhvbGRlcnNbaG9sZGVyc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXk9W11dIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyB0by5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgYXJyYXkgfHwgKGFycmF5ID0gQXJyYXkobGVuZ3RoKSk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBvcHRpb25hbCBgdGhpc2BcbiAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVCaW5kKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcpIHtcbiAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBCSU5EX0ZMQUcsXG4gICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgcmV0dXJuIGZuLmFwcGx5KGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmd1bWVudHMpO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGluc3RhbmNlIG9mIGBDdG9yYCByZWdhcmRsZXNzIG9mXG4gKiB3aGV0aGVyIGl0IHdhcyBpbnZva2VkIGFzIHBhcnQgb2YgYSBgbmV3YCBleHByZXNzaW9uIG9yIGJ5IGBjYWxsYCBvciBgYXBwbHlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBDdG9yIFRoZSBjb25zdHJ1Y3RvciB0byB3cmFwLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ3RvcihDdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAvLyBVc2UgYSBgc3dpdGNoYCBzdGF0ZW1lbnQgdG8gd29yayB3aXRoIGNsYXNzIGNvbnN0cnVjdG9ycy4gU2VlXG4gICAgLy8gaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1mdW5jdGlvbi1vYmplY3RzLWNhbGwtdGhpc2FyZ3VtZW50LWFyZ3VtZW50c2xpc3RcbiAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBDdG9yO1xuICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSk7XG4gICAgICBjYXNlIDI6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICBjYXNlIDU6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdKTtcbiAgICAgIGNhc2UgNjogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pO1xuICAgICAgY2FzZSA3OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSwgYXJnc1s2XSk7XG4gICAgfVxuICAgIHZhciB0aGlzQmluZGluZyA9IGJhc2VDcmVhdGUoQ3Rvci5wcm90b3R5cGUpLFxuICAgICAgICByZXN1bHQgPSBDdG9yLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcblxuICAgIC8vIE1pbWljIHRoZSBjb25zdHJ1Y3RvcidzIGByZXR1cm5gIGJlaGF2aW9yLlxuICAgIC8vIFNlZSBodHRwczovL2VzNS5naXRodWIuaW8vI3gxMy4yLjIgZm9yIG1vcmUgZGV0YWlscy5cbiAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IHRoaXNCaW5kaW5nO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBlbmFibGUgY3VycnlpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtudW1iZXJ9IGFyaXR5IFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSkge1xuICB2YXIgQ3RvciA9IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgYXJncyA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgIGluZGV4ID0gbGVuZ3RoLFxuICAgICAgICBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKTtcblxuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgfVxuICAgIHZhciBob2xkZXJzID0gKGxlbmd0aCA8IDMgJiYgYXJnc1swXSAhPT0gcGxhY2Vob2xkZXIgJiYgYXJnc1tsZW5ndGggLSAxXSAhPT0gcGxhY2Vob2xkZXIpXG4gICAgICA/IFtdXG4gICAgICA6IHJlcGxhY2VIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcblxuICAgIGxlbmd0aCAtPSBob2xkZXJzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoIDwgYXJpdHkpIHtcbiAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICBmdW5jLCBiaXRtYXNrLCBjcmVhdGVIeWJyaWQsIHdyYXBwZXIucGxhY2Vob2xkZXIsIHVuZGVmaW5lZCxcbiAgICAgICAgYXJncywgaG9sZGVycywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFyaXR5IC0gbGVuZ3RoKTtcbiAgICB9XG4gICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICByZXR1cm4gYXBwbHkoZm4sIHRoaXMsIGFyZ3MpO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXQgd2l0aCBvcHRpb25hbCBgdGhpc2BcbiAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLCBwYXJ0aWFsIGFwcGxpY2F0aW9uLCBhbmQgY3VycnlpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICogIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc1JpZ2h0XSBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZFxuICogIHRvIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc1JpZ2h0XSBUaGUgYHBhcnRpYWxzUmlnaHRgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSHlicmlkKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICB2YXIgaXNBcnkgPSBiaXRtYXNrICYgQVJZX0ZMQUcsXG4gICAgICBpc0JpbmQgPSBiaXRtYXNrICYgQklORF9GTEFHLFxuICAgICAgaXNCaW5kS2V5ID0gYml0bWFzayAmIEJJTkRfS0VZX0ZMQUcsXG4gICAgICBpc0N1cnJpZWQgPSBiaXRtYXNrICYgKENVUlJZX0ZMQUcgfCBDVVJSWV9SSUdIVF9GTEFHKSxcbiAgICAgIGlzRmxpcCA9IGJpdG1hc2sgJiBGTElQX0ZMQUcsXG4gICAgICBDdG9yID0gaXNCaW5kS2V5ID8gdW5kZWZpbmVkIDogY3JlYXRlQ3RvcihmdW5jKTtcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICBhcmdzID0gQXJyYXkobGVuZ3RoKSxcbiAgICAgICAgaW5kZXggPSBsZW5ndGg7XG5cbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgYXJnc1tpbmRleF0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgIH1cbiAgICBpZiAoaXNDdXJyaWVkKSB7XG4gICAgICB2YXIgcGxhY2Vob2xkZXIgPSBnZXRIb2xkZXIod3JhcHBlciksXG4gICAgICAgICAgaG9sZGVyc0NvdW50ID0gY291bnRIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcbiAgICB9XG4gICAgaWYgKHBhcnRpYWxzKSB7XG4gICAgICBhcmdzID0gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCk7XG4gICAgfVxuICAgIGlmIChwYXJ0aWFsc1JpZ2h0KSB7XG4gICAgICBhcmdzID0gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGlzQ3VycmllZCk7XG4gICAgfVxuICAgIGxlbmd0aCAtPSBob2xkZXJzQ291bnQ7XG4gICAgaWYgKGlzQ3VycmllZCAmJiBsZW5ndGggPCBhcml0eSkge1xuICAgICAgdmFyIG5ld0hvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7XG4gICAgICByZXR1cm4gY3JlYXRlUmVjdXJyeShcbiAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB0aGlzQXJnLFxuICAgICAgICBhcmdzLCBuZXdIb2xkZXJzLCBhcmdQb3MsIGFyeSwgYXJpdHkgLSBsZW5ndGhcbiAgICAgICk7XG4gICAgfVxuICAgIHZhciB0aGlzQmluZGluZyA9IGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLFxuICAgICAgICBmbiA9IGlzQmluZEtleSA/IHRoaXNCaW5kaW5nW2Z1bmNdIDogZnVuYztcblxuICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuICAgIGlmIChhcmdQb3MpIHtcbiAgICAgIGFyZ3MgPSByZW9yZGVyKGFyZ3MsIGFyZ1Bvcyk7XG4gICAgfSBlbHNlIGlmIChpc0ZsaXAgJiYgbGVuZ3RoID4gMSkge1xuICAgICAgYXJncy5yZXZlcnNlKCk7XG4gICAgfVxuICAgIGlmIChpc0FyeSAmJiBhcnkgPCBsZW5ndGgpIHtcbiAgICAgIGFyZ3MubGVuZ3RoID0gYXJ5O1xuICAgIH1cbiAgICBpZiAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSB7XG4gICAgICBmbiA9IEN0b3IgfHwgY3JlYXRlQ3Rvcihmbik7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzQmluZGluZywgYXJncyk7XG4gIH1cbiAgcmV0dXJuIHdyYXBwZXI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZ1xuICogb2YgYHRoaXNBcmdgIGFuZCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVBhcnRpYWwoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMpIHtcbiAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBCSU5EX0ZMQUcsXG4gICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgIGxlZnRJbmRleCA9IC0xLFxuICAgICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgICBhcmdzID0gQXJyYXkobGVmdExlbmd0aCArIGFyZ3NMZW5ndGgpLFxuICAgICAgICBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG5cbiAgICB3aGlsZSAoKytsZWZ0SW5kZXggPCBsZWZ0TGVuZ3RoKSB7XG4gICAgICBhcmdzW2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgIH1cbiAgICB3aGlsZSAoYXJnc0xlbmd0aC0tKSB7XG4gICAgICBhcmdzW2xlZnRJbmRleCsrXSA9IGFyZ3VtZW50c1srK2FyZ3NJbmRleF07XG4gICAgfVxuICAgIHJldHVybiBhcHBseShmbiwgaXNCaW5kID8gdGhpc0FyZyA6IHRoaXMsIGFyZ3MpO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBjb250aW51ZSBjdXJyeWluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwRnVuYyBUaGUgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBgZnVuY2Agd3JhcHBlci5cbiAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJlY3VycnkoZnVuYywgYml0bWFzaywgd3JhcEZ1bmMsIHBsYWNlaG9sZGVyLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gIHZhciBpc0N1cnJ5ID0gYml0bWFzayAmIENVUlJZX0ZMQUcsXG4gICAgICBuZXdIb2xkZXJzID0gaXNDdXJyeSA/IGhvbGRlcnMgOiB1bmRlZmluZWQsXG4gICAgICBuZXdIb2xkZXJzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogaG9sZGVycyxcbiAgICAgIG5ld1BhcnRpYWxzID0gaXNDdXJyeSA/IHBhcnRpYWxzIDogdW5kZWZpbmVkLFxuICAgICAgbmV3UGFydGlhbHNSaWdodCA9IGlzQ3VycnkgPyB1bmRlZmluZWQgOiBwYXJ0aWFscztcblxuICBiaXRtYXNrIHw9IChpc0N1cnJ5ID8gUEFSVElBTF9GTEFHIDogUEFSVElBTF9SSUdIVF9GTEFHKTtcbiAgYml0bWFzayAmPSB+KGlzQ3VycnkgPyBQQVJUSUFMX1JJR0hUX0ZMQUcgOiBQQVJUSUFMX0ZMQUcpO1xuXG4gIGlmICghKGJpdG1hc2sgJiBDVVJSWV9CT1VORF9GTEFHKSkge1xuICAgIGJpdG1hc2sgJj0gfihCSU5EX0ZMQUcgfCBCSU5EX0tFWV9GTEFHKTtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSB3cmFwRnVuYyhmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBuZXdQYXJ0aWFscywgbmV3SG9sZGVycywgbmV3UGFydGlhbHNSaWdodCwgbmV3SG9sZGVyc1JpZ2h0LCBhcmdQb3MsIGFyeSwgYXJpdHkpO1xuICByZXN1bHQucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsIGZ1bmMsIGJpdG1hc2spO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGVpdGhlciBjdXJyaWVzIG9yIGludm9rZXMgYGZ1bmNgIHdpdGggb3B0aW9uYWxcbiAqIGB0aGlzYCBiaW5kaW5nIGFuZCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gKiAgVGhlIGJpdG1hc2sgbWF5IGJlIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6XG4gKiAgICAgMSAtIGBfLmJpbmRgXG4gKiAgICAgMiAtIGBfLmJpbmRLZXlgXG4gKiAgICAgNCAtIGBfLmN1cnJ5YCBvciBgXy5jdXJyeVJpZ2h0YCBvZiBhIGJvdW5kIGZ1bmN0aW9uXG4gKiAgICAgOCAtIGBfLmN1cnJ5YFxuICogICAgMTYgLSBgXy5jdXJyeVJpZ2h0YFxuICogICAgMzIgLSBgXy5wYXJ0aWFsYFxuICogICAgNjQgLSBgXy5wYXJ0aWFsUmlnaHRgXG4gKiAgIDEyOCAtIGBfLnJlYXJnYFxuICogICAyNTYgLSBgXy5hcnlgXG4gKiAgIDUxMiAtIGBfLmZsaXBgXG4gKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlV3JhcChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gIHZhciBpc0JpbmRLZXkgPSBiaXRtYXNrICYgQklORF9LRVlfRkxBRztcbiAgaWYgKCFpc0JpbmRLZXkgJiYgdHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB2YXIgbGVuZ3RoID0gcGFydGlhbHMgPyBwYXJ0aWFscy5sZW5ndGggOiAwO1xuICBpZiAoIWxlbmd0aCkge1xuICAgIGJpdG1hc2sgJj0gfihQQVJUSUFMX0ZMQUcgfCBQQVJUSUFMX1JJR0hUX0ZMQUcpO1xuICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgfVxuICBhcnkgPSBhcnkgPT09IHVuZGVmaW5lZCA/IGFyeSA6IG5hdGl2ZU1heCh0b0ludGVnZXIoYXJ5KSwgMCk7XG4gIGFyaXR5ID0gYXJpdHkgPT09IHVuZGVmaW5lZCA/IGFyaXR5IDogdG9JbnRlZ2VyKGFyaXR5KTtcbiAgbGVuZ3RoIC09IGhvbGRlcnMgPyBob2xkZXJzLmxlbmd0aCA6IDA7XG5cbiAgaWYgKGJpdG1hc2sgJiBQQVJUSUFMX1JJR0hUX0ZMQUcpIHtcbiAgICB2YXIgcGFydGlhbHNSaWdodCA9IHBhcnRpYWxzLFxuICAgICAgICBob2xkZXJzUmlnaHQgPSBob2xkZXJzO1xuXG4gICAgcGFydGlhbHMgPSBob2xkZXJzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgdmFyIG5ld0RhdGEgPSBbXG4gICAgZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCxcbiAgICBhcmdQb3MsIGFyeSwgYXJpdHlcbiAgXTtcblxuICBmdW5jID0gbmV3RGF0YVswXTtcbiAgYml0bWFzayA9IG5ld0RhdGFbMV07XG4gIHRoaXNBcmcgPSBuZXdEYXRhWzJdO1xuICBwYXJ0aWFscyA9IG5ld0RhdGFbM107XG4gIGhvbGRlcnMgPSBuZXdEYXRhWzRdO1xuICBhcml0eSA9IG5ld0RhdGFbOV0gPSBuZXdEYXRhWzldID09IG51bGxcbiAgICA/IChpc0JpbmRLZXkgPyAwIDogZnVuYy5sZW5ndGgpXG4gICAgOiBuYXRpdmVNYXgobmV3RGF0YVs5XSAtIGxlbmd0aCwgMCk7XG5cbiAgaWYgKCFhcml0eSAmJiBiaXRtYXNrICYgKENVUlJZX0ZMQUcgfCBDVVJSWV9SSUdIVF9GTEFHKSkge1xuICAgIGJpdG1hc2sgJj0gfihDVVJSWV9GTEFHIHwgQ1VSUllfUklHSFRfRkxBRyk7XG4gIH1cbiAgaWYgKCFiaXRtYXNrIHx8IGJpdG1hc2sgPT0gQklORF9GTEFHKSB7XG4gICAgdmFyIHJlc3VsdCA9IGNyZWF0ZUJpbmQoZnVuYywgYml0bWFzaywgdGhpc0FyZyk7XG4gIH0gZWxzZSBpZiAoYml0bWFzayA9PSBDVVJSWV9GTEFHIHx8IGJpdG1hc2sgPT0gQ1VSUllfUklHSFRfRkxBRykge1xuICAgIHJlc3VsdCA9IGNyZWF0ZUN1cnJ5KGZ1bmMsIGJpdG1hc2ssIGFyaXR5KTtcbiAgfSBlbHNlIGlmICgoYml0bWFzayA9PSBQQVJUSUFMX0ZMQUcgfHwgYml0bWFzayA9PSAoQklORF9GTEFHIHwgUEFSVElBTF9GTEFHKSkgJiYgIWhvbGRlcnMubGVuZ3RoKSB7XG4gICAgcmVzdWx0ID0gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscyk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gY3JlYXRlSHlicmlkLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gIH1cbiAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsIGZ1bmMsIGJpdG1hc2spO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGFyZ3VtZW50IHBsYWNlaG9sZGVyIHZhbHVlIGZvciBgZnVuY2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcGxhY2Vob2xkZXIgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldEhvbGRlcihmdW5jKSB7XG4gIHZhciBvYmplY3QgPSBmdW5jO1xuICByZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkpIHtcbiAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHdyYXBwZXIgZGV0YWlscyBmcm9tIHRoZSBgc291cmNlYCBib2R5IGNvbW1lbnQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3cmFwcGVyIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIGdldFdyYXBEZXRhaWxzKHNvdXJjZSkge1xuICB2YXIgbWF0Y2ggPSBzb3VyY2UubWF0Y2gocmVXcmFwRGV0YWlscyk7XG4gIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdLnNwbGl0KHJlU3BsaXREZXRhaWxzKSA6IFtdO1xufVxuXG4vKipcbiAqIEluc2VydHMgd3JhcHBlciBgZGV0YWlsc2AgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGBzb3VyY2VgIGJvZHkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBtb2RpZnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IGRldGFpbHMgVGhlIGRldGFpbHMgdG8gaW5zZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbW9kaWZpZWQgc291cmNlLlxuICovXG5mdW5jdGlvbiBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIGRldGFpbHMpIHtcbiAgdmFyIGxlbmd0aCA9IGRldGFpbHMubGVuZ3RoLFxuICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICBkZXRhaWxzW2xhc3RJbmRleF0gPSAobGVuZ3RoID4gMSA/ICcmICcgOiAnJykgKyBkZXRhaWxzW2xhc3RJbmRleF07XG4gIGRldGFpbHMgPSBkZXRhaWxzLmpvaW4obGVuZ3RoID4gMiA/ICcsICcgOiAnICcpO1xuICByZXR1cm4gc291cmNlLnJlcGxhY2UocmVXcmFwQ29tbWVudCwgJ3tcXG4vKiBbd3JhcHBlZCB3aXRoICcgKyBkZXRhaWxzICsgJ10gKi9cXG4nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9TUFYX1NBRkVfSU5URUdFUl0gVGhlIHVwcGVyIGJvdW5kcyBvZiBhIHZhbGlkIGluZGV4LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHtcbiAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuICByZXR1cm4gISFsZW5ndGggJiZcbiAgICAodHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8IHJlSXNVaW50LnRlc3QodmFsdWUpKSAmJlxuICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2tlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gIHJldHVybiAhIW1hc2tTcmNLZXkgJiYgKG1hc2tTcmNLZXkgaW4gZnVuYyk7XG59XG5cbi8qKlxuICogUmVvcmRlciBgYXJyYXlgIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGluZGV4ZXMgd2hlcmUgdGhlIGVsZW1lbnQgYXRcbiAqIHRoZSBmaXJzdCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgZmlyc3QgZWxlbWVudCwgdGhlIGVsZW1lbnQgYXRcbiAqIHRoZSBzZWNvbmQgaW5kZXggaXMgYXNzaWduZWQgYXMgdGhlIHNlY29uZCBlbGVtZW50LCBhbmQgc28gb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byByZW9yZGVyLlxuICogQHBhcmFtIHtBcnJheX0gaW5kZXhlcyBUaGUgYXJyYW5nZWQgYXJyYXkgaW5kZXhlcy5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiByZW9yZGVyKGFycmF5LCBpbmRleGVzKSB7XG4gIHZhciBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICBsZW5ndGggPSBuYXRpdmVNaW4oaW5kZXhlcy5sZW5ndGgsIGFyckxlbmd0aCksXG4gICAgICBvbGRBcnJheSA9IGNvcHlBcnJheShhcnJheSk7XG5cbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgdmFyIGluZGV4ID0gaW5kZXhlc1tsZW5ndGhdO1xuICAgIGFycmF5W2xlbmd0aF0gPSBpc0luZGV4KGluZGV4LCBhcnJMZW5ndGgpID8gb2xkQXJyYXlbaW5kZXhdIDogdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgd3JhcHBlcmAgdG8gbWltaWMgdGhlIHNvdXJjZSBvZiBgcmVmZXJlbmNlYFxuICogd2l0aCB3cmFwcGVyIGRldGFpbHMgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIHNvdXJjZSBib2R5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwcGVyIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWZlcmVuY2UgVGhlIHJlZmVyZW5jZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYHdyYXBwZXJgLlxuICovXG52YXIgc2V0V3JhcFRvU3RyaW5nID0gIWRlZmluZVByb3BlcnR5ID8gaWRlbnRpdHkgOiBmdW5jdGlvbih3cmFwcGVyLCByZWZlcmVuY2UsIGJpdG1hc2spIHtcbiAgdmFyIHNvdXJjZSA9IChyZWZlcmVuY2UgKyAnJyk7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eSh3cmFwcGVyLCAndG9TdHJpbmcnLCB7XG4gICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAndmFsdWUnOiBjb25zdGFudChpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIHVwZGF0ZVdyYXBEZXRhaWxzKGdldFdyYXBEZXRhaWxzKHNvdXJjZSksIGJpdG1hc2spKSlcbiAgfSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogVXBkYXRlcyB3cmFwcGVyIGBkZXRhaWxzYCBiYXNlZCBvbiBgYml0bWFza2AgZmxhZ3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtBcnJheX0gZGV0YWlscyBUaGUgZGV0YWlscyB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBkZXRhaWxzYC5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlV3JhcERldGFpbHMoZGV0YWlscywgYml0bWFzaykge1xuICBhcnJheUVhY2god3JhcEZsYWdzLCBmdW5jdGlvbihwYWlyKSB7XG4gICAgdmFyIHZhbHVlID0gJ18uJyArIHBhaXJbMF07XG4gICAgaWYgKChiaXRtYXNrICYgcGFpclsxXSkgJiYgIWFycmF5SW5jbHVkZXMoZGV0YWlscywgdmFsdWUpKSB7XG4gICAgICBkZXRhaWxzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkZXRhaWxzLnNvcnQoKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFyZ3VtZW50cyBvZiBgZnVuY2AgYW5kIGVpdGhlciBpbnZva2VzXG4gKiBgZnVuY2AgcmV0dXJuaW5nIGl0cyByZXN1bHQsIGlmIGF0IGxlYXN0IGBhcml0eWAgbnVtYmVyIG9mIGFyZ3VtZW50cyBoYXZlXG4gKiBiZWVuIHByb3ZpZGVkLCBvciByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHRoZSByZW1haW5pbmcgYGZ1bmNgXG4gKiBhcmd1bWVudHMsIGFuZCBzbyBvbi4gVGhlIGFyaXR5IG9mIGBmdW5jYCBtYXkgYmUgc3BlY2lmaWVkIGlmIGBmdW5jLmxlbmd0aGBcbiAqIGlzIG5vdCBzdWZmaWNpZW50LlxuICpcbiAqIFRoZSBgXy5jdXJyeS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgY3VycmllZCBmdW5jdGlvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjAuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGFiYyA9IGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAqIH07XG4gKlxuICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5KGFiYyk7XG4gKlxuICogY3VycmllZCgxKSgyKSgzKTtcbiAqIC8vID0+IFsxLCAyLCAzXVxuICpcbiAqIGN1cnJpZWQoMSwgMikoMyk7XG4gKiAvLyA9PiBbMSwgMiwgM11cbiAqXG4gKiBjdXJyaWVkKDEsIDIsIDMpO1xuICogLy8gPT4gWzEsIDIsIDNdXG4gKlxuICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAqIGN1cnJpZWQoMSkoXywgMykoMik7XG4gKiAvLyA9PiBbMSwgMiwgM11cbiAqL1xuZnVuY3Rpb24gY3VycnkoZnVuYywgYXJpdHksIGd1YXJkKSB7XG4gIGFyaXR5ID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBhcml0eTtcbiAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgQ1VSUllfRkxBRywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFyaXR5KTtcbiAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnkucGxhY2Vob2xkZXI7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOC05IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5IGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBpc09iamVjdCh2YWx1ZSkgPyBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9GaW5pdGUoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgfVxuICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvSW50ZWdlcmBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2ludGVnZXIpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9JbnRlZ2VyKDMuMik7XG4gKiAvLyA9PiAzXG4gKlxuICogXy50b0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiAwXG4gKlxuICogXy50b0ludGVnZXIoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvSW50ZWdlcignMy4yJyk7XG4gKiAvLyA9PiAzXG4gKi9cbmZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgcmVtYWluZGVyID0gcmVzdWx0ICUgMTtcblxuICByZXR1cm4gcmVzdWx0ID09PSByZXN1bHQgPyAocmVtYWluZGVyID8gcmVzdWx0IC0gcmVtYWluZGVyIDogcmVzdWx0KSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKlxuICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIEFzc2lnbiBkZWZhdWx0IHBsYWNlaG9sZGVycy5cbmN1cnJ5LnBsYWNlaG9sZGVyID0ge307XG5cbm1vZHVsZS5leHBvcnRzID0gY3Vycnk7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIERhdGFWaWV3ID0gZ2V0TmF0aXZlKHJvb3QsICdEYXRhVmlldycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGFWaWV3O1xuIiwidmFyIGhhc2hDbGVhciA9IHJlcXVpcmUoJy4vX2hhc2hDbGVhcicpLFxuICAgIGhhc2hEZWxldGUgPSByZXF1aXJlKCcuL19oYXNoRGVsZXRlJyksXG4gICAgaGFzaEdldCA9IHJlcXVpcmUoJy4vX2hhc2hHZXQnKSxcbiAgICBoYXNoSGFzID0gcmVxdWlyZSgnLi9faGFzaEhhcycpLFxuICAgIGhhc2hTZXQgPSByZXF1aXJlKCcuL19oYXNoU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG5IYXNoLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBoYXNoRGVsZXRlO1xuSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbkhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG5IYXNoLnByb3RvdHlwZS5zZXQgPSBoYXNoU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEhhc2g7XG4iLCJ2YXIgbGlzdENhY2hlQ2xlYXIgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVDbGVhcicpLFxuICAgIGxpc3RDYWNoZURlbGV0ZSA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZURlbGV0ZScpLFxuICAgIGxpc3RDYWNoZUdldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUdldCcpLFxuICAgIGxpc3RDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUhhcycpLFxuICAgIGxpc3RDYWNoZVNldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZVNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gbGlzdCBjYWNoZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLlxuTGlzdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IGxpc3RDYWNoZUNsZWFyO1xuTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG5MaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IGxpc3RDYWNoZUdldDtcbkxpc3RDYWNoZS5wcm90b3R5cGUuaGFzID0gbGlzdENhY2hlSGFzO1xuTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTGlzdENhY2hlO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBNYXAgPSBnZXROYXRpdmUocm9vdCwgJ01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcDtcbiIsInZhciBtYXBDYWNoZUNsZWFyID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVDbGVhcicpLFxuICAgIG1hcENhY2hlRGVsZXRlID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVEZWxldGUnKSxcbiAgICBtYXBDYWNoZUdldCA9IHJlcXVpcmUoJy4vX21hcENhY2hlR2V0JyksXG4gICAgbWFwQ2FjaGVIYXMgPSByZXF1aXJlKCcuL19tYXBDYWNoZUhhcycpLFxuICAgIG1hcENhY2hlU2V0ID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYE1hcENhY2hlYC5cbk1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7XG5NYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbWFwQ2FjaGVEZWxldGU7XG5NYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbWFwQ2FjaGVHZXQ7XG5NYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7XG5NYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFwQ2FjaGU7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFByb21pc2UgPSBnZXROYXRpdmUocm9vdCwgJ1Byb21pc2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBQcm9taXNlO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBTZXQgPSBnZXROYXRpdmUocm9vdCwgJ1NldCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNldDtcbiIsInZhciBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyksXG4gICAgc2V0Q2FjaGVBZGQgPSByZXF1aXJlKCcuL19zZXRDYWNoZUFkZCcpLFxuICAgIHNldENhY2hlSGFzID0gcmVxdWlyZSgnLi9fc2V0Q2FjaGVIYXMnKTtcblxuLyoqXG4gKlxuICogQ3JlYXRlcyBhbiBhcnJheSBjYWNoZSBvYmplY3QgdG8gc3RvcmUgdW5pcXVlIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTZXRDYWNoZSh2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMgPT0gbnVsbCA/IDAgOiB2YWx1ZXMubGVuZ3RoO1xuXG4gIHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGU7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdGhpcy5hZGQodmFsdWVzW2luZGV4XSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFNldENhY2hlYC5cblNldENhY2hlLnByb3RvdHlwZS5hZGQgPSBTZXRDYWNoZS5wcm90b3R5cGUucHVzaCA9IHNldENhY2hlQWRkO1xuU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IHNldENhY2hlSGFzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNldENhY2hlO1xuIiwidmFyIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIHN0YWNrQ2xlYXIgPSByZXF1aXJlKCcuL19zdGFja0NsZWFyJyksXG4gICAgc3RhY2tEZWxldGUgPSByZXF1aXJlKCcuL19zdGFja0RlbGV0ZScpLFxuICAgIHN0YWNrR2V0ID0gcmVxdWlyZSgnLi9fc3RhY2tHZXQnKSxcbiAgICBzdGFja0hhcyA9IHJlcXVpcmUoJy4vX3N0YWNrSGFzJyksXG4gICAgc3RhY2tTZXQgPSByZXF1aXJlKCcuL19zdGFja1NldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzdGFjayBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTdGFjayhlbnRyaWVzKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFN0YWNrYC5cblN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XG5TdGFjay5wcm90b3R5cGVbJ2RlbGV0ZSddID0gc3RhY2tEZWxldGU7XG5TdGFjay5wcm90b3R5cGUuZ2V0ID0gc3RhY2tHZXQ7XG5TdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XG5TdGFjay5wcm90b3R5cGUuc2V0ID0gc3RhY2tTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gU3RhY2s7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFVpbnQ4QXJyYXkgPSByb290LlVpbnQ4QXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gVWludDhBcnJheTtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgV2Vha01hcCA9IGdldE5hdGl2ZShyb290LCAnV2Vha01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdlYWtNYXA7XG4iLCIvKipcbiAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICovXG5mdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXBwbHk7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlFYWNoO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZmlsdGVyYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5RmlsdGVyO1xuIiwidmFyIGJhc2VJbmRleE9mID0gcmVxdWlyZSgnLi9fYmFzZUluZGV4T2YnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5jbHVkZXNgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogc3BlY2lmeWluZyBhbiBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksIHZhbHVlKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgMCkgPiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUluY2x1ZGVzO1xuIiwiLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFycmF5SW5jbHVkZXNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlJbmNsdWRlc1dpdGgoYXJyYXksIHZhbHVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoY29tcGFyYXRvcih2YWx1ZSwgYXJyYXlbaW5kZXhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiIsInZhciBiYXNlVGltZXMgPSByZXF1aXJlKCcuL19iYXNlVGltZXMnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGFycmF5LWxpa2UgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSksXG4gICAgICBpc0FyZyA9ICFpc0FyciAmJiBpc0FyZ3VtZW50cyh2YWx1ZSksXG4gICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgIWlzQXJnICYmIGlzQnVmZmVyKHZhbHVlKSxcbiAgICAgIGlzVHlwZSA9ICFpc0FyciAmJiAhaXNBcmcgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgc2tpcEluZGV4ZXMgPSBpc0FyciB8fCBpc0FyZyB8fCBpc0J1ZmYgfHwgaXNUeXBlLFxuICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW10sXG4gICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKFxuICAgICAgICAgICAvLyBTYWZhcmkgOSBoYXMgZW51bWVyYWJsZSBgYXJndW1lbnRzLmxlbmd0aGAgaW4gc3RyaWN0IG1vZGUuXG4gICAgICAgICAgIGtleSA9PSAnbGVuZ3RoJyB8fFxuICAgICAgICAgICAvLyBOb2RlLmpzIDAuMTAgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gYnVmZmVycy5cbiAgICAgICAgICAgKGlzQnVmZiAmJiAoa2V5ID09ICdvZmZzZXQnIHx8IGtleSA9PSAncGFyZW50JykpIHx8XG4gICAgICAgICAgIC8vIFBoYW50b21KUyAyIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIHR5cGVkIGFycmF5cy5cbiAgICAgICAgICAgKGlzVHlwZSAmJiAoa2V5ID09ICdidWZmZXInIHx8IGtleSA9PSAnYnl0ZUxlbmd0aCcgfHwga2V5ID09ICdieXRlT2Zmc2V0JykpIHx8XG4gICAgICAgICAgIC8vIFNraXAgaW5kZXggcHJvcGVydGllcy5cbiAgICAgICAgICAgaXNJbmRleChrZXksIGxlbmd0aClcbiAgICAgICAgKSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlMaWtlS2V5cztcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlNYXA7XG4iLCIvKipcbiAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlQdXNoO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YCBhc1xuICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBhcnJheVJlZHVjZShhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICBpZiAoaW5pdEFjY3VtICYmIGxlbmd0aCkge1xuICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbKytpbmRleF07XG4gIH1cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5UmVkdWNlO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc29tZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5U29tZShhcnJheSwgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheVNvbWU7XG4iLCJ2YXIgYmFzZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fYmFzZVByb3BlcnR5Jyk7XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBvZiBhbiBBU0NJSSBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xudmFyIGFzY2lpU2l6ZSA9IGJhc2VQcm9wZXJ0eSgnbGVuZ3RoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYXNjaWlTaXplO1xuIiwidmFyIGJhc2VBc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ25WYWx1ZScpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpO1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXNzaWduVmFsdWVgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgYXNzaWduXG4gKiBgdW5kZWZpbmVkYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgaWYgKCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFlcShvYmplY3Rba2V5XSwgdmFsdWUpKSB8fFxuICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzc2lnbk1lcmdlVmFsdWU7XG4iLCJ2YXIgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyksXG4gICAgZXEgPSByZXF1aXJlKCcuL2VxJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQXNzaWducyBgdmFsdWVgIHRvIGBrZXlgIG9mIGBvYmplY3RgIGlmIHRoZSBleGlzdGluZyB2YWx1ZSBpcyBub3QgZXF1aXZhbGVudFxuICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV07XG4gIGlmICghKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGVxKG9ialZhbHVlLCB2YWx1ZSkpIHx8XG4gICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSkge1xuICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzaWduVmFsdWU7XG4iLCJ2YXIgZXEgPSByZXF1aXJlKCcuL2VxJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIGlmIChlcShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG4gICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzb2NJbmRleE9mO1xuIiwidmFyIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3QsIHNvdXJjZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUFzc2lnbjtcbiIsInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXNzaWduSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VBc3NpZ25JbihvYmplY3QsIHNvdXJjZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQXNzaWduSW47XG4iLCJ2YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19kZWZpbmVQcm9wZXJ0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBhc3NpZ25WYWx1ZWAgYW5kIGBhc3NpZ25NZXJnZVZhbHVlYCB3aXRob3V0XG4gKiB2YWx1ZSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5ID09ICdfX3Byb3RvX18nICYmIGRlZmluZVByb3BlcnR5KSB7XG4gICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgJ2VudW1lcmFibGUnOiB0cnVlLFxuICAgICAgJ3ZhbHVlJzogdmFsdWUsXG4gICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VBc3NpZ25WYWx1ZTtcbiIsInZhciBTdGFjayA9IHJlcXVpcmUoJy4vX1N0YWNrJyksXG4gICAgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXlFYWNoJyksXG4gICAgYXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25WYWx1ZScpLFxuICAgIGJhc2VBc3NpZ24gPSByZXF1aXJlKCcuL19iYXNlQXNzaWduJyksXG4gICAgYmFzZUFzc2lnbkluID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnbkluJyksXG4gICAgY2xvbmVCdWZmZXIgPSByZXF1aXJlKCcuL19jbG9uZUJ1ZmZlcicpLFxuICAgIGNvcHlBcnJheSA9IHJlcXVpcmUoJy4vX2NvcHlBcnJheScpLFxuICAgIGNvcHlTeW1ib2xzID0gcmVxdWlyZSgnLi9fY29weVN5bWJvbHMnKSxcbiAgICBjb3B5U3ltYm9sc0luID0gcmVxdWlyZSgnLi9fY29weVN5bWJvbHNJbicpLFxuICAgIGdldEFsbEtleXMgPSByZXF1aXJlKCcuL19nZXRBbGxLZXlzJyksXG4gICAgZ2V0QWxsS2V5c0luID0gcmVxdWlyZSgnLi9fZ2V0QWxsS2V5c0luJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaW5pdENsb25lQXJyYXkgPSByZXF1aXJlKCcuL19pbml0Q2xvbmVBcnJheScpLFxuICAgIGluaXRDbG9uZUJ5VGFnID0gcmVxdWlyZSgnLi9faW5pdENsb25lQnlUYWcnKSxcbiAgICBpbml0Q2xvbmVPYmplY3QgPSByZXF1aXJlKCcuL19pbml0Q2xvbmVPYmplY3QnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNNYXAgPSByZXF1aXJlKCcuL2lzTWFwJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNTZXQgPSByZXF1aXJlKCcuL2lzU2V0JyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG52YXIgQ0xPTkVfREVFUF9GTEFHID0gMSxcbiAgICBDTE9ORV9GTEFUX0ZMQUcgPSAyLFxuICAgIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgc3VwcG9ydGVkIGJ5IGBfLmNsb25lYC4gKi9cbnZhciBjbG9uZWFibGVUYWdzID0ge307XG5jbG9uZWFibGVUYWdzW2FyZ3NUYWddID0gY2xvbmVhYmxlVGFnc1thcnJheVRhZ10gPVxuY2xvbmVhYmxlVGFnc1thcnJheUJ1ZmZlclRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnXSA9XG5jbG9uZWFibGVUYWdzW2Jvb2xUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRlVGFnXSA9XG5jbG9uZWFibGVUYWdzW2Zsb2F0MzJUYWddID0gY2xvbmVhYmxlVGFnc1tmbG9hdDY0VGFnXSA9XG5jbG9uZWFibGVUYWdzW2ludDhUYWddID0gY2xvbmVhYmxlVGFnc1tpbnQxNlRhZ10gPVxuY2xvbmVhYmxlVGFnc1tpbnQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW21hcFRhZ10gPVxuY2xvbmVhYmxlVGFnc1tudW1iZXJUYWddID0gY2xvbmVhYmxlVGFnc1tvYmplY3RUYWddID1cbmNsb25lYWJsZVRhZ3NbcmVnZXhwVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc2V0VGFnXSA9XG5jbG9uZWFibGVUYWdzW3N0cmluZ1RhZ10gPSBjbG9uZWFibGVUYWdzW3N5bWJvbFRhZ10gPVxuY2xvbmVhYmxlVGFnc1t1aW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPVxuY2xvbmVhYmxlVGFnc1t1aW50MTZUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbmNsb25lYWJsZVRhZ3NbZXJyb3JUYWddID0gY2xvbmVhYmxlVGFnc1tmdW5jVGFnXSA9XG5jbG9uZWFibGVUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xvbmVgIGFuZCBgXy5jbG9uZURlZXBgIHdoaWNoIHRyYWNrc1xuICogdHJhdmVyc2VkIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICogIDEgLSBEZWVwIGNsb25lXG4gKiAgMiAtIEZsYXR0ZW4gaW5oZXJpdGVkIHByb3BlcnRpZXNcbiAqICA0IC0gQ2xvbmUgc3ltYm9sc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSBUaGUga2V5IG9mIGB2YWx1ZWAuXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIHBhcmVudCBvYmplY3Qgb2YgYHZhbHVlYC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBhbmQgdGhlaXIgY2xvbmUgY291bnRlcnBhcnRzLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIG9iamVjdCwgc3RhY2spIHtcbiAgdmFyIHJlc3VsdCxcbiAgICAgIGlzRGVlcCA9IGJpdG1hc2sgJiBDTE9ORV9ERUVQX0ZMQUcsXG4gICAgICBpc0ZsYXQgPSBiaXRtYXNrICYgQ0xPTkVfRkxBVF9GTEFHLFxuICAgICAgaXNGdWxsID0gYml0bWFzayAmIENMT05FX1NZTUJPTFNfRkxBRztcblxuICBpZiAoY3VzdG9taXplcikge1xuICAgIHJlc3VsdCA9IG9iamVjdCA/IGN1c3RvbWl6ZXIodmFsdWUsIGtleSwgb2JqZWN0LCBzdGFjaykgOiBjdXN0b21pemVyKHZhbHVlKTtcbiAgfVxuICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpO1xuICBpZiAoaXNBcnIpIHtcbiAgICByZXN1bHQgPSBpbml0Q2xvbmVBcnJheSh2YWx1ZSk7XG4gICAgaWYgKCFpc0RlZXApIHtcbiAgICAgIHJldHVybiBjb3B5QXJyYXkodmFsdWUsIHJlc3VsdCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpLFxuICAgICAgICBpc0Z1bmMgPSB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnO1xuXG4gICAgaWYgKGlzQnVmZmVyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGNsb25lQnVmZmVyKHZhbHVlLCBpc0RlZXApO1xuICAgIH1cbiAgICBpZiAodGFnID09IG9iamVjdFRhZyB8fCB0YWcgPT0gYXJnc1RhZyB8fCAoaXNGdW5jICYmICFvYmplY3QpKSB7XG4gICAgICByZXN1bHQgPSAoaXNGbGF0IHx8IGlzRnVuYykgPyB7fSA6IGluaXRDbG9uZU9iamVjdCh2YWx1ZSk7XG4gICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICByZXR1cm4gaXNGbGF0XG4gICAgICAgICAgPyBjb3B5U3ltYm9sc0luKHZhbHVlLCBiYXNlQXNzaWduSW4ocmVzdWx0LCB2YWx1ZSkpXG4gICAgICAgICAgOiBjb3B5U3ltYm9scyh2YWx1ZSwgYmFzZUFzc2lnbihyZXN1bHQsIHZhbHVlKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2xvbmVhYmxlVGFnc1t0YWddKSB7XG4gICAgICAgIHJldHVybiBvYmplY3QgPyB2YWx1ZSA6IHt9O1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gaW5pdENsb25lQnlUYWcodmFsdWUsIHRhZywgaXNEZWVwKTtcbiAgICB9XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybiBpdHMgY29ycmVzcG9uZGluZyBjbG9uZS5cbiAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQodmFsdWUpO1xuICBpZiAoc3RhY2tlZCkge1xuICAgIHJldHVybiBzdGFja2VkO1xuICB9XG4gIHN0YWNrLnNldCh2YWx1ZSwgcmVzdWx0KTtcblxuICBpZiAoaXNTZXQodmFsdWUpKSB7XG4gICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSkge1xuICAgICAgcmVzdWx0LmFkZChiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN1YlZhbHVlLCB2YWx1ZSwgc3RhY2spKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChpc01hcCh2YWx1ZSkpIHtcbiAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICAgIHJlc3VsdC5zZXQoa2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgfSk7XG4gIH1cblxuICB2YXIga2V5c0Z1bmMgPSBpc0Z1bGxcbiAgICA/IChpc0ZsYXQgPyBnZXRBbGxLZXlzSW4gOiBnZXRBbGxLZXlzKVxuICAgIDogKGlzRmxhdCA/IGtleXNJbiA6IGtleXMpO1xuXG4gIHZhciBwcm9wcyA9IGlzQXJyID8gdW5kZWZpbmVkIDoga2V5c0Z1bmModmFsdWUpO1xuICBhcnJheUVhY2gocHJvcHMgfHwgdmFsdWUsIGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICBpZiAocHJvcHMpIHtcbiAgICAgIGtleSA9IHN1YlZhbHVlO1xuICAgICAgc3ViVmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmVseSBwb3B1bGF0ZSBjbG9uZSAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VDbG9uZTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0Q3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nXG4gKiBwcm9wZXJ0aWVzIHRvIHRoZSBjcmVhdGVkIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xudmFyIGJhc2VDcmVhdGUgPSAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIG9iamVjdCgpIHt9XG4gIHJldHVybiBmdW5jdGlvbihwcm90bykge1xuICAgIGlmICghaXNPYmplY3QocHJvdG8pKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGlmIChvYmplY3RDcmVhdGUpIHtcbiAgICAgIHJldHVybiBvYmplY3RDcmVhdGUocHJvdG8pO1xuICAgIH1cbiAgICBvYmplY3QucHJvdG90eXBlID0gcHJvdG87XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBvYmplY3Q7XG4gICAgb2JqZWN0LnByb3RvdHlwZSA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQ3JlYXRlO1xuIiwidmFyIGJhc2VGb3JPd24gPSByZXF1aXJlKCcuL19iYXNlRm9yT3duJyksXG4gICAgY3JlYXRlQmFzZUVhY2ggPSByZXF1aXJlKCcuL19jcmVhdGVCYXNlRWFjaCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICovXG52YXIgYmFzZUVhY2ggPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRWFjaDtcbiIsInZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8ubWF4YCBhbmQgYF8ubWluYCB3aGljaCBhY2NlcHRzIGFcbiAqIGBjb21wYXJhdG9yYCB0byBkZXRlcm1pbmUgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgdXNlZCB0byBjb21wYXJlIHZhbHVlcy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBleHRyZW11bSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUV4dHJlbXVtKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgY3VycmVudCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgIGlmIChjdXJyZW50ICE9IG51bGwgJiYgKGNvbXB1dGVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IChjdXJyZW50ID09PSBjdXJyZW50ICYmICFpc1N5bWJvbChjdXJyZW50KSlcbiAgICAgICAgICA6IGNvbXBhcmF0b3IoY3VycmVudCwgY29tcHV0ZWQpXG4gICAgICAgICkpIHtcbiAgICAgIHZhciBjb21wdXRlZCA9IGN1cnJlbnQsXG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUV4dHJlbXVtO1xuIiwidmFyIGJhc2VFYWNoID0gcmVxdWlyZSgnLi9fYmFzZUVhY2gnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWx0ZXJgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VGaWx0ZXI7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRmluZEluZGV4O1xuIiwidmFyIGFycmF5UHVzaCA9IHJlcXVpcmUoJy4vX2FycmF5UHVzaCcpLFxuICAgIGlzRmxhdHRlbmFibGUgPSByZXF1aXJlKCcuL19pc0ZsYXR0ZW5hYmxlJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmxhdHRlbmAgd2l0aCBzdXBwb3J0IGZvciByZXN0cmljdGluZyBmbGF0dGVuaW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkZXB0aCBUaGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3RyaWN0XSBSZXN0cmljdCB0byB2YWx1ZXMgdGhhdCBwYXNzIGBwcmVkaWNhdGVgIGNoZWNrcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtyZXN1bHQ9W11dIFRoZSBpbml0aWFsIHJlc3VsdCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZUZsYXR0ZW4oYXJyYXksIGRlcHRoLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgcHJlZGljYXRlIHx8IChwcmVkaWNhdGUgPSBpc0ZsYXR0ZW5hYmxlKTtcbiAgcmVzdWx0IHx8IChyZXN1bHQgPSBbXSk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgaWYgKGRlcHRoID4gMCAmJiBwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICBpZiAoZGVwdGggPiAxKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsYXR0ZW4gYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGJhc2VGbGF0dGVuKHZhbHVlLCBkZXB0aCAtIDEsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheVB1c2gocmVzdWx0LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaXNTdHJpY3QpIHtcbiAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VGbGF0dGVuO1xuIiwidmFyIGNyZWF0ZUJhc2VGb3IgPSByZXF1aXJlKCcuL19jcmVhdGVCYXNlRm9yJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYG9iamVjdGBcbiAqIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgYGtleXNGdW5jYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG52YXIgYmFzZUZvciA9IGNyZWF0ZUJhc2VGb3IoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRm9yO1xuIiwidmFyIGJhc2VGb3IgPSByZXF1aXJlKCcuL19iYXNlRm9yJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93bmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3Iob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZvck93bjtcbiIsInZhciBjYXN0UGF0aCA9IHJlcXVpcmUoJy4vX2Nhc3RQYXRoJyksXG4gICAgdG9LZXkgPSByZXF1aXJlKCcuL190b0tleScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldChvYmplY3QsIHBhdGgpIHtcbiAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gMCxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG4gIHdoaWxlIChvYmplY3QgIT0gbnVsbCAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgIG9iamVjdCA9IG9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07XG4gIH1cbiAgcmV0dXJuIChpbmRleCAmJiBpbmRleCA9PSBsZW5ndGgpID8gb2JqZWN0IDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXQ7XG4iLCJ2YXIgYXJyYXlQdXNoID0gcmVxdWlyZSgnLi9fYXJyYXlQdXNoJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRBbGxLZXlzYCBhbmQgYGdldEFsbEtleXNJbmAgd2hpY2ggdXNlc1xuICogYGtleXNGdW5jYCBhbmQgYHN5bWJvbHNGdW5jYCB0byBnZXQgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gKiBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3ltYm9sc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0Z1bmMsIHN5bWJvbHNGdW5jKSB7XG4gIHZhciByZXN1bHQgPSBrZXlzRnVuYyhvYmplY3QpO1xuICByZXR1cm4gaXNBcnJheShvYmplY3QpID8gcmVzdWx0IDogYXJyYXlQdXNoKHJlc3VsdCwgc3ltYm9sc0Z1bmMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldEFsbEtleXM7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgZ2V0UmF3VGFnID0gcmVxdWlyZSgnLi9fZ2V0UmF3VGFnJyksXG4gICAgb2JqZWN0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19vYmplY3RUb1N0cmluZycpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJyxcbiAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnO1xuICB9XG4gIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICA/IGdldFJhd1RhZyh2YWx1ZSlcbiAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR2V0VGFnO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ndGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUd0KHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPiBvdGhlcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR3Q7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc2Agd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUhhcyhvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUhhcztcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYga2V5IGluIE9iamVjdChvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VIYXNJbjtcbiIsInZhciBiYXNlRmluZEluZGV4ID0gcmVxdWlyZSgnLi9fYmFzZUZpbmRJbmRleCcpLFxuICAgIGJhc2VJc05hTiA9IHJlcXVpcmUoJy4vX2Jhc2VJc05hTicpLFxuICAgIHN0cmljdEluZGV4T2YgPSByZXF1aXJlKCcuL19zdHJpY3RJbmRleE9mJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICA/IHN0cmljdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpXG4gICAgOiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUluZGV4T2Y7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJndW1lbnRzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc0FyZ3VtZW50cyh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcmdzVGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0FyZ3VtZW50cztcbiIsInZhciBiYXNlSXNFcXVhbERlZXAgPSByZXF1aXJlKCcuL19iYXNlSXNFcXVhbERlZXAnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRXF1YWxgIHdoaWNoIHN1cHBvcnRzIHBhcnRpYWwgY29tcGFyaXNvbnNcbiAqIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICogIDEgLSBVbm9yZGVyZWQgY29tcGFyaXNvblxuICogIDIgLSBQYXJ0aWFsIGNvbXBhcmlzb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIGlmICh2YWx1ZSA9PT0gb3RoZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCB8fCBvdGhlciA9PSBudWxsIHx8ICghaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNPYmplY3RMaWtlKG90aGVyKSkpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcjtcbiAgfVxuICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgYmFzZUlzRXF1YWwsIHN0YWNrKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNFcXVhbDtcbiIsInZhciBTdGFjayA9IHJlcXVpcmUoJy4vX1N0YWNrJyksXG4gICAgZXF1YWxBcnJheXMgPSByZXF1aXJlKCcuL19lcXVhbEFycmF5cycpLFxuICAgIGVxdWFsQnlUYWcgPSByZXF1aXJlKCcuL19lcXVhbEJ5VGFnJyksXG4gICAgZXF1YWxPYmplY3RzID0gcmVxdWlyZSgnLi9fZXF1YWxPYmplY3RzJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICogZGVlcCBjb21wYXJpc29ucyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICogcmVmZXJlbmNlcyB0byBiZSBjb21wYXJlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIG9iaklzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgb3RoSXNBcnIgPSBpc0FycmF5KG90aGVyKSxcbiAgICAgIG9ialRhZyA9IG9iaklzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob2JqZWN0KSxcbiAgICAgIG90aFRhZyA9IG90aElzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob3RoZXIpO1xuXG4gIG9ialRhZyA9IG9ialRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb2JqVGFnO1xuICBvdGhUYWcgPSBvdGhUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG90aFRhZztcblxuICB2YXIgb2JqSXNPYmogPSBvYmpUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgb3RoSXNPYmogPSBvdGhUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZztcblxuICBpZiAoaXNTYW1lVGFnICYmIGlzQnVmZmVyKG9iamVjdCkpIHtcbiAgICBpZiAoIWlzQnVmZmVyKG90aGVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBvYmpJc0FyciA9IHRydWU7XG4gICAgb2JqSXNPYmogPSBmYWxzZTtcbiAgfVxuICBpZiAoaXNTYW1lVGFnICYmICFvYmpJc09iaikge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgcmV0dXJuIChvYmpJc0FyciB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KSlcbiAgICAgID8gZXF1YWxBcnJheXMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaylcbiAgICAgIDogZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCBvYmpUYWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICB9XG4gIGlmICghKGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRykpIHtcbiAgICB2YXIgb2JqSXNXcmFwcGVkID0gb2JqSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsICdfX3dyYXBwZWRfXycpLFxuICAgICAgICBvdGhJc1dyYXBwZWQgPSBvdGhJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCAnX193cmFwcGVkX18nKTtcblxuICAgIGlmIChvYmpJc1dyYXBwZWQgfHwgb3RoSXNXcmFwcGVkKSB7XG4gICAgICB2YXIgb2JqVW53cmFwcGVkID0gb2JqSXNXcmFwcGVkID8gb2JqZWN0LnZhbHVlKCkgOiBvYmplY3QsXG4gICAgICAgICAgb3RoVW53cmFwcGVkID0gb3RoSXNXcmFwcGVkID8gb3RoZXIudmFsdWUoKSA6IG90aGVyO1xuXG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spO1xuICAgIH1cbiAgfVxuICBpZiAoIWlzU2FtZVRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICByZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0VxdWFsRGVlcDtcbiIsInZhciBnZXRUYWcgPSByZXF1aXJlKCcuL19nZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXSc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc01hcCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IG1hcFRhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNNYXA7XG4iLCJ2YXIgU3RhY2sgPSByZXF1aXJlKCcuL19TdGFjaycpLFxuICAgIGJhc2VJc0VxdWFsID0gcmVxdWlyZSgnLi9fYmFzZUlzRXF1YWwnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWF0Y2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICogQHBhcmFtIHtBcnJheX0gbWF0Y2hEYXRhIFRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSwgY3VzdG9taXplcikge1xuICB2YXIgaW5kZXggPSBtYXRjaERhdGEubGVuZ3RoLFxuICAgICAgbGVuZ3RoID0gaW5kZXgsXG4gICAgICBub0N1c3RvbWl6ZXIgPSAhY3VzdG9taXplcjtcblxuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gIWxlbmd0aDtcbiAgfVxuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICB2YXIgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgaWYgKChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSlcbiAgICAgICAgICA/IGRhdGFbMV0gIT09IG9iamVjdFtkYXRhWzBdXVxuICAgICAgICAgIDogIShkYXRhWzBdIGluIG9iamVjdClcbiAgICAgICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgdmFyIGtleSA9IGRhdGFbMF0sXG4gICAgICAgIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgIHNyY1ZhbHVlID0gZGF0YVsxXTtcblxuICAgIGlmIChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSkge1xuICAgICAgaWYgKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdGFjayA9IG5ldyBTdGFjaztcbiAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spO1xuICAgICAgfVxuICAgICAgaWYgKCEocmVzdWx0ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICAgICAgOiByZXN1bHRcbiAgICAgICAgICApKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzTWF0Y2g7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmFOYCB3aXRob3V0IHN1cHBvcnQgZm9yIG51bWJlciBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc05hTjtcbiIsInZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNNYXNrZWQgPSByZXF1aXJlKCcuL19pc01hc2tlZCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIHRvU291cmNlID0gcmVxdWlyZSgnLi9fdG9Tb3VyY2UnKTtcblxuLyoqXG4gKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAqL1xudmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xudmFyIHJlSXNIb3N0Q3RvciA9IC9eXFxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXFxdJC87XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xudmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNOYXRpdmU7XG4iLCJ2YXIgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzU2V0YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNTZXQodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBzZXRUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzU2V0O1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNMZW5ndGggPSByZXF1aXJlKCcuL2lzTGVuZ3RoJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqL1xudmFyIHR5cGVkQXJyYXlUYWdzID0ge307XG50eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddID1cbnR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXSA9XG50eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDE2VGFnXSA9XG50eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbnR5cGVkQXJyYXlUYWdzW2FyZ3NUYWddID0gdHlwZWRBcnJheVRhZ3NbYXJyYXlUYWddID1cbnR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddID1cbnR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGVUYWddID1cbnR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Z1bmNUYWddID1cbnR5cGVkQXJyYXlUYWdzW21hcFRhZ10gPSB0eXBlZEFycmF5VGFnc1tudW1iZXJUYWddID1cbnR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPSB0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID1cbnR5cGVkQXJyYXlUYWdzW3NldFRhZ10gPSB0eXBlZEFycmF5VGFnc1tzdHJpbmdUYWddID1cbnR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNUeXBlZEFycmF5YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiZcbiAgICBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3NbYmFzZUdldFRhZyh2YWx1ZSldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc1R5cGVkQXJyYXk7XG4iLCJ2YXIgYmFzZU1hdGNoZXMgPSByZXF1aXJlKCcuL19iYXNlTWF0Y2hlcycpLFxuICAgIGJhc2VNYXRjaGVzUHJvcGVydHkgPSByZXF1aXJlKCcuL19iYXNlTWF0Y2hlc1Byb3BlcnR5JyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5JyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIHByb3BlcnR5ID0gcmVxdWlyZSgnLi9wcm9wZXJ0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLml0ZXJhdGVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBbdmFsdWU9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYW4gaXRlcmF0ZWUuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGl0ZXJhdGVlLlxuICovXG5mdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpIHtcbiAgLy8gRG9uJ3Qgc3RvcmUgdGhlIGB0eXBlb2ZgIHJlc3VsdCBpbiBhIHZhcmlhYmxlIHRvIGF2b2lkIGEgSklUIGJ1ZyBpbiBTYWZhcmkgOS5cbiAgLy8gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTYwMzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gYmFzZU1hdGNoZXNQcm9wZXJ0eSh2YWx1ZVswXSwgdmFsdWVbMV0pXG4gICAgICA6IGJhc2VNYXRjaGVzKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gcHJvcGVydHkodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJdGVyYXRlZTtcbiIsInZhciBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyksXG4gICAgbmF0aXZlS2V5cyA9IHJlcXVpcmUoJy4vX25hdGl2ZUtleXMnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkge1xuICBpZiAoIWlzUHJvdG90eXBlKG9iamVjdCkpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xuICB9XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGtleSAhPSAnY29uc3RydWN0b3InKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VLZXlzO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKSxcbiAgICBuYXRpdmVLZXlzSW4gPSByZXF1aXJlKCcuL19uYXRpdmVLZXlzSW4nKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzSW5gIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXNJbihvYmplY3QpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXNJbihvYmplY3QpO1xuICB9XG4gIHZhciBpc1Byb3RvID0gaXNQcm90b3R5cGUob2JqZWN0KSxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoIShrZXkgPT0gJ2NvbnN0cnVjdG9yJyAmJiAoaXNQcm90byB8fCAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlS2V5c0luO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5sdGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUx0KHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPCBvdGhlcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTHQ7XG4iLCJ2YXIgYmFzZUVhY2ggPSByZXF1aXJlKCcuL19iYXNlRWFjaCcpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hcGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlTWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcblxuICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gaXRlcmF0ZWUodmFsdWUsIGtleSwgY29sbGVjdGlvbik7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VNYXA7XG4iLCJ2YXIgYmFzZUlzTWF0Y2ggPSByZXF1aXJlKCcuL19iYXNlSXNNYXRjaCcpLFxuICAgIGdldE1hdGNoRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hdGNoRGF0YScpLFxuICAgIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlID0gcmVxdWlyZSgnLi9fbWF0Y2hlc1N0cmljdENvbXBhcmFibGUnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzYCB3aGljaCBkb2Vzbid0IGNsb25lIGBzb3VyY2VgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKSB7XG4gIHZhciBtYXRjaERhdGEgPSBnZXRNYXRjaERhdGEoc291cmNlKTtcbiAgaWYgKG1hdGNoRGF0YS5sZW5ndGggPT0gMSAmJiBtYXRjaERhdGFbMF1bMl0pIHtcbiAgICByZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUobWF0Y2hEYXRhWzBdWzBdLCBtYXRjaERhdGFbMF1bMV0pO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09PSBzb3VyY2UgfHwgYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZU1hdGNoZXM7XG4iLCJ2YXIgYmFzZUlzRXF1YWwgPSByZXF1aXJlKCcuL19iYXNlSXNFcXVhbCcpLFxuICAgIGdldCA9IHJlcXVpcmUoJy4vZ2V0JyksXG4gICAgaGFzSW4gPSByZXF1aXJlKCcuL2hhc0luJyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIGlzU3RyaWN0Q29tcGFyYWJsZSA9IHJlcXVpcmUoJy4vX2lzU3RyaWN0Q29tcGFyYWJsZScpLFxuICAgIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlID0gcmVxdWlyZSgnLi9fbWF0Y2hlc1N0cmljdENvbXBhcmFibGUnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzUHJvcGVydHlgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNyY1ZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBzcmNWYWx1ZSkge1xuICBpZiAoaXNLZXkocGF0aCkgJiYgaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSkge1xuICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSh0b0tleShwYXRoKSwgc3JjVmFsdWUpO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIgb2JqVmFsdWUgPSBnZXQob2JqZWN0LCBwYXRoKTtcbiAgICByZXR1cm4gKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgb2JqVmFsdWUgPT09IHNyY1ZhbHVlKVxuICAgICAgPyBoYXNJbihvYmplY3QsIHBhdGgpXG4gICAgICA6IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWF0Y2hlc1Byb3BlcnR5O1xuIiwidmFyIFN0YWNrID0gcmVxdWlyZSgnLi9fU3RhY2snKSxcbiAgICBhc3NpZ25NZXJnZVZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduTWVyZ2VWYWx1ZScpLFxuICAgIGJhc2VGb3IgPSByZXF1aXJlKCcuL19iYXNlRm9yJyksXG4gICAgYmFzZU1lcmdlRGVlcCA9IHJlcXVpcmUoJy4vX2Jhc2VNZXJnZURlZXAnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpLFxuICAgIHNhZmVHZXQgPSByZXF1aXJlKCcuL19zYWZlR2V0Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBtZXJnZWQgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAqICBjb3VudGVycGFydHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIGlmIChvYmplY3QgPT09IHNvdXJjZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBiYXNlRm9yKHNvdXJjZSwgZnVuY3Rpb24oc3JjVmFsdWUsIGtleSkge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgaWYgKGlzT2JqZWN0KHNyY1ZhbHVlKSkge1xuICAgICAgYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgYmFzZU1lcmdlLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICA/IGN1c3RvbWl6ZXIoc2FmZUdldChvYmplY3QsIGtleSksIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgfVxuICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfSwga2V5c0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWVyZ2U7XG4iLCJ2YXIgYXNzaWduTWVyZ2VWYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnbk1lcmdlVmFsdWUnKSxcbiAgICBjbG9uZUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQnVmZmVyJyksXG4gICAgY2xvbmVUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fY2xvbmVUeXBlZEFycmF5JyksXG4gICAgY29weUFycmF5ID0gcmVxdWlyZSgnLi9fY29weUFycmF5JyksXG4gICAgaW5pdENsb25lT2JqZWN0ID0gcmVxdWlyZSgnLi9faW5pdENsb25lT2JqZWN0JyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQXJyYXlMaWtlT2JqZWN0ID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZU9iamVjdCcpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi9pc1BsYWluT2JqZWN0JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKSxcbiAgICBzYWZlR2V0ID0gcmVxdWlyZSgnLi9fc2FmZUdldCcpLFxuICAgIHRvUGxhaW5PYmplY3QgPSByZXF1aXJlKCcuL3RvUGxhaW5PYmplY3QnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VNZXJnZWAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICogZGVlcCBtZXJnZXMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAqIHJlZmVyZW5jZXMgdG8gYmUgbWVyZ2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBtZXJnZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXJnZUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1lcmdlIHZhbHVlcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gKiAgY291bnRlcnBhcnRzLlxuICovXG5mdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBtZXJnZUZ1bmMsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIHZhciBvYmpWYWx1ZSA9IHNhZmVHZXQob2JqZWN0LCBrZXkpLFxuICAgICAgc3JjVmFsdWUgPSBzYWZlR2V0KHNvdXJjZSwga2V5KSxcbiAgICAgIHN0YWNrZWQgPSBzdGFjay5nZXQoc3JjVmFsdWUpO1xuXG4gIGlmIChzdGFja2VkKSB7XG4gICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgc3RhY2tlZCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgdmFyIGlzQ29tbW9uID0gbmV3VmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICBpZiAoaXNDb21tb24pIHtcbiAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHNyY1ZhbHVlKSxcbiAgICAgICAgaXNCdWZmID0gIWlzQXJyICYmIGlzQnVmZmVyKHNyY1ZhbHVlKSxcbiAgICAgICAgaXNUeXBlZCA9ICFpc0FyciAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheShzcmNWYWx1ZSk7XG5cbiAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgIGlmIChpc0FyciB8fCBpc0J1ZmYgfHwgaXNUeXBlZCkge1xuICAgICAgaWYgKGlzQXJyYXkob2JqVmFsdWUpKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBjb3B5QXJyYXkob2JqVmFsdWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNCdWZmKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIG5ld1ZhbHVlID0gY2xvbmVCdWZmZXIoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNUeXBlZCkge1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICBuZXdWYWx1ZSA9IGNsb25lVHlwZWRBcnJheShzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbmV3VmFsdWUgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoaXNQbGFpbk9iamVjdChzcmNWYWx1ZSkgfHwgaXNBcmd1bWVudHMoc3JjVmFsdWUpKSB7XG4gICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgaWYgKGlzQXJndW1lbnRzKG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IHRvUGxhaW5PYmplY3Qob2JqVmFsdWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoIWlzT2JqZWN0KG9ialZhbHVlKSB8fCBpc0Z1bmN0aW9uKG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IGluaXRDbG9uZU9iamVjdChzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzQ29tbW9uKSB7XG4gICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgc3RhY2suc2V0KHNyY1ZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgbWVyZ2VGdW5jKG5ld1ZhbHVlLCBzcmNWYWx1ZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICBzdGFja1snZGVsZXRlJ10oc3JjVmFsdWUpO1xuICB9XG4gIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWVyZ2VEZWVwO1xuIiwidmFyIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKSxcbiAgICBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGJhc2VNYXAgPSByZXF1aXJlKCcuL19iYXNlTWFwJyksXG4gICAgYmFzZVNvcnRCeSA9IHJlcXVpcmUoJy4vX2Jhc2VTb3J0QnknKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBjb21wYXJlTXVsdGlwbGUgPSByZXF1aXJlKCcuL19jb21wYXJlTXVsdGlwbGUnKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ub3JkZXJCeWAgd2l0aG91dCBwYXJhbSBndWFyZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gaXRlcmF0ZWVzIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAqIEBwYXJhbSB7c3RyaW5nW119IG9yZGVycyBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKSB7XG4gIGlmIChpdGVyYXRlZXMubGVuZ3RoKSB7XG4gICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgaWYgKGlzQXJyYXkoaXRlcmF0ZWUpKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBiYXNlR2V0KHZhbHVlLCBpdGVyYXRlZS5sZW5ndGggPT09IDEgPyBpdGVyYXRlZVswXSA6IGl0ZXJhdGVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZXJhdGVlO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGl0ZXJhdGVlcyA9IFtpZGVudGl0eV07XG4gIH1cblxuICB2YXIgaW5kZXggPSAtMTtcbiAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBiYXNlVW5hcnkoYmFzZUl0ZXJhdGVlKSk7XG5cbiAgdmFyIHJlc3VsdCA9IGJhc2VNYXAoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgIHZhciBjcml0ZXJpYSA9IGFycmF5TWFwKGl0ZXJhdGVlcywgZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBpdGVyYXRlZSh2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgJ2NyaXRlcmlhJzogY3JpdGVyaWEsICdpbmRleCc6ICsraW5kZXgsICd2YWx1ZSc6IHZhbHVlIH07XG4gIH0pO1xuXG4gIHJldHVybiBiYXNlU29ydEJ5KHJlc3VsdCwgZnVuY3Rpb24ob2JqZWN0LCBvdGhlcikge1xuICAgIHJldHVybiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKTtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZU9yZGVyQnk7XG4iLCJ2YXIgYmFzZVBpY2tCeSA9IHJlcXVpcmUoJy4vX2Jhc2VQaWNrQnknKSxcbiAgICBoYXNJbiA9IHJlcXVpcmUoJy4vaGFzSW4nKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5waWNrYCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWxcbiAqIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBiYXNlUGljayhvYmplY3QsIHBhdGhzKSB7XG4gIHJldHVybiBiYXNlUGlja0J5KG9iamVjdCwgcGF0aHMsIGZ1bmN0aW9uKHZhbHVlLCBwYXRoKSB7XG4gICAgcmV0dXJuIGhhc0luKG9iamVjdCwgcGF0aCk7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VQaWNrO1xuIiwidmFyIGJhc2VHZXQgPSByZXF1aXJlKCcuL19iYXNlR2V0JyksXG4gICAgYmFzZVNldCA9IHJlcXVpcmUoJy4vX2Jhc2VTZXQnKSxcbiAgICBjYXN0UGF0aCA9IHJlcXVpcmUoJy4vX2Nhc3RQYXRoJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgIGBfLnBpY2tCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBwcmVkaWNhdGUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICByZXN1bHQgPSB7fTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBwYXRoID0gcGF0aHNbaW5kZXhdLFxuICAgICAgICB2YWx1ZSA9IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcblxuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIHBhdGgpKSB7XG4gICAgICBiYXNlU2V0KHJlc3VsdCwgY2FzdFBhdGgocGF0aCwgb2JqZWN0KSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VQaWNrQnk7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnByb3BlcnR5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VQcm9wZXJ0eShrZXkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VQcm9wZXJ0eTtcbiIsInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVByb3BlcnR5YCB3aGljaCBzdXBwb3J0cyBkZWVwIHBhdGhzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VQcm9wZXJ0eURlZXAocGF0aCkge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUHJvcGVydHlEZWVwO1xuIiwiLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUNlaWwgPSBNYXRoLmNlaWwsXG4gICAgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZ2VgIGFuZCBgXy5yYW5nZVJpZ2h0YCB3aGljaCBkb2Vzbid0XG4gKiBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gc3RlcCBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICovXG5mdW5jdGlvbiBiYXNlUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCwgZnJvbVJpZ2h0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KG5hdGl2ZUNlaWwoKGVuZCAtIHN0YXJ0KSAvIChzdGVwIHx8IDEpKSwgMCksXG4gICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIHJlc3VsdFtmcm9tUmlnaHQgPyBsZW5ndGggOiArK2luZGV4XSA9IHN0YXJ0O1xuICAgIHN0YXJ0ICs9IHN0ZXA7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUmFuZ2U7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlZHVjZWAgYW5kIGBfLnJlZHVjZVJpZ2h0YCwgd2l0aG91dCBzdXBwb3J0XG4gKiBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgY29sbGVjdGlvbmAgdXNpbmcgYGVhY2hGdW5jYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Kn0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluaXRBY2N1bSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBvciBsYXN0IGVsZW1lbnQgb2ZcbiAqICBgY29sbGVjdGlvbmAgYXMgdGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZVJlZHVjZShjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgZWFjaEZ1bmMpIHtcbiAgZWFjaEZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgYWNjdW11bGF0b3IgPSBpbml0QWNjdW1cbiAgICAgID8gKGluaXRBY2N1bSA9IGZhbHNlLCB2YWx1ZSlcbiAgICAgIDogaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gIH0pO1xuICByZXR1cm4gYWNjdW11bGF0b3I7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVJlZHVjZTtcbiIsInZhciBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKSxcbiAgICBvdmVyUmVzdCA9IHJlcXVpcmUoJy4vX292ZXJSZXN0JyksXG4gICAgc2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19zZXRUb1N0cmluZycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlc3RgIHdoaWNoIGRvZXNuJ3QgdmFsaWRhdGUgb3IgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUmVzdChmdW5jLCBzdGFydCkge1xuICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgc3RhcnQsIGlkZW50aXR5KSwgZnVuYyArICcnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUmVzdDtcbiIsInZhciBhc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnblZhbHVlJyksXG4gICAgY2FzdFBhdGggPSByZXF1aXJlKCcuL19jYXN0UGF0aCcpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgdG9LZXkgPSByZXF1aXJlKCcuL190b0tleScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNldGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcikge1xuICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0O1xuICB9XG4gIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxLFxuICAgICAgbmVzdGVkID0gb2JqZWN0O1xuXG4gIHdoaWxlIChuZXN0ZWQgIT0gbnVsbCAmJiArK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKSxcbiAgICAgICAgbmV3VmFsdWUgPSB2YWx1ZTtcblxuICAgIGlmIChrZXkgPT09ICdfX3Byb3RvX18nIHx8IGtleSA9PT0gJ2NvbnN0cnVjdG9yJyB8fCBrZXkgPT09ICdwcm90b3R5cGUnKSB7XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIGlmIChpbmRleCAhPSBsYXN0SW5kZXgpIHtcbiAgICAgIHZhciBvYmpWYWx1ZSA9IG5lc3RlZFtrZXldO1xuICAgICAgbmV3VmFsdWUgPSBjdXN0b21pemVyID8gY3VzdG9taXplcihvYmpWYWx1ZSwga2V5LCBuZXN0ZWQpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBpc09iamVjdChvYmpWYWx1ZSlcbiAgICAgICAgICA/IG9ialZhbHVlXG4gICAgICAgICAgOiAoaXNJbmRleChwYXRoW2luZGV4ICsgMV0pID8gW10gOiB7fSk7XG4gICAgICB9XG4gICAgfVxuICAgIGFzc2lnblZhbHVlKG5lc3RlZCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgbmVzdGVkID0gbmVzdGVkW2tleV07XG4gIH1cbiAgcmV0dXJuIG9iamVjdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlU2V0O1xuIiwidmFyIGNvbnN0YW50ID0gcmVxdWlyZSgnLi9jb25zdGFudCcpLFxuICAgIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fZGVmaW5lUHJvcGVydHknKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0VG9TdHJpbmdgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3Agc2hvcnRpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICovXG52YXIgYmFzZVNldFRvU3RyaW5nID0gIWRlZmluZVByb3BlcnR5ID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBzdHJpbmcpIHtcbiAgcmV0dXJuIGRlZmluZVByb3BlcnR5KGZ1bmMsICd0b1N0cmluZycsIHtcbiAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAnZW51bWVyYWJsZSc6IGZhbHNlLFxuICAgICd2YWx1ZSc6IGNvbnN0YW50KHN0cmluZyksXG4gICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNldFRvU3RyaW5nO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0QnlgIHdoaWNoIHVzZXMgYGNvbXBhcmVyYCB0byBkZWZpbmUgdGhlXG4gKiBzb3J0IG9yZGVyIG9mIGBhcnJheWAgYW5kIHJlcGxhY2VzIGNyaXRlcmlhIG9iamVjdHMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nXG4gKiB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzb3J0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyZXIgVGhlIGZ1bmN0aW9uIHRvIGRlZmluZSBzb3J0IG9yZGVyLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VTb3J0QnkoYXJyYXksIGNvbXBhcmVyKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgYXJyYXkuc29ydChjb21wYXJlcik7XG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIGFycmF5W2xlbmd0aF0gPSBhcnJheVtsZW5ndGhdLnZhbHVlO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlU29ydEJ5O1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzXG4gKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVGltZXM7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgYXJyYXlNYXAgPSByZXF1aXJlKCcuL19hcnJheU1hcCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by50b1N0cmluZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2hcbiAqIHZhbHVlcyB0byBlbXB0eSBzdHJpbmdzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpIHtcbiAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAvLyBSZWN1cnNpdmVseSBjb252ZXJ0IHZhbHVlcyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVG9TdHJpbmc7XG4iLCJ2YXIgdHJpbW1lZEVuZEluZGV4ID0gcmVxdWlyZSgnLi9fdHJpbW1lZEVuZEluZGV4Jyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW1TdGFydCA9IC9eXFxzKy87XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udHJpbWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byB0cmltLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUcmltKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nXG4gICAgPyBzdHJpbmcuc2xpY2UoMCwgdHJpbW1lZEVuZEluZGV4KHN0cmluZykgKyAxKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJylcbiAgICA6IHN0cmluZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVHJpbTtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5hcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3Igc3RvcmluZyBtZXRhZGF0YS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jKHZhbHVlKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVW5hcnk7XG4iLCJ2YXIgU2V0Q2FjaGUgPSByZXF1aXJlKCcuL19TZXRDYWNoZScpLFxuICAgIGFycmF5SW5jbHVkZXMgPSByZXF1aXJlKCcuL19hcnJheUluY2x1ZGVzJyksXG4gICAgYXJyYXlJbmNsdWRlc1dpdGggPSByZXF1aXJlKCcuL19hcnJheUluY2x1ZGVzV2l0aCcpLFxuICAgIGNhY2hlSGFzID0gcmVxdWlyZSgnLi9fY2FjaGVIYXMnKSxcbiAgICBjcmVhdGVTZXQgPSByZXF1aXJlKCcuL19jcmVhdGVTZXQnKSxcbiAgICBzZXRUb0FycmF5ID0gcmVxdWlyZSgnLi9fc2V0VG9BcnJheScpO1xuXG4vKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbnZhciBMQVJHRV9BUlJBWV9TSVpFID0gMjAwO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuaXFCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlVW5pcShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXMsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICBpc0NvbW1vbiA9IHRydWUsXG4gICAgICByZXN1bHQgPSBbXSxcbiAgICAgIHNlZW4gPSByZXN1bHQ7XG5cbiAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gIH1cbiAgZWxzZSBpZiAobGVuZ3RoID49IExBUkdFX0FSUkFZX1NJWkUpIHtcbiAgICB2YXIgc2V0ID0gaXRlcmF0ZWUgPyBudWxsIDogY3JlYXRlU2V0KGFycmF5KTtcbiAgICBpZiAoc2V0KSB7XG4gICAgICByZXR1cm4gc2V0VG9BcnJheShzZXQpO1xuICAgIH1cbiAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgIGluY2x1ZGVzID0gY2FjaGVIYXM7XG4gICAgc2VlbiA9IG5ldyBTZXRDYWNoZTtcbiAgfVxuICBlbHNlIHtcbiAgICBzZWVuID0gaXRlcmF0ZWUgPyBbXSA6IHJlc3VsdDtcbiAgfVxuICBvdXRlcjpcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgIGlmIChpc0NvbW1vbiAmJiBjb21wdXRlZCA9PT0gY29tcHV0ZWQpIHtcbiAgICAgIHZhciBzZWVuSW5kZXggPSBzZWVuLmxlbmd0aDtcbiAgICAgIHdoaWxlIChzZWVuSW5kZXgtLSkge1xuICAgICAgICBpZiAoc2VlbltzZWVuSW5kZXhdID09PSBjb21wdXRlZCkge1xuICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXRlcmF0ZWUpIHtcbiAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIWluY2x1ZGVzKHNlZW4sIGNvbXB1dGVkLCBjb21wYXJhdG9yKSkge1xuICAgICAgaWYgKHNlZW4gIT09IHJlc3VsdCkge1xuICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VVbmlxO1xuIiwidmFyIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy52YWx1ZXNgIGFuZCBgXy52YWx1ZXNJbmAgd2hpY2ggY3JlYXRlcyBhblxuICogYXJyYXkgb2YgYG9iamVjdGAgcHJvcGVydHkgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzXG4gKiBvZiBgcHJvcHNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VWYWx1ZXMob2JqZWN0LCBwcm9wcykge1xuICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVZhbHVlcztcbiIsIi8qKlxuICogVGhpcyBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnppcE9iamVjdGAgd2hpY2ggYXNzaWducyB2YWx1ZXMgdXNpbmcgYGFzc2lnbkZ1bmNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGFzc2lnbkZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBiYXNlWmlwT2JqZWN0KHByb3BzLCB2YWx1ZXMsIGFzc2lnbkZ1bmMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGgsXG4gICAgICB2YWxzTGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IHt9O1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gaW5kZXggPCB2YWxzTGVuZ3RoID8gdmFsdWVzW2luZGV4XSA6IHVuZGVmaW5lZDtcbiAgICBhc3NpZ25GdW5jKHJlc3VsdCwgcHJvcHNbaW5kZXhdLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlWmlwT2JqZWN0O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYSBgY2FjaGVgIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBUaGUgY2FjaGUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gY2FjaGVIYXMoY2FjaGUsIGtleSkge1xuICByZXR1cm4gY2FjaGUuaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FjaGVIYXM7XG4iLCJ2YXIgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG5cbi8qKlxuICogQ2FzdHMgYHZhbHVlYCB0byBgaWRlbnRpdHlgIGlmIGl0J3Mgbm90IGEgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgY2FzdCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY2FzdEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlIDogaWRlbnRpdHk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FzdEZ1bmN0aW9uO1xuIiwidmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0tleSA9IHJlcXVpcmUoJy4vX2lzS2V5JyksXG4gICAgc3RyaW5nVG9QYXRoID0gcmVxdWlyZSgnLi9fc3RyaW5nVG9QYXRoJyksXG4gICAgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyk7XG5cbi8qKlxuICogQ2FzdHMgYHZhbHVlYCB0byBhIHBhdGggYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICovXG5mdW5jdGlvbiBjYXN0UGF0aCh2YWx1ZSwgb2JqZWN0KSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gaXNLZXkodmFsdWUsIG9iamVjdCkgPyBbdmFsdWVdIDogc3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FzdFBhdGg7XG4iLCJ2YXIgVWludDhBcnJheSA9IHJlcXVpcmUoJy4vX1VpbnQ4QXJyYXknKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGFycmF5QnVmZmVyYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyYXlCdWZmZXIgVGhlIGFycmF5IGJ1ZmZlciB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtBcnJheUJ1ZmZlcn0gUmV0dXJucyB0aGUgY2xvbmVkIGFycmF5IGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcikge1xuICB2YXIgcmVzdWx0ID0gbmV3IGFycmF5QnVmZmVyLmNvbnN0cnVjdG9yKGFycmF5QnVmZmVyLmJ5dGVMZW5ndGgpO1xuICBuZXcgVWludDhBcnJheShyZXN1bHQpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lQXJyYXlCdWZmZXI7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gcm9vdC5CdWZmZXIgOiB1bmRlZmluZWQsXG4gICAgYWxsb2NVbnNhZmUgPSBCdWZmZXIgPyBCdWZmZXIuYWxsb2NVbnNhZmUgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mICBgYnVmZmVyYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZmZlciBUaGUgYnVmZmVyIHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIGNsb25lQnVmZmVyKGJ1ZmZlciwgaXNEZWVwKSB7XG4gIGlmIChpc0RlZXApIHtcbiAgICByZXR1cm4gYnVmZmVyLnNsaWNlKCk7XG4gIH1cbiAgdmFyIGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBhbGxvY1Vuc2FmZSA/IGFsbG9jVW5zYWZlKGxlbmd0aCkgOiBuZXcgYnVmZmVyLmNvbnN0cnVjdG9yKGxlbmd0aCk7XG5cbiAgYnVmZmVyLmNvcHkocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZUJ1ZmZlcjtcbiIsInZhciBjbG9uZUFycmF5QnVmZmVyID0gcmVxdWlyZSgnLi9fY2xvbmVBcnJheUJ1ZmZlcicpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgZGF0YVZpZXdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YVZpZXcgVGhlIGRhdGEgdmlldyB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgZGF0YSB2aWV3LlxuICovXG5mdW5jdGlvbiBjbG9uZURhdGFWaWV3KGRhdGFWaWV3LCBpc0RlZXApIHtcbiAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKSA6IGRhdGFWaWV3LmJ1ZmZlcjtcbiAgcmV0dXJuIG5ldyBkYXRhVmlldy5jb25zdHJ1Y3RvcihidWZmZXIsIGRhdGFWaWV3LmJ5dGVPZmZzZXQsIGRhdGFWaWV3LmJ5dGVMZW5ndGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lRGF0YVZpZXc7XG4iLCIvKiogVXNlZCB0byBtYXRjaCBgUmVnRXhwYCBmbGFncyBmcm9tIHRoZWlyIGNvZXJjZWQgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUZsYWdzID0gL1xcdyokLztcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHJlZ2V4cGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWdleHAgVGhlIHJlZ2V4cCB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCByZWdleHAuXG4gKi9cbmZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCkge1xuICB2YXIgcmVzdWx0ID0gbmV3IHJlZ2V4cC5jb25zdHJ1Y3RvcihyZWdleHAuc291cmNlLCByZUZsYWdzLmV4ZWMocmVnZXhwKSk7XG4gIHJlc3VsdC5sYXN0SW5kZXggPSByZWdleHAubGFzdEluZGV4O1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lUmVnRXhwO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpO1xuXG4vKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbnZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGBzeW1ib2xgIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN5bWJvbCBUaGUgc3ltYm9sIG9iamVjdCB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBzeW1ib2wgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBjbG9uZVN5bWJvbChzeW1ib2wpIHtcbiAgcmV0dXJuIHN5bWJvbFZhbHVlT2YgPyBPYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpIDoge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVTeW1ib2w7XG4iLCJ2YXIgY2xvbmVBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQXJyYXlCdWZmZXInKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHR5cGVkQXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gdHlwZWRBcnJheSBUaGUgdHlwZWQgYXJyYXkgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHR5cGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBjbG9uZVR5cGVkQXJyYXkodHlwZWRBcnJheSwgaXNEZWVwKSB7XG4gIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyO1xuICByZXR1cm4gbmV3IHR5cGVkQXJyYXkuY29uc3RydWN0b3IoYnVmZmVyLCB0eXBlZEFycmF5LmJ5dGVPZmZzZXQsIHR5cGVkQXJyYXkubGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZVR5cGVkQXJyYXk7XG4iLCJ2YXIgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKlxuICogQ29tcGFyZXMgdmFsdWVzIHRvIHNvcnQgdGhlbSBpbiBhc2NlbmRpbmcgb3JkZXIuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc29ydCBvcmRlciBpbmRpY2F0b3IgZm9yIGB2YWx1ZWAuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcodmFsdWUsIG90aGVyKSB7XG4gIGlmICh2YWx1ZSAhPT0gb3RoZXIpIHtcbiAgICB2YXIgdmFsSXNEZWZpbmVkID0gdmFsdWUgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgdmFsSXNOdWxsID0gdmFsdWUgPT09IG51bGwsXG4gICAgICAgIHZhbElzUmVmbGV4aXZlID0gdmFsdWUgPT09IHZhbHVlLFxuICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKTtcblxuICAgIHZhciBvdGhJc0RlZmluZWQgPSBvdGhlciAhPT0gdW5kZWZpbmVkLFxuICAgICAgICBvdGhJc051bGwgPSBvdGhlciA9PT0gbnVsbCxcbiAgICAgICAgb3RoSXNSZWZsZXhpdmUgPSBvdGhlciA9PT0gb3RoZXIsXG4gICAgICAgIG90aElzU3ltYm9sID0gaXNTeW1ib2wob3RoZXIpO1xuXG4gICAgaWYgKCghb3RoSXNOdWxsICYmICFvdGhJc1N5bWJvbCAmJiAhdmFsSXNTeW1ib2wgJiYgdmFsdWUgPiBvdGhlcikgfHxcbiAgICAgICAgKHZhbElzU3ltYm9sICYmIG90aElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSAmJiAhb3RoSXNOdWxsICYmICFvdGhJc1N5bWJvbCkgfHxcbiAgICAgICAgKHZhbElzTnVsbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICghdmFsSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAhdmFsSXNSZWZsZXhpdmUpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBpZiAoKCF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sICYmICFvdGhJc1N5bWJvbCAmJiB2YWx1ZSA8IG90aGVyKSB8fFxuICAgICAgICAob3RoSXNTeW1ib2wgJiYgdmFsSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlICYmICF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sKSB8fFxuICAgICAgICAob3RoSXNOdWxsICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgKCFvdGhJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICFvdGhJc1JlZmxleGl2ZSkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb21wYXJlQXNjZW5kaW5nO1xuIiwidmFyIGNvbXBhcmVBc2NlbmRpbmcgPSByZXF1aXJlKCcuL19jb21wYXJlQXNjZW5kaW5nJyk7XG5cbi8qKlxuICogVXNlZCBieSBgXy5vcmRlckJ5YCB0byBjb21wYXJlIG11bHRpcGxlIHByb3BlcnRpZXMgb2YgYSB2YWx1ZSB0byBhbm90aGVyXG4gKiBhbmQgc3RhYmxlIHNvcnQgdGhlbS5cbiAqXG4gKiBJZiBgb3JkZXJzYCBpcyB1bnNwZWNpZmllZCwgYWxsIHZhbHVlcyBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gT3RoZXJ3aXNlLFxuICogc3BlY2lmeSBhbiBvcmRlciBvZiBcImRlc2NcIiBmb3IgZGVzY2VuZGluZyBvciBcImFzY1wiIGZvciBhc2NlbmRpbmcgc29ydCBvcmRlclxuICogb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbltdfHN0cmluZ1tdfSBvcmRlcnMgVGhlIG9yZGVyIHRvIHNvcnQgYnkgZm9yIGVhY2ggcHJvcGVydHkuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVNdWx0aXBsZShvYmplY3QsIG90aGVyLCBvcmRlcnMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBvYmpDcml0ZXJpYSA9IG9iamVjdC5jcml0ZXJpYSxcbiAgICAgIG90aENyaXRlcmlhID0gb3RoZXIuY3JpdGVyaWEsXG4gICAgICBsZW5ndGggPSBvYmpDcml0ZXJpYS5sZW5ndGgsXG4gICAgICBvcmRlcnNMZW5ndGggPSBvcmRlcnMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHJlc3VsdCA9IGNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLCBvdGhDcml0ZXJpYVtpbmRleF0pO1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIGlmIChpbmRleCA+PSBvcmRlcnNMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHZhciBvcmRlciA9IG9yZGVyc1tpbmRleF07XG4gICAgICByZXR1cm4gcmVzdWx0ICogKG9yZGVyID09ICdkZXNjJyA/IC0xIDogMSk7XG4gICAgfVxuICB9XG4gIC8vIEZpeGVzIGFuIGBBcnJheSNzb3J0YCBidWcgaW4gdGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBhcHBsaWNhdGlvbnNcbiAgLy8gdGhhdCBjYXVzZXMgaXQsIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgdG8gcHJvdmlkZSB0aGUgc2FtZSB2YWx1ZSBmb3JcbiAgLy8gYG9iamVjdGAgYW5kIGBvdGhlcmAuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vamFzaGtlbmFzL3VuZGVyc2NvcmUvcHVsbC8xMjQ3XG4gIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gIC8vXG4gIC8vIFRoaXMgYWxzbyBlbnN1cmVzIGEgc3RhYmxlIHNvcnQgaW4gVjggYW5kIG90aGVyIGVuZ2luZXMuXG4gIC8vIFNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD05MCBmb3IgbW9yZSBkZXRhaWxzLlxuICByZXR1cm4gb2JqZWN0LmluZGV4IC0gb3RoZXIuaW5kZXg7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZU11bHRpcGxlO1xuIiwiLyoqXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXk9W11dIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyB0by5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgYXJyYXkgfHwgKGFycmF5ID0gQXJyYXkobGVuZ3RoKSk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weUFycmF5O1xuIiwidmFyIGFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduVmFsdWUnKSxcbiAgICBiYXNlQXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19iYXNlQXNzaWduVmFsdWUnKTtcblxuLyoqXG4gKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzIHRvIGNvcHkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb3BpZWQgdmFsdWVzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHtcbiAgdmFyIGlzTmV3ID0gIW9iamVjdDtcbiAgb2JqZWN0IHx8IChvYmplY3QgPSB7fSk7XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuXG4gICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgPyBjdXN0b21pemVyKG9iamVjdFtrZXldLCBzb3VyY2Vba2V5XSwga2V5LCBvYmplY3QsIHNvdXJjZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG5ld1ZhbHVlID0gc291cmNlW2tleV07XG4gICAgfVxuICAgIGlmIChpc05ldykge1xuICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weU9iamVjdDtcbiIsInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGdldFN5bWJvbHMgPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzJyk7XG5cbi8qKlxuICogQ29waWVzIG93biBzeW1ib2xzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIGZyb20uXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgdG8uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBjb3B5U3ltYm9scyhzb3VyY2UsIG9iamVjdCkge1xuICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHMoc291cmNlKSwgb2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5U3ltYm9scztcbiIsInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGdldFN5bWJvbHNJbiA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHNJbicpO1xuXG4vKipcbiAqIENvcGllcyBvd24gYW5kIGluaGVyaXRlZCBzeW1ib2xzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIGZyb20uXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgdG8uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBjb3B5U3ltYm9sc0luKHNvdXJjZSwgb2JqZWN0KSB7XG4gIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9sc0luKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weVN5bWJvbHNJbjtcbiIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovXG52YXIgY29yZUpzRGF0YSA9IHJvb3RbJ19fY29yZS1qc19zaGFyZWRfXyddO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcmVKc0RhdGE7XG4iLCJ2YXIgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGlzSXRlcmF0ZWVDYWxsID0gcmVxdWlyZSgnLi9faXNJdGVyYXRlZUNhbGwnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5hc3NpZ25gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25lciBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFzc2lnbmVyIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVBc3NpZ25lcihhc3NpZ25lcikge1xuICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2VzKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoLFxuICAgICAgICBjdXN0b21pemVyID0gbGVuZ3RoID4gMSA/IHNvdXJjZXNbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQsXG4gICAgICAgIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICBjdXN0b21pemVyID0gKGFzc2lnbmVyLmxlbmd0aCA+IDMgJiYgdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJylcbiAgICAgID8gKGxlbmd0aC0tLCBjdXN0b21pemVyKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgICBjdXN0b21pemVyID0gbGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IGN1c3RvbWl6ZXI7XG4gICAgICBsZW5ndGggPSAxO1xuICAgIH1cbiAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICBhc3NpZ25lcihvYmplY3QsIHNvdXJjZSwgaW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0O1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVBc3NpZ25lcjtcbiIsInZhciBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYGJhc2VFYWNoYCBvciBgYmFzZUVhY2hSaWdodGAgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYSBjb2xsZWN0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVCYXNlRWFjaChlYWNoRnVuYywgZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgIH1cbiAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICByZXR1cm4gZWFjaEZ1bmMoY29sbGVjdGlvbiwgaXRlcmF0ZWUpO1xuICAgIH1cbiAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTEsXG4gICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuXG4gICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtpbmRleF0sIGluZGV4LCBpdGVyYWJsZSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVCYXNlRWFjaDtcbiIsIi8qKlxuICogQ3JlYXRlcyBhIGJhc2UgZnVuY3Rpb24gZm9yIG1ldGhvZHMgbGlrZSBgXy5mb3JJbmAgYW5kIGBfLmZvck93bmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgaXRlcmF0ZWUsIGtleXNGdW5jKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KG9iamVjdCksXG4gICAgICAgIHByb3BzID0ga2V5c0Z1bmMob2JqZWN0KSxcbiAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICB2YXIga2V5ID0gcHJvcHNbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF07XG4gICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVba2V5XSwga2V5LCBpdGVyYWJsZSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0O1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUJhc2VGb3I7XG4iLCJ2YXIgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgXy5maW5kYCBvciBgXy5maW5kTGFzdGAgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbmRJbmRleEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGNvbGxlY3Rpb24gaW5kZXguXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmaW5kIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVGaW5kKGZpbmRJbmRleEZ1bmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gICAgdmFyIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuICAgIGlmICghaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGJhc2VJdGVyYXRlZShwcmVkaWNhdGUsIDMpO1xuICAgICAgY29sbGVjdGlvbiA9IGtleXMoY29sbGVjdGlvbik7XG4gICAgICBwcmVkaWNhdGUgPSBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpOyB9O1xuICAgIH1cbiAgICB2YXIgaW5kZXggPSBmaW5kSW5kZXhGdW5jKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZnJvbUluZGV4KTtcbiAgICByZXR1cm4gaW5kZXggPiAtMSA/IGl0ZXJhYmxlW2l0ZXJhdGVlID8gY29sbGVjdGlvbltpbmRleF0gOiBpbmRleF0gOiB1bmRlZmluZWQ7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlRmluZDtcbiIsInZhciBiYXNlUmFuZ2UgPSByZXF1aXJlKCcuL19iYXNlUmFuZ2UnKSxcbiAgICBpc0l0ZXJhdGVlQ2FsbCA9IHJlcXVpcmUoJy4vX2lzSXRlcmF0ZWVDYWxsJyksXG4gICAgdG9GaW5pdGUgPSByZXF1aXJlKCcuL3RvRmluaXRlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGBfLnJhbmdlYCBvciBgXy5yYW5nZVJpZ2h0YCBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByYW5nZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUmFuZ2UoZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihzdGFydCwgZW5kLCBzdGVwKSB7XG4gICAgaWYgKHN0ZXAgJiYgdHlwZW9mIHN0ZXAgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoc3RhcnQsIGVuZCwgc3RlcCkpIHtcbiAgICAgIGVuZCA9IHN0ZXAgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIEVuc3VyZSB0aGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAgICBzdGFydCA9IHRvRmluaXRlKHN0YXJ0KTtcbiAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgc3RhcnQgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmQgPSB0b0Zpbml0ZShlbmQpO1xuICAgIH1cbiAgICBzdGVwID0gc3RlcCA9PT0gdW5kZWZpbmVkID8gKHN0YXJ0IDwgZW5kID8gMSA6IC0xKSA6IHRvRmluaXRlKHN0ZXApO1xuICAgIHJldHVybiBiYXNlUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCwgZnJvbVJpZ2h0KTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVSYW5nZTtcbiIsInZhciBTZXQgPSByZXF1aXJlKCcuL19TZXQnKSxcbiAgICBub29wID0gcmVxdWlyZSgnLi9ub29wJyksXG4gICAgc2V0VG9BcnJheSA9IHJlcXVpcmUoJy4vX3NldFRvQXJyYXknKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2V0IG9iamVjdCBvZiBgdmFsdWVzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYWRkIHRvIHRoZSBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgc2V0LlxuICovXG52YXIgY3JlYXRlU2V0ID0gIShTZXQgJiYgKDEgLyBzZXRUb0FycmF5KG5ldyBTZXQoWywtMF0pKVsxXSkgPT0gSU5GSU5JVFkpID8gbm9vcCA6IGZ1bmN0aW9uKHZhbHVlcykge1xuICByZXR1cm4gbmV3IFNldCh2YWx1ZXMpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVTZXQ7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyk7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICB2YXIgZnVuYyA9IGdldE5hdGl2ZShPYmplY3QsICdkZWZpbmVQcm9wZXJ0eScpO1xuICAgIGZ1bmMoe30sICcnLCB7fSk7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmluZVByb3BlcnR5O1xuIiwidmFyIFNldENhY2hlID0gcmVxdWlyZSgnLi9fU2V0Q2FjaGUnKSxcbiAgICBhcnJheVNvbWUgPSByZXF1aXJlKCcuL19hcnJheVNvbWUnKSxcbiAgICBjYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2NhY2hlSGFzJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGFycmF5cyB3aXRoIHN1cHBvcnQgZm9yXG4gKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBhcnJheWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJyYXlzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsQXJyYXlzKGFycmF5LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLFxuICAgICAgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgb3RoTGVuZ3RoID0gb3RoZXIubGVuZ3RoO1xuXG4gIGlmIChhcnJMZW5ndGggIT0gb3RoTGVuZ3RoICYmICEoaXNQYXJ0aWFsICYmIG90aExlbmd0aCA+IGFyckxlbmd0aCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gQ2hlY2sgdGhhdCBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgdmFyIGFyclN0YWNrZWQgPSBzdGFjay5nZXQoYXJyYXkpO1xuICB2YXIgb3RoU3RhY2tlZCA9IHN0YWNrLmdldChvdGhlcik7XG4gIGlmIChhcnJTdGFja2VkICYmIG90aFN0YWNrZWQpIHtcbiAgICByZXR1cm4gYXJyU3RhY2tlZCA9PSBvdGhlciAmJiBvdGhTdGFja2VkID09IGFycmF5O1xuICB9XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gdHJ1ZSxcbiAgICAgIHNlZW4gPSAoYml0bWFzayAmIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpID8gbmV3IFNldENhY2hlIDogdW5kZWZpbmVkO1xuXG4gIHN0YWNrLnNldChhcnJheSwgb3RoZXIpO1xuICBzdGFjay5zZXQob3RoZXIsIGFycmF5KTtcblxuICAvLyBJZ25vcmUgbm9uLWluZGV4IHByb3BlcnRpZXMuXG4gIHdoaWxlICgrK2luZGV4IDwgYXJyTGVuZ3RoKSB7XG4gICAgdmFyIGFyclZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBvdGhWYWx1ZSA9IG90aGVyW2luZGV4XTtcblxuICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBhcnJWYWx1ZSwgaW5kZXgsIG90aGVyLCBhcnJheSwgc3RhY2spXG4gICAgICAgIDogY3VzdG9taXplcihhcnJWYWx1ZSwgb3RoVmFsdWUsIGluZGV4LCBhcnJheSwgb3RoZXIsIHN0YWNrKTtcbiAgICB9XG4gICAgaWYgKGNvbXBhcmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChjb21wYXJlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgaWYgKHNlZW4pIHtcbiAgICAgIGlmICghYXJyYXlTb21lKG90aGVyLCBmdW5jdGlvbihvdGhWYWx1ZSwgb3RoSW5kZXgpIHtcbiAgICAgICAgICAgIGlmICghY2FjaGVIYXMoc2Vlbiwgb3RoSW5kZXgpICYmXG4gICAgICAgICAgICAgICAgKGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZWVuLnB1c2gob3RoSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKSB7XG4gICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCEoXG4gICAgICAgICAgYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8XG4gICAgICAgICAgICBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgKSkge1xuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgc3RhY2tbJ2RlbGV0ZSddKGFycmF5KTtcbiAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlcXVhbEFycmF5cztcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBVaW50OEFycmF5ID0gcmVxdWlyZSgnLi9fVWludDhBcnJheScpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGVxdWFsQXJyYXlzID0gcmVxdWlyZSgnLi9fZXF1YWxBcnJheXMnKSxcbiAgICBtYXBUb0FycmF5ID0gcmVxdWlyZSgnLi9fbWFwVG9BcnJheScpLFxuICAgIHNldFRvQXJyYXkgPSByZXF1aXJlKCcuL19zZXRUb0FycmF5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nO1xuXG4vKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbnZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGNvbXBhcmluZyBvYmplY3RzIG9mXG4gKiB0aGUgc2FtZSBgdG9TdHJpbmdUYWdgLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY29tcGFyaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2ZcbiAqIGBCb29sZWFuYCwgYERhdGVgLCBgRXJyb3JgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIG9yIGBTdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBgdG9TdHJpbmdUYWdgIG9mIHRoZSBvYmplY3RzIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCB0YWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlIGRhdGFWaWV3VGFnOlxuICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgIChvYmplY3QuYnl0ZU9mZnNldCAhPSBvdGhlci5ieXRlT2Zmc2V0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBvYmplY3QuYnVmZmVyO1xuICAgICAgb3RoZXIgPSBvdGhlci5idWZmZXI7XG5cbiAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICFlcXVhbEZ1bmMobmV3IFVpbnQ4QXJyYXkob2JqZWN0KSwgbmV3IFVpbnQ4QXJyYXkob3RoZXIpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgYm9vbFRhZzpcbiAgICBjYXNlIGRhdGVUYWc6XG4gICAgY2FzZSBudW1iZXJUYWc6XG4gICAgICAvLyBDb2VyY2UgYm9vbGVhbnMgdG8gYDFgIG9yIGAwYCBhbmQgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzLlxuICAgICAgLy8gSW52YWxpZCBkYXRlcyBhcmUgY29lcmNlZCB0byBgTmFOYC5cbiAgICAgIHJldHVybiBlcSgrb2JqZWN0LCArb3RoZXIpO1xuXG4gICAgY2FzZSBlcnJvclRhZzpcbiAgICAgIHJldHVybiBvYmplY3QubmFtZSA9PSBvdGhlci5uYW1lICYmIG9iamVjdC5tZXNzYWdlID09IG90aGVyLm1lc3NhZ2U7XG5cbiAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgIC8vIENvZXJjZSByZWdleGVzIHRvIHN0cmluZ3MgYW5kIHRyZWF0IHN0cmluZ3MsIHByaW1pdGl2ZXMgYW5kIG9iamVjdHMsXG4gICAgICAvLyBhcyBlcXVhbC4gU2VlIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1yZWdleHAucHJvdG90eXBlLnRvc3RyaW5nXG4gICAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgcmV0dXJuIG9iamVjdCA9PSAob3RoZXIgKyAnJyk7XG5cbiAgICBjYXNlIG1hcFRhZzpcbiAgICAgIHZhciBjb252ZXJ0ID0gbWFwVG9BcnJheTtcblxuICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRztcbiAgICAgIGNvbnZlcnQgfHwgKGNvbnZlcnQgPSBzZXRUb0FycmF5KTtcblxuICAgICAgaWYgKG9iamVjdC5zaXplICE9IG90aGVyLnNpemUgJiYgIWlzUGFydGlhbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xuICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrZWQgPT0gb3RoZXI7XG4gICAgICB9XG4gICAgICBiaXRtYXNrIHw9IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUc7XG5cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICAgICAgdmFyIHJlc3VsdCA9IGVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSwgY29udmVydChvdGhlciksIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICBpZiAoc3ltYm9sVmFsdWVPZikge1xuICAgICAgICByZXR1cm4gc3ltYm9sVmFsdWVPZi5jYWxsKG9iamVjdCkgPT0gc3ltYm9sVmFsdWVPZi5jYWxsKG90aGVyKTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXF1YWxCeVRhZztcbiIsInZhciBnZXRBbGxLZXlzID0gcmVxdWlyZSgnLi9fZ2V0QWxsS2V5cycpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDE7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBvYmplY3RzIHdpdGggc3VwcG9ydCBmb3JcbiAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICBvYmpQcm9wcyA9IGdldEFsbEtleXMob2JqZWN0KSxcbiAgICAgIG9iakxlbmd0aCA9IG9ialByb3BzLmxlbmd0aCxcbiAgICAgIG90aFByb3BzID0gZ2V0QWxsS2V5cyhvdGhlciksXG4gICAgICBvdGhMZW5ndGggPSBvdGhQcm9wcy5sZW5ndGg7XG5cbiAgaWYgKG9iakxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIWlzUGFydGlhbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgaW5kZXggPSBvYmpMZW5ndGg7XG4gIHdoaWxlIChpbmRleC0tKSB7XG4gICAgdmFyIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICBpZiAoIShpc1BhcnRpYWwgPyBrZXkgaW4gb3RoZXIgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCBrZXkpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICAvLyBDaGVjayB0aGF0IGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICB2YXIgb2JqU3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xuICB2YXIgb3RoU3RhY2tlZCA9IHN0YWNrLmdldChvdGhlcik7XG4gIGlmIChvYmpTdGFja2VkICYmIG90aFN0YWNrZWQpIHtcbiAgICByZXR1cm4gb2JqU3RhY2tlZCA9PSBvdGhlciAmJiBvdGhTdGFja2VkID09IG9iamVjdDtcbiAgfVxuICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICBzdGFjay5zZXQob3RoZXIsIG9iamVjdCk7XG5cbiAgdmFyIHNraXBDdG9yID0gaXNQYXJ0aWFsO1xuICB3aGlsZSAoKytpbmRleCA8IG9iakxlbmd0aCkge1xuICAgIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltrZXldO1xuXG4gICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIG9ialZhbHVlLCBrZXksIG90aGVyLCBvYmplY3QsIHN0YWNrKVxuICAgICAgICA6IGN1c3RvbWl6ZXIob2JqVmFsdWUsIG90aFZhbHVlLCBrZXksIG9iamVjdCwgb3RoZXIsIHN0YWNrKTtcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgaWYgKCEoY29tcGFyZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gKG9ialZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMob2JqVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpXG4gICAgICAgICAgOiBjb21wYXJlZFxuICAgICAgICApKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBza2lwQ3RvciB8fCAoc2tpcEN0b3IgPSBrZXkgPT0gJ2NvbnN0cnVjdG9yJyk7XG4gIH1cbiAgaWYgKHJlc3VsdCAmJiAhc2tpcEN0b3IpIHtcbiAgICB2YXIgb2JqQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgb3RoQ3RvciA9IG90aGVyLmNvbnN0cnVjdG9yO1xuXG4gICAgLy8gTm9uIGBPYmplY3RgIG9iamVjdCBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgY29uc3RydWN0b3JzIGFyZSBub3QgZXF1YWwuXG4gICAgaWYgKG9iakN0b3IgIT0gb3RoQ3RvciAmJlxuICAgICAgICAoJ2NvbnN0cnVjdG9yJyBpbiBvYmplY3QgJiYgJ2NvbnN0cnVjdG9yJyBpbiBvdGhlcikgJiZcbiAgICAgICAgISh0eXBlb2Ygb2JqQ3RvciA9PSAnZnVuY3Rpb24nICYmIG9iakN0b3IgaW5zdGFuY2VvZiBvYmpDdG9yICYmXG4gICAgICAgICAgdHlwZW9mIG90aEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvdGhDdG9yIGluc3RhbmNlb2Ygb3RoQ3RvcikpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlcXVhbE9iamVjdHM7XG4iLCJ2YXIgZmxhdHRlbiA9IHJlcXVpcmUoJy4vZmxhdHRlbicpLFxuICAgIG92ZXJSZXN0ID0gcmVxdWlyZSgnLi9fb3ZlclJlc3QnKSxcbiAgICBzZXRUb1N0cmluZyA9IHJlcXVpcmUoJy4vX3NldFRvU3RyaW5nJyk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUmVzdGAgd2hpY2ggZmxhdHRlbnMgdGhlIHJlc3QgYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gZmxhdFJlc3QoZnVuYykge1xuICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgdW5kZWZpbmVkLCBmbGF0dGVuKSwgZnVuYyArICcnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmbGF0UmVzdDtcbiIsIi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbm1vZHVsZS5leHBvcnRzID0gZnJlZUdsb2JhbDtcbiIsInZhciBiYXNlR2V0QWxsS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRBbGxLZXlzJyksXG4gICAgZ2V0U3ltYm9scyA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHMnKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsS2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5cywgZ2V0U3ltYm9scyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QWxsS2V5cztcbiIsInZhciBiYXNlR2V0QWxsS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRBbGxLZXlzJyksXG4gICAgZ2V0U3ltYm9sc0luID0gcmVxdWlyZSgnLi9fZ2V0U3ltYm9sc0luJyksXG4gICAga2V5c0luID0gcmVxdWlyZSgnLi9rZXlzSW4nKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gKiBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICovXG5mdW5jdGlvbiBnZXRBbGxLZXlzSW4ob2JqZWN0KSB7XG4gIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNJbiwgZ2V0U3ltYm9sc0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRBbGxLZXlzSW47XG4iLCJ2YXIgaXNLZXlhYmxlID0gcmVxdWlyZSgnLi9faXNLZXlhYmxlJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJlZmVyZW5jZSBrZXkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGdldE1hcERhdGEobWFwLCBrZXkpIHtcbiAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gIHJldHVybiBpc0tleWFibGUoa2V5KVxuICAgID8gZGF0YVt0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8gJ3N0cmluZycgOiAnaGFzaCddXG4gICAgOiBkYXRhLm1hcDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRNYXBEYXRhO1xuIiwidmFyIGlzU3RyaWN0Q29tcGFyYWJsZSA9IHJlcXVpcmUoJy4vX2lzU3RyaWN0Q29tcGFyYWJsZScpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBtYXRjaCBkYXRhIG9mIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBnZXRNYXRjaERhdGEob2JqZWN0KSB7XG4gIHZhciByZXN1bHQgPSBrZXlzKG9iamVjdCksXG4gICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIHZhciBrZXkgPSByZXN1bHRbbGVuZ3RoXSxcbiAgICAgICAgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgIHJlc3VsdFtsZW5ndGhdID0gW2tleSwgdmFsdWUsIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSldO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TWF0Y2hEYXRhO1xuIiwidmFyIGJhc2VJc05hdGl2ZSA9IHJlcXVpcmUoJy4vX2Jhc2VJc05hdGl2ZScpLFxuICAgIGdldFZhbHVlID0gcmVxdWlyZSgnLi9fZ2V0VmFsdWUnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBuYXRpdmUgZnVuY3Rpb24gYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBpZiBpdCdzIG5hdGl2ZSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG4gIHZhciB2YWx1ZSA9IGdldFZhbHVlKG9iamVjdCwga2V5KTtcbiAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXROYXRpdmU7XG4iLCJ2YXIgb3ZlckFyZyA9IHJlcXVpcmUoJy4vX292ZXJBcmcnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0UHJvdG90eXBlO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlR2V0VGFnYCB3aGljaCBpZ25vcmVzIGBTeW1ib2wudG9TdHJpbmdUYWdgIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gZ2V0UmF3VGFnKHZhbHVlKSB7XG4gIHZhciBpc093biA9IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHN5bVRvU3RyaW5nVGFnKSxcbiAgICAgIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcblxuICB0cnkge1xuICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHVuZGVmaW5lZDtcbiAgICB2YXIgdW5tYXNrZWQgPSB0cnVlO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgaWYgKHVubWFza2VkKSB7XG4gICAgaWYgKGlzT3duKSB7XG4gICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB0YWc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0UmF3VGFnO1xuIiwidmFyIGFycmF5RmlsdGVyID0gcmVxdWlyZSgnLi9fYXJyYXlGaWx0ZXInKSxcbiAgICBzdHViQXJyYXkgPSByZXF1aXJlKCcuL3N0dWJBcnJheScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICovXG52YXIgZ2V0U3ltYm9scyA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgcmV0dXJuIGFycmF5RmlsdGVyKG5hdGl2ZUdldFN5bWJvbHMob2JqZWN0KSwgZnVuY3Rpb24oc3ltYm9sKSB7XG4gICAgcmV0dXJuIHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqZWN0LCBzeW1ib2wpO1xuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0U3ltYm9scztcbiIsInZhciBhcnJheVB1c2ggPSByZXF1aXJlKCcuL19hcnJheVB1c2gnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBnZXRTeW1ib2xzID0gcmVxdWlyZSgnLi9fZ2V0U3ltYm9scycpLFxuICAgIHN0dWJBcnJheSA9IHJlcXVpcmUoJy4vc3R1YkFycmF5Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVHZXRTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3ltYm9scy5cbiAqL1xudmFyIGdldFN5bWJvbHNJbiA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgd2hpbGUgKG9iamVjdCkge1xuICAgIGFycmF5UHVzaChyZXN1bHQsIGdldFN5bWJvbHMob2JqZWN0KSk7XG4gICAgb2JqZWN0ID0gZ2V0UHJvdG90eXBlKG9iamVjdCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0U3ltYm9sc0luO1xuIiwidmFyIERhdGFWaWV3ID0gcmVxdWlyZSgnLi9fRGF0YVZpZXcnKSxcbiAgICBNYXAgPSByZXF1aXJlKCcuL19NYXAnKSxcbiAgICBQcm9taXNlID0gcmVxdWlyZSgnLi9fUHJvbWlzZScpLFxuICAgIFNldCA9IHJlcXVpcmUoJy4vX1NldCcpLFxuICAgIFdlYWtNYXAgPSByZXF1aXJlKCcuL19XZWFrTWFwJyksXG4gICAgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICB0b1NvdXJjZSA9IHJlcXVpcmUoJy4vX3RvU291cmNlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICBwcm9taXNlVGFnID0gJ1tvYmplY3QgUHJvbWlzZV0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7XG5cbnZhciBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XSc7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBtYXBzLCBzZXRzLCBhbmQgd2Vha21hcHMuICovXG52YXIgZGF0YVZpZXdDdG9yU3RyaW5nID0gdG9Tb3VyY2UoRGF0YVZpZXcpLFxuICAgIG1hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShNYXApLFxuICAgIHByb21pc2VDdG9yU3RyaW5nID0gdG9Tb3VyY2UoUHJvbWlzZSksXG4gICAgc2V0Q3RvclN0cmluZyA9IHRvU291cmNlKFNldCksXG4gICAgd2Vha01hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShXZWFrTWFwKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBgdG9TdHJpbmdUYWdgIG9mIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xudmFyIGdldFRhZyA9IGJhc2VHZXRUYWc7XG5cbi8vIEZhbGxiYWNrIGZvciBkYXRhIHZpZXdzLCBtYXBzLCBzZXRzLCBhbmQgd2VhayBtYXBzIGluIElFIDExIGFuZCBwcm9taXNlcyBpbiBOb2RlLmpzIDwgNi5cbmlmICgoRGF0YVZpZXcgJiYgZ2V0VGFnKG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMSkpKSAhPSBkYXRhVmlld1RhZykgfHxcbiAgICAoTWFwICYmIGdldFRhZyhuZXcgTWFwKSAhPSBtYXBUYWcpIHx8XG4gICAgKFByb21pc2UgJiYgZ2V0VGFnKFByb21pc2UucmVzb2x2ZSgpKSAhPSBwcm9taXNlVGFnKSB8fFxuICAgIChTZXQgJiYgZ2V0VGFnKG5ldyBTZXQpICE9IHNldFRhZykgfHxcbiAgICAoV2Vha01hcCAmJiBnZXRUYWcobmV3IFdlYWtNYXApICE9IHdlYWtNYXBUYWcpKSB7XG4gIGdldFRhZyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGJhc2VHZXRUYWcodmFsdWUpLFxuICAgICAgICBDdG9yID0gcmVzdWx0ID09IG9iamVjdFRhZyA/IHZhbHVlLmNvbnN0cnVjdG9yIDogdW5kZWZpbmVkLFxuICAgICAgICBjdG9yU3RyaW5nID0gQ3RvciA/IHRvU291cmNlKEN0b3IpIDogJyc7XG5cbiAgICBpZiAoY3RvclN0cmluZykge1xuICAgICAgc3dpdGNoIChjdG9yU3RyaW5nKSB7XG4gICAgICAgIGNhc2UgZGF0YVZpZXdDdG9yU3RyaW5nOiByZXR1cm4gZGF0YVZpZXdUYWc7XG4gICAgICAgIGNhc2UgbWFwQ3RvclN0cmluZzogcmV0dXJuIG1hcFRhZztcbiAgICAgICAgY2FzZSBwcm9taXNlQ3RvclN0cmluZzogcmV0dXJuIHByb21pc2VUYWc7XG4gICAgICAgIGNhc2Ugc2V0Q3RvclN0cmluZzogcmV0dXJuIHNldFRhZztcbiAgICAgICAgY2FzZSB3ZWFrTWFwQ3RvclN0cmluZzogcmV0dXJuIHdlYWtNYXBUYWc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0VGFnO1xuIiwiLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0VmFsdWU7XG4iLCJ2YXIgY2FzdFBhdGggPSByZXF1aXJlKCcuL19jYXN0UGF0aCcpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9faXNJbmRleCcpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHBhdGhgIGV4aXN0cyBvbiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYXNGdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjayBwcm9wZXJ0aWVzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzUGF0aChvYmplY3QsIHBhdGgsIGhhc0Z1bmMpIHtcbiAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKTtcbiAgICBpZiAoIShyZXN1bHQgPSBvYmplY3QgIT0gbnVsbCAmJiBoYXNGdW5jKG9iamVjdCwga2V5KSkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBvYmplY3QgPSBvYmplY3Rba2V5XTtcbiAgfVxuICBpZiAocmVzdWx0IHx8ICsraW5kZXggIT0gbGVuZ3RoKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBsZW5ndGggPSBvYmplY3QgPT0gbnVsbCA/IDAgOiBvYmplY3QubGVuZ3RoO1xuICByZXR1cm4gISFsZW5ndGggJiYgaXNMZW5ndGgobGVuZ3RoKSAmJiBpc0luZGV4KGtleSwgbGVuZ3RoKSAmJlxuICAgIChpc0FycmF5KG9iamVjdCkgfHwgaXNBcmd1bWVudHMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzUGF0aDtcbiIsIi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbnZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZSxcbiAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZic7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB3aXRoIFt6ZXJvLXdpZHRoIGpvaW5lcnMgb3IgY29kZSBwb2ludHMgZnJvbSB0aGUgYXN0cmFsIHBsYW5lc10oaHR0cDovL2Vldi5lZS9ibG9nLzIwMTUvMDkvMTIvZGFyay1jb3JuZXJzLW9mLXVuaWNvZGUvKS4gKi9cbnZhciByZUhhc1VuaWNvZGUgPSBSZWdFeHAoJ1snICsgcnNaV0ogKyByc0FzdHJhbFJhbmdlICArIHJzQ29tYm9SYW5nZSArIHJzVmFyUmFuZ2UgKyAnXScpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBVbmljb2RlIHN5bWJvbHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgc3ltYm9sIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc1VuaWNvZGUoc3RyaW5nKSB7XG4gIHJldHVybiByZUhhc1VuaWNvZGUudGVzdChzdHJpbmcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc1VuaWNvZGU7XG4iLCJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKi9cbmZ1bmN0aW9uIGhhc2hDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IG5hdGl2ZUNyZWF0ZSA/IG5hdGl2ZUNyZWF0ZShudWxsKSA6IHt9O1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hDbGVhcjtcbiIsIi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkge1xuICB2YXIgcmVzdWx0ID0gdGhpcy5oYXMoa2V5KSAmJiBkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldO1xuICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaERlbGV0ZTtcbiIsInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEdldHMgdGhlIGhhc2ggdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gaGFzaEdldChrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICBpZiAobmF0aXZlQ3JlYXRlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGRhdGFba2V5XTtcbiAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgfVxuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpID8gZGF0YVtrZXldIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hHZXQ7XG4iLCJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgaGFzaCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzaEhhcyhrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICByZXR1cm4gbmF0aXZlQ3JlYXRlID8gKGRhdGFba2V5XSAhPT0gdW5kZWZpbmVkKSA6IGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoSGFzO1xuIiwidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKlxuICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHRoaXMuc2l6ZSArPSB0aGlzLmhhcyhrZXkpID8gMCA6IDE7XG4gIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoU2V0O1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBJbml0aWFsaXplcyBhbiBhcnJheSBjbG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNsb25lLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAqL1xuZnVuY3Rpb24gaW5pdENsb25lQXJyYXkoYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gIC8vIEFkZCBwcm9wZXJ0aWVzIGFzc2lnbmVkIGJ5IGBSZWdFeHAjZXhlY2AuXG4gIGlmIChsZW5ndGggJiYgdHlwZW9mIGFycmF5WzBdID09ICdzdHJpbmcnICYmIGhhc093blByb3BlcnR5LmNhbGwoYXJyYXksICdpbmRleCcpKSB7XG4gICAgcmVzdWx0LmluZGV4ID0gYXJyYXkuaW5kZXg7XG4gICAgcmVzdWx0LmlucHV0ID0gYXJyYXkuaW5wdXQ7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbml0Q2xvbmVBcnJheTtcbiIsInZhciBjbG9uZUFycmF5QnVmZmVyID0gcmVxdWlyZSgnLi9fY2xvbmVBcnJheUJ1ZmZlcicpLFxuICAgIGNsb25lRGF0YVZpZXcgPSByZXF1aXJlKCcuL19jbG9uZURhdGFWaWV3JyksXG4gICAgY2xvbmVSZWdFeHAgPSByZXF1aXJlKCcuL19jbG9uZVJlZ0V4cCcpLFxuICAgIGNsb25lU3ltYm9sID0gcmVxdWlyZSgnLi9fY2xvbmVTeW1ib2wnKSxcbiAgICBjbG9uZVR5cGVkQXJyYXkgPSByZXF1aXJlKCcuL19jbG9uZVR5cGVkQXJyYXknKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lIGJhc2VkIG9uIGl0cyBgdG9TdHJpbmdUYWdgLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY2xvbmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE1hcGAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgYFNldGAsIG9yIGBTdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBgdG9TdHJpbmdUYWdgIG9mIHRoZSBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwgdGFnLCBpc0RlZXApIHtcbiAgdmFyIEN0b3IgPSBvYmplY3QuY29uc3RydWN0b3I7XG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgIHJldHVybiBjbG9uZUFycmF5QnVmZmVyKG9iamVjdCk7XG5cbiAgICBjYXNlIGJvb2xUYWc6XG4gICAgY2FzZSBkYXRlVGFnOlxuICAgICAgcmV0dXJuIG5ldyBDdG9yKCtvYmplY3QpO1xuXG4gICAgY2FzZSBkYXRhVmlld1RhZzpcbiAgICAgIHJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCwgaXNEZWVwKTtcblxuICAgIGNhc2UgZmxvYXQzMlRhZzogY2FzZSBmbG9hdDY0VGFnOlxuICAgIGNhc2UgaW50OFRhZzogY2FzZSBpbnQxNlRhZzogY2FzZSBpbnQzMlRhZzpcbiAgICBjYXNlIHVpbnQ4VGFnOiBjYXNlIHVpbnQ4Q2xhbXBlZFRhZzogY2FzZSB1aW50MTZUYWc6IGNhc2UgdWludDMyVGFnOlxuICAgICAgcmV0dXJuIGNsb25lVHlwZWRBcnJheShvYmplY3QsIGlzRGVlcCk7XG5cbiAgICBjYXNlIG1hcFRhZzpcbiAgICAgIHJldHVybiBuZXcgQ3RvcjtcblxuICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgIGNhc2Ugc3RyaW5nVGFnOlxuICAgICAgcmV0dXJuIG5ldyBDdG9yKG9iamVjdCk7XG5cbiAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICAgIHJldHVybiBjbG9uZVJlZ0V4cChvYmplY3QpO1xuXG4gICAgY2FzZSBzZXRUYWc6XG4gICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICBjYXNlIHN5bWJvbFRhZzpcbiAgICAgIHJldHVybiBjbG9uZVN5bWJvbChvYmplY3QpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdENsb25lQnlUYWc7XG4iLCJ2YXIgYmFzZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX2Jhc2VDcmVhdGUnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAqL1xuZnVuY3Rpb24gaW5pdENsb25lT2JqZWN0KG9iamVjdCkge1xuICByZXR1cm4gKHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNQcm90b3R5cGUob2JqZWN0KSlcbiAgICA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpXG4gICAgOiB7fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbml0Q2xvbmVPYmplY3Q7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzcHJlYWRhYmxlU3ltYm9sID0gU3ltYm9sID8gU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGZsYXR0ZW5hYmxlIGBhcmd1bWVudHNgIG9iamVjdCBvciBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmbGF0dGVuYWJsZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0ZsYXR0ZW5hYmxlKHZhbHVlKSB7XG4gIHJldHVybiBpc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkgfHxcbiAgICAhIShzcHJlYWRhYmxlU3ltYm9sICYmIHZhbHVlICYmIHZhbHVlW3NwcmVhZGFibGVTeW1ib2xdKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0ZsYXR0ZW5hYmxlO1xuIiwiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi9cbnZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgKHR5cGUgPT0gJ251bWJlcicgfHxcbiAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzSW5kZXg7XG4iLCJ2YXIgZXEgPSByZXF1aXJlKCcuL2VxJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgdmFsdWUgYXJndW1lbnQuXG4gKiBAcGFyYW0geyp9IGluZGV4IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgaW5kZXggb3Iga2V5IGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfSBvYmplY3QgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSBvYmplY3QgYXJndW1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJdGVyYXRlZUNhbGwodmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB0eXBlID0gdHlwZW9mIGluZGV4O1xuICBpZiAodHlwZSA9PSAnbnVtYmVyJ1xuICAgICAgICA/IChpc0FycmF5TGlrZShvYmplY3QpICYmIGlzSW5kZXgoaW5kZXgsIG9iamVjdC5sZW5ndGgpKVxuICAgICAgICA6ICh0eXBlID09ICdzdHJpbmcnICYmIGluZGV4IGluIG9iamVjdClcbiAgICAgICkge1xuICAgIHJldHVybiBlcShvYmplY3RbaW5kZXhdLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzSXRlcmF0ZWVDYWxsO1xuIiwidmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlSXNEZWVwUHJvcCA9IC9cXC58XFxbKD86W15bXFxdXSp8KFtcIiddKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFwuKSo/XFwxKVxcXS8sXG4gICAgcmVJc1BsYWluUHJvcCA9IC9eXFx3KiQvO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSBhbmQgbm90IGEgcHJvcGVydHkgcGF0aC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5KHZhbHVlLCBvYmplY3QpIHtcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICBpZiAodHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nIHx8XG4gICAgICB2YWx1ZSA9PSBudWxsIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpIHx8ICFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSkgfHxcbiAgICAob2JqZWN0ICE9IG51bGwgJiYgdmFsdWUgaW4gT2JqZWN0KG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzS2V5O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICh0eXBlID09ICdzdHJpbmcnIHx8IHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJylcbiAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgOiAodmFsdWUgPT09IG51bGwpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzS2V5YWJsZTtcbiIsInZhciBjb3JlSnNEYXRhID0gcmVxdWlyZSgnLi9fY29yZUpzRGF0YScpO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqL1xudmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJztcbn0oKSk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgaXRzIHNvdXJjZSBtYXNrZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNNYXNrZWQoZnVuYykge1xuICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIChtYXNrU3JjS2V5IGluIGZ1bmMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTWFza2VkO1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYSBwcm90b3R5cGUgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvdG90eXBlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzUHJvdG90eXBlKHZhbHVlKSB7XG4gIHZhciBDdG9yID0gdmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3IsXG4gICAgICBwcm90byA9ICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IucHJvdG90eXBlKSB8fCBvYmplY3RQcm90bztcblxuICByZXR1cm4gdmFsdWUgPT09IHByb3RvO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzUHJvdG90eXBlO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaWYgc3VpdGFibGUgZm9yIHN0cmljdFxuICogIGVxdWFsaXR5IGNvbXBhcmlzb25zLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlICYmICFpc09iamVjdCh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTdHJpY3RDb21wYXJhYmxlO1xuIiwiLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IFtdO1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZUNsZWFyO1xuIiwidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2U7XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBsYXN0SW5kZXggPSBkYXRhLmxlbmd0aCAtIDE7XG4gIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcbiAgICBkYXRhLnBvcCgpO1xuICB9IGVsc2Uge1xuICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcbiAgfVxuICAtLXRoaXMuc2l6ZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlRGVsZXRlO1xuIiwidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKipcbiAqIEdldHMgdGhlIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgcmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IGRhdGFbaW5kZXhdWzFdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZUdldDtcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkpID4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlSGFzO1xuIiwidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKipcbiAqIFNldHMgdGhlIGxpc3QgY2FjaGUgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgICsrdGhpcy5zaXplO1xuICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9IGVsc2Uge1xuICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlU2V0O1xuIiwidmFyIEhhc2ggPSByZXF1aXJlKCcuL19IYXNoJyksXG4gICAgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyksXG4gICAgTWFwID0gcmVxdWlyZSgnLi9fTWFwJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbWFwLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuc2l6ZSA9IDA7XG4gIHRoaXMuX19kYXRhX18gPSB7XG4gICAgJ2hhc2gnOiBuZXcgSGFzaCxcbiAgICAnbWFwJzogbmV3IChNYXAgfHwgTGlzdENhY2hlKSxcbiAgICAnc3RyaW5nJzogbmV3IEhhc2hcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZUNsZWFyO1xuIiwidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZURlbGV0ZShrZXkpIHtcbiAgdmFyIHJlc3VsdCA9IGdldE1hcERhdGEodGhpcywga2V5KVsnZGVsZXRlJ10oa2V5KTtcbiAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlRGVsZXRlO1xuIiwidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbWFwIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpIHtcbiAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5nZXQoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZUdldDtcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIG1hcCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmhhcyhrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlSGFzO1xuIiwidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogU2V0cyB0aGUgbWFwIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG1hcCBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IGdldE1hcERhdGEodGhpcywga2V5KSxcbiAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gIHRoaXMuc2l6ZSArPSBkYXRhLnNpemUgPT0gc2l6ZSA/IDAgOiAxO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZVNldDtcbiIsIi8qKlxuICogQ29udmVydHMgYG1hcGAgdG8gaXRzIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAqL1xuZnVuY3Rpb24gbWFwVG9BcnJheShtYXApIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShtYXAuc2l6ZSk7XG5cbiAgbWFwLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IFtrZXksIHZhbHVlXTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwVG9BcnJheTtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBtYXRjaGVzUHJvcGVydHlgIGZvciBzb3VyY2UgdmFsdWVzIHN1aXRhYmxlXG4gKiBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LCBzcmNWYWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Rba2V5XSA9PT0gc3JjVmFsdWUgJiZcbiAgICAgIChzcmNWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8IChrZXkgaW4gT2JqZWN0KG9iamVjdCkpKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZTtcbiIsInZhciBtZW1vaXplID0gcmVxdWlyZSgnLi9tZW1vaXplJyk7XG5cbi8qKiBVc2VkIGFzIHRoZSBtYXhpbXVtIG1lbW9pemUgY2FjaGUgc2l6ZS4gKi9cbnZhciBNQVhfTUVNT0laRV9TSVpFID0gNTAwO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tZW1vaXplYCB3aGljaCBjbGVhcnMgdGhlIG1lbW9pemVkIGZ1bmN0aW9uJ3NcbiAqIGNhY2hlIHdoZW4gaXQgZXhjZWVkcyBgTUFYX01FTU9JWkVfU0laRWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpIHtcbiAgdmFyIHJlc3VsdCA9IG1lbW9pemUoZnVuYywgZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKGNhY2hlLnNpemUgPT09IE1BWF9NRU1PSVpFX1NJWkUpIHtcbiAgICAgIGNhY2hlLmNsZWFyKCk7XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG4gIH0pO1xuXG4gIHZhciBjYWNoZSA9IHJlc3VsdC5jYWNoZTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtZW1vaXplQ2FwcGVkO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgbmF0aXZlQ3JlYXRlID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2NyZWF0ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUNyZWF0ZTtcbiIsInZhciBvdmVyQXJnID0gcmVxdWlyZSgnLi9fb3ZlckFyZycpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlS2V5cyA9IG92ZXJBcmcoT2JqZWN0LmtleXMsIE9iamVjdCk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF0aXZlS2V5cztcbiIsIi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlXG4gKiBbYE9iamVjdC5rZXlzYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gKiBleGNlcHQgdGhhdCBpdCBpbmNsdWRlcyBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBuYXRpdmVLZXlzSW4ob2JqZWN0KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgaWYgKG9iamVjdCAhPSBudWxsKSB7XG4gICAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUtleXNJbjtcbiIsInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgcHJvY2Vzc2AgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVQcm9jZXNzID0gbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsLnByb2Nlc3M7XG5cbi8qKiBVc2VkIHRvIGFjY2VzcyBmYXN0ZXIgTm9kZS5qcyBoZWxwZXJzLiAqL1xudmFyIG5vZGVVdGlsID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIC8vIFVzZSBgdXRpbC50eXBlc2AgZm9yIE5vZGUuanMgMTArLlxuICAgIHZhciB0eXBlcyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlICYmIGZyZWVNb2R1bGUucmVxdWlyZSgndXRpbCcpLnR5cGVzO1xuXG4gICAgaWYgKHR5cGVzKSB7XG4gICAgICByZXR1cm4gdHlwZXM7XG4gICAgfVxuXG4gICAgLy8gTGVnYWN5IGBwcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKWAgZm9yIE5vZGUuanMgPCAxMC5cbiAgICByZXR1cm4gZnJlZVByb2Nlc3MgJiYgZnJlZVByb2Nlc3MuYmluZGluZyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nKCd1dGlsJyk7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5vZGVVdGlsO1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb2JqZWN0VG9TdHJpbmc7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdmVyQXJnO1xuIiwidmFyIGFwcGx5ID0gcmVxdWlyZSgnLi9fYXBwbHknKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHJlc3QgYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIHJlc3QgYXJyYXkgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCB0cmFuc2Zvcm0pIHtcbiAgc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQgPT09IHVuZGVmaW5lZCA/IChmdW5jLmxlbmd0aCAtIDEpIDogc3RhcnQsIDApO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChhcmdzLmxlbmd0aCAtIHN0YXJ0LCAwKSxcbiAgICAgICAgYXJyYXkgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFycmF5W2luZGV4XSA9IGFyZ3Nbc3RhcnQgKyBpbmRleF07XG4gICAgfVxuICAgIGluZGV4ID0gLTE7XG4gICAgdmFyIG90aGVyQXJncyA9IEFycmF5KHN0YXJ0ICsgMSk7XG4gICAgd2hpbGUgKCsraW5kZXggPCBzdGFydCkge1xuICAgICAgb3RoZXJBcmdzW2luZGV4XSA9IGFyZ3NbaW5kZXhdO1xuICAgIH1cbiAgICBvdGhlckFyZ3Nbc3RhcnRdID0gdHJhbnNmb3JtKGFycmF5KTtcbiAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdmVyUmVzdDtcbiIsInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gcm9vdDtcbiIsIi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAsIHVubGVzcyBga2V5YCBpcyBcIl9fcHJvdG9fX1wiIG9yIFwiY29uc3RydWN0b3JcIi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHNhZmVHZXQob2JqZWN0LCBrZXkpIHtcbiAgaWYgKGtleSA9PT0gJ2NvbnN0cnVjdG9yJyAmJiB0eXBlb2Ygb2JqZWN0W2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoa2V5ID09ICdfX3Byb3RvX18nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIG9iamVjdFtrZXldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNhZmVHZXQ7XG4iLCIvKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKlxuICogQWRkcyBgdmFsdWVgIHRvIHRoZSBhcnJheSBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgYWRkXG4gKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAqIEBhbGlhcyBwdXNoXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjYWNoZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBzZXRDYWNoZUFkZCh2YWx1ZSkge1xuICB0aGlzLl9fZGF0YV9fLnNldCh2YWx1ZSwgSEFTSF9VTkRFRklORUQpO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRDYWNoZUFkZDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gdGhlIGFycmF5IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FjaGVIYXModmFsdWUpIHtcbiAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRDYWNoZUhhcztcbiIsIi8qKlxuICogQ29udmVydHMgYHNldGAgdG8gYW4gYXJyYXkgb2YgaXRzIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gc2V0VG9BcnJheShzZXQpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShzZXQuc2l6ZSk7XG5cbiAgc2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0VG9BcnJheTtcbiIsInZhciBiYXNlU2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19iYXNlU2V0VG9TdHJpbmcnKSxcbiAgICBzaG9ydE91dCA9IHJlcXVpcmUoJy4vX3Nob3J0T3V0Jyk7XG5cbi8qKlxuICogU2V0cyB0aGUgYHRvU3RyaW5nYCBtZXRob2Qgb2YgYGZ1bmNgIHRvIHJldHVybiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gKi9cbnZhciBzZXRUb1N0cmluZyA9IHNob3J0T3V0KGJhc2VTZXRUb1N0cmluZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0VG9TdHJpbmc7XG4iLCIvKiogVXNlZCB0byBkZXRlY3QgaG90IGZ1bmN0aW9ucyBieSBudW1iZXIgb2YgY2FsbHMgd2l0aGluIGEgc3BhbiBvZiBtaWxsaXNlY29uZHMuICovXG52YXIgSE9UX0NPVU5UID0gODAwLFxuICAgIEhPVF9TUEFOID0gMTY7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVOb3cgPSBEYXRlLm5vdztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCdsbCBzaG9ydCBvdXQgYW5kIGludm9rZSBgaWRlbnRpdHlgIGluc3RlYWRcbiAqIG9mIGBmdW5jYCB3aGVuIGl0J3MgY2FsbGVkIGBIT1RfQ09VTlRgIG9yIG1vcmUgdGltZXMgaW4gYEhPVF9TUEFOYFxuICogbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNob3J0YWJsZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gc2hvcnRPdXQoZnVuYykge1xuICB2YXIgY291bnQgPSAwLFxuICAgICAgbGFzdENhbGxlZCA9IDA7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdGFtcCA9IG5hdGl2ZU5vdygpLFxuICAgICAgICByZW1haW5pbmcgPSBIT1RfU1BBTiAtIChzdGFtcCAtIGxhc3RDYWxsZWQpO1xuXG4gICAgbGFzdENhbGxlZCA9IHN0YW1wO1xuICAgIGlmIChyZW1haW5pbmcgPiAwKSB7XG4gICAgICBpZiAoKytjb3VudCA+PSBIT1RfQ09VTlQpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3VtZW50c1swXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY291bnQgPSAwO1xuICAgIH1cbiAgICByZXR1cm4gZnVuYy5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hvcnRPdXQ7XG4iLCJ2YXIgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgc3RhY2suXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqL1xuZnVuY3Rpb24gc3RhY2tDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGU7XG4gIHRoaXMuc2l6ZSA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tDbGVhcjtcbiIsIi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIHN0YWNrLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICByZXN1bHQgPSBkYXRhWydkZWxldGUnXShrZXkpO1xuXG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0RlbGV0ZTtcbiIsIi8qKlxuICogR2V0cyB0aGUgc3RhY2sgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrR2V0KGtleSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0dldDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGEgc3RhY2sgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzdGFja0hhcyhrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tIYXM7XG4iLCJ2YXIgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyksXG4gICAgTWFwID0gcmVxdWlyZSgnLi9fTWFwJyksXG4gICAgTWFwQ2FjaGUgPSByZXF1aXJlKCcuL19NYXBDYWNoZScpO1xuXG4vKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbnZhciBMQVJHRV9BUlJBWV9TSVpFID0gMjAwO1xuXG4vKipcbiAqIFNldHMgdGhlIHN0YWNrIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHN0YWNrIGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBzdGFja1NldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBMaXN0Q2FjaGUpIHtcbiAgICB2YXIgcGFpcnMgPSBkYXRhLl9fZGF0YV9fO1xuICAgIGlmICghTWFwIHx8IChwYWlycy5sZW5ndGggPCBMQVJHRV9BUlJBWV9TSVpFIC0gMSkpIHtcbiAgICAgIHBhaXJzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgIHRoaXMuc2l6ZSA9ICsrZGF0YS5zaXplO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlKHBhaXJzKTtcbiAgfVxuICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja1NldDtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluZGV4T2ZgIHdoaWNoIHBlcmZvcm1zIHN0cmljdCBlcXVhbGl0eVxuICogY29tcGFyaXNvbnMgb2YgdmFsdWVzLCBpLmUuIGA9PT1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIHN0cmljdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpY3RJbmRleE9mO1xuIiwidmFyIGFzY2lpU2l6ZSA9IHJlcXVpcmUoJy4vX2FzY2lpU2l6ZScpLFxuICAgIGhhc1VuaWNvZGUgPSByZXF1aXJlKCcuL19oYXNVbmljb2RlJyksXG4gICAgdW5pY29kZVNpemUgPSByZXF1aXJlKCcuL191bmljb2RlU2l6ZScpO1xuXG4vKipcbiAqIEdldHMgdGhlIG51bWJlciBvZiBzeW1ib2xzIGluIGBzdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICovXG5mdW5jdGlvbiBzdHJpbmdTaXplKHN0cmluZykge1xuICByZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgPyB1bmljb2RlU2l6ZShzdHJpbmcpXG4gICAgOiBhc2NpaVNpemUoc3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmdTaXplO1xuIiwidmFyIG1lbW9pemVDYXBwZWQgPSByZXF1aXJlKCcuL19tZW1vaXplQ2FwcGVkJyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZVByb3BOYW1lID0gL1teLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCQpKS9nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZUVzY2FwZUNoYXIgPSAvXFxcXChcXFxcKT8vZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICovXG52YXIgc3RyaW5nVG9QYXRoID0gbWVtb2l6ZUNhcHBlZChmdW5jdGlvbihzdHJpbmcpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBpZiAoc3RyaW5nLmNoYXJDb2RlQXQoMCkgPT09IDQ2IC8qIC4gKi8pIHtcbiAgICByZXN1bHQucHVzaCgnJyk7XG4gIH1cbiAgc3RyaW5nLnJlcGxhY2UocmVQcm9wTmFtZSwgZnVuY3Rpb24obWF0Y2gsIG51bWJlciwgcXVvdGUsIHN1YlN0cmluZykge1xuICAgIHJlc3VsdC5wdXNoKHF1b3RlID8gc3ViU3RyaW5nLnJlcGxhY2UocmVFc2NhcGVDaGFyLCAnJDEnKSA6IChudW1iZXIgfHwgbWF0Y2gpKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmdUb1BhdGg7XG4iLCJ2YXIgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyBrZXkgaWYgaXQncyBub3QgYSBzdHJpbmcgb3Igc3ltYm9sLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMge3N0cmluZ3xzeW1ib2x9IFJldHVybnMgdGhlIGtleS5cbiAqL1xuZnVuY3Rpb24gdG9LZXkodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCBpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcbiAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvS2V5O1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgZnVuY2AgdG8gaXRzIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG4gKi9cbmZ1bmN0aW9uIHRvU291cmNlKGZ1bmMpIHtcbiAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZnVuY1RvU3RyaW5nLmNhbGwoZnVuYyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChmdW5jICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvU291cmNlO1xuIiwiLyoqIFVzZWQgdG8gbWF0Y2ggYSBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuICovXG52YXIgcmVXaGl0ZXNwYWNlID0gL1xccy87XG5cbi8qKlxuICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbUVuZGAgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBub24td2hpdGVzcGFjZVxuICogY2hhcmFjdGVyIG9mIGBzdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlci5cbiAqL1xuZnVuY3Rpb24gdHJpbW1lZEVuZEluZGV4KHN0cmluZykge1xuICB2YXIgaW5kZXggPSBzdHJpbmcubGVuZ3RoO1xuXG4gIHdoaWxlIChpbmRleC0tICYmIHJlV2hpdGVzcGFjZS50ZXN0KHN0cmluZy5jaGFyQXQoaW5kZXgpKSkge31cbiAgcmV0dXJuIGluZGV4O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRyaW1tZWRFbmRJbmRleDtcbiIsIi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbnZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZSxcbiAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZic7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc0FzdHJhbCA9ICdbJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNDb21ibyA9ICdbJyArIHJzQ29tYm9SYW5nZSArICddJyxcbiAgICByc0ZpdHogPSAnXFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdJyxcbiAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgIHJzTm9uQXN0cmFsID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNSZWdpb25hbCA9ICcoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9JyxcbiAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIHJlZ2V4ZXMuICovXG52YXIgcmVPcHRNb2QgPSByc01vZGlmaWVyICsgJz8nLFxuICAgIHJzT3B0VmFyID0gJ1snICsgcnNWYXJSYW5nZSArICddPycsXG4gICAgcnNPcHRKb2luID0gJyg/OicgKyByc1pXSiArICcoPzonICsgW3JzTm9uQXN0cmFsLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc09wdFZhciArIHJlT3B0TW9kICsgJykqJyxcbiAgICByc1NlcSA9IHJzT3B0VmFyICsgcmVPcHRNb2QgKyByc09wdEpvaW4sXG4gICAgcnNTeW1ib2wgPSAnKD86JyArIFtyc05vbkFzdHJhbCArIHJzQ29tYm8gKyAnPycsIHJzQ29tYm8sIHJzUmVnaW9uYWwsIHJzU3VyclBhaXIsIHJzQXN0cmFsXS5qb2luKCd8JykgKyAnKSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIFtzdHJpbmcgc3ltYm9sc10oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtdW5pY29kZSkuICovXG52YXIgcmVVbmljb2RlID0gUmVnRXhwKHJzRml0eiArICcoPz0nICsgcnNGaXR6ICsgJyl8JyArIHJzU3ltYm9sICsgcnNTZXEsICdnJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBvZiBhIFVuaWNvZGUgYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gKi9cbmZ1bmN0aW9uIHVuaWNvZGVTaXplKHN0cmluZykge1xuICB2YXIgcmVzdWx0ID0gcmVVbmljb2RlLmxhc3RJbmRleCA9IDA7XG4gIHdoaWxlIChyZVVuaWNvZGUudGVzdChzdHJpbmcpKSB7XG4gICAgKytyZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1bmljb2RlU2l6ZTtcbiIsInZhciBiYXNlQ2xvbmUgPSByZXF1aXJlKCcuL19iYXNlQ2xvbmUnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi9cbnZhciBDTE9ORV9TWU1CT0xTX0ZMQUcgPSA0O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzaGFsbG93IGNsb25lIG9mIGB2YWx1ZWAuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb24gdGhlXG4gKiBbc3RydWN0dXJlZCBjbG9uZSBhbGdvcml0aG1dKGh0dHBzOi8vbWRuLmlvL1N0cnVjdHVyZWRfY2xvbmVfYWxnb3JpdGhtKVxuICogYW5kIHN1cHBvcnRzIGNsb25pbmcgYXJyYXlzLCBhcnJheSBidWZmZXJzLCBib29sZWFucywgZGF0ZSBvYmplY3RzLCBtYXBzLFxuICogbnVtYmVycywgYE9iamVjdGAgb2JqZWN0cywgcmVnZXhlcywgc2V0cywgc3RyaW5ncywgc3ltYm9scywgYW5kIHR5cGVkXG4gKiBhcnJheXMuIFRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBhcmd1bWVudHNgIG9iamVjdHMgYXJlIGNsb25lZFxuICogYXMgcGxhaW4gb2JqZWN0cy4gQW4gZW1wdHkgb2JqZWN0IGlzIHJldHVybmVkIGZvciB1bmNsb25lYWJsZSB2YWx1ZXMgc3VjaFxuICogYXMgZXJyb3Igb2JqZWN0cywgZnVuY3Rpb25zLCBET00gbm9kZXMsIGFuZCBXZWFrTWFwcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLlxuICogQHNlZSBfLmNsb25lRGVlcFxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAqXG4gKiB2YXIgc2hhbGxvdyA9IF8uY2xvbmUob2JqZWN0cyk7XG4gKiBjb25zb2xlLmxvZyhzaGFsbG93WzBdID09PSBvYmplY3RzWzBdKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gY2xvbmUodmFsdWUpIHtcbiAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfU1lNQk9MU19GTEFHKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZTtcbiIsInZhciBiYXNlQ2xvbmUgPSByZXF1aXJlKCcuL19iYXNlQ2xvbmUnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi9cbnZhciBDTE9ORV9ERUVQX0ZMQUcgPSAxLFxuICAgIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZWAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgY2xvbmVzIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAxLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJlY3Vyc2l2ZWx5IGNsb25lLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICogQHNlZSBfLmNsb25lXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICpcbiAqIHZhciBkZWVwID0gXy5jbG9uZURlZXAob2JqZWN0cyk7XG4gKiBjb25zb2xlLmxvZyhkZWVwWzBdID09PSBvYmplY3RzWzBdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGNsb25lRGVlcCh2YWx1ZSkge1xuICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lRGVlcDtcbiIsIi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBgdmFsdWVgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gZnJvbSB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29uc3RhbnQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gXy50aW1lcygyLCBfLmNvbnN0YW50KHsgJ2EnOiAxIH0pKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhvYmplY3RzKTtcbiAqIC8vID0+IFt7ICdhJzogMSB9LCB7ICdhJzogMSB9XVxuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHNbMF0gPT09IG9iamVjdHNbMV0pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBjb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnN0YW50O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIG5vdyA9IHJlcXVpcmUoJy4vbm93JyksXG4gICAgdG9OdW1iZXIgPSByZXF1aXJlKCcuL3RvTnVtYmVyJyk7XG5cbi8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAqIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHdhc1xuICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG4gKiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYCBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGVcbiAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcbiAqIGNhbGxzIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgXG4gKiBpbnZvY2F0aW9uLlxuICpcbiAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gKlxuICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gKlxuICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZScsIF8uZGVib3VuY2UoY2FsY3VsYXRlTGF5b3V0LCAxNTApKTtcbiAqXG4gKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cbiAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmRlYm91bmNlKHNlbmRNYWlsLCAzMDAsIHtcbiAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICogICAndHJhaWxpbmcnOiBmYWxzZVxuICogfSkpO1xuICpcbiAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG4gKiB2YXIgZGVib3VuY2VkID0gXy5kZWJvdW5jZShiYXRjaExvZywgMjUwLCB7ICdtYXhXYWl0JzogMTAwMCB9KTtcbiAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxhc3RBcmdzLFxuICAgICAgbGFzdFRoaXMsXG4gICAgICBtYXhXYWl0LFxuICAgICAgcmVzdWx0LFxuICAgICAgdGltZXJJZCxcbiAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcbiAgICAgIGxlYWRpbmcgPSBmYWxzZSxcbiAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHdhaXQgPSB0b051bWJlcih3YWl0KSB8fCAwO1xuICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG4gICAgbWF4aW5nID0gJ21heFdhaXQnIGluIG9wdGlvbnM7XG4gICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgdGhpc0FyZyA9IGxhc3RUaGlzO1xuXG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gbGVhZGluZ0VkZ2UodGltZSkge1xuICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIC8vIFN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIHRyYWlsaW5nIGVkZ2UuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICByZXR1cm4gbGVhZGluZyA/IGludm9rZUZ1bmModGltZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICB0aW1lV2FpdGluZyA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgIHJldHVybiBtYXhpbmdcbiAgICAgID8gbmF0aXZlTWluKHRpbWVXYWl0aW5nLCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSlcbiAgICAgIDogdGltZVdhaXRpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWU7XG5cbiAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgLy8gaXQgYXMgdGhlIHRyYWlsaW5nIGVkZ2UsIG9yIHdlJ3ZlIGhpdCB0aGUgYG1heFdhaXRgIGxpbWl0LlxuICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCk7XG4gICAgaWYgKHNob3VsZEludm9rZSh0aW1lKSkge1xuICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICB9XG4gICAgLy8gUmVzdGFydCB0aGUgdGltZXIuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKSB7XG4gICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cbiAgICAvLyBkZWJvdW5jZWQgYXQgbGVhc3Qgb25jZS5cbiAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuICAgIH1cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgIH1cbiAgICBsYXN0SW52b2tlVGltZSA9IDA7XG4gICAgbGFzdEFyZ3MgPSBsYXN0Q2FsbFRpbWUgPSBsYXN0VGhpcyA9IHRpbWVySWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICByZXR1cm4gdGltZXJJZCA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogdHJhaWxpbmdFZGdlKG5vdygpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpLFxuICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgbGFzdFRoaXMgPSB0aGlzO1xuICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhpbmcpIHtcbiAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGRlYm91bmNlZC5jYW5jZWwgPSBjYW5jZWw7XG4gIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICByZXR1cm4gZGVib3VuY2VkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlYm91bmNlO1xuIiwidmFyIGJhc2VSZXN0ID0gcmVxdWlyZSgnLi9fYmFzZVJlc3QnKSxcbiAgICBlcSA9IHJlcXVpcmUoJy4vZXEnKSxcbiAgICBpc0l0ZXJhdGVlQ2FsbCA9IHJlcXVpcmUoJy4vX2lzSXRlcmF0ZWVDYWxsJyksXG4gICAga2V5c0luID0gcmVxdWlyZSgnLi9rZXlzSW4nKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBBc3NpZ25zIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlXG4gKiBvYmplY3RzIHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzIHRoYXRcbiAqIHJlc29sdmUgdG8gYHVuZGVmaW5lZGAuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC5cbiAqIE9uY2UgYSBwcm9wZXJ0eSBpcyBzZXQsIGFkZGl0aW9uYWwgdmFsdWVzIG9mIHRoZSBzYW1lIHByb3BlcnR5IGFyZSBpZ25vcmVkLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBzZWUgXy5kZWZhdWx0c0RlZXBcbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZhdWx0cyh7ICdhJzogMSB9LCB7ICdiJzogMiB9LCB7ICdhJzogMyB9KTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICovXG52YXIgZGVmYXVsdHMgPSBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIHNvdXJjZXMpIHtcbiAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gLTE7XG4gIHZhciBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aDtcbiAgdmFyIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgIGxlbmd0aCA9IDE7XG4gIH1cblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICB2YXIgcHJvcHMgPSBrZXlzSW4oc291cmNlKTtcbiAgICB2YXIgcHJvcHNJbmRleCA9IC0xO1xuICAgIHZhciBwcm9wc0xlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgIHdoaWxlICgrK3Byb3BzSW5kZXggPCBwcm9wc0xlbmd0aCkge1xuICAgICAgdmFyIGtleSA9IHByb3BzW3Byb3BzSW5kZXhdO1xuICAgICAgdmFyIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKGVxKHZhbHVlLCBvYmplY3RQcm90b1trZXldKSAmJiAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSB7XG4gICAgICAgIG9iamVjdFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iamVjdDtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmF1bHRzO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZvckVhY2gnKTtcbiIsIi8qKlxuICogUGVyZm9ybXMgYVxuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAqXG4gKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKCdhJywgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKE5hTiwgTmFOKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gZXEodmFsdWUsIG90aGVyKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgKHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxO1xuIiwidmFyIGFycmF5RmlsdGVyID0gcmVxdWlyZSgnLi9fYXJyYXlGaWx0ZXInKSxcbiAgICBiYXNlRmlsdGVyID0gcmVxdWlyZSgnLi9fYmFzZUZpbHRlcicpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nIGFuIGFycmF5IG9mIGFsbCBlbGVtZW50c1xuICogYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aHJlZVxuICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKlxuICogKipOb3RlOioqIFVubGlrZSBgXy5yZW1vdmVgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAqIEBzZWUgXy5yZWplY3RcbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9XG4gKiBdO1xuICpcbiAqIF8uZmlsdGVyKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maWx0ZXIodXNlcnMsIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbHRlcih1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmlsdGVyKHVzZXJzLCAnYWN0aXZlJyk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gKlxuICogLy8gQ29tYmluaW5nIHNldmVyYWwgcHJlZGljYXRlcyB1c2luZyBgXy5vdmVyRXZlcnlgIG9yIGBfLm92ZXJTb21lYC5cbiAqIF8uZmlsdGVyKHVzZXJzLCBfLm92ZXJTb21lKFt7ICdhZ2UnOiAzNiB9LCBbJ2FnZScsIDQwXV0pKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdiYXJuZXknXVxuICovXG5mdW5jdGlvbiBmaWx0ZXIoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RmlsdGVyIDogYmFzZUZpbHRlcjtcbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgYmFzZUl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbHRlcjtcbiIsInZhciBjcmVhdGVGaW5kID0gcmVxdWlyZSgnLi9fY3JlYXRlRmluZCcpLFxuICAgIGZpbmRJbmRleCA9IHJlcXVpcmUoJy4vZmluZEluZGV4Jyk7XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyB0aGUgZmlyc3QgZWxlbWVudFxuICogYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aHJlZVxuICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9XG4gKiBdO1xuICpcbiAqIF8uZmluZCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gKiAvLyA9PiBvYmplY3QgZm9yICdiYXJuZXknXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZCh1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gKiAvLyA9PiBvYmplY3QgZm9yICdwZWJibGVzJ1xuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICogLy8gPT4gb2JqZWN0IGZvciAnZnJlZCdcbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZCh1c2VycywgJ2FjdGl2ZScpO1xuICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICovXG52YXIgZmluZCA9IGNyZWF0ZUZpbmQoZmluZEluZGV4KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmaW5kO1xuIiwidmFyIGJhc2VGaW5kSW5kZXggPSByZXF1aXJlKCcuL19iYXNlRmluZEluZGV4JyksXG4gICAgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyksXG4gICAgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi90b0ludGVnZXInKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0XG4gKiBlbGVtZW50IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDEuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYC0xYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAqIF07XG4gKlxuICogXy5maW5kSW5kZXgodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlciA9PSAnYmFybmV5JzsgfSk7XG4gKiAvLyA9PiAwXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZEluZGV4KHVzZXJzLCB7ICd1c2VyJzogJ2ZyZWQnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gKiAvLyA9PiAxXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kSW5kZXgodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAqIC8vID0+IDBcbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZEluZGV4KHVzZXJzLCAnYWN0aXZlJyk7XG4gKiAvLyA9PiAyXG4gKi9cbmZ1bmN0aW9uIGZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICBpZiAoIWxlbmd0aCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICB2YXIgaW5kZXggPSBmcm9tSW5kZXggPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIGluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKTtcbiAgfVxuICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGluZGV4KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmaW5kSW5kZXg7XG4iLCJ2YXIgYmFzZUZsYXR0ZW4gPSByZXF1aXJlKCcuL19iYXNlRmxhdHRlbicpO1xuXG4vKipcbiAqIEZsYXR0ZW5zIGBhcnJheWAgYSBzaW5nbGUgbGV2ZWwgZGVlcC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmZsYXR0ZW4oWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAqIC8vID0+IFsxLCAyLCBbMywgWzRdXSwgNV1cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbihhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgMSkgOiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmbGF0dGVuO1xuIiwidmFyIGFycmF5RWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5RWFjaCcpLFxuICAgIGJhc2VFYWNoID0gcmVxdWlyZSgnLi9fYmFzZUVhY2gnKSxcbiAgICBjYXN0RnVuY3Rpb24gPSByZXF1aXJlKCcuL19jYXN0RnVuY3Rpb24nKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBlbGVtZW50LlxuICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAqXG4gKiAqKk5vdGU6KiogQXMgd2l0aCBvdGhlciBcIkNvbGxlY3Rpb25zXCIgbWV0aG9kcywgb2JqZWN0cyB3aXRoIGEgXCJsZW5ndGhcIlxuICogcHJvcGVydHkgYXJlIGl0ZXJhdGVkIGxpa2UgYXJyYXlzLiBUbyBhdm9pZCB0aGlzIGJlaGF2aW9yIHVzZSBgXy5mb3JJbmBcbiAqIG9yIGBfLmZvck93bmAgZm9yIG9iamVjdCBpdGVyYXRpb24uXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGFsaWFzIGVhY2hcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICogQHNlZSBfLmZvckVhY2hSaWdodFxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmZvckVhY2goWzEsIDJdLCBmdW5jdGlvbih2YWx1ZSkge1xuICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gKiB9KTtcbiAqIC8vID0+IExvZ3MgYDFgIHRoZW4gYDJgLlxuICpcbiAqIF8uZm9yRWFjaCh7ICdhJzogMSwgJ2InOiAyIH0sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAqICAgY29uc29sZS5sb2coa2V5KTtcbiAqIH0pO1xuICogLy8gPT4gTG9ncyAnYScgdGhlbiAnYicgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2goY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlFYWNoIDogYmFzZUVhY2g7XG4gIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGNhc3RGdW5jdGlvbihpdGVyYXRlZSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZvckVhY2g7XG4iLCJ2YXIgYmFzZUZvciA9IHJlcXVpcmUoJy4vX2Jhc2VGb3InKSxcbiAgICBjYXN0RnVuY3Rpb24gPSByZXF1aXJlKCcuL19jYXN0RnVuY3Rpb24nKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBhblxuICogb2JqZWN0IGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdFxuICogaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjMuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBzZWUgXy5mb3JJblJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8uZm9ySW4obmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICogICBjb25zb2xlLmxvZyhrZXkpO1xuICogfSk7XG4gKiAvLyA9PiBMb2dzICdhJywgJ2InLCB0aGVuICdjJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAqL1xuZnVuY3Rpb24gZm9ySW4ob2JqZWN0LCBpdGVyYXRlZSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGxcbiAgICA/IG9iamVjdFxuICAgIDogYmFzZUZvcihvYmplY3QsIGNhc3RGdW5jdGlvbihpdGVyYXRlZSksIGtleXNJbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZm9ySW47XG4iLCJ2YXIgYmFzZUdldCA9IHJlcXVpcmUoJy4vX2Jhc2VHZXQnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIHRoZSByZXNvbHZlZCB2YWx1ZSBpc1xuICogYHVuZGVmaW5lZGAsIHRoZSBgZGVmYXVsdFZhbHVlYCBpcyByZXR1cm5lZCBpbiBpdHMgcGxhY2UuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjcuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHJldHVybmVkIGZvciBgdW5kZWZpbmVkYCByZXNvbHZlZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gKlxuICogXy5nZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLmdldChvYmplY3QsIFsnYScsICcwJywgJ2InLCAnYyddKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLmdldChvYmplY3QsICdhLmIuYycsICdkZWZhdWx0Jyk7XG4gKiAvLyA9PiAnZGVmYXVsdCdcbiAqL1xuZnVuY3Rpb24gZ2V0KG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gIHZhciByZXN1bHQgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldDtcbiIsInZhciBiYXNlSGFzID0gcmVxdWlyZSgnLi9fYmFzZUhhcycpLFxuICAgIGhhc1BhdGggPSByZXF1aXJlKCcuL19oYXNQYXRoJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBwcm9wZXJ0eSBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogeyAnYic6IDIgfSB9O1xuICogdmFyIG90aGVyID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICpcbiAqIF8uaGFzKG9iamVjdCwgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmhhcyhvYmplY3QsICdhLmInKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmhhcyhvYmplY3QsIFsnYScsICdiJ10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzKG90aGVyLCAnYScpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaGFzKG9iamVjdCwgcGF0aCkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzUGF0aChvYmplY3QsIHBhdGgsIGJhc2VIYXMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhcztcbiIsInZhciBiYXNlSGFzSW4gPSByZXF1aXJlKCcuL19iYXNlSGFzSW4nKSxcbiAgICBoYXNQYXRoID0gcmVxdWlyZSgnLi9faGFzUGF0aCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgcGF0aGAgaXMgYSBkaXJlY3Qgb3IgaW5oZXJpdGVkIHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IF8uY3JlYXRlKHsgJ2EnOiBfLmNyZWF0ZSh7ICdiJzogMiB9KSB9KTtcbiAqXG4gKiBfLmhhc0luKG9iamVjdCwgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmhhc0luKG9iamVjdCwgJ2EuYicpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmhhc0luKG9iamVjdCwgJ2InKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGhhc0luKG9iamVjdCwgcGF0aCkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzUGF0aChvYmplY3QsIHBhdGgsIGJhc2VIYXNJbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzSW47XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGl0IHJlY2VpdmVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICpcbiAqIGNvbnNvbGUubG9nKF8uaWRlbnRpdHkob2JqZWN0KSA9PT0gb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlkZW50aXR5O1xuIiwidmFyIGJhc2VJc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vX2Jhc2VJc0FyZ3VtZW50cycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FyZ3VtZW50cyA9IGJhc2VJc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA/IGJhc2VJc0FyZ3VtZW50cyA6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJndW1lbnRzO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheTtcbiIsInZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNMZW5ndGggPSByZXF1aXJlKCcuL2lzTGVuZ3RoJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS4gQSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFycmF5LWxpa2UgaWYgaXQnc1xuICogbm90IGEgZnVuY3Rpb24gYW5kIGhhcyBhIGB2YWx1ZS5sZW5ndGhgIHRoYXQncyBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvclxuICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgIWlzRnVuY3Rpb24odmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXlMaWtlO1xuIiwidmFyIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0FycmF5TGlrZWAgZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGVja3MgaWYgYHZhbHVlYFxuICogaXMgYW4gb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LWxpa2Ugb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzQXJyYXlMaWtlKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5TGlrZU9iamVjdDtcbiIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpLFxuICAgIHN0dWJGYWxzZSA9IHJlcXVpcmUoJy4vc3R1YkZhbHNlJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IHJvb3QuQnVmZmVyIDogdW5kZWZpbmVkO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlSXNCdWZmZXIgPSBCdWZmZXIgPyBCdWZmZXIuaXNCdWZmZXIgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0J1ZmZlcjtcbiIsInZhciBiYXNlS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VLZXlzJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gZW1wdHkgb2JqZWN0LCBjb2xsZWN0aW9uLCBtYXAsIG9yIHNldC5cbiAqXG4gKiBPYmplY3RzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBubyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWRcbiAqIHByb3BlcnRpZXMuXG4gKlxuICogQXJyYXktbGlrZSB2YWx1ZXMgc3VjaCBhcyBgYXJndW1lbnRzYCBvYmplY3RzLCBhcnJheXMsIGJ1ZmZlcnMsIHN0cmluZ3MsIG9yXG4gKiBqUXVlcnktbGlrZSBjb2xsZWN0aW9ucyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgbGVuZ3RoYCBvZiBgMGAuXG4gKiBTaW1pbGFybHksIG1hcHMgYW5kIHNldHMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYHNpemVgIG9mIGAwYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBlbXB0eSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRW1wdHkobnVsbCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0VtcHR5KHRydWUpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNFbXB0eSgxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRW1wdHkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0VtcHR5KHsgJ2EnOiAxIH0pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkgJiZcbiAgICAgIChpc0FycmF5KHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlLnNwbGljZSA9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgIGlzQnVmZmVyKHZhbHVlKSB8fCBpc1R5cGVkQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSkpIHtcbiAgICByZXR1cm4gIXZhbHVlLmxlbmd0aDtcbiAgfVxuICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKTtcbiAgaWYgKHRhZyA9PSBtYXBUYWcgfHwgdGFnID09IHNldFRhZykge1xuICAgIHJldHVybiAhdmFsdWUuc2l6ZTtcbiAgfVxuICBpZiAoaXNQcm90b3R5cGUodmFsdWUpKSB7XG4gICAgcmV0dXJuICFiYXNlS2V5cyh2YWx1ZSkubGVuZ3RoO1xuICB9XG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRW1wdHk7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFzeW5jVGFnID0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgcHJveHlUYWcgPSAnW29iamVjdCBQcm94eV0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNGdW5jdGlvbihfKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBiYXNlR2V0VGFnKHZhbHVlKTtcbiAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWcgfHwgdGFnID09IGFzeW5jVGFnIHx8IHRhZyA9PSBwcm94eVRhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0Z1bmN0aW9uO1xuIiwiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTGVuZ3RoKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTGVuZ3RoO1xuIiwidmFyIGJhc2VJc01hcCA9IHJlcXVpcmUoJy4vX2Jhc2VJc01hcCcpLFxuICAgIGJhc2VVbmFyeSA9IHJlcXVpcmUoJy4vX2Jhc2VVbmFyeScpLFxuICAgIG5vZGVVdGlsID0gcmVxdWlyZSgnLi9fbm9kZVV0aWwnKTtcblxuLyogTm9kZS5qcyBoZWxwZXIgcmVmZXJlbmNlcy4gKi9cbnZhciBub2RlSXNNYXAgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc01hcDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE1hcGAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4zLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNNYXAobmV3IE1hcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc01hcChuZXcgV2Vha01hcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNNYXAgPSBub2RlSXNNYXAgPyBiYXNlVW5hcnkobm9kZUlzTWFwKSA6IGJhc2VJc01hcDtcblxubW9kdWxlLmV4cG9ydHMgPSBpc01hcDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3RMaWtlO1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL1xudmFyIG9iamVjdEN0b3JTdHJpbmcgPSBmdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCB0aGF0IGlzLCBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGVcbiAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuOC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiB9XG4gKlxuICogXy5pc1BsYWluT2JqZWN0KG5ldyBGb28pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KHsgJ3gnOiAwLCAneSc6IDAgfSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fCBiYXNlR2V0VGFnKHZhbHVlKSAhPSBvYmplY3RUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgaWYgKHByb3RvID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIEN0b3IgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCAnY29uc3RydWN0b3InKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgcmV0dXJuIHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3RvciBpbnN0YW5jZW9mIEN0b3IgJiZcbiAgICBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzUGxhaW5PYmplY3Q7XG4iLCJ2YXIgYmFzZUlzU2V0ID0gcmVxdWlyZSgnLi9fYmFzZUlzU2V0JyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgbm9kZVV0aWwgPSByZXF1aXJlKCcuL19ub2RlVXRpbCcpO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc1NldCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzU2V0O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU2V0YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzZXQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1NldChuZXcgU2V0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU2V0KG5ldyBXZWFrU2V0KTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc1NldCA9IG5vZGVJc1NldCA/IGJhc2VVbmFyeShub2RlSXNTZXQpIDogYmFzZUlzU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU2V0O1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN0cmluZ2AgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN0cmluZywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3RyaW5nKDEpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fFxuICAgICghaXNBcnJheSh2YWx1ZSkgJiYgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzdHJpbmdUYWcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3RyaW5nO1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3ltYm9sO1xuIiwidmFyIGJhc2VJc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL19iYXNlSXNUeXBlZEFycmF5JyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgbm9kZVV0aWwgPSByZXF1aXJlKCcuL19ub2RlVXRpbCcpO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc1R5cGVkQXJyYXkgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1R5cGVkQXJyYXk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNUeXBlZEFycmF5KFtdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc1R5cGVkQXJyYXkgPSBub2RlSXNUeXBlZEFycmF5ID8gYmFzZVVuYXJ5KG5vZGVJc1R5cGVkQXJyYXkpIDogYmFzZUlzVHlwZWRBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc1R5cGVkQXJyYXk7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNVbmRlZmluZWQodm9pZCAwKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzVW5kZWZpbmVkKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNVbmRlZmluZWQ7XG4iLCJ2YXIgYXJyYXlMaWtlS2V5cyA9IHJlcXVpcmUoJy4vX2FycmF5TGlrZUtleXMnKSxcbiAgICBiYXNlS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VLZXlzJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8ua2V5cygnaGknKTtcbiAqIC8vID0+IFsnMCcsICcxJ11cbiAqL1xuZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXM7XG4iLCJ2YXIgYXJyYXlMaWtlS2V5cyA9IHJlcXVpcmUoJy4vX2FycmF5TGlrZUtleXMnKSxcbiAgICBiYXNlS2V5c0luID0gcmVxdWlyZSgnLi9fYmFzZUtleXNJbicpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzSW4obmV3IEZvbyk7XG4gKiAvLyA9PiBbJ2EnLCAnYicsICdjJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqL1xuZnVuY3Rpb24ga2V5c0luKG9iamVjdCkge1xuICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0LCB0cnVlKSA6IGJhc2VLZXlzSW4ob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBrZXlzSW47XG4iLCIvKipcbiAqIEdldHMgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmxhc3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IDNcbiAqL1xuZnVuY3Rpb24gbGFzdChhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIHJldHVybiBsZW5ndGggPyBhcnJheVtsZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsYXN0O1xuIiwidmFyIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBiYXNlTWFwID0gcmVxdWlyZSgnLi9fYmFzZU1hcCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydVxuICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gKiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKlxuICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gKiBgXy5ldmVyeWAsIGBfLmZpbHRlcmAsIGBfLm1hcGAsIGBfLm1hcFZhbHVlc2AsIGBfLnJlamVjdGAsIGFuZCBgXy5zb21lYC5cbiAqXG4gKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAqIGBhcnlgLCBgY2h1bmtgLCBgY3VycnlgLCBgY3VycnlSaWdodGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsIGBldmVyeWAsXG4gKiBgZmlsbGAsIGBpbnZlcnRgLCBgcGFyc2VJbnRgLCBgcmFuZG9tYCwgYHJhbmdlYCwgYHJhbmdlUmlnaHRgLCBgcmVwZWF0YCxcbiAqIGBzYW1wbGVTaXplYCwgYHNsaWNlYCwgYHNvbWVgLCBgc29ydEJ5YCwgYHNwbGl0YCwgYHRha2VgLCBgdGFrZVJpZ2h0YCxcbiAqIGB0ZW1wbGF0ZWAsIGB0cmltYCwgYHRyaW1FbmRgLCBgdHJpbVN0YXJ0YCwgYW5kIGB3b3Jkc2BcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gKiAgIHJldHVybiBuICogbjtcbiAqIH1cbiAqXG4gKiBfLm1hcChbNCwgOF0sIHNxdWFyZSk7XG4gKiAvLyA9PiBbMTYsIDY0XVxuICpcbiAqIF8ubWFwKHsgJ2EnOiA0LCAnYic6IDggfSwgc3F1YXJlKTtcbiAqIC8vID0+IFsxNiwgNjRdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2Jhcm5leScgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJyB9XG4gKiBdO1xuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5tYXAodXNlcnMsICd1c2VyJyk7XG4gKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ11cbiAqL1xuZnVuY3Rpb24gbWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5TWFwIDogYmFzZU1hcDtcbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwO1xuIiwidmFyIGJhc2VBc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ25WYWx1ZScpLFxuICAgIGJhc2VGb3JPd24gPSByZXF1aXJlKCcuL19iYXNlRm9yT3duJyksXG4gICAgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzIGFzIGBvYmplY3RgIGFuZCB2YWx1ZXMgZ2VuZXJhdGVkXG4gKiBieSBydW5uaW5nIGVhY2ggb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IG9mIGBvYmplY3RgIHRocnVcbiAqIGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICogKHZhbHVlLCBrZXksIG9iamVjdCkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBvYmplY3QuXG4gKiBAc2VlIF8ubWFwS2V5c1xuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSB7XG4gKiAgICdmcmVkJzogICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sXG4gKiAgICdwZWJibGVzJzogeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEgfVxuICogfTtcbiAqXG4gKiBfLm1hcFZhbHVlcyh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2U7IH0pO1xuICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5tYXBWYWx1ZXModXNlcnMsICdhZ2UnKTtcbiAqIC8vID0+IHsgJ2ZyZWQnOiA0MCwgJ3BlYmJsZXMnOiAxIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqL1xuZnVuY3Rpb24gbWFwVmFsdWVzKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpdGVyYXRlZSA9IGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgMyk7XG5cbiAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgaXRlcmF0ZWUodmFsdWUsIGtleSwgb2JqZWN0KSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcFZhbHVlcztcbiIsInZhciBiYXNlRXh0cmVtdW0gPSByZXF1aXJlKCcuL19iYXNlRXh0cmVtdW0nKSxcbiAgICBiYXNlR3QgPSByZXF1aXJlKCcuL19iYXNlR3QnKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKTtcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiBgYXJyYXlgLiBJZiBgYXJyYXlgIGlzIGVtcHR5IG9yIGZhbHNleSxcbiAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ubWF4KFs0LCAyLCA4LCA2XSk7XG4gKiAvLyA9PiA4XG4gKlxuICogXy5tYXgoW10pO1xuICogLy8gPT4gdW5kZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIG1heChhcnJheSkge1xuICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VHdClcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXg7XG4iLCJ2YXIgTWFwQ2FjaGUgPSByZXF1aXJlKCcuL19NYXBDYWNoZScpO1xuXG4vKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG1lbW9pemVzIHRoZSByZXN1bHQgb2YgYGZ1bmNgLiBJZiBgcmVzb2x2ZXJgIGlzXG4gKiBwcm92aWRlZCwgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlXG4gKiBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgYXJndW1lbnRcbiAqIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZSBtYXAgY2FjaGUga2V5LiBUaGUgYGZ1bmNgXG4gKiBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogVGhlIGNhY2hlIGlzIGV4cG9zZWQgYXMgdGhlIGBjYWNoZWAgcHJvcGVydHkgb24gdGhlIG1lbW9pemVkXG4gKiBmdW5jdGlvbi4gSXRzIGNyZWF0aW9uIG1heSBiZSBjdXN0b21pemVkIGJ5IHJlcGxhY2luZyB0aGUgYF8ubWVtb2l6ZS5DYWNoZWBcbiAqIGNvbnN0cnVjdG9yIHdpdGggb25lIHdob3NlIGluc3RhbmNlcyBpbXBsZW1lbnQgdGhlXG4gKiBbYE1hcGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLW1hcC1wcm90b3R5cGUtb2JqZWN0KVxuICogbWV0aG9kIGludGVyZmFjZSBvZiBgY2xlYXJgLCBgZGVsZXRlYCwgYGdldGAsIGBoYXNgLCBhbmQgYHNldGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVzb2x2ZXJdIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIHRoZSBjYWNoZSBrZXkuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAqIHZhciBvdGhlciA9IHsgJ2MnOiAzLCAnZCc6IDQgfTtcbiAqXG4gKiB2YXIgdmFsdWVzID0gXy5tZW1vaXplKF8udmFsdWVzKTtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWzEsIDJdXG4gKlxuICogdmFsdWVzKG90aGVyKTtcbiAqIC8vID0+IFszLCA0XVxuICpcbiAqIG9iamVjdC5hID0gMjtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWzEsIDJdXG4gKlxuICogLy8gTW9kaWZ5IHRoZSByZXN1bHQgY2FjaGUuXG4gKiB2YWx1ZXMuY2FjaGUuc2V0KG9iamVjdCwgWydhJywgJ2InXSk7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsnYScsICdiJ11cbiAqXG4gKiAvLyBSZXBsYWNlIGBfLm1lbW9pemUuQ2FjaGVgLlxuICogXy5tZW1vaXplLkNhY2hlID0gV2Vha01hcDtcbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJyB8fCAocmVzb2x2ZXIgIT0gbnVsbCAmJiB0eXBlb2YgcmVzb2x2ZXIgIT0gJ2Z1bmN0aW9uJykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxuICAgICAgICBjYWNoZSA9IG1lbW9pemVkLmNhY2hlO1xuXG4gICAgaWYgKGNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KSB8fCBjYWNoZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBNYXBDYWNoZSk7XG4gIHJldHVybiBtZW1vaXplZDtcbn1cblxuLy8gRXhwb3NlIGBNYXBDYWNoZWAuXG5tZW1vaXplLkNhY2hlID0gTWFwQ2FjaGU7XG5cbm1vZHVsZS5leHBvcnRzID0gbWVtb2l6ZTtcbiIsInZhciBiYXNlTWVyZ2UgPSByZXF1aXJlKCcuL19iYXNlTWVyZ2UnKSxcbiAgICBjcmVhdGVBc3NpZ25lciA9IHJlcXVpcmUoJy4vX2NyZWF0ZUFzc2lnbmVyJyk7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IG1lcmdlcyBvd24gYW5kXG4gKiBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2Ugb2JqZWN0cyBpbnRvIHRoZVxuICogZGVzdGluYXRpb24gb2JqZWN0LiBTb3VyY2UgcHJvcGVydGllcyB0aGF0IHJlc29sdmUgdG8gYHVuZGVmaW5lZGAgYXJlXG4gKiBza2lwcGVkIGlmIGEgZGVzdGluYXRpb24gdmFsdWUgZXhpc3RzLiBBcnJheSBhbmQgcGxhaW4gb2JqZWN0IHByb3BlcnRpZXNcbiAqIGFyZSBtZXJnZWQgcmVjdXJzaXZlbHkuIE90aGVyIG9iamVjdHMgYW5kIHZhbHVlIHR5cGVzIGFyZSBvdmVycmlkZGVuIGJ5XG4gKiBhc3NpZ25tZW50LiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuIFN1YnNlcXVlbnRcbiAqIHNvdXJjZXMgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjUuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0ge1xuICogICAnYSc6IFt7ICdiJzogMiB9LCB7ICdkJzogNCB9XVxuICogfTtcbiAqXG4gKiB2YXIgb3RoZXIgPSB7XG4gKiAgICdhJzogW3sgJ2MnOiAzIH0sIHsgJ2UnOiA1IH1dXG4gKiB9O1xuICpcbiAqIF8ubWVyZ2Uob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiB7ICdhJzogW3sgJ2InOiAyLCAnYyc6IDMgfSwgeyAnZCc6IDQsICdlJzogNSB9XSB9XG4gKi9cbnZhciBtZXJnZSA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCkge1xuICBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1lcmdlO1xuIiwidmFyIGJhc2VFeHRyZW11bSA9IHJlcXVpcmUoJy4vX2Jhc2VFeHRyZW11bScpLFxuICAgIGJhc2VMdCA9IHJlcXVpcmUoJy4vX2Jhc2VMdCcpLFxuICAgIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5taW4oWzQsIDIsIDgsIDZdKTtcbiAqIC8vID0+IDJcbiAqXG4gKiBfLm1pbihbXSk7XG4gKiAvLyA9PiB1bmRlZmluZWRcbiAqL1xuZnVuY3Rpb24gbWluKGFycmF5KSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBpZGVudGl0eSwgYmFzZUx0KVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1pbjtcbiIsInZhciBiYXNlRXh0cmVtdW0gPSByZXF1aXJlKCcuL19iYXNlRXh0cmVtdW0nKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBiYXNlTHQgPSByZXF1aXJlKCcuL19iYXNlTHQnKTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1pbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoXG4gKiB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTWF0aFxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogMSB9LCB7ICduJzogMiB9XTtcbiAqXG4gKiBfLm1pbkJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gKiAvLyA9PiB7ICduJzogMSB9XG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLm1pbkJ5KG9iamVjdHMsICduJyk7XG4gKiAvLyA9PiB7ICduJzogMSB9XG4gKi9cbmZ1bmN0aW9uIG1pbkJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYmFzZUx0KVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1pbkJ5O1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi4zLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5ub29wKTtcbiAqIC8vID0+IFt1bmRlZmluZWQsIHVuZGVmaW5lZF1cbiAqL1xuZnVuY3Rpb24gbm9vcCgpIHtcbiAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBub29wO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKlxuICogR2V0cyB0aGUgdGltZXN0YW1wIG9mIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2ZSBlbGFwc2VkIHNpbmNlXG4gKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgRGF0ZVxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG4gKiB9LCBfLm5vdygpKTtcbiAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gKi9cbnZhciBub3cgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHJvb3QuRGF0ZS5ub3coKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbm93O1xuIiwidmFyIGJhc2VQaWNrID0gcmVxdWlyZSgnLi9fYmFzZVBpY2snKSxcbiAgICBmbGF0UmVzdCA9IHJlcXVpcmUoJy4vX2ZsYXRSZXN0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIHBpY2tlZCBgb2JqZWN0YCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gKlxuICogXy5waWNrKG9iamVjdCwgWydhJywgJ2MnXSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAqL1xudmFyIHBpY2sgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIHBhdGhzKSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHt9IDogYmFzZVBpY2sob2JqZWN0LCBwYXRocyk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBwaWNrO1xuIiwidmFyIGJhc2VQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2Jhc2VQcm9wZXJ0eScpLFxuICAgIGJhc2VQcm9wZXJ0eURlZXAgPSByZXF1aXJlKCcuL19iYXNlUHJvcGVydHlEZWVwJyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbXG4gKiAgIHsgJ2EnOiB7ICdiJzogMiB9IH0sXG4gKiAgIHsgJ2EnOiB7ICdiJzogMSB9IH1cbiAqIF07XG4gKlxuICogXy5tYXAob2JqZWN0cywgXy5wcm9wZXJ0eSgnYS5iJykpO1xuICogLy8gPT4gWzIsIDFdXG4gKlxuICogXy5tYXAoXy5zb3J0Qnkob2JqZWN0cywgXy5wcm9wZXJ0eShbJ2EnLCAnYiddKSksICdhLmInKTtcbiAqIC8vID0+IFsxLCAyXVxuICovXG5mdW5jdGlvbiBwcm9wZXJ0eShwYXRoKSB7XG4gIHJldHVybiBpc0tleShwYXRoKSA/IGJhc2VQcm9wZXJ0eSh0b0tleShwYXRoKSkgOiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHByb3BlcnR5O1xuIiwidmFyIGNyZWF0ZVJhbmdlID0gcmVxdWlyZSgnLi9fY3JlYXRlUmFuZ2UnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgKHBvc2l0aXZlIGFuZC9vciBuZWdhdGl2ZSkgcHJvZ3Jlc3NpbmcgZnJvbVxuICogYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLiBBIHN0ZXAgb2YgYC0xYCBpcyB1c2VkIGlmIGEgbmVnYXRpdmVcbiAqIGBzdGFydGAgaXMgc3BlY2lmaWVkIHdpdGhvdXQgYW4gYGVuZGAgb3IgYHN0ZXBgLiBJZiBgZW5kYCBpcyBub3Qgc3BlY2lmaWVkLFxuICogaXQncyBzZXQgdG8gYHN0YXJ0YCB3aXRoIGBzdGFydGAgdGhlbiBzZXQgdG8gYDBgLlxuICpcbiAqICoqTm90ZToqKiBKYXZhU2NyaXB0IGZvbGxvd3MgdGhlIElFRUUtNzU0IHN0YW5kYXJkIGZvciByZXNvbHZpbmdcbiAqIGZsb2F0aW5nLXBvaW50IHZhbHVlcyB3aGljaCBjYW4gcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MV0gVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gKiBAc2VlIF8uaW5SYW5nZSwgXy5yYW5nZVJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ucmFuZ2UoNCk7XG4gKiAvLyA9PiBbMCwgMSwgMiwgM11cbiAqXG4gKiBfLnJhbmdlKC00KTtcbiAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICpcbiAqIF8ucmFuZ2UoMSwgNSk7XG4gKiAvLyA9PiBbMSwgMiwgMywgNF1cbiAqXG4gKiBfLnJhbmdlKDAsIDIwLCA1KTtcbiAqIC8vID0+IFswLCA1LCAxMCwgMTVdXG4gKlxuICogXy5yYW5nZSgwLCAtNCwgLTEpO1xuICogLy8gPT4gWzAsIC0xLCAtMiwgLTNdXG4gKlxuICogXy5yYW5nZSgxLCA0LCAwKTtcbiAqIC8vID0+IFsxLCAxLCAxXVxuICpcbiAqIF8ucmFuZ2UoMCk7XG4gKiAvLyA9PiBbXVxuICovXG52YXIgcmFuZ2UgPSBjcmVhdGVSYW5nZSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJhbmdlO1xuIiwidmFyIGFycmF5UmVkdWNlID0gcmVxdWlyZSgnLi9fYXJyYXlSZWR1Y2UnKSxcbiAgICBiYXNlRWFjaCA9IHJlcXVpcmUoJy4vX2Jhc2VFYWNoJyksXG4gICAgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyksXG4gICAgYmFzZVJlZHVjZSA9IHJlcXVpcmUoJy4vX2Jhc2VSZWR1Y2UnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKlxuICogUmVkdWNlcyBgY29sbGVjdGlvbmAgdG8gYSB2YWx1ZSB3aGljaCBpcyB0aGUgYWNjdW11bGF0ZWQgcmVzdWx0IG9mIHJ1bm5pbmdcbiAqIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLCB3aGVyZSBlYWNoIHN1Y2Nlc3NpdmVcbiAqIGludm9jYXRpb24gaXMgc3VwcGxpZWQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJldmlvdXMuIElmIGBhY2N1bXVsYXRvcmBcbiAqIGlzIG5vdCBnaXZlbiwgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIGlzIHVzZWQgYXMgdGhlIGluaXRpYWxcbiAqIHZhbHVlLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOlxuICogKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqXG4gKiBNYW55IGxvZGFzaCBtZXRob2RzIGFyZSBndWFyZGVkIHRvIHdvcmsgYXMgaXRlcmF0ZWVzIGZvciBtZXRob2RzIGxpa2VcbiAqIGBfLnJlZHVjZWAsIGBfLnJlZHVjZVJpZ2h0YCwgYW5kIGBfLnRyYW5zZm9ybWAuXG4gKlxuICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6XG4gKiBgYXNzaWduYCwgYGRlZmF1bHRzYCwgYGRlZmF1bHRzRGVlcGAsIGBpbmNsdWRlc2AsIGBtZXJnZWAsIGBvcmRlckJ5YCxcbiAqIGFuZCBgc29ydEJ5YFxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqIEBzZWUgXy5yZWR1Y2VSaWdodFxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnJlZHVjZShbMSwgMl0sIGZ1bmN0aW9uKHN1bSwgbikge1xuICogICByZXR1cm4gc3VtICsgbjtcbiAqIH0sIDApO1xuICogLy8gPT4gM1xuICpcbiAqIF8ucmVkdWNlKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTtcbiAqICAgcmV0dXJuIHJlc3VsdDtcbiAqIH0sIHt9KTtcbiAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqL1xuZnVuY3Rpb24gcmVkdWNlKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVJlZHVjZSA6IGJhc2VSZWR1Y2UsXG4gICAgICBpbml0QWNjdW0gPSBhcmd1bWVudHMubGVuZ3RoIDwgMztcblxuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDQpLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtLCBiYXNlRWFjaCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVkdWNlO1xuIiwidmFyIGJhc2VTZXQgPSByZXF1aXJlKCcuL19iYXNlU2V0Jyk7XG5cbi8qKlxuICogU2V0cyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiBhIHBvcnRpb24gb2YgYHBhdGhgIGRvZXNuJ3QgZXhpc3QsXG4gKiBpdCdzIGNyZWF0ZWQuIEFycmF5cyBhcmUgY3JlYXRlZCBmb3IgbWlzc2luZyBpbmRleCBwcm9wZXJ0aWVzIHdoaWxlIG9iamVjdHNcbiAqIGFyZSBjcmVhdGVkIGZvciBhbGwgb3RoZXIgbWlzc2luZyBwcm9wZXJ0aWVzLiBVc2UgYF8uc2V0V2l0aGAgdG8gY3VzdG9taXplXG4gKiBgcGF0aGAgY3JlYXRpb24uXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjcuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICpcbiAqIF8uc2V0KG9iamVjdCwgJ2FbMF0uYi5jJywgNCk7XG4gKiBjb25zb2xlLmxvZyhvYmplY3QuYVswXS5iLmMpO1xuICogLy8gPT4gNFxuICpcbiAqIF8uc2V0KG9iamVjdCwgWyd4JywgJzAnLCAneScsICd6J10sIDUpO1xuICogY29uc29sZS5sb2cob2JqZWN0LnhbMF0ueS56KTtcbiAqIC8vID0+IDVcbiAqL1xuZnVuY3Rpb24gc2V0KG9iamVjdCwgcGF0aCwgdmFsdWUpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXQ7XG4iLCJ2YXIgYmFzZUtleXMgPSByZXF1aXJlKCcuL19iYXNlS2V5cycpLFxuICAgIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzU3RyaW5nID0gcmVxdWlyZSgnLi9pc1N0cmluZycpLFxuICAgIHN0cmluZ1NpemUgPSByZXF1aXJlKCcuL19zdHJpbmdTaXplJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJztcblxuLyoqXG4gKiBHZXRzIHRoZSBzaXplIG9mIGBjb2xsZWN0aW9uYCBieSByZXR1cm5pbmcgaXRzIGxlbmd0aCBmb3IgYXJyYXktbGlrZVxuICogdmFsdWVzIG9yIHRoZSBudW1iZXIgb2Ygb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgZm9yIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29sbGVjdGlvbiBzaXplLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnNpemUoWzEsIDIsIDNdKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnNpemUoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAqIC8vID0+IDJcbiAqXG4gKiBfLnNpemUoJ3BlYmJsZXMnKTtcbiAqIC8vID0+IDdcbiAqL1xuZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7XG4gIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICByZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbikgPyBzdHJpbmdTaXplKGNvbGxlY3Rpb24pIDogY29sbGVjdGlvbi5sZW5ndGg7XG4gIH1cbiAgdmFyIHRhZyA9IGdldFRhZyhjb2xsZWN0aW9uKTtcbiAgaWYgKHRhZyA9PSBtYXBUYWcgfHwgdGFnID09IHNldFRhZykge1xuICAgIHJldHVybiBjb2xsZWN0aW9uLnNpemU7XG4gIH1cbiAgcmV0dXJuIGJhc2VLZXlzKGNvbGxlY3Rpb24pLmxlbmd0aDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaXplO1xuIiwidmFyIGJhc2VGbGF0dGVuID0gcmVxdWlyZSgnLi9fYmFzZUZsYXR0ZW4nKSxcbiAgICBiYXNlT3JkZXJCeSA9IHJlcXVpcmUoJy4vX2Jhc2VPcmRlckJ5JyksXG4gICAgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGlzSXRlcmF0ZWVDYWxsID0gcmVxdWlyZSgnLi9faXNJdGVyYXRlZUNhbGwnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzLCBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSByZXN1bHRzIG9mXG4gKiBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gdGhydSBlYWNoIGl0ZXJhdGVlLiBUaGlzIG1ldGhvZFxuICogcGVyZm9ybXMgYSBzdGFibGUgc29ydCwgdGhhdCBpcywgaXQgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBzb3J0IG9yZGVyIG9mXG4gKiBlcXVhbCBlbGVtZW50cy4gVGhlIGl0ZXJhdGVlcyBhcmUgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICogIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LFxuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiAzMCB9LFxuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9XG4gKiBdO1xuICpcbiAqIF8uc29ydEJ5KHVzZXJzLCBbZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyOyB9XSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNl0sIFsnYmFybmV5JywgMzRdLCBbJ2ZyZWQnLCA0OF0sIFsnZnJlZCcsIDMwXV1cbiAqXG4gKiBfLnNvcnRCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM0XSwgWydiYXJuZXknLCAzNl0sIFsnZnJlZCcsIDMwXSwgWydmcmVkJywgNDhdXVxuICovXG52YXIgc29ydEJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWVzKSB7XG4gIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIGxlbmd0aCA9IGl0ZXJhdGVlcy5sZW5ndGg7XG4gIGlmIChsZW5ndGggPiAxICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdKSkge1xuICAgIGl0ZXJhdGVlcyA9IFtdO1xuICB9IGVsc2UgaWYgKGxlbmd0aCA+IDIgJiYgaXNJdGVyYXRlZUNhbGwoaXRlcmF0ZWVzWzBdLCBpdGVyYXRlZXNbMV0sIGl0ZXJhdGVlc1syXSkpIHtcbiAgICBpdGVyYXRlZXMgPSBbaXRlcmF0ZWVzWzBdXTtcbiAgfVxuICByZXR1cm4gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgYmFzZUZsYXR0ZW4oaXRlcmF0ZWVzLCAxKSwgW10pO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc29ydEJ5O1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGVtcHR5IGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhcnJheXMgPSBfLnRpbWVzKDIsIF8uc3R1YkFycmF5KTtcbiAqXG4gKiBjb25zb2xlLmxvZyhhcnJheXMpO1xuICogLy8gPT4gW1tdLCBbXV1cbiAqXG4gKiBjb25zb2xlLmxvZyhhcnJheXNbMF0gPT09IGFycmF5c1sxXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBzdHViQXJyYXkoKSB7XG4gIHJldHVybiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViQXJyYXk7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICogLy8gPT4gW2ZhbHNlLCBmYWxzZV1cbiAqL1xuZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R1YkZhbHNlO1xuIiwidmFyIHRvTnVtYmVyID0gcmVxdWlyZSgnLi90b051bWJlcicpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwLFxuICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDg7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIGZpbml0ZSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEyLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0Zpbml0ZSgzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9GaW5pdGUoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvRmluaXRlKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b0Zpbml0ZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiAwO1xuICB9XG4gIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICBpZiAodmFsdWUgPT09IElORklOSVRZIHx8IHZhbHVlID09PSAtSU5GSU5JVFkpIHtcbiAgICB2YXIgc2lnbiA9ICh2YWx1ZSA8IDAgPyAtMSA6IDEpO1xuICAgIHJldHVybiBzaWduICogTUFYX0lOVEVHRVI7XG4gIH1cbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/IHZhbHVlIDogMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0Zpbml0ZTtcbiIsInZhciB0b0Zpbml0ZSA9IHJlcXVpcmUoJy4vdG9GaW5pdGUnKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9JbnRlZ2VyYF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvaW50ZWdlcikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0ludGVnZXIoMy4yKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDBcbiAqXG4gKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAqIC8vID0+IDNcbiAqL1xuZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gIHZhciByZXN1bHQgPSB0b0Zpbml0ZSh2YWx1ZSksXG4gICAgICByZW1haW5kZXIgPSByZXN1bHQgJSAxO1xuXG4gIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0ludGVnZXI7XG4iLCJ2YXIgYmFzZVRyaW0gPSByZXF1aXJlKCcuL19iYXNlVHJpbScpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBOQU4gPSAwIC8gMDtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gYmFzZVRyaW0odmFsdWUpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b051bWJlcjtcbiIsInZhciBhcnJheU1hcCA9IHJlcXVpcmUoJy4vX2FycmF5TWFwJyksXG4gICAgY29weUFycmF5ID0gcmVxdWlyZSgnLi9fY29weUFycmF5JyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpLFxuICAgIHN0cmluZ1RvUGF0aCA9IHJlcXVpcmUoJy4vX3N0cmluZ1RvUGF0aCcpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKSxcbiAgICB0b1N0cmluZyA9IHJlcXVpcmUoJy4vdG9TdHJpbmcnKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9QYXRoKCdhLmIuYycpO1xuICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gKlxuICogXy50b1BhdGgoJ2FbMF0uYi5jJyk7XG4gKiAvLyA9PiBbJ2EnLCAnMCcsICdiJywgJ2MnXVxuICovXG5mdW5jdGlvbiB0b1BhdGgodmFsdWUpIHtcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGFycmF5TWFwKHZhbHVlLCB0b0tleSk7XG4gIH1cbiAgcmV0dXJuIGlzU3ltYm9sKHZhbHVlKSA/IFt2YWx1ZV0gOiBjb3B5QXJyYXkoc3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvUGF0aDtcbiIsInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHBsYWluIG9iamVjdCBmbGF0dGVuaW5nIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZ1xuICoga2V5ZWQgcHJvcGVydGllcyBvZiBgdmFsdWVgIHRvIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBwbGFpbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgcGxhaW4gb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmFzc2lnbih7ICdhJzogMSB9LCBuZXcgRm9vKTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICpcbiAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIF8udG9QbGFpbk9iamVjdChuZXcgRm9vKSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfVxuICovXG5mdW5jdGlvbiB0b1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBjb3B5T2JqZWN0KHZhbHVlLCBrZXlzSW4odmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1BsYWluT2JqZWN0O1xuIiwidmFyIGJhc2VUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VUb1N0cmluZycpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9TdHJpbmcobnVsbCk7XG4gKiAvLyA9PiAnJ1xuICpcbiAqIF8udG9TdHJpbmcoLTApO1xuICogLy8gPT4gJy0wJ1xuICpcbiAqIF8udG9TdHJpbmcoWzEsIDIsIDNdKTtcbiAqIC8vID0+ICcxLDIsMydcbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9TdHJpbmc7XG4iLCJ2YXIgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXlFYWNoJyksXG4gICAgYmFzZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX2Jhc2VDcmVhdGUnKSxcbiAgICBiYXNlRm9yT3duID0gcmVxdWlyZSgnLi9fYmFzZUZvck93bicpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGdldFByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2dldFByb3RvdHlwZScpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKTtcblxuLyoqXG4gKiBBbiBhbHRlcm5hdGl2ZSB0byBgXy5yZWR1Y2VgOyB0aGlzIG1ldGhvZCB0cmFuc2Zvcm1zIGBvYmplY3RgIHRvIGEgbmV3XG4gKiBgYWNjdW11bGF0b3JgIG9iamVjdCB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgZWFjaCBvZiBpdHMgb3duXG4gKiBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIHRocnUgYGl0ZXJhdGVlYCwgd2l0aCBlYWNoIGludm9jYXRpb25cbiAqIHBvdGVudGlhbGx5IG11dGF0aW5nIHRoZSBgYWNjdW11bGF0b3JgIG9iamVjdC4gSWYgYGFjY3VtdWxhdG9yYCBpcyBub3RcbiAqIHByb3ZpZGVkLCBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSBgW1tQcm90b3R5cGVdXWAgd2lsbCBiZSB1c2VkLiBUaGVcbiAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czogKGFjY3VtdWxhdG9yLCB2YWx1ZSwga2V5LCBvYmplY3QpLlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMS4zLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgY3VzdG9tIGFjY3VtdWxhdG9yIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRyYW5zZm9ybShbMiwgMywgNF0sIGZ1bmN0aW9uKHJlc3VsdCwgbikge1xuICogICByZXN1bHQucHVzaChuICo9IG4pO1xuICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAqIH0sIFtdKTtcbiAqIC8vID0+IFs0LCA5XVxuICpcbiAqIF8udHJhbnNmb3JtKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTtcbiAqIH0sIHt9KTtcbiAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH1cbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtKG9iamVjdCwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gIHZhciBpc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgIGlzQXJyTGlrZSA9IGlzQXJyIHx8IGlzQnVmZmVyKG9iamVjdCkgfHwgaXNUeXBlZEFycmF5KG9iamVjdCk7XG5cbiAgaXRlcmF0ZWUgPSBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDQpO1xuICBpZiAoYWNjdW11bGF0b3IgPT0gbnVsbCkge1xuICAgIHZhciBDdG9yID0gb2JqZWN0ICYmIG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoaXNBcnJMaWtlKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGlzQXJyID8gbmV3IEN0b3IgOiBbXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgYWNjdW11bGF0b3IgPSBpc0Z1bmN0aW9uKEN0b3IpID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSkgOiB7fTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBhY2N1bXVsYXRvciA9IHt9O1xuICAgIH1cbiAgfVxuICAoaXNBcnJMaWtlID8gYXJyYXlFYWNoIDogYmFzZUZvck93bikob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgIHJldHVybiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBvYmplY3QpO1xuICB9KTtcbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRyYW5zZm9ybTtcbiIsInZhciBiYXNlRmxhdHRlbiA9IHJlcXVpcmUoJy4vX2Jhc2VGbGF0dGVuJyksXG4gICAgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGJhc2VVbmlxID0gcmVxdWlyZSgnLi9fYmFzZVVuaXEnKSxcbiAgICBpc0FycmF5TGlrZU9iamVjdCA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2VPYmplY3QnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCBmcm9tIGFsbCBnaXZlbiBhcnJheXMgdXNpbmdcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udW5pb24oWzJdLCBbMSwgMl0pO1xuICogLy8gPT4gWzIsIDFdXG4gKi9cbnZhciB1bmlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5pb247XG4iLCJ2YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyk7XG5cbi8qKiBVc2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMuICovXG52YXIgaWRDb3VudGVyID0gMDtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQuIElmIGBwcmVmaXhgIGlzIGdpdmVuLCB0aGUgSUQgaXMgYXBwZW5kZWQgdG8gaXQuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJlZml4PScnXSBUaGUgdmFsdWUgdG8gcHJlZml4IHRoZSBJRCB3aXRoLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5pcXVlIElELlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnVuaXF1ZUlkKCdjb250YWN0XycpO1xuICogLy8gPT4gJ2NvbnRhY3RfMTA0J1xuICpcbiAqIF8udW5pcXVlSWQoKTtcbiAqIC8vID0+ICcxMDUnXG4gKi9cbmZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCkge1xuICB2YXIgaWQgPSArK2lkQ291bnRlcjtcbiAgcmV0dXJuIHRvU3RyaW5nKHByZWZpeCkgKyBpZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1bmlxdWVJZDtcbiIsInZhciBiYXNlVmFsdWVzID0gcmVxdWlyZSgnLi9fYmFzZVZhbHVlcycpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLnZhbHVlcyhuZXcgRm9vKTtcbiAqIC8vID0+IFsxLCAyXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8udmFsdWVzKCdoaScpO1xuICogLy8gPT4gWydoJywgJ2knXVxuICovXG5mdW5jdGlvbiB2YWx1ZXMob2JqZWN0KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmFsdWVzO1xuIiwidmFyIGFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduVmFsdWUnKSxcbiAgICBiYXNlWmlwT2JqZWN0ID0gcmVxdWlyZSgnLi9fYmFzZVppcE9iamVjdCcpO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZnJvbVBhaXJzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIHR3byBhcnJheXMsXG4gKiBvbmUgb2YgcHJvcGVydHkgaWRlbnRpZmllcnMgYW5kIG9uZSBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuNC4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wcz1bXV0gVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uemlwT2JqZWN0KFsnYScsICdiJ10sIFsxLCAyXSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAqL1xuZnVuY3Rpb24gemlwT2JqZWN0KHByb3BzLCB2YWx1ZXMpIHtcbiAgcmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHMgfHwgW10sIHZhbHVlcyB8fCBbXSwgYXNzaWduVmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHppcE9iamVjdDtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuIiwiZXhwb3J0IGZ1bmN0aW9uIHl1djJyZ2IoeXV2KSB7XG4gIHZhciB5ID0geXV2WzBdLFxuICAgICAgdSA9IHl1dlsxXSxcbiAgICAgIHYgPSB5dXZbMl07XG4gIHZhciByLCBnLCBiO1xuICByID0geSAqIDEgKyB1ICogMCArIHYgKiAxLjEzOTgzO1xuICBnID0geSAqIDEgKyB1ICogLTAuMzk0NjUgKyB2ICogLTAuNTgwNjtcbiAgYiA9IHkgKiAxICsgdSAqIDIuMDIzMTEgKyB2ICogMDtcbiAgciA9IE1hdGgubWluKE1hdGgubWF4KDAsIHIpLCAxKTtcbiAgZyA9IE1hdGgubWluKE1hdGgubWF4KDAsIGcpLCAxKTtcbiAgYiA9IE1hdGgubWluKE1hdGgubWF4KDAsIGIpLCAxKTtcbiAgcmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZ2IyeXV2KHJnYikge1xuICB2YXIgciA9IHJnYlswXSAvIDI1NSxcbiAgICAgIGcgPSByZ2JbMV0gLyAyNTUsXG4gICAgICBiID0gcmdiWzJdIC8gMjU1O1xuICB2YXIgeSA9IHIgKiAwLjI5OSArIGcgKiAwLjU4NyArIGIgKiAwLjExNDtcbiAgdmFyIHUgPSByICogLTAuMTQ3MTMgKyBnICogLTAuMjg4ODYgKyBiICogMC40MzY7XG4gIHZhciB2ID0gciAqIDAuNjE1ICsgZyAqIC0wLjUxNDk5ICsgYiAqIC0wLjEwMDAxO1xuICByZXR1cm4gW3ksIHUsIHZdO1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0ICogYXMgYmFzZTE2IGZyb20gJ2Jhc2UxNic7XG5pbXBvcnQgQ29sb3IgZnJvbSAnY29sb3InO1xuaW1wb3J0IGN1cnJ5IGZyb20gJ2xvZGFzaC5jdXJyeSc7XG5pbXBvcnQgeyB5dXYycmdiLCByZ2IyeXV2IH0gZnJvbSAnLi9jb2xvckNvbnZlcnRlcnMnO1xudmFyIERFRkFVTFRfQkFTRTE2ID0gYmFzZTE2LmRlZmF1bHQ7XG52YXIgQkFTRTE2X0tFWVMgPSBPYmplY3Qua2V5cyhERUZBVUxUX0JBU0UxNik7IC8vIHdlIG5lZWQgYSBjb3JyZWN0aW5nIGZhY3Rvciwgc28gdGhhdCBhIGRhcmssIGJ1dCBub3QgYmxhY2sgYmFja2dyb3VuZCBjb2xvclxuLy8gY29udmVydHMgdG8gYnJpZ2h0IGVub3VnaCBpbnZlcnNlZCBjb2xvclxuXG52YXIgZmxpcCA9IGZ1bmN0aW9uIGZsaXAoeCkge1xuICByZXR1cm4geCA8IDAuMjUgPyAxIDogeCA8IDAuNSA/IDAuOSAtIHggOiAxLjEgLSB4O1xufTtcblxudmFyIGludmVydENvbG9yID0gZnVuY3Rpb24gaW52ZXJ0Q29sb3IoaGV4U3RyaW5nKSB7XG4gIHZhciBjb2xvciA9IENvbG9yKGhleFN0cmluZyk7XG5cbiAgdmFyIF9yZ2IyeXV2ID0gcmdiMnl1dihjb2xvci5hcnJheSgpKSxcbiAgICAgIF9yZ2IyeXV2MiA9IF9zbGljZWRUb0FycmF5KF9yZ2IyeXV2LCAzKSxcbiAgICAgIHkgPSBfcmdiMnl1djJbMF0sXG4gICAgICB1ID0gX3JnYjJ5dXYyWzFdLFxuICAgICAgdiA9IF9yZ2IyeXV2MlsyXTtcblxuICB2YXIgZmxpcHBlZFl1diA9IFtmbGlwKHkpLCB1LCB2XTtcbiAgdmFyIHJnYiA9IHl1djJyZ2IoZmxpcHBlZFl1dik7XG4gIHJldHVybiBDb2xvci5yZ2IocmdiKS5oZXgoKTtcbn07XG5cbnZhciBtZXJnZXIgPSBmdW5jdGlvbiBtZXJnZXIoc3R5bGluZykge1xuICByZXR1cm4gZnVuY3Rpb24gKHByZXZTdHlsaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYXNzTmFtZTogW3ByZXZTdHlsaW5nLmNsYXNzTmFtZSwgc3R5bGluZy5jbGFzc05hbWVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyksXG4gICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3R5bGluZy5zdHlsZSB8fCB7fSksIHN0eWxpbmcuc3R5bGUgfHwge30pXG4gICAgfTtcbiAgfTtcbn07XG5cbnZhciBtZXJnZVN0eWxpbmcgPSBmdW5jdGlvbiBtZXJnZVN0eWxpbmcoY3VzdG9tU3R5bGluZywgZGVmYXVsdFN0eWxpbmcpIHtcbiAgaWYgKGN1c3RvbVN0eWxpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBkZWZhdWx0U3R5bGluZztcbiAgfVxuXG4gIGlmIChkZWZhdWx0U3R5bGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0eWxpbmc7XG4gIH1cblxuICB2YXIgY3VzdG9tVHlwZSA9IF90eXBlb2YoY3VzdG9tU3R5bGluZyk7XG5cbiAgdmFyIGRlZmF1bHRUeXBlID0gX3R5cGVvZihkZWZhdWx0U3R5bGluZyk7XG5cbiAgc3dpdGNoIChjdXN0b21UeXBlKSB7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIHN3aXRjaCAoZGVmYXVsdFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICByZXR1cm4gW2RlZmF1bHRTdHlsaW5nLCBjdXN0b21TdHlsaW5nXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuXG4gICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgcmV0dXJuIG1lcmdlcih7XG4gICAgICAgICAgICBjbGFzc05hbWU6IGN1c3RvbVN0eWxpbmcsXG4gICAgICAgICAgICBzdHlsZTogZGVmYXVsdFN0eWxpbmdcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzdHlsaW5nKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VyKHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjdXN0b21TdHlsaW5nXG4gICAgICAgICAgICB9KShkZWZhdWx0U3R5bGluZy5hcHBseSh2b2lkIDAsIFtzdHlsaW5nXS5jb25jYXQoYXJncykpKTtcbiAgICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICBzd2l0Y2ggKGRlZmF1bHRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgcmV0dXJuIG1lcmdlcih7XG4gICAgICAgICAgICBjbGFzc05hbWU6IGRlZmF1bHRTdHlsaW5nLFxuICAgICAgICAgICAgc3R5bGU6IGN1c3RvbVN0eWxpbmdcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRlZmF1bHRTdHlsaW5nKSwgY3VzdG9tU3R5bGluZyk7XG5cbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoc3R5bGluZykge1xuICAgICAgICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG1lcmdlcih7XG4gICAgICAgICAgICAgIHN0eWxlOiBjdXN0b21TdHlsaW5nXG4gICAgICAgICAgICB9KShkZWZhdWx0U3R5bGluZy5hcHBseSh2b2lkIDAsIFtzdHlsaW5nXS5jb25jYXQoYXJncykpKTtcbiAgICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHN3aXRjaCAoZGVmYXVsdFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHN0eWxpbmcpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMyA+IDEgPyBfbGVuMyAtIDEgOiAwKSwgX2tleTMgPSAxOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgICAgICAgICAgIGFyZ3NbX2tleTMgLSAxXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjdXN0b21TdHlsaW5nLmFwcGx5KHZvaWQgMCwgW21lcmdlcihzdHlsaW5nKSh7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogZGVmYXVsdFN0eWxpbmdcbiAgICAgICAgICAgIH0pXS5jb25jYXQoYXJncykpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHN0eWxpbmcpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9sZW40ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuNCA+IDEgPyBfbGVuNCAtIDEgOiAwKSwgX2tleTQgPSAxOyBfa2V5NCA8IF9sZW40OyBfa2V5NCsrKSB7XG4gICAgICAgICAgICAgIGFyZ3NbX2tleTQgLSAxXSA9IGFyZ3VtZW50c1tfa2V5NF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjdXN0b21TdHlsaW5nLmFwcGx5KHZvaWQgMCwgW21lcmdlcihzdHlsaW5nKSh7XG4gICAgICAgICAgICAgIHN0eWxlOiBkZWZhdWx0U3R5bGluZ1xuICAgICAgICAgICAgfSldLmNvbmNhdChhcmdzKSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzdHlsaW5nKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuNSA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjUgPiAxID8gX2xlbjUgLSAxIDogMCksIF9rZXk1ID0gMTsgX2tleTUgPCBfbGVuNTsgX2tleTUrKykge1xuICAgICAgICAgICAgICBhcmdzW19rZXk1IC0gMV0gPSBhcmd1bWVudHNbX2tleTVdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY3VzdG9tU3R5bGluZy5hcHBseSh2b2lkIDAsIFtkZWZhdWx0U3R5bGluZy5hcHBseSh2b2lkIDAsIFtzdHlsaW5nXS5jb25jYXQoYXJncykpXS5jb25jYXQoYXJncykpO1xuICAgICAgICAgIH07XG4gICAgICB9XG5cbiAgfVxufTtcblxudmFyIG1lcmdlU3R5bGluZ3MgPSBmdW5jdGlvbiBtZXJnZVN0eWxpbmdzKGN1c3RvbVN0eWxpbmdzLCBkZWZhdWx0U3R5bGluZ3MpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhkZWZhdWx0U3R5bGluZ3MpO1xuXG4gIGZvciAodmFyIGtleSBpbiBjdXN0b21TdHlsaW5ncykge1xuICAgIGlmIChrZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpIGtleXMucHVzaChrZXkpO1xuICB9XG5cbiAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uIChtZXJnZWRTdHlsaW5nLCBrZXkpIHtcbiAgICByZXR1cm4gbWVyZ2VkU3R5bGluZ1trZXldID0gbWVyZ2VTdHlsaW5nKGN1c3RvbVN0eWxpbmdzW2tleV0sIGRlZmF1bHRTdHlsaW5nc1trZXldKSwgbWVyZ2VkU3R5bGluZztcbiAgfSwge30pO1xufTtcblxudmFyIGdldFN0eWxpbmdCeUtleXMgPSBmdW5jdGlvbiBnZXRTdHlsaW5nQnlLZXlzKG1lcmdlZFN0eWxpbmcsIGtleXMpIHtcbiAgZm9yICh2YXIgX2xlbjYgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW42ID4gMiA/IF9sZW42IC0gMiA6IDApLCBfa2V5NiA9IDI7IF9rZXk2IDwgX2xlbjY7IF9rZXk2KyspIHtcbiAgICBhcmdzW19rZXk2IC0gMl0gPSBhcmd1bWVudHNbX2tleTZdO1xuICB9XG5cbiAgaWYgKGtleXMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbWVyZ2VkU3R5bGluZztcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgIGtleXMgPSBba2V5c107XG4gIH1cblxuICB2YXIgc3R5bGVzID0ga2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBtZXJnZWRTdHlsaW5nW2tleV07XG4gIH0pLmZpbHRlcihCb29sZWFuKTtcbiAgdmFyIHByb3BzID0gc3R5bGVzLnJlZHVjZShmdW5jdGlvbiAob2JqLCBzKSB7XG4gICAgaWYgKHR5cGVvZiBzID09PSAnc3RyaW5nJykge1xuICAgICAgb2JqLmNsYXNzTmFtZSA9IFtvYmouY2xhc3NOYW1lLCBzXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIH0gZWxzZSBpZiAoX3R5cGVvZihzKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIG9iai5zdHlsZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb2JqLnN0eWxlKSwgcyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb2JqID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvYmopLCBzLmFwcGx5KHZvaWQgMCwgW29ial0uY29uY2F0KGFyZ3MpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbiAgfSwge1xuICAgIGNsYXNzTmFtZTogJycsXG4gICAgc3R5bGU6IHt9XG4gIH0pO1xuXG4gIGlmICghcHJvcHMuY2xhc3NOYW1lKSB7XG4gICAgZGVsZXRlIHByb3BzLmNsYXNzTmFtZTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhwcm9wcy5zdHlsZSkubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIHByb3BzLnN0eWxlO1xuICB9XG5cbiAgcmV0dXJuIHByb3BzO1xufTtcblxuZXhwb3J0IHZhciBpbnZlcnRCYXNlMTZUaGVtZSA9IGZ1bmN0aW9uIGludmVydEJhc2UxNlRoZW1lKGJhc2UxNlRoZW1lKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhiYXNlMTZUaGVtZSkucmVkdWNlKGZ1bmN0aW9uICh0LCBrZXkpIHtcbiAgICByZXR1cm4gdFtrZXldID0gL15iYXNlLy50ZXN0KGtleSkgPyBpbnZlcnRDb2xvcihiYXNlMTZUaGVtZVtrZXldKSA6IGtleSA9PT0gJ3NjaGVtZScgPyBiYXNlMTZUaGVtZVtrZXldICsgJzppbnZlcnRlZCcgOiBiYXNlMTZUaGVtZVtrZXldLCB0O1xuICB9LCB7fSk7XG59O1xuZXhwb3J0IHZhciBjcmVhdGVTdHlsaW5nID0gY3VycnkoZnVuY3Rpb24gKGdldFN0eWxpbmdGcm9tQmFzZTE2KSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgdmFyIHRoZW1lT3JTdHlsaW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgdmFyIF9vcHRpb25zJGRlZmF1bHRCYXNlID0gb3B0aW9ucy5kZWZhdWx0QmFzZTE2LFxuICAgICAgZGVmYXVsdEJhc2UxNiA9IF9vcHRpb25zJGRlZmF1bHRCYXNlID09PSB2b2lkIDAgPyBERUZBVUxUX0JBU0UxNiA6IF9vcHRpb25zJGRlZmF1bHRCYXNlLFxuICAgICAgX29wdGlvbnMkYmFzZTE2VGhlbWVzID0gb3B0aW9ucy5iYXNlMTZUaGVtZXMsXG4gICAgICBiYXNlMTZUaGVtZXMgPSBfb3B0aW9ucyRiYXNlMTZUaGVtZXMgPT09IHZvaWQgMCA/IG51bGwgOiBfb3B0aW9ucyRiYXNlMTZUaGVtZXM7XG4gIHZhciBiYXNlMTZUaGVtZSA9IGdldEJhc2UxNlRoZW1lKHRoZW1lT3JTdHlsaW5nLCBiYXNlMTZUaGVtZXMpO1xuXG4gIGlmIChiYXNlMTZUaGVtZSkge1xuICAgIHRoZW1lT3JTdHlsaW5nID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBiYXNlMTZUaGVtZSksIHRoZW1lT3JTdHlsaW5nKTtcbiAgfVxuXG4gIHZhciB0aGVtZSA9IEJBU0UxNl9LRVlTLnJlZHVjZShmdW5jdGlvbiAodCwga2V5KSB7XG4gICAgcmV0dXJuIHRba2V5XSA9IHRoZW1lT3JTdHlsaW5nW2tleV0gfHwgZGVmYXVsdEJhc2UxNltrZXldLCB0O1xuICB9LCB7fSk7XG4gIHZhciBjdXN0b21TdHlsaW5nID0gT2JqZWN0LmtleXModGhlbWVPclN0eWxpbmcpLnJlZHVjZShmdW5jdGlvbiAocywga2V5KSB7XG4gICAgcmV0dXJuIEJBU0UxNl9LRVlTLmluZGV4T2Yoa2V5KSA9PT0gLTEgPyAoc1trZXldID0gdGhlbWVPclN0eWxpbmdba2V5XSwgcykgOiBzO1xuICB9LCB7fSk7XG4gIHZhciBkZWZhdWx0U3R5bGluZyA9IGdldFN0eWxpbmdGcm9tQmFzZTE2KHRoZW1lKTtcbiAgdmFyIG1lcmdlZFN0eWxpbmcgPSBtZXJnZVN0eWxpbmdzKGN1c3RvbVN0eWxpbmcsIGRlZmF1bHRTdHlsaW5nKTtcblxuICBmb3IgKHZhciBfbGVuNyA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjcgPiAzID8gX2xlbjcgLSAzIDogMCksIF9rZXk3ID0gMzsgX2tleTcgPCBfbGVuNzsgX2tleTcrKykge1xuICAgIGFyZ3NbX2tleTcgLSAzXSA9IGFyZ3VtZW50c1tfa2V5N107XG4gIH1cblxuICByZXR1cm4gY3VycnkoZ2V0U3R5bGluZ0J5S2V5cywgMikuYXBwbHkodm9pZCAwLCBbbWVyZ2VkU3R5bGluZ10uY29uY2F0KGFyZ3MpKTtcbn0sIDMpO1xuXG52YXIgaXNTdHlsaW5nQ29uZmlnID0gZnVuY3Rpb24gaXNTdHlsaW5nQ29uZmlnKHRoZW1lKSB7XG4gIHJldHVybiAhIXRoZW1lLmV4dGVuZDtcbn07XG5cbmV4cG9ydCB2YXIgZ2V0QmFzZTE2VGhlbWUgPSBmdW5jdGlvbiBnZXRCYXNlMTZUaGVtZSh0aGVtZSwgYmFzZTE2VGhlbWVzKSB7XG4gIGlmICh0aGVtZSAmJiBpc1N0eWxpbmdDb25maWcodGhlbWUpICYmIHRoZW1lLmV4dGVuZCkge1xuICAgIHRoZW1lID0gdGhlbWUuZXh0ZW5kO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0aGVtZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgX3RoZW1lJHNwbGl0ID0gdGhlbWUuc3BsaXQoJzonKSxcbiAgICAgICAgX3RoZW1lJHNwbGl0MiA9IF9zbGljZWRUb0FycmF5KF90aGVtZSRzcGxpdCwgMiksXG4gICAgICAgIF90aGVtZU5hbWUgPSBfdGhlbWUkc3BsaXQyWzBdLFxuICAgICAgICBtb2RpZmllciA9IF90aGVtZSRzcGxpdDJbMV07XG5cbiAgICBpZiAoYmFzZTE2VGhlbWVzKSB7XG4gICAgICB0aGVtZSA9IGJhc2UxNlRoZW1lc1tfdGhlbWVOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhlbWUgPSBiYXNlMTZbX3RoZW1lTmFtZV07XG4gICAgfVxuXG4gICAgaWYgKG1vZGlmaWVyID09PSAnaW52ZXJ0ZWQnKSB7XG4gICAgICB0aGVtZSA9IGludmVydEJhc2UxNlRoZW1lKHRoZW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhlbWUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoZW1lLCAnYmFzZTAwJykgPyB0aGVtZSA6IHVuZGVmaW5lZDtcbn07XG5leHBvcnQgdmFyIGludmVydFRoZW1lID0gZnVuY3Rpb24gaW52ZXJ0VGhlbWUodGhlbWUpIHtcbiAgaWYgKHR5cGVvZiB0aGVtZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQodGhlbWUsIFwiOmludmVydGVkXCIpO1xuICB9XG5cbiAgaWYgKHRoZW1lICYmIGlzU3R5bGluZ0NvbmZpZyh0aGVtZSkgJiYgdGhlbWUuZXh0ZW5kKSB7XG4gICAgaWYgKHR5cGVvZiB0aGVtZS5leHRlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0aGVtZSksIHt9LCB7XG4gICAgICAgIGV4dGVuZDogXCJcIi5jb25jYXQodGhlbWUuZXh0ZW5kLCBcIjppbnZlcnRlZFwiKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhlbWUpLCB7fSwge1xuICAgICAgZXh0ZW5kOiBpbnZlcnRCYXNlMTZUaGVtZSh0aGVtZS5leHRlbmQpXG4gICAgfSk7XG4gIH1cblxuICBpZiAodGhlbWUpIHtcbiAgICByZXR1cm4gaW52ZXJ0QmFzZTE2VGhlbWUodGhlbWUpO1xuICB9XG5cbiAgcmV0dXJuIHRoZW1lO1xufTtcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnOyIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuMTMuMVxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cblxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBoYXNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3I7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIDogMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJykgOiAweGVhY2E7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50JykgOiAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJykgOiAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJykgOiAweGVhZDI7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJykgOiAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpIDogMHhlYWNlOyAvLyBUT0RPOiBXZSBkb24ndCB1c2UgQXN5bmNNb2RlIG9yIENvbmN1cnJlbnRNb2RlIGFueW1vcmUuIFRoZXkgd2VyZSB0ZW1wb3Jhcnlcbi8vICh1bnN0YWJsZSkgQVBJcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLiBDYW4gd2UgcmVtb3ZlIHRoZSBzeW1ib2xzP1xuXG52YXIgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuYXN5bmNfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29uY3VycmVudF9tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJykgOiAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJykgOiAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpIDogMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKSA6IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5JykgOiAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmJsb2NrJykgOiAweGVhZDk7XG52YXIgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJykgOiAweGVhZDU7XG52YXIgUkVBQ1RfUkVTUE9OREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5yZXNwb25kZXInKSA6IDB4ZWFkNjtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKSA6IDB4ZWFkNztcblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCAvLyBOb3RlOiBpdHMgdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgaWYgaXQncyBhIHBvbHlmaWxsLlxuICB0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUkVTUE9OREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfU0NPUEVfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9CTE9DS19UWVBFKTtcbn1cblxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuXG4gICAgc3dpdGNoICgkJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0LnR5cGU7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59IC8vIEFzeW5jTW9kZSBpcyBkZXByZWNhdGVkIGFsb25nIHdpdGggaXNBc3luY01vZGVcblxudmFyIEFzeW5jTW9kZSA9IFJFQUNUX0FTWU5DX01PREVfVFlQRTtcbnZhciBDb25jdXJyZW50TW9kZSA9IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xudmFyIENvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlRFWFRfVFlQRTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSBSRUFDVF9QUk9WSURFUl9UWVBFO1xudmFyIEVsZW1lbnQgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG52YXIgRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG52YXIgRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xudmFyIExhenkgPSBSRUFDVF9MQVpZX1RZUEU7XG52YXIgTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcbnZhciBQb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbnZhciBQcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG52YXIgU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG52YXIgU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gZmFsc2U7IC8vIEFzeW5jTW9kZSBzaG91bGQgYmUgZGVwcmVjYXRlZFxuXG5mdW5jdGlvbiBpc0FzeW5jTW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0FzeW5jTW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxNysuIFVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlICcgKyAnUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgaW5zdGVhZC4gSXQgaGFzIHRoZSBleGFjdCBzYW1lIEFQSS4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHx8IHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRm9yd2FyZFJlZihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xufVxuZnVuY3Rpb24gaXNGcmFnbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNMYXp5KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0xBWllfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5mdW5jdGlvbiBpc1BvcnRhbChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUHJvZmlsZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3RyaWN0TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xufVxuXG5leHBvcnRzLkFzeW5jTW9kZSA9IEFzeW5jTW9kZTtcbmV4cG9ydHMuQ29uY3VycmVudE1vZGUgPSBDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGlzQXN5bmNNb2RlO1xuZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlID0gaXNDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuaXNDb250ZXh0Q29uc3VtZXIgPSBpc0NvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXIgPSBpc0NvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBpc0ZvcndhcmRSZWY7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5pc0xhenkgPSBpc0xhenk7XG5leHBvcnRzLmlzTWVtbyA9IGlzTWVtbztcbmV4cG9ydHMuaXNQb3J0YWwgPSBpc1BvcnRhbDtcbmV4cG9ydHMuaXNQcm9maWxlciA9IGlzUHJvZmlsZXI7XG5leHBvcnRzLmlzU3RyaWN0TW9kZSA9IGlzU3RyaWN0TW9kZTtcbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGlzU3VzcGVuc2U7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZTtcbmV4cG9ydHMudHlwZU9mID0gdHlwZU9mO1xuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCI7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiO1xuaW1wb3J0IF9nZXRQcm90b3R5cGVPZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgSlNPTkFycm93IGZyb20gJy4vSlNPTkFycm93JztcblxudmFyIEl0ZW1SYW5nZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoSXRlbVJhbmdlLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEl0ZW1SYW5nZSk7XG5cbiAgZnVuY3Rpb24gSXRlbVJhbmdlKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEl0ZW1SYW5nZSk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJoYW5kbGVDbGlja1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGV4cGFuZGVkOiAhX3RoaXMuc3RhdGUuZXhwYW5kZWRcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBleHBhbmRlZDogZmFsc2VcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhJdGVtUmFuZ2UsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHN0eWxpbmcgPSBfdGhpcyRwcm9wcy5zdHlsaW5nLFxuICAgICAgICAgIGZyb20gPSBfdGhpcyRwcm9wcy5mcm9tLFxuICAgICAgICAgIHRvID0gX3RoaXMkcHJvcHMudG8sXG4gICAgICAgICAgcmVuZGVyQ2hpbGROb2RlcyA9IF90aGlzJHByb3BzLnJlbmRlckNoaWxkTm9kZXMsXG4gICAgICAgICAgbm9kZVR5cGUgPSBfdGhpcyRwcm9wcy5ub2RlVHlwZTtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlLmV4cGFuZGVkID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgc3R5bGluZygnaXRlbVJhbmdlJywgdGhpcy5zdGF0ZS5leHBhbmRlZCksIHJlbmRlckNoaWxkTm9kZXModGhpcy5wcm9wcywgZnJvbSwgdG8pKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBzdHlsaW5nKCdpdGVtUmFuZ2UnLCB0aGlzLnN0YXRlLmV4cGFuZGVkKSwge1xuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTkFycm93LCB7XG4gICAgICAgIG5vZGVUeXBlOiBub2RlVHlwZSxcbiAgICAgICAgc3R5bGluZzogc3R5bGluZyxcbiAgICAgICAgZXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrLFxuICAgICAgICBhcnJvd1N0eWxlOiBcImRvdWJsZVwiXG4gICAgICB9KSwgXCJcIi5jb25jYXQoZnJvbSwgXCIgLi4uIFwiKS5jb25jYXQodG8pKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSXRlbVJhbmdlO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5fZGVmaW5lUHJvcGVydHkoSXRlbVJhbmdlLCBcInByb3BUeXBlc1wiLCB7XG4gIHN0eWxpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGZyb206IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgdG86IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgcmVuZGVyQ2hpbGROb2RlczogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgbm9kZVR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxufSk7XG5cbmV4cG9ydCB7IEl0ZW1SYW5nZSBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJkYXRhXCJdO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgSlNPTk5lc3RlZE5vZGUgZnJvbSAnLi9KU09OTmVzdGVkTm9kZSc7XG5cbi8vIFJldHVybnMgdGhlIFwibiBJdGVtc1wiIHN0cmluZyBmb3IgdGhpcyBub2RlLFxuLy8gZ2VuZXJhdGluZyBhbmQgY2FjaGluZyBpdCBpZiBpdCBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldC5cbmZ1bmN0aW9uIGNyZWF0ZUl0ZW1TdHJpbmcoZGF0YSkge1xuICByZXR1cm4gXCJcIi5jb25jYXQoZGF0YS5sZW5ndGgsIFwiIFwiKS5jb25jYXQoZGF0YS5sZW5ndGggIT09IDEgPyAnaXRlbXMnIDogJ2l0ZW0nKTtcbn1cblxuLy8gQ29uZmlndXJlcyA8SlNPTk5lc3RlZE5vZGU+IHRvIHJlbmRlciBhbiBBcnJheVxudmFyIEpTT05BcnJheU5vZGUgPSBmdW5jdGlvbiBKU09OQXJyYXlOb2RlKF9yZWYpIHtcbiAgdmFyIGRhdGEgPSBfcmVmLmRhdGEsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OTmVzdGVkTm9kZSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgZGF0YTogZGF0YSxcbiAgICBub2RlVHlwZTogXCJBcnJheVwiLFxuICAgIG5vZGVUeXBlSW5kaWNhdG9yOiBcIltdXCIsXG4gICAgY3JlYXRlSXRlbVN0cmluZzogY3JlYXRlSXRlbVN0cmluZyxcbiAgICBleHBhbmRhYmxlOiBkYXRhLmxlbmd0aCA+IDBcbiAgfSkpO1xufTtcblxuSlNPTkFycmF5Tm9kZS5wcm9wVHlwZXMgPSB7XG4gIGRhdGE6IFByb3BUeXBlcy5hcnJheVxufTtcbmV4cG9ydCBkZWZhdWx0IEpTT05BcnJheU5vZGU7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG52YXIgSlNPTkFycm93ID0gZnVuY3Rpb24gSlNPTkFycm93KF9yZWYpIHtcbiAgdmFyIHN0eWxpbmcgPSBfcmVmLnN0eWxpbmcsXG4gICAgICBhcnJvd1N0eWxlID0gX3JlZi5hcnJvd1N0eWxlLFxuICAgICAgZXhwYW5kZWQgPSBfcmVmLmV4cGFuZGVkLFxuICAgICAgbm9kZVR5cGUgPSBfcmVmLm5vZGVUeXBlLFxuICAgICAgb25DbGljayA9IF9yZWYub25DbGljaztcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBzdHlsaW5nKCdhcnJvd0NvbnRhaW5lcicsIGFycm93U3R5bGUpLCB7XG4gICAgb25DbGljazogb25DbGlja1xuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgc3R5bGluZyhbJ2Fycm93JywgJ2Fycm93U2lnbiddLCBub2RlVHlwZSwgZXhwYW5kZWQsIGFycm93U3R5bGUpLCBcIlxcdTI1QjZcIiwgYXJyb3dTdHlsZSA9PT0gJ2RvdWJsZScgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgc3R5bGluZyhbJ2Fycm93U2lnbicsICdhcnJvd1NpZ25Jbm5lciddKSwgXCJcXHUyNUI2XCIpKSk7XG59O1xuXG5KU09OQXJyb3cucHJvcFR5cGVzID0ge1xuICBzdHlsaW5nOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBhcnJvd1N0eWxlOiBQcm9wVHlwZXMub25lT2YoWydzaW5nbGUnLCAnZG91YmxlJ10pLFxuICBleHBhbmRlZDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgbm9kZVR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxufTtcbkpTT05BcnJvdy5kZWZhdWx0UHJvcHMgPSB7XG4gIGFycm93U3R5bGU6ICdzaW5nbGUnXG59O1xuZXhwb3J0IGRlZmF1bHQgSlNPTkFycm93OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCI7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bXCJAQGl0ZXJhdG9yXCJdOyBpZiAoIWl0KSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IGl0LmNhbGwobyk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXQucmV0dXJuICE9IG51bGwpIGl0LnJldHVybigpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBKU09OTmVzdGVkTm9kZSBmcm9tICcuL0pTT05OZXN0ZWROb2RlJztcblxuLy8gUmV0dXJucyB0aGUgXCJuIEl0ZW1zXCIgc3RyaW5nIGZvciB0aGlzIG5vZGUsXG4vLyBnZW5lcmF0aW5nIGFuZCBjYWNoaW5nIGl0IGlmIGl0IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LlxuZnVuY3Rpb24gY3JlYXRlSXRlbVN0cmluZyhkYXRhLCBsaW1pdCkge1xuICB2YXIgY291bnQgPSAwO1xuICB2YXIgaGFzTW9yZSA9IGZhbHNlO1xuXG4gIGlmIChOdW1iZXIuaXNTYWZlSW50ZWdlcihkYXRhLnNpemUpKSB7XG4gICAgY291bnQgPSBkYXRhLnNpemU7XG4gIH0gZWxzZSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGRhdGEpLFxuICAgICAgICBfc3RlcDtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICB2YXIgZW50cnkgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICBpZiAobGltaXQgJiYgY291bnQgKyAxID4gbGltaXQpIHtcbiAgICAgICAgICBoYXNNb3JlID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvdW50ICs9IDE7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfaXRlcmF0b3IuZigpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBcIlwiLmNvbmNhdChoYXNNb3JlID8gJz4nIDogJycpLmNvbmNhdChjb3VudCwgXCIgXCIpLmNvbmNhdChjb3VudCAhPT0gMSA/ICdlbnRyaWVzJyA6ICdlbnRyeScpO1xufVxuXG4vLyBDb25maWd1cmVzIDxKU09OTmVzdGVkTm9kZT4gdG8gcmVuZGVyIGFuIGl0ZXJhYmxlXG52YXIgSlNPTkl0ZXJhYmxlTm9kZSA9IGZ1bmN0aW9uIEpTT05JdGVyYWJsZU5vZGUoX3JlZikge1xuICB2YXIgcHJvcHMgPSBfZXh0ZW5kcyh7fSwgX3JlZik7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05OZXN0ZWROb2RlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBub2RlVHlwZTogXCJJdGVyYWJsZVwiLFxuICAgIG5vZGVUeXBlSW5kaWNhdG9yOiBcIigpXCIsXG4gICAgY3JlYXRlSXRlbVN0cmluZzogY3JlYXRlSXRlbVN0cmluZ1xuICB9KSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBKU09OSXRlcmFibGVOb2RlOyIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBKU09OQXJyb3cgZnJvbSAnLi9KU09OQXJyb3cnO1xuaW1wb3J0IGdldENvbGxlY3Rpb25FbnRyaWVzIGZyb20gJy4vZ2V0Q29sbGVjdGlvbkVudHJpZXMnO1xuaW1wb3J0IEpTT05Ob2RlIGZyb20gJy4vSlNPTk5vZGUnO1xuaW1wb3J0IEl0ZW1SYW5nZSBmcm9tICcuL0l0ZW1SYW5nZSc7XG5cbmZ1bmN0aW9uIGlzUmFuZ2UocmFuZ2VPckVudHJ5KSB7XG4gIHJldHVybiByYW5nZU9yRW50cnkudG8gIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyQ2hpbGROb2Rlcyhwcm9wcywgZnJvbSwgdG8pIHtcbiAgdmFyIG5vZGVUeXBlID0gcHJvcHMubm9kZVR5cGUsXG4gICAgICBkYXRhID0gcHJvcHMuZGF0YSxcbiAgICAgIGNvbGxlY3Rpb25MaW1pdCA9IHByb3BzLmNvbGxlY3Rpb25MaW1pdCxcbiAgICAgIGNpcmN1bGFyQ2FjaGUgPSBwcm9wcy5jaXJjdWxhckNhY2hlLFxuICAgICAga2V5UGF0aCA9IHByb3BzLmtleVBhdGgsXG4gICAgICBwb3N0cHJvY2Vzc1ZhbHVlID0gcHJvcHMucG9zdHByb2Nlc3NWYWx1ZSxcbiAgICAgIHNvcnRPYmplY3RLZXlzID0gcHJvcHMuc29ydE9iamVjdEtleXM7XG4gIHZhciBjaGlsZE5vZGVzID0gW107XG4gIGdldENvbGxlY3Rpb25FbnRyaWVzKG5vZGVUeXBlLCBkYXRhLCBzb3J0T2JqZWN0S2V5cywgY29sbGVjdGlvbkxpbWl0LCBmcm9tLCB0bykuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICBpZiAoaXNSYW5nZShlbnRyeSkpIHtcbiAgICAgIGNoaWxkTm9kZXMucHVzaCggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSXRlbVJhbmdlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAga2V5OiBcIkl0ZW1SYW5nZS0tXCIuY29uY2F0KGVudHJ5LmZyb20sIFwiLVwiKS5jb25jYXQoZW50cnkudG8pLFxuICAgICAgICBmcm9tOiBlbnRyeS5mcm9tLFxuICAgICAgICB0bzogZW50cnkudG8sXG4gICAgICAgIHJlbmRlckNoaWxkTm9kZXM6IHJlbmRlckNoaWxkTm9kZXNcbiAgICAgIH0pKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBrZXkgPSBlbnRyeS5rZXksXG4gICAgICAgICAgdmFsdWUgPSBlbnRyeS52YWx1ZTtcbiAgICAgIHZhciBpc0NpcmN1bGFyID0gY2lyY3VsYXJDYWNoZS5pbmRleE9mKHZhbHVlKSAhPT0gLTE7XG4gICAgICBjaGlsZE5vZGVzLnB1c2goIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05Ob2RlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAgcG9zdHByb2Nlc3NWYWx1ZTogcG9zdHByb2Nlc3NWYWx1ZSxcbiAgICAgICAgY29sbGVjdGlvbkxpbWl0OiBjb2xsZWN0aW9uTGltaXQsXG4gICAgICAgIGtleTogXCJOb2RlLS1cIi5jb25jYXQoa2V5KSxcbiAgICAgICAga2V5UGF0aDogW2tleV0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShrZXlQYXRoKSksXG4gICAgICAgIHZhbHVlOiBwb3N0cHJvY2Vzc1ZhbHVlKHZhbHVlKSxcbiAgICAgICAgY2lyY3VsYXJDYWNoZTogW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShjaXJjdWxhckNhY2hlKSwgW3ZhbHVlXSksXG4gICAgICAgIGlzQ2lyY3VsYXI6IGlzQ2lyY3VsYXIsXG4gICAgICAgIGhpZGVSb290OiBmYWxzZVxuICAgICAgfSkpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY2hpbGROb2Rlcztcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdGVGcm9tUHJvcHMocHJvcHMpIHtcbiAgLy8gY2FsY3VsYXRlIGluZGl2aWR1YWwgbm9kZSBleHBhbnNpb24gaWYgbmVjZXNzYXJ5XG4gIHZhciBleHBhbmRlZCA9ICFwcm9wcy5pc0NpcmN1bGFyID8gcHJvcHMuc2hvdWxkRXhwYW5kTm9kZShwcm9wcy5rZXlQYXRoLCBwcm9wcy5kYXRhLCBwcm9wcy5sZXZlbCkgOiBmYWxzZTtcbiAgcmV0dXJuIHtcbiAgICBleHBhbmRlZDogZXhwYW5kZWRcbiAgfTtcbn1cblxudmFyIEpTT05OZXN0ZWROb2RlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhKU09OTmVzdGVkTm9kZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihKU09OTmVzdGVkTm9kZSk7XG5cbiAgZnVuY3Rpb24gSlNPTk5lc3RlZE5vZGUocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSlNPTk5lc3RlZE5vZGUpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlQ2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnByb3BzLmV4cGFuZGFibGUpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGV4cGFuZGVkOiAhX3RoaXMuc3RhdGUuZXhwYW5kZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfdGhpcy5zdGF0ZSA9IGdldFN0YXRlRnJvbVByb3BzKHByb3BzKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoSlNPTk5lc3RlZE5vZGUsIFt7XG4gICAga2V5OiBcIlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgdmFyIG5leHRTdGF0ZSA9IGdldFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcyk7XG5cbiAgICAgIGlmIChnZXRTdGF0ZUZyb21Qcm9wcyh0aGlzLnByb3BzKS5leHBhbmRlZCAhPT0gbmV4dFN0YXRlLmV4cGFuZGVkKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUobmV4dFN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hvdWxkQ29tcG9uZW50VXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHJldHVybiAhIU9iamVjdC5rZXlzKG5leHRQcm9wcykuZmluZChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBrZXkgIT09ICdjaXJjdWxhckNhY2hlJyAmJiAoa2V5ID09PSAna2V5UGF0aCcgPyBuZXh0UHJvcHNba2V5XS5qb2luKCcvJykgIT09IF90aGlzMi5wcm9wc1trZXldLmpvaW4oJy8nKSA6IG5leHRQcm9wc1trZXldICE9PSBfdGhpczIucHJvcHNba2V5XSk7XG4gICAgICB9KSB8fCBuZXh0U3RhdGUuZXhwYW5kZWQgIT09IHRoaXMuc3RhdGUuZXhwYW5kZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGdldEl0ZW1TdHJpbmcgPSBfdGhpcyRwcm9wcy5nZXRJdGVtU3RyaW5nLFxuICAgICAgICAgIG5vZGVUeXBlSW5kaWNhdG9yID0gX3RoaXMkcHJvcHMubm9kZVR5cGVJbmRpY2F0b3IsXG4gICAgICAgICAgbm9kZVR5cGUgPSBfdGhpcyRwcm9wcy5ub2RlVHlwZSxcbiAgICAgICAgICBkYXRhID0gX3RoaXMkcHJvcHMuZGF0YSxcbiAgICAgICAgICBoaWRlUm9vdCA9IF90aGlzJHByb3BzLmhpZGVSb290LFxuICAgICAgICAgIGNyZWF0ZUl0ZW1TdHJpbmcgPSBfdGhpcyRwcm9wcy5jcmVhdGVJdGVtU3RyaW5nLFxuICAgICAgICAgIHN0eWxpbmcgPSBfdGhpcyRwcm9wcy5zdHlsaW5nLFxuICAgICAgICAgIGNvbGxlY3Rpb25MaW1pdCA9IF90aGlzJHByb3BzLmNvbGxlY3Rpb25MaW1pdCxcbiAgICAgICAgICBrZXlQYXRoID0gX3RoaXMkcHJvcHMua2V5UGF0aCxcbiAgICAgICAgICBsYWJlbFJlbmRlcmVyID0gX3RoaXMkcHJvcHMubGFiZWxSZW5kZXJlcixcbiAgICAgICAgICBleHBhbmRhYmxlID0gX3RoaXMkcHJvcHMuZXhwYW5kYWJsZTtcbiAgICAgIHZhciBleHBhbmRlZCA9IHRoaXMuc3RhdGUuZXhwYW5kZWQ7XG4gICAgICB2YXIgcmVuZGVyZWRDaGlsZHJlbiA9IGV4cGFuZGVkIHx8IGhpZGVSb290ICYmIHRoaXMucHJvcHMubGV2ZWwgPT09IDAgPyByZW5kZXJDaGlsZE5vZGVzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhpcy5wcm9wcyksIHt9LCB7XG4gICAgICAgIGxldmVsOiB0aGlzLnByb3BzLmxldmVsICsgMVxuICAgICAgfSkpIDogbnVsbDtcbiAgICAgIHZhciBpdGVtVHlwZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBzdHlsaW5nKCduZXN0ZWROb2RlSXRlbVR5cGUnLCBleHBhbmRlZCksIG5vZGVUeXBlSW5kaWNhdG9yKTtcbiAgICAgIHZhciByZW5kZXJlZEl0ZW1TdHJpbmcgPSBnZXRJdGVtU3RyaW5nKG5vZGVUeXBlLCBkYXRhLCBpdGVtVHlwZSwgY3JlYXRlSXRlbVN0cmluZyhkYXRhLCBjb2xsZWN0aW9uTGltaXQpLCBrZXlQYXRoKTtcbiAgICAgIHZhciBzdHlsaW5nQXJncyA9IFtrZXlQYXRoLCBub2RlVHlwZSwgZXhwYW5kZWQsIGV4cGFuZGFibGVdO1xuICAgICAgcmV0dXJuIGhpZGVSb290ID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBzdHlsaW5nLmFwcGx5KHZvaWQgMCwgWydyb290Tm9kZSddLmNvbmNhdChzdHlsaW5nQXJncykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIHN0eWxpbmcuYXBwbHkodm9pZCAwLCBbJ3Jvb3ROb2RlQ2hpbGRyZW4nXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwgcmVuZGVyZWRDaGlsZHJlbikpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBzdHlsaW5nLmFwcGx5KHZvaWQgMCwgWyduZXN0ZWROb2RlJ10uY29uY2F0KHN0eWxpbmdBcmdzKSksIGV4cGFuZGFibGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTkFycm93LCB7XG4gICAgICAgIHN0eWxpbmc6IHN0eWxpbmcsXG4gICAgICAgIG5vZGVUeXBlOiBub2RlVHlwZSxcbiAgICAgICAgZXhwYW5kZWQ6IGV4cGFuZGVkLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCBfZXh0ZW5kcyh7fSwgc3R5bGluZy5hcHBseSh2b2lkIDAsIFtbJ2xhYmVsJywgJ25lc3RlZE5vZGVMYWJlbCddXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwge1xuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9KSwgbGFiZWxSZW5kZXJlci5hcHBseSh2b2lkIDAsIHN0eWxpbmdBcmdzKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBfZXh0ZW5kcyh7fSwgc3R5bGluZy5hcHBseSh2b2lkIDAsIFsnbmVzdGVkTm9kZUl0ZW1TdHJpbmcnXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwge1xuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9KSwgcmVuZGVyZWRJdGVtU3RyaW5nKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBzdHlsaW5nLmFwcGx5KHZvaWQgMCwgWyduZXN0ZWROb2RlQ2hpbGRyZW4nXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwgcmVuZGVyZWRDaGlsZHJlbikpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBKU09OTmVzdGVkTm9kZTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuX2RlZmluZVByb3BlcnR5KEpTT05OZXN0ZWROb2RlLCBcInByb3BUeXBlc1wiLCB7XG4gIGdldEl0ZW1TdHJpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIG5vZGVUeXBlSW5kaWNhdG9yOiBQcm9wVHlwZXMuYW55LFxuICBub2RlVHlwZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBkYXRhOiBQcm9wVHlwZXMuYW55LFxuICBoaWRlUm9vdDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgY3JlYXRlSXRlbVN0cmluZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgc3R5bGluZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgY29sbGVjdGlvbkxpbWl0OiBQcm9wVHlwZXMubnVtYmVyLFxuICBrZXlQYXRoOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSkpLmlzUmVxdWlyZWQsXG4gIGxhYmVsUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHNob3VsZEV4cGFuZE5vZGU6IFByb3BUeXBlcy5mdW5jLFxuICBsZXZlbDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBzb3J0T2JqZWN0S2V5czogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmZ1bmMsIFByb3BUeXBlcy5ib29sXSksXG4gIGlzQ2lyY3VsYXI6IFByb3BUeXBlcy5ib29sLFxuICBleHBhbmRhYmxlOiBQcm9wVHlwZXMuYm9vbFxufSk7XG5cbl9kZWZpbmVQcm9wZXJ0eShKU09OTmVzdGVkTm9kZSwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICBkYXRhOiBbXSxcbiAgY2lyY3VsYXJDYWNoZTogW10sXG4gIGxldmVsOiAwLFxuICBleHBhbmRhYmxlOiB0cnVlXG59KTtcblxuZXhwb3J0IHsgSlNPTk5lc3RlZE5vZGUgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiZ2V0SXRlbVN0cmluZ1wiLCBcImtleVBhdGhcIiwgXCJsYWJlbFJlbmRlcmVyXCIsIFwic3R5bGluZ1wiLCBcInZhbHVlXCIsIFwidmFsdWVSZW5kZXJlclwiLCBcImlzQ3VzdG9tTm9kZVwiXTtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgb2JqVHlwZSBmcm9tICcuL29ialR5cGUnO1xuaW1wb3J0IEpTT05PYmplY3ROb2RlIGZyb20gJy4vSlNPTk9iamVjdE5vZGUnO1xuaW1wb3J0IEpTT05BcnJheU5vZGUgZnJvbSAnLi9KU09OQXJyYXlOb2RlJztcbmltcG9ydCBKU09OSXRlcmFibGVOb2RlIGZyb20gJy4vSlNPTkl0ZXJhYmxlTm9kZSc7XG5pbXBvcnQgSlNPTlZhbHVlTm9kZSBmcm9tICcuL0pTT05WYWx1ZU5vZGUnO1xuXG52YXIgSlNPTk5vZGUgPSBmdW5jdGlvbiBKU09OTm9kZShfcmVmKSB7XG4gIHZhciBnZXRJdGVtU3RyaW5nID0gX3JlZi5nZXRJdGVtU3RyaW5nLFxuICAgICAga2V5UGF0aCA9IF9yZWYua2V5UGF0aCxcbiAgICAgIGxhYmVsUmVuZGVyZXIgPSBfcmVmLmxhYmVsUmVuZGVyZXIsXG4gICAgICBzdHlsaW5nID0gX3JlZi5zdHlsaW5nLFxuICAgICAgdmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgICAgdmFsdWVSZW5kZXJlciA9IF9yZWYudmFsdWVSZW5kZXJlcixcbiAgICAgIGlzQ3VzdG9tTm9kZSA9IF9yZWYuaXNDdXN0b21Ob2RlLFxuICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIHZhciBub2RlVHlwZSA9IGlzQ3VzdG9tTm9kZSh2YWx1ZSkgPyAnQ3VzdG9tJyA6IG9ialR5cGUodmFsdWUpO1xuICB2YXIgc2ltcGxlTm9kZVByb3BzID0ge1xuICAgIGdldEl0ZW1TdHJpbmc6IGdldEl0ZW1TdHJpbmcsXG4gICAga2V5OiBrZXlQYXRoWzBdLFxuICAgIGtleVBhdGg6IGtleVBhdGgsXG4gICAgbGFiZWxSZW5kZXJlcjogbGFiZWxSZW5kZXJlcixcbiAgICBub2RlVHlwZTogbm9kZVR5cGUsXG4gICAgc3R5bGluZzogc3R5bGluZyxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgdmFsdWVSZW5kZXJlcjogdmFsdWVSZW5kZXJlclxuICB9O1xuXG4gIHZhciBuZXN0ZWROb2RlUHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcmVzdCksIHNpbXBsZU5vZGVQcm9wcyksIHt9LCB7XG4gICAgZGF0YTogdmFsdWUsXG4gICAgaXNDdXN0b21Ob2RlOiBpc0N1c3RvbU5vZGVcbiAgfSk7XG5cbiAgc3dpdGNoIChub2RlVHlwZSkge1xuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgY2FzZSAnRXJyb3InOlxuICAgIGNhc2UgJ1dlYWtNYXAnOlxuICAgIGNhc2UgJ1dlYWtTZXQnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05PYmplY3ROb2RlLCBuZXN0ZWROb2RlUHJvcHMpO1xuXG4gICAgY2FzZSAnQXJyYXknOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05BcnJheU5vZGUsIG5lc3RlZE5vZGVQcm9wcyk7XG5cbiAgICBjYXNlICdJdGVyYWJsZSc6XG4gICAgY2FzZSAnTWFwJzpcbiAgICBjYXNlICdTZXQnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05JdGVyYWJsZU5vZGUsIG5lc3RlZE5vZGVQcm9wcyk7XG5cbiAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05WYWx1ZU5vZGUsIF9leHRlbmRzKHt9LCBzaW1wbGVOb2RlUHJvcHMsIHtcbiAgICAgICAgdmFsdWVHZXR0ZXI6IGZ1bmN0aW9uIHZhbHVlR2V0dGVyKHJhdykge1xuICAgICAgICAgIHJldHVybiBcIlxcXCJcIi5jb25jYXQocmF3LCBcIlxcXCJcIik7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ051bWJlcic6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgc2ltcGxlTm9kZVByb3BzKTtcblxuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05WYWx1ZU5vZGUsIF9leHRlbmRzKHt9LCBzaW1wbGVOb2RlUHJvcHMsIHtcbiAgICAgICAgdmFsdWVHZXR0ZXI6IGZ1bmN0aW9uIHZhbHVlR2V0dGVyKHJhdykge1xuICAgICAgICAgIHJldHVybiByYXcgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICBjYXNlICdEYXRlJzpcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OVmFsdWVOb2RlLCBfZXh0ZW5kcyh7fSwgc2ltcGxlTm9kZVByb3BzLCB7XG4gICAgICAgIHZhbHVlR2V0dGVyOiBmdW5jdGlvbiB2YWx1ZUdldHRlcihyYXcpIHtcbiAgICAgICAgICByZXR1cm4gcmF3LnRvSVNPU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ051bGwnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05WYWx1ZU5vZGUsIF9leHRlbmRzKHt9LCBzaW1wbGVOb2RlUHJvcHMsIHtcbiAgICAgICAgdmFsdWVHZXR0ZXI6IGZ1bmN0aW9uIHZhbHVlR2V0dGVyKCkge1xuICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ1VuZGVmaW5lZCc6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgX2V4dGVuZHMoe30sIHNpbXBsZU5vZGVQcm9wcywge1xuICAgICAgICB2YWx1ZUdldHRlcjogZnVuY3Rpb24gdmFsdWVHZXR0ZXIoKSB7XG4gICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICBjYXNlICdGdW5jdGlvbic6XG4gICAgY2FzZSAnU3ltYm9sJzpcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OVmFsdWVOb2RlLCBfZXh0ZW5kcyh7fSwgc2ltcGxlTm9kZVByb3BzLCB7XG4gICAgICAgIHZhbHVlR2V0dGVyOiBmdW5jdGlvbiB2YWx1ZUdldHRlcihyYXcpIHtcbiAgICAgICAgICByZXR1cm4gcmF3LnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ0N1c3RvbSc6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgc2ltcGxlTm9kZVByb3BzKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgX2V4dGVuZHMoe30sIHNpbXBsZU5vZGVQcm9wcywge1xuICAgICAgICB2YWx1ZUdldHRlcjogZnVuY3Rpb24gdmFsdWVHZXR0ZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIFwiPFwiLmNvbmNhdChub2RlVHlwZSwgXCI+XCIpO1xuICAgICAgICB9XG4gICAgICB9KSk7XG4gIH1cbn07XG5cbkpTT05Ob2RlLnByb3BUeXBlcyA9IHtcbiAgZ2V0SXRlbVN0cmluZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAga2V5UGF0aDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLmlzUmVxdWlyZWQpLmlzUmVxdWlyZWQsXG4gIGxhYmVsUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHN0eWxpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHZhbHVlOiBQcm9wVHlwZXMuYW55LFxuICB2YWx1ZVJlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBpc0N1c3RvbU5vZGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbn07XG5leHBvcnQgZGVmYXVsdCBKU09OTm9kZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImRhdGFcIl07XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBKU09OTmVzdGVkTm9kZSBmcm9tICcuL0pTT05OZXN0ZWROb2RlJztcblxuLy8gUmV0dXJucyB0aGUgXCJuIEl0ZW1zXCIgc3RyaW5nIGZvciB0aGlzIG5vZGUsXG4vLyBnZW5lcmF0aW5nIGFuZCBjYWNoaW5nIGl0IGlmIGl0IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LlxuZnVuY3Rpb24gY3JlYXRlSXRlbVN0cmluZyhkYXRhKSB7XG4gIHZhciBsZW4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkYXRhKS5sZW5ndGg7XG4gIHJldHVybiBcIlwiLmNvbmNhdChsZW4sIFwiIFwiKS5jb25jYXQobGVuICE9PSAxID8gJ2tleXMnIDogJ2tleScpO1xufVxuXG4vLyBDb25maWd1cmVzIDxKU09OTmVzdGVkTm9kZT4gdG8gcmVuZGVyIGFuIE9iamVjdFxudmFyIEpTT05PYmplY3ROb2RlID0gZnVuY3Rpb24gSlNPTk9iamVjdE5vZGUoX3JlZikge1xuICB2YXIgZGF0YSA9IF9yZWYuZGF0YSxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIF9leGNsdWRlZCk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05OZXN0ZWROb2RlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBkYXRhOiBkYXRhLFxuICAgIG5vZGVUeXBlOiBcIk9iamVjdFwiLFxuICAgIG5vZGVUeXBlSW5kaWNhdG9yOiBwcm9wcy5ub2RlVHlwZSA9PT0gJ0Vycm9yJyA/ICdFcnJvcigpJyA6ICd7fScsXG4gICAgY3JlYXRlSXRlbVN0cmluZzogY3JlYXRlSXRlbVN0cmluZyxcbiAgICBleHBhbmRhYmxlOiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkYXRhKS5sZW5ndGggPiAwXG4gIH0pKTtcbn07XG5cbkpTT05PYmplY3ROb2RlLnByb3BUeXBlcyA9IHtcbiAgZGF0YTogUHJvcFR5cGVzLm9iamVjdCxcbiAgbm9kZVR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxufTtcbmV4cG9ydCBkZWZhdWx0IEpTT05PYmplY3ROb2RlOyIsImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG52YXIgSlNPTlZhbHVlTm9kZSA9IGZ1bmN0aW9uIEpTT05WYWx1ZU5vZGUoX3JlZikge1xuICB2YXIgbm9kZVR5cGUgPSBfcmVmLm5vZGVUeXBlLFxuICAgICAgc3R5bGluZyA9IF9yZWYuc3R5bGluZyxcbiAgICAgIGxhYmVsUmVuZGVyZXIgPSBfcmVmLmxhYmVsUmVuZGVyZXIsXG4gICAgICBrZXlQYXRoID0gX3JlZi5rZXlQYXRoLFxuICAgICAgdmFsdWVSZW5kZXJlciA9IF9yZWYudmFsdWVSZW5kZXJlcixcbiAgICAgIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICAgIF9yZWYkdmFsdWVHZXR0ZXIgPSBfcmVmLnZhbHVlR2V0dGVyLFxuICAgICAgdmFsdWVHZXR0ZXIgPSBfcmVmJHZhbHVlR2V0dGVyID09PSB2b2lkIDAgPyBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gOiBfcmVmJHZhbHVlR2V0dGVyO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBzdHlsaW5nKCd2YWx1ZScsIG5vZGVUeXBlLCBrZXlQYXRoKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCBzdHlsaW5nKFsnbGFiZWwnLCAndmFsdWVMYWJlbCddLCBub2RlVHlwZSwga2V5UGF0aCksIGxhYmVsUmVuZGVyZXIoa2V5UGF0aCwgbm9kZVR5cGUsIGZhbHNlLCBmYWxzZSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgc3R5bGluZygndmFsdWVUZXh0Jywgbm9kZVR5cGUsIGtleVBhdGgpLCB2YWx1ZVJlbmRlcmVyLmFwcGx5KHZvaWQgMCwgW3ZhbHVlR2V0dGVyKHZhbHVlKSwgdmFsdWVdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoa2V5UGF0aCkpKSkpO1xufTtcblxuSlNPTlZhbHVlTm9kZS5wcm9wVHlwZXMgPSB7XG4gIG5vZGVUeXBlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIHN0eWxpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGxhYmVsUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGtleVBhdGg6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXJdKS5pc1JlcXVpcmVkKS5pc1JlcXVpcmVkLFxuICB2YWx1ZVJlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICB2YWx1ZTogUHJvcFR5cGVzLmFueSxcbiAgdmFsdWVHZXR0ZXI6IFByb3BUeXBlcy5mdW5jXG59O1xuZXhwb3J0IGRlZmF1bHQgSlNPTlZhbHVlTm9kZTsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCB7IGNyZWF0ZVN0eWxpbmcgfSBmcm9tICdyZWFjdC1iYXNlMTYtc3R5bGluZyc7XG5pbXBvcnQgc29sYXJpemVkIGZyb20gJy4vdGhlbWVzL3NvbGFyaXplZCc7XG5cbnZhciBjb2xvck1hcCA9IGZ1bmN0aW9uIGNvbG9yTWFwKHRoZW1lKSB7XG4gIHJldHVybiB7XG4gICAgQkFDS0dST1VORF9DT0xPUjogdGhlbWUuYmFzZTAwLFxuICAgIFRFWFRfQ09MT1I6IHRoZW1lLmJhc2UwNyxcbiAgICBTVFJJTkdfQ09MT1I6IHRoZW1lLmJhc2UwQixcbiAgICBEQVRFX0NPTE9SOiB0aGVtZS5iYXNlMEIsXG4gICAgTlVNQkVSX0NPTE9SOiB0aGVtZS5iYXNlMDksXG4gICAgQk9PTEVBTl9DT0xPUjogdGhlbWUuYmFzZTA5LFxuICAgIE5VTExfQ09MT1I6IHRoZW1lLmJhc2UwOCxcbiAgICBVTkRFRklORURfQ09MT1I6IHRoZW1lLmJhc2UwOCxcbiAgICBGVU5DVElPTl9DT0xPUjogdGhlbWUuYmFzZTA4LFxuICAgIFNZTUJPTF9DT0xPUjogdGhlbWUuYmFzZTA4LFxuICAgIExBQkVMX0NPTE9SOiB0aGVtZS5iYXNlMEQsXG4gICAgQVJST1dfQ09MT1I6IHRoZW1lLmJhc2UwRCxcbiAgICBJVEVNX1NUUklOR19DT0xPUjogdGhlbWUuYmFzZTBCLFxuICAgIElURU1fU1RSSU5HX0VYUEFOREVEX0NPTE9SOiB0aGVtZS5iYXNlMDNcbiAgfTtcbn07XG5cbnZhciB2YWx1ZUNvbG9yTWFwID0gZnVuY3Rpb24gdmFsdWVDb2xvck1hcChjb2xvcnMpIHtcbiAgcmV0dXJuIHtcbiAgICBTdHJpbmc6IGNvbG9ycy5TVFJJTkdfQ09MT1IsXG4gICAgRGF0ZTogY29sb3JzLkRBVEVfQ09MT1IsXG4gICAgTnVtYmVyOiBjb2xvcnMuTlVNQkVSX0NPTE9SLFxuICAgIEJvb2xlYW46IGNvbG9ycy5CT09MRUFOX0NPTE9SLFxuICAgIE51bGw6IGNvbG9ycy5OVUxMX0NPTE9SLFxuICAgIFVuZGVmaW5lZDogY29sb3JzLlVOREVGSU5FRF9DT0xPUixcbiAgICBGdW5jdGlvbjogY29sb3JzLkZVTkNUSU9OX0NPTE9SLFxuICAgIFN5bWJvbDogY29sb3JzLlNZTUJPTF9DT0xPUlxuICB9O1xufTtcblxudmFyIGdldERlZmF1bHRUaGVtZVN0eWxpbmcgPSBmdW5jdGlvbiBnZXREZWZhdWx0VGhlbWVTdHlsaW5nKHRoZW1lKSB7XG4gIHZhciBjb2xvcnMgPSBjb2xvck1hcCh0aGVtZSk7XG4gIHJldHVybiB7XG4gICAgdHJlZToge1xuICAgICAgYm9yZGVyOiAwLFxuICAgICAgcGFkZGluZzogMCxcbiAgICAgIG1hcmdpblRvcDogJzAuNWVtJyxcbiAgICAgIG1hcmdpbkJvdHRvbTogJzAuNWVtJyxcbiAgICAgIG1hcmdpbkxlZnQ6ICcwLjEyNWVtJyxcbiAgICAgIG1hcmdpblJpZ2h0OiAwLFxuICAgICAgbGlzdFN0eWxlOiAnbm9uZScsXG4gICAgICBNb3pVc2VyU2VsZWN0OiAnbm9uZScsXG4gICAgICBXZWJraXRVc2VyU2VsZWN0OiAnbm9uZScsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9ycy5CQUNLR1JPVU5EX0NPTE9SXG4gICAgfSxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoX3JlZiwgbm9kZVR5cGUsIGtleVBhdGgpIHtcbiAgICAgIHZhciBzdHlsZSA9IF9yZWYuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgcGFkZGluZ1RvcDogJzAuMjVlbScsXG4gICAgICAgICAgcGFkZGluZ1JpZ2h0OiAwLFxuICAgICAgICAgIG1hcmdpbkxlZnQ6ICcwLjg3NWVtJyxcbiAgICAgICAgICBXZWJraXRVc2VyU2VsZWN0OiAndGV4dCcsXG4gICAgICAgICAgTW96VXNlclNlbGVjdDogJ3RleHQnLFxuICAgICAgICAgIHdvcmRXcmFwOiAnYnJlYWstd29yZCcsXG4gICAgICAgICAgcGFkZGluZ0xlZnQ6IGtleVBhdGgubGVuZ3RoID4gMSA/ICcyLjEyNWVtJyA6ICcxLjI1ZW0nLFxuICAgICAgICAgIHRleHRJbmRlbnQ6ICctMC41ZW0nLFxuICAgICAgICAgIHdvcmRCcmVhazogJ2JyZWFrLWFsbCdcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSxcbiAgICBsYWJlbDoge1xuICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICBjb2xvcjogY29sb3JzLkxBQkVMX0NPTE9SXG4gICAgfSxcbiAgICB2YWx1ZUxhYmVsOiB7XG4gICAgICBtYXJnaW46ICcwIDAuNWVtIDAgMCdcbiAgICB9LFxuICAgIHZhbHVlVGV4dDogZnVuY3Rpb24gdmFsdWVUZXh0KF9yZWYyLCBub2RlVHlwZSkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjIuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgY29sb3I6IHZhbHVlQ29sb3JNYXAoY29sb3JzKVtub2RlVHlwZV1cbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSxcbiAgICBpdGVtUmFuZ2U6IGZ1bmN0aW9uIGl0ZW1SYW5nZShzdHlsaW5nLCBleHBhbmRlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBwYWRkaW5nVG9wOiBleHBhbmRlZCA/IDAgOiAnMC4yNWVtJyxcbiAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgICBjb2xvcjogY29sb3JzLkxBQkVMX0NPTE9SXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcbiAgICBhcnJvdzogZnVuY3Rpb24gYXJyb3coX3JlZjMsIG5vZGVUeXBlLCBleHBhbmRlZCkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjMuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgbWFyZ2luTGVmdDogMCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAnMTUwbXMnLFxuICAgICAgICAgIFdlYmtpdFRyYW5zaXRpb246ICcxNTBtcycsXG4gICAgICAgICAgTW96VHJhbnNpdGlvbjogJzE1MG1zJyxcbiAgICAgICAgICBXZWJraXRUcmFuc2Zvcm06IGV4cGFuZGVkID8gJ3JvdGF0ZVooOTBkZWcpJyA6ICdyb3RhdGVaKDBkZWcpJyxcbiAgICAgICAgICBNb3pUcmFuc2Zvcm06IGV4cGFuZGVkID8gJ3JvdGF0ZVooOTBkZWcpJyA6ICdyb3RhdGVaKDBkZWcpJyxcbiAgICAgICAgICB0cmFuc2Zvcm06IGV4cGFuZGVkID8gJ3JvdGF0ZVooOTBkZWcpJyA6ICdyb3RhdGVaKDBkZWcpJyxcbiAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW46ICc0NSUgNTAlJyxcbiAgICAgICAgICBXZWJraXRUcmFuc2Zvcm1PcmlnaW46ICc0NSUgNTAlJyxcbiAgICAgICAgICBNb3pUcmFuc2Zvcm1PcmlnaW46ICc0NSUgNTAlJyxcbiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICBsaW5lSGVpZ2h0OiAnMS4xZW0nLFxuICAgICAgICAgIGZvbnRTaXplOiAnMC43NWVtJ1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9LFxuICAgIGFycm93Q29udGFpbmVyOiBmdW5jdGlvbiBhcnJvd0NvbnRhaW5lcihfcmVmNCwgYXJyb3dTdHlsZSkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjQuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgICAgcGFkZGluZ1JpZ2h0OiAnMC41ZW0nLFxuICAgICAgICAgIHBhZGRpbmdMZWZ0OiBhcnJvd1N0eWxlID09PSAnZG91YmxlJyA/ICcxZW0nIDogMCxcbiAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9LFxuICAgIGFycm93U2lnbjoge1xuICAgICAgY29sb3I6IGNvbG9ycy5BUlJPV19DT0xPUlxuICAgIH0sXG4gICAgYXJyb3dTaWduSW5uZXI6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdG9wOiAwLFxuICAgICAgbGVmdDogJy0wLjRlbSdcbiAgICB9LFxuICAgIG5lc3RlZE5vZGU6IGZ1bmN0aW9uIG5lc3RlZE5vZGUoX3JlZjUsIGtleVBhdGgsIG5vZGVUeXBlLCBleHBhbmRlZCwgZXhwYW5kYWJsZSkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjUuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgICAgcGFkZGluZ1RvcDogJzAuMjVlbScsXG4gICAgICAgICAgbWFyZ2luTGVmdDoga2V5UGF0aC5sZW5ndGggPiAxID8gJzAuODc1ZW0nIDogMCxcbiAgICAgICAgICBwYWRkaW5nTGVmdDogIWV4cGFuZGFibGUgPyAnMS4xMjVlbScgOiAwXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0sXG4gICAgcm9vdE5vZGU6IHtcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBtYXJnaW46IDBcbiAgICB9LFxuICAgIG5lc3RlZE5vZGVMYWJlbDogZnVuY3Rpb24gbmVzdGVkTm9kZUxhYmVsKF9yZWY2LCBrZXlQYXRoLCBub2RlVHlwZSwgZXhwYW5kZWQsIGV4cGFuZGFibGUpIHtcbiAgICAgIHZhciBzdHlsZSA9IF9yZWY2LnN0eWxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCB7fSwge1xuICAgICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgIFdlYmtpdFVzZXJTZWxlY3Q6IGV4cGFuZGFibGUgPyAnaW5oZXJpdCcgOiAndGV4dCcsXG4gICAgICAgICAgTW96VXNlclNlbGVjdDogZXhwYW5kYWJsZSA/ICdpbmhlcml0JyA6ICd0ZXh0JyxcbiAgICAgICAgICBjdXJzb3I6IGV4cGFuZGFibGUgPyAncG9pbnRlcicgOiAnZGVmYXVsdCdcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSxcbiAgICBuZXN0ZWROb2RlSXRlbVN0cmluZzogZnVuY3Rpb24gbmVzdGVkTm9kZUl0ZW1TdHJpbmcoX3JlZjcsIGtleVBhdGgsIG5vZGVUeXBlLCBleHBhbmRlZCkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjcuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgcGFkZGluZ0xlZnQ6ICcwLjVlbScsXG4gICAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCcsXG4gICAgICAgICAgY29sb3I6IGV4cGFuZGVkID8gY29sb3JzLklURU1fU1RSSU5HX0VYUEFOREVEX0NPTE9SIDogY29sb3JzLklURU1fU1RSSU5HX0NPTE9SXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0sXG4gICAgbmVzdGVkTm9kZUl0ZW1UeXBlOiB7XG4gICAgICBtYXJnaW5MZWZ0OiAnMC4zZW0nLFxuICAgICAgbWFyZ2luUmlnaHQ6ICcwLjNlbSdcbiAgICB9LFxuICAgIG5lc3RlZE5vZGVDaGlsZHJlbjogZnVuY3Rpb24gbmVzdGVkTm9kZUNoaWxkcmVuKF9yZWY4LCBub2RlVHlwZSwgZXhwYW5kZWQpIHtcbiAgICAgIHZhciBzdHlsZSA9IF9yZWY4LnN0eWxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCB7fSwge1xuICAgICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICAgIGxpc3RTdHlsZTogJ25vbmUnLFxuICAgICAgICAgIGRpc3BsYXk6IGV4cGFuZGVkID8gJ2Jsb2NrJyA6ICdub25lJ1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9LFxuICAgIHJvb3ROb2RlQ2hpbGRyZW46IHtcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBtYXJnaW46IDAsXG4gICAgICBsaXN0U3R5bGU6ICdub25lJ1xuICAgIH1cbiAgfTtcbn07XG5cbnZhciBjcmVhdGVTdHlsaW5nRnJvbVRoZW1lID0gY3JlYXRlU3R5bGluZyhnZXREZWZhdWx0VGhlbWVTdHlsaW5nLCB7XG4gIGRlZmF1bHRCYXNlMTY6IHNvbGFyaXplZFxufSk7XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVTdHlsaW5nRnJvbVRoZW1lOyIsImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIjtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0ID0gdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0gfHwgb1tcIkBAaXRlcmF0b3JcIl07IGlmICghaXQpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gaXQuY2FsbChvKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdC5yZXR1cm4gIT0gbnVsbCkgaXQucmV0dXJuKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBnZXRMZW5ndGgodHlwZSwgY29sbGVjdGlvbikge1xuICBpZiAodHlwZSA9PT0gJ09iamVjdCcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhjb2xsZWN0aW9uKS5sZW5ndGg7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0FycmF5Jykge1xuICAgIHJldHVybiBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiBJbmZpbml0eTtcbn1cblxuZnVuY3Rpb24gaXNJdGVyYWJsZU1hcChjb2xsZWN0aW9uKSB7XG4gIHJldHVybiB0eXBlb2YgY29sbGVjdGlvbi5zZXQgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGdldEVudHJpZXModHlwZSwgY29sbGVjdGlvbiwgc29ydE9iamVjdEtleXMpIHtcbiAgdmFyIGZyb20gPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IDA7XG4gIHZhciB0byA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogSW5maW5pdHk7XG4gIHZhciByZXM7XG5cbiAgaWYgKHR5cGUgPT09ICdPYmplY3QnKSB7XG4gICAgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjb2xsZWN0aW9uKTtcblxuICAgIGlmIChzb3J0T2JqZWN0S2V5cykge1xuICAgICAga2V5cy5zb3J0KHNvcnRPYmplY3RLZXlzID09PSB0cnVlID8gdW5kZWZpbmVkIDogc29ydE9iamVjdEtleXMpO1xuICAgIH1cblxuICAgIGtleXMgPSBrZXlzLnNsaWNlKGZyb20sIHRvICsgMSk7XG4gICAgcmVzID0ge1xuICAgICAgZW50cmllczoga2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIHZhbHVlOiBjb2xsZWN0aW9uW2tleV1cbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnQXJyYXknKSB7XG4gICAgcmVzID0ge1xuICAgICAgZW50cmllczogY29sbGVjdGlvbi5zbGljZShmcm9tLCB0byArIDEpLm1hcChmdW5jdGlvbiAodmFsLCBpZHgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBrZXk6IGlkeCArIGZyb20sXG4gICAgICAgICAgdmFsdWU6IHZhbFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHZhciBpZHggPSAwO1xuICAgIHZhciBlbnRyaWVzID0gW107XG4gICAgdmFyIGRvbmUgPSB0cnVlO1xuICAgIHZhciBpc01hcCA9IGlzSXRlcmFibGVNYXAoY29sbGVjdGlvbik7XG5cbiAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoY29sbGVjdGlvbiksXG4gICAgICAgIF9zdGVwO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBpdGVtID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgaWYgKGlkeCA+IHRvKSB7XG4gICAgICAgICAgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyb20gPD0gaWR4KSB7XG4gICAgICAgICAgaWYgKGlzTWFwICYmIEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbVswXSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGl0ZW1bMF0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5OiBpdGVtWzBdLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtWzFdXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiW2VudHJ5IFwiLmNvbmNhdChpZHgsIFwiXVwiKSxcbiAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgJ1trZXldJzogaXRlbVswXSxcbiAgICAgICAgICAgICAgICAgICdbdmFsdWVdJzogaXRlbVsxXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgICAgICAgIGtleTogaWR4LFxuICAgICAgICAgICAgICB2YWx1ZTogaXRlbVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWR4Kys7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfaXRlcmF0b3IuZigpO1xuICAgIH1cblxuICAgIHJlcyA9IHtcbiAgICAgIGhhc01vcmU6ICFkb25lLFxuICAgICAgZW50cmllczogZW50cmllc1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBnZXRSYW5nZXMoZnJvbSwgdG8sIGxpbWl0KSB7XG4gIHZhciByYW5nZXMgPSBbXTtcblxuICB3aGlsZSAodG8gLSBmcm9tID4gbGltaXQgKiBsaW1pdCkge1xuICAgIGxpbWl0ID0gbGltaXQgKiBsaW1pdDtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSBmcm9tOyBpIDw9IHRvOyBpICs9IGxpbWl0KSB7XG4gICAgcmFuZ2VzLnB1c2goe1xuICAgICAgZnJvbTogaSxcbiAgICAgIHRvOiBNYXRoLm1pbih0bywgaSArIGxpbWl0IC0gMSlcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByYW5nZXM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbGxlY3Rpb25FbnRyaWVzKHR5cGUsIGNvbGxlY3Rpb24sIHNvcnRPYmplY3RLZXlzLCBsaW1pdCkge1xuICB2YXIgZnJvbSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogMDtcbiAgdmFyIHRvID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiBJbmZpbml0eTtcbiAgdmFyIGdldEVudHJpZXNCb3VuZCA9IGdldEVudHJpZXMuYmluZChudWxsLCB0eXBlLCBjb2xsZWN0aW9uLCBzb3J0T2JqZWN0S2V5cyk7XG5cbiAgaWYgKCFsaW1pdCkge1xuICAgIHJldHVybiBnZXRFbnRyaWVzQm91bmQoKS5lbnRyaWVzO1xuICB9XG5cbiAgdmFyIGlzU3Vic2V0ID0gdG8gPCBJbmZpbml0eTtcbiAgdmFyIGxlbmd0aCA9IE1hdGgubWluKHRvIC0gZnJvbSwgZ2V0TGVuZ3RoKHR5cGUsIGNvbGxlY3Rpb24pKTtcblxuICBpZiAodHlwZSAhPT0gJ0l0ZXJhYmxlJykge1xuICAgIGlmIChsZW5ndGggPD0gbGltaXQgfHwgbGltaXQgPCA3KSB7XG4gICAgICByZXR1cm4gZ2V0RW50cmllc0JvdW5kKGZyb20sIHRvKS5lbnRyaWVzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAobGVuZ3RoIDw9IGxpbWl0ICYmICFpc1N1YnNldCkge1xuICAgICAgcmV0dXJuIGdldEVudHJpZXNCb3VuZChmcm9tLCB0bykuZW50cmllcztcbiAgICB9XG4gIH1cblxuICB2YXIgbGltaXRlZEVudHJpZXM7XG5cbiAgaWYgKHR5cGUgPT09ICdJdGVyYWJsZScpIHtcbiAgICB2YXIgX2dldEVudHJpZXNCb3VuZCA9IGdldEVudHJpZXNCb3VuZChmcm9tLCBmcm9tICsgbGltaXQgLSAxKSxcbiAgICAgICAgaGFzTW9yZSA9IF9nZXRFbnRyaWVzQm91bmQuaGFzTW9yZSxcbiAgICAgICAgZW50cmllcyA9IF9nZXRFbnRyaWVzQm91bmQuZW50cmllcztcblxuICAgIGxpbWl0ZWRFbnRyaWVzID0gaGFzTW9yZSA/IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoZW50cmllcyksIF90b0NvbnN1bWFibGVBcnJheShnZXRSYW5nZXMoZnJvbSArIGxpbWl0LCBmcm9tICsgMiAqIGxpbWl0IC0gMSwgbGltaXQpKSkgOiBlbnRyaWVzO1xuICB9IGVsc2Uge1xuICAgIGxpbWl0ZWRFbnRyaWVzID0gaXNTdWJzZXQgPyBnZXRSYW5nZXMoZnJvbSwgdG8sIGxpbWl0KSA6IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoZ2V0RW50cmllc0JvdW5kKDAsIGxpbWl0IC0gNSkuZW50cmllcyksIF90b0NvbnN1bWFibGVBcnJheShnZXRSYW5nZXMobGltaXQgLSA0LCBsZW5ndGggLSA1LCBsaW1pdCkpLCBfdG9Db25zdW1hYmxlQXJyYXkoZ2V0RW50cmllc0JvdW5kKGxlbmd0aCAtIDQsIGxlbmd0aCAtIDEpLmVudHJpZXMpKTtcbiAgfVxuXG4gIHJldHVybiBsaW1pdGVkRW50cmllcztcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiZGF0YVwiLCBcImtleVBhdGhcIiwgXCJwb3N0cHJvY2Vzc1ZhbHVlXCIsIFwiaGlkZVJvb3RcIiwgXCJ0aGVtZVwiLCBcImludmVydFRoZW1lXCJdO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuLy8gRVM2ICsgaW5saW5lIHN0eWxlIHBvcnQgb2YgSlNPTlZpZXdlciBodHRwczovL2JpdGJ1Y2tldC5vcmcvZGF2ZXZlZGRlci9yZWFjdC1qc29uLXZpZXdlci9cbi8vIGFsbCBjcmVkaXRzIGFuZCBvcmlnaW5hbCBjb2RlIHRvIHRoZSBhdXRob3Jcbi8vIERhdmUgVmVkZGVyIDx2ZWRkZXJtYXRpY0BnbWFpbC5jb20+IGh0dHA6Ly93d3cuZXNraW1vc3B5LmNvbS9cbi8vIHBvcnQgYnkgRGFuaWVsZSBaYW5ub3R0aSBodHRwOi8vd3d3LmdpdGh1Yi5jb20vZHphbm5vdHRpIDxkemFubm90dGlAbWUuY29tPlxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgSlNPTk5vZGUgZnJvbSAnLi9KU09OTm9kZSc7XG5pbXBvcnQgY3JlYXRlU3R5bGluZ0Zyb21UaGVtZSBmcm9tICcuL2NyZWF0ZVN0eWxpbmdGcm9tVGhlbWUnO1xuaW1wb3J0IHsgaW52ZXJ0VGhlbWUgfSBmcm9tICdyZWFjdC1iYXNlMTYtc3R5bGluZyc7XG5cbnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbnZhciBleHBhbmRSb290Tm9kZSA9IGZ1bmN0aW9uIGV4cGFuZFJvb3ROb2RlKGtleVBhdGgsIGRhdGEsIGxldmVsKSB7XG4gIHJldHVybiBsZXZlbCA9PT0gMDtcbn07XG5cbnZhciBkZWZhdWx0SXRlbVN0cmluZyA9IGZ1bmN0aW9uIGRlZmF1bHRJdGVtU3RyaW5nKHR5cGUsIGRhdGEsIGl0ZW1UeXBlLCBpdGVtU3RyaW5nKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgaXRlbVR5cGUsIFwiIFwiLCBpdGVtU3RyaW5nKTtcbn07XG5cbnZhciBkZWZhdWx0TGFiZWxSZW5kZXJlciA9IGZ1bmN0aW9uIGRlZmF1bHRMYWJlbFJlbmRlcmVyKF9yZWYpIHtcbiAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMSksXG4gICAgICBsYWJlbCA9IF9yZWYyWzBdO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgbGFiZWwsIFwiOlwiKTtcbn07XG5cbnZhciBub0N1c3RvbU5vZGUgPSBmdW5jdGlvbiBub0N1c3RvbU5vZGUoKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmZ1bmN0aW9uIGNoZWNrTGVnYWN5VGhlbWluZyh0aGVtZSwgcHJvcHMpIHtcbiAgdmFyIGRlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kc01hcCA9IHtcbiAgICBnZXRBcnJvd1N0eWxlOiAnYXJyb3cnLFxuICAgIGdldExpc3RTdHlsZTogJ25lc3RlZE5vZGVDaGlsZHJlbicsXG4gICAgZ2V0SXRlbVN0cmluZ1N0eWxlOiAnbmVzdGVkTm9kZUl0ZW1TdHJpbmcnLFxuICAgIGdldExhYmVsU3R5bGU6ICdsYWJlbCcsXG4gICAgZ2V0VmFsdWVTdHlsZTogJ3ZhbHVlVGV4dCdcbiAgfTtcbiAgdmFyIGRlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kcyA9IE9iamVjdC5rZXlzKGRlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kc01hcCkuZmlsdGVyKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIHByb3BzW25hbWVdO1xuICB9KTtcblxuICBpZiAoZGVwcmVjYXRlZFN0eWxpbmdNZXRob2RzLmxlbmd0aCA+IDApIHtcbiAgICBpZiAodHlwZW9mIHRoZW1lID09PSAnc3RyaW5nJykge1xuICAgICAgdGhlbWUgPSB7XG4gICAgICAgIGV4dGVuZDogdGhlbWVcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoZW1lID0gX29iamVjdFNwcmVhZCh7fSwgdGhlbWUpO1xuICAgIH1cblxuICAgIGRlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihcIlN0eWxpbmcgbWV0aG9kIFxcXCJcIi5jb25jYXQobmFtZSwgXCJcXFwiIGlzIGRlcHJlY2F0ZWQsIHVzZSBcXFwidGhlbWVcXFwiIHByb3BlcnR5IGluc3RlYWRcIikpO1xuXG4gICAgICB0aGVtZVtkZXByZWNhdGVkU3R5bGluZ01ldGhvZHNNYXBbbmFtZV1dID0gZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICAgIHZhciBzdHlsZSA9IF9yZWYzLnN0eWxlO1xuXG4gICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCBwcm9wc1tuYW1lXS5hcHBseShwcm9wcywgYXJncykpXG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRoZW1lO1xufVxuXG5mdW5jdGlvbiBnZXRTdGF0ZUZyb21Qcm9wcyhwcm9wcykge1xuICB2YXIgdGhlbWUgPSBjaGVja0xlZ2FjeVRoZW1pbmcocHJvcHMudGhlbWUsIHByb3BzKTtcblxuICBpZiAocHJvcHMuaW52ZXJ0VGhlbWUpIHtcbiAgICB0aGVtZSA9IGludmVydFRoZW1lKHRoZW1lKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3R5bGluZzogY3JlYXRlU3R5bGluZ0Zyb21UaGVtZSh0aGVtZSlcbiAgfTtcbn1cblxuZXhwb3J0IHZhciBKU09OVHJlZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoSlNPTlRyZWUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoSlNPTlRyZWUpO1xuXG4gIGZ1bmN0aW9uIEpTT05UcmVlKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEpTT05UcmVlKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuICAgIF90aGlzLnN0YXRlID0gZ2V0U3RhdGVGcm9tUHJvcHMocHJvcHMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhKU09OVHJlZSwgW3tcbiAgICBrZXk6IFwiVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKFsndGhlbWUnLCAnaW52ZXJ0VGhlbWUnXS5maW5kKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIHJldHVybiBuZXh0UHJvcHNba10gIT09IF90aGlzMi5wcm9wc1trXTtcbiAgICAgIH0pKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoZ2V0U3RhdGVGcm9tUHJvcHMobmV4dFByb3BzKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3VsZENvbXBvbmVudFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgcmV0dXJuICEhT2JqZWN0LmtleXMobmV4dFByb3BzKS5maW5kKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIHJldHVybiBrID09PSAna2V5UGF0aCcgPyBuZXh0UHJvcHNba10uam9pbignLycpICE9PSBfdGhpczMucHJvcHNba10uam9pbignLycpIDogbmV4dFByb3BzW2tdICE9PSBfdGhpczMucHJvcHNba107XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRwcm9wcy5kYXRhLFxuICAgICAgICAgIGtleVBhdGggPSBfdGhpcyRwcm9wcy5rZXlQYXRoLFxuICAgICAgICAgIHBvc3Rwcm9jZXNzVmFsdWUgPSBfdGhpcyRwcm9wcy5wb3N0cHJvY2Vzc1ZhbHVlLFxuICAgICAgICAgIGhpZGVSb290ID0gX3RoaXMkcHJvcHMuaGlkZVJvb3QsXG4gICAgICAgICAgdGhlbWUgPSBfdGhpcyRwcm9wcy50aGVtZSxcbiAgICAgICAgICBfID0gX3RoaXMkcHJvcHMuaW52ZXJ0VGhlbWUsXG4gICAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfdGhpcyRwcm9wcywgX2V4Y2x1ZGVkKTtcblxuICAgICAgdmFyIHN0eWxpbmcgPSB0aGlzLnN0YXRlLnN0eWxpbmc7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBzdHlsaW5nKCd0cmVlJyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05Ob2RlLCBfZXh0ZW5kcyh7fSwgX29iamVjdFNwcmVhZCh7XG4gICAgICAgIHBvc3Rwcm9jZXNzVmFsdWU6IHBvc3Rwcm9jZXNzVmFsdWUsXG4gICAgICAgIGhpZGVSb290OiBoaWRlUm9vdCxcbiAgICAgICAgc3R5bGluZzogc3R5bGluZ1xuICAgICAgfSwgcmVzdCksIHtcbiAgICAgICAga2V5UGF0aDogaGlkZVJvb3QgPyBbXSA6IGtleVBhdGgsXG4gICAgICAgIHZhbHVlOiBwb3N0cHJvY2Vzc1ZhbHVlKHZhbHVlKVxuICAgICAgfSkpKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSlNPTlRyZWU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbl9kZWZpbmVQcm9wZXJ0eShKU09OVHJlZSwgXCJwcm9wVHlwZXNcIiwge1xuICBkYXRhOiBQcm9wVHlwZXMuYW55LFxuICBoaWRlUm9vdDogUHJvcFR5cGVzLmJvb2wsXG4gIHRoZW1lOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub2JqZWN0LCBQcm9wVHlwZXMuc3RyaW5nXSksXG4gIGludmVydFRoZW1lOiBQcm9wVHlwZXMuYm9vbCxcbiAga2V5UGF0aDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pKSxcbiAgcG9zdHByb2Nlc3NWYWx1ZTogUHJvcFR5cGVzLmZ1bmMsXG4gIHNvcnRPYmplY3RLZXlzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgUHJvcFR5cGVzLmJvb2xdKVxufSk7XG5cbl9kZWZpbmVQcm9wZXJ0eShKU09OVHJlZSwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICBzaG91bGRFeHBhbmROb2RlOiBleHBhbmRSb290Tm9kZSxcbiAgaGlkZVJvb3Q6IGZhbHNlLFxuICBrZXlQYXRoOiBbJ3Jvb3QnXSxcbiAgZ2V0SXRlbVN0cmluZzogZGVmYXVsdEl0ZW1TdHJpbmcsXG4gIGxhYmVsUmVuZGVyZXI6IGRlZmF1bHRMYWJlbFJlbmRlcmVyLFxuICB2YWx1ZVJlbmRlcmVyOiBpZGVudGl0eSxcbiAgcG9zdHByb2Nlc3NWYWx1ZTogaWRlbnRpdHksXG4gIGlzQ3VzdG9tTm9kZTogbm9DdXN0b21Ob2RlLFxuICBjb2xsZWN0aW9uTGltaXQ6IDUwLFxuICBpbnZlcnRUaGVtZTogdHJ1ZVxufSk7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb2JqVHlwZShvYmopIHtcbiAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKS5zbGljZSg4LCAtMSk7XG5cbiAgaWYgKHR5cGUgPT09ICdPYmplY3QnICYmIHR5cGVvZiBvYmpbU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiAnSXRlcmFibGUnO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09ICdDdXN0b20nICYmIG9iai5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ICYmIG9iaiBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgIC8vIEZvciBwcm9qZWN0cyBpbXBsZW1lbnRpbmcgb2JqZWN0cyBvdmVycmlkaW5nIGAucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ11gXG4gICAgcmV0dXJuICdPYmplY3QnO1xuICB9XG5cbiAgcmV0dXJuIHR5cGU7XG59IiwiZXhwb3J0IGRlZmF1bHQge1xuICBzY2hlbWU6ICdzb2xhcml6ZWQnLFxuICBhdXRob3I6ICdldGhhbiBzY2hvb25vdmVyIChodHRwOi8vZXRoYW5zY2hvb25vdmVyLmNvbS9zb2xhcml6ZWQpJyxcbiAgYmFzZTAwOiAnIzAwMmIzNicsXG4gIGJhc2UwMTogJyMwNzM2NDInLFxuICBiYXNlMDI6ICcjNTg2ZTc1JyxcbiAgYmFzZTAzOiAnIzY1N2I4MycsXG4gIGJhc2UwNDogJyM4Mzk0OTYnLFxuICBiYXNlMDU6ICcjOTNhMWExJyxcbiAgYmFzZTA2OiAnI2VlZThkNScsXG4gIGJhc2UwNzogJyNmZGY2ZTMnLFxuICBiYXNlMDg6ICcjZGMzMjJmJyxcbiAgYmFzZTA5OiAnI2NiNGIxNicsXG4gIGJhc2UwQTogJyNiNTg5MDAnLFxuICBiYXNlMEI6ICcjODU5OTAwJyxcbiAgYmFzZTBDOiAnIzJhYTE5OCcsXG4gIGJhc2UwRDogJyMyNjhiZDInLFxuICBiYXNlMEU6ICcjNmM3MWM0JyxcbiAgYmFzZTBGOiAnI2QzMzY4Midcbn07IiwiaW1wb3J0IGludmFyaWFudCBmcm9tICdpbnZhcmlhbnQnO1xuaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnLi91dGlscy9pc0Z1bmN0aW9uJztcbmltcG9ydCBpZGVudGl0eSBmcm9tICcuL3V0aWxzL2lkZW50aXR5JztcbmltcG9ydCBpc051bGwgZnJvbSAnLi91dGlscy9pc051bGwnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlQWN0aW9uKHR5cGUsIHBheWxvYWRDcmVhdG9yLCBtZXRhQ3JlYXRvcikge1xuICBpZiAocGF5bG9hZENyZWF0b3IgPT09IHZvaWQgMCkge1xuICAgIHBheWxvYWRDcmVhdG9yID0gaWRlbnRpdHk7XG4gIH1cblxuICBpbnZhcmlhbnQoaXNGdW5jdGlvbihwYXlsb2FkQ3JlYXRvcikgfHwgaXNOdWxsKHBheWxvYWRDcmVhdG9yKSwgJ0V4cGVjdGVkIHBheWxvYWRDcmVhdG9yIHRvIGJlIGEgZnVuY3Rpb24sIHVuZGVmaW5lZCBvciBudWxsJyk7XG4gIHZhciBmaW5hbFBheWxvYWRDcmVhdG9yID0gaXNOdWxsKHBheWxvYWRDcmVhdG9yKSB8fCBwYXlsb2FkQ3JlYXRvciA9PT0gaWRlbnRpdHkgPyBpZGVudGl0eSA6IGZ1bmN0aW9uIChoZWFkKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWQgaW5zdGFuY2VvZiBFcnJvciA/IGhlYWQgOiBwYXlsb2FkQ3JlYXRvci5hcHBseSh2b2lkIDAsIFtoZWFkXS5jb25jYXQoYXJncykpO1xuICB9O1xuICB2YXIgaGFzTWV0YSA9IGlzRnVuY3Rpb24obWV0YUNyZWF0b3IpO1xuICB2YXIgdHlwZVN0cmluZyA9IHR5cGUudG9TdHJpbmcoKTtcblxuICB2YXIgYWN0aW9uQ3JlYXRvciA9IGZ1bmN0aW9uIGFjdGlvbkNyZWF0b3IoKSB7XG4gICAgdmFyIHBheWxvYWQgPSBmaW5hbFBheWxvYWRDcmVhdG9yLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICB2YXIgYWN0aW9uID0ge1xuICAgICAgdHlwZTogdHlwZVxuICAgIH07XG5cbiAgICBpZiAocGF5bG9hZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBhY3Rpb24uZXJyb3IgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwYXlsb2FkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFjdGlvbi5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICB9XG5cbiAgICBpZiAoaGFzTWV0YSkge1xuICAgICAgYWN0aW9uLm1ldGEgPSBtZXRhQ3JlYXRvci5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvbjtcbiAgfTtcblxuICBhY3Rpb25DcmVhdG9yLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0eXBlU3RyaW5nO1xuICB9O1xuXG4gIHJldHVybiBhY3Rpb25DcmVhdG9yO1xufSIsImV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufSk7IiwiZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufSk7IiwiZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG59KTsiLCIvKiogQSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBwb3RlbnRpYWwgXCJleHRyYSBhcmd1bWVudFwiIHZhbHVlIHRvIGJlIGluamVjdGVkIGxhdGVyLFxyXG4gKiBhbmQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgdGh1bmsgbWlkZGxld2FyZSB0aGF0IHVzZXMgdGhhdCB2YWx1ZVxyXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVRodW5rTWlkZGxld2FyZShleHRyYUFyZ3VtZW50KSB7XG4gIC8vIFN0YW5kYXJkIFJlZHV4IG1pZGRsZXdhcmUgZGVmaW5pdGlvbiBwYXR0ZXJuOlxuICAvLyBTZWU6IGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI3dyaXRpbmctY3VzdG9tLW1pZGRsZXdhcmVcbiAgdmFyIG1pZGRsZXdhcmUgPSBmdW5jdGlvbiBtaWRkbGV3YXJlKF9yZWYpIHtcbiAgICB2YXIgZGlzcGF0Y2ggPSBfcmVmLmRpc3BhdGNoLFxuICAgICAgICBnZXRTdGF0ZSA9IF9yZWYuZ2V0U3RhdGU7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChuZXh0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICAvLyBUaGUgdGh1bmsgbWlkZGxld2FyZSBsb29rcyBmb3IgYW55IGZ1bmN0aW9ucyB0aGF0IHdlcmUgcGFzc2VkIHRvIGBzdG9yZS5kaXNwYXRjaGAuXG4gICAgICAgIC8vIElmIHRoaXMgXCJhY3Rpb25cIiBpcyByZWFsbHkgYSBmdW5jdGlvbiwgY2FsbCBpdCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuXG4gICAgICAgIGlmICh0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gSW5qZWN0IHRoZSBzdG9yZSdzIGBkaXNwYXRjaGAgYW5kIGBnZXRTdGF0ZWAgbWV0aG9kcywgYXMgd2VsbCBhcyBhbnkgXCJleHRyYSBhcmdcIlxuICAgICAgICAgIHJldHVybiBhY3Rpb24oZGlzcGF0Y2gsIGdldFN0YXRlLCBleHRyYUFyZ3VtZW50KTtcbiAgICAgICAgfSAvLyBPdGhlcndpc2UsIHBhc3MgdGhlIGFjdGlvbiBkb3duIHRoZSBtaWRkbGV3YXJlIGNoYWluIGFzIHVzdWFsXG5cblxuICAgICAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xuXG4gIHJldHVybiBtaWRkbGV3YXJlO1xufVxuXG52YXIgdGh1bmsgPSBjcmVhdGVUaHVua01pZGRsZXdhcmUoKTsgLy8gQXR0YWNoIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIHNvIHVzZXJzIGNhbiBjcmVhdGUgYSBjdXN0b21pemVkIHZlcnNpb25cbi8vIHdpdGggd2hhdGV2ZXIgXCJleHRyYSBhcmdcIiB0aGV5IHdhbnQgdG8gaW5qZWN0IGludG8gdGhlaXIgdGh1bmtzXG5cbnRodW5rLndpdGhFeHRyYUFyZ3VtZW50ID0gY3JlYXRlVGh1bmtNaWRkbGV3YXJlO1xuZXhwb3J0IGRlZmF1bHQgdGh1bms7IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMic7XG5cbi8qKlxuICogQWRhcHRlZCBmcm9tIFJlYWN0OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2hhcmVkL2Zvcm1hdFByb2RFcnJvck1lc3NhZ2UuanNcbiAqXG4gKiBEbyBub3QgcmVxdWlyZSB0aGlzIG1vZHVsZSBkaXJlY3RseSEgVXNlIG5vcm1hbCB0aHJvdyBlcnJvciBjYWxscy4gVGhlc2UgbWVzc2FnZXMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGVycm9yIGNvZGVzXG4gKiBkdXJpbmcgYnVpbGQuXG4gKiBAcGFyYW0ge251bWJlcn0gY29kZVxuICovXG5mdW5jdGlvbiBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKGNvZGUpIHtcbiAgcmV0dXJuIFwiTWluaWZpZWQgUmVkdXggZXJyb3IgI1wiICsgY29kZSArIFwiOyB2aXNpdCBodHRwczovL3JlZHV4LmpzLm9yZy9FcnJvcnM/Y29kZT1cIiArIGNvZGUgKyBcIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciBcIiArICd1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzLiAnO1xufVxuXG4vLyBJbmxpbmVkIHZlcnNpb24gb2YgdGhlIGBzeW1ib2wtb2JzZXJ2YWJsZWAgcG9seWZpbGxcbnZhciAkJG9ic2VydmFibGUgPSAoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wub2JzZXJ2YWJsZSB8fCAnQEBvYnNlcnZhYmxlJztcbn0pKCk7XG5cbi8qKlxuICogVGhlc2UgYXJlIHByaXZhdGUgYWN0aW9uIHR5cGVzIHJlc2VydmVkIGJ5IFJlZHV4LlxuICogRm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHlvdSBtdXN0IHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAqIElmIHRoZSBjdXJyZW50IHN0YXRlIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLlxuICogRG8gbm90IHJlZmVyZW5jZSB0aGVzZSBhY3Rpb24gdHlwZXMgZGlyZWN0bHkgaW4geW91ciBjb2RlLlxuICovXG52YXIgcmFuZG9tU3RyaW5nID0gZnVuY3Rpb24gcmFuZG9tU3RyaW5nKCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJyk7XG59O1xuXG52YXIgQWN0aW9uVHlwZXMgPSB7XG4gIElOSVQ6IFwiQEByZWR1eC9JTklUXCIgKyByYW5kb21TdHJpbmcoKSxcbiAgUkVQTEFDRTogXCJAQHJlZHV4L1JFUExBQ0VcIiArIHJhbmRvbVN0cmluZygpLFxuICBQUk9CRV9VTktOT1dOX0FDVElPTjogZnVuY3Rpb24gUFJPQkVfVU5LTk9XTl9BQ1RJT04oKSB7XG4gICAgcmV0dXJuIFwiQEByZWR1eC9QUk9CRV9VTktOT1dOX0FDVElPTlwiICsgcmFuZG9tU3RyaW5nKCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXJndW1lbnQgYXBwZWFycyB0byBiZSBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICB2YXIgcHJvdG8gPSBvYmo7XG5cbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykgIT09IG51bGwpIHtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IHByb3RvO1xufVxuXG4vLyBJbmxpbmVkIC8gc2hvcnRlbmVkIHZlcnNpb24gb2YgYGtpbmRPZmAgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9raW5kLW9mXG5mdW5jdGlvbiBtaW5pS2luZE9mKHZhbCkge1xuICBpZiAodmFsID09PSB2b2lkIDApIHJldHVybiAndW5kZWZpbmVkJztcbiAgaWYgKHZhbCA9PT0gbnVsbCkgcmV0dXJuICdudWxsJztcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzeW1ib2wnOlxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gJ2FycmF5JztcbiAgaWYgKGlzRGF0ZSh2YWwpKSByZXR1cm4gJ2RhdGUnO1xuICBpZiAoaXNFcnJvcih2YWwpKSByZXR1cm4gJ2Vycm9yJztcbiAgdmFyIGNvbnN0cnVjdG9yTmFtZSA9IGN0b3JOYW1lKHZhbCk7XG5cbiAgc3dpdGNoIChjb25zdHJ1Y3Rvck5hbWUpIHtcbiAgICBjYXNlICdTeW1ib2wnOlxuICAgIGNhc2UgJ1Byb21pc2UnOlxuICAgIGNhc2UgJ1dlYWtNYXAnOlxuICAgIGNhc2UgJ1dlYWtTZXQnOlxuICAgIGNhc2UgJ01hcCc6XG4gICAgY2FzZSAnU2V0JzpcbiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvck5hbWU7XG4gIH0gLy8gb3RoZXJcblxuXG4gIHJldHVybiB0eXBlLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccy9nLCAnJyk7XG59XG5cbmZ1bmN0aW9uIGN0b3JOYW1lKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbC5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyA/IHZhbC5jb25zdHJ1Y3Rvci5uYW1lIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNFcnJvcih2YWwpIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiB2YWwubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgdmFsLmNvbnN0cnVjdG9yICYmIHR5cGVvZiB2YWwuY29uc3RydWN0b3Iuc3RhY2tUcmFjZUxpbWl0ID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNEYXRlKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiB0eXBlb2YgdmFsLnRvRGF0ZVN0cmluZyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsLmdldERhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbC5zZXREYXRlID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBraW5kT2YodmFsKSB7XG4gIHZhciB0eXBlT2ZWYWwgPSB0eXBlb2YgdmFsO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdHlwZU9mVmFsID0gbWluaUtpbmRPZih2YWwpO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVPZlZhbDtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICpcbiAqICoqV2UgcmVjb21tZW5kIHVzaW5nIHRoZSBgY29uZmlndXJlU3RvcmVgIG1ldGhvZFxuICogb2YgdGhlIGBAcmVkdXhqcy90b29sa2l0YCBwYWNrYWdlKiosIHdoaWNoIHJlcGxhY2VzIGBjcmVhdGVTdG9yZWAuXG4gKlxuICogUmVkdXggVG9vbGtpdCBpcyBvdXIgcmVjb21tZW5kZWQgYXBwcm9hY2ggZm9yIHdyaXRpbmcgUmVkdXggbG9naWMgdG9kYXksXG4gKiBpbmNsdWRpbmcgc3RvcmUgc2V0dXAsIHJlZHVjZXJzLCBkYXRhIGZldGNoaW5nLCBhbmQgbW9yZS5cbiAqXG4gKiAqKkZvciBtb3JlIGRldGFpbHMsIHBsZWFzZSByZWFkIHRoaXMgUmVkdXggZG9jcyBwYWdlOioqXG4gKiAqKmh0dHBzOi8vcmVkdXguanMub3JnL2ludHJvZHVjdGlvbi93aHktcnRrLWlzLXJlZHV4LXRvZGF5KipcbiAqXG4gKiBgY29uZmlndXJlU3RvcmVgIGZyb20gUmVkdXggVG9vbGtpdCBpcyBhbiBpbXByb3ZlZCB2ZXJzaW9uIG9mIGBjcmVhdGVTdG9yZWAgdGhhdFxuICogc2ltcGxpZmllcyBzZXR1cCBhbmQgaGVscHMgYXZvaWQgY29tbW9uIGJ1Z3MuXG4gKlxuICogWW91IHNob3VsZCBub3QgYmUgdXNpbmcgdGhlIGByZWR1eGAgY29yZSBwYWNrYWdlIGJ5IGl0c2VsZiB0b2RheSwgZXhjZXB0IGZvciBsZWFybmluZyBwdXJwb3Nlcy5cbiAqIFRoZSBgY3JlYXRlU3RvcmVgIG1ldGhvZCBmcm9tIHRoZSBjb3JlIGByZWR1eGAgcGFja2FnZSB3aWxsIG5vdCBiZSByZW1vdmVkLCBidXQgd2UgZW5jb3VyYWdlXG4gKiBhbGwgdXNlcnMgdG8gbWlncmF0ZSB0byB1c2luZyBSZWR1eCBUb29sa2l0IGZvciBhbGwgUmVkdXggY29kZS5cbiAqXG4gKiBJZiB5b3Ugd2FudCB0byB1c2UgYGNyZWF0ZVN0b3JlYCB3aXRob3V0IHRoaXMgdmlzdWFsIGRlcHJlY2F0aW9uIHdhcm5pbmcsIHVzZVxuICogdGhlIGBsZWdhY3lfY3JlYXRlU3RvcmVgIGltcG9ydCBpbnN0ZWFkOlxuICpcbiAqIGBpbXBvcnQgeyBsZWdhY3lfY3JlYXRlU3RvcmUgYXMgY3JlYXRlU3RvcmV9IGZyb20gJ3JlZHV4J2BcbiAqXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKSB7XG4gIHZhciBfcmVmMjtcblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZW5oYW5jZXIgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDApIDogJ0l0IGxvb2tzIGxpa2UgeW91IGFyZSBwYXNzaW5nIHNldmVyYWwgc3RvcmUgZW5oYW5jZXJzIHRvICcgKyAnY3JlYXRlU3RvcmUoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkLCBjb21wb3NlIHRoZW0gJyArICd0b2dldGhlciB0byBhIHNpbmdsZSBmdW5jdGlvbi4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI2NyZWF0aW5nLWEtc3RvcmUtd2l0aC1lbmhhbmNlcnMgZm9yIGFuIGV4YW1wbGUuJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBlbmhhbmNlciA9IHByZWxvYWRlZFN0YXRlO1xuICAgIHByZWxvYWRlZFN0YXRlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxKSA6IFwiRXhwZWN0ZWQgdGhlIGVuaGFuY2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YoZW5oYW5jZXIpICsgXCInXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlcihjcmVhdGVTdG9yZSkocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMikgOiBcIkV4cGVjdGVkIHRoZSByb290IHJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihyZWR1Y2VyKSArIFwiJ1wiKTtcbiAgfVxuXG4gIHZhciBjdXJyZW50UmVkdWNlciA9IHJlZHVjZXI7XG4gIHZhciBjdXJyZW50U3RhdGUgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgdmFyIGN1cnJlbnRMaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzO1xuICB2YXIgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICAvKipcbiAgICogVGhpcyBtYWtlcyBhIHNoYWxsb3cgY29weSBvZiBjdXJyZW50TGlzdGVuZXJzIHNvIHdlIGNhbiB1c2VcbiAgICogbmV4dExpc3RlbmVycyBhcyBhIHRlbXBvcmFyeSBsaXN0IHdoaWxlIGRpc3BhdGNoaW5nLlxuICAgKlxuICAgKiBUaGlzIHByZXZlbnRzIGFueSBidWdzIGFyb3VuZCBjb25zdW1lcnMgY2FsbGluZ1xuICAgKiBzdWJzY3JpYmUvdW5zdWJzY3JpYmUgaW4gdGhlIG1pZGRsZSBvZiBhIGRpc3BhdGNoLlxuICAgKi9cblxuICBmdW5jdGlvbiBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCkge1xuICAgIGlmIChuZXh0TGlzdGVuZXJzID09PSBjdXJyZW50TGlzdGVuZXJzKSB7XG4gICAgICBuZXh0TGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycy5zbGljZSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVhZHMgdGhlIHN0YXRlIHRyZWUgbWFuYWdlZCBieSB0aGUgc3RvcmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHthbnl9IFRoZSBjdXJyZW50IHN0YXRlIHRyZWUgb2YgeW91ciBhcHBsaWNhdGlvbi5cbiAgICovXG5cblxuICBmdW5jdGlvbiBnZXRTdGF0ZSgpIHtcbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMykgOiAnWW91IG1heSBub3QgY2FsbCBzdG9yZS5nZXRTdGF0ZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdUaGUgcmVkdWNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCB0aGUgc3RhdGUgYXMgYW4gYXJndW1lbnQuICcgKyAnUGFzcyBpdCBkb3duIGZyb20gdGhlIHRvcCByZWR1Y2VyIGluc3RlYWQgb2YgcmVhZGluZyBpdCBmcm9tIHRoZSBzdG9yZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudFN0YXRlO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgY2hhbmdlIGxpc3RlbmVyLiBJdCB3aWxsIGJlIGNhbGxlZCBhbnkgdGltZSBhbiBhY3Rpb24gaXMgZGlzcGF0Y2hlZCxcbiAgICogYW5kIHNvbWUgcGFydCBvZiB0aGUgc3RhdGUgdHJlZSBtYXkgcG90ZW50aWFsbHkgaGF2ZSBjaGFuZ2VkLiBZb3UgbWF5IHRoZW5cbiAgICogY2FsbCBgZ2V0U3RhdGUoKWAgdG8gcmVhZCB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAqXG4gICAqIFlvdSBtYXkgY2FsbCBgZGlzcGF0Y2goKWAgZnJvbSBhIGNoYW5nZSBsaXN0ZW5lciwgd2l0aCB0aGUgZm9sbG93aW5nXG4gICAqIGNhdmVhdHM6XG4gICAqXG4gICAqIDEuIFRoZSBzdWJzY3JpcHRpb25zIGFyZSBzbmFwc2hvdHRlZCBqdXN0IGJlZm9yZSBldmVyeSBgZGlzcGF0Y2goKWAgY2FsbC5cbiAgICogSWYgeW91IHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSB3aGlsZSB0aGUgbGlzdGVuZXJzIGFyZSBiZWluZyBpbnZva2VkLCB0aGlzXG4gICAqIHdpbGwgbm90IGhhdmUgYW55IGVmZmVjdCBvbiB0aGUgYGRpc3BhdGNoKClgIHRoYXQgaXMgY3VycmVudGx5IGluIHByb2dyZXNzLlxuICAgKiBIb3dldmVyLCB0aGUgbmV4dCBgZGlzcGF0Y2goKWAgY2FsbCwgd2hldGhlciBuZXN0ZWQgb3Igbm90LCB3aWxsIHVzZSBhIG1vcmVcbiAgICogcmVjZW50IHNuYXBzaG90IG9mIHRoZSBzdWJzY3JpcHRpb24gbGlzdC5cbiAgICpcbiAgICogMi4gVGhlIGxpc3RlbmVyIHNob3VsZCBub3QgZXhwZWN0IHRvIHNlZSBhbGwgc3RhdGUgY2hhbmdlcywgYXMgdGhlIHN0YXRlXG4gICAqIG1pZ2h0IGhhdmUgYmVlbiB1cGRhdGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyBhIG5lc3RlZCBgZGlzcGF0Y2goKWAgYmVmb3JlXG4gICAqIHRoZSBsaXN0ZW5lciBpcyBjYWxsZWQuIEl0IGlzLCBob3dldmVyLCBndWFyYW50ZWVkIHRoYXQgYWxsIHN1YnNjcmliZXJzXG4gICAqIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBgZGlzcGF0Y2goKWAgc3RhcnRlZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBsYXRlc3RcbiAgICogc3RhdGUgYnkgdGhlIHRpbWUgaXQgZXhpdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIEEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBvbiBldmVyeSBkaXNwYXRjaC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIHJlbW92ZSB0aGlzIGNoYW5nZSBsaXN0ZW5lci5cbiAgICovXG5cblxuICBmdW5jdGlvbiBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0KSA6IFwiRXhwZWN0ZWQgdGhlIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YobGlzdGVuZXIpICsgXCInXCIpO1xuICAgIH1cblxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg1KSA6ICdZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLnN1YnNjcmliZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdJZiB5b3Ugd291bGQgbGlrZSB0byBiZSBub3RpZmllZCBhZnRlciB0aGUgc3RvcmUgaGFzIGJlZW4gdXBkYXRlZCwgc3Vic2NyaWJlIGZyb20gYSAnICsgJ2NvbXBvbmVudCBhbmQgaW52b2tlIHN0b3JlLmdldFN0YXRlKCkgaW4gdGhlIGNhbGxiYWNrIHRvIGFjY2VzcyB0aGUgbGF0ZXN0IHN0YXRlLiAnICsgJ1NlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGkvc3RvcmUjc3Vic2NyaWJlbGlzdGVuZXIgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgICB9XG5cbiAgICB2YXIgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgbmV4dExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICBpZiAoIWlzU3Vic2NyaWJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDYpIDogJ1lvdSBtYXkgbm90IHVuc3Vic2NyaWJlIGZyb20gYSBzdG9yZSBsaXN0ZW5lciB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS9zdG9yZSNzdWJzY3JpYmVsaXN0ZW5lciBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICAgICAgfVxuXG4gICAgICBpc1N1YnNjcmliZWQgPSBmYWxzZTtcbiAgICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICAgIHZhciBpbmRleCA9IG5leHRMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICBuZXh0TGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICBjdXJyZW50TGlzdGVuZXJzID0gbnVsbDtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFuIGFjdGlvbi4gSXQgaXMgdGhlIG9ubHkgd2F5IHRvIHRyaWdnZXIgYSBzdGF0ZSBjaGFuZ2UuXG4gICAqXG4gICAqIFRoZSBgcmVkdWNlcmAgZnVuY3Rpb24sIHVzZWQgdG8gY3JlYXRlIHRoZSBzdG9yZSwgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGVcbiAgICogY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgZ2l2ZW4gYGFjdGlvbmAuIEl0cyByZXR1cm4gdmFsdWUgd2lsbFxuICAgKiBiZSBjb25zaWRlcmVkIHRoZSAqKm5leHQqKiBzdGF0ZSBvZiB0aGUgdHJlZSwgYW5kIHRoZSBjaGFuZ2UgbGlzdGVuZXJzXG4gICAqIHdpbGwgYmUgbm90aWZpZWQuXG4gICAqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgcGxhaW4gb2JqZWN0IGFjdGlvbnMuIElmIHlvdSB3YW50IHRvXG4gICAqIGRpc3BhdGNoIGEgUHJvbWlzZSwgYW4gT2JzZXJ2YWJsZSwgYSB0aHVuaywgb3Igc29tZXRoaW5nIGVsc2UsIHlvdSBuZWVkIHRvXG4gICAqIHdyYXAgeW91ciBzdG9yZSBjcmVhdGluZyBmdW5jdGlvbiBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIG1pZGRsZXdhcmUuIEZvclxuICAgKiBleGFtcGxlLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UuIEV2ZW4gdGhlXG4gICAqIG1pZGRsZXdhcmUgd2lsbCBldmVudHVhbGx5IGRpc3BhdGNoIHBsYWluIG9iamVjdCBhY3Rpb25zIHVzaW5nIHRoaXMgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIEEgcGxhaW4gb2JqZWN0IHJlcHJlc2VudGluZyDigJx3aGF0IGNoYW5nZWTigJ0uIEl0IGlzXG4gICAqIGEgZ29vZCBpZGVhIHRvIGtlZXAgYWN0aW9ucyBzZXJpYWxpemFibGUgc28geW91IGNhbiByZWNvcmQgYW5kIHJlcGxheSB1c2VyXG4gICAqIHNlc3Npb25zLCBvciB1c2UgdGhlIHRpbWUgdHJhdmVsbGluZyBgcmVkdXgtZGV2dG9vbHNgLiBBbiBhY3Rpb24gbXVzdCBoYXZlXG4gICAqIGEgYHR5cGVgIHByb3BlcnR5IHdoaWNoIG1heSBub3QgYmUgYHVuZGVmaW5lZGAuIEl0IGlzIGEgZ29vZCBpZGVhIHRvIHVzZVxuICAgKiBzdHJpbmcgY29uc3RhbnRzIGZvciBhY3Rpb24gdHlwZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEZvciBjb252ZW5pZW5jZSwgdGhlIHNhbWUgYWN0aW9uIG9iamVjdCB5b3UgZGlzcGF0Y2hlZC5cbiAgICpcbiAgICogTm90ZSB0aGF0LCBpZiB5b3UgdXNlIGEgY3VzdG9tIG1pZGRsZXdhcmUsIGl0IG1heSB3cmFwIGBkaXNwYXRjaCgpYCB0b1xuICAgKiByZXR1cm4gc29tZXRoaW5nIGVsc2UgKGZvciBleGFtcGxlLCBhIFByb21pc2UgeW91IGNhbiBhd2FpdCkuXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDcpIDogXCJBY3Rpb25zIG11c3QgYmUgcGxhaW4gb2JqZWN0cy4gSW5zdGVhZCwgdGhlIGFjdHVhbCB0eXBlIHdhczogJ1wiICsga2luZE9mKGFjdGlvbikgKyBcIicuIFlvdSBtYXkgbmVlZCB0byBhZGQgbWlkZGxld2FyZSB0byB5b3VyIHN0b3JlIHNldHVwIHRvIGhhbmRsZSBkaXNwYXRjaGluZyBvdGhlciB2YWx1ZXMsIHN1Y2ggYXMgJ3JlZHV4LXRodW5rJyB0byBoYW5kbGUgZGlzcGF0Y2hpbmcgZnVuY3Rpb25zLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTQtc3RvcmUjbWlkZGxld2FyZSBhbmQgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTYtYXN5bmMtbG9naWMjdXNpbmctdGhlLXJlZHV4LXRodW5rLW1pZGRsZXdhcmUgZm9yIGV4YW1wbGVzLlwiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFjdGlvbi50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOCkgOiAnQWN0aW9ucyBtYXkgbm90IGhhdmUgYW4gdW5kZWZpbmVkIFwidHlwZVwiIHByb3BlcnR5LiBZb3UgbWF5IGhhdmUgbWlzc3BlbGxlZCBhbiBhY3Rpb24gdHlwZSBzdHJpbmcgY29uc3RhbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDkpIDogJ1JlZHVjZXJzIG1heSBub3QgZGlzcGF0Y2ggYWN0aW9ucy4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IHRydWU7XG4gICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50UmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgbGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycyA9IG5leHRMaXN0ZW5lcnM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgICAgbGlzdGVuZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGUgcmVkdWNlciBjdXJyZW50bHkgdXNlZCBieSB0aGUgc3RvcmUgdG8gY2FsY3VsYXRlIHRoZSBzdGF0ZS5cbiAgICpcbiAgICogWW91IG1pZ2h0IG5lZWQgdGhpcyBpZiB5b3VyIGFwcCBpbXBsZW1lbnRzIGNvZGUgc3BsaXR0aW5nIGFuZCB5b3Ugd2FudCB0b1xuICAgKiBsb2FkIHNvbWUgb2YgdGhlIHJlZHVjZXJzIGR5bmFtaWNhbGx5LiBZb3UgbWlnaHQgYWxzbyBuZWVkIHRoaXMgaWYgeW91XG4gICAqIGltcGxlbWVudCBhIGhvdCByZWxvYWRpbmcgbWVjaGFuaXNtIGZvciBSZWR1eC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dFJlZHVjZXIgVGhlIHJlZHVjZXIgZm9yIHRoZSBzdG9yZSB0byB1c2UgaW5zdGVhZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gcmVwbGFjZVJlZHVjZXIobmV4dFJlZHVjZXIpIHtcbiAgICBpZiAodHlwZW9mIG5leHRSZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMCkgOiBcIkV4cGVjdGVkIHRoZSBuZXh0UmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJ1wiICsga2luZE9mKG5leHRSZWR1Y2VyKSk7XG4gICAgfVxuXG4gICAgY3VycmVudFJlZHVjZXIgPSBuZXh0UmVkdWNlcjsgLy8gVGhpcyBhY3Rpb24gaGFzIGEgc2ltaWxpYXIgZWZmZWN0IHRvIEFjdGlvblR5cGVzLklOSVQuXG4gICAgLy8gQW55IHJlZHVjZXJzIHRoYXQgZXhpc3RlZCBpbiBib3RoIHRoZSBuZXcgYW5kIG9sZCByb290UmVkdWNlclxuICAgIC8vIHdpbGwgcmVjZWl2ZSB0aGUgcHJldmlvdXMgc3RhdGUuIFRoaXMgZWZmZWN0aXZlbHkgcG9wdWxhdGVzXG4gICAgLy8gdGhlIG5ldyBzdGF0ZSB0cmVlIHdpdGggYW55IHJlbGV2YW50IGRhdGEgZnJvbSB0aGUgb2xkIG9uZS5cblxuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLlJFUExBQ0VcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogSW50ZXJvcGVyYWJpbGl0eSBwb2ludCBmb3Igb2JzZXJ2YWJsZS9yZWFjdGl2ZSBsaWJyYXJpZXMuXG4gICAqIEByZXR1cm5zIHtvYnNlcnZhYmxlfSBBIG1pbmltYWwgb2JzZXJ2YWJsZSBvZiBzdGF0ZSBjaGFuZ2VzLlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBvYnNlcnZhYmxlIHByb3Bvc2FsOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYnNlcnZhYmxlXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZSgpIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIHZhciBvdXRlclN1YnNjcmliZSA9IHN1YnNjcmliZTtcbiAgICByZXR1cm4gX3JlZiA9IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG1pbmltYWwgb2JzZXJ2YWJsZSBzdWJzY3JpcHRpb24gbWV0aG9kLlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVyIEFueSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBvYnNlcnZlci5cbiAgICAgICAqIFRoZSBvYnNlcnZlciBvYmplY3Qgc2hvdWxkIGhhdmUgYSBgbmV4dGAgbWV0aG9kLlxuICAgICAgICogQHJldHVybnMge3N1YnNjcmlwdGlvbn0gQW4gb2JqZWN0IHdpdGggYW4gYHVuc3Vic2NyaWJlYCBtZXRob2QgdGhhdCBjYW5cbiAgICAgICAqIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgdGhlIG9ic2VydmFibGUgZnJvbSB0aGUgc3RvcmUsIGFuZCBwcmV2ZW50IGZ1cnRoZXJcbiAgICAgICAqIGVtaXNzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBvYnNlcnZhYmxlLlxuICAgICAgICovXG4gICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgICAgICBpZiAodHlwZW9mIG9ic2VydmVyICE9PSAnb2JqZWN0JyB8fCBvYnNlcnZlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDExKSA6IFwiRXhwZWN0ZWQgdGhlIG9ic2VydmVyIHRvIGJlIGFuIG9iamVjdC4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihvYnNlcnZlcikgKyBcIidcIik7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvYnNlcnZlU3RhdGUoKSB7XG4gICAgICAgICAgaWYgKG9ic2VydmVyLm5leHQpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZVN0YXRlKCk7XG4gICAgICAgIHZhciB1bnN1YnNjcmliZSA9IG91dGVyU3Vic2NyaWJlKG9ic2VydmVTdGF0ZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdW5zdWJzY3JpYmU6IHVuc3Vic2NyaWJlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwgX3JlZlskJG9ic2VydmFibGVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgX3JlZjtcbiAgfSAvLyBXaGVuIGEgc3RvcmUgaXMgY3JlYXRlZCwgYW4gXCJJTklUXCIgYWN0aW9uIGlzIGRpc3BhdGNoZWQgc28gdGhhdCBldmVyeVxuICAvLyByZWR1Y2VyIHJldHVybnMgdGhlaXIgaW5pdGlhbCBzdGF0ZS4gVGhpcyBlZmZlY3RpdmVseSBwb3B1bGF0ZXNcbiAgLy8gdGhlIGluaXRpYWwgc3RhdGUgdHJlZS5cblxuXG4gIGRpc3BhdGNoKHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5JTklUXG4gIH0pO1xuICByZXR1cm4gX3JlZjIgPSB7XG4gICAgZGlzcGF0Y2g6IGRpc3BhdGNoLFxuICAgIHN1YnNjcmliZTogc3Vic2NyaWJlLFxuICAgIGdldFN0YXRlOiBnZXRTdGF0ZSxcbiAgICByZXBsYWNlUmVkdWNlcjogcmVwbGFjZVJlZHVjZXJcbiAgfSwgX3JlZjJbJCRvYnNlcnZhYmxlXSA9IG9ic2VydmFibGUsIF9yZWYyO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgUmVkdXggc3RvcmUgdGhhdCBob2xkcyB0aGUgc3RhdGUgdHJlZS5cbiAqXG4gKiAqKldlIHJlY29tbWVuZCB1c2luZyBgY29uZmlndXJlU3RvcmVgIGZyb20gdGhlXG4gKiBgQHJlZHV4anMvdG9vbGtpdGAgcGFja2FnZSoqLCB3aGljaCByZXBsYWNlcyBgY3JlYXRlU3RvcmVgOlxuICogKipodHRwczovL3JlZHV4LmpzLm9yZy9pbnRyb2R1Y3Rpb24vd2h5LXJ0ay1pcy1yZWR1eC10b2RheSoqXG4gKlxuICogVGhlIG9ubHkgd2F5IHRvIGNoYW5nZSB0aGUgZGF0YSBpbiB0aGUgc3RvcmUgaXMgdG8gY2FsbCBgZGlzcGF0Y2goKWAgb24gaXQuXG4gKlxuICogVGhlcmUgc2hvdWxkIG9ubHkgYmUgYSBzaW5nbGUgc3RvcmUgaW4geW91ciBhcHAuIFRvIHNwZWNpZnkgaG93IGRpZmZlcmVudFxuICogcGFydHMgb2YgdGhlIHN0YXRlIHRyZWUgcmVzcG9uZCB0byBhY3Rpb25zLCB5b3UgbWF5IGNvbWJpbmUgc2V2ZXJhbCByZWR1Y2Vyc1xuICogaW50byBhIHNpbmdsZSByZWR1Y2VyIGZ1bmN0aW9uIGJ5IHVzaW5nIGBjb21iaW5lUmVkdWNlcnNgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZHVjZXIgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG5leHQgc3RhdGUgdHJlZSwgZ2l2ZW5cbiAqIHRoZSBjdXJyZW50IHN0YXRlIHRyZWUgYW5kIHRoZSBhY3Rpb24gdG8gaGFuZGxlLlxuICpcbiAqIEBwYXJhbSB7YW55fSBbcHJlbG9hZGVkU3RhdGVdIFRoZSBpbml0aWFsIHN0YXRlLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gaHlkcmF0ZSB0aGUgc3RhdGUgZnJvbSB0aGUgc2VydmVyIGluIHVuaXZlcnNhbCBhcHBzLCBvciB0byByZXN0b3JlIGFcbiAqIHByZXZpb3VzbHkgc2VyaWFsaXplZCB1c2VyIHNlc3Npb24uXG4gKiBJZiB5b3UgdXNlIGBjb21iaW5lUmVkdWNlcnNgIHRvIHByb2R1Y2UgdGhlIHJvb3QgcmVkdWNlciBmdW5jdGlvbiwgdGhpcyBtdXN0IGJlXG4gKiBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZSBhcyBgY29tYmluZVJlZHVjZXJzYCBrZXlzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtlbmhhbmNlcl0gVGhlIHN0b3JlIGVuaGFuY2VyLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gZW5oYW5jZSB0aGUgc3RvcmUgd2l0aCB0aGlyZC1wYXJ0eSBjYXBhYmlsaXRpZXMgc3VjaCBhcyBtaWRkbGV3YXJlLFxuICogdGltZSB0cmF2ZWwsIHBlcnNpc3RlbmNlLCBldGMuIFRoZSBvbmx5IHN0b3JlIGVuaGFuY2VyIHRoYXQgc2hpcHMgd2l0aCBSZWR1eFxuICogaXMgYGFwcGx5TWlkZGxld2FyZSgpYC5cbiAqXG4gKiBAcmV0dXJucyB7U3RvcmV9IEEgUmVkdXggc3RvcmUgdGhhdCBsZXRzIHlvdSByZWFkIHRoZSBzdGF0ZSwgZGlzcGF0Y2ggYWN0aW9uc1xuICogYW5kIHN1YnNjcmliZSB0byBjaGFuZ2VzLlxuICovXG5cbnZhciBsZWdhY3lfY3JlYXRlU3RvcmUgPSBjcmVhdGVTdG9yZTtcblxuLyoqXG4gKiBQcmludHMgYSB3YXJuaW5nIGluIHRoZSBjb25zb2xlIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuXG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IGlmIHlvdSBlbmFibGVcbiAgICAvLyBcImJyZWFrIG9uIGFsbCBleGNlcHRpb25zXCIgaW4geW91ciBjb25zb2xlLFxuICAgIC8vIGl0IHdvdWxkIHBhdXNlIHRoZSBleGVjdXRpb24gYXQgdGhpcyBsaW5lLlxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfSBjYXRjaCAoZSkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuXG59XG5cbmZ1bmN0aW9uIGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2UoaW5wdXRTdGF0ZSwgcmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKSB7XG4gIHZhciByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgdmFyIGFyZ3VtZW50TmFtZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZXMuSU5JVCA/ICdwcmVsb2FkZWRTdGF0ZSBhcmd1bWVudCBwYXNzZWQgdG8gY3JlYXRlU3RvcmUnIDogJ3ByZXZpb3VzIHN0YXRlIHJlY2VpdmVkIGJ5IHRoZSByZWR1Y2VyJztcblxuICBpZiAocmVkdWNlcktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdTdG9yZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgcmVkdWNlci4gTWFrZSBzdXJlIHRoZSBhcmd1bWVudCBwYXNzZWQgJyArICd0byBjb21iaW5lUmVkdWNlcnMgaXMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgcmVkdWNlcnMuJztcbiAgfVxuXG4gIGlmICghaXNQbGFpbk9iamVjdChpbnB1dFN0YXRlKSkge1xuICAgIHJldHVybiBcIlRoZSBcIiArIGFyZ3VtZW50TmFtZSArIFwiIGhhcyB1bmV4cGVjdGVkIHR5cGUgb2YgXFxcIlwiICsga2luZE9mKGlucHV0U3RhdGUpICsgXCJcXFwiLiBFeHBlY3RlZCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIFwiICsgKFwia2V5czogXFxcIlwiICsgcmVkdWNlcktleXMuam9pbignXCIsIFwiJykgKyBcIlxcXCJcIik7XG4gIH1cblxuICB2YXIgdW5leHBlY3RlZEtleXMgPSBPYmplY3Qua2V5cyhpbnB1dFN0YXRlKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhcmVkdWNlcnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhdW5leHBlY3RlZEtleUNhY2hlW2tleV07XG4gIH0pO1xuICB1bmV4cGVjdGVkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB1bmV4cGVjdGVkS2V5Q2FjaGVba2V5XSA9IHRydWU7XG4gIH0pO1xuICBpZiAoYWN0aW9uICYmIGFjdGlvbi50eXBlID09PSBBY3Rpb25UeXBlcy5SRVBMQUNFKSByZXR1cm47XG5cbiAgaWYgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gXCJVbmV4cGVjdGVkIFwiICsgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDEgPyAna2V5cycgOiAna2V5JykgKyBcIiBcIiArIChcIlxcXCJcIiArIHVuZXhwZWN0ZWRLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiIGZvdW5kIGluIFwiICsgYXJndW1lbnROYW1lICsgXCIuIFwiKSArIFwiRXhwZWN0ZWQgdG8gZmluZCBvbmUgb2YgdGhlIGtub3duIHJlZHVjZXIga2V5cyBpbnN0ZWFkOiBcIiArIChcIlxcXCJcIiArIHJlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiLiBVbmV4cGVjdGVkIGtleXMgd2lsbCBiZSBpZ25vcmVkLlwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRSZWR1Y2VyU2hhcGUocmVkdWNlcnMpIHtcbiAgT2JqZWN0LmtleXMocmVkdWNlcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciByZWR1Y2VyID0gcmVkdWNlcnNba2V5XTtcbiAgICB2YXIgaW5pdGlhbFN0YXRlID0gcmVkdWNlcih1bmRlZmluZWQsIHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLklOSVRcbiAgICB9KTtcblxuICAgIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTIpIDogXCJUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIiByZXR1cm5lZCB1bmRlZmluZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBcIiArIFwiSWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGUgcmVkdWNlciBpcyB1bmRlZmluZWQsIHlvdSBtdXN0IFwiICsgXCJleHBsaWNpdGx5IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IFwiICsgXCJub3QgYmUgdW5kZWZpbmVkLiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBzZXQgYSB2YWx1ZSBmb3IgdGhpcyByZWR1Y2VyLCBcIiArIFwieW91IGNhbiB1c2UgbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5cIik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZWR1Y2VyKHVuZGVmaW5lZCwge1xuICAgICAgdHlwZTogQWN0aW9uVHlwZXMuUFJPQkVfVU5LTk9XTl9BQ1RJT04oKVxuICAgIH0pID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTMpIDogXCJUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIiByZXR1cm5lZCB1bmRlZmluZWQgd2hlbiBwcm9iZWQgd2l0aCBhIHJhbmRvbSB0eXBlLiBcIiArIChcIkRvbid0IHRyeSB0byBoYW5kbGUgJ1wiICsgQWN0aW9uVHlwZXMuSU5JVCArIFwiJyBvciBvdGhlciBhY3Rpb25zIGluIFxcXCJyZWR1eC8qXFxcIiBcIikgKyBcIm5hbWVzcGFjZS4gVGhleSBhcmUgY29uc2lkZXJlZCBwcml2YXRlLiBJbnN0ZWFkLCB5b3UgbXVzdCByZXR1cm4gdGhlIFwiICsgXCJjdXJyZW50IHN0YXRlIGZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB1bmxlc3MgaXQgaXMgdW5kZWZpbmVkLCBcIiArIFwiaW4gd2hpY2ggY2FzZSB5b3UgbXVzdCByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIFwiICsgXCJhY3Rpb24gdHlwZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IG5vdCBiZSB1bmRlZmluZWQsIGJ1dCBjYW4gYmUgbnVsbC5cIik7XG4gICAgfVxuICB9KTtcbn1cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgZGlmZmVyZW50IHJlZHVjZXIgZnVuY3Rpb25zLCBpbnRvIGEgc2luZ2xlXG4gKiByZWR1Y2VyIGZ1bmN0aW9uLiBJdCB3aWxsIGNhbGwgZXZlcnkgY2hpbGQgcmVkdWNlciwgYW5kIGdhdGhlciB0aGVpciByZXN1bHRzXG4gKiBpbnRvIGEgc2luZ2xlIHN0YXRlIG9iamVjdCwgd2hvc2Uga2V5cyBjb3JyZXNwb25kIHRvIHRoZSBrZXlzIG9mIHRoZSBwYXNzZWRcbiAqIHJlZHVjZXIgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWR1Y2VycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gZGlmZmVyZW50XG4gKiByZWR1Y2VyIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgY29tYmluZWQgaW50byBvbmUuIE9uZSBoYW5keSB3YXkgdG8gb2J0YWluXG4gKiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhcyByZWR1Y2Vyc2Agc3ludGF4LiBUaGUgcmVkdWNlcnMgbWF5IG5ldmVyIHJldHVyblxuICogdW5kZWZpbmVkIGZvciBhbnkgYWN0aW9uLiBJbnN0ZWFkLCB0aGV5IHNob3VsZCByZXR1cm4gdGhlaXIgaW5pdGlhbCBzdGF0ZVxuICogaWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGVtIHdhcyB1bmRlZmluZWQsIGFuZCB0aGUgY3VycmVudCBzdGF0ZSBmb3IgYW55XG4gKiB1bnJlY29nbml6ZWQgYWN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSByZWR1Y2VyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBldmVyeSByZWR1Y2VyIGluc2lkZSB0aGVcbiAqIHBhc3NlZCBvYmplY3QsIGFuZCBidWlsZHMgYSBzdGF0ZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2Vycykge1xuICB2YXIgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIHZhciBmaW5hbFJlZHVjZXJzID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSByZWR1Y2VyS2V5c1tpXTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHdhcm5pbmcoXCJObyByZWR1Y2VyIHByb3ZpZGVkIGZvciBrZXkgXFxcIlwiICsga2V5ICsgXCJcXFwiXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZmluYWxSZWR1Y2Vyc1trZXldID0gcmVkdWNlcnNba2V5XTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmluYWxSZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKGZpbmFsUmVkdWNlcnMpOyAvLyBUaGlzIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHdhcm4gYWJvdXQgdGhlIHNhbWVcbiAgLy8ga2V5cyBtdWx0aXBsZSB0aW1lcy5cblxuICB2YXIgdW5leHBlY3RlZEtleUNhY2hlO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlID0ge307XG4gIH1cblxuICB2YXIgc2hhcGVBc3NlcnRpb25FcnJvcjtcblxuICB0cnkge1xuICAgIGFzc2VydFJlZHVjZXJTaGFwZShmaW5hbFJlZHVjZXJzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNoYXBlQXNzZXJ0aW9uRXJyb3IgPSBlO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbWJpbmF0aW9uKHN0YXRlLCBhY3Rpb24pIHtcbiAgICBpZiAoc3RhdGUgPT09IHZvaWQgMCkge1xuICAgICAgc3RhdGUgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoc2hhcGVBc3NlcnRpb25FcnJvcikge1xuICAgICAgdGhyb3cgc2hhcGVBc3NlcnRpb25FcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHdhcm5pbmdNZXNzYWdlID0gZ2V0VW5leHBlY3RlZFN0YXRlU2hhcGVXYXJuaW5nTWVzc2FnZShzdGF0ZSwgZmluYWxSZWR1Y2VycywgYWN0aW9uLCB1bmV4cGVjdGVkS2V5Q2FjaGUpO1xuXG4gICAgICBpZiAod2FybmluZ01lc3NhZ2UpIHtcbiAgICAgICAgd2FybmluZyh3YXJuaW5nTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgbmV4dFN0YXRlID0ge307XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfa2V5ID0gZmluYWxSZWR1Y2VyS2V5c1tfaV07XG4gICAgICB2YXIgcmVkdWNlciA9IGZpbmFsUmVkdWNlcnNbX2tleV07XG4gICAgICB2YXIgcHJldmlvdXNTdGF0ZUZvcktleSA9IHN0YXRlW19rZXldO1xuICAgICAgdmFyIG5leHRTdGF0ZUZvcktleSA9IHJlZHVjZXIocHJldmlvdXNTdGF0ZUZvcktleSwgYWN0aW9uKTtcblxuICAgICAgaWYgKHR5cGVvZiBuZXh0U3RhdGVGb3JLZXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBhY3Rpb25UeXBlID0gYWN0aW9uICYmIGFjdGlvbi50eXBlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNCkgOiBcIldoZW4gY2FsbGVkIHdpdGggYW4gYWN0aW9uIG9mIHR5cGUgXCIgKyAoYWN0aW9uVHlwZSA/IFwiXFxcIlwiICsgU3RyaW5nKGFjdGlvblR5cGUpICsgXCJcXFwiXCIgOiAnKHVua25vd24gdHlwZSknKSArIFwiLCB0aGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIF9rZXkgKyBcIlxcXCIgcmV0dXJuZWQgdW5kZWZpbmVkLiBcIiArIFwiVG8gaWdub3JlIGFuIGFjdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIHByZXZpb3VzIHN0YXRlLiBcIiArIFwiSWYgeW91IHdhbnQgdGhpcyByZWR1Y2VyIHRvIGhvbGQgbm8gdmFsdWUsIHlvdSBjYW4gcmV0dXJuIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuXCIpO1xuICAgICAgfVxuXG4gICAgICBuZXh0U3RhdGVbX2tleV0gPSBuZXh0U3RhdGVGb3JLZXk7XG4gICAgICBoYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZCB8fCBuZXh0U3RhdGVGb3JLZXkgIT09IHByZXZpb3VzU3RhdGVGb3JLZXk7XG4gICAgfVxuXG4gICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKHN0YXRlKS5sZW5ndGg7XG4gICAgcmV0dXJuIGhhc0NoYW5nZWQgPyBuZXh0U3RhdGUgOiBzdGF0ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2goYWN0aW9uQ3JlYXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgYWN0aW9uIGNyZWF0b3JzLCBpbnRvIGFuIG9iamVjdCB3aXRoIHRoZVxuICogc2FtZSBrZXlzLCBidXQgd2l0aCBldmVyeSBmdW5jdGlvbiB3cmFwcGVkIGludG8gYSBgZGlzcGF0Y2hgIGNhbGwgc28gdGhleVxuICogbWF5IGJlIGludm9rZWQgZGlyZWN0bHkuIFRoaXMgaXMganVzdCBhIGNvbnZlbmllbmNlIG1ldGhvZCwgYXMgeW91IGNhbiBjYWxsXG4gKiBgc3RvcmUuZGlzcGF0Y2goTXlBY3Rpb25DcmVhdG9ycy5kb1NvbWV0aGluZygpKWAgeW91cnNlbGYganVzdCBmaW5lLlxuICpcbiAqIEZvciBjb252ZW5pZW5jZSwgeW91IGNhbiBhbHNvIHBhc3MgYW4gYWN0aW9uIGNyZWF0b3IgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LFxuICogYW5kIGdldCBhIGRpc3BhdGNoIHdyYXBwZWQgZnVuY3Rpb24gaW4gcmV0dXJuLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBhY3Rpb25DcmVhdG9ycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGFyZSBhY3Rpb25cbiAqIGNyZWF0b3IgZnVuY3Rpb25zLiBPbmUgaGFuZHkgd2F5IHRvIG9idGFpbiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhc2BcbiAqIHN5bnRheC4gWW91IG1heSBhbHNvIHBhc3MgYSBzaW5nbGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZGlzcGF0Y2ggVGhlIGBkaXNwYXRjaGAgZnVuY3Rpb24gYXZhaWxhYmxlIG9uIHlvdXIgUmVkdXhcbiAqIHN0b3JlLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbnxPYmplY3R9IFRoZSBvYmplY3QgbWltaWNraW5nIHRoZSBvcmlnaW5hbCBvYmplY3QsIGJ1dCB3aXRoXG4gKiBldmVyeSBhY3Rpb24gY3JlYXRvciB3cmFwcGVkIGludG8gdGhlIGBkaXNwYXRjaGAgY2FsbC4gSWYgeW91IHBhc3NlZCBhXG4gKiBmdW5jdGlvbiBhcyBgYWN0aW9uQ3JlYXRvcnNgLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYWxzbyBiZSBhIHNpbmdsZVxuICogZnVuY3Rpb24uXG4gKi9cblxuXG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKSB7XG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgIT09ICdvYmplY3QnIHx8IGFjdGlvbkNyZWF0b3JzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTYpIDogXCJiaW5kQWN0aW9uQ3JlYXRvcnMgZXhwZWN0ZWQgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24sIGJ1dCBpbnN0ZWFkIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YoYWN0aW9uQ3JlYXRvcnMpICsgXCInLiBcIiArIFwiRGlkIHlvdSB3cml0ZSBcXFwiaW1wb3J0IEFjdGlvbkNyZWF0b3JzIGZyb21cXFwiIGluc3RlYWQgb2YgXFxcImltcG9ydCAqIGFzIEFjdGlvbkNyZWF0b3JzIGZyb21cXFwiP1wiKTtcbiAgfVxuXG4gIHZhciBib3VuZEFjdGlvbkNyZWF0b3JzID0ge307XG5cbiAgZm9yICh2YXIga2V5IGluIGFjdGlvbkNyZWF0b3JzKSB7XG4gICAgdmFyIGFjdGlvbkNyZWF0b3IgPSBhY3Rpb25DcmVhdG9yc1trZXldO1xuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBib3VuZEFjdGlvbkNyZWF0b3JzW2tleV0gPSBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJvdW5kQWN0aW9uQ3JlYXRvcnM7XG59XG5cbi8qKlxuICogQ29tcG9zZXMgc2luZ2xlLWFyZ3VtZW50IGZ1bmN0aW9ucyBmcm9tIHJpZ2h0IHRvIGxlZnQuIFRoZSByaWdodG1vc3RcbiAqIGZ1bmN0aW9uIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cyBhcyBpdCBwcm92aWRlcyB0aGUgc2lnbmF0dXJlIGZvclxuICogdGhlIHJlc3VsdGluZyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gZnVuY3MgVGhlIGZ1bmN0aW9ucyB0byBjb21wb3NlLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIG9idGFpbmVkIGJ5IGNvbXBvc2luZyB0aGUgYXJndW1lbnQgZnVuY3Rpb25zXG4gKiBmcm9tIHJpZ2h0IHRvIGxlZnQuIEZvciBleGFtcGxlLCBjb21wb3NlKGYsIGcsIGgpIGlzIGlkZW50aWNhbCB0byBkb2luZ1xuICogKC4uLmFyZ3MpID0+IGYoZyhoKC4uLmFyZ3MpKSkuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2UoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBmdW5jcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBmdW5jc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgICAgcmV0dXJuIGFyZztcbiAgICB9O1xuICB9XG5cbiAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBmdW5jc1swXTtcbiAgfVxuXG4gIHJldHVybiBmdW5jcy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGEoYi5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cykpO1xuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdG9yZSBlbmhhbmNlciB0aGF0IGFwcGxpZXMgbWlkZGxld2FyZSB0byB0aGUgZGlzcGF0Y2ggbWV0aG9kXG4gKiBvZiB0aGUgUmVkdXggc3RvcmUuIFRoaXMgaXMgaGFuZHkgZm9yIGEgdmFyaWV0eSBvZiB0YXNrcywgc3VjaCBhcyBleHByZXNzaW5nXG4gKiBhc3luY2hyb25vdXMgYWN0aW9ucyBpbiBhIGNvbmNpc2UgbWFubmVyLCBvciBsb2dnaW5nIGV2ZXJ5IGFjdGlvbiBwYXlsb2FkLlxuICpcbiAqIFNlZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UgYXMgYW4gZXhhbXBsZSBvZiB0aGUgUmVkdXggbWlkZGxld2FyZS5cbiAqXG4gKiBCZWNhdXNlIG1pZGRsZXdhcmUgaXMgcG90ZW50aWFsbHkgYXN5bmNocm9ub3VzLCB0aGlzIHNob3VsZCBiZSB0aGUgZmlyc3RcbiAqIHN0b3JlIGVuaGFuY2VyIGluIHRoZSBjb21wb3NpdGlvbiBjaGFpbi5cbiAqXG4gKiBOb3RlIHRoYXQgZWFjaCBtaWRkbGV3YXJlIHdpbGwgYmUgZ2l2ZW4gdGhlIGBkaXNwYXRjaGAgYW5kIGBnZXRTdGF0ZWAgZnVuY3Rpb25zXG4gKiBhcyBuYW1lZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gbWlkZGxld2FyZXMgVGhlIG1pZGRsZXdhcmUgY2hhaW4gdG8gYmUgYXBwbGllZC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBzdG9yZSBlbmhhbmNlciBhcHBseWluZyB0aGUgbWlkZGxld2FyZS5cbiAqL1xuXG5mdW5jdGlvbiBhcHBseU1pZGRsZXdhcmUoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBtaWRkbGV3YXJlcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBtaWRkbGV3YXJlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoY3JlYXRlU3RvcmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0b3JlID0gY3JlYXRlU3RvcmUuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuXG4gICAgICB2YXIgX2Rpc3BhdGNoID0gZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE1KSA6ICdEaXNwYXRjaGluZyB3aGlsZSBjb25zdHJ1Y3RpbmcgeW91ciBtaWRkbGV3YXJlIGlzIG5vdCBhbGxvd2VkLiAnICsgJ090aGVyIG1pZGRsZXdhcmUgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gdGhpcyBkaXNwYXRjaC4nKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBtaWRkbGV3YXJlQVBJID0ge1xuICAgICAgICBnZXRTdGF0ZTogc3RvcmUuZ2V0U3RhdGUsXG4gICAgICAgIGRpc3BhdGNoOiBmdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgICAgICAgICByZXR1cm4gX2Rpc3BhdGNoLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBjaGFpbiA9IG1pZGRsZXdhcmVzLm1hcChmdW5jdGlvbiAobWlkZGxld2FyZSkge1xuICAgICAgICByZXR1cm4gbWlkZGxld2FyZShtaWRkbGV3YXJlQVBJKTtcbiAgICAgIH0pO1xuICAgICAgX2Rpc3BhdGNoID0gY29tcG9zZS5hcHBseSh2b2lkIDAsIGNoYWluKShzdG9yZS5kaXNwYXRjaCk7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdG9yZSksIHt9LCB7XG4gICAgICAgIGRpc3BhdGNoOiBfZGlzcGF0Y2hcbiAgICAgIH0pO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB7IEFjdGlvblR5cGVzIGFzIF9fRE9fTk9UX1VTRV9fQWN0aW9uVHlwZXMsIGFwcGx5TWlkZGxld2FyZSwgYmluZEFjdGlvbkNyZWF0b3JzLCBjb21iaW5lUmVkdWNlcnMsIGNvbXBvc2UsIGNyZWF0ZVN0b3JlLCBsZWdhY3lfY3JlYXRlU3RvcmUgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGlzQXJyYXlpc2ggPSByZXF1aXJlKCdpcy1hcnJheWlzaCcpO1xuXG52YXIgY29uY2F0ID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdDtcbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxudmFyIHN3aXp6bGUgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHN3aXp6bGUoYXJncykge1xuXHR2YXIgcmVzdWx0cyA9IFtdO1xuXG5cdGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcmdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0dmFyIGFyZyA9IGFyZ3NbaV07XG5cblx0XHRpZiAoaXNBcnJheWlzaChhcmcpKSB7XG5cdFx0XHQvLyBodHRwOi8vanNwZXJmLmNvbS9qYXZhc2NyaXB0LWFycmF5LWNvbmNhdC12cy1wdXNoLzk4XG5cdFx0XHRyZXN1bHRzID0gY29uY2F0LmNhbGwocmVzdWx0cywgc2xpY2UuY2FsbChhcmcpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0cy5wdXNoKGFyZyk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG5zd2l6emxlLndyYXAgPSBmdW5jdGlvbiAoZm4pIHtcblx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gZm4oc3dpenpsZShhcmd1bWVudHMpKTtcblx0fTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQXJyYXlpc2gob2JqKSB7XG5cdGlmICghb2JqIHx8IHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIG9iaiBpbnN0YW5jZW9mIEFycmF5IHx8IEFycmF5LmlzQXJyYXkob2JqKSB8fFxuXHRcdChvYmoubGVuZ3RoID49IDAgJiYgKG9iai5zcGxpY2UgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fFxuXHRcdFx0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCAob2JqLmxlbmd0aCAtIDEpKSAmJiBvYmouY29uc3RydWN0b3IubmFtZSAhPT0gJ1N0cmluZycpKSk7XG59O1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL1Rvb2xiYXIuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9Ub29sYmFyLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9DYWxsYmFja0dyYXBoQ29udGFpbmVyLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vRnJvbnRFbmRFcnJvci5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL0Zyb250RW5kRXJyb3IuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL0dsb2JhbEVycm9yT3ZlcmxheS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL0dsb2JhbEVycm9yT3ZlcmxheS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vUGVyY3kuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9QZXJjeS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vRGVidWdNZW51LmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vRGVidWdNZW51LmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc3R5bGVzSW5ET00gPSBbXTtcbmZ1bmN0aW9uIGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgdmFyIHJlc3VsdCA9IC0xO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlc0luRE9NLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0eWxlc0luRE9NW2ldLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJlc3VsdCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKSB7XG4gIHZhciBpZENvdW50TWFwID0ge307XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV07XG4gICAgdmFyIGlkID0gb3B0aW9ucy5iYXNlID8gaXRlbVswXSArIG9wdGlvbnMuYmFzZSA6IGl0ZW1bMF07XG4gICAgdmFyIGNvdW50ID0gaWRDb3VudE1hcFtpZF0gfHwgMDtcbiAgICB2YXIgaWRlbnRpZmllciA9IFwiXCIuY29uY2F0KGlkLCBcIiBcIikuY29uY2F0KGNvdW50KTtcbiAgICBpZENvdW50TWFwW2lkXSA9IGNvdW50ICsgMTtcbiAgICB2YXIgaW5kZXhCeUlkZW50aWZpZXIgPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICB2YXIgb2JqID0ge1xuICAgICAgY3NzOiBpdGVtWzFdLFxuICAgICAgbWVkaWE6IGl0ZW1bMl0sXG4gICAgICBzb3VyY2VNYXA6IGl0ZW1bM10sXG4gICAgICBzdXBwb3J0czogaXRlbVs0XSxcbiAgICAgIGxheWVyOiBpdGVtWzVdXG4gICAgfTtcbiAgICBpZiAoaW5kZXhCeUlkZW50aWZpZXIgIT09IC0xKSB7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0ucmVmZXJlbmNlcysrO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnVwZGF0ZXIob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVwZGF0ZXIgPSBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMuYnlJbmRleCA9IGk7XG4gICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoaSwgMCwge1xuICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICB1cGRhdGVyOiB1cGRhdGVyLFxuICAgICAgICByZWZlcmVuY2VzOiAxXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcbiAgfVxuICByZXR1cm4gaWRlbnRpZmllcnM7XG59XG5mdW5jdGlvbiBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKSB7XG4gIHZhciBhcGkgPSBvcHRpb25zLmRvbUFQSShvcHRpb25zKTtcbiAgYXBpLnVwZGF0ZShvYmopO1xuICB2YXIgdXBkYXRlciA9IGZ1bmN0aW9uIHVwZGF0ZXIobmV3T2JqKSB7XG4gICAgaWYgKG5ld09iaikge1xuICAgICAgaWYgKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCAmJiBuZXdPYmouc3VwcG9ydHMgPT09IG9iai5zdXBwb3J0cyAmJiBuZXdPYmoubGF5ZXIgPT09IG9iai5sYXllcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhcGkudXBkYXRlKG9iaiA9IG5ld09iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZW1vdmUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB1cGRhdGVyO1xufVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobGlzdCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgbGlzdCA9IGxpc3QgfHwgW107XG4gIHZhciBsYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xuICAgIG5ld0xpc3QgPSBuZXdMaXN0IHx8IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tpXTtcbiAgICAgIHZhciBpbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhdLnJlZmVyZW5jZXMtLTtcbiAgICB9XG4gICAgdmFyIG5ld0xhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShuZXdMaXN0LCBvcHRpb25zKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9pZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW19pXTtcbiAgICAgIHZhciBfaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihfaWRlbnRpZmllcik7XG4gICAgICBpZiAoc3R5bGVzSW5ET01bX2luZGV4XS5yZWZlcmVuY2VzID09PSAwKSB7XG4gICAgICAgIHN0eWxlc0luRE9NW19pbmRleF0udXBkYXRlcigpO1xuICAgICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoX2luZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGFzdElkZW50aWZpZXJzID0gbmV3TGFzdElkZW50aWZpZXJzO1xuICB9O1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIG1lbW8gPSB7fTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBnZXRUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgbWVtb1t0YXJnZXRdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdmFyIHN0eWxlVGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcbiAgICBpZiAod2luZG93LkhUTUxJRnJhbWVFbGVtZW50ICYmIHN0eWxlVGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuICAgICAgICAvLyBkdWUgdG8gY3Jvc3Mtb3JpZ2luIHJlc3RyaWN0aW9uc1xuICAgICAgICBzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgICBzdHlsZVRhcmdldCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIG1lbW9bdGFyZ2V0XSA9IHN0eWxlVGFyZ2V0O1xuICB9XG4gIHJldHVybiBtZW1vW3RhcmdldF07XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0QnlTZWxlY3RvcihpbnNlcnQsIHN0eWxlKSB7XG4gIHZhciB0YXJnZXQgPSBnZXRUYXJnZXQoaW5zZXJ0KTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydCcgcGFyYW1ldGVyIGlzIGludmFsaWQuXCIpO1xuICB9XG4gIHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydEJ5U2VsZWN0b3I7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpIHtcbiAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gIG9wdGlvbnMuc2V0QXR0cmlidXRlcyhlbGVtZW50LCBvcHRpb25zLmF0dHJpYnV0ZXMpO1xuICBvcHRpb25zLmluc2VydChlbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xuICByZXR1cm4gZWxlbWVudDtcbn1cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0U3R5bGVFbGVtZW50OyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcyhzdHlsZUVsZW1lbnQpIHtcbiAgdmFyIG5vbmNlID0gdHlwZW9mIF9fd2VicGFja19ub25jZV9fICE9PSBcInVuZGVmaW5lZFwiID8gX193ZWJwYWNrX25vbmNlX18gOiBudWxsO1xuICBpZiAobm9uY2UpIHtcbiAgICBzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgbm9uY2UpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlczsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaikge1xuICB2YXIgY3NzID0gXCJcIjtcbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KG9iai5zdXBwb3J0cywgXCIpIHtcIik7XG4gIH1cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIkBtZWRpYSBcIi5jb25jYXQob2JqLm1lZGlhLCBcIiB7XCIpO1xuICB9XG4gIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2Ygb2JqLmxheWVyICE9PSBcInVuZGVmaW5lZFwiO1xuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwiQGxheWVyXCIuY29uY2F0KG9iai5sYXllci5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KG9iai5sYXllcikgOiBcIlwiLCBcIiB7XCIpO1xuICB9XG4gIGNzcyArPSBvYmouY3NzO1xuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICB2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcbiAgaWYgKHNvdXJjZU1hcCAmJiB0eXBlb2YgYnRvYSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGNzcyArPSBcIlxcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsXCIuY29uY2F0KGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSksIFwiICovXCIpO1xuICB9XG5cbiAgLy8gRm9yIG9sZCBJRVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgICovXG4gIG9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG59XG5mdW5jdGlvbiByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KSB7XG4gIC8vIGlzdGFuYnVsIGlnbm9yZSBpZlxuICBpZiAoc3R5bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KTtcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBkb21BUEkob3B0aW9ucykge1xuICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKCkge30sXG4gICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHt9XG4gICAgfTtcbiAgfVxuICB2YXIgc3R5bGVFbGVtZW50ID0gb3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucyk7XG4gIHJldHVybiB7XG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUob2JqKSB7XG4gICAgICBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaik7XG4gICAgfSxcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpO1xuICAgIH1cbiAgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZG9tQVBJOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50KSB7XG4gIGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuICAgIHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICBzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgICBzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc3R5bGVUYWdUcmFuc2Zvcm07IiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBSZWFjdFNoYXJlZEludGVybmFscyA9IFJlYWN0Ll9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEO1xuXG5mdW5jdGlvbiBlcnJvcihmb3JtYXQpIHtcbiAge1xuICAgIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnZXJyb3InLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykge1xuICAvLyBXaGVuIGNoYW5naW5nIHRoaXMgbG9naWMsIHlvdSBtaWdodCB3YW50IHRvIGFsc29cbiAgLy8gdXBkYXRlIGNvbnNvbGVXaXRoU3RhY2tEZXYud3d3LmpzIGFzIHdlbGwuXG4gIHtcbiAgICB2YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gICAgdmFyIHN0YWNrID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG5cbiAgICBpZiAoc3RhY2sgIT09ICcnKSB7XG4gICAgICBmb3JtYXQgKz0gJyVzJztcbiAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChbc3RhY2tdKTtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuXG5cbiAgICB2YXIgYXJnc1dpdGhGb3JtYXQgPSBhcmdzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIFN0cmluZyhpdGVtKTtcbiAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXhcblxuICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdFxuICAgIC8vIGJyZWFrcyBJRTk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2MTBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG5cbiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlW2xldmVsXSwgY29uc29sZSwgYXJnc1dpdGhGb3JtYXQpO1xuICB9XG59XG5cbi8qKlxuICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gKi9cbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgcmV0dXJuIHggPT09IHkgJiYgKHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5KSB8fCB4ICE9PSB4ICYmIHkgIT09IHkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgO1xufVxuXG52YXIgb2JqZWN0SXMgPSB0eXBlb2YgT2JqZWN0LmlzID09PSAnZnVuY3Rpb24nID8gT2JqZWN0LmlzIDogaXM7XG5cbi8vIGRpc3BhdGNoIGZvciBDb21tb25KUyBpbnRlcm9wIG5hbWVkIGltcG9ydHMuXG5cbnZhciB1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlLFxuICAgIHVzZUVmZmVjdCA9IFJlYWN0LnVzZUVmZmVjdCxcbiAgICB1c2VMYXlvdXRFZmZlY3QgPSBSZWFjdC51c2VMYXlvdXRFZmZlY3QsXG4gICAgdXNlRGVidWdWYWx1ZSA9IFJlYWN0LnVzZURlYnVnVmFsdWU7XG52YXIgZGlkV2Fybk9sZDE4QWxwaGEgPSBmYWxzZTtcbnZhciBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IGZhbHNlOyAvLyBEaXNjbGFpbWVyOiBUaGlzIHNoaW0gYnJlYWtzIG1hbnkgb2YgdGhlIHJ1bGVzIG9mIFJlYWN0LCBhbmQgb25seSB3b3Jrc1xuLy8gYmVjYXVzZSBvZiBhIHZlcnkgcGFydGljdWxhciBzZXQgb2YgaW1wbGVtZW50YXRpb24gZGV0YWlscyBhbmQgYXNzdW1wdGlvbnNcbi8vIC0tIGNoYW5nZSBhbnkgb25lIG9mIHRoZW0gYW5kIGl0IHdpbGwgYnJlYWsuIFRoZSBtb3N0IGltcG9ydGFudCBhc3N1bXB0aW9uXG4vLyBpcyB0aGF0IHVwZGF0ZXMgYXJlIGFsd2F5cyBzeW5jaHJvbm91cywgYmVjYXVzZSBjb25jdXJyZW50IHJlbmRlcmluZyBpc1xuLy8gb25seSBhdmFpbGFibGUgaW4gdmVyc2lvbnMgb2YgUmVhY3QgdGhhdCBhbHNvIGhhdmUgYSBidWlsdC1pblxuLy8gdXNlU3luY0V4dGVybmFsU3RvcmUgQVBJLiBBbmQgd2Ugb25seSB1c2UgdGhpcyBzaGltIHdoZW4gdGhlIGJ1aWx0LWluIEFQSVxuLy8gZG9lcyBub3QgZXhpc3QuXG4vL1xuLy8gRG8gbm90IGFzc3VtZSB0aGF0IHRoZSBjbGV2ZXIgaGFja3MgdXNlZCBieSB0aGlzIGhvb2sgYWxzbyB3b3JrIGluIGdlbmVyYWwuXG4vLyBUaGUgcG9pbnQgb2YgdGhpcyBzaGltIGlzIHRvIHJlcGxhY2UgdGhlIG5lZWQgZm9yIGhhY2tzIGJ5IG90aGVyIGxpYnJhcmllcy5cblxuZnVuY3Rpb24gdXNlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgLy8gTm90ZTogVGhlIHNoaW0gZG9lcyBub3QgdXNlIGdldFNlcnZlclNuYXBzaG90LCBiZWNhdXNlIHByZS0xOCB2ZXJzaW9ucyBvZlxuLy8gUmVhY3QgZG8gbm90IGV4cG9zZSBhIHdheSB0byBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcuIFNvIHVzZXJzIG9mIHRoZSBzaGltXG4vLyB3aWxsIG5lZWQgdG8gdHJhY2sgdGhhdCB0aGVtc2VsdmVzIGFuZCByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWVcbi8vIGZyb20gYGdldFNuYXBzaG90YC5cbmdldFNlcnZlclNuYXBzaG90KSB7XG4gIHtcbiAgICBpZiAoIWRpZFdhcm5PbGQxOEFscGhhKSB7XG4gICAgICBpZiAoUmVhY3Quc3RhcnRUcmFuc2l0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGlkV2Fybk9sZDE4QWxwaGEgPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdZb3UgYXJlIHVzaW5nIGFuIG91dGRhdGVkLCBwcmUtcmVsZWFzZSBhbHBoYSBvZiBSZWFjdCAxOCB0aGF0ICcgKyAnZG9lcyBub3Qgc3VwcG9ydCB1c2VTeW5jRXh0ZXJuYWxTdG9yZS4gVGhlICcgKyAndXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUgc2hpbSB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseS4gVXBncmFkZSAnICsgJ3RvIGEgbmV3ZXIgcHJlLXJlbGVhc2UuJyk7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFJlYWQgdGhlIGN1cnJlbnQgc25hcHNob3QgZnJvbSB0aGUgc3RvcmUgb24gZXZlcnkgcmVuZGVyLiBBZ2FpbiwgdGhpc1xuICAvLyBicmVha3MgdGhlIHJ1bGVzIG9mIFJlYWN0LCBhbmQgb25seSB3b3JrcyBoZXJlIGJlY2F1c2Ugb2Ygc3BlY2lmaWNcbiAgLy8gaW1wbGVtZW50YXRpb24gZGV0YWlscywgbW9zdCBpbXBvcnRhbnRseSB0aGF0IHVwZGF0ZXMgYXJlXG4gIC8vIGFsd2F5cyBzeW5jaHJvbm91cy5cblxuXG4gIHZhciB2YWx1ZSA9IGdldFNuYXBzaG90KCk7XG5cbiAge1xuICAgIGlmICghZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QpIHtcbiAgICAgIHZhciBjYWNoZWRWYWx1ZSA9IGdldFNuYXBzaG90KCk7XG5cbiAgICAgIGlmICghb2JqZWN0SXModmFsdWUsIGNhY2hlZFZhbHVlKSkge1xuICAgICAgICBlcnJvcignVGhlIHJlc3VsdCBvZiBnZXRTbmFwc2hvdCBzaG91bGQgYmUgY2FjaGVkIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AnKTtcblxuICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIEJlY2F1c2UgdXBkYXRlcyBhcmUgc3luY2hyb25vdXMsIHdlIGRvbid0IHF1ZXVlIHRoZW0uIEluc3RlYWQgd2UgZm9yY2UgYVxuICAvLyByZS1yZW5kZXIgd2hlbmV2ZXIgdGhlIHN1YnNjcmliZWQgc3RhdGUgY2hhbmdlcyBieSB1cGRhdGluZyBhbiBzb21lXG4gIC8vIGFyYml0cmFyeSB1c2VTdGF0ZSBob29rLiBUaGVuLCBkdXJpbmcgcmVuZGVyLCB3ZSBjYWxsIGdldFNuYXBzaG90IHRvIHJlYWRcbiAgLy8gdGhlIGN1cnJlbnQgdmFsdWUuXG4gIC8vXG4gIC8vIEJlY2F1c2Ugd2UgZG9uJ3QgYWN0dWFsbHkgdXNlIHRoZSBzdGF0ZSByZXR1cm5lZCBieSB0aGUgdXNlU3RhdGUgaG9vaywgd2VcbiAgLy8gY2FuIHNhdmUgYSBiaXQgb2YgbWVtb3J5IGJ5IHN0b3Jpbmcgb3RoZXIgc3R1ZmYgaW4gdGhhdCBzbG90LlxuICAvL1xuICAvLyBUbyBpbXBsZW1lbnQgdGhlIGVhcmx5IGJhaWxvdXQsIHdlIG5lZWQgdG8gdHJhY2sgc29tZSB0aGluZ3Mgb24gYSBtdXRhYmxlXG4gIC8vIG9iamVjdC4gVXN1YWxseSwgd2Ugd291bGQgcHV0IHRoYXQgaW4gYSB1c2VSZWYgaG9vaywgYnV0IHdlIGNhbiBzdGFzaCBpdCBpblxuICAvLyBvdXIgdXNlU3RhdGUgaG9vayBpbnN0ZWFkLlxuICAvL1xuICAvLyBUbyBmb3JjZSBhIHJlLXJlbmRlciwgd2UgY2FsbCBmb3JjZVVwZGF0ZSh7aW5zdH0pLiBUaGF0IHdvcmtzIGJlY2F1c2UgdGhlXG4gIC8vIG5ldyBvYmplY3QgYWx3YXlzIGZhaWxzIGFuIGVxdWFsaXR5IGNoZWNrLlxuXG5cbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKHtcbiAgICBpbnN0OiB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3RcbiAgICB9XG4gIH0pLFxuICAgICAgaW5zdCA9IF91c2VTdGF0ZVswXS5pbnN0LFxuICAgICAgZm9yY2VVcGRhdGUgPSBfdXNlU3RhdGVbMV07IC8vIFRyYWNrIHRoZSBsYXRlc3QgZ2V0U25hcHNob3QgZnVuY3Rpb24gd2l0aCBhIHJlZi4gVGhpcyBuZWVkcyB0byBiZSB1cGRhdGVkXG4gIC8vIGluIHRoZSBsYXlvdXQgcGhhc2Ugc28gd2UgY2FuIGFjY2VzcyBpdCBkdXJpbmcgdGhlIHRlYXJpbmcgY2hlY2sgdGhhdFxuICAvLyBoYXBwZW5zIG9uIHN1YnNjcmliZS5cblxuXG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaW5zdC52YWx1ZSA9IHZhbHVlO1xuICAgIGluc3QuZ2V0U25hcHNob3QgPSBnZXRTbmFwc2hvdDsgLy8gV2hlbmV2ZXIgZ2V0U25hcHNob3Qgb3Igc3Vic2NyaWJlIGNoYW5nZXMsIHdlIG5lZWQgdG8gY2hlY2sgaW4gdGhlXG4gICAgLy8gY29tbWl0IHBoYXNlIGlmIHRoZXJlIHdhcyBhbiBpbnRlcmxlYXZlZCBtdXRhdGlvbi4gSW4gY29uY3VycmVudCBtb2RlXG4gICAgLy8gdGhpcyBjYW4gaGFwcGVuIGFsbCB0aGUgdGltZSwgYnV0IGV2ZW4gaW4gc3luY2hyb25vdXMgbW9kZSwgYW4gZWFybGllclxuICAgIC8vIGVmZmVjdCBtYXkgaGF2ZSBtdXRhdGVkIHRoZSBzdG9yZS5cblxuICAgIGlmIChjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpKSB7XG4gICAgICAvLyBGb3JjZSBhIHJlLXJlbmRlci5cbiAgICAgIGZvcmNlVXBkYXRlKHtcbiAgICAgICAgaW5zdDogaW5zdFxuICAgICAgfSk7XG4gICAgfVxuICB9LCBbc3Vic2NyaWJlLCB2YWx1ZSwgZ2V0U25hcHNob3RdKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBDaGVjayBmb3IgY2hhbmdlcyByaWdodCBiZWZvcmUgc3Vic2NyaWJpbmcuIFN1YnNlcXVlbnQgY2hhbmdlcyB3aWxsIGJlXG4gICAgLy8gZGV0ZWN0ZWQgaW4gdGhlIHN1YnNjcmlwdGlvbiBoYW5kbGVyLlxuICAgIGlmIChjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpKSB7XG4gICAgICAvLyBGb3JjZSBhIHJlLXJlbmRlci5cbiAgICAgIGZvcmNlVXBkYXRlKHtcbiAgICAgICAgaW5zdDogaW5zdFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIGhhbmRsZVN0b3JlQ2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVE9ETzogQmVjYXVzZSB0aGVyZSBpcyBubyBjcm9zcy1yZW5kZXJlciBBUEkgZm9yIGJhdGNoaW5nIHVwZGF0ZXMsIGl0J3NcbiAgICAgIC8vIHVwIHRvIHRoZSBjb25zdW1lciBvZiB0aGlzIGxpYnJhcnkgdG8gd3JhcCB0aGVpciBzdWJzY3JpcHRpb24gZXZlbnRcbiAgICAgIC8vIHdpdGggdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMuIFNob3VsZCB3ZSB0cnkgdG8gZGV0ZWN0IHdoZW4gdGhpcyBpc24ndFxuICAgICAgLy8gdGhlIGNhc2UgYW5kIHByaW50IGEgd2FybmluZyBpbiBkZXZlbG9wbWVudD9cbiAgICAgIC8vIFRoZSBzdG9yZSBjaGFuZ2VkLiBDaGVjayBpZiB0aGUgc25hcHNob3QgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlXG4gICAgICAvLyByZWFkIGZyb20gdGhlIHN0b3JlLlxuICAgICAgaWYgKGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkpIHtcbiAgICAgICAgLy8gRm9yY2UgYSByZS1yZW5kZXIuXG4gICAgICAgIGZvcmNlVXBkYXRlKHtcbiAgICAgICAgICBpbnN0OiBpbnN0XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07IC8vIFN1YnNjcmliZSB0byB0aGUgc3RvcmUgYW5kIHJldHVybiBhIGNsZWFuLXVwIGZ1bmN0aW9uLlxuXG5cbiAgICByZXR1cm4gc3Vic2NyaWJlKGhhbmRsZVN0b3JlQ2hhbmdlKTtcbiAgfSwgW3N1YnNjcmliZV0pO1xuICB1c2VEZWJ1Z1ZhbHVlKHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpIHtcbiAgdmFyIGxhdGVzdEdldFNuYXBzaG90ID0gaW5zdC5nZXRTbmFwc2hvdDtcbiAgdmFyIHByZXZWYWx1ZSA9IGluc3QudmFsdWU7XG5cbiAgdHJ5IHtcbiAgICB2YXIgbmV4dFZhbHVlID0gbGF0ZXN0R2V0U25hcHNob3QoKTtcbiAgICByZXR1cm4gIW9iamVjdElzKHByZXZWYWx1ZSwgbmV4dFZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1c2VTeW5jRXh0ZXJuYWxTdG9yZSQxKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIC8vIE5vdGU6IFRoZSBzaGltIGRvZXMgbm90IHVzZSBnZXRTZXJ2ZXJTbmFwc2hvdCwgYmVjYXVzZSBwcmUtMTggdmVyc2lvbnMgb2ZcbiAgLy8gUmVhY3QgZG8gbm90IGV4cG9zZSBhIHdheSB0byBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcuIFNvIHVzZXJzIG9mIHRoZSBzaGltXG4gIC8vIHdpbGwgbmVlZCB0byB0cmFjayB0aGF0IHRoZW1zZWx2ZXMgYW5kIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZVxuICAvLyBmcm9tIGBnZXRTbmFwc2hvdGAuXG4gIHJldHVybiBnZXRTbmFwc2hvdCgpO1xufVxuXG52YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ICE9PSAndW5kZWZpbmVkJyk7XG5cbnZhciBpc1NlcnZlckVudmlyb25tZW50ID0gIWNhblVzZURPTTtcblxudmFyIHNoaW0gPSBpc1NlcnZlckVudmlyb25tZW50ID8gdXNlU3luY0V4dGVybmFsU3RvcmUkMSA6IHVzZVN5bmNFeHRlcm5hbFN0b3JlO1xudmFyIHVzZVN5bmNFeHRlcm5hbFN0b3JlJDIgPSBSZWFjdC51c2VTeW5jRXh0ZXJuYWxTdG9yZSAhPT0gdW5kZWZpbmVkID8gUmVhY3QudXNlU3luY0V4dGVybmFsU3RvcmUgOiBzaGltO1xuXG5leHBvcnRzLnVzZVN5bmNFeHRlcm5hbFN0b3JlID0gdXNlU3luY0V4dGVybmFsU3RvcmUkMjtcbiAgICAgICAgICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgIFxuICB9KSgpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS93aXRoLXNlbGVjdG9yLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICd1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgICAgdmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcbnZhciBzaGltID0gcmVxdWlyZSgndXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvc2hpbScpO1xuXG4vKipcbiAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuICovXG5mdW5jdGlvbiBpcyh4LCB5KSB7XG4gIHJldHVybiB4ID09PSB5ICYmICh4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geSkgfHwgeCAhPT0geCAmJiB5ICE9PSB5IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIDtcbn1cblxudmFyIG9iamVjdElzID0gdHlwZW9mIE9iamVjdC5pcyA9PT0gJ2Z1bmN0aW9uJyA/IE9iamVjdC5pcyA6IGlzO1xuXG52YXIgdXNlU3luY0V4dGVybmFsU3RvcmUgPSBzaGltLnVzZVN5bmNFeHRlcm5hbFN0b3JlO1xuXG4vLyBmb3IgQ29tbW9uSlMgaW50ZXJvcC5cblxudmFyIHVzZVJlZiA9IFJlYWN0LnVzZVJlZixcbiAgICB1c2VFZmZlY3QgPSBSZWFjdC51c2VFZmZlY3QsXG4gICAgdXNlTWVtbyA9IFJlYWN0LnVzZU1lbW8sXG4gICAgdXNlRGVidWdWYWx1ZSA9IFJlYWN0LnVzZURlYnVnVmFsdWU7IC8vIFNhbWUgYXMgdXNlU3luY0V4dGVybmFsU3RvcmUsIGJ1dCBzdXBwb3J0cyBzZWxlY3RvciBhbmQgaXNFcXVhbCBhcmd1bWVudHMuXG5cbmZ1bmN0aW9uIHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90LCBzZWxlY3RvciwgaXNFcXVhbCkge1xuICAvLyBVc2UgdGhpcyB0byB0cmFjayB0aGUgcmVuZGVyZWQgc25hcHNob3QuXG4gIHZhciBpbnN0UmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgaW5zdDtcblxuICBpZiAoaW5zdFJlZi5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgaW5zdCA9IHtcbiAgICAgIGhhc1ZhbHVlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBudWxsXG4gICAgfTtcbiAgICBpbnN0UmVmLmN1cnJlbnQgPSBpbnN0O1xuICB9IGVsc2Uge1xuICAgIGluc3QgPSBpbnN0UmVmLmN1cnJlbnQ7XG4gIH1cblxuICB2YXIgX3VzZU1lbW8gPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUcmFjayB0aGUgbWVtb2l6ZWQgc3RhdGUgdXNpbmcgY2xvc3VyZSB2YXJpYWJsZXMgdGhhdCBhcmUgbG9jYWwgdG8gdGhpc1xuICAgIC8vIG1lbW9pemVkIGluc3RhbmNlIG9mIGEgZ2V0U25hcHNob3QgZnVuY3Rpb24uIEludGVudGlvbmFsbHkgbm90IHVzaW5nIGFcbiAgICAvLyB1c2VSZWYgaG9vaywgYmVjYXVzZSB0aGF0IHN0YXRlIHdvdWxkIGJlIHNoYXJlZCBhY3Jvc3MgYWxsIGNvbmN1cnJlbnRcbiAgICAvLyBjb3BpZXMgb2YgdGhlIGhvb2svY29tcG9uZW50LlxuICAgIHZhciBoYXNNZW1vID0gZmFsc2U7XG4gICAgdmFyIG1lbW9pemVkU25hcHNob3Q7XG4gICAgdmFyIG1lbW9pemVkU2VsZWN0aW9uO1xuXG4gICAgdmFyIG1lbW9pemVkU2VsZWN0b3IgPSBmdW5jdGlvbiAobmV4dFNuYXBzaG90KSB7XG4gICAgICBpZiAoIWhhc01lbW8pIHtcbiAgICAgICAgLy8gVGhlIGZpcnN0IHRpbWUgdGhlIGhvb2sgaXMgY2FsbGVkLCB0aGVyZSBpcyBubyBtZW1vaXplZCByZXN1bHQuXG4gICAgICAgIGhhc01lbW8gPSB0cnVlO1xuICAgICAgICBtZW1vaXplZFNuYXBzaG90ID0gbmV4dFNuYXBzaG90O1xuXG4gICAgICAgIHZhciBfbmV4dFNlbGVjdGlvbiA9IHNlbGVjdG9yKG5leHRTbmFwc2hvdCk7XG5cbiAgICAgICAgaWYgKGlzRXF1YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIEV2ZW4gaWYgdGhlIHNlbGVjdG9yIGhhcyBjaGFuZ2VkLCB0aGUgY3VycmVudGx5IHJlbmRlcmVkIHNlbGVjdGlvblxuICAgICAgICAgIC8vIG1heSBiZSBlcXVhbCB0byB0aGUgbmV3IHNlbGVjdGlvbi4gV2Ugc2hvdWxkIGF0dGVtcHQgdG8gcmV1c2UgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCB2YWx1ZSBpZiBwb3NzaWJsZSwgdG8gcHJlc2VydmUgZG93bnN0cmVhbSBtZW1vaXphdGlvbnMuXG4gICAgICAgICAgaWYgKGluc3QuaGFzVmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50U2VsZWN0aW9uID0gaW5zdC52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKGlzRXF1YWwoY3VycmVudFNlbGVjdGlvbiwgX25leHRTZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgIG1lbW9pemVkU2VsZWN0aW9uID0gY3VycmVudFNlbGVjdGlvbjtcbiAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRTZWxlY3Rpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbWVtb2l6ZWRTZWxlY3Rpb24gPSBfbmV4dFNlbGVjdGlvbjtcbiAgICAgICAgcmV0dXJuIF9uZXh0U2VsZWN0aW9uO1xuICAgICAgfSAvLyBXZSBtYXkgYmUgYWJsZSB0byByZXVzZSB0aGUgcHJldmlvdXMgaW52b2NhdGlvbidzIHJlc3VsdC5cblxuXG4gICAgICAvLyBXZSBtYXkgYmUgYWJsZSB0byByZXVzZSB0aGUgcHJldmlvdXMgaW52b2NhdGlvbidzIHJlc3VsdC5cbiAgICAgIHZhciBwcmV2U25hcHNob3QgPSBtZW1vaXplZFNuYXBzaG90O1xuICAgICAgdmFyIHByZXZTZWxlY3Rpb24gPSBtZW1vaXplZFNlbGVjdGlvbjtcblxuICAgICAgaWYgKG9iamVjdElzKHByZXZTbmFwc2hvdCwgbmV4dFNuYXBzaG90KSkge1xuICAgICAgICAvLyBUaGUgc25hcHNob3QgaXMgdGhlIHNhbWUgYXMgbGFzdCB0aW1lLiBSZXVzZSB0aGUgcHJldmlvdXMgc2VsZWN0aW9uLlxuICAgICAgICByZXR1cm4gcHJldlNlbGVjdGlvbjtcbiAgICAgIH0gLy8gVGhlIHNuYXBzaG90IGhhcyBjaGFuZ2VkLCBzbyB3ZSBuZWVkIHRvIGNvbXB1dGUgYSBuZXcgc2VsZWN0aW9uLlxuXG5cbiAgICAgIC8vIFRoZSBzbmFwc2hvdCBoYXMgY2hhbmdlZCwgc28gd2UgbmVlZCB0byBjb21wdXRlIGEgbmV3IHNlbGVjdGlvbi5cbiAgICAgIHZhciBuZXh0U2VsZWN0aW9uID0gc2VsZWN0b3IobmV4dFNuYXBzaG90KTsgLy8gSWYgYSBjdXN0b20gaXNFcXVhbCBmdW5jdGlvbiBpcyBwcm92aWRlZCwgdXNlIHRoYXQgdG8gY2hlY2sgaWYgdGhlIGRhdGFcbiAgICAgIC8vIGhhcyBjaGFuZ2VkLiBJZiBpdCBoYXNuJ3QsIHJldHVybiB0aGUgcHJldmlvdXMgc2VsZWN0aW9uLiBUaGF0IHNpZ25hbHNcbiAgICAgIC8vIHRvIFJlYWN0IHRoYXQgdGhlIHNlbGVjdGlvbnMgYXJlIGNvbmNlcHR1YWxseSBlcXVhbCwgYW5kIHdlIGNhbiBiYWlsXG4gICAgICAvLyBvdXQgb2YgcmVuZGVyaW5nLlxuXG4gICAgICAvLyBJZiBhIGN1c3RvbSBpc0VxdWFsIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCB1c2UgdGhhdCB0byBjaGVjayBpZiB0aGUgZGF0YVxuICAgICAgLy8gaGFzIGNoYW5nZWQuIElmIGl0IGhhc24ndCwgcmV0dXJuIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24uIFRoYXQgc2lnbmFsc1xuICAgICAgLy8gdG8gUmVhY3QgdGhhdCB0aGUgc2VsZWN0aW9ucyBhcmUgY29uY2VwdHVhbGx5IGVxdWFsLCBhbmQgd2UgY2FuIGJhaWxcbiAgICAgIC8vIG91dCBvZiByZW5kZXJpbmcuXG4gICAgICBpZiAoaXNFcXVhbCAhPT0gdW5kZWZpbmVkICYmIGlzRXF1YWwocHJldlNlbGVjdGlvbiwgbmV4dFNlbGVjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIHByZXZTZWxlY3Rpb247XG4gICAgICB9XG5cbiAgICAgIG1lbW9pemVkU25hcHNob3QgPSBuZXh0U25hcHNob3Q7XG4gICAgICBtZW1vaXplZFNlbGVjdGlvbiA9IG5leHRTZWxlY3Rpb247XG4gICAgICByZXR1cm4gbmV4dFNlbGVjdGlvbjtcbiAgICB9OyAvLyBBc3NpZ25pbmcgdGhpcyB0byBhIGNvbnN0YW50IHNvIHRoYXQgRmxvdyBrbm93cyBpdCBjYW4ndCBjaGFuZ2UuXG5cblxuICAgIC8vIEFzc2lnbmluZyB0aGlzIHRvIGEgY29uc3RhbnQgc28gdGhhdCBGbG93IGtub3dzIGl0IGNhbid0IGNoYW5nZS5cbiAgICB2YXIgbWF5YmVHZXRTZXJ2ZXJTbmFwc2hvdCA9IGdldFNlcnZlclNuYXBzaG90ID09PSB1bmRlZmluZWQgPyBudWxsIDogZ2V0U2VydmVyU25hcHNob3Q7XG5cbiAgICB2YXIgZ2V0U25hcHNob3RXaXRoU2VsZWN0b3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbWVtb2l6ZWRTZWxlY3RvcihnZXRTbmFwc2hvdCgpKTtcbiAgICB9O1xuXG4gICAgdmFyIGdldFNlcnZlclNuYXBzaG90V2l0aFNlbGVjdG9yID0gbWF5YmVHZXRTZXJ2ZXJTbmFwc2hvdCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBtZW1vaXplZFNlbGVjdG9yKG1heWJlR2V0U2VydmVyU25hcHNob3QoKSk7XG4gICAgfTtcbiAgICByZXR1cm4gW2dldFNuYXBzaG90V2l0aFNlbGVjdG9yLCBnZXRTZXJ2ZXJTbmFwc2hvdFdpdGhTZWxlY3Rvcl07XG4gIH0sIFtnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QsIHNlbGVjdG9yLCBpc0VxdWFsXSksXG4gICAgICBnZXRTZWxlY3Rpb24gPSBfdXNlTWVtb1swXSxcbiAgICAgIGdldFNlcnZlclNlbGVjdGlvbiA9IF91c2VNZW1vWzFdO1xuXG4gIHZhciB2YWx1ZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U2VsZWN0aW9uLCBnZXRTZXJ2ZXJTZWxlY3Rpb24pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGluc3QuaGFzVmFsdWUgPSB0cnVlO1xuICAgIGluc3QudmFsdWUgPSB2YWx1ZTtcbiAgfSwgW3ZhbHVlXSk7XG4gIHVzZURlYnVnVmFsdWUodmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydHMudXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvcjtcbiAgICAgICAgICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgIFxuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0vd2l0aC1zZWxlY3Rvci5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS93aXRoLXNlbGVjdG9yLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHdpbmRvd1tcIlByb3BUeXBlc1wiXTsiLCJtb2R1bGUuZXhwb3J0cyA9IHdpbmRvd1tcIlJlYWN0XCJdOyIsIm1vZHVsZS5leHBvcnRzID0gd2luZG93W1wiUmVhY3RET01cIl07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTtcbiAgcmV0dXJuIGFycjI7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufSIsImltcG9ydCBhcnJheUxpa2VUb0FycmF5IGZyb20gXCIuL2FycmF5TGlrZVRvQXJyYXkuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkoYXJyKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHtcbiAgaWYgKHNlbGYgPT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuICByZXR1cm4gc2VsZjtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufSIsImltcG9ydCB0b1Byb3BlcnR5S2V5IGZyb20gXCIuL3RvUHJvcGVydHlLZXkuanNcIjtcbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHRvUHJvcGVydHlLZXkoZGVzY3JpcHRvci5rZXkpLCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn0iLCJpbXBvcnQgdG9Qcm9wZXJ0eUtleSBmcm9tIFwiLi90b1Byb3BlcnR5S2V5LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGtleSA9IHRvUHJvcGVydHlLZXkoa2V5KTtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgICByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pO1xuICB9O1xuICByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pO1xufSIsImltcG9ydCBzZXRQcm90b3R5cGVPZiBmcm9tIFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gIH1cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN1YkNsYXNzLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuICBpZiAoc3VwZXJDbGFzcykgc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikge1xuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQociwgbCkge1xuICB2YXIgdCA9IG51bGwgPT0gciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgcltTeW1ib2wuaXRlcmF0b3JdIHx8IHJbXCJAQGl0ZXJhdG9yXCJdO1xuICBpZiAobnVsbCAhPSB0KSB7XG4gICAgdmFyIGUsXG4gICAgICBuLFxuICAgICAgaSxcbiAgICAgIHUsXG4gICAgICBhID0gW10sXG4gICAgICBmID0gITAsXG4gICAgICBvID0gITE7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChpID0gKHQgPSB0LmNhbGwocikpLm5leHQsIDAgPT09IGwpIHtcbiAgICAgICAgaWYgKE9iamVjdCh0KSAhPT0gdCkgcmV0dXJuO1xuICAgICAgICBmID0gITE7XG4gICAgICB9IGVsc2UgZm9yICg7ICEoZiA9IChlID0gaS5jYWxsKHQpKS5kb25lKSAmJiAoYS5wdXNoKGUudmFsdWUpLCBhLmxlbmd0aCAhPT0gbCk7IGYgPSAhMCk7XG4gICAgfSBjYXRjaCAocikge1xuICAgICAgbyA9ICEwLCBuID0gcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFmICYmIG51bGwgIT0gdFtcInJldHVyblwiXSAmJiAodSA9IHRbXCJyZXR1cm5cIl0oKSwgT2JqZWN0KHUpICE9PSB1KSkgcmV0dXJuO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKG8pIHRocm93IG47XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhO1xuICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufSIsImltcG9ydCBkZWZpbmVQcm9wZXJ0eSBmcm9tIFwiLi9kZWZpbmVQcm9wZXJ0eS5qc1wiO1xuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7XG4gIHZhciB0ID0gT2JqZWN0LmtleXMoZSk7XG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO1xuICAgIHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTtcbiAgICB9KSksIHQucHVzaC5hcHBseSh0LCBvKTtcbiAgfVxuICByZXR1cm4gdDtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKGUpIHtcbiAgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHtcbiAgICB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307XG4gICAgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pO1xuICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBlO1xufSIsImltcG9ydCBvYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGZyb20gXCIuL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0gb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTtcbiAgdmFyIGtleSwgaTtcbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTtcbiAgICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgdmFyIGtleSwgaTtcbiAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gXCIuL3R5cGVvZi5qc1wiO1xuaW1wb3J0IGFzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiLi9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHtcbiAgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICByZXR1cm4gY2FsbDtcbiAgfSBlbHNlIGlmIChjYWxsICE9PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWRcIik7XG4gIH1cbiAgcmV0dXJuIGFzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59IiwiaW1wb3J0IGFycmF5V2l0aEhvbGVzIGZyb20gXCIuL2FycmF5V2l0aEhvbGVzLmpzXCI7XG5pbXBvcnQgaXRlcmFibGVUb0FycmF5TGltaXQgZnJvbSBcIi4vaXRlcmFibGVUb0FycmF5TGltaXQuanNcIjtcbmltcG9ydCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSBmcm9tIFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiO1xuaW1wb3J0IG5vbkl0ZXJhYmxlUmVzdCBmcm9tIFwiLi9ub25JdGVyYWJsZVJlc3QuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkge1xuICByZXR1cm4gYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59IiwiaW1wb3J0IGFycmF5V2l0aG91dEhvbGVzIGZyb20gXCIuL2FycmF5V2l0aG91dEhvbGVzLmpzXCI7XG5pbXBvcnQgaXRlcmFibGVUb0FycmF5IGZyb20gXCIuL2l0ZXJhYmxlVG9BcnJheS5qc1wiO1xuaW1wb3J0IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IGZyb20gXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgbm9uSXRlcmFibGVTcHJlYWQgZnJvbSBcIi4vbm9uSXRlcmFibGVTcHJlYWQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIGFycmF5V2l0aG91dEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5KGFycikgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBub25JdGVyYWJsZVNwcmVhZCgpO1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gXCIuL3R5cGVvZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7XG4gIGlmIChfdHlwZW9mKGlucHV0KSAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0O1xuICB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07XG4gIGlmIChwcmltICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcmVzID0gcHJpbS5jYWxsKGlucHV0LCBoaW50IHx8IFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoX3R5cGVvZihyZXMpICE9PSBcIm9iamVjdFwiKSByZXR1cm4gcmVzO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTtcbiAgfVxuICByZXR1cm4gKGhpbnQgPT09IFwic3RyaW5nXCIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmltcG9ydCB0b1ByaW1pdGl2ZSBmcm9tIFwiLi90b1ByaW1pdGl2ZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7XG4gIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShhcmcsIFwic3RyaW5nXCIpO1xuICByZXR1cm4gX3R5cGVvZihrZXkpID09PSBcInN5bWJvbFwiID8ga2V5IDogU3RyaW5nKGtleSk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3R5cGVvZihvKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvO1xuICB9IDogZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbztcbiAgfSwgX3R5cGVvZihvKTtcbn0iLCJpbXBvcnQgYXJyYXlMaWtlVG9BcnJheSBmcm9tIFwiLi9hcnJheUxpa2VUb0FycmF5LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7XG4gIGlmICghbykgcmV0dXJuO1xuICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufSIsImltcG9ydCBfY29uY2F0IGZyb20gXCIuL2ludGVybmFsL19jb25jYXQuanNcIjtcbmltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBjdXJyeU4gZnJvbSBcIi4vY3VycnlOLmpzXCI7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbGlzdCBpdGVyYXRpb24gZnVuY3Rpb24gZnJvbSBhbiBleGlzdGluZyBvbmUgYnkgYWRkaW5nIHR3byBuZXdcbiAqIHBhcmFtZXRlcnMgdG8gaXRzIGNhbGxiYWNrIGZ1bmN0aW9uOiB0aGUgY3VycmVudCBpbmRleCwgYW5kIHRoZSBlbnRpcmUgbGlzdC5cbiAqXG4gKiBUaGlzIHdvdWxkIHR1cm4sIGZvciBpbnN0YW5jZSwgW2BSLm1hcGBdKCNtYXApIGZ1bmN0aW9uIGludG8gb25lIHRoYXRcbiAqIG1vcmUgY2xvc2VseSByZXNlbWJsZXMgYEFycmF5LnByb3RvdHlwZS5tYXBgLiBOb3RlIHRoYXQgdGhpcyB3aWxsIG9ubHkgd29ya1xuICogZm9yIGZ1bmN0aW9ucyBpbiB3aGljaCB0aGUgaXRlcmF0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHRoZSBmaXJzdFxuICogcGFyYW1ldGVyLCBhbmQgd2hlcmUgdGhlIGxpc3QgaXMgdGhlIGxhc3QgcGFyYW1ldGVyLiAoVGhpcyBsYXR0ZXIgbWlnaHQgYmVcbiAqIHVuaW1wb3J0YW50IGlmIHRoZSBsaXN0IHBhcmFtZXRlciBpcyBub3QgdXNlZC4pXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTUuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoKChhIC4uLikgLT4gYikgLi4uIC0+IFthXSAtPiAqKSAtPiAoKChhIC4uLiwgSW50LCBbYV0pIC0+IGIpIC4uLiAtPiBbYV0gLT4gKilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEEgbGlzdCBpdGVyYXRpb24gZnVuY3Rpb24gdGhhdCBkb2VzIG5vdCBwYXNzIGluZGV4IG9yIGxpc3QgdG8gaXRzIGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQW4gYWx0ZXJlZCBsaXN0IGl0ZXJhdGlvbiBmdW5jdGlvbiB0aGF0IHBhc3NlcyAoaXRlbSwgaW5kZXgsIGxpc3QpIHRvIGl0cyBjYWxsYmFja1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IG1hcEluZGV4ZWQgPSBSLmFkZEluZGV4KFIubWFwKTtcbiAqICAgICAgbWFwSW5kZXhlZCgodmFsLCBpZHgpID0+IGlkeCArICctJyArIHZhbCwgWydmJywgJ28nLCAnbycsICdiJywgJ2EnLCAnciddKTtcbiAqICAgICAgLy89PiBbJzAtZicsICcxLW8nLCAnMi1vJywgJzMtYicsICc0LWEnLCAnNS1yJ11cbiAqL1xuXG52YXIgYWRkSW5kZXggPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiBhZGRJbmRleChmbikge1xuICByZXR1cm4gY3VycnlOKGZuLmxlbmd0aCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBpZHggPSAwO1xuICAgIHZhciBvcmlnRm4gPSBhcmd1bWVudHNbMF07XG4gICAgdmFyIGxpc3QgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcblxuICAgIGFyZ3NbMF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gb3JpZ0ZuLmFwcGx5KHRoaXMsIF9jb25jYXQoYXJndW1lbnRzLCBbaWR4LCBsaXN0XSkpO1xuICAgICAgaWR4ICs9IDE7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncyk7XG4gIH0pO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGFkZEluZGV4OyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfeGFsbCBmcm9tIFwiLi9pbnRlcm5hbC9feGFsbC5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgb2YgdGhlIGxpc3QgbWF0Y2ggdGhlIHByZWRpY2F0ZSwgYGZhbHNlYCBpZlxuICogdGhlcmUgYXJlIGFueSB0aGF0IGRvbid0LlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBhbGxgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIHByZWRpY2F0ZSBpcyBzYXRpc2ZpZWQgYnkgZXZlcnkgZWxlbWVudCwgYGZhbHNlYFxuICogICAgICAgICBvdGhlcndpc2UuXG4gKiBAc2VlIFIuYW55LCBSLm5vbmUsIFIudHJhbnNkdWNlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZXF1YWxzMyA9IFIuZXF1YWxzKDMpO1xuICogICAgICBSLmFsbChlcXVhbHMzKShbMywgMywgMywgM10pOyAvLz0+IHRydWVcbiAqICAgICAgUi5hbGwoZXF1YWxzMykoWzMsIDMsIDEsIDNdKTsgLy89PiBmYWxzZVxuICovXG5cbnZhciBhbGwgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5Mihcbi8qI19fUFVSRV9fKi9cbl9kaXNwYXRjaGFibGUoWydhbGwnXSwgX3hhbGwsIGZ1bmN0aW9uIGFsbChmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcblxuICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICBpZiAoIWZuKGxpc3RbaWR4XSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufSkpO1xuXG5leHBvcnQgZGVmYXVsdCBhbGw7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBhbHdheXMgcmV0dXJucyB0aGUgZ2l2ZW4gdmFsdWUuIE5vdGUgdGhhdCBmb3JcbiAqIG5vbi1wcmltaXRpdmVzIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgdmFsdWUuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyBrbm93biBhcyBgY29uc3RgLCBgY29uc3RhbnRgLCBvciBgS2AgKGZvciBLIGNvbWJpbmF0b3IpIGluXG4gKiBvdGhlciBsYW5ndWFnZXMgYW5kIGxpYnJhcmllcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBhIC0+ICgqIC0+IGEpXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gd3JhcCBpbiBhIGZ1bmN0aW9uXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBGdW5jdGlvbiA6OiAqIC0+IHZhbC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCB0ID0gUi5hbHdheXMoJ1RlZScpO1xuICogICAgICB0KCk7IC8vPT4gJ1RlZSdcbiAqL1xuXG52YXIgYWx3YXlzID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoZnVuY3Rpb24gYWx3YXlzKHZhbCkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB2YWw7XG4gIH07XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgYWx3YXlzOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfeGFueSBmcm9tIFwiLi9pbnRlcm5hbC9feGFueS5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBsaXN0IG1hdGNoIHRoZSBwcmVkaWNhdGUsXG4gKiBgZmFsc2VgIG90aGVyd2lzZS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgYW55YCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiBbYV0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBwcmVkaWNhdGUgaXMgc2F0aXNmaWVkIGJ5IGF0IGxlYXN0IG9uZSBlbGVtZW50LCBgZmFsc2VgXG4gKiAgICAgICAgIG90aGVyd2lzZS5cbiAqIEBzZWUgUi5hbGwsIFIubm9uZSwgUi50cmFuc2R1Y2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBsZXNzVGhhbjAgPSBSLmZsaXAoUi5sdCkoMCk7XG4gKiAgICAgIGNvbnN0IGxlc3NUaGFuMiA9IFIuZmxpcChSLmx0KSgyKTtcbiAqICAgICAgUi5hbnkobGVzc1RoYW4wKShbMSwgMl0pOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuYW55KGxlc3NUaGFuMikoWzEsIDJdKTsgLy89PiB0cnVlXG4gKi9cblxudmFyIGFueSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKFxuLyojX19QVVJFX18qL1xuX2Rpc3BhdGNoYWJsZShbJ2FueSddLCBfeGFueSwgZnVuY3Rpb24gYW55KGZuLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuXG4gIHdoaWxlIChpZHggPCBsaXN0Lmxlbmd0aCkge1xuICAgIGlmIChmbihsaXN0W2lkeF0pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn0pKTtcblxuZXhwb3J0IGRlZmF1bHQgYW55OyIsImltcG9ydCBfY29uY2F0IGZyb20gXCIuL2ludGVybmFsL19jb25jYXQuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfcmVkdWNlIGZyb20gXCIuL2ludGVybmFsL19yZWR1Y2UuanNcIjtcbmltcG9ydCBtYXAgZnJvbSBcIi4vbWFwLmpzXCI7XG4vKipcbiAqIGFwIGFwcGxpZXMgYSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBhIGxpc3Qgb2YgdmFsdWVzLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBhcGAgbWV0aG9kIG9mIHRoZSBmaXJzdCBhcmd1bWVudCwgaWYgcHJlc2VudC4gQWxzb1xuICogdHJlYXRzIGN1cnJpZWQgZnVuY3Rpb25zIGFzIGFwcGxpY2F0aXZlcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4zLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBbYSAtPiBiXSAtPiBbYV0gLT4gW2JdXG4gKiBAc2lnIEFwcGx5IGYgPT4gZiAoYSAtPiBiKSAtPiBmIGEgLT4gZiBiXG4gKiBAc2lnIChyIC0+IGEgLT4gYikgLT4gKHIgLT4gYSkgLT4gKHIgLT4gYilcbiAqIEBwYXJhbSB7Kn0gYXBwbHlGXG4gKiBAcGFyYW0geyp9IGFwcGx5WFxuICogQHJldHVybiB7Kn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmFwKFtSLm11bHRpcGx5KDIpLCBSLmFkZCgzKV0sIFsxLDIsM10pOyAvLz0+IFsyLCA0LCA2LCA0LCA1LCA2XVxuICogICAgICBSLmFwKFtSLmNvbmNhdCgndGFzdHkgJyksIFIudG9VcHBlcl0sIFsncGl6emEnLCAnc2FsYWQnXSk7IC8vPT4gW1widGFzdHkgcGl6emFcIiwgXCJ0YXN0eSBzYWxhZFwiLCBcIlBJWlpBXCIsIFwiU0FMQURcIl1cbiAqXG4gKiAgICAgIC8vIFIuYXAgY2FuIGFsc28gYmUgdXNlZCBhcyBTIGNvbWJpbmF0b3JcbiAqICAgICAgLy8gd2hlbiBvbmx5IHR3byBmdW5jdGlvbnMgYXJlIHBhc3NlZFxuICogICAgICBSLmFwKFIuY29uY2F0LCBSLnRvVXBwZXIpKCdSYW1kYScpIC8vPT4gJ1JhbWRhUkFNREEnXG4gKiBAc3ltYiBSLmFwKFtmLCBnXSwgW2EsIGJdKSA9IFtmKGEpLCBmKGIpLCBnKGEpLCBnKGIpXVxuICovXG5cbnZhciBhcCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIGFwKGFwcGx5RiwgYXBwbHlYKSB7XG4gIHJldHVybiB0eXBlb2YgYXBwbHlYWydmYW50YXN5LWxhbmQvYXAnXSA9PT0gJ2Z1bmN0aW9uJyA/IGFwcGx5WFsnZmFudGFzeS1sYW5kL2FwJ10oYXBwbHlGKSA6IHR5cGVvZiBhcHBseUYuYXAgPT09ICdmdW5jdGlvbicgPyBhcHBseUYuYXAoYXBwbHlYKSA6IHR5cGVvZiBhcHBseUYgPT09ICdmdW5jdGlvbicgPyBmdW5jdGlvbiAoeCkge1xuICAgIHJldHVybiBhcHBseUYoeCkoYXBwbHlYKHgpKTtcbiAgfSA6IF9yZWR1Y2UoZnVuY3Rpb24gKGFjYywgZikge1xuICAgIHJldHVybiBfY29uY2F0KGFjYywgbWFwKGYsIGFwcGx5WCkpO1xuICB9LCBbXSwgYXBwbHlGKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBhcDsiLCJpbXBvcnQgX2NvbmNhdCBmcm9tIFwiLi9pbnRlcm5hbC9fY29uY2F0LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gbGlzdCwgZm9sbG93ZWQgYnlcbiAqIHRoZSBnaXZlbiBlbGVtZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgYSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0geyp9IGVsIFRoZSBlbGVtZW50IHRvIGFkZCB0byB0aGUgZW5kIG9mIHRoZSBuZXcgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3Qgb2YgZWxlbWVudHMgdG8gYWRkIGEgbmV3IGl0ZW0gdG8uXG4gKiAgICAgICAgbGlzdC5cbiAqIEByZXR1cm4ge0FycmF5fSBBIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBvbGQgbGlzdCBmb2xsb3dlZCBieSBgZWxgLlxuICogQHNlZSBSLnByZXBlbmRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmFwcGVuZCgndGVzdHMnLCBbJ3dyaXRlJywgJ21vcmUnXSk7IC8vPT4gWyd3cml0ZScsICdtb3JlJywgJ3Rlc3RzJ11cbiAqICAgICAgUi5hcHBlbmQoJ3Rlc3RzJywgW10pOyAvLz0+IFsndGVzdHMnXVxuICogICAgICBSLmFwcGVuZChbJ3Rlc3RzJ10sIFsnd3JpdGUnLCAnbW9yZSddKTsgLy89PiBbJ3dyaXRlJywgJ21vcmUnLCBbJ3Rlc3RzJ11dXG4gKi9cblxudmFyIGFwcGVuZCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIGFwcGVuZChlbCwgbGlzdCkge1xuICByZXR1cm4gX2NvbmNhdChsaXN0LCBbZWxdKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBhcHBlbmQ7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IGFzc29jUGF0aCBmcm9tIFwiLi9hc3NvY1BhdGguanNcIjtcbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIGFuIG9iamVjdCwgc2V0dGluZyBvciBvdmVycmlkaW5nIHRoZSBzcGVjaWZpZWRcbiAqIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIHZhbHVlLiBOb3RlIHRoYXQgdGhpcyBjb3BpZXMgYW5kIGZsYXR0ZW5zIHByb3RvdHlwZVxuICogcHJvcGVydGllcyBvbnRvIHRoZSBuZXcgb2JqZWN0IGFzIHdlbGwuIEFsbCBub24tcHJpbWl0aXZlIHByb3BlcnRpZXMgYXJlXG4gKiBjb3BpZWQgYnkgcmVmZXJlbmNlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjguMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludFxuICogQHNpZyBJZHggLT4gYSAtPiB7azogdn0gLT4ge2s6IHZ9XG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHByb3AgVGhlIHByb3BlcnR5IG5hbWUgdG8gc2V0XG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgbmV3IHZhbHVlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2xvbmVcbiAqIEByZXR1cm4ge09iamVjdH0gQSBuZXcgb2JqZWN0IGVxdWl2YWxlbnQgdG8gdGhlIG9yaWdpbmFsIGV4Y2VwdCBmb3IgdGhlIGNoYW5nZWQgcHJvcGVydHkuXG4gKiBAc2VlIFIuZGlzc29jLCBSLnBpY2tcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmFzc29jKCdjJywgMywge2E6IDEsIGI6IDJ9KTsgLy89PiB7YTogMSwgYjogMiwgYzogM31cbiAqL1xuXG52YXIgYXNzb2MgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MyhmdW5jdGlvbiBhc3NvYyhwcm9wLCB2YWwsIG9iaikge1xuICByZXR1cm4gYXNzb2NQYXRoKFtwcm9wXSwgdmFsLCBvYmopO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGFzc29jOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL2ludGVybmFsL19oYXMuanNcIjtcbmltcG9ydCBfaXNJbnRlZ2VyIGZyb20gXCIuL2ludGVybmFsL19pc0ludGVnZXIuanNcIjtcbmltcG9ydCBfYXNzb2MgZnJvbSBcIi4vaW50ZXJuYWwvX2Fzc29jLmpzXCI7XG5pbXBvcnQgaXNOaWwgZnJvbSBcIi4vaXNOaWwuanNcIjtcbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIGFuIG9iamVjdCwgc2V0dGluZyBvciBvdmVycmlkaW5nIHRoZSBub2RlcyByZXF1aXJlZFxuICogdG8gY3JlYXRlIHRoZSBnaXZlbiBwYXRoLCBhbmQgcGxhY2luZyB0aGUgc3BlY2lmaWMgdmFsdWUgYXQgdGhlIHRhaWwgZW5kIG9mXG4gKiB0aGF0IHBhdGguIE5vdGUgdGhhdCB0aGlzIGNvcGllcyBhbmQgZmxhdHRlbnMgcHJvdG90eXBlIHByb3BlcnRpZXMgb250byB0aGVcbiAqIG5ldyBvYmplY3QgYXMgd2VsbC4gQWxsIG5vbi1wcmltaXRpdmUgcHJvcGVydGllcyBhcmUgY29waWVkIGJ5IHJlZmVyZW5jZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC44LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgW0lkeF0gLT4gYSAtPiB7YX0gLT4ge2F9XG4gKiBAcGFyYW0ge0FycmF5fSBwYXRoIHRoZSBwYXRoIHRvIHNldFxuICogQHBhcmFtIHsqfSB2YWwgVGhlIG5ldyB2YWx1ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbCBleGNlcHQgYWxvbmcgdGhlIHNwZWNpZmllZCBwYXRoLlxuICogQHNlZSBSLmRpc3NvY1BhdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmFzc29jUGF0aChbJ2EnLCAnYicsICdjJ10sIDQyLCB7YToge2I6IHtjOiAwfX19KTsgLy89PiB7YToge2I6IHtjOiA0Mn19fVxuICpcbiAqICAgICAgLy8gQW55IG1pc3Npbmcgb3Igbm9uLW9iamVjdCBrZXlzIGluIHBhdGggd2lsbCBiZSBvdmVycmlkZGVuXG4gKiAgICAgIFIuYXNzb2NQYXRoKFsnYScsICdiJywgJ2MnXSwgNDIsIHthOiA1fSk7IC8vPT4ge2E6IHtiOiB7YzogNDJ9fX1cbiAqL1xuXG52YXIgYXNzb2NQYXRoID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTMoZnVuY3Rpb24gYXNzb2NQYXRoKHBhdGgsIHZhbCwgb2JqKSB7XG4gIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICB2YXIgaWR4ID0gcGF0aFswXTtcblxuICBpZiAocGF0aC5sZW5ndGggPiAxKSB7XG4gICAgdmFyIG5leHRPYmogPSAhaXNOaWwob2JqKSAmJiBfaGFzKGlkeCwgb2JqKSAmJiB0eXBlb2Ygb2JqW2lkeF0gPT09ICdvYmplY3QnID8gb2JqW2lkeF0gOiBfaXNJbnRlZ2VyKHBhdGhbMV0pID8gW10gOiB7fTtcbiAgICB2YWwgPSBhc3NvY1BhdGgoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocGF0aCwgMSksIHZhbCwgbmV4dE9iaik7XG4gIH1cblxuICByZXR1cm4gX2Fzc29jKGlkeCwgdmFsLCBvYmopO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGFzc29jUGF0aDsiLCJpbXBvcnQgX2FyaXR5IGZyb20gXCIuL2ludGVybmFsL19hcml0eS5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpcyBib3VuZCB0byBhIGNvbnRleHQuXG4gKiBOb3RlOiBgUi5iaW5kYCBkb2VzIG5vdCBwcm92aWRlIHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50LWJpbmRpbmcgY2FwYWJpbGl0aWVzIG9mXG4gKiBbRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Z1bmN0aW9uL2JpbmQpLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjYuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnICgqIC0+ICopIC0+IHsqfSAtPiAoKiAtPiAqKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGJpbmQgdG8gY29udGV4dFxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNPYmogVGhlIGNvbnRleHQgdG8gYmluZCBgZm5gIHRvXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBmdW5jdGlvbiB0aGF0IHdpbGwgZXhlY3V0ZSBpbiB0aGUgY29udGV4dCBvZiBgdGhpc09iamAuXG4gKiBAc2VlIFIucGFydGlhbFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGxvZyA9IFIuYmluZChjb25zb2xlLmxvZywgY29uc29sZSk7XG4gKiAgICAgIFIucGlwZShSLmFzc29jKCdhJywgMiksIFIudGFwKGxvZyksIFIuYXNzb2MoJ2EnLCAzKSkoe2E6IDF9KTsgLy89PiB7YTogM31cbiAqICAgICAgLy8gbG9ncyB7YTogMn1cbiAqIEBzeW1iIFIuYmluZChmLCBvKShhLCBiKSA9IGYuY2FsbChvLCBhLCBiKVxuICovXG5cbnZhciBiaW5kID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gYmluZChmbiwgdGhpc09iaikge1xuICByZXR1cm4gX2FyaXR5KGZuLmxlbmd0aCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGlzT2JqLCBhcmd1bWVudHMpO1xuICB9KTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBiaW5kOyIsImltcG9ydCBfY2xvbmUgZnJvbSBcIi4vaW50ZXJuYWwvX2Nsb25lLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG4vKipcbiAqIENyZWF0ZXMgYSBkZWVwIGNvcHkgb2YgdGhlIHNvdXJjZSB0aGF0IGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZSBzb3VyY2VcbiAqIG9iamVjdCB3aXRob3V0IHJldGFpbmluZyBhbnkgcmVmZXJlbmNlcyB0byBpdC5cbiAqIFRoZSBzb3VyY2Ugb2JqZWN0IG1heSBjb250YWluIChuZXN0ZWQpIGBBcnJheWBzIGFuZCBgT2JqZWN0YHMsXG4gKiBgTnVtYmVyYHMsIGBTdHJpbmdgcywgYEJvb2xlYW5gcyBhbmQgYERhdGVgcy5cbiAqIGBGdW5jdGlvbmBzIGFyZSBhc3NpZ25lZCBieSByZWZlcmVuY2UgcmF0aGVyIHRoYW4gY29waWVkLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gYSBgY2xvbmVgIG1ldGhvZCBpZiBwcmVzZW50LlxuICpcbiAqIE5vdGUgdGhhdCBpZiB0aGUgc291cmNlIG9iamVjdCBoYXMgbXVsdGlwbGUgbm9kZXMgdGhhdCBzaGFyZSBhIHJlZmVyZW5jZSxcbiAqIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBoYXZlIHRoZSBzYW1lIHN0cnVjdHVyZSwgYnV0IHRoZSByZWZlcmVuY2VzIHdpbGxcbiAqIGJlIHBvaW50ZWQgdG8gdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgY2xvbmVkIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7Kn0gLT4geyp9XG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBvYmplY3Qgb3IgYXJyYXkgdG8gY2xvbmVcbiAqIEByZXR1cm4geyp9IEEgZGVlcGx5IGNsb25lZCBjb3B5IG9mIGB2YWxgXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3Qgb2JqZWN0cyA9IFt7fSwge30sIHt9XTtcbiAqICAgICAgY29uc3Qgb2JqZWN0c0Nsb25lID0gUi5jbG9uZShvYmplY3RzKTtcbiAqICAgICAgb2JqZWN0cyA9PT0gb2JqZWN0c0Nsb25lOyAvLz0+IGZhbHNlXG4gKiAgICAgIG9iamVjdHNbMF0gPT09IG9iamVjdHNDbG9uZVswXTsgLy89PiBmYWxzZVxuICovXG5cbnZhciBjbG9uZSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIGNsb25lKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZS5jbG9uZSA9PT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLmNsb25lKCkgOiBfY2xvbmUodmFsdWUsIHRydWUpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsb25lOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbi8qKlxuICogTWFrZXMgYSBjb21wYXJhdG9yIGZ1bmN0aW9uIG91dCBvZiBhIGZ1bmN0aW9uIHRoYXQgcmVwb3J0cyB3aGV0aGVyIHRoZSBmaXJzdFxuICogZWxlbWVudCBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKGEsIGIpIC0+IEJvb2xlYW4pIC0+ICgoYSwgYikgLT4gTnVtYmVyKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCBBIHByZWRpY2F0ZSBmdW5jdGlvbiBvZiBhcml0eSB0d28gd2hpY2ggd2lsbCByZXR1cm4gYHRydWVgIGlmIHRoZSBmaXJzdCBhcmd1bWVudFxuICogaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBGdW5jdGlvbiA6OiBhIC0+IGIgLT4gSW50IHRoYXQgcmV0dXJucyBgLTFgIGlmIGEgPCBiLCBgMWAgaWYgYiA8IGEsIG90aGVyd2lzZSBgMGBcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBieUFnZSA9IFIuY29tcGFyYXRvcigoYSwgYikgPT4gYS5hZ2UgPCBiLmFnZSk7XG4gKiAgICAgIGNvbnN0IHBlb3BsZSA9IFtcbiAqICAgICAgICB7IG5hbWU6ICdFbW1hJywgYWdlOiA3MCB9LFxuICogICAgICAgIHsgbmFtZTogJ1BldGVyJywgYWdlOiA3OCB9LFxuICogICAgICAgIHsgbmFtZTogJ01pa2hhaWwnLCBhZ2U6IDYyIH0sXG4gKiAgICAgIF07XG4gKiAgICAgIGNvbnN0IHBlb3BsZUJ5SW5jcmVhc2luZ0FnZSA9IFIuc29ydChieUFnZSwgcGVvcGxlKTtcbiAqICAgICAgICAvLz0+IFt7IG5hbWU6ICdNaWtoYWlsJywgYWdlOiA2MiB9LHsgbmFtZTogJ0VtbWEnLCBhZ2U6IDcwIH0sIHsgbmFtZTogJ1BldGVyJywgYWdlOiA3OCB9XVxuICovXG5cbnZhciBjb21wYXJhdG9yID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoZnVuY3Rpb24gY29tcGFyYXRvcihwcmVkKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBwcmVkKGEsIGIpID8gLTEgOiBwcmVkKGIsIGEpID8gMSA6IDA7XG4gIH07XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgY29tcGFyYXRvcjsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJyYXkuanNcIjtcbmltcG9ydCBfaXNGdW5jdGlvbiBmcm9tIFwiLi9pbnRlcm5hbC9faXNGdW5jdGlvbi5qc1wiO1xuaW1wb3J0IF9pc1N0cmluZyBmcm9tIFwiLi9pbnRlcm5hbC9faXNTdHJpbmcuanNcIjtcbmltcG9ydCB0b1N0cmluZyBmcm9tIFwiLi90b1N0cmluZy5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29uY2F0ZW5hdGluZyB0aGUgZ2l2ZW4gbGlzdHMgb3Igc3RyaW5ncy5cbiAqXG4gKiBOb3RlOiBgUi5jb25jYXRgIGV4cGVjdHMgYm90aCBhcmd1bWVudHMgdG8gYmUgb2YgdGhlIHNhbWUgdHlwZSxcbiAqIHVubGlrZSB0aGUgbmF0aXZlIGBBcnJheS5wcm90b3R5cGUuY29uY2F0YCBtZXRob2QuIEl0IHdpbGwgdGhyb3dcbiAqIGFuIGVycm9yIGlmIHlvdSBgY29uY2F0YCBhbiBBcnJheSB3aXRoIGEgbm9uLUFycmF5IHZhbHVlLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBjb25jYXRgIG1ldGhvZCBvZiB0aGUgZmlyc3QgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKiBDYW4gYWxzbyBjb25jYXRlbmF0ZSB0d28gbWVtYmVycyBvZiBhIFtmYW50YXN5LWxhbmRcbiAqIGNvbXBhdGlibGUgc2VtaWdyb3VwXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI3NlbWlncm91cCkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2FdIC0+IFthXVxuICogQHNpZyBTdHJpbmcgLT4gU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IGZpcnN0TGlzdCBUaGUgZmlyc3QgbGlzdFxuICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IHNlY29uZExpc3QgVGhlIHNlY29uZCBsaXN0XG4gKiBAcmV0dXJuIHtBcnJheXxTdHJpbmd9IEEgbGlzdCBjb25zaXN0aW5nIG9mIHRoZSBlbGVtZW50cyBvZiBgZmlyc3RMaXN0YCBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMgb2ZcbiAqIGBzZWNvbmRMaXN0YC5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5jb25jYXQoJ0FCQycsICdERUYnKTsgLy8gJ0FCQ0RFRidcbiAqICAgICAgUi5jb25jYXQoWzQsIDUsIDZdLCBbMSwgMiwgM10pOyAvLz0+IFs0LCA1LCA2LCAxLCAyLCAzXVxuICogICAgICBSLmNvbmNhdChbXSwgW10pOyAvLz0+IFtdXG4gKi9cblxudmFyIGNvbmNhdCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIGNvbmNhdChhLCBiKSB7XG4gIGlmIChfaXNBcnJheShhKSkge1xuICAgIGlmIChfaXNBcnJheShiKSkge1xuICAgICAgcmV0dXJuIGEuY29uY2F0KGIpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IodG9TdHJpbmcoYikgKyAnIGlzIG5vdCBhbiBhcnJheScpO1xuICB9XG5cbiAgaWYgKF9pc1N0cmluZyhhKSkge1xuICAgIGlmIChfaXNTdHJpbmcoYikpIHtcbiAgICAgIHJldHVybiBhICsgYjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHRvU3RyaW5nKGIpICsgJyBpcyBub3QgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIGlmIChhICE9IG51bGwgJiYgX2lzRnVuY3Rpb24oYVsnZmFudGFzeS1sYW5kL2NvbmNhdCddKSkge1xuICAgIHJldHVybiBhWydmYW50YXN5LWxhbmQvY29uY2F0J10oYik7XG4gIH1cblxuICBpZiAoYSAhPSBudWxsICYmIF9pc0Z1bmN0aW9uKGEuY29uY2F0KSkge1xuICAgIHJldHVybiBhLmNvbmNhdChiKTtcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IodG9TdHJpbmcoYSkgKyAnIGRvZXMgbm90IGhhdmUgYSBtZXRob2QgbmFtZWQgXCJjb25jYXRcIiBvciBcImZhbnRhc3ktbGFuZC9jb25jYXRcIicpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbmNhdDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX21hcCBmcm9tIFwiLi9pbnRlcm5hbC9fbWFwLmpzXCI7XG5pbXBvcnQgY3VycnlOIGZyb20gXCIuL2N1cnJ5Ti5qc1wiO1xuaW1wb3J0IG1heCBmcm9tIFwiLi9tYXguanNcIjtcbmltcG9ydCBwbHVjayBmcm9tIFwiLi9wbHVjay5qc1wiO1xuaW1wb3J0IHJlZHVjZSBmcm9tIFwiLi9yZWR1Y2UuanNcIjtcbi8qKlxuICogQWNjZXB0cyBhIGNvbnZlcmdpbmcgZnVuY3Rpb24gYW5kIGEgbGlzdCBvZiBicmFuY2hpbmcgZnVuY3Rpb25zIGFuZCByZXR1cm5zXG4gKiBhIG5ldyBmdW5jdGlvbi4gVGhlIGFyaXR5IG9mIHRoZSBuZXcgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGFyaXR5IG9mXG4gKiB0aGUgbG9uZ2VzdCBicmFuY2hpbmcgZnVuY3Rpb24uIFdoZW4gaW52b2tlZCwgdGhpcyBuZXcgZnVuY3Rpb24gaXMgYXBwbGllZFxuICogdG8gc29tZSBhcmd1bWVudHMsIGFuZCBlYWNoIGJyYW5jaGluZyBmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIHRob3NlIHNhbWVcbiAqIGFyZ3VtZW50cy4gVGhlIHJlc3VsdHMgb2YgZWFjaCBicmFuY2hpbmcgZnVuY3Rpb24gYXJlIHBhc3NlZCBhcyBhcmd1bWVudHNcbiAqIHRvIHRoZSBjb252ZXJnaW5nIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHJldHVybiB2YWx1ZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC40LjJcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKHgxLCB4MiwgLi4uKSAtPiB6KSAtPiBbKChhLCBiLCAuLi4pIC0+IHgxKSwgKChhLCBiLCAuLi4pIC0+IHgyKSwgLi4uXSAtPiAoYSAtPiBiIC0+IC4uLiAtPiB6KVxuICogQHBhcmFtIHtGdW5jdGlvbn0gYWZ0ZXIgQSBmdW5jdGlvbi4gYGFmdGVyYCB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUgcmV0dXJuIHZhbHVlcyBvZlxuICogICAgICAgIGBmbjFgIGFuZCBgZm4yYCBhcyBpdHMgYXJndW1lbnRzLlxuICogQHBhcmFtIHtBcnJheX0gZnVuY3Rpb25zIEEgbGlzdCBvZiBmdW5jdGlvbnMuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcgZnVuY3Rpb24uXG4gKiBAc2VlIFIudXNlV2l0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGF2ZXJhZ2UgPSBSLmNvbnZlcmdlKFIuZGl2aWRlLCBbUi5zdW0sIFIubGVuZ3RoXSlcbiAqICAgICAgYXZlcmFnZShbMSwgMiwgMywgNCwgNSwgNiwgN10pIC8vPT4gNFxuICpcbiAqICAgICAgY29uc3Qgc3RyYW5nZUNvbmNhdCA9IFIuY29udmVyZ2UoUi5jb25jYXQsIFtSLnRvVXBwZXIsIFIudG9Mb3dlcl0pXG4gKiAgICAgIHN0cmFuZ2VDb25jYXQoXCJZb2RlbFwiKSAvLz0+IFwiWU9ERUx5b2RlbFwiXG4gKlxuICogQHN5bWIgUi5jb252ZXJnZShmLCBbZywgaF0pKGEsIGIpID0gZihnKGEsIGIpLCBoKGEsIGIpKVxuICovXG5cbnZhciBjb252ZXJnZSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIGNvbnZlcmdlKGFmdGVyLCBmbnMpIHtcbiAgcmV0dXJuIGN1cnJ5TihyZWR1Y2UobWF4LCAwLCBwbHVjaygnbGVuZ3RoJywgZm5zKSksIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgcmV0dXJuIGFmdGVyLmFwcGx5KGNvbnRleHQsIF9tYXAoZnVuY3Rpb24gKGZuKSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgfSwgZm5zKSk7XG4gIH0pO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbnZlcmdlOyIsImltcG9ydCBfYXJpdHkgZnJvbSBcIi4vaW50ZXJuYWwvX2FyaXR5LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2N1cnJ5TiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnlOLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSBjdXJyaWVkIGVxdWl2YWxlbnQgb2YgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLCB3aXRoIHRoZSBzcGVjaWZpZWRcbiAqIGFyaXR5LiBUaGUgY3VycmllZCBmdW5jdGlvbiBoYXMgdHdvIHVudXN1YWwgY2FwYWJpbGl0aWVzLiBGaXJzdCwgaXRzXG4gKiBhcmd1bWVudHMgbmVlZG4ndCBiZSBwcm92aWRlZCBvbmUgYXQgYSB0aW1lLiBJZiBgZ2AgaXMgYFIuY3VycnlOKDMsIGYpYCwgdGhlXG4gKiBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEpKDIpKDMpYFxuICogICAtIGBnKDEpKDIsIDMpYFxuICogICAtIGBnKDEsIDIpKDMpYFxuICogICAtIGBnKDEsIDIsIDMpYFxuICpcbiAqIFNlY29uZGx5LCB0aGUgc3BlY2lhbCBwbGFjZWhvbGRlciB2YWx1ZSBbYFIuX19gXSgjX18pIG1heSBiZSB1c2VkIHRvIHNwZWNpZnlcbiAqIFwiZ2Fwc1wiLCBhbGxvd2luZyBwYXJ0aWFsIGFwcGxpY2F0aW9uIG9mIGFueSBjb21iaW5hdGlvbiBvZiBhcmd1bWVudHMsXG4gKiByZWdhcmRsZXNzIG9mIHRoZWlyIHBvc2l0aW9ucy4gSWYgYGdgIGlzIGFzIGFib3ZlIGFuZCBgX2AgaXMgW2BSLl9fYF0oI19fKSxcbiAqIHRoZSBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEsIDIsIDMpYFxuICogICAtIGBnKF8sIDIsIDMpKDEpYFxuICogICAtIGBnKF8sIF8sIDMpKDEpKDIpYFxuICogICAtIGBnKF8sIF8sIDMpKDEsIDIpYFxuICogICAtIGBnKF8sIDIpKDEpKDMpYFxuICogICAtIGBnKF8sIDIpKDEsIDMpYFxuICogICAtIGBnKF8sIDIpKF8sIDMpKDEpYFxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjUuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIE51bWJlciAtPiAoKiAtPiBhKSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgYXJpdHkgZm9yIHRoZSByZXR1cm5lZCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG5ldywgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBzZWUgUi5jdXJyeVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHN1bUFyZ3MgPSAoLi4uYXJncykgPT4gUi5zdW0oYXJncyk7XG4gKlxuICogICAgICBjb25zdCBjdXJyaWVkQWRkRm91ck51bWJlcnMgPSBSLmN1cnJ5Tig0LCBzdW1BcmdzKTtcbiAqICAgICAgY29uc3QgZiA9IGN1cnJpZWRBZGRGb3VyTnVtYmVycygxLCAyKTtcbiAqICAgICAgY29uc3QgZyA9IGYoMyk7XG4gKiAgICAgIGcoNCk7IC8vPT4gMTBcbiAqL1xuXG52YXIgY3VycnlOID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gY3VycnlOKGxlbmd0aCwgZm4pIHtcbiAgaWYgKGxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBfY3VycnkxKGZuKTtcbiAgfVxuXG4gIHJldHVybiBfYXJpdHkobGVuZ3RoLCBfY3VycnlOKGxlbmd0aCwgW10sIGZuKSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgY3VycnlOOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbi8qKlxuICogUmV0dXJucyB0aGUgc2Vjb25kIGFyZ3VtZW50IGlmIGl0IGlzIG5vdCBgbnVsbGAsIGB1bmRlZmluZWRgIG9yIGBOYU5gO1xuICogb3RoZXJ3aXNlIHRoZSBmaXJzdCBhcmd1bWVudCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xMC4wXG4gKiBAY2F0ZWdvcnkgTG9naWNcbiAqIEBzaWcgYSAtPiBiIC0+IGEgfCBiXG4gKiBAcGFyYW0ge2F9IGRlZmF1bHQgVGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAcGFyYW0ge2J9IHZhbCBgdmFsYCB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQgb2YgYGRlZmF1bHRgIHVubGVzcyBgdmFsYCBpcyBgbnVsbGAsIGB1bmRlZmluZWRgIG9yIGBOYU5gLlxuICogQHJldHVybiB7Kn0gVGhlIHNlY29uZCB2YWx1ZSBpZiBpdCBpcyBub3QgYG51bGxgLCBgdW5kZWZpbmVkYCBvciBgTmFOYCwgb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IHZhbHVlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZGVmYXVsdFRvNDIgPSBSLmRlZmF1bHRUbyg0Mik7XG4gKlxuICogICAgICBkZWZhdWx0VG80MihudWxsKTsgIC8vPT4gNDJcbiAqICAgICAgZGVmYXVsdFRvNDIodW5kZWZpbmVkKTsgIC8vPT4gNDJcbiAqICAgICAgZGVmYXVsdFRvNDIoZmFsc2UpOyAgLy89PiBmYWxzZVxuICogICAgICBkZWZhdWx0VG80MignUmFtZGEnKTsgIC8vPT4gJ1JhbWRhJ1xuICogICAgICAvLyBwYXJzZUludCgnc3RyaW5nJykgcmVzdWx0cyBpbiBOYU5cbiAqICAgICAgZGVmYXVsdFRvNDIocGFyc2VJbnQoJ3N0cmluZycpKTsgLy89PiA0MlxuICovXG5cbnZhciBkZWZhdWx0VG8gPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBkZWZhdWx0VG8oZCwgdikge1xuICByZXR1cm4gdiA9PSBudWxsIHx8IHYgIT09IHYgPyBkIDogdjtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0VG87IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9TZXQgZnJvbSBcIi4vaW50ZXJuYWwvX1NldC5qc1wiO1xuLyoqXG4gKiBGaW5kcyB0aGUgc2V0IChpLmUuIG5vIGR1cGxpY2F0ZXMpIG9mIGFsbCBlbGVtZW50cyBpbiB0aGUgZmlyc3QgbGlzdCBub3RcbiAqIGNvbnRhaW5lZCBpbiB0aGUgc2Vjb25kIGxpc3QuIE9iamVjdHMgYW5kIEFycmF5cyBhcmUgY29tcGFyZWQgaW4gdGVybXMgb2ZcbiAqIHZhbHVlIGVxdWFsaXR5LCBub3QgcmVmZXJlbmNlIGVxdWFsaXR5LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIFsqXSAtPiBbKl0gLT4gWypdXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MSBUaGUgZmlyc3QgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QyIFRoZSBzZWNvbmQgbGlzdC5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgZWxlbWVudHMgaW4gYGxpc3QxYCB0aGF0IGFyZSBub3QgaW4gYGxpc3QyYC5cbiAqIEBzZWUgUi5kaWZmZXJlbmNlV2l0aCwgUi5zeW1tZXRyaWNEaWZmZXJlbmNlLCBSLnN5bW1ldHJpY0RpZmZlcmVuY2VXaXRoLCBSLndpdGhvdXRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmRpZmZlcmVuY2UoWzEsMiwzLDRdLCBbNyw2LDUsNCwzXSk7IC8vPT4gWzEsMl1cbiAqICAgICAgUi5kaWZmZXJlbmNlKFs3LDYsNSw0LDNdLCBbMSwyLDMsNF0pOyAvLz0+IFs3LDYsNV1cbiAqICAgICAgUi5kaWZmZXJlbmNlKFt7YTogMX0sIHtiOiAyfV0sIFt7YTogMX0sIHtjOiAzfV0pIC8vPT4gW3tiOiAyfV1cbiAqL1xuXG52YXIgZGlmZmVyZW5jZSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIGRpZmZlcmVuY2UoZmlyc3QsIHNlY29uZCkge1xuICB2YXIgb3V0ID0gW107XG4gIHZhciBpZHggPSAwO1xuICB2YXIgZmlyc3RMZW4gPSBmaXJzdC5sZW5ndGg7XG4gIHZhciBzZWNvbmRMZW4gPSBzZWNvbmQubGVuZ3RoO1xuICB2YXIgdG9GaWx0ZXJPdXQgPSBuZXcgX1NldCgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2Vjb25kTGVuOyBpICs9IDEpIHtcbiAgICB0b0ZpbHRlck91dC5hZGQoc2Vjb25kW2ldKTtcbiAgfVxuXG4gIHdoaWxlIChpZHggPCBmaXJzdExlbikge1xuICAgIGlmICh0b0ZpbHRlck91dC5hZGQoZmlyc3RbaWR4XSkpIHtcbiAgICAgIG91dFtvdXQubGVuZ3RoXSA9IGZpcnN0W2lkeF07XG4gICAgfVxuXG4gICAgaWR4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGRpZmZlcmVuY2U7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGRpc3NvY1BhdGggZnJvbSBcIi4vZGlzc29jUGF0aC5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IG9iamVjdCB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYSBgcHJvcGAgcHJvcGVydHkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyBTdHJpbmcgLT4ge2s6IHZ9IC0+IHtrOiB2fVxuICogQHBhcmFtIHtTdHJpbmd9IHByb3AgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGRpc3NvY2lhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBjbG9uZVxuICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3QgZXF1aXZhbGVudCB0byB0aGUgb3JpZ2luYWwgYnV0IHdpdGhvdXQgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eVxuICogQHNlZSBSLmFzc29jLCBSLm9taXRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmRpc3NvYygnYicsIHthOiAxLCBiOiAyLCBjOiAzfSk7IC8vPT4ge2E6IDEsIGM6IDN9XG4gKi9cblxudmFyIGRpc3NvYyA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIGRpc3NvYyhwcm9wLCBvYmopIHtcbiAgcmV0dXJuIGRpc3NvY1BhdGgoW3Byb3BdLCBvYmopO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGRpc3NvYzsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2Rpc3NvYyBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzc29jLmpzXCI7XG5pbXBvcnQgX2lzSW50ZWdlciBmcm9tIFwiLi9pbnRlcm5hbC9faXNJbnRlZ2VyLmpzXCI7XG5pbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJyYXkuanNcIjtcbmltcG9ydCBhc3NvYyBmcm9tIFwiLi9hc3NvYy5qc1wiO1xuLyoqXG4gKiBNYWtlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYW4gb2JqZWN0LiBOb3RlIHRoYXQgdGhpcyBjb3BpZXMgYW5kIGZsYXR0ZW5zXG4gKiBwcm90b3R5cGUgcHJvcGVydGllcyBvbnRvIHRoZSBuZXcgb2JqZWN0IGFzIHdlbGwuIEFsbCBub24tcHJpbWl0aXZlXG4gKiBwcm9wZXJ0aWVzIGFyZSBjb3BpZWQgYnkgcmVmZXJlbmNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ3xJbnRlZ2VyfSBwcm9wIFRoZSBwcm9wIG9wZXJhdGluZ1xuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R8QXJyYXl9IEEgbmV3IG9iamVjdCBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbC5cbiAqL1xuXG5mdW5jdGlvbiBfc2hhbGxvd0Nsb25lT2JqZWN0KHByb3AsIG9iaikge1xuICBpZiAoX2lzSW50ZWdlcihwcm9wKSAmJiBfaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdChvYmopO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gb2JqKSB7XG4gICAgcmVzdWx0W3BdID0gb2JqW3BdO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIGFuIG9iamVjdCwgb21pdHRpbmcgdGhlIHByb3BlcnR5IGF0IHRoZSBnaXZlbiBwYXRoLlxuICogTm90ZSB0aGF0IHRoaXMgY29waWVzIGFuZCBmbGF0dGVucyBwcm90b3R5cGUgcHJvcGVydGllcyBvbnRvIHRoZSBuZXcgb2JqZWN0XG4gKiBhcyB3ZWxsLiBBbGwgbm9uLXByaW1pdGl2ZSBwcm9wZXJ0aWVzIGFyZSBjb3BpZWQgYnkgcmVmZXJlbmNlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjExLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgW0lkeF0gLT4ge2s6IHZ9IC0+IHtrOiB2fVxuICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byB0aGUgdmFsdWUgdG8gb21pdFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCB3aXRob3V0IHRoZSBwcm9wZXJ0eSBhdCBwYXRoXG4gKiBAc2VlIFIuYXNzb2NQYXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5kaXNzb2NQYXRoKFsnYScsICdiJywgJ2MnXSwge2E6IHtiOiB7YzogNDJ9fX0pOyAvLz0+IHthOiB7Yjoge319fVxuICovXG5cblxudmFyIGRpc3NvY1BhdGggPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBkaXNzb2NQYXRoKHBhdGgsIG9iaikge1xuICBpZiAob2JqID09IG51bGwpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgc3dpdGNoIChwYXRoLmxlbmd0aCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBvYmo7XG5cbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gX2Rpc3NvYyhwYXRoWzBdLCBvYmopO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHZhciBoZWFkID0gcGF0aFswXTtcbiAgICAgIHZhciB0YWlsID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocGF0aCwgMSk7XG5cbiAgICAgIGlmIChvYmpbaGVhZF0gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gX3NoYWxsb3dDbG9uZU9iamVjdChoZWFkLCBvYmopO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFzc29jKGhlYWQsIGRpc3NvY1BhdGgodGFpbCwgb2JqW2hlYWRdKSwgb2JqKTtcbiAgICAgIH1cblxuICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZGlzc29jUGF0aDsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX2lzQXJndW1lbnRzIGZyb20gXCIuL2ludGVybmFsL19pc0FyZ3VtZW50cy5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL2ludGVybmFsL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgX2lzT2JqZWN0IGZyb20gXCIuL2ludGVybmFsL19pc09iamVjdC5qc1wiO1xuaW1wb3J0IF9pc1N0cmluZyBmcm9tIFwiLi9pbnRlcm5hbC9faXNTdHJpbmcuanNcIjtcbmltcG9ydCBfaXNUeXBlZEFycmF5IGZyb20gXCIuL2ludGVybmFsL19pc1R5cGVkQXJyYXkuanNcIjtcbi8qKlxuICogUmV0dXJucyB0aGUgZW1wdHkgdmFsdWUgb2YgaXRzIGFyZ3VtZW50J3MgdHlwZS4gUmFtZGEgZGVmaW5lcyB0aGUgZW1wdHlcbiAqIHZhbHVlIG9mIEFycmF5IChgW11gKSwgT2JqZWN0IChge31gKSwgU3RyaW5nIChgJydgKSxcbiAqIFR5cGVkQXJyYXkgKGBVaW50OEFycmF5IFtdYCwgYEZsb2F0MzJBcnJheSBbXWAsIGV0YyksIGFuZCBBcmd1bWVudHMuIE90aGVyXG4gKiB0eXBlcyBhcmUgc3VwcG9ydGVkIGlmIHRoZXkgZGVmaW5lIGA8VHlwZT4uZW1wdHlgLFxuICogYDxUeXBlPi5wcm90b3R5cGUuZW1wdHlgIG9yIGltcGxlbWVudCB0aGVcbiAqIFtGYW50YXN5TGFuZCBNb25vaWQgc3BlY10oaHR0cHM6Ly9naXRodWIuY29tL2ZhbnRhc3lsYW5kL2ZhbnRhc3ktbGFuZCNtb25vaWQpLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBlbXB0eWAgbWV0aG9kIG9mIHRoZSBmaXJzdCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4zLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBhIC0+IGFcbiAqIEBwYXJhbSB7Kn0geFxuICogQHJldHVybiB7Kn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmVtcHR5KEp1c3QoNDIpKTsgICAgICAgICAgICAgICAvLz0+IE5vdGhpbmcoKVxuICogICAgICBSLmVtcHR5KFsxLCAyLCAzXSk7ICAgICAgICAgICAgICAvLz0+IFtdXG4gKiAgICAgIFIuZW1wdHkoJ3VuaWNvcm5zJyk7ICAgICAgICAgICAgIC8vPT4gJydcbiAqICAgICAgUi5lbXB0eSh7eDogMSwgeTogMn0pOyAgICAgICAgICAgLy89PiB7fVxuICogICAgICBSLmVtcHR5KFVpbnQ4QXJyYXkuZnJvbSgnMTIzJykpOyAvLz0+IFVpbnQ4QXJyYXkgW11cbiAqL1xuXG52YXIgZW1wdHkgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiBlbXB0eSh4KSB7XG4gIHJldHVybiB4ICE9IG51bGwgJiYgdHlwZW9mIHhbJ2ZhbnRhc3ktbGFuZC9lbXB0eSddID09PSAnZnVuY3Rpb24nID8geFsnZmFudGFzeS1sYW5kL2VtcHR5J10oKSA6IHggIT0gbnVsbCAmJiB4LmNvbnN0cnVjdG9yICE9IG51bGwgJiYgdHlwZW9mIHguY29uc3RydWN0b3JbJ2ZhbnRhc3ktbGFuZC9lbXB0eSddID09PSAnZnVuY3Rpb24nID8geC5jb25zdHJ1Y3RvclsnZmFudGFzeS1sYW5kL2VtcHR5J10oKSA6IHggIT0gbnVsbCAmJiB0eXBlb2YgeC5lbXB0eSA9PT0gJ2Z1bmN0aW9uJyA/IHguZW1wdHkoKSA6IHggIT0gbnVsbCAmJiB4LmNvbnN0cnVjdG9yICE9IG51bGwgJiYgdHlwZW9mIHguY29uc3RydWN0b3IuZW1wdHkgPT09ICdmdW5jdGlvbicgPyB4LmNvbnN0cnVjdG9yLmVtcHR5KCkgOiBfaXNBcnJheSh4KSA/IFtdIDogX2lzU3RyaW5nKHgpID8gJycgOiBfaXNPYmplY3QoeCkgPyB7fSA6IF9pc0FyZ3VtZW50cyh4KSA/IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzO1xuICB9KCkgOiBfaXNUeXBlZEFycmF5KHgpID8geC5jb25zdHJ1Y3Rvci5mcm9tKCcnKSA6IHZvaWQgMCAvLyBlbHNlXG4gIDtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBlbXB0eTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2VxdWFscyBmcm9tIFwiLi9pbnRlcm5hbC9fZXF1YWxzLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIGl0cyBhcmd1bWVudHMgYXJlIGVxdWl2YWxlbnQsIGBmYWxzZWAgb3RoZXJ3aXNlLiBIYW5kbGVzXG4gKiBjeWNsaWNhbCBkYXRhIHN0cnVjdHVyZXMuXG4gKlxuICogRGlzcGF0Y2hlcyBzeW1tZXRyaWNhbGx5IHRvIHRoZSBgZXF1YWxzYCBtZXRob2RzIG9mIGJvdGggYXJndW1lbnRzLCBpZlxuICogcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgYSAtPiBiIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuZXF1YWxzKDEsIDEpOyAvLz0+IHRydWVcbiAqICAgICAgUi5lcXVhbHMoMSwgJzEnKTsgLy89PiBmYWxzZVxuICogICAgICBSLmVxdWFscyhbMSwgMiwgM10sIFsxLCAyLCAzXSk7IC8vPT4gdHJ1ZVxuICpcbiAqICAgICAgY29uc3QgYSA9IHt9OyBhLnYgPSBhO1xuICogICAgICBjb25zdCBiID0ge307IGIudiA9IGI7XG4gKiAgICAgIFIuZXF1YWxzKGEsIGIpOyAvLz0+IHRydWVcbiAqL1xuXG52YXIgZXF1YWxzID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIF9lcXVhbHMoYSwgYiwgW10sIFtdKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBlcXVhbHM7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL2ludGVybmFsL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgX2lzT2JqZWN0IGZyb20gXCIuL2ludGVybmFsL19pc09iamVjdC5qc1wiO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG9iamVjdCBieSByZWN1cnNpdmVseSBldm9sdmluZyBhIHNoYWxsb3cgY29weSBvZiBgb2JqZWN0YCxcbiAqIGFjY29yZGluZyB0byB0aGUgYHRyYW5zZm9ybWF0aW9uYCBmdW5jdGlvbnMuIEFsbCBub24tcHJpbWl0aXZlIHByb3BlcnRpZXNcbiAqIGFyZSBjb3BpZWQgYnkgcmVmZXJlbmNlLlxuICpcbiAqIEEgYHRyYW5zZm9ybWF0aW9uYCBmdW5jdGlvbiB3aWxsIG5vdCBiZSBpbnZva2VkIGlmIGl0cyBjb3JyZXNwb25kaW5nIGtleVxuICogZG9lcyBub3QgZXhpc3QgaW4gdGhlIGV2b2x2ZWQgb2JqZWN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjkuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7azogKHYgLT4gdil9IC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7T2JqZWN0fSB0cmFuc2Zvcm1hdGlvbnMgVGhlIG9iamVjdCBzcGVjaWZ5aW5nIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucyB0byBhcHBseVxuICogICAgICAgIHRvIHRoZSBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgdHJhbnNmb3JtZWQuXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSB0cmFuc2Zvcm1lZCBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgdG9tYXRvID0ge2ZpcnN0TmFtZTogJyAgVG9tYXRvICcsIGRhdGE6IHtlbGFwc2VkOiAxMDAsIHJlbWFpbmluZzogMTQwMH0sIGlkOjEyM307XG4gKiAgICAgIGNvbnN0IHRyYW5zZm9ybWF0aW9ucyA9IHtcbiAqICAgICAgICBmaXJzdE5hbWU6IFIudHJpbSxcbiAqICAgICAgICBsYXN0TmFtZTogUi50cmltLCAvLyBXaWxsIG5vdCBnZXQgaW52b2tlZC5cbiAqICAgICAgICBkYXRhOiB7ZWxhcHNlZDogUi5hZGQoMSksIHJlbWFpbmluZzogUi5hZGQoLTEpfVxuICogICAgICB9O1xuICogICAgICBSLmV2b2x2ZSh0cmFuc2Zvcm1hdGlvbnMsIHRvbWF0byk7IC8vPT4ge2ZpcnN0TmFtZTogJ1RvbWF0bycsIGRhdGE6IHtlbGFwc2VkOiAxMDEsIHJlbWFpbmluZzogMTM5OX0sIGlkOjEyM31cbiAqL1xuXG52YXIgZXZvbHZlID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gZXZvbHZlKHRyYW5zZm9ybWF0aW9ucywgb2JqZWN0KSB7XG4gIGlmICghX2lzT2JqZWN0KG9iamVjdCkgJiYgIV9pc0FycmF5KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0O1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IG9iamVjdCBpbnN0YW5jZW9mIEFycmF5ID8gW10gOiB7fTtcbiAgdmFyIHRyYW5zZm9ybWF0aW9uLCBrZXksIHR5cGU7XG5cbiAgZm9yIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgdHJhbnNmb3JtYXRpb24gPSB0cmFuc2Zvcm1hdGlvbnNba2V5XTtcbiAgICB0eXBlID0gdHlwZW9mIHRyYW5zZm9ybWF0aW9uO1xuICAgIHJlc3VsdFtrZXldID0gdHlwZSA9PT0gJ2Z1bmN0aW9uJyA/IHRyYW5zZm9ybWF0aW9uKG9iamVjdFtrZXldKSA6IHRyYW5zZm9ybWF0aW9uICYmIHR5cGUgPT09ICdvYmplY3QnID8gZXZvbHZlKHRyYW5zZm9ybWF0aW9uLCBvYmplY3Rba2V5XSkgOiBvYmplY3Rba2V5XTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZXZvbHZlOyIsImltcG9ydCBfYXJyYXlSZWR1Y2UgZnJvbSBcIi4vaW50ZXJuYWwvX2FycmF5UmVkdWNlLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2Rpc3BhdGNoYWJsZSBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzXCI7XG5pbXBvcnQgX2ZpbHRlciBmcm9tIFwiLi9pbnRlcm5hbC9fZmlsdGVyLmpzXCI7XG5pbXBvcnQgX2lzT2JqZWN0IGZyb20gXCIuL2ludGVybmFsL19pc09iamVjdC5qc1wiO1xuaW1wb3J0IF94ZmlsdGVyIGZyb20gXCIuL2ludGVybmFsL194ZmlsdGVyLmpzXCI7XG5pbXBvcnQga2V5cyBmcm9tIFwiLi9rZXlzLmpzXCI7XG4vKipcbiAqIFRha2VzIGEgcHJlZGljYXRlIGFuZCBhIGBGaWx0ZXJhYmxlYCwgYW5kIHJldHVybnMgYSBuZXcgZmlsdGVyYWJsZSBvZiB0aGVcbiAqIHNhbWUgdHlwZSBjb250YWluaW5nIHRoZSBtZW1iZXJzIG9mIHRoZSBnaXZlbiBmaWx0ZXJhYmxlIHdoaWNoIHNhdGlzZnkgdGhlXG4gKiBnaXZlbiBwcmVkaWNhdGUuIEZpbHRlcmFibGUgb2JqZWN0cyBpbmNsdWRlIHBsYWluIG9iamVjdHMgb3IgYW55IG9iamVjdFxuICogdGhhdCBoYXMgYSBmaWx0ZXIgbWV0aG9kIHN1Y2ggYXMgYEFycmF5YC5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgZmlsdGVyYCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyBGaWx0ZXJhYmxlIGYgPT4gKGEgLT4gQm9vbGVhbikgLT4gZiBhIC0+IGYgYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZFxuICogQHBhcmFtIHtBcnJheX0gZmlsdGVyYWJsZVxuICogQHJldHVybiB7QXJyYXl9IEZpbHRlcmFibGVcbiAqIEBzZWUgUi5yZWplY3QsIFIudHJhbnNkdWNlLCBSLmFkZEluZGV4XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgaXNFdmVuID0gbiA9PiBuICUgMiA9PT0gMDtcbiAqXG4gKiAgICAgIFIuZmlsdGVyKGlzRXZlbiwgWzEsIDIsIDMsIDRdKTsgLy89PiBbMiwgNF1cbiAqXG4gKiAgICAgIFIuZmlsdGVyKGlzRXZlbiwge2E6IDEsIGI6IDIsIGM6IDMsIGQ6IDR9KTsgLy89PiB7YjogMiwgZDogNH1cbiAqL1xuXG52YXIgZmlsdGVyID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoXG4vKiNfX1BVUkVfXyovXG5fZGlzcGF0Y2hhYmxlKFsnZmFudGFzeS1sYW5kL2ZpbHRlcicsICdmaWx0ZXInXSwgX3hmaWx0ZXIsIGZ1bmN0aW9uIChwcmVkLCBmaWx0ZXJhYmxlKSB7XG4gIHJldHVybiBfaXNPYmplY3QoZmlsdGVyYWJsZSkgPyBfYXJyYXlSZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgaWYgKHByZWQoZmlsdGVyYWJsZVtrZXldKSkge1xuICAgICAgYWNjW2tleV0gPSBmaWx0ZXJhYmxlW2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30sIGtleXMoZmlsdGVyYWJsZSkpIDogLy8gZWxzZVxuICBfZmlsdGVyKHByZWQsIGZpbHRlcmFibGUpO1xufSkpO1xuXG5leHBvcnQgZGVmYXVsdCBmaWx0ZXI7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF94ZmluZCBmcm9tIFwiLi9pbnRlcm5hbC9feGZpbmQuanNcIjtcbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCB3aGljaCBtYXRjaGVzIHRoZSBwcmVkaWNhdGUsIG9yXG4gKiBgdW5kZWZpbmVkYCBpZiBubyBlbGVtZW50IG1hdGNoZXMuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGZpbmRgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBhIHwgdW5kZWZpbmVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBlbGVtZW50IGlzIHRoZVxuICogICAgICAgIGRlc2lyZWQgb25lLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBlbGVtZW50IGZvdW5kLCBvciBgdW5kZWZpbmVkYC5cbiAqIEBzZWUgUi50cmFuc2R1Y2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCB4cyA9IFt7YTogMX0sIHthOiAyfSwge2E6IDN9XTtcbiAqICAgICAgUi5maW5kKFIucHJvcEVxKDIsICdhJykpKHhzKTsgLy89PiB7YTogMn1cbiAqICAgICAgUi5maW5kKFIucHJvcEVxKDQsICdhJykpKHhzKTsgLy89PiB1bmRlZmluZWRcbiAqL1xuXG52YXIgZmluZCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKFxuLyojX19QVVJFX18qL1xuX2Rpc3BhdGNoYWJsZShbJ2ZpbmQnXSwgX3hmaW5kLCBmdW5jdGlvbiBmaW5kKGZuLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGlmIChmbihsaXN0W2lkeF0pKSB7XG4gICAgICByZXR1cm4gbGlzdFtpZHhdO1xuICAgIH1cblxuICAgIGlkeCArPSAxO1xuICB9XG59KSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZpbmQ7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF94ZmluZEluZGV4IGZyb20gXCIuL2ludGVybmFsL194ZmluZEluZGV4LmpzXCI7XG4vKipcbiAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0IHdoaWNoIG1hdGNoZXMgdGhlXG4gKiBwcmVkaWNhdGUsIG9yIGAtMWAgaWYgbm8gZWxlbWVudCBtYXRjaGVzLlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjFcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGVsZW1lbnQgaXMgdGhlXG4gKiBkZXNpcmVkIG9uZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7TnVtYmVyfSBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgZm91bmQsIG9yIGAtMWAuXG4gKiBAc2VlIFIudHJhbnNkdWNlLCBSLmluZGV4T2ZcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCB4cyA9IFt7YTogMX0sIHthOiAyfSwge2E6IDN9XTtcbiAqICAgICAgUi5maW5kSW5kZXgoUi5wcm9wRXEoMiwgJ2EnKSkoeHMpOyAvLz0+IDFcbiAqICAgICAgUi5maW5kSW5kZXgoUi5wcm9wRXEoNCwgJ2EnKSkoeHMpOyAvLz0+IC0xXG4gKi9cblxudmFyIGZpbmRJbmRleCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKFxuLyojX19QVVJFX18qL1xuX2Rpc3BhdGNoYWJsZShbXSwgX3hmaW5kSW5kZXgsIGZ1bmN0aW9uIGZpbmRJbmRleChmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuXG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBpZiAoZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmV0dXJuIGlkeDtcbiAgICB9XG5cbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiAtMTtcbn0pKTtcblxuZXhwb3J0IGRlZmF1bHQgZmluZEluZGV4OyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBfbWFrZUZsYXQgZnJvbSBcIi4vaW50ZXJuYWwvX21ha2VGbGF0LmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBieSBwdWxsaW5nIGV2ZXJ5IGl0ZW0gb3V0IG9mIGl0IChhbmQgYWxsIGl0cyBzdWItYXJyYXlzKVxuICogYW5kIHB1dHRpbmcgdGhlbSBpbiBhIG5ldyBhcnJheSwgZGVwdGgtZmlyc3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2JdXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgZmxhdHRlbmVkIGxpc3QuXG4gKiBAc2VlIFIudW5uZXN0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5mbGF0dGVuKFsxLCAyLCBbMywgNF0sIDUsIFs2LCBbNywgOCwgWzksIFsxMCwgMTFdLCAxMl1dXV0pO1xuICogICAgICAvLz0+IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyXVxuICovXG5cbnZhciBmbGF0dGVuID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoXG4vKiNfX1BVUkVfXyovXG5fbWFrZUZsYXQodHJ1ZSkpO1xuXG5leHBvcnQgZGVmYXVsdCBmbGF0dGVuOyIsImltcG9ydCBfY2hlY2tGb3JNZXRob2QgZnJvbSBcIi4vaW50ZXJuYWwvX2NoZWNrRm9yTWV0aG9kLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbiBpbnB1dCBgbGlzdGAsIGNhbGxpbmcgYSBwcm92aWRlZCBmdW5jdGlvbiBgZm5gIGZvciBlYWNoXG4gKiBlbGVtZW50IGluIHRoZSBsaXN0LlxuICpcbiAqIGBmbmAgcmVjZWl2ZXMgb25lIGFyZ3VtZW50OiAqKHZhbHVlKSouXG4gKlxuICogTm90ZTogYFIuZm9yRWFjaGAgZG9lcyBub3Qgc2tpcCBkZWxldGVkIG9yIHVuYXNzaWduZWQgaW5kaWNlcyAoc3BhcnNlXG4gKiBhcnJheXMpLCB1bmxpa2UgdGhlIG5hdGl2ZSBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZC4gRm9yIG1vcmVcbiAqIGRldGFpbHMgb24gdGhpcyBiZWhhdmlvciwgc2VlOlxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZm9yRWFjaCNEZXNjcmlwdGlvblxuICpcbiAqIEFsc28gbm90ZSB0aGF0LCB1bmxpa2UgYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCwgUmFtZGEncyBgZm9yRWFjaGAgcmV0dXJuc1xuICogdGhlIG9yaWdpbmFsIGFycmF5LiBJbiBzb21lIGxpYnJhcmllcyB0aGlzIGZ1bmN0aW9uIGlzIG5hbWVkIGBlYWNoYC5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgZm9yRWFjaGAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4xXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiAqKSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLiBSZWNlaXZlcyBvbmUgYXJndW1lbnQsIGB2YWx1ZWAuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgb3JpZ2luYWwgbGlzdC5cbiAqIEBzZWUgUi5hZGRJbmRleFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHByaW50WFBsdXNGaXZlID0geCA9PiBjb25zb2xlLmxvZyh4ICsgNSk7XG4gKiAgICAgIFIuZm9yRWFjaChwcmludFhQbHVzRml2ZSwgWzEsIDIsIDNdKTsgLy89PiBbMSwgMiwgM11cbiAqICAgICAgLy8gbG9ncyA2XG4gKiAgICAgIC8vIGxvZ3MgN1xuICogICAgICAvLyBsb2dzIDhcbiAqIEBzeW1iIFIuZm9yRWFjaChmLCBbYSwgYiwgY10pID0gW2EsIGIsIGNdXG4gKi9cblxudmFyIGZvckVhY2ggPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5Mihcbi8qI19fUFVSRV9fKi9cbl9jaGVja0Zvck1ldGhvZCgnZm9yRWFjaCcsIGZ1bmN0aW9uIGZvckVhY2goZm4sIGxpc3QpIHtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB2YXIgaWR4ID0gMDtcblxuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgZm4obGlzdFtpZHhdKTtcbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiBsaXN0O1xufSkpO1xuXG5leHBvcnQgZGVmYXVsdCBmb3JFYWNoOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBrZXlzIGZyb20gXCIuL2tleXMuanNcIjtcbi8qKlxuICogSXRlcmF0ZSBvdmVyIGFuIGlucHV0IGBvYmplY3RgLCBjYWxsaW5nIGEgcHJvdmlkZWQgZnVuY3Rpb24gYGZuYCBmb3IgZWFjaFxuICoga2V5IGFuZCB2YWx1ZSBpbiB0aGUgb2JqZWN0LlxuICpcbiAqIGBmbmAgcmVjZWl2ZXMgdGhyZWUgYXJndW1lbnQ6ICoodmFsdWUsIGtleSwgb2JqKSouXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjMuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoKGEsIFN0cmluZywgU3RyTWFwIGEpIC0+IEFueSkgLT4gU3RyTWFwIGEgLT4gU3RyTWFwIGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuIFJlY2VpdmVzIHRocmVlIGFyZ3VtZW50LCBgdmFsdWVgLCBga2V5YCwgYG9iamAuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgb3JpZ2luYWwgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHByaW50S2V5Q29uY2F0VmFsdWUgPSAodmFsdWUsIGtleSkgPT4gY29uc29sZS5sb2coa2V5ICsgJzonICsgdmFsdWUpO1xuICogICAgICBSLmZvckVhY2hPYmpJbmRleGVkKHByaW50S2V5Q29uY2F0VmFsdWUsIHt4OiAxLCB5OiAyfSk7IC8vPT4ge3g6IDEsIHk6IDJ9XG4gKiAgICAgIC8vIGxvZ3MgeDoxXG4gKiAgICAgIC8vIGxvZ3MgeToyXG4gKiBAc3ltYiBSLmZvckVhY2hPYmpJbmRleGVkKGYsIHt4OiBhLCB5OiBifSkgPSB7eDogYSwgeTogYn1cbiAqL1xuXG52YXIgZm9yRWFjaE9iakluZGV4ZWQgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBmb3JFYWNoT2JqSW5kZXhlZChmbiwgb2JqKSB7XG4gIHZhciBrZXlMaXN0ID0ga2V5cyhvYmopO1xuICB2YXIgaWR4ID0gMDtcblxuICB3aGlsZSAoaWR4IDwga2V5TGlzdC5sZW5ndGgpIHtcbiAgICB2YXIga2V5ID0ga2V5TGlzdFtpZHhdO1xuICAgIGZuKG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgaWR4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZvckVhY2hPYmpJbmRleGVkOyIsImltcG9ydCBfY2hlY2tGb3JNZXRob2QgZnJvbSBcIi4vaW50ZXJuYWwvX2NoZWNrRm9yTWV0aG9kLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgcmVkdWNlQnkgZnJvbSBcIi4vcmVkdWNlQnkuanNcIjtcbi8qKlxuICogU3BsaXRzIGEgbGlzdCBpbnRvIHN1Yi1saXN0cyBzdG9yZWQgaW4gYW4gb2JqZWN0LCBiYXNlZCBvbiB0aGUgcmVzdWx0IG9mXG4gKiBjYWxsaW5nIGEga2V5LXJldHVybmluZyBmdW5jdGlvbiBvbiBlYWNoIGVsZW1lbnQsIGFuZCBncm91cGluZyB0aGVcbiAqIHJlc3VsdHMgYWNjb3JkaW5nIHRvIHZhbHVlcyByZXR1cm5lZC5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgZ3JvdXBCeWAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgSWR4IGEgPT4gKGIgLT4gYSkgLT4gW2JdIC0+IHthOiBbYl19XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiA6OiBhIC0+IElkeFxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gZ3JvdXBcbiAqIEByZXR1cm4ge09iamVjdH0gQW4gb2JqZWN0IHdpdGggdGhlIG91dHB1dCBvZiBgZm5gIGZvciBrZXlzLCBtYXBwZWQgdG8gYXJyYXlzIG9mIGVsZW1lbnRzXG4gKiAgICAgICAgIHRoYXQgcHJvZHVjZWQgdGhhdCBrZXkgd2hlbiBwYXNzZWQgdG8gYGZuYC5cbiAqIEBzZWUgUi5yZWR1Y2VCeSwgUi50cmFuc2R1Y2UsIFIuaW5kZXhCeSwgUi5jb2xsZWN0QnlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBieUdyYWRlID0gUi5ncm91cEJ5KGZ1bmN0aW9uKHN0dWRlbnQpIHtcbiAqICAgICAgICBjb25zdCBzY29yZSA9IHN0dWRlbnQuc2NvcmU7XG4gKiAgICAgICAgcmV0dXJuIHNjb3JlIDwgNjUgPyAnRicgOlxuICogICAgICAgICAgICAgICBzY29yZSA8IDcwID8gJ0QnIDpcbiAqICAgICAgICAgICAgICAgc2NvcmUgPCA4MCA/ICdDJyA6XG4gKiAgICAgICAgICAgICAgIHNjb3JlIDwgOTAgPyAnQicgOiAnQSc7XG4gKiAgICAgIH0pO1xuICogICAgICBjb25zdCBzdHVkZW50cyA9IFt7bmFtZTogJ0FiYnknLCBzY29yZTogODR9LFxuICogICAgICAgICAgICAgICAgICAgICAge25hbWU6ICdFZGR5Jywgc2NvcmU6IDU4fSxcbiAqICAgICAgICAgICAgICAgICAgICAgIC8vIC4uLlxuICogICAgICAgICAgICAgICAgICAgICAge25hbWU6ICdKYWNrJywgc2NvcmU6IDY5fV07XG4gKiAgICAgIGJ5R3JhZGUoc3R1ZGVudHMpO1xuICogICAgICAvLyB7XG4gKiAgICAgIC8vICAgJ0EnOiBbe25hbWU6ICdEaWFubmUnLCBzY29yZTogOTl9XSxcbiAqICAgICAgLy8gICAnQic6IFt7bmFtZTogJ0FiYnknLCBzY29yZTogODR9XVxuICogICAgICAvLyAgIC8vIC4uLixcbiAqICAgICAgLy8gICAnRic6IFt7bmFtZTogJ0VkZHknLCBzY29yZTogNTh9XVxuICogICAgICAvLyB9XG4gKi9cblxudmFyIGdyb3VwQnkgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5Mihcbi8qI19fUFVSRV9fKi9cbl9jaGVja0Zvck1ldGhvZCgnZ3JvdXBCeScsXG4vKiNfX1BVUkVfXyovXG5yZWR1Y2VCeShmdW5jdGlvbiAoYWNjLCBpdGVtKSB7XG4gIGFjYy5wdXNoKGl0ZW0pO1xuICByZXR1cm4gYWNjO1xufSwgW10pKSk7XG5cbmV4cG9ydCBkZWZhdWx0IGdyb3VwQnk7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGhhc1BhdGggZnJvbSBcIi4vaGFzUGF0aC5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGFuIG9iamVjdCBoYXMgYW4gb3duIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHMgLT4ge3M6IHh9IC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjaGVjayBmb3IuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBleGlzdHMuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgaGFzTmFtZSA9IFIuaGFzKCduYW1lJyk7XG4gKiAgICAgIGhhc05hbWUoe25hbWU6ICdhbGljZSd9KTsgICAvLz0+IHRydWVcbiAqICAgICAgaGFzTmFtZSh7bmFtZTogJ2JvYid9KTsgICAgIC8vPT4gdHJ1ZVxuICogICAgICBoYXNOYW1lKHt9KTsgICAgICAgICAgICAgICAgLy89PiBmYWxzZVxuICpcbiAqICAgICAgY29uc3QgcG9pbnQgPSB7eDogMCwgeTogMH07XG4gKiAgICAgIGNvbnN0IHBvaW50SGFzID0gUi5oYXMoUi5fXywgcG9pbnQpO1xuICogICAgICBwb2ludEhhcygneCcpOyAgLy89PiB0cnVlXG4gKiAgICAgIHBvaW50SGFzKCd5Jyk7ICAvLz0+IHRydWVcbiAqICAgICAgcG9pbnRIYXMoJ3onKTsgIC8vPT4gZmFsc2VcbiAqL1xuXG52YXIgaGFzID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gaGFzKHByb3AsIG9iaikge1xuICByZXR1cm4gaGFzUGF0aChbcHJvcF0sIG9iaik7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgaGFzOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL2ludGVybmFsL19oYXMuanNcIjtcbmltcG9ydCBpc05pbCBmcm9tIFwiLi9pc05pbC5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGEgcGF0aCBleGlzdHMgaW4gYW4gb2JqZWN0LiBPbmx5IHRoZSBvYmplY3Qnc1xuICogb3duIHByb3BlcnRpZXMgYXJlIGNoZWNrZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjYuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludCB8IFN5bWJvbFxuICogQHNpZyBbSWR4XSAtPiB7YX0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byB1c2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2hlY2sgdGhlIHBhdGggaW4uXG4gKiBAcmV0dXJuIHtCb29sZWFufSBXaGV0aGVyIHRoZSBwYXRoIGV4aXN0cy5cbiAqIEBzZWUgUi5oYXNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmhhc1BhdGgoWydhJywgJ2InXSwge2E6IHtiOiAyfX0pOyAgICAgICAgIC8vID0+IHRydWVcbiAqICAgICAgUi5oYXNQYXRoKFsnYScsICdiJ10sIHthOiB7YjogdW5kZWZpbmVkfX0pOyAvLyA9PiB0cnVlXG4gKiAgICAgIFIuaGFzUGF0aChbJ2EnLCAnYiddLCB7YToge2M6IDJ9fSk7ICAgICAgICAgLy8gPT4gZmFsc2VcbiAqICAgICAgUi5oYXNQYXRoKFsnYScsICdiJ10sIHt9KTsgICAgICAgICAgICAgICAgICAvLyA9PiBmYWxzZVxuICovXG5cbnZhciBoYXNQYXRoID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gaGFzUGF0aChfcGF0aCwgb2JqKSB7XG4gIGlmIChfcGF0aC5sZW5ndGggPT09IDAgfHwgaXNOaWwob2JqKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB2YWwgPSBvYmo7XG4gIHZhciBpZHggPSAwO1xuXG4gIHdoaWxlIChpZHggPCBfcGF0aC5sZW5ndGgpIHtcbiAgICBpZiAoIWlzTmlsKHZhbCkgJiYgX2hhcyhfcGF0aFtpZHhdLCB2YWwpKSB7XG4gICAgICB2YWwgPSB2YWxbX3BhdGhbaWR4XV07XG4gICAgICBpZHggKz0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGhhc1BhdGg7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9pZGVudGl0eSBmcm9tIFwiLi9pbnRlcm5hbC9faWRlbnRpdHkuanNcIjtcbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGRvZXMgbm90aGluZyBidXQgcmV0dXJuIHRoZSBwYXJhbWV0ZXIgc3VwcGxpZWQgdG8gaXQuIEdvb2RcbiAqIGFzIGEgZGVmYXVsdCBvciBwbGFjZWhvbGRlciBmdW5jdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBhIC0+IGFcbiAqIEBwYXJhbSB7Kn0geCBUaGUgdmFsdWUgdG8gcmV0dXJuLlxuICogQHJldHVybiB7Kn0gVGhlIGlucHV0IHZhbHVlLCBgeGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pZGVudGl0eSgxKTsgLy89PiAxXG4gKlxuICogICAgICBjb25zdCBvYmogPSB7fTtcbiAqICAgICAgUi5pZGVudGl0eShvYmopID09PSBvYmo7IC8vPT4gdHJ1ZVxuICogQHN5bWIgUi5pZGVudGl0eShhKSA9IGFcbiAqL1xuXG52YXIgaWRlbnRpdHkgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShfaWRlbnRpdHkpO1xuXG5leHBvcnQgZGVmYXVsdCBpZGVudGl0eTsiLCJpbXBvcnQgX2luY2x1ZGVzIGZyb20gXCIuL2ludGVybmFsL19pbmNsdWRlcy5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGVxdWFsLCBpbiBbYFIuZXF1YWxzYF0oI2VxdWFscylcbiAqIHRlcm1zLCB0byBhdCBsZWFzdCBvbmUgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gbGlzdDsgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBBbHNvIHdvcmtzIHdpdGggc3RyaW5ncy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yNi4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IFthXSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge09iamVjdH0gYSBUaGUgaXRlbSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiBhbiBlcXVpdmFsZW50IGl0ZW0gaXMgaW4gdGhlIGxpc3QsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQHNlZSBSLmFueVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaW5jbHVkZXMoMywgWzEsIDIsIDNdKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaW5jbHVkZXMoNCwgWzEsIDIsIDNdKTsgLy89PiBmYWxzZVxuICogICAgICBSLmluY2x1ZGVzKHsgbmFtZTogJ0ZyZWQnIH0sIFt7IG5hbWU6ICdGcmVkJyB9XSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmluY2x1ZGVzKFs0Ml0sIFtbNDJdXSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmluY2x1ZGVzKCdiYScsICdiYW5hbmEnKTsgLy89PnRydWVcbiAqL1xuXG52YXIgaW5jbHVkZXMgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihfaW5jbHVkZXMpO1xuXG5leHBvcnQgZGVmYXVsdCBpbmNsdWRlczsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2luZGV4T2YgZnJvbSBcIi4vaW50ZXJuYWwvX2luZGV4T2YuanNcIjtcbmltcG9ydCBfaXNBcnJheSBmcm9tIFwiLi9pbnRlcm5hbC9faXNBcnJheS5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhbiBpdGVtIGluIGFuIGFycmF5LCBvciAtMVxuICogaWYgdGhlIGl0ZW0gaXMgbm90IGluY2x1ZGVkIGluIHRoZSBhcnJheS4gW2BSLmVxdWFsc2BdKCNlcXVhbHMpIGlzIHVzZWQgdG9cbiAqIGRldGVybWluZSBlcXVhbGl0eS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIGEgLT4gW2FdIC0+IE51bWJlclxuICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIGl0ZW0gdG8gZmluZC5cbiAqIEBwYXJhbSB7QXJyYXl9IHhzIFRoZSBhcnJheSB0byBzZWFyY2ggaW4uXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBpbmRleCBvZiB0aGUgdGFyZ2V0LCBvciAtMSBpZiB0aGUgdGFyZ2V0IGlzIG5vdCBmb3VuZC5cbiAqIEBzZWUgUi5sYXN0SW5kZXhPZiwgUi5maW5kSW5kZXhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmluZGV4T2YoMywgWzEsMiwzLDRdKTsgLy89PiAyXG4gKiAgICAgIFIuaW5kZXhPZigxMCwgWzEsMiwzLDRdKTsgLy89PiAtMVxuICovXG5cbnZhciBpbmRleE9mID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gaW5kZXhPZih0YXJnZXQsIHhzKSB7XG4gIHJldHVybiB0eXBlb2YgeHMuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJyAmJiAhX2lzQXJyYXkoeHMpID8geHMuaW5kZXhPZih0YXJnZXQpIDogX2luZGV4T2YoeHMsIHRhcmdldCwgMCk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgaW5kZXhPZjsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG4vKipcbiAqIEluc2VydHMgdGhlIHN1cHBsaWVkIGVsZW1lbnQgaW50byB0aGUgbGlzdCwgYXQgdGhlIHNwZWNpZmllZCBgaW5kZXhgLiBfTm90ZSB0aGF0XG5cbiAqIHRoaXMgaXMgbm90IGRlc3RydWN0aXZlXzogaXQgcmV0dXJucyBhIGNvcHkgb2YgdGhlIGxpc3Qgd2l0aCB0aGUgY2hhbmdlcy5cbiAqIDxzbWFsbD5ObyBsaXN0cyBoYXZlIGJlZW4gaGFybWVkIGluIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLjwvc21hbGw+XG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMi4yXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gYSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge051bWJlcn0gaW5kZXggVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgZWxlbWVudFxuICogQHBhcmFtIHsqfSBlbHQgVGhlIGVsZW1lbnQgdG8gaW5zZXJ0IGludG8gdGhlIEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIGluc2VydCBpbnRvXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgQXJyYXkgd2l0aCBgZWx0YCBpbnNlcnRlZCBhdCBgaW5kZXhgLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaW5zZXJ0KDIsICd4JywgWzEsMiwzLDRdKTsgLy89PiBbMSwyLCd4JywzLDRdXG4gKi9cblxudmFyIGluc2VydCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIGluc2VydChpZHgsIGVsdCwgbGlzdCkge1xuICBpZHggPSBpZHggPCBsaXN0Lmxlbmd0aCAmJiBpZHggPj0gMCA/IGlkeCA6IGxpc3QubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobGlzdCwgMCk7XG4gIHJlc3VsdC5zcGxpY2UoaWR4LCAwLCBlbHQpO1xuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGluc2VydDsiLCJpbXBvcnQgX2luY2x1ZGVzIGZyb20gXCIuL19pbmNsdWRlcy5qc1wiO1xuXG52YXIgX1NldCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIF9TZXQoKSB7XG4gICAgLyogZ2xvYmFscyBTZXQgKi9cbiAgICB0aGlzLl9uYXRpdmVTZXQgPSB0eXBlb2YgU2V0ID09PSAnZnVuY3Rpb24nID8gbmV3IFNldCgpIDogbnVsbDtcbiAgICB0aGlzLl9pdGVtcyA9IHt9O1xuICB9XG5cbiAgLy8gdW50aWwgd2UgZmlndXJlIG91dCB3aHkganNkb2MgY2hva2VzIG9uIHRoaXNcbiAgLy8gQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdG8gYWRkIHRvIHRoZSBTZXRcbiAgLy8gQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGl0ZW0gZGlkIG5vdCBleGlzdCBwcmlvciwgb3RoZXJ3aXNlIGZhbHNlXG4gIC8vXG4gIF9TZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgcmV0dXJuICFoYXNPckFkZChpdGVtLCB0cnVlLCB0aGlzKTtcbiAgfTsgLy9cbiAgLy8gQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdG8gY2hlY2sgZm9yIGV4aXN0ZW5jZSBpbiB0aGUgU2V0XG4gIC8vIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBpdGVtIGV4aXN0cyBpbiB0aGUgU2V0LCBvdGhlcndpc2UgZmFsc2VcbiAgLy9cblxuXG4gIF9TZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgcmV0dXJuIGhhc09yQWRkKGl0ZW0sIGZhbHNlLCB0aGlzKTtcbiAgfTsgLy9cbiAgLy8gQ29tYmluZXMgdGhlIGxvZ2ljIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGl0ZW0gaXMgYSBtZW1iZXIgb2YgdGhlIHNldCBhbmRcbiAgLy8gZm9yIGFkZGluZyBhIG5ldyBpdGVtIHRvIHRoZSBzZXQuXG4gIC8vXG4gIC8vIEBwYXJhbSBpdGVtICAgICAgIFRoZSBpdGVtIHRvIGNoZWNrIG9yIGFkZCB0byB0aGUgU2V0IGluc3RhbmNlLlxuICAvLyBAcGFyYW0gc2hvdWxkQWRkICBJZiB0cnVlLCB0aGUgaXRlbSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBzZXQgaWYgaXQgZG9lc24ndFxuICAvLyAgICAgICAgICAgICAgICAgICBhbHJlYWR5IGV4aXN0LlxuICAvLyBAcGFyYW0gc2V0ICAgICAgICBUaGUgc2V0IGluc3RhbmNlIHRvIGNoZWNrIG9yIGFkZCB0by5cbiAgLy8gQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaXRlbSBhbHJlYWR5IGV4aXN0ZWQsIG90aGVyd2lzZSBmYWxzZS5cbiAgLy9cblxuXG4gIHJldHVybiBfU2V0O1xufSgpO1xuXG5mdW5jdGlvbiBoYXNPckFkZChpdGVtLCBzaG91bGRBZGQsIHNldCkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiBpdGVtO1xuICB2YXIgcHJldlNpemUsIG5ld1NpemU7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiArMCBhbmQgLTBcbiAgICAgIGlmIChpdGVtID09PSAwICYmIDEgLyBpdGVtID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgaWYgKHNldC5faXRlbXNbJy0wJ10pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICBzZXQuX2l0ZW1zWyctMCddID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gdGhlc2UgdHlwZXMgY2FuIGFsbCB1dGlsaXNlIHRoZSBuYXRpdmUgU2V0XG5cblxuICAgICAgaWYgKHNldC5fbmF0aXZlU2V0ICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICBwcmV2U2l6ZSA9IHNldC5fbmF0aXZlU2V0LnNpemU7XG5cbiAgICAgICAgICBzZXQuX25hdGl2ZVNldC5hZGQoaXRlbSk7XG5cbiAgICAgICAgICBuZXdTaXplID0gc2V0Ll9uYXRpdmVTZXQuc2l6ZTtcbiAgICAgICAgICByZXR1cm4gbmV3U2l6ZSA9PT0gcHJldlNpemU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHNldC5fbmF0aXZlU2V0LmhhcyhpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCEodHlwZSBpbiBzZXQuX2l0ZW1zKSkge1xuICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV0gPSB7fTtcbiAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV1baXRlbV0gPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtIGluIHNldC5faXRlbXNbdHlwZV0pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdW2l0ZW1dID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgLy8gc2V0Ll9pdGVtc1snYm9vbGVhbiddIGhvbGRzIGEgdHdvIGVsZW1lbnQgYXJyYXlcbiAgICAgIC8vIHJlcHJlc2VudGluZyBbIGZhbHNlRXhpc3RzLCB0cnVlRXhpc3RzIF1cbiAgICAgIGlmICh0eXBlIGluIHNldC5faXRlbXMpIHtcbiAgICAgICAgdmFyIGJJZHggPSBpdGVtID8gMSA6IDA7XG5cbiAgICAgICAgaWYgKHNldC5faXRlbXNbdHlwZV1bYklkeF0pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdW2JJZHhdID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdID0gaXRlbSA/IFtmYWxzZSwgdHJ1ZV0gOiBbdHJ1ZSwgZmFsc2VdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgLy8gY29tcGFyZSBmdW5jdGlvbnMgZm9yIHJlZmVyZW5jZSBlcXVhbGl0eVxuICAgICAgaWYgKHNldC5fbmF0aXZlU2V0ICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICBwcmV2U2l6ZSA9IHNldC5fbmF0aXZlU2V0LnNpemU7XG5cbiAgICAgICAgICBzZXQuX25hdGl2ZVNldC5hZGQoaXRlbSk7XG5cbiAgICAgICAgICBuZXdTaXplID0gc2V0Ll9uYXRpdmVTZXQuc2l6ZTtcbiAgICAgICAgICByZXR1cm4gbmV3U2l6ZSA9PT0gcHJldlNpemU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHNldC5fbmF0aXZlU2V0LmhhcyhpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCEodHlwZSBpbiBzZXQuX2l0ZW1zKSkge1xuICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV0gPSBbaXRlbV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFfaW5jbHVkZXMoaXRlbSwgc2V0Ll9pdGVtc1t0eXBlXSkpIHtcbiAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdLnB1c2goaXRlbSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgaWYgKHNldC5faXRlbXNbdHlwZV0pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgaWYgKGl0ZW0gPT09IG51bGwpIHtcbiAgICAgICAgaWYgKCFzZXQuX2l0ZW1zWydudWxsJ10pIHtcbiAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICBzZXQuX2l0ZW1zWydudWxsJ10gPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIHJlZHVjZSB0aGUgc2VhcmNoIHNpemUgb2YgaGV0ZXJvZ2VuZW91cyBzZXRzIGJ5IGNyZWF0aW5nIGJ1Y2tldHNcbiAgICAgIC8vIGZvciBlYWNoIHR5cGUuXG4gICAgICB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZW0pO1xuXG4gICAgICBpZiAoISh0eXBlIGluIHNldC5faXRlbXMpKSB7XG4gICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdID0gW2l0ZW1dO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSAvLyBzY2FuIHRocm91Z2ggYWxsIHByZXZpb3VzbHkgYXBwbGllZCBpdGVtc1xuXG5cbiAgICAgIGlmICghX2luY2x1ZGVzKGl0ZW0sIHNldC5faXRlbXNbdHlwZV0pKSB7XG4gICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdLnB1c2goaXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59IC8vIEEgc2ltcGxlIFNldCB0eXBlIHRoYXQgaG9ub3VycyBSLmVxdWFscyBzZW1hbnRpY3NcblxuXG5leHBvcnQgZGVmYXVsdCBfU2V0OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hcml0eShuLCBmbikge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICBzd2l0Y2ggKG4pIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG5cbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwKSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcblxuICAgIGNhc2UgMjpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTAsIGExKSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcblxuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTAsIGExLCBhMikge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG5cbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwLCBhMSwgYTIsIGEzKSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcblxuICAgIGNhc2UgNTpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTAsIGExLCBhMiwgYTMsIGE0KSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcblxuICAgIGNhc2UgNjpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG5cbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcblxuICAgIGNhc2UgODpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcblxuICAgIGNhc2UgOTpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG5cbiAgICBjYXNlIDEwOlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCB0byBfYXJpdHkgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIG5vIGdyZWF0ZXIgdGhhbiB0ZW4nKTtcbiAgfVxufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hcnJheUZyb21JdGVyYXRvcihpdGVyKSB7XG4gIHZhciBsaXN0ID0gW107XG4gIHZhciBuZXh0O1xuXG4gIHdoaWxlICghKG5leHQgPSBpdGVyLm5leHQoKSkuZG9uZSkge1xuICAgIGxpc3QucHVzaChuZXh0LnZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBsaXN0O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hcnJheVJlZHVjZShyZWR1Y2VyLCBhY2MsIGxpc3QpIHtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGFjYyA9IHJlZHVjZXIoYWNjLCBsaXN0W2luZGV4XSk7XG4gICAgaW5kZXggKz0gMTtcbiAgfVxuXG4gIHJldHVybiBhY2M7XG59IiwiaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgX2lzSW50ZWdlciBmcm9tIFwiLi9faXNJbnRlZ2VyLmpzXCI7XG4vKipcbiAqIE1ha2VzIGEgc2hhbGxvdyBjbG9uZSBvZiBhbiBvYmplY3QsIHNldHRpbmcgb3Igb3ZlcnJpZGluZyB0aGUgc3BlY2lmaWVkXG4gKiBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4gTm90ZSB0aGF0IHRoaXMgY29waWVzIGFuZCBmbGF0dGVucyBwcm90b3R5cGVcbiAqIHByb3BlcnRpZXMgb250byB0aGUgbmV3IG9iamVjdCBhcyB3ZWxsLiBBbGwgbm9uLXByaW1pdGl2ZSBwcm9wZXJ0aWVzIGFyZVxuICogY29waWVkIGJ5IHJlZmVyZW5jZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBwcm9wIFRoZSBwcm9wZXJ0eSBuYW1lIHRvIHNldFxuICogQHBhcmFtIHsqfSB2YWwgVGhlIG5ldyB2YWx1ZVxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R8QXJyYXl9IEEgbmV3IG9iamVjdCBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbCBleGNlcHQgZm9yIHRoZSBjaGFuZ2VkIHByb3BlcnR5LlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hc3NvYyhwcm9wLCB2YWwsIG9iaikge1xuICBpZiAoX2lzSW50ZWdlcihwcm9wKSAmJiBfaXNBcnJheShvYmopKSB7XG4gICAgdmFyIGFyciA9IFtdLmNvbmNhdChvYmopO1xuICAgIGFycltwcm9wXSA9IHZhbDtcbiAgICByZXR1cm4gYXJyO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gb2JqKSB7XG4gICAgcmVzdWx0W3BdID0gb2JqW3BdO1xuICB9XG5cbiAgcmVzdWx0W3Byb3BdID0gdmFsO1xuICByZXR1cm4gcmVzdWx0O1xufSIsImltcG9ydCBfaXNBcnJheSBmcm9tIFwiLi9faXNBcnJheS5qc1wiO1xuLyoqXG4gKiBUaGlzIGNoZWNrcyB3aGV0aGVyIGEgZnVuY3Rpb24gaGFzIGEgW21ldGhvZG5hbWVdIGZ1bmN0aW9uLiBJZiBpdCBpc24ndCBhblxuICogYXJyYXkgaXQgd2lsbCBleGVjdXRlIHRoYXQgZnVuY3Rpb24gb3RoZXJ3aXNlIGl0IHdpbGwgZGVmYXVsdCB0byB0aGUgcmFtZGFcbiAqIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiByYW1kYSBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZG5hbWUgcHJvcGVydHkgdG8gY2hlY2sgZm9yIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uXG4gKiBAcmV0dXJuIHtPYmplY3R9IFdoYXRldmVyIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIG1ldGhvZCBpcy5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2hlY2tGb3JNZXRob2QobWV0aG9kbmFtZSwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH1cblxuICAgIHZhciBvYmogPSBhcmd1bWVudHNbbGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIF9pc0FycmF5KG9iaikgfHwgdHlwZW9mIG9ialttZXRob2RuYW1lXSAhPT0gJ2Z1bmN0aW9uJyA/IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBvYmpbbWV0aG9kbmFtZV0uYXBwbHkob2JqLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDAsIGxlbmd0aCAtIDEpKTtcbiAgfTtcbn0iLCJpbXBvcnQgX2Nsb25lUmVnRXhwIGZyb20gXCIuL19jbG9uZVJlZ0V4cC5qc1wiO1xuaW1wb3J0IHR5cGUgZnJvbSBcIi4uL3R5cGUuanNcIjtcbi8qKlxuICogQ29waWVzIGFuIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgY29waWVkXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXAgV2hldGhlciBvciBub3QgdG8gcGVyZm9ybSBkZWVwIGNsb25pbmcuXG4gKiBAcmV0dXJuIHsqfSBUaGUgY29waWVkIHZhbHVlLlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jbG9uZSh2YWx1ZSwgZGVlcCwgbWFwKSB7XG4gIG1hcCB8fCAobWFwID0gbmV3IF9PYmplY3RNYXAoKSk7IC8vIHRoaXMgYXZvaWRzIHRoZSBzbG93ZXIgc3dpdGNoIHdpdGggYSBxdWljayBpZiBkZWNpc2lvbiByZW1vdmluZyBzb21lIG1pbGxpc2Vjb25kcyBpbiBlYWNoIHJ1bi5cblxuICBpZiAoX2lzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHZhciBjb3B5ID0gZnVuY3Rpb24gY29weShjb3BpZWRWYWx1ZSkge1xuICAgIC8vIENoZWNrIGZvciBjaXJjdWxhciBhbmQgc2FtZSByZWZlcmVuY2VzIG9uIHRoZSBvYmplY3QgZ3JhcGggYW5kIHJldHVybiBpdHMgY29ycmVzcG9uZGluZyBjbG9uZS5cbiAgICB2YXIgY2FjaGVkQ29weSA9IG1hcC5nZXQodmFsdWUpO1xuXG4gICAgaWYgKGNhY2hlZENvcHkpIHtcbiAgICAgIHJldHVybiBjYWNoZWRDb3B5O1xuICAgIH1cblxuICAgIG1hcC5zZXQodmFsdWUsIGNvcGllZFZhbHVlKTtcblxuICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkge1xuICAgICAgICBjb3BpZWRWYWx1ZVtrZXldID0gZGVlcCA/IF9jbG9uZSh2YWx1ZVtrZXldLCB0cnVlLCBtYXApIDogdmFsdWVba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29waWVkVmFsdWU7XG4gIH07XG5cbiAgc3dpdGNoICh0eXBlKHZhbHVlKSkge1xuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICByZXR1cm4gY29weShPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkpKTtcblxuICAgIGNhc2UgJ0FycmF5JzpcbiAgICAgIHJldHVybiBjb3B5KFtdKTtcblxuICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlLnZhbHVlT2YoKSk7XG5cbiAgICBjYXNlICdSZWdFeHAnOlxuICAgICAgcmV0dXJuIF9jbG9uZVJlZ0V4cCh2YWx1ZSk7XG5cbiAgICBjYXNlICdJbnQ4QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQ4QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQ4Q2xhbXBlZEFycmF5JzpcbiAgICBjYXNlICdJbnQxNkFycmF5JzpcbiAgICBjYXNlICdVaW50MTZBcnJheSc6XG4gICAgY2FzZSAnSW50MzJBcnJheSc6XG4gICAgY2FzZSAnVWludDMyQXJyYXknOlxuICAgIGNhc2UgJ0Zsb2F0MzJBcnJheSc6XG4gICAgY2FzZSAnRmxvYXQ2NEFycmF5JzpcbiAgICBjYXNlICdCaWdJbnQ2NEFycmF5JzpcbiAgICBjYXNlICdCaWdVaW50NjRBcnJheSc6XG4gICAgICByZXR1cm4gdmFsdWUuc2xpY2UoKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2lzUHJpbWl0aXZlKHBhcmFtKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHBhcmFtO1xuICByZXR1cm4gcGFyYW0gPT0gbnVsbCB8fCB0eXBlICE9ICdvYmplY3QnICYmIHR5cGUgIT0gJ2Z1bmN0aW9uJztcbn1cblxudmFyIF9PYmplY3RNYXAgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBfT2JqZWN0TWFwKCkge1xuICAgIHRoaXMubWFwID0ge307XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgX09iamVjdE1hcC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCBoYXNoZWRLZXkgPSB0aGlzLmhhc2goa2V5KTtcbiAgICBsZXQgYnVja2V0ID0gdGhpcy5tYXBbaGFzaGVkS2V5XTtcblxuICAgIGlmICghYnVja2V0KSB7XG4gICAgICB0aGlzLm1hcFtoYXNoZWRLZXldID0gYnVja2V0ID0gW107XG4gICAgfVxuXG4gICAgYnVja2V0LnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICB0aGlzLmxlbmd0aCArPSAxO1xuICB9O1xuXG4gIF9PYmplY3RNYXAucHJvdG90eXBlLmhhc2ggPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgbGV0IGhhc2hlZEtleSA9IFtdO1xuXG4gICAgZm9yICh2YXIgdmFsdWUgaW4ga2V5KSB7XG4gICAgICBoYXNoZWRLZXkucHVzaChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoa2V5W3ZhbHVlXSkpO1xuICAgIH1cblxuICAgIHJldHVybiBoYXNoZWRLZXkuam9pbigpO1xuICB9O1xuXG4gIF9PYmplY3RNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAvKipcbiAgICAgKiBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBvYmplY3RzIHRvIGJlIGNsb25lZCBpcyBmYXN0ZXIgdG8ganVzdCBpdGVyYXRlIG92ZXIgdGhlIGl0ZW1zIGluIHRoZSBtYXAganVzdCBiZWNhdXNlIHRoZSBoYXNoIGZ1bmN0aW9uIGlzIHNvIGNvc3RseSxcbiAgICAgKiBvbiBteSB0ZXN0cyB0aGlzIG51bWJlciBpcyAxODAsIGFueXRoaW5nIGFib3ZlIHRoYXQgdXNpbmcgdGhlIGhhc2ggZnVuY3Rpb24gaXMgZmFzdGVyLlxuICAgICAqL1xuICAgIGlmICh0aGlzLmxlbmd0aCA8PSAxODApIHtcbiAgICAgIGZvciAoY29uc3QgcCBpbiB0aGlzLm1hcCkge1xuICAgICAgICBjb25zdCBidWNrZXQgPSB0aGlzLm1hcFtwXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1Y2tldC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBidWNrZXRbaV07XG5cbiAgICAgICAgICBpZiAoZWxlbWVudFswXSA9PT0ga2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudFsxXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc2hlZEtleSA9IHRoaXMuaGFzaChrZXkpO1xuICAgIGNvbnN0IGJ1Y2tldCA9IHRoaXMubWFwW2hhc2hlZEtleV07XG5cbiAgICBpZiAoIWJ1Y2tldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVja2V0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gYnVja2V0W2ldO1xuXG4gICAgICBpZiAoZWxlbWVudFswXSA9PT0ga2V5KSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50WzFdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gX09iamVjdE1hcDtcbn0oKTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2xvbmVSZWdFeHAocGF0dGVybikge1xuICByZXR1cm4gbmV3IFJlZ0V4cChwYXR0ZXJuLnNvdXJjZSwgcGF0dGVybi5mbGFncyA/IHBhdHRlcm4uZmxhZ3MgOiAocGF0dGVybi5nbG9iYWwgPyAnZycgOiAnJykgKyAocGF0dGVybi5pZ25vcmVDYXNlID8gJ2knIDogJycpICsgKHBhdHRlcm4ubXVsdGlsaW5lID8gJ20nIDogJycpICsgKHBhdHRlcm4uc3RpY2t5ID8gJ3knIDogJycpICsgKHBhdHRlcm4udW5pY29kZSA/ICd1JyA6ICcnKSArIChwYXR0ZXJuLmRvdEFsbCA/ICdzJyA6ICcnKSk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NvbXBsZW1lbnQoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSIsIi8qKlxuICogUHJpdmF0ZSBgY29uY2F0YCBmdW5jdGlvbiB0byBtZXJnZSB0d28gYXJyYXktbGlrZSBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fEFyZ3VtZW50c30gW3NldDE9W11dIEFuIGFycmF5LWxpa2Ugb2JqZWN0LlxuICogQHBhcmFtIHtBcnJheXxBcmd1bWVudHN9IFtzZXQyPVtdXSBBbiBhcnJheS1saWtlIG9iamVjdC5cbiAqIEByZXR1cm4ge0FycmF5fSBBIG5ldywgbWVyZ2VkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIF9jb25jYXQoWzQsIDUsIDZdLCBbMSwgMiwgM10pOyAvLz0+IFs0LCA1LCA2LCAxLCAyLCAzXVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY29uY2F0KHNldDEsIHNldDIpIHtcbiAgc2V0MSA9IHNldDEgfHwgW107XG4gIHNldDIgPSBzZXQyIHx8IFtdO1xuICB2YXIgaWR4O1xuICB2YXIgbGVuMSA9IHNldDEubGVuZ3RoO1xuICB2YXIgbGVuMiA9IHNldDIubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlkeCA9IDA7XG5cbiAgd2hpbGUgKGlkeCA8IGxlbjEpIHtcbiAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBzZXQxW2lkeF07XG4gICAgaWR4ICs9IDE7XG4gIH1cblxuICBpZHggPSAwO1xuXG4gIHdoaWxlIChpZHggPCBsZW4yKSB7XG4gICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gc2V0MltpZHhdO1xuICAgIGlkeCArPSAxO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn0iLCJpbXBvcnQgX2lzQXJyYXlMaWtlIGZyb20gXCIuL19pc0FycmF5TGlrZS5qc1wiO1xudmFyIHN5bUl0ZXJhdG9yID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgPyBTeW1ib2wuaXRlcmF0b3IgOiAnQEBpdGVyYXRvcic7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY3JlYXRlUmVkdWNlKGFycmF5UmVkdWNlLCBtZXRob2RSZWR1Y2UsIGl0ZXJhYmxlUmVkdWNlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBfcmVkdWNlKHhmLCBhY2MsIGxpc3QpIHtcbiAgICBpZiAoX2lzQXJyYXlMaWtlKGxpc3QpKSB7XG4gICAgICByZXR1cm4gYXJyYXlSZWR1Y2UoeGYsIGFjYywgbGlzdCk7XG4gICAgfVxuXG4gICAgaWYgKGxpc3QgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGxpc3RbJ2ZhbnRhc3ktbGFuZC9yZWR1Y2UnXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIG1ldGhvZFJlZHVjZSh4ZiwgYWNjLCBsaXN0LCAnZmFudGFzeS1sYW5kL3JlZHVjZScpO1xuICAgIH1cblxuICAgIGlmIChsaXN0W3N5bUl0ZXJhdG9yXSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gaXRlcmFibGVSZWR1Y2UoeGYsIGFjYywgbGlzdFtzeW1JdGVyYXRvcl0oKSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBsaXN0Lm5leHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBpdGVyYWJsZVJlZHVjZSh4ZiwgYWNjLCBsaXN0KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGxpc3QucmVkdWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gbWV0aG9kUmVkdWNlKHhmLCBhY2MsIGxpc3QsICdyZWR1Y2UnKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWR1Y2U6IGxpc3QgbXVzdCBiZSBhcnJheSBvciBpdGVyYWJsZScpO1xuICB9O1xufSIsImltcG9ydCBfaXNQbGFjZWhvbGRlciBmcm9tIFwiLi9faXNQbGFjZWhvbGRlci5qc1wiO1xuLyoqXG4gKiBPcHRpbWl6ZWQgaW50ZXJuYWwgb25lLWFyaXR5IGN1cnJ5IGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY3VycmllZCBmdW5jdGlvbi5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY3VycnkxKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmMShhKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDAgfHwgX2lzUGxhY2Vob2xkZXIoYSkpIHtcbiAgICAgIHJldHVybiBmMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9O1xufSIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaXNQbGFjZWhvbGRlciBmcm9tIFwiLi9faXNQbGFjZWhvbGRlci5qc1wiO1xuLyoqXG4gKiBPcHRpbWl6ZWQgaW50ZXJuYWwgdHdvLWFyaXR5IGN1cnJ5IGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY3VycmllZCBmdW5jdGlvbi5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY3VycnkyKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmMihhLCBiKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiBmMjtcblxuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gX2lzUGxhY2Vob2xkZXIoYSkgPyBmMiA6IF9jdXJyeTEoZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIF9iKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSAmJiBfaXNQbGFjZWhvbGRlcihiKSA/IGYyIDogX2lzUGxhY2Vob2xkZXIoYSkgPyBfY3VycnkxKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgIHJldHVybiBmbihfYSwgYik7XG4gICAgICAgIH0pIDogX2lzUGxhY2Vob2xkZXIoYikgPyBfY3VycnkxKGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgIHJldHVybiBmbihhLCBfYik7XG4gICAgICAgIH0pIDogZm4oYSwgYik7XG4gICAgfVxuICB9O1xufSIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL19jdXJyeTEuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaXNQbGFjZWhvbGRlciBmcm9tIFwiLi9faXNQbGFjZWhvbGRlci5qc1wiO1xuLyoqXG4gKiBPcHRpbWl6ZWQgaW50ZXJuYWwgdGhyZWUtYXJpdHkgY3VycnkgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBjdXJyaWVkIGZ1bmN0aW9uLlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jdXJyeTMoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGYzKGEsIGIsIGMpIHtcbiAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIGYzO1xuXG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSA/IGYzIDogX2N1cnJ5MihmdW5jdGlvbiAoX2IsIF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIF9iLCBfYyk7XG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSAmJiBfaXNQbGFjZWhvbGRlcihiKSA/IGYzIDogX2lzUGxhY2Vob2xkZXIoYSkgPyBfY3VycnkyKGZ1bmN0aW9uIChfYSwgX2MpIHtcbiAgICAgICAgICByZXR1cm4gZm4oX2EsIGIsIF9jKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTIoZnVuY3Rpb24gKF9iLCBfYykge1xuICAgICAgICAgIHJldHVybiBmbihhLCBfYiwgX2MpO1xuICAgICAgICB9KSA6IF9jdXJyeTEoZnVuY3Rpb24gKF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIGIsIF9jKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSAmJiBfaXNQbGFjZWhvbGRlcihiKSAmJiBfaXNQbGFjZWhvbGRlcihjKSA/IGYzIDogX2lzUGxhY2Vob2xkZXIoYSkgJiYgX2lzUGxhY2Vob2xkZXIoYikgPyBfY3VycnkyKGZ1bmN0aW9uIChfYSwgX2IpIHtcbiAgICAgICAgICByZXR1cm4gZm4oX2EsIF9iLCBjKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihhKSAmJiBfaXNQbGFjZWhvbGRlcihjKSA/IF9jdXJyeTIoZnVuY3Rpb24gKF9hLCBfYykge1xuICAgICAgICAgIHJldHVybiBmbihfYSwgYiwgX2MpO1xuICAgICAgICB9KSA6IF9pc1BsYWNlaG9sZGVyKGIpICYmIF9pc1BsYWNlaG9sZGVyKGMpID8gX2N1cnJ5MihmdW5jdGlvbiAoX2IsIF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIF9iLCBfYyk7XG4gICAgICAgIH0pIDogX2lzUGxhY2Vob2xkZXIoYSkgPyBfY3VycnkxKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgIHJldHVybiBmbihfYSwgYiwgYyk7XG4gICAgICAgIH0pIDogX2lzUGxhY2Vob2xkZXIoYikgPyBfY3VycnkxKGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgIHJldHVybiBmbihhLCBfYiwgYyk7XG4gICAgICAgIH0pIDogX2lzUGxhY2Vob2xkZXIoYykgPyBfY3VycnkxKGZ1bmN0aW9uIChfYykge1xuICAgICAgICAgIHJldHVybiBmbihhLCBiLCBfYyk7XG4gICAgICAgIH0pIDogZm4oYSwgYiwgYyk7XG4gICAgfVxuICB9O1xufSIsImltcG9ydCBfYXJpdHkgZnJvbSBcIi4vX2FyaXR5LmpzXCI7XG5pbXBvcnQgX2lzUGxhY2Vob2xkZXIgZnJvbSBcIi4vX2lzUGxhY2Vob2xkZXIuanNcIjtcbi8qKlxuICogSW50ZXJuYWwgY3VycnlOIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSBsZW5ndGggVGhlIGFyaXR5IG9mIHRoZSBjdXJyaWVkIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtBcnJheX0gcmVjZWl2ZWQgQW4gYXJyYXkgb2YgYXJndW1lbnRzIHJlY2VpdmVkIHRodXMgZmFyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBjdXJyaWVkIGZ1bmN0aW9uLlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jdXJyeU4obGVuZ3RoLCByZWNlaXZlZCwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29tYmluZWQgPSBbXTtcbiAgICB2YXIgYXJnc0lkeCA9IDA7XG4gICAgdmFyIGxlZnQgPSBsZW5ndGg7XG4gICAgdmFyIGNvbWJpbmVkSWR4ID0gMDtcbiAgICB2YXIgaGFzUGxhY2Vob2xkZXIgPSBmYWxzZTtcblxuICAgIHdoaWxlIChjb21iaW5lZElkeCA8IHJlY2VpdmVkLmxlbmd0aCB8fCBhcmdzSWR4IDwgYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgdmFyIHJlc3VsdDtcblxuICAgICAgaWYgKGNvbWJpbmVkSWR4IDwgcmVjZWl2ZWQubGVuZ3RoICYmICghX2lzUGxhY2Vob2xkZXIocmVjZWl2ZWRbY29tYmluZWRJZHhdKSB8fCBhcmdzSWR4ID49IGFyZ3VtZW50cy5sZW5ndGgpKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlY2VpdmVkW2NvbWJpbmVkSWR4XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IGFyZ3VtZW50c1thcmdzSWR4XTtcbiAgICAgICAgYXJnc0lkeCArPSAxO1xuICAgICAgfVxuXG4gICAgICBjb21iaW5lZFtjb21iaW5lZElkeF0gPSByZXN1bHQ7XG5cbiAgICAgIGlmICghX2lzUGxhY2Vob2xkZXIocmVzdWx0KSkge1xuICAgICAgICBsZWZ0IC09IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYXNQbGFjZWhvbGRlciA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbWJpbmVkSWR4ICs9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuICFoYXNQbGFjZWhvbGRlciAmJiBsZWZ0IDw9IDAgPyBmbi5hcHBseSh0aGlzLCBjb21iaW5lZCkgOiBfYXJpdHkoTWF0aC5tYXgoMCwgbGVmdCksIF9jdXJyeU4obGVuZ3RoLCBjb21iaW5lZCwgZm4pKTtcbiAgfTtcbn0iLCJpbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vX2lzQXJyYXkuanNcIjtcbmltcG9ydCBfaXNUcmFuc2Zvcm1lciBmcm9tIFwiLi9faXNUcmFuc2Zvcm1lci5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBkaXNwYXRjaGVzIHdpdGggZGlmZmVyZW50IHN0cmF0ZWdpZXMgYmFzZWQgb24gdGhlXG4gKiBvYmplY3QgaW4gbGlzdCBwb3NpdGlvbiAobGFzdCBhcmd1bWVudCkuIElmIGl0IGlzIGFuIGFycmF5LCBleGVjdXRlcyBbZm5dLlxuICogT3RoZXJ3aXNlLCBpZiBpdCBoYXMgYSBmdW5jdGlvbiB3aXRoIG9uZSBvZiB0aGUgZ2l2ZW4gbWV0aG9kIG5hbWVzLCBpdCB3aWxsXG4gKiBleGVjdXRlIHRoYXQgZnVuY3Rpb24gKGZ1bmN0b3IgY2FzZSkuIE90aGVyd2lzZSwgaWYgaXQgaXMgYSB0cmFuc2Zvcm1lcixcbiAqIHVzZXMgdHJhbnNkdWNlciBjcmVhdGVkIGJ5IFt0cmFuc2R1Y2VyQ3JlYXRvcl0gdG8gcmV0dXJuIGEgbmV3IHRyYW5zZm9ybWVyXG4gKiAodHJhbnNkdWNlciBjYXNlKS5cbiAqIE90aGVyd2lzZSwgaXQgd2lsbCBkZWZhdWx0IHRvIGV4ZWN1dGluZyBbZm5dLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBtZXRob2ROYW1lcyBwcm9wZXJ0aWVzIHRvIGNoZWNrIGZvciBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNkdWNlckNyZWF0b3IgdHJhbnNkdWNlciBmYWN0b3J5IGlmIG9iamVjdCBpcyB0cmFuc2Zvcm1lclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gZGVmYXVsdCByYW1kYSBpbXBsZW1lbnRhdGlvblxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCBkaXNwYXRjaGVzIG9uIG9iamVjdCBpbiBsaXN0IHBvc2l0aW9uXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2Rpc3BhdGNoYWJsZShtZXRob2ROYW1lcywgdHJhbnNkdWNlckNyZWF0b3IsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH1cblxuICAgIHZhciBvYmogPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdO1xuXG4gICAgaWYgKCFfaXNBcnJheShvYmopKSB7XG4gICAgICB2YXIgaWR4ID0gMDtcblxuICAgICAgd2hpbGUgKGlkeCA8IG1ldGhvZE5hbWVzLmxlbmd0aCkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialttZXRob2ROYW1lc1tpZHhdXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBvYmpbbWV0aG9kTmFtZXNbaWR4XV0uYXBwbHkob2JqLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDAsIC0xKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZHggKz0gMTtcbiAgICAgIH1cblxuICAgICAgaWYgKF9pc1RyYW5zZm9ybWVyKG9iaikpIHtcbiAgICAgICAgdmFyIHRyYW5zZHVjZXIgPSB0cmFuc2R1Y2VyQ3JlYXRvci5hcHBseShudWxsLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDAsIC0xKSk7XG4gICAgICAgIHJldHVybiB0cmFuc2R1Y2VyKG9iaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59IiwiaW1wb3J0IF9pc0ludGVnZXIgZnJvbSBcIi4vX2lzSW50ZWdlci5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgcmVtb3ZlIGZyb20gXCIuLi9yZW1vdmUuanNcIjtcbi8qKlxuICogUmV0dXJucyBhIG5ldyBvYmplY3QgdGhhdCBkb2VzIG5vdCBjb250YWluIGEgYHByb3BgIHByb3BlcnR5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHByb3AgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGRpc3NvY2lhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvYmogVGhlIG9iamVjdCB0byBjbG9uZVxuICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3QgZXF1aXZhbGVudCB0byB0aGUgb3JpZ2luYWwgYnV0IHdpdGhvdXQgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9kaXNzb2MocHJvcCwgb2JqKSB7XG4gIGlmIChvYmogPT0gbnVsbCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBpZiAoX2lzSW50ZWdlcihwcm9wKSAmJiBfaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIHJlbW92ZShwcm9wLCAxLCBvYmopO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gb2JqKSB7XG4gICAgcmVzdWx0W3BdID0gb2JqW3BdO1xuICB9XG5cbiAgZGVsZXRlIHJlc3VsdFtwcm9wXTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0iLCJpbXBvcnQgX2FycmF5RnJvbUl0ZXJhdG9yIGZyb20gXCIuL19hcnJheUZyb21JdGVyYXRvci5qc1wiO1xuaW1wb3J0IF9pbmNsdWRlc1dpdGggZnJvbSBcIi4vX2luY2x1ZGVzV2l0aC5qc1wiO1xuaW1wb3J0IF9mdW5jdGlvbk5hbWUgZnJvbSBcIi4vX2Z1bmN0aW9uTmFtZS5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vX2hhcy5qc1wiO1xuaW1wb3J0IF9vYmplY3RJcyBmcm9tIFwiLi9fb2JqZWN0SXMuanNcIjtcbmltcG9ydCBrZXlzIGZyb20gXCIuLi9rZXlzLmpzXCI7XG5pbXBvcnQgdHlwZSBmcm9tIFwiLi4vdHlwZS5qc1wiO1xuLyoqXG4gKiBwcml2YXRlIF91bmlxQ29udGVudEVxdWFscyBmdW5jdGlvbi5cbiAqIFRoYXQgZnVuY3Rpb24gaXMgY2hlY2tpbmcgZXF1YWxpdHkgb2YgMiBpdGVyYXRvciBjb250ZW50cyB3aXRoIDIgYXNzdW1wdGlvbnNcbiAqIC0gaXRlcmF0b3JzIGxlbmd0aHMgYXJlIHRoZSBzYW1lXG4gKiAtIGl0ZXJhdG9ycyB2YWx1ZXMgYXJlIHVuaXF1ZVxuICpcbiAqIGZhbHNlLXBvc2l0aXZlIHJlc3VsdCB3aWxsIGJlIHJldHVybmVkIGZvciBjb21wYXJpc29uIG9mLCBlLmcuXG4gKiAtIFsxLDIsM10gYW5kIFsxLDIsMyw0XVxuICogLSBbMSwxLDFdIGFuZCBbMSwyLDNdXG4gKiAqL1xuXG5mdW5jdGlvbiBfdW5pcUNvbnRlbnRFcXVhbHMoYUl0ZXJhdG9yLCBiSXRlcmF0b3IsIHN0YWNrQSwgc3RhY2tCKSB7XG4gIHZhciBhID0gX2FycmF5RnJvbUl0ZXJhdG9yKGFJdGVyYXRvcik7XG5cbiAgdmFyIGIgPSBfYXJyYXlGcm9tSXRlcmF0b3IoYkl0ZXJhdG9yKTtcblxuICBmdW5jdGlvbiBlcShfYSwgX2IpIHtcbiAgICByZXR1cm4gX2VxdWFscyhfYSwgX2IsIHN0YWNrQS5zbGljZSgpLCBzdGFja0Iuc2xpY2UoKSk7XG4gIH0gLy8gaWYgKmEqIGFycmF5IGNvbnRhaW5zIGFueSBlbGVtZW50IHRoYXQgaXMgbm90IGluY2x1ZGVkIGluICpiKlxuXG5cbiAgcmV0dXJuICFfaW5jbHVkZXNXaXRoKGZ1bmN0aW9uIChiLCBhSXRlbSkge1xuICAgIHJldHVybiAhX2luY2x1ZGVzV2l0aChlcSwgYUl0ZW0sIGIpO1xuICB9LCBiLCBhKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2VxdWFscyhhLCBiLCBzdGFja0EsIHN0YWNrQikge1xuICBpZiAoX29iamVjdElzKGEsIGIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgdHlwZUEgPSB0eXBlKGEpO1xuXG4gIGlmICh0eXBlQSAhPT0gdHlwZShiKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYVsnZmFudGFzeS1sYW5kL2VxdWFscyddID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBiWydmYW50YXN5LWxhbmQvZXF1YWxzJ10gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZW9mIGFbJ2ZhbnRhc3ktbGFuZC9lcXVhbHMnXSA9PT0gJ2Z1bmN0aW9uJyAmJiBhWydmYW50YXN5LWxhbmQvZXF1YWxzJ10oYikgJiYgdHlwZW9mIGJbJ2ZhbnRhc3ktbGFuZC9lcXVhbHMnXSA9PT0gJ2Z1bmN0aW9uJyAmJiBiWydmYW50YXN5LWxhbmQvZXF1YWxzJ10oYSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGEuZXF1YWxzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBiLmVxdWFscyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlb2YgYS5lcXVhbHMgPT09ICdmdW5jdGlvbicgJiYgYS5lcXVhbHMoYikgJiYgdHlwZW9mIGIuZXF1YWxzID09PSAnZnVuY3Rpb24nICYmIGIuZXF1YWxzKGEpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlQSkge1xuICAgIGNhc2UgJ0FyZ3VtZW50cyc6XG4gICAgY2FzZSAnQXJyYXknOlxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICBpZiAodHlwZW9mIGEuY29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgJiYgX2Z1bmN0aW9uTmFtZShhLmNvbnN0cnVjdG9yKSA9PT0gJ1Byb21pc2UnKSB7XG4gICAgICAgIHJldHVybiBhID09PSBiO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgIGNhc2UgJ051bWJlcic6XG4gICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgIGlmICghKHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBfb2JqZWN0SXMoYS52YWx1ZU9mKCksIGIudmFsdWVPZigpKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgaWYgKCFfb2JqZWN0SXMoYS52YWx1ZU9mKCksIGIudmFsdWVPZigpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnRXJyb3InOlxuICAgICAgcmV0dXJuIGEubmFtZSA9PT0gYi5uYW1lICYmIGEubWVzc2FnZSA9PT0gYi5tZXNzYWdlO1xuXG4gICAgY2FzZSAnUmVnRXhwJzpcbiAgICAgIGlmICghKGEuc291cmNlID09PSBiLnNvdXJjZSAmJiBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiYgYS5pZ25vcmVDYXNlID09PSBiLmlnbm9yZUNhc2UgJiYgYS5tdWx0aWxpbmUgPT09IGIubXVsdGlsaW5lICYmIGEuc3RpY2t5ID09PSBiLnN0aWNreSAmJiBhLnVuaWNvZGUgPT09IGIudW5pY29kZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBpZHggPSBzdGFja0EubGVuZ3RoIC0gMTtcblxuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICBpZiAoc3RhY2tBW2lkeF0gPT09IGEpIHtcbiAgICAgIHJldHVybiBzdGFja0JbaWR4XSA9PT0gYjtcbiAgICB9XG5cbiAgICBpZHggLT0gMTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZUEpIHtcbiAgICBjYXNlICdNYXAnOlxuICAgICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF91bmlxQ29udGVudEVxdWFscyhhLmVudHJpZXMoKSwgYi5lbnRyaWVzKCksIHN0YWNrQS5jb25jYXQoW2FdKSwgc3RhY2tCLmNvbmNhdChbYl0pKTtcblxuICAgIGNhc2UgJ1NldCc6XG4gICAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3VuaXFDb250ZW50RXF1YWxzKGEudmFsdWVzKCksIGIudmFsdWVzKCksIHN0YWNrQS5jb25jYXQoW2FdKSwgc3RhY2tCLmNvbmNhdChbYl0pKTtcblxuICAgIGNhc2UgJ0FyZ3VtZW50cyc6XG4gICAgY2FzZSAnQXJyYXknOlxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgY2FzZSAnQm9vbGVhbic6XG4gICAgY2FzZSAnTnVtYmVyJzpcbiAgICBjYXNlICdTdHJpbmcnOlxuICAgIGNhc2UgJ0RhdGUnOlxuICAgIGNhc2UgJ0Vycm9yJzpcbiAgICBjYXNlICdSZWdFeHAnOlxuICAgIGNhc2UgJ0ludDhBcnJheSc6XG4gICAgY2FzZSAnVWludDhBcnJheSc6XG4gICAgY2FzZSAnVWludDhDbGFtcGVkQXJyYXknOlxuICAgIGNhc2UgJ0ludDE2QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQxNkFycmF5JzpcbiAgICBjYXNlICdJbnQzMkFycmF5JzpcbiAgICBjYXNlICdVaW50MzJBcnJheSc6XG4gICAgY2FzZSAnRmxvYXQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDY0QXJyYXknOlxuICAgIGNhc2UgJ0FycmF5QnVmZmVyJzpcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIFZhbHVlcyBvZiBvdGhlciB0eXBlcyBhcmUgb25seSBlcXVhbCBpZiBpZGVudGljYWwuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIga2V5c0EgPSBrZXlzKGEpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXMoYikubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGV4dGVuZGVkU3RhY2tBID0gc3RhY2tBLmNvbmNhdChbYV0pO1xuICB2YXIgZXh0ZW5kZWRTdGFja0IgPSBzdGFja0IuY29uY2F0KFtiXSk7XG4gIGlkeCA9IGtleXNBLmxlbmd0aCAtIDE7XG5cbiAgd2hpbGUgKGlkeCA+PSAwKSB7XG4gICAgdmFyIGtleSA9IGtleXNBW2lkeF07XG5cbiAgICBpZiAoIShfaGFzKGtleSwgYikgJiYgX2VxdWFscyhiW2tleV0sIGFba2V5XSwgZXh0ZW5kZWRTdGFja0EsIGV4dGVuZGVkU3RhY2tCKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZHggLT0gMTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9maWx0ZXIoZm4sIGxpc3QpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBsaXN0Lmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBpZiAoZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gbGlzdFtpZHhdO1xuICAgIH1cblxuICAgIGlkeCArPSAxO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZnVuY3Rpb25OYW1lKGYpIHtcbiAgLy8gU3RyaW5nKHggPT4geCkgZXZhbHVhdGVzIHRvIFwieCA9PiB4XCIsIHNvIHRoZSBwYXR0ZXJuIG1heSBub3QgbWF0Y2guXG4gIHZhciBtYXRjaCA9IFN0cmluZyhmKS5tYXRjaCgvXmZ1bmN0aW9uIChcXHcqKS8pO1xuICByZXR1cm4gbWF0Y2ggPT0gbnVsbCA/ICcnIDogbWF0Y2hbMV07XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2hhcyhwcm9wLCBvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pZGVudGl0eSh4KSB7XG4gIHJldHVybiB4O1xufSIsImltcG9ydCBfaW5kZXhPZiBmcm9tIFwiLi9faW5kZXhPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2luY2x1ZGVzKGEsIGxpc3QpIHtcbiAgcmV0dXJuIF9pbmRleE9mKGxpc3QsIGEsIDApID49IDA7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2luY2x1ZGVzV2l0aChwcmVkLCB4LCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGlmIChwcmVkKHgsIGxpc3RbaWR4XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlkeCArPSAxO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufSIsImltcG9ydCBlcXVhbHMgZnJvbSBcIi4uL2VxdWFscy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2luZGV4T2YobGlzdCwgYSwgaWR4KSB7XG4gIHZhciBpbmYsIGl0ZW07IC8vIEFycmF5LnByb3RvdHlwZS5pbmRleE9mIGRvZXNuJ3QgZXhpc3QgYmVsb3cgSUU5XG5cbiAgaWYgKHR5cGVvZiBsaXN0LmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBhKSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBpZiAoYSA9PT0gMCkge1xuICAgICAgICAgIC8vIG1hbnVhbGx5IGNyYXdsIHRoZSBsaXN0IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gKzAgYW5kIC0wXG4gICAgICAgICAgaW5mID0gMSAvIGE7XG5cbiAgICAgICAgICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGl0ZW0gPSBsaXN0W2lkeF07XG5cbiAgICAgICAgICAgIGlmIChpdGVtID09PSAwICYmIDEgLyBpdGVtID09PSBpbmYpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGlkeDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWR4ICs9IDE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9IGVsc2UgaWYgKGEgIT09IGEpIHtcbiAgICAgICAgICAvLyBOYU5cbiAgICAgICAgICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGl0ZW0gPSBsaXN0W2lkeF07XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ251bWJlcicgJiYgaXRlbSAhPT0gaXRlbSkge1xuICAgICAgICAgICAgICByZXR1cm4gaWR4O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZHggKz0gMTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH0gLy8gbm9uLXplcm8gbnVtYmVycyBjYW4gdXRpbGlzZSBTZXRcblxuXG4gICAgICAgIHJldHVybiBsaXN0LmluZGV4T2YoYSwgaWR4KTtcbiAgICAgIC8vIGFsbCB0aGVzZSB0eXBlcyBjYW4gdXRpbGlzZSBTZXRcblxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgcmV0dXJuIGxpc3QuaW5kZXhPZihhLCBpZHgpO1xuXG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBpZiAoYSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIG51bGwgY2FuIHV0aWxpc2UgU2V0XG4gICAgICAgICAgcmV0dXJuIGxpc3QuaW5kZXhPZihhLCBpZHgpO1xuICAgICAgICB9XG5cbiAgICB9XG4gIH0gLy8gYW55dGhpbmcgZWxzZSBub3QgY292ZXJlZCBhYm92ZSwgZGVmZXIgdG8gUi5lcXVhbHNcblxuXG4gIHdoaWxlIChpZHggPCBsaXN0Lmxlbmd0aCkge1xuICAgIGlmIChlcXVhbHMobGlzdFtpZHhdLCBhKSkge1xuICAgICAgcmV0dXJuIGlkeDtcbiAgICB9XG5cbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiAtMTtcbn0iLCJpbXBvcnQgX2hhcyBmcm9tIFwiLi9faGFzLmpzXCI7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG52YXIgX2lzQXJndW1lbnRzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJndW1lbnRzKSA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXScgPyBmdW5jdGlvbiBfaXNBcmd1bWVudHMoeCkge1xuICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBBcmd1bWVudHNdJztcbiAgfSA6IGZ1bmN0aW9uIF9pc0FyZ3VtZW50cyh4KSB7XG4gICAgcmV0dXJuIF9oYXMoJ2NhbGxlZScsIHgpO1xuICB9O1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBfaXNBcmd1bWVudHM7IiwiLyoqXG4gKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCBhbiBvYmplY3QgaXMgYW4gYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSBvYmplY3QgdG8gdGVzdC5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiBgdmFsYCBpcyBhbiBhcnJheSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgX2lzQXJyYXkoW10pOyAvLz0+IHRydWVcbiAqICAgICAgX2lzQXJyYXkobnVsbCk7IC8vPT4gZmFsc2VcbiAqICAgICAgX2lzQXJyYXkoe30pOyAvLz0+IGZhbHNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gX2lzQXJyYXkodmFsKSB7XG4gIHJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoID49IDAgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59OyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaXNBcnJheSBmcm9tIFwiLi9faXNBcnJheS5qc1wiO1xuaW1wb3J0IF9pc1N0cmluZyBmcm9tIFwiLi9faXNTdHJpbmcuanNcIjtcbi8qKlxuICogVGVzdHMgd2hldGhlciBvciBub3QgYW4gb2JqZWN0IGlzIHNpbWlsYXIgdG8gYW4gYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjYXRlZ29yeSBUeXBlXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAqIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0geCBUaGUgb2JqZWN0IHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgYHhgIGhhcyBhIG51bWVyaWMgbGVuZ3RoIHByb3BlcnR5IGFuZCBleHRyZW1lIGluZGljZXMgZGVmaW5lZDsgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgX2lzQXJyYXlMaWtlKFtdKTsgLy89PiB0cnVlXG4gKiAgICAgIF9pc0FycmF5TGlrZSh0cnVlKTsgLy89PiBmYWxzZVxuICogICAgICBfaXNBcnJheUxpa2Uoe30pOyAvLz0+IGZhbHNlXG4gKiAgICAgIF9pc0FycmF5TGlrZSh7bGVuZ3RoOiAxMH0pOyAvLz0+IGZhbHNlXG4gKiAgICAgIF9pc0FycmF5TGlrZSh7MDogJ3plcm8nLCA5OiAnbmluZScsIGxlbmd0aDogMTB9KTsgLy89PiB0cnVlXG4gKiAgICAgIF9pc0FycmF5TGlrZSh7bm9kZVR5cGU6IDEsIGxlbmd0aDogMX0pIC8vID0+IGZhbHNlXG4gKi9cblxudmFyIF9pc0FycmF5TGlrZSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIGlzQXJyYXlMaWtlKHgpIHtcbiAgaWYgKF9pc0FycmF5KHgpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoIXgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKF9pc1N0cmluZyh4KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh4Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHgubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiB4Lmhhc093blByb3BlcnR5KDApICYmIHguaGFzT3duUHJvcGVydHkoeC5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBfaXNBcnJheUxpa2U7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lzRnVuY3Rpb24oeCkge1xuICB2YXIgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KTtcbiAgcmV0dXJuIHR5cGUgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgQXN5bmNHZW5lcmF0b3JGdW5jdGlvbl0nO1xufSIsIi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBwYXNzZWQgYXJndW1lbnQgaXMgYW4gaW50ZWdlci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBuXG4gKiBAY2F0ZWdvcnkgVHlwZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgTnVtYmVyLmlzSW50ZWdlciB8fCBmdW5jdGlvbiBfaXNJbnRlZ2VyKG4pIHtcbiAgcmV0dXJuIG4gPDwgMCA9PT0gbjtcbn07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lzT2JqZWN0KHgpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lzUGxhY2Vob2xkZXIoYSkge1xuICByZXR1cm4gYSAhPSBudWxsICYmIHR5cGVvZiBhID09PSAnb2JqZWN0JyAmJiBhWydAQGZ1bmN0aW9uYWwvcGxhY2Vob2xkZXInXSA9PT0gdHJ1ZTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXNTdHJpbmcoeCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBTdHJpbmddJztcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXNUcmFuc2Zvcm1lcihvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIHR5cGVvZiBvYmpbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPT09ICdmdW5jdGlvbic7XG59IiwiLyoqXG4gKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCBhbiBvYmplY3QgaXMgYSB0eXBlZCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWwgVGhlIG9iamVjdCB0byB0ZXN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB2YWxgIGlzIGEgdHlwZWQgYXJyYXksIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIF9pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkoW10pKTsgLy89PiB0cnVlXG4gKiAgICAgIF9pc1R5cGVkQXJyYXkobmV3IEZsb2F0MzJBcnJheShbXSkpOyAvLz0+IHRydWVcbiAqICAgICAgX2lzVHlwZWRBcnJheShbXSk7IC8vPT4gZmFsc2VcbiAqICAgICAgX2lzVHlwZWRBcnJheShudWxsKTsgLy89PiBmYWxzZVxuICogICAgICBfaXNUeXBlZEFycmF5KHt9KTsgLy89PiBmYWxzZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXNUeXBlZEFycmF5KHZhbCkge1xuICB2YXIgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpO1xuICByZXR1cm4gdHlwZSA9PT0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyB8fCB0eXBlID09PSAnW29iamVjdCBJbnQ4QXJyYXldJyB8fCB0eXBlID09PSAnW29iamVjdCBVaW50OEFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgSW50MTZBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IFVpbnQxNkFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgSW50MzJBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IFVpbnQzMkFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgQmlnSW50NjRBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEJpZ1VpbnQ2NEFycmF5XSc7XG59IiwiaW1wb3J0IF9pc0FycmF5TGlrZSBmcm9tIFwiLi9faXNBcnJheUxpa2UuanNcIjtcbi8qKlxuICogYF9tYWtlRmxhdGAgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgb25lLWxldmVsIG9yIGZ1bGx5IHJlY3Vyc2l2ZVxuICogZnVuY3Rpb24gYmFzZWQgb24gdGhlIGZsYWcgcGFzc2VkIGluLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX21ha2VGbGF0KHJlY3Vyc2l2ZSkge1xuICByZXR1cm4gZnVuY3Rpb24gZmxhdHQobGlzdCkge1xuICAgIHZhciB2YWx1ZSwgamxlbiwgajtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGlkeCA9IDA7XG4gICAgdmFyIGlsZW4gPSBsaXN0Lmxlbmd0aDtcblxuICAgIHdoaWxlIChpZHggPCBpbGVuKSB7XG4gICAgICBpZiAoX2lzQXJyYXlMaWtlKGxpc3RbaWR4XSkpIHtcbiAgICAgICAgdmFsdWUgPSByZWN1cnNpdmUgPyBmbGF0dChsaXN0W2lkeF0pIDogbGlzdFtpZHhdO1xuICAgICAgICBqID0gMDtcbiAgICAgICAgamxlbiA9IHZhbHVlLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoaiA8IGpsZW4pIHtcbiAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSB2YWx1ZVtqXTtcbiAgICAgICAgICBqICs9IDE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IGxpc3RbaWR4XTtcbiAgICAgIH1cblxuICAgICAgaWR4ICs9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfbWFwKGZuLCBmdW5jdG9yKSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gZnVuY3Rvci5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSBBcnJheShsZW4pO1xuXG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICByZXN1bHRbaWR4XSA9IGZuKGZ1bmN0b3JbaWR4XSk7XG4gICAgaWR4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufSIsImltcG9ydCBfaGFzIGZyb20gXCIuL19oYXMuanNcIjsgLy8gQmFzZWQgb24gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2Fzc2lnblxuXG5mdW5jdGlvbiBfb2JqZWN0QXNzaWduKHRhcmdldCkge1xuICBpZiAodGFyZ2V0ID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgfVxuXG4gIHZhciBvdXRwdXQgPSBPYmplY3QodGFyZ2V0KTtcbiAgdmFyIGlkeCA9IDE7XG4gIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gIHdoaWxlIChpZHggPCBsZW5ndGgpIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2lkeF07XG5cbiAgICBpZiAoc291cmNlICE9IG51bGwpIHtcbiAgICAgIGZvciAodmFyIG5leHRLZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChfaGFzKG5leHRLZXksIHNvdXJjZSkpIHtcbiAgICAgICAgICBvdXRwdXRbbmV4dEtleV0gPSBzb3VyY2VbbmV4dEtleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHR5cGVvZiBPYmplY3QuYXNzaWduID09PSAnZnVuY3Rpb24nID8gT2JqZWN0LmFzc2lnbiA6IF9vYmplY3RBc3NpZ247IiwiLy8gQmFzZWQgb24gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG5mdW5jdGlvbiBfb2JqZWN0SXMoYSwgYikge1xuICAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtXG4gIGlmIChhID09PSBiKSB7XG4gICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgLy8gU3RlcHMgNi5iLTYuZTogKzAgIT0gLTBcbiAgICByZXR1cm4gYSAhPT0gMCB8fCAxIC8gYSA9PT0gMSAvIGI7XG4gIH0gZWxzZSB7XG4gICAgLy8gU3RlcCA2LmE6IE5hTiA9PSBOYU5cbiAgICByZXR1cm4gYSAhPT0gYSAmJiBiICE9PSBiO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHR5cGVvZiBPYmplY3QuaXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuaXMgOiBfb2JqZWN0SXM7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3F1b3RlKHMpIHtcbiAgdmFyIGVzY2FwZWQgPSBzLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykucmVwbGFjZSgvW1xcYl0vZywgJ1xcXFxiJykgLy8gXFxiIG1hdGNoZXMgd29yZCBib3VuZGFyeTsgW1xcYl0gbWF0Y2hlcyBiYWNrc3BhY2VcbiAgLnJlcGxhY2UoL1xcZi9nLCAnXFxcXGYnKS5yZXBsYWNlKC9cXG4vZywgJ1xcXFxuJykucmVwbGFjZSgvXFxyL2csICdcXFxccicpLnJlcGxhY2UoL1xcdC9nLCAnXFxcXHQnKS5yZXBsYWNlKC9cXHYvZywgJ1xcXFx2JykucmVwbGFjZSgvXFwwL2csICdcXFxcMCcpO1xuICByZXR1cm4gJ1wiJyArIGVzY2FwZWQucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpICsgJ1wiJztcbn0iLCJpbXBvcnQgX2FycmF5UmVkdWNlIGZyb20gXCIuL19hcnJheVJlZHVjZS5qc1wiO1xuaW1wb3J0IF9jcmVhdGVSZWR1Y2UgZnJvbSBcIi4vX2NyZWF0ZVJlZHVjZS5qc1wiO1xuXG5mdW5jdGlvbiBfaXRlcmFibGVSZWR1Y2UocmVkdWNlciwgYWNjLCBpdGVyKSB7XG4gIHZhciBzdGVwID0gaXRlci5uZXh0KCk7XG5cbiAgd2hpbGUgKCFzdGVwLmRvbmUpIHtcbiAgICBhY2MgPSByZWR1Y2VyKGFjYywgc3RlcC52YWx1ZSk7XG4gICAgc3RlcCA9IGl0ZXIubmV4dCgpO1xuICB9XG5cbiAgcmV0dXJuIGFjYztcbn1cblxuZnVuY3Rpb24gX21ldGhvZFJlZHVjZShyZWR1Y2VyLCBhY2MsIG9iaiwgbWV0aG9kTmFtZSkge1xuICByZXR1cm4gb2JqW21ldGhvZE5hbWVdKHJlZHVjZXIsIGFjYyk7XG59XG5cbnZhciBfcmVkdWNlID1cbi8qI19fUFVSRV9fKi9cbl9jcmVhdGVSZWR1Y2UoX2FycmF5UmVkdWNlLCBfbWV0aG9kUmVkdWNlLCBfaXRlcmFibGVSZWR1Y2UpO1xuXG5leHBvcnQgZGVmYXVsdCBfcmVkdWNlOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9yZWR1Y2VkKHgpIHtcbiAgcmV0dXJuIHggJiYgeFsnQEB0cmFuc2R1Y2VyL3JlZHVjZWQnXSA/IHggOiB7XG4gICAgJ0BAdHJhbnNkdWNlci92YWx1ZSc6IHgsXG4gICAgJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJzogdHJ1ZVxuICB9O1xufSIsIi8qKlxuICogUG9seWZpbGwgZnJvbSA8aHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZS90b0lTT1N0cmluZz4uXG4gKi9cbnZhciBwYWQgPSBmdW5jdGlvbiBwYWQobikge1xuICByZXR1cm4gKG4gPCAxMCA/ICcwJyA6ICcnKSArIG47XG59O1xuXG52YXIgX3RvSVNPU3RyaW5nID0gdHlwZW9mIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nID09PSAnZnVuY3Rpb24nID8gZnVuY3Rpb24gX3RvSVNPU3RyaW5nKGQpIHtcbiAgcmV0dXJuIGQudG9JU09TdHJpbmcoKTtcbn0gOiBmdW5jdGlvbiBfdG9JU09TdHJpbmcoZCkge1xuICByZXR1cm4gZC5nZXRVVENGdWxsWWVhcigpICsgJy0nICsgcGFkKGQuZ2V0VVRDTW9udGgoKSArIDEpICsgJy0nICsgcGFkKGQuZ2V0VVRDRGF0ZSgpKSArICdUJyArIHBhZChkLmdldFVUQ0hvdXJzKCkpICsgJzonICsgcGFkKGQuZ2V0VVRDTWludXRlcygpKSArICc6JyArIHBhZChkLmdldFVUQ1NlY29uZHMoKSkgKyAnLicgKyAoZC5nZXRVVENNaWxsaXNlY29uZHMoKSAvIDEwMDApLnRvRml4ZWQoMykuc2xpY2UoMiwgNSkgKyAnWic7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBfdG9JU09TdHJpbmc7IiwiaW1wb3J0IF9pbmNsdWRlcyBmcm9tIFwiLi9faW5jbHVkZXMuanNcIjtcbmltcG9ydCBfbWFwIGZyb20gXCIuL19tYXAuanNcIjtcbmltcG9ydCBfcXVvdGUgZnJvbSBcIi4vX3F1b3RlLmpzXCI7XG5pbXBvcnQgX3RvSVNPU3RyaW5nIGZyb20gXCIuL190b0lTT1N0cmluZy5qc1wiO1xuaW1wb3J0IGtleXMgZnJvbSBcIi4uL2tleXMuanNcIjtcbmltcG9ydCByZWplY3QgZnJvbSBcIi4uL3JlamVjdC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3RvU3RyaW5nKHgsIHNlZW4pIHtcbiAgdmFyIHJlY3VyID0gZnVuY3Rpb24gcmVjdXIoeSkge1xuICAgIHZhciB4cyA9IHNlZW4uY29uY2F0KFt4XSk7XG4gICAgcmV0dXJuIF9pbmNsdWRlcyh5LCB4cykgPyAnPENpcmN1bGFyPicgOiBfdG9TdHJpbmcoeSwgeHMpO1xuICB9OyAvLyAgbWFwUGFpcnMgOjogKE9iamVjdCwgW1N0cmluZ10pIC0+IFtTdHJpbmddXG5cblxuICB2YXIgbWFwUGFpcnMgPSBmdW5jdGlvbiAob2JqLCBrZXlzKSB7XG4gICAgcmV0dXJuIF9tYXAoZnVuY3Rpb24gKGspIHtcbiAgICAgIHJldHVybiBfcXVvdGUoaykgKyAnOiAnICsgcmVjdXIob2JqW2tdKTtcbiAgICB9LCBrZXlzLnNsaWNlKCkuc29ydCgpKTtcbiAgfTtcblxuICBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSkge1xuICAgIGNhc2UgJ1tvYmplY3QgQXJndW1lbnRzXSc6XG4gICAgICByZXR1cm4gJyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgnICsgX21hcChyZWN1ciwgeCkuam9pbignLCAnKSArICcpKSc7XG5cbiAgICBjYXNlICdbb2JqZWN0IEFycmF5XSc6XG4gICAgICByZXR1cm4gJ1snICsgX21hcChyZWN1ciwgeCkuY29uY2F0KG1hcFBhaXJzKHgsIHJlamVjdChmdW5jdGlvbiAoaykge1xuICAgICAgICByZXR1cm4gL15cXGQrJC8udGVzdChrKTtcbiAgICAgIH0sIGtleXMoeCkpKSkuam9pbignLCAnKSArICddJztcblxuICAgIGNhc2UgJ1tvYmplY3QgQm9vbGVhbl0nOlxuICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnb2JqZWN0JyA/ICduZXcgQm9vbGVhbignICsgcmVjdXIoeC52YWx1ZU9mKCkpICsgJyknIDogeC50b1N0cmluZygpO1xuXG4gICAgY2FzZSAnW29iamVjdCBEYXRlXSc6XG4gICAgICByZXR1cm4gJ25ldyBEYXRlKCcgKyAoaXNOYU4oeC52YWx1ZU9mKCkpID8gcmVjdXIoTmFOKSA6IF9xdW90ZShfdG9JU09TdHJpbmcoeCkpKSArICcpJztcblxuICAgIGNhc2UgJ1tvYmplY3QgTWFwXSc6XG4gICAgICByZXR1cm4gJ25ldyBNYXAoJyArIHJlY3VyKEFycmF5LmZyb20oeCkpICsgJyknO1xuXG4gICAgY2FzZSAnW29iamVjdCBOdWxsXSc6XG4gICAgICByZXR1cm4gJ251bGwnO1xuXG4gICAgY2FzZSAnW29iamVjdCBOdW1iZXJdJzpcbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgPyAnbmV3IE51bWJlcignICsgcmVjdXIoeC52YWx1ZU9mKCkpICsgJyknIDogMSAvIHggPT09IC1JbmZpbml0eSA/ICctMCcgOiB4LnRvU3RyaW5nKDEwKTtcblxuICAgIGNhc2UgJ1tvYmplY3QgU2V0XSc6XG4gICAgICByZXR1cm4gJ25ldyBTZXQoJyArIHJlY3VyKEFycmF5LmZyb20oeCkuc29ydCgpKSArICcpJztcblxuICAgIGNhc2UgJ1tvYmplY3QgU3RyaW5nXSc6XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdvYmplY3QnID8gJ25ldyBTdHJpbmcoJyArIHJlY3VyKHgudmFsdWVPZigpKSArICcpJyA6IF9xdW90ZSh4KTtcblxuICAgIGNhc2UgJ1tvYmplY3QgVW5kZWZpbmVkXSc6XG4gICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKHR5cGVvZiB4LnRvU3RyaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciByZXByID0geC50b1N0cmluZygpO1xuXG4gICAgICAgIGlmIChyZXByICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgICAgIHJldHVybiByZXByO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAneycgKyBtYXBQYWlycyh4LCBrZXlzKHgpKS5qb2luKCcsICcpICsgJ30nO1xuICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hBcnJheVJlZHVjZSh4ZiwgYWNjLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGFjYyA9IHhmWydAQHRyYW5zZHVjZXIvc3RlcCddKGFjYywgbGlzdFtpZHhdKTtcblxuICAgIGlmIChhY2MgJiYgYWNjWydAQHRyYW5zZHVjZXIvcmVkdWNlZCddKSB7XG4gICAgICBhY2MgPSBhY2NbJ0BAdHJhbnNkdWNlci92YWx1ZSddO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWR4ICs9IDE7XG4gIH1cblxuICByZXR1cm4geGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShhY2MpO1xufSIsImltcG9ydCBfY3JlYXRlUmVkdWNlIGZyb20gXCIuL19jcmVhdGVSZWR1Y2UuanNcIjtcbmltcG9ydCBfeEFycmF5UmVkdWNlIGZyb20gXCIuL194QXJyYXlSZWR1Y2UuanNcIjtcbmltcG9ydCBiaW5kIGZyb20gXCIuLi9iaW5kLmpzXCI7XG5cbmZ1bmN0aW9uIF94SXRlcmFibGVSZWR1Y2UoeGYsIGFjYywgaXRlcikge1xuICB2YXIgc3RlcCA9IGl0ZXIubmV4dCgpO1xuXG4gIHdoaWxlICghc3RlcC5kb25lKSB7XG4gICAgYWNjID0geGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10oYWNjLCBzdGVwLnZhbHVlKTtcblxuICAgIGlmIChhY2MgJiYgYWNjWydAQHRyYW5zZHVjZXIvcmVkdWNlZCddKSB7XG4gICAgICBhY2MgPSBhY2NbJ0BAdHJhbnNkdWNlci92YWx1ZSddO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgc3RlcCA9IGl0ZXIubmV4dCgpO1xuICB9XG5cbiAgcmV0dXJuIHhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10oYWNjKTtcbn1cblxuZnVuY3Rpb24gX3hNZXRob2RSZWR1Y2UoeGYsIGFjYywgb2JqLCBtZXRob2ROYW1lKSB7XG4gIHJldHVybiB4ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKG9ialttZXRob2ROYW1lXShiaW5kKHhmWydAQHRyYW5zZHVjZXIvc3RlcCddLCB4ZiksIGFjYykpO1xufVxuXG52YXIgX3hSZWR1Y2UgPVxuLyojX19QVVJFX18qL1xuX2NyZWF0ZVJlZHVjZShfeEFycmF5UmVkdWNlLCBfeE1ldGhvZFJlZHVjZSwgX3hJdGVyYWJsZVJlZHVjZSk7XG5cbmV4cG9ydCBkZWZhdWx0IF94UmVkdWNlOyIsImltcG9ydCBfcmVkdWNlZCBmcm9tIFwiLi9fcmVkdWNlZC5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xuXG52YXIgWEFsbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhBbGwoZiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5mID0gZjtcbiAgICB0aGlzLmFsbCA9IHRydWU7XG4gIH1cblxuICBYQWxsLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcblxuICBYQWxsLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGlmICh0aGlzLmFsbCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10ocmVzdWx0KTtcbiAgfTtcblxuICBYQWxsLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgaWYgKCF0aGlzLmYoaW5wdXQpKSB7XG4gICAgICB0aGlzLmFsbCA9IGZhbHNlO1xuICAgICAgcmVzdWx0ID0gX3JlZHVjZWQodGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGZhbHNlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICByZXR1cm4gWEFsbDtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hhbGwoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKHhmKSB7XG4gICAgcmV0dXJuIG5ldyBYQWxsKGYsIHhmKTtcbiAgfTtcbn0iLCJpbXBvcnQgX3JlZHVjZWQgZnJvbSBcIi4vX3JlZHVjZWQuanNcIjtcbmltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcblxudmFyIFhBbnkgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYQW55KGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gICAgdGhpcy5hbnkgPSBmYWxzZTtcbiAgfVxuXG4gIFhBbnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuXG4gIFhBbnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgaWYgKCF0aGlzLmFueSkge1xuICAgICAgcmVzdWx0ID0gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH07XG5cbiAgWEFueS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIGlmICh0aGlzLmYoaW5wdXQpKSB7XG4gICAgICB0aGlzLmFueSA9IHRydWU7XG4gICAgICByZXN1bHQgPSBfcmVkdWNlZCh0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdHJ1ZSkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgcmV0dXJuIFhBbnk7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94YW55KGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWEFueShmLCB4Zik7XG4gIH07XG59IiwiZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9pbml0J10oKTtcbiAgfSxcbiAgcmVzdWx0OiBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShyZXN1bHQpO1xuICB9XG59OyIsImltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcblxudmFyIFhGaWx0ZXIgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYRmlsdGVyKGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gIH1cblxuICBYRmlsdGVyLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcbiAgWEZpbHRlci5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IF94ZkJhc2UucmVzdWx0O1xuXG4gIFhGaWx0ZXIucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICByZXR1cm4gdGhpcy5mKGlucHV0KSA/IHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCBpbnB1dCkgOiByZXN1bHQ7XG4gIH07XG5cbiAgcmV0dXJuIFhGaWx0ZXI7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94ZmlsdGVyKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWEZpbHRlcihmLCB4Zik7XG4gIH07XG59IiwiaW1wb3J0IF9yZWR1Y2VkIGZyb20gXCIuL19yZWR1Y2VkLmpzXCI7XG5pbXBvcnQgX3hmQmFzZSBmcm9tIFwiLi9feGZCYXNlLmpzXCI7XG5cbnZhciBYRmluZCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhGaW5kKGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gICAgdGhpcy5mb3VuZCA9IGZhbHNlO1xuICB9XG5cbiAgWEZpbmQucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuXG4gIFhGaW5kLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGlmICghdGhpcy5mb3VuZCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIHZvaWQgMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShyZXN1bHQpO1xuICB9O1xuXG4gIFhGaW5kLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgaWYgKHRoaXMuZihpbnB1dCkpIHtcbiAgICAgIHRoaXMuZm91bmQgPSB0cnVlO1xuICAgICAgcmVzdWx0ID0gX3JlZHVjZWQodGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICByZXR1cm4gWEZpbmQ7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94ZmluZChmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhGaW5kKGYsIHhmKTtcbiAgfTtcbn0iLCJpbXBvcnQgX3JlZHVjZWQgZnJvbSBcIi4vX3JlZHVjZWQuanNcIjtcbmltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcblxudmFyIFhGaW5kSW5kZXggPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYRmluZEluZGV4KGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gICAgdGhpcy5pZHggPSAtMTtcbiAgICB0aGlzLmZvdW5kID0gZmFsc2U7XG4gIH1cblxuICBYRmluZEluZGV4LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcblxuICBYRmluZEluZGV4LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGlmICghdGhpcy5mb3VuZCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIC0xKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH07XG5cbiAgWEZpbmRJbmRleC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHRoaXMuaWR4ICs9IDE7XG5cbiAgICBpZiAodGhpcy5mKGlucHV0KSkge1xuICAgICAgdGhpcy5mb3VuZCA9IHRydWU7XG4gICAgICByZXN1bHQgPSBfcmVkdWNlZCh0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdGhpcy5pZHgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHJldHVybiBYRmluZEluZGV4O1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeGZpbmRJbmRleChmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhGaW5kSW5kZXgoZiwgeGYpO1xuICB9O1xufSIsImltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcblxudmFyIFhNYXAgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYTWFwKGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gIH1cblxuICBYTWFwLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcbiAgWE1hcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IF94ZkJhc2UucmVzdWx0O1xuXG4gIFhNYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIHRoaXMuZihpbnB1dCkpO1xuICB9O1xuXG4gIHJldHVybiBYTWFwO1xufSgpO1xuXG52YXIgX3htYXAgPSBmdW5jdGlvbiBfeG1hcChmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhNYXAoZiwgeGYpO1xuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgX3htYXA7IiwiaW1wb3J0IF9jbG9uZSBmcm9tIFwiLi9fY2xvbmUuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL19oYXMuanNcIjtcbmltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcblxudmFyIFhSZWR1Y2VCeSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhSZWR1Y2VCeSh2YWx1ZUZuLCB2YWx1ZUFjYywga2V5Rm4sIHhmKSB7XG4gICAgdGhpcy52YWx1ZUZuID0gdmFsdWVGbjtcbiAgICB0aGlzLnZhbHVlQWNjID0gdmFsdWVBY2M7XG4gICAgdGhpcy5rZXlGbiA9IGtleUZuO1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmlucHV0cyA9IHt9O1xuICB9XG5cbiAgWFJlZHVjZUJ5LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcblxuICBYUmVkdWNlQnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgdmFyIGtleTtcblxuICAgIGZvciAoa2V5IGluIHRoaXMuaW5wdXRzKSB7XG4gICAgICBpZiAoX2hhcyhrZXksIHRoaXMuaW5wdXRzKSkge1xuICAgICAgICByZXN1bHQgPSB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdGhpcy5pbnB1dHNba2V5XSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdFsnQEB0cmFuc2R1Y2VyL3JlZHVjZWQnXSkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdFsnQEB0cmFuc2R1Y2VyL3ZhbHVlJ107XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmlucHV0cyA9IG51bGw7XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShyZXN1bHQpO1xuICB9O1xuXG4gIFhSZWR1Y2VCeS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHZhciBrZXkgPSB0aGlzLmtleUZuKGlucHV0KTtcbiAgICB0aGlzLmlucHV0c1trZXldID0gdGhpcy5pbnB1dHNba2V5XSB8fCBba2V5LCBfY2xvbmUodGhpcy52YWx1ZUFjYywgZmFsc2UpXTtcbiAgICB0aGlzLmlucHV0c1trZXldWzFdID0gdGhpcy52YWx1ZUZuKHRoaXMuaW5wdXRzW2tleV1bMV0sIGlucHV0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHJldHVybiBYUmVkdWNlQnk7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94cmVkdWNlQnkodmFsdWVGbiwgdmFsdWVBY2MsIGtleUZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhSZWR1Y2VCeSh2YWx1ZUZuLCB2YWx1ZUFjYywga2V5Rm4sIHhmKTtcbiAgfTtcbn0iLCJpbXBvcnQgX3JlZHVjZWQgZnJvbSBcIi4vX3JlZHVjZWQuanNcIjtcbmltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcblxudmFyIFhUYWtlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWFRha2UobiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5uID0gbjtcbiAgICB0aGlzLmkgPSAwO1xuICB9XG5cbiAgWFRha2UucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYVGFrZS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IF94ZkJhc2UucmVzdWx0O1xuXG4gIFhUYWtlLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgdGhpcy5pICs9IDE7XG4gICAgdmFyIHJldCA9IHRoaXMubiA9PT0gMCA/IHJlc3VsdCA6IHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCBpbnB1dCk7XG4gICAgcmV0dXJuIHRoaXMubiA+PSAwICYmIHRoaXMuaSA+PSB0aGlzLm4gPyBfcmVkdWNlZChyZXQpIDogcmV0O1xuICB9O1xuXG4gIHJldHVybiBYVGFrZTtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3h0YWtlKG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWFRha2UobiwgeGYpO1xuICB9O1xufSIsImltcG9ydCBfU2V0IGZyb20gXCIuL19TZXQuanNcIjtcbmltcG9ydCBfeGZCYXNlIGZyb20gXCIuL194ZkJhc2UuanNcIjtcblxudmFyIFhVbmlxQnkgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYVW5pcUJ5KGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gICAgdGhpcy5zZXQgPSBuZXcgX1NldCgpO1xuICB9XG5cbiAgWFVuaXFCeS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhVbmlxQnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcblxuICBYVW5pcUJ5LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0LmFkZCh0aGlzLmYoaW5wdXQpKSA/IHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCBpbnB1dCkgOiByZXN1bHQ7XG4gIH07XG5cbiAgcmV0dXJuIFhVbmlxQnk7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94dW5pcUJ5KGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWFVuaXFCeShmLCB4Zik7XG4gIH07XG59IiwidmFyIFhXcmFwID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWFdyYXAoZm4pIHtcbiAgICB0aGlzLmYgPSBmbjtcbiAgfVxuXG4gIFhXcmFwLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2luaXQgbm90IGltcGxlbWVudGVkIG9uIFhXcmFwJyk7XG4gIH07XG5cbiAgWFdyYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbiAoYWNjKSB7XG4gICAgcmV0dXJuIGFjYztcbiAgfTtcblxuICBYV3JhcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAoYWNjLCB4KSB7XG4gICAgcmV0dXJuIHRoaXMuZihhY2MsIHgpO1xuICB9O1xuXG4gIHJldHVybiBYV3JhcDtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3h3cmFwKGZuKSB7XG4gIHJldHVybiBuZXcgWFdyYXAoZm4pO1xufSIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZmlsdGVyIGZyb20gXCIuL2ludGVybmFsL19maWx0ZXIuanNcIjtcbmltcG9ydCBfU2V0IGZyb20gXCIuL2ludGVybmFsL19TZXQuanNcIjtcbmltcG9ydCB1bmlxIGZyb20gXCIuL3VuaXEuanNcIjtcbi8qKlxuICogQ29tYmluZXMgdHdvIGxpc3RzIGludG8gYSBzZXQgKGkuZS4gbm8gZHVwbGljYXRlcykgY29tcG9zZWQgb2YgdGhvc2VcbiAqIGVsZW1lbnRzIGNvbW1vbiB0byBib3RoIGxpc3RzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIFsqXSAtPiBbKl0gLT4gWypdXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MSBUaGUgZmlyc3QgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QyIFRoZSBzZWNvbmQgbGlzdC5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgbGlzdCBvZiBlbGVtZW50cyBmb3VuZCBpbiBib3RoIGBsaXN0MWAgYW5kIGBsaXN0MmAuXG4gKiBAc2VlIFIuaW5uZXJKb2luXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pbnRlcnNlY3Rpb24oWzEsMiwzLDRdLCBbNyw2LDUsNCwzXSk7IC8vPT4gWzQsIDNdXG4gKi9cblxudmFyIGludGVyc2VjdGlvbiA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIGludGVyc2VjdGlvbihsaXN0MSwgbGlzdDIpIHtcbiAgdmFyIHRvS2VlcCA9IG5ldyBfU2V0KCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0MS5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHRvS2VlcC5hZGQobGlzdDFbaV0pO1xuICB9XG5cbiAgcmV0dXJuIHVuaXEoX2ZpbHRlcih0b0tlZXAuaGFzLmJpbmQodG9LZWVwKSwgbGlzdDIpKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBpbnRlcnNlY3Rpb247IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBTZWUgaWYgYW4gb2JqZWN0IChpLmUuIGB2YWxgKSBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3VwcGxpZWQgY29uc3RydWN0b3IuIFRoaXNcbiAqIGZ1bmN0aW9uIHdpbGwgY2hlY2sgdXAgdGhlIGluaGVyaXRhbmNlIGNoYWluLCBpZiBhbnkuXG4gKiBJZiBgdmFsYCB3YXMgY3JlYXRlZCB1c2luZyBgT2JqZWN0LmNyZWF0ZWAsIGBSLmlzKE9iamVjdCwgdmFsKSA9PT0gdHJ1ZWAuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMy4wXG4gKiBAY2F0ZWdvcnkgVHlwZVxuICogQHNpZyAoKiAtPiB7Kn0pIC0+IGEgLT4gQm9vbGVhblxuICogQHBhcmFtIHtPYmplY3R9IGN0b3IgQSBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pcyhPYmplY3QsIHt9KTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaXMoTnVtYmVyLCAxKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaXMoT2JqZWN0LCAxKTsgLy89PiBmYWxzZVxuICogICAgICBSLmlzKFN0cmluZywgJ3MnKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaXMoU3RyaW5nLCBuZXcgU3RyaW5nKCcnKSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzKE9iamVjdCwgbmV3IFN0cmluZygnJykpOyAvLz0+IHRydWVcbiAqICAgICAgUi5pcyhPYmplY3QsICdzJyk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5pcyhOdW1iZXIsIHt9KTsgLy89PiBmYWxzZVxuICovXG5cbnZhciBpcyA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIGlzKEN0b3IsIHZhbCkge1xuICByZXR1cm4gdmFsIGluc3RhbmNlb2YgQ3RvciB8fCB2YWwgIT0gbnVsbCAmJiAodmFsLmNvbnN0cnVjdG9yID09PSBDdG9yIHx8IEN0b3IubmFtZSA9PT0gJ09iamVjdCcgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGlzOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBlbXB0eSBmcm9tIFwiLi9lbXB0eS5qc1wiO1xuaW1wb3J0IGVxdWFscyBmcm9tIFwiLi9lcXVhbHMuanNcIjtcbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGl0cyB0eXBlJ3MgZW1wdHkgdmFsdWU7IGBmYWxzZWBcbiAqIG90aGVyd2lzZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMb2dpY1xuICogQHNpZyBhIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0geFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBzZWUgUi5lbXB0eVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaXNFbXB0eShbMSwgMiwgM10pOyAgICAgICAgICAgLy89PiBmYWxzZVxuICogICAgICBSLmlzRW1wdHkoW10pOyAgICAgICAgICAgICAgICAgIC8vPT4gdHJ1ZVxuICogICAgICBSLmlzRW1wdHkoJycpOyAgICAgICAgICAgICAgICAgIC8vPT4gdHJ1ZVxuICogICAgICBSLmlzRW1wdHkobnVsbCk7ICAgICAgICAgICAgICAgIC8vPT4gZmFsc2VcbiAqICAgICAgUi5pc0VtcHR5KHt9KTsgICAgICAgICAgICAgICAgICAvLz0+IHRydWVcbiAqICAgICAgUi5pc0VtcHR5KHtsZW5ndGg6IDB9KTsgICAgICAgICAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXNFbXB0eShVaW50OEFycmF5LmZyb20oJycpKTsgLy89PiB0cnVlXG4gKi9cblxudmFyIGlzRW1wdHkgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiBpc0VtcHR5KHgpIHtcbiAgcmV0dXJuIHggIT0gbnVsbCAmJiBlcXVhbHMoeCwgZW1wdHkoeCkpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGlzRW1wdHk7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGlucHV0IHZhbHVlIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC45LjBcbiAqIEBjYXRlZ29yeSBUeXBlXG4gKiBAc2lnICogLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSB4IFRoZSB2YWx1ZSB0byB0ZXN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB4YCBpcyBgdW5kZWZpbmVkYCBvciBgbnVsbGAsIG90aGVyd2lzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaXNOaWwobnVsbCk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzTmlsKHVuZGVmaW5lZCk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzTmlsKDApOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXNOaWwoW10pOyAvLz0+IGZhbHNlXG4gKi9cblxudmFyIGlzTmlsID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoZnVuY3Rpb24gaXNOaWwoeCkge1xuICByZXR1cm4geCA9PSBudWxsO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGlzTmlsOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBjb252ZXJnZSBmcm9tIFwiLi9jb252ZXJnZS5qc1wiO1xuLyoqXG4gKiBqdXh0IGFwcGxpZXMgYSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBhIGxpc3Qgb2YgdmFsdWVzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE5LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBbKGEsIGIsIC4uLiwgbSkgLT4gbl0gLT4gKChhLCBiLCAuLi4sIG0pIC0+IFtuXSlcbiAqIEBwYXJhbSB7QXJyYXl9IGZucyBBbiBhcnJheSBvZiBmdW5jdGlvbnNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGxpc3Qgb2YgdmFsdWVzIGFmdGVyIGFwcGx5aW5nIGVhY2ggb2YgdGhlIG9yaWdpbmFsIGBmbnNgIHRvIGl0cyBwYXJhbWV0ZXJzLlxuICogQHNlZSBSLmFwcGx5U3BlY1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGdldFJhbmdlID0gUi5qdXh0KFtNYXRoLm1pbiwgTWF0aC5tYXhdKTtcbiAqICAgICAgZ2V0UmFuZ2UoMywgNCwgOSwgLTMpOyAvLz0+IFstMywgOV1cbiAqIEBzeW1iIFIuanV4dChbZiwgZywgaF0pKGEsIGIpID0gW2YoYSwgYiksIGcoYSwgYiksIGgoYSwgYildXG4gKi9cblxudmFyIGp1eHQgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiBqdXh0KGZucykge1xuICByZXR1cm4gY29udmVyZ2UoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICB9LCBmbnMpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGp1eHQ7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vaW50ZXJuYWwvX2hhcy5qc1wiO1xuaW1wb3J0IF9pc0FyZ3VtZW50cyBmcm9tIFwiLi9pbnRlcm5hbC9faXNBcmd1bWVudHMuanNcIjsgLy8gY292ZXIgSUUgPCA5IGtleXMgaXNzdWVzXG5cbnZhciBoYXNFbnVtQnVnID0gIVxuLyojX19QVVJFX18qL1xue1xuICB0b1N0cmluZzogbnVsbFxufS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgndG9TdHJpbmcnKTtcbnZhciBub25FbnVtZXJhYmxlUHJvcHMgPSBbJ2NvbnN0cnVjdG9yJywgJ3ZhbHVlT2YnLCAnaXNQcm90b3R5cGVPZicsICd0b1N0cmluZycsICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICdoYXNPd25Qcm9wZXJ0eScsICd0b0xvY2FsZVN0cmluZyddOyAvLyBTYWZhcmkgYnVnXG5cbnZhciBoYXNBcmdzRW51bUJ1ZyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICByZXR1cm4gYXJndW1lbnRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKCdsZW5ndGgnKTtcbn0oKTtcblxudmFyIGNvbnRhaW5zID0gZnVuY3Rpb24gY29udGFpbnMobGlzdCwgaXRlbSkge1xuICB2YXIgaWR4ID0gMDtcblxuICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICBpZiAobGlzdFtpZHhdID09PSBpdGVtKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG4vKipcbiAqIFJldHVybnMgYSBsaXN0IGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGFsbCB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBvZlxuICogdGhlIHN1cHBsaWVkIG9iamVjdC5cbiAqIE5vdGUgdGhhdCB0aGUgb3JkZXIgb2YgdGhlIG91dHB1dCBhcnJheSBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBjb25zaXN0ZW50XG4gKiBhY3Jvc3MgZGlmZmVyZW50IEpTIHBsYXRmb3Jtcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcge2s6IHZ9IC0+IFtrXVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGV4dHJhY3QgcHJvcGVydGllcyBmcm9tXG4gKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgdGhlIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzLlxuICogQHNlZSBSLmtleXNJbiwgUi52YWx1ZXMsIFIudG9QYWlyc1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIua2V5cyh7YTogMSwgYjogMiwgYzogM30pOyAvLz0+IFsnYScsICdiJywgJ2MnXVxuICovXG5cblxudmFyIGtleXMgPSB0eXBlb2YgT2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgIWhhc0FyZ3NFbnVtQnVnID9cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoZnVuY3Rpb24ga2V5cyhvYmopIHtcbiAgcmV0dXJuIE9iamVjdChvYmopICE9PSBvYmogPyBbXSA6IE9iamVjdC5rZXlzKG9iaik7XG59KSA6XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIGtleXMob2JqKSB7XG4gIGlmIChPYmplY3Qob2JqKSAhPT0gb2JqKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIHByb3AsIG5JZHg7XG4gIHZhciBrcyA9IFtdO1xuXG4gIHZhciBjaGVja0FyZ3NMZW5ndGggPSBoYXNBcmdzRW51bUJ1ZyAmJiBfaXNBcmd1bWVudHMob2JqKTtcblxuICBmb3IgKHByb3AgaW4gb2JqKSB7XG4gICAgaWYgKF9oYXMocHJvcCwgb2JqKSAmJiAoIWNoZWNrQXJnc0xlbmd0aCB8fCBwcm9wICE9PSAnbGVuZ3RoJykpIHtcbiAgICAgIGtzW2tzLmxlbmd0aF0gPSBwcm9wO1xuICAgIH1cbiAgfVxuXG4gIGlmIChoYXNFbnVtQnVnKSB7XG4gICAgbklkeCA9IG5vbkVudW1lcmFibGVQcm9wcy5sZW5ndGggLSAxO1xuXG4gICAgd2hpbGUgKG5JZHggPj0gMCkge1xuICAgICAgcHJvcCA9IG5vbkVudW1lcmFibGVQcm9wc1tuSWR4XTtcblxuICAgICAgaWYgKF9oYXMocHJvcCwgb2JqKSAmJiAhY29udGFpbnMoa3MsIHByb3ApKSB7XG4gICAgICAgIGtzW2tzLmxlbmd0aF0gPSBwcm9wO1xuICAgICAgfVxuXG4gICAgICBuSWR4IC09IDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGtzO1xufSk7XG5leHBvcnQgZGVmYXVsdCBrZXlzOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBtYXAgZnJvbSBcIi4vbWFwLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSBsZW5zIGZvciB0aGUgZ2l2ZW4gZ2V0dGVyIGFuZCBzZXR0ZXIgZnVuY3Rpb25zLiBUaGUgZ2V0dGVyIFwiZ2V0c1wiXG4gKiB0aGUgdmFsdWUgb2YgdGhlIGZvY3VzOyB0aGUgc2V0dGVyIFwic2V0c1wiIHRoZSB2YWx1ZSBvZiB0aGUgZm9jdXMuIFRoZSBzZXR0ZXJcbiAqIHNob3VsZCBub3QgbXV0YXRlIHRoZSBkYXRhIHN0cnVjdHVyZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC44LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIChzIC0+IGEpIC0+ICgoYSwgcykgLT4gcykgLT4gTGVucyBzIGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGdldHRlclxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyXG4gKiBAcmV0dXJuIHtMZW5zfVxuICogQHNlZSBSLnZpZXcsIFIuc2V0LCBSLm92ZXIsIFIubGVuc0luZGV4LCBSLmxlbnNQcm9wXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgeExlbnMgPSBSLmxlbnMoUi5wcm9wKCd4JyksIFIuYXNzb2MoJ3gnKSk7XG4gKlxuICogICAgICBSLnZpZXcoeExlbnMsIHt4OiAxLCB5OiAyfSk7ICAgICAgICAgICAgLy89PiAxXG4gKiAgICAgIFIuc2V0KHhMZW5zLCA0LCB7eDogMSwgeTogMn0pOyAgICAgICAgICAvLz0+IHt4OiA0LCB5OiAyfVxuICogICAgICBSLm92ZXIoeExlbnMsIFIubmVnYXRlLCB7eDogMSwgeTogMn0pOyAgLy89PiB7eDogLTEsIHk6IDJ9XG4gKi9cblxudmFyIGxlbnMgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBsZW5zKGdldHRlciwgc2V0dGVyKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodG9GdW5jdG9yRm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgcmV0dXJuIG1hcChmdW5jdGlvbiAoZm9jdXMpIHtcbiAgICAgICAgcmV0dXJuIHNldHRlcihmb2N1cywgdGFyZ2V0KTtcbiAgICAgIH0sIHRvRnVuY3RvckZuKGdldHRlcih0YXJnZXQpKSk7XG4gICAgfTtcbiAgfTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBsZW5zOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBhc3NvY1BhdGggZnJvbSBcIi4vYXNzb2NQYXRoLmpzXCI7XG5pbXBvcnQgbGVucyBmcm9tIFwiLi9sZW5zLmpzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwiLi9wYXRoLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSBsZW5zIHdob3NlIGZvY3VzIGlzIHRoZSBzcGVjaWZpZWQgcGF0aC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50IHwgU3ltYm9sXG4gKiBAdHlwZWRlZm4gTGVucyBzIGEgPSBGdW5jdG9yIGYgPT4gKGEgLT4gZiBhKSAtPiBzIC0+IGYgc1xuICogQHNpZyBbSWR4XSAtPiBMZW5zIHMgYVxuICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byB1c2UuXG4gKiBAcmV0dXJuIHtMZW5zfVxuICogQHNlZSBSLnZpZXcsIFIuc2V0LCBSLm92ZXJcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCB4SGVhZFlMZW5zID0gUi5sZW5zUGF0aChbJ3gnLCAwLCAneSddKTtcbiAqXG4gKiAgICAgIFIudmlldyh4SGVhZFlMZW5zLCB7eDogW3t5OiAyLCB6OiAzfSwge3k6IDQsIHo6IDV9XX0pO1xuICogICAgICAvLz0+IDJcbiAqICAgICAgUi5zZXQoeEhlYWRZTGVucywgMSwge3g6IFt7eTogMiwgejogM30sIHt5OiA0LCB6OiA1fV19KTtcbiAqICAgICAgLy89PiB7eDogW3t5OiAxLCB6OiAzfSwge3k6IDQsIHo6IDV9XX1cbiAqICAgICAgUi5vdmVyKHhIZWFkWUxlbnMsIFIubmVnYXRlLCB7eDogW3t5OiAyLCB6OiAzfSwge3k6IDQsIHo6IDV9XX0pO1xuICogICAgICAvLz0+IHt4OiBbe3k6IC0yLCB6OiAzfSwge3k6IDQsIHo6IDV9XX1cbiAqL1xuXG52YXIgbGVuc1BhdGggPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiBsZW5zUGF0aChwKSB7XG4gIHJldHVybiBsZW5zKHBhdGgocCksIGFzc29jUGF0aChwKSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgbGVuc1BhdGg7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQ7IGBmYWxzZWBcbiAqIG90aGVyd2lzZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBPcmQgYSA9PiBhIC0+IGEgLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSBhXG4gKiBAcGFyYW0geyp9IGJcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAc2VlIFIuZ3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmx0KDIsIDEpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIubHQoMiwgMik7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5sdCgyLCAzKTsgLy89PiB0cnVlXG4gKiAgICAgIFIubHQoJ2EnLCAneicpOyAvLz0+IHRydWVcbiAqICAgICAgUi5sdCgneicsICdhJyk7IC8vPT4gZmFsc2VcbiAqL1xuXG52YXIgbHQgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBsdChhLCBiKSB7XG4gIHJldHVybiBhIDwgYjtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBsdDsiLCJpbXBvcnQgX2FycmF5UmVkdWNlIGZyb20gXCIuL2ludGVybmFsL19hcnJheVJlZHVjZS5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF9tYXAgZnJvbSBcIi4vaW50ZXJuYWwvX21hcC5qc1wiO1xuaW1wb3J0IF94bWFwIGZyb20gXCIuL2ludGVybmFsL194bWFwLmpzXCI7XG5pbXBvcnQgY3VycnlOIGZyb20gXCIuL2N1cnJ5Ti5qc1wiO1xuaW1wb3J0IGtleXMgZnJvbSBcIi4va2V5cy5qc1wiO1xuLyoqXG4gKiBUYWtlcyBhIGZ1bmN0aW9uIGFuZFxuICogYSBbZnVuY3Rvcl0oaHR0cHM6Ly9naXRodWIuY29tL2ZhbnRhc3lsYW5kL2ZhbnRhc3ktbGFuZCNmdW5jdG9yKSxcbiAqIGFwcGxpZXMgdGhlIGZ1bmN0aW9uIHRvIGVhY2ggb2YgdGhlIGZ1bmN0b3IncyB2YWx1ZXMsIGFuZCByZXR1cm5zXG4gKiBhIGZ1bmN0b3Igb2YgdGhlIHNhbWUgc2hhcGUuXG4gKlxuICogUmFtZGEgcHJvdmlkZXMgc3VpdGFibGUgYG1hcGAgaW1wbGVtZW50YXRpb25zIGZvciBgQXJyYXlgIGFuZCBgT2JqZWN0YCxcbiAqIHNvIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGFwcGxpZWQgdG8gYFsxLCAyLCAzXWAgb3IgYHt4OiAxLCB5OiAyLCB6OiAzfWAuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYG1hcGAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEFsc28gdHJlYXRzIGZ1bmN0aW9ucyBhcyBmdW5jdG9ycyBhbmQgd2lsbCBjb21wb3NlIHRoZW0gdG9nZXRoZXIuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBGdW5jdG9yIGYgPT4gKGEgLT4gYikgLT4gZiBhIC0+IGYgYlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBldmVyeSBlbGVtZW50IG9mIHRoZSBpbnB1dCBgbGlzdGAuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIGJlIGl0ZXJhdGVkIG92ZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIG5ldyBsaXN0LlxuICogQHNlZSBSLnRyYW5zZHVjZSwgUi5hZGRJbmRleCwgUi5wbHVjaywgUi5wcm9qZWN0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZG91YmxlID0geCA9PiB4ICogMjtcbiAqXG4gKiAgICAgIFIubWFwKGRvdWJsZSwgWzEsIDIsIDNdKTsgLy89PiBbMiwgNCwgNl1cbiAqXG4gKiAgICAgIFIubWFwKGRvdWJsZSwge3g6IDEsIHk6IDIsIHo6IDN9KTsgLy89PiB7eDogMiwgeTogNCwgejogNn1cbiAqIEBzeW1iIFIubWFwKGYsIFthLCBiXSkgPSBbZihhKSwgZihiKV1cbiAqIEBzeW1iIFIubWFwKGYsIHsgeDogYSwgeTogYiB9KSA9IHsgeDogZihhKSwgeTogZihiKSB9XG4gKiBAc3ltYiBSLm1hcChmLCBmdW5jdG9yX28pID0gZnVuY3Rvcl9vLm1hcChmKVxuICovXG5cbnZhciBtYXAgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5Mihcbi8qI19fUFVSRV9fKi9cbl9kaXNwYXRjaGFibGUoWydmYW50YXN5LWxhbmQvbWFwJywgJ21hcCddLCBfeG1hcCwgZnVuY3Rpb24gbWFwKGZuLCBmdW5jdG9yKSB7XG4gIHN3aXRjaCAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGZ1bmN0b3IpKSB7XG4gICAgY2FzZSAnW29iamVjdCBGdW5jdGlvbl0nOlxuICAgICAgcmV0dXJuIGN1cnJ5TihmdW5jdG9yLmxlbmd0aCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBmdW5jdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgICAgfSk7XG5cbiAgICBjYXNlICdbb2JqZWN0IE9iamVjdF0nOlxuICAgICAgcmV0dXJuIF9hcnJheVJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgYWNjW2tleV0gPSBmbihmdW5jdG9yW2tleV0pO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30sIGtleXMoZnVuY3RvcikpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBfbWFwKGZuLCBmdW5jdG9yKTtcbiAgfVxufSkpO1xuXG5leHBvcnQgZGVmYXVsdCBtYXA7IiwiaW1wb3J0IF9hcnJheVJlZHVjZSBmcm9tIFwiLi9pbnRlcm5hbC9fYXJyYXlSZWR1Y2UuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBrZXlzIGZyb20gXCIuL2tleXMuanNcIjtcbi8qKlxuICogQW4gT2JqZWN0LXNwZWNpZmljIHZlcnNpb24gb2YgW2BtYXBgXSgjbWFwKS4gVGhlIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gdGhyZWVcbiAqIGFyZ3VtZW50czogKih2YWx1ZSwga2V5LCBvYmopKi4gSWYgb25seSB0aGUgdmFsdWUgaXMgc2lnbmlmaWNhbnQsIHVzZVxuICogW2BtYXBgXSgjbWFwKSBpbnN0ZWFkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjkuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoKCosIFN0cmluZywgT2JqZWN0KSAtPiAqKSAtPiBPYmplY3QgLT4gT2JqZWN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7T2JqZWN0fVxuICogQHNlZSBSLm1hcFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHh5eiA9IHsgeDogMSwgeTogMiwgejogMyB9O1xuICogICAgICBjb25zdCBwcmVwZW5kS2V5QW5kRG91YmxlID0gKG51bSwga2V5LCBvYmopID0+IGtleSArIChudW0gKiAyKTtcbiAqXG4gKiAgICAgIFIubWFwT2JqSW5kZXhlZChwcmVwZW5kS2V5QW5kRG91YmxlLCB4eXopOyAvLz0+IHsgeDogJ3gyJywgeTogJ3k0JywgejogJ3o2JyB9XG4gKi9cblxudmFyIG1hcE9iakluZGV4ZWQgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBtYXBPYmpJbmRleGVkKGZuLCBvYmopIHtcbiAgcmV0dXJuIF9hcnJheVJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICBhY2Nba2V5XSA9IGZuKG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30sIGtleXMob2JqKSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgbWFwT2JqSW5kZXhlZDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSBcIi4vdG9TdHJpbmcuanNcIjtcbi8qKlxuICogUmV0dXJucyB0aGUgbGFyZ2VyIG9mIGl0cyB0d28gYXJndW1lbnRzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIE9yZCBhID0+IGEgLT4gYSAtPiBhXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5tYXhCeSwgUi5taW5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm1heCg3ODksIDEyMyk7IC8vPT4gNzg5XG4gKiAgICAgIFIubWF4KCdhJywgJ2InKTsgLy89PiAnYidcbiAqL1xuXG52YXIgbWF4ID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gbWF4KGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gYjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNhZmVNYXgoeCwgeSkge1xuICAgIGlmICh4ID4geSAhPT0geSA+IHgpIHtcbiAgICAgIHJldHVybiB5ID4geCA/IHkgOiB4O1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB2YXIgbWF4QnlWYWx1ZSA9IHNhZmVNYXgoYSwgYik7XG5cbiAgaWYgKG1heEJ5VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBtYXhCeVZhbHVlO1xuICB9XG5cbiAgdmFyIG1heEJ5VHlwZSA9IHNhZmVNYXgodHlwZW9mIGEsIHR5cGVvZiBiKTtcblxuICBpZiAobWF4QnlUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbWF4QnlUeXBlID09PSB0eXBlb2YgYSA/IGEgOiBiO1xuICB9XG5cbiAgdmFyIHN0cmluZ0EgPSB0b1N0cmluZyhhKTtcbiAgdmFyIG1heEJ5U3RyaW5nVmFsdWUgPSBzYWZlTWF4KHN0cmluZ0EsIHRvU3RyaW5nKGIpKTtcblxuICBpZiAobWF4QnlTdHJpbmdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG1heEJ5U3RyaW5nVmFsdWUgPT09IHN0cmluZ0EgPyBhIDogYjtcbiAgfVxuXG4gIHJldHVybiBiO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG1heDsiLCJpbXBvcnQgX2FyaXR5IGZyb20gXCIuL2ludGVybmFsL19hcml0eS5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vaW50ZXJuYWwvX2hhcy5qc1wiO1xuLyoqXG4gKiBUYWtlcyBhIHN0cmluZy1yZXR1cm5pbmcgZnVuY3Rpb24gYGtleUdlbmAgYW5kIGEgZnVuY3Rpb24gYGZuYCBhbmQgcmV0dXJuc1xuICogYSBuZXcgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGNhY2hlZCByZXN1bHRzIGZvciBzdWJzZXF1ZW50XG4gKiBjYWxscyB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cy5cbiAqXG4gKiBXaGVuIHRoZSBmdW5jdGlvbiBpcyBpbnZva2VkLCBga2V5R2VuYCBpcyBhcHBsaWVkIHRvIHRoZSBzYW1lIGFyZ3VtZW50c1xuICogYW5kIGl0cyByZXN1bHQgYmVjb21lcyB0aGUgY2FjaGUga2V5LiBJZiB0aGUgY2FjaGUgY29udGFpbnMgc29tZXRoaW5nXG4gKiB1bmRlciB0aGF0IGtleSwgdGhlIGZ1bmN0aW9uIHNpbXBseSByZXR1cm5zIGl0IGFuZCBkb2VzIG5vdCBpbnZva2UgYGZuYCBhdCBhbGwuXG4gKlxuICogT3RoZXJ3aXNlIGBmbmAgaXMgYXBwbGllZCB0byB0aGUgc2FtZSBhcmd1bWVudHMgYW5kIGl0cyByZXR1cm4gdmFsdWVcbiAqIGlzIGNhY2hlZCB1bmRlciB0aGF0IGtleSBhbmQgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uLlxuICpcbiAqIENhcmUgbXVzdCBiZSB0YWtlbiB3aGVuIGltcGxlbWVudGluZyBga2V5R2VuYCB0byBhdm9pZCBrZXkgY29sbGlzaW9uLFxuICogb3IgaWYgdHJhY2tpbmcgcmVmZXJlbmNlcywgbWVtb3J5IGxlYWtzIGFuZCBtdXRhdGluZyBhcmd1bWVudHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjQuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICgqLi4uIC0+IFN0cmluZykgLT4gKCouLi4gLT4gYSkgLT4gKCouLi4gLT4gYSlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleUdlbiBUaGUgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgdGhlIGNhY2hlIGtleS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtZW1vaXplLlxuICogQHJldHVybiB7RnVuY3Rpb259IE1lbW9pemVkIHZlcnNpb24gb2YgYGZuYC5cbiAqIEBleGFtcGxlXG4gKiAgICAgIGNvbnN0IHdpdGhBZ2UgPSBtZW1vaXplV2l0aChvID0+IGAke28uYmlydGh9LyR7by5kZWF0aH1gLCAoe2JpcnRoLCBkZWF0aH0pID0+IHtcbiAqICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4gIF5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuICogICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAga2V5R2VuICAgICAgICAgICAgICAgICAgICAgICAgZm5cbiAqICAgICAgICBjb25zb2xlLmxvZyhgY29tcHV0aW5nIGFnZSBmb3IgJHtiaXJ0aH0vJHtkZWF0aH1gKTtcbiAqICAgICAgICByZXR1cm4gKHtiaXJ0aCwgZGVhdGgsIGFnZTogZGVhdGggLSBiaXJ0aH0pO1xuICogICAgICB9KTtcbiAqXG4gKiAgICAgIHdpdGhBZ2Uoe2JpcnRoOiAxOTIxLCBkZWF0aDogMTk5OX0pO1xuICogICAgICAvLz0+IExPRzogY29tcHV0aW5nIGFnZSBmb3IgMTkyMS8xOTk5XG4gKiAgICAgIC8vPT4ge2JpcnRoOiAxOTIxLCBkZWF0aDogMTk5OSwgYWdlOiA3OH0gKHJldHVybmVkIGZyb20gZm4pXG4gKlxuICogICAgICB3aXRoQWdlKHtiaXJ0aDogMTkyMSwgZGVhdGg6IDE5OTl9KTtcbiAqICAgICAgLy89PiB7YmlydGg6IDE5MjEsIGRlYXRoOiAxOTk5LCBhZ2U6IDc4fSAocmV0dXJuZWQgZnJvbSBjYWNoZSlcbiAqL1xuXG52YXIgbWVtb2l6ZVdpdGggPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBtZW1vaXplV2l0aChrZXlHZW4sIGZuKSB7XG4gIHZhciBjYWNoZSA9IHt9O1xuICByZXR1cm4gX2FyaXR5KGZuLmxlbmd0aCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBrZXkgPSBrZXlHZW4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIGlmICghX2hhcyhrZXksIGNhY2hlKSkge1xuICAgICAgY2FjaGVba2V5XSA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhY2hlW2tleV07XG4gIH0pO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG1lbW9pemVXaXRoOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBtZXJnZURlZXBXaXRoS2V5IGZyb20gXCIuL21lcmdlRGVlcFdpdGhLZXkuanNcIjtcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIGZpcnN0IG9iamVjdCBtZXJnZWQgd2l0aFxuICogdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBzZWNvbmQgb2JqZWN0LiBJZiBhIGtleSBleGlzdHMgaW4gYm90aCBvYmplY3RzOlxuICogLSBhbmQgYm90aCB2YWx1ZXMgYXJlIG9iamVjdHMsIHRoZSB0d28gdmFsdWVzIHdpbGwgYmUgcmVjdXJzaXZlbHkgbWVyZ2VkXG4gKiAtIG90aGVyd2lzZSB0aGUgdmFsdWUgZnJvbSB0aGUgc2Vjb25kIG9iamVjdCB3aWxsIGJlIHVzZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjQuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7YX0gLT4ge2F9IC0+IHthfVxuICogQHBhcmFtIHtPYmplY3R9IGxPYmpcbiAqIEBwYXJhbSB7T2JqZWN0fSByT2JqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAc2VlIFIubWVyZ2UsIFIubWVyZ2VEZWVwTGVmdCwgUi5tZXJnZURlZXBXaXRoLCBSLm1lcmdlRGVlcFdpdGhLZXlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm1lcmdlRGVlcFJpZ2h0KHsgbmFtZTogJ2ZyZWQnLCBhZ2U6IDEwLCBjb250YWN0OiB7IGVtYWlsOiAnbW9vQGV4YW1wbGUuY29tJyB9fSxcbiAqICAgICAgICAgICAgICAgICAgICAgICB7IGFnZTogNDAsIGNvbnRhY3Q6IHsgZW1haWw6ICdiYWFAZXhhbXBsZS5jb20nIH19KTtcbiAqICAgICAgLy89PiB7IG5hbWU6ICdmcmVkJywgYWdlOiA0MCwgY29udGFjdDogeyBlbWFpbDogJ2JhYUBleGFtcGxlLmNvbScgfX1cbiAqL1xuXG52YXIgbWVyZ2VEZWVwUmlnaHQgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBtZXJnZURlZXBSaWdodChsT2JqLCByT2JqKSB7XG4gIHJldHVybiBtZXJnZURlZXBXaXRoS2V5KGZ1bmN0aW9uIChrLCBsVmFsLCByVmFsKSB7XG4gICAgcmV0dXJuIHJWYWw7XG4gIH0sIGxPYmosIHJPYmopO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG1lcmdlRGVlcFJpZ2h0OyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBfaXNPYmplY3QgZnJvbSBcIi4vaW50ZXJuYWwvX2lzT2JqZWN0LmpzXCI7XG5pbXBvcnQgbWVyZ2VXaXRoS2V5IGZyb20gXCIuL21lcmdlV2l0aEtleS5qc1wiO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBvd24gcHJvcGVydGllcyBvZiB0aGUgdHdvIHByb3ZpZGVkIG9iamVjdHMuXG4gKiBJZiBhIGtleSBleGlzdHMgaW4gYm90aCBvYmplY3RzOlxuICogLSBhbmQgYm90aCBhc3NvY2lhdGVkIHZhbHVlcyBhcmUgYWxzbyBvYmplY3RzIHRoZW4gdGhlIHZhbHVlcyB3aWxsIGJlXG4gKiAgIHJlY3Vyc2l2ZWx5IG1lcmdlZC5cbiAqIC0gb3RoZXJ3aXNlIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIHRoZSBrZXkgYW5kIGFzc29jaWF0ZWQgdmFsdWVzXG4gKiAgIHVzaW5nIHRoZSByZXN1bHRpbmcgdmFsdWUgYXMgdGhlIG5ldyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS5cbiAqIElmIGEga2V5IG9ubHkgZXhpc3RzIGluIG9uZSBvYmplY3QsIHRoZSB2YWx1ZSB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5XG4gKiBvZiB0aGUgcmVzdWx0aW5nIG9iamVjdC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yNC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnICgoU3RyaW5nLCBhLCBhKSAtPiBhKSAtPiB7YX0gLT4ge2F9IC0+IHthfVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBsT2JqXG4gKiBAcGFyYW0ge09iamVjdH0gck9ialxuICogQHJldHVybiB7T2JqZWN0fVxuICogQHNlZSBSLm1lcmdlV2l0aEtleSwgUi5tZXJnZURlZXBXaXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgbGV0IGNvbmNhdFZhbHVlcyA9IChrLCBsLCByKSA9PiBrID09ICd2YWx1ZXMnID8gUi5jb25jYXQobCwgcikgOiByXG4gKiAgICAgIFIubWVyZ2VEZWVwV2l0aEtleShjb25jYXRWYWx1ZXMsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICB7IGE6IHRydWUsIGM6IHsgdGhpbmc6ICdmb28nLCB2YWx1ZXM6IFsxMCwgMjBdIH19LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgeyBiOiB0cnVlLCBjOiB7IHRoaW5nOiAnYmFyJywgdmFsdWVzOiBbMTUsIDM1XSB9fSk7XG4gKiAgICAgIC8vPT4geyBhOiB0cnVlLCBiOiB0cnVlLCBjOiB7IHRoaW5nOiAnYmFyJywgdmFsdWVzOiBbMTAsIDIwLCAxNSwgMzVdIH19XG4gKi9cblxudmFyIG1lcmdlRGVlcFdpdGhLZXkgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MyhmdW5jdGlvbiBtZXJnZURlZXBXaXRoS2V5KGZuLCBsT2JqLCByT2JqKSB7XG4gIHJldHVybiBtZXJnZVdpdGhLZXkoZnVuY3Rpb24gKGssIGxWYWwsIHJWYWwpIHtcbiAgICBpZiAoX2lzT2JqZWN0KGxWYWwpICYmIF9pc09iamVjdChyVmFsKSkge1xuICAgICAgcmV0dXJuIG1lcmdlRGVlcFdpdGhLZXkoZm4sIGxWYWwsIHJWYWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZm4oaywgbFZhbCwgclZhbCk7XG4gICAgfVxuICB9LCBsT2JqLCByT2JqKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBtZXJnZURlZXBXaXRoS2V5OyIsImltcG9ydCBfb2JqZWN0QXNzaWduIGZyb20gXCIuL2ludGVybmFsL19vYmplY3RBc3NpZ24uanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbi8qKlxuICogQ3JlYXRlIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBvd24gcHJvcGVydGllcyBvZiB0aGUgZmlyc3Qgb2JqZWN0IG1lcmdlZCB3aXRoXG4gKiB0aGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIHNlY29uZCBvYmplY3QuIElmIGEga2V5IGV4aXN0cyBpbiBib3RoIG9iamVjdHMsXG4gKiB0aGUgdmFsdWUgZnJvbSB0aGUgZmlyc3Qgb2JqZWN0IHdpbGwgYmUgdXNlZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yNi4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHtrOiB2fSAtPiB7azogdn0gLT4ge2s6IHZ9XG4gKiBAcGFyYW0ge09iamVjdH0gbFxuICogQHBhcmFtIHtPYmplY3R9IHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBzZWUgUi5tZXJnZVJpZ2h0LCBSLm1lcmdlRGVlcExlZnQsIFIubWVyZ2VXaXRoLCBSLm1lcmdlV2l0aEtleVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIubWVyZ2VMZWZ0KHsgJ2FnZSc6IDQwIH0sIHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiAxMCB9KTtcbiAqICAgICAgLy89PiB7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfVxuICpcbiAqICAgICAgY29uc3QgcmVzZXRUb0RlZmF1bHQgPSBSLm1lcmdlTGVmdCh7eDogMH0pO1xuICogICAgICByZXNldFRvRGVmYXVsdCh7eDogNSwgeTogMn0pOyAvLz0+IHt4OiAwLCB5OiAyfVxuICogQHN5bWIgUi5tZXJnZUxlZnQoYSwgYikgPSB7Li4uYiwgLi4uYX1cbiAqL1xuXG52YXIgbWVyZ2VMZWZ0ID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gbWVyZ2VMZWZ0KGwsIHIpIHtcbiAgcmV0dXJuIF9vYmplY3RBc3NpZ24oe30sIHIsIGwpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG1lcmdlTGVmdDsiLCJpbXBvcnQgX29iamVjdEFzc2lnbiBmcm9tIFwiLi9pbnRlcm5hbC9fb2JqZWN0QXNzaWduLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIENyZWF0ZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIGZpcnN0IG9iamVjdCBtZXJnZWQgd2l0aFxuICogdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBzZWNvbmQgb2JqZWN0LiBJZiBhIGtleSBleGlzdHMgaW4gYm90aCBvYmplY3RzLFxuICogdGhlIHZhbHVlIGZyb20gdGhlIHNlY29uZCBvYmplY3Qgd2lsbCBiZSB1c2VkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcge2s6IHZ9IC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7T2JqZWN0fSBsXG4gKiBAcGFyYW0ge09iamVjdH0gclxuICogQHJldHVybiB7T2JqZWN0fVxuICogQHNlZSBSLm1lcmdlTGVmdCwgUi5tZXJnZURlZXBSaWdodCwgUi5tZXJnZVdpdGgsIFIubWVyZ2VXaXRoS2V5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5tZXJnZVJpZ2h0KHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiAxMCB9LCB7ICdhZ2UnOiA0MCB9KTtcbiAqICAgICAgLy89PiB7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfVxuICpcbiAqICAgICAgY29uc3Qgd2l0aERlZmF1bHRzID0gUi5tZXJnZVJpZ2h0KHt4OiAwLCB5OiAwfSk7XG4gKiAgICAgIHdpdGhEZWZhdWx0cyh7eTogMn0pOyAvLz0+IHt4OiAwLCB5OiAyfVxuICogQHN5bWIgUi5tZXJnZVJpZ2h0KGEsIGIpID0gey4uLmEsIC4uLmJ9XG4gKi9cblxudmFyIG1lcmdlUmlnaHQgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBtZXJnZVJpZ2h0KGwsIHIpIHtcbiAgcmV0dXJuIF9vYmplY3RBc3NpZ24oe30sIGwsIHIpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG1lcmdlUmlnaHQ7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IG1lcmdlV2l0aEtleSBmcm9tIFwiLi9tZXJnZVdpdGhLZXkuanNcIjtcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIHR3byBwcm92aWRlZCBvYmplY3RzLiBJZlxuICogYSBrZXkgZXhpc3RzIGluIGJvdGggb2JqZWN0cywgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIHZhbHVlc1xuICogYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgaW4gZWFjaCBvYmplY3QsIHdpdGggdGhlIHJlc3VsdCBiZWluZyB1c2VkIGFzIHRoZVxuICogdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgaW4gdGhlIHJldHVybmVkIG9iamVjdC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnICgoYSwgYSkgLT4gYSkgLT4ge2F9IC0+IHthfSAtPiB7YX1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gbFxuICogQHBhcmFtIHtPYmplY3R9IHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBzZWUgUi5tZXJnZURlZXBXaXRoLCBSLm1lcmdlLCBSLm1lcmdlV2l0aEtleVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIubWVyZ2VXaXRoKFIuY29uY2F0LFxuICogICAgICAgICAgICAgICAgICB7IGE6IHRydWUsIHZhbHVlczogWzEwLCAyMF0gfSxcbiAqICAgICAgICAgICAgICAgICAgeyBiOiB0cnVlLCB2YWx1ZXM6IFsxNSwgMzVdIH0pO1xuICogICAgICAvLz0+IHsgYTogdHJ1ZSwgYjogdHJ1ZSwgdmFsdWVzOiBbMTAsIDIwLCAxNSwgMzVdIH1cbiAqL1xuXG52YXIgbWVyZ2VXaXRoID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTMoZnVuY3Rpb24gbWVyZ2VXaXRoKGZuLCBsLCByKSB7XG4gIHJldHVybiBtZXJnZVdpdGhLZXkoZnVuY3Rpb24gKF8sIF9sLCBfcikge1xuICAgIHJldHVybiBmbihfbCwgX3IpO1xuICB9LCBsLCByKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBtZXJnZVdpdGg7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vaW50ZXJuYWwvX2hhcy5qc1wiO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBvd24gcHJvcGVydGllcyBvZiB0aGUgdHdvIHByb3ZpZGVkIG9iamVjdHMuIElmXG4gKiBhIGtleSBleGlzdHMgaW4gYm90aCBvYmplY3RzLCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gaXMgYXBwbGllZCB0byB0aGUga2V5XG4gKiBhbmQgdGhlIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBpbiBlYWNoIG9iamVjdCwgd2l0aCB0aGUgcmVzdWx0IGJlaW5nXG4gKiB1c2VkIGFzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBpbiB0aGUgcmV0dXJuZWQgb2JqZWN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE5LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKChTdHJpbmcsIGEsIGEpIC0+IGEpIC0+IHthfSAtPiB7YX0gLT4ge2F9XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtPYmplY3R9IGxcbiAqIEBwYXJhbSB7T2JqZWN0fSByXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAc2VlIFIubWVyZ2VEZWVwV2l0aEtleSwgUi5tZXJnZSwgUi5tZXJnZVdpdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBsZXQgY29uY2F0VmFsdWVzID0gKGssIGwsIHIpID0+IGsgPT0gJ3ZhbHVlcycgPyBSLmNvbmNhdChsLCByKSA6IHJcbiAqICAgICAgUi5tZXJnZVdpdGhLZXkoY29uY2F0VmFsdWVzLFxuICogICAgICAgICAgICAgICAgICAgICB7IGE6IHRydWUsIHRoaW5nOiAnZm9vJywgdmFsdWVzOiBbMTAsIDIwXSB9LFxuICogICAgICAgICAgICAgICAgICAgICB7IGI6IHRydWUsIHRoaW5nOiAnYmFyJywgdmFsdWVzOiBbMTUsIDM1XSB9KTtcbiAqICAgICAgLy89PiB7IGE6IHRydWUsIGI6IHRydWUsIHRoaW5nOiAnYmFyJywgdmFsdWVzOiBbMTAsIDIwLCAxNSwgMzVdIH1cbiAqIEBzeW1iIFIubWVyZ2VXaXRoS2V5KGYsIHsgeDogMSwgeTogMiB9LCB7IHk6IDUsIHo6IDMgfSkgPSB7IHg6IDEsIHk6IGYoJ3knLCAyLCA1KSwgejogMyB9XG4gKi9cblxudmFyIG1lcmdlV2l0aEtleSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIG1lcmdlV2l0aEtleShmbiwgbCwgcikge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIHZhciBrO1xuICBsID0gbCB8fCB7fTtcbiAgciA9IHIgfHwge307XG5cbiAgZm9yIChrIGluIGwpIHtcbiAgICBpZiAoX2hhcyhrLCBsKSkge1xuICAgICAgcmVzdWx0W2tdID0gX2hhcyhrLCByKSA/IGZuKGssIGxba10sIHJba10pIDogbFtrXTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGsgaW4gcikge1xuICAgIGlmIChfaGFzKGssIHIpICYmICFfaGFzKGssIHJlc3VsdCkpIHtcbiAgICAgIHJlc3VsdFtrXSA9IHJba107XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBtZXJnZVdpdGhLZXk7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9pc1N0cmluZyBmcm9tIFwiLi9pbnRlcm5hbC9faXNTdHJpbmcuanNcIjtcbi8qKlxuICogUmV0dXJucyB0aGUgbnRoIGVsZW1lbnQgb2YgdGhlIGdpdmVuIGxpc3Qgb3Igc3RyaW5nLiBJZiBuIGlzIG5lZ2F0aXZlIHRoZVxuICogZWxlbWVudCBhdCBpbmRleCBsZW5ndGggKyBuIGlzIHJldHVybmVkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgTnVtYmVyIC0+IFthXSAtPiBhIHwgVW5kZWZpbmVkXG4gKiBAc2lnIE51bWJlciAtPiBTdHJpbmcgLT4gU3RyaW5nXG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0XG4gKiBAcGFyYW0geyp9IGxpc3RcbiAqIEByZXR1cm4geyp9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgbGlzdCA9IFsnZm9vJywgJ2JhcicsICdiYXonLCAncXV1eCddO1xuICogICAgICBSLm50aCgxLCBsaXN0KTsgLy89PiAnYmFyJ1xuICogICAgICBSLm50aCgtMSwgbGlzdCk7IC8vPT4gJ3F1dXgnXG4gKiAgICAgIFIubnRoKC05OSwgbGlzdCk7IC8vPT4gdW5kZWZpbmVkXG4gKlxuICogICAgICBSLm50aCgyLCAnYWJjJyk7IC8vPT4gJ2MnXG4gKiAgICAgIFIubnRoKDMsICdhYmMnKTsgLy89PiAnJ1xuICogQHN5bWIgUi5udGgoLTEsIFthLCBiLCBjXSkgPSBjXG4gKiBAc3ltYiBSLm50aCgwLCBbYSwgYiwgY10pID0gYVxuICogQHN5bWIgUi5udGgoMSwgW2EsIGIsIGNdKSA9IGJcbiAqL1xuXG52YXIgbnRoID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gbnRoKG9mZnNldCwgbGlzdCkge1xuICB2YXIgaWR4ID0gb2Zmc2V0IDwgMCA/IGxpc3QubGVuZ3RoICsgb2Zmc2V0IDogb2Zmc2V0O1xuICByZXR1cm4gX2lzU3RyaW5nKGxpc3QpID8gbGlzdC5jaGFyQXQoaWR4KSA6IGxpc3RbaWR4XTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBudGg7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgcGFydGlhbCBjb3B5IG9mIGFuIG9iamVjdCBvbWl0dGluZyB0aGUga2V5cyBzcGVjaWZpZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIFtTdHJpbmddIC0+IHtTdHJpbmc6ICp9IC0+IHtTdHJpbmc6ICp9XG4gKiBAcGFyYW0ge0FycmF5fSBuYW1lcyBhbiBhcnJheSBvZiBTdHJpbmcgcHJvcGVydHkgbmFtZXMgdG8gb21pdCBmcm9tIHRoZSBuZXcgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY29weSBmcm9tXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCB3aXRoIHByb3BlcnRpZXMgZnJvbSBgbmFtZXNgIG5vdCBvbiBpdC5cbiAqIEBzZWUgUi5waWNrXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5vbWl0KFsnYScsICdkJ10sIHthOiAxLCBiOiAyLCBjOiAzLCBkOiA0fSk7IC8vPT4ge2I6IDIsIGM6IDN9XG4gKi9cblxudmFyIG9taXQgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBvbWl0KG5hbWVzLCBvYmopIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICB2YXIgaW5kZXggPSB7fTtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBuYW1lcy5sZW5ndGg7XG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGluZGV4W25hbWVzW2lkeF1dID0gMTtcbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgaWYgKCFpbmRleC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgcmVzdWx0W3Byb3BdID0gb2JqW3Byb3BdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgb21pdDsiLCJpbXBvcnQgX2FyaXR5IGZyb20gXCIuL2ludGVybmFsL19hcml0eS5qc1wiO1xuaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuLyoqXG4gKiBBY2NlcHRzIGEgZnVuY3Rpb24gYGZuYCBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgZ3VhcmRzIGludm9jYXRpb24gb2ZcbiAqIGBmbmAgc3VjaCB0aGF0IGBmbmAgY2FuIG9ubHkgZXZlciBiZSBjYWxsZWQgb25jZSwgbm8gbWF0dGVyIGhvdyBtYW55IHRpbWVzXG4gKiB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gaXMgaW52b2tlZC4gVGhlIGZpcnN0IHZhbHVlIGNhbGN1bGF0ZWQgaXMgcmV0dXJuZWQgaW5cbiAqIHN1YnNlcXVlbnQgaW52b2NhdGlvbnMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKGEuLi4gLT4gYikgLT4gKGEuLi4gLT4gYilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byB3cmFwIGluIGEgY2FsbC1vbmx5LW9uY2Ugd3JhcHBlci5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgd3JhcHBlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBhZGRPbmVPbmNlID0gUi5vbmNlKHggPT4geCArIDEpO1xuICogICAgICBhZGRPbmVPbmNlKDEwKTsgLy89PiAxMVxuICogICAgICBhZGRPbmVPbmNlKGFkZE9uZU9uY2UoNTApKTsgLy89PiAxMVxuICovXG5cbnZhciBvbmNlID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoZnVuY3Rpb24gb25jZShmbikge1xuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIHZhciByZXN1bHQ7XG4gIHJldHVybiBfYXJpdHkoZm4ubGVuZ3RoLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNhbGxlZCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjYWxsZWQgPSB0cnVlO1xuICAgIHJlc3VsdCA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgb25jZTsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7IC8vIGBJZGVudGl0eWAgaXMgYSBmdW5jdG9yIHRoYXQgaG9sZHMgYSBzaW5nbGUgdmFsdWUsIHdoZXJlIGBtYXBgIHNpbXBseVxuLy8gdHJhbnNmb3JtcyB0aGUgaGVsZCB2YWx1ZSB3aXRoIHRoZSBwcm92aWRlZCBmdW5jdGlvbi5cblxudmFyIElkZW50aXR5ID0gZnVuY3Rpb24gKHgpIHtcbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogeCxcbiAgICBtYXA6IGZ1bmN0aW9uIChmKSB7XG4gICAgICByZXR1cm4gSWRlbnRpdHkoZih4KSk7XG4gICAgfVxuICB9O1xufTtcbi8qKlxuICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIFwic2V0dGluZ1wiIHRoZSBwb3J0aW9uIG9mIHRoZSBnaXZlbiBkYXRhIHN0cnVjdHVyZVxuICogZm9jdXNlZCBieSB0aGUgZ2l2ZW4gbGVucyB0byB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBmdW5jdGlvbiB0b1xuICogdGhlIGZvY3VzZWQgdmFsdWUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTYuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIExlbnMgcyBhID0gRnVuY3RvciBmID0+IChhIC0+IGYgYSkgLT4gcyAtPiBmIHNcbiAqIEBzaWcgTGVucyBzIGEgLT4gKGEgLT4gYSkgLT4gcyAtPiBzXG4gKiBAcGFyYW0ge0xlbnN9IGxlbnNcbiAqIEBwYXJhbSB7Kn0gdlxuICogQHBhcmFtIHsqfSB4XG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLnZpZXcsIFIuc2V0LCBSLmxlbnMsIFIubGVuc0luZGV4LCBSLmxlbnNQcm9wLCBSLmxlbnNQYXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgaGVhZExlbnMgPSBSLmxlbnNJbmRleCgwKTtcbiAqXG4gKiAgICAgIFIub3ZlcihoZWFkTGVucywgUi50b1VwcGVyLCBbJ2ZvbycsICdiYXInLCAnYmF6J10pOyAvLz0+IFsnRk9PJywgJ2JhcicsICdiYXonXVxuICovXG5cblxudmFyIG92ZXIgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MyhmdW5jdGlvbiBvdmVyKGxlbnMsIGYsIHgpIHtcbiAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBnZXR0ZXIgZnVuY3Rpb24gaXMgZmlyc3QgdHJhbnNmb3JtZWQgd2l0aCBgZmAsXG4gIC8vIHRoZW4gc2V0IGFzIHRoZSB2YWx1ZSBvZiBhbiBgSWRlbnRpdHlgLiBUaGlzIGlzIHRoZW4gbWFwcGVkIG92ZXIgd2l0aCB0aGVcbiAgLy8gc2V0dGVyIGZ1bmN0aW9uIG9mIHRoZSBsZW5zLlxuICByZXR1cm4gbGVucyhmdW5jdGlvbiAoeSkge1xuICAgIHJldHVybiBJZGVudGl0eShmKHkpKTtcbiAgfSkoeCkudmFsdWU7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgb3ZlcjsiLCJpbXBvcnQgZmlsdGVyIGZyb20gXCIuL2ZpbHRlci5qc1wiO1xuaW1wb3J0IGp1eHQgZnJvbSBcIi4vanV4dC5qc1wiO1xuaW1wb3J0IHJlamVjdCBmcm9tIFwiLi9yZWplY3QuanNcIjtcbi8qKlxuICogVGFrZXMgYSBwcmVkaWNhdGUgYW5kIGEgbGlzdCBvciBvdGhlciBgRmlsdGVyYWJsZWAgb2JqZWN0IGFuZCByZXR1cm5zIHRoZVxuICogcGFpciBvZiBmaWx0ZXJhYmxlIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBvZiBlbGVtZW50cyB3aGljaCBkbyBhbmQgZG8gbm90XG4gKiBzYXRpc2Z5LCB0aGUgcHJlZGljYXRlLCByZXNwZWN0aXZlbHkuIEZpbHRlcmFibGUgb2JqZWN0cyBpbmNsdWRlIHBsYWluIG9iamVjdHMgb3IgYW55IG9iamVjdFxuICogdGhhdCBoYXMgYSBmaWx0ZXIgbWV0aG9kIHN1Y2ggYXMgYEFycmF5YC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjRcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIEZpbHRlcmFibGUgZiA9PiAoYSAtPiBCb29sZWFuKSAtPiBmIGEgLT4gW2YgYSwgZiBhXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCBBIHByZWRpY2F0ZSB0byBkZXRlcm1pbmUgd2hpY2ggc2lkZSB0aGUgZWxlbWVudCBiZWxvbmdzIHRvLlxuICogQHBhcmFtIHtBcnJheX0gZmlsdGVyYWJsZSB0aGUgbGlzdCAob3Igb3RoZXIgZmlsdGVyYWJsZSkgdG8gcGFydGl0aW9uLlxuICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5LCBjb250YWluaW5nIGZpcnN0IHRoZSBzdWJzZXQgb2YgZWxlbWVudHMgdGhhdCBzYXRpc2Z5IHRoZVxuICogICAgICAgICBwcmVkaWNhdGUsIGFuZCBzZWNvbmQgdGhlIHN1YnNldCBvZiBlbGVtZW50cyB0aGF0IGRvIG5vdCBzYXRpc2Z5LlxuICogQHNlZSBSLmZpbHRlciwgUi5yZWplY3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnBhcnRpdGlvbihSLmluY2x1ZGVzKCdzJyksIFsnc3NzJywgJ3R0dCcsICdmb28nLCAnYmFycyddKTtcbiAqICAgICAgLy8gPT4gWyBbICdzc3MnLCAnYmFycycgXSwgIFsgJ3R0dCcsICdmb28nIF0gXVxuICpcbiAqICAgICAgUi5wYXJ0aXRpb24oUi5pbmNsdWRlcygncycpLCB7IGE6ICdzc3MnLCBiOiAndHR0JywgZm9vOiAnYmFycycgfSk7XG4gKiAgICAgIC8vID0+IFsgeyBhOiAnc3NzJywgZm9vOiAnYmFycycgfSwgeyBiOiAndHR0JyB9ICBdXG4gKi9cblxudmFyIHBhcnRpdGlvbiA9XG4vKiNfX1BVUkVfXyovXG5qdXh0KFtmaWx0ZXIsIHJlamVjdF0pO1xuZXhwb3J0IGRlZmF1bHQgcGFydGl0aW9uOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBwYXRocyBmcm9tIFwiLi9wYXRocy5qc1wiO1xuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIGF0IGEgZ2l2ZW4gcGF0aC4gVGhlIG5vZGVzIG9mIHRoZSBwYXRoIGNhbiBiZSBhcmJpdHJhcnkgc3RyaW5ncyBvciBub24tbmVnYXRpdmUgaW50ZWdlcnMuXG4gKiBGb3IgYW55dGhpbmcgZWxzZSwgdGhlIHZhbHVlIGlzIHVuc3BlY2lmaWVkLiBJbnRlZ2VyIHBhdGhzIGFyZSBtZWFudCB0byBpbmRleCBhcnJheXMsIHN0cmluZ3MgYXJlIG1lYW50IGZvciBvYmplY3RzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludCB8IFN5bWJvbFxuICogQHNpZyBbSWR4XSAtPiB7YX0gLT4gYSB8IFVuZGVmaW5lZFxuICogQHNpZyBJZHggPSBTdHJpbmcgfCBOb25OZWdhdGl2ZUludFxuICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byB1c2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3Qgb3IgYXJyYXkgdG8gcmV0cmlldmUgdGhlIG5lc3RlZCBwcm9wZXJ0eSBmcm9tLlxuICogQHJldHVybiB7Kn0gVGhlIGRhdGEgYXQgYHBhdGhgLlxuICogQHNlZSBSLnByb3AsIFIubnRoLCBSLmFzc29jUGF0aCwgUi5kaXNzb2NQYXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wYXRoKFsnYScsICdiJ10sIHthOiB7YjogMn19KTsgLy89PiAyXG4gKiAgICAgIFIucGF0aChbJ2EnLCAnYiddLCB7Yzoge2I6IDJ9fSk7IC8vPT4gdW5kZWZpbmVkXG4gKiAgICAgIFIucGF0aChbJ2EnLCAnYicsIDBdLCB7YToge2I6IFsxLCAyLCAzXX19KTsgLy89PiAxXG4gKiAgICAgIFIucGF0aChbJ2EnLCAnYicsIC0yXSwge2E6IHtiOiBbMSwgMiwgM119fSk7IC8vPT4gMlxuICogICAgICBSLnBhdGgoWzJdLCB7JzInOiAyfSk7IC8vPT4gMlxuICogICAgICBSLnBhdGgoWy0yXSwgeyctMic6ICdhJ30pOyAvLz0+IHVuZGVmaW5lZFxuICovXG5cbnZhciBwYXRoID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gcGF0aChwYXRoQXIsIG9iaikge1xuICByZXR1cm4gcGF0aHMoW3BhdGhBcl0sIG9iailbMF07XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcGF0aDsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgZGVmYXVsdFRvIGZyb20gXCIuL2RlZmF1bHRUby5qc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIi4vcGF0aC5qc1wiO1xuLyoqXG4gKiBJZiB0aGUgZ2l2ZW4sIG5vbi1udWxsIG9iamVjdCBoYXMgYSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gcGF0aCwgcmV0dXJucyB0aGVcbiAqIHZhbHVlIGF0IHRoYXQgcGF0aC4gT3RoZXJ3aXNlIHJldHVybnMgdGhlIHByb3ZpZGVkIGRlZmF1bHQgdmFsdWUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTguMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludCB8IFN5bWJvbFxuICogQHNpZyBhIC0+IFtJZHhdIC0+IHthfSAtPiBhXG4gKiBAcGFyYW0geyp9IGQgVGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAcGFyYW0ge0FycmF5fSBwIFRoZSBwYXRoIHRvIHVzZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byByZXRyaWV2ZSB0aGUgbmVzdGVkIHByb3BlcnR5IGZyb20uXG4gKiBAcmV0dXJuIHsqfSBUaGUgZGF0YSBhdCBgcGF0aGAgb2YgdGhlIHN1cHBsaWVkIG9iamVjdCBvciB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnBhdGhPcignTi9BJywgWydhJywgJ2InXSwge2E6IHtiOiAyfX0pOyAvLz0+IDJcbiAqICAgICAgUi5wYXRoT3IoJ04vQScsIFsnYScsICdiJ10sIHtjOiB7YjogMn19KTsgLy89PiBcIk4vQVwiXG4gKi9cblxudmFyIHBhdGhPciA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIHBhdGhPcihkLCBwLCBvYmopIHtcbiAgcmV0dXJuIGRlZmF1bHRUbyhkLCBwYXRoKHAsIG9iaikpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHBhdGhPcjsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2lzSW50ZWdlciBmcm9tIFwiLi9pbnRlcm5hbC9faXNJbnRlZ2VyLmpzXCI7XG5pbXBvcnQgbnRoIGZyb20gXCIuL250aC5qc1wiO1xuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHZhbHVlcyBhdCBnaXZlbiBwYXRocyBvZiBhbiBvYmplY3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjcuMVxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIElkeCA9IFtTdHJpbmcgfCBJbnQgfCBTeW1ib2xdXG4gKiBAc2lnIFtJZHhdIC0+IHthfSAtPiBbYSB8IFVuZGVmaW5lZF1cbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGhzQXJyYXkgVGhlIGFycmF5IG9mIHBhdGhzIHRvIGJlIGZldGNoZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcmV0cmlldmUgdGhlIG5lc3RlZCBwcm9wZXJ0aWVzIGZyb20uXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBsaXN0IGNvbnNpc3Rpbmcgb2YgdmFsdWVzIGF0IHBhdGhzIHNwZWNpZmllZCBieSBcInBhdGhzQXJyYXlcIi5cbiAqIEBzZWUgUi5wYXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wYXRocyhbWydhJywgJ2InXSwgWydwJywgMCwgJ3EnXV0sIHthOiB7YjogMn0sIHA6IFt7cTogM31dfSk7IC8vPT4gWzIsIDNdXG4gKiAgICAgIFIucGF0aHMoW1snYScsICdiJ10sIFsncCcsICdyJ11dLCB7YToge2I6IDJ9LCBwOiBbe3E6IDN9XX0pOyAvLz0+IFsyLCB1bmRlZmluZWRdXG4gKi9cblxudmFyIHBhdGhzID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gcGF0aHMocGF0aHNBcnJheSwgb2JqKSB7XG4gIHJldHVybiBwYXRoc0FycmF5Lm1hcChmdW5jdGlvbiAocGF0aHMpIHtcbiAgICB2YXIgdmFsID0gb2JqO1xuICAgIHZhciBpZHggPSAwO1xuICAgIHZhciBwO1xuXG4gICAgd2hpbGUgKGlkeCA8IHBhdGhzLmxlbmd0aCkge1xuICAgICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcCA9IHBhdGhzW2lkeF07XG4gICAgICB2YWwgPSBfaXNJbnRlZ2VyKHApID8gbnRoKHAsIHZhbCkgOiB2YWxbcF07XG4gICAgICBpZHggKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsO1xuICB9KTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBwYXRoczsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSBwYXJ0aWFsIGNvcHkgb2YgYW4gb2JqZWN0IGNvbnRhaW5pbmcgb25seSB0aGUga2V5cyBzcGVjaWZpZWQuIElmXG4gKiB0aGUga2V5IGRvZXMgbm90IGV4aXN0LCB0aGUgcHJvcGVydHkgaXMgaWdub3JlZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgW2tdIC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7QXJyYXl9IG5hbWVzIGFuIGFycmF5IG9mIFN0cmluZyBwcm9wZXJ0eSBuYW1lcyB0byBjb3B5IG9udG8gYSBuZXcgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY29weSBmcm9tXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCB3aXRoIG9ubHkgcHJvcGVydGllcyBmcm9tIGBuYW1lc2Agb24gaXQuXG4gKiBAc2VlIFIub21pdCwgUi5wcm9wc1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucGljayhbJ2EnLCAnZCddLCB7YTogMSwgYjogMiwgYzogMywgZDogNH0pOyAvLz0+IHthOiAxLCBkOiA0fVxuICogICAgICBSLnBpY2soWydhJywgJ2UnLCAnZiddLCB7YTogMSwgYjogMiwgYzogMywgZDogNH0pOyAvLz0+IHthOiAxfVxuICovXG5cbnZhciBwaWNrID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gcGljayhuYW1lcywgb2JqKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgdmFyIGlkeCA9IDA7XG5cbiAgd2hpbGUgKGlkeCA8IG5hbWVzLmxlbmd0aCkge1xuICAgIGlmIChuYW1lc1tpZHhdIGluIG9iaikge1xuICAgICAgcmVzdWx0W25hbWVzW2lkeF1dID0gb2JqW25hbWVzW2lkeF1dO1xuICAgIH1cblxuICAgIGlkeCArPSAxO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBwaWNrOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbi8qKlxuICogUmV0dXJucyBhIHBhcnRpYWwgY29weSBvZiBhbiBvYmplY3QgY29udGFpbmluZyBvbmx5IHRoZSBrZXlzIHRoYXQgc2F0aXNmeVxuICogdGhlIHN1cHBsaWVkIHByZWRpY2F0ZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC44LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKCh2LCBrKSAtPiBCb29sZWFuKSAtPiB7azogdn0gLT4ge2s6IHZ9XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkIEEgcHJlZGljYXRlIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCBhIGtleVxuICogICAgICAgIHNob3VsZCBiZSBpbmNsdWRlZCBvbiB0aGUgb3V0cHV0IG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBjb3B5IGZyb21cbiAqIEByZXR1cm4ge09iamVjdH0gQSBuZXcgb2JqZWN0IHdpdGggb25seSBwcm9wZXJ0aWVzIHRoYXQgc2F0aXNmeSBgcHJlZGBcbiAqICAgICAgICAgb24gaXQuXG4gKiBAc2VlIFIucGljaywgUi5maWx0ZXJcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBpc1VwcGVyQ2FzZSA9ICh2YWwsIGtleSkgPT4ga2V5LnRvVXBwZXJDYXNlKCkgPT09IGtleTtcbiAqICAgICAgUi5waWNrQnkoaXNVcHBlckNhc2UsIHthOiAxLCBiOiAyLCBBOiAzLCBCOiA0fSk7IC8vPT4ge0E6IDMsIEI6IDR9XG4gKi9cblxudmFyIHBpY2tCeSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIHBpY2tCeSh0ZXN0LCBvYmopIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgaWYgKHRlc3Qob2JqW3Byb3BdLCBwcm9wLCBvYmopKSB7XG4gICAgICByZXN1bHRbcHJvcF0gPSBvYmpbcHJvcF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBwaWNrQnk7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IG1hcCBmcm9tIFwiLi9tYXAuanNcIjtcbmltcG9ydCBwcm9wIGZyb20gXCIuL3Byb3AuanNcIjtcbi8qKlxuICogUmV0dXJucyBhIG5ldyBsaXN0IGJ5IHBsdWNraW5nIHRoZSBzYW1lIG5hbWVkIHByb3BlcnR5IG9mZiBhbGwgb2JqZWN0cyBpblxuICogdGhlIGxpc3Qgc3VwcGxpZWQuXG4gKlxuICogYHBsdWNrYCB3aWxsIHdvcmsgb25cbiAqIGFueSBbZnVuY3Rvcl0oaHR0cHM6Ly9naXRodWIuY29tL2ZhbnRhc3lsYW5kL2ZhbnRhc3ktbGFuZCNmdW5jdG9yKSBpblxuICogYWRkaXRpb24gdG8gYXJyYXlzLCBhcyBpdCBpcyBlcXVpdmFsZW50IHRvIGBSLm1hcChSLnByb3AoayksIGYpYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIEZ1bmN0b3IgZiA9PiBrIC0+IGYge2s6IHZ9IC0+IGYgdlxuICogQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBrZXkgVGhlIGtleSBuYW1lIHRvIHBsdWNrIG9mZiBvZiBlYWNoIG9iamVjdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGYgVGhlIGFycmF5IG9yIGZ1bmN0b3IgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGxpc3Qgb2YgdmFsdWVzIGZvciB0aGUgZ2l2ZW4ga2V5LlxuICogQHNlZSBSLnByb2plY3QsIFIucHJvcCwgUi5wcm9wc1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBnZXRBZ2VzID0gUi5wbHVjaygnYWdlJyk7XG4gKiAgICAgIGdldEFnZXMoW3tuYW1lOiAnZnJlZCcsIGFnZTogMjl9LCB7bmFtZTogJ3dpbG1hJywgYWdlOiAyN31dKTsgLy89PiBbMjksIDI3XVxuICpcbiAqICAgICAgUi5wbHVjaygwLCBbWzEsIDJdLCBbMywgNF1dKTsgICAgICAgICAgICAgICAvLz0+IFsxLCAzXVxuICogICAgICBSLnBsdWNrKCd2YWwnLCB7YToge3ZhbDogM30sIGI6IHt2YWw6IDV9fSk7IC8vPT4ge2E6IDMsIGI6IDV9XG4gKiBAc3ltYiBSLnBsdWNrKCd4JywgW3t4OiAxLCB5OiAyfSwge3g6IDMsIHk6IDR9LCB7eDogNSwgeTogNn1dKSA9IFsxLCAzLCA1XVxuICogQHN5bWIgUi5wbHVjaygwLCBbWzEsIDJdLCBbMywgNF0sIFs1LCA2XV0pID0gWzEsIDMsIDVdXG4gKi9cblxudmFyIHBsdWNrID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gcGx1Y2socCwgbGlzdCkge1xuICByZXR1cm4gbWFwKHByb3AocCksIGxpc3QpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHBsdWNrOyIsImltcG9ydCBfY29uY2F0IGZyb20gXCIuL2ludGVybmFsL19jb25jYXQuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbi8qKlxuICogUmV0dXJucyBhIG5ldyBsaXN0IHdpdGggdGhlIGdpdmVuIGVsZW1lbnQgYXQgdGhlIGZyb250LCBmb2xsb3dlZCBieSB0aGVcbiAqIGNvbnRlbnRzIG9mIHRoZSBsaXN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgYSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0geyp9IGVsIFRoZSBpdGVtIHRvIGFkZCB0byB0aGUgaGVhZCBvZiB0aGUgb3V0cHV0IGxpc3QuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBhZGQgdG8gdGhlIHRhaWwgb2YgdGhlIG91dHB1dCBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3IGFycmF5LlxuICogQHNlZSBSLmFwcGVuZFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucHJlcGVuZCgnZmVlJywgWydmaScsICdmbycsICdmdW0nXSk7IC8vPT4gWydmZWUnLCAnZmknLCAnZm8nLCAnZnVtJ11cbiAqL1xuXG52YXIgcHJlcGVuZCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIHByZXBlbmQoZWwsIGxpc3QpIHtcbiAgcmV0dXJuIF9jb25jYXQoW2VsXSwgbGlzdCk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcHJlcGVuZDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2lzSW50ZWdlciBmcm9tIFwiLi9pbnRlcm5hbC9faXNJbnRlZ2VyLmpzXCI7XG5pbXBvcnQgbnRoIGZyb20gXCIuL250aC5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aGVuIHN1cHBsaWVkIGFuIG9iamVjdCByZXR1cm5zIHRoZSBpbmRpY2F0ZWRcbiAqIHByb3BlcnR5IG9mIHRoYXQgb2JqZWN0LCBpZiBpdCBleGlzdHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50IHwgU3ltYm9sXG4gKiBAc2lnIElkeCAtPiB7czogYX0gLT4gYSB8IFVuZGVmaW5lZFxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBwIFRoZSBwcm9wZXJ0eSBuYW1lIG9yIGFycmF5IGluZGV4XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcXVlcnlcbiAqIEByZXR1cm4geyp9IFRoZSB2YWx1ZSBhdCBgb2JqLnBgLlxuICogQHNlZSBSLnBhdGgsIFIucHJvcHMsIFIucGx1Y2ssIFIucHJvamVjdCwgUi5udGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnByb3AoJ3gnLCB7eDogMTAwfSk7IC8vPT4gMTAwXG4gKiAgICAgIFIucHJvcCgneCcsIHt9KTsgLy89PiB1bmRlZmluZWRcbiAqICAgICAgUi5wcm9wKDAsIFsxMDBdKTsgLy89PiAxMDBcbiAqICAgICAgUi5jb21wb3NlKFIuaW5jLCBSLnByb3AoJ3gnKSkoeyB4OiAzIH0pIC8vPT4gNFxuICovXG5cbnZhciBwcm9wID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gcHJvcChwLCBvYmopIHtcbiAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIF9pc0ludGVnZXIocCkgPyBudGgocCwgb2JqKSA6IG9ialtwXTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBwcm9wOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBwcm9wIGZyb20gXCIuL3Byb3AuanNcIjtcbmltcG9ydCBlcXVhbHMgZnJvbSBcIi4vZXF1YWxzLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByb3BlcnR5IGlzIGVxdWFsLCBpblxuICogW2BSLmVxdWFsc2BdKCNlcXVhbHMpIHRlcm1zLCB0byB0aGUgZ2l2ZW4gdmFsdWU7IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogWW91IGNhbiB0ZXN0IG11bHRpcGxlIHByb3BlcnRpZXMgd2l0aCBbYFIud2hlcmVFcWBdKCN3aGVyZUVxKSxcbiAqIGFuZCB0ZXN0IG5lc3RlZCBwYXRoIHByb3BlcnR5IHdpdGggW2BSLnBhdGhFcWBdKCNwYXRoRXEpLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIGEgLT4gU3RyaW5nIC0+IE9iamVjdCAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gY29tcGFyZSB0aGUgcHJvcGVydHkgd2l0aFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIHNwZWNpZmllZCBvYmplY3QgcHJvcGVydHkncyBrZXlcbiAqIEBwYXJhbSB7Kn0gb2JqIFRoZSBvYmplY3QgdG8gY2hlY2sgdGhlIHByb3BlcnR5IGluXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZhbHVlIGVxdWFscyB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcm9wZXJ0eSxcbiAqICAgICAgICAgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBAc2VlIFIud2hlcmVFcSwgUi5wYXRoRXEsIFIucHJvcFNhdGlzZmllcywgUi5lcXVhbHNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBhYmJ5ID0ge25hbWU6ICdBYmJ5JywgYWdlOiA3LCBoYWlyOiAnYmxvbmQnfTtcbiAqICAgICAgY29uc3QgZnJlZCA9IHtuYW1lOiAnRnJlZCcsIGFnZTogMTIsIGhhaXI6ICdicm93bid9O1xuICogICAgICBjb25zdCBydXN0eSA9IHtuYW1lOiAnUnVzdHknLCBhZ2U6IDEwLCBoYWlyOiAnYnJvd24nfTtcbiAqICAgICAgY29uc3QgYWxvaXMgPSB7bmFtZTogJ0Fsb2lzJywgYWdlOiAxNSwgZGlzcG9zaXRpb246ICdzdXJseSd9O1xuICogICAgICBjb25zdCBraWRzID0gW2FiYnksIGZyZWQsIHJ1c3R5LCBhbG9pc107XG4gKiAgICAgIGNvbnN0IGhhc0Jyb3duSGFpciA9IFIucHJvcEVxKCdicm93bicsICdoYWlyJyk7XG4gKiAgICAgIFIuZmlsdGVyKGhhc0Jyb3duSGFpciwga2lkcyk7IC8vPT4gW2ZyZWQsIHJ1c3R5XVxuICovXG5cbnZhciBwcm9wRXEgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MyhmdW5jdGlvbiBwcm9wRXEodmFsLCBuYW1lLCBvYmopIHtcbiAgcmV0dXJuIGVxdWFscyh2YWwsIHByb3AobmFtZSwgb2JqKSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcHJvcEVxOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBkZWZhdWx0VG8gZnJvbSBcIi4vZGVmYXVsdFRvLmpzXCI7XG5pbXBvcnQgcHJvcCBmcm9tIFwiLi9wcm9wLmpzXCI7XG4vKipcbiAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBub24tbnVsbCBvYmplY3QgaWYgdGhlIHByb3BlcnR5XG4gKiBpcyBwcmVzZW50IGFuZCBpdCdzIHZhbHVlIGlzIG5vdCBgbnVsbGAsIGB1bmRlZmluZWRgIG9yIGBOYU5gLlxuICpcbiAqIE90aGVyd2lzZSB0aGUgZmlyc3QgYXJndW1lbnQgaXMgcmV0dXJuZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNi4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIGEgLT4gU3RyaW5nIC0+IE9iamVjdCAtPiBhXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgZGVmYXVsdCB2YWx1ZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXR1cm4uXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJuIHsqfSBUaGUgdmFsdWUgb2YgZ2l2ZW4gcHJvcGVydHkgb2YgdGhlIHN1cHBsaWVkIG9iamVjdCBvciB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBhbGljZSA9IHtcbiAqICAgICAgICBuYW1lOiAnQUxJQ0UnLFxuICogICAgICAgIGFnZTogMTAxXG4gKiAgICAgIH07XG4gKiAgICAgIGNvbnN0IGZhdm9yaXRlID0gUi5wcm9wKCdmYXZvcml0ZUxpYnJhcnknKTtcbiAqICAgICAgY29uc3QgZmF2b3JpdGVXaXRoRGVmYXVsdCA9IFIucHJvcE9yKCdSYW1kYScsICdmYXZvcml0ZUxpYnJhcnknKTtcbiAqXG4gKiAgICAgIGZhdm9yaXRlKGFsaWNlKTsgIC8vPT4gdW5kZWZpbmVkXG4gKiAgICAgIGZhdm9yaXRlV2l0aERlZmF1bHQoYWxpY2UpOyAgLy89PiAnUmFtZGEnXG4gKi9cblxudmFyIHByb3BPciA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIHByb3BPcih2YWwsIHAsIG9iaikge1xuICByZXR1cm4gZGVmYXVsdFRvKHZhbCwgcHJvcChwLCBvYmopKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBwcm9wT3I7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIi4vcGF0aC5qc1wiO1xuLyoqXG4gKiBBY3RzIGFzIG11bHRpcGxlIGBwcm9wYDogYXJyYXkgb2Yga2V5cyBpbiwgYXJyYXkgb2YgdmFsdWVzIG91dC4gUHJlc2VydmVzXG4gKiBvcmRlci5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgW2tdIC0+IHtrOiB2fSAtPiBbdl1cbiAqIEBwYXJhbSB7QXJyYXl9IHBzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBmZXRjaFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHF1ZXJ5XG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIG9yIHBhcnRpYWxseSBhcHBsaWVkIGZ1bmN0aW9uLlxuICogQHNlZSBSLnByb3AsIFIucGx1Y2ssIFIucHJvamVjdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucHJvcHMoWyd4JywgJ3knXSwge3g6IDEsIHk6IDJ9KTsgLy89PiBbMSwgMl1cbiAqICAgICAgUi5wcm9wcyhbJ2MnLCAnYScsICdiJ10sIHtiOiAyLCBhOiAxfSk7IC8vPT4gW3VuZGVmaW5lZCwgMSwgMl1cbiAqXG4gKiAgICAgIGNvbnN0IGZ1bGxOYW1lID0gUi5jb21wb3NlKFIuam9pbignICcpLCBSLnByb3BzKFsnZmlyc3QnLCAnbGFzdCddKSk7XG4gKiAgICAgIGZ1bGxOYW1lKHtsYXN0OiAnQnVsbGV0LVRvb3RoJywgYWdlOiAzMywgZmlyc3Q6ICdUb255J30pOyAvLz0+ICdUb255IEJ1bGxldC1Ub290aCdcbiAqL1xuXG52YXIgcHJvcHMgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiBwcm9wcyhwcywgb2JqKSB7XG4gIHJldHVybiBwcy5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICByZXR1cm4gcGF0aChbcF0sIG9iaik7XG4gIH0pO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHByb3BzOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBfeFJlZHVjZSBmcm9tIFwiLi9pbnRlcm5hbC9feFJlZHVjZS5qc1wiO1xuaW1wb3J0IF94d3JhcCBmcm9tIFwiLi9pbnRlcm5hbC9feHdyYXAuanNcIjtcbi8qKlxuICogUmV0dXJucyBhIHNpbmdsZSBpdGVtIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBsaXN0LCBzdWNjZXNzaXZlbHkgY2FsbGluZ1xuICogdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIGFuZCBwYXNzaW5nIGl0IGFuIGFjY3VtdWxhdG9yIHZhbHVlIGFuZCB0aGUgY3VycmVudFxuICogdmFsdWUgZnJvbSB0aGUgYXJyYXksIGFuZCB0aGVuIHBhc3NpbmcgdGhlIHJlc3VsdCB0byB0aGUgbmV4dCBjYWxsLlxuICpcbiAqIFRoZSBpdGVyYXRvciBmdW5jdGlvbiByZWNlaXZlcyB0d28gdmFsdWVzOiAqKGFjYywgdmFsdWUpKi4gSXQgbWF5IHVzZVxuICogW2BSLnJlZHVjZWRgXSgjcmVkdWNlZCkgdG8gc2hvcnRjdXQgdGhlIGl0ZXJhdGlvbi5cbiAqXG4gKiBUaGUgYXJndW1lbnRzJyBvcmRlciBvZiBbYHJlZHVjZVJpZ2h0YF0oI3JlZHVjZVJpZ2h0KSdzIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBpcyAqKHZhbHVlLCBhY2MpKi5cbiAqXG4gKiBOb3RlOiBgUi5yZWR1Y2VgIGRvZXMgbm90IHNraXAgZGVsZXRlZCBvciB1bmFzc2lnbmVkIGluZGljZXMgKHNwYXJzZVxuICogYXJyYXlzKSwgdW5saWtlIHRoZSBuYXRpdmUgYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZC4gRm9yIG1vcmUgZGV0YWlsc1xuICogb24gdGhpcyBiZWhhdmlvciwgc2VlOlxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvcmVkdWNlI0Rlc2NyaXB0aW9uXG4gKlxuICogQmUgY2F1dGlvdXMgb2YgbXV0YXRpbmcgYW5kIHJldHVybmluZyB0aGUgYWNjdW11bGF0b3IuIElmIHlvdSByZXVzZSBpdCBhY3Jvc3NcbiAqIGludm9jYXRpb25zLCBpdCB3aWxsIGNvbnRpbnVlIHRvIGFjY3VtdWxhdGUgb250byB0aGUgc2FtZSB2YWx1ZS4gVGhlIGdlbmVyYWxcbiAqIHJlY29tbWVuZGF0aW9uIGlzIHRvIGFsd2F5cyByZXR1cm4gYSBuZXcgdmFsdWUuIElmIHlvdSBjYW4ndCBkbyBzbyBmb3JcbiAqIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoZW4gYmUgc3VyZSB0byByZWluaXRpYWxpemUgdGhlIGFjY3VtdWxhdG9yIG9uIGVhY2hcbiAqIGludm9jYXRpb24uXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYHJlZHVjZWAgbWV0aG9kIG9mIHRoZSB0aGlyZCBhcmd1bWVudCwgaWYgcHJlc2VudC4gV2hlblxuICogZG9pbmcgc28sIGl0IGlzIHVwIHRvIHRoZSB1c2VyIHRvIGhhbmRsZSB0aGUgW2BSLnJlZHVjZWRgXSgjcmVkdWNlZClcbiAqIHNob3J0Y3V0aW5nLCBhcyB0aGlzIGlzIG5vdCBpbXBsZW1lbnRlZCBieSBgcmVkdWNlYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICgoYSwgYikgLT4gYSkgLT4gYSAtPiBbYl0gLT4gYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uLiBSZWNlaXZlcyB0d28gdmFsdWVzLCB0aGUgYWNjdW11bGF0b3IgYW5kIHRoZVxuICogICAgICAgIGN1cnJlbnQgZWxlbWVudCBmcm9tIHRoZSBhcnJheS5cbiAqIEBwYXJhbSB7Kn0gYWNjIFRoZSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybiB7Kn0gVGhlIGZpbmFsLCBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqIEBzZWUgUi5yZWR1Y2VkLCBSLmFkZEluZGV4LCBSLnJlZHVjZVJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5yZWR1Y2UoUi5zdWJ0cmFjdCwgMCwgWzEsIDIsIDMsIDRdKSAvLyA9PiAoKCgoMCAtIDEpIC0gMikgLSAzKSAtIDQpID0gLTEwXG4gKiAgICAgIC8vICAgICAgICAgIC0gICAgICAgICAgICAgICAtMTBcbiAqICAgICAgLy8gICAgICAgICAvIFxcICAgICAgICAgICAgICAvIFxcXG4gKiAgICAgIC8vICAgICAgICAtICAgNCAgICAgICAgICAgLTYgICA0XG4gKiAgICAgIC8vICAgICAgIC8gXFwgICAgICAgICAgICAgIC8gXFxcbiAqICAgICAgLy8gICAgICAtICAgMyAgID09PiAgICAgLTMgICAzXG4gKiAgICAgIC8vICAgICAvIFxcICAgICAgICAgICAgICAvIFxcXG4gKiAgICAgIC8vICAgIC0gICAyICAgICAgICAgICAtMSAgIDJcbiAqICAgICAgLy8gICAvIFxcICAgICAgICAgICAgICAvIFxcXG4gKiAgICAgIC8vICAwICAgMSAgICAgICAgICAgIDAgICAxXG4gKlxuICogQHN5bWIgUi5yZWR1Y2UoZiwgYSwgW2IsIGMsIGRdKSA9IGYoZihmKGEsIGIpLCBjKSwgZClcbiAqL1xuXG52YXIgcmVkdWNlID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTMoZnVuY3Rpb24gKHhmLCBhY2MsIGxpc3QpIHtcbiAgcmV0dXJuIF94UmVkdWNlKHR5cGVvZiB4ZiA9PT0gJ2Z1bmN0aW9uJyA/IF94d3JhcCh4ZikgOiB4ZiwgYWNjLCBsaXN0KTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCByZWR1Y2U7IiwiaW1wb3J0IF9jbG9uZSBmcm9tIFwiLi9pbnRlcm5hbC9fY2xvbmUuanNcIjtcbmltcG9ydCBfY3VycnlOIGZyb20gXCIuL2ludGVybmFsL19jdXJyeU4uanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL2ludGVybmFsL19oYXMuanNcIjtcbmltcG9ydCBfcmVkdWNlZCBmcm9tIFwiLi9pbnRlcm5hbC9fcmVkdWNlZC5qc1wiO1xuaW1wb3J0IF94UmVkdWNlIGZyb20gXCIuL2ludGVybmFsL194UmVkdWNlLmpzXCI7XG5pbXBvcnQgX3hyZWR1Y2VCeSBmcm9tIFwiLi9pbnRlcm5hbC9feHJlZHVjZUJ5LmpzXCI7XG5pbXBvcnQgX3h3cmFwIGZyb20gXCIuL2ludGVybmFsL194d3JhcC5qc1wiO1xuLyoqXG4gKiBHcm91cHMgdGhlIGVsZW1lbnRzIG9mIHRoZSBsaXN0IGFjY29yZGluZyB0byB0aGUgcmVzdWx0IG9mIGNhbGxpbmdcbiAqIHRoZSBTdHJpbmctcmV0dXJuaW5nIGZ1bmN0aW9uIGBrZXlGbmAgb24gZWFjaCBlbGVtZW50IGFuZCByZWR1Y2VzIHRoZSBlbGVtZW50c1xuICogb2YgZWFjaCBncm91cCB0byBhIHNpbmdsZSB2YWx1ZSB2aWEgdGhlIHJlZHVjZXIgZnVuY3Rpb24gYHZhbHVlRm5gLlxuICpcbiAqIFRoZSB2YWx1ZSBmdW5jdGlvbiByZWNlaXZlcyB0d28gdmFsdWVzOiAqKGFjYywgdmFsdWUpKi4gSXQgbWF5IHVzZVxuICogW2BSLnJlZHVjZWRgXSgjcmVkdWNlZCkgdG8gc2hvcnQgY2lyY3VpdCB0aGUgaXRlcmF0aW9uLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGEgbW9yZSBnZW5lcmFsIFtgZ3JvdXBCeWBdKCNncm91cEJ5KSBmdW5jdGlvbi5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjAuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKChhLCBiKSAtPiBhKSAtPiBhIC0+IChiIC0+IFN0cmluZykgLT4gW2JdIC0+IHtTdHJpbmc6IGF9XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB2YWx1ZUZuIFRoZSBmdW5jdGlvbiB0aGF0IHJlZHVjZXMgdGhlIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXAgdG8gYSBzaW5nbGVcbiAqICAgICAgICB2YWx1ZS4gUmVjZWl2ZXMgdHdvIHZhbHVlcywgYWNjdW11bGF0b3IgZm9yIGEgcGFydGljdWxhciBncm91cCBhbmQgdGhlIGN1cnJlbnQgZWxlbWVudC5cbiAqIEBwYXJhbSB7Kn0gYWNjIFRoZSAoaW5pdGlhbCkgYWNjdW11bGF0b3IgdmFsdWUgZm9yIGVhY2ggZ3JvdXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlGbiBUaGUgZnVuY3Rpb24gdGhhdCBtYXBzIHRoZSBsaXN0J3MgZWxlbWVudCBpbnRvIGEga2V5LlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gZ3JvdXAuXG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCB3aXRoIHRoZSBvdXRwdXQgb2YgYGtleUZuYCBmb3Iga2V5cywgbWFwcGVkIHRvIHRoZSBvdXRwdXQgb2ZcbiAqICAgICAgICAgYHZhbHVlRm5gIGZvciBlbGVtZW50cyB3aGljaCBwcm9kdWNlZCB0aGF0IGtleSB3aGVuIHBhc3NlZCB0byBga2V5Rm5gLlxuICogQHNlZSBSLmdyb3VwQnksIFIucmVkdWNlLCBSLnJlZHVjZWRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBncm91cE5hbWVzID0gKGFjYywge25hbWV9KSA9PiBhY2MuY29uY2F0KG5hbWUpXG4gKiAgICAgIGNvbnN0IHRvR3JhZGUgPSAoe3Njb3JlfSkgPT5cbiAqICAgICAgICBzY29yZSA8IDY1ID8gJ0YnIDpcbiAqICAgICAgICBzY29yZSA8IDcwID8gJ0QnIDpcbiAqICAgICAgICBzY29yZSA8IDgwID8gJ0MnIDpcbiAqICAgICAgICBzY29yZSA8IDkwID8gJ0InIDogJ0EnXG4gKlxuICogICAgICB2YXIgc3R1ZGVudHMgPSBbXG4gKiAgICAgICAge25hbWU6ICdBYmJ5Jywgc2NvcmU6IDgzfSxcbiAqICAgICAgICB7bmFtZTogJ0JhcnQnLCBzY29yZTogNjJ9LFxuICogICAgICAgIHtuYW1lOiAnQ3VydCcsIHNjb3JlOiA4OH0sXG4gKiAgICAgICAge25hbWU6ICdEb3JhJywgc2NvcmU6IDkyfSxcbiAqICAgICAgXVxuICpcbiAqICAgICAgcmVkdWNlQnkoZ3JvdXBOYW1lcywgW10sIHRvR3JhZGUsIHN0dWRlbnRzKVxuICogICAgICAvLz0+IHtcIkFcIjogW1wiRG9yYVwiXSwgXCJCXCI6IFtcIkFiYnlcIiwgXCJDdXJ0XCJdLCBcIkZcIjogW1wiQmFydFwiXX1cbiAqL1xuXG52YXIgcmVkdWNlQnkgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5Tig0LCBbXSxcbi8qI19fUFVSRV9fKi9cbl9kaXNwYXRjaGFibGUoW10sIF94cmVkdWNlQnksIGZ1bmN0aW9uIHJlZHVjZUJ5KHZhbHVlRm4sIHZhbHVlQWNjLCBrZXlGbiwgbGlzdCkge1xuICB2YXIgeGYgPSBfeHdyYXAoZnVuY3Rpb24gKGFjYywgZWx0KSB7XG4gICAgdmFyIGtleSA9IGtleUZuKGVsdCk7XG4gICAgdmFyIHZhbHVlID0gdmFsdWVGbihfaGFzKGtleSwgYWNjKSA/IGFjY1trZXldIDogX2Nsb25lKHZhbHVlQWNjLCBmYWxzZSksIGVsdCk7XG5cbiAgICBpZiAodmFsdWUgJiYgdmFsdWVbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ10pIHtcbiAgICAgIHJldHVybiBfcmVkdWNlZChhY2MpO1xuICAgIH1cblxuICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIGFjYztcbiAgfSk7XG5cbiAgcmV0dXJuIF94UmVkdWNlKHhmLCB7fSwgbGlzdCk7XG59KSk7XG5cbmV4cG9ydCBkZWZhdWx0IHJlZHVjZUJ5OyIsImltcG9ydCBfY29tcGxlbWVudCBmcm9tIFwiLi9pbnRlcm5hbC9fY29tcGxlbWVudC5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbi8qKlxuICogVGhlIGNvbXBsZW1lbnQgb2YgW2BmaWx0ZXJgXSgjZmlsdGVyKS5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uIEZpbHRlcmFibGVcbiAqIG9iamVjdHMgaW5jbHVkZSBwbGFpbiBvYmplY3RzIG9yIGFueSBvYmplY3QgdGhhdCBoYXMgYSBmaWx0ZXIgbWV0aG9kIHN1Y2hcbiAqIGFzIGBBcnJheWAuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBGaWx0ZXJhYmxlIGYgPT4gKGEgLT4gQm9vbGVhbikgLT4gZiBhIC0+IGYgYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZFxuICogQHBhcmFtIHtBcnJheX0gZmlsdGVyYWJsZVxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAc2VlIFIuZmlsdGVyLCBSLnRyYW5zZHVjZSwgUi5hZGRJbmRleFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGlzT2RkID0gKG4pID0+IG4gJSAyICE9PSAwO1xuICpcbiAqICAgICAgUi5yZWplY3QoaXNPZGQsIFsxLCAyLCAzLCA0XSk7IC8vPT4gWzIsIDRdXG4gKlxuICogICAgICBSLnJlamVjdChpc09kZCwge2E6IDEsIGI6IDIsIGM6IDMsIGQ6IDR9KTsgLy89PiB7YjogMiwgZDogNH1cbiAqL1xuXG52YXIgcmVqZWN0ID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gcmVqZWN0KHByZWQsIGZpbHRlcmFibGUpIHtcbiAgcmV0dXJuIGZpbHRlcihfY29tcGxlbWVudChwcmVkKSwgZmlsdGVyYWJsZSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcmVqZWN0OyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbi8qKlxuICogUmVtb3ZlcyB0aGUgc3ViLWxpc3Qgb2YgYGxpc3RgIHN0YXJ0aW5nIGF0IGluZGV4IGBzdGFydGAgYW5kIGNvbnRhaW5pbmdcbiAqIGBjb3VudGAgZWxlbWVudHMuIF9Ob3RlIHRoYXQgdGhpcyBpcyBub3QgZGVzdHJ1Y3RpdmVfOiBpdCByZXR1cm5zIGEgY29weSBvZlxuICogdGhlIGxpc3Qgd2l0aCB0aGUgY2hhbmdlcy5cbiAqIDxzbWFsbD5ObyBsaXN0cyBoYXZlIGJlZW4gaGFybWVkIGluIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLjwvc21hbGw+XG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMi4yXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7TnVtYmVyfSBzdGFydCBUaGUgcG9zaXRpb24gdG8gc3RhcnQgcmVtb3ZpbmcgZWxlbWVudHNcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJlbW92ZVxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byByZW1vdmUgZnJvbVxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3IEFycmF5IHdpdGggYGNvdW50YCBlbGVtZW50cyBmcm9tIGBzdGFydGAgcmVtb3ZlZC5cbiAqIEBzZWUgUi53aXRob3V0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5yZW1vdmUoMiwgMywgWzEsMiwzLDQsNSw2LDcsOF0pOyAvLz0+IFsxLDIsNiw3LDhdXG4gKi9cblxudmFyIHJlbW92ZSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKGZ1bmN0aW9uIHJlbW92ZShzdGFydCwgY291bnQsIGxpc3QpIHtcbiAgdmFyIHJlc3VsdCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIDApO1xuICByZXN1bHQuc3BsaWNlKHN0YXJ0LCBjb3VudCk7XG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcmVtb3ZlOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaXNTdHJpbmcgZnJvbSBcIi4vaW50ZXJuYWwvX2lzU3RyaW5nLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBvciBzdHJpbmcgd2l0aCB0aGUgZWxlbWVudHMgb3IgY2hhcmFjdGVycyBpbiByZXZlcnNlXG4gKiBvcmRlci5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBbYV1cbiAqIEBzaWcgU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IGxpc3RcbiAqIEByZXR1cm4ge0FycmF5fFN0cmluZ31cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnJldmVyc2UoWzEsIDIsIDNdKTsgIC8vPT4gWzMsIDIsIDFdXG4gKiAgICAgIFIucmV2ZXJzZShbMSwgMl0pOyAgICAgLy89PiBbMiwgMV1cbiAqICAgICAgUi5yZXZlcnNlKFsxXSk7ICAgICAgICAvLz0+IFsxXVxuICogICAgICBSLnJldmVyc2UoW10pOyAgICAgICAgIC8vPT4gW11cbiAqXG4gKiAgICAgIFIucmV2ZXJzZSgnYWJjJyk7ICAgICAgLy89PiAnY2JhJ1xuICogICAgICBSLnJldmVyc2UoJ2FiJyk7ICAgICAgIC8vPT4gJ2JhJ1xuICogICAgICBSLnJldmVyc2UoJ2EnKTsgICAgICAgIC8vPT4gJ2EnXG4gKiAgICAgIFIucmV2ZXJzZSgnJyk7ICAgICAgICAgLy89PiAnJ1xuICovXG5cbnZhciByZXZlcnNlID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoZnVuY3Rpb24gcmV2ZXJzZShsaXN0KSB7XG4gIHJldHVybiBfaXNTdHJpbmcobGlzdCkgPyBsaXN0LnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJykgOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCAwKS5yZXZlcnNlKCk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcmV2ZXJzZTsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgYWx3YXlzIGZyb20gXCIuL2Fsd2F5cy5qc1wiO1xuaW1wb3J0IG92ZXIgZnJvbSBcIi4vb3Zlci5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgXCJzZXR0aW5nXCIgdGhlIHBvcnRpb24gb2YgdGhlIGdpdmVuIGRhdGEgc3RydWN0dXJlXG4gKiBmb2N1c2VkIGJ5IHRoZSBnaXZlbiBsZW5zIHRvIHRoZSBnaXZlbiB2YWx1ZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNi4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gTGVucyBzIGEgPSBGdW5jdG9yIGYgPT4gKGEgLT4gZiBhKSAtPiBzIC0+IGYgc1xuICogQHNpZyBMZW5zIHMgYSAtPiBhIC0+IHMgLT4gc1xuICogQHBhcmFtIHtMZW5zfSBsZW5zXG4gKiBAcGFyYW0geyp9IHZcbiAqIEBwYXJhbSB7Kn0geFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi52aWV3LCBSLm92ZXIsIFIubGVucywgUi5sZW5zSW5kZXgsIFIubGVuc1Byb3AsIFIubGVuc1BhdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCB4TGVucyA9IFIubGVuc1Byb3AoJ3gnKTtcbiAqXG4gKiAgICAgIFIuc2V0KHhMZW5zLCA0LCB7eDogMSwgeTogMn0pOyAgLy89PiB7eDogNCwgeTogMn1cbiAqICAgICAgUi5zZXQoeExlbnMsIDgsIHt4OiAxLCB5OiAyfSk7ICAvLz0+IHt4OiA4LCB5OiAyfVxuICovXG5cbnZhciBzZXQgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MyhmdW5jdGlvbiBzZXQobGVucywgdiwgeCkge1xuICByZXR1cm4gb3ZlcihsZW5zLCBhbHdheXModiksIHgpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHNldDsiLCJpbXBvcnQgX2NoZWNrRm9yTWV0aG9kIGZyb20gXCIuL2ludGVybmFsL19jaGVja0Zvck1ldGhvZC5qc1wiO1xuaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gbGlzdCBvciBzdHJpbmcgKG9yIG9iamVjdCB3aXRoIGEgYHNsaWNlYFxuICogbWV0aG9kKSBmcm9tIGBmcm9tSW5kZXhgIChpbmNsdXNpdmUpIHRvIGB0b0luZGV4YCAoZXhjbHVzaXZlKS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgc2xpY2VgIG1ldGhvZCBvZiB0aGUgdGhpcmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS40XG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IFthXSAtPiBbYV1cbiAqIEBzaWcgTnVtYmVyIC0+IE51bWJlciAtPiBTdHJpbmcgLT4gU3RyaW5nXG4gKiBAcGFyYW0ge051bWJlcn0gZnJvbUluZGV4IFRoZSBzdGFydCBpbmRleCAoaW5jbHVzaXZlKS5cbiAqIEBwYXJhbSB7TnVtYmVyfSB0b0luZGV4IFRoZSBlbmQgaW5kZXggKGV4Y2x1c2l2ZSkuXG4gKiBAcGFyYW0geyp9IGxpc3RcbiAqIEByZXR1cm4geyp9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5zbGljZSgxLCAzLCBbJ2EnLCAnYicsICdjJywgJ2QnXSk7ICAgICAgICAvLz0+IFsnYicsICdjJ11cbiAqICAgICAgUi5zbGljZSgxLCBJbmZpbml0eSwgWydhJywgJ2InLCAnYycsICdkJ10pOyAvLz0+IFsnYicsICdjJywgJ2QnXVxuICogICAgICBSLnNsaWNlKDAsIC0xLCBbJ2EnLCAnYicsICdjJywgJ2QnXSk7ICAgICAgIC8vPT4gWydhJywgJ2InLCAnYyddXG4gKiAgICAgIFIuc2xpY2UoLTMsIC0xLCBbJ2EnLCAnYicsICdjJywgJ2QnXSk7ICAgICAgLy89PiBbJ2InLCAnYyddXG4gKiAgICAgIFIuc2xpY2UoMCwgMywgJ3JhbWRhJyk7ICAgICAgICAgICAgICAgICAgICAgLy89PiAncmFtJ1xuICovXG5cbnZhciBzbGljZSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkzKFxuLyojX19QVVJFX18qL1xuX2NoZWNrRm9yTWV0aG9kKCdzbGljZScsIGZ1bmN0aW9uIHNsaWNlKGZyb21JbmRleCwgdG9JbmRleCwgbGlzdCkge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobGlzdCwgZnJvbUluZGV4LCB0b0luZGV4KTtcbn0pKTtcblxuZXhwb3J0IGRlZmF1bHQgc2xpY2U7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgbGlzdCwgc29ydGVkIGFjY29yZGluZyB0byB0aGUgY29tcGFyYXRvciBmdW5jdGlvbixcbiAqIHdoaWNoIHNob3VsZCBhY2NlcHQgdHdvIHZhbHVlcyBhdCBhIHRpbWUgYW5kIHJldHVybiBhIG5lZ2F0aXZlIG51bWJlciBpZiB0aGVcbiAqIGZpcnN0IHZhbHVlIGlzIHNtYWxsZXIsIGEgcG9zaXRpdmUgbnVtYmVyIGlmIGl0J3MgbGFyZ2VyLCBhbmQgemVybyBpZiB0aGV5XG4gKiBhcmUgZXF1YWwuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBpcyBhICoqY29weSoqIG9mIHRoZSBsaXN0LiBJdCBkb2VzIG5vdFxuICogbW9kaWZ5IHRoZSBvcmlnaW5hbC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICgoYSwgYSkgLT4gTnVtYmVyKSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIEEgc29ydGluZyBmdW5jdGlvbiA6OiBhIC0+IGIgLT4gSW50XG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIHNvcnRcbiAqIEByZXR1cm4ge0FycmF5fSBhIG5ldyBhcnJheSB3aXRoIGl0cyBlbGVtZW50cyBzb3J0ZWQgYnkgdGhlIGNvbXBhcmF0b3IgZnVuY3Rpb24uXG4gKiBAc2VlIFIuYXNjZW5kLCBSLmRlc2NlbmRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBkaWZmID0gZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gYSAtIGI7IH07XG4gKiAgICAgIFIuc29ydChkaWZmLCBbNCwyLDcsNV0pOyAvLz0+IFsyLCA0LCA1LCA3XVxuICovXG5cbnZhciBzb3J0ID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoZnVuY3Rpb24gc29ydChjb21wYXJhdG9yLCBsaXN0KSB7XG4gIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCAwKS5zb3J0KGNvbXBhcmF0b3IpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHNvcnQ7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGVxdWFscyBmcm9tIFwiLi9lcXVhbHMuanNcIjtcbmltcG9ydCB0YWtlIGZyb20gXCIuL3Rha2UuanNcIjtcbi8qKlxuICogQ2hlY2tzIGlmIGEgbGlzdCBzdGFydHMgd2l0aCB0aGUgcHJvdmlkZWQgc3VibGlzdC5cbiAqXG4gKiBTaW1pbGFybHksIGNoZWNrcyBpZiBhIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgcHJvdmlkZWQgc3Vic3RyaW5nLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI0LjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBbYV0gLT4gQm9vbGVhblxuICogQHNpZyBTdHJpbmcgLT4gU3RyaW5nIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0gcHJlZml4XG4gKiBAcGFyYW0geyp9IGxpc3RcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAc2VlIFIuZW5kc1dpdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnN0YXJ0c1dpdGgoJ2EnLCAnYWJjJykgICAgICAgICAgICAgICAgLy89PiB0cnVlXG4gKiAgICAgIFIuc3RhcnRzV2l0aCgnYicsICdhYmMnKSAgICAgICAgICAgICAgICAvLz0+IGZhbHNlXG4gKiAgICAgIFIuc3RhcnRzV2l0aChbJ2EnXSwgWydhJywgJ2InLCAnYyddKSAgICAvLz0+IHRydWVcbiAqICAgICAgUi5zdGFydHNXaXRoKFsnYiddLCBbJ2EnLCAnYicsICdjJ10pICAgIC8vPT4gZmFsc2VcbiAqL1xuXG52YXIgc3RhcnRzV2l0aCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIChwcmVmaXgsIGxpc3QpIHtcbiAgcmV0dXJuIGVxdWFscyh0YWtlKHByZWZpeC5sZW5ndGgsIGxpc3QpLCBwcmVmaXgpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHN0YXJ0c1dpdGg7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF94dGFrZSBmcm9tIFwiLi9pbnRlcm5hbC9feHRha2UuanNcIjtcbmltcG9ydCBzbGljZSBmcm9tIFwiLi9zbGljZS5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBgbmAgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGxpc3QsIHN0cmluZywgb3JcbiAqIHRyYW5zZHVjZXIvdHJhbnNmb3JtZXIgKG9yIG9iamVjdCB3aXRoIGEgYHRha2VgIG1ldGhvZCkuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYHRha2VgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgTnVtYmVyIC0+IFthXSAtPiBbYV1cbiAqIEBzaWcgTnVtYmVyIC0+IFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gKiBAcGFyYW0geyp9IGxpc3RcbiAqIEByZXR1cm4geyp9XG4gKiBAc2VlIFIuZHJvcFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudGFrZSgxLCBbJ2ZvbycsICdiYXInLCAnYmF6J10pOyAvLz0+IFsnZm9vJ11cbiAqICAgICAgUi50YWtlKDIsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydmb28nLCAnYmFyJ11cbiAqICAgICAgUi50YWtlKDMsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydmb28nLCAnYmFyJywgJ2JheiddXG4gKiAgICAgIFIudGFrZSg0LCBbJ2ZvbycsICdiYXInLCAnYmF6J10pOyAvLz0+IFsnZm9vJywgJ2JhcicsICdiYXonXVxuICogICAgICBSLnRha2UoMywgJ3JhbWRhJyk7ICAgICAgICAgICAgICAgLy89PiAncmFtJ1xuICpcbiAqICAgICAgY29uc3QgcGVyc29ubmVsID0gW1xuICogICAgICAgICdEYXZlIEJydWJlY2snLFxuICogICAgICAgICdQYXVsIERlc21vbmQnLFxuICogICAgICAgICdFdWdlbmUgV3JpZ2h0JyxcbiAqICAgICAgICAnSm9lIE1vcmVsbG8nLFxuICogICAgICAgICdHZXJyeSBNdWxsaWdhbicsXG4gKiAgICAgICAgJ0JvYiBCYXRlcycsXG4gKiAgICAgICAgJ0pvZSBEb2RnZScsXG4gKiAgICAgICAgJ1JvbiBDcm90dHknXG4gKiAgICAgIF07XG4gKlxuICogICAgICBjb25zdCB0YWtlRml2ZSA9IFIudGFrZSg1KTtcbiAqICAgICAgdGFrZUZpdmUocGVyc29ubmVsKTtcbiAqICAgICAgLy89PiBbJ0RhdmUgQnJ1YmVjaycsICdQYXVsIERlc21vbmQnLCAnRXVnZW5lIFdyaWdodCcsICdKb2UgTW9yZWxsbycsICdHZXJyeSBNdWxsaWdhbiddXG4gKiBAc3ltYiBSLnRha2UoLTEsIFthLCBiXSkgPSBbYSwgYl1cbiAqIEBzeW1iIFIudGFrZSgwLCBbYSwgYl0pID0gW11cbiAqIEBzeW1iIFIudGFrZSgxLCBbYSwgYl0pID0gW2FdXG4gKiBAc3ltYiBSLnRha2UoMiwgW2EsIGJdKSA9IFthLCBiXVxuICovXG5cbnZhciB0YWtlID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoXG4vKiNfX1BVUkVfXyovXG5fZGlzcGF0Y2hhYmxlKFsndGFrZSddLCBfeHRha2UsIGZ1bmN0aW9uIHRha2UobiwgeHMpIHtcbiAgcmV0dXJuIHNsaWNlKDAsIG4gPCAwID8gSW5maW5pdHkgOiBuLCB4cyk7XG59KSk7XG5cbmV4cG9ydCBkZWZhdWx0IHRha2U7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vaW50ZXJuYWwvX2hhcy5qc1wiO1xuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3QgaW50byBhbiBhcnJheSBvZiBrZXksIHZhbHVlIGFycmF5cy4gT25seSB0aGUgb2JqZWN0J3NcbiAqIG93biBwcm9wZXJ0aWVzIGFyZSB1c2VkLlxuICogTm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgb3V0cHV0IGFycmF5IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbnNpc3RlbnRcbiAqIGFjcm9zcyBkaWZmZXJlbnQgSlMgcGxhdGZvcm1zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjQuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7U3RyaW5nOiAqfSAtPiBbW1N0cmluZywqXV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBleHRyYWN0IGZyb21cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBrZXksIHZhbHVlIGFycmF5cyBmcm9tIHRoZSBvYmplY3QncyBvd24gcHJvcGVydGllcy5cbiAqIEBzZWUgUi5mcm9tUGFpcnMsIFIua2V5cywgUi52YWx1ZXNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnRvUGFpcnMoe2E6IDEsIGI6IDIsIGM6IDN9KTsgLy89PiBbWydhJywgMV0sIFsnYicsIDJdLCBbJ2MnLCAzXV1cbiAqL1xuXG52YXIgdG9QYWlycyA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIHRvUGFpcnMob2JqKSB7XG4gIHZhciBwYWlycyA9IFtdO1xuXG4gIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgaWYgKF9oYXMocHJvcCwgb2JqKSkge1xuICAgICAgcGFpcnNbcGFpcnMubGVuZ3RoXSA9IFtwcm9wLCBvYmpbcHJvcF1dO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYWlycztcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB0b1BhaXJzOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBfdG9TdHJpbmcgZnJvbSBcIi4vaW50ZXJuYWwvX3RvU3RyaW5nLmpzXCI7XG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdmFsdWUuIGBldmFsYCdpbmcgdGhlIG91dHB1dFxuICogc2hvdWxkIHJlc3VsdCBpbiBhIHZhbHVlIGVxdWl2YWxlbnQgdG8gdGhlIGlucHV0IHZhbHVlLiBNYW55IG9mIHRoZSBidWlsdC1pblxuICogYHRvU3RyaW5nYCBtZXRob2RzIGRvIG5vdCBzYXRpc2Z5IHRoaXMgcmVxdWlyZW1lbnQuXG4gKlxuICogSWYgdGhlIGdpdmVuIHZhbHVlIGlzIGFuIGBbb2JqZWN0IE9iamVjdF1gIHdpdGggYSBgdG9TdHJpbmdgIG1ldGhvZCBvdGhlclxuICogdGhhbiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AsIHRoaXMgbWV0aG9kIGlzIGludm9rZWQgd2l0aCBubyBhcmd1bWVudHNcbiAqIHRvIHByb2R1Y2UgdGhlIHJldHVybiB2YWx1ZS4gVGhpcyBtZWFucyB1c2VyLWRlZmluZWQgY29uc3RydWN0b3IgZnVuY3Rpb25zXG4gKiBjYW4gcHJvdmlkZSBhIHN1aXRhYmxlIGB0b1N0cmluZ2AgbWV0aG9kLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgZnVuY3Rpb24gUG9pbnQoeCwgeSkge1xuICogICAgICAgdGhpcy54ID0geDtcbiAqICAgICAgIHRoaXMueSA9IHk7XG4gKiAgICAgfVxuICpcbiAqICAgICBQb2ludC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAqICAgICAgIHJldHVybiAnbmV3IFBvaW50KCcgKyB0aGlzLnggKyAnLCAnICsgdGhpcy55ICsgJyknO1xuICogICAgIH07XG4gKlxuICogICAgIFIudG9TdHJpbmcobmV3IFBvaW50KDEsIDIpKTsgLy89PiAnbmV3IFBvaW50KDEsIDIpJ1xuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE0LjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBzaWcgKiAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7Kn0gdmFsXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi50b1N0cmluZyg0Mik7IC8vPT4gJzQyJ1xuICogICAgICBSLnRvU3RyaW5nKCdhYmMnKTsgLy89PiAnXCJhYmNcIidcbiAqICAgICAgUi50b1N0cmluZyhbMSwgMiwgM10pOyAvLz0+ICdbMSwgMiwgM10nXG4gKiAgICAgIFIudG9TdHJpbmcoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9KTsgLy89PiAne1wiYmFyXCI6IDIsIFwiYmF6XCI6IDMsIFwiZm9vXCI6IDF9J1xuICogICAgICBSLnRvU3RyaW5nKG5ldyBEYXRlKCcyMDAxLTAyLTAzVDA0OjA1OjA2WicpKTsgLy89PiAnbmV3IERhdGUoXCIyMDAxLTAyLTAzVDA0OjA1OjA2LjAwMFpcIiknXG4gKi9cblxudmFyIHRvU3RyaW5nID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTEoZnVuY3Rpb24gdG9TdHJpbmcodmFsKSB7XG4gIHJldHVybiBfdG9TdHJpbmcodmFsLCBbXSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgdG9TdHJpbmc7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuLyoqXG4gKiBHaXZlcyBhIHNpbmdsZS13b3JkIHN0cmluZyBkZXNjcmlwdGlvbiBvZiB0aGUgKG5hdGl2ZSkgdHlwZSBvZiBhIHZhbHVlLFxuICogcmV0dXJuaW5nIHN1Y2ggYW5zd2VycyBhcyAnT2JqZWN0JywgJ051bWJlcicsICdBcnJheScsIG9yICdOdWxsJy4gRG9lcyBub3RcbiAqIGF0dGVtcHQgdG8gZGlzdGluZ3Vpc2ggdXNlciBPYmplY3QgdHlwZXMgYW55IGZ1cnRoZXIsIHJlcG9ydGluZyB0aGVtIGFsbCBhc1xuICogJ09iamVjdCcuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOC4wXG4gKiBAY2F0ZWdvcnkgVHlwZVxuICogQHNpZyAqIC0+IFN0cmluZ1xuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnR5cGUoe30pOyAvLz0+IFwiT2JqZWN0XCJcbiAqICAgICAgUi50eXBlKDEpOyAvLz0+IFwiTnVtYmVyXCJcbiAqICAgICAgUi50eXBlKGZhbHNlKTsgLy89PiBcIkJvb2xlYW5cIlxuICogICAgICBSLnR5cGUoJ3MnKTsgLy89PiBcIlN0cmluZ1wiXG4gKiAgICAgIFIudHlwZShudWxsKTsgLy89PiBcIk51bGxcIlxuICogICAgICBSLnR5cGUoW10pOyAvLz0+IFwiQXJyYXlcIlxuICogICAgICBSLnR5cGUoL1tBLXpdLyk7IC8vPT4gXCJSZWdFeHBcIlxuICogICAgICBSLnR5cGUoKCkgPT4ge30pOyAvLz0+IFwiRnVuY3Rpb25cIlxuICogICAgICBSLnR5cGUoYXN5bmMgKCkgPT4ge30pOyAvLz0+IFwiQXN5bmNGdW5jdGlvblwiXG4gKiAgICAgIFIudHlwZSh1bmRlZmluZWQpOyAvLz0+IFwiVW5kZWZpbmVkXCJcbiAqL1xuXG52YXIgdHlwZSA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkxKGZ1bmN0aW9uIHR5cGUodmFsKSB7XG4gIHJldHVybiB2YWwgPT09IG51bGwgPyAnTnVsbCcgOiB2YWwgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkuc2xpY2UoOCwgLTEpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHR5cGU7IiwiaW1wb3J0IGlkZW50aXR5IGZyb20gXCIuL2lkZW50aXR5LmpzXCI7XG5pbXBvcnQgdW5pcUJ5IGZyb20gXCIuL3VuaXFCeS5qc1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyBvbmx5IG9uZSBjb3B5IG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAqIGxpc3QuIFtgUi5lcXVhbHNgXSgjZXF1YWxzKSBpcyB1c2VkIHRvIGRldGVybWluZSBlcXVhbGl0eS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIHVuaXF1ZSBpdGVtcy5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnVuaXEoWzEsIDEsIDIsIDFdKTsgLy89PiBbMSwgMl1cbiAqICAgICAgUi51bmlxKFsxLCAnMSddKTsgICAgIC8vPT4gWzEsICcxJ11cbiAqICAgICAgUi51bmlxKFtbNDJdLCBbNDJdXSk7IC8vPT4gW1s0Ml1dXG4gKi9cblxudmFyIHVuaXEgPVxuLyojX19QVVJFX18qL1xudW5pcUJ5KGlkZW50aXR5KTtcbmV4cG9ydCBkZWZhdWx0IHVuaXE7IiwiaW1wb3J0IF9TZXQgZnJvbSBcIi4vaW50ZXJuYWwvX1NldC5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF94dW5pcUJ5IGZyb20gXCIuL2ludGVybmFsL194dW5pcUJ5LmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIG9ubHkgb25lIGNvcHkgb2YgZWFjaCBlbGVtZW50IGluIHRoZSBvcmlnaW5hbFxuICogbGlzdCwgYmFzZWQgdXBvbiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgYXBwbHlpbmcgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIHRvXG4gKiBlYWNoIGxpc3QgZWxlbWVudC4gUHJlZmVycyB0aGUgZmlyc3QgaXRlbSBpZiB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gcHJvZHVjZXNcbiAqIHRoZSBzYW1lIHZhbHVlIG9uIHR3byBpdGVtcy4gW2BSLmVxdWFsc2BdKCNlcXVhbHMpIGlzIHVzZWQgZm9yIGNvbXBhcmlzb24uXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IGIpIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEEgZnVuY3Rpb24gdXNlZCB0byBwcm9kdWNlIGEgdmFsdWUgdG8gdXNlIGR1cmluZyBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIHVuaXF1ZSBpdGVtcy5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnVuaXFCeShNYXRoLmFicywgWy0xLCAtNSwgMiwgMTAsIDEsIDJdKTsgLy89PiBbLTEsIC01LCAyLCAxMF1cbiAqL1xuXG52YXIgdW5pcUJ5ID1cbi8qI19fUFVSRV9fKi9cbl9jdXJyeTIoXG4vKiNfX1BVUkVfXyovXG5fZGlzcGF0Y2hhYmxlKFtdLCBfeHVuaXFCeSwgZnVuY3Rpb24gKGZuLCBsaXN0KSB7XG4gIHZhciBzZXQgPSBuZXcgX1NldCgpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpZHggPSAwO1xuICB2YXIgYXBwbGllZEl0ZW0sIGl0ZW07XG5cbiAgd2hpbGUgKGlkeCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgaXRlbSA9IGxpc3RbaWR4XTtcbiAgICBhcHBsaWVkSXRlbSA9IGZuKGl0ZW0pO1xuXG4gICAgaWYgKHNldC5hZGQoYXBwbGllZEl0ZW0pKSB7XG4gICAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgICB9XG5cbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59KSk7XG5cbmV4cG9ydCBkZWZhdWx0IHVuaXFCeTsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQga2V5cyBmcm9tIFwiLi9rZXlzLmpzXCI7XG4vKipcbiAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBvZiB0aGUgc3VwcGxpZWQgb2JqZWN0LlxuICogTm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgb3V0cHV0IGFycmF5IGlzIG5vdCBndWFyYW50ZWVkIGFjcm9zcyBkaWZmZXJlbnRcbiAqIEpTIHBsYXRmb3Jtcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcge2s6IHZ9IC0+IFt2XVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGV4dHJhY3QgdmFsdWVzIGZyb21cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiB0aGUgdmFsdWVzIG9mIHRoZSBvYmplY3QncyBvd24gcHJvcGVydGllcy5cbiAqIEBzZWUgUi52YWx1ZXNJbiwgUi5rZXlzLCBSLnRvUGFpcnNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnZhbHVlcyh7YTogMSwgYjogMiwgYzogM30pOyAvLz0+IFsxLCAyLCAzXVxuICovXG5cbnZhciB2YWx1ZXMgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MShmdW5jdGlvbiB2YWx1ZXMob2JqKSB7XG4gIHZhciBwcm9wcyA9IGtleXMob2JqKTtcbiAgdmFyIGxlbiA9IHByb3BzLmxlbmd0aDtcbiAgdmFyIHZhbHMgPSBbXTtcbiAgdmFyIGlkeCA9IDA7XG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIHZhbHNbaWR4XSA9IG9ialtwcm9wc1tpZHhdXTtcbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiB2YWxzO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHZhbHVlczsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7IC8vIGBDb25zdGAgaXMgYSBmdW5jdG9yIHRoYXQgZWZmZWN0aXZlbHkgaWdub3JlcyB0aGUgZnVuY3Rpb24gZ2l2ZW4gdG8gYG1hcGAuXG5cbnZhciBDb25zdCA9IGZ1bmN0aW9uICh4KSB7XG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHgsXG4gICAgJ2ZhbnRhc3ktbGFuZC9tYXAnOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH07XG59O1xuLyoqXG4gKiBSZXR1cm5zIGEgXCJ2aWV3XCIgb2YgdGhlIGdpdmVuIGRhdGEgc3RydWN0dXJlLCBkZXRlcm1pbmVkIGJ5IHRoZSBnaXZlbiBsZW5zLlxuICogVGhlIGxlbnMncyBmb2N1cyBkZXRlcm1pbmVzIHdoaWNoIHBvcnRpb24gb2YgdGhlIGRhdGEgc3RydWN0dXJlIGlzIHZpc2libGUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTYuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIExlbnMgcyBhID0gRnVuY3RvciBmID0+IChhIC0+IGYgYSkgLT4gcyAtPiBmIHNcbiAqIEBzaWcgTGVucyBzIGEgLT4gcyAtPiBhXG4gKiBAcGFyYW0ge0xlbnN9IGxlbnNcbiAqIEBwYXJhbSB7Kn0geFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5zZXQsIFIub3ZlciwgUi5sZW5zLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcCwgUi5sZW5zUGF0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHhMZW5zID0gUi5sZW5zUHJvcCgneCcpO1xuICpcbiAqICAgICAgUi52aWV3KHhMZW5zLCB7eDogMSwgeTogMn0pOyAgLy89PiAxXG4gKiAgICAgIFIudmlldyh4TGVucywge3g6IDQsIHk6IDJ9KTsgIC8vPT4gNFxuICovXG5cblxudmFyIHZpZXcgPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiB2aWV3KGxlbnMsIHgpIHtcbiAgLy8gVXNpbmcgYENvbnN0YCBlZmZlY3RpdmVseSBpZ25vcmVzIHRoZSBzZXR0ZXIgZnVuY3Rpb24gb2YgdGhlIGBsZW5zYCxcbiAgLy8gbGVhdmluZyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGdldHRlciBmdW5jdGlvbiB1bm1vZGlmaWVkLlxuICByZXR1cm4gbGVucyhDb25zdCkoeCkudmFsdWU7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgdmlldzsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbGlzdCBvdXQgb2YgdGhlIHR3byBzdXBwbGllZCBieSBwYWlyaW5nIHVwIGVxdWFsbHktcG9zaXRpb25lZFxuICogaXRlbXMgZnJvbSBib3RoIGxpc3RzLiBUaGUgcmV0dXJuZWQgbGlzdCBpcyB0cnVuY2F0ZWQgdG8gdGhlIGxlbmd0aCBvZiB0aGVcbiAqIHNob3J0ZXIgb2YgdGhlIHR3byBpbnB1dCBsaXN0cy5cbiAqIE5vdGU6IGB6aXBgIGlzIGVxdWl2YWxlbnQgdG8gYHppcFdpdGgoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gW2EsIGJdIH0pYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBbYl0gLT4gW1thLGJdXVxuICogQHBhcmFtIHtBcnJheX0gbGlzdDEgVGhlIGZpcnN0IGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdDIgVGhlIHNlY29uZCBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgbGlzdCBtYWRlIGJ5IHBhaXJpbmcgdXAgc2FtZS1pbmRleGVkIGVsZW1lbnRzIG9mIGBsaXN0MWAgYW5kIGBsaXN0MmAuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi56aXAoWzEsIDIsIDNdLCBbJ2EnLCAnYicsICdjJ10pOyAvLz0+IFtbMSwgJ2EnXSwgWzIsICdiJ10sIFszLCAnYyddXVxuICogQHN5bWIgUi56aXAoW2EsIGIsIGNdLCBbZCwgZSwgZl0pID0gW1thLCBkXSwgW2IsIGVdLCBbYywgZl1dXG4gKi9cblxudmFyIHppcCA9XG4vKiNfX1BVUkVfXyovXG5fY3VycnkyKGZ1bmN0aW9uIHppcChhLCBiKSB7XG4gIHZhciBydiA9IFtdO1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aCk7XG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIHJ2W2lkeF0gPSBbYVtpZHhdLCBiW2lkeF1dO1xuICAgIGlkeCArPSAxO1xuICB9XG5cbiAgcmV0dXJuIHJ2O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHppcDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IG91dCBvZiBhIGxpc3Qgb2Yga2V5cyBhbmQgYSBsaXN0IG9mIHZhbHVlcy5cbiAqIEtleS92YWx1ZSBwYWlyaW5nIGlzIHRydW5jYXRlZCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVyIG9mIHRoZSB0d28gbGlzdHMuXG4gKiBOb3RlOiBgemlwT2JqYCBpcyBlcXVpdmFsZW50IHRvIGBwaXBlKHppcCwgZnJvbVBhaXJzKWAuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMy4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbU3RyaW5nXSAtPiBbKl0gLT4ge1N0cmluZzogKn1cbiAqIEBwYXJhbSB7QXJyYXl9IGtleXMgVGhlIGFycmF5IHRoYXQgd2lsbCBiZSBwcm9wZXJ0aWVzIG9uIHRoZSBvdXRwdXQgb2JqZWN0LlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBsaXN0IG9mIHZhbHVlcyBvbiB0aGUgb3V0cHV0IG9iamVjdC5cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIG9iamVjdCBtYWRlIGJ5IHBhaXJpbmcgdXAgc2FtZS1pbmRleGVkIGVsZW1lbnRzIG9mIGBrZXlzYCBhbmQgYHZhbHVlc2AuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi56aXBPYmooWydhJywgJ2InLCAnYyddLCBbMSwgMiwgM10pOyAvLz0+IHthOiAxLCBiOiAyLCBjOiAzfVxuICovXG5cbnZhciB6aXBPYmogPVxuLyojX19QVVJFX18qL1xuX2N1cnJ5MihmdW5jdGlvbiB6aXBPYmooa2V5cywgdmFsdWVzKSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gTWF0aC5taW4oa2V5cy5sZW5ndGgsIHZhbHVlcy5sZW5ndGgpO1xuICB2YXIgb3V0ID0ge307XG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIG91dFtrZXlzW2lkeF1dID0gdmFsdWVzW2lkeF07XG4gICAgaWR4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHppcE9iajsiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdGlkOiBtb2R1bGVJZCxcblx0XHRsb2FkZWQ6IGZhbHNlLFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcblx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuXHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgZGVmaW5pdGlvbikge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iaiwgcHJvcCkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7IH0iLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubm1kID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdHJldHVybiBtb2R1bGU7XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubmMgPSB1bmRlZmluZWQ7IiwiLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zICovXG52YXIgZyA9XG4gICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsVGhpcykgfHxcbiAgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmKSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbCkgfHxcbiAge31cblxudmFyIHN1cHBvcnQgPSB7XG4gIHNlYXJjaFBhcmFtczogJ1VSTFNlYXJjaFBhcmFtcycgaW4gZyxcbiAgaXRlcmFibGU6ICdTeW1ib2wnIGluIGcgJiYgJ2l0ZXJhdG9yJyBpbiBTeW1ib2wsXG4gIGJsb2I6XG4gICAgJ0ZpbGVSZWFkZXInIGluIGcgJiZcbiAgICAnQmxvYicgaW4gZyAmJlxuICAgIChmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBCbG9iKClcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSkoKSxcbiAgZm9ybURhdGE6ICdGb3JtRGF0YScgaW4gZyxcbiAgYXJyYXlCdWZmZXI6ICdBcnJheUJ1ZmZlcicgaW4gZ1xufVxuXG5mdW5jdGlvbiBpc0RhdGFWaWV3KG9iaikge1xuICByZXR1cm4gb2JqICYmIERhdGFWaWV3LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKG9iailcbn1cblxuaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIpIHtcbiAgdmFyIHZpZXdDbGFzc2VzID0gW1xuICAgICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50MzJBcnJheV0nLFxuICAgICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nXG4gIF1cblxuICB2YXIgaXNBcnJheUJ1ZmZlclZpZXcgPVxuICAgIEFycmF5QnVmZmVyLmlzVmlldyB8fFxuICAgIGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB2aWV3Q2xhc3Nlcy5pbmRleE9mKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopKSA+IC0xXG4gICAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOYW1lKG5hbWUpIHtcbiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgIG5hbWUgPSBTdHJpbmcobmFtZSlcbiAgfVxuICBpZiAoL1teYS16MC05XFwtIyQlJicqKy5eX2B8fiFdL2kudGVzdChuYW1lKSB8fCBuYW1lID09PSAnJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgY2hhcmFjdGVyIGluIGhlYWRlciBmaWVsZCBuYW1lOiBcIicgKyBuYW1lICsgJ1wiJylcbiAgfVxuICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpXG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8vIEJ1aWxkIGEgZGVzdHJ1Y3RpdmUgaXRlcmF0b3IgZm9yIHRoZSB2YWx1ZSBsaXN0XG5mdW5jdGlvbiBpdGVyYXRvckZvcihpdGVtcykge1xuICB2YXIgaXRlcmF0b3IgPSB7XG4gICAgbmV4dDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdmFsdWUgPSBpdGVtcy5zaGlmdCgpXG4gICAgICByZXR1cm4ge2RvbmU6IHZhbHVlID09PSB1bmRlZmluZWQsIHZhbHVlOiB2YWx1ZX1cbiAgICB9XG4gIH1cblxuICBpZiAoc3VwcG9ydC5pdGVyYWJsZSkge1xuICAgIGl0ZXJhdG9yW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBpdGVyYXRvclxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpdGVyYXRvclxufVxuXG5leHBvcnQgZnVuY3Rpb24gSGVhZGVycyhoZWFkZXJzKSB7XG4gIHRoaXMubWFwID0ge31cblxuICBpZiAoaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgIHRoaXMuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgIH0sIHRoaXMpXG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgIGhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbihoZWFkZXIpIHtcbiAgICAgIGlmIChoZWFkZXIubGVuZ3RoICE9IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSGVhZGVycyBjb25zdHJ1Y3RvcjogZXhwZWN0ZWQgbmFtZS92YWx1ZSBwYWlyIHRvIGJlIGxlbmd0aCAyLCBmb3VuZCcgKyBoZWFkZXIubGVuZ3RoKVxuICAgICAgfVxuICAgICAgdGhpcy5hcHBlbmQoaGVhZGVyWzBdLCBoZWFkZXJbMV0pXG4gICAgfSwgdGhpcylcbiAgfSBlbHNlIGlmIChoZWFkZXJzKSB7XG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICB0aGlzLmFwcGVuZChuYW1lLCBoZWFkZXJzW25hbWVdKVxuICAgIH0sIHRoaXMpXG4gIH1cbn1cblxuSGVhZGVycy5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSlcbiAgdmFsdWUgPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSlcbiAgdmFyIG9sZFZhbHVlID0gdGhpcy5tYXBbbmFtZV1cbiAgdGhpcy5tYXBbbmFtZV0gPSBvbGRWYWx1ZSA/IG9sZFZhbHVlICsgJywgJyArIHZhbHVlIDogdmFsdWVcbn1cblxuSGVhZGVycy5wcm90b3R5cGVbJ2RlbGV0ZSddID0gZnVuY3Rpb24obmFtZSkge1xuICBkZWxldGUgdGhpcy5tYXBbbm9ybWFsaXplTmFtZShuYW1lKV1cbn1cblxuSGVhZGVycy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24obmFtZSkge1xuICBuYW1lID0gbm9ybWFsaXplTmFtZShuYW1lKVxuICByZXR1cm4gdGhpcy5oYXMobmFtZSkgPyB0aGlzLm1hcFtuYW1lXSA6IG51bGxcbn1cblxuSGVhZGVycy5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24obmFtZSkge1xuICByZXR1cm4gdGhpcy5tYXAuaGFzT3duUHJvcGVydHkobm9ybWFsaXplTmFtZShuYW1lKSlcbn1cblxuSGVhZGVycy5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdGhpcy5tYXBbbm9ybWFsaXplTmFtZShuYW1lKV0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSlcbn1cblxuSGVhZGVycy5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gIGZvciAodmFyIG5hbWUgaW4gdGhpcy5tYXApIHtcbiAgICBpZiAodGhpcy5tYXAuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdGhpcy5tYXBbbmFtZV0sIG5hbWUsIHRoaXMpXG4gICAgfVxuICB9XG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGl0ZW1zID0gW11cbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgaXRlbXMucHVzaChuYW1lKVxuICB9KVxuICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaXRlbXMgPSBbXVxuICB0aGlzLmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpdGVtcy5wdXNoKHZhbHVlKVxuICB9KVxuICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGl0ZW1zID0gW11cbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgaXRlbXMucHVzaChbbmFtZSwgdmFsdWVdKVxuICB9KVxuICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG59XG5cbmlmIChzdXBwb3J0Lml0ZXJhYmxlKSB7XG4gIEhlYWRlcnMucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBIZWFkZXJzLnByb3RvdHlwZS5lbnRyaWVzXG59XG5cbmZ1bmN0aW9uIGNvbnN1bWVkKGJvZHkpIHtcbiAgaWYgKGJvZHkuX25vQm9keSkgcmV0dXJuXG4gIGlmIChib2R5LmJvZHlVc2VkKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpKVxuICB9XG4gIGJvZHkuYm9keVVzZWQgPSB0cnVlXG59XG5cbmZ1bmN0aW9uIGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlc29sdmUocmVhZGVyLnJlc3VsdClcbiAgICB9XG4gICAgcmVhZGVyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlamVjdChyZWFkZXIuZXJyb3IpXG4gICAgfVxuICB9KVxufVxuXG5mdW5jdGlvbiByZWFkQmxvYkFzQXJyYXlCdWZmZXIoYmxvYikge1xuICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICB2YXIgcHJvbWlzZSA9IGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpXG4gIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKVxuICByZXR1cm4gcHJvbWlzZVxufVxuXG5mdW5jdGlvbiByZWFkQmxvYkFzVGV4dChibG9iKSB7XG4gIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXG4gIHZhciBwcm9taXNlID0gZmlsZVJlYWRlclJlYWR5KHJlYWRlcilcbiAgdmFyIG1hdGNoID0gL2NoYXJzZXQ9KFtBLVphLXowLTlfLV0rKS8uZXhlYyhibG9iLnR5cGUpXG4gIHZhciBlbmNvZGluZyA9IG1hdGNoID8gbWF0Y2hbMV0gOiAndXRmLTgnXG4gIHJlYWRlci5yZWFkQXNUZXh0KGJsb2IsIGVuY29kaW5nKVxuICByZXR1cm4gcHJvbWlzZVxufVxuXG5mdW5jdGlvbiByZWFkQXJyYXlCdWZmZXJBc1RleHQoYnVmKSB7XG4gIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKVxuICB2YXIgY2hhcnMgPSBuZXcgQXJyYXkodmlldy5sZW5ndGgpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aWV3Lmxlbmd0aDsgaSsrKSB7XG4gICAgY2hhcnNbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHZpZXdbaV0pXG4gIH1cbiAgcmV0dXJuIGNoYXJzLmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGJ1ZmZlckNsb25lKGJ1Zikge1xuICBpZiAoYnVmLnNsaWNlKSB7XG4gICAgcmV0dXJuIGJ1Zi5zbGljZSgwKVxuICB9IGVsc2Uge1xuICAgIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmLmJ5dGVMZW5ndGgpXG4gICAgdmlldy5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmKSlcbiAgICByZXR1cm4gdmlldy5idWZmZXJcbiAgfVxufVxuXG5mdW5jdGlvbiBCb2R5KCkge1xuICB0aGlzLmJvZHlVc2VkID0gZmFsc2VcblxuICB0aGlzLl9pbml0Qm9keSA9IGZ1bmN0aW9uKGJvZHkpIHtcbiAgICAvKlxuICAgICAgZmV0Y2gtbW9jayB3cmFwcyB0aGUgUmVzcG9uc2Ugb2JqZWN0IGluIGFuIEVTNiBQcm94eSB0b1xuICAgICAgcHJvdmlkZSB1c2VmdWwgdGVzdCBoYXJuZXNzIGZlYXR1cmVzIHN1Y2ggYXMgZmx1c2guIEhvd2V2ZXIsIG9uXG4gICAgICBFUzUgYnJvd3NlcnMgd2l0aG91dCBmZXRjaCBvciBQcm94eSBzdXBwb3J0IHBvbGx5ZmlsbHMgbXVzdCBiZSB1c2VkO1xuICAgICAgdGhlIHByb3h5LXBvbGx5ZmlsbCBpcyB1bmFibGUgdG8gcHJveHkgYW4gYXR0cmlidXRlIHVubGVzcyBpdCBleGlzdHNcbiAgICAgIG9uIHRoZSBvYmplY3QgYmVmb3JlIHRoZSBQcm94eSBpcyBjcmVhdGVkLiBUaGlzIGNoYW5nZSBlbnN1cmVzXG4gICAgICBSZXNwb25zZS5ib2R5VXNlZCBleGlzdHMgb24gdGhlIGluc3RhbmNlLCB3aGlsZSBtYWludGFpbmluZyB0aGVcbiAgICAgIHNlbWFudGljIG9mIHNldHRpbmcgUmVxdWVzdC5ib2R5VXNlZCBpbiB0aGUgY29uc3RydWN0b3IgYmVmb3JlXG4gICAgICBfaW5pdEJvZHkgaXMgY2FsbGVkLlxuICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtYXNzaWduXG4gICAgdGhpcy5ib2R5VXNlZCA9IHRoaXMuYm9keVVzZWRcbiAgICB0aGlzLl9ib2R5SW5pdCA9IGJvZHlcbiAgICBpZiAoIWJvZHkpIHtcbiAgICAgIHRoaXMuX25vQm9keSA9IHRydWU7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9ICcnXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5ibG9iICYmIEJsb2IucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlCbG9iID0gYm9keVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5mb3JtRGF0YSAmJiBGb3JtRGF0YS5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgdGhpcy5fYm9keUZvcm1EYXRhID0gYm9keVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5zZWFyY2hQYXJhbXMgJiYgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHkudG9TdHJpbmcoKVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlciAmJiBzdXBwb3J0LmJsb2IgJiYgaXNEYXRhVmlldyhib2R5KSkge1xuICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyID0gYnVmZmVyQ2xvbmUoYm9keS5idWZmZXIpXG4gICAgICAvLyBJRSAxMC0xMSBjYW4ndCBoYW5kbGUgYSBEYXRhVmlldyBib2R5LlxuICAgICAgdGhpcy5fYm9keUluaXQgPSBuZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIgJiYgKEFycmF5QnVmZmVyLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpIHx8IGlzQXJyYXlCdWZmZXJWaWV3KGJvZHkpKSkge1xuICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyID0gYnVmZmVyQ2xvbmUoYm9keSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5ID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGJvZHkpXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSkge1xuICAgICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAndGV4dC9wbGFpbjtjaGFyc2V0PVVURi04JylcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUJsb2IgJiYgdGhpcy5fYm9keUJsb2IudHlwZSkge1xuICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCB0aGlzLl9ib2R5QmxvYi50eXBlKVxuICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LnNlYXJjaFBhcmFtcyAmJiBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04JylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoc3VwcG9ydC5ibG9iKSB7XG4gICAgdGhpcy5ibG9iID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcmVqZWN0ZWQgPSBjb25zdW1lZCh0aGlzKVxuICAgICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICAgIHJldHVybiByZWplY3RlZFxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fYm9keUJsb2IpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QmxvYilcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5Rm9ybURhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIGJsb2InKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keVRleHRdKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0aGlzLmFycmF5QnVmZmVyID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgdmFyIGlzQ29uc3VtZWQgPSBjb25zdW1lZCh0aGlzKVxuICAgICAgaWYgKGlzQ29uc3VtZWQpIHtcbiAgICAgICAgcmV0dXJuIGlzQ29uc3VtZWRcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnVmZmVyLnNsaWNlKFxuICAgICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ5dGVPZmZzZXQsXG4gICAgICAgICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnl0ZU9mZnNldCArIHRoaXMuX2JvZHlBcnJheUJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcilcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYmxvYikge1xuICAgICAgcmV0dXJuIHRoaXMuYmxvYigpLnRoZW4ocmVhZEJsb2JBc0FycmF5QnVmZmVyKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIGFzIEFycmF5QnVmZmVyJylcbiAgICB9XG4gIH1cblxuICB0aGlzLnRleHQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVqZWN0ZWQgPSBjb25zdW1lZCh0aGlzKVxuICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHJlamVjdGVkXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2JvZHlCbG9iKSB7XG4gICAgICByZXR1cm4gcmVhZEJsb2JBc1RleHQodGhpcy5fYm9keUJsb2IpXG4gICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVhZEFycmF5QnVmZmVyQXNUZXh0KHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikpXG4gICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5Rm9ybURhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyB0ZXh0JylcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5VGV4dClcbiAgICB9XG4gIH1cblxuICBpZiAoc3VwcG9ydC5mb3JtRGF0YSkge1xuICAgIHRoaXMuZm9ybURhdGEgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHQoKS50aGVuKGRlY29kZSlcbiAgICB9XG4gIH1cblxuICB0aGlzLmpzb24gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihKU09OLnBhcnNlKVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSFRUUCBtZXRob2RzIHdob3NlIGNhcGl0YWxpemF0aW9uIHNob3VsZCBiZSBub3JtYWxpemVkXG52YXIgbWV0aG9kcyA9IFsnQ09OTkVDVCcsICdERUxFVEUnLCAnR0VUJywgJ0hFQUQnLCAnT1BUSU9OUycsICdQQVRDSCcsICdQT1NUJywgJ1BVVCcsICdUUkFDRSddXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU1ldGhvZChtZXRob2QpIHtcbiAgdmFyIHVwY2FzZWQgPSBtZXRob2QudG9VcHBlckNhc2UoKVxuICByZXR1cm4gbWV0aG9kcy5pbmRleE9mKHVwY2FzZWQpID4gLTEgPyB1cGNhc2VkIDogbWV0aG9kXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZXF1ZXN0KGlucHV0LCBvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZXF1ZXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BsZWFzZSB1c2UgdGhlIFwibmV3XCIgb3BlcmF0b3IsIHRoaXMgRE9NIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uJylcbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIHZhciBib2R5ID0gb3B0aW9ucy5ib2R5XG5cbiAgaWYgKGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgIGlmIChpbnB1dC5ib2R5VXNlZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQWxyZWFkeSByZWFkJylcbiAgICB9XG4gICAgdGhpcy51cmwgPSBpbnB1dC51cmxcbiAgICB0aGlzLmNyZWRlbnRpYWxzID0gaW5wdXQuY3JlZGVudGlhbHNcbiAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMoaW5wdXQuaGVhZGVycylcbiAgICB9XG4gICAgdGhpcy5tZXRob2QgPSBpbnB1dC5tZXRob2RcbiAgICB0aGlzLm1vZGUgPSBpbnB1dC5tb2RlXG4gICAgdGhpcy5zaWduYWwgPSBpbnB1dC5zaWduYWxcbiAgICBpZiAoIWJvZHkgJiYgaW5wdXQuX2JvZHlJbml0ICE9IG51bGwpIHtcbiAgICAgIGJvZHkgPSBpbnB1dC5fYm9keUluaXRcbiAgICAgIGlucHV0LmJvZHlVc2VkID0gdHJ1ZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLnVybCA9IFN0cmluZyhpbnB1dClcbiAgfVxuXG4gIHRoaXMuY3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzIHx8IHRoaXMuY3JlZGVudGlhbHMgfHwgJ3NhbWUtb3JpZ2luJ1xuICBpZiAob3B0aW9ucy5oZWFkZXJzIHx8ICF0aGlzLmhlYWRlcnMpIHtcbiAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpXG4gIH1cbiAgdGhpcy5tZXRob2QgPSBub3JtYWxpemVNZXRob2Qob3B0aW9ucy5tZXRob2QgfHwgdGhpcy5tZXRob2QgfHwgJ0dFVCcpXG4gIHRoaXMubW9kZSA9IG9wdGlvbnMubW9kZSB8fCB0aGlzLm1vZGUgfHwgbnVsbFxuICB0aGlzLnNpZ25hbCA9IG9wdGlvbnMuc2lnbmFsIHx8IHRoaXMuc2lnbmFsIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCdBYm9ydENvbnRyb2xsZXInIGluIGcpIHtcbiAgICAgIHZhciBjdHJsID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgcmV0dXJuIGN0cmwuc2lnbmFsO1xuICAgIH1cbiAgfSgpKTtcbiAgdGhpcy5yZWZlcnJlciA9IG51bGxcblxuICBpZiAoKHRoaXMubWV0aG9kID09PSAnR0VUJyB8fCB0aGlzLm1ldGhvZCA9PT0gJ0hFQUQnKSAmJiBib2R5KSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9keSBub3QgYWxsb3dlZCBmb3IgR0VUIG9yIEhFQUQgcmVxdWVzdHMnKVxuICB9XG4gIHRoaXMuX2luaXRCb2R5KGJvZHkpXG5cbiAgaWYgKHRoaXMubWV0aG9kID09PSAnR0VUJyB8fCB0aGlzLm1ldGhvZCA9PT0gJ0hFQUQnKSB7XG4gICAgaWYgKG9wdGlvbnMuY2FjaGUgPT09ICduby1zdG9yZScgfHwgb3B0aW9ucy5jYWNoZSA9PT0gJ25vLWNhY2hlJykge1xuICAgICAgLy8gU2VhcmNoIGZvciBhICdfJyBwYXJhbWV0ZXIgaW4gdGhlIHF1ZXJ5IHN0cmluZ1xuICAgICAgdmFyIHJlUGFyYW1TZWFyY2ggPSAvKFs/Jl0pXz1bXiZdKi9cbiAgICAgIGlmIChyZVBhcmFtU2VhcmNoLnRlc3QodGhpcy51cmwpKSB7XG4gICAgICAgIC8vIElmIGl0IGFscmVhZHkgZXhpc3RzIHRoZW4gc2V0IHRoZSB2YWx1ZSB3aXRoIHRoZSBjdXJyZW50IHRpbWVcbiAgICAgICAgdGhpcy51cmwgPSB0aGlzLnVybC5yZXBsYWNlKHJlUGFyYW1TZWFyY2gsICckMV89JyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gT3RoZXJ3aXNlIGFkZCBhIG5ldyAnXycgcGFyYW1ldGVyIHRvIHRoZSBlbmQgd2l0aCB0aGUgY3VycmVudCB0aW1lXG4gICAgICAgIHZhciByZVF1ZXJ5U3RyaW5nID0gL1xcPy9cbiAgICAgICAgdGhpcy51cmwgKz0gKHJlUXVlcnlTdHJpbmcudGVzdCh0aGlzLnVybCkgPyAnJicgOiAnPycpICsgJ189JyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblJlcXVlc3QucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUmVxdWVzdCh0aGlzLCB7Ym9keTogdGhpcy5fYm9keUluaXR9KVxufVxuXG5mdW5jdGlvbiBkZWNvZGUoYm9keSkge1xuICB2YXIgZm9ybSA9IG5ldyBGb3JtRGF0YSgpXG4gIGJvZHlcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KCcmJylcbiAgICAuZm9yRWFjaChmdW5jdGlvbihieXRlcykge1xuICAgICAgaWYgKGJ5dGVzKSB7XG4gICAgICAgIHZhciBzcGxpdCA9IGJ5dGVzLnNwbGl0KCc9JylcbiAgICAgICAgdmFyIG5hbWUgPSBzcGxpdC5zaGlmdCgpLnJlcGxhY2UoL1xcKy9nLCAnICcpXG4gICAgICAgIHZhciB2YWx1ZSA9IHNwbGl0LmpvaW4oJz0nKS5yZXBsYWNlKC9cXCsvZywgJyAnKVxuICAgICAgICBmb3JtLmFwcGVuZChkZWNvZGVVUklDb21wb25lbnQobmFtZSksIGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpXG4gICAgICB9XG4gICAgfSlcbiAgcmV0dXJuIGZvcm1cbn1cblxuZnVuY3Rpb24gcGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpIHtcbiAgdmFyIGhlYWRlcnMgPSBuZXcgSGVhZGVycygpXG4gIC8vIFJlcGxhY2UgaW5zdGFuY2VzIG9mIFxcclxcbiBhbmQgXFxuIGZvbGxvd2VkIGJ5IGF0IGxlYXN0IG9uZSBzcGFjZSBvciBob3Jpem9udGFsIHRhYiB3aXRoIGEgc3BhY2VcbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjJcbiAgdmFyIHByZVByb2Nlc3NlZEhlYWRlcnMgPSByYXdIZWFkZXJzLnJlcGxhY2UoL1xccj9cXG5bXFx0IF0rL2csICcgJylcbiAgLy8gQXZvaWRpbmcgc3BsaXQgdmlhIHJlZ2V4IHRvIHdvcmsgYXJvdW5kIGEgY29tbW9uIElFMTEgYnVnIHdpdGggdGhlIGNvcmUtanMgMy42LjAgcmVnZXggcG9seWZpbGxcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dpdGh1Yi9mZXRjaC9pc3N1ZXMvNzQ4XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy83NTFcbiAgcHJlUHJvY2Vzc2VkSGVhZGVyc1xuICAgIC5zcGxpdCgnXFxyJylcbiAgICAubWFwKGZ1bmN0aW9uKGhlYWRlcikge1xuICAgICAgcmV0dXJuIGhlYWRlci5pbmRleE9mKCdcXG4nKSA9PT0gMCA/IGhlYWRlci5zdWJzdHIoMSwgaGVhZGVyLmxlbmd0aCkgOiBoZWFkZXJcbiAgICB9KVxuICAgIC5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgIHZhciBwYXJ0cyA9IGxpbmUuc3BsaXQoJzonKVxuICAgICAgdmFyIGtleSA9IHBhcnRzLnNoaWZ0KCkudHJpbSgpXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHBhcnRzLmpvaW4oJzonKS50cmltKClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBoZWFkZXJzLmFwcGVuZChrZXksIHZhbHVlKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybignUmVzcG9uc2UgJyArIGVycm9yLm1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICByZXR1cm4gaGVhZGVyc1xufVxuXG5Cb2R5LmNhbGwoUmVxdWVzdC5wcm90b3R5cGUpXG5cbmV4cG9ydCBmdW5jdGlvbiBSZXNwb25zZShib2R5SW5pdCwgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVzcG9uc2UpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGxlYXNlIHVzZSB0aGUgXCJuZXdcIiBvcGVyYXRvciwgdGhpcyBET00gb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi4nKVxuICB9XG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7fVxuICB9XG5cbiAgdGhpcy50eXBlID0gJ2RlZmF1bHQnXG4gIHRoaXMuc3RhdHVzID0gb3B0aW9ucy5zdGF0dXMgPT09IHVuZGVmaW5lZCA/IDIwMCA6IG9wdGlvbnMuc3RhdHVzXG4gIGlmICh0aGlzLnN0YXR1cyA8IDIwMCB8fCB0aGlzLnN0YXR1cyA+IDU5OSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRmFpbGVkIHRvIGNvbnN0cnVjdCAnUmVzcG9uc2UnOiBUaGUgc3RhdHVzIHByb3ZpZGVkICgwKSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMjAwLCA1OTldLlwiKVxuICB9XG4gIHRoaXMub2sgPSB0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCAzMDBcbiAgdGhpcy5zdGF0dXNUZXh0ID0gb3B0aW9ucy5zdGF0dXNUZXh0ID09PSB1bmRlZmluZWQgPyAnJyA6ICcnICsgb3B0aW9ucy5zdGF0dXNUZXh0XG4gIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycylcbiAgdGhpcy51cmwgPSBvcHRpb25zLnVybCB8fCAnJ1xuICB0aGlzLl9pbml0Qm9keShib2R5SW5pdClcbn1cblxuQm9keS5jYWxsKFJlc3BvbnNlLnByb3RvdHlwZSlcblxuUmVzcG9uc2UucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5fYm9keUluaXQsIHtcbiAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgIHN0YXR1c1RleHQ6IHRoaXMuc3RhdHVzVGV4dCxcbiAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh0aGlzLmhlYWRlcnMpLFxuICAgIHVybDogdGhpcy51cmxcbiAgfSlcbn1cblxuUmVzcG9uc2UuZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKG51bGwsIHtzdGF0dXM6IDIwMCwgc3RhdHVzVGV4dDogJyd9KVxuICByZXNwb25zZS5zdGF0dXMgPSAwXG4gIHJlc3BvbnNlLnR5cGUgPSAnZXJyb3InXG4gIHJldHVybiByZXNwb25zZVxufVxuXG52YXIgcmVkaXJlY3RTdGF0dXNlcyA9IFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF1cblxuUmVzcG9uc2UucmVkaXJlY3QgPSBmdW5jdGlvbih1cmwsIHN0YXR1cykge1xuICBpZiAocmVkaXJlY3RTdGF0dXNlcy5pbmRleE9mKHN0YXR1cykgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgc3RhdHVzIGNvZGUnKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IHtsb2NhdGlvbjogdXJsfX0pXG59XG5cbmV4cG9ydCB2YXIgRE9NRXhjZXB0aW9uID0gZy5ET01FeGNlcHRpb25cbnRyeSB7XG4gIG5ldyBET01FeGNlcHRpb24oKVxufSBjYXRjaCAoZXJyKSB7XG4gIERPTUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UsIG5hbWUpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlXG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHZhciBlcnJvciA9IEVycm9yKG1lc3NhZ2UpXG4gICAgdGhpcy5zdGFjayA9IGVycm9yLnN0YWNrXG4gIH1cbiAgRE9NRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKVxuICBET01FeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRE9NRXhjZXB0aW9uXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaChpbnB1dCwgaW5pdCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgaW5pdClcblxuICAgIGlmIChyZXF1ZXN0LnNpZ25hbCAmJiByZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICByZXR1cm4gcmVqZWN0KG5ldyBET01FeGNlcHRpb24oJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpKVxuICAgIH1cblxuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuXG4gICAgZnVuY3Rpb24gYWJvcnRYaHIoKSB7XG4gICAgICB4aHIuYWJvcnQoKVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBzdGF0dXNUZXh0OiB4aHIuc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogcGFyc2VIZWFkZXJzKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSB8fCAnJylcbiAgICAgIH1cbiAgICAgIC8vIFRoaXMgY2hlY2sgaWYgc3BlY2lmaWNhbGx5IGZvciB3aGVuIGEgdXNlciBmZXRjaGVzIGEgZmlsZSBsb2NhbGx5IGZyb20gdGhlIGZpbGUgc3lzdGVtXG4gICAgICAvLyBPbmx5IGlmIHRoZSBzdGF0dXMgaXMgb3V0IG9mIGEgbm9ybWFsIHJhbmdlXG4gICAgICBpZiAocmVxdWVzdC51cmwuc3RhcnRzV2l0aCgnZmlsZTovLycpICYmICh4aHIuc3RhdHVzIDwgMjAwIHx8IHhoci5zdGF0dXMgPiA1OTkpKSB7XG4gICAgICAgIG9wdGlvbnMuc3RhdHVzID0gMjAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucy5zdGF0dXMgPSB4aHIuc3RhdHVzO1xuICAgICAgfVxuICAgICAgb3B0aW9ucy51cmwgPSAncmVzcG9uc2VVUkwnIGluIHhociA/IHhoci5yZXNwb25zZVVSTCA6IG9wdGlvbnMuaGVhZGVycy5nZXQoJ1gtUmVxdWVzdC1VUkwnKVxuICAgICAgdmFyIGJvZHkgPSAncmVzcG9uc2UnIGluIHhociA/IHhoci5yZXNwb25zZSA6IHhoci5yZXNwb25zZVRleHRcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKGJvZHksIG9wdGlvbnMpKVxuICAgICAgfSwgMClcbiAgICB9XG5cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQnKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCB0aW1lZCBvdXQnKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChuZXcgRE9NRXhjZXB0aW9uKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZml4VXJsKHVybCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVybCA9PT0gJycgJiYgZy5sb2NhdGlvbi5ocmVmID8gZy5sb2NhdGlvbi5ocmVmIDogdXJsXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB1cmxcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub3BlbihyZXF1ZXN0Lm1ldGhvZCwgZml4VXJsKHJlcXVlc3QudXJsKSwgdHJ1ZSlcblxuICAgIGlmIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnaW5jbHVkZScpIHtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnb21pdCcpIHtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmICgncmVzcG9uc2VUeXBlJyBpbiB4aHIpIHtcbiAgICAgIGlmIChzdXBwb3J0LmJsb2IpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdibG9iJ1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgc3VwcG9ydC5hcnJheUJ1ZmZlclxuICAgICAgKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGluaXQgJiYgdHlwZW9mIGluaXQuaGVhZGVycyA9PT0gJ29iamVjdCcgJiYgIShpbml0LmhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzIHx8IChnLkhlYWRlcnMgJiYgaW5pdC5oZWFkZXJzIGluc3RhbmNlb2YgZy5IZWFkZXJzKSkpIHtcbiAgICAgIHZhciBuYW1lcyA9IFtdO1xuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaW5pdC5oZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgbmFtZXMucHVzaChub3JtYWxpemVOYW1lKG5hbWUpKVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCBub3JtYWxpemVWYWx1ZShpbml0LmhlYWRlcnNbbmFtZV0pKVxuICAgICAgfSlcbiAgICAgIHJlcXVlc3QuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGlmIChuYW1lcy5pbmRleE9mKG5hbWUpID09PSAtMSkge1xuICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXF1ZXN0LmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCB2YWx1ZSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3Quc2lnbmFsKSB7XG4gICAgICByZXF1ZXN0LnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0WGhyKVxuXG4gICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIERPTkUgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSlcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgcmVxdWVzdC5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydFhocilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5zZW5kKHR5cGVvZiByZXF1ZXN0Ll9ib2R5SW5pdCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogcmVxdWVzdC5fYm9keUluaXQpXG4gIH0pXG59XG5cbmZldGNoLnBvbHlmaWxsID0gdHJ1ZVxuXG5pZiAoIWcuZmV0Y2gpIHtcbiAgZy5mZXRjaCA9IGZldGNoXG4gIGcuSGVhZGVycyA9IEhlYWRlcnNcbiAgZy5SZXF1ZXN0ID0gUmVxdWVzdFxuICBnLlJlc3BvbnNlID0gUmVzcG9uc2Vcbn1cbiIsImltcG9ydCB7RGFzaFJlbmRlcmVyfSBmcm9tICcuL0Rhc2hSZW5kZXJlcic7XG5cbi8vIG1ha2UgRGFzaFJlbmRlcmVyIGdsb2JhbGx5IGF2YWlsYWJsZVxud2luZG93LkRhc2hSZW5kZXJlciA9IERhc2hSZW5kZXJlcjtcbiJdLCJuYW1lcyI6WyJfcmVnZW5lcmF0b3JSdW50aW1lIiwiZSIsInQiLCJyIiwiT2JqZWN0IiwicHJvdG90eXBlIiwibiIsImhhc093blByb3BlcnR5IiwibyIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJpIiwiU3ltYm9sIiwiYSIsIml0ZXJhdG9yIiwiYyIsImFzeW5jSXRlcmF0b3IiLCJ1IiwidG9TdHJpbmdUYWciLCJkZWZpbmUiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJ3cmFwIiwiR2VuZXJhdG9yIiwiY3JlYXRlIiwiQ29udGV4dCIsIm1ha2VJbnZva2VNZXRob2QiLCJ0cnlDYXRjaCIsInR5cGUiLCJhcmciLCJjYWxsIiwiaCIsImwiLCJmIiwicyIsInkiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwicCIsImQiLCJnZXRQcm90b3R5cGVPZiIsInYiLCJ2YWx1ZXMiLCJnIiwiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwiZm9yRWFjaCIsIl9pbnZva2UiLCJBc3luY0l0ZXJhdG9yIiwiaW52b2tlIiwicmVzb2x2ZSIsIl9fYXdhaXQiLCJ0aGVuIiwiY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmciLCJFcnJvciIsImRvbmUiLCJtZXRob2QiLCJkZWxlZ2F0ZSIsIm1heWJlSW52b2tlRGVsZWdhdGUiLCJzZW50IiwiX3NlbnQiLCJkaXNwYXRjaEV4Y2VwdGlvbiIsImFicnVwdCIsInJldHVybiIsIlR5cGVFcnJvciIsInJlc3VsdE5hbWUiLCJuZXh0IiwibmV4dExvYyIsInB1c2hUcnlFbnRyeSIsInRyeUxvYyIsImNhdGNoTG9jIiwiZmluYWxseUxvYyIsImFmdGVyTG9jIiwidHJ5RW50cmllcyIsInB1c2giLCJyZXNldFRyeUVudHJ5IiwiY29tcGxldGlvbiIsInJlc2V0IiwiaXNOYU4iLCJsZW5ndGgiLCJkaXNwbGF5TmFtZSIsImlzR2VuZXJhdG9yRnVuY3Rpb24iLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJtYXJrIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJhd3JhcCIsImFzeW5jIiwiUHJvbWlzZSIsImtleXMiLCJyZXZlcnNlIiwicG9wIiwicHJldiIsImNoYXJBdCIsInNsaWNlIiwic3RvcCIsInJ2YWwiLCJoYW5kbGUiLCJjb21wbGV0ZSIsImZpbmlzaCIsImNhdGNoIiwiX2NhdGNoIiwiZGVsZWdhdGVZaWVsZCIsImFzeW5jR2VuZXJhdG9yU3RlcCIsImdlbiIsInJlamVjdCIsIl9uZXh0IiwiX3Rocm93Iiwia2V5IiwiaW5mbyIsImVycm9yIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJmbiIsInNlbGYiLCJhcmdzIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJlcnIiLCJ1bmRlZmluZWQiLCJfc2xpY2VkVG9BcnJheSIsImFyciIsIl9hcnJheVdpdGhIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXlMaW1pdCIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVJlc3QiLCJtaW5MZW4iLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwiQXJyYXkiLCJmcm9tIiwidGVzdCIsImxlbiIsImFycjIiLCJpc0FycmF5IiwiYmF0Y2giLCJjb25uZWN0IiwiaW5jbHVkZXMiLCJpc0VtcHR5IiwiUmVhY3QiLCJ1c2VFZmZlY3QiLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsImNyZWF0ZUNvbnRleHQiLCJQcm9wVHlwZXMiLCJUcmVlQ29udGFpbmVyIiwiR2xvYmFsRXJyb3JDb250YWluZXIiLCJkaXNwYXRjaEVycm9yIiwiaHlkcmF0ZUluaXRpYWxPdXRwdXRzIiwib25FcnJvciIsInNldEdyYXBocyIsInNldFBhdGhzIiwic2V0TGF5b3V0IiwiY29tcHV0ZVBhdGhzIiwiY29tcHV0ZUdyYXBocyIsImFwaVRodW5rIiwiRXZlbnRFbWl0dGVyIiwiYXBwbHlQZXJzaXN0ZW5jZSIsImdldEFwcFN0YXRlIiwiU1RBVFVTIiwiZ2V0TG9hZGluZ1N0YXRlIiwiZ2V0TG9hZGluZ0hhc2giLCJ3YWl0IiwiRGFzaENvbnRleHQiLCJVbmNvbm5lY3RlZENvbnRhaW5lciIsInByb3BzIiwiYXBwTGlmZWN5Y2xlIiwiY29uZmlnIiwiZGVwZW5kZW5jaWVzUmVxdWVzdCIsImxheW91dFJlcXVlc3QiLCJsYXlvdXQiLCJsb2FkaW5nTWFwIiwiX3VzZVN0YXRlIiwiX3VzZVN0YXRlMiIsImVycm9yTG9hZGluZyIsInNldEVycm9yTG9hZGluZyIsImV2ZW50cyIsImN1cnJlbnQiLCJyZW5kZXJlZFRyZWUiLCJwcm9wc1JlZiIsInByb3ZpZGVyIiwiX2Rhc2hwcml2YXRlX2NvbmZpZyIsIl9kYXNocHJpdmF0ZV9kaXNwYXRjaCIsImRpc3BhdGNoIiwiX2Rhc2hwcml2YXRlX2dyYXBocyIsImdyYXBocyIsIl9kYXNocHJpdmF0ZV9sb2FkaW5nTWFwIiwic3RvcmVFZmZlY3QiLCJiaW5kIiwiX2NhbGxlZSIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJlbWl0Iiwic2VydmVfbG9jYWxseSIsIndpbmRvdyIsIl9kYXNoUGxvdGx5SlNVUkwiLCJjb25jYXQiLCJyZXF1ZXN0c19wYXRobmFtZV9wcmVmaXgiLCJwbG90bHlqc191cmwiLCJjb250ZW50Iiwic3RhdHVzIiwiT0siLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwiUHJvdmlkZXIiLCJfZGFzaHByaXZhdGVfZXJyb3IiLCJfZGFzaHByaXZhdGVfbGF5b3V0IiwiX2Rhc2hwcml2YXRlX2xvYWRpbmdTdGF0ZSIsIl9kYXNocHJpdmF0ZV9sb2FkaW5nU3RhdGVIYXNoIiwiX2Rhc2hwcml2YXRlX3BhdGgiLCJKU09OIiwic3RyaW5naWZ5IiwidWkiLCJob29rcyIsImxheW91dF9wcmUiLCJsYXlvdXRfcG9zdCIsImZpbmFsTGF5b3V0IiwiaGFzRXJyb3IiLCJmcm9udEVuZCIsImJhY2tFbmQiLCJwcm9wVHlwZXMiLCJvbmVPZiIsImZ1bmMiLCJvYmplY3QiLCJhbnkiLCJoaXN0b3J5IiwiQ29udGFpbmVyIiwic3RhdGUiLCJBUElDb250cm9sbGVyIiwiTG9hZGluZyIsIlRvb2xiYXIiLCJSZWxvYWRlciIsImdldENvbmZpZ0Zyb21ET00iLCJzZXRIb29rcyIsInNldENvbmZpZyIsIm1lbW9pemVXaXRoIiwiaWRlbnRpdHkiLCJVbmNvbm5lY3RlZEFwcENvbnRhaW5lciIsIl9SZWFjdCRDb21wb25lbnQiLCJfaW5oZXJpdHMiLCJfc3VwZXIiLCJfY3JlYXRlU3VwZXIiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjayIsInJlcXVlc3RfcHJlIiwicmVxdWVzdF9wb3N0IiwiY2FsbGJhY2tfcmVzb2x2ZWQiLCJyZXF1ZXN0X3JlZnJlc2hfand0IiwiX29iamVjdFNwcmVhZCIsIl9jcmVhdGVDbGFzcyIsIlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQiLCJmZXRjaCIsImNyZWRlbnRpYWxzIiwiaGVhZGVycyIsIkFjY2VwdCIsInJlbmRlciIsInNob3dfdW5kb19yZWRvIiwiRnJhZ21lbnQiLCJDb21wb25lbnQiLCJBcHBDb250YWluZXIiLCJTdG9yZSIsIkFwcFByb3ZpZGVyIiwiX3JlZiIsInN0b3JlIiwic2hhcGUiLCJkZWZhdWx0UHJvcHMiLCJSZWFjdERPTSIsIkRhc2hSZW5kZXJlciIsImNvbnRhaW5lciIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJjcmVhdGVSb290Iiwicm9vdCIsImZpbHRlciIsIm1hcCIsInBhdGgiLCJTdG9yZU9ic2VydmVyIiwiX2RlZmluZVByb3BlcnR5Iiwib2JzZXJ2ZXIiLCJpbnB1dHMiLCJhZGQiLCJyZW1vdmUiLCJfX2ZpbmFsaXplX18iLCJfX2luaXRfXyIsIl90aGlzJF91bnN1YnNjcmliZSIsIl91bnN1YnNjcmliZSIsIl9zdG9yZSIsInN1YnNjcmliZSIsIm5vdGlmeSIsIl9vYnNlcnZlcnMiLCJsYXN0U3RhdGUiLCJpbnB1dFBhdGhzIiwic3BsaXQiLCJ0cmlnZ2VyZWQiLCJnZXRTdGF0ZSIsInNwbGljZSIsImZpbmRJbmRleCIsImRlZmF1bHQiLCJtZW1vIiwidXNlQ29udGV4dCIsIlJlZ2lzdHJ5IiwicHJvcFR5cGVFcnJvckhhbmRsZXIiLCJhZGRJbmRleCIsImFzc29jIiwiYXNzb2NQYXRoIiwiZGlzc29jIiwiZXF1YWxzIiwiaXNOaWwiLCJoYXMiLCJtYXBPYmpJbmRleGVkIiwibWVyZ2VSaWdodCIsInBpY2siLCJwaWNrQnkiLCJwcm9wT3IiLCJycGF0aCIsInBhdGhPciIsIm5vdGlmeU9ic2VydmVycyIsInVwZGF0ZVByb3BzIiwiaXNTaW1wbGVDb21wb25lbnQiLCJyZWNvcmRVaUVkaXQiLCJDb21wb25lbnRFcnJvckJvdW5kYXJ5IiwiY2hlY2tQcm9wVHlwZXMiLCJnZXRXYXRjaGVkS2V5cyIsInN0cmluZ2lmeUlkIiwidmFsaWRhdGVDb21wb25lbnQiLCJOT1RfTE9BRElORyIsImlzX2xvYWRpbmciLCJDaGVja2VkQ29tcG9uZW50IiwiZWxlbWVudCIsImV4dHJhUHJvcHMiLCJjaGlsZHJlbiIsImVycm9yTWVzc2FnZSIsImlkIiwic3RyaW5nIiwiYWxsUHJvcHMiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJpc0RyeUNvbXBvbmVudCIsIm9iaiIsIkRhc2hXcmFwcGVyIiwiY29udGV4dCIsIkJhc2VUcmVlQ29udGFpbmVyIiwiX2V4dGVuZHMiLCJwYXJzZSIsIl9Db21wb25lbnQiLCJzZXRQcm9wcyIsIl9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQiLCJjcmVhdGVDb250YWluZXIiLCJjb21wb25lbnQiLCJuZXdQcm9wcyIsIl90aGlzJHByb3BzIiwib2xkUHJvcHMiLCJnZXRMYXlvdXRQcm9wcyIsImNoYW5nZWRQcm9wcyIsInZhbCIsIl9nZXRTdGF0ZSIsIndhdGNoZWRLZXlzIiwiaXRlbXBhdGgiLCJnZXRDaGlsZHJlbiIsImNvbXBvbmVudHMiLCJfdGhpczIiLCJ3cmFwQ2hpbGRyZW5Qcm9wIiwibm9kZSIsImNoaWxkcmVuUHJvcCIsIl90aGlzMyIsImdldENvbXBvbmVudCIsImxvYWRpbmdfc3RhdGUiLCJfdGhpczQiLCJfdGhpcyRwcm9wczIiLCJjaGlsZHJlblByb3BzIiwibmFtZXNwYWNlIiwiX2xvb3AiLCJoYW5kbGVPYmplY3QiLCJvcGF0aCIsImsiLCJub2RlVmFsdWUiLCJmcm9udFBhdGgiLCJiYWNrUGF0aCIsImZvdW5kIiwiaGFzT2JqZWN0IiwicmVwbGFjZSIsImZpcnN0Tm9kZSIsImVsZW1lbnRQYXRoIiwibGlzdFZhbHVlIiwiZnJvbnQiLCJkeW5hbWljIiwiaGFzQmFjayIsImoiLCJjdXIiLCJkeW5WYWx1ZSIsImFQYXRoIiwiX3JldCIsImNvbXBvbmVudFR5cGUiLCJjb21wb25lbnRJZCIsInByb3BzX2NoZWNrIiwiX3RoaXMkcHJvcHMzIiwibGF5b3V0UHJvcHMiLCJvbmVPZlR5cGUiLCJib29sIiwiYXJyYXkiLCJtZXJnZURlZXBSaWdodCIsIm9uY2UiLCJnZXRDU1JGSGVhZGVyIiwiaGFuZGxlQXN5bmNFcnJvciIsImFkZEh0dHBIZWFkZXJzIiwidXJsQmFzZSIsIk1BWF9BVVRIX1JFVFJJRVMiLCJKV1RfRVhQSVJFRF9NRVNTQUdFIiwibG9nV2FybmluZ09uY2UiLCJjb25zb2xlIiwid2FybiIsIkdFVCIsImZldGNoQ29uZmlnIiwiUE9TVCIsImJvZHkiLCJyZXF1ZXN0IiwiZW5kcG9pbnQiLCJuZXdIZWFkZXJzIiwidXJsIiwic2V0Q29ubmVjdGlvblN0YXR1cyIsInJlcyIsInJldHJ5IiwiX2JvZHkiLCJuZXdKd3QiLCJjb250ZW50VHlwZSIsIm1lc3NhZ2UiLCJfc2V0Q29ubmVjdGlvblN0YXR1cyIsImNvbm5lY3RlZCIsImJhY2tFbmRDb25uZWN0ZWQiLCJwYXlsb2FkIiwidDAiLCJsb2ciLCJVTkFVVEhPUklaRUQiLCJCQURfUkVRVUVTVCIsInRleHQiLCJBdXRob3JpemF0aW9uIiwic3Vic3RyIiwiZ2V0IiwiaW5kZXhPZiIsImpzb24iLCJ0MSIsIl94IiwiX3gyIiwib3duS2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX3RvUHJvcGVydHlLZXkiLCJfdG9QcmltaXRpdmUiLCJTdHJpbmciLCJpbnB1dCIsImhpbnQiLCJwcmltIiwidG9QcmltaXRpdmUiLCJOdW1iZXIiLCJfYXJyYXlXaXRob3V0SG9sZXMiLCJfaXRlcmFibGVUb0FycmF5IiwiX25vbkl0ZXJhYmxlU3ByZWFkIiwiaXRlciIsImZsYXR0ZW4iLCJpbnRlcnNlY3Rpb24iLCJwbHVjayIsInRvUGFpcnMiLCJ6aXAiLCJDYWxsYmFja0FjdGlvblR5cGUiLCJDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGUiLCJpc011bHRpVmFsdWVkIiwiaXNNdWx0aU91dHB1dFByb3AiLCJjcmVhdGVBY3Rpb24iLCJoYW5kbGVQYXRjaCIsImlzUGF0Y2giLCJnZXRQYXRoIiwicmVxdWVzdERlcGVuZGVuY2llcyIsImFkZEJsb2NrZWRDYWxsYmFja3MiLCJBZGRCbG9ja2VkIiwiYWRkQ29tcGxldGVkQ2FsbGJhY2tzIiwiQWRkQ29tcGxldGVkIiwiYWRkRXhlY3V0ZWRDYWxsYmFja3MiLCJBZGRFeGVjdXRlZCIsImFkZEV4ZWN1dGluZ0NhbGxiYWNrcyIsIkFkZEV4ZWN1dGluZyIsImFkZFByaW9yaXRpemVkQ2FsbGJhY2tzIiwiQWRkUHJpb3JpdGl6ZWQiLCJhZGRSZXF1ZXN0ZWRDYWxsYmFja3MiLCJBZGRSZXF1ZXN0ZWQiLCJhZGRTdG9yZWRDYWxsYmFja3MiLCJBZGRTdG9yZWQiLCJhZGRXYXRjaGVkQ2FsbGJhY2tzIiwiQWRkV2F0Y2hlZCIsInJlbW92ZUV4ZWN1dGVkQ2FsbGJhY2tzIiwiUmVtb3ZlRXhlY3V0ZWQiLCJyZW1vdmVCbG9ja2VkQ2FsbGJhY2tzIiwiUmVtb3ZlQmxvY2tlZCIsInJlbW92ZUV4ZWN1dGluZ0NhbGxiYWNrcyIsIlJlbW92ZUV4ZWN1dGluZyIsInJlbW92ZVByaW9yaXRpemVkQ2FsbGJhY2tzIiwiUmVtb3ZlUHJpb3JpdGl6ZWQiLCJyZW1vdmVSZXF1ZXN0ZWRDYWxsYmFja3MiLCJSZW1vdmVSZXF1ZXN0ZWQiLCJyZW1vdmVTdG9yZWRDYWxsYmFja3MiLCJSZW1vdmVTdG9yZWQiLCJyZW1vdmVXYXRjaGVkQ2FsbGJhY2tzIiwiUmVtb3ZlV2F0Y2hlZCIsImFnZ3JlZ2F0ZUNhbGxiYWNrcyIsIkFnZ3JlZ2F0ZSIsInVwZGF0ZVJlc291cmNlVXNhZ2UiLCJhZGRDYWxsYmFja0pvYiIsInJlbW92ZUNhbGxiYWNrSm9iIiwic2V0Q2FsbGJhY2tKb2JPdXRkYXRlZCIsInVud3JhcElmTm90TXVsdGkiLCJwYXRocyIsImlkUHJvcHMiLCJzcGVjIiwiYW55VmFscyIsImRlcFR5cGUiLCJtc2ciLCJpc1N0ciIsInByb3BlcnR5Iiwic3RycyIsImpvaW4iLCJmaWxsVmFscyIsImNiIiwic3BlY3MiLCJhbGxvd0FsbE1pc3NpbmciLCJnZXR0ZXIiLCJnZXRJbnB1dHMiLCJlcnJvcnMiLCJlbXB0eU11bHRpVmFsdWVzIiwiaW5wdXRWYWxzIiwiaW5wdXRMaXN0IiwiX3Vud3JhcElmTm90TXVsdGkiLCJwYXRoXyIsIl91bndyYXBJZk5vdE11bHRpMiIsImlucHV0RXJyb3IiLCJyZWZFcnIiLCJvYmpzIiwiUmVmZXJlbmNlRXJyb3IiLCJnZXRWYWxzIiwiemlwSWZBcnJheSIsImIiLCJjbGVhbk91dHB1dFByb3AiLCJoYW5kbGVDbGllbnRzaWRlIiwiX3gzIiwiX3g0IiwiX2hhbmRsZUNsaWVudHNpZGUiLCJfY2FsbGVlMiIsImNsaWVudHNpZGVfZnVuY3Rpb24iLCJkYyIsIm91dHB1dHMiLCJyZXF1ZXN0VGltZSIsImlucHV0RGljdCIsInN0YXRlRGljdCIsInJlc3VsdCIsIl9kYyRuYW1lc3BhY2UiLCJfcmV0dXJuVmFsdWUiLCJmdW5jdGlvbl9uYW1lIiwicmV0dXJuVmFsdWUiLCJ0b3RhbFRpbWUiLCJyZXNvdXJjZXMiLCJfY2FsbGVlMiQiLCJfY29udGV4dDMiLCJkYXNoX2NsaWVudHNpZGUiLCJub191cGRhdGUiLCJkZXNjcmlwdGlvbiIsIkRhdGUiLCJub3ciLCJpbnB1dHNUb0RpY3QiLCJjYWxsYmFja19jb250ZXh0IiwiY2hhbmdlZFByb3BJZHMiLCJwcm9wX2lkIiwiaW5wdXRzX2xpc3QiLCJzdGF0ZXNfbGlzdCIsInN0YXRlcyIsIl9yZWYxMCIsIl9yZWYxMSIsIm91dGkiLCJyZXRpIiwiX3JlZjEyIiwiX3JlZjEzIiwib3V0aWoiLCJyZXRpaiIsImlkU3RyIiwiZGF0YUZvcklkIiwiUHJldmVudFVwZGF0ZSIsIlBSRVZFTlRfVVBEQVRFIiwiQ0xJRU5UU0lERV9FUlJPUiIsIl9fZGFzaF9zZXJ2ZXIiLCJfX2Rhc2hfY2xpZW50IiwiX19kYXNoX3VwbG9hZCIsIl9fZGFzaF9kb3dubG9hZCIsIm91dHB1dCIsInVzYWdlIiwic2lkZVVwZGF0ZSIsIl9yZWYyIiwiX3JlZjMiLCJfaWQkc3BsaXQiLCJfaWQkc3BsaXQyIiwicHJvcE5hbWUiLCJjb21wb25lbnRQYXRoIiwiaGFuZGxlU2VydmVyc2lkZSIsImxvbmciLCJhZGRpdGlvbmFsQXJncyIsImNhY2hlS2V5Iiwiam9iIiwicnVubmluZ09mZiIsInByb2dyZXNzRGVmYXVsdCIsIm1vcmVBcmdzIiwiZmV0Y2hDYWxsYmFjayIsImFkZEFyZyIsImRlbGltIiwiX3JlZjQiLCJfcmVmNSIsIl9yZWY2IiwiX3JlZjciLCJfIiwiX18iLCJzaW5nbGUiLCJoYW5kbGVPdXRwdXQiLCJjYWxsYmFja0pvYiIsImNhbGxiYWNrSm9icyIsIm91dGRhdGVkIiwiam9iSWQiLCJyZWNvcmRQcm9maWxlIiwidGltaW5nSGVhZGVycyIsImhlYWRlciIsImR1ciIsIm1hdGNoIiwiZmluaXNoTGluZSIsImRhdGEiLCJtdWx0aSIsInJlc3BvbnNlIiwibGFzdEluZGV4T2YiLCJjb21wbGV0ZUpvYiIsImpvYkluZm8iLCJjYW5jZWxJbnB1dHMiLCJjYW5jZWwiLCJwcm9ncmVzcyIsInJ1bm5pbmciLCJzZXRUaW1lb3V0IiwiaW50ZXJ2YWwiLCJoYW5kbGVFcnJvciIsIk5PX1JFU1BPTlNFIiwiaW5wdXRzaSIsImlpIiwiX2lucHV0c2kkaWkkdmFsdWUiLCJpZF9zdHIiLCJfaW5wdXRzX2xpc3QkaSR2YWx1ZSIsImV4ZWN1dGVDYWxsYmFjayIsIl9yZWY4IiwiYWxsT3V0cHV0cyIsIl9jYiRjYWxsYmFjayIsImNhbGxiYWNrIiwiZHluYW1pY19jcmVhdG9yIiwiZm9yY2Vfbm9fb3V0cHV0IiwiaW5WYWxzIiwiZXhlY3V0aW9uUHJvbWlzZSIsIm91dHB1dEVycm9ycyIsIm91dCIsIl91bndyYXBJZk5vdE11bHRpMyIsIl91bndyYXBJZk5vdE11bHRpNCIsImVycmkiLCJfX2V4ZWN1dGUiLCJfcmVmOSIsIm5ld0NvbmZpZyIsImxhc3RFcnJvciIsIl9jb250ZXh0MiIsImludGVyIiwiX2RhdGEiLCJjdXJyZW50TGF5b3V0Iiwib2xkSnd0IiwiX2xvb3AkIiwib3V0cHV0UGF0aCIsInByZXZpb3VzVmFsdWUiLCJkYXRhUGF0aCIsIm91dHB1dFZhbHVlIiwidDIiLCJuZXdDYiIsImFjdGlvbkxpc3QiLCJPTl9QUk9QX0NIQU5HRSIsIlNFVF9SRVFVRVNUX1FVRVVFIiwiU0VUX0dSQVBIUyIsIlNFVF9QQVRIUyIsIlNFVF9MQVlPVVQiLCJTRVRfQVBQX0xJRkVDWUNMRSIsIlNFVF9DT05GSUciLCJBRERfSFRUUF9IRUFERVJTIiwiT05fRVJST1IiLCJTRVRfSE9PS1MiLCJnZXRBY3Rpb24iLCJhY3Rpb24iLCJEZXBHcmFwaCIsImlzTnVtZXJpYyIsImFsbCIsImFwIiwiZGlmZmVyZW5jZSIsImV2b2x2ZSIsImZvckVhY2hPYmpJbmRleGVkIiwic3RhcnRzV2l0aCIsInppcE9iaiIsImNvbWJpbmVJZEFuZFByb3AiLCJnZXRDYWxsYmFja3NCeUlucHV0IiwiZ2V0UHJpb3JpdHkiLCJJTkRJUkVDVCIsIm1lcmdlTWF4IiwibWFrZVJlc29sdmVkQ2FsbGJhY2siLCJyZXNvbHZlRGVwcyIsImNyYXdsTGF5b3V0IiwiaWRBbmRQcm9wIiwiQUxMIiwid2lsZCIsIk1BVENIIiwiQUxMU01BTExFUiIsImV4cGFuZCIsIndpbGRjYXJkcyIsImFsbG93ZWRXaWxkY2FyZHMiLCJPdXRwdXQiLCJJbnB1dCIsIlN0YXRlIiwid2lsZGNhcmRWYWxUeXBlcyIsImlkSW52YWxpZENoYXJzIiwiaXNXaWxkY2FyZElkIiwicGFyc2VXaWxkY2FyZElkIiwicGFyc2VNdWx0aXBsZU91dHB1dHMiLCJvdXRwdXRJZEFuZFByb3AiLCJzcGxpdElkQW5kUHJvcCIsImRvdFBvcyIsInBhcnNlSWZXaWxkY2FyZCIsInN0cmluZ2lmeVZhbCIsInBhcnRzIiwic29ydCIsImlkVmFsU29ydCIsImJJc051bWVyaWMiLCJhTiIsImJOIiwiYUlzQm9vbCIsInZhbEJlZm9yZSIsInZhbEFmdGVyIiwiYWRkTWFwIiwiZGVwTWFwIiwicHJvcCIsImRlcGVuZGVuY3kiLCJpZE1hcCIsImNhbGxiYWNrcyIsImFkZFBhdHRlcm4iLCJpZFNwZWMiLCJrZXlTdHIiLCJrZXlDYWxsYmFja3MiLCJwcm9wQ2FsbGJhY2tzIiwidmFsTWF0Y2giLCJ2YWxpZGF0ZURlcGVuZGVuY2llcyIsInBhcnNlZERlcGVuZGVuY2llcyIsIm91dFN0cnMiLCJvdXRPYmpzIiwiZGVwIiwiaGFzT3V0cHV0cyIsImhlYWQiLCJjbHMiLCJpZFByb3AiLCJ2YWxpZGF0ZUFyZyIsImZpbmREdXBsaWNhdGVPdXRwdXRzIiwiZmluZE1pc21hdGNoZWRXaWxkY2FyZHMiLCJpbnZhbGlkQ2hhcnMiLCJuZXdPdXRwdXRTdHJzIiwibmV3T3V0cHV0T2JqcyIsImlkT2JqIiwic2VsZk92ZXJsYXAiLCJ3aWxkY2FyZE92ZXJsYXAiLCJvdGhlck92ZXJsYXAiLCJpZFByb3AyIiwiY2hlY2tJbk91dE92ZXJsYXAiLCJvdXRJZCIsIm91dFByb3AiLCJzb21lIiwiaW5fIiwiaW5JZCIsImluUHJvcCIsIl9maW5kV2lsZGNhcmRLZXlzIiwiZmluZFdpbGRjYXJkS2V5cyIsIm91dDBNYXRjaEtleXMiLCJtYXRjaEtleXMiLCJfZmluZFdpbGRjYXJkS2V5czIiLCJhbGxzbWFsbGVyS2V5cyIsImFsbFdpbGRjYXJkS2V5cyIsImRpZmYiLCJtYXRjaFdpbGRLZXlzIiwiYVdpbGQiLCJiV2lsZCIsImlkS2V5cyIsImlkVmFscyIsIl9pdGVyYXRvciIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiX3N0ZXAiLCJpZDIiLCJwcm9wZXJ0eTIiLCJ2YWxpZGF0ZUNhbGxiYWNrc1RvTGF5b3V0Iiwic3RhdGVfIiwibGF5b3V0XyIsInBhdGhzXyIsInZhbGlkYXRlSWRzIiwic3VwcHJlc3NfY2FsbGJhY2tfZXhjZXB0aW9ucyIsInZhbGlkYXRpb25fbGF5b3V0Iiwib3V0cHV0TWFwIiwiaW5wdXRNYXAiLCJvdXRwdXRQYXR0ZXJucyIsImlucHV0UGF0dGVybnMiLCJ0YWlsIiwibWlzc2luZ0lkIiwidmFsaWRhdGVQcm9wIiwiaWRQYXRoIiwicmF3UHJvcCIsImxhc3QiLCJ2YWxpZGF0ZUlkUGF0dGVyblByb3AiLCJpZFJlc29sdmVkIiwiY2FsbGJhY2tJZHNDaGVja2VkRm9yU3RhdGUiLCJ2YWxpZGF0ZVN0YXRlIiwidmFsaWRhdGVNYXAiLCJkb1N0YXRlIiwidmFsaWRhdGVQYXR0ZXJucyIsInBhdHRlcm5zIiwia2V5UGF0dGVybnMiLCJkZXBlbmRlbmNpZXMiLCJtdWx0aUdyYXBoIiwid2lsZGNhcmRQbGFjZWhvbGRlcnMiLCJmaXhJZHMiLCJ3cmFwcGVkREUiLCJsaW5lcyIsImZpbmFsR3JhcGhzIiwiTXVsdGlHcmFwaCIsIml0ZW0iLCJleGFjdCIsImtleVBsYWNlaG9sZGVycyIsInZhbHMiLCJtYWtlQWxsSWRzIiwib3V0SWRGaW5hbCIsImlkTGlzdCIsInRlc3RWYWxzIiwib3V0VmFsSW5kZXgiLCJuZXdWYWxzIiwib3V0cHV0VGFnIiwiZHVwbGljYXRlT3V0cHV0cyIsImNiSW4iLCJjYk91dCIsImFkZElucHV0VG9NdWx0aSIsImluSWRQcm9wIiwib3V0SWRQcm9wIiwiZmlyc3RQYXNzIiwiYWRkTm9kZSIsImFkZERlcGVuZGVuY3kiLCJhZGRPdXRwdXRUb011bHRpIiwiaW5PYmoiLCJpbklkTGlzdCIsIl9maW5kV2lsZGNhcmRLZXlzMyIsImZpcnN0U2luZ2xlT3V0cHV0IiwiZmluYWxEZXBlbmRlbmN5IiwiYWxzb0lucHV0Iiwib3V0SWRMaXN0IiwidGVtcE91dElkUHJvcCIsIm91dElkTmFtZSIsImlucHV0T2JqZWN0IiwiZHVwZU91dElkUHJvcCIsIm9yaWdpbmFsTmFtZSIsIm5ld05hbWUiLCJjbnQiLCJpbk5hbWUiLCJvdXROYW1lIiwiaWRNYXRjaCIsInBhdHRlcm5WYWxzIiwicmVmS2V5cyIsInJlZlZhbHMiLCJyZWZQYXR0ZXJuVmFscyIsInBhdHRlcm5WYWwiLCJyZWZJbmRleCIsInJlZlBhdHRlcm5WYWwiLCJnZXRBbnlWYWxzIiwibWF0Y2hlcyIsImdldENhbGxiYWNrQnlPdXRwdXQiLCJhZGRSZXNvbHZlZEZyb21PdXRwdXRzIiwib3V0UGF0dGVybiIsIm91dHMiLCJvdXQwS2V5cyIsIm91dDBQYXR0ZXJuVmFscyIsImZvdW5kQ2JJZHMiLCJfcmVmMTQiLCJvdXRWYWxzIiwicmVzb2x2ZWQiLCJyZXNvbHZlZElkIiwiYWRkQWxsUmVzb2x2ZWRGcm9tT3V0cHV0cyIsInNpbmdsZU91dFBhdHRlcm4iLCJhbnlTZWVuIiwib3V0U2V0IiwibWF0Y2hTdHIiLCJnZXRPdXRwdXRzIiwibmV3UHJvcCIsInBhdHRlcm4iLCJnZXRVbmZpbHRlcmVkTGF5b3V0Q2FsbGJhY2tzIiwibGF5b3V0Q2h1bmsiLCJvcHRzIiwib3V0cHV0c09ubHkiLCJyZW1vdmVkQXJyYXlJbnB1dHNPbmx5IiwibmV3UGF0aHMiLCJjaHVua1BhdGgiLCJhZGRDYWxsYmFjayIsImZvdW5kSW5kZXgiLCJmb3VuZENiIiwiaW5pdGlhbENhbGwiLCJhZGRDYWxsYmFja0lmQXJyYXkiLCJpbmkiLCJpbmlqIiwiaGFuZGxlT25lSWQiLCJvdXRJZENhbGxiYWNrcyIsImluSWRDYWxsYmFja3MiLCJwcmV2ZW50X2luaXRpYWxfY2FsbCIsIm1heWJlQWRkQ2FsbGJhY2siLCJoYW5kbGVUaGlzQ2FsbGJhY2siLCJjaGlsZCIsInByaW9yaXR5IiwibWVyZ2VXaXRoIiwicGFydGl0aW9uIiwicmVkdWNlIiwiRElSRUNUIiwiTWF0aCIsIm1heCIsImNoYW5nZVR5cGUiLCJ3aXRoUHJpb3JpdHkiLCJfa2V5cyIsInRvdWNoZWRPdXRwdXRzIiwidG91Y2hlZENiSWRzIiwidG91Y2hlZCIsInVuc2hpZnQiLCJtaW4iLCJnZXRBbGxTdWJzZXF1ZW50T3V0cHV0c0ZvckNhbGxiYWNrIiwiZ2V0UmVhZHlDYWxsYmFja3MiLCJjYW5kaWRhdGVzIiwib3V0cHV0c01hcCIsImFsbFRvdWNoZWRPdXRwdXRzIiwiYXNzaWduIiwiY2JwIiwiZ2V0TGF5b3V0Q2FsbGJhY2tzIiwib3B0aW9ucyIsImV4Y2x1c2lvbnMiLCJfcGFydGl0aW9uIiwiX3BhcnRpdGlvbjIiLCJpbmNsdWRlZCIsImV4Y2x1ZGVkIiwiZmlsdGVyUm9vdCIsInJvb3RJZCIsInByZXZpb3VzIiwiZXhlY3V0aW9uR3JvdXAiLCJyYW5kb20iLCJnZXRVbmlxdWVJZGVudGlmaWVyIiwiX3JlZjYkY2FsbGJhY2siLCJpbmNsdWRlT2JzZXJ2ZXJzIiwicHJvcGVydGllcyIsInBydW5lQ2FsbGJhY2tzIiwiX3BhcnRpdGlvbjMiLCJfcGFydGl0aW9uNCIsInJlbW92ZWQiLCJfcGFydGl0aW9uNSIsIl9wYXJ0aXRpb242IiwibW9kaWZpZWQiLCJhZGRlZCIsInByb3BJZCIsImlkUGF0dGVybiIsImtleVBhdGhzIiwiY29va2llIiwic2V0QXBwTGlmZWN5Y2xlIiwic2V0UmVxdWVzdFF1ZXVlIiwiaHRtbCIsInRyaWdnZXJEZWZhdWx0U3RhdGUiLCJfY3NyZl90b2tlbiIsIm92ZXJhbGxPcmRlciIsInJlZG8iLCJtb3ZlSGlzdG9yeSIsInVuZG8iLCJyZXZlcnQiLCJfZ2V0U3RhdGUyIiwiZnV0dXJlIiwicGFzdCIsIl9nZXRTdGF0ZTMiLCJpc1JlYWR5IiwidGFyZ2V0cyIsInByb21pc2VzIiwicmVuZGVyZWQiLCJyZXNvbHZlUmVuZGVyZWQiLCJwYXRoT2ZJZCIsInRhcmdldCIsInJlYWR5IiwicmFjZSIsIklzTG9hZGluZ0FjdGlvblR5cGUiLCJzZXRJc0xvYWRpbmciLCJTZXQiLCJMb2FkaW5nTWFwQWN0aW9uVHlwZSIsInNldExvYWRpbmdNYXAiLCJhcHBlbmQiLCJkaXNzb2NQYXRoIiwiZW1wdHkiLCJpbnNlcnQiLCJpcyIsInByZXBlbmQiLCJnZXRMb2NhdGlvbkluZGV4IiwiZ2V0TG9jYXRpb25QYXRoIiwibG9jYXRpb24iLCJwYXRjaEhhbmRsZXJzIiwiQXNzaWduIiwicGF0Y2hPcGVyYXRpb24iLCJwYXJhbXMiLCJNZXJnZSIsIkV4dGVuZCIsIkRlbGV0ZSIsIkluc2VydCIsImluZGV4IiwiQXBwZW5kIiwiUHJlcGVuZCIsIkFkZCIsIlN1YiIsIk11bCIsIkRpdiIsIkNsZWFyIiwiUmV2ZXJzZSIsIlJlbW92ZSIsInBhdGNoVmFsdWUiLCJyZWR1Y2VkVmFsdWUiLCJvcGVyYXRpb25zIiwicGF0Y2giLCJoYW5kbGVyIiwib3BlcmF0aW9uIiwiZmluZCIsInByb3BFcSIsInN1YlRyZWUiLCJzdGFydGluZ1BhdGgiLCJvbGRQYXRocyIsIm9sZFN0cnMiLCJvbGRPYmpzIiwiZGlmZkhlYWQiLCJzcExlbiIsIm9sZFZhbFBhdGhzIiwib2xkS2V5cyIsIm9sZGllIiwicGF0aE9iaiIsImhhc1VybEJhc2UiLCJoYXNSZXFQcmVmaXgiLCJiYXNlIiwidXJsX2Jhc2VfcGF0aG5hbWUiLCJwcm9wc0NoaWxkcmVuIiwiY3VycmVudFBhdGgiLCJleHRyYVBhdGgiLCJvYmpPZiIsImJhY2siLCJjaGlsZE9iaiIsImNoaWxkUGF0aCIsIm5ld1BhdGgiLCJfX2Rhc2hwcml2YXRlX2NoaWxkcmVuUHJvcHMiLCJfY2hpbGRyZW5Qcm9wJHNwbGl0JG0iLCJfY2hpbGRyZW5Qcm9wJHNwbGl0JG0yIiwiYmFzZVBhdGgiLCJjdXJQYXRoIiwib1ZhbHVlIiwiX2V2Iiwib24iLCJldmVudCIsImxpc3RlbmVyIiwicmVtb3ZlTGlzdGVuZXIiLCJpZHgiLCJfbGVuIiwiX2tleSIsIl9sZW4yIiwiX2tleTIiLCJSZWFjdFByb3BUeXBlc1NlY3JldCIsInR5cGVTcGVjcyIsImNvbXBvbmVudE5hbWUiLCJnZXRTdGFjayIsInR5cGVTcGVjTmFtZSIsImV4Iiwic3RhY2siLCJpc0xvYWRpbmciLCJpc1JlcXVpcmVkIiwiY29tcGFyYXRvciIsImx0IiwiaG90X3JlbG9hZCIsIl9wcm9wcyRjb25maWckaG90X3JlbCIsIm1heF9yZXRyeSIsImRpc2FibGVkIiwiaW50ZXJ2YWxJZCIsInBhY2thZ2VzIiwiX3JldHJ5IiwiX2hlYWQiLCJxdWVyeVNlbGVjdG9yIiwiY2xlYXJJbnRlcnZhbCIsInNldFN0YXRlIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwicHJldlN0YXRlIiwicmVsb2FkUmVxdWVzdCIsImhhcmQiLCJ3YXNfY3NzIiwiZmlsZXMiLCJpc19jc3MiLCJub2Rlc1RvRGlzYWJsZSIsIml0IiwiZXZhbHVhdGUiLCJpdGVyYXRlTmV4dCIsInNldEF0dHJpYnV0ZSIsImxpbmsiLCJocmVmIiwicmVsIiwiYXBwZW5kQ2hpbGQiLCJyZWxvYWQiLCJhbGVydCIsImNvbXBvbmVudERpZE1vdW50IiwiX3RoaXMkc3RhdGUiLCJzZXRJbnRlcnZhbCIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzIiwibnVtYmVyIiwiVW5jb25uZWN0ZWRUb29sYmFyIiwidW5kb0xpbmsiLCJvbkNsaWNrIiwicmVkb0xpbmsiLCJ1c2VNZW1vIiwidXNlU2VsZWN0b3IiLCJDeXRvc2NhcGUiLCJDeXRvc2NhcGVDb21wb25lbnQiLCJkYWdyZSIsImZjb3NlIiwiSlNPTlRyZWUiLCJvbWl0Iiwic3R5bGVzaGVldCIsInVwZGF0ZVNlbGVjdGVkTm9kZSIsInVwZGF0ZUNoYW5nZWRQcm9wcyIsInVwZGF0ZUNhbGxiYWNrIiwidXNlIiwiZ2VuZXJhdGVFbGVtZW50cyIsInByb2ZpbGUiLCJleHRyYUxpbmtzIiwiY29uc3VtZWQiLCJlbGVtZW50cyIsInN0cnVjdHVyZSIsInJlY29yZE5vZGUiLCJyYXdQcm9wZXJ0eSIsImlkVHlwZSIsInBhcmVudElkIiwiY2hpbGRJZCIsImxhYmVsIiwicGFyZW50IiwicmVjb3JkRWRnZSIsInNvdXJjZSIsImNiUHJvZmlsZSIsImNvdW50IiwidGltZSIsInRvdGFsIiwibW9kZSIsInJvdW5kIiwibG9hZGluZ1NldCIsImVycm9yU2V0Iiwibm9kZUlkIiwiY2hpbGRJZHMiLCJjaGlsZEZyb20iLCJjaGlsZFRvIiwicmVkdWNlU3RhdHVzIiwibGF0ZXN0IiwiZmxhdHRlbk91dHB1dHMiLCJmbGF0dGVuSW5wdXRzIiwiaW5BcnJheSIsImZpbmFsIiwiaW5JdGVtIiwiY2xlYW5PdXRwdXRJZCIsIm91dHB1dElkIiwiYWdnIiwiY2JQcmVmaXhMZW4iLCJkYWdyZUxheW91dCIsInBhZGRpbmciLCJyYW5rZXIiLCJmb3JjZUxheW91dCIsImFuaW1hdGUiLCJsYXlvdXRzIiwic3BhY2luZ0ZhY3RvciIsIm5vZGVTZXAiLCJyYW5rU2VwIiwicmFua0RpciIsImZvcmNlIiwiQ2FsbGJhY2tHcmFwaCIsImNoYW5nZWQiLCJsaWZlY3ljbGVTdGF0ZSIsInNlbGVjdGVkIiwic2V0U2VsZWN0ZWQiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImN5dG9zY2FwZSIsInNldEN5dG9zY2FwZSIsImdyYXBoTGF5b3V0IiwiY2hvc2VuVHlwZSIsIl9jaG9zZW5UeXBlIiwibGF5b3V0U2VsZWN0b3IiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImxheW91dFR5cGUiLCJzZXRMYXlvdXRUeXBlIiwidXNlQ3l0b3NjYXBlRWZmZWN0IiwiZWZmZWN0IiwiY29uZGl0aW9uIiwiaGFzUGF0dGVybnMiLCJnZXRQcm9wVmFsdWUiLCJzZXRQcmVzZXRMYXlvdXQiLCJfbGF5b3V0U2VsZWN0b3IkY3VycmUiLCJjeSIsInBvc2l0aW9ucyIsIm5vZGVzIiwiZWFjaCIsInBvc2l0aW9uIiwiZml0Iiwiem9vbSIsInBhbiIsInVwZGF0ZWQiLCJlbGVtZW50TmFtZSIsImVsZW1lbnRJbmZvIiwiX2dldENvbXBvbmVudCIsInJlc3QiLCJjYWxsYmFja091dHB1dElkIiwibmV0d29yayIsImNvbXB1dGUiLCJhdmciLCJ0aW1pbmciLCJkb3dubG9hZCIsInVwbG9hZCIsImN5TGF5b3V0Iiwic3R5bGUiLCJ3aWR0aCIsImhlaWdodCIsInRoZW1lIiwibGFiZWxSZW5kZXJlciIsImdldEl0ZW1TdHJpbmciLCJpdGVtVHlwZSIsInNob3VsZEV4cGFuZE5vZGUiLCJrZXlOYW1lIiwibGV2ZWwiLCJvbkNoYW5nZSIsInJlZiIsIlVuY29ubmVjdGVkQ2FsbGJhY2tHcmFwaENvbnRhaW5lciIsImNvbXBvbmVudERpZENhdGNoIiwibXlJRCIsImdldERlcml2ZWRTdGF0ZUZyb21FcnJvciIsIkNhbGxiYWNrR3JhcGhDb250YWluZXIiLCJzZWxlY3RvciIsImRpc3BsYXkiLCJjb2xvciIsImdob3N0Iiwib3BhY2l0eSIsIlNUQVRVU01BUCIsImdldEVkZ2VUeXBlcyIsImNvbm5lY3RlZEVkZ2VzIiwiYXNjZW5kIiwiY29sbGVjdGlvbiIsImVkZ2VzIiwicGFyZW50cyIsInNvdXJjZXMiLCJtZXJnZSIsImFuY2VzdG9ycyIsImRlc2NlbmQiLCJhZGRDbGFzcyIsInN1YnRyZWUiLCJvdGhlciIsImFic29sdXRlQ29tcGxlbWVudCIsInJlbW92ZUNsYXNzIiwiZmxhc2hUaW1lIiwiZmxhc2hDbGFzcyIsImVkZ2VzVG8iLCJhdmdUaW1lIiwiaGFzQ2xhc3MiLCJ0aW1lTGVmdCIsIm9sZENoaWxkcmVuIiwicHJldkNoaWxkcmVuIiwiQ29sbGFwc2VJY29uIiwid2Vya3pldWdDc3MiLCJGcm9udEVuZEVycm9yIiwiY29sbGFwc2VkIiwiaXNMaXN0SXRlbSIsImluQWxlcnRzVHJheSIsImNhcmRDbGFzc2VzIiwiZXJyb3JIZWFkZXIiLCJ0aW1lc3RhbXAiLCJ0b0xvY2FsZVRpbWVTdHJpbmciLCJFcnJvckNvbnRlbnQiLCJNQVhfTUVTU0FHRV9MRU5HVEgiLCJVbmNvbm5lY3RlZEVycm9yQ29udGVudCIsImxpbmUiLCJzdWJzdHJpbmciLCJ0b0xvd2VyQ2FzZSIsInNyY0RvYyIsImJvcmRlciIsImVycm9yUHJvcFR5cGVzIiwiRnJvbnRFbmRFcnJvckNvbnRhaW5lciIsImVycm9yc09wZW5lZCIsImNsaWNrSGFuZGxlciIsImVycm9yc0xlbmd0aCIsImVycm9yRWxlbWVudHMiLCJEZWJ1Z01lbnUiLCJVbmNvbm5lY3RlZEdsb2JhbEVycm9yQ29udGFpbmVyIiwiaG90UmVsb2FkIiwiQm9vbGVhbiIsIkdsb2JhbEVycm9yT3ZlcmxheSIsInZpc2libGUiLCJmcm9udEVuZEVycm9ycyIsIkJlbGxJY29uIiwiQ2hlY2tJY29uIiwiQ2xvY2tJY29uIiwiRGVidWdJY29uIiwiR3JhcGhJY29uIiwiT2ZmSWNvbiIsImNsYXNzZXMiLCJ2YXJpYW50IiwidmFyaWFudDIiLCJidXR0b25GYWN0b3J5IiwiZW5hYmxlZCIsImJ1dHRvblZhcmlhbnQiLCJ0b2dnbGUiLCJfSWNvbiIsImljb25WYXJpYW50Iiwib3BlbmVkIiwiY2FsbGJhY2tHcmFwaE9wZW5lZCIsImVyckNvdW50IiwidG9nZ2xlRXJyb3JzIiwiX1N0YXR1c0ljb24iLCJtZW51Q29udGVudCIsImFsZXJ0c0xhYmVsIiwib3BlblZhcmlhbnQiLCJjb25maWdFbGVtZW50IiwidGV4dENvbnRlbnQiLCJSRURJUkVDVF9VUklfUEFUSE5BTUUiLCJPQVVUSF9DT09LSUVfTkFNRSIsIm1lc3NhZ2VQYXJ0cyIsImludmFsaWRQcm9wUGF0aCIsImV4cGVjdGVkUHJvcFR5cGUiLCJpbnZhbGlkUHJvcFR5cGVQcm92aWRlZCIsImpzb25TdXBwbGllZFZhbHVlIiwiU0lNUExFX0NPTVBPTkVOVF9UWVBFUyIsInVwZGF0ZVRpdGxlIiwidXBkYXRlX3RpdGxlIiwidGl0bGUiLCJtdXRhdGlvbk9ic2VydmVyIiwiX29ic2VydmVyJG11dGF0aW9uT2JzIiwiZGlzY29ubmVjdCIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJvYnNlcnZlIiwiY2hpbGRMaXN0IiwiYXR0cmlidXRlcyIsImNoYXJhY3RlckRhdGEiLCJwcnVuZVBlcnNpc3RlbmNlIiwiZXhlY3V0ZWQiLCJhcHBseVByb3BzIiwidXBkYXRlZFByb3BzIiwiX2FwcGx5UGVyc2lzdGVuY2UiLCJyZXF1ZXN0ZWRDYWxsYmFja3MiLCJzdG9yZWRDYWxsYmFja3MiLCJfY2IkcHJlZGVjZXNzb3JzIiwicHJlZGVjZXNzb3JzIiwiZXhlY3V0aW9uUmVzdWx0IiwiZW50cmllcyIsInBhcnNlZElkIiwib2xkTGF5b3V0IiwiYXBwbGllZFByb3BzIiwicmNiIiwib2xkT2JqIiwiaGFuZGxlUGF0aHMiLCJvbGRDaGlsZHJlblBhdGgiLCJvUGF0aHMiLCJyZWNvbXB1dGVkIiwiZnJvbnRPYmoiLCJjaGlsZHJlblByb3BQYXRoIiwiYWRkZWRQcm9wcyIsIl9nZXRTdGF0ZTQiLCJjdXJyZW50R3JhcGhzIiwiZXhlY3V0aW9uTWV0YSIsIm5zIiwiZXhlY3V0aW5nIiwiZGVmZXJyZWQiLCJza2lwcGVkT3JSZWFkeSIsIndhdGNoZWQiLCJjdXJyZW50Q2IiLCJfY2IiLCJnZXRQZW5kaW5nQ2FsbGJhY2tzIiwicGVuZGluZ0NhbGxiYWNrcyIsIl9nZXRTdGF0ZSRjYWxsYmFja3MiLCJsb2FkaW5nUGF0aHMiLCJuZXh0TWFwIiwiaWRwcm9wIiwiX19kYXNocHJpdmF0ZV9faWRwcm9wc19fIiwiX3RhcmdldCRwIiwiX19kYXNocHJpdmF0ZV9faWRwcm9wX18iLCJ1bmlxIiwiaXNBcHBSZWFkeSIsInNvcnRQcmlvcml0eSIsImMxIiwiYzIiLCJfYzEkcHJpb3JpdHkiLCJfYzIkcHJpb3JpdHkiLCJnZXRTdGFzaCIsImZsYXRPdXRwdXRzIiwiYWxsUHJvcElkcyIsInJlcU91dCIsImlkT3V0IiwiZ2V0SWRzIiwiX29ic2VydmVyIiwicHJpb3JpdGl6ZWQiLCJhdmFpbGFibGUiLCJzeW5jQ2FsbGJhY2tzIiwiYXN5bmNDYWxsYmFja3MiLCJwaWNrZWRTeW5jQ2FsbGJhY2tzIiwicGlja2VkQXN5bmNDYWxsYmFja3MiLCJibG9ja2VkIiwiZXhlY3V0aW5nQ2FsbGJhY2siLCJncm91cEJ5IiwibWVyZ2VMZWZ0Iiwic3RvcmVkIiwicmVxdWVzdGVkIiwiaW5pdGlhbFJlcXVlc3RlZCIsInJDaXJjdWxhcnMiLCJyRHVwbGljYXRlcyIsInJNZXJnZWREdXBsaWNhdGVzIiwicER1cGxpY2F0ZXMiLCJiRHVwbGljYXRlcyIsImVEdXBsaWNhdGVzIiwid0R1cGxpY2F0ZXMiLCJfcHJ1bmVDYWxsYmFja3MiLCJyQWRkZWQiLCJyUmVtb3ZlZCIsIl9wcnVuZUNhbGxiYWNrczIiLCJwQWRkZWQiLCJwUmVtb3ZlZCIsIl9wcnVuZUNhbGxiYWNrczMiLCJiQWRkZWQiLCJiUmVtb3ZlZCIsIl9wcnVuZUNhbGxiYWNrczQiLCJlQWRkZWQiLCJlUmVtb3ZlZCIsIl9wcnVuZUNhbGxiYWNrczUiLCJ3QWRkZWQiLCJ3UmVtb3ZlZCIsInJlYWR5Q2FsbGJhY2tzIiwib2xkQmxvY2tlZCIsIm5ld0Jsb2NrZWQiLCJwZW5kaW5nR3JvdXBzIiwiZHJvcHBlZCIsImdyb3VwIiwiaW5pdGlhbCIsImdyb3VwV2l0aG91dEluaXRpYWwiLCJleGciLCJyZWFkeUNhbGxiYWNrIiwiYmxvY2tlZEJ5QXNzdW1wdGlvbnMiLCJfY2IkcHJlZGVjZXNzb3JzMiIsImdjYiIsIm51bGxHcm91cENhbGxiYWNrcyIsImdyb3VwQ2FsbGJhY2tzIiwiZXhlY3V0aW9uR3JvdXBzIiwiZXhlY3V0aW9uR3JvdXBDYWxsYmFja3MiLCJsZW5zUGF0aCIsInNldCIsInN0b3JlUHJlZml4Iiwia2V5UHJlZml4TWF0Y2giLCJwcmVmaXgiLCJzZXBhcmF0b3IiLCJmdWxsU3RyIiwiZnVsbExlbiIsIlVOREVGSU5FRCIsIl9wYXJzZSIsIl9zdHJpbmdpZnkiLCJXZWJTdG9yZSIsIl9uYW1lIiwiX3N0b3JhZ2UiLCJoYXNJdGVtIiwiZ2V0SXRlbSIsIl9zZXRJdGVtIiwic2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJjbGVhciIsImtleVByZWZpeCIsImZ1bGxQcmVmaXgiLCJrZXlNYXRjaCIsImtleXNUb1JlbW92ZSIsImZ1bGxLZXkiLCJNZW1TdG9yZSIsInBvdyIsImxvbmdTdHJpbmciLCJzdG9yZXMiLCJtZW1vcnkiLCJiYWNrRW5kcyIsImxvY2FsIiwic2Vzc2lvbiIsInRyeUdldFdlYlN0b3JlIiwiZmFsbGJhY2tTdG9yZSIsInN0b3JlVGVzdCIsInRlc3RLZXkiLCJnZXRTdG9yZSIsIm5vb3BUcmFuc2Zvcm0iLCJleHRyYWN0IiwicHJvcFZhbHVlIiwic3RvcmVkVmFsdWUiLCJfcHJvcFZhbHVlIiwiZ2V0VHJhbnNmb3JtIiwicHJvcFBhcnQiLCJwZXJzaXN0ZW5jZVRyYW5zZm9ybXMiLCJnZXRWYWxzS2V5IiwicGVyc2lzdGVkUHJvcCIsInBlcnNpc3RlbmNlIiwiZ2V0UHJvcHMiLCJnZXRWYWwiLCJwZXJzaXN0ZWRfcHJvcHMiLCJwZXJzaXN0ZW5jZV90eXBlIiwiY2FuUGVyc2lzdCIsIl9nZXRQcm9wcyIsIl9wZXJzaXN0ZWRQcm9wJHNwbGl0IiwiX3BlcnNpc3RlZFByb3Akc3BsaXQyIiwic3RvcmFnZSIsIl9nZXRUcmFuc2Zvcm0iLCJ2YWxzS2V5Iiwib3JpZ2luYWxWYWwiLCJuZXdWYWwiLCJwZXJzaXN0ZW5jZU1vZHMiLCJVTkRPIiwibW9kUHJvcCIsInVwZGF0ZSIsIl9zdG9yYWdlJGdldEl0ZW0iLCJfc3RvcmFnZSRnZXRJdGVtMiIsImZyb21WYWwiLCJ0b1ZhbCIsIl9wZXJzaXN0ZWRQcm9wJHNwbGl0MyIsIl9wZXJzaXN0ZWRQcm9wJHNwbGl0NCIsInRyYW5zZm9ybSIsIl9nZXRQcm9wczIiLCJsYXlvdXRPdXQiLCJfZ2V0UHJvcHMzIiwiZ2V0RmluYWwiLCJwcmV2VmFsIiwiZmluYWxQZXJzaXN0ZW5jZSIsImZpbmFsUGVyc2lzdGVuY2VUeXBlIiwiZmluYWxQZXJzaXN0ZWRQcm9wcyIsInBlcnNpc3RlbmNlQ2hhbmdlZCIsIm5vdEluTmV3UHJvcHMiLCJkZXBlcnNpc3RlZFByb3BzIiwiZmluYWxTdG9yYWdlIiwidHJhbnNmb3JtcyIsInByb3BUcmFuc2Zvcm1zIiwiY3JlYXRlQXBpUmVkdWNlciIsIkFwaVJlZHVjZXIiLCJuZXdTdGF0ZSIsIl9hY3Rpb24kcGF5bG9hZCIsIm5ld1JlcXVlc3QiLCJzZXRKb2IiLCJyZW1vdmVKb2IiLCJzZXRPdXRkYXRlZCIsIkRFRkFVTFRfU1RBVEUiLCJjb21wbGV0ZWQiLCJmaWVsZHMiLCJtdXRhdGVDb21wbGV0ZWQiLCJtdXRhdGVDYWxsYmFja3MiLCJmaWVsZCIsImluaXRpYWxDaGFuZ2UiLCJjaGlsZHJlbl9wcm9wcyIsInN0YXRlTGlzdCIsIlNUQVJURUQiLCJIWURSQVRFRCIsIkRFU1RST1lFRCIsImluaXRpYWxHcmFwaCIsImluaXRpYWxFcnJvciIsImluaXRpYWxIaXN0b3J5IiwicHJlc2VudCIsIm5ld1Bhc3QiLCJuZXdGdXR1cmUiLCJjdXN0b21Ib29rcyIsImJlYXIiLCJ2aWV3IiwicHJvcFBhdGgiLCJleGlzdGluZ1Byb3BzIiwibWVyZ2VkUHJvcHMiLCJpbml0aWFsUGF0aHMiLCJjbG9uZSIsImRlZmF1bHRQcm9maWxlIiwiZGVmYXVsdFN0YXRlIiwic3RhdHVzTWFwcGVkIiwiY2JSZXNvdXJjZXMiLCJ0b3RhbFJlc291cmNlcyIsInVzZXIiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJfZXhjbHVkZWQiLCJjb21iaW5lUmVkdWNlcnMiLCJhcGlSZXF1ZXN0cyIsIm1haW5SZWR1Y2VyIiwiZ2V0SW5wdXRIaXN0b3J5U3RhdGUiLCJyZWNvcmRDaGFuZ2VzIiwicmVmUHJvcHMiLCJoaXN0b3J5RW50cnkiLCJwcm9wS2V5IiwicmVjb3JkSGlzdG9yeSIsInJlZHVjZXIiLCJuZXh0U3RhdGUiLCJyZWxvYWRlclJlZHVjZXIiLCJjcmVhdGVSZWR1Y2VyIiwiY3JlYXRlU3RvcmUiLCJhcHBseU1pZGRsZXdhcmUiLCJ0aHVuayIsImRvY3VtZW50VGl0bGUiLCJleGVjdXRlZENhbGxiYWNrcyIsImV4ZWN1dGluZ0NhbGxiYWNrcyIsInByaW9yaXRpemVkQ2FsbGJhY2tzIiwiUmVuZGVyZXJTdG9yZSIsInN0b3JlT2JzZXJ2ZXIiLCJtaWRkbGV3YXJlIiwiX19zdG9yZSIsInNldFN0b3JlIiwic2V0T2JzZXJ2ZXJzIiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwiY3JlYXRlQXBwU3RvcmUiLCJyZWR1eERURUMiLCJfX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9DT01QT1NFX18iLCJhY3Rpb25zRGVueWxpc3QiLCJtb2R1bGUiLCJob3QiLCJhY2NlcHQiLCJuZXh0Um9vdFJlZHVjZXIiLCJyZXF1aXJlIiwicmVwbGFjZVJlZHVjZXIiLCJpbml0aWFsaXplU3RvcmUiLCJpc0xvYWRpbmdDb21wb25lbnQiLCJfZGFzaHByaXZhdGVfaXNMb2FkaW5nQ29tcG9uZW50IiwiTlVMTF9MT0FESU5HX1NUQVRFIiwiY29tcG9uZW50TGF5b3V0IiwiX2xvYWRpbmdGcmFnbWVudCRfX2RhIiwibG9hZGluZ0ZyYWdtZW50IiwicHJvcF9uYW1lIiwiY29tcG9uZW50X25hbWUiLCJpZHByb3BzIiwiX3BhdGgiLCJjb21wb25lbnREZWZpbml0aW9uIiwiX0FycmF5IiwiZHVyYXRpb24iLCJfcmVzb2x2ZSIsIndlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwiZmFjdG9yeSIsImV4cG9ydHMiLCJhbWQiLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xNDBfXyIsIl9fd2VicGFja19tb2R1bGVzX18iLCJ0Z3QiLCJzcmNzIiwic3JjIiwiX191bnVzZWRfd2VicGFja19leHBvcnRzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsInNsaWNlSXRlcmF0b3IiLCJfYXJyIiwiX24iLCJfZCIsIl9lIiwiX2kiLCJfcyIsIkxpbmtlZExpc3QiLCJsYXlvdXRCYXNlIiwiYXV4aWxpYXJ5IiwiZ2V0VG9wTW9zdE5vZGVzIiwibm9kZXNNYXAiLCJyb290cyIsImVsZSIsImNvbm5lY3RDb21wb25lbnRzIiwiZWxlcyIsInRvcE1vc3ROb2RlcyIsImR1bW15Tm9kZXMiLCJxdWV1ZSIsInZpc2l0ZWQiLCJ2aXNpdGVkVG9wTW9zdE5vZGVzIiwiY3VycmVudE5laWdoYm9yIiwibWluRGVncmVlTm9kZSIsIm1pbkRlZ3JlZSIsImlzQ29ubmVjdGVkIiwibm9kZXNDb25uZWN0ZWRUb0R1bW15IiwiY21wdCIsImN1cnJlbnROb2RlIiwiY2hpbGRyZW5PZkN1cnJlbnROb2RlIiwiZGVzY2VuZGFudHMiLCJfbG9vcDIiLCJzaGlmdCIsIm5laWdoYm9yTm9kZXMiLCJuZWlnaGJvcmhvb2QiLCJlZGdlc1dpdGgiLCJuZWlnaGJvck5vZGUiLCJ1bmlvbiIsImNoaWxkcmVuT2ZOZWlnaGJvciIsInRlbXAiLCJzaXplIiwicmVsb2NhdGVDb21wb25lbnQiLCJvcmlnaW5hbENlbnRlciIsImNvbXBvbmVudFJlc3VsdCIsImZpeGVkTm9kZUNvbnN0cmFpbnQiLCJtaW5YQ29vcmQiLCJQT1NJVElWRV9JTkZJTklUWSIsIm1heFhDb29yZCIsIk5FR0FUSVZFX0lORklOSVRZIiwibWluWUNvb3JkIiwibWF4WUNvb3JkIiwicXVhbGl0eSIsIl9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24iLCJfZGlkSXRlcmF0b3JFcnJvciIsIl9pdGVyYXRvckVycm9yIiwibm9kZUluZGV4ZXMiLCJjeU5vZGUiLCJub2RlQkIiLCJib3VuZGluZ0JveCIsImxlZnRYIiwieENvb3JkcyIsInciLCJyaWdodFgiLCJ0b3BZIiwieUNvb3JkcyIsImJvdHRvbVkiLCJkaWZmT25YIiwieCIsImRpZmZPblkiLCJnZXRSZWN0IiwiX2RpZmZPblgiLCJfZGlmZk9uWSIsInNldENlbnRlciIsImdldENlbnRlclgiLCJnZXRDZW50ZXJZIiwiY2FsY0JvdW5kaW5nQm94IiwicGFyZW50Tm9kZSIsImxlZnQiLCJNQVhfU0FGRV9JTlRFR0VSIiwicmlnaHQiLCJNSU5fU0FGRV9JTlRFR0VSIiwidG9wIiwiYm90dG9tIiwibm9kZUxlZnQiLCJub2RlUmlnaHQiLCJub2RlVG9wIiwibm9kZUJvdHRvbSIsIm5vdCIsInRvcExlZnRYIiwidG9wTGVmdFkiLCJjYWxjUGFyZW50c1dpdGhvdXRDaGlsZHJlbiIsInBhcmVudHNXaXRob3V0Q2hpbGRyZW4iLCJjaGVjayIsImNzcyIsImF1eCIsIkNvU0VMYXlvdXQiLCJDb1NFTm9kZSIsIlBvaW50RCIsIkRpbWVuc2lvbkQiLCJMYXlvdXRDb25zdGFudHMiLCJGRExheW91dENvbnN0YW50cyIsIkNvU0VDb25zdGFudHMiLCJjb3NlTGF5b3V0Iiwic3BlY3RyYWxSZXN1bHQiLCJpZFRvTE5vZGUiLCJyYW5kb21pemUiLCJpc0ZuIiwib3B0Rm4iLCJvcHQiLCJwcm9jZXNzQ2hpbGRyZW5MaXN0IiwidGhlQ2hpbGQiLCJjaGlsZHJlbl9vZl9jaGlsZHJlbiIsInRoZU5vZGUiLCJkaW1lbnNpb25zIiwibGF5b3V0RGltZW5zaW9ucyIsIm5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVscyIsIm91dGVyV2lkdGgiLCJvdXRlckhlaWdodCIsImlzUGFyZW50IiwiZ3JhcGhNYW5hZ2VyIiwicGFyc2VGbG9hdCIsInBhcmVudEluZm8iLCJub2RlUmVwdWxzaW9uIiwicGFkZGluZ0xlZnQiLCJwYXJzZUludCIsInBhZGRpbmdUb3AiLCJwYWRkaW5nUmlnaHQiLCJwYWRkaW5nQm90dG9tIiwibGFiZWxXaWR0aCIsImluY2x1ZGVMYWJlbHMiLCJpbmNsdWRlTm9kZXMiLCJpbmNsdWRlT3ZlcmxheXMiLCJsYWJlbEhlaWdodCIsImxhYmVsUG9zVmVydGljYWwiLCJsYWJlbFBvc0hvcml6b250YWwiLCJyZWN0IiwidGhlTmV3R3JhcGgiLCJnZXRHcmFwaE1hbmFnZXIiLCJuZXdHcmFwaCIsInByb2Nlc3NFZGdlcyIsImdtIiwiaWRlYWxMZW5ndGhUb3RhbCIsImVkZ2VDb3VudCIsImVkZ2UiLCJzb3VyY2VOb2RlIiwidGFyZ2V0Tm9kZSIsImdldEVkZ2VzQmV0d2VlbiIsImUxIiwibmV3RWRnZSIsImlkZWFsTGVuZ3RoIiwiaWRlYWxFZGdlTGVuZ3RoIiwiZWRnZUVsYXN0aWNpdHkiLCJERUZBVUxUX0VER0VfTEVOR1RIIiwiTUlOX1JFUFVMU0lPTl9ESVNUIiwiREVGQVVMVF9SQURJQUxfU0VQQVJBVElPTiIsInByb2Nlc3NDb25zdHJhaW50cyIsImNvbnN0cmFpbnRzIiwiYWxpZ25tZW50Q29uc3RyYWludCIsInJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCIsIm5lc3RpbmdGYWN0b3IiLCJQRVJfTEVWRUxfSURFQUxfRURHRV9MRU5HVEhfRkFDVE9SIiwiZ3Jhdml0eSIsIkRFRkFVTFRfR1JBVklUWV9TVFJFTkdUSCIsIm51bUl0ZXIiLCJNQVhfSVRFUkFUSU9OUyIsImdyYXZpdHlSYW5nZSIsIkRFRkFVTFRfR1JBVklUWV9SQU5HRV9GQUNUT1IiLCJncmF2aXR5Q29tcG91bmQiLCJERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfU1RSRU5HVEgiLCJncmF2aXR5UmFuZ2VDb21wb3VuZCIsIkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9SQU5HRV9GQUNUT1IiLCJpbml0aWFsRW5lcmd5T25JbmNyZW1lbnRhbCIsIkRFRkFVTFRfQ09PTElOR19GQUNUT1JfSU5DUkVNRU5UQUwiLCJ0aWxpbmdDb21wYXJlQnkiLCJUSUxJTkdfQ09NUEFSRV9CWSIsIlFVQUxJVFkiLCJOT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMiLCJERUZBVUxUX0lOQ1JFTUVOVEFMIiwiQU5JTUFURSIsIlRJTEUiLCJ0aWxlIiwiVElMSU5HX1BBRERJTkdfVkVSVElDQUwiLCJ0aWxpbmdQYWRkaW5nVmVydGljYWwiLCJUSUxJTkdfUEFERElOR19IT1JJWk9OVEFMIiwidGlsaW5nUGFkZGluZ0hvcml6b250YWwiLCJQVVJFX0lOQ1JFTUVOVEFMIiwiREVGQVVMVF9VTklGT1JNX0xFQUZfTk9ERV9TSVpFUyIsInVuaWZvcm1Ob2RlRGltZW5zaW9ucyIsInN0ZXAiLCJUUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyIsIkVORk9SQ0VfQ09OU1RSQUlOVFMiLCJBUFBMWV9MQVlPVVQiLCJUUkVFX1JFRFVDVElPTl9PTl9JTkNSRU1FTlRBTCIsIm5ld0dyYXBoTWFuYWdlciIsImFkZFJvb3QiLCJydW5MYXlvdXQiLCJkZXNjcmlwdG9yIiwiQ29uc3RydWN0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJpbnN0YW5jZSIsIl9yZXF1aXJlIiwic3BlY3RyYWxMYXlvdXQiLCJfcmVxdWlyZTIiLCJkZWZhdWx0cyIsImZyZWV6ZSIsImFuaW1hdGlvbkR1cmF0aW9uIiwiYW5pbWF0aW9uRWFzaW5nIiwicGFja0NvbXBvbmVudHMiLCJzYW1wbGluZ1R5cGUiLCJzYW1wbGVTaXplIiwibm9kZVNlcGFyYXRpb24iLCJwaVRvbCIsIkxheW91dCIsInJ1biIsImNvc2VSZXN1bHQiLCJjb21wb25lbnRDZW50ZXJzIiwidmVydGljYWwiLCJob3Jpem9udGFsIiwiY29uc3RyYWludEV4aXN0IiwibGF5VXRpbCIsInBhY2tpbmdFbmFibGVkIiwibGF5b3V0VXRpbGl0aWVzIiwieDEiLCJ5MSIsInRvQmVUaWxlZE5vZGVzIiwiTWFwIiwiX3hDb29yZHMiLCJfeUNvb3JkcyIsInRlbXBTcGVjdHJhbFJlc3VsdCIsImluZGV4ZXNUb0JlRGVsZXRlZCIsIl9ib3VuZGluZ0JveCIsImNvbXBvbmVudHNFdmFsdWF0ZWQiLCJzdWJncmFwaHMiLCJoaWRkZW5FbGVzIiwic3ViZ3JhcGgiLCJub2RlSW5kZXgiLCJib3VuZGluZ2JveCIsImdldExlZnQiLCJnZXRUb3AiLCJnZXRXaWR0aCIsImdldEhlaWdodCIsInNvdXJjZU5vZGVJbmRleCIsInRhcmdldE5vZGVJbmRleCIsInNvdXJjZUNlbnRlciIsInRhcmdldENlbnRlciIsIl9wYXJlbnRJbmZvIiwic3RhcnRYIiwic3RhcnRZIiwiZW5kWCIsImVuZFkiLCJzaGlmdFJlc3VsdCIsInNoaWZ0cyIsIm5ld1hDb29yZHMiLCJkeCIsIm5ld1lDb29yZHMiLCJkeSIsIl9jb3VudCIsIm5vZGVSZWN0YW5nbGUiLCJnZXRQb3NpdGlvbnMiLCJwb3MiLCJ0aGVJZCIsIl9wb3MiLCJfaGlkZGVuRWxlcyIsImxheW91dFBvc2l0aW9ucyIsIk1hdHJpeCIsIlNWRCIsInBhcmVudE5vZGVzIiwicGFyZW50Q2hpbGRNYXAiLCJhbGxOb2Rlc05laWdoYm9yaG9vZCIsInNhbXBsZXNDb2x1bW4iLCJtaW5EaXN0YW5jZXNDb2x1bW4iLCJDIiwiUEhJIiwiSU5WIiwiZmlyc3RTYW1wbGUiLCJub2RlU2l6ZSIsImluZmluaXR5Iiwic21hbGwiLCJyYW5kb21TYW1wbGVDUiIsInNhbXBsZSIsImZsYWciLCJmbG9vciIsIkJGUyIsInBpdm90Iiwic2FtcGxpbmdNZXRob2QiLCJkaXN0YW5jZSIsIm1heF9kaXN0IiwibWF4X2luZCIsIm5laWdoYm9ycyIsIl9pMiIsIl9pMyIsImFsbEJGUyIsIl9pNCIsIl9pNSIsIl9pNiIsIl9pNyIsIl9pOCIsIl9qIiwiU1ZEUmVzdWx0Iiwic3ZkIiwiYV9xIiwiUyIsImFfdSIsIlUiLCJhX3YiLCJWIiwibWF4X3MiLCJhX1NpZyIsIm11bHRNYXQiLCJ0cmFuc3Bvc2UiLCJwb3dlckl0ZXJhdGlvbiIsInRoZXRhMSIsInRoZXRhMiIsIlkxIiwiWTIiLCJWMSIsIlYyIiwibm9ybWFsaXplIiwiX2k5IiwibXVsdEdhbW1hIiwibXVsdEwiLCJkb3RQcm9kdWN0IiwiYWJzIiwiX2kxMCIsIl9pMTEiLCJtaW51c09wIiwibXVsdENvbnMiLCJfaTEyIiwic3FydCIsIl9pMTMiLCJlbGUyIiwiZWxlSW5kZXgiLCJkaXNjb25uZWN0ZWRJZCIsIl9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yIiwiX2RpZEl0ZXJhdG9yRXJyb3IyIiwiX2l0ZXJhdG9yRXJyb3IyIiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsIl9pMTQiLCJfaTE1IiwiZmlyc3ROb2RlUG9zIiwiZmlyc3ROb2RlV2lkdGgiLCJzZWNvbmROb2RlIiwic2Vjb25kTm9kZVdpZHRoIiwiaW1wbCIsInJlZ2lzdGVyIiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJfX3dlYnBhY2tfZXhwb3J0c19fIiwicGFubmluZ0VuYWJsZWQiLCJ1c2VyUGFubmluZ0VuYWJsZWQiLCJtaW5ab29tIiwibWF4Wm9vbSIsInpvb21pbmdFbmFibGVkIiwidXNlclpvb21pbmdFbmFibGVkIiwiYm94U2VsZWN0aW9uRW5hYmxlZCIsImF1dG91bmdyYWJpZnkiLCJhdXRvbG9jayIsImF1dG91bnNlbGVjdGlmeSIsInRvSnNvbiIsImhlYWRsZXNzIiwic3R5bGVFbmFibGVkIiwiaGlkZUVkZ2VzT25WaWV3cG9ydCIsInRleHR1cmVPblZpZXdwb3J0IiwibW90aW9uQmx1ciIsIm1vdGlvbkJsdXJPcGFjaXR5Iiwid2hlZWxTZW5zaXRpdml0eSIsInBpeGVsUmF0aW8iLCJtIiwiRSIsImZyb21Kc29uIiwiZWxlMSIsIk8iLCJzY3JhdGNoIiwiX2UkQ29tcG9uZW50IiwiY29udGFpbmVyUmVmIiwiY3JlYXRlUmVmIiwiZ2xvYmFsIiwiX2N5IiwidXBkYXRlQ3l0b3NjYXBlIiwiZGVzdHJveSIsIm5vcm1hbGl6ZUVsZW1lbnRzIiwiQ29udGV4dEtleSIsImZvciIsImdUIiwiZ2xvYmFsVGhpcyIsImdldENvbnRleHQiLCJfZ1QkQ29udGV4dEtleSIsImNvbnRleHRNYXAiLCJyZWFsQ29udGV4dCIsIlJlYWN0UmVkdXhDb250ZXh0IiwiY3JlYXRlU3Vic2NyaXB0aW9uIiwidXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCIsInNlcnZlclN0YXRlIiwiX3JlZiRzdGFiaWxpdHlDaGVjayIsInN0YWJpbGl0eUNoZWNrIiwiX3JlZiRub29wQ2hlY2siLCJub29wQ2hlY2siLCJjb250ZXh0VmFsdWUiLCJzdWJzY3JpcHRpb24iLCJnZXRTZXJ2ZXJTdGF0ZSIsInByZXZpb3VzU3RhdGUiLCJvblN0YXRlQ2hhbmdlIiwibm90aWZ5TmVzdGVkU3VicyIsInRyeVN1YnNjcmliZSIsInRyeVVuc3Vic2NyaWJlIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UiLCJob2lzdFN0YXRpY3MiLCJpc1ZhbGlkRWxlbWVudFR5cGUiLCJpc0NvbnRleHRDb25zdW1lciIsImRlZmF1bHRTZWxlY3RvckZhY3RvcnkiLCJtYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3J5IiwibWFwU3RhdGVUb1Byb3BzRmFjdG9yeSIsIm1lcmdlUHJvcHNGYWN0b3J5Iiwic2hhbGxvd0VxdWFsIiwid2FybmluZyIsIm5vdEluaXRpYWxpemVkIiwidXNlU3luY0V4dGVybmFsU3RvcmUiLCJpbml0aWFsaXplQ29ubmVjdCIsIkVNUFRZX0FSUkFZIiwiTk9fU1VCU0NSSVBUSU9OX0FSUkFZIiwic3RyaW5naWZ5Q29tcG9uZW50IiwiQ29tcCIsInVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3RXaXRoQXJncyIsImVmZmVjdEZ1bmMiLCJlZmZlY3RBcmdzIiwiY2FwdHVyZVdyYXBwZXJQcm9wcyIsImxhc3RXcmFwcGVyUHJvcHMiLCJsYXN0Q2hpbGRQcm9wcyIsInJlbmRlcklzU2NoZWR1bGVkIiwid3JhcHBlclByb3BzIiwiY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSIsInN1YnNjcmliZVVwZGF0ZXMiLCJzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMiLCJjaGlsZFByb3BzU2VsZWN0b3IiLCJpc01vdW50ZWQiLCJhZGRpdGlvbmFsU3Vic2NyaWJlTGlzdGVuZXIiLCJkaWRVbnN1YnNjcmliZSIsImxhc3RUaHJvd25FcnJvciIsImNoZWNrRm9yVXBkYXRlcyIsImxhdGVzdFN0b3JlU3RhdGUiLCJuZXdDaGlsZFByb3BzIiwidW5zdWJzY3JpYmVXcmFwcGVyIiwiaW5pdFN0YXRlVXBkYXRlcyIsInN0cmljdEVxdWFsIiwiaGFzV2FybmVkQWJvdXREZXByZWNhdGVkUHVyZU9wdGlvbiIsIm1hcFN0YXRlVG9Qcm9wcyIsIm1hcERpc3BhdGNoVG9Qcm9wcyIsIm1lcmdlUHJvcHMiLCJwdXJlIiwiX3JlZiRhcmVTdGF0ZXNFcXVhbCIsImFyZVN0YXRlc0VxdWFsIiwiX3JlZiRhcmVPd25Qcm9wc0VxdWFsIiwiYXJlT3duUHJvcHNFcXVhbCIsIl9yZWYkYXJlU3RhdGVQcm9wc0VxdSIsImFyZVN0YXRlUHJvcHNFcXVhbCIsIl9yZWYkYXJlTWVyZ2VkUHJvcHNFcSIsImFyZU1lcmdlZFByb3BzRXF1YWwiLCJfcmVmJGZvcndhcmRSZWYiLCJmb3J3YXJkUmVmIiwiX3JlZiRjb250ZXh0IiwiaW5pdE1hcFN0YXRlVG9Qcm9wcyIsImluaXRNYXBEaXNwYXRjaFRvUHJvcHMiLCJpbml0TWVyZ2VQcm9wcyIsIndyYXBXaXRoQ29ubmVjdCIsIldyYXBwZWRDb21wb25lbnQiLCJ3cmFwcGVkQ29tcG9uZW50TmFtZSIsInNlbGVjdG9yRmFjdG9yeU9wdGlvbnMiLCJDb25uZWN0RnVuY3Rpb24iLCJfUmVhY3QkdXNlTWVtbyIsInJlYWN0UmVkdXhGb3J3YXJkZWRSZWYiLCJfUmVhY3QkdXNlTWVtbzIiLCJwcm9wc0NvbnRleHQiLCJDb250ZXh0VG9Vc2UiLCJDb25zdW1lciIsImRpZFN0b3JlQ29tZUZyb21Qcm9wcyIsImRpZFN0b3JlQ29tZUZyb21Db250ZXh0IiwiX1JlYWN0JHVzZU1lbW8zIiwiX1JlYWN0JHVzZU1lbW80Iiwib3ZlcnJpZGRlbkNvbnRleHRWYWx1ZSIsImlzUHJvY2Vzc2luZ0Rpc3BhdGNoIiwibGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvciIsImFjdHVhbENoaWxkUHJvcHNTZWxlY3RvciIsInN1YnNjcmliZUZvclJlYWN0IiwicmVhY3RMaXN0ZW5lciIsImFjdHVhbENoaWxkUHJvcHMiLCJyZW5kZXJlZFdyYXBwZWRDb21wb25lbnQiLCJyZW5kZXJlZENoaWxkIiwiX0Nvbm5lY3QiLCJDb25uZWN0IiwiX2ZvcndhcmRlZCIsImZvcndhcmRDb25uZWN0UmVmIiwiZm9yd2FyZGVkIiwiY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkiLCJiaW5kQWN0aW9uQ3JlYXRvcnMiLCJ3cmFwTWFwVG9Qcm9wc0NvbnN0YW50Iiwid3JhcE1hcFRvUHJvcHNGdW5jIiwidmVyaWZ5UGxhaW5PYmplY3QiLCJkZWZhdWx0TWVyZ2VQcm9wcyIsInN0YXRlUHJvcHMiLCJkaXNwYXRjaFByb3BzIiwib3duUHJvcHMiLCJ3cmFwTWVyZ2VQcm9wc0Z1bmMiLCJpbml0TWVyZ2VQcm9wc1Byb3h5IiwiaGFzUnVuT25jZSIsIm1lcmdlUHJvcHNQcm94eSIsIm5leHRNZXJnZWRQcm9wcyIsInZlcmlmeVN1YnNlbGVjdG9ycyIsInB1cmVGaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5IiwiaGFzUnVuQXRMZWFzdE9uY2UiLCJoYW5kbGVGaXJzdENhbGwiLCJmaXJzdFN0YXRlIiwiZmlyc3RPd25Qcm9wcyIsImhhbmRsZU5ld1Byb3BzQW5kTmV3U3RhdGUiLCJkZXBlbmRzT25Pd25Qcm9wcyIsImhhbmRsZU5ld1Byb3BzIiwiaGFuZGxlTmV3U3RhdGUiLCJuZXh0U3RhdGVQcm9wcyIsInN0YXRlUHJvcHNDaGFuZ2VkIiwiaGFuZGxlU3Vic2VxdWVudENhbGxzIiwibmV4dE93blByb3BzIiwicHJvcHNDaGFuZ2VkIiwic3RhdGVDaGFuZ2VkIiwicHVyZUZpbmFsUHJvcHNTZWxlY3RvciIsImZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkiLCJ2ZXJpZnkiLCJtZXRob2ROYW1lIiwiZ2V0Q29uc3RhbnQiLCJpbml0Q29uc3RhbnRTZWxlY3RvciIsImNvbnN0YW50IiwiY29uc3RhbnRTZWxlY3RvciIsImdldERlcGVuZHNPbk93blByb3BzIiwibWFwVG9Qcm9wcyIsImluaXRQcm94eVNlbGVjdG9yIiwicHJveHkiLCJtYXBUb1Byb3BzUHJveHkiLCJzdGF0ZU9yRGlzcGF0Y2giLCJkZXRlY3RGYWN0b3J5QW5kVmVyaWZ5IiwidXNlRGlzcGF0Y2giLCJjcmVhdGVEaXNwYXRjaEhvb2siLCJjcmVhdGVTZWxlY3Rvckhvb2siLCJ1c2VTdG9yZSIsImNyZWF0ZVN0b3JlSG9vayIsInVzZURlZmF1bHRTdG9yZSIsImNyZWF0ZVJlZHV4Q29udGV4dEhvb2siLCJ1c2VSZWR1eENvbnRleHQiLCJ1c2VDYWxsYmFjayIsInVzZURlYnVnVmFsdWUiLCJ1c2VEZWZhdWx0UmVkdXhDb250ZXh0IiwidXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IiLCJpbml0aWFsaXplVXNlU2VsZWN0b3IiLCJyZWZFcXVhbGl0eSIsImVxdWFsaXR5Rm5Pck9wdGlvbnMiLCJlcXVhbGl0eUZuIiwiX3JlZiRlcXVhbGl0eUZuIiwiX3VzZVJlZHV4Q29udGV4dCIsImdsb2JhbFN0YWJpbGl0eUNoZWNrIiwiZ2xvYmFsTm9vcENoZWNrIiwiZmlyc3RSdW4iLCJ3cmFwcGVkU2VsZWN0b3IiLCJmaW5hbFN0YWJpbGl0eUNoZWNrIiwidG9Db21wYXJlIiwic2VsZWN0ZWQyIiwiZmluYWxOb29wQ2hlY2siLCJzZWxlY3RlZFN0YXRlIiwiYWRkTmVzdGVkU3ViIiwidW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMiLCJzZXRCYXRjaCIsImdldEJhdGNoIiwiY3JlYXRlTGlzdGVuZXJDb2xsZWN0aW9uIiwiZmlyc3QiLCJsaXN0ZW5lcnMiLCJpc1N1YnNjcmliZWQiLCJ1bnN1YnNjcmliZSIsIm51bGxMaXN0ZW5lcnMiLCJwYXJlbnRTdWIiLCJzdWJzY3JpcHRpb25zQW1vdW50Iiwic2VsZlN1YnNjcmliZWQiLCJjbGVhbnVwTGlzdGVuZXIiLCJoYW5kbGVDaGFuZ2VXcmFwcGVyIiwidHJ5U3Vic2NyaWJlU2VsZiIsInRyeVVuc3Vic2NyaWJlU2VsZiIsImdldExpc3RlbmVycyIsImRlZmF1bHROb29wQmF0Y2giLCJuZXdCYXRjaCIsImFjdGlvbkNyZWF0b3JzIiwiYm91bmRBY3Rpb25DcmVhdG9ycyIsImFjdGlvbkNyZWF0b3IiLCJpc1BsYWluT2JqZWN0IiwicHJvdG8iLCJiYXNlUHJvdG8iLCJvYmpBIiwib2JqQiIsImtleXNBIiwia2V5c0IiLCJjYW5Vc2VET00iLCJ1c2VMYXlvdXRFZmZlY3QiLCJSRUFDVF9FTEVNRU5UX1RZUEUiLCJSRUFDVF9QT1JUQUxfVFlQRSIsIlJFQUNUX0ZSQUdNRU5UX1RZUEUiLCJSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIiwiUkVBQ1RfUFJPRklMRVJfVFlQRSIsIlJFQUNUX1BST1ZJREVSX1RZUEUiLCJSRUFDVF9DT05URVhUX1RZUEUiLCJSRUFDVF9TRVJWRVJfQ09OVEVYVF9UWVBFIiwiUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSIsIlJFQUNUX1NVU1BFTlNFX1RZUEUiLCJSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUiLCJSRUFDVF9NRU1PX1RZUEUiLCJSRUFDVF9MQVpZX1RZUEUiLCJSRUFDVF9PRkZTQ1JFRU5fVFlQRSIsImVuYWJsZVNjb3BlQVBJIiwiZW5hYmxlQ2FjaGVFbGVtZW50IiwiZW5hYmxlVHJhbnNpdGlvblRyYWNpbmciLCJlbmFibGVMZWdhY3lIaWRkZW4iLCJlbmFibGVEZWJ1Z1RyYWNpbmciLCJSRUFDVF9NT0RVTEVfUkVGRVJFTkNFIiwiJCR0eXBlb2YiLCJnZXRNb2R1bGVJZCIsInR5cGVPZiIsIiQkdHlwZW9mVHlwZSIsIkNvbnRleHRDb25zdW1lciIsIkNvbnRleHRQcm92aWRlciIsIkVsZW1lbnQiLCJGb3J3YXJkUmVmIiwiTGF6eSIsIk1lbW8iLCJQb3J0YWwiLCJQcm9maWxlciIsIlN0cmljdE1vZGUiLCJTdXNwZW5zZSIsIlN1c3BlbnNlTGlzdCIsImhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlIiwiaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNDb25jdXJyZW50TW9kZSIsImlzQXN5bmNNb2RlIiwiaXNDb25jdXJyZW50TW9kZSIsImlzQ29udGV4dFByb3ZpZGVyIiwiaXNFbGVtZW50IiwiaXNGb3J3YXJkUmVmIiwiaXNGcmFnbWVudCIsImlzTGF6eSIsImlzTWVtbyIsImlzUG9ydGFsIiwiaXNQcm9maWxlciIsImlzU3RyaWN0TW9kZSIsImlzU3VzcGVuc2UiLCJpc1N1c3BlbnNlTGlzdCIsIl9jb25jYXQiLCJfY3VycnkxIiwiY3VycnlOIiwib3JpZ0ZuIiwibGlzdCIsIl9jdXJyeTIiLCJfZGlzcGF0Y2hhYmxlIiwiX3hhbGwiLCJhbHdheXMiLCJfeGFueSIsIl9yZWR1Y2UiLCJhcHBseUYiLCJhcHBseVgiLCJhY2MiLCJlbCIsIl9jdXJyeTMiLCJfaGFzIiwiX2lzSW50ZWdlciIsIl9hc3NvYyIsIm5leHRPYmoiLCJfYXJpdHkiLCJ0aGlzT2JqIiwiX2Nsb25lIiwicHJlZCIsIl9pc0FycmF5IiwiX2lzRnVuY3Rpb24iLCJfaXNTdHJpbmciLCJfbWFwIiwiY29udmVyZ2UiLCJhZnRlciIsImZucyIsIl9jdXJyeU4iLCJkZWZhdWx0VG8iLCJfU2V0Iiwic2Vjb25kIiwiZmlyc3RMZW4iLCJzZWNvbmRMZW4iLCJ0b0ZpbHRlck91dCIsIl9kaXNzb2MiLCJfc2hhbGxvd0Nsb25lT2JqZWN0IiwiX2lzQXJndW1lbnRzIiwiX2lzT2JqZWN0IiwiX2lzVHlwZWRBcnJheSIsIl9lcXVhbHMiLCJ0cmFuc2Zvcm1hdGlvbnMiLCJ0cmFuc2Zvcm1hdGlvbiIsIl9hcnJheVJlZHVjZSIsIl9maWx0ZXIiLCJfeGZpbHRlciIsImZpbHRlcmFibGUiLCJfeGZpbmQiLCJfeGZpbmRJbmRleCIsIl9tYWtlRmxhdCIsIl9jaGVja0Zvck1ldGhvZCIsImtleUxpc3QiLCJyZWR1Y2VCeSIsImhhc1BhdGgiLCJfaWRlbnRpdHkiLCJfaW5jbHVkZXMiLCJfaW5kZXhPZiIsInhzIiwiZWx0IiwiX25hdGl2ZVNldCIsIl9pdGVtcyIsImhhc09yQWRkIiwic2hvdWxkQWRkIiwicHJldlNpemUiLCJuZXdTaXplIiwiSW5maW5pdHkiLCJiSWR4IiwiYTAiLCJhMSIsImEyIiwiYTMiLCJhNCIsImE1IiwiYTYiLCJhNyIsImE4IiwiYTkiLCJfYXJyYXlGcm9tSXRlcmF0b3IiLCJtZXRob2RuYW1lIiwiX2Nsb25lUmVnRXhwIiwiZGVlcCIsIl9PYmplY3RNYXAiLCJfaXNQcmltaXRpdmUiLCJjb3B5IiwiY29waWVkVmFsdWUiLCJjYWNoZWRDb3B5IiwidmFsdWVPZiIsInBhcmFtIiwiaGFzaGVkS2V5IiwiaGFzaCIsImJ1Y2tldCIsIlJlZ0V4cCIsImZsYWdzIiwiaWdub3JlQ2FzZSIsIm11bHRpbGluZSIsInN0aWNreSIsInVuaWNvZGUiLCJkb3RBbGwiLCJfY29tcGxlbWVudCIsInNldDEiLCJzZXQyIiwibGVuMSIsImxlbjIiLCJfaXNBcnJheUxpa2UiLCJzeW1JdGVyYXRvciIsIl9jcmVhdGVSZWR1Y2UiLCJhcnJheVJlZHVjZSIsIm1ldGhvZFJlZHVjZSIsIml0ZXJhYmxlUmVkdWNlIiwieGYiLCJfaXNQbGFjZWhvbGRlciIsImYxIiwiZjIiLCJfYiIsIl9hIiwiZjMiLCJfYyIsInJlY2VpdmVkIiwiY29tYmluZWQiLCJhcmdzSWR4IiwiY29tYmluZWRJZHgiLCJoYXNQbGFjZWhvbGRlciIsIl9pc1RyYW5zZm9ybWVyIiwibWV0aG9kTmFtZXMiLCJ0cmFuc2R1Y2VyQ3JlYXRvciIsInRyYW5zZHVjZXIiLCJfaW5jbHVkZXNXaXRoIiwiX2Z1bmN0aW9uTmFtZSIsIl9vYmplY3RJcyIsIl91bmlxQ29udGVudEVxdWFscyIsImFJdGVyYXRvciIsImJJdGVyYXRvciIsInN0YWNrQSIsInN0YWNrQiIsImVxIiwiYUl0ZW0iLCJ0eXBlQSIsImV4dGVuZGVkU3RhY2tBIiwiZXh0ZW5kZWRTdGFja0IiLCJpbmYiLCJpc0FycmF5TGlrZSIsImlzSW50ZWdlciIsInJlY3Vyc2l2ZSIsImZsYXR0IiwiamxlbiIsImlsZW4iLCJmdW5jdG9yIiwiX29iamVjdEFzc2lnbiIsIm5leHRLZXkiLCJfcXVvdGUiLCJlc2NhcGVkIiwiX2l0ZXJhYmxlUmVkdWNlIiwiX21ldGhvZFJlZHVjZSIsIl9yZWR1Y2VkIiwicGFkIiwiX3RvSVNPU3RyaW5nIiwidG9JU09TdHJpbmciLCJnZXRVVENGdWxsWWVhciIsImdldFVUQ01vbnRoIiwiZ2V0VVRDRGF0ZSIsImdldFVUQ0hvdXJzIiwiZ2V0VVRDTWludXRlcyIsImdldFVUQ1NlY29uZHMiLCJnZXRVVENNaWxsaXNlY29uZHMiLCJ0b0ZpeGVkIiwiX3RvU3RyaW5nIiwic2VlbiIsInJlY3VyIiwibWFwUGFpcnMiLCJOYU4iLCJyZXByIiwiX3hBcnJheVJlZHVjZSIsIl94SXRlcmFibGVSZWR1Y2UiLCJfeE1ldGhvZFJlZHVjZSIsIl94UmVkdWNlIiwiX3hmQmFzZSIsIlhBbGwiLCJpbml0IiwiWEFueSIsIlhGaWx0ZXIiLCJYRmluZCIsIlhGaW5kSW5kZXgiLCJYTWFwIiwiX3htYXAiLCJYUmVkdWNlQnkiLCJ2YWx1ZUZuIiwidmFsdWVBY2MiLCJrZXlGbiIsIl94cmVkdWNlQnkiLCJYVGFrZSIsInJldCIsIl94dGFrZSIsIlhVbmlxQnkiLCJfeHVuaXFCeSIsIlhXcmFwIiwiX3h3cmFwIiwibGlzdDEiLCJsaXN0MiIsInRvS2VlcCIsIkN0b3IiLCJqdXh0IiwiaGFzRW51bUJ1ZyIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwibm9uRW51bWVyYWJsZVByb3BzIiwiaGFzQXJnc0VudW1CdWciLCJjb250YWlucyIsIm5JZHgiLCJrcyIsImNoZWNrQXJnc0xlbmd0aCIsImxlbnMiLCJzZXR0ZXIiLCJ0b0Z1bmN0b3JGbiIsImZvY3VzIiwic2FmZU1heCIsIm1heEJ5VmFsdWUiLCJtYXhCeVR5cGUiLCJzdHJpbmdBIiwibWF4QnlTdHJpbmdWYWx1ZSIsImtleUdlbiIsImNhY2hlIiwibWVyZ2VEZWVwV2l0aEtleSIsImxPYmoiLCJyT2JqIiwibFZhbCIsInJWYWwiLCJtZXJnZVdpdGhLZXkiLCJfbCIsIl9yIiwibnRoIiwib2Zmc2V0IiwibmFtZXMiLCJjYWxsZWQiLCJJZGVudGl0eSIsIm92ZXIiLCJwYXRoQXIiLCJwYXRoc0FycmF5IiwicHMiLCJzdGFydCIsImZyb21JbmRleCIsInRvSW5kZXgiLCJ0YWtlIiwicGFpcnMiLCJ1bmlxQnkiLCJhcHBsaWVkSXRlbSIsIkNvbnN0IiwiZmFudGFzeUxhbmRNYXAiLCJydiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/dash/dash-renderer/build/dash_renderer.min.js b/dash/dash-renderer/build/dash_renderer.min.js index 95632d9dda..74f10cc822 100644 --- a/dash/dash-renderer/build/dash_renderer.min.js +++ b/dash/dash-renderer/build/dash_renderer.min.js @@ -1,2 +1,2 @@ /*! For license information please see dash_renderer.min.js.LICENSE.txt */ -!function(){var t={800:function(t,e,r){var n;window,t.exports=(n=r(196),function(t){var e={};function r(n){if(e[n])return e[n].exports;var o=e[n]={i:n,l:!1,exports:{}};return t[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)r.d(n,o,function(e){return t[e]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=1)}([function(t,e){t.exports=n},function(t,e,r){"use strict";r.r(e),r.d(e,"asyncDecorator",(function(){return a})),r.d(e,"inheritAsyncDecorator",(function(){return u})),r.d(e,"isReady",(function(){return c})),r.d(e,"History",(function(){return f}));var n=r(0);function o(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}function i(t){return function(){var e=this,r=arguments;return new Promise((function(n,i){var a=t.apply(e,r);function u(t){o(a,n,i,u,c,"next",t)}function c(t){o(a,n,i,u,c,"throw",t)}u(void 0)}))}}var a=function(t,e){var r,o={isReady:new Promise((function(t){r=t})),get:Object(n.lazy)((function(){return Promise.resolve(e()).then((function(t){return setTimeout(i(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,r(!0);case 2:o.isReady=!0;case 3:case"end":return t.stop()}}),t)}))),0),t}))}))};return Object.defineProperty(t,"_dashprivate_isLazyComponentReady",{get:function(){return o.isReady}}),o.get},u=function(t,e){Object.defineProperty(t,"_dashprivate_isLazyComponentReady",{get:function(){return c(e)}})},c=function(t){return t&&t._dashprivate_isLazyComponentReady};function s(t,e){for(var r=0;rdiv {\n position: relative;\n}\n._dash-undo-redo-link {\n color: #0074D9;\n cursor: pointer;\n margin-left: 10px;\n margin-right: 10px;\n display: inline-block;\n opacity: 0.2;\n}\n._dash-undo-redo-link:hover {\n opacity: 1;\n}\n._dash-undo-redo-link ._dash-icon-undo {\n font-size: 20px;\n transform: rotate(270deg);\n}\n._dash-undo-redo-link ._dash-icon-redo {\n font-size: 20px;\n transform: rotate(90deg);\n}\n._dash-undo-redo-link ._dash-undo-redo-label {\n font-size: 15px;\n}\n",""]),e.Z=a},645:function(t){"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var r="",n=void 0!==e[5];return e[4]&&(r+="@supports (".concat(e[4],") {")),e[2]&&(r+="@media ".concat(e[2]," {")),n&&(r+="@layer".concat(e[5].length>0?" ".concat(e[5]):""," {")),r+=t(e),n&&(r+="}"),e[2]&&(r+="}"),e[4]&&(r+="}"),r})).join("")},e.i=function(t,r,n,o,i){"string"==typeof t&&(t=[[null,t,void 0]]);var a={};if(n)for(var u=0;u0?" ".concat(l[5]):""," {").concat(l[1],"}")),l[5]=i),r&&(l[2]?(l[1]="@media ".concat(l[2]," {").concat(l[1],"}"),l[2]=r):l[2]=r),o&&(l[4]?(l[1]="@supports (".concat(l[4],") {").concat(l[1],"}"),l[4]=o):l[4]="".concat(o)),e.push(l))}},e}},81:function(t){"use strict";t.exports=function(t){return t[1]}},357:function(t,e){function r(t,e,r,n){var i={};return function(a){if(!i[a]){var u={},c=[],s=[];for(s.push({node:a,processed:!1});s.length>0;){var l=s[s.length-1],f=l.processed,p=l.node;if(f)s.pop(),c.pop(),u[p]=!1,i[p]=!0,e&&0!==t[p].length||r.push(p);else{if(i[p]){s.pop();continue}if(u[p]){if(n){s.pop();continue}throw c.push(p),new o(c)}u[p]=!0,c.push(p);for(var h=t[p],d=h.length-1;d>=0;d--)s.push({node:h[d],processed:!1});l.processed=!0}}}}}var n=e.f=function(t){this.nodes={},this.outgoingEdges={},this.incomingEdges={},this.circular=t&&!!t.circular};n.prototype={size:function(){return Object.keys(this.nodes).length},addNode:function(t,e){this.hasNode(t)||(this.nodes[t]=2===arguments.length?e:t,this.outgoingEdges[t]=[],this.incomingEdges[t]=[])},removeNode:function(t){this.hasNode(t)&&(delete this.nodes[t],delete this.outgoingEdges[t],delete this.incomingEdges[t],[this.incomingEdges,this.outgoingEdges].forEach((function(e){Object.keys(e).forEach((function(r){var n=e[r].indexOf(t);n>=0&&e[r].splice(n,1)}),this)})))},hasNode:function(t){return this.nodes.hasOwnProperty(t)},getNodeData:function(t){if(this.hasNode(t))return this.nodes[t];throw new Error("Node does not exist: "+t)},setNodeData:function(t,e){if(!this.hasNode(t))throw new Error("Node does not exist: "+t);this.nodes[t]=e},addDependency:function(t,e){if(!this.hasNode(t))throw new Error("Node does not exist: "+t);if(!this.hasNode(e))throw new Error("Node does not exist: "+e);return-1===this.outgoingEdges[t].indexOf(e)&&this.outgoingEdges[t].push(e),-1===this.incomingEdges[e].indexOf(t)&&this.incomingEdges[e].push(t),!0},removeDependency:function(t,e){var r;this.hasNode(t)&&(r=this.outgoingEdges[t].indexOf(e))>=0&&this.outgoingEdges[t].splice(r,1),this.hasNode(e)&&(r=this.incomingEdges[e].indexOf(t))>=0&&this.incomingEdges[e].splice(r,1)},clone:function(){var t=this,e=new n;return Object.keys(t.nodes).forEach((function(r){e.nodes[r]=t.nodes[r],e.outgoingEdges[r]=t.outgoingEdges[r].slice(0),e.incomingEdges[r]=t.incomingEdges[r].slice(0)})),e},directDependenciesOf:function(t){if(this.hasNode(t))return this.outgoingEdges[t].slice(0);throw new Error("Node does not exist: "+t)},directDependantsOf:function(t){if(this.hasNode(t))return this.incomingEdges[t].slice(0);throw new Error("Node does not exist: "+t)},dependenciesOf:function(t,e){if(this.hasNode(t)){var n=[];r(this.outgoingEdges,e,n,this.circular)(t);var o=n.indexOf(t);return o>=0&&n.splice(o,1),n}throw new Error("Node does not exist: "+t)},dependantsOf:function(t,e){if(this.hasNode(t)){var n=[];r(this.incomingEdges,e,n,this.circular)(t);var o=n.indexOf(t);return o>=0&&n.splice(o,1),n}throw new Error("Node does not exist: "+t)},overallOrder:function(t){var e=this,n=[],o=Object.keys(this.nodes);if(0===o.length)return n;if(!this.circular){var i=r(this.outgoingEdges,!1,[],this.circular);o.forEach((function(t){i(t)}))}var a=r(this.outgoingEdges,t,n,this.circular);return o.filter((function(t){return 0===e.incomingEdges[t].length})).forEach((function(t){a(t)})),this.circular&&o.filter((function(t){return-1===n.indexOf(t)})).forEach((function(t){a(t)})),n},entryNodes:function(){var t=this;return Object.keys(this.nodes).filter((function(e){return 0===t.incomingEdges[e].length}))}},n.prototype.directDependentsOf=n.prototype.directDependantsOf,n.prototype.dependentsOf=n.prototype.dependantsOf;var o=function(t){var e="Dependency Cycle Found: "+t.join(" -> "),r=new Error(e);return r.cyclePath=t,Object.setPrototypeOf(r,Object.getPrototypeOf(this)),Error.captureStackTrace&&Error.captureStackTrace(r,o),r};o.prototype=Object.create(Error.prototype,{constructor:{value:Error,enumerable:!1,writable:!0,configurable:!0}}),Object.setPrototypeOf(o,Error)},924:function(t,e,r){"use strict";var n=r(244);t.exports=function(t){var e=typeof t;if("string"===e){var r=t;if(0==(t=+t)&&n(r))return!1}else if("number"!==e)return!1;return t-t<1}},679:function(t,e,r){"use strict";var n=r(864),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},i={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},a={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},u={};function c(t){return n.isMemo(t)?a:u[t.$$typeof]||o}u[n.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},u[n.Memo]=a;var s=Object.defineProperty,l=Object.getOwnPropertyNames,f=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,h=Object.getPrototypeOf,d=Object.prototype;t.exports=function t(e,r,n){if("string"!=typeof r){if(d){var o=h(r);o&&o!==d&&t(e,o,n)}var a=l(r);f&&(a=a.concat(f(r)));for(var u=c(e),y=c(r),v=0;v13)&&32!==e&&133!==e&&160!==e&&5760!==e&&6158!==e&&(e<8192||e>8205)&&8232!==e&&8233!==e&&8239!==e&&8287!==e&&8288!==e&&12288!==e&&65279!==e)return!1;return!0}},414:function(t){"use strict";t.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},921:function(t,e){"use strict";var r="function"==typeof Symbol&&Symbol.for,n=r?Symbol.for("react.element"):60103,o=r?Symbol.for("react.portal"):60106,i=r?Symbol.for("react.fragment"):60107,a=r?Symbol.for("react.strict_mode"):60108,u=r?Symbol.for("react.profiler"):60114,c=r?Symbol.for("react.provider"):60109,s=r?Symbol.for("react.context"):60110,l=r?Symbol.for("react.async_mode"):60111,f=r?Symbol.for("react.concurrent_mode"):60111,p=r?Symbol.for("react.forward_ref"):60112,h=r?Symbol.for("react.suspense"):60113,d=r?Symbol.for("react.suspense_list"):60120,y=r?Symbol.for("react.memo"):60115,v=r?Symbol.for("react.lazy"):60116,b=r?Symbol.for("react.block"):60121,g=r?Symbol.for("react.fundamental"):60117,m=r?Symbol.for("react.responder"):60118,w=r?Symbol.for("react.scope"):60119;function O(t){if("object"==typeof t&&null!==t){var e=t.$$typeof;switch(e){case n:switch(t=t.type){case l:case f:case i:case u:case a:case h:return t;default:switch(t=t&&t.$$typeof){case s:case p:case v:case y:case c:return t;default:return e}}case o:return e}}}function _(t){return O(t)===f}e.AsyncMode=l,e.ConcurrentMode=f,e.ContextConsumer=s,e.ContextProvider=c,e.Element=n,e.ForwardRef=p,e.Fragment=i,e.Lazy=v,e.Memo=y,e.Portal=o,e.Profiler=u,e.StrictMode=a,e.Suspense=h,e.isAsyncMode=function(t){return _(t)||O(t)===l},e.isConcurrentMode=_,e.isContextConsumer=function(t){return O(t)===s},e.isContextProvider=function(t){return O(t)===c},e.isElement=function(t){return"object"==typeof t&&null!==t&&t.$$typeof===n},e.isForwardRef=function(t){return O(t)===p},e.isFragment=function(t){return O(t)===i},e.isLazy=function(t){return O(t)===v},e.isMemo=function(t){return O(t)===y},e.isPortal=function(t){return O(t)===o},e.isProfiler=function(t){return O(t)===u},e.isStrictMode=function(t){return O(t)===a},e.isSuspense=function(t){return O(t)===h},e.isValidElementType=function(t){return"string"==typeof t||"function"==typeof t||t===i||t===f||t===u||t===a||t===h||t===d||"object"==typeof t&&null!==t&&(t.$$typeof===v||t.$$typeof===y||t.$$typeof===c||t.$$typeof===s||t.$$typeof===p||t.$$typeof===g||t.$$typeof===m||t.$$typeof===w||t.$$typeof===b)},e.typeOf=O},864:function(t,e,r){"use strict";t.exports=r(921)},379:function(t){"use strict";var e=[];function r(t){for(var r=-1,n=0;n0?" ".concat(r.layer):""," {")),n+=r.css,o&&(n+="}"),r.media&&(n+="}"),r.supports&&(n+="}");var i=r.sourceMap;i&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),e.styleTagTransform(n,t,e.options)}(e,t,r)},remove:function(){!function(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t)}(e)}}}},589:function(t){"use strict";t.exports=function(t,e){if(e.styleSheet)e.styleSheet.cssText=t;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(t))}}},250:function(t,e,r){"use strict";var n=r(196),o="function"==typeof Object.is?Object.is:function(t,e){return t===e&&(0!==t||1/t==1/e)||t!=t&&e!=e},i=n.useState,a=n.useEffect,u=n.useLayoutEffect,c=n.useDebugValue;function s(t){var e=t.getSnapshot;t=t.value;try{var r=e();return!o(t,r)}catch(t){return!0}}var l="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(t,e){return e()}:function(t,e){var r=e(),n=i({inst:{value:r,getSnapshot:e}}),o=n[0].inst,l=n[1];return u((function(){o.value=r,o.getSnapshot=e,s(o)&&l({inst:o})}),[t,r,e]),a((function(){return s(o)&&l({inst:o}),t((function(){s(o)&&l({inst:o})}))}),[t]),c(r),r};e.useSyncExternalStore=void 0!==n.useSyncExternalStore?n.useSyncExternalStore:l},139:function(t,e,r){"use strict";var n=r(196),o=r(688),i="function"==typeof Object.is?Object.is:function(t,e){return t===e&&(0!==t||1/t==1/e)||t!=t&&e!=e},a=o.useSyncExternalStore,u=n.useRef,c=n.useEffect,s=n.useMemo,l=n.useDebugValue;e.useSyncExternalStoreWithSelector=function(t,e,r,n,o){var f=u(null);if(null===f.current){var p={hasValue:!1,value:null};f.current=p}else p=f.current;f=s((function(){function t(t){if(!c){if(c=!0,a=t,t=n(t),void 0!==o&&p.hasValue){var e=p.value;if(o(e,t))return u=e}return u=t}if(e=u,i(a,t))return e;var r=n(t);return void 0!==o&&o(e,r)?e:(a=t,u=r)}var a,u,c=!1,s=void 0===r?null:r;return[function(){return t(e())},null===s?void 0:function(){return t(s())}]}),[e,r,n,o]);var h=a(t,f[0],f[1]);return c((function(){p.hasValue=!0,p.value=h}),[h]),l(h),h}},688:function(t,e,r){"use strict";t.exports=r(250)},798:function(t,e,r){"use strict";t.exports=r(139)},196:function(t){"use strict";t.exports=window.React}},e={};function r(n){var o=e[n];if(void 0!==o)return o.exports;var i=e[n]={id:n,exports:{}};return t[n](i,i.exports,r),i.exports}r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,{a:e}),e},r.d=function(t,e){for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.nc=void 0;var n={};!function(){"use strict";var t="undefined"!=typeof globalThis&&globalThis||"undefined"!=typeof self&&self||void 0!==t&&t,e="URLSearchParams"in t,r="Symbol"in t&&"iterator"in Symbol,n="FileReader"in t&&"Blob"in t&&function(){try{return new Blob,!0}catch(t){return!1}}(),o="FormData"in t,i="ArrayBuffer"in t;if(i)var a=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],u=ArrayBuffer.isView||function(t){return t&&a.indexOf(Object.prototype.toString.call(t))>-1};function c(t){if("string"!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(t)||""===t)throw new TypeError('Invalid character in header field name: "'+t+'"');return t.toLowerCase()}function s(t){return"string"!=typeof t&&(t=String(t)),t}function l(t){var e={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return r&&(e[Symbol.iterator]=function(){return e}),e}function f(t){this.map={},t instanceof f?t.forEach((function(t,e){this.append(e,t)}),this):Array.isArray(t)?t.forEach((function(t){this.append(t[0],t[1])}),this):t&&Object.getOwnPropertyNames(t).forEach((function(e){this.append(e,t[e])}),this)}function p(t){if(t.bodyUsed)return Promise.reject(new TypeError("Already read"));t.bodyUsed=!0}function h(t){return new Promise((function(e,r){t.onload=function(){e(t.result)},t.onerror=function(){r(t.error)}}))}function d(t){var e=new FileReader,r=h(e);return e.readAsArrayBuffer(t),r}function y(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t)),e.buffer}function v(){return this.bodyUsed=!1,this._initBody=function(t){var r;this.bodyUsed=this.bodyUsed,this._bodyInit=t,t?"string"==typeof t?this._bodyText=t:n&&Blob.prototype.isPrototypeOf(t)?this._bodyBlob=t:o&&FormData.prototype.isPrototypeOf(t)?this._bodyFormData=t:e&&URLSearchParams.prototype.isPrototypeOf(t)?this._bodyText=t.toString():i&&n&&(r=t)&&DataView.prototype.isPrototypeOf(r)?(this._bodyArrayBuffer=y(t.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):i&&(ArrayBuffer.prototype.isPrototypeOf(t)||u(t))?this._bodyArrayBuffer=y(t):this._bodyText=t=Object.prototype.toString.call(t):this._bodyText="",this.headers.get("content-type")||("string"==typeof t?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):e&&URLSearchParams.prototype.isPrototypeOf(t)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},n&&(this.blob=function(){var t=p(this);if(t)return t;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?p(this)||(ArrayBuffer.isView(this._bodyArrayBuffer)?Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset,this._bodyArrayBuffer.byteOffset+this._bodyArrayBuffer.byteLength)):Promise.resolve(this._bodyArrayBuffer)):this.blob().then(d)}),this.text=function(){var t,e,r,n=p(this);if(n)return n;if(this._bodyBlob)return t=this._bodyBlob,r=h(e=new FileReader),e.readAsText(t),r;if(this._bodyArrayBuffer)return Promise.resolve(function(t){for(var e=new Uint8Array(t),r=new Array(e.length),n=0;n-1?n:r),this.mode=e.mode||this.mode||null,this.signal=e.signal||this.signal,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&o)throw new TypeError("Body not allowed for GET or HEAD requests");if(this._initBody(o),!("GET"!==this.method&&"HEAD"!==this.method||"no-store"!==e.cache&&"no-cache"!==e.cache)){var i=/([?&])_=[^&]*/;i.test(this.url)?this.url=this.url.replace(i,"$1_="+(new Date).getTime()):this.url+=(/\?/.test(this.url)?"&":"?")+"_="+(new Date).getTime()}}function m(t){var e=new FormData;return t.trim().split("&").forEach((function(t){if(t){var r=t.split("="),n=r.shift().replace(/\+/g," "),o=r.join("=").replace(/\+/g," ");e.append(decodeURIComponent(n),decodeURIComponent(o))}})),e}function w(t,e){if(!(this instanceof w))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');e||(e={}),this.type="default",this.status=void 0===e.status?200:e.status,this.ok=this.status>=200&&this.status<300,this.statusText=void 0===e.statusText?"":""+e.statusText,this.headers=new f(e.headers),this.url=e.url||"",this._initBody(t)}g.prototype.clone=function(){return new g(this,{body:this._bodyInit})},v.call(g.prototype),v.call(w.prototype),w.prototype.clone=function(){return new w(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new f(this.headers),url:this.url})},w.error=function(){var t=new w(null,{status:0,statusText:""});return t.type="error",t};var O=[301,302,303,307,308];w.redirect=function(t,e){if(-1===O.indexOf(e))throw new RangeError("Invalid status code");return new w(null,{status:e,headers:{location:t}})};var _=t.DOMException;try{new _}catch(t){(_=function(t,e){this.message=t,this.name=e;var r=Error(t);this.stack=r.stack}).prototype=Object.create(Error.prototype),_.prototype.constructor=_}function E(e,r){return new Promise((function(o,a){var u=new g(e,r);if(u.signal&&u.signal.aborted)return a(new _("Aborted","AbortError"));var c=new XMLHttpRequest;function l(){c.abort()}c.onload=function(){var t,e,r={status:c.status,statusText:c.statusText,headers:(t=c.getAllResponseHeaders()||"",e=new f,t.replace(/\r?\n[\t ]+/g," ").split("\r").map((function(t){return 0===t.indexOf("\n")?t.substr(1,t.length):t})).forEach((function(t){var r=t.split(":"),n=r.shift().trim();if(n){var o=r.join(":").trim();e.append(n,o)}})),e)};r.url="responseURL"in c?c.responseURL:r.headers.get("X-Request-URL");var n="response"in c?c.response:c.responseText;setTimeout((function(){o(new w(n,r))}),0)},c.onerror=function(){setTimeout((function(){a(new TypeError("Network request failed"))}),0)},c.ontimeout=function(){setTimeout((function(){a(new TypeError("Network request failed"))}),0)},c.onabort=function(){setTimeout((function(){a(new _("Aborted","AbortError"))}),0)},c.open(u.method,function(e){try{return""===e&&t.location.href?t.location.href:e}catch(t){return e}}(u.url),!0),"include"===u.credentials?c.withCredentials=!0:"omit"===u.credentials&&(c.withCredentials=!1),"responseType"in c&&(n?c.responseType="blob":i&&u.headers.get("Content-Type")&&-1!==u.headers.get("Content-Type").indexOf("application/octet-stream")&&(c.responseType="arraybuffer")),!r||"object"!=typeof r.headers||r.headers instanceof f?u.headers.forEach((function(t,e){c.setRequestHeader(e,t)})):Object.getOwnPropertyNames(r.headers).forEach((function(t){c.setRequestHeader(t,s(r.headers[t]))})),u.signal&&(u.signal.addEventListener("abort",l),c.onreadystatechange=function(){4===c.readyState&&u.signal.removeEventListener("abort",l)}),c.send(void 0===u._bodyInit?null:u._bodyInit)}))}E.polyfill=!0,t.fetch||(t.fetch=E,t.Headers=f,t.Request=g,t.Response=w)}(),function(){"use strict";r.r(n);var t=r(196),e=r.n(t),o=window.ReactDOM,i=r.n(o),a=window.PropTypes,u=r.n(a),c=r(688),s=r(798),l=function(t){t()},f=function(){return l},p=(0,t.createContext)(null);function h(){return h=Object.assign?Object.assign.bind():function(t){for(var e=1;e=0||(o[r]=t[r]);return o}var y=r(679),v=r.n(y),b=r(100),g=["initMapStateToProps","initMapDispatchToProps","initMergeProps"];function m(t,e,r,n,o){var i,a,u,c,s,l=o.areStatesEqual,f=o.areOwnPropsEqual,p=o.areStatePropsEqual,h=!1;return function(o,d){return h?function(o,h){var d,y,v=!f(h,a),b=!l(o,i,h,a);return i=o,a=h,v&&b?(u=t(i,a),e.dependsOnOwnProps&&(c=e(n,a)),s=r(u,c,a)):v?(t.dependsOnOwnProps&&(u=t(i,a)),e.dependsOnOwnProps&&(c=e(n,a)),s=r(u,c,a)):b?(d=t(i,a),y=!p(d,u),u=d,y&&(s=r(u,c,a)),s):s}(o,d):(u=t(i=o,a=d),c=e(n,a),s=r(u,c,a),h=!0,s)}}function w(t){return function(e){var r=t(e);function n(){return r}return n.dependsOnOwnProps=!1,n}}function O(t){return t.dependsOnOwnProps?Boolean(t.dependsOnOwnProps):1!==t.length}function _(t,e){return function(e,r){r.displayName;var n=function(t,e){return n.dependsOnOwnProps?n.mapToProps(t,e):n.mapToProps(t,void 0)};return n.dependsOnOwnProps=!0,n.mapToProps=function(e,r){n.mapToProps=t,n.dependsOnOwnProps=O(t);var o=n(e,r);return"function"==typeof o&&(n.mapToProps=o,n.dependsOnOwnProps=O(o),o=n(e,r)),o},n}}function E(t,e){return function(r,n){throw new Error("Invalid value of type ".concat(typeof t," for ").concat(e," argument when connecting component ").concat(n.wrappedComponentName,"."))}}function j(t,e,r){return h({},r,t,e)}var S={notify(){},get:function(){return[]}};function x(t,e){var r,n=S;function o(){a.onStateChange&&a.onStateChange()}function i(){r||(r=e?e.addNestedSub(o):t.subscribe(o),n=function(){var t=f(),e=null,r=null;return{clear(){e=null,r=null},notify(){t((function(){for(var t=e;t;)t.callback(),t=t.next}))},get(){for(var t=[],r=e;r;)t.push(r),r=r.next;return t},subscribe(t){var n=!0,o=r={callback:t,next:null,prev:r};return o.prev?o.prev.next=o:e=o,function(){n&&null!==e&&(n=!1,o.next?o.next.prev=o.prev:r=o.prev,o.prev?o.prev.next=o.next:e=o.next)}}}}())}var a={addNestedSub:function(t){return i(),n.subscribe(t)},notifyNestedSubs:function(){n.notify()},handleChangeWrapper:o,isSubscribed:function(){return Boolean(r)},trySubscribe:i,tryUnsubscribe:function(){r&&(r(),r=void 0,n.clear(),n=S)},getListeners:function(){return n}};return a}var P="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement?t.useLayoutEffect:t.useEffect;function A(t,e){return t===e?0!==t||0!==e||1/t==1/e:t!=t&&e!=e}function k(t,e){if(A(t,e))return!0;if("object"!=typeof t||null===t||"object"!=typeof e||null===e)return!1;var r=Object.keys(t),n=Object.keys(e);if(r.length!==n.length)return!1;for(var o=0;ot.length)&&(e=t.length);for(var r=0,n=new Array(e);r3&&void 0!==arguments[3]?arguments[3]:{},a=(i.pure,i.areStatesEqual),u=void 0===a?M:a,c=i.areOwnPropsEqual,s=void 0===c?k:c,l=i.areStatePropsEqual,f=void 0===l?k:l,y=i.areMergedPropsEqual,O=void 0===y?k:y,S=i.forwardRef,A=void 0!==S&&S,U=i.context,q=void 0===U?p:U,G=function(t){return t?"function"==typeof t?_(t):E(t,"mapStateToProps"):w((function(){return{}}))}(r),B=function(t){return t&&"object"==typeof t?w((function(e){return function(t,e){var r={},n=function(){var n=t[o];"function"==typeof n&&(r[o]=function(){return e(n.apply(void 0,arguments))})};for(var o in t)n();return r}(t,e)})):t?"function"==typeof t?_(t):E(t,"mapDispatchToProps"):w((function(t){return{dispatch:t}}))}(n),F=function(t){return t?"function"==typeof t?function(t){return function(e,r){r.displayName;var n,o=r.areMergedPropsEqual,i=!1;return function(e,r,a){var u=t(e,r,a);return i?o(u,n)||(n=u):(i=!0,n=u),n}}}(t):E(t,"mergeProps"):function(){return j}}(o),H=Boolean(r);return function(r){var n=r.displayName||r.name||"Component",o="Connect(".concat(n,")"),i={shouldHandleStateChanges:H,displayName:o,wrappedComponentName:n,WrappedComponent:r,initMapStateToProps:G,initMapDispatchToProps:B,initMergeProps:F,areStatesEqual:u,areStatePropsEqual:f,areOwnPropsEqual:s,areMergedPropsEqual:O};function a(n){var o=(0,t.useMemo)((function(){var t=n.reactReduxForwardedRef,e=d(n,R);return[n.context,t,e]}),[n]),a=T(o,3),u=a[0],c=a[1],s=a[2],l=(0,t.useMemo)((function(){return u&&u.Consumer&&(0,b.isContextConsumer)(e().createElement(u.Consumer,null))?u:q}),[u,q]),f=(0,t.useContext)(l),p=Boolean(n.store)&&Boolean(n.store.getState)&&Boolean(n.store.dispatch),y=Boolean(f)&&Boolean(f.store),v=p?n.store:f.store,w=y?f.getServerState:v.getState,O=(0,t.useMemo)((function(){return function(t,e){var r=e.initMapStateToProps,n=e.initMapDispatchToProps,o=e.initMergeProps,i=d(e,g);return m(r(t,i),n(t,i),o(t,i),t,i)}(v.dispatch,i)}),[v]),_=(0,t.useMemo)((function(){if(!H)return N;var t=x(v,p?void 0:f.subscription),e=t.notifyNestedSubs.bind(t);return[t,e]}),[v,p,f]),E=T(_,2),j=E[0],S=E[1],A=(0,t.useMemo)((function(){return p?f:h({},f,{subscription:j})}),[p,f,j]),k=(0,t.useRef)(),M=(0,t.useRef)(s),U=(0,t.useRef)(),G=(0,t.useRef)(!1),B=((0,t.useRef)(!1),(0,t.useRef)(!1)),F=(0,t.useRef)();P((function(){return B.current=!0,function(){B.current=!1}}),[]);var $,z,J,K=(0,t.useMemo)((function(){return function(){return U.current&&s===M.current?U.current:O(v.getState(),s)}}),[v,s]),Y=(0,t.useMemo)((function(){return function(t){return j?function(t,e,r,n,o,i,a,u,c,s,l){if(!t)return function(){};var f=!1,p=null,h=function(){if(!f&&u.current){var t,r,h=e.getState();try{t=n(h,o.current)}catch(t){r=t,p=t}r||(p=null),t===i.current?a.current||s():(i.current=t,c.current=t,a.current=!0,l())}};return r.onStateChange=h,r.trySubscribe(),h(),function(){if(f=!0,r.tryUnsubscribe(),r.onStateChange=null,p)throw p}}(H,v,j,O,M,k,G,B,U,S,t):function(){}}}),[j]);$=D,z=[M,k,G,s,U,S],P((function(){return $.apply(void 0,function(t){if(Array.isArray(t))return I(t)}(t=z)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||L(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}());var t}),undefined);try{J=C(Y,K,w?function(){return O(w(),s)}:K)}catch(t){throw F.current&&(t.message+="\nThe error may be correlated with this previous error:\n".concat(F.current.stack,"\n\n")),t}P((function(){F.current=void 0,U.current=void 0,k.current=J}));var V=(0,t.useMemo)((function(){return e().createElement(r,h({},J,{ref:c}))}),[c,r,J]);return(0,t.useMemo)((function(){return H?e().createElement(l.Provider,{value:A},V):V}),[l,V,A])}var c=e().memo(a);if(c.WrappedComponent=r,c.displayName=a.displayName=o,A){var l=e().forwardRef((function(t,r){return e().createElement(c,h({},t,{reactReduxForwardedRef:r}))}));return l.displayName=o,l.WrappedComponent=r,v()(l,r)}return v()(c,r)}},G=function(r){var n=r.store,o=r.context,i=r.children,a=r.serverState,u=(0,t.useMemo)((function(){var t=x(n);return{store:n,subscription:t,getServerState:a?function(){return a}:void 0}}),[n,a]),c=(0,t.useMemo)((function(){return n.getState()}),[n]);P((function(){var t=u.subscription;return t.onStateChange=t.notifyNestedSubs,t.trySubscribe(),c!==n.getState()&&t.notifyNestedSubs(),function(){t.tryUnsubscribe(),t.onStateChange=void 0}}),[u,c]);var s=o||p;return e().createElement(s.Provider,{value:u},i)};function B(t,e){var r;e=e||[];var n=(t=t||[]).length,o=e.length,i=[];for(r=0;r=arguments.length)?u=e[a]:(u=arguments[o],o+=1),n[a]=u,F(u)||(i-=1),a+=1}return i<=0?r.apply(this,n):$(i,J(t,n,r))}}s.useSyncExternalStoreWithSelector,function(t){C=t}(c.useSyncExternalStore),U=o.unstable_batchedUpdates,l=U;var K=z((function(t,e){return 1===t?H(e):$(t,J(t,[],e))})),Y=K,V=H((function(t){return Y(t.length,(function(){var e=0,r=arguments[0],n=arguments[arguments.length-1],o=Array.prototype.slice.call(arguments,0);return o[0]=function(){var t=r.apply(this,B(arguments,[e,n]));return e+=1,t},t.apply(this,o)}))})),W=V,Z=Array.isArray||function(t){return null!=t&&t.length>=0&&"[object Array]"===Object.prototype.toString.call(t)};function Q(t,e,r){return function(){if(0===arguments.length)return r();var n=arguments[arguments.length-1];if(!Z(n)){for(var o=0;o=0;)ct(e=dt[r],t)&&!vt(n,e)&&(n[n.length]=e),r-=1;return n})):H((function(t){return Object(t)!==t?[]:Object.keys(t)})),gt=H((function(t){return null===t?"Null":void 0===t?"Undefined":Object.prototype.toString.call(t).slice(8,-1)}));function mt(t,e,r,n){var o=at(t);function i(t,e){return wt(t,e,r.slice(),n.slice())}return!ut((function(t,e){return!ut(i,e,t)}),at(e),o)}function wt(t,e,r,n){if(st(t,e))return!0;var o,i,a=gt(t);if(a!==gt(e))return!1;if("function"==typeof t["fantasy-land/equals"]||"function"==typeof e["fantasy-land/equals"])return"function"==typeof t["fantasy-land/equals"]&&t["fantasy-land/equals"](e)&&"function"==typeof e["fantasy-land/equals"]&&e["fantasy-land/equals"](t);if("function"==typeof t.equals||"function"==typeof e.equals)return"function"==typeof t.equals&&t.equals(e)&&"function"==typeof e.equals&&e.equals(t);switch(a){case"Arguments":case"Array":case"Object":if("function"==typeof t.constructor&&"Promise"===(o=t.constructor,null==(i=String(o).match(/^function (\w*)/))?"":i[1]))return t===e;break;case"Boolean":case"Number":case"String":if(typeof t!=typeof e||!st(t.valueOf(),e.valueOf()))return!1;break;case"Date":if(!st(t.valueOf(),e.valueOf()))return!1;break;case"Error":return t.name===e.name&&t.message===e.message;case"RegExp":if(t.source!==e.source||t.global!==e.global||t.ignoreCase!==e.ignoreCase||t.multiline!==e.multiline||t.sticky!==e.sticky||t.unicode!==e.unicode)return!1}for(var u=r.length-1;u>=0;){if(r[u]===t)return n[u]===e;u-=1}switch(a){case"Map":return t.size===e.size&&mt(t.entries(),e.entries(),r.concat([t]),n.concat([e]));case"Set":return t.size===e.size&&mt(t.values(),e.values(),r.concat([t]),n.concat([e]));case"Arguments":case"Array":case"Object":case"Boolean":case"Number":case"String":case"Date":case"Error":case"RegExp":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"ArrayBuffer":break;default:return!1}var c=bt(t);if(c.length!==bt(e).length)return!1;var s=r.concat([t]),l=n.concat([e]);for(u=c.length-1;u>=0;){var f=c[u];if(!ct(f,e)||!wt(e[f],t[f],s,l))return!1;u-=1}return!0}var Ot=z((function(t,e){return wt(t,e,[],[])}));function _t(t,e,r){var n,o;if("function"==typeof t.indexOf)switch(typeof e){case"number":if(0===e){for(n=1/e;r=0}function jt(t,e){for(var r=0,n=e.length,o=Array(n);r":Dt(r,n)},n=function(t,e){return jt((function(e){return St(e)+": "+r(t[e])}),e.slice().sort())};switch(Object.prototype.toString.call(t)){case"[object Arguments]":return"(function() { return arguments; }("+jt(r,t).join(", ")+"))";case"[object Array]":return"["+jt(r,t).concat(n(t,Nt((function(t){return/^\d+$/.test(t)}),bt(t)))).join(", ")+"]";case"[object Boolean]":return"object"==typeof t?"new Boolean("+r(t.valueOf())+")":t.toString();case"[object Date]":return"new Date("+(isNaN(t.valueOf())?r(NaN):St(Pt(t)))+")";case"[object Map]":return"new Map("+r(Array.from(t))+")";case"[object Null]":return"null";case"[object Number]":return"object"==typeof t?"new Number("+r(t.valueOf())+")":1/t==-1/0?"-0":t.toString(10);case"[object Set]":return"new Set("+r(Array.from(t).sort())+")";case"[object String]":return"object"==typeof t?"new String("+r(t.valueOf())+")":St(t);case"[object Undefined]":return"undefined";default:if("function"==typeof t.toString){var o=t.toString();if("[object Object]"!==o)return o}return"{"+n(t,bt(t)).join(", ")+"}"}}var Mt=H((function(t){return Dt(t,[])})),Ut=z((function(t,e){if(t===e)return e;function r(t,e){if(t>e!=e>t)return e>t?e:t}var n=r(t,e);if(void 0!==n)return n;var o=r(typeof t,typeof e);if(void 0!==o)return o===typeof t?t:e;var i=Mt(t),a=r(i,Mt(e));return void 0!==a&&a===i?t:e})),qt=function(){function t(t,e){this.xf=e,this.f=t}return t.prototype["@@transducer/init"]=tt,t.prototype["@@transducer/result"]=et,t.prototype["@@transducer/step"]=function(t,e){return this.xf["@@transducer/step"](t,this.f(e))},t}(),Gt=z(Q(["fantasy-land/map","map"],(function(t){return function(e){return new qt(t,e)}}),(function(t,e){switch(Object.prototype.toString.call(e)){case"[object Function]":return Y(e.length,(function(){return t.call(this,e.apply(this,arguments))}));case"[object Object]":return At((function(r,n){return r[n]=t(e[n]),r}),{},bt(e));default:return jt(t,e)}}))),Bt=Gt,Ft=Number.isInteger||function(t){return t<<0===t};function Ht(t){return"[object String]"===Object.prototype.toString.call(t)}var $t=z((function(t,e){var r=t<0?e.length+t:t;return Ht(e)?e.charAt(r):e[r]})),zt=z((function(t,e){if(null!=e)return Ft(t)?$t(t,e):e[t]})),Jt=z((function(t,e){return Bt(zt(t),e)}));function Kt(t){return function e(r,n,o){switch(arguments.length){case 0:return e;case 1:return F(r)?e:z((function(e,n){return t(r,e,n)}));case 2:return F(r)&&F(n)?e:F(r)?z((function(e,r){return t(e,n,r)})):F(n)?z((function(e,n){return t(r,e,n)})):H((function(e){return t(r,n,e)}));default:return F(r)&&F(n)&&F(o)?e:F(r)&&F(n)?z((function(e,r){return t(e,r,o)})):F(r)&&F(o)?z((function(e,r){return t(e,n,r)})):F(n)&&F(o)?z((function(e,n){return t(r,e,n)})):F(r)?H((function(e){return t(e,n,o)})):F(n)?H((function(e){return t(r,e,o)})):F(o)?H((function(e){return t(r,n,e)})):t(r,n,o)}}}var Yt=H((function(t){return!!Z(t)||!!t&&"object"==typeof t&&!Ht(t)&&(0===t.length||t.length>0&&t.hasOwnProperty(0)&&t.hasOwnProperty(t.length-1))})),Vt="undefined"!=typeof Symbol?Symbol.iterator:"@@iterator";function Wt(t,e,r){return function(n,o,i){if(Yt(i))return t(n,o,i);if(null==i)return o;if("function"==typeof i["fantasy-land/reduce"])return e(n,o,i,"fantasy-land/reduce");if(null!=i[Vt])return r(n,o,i[Vt]());if("function"==typeof i.next)return r(n,o,i);if("function"==typeof i.reduce)return e(n,o,i,"reduce");throw new TypeError("reduce: list must be array or iterable")}}function Zt(t,e,r){for(var n=0,o=r.length;n1){var i=!ve(n)&&ct(o,n)&&"object"==typeof n[o]?n[o]:Ft(e[1])?[]:{};r=t(Array.prototype.slice.call(e,1),r,i)}return function(t,e,r){if(Ft(t)&&Z(r)){var n=[].concat(r);return n[t]=e,n}var o={};for(var i in r)o[i]=r[i];return o[t]=e,o}(o,r,n)})),ge=Kt((function(t,e,r){return be([t],e,r)}));function me(t){return function e(r){for(var n,o,i,a=[],u=0,c=r.length;u=0&&this.i>=this.n?X(r):r},t}();function Ge(t){return function(e){return new qe(t,e)}}var Be=z(Q(["take"],Ge,(function(t,e){return Se(0,t<0?1/0:t,e)}))),Fe=H((function(t){return null!=t&&"function"==typeof t["fantasy-land/empty"]?t["fantasy-land/empty"]():null!=t&&null!=t.constructor&&"function"==typeof t.constructor["fantasy-land/empty"]?t.constructor["fantasy-land/empty"]():null!=t&&"function"==typeof t.empty?t.empty():null!=t&&null!=t.constructor&&"function"==typeof t.constructor.empty?t.constructor.empty():Z(t)?[]:Ht(t)?"":Tt(t)?{}:pt(t)?function(){return arguments}():(e=t,"[object Uint8ClampedArray]"===(r=Object.prototype.toString.call(e))||"[object Int8Array]"===r||"[object Uint8Array]"===r||"[object Int16Array]"===r||"[object Uint16Array]"===r||"[object Int32Array]"===r||"[object Uint32Array]"===r||"[object Float32Array]"===r||"[object Float64Array]"===r||"[object BigInt64Array]"===r||"[object BigUint64Array]"===r?t.constructor.from(""):void 0);var e,r})),He=Fe,$e=z((function t(e,r){if(!Tt(r)&&!Z(r))return r;var n,o,i,a=r instanceof Array?[]:{};for(o in r)i=typeof(n=e[o]),a[o]="function"===i?n(r[o]):n&&"object"===i?t(n,r[o]):r[o];return a})),ze=function(){function t(t,e){this.xf=e,this.f=t,this.found=!1}return t.prototype["@@transducer/init"]=tt,t.prototype["@@transducer/result"]=function(t){return this.found||(t=this.xf["@@transducer/step"](t,void 0)),this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,e){return this.f(e)&&(this.found=!0,t=X(this.xf["@@transducer/step"](t,e))),t},t}();function Je(t){return function(e){return new ze(t,e)}}var Ke=z(Q(["find"],Je,(function(t,e){for(var r=0,n=e.length;r=0?t:r.length;var n=Array.prototype.slice.call(r,0);return n.splice(t,0,e),n})),pr=function(){function t(t,e){this.xf=e,this.f=t,this.set=new Ce}return t.prototype["@@transducer/init"]=tt,t.prototype["@@transducer/result"]=et,t.prototype["@@transducer/step"]=function(t,e){return this.set.add(this.f(e))?this.xf["@@transducer/step"](t,e):t},t}();function hr(t){return function(e){return new pr(t,e)}}var dr=z(Q([],hr,(function(t,e){for(var r,n,o=new Ce,i=[],a=0;at.length)&&(e=t.length);for(var r=0,n=new Array(e);r2&&void 0!==arguments[2]?arguments[2]:[],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;if(Array.isArray(e))e.forEach((function(e,i){if(o){var a=Qe((function(t){return sr("{}",t)}),o);if(-1!==a){var u=Se(0,a,o),c=Se(a,o.length,o);if(u.length)t(jr(u,e),r,Pe(n,Pe([i],u)),c);else{var s,l=c.map((function(t){return t.replace("{}","")})).filter((function(t){return t})),f=Pe([i],l);for(var p in s=l.length?jr(l,e):e){var h=s[p];t(h,r,Pe(n,f.concat([p])))}}}else t(jr(o,e),r,Pe(n,Pe([i],o)))}else t(e,r,de(i,n))}));else if("Object"===gt(e)){r(e,n);var i=jr(Rn,e);if(i){var a=Pe(n,Rn);t(i,r,a)}zr([],[e.namespace,e.type],window.__dashprivate_childrenProps).forEach((function(o){if(o.includes("[]")){var i=function(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,a,u=[],c=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(s)throw o}}return u}}(t,e)||Tn(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(o.split("[]").map((function(t){return t.split(".").filter((function(t){return t}))})),2),a=i[0],u=i[1],c=Pe(["props"],a),s=Pe(n,c);t(jr(c,e),r,s,u)}else if(o.includes("{}")){for(var l=o.split("."),f=[],p=[],h=!1,d=0;d-1&&r.splice(n,1)}}},{key:"emit",value:function(t){for(var e=this,r=arguments.length,n=new Array(r>1?r-1:0),o=1;ot.length)&&(e=t.length);for(var r=0,n=new Array(e);ro?1:ne?1:t=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}(e);try{for(u.s();!(r=u.n()).done;){var c=r.value,s=c.id;if(c.property===o&&"string"!=typeof s&&Ot(bt(s).sort(),i)&&it(uo,sn(a,Zr(i,s))))return c}}catch(t){u.e(t)}finally{u.f()}return!1}function so(t,e){var r=new Sn.f,n={},o=Bt($e({id:to})),i=Bt((function(t){var e,r=t.output,n=$e({inputs:o,state:o},t);return n.outputs=Bt((function(t){return ge("out",!0,Xn(t))}),$n(r)?(e=r).substr(2,e.length-4).split("..."):[r]),n}),t),a=!1;!function(t,e){var r={},n=[];t.forEach((function(t){var o=t.inputs,i=t.outputs,a=t.state,u=!0;1!==i.length||i[0].id||i[0].property||(u=!1,e("A callback is missing Outputs",["Please provide an output for this callback:",JSON.stringify(t,null,2)]));var c="In the callback for output(s):\n "+i.map(Po).join("\n ");o.length||e("A callback is missing Inputs",[c,"there are no `Input` elements.","Without `Input` elements, it will never get called.","","Subscribing to `Input` components will cause the","callback to be called whenever their values change."]),[[i,"Output"],[o,"Input"],[a,"State"]].forEach((function(t){var r=Bn(t,2),n=r[0],o=r[1];("Output"!==o||u)&&(Array.isArray(n)||e("Callback ".concat(o,"(s) must be an Array"),[c,"For ".concat(o,"(s) we found:"),JSON.stringify(n),"but we expected an Array."]),n.forEach((function(t,r){!function(t,e,r,n,o){var i=t.id,a=t.property;if("string"==typeof a&&a||o("Callback property error",[e,"".concat(r,"[").concat(n,"].property = ").concat(JSON.stringify(a)),"but we expected `property` to be a non-empty string."]),"object"==typeof i)mr(i)&&o("Callback item missing ID",[e,"".concat(r,"[").concat(n,"].id = {}"),"Every item linked to a callback needs an ID"]),nr((function(t,i){i||o("Callback wildcard ID error",[e,"".concat(r,"[").concat(n,'].id has key "').concat(i,'"'),"Keys must be non-empty strings."]),"object"==typeof t&&t.wild?Vn[r][t.wild]!==t&&o("Callback wildcard ID error",[e,"".concat(r,"[").concat(n,'].id["').concat(i,'"] = ').concat(t.wild),"Allowed wildcards for ".concat(r,"s are:"),bt(Vn[r]).join(", ")]):sr(typeof t,Wn)||o("Callback wildcard ID error",[e,"".concat(r,"[").concat(n,'].id["').concat(i,'"] = ').concat(JSON.stringify(t)),"Wildcard callback ID values must be either wildcards","or constants of one of these types:",Wn.join(", ")])}),i);else if("string"==typeof i){i||o("Callback item missing ID",[e,"".concat(r,"[").concat(n,'].id = "').concat(i,'"'),"Every item linked to a callback needs an ID"]);var u=Zn.filter((function(t){return sr(t,i)}));u.length&&o("Callback invalid ID string",[e,"".concat(r,"[").concat(n,"].id = '").concat(i,"'"),"characters '".concat(u.join("', '"),"' are not allowed.")])}else o("Callback ID type error",[e,"".concat(r,"[").concat(n,"].id = ").concat(JSON.stringify(i)),"IDs must be strings or wildcard-compatible objects."])}(t,c,o,r,e)})))})),function(t,e,r,n,o){var i={},a=[];t.forEach((function(t,u){var c=t.id,s=t.property;if("string"==typeof c){var l=Po({id:c,property:s});i[l]?r("Duplicate callback Outputs",[e,"Output ".concat(u," (").concat(l,") is already used by this callback.")]):n[l]?r("Duplicate callback outputs",[e,"Output ".concat(u," (").concat(l,") is already in use."),"To resolve this, set `allow_duplicate=True` on","duplicate outputs, or combine the outputs into","one callback function, distinguishing the trigger","by using `dash.callback_context` if necessary."]):i[l]=1}else{var f={id:c,property:s},p=co(f,a),h=p||co(f,o);if(p||h){var d=Po(f),y=Po(p||h);r("Overlapping wildcard callback outputs",[e,"Output ".concat(u," (").concat(d,")"),"overlaps another output (".concat(y,")"),"used in ".concat(p?"this":"a different"," callback.")])}else a.push(f)}})),bt(i).forEach((function(t){n[t]=1})),a.forEach((function(t){o.push(t)}))}(i,c,e,r,n),function(t,e,r,n,o){var i=lo(t[0].id).matchKeys;t.forEach((function(e,r){r&&!Ot(lo(e.id).matchKeys,i)&&o("Mismatched `MATCH` wildcards across `Output`s",[n,"Output ".concat(r," (").concat(Po(e),")"),"does not have MATCH wildcards on the same keys as","Output 0 (".concat(Po(t[0]),")."),"MATCH wildcards must be on the same keys for all Outputs.","ALL wildcards need not match, only MATCH."])})),[[e,"Input"],[r,"State"]].forEach((function(e){var r=Bn(e,2),a=r[0],u=r[1];a.forEach((function(e,r){var a=lo(e.id),c=a.matchKeys,s=a.allsmallerKeys,l=c.concat(s),f=Ne(l,i);f.length&&(f.sort(),o("`Input` / `State` wildcards not in `Output`s",[n,"".concat(u," ").concat(r," (").concat(Po(e),")"),"has MATCH or ALLSMALLER on key(s) ".concat(f.join(", ")),"where Output 0 (".concat(Po(t[0]),")"),"does not have a MATCH wildcard. Inputs and State do not","need every MATCH from the Output(s), but they cannot have","extras beyond the Output(s)."]))}))}))}(i,o,a,c,e)}))}(i,(function(t,r){a=!0,e(t,r)}));var u={},c={},s={},l={},f={MultiGraph:r,outputMap:u,inputMap:c,outputPatterns:s,inputPatterns:l,callbacks:i};if(a)return f;function p(t,e){var r=[{}];return nr((function(t,o){var i=n[o].vals,a=i.indexOf(e[o]),u=[t];t&&t.wild&&(u=t===Kn?a>0?i.slice(0,a):[]:-1===a||t===zn?i:[e[o]]),r=he(he([ge(o)],u),r)}),t),r}i.forEach((function(t){var e=t.outputs,r=t.inputs;e.concat(r).forEach((function(t){var e=t.id;"object"==typeof e&&nr((function(t,e){n[e]||(n[e]={exact:[],expand:0});var r=n[e];t&&t.wild?t.expand&&(r.expand+=1):-1===r.exact.indexOf(t)&&r.exact.push(t)}),e)}))})),nr((function(t){var e=t.exact,r=t.expand,n=e.slice().sort(ro);if(r)for(var o=0;o2&&void 0!==arguments[2])||arguments[2];r.addNode(t),r.addDependency(t,e),n&&(y[y.length-1].push(t),v[v.length-1].push(e))}return i.forEach((function(t){var e=t.outputs,n=t.inputs;function o(t,e){r.addNode(e),n.forEach((function(r){var n=r.id,o=r.property;"object"==typeof n?p(n,t).forEach((function(t){b(Po({id:t,property:o}),e)})):b(Po(r),e)}))}y.push([]),v.push([]);var i=lo(e[0].id).matchKeys,a=Qe((function(t){return!ho(t.id)}),e),f=Mr({matchKeys:i,firstSingleOutput:a,outputs:e},t);e.forEach((function(t){var e=t.id,r=t.property,i=function(t,e){var r=t.id,n=t.property;return e.some((function(e){var o=e.id,i=e.property;if(n!==i||typeof r!=typeof o)return!1;if("string"==typeof r){if(r===o)return!0}else if(co(e,[t]))return!0;return!1}))}(t,n);if("object"==typeof e)p(e,{}).forEach((function(t){var e={id:t,property:r},n=Po(e);i&&(d.push(e),n+=h),o(t,n)})),ao(s,e,r,f);else{var a=Po(t);i&&(d.push(t),a+=h),o({},a),io(u,e,r,f)}})),n.forEach((function(t){var e=t.id,r=t.property;"object"==typeof e?ao(l,e,r,f):io(c,e,r,f)}))})),d.forEach((function(t){for(var e=Po(t),r=e.concat(h),n=0;nt.length)&&(e=t.length);for(var r=0,n=new Array(e);r5&&void 0!==arguments[5])||arguments[5],a=[],u=Po({id:r,property:n});if("string"==typeof r){var c=(t.inputMap[r]||{})[n];if(!c)return[];c.forEach(bo(Do(),e,a))}else{var s=Object.keys(r).sort(),l=Zr(s,r),f=s.join(","),p=(t.inputPatterns[f]||{})[n];if(!p)return[];p.forEach((function(t){fo(s,l,t.values)&&t.callbacks.forEach(bo(Do(s,l,t.values),e,a))}))}return a.forEach((function(r){r.changedPropIds[u]=o||jo,i&&(r.priority=ko(t,e,r))})),a}function ko(t,e,r){for(var n=[r],o={},i={},a=[];n.length;){n=Rt((function(t){var e=i[t.resolvedId];return i[t.resolvedId]=!0,e}),n);var u=Rt((function(t){return!o[Po(t)]}),Xe(Bt((function(t){return Xe(t.getOutputs(e))}),n)));u.forEach((function(t){return o[Po(t)]=!0})),(n=Xe(Bt((function(r){var n=r.id,o=r.property;return Ao(t,e,n,o,So,!1)}),u))).length&&a.push(n.length)}return a.unshift(a.length),Bt((function(t){return Math.min(t,35).toString(36)}),a).join("")}var To=function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(!e.length)return[];var o=Bt(Po,ie((function(e,r){return Pe(e,Xe(r.getOutputs(t)))}),[],r)),i={};if(o.forEach((function(t){return i[t]=!0})),Object.keys(n).length){var a=Xe(Bt((function(e){return function(t,e,r){for(var n=[r],o={};n.length;){var i=Rt((function(t){return!o[Po(t)]}),Xe(Bt((function(t){return Xe(t.getOutputs(e))}),n)));o=ie((function(t,e){return ge(Po(e),!0,t)}),o,i),n=Xe(Bt((function(r){var n=r.id,o=r.property;return Ao(t,e,n,o,So,!1)}),i))}return o}(n,t,e)}),r));a.length>0&&(i=Object.assign.apply(Object,[a[0]].concat(Oo(a))))}return Rt((function(e){return it((function(t){return!i[Po(t)]}),Ne(Xe(e.getInputs(t)),Xe(e.getOutputs(t))))}),e)},Lo=function(t,e,r,n){for(var o=[],i=function(t,e,r,n){var o=n.outputsOnly,i=n.removedArrayInputsOnly,a=n.newPaths,u=n.chunkPath,c={},s=[];function l(t){if(t){var e=c[t.resolvedId];if(void 0!==e){var r=s[e];r.changedPropIds=xo(r.changedPropIds,t.changedPropIds),t.initialCall&&(r.initialCall=!0)}else c[t.resolvedId]=s.length,s.push(t)}}function f(r,n,c){if(n)for(var s in n){var f=yo(t,0,r,s);f&&(f.callback.prevent_initial_call||(f.initialCall=!0,l(f)))}if(!o&&c){var p=i?(y=eo(r),function(t){return t.getInputs(e).some((function(e){return!(!Array.isArray(e)||!e.some((function(t){return eo(t.id)===y}))||(Xe(t.getOutputs(a)).length&&(t.initialCall=!0,t.changedPropIds={},l(t)),0))}))}):l,h=p;for(var d in u&&(h=function(t){it(on(u),Jt("path",Xe(t.getOutputs(e))))||p(t)}),c)Ao(t,e,r,d,So).forEach(h)}var y}return Cn(r,(function(e){var r=jr(["props","id"],e);if(r)if("string"!=typeof r||i){var n=Object.keys(r).sort().join(",");f(r,!i&&t.outputPatterns[n],t.inputPatterns[n])}else f(r,t.outputMap[r],t.inputMap[r])})),Bt((function(r){return Gn(Gn({},r),{},{priority:ko(t,e,r)})}),s)}(t,e,r,n);;){var a=wo(Hr((function(t){var r=t.callback.inputs,n=t.getInputs;return it(ho,r)||!mr(Ne(Bt(Po,Xe(n(e))),o))}),i),2),u=a[0],c=a[1];if(!c.length)break;i=u,o=Pe(o,Bt(Po,Xe(Bt((function(t){return(0,t.getOutputs)(e)}),c))))}if(n.filterRoot){var s=jr(["props","id"],r);s&&(s=eo(s),i=i.filter((function(t){return t.callback.inputs.reduce((function(t,e){return t||eo(e.id)==s&&n.filterRoot.includes(e.property)}),!1)})))}var l=Math.random().toString(16);return Bt((function(t){return mo(mo({},t),{},{executionGroup:l})}),i)},Io=function(t){var e=t.anyVals,r=t.callback,n=r.inputs,o=r.outputs,i=r.state;return Pe(Bt(Po,[].concat(Oo(n),Oo(o),Oo(i))),Array.isArray(e)?e:""===e?[]:[e]).join(",")};function Ro(t,e,r,n){return Xe(Bt((function(e){return Ao(r,n,t,e)}),bt(e)))}var Co=function(t,e,r){return{callback:t,anyVals:r,resolvedId:t.output+r,getOutputs:function(r){return t.outputs.map(e(r))},getInputs:function(r){return t.inputs.map(e(r))},getState:function(r){return t.state.map(e(r))},changedPropIds:{},initialCall:!1}};function No(t,e){var r=wo(Hr((function(t){var r=t.getOutputs,n=t.callback.outputs;return Xe(r(e)).length===n.length}),t),2)[1],n=wo(Hr((function(t){var r=t.getOutputs;return!Xe(r(e)).length}),r),2)[1];return{added:Bt((function(t){return ge("changedPropIds",Kr((function(t,r){return Mn(e,Xn(r).id)}),t.changedPropIds),t)}),n),removed:r}}function Do(t,e,r){return function(n){return function(o){var i=o.id,a=o.property;if("string"==typeof i){var u=Mn(n,i);return u?[{id:i,property:a,path:u}]:[]}var c=Object.keys(i).sort(),s=Zr(c,i),l=c.join(","),f=n.objs[l];if(!f)return[];var p=[];return f.forEach((function(n){var o=n.values,i=n.path;fo(c,o,s,t,e,r)&&p.push({id:ln(c,o),property:a,path:i})})),p}}}var Mo={ON_PROP_CHANGE:1,SET_REQUEST_QUEUE:1,SET_GRAPHS:1,SET_PATHS:1,SET_LAYOUT:1,SET_APP_LIFECYCLE:1,SET_CONFIG:1,ADD_HTTP_HEADERS:1,ON_ERROR:1,SET_HOOKS:1},Uo=function(t){if(Mo[t])return t;throw new Error("".concat(t," is not defined."))},qo=1;function Go(t){var e={STARTED:"STARTED",HYDRATED:"HYDRATED",DESTROYED:"DESTROYED"};if(e[t])return e[t];throw new Error("".concat(t," is not a valid app state."))}var Bo,Fo,Ho=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Go("STARTED"),e=arguments.length>1?arguments[1]:void 0;return e.type===Uo("SET_APP_LIFECYCLE")?Go(e.payload):t};function $o(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function zo(t){for(var e=1;e1?arguments[1]:void 0;return ie((function(t,e){return null===e?t:e.type===Fo.AddCompleted?function(t,e){return zo(zo({},t),{},{completed:t.completed+e.payload})}(t,e):function(t,e){var r=Ko[e.type],n=Yo[e.type];return r&&n&&0!==e.payload.length?zo(zo({},t),{},{[n]:r(t[n],e.payload)}):t}(t,e)}),arguments.length>0&&void 0!==arguments[0]?arguments[0]:Jo,t.type===Fo.Aggregate?t.payload:[t])};function Wo(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=arguments.length>1?arguments[1]:void 0;return e.type===Uo("SET_CONFIG")?(window.__dashprivate_childrenProps=Nr(window.__dashprivate_childrenProps||{},e.payload.children_props),e.payload):e.type===Uo("ADD_HTTP_HEADERS")?Nr(t,{fetch:{headers:e.payload}}):t}var Zo={},Qo=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Zo,e=arguments.length>1?arguments[1]:void 0;return"SET_GRAPHS"===e.type?e.payload:t};function Xo(t){return function(t){if(Array.isArray(t))return ti(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return ti(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?ti(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ti(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r0&&void 0!==arguments[0]?arguments[0]:ei,e=arguments.length>1?arguments[1]:void 0;switch(e.type){case"ON_ERROR":var r=t.frontEnd,n=t.backEnd,o=t.backEndConnected;return console.error(e.payload.error),"frontEnd"===e.payload.type?{frontEnd:[Mr(e.payload,{timestamp:new Date})].concat(Xo(r)),backEnd:n,backEndConnected:o}:"backEnd"===e.payload.type?{frontEnd:r,backEnd:[Mr(e.payload,{timestamp:new Date})].concat(Xo(n)),backEndConnected:o}:t;case"SET_CONNECTION_STATUS":return Mr(t,{backEndConnected:e.payload});default:return t}}function ni(t){return function(t){if(Array.isArray(t))return oi(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return oi(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?oi(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function oi(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r0&&void 0!==arguments[0]?arguments[0]:ii;switch((arguments.length>1?arguments[1]:void 0).type){case"UNDO":var e=t.past,r=t.present,n=t.future,o=e[e.length-1];return{past:e.slice(0,e.length-1),present:o,future:[r].concat(ni(n))};case"REDO":var i=t.past,a=t.present,u=t.future,c=u[0],s=u.slice(1);return{past:[].concat(ni(i),[a]),present:c,future:s};case"REVERT":var l=t.past,f=t.future,p=l[l.length-1];return{past:l.slice(0,l.length-1),present:p,future:ni(f)};default:return t}},ui=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{layout_pre:null,layout_post:null,request_pre:null,request_post:null,callback_resolved:null,request_refresh_jwt:null,bear:!1},e=arguments.length>1?arguments[1]:void 0;return"SET_HOOKS"===e.type?e.payload:t},ci="JWT Expired",si={OK:200,PREVENT_UPDATE:204,BAD_REQUEST:400,UNAUTHORIZED:401,CLIENTSIDE_ERROR:"CLIENTSIDE_ERROR",NO_RESPONSE:"NO_RESPONSE"},li={[si.OK]:"SUCCESS",[si.PREVENT_UPDATE]:"NO_UPDATE"},fi=["__dash_client","__dash_server","__dash_upload","__dash_download"];var pi,hi={count:0,total:0,compute:0,network:{time:0,upload:0,download:0},resources:{},status:{latest:null},result:{}},di={updated:[],resources:{},callbacks:{},graphLayout:null},yi=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:di,e=arguments.length>1?arguments[1]:void 0;if("UPDATE_RESOURCE_USAGE"===e.type){var r=e.payload,n=r.id,o=r.usage,i=r.status,a=li[i]||i,u={updated:[n],resources:t.resources,callbacks:t.callbacks,graphLayout:t.graphLayout};u.callbacks[n]=u.callbacks[n]||_e(hi);var c=u.callbacks[n],s=c.resources,l=u.resources;if(c.count+=1,c.status.latest=a,c.status[a]=(c.status[a]||0)+1,c.result=e.payload.result,c.inputs=e.payload.inputs,c.state=e.payload.state,o){var f=o.__dash_client,p=o.__dash_server,h=o.__dash_upload,d=o.__dash_download,y=function(t,e){if(null==t)return{};var r,n,o=function(t,e){if(null==t)return{};var r,n,o={},i=Object.keys(t);for(n=0;n=0||(o[r]=t[r]);return o}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}(o,fi);for(var v in c.total+=f,c.compute+=p,c.network.time+=f-p,c.network.upload+=h,c.network.download+=d,y)y.hasOwnProperty(v)&&(s[v]=(s[v]||0)+y[v],l[v]=(l[v]||0)+y[v])}return u}return t},vi={id:null,props:{}},bi=function(){return arguments.length>0&&void 0!==arguments[0]?arguments[0]:vi};!function(t){t.Set="IsLoading.Set"}(pi||(pi={}));var gi,mi=function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],e=arguments.length>1?arguments[1]:void 0;return e.type===pi.Set?e.payload:t},wi=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;if(e.type===Uo("SET_LAYOUT"))return e.payload;if(sr(e.type,["UNDO_PROP_CHANGE","REDO_PROP_CHANGE",Uo("ON_PROP_CHANGE")])){var r=de("props",e.payload.itempath),n=cn(Sr(r),t),o=Mr(n,e.payload.props);return be(r,o,t)}return t};!function(t){t.Set="LoadingMap.Set"}(gi||(gi={}));var Oi={},_i=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Oi,e=arguments.length>1?arguments[1]:void 0;return e.type===gi.Set?e.payload:t},Ei={strs:{},objs:{}},ji=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Ei,e=arguments.length>1?arguments[1]:void 0;return e.type===Uo("SET_PATHS")?e.payload:t},Si=function(t,e){return ge(t.jobId,t,e)},xi=function(t,e){return Ue(t,e)},Pi=function(t,e){return be([t,"outdated"],!0,e)};function Ai(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;switch(e.type){case"ADD_CALLBACK_JOB":return Si(e.payload,t);case"REMOVE_CALLBACK_JOB":return xi(e.payload.jobId,t);case"CALLBACK_JOB_OUTDATED":return Pi(e.payload.jobId,t);default:return t}}function ki(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0,n=t;if(e.type===r){var o=e.payload,i=o.id,a={status:o.status,content:o.content};n=Array.isArray(i)?be(i,a,t):i?ge(i,a,t):Mr(t,a)}return n})}),Ti),t.callbackJobs=Ai,function(t){for(var e=Object.keys(t),r={},n=0;n1?r-1:0),o=1;o=0;--i){var a=this.tryEntries[i],u=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var c=n.call(a,"catchLoc"),s=n.call(a,"finallyLoc");if(c&&s){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),k(r),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;k(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:L(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),v}},e}function Vi(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}var Wi=Ji(Uo("ON_ERROR")),Zi=Ji(Uo("SET_APP_LIFECYCLE")),Qi=Ji(Uo("SET_CONFIG")),Xi=Ji(Uo("ADD_HTTP_HEADERS")),ta=Ji(Uo("SET_GRAPHS")),ea=Ji(Uo("SET_HOOKS")),ra=Ji(Uo("SET_LAYOUT")),na=Ji(Uo("SET_PATHS")),oa=(Ji(Uo("SET_REQUEST_QUEUE")),Ji(Uo("ON_PROP_CHANGE"))),ia=function(t){return function(e,r){return t(Wi({type:"backEnd",error:{message:e,html:r.join("\n")}}))}};var aa=Fr(console.warn);function ua(){try{return{"X-CSRFToken":Ki.parse(document.cookie)._csrf_token}}catch(t){return aa(t),{}}}var ca=fa("REDO"),sa=fa("UNDO"),la=fa("REVERT");function fa(t){return function(e,r){var n=r(),o=n.history,i=n.paths;e(Ji(t)());var a=("REDO"===t?o.future[0]:o.past[o.past.length-1])||{},u=a.id,c=a.props;u&&(e(Ji("UNDO_PROP_CHANGE")({itempath:Mn(i,u),props:c})),e(pa({id:u,props:c})))}}function pa(t){var e=t.id,r=t.props;return function(){var t=function(t){return function(){var e=this,r=arguments;return new Promise((function(n,o){var i=t.apply(e,r);function a(t){Vi(i,n,o,a,u,"next",t)}function u(t){Vi(i,n,o,a,u,"throw",t)}a(void 0)}))}}(Yi().mark((function t(n,o){var i,a,u;return Yi().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:i=o(),a=i.graphs,u=i.paths,n(qa(Ro(e,r,a,u)));case 2:case"end":return t.stop()}}),t)})));return function(e,r){return t.apply(this,arguments)}}()}function ha(t,e,r){if(t&&"function"==typeof t.text)t.text().then((function(t){r(Wi({type:"backEnd",error:{message:e,html:t}}))}));else{var n=t instanceof Error?t:{message:e,html:t};r(Wi({type:"backEnd",error:n}))}}function da(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function ya(t){for(var e=1;e=0;--i){var a=this.tryEntries[i],u=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var c=n.call(a,"catchLoc"),s=n.call(a,"finallyLoc");if(c&&s){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),k(r),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;k(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:L(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),v}},e}function Oa(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}var _a=Fr(console.warn),Ea={GET:function(t,e){return fetch(t,Nr(e,{method:"GET",headers:ua()}))},POST:function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return fetch(t,Nr(e,{method:"POST",headers:ua(),body:r?JSON.stringify(r):null}))}};function ja(t,e,r,n,o){return function(){var i=function(t){return function(){var e=this,r=arguments;return new Promise((function(n,o){var i=t.apply(e,r);function a(t){Oa(i,n,o,a,u,"next",t)}function u(t){Oa(i,n,o,a,u,"throw",t)}a(void 0)}))}}(wa().mark((function i(a,u){var c,s,l,f,p,h,d,y,v,b,g;return wa().wrap((function(i){for(;;)switch(i.prev=i.next){case 0:h=function(t){u().error.backEndConnected!==t&&a({type:"SET_CONNECTION_STATUS",payload:t})},c=u(),s=c.config,l=c.hooks,f=null,p="".concat(In(s)).concat(t),a({type:r,payload:{id:n,status:"loading"}}),i.prev=5,y=0;case 7:if(!(y<=qo)){i.next=36;break}return i.prev=8,i.next=11,Ea[e](p,s.fetch,o);case 11:d=i.sent,i.next=19;break;case 14:return i.prev=14,i.t0=i.catch(8),console.log("fetch error",d),h(!1),i.abrupt("return");case 19:if(d.status!==si.UNAUTHORIZED&&d.status!==si.BAD_REQUEST){i.next=32;break}if(!l.request_refresh_jwt){i.next=32;break}return i.next=23,d.text();case 23:if(!i.sent.includes(ci)){i.next=32;break}return i.next=27,l.request_refresh_jwt(s.fetch.headers.Authorization.substr(7));case 27:if(!(v=i.sent)){i.next=32;break}return f={Authorization:"Bearer ".concat(v)},s=Nr(s,{fetch:{headers:f}}),i.abrupt("continue",33);case 32:return i.abrupt("break",36);case 33:y++,i.next=7;break;case 36:if(b=d.headers.get("content-type"),f&&a(Xi(f)),h(!0),!b||-1===b.indexOf("application/json")){i.next=41;break}return i.abrupt("return",d.json().then((function(t){return a({type:r,payload:{status:d.status,content:t,id:n}}),t})));case 41:return _a("Response is missing header: content-type: application/json"),i.abrupt("return",a({type:r,payload:{id:n,status:d.status}}));case 45:i.prev=45,i.t1=i.catch(5),g="Error from API call: "+t,ha(i.t1,g,a);case 49:case"end":return i.stop()}}),i,null,[[5,45],[8,14]])})));return function(t,e){return i.apply(this,arguments)}}()}function Sa(){Sa=function(){return e};var t,e={},r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(t,e,r){t[e]=r.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",u=i.asyncIterator||"@@asyncIterator",c=i.toStringTag||"@@toStringTag";function s(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{s({},"")}catch(t){s=function(t,e,r){return t[e]=r}}function l(t,e,r,n){var i=e&&e.prototype instanceof b?e:b,a=Object.create(i.prototype),u=new T(n||[]);return o(a,"_invoke",{value:x(t,r,u)}),a}function f(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}e.wrap=l;var p="suspendedStart",h="suspendedYield",d="executing",y="completed",v={};function b(){}function g(){}function m(){}var w={};s(w,a,(function(){return this}));var O=Object.getPrototypeOf,_=O&&O(O(L([])));_&&_!==r&&n.call(_,a)&&(w=_);var E=m.prototype=b.prototype=Object.create(w);function j(t){["next","throw","return"].forEach((function(e){s(t,e,(function(t){return this._invoke(e,t)}))}))}function S(t,e){function r(o,i,a,u){var c=f(t[o],t,i);if("throw"!==c.type){var s=c.arg,l=s.value;return l&&"object"==typeof l&&n.call(l,"__await")?e.resolve(l.__await).then((function(t){r("next",t,a,u)}),(function(t){r("throw",t,a,u)})):e.resolve(l).then((function(t){s.value=t,a(s)}),(function(t){return r("throw",t,a,u)}))}u(c.arg)}var i;o(this,"_invoke",{value:function(t,n){function o(){return new e((function(e,o){r(t,n,e,o)}))}return i=i?i.then(o,o):o()}})}function x(e,r,n){var o=p;return function(i,a){if(o===d)throw new Error("Generator is already running");if(o===y){if("throw"===i)throw a;return{value:t,done:!0}}for(n.method=i,n.arg=a;;){var u=n.delegate;if(u){var c=P(u,n);if(c){if(c===v)continue;return c}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===p)throw o=y,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=d;var s=f(e,r,n);if("normal"===s.type){if(o=n.done?y:h,s.arg===v)continue;return{value:s.arg,done:n.done}}"throw"===s.type&&(o=y,n.method="throw",n.arg=s.arg)}}}function P(e,r){var n=r.method,o=e.iterator[n];if(o===t)return r.delegate=null,"throw"===n&&e.iterator.return&&(r.method="return",r.arg=t,P(e,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),v;var i=f(o,e.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,v;var a=i.arg;return a?a.done?(r[e.resultName]=a.value,r.next=e.nextLoc,"return"!==r.method&&(r.method="next",r.arg=t),r.delegate=null,v):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,v)}function A(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function k(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function T(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(A,this),this.reset(!0)}function L(e){if(e||""===e){var r=e[a];if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,i=function r(){for(;++o=0;--i){var a=this.tryEntries[i],u=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var c=n.call(a,"catchLoc"),s=n.call(a,"finallyLoc");if(c&&s){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),k(r),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;k(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:L(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),v}},e}function xa(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function Pa(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=new Array(e);r5&&void 0!==arguments[5]&&arguments[5],a="Input"===o?r.getInputs:r.getState,u=[],c=0,s=a(t).map((function(i,a){var s=La(tu(t,i.map((function(t){var r=t.id,n=t.property,o=t.path;return{id:r,property:n,value:jr([].concat(Ta(o),["props",n]),e)}})),n[a],r.anyVals,o),2),l=s[0],f=s[1];return ho(n[a])&&!l.length&&c++,f&&u.push(f),l}));if(u.length){if(i&&u.length+c===s.length)return null;ru(u,t)}return s}function ru(t,e){var r=t[0];throw-1!==r.indexOf("logged above")&&console.error(e.objs),new ReferenceError(r)}var nu=function(t){return Array.isArray(t)?Jt("value",t):t.value},ou=function(t,e){return Array.isArray(t)?sn(t,e):[[t,e]]};function iu(t){return t.split("@")[0]}function au(t,e,r,n){return uu.apply(this,arguments)}function uu(){return uu=ka(Sa().mark((function t(e,r,n,o){var i,a,u,c,s,l,f,p,h,d,y,v,b,g,m,w,O;return Sa().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if((i=window.dash_clientside=window.dash_clientside||{}).no_update||(Object.defineProperty(i,"no_update",{value:{description:"Return to prevent updating an Output."},writable:!1}),Object.defineProperty(i,"PreventUpdate",{value:{description:"Throw to prevent updating all Outputs."},writable:!1})),a=o.inputs,u=o.outputs,c=o.state,s=Date.now(),l=lu(a),f=lu(c),p={},h=si.OK,t.prev=8,v=r.namespace,b=r.function_name,g=a.map(nu),c&&(g=Pe(g,c.map(nu))),i.callback_context={},i.callback_context.triggered=o.changedPropIds.map((function(t){return{prop_id:t,value:l[t]}})),i.callback_context.inputs_list=a,i.callback_context.inputs=l,i.callback_context.states_list=c,i.callback_context.states=f,m=(d=i[v])[b].apply(d,Ta(g)),delete i.callback_context,"function"!=typeof(null===(y=m)||void 0===y?void 0:y.then)){t.next=24;break}return t.next=23,m;case 23:m=t.sent;case 24:ou(u,m).forEach((function(t){var e=La(t,2),r=e[0],n=e[1];ou(r,n).forEach((function(t){var e=La(t,2),r=e[0],n=e[1],o=r.id,a=r.property,u=eo(o),c=p[u]=p[u]||{};n!==i.no_update&&(c[iu(a)]=n)}))})),t.next=35;break;case 27:if(t.prev=27,t.t0=t.catch(8),t.t0!==i.PreventUpdate){t.next=33;break}h=si.PREVENT_UPDATE,t.next=35;break;case 33:throw h=si.CLIENTSIDE_ERROR,t.t0;case 35:return t.prev=35,delete i.callback_context,w=Date.now()-s,O={__dash_server:w,__dash_client:w,__dash_upload:0,__dash_download:0},n.ui&&e(Wa({id:o.output,usage:O,status:h,result:p,inputs:a,state:c})),t.finish(35);case 41:return t.abrupt("return",p);case 42:case"end":return t.stop()}}),t,null,[[8,27,35,41]])}))),uu.apply(this,arguments)}function cu(t,e,r){an(t).forEach((function(t){var n=La(t,2),o=n[0],i=n[1],a=La(o.split("."),2),u=a[0],c=a[1],s=r.strs[u];e(oa({props:{[c]:i},itempath:s})),e(pa({id:u,props:{[c]:i}}))}))}function su(t,e,r,n,o,i,a,u,c){e.request_pre&&e.request_pre(n);var s,l,f,p,h=Date.now(),d=JSON.stringify(n),y=a;return new Promise((function(a,v){var b=function(y){var b=y.status;if(l){var g=u().callbackJobs[l];if(null!=g&&g.outdated)return t(Qa({jobId:l})),a({})}function w(e){if(r.ui){var o={__dash_server:0,__dash_client:Date.now()-h,__dash_upload:d.length,__dash_download:Number(y.headers.get("Content-Length"))};(y.headers.get("Server-Timing")||"").split(",").forEach((function(t){var e=t.split(";")[0],r=t.match(/;dur=[0-9.]+/);r&&(o[e]=Number(r[0].slice(5)))})),t(Wa({id:n.output,usage:o,status:b,result:e,inputs:n.inputs,state:n.state}))}}var O=function(){l&&t(Qa({jobId:l})),f&&cu(f,t,o),p&&cu(p,t,o)};b===si.OK?y.json().then((function(r){if(!s&&r.cacheKey&&(s=r.cacheKey),!l&&r.job){var u={jobId:r.job,cacheKey:r.cacheKey,cancelInputs:r.cancel,progressDefault:r.progressDefault,output:c};t(Za(u)),l=r.job}r.progress&&cu(r.progress,t,o),r.running&&cu(r.running,t,o),!f&&r.runningOff&&(f=r.runningOff),!p&&r.progressDefault&&(p=r.progressDefault),i&&void 0===r.response?setTimeout(m,void 0!==i.interval?i.interval:500):(O(),function(t){var r,o=t.multi,i=t.response;if(e.request_post&&e.request_post(n,i),o)r=i;else{var u=n.output;r={[u.substr(0,u.lastIndexOf("."))]:i.props}}w(r),a(r)}(r))})):b===si.PREVENT_UPDATE?(O(),w({}),a({})):(O(),v(y))},g=function(){r.ui&&t(Wa({id:n.output,status:si.NO_RESPONSE,result:{},inputs:n.inputs,state:n.state})),v(new Error("Callback failed: the server did not respond."))},m=function(){var t,e,n;(t=ua(),e="".concat(In(r),"_dash-update-component"),n=function(t,r){var n="?";e.includes("?")&&(n="&"),e="".concat(e).concat(n).concat(t,"=").concat(r)},s&&n("cacheKey",s),l&&n("job",l),y&&(y.forEach((function(t){var e=La(t,2),r=e[0],o=e[1];return n(r,o)})),y=y.filter((function(t){var e=La(t,3);return e[0],e[1],!e[2]}))),fetch(e,Nr(r.fetch,{method:"POST",headers:t,body:d}))).then(b,g)};m()}))}function lu(t){if(!t)return{};for(var e={},r=0;rt.length)&&(e=t.length);for(var r=0,n=new Array(e);rt.length)&&(e=t.length);for(var r=0,n=new Array(e);r3&&void 0!==arguments[3]&&arguments[3],c=Dn(t,i,r().paths);e(na(c)),o=Pe(o,Lo(l,c,t,{chunkPath:i,filterRoot:u}).map((function(t){return Nu(Nu({},t),{},{predecessors:a})}))),o=Pe(o,Lo(l,p,n,{removedArrayInputsOnly:!0,newPaths:c,chunkPath:i,filterRoot:u}).map((function(t){return Nu(Nu({},t),{},{predecessors:a})})))},g=!1;["children"].concat(v).forEach((function(t){if(!g)if(t.includes("[]")){var e=Du(t.split("[]").map((function(t){return t.split(".").filter((function(t){return t}))})),1)[0];if(!jr(e,h))return;b(Nu(Nu({},y),{},{props:Nu(Nu({},y.props),h)}),y,d,bt(h)),g=!0}else{var r=t.split("."),n=jr(r,h);if(!n)return;var o=Pe(Mn(p,c),["props"].concat(r)),i=jr(o,f);b(n,i,o)}}));var m=Kr((function(t,e){return!(e in u)}),h);if(!mr(m)){var w=r(),O=w.graphs,_=w.paths;o=Pe(o,Ro(i,m,O,_).map((function(t){return Nu(Nu({},t),{},{predecessors:a})})))}}})),i.push(Nu(Nu({},t),{},{executionMeta:{allProps:Bt(Po,Xe(t.getOutputs(r().paths))),updatedProps:Xe(Bt((function(t){var e=Du(t,2),r=e[0],n=e[1];return Bt((function(t){return Po({id:r,property:t})}),bt(n))}),an(f)))}}))),void 0!==p){var d=h?Bt(Po,Xe([h.outputs])).join(", "):s,y="Callback error updating ".concat(d);if(c){var v=c.namespace,b=c.function_name;y+=" via clientside function ".concat(v,".").concat(b)}ha(p,y,e),i.push(Nu(Nu({},t),{},{executionMeta:{allProps:Bt(Po,Xe(t.getOutputs(r().paths))),updatedProps:[]}}))}}})),e(Va([n.length?Fa(n):null,n.length?Na(n.length):null,i.length?Ga(i):null,o.length?qa(o):null]))},inputs:["callbacks.executed"]},qu=Uu;function Gu(){Gu=function(){return e};var t,e={},r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(t,e,r){t[e]=r.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",u=i.asyncIterator||"@@asyncIterator",c=i.toStringTag||"@@toStringTag";function s(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{s({},"")}catch(t){s=function(t,e,r){return t[e]=r}}function l(t,e,r,n){var i=e&&e.prototype instanceof b?e:b,a=Object.create(i.prototype),u=new T(n||[]);return o(a,"_invoke",{value:x(t,r,u)}),a}function f(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}e.wrap=l;var p="suspendedStart",h="suspendedYield",d="executing",y="completed",v={};function b(){}function g(){}function m(){}var w={};s(w,a,(function(){return this}));var O=Object.getPrototypeOf,_=O&&O(O(L([])));_&&_!==r&&n.call(_,a)&&(w=_);var E=m.prototype=b.prototype=Object.create(w);function j(t){["next","throw","return"].forEach((function(e){s(t,e,(function(t){return this._invoke(e,t)}))}))}function S(t,e){function r(o,i,a,u){var c=f(t[o],t,i);if("throw"!==c.type){var s=c.arg,l=s.value;return l&&"object"==typeof l&&n.call(l,"__await")?e.resolve(l.__await).then((function(t){r("next",t,a,u)}),(function(t){r("throw",t,a,u)})):e.resolve(l).then((function(t){s.value=t,a(s)}),(function(t){return r("throw",t,a,u)}))}u(c.arg)}var i;o(this,"_invoke",{value:function(t,n){function o(){return new e((function(e,o){r(t,n,e,o)}))}return i=i?i.then(o,o):o()}})}function x(e,r,n){var o=p;return function(i,a){if(o===d)throw new Error("Generator is already running");if(o===y){if("throw"===i)throw a;return{value:t,done:!0}}for(n.method=i,n.arg=a;;){var u=n.delegate;if(u){var c=P(u,n);if(c){if(c===v)continue;return c}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===p)throw o=y,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=d;var s=f(e,r,n);if("normal"===s.type){if(o=n.done?y:h,s.arg===v)continue;return{value:s.arg,done:n.done}}"throw"===s.type&&(o=y,n.method="throw",n.arg=s.arg)}}}function P(e,r){var n=r.method,o=e.iterator[n];if(o===t)return r.delegate=null,"throw"===n&&e.iterator.return&&(r.method="return",r.arg=t,P(e,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),v;var i=f(o,e.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,v;var a=i.arg;return a?a.done?(r[e.resultName]=a.value,r.next=e.nextLoc,"return"!==r.method&&(r.method="next",r.arg=t),r.delegate=null,v):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,v)}function A(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function k(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function T(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(A,this),this.reset(!0)}function L(e){if(e||""===e){var r=e[a];if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,i=function r(){for(;++o=0;--i){var a=this.tryEntries[i],u=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var c=n.call(a,"catchLoc"),s=n.call(a,"finallyLoc");if(c&&s){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),k(r),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;k(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:L(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),v}},e}function Bu(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function Fu(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=new Array(e);rt.length)&&(e=t.length);for(var r=0,n=new Array(e);rt.length)&&(e=t.length);for(var r=0,n=new Array(e);r=0;--i){var a=this.tryEntries[i],u=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var c=n.call(a,"catchLoc"),s=n.call(a,"finallyLoc");if(c&&s){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),k(r),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;k(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:L(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),v}},e}function ac(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function uc(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=new Array(e);r(null!==(n=e.priority)&&void 0!==n?n:"")?-1:1},dc=function(t,e){var r=(0,t.getOutputs)(e),n=Xe(r),o=[],i={};return n.forEach((function(t){var e=t.id,r=t.property,n=eo(e);(i[n]=i[n]||[]).push(r),o.push(Po({id:n,property:r}))})),{allOutputs:r,allPropIds:o}},yc=function(t,e){return yr(Jt("id",[].concat(lc(Xe(t.getInputs(e))),lc(Xe(t.getState(e))))))},vc={observer:function(){var t=sc(ic().mark((function t(e){var r,n,o,i,a,u,c,s,l,f,p,h,d,y,v,b,g,m,w,O,_;return ic().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(r=e.dispatch,n=e.getState,o=n(),i=o.callbacks,a=i.executing,u=i.watched,c=o.config,s=o.hooks,l=o.layout,f=o.paths,p=o.appLifecycle,h=n(),d=h.callbacks.prioritized,p===Go("HYDRATED")){t.next=5;break}return t.abrupt("return");case 5:y=Math.max(0,12-a.length-u.length),d=nn(hc,d),v=Hr((function(t){return!0===oc(l,f,yc(t,f))}),d),j=2,b=function(t){if(Array.isArray(t))return t}(E=v)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,a,u=[],c=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(s)throw o}}return u}}(E,j)||fc(E,j)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),g=b[0],m=b[1],w=g.slice(0,y),O=m.slice(0,y-w.length),w.length&&r(Va([za(w),Ma(Bt((function(t){return fu(t,c,s,f,l,dc(t,f),r,n)}),w))])),O.length&&(_=Bt((function(t){return uc(uc(uc({},t),dc(t,f)),{},{isReady:oc(l,f,yc(t,f))})}),O),r(Va([za(O),Ca(_)])),_.forEach(function(){var t=sc(ic().mark((function t(e){var o,i,a;return ic().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,e.isReady;case 2:if(o=n(),i=o.callbacks.blocked,Ye((function(t){return t===e||t.isReady===e.isReady}),i)){t.next=6;break}return t.abrupt("return");case 6:a=fu(e,c,s,f,l,e,r,n),r(Va([Ha([e]),Ma([a])]));case 8:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}()));case 12:case"end":return t.stop()}var E,j}),t)})));return function(e){return t.apply(this,arguments)}}(),inputs:["callbacks.prioritized","callbacks.completed"]},bc=vc;function gc(){gc=function(){return e};var t,e={},r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(t,e,r){t[e]=r.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",u=i.asyncIterator||"@@asyncIterator",c=i.toStringTag||"@@toStringTag";function s(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{s({},"")}catch(t){s=function(t,e,r){return t[e]=r}}function l(t,e,r,n){var i=e&&e.prototype instanceof b?e:b,a=Object.create(i.prototype),u=new T(n||[]);return o(a,"_invoke",{value:x(t,r,u)}),a}function f(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}e.wrap=l;var p="suspendedStart",h="suspendedYield",d="executing",y="completed",v={};function b(){}function g(){}function m(){}var w={};s(w,a,(function(){return this}));var O=Object.getPrototypeOf,_=O&&O(O(L([])));_&&_!==r&&n.call(_,a)&&(w=_);var E=m.prototype=b.prototype=Object.create(w);function j(t){["next","throw","return"].forEach((function(e){s(t,e,(function(t){return this._invoke(e,t)}))}))}function S(t,e){function r(o,i,a,u){var c=f(t[o],t,i);if("throw"!==c.type){var s=c.arg,l=s.value;return l&&"object"==typeof l&&n.call(l,"__await")?e.resolve(l.__await).then((function(t){r("next",t,a,u)}),(function(t){r("throw",t,a,u)})):e.resolve(l).then((function(t){s.value=t,a(s)}),(function(t){return r("throw",t,a,u)}))}u(c.arg)}var i;o(this,"_invoke",{value:function(t,n){function o(){return new e((function(e,o){r(t,n,e,o)}))}return i=i?i.then(o,o):o()}})}function x(e,r,n){var o=p;return function(i,a){if(o===d)throw new Error("Generator is already running");if(o===y){if("throw"===i)throw a;return{value:t,done:!0}}for(n.method=i,n.arg=a;;){var u=n.delegate;if(u){var c=P(u,n);if(c){if(c===v)continue;return c}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===p)throw o=y,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=d;var s=f(e,r,n);if("normal"===s.type){if(o=n.done?y:h,s.arg===v)continue;return{value:s.arg,done:n.done}}"throw"===s.type&&(o=y,n.method="throw",n.arg=s.arg)}}}function P(e,r){var n=r.method,o=e.iterator[n];if(o===t)return r.delegate=null,"throw"===n&&e.iterator.return&&(r.method="return",r.arg=t,P(e,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),v;var i=f(o,e.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,v;var a=i.arg;return a?a.done?(r[e.resultName]=a.value,r.next=e.nextLoc,"return"!==r.method&&(r.method="next",r.arg=t),r.delegate=null,v):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,v)}function A(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function k(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function T(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(A,this),this.reset(!0)}function L(e){if(e||""===e){var r=e[a];if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,i=function r(){for(;++o=0;--i){var a=this.tryEntries[i],u=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var c=n.call(a,"catchLoc"),s=n.call(a,"finallyLoc");if(c&&s){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),k(r),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;k(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:L(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),v}},e}function mc(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}var wc=function(){var t=function(t){return function(){var e=this,r=arguments;return new Promise((function(n,o){var i=t.apply(e,r);function a(t){mc(i,n,o,a,u,"next",t)}function u(t){mc(i,n,o,a,u,"throw",t)}a(void 0)}))}}(gc().mark((function t(e){var r,n;return gc().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return n=new Promise((function(t){return r=t})),setTimeout(r,e),t.abrupt("return",n);case 3:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}();function Oc(){Oc=function(){return e};var t,e={},r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(t,e,r){t[e]=r.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",u=i.asyncIterator||"@@asyncIterator",c=i.toStringTag||"@@toStringTag";function s(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{s({},"")}catch(t){s=function(t,e,r){return t[e]=r}}function l(t,e,r,n){var i=e&&e.prototype instanceof b?e:b,a=Object.create(i.prototype),u=new T(n||[]);return o(a,"_invoke",{value:x(t,r,u)}),a}function f(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}e.wrap=l;var p="suspendedStart",h="suspendedYield",d="executing",y="completed",v={};function b(){}function g(){}function m(){}var w={};s(w,a,(function(){return this}));var O=Object.getPrototypeOf,_=O&&O(O(L([])));_&&_!==r&&n.call(_,a)&&(w=_);var E=m.prototype=b.prototype=Object.create(w);function j(t){["next","throw","return"].forEach((function(e){s(t,e,(function(t){return this._invoke(e,t)}))}))}function S(t,e){function r(o,i,a,u){var c=f(t[o],t,i);if("throw"!==c.type){var s=c.arg,l=s.value;return l&&"object"==typeof l&&n.call(l,"__await")?e.resolve(l.__await).then((function(t){r("next",t,a,u)}),(function(t){r("throw",t,a,u)})):e.resolve(l).then((function(t){s.value=t,a(s)}),(function(t){return r("throw",t,a,u)}))}u(c.arg)}var i;o(this,"_invoke",{value:function(t,n){function o(){return new e((function(e,o){r(t,n,e,o)}))}return i=i?i.then(o,o):o()}})}function x(e,r,n){var o=p;return function(i,a){if(o===d)throw new Error("Generator is already running");if(o===y){if("throw"===i)throw a;return{value:t,done:!0}}for(n.method=i,n.arg=a;;){var u=n.delegate;if(u){var c=P(u,n);if(c){if(c===v)continue;return c}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===p)throw o=y,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=d;var s=f(e,r,n);if("normal"===s.type){if(o=n.done?y:h,s.arg===v)continue;return{value:s.arg,done:n.done}}"throw"===s.type&&(o=y,n.method="throw",n.arg=s.arg)}}}function P(e,r){var n=r.method,o=e.iterator[n];if(o===t)return r.delegate=null,"throw"===n&&e.iterator.return&&(r.method="return",r.arg=t,P(e,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),v;var i=f(o,e.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,v;var a=i.arg;return a?a.done?(r[e.resultName]=a.value,r.next=e.nextLoc,"return"!==r.method&&(r.method="next",r.arg=t),r.delegate=null,v):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,v)}function A(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function k(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function T(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(A,this),this.reset(!0)}function L(e){if(e||""===e){var r=e[a];if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,i=function r(){for(;++o=0;--i){var a=this.tryEntries[i],u=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var c=n.call(a,"catchLoc"),s=n.call(a,"finallyLoc");if(c&&s){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),k(r),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;k(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:L(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),v}},e}function _c(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function Ec(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=new Array(e);rt.length)&&(e=t.length);for(var r=0,n=new Array(e);r4&&void 0!==arguments[4]?arguments[4]:null,i=[];for(var a in t)if(t.hasOwnProperty(a)){var u=void 0;try{"function"!=typeof t[a]?(u=Error((n||"React class")+": "+r+" type `"+a+"` is invalid; it must be a function, usually from the `prop-types` package, but received `"+typeof t[a]+"`.")).name="Invariant Violation":u=t[a](e,a,n,r,null,Hc())}catch(t){u=t}if(!u||u instanceof Error||i.push((n||"React class")+": type specification of "+r+" `"+a+"` is invalid; the type checker function must return `null` or an `Error` but returned a "+typeof u+". You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument)."),u instanceof Error){var c=o&&o()||"";i.push("Failed "+r+" type: "+u.message+c)}}return i.join("\n\n")}(e.propTypes,n,"component prop",e);return a&&function(t,e,r){var n,o=t.split("`");if(sr("is marked as required",t)){var i=o[1];n="".concat(i," in ").concat(r),e.id&&(n+=' with ID "'.concat(e.id,'"')),n+=" is required but it was not provided."}else if(sr("Bad object",t))n=t.split("supplied to ")[0]+"supplied to ".concat(r)+".\nBad"+t.split(".\nBad")[1];else{if(!sr("Invalid ",t)||!sr(" supplied to ",t))throw new Error(t);var a=o[1];if(n="Invalid argument `".concat(a,"` passed into ").concat(r),e.id&&(n+=' with ID "'.concat(e.id,'"')),n+=".",sr(", expected ",t)){var u=t.split(", expected ")[1];n+="\nExpected ".concat(u)}if(sr(" of type `",t)){var c=t.split(" of type `")[1].split("`")[0];n+="\nWas supplied type `".concat(c,"`.")}if(ar(a,e)){var s=JSON.stringify(e[a],null,2);s&&(sr("\n",s)?n+="\nValue provided: \n".concat(s):n+="\nValue provided: ".concat(s))}}throw new Error(n)}(a,n,i),as(e,n,r,o)}function as(t,r,n,o){var i=Mr(r,n);return Array.isArray(o)?e().createElement.apply(e(),[t,i].concat(rs(o))):e().createElement(t,i,o)}function us(t){return"Object"===gt(t)&&ar("type",t)&&ar("namespace",t)&&ar("props",t)}is.propTypes={children:u().any,element:u().any,layout:u().any,props:u().any,extraProps:u().any,id:u().string};var cs=function(r){var n=(0,t.useContext)(ws);return e().createElement(ls,es({},n.fn(),r,{_dashprivate_path:JSON.parse(r._dashprivate_path)}))},ss=(0,t.memo)(cs),ls=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&Qc(t,e)}(c,t);var r,n,i,a,u=(i=c,a=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=ts(i);if(a){var r=ts(this).constructor;t=Reflect.construct(e,arguments,r)}else t=e.apply(this,arguments);return function(t,e){if(e&&("object"==typeof e||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return Xc(t)}(this,t)});function c(t){var e;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,c),(e=u.call(this,t)).setProps=e.setProps.bind(Xc(e)),e}return r=c,n=[{key:"createContainer",value:function(t,r,n){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;return Dc(r)?r:e().createElement(ss,{key:r&&r.props&&eo(r.props.id)||o,_dashprivate_error:t._dashprivate_error,_dashprivate_layout:r,_dashprivate_loadingState:zc(r,n,t._dashprivate_loadingMap),_dashprivate_loadingStateHash:Jc(n,t._dashprivate_loadingMap),_dashprivate_path:JSON.stringify(n)})}},{key:"setProps",value:function(t){var e=this.props,r=e._dashprivate_dispatch,n=e._dashprivate_path,i=e._dashprivate_layout,a=this.getLayoutProps(),u=a.id,c=Kr((function(t,e){return!Ot(t,a[e])}),t);mr(c)||r((function(e,r){var a=r().graphs,s=function(t,e,r){if(!(t&&r&&e.length))return[];if("string"==typeof t){var n=r.inputMap[t];return n?e.filter((function(t){return n[t]})):[]}var o=Object.keys(t).sort(),i=Zr(o,t),a=o.join(","),u=r.inputPatterns[a];return u?e.filter((function(t){var e=u[t];return e&&e.some((function(t){return fo(o,i,t.values)}))})):[]}(u,bt(c),a);(0,o.unstable_batchedUpdates)((function(){!function(t,e,r){var n=Tu(t),o=n.canPersist,i=n.id,a=n.props,u=n.element,c=n.persistence,s=n.persisted_props,l=n.persistence_type;o&&c&&er((function(t){var n=pu(t.split("."),2),o=n[0],s=n[1];if(void 0!==e[o]){var f=xu(l,r),p=Au(u,o,s).extract,h=ku(i,t,c),d=p(a[o]),y=p(e[o]);if(d!==y){f.hasItem(h)&&(d=f.getItem(h)[1]);var v=void 0===d?[y]:[y,d];f.setItem(h,v,r)}}}),s)}(i,t,e),s.length&&e(pa({id:u,props:Jr(s,c)})),e(oa({props:c,itempath:n}))}))}))}},{key:"getChildren",value:function(t,e){var r=this;return ve(t)?null:Array.isArray(t)?W(Bt)((function(t,n){return r.createContainer(r.props,t,Pe(e,["props","children",n]))}),t):this.createContainer(this.props,t,Pe(e,["props","children"]))}},{key:"wrapChildrenProp",value:function(t,e){var r=this;return Array.isArray(t)?t.map((function(t,n){return us(t)?r.createContainer(r.props,t,Pe(r.props._dashprivate_path,["props"].concat(rs(e),[n])),n):t})):us(t)?this.createContainer(this.props,t,Pe(this.props._dashprivate_path,["props"].concat(rs(e)))):t}},{key:"getComponent",value:function(t,r,n,o){var i=this,a=this.props,u=a._dashprivate_config,c=a._dashprivate_dispatch,s=a._dashprivate_error;if(mr(t))return null;if(Dc(t))return t;Kc(t);for(var l=Un.resolve(t),f=zr([],["children_props",t.namespace,t.type],u),p=Ue("children",t.props),h=function(){var t=f[d],e=function(t,e){return Ar((function(t,r){return i.wrapChildrenProp(t,[].concat(rs(e),[r]))}),t)};if(t.includes(".")){var r,n,o=t.split(".");if(t.includes("[]")){var a=[],u=[],c=!1,s=!1;if(o.forEach((function(t){c?t.includes("{}")?(s=!0,u.push(t.replace("{}",""))):u.push(t):t.includes("[]")?(c=!0,t.includes("{}")?(s=!0,a.push(t.replace("{}","").replace("[]",""))):a.push(t.replace("[]",""))):t.includes("{}")?(s=!0,a.push(t.replace("{}",""))):a.push(t)})),void 0===(r=jr(a,p))||!r.length)return 0;if(!jr(u,r[0]))return 0;n=r.map((function(t,r){var n,o=Pe(a,Pe([r],u));return n=s?u.length?e(jr(u,t),o):e(t,o):i.wrapChildrenProp(jr(u,t),o),be(u,n,t)})),o=a}else if(t.includes("{}")){for(var l=[],h=[],y=!1,v=[],b=0;b=0;--i){var a=this.tryEntries[i],u=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var c=n.call(a,"catchLoc"),s=n.call(a,"finallyLoc");if(c&&s){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),k(r),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;k(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:L(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),v}},e}function gs(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}function ms(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r0?o:null,n.future.length>0?i:null))}qs.styleTagTransform=Ms(),qs.setAttributes=Rs(),qs.insert=Ls().bind(null,"head"),qs.domAPI=ks(),qs.insertStyleElement=Ns(),Ps()(Us.Z,qs),Us.Z&&Us.Z.locals&&Us.Z.locals,Gs.propTypes={history:u().object,dispatch:u().func};var Bs=q((function(t){return{history:t.history}}),(function(t){return{dispatch:t}}))(Gs);function Fs(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}(r.content.files);try{for(a.s();!(o=a.n()).done;){var u=o.value;if(!u.is_css){i=!1;break}i=!0;for(var c=[],s=document.evaluate('//link[contains(@href, "'.concat(u.url,'")]'),this._head),l=s.iterateNext();l;)c.push(l),l=s.iterateNext();if(er((function(t){return t.setAttribute("disabled","disabled")}),c),u.modified>0){var f=document.createElement("link");f.href="".concat(u.url,"?m=").concat(u.modified),f.type="text/css",f.rel="stylesheet",this._head.appendChild(f)}}}catch(t){a.e(t)}finally{a.f()}i||window.location.reload()}else null!==this.state.intervalId&&500===r.status&&(this._retry>this.state.max_retry&&(this.clearInterval(),window.alert("Hot reloading is disabled after failing ".concat(this._retry," times. ")+"Please check your application for errors, then refresh the page.")),this._retry++)}},{key:"componentDidMount",value:function(){var t=this.props,e=t.dispatch,r=t.reloadRequest,n=this.state,o=n.disabled,i=n.interval;if(!o&&!this.state.intervalId){var a=window.setInterval((function(){"loading"!==r.status&&e(ja("_reload-hash","GET","reloadRequest"))}),i);this.setState({intervalId:a})}}},{key:"componentWillUnmount",value:function(){!this.state.disabled&&this.state.intervalId&&this.clearInterval()}},{key:"render",value:function(){return null}}],n=[{key:"getDerivedStateFromProps",value:function(t){return mr(t.reloadRequest)||"loading"===t.reloadRequest.status?null:{reloadRequest:t.reloadRequest}}}],r&&Hs(e.prototype,r),n&&Hs(e,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(e().Component);Ks.defaultProps={},Ks.propTypes={id:u().string,config:u().object,reloadRequest:u().object,dispatch:u().func,interval:u().number};var Ys=q((function(t){return{config:t.config,reloadRequest:t.reloadRequest}}),(function(t){return{dispatch:t}}))(Ks);function Vs(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function Ws(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=new Array(e);rdiv {\n position: relative;\n}\n._dash-undo-redo-link {\n color: #0074D9;\n cursor: pointer;\n margin-left: 10px;\n margin-right: 10px;\n display: inline-block;\n opacity: 0.2;\n}\n._dash-undo-redo-link:hover {\n opacity: 1;\n}\n._dash-undo-redo-link ._dash-icon-undo {\n font-size: 20px;\n transform: rotate(270deg);\n}\n._dash-undo-redo-link ._dash-icon-redo {\n font-size: 20px;\n transform: rotate(90deg);\n}\n._dash-undo-redo-link ._dash-undo-redo-label {\n font-size: 15px;\n}\n",""]),e.Z=a},645:function(t){"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var r="",n=void 0!==e[5];return e[4]&&(r+="@supports (".concat(e[4],") {")),e[2]&&(r+="@media ".concat(e[2]," {")),n&&(r+="@layer".concat(e[5].length>0?" ".concat(e[5]):""," {")),r+=t(e),n&&(r+="}"),e[2]&&(r+="}"),e[4]&&(r+="}"),r})).join("")},e.i=function(t,r,n,o,i){"string"==typeof t&&(t=[[null,t,void 0]]);var a={};if(n)for(var u=0;u0?" ".concat(f[5]):""," {").concat(f[1],"}")),f[5]=i),r&&(f[2]?(f[1]="@media ".concat(f[2]," {").concat(f[1],"}"),f[2]=r):f[2]=r),o&&(f[4]?(f[1]="@supports (".concat(f[4],") {").concat(f[1],"}"),f[4]=o):f[4]="".concat(o)),e.push(f))}},e}},81:function(t){"use strict";t.exports=function(t){return t[1]}},357:function(t,e){function r(t,e,r,n){var i={};return function(a){if(!i[a]){var u={},c=[],s=[];for(s.push({node:a,processed:!1});s.length>0;){var f=s[s.length-1],l=f.processed,p=f.node;if(l)s.pop(),c.pop(),u[p]=!1,i[p]=!0,e&&0!==t[p].length||r.push(p);else{if(i[p]){s.pop();continue}if(u[p]){if(n){s.pop();continue}throw c.push(p),new o(c)}u[p]=!0,c.push(p);for(var h=t[p],d=h.length-1;d>=0;d--)s.push({node:h[d],processed:!1});f.processed=!0}}}}}var n=e.f=function(t){this.nodes={},this.outgoingEdges={},this.incomingEdges={},this.circular=t&&!!t.circular};n.prototype={size:function(){return Object.keys(this.nodes).length},addNode:function(t,e){this.hasNode(t)||(this.nodes[t]=2===arguments.length?e:t,this.outgoingEdges[t]=[],this.incomingEdges[t]=[])},removeNode:function(t){this.hasNode(t)&&(delete this.nodes[t],delete this.outgoingEdges[t],delete this.incomingEdges[t],[this.incomingEdges,this.outgoingEdges].forEach((function(e){Object.keys(e).forEach((function(r){var n=e[r].indexOf(t);n>=0&&e[r].splice(n,1)}),this)})))},hasNode:function(t){return this.nodes.hasOwnProperty(t)},getNodeData:function(t){if(this.hasNode(t))return this.nodes[t];throw new Error("Node does not exist: "+t)},setNodeData:function(t,e){if(!this.hasNode(t))throw new Error("Node does not exist: "+t);this.nodes[t]=e},addDependency:function(t,e){if(!this.hasNode(t))throw new Error("Node does not exist: "+t);if(!this.hasNode(e))throw new Error("Node does not exist: "+e);return-1===this.outgoingEdges[t].indexOf(e)&&this.outgoingEdges[t].push(e),-1===this.incomingEdges[e].indexOf(t)&&this.incomingEdges[e].push(t),!0},removeDependency:function(t,e){var r;this.hasNode(t)&&(r=this.outgoingEdges[t].indexOf(e))>=0&&this.outgoingEdges[t].splice(r,1),this.hasNode(e)&&(r=this.incomingEdges[e].indexOf(t))>=0&&this.incomingEdges[e].splice(r,1)},clone:function(){var t=this,e=new n;return Object.keys(t.nodes).forEach((function(r){e.nodes[r]=t.nodes[r],e.outgoingEdges[r]=t.outgoingEdges[r].slice(0),e.incomingEdges[r]=t.incomingEdges[r].slice(0)})),e},directDependenciesOf:function(t){if(this.hasNode(t))return this.outgoingEdges[t].slice(0);throw new Error("Node does not exist: "+t)},directDependantsOf:function(t){if(this.hasNode(t))return this.incomingEdges[t].slice(0);throw new Error("Node does not exist: "+t)},dependenciesOf:function(t,e){if(this.hasNode(t)){var n=[];r(this.outgoingEdges,e,n,this.circular)(t);var o=n.indexOf(t);return o>=0&&n.splice(o,1),n}throw new Error("Node does not exist: "+t)},dependantsOf:function(t,e){if(this.hasNode(t)){var n=[];r(this.incomingEdges,e,n,this.circular)(t);var o=n.indexOf(t);return o>=0&&n.splice(o,1),n}throw new Error("Node does not exist: "+t)},overallOrder:function(t){var e=this,n=[],o=Object.keys(this.nodes);if(0===o.length)return n;if(!this.circular){var i=r(this.outgoingEdges,!1,[],this.circular);o.forEach((function(t){i(t)}))}var a=r(this.outgoingEdges,t,n,this.circular);return o.filter((function(t){return 0===e.incomingEdges[t].length})).forEach((function(t){a(t)})),this.circular&&o.filter((function(t){return-1===n.indexOf(t)})).forEach((function(t){a(t)})),n},entryNodes:function(){var t=this;return Object.keys(this.nodes).filter((function(e){return 0===t.incomingEdges[e].length}))}},n.prototype.directDependentsOf=n.prototype.directDependantsOf,n.prototype.dependentsOf=n.prototype.dependantsOf;var o=function(t){var e="Dependency Cycle Found: "+t.join(" -> "),r=new Error(e);return r.cyclePath=t,Object.setPrototypeOf(r,Object.getPrototypeOf(this)),Error.captureStackTrace&&Error.captureStackTrace(r,o),r};o.prototype=Object.create(Error.prototype,{constructor:{value:Error,enumerable:!1,writable:!0,configurable:!0}}),Object.setPrototypeOf(o,Error)},924:function(t,e,r){"use strict";var n=r(244);t.exports=function(t){var e=typeof t;if("string"===e){var r=t;if(0==(t=+t)&&n(r))return!1}else if("number"!==e)return!1;return t-t<1}},679:function(t,e,r){"use strict";var n=r(864),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},i={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},a={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},u={};function c(t){return n.isMemo(t)?a:u[t.$$typeof]||o}u[n.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},u[n.Memo]=a;var s=Object.defineProperty,f=Object.getOwnPropertyNames,l=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,h=Object.getPrototypeOf,d=Object.prototype;t.exports=function t(e,r,n){if("string"!=typeof r){if(d){var o=h(r);o&&o!==d&&t(e,o,n)}var a=f(r);l&&(a=a.concat(l(r)));for(var u=c(e),y=c(r),v=0;v13)&&32!==e&&133!==e&&160!==e&&5760!==e&&6158!==e&&(e<8192||e>8205)&&8232!==e&&8233!==e&&8239!==e&&8287!==e&&8288!==e&&12288!==e&&65279!==e)return!1;return!0}},414:function(t){"use strict";t.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},921:function(t,e){"use strict";var r="function"==typeof Symbol&&Symbol.for,n=r?Symbol.for("react.element"):60103,o=r?Symbol.for("react.portal"):60106,i=r?Symbol.for("react.fragment"):60107,a=r?Symbol.for("react.strict_mode"):60108,u=r?Symbol.for("react.profiler"):60114,c=r?Symbol.for("react.provider"):60109,s=r?Symbol.for("react.context"):60110,f=r?Symbol.for("react.async_mode"):60111,l=r?Symbol.for("react.concurrent_mode"):60111,p=r?Symbol.for("react.forward_ref"):60112,h=r?Symbol.for("react.suspense"):60113,d=r?Symbol.for("react.suspense_list"):60120,y=r?Symbol.for("react.memo"):60115,v=r?Symbol.for("react.lazy"):60116,b=r?Symbol.for("react.block"):60121,g=r?Symbol.for("react.fundamental"):60117,m=r?Symbol.for("react.responder"):60118,w=r?Symbol.for("react.scope"):60119;function O(t){if("object"==typeof t&&null!==t){var e=t.$$typeof;switch(e){case n:switch(t=t.type){case f:case l:case i:case u:case a:case h:return t;default:switch(t=t&&t.$$typeof){case s:case p:case v:case y:case c:return t;default:return e}}case o:return e}}}function _(t){return O(t)===l}e.AsyncMode=f,e.ConcurrentMode=l,e.ContextConsumer=s,e.ContextProvider=c,e.Element=n,e.ForwardRef=p,e.Fragment=i,e.Lazy=v,e.Memo=y,e.Portal=o,e.Profiler=u,e.StrictMode=a,e.Suspense=h,e.isAsyncMode=function(t){return _(t)||O(t)===f},e.isConcurrentMode=_,e.isContextConsumer=function(t){return O(t)===s},e.isContextProvider=function(t){return O(t)===c},e.isElement=function(t){return"object"==typeof t&&null!==t&&t.$$typeof===n},e.isForwardRef=function(t){return O(t)===p},e.isFragment=function(t){return O(t)===i},e.isLazy=function(t){return O(t)===v},e.isMemo=function(t){return O(t)===y},e.isPortal=function(t){return O(t)===o},e.isProfiler=function(t){return O(t)===u},e.isStrictMode=function(t){return O(t)===a},e.isSuspense=function(t){return O(t)===h},e.isValidElementType=function(t){return"string"==typeof t||"function"==typeof t||t===i||t===l||t===u||t===a||t===h||t===d||"object"==typeof t&&null!==t&&(t.$$typeof===v||t.$$typeof===y||t.$$typeof===c||t.$$typeof===s||t.$$typeof===p||t.$$typeof===g||t.$$typeof===m||t.$$typeof===w||t.$$typeof===b)},e.typeOf=O},864:function(t,e,r){"use strict";t.exports=r(921)},379:function(t){"use strict";var e=[];function r(t){for(var r=-1,n=0;n0?" ".concat(r.layer):""," {")),n+=r.css,o&&(n+="}"),r.media&&(n+="}"),r.supports&&(n+="}");var i=r.sourceMap;i&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),e.styleTagTransform(n,t,e.options)}(e,t,r)},remove:function(){!function(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t)}(e)}}}},589:function(t){"use strict";t.exports=function(t,e){if(e.styleSheet)e.styleSheet.cssText=t;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(t))}}},250:function(t,e,r){"use strict";var n=r(196),o="function"==typeof Object.is?Object.is:function(t,e){return t===e&&(0!==t||1/t==1/e)||t!=t&&e!=e},i=n.useState,a=n.useEffect,u=n.useLayoutEffect,c=n.useDebugValue;function s(t){var e=t.getSnapshot;t=t.value;try{var r=e();return!o(t,r)}catch(t){return!0}}var f="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(t,e){return e()}:function(t,e){var r=e(),n=i({inst:{value:r,getSnapshot:e}}),o=n[0].inst,f=n[1];return u((function(){o.value=r,o.getSnapshot=e,s(o)&&f({inst:o})}),[t,r,e]),a((function(){return s(o)&&f({inst:o}),t((function(){s(o)&&f({inst:o})}))}),[t]),c(r),r};e.useSyncExternalStore=void 0!==n.useSyncExternalStore?n.useSyncExternalStore:f},139:function(t,e,r){"use strict";var n=r(196),o=r(688),i="function"==typeof Object.is?Object.is:function(t,e){return t===e&&(0!==t||1/t==1/e)||t!=t&&e!=e},a=o.useSyncExternalStore,u=n.useRef,c=n.useEffect,s=n.useMemo,f=n.useDebugValue;e.useSyncExternalStoreWithSelector=function(t,e,r,n,o){var l=u(null);if(null===l.current){var p={hasValue:!1,value:null};l.current=p}else p=l.current;l=s((function(){function t(t){if(!c){if(c=!0,a=t,t=n(t),void 0!==o&&p.hasValue){var e=p.value;if(o(e,t))return u=e}return u=t}if(e=u,i(a,t))return e;var r=n(t);return void 0!==o&&o(e,r)?e:(a=t,u=r)}var a,u,c=!1,s=void 0===r?null:r;return[function(){return t(e())},null===s?void 0:function(){return t(s())}]}),[e,r,n,o]);var h=a(t,l[0],l[1]);return c((function(){p.hasValue=!0,p.value=h}),[h]),f(h),h}},688:function(t,e,r){"use strict";t.exports=r(250)},798:function(t,e,r){"use strict";t.exports=r(139)},196:function(t){"use strict";t.exports=window.React}},e={};function r(n){var o=e[n];if(void 0!==o)return o.exports;var i=e[n]={id:n,exports:{}};return t[n](i,i.exports,r),i.exports}r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,{a:e}),e},r.d=function(t,e){for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.nc=void 0;var n={};!function(){"use strict";var t="undefined"!=typeof globalThis&&globalThis||"undefined"!=typeof self&&self||void 0!==r.g&&r.g||{},e="URLSearchParams"in t,n="Symbol"in t&&"iterator"in Symbol,o="FileReader"in t&&"Blob"in t&&function(){try{return new Blob,!0}catch(t){return!1}}(),i="FormData"in t,a="ArrayBuffer"in t;if(a)var u=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],c=ArrayBuffer.isView||function(t){return t&&u.indexOf(Object.prototype.toString.call(t))>-1};function s(t){if("string"!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(t)||""===t)throw new TypeError('Invalid character in header field name: "'+t+'"');return t.toLowerCase()}function f(t){return"string"!=typeof t&&(t=String(t)),t}function l(t){var e={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return n&&(e[Symbol.iterator]=function(){return e}),e}function p(t){this.map={},t instanceof p?t.forEach((function(t,e){this.append(e,t)}),this):Array.isArray(t)?t.forEach((function(t){if(2!=t.length)throw new TypeError("Headers constructor: expected name/value pair to be length 2, found"+t.length);this.append(t[0],t[1])}),this):t&&Object.getOwnPropertyNames(t).forEach((function(e){this.append(e,t[e])}),this)}function h(t){if(!t._noBody)return t.bodyUsed?Promise.reject(new TypeError("Already read")):void(t.bodyUsed=!0)}function d(t){return new Promise((function(e,r){t.onload=function(){e(t.result)},t.onerror=function(){r(t.error)}}))}function y(t){var e=new FileReader,r=d(e);return e.readAsArrayBuffer(t),r}function v(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t)),e.buffer}function b(){return this.bodyUsed=!1,this._initBody=function(t){var r;this.bodyUsed=this.bodyUsed,this._bodyInit=t,t?"string"==typeof t?this._bodyText=t:o&&Blob.prototype.isPrototypeOf(t)?this._bodyBlob=t:i&&FormData.prototype.isPrototypeOf(t)?this._bodyFormData=t:e&&URLSearchParams.prototype.isPrototypeOf(t)?this._bodyText=t.toString():a&&o&&(r=t)&&DataView.prototype.isPrototypeOf(r)?(this._bodyArrayBuffer=v(t.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):a&&(ArrayBuffer.prototype.isPrototypeOf(t)||c(t))?this._bodyArrayBuffer=v(t):this._bodyText=t=Object.prototype.toString.call(t):(this._noBody=!0,this._bodyText=""),this.headers.get("content-type")||("string"==typeof t?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):e&&URLSearchParams.prototype.isPrototypeOf(t)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},o&&(this.blob=function(){var t=h(this);if(t)return t;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))}),this.arrayBuffer=function(){if(this._bodyArrayBuffer)return h(this)||(ArrayBuffer.isView(this._bodyArrayBuffer)?Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset,this._bodyArrayBuffer.byteOffset+this._bodyArrayBuffer.byteLength)):Promise.resolve(this._bodyArrayBuffer));if(o)return this.blob().then(y);throw new Error("could not read as ArrayBuffer")},this.text=function(){var t,e,r,n,o,i=h(this);if(i)return i;if(this._bodyBlob)return t=this._bodyBlob,r=d(e=new FileReader),o=(n=/charset=([A-Za-z0-9_-]+)/.exec(t.type))?n[1]:"utf-8",e.readAsText(t,o),r;if(this._bodyArrayBuffer)return Promise.resolve(function(t){for(var e=new Uint8Array(t),r=new Array(e.length),n=0;n-1?o:n),this.mode=r.mode||this.mode||null,this.signal=r.signal||this.signal||function(){if("AbortController"in t)return(new AbortController).signal}(),this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&i)throw new TypeError("Body not allowed for GET or HEAD requests");if(this._initBody(i),!("GET"!==this.method&&"HEAD"!==this.method||"no-store"!==r.cache&&"no-cache"!==r.cache)){var a=/([?&])_=[^&]*/;a.test(this.url)?this.url=this.url.replace(a,"$1_="+(new Date).getTime()):this.url+=(/\?/.test(this.url)?"&":"?")+"_="+(new Date).getTime()}}function w(t){var e=new FormData;return t.trim().split("&").forEach((function(t){if(t){var r=t.split("="),n=r.shift().replace(/\+/g," "),o=r.join("=").replace(/\+/g," ");e.append(decodeURIComponent(n),decodeURIComponent(o))}})),e}function O(t,e){if(!(this instanceof O))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');if(e||(e={}),this.type="default",this.status=void 0===e.status?200:e.status,this.status<200||this.status>599)throw new RangeError("Failed to construct 'Response': The status provided (0) is outside the range [200, 599].");this.ok=this.status>=200&&this.status<300,this.statusText=void 0===e.statusText?"":""+e.statusText,this.headers=new p(e.headers),this.url=e.url||"",this._initBody(t)}m.prototype.clone=function(){return new m(this,{body:this._bodyInit})},b.call(m.prototype),b.call(O.prototype),O.prototype.clone=function(){return new O(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new p(this.headers),url:this.url})},O.error=function(){var t=new O(null,{status:200,statusText:""});return t.status=0,t.type="error",t};var _=[301,302,303,307,308];O.redirect=function(t,e){if(-1===_.indexOf(e))throw new RangeError("Invalid status code");return new O(null,{status:e,headers:{location:t}})};var E=t.DOMException;try{new E}catch(t){(E=function(t,e){this.message=t,this.name=e;var r=Error(t);this.stack=r.stack}).prototype=Object.create(Error.prototype),E.prototype.constructor=E}function j(e,r){return new Promise((function(n,i){var u=new m(e,r);if(u.signal&&u.signal.aborted)return i(new E("Aborted","AbortError"));var c=new XMLHttpRequest;function l(){c.abort()}if(c.onload=function(){var t,e,r={statusText:c.statusText,headers:(t=c.getAllResponseHeaders()||"",e=new p,t.replace(/\r?\n[\t ]+/g," ").split("\r").map((function(t){return 0===t.indexOf("\n")?t.substr(1,t.length):t})).forEach((function(t){var r=t.split(":"),n=r.shift().trim();if(n){var o=r.join(":").trim();try{e.append(n,o)}catch(t){console.warn("Response "+t.message)}}})),e)};u.url.startsWith("file://")&&(c.status<200||c.status>599)?r.status=200:r.status=c.status,r.url="responseURL"in c?c.responseURL:r.headers.get("X-Request-URL");var o="response"in c?c.response:c.responseText;setTimeout((function(){n(new O(o,r))}),0)},c.onerror=function(){setTimeout((function(){i(new TypeError("Network request failed"))}),0)},c.ontimeout=function(){setTimeout((function(){i(new TypeError("Network request timed out"))}),0)},c.onabort=function(){setTimeout((function(){i(new E("Aborted","AbortError"))}),0)},c.open(u.method,function(e){try{return""===e&&t.location.href?t.location.href:e}catch(t){return e}}(u.url),!0),"include"===u.credentials?c.withCredentials=!0:"omit"===u.credentials&&(c.withCredentials=!1),"responseType"in c&&(o?c.responseType="blob":a&&(c.responseType="arraybuffer")),r&&"object"==typeof r.headers&&!(r.headers instanceof p||t.Headers&&r.headers instanceof t.Headers)){var h=[];Object.getOwnPropertyNames(r.headers).forEach((function(t){h.push(s(t)),c.setRequestHeader(t,f(r.headers[t]))})),u.headers.forEach((function(t,e){-1===h.indexOf(e)&&c.setRequestHeader(e,t)}))}else u.headers.forEach((function(t,e){c.setRequestHeader(e,t)}));u.signal&&(u.signal.addEventListener("abort",l),c.onreadystatechange=function(){4===c.readyState&&u.signal.removeEventListener("abort",l)}),c.send(void 0===u._bodyInit?null:u._bodyInit)}))}j.polyfill=!0,t.fetch||(t.fetch=j,t.Headers=p,t.Request=m,t.Response=O)}(),function(){"use strict";r.r(n);var t=r(196),e=r.n(t),o=window.ReactDOM,i=r.n(o),a=window.PropTypes,u=r.n(a),c=r(688),s=r(798),f=function(t){t()},l=function(){return f},p=Symbol.for("react-redux-context"),h="undefined"!=typeof globalThis?globalThis:{};function d(){var e;if(!t.createContext)return{};var r=null!=(e=h[p])?e:h[p]=new Map,n=r.get(t.createContext);return n||(n=t.createContext(null),r.set(t.createContext,n)),n}var y=d();function v(){return v=Object.assign?Object.assign.bind():function(t){for(var e=1;e=0||(o[r]=t[r]);return o}var g=r(679),m=r.n(g),w=r(100),O=["initMapStateToProps","initMapDispatchToProps","initMergeProps"];function _(t,e,r,n,o){var i,a,u,c,s,f=o.areStatesEqual,l=o.areOwnPropsEqual,p=o.areStatePropsEqual,h=!1;return function(o,d){return h?function(o,h){var d,y,v=!l(h,a),b=!f(o,i,h,a);return i=o,a=h,v&&b?(u=t(i,a),e.dependsOnOwnProps&&(c=e(n,a)),s=r(u,c,a)):v?(t.dependsOnOwnProps&&(u=t(i,a)),e.dependsOnOwnProps&&(c=e(n,a)),s=r(u,c,a)):b?(d=t(i,a),y=!p(d,u),u=d,y&&(s=r(u,c,a)),s):s}(o,d):(u=t(i=o,a=d),c=e(n,a),s=r(u,c,a),h=!0,s)}}function E(t){return function(e){var r=t(e);function n(){return r}return n.dependsOnOwnProps=!1,n}}function j(t){return t.dependsOnOwnProps?Boolean(t.dependsOnOwnProps):1!==t.length}function S(t,e){return function(e,r){r.displayName;var n=function(t,e){return n.dependsOnOwnProps?n.mapToProps(t,e):n.mapToProps(t,void 0)};return n.dependsOnOwnProps=!0,n.mapToProps=function(e,r){n.mapToProps=t,n.dependsOnOwnProps=j(t);var o=n(e,r);return"function"==typeof o&&(n.mapToProps=o,n.dependsOnOwnProps=j(o),o=n(e,r)),o},n}}function x(t,e){return function(r,n){throw new Error("Invalid value of type ".concat(typeof t," for ").concat(e," argument when connecting component ").concat(n.wrappedComponentName,"."))}}function P(t,e,r){return v({},r,t,e)}var A={notify(){},get:function(){return[]}};function k(t,e){var r,n=A,o=0,i=!1;function a(){s.onStateChange&&s.onStateChange()}function u(){o++,r||(r=e?e.addNestedSub(a):t.subscribe(a),n=function(){var t=l(),e=null,r=null;return{clear(){e=null,r=null},notify(){t((function(){for(var t=e;t;)t.callback(),t=t.next}))},get(){for(var t=[],r=e;r;)t.push(r),r=r.next;return t},subscribe(t){var n=!0,o=r={callback:t,next:null,prev:r};return o.prev?o.prev.next=o:e=o,function(){n&&null!==e&&(n=!1,o.next?o.next.prev=o.prev:r=o.prev,o.prev?o.prev.next=o.next:e=o.next)}}}}())}function c(){o--,r&&0===o&&(r(),r=void 0,n.clear(),n=A)}var s={addNestedSub:function(t){u();var e=n.subscribe(t),r=!1;return function(){r||(r=!0,e(),c())}},notifyNestedSubs:function(){n.notify()},handleChangeWrapper:a,isSubscribed:function(){return i},trySubscribe:function(){i||(i=!0,u())},tryUnsubscribe:function(){i&&(i=!1,c())},getListeners:function(){return n}};return s}var T="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement?t.useLayoutEffect:t.useEffect;function L(t,e){return t===e?0!==t||0!==e||1/t==1/e:t!=t&&e!=e}function I(t,e){if(L(t,e))return!0;if("object"!=typeof t||null===t||"object"!=typeof e||null===e)return!1;var r=Object.keys(t),n=Object.keys(e);if(r.length!==n.length)return!1;for(var o=0;ot.length)&&(e=t.length);for(var r=0,n=new Array(e);r3&&void 0!==arguments[3]?arguments[3]:{},i=(o.pure,o.areStatesEqual),a=void 0===i?G:i,u=o.areOwnPropsEqual,c=void 0===u?I:u,s=o.areStatePropsEqual,f=void 0===s?I:s,l=o.areMergedPropsEqual,p=void 0===l?I:l,h=o.forwardRef,d=void 0!==h&&h,g=o.context,j=void 0===g?y:g,A=function(t){return t?"function"==typeof t?S(t):x(t,"mapStateToProps"):E((function(){return{}}))}(e),L=function(t){return t&&"object"==typeof t?E((function(e){return function(t,e){var r={},n=function(){var n=t[o];"function"==typeof n&&(r[o]=function(){return e(n.apply(void 0,arguments))})};for(var o in t)n();return r}(t,e)})):t?"function"==typeof t?S(t):x(t,"mapDispatchToProps"):E((function(t){return{dispatch:t}}))}(r),B=function(t){return t?"function"==typeof t?function(t){return function(e,r){r.displayName;var n,o=r.areMergedPropsEqual,i=!1;return function(e,r,a){var u=t(e,r,a);return i?o(u,n)||(n=u):(i=!0,n=u),n}}}(t):x(t,"mergeProps"):function(){return P}}(n),F=Boolean(e);return function(e){var r=e.displayName||e.name||"Component",n="Connect(".concat(r,")"),o={shouldHandleStateChanges:F,displayName:n,wrappedComponentName:r,WrappedComponent:e,initMapStateToProps:A,initMapDispatchToProps:L,initMergeProps:B,areStatesEqual:a,areStatePropsEqual:f,areOwnPropsEqual:c,areMergedPropsEqual:p};function i(r){var n=t.useMemo((function(){var t=r.reactReduxForwardedRef,e=b(r,D);return[r.context,t,e]}),[r]),i=R(n,3),a=i[0],u=i[1],c=i[2],s=t.useMemo((function(){return a&&a.Consumer&&(0,w.isContextConsumer)(t.createElement(a.Consumer,null))?a:j}),[a,j]),f=t.useContext(s),l=Boolean(r.store)&&Boolean(r.store.getState)&&Boolean(r.store.dispatch),p=Boolean(f)&&Boolean(f.store),h=l?r.store:f.store,d=p?f.getServerState:h.getState,y=t.useMemo((function(){return function(t,e){var r=e.initMapStateToProps,n=e.initMapDispatchToProps,o=e.initMergeProps,i=b(e,O);return _(r(t,i),n(t,i),o(t,i),t,i)}(h.dispatch,o)}),[h]),g=t.useMemo((function(){if(!F)return U;var t=k(h,l?void 0:f.subscription),e=t.notifyNestedSubs.bind(t);return[t,e]}),[h,l,f]),m=R(g,2),E=m[0],S=m[1],x=t.useMemo((function(){return l?f:v({},f,{subscription:E})}),[l,f,E]),P=t.useRef(),A=t.useRef(c),L=t.useRef(),I=t.useRef(!1),G=(t.useRef(!1),t.useRef(!1)),B=t.useRef();T((function(){return G.current=!0,function(){G.current=!1}}),[]);var H,$,z,J=t.useMemo((function(){return function(){return L.current&&c===A.current?L.current:y(h.getState(),c)}}),[h,c]),K=t.useMemo((function(){return function(t){return E?function(t,e,r,n,o,i,a,u,c,s,f){if(!t)return function(){};var l=!1,p=null,h=function(){if(!l&&u.current){var t,r,h=e.getState();try{t=n(h,o.current)}catch(t){r=t,p=t}r||(p=null),t===i.current?a.current||s():(i.current=t,c.current=t,a.current=!0,f())}};return r.onStateChange=h,r.trySubscribe(),h(),function(){if(l=!0,r.tryUnsubscribe(),r.onStateChange=null,p)throw p}}(F,h,E,y,A,P,I,G,L,S,t):function(){}}}),[E]);H=q,$=[A,P,I,c,L,S],T((function(){return H.apply(void 0,function(t){if(Array.isArray(t))return N(t)}(t=$)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||C(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}());var t}),undefined);try{z=M(K,J,d?function(){return y(d(),c)}:J)}catch(t){throw B.current&&(t.message+="\nThe error may be correlated with this previous error:\n".concat(B.current.stack,"\n\n")),t}T((function(){B.current=void 0,L.current=void 0,P.current=z}));var Y=t.useMemo((function(){return t.createElement(e,v({},z,{ref:u}))}),[u,e,z]);return t.useMemo((function(){return F?t.createElement(s.Provider,{value:x},Y):Y}),[s,Y,x])}var u=t.memo(i);if(u.WrappedComponent=e,u.displayName=i.displayName=n,d){var s=t.forwardRef((function(e,r){return t.createElement(u,v({},e,{reactReduxForwardedRef:r}))}));return s.displayName=n,s.WrappedComponent=e,m()(s,e)}return m()(u,e)}},H=function(e){var r=e.store,n=e.context,o=e.children,i=e.serverState,a=e.stabilityCheck,u=void 0===a?"once":a,c=e.noopCheck,s=void 0===c?"once":c,f=t.useMemo((function(){var t=k(r);return{store:r,subscription:t,getServerState:i?function(){return i}:void 0,stabilityCheck:u,noopCheck:s}}),[r,i,u,s]),l=t.useMemo((function(){return r.getState()}),[r]);T((function(){var t=f.subscription;return t.onStateChange=t.notifyNestedSubs,t.trySubscribe(),l!==r.getState()&&t.notifyNestedSubs(),function(){t.tryUnsubscribe(),t.onStateChange=void 0}}),[f,l]);var p=n||y;return t.createElement(p.Provider,{value:f},o)};function $(t,e){switch(t){case 0:return function(){return e.apply(this,arguments)};case 1:return function(t){return e.apply(this,arguments)};case 2:return function(t,r){return e.apply(this,arguments)};case 3:return function(t,r,n){return e.apply(this,arguments)};case 4:return function(t,r,n,o){return e.apply(this,arguments)};case 5:return function(t,r,n,o,i){return e.apply(this,arguments)};case 6:return function(t,r,n,o,i,a){return e.apply(this,arguments)};case 7:return function(t,r,n,o,i,a,u){return e.apply(this,arguments)};case 8:return function(t,r,n,o,i,a,u,c){return e.apply(this,arguments)};case 9:return function(t,r,n,o,i,a,u,c,s){return e.apply(this,arguments)};case 10:return function(t,r,n,o,i,a,u,c,s,f){return e.apply(this,arguments)};default:throw new Error("First argument to _arity must be a non-negative integer no greater than ten")}}function z(t){return null!=t&&"object"==typeof t&&!0===t["@@functional/placeholder"]}function J(t){return function e(r){return 0===arguments.length||z(r)?e:t.apply(this,arguments)}}s.useSyncExternalStoreWithSelector,function(t){M=t}(c.useSyncExternalStore),B=o.unstable_batchedUpdates,f=B;var K=J((function(t){var e,r=!1;return $(t.length,(function(){return r?e:(r=!0,e=t.apply(this,arguments))}))})),Y=K;function W(t){return W="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},W(t)}function V(t){var e=function(t,e){if("object"!==W(t)||null===t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!==W(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"===W(e)?e:String(e)}function Z(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function Q(t){for(var e=1;e=0&&"[object Array]"===Object.prototype.toString.call(t)};function ft(t,e){return function(){var r=arguments.length;if(0===r)return e();var n=arguments[r-1];return st(n)||"function"!=typeof n[t]?e.apply(this,arguments):n[t].apply(n,Array.prototype.slice.call(arguments,0,r-1))}}function lt(t){return function e(r,n){switch(arguments.length){case 0:return e;case 1:return z(r)?e:J((function(e){return t(r,e)}));default:return z(r)&&z(n)?e:z(r)?J((function(e){return t(e,n)})):z(n)?J((function(e){return t(r,e)})):t(r,n)}}}var pt=lt(ft("forEach",(function(t,e){for(var r=e.length,n=0;n=0;)mt(e=jt[r],t)&&!xt(n,e)&&(n[n.length]=e),r-=1;return n})):J((function(t){return Object(t)!==t?[]:Object.keys(t)}));function At(t){return"[object Object]"===Object.prototype.toString.call(t)}var kt=J((function(t){return null!=t&&"function"==typeof t["fantasy-land/empty"]?t["fantasy-land/empty"]():null!=t&&null!=t.constructor&&"function"==typeof t.constructor["fantasy-land/empty"]?t.constructor["fantasy-land/empty"]():null!=t&&"function"==typeof t.empty?t.empty():null!=t&&null!=t.constructor&&"function"==typeof t.constructor.empty?t.constructor.empty():st(t)?[]:yt(t)?"":At(t)?{}:_t(t)?function(){return arguments}():(e=t,"[object Uint8ClampedArray]"===(r=Object.prototype.toString.call(e))||"[object Int8Array]"===r||"[object Uint8Array]"===r||"[object Int16Array]"===r||"[object Uint16Array]"===r||"[object Int32Array]"===r||"[object Uint32Array]"===r||"[object Float32Array]"===r||"[object Float64Array]"===r||"[object BigInt64Array]"===r||"[object BigUint64Array]"===r?t.constructor.from(""):void 0);var e,r})),Tt=kt;function Lt(t){for(var e,r=[];!(e=t.next()).done;)r.push(e.value);return r}function It(t,e,r){for(var n=0,o=r.length;n=0;){if(r[u]===t)return n[u]===e;u-=1}switch(a){case"Map":return t.size===e.size&&Nt(t.entries(),e.entries(),r.concat([t]),n.concat([e]));case"Set":return t.size===e.size&&Nt(t.values(),e.values(),r.concat([t]),n.concat([e]));case"Arguments":case"Array":case"Object":case"Boolean":case"Number":case"String":case"Date":case"Error":case"RegExp":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"ArrayBuffer":break;default:return!1}var c=Pt(t);if(c.length!==Pt(e).length)return!1;var s=r.concat([t]),f=n.concat([e]);for(u=c.length-1;u>=0;){var l=c[u];if(!mt(l,e)||!Dt(e[l],t[l],s,f))return!1;u-=1}return!0}var Mt=lt((function(t,e){return Dt(t,e,[],[])})),Ut=J((function(t){return null!=t&&Mt(t,Tt(t))}));function qt(t){return function e(r,n,o){switch(arguments.length){case 0:return e;case 1:return z(r)?e:lt((function(e,n){return t(r,e,n)}));case 2:return z(r)&&z(n)?e:z(r)?lt((function(e,r){return t(e,n,r)})):z(n)?lt((function(e,n){return t(r,e,n)})):J((function(e){return t(r,n,e)}));default:return z(r)&&z(n)&&z(o)?e:z(r)&&z(n)?lt((function(e,r){return t(e,r,o)})):z(r)&&z(o)?lt((function(e,r){return t(e,n,r)})):z(n)&&z(o)?lt((function(e,n){return t(r,e,n)})):z(r)?J((function(e){return t(e,n,o)})):z(n)?J((function(e){return t(r,e,o)})):z(o)?J((function(e){return t(r,n,e)})):t(r,n,o)}}}var Gt=qt((function(t,e,r){var n,o={};for(n in r=r||{},e=e||{})mt(n,e)&&(o[n]=mt(n,r)?t(n,e[n],r[n]):e[n]);for(n in r)mt(n,r)&&!mt(n,o)&&(o[n]=r[n]);return o})),Bt=Gt,Ft=qt((function(t,e,r){return Bt((function(e,r,n){return t(r,n)}),e,r)})),Ht=Ft,$t=lt((function(t,e){return t.map((function(t){return gt([t],e)}))}));function zt(t,e,r){for(var n=0,o=r.length;n0&&t.hasOwnProperty(0)&&t.hasOwnProperty(t.length-1))}));function te(t){return function e(r){for(var n,o,i,a=[],u=0,c=r.length;u=arguments.length)?c=e[a]:(c=arguments[o],o+=1),n[a]=c,z(c)?u=!0:i-=1,a+=1}return!u&&i<=0?r.apply(this,n):$(Math.max(0,i),ie(t,n,r))}}var ae=lt((function(t,e){return 1===t?J(e):$(t,ie(t,[],e))})),ue=ae,ce=lt(Jt(["fantasy-land/map","map"],oe,(function(t,e){switch(Object.prototype.toString.call(e)){case"[object Function]":return ue(e.length,(function(){return t.call(this,e.apply(this,arguments))}));case"[object Object]":return zt((function(r,n){return r[n]=t(e[n]),r}),{},Pt(e));default:return re(t,e)}}))),se=ce,fe="undefined"!=typeof Symbol?Symbol.iterator:"@@iterator";function le(t,e,r){return function(n,o,i){if(Xt(i))return t(n,o,i);if(null==i)return o;if("function"==typeof i["fantasy-land/reduce"])return e(n,o,i,"fantasy-land/reduce");if(null!=i[fe])return r(n,o,i[fe]());if("function"==typeof i.next)return r(n,o,i);if("function"==typeof i.reduce)return e(n,o,i,"reduce");throw new TypeError("reduce: list must be array or iterable")}}function pe(t,e,r){for(var n=0,o=r.length;n1){var i=!Oe(n)&&mt(o,n)&&"object"==typeof n[o]?n[o]:dt(e[1])?[]:{};r=t(Array.prototype.slice.call(e,1),r,i)}return function(t,e,r){if(dt(t)&&st(r)){var n=[].concat(r);return n[t]=e,n}var o={};for(var i in r)o[i]=r[i];return o[t]=e,o}(o,r,n)})),Ee=qt((function(t,e,r){return _e([t],e,r)}));function je(t){var e=Object.prototype.toString.call(t);return"[object Function]"===e||"[object AsyncFunction]"===e||"[object GeneratorFunction]"===e||"[object AsyncGeneratorFunction]"===e}function Se(t,e,r){var n,o;if("function"==typeof t.indexOf)switch(typeof e){case"number":if(0===e){for(n=1/e;r=0}function Pe(t){return'"'+t.replace(/\\/g,"\\\\").replace(/[\b]/g,"\\b").replace(/\f/g,"\\f").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t").replace(/\v/g,"\\v").replace(/\0/g,"\\0").replace(/"/g,'\\"')+'"'}var Ae=function(t){return(t<10?"0":"")+t},ke="function"==typeof Date.prototype.toISOString?function(t){return t.toISOString()}:function(t){return t.getUTCFullYear()+"-"+Ae(t.getUTCMonth()+1)+"-"+Ae(t.getUTCDate())+"T"+Ae(t.getUTCHours())+":"+Ae(t.getUTCMinutes())+":"+Ae(t.getUTCSeconds())+"."+(t.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+"Z"},Te=lt((function(t,e){return Qt((r=t,function(){return!r.apply(this,arguments)}),e);var r})),Le=Te;function Ie(t,e){var r=function(r){var n=e.concat([t]);return xe(r,n)?"":Ie(r,n)},n=function(t,e){return re((function(e){return Pe(e)+": "+r(t[e])}),e.slice().sort())};switch(Object.prototype.toString.call(t)){case"[object Arguments]":return"(function() { return arguments; }("+re(r,t).join(", ")+"))";case"[object Array]":return"["+re(r,t).concat(n(t,Le((function(t){return/^\d+$/.test(t)}),Pt(t)))).join(", ")+"]";case"[object Boolean]":return"object"==typeof t?"new Boolean("+r(t.valueOf())+")":t.toString();case"[object Date]":return"new Date("+(isNaN(t.valueOf())?r(NaN):Pe(ke(t)))+")";case"[object Map]":return"new Map("+r(Array.from(t))+")";case"[object Null]":return"null";case"[object Number]":return"object"==typeof t?"new Number("+r(t.valueOf())+")":1/t==-1/0?"-0":t.toString(10);case"[object Set]":return"new Set("+r(Array.from(t).sort())+")";case"[object String]":return"object"==typeof t?"new String("+r(t.valueOf())+")":Pe(t);case"[object Undefined]":return"undefined";default:if("function"==typeof t.toString){var o=t.toString();if("[object Object]"!==o)return o}return"{"+n(t,Pt(t)).join(", ")+"}"}}var Re=J((function(t){return Ie(t,[])})),Ce=lt((function(t,e){if(st(t)){if(st(e))return t.concat(e);throw new TypeError(Re(e)+" is not an array")}if(yt(t)){if(yt(e))return t+e;throw new TypeError(Re(e)+" is not a string")}if(null!=t&&je(t["fantasy-land/concat"]))return t["fantasy-land/concat"](e);if(null!=t&&je(t.concat))return t.concat(e);throw new TypeError(Re(t)+' does not have a method named "concat" or "fantasy-land/concat"')}));function Ne(t){return t&&t["@@transducer/reduced"]?t:{"@@transducer/value":t,"@@transducer/reduced":!0}}var De=function(){function t(t,e){this.xf=e,this.f=t,this.all=!0}return t.prototype["@@transducer/init"]=Yt,t.prototype["@@transducer/result"]=function(t){return this.all&&(t=this.xf["@@transducer/step"](t,!0)),this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,e){return this.f(e)||(this.all=!1,t=Ne(this.xf["@@transducer/step"](t,!1))),t},t}();function Me(t){return function(e){return new De(t,e)}}var Ue=lt(Jt(["all"],Me,(function(t,e){for(var r=0;re!=e>t)return e>t?e:t}var n=r(t,e);if(void 0!==n)return n;var o=r(typeof t,typeof e);if(void 0!==o)return o===typeof t?t:e;var i=Re(t),a=r(i,Re(e));return void 0!==a&&a===i?t:e})),$e=lt((function(t,e){if(null!=e)return dt(t)?vt(t,e):e[t]})),ze=lt((function(t,e){return se($e(t),e)})),Je=lt((function(t,e){return ue(we(He,0,ze("length",e)),(function(){var r=arguments,n=this;return t.apply(n,re((function(t){return t.apply(n,r)}),e))}))})),Ke=Je,Ye=J((function(t){return Ke((function(){return Array.prototype.slice.call(arguments,0)}),t)})),We=Ye([Qt,Le]),Ve=lt((function(t,e){var r={};for(var n in e)t(e[n],n,e)&&(r[n]=e[n]);return r})),Ze=lt((function(t,e){for(var r=0,n=Math.min(t.length,e.length),o={};r=0&&this.i>=this.n?Ne(r):r},t}();function Lr(t){return function(e){return new Tr(t,e)}}var Ir=qt(ft("slice",(function(t,e,r){return Array.prototype.slice.call(r,t,e)}))),Rr=lt(Jt(["take"],Lr,(function(t,e){return Ir(0,t<0?1/0:t,e)}))),Cr=lt((function(t,e){return Mt(Rr(t.length,e),t)})),Nr=lt((function(t,e){return"function"!=typeof e.indexOf||st(e)?Se(e,t,0):e.indexOf(t)})),Dr=qt((function(t,e,r){t=t=0?t:r.length;var n=Array.prototype.slice.call(r,0);return n.splice(t,0,e),n})),Mr=function(){function t(t,e){this.xf=e,this.f=t,this.found=!1}return t.prototype["@@transducer/init"]=Yt,t.prototype["@@transducer/result"]=function(t){return this.found||(t=this.xf["@@transducer/step"](t,void 0)),this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,e){return this.f(e)&&(this.found=!0,t=Ne(this.xf["@@transducer/step"](t,e))),t},t}();function Ur(t){return function(e){return new Mr(t,e)}}var qr=lt(Jt(["find"],Ur,(function(t,e){for(var r=0,n=e.length;rt.length)&&(e=t.length);for(var r=0,n=new Array(e);r2&&void 0!==arguments[2]?arguments[2]:[],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;if(Array.isArray(e))e.forEach((function(e,i){if(o){var a=Er((function(t){return or("{}",t)}),o);if(-1!==a){var u=Ir(0,a,o),c=Ir(a,o.length,o);if(u.length)t(gt(u,e),r,Ce(n,Ce([i],u)),c);else{var s,f=c.map((function(t){return t.replace("{}","")})).filter((function(t){return t})),l=Ce([i],f);for(var p in s=f.length?gt(f,e):e){var h=s[p];t(h,r,Ce(n,l.concat([p])))}}}else t(gt(o,e),r,Ce(n,Ce([i],o)))}else t(e,r,$r(i,n))}));else if("Object"===Ct(e)){r(e,n);var i=gt(Qr,e);if(i){var a=Ce(n,Qr);t(i,r,a)}Jr([],[e.namespace,e.type],window.__dashprivate_childrenProps).forEach((function(o){if(o.includes("[]")){var i=function(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,a,u=[],c=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(s)throw o}}return u}}(t,e)||Wr(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(o.split("[]").map((function(t){return t.split(".").filter((function(t){return t}))})),2),a=i[0],u=i[1],c=Ce(["props"],a),s=Ce(n,c);t(gt(c,e),r,s,u)}else if(o.includes("{}")){for(var f=o.split("."),l=[],p=[],h=!1,d=0;d-1&&r.splice(n,1)}}},{key:"emit",value:function(t){for(var e=this,r=arguments.length,n=new Array(r>1?r-1:0),o=1;ot.length)&&(e=t.length);for(var r=0,n=new Array(e);ro?1:ne?1:t=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}(e);try{for(u.s();!(r=u.n()).done;){var c=r.value,s=c.id;if(c.property===o&&"string"!=typeof s&&Mt(Pt(s).sort(),i)&&qe(Pn,ir(a,$t(i,s))))return c}}catch(t){u.e(t)}finally{u.f()}return!1}function kn(t,e){var r=new Xe.f,n={},o=se(dr({id:wn})),i=se((function(t){var e,r=t.output,n=t.force_no_output,i=dr({inputs:o,state:o},t);return i.outputs=n?[]:se((function(t){return Ee("out",!0,mn(t))}),fn(r)?(e=r).substr(2,e.length-4).split("..."):[r]),i}),t),a=!1;!function(t,e){var r={},n=[];t.forEach((function(t){var o=t.inputs,i=t.outputs,a=t.state,u=t.force_no_output,c=!0;1!==i.length||i[0].id||i[0].property||(c=!1,u||e("A callback is missing Outputs",["Please provide an output for this callback:",JSON.stringify(t,null,2)]));var s="In the callback for output(s):\n "+i.map(Jn).join("\n ");o.length||e("A callback is missing Inputs",[s,"there are no `Input` elements.","Without `Input` elements, it will never get called.","","Subscribing to `Input` components will cause the","callback to be called whenever their values change."]),[[i,"Output"],[o,"Input"],[a,"State"]].forEach((function(t){var r=un(t,2),n=r[0],o=r[1];("Output"!==o||c)&&(Array.isArray(n)||e("Callback ".concat(o,"(s) must be an Array"),[s,"For ".concat(o,"(s) we found:"),JSON.stringify(n),"but we expected an Array."]),n.forEach((function(t,r){!function(t,e,r,n,o,i){var a=t.id,u=t.property;if("string"==typeof u&&u||o("Callback property error",[e,"".concat(r,"[").concat(n,"].property = ").concat(JSON.stringify(u)),"but we expected `property` to be a non-empty string."]),"object"==typeof a)Ut(a)&&!i&&o("Callback item missing ID",[e,"".concat(r,"[").concat(n,"].id = {}"),"Every item linked to a callback needs an ID"]),nr((function(t,i){i||o("Callback wildcard ID error",[e,"".concat(r,"[").concat(n,'].id has key "').concat(i,'"'),"Keys must be non-empty strings."]),"object"==typeof t&&t.wild?yn[r][t.wild]!==t&&o("Callback wildcard ID error",[e,"".concat(r,"[").concat(n,'].id["').concat(i,'"] = ').concat(t.wild),"Allowed wildcards for ".concat(r,"s are:"),Pt(yn[r]).join(", ")]):or(typeof t,vn)||o("Callback wildcard ID error",[e,"".concat(r,"[").concat(n,'].id["').concat(i,'"] = ').concat(JSON.stringify(t)),"Wildcard callback ID values must be either wildcards","or constants of one of these types:",vn.join(", ")])}),a);else if("string"==typeof a){a||i||o("Callback item missing ID",[e,"".concat(r,"[").concat(n,'].id = "').concat(a,'"'),"Every item linked to a callback needs an ID"]);var c=bn.filter((function(t){return or(t,a)}));c.length&&o("Callback invalid ID string",[e,"".concat(r,"[").concat(n,"].id = '").concat(a,"'"),"characters '".concat(c.join("', '"),"' are not allowed.")])}else o("Callback ID type error",[e,"".concat(r,"[").concat(n,"].id = ").concat(JSON.stringify(a)),"IDs must be strings or wildcard-compatible objects."])}(t,s,o,r,e,u)})))})),function(t,e,r,n,o){var i={},a=[];t.forEach((function(t,u){var c=t.id,s=t.property;if("string"==typeof c){var f=Jn({id:c,property:s});i[f]?r("Duplicate callback Outputs",[e,"Output ".concat(u," (").concat(f,") is already used by this callback.")]):n[f]?r("Duplicate callback outputs",[e,"Output ".concat(u," (").concat(f,") is already in use."),"To resolve this, set `allow_duplicate=True` on","duplicate outputs, or combine the outputs into","one callback function, distinguishing the trigger","by using `dash.callback_context` if necessary."]):i[f]=1}else{var l={id:c,property:s},p=An(l,a),h=p||An(l,o);if(p||h){var d=Jn(l),y=Jn(p||h);r("Overlapping wildcard callback outputs",[e,"Output ".concat(u," (").concat(d,")"),"overlaps another output (".concat(y,")"),"used in ".concat(p?"this":"a different"," callback.")])}else a.push(l)}})),Pt(i).forEach((function(t){n[t]=1})),a.forEach((function(t){o.push(t)}))}(i,s,e,r,n),u||function(t,e,r,n,o){var i=Tn(t[0].id).matchKeys;t.forEach((function(e,r){r&&!Mt(Tn(e.id).matchKeys,i)&&o("Mismatched `MATCH` wildcards across `Output`s",[n,"Output ".concat(r," (").concat(Jn(e),")"),"does not have MATCH wildcards on the same keys as","Output 0 (".concat(Jn(t[0]),")."),"MATCH wildcards must be on the same keys for all Outputs.","ALL wildcards need not match, only MATCH."])})),[[e,"Input"],[r,"State"]].forEach((function(e){var r=un(e,2),a=r[0],u=r[1];a.forEach((function(e,r){var a=Tn(e.id),c=a.matchKeys,s=a.allsmallerKeys,f=c.concat(s),l=Fe(f,i);l.length&&(l.sort(),o("`Input` / `State` wildcards not in `Output`s",[n,"".concat(u," ").concat(r," (").concat(Jn(e),")"),"has MATCH or ALLSMALLER on key(s) ".concat(l.join(", ")),"where Output 0 (".concat(Jn(t[0]),")"),"does not have a MATCH wildcard. Inputs and State do not","need every MATCH from the Output(s), but they cannot have","extras beyond the Output(s)."]))}))}))}(i,o,a,s,e)}))}(i,(function(t,r){a=!0,e(t,r)}));var u={},c={},s={},f={},l={MultiGraph:r,outputMap:u,inputMap:c,outputPatterns:s,inputPatterns:f,callbacks:i};if(a)return l;function p(t,e){var r=[{}];return nr((function(t,o){var i=n[o].vals,a=i.indexOf(e[o]),u=[t];t&&t.wild&&(u=t===hn?a>0?i.slice(0,a):[]:-1===a||t===ln?i:[e[o]]),r=mr(mr([Ee(o)],u),r)}),t),r}i.forEach((function(t){var e=t.outputs,r=t.inputs;e.concat(r).forEach((function(t){var e=t.id;"object"==typeof e&&nr((function(t,e){n[e]||(n[e]={exact:[],expand:0});var r=n[e];t&&t.wild?t.expand&&(r.expand+=1):-1===r.exact.indexOf(t)&&r.exact.push(t)}),e)}))})),nr((function(t){var e=t.exact,r=t.expand,n=e.slice().sort(_n);if(r)for(var o=0;o2&&void 0!==arguments[2])||arguments[2];r.addNode(t),r.addDependency(t,e),n&&(y[y.length-1].push(t),v[v.length-1].push(e))}return i.forEach((function(t){var e=t.outputs,n=t.inputs;function o(t,e){r.addNode(e),n.forEach((function(r){var n=r.id,o=r.property;"object"==typeof n?p(n,t).forEach((function(t){b(Jn({id:t,property:o}),e)})):b(Jn(r),e)}))}y.push([]),v.push([]);var i=Tn(e.length?e[0].id:void 0).matchKeys,a=Er((function(t){return!Rn(t.id)}),e),l=Sr({matchKeys:i,firstSingleOutput:a,outputs:e},t);e.forEach((function(t){var e=t.id,r=t.property,i=function(t,e){var r=t.id,n=t.property;return e.some((function(e){var o=e.id,i=e.property;if(n!==i||typeof r!=typeof o)return!1;if("string"==typeof r){if(r===o)return!0}else if(An(e,[t]))return!0;return!1}))}(t,n);if("object"==typeof e)p(e,{}).forEach((function(t){var e={id:t,property:r},n=Jn(e);i&&(d.push(e),n+=h),o(t,n)})),xn(s,e,r,l);else{var a=Jn(t);i&&(d.push(t),a+=h),o({},a),Sn(u,e,r,l)}})),n.forEach((function(t){var e=t.id,r=t.property;"object"==typeof e?xn(f,e,r,l):Sn(c,e,r,l)}))})),d.forEach((function(t){for(var e=Jn(t),r=e.concat(h),n=0;nt.length)&&(e=t.length);for(var r=0,n=new Array(e);r5&&void 0!==arguments[5])||arguments[5],a=[],u=Jn({id:r,property:n});if("string"==typeof r){var c=(t.inputMap[r]||{})[n];if(!c)return[];c.forEach(Dn(eo(),e,a))}else{var s=Object.keys(r).sort(),f=$t(s,r),l=s.join(","),p=(t.inputPatterns[l]||{})[n];if(!p)return[];p.forEach((function(t){Ln(s,f,t.values)&&t.callbacks.forEach(Dn(eo(s,f,t.values),e,a))}))}return a.forEach((function(r){r.changedPropIds[u]=o||Hn,i&&(r.priority=Yn(t,e,r))})),a}function Yn(t,e,r){for(var n=[r],o={},i={},a=[];n.length;){n=Qt((function(t){var e=i[t.resolvedId];return i[t.resolvedId]=!0,e}),n);var u=Qt((function(t){return!o[Jn(t)]}),ee(se((function(t){return ee(t.getOutputs(e))}),n)));u.forEach((function(t){return o[Jn(t)]=!0})),(n=ee(se((function(r){var n=r.id,o=r.property;return Kn(t,e,n,o,$n,!1)}),u))).length&&a.push(n.length)}return a.unshift(a.length),se((function(t){return Math.min(t,35).toString(36)}),a).join("")}var Wn=function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(!e.length)return[];var o=se(Jn,we((function(e,r){return Ce(e,ee(r.getOutputs(t)))}),[],r)),i={};if(o.forEach((function(t){return i[t]=!0})),Object.keys(n).length){var a=ee(se((function(e){return function(t,e,r){for(var n=[r],o={};n.length;){var i=Qt((function(t){return!o[Jn(t)]}),ee(se((function(t){return ee(t.getOutputs(e))}),n)));o=we((function(t,e){return Ee(Jn(e),!0,t)}),o,i),n=ee(se((function(r){var n=r.id,o=r.property;return Kn(t,e,n,o,$n,!1)}),i))}return o}(n,t,e)}),r));a.length>0&&(i=Object.assign.apply(Object,[a[0]].concat(Gn(a))))}return Qt((function(e){return qe((function(t){return!i[Jn(t)]}),Fe(ee(e.getInputs(t)),ee(e.getOutputs(t))))}),e)},Vn=function(t,e,r,n){for(var o=[],i=function(t,e,r,n){var o=n.outputsOnly,i=n.removedArrayInputsOnly,a=n.newPaths,u=n.chunkPath,c={},s=[];function f(t){if(t){var e=c[t.resolvedId];if(void 0!==e){var r=s[e];r.changedPropIds=zn(r.changedPropIds,t.changedPropIds),t.initialCall&&(r.initialCall=!0)}else c[t.resolvedId]=s.length,s.push(t)}}function l(r,n,c){if(n)for(var s in n){var l=Cn(t,0,r,s);l&&(l.callback.prevent_initial_call||(l.initialCall=!0,f(l)))}if(!o&&c){var p=i?(y=On(r),function(t){return t.getInputs(e).some((function(e){return!(!Array.isArray(e)||!e.some((function(t){return On(t.id)===y}))||(ee(t.getOutputs(a)).length&&(t.initialCall=!0,t.changedPropIds={},f(t)),0))}))}):f,h=p;for(var d in u&&(h=function(t){qe(Cr(u),ze("path",ee(t.getOutputs(e))))||p(t)}),c)Kn(t,e,r,d,$n).forEach(h)}var y}return Xr(r,(function(e){var r=gt(["props","id"],e);if(r)if("string"!=typeof r||i){var n=Object.keys(r).sort().join(",");l(r,!i&&t.outputPatterns[n],t.inputPatterns[n])}else l(r,t.outputMap[r],t.inputMap[r])})),se((function(r){return an(an({},r),{},{priority:Yn(t,e,r)})}),s)}(t,e,r,n);;){var a=qn(We((function(t){var r=t.callback.inputs,n=t.getInputs;return qe(Rn,r)||!Ut(Fe(se(Jn,ee(n(e))),o))}),i),2),u=a[0],c=a[1];if(!c.length)break;i=u,o=Ce(o,se(Jn,ee(se((function(t){return(0,t.getOutputs)(e)}),c))))}if(n.filterRoot){var s=gt(["props","id"],r);s&&(s=On(s),i=i.filter((function(t){return t.callback.inputs.reduce((function(t,e){return t||On(e.id)==s&&n.filterRoot.includes(e.property)}),!1)})))}var f=Math.random().toString(16);return se((function(t){return Un(Un({},t),{},{executionGroup:f})}),i)},Zn=function(t){var e=t.anyVals,r=t.callback,n=r.inputs,o=r.outputs,i=r.state;return Ce(se(Jn,[].concat(Gn(n),Gn(o),Gn(i))),Array.isArray(e)?e:""===e?[]:[e]).join(",")};function Qn(t,e,r,n){return ee(se((function(e){return Kn(r,n,t,e)}),Pt(e)))}var Xn=function(t,e,r){return{callback:t,anyVals:r,resolvedId:t.output+r,getOutputs:function(r){return t.outputs.map(e(r))},getInputs:function(r){return t.inputs.map(e(r))},getState:function(r){return t.state.map(e(r))},changedPropIds:{},initialCall:!1}};function to(t,e){var r=qn(We((function(t){var r=t.getOutputs,n=t.callback.outputs;return ee(r(e)).length===n.length}),t),2)[1],n=qn(We((function(t){var r=t.getOutputs;return!ee(r(e)).length}),r),2)[1];return{added:se((function(t){return Ee("changedPropIds",Ve((function(t,r){return rn(e,mn(r).id)}),t.changedPropIds),t)}),n),removed:r}}function eo(t,e,r){return function(n){return function(o){var i=o.id,a=o.property;if("string"==typeof i){var u=rn(n,i);return u?[{id:i,property:a,path:u}]:[]}var c=Object.keys(i).sort(),s=$t(c,i),f=c.join(","),l=n.objs[f];if(!l)return[];var p=[];return l.forEach((function(n){var o=n.values,i=n.path;Ln(c,o,s,t,e,r)&&p.push({id:Qe(c,o),property:a,path:i})})),p}}}var ro={ON_PROP_CHANGE:1,SET_REQUEST_QUEUE:1,SET_GRAPHS:1,SET_PATHS:1,SET_LAYOUT:1,SET_APP_LIFECYCLE:1,SET_CONFIG:1,ADD_HTTP_HEADERS:1,ON_ERROR:1,SET_HOOKS:1},no=function(t){if(ro[t])return t;throw new Error("".concat(t," is not defined."))},oo=1;function io(t){var e={STARTED:"STARTED",HYDRATED:"HYDRATED",DESTROYED:"DESTROYED"};if(e[t])return e[t];throw new Error("".concat(t," is not a valid app state."))}var ao=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:io("STARTED"),e=arguments.length>1?arguments[1]:void 0;return e.type===no("SET_APP_LIFECYCLE")?io(e.payload):t};function uo(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function co(t){for(var e=1;e1?arguments[1]:void 0;return we((function(t,e){return null===e?t:e.type===fo.AddCompleted?function(t,e){return co(co({},t),{},{completed:t.completed+e.payload})}(t,e):function(t,e){var r=po[e.type],n=ho[e.type];return r&&n&&0!==e.payload.length?co(co({},t),{},{[n]:r(t[n],e.payload)}):t}(t,e)}),arguments.length>0&&void 0!==arguments[0]?arguments[0]:lo,t.type===fo.Aggregate?t.payload:[t])},vo=qt((function t(e,r,n){return Bt((function(r,n,o){return At(n)&&At(o)?t(e,n,o):e(r,n,o)}),r,n)})),bo=vo,go=lt((function(t,e){return bo((function(t,e,r){return r}),t,e)}));function mo(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=arguments.length>1?arguments[1]:void 0;return e.type===no("SET_CONFIG")?(window.__dashprivate_childrenProps=go(window.__dashprivate_childrenProps||{},e.payload.children_props),e.payload):e.type===no("ADD_HTTP_HEADERS")?go(t,{fetch:{headers:e.payload}}):t}var wo={},Oo=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:wo,e=arguments.length>1?arguments[1]:void 0;return"SET_GRAPHS"===e.type?e.payload:t};function _o(t){return function(t){if(Array.isArray(t))return Eo(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return Eo(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Eo(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Eo(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r0&&void 0!==arguments[0]?arguments[0]:jo,e=arguments.length>1?arguments[1]:void 0;switch(e.type){case"ON_ERROR":var r=t.frontEnd,n=t.backEnd,o=t.backEndConnected;return console.error(e.payload.error),"frontEnd"===e.payload.type?{frontEnd:[Sr(e.payload,{timestamp:new Date})].concat(_o(r)),backEnd:n,backEndConnected:o}:"backEnd"===e.payload.type?{frontEnd:r,backEnd:[Sr(e.payload,{timestamp:new Date})].concat(_o(n)),backEndConnected:o}:t;case"SET_CONNECTION_STATUS":return Sr(t,{backEndConnected:e.payload});default:return t}}function xo(t){return function(t){if(Array.isArray(t))return Po(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return Po(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Po(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Po(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r0&&void 0!==arguments[0]?arguments[0]:Ao;switch((arguments.length>1?arguments[1]:void 0).type){case"UNDO":var e=t.past,r=t.present,n=t.future,o=e[e.length-1];return{past:e.slice(0,e.length-1),present:o,future:[r].concat(xo(n))};case"REDO":var i=t.past,a=t.present,u=t.future,c=u[0],s=u.slice(1);return{past:[].concat(xo(i),[a]),present:c,future:s};case"REVERT":var f=t.past,l=t.future,p=f[f.length-1];return{past:f.slice(0,f.length-1),present:p,future:xo(l)};default:return t}},To=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{layout_pre:null,layout_post:null,request_pre:null,request_post:null,callback_resolved:null,request_refresh_jwt:null,bear:!1},e=arguments.length>1?arguments[1]:void 0;return"SET_HOOKS"===e.type?e.payload:t};function Lo(t,e,r){if(r||(r=new Io),o=typeof(n=t),null==n||"object"!=o&&"function"!=o)return t;var n,o,i,a=function(n){var o=r.get(t);if(o)return o;for(var i in r.set(t,n),t)Object.prototype.hasOwnProperty.call(t,i)&&(n[i]=e?Lo(t[i],!0,r):t[i]);return n};switch(Ct(t)){case"Object":return a(Object.create(Object.getPrototypeOf(t)));case"Array":return a([]);case"Date":return new Date(t.valueOf());case"RegExp":return i=t,new RegExp(i.source,i.flags?i.flags:(i.global?"g":"")+(i.ignoreCase?"i":"")+(i.multiline?"m":"")+(i.sticky?"y":"")+(i.unicode?"u":"")+(i.dotAll?"s":""));case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"BigInt64Array":case"BigUint64Array":return t.slice();default:return t}}var Io=function(){function t(){this.map={},this.length=0}return t.prototype.set=function(t,e){var r=this.hash(t),n=this.map[r];n||(this.map[r]=n=[]),n.push([t,e]),this.length+=1},t.prototype.hash=function(t){var e=[];for(var r in t)e.push(Object.prototype.toString.call(t[r]));return e.join()},t.prototype.get=function(t){if(this.length<=180)for(var e in this.map)for(var r=this.map[e],n=0;n0&&void 0!==arguments[0]?arguments[0]:qo,e=arguments.length>1?arguments[1]:void 0;if("UPDATE_RESOURCE_USAGE"===e.type){var r=e.payload,n=r.id,o=r.usage,i=r.status,a=Do[i]||i,u={updated:[n],resources:t.resources,callbacks:t.callbacks,graphLayout:t.graphLayout};u.callbacks[n]=u.callbacks[n]||Ro(Uo);var c=u.callbacks[n],s=c.resources,f=u.resources;if(c.count+=1,c.status.latest=a,c.status[a]=(c.status[a]||0)+1,c.result=e.payload.result,c.inputs=e.payload.inputs,c.state=e.payload.state,o){var l=o.__dash_client,p=o.__dash_server,h=o.__dash_upload,d=o.__dash_download,y=function(t,e){if(null==t)return{};var r,n,o=function(t,e){if(null==t)return{};var r,n,o={},i=Object.keys(t);for(n=0;n=0||(o[r]=t[r]);return o}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}(o,Mo);for(var v in c.total+=l,c.compute+=p,c.network.time+=l-p,c.network.upload+=h,c.network.download+=d,y)y.hasOwnProperty(v)&&(s[v]=(s[v]||0)+y[v],f[v]=(f[v]||0)+y[v])}return u}return t},Bo={id:null,props:{}},Fo=function(){return arguments.length>0&&void 0!==arguments[0]?arguments[0]:Bo},Ho=function(t){return t.Set="IsLoading.Set",t}({}),$o=function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],e=arguments.length>1?arguments[1]:void 0;return e.type===Ho.Set?e.payload:t},zo=function(t){return{value:t,"fantasy-land/map":function(){return this}}},Jo=lt((function(t,e){return t(zo)(e).value})),Ko=lt((function(t,e){return function(r){return function(n){return se((function(t){return e(t,n)}),r(t(n)))}}})),Yo=J((function(t){return Ko(gt(t),_e(t))})),Wo=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;if(e.type===no("SET_LAYOUT"))return e.payload;if(or(e.type,["UNDO_PROP_CHANGE","REDO_PROP_CHANGE",no("ON_PROP_CHANGE")])){var r=$r("props",e.payload.itempath),n=Jo(Yo(r),t),o=Sr(n,e.payload.props);return _e(r,o,t)}return t},Vo=function(t){return t.Set="LoadingMap.Set",t}({}),Zo={},Qo=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Zo,e=arguments.length>1?arguments[1]:void 0;return e.type===Vo.Set?e.payload:t},Xo={strs:{},objs:{}},ti=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Xo,e=arguments.length>1?arguments[1]:void 0;return e.type===no("SET_PATHS")?e.payload:t},ei=qt((function(t,e,r){var n=Array.prototype.slice.call(r,0);return n.splice(t,e),n})),ri=lt((function t(e,r){if(null==r)return r;switch(e.length){case 0:return r;case 1:return function(t,e){if(null==e)return e;if(dt(t)&&st(e))return ei(t,1,e);var r={};for(var n in e)r[n]=e[n];return delete r[t],r}(e[0],r);default:var n=e[0],o=Array.prototype.slice.call(e,1);return null==r[n]?function(t,e){if(dt(t)&&st(e))return[].concat(e);var r={};for(var n in e)r[n]=e[n];return r}(n,r):Ee(n,t(o,r[n]),r)}})),ni=lt((function(t,e){return ri([t],e)})),oi=function(t,e){return Ee(t.jobId,t,e)},ii=function(t,e){return ni(t,e)},ai=function(t,e){return _e([t,"outdated"],!0,e)};function ui(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;switch(e.type){case"ADD_CALLBACK_JOB":return oi(e.payload,t);case"REMOVE_CALLBACK_JOB":return ii(e.payload.jobId,t);case"CALLBACK_JOB_OUTDATED":return ai(e.payload.jobId,t);default:return t}}function ci(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0,n=t;if(e.type===r){var o=e.payload,i=o.id,a={status:o.status,content:o.content};n=Array.isArray(i)?_e(i,a,t):i?Ee(i,a,t):Sr(t,a)}return n})}),si),t.callbackJobs=ui,function(t){for(var e=Object.keys(t),r={},n=0;n1?r-1:0),o=1;o=0;--i){var a=this.tryEntries[i],u=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var c=n.call(a,"catchLoc"),s=n.call(a,"finallyLoc");if(c&&s){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),k(r),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;k(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:L(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),v}},e}function Ti(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}var Li=Pi(no("ON_ERROR")),Ii=Pi(no("SET_APP_LIFECYCLE")),Ri=Pi(no("SET_CONFIG")),Ci=Pi(no("ADD_HTTP_HEADERS")),Ni=Pi(no("SET_GRAPHS")),Di=Pi(no("SET_HOOKS")),Mi=Pi(no("SET_LAYOUT")),Ui=Pi(no("SET_PATHS")),qi=(Pi(no("SET_REQUEST_QUEUE")),Pi(no("ON_PROP_CHANGE"))),Gi=function(t){return function(e,r){return t(Li({type:"backEnd",error:{message:e,html:r.join("\n")}}))}};var Bi=Y(console.warn);function Fi(){try{return{"X-CSRFToken":Ai.parse(document.cookie)._csrf_token}}catch(t){return Bi(t),{}}}var Hi=Ji("REDO"),$i=Ji("UNDO"),zi=Ji("REVERT");function Ji(t){return function(e,r){var n=r(),o=n.history,i=n.paths;e(Pi(t)());var a=("REDO"===t?o.future[0]:o.past[o.past.length-1])||{},u=a.id,c=a.props;u&&(e(Pi("UNDO_PROP_CHANGE")({itempath:rn(i,u),props:c})),e(Ki({id:u,props:c})))}}function Ki(t){var e=t.id,r=t.props;return function(){var t=function(t){return function(){var e=this,r=arguments;return new Promise((function(n,o){var i=t.apply(e,r);function a(t){Ti(i,n,o,a,u,"next",t)}function u(t){Ti(i,n,o,a,u,"throw",t)}a(void 0)}))}}(ki().mark((function t(n,o){var i,a,u;return ki().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:i=o(),a=i.graphs,u=i.paths,n(Ea(Qn(e,r,a,u)));case 2:case"end":return t.stop()}}),t)})));return function(e,r){return t.apply(this,arguments)}}()}function Yi(t,e,r){if(t&&"function"==typeof t.text)t.text().then((function(t){r(Li({type:"backEnd",error:{message:e,html:t}}))}));else{var n=t instanceof Error?t:{message:e,html:t};r(Li({type:"backEnd",error:n}))}}var Wi=lt((function(t,e){return e instanceof t||null!=e&&(e.constructor===t||"Object"===t.name&&"object"==typeof e)})),Vi=lt((function(t,e){return yr([t],e)})),Zi=J((function(t){return yt(t)?t.split("").reverse().join(""):Array.prototype.slice.call(t,0).reverse()}));function Qi(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function Xi(t){for(var e=1;e=0;--i){var a=this.tryEntries[i],u=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var c=n.call(a,"catchLoc"),s=n.call(a,"finallyLoc");if(c&&s){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),k(r),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;k(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:L(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),v}},e}function ia(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}var aa=Y(console.warn),ua={GET:function(t,e){return fetch(t,go(e,{method:"GET",headers:Fi()}))},POST:function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return fetch(t,go(e,{method:"POST",headers:Fi(),body:r?JSON.stringify(r):null}))}};function ca(t,e,r,n,o){return function(){var i=function(t){return function(){var e=this,r=arguments;return new Promise((function(n,o){var i=t.apply(e,r);function a(t){ia(i,n,o,a,u,"next",t)}function u(t){ia(i,n,o,a,u,"throw",t)}a(void 0)}))}}(oa().mark((function i(a,u){var c,s,f,l,p,h,d,y,v,b,g;return oa().wrap((function(i){for(;;)switch(i.prev=i.next){case 0:h=function(t){u().error.backEndConnected!==t&&a({type:"SET_CONNECTION_STATUS",payload:t})},c=u(),s=c.config,f=c.hooks,l=null,p="".concat(Zr(s)).concat(t),a({type:r,payload:{id:n,status:"loading"}}),i.prev=5,y=0;case 7:if(!(y<=oo)){i.next=36;break}return i.prev=8,i.next=11,ua[e](p,s.fetch,o);case 11:d=i.sent,i.next=19;break;case 14:return i.prev=14,i.t0=i.catch(8),console.log("fetch error",d),h(!1),i.abrupt("return");case 19:if(d.status!==No.UNAUTHORIZED&&d.status!==No.BAD_REQUEST){i.next=32;break}if(!f.request_refresh_jwt){i.next=32;break}return i.next=23,d.text();case 23:if(!i.sent.includes(Co)){i.next=32;break}return i.next=27,f.request_refresh_jwt(s.fetch.headers.Authorization.substr(7));case 27:if(!(v=i.sent)){i.next=32;break}return l={Authorization:"Bearer ".concat(v)},s=go(s,{fetch:{headers:l}}),i.abrupt("continue",33);case 32:return i.abrupt("break",36);case 33:y++,i.next=7;break;case 36:if(b=d.headers.get("content-type"),l&&a(Ci(l)),h(!0),!b||-1===b.indexOf("application/json")){i.next=41;break}return i.abrupt("return",d.json().then((function(t){return a({type:r,payload:{status:d.status,content:t,id:n}}),t})));case 41:return aa("Response is missing header: content-type: application/json"),i.abrupt("return",a({type:r,payload:{id:n,status:d.status}}));case 45:i.prev=45,i.t1=i.catch(5),g="Error from API call: "+t,Yi(i.t1,g,a);case 49:case"end":return i.stop()}}),i,null,[[5,45],[8,14]])})));return function(t,e){return i.apply(this,arguments)}}()}function sa(){sa=function(){return e};var t,e={},r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(t,e,r){t[e]=r.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",u=i.asyncIterator||"@@asyncIterator",c=i.toStringTag||"@@toStringTag";function s(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{s({},"")}catch(t){s=function(t,e,r){return t[e]=r}}function f(t,e,r,n){var i=e&&e.prototype instanceof b?e:b,a=Object.create(i.prototype),u=new T(n||[]);return o(a,"_invoke",{value:x(t,r,u)}),a}function l(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}e.wrap=f;var p="suspendedStart",h="suspendedYield",d="executing",y="completed",v={};function b(){}function g(){}function m(){}var w={};s(w,a,(function(){return this}));var O=Object.getPrototypeOf,_=O&&O(O(L([])));_&&_!==r&&n.call(_,a)&&(w=_);var E=m.prototype=b.prototype=Object.create(w);function j(t){["next","throw","return"].forEach((function(e){s(t,e,(function(t){return this._invoke(e,t)}))}))}function S(t,e){function r(o,i,a,u){var c=l(t[o],t,i);if("throw"!==c.type){var s=c.arg,f=s.value;return f&&"object"==typeof f&&n.call(f,"__await")?e.resolve(f.__await).then((function(t){r("next",t,a,u)}),(function(t){r("throw",t,a,u)})):e.resolve(f).then((function(t){s.value=t,a(s)}),(function(t){return r("throw",t,a,u)}))}u(c.arg)}var i;o(this,"_invoke",{value:function(t,n){function o(){return new e((function(e,o){r(t,n,e,o)}))}return i=i?i.then(o,o):o()}})}function x(e,r,n){var o=p;return function(i,a){if(o===d)throw new Error("Generator is already running");if(o===y){if("throw"===i)throw a;return{value:t,done:!0}}for(n.method=i,n.arg=a;;){var u=n.delegate;if(u){var c=P(u,n);if(c){if(c===v)continue;return c}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===p)throw o=y,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=d;var s=l(e,r,n);if("normal"===s.type){if(o=n.done?y:h,s.arg===v)continue;return{value:s.arg,done:n.done}}"throw"===s.type&&(o=y,n.method="throw",n.arg=s.arg)}}}function P(e,r){var n=r.method,o=e.iterator[n];if(o===t)return r.delegate=null,"throw"===n&&e.iterator.return&&(r.method="return",r.arg=t,P(e,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),v;var i=l(o,e.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,v;var a=i.arg;return a?a.done?(r[e.resultName]=a.value,r.next=e.nextLoc,"return"!==r.method&&(r.method="next",r.arg=t),r.delegate=null,v):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,v)}function A(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function k(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function T(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(A,this),this.reset(!0)}function L(e){if(e||""===e){var r=e[a];if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,i=function r(){for(;++o=0;--i){var a=this.tryEntries[i],u=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var c=n.call(a,"catchLoc"),s=n.call(a,"finallyLoc");if(c&&s){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),k(r),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;k(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:L(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),v}},e}function fa(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function la(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=new Array(e);r5&&void 0!==arguments[5]&&arguments[5],a="Input"===o?r.getInputs:r.getState,u=[],c=0,s=a(t).map((function(i,a){var s=ya(Ua(t,i.map((function(t){var r=t.id,n=t.property,o=t.path;return{id:r,property:n,value:gt([].concat(da(o),["props",n]),e)}})),n[a],r.anyVals,o),2),f=s[0],l=s[1];return Rn(n[a])&&!f.length&&c++,l&&u.push(l),f}));if(u.length){if(i&&u.length+c===s.length)return null;Ga(u,t)}return s}function Ga(t,e){var r=t[0];throw-1!==r.indexOf("logged above")&&console.error(e.objs),new ReferenceError(r)}var Ba=function(t){return Array.isArray(t)?ze("value",t):t.value},Fa=function(t,e){return Array.isArray(t)?ir(t,e):[[t,e]]};function Ha(t){return t.split("@")[0]}function $a(t,e,r,n){return za.apply(this,arguments)}function za(){return za=ha(sa().mark((function t(e,r,n,o){var i,a,u,c,s,f,l,p,h,d,y,v,b,g,m,w,O;return sa().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if((i=window.dash_clientside=window.dash_clientside||{}).no_update||(Object.defineProperty(i,"no_update",{value:{description:"Return to prevent updating an Output."},writable:!1}),Object.defineProperty(i,"PreventUpdate",{value:{description:"Throw to prevent updating all Outputs."},writable:!1})),a=o.inputs,u=o.outputs,c=o.state,s=Date.now(),f=Ya(a),l=Ya(c),p={},h=No.OK,t.prev=8,v=r.namespace,b=r.function_name,g=a.map(Ba),c&&(g=Ce(g,c.map(Ba))),i.callback_context={},i.callback_context.triggered=o.changedPropIds.map((function(t){return{prop_id:t,value:f[t]}})),i.callback_context.inputs_list=a,i.callback_context.inputs=f,i.callback_context.states_list=c,i.callback_context.states=l,m=(d=i[v])[b].apply(d,da(g)),delete i.callback_context,"function"!=typeof(null===(y=m)||void 0===y?void 0:y.then)){t.next=24;break}return t.next=23,m;case 23:m=t.sent;case 24:Fa(u,m).forEach((function(t){var e=ya(t,2),r=e[0],n=e[1];Fa(r,n).forEach((function(t){var e=ya(t,2),r=e[0],n=e[1],o=r.id,a=r.property,u=On(o),c=p[u]=p[u]||{};n!==i.no_update&&(c[Ha(a)]=n)}))})),t.next=35;break;case 27:if(t.prev=27,t.t0=t.catch(8),t.t0!==i.PreventUpdate){t.next=33;break}h=No.PREVENT_UPDATE,t.next=35;break;case 33:throw h=No.CLIENTSIDE_ERROR,t.t0;case 35:return t.prev=35,delete i.callback_context,w=Date.now()-s,O={__dash_server:w,__dash_client:w,__dash_upload:0,__dash_download:0},n.ui&&e(Ca({id:o.output,usage:O,status:h,result:p,inputs:a,state:c})),t.finish(35);case 41:return t.abrupt("return",p);case 42:case"end":return t.stop()}}),t,null,[[8,27,35,41]])}))),za.apply(this,arguments)}function Ja(t,e,r){wi(t).forEach((function(t){var n=ya(t,2),o=n[0],i=n[1],a=ya(o.split("."),2),u=a[0],c=a[1],s=r.strs[u];e(qi({props:{[c]:i},itempath:s})),e(Ki({id:u,props:{[c]:i}}))}))}function Ka(t,e,r,n,o,i,a,u,c){e.request_pre&&e.request_pre(n);var s,f,l,p,h=Date.now(),d=JSON.stringify(n),y=a;return new Promise((function(a,v){var b=function(y){var b=y.status;if(f){var g=u().callbackJobs[f];if(null!=g&&g.outdated)return t(Da({jobId:f})),a({})}function w(e){if(r.ui){var o={__dash_server:0,__dash_client:Date.now()-h,__dash_upload:d.length,__dash_download:Number(y.headers.get("Content-Length"))};(y.headers.get("Server-Timing")||"").split(",").forEach((function(t){var e=t.split(";")[0],r=t.match(/;dur=[0-9.]+/);r&&(o[e]=Number(r[0].slice(5)))})),t(Ca({id:n.output,usage:o,status:b,result:e,inputs:n.inputs,state:n.state}))}}var O=function(){f&&t(Da({jobId:f})),l&&Ja(l,t,o),p&&Ja(p,t,o)};b===No.OK?y.json().then((function(r){if(!s&&r.cacheKey&&(s=r.cacheKey),!f&&r.job){var u={jobId:r.job,cacheKey:r.cacheKey,cancelInputs:r.cancel,progressDefault:r.progressDefault,output:c};t(Na(u)),f=r.job}r.progress&&Ja(r.progress,t,o),r.running&&Ja(r.running,t,o),!l&&r.runningOff&&(l=r.runningOff),!p&&r.progressDefault&&(p=r.progressDefault),i&&void 0===r.response?setTimeout(m,void 0!==i.interval?i.interval:500):(O(),function(t){var r,o=t.multi,i=t.response;if(e.request_post&&e.request_post(n,i),o)r=i;else{var u=n.output;r={[u.substr(0,u.lastIndexOf("."))]:i.props}}w(r),a(r)}(r))})):b===No.PREVENT_UPDATE?(O(),w({}),a({})):(O(),v(y))},g=function(){r.ui&&t(Ca({id:n.output,status:No.NO_RESPONSE,result:{},inputs:n.inputs,state:n.state})),v(new Error("Callback failed: the server did not respond."))},m=function(){var t,e,n;(t=Fi(),e="".concat(Zr(r),"_dash-update-component"),n=function(t,r){var n="?";e.includes("?")&&(n="&"),e="".concat(e).concat(n).concat(t,"=").concat(r)},s&&n("cacheKey",s),f&&n("job",f),y&&(y.forEach((function(t){var e=ya(t,2),r=e[0],o=e[1];return n(r,o)})),y=y.filter((function(t){var e=ya(t,3);return e[0],e[1],!e[2]}))),fetch(e,go(r.fetch,{method:"POST",headers:t,body:d}))).then(b,g)};m()}))}function Ya(t){if(!t)return{};for(var e={},r=0;rt.length)&&(e=t.length);for(var r=0,n=new Array(e);rt.length)&&(e=t.length);for(var r=0,n=new Array(e);r3&&void 0!==arguments[3]&&arguments[3],c=en(t,i,r().paths);e(Ui(c)),o=Ce(o,Vn(f,c,t,{chunkPath:i,filterRoot:u}).map((function(t){return Eu(Eu({},t),{},{predecessors:a})}))),o=Ce(o,Vn(f,p,n,{removedArrayInputsOnly:!0,newPaths:c,chunkPath:i,filterRoot:u}).map((function(t){return Eu(Eu({},t),{},{predecessors:a})})))},g=!1;["children"].concat(v).forEach((function(t){if(!g)if(t.includes("[]")){var e=ju(t.split("[]").map((function(t){return t.split(".").filter((function(t){return t}))})),1)[0];if(!gt(e,h))return;b(Eu(Eu({},y),{},{props:Eu(Eu({},y.props),h)}),y,d,Pt(h)),g=!0}else{var r=t.split("."),n=gt(r,h);if(!n)return;var o=Ce(rn(p,c),["props"].concat(r)),i=gt(o,l);b(n,i,o)}}));var m=Ve((function(t,e){return!(e in u)}),h);if(!Ut(m)){var w=r(),O=w.graphs,_=w.paths;o=Ce(o,Qn(i,m,O,_).map((function(t){return Eu(Eu({},t),{},{predecessors:a})})))}}})),i.push(Eu(Eu({},t),{},{executionMeta:{allProps:se(Jn,ee(t.getOutputs(r().paths))),updatedProps:ee(se((function(t){var e=ju(t,2),r=e[0],n=e[1];return se((function(t){return Jn({id:r,property:t})}),Pt(n))}),wi(l)))}}))),void 0!==p){var d=h?se(Jn,ee([h.outputs])).join(", "):s,y="Callback error updating ".concat(d);if(c){var v=c.namespace,b=c.function_name;y+=" via clientside function ".concat(v,".").concat(b)}Yi(p,y,e),i.push(Eu(Eu({},t),{},{executionMeta:{allProps:se(Jn,ee(t.getOutputs(r().paths))),updatedProps:[]}}))}}})),e(Ra([n.length?xa(n):null,n.length?ma(n.length):null,i.length?ja(i):null,o.length?Ea(o):null]))},inputs:["callbacks.executed"]},Pu=xu;function Au(){Au=function(){return e};var t,e={},r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(t,e,r){t[e]=r.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",u=i.asyncIterator||"@@asyncIterator",c=i.toStringTag||"@@toStringTag";function s(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{s({},"")}catch(t){s=function(t,e,r){return t[e]=r}}function f(t,e,r,n){var i=e&&e.prototype instanceof b?e:b,a=Object.create(i.prototype),u=new T(n||[]);return o(a,"_invoke",{value:x(t,r,u)}),a}function l(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}e.wrap=f;var p="suspendedStart",h="suspendedYield",d="executing",y="completed",v={};function b(){}function g(){}function m(){}var w={};s(w,a,(function(){return this}));var O=Object.getPrototypeOf,_=O&&O(O(L([])));_&&_!==r&&n.call(_,a)&&(w=_);var E=m.prototype=b.prototype=Object.create(w);function j(t){["next","throw","return"].forEach((function(e){s(t,e,(function(t){return this._invoke(e,t)}))}))}function S(t,e){function r(o,i,a,u){var c=l(t[o],t,i);if("throw"!==c.type){var s=c.arg,f=s.value;return f&&"object"==typeof f&&n.call(f,"__await")?e.resolve(f.__await).then((function(t){r("next",t,a,u)}),(function(t){r("throw",t,a,u)})):e.resolve(f).then((function(t){s.value=t,a(s)}),(function(t){return r("throw",t,a,u)}))}u(c.arg)}var i;o(this,"_invoke",{value:function(t,n){function o(){return new e((function(e,o){r(t,n,e,o)}))}return i=i?i.then(o,o):o()}})}function x(e,r,n){var o=p;return function(i,a){if(o===d)throw new Error("Generator is already running");if(o===y){if("throw"===i)throw a;return{value:t,done:!0}}for(n.method=i,n.arg=a;;){var u=n.delegate;if(u){var c=P(u,n);if(c){if(c===v)continue;return c}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===p)throw o=y,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=d;var s=l(e,r,n);if("normal"===s.type){if(o=n.done?y:h,s.arg===v)continue;return{value:s.arg,done:n.done}}"throw"===s.type&&(o=y,n.method="throw",n.arg=s.arg)}}}function P(e,r){var n=r.method,o=e.iterator[n];if(o===t)return r.delegate=null,"throw"===n&&e.iterator.return&&(r.method="return",r.arg=t,P(e,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),v;var i=l(o,e.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,v;var a=i.arg;return a?a.done?(r[e.resultName]=a.value,r.next=e.nextLoc,"return"!==r.method&&(r.method="next",r.arg=t),r.delegate=null,v):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,v)}function A(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function k(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function T(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(A,this),this.reset(!0)}function L(e){if(e||""===e){var r=e[a];if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,i=function r(){for(;++o=0;--i){var a=this.tryEntries[i],u=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var c=n.call(a,"catchLoc"),s=n.call(a,"finallyLoc");if(c&&s){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),k(r),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;k(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:L(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),v}},e}function ku(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function Tu(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=new Array(e);rt.length)&&(e=t.length);for(var r=0,n=new Array(e);rt.length)&&(e=t.length);for(var r=0,n=new Array(e);r=0;--i){var a=this.tryEntries[i],u=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var c=n.call(a,"catchLoc"),s=n.call(a,"finallyLoc");if(c&&s){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),k(r),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;k(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:L(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),v}},e}function Vu(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function Zu(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=new Array(e);r(null!==(n=e.priority)&&void 0!==n?n:"")?-1:1},oc=function(t,e){var r=(0,t.getOutputs)(e),n=ee(r),o=[],i={};return n.forEach((function(t){var e=t.id,r=t.property,n=On(e);(i[n]=i[n]||[]).push(r),o.push(Jn({id:n,property:r}))})),{allOutputs:r,allPropIds:o}},ic=function(t,e){return lr(ze("id",[].concat(tc(ee(t.getInputs(e))),tc(ee(t.getState(e))))))},ac={observer:function(){var t=Xu(Wu().mark((function t(e){var r,n,o,i,a,u,c,s,f,l,p,h,d,y,v,b,g,m,w,O,_;return Wu().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(r=e.dispatch,n=e.getState,o=n(),i=o.callbacks,a=i.executing,u=i.watched,c=o.config,s=o.hooks,f=o.layout,l=o.paths,p=o.appLifecycle,h=n(),d=h.callbacks.prioritized,p===io("HYDRATED")){t.next=5;break}return t.abrupt("return");case 5:y=Math.max(0,12-a.length-u.length),d=Ju(nc,d),v=We((function(t){return!0===Yu(f,l,ic(t,l))}),d),j=2,b=function(t){if(Array.isArray(t))return t}(E=v)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,a,u=[],c=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(s)throw o}}return u}}(E,j)||ec(E,j)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),g=b[0],m=b[1],w=g.slice(0,y),O=m.slice(0,y-w.length),w.length&&r(Ra([ka(w),Oa(se((function(t){return Wa(t,c,s,l,f,oc(t,l),r,n)}),w))])),O.length&&(_=se((function(t){return Zu(Zu(Zu({},t),oc(t,l)),{},{isReady:Yu(f,l,ic(t,l))})}),O),r(Ra([ka(O),ga(_)])),_.forEach(function(){var t=Xu(Wu().mark((function t(e){var o,i,a;return Wu().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,e.isReady;case 2:if(o=n(),i=o.callbacks.blocked,Gr((function(t){return t===e||t.isReady===e.isReady}),i)){t.next=6;break}return t.abrupt("return");case 6:a=Wa(e,c,s,l,f,e,r,n),r(Ra([Pa([e]),Oa([a])]));case 8:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}()));case 12:case"end":return t.stop()}var E,j}),t)})));return function(e){return t.apply(this,arguments)}}(),inputs:["callbacks.prioritized","callbacks.completed"]},uc=ac,cc=function(){function t(t,e,r,n){this.valueFn=t,this.valueAcc=e,this.keyFn=r,this.xf=n,this.inputs={}}return t.prototype["@@transducer/init"]=Yt,t.prototype["@@transducer/result"]=function(t){var e;for(e in this.inputs)if(mt(e,this.inputs)&&(t=this.xf["@@transducer/step"](t,this.inputs[e]))["@@transducer/reduced"]){t=t["@@transducer/value"];break}return this.inputs=null,this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,e){var r=this.keyFn(e);return this.inputs[r]=this.inputs[r]||[r,Lo(this.valueAcc,!1)],this.inputs[r][1]=this.valueFn(this.inputs[r][1],e),t},t}();function sc(t,e,r){return function(n){return new cc(t,e,r,n)}}var fc=lt(ft("groupBy",ie(4,[],Jt([],sc,(function(t,e,r,n){var o=me((function(n,o){var i=r(o),a=t(mt(i,n)?n[i]:Lo(e,!1),o);return a&&a["@@transducer/reduced"]?Ne(n):(n[i]=a,n)}));return be(o,{},n)})))((function(t,e){return t.push(e),t}),[]))),lc=lt((function(t,e){return jr({},e,t)}));function pc(){pc=function(){return e};var t,e={},r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(t,e,r){t[e]=r.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",u=i.asyncIterator||"@@asyncIterator",c=i.toStringTag||"@@toStringTag";function s(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{s({},"")}catch(t){s=function(t,e,r){return t[e]=r}}function f(t,e,r,n){var i=e&&e.prototype instanceof b?e:b,a=Object.create(i.prototype),u=new T(n||[]);return o(a,"_invoke",{value:x(t,r,u)}),a}function l(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}e.wrap=f;var p="suspendedStart",h="suspendedYield",d="executing",y="completed",v={};function b(){}function g(){}function m(){}var w={};s(w,a,(function(){return this}));var O=Object.getPrototypeOf,_=O&&O(O(L([])));_&&_!==r&&n.call(_,a)&&(w=_);var E=m.prototype=b.prototype=Object.create(w);function j(t){["next","throw","return"].forEach((function(e){s(t,e,(function(t){return this._invoke(e,t)}))}))}function S(t,e){function r(o,i,a,u){var c=l(t[o],t,i);if("throw"!==c.type){var s=c.arg,f=s.value;return f&&"object"==typeof f&&n.call(f,"__await")?e.resolve(f.__await).then((function(t){r("next",t,a,u)}),(function(t){r("throw",t,a,u)})):e.resolve(f).then((function(t){s.value=t,a(s)}),(function(t){return r("throw",t,a,u)}))}u(c.arg)}var i;o(this,"_invoke",{value:function(t,n){function o(){return new e((function(e,o){r(t,n,e,o)}))}return i=i?i.then(o,o):o()}})}function x(e,r,n){var o=p;return function(i,a){if(o===d)throw new Error("Generator is already running");if(o===y){if("throw"===i)throw a;return{value:t,done:!0}}for(n.method=i,n.arg=a;;){var u=n.delegate;if(u){var c=P(u,n);if(c){if(c===v)continue;return c}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===p)throw o=y,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=d;var s=l(e,r,n);if("normal"===s.type){if(o=n.done?y:h,s.arg===v)continue;return{value:s.arg,done:n.done}}"throw"===s.type&&(o=y,n.method="throw",n.arg=s.arg)}}}function P(e,r){var n=r.method,o=e.iterator[n];if(o===t)return r.delegate=null,"throw"===n&&e.iterator.return&&(r.method="return",r.arg=t,P(e,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),v;var i=l(o,e.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,v;var a=i.arg;return a?a.done?(r[e.resultName]=a.value,r.next=e.nextLoc,"return"!==r.method&&(r.method="next",r.arg=t),r.delegate=null,v):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,v)}function A(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function k(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function T(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(A,this),this.reset(!0)}function L(e){if(e||""===e){var r=e[a];if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,i=function r(){for(;++o=0;--i){var a=this.tryEntries[i],u=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var c=n.call(a,"catchLoc"),s=n.call(a,"finallyLoc");if(c&&s){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),k(r),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;k(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:L(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),v}},e}function hc(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}var dc=function(){var t=function(t){return function(){var e=this,r=arguments;return new Promise((function(n,o){var i=t.apply(e,r);function a(t){hc(i,n,o,a,u,"next",t)}function u(t){hc(i,n,o,a,u,"throw",t)}a(void 0)}))}}(pc().mark((function t(e){var r,n;return pc().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return n=new Promise((function(t){return r=t})),setTimeout(r,e),t.abrupt("return",n);case 3:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}();function yc(){yc=function(){return e};var t,e={},r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(t,e,r){t[e]=r.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",u=i.asyncIterator||"@@asyncIterator",c=i.toStringTag||"@@toStringTag";function s(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{s({},"")}catch(t){s=function(t,e,r){return t[e]=r}}function f(t,e,r,n){var i=e&&e.prototype instanceof b?e:b,a=Object.create(i.prototype),u=new T(n||[]);return o(a,"_invoke",{value:x(t,r,u)}),a}function l(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}e.wrap=f;var p="suspendedStart",h="suspendedYield",d="executing",y="completed",v={};function b(){}function g(){}function m(){}var w={};s(w,a,(function(){return this}));var O=Object.getPrototypeOf,_=O&&O(O(L([])));_&&_!==r&&n.call(_,a)&&(w=_);var E=m.prototype=b.prototype=Object.create(w);function j(t){["next","throw","return"].forEach((function(e){s(t,e,(function(t){return this._invoke(e,t)}))}))}function S(t,e){function r(o,i,a,u){var c=l(t[o],t,i);if("throw"!==c.type){var s=c.arg,f=s.value;return f&&"object"==typeof f&&n.call(f,"__await")?e.resolve(f.__await).then((function(t){r("next",t,a,u)}),(function(t){r("throw",t,a,u)})):e.resolve(f).then((function(t){s.value=t,a(s)}),(function(t){return r("throw",t,a,u)}))}u(c.arg)}var i;o(this,"_invoke",{value:function(t,n){function o(){return new e((function(e,o){r(t,n,e,o)}))}return i=i?i.then(o,o):o()}})}function x(e,r,n){var o=p;return function(i,a){if(o===d)throw new Error("Generator is already running");if(o===y){if("throw"===i)throw a;return{value:t,done:!0}}for(n.method=i,n.arg=a;;){var u=n.delegate;if(u){var c=P(u,n);if(c){if(c===v)continue;return c}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===p)throw o=y,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=d;var s=l(e,r,n);if("normal"===s.type){if(o=n.done?y:h,s.arg===v)continue;return{value:s.arg,done:n.done}}"throw"===s.type&&(o=y,n.method="throw",n.arg=s.arg)}}}function P(e,r){var n=r.method,o=e.iterator[n];if(o===t)return r.delegate=null,"throw"===n&&e.iterator.return&&(r.method="return",r.arg=t,P(e,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),v;var i=l(o,e.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,v;var a=i.arg;return a?a.done?(r[e.resultName]=a.value,r.next=e.nextLoc,"return"!==r.method&&(r.method="next",r.arg=t),r.delegate=null,v):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,v)}function A(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function k(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function T(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(A,this),this.reset(!0)}function L(e){if(e||""===e){var r=e[a];if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,i=function r(){for(;++o=0;--i){var a=this.tryEntries[i],u=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var c=n.call(a,"catchLoc"),s=n.call(a,"finallyLoc");if(c&&s){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),k(r),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;k(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:L(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),v}},e}function vc(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function bc(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=new Array(e);rt.length)&&(e=t.length);for(var r=0,n=new Array(e);r4&&void 0!==arguments[4]?arguments[4]:null,i=[];for(var a in t)if(t.hasOwnProperty(a)){var u=void 0;try{"function"!=typeof t[a]?(u=Error((n||"React class")+": "+r+" type `"+a+"` is invalid; it must be a function, usually from the `prop-types` package, but received `"+typeof t[a]+"`.")).name="Invariant Violation":u=t[a](e,a,n,r,null,Fc())}catch(t){u=t}if(!u||u instanceof Error||i.push((n||"React class")+": type specification of "+r+" `"+a+"` is invalid; the type checker function must return `null` or an `Error` but returned a "+typeof u+". You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument)."),u instanceof Error){var c=o&&o()||"";i.push("Failed "+r+" type: "+u.message+c)}}return i.join("\n\n")}(e.propTypes,n,"component prop",e);return a&&function(t,e,r){var n,o=t.split("`");if(or("is marked as required",t)){var i=o[1];n="".concat(i," in ").concat(r),e.id&&(n+=' with ID "'.concat(e.id,'"')),n+=" is required but it was not provided."}else if(or("Bad object",t))n=t.split("supplied to ")[0]+"supplied to ".concat(r)+".\nBad"+t.split(".\nBad")[1];else{if(!or("Invalid ",t)||!or(" supplied to ",t))throw new Error(t);var a=o[1];if(n="Invalid argument `".concat(a,"` passed into ").concat(r),e.id&&(n+=' with ID "'.concat(e.id,'"')),n+=".",or(", expected ",t)){var u=t.split(", expected ")[1];n+="\nExpected ".concat(u)}if(or(" of type `",t)){var c=t.split(" of type `")[1].split("`")[0];n+="\nWas supplied type `".concat(c,"`.")}if(Hr(a,e)){var s=JSON.stringify(e[a],null,2);s&&(or("\n",s)?n+="\nValue provided: \n".concat(s):n+="\nValue provided: ".concat(s))}}throw new Error(n)}(a,n,i),is(e,n,r,o)}function is(t,r,n,o){var i=Sr(r,n);return Array.isArray(o)?e().createElement.apply(e(),[t,i].concat(es(o))):e().createElement(t,i,o)}function as(t){return"Object"===Ct(t)&&Hr("type",t)&&Hr("namespace",t)&&Hr("props",t)}os.propTypes={children:u().any,element:u().any,layout:u().any,props:u().any,extraProps:u().any,id:u().string};var us=function(r){var n=(0,t.useContext)(ms);return e().createElement(ss,ts({},n.fn(),r,{_dashprivate_path:JSON.parse(r._dashprivate_path)}))},cs=(0,t.memo)(us),ss=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&Zc(t,e)}(c,t);var r,n,i,a,u=(i=c,a=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=Xc(i);if(a){var r=Xc(this).constructor;t=Reflect.construct(e,arguments,r)}else t=e.apply(this,arguments);return function(t,e){if(e&&("object"==typeof e||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return Qc(t)}(this,t)});function c(t){var e;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,c),(e=u.call(this,t)).setProps=e.setProps.bind(Qc(e)),e}return r=c,n=[{key:"createContainer",value:function(t,r,n){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;return Nc(r)?r:e().createElement(cs,{key:r&&r.props&&On(r.props.id)||o,_dashprivate_error:t._dashprivate_error,_dashprivate_layout:r,_dashprivate_loadingState:$c(r,n,t._dashprivate_loadingMap),_dashprivate_loadingStateHash:zc(n,t._dashprivate_loadingMap),_dashprivate_path:JSON.stringify(n)})}},{key:"setProps",value:function(t){var e=this.props,r=e._dashprivate_dispatch,n=e._dashprivate_path,i=e._dashprivate_layout,a=this.getLayoutProps(),u=a.id,c=Ve((function(t,e){return!Mt(t,a[e])}),t);Ut(c)||r((function(e,r){var a=r().graphs,s=function(t,e,r){if(!(t&&r&&e.length))return[];if("string"==typeof t){var n=r.inputMap[t];return n?e.filter((function(t){return n[t]})):[]}var o=Object.keys(t).sort(),i=$t(o,t),a=o.join(","),u=r.inputPatterns[a];return u?e.filter((function(t){var e=u[t];return e&&e.some((function(t){return Ln(o,i,t.values)}))})):[]}(u,Pt(c),a);(0,o.unstable_batchedUpdates)((function(){!function(t,e,r){var n=gu(t),o=n.canPersist,i=n.id,a=n.props,u=n.element,c=n.persistence,s=n.persisted_props,f=n.persistence_type;o&&c&&ht((function(t){var n=tu(t.split("."),2),o=n[0],s=n[1];if(void 0!==e[o]){var l=du(f,r),p=vu(u,o,s).extract,h=bu(i,t,c),d=p(a[o]),y=p(e[o]);if(d!==y){l.hasItem(h)&&(d=l.getItem(h)[1]);var v=void 0===d?[y]:[y,d];l.setItem(h,v,r)}}}),s)}(i,t,e),s.length&&e(Ki({id:u,props:Oi(s,c)})),e(qi({props:c,itempath:n}))}))}))}},{key:"getChildren",value:function(t,e){var r=this;return Oe(t)?null:Array.isArray(t)?Tc(se)((function(t,n){return r.createContainer(r.props,t,Ce(e,["props","children",n]))}),t):this.createContainer(this.props,t,Ce(e,["props","children"]))}},{key:"wrapChildrenProp",value:function(t,e){var r=this;return Array.isArray(t)?t.map((function(t,n){return as(t)?r.createContainer(r.props,t,Ce(r.props._dashprivate_path,["props"].concat(es(e),[n])),n):t})):as(t)?this.createContainer(this.props,t,Ce(this.props._dashprivate_path,["props"].concat(es(e)))):t}},{key:"getComponent",value:function(t,r,n,o){var i=this,a=this.props,u=a._dashprivate_config,c=a._dashprivate_dispatch,s=a._dashprivate_error;if(Ut(t))return null;if(Nc(t))return t;Jc(t);for(var f=nn.resolve(t),l=Jr([],["children_props",t.namespace,t.type],u),p=ni("children",t.props),h=function(){var t=l[d],e=function(t,e){return Ic((function(t,r){return i.wrapChildrenProp(t,[].concat(es(e),[r]))}),t)};if(t.includes(".")){var r,n,o=t.split(".");if(t.includes("[]")){var a=[],u=[],c=!1,s=!1;if(o.forEach((function(t){c?t.includes("{}")?(s=!0,u.push(t.replace("{}",""))):u.push(t):t.includes("[]")?(c=!0,t.includes("{}")?(s=!0,a.push(t.replace("{}","").replace("[]",""))):a.push(t.replace("[]",""))):t.includes("{}")?(s=!0,a.push(t.replace("{}",""))):a.push(t)})),void 0===(r=gt(a,p))||!r.length)return 0;if(!gt(u,r[0]))return 0;n=r.map((function(t,r){var n,o=Ce(a,Ce([r],u));return n=s?u.length?e(gt(u,t),o):e(t,o):i.wrapChildrenProp(gt(u,t),o),_e(u,n,t)})),o=a}else if(t.includes("{}")){for(var f=[],h=[],y=!1,v=[],b=0;b=0;--i){var a=this.tryEntries[i],u=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var c=n.call(a,"catchLoc"),s=n.call(a,"finallyLoc");if(c&&s){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),k(r),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;k(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:L(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),v}},e}function bs(t,e,r,n,o,i,a){try{var u=t[i](a),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}function gs(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r0?o:null,n.future.length>0?i:null))}Us.styleTagTransform=Ds(),Us.setAttributes=Is(),Us.insert=Ts().bind(null,"head"),Us.domAPI=As(),Us.insertStyleElement=Cs(),xs()(Ms.Z,Us),Ms.Z&&Ms.Z.locals&&Ms.Z.locals,qs.propTypes={history:u().object,dispatch:u().func};var Gs=F((function(t){return{history:t.history}}),(function(t){return{dispatch:t}}))(qs),Bs=J((function(t){return function(e,r){return t(e,r)?-1:t(r,e)?1:0}})),Fs=lt((function(t,e){return tt.length)&&(e=t.length);for(var r=0,n=new Array(e);r=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}(r.content.files);try{for(a.s();!(o=a.n()).done;){var u=o.value;if(!u.is_css){i=!1;break}i=!0;for(var c=[],s=document.evaluate('//link[contains(@href, "'.concat(u.url,'")]'),this._head),f=s.iterateNext();f;)c.push(f),f=s.iterateNext();if(ht((function(t){return t.setAttribute("disabled","disabled")}),c),u.modified>0){var l=document.createElement("link");l.href="".concat(u.url,"?m=").concat(u.modified),l.type="text/css",l.rel="stylesheet",this._head.appendChild(l)}}}catch(t){a.e(t)}finally{a.f()}i||window.location.reload()}else null!==this.state.intervalId&&500===r.status&&(this._retry>this.state.max_retry&&(this.clearInterval(),window.alert("Hot reloading is disabled after failing ".concat(this._retry," times. ")+"Please check your application for errors, then refresh the page.")),this._retry++)}},{key:"componentDidMount",value:function(){var t=this.props,e=t.dispatch,r=t.reloadRequest,n=this.state,o=n.disabled,i=n.interval;if(!o&&!this.state.intervalId){var a=window.setInterval((function(){"loading"!==r.status&&e(ca("_reload-hash","GET","reloadRequest"))}),i);this.setState({intervalId:a})}}},{key:"componentWillUnmount",value:function(){!this.state.disabled&&this.state.intervalId&&this.clearInterval()}},{key:"render",value:function(){return null}}],n=[{key:"getDerivedStateFromProps",value:function(t){return Ut(t.reloadRequest)||"loading"===t.reloadRequest.status?null:{reloadRequest:t.reloadRequest}}}],r&&$s(e.prototype,r),n&&$s(e,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(e().Component);Ys.defaultProps={},Ys.propTypes={id:u().string,config:u().object,reloadRequest:u().object,dispatch:u().func,interval:u().number};var Ws=F((function(t){return{config:t.config,reloadRequest:t.reloadRequest}}),(function(t){return{dispatch:t}}))(Ys),Vs=lt((function(t,e){var r={};return $(e.length,(function(){var n=t.apply(this,arguments);return mt(n,r)||(r[n]=e.apply(this,arguments)),r[n]}))})),Zs=Vs;function Qs(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function Xs(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=new Array(e);r { - const {inputs, outputs, state} = dep; + const {inputs, outputs, state, force_no_output} = dep; let hasOutputs = true; if (outputs.length === 1 && !outputs[0].id && !outputs[0].property) { hasOutputs = false; @@ -236,7 +236,7 @@ function validateDependencies(parsedDependencies, dispatchError) { ]); } args.forEach((idProp, i) => { - validateArg(idProp, head, cls, i, dispatchError); + validateArg(idProp, head, cls, i, dispatchError, force_no_output); }); }); @@ -247,7 +247,7 @@ function validateDependencies(parsedDependencies, dispatchError) { }); } -function validateArg({id, property}, head, cls, i, dispatchError) { +function validateArg({id, property}, head, cls, i, dispatchError, force_no_output) { if (typeof property !== 'string' || !property) { dispatchError('Callback property error', [ head, @@ -257,7 +257,7 @@ function validateArg({id, property}, head, cls, i, dispatchError) { } if (typeof id === 'object') { - if (isEmpty(id)) { + if (isEmpty(id) && !force_no_output) { dispatchError('Callback item missing ID', [ head, `${cls}[${i}].id = {}`, @@ -294,7 +294,7 @@ function validateArg({id, property}, head, cls, i, dispatchError) { } }, id); } else if (typeof id === 'string') { - if (!id) { + if (!id && !force_no_output) { dispatchError('Callback item missing ID', [ head, `${cls}[${i}].id = "${id}"`, diff --git a/dash/dash-renderer/webpack.base.config.js b/dash/dash-renderer/webpack.base.config.js index bdfe6e3041..eabc40f1f1 100644 --- a/dash/dash-renderer/webpack.base.config.js +++ b/dash/dash-renderer/webpack.base.config.js @@ -31,7 +31,7 @@ const defaults = { { test: /\.ts(x?)$/, exclude: /node_modules/, - use: ['babel-loader', 'ts-loader'], + use: ['babel-loader'], }, { test: /\.css$/, diff --git a/dash/dash.py b/dash/dash.py index 08b5ea34c3..c024b162b3 100644 --- a/dash/dash.py +++ b/dash/dash.py @@ -1233,9 +1233,13 @@ def dispatch(self): "state", [] ) output = body["output"] - outputs_list = body.get("outputs") or split_callback_id(output) - g.outputs_list = outputs_list # pylint: disable=assigning-non-slot - + + if body["force_no_output"]: + outputs_list = [] + g.outputs_list = outputs_list + else: + outputs_list = body.get("outputs") or split_callback_id(output) + g.outputs_list = outputs_list # pylint: disable=assigning-non-slot g.input_values = ( # pylint: disable=assigning-non-slot input_values ) = inputs_to_dict(inputs) @@ -1291,15 +1295,18 @@ def dispatch(self): flat_outputs = [outputs_list] else: flat_outputs = outputs_list - - outputs_grouping = map_grouping( - lambda ind: flat_outputs[ind], outputs_indices - ) - g.outputs_grouping = outputs_grouping # pylint: disable=assigning-non-slot - g.using_outputs_grouping = ( # pylint: disable=assigning-non-slot - not isinstance(outputs_indices, int) - and outputs_indices != list(range(grouping_len(outputs_indices))) - ) + if len(flat_outputs): + outputs_grouping = map_grouping( + lambda ind: flat_outputs[ind], outputs_indices + ) + g.outputs_grouping = outputs_grouping # pylint: disable=assigning-non-slot + g.using_outputs_grouping = ( # pylint: disable=assigning-non-slot + not isinstance(outputs_indices, int) + and outputs_indices != list(range(grouping_len(outputs_indices))) + ) + else: + g.outputs_grouping = [] + g.using_outputs_grouping = [] except KeyError as missing_callback_function: msg = f"Callback function not found for output '{output}', perhaps you forgot to prepend the '@'?"